From e83ebbae2df043339ea821125388ab208143c639 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 11 Feb 2004 19:26:51 +0000 Subject: [PATCH 0001/1463] added EngGetCurrentProcessId() and EngGetCurrentThreadId() svn path=/trunk/; revision=8155 --- reactos/subsys/win32k/eng/misc.c | 26 +++++++++++++++++++++++++- reactos/subsys/win32k/stubs/stubs.c | 13 ------------- reactos/subsys/win32k/win32k.def | 4 +++- reactos/subsys/win32k/win32k.edf | 4 +++- 4 files changed, 31 insertions(+), 16 deletions(-) diff --git a/reactos/subsys/win32k/eng/misc.c b/reactos/subsys/win32k/eng/misc.c index f000dc13d1d..2198ae5bc1d 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.3 2004/02/10 23:40:55 gvg Exp $ */ +/* $Id: misc.c,v 1.4 2004/02/11 19:26:51 weiden Exp $ */ #include #include #include @@ -192,4 +192,28 @@ IntEngLeave(PINTENG_ENTER_LEAVE EnterLeave) return Result; } + +HANDLE STDCALL +EngGetCurrentProcessId(VOID) +{ + /* http://www.osr.com/ddk/graphics/gdifncs_5ovb.htm */ + return PsGetCurrentProcessId(); +} + +HANDLE STDCALL +EngGetCurrentThreadId(VOID) +{ + /* http://www.osr.com/ddk/graphics/gdifncs_25rb.htm */ + return PsGetCurrentThreadId(); +} + +HANDLE STDCALL +EngGetProcessHandle(VOID) +{ + /* http://www.osr.com/ddk/graphics/gdifncs_3tif.htm + In Windows 2000 and later, the EngGetProcessHandle function always returns NULL. + FIXME - what does NT4 return? */ + return NULL; +} + /* EOF */ diff --git a/reactos/subsys/win32k/stubs/stubs.c b/reactos/subsys/win32k/stubs/stubs.c index 0831fa9d896..a9704f04308 100644 --- a/reactos/subsys/win32k/stubs/stubs.c +++ b/reactos/subsys/win32k/stubs/stubs.c @@ -411,19 +411,6 @@ EngGetPrinterDataFileName ( IN HDEV hdev ) return NULL; } -/* - * @unimplemented ( for NT4 only ) - */ -HANDLE -STDCALL -EngGetProcessHandle ( VOID ) -{ - // www.osr.com/ddk/graphics/gdifncs_3tif.htm - // In Windows 2000 and later, the EngGetProcessHandle function always returns NULL. - // FIXME - what does NT4 return? - return NULL; -} - /* * @unimplemented */ diff --git a/reactos/subsys/win32k/win32k.def b/reactos/subsys/win32k/win32k.def index cbbc862f407..2c86a4371a6 100644 --- a/reactos/subsys/win32k/win32k.def +++ b/reactos/subsys/win32k/win32k.def @@ -1,4 +1,4 @@ -; $Id: win32k.def,v 1.23 2004/02/08 21:37:52 weiden Exp $ +; $Id: win32k.def,v 1.24 2004/02/11 19:26:51 weiden Exp $ ; ; win32k.def ; @@ -50,6 +50,8 @@ EngFreeMem@4 EngFreeModule@4 EngFreeUserMem@4 EngGetCurrentCodePage@8 +EngGetCurrentProcessId@0 +EngGetCurrentThreadId@0 EngGetDriverName@4 EngGetFileChangeTime@8 EngGetFilePath@8 diff --git a/reactos/subsys/win32k/win32k.edf b/reactos/subsys/win32k/win32k.edf index 5a456fb9fb9..99a4e0c82d2 100644 --- a/reactos/subsys/win32k/win32k.edf +++ b/reactos/subsys/win32k/win32k.edf @@ -1,4 +1,4 @@ -; $Id: win32k.edf,v 1.19 2004/02/08 21:37:52 weiden Exp $ +; $Id: win32k.edf,v 1.20 2004/02/11 19:26:51 weiden Exp $ ; ; win32k.def ; @@ -50,6 +50,8 @@ EngFreeMem=EngFreeMem@4 EngFreeModule=EngFreeModule@4 EngFreeUserMem=EngFreeUserMem@4 EngGetCurrentCodePage=EngGetCurrentCodePage@8 +EngGetCurrentProcessId=EngGetCurrentProcessId@0 +EngGetCurrentThreadId=EngGetCurrentThreadId@0 EngGetDriverName=EngGetDriverName@4 EngGetFileChangeTime=EngGetFileChangeTime@8 EngGetFilePath=EngGetFilePath@8 From f90d73ad9dce6b9fb7979f4fcc31b18862653b1e Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Wed, 11 Feb 2004 21:04:18 +0000 Subject: [PATCH 0002/1463] - Adding my pesum tool which does set the attribute IMAGE_SCN_MEM_NOT_PAGED to sections with the name '.text', '.data', '.bss' and '.idata'. - Some time ago I've wrote this tool because ld wasn't able to set the pe checksum to images. svn path=/trunk/; revision=8156 --- reactos/apps/utils/pesum/.cvsignore | 4 + reactos/apps/utils/pesum/makefile | 20 +++++ reactos/apps/utils/pesum/pesum.c | 130 ++++++++++++++++++++++++++++ 3 files changed, 154 insertions(+) create mode 100644 reactos/apps/utils/pesum/.cvsignore create mode 100644 reactos/apps/utils/pesum/makefile create mode 100644 reactos/apps/utils/pesum/pesum.c diff --git a/reactos/apps/utils/pesum/.cvsignore b/reactos/apps/utils/pesum/.cvsignore new file mode 100644 index 00000000000..136c6e15712 --- /dev/null +++ b/reactos/apps/utils/pesum/.cvsignore @@ -0,0 +1,4 @@ +*.o +*.exe +*.sym +*.map diff --git a/reactos/apps/utils/pesum/makefile b/reactos/apps/utils/pesum/makefile new file mode 100644 index 00000000000..94e941bdec9 --- /dev/null +++ b/reactos/apps/utils/pesum/makefile @@ -0,0 +1,20 @@ +# $Id: makefile,v 1.1 2004/02/11 21:04:18 hbirr Exp $ + +PATH_TO_TOP = ../../.. + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = console + +TARGET_NAME = pesum + + +TARGET_OBJECTS = $(TARGET_NAME).o + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/reactos/apps/utils/pesum/pesum.c b/reactos/apps/utils/pesum/pesum.c new file mode 100644 index 00000000000..b865b1d62c2 --- /dev/null +++ b/reactos/apps/utils/pesum/pesum.c @@ -0,0 +1,130 @@ +#include +#include + +int main(int argc, char **argv) +{ + FILE *fp; + int len; + long offset; + unsigned long OldCheckSum, CheckSum; + int i; + + unsigned char *buffer; + + if (argc < 2) + { + printf("PESum In [Out]\n"); + printf(" If [out] is given, adding attribute IMAGE_SCN_MEM_NOT_PAGED to '.text', '.data', '.idata' and '.bss' sections.\n"); + return 1; + } + + fp = fopen(argv[1], "rb"); + + if (fp == NULL) + { + printf("Unable to open input file '%s'\n", argv[1]); + return 2; + } + + fseek(fp, 0, SEEK_END); + len = ftell(fp); + fseek(fp, 0, SEEK_SET); + + buffer=(unsigned char*) malloc(((len+1)/2)*2); + if (buffer == NULL) + { + fclose(fp); + printf("Not enough memory available.\n"); + return 3; + } + + memset(buffer, 0x00, ((len+1)/2)*2); + fread(buffer, len, 1, fp); + fclose(fp); + + offset = ((PIMAGE_DOS_HEADER)buffer)->e_lfanew; + + if (offset + sizeof(IMAGE_NT_HEADERS) >= len || ((PIMAGE_NT_HEADERS)&buffer[offset])->Signature != IMAGE_NT_SIGNATURE) + { + printf("'%s' isn't a PE image\n", argv[1]); + printf("%d %d\n", offset + sizeof(IMAGE_NT_HEADERS), len); + free(buffer); + return 4; + } + + OldCheckSum = ((PIMAGE_NT_HEADERS)&buffer[offset])->OptionalHeader.CheckSum; + ((PIMAGE_NT_HEADERS)&buffer[offset])->OptionalHeader.CheckSum = 0; + + for(i=0; i<((PIMAGE_NT_HEADERS)&buffer[offset])->OptionalHeader.NumberOfRvaAndSizes; i++) + { + if (!((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].VirtualAddress) + break; +#if 1 + printf("%-8.8s %08x %08x %08x ", + ((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].Name, + ((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].VirtualAddress, + ((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].SizeOfRawData, + ((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].Characteristics); + + if (((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].Characteristics & IMAGE_SCN_CNT_CODE) + printf("C"); + if (((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].Characteristics & IMAGE_SCN_CNT_INITIALIZED_DATA) + printf("I"); + if (((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA) + printf("U"); + if (((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].Characteristics & IMAGE_SCN_MEM_READ) + printf("R"); + if (((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].Characteristics & IMAGE_SCN_MEM_WRITE) + printf("W"); + if (((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].Characteristics & IMAGE_SCN_MEM_EXECUTE) + printf("X"); + if (((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].Characteristics & IMAGE_SCN_MEM_NOT_PAGED) + printf("nP"); + if (((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].Characteristics & IMAGE_SCN_MEM_DISCARDABLE) + printf("D"); +#endif + if (argc>2) + { + char name[9]; + strncpy(name, ((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].Name, 8); + name[8]=0; + if(!strcmp(name, ".text") || !strcmp(name, ".data") || !strcmp(name, ".bss") || !strcmp(name, ".idata")) + { + ((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].Characteristics |= IMAGE_SCN_MEM_NOT_PAGED; + ((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].Characteristics &= ~IMAGE_SCN_MEM_DISCARDABLE; + } + } + printf("\n"); + + } + printf("\n"); + CheckSum = 0; + for(i = 0; i < len; i += 2) + { + CheckSum += *(unsigned short*)&buffer[i]; + CheckSum = 0xffff & (CheckSum + (CheckSum >> 16)); + } + + CheckSum+=len; + + if (argc > 2) + { + fp = fopen(argv[2], "wb+"); + if (fp == NULL) + { + printf("Unable to open output file '%s'\n", argv[2]); + free(buffer); + return 5; + } + ((PIMAGE_NT_HEADERS)&buffer[offset])->OptionalHeader.CheckSum = CheckSum; + fwrite(buffer, len, 1, fp); + fclose(fp); + printf("Creating '%s' from '%s' with PE checksum %08x\n", argv[2], argv[1], CheckSum); + + } + else + printf("PE-checksum for '%s' is %08x (old %08x)\n", argv[1], CheckSum, OldCheckSum); + + free(buffer); + return 0; +} From ba374c4128234e97467bda6bbfe2b855f4ab6378 Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Wed, 11 Feb 2004 21:52:28 +0000 Subject: [PATCH 0003/1463] Make a few stubs return something to get Dependancy Walker loading. svn path=/trunk/; revision=8157 --- reactos/subsys/win32k/objects/text.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index b77c7c1f8b9..03c051add06 100644 --- a/reactos/subsys/win32k/objects/text.c +++ b/reactos/subsys/win32k/objects/text.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: text.c,v 1.72 2004/01/29 22:24:51 rcampbell Exp $ */ +/* $Id: text.c,v 1.73 2004/02/11 21:52:28 sedwards Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -857,7 +857,8 @@ NtGdiGetCharABCWidths(HDC hDC, UINT LastChar, LPABC abc) { - UNIMPLEMENTED; + DPRINT1("NtGdiGetCharABCWidths Is unimplemented, keep going anyway\n"); + return 1; } BOOL @@ -889,7 +890,8 @@ NtGdiGetCharWidth(HDC hDC, UINT LastChar, LPINT Buffer) { - UNIMPLEMENTED; + DPRINT1("NtGdiGetCharWidth isnt really unimplemented - keep going anyway\n"); + return 1; } BOOL From 3c3e6a4430f03bf853f354b092fae7cc11e12935 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 11 Feb 2004 22:36:40 +0000 Subject: [PATCH 0004/1463] added EngGetCurrentProcessId() and EngGetCurrentThreadId() svn path=/trunk/; revision=8158 --- reactos/include/ddk/winddi.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reactos/include/ddk/winddi.h b/reactos/include/ddk/winddi.h index 2d8a7ce65fb..a6f7454d3cd 100644 --- a/reactos/include/ddk/winddi.h +++ b/reactos/include/ddk/winddi.h @@ -1712,6 +1712,10 @@ BOOL STDCALL EngCheckAbort(SURFOBJ *pso); FD_GLYPHSET* STDCALL EngComputeGlyphSet(INT nCodePage,INT nFirstChar,INT cChars); +HANDLE STDCALL +EngGetCurrentProcessId(VOID); +HANDLE STDCALL +EngGetCurrentThreadId(VOID); VOID STDCALL EngDeletePath(PATHOBJ *ppo); BOOL STDCALL @@ -1724,6 +1728,8 @@ LPWSTR STDCALL EngGetDriverName(HDEV hdev); LPWSTR STDCALL EngGetPrinterDataFileName(HDEV hdev); +HANDLE STDCALL +EngGetProcessHandle(VOID); BOOL STDCALL EngGradientFill(SURFOBJ *psoDest,CLIPOBJ *pco,XLATEOBJ *pxlo,TRIVERTEX *pVertex,ULONG nVertex,PVOID pMesh,ULONG nMesh,RECTL *prclExtents,POINTL *pptlDitherOrg,ULONG ulMode); HANDLE STDCALL From 6c33cfe3acb02a5a2b990db84a953529ef711a30 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Thu, 12 Feb 2004 15:55:57 +0000 Subject: [PATCH 0005/1463] - Locale values are specified in hexadecimal numbers. svn path=/trunk/; revision=8160 --- reactos/ntoskrnl/ps/locale.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/ntoskrnl/ps/locale.c b/reactos/ntoskrnl/ps/locale.c index 13fd6559df9..85d291bc3d8 100644 --- a/reactos/ntoskrnl/ps/locale.c +++ b/reactos/ntoskrnl/ps/locale.c @@ -1,4 +1,4 @@ -/* $Id: locale.c,v 1.6 2003/11/17 02:12:51 hyperion Exp $ +/* $Id: locale.c,v 1.7 2004/02/12 15:55:57 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -15,7 +15,7 @@ #include #include -#define NDEBUG +/* #define NDEBUG */ #include @@ -86,7 +86,7 @@ PiInitDefaultLocale(VOID) ValueString.Buffer = (PWSTR)ValueInfo->Data; Status = RtlUnicodeStringToInteger(&ValueString, - 10, + 16, &LocaleValue); if (NT_SUCCESS(Status)) { @@ -126,7 +126,7 @@ PiInitDefaultLocale(VOID) ValueString.Buffer = (PWSTR)ValueInfo->Data; Status = RtlUnicodeStringToInteger(&ValueString, - 10, + 16, &LocaleValue); if (NT_SUCCESS(Status)) { From ca9c59183f0d894a178e3df71cbce96cb79cdbf4 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Thu, 12 Feb 2004 21:50:19 +0000 Subject: [PATCH 0006/1463] - Fixed clipping code in NtGdiGetPixel. Patch by James Pritchard. svn path=/trunk/; revision=8161 --- reactos/subsys/win32k/objects/bitmaps.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index d4089e96dbd..e90ef97f5e9 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.53 2004/02/01 15:45:41 gvg Exp $ */ +/* $Id: bitmaps.c,v 1.54 2004/02/12 21:50:19 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -434,7 +434,7 @@ COLORREF STDCALL NtGdiGetPixel(HDC hDC, INT XPos, INT YPos) if (XPos < dc->CombinedClip->rclBounds.left || XPos > dc->CombinedClip->rclBounds.right || YPos < dc->CombinedClip->rclBounds.top || - YPos > dc->CombinedClip->rclBounds.top) + YPos > dc->CombinedClip->rclBounds.bottom) { DC_UnlockDc(hDC); return (COLORREF)CLR_INVALID; From b68208f089cf44e6d2383a79a09be5c906ed3d5d Mon Sep 17 00:00:00 2001 From: Royce Mitchell III Date: Thu, 12 Feb 2004 23:56:15 +0000 Subject: [PATCH 0007/1463] patch by blight: Simple GL programs should work if you have hardware-accelerated video drivers installed, still some bugs left and things to implement; Have already played a model-flight simulator with it. svn path=/trunk/; revision=8162 --- reactos/lib/opengl32/opengl32.c | 37 ++++++---- reactos/lib/opengl32/opengl32.h | 4 +- reactos/lib/opengl32/wgl.c | 122 ++++++++++++++++++++------------ 3 files changed, 102 insertions(+), 61 deletions(-) diff --git a/reactos/lib/opengl32/opengl32.c b/reactos/lib/opengl32/opengl32.c index 8ae6c95f72e..ac35879d643 100644 --- a/reactos/lib/opengl32/opengl32.c +++ b/reactos/lib/opengl32/opengl32.c @@ -1,4 +1,4 @@ -/* $Id: opengl32.c,v 1.14 2004/02/09 08:00:15 vizzini Exp $ +/* $Id: opengl32.c,v 1.15 2004/02/12 23:56:15 royce Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -34,13 +34,6 @@ static DWORD OPENGL32_InitializeDriver( GLDRIVERDATA *icd ); static BOOL OPENGL32_UnloadDriver( GLDRIVERDATA *icd ); /* global vars */ -/*const char* OPENGL32_funcnames[GLIDX_COUNT] SHARED = -{ -#define X(func, ret, typeargs, args) #func, - GLFUNCS_MACRO -#undef X -};*/ - DWORD OPENGL32_tls; GLPROCESSDATA OPENGL32_processdata; @@ -51,6 +44,8 @@ OPENGL32_ThreadDetach() { /* FIXME - do we need to release some HDC or something? */ GLTHREADDATA* lpData = NULL; + PROC *dispatchTable = NULL; + lpData = (GLTHREADDATA*)TlsGetValue( OPENGL32_tls ); if (lpData != NULL) { @@ -58,6 +53,16 @@ OPENGL32_ThreadDetach() DBGPRINT( "Warning: HeapFree() on GLTHREADDATA failed (%d)", GetLastError() ); } + + + dispatchTable = NtCurrentTeb()->glTable; + + if (dispatchTable != NULL) + { + if (!HeapFree( GetProcessHeap(), 0, dispatchTable )) + DBGPRINT( "Warning: HeapFree() on dispatch table failed (%d)", + GetLastError() ); + } } @@ -66,7 +71,7 @@ WINAPI DllMain(HINSTANCE hInstance, DWORD Reason, LPVOID Reserved) { GLTHREADDATA* lpData = NULL; - ICDTable *dispatchTable = NULL; + PROC *dispatchTable = NULL; TEB *teb = NULL; SECURITY_ATTRIBUTES attrib = { sizeof (SECURITY_ATTRIBUTES), /* nLength */ NULL, /* lpSecurityDescriptor */ @@ -106,9 +111,9 @@ DllMain(HINSTANCE hInstance, DWORD Reason, LPVOID Reserved) /* The attached process creates a new thread. */ case DLL_THREAD_ATTACH: - dispatchTable = (ICDTable*)HeapAlloc( GetProcessHeap(), + dispatchTable = (PROC*)HeapAlloc( GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS | HEAP_ZERO_MEMORY, - sizeof (ICDTable) ); + sizeof (((ICDTable *)(0))->dispatch_table) ); if (dispatchTable == NULL) { DBGPRINT( "Error: Couldn't allocate GL dispatch table" ); @@ -129,13 +134,13 @@ DllMain(HINSTANCE hInstance, DWORD Reason, LPVOID Reserved) /* initialize dispatch table with empty functions */ #define X(func, ret, typeargs, args, icdidx, tebidx, stack) \ - dispatchTable->dispatch_table[icdidx] = (PROC)glEmptyFunc##stack; \ + dispatchTable[icdidx] = (PROC)glEmptyFunc##stack; \ if (tebidx >= 0) \ teb->glDispatchTable[tebidx] = (PVOID)glEmptyFunc##stack; GLFUNCS_MACRO #undef X - teb->glTable = dispatchTable->dispatch_table; + teb->glTable = dispatchTable; TlsSetValue( OPENGL32_tls, lpData ); break; @@ -332,7 +337,7 @@ OPENGL32_InitializeDriver( GLDRIVERDATA *icd ) LOAD_DRV_PROC(icd, DrvSwapLayerBuffers, TRUE); /* we require at least one of DrvCreateContext and DrvCreateLayerContext */ - if (icd->DrvCreateContext == NULL || icd->DrvCreateLayerContext == NULL) + if (icd->DrvCreateContext == NULL && icd->DrvCreateLayerContext == NULL) { DBGPRINT( "Error: One of DrvCreateContext/DrvCreateLayerContext is required!" ); FreeLibrary( icd->handle ); @@ -464,8 +469,10 @@ OPENGL32_UnloadICD( GLDRIVERDATA *icd ) } icd->refcount--; - if (icd->refcount == 0) + //if (icd->refcount == 0) + if (0) ret = OPENGL32_UnloadDriver( icd ); + /* FIXME: InitializeICD crashes when called a second time */ /* release mutex */ if (!ReleaseMutex( OPENGL32_processdata.driver_mutex )) diff --git a/reactos/lib/opengl32/opengl32.h b/reactos/lib/opengl32/opengl32.h index 01e2ed35922..fee6b96418b 100644 --- a/reactos/lib/opengl32/opengl32.h +++ b/reactos/lib/opengl32/opengl32.h @@ -1,4 +1,4 @@ -/* $Id: opengl32.h,v 1.13 2004/02/11 17:39:24 vizzini Exp $ +/* $Id: opengl32.h,v 1.14 2004/02/12 23:56:15 royce Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -115,7 +115,7 @@ typedef struct tagGLDRIVERDATA BOOL APIENTRY (*DrvDescribeLayerPlane)( HDC, int, int, UINT, LPLAYERPLANEDESCRIPTOR ); int APIENTRY (*DrvDescribePixelFormat)( IN HDC, IN int, IN UINT, OUT LPPIXELFORMATDESCRIPTOR ); int APIENTRY (*DrvGetLayerPaletteEntries)( HDC, int, int, int, COLORREF * ); - FARPROC APIENTRY (*DrvGetProcAddress)( LPCSTR lpProcName ); + PROC APIENTRY (*DrvGetProcAddress)( LPCSTR lpProcName ); void APIENTRY (*DrvReleaseContext)(); BOOL APIENTRY (*DrvRealizeLayerPalette)( HDC, int, BOOL ); PICDTable APIENTRY (*DrvSetContext)( HDC hdc, HGLRC hglrc, SetContextCallBack callback ); diff --git a/reactos/lib/opengl32/wgl.c b/reactos/lib/opengl32/wgl.c index 12d3d99f4a2..76bc7286be5 100644 --- a/reactos/lib/opengl32/wgl.c +++ b/reactos/lib/opengl32/wgl.c @@ -127,7 +127,7 @@ WGL_ContainsContext( GLRC *glrc ) * be multiple times for one DrvSetContext call. * ARGUMENTS: [IN] table Function pointer table (first DWORD is number of * functions) - * RETURNS: unkown + * RETURNS: unkown (maybe void?) */ DWORD CALLBACK @@ -136,18 +136,27 @@ WGL_SetContextCallBack( const ICDTable *table ) /* UINT i;*/ TEB *teb; PROC *tebTable, *tebDispatchTable; + INT size; teb = NtCurrentTeb(); tebTable = (PROC *)teb->glTable; tebDispatchTable = (PROC *)teb->glDispatchTable; - DBGPRINT( "Function count: %d\n", table->num_funcs ); + if (table != NULL) + { + DBGPRINT( "Function count: %d\n", table->num_funcs ); - /* save table */ - memcpy( tebTable, table->dispatch_table, - sizeof (PROC) * table->num_funcs ); - memset( tebTable + sizeof (PROC) * table->num_funcs, 0, - sizeof (table->dispatch_table) - (sizeof (PROC) * table->num_funcs) ); + /* save table */ + size = sizeof (PROC) * table->num_funcs; + memcpy( tebTable, table->dispatch_table, size ); + memset( tebTable + table->num_funcs, 0, + sizeof (table->dispatch_table) - size ); + } + else + { + DBGPRINT( "Unsetting current context" ); + memset( tebTable, 0, sizeof (table->dispatch_table) ); + } /* FIXME: pull in software fallbacks -- need mesa */ #if 0 /* unused atm */ @@ -165,7 +174,8 @@ WGL_SetContextCallBack( const ICDTable *table ) #define X(func, ret, typeargs, args, icdidx, tebidx, stack) \ if (tebTable[icdidx] == NULL) \ { \ - DBGPRINT( "Warning: GL proc '%s' is NULL", #func ); \ + if (table != NULL) \ + DBGPRINT( "Warning: GL proc '%s' is NULL", #func ); \ tebTable[icdidx] = (PROC)glEmptyFunc##stack; \ } GLFUNCS_MACRO @@ -209,6 +219,7 @@ rosglChoosePixelFormat( HDC hdc, CONST PIXELFORMATDESCRIPTOR *pfd ) /* check input */ if (pfd->nSize != sizeof (PIXELFORMATDESCRIPTOR) || pfd->nVersion != 1) { + OPENGL32_UnloadICD( icd ); SetLastError( 0 ); /* FIXME: use appropriate errorcode */ return 0; } @@ -219,6 +230,7 @@ rosglChoosePixelFormat( HDC hdc, CONST PIXELFORMATDESCRIPTOR *pfd ) if (icdNumFormats == 0) { DBGPRINT( "Error: DrvDescribePixelFormat failed (%d)", GetLastError() ); + OPENGL32_UnloadICD( icd ); return 0; } DBGPRINT( "Info: Enumerating %d pixelformats", icdNumFormats ); @@ -269,6 +281,7 @@ rosglChoosePixelFormat( HDC hdc, CONST PIXELFORMATDESCRIPTOR *pfd ) if (best == 0) SetLastError( 0 ); /* FIXME: set appropriate error */ + OPENGL32_UnloadICD( icd ); DBGPRINT( "Info: Suggesting pixelformat %d", best ); return best; @@ -503,6 +516,7 @@ rosglDescribePixelFormat( HDC hdc, int iFormat, UINT nBytes, ret = icd->DrvDescribePixelFormat( hdc, iFormat, nBytes, pfd ); if (ret == 0) DBGPRINT( "Error: DrvDescribePixelFormat(format=%d) failed (%d)", iFormat, GetLastError() ); + OPENGL32_UnloadICD( icd ); } /* FIXME: implement own functionality? */ @@ -576,7 +590,9 @@ rosglGetProcAddress( LPCSTR proc ) if (proc[0] == 'g' && proc[1] == 'l') /* glXXX */ { - PROC glXXX = OPENGL32_threaddata->glrc->icd->DrvGetProcAddress( proc ); + PROC glXXX = NULL; + GLDRIVERDATA *icd = OPENGL32_threaddata->glrc->icd; + glXXX = icd->DrvGetProcAddress( proc ); if (glXXX) { DBGPRINT( "Info: Proc \"%s\" loaded from ICD.", proc ); @@ -619,47 +635,61 @@ rosglMakeCurrent( HDC hdc, HGLRC hglrc ) glFlush(); } - /* check hdc */ - if (GetObjectType( hdc ) != OBJ_DC) + /* check if current context is unset */ + if (glrc == NULL) { - DBGPRINT( "Error: hdc is not a DC handle!" ); - return FALSE; - } - - /* check if we know about this glrc */ - if (!WGL_ContainsContext( glrc )) - { - DBGPRINT( "Error: hglrc not found!" ); - return FALSE; /* FIXME: SetLastError() */ - } - - /* check if it is available */ - if (glrc->is_current) /* used by another thread */ - { - DBGPRINT( "Error: hglrc is current for thread 0x%08x", glrc->thread_id ); - return FALSE; /* FIXME: SetLastError() */ - } - - /* call the ICD */ - if (glrc->hglrc != NULL) - { - icdTable = glrc->icd->DrvSetContext( hdc, glrc->hglrc, - WGL_SetContextCallBack ); - if (icdTable == NULL) + if (OPENGL32_threaddata->glrc != NULL) { - DBGPRINT( "Error: DrvSetContext failed (%d)\n", GetLastError() ); + OPENGL32_threaddata->glrc->is_current = FALSE; + OPENGL32_threaddata->glrc = NULL; + } + } + else + { + /* check hdc */ + if (GetObjectType( hdc ) != OBJ_DC && GetObjectType( hdc ) != OBJ_MEMDC) + { + DBGPRINT( "Error: hdc is not a DC handle!" ); return FALSE; } - DBGPRINT( "Info: DrvSetContext succeeded!" ); + + /* check if we know about this glrc */ + if (!WGL_ContainsContext( glrc )) + { + DBGPRINT( "Error: hglrc not found!" ); + return FALSE; /* FIXME: SetLastError() */ + } + + /* check if it is available */ + if (glrc->is_current && glrc->thread_id != GetCurrentThreadId()) /* used by another thread */ + { + DBGPRINT( "Error: hglrc is current for thread 0x%08x", glrc->thread_id ); + return FALSE; /* FIXME: SetLastError() */ + } + + /* call the ICD */ + if (glrc->hglrc != NULL) + { + icdTable = glrc->icd->DrvSetContext( hdc, glrc->hglrc, + WGL_SetContextCallBack ); + if (icdTable == NULL) + { + DBGPRINT( "Error: DrvSetContext failed (%d)\n", GetLastError() ); + return FALSE; + } + DBGPRINT( "Info: DrvSetContext succeeded!" ); + } + + /* make it current */ + if (OPENGL32_threaddata->glrc != NULL) + OPENGL32_threaddata->glrc->is_current = FALSE; + glrc->is_current = TRUE; + glrc->thread_id = GetCurrentThreadId(); + glrc->hdc = hdc; + OPENGL32_threaddata->glrc = glrc; } - /* make it current */ - if (OPENGL32_threaddata->glrc != NULL) - OPENGL32_threaddata->glrc->is_current = FALSE; - glrc->is_current = TRUE; - glrc->thread_id = GetCurrentThreadId(); - glrc->hdc = hdc; - OPENGL32_threaddata->glrc = glrc; + WGL_SetContextCallBack( icdTable ); if (icdTable != NULL) if (WGL_SetContextCallBack( icdTable ) != ERROR_SUCCESS) @@ -704,11 +734,13 @@ rosglSetPixelFormat( HDC hdc, int iFormat, CONST PIXELFORMATDESCRIPTOR *pfd ) { DBGPRINT( "Warning: DrvSetPixelFormat(format=%d) failed (%d)", iFormat, GetLastError() ); + OPENGL32_UnloadICD( icd ); return FALSE; } OPENGL32_processdata.cachedHdc = hdc; OPENGL32_processdata.cachedFormat = iFormat; + OPENGL32_UnloadICD( icd ); return TRUE; } @@ -764,8 +796,10 @@ rosglSwapBuffers( HDC hdc ) if (!icd->DrvSwapBuffers( hdc )) { DBGPRINT( "Error: DrvSwapBuffers failed (%d)", GetLastError() ); + OPENGL32_UnloadICD( icd ); return FALSE; } + OPENGL32_UnloadICD( icd ); return TRUE; } From 9a8ead96233960930d65de42ab7aa999a0ba6829 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 13 Feb 2004 09:37:11 +0000 Subject: [PATCH 0008/1463] - Eliminate function pointer typecasts in csqtest - Move the csq.h header to the right place - Added .cvsignore files svn path=/trunk/; revision=8163 --- reactos/drivers/lib/csq/.cvsignore | 5 +++++ reactos/drivers/test/csqtest/.cvsignore | 5 +++++ reactos/drivers/test/csqtest/csqtest.c | 18 +++++++++--------- reactos/{drivers/lib/csq => include/ddk}/csq.h | 0 4 files changed, 19 insertions(+), 9 deletions(-) create mode 100644 reactos/drivers/lib/csq/.cvsignore create mode 100644 reactos/drivers/test/csqtest/.cvsignore rename reactos/{drivers/lib/csq => include/ddk}/csq.h (100%) diff --git a/reactos/drivers/lib/csq/.cvsignore b/reactos/drivers/lib/csq/.cvsignore new file mode 100644 index 00000000000..77f6c717865 --- /dev/null +++ b/reactos/drivers/lib/csq/.cvsignore @@ -0,0 +1,5 @@ +*.coff +*.sym +*.sys +*.o +*.map diff --git a/reactos/drivers/test/csqtest/.cvsignore b/reactos/drivers/test/csqtest/.cvsignore new file mode 100644 index 00000000000..77f6c717865 --- /dev/null +++ b/reactos/drivers/test/csqtest/.cvsignore @@ -0,0 +1,5 @@ +*.coff +*.sym +*.sys +*.o +*.map diff --git a/reactos/drivers/test/csqtest/csqtest.c b/reactos/drivers/test/csqtest/csqtest.c index 4b6b22ec1ea..3a6c217eb21 100644 --- a/reactos/drivers/test/csqtest/csqtest.c +++ b/reactos/drivers/test/csqtest/csqtest.c @@ -182,16 +182,16 @@ NTSTATUS NTAPI DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING Registry UNICODE_STRING NtName; UNICODE_STRING DosName; - DriverObject->MajorFunction[IRP_MJ_CREATE] = (PDRIVER_DISPATCH)DispatchCreateCloseCleanup; - DriverObject->MajorFunction[IRP_MJ_CLOSE] = (PDRIVER_DISPATCH)DispatchCreateCloseCleanup; - DriverObject->MajorFunction[IRP_MJ_CLEANUP] = (PDRIVER_DISPATCH)DispatchCreateCloseCleanup; - DriverObject->MajorFunction[IRP_MJ_READ] = (PDRIVER_DISPATCH)DispatchReadWrite; - DriverObject->MajorFunction[IRP_MJ_WRITE] = (PDRIVER_DISPATCH)DispatchReadWrite; - DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = (PDRIVER_DISPATCH)DispatchIoctl; - DriverObject->DriverUnload = (PDRIVER_UNLOAD)Unload; + DriverObject->MajorFunction[IRP_MJ_CREATE] = DispatchCreateCloseCleanup; + DriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchCreateCloseCleanup; + DriverObject->MajorFunction[IRP_MJ_CLEANUP] = DispatchCreateCloseCleanup; + DriverObject->MajorFunction[IRP_MJ_READ] = DispatchReadWrite; + DriverObject->MajorFunction[IRP_MJ_WRITE] = DispatchReadWrite; + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchIoctl; + DriverObject->DriverUnload = Unload; - Status = IoCsqInitialize(&Csq, (PIO_CSQ_INSERT_IRP)CsqInsertIrp, CsqRemoveIrp, CsqPeekNextIrp, - CsqAcquireLock, (PIO_CSQ_RELEASE_LOCK)CsqReleaseLock, CsqCompleteCancelledIrp); + Status = IoCsqInitialize(&Csq, CsqInsertIrp, CsqRemoveIrp, CsqPeekNextIrp, + CsqAcquireLock, CsqReleaseLock, CsqCompleteCancelledIrp); if(Status != STATUS_SUCCESS) KdPrint(("csqtest: IoCsqInitalize failed: 0x%x\n", Status)); diff --git a/reactos/drivers/lib/csq/csq.h b/reactos/include/ddk/csq.h similarity index 100% rename from reactos/drivers/lib/csq/csq.h rename to reactos/include/ddk/csq.h From fbd7136c2ed654ea643325ee9414aa7a23f6bf51 Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Sat, 14 Feb 2004 00:31:39 +0000 Subject: [PATCH 0009/1463] Adapted GdiTransparentBlt by Kevin Koltzau From WINE Friday the 13th 2004 svn path=/trunk/; revision=8164 --- reactos/lib/gdi32/misc/stubs.c | 13 +--- reactos/lib/gdi32/objects/bitblt.c | 101 +++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 12 deletions(-) diff --git a/reactos/lib/gdi32/misc/stubs.c b/reactos/lib/gdi32/misc/stubs.c index b2c5f51936b..8a587a9a417 100644 --- a/reactos/lib/gdi32/misc/stubs.c +++ b/reactos/lib/gdi32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.48 2004/02/08 21:37:52 weiden Exp $ +/* $Id: stubs.c,v 1.49 2004/02/14 00:31:38 sedwards Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -2347,17 +2347,6 @@ GdiSetPixelFormat(HDC hdc,int ipfd) return 0; } -/* - * @unimplemented - */ -BOOL -STDCALL -GdiTransparentBlt(HDC hdcDst, int xDst, int yDst, int cxDst, int cyDst,HDC hdcSrc, int xSrc, int ySrc, int cxSrc, int cySrc,COLORREF TransColor) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented */ diff --git a/reactos/lib/gdi32/objects/bitblt.c b/reactos/lib/gdi32/objects/bitblt.c index b14e178f1d4..2c5bffd6be6 100644 --- a/reactos/lib/gdi32/objects/bitblt.c +++ b/reactos/lib/gdi32/objects/bitblt.c @@ -1,3 +1,15 @@ +/* $Id: bitblt.c,v 1.17 2004/02/14 00:31:39 sedwards Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * FILE: lib/gdi32/object/bitblt.c + * PURPOSE: + * PROGRAMMER: + * + * GdiTransparentBlt Copyright Kevin Koltzau + * adapted from WINE 2-13-04 + */ + #ifdef UNICODE #undef UNICODE #endif @@ -370,6 +382,95 @@ PolyPatBlt(HDC hDC,DWORD dwRop,PPATRECT pRects,int cRects,ULONG Reserved) return NtGdiPolyPatBlt(hDC,dwRop,pRects,cRects,Reserved); } +/****************************************************************************** + * GdiTransparentBlt [GDI32.@] + * + * @implemented + */ +WINBOOL +STDCALL +GdiTransparentBlt( HDC hdcDst, int xDst, int yDst, int cxDst, int cyDst, + HDC hdcSrc, int xSrc, int ySrc, int cxSrc, int cySrc, + COLORREF TransColor ) +{ + BOOL ret = FALSE; + HDC hdcWork; + HBITMAP bmpWork; + HGDIOBJ oldWork; + HDC hdcMask = NULL; + HBITMAP bmpMask = NULL; + HBITMAP oldMask = NULL; + COLORREF oldBackground; + COLORREF oldForeground; + int oldStretchMode; + + if(cxDst < 0 || cyDst < 0 || cxSrc < 0 || cySrc < 0) { + DPRINT("Can not mirror\n"); + return FALSE; + } + + oldBackground = SetBkColor(hdcDst, RGB(255,255,255)); + oldForeground = SetTextColor(hdcDst, RGB(0,0,0)); + + /* Stretch bitmap */ + oldStretchMode = GetStretchBltMode(hdcSrc); + if(oldStretchMode == BLACKONWHITE || oldStretchMode == WHITEONBLACK) + SetStretchBltMode(hdcSrc, COLORONCOLOR); + hdcWork = CreateCompatibleDC(hdcDst); + bmpWork = CreateCompatibleBitmap(hdcDst, cxDst, cyDst); + oldWork = SelectObject(hdcWork, bmpWork); + if(!StretchBlt(hdcWork, 0, 0, cxDst, cyDst, hdcSrc, xSrc, ySrc, cxSrc, cySrc, SRCCOPY)) { + DPRINT("Failed to stretch\n"); + goto error; + } + SetBkColor(hdcWork, TransColor); + + /* Create mask */ + hdcMask = CreateCompatibleDC(hdcDst); + bmpMask = CreateCompatibleBitmap(hdcMask, cxDst, cyDst); + oldMask = SelectObject(hdcMask, bmpMask); + if(!BitBlt(hdcMask, 0, 0, cxDst, cyDst, hdcWork, 0, 0, SRCCOPY)) { + DPRINT("Failed to create mask\n"); + goto error; + } + + /* Replace transparent color with black */ + SetBkColor(hdcWork, RGB(0,0,0)); + SetTextColor(hdcWork, RGB(255,255,255)); + if(!BitBlt(hdcWork, 0, 0, cxDst, cyDst, hdcMask, 0, 0, SRCAND)) { + DPRINT("Failed to mask out background\n"); + goto error; + } + + /* Replace non-transparent area on destination with black */ + if(!BitBlt(hdcDst, xDst, yDst, cxDst, cyDst, hdcMask, 0, 0, SRCAND)) { + DPRINT("Failed to clear destination area\n"); + goto error; + } + + /* Draw the image */ + if(!BitBlt(hdcDst, xDst, yDst, cxDst, cyDst, hdcWork, 0, 0, SRCPAINT)) { + DPRINT("Failed to paint image\n"); + goto error; + } + + ret = TRUE; +error: + SetStretchBltMode(hdcSrc, oldStretchMode); + SetBkColor(hdcDst, oldBackground); + SetTextColor(hdcDst, oldForeground); + if(hdcWork) { + SelectObject(hdcWork, oldWork); + DeleteDC(hdcWork); + } + if(bmpWork) DeleteObject(bmpWork); + if(hdcMask) { + SelectObject(hdcMask, oldMask); + DeleteDC(hdcMask); + } + if(bmpMask) DeleteObject(bmpMask); + return ret; +} /* From a6e68c5913def37bfac8811f908a3c87776ea398 Mon Sep 17 00:00:00 2001 From: Richard Campbell Date: Sat, 14 Feb 2004 02:41:53 +0000 Subject: [PATCH 0010/1463] Part I of my font patch. svn path=/trunk/; revision=8165 --- reactos/bootdata/hivesys.inf | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/reactos/bootdata/hivesys.inf b/reactos/bootdata/hivesys.inf index 9912e56e5d6..10b8009b39f 100644 --- a/reactos/bootdata/hivesys.inf +++ b/reactos/bootdata/hivesys.inf @@ -555,6 +555,34 @@ HKLM,"SYSTEM\Setup","SetupType",0x00010001,0x00000000 HKLM,"SYSTEM\Setup","SystemPartition",0x00000000,"\Device\Harddisk0\Partition1" HKLM,"SYSTEM\Setup","SystemSetupInProgress",0x00010001,0x00000000 +; GUI Setup + +HKCU, "Control Panel\Desktop\WindowMetrics","CaptionFont",0x00000001,f5,ff,ff,ff,00,00,00,\ +00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,42,00,69,00,74,00,73,00,74,\ +00,72,00,65,00,61,00,6d,00,20,00,56,00,65,00,72,00,61,00,20,00,53,00,61,00,6e,00,73,00,00,\ +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 +HKCU, "Control Panel\Desktop\WindowMetrics","IconFont",0x00000001,f5,ff,ff,ff,00,00,00,00,\ +00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,42,00,69,00,74,00,73,00,74,00,\ +72,00,65,00,61,00,6d,00,20,00,56,00,65,00,72,00,61,00,20,00,53,00,61,00,6e,00,73,00,00,00,\ +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 +HKCU, "Control Panel\Desktop\WindowMetrics","MenuFont",0x00000001,f5,ff,ff,ff,00,00,00,00,\ +00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,42,00,69,00,74,00,73,00,74,00,\ +72,00,65,00,61,00,6d,00,20,00,56,00,65,00,72,00,61,00,20,00,53,00,61,00,6e,00,73,00,00,00,\ +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 +HKCU, "Control Panel\Desktop\WindowMetrics","MessageFont",0x00000001,f5,ff,ff,ff,00,00,00,\ +00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,42,00,69,00,74,00,73,00,74,\ +00,72,00,65,00,61,00,6d,00,20,00,56,00,65,00,72,00,61,00,20,00,53,00,61,00,6e,00,73,00,00,\ +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 +HKCU, "Control Panel\Desktop\WindowMetrics","SmCaptionFont",0x00000001,f5,ff,ff,ff,00,00,\ +00,00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,42,00,69,00,74,00,73,00,\ +74,00,72,00,65,00,61,00,6d,00,20,00,56,00,65,00,72,00,61,00,20,00,53,00,61,00,6e,00,73,00,\ +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 +HKCU, "Control Panel\Desktop\WindowMetrics","IconFont",0x00000001,f5,ff,ff,ff,00,00,00,00,\ +00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,42,00,69,00,74,00,73,00,74,00,\ +72,00,65,00,61,00,6d,00,20,00,56,00,65,00,72,00,61,00,20,00,53,00,61,00,6e,00,73,00,00,00,\ +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 + + ; ----------------------------- KJS Init ---------------------------- HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","kjsinit",0x00010000,\ "function init(v) { var rk = '\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Kdb'; eval(System.regread(rk,v)); } for( i = 1; i <= 40; i++ ) { init((new Number(i)).toString()); }" From f2bfe59541409f3f624d82315ebd8ab8197cfe51 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sat, 14 Feb 2004 12:29:33 +0000 Subject: [PATCH 0011/1463] sizeof(SENSE_BUFFER_SIZE) -> SENSE_BUFFER_SIZE svn path=/trunk/; revision=8166 --- reactos/drivers/storage/disk/disk.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/storage/disk/disk.c b/reactos/drivers/storage/disk/disk.c index d97a0ad8a83..6f0a79819ff 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.34 2004/01/09 20:21:31 gvg Exp $ +/* $Id: disk.c,v 1.35 2004/02/14 12:29:33 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -561,7 +561,7 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, /* Allocate sense data buffer */ DiskDeviceExtension->SenseData = ExAllocatePool(NonPagedPool, - sizeof(SENSE_BUFFER_SIZE)); + SENSE_BUFFER_SIZE); if (DiskDeviceExtension->SenseData == NULL) { DPRINT("Failed to allocate sense data buffer!\n"); From 1c4efc692a4e8c3613410c3981d2e2e43cfe5a6d Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sat, 14 Feb 2004 19:48:07 +0000 Subject: [PATCH 0012/1463] - Lock the pages always in MmProbeAndLockPages. svn path=/trunk/; revision=8168 --- reactos/ntoskrnl/mm/mdl.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/reactos/ntoskrnl/mm/mdl.c b/reactos/ntoskrnl/mm/mdl.c index 26d042d1d93..ca4718774f0 100644 --- a/reactos/ntoskrnl/mm/mdl.c +++ b/reactos/ntoskrnl/mm/mdl.c @@ -1,4 +1,4 @@ -/* $Id: mdl.c,v 1.56 2003/12/31 05:33:04 jfilby Exp $ +/* $Id: mdl.c,v 1.57 2004/02/14 19:48:07 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -383,10 +383,7 @@ VOID STDCALL MmProbeAndLockPages (PMDL Mdl, ExRaiseStatus(Status); } } - else - { - MmLockPage(MmGetPhysicalAddressForProcess(NULL, Address)); - } + MmLockPage(MmGetPhysicalAddressForProcess(NULL, Address)); if ((Operation == IoWriteAccess || Operation == IoModifyAccess) && (!(MmGetPageProtect(NULL, (PVOID)Address) & PAGE_READWRITE))) { From b54b1d664d0c978953445a8906350c3f44e04d18 Mon Sep 17 00:00:00 2001 From: Vizzini Date: Sat, 14 Feb 2004 20:11:12 +0000 Subject: [PATCH 0013/1463] updated defs for floppy support svn path=/trunk/; revision=8169 --- reactos/include/ddk/iodef.h | 66 ++++++++++++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/reactos/include/ddk/iodef.h b/reactos/include/ddk/iodef.h index cc4a9e9821e..f6248fa14dc 100644 --- a/reactos/include/ddk/iodef.h +++ b/reactos/include/ddk/iodef.h @@ -11,9 +11,47 @@ typedef enum _IO_QUERY_DEVICE_DESCRIPTION typedef enum _CONFIGURATION_TYPE { + ArcSystem, + CentralProcessor, + FloatingPointProcessor, + PrimaryIcache, + PrimaryDcache, + SecondaryIcache, + SecondaryDcache, + SecondaryCache, + EisaAdapter, + TcAdapter, + ScsiAdapter, + DtiAdapter, + MultiFunctionAdapter, DiskController, + TapeController, + CdromController, + WorkController, + SerialController, + NetworkController, + DsplayController, ParallelController, - MaximumType, + PointerController, + KeyboardController, + AudioController, + OtherController, + FloppyDiskPeripheral, + TapePeripheral, + ModemPeripheral, + MonitorPeripheral, + PrinterPeripheral, + PointerPeripheral, + KeyboardPeripheral, + TerminalPeripheral, + OtherPeripheral, + LinePeripheral, + NetworkPeripheral, + SystemMemory, + DockingInformation, + RealModeIrqRoutingTable, + RealModePCIEnumeration, + MaximumType } CONFIGURATION_TYPE, *PCONFIGURATION_TYPE; typedef enum _CM_RESOURCE_TYPE @@ -413,4 +451,30 @@ typedef ULONG FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS; #define IRP_MN_QUERY_DIRECTORY 0x01 #define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02 +/* + * Floppy device data type + */ +typedef struct _CM_FLOPPY_DEVICE_DATA +{ + USHORT Version; + USHORT Revision; + CHAR Size[8]; + ULONG MaxDensity; + ULONG MountDensity; + UCHAR StepRateHeadUnloadTime; + UCHAR HeadLoadTime; + UCHAR MotorOffTime; + UCHAR SectorLengthCode; + UCHAR SectorPerTrack; + UCHAR ReadWriteGapLength; + UCHAR DataTransferLength; + UCHAR FormatGapLength; + UCHAR FormatFillCharacter; + UCHAR HeadSettleTime; + UCHAR MotorSettleTime; + UCHAR MaximumTrackValue; + UCHAR DataTransferRate; +} CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA; + #endif + From eef7a396891b167208447d2df9383ca634a369b8 Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Sat, 14 Feb 2004 20:11:42 +0000 Subject: [PATCH 0014/1463] Added WINE kernel32 regression tests. svn path=/trunk/; revision=8170 --- reactos/apps/tests/kernel32/.cvsignore | 6 + reactos/apps/tests/kernel32/Makefile | 46 + reactos/apps/tests/kernel32/Makefile.in | 33 + reactos/apps/tests/kernel32/alloc.c | 408 +++++ reactos/apps/tests/kernel32/atom.c | 191 ++ reactos/apps/tests/kernel32/change.c | 237 +++ reactos/apps/tests/kernel32/codepage.c | 62 + reactos/apps/tests/kernel32/comm.c | 640 +++++++ reactos/apps/tests/kernel32/console.c | 584 +++++++ reactos/apps/tests/kernel32/directory.c | 351 ++++ reactos/apps/tests/kernel32/drive.c | 183 ++ reactos/apps/tests/kernel32/environ.c | 218 +++ reactos/apps/tests/kernel32/file.c | 1006 +++++++++++ reactos/apps/tests/kernel32/format_msg.c | 226 +++ reactos/apps/tests/kernel32/generated.c | 1015 +++++++++++ reactos/apps/tests/kernel32/heap.c | 89 + reactos/apps/tests/kernel32/locale.c | 2043 ++++++++++++++++++++++ reactos/apps/tests/kernel32/mailslot.c | 330 ++++ reactos/apps/tests/kernel32/path.c | 946 ++++++++++ reactos/apps/tests/kernel32/pipe.c | 601 +++++++ reactos/apps/tests/kernel32/process.c | 1202 +++++++++++++ reactos/apps/tests/kernel32/profile.c | 92 + reactos/apps/tests/kernel32/testlist.c | 66 + reactos/apps/tests/kernel32/thread.c | 572 ++++++ reactos/apps/tests/kernel32/virtual.c | 113 ++ 25 files changed, 11260 insertions(+) create mode 100644 reactos/apps/tests/kernel32/.cvsignore create mode 100644 reactos/apps/tests/kernel32/Makefile create mode 100644 reactos/apps/tests/kernel32/Makefile.in create mode 100644 reactos/apps/tests/kernel32/alloc.c create mode 100644 reactos/apps/tests/kernel32/atom.c create mode 100644 reactos/apps/tests/kernel32/change.c create mode 100644 reactos/apps/tests/kernel32/codepage.c create mode 100644 reactos/apps/tests/kernel32/comm.c create mode 100644 reactos/apps/tests/kernel32/console.c create mode 100644 reactos/apps/tests/kernel32/directory.c create mode 100644 reactos/apps/tests/kernel32/drive.c create mode 100644 reactos/apps/tests/kernel32/environ.c create mode 100644 reactos/apps/tests/kernel32/file.c create mode 100644 reactos/apps/tests/kernel32/format_msg.c create mode 100644 reactos/apps/tests/kernel32/generated.c create mode 100644 reactos/apps/tests/kernel32/heap.c create mode 100644 reactos/apps/tests/kernel32/locale.c create mode 100644 reactos/apps/tests/kernel32/mailslot.c create mode 100644 reactos/apps/tests/kernel32/path.c create mode 100644 reactos/apps/tests/kernel32/pipe.c create mode 100644 reactos/apps/tests/kernel32/process.c create mode 100644 reactos/apps/tests/kernel32/profile.c create mode 100644 reactos/apps/tests/kernel32/testlist.c create mode 100644 reactos/apps/tests/kernel32/thread.c create mode 100644 reactos/apps/tests/kernel32/virtual.c diff --git a/reactos/apps/tests/kernel32/.cvsignore b/reactos/apps/tests/kernel32/.cvsignore new file mode 100644 index 00000000000..d63774a7353 --- /dev/null +++ b/reactos/apps/tests/kernel32/.cvsignore @@ -0,0 +1,6 @@ +*.o +*.d +*.exe +*.coff +*.sym +*.map diff --git a/reactos/apps/tests/kernel32/Makefile b/reactos/apps/tests/kernel32/Makefile new file mode 100644 index 00000000000..44f6f6e75de --- /dev/null +++ b/reactos/apps/tests/kernel32/Makefile @@ -0,0 +1,46 @@ +# $Id: Makefile,v 1.1 2004/02/14 20:11:42 sedwards Exp $ + +PATH_TO_TOP = ../../.. + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = console + +# require os code to explicitly request A/W version of structs/functions +TARGET_CFLAGS += -D_DISABLE_TIDENTS -D__USE_W32API + +TARGET_NAME = kernel32_test + +TARGET_SDKLIBS = kernel32.a + +TARGET_OBJECTS = \ + testlist.o \ + atom.o \ + change.o \ + codepage.o \ + comm.o \ + console.o \ + directory.o \ + drive.o \ + environ.o \ + file.o \ + format_msg.o \ + heap.o \ + locale.o \ + mailslot.o \ + path.o \ + pipe.o \ + process.o \ + profile.o \ + thread.o \ + virtual.o + +#FIXME alloc.o \ + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/reactos/apps/tests/kernel32/Makefile.in b/reactos/apps/tests/kernel32/Makefile.in new file mode 100644 index 00000000000..7e6923e58e5 --- /dev/null +++ b/reactos/apps/tests/kernel32/Makefile.in @@ -0,0 +1,33 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +TESTDLL = kernel32.dll +IMPORTS = kernel32 + +CTESTS = \ + alloc.c \ + atom.c \ + change.c \ + codepage.c \ + comm.c \ + console.c \ + directory.c \ + drive.c \ + environ.c \ + file.c \ + format_msg.c \ + generated.c \ + heap.c \ + locale.c \ + mailslot.c \ + path.c \ + pipe.c \ + process.c \ + profile.c \ + thread.c \ + virtual.c + +@MAKE_TEST_RULES@ + +### Dependencies: diff --git a/reactos/apps/tests/kernel32/alloc.c b/reactos/apps/tests/kernel32/alloc.c new file mode 100644 index 00000000000..ae02789506d --- /dev/null +++ b/reactos/apps/tests/kernel32/alloc.c @@ -0,0 +1,408 @@ +/* + * Unit test suite for memory allocation functions. + * + * Copyright 2002 Geoffrey Hausheer + * + * 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 "wine/test.h" +#include "windef.h" +#include "winbase.h" +#include "winerror.h" + + + /* The following functions don't have tests, because either I don't know how + to test them, or they are WinNT only, or require multiple threads. + Since the last two issues shouldn't really stop the tests from being + written, assume for now that it is all due to the first case + HeapCompact + HeapLock + HeapQueryInformation + HeapSetInformation + HeapUnlock + HeapValidate + HeapWalk +*/ +/* In addition, these features aren't being tested + HEAP_NO_SERIALIZE + HEAP_GENERATE_EXCEPTIONS + STATUS_ACCESS_VIOLATION (error code from HeapAlloc) +*/ + +static void test_Heap(void) +{ + SYSTEM_INFO sysInfo; + ULONG memchunk; + HANDLE heap; + LPVOID mem1,mem1a,mem3; + UCHAR *mem2,*mem2a; + UINT error,i; + DWORD dwSize; + +/* Retrieve the page size for this system */ + sysInfo.dwPageSize=0; + GetSystemInfo(&sysInfo); + ok(sysInfo.dwPageSize>0,"GetSystemInfo should return a valid page size\n"); + +/* Create a Heap with a minimum and maximum size */ +/* Note that Windows and Wine seem to behave a bit differently with respect + to memory allocation. In Windows, you can't access all the memory + specified in the heap (due to overhead), so choosing a reasonable maximum + size for the heap was done mostly by trial-and-error on Win2k. It may need + more tweaking for otherWindows variants. +*/ + memchunk=10*sysInfo.dwPageSize; + heap=HeapCreate(0,2*memchunk,5*memchunk); + +/* Check that HeapCreate allocated the right amount of ram */ + todo_wine { + /* Today HeapCreate seems to return a memory block larger than specified. + MSDN says the maximum heap size should be dwMaximumSize rounded up to the + nearest page boundary + */ + mem1=HeapAlloc(heap,0,5*memchunk+1); + ok(mem1==NULL,"HeapCreate allocated more Ram than it should have\n"); + if(mem1) { + HeapFree(heap,0,mem1); + } + } + +/* Check that a normal alloc works */ + mem1=HeapAlloc(heap,0,memchunk); + ok(mem1!=NULL,"HeapAlloc failed\n"); + if(mem1) { + ok(HeapSize(heap,0,mem1)>=memchunk, "HeapAlloc should return a big enough memory block\n"); + } + +/* Check that a 'zeroing' alloc works */ + mem2=HeapAlloc(heap,HEAP_ZERO_MEMORY,memchunk); + ok(mem2!=NULL,"HeapAlloc failed\n"); + if(mem2) { + ok(HeapSize(heap,0,mem2)>=memchunk,"HeapAlloc should return a big enough memory block\n"); + error=0; + for(i=0;i=memchunk+5*sysInfo.dwPageSize,"HeapReAlloc failed\n"); + error=0; + for(i=0;i<5*sysInfo.dwPageSize;i++) { + if(mem2a[memchunk+i]!=0) { + error=1; + } + } + ok(!error,"HeapReAlloc should have zeroed out it's allocated memory\n"); + } + +/* Check that HeapRealloc honours HEAP_REALLOC_IN_PLACE_ONLY */ + error=0; + mem1a=HeapReAlloc(heap,HEAP_REALLOC_IN_PLACE_ONLY,mem1,memchunk+sysInfo.dwPageSize); + if(mem1a!=NULL) { + if(mem1a!=mem1) { + error=1; + } + } + ok(mem1a==NULL || error==0,"HeapReAlloc didn't honour HEAP_REALLOC_IN_PLACE_ONLY\n"); + +/* Check that HeapFree works correctly */ + if(mem1a) { + ok(HeapFree(heap,0,mem1a),"HeapFree failed\n"); + } else { + ok(HeapFree(heap,0,mem1),"HeapFree failed\n"); + } + if(mem2a) { + ok(HeapFree(heap,0,mem2a),"HeapFree failed\n"); + } else { + ok(HeapFree(heap,0,mem2),"HeapFree failed\n"); + } + + /* 0-length buffer */ + mem1 = HeapAlloc(heap, 0, 0); + ok(mem1 != NULL, "Reserved memory\n"); + + dwSize = HeapSize(heap, 0, mem1); + /* should work with 0-length buffer */ + ok((dwSize >= 0) && (dwSize < 0xFFFFFFFF), + "The size of the 0-length buffer\n"); + ok(HeapFree(heap, 0, mem1), "Freed the 0-length buffer\n"); + +/* Check that HeapDestry works */ + ok(HeapDestroy(heap),"HeapDestroy failed\n"); +} + +/* The following functions don't have tests, because either I don't know how + to test them, or they are WinNT only, or require multiple threads. + Since the last two issues shouldn't really stop the tests from being + written, assume for now that it is all due to the first case + GlobalFlags + GlobalMemoryStatus + GlobalMemoryStatusEx +*/ +/* In addition, these features aren't being tested + GMEM_DISCADABLE + GMEM_NOCOMPACT +*/ +static void test_Global(void) +{ + ULONG memchunk; + HGLOBAL mem1,mem2,mem2a,mem2b; + UCHAR *mem2ptr; + UINT error,i; + memchunk=100000; + + SetLastError(NO_ERROR); +/* Check that a normal alloc works */ + mem1=GlobalAlloc(0,memchunk); + ok(mem1!=NULL,"GlobalAlloc failed\n"); + if(mem1) { + ok(GlobalSize(mem1)>=memchunk, "GlobalAlloc should return a big enough memory block\n"); + } + +/* Check that a 'zeroing' alloc works */ + mem2=GlobalAlloc(GMEM_ZEROINIT,memchunk); + ok(mem2!=NULL,"GlobalAlloc failed: error=%ld\n",GetLastError()); + if(mem2) { + ok(GlobalSize(mem2)>=memchunk,"GlobalAlloc should return a big enough memory block\n"); + mem2ptr=GlobalLock(mem2); + ok(mem2ptr==mem2,"GlobalLock should have returned the same memory as was allocated\n"); + if(mem2ptr) { + error=0; + for(i=0;i=2*memchunk,"GlobalReAlloc failed\n"); + mem2ptr=GlobalLock(mem2a); + ok(mem2ptr!=NULL,"GlobalLock Failed\n"); + if(mem2ptr) { + error=0; + for(i=0;i=memchunk, "LocalAlloc should return a big enough memory block\n"); + } + +/* Check that a 'zeroing' and lock alloc works */ + mem2=LocalAlloc(LMEM_ZEROINIT|LMEM_MOVEABLE,memchunk); + ok(mem2!=NULL,"LocalAlloc failed: error=%ld\n",GetLastError()); + if(mem2) { + ok(LocalSize(mem2)>=memchunk,"LocalAlloc should return a big enough memory block\n"); + mem2ptr=LocalLock(mem2); + ok(mem2ptr!=NULL,"LocalLock: error=%ld\n",GetLastError()); + if(mem2ptr) { + error=0; + for(i=0;i=2*memchunk,"LocalReAlloc failed\n"); + mem2ptr=LocalLock(mem2a); + ok(mem2ptr!=NULL,"LocalLock Failed\n"); + if(mem2ptr) { + error=0; + for(i=0;i0,"GetSystemInfo should return a valid page size\n"); + +/* Choose a reasonable allocation size */ + memchunk=10*sysInfo.dwPageSize; + +/* Check that a normal alloc works */ + mem1=VirtualAlloc(NULL,memchunk,MEM_COMMIT,PAGE_READWRITE); + ok(mem1!=NULL,"VirtualAlloc failed\n"); + if(mem1) { +/* check that memory is initialized to 0 */ + error=0; + for(i=0;i +#include + +#include "wine/test.h" +#include "windef.h" +#include "winbase.h" +#include "winerror.h" + +static const WCHAR foobarW[] = {'f','o','o','b','a','r',0}; +static const WCHAR FOOBARW[] = {'F','O','O','B','A','R',0}; +static const WCHAR _foobarW[] = {'_','f','o','o','b','a','r',0}; + +static BOOL unicode_OS; + +static void test_add_atom(void) +{ + ATOM atom, w_atom; + int i; + + SetLastError( 0xdeadbeef ); + atom = GlobalAddAtomA( "foobar" ); + ok( atom >= 0xc000, "bad atom id %x\n", atom ); + ok( GetLastError() == 0xdeadbeef, "GlobalAddAtomA set last error\n" ); + + /* Verify that it can be found (or not) appropriately */ + ok( GlobalFindAtomA( "foobar" ) == atom, "could not find atom foobar\n" ); + ok( GlobalFindAtomA( "FOOBAR" ) == atom, "could not find atom FOOBAR\n" ); + ok( !GlobalFindAtomA( "_foobar" ), "found _foobar\n" ); + + /* Add the same atom, specifying string as unicode; should + * find the first one, not add a new one */ + SetLastError( 0xdeadbeef ); + w_atom = GlobalAddAtomW( foobarW ); + if (w_atom && GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) + unicode_OS = TRUE; + else + trace("WARNING: Unicode atom APIs are not supported on this platform\n"); + + if (unicode_OS) + { + ok( w_atom == atom, "Unicode atom does not match ASCII\n" ); + ok( GetLastError() == 0xdeadbeef, "GlobalAddAtomW set last error\n" ); + } + + /* Verify that it can be found (or not) appropriately via unicode name */ + if (unicode_OS) + { + ok( GlobalFindAtomW( foobarW ) == atom, "could not find atom foobar\n" ); + ok( GlobalFindAtomW( FOOBARW ) == atom, "could not find atom FOOBAR\n" ); + ok( !GlobalFindAtomW( _foobarW ), "found _foobar\n" ); + } + + /* Test integer atoms + * (0x0001 .. 0xbfff) should be valid; + * (0xc000 .. 0xffff) should be invalid */ + + SetLastError( 0xdeadbeef ); + ok( GlobalAddAtomA(0) == 0 && GetLastError() == 0xdeadbeef, "succeeded to add atom 0\n" ); + if (unicode_OS) + { + SetLastError( 0xdeadbeef ); + ok( GlobalAddAtomW(0) == 0 && GetLastError() == 0xdeadbeef, "succeeded to add atom 0\n" ); + } + + SetLastError( 0xdeadbeef ); + for (i = 1; i <= 0xbfff; i++) + { + SetLastError( 0xdeadbeef ); + ok( GlobalAddAtomA((LPCSTR)i) == i && GetLastError() == 0xdeadbeef, + "failed to add atom %x\n", i ); + if (unicode_OS) + { + SetLastError( 0xdeadbeef ); + ok( GlobalAddAtomW((LPCWSTR)i) == i && GetLastError() == 0xdeadbeef, + "failed to add atom %x\n", i ); + } + } + + for (i = 0xc000; i <= 0xffff; i++) + { + ok( !GlobalAddAtomA((LPCSTR)i), "succeeded adding %x\n", i ); + if (unicode_OS) + ok( !GlobalAddAtomW((LPCWSTR)i), "succeeded adding %x\n", i ); + } +} + +static void test_get_atom_name(void) +{ + char buf[10]; + WCHAR bufW[10]; + int i; + UINT len; + static const WCHAR resultW[] = {'f','o','o','b','a','r',0,'.','.','.'}; + + ATOM atom = GlobalAddAtomA( "foobar" ); + + /* Get the name of the atom we added above */ + memset( buf, '.', sizeof(buf) ); + len = GlobalGetAtomNameA( atom, buf, 10 ); + ok( len == strlen("foobar"), "bad length %d\n", len ); + ok( !memcmp( buf, "foobar\0...", 10 ), "bad buffer contents\n" ); + + /* Repeat, unicode-style */ + if (unicode_OS) + { + for (i = 0; i < 10; i++) bufW[i] = '.'; + SetLastError( 0xdeadbeef ); + len = GlobalGetAtomNameW( atom, bufW, 10 ); + ok( len && GetLastError() == 0xdeadbeef, "GlobalGetAtomNameW failed\n" ); + ok( len == lstrlenW(foobarW), "bad length %d\n", len ); + ok( !memcmp( bufW, resultW, 10*sizeof(WCHAR) ), "bad buffer contents\n" ); + } + + /* Check error code returns */ + memset(buf, '.', 10); + ok( !GlobalGetAtomNameA( atom, buf, 0 ), "succeeded\n" ); + ok( !memcmp( buf, "..........", 10 ), "should not touch buffer\n" ); + + if (unicode_OS) + { + static const WCHAR sampleW[10] = {'.','.','.','.','.','.','.','.','.','.'}; + + for (i = 0; i < 10; i++) bufW[i] = '.'; + ok( !GlobalGetAtomNameW( atom, bufW, 0 ), "succeeded\n" ); + ok( !memcmp( bufW, sampleW, 10 * sizeof(WCHAR) ), "should not touch buffer\n" ); + } + + /* Test integer atoms */ + for (i = 0; i <= 0xbfff; i++) + { + memset( buf, 'a', 10 ); + len = GlobalGetAtomNameA( (ATOM)i, buf, 10 ); + if (i) + { + char res[20]; + ok( (len > 1) && (len < 7), "bad length %d\n", len ); + sprintf( res, "#%d", i ); + memset( res + strlen(res) + 1, 'a', 10 ); + ok( !memcmp( res, buf, 10 ), "bad buffer contents %s\n", buf ); + } + else + ok( !len, "bad length %d\n", len ); + } +} + +static void test_error_handling(void) +{ + char buffer[260]; + WCHAR bufferW[260]; + int i; + + memset( buffer, 'a', 256 ); + buffer[256] = 0; + ok( !GlobalAddAtomA(buffer), "add succeeded\n" ); + ok( !GlobalFindAtomA(buffer), "find succeeded\n" ); + + if (unicode_OS) + { + for (i = 0; i < 256; i++) bufferW[i] = 'b'; + bufferW[256] = 0; + ok( !GlobalAddAtomW(bufferW), "add succeeded\n" ); + ok( !GlobalFindAtomW(bufferW), "find succeeded\n" ); + } +} + +START_TEST(atom) +{ + test_add_atom(); + test_get_atom_name(); + test_error_handling(); +} diff --git a/reactos/apps/tests/kernel32/change.c b/reactos/apps/tests/kernel32/change.c new file mode 100644 index 00000000000..88353f5538e --- /dev/null +++ b/reactos/apps/tests/kernel32/change.c @@ -0,0 +1,237 @@ +/* + * Tests for file change notification functions + * + * Copyright (c) 2004 Hans Leidekker + * + * 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: - security attribute changes + * - compound filter and multiple notifications + * - subtree notifications + * - non-documented flags FILE_NOTIFY_CHANGE_LAST_ACCESS and + * FILE_NOTIFY_CHANGE_CREATION + */ + +#include +#include + +#include "wine/test.h" +#include +#include + +static DWORD CALLBACK NotificationThread(LPVOID arg) +{ + HANDLE change = (HANDLE) arg; + BOOL ret = FALSE; + DWORD status; + + status = WaitForSingleObject(change, 100); + + if (status == WAIT_OBJECT_0 ) { + ret = FindNextChangeNotification(change); + } + + ok(FindCloseChangeNotification(change), "FindCloseChangeNotification error: %ld\n", + GetLastError()); + + ExitThread((DWORD)ret); +} + +static HANDLE StartNotificationThread(LPCSTR path, BOOL subtree, DWORD flags) +{ + HANDLE change, thread; + DWORD threadId; + + change = FindFirstChangeNotificationA(path, subtree, flags); + ok(change != INVALID_HANDLE_VALUE, "FindFirstChangeNotification error: %ld\n", GetLastError()); + + thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)NotificationThread, (LPVOID)change, + 0, &threadId); + ok(thread != INVALID_HANDLE_VALUE, "CreateThread error: %ld\n", GetLastError()); + + return thread; +} + +static DWORD FinishNotificationThread(HANDLE thread) +{ + DWORD status, exitcode; + + status = WaitForSingleObject(thread, 5000); + ok(status == WAIT_OBJECT_0, "WaitForSingleObject status %ld error %ld\n", status, GetLastError()); + + ok(GetExitCodeThread(thread, &exitcode), "Could not retrieve thread exit code\n"); + + return exitcode; +} + +static void test_FindFirstChangeNotification(void) +{ + HANDLE change, file, thread; + DWORD attributes, count; + BOOL ret; + + char workdir[MAX_PATH], dirname1[MAX_PATH], dirname2[MAX_PATH]; + char filename1[MAX_PATH], filename2[MAX_PATH]; + static const char prefix[] = "FCN"; + char buffer[2048]; + + /* pathetic checks */ + + change = FindFirstChangeNotificationA("not-a-file", FALSE, FILE_NOTIFY_CHANGE_FILE_NAME); + ok(change == INVALID_HANDLE_VALUE && GetLastError() == ERROR_FILE_NOT_FOUND, + "FindFirstChangeNotification error: %ld\n", GetLastError()); + + if (0) /* This documents win2k behavior. It crashes on win98. */ + { + change = FindFirstChangeNotificationA(NULL, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME); + ok(change == NULL && GetLastError() == ERROR_PATH_NOT_FOUND, + "FindFirstChangeNotification error: %ld\n", GetLastError()); + } + + ret = FindNextChangeNotification(NULL); + ok(!ret && GetLastError() == ERROR_INVALID_HANDLE, "FindNextChangeNotification error: %ld\n", + GetLastError()); + + ret = FindCloseChangeNotification(NULL); + ok(!ret && GetLastError() == ERROR_INVALID_HANDLE, "FindCloseChangeNotification error: %ld\n", + GetLastError()); + + ret = GetTempPathA(MAX_PATH, workdir); + ok(ret, "GetTempPathA error: %ld\n", GetLastError()); + + lstrcatA(workdir, "testFileChangeNotification"); + + ret = CreateDirectoryA(workdir, NULL); + ok(ret, "CreateDirectoryA error: %ld\n", GetLastError()); + + ret = GetTempFileNameA(workdir, prefix, 0, filename1); + ok(ret, "GetTempFileNameA error: %ld\n", GetLastError()); + + file = CreateFileA(filename1, GENERIC_WRITE|GENERIC_READ, 0, NULL, CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL, 0); + ok(file != INVALID_HANDLE_VALUE, "CreateFileA error: %ld\n", GetLastError()); + ok(CloseHandle(file), "CloseHandle error: %ld\n", GetLastError()); + + /* Try to register notification for a file. win98 and win2k behave differently here */ + change = FindFirstChangeNotificationA(filename1, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME); + ok(change == INVALID_HANDLE_VALUE && (GetLastError() == ERROR_DIRECTORY || + GetLastError() == ERROR_FILE_NOT_FOUND), + "FindFirstChangeNotification error: %ld\n", GetLastError()); + + lstrcpyA(dirname1, filename1); + lstrcatA(dirname1, "dir"); + + ret = CreateDirectoryA(dirname1, NULL); + ok(ret, "CreateDirectoryA error: %ld\n", GetLastError()); + + /* What if we remove the directory we registered notification for? */ + thread = StartNotificationThread(dirname1, FALSE, FILE_NOTIFY_CHANGE_DIR_NAME); + ret = RemoveDirectoryA(dirname1); + ok(ret, "RemoveDirectoryA error: %ld\n", GetLastError()); + + /* win98 and win2k behave differently here */ + ret = FinishNotificationThread(thread); + ok(ret || !ret, "You'll never read this\n"); + + /* functional checks */ + + /* Create a directory */ + thread = StartNotificationThread(workdir, FALSE, FILE_NOTIFY_CHANGE_DIR_NAME); + ret = CreateDirectoryA(dirname1, NULL); + ok(ret, "CreateDirectoryA error: %ld\n", GetLastError()); + ok(FinishNotificationThread(thread), "Missed notification\n"); + + lstrcpyA(dirname2, dirname1); + lstrcatA(dirname2, "new"); + + /* Rename a directory */ + thread = StartNotificationThread(workdir, FALSE, FILE_NOTIFY_CHANGE_DIR_NAME); + ret = MoveFileA(dirname1, dirname2); + ok(ret, "MoveFileA error: %ld\n", GetLastError()); + ok(FinishNotificationThread(thread), "Missed notification\n"); + + /* Delete a directory */ + thread = StartNotificationThread(workdir, FALSE, FILE_NOTIFY_CHANGE_DIR_NAME); + ret = RemoveDirectoryA(dirname2); + ok(ret, "RemoveDirectoryA error: %ld\n", GetLastError()); + ok(FinishNotificationThread(thread), "Missed notification\n"); + + lstrcpyA(filename2, filename1); + lstrcatA(filename2, "new"); + + /* Rename a file */ + thread = StartNotificationThread(workdir, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME); + ret = MoveFileA(filename1, filename2); + ok(ret, "MoveFileA error: %ld\n", GetLastError()); + ok(FinishNotificationThread(thread), "Missed notification\n"); + + /* Delete a file */ + thread = StartNotificationThread(workdir, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME); + ret = DeleteFileA(filename2); + ok(ret, "DeleteFileA error: %ld\n", GetLastError()); + ok(FinishNotificationThread(thread), "Missed notification\n"); + + /* Create a file */ + thread = StartNotificationThread(workdir, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME); + file = CreateFileA(filename2, GENERIC_WRITE|GENERIC_READ, 0, NULL, CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL, 0); + ok(file != INVALID_HANDLE_VALUE, "CreateFileA error: %ld\n", GetLastError()); + ok(CloseHandle(file), "CloseHandle error: %ld\n", GetLastError()); + ok(FinishNotificationThread(thread), "Missed notification\n"); + + attributes = GetFileAttributesA(filename2); + ok(attributes != INVALID_FILE_ATTRIBUTES, "GetFileAttributesA error: %ld\n", GetLastError()); + attributes &= FILE_ATTRIBUTE_READONLY; + + /* Change file attributes */ + thread = StartNotificationThread(workdir, FALSE, FILE_NOTIFY_CHANGE_ATTRIBUTES); + ret = SetFileAttributesA(filename2, attributes); + ok(ret, "SetFileAttributesA error: %ld\n", GetLastError()); + ok(FinishNotificationThread(thread), "Missed notification\n"); + + /* Change last write time by writing to a file */ + thread = StartNotificationThread(workdir, FALSE, FILE_NOTIFY_CHANGE_LAST_WRITE); + file = CreateFileA(filename2, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL, 0); + ok(file != INVALID_HANDLE_VALUE, "CreateFileA error: %ld\n", GetLastError()); + ret = WriteFile(file, buffer, sizeof(buffer), &count, NULL); + ok(ret && count == sizeof(buffer), "WriteFile error: %ld\n", GetLastError()); + ok(CloseHandle(file), "CloseHandle error: %ld\n", GetLastError()); + ok(FinishNotificationThread(thread), "Missed notification\n"); + + /* Change file size by truncating a file */ + thread = StartNotificationThread(workdir, FALSE, FILE_NOTIFY_CHANGE_SIZE); + file = CreateFileA(filename2, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL, 0); + ok(file != INVALID_HANDLE_VALUE, "CreateFileA error: %ld\n", GetLastError()); + ret = WriteFile(file, buffer, sizeof(buffer) / 2, &count, NULL); + ok(ret && count == sizeof(buffer) / 2, "WriteFileA error: %ld\n", GetLastError()); + ok(CloseHandle(file), "CloseHandle error: %ld\n", GetLastError()); + ok(FinishNotificationThread(thread), "Missed notification\n"); + + /* clean up */ + + ret = DeleteFileA(filename2); + ok(ret, "DeleteFileA error: %ld\n", GetLastError()); + + ret = RemoveDirectoryA(workdir); + ok(ret, "RemoveDirectoryA error: %ld\n", GetLastError()); +} + +START_TEST(change) +{ + test_FindFirstChangeNotification(); +} diff --git a/reactos/apps/tests/kernel32/codepage.c b/reactos/apps/tests/kernel32/codepage.c new file mode 100644 index 00000000000..038b428f9bd --- /dev/null +++ b/reactos/apps/tests/kernel32/codepage.c @@ -0,0 +1,62 @@ +/* + * Unit tests for code page to/from unicode translations + * + * Copyright (c) 2002 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 + */ + +#include + +#include "wine/test.h" +#include "windef.h" +#include "winbase.h" +#include "winnls.h" + +/* lstrcmpW is not supported on Win9x! */ +static int mylstrcmpW(const WCHAR* str1, const WCHAR* str2) +{ + while (*str1 && *str1==*str2) { + str1++; + str2++; + } + return *str1-*str2; +} + +static void test_negative_source_length(void) +{ + int len; + char buf[10]; + WCHAR bufW[10]; + static const WCHAR foobarW[] = {'f','o','o','b','a','r',0}; + + /* Test, whether any negative source length works as strlen() + 1 */ + SetLastError( 0xdeadbeef ); + memset(buf,'x',sizeof(buf)); + len = WideCharToMultiByte(CP_ACP, 0, foobarW, -2002, buf, 10, NULL, NULL); + ok(len == 7 && !lstrcmpA(buf, "foobar") && GetLastError() == 0xdeadbeef, + "WideCharToMultiByte(-2002): len=%d error=%ld\n",len,GetLastError()); + + SetLastError( 0xdeadbeef ); + memset(bufW,'x',sizeof(bufW)); + len = MultiByteToWideChar(CP_ACP, 0, "foobar", -2002, bufW, 10); + ok(len == 7 && !mylstrcmpW(bufW, foobarW) && GetLastError() == 0xdeadbeef, + "MultiByteToWideChar(-2002): len=%d error=%ld\n",len,GetLastError()); +} + +START_TEST(codepage) +{ + test_negative_source_length(); +} diff --git a/reactos/apps/tests/kernel32/comm.c b/reactos/apps/tests/kernel32/comm.c new file mode 100644 index 00000000000..166bfb39061 --- /dev/null +++ b/reactos/apps/tests/kernel32/comm.c @@ -0,0 +1,640 @@ +/* Unit test suite for comm functions + * + * Copyright 2003 Kevin Groeneveld + * + * 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 "wine/test.h" +#include "winbase.h" +#include "winnls.h" + +typedef struct +{ + char string[100]; + BOOL result; + BOOL old_style; + DCB dcb1, dcb2; + COMMTIMEOUTS timeouts1, timeouts2; +} TEST; + +static TEST test[] = +{ + { + "baud=9600 parity=e data=5 stop=1 xon=on odsr=off octs=off dtr=on rts=on idsr=on", + TRUE, FALSE, + { 0x00000000, 0x00002580, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x05, 0x02, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0x00002580, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x05, 0x02, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "baud=0 parity=M data=6 stop=1.5 xon=off odsr=on octs=ON dtr=off rts=off idsr=OFF", + TRUE, FALSE, + { 0x00000000, 0x00000000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x06, 0x03, 0x01, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0x00000000, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x06, 0x03, 0x01, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "BAUD=4000000000 parity=n data=7 stop=2 to=off", + TRUE, FALSE, + { 0x00000000, 0xee6b2800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x00, 0x02, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0xee6b2800, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x00, 0x02, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } + }, + { + "Baud=115200 Parity=O Data=8 To=On", + TRUE, FALSE, + { 0x00000000, 0x0001c200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x01, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0x0001c200, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x01, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000EA60 }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000EA60 } + }, + { + "PaRiTy=s Data=7 DTR=on", + TRUE, FALSE, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x04, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x04, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "data=4", + FALSE, FALSE, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "data=9", + FALSE, FALSE, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "parity=no", + FALSE, FALSE, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "stop=0", + FALSE, FALSE, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "stop=1.501", + FALSE, FALSE, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "stop=3", + FALSE, FALSE, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "to=foobar", + FALSE, FALSE, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + " baud=9600", + FALSE, FALSE, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "baud= 9600", + FALSE, FALSE, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "baud=9600,data=8", + FALSE, FALSE, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "11,n,8,1", + TRUE, TRUE, + { 0x00000000, 0x0000006e, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0x0000006e, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x00, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "30 ,E, 5,1.5", + TRUE, TRUE, + { 0x00000000, 0x0000012c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x05, 0x02, 0x01, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0x0000012c, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x05, 0x02, 0x01, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "60, m, 6, 2 ", + TRUE, TRUE, + { 0x00000000, 0x00000258, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x06, 0x03, 0x02, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0x00000258, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x06, 0x03, 0x02, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "12 , o , 7 , 1", + TRUE, TRUE, + { 0x00000000, 0x000004b0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x01, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0x000004b0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x01, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "24,s,8,1.5", + TRUE, TRUE, + { 0x00000000, 0x00000960, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x04, 0x01, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0x00000960, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x04, 0x01, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "48,n,8,1,p", + TRUE, TRUE, + { 0x00000000, 0x000012c0, 0, 0, 1, 1, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0x000012c0, 1, 1, 1, 1, 2, 1, 1, 0, 0, 1, 1, 2, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x00, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "96,N,8,1 , x ", + TRUE, TRUE, + { 0x00000000, 0x00002580, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0x00002580, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x00, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "19, e, 7, 1, x", + TRUE, TRUE, + { 0x00000000, 0x00004b00, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x02, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0x00004b00, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x02, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "0,M,7,1,P", + TRUE, TRUE, + { 0x00000000, 0x00000000, 0, 0, 1, 1, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x03, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0x00000000, 1, 1, 1, 1, 2, 1, 1, 0, 0, 1, 1, 2, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x03, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "4000000000,O,7,1.5,X", + TRUE, TRUE, + { 0x00000000, 0xee6b2800, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x01, 0x01, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0xee6b2800, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x01, 0x01, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "96,N,8,1 to=on", + FALSE, TRUE, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "96,NO,8,1", + FALSE, TRUE, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "96,N,4,1", + FALSE, TRUE, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "96,N,9,1", + FALSE, TRUE, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "96,N,8,0", + FALSE, TRUE, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "96,N,8,3", + FALSE, TRUE, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "96,N,8,1,K", + FALSE, TRUE, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "COM0:baud=115200", + FALSE, FALSE, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "COMx:baud=38400 data=8", + TRUE, FALSE, + { 0x00000000, 0x00009600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0x00009600, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0xff, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "COMx :to=on stop=1.5", + TRUE, FALSE, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x01, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0x01, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000EA60 }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000EA60 } + }, + { + "COMx: baud=12345 data=7", + TRUE, FALSE, + { 0x00000000, 0x00003039, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0x00003039, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0xff, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "COMx : xon=on odsr=off", + TRUE, FALSE, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 0, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "COM0:9600,N,8,1", + FALSE, TRUE, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "COMx:9600,N,8,1", + TRUE, TRUE, + { 0x00000000, 0x00002580, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0x00002580, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x00, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "COMx: 11,E,7,2", + TRUE, TRUE, + { 0x00000000, 0x0000006e, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x02, 0x02, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0x0000006e, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x02, 0x02, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "COMx :19,M,5,1", + TRUE, TRUE, + { 0x00000000, 0x00004b00, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x05, 0x03, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0x00004b00, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x05, 0x03, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, + { + "COMx : 57600,S,6,2,x", + TRUE, TRUE, + { 0x00000000, 0x0000e100, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x06, 0x04, 0x02, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, + { 0xffffffff, 0x0000e100, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x06, 0x04, 0x02, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } + }, +}; + +#define TEST_COUNT (sizeof(test) / sizeof(TEST)) + +/* This function can be useful if you are modifiying the test cases and want to + output the contents of a DCB structure. */ +/*static print_dcb(DCB *pdcb) +{ + printf("0x%08x, 0x%08x, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, 0x%05x, 0x%04x, 0x%04x, 0x%04x, 0x%02x, 0x%02x, 0x%02x, (char)0x%02x, (char)0x%02x, (char)0x%02x, (char)0x%02x, (char)0x%02x, 0x%04x\n", + pdcb->DCBlength, + pdcb->BaudRate, + pdcb->fBinary, + pdcb->fParity, + pdcb->fOutxCtsFlow, + pdcb->fOutxDsrFlow, + pdcb->fDtrControl, + pdcb->fDsrSensitivity, + pdcb->fTXContinueOnXoff, + pdcb->fOutX, + pdcb->fInX, + pdcb->fErrorChar, + pdcb->fNull, + pdcb->fRtsControl, + pdcb->fAbortOnError, + pdcb->fDummy2, + pdcb->wReserved, + pdcb->XonLim, + pdcb->XoffLim, + pdcb->ByteSize, + pdcb->Parity, + pdcb->StopBits, + pdcb->XonChar & 0xff, + pdcb->XoffChar & 0xff, + pdcb->ErrorChar & 0xff, + pdcb->EofChar & 0xff, + pdcb->EvtChar & 0xff, + pdcb->wReserved1 & 0xffff ); +} */ + +static void check_result(char *function, TEST *ptest, int initial_value, BOOL result) +{ + DWORD LastError = GetLastError(); + DWORD CorrectError = (ptest->result ? 0xdeadbeef : ERROR_INVALID_PARAMETER); + + ok(LastError == CorrectError, "%s(\"%s\"), 0x%02x: GetLastError() returned 0x%08lx, should be 0x%08lx\n", function, ptest->string, initial_value, LastError, CorrectError); + ok(result == ptest->result, "%s(\"%s\"), 0x%02x: return value should be %s\n", function, ptest->string, initial_value, ptest->result ? "TRUE" : "FALSE"); +} + +#define check_dcb_member(a,b) ok(pdcb1->a == pdcb2->a, "%s(\"%s\"), 0x%02x: "#a" is "b", should be "b"\n", function, ptest->string, initial_value, pdcb1->a, pdcb2->a) +#define check_dcb_member2(a,c,b) if(pdcb2->a == c) { check_dcb_member(a,b); } else { ok(pdcb1->a == pdcb2->a || pdcb1->a == c, "%s(\"%s\"), 0x%02x: "#a" is "b", should be "b" or "b"\n", function, ptest->string, initial_value, pdcb1->a, pdcb2->a, c); } + +static void check_dcb(char *function, TEST *ptest, int initial_value, DCB *pdcb1, DCB *pdcb2) +{ + /* DCBlength is a special case since Win 9x sets it but NT does not. + We will accept either as correct. */ + check_dcb_member2(DCBlength, (DWORD)sizeof(DCB), "%lu"); + + /* For old style control strings Win 9x does not set the next five members, NT does. */ + if(ptest->old_style && ptest->result) + { + check_dcb_member2(fOutxCtsFlow, ((unsigned int)initial_value & 1), "%u"); + check_dcb_member2(fDtrControl, ((unsigned int)initial_value & 3), "%u"); + check_dcb_member2(fOutX, ((unsigned int)initial_value & 1), "%u"); + check_dcb_member2(fInX, ((unsigned)initial_value & 1), "%u"); + check_dcb_member2(fRtsControl, ((unsigned)initial_value & 3), "%u"); + } + else + { + check_dcb_member(fOutxCtsFlow, "%u"); + check_dcb_member(fDtrControl, "%u"); + check_dcb_member(fOutX, "%u"); + check_dcb_member(fInX, "%u"); + check_dcb_member(fRtsControl, "%u"); + } + + if(ptest->result) + { + /* For the idsr=xxx parameter, NT sets fDsrSensitivity, 9x sets + fOutxDsrFlow. */ + if(!ptest->old_style) + { + check_dcb_member2(fOutxDsrFlow, pdcb2->fDsrSensitivity, "%u"); + check_dcb_member2(fDsrSensitivity, pdcb2->fOutxDsrFlow, "%u"); + } + else + { + /* For old style control strings Win 9x does not set the + fOutxDsrFlow member, NT does. */ + check_dcb_member2(fOutxDsrFlow, ((unsigned int)initial_value & 1), "%u"); + check_dcb_member(fDsrSensitivity, "%u"); + } + } + else + { + check_dcb_member(fOutxDsrFlow, "%u"); + check_dcb_member(fDsrSensitivity, "%u"); + } + + /* Check the result of the DCB members. */ + check_dcb_member(BaudRate, "%lu"); + check_dcb_member(fBinary, "%u"); + check_dcb_member(fParity, "%u"); + check_dcb_member(fTXContinueOnXoff, "%u"); + check_dcb_member(fErrorChar, "%u"); + check_dcb_member(fNull, "%u"); + check_dcb_member(fAbortOnError, "%u"); + check_dcb_member(fDummy2, "%u"); + check_dcb_member(wReserved, "%u"); + check_dcb_member(XonLim, "%u"); + check_dcb_member(XoffLim, "%u"); + check_dcb_member(ByteSize, "%u"); + check_dcb_member(Parity, "%u"); + check_dcb_member(StopBits, "%u"); + check_dcb_member(XonChar, "%d"); + check_dcb_member(XoffChar, "%d"); + check_dcb_member(ErrorChar, "%d"); + check_dcb_member(EofChar, "%d"); + check_dcb_member(EvtChar, "%d"); + check_dcb_member(wReserved1, "%u"); +} + +#define check_timeouts_member(a) ok(ptimeouts1->a == ptimeouts2->a, "%s(\"%s\"), 0x%02x: "#a" is %lu, should be %lu\n", function, ptest->string, initial_value, ptimeouts1->a, ptimeouts2->a); + +static void check_timeouts(char *function, TEST *ptest, int initial_value, COMMTIMEOUTS *ptimeouts1, COMMTIMEOUTS *ptimeouts2) +{ + check_timeouts_member(ReadIntervalTimeout); + check_timeouts_member(ReadTotalTimeoutMultiplier); + check_timeouts_member(ReadTotalTimeoutConstant); + check_timeouts_member(WriteTotalTimeoutMultiplier); + check_timeouts_member(WriteTotalTimeoutConstant); +} + +static void test_BuildCommDCBA(TEST *ptest, int initial_value, DCB *pexpected_dcb) +{ + BOOL result; + DCB dcb; + + /* set initial conditions */ + memset(&dcb, initial_value, sizeof(DCB)); + SetLastError(0xdeadbeef); + + result = BuildCommDCBA(ptest->string, &dcb); + + /* check results */ + check_result("BuildCommDCBA", ptest, initial_value, result); + check_dcb("BuildCommDCBA", ptest, initial_value, &dcb, pexpected_dcb); +} + +static void test_BuildCommDCBAndTimeoutsA(TEST *ptest, int initial_value, DCB *pexpected_dcb, COMMTIMEOUTS *pexpected_timeouts) +{ + BOOL result; + DCB dcb; + COMMTIMEOUTS timeouts; + + /* set initial conditions */ + memset(&dcb, initial_value, sizeof(DCB)); + memset(&timeouts, initial_value, sizeof(COMMTIMEOUTS)); + SetLastError(0xdeadbeef); + + result = BuildCommDCBAndTimeoutsA(ptest->string, &dcb, &timeouts); + + /* check results */ + check_result("BuildCommDCBAndTimeoutsA", ptest, initial_value, result); + check_dcb("BuildCommDCBAndTimeoutsA", ptest, initial_value, &dcb, pexpected_dcb); + check_timeouts("BuildCommDCBAndTimeoutsA", ptest, initial_value, &timeouts, pexpected_timeouts); +} + +static void test_BuildCommDCBW(TEST *ptest, int initial_value, DCB *pexpected_dcb) +{ + BOOL result; + DCB dcb; + WCHAR wide_string[sizeof(ptest->string)]; + + MultiByteToWideChar(CP_ACP, 0, ptest->string, -1, wide_string, sizeof(wide_string) / sizeof(WCHAR)); + + /* set initial conditions */ + memset(&dcb, initial_value, sizeof(DCB)); + SetLastError(0xdeadbeef); + + result = BuildCommDCBW(wide_string, &dcb); + + if(GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + return; + + /* check results */ + check_result("BuildCommDCBW", ptest, initial_value, result); + check_dcb("BuildCommDCBW", ptest, initial_value, &dcb, pexpected_dcb); +} + +static void test_BuildCommDCBAndTimeoutsW(TEST *ptest, int initial_value, DCB *pexpected_dcb, COMMTIMEOUTS *pexpected_timeouts) +{ + BOOL result; + DCB dcb; + COMMTIMEOUTS timeouts; + WCHAR wide_string[sizeof(ptest->string)]; + + MultiByteToWideChar(CP_ACP, 0, ptest->string, -1, wide_string, sizeof(wide_string) / sizeof(WCHAR)); + + /* set initial conditions */ + memset(&dcb, initial_value, sizeof(DCB)); + memset(&timeouts, initial_value, sizeof(COMMTIMEOUTS)); + SetLastError(0xdeadbeef); + + result = BuildCommDCBAndTimeoutsW(wide_string, &dcb, &timeouts); + + if(GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + return; + + /* check results */ + check_result("BuildCommDCBAndTimeoutsA", ptest, initial_value, result); + check_dcb("BuildCommDCBAndTimeoutsA", ptest, initial_value, &dcb, pexpected_dcb); + check_timeouts("BuildCommDCBAndTimeoutsA", ptest, initial_value, &timeouts, pexpected_timeouts); +} + +static void test_BuildCommDCB(void) +{ + char port_name[] = "COMx"; + char port = 0; + int i; + char *ptr; + + /* Some of these tests require a valid COM port. This loop will try to find + a valid port. */ + for(port_name[3] = '1'; port_name[3] <= '9'; port_name[3]++) + { + COMMCONFIG commconfig; + DWORD size = sizeof(COMMCONFIG); + + if(GetDefaultCommConfig(port_name, &commconfig, &size)) + { + port = port_name[3]; + break; + } + } + + if(!port) + trace("Could not find a valid COM port. Some tests will be skipped.\n"); + + for(i = 0; i < TEST_COUNT; i++) + { + /* Check if this test case needs a valid COM port. */ + ptr = strstr(test[i].string, "COMx"); + + /* If required, substitute valid port number into device control string. */ + if(ptr) + { + if(port) + ptr[3] = port; + else + continue; + } + + test_BuildCommDCBA(&test[i], 0x00, &test[i].dcb1); + test_BuildCommDCBA(&test[i], 0xff, &test[i].dcb2); + test_BuildCommDCBAndTimeoutsA(&test[i], 0x00, &test[i].dcb1, &test[i].timeouts1); + test_BuildCommDCBAndTimeoutsA(&test[i], 0xff, &test[i].dcb2, &test[i].timeouts2); + + test_BuildCommDCBW(&test[i], 0x00, &test[i].dcb1); + test_BuildCommDCBW(&test[i], 0xff, &test[i].dcb2); + test_BuildCommDCBAndTimeoutsW(&test[i], 0x00, &test[i].dcb1, &test[i].timeouts1); + test_BuildCommDCBAndTimeoutsW(&test[i], 0xff, &test[i].dcb2, &test[i].timeouts2); + } +} + +START_TEST(comm) +{ + test_BuildCommDCB(); +} diff --git a/reactos/apps/tests/kernel32/console.c b/reactos/apps/tests/kernel32/console.c new file mode 100644 index 00000000000..48ab3c110e0 --- /dev/null +++ b/reactos/apps/tests/kernel32/console.c @@ -0,0 +1,584 @@ +/* + * Unit tests for console API + * + * Copyright (c) 2003 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 + */ + +#include "wine/test.h" +#include +#include + +/* DEFAULT_ATTRIB is used for all initial filling of the console. + * all modifications are made with TEST_ATTRIB so that we could check + * what has to be modified or not + */ +#define TEST_ATTRIB (BACKGROUND_BLUE | FOREGROUND_GREEN) +#define DEFAULT_ATTRIB (FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED) +/* when filling the screen with non-blank chars, this macro defines + * what character should be at position 'c' + */ +#define CONTENT(c) ('A' + (((c).Y * 17 + (c).X) % 23)) + +#define okCURSOR(hCon, c) do { \ + CONSOLE_SCREEN_BUFFER_INFO __sbi; \ + BOOL expect = GetConsoleScreenBufferInfo((hCon), &__sbi) && \ + __sbi.dwCursorPosition.X == (c).X && __sbi.dwCursorPosition.Y == (c).Y; \ + ok(expect, "Expected cursor at (%d,%d), got (%d,%d)\n", \ + (c).X, (c).Y, __sbi.dwCursorPosition.X, __sbi.dwCursorPosition.Y); \ +} while (0) + +#define okCHAR(hCon, c, ch, attr) do { \ + char __ch; WORD __attr; DWORD __len; BOOL expect; \ + expect = ReadConsoleOutputCharacter((hCon), &__ch, 1, (c), &__len) == 1 && __len == 1 && __ch == (ch); \ + ok(expect, "At (%d,%d): expecting char '%c'/%02x got '%c'/%02x\n", (c).X, (c).Y, (ch), (ch), __ch, __ch); \ + expect = ReadConsoleOutputAttribute((hCon), &__attr, 1, (c), &__len) == 1 && __len == 1 && __attr == (attr); \ + ok(expect, "At (%d,%d): expecting attr %04x got %04x\n", (c).X, (c).Y, (attr), __attr); \ +} while (0) + +/* FIXME: this could be optimized on a speed point of view */ +static void resetContent(HANDLE hCon, COORD sbSize, BOOL content) +{ + COORD c; + WORD attr = DEFAULT_ATTRIB; + char ch; + DWORD len; + + for (c.X = 0; c.X < sbSize.X; c.X++) + { + for (c.Y = 0; c.Y < sbSize.Y; c.Y++) + { + ch = (content) ? CONTENT(c) : ' '; + WriteConsoleOutputAttribute(hCon, &attr, 1, c, &len); + WriteConsoleOutputCharacterA(hCon, &ch, 1, c, &len); + } + } +} + +static void testCursor(HANDLE hCon, COORD sbSize) +{ + COORD c; + + c.X = c.Y = 0; + ok(SetConsoleCursorPosition(0, c) == 0, "No handle\n"); + ok(GetLastError() == ERROR_INVALID_HANDLE, "GetLastError: expecting %u got %lu\n", + ERROR_INVALID_HANDLE, GetLastError()); + + c.X = c.Y = 0; + ok(SetConsoleCursorPosition(hCon, c) != 0, "Cursor in upper-left\n"); + okCURSOR(hCon, c); + + c.X = sbSize.X - 1; + c.Y = sbSize.Y - 1; + ok(SetConsoleCursorPosition(hCon, c) != 0, "Cursor in lower-right\n"); + okCURSOR(hCon, c); + + c.X = sbSize.X; + c.Y = sbSize.Y - 1; + ok(SetConsoleCursorPosition(hCon, c) == 0, "Cursor is outside\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetLastError: expecting %u got %lu\n", + ERROR_INVALID_PARAMETER, GetLastError()); + + c.X = sbSize.X - 1; + c.Y = sbSize.Y; + ok(SetConsoleCursorPosition(hCon, c) == 0, "Cursor is outside\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetLastError: expecting %u got %lu\n", + ERROR_INVALID_PARAMETER, GetLastError()); + + c.X = -1; + c.Y = 0; + ok(SetConsoleCursorPosition(hCon, c) == 0, "Cursor is outside\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetLastError: expecting %u got %lu\n", + ERROR_INVALID_PARAMETER, GetLastError()); + + c.X = 0; + c.Y = -1; + ok(SetConsoleCursorPosition(hCon, c) == 0, "Cursor is outside\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetLastError: expecting %u got %lu\n", + ERROR_INVALID_PARAMETER, GetLastError()); +} + +static void testWriteSimple(HANDLE hCon, COORD sbSize) +{ + COORD c; + DWORD len; + const char* mytest = "abcdefg"; + const int mylen = strlen(mytest); + + /* single line write */ + c.X = c.Y = 0; + ok(SetConsoleCursorPosition(hCon, c) != 0, "Cursor in upper-left\n"); + + ok(WriteConsole(hCon, mytest, mylen, &len, NULL) != 0 && len == mylen, "WriteConsole\n"); + c.Y = 0; + for (c.X = 0; c.X < mylen; c.X++) + { + okCHAR(hCon, c, mytest[c.X], TEST_ATTRIB); + } + + okCURSOR(hCon, c); + okCHAR(hCon, c, ' ', DEFAULT_ATTRIB); +} + +static void testWriteNotWrappedNotProcessed(HANDLE hCon, COORD sbSize) +{ + COORD c; + DWORD len, mode; + const char* mytest = "abcd\nf\tg"; + const int mylen = strlen(mytest); + int p; + + ok(GetConsoleMode(hCon, &mode) && SetConsoleMode(hCon, mode & ~(ENABLE_PROCESSED_OUTPUT|ENABLE_WRAP_AT_EOL_OUTPUT)), + "clearing wrap at EOL & processed output\n"); + + /* write line, wrapping disabled, buffer exceeds sb width */ + c.X = sbSize.X - 3; c.Y = 0; + ok(SetConsoleCursorPosition(hCon, c) != 0, "Cursor in upper-left-3\n"); + + ok(WriteConsole(hCon, mytest, mylen, &len, NULL) != 0 && len == mylen, "WriteConsole\n"); + c.Y = 0; + for (p = mylen - 3; p < mylen; p++) + { + c.X = sbSize.X - 3 + p % 3; + okCHAR(hCon, c, mytest[p], TEST_ATTRIB); + } + + c.X = 0; c.Y = 1; + okCHAR(hCon, c, ' ', DEFAULT_ATTRIB); + + p = sbSize.X - 3 + mylen % 3; + c.X = p; c.Y = 0; + okCURSOR(hCon, c); + + /* write line, wrapping disabled, strings end on end of line */ + c.X = sbSize.X - mylen; c.Y = 0; + ok(SetConsoleCursorPosition(hCon, c) != 0, "Cursor in upper-left-3\n"); + + ok(WriteConsole(hCon, mytest, mylen, &len, NULL) != 0 && len == mylen, "WriteConsole\n"); + c.Y = 0; + for (p = 0; p < mylen; p++) + { + c.X = sbSize.X - mylen + p; + okCHAR(hCon, c, mytest[p], TEST_ATTRIB); + } + + c.X = 0; c.Y = 1; + okCHAR(hCon, c, ' ', DEFAULT_ATTRIB); + + p = sbSize.X - mylen; + c.X = p; c.Y = 0; + okCURSOR(hCon, c); +} + +static void testWriteNotWrappedProcessed(HANDLE hCon, COORD sbSize) +{ + COORD c; + DWORD len, mode; + const char* mytest = "abcd\nf\tg"; + const int mylen = strlen(mytest); + const int mylen2 = strchr(mytest, '\n') - mytest; + int p; + + ok(GetConsoleMode(hCon, &mode) && SetConsoleMode(hCon, (mode | ENABLE_PROCESSED_OUTPUT) & ~ENABLE_WRAP_AT_EOL_OUTPUT), + "clearing wrap at EOL & setting processed output\n"); + + /* write line, wrapping disabled, buffer exceeds sb width */ + c.X = sbSize.X - 5; c.Y = 0; + ok(SetConsoleCursorPosition(hCon, c) != 0, "Cursor in upper-left-5\n"); + + ok(WriteConsole(hCon, mytest, mylen, &len, NULL) != 0 && len == mylen, "WriteConsole\n"); + c.Y = 0; + for (c.X = sbSize.X - 5; c.X < sbSize.X - 1; c.X++) + { + okCHAR(hCon, c, mytest[c.X - sbSize.X + 5], TEST_ATTRIB); + } + okCHAR(hCon, c, ' ', DEFAULT_ATTRIB); + + c.X = 0; c.Y++; + okCHAR(hCon, c, mytest[5], TEST_ATTRIB); + for (c.X = 1; c.X < 8; c.X++) + okCHAR(hCon, c, ' ', TEST_ATTRIB); + okCHAR(hCon, c, mytest[7], TEST_ATTRIB); + c.X++; + okCHAR(hCon, c, ' ', DEFAULT_ATTRIB); + + okCURSOR(hCon, c); + + /* write line, wrapping disabled, strings end on end of line */ + c.X = sbSize.X - 4; c.Y = 0; + ok(SetConsoleCursorPosition(hCon, c) != 0, "Cursor in upper-left-4\n"); + + ok(WriteConsole(hCon, mytest, mylen, &len, NULL) != 0 && len == mylen, "WriteConsole\n"); + c.Y = 0; + for (c.X = sbSize.X - 4; c.X < sbSize.X; c.X++) + { + okCHAR(hCon, c, mytest[c.X - sbSize.X + 4], TEST_ATTRIB); + } + c.X = 0; c.Y++; + okCHAR(hCon, c, mytest[5], TEST_ATTRIB); + for (c.X = 1; c.X < 8; c.X++) + okCHAR(hCon, c, ' ', TEST_ATTRIB); + okCHAR(hCon, c, mytest[7], TEST_ATTRIB); + c.X++; + okCHAR(hCon, c, ' ', DEFAULT_ATTRIB); + + okCURSOR(hCon, c); + + /* write line, wrapping disabled, strings end after end of line */ + c.X = sbSize.X - 3; c.Y = 0; + ok(SetConsoleCursorPosition(hCon, c) != 0, "Cursor in upper-left-4\n"); + + ok(WriteConsole(hCon, mytest, mylen, &len, NULL) != 0 && len == mylen, "WriteConsole\n"); + c.Y = 0; + for (p = mylen2 - 3; p < mylen2; p++) + { + c.X = sbSize.X - 3 + p % 3; + okCHAR(hCon, c, mytest[p], TEST_ATTRIB); + } + c.X = 0; c.Y = 1; + okCHAR(hCon, c, mytest[5], TEST_ATTRIB); + for (c.X = 1; c.X < 8; c.X++) + okCHAR(hCon, c, ' ', TEST_ATTRIB); + okCHAR(hCon, c, mytest[7], TEST_ATTRIB); + c.X++; + okCHAR(hCon, c, ' ', DEFAULT_ATTRIB); + + okCURSOR(hCon, c); +} + +static void testWriteWrappedNotProcessed(HANDLE hCon, COORD sbSize) +{ + COORD c; + DWORD len, mode; + const char* mytest = "abcd\nf\tg"; + const int mylen = strlen(mytest); + int p; + + ok(GetConsoleMode(hCon, &mode) && SetConsoleMode(hCon,(mode | ENABLE_WRAP_AT_EOL_OUTPUT) & ~(ENABLE_PROCESSED_OUTPUT)), + "setting wrap at EOL & clearing processed output\n"); + + /* write line, wrapping enabled, buffer doesn't exceed sb width */ + c.X = sbSize.X - 9; c.Y = 0; + ok(SetConsoleCursorPosition(hCon, c) != 0, "Cursor in upper-left-9\n"); + + ok(WriteConsole(hCon, mytest, mylen, &len, NULL) != 0 && len == mylen, "WriteConsole\n"); + c.Y = 0; + for (p = 0; p < mylen; p++) + { + c.X = sbSize.X - 9 + p; + okCHAR(hCon, c, mytest[p], TEST_ATTRIB); + } + c.X = sbSize.X - 9 + mylen; + okCHAR(hCon, c, ' ', DEFAULT_ATTRIB); + c.X = 0; c.Y = 1; + okCHAR(hCon, c, ' ', DEFAULT_ATTRIB); + + /* write line, wrapping enabled, buffer does exceed sb width */ + c.X = sbSize.X - 3; c.Y = 0; + ok(SetConsoleCursorPosition(hCon, c) != 0, "Cursor in upper-left-3\n"); + + ok(WriteConsole(hCon, mytest, mylen, &len, NULL) != 0 && len == mylen, "WriteConsole\n"); + c.Y = 0; + for (p = 0; p < 3; p++) + { + c.X = sbSize.X - 3 + p; + okCHAR(hCon, c, mytest[p], TEST_ATTRIB); + } + + c.Y = 1; + for (p = 0; p < mylen - 3; p++) + { + c.X = p; + okCHAR(hCon, c, mytest[p + 3], TEST_ATTRIB); + } + c.X = mylen - 3; + okCHAR(hCon, c, ' ', DEFAULT_ATTRIB); + + okCURSOR(hCon, c); +} + +static void testWriteWrappedProcessed(HANDLE hCon, COORD sbSize) +{ + COORD c; + DWORD len, mode; + const char* mytest = "abcd\nf\tg"; + const int mylen = strlen(mytest); + int p; + + ok(GetConsoleMode(hCon, &mode) && SetConsoleMode(hCon, mode | (ENABLE_WRAP_AT_EOL_OUTPUT|ENABLE_PROCESSED_OUTPUT)), + "setting wrap at EOL & processed output\n"); + + /* write line, wrapping enabled, buffer doesn't exceed sb width */ + c.X = sbSize.X - 9; c.Y = 0; + ok(SetConsoleCursorPosition(hCon, c) != 0, "Cursor in upper-left-9\n"); + + ok(WriteConsole(hCon, mytest, mylen, &len, NULL) != 0 && len == mylen, "WriteConsole\n"); + for (p = 0; p < 4; p++) + { + c.X = sbSize.X - 9 + p; + okCHAR(hCon, c, mytest[p], TEST_ATTRIB); + } + c.X = sbSize.X - 9 + p; + okCHAR(hCon, c, ' ', DEFAULT_ATTRIB); + c.X = 0; c.Y++; + okCHAR(hCon, c, mytest[5], TEST_ATTRIB); + for (c.X = 1; c.X < 8; c.X++) + okCHAR(hCon, c, ' ', TEST_ATTRIB); + okCHAR(hCon, c, mytest[7], TEST_ATTRIB); + c.X++; + okCHAR(hCon, c, ' ', DEFAULT_ATTRIB); + okCURSOR(hCon, c); + + /* write line, wrapping enabled, buffer does exceed sb width */ + c.X = sbSize.X - 3; c.Y = 2; + ok(SetConsoleCursorPosition(hCon, c) != 0, "Cursor in upper-left-3\n"); + + ok(WriteConsole(hCon, mytest, mylen, &len, NULL) != 0 && len == mylen, "WriteConsole\n"); + for (p = 0; p < 3; p++) + { + c.X = sbSize.X - 3 + p; + okCHAR(hCon, c, mytest[p], TEST_ATTRIB); + } + c.X = 0; c.Y++; + okCHAR(hCon, c, mytest[3], TEST_ATTRIB); + c.X++; + okCHAR(hCon, c, ' ', DEFAULT_ATTRIB); + + c.X = 0; c.Y++; + okCHAR(hCon, c, mytest[5], TEST_ATTRIB); + for (c.X = 1; c.X < 8; c.X++) + okCHAR(hCon, c, ' ', TEST_ATTRIB); + okCHAR(hCon, c, mytest[7], TEST_ATTRIB); + c.X++; + okCHAR(hCon, c, ' ', DEFAULT_ATTRIB); + okCURSOR(hCon, c); +} + +static void testWrite(HANDLE hCon, COORD sbSize) +{ + /* FIXME: should in fact insure that the sb is at least 10 character wide */ + ok(SetConsoleTextAttribute(hCon, TEST_ATTRIB), "Setting default text color\n"); + resetContent(hCon, sbSize, FALSE); + testWriteSimple(hCon, sbSize); + resetContent(hCon, sbSize, FALSE); + testWriteNotWrappedNotProcessed(hCon, sbSize); + resetContent(hCon, sbSize, FALSE); + testWriteNotWrappedProcessed(hCon, sbSize); + resetContent(hCon, sbSize, FALSE); + testWriteWrappedNotProcessed(hCon, sbSize); + resetContent(hCon, sbSize, FALSE); + testWriteWrappedProcessed(hCon, sbSize); +} + +#if 0 +static void testScroll(HANDLE hCon, COORD sbSize) +{ + SMALL_RECT scroll, clip; + COORD dst, c, tc; + CHAR_INFO ci; + +#define W 11 +#define H 7 + + /* no clipping, src & dst rect don't overlap */ + resetContent(hCon, sbSize, TRUE); + +#define IN_SRECT(r,c) ((r).Left <= (c).X && (c).X <= (r).Right && (r).Top <= (c).Y && (c).Y <= (r).Bottom) +#define IN_SRECT2(r,d,c) ((d).X <= (c).X && (c).X <= (d).X + (r).Right - (r).Left && (d).Y <= (c).Y && (c).Y <= (d).Y + (r).Bottom - (r).Top) + + scroll.Left = 0; + scroll.Right = W - 1; + scroll.Top = 0; + scroll.Bottom = H - 1; + dst.X = W + 3; + dst.Y = H + 3; + ci.Char.UnicodeChar = '#'; + ci.Attributes = TEST_ATTRIB; + + clip.Left = 0; + clip.Right = sbSize.X - 1; + clip.Top = 0; + clip.Bottom = sbSize.Y - 1; + + ok(ScrollConsoleScreenBuffer(hCon, &scroll, NULL, dst, &ci), "Scrolling SB\n"); + + for (c.Y = 0; c.Y < sbSize.Y; c.Y++) + { + for (c.X = 0; c.X < sbSize.X; c.X++) + { + if (IN_SRECT2(scroll, dst, c) && IN_SRECT(clip, c)) + { + tc.X = c.X - dst.X; + tc.Y = c.Y - dst.Y; + okCHAR(hCon, c, CONTENT(tc), DEFAULT_ATTRIB); + } + else if (IN_SRECT(scroll, c) && IN_SRECT(clip, c)) + okCHAR(hCon, c, '#', TEST_ATTRIB); + else okCHAR(hCon, c, CONTENT(c), DEFAULT_ATTRIB); + } + } + + /* no clipping, src & dst rect do overlap */ + resetContent(hCon, sbSize, TRUE); + + scroll.Left = 0; + scroll.Right = W - 1; + scroll.Top = 0; + scroll.Bottom = H - 1; + dst.X = W /2; + dst.Y = H / 2; + ci.Char.UnicodeChar = '#'; + ci.Attributes = TEST_ATTRIB; + + clip.Left = 0; + clip.Right = sbSize.X - 1; + clip.Top = 0; + clip.Bottom = sbSize.Y - 1; + + ok(ScrollConsoleScreenBuffer(hCon, &scroll, NULL, dst, &ci), "Scrolling SB\n"); + + for (c.Y = 0; c.Y < sbSize.Y; c.Y++) + { + for (c.X = 0; c.X < sbSize.X; c.X++) + { + if (dst.X <= c.X && c.X < dst.X + W && dst.Y <= c.Y && c.Y < dst.Y + H) + { + tc.X = c.X - dst.X; + tc.Y = c.Y - dst.Y; + okCHAR(hCon, c, CONTENT(tc), DEFAULT_ATTRIB); + } + else if (c.X < W && c.Y < H) okCHAR(hCon, c, '#', TEST_ATTRIB); + else okCHAR(hCon, c, CONTENT(c), DEFAULT_ATTRIB); + } + } + + /* clipping, src & dst rect don't overlap */ + resetContent(hCon, sbSize, TRUE); + + scroll.Left = 0; + scroll.Right = W - 1; + scroll.Top = 0; + scroll.Bottom = H - 1; + dst.X = W + 3; + dst.Y = H + 3; + ci.Char.UnicodeChar = '#'; + ci.Attributes = TEST_ATTRIB; + + clip.Left = W / 2; + clip.Right = min(W + W / 2, sbSize.X - 1); + clip.Top = H / 2; + clip.Bottom = min(H + H / 2, sbSize.Y - 1); + + ok(ScrollConsoleScreenBuffer(hCon, &scroll, &clip, dst, &ci), "Scrolling SB\n"); + + for (c.Y = 0; c.Y < sbSize.Y; c.Y++) + { + for (c.X = 0; c.X < sbSize.X; c.X++) + { + if (IN_SRECT2(scroll, dst, c) && IN_SRECT(clip, c)) + { + tc.X = c.X - dst.X; + tc.Y = c.Y - dst.Y; + okCHAR(hCon, c, CONTENT(tc), DEFAULT_ATTRIB); + } + else if (IN_SRECT(scroll, c) && IN_SRECT(clip, c)) + okCHAR(hCon, c, '#', TEST_ATTRIB); + else okCHAR(hCon, c, CONTENT(c), DEFAULT_ATTRIB); + } + } + + /* clipping, src & dst rect do overlap */ + resetContent(hCon, sbSize, TRUE); + + scroll.Left = 0; + scroll.Right = W - 1; + scroll.Top = 0; + scroll.Bottom = H - 1; + dst.X = W / 2 - 3; + dst.Y = H / 2 - 3; + ci.Char.UnicodeChar = '#'; + ci.Attributes = TEST_ATTRIB; + + clip.Left = W / 2; + clip.Right = min(W + W / 2, sbSize.X - 1); + clip.Top = H / 2; + clip.Bottom = min(H + H / 2, sbSize.Y - 1); + + ok(ScrollConsoleScreenBuffer(hCon, &scroll, &clip, dst, &ci), "Scrolling SB\n"); + + for (c.Y = 0; c.Y < sbSize.Y; c.Y++) + { + for (c.X = 0; c.X < sbSize.X; c.X++) + { + if (IN_SRECT2(scroll, dst, c) && IN_SRECT(clip, c)) + { + tc.X = c.X - dst.X; + tc.Y = c.Y - dst.Y; + okCHAR(hCon, c, CONTENT(tc), DEFAULT_ATTRIB); + } + else if (IN_SRECT(scroll, c) && IN_SRECT(clip, c)) + okCHAR(hCon, c, '#', TEST_ATTRIB); + else okCHAR(hCon, c, CONTENT(c), DEFAULT_ATTRIB); + } + } +} +#endif + +START_TEST(console) +{ + HANDLE hConIn, hConOut; + BOOL ret; + CONSOLE_SCREEN_BUFFER_INFO sbi; + + /* be sure we have a clean console (and that's our own) + * FIXME: this will make the test fail (currently) if we don't run + * under X11 + * Another solution would be to rerun the test under wineconsole with + * the curses backend + */ + + hConIn = CreateFileA("CONIN$", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0); + hConOut = CreateFileA("CONOUT$", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0); + + /* first, we need to be sure we're attached to a console */ + if (hConIn == INVALID_HANDLE_VALUE || hConOut == INVALID_HANDLE_VALUE) + { + /* we're not attached to a console, let's do it */ + AllocConsole(); + hConIn = CreateFileA("CONIN$", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0); + hConOut = CreateFileA("CONOUT$", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0); + } + /* now verify everything's ok */ + ok(hConIn != INVALID_HANDLE_VALUE, "Opening ConIn\n"); + ok(hConOut != INVALID_HANDLE_VALUE, "Opening ConOut\n"); + + ok(ret = GetConsoleScreenBufferInfo(hConOut, &sbi), "Getting sb info\n"); + if (!ret) return; + + /* Non interactive tests */ + testCursor(hConOut, sbi.dwSize); + /* will test wrapped (on/off) & processed (on/off) strings output */ + testWrite(hConOut, sbi.dwSize); + /* will test line scrolling at the bottom of the screen */ + /* testBottomScroll(); */ + /* will test all the scrolling operations */ + /* this one is disabled for now, Wine's result are way too bad */ + /* testScroll(hCon, sbi.dwSize); */ + /* will test sb creation / modification... */ + /* testScreenBuffer() */ + + /* still to be done: events generation, access rights & access on objects */ +} diff --git a/reactos/apps/tests/kernel32/directory.c b/reactos/apps/tests/kernel32/directory.c new file mode 100644 index 00000000000..a5b81eb938b --- /dev/null +++ b/reactos/apps/tests/kernel32/directory.c @@ -0,0 +1,351 @@ +/* + * Unit test suite for directory functions. + * + * Copyright 2002 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 + */ + +#include + +#include "wine/test.h" +#include "windef.h" +#include "winbase.h" +#include "winerror.h" + +/* If you change something in these tests, please do the same + * for GetSystemDirectory tests. + */ +static void test_GetWindowsDirectoryA(void) +{ + UINT len, len_with_null; + char buf[MAX_PATH]; + + len_with_null = GetWindowsDirectoryA(NULL, 0); + ok(len_with_null <= MAX_PATH, "should fit into MAX_PATH\n"); + + lstrcpyA(buf, "foo"); + len_with_null = GetWindowsDirectoryA(buf, 1); + ok(lstrcmpA(buf, "foo") == 0, "should not touch the buffer\n"); + + lstrcpyA(buf, "foo"); + len = GetWindowsDirectoryA(buf, len_with_null - 1); + ok(lstrcmpA(buf, "foo") == 0, "should not touch the buffer\n"); + ok(len == len_with_null, "GetWindowsDirectoryW returned %d, expected %d\n", + len, len_with_null); + + lstrcpyA(buf, "foo"); + len = GetWindowsDirectoryA(buf, len_with_null); + ok(lstrcmpA(buf, "foo") != 0, "should touch the buffer\n"); + ok(len == strlen(buf), "returned length should be equal to the length of string\n"); + ok(len == len_with_null-1, "GetWindowsDirectoryA returned %d, expected %d\n", + len, len_with_null-1); +} + +static void test_GetWindowsDirectoryW(void) +{ + UINT len, len_with_null; + WCHAR buf[MAX_PATH]; + static const WCHAR fooW[] = {'f','o','o',0}; + + len_with_null = GetWindowsDirectoryW(NULL, 0); + if (len_with_null==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) + return; + ok(len_with_null <= MAX_PATH, "should fit into MAX_PATH\n"); + + lstrcpyW(buf, fooW); + len = GetWindowsDirectoryW(buf, 1); + ok(lstrcmpW(buf, fooW) == 0, "should not touch the buffer\n"); + ok(len == len_with_null, "GetWindowsDirectoryW returned %d, expected %d\n", + len, len_with_null); + + lstrcpyW(buf, fooW); + len = GetWindowsDirectoryW(buf, len_with_null - 1); + ok(lstrcmpW(buf, fooW) == 0, "should not touch the buffer\n"); + ok(len == len_with_null, "GetWindowsDirectoryW returned %d, expected %d\n", + len, len_with_null); + + lstrcpyW(buf, fooW); + len = GetWindowsDirectoryW(buf, len_with_null); + ok(lstrcmpW(buf, fooW) != 0, "should touch the buffer\n"); + ok(len == lstrlenW(buf), "returned length should be equal to the length of string\n"); + ok(len == len_with_null-1, "GetWindowsDirectoryW returned %d, expected %d\n", + len, len_with_null-1); +} + + +/* If you change something in these tests, please do the same + * for GetWindowsDirectory tests. + */ +static void test_GetSystemDirectoryA(void) +{ + UINT len, len_with_null; + char buf[MAX_PATH]; + + len_with_null = GetSystemDirectoryA(NULL, 0); + ok(len_with_null <= MAX_PATH, "should fit into MAX_PATH\n"); + + lstrcpyA(buf, "foo"); + len = GetSystemDirectoryA(buf, 1); + ok(lstrcmpA(buf, "foo") == 0, "should not touch the buffer\n"); + ok(len == len_with_null, "GetSystemDirectoryA returned %d, expected %d\n", + len, len_with_null); + + lstrcpyA(buf, "foo"); + len = GetSystemDirectoryA(buf, len_with_null - 1); + ok(lstrcmpA(buf, "foo") == 0, "should not touch the buffer\n"); + ok(len == len_with_null, "GetSystemDirectoryA returned %d, expected %d\n", + len, len_with_null); + + lstrcpyA(buf, "foo"); + len = GetSystemDirectoryA(buf, len_with_null); + ok(lstrcmpA(buf, "foo") != 0, "should touch the buffer\n"); + ok(len == strlen(buf), "returned length should be equal to the length of string\n"); + ok(len == len_with_null-1, "GetSystemDirectoryW returned %d, expected %d\n", + len, len_with_null-1); +} + +static void test_GetSystemDirectoryW(void) +{ + UINT len, len_with_null; + WCHAR buf[MAX_PATH]; + static const WCHAR fooW[] = {'f','o','o',0}; + + len_with_null = GetSystemDirectoryW(NULL, 0); + if (len_with_null==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) + return; + ok(len_with_null <= MAX_PATH, "should fit into MAX_PATH\n"); + + lstrcpyW(buf, fooW); + len = GetSystemDirectoryW(buf, 1); + ok(lstrcmpW(buf, fooW) == 0, "should not touch the buffer\n"); + ok(len == len_with_null, "GetSystemDirectoryW returned %d, expected %d\n", + len, len_with_null); + + lstrcpyW(buf, fooW); + len = GetSystemDirectoryW(buf, len_with_null - 1); + ok(lstrcmpW(buf, fooW) == 0, "should not touch the buffer\n"); + ok(len == len_with_null, "GetSystemDirectoryW returned %d, expected %d\n", + len, len_with_null); + + lstrcpyW(buf, fooW); + len = GetSystemDirectoryW(buf, len_with_null); + ok(lstrcmpW(buf, fooW) != 0, "should touch the buffer\n"); + ok(len == lstrlenW(buf), "returned length should be equal to the length of string\n"); + ok(len == len_with_null-1, "GetSystemDirectoryW returned %d, expected %d\n", + len, len_with_null-1); +} + +static void test_CreateDirectoryA(void) +{ + char tmpdir[MAX_PATH]; + BOOL ret; + + ret = CreateDirectoryA(NULL, NULL); + ok(ret == FALSE && (GetLastError() == ERROR_PATH_NOT_FOUND || + GetLastError() == ERROR_INVALID_PARAMETER), + "CreateDirectoryA(NULL,NULL): ret=%d error=%ld\n",ret,GetLastError()); + + ret = CreateDirectoryA("", NULL); + ok(ret == FALSE && (GetLastError() == ERROR_BAD_PATHNAME || + GetLastError() == ERROR_PATH_NOT_FOUND), + "CreateDirectoryA(\"\",NULL): ret=%d error=%ld\n",ret,GetLastError()); + + ret = GetSystemDirectoryA(tmpdir, MAX_PATH); + ok(ret < MAX_PATH, "System directory should fit into MAX_PATH\n"); + + ret = SetCurrentDirectoryA(tmpdir); + ok(ret == TRUE, "could not chdir to the System directory\n"); + + ret = CreateDirectoryA(".", NULL); + ok(ret == FALSE && GetLastError() == ERROR_ALREADY_EXISTS, "should not create existing path\n"); + + ret = CreateDirectoryA("..", NULL); + ok(ret == FALSE && GetLastError() == ERROR_ALREADY_EXISTS, "should not create existing path\n"); + + GetTempPathA(MAX_PATH, tmpdir); + tmpdir[3] = 0; /* truncate the path */ + ret = CreateDirectoryA(tmpdir, NULL); + ok(ret == FALSE && (GetLastError() == ERROR_ALREADY_EXISTS || + GetLastError() == ERROR_ACCESS_DENIED), + "CreateDirectoryA(drive_root): ret=%d error=%ld\n",ret,GetLastError()); + + GetTempPathA(MAX_PATH, tmpdir); + lstrcatA(tmpdir, "Please Remove Me"); + ret = CreateDirectoryA(tmpdir, NULL); + ok(ret == TRUE, "CreateDirectoryA should always succeed\n"); + + ret = CreateDirectoryA(tmpdir, NULL); + ok(ret == FALSE && GetLastError() == ERROR_ALREADY_EXISTS, "should not create existing path\n"); + + ret = RemoveDirectoryA(tmpdir); + ok(ret == TRUE, "RemoveDirectoryA should always succeed\n"); + + todo_wine { + lstrcatA(tmpdir, "?"); + ret = CreateDirectoryA(tmpdir, NULL); + ok(ret == FALSE && GetLastError() == ERROR_INVALID_NAME, + "CreateDirectoryA with ? wildcard name should fail, ret=%s error=%ld\n", + ret ? " True" : "False", GetLastError()); + ret = RemoveDirectoryA(tmpdir); + + tmpdir[lstrlenA(tmpdir) - 1] = '*'; + ret = CreateDirectoryA(tmpdir, NULL); + ok(ret == FALSE && GetLastError() == ERROR_INVALID_NAME, + "CreateDirectoryA with * wildcard name should fail, ret=%s error=%ld\n", + ret ? " True" : "False", GetLastError()); + ret = RemoveDirectoryA(tmpdir); + } +} + +static void test_CreateDirectoryW(void) +{ + WCHAR tmpdir[MAX_PATH]; + BOOL ret; + static const WCHAR empty_strW[] = { 0 }; + static const WCHAR tmp_dir_name[] = {'P','l','e','a','s','e',' ','R','e','m','o','v','e',' ','M','e',0}; + static const WCHAR dotW[] = {'.',0}; + static const WCHAR dotdotW[] = {'.','.',0}; + static const WCHAR questionW[] = {'?',0}; + + ret = CreateDirectoryW(NULL, NULL); + if (!ret && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) + return; + ok(ret == FALSE && GetLastError() == ERROR_PATH_NOT_FOUND, "should not create NULL path\n"); + + ret = CreateDirectoryW(empty_strW, NULL); + ok(ret == FALSE && GetLastError() == ERROR_PATH_NOT_FOUND, "should not create empty path\n"); + + ret = GetSystemDirectoryW(tmpdir, MAX_PATH); + ok(ret < MAX_PATH, "System directory should fit into MAX_PATH\n"); + + ret = SetCurrentDirectoryW(tmpdir); + ok(ret == TRUE, "could not chdir to the System directory\n"); + + ret = CreateDirectoryW(dotW, NULL); + ok(ret == FALSE && GetLastError() == ERROR_ALREADY_EXISTS, "should not create existing path\n"); + + ret = CreateDirectoryW(dotdotW, NULL); + ok(ret == FALSE && GetLastError() == ERROR_ALREADY_EXISTS, "should not create existing path\n"); + + GetTempPathW(MAX_PATH, tmpdir); + tmpdir[3] = 0; /* truncate the path */ + ret = CreateDirectoryW(tmpdir, NULL); + ok(ret == FALSE && GetLastError() == ERROR_ACCESS_DENIED, "should deny access to the drive root\n"); + + GetTempPathW(MAX_PATH, tmpdir); + lstrcatW(tmpdir, tmp_dir_name); + ret = CreateDirectoryW(tmpdir, NULL); + ok(ret == TRUE, "CreateDirectoryW should always succeed\n"); + + ret = CreateDirectoryW(tmpdir, NULL); + ok(ret == FALSE && GetLastError() == ERROR_ALREADY_EXISTS, "should not create existing path\n"); + + ret = RemoveDirectoryW(tmpdir); + ok(ret == TRUE, "RemoveDirectoryW should always succeed\n"); + + todo_wine { + lstrcatW(tmpdir, questionW); + ret = CreateDirectoryW(tmpdir, NULL); + ok(ret == FALSE && GetLastError() == ERROR_INVALID_NAME, + "CreateDirectoryW with ? wildcard name should fail with error 183, ret=%s error=%ld\n", + ret ? " True" : "False", GetLastError()); + ret = RemoveDirectoryW(tmpdir); + + tmpdir[lstrlenW(tmpdir) - 1] = '*'; + ret = CreateDirectoryW(tmpdir, NULL); + ok(ret == FALSE && GetLastError() == ERROR_INVALID_NAME, + "CreateDirectoryW with * wildcard name should fail with error 183, ret=%s error=%ld\n", + ret ? " True" : "False", GetLastError()); + ret = RemoveDirectoryW(tmpdir); + } +} + +static void test_RemoveDirectoryA(void) +{ + char tmpdir[MAX_PATH]; + BOOL ret; + + GetTempPathA(MAX_PATH, tmpdir); + lstrcatA(tmpdir, "Please Remove Me"); + ret = CreateDirectoryA(tmpdir, NULL); + ok(ret == TRUE, "CreateDirectoryA should always succeed\n"); + + ret = RemoveDirectoryA(tmpdir); + ok(ret == TRUE, "RemoveDirectoryA should always succeed\n"); + + todo_wine { + lstrcatA(tmpdir, "?"); + ret = RemoveDirectoryA(tmpdir); + ok(ret == FALSE && GetLastError() == ERROR_INVALID_NAME, + "RemoveDirectoryA with ? wildcard name should fail with error 183, ret=%s error=%ld\n", + ret ? " True" : "False", GetLastError()); + + tmpdir[lstrlenA(tmpdir) - 1] = '*'; + ret = RemoveDirectoryA(tmpdir); + ok(ret == FALSE && GetLastError() == ERROR_INVALID_NAME, + "RemoveDirectoryA with * wildcard name should fail with error 183, ret=%s error=%ld\n", + ret ? " True" : "False", GetLastError()); + } +} + +static void test_RemoveDirectoryW(void) +{ + WCHAR tmpdir[MAX_PATH]; + BOOL ret; + static const WCHAR tmp_dir_name[] = {'P','l','e','a','s','e',' ','R','e','m','o','v','e',' ','M','e',0}; + static const WCHAR questionW[] = {'?',0}; + + GetTempPathW(MAX_PATH, tmpdir); + lstrcatW(tmpdir, tmp_dir_name); + ret = CreateDirectoryW(tmpdir, NULL); + if (!ret && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) + return; + + ok(ret == TRUE, "CreateDirectoryW should always succeed\n"); + + ret = RemoveDirectoryW(tmpdir); + ok(ret == TRUE, "RemoveDirectoryW should always succeed\n"); + + todo_wine { + lstrcatW(tmpdir, questionW); + ret = RemoveDirectoryW(tmpdir); + ok(ret == FALSE && GetLastError() == ERROR_INVALID_NAME, + "RemoveDirectoryW with wildcard should fail with error 183, ret=%s error=%ld\n", + ret ? " True" : "False", GetLastError()); + + tmpdir[lstrlenW(tmpdir) - 1] = '*'; + ret = RemoveDirectoryW(tmpdir); + ok(ret == FALSE && GetLastError() == ERROR_INVALID_NAME, + "RemoveDirectoryW with * wildcard name should fail with error 183, ret=%s error=%ld\n", + ret ? " True" : "False", GetLastError()); + } + +} + +START_TEST(directory) +{ + test_GetWindowsDirectoryA(); + test_GetWindowsDirectoryW(); + + test_GetSystemDirectoryA(); + test_GetSystemDirectoryW(); + + test_CreateDirectoryA(); + test_CreateDirectoryW(); + + test_RemoveDirectoryA(); + test_RemoveDirectoryW(); +} diff --git a/reactos/apps/tests/kernel32/drive.c b/reactos/apps/tests/kernel32/drive.c new file mode 100644 index 00000000000..085f317ad41 --- /dev/null +++ b/reactos/apps/tests/kernel32/drive.c @@ -0,0 +1,183 @@ +/* + * Unit test suite for drive functions. + * + * Copyright 2002 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 + */ + +#include + +#include "wine/test.h" +#include "windef.h" +#include "winbase.h" +#include "winerror.h" + +void test_GetDriveTypeA(void) +{ + char drive[] = "?:\\"; + DWORD logical_drives; + UINT type; + + logical_drives = GetLogicalDrives(); + ok(logical_drives != 0, "GetLogicalDrives error %ld\n", GetLastError()); + + for (drive[0] = 'A'; drive[0] <= 'Z'; drive[0]++) + { + type = GetDriveTypeA(drive); + ok(type > 0 && type <= 6, "not a valid drive %c: type %u\n", drive[0], type); + + if (!(logical_drives & 1)) + ok(type == DRIVE_NO_ROOT_DIR, + "GetDriveTypeA should return DRIVE_NO_ROOT_DIR for inexistant drive %c: but not %u\n", + drive[0], type); + + logical_drives >>= 1; + } +} + +void test_GetDriveTypeW(void) +{ + WCHAR drive[] = {'?',':','\\',0}; + DWORD logical_drives; + UINT type; + + logical_drives = GetLogicalDrives(); + ok(logical_drives != 0, "GetLogicalDrives error %ld\n", GetLastError()); + + for (drive[0] = 'A'; drive[0] <= 'Z'; drive[0]++) + { + type = GetDriveTypeW(drive); + if (type == DRIVE_UNKNOWN && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) + { + /* Must be Win9x which doesn't support the Unicode functions */ + return; + } + ok(type > 0 && type <= 6, "not a valid drive %c: type %u\n", drive[0], type); + + if (!(logical_drives & 1)) + ok(type == DRIVE_NO_ROOT_DIR, + "GetDriveTypeW should return DRIVE_NO_ROOT_DIR for inexistant drive %c: but not %u\n", + drive[0], type); + + logical_drives >>= 1; + } +} + +void test_GetDiskFreeSpaceA(void) +{ + BOOL ret; + DWORD sectors_per_cluster, bytes_per_sector, free_clusters, total_clusters; + char drive[] = "?:\\"; + DWORD logical_drives; + + ret = GetDiskFreeSpaceA(NULL, §ors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters); + ok(ret, "GetDiskFreeSpaceA error %ld\n", GetLastError()); + + ret = GetDiskFreeSpaceA("", §ors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters); + ok(!ret && (GetLastError() == ERROR_PATH_NOT_FOUND || GetLastError() == ERROR_INVALID_NAME), + "GetDiskFreeSpaceA(\"\"): ret=%d GetLastError=%ld\n", + ret, GetLastError()); + + ret = GetDiskFreeSpaceA("\\", §ors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters); + ok(ret, "GetDiskFreeSpaceA error %ld\n", GetLastError()); + + ret = GetDiskFreeSpaceA("/", §ors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters); + ok(ret, "GetDiskFreeSpaceA error %ld\n", GetLastError()); + + logical_drives = GetLogicalDrives(); + ok(logical_drives != 0, "GetLogicalDrives error %ld\n", GetLastError()); + + for (drive[0] = 'A'; drive[0] <= 'Z'; drive[0]++) + { + /* Skip floppy drives because NT pops up a MessageBox if no + * floppy is present + */ + if (GetDriveTypeA(drive)!=DRIVE_REMOVABLE) + { + ret = GetDiskFreeSpaceA(drive, §ors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters); + if (!(logical_drives & 1)) + ok(!ret && (GetLastError() == ERROR_PATH_NOT_FOUND || GetLastError() == ERROR_INVALID_DRIVE), + "GetDiskFreeSpaceA(%s): ret=%d GetLastError=%ld\n", + drive, ret, GetLastError()); + else + ok(ret || + (!ret && (GetLastError() == ERROR_NOT_READY || GetLastError() == ERROR_INVALID_DRIVE)), + "GetDiskFreeSpaceA(%s): ret=%d GetLastError=%ld\n", + drive, ret, GetLastError()); + } + logical_drives >>= 1; + } +} + +void test_GetDiskFreeSpaceW(void) +{ + BOOL ret; + DWORD sectors_per_cluster, bytes_per_sector, free_clusters, total_clusters; + WCHAR drive[] = {'?',':','\\',0}; + DWORD logical_drives; + static const WCHAR empty_pathW[] = { 0 }; + static const WCHAR root_pathW[] = { '\\', 0 }; + static const WCHAR unix_style_root_pathW[] = { '/', 0 }; + + ret = GetDiskFreeSpaceW(NULL, §ors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters); + if (ret == 0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) + { + /* Must be Win9x which doesn't support the Unicode functions */ + return; + } + ok(ret, "GetDiskFreeSpaceW error %ld\n", GetLastError()); + + ret = GetDiskFreeSpaceW(empty_pathW, §ors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters); + ok(!ret && GetLastError() == ERROR_PATH_NOT_FOUND, + "GetDiskFreeSpaceW(\"\"): ret=%d GetLastError=%ld\n", + ret, GetLastError()); + + ret = GetDiskFreeSpaceW(root_pathW, §ors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters); + ok(ret, "GetDiskFreeSpaceW(\"\") error %ld\n", GetLastError()); + + ret = GetDiskFreeSpaceW(unix_style_root_pathW, §ors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters); + ok(ret, "GetDiskFreeSpaceW error %ld\n", GetLastError()); + + logical_drives = GetLogicalDrives(); + ok(logical_drives != 0, "GetLogicalDrives error %ld\n", GetLastError()); + + for (drive[0] = 'A'; drive[0] <= 'Z'; drive[0]++) + { + /* Skip floppy drives because NT4 pops up a MessageBox if no floppy is present */ + if (GetDriveTypeW(drive)!=DRIVE_REMOVABLE) + { + ret = GetDiskFreeSpaceW(drive, §ors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters); + if (!(logical_drives & 1)) + ok(!ret && GetLastError() == ERROR_PATH_NOT_FOUND, + "GetDiskFreeSpaceW(%c): ret=%d GetLastError=%ld\n", + drive[0], ret, GetLastError()); + else + ok(ret || GetLastError() == ERROR_NOT_READY, + "GetDiskFreeSpaceW(%c): ret=%d GetLastError=%ld\n", + drive[0], ret, GetLastError()); + } + logical_drives >>= 1; + } +} + +START_TEST(drive) +{ + test_GetDriveTypeA(); + test_GetDriveTypeW(); + + test_GetDiskFreeSpaceA(); + test_GetDiskFreeSpaceW(); +} diff --git a/reactos/apps/tests/kernel32/environ.c b/reactos/apps/tests/kernel32/environ.c new file mode 100644 index 00000000000..ed327034997 --- /dev/null +++ b/reactos/apps/tests/kernel32/environ.c @@ -0,0 +1,218 @@ +/* + * Unit test suite for environment functions. + * + * Copyright 2002 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 + */ + +#include + +#include "wine/test.h" +#include "windef.h" +#include "winbase.h" +#include "winerror.h" + +static void test_GetSetEnvironmentVariableA(void) +{ + char buf[256]; + BOOL ret; + DWORD ret_size; + static const char name[] = "SomeWildName"; + static const char name_cased[] = "sOMEwILDnAME"; + static const char value[] = "SomeWildValue"; + + ret = SetEnvironmentVariableA(name, value); + ok(ret == TRUE, + "unexpected error in SetEnvironmentVariableA, GetLastError=%ld\n", + GetLastError()); + + /* Try to retrieve the environment variable we just set */ + ret_size = GetEnvironmentVariableA(name, NULL, 0); + ok(ret_size == strlen(value) + 1, + "should return length with terminating 0 ret_size=%ld\n", ret_size); + + lstrcpyA(buf, "foo"); + ret_size = GetEnvironmentVariableA(name, buf, lstrlenA(value)); + ok(lstrcmpA(buf, "foo") == 0, "should not touch the buffer\n"); + ok(ret_size == strlen(value) + 1, + "should return length with terminating 0 ret_size=%ld\n", ret_size); + + lstrcpyA(buf, "foo"); + ret_size = GetEnvironmentVariableA(name, buf, lstrlenA(value) + 1); + ok(lstrcmpA(buf, value) == 0, "should touch the buffer\n"); + ok(ret_size == strlen(value), + "should return length without terminating 0 ret_size=%ld\n", ret_size); + + lstrcpyA(buf, "foo"); + ret_size = GetEnvironmentVariableA(name_cased, buf, lstrlenA(value) + 1); + ok(lstrcmpA(buf, value) == 0, "should touch the buffer\n"); + ok(ret_size == strlen(value), + "should return length without terminating 0 ret_size=%ld\n", ret_size); + + /* Remove that environment variable */ + ret = SetEnvironmentVariableA(name_cased, NULL); + ok(ret == TRUE, "should erase existing variable\n"); + + lstrcpyA(buf, "foo"); + ret_size = GetEnvironmentVariableA(name, buf, lstrlenA(value) + 1); + ok(lstrcmpA(buf, "foo") == 0, "should not touch the buffer\n"); + ok(ret_size == 0 && GetLastError() == ERROR_ENVVAR_NOT_FOUND, + "should not find variable but ret_size=%ld GetLastError=%ld\n", + ret_size, GetLastError()); + + /* Check behavior of SetEnvironmentVariableA(name, "") */ + ret = SetEnvironmentVariableA(name, value); + ok(ret == TRUE, + "unexpected error in SetEnvironmentVariableA, GetLastError=%ld\n", + GetLastError()); + + lstrcpyA(buf, "foo"); + ret_size = GetEnvironmentVariableA(name_cased, buf, lstrlenA(value) + 1); + ok(lstrcmpA(buf, value) == 0, "should touch the buffer\n"); + ok(ret_size == strlen(value), + "should return length without terminating 0 ret_size=%ld\n", ret_size); + + ret = SetEnvironmentVariableA(name_cased, ""); + ok(ret == TRUE, + "should not fail with empty value but GetLastError=%ld\n", GetLastError()); + + lstrcpyA(buf, "foo"); + SetLastError(0); + ret_size = GetEnvironmentVariableA(name, buf, lstrlenA(value) + 1); + ok(ret_size == 0 && + ((GetLastError() == 0 && lstrcmpA(buf, "") == 0) || + (GetLastError() == ERROR_ENVVAR_NOT_FOUND)), + "%s should be set to \"\" (NT) or removed (Win9x) but ret_size=%ld GetLastError=%ld and buf=%s\n", + name, ret_size, GetLastError(), buf); + + /* Test the limits */ + ret_size = GetEnvironmentVariableA(NULL, NULL, 0); + ok(ret_size == 0 && (GetLastError() == ERROR_INVALID_PARAMETER || GetLastError() == ERROR_ENVVAR_NOT_FOUND), + "should not find variable but ret_size=%ld GetLastError=%ld\n", + ret_size, GetLastError()); + + ret_size = GetEnvironmentVariableA(NULL, buf, lstrlenA(value) + 1); + ok(ret_size == 0 && (GetLastError() == ERROR_INVALID_PARAMETER || GetLastError() == ERROR_ENVVAR_NOT_FOUND), + "should not find variable but ret_size=%ld GetLastError=%ld\n", + ret_size, GetLastError()); + + ret_size = GetEnvironmentVariableA("", buf, lstrlenA(value) + 1); + ok(ret_size == 0 && GetLastError() == ERROR_ENVVAR_NOT_FOUND, + "should not find variable but ret_size=%ld GetLastError=%ld\n", + ret_size, GetLastError()); +} + +static void test_GetSetEnvironmentVariableW(void) +{ + WCHAR buf[256]; + BOOL ret; + DWORD ret_size; + static const WCHAR name[] = {'S','o','m','e','W','i','l','d','N','a','m','e',0}; + static const WCHAR value[] = {'S','o','m','e','W','i','l','d','V','a','l','u','e',0}; + static const WCHAR name_cased[] = {'s','O','M','E','w','I','L','D','n','A','M','E',0}; + static const WCHAR empty_strW[] = { 0 }; + static const WCHAR fooW[] = {'f','o','o',0}; + + ret = SetEnvironmentVariableW(name, value); + if (ret == FALSE && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) + { + /* Must be Win9x which doesn't support the Unicode functions */ + return; + } + ok(ret == TRUE, + "unexpected error in SetEnvironmentVariableW, GetLastError=%ld\n", + GetLastError()); + + /* Try to retrieve the environment variable we just set */ + ret_size = GetEnvironmentVariableW(name, NULL, 0); + ok(ret_size == lstrlenW(value) + 1, + "should return length with terminating 0 ret_size=%ld\n", + ret_size); + + lstrcpyW(buf, fooW); + ret_size = GetEnvironmentVariableW(name, buf, lstrlenW(value)); + ok(lstrcmpW(buf, fooW) == 0, "should not touch the buffer\n"); + + ok(ret_size == lstrlenW(value) + 1, + "should return length with terminating 0 ret_size=%ld\n", ret_size); + + lstrcpyW(buf, fooW); + ret_size = GetEnvironmentVariableW(name, buf, lstrlenW(value) + 1); + ok(lstrcmpW(buf, value) == 0, "should touch the buffer\n"); + ok(ret_size == lstrlenW(value), + "should return length without terminating 0 ret_size=%ld\n", ret_size); + + lstrcpyW(buf, fooW); + ret_size = GetEnvironmentVariableW(name_cased, buf, lstrlenW(value) + 1); + ok(lstrcmpW(buf, value) == 0, "should touch the buffer\n"); + ok(ret_size == lstrlenW(value), + "should return length without terminating 0 ret_size=%ld\n", ret_size); + + /* Remove that environment variable */ + ret = SetEnvironmentVariableW(name_cased, NULL); + ok(ret == TRUE, "should erase existing variable\n"); + + lstrcpyW(buf, fooW); + ret_size = GetEnvironmentVariableW(name, buf, lstrlenW(value) + 1); + ok(lstrcmpW(buf, fooW) == 0, "should not touch the buffer\n"); + ok(ret_size == 0 && GetLastError() == ERROR_ENVVAR_NOT_FOUND, + "should not find variable but ret_size=%ld GetLastError=%ld\n", + ret_size, GetLastError()); + + /* Check behavior of SetEnvironmentVariableW(name, "") */ + ret = SetEnvironmentVariableW(name, value); + ok(ret == TRUE, + "unexpected error in SetEnvironmentVariableW, GetLastError=%ld\n", + GetLastError()); + + lstrcpyW(buf, fooW); + ret_size = GetEnvironmentVariableW(name, buf, lstrlenW(value) + 1); + ok(lstrcmpW(buf, value) == 0, "should touch the buffer\n"); + ok(ret_size == lstrlenW(value), + "should return length without terminating 0 ret_size=%ld\n", ret_size); + + ret = SetEnvironmentVariableW(name_cased, empty_strW); + ok(ret == TRUE, "should not fail with empty value but GetLastError=%ld\n", GetLastError()); + + lstrcpyW(buf, fooW); + ret_size = GetEnvironmentVariableW(name, buf, lstrlenW(value) + 1); + ok(ret_size == 0 && GetLastError() == ERROR_ENVVAR_NOT_FOUND, + "should not find variable but ret_size=%ld GetLastError=%ld\n", + ret_size, GetLastError()); + ok(lstrcmpW(buf, empty_strW) == 0, "should copy an empty string\n"); + + /* Test the limits */ + ret_size = GetEnvironmentVariableW(NULL, NULL, 0); + ok(ret_size == 0 && GetLastError() == ERROR_ENVVAR_NOT_FOUND, + "should not find variable but ret_size=%ld GetLastError=%ld\n", + ret_size, GetLastError()); + + ret_size = GetEnvironmentVariableW(NULL, buf, lstrlenW(value) + 1); + ok(ret_size == 0 && GetLastError() == ERROR_ENVVAR_NOT_FOUND, + "should not find variable but ret_size=%ld GetLastError=%ld\n", + ret_size, GetLastError()); + + ret = SetEnvironmentVariableW(NULL, NULL); + ok(ret == FALSE && (GetLastError() == ERROR_INVALID_PARAMETER || GetLastError() == ERROR_ENVVAR_NOT_FOUND), + "should fail with NULL, NULL but ret=%d and GetLastError=%ld\n", + ret, GetLastError()); +} + +START_TEST(environ) +{ + test_GetSetEnvironmentVariableA(); + test_GetSetEnvironmentVariableW(); +} diff --git a/reactos/apps/tests/kernel32/file.c b/reactos/apps/tests/kernel32/file.c new file mode 100644 index 00000000000..1e754d66a1f --- /dev/null +++ b/reactos/apps/tests/kernel32/file.c @@ -0,0 +1,1006 @@ +/* + * Unit tests for file functions in Wine + * + * Copyright (c) 2002 Jakob Eriksson + * + * 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 "wine/test.h" +#include "windef.h" +#include "winbase.h" +#include "winerror.h" + +LPCSTR filename = "testfile.xxx"; +LPCSTR sillytext = +"en larvig liten text dx \033 gx hej 84 hej 4484 ! \001\033 bla bl\na.. bla bla." +"1234 43 4kljf lf &%%%&&&&&& 34 4 34 3############# 33 3 3 3 # 3## 3" +"1234 43 4kljf lf &%%%&&&&&& 34 4 34 3############# 33 3 3 3 # 3## 3" +"1234 43 4kljf lf &%%%&&&&&& 34 4 34 3############# 33 3 3 3 # 3## 3" +"1234 43 4kljf lf &%%%&&&&&& 34 4 34 3############# 33 3 3 3 # 3## 3" +"1234 43 4kljf lf &%%%&&&&&& 34 4 34 3############# 33 3 3 3 # 3## 3" +"1234 43 4kljf lf &%%%&&&&&& 34 4 34 3############# 33 3 3 3 # 3## 3" +"1234 43 4kljf lf &%%%&&&&&& 34 4 34 3############# 33 3 3 3 # 3## 3" +"1234 43 4kljf lf &%%%&&&&&& 34 4 34 3############# 33 3 3 3 # 3## 3" +"sdlkfjasdlkfj a dslkj adsklf \n \nasdklf askldfa sdlkf \nsadklf asdklf asdf "; + + +static void test__hread( void ) +{ + HFILE filehandle; + char buffer[10000]; + long bytes_read; + long bytes_wanted; + long i; + + SetFileAttributesA(filename,FILE_ATTRIBUTE_NORMAL); /* be sure to remove stale files */ + DeleteFileA( filename ); + filehandle = _lcreat( filename, 0 ); + if (filehandle == HFILE_ERROR) + { + ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError()); + return; + } + + ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains\n" ); + + ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" ); + + filehandle = _lopen( filename, OF_READ ); + + ok( HFILE_ERROR != filehandle, "couldn't open file \"%s\" again (err=%ld)\n", filename, GetLastError( ) ); + + bytes_read = _hread( filehandle, buffer, 2 * strlen( sillytext ) ); + + ok( lstrlenA( sillytext ) == bytes_read, "file read size error\n" ); + + for (bytes_wanted = 0; bytes_wanted < lstrlenA( sillytext ); bytes_wanted++) + { + ok( 0 == _llseek( filehandle, 0, FILE_BEGIN ), "_llseek complains\n" ); + ok( _hread( filehandle, buffer, bytes_wanted ) == bytes_wanted, "erratic _hread return value\n" ); + for (i = 0; i < bytes_wanted; i++) + { + ok( buffer[i] == sillytext[i], "that's not what's written\n" ); + } + } + + ok( HFILE_ERROR != _lclose( filehandle ), "_lclose complains\n" ); + + ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)\n", GetLastError( ) ); +} + + +static void test__hwrite( void ) +{ + HFILE filehandle; + char buffer[10000]; + long bytes_read; + long bytes_written; + long blocks; + long i; + char *contents; + HLOCAL memory_object; + char checksum[1]; + + filehandle = _lcreat( filename, 0 ); + if (filehandle == HFILE_ERROR) + { + ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError()); + return; + } + + ok( HFILE_ERROR != _hwrite( filehandle, "", 0 ), "_hwrite complains\n" ); + + ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" ); + + filehandle = _lopen( filename, OF_READ ); + + bytes_read = _hread( filehandle, buffer, 1); + + ok( 0 == bytes_read, "file read size error\n" ); + + ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" ); + + filehandle = _lopen( filename, OF_READWRITE ); + + bytes_written = 0; + checksum[0] = '\0'; + srand( (unsigned)time( NULL ) ); + for (blocks = 0; blocks < 100; blocks++) + { + for (i = 0; i < (long)sizeof( buffer ); i++) + { + buffer[i] = rand( ); + checksum[0] = checksum[0] + buffer[i]; + } + ok( HFILE_ERROR != _hwrite( filehandle, buffer, sizeof( buffer ) ), "_hwrite complains\n" ); + bytes_written = bytes_written + sizeof( buffer ); + } + + ok( HFILE_ERROR != _hwrite( filehandle, checksum, 1 ), "_hwrite complains\n" ); + bytes_written++; + + ok( HFILE_ERROR != _lclose( filehandle ), "_lclose complains\n" ); + + memory_object = LocalAlloc( LPTR, bytes_written ); + + ok( 0 != memory_object, "LocalAlloc fails. (Could be out of memory.)\n" ); + + contents = LocalLock( memory_object ); + + filehandle = _lopen( filename, OF_READ ); + + contents = LocalLock( memory_object ); + + ok( NULL != contents, "LocalLock whines\n" ); + + ok( bytes_written == _hread( filehandle, contents, bytes_written), "read length differ from write length\n" ); + + checksum[0] = '\0'; + i = 0; + do + { + checksum[0] = checksum[0] + contents[i]; + i++; + } + while (i < bytes_written - 1); + + ok( checksum[0] == contents[i], "stored checksum differ from computed checksum\n" ); + + ok( HFILE_ERROR != _lclose( filehandle ), "_lclose complains\n" ); + + ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)\n", GetLastError( ) ); +} + + +static void test__lclose( void ) +{ + HFILE filehandle; + + filehandle = _lcreat( filename, 0 ); + if (filehandle == HFILE_ERROR) + { + ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError()); + return; + } + + ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains\n" ); + + ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" ); + + ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)\n", GetLastError( ) ); +} + + +static void test__lcreat( void ) +{ + HFILE filehandle; + char buffer[10000]; + WIN32_FIND_DATAA search_results; + char slashname[] = "testfi/"; + int err; + HANDLE find; + + filehandle = _lcreat( filename, 0 ); + if (filehandle == HFILE_ERROR) + { + ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError()); + return; + } + + ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains\n" ); + + ok( 0 == _llseek( filehandle, 0, FILE_BEGIN ), "_llseek complains\n" ); + + ok( _hread( filehandle, buffer, strlen( sillytext ) ) == lstrlenA( sillytext ), "erratic _hread return value\n" ); + + ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" ); + + ok( INVALID_HANDLE_VALUE != FindFirstFileA( filename, &search_results ), "should be able to find file\n" ); + + ok( DeleteFileA(filename) != 0, "DeleteFile failed (%ld)\n", GetLastError()); + + filehandle = _lcreat( filename, 1 ); /* readonly */ + ok( HFILE_ERROR != filehandle, "couldn't create file \"%s\" (err=%ld)\n", filename, GetLastError( ) ); + + ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite shouldn't be able to write never the less\n" ); + + ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" ); + + ok( INVALID_HANDLE_VALUE != FindFirstFileA( filename, &search_results ), "should be able to find file\n" ); + + ok( 0 == DeleteFileA( filename ), "shouldn't be able to delete a readonly file\n" ); + + ok( SetFileAttributesA(filename, FILE_ATTRIBUTE_NORMAL ) != 0, "couldn't change attributes on file\n" ); + + ok( DeleteFileA( filename ) != 0, "now it should be possible to delete the file!\n" ); + + filehandle = _lcreat( filename, 2 ); + ok( HFILE_ERROR != filehandle, "couldn't create file \"%s\" (err=%ld)\n", filename, GetLastError( ) ); + + ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains\n" ); + + ok( 0 == _llseek( filehandle, 0, FILE_BEGIN ), "_llseek complains\n" ); + + ok( _hread( filehandle, buffer, strlen( sillytext ) ) == lstrlenA( sillytext ), "erratic _hread return value\n" ); + + ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" ); + + ok( INVALID_HANDLE_VALUE != FindFirstFileA( filename, &search_results ), "should STILL be able to find file\n" ); + + ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)\n", GetLastError( ) ); + + filehandle = _lcreat( filename, 4 ); /* SYSTEM file */ + ok( HFILE_ERROR != filehandle, "couldn't create file \"%s\" (err=%ld)\n", filename, GetLastError( ) ); + + ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains\n" ); + + ok( 0 == _llseek( filehandle, 0, FILE_BEGIN ), "_llseek complains\n" ); + + ok( _hread( filehandle, buffer, strlen( sillytext ) ) == lstrlenA( sillytext ), "erratic _hread return value\n" ); + + ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" ); + + ok( INVALID_HANDLE_VALUE != FindFirstFileA( filename, &search_results ), "should STILL be able to find file\n" ); + + ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)\n", GetLastError( ) ); + + filehandle=_lcreat (slashname, 0); /* illegal name */ + if (HFILE_ERROR==filehandle) { + err=GetLastError (); + ok (err==ERROR_INVALID_NAME || err==ERROR_PATH_NOT_FOUND, + "creating file \"%s\" failed with error %d\n", slashname, err); + } else { /* only NT succeeds */ + _lclose(filehandle); + find=FindFirstFileA (slashname, &search_results); + if (INVALID_HANDLE_VALUE==find) + ok (0, "file \"%s\" not found\n", slashname); + else { + ok (0!=FindClose (find), "FindClose complains (%ld)\n", GetLastError ()); + slashname[strlen(slashname)-1]=0; + ok (!strcmp (slashname, search_results.cFileName), + "found unexpected name \"%s\"\n", search_results.cFileName); + ok (FILE_ATTRIBUTE_ARCHIVE==search_results.dwFileAttributes, + "attributes of file \"%s\" are 0x%04lx\n", search_results.cFileName, + search_results.dwFileAttributes); + } + ok (0!=DeleteFileA (slashname), "Can't delete \"%s\" (%ld)\n", slashname, + GetLastError ()); + } + + filehandle=_lcreat (filename, 8); /* illegal attribute */ + if (HFILE_ERROR==filehandle) + ok (0, "couldn't create volume label \"%s\"\n", filename); + else { + _lclose(filehandle); + find=FindFirstFileA (filename, &search_results); + if (INVALID_HANDLE_VALUE==find) + ok (0, "file \"%s\" not found\n", filename); + else { + ok (0!=FindClose (find), "FindClose complains (%ld)\n", GetLastError ()); + ok (!strcmp (filename, search_results.cFileName), + "found unexpected name \"%s\"\n", search_results.cFileName); + ok (FILE_ATTRIBUTE_ARCHIVE==search_results.dwFileAttributes, + "attributes of file \"%s\" are 0x%04lx\n", search_results.cFileName, + search_results.dwFileAttributes); + } + ok (0!=DeleteFileA (filename), "Can't delete \"%s\" (%ld)\n", slashname, + GetLastError ()); + } +} + + +static void test__llseek( void ) +{ + INT i; + HFILE filehandle; + char buffer[1]; + long bytes_read; + + filehandle = _lcreat( filename, 0 ); + if (filehandle == HFILE_ERROR) + { + ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError()); + return; + } + + for (i = 0; i < 400; i++) + { + ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains\n" ); + } + ok( HFILE_ERROR != _llseek( filehandle, 400 * strlen( sillytext ), FILE_CURRENT ), "should be able to seek\n" ); + ok( HFILE_ERROR != _llseek( filehandle, 27 + 35 * strlen( sillytext ), FILE_BEGIN ), "should be able to seek\n" ); + + bytes_read = _hread( filehandle, buffer, 1); + ok( 1 == bytes_read, "file read size error\n" ); + ok( buffer[0] == sillytext[27], "_llseek error, it got lost seeking\n" ); + ok( HFILE_ERROR != _llseek( filehandle, -400 * strlen( sillytext ), FILE_END ), "should be able to seek\n" ); + + bytes_read = _hread( filehandle, buffer, 1); + ok( 1 == bytes_read, "file read size error\n" ); + ok( buffer[0] == sillytext[0], "_llseek error, it got lost seeking\n" ); + ok( HFILE_ERROR != _llseek( filehandle, 1000000, FILE_END ), "should be able to seek past file; poor, poor Windows programmers\n" ); + ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" ); + + ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)\n", GetLastError( ) ); +} + + +static void test__llopen( void ) +{ + HFILE filehandle; + UINT bytes_read; + char buffer[10000]; + + filehandle = _lcreat( filename, 0 ); + if (filehandle == HFILE_ERROR) + { + ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError()); + return; + } + + ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains\n" ); + ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" ); + + filehandle = _lopen( filename, OF_READ ); + ok( HFILE_ERROR == _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite shouldn't be able to write!\n" ); + bytes_read = _hread( filehandle, buffer, strlen( sillytext ) ); + ok( strlen( sillytext ) == bytes_read, "file read size error\n" ); + ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" ); + + filehandle = _lopen( filename, OF_READWRITE ); + bytes_read = _hread( filehandle, buffer, 2 * strlen( sillytext ) ); + ok( strlen( sillytext ) == bytes_read, "file read size error\n" ); + ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite should write just fine\n" ); + ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" ); + + filehandle = _lopen( filename, OF_WRITE ); + ok( HFILE_ERROR == _hread( filehandle, buffer, 1 ), "you should only be able to write this file\n" ); + ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite should write just fine\n" ); + ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" ); + + ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)\n", GetLastError( ) ); + /* TODO - add tests for the SHARE modes - use two processes to pull this one off */ +} + + +static void test__lread( void ) +{ + HFILE filehandle; + char buffer[10000]; + long bytes_read; + UINT bytes_wanted; + UINT i; + + filehandle = _lcreat( filename, 0 ); + if (filehandle == HFILE_ERROR) + { + ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError()); + return; + } + + ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains\n" ); + + ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" ); + + filehandle = _lopen( filename, OF_READ ); + + ok( HFILE_ERROR != filehandle, "couldn't open file \"%s\" again (err=%ld)\n", filename, GetLastError()); + + bytes_read = _lread( filehandle, buffer, 2 * strlen( sillytext ) ); + + ok( lstrlenA( sillytext ) == bytes_read, "file read size error\n" ); + + for (bytes_wanted = 0; bytes_wanted < strlen( sillytext ); bytes_wanted++) + { + ok( 0 == _llseek( filehandle, 0, FILE_BEGIN ), "_llseek complains\n" ); + ok( _lread( filehandle, buffer, bytes_wanted ) == bytes_wanted, "erratic _hread return value\n" ); + for (i = 0; i < bytes_wanted; i++) + { + ok( buffer[i] == sillytext[i], "that's not what's written\n" ); + } + } + + ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" ); + + ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)\n", GetLastError( ) ); +} + + +static void test__lwrite( void ) +{ + HFILE filehandle; + char buffer[10000]; + long bytes_read; + long bytes_written; + long blocks; + long i; + char *contents; + HLOCAL memory_object; + char checksum[1]; + + filehandle = _lcreat( filename, 0 ); + if (filehandle == HFILE_ERROR) + { + ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError()); + return; + } + + ok( HFILE_ERROR != _lwrite( filehandle, "", 0 ), "_hwrite complains\n" ); + + ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" ); + + filehandle = _lopen( filename, OF_READ ); + + bytes_read = _hread( filehandle, buffer, 1); + + ok( 0 == bytes_read, "file read size error\n" ); + + ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" ); + + filehandle = _lopen( filename, OF_READWRITE ); + + bytes_written = 0; + checksum[0] = '\0'; + srand( (unsigned)time( NULL ) ); + for (blocks = 0; blocks < 100; blocks++) + { + for (i = 0; i < (long)sizeof( buffer ); i++) + { + buffer[i] = rand( ); + checksum[0] = checksum[0] + buffer[i]; + } + ok( HFILE_ERROR != _lwrite( filehandle, buffer, sizeof( buffer ) ), "_hwrite complains\n" ); + bytes_written = bytes_written + sizeof( buffer ); + } + + ok( HFILE_ERROR != _lwrite( filehandle, checksum, 1 ), "_hwrite complains\n" ); + bytes_written++; + + ok( HFILE_ERROR != _lclose( filehandle ), "_lclose complains\n" ); + + memory_object = LocalAlloc( LPTR, bytes_written ); + + ok( 0 != memory_object, "LocalAlloc fails, could be out of memory\n" ); + + contents = LocalLock( memory_object ); + + filehandle = _lopen( filename, OF_READ ); + + contents = LocalLock( memory_object ); + + ok( NULL != contents, "LocalLock whines\n" ); + + ok( bytes_written == _hread( filehandle, contents, bytes_written), "read length differ from write length\n" ); + + checksum[0] = '\0'; + i = 0; + do + { + checksum[0] += contents[i]; + i++; + } + while (i < bytes_written - 1); + + ok( checksum[0] == contents[i], "stored checksum differ from computed checksum\n" ); + + ok( HFILE_ERROR != _lclose( filehandle ), "_lclose complains\n" ); + + ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)\n", GetLastError( ) ); +} + +static void test_CopyFileA(void) +{ + char temp_path[MAX_PATH]; + char source[MAX_PATH], dest[MAX_PATH]; + static const char prefix[] = "pfx"; + DWORD ret; + + ret = GetTempPathA(MAX_PATH, temp_path); + ok(ret != 0, "GetTempPathA error %ld\n", GetLastError()); + ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n"); + + ret = GetTempFileNameA(temp_path, prefix, 0, source); + ok(ret != 0, "GetTempFileNameA error %ld\n", GetLastError()); + + ret = GetTempFileNameA(temp_path, prefix, 0, dest); + ok(ret != 0, "GetTempFileNameA error %ld\n", GetLastError()); + + ret = CopyFileA(source, dest, TRUE); + ok(!ret && GetLastError() == ERROR_FILE_EXISTS, + "CopyFileA: unexpected error %ld\n", GetLastError()); + + ret = CopyFileA(source, dest, FALSE); + ok(ret, "CopyFileA: error %ld\n", GetLastError()); + + ret = DeleteFileA(source); + ok(ret, "DeleteFileA: error %ld\n", GetLastError()); + ret = DeleteFileA(dest); + ok(ret, "DeleteFileA: error %ld\n", GetLastError()); +} + +static void test_CopyFileW(void) +{ + WCHAR temp_path[MAX_PATH]; + WCHAR source[MAX_PATH], dest[MAX_PATH]; + static const WCHAR prefix[] = {'p','f','x',0}; + DWORD ret; + + ret = GetTempPathW(MAX_PATH, temp_path); + if (ret==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) + return; + ok(ret != 0, "GetTempPathW error %ld\n", GetLastError()); + ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n"); + + ret = GetTempFileNameW(temp_path, prefix, 0, source); + ok(ret != 0, "GetTempFileNameW error %ld\n", GetLastError()); + + ret = GetTempFileNameW(temp_path, prefix, 0, dest); + ok(ret != 0, "GetTempFileNameW error %ld\n", GetLastError()); + + ret = CopyFileW(source, dest, TRUE); + ok(!ret && GetLastError() == ERROR_FILE_EXISTS, + "CopyFileW: unexpected error %ld\n", GetLastError()); + + ret = CopyFileW(source, dest, FALSE); + ok(ret, "CopyFileW: error %ld\n", GetLastError()); + + ret = DeleteFileW(source); + ok(ret, "DeleteFileW: error %ld\n", GetLastError()); + ret = DeleteFileW(dest); + ok(ret, "DeleteFileW: error %ld\n", GetLastError()); +} + +static void test_CreateFileA(void) +{ + HANDLE hFile; + char temp_path[MAX_PATH]; + char filename[MAX_PATH]; + static const char prefix[] = "pfx"; + DWORD ret; + + ret = GetTempPathA(MAX_PATH, temp_path); + ok(ret != 0, "GetTempPathA error %ld\n", GetLastError()); + ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n"); + + ret = GetTempFileNameA(temp_path, prefix, 0, filename); + ok(ret != 0, "GetTempFileNameA error %ld\n", GetLastError()); + + hFile = CreateFileA(filename, GENERIC_READ, 0, NULL, + CREATE_NEW, FILE_FLAG_RANDOM_ACCESS, 0); + ok(hFile == INVALID_HANDLE_VALUE && GetLastError() == ERROR_FILE_EXISTS, + "CREATE_NEW should fail if file exists and last error value should be ERROR_FILE_EXISTS\n"); + + ret = DeleteFileA(filename); + ok(ret, "DeleteFileA: error %ld\n", GetLastError()); +} + +static void test_CreateFileW(void) +{ + HANDLE hFile; + WCHAR temp_path[MAX_PATH]; + WCHAR filename[MAX_PATH]; + static const WCHAR prefix[] = {'p','f','x',0}; + DWORD ret; + + ret = GetTempPathW(MAX_PATH, temp_path); + if (ret==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) + return; + ok(ret != 0, "GetTempPathW error %ld\n", GetLastError()); + ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n"); + + ret = GetTempFileNameW(temp_path, prefix, 0, filename); + ok(ret != 0, "GetTempFileNameW error %ld\n", GetLastError()); + + hFile = CreateFileW(filename, GENERIC_READ, 0, NULL, + CREATE_NEW, FILE_FLAG_RANDOM_ACCESS, 0); + ok(hFile == INVALID_HANDLE_VALUE && GetLastError() == ERROR_FILE_EXISTS, + "CREATE_NEW should fail if file exists and last error value should be ERROR_FILE_EXISTS\n"); + + ret = DeleteFileW(filename); + ok(ret, "DeleteFileW: error %ld\n", GetLastError()); +} + + +static void test_GetTempFileNameA() { + UINT result; + char out[MAX_PATH]; + char *expected = "c:\\windows\\abc2.tmp"; + + /* this test may depend on the config file settings */ + result = GetTempFileNameA("C:", "abc", 1, out); + ok( result != 0, "GetTempFileNameA: error %ld\n", GetLastError() ); + ok( ((out[0] == 'C') && (out[1] == ':')) && (out[2] == '\\'), "GetTempFileNameA: first three characters should be C:\\, string was actually %s\n", out ); + + result = GetTempFileNameA("c:\\windows\\", "abc", 2, out); + ok( result != 0, "GetTempFileNameA: error %ld\n", GetLastError() ); + ok( lstrcmpiA( out, expected ) == 0, "GetTempFileNameA: Unexpected output \"%s\" vs \"%s\"\n", out, expected ); +} + + +static void test_DeleteFileA( void ) +{ + BOOL ret; + + ret = DeleteFileA(NULL); + ok(!ret && (GetLastError() == ERROR_INVALID_PARAMETER || + GetLastError() == ERROR_PATH_NOT_FOUND), + "DeleteFileA(NULL) returned ret=%d error=%ld\n",ret,GetLastError()); + + ret = DeleteFileA(""); + ok(!ret && (GetLastError() == ERROR_PATH_NOT_FOUND || + GetLastError() == ERROR_BAD_PATHNAME), + "DeleteFileA(\"\") returned ret=%d error=%ld\n",ret,GetLastError()); +} + +static void test_DeleteFileW( void ) +{ + BOOL ret; + WCHAR emptyW[]={'\0'}; + + ret = DeleteFileW(NULL); + if (ret==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) + return; + ok(!ret && GetLastError() == ERROR_PATH_NOT_FOUND, + "DeleteFileW(NULL) returned ret=%d error=%ld\n",ret,GetLastError()); + + ret = DeleteFileW(emptyW); + ok(!ret && GetLastError() == ERROR_PATH_NOT_FOUND, + "DeleteFileW(\"\") returned ret=%d error=%ld\n",ret,GetLastError()); +} + +#define IsDotDir(x) ((x[0] == '.') && ((x[1] == 0) || ((x[1] == '.') && (x[2] == 0)))) + +static void test_MoveFileA(void) +{ + char tempdir[MAX_PATH]; + char source[MAX_PATH], dest[MAX_PATH]; + static const char prefix[] = "pfx"; + DWORD ret; + + ret = GetTempPathA(MAX_PATH, tempdir); + ok(ret != 0, "GetTempPathA error %ld\n", GetLastError()); + ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n"); + + ret = GetTempFileNameA(tempdir, prefix, 0, source); + ok(ret != 0, "GetTempFileNameA error %ld\n", GetLastError()); + + ret = GetTempFileNameA(tempdir, prefix, 0, dest); + ok(ret != 0, "GetTempFileNameA error %ld\n", GetLastError()); + + ret = MoveFileA(source, dest); + ok(!ret && GetLastError() == ERROR_ALREADY_EXISTS, + "MoveFileA: unexpected error %ld\n", GetLastError()); + + ret = DeleteFileA(dest); + ok(ret, "DeleteFileA: error %ld\n", GetLastError()); + + ret = MoveFileA(source, dest); + ok(ret, "MoveFileA: failed, error %ld\n", GetLastError()); + + lstrcatA(tempdir, "Remove Me"); + ret = CreateDirectoryA(tempdir, NULL); + ok(ret == TRUE, "CreateDirectoryA failed\n"); + + lstrcpyA(source, dest); + lstrcpyA(dest, tempdir); + lstrcatA(dest, "\\wild?.*"); + ret = MoveFileA(source, dest); + todo_wine { + ok(!ret, "MoveFileA: shouldn't move to wildcard file\n"); + ok(GetLastError() == ERROR_INVALID_NAME, + "MoveFileA: with wildcards, unexpected error %ld\n", GetLastError()); +#if 0 + if (ret || (GetLastError() != ERROR_INVALID_NAME)) + { + WIN32_FIND_DATAA fd; + char temppath[MAX_PATH]; + HANDLE hFind; + + lstrcpyA(temppath, tempdir); + lstrcatA(temppath, "\\*.*"); + hFind = FindFirstFileA(temppath, &fd); + if (INVALID_HANDLE_VALUE != hFind) + { + LPSTR lpName; + do + { + lpName = fd.cAlternateFileName; + if (!lpName[0]) + lpName = fd.cFileName; + ok(IsDotDir(lpName), "MoveFileA: wildcards file created!\n"); + } + while (FindNextFileA(hFind, &fd)); + FindClose(hFind); + } + } +#endif + ret = DeleteFileA(source); + ok(ret, "DeleteFileA: error %ld\n", GetLastError()); + ret = DeleteFileA(dest); + ok(!ret, "DeleteFileA: error %ld\n", GetLastError()); + } + + ret = RemoveDirectoryA(tempdir); + ok(ret, "DeleteDirectoryA: error %ld\n", GetLastError()); +} + +static void test_MoveFileW(void) +{ + WCHAR temp_path[MAX_PATH]; + WCHAR source[MAX_PATH], dest[MAX_PATH]; + static const WCHAR prefix[] = {'p','f','x',0}; + DWORD ret; + + ret = GetTempPathW(MAX_PATH, temp_path); + if (ret==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) + return; + ok(ret != 0, "GetTempPathW error %ld\n", GetLastError()); + ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n"); + + ret = GetTempFileNameW(temp_path, prefix, 0, source); + ok(ret != 0, "GetTempFileNameW error %ld\n", GetLastError()); + + ret = GetTempFileNameW(temp_path, prefix, 0, dest); + ok(ret != 0, "GetTempFileNameW error %ld\n", GetLastError()); + + ret = MoveFileW(source, dest); + ok(!ret && GetLastError() == ERROR_ALREADY_EXISTS, + "CopyFileW: unexpected error %ld\n", GetLastError()); + + ret = DeleteFileW(source); + ok(ret, "DeleteFileW: error %ld\n", GetLastError()); + ret = DeleteFileW(dest); + ok(ret, "DeleteFileW: error %ld\n", GetLastError()); +} + +#define PATTERN_OFFSET 0x10 + +static void test_offset_in_overlapped_structure(void) +{ + HANDLE hFile; + OVERLAPPED ov; + DWORD done; + BOOL rc; + BYTE buf[256], pattern[] = "TeSt"; + UINT i; + char temp_path[MAX_PATH], temp_fname[MAX_PATH]; + + ok(GetTempPathA(MAX_PATH, temp_path) != 0, "GetTempPathA error %ld\n", GetLastError()); + ok(GetTempFileNameA(temp_path, "pfx", 0, temp_fname) != 0, "GetTempFileNameA error %ld\n", GetLastError()); + + /*** Write File *****************************************************/ + + hFile = CreateFileA(temp_fname, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); + ok(hFile != INVALID_HANDLE_VALUE, "CreateFileA error %ld\n", GetLastError()); + + for(i = 0; i < sizeof(buf); i++) buf[i] = i; + ok(WriteFile(hFile, buf, sizeof(buf), &done, NULL), "WriteFile error %ld\n", GetLastError()); + ok(done == sizeof(buf), "expected number of bytes written %lu\n", done); + + memset(&ov, 0, sizeof(ov)); + ov.Offset = PATTERN_OFFSET; + ov.OffsetHigh = 0; + rc=WriteFile(hFile, pattern, sizeof(pattern), &done, &ov); + /* Win 9x does not support the overlapped I/O on files */ + if (rc || GetLastError()!=ERROR_INVALID_PARAMETER) { + ok(rc, "WriteFile error %ld\n", GetLastError()); + ok(done == sizeof(pattern), "expected number of bytes written %lu\n", done); + trace("Current offset = %04lx\n", SetFilePointer(hFile, 0, NULL, FILE_CURRENT)); + ok(SetFilePointer(hFile, 0, NULL, FILE_CURRENT) == (PATTERN_OFFSET + sizeof(pattern)), + "expected file offset %d\n", PATTERN_OFFSET + sizeof(pattern)); + + ov.Offset = sizeof(buf) * 2; + ov.OffsetHigh = 0; + ok(WriteFile(hFile, pattern, sizeof(pattern), &done, &ov), "WriteFile error %ld\n", GetLastError()); + ok(done == sizeof(pattern), "expected number of bytes written %lu\n", done); + /*trace("Current offset = %04lx\n", SetFilePointer(hFile, 0, NULL, FILE_CURRENT));*/ + ok(SetFilePointer(hFile, 0, NULL, FILE_CURRENT) == (sizeof(buf) * 2 + sizeof(pattern)), + "expected file offset %d\n", sizeof(buf) * 2 + sizeof(pattern)); + } + + CloseHandle(hFile); + + /*** Read File *****************************************************/ + + hFile = CreateFileA(temp_fname, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0); + ok(hFile != INVALID_HANDLE_VALUE, "CreateFileA error %ld\n", GetLastError()); + + memset(buf, 0, sizeof(buf)); + memset(&ov, 0, sizeof(ov)); + ov.Offset = PATTERN_OFFSET; + ov.OffsetHigh = 0; + rc=ReadFile(hFile, buf, sizeof(pattern), &done, &ov); + /* Win 9x does not support the overlapped I/O on files */ + if (rc || GetLastError()!=ERROR_INVALID_PARAMETER) { + ok(rc, "ReadFile error %ld\n", GetLastError()); + ok(done == sizeof(pattern), "expected number of bytes read %lu\n", done); + trace("Current offset = %04lx\n", SetFilePointer(hFile, 0, NULL, FILE_CURRENT)); + ok(SetFilePointer(hFile, 0, NULL, FILE_CURRENT) == (PATTERN_OFFSET + sizeof(pattern)), + "expected file offset %d\n", PATTERN_OFFSET + sizeof(pattern)); + ok(!memcmp(buf, pattern, sizeof(pattern)), "pattern match failed\n"); + } + + CloseHandle(hFile); + + ok(DeleteFileA(temp_fname), "DeleteFileA error %ld\n", GetLastError()); +} + +static void test_LockFile(void) +{ + HANDLE handle; + DWORD written; + OVERLAPPED overlapped; + + handle = CreateFileA( filename, GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, + CREATE_ALWAYS, 0, 0 ); + if (handle == INVALID_HANDLE_VALUE) + { + ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError()); + return; + } + ok( WriteFile( handle, sillytext, strlen(sillytext), &written, NULL ), "write failed\n" ); + + ok( LockFile( handle, 0, 0, 0, 0 ), "LockFile failed\n" ); + ok( UnlockFile( handle, 0, 0, 0, 0 ), "UnlockFile failed\n" ); + ok( !UnlockFile( handle, 0, 0, 0, 0 ), "UnlockFile succeeded\n" ); + + ok( LockFile( handle, 10, 0, 20, 0 ), "LockFile 10,20 failed\n" ); + /* overlapping locks must fail */ + ok( !LockFile( handle, 12, 0, 10, 0 ), "LockFile 12,10 succeeded\n" ); + ok( !LockFile( handle, 5, 0, 6, 0 ), "LockFile 5,6 succeeded\n" ); + /* non-overlapping locks must succeed */ + ok( LockFile( handle, 5, 0, 5, 0 ), "LockFile 5,5 failed\n" ); + + ok( !UnlockFile( handle, 10, 0, 10, 0 ), "UnlockFile 10,10 succeeded\n" ); + ok( UnlockFile( handle, 10, 0, 20, 0 ), "UnlockFile 10,20 failed\n" ); + ok( !UnlockFile( handle, 10, 0, 20, 0 ), "UnlockFile 10,20 again succeeded\n" ); + ok( UnlockFile( handle, 5, 0, 5, 0 ), "UnlockFile 5,5 failed\n" ); + + overlapped.Offset = 100; + overlapped.OffsetHigh = 0; + overlapped.hEvent = 0; + ok( LockFileEx( handle, 0, 0, 100, 0, &overlapped ), "LockFileEx 100,100 failed\n" ); + /* overlapping shared locks are OK */ + overlapped.Offset = 150; + ok( LockFileEx( handle, 0, 0, 100, 0, &overlapped ), "LockFileEx 150,100 failed\n" ); + /* but exclusive is not */ + ok( !LockFileEx( handle, LOCKFILE_EXCLUSIVE_LOCK|LOCKFILE_FAIL_IMMEDIATELY, 0, 50, 0, &overlapped ), + "LockFileEx exclusive 150,50 succeeded\n" ); + ok( UnlockFileEx( handle, 0, 100, 0, &overlapped ), "UnlockFileEx 150,100 failed\n" ); + ok( !UnlockFileEx( handle, 0, 100, 0, &overlapped ), "UnlockFileEx 150,100 again succeeded\n" ); + overlapped.Offset = 100; + ok( UnlockFileEx( handle, 0, 100, 0, &overlapped ), "UnlockFileEx 100,100 failed\n" ); + ok( !UnlockFileEx( handle, 0, 100, 0, &overlapped ), "UnlockFileEx 100,100 again succeeded\n" ); + + ok( LockFile( handle, 0, 0x10000000, 0, 0xf0000000 ), "LockFile failed\n" ); + ok( !LockFile( handle, ~0, ~0, 1, 0 ), "LockFile ~0,1 succeeded\n" ); + ok( !LockFile( handle, 0, 0x20000000, 20, 0 ), "LockFile 0x20000000,20 succeeded\n" ); + ok( UnlockFile( handle, 0, 0x10000000, 0, 0xf0000000 ), "UnlockFile failed\n" ); + + /* wrap-around lock should not do anything */ + /* (but still succeeds on NT4 so we don't check result) */ + LockFile( handle, 0, 0x10000000, 0, 0xf0000001 ); + ok( LockFile( handle, ~0, ~0, 1, 0 ), "LockFile ~0,1 failed\n" ); + ok( UnlockFile( handle, ~0, ~0, 1, 0 ), "Unlockfile ~0,1 failed\n" ); + + /* zero-byte lock */ + ok( LockFile( handle, 100, 0, 0, 0 ), "LockFile 100,0 failed\n" ); + ok( !LockFile( handle, 98, 0, 4, 0 ), "LockFile 98,4 succeeded\n" ); + ok( LockFile( handle, 90, 0, 10, 0 ), "LockFile 90,10 failed\n" ); + ok( LockFile( handle, 100, 0, 10, 0 ), "LockFile 100,10 failed\n" ); + ok( UnlockFile( handle, 90, 0, 10, 0 ), "UnlockFile 90,10 failed\n" ); + ok( UnlockFile( handle, 100, 0, 10, 0 ), "UnlockFile 100,10 failed\n" ); + ok( UnlockFile( handle, 100, 0, 0, 0 ), "UnlockFile 100,0 failed\n" ); + + CloseHandle( handle ); + DeleteFileA( filename ); +} + +static void test_FindFirstFileA() +{ + HANDLE handle; + WIN32_FIND_DATAA search_results; + int err; + + handle = FindFirstFileA("C:\\",&search_results); + err = GetLastError(); + ok ( handle == INVALID_HANDLE_VALUE , "FindFirstFile on Root directory should Fail\n"); + if (handle == INVALID_HANDLE_VALUE) + ok ( err == ERROR_FILE_NOT_FOUND, "Bad Error number %d\n", err); + handle = FindFirstFileA("C:\\*",&search_results); + ok ( handle != INVALID_HANDLE_VALUE, "FindFirstFile on C:\\* should succeed\n" ); + ok ( FindClose(handle) == TRUE, "Failed to close handle\n"); +} + +static void test_FindNextFileA() +{ + HANDLE handle; + WIN32_FIND_DATAA search_results; + int err; + + handle = FindFirstFileA("C:\\*",&search_results); + ok ( handle != INVALID_HANDLE_VALUE, "FindFirstFile on C:\\* should succeed\n" ); + while (FindNextFile(handle, &search_results)) + { + /* get to the end of the files */ + } + ok ( FindClose(handle) == TRUE, "Failed to close handle\n"); + err = GetLastError(); + ok ( err == ERROR_NO_MORE_FILES, "GetLastError should return ERROR_NO_MORE_FILES\n"); +} + +static void test_MapFile() +{ + HANDLE handle, hmap; + + /* be sure to remove stale files */ + SetFileAttributesA(filename,FILE_ATTRIBUTE_NORMAL); + DeleteFile(filename); + handle = CreateFile( filename, GENERIC_READ|GENERIC_WRITE, 0, 0, + CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); + ok( handle != INVALID_HANDLE_VALUE, "couldn't create test file\n"); + + hmap = CreateFileMapping( handle, NULL, PAGE_READWRITE, 0, 0, NULL ); + ok( hmap == NULL, "mapped zero size file\n"); + ok( GetLastError() == ERROR_FILE_INVALID, "not ERROR_FILE_INVALID\n"); + + hmap = CreateFileMapping( handle, NULL, PAGE_READWRITE, 0x1000, 0, NULL ); + ok( hmap == NULL, "mapping should fail\n"); + /* GetLastError() varies between win9x and WinNT */ + + hmap = CreateFileMapping( handle, NULL, PAGE_READWRITE, 0x1000, 0x10000, NULL ); + ok( hmap == NULL, "mapping should fail\n"); + /* GetLastError() varies between win9x and WinNT */ + + hmap = CreateFileMapping( handle, NULL, PAGE_READWRITE, 0, 0x1000, NULL ); + ok( hmap != NULL, "mapping should succeed\n"); + + ok( CloseHandle( hmap ), "can't close mapping handle\n"); + ok( CloseHandle( handle ), "can't close file handle\n"); + ok( DeleteFileA( filename ), "DeleteFile failed after map\n" ); +} + +START_TEST(file) +{ + test__hread( ); + test__hwrite( ); + test__lclose( ); + test__lcreat( ); + test__llseek( ); + test__llopen( ); + test__lread( ); + test__lwrite( ); + test_GetTempFileNameA(); + test_CopyFileA(); + test_CopyFileW(); + test_CreateFileA(); + test_CreateFileW(); + test_DeleteFileA(); + test_DeleteFileW(); + test_MoveFileA(); + test_MoveFileW(); + test_FindFirstFileA(); + test_FindNextFileA(); + test_LockFile(); + test_offset_in_overlapped_structure(); + test_MapFile(); +} diff --git a/reactos/apps/tests/kernel32/format_msg.c b/reactos/apps/tests/kernel32/format_msg.c new file mode 100644 index 00000000000..d19e3f4a032 --- /dev/null +++ b/reactos/apps/tests/kernel32/format_msg.c @@ -0,0 +1,226 @@ +/* Unit test suite for FormatMessageA + * + * Copyright 2002 Mike McCormack for CodeWeavers + * + * 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 "wine/test.h" +#include "windef.h" +#include "winbase.h" + +/* #define ok(cond,failstr) if(!(cond)) {printf("line %d : %s\n",__LINE__,failstr);exit(1);} */ + +DWORD doit(DWORD flags, LPCVOID src, DWORD msg_id, DWORD lang_id, + LPSTR out, DWORD outsize, ... ) +{ + va_list list; + DWORD r; + + va_start(list, outsize); + r = FormatMessageA(flags, src, msg_id, + lang_id, out, outsize, &list); + va_end(list); + return r; +} + +void test_message_from_string(void) +{ + CHAR out[0x100] = {0}; + DWORD r; + WCHAR szwTest[] = { 't','e','s','t',0}; + + /* the basics */ + r = FormatMessageA(FORMAT_MESSAGE_FROM_STRING, "test", 0, + 0, out, sizeof(out)/sizeof(CHAR),NULL); + ok(!strcmp("test", out),"failed out=[%s]\n",out); + ok(r==4,"failed: r=%ld\n",r); + + /* using the format feature */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!s!", 0, + 0, out, sizeof(out)/sizeof(CHAR), "test"); + ok(!strcmp("test", out),"failed out=[%s]\n",out); + ok(r==4,"failed: r=%ld\n",r); + + /* no format */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "%1", 0, + 0, out, sizeof(out)/sizeof(CHAR), "test"); + ok(!strcmp("test", out),"failed out=[%s]\n",out); + ok(r==4,"failed: r=%ld\n",r); + + /* two pieces */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "%1%2", 0, + 0, out, sizeof(out)/sizeof(CHAR), "te","st"); + ok(!strcmp("test", out),"failed out=[%s]\n",out); + ok(r==4,"failed: r=%ld\n",r); + + /* three pieces */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "%1%3%2%1", 0, + 0, out, sizeof(out)/sizeof(CHAR), "t","s","e"); + ok(!strcmp("test", out),"failed out=[%s]\n",out); + ok(r==4,"failed: r=%ld\n",r); + + /* s doesn't seem to work in format strings */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "%!s!", 0, + 0, out, sizeof(out)/sizeof(CHAR), "test"); + ok(!strcmp("!s!", out),"failed out=[%s]\n",out); + ok(r==3,"failed: r=%ld\n",r); + + /* S is unicode */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!S!", 0, + 0, out, sizeof(out)/sizeof(CHAR), szwTest); + ok(!strcmp("test", out),"failed out=[%s]\n",out); + ok(r==4,"failed: r=%ld\n",r); + + /* as characters */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!c!%2!c!%3!c!%1!c!", 0, + 0, out, sizeof(out)/sizeof(CHAR), 't','e','s'); + ok(!strcmp("test", out),"failed out=[%s]\n",out); + ok(r==4,"failed: r=%ld\n",r); + + /* some numbers */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!d!%2!d!%3!d!", 0, + 0, out, sizeof(out)/sizeof(CHAR), 1,2,3); + ok(!strcmp("123", out),"failed out=[%s]\n",out); + ok(r==3,"failed: r=%ld\n",r); + + /* a single digit with some spacing */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!4d!", 0, + 0, out, sizeof(out)/sizeof(CHAR), 1); + ok(!strcmp(" 1", out),"failed out=[%s]\n",out); + ok(r==4,"failed: r=%ld\n",r); + + /* a single digit, left justified */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!-4d!", 0, + 0, out, sizeof(out)/sizeof(CHAR), 1); + ok(!strcmp("1 ", out),"failed out=[%s]\n",out); + ok(r==4,"failed: r=%ld\n",r); + + /* two digit decimal number */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!4d!", 0, + 0, out, sizeof(out)/sizeof(CHAR), 11); + ok(!strcmp(" 11", out),"failed out=[%s]\n",out); + ok(r==4,"failed: r=%ld\n",r); + + /* a hex number */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!4x!", 0, + 0, out, sizeof(out)/sizeof(CHAR), 11); + ok(!strcmp(" b", out),"failed out=[%s]\n",out); + ok(r==4,"failed: r=%ld\n",r); + + /* a hex number, upper case */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!4X!", 0, + 0, out, sizeof(out)/sizeof(CHAR), 11); + ok(!strcmp(" B", out),"failed out=[%s]\n",out); + ok(r==4,"failed: r=%ld\n",r); + + /* a hex number, upper case, left justified */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!-4X!", 0, + 0, out, sizeof(out)/sizeof(CHAR), 11); + ok(!strcmp("B ", out),"failed out=[%s]\n",out); + ok(r==4,"failed: r=%ld\n",r); + + /* a long hex number, upper case */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!4X!", 0, + 0, out, sizeof(out)/sizeof(CHAR), 0x1ab); + ok(!strcmp(" 1AB", out),"failed out=[%s]\n",out); + ok(r==4,"failed: r=%ld\n",r); + + /* two percent... */ + r = doit(FORMAT_MESSAGE_FROM_STRING, " %%%% ", 0, + 0, out, sizeof(out)/sizeof(CHAR)); + ok(!strcmp(" %% ", out),"failed out=[%s]\n",out); + ok(r==4,"failed: r=%ld\n",r); + + /* periods are special cases */ + r = doit(FORMAT_MESSAGE_FROM_STRING, " %.%. %1!d!", 0, + 0, out, sizeof(out)/sizeof(CHAR), 0x1ab); + ok(!strcmp(" .. 427", out),"failed out=[%s]\n",out); + ok(r==7,"failed: r=%ld\n",r); + + /* %0 ends the line */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "test%0test", 0, + 0, out, sizeof(out)/sizeof(CHAR)); + ok(!strcmp("test", out),"failed out=[%s]\n",out); + ok(r==4,"failed: r=%ld\n",r); + + /* %! prints an exclaimation */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "yah%!%0 ", 0, + 0, out, sizeof(out)/sizeof(CHAR)); + ok(!strcmp("yah!", out),"failed out=[%s]\n",out); + ok(r==4,"failed: r=%ld\n",r); + + /* %space */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "% % ", 0, + 0, out, sizeof(out)/sizeof(CHAR)); + ok(!strcmp(" ", out),"failed out=[%s]\n",out); + ok(r==4,"failed: r=%ld\n",r); + + /* line feed */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "hi\n", 0, + 0, out, sizeof(out)/sizeof(CHAR)); + ok(!strcmp("hi\r\n", out),"failed out=[%s]\n",out); + ok(r==4,"failed: r=%ld\n",r); + + /* carriage return line feed */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "hi\r\n", 0, + 0, out, sizeof(out)/sizeof(CHAR)); + ok(!strcmp("hi\r\n", out),"failed out=[%s]\n",out); + ok(r==4,"failed: r=%ld\n",r); + + /* carriage return line feed */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "\r", 0, + 0, out, sizeof(out)/sizeof(CHAR)); + ok(!strcmp("\r\n", out),"failed out=[%s]\n",out); + ok(r==2,"failed: r=%ld\n",r); + + /* carriage return line feed */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "\r\r\n", 0, + 0, out, sizeof(out)/sizeof(CHAR)); + ok(!strcmp("\r\n\r\n", out),"failed out=[%s]\n",out); + ok(r==4,"failed: r=%ld\n",r); + + /* change of pace... test the low byte of dwflags */ + /* line feed */ + r = doit(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_MAX_WIDTH_MASK, "hi\n", 0, + 0, out, sizeof(out)/sizeof(CHAR)); + ok(!strcmp("hi ", out) || !strcmp("hi\r\n", out),"failed out=[%s]\n",out); + ok(r==3 || r==4,"failed: r=%ld\n",r); + + /* carriage return line feed */ + r = doit(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_MAX_WIDTH_MASK, "hi\r\n", 0, + 0, out, sizeof(out)/sizeof(CHAR)); + ok(!strcmp("hi ", out),"failed out=[%s]\n",out); + ok(r==3,"failed: r=%ld\n",r); + + /* carriage return line feed */ + r = doit(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_MAX_WIDTH_MASK, "\r", 0, + 0, out, sizeof(out)/sizeof(CHAR)); + ok(!strcmp(" ", out),"failed out=[%s]\n",out); + ok(r==1,"failed: r=%ld\n",r); + + /* carriage return line feed */ + r = doit(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_MAX_WIDTH_MASK, "\r\r\n", 0, + 0, out, sizeof(out)/sizeof(CHAR)); + ok(!strcmp(" ", out),"failed out=[%s]\n",out); + ok(r==2,"failed: r=%ld\n",r); +} + +START_TEST(format_msg) +{ + test_message_from_string(); +} diff --git a/reactos/apps/tests/kernel32/generated.c b/reactos/apps/tests/kernel32/generated.c new file mode 100644 index 00000000000..886ff5ff6c2 --- /dev/null +++ b/reactos/apps/tests/kernel32/generated.c @@ -0,0 +1,1015 @@ +/* File generated automatically from tools/winapi/test.dat; do not edit! */ +/* This file can be copied, modified and distributed without restriction. */ + +/* + * Unit tests for data structure packing + */ + +#define WINVER 0x0501 +#define _WIN32_IE 0x0501 +#define _WIN32_WINNT 0x0501 + +#define WINE_NOWINSOCK + +#include "windows.h" + +#include "wine/test.h" + +/*********************************************************************** + * Compability macros + */ + +#define DWORD_PTR UINT_PTR +#define LONG_PTR INT_PTR +#define ULONG_PTR UINT_PTR + +/*********************************************************************** + * Windows API extension + */ + +#if defined(_MSC_VER) && (_MSC_VER >= 1300) && defined(__cplusplus) +# define FIELD_ALIGNMENT(type, field) __alignof(((type*)0)->field) +#elif defined(__GNUC__) +# define FIELD_ALIGNMENT(type, field) __alignof__(((type*)0)->field) +#else +/* FIXME: Not sure if is possible to do without compiler extension */ +#endif + +#if defined(_MSC_VER) && (_MSC_VER >= 1300) && defined(__cplusplus) +# define _TYPE_ALIGNMENT(type) __alignof(type) +#elif defined(__GNUC__) +# define _TYPE_ALIGNMENT(type) __alignof__(type) +#else +/* + * FIXME: Not sure if is possible to do without compiler extension + * (if type is not just a name that is, if so the normal) + * TYPE_ALIGNMENT can be used) + */ +#endif + +#if !defined(TYPE_ALIGNMENT) && defined(_TYPE_ALIGNMENT) +# define TYPE_ALIGNMENT _TYPE_ALIGNMENT +#endif + +/*********************************************************************** + * Test helper macros + */ + +#ifdef FIELD_ALIGNMENT +# define TEST_FIELD_ALIGNMENT(type, field, align) \ + ok(FIELD_ALIGNMENT(type, field) == align, \ + "FIELD_ALIGNMENT(" #type ", " #field ") == %d (expected " #align ")\n", \ + FIELD_ALIGNMENT(type, field)) +#else +# define TEST_FIELD_ALIGNMENT(type, field, align) do { } while (0) +#endif + +#define TEST_FIELD_OFFSET(type, field, offset) \ + ok(FIELD_OFFSET(type, field) == offset, \ + "FIELD_OFFSET(" #type ", " #field ") == %ld (expected " #offset ")\n", \ + FIELD_OFFSET(type, field)) + +#ifdef _TYPE_ALIGNMENT +#define TEST__TYPE_ALIGNMENT(type, align) \ + ok(_TYPE_ALIGNMENT(type) == align, "TYPE_ALIGNMENT(" #type ") == %d (expected " #align ")\n", _TYPE_ALIGNMENT(type)) +#else +# define TEST__TYPE_ALIGNMENT(type, align) do { } while (0) +#endif + +#ifdef TYPE_ALIGNMENT +#define TEST_TYPE_ALIGNMENT(type, align) \ + ok(TYPE_ALIGNMENT(type) == align, "TYPE_ALIGNMENT(" #type ") == %d (expected " #align ")\n", TYPE_ALIGNMENT(type)) +#else +# define TEST_TYPE_ALIGNMENT(type, align) do { } while (0) +#endif + +#define TEST_TYPE_SIZE(type, size) \ + ok(sizeof(type) == size, "sizeof(" #type ") == %d (expected " #size ")\n", sizeof(type)) + +/*********************************************************************** + * Test macros + */ + +#define TEST_FIELD(type, field_type, field_name, field_offset, field_size, field_align) \ + TEST_TYPE_SIZE(field_type, field_size); \ + TEST_FIELD_ALIGNMENT(type, field_name, field_align); \ + TEST_FIELD_OFFSET(type, field_name, field_offset); \ + +#define TEST_TYPE(type, size, align) \ + TEST_TYPE_ALIGNMENT(type, align); \ + TEST_TYPE_SIZE(type, size) + +#define TEST_TYPE_POINTER(type, size, align) \ + TEST__TYPE_ALIGNMENT(*(type)0, align); \ + TEST_TYPE_SIZE(*(type)0, size) + +#define TEST_TYPE_SIGNED(type) \ + ok((type) -1 < 0, "(" #type ") -1 < 0\n"); + +#define TEST_TYPE_UNSIGNED(type) \ + ok((type) -1 > 0, "(" #type ") -1 > 0\n"); + +static void test_pack_BY_HANDLE_FILE_INFORMATION(void) +{ + /* BY_HANDLE_FILE_INFORMATION (pack 4) */ + TEST_TYPE(BY_HANDLE_FILE_INFORMATION, 52, 4); + TEST_FIELD(BY_HANDLE_FILE_INFORMATION, DWORD, dwFileAttributes, 0, 4, 4); + TEST_FIELD(BY_HANDLE_FILE_INFORMATION, FILETIME, ftCreationTime, 4, 8, 4); + TEST_FIELD(BY_HANDLE_FILE_INFORMATION, FILETIME, ftLastAccessTime, 12, 8, 4); + TEST_FIELD(BY_HANDLE_FILE_INFORMATION, FILETIME, ftLastWriteTime, 20, 8, 4); + TEST_FIELD(BY_HANDLE_FILE_INFORMATION, DWORD, dwVolumeSerialNumber, 28, 4, 4); + TEST_FIELD(BY_HANDLE_FILE_INFORMATION, DWORD, nFileSizeHigh, 32, 4, 4); + TEST_FIELD(BY_HANDLE_FILE_INFORMATION, DWORD, nFileSizeLow, 36, 4, 4); + TEST_FIELD(BY_HANDLE_FILE_INFORMATION, DWORD, nNumberOfLinks, 40, 4, 4); + TEST_FIELD(BY_HANDLE_FILE_INFORMATION, DWORD, nFileIndexHigh, 44, 4, 4); + TEST_FIELD(BY_HANDLE_FILE_INFORMATION, DWORD, nFileIndexLow, 48, 4, 4); +} + +static void test_pack_COMMCONFIG(void) +{ + /* COMMCONFIG (pack 4) */ + TEST_FIELD(COMMCONFIG, DWORD, dwSize, 0, 4, 4); + TEST_FIELD(COMMCONFIG, WORD, wVersion, 4, 2, 2); + TEST_FIELD(COMMCONFIG, WORD, wReserved, 6, 2, 2); +} + +static void test_pack_COMMPROP(void) +{ + /* COMMPROP (pack 4) */ + TEST_TYPE(COMMPROP, 64, 4); + TEST_FIELD(COMMPROP, WORD, wPacketLength, 0, 2, 2); + TEST_FIELD(COMMPROP, WORD, wPacketVersion, 2, 2, 2); + TEST_FIELD(COMMPROP, DWORD, dwServiceMask, 4, 4, 4); + TEST_FIELD(COMMPROP, DWORD, dwReserved1, 8, 4, 4); + TEST_FIELD(COMMPROP, DWORD, dwMaxTxQueue, 12, 4, 4); + TEST_FIELD(COMMPROP, DWORD, dwMaxRxQueue, 16, 4, 4); + TEST_FIELD(COMMPROP, DWORD, dwMaxBaud, 20, 4, 4); + TEST_FIELD(COMMPROP, DWORD, dwProvSubType, 24, 4, 4); + TEST_FIELD(COMMPROP, DWORD, dwProvCapabilities, 28, 4, 4); + TEST_FIELD(COMMPROP, DWORD, dwSettableParams, 32, 4, 4); + TEST_FIELD(COMMPROP, DWORD, dwSettableBaud, 36, 4, 4); + TEST_FIELD(COMMPROP, WORD, wSettableData, 40, 2, 2); + TEST_FIELD(COMMPROP, WORD, wSettableStopParity, 42, 2, 2); + TEST_FIELD(COMMPROP, DWORD, dwCurrentTxQueue, 44, 4, 4); + TEST_FIELD(COMMPROP, DWORD, dwCurrentRxQueue, 48, 4, 4); + TEST_FIELD(COMMPROP, DWORD, dwProvSpec1, 52, 4, 4); + TEST_FIELD(COMMPROP, DWORD, dwProvSpec2, 56, 4, 4); + TEST_FIELD(COMMPROP, WCHAR[1], wcProvChar, 60, 2, 2); +} + +static void test_pack_COMMTIMEOUTS(void) +{ + /* COMMTIMEOUTS (pack 4) */ + TEST_TYPE(COMMTIMEOUTS, 20, 4); + TEST_FIELD(COMMTIMEOUTS, DWORD, ReadIntervalTimeout, 0, 4, 4); + TEST_FIELD(COMMTIMEOUTS, DWORD, ReadTotalTimeoutMultiplier, 4, 4, 4); + TEST_FIELD(COMMTIMEOUTS, DWORD, ReadTotalTimeoutConstant, 8, 4, 4); + TEST_FIELD(COMMTIMEOUTS, DWORD, WriteTotalTimeoutMultiplier, 12, 4, 4); + TEST_FIELD(COMMTIMEOUTS, DWORD, WriteTotalTimeoutConstant, 16, 4, 4); +} + +static void test_pack_COMSTAT(void) +{ + /* COMSTAT (pack 4) */ + TEST_TYPE(COMSTAT, 12, 4); + TEST_FIELD(COMSTAT, DWORD, cbInQue, 4, 4, 4); + TEST_FIELD(COMSTAT, DWORD, cbOutQue, 8, 4, 4); +} + +static void test_pack_CREATE_PROCESS_DEBUG_INFO(void) +{ + /* CREATE_PROCESS_DEBUG_INFO (pack 4) */ + TEST_TYPE(CREATE_PROCESS_DEBUG_INFO, 40, 4); + TEST_FIELD(CREATE_PROCESS_DEBUG_INFO, HANDLE, hFile, 0, 4, 4); + TEST_FIELD(CREATE_PROCESS_DEBUG_INFO, HANDLE, hProcess, 4, 4, 4); + TEST_FIELD(CREATE_PROCESS_DEBUG_INFO, HANDLE, hThread, 8, 4, 4); + TEST_FIELD(CREATE_PROCESS_DEBUG_INFO, LPVOID, lpBaseOfImage, 12, 4, 4); + TEST_FIELD(CREATE_PROCESS_DEBUG_INFO, DWORD, dwDebugInfoFileOffset, 16, 4, 4); + TEST_FIELD(CREATE_PROCESS_DEBUG_INFO, DWORD, nDebugInfoSize, 20, 4, 4); + TEST_FIELD(CREATE_PROCESS_DEBUG_INFO, LPVOID, lpThreadLocalBase, 24, 4, 4); + TEST_FIELD(CREATE_PROCESS_DEBUG_INFO, LPTHREAD_START_ROUTINE, lpStartAddress, 28, 4, 4); + TEST_FIELD(CREATE_PROCESS_DEBUG_INFO, LPVOID, lpImageName, 32, 4, 4); + TEST_FIELD(CREATE_PROCESS_DEBUG_INFO, WORD, fUnicode, 36, 2, 2); +} + +static void test_pack_CREATE_THREAD_DEBUG_INFO(void) +{ + /* CREATE_THREAD_DEBUG_INFO (pack 4) */ + TEST_TYPE(CREATE_THREAD_DEBUG_INFO, 12, 4); + TEST_FIELD(CREATE_THREAD_DEBUG_INFO, HANDLE, hThread, 0, 4, 4); + TEST_FIELD(CREATE_THREAD_DEBUG_INFO, LPVOID, lpThreadLocalBase, 4, 4, 4); + TEST_FIELD(CREATE_THREAD_DEBUG_INFO, LPTHREAD_START_ROUTINE, lpStartAddress, 8, 4, 4); +} + +static void test_pack_CRITICAL_SECTION(void) +{ + /* CRITICAL_SECTION */ + TEST_TYPE(CRITICAL_SECTION, 24, 4); +} + +static void test_pack_CRITICAL_SECTION_DEBUG(void) +{ + /* CRITICAL_SECTION_DEBUG */ + TEST_TYPE(CRITICAL_SECTION_DEBUG, 32, 4); +} + +static void test_pack_DCB(void) +{ + /* DCB (pack 4) */ + TEST_FIELD(DCB, DWORD, DCBlength, 0, 4, 4); + TEST_FIELD(DCB, DWORD, BaudRate, 4, 4, 4); +} + +static void test_pack_DEBUG_EVENT(void) +{ + /* DEBUG_EVENT (pack 4) */ + TEST_FIELD(DEBUG_EVENT, DWORD, dwDebugEventCode, 0, 4, 4); + TEST_FIELD(DEBUG_EVENT, DWORD, dwProcessId, 4, 4, 4); + TEST_FIELD(DEBUG_EVENT, DWORD, dwThreadId, 8, 4, 4); +} + +static void test_pack_EXCEPTION_DEBUG_INFO(void) +{ + /* EXCEPTION_DEBUG_INFO (pack 4) */ + TEST_TYPE(EXCEPTION_DEBUG_INFO, 84, 4); + TEST_FIELD(EXCEPTION_DEBUG_INFO, EXCEPTION_RECORD, ExceptionRecord, 0, 80, 4); + TEST_FIELD(EXCEPTION_DEBUG_INFO, DWORD, dwFirstChance, 80, 4, 4); +} + +static void test_pack_EXIT_PROCESS_DEBUG_INFO(void) +{ + /* EXIT_PROCESS_DEBUG_INFO (pack 4) */ + TEST_TYPE(EXIT_PROCESS_DEBUG_INFO, 4, 4); + TEST_FIELD(EXIT_PROCESS_DEBUG_INFO, DWORD, dwExitCode, 0, 4, 4); +} + +static void test_pack_EXIT_THREAD_DEBUG_INFO(void) +{ + /* EXIT_THREAD_DEBUG_INFO (pack 4) */ + TEST_TYPE(EXIT_THREAD_DEBUG_INFO, 4, 4); + TEST_FIELD(EXIT_THREAD_DEBUG_INFO, DWORD, dwExitCode, 0, 4, 4); +} + +static void test_pack_HW_PROFILE_INFOA(void) +{ + /* HW_PROFILE_INFOA (pack 4) */ + TEST_TYPE(HW_PROFILE_INFOA, 124, 4); + TEST_FIELD(HW_PROFILE_INFOA, DWORD, dwDockInfo, 0, 4, 4); + TEST_FIELD(HW_PROFILE_INFOA, CHAR[HW_PROFILE_GUIDLEN], szHwProfileGuid, 4, 39, 1); + TEST_FIELD(HW_PROFILE_INFOA, CHAR[MAX_PROFILE_LEN], szHwProfileName, 43, 80, 1); +} + +static void test_pack_HW_PROFILE_INFOW(void) +{ + /* HW_PROFILE_INFOW (pack 4) */ + TEST_TYPE(HW_PROFILE_INFOW, 244, 4); + TEST_FIELD(HW_PROFILE_INFOW, DWORD, dwDockInfo, 0, 4, 4); + TEST_FIELD(HW_PROFILE_INFOW, WCHAR[HW_PROFILE_GUIDLEN], szHwProfileGuid, 4, 78, 2); + TEST_FIELD(HW_PROFILE_INFOW, WCHAR[MAX_PROFILE_LEN], szHwProfileName, 82, 160, 2); +} + +static void test_pack_LDT_ENTRY(void) +{ + /* LDT_ENTRY (pack 4) */ + TEST_FIELD(LDT_ENTRY, WORD, LimitLow, 0, 2, 2); + TEST_FIELD(LDT_ENTRY, WORD, BaseLow, 2, 2, 2); +} + +static void test_pack_LOAD_DLL_DEBUG_INFO(void) +{ + /* LOAD_DLL_DEBUG_INFO (pack 4) */ + TEST_TYPE(LOAD_DLL_DEBUG_INFO, 24, 4); + TEST_FIELD(LOAD_DLL_DEBUG_INFO, HANDLE, hFile, 0, 4, 4); + TEST_FIELD(LOAD_DLL_DEBUG_INFO, LPVOID, lpBaseOfDll, 4, 4, 4); + TEST_FIELD(LOAD_DLL_DEBUG_INFO, DWORD, dwDebugInfoFileOffset, 8, 4, 4); + TEST_FIELD(LOAD_DLL_DEBUG_INFO, DWORD, nDebugInfoSize, 12, 4, 4); + TEST_FIELD(LOAD_DLL_DEBUG_INFO, LPVOID, lpImageName, 16, 4, 4); + TEST_FIELD(LOAD_DLL_DEBUG_INFO, WORD, fUnicode, 20, 2, 2); +} + +static void test_pack_LPBY_HANDLE_FILE_INFORMATION(void) +{ + /* LPBY_HANDLE_FILE_INFORMATION */ + TEST_TYPE(LPBY_HANDLE_FILE_INFORMATION, 4, 4); + TEST_TYPE_POINTER(LPBY_HANDLE_FILE_INFORMATION, 52, 4); +} + +static void test_pack_LPCOMMCONFIG(void) +{ + /* LPCOMMCONFIG */ + TEST_TYPE(LPCOMMCONFIG, 4, 4); +} + +static void test_pack_LPCOMMPROP(void) +{ + /* LPCOMMPROP */ + TEST_TYPE(LPCOMMPROP, 4, 4); + TEST_TYPE_POINTER(LPCOMMPROP, 64, 4); +} + +static void test_pack_LPCOMMTIMEOUTS(void) +{ + /* LPCOMMTIMEOUTS */ + TEST_TYPE(LPCOMMTIMEOUTS, 4, 4); + TEST_TYPE_POINTER(LPCOMMTIMEOUTS, 20, 4); +} + +static void test_pack_LPCOMSTAT(void) +{ + /* LPCOMSTAT */ + TEST_TYPE(LPCOMSTAT, 4, 4); + TEST_TYPE_POINTER(LPCOMSTAT, 12, 4); +} + +static void test_pack_LPCONTEXT(void) +{ + /* LPCONTEXT */ + TEST_TYPE(LPCONTEXT, 4, 4); +} + +static void test_pack_LPCRITICAL_SECTION(void) +{ + /* LPCRITICAL_SECTION */ + TEST_TYPE(LPCRITICAL_SECTION, 4, 4); +} + +static void test_pack_LPCRITICAL_SECTION_DEBUG(void) +{ + /* LPCRITICAL_SECTION_DEBUG */ + TEST_TYPE(LPCRITICAL_SECTION_DEBUG, 4, 4); +} + +static void test_pack_LPDCB(void) +{ + /* LPDCB */ + TEST_TYPE(LPDCB, 4, 4); +} + +static void test_pack_LPDEBUG_EVENT(void) +{ + /* LPDEBUG_EVENT */ + TEST_TYPE(LPDEBUG_EVENT, 4, 4); +} + +static void test_pack_LPEXCEPTION_POINTERS(void) +{ + /* LPEXCEPTION_POINTERS */ + TEST_TYPE(LPEXCEPTION_POINTERS, 4, 4); +} + +static void test_pack_LPEXCEPTION_RECORD(void) +{ + /* LPEXCEPTION_RECORD */ + TEST_TYPE(LPEXCEPTION_RECORD, 4, 4); +} + +static void test_pack_LPFIBER_START_ROUTINE(void) +{ + /* LPFIBER_START_ROUTINE */ + TEST_TYPE(LPFIBER_START_ROUTINE, 4, 4); +} + +static void test_pack_LPHW_PROFILE_INFOA(void) +{ + /* LPHW_PROFILE_INFOA */ + TEST_TYPE(LPHW_PROFILE_INFOA, 4, 4); + TEST_TYPE_POINTER(LPHW_PROFILE_INFOA, 124, 4); +} + +static void test_pack_LPHW_PROFILE_INFOW(void) +{ + /* LPHW_PROFILE_INFOW */ + TEST_TYPE(LPHW_PROFILE_INFOW, 4, 4); + TEST_TYPE_POINTER(LPHW_PROFILE_INFOW, 244, 4); +} + +static void test_pack_LPLDT_ENTRY(void) +{ + /* LPLDT_ENTRY */ + TEST_TYPE(LPLDT_ENTRY, 4, 4); +} + +static void test_pack_LPMEMORYSTATUS(void) +{ + /* LPMEMORYSTATUS */ + TEST_TYPE(LPMEMORYSTATUS, 4, 4); + TEST_TYPE_POINTER(LPMEMORYSTATUS, 32, 4); +} + +static void test_pack_LPOFSTRUCT(void) +{ + /* LPOFSTRUCT */ + TEST_TYPE(LPOFSTRUCT, 4, 4); + TEST_TYPE_POINTER(LPOFSTRUCT, 136, 2); +} + +static void test_pack_LPOSVERSIONINFOA(void) +{ + /* LPOSVERSIONINFOA */ + TEST_TYPE(LPOSVERSIONINFOA, 4, 4); + TEST_TYPE_POINTER(LPOSVERSIONINFOA, 148, 4); +} + +static void test_pack_LPOSVERSIONINFOEXA(void) +{ + /* LPOSVERSIONINFOEXA */ + TEST_TYPE(LPOSVERSIONINFOEXA, 4, 4); +} + +static void test_pack_LPOSVERSIONINFOEXW(void) +{ + /* LPOSVERSIONINFOEXW */ + TEST_TYPE(LPOSVERSIONINFOEXW, 4, 4); +} + +static void test_pack_LPOSVERSIONINFOW(void) +{ + /* LPOSVERSIONINFOW */ + TEST_TYPE(LPOSVERSIONINFOW, 4, 4); + TEST_TYPE_POINTER(LPOSVERSIONINFOW, 276, 4); +} + +static void test_pack_LPOVERLAPPED(void) +{ + /* LPOVERLAPPED */ + TEST_TYPE(LPOVERLAPPED, 4, 4); + TEST_TYPE_POINTER(LPOVERLAPPED, 20, 4); +} + +static void test_pack_LPOVERLAPPED_COMPLETION_ROUTINE(void) +{ + /* LPOVERLAPPED_COMPLETION_ROUTINE */ + TEST_TYPE(LPOVERLAPPED_COMPLETION_ROUTINE, 4, 4); +} + +static void test_pack_LPPROCESS_HEAP_ENTRY(void) +{ + /* LPPROCESS_HEAP_ENTRY */ + TEST_TYPE(LPPROCESS_HEAP_ENTRY, 4, 4); +} + +static void test_pack_LPPROCESS_INFORMATION(void) +{ + /* LPPROCESS_INFORMATION */ + TEST_TYPE(LPPROCESS_INFORMATION, 4, 4); + TEST_TYPE_POINTER(LPPROCESS_INFORMATION, 16, 4); +} + +static void test_pack_LPPROGRESS_ROUTINE(void) +{ + /* LPPROGRESS_ROUTINE */ + TEST_TYPE(LPPROGRESS_ROUTINE, 4, 4); +} + +static void test_pack_LPSECURITY_ATTRIBUTES(void) +{ + /* LPSECURITY_ATTRIBUTES */ + TEST_TYPE(LPSECURITY_ATTRIBUTES, 4, 4); + TEST_TYPE_POINTER(LPSECURITY_ATTRIBUTES, 12, 4); +} + +static void test_pack_LPSTARTUPINFOA(void) +{ + /* LPSTARTUPINFOA */ + TEST_TYPE(LPSTARTUPINFOA, 4, 4); +} + +static void test_pack_LPSTARTUPINFOW(void) +{ + /* LPSTARTUPINFOW */ + TEST_TYPE(LPSTARTUPINFOW, 4, 4); + TEST_TYPE_POINTER(LPSTARTUPINFOW, 68, 4); +} + +static void test_pack_LPSYSTEMTIME(void) +{ + /* LPSYSTEMTIME */ + TEST_TYPE(LPSYSTEMTIME, 4, 4); + TEST_TYPE_POINTER(LPSYSTEMTIME, 16, 2); +} + +static void test_pack_LPSYSTEM_INFO(void) +{ + /* LPSYSTEM_INFO */ + TEST_TYPE(LPSYSTEM_INFO, 4, 4); +} + +static void test_pack_LPSYSTEM_POWER_STATUS(void) +{ + /* LPSYSTEM_POWER_STATUS */ + TEST_TYPE(LPSYSTEM_POWER_STATUS, 4, 4); + TEST_TYPE_POINTER(LPSYSTEM_POWER_STATUS, 12, 4); +} + +static void test_pack_LPTHREAD_START_ROUTINE(void) +{ + /* LPTHREAD_START_ROUTINE */ + TEST_TYPE(LPTHREAD_START_ROUTINE, 4, 4); +} + +static void test_pack_LPTIME_ZONE_INFORMATION(void) +{ + /* LPTIME_ZONE_INFORMATION */ + TEST_TYPE(LPTIME_ZONE_INFORMATION, 4, 4); + TEST_TYPE_POINTER(LPTIME_ZONE_INFORMATION, 172, 4); +} + +static void test_pack_LPWIN32_FILE_ATTRIBUTE_DATA(void) +{ + /* LPWIN32_FILE_ATTRIBUTE_DATA */ + TEST_TYPE(LPWIN32_FILE_ATTRIBUTE_DATA, 4, 4); + TEST_TYPE_POINTER(LPWIN32_FILE_ATTRIBUTE_DATA, 36, 4); +} + +static void test_pack_LPWIN32_FIND_DATAA(void) +{ + /* LPWIN32_FIND_DATAA */ + TEST_TYPE(LPWIN32_FIND_DATAA, 4, 4); + TEST_TYPE_POINTER(LPWIN32_FIND_DATAA, 320, 4); +} + +static void test_pack_LPWIN32_FIND_DATAW(void) +{ + /* LPWIN32_FIND_DATAW */ + TEST_TYPE(LPWIN32_FIND_DATAW, 4, 4); + TEST_TYPE_POINTER(LPWIN32_FIND_DATAW, 592, 4); +} + +static void test_pack_LPWIN32_STREAM_ID(void) +{ + /* LPWIN32_STREAM_ID */ + TEST_TYPE(LPWIN32_STREAM_ID, 4, 4); + TEST_TYPE_POINTER(LPWIN32_STREAM_ID, 24, 4); +} + +static void test_pack_MEMORYSTATUS(void) +{ + /* MEMORYSTATUS (pack 4) */ + TEST_TYPE(MEMORYSTATUS, 32, 4); + TEST_FIELD(MEMORYSTATUS, DWORD, dwLength, 0, 4, 4); + TEST_FIELD(MEMORYSTATUS, DWORD, dwMemoryLoad, 4, 4, 4); + TEST_FIELD(MEMORYSTATUS, SIZE_T, dwTotalPhys, 8, 4, 4); + TEST_FIELD(MEMORYSTATUS, SIZE_T, dwAvailPhys, 12, 4, 4); + TEST_FIELD(MEMORYSTATUS, SIZE_T, dwTotalPageFile, 16, 4, 4); + TEST_FIELD(MEMORYSTATUS, SIZE_T, dwAvailPageFile, 20, 4, 4); + TEST_FIELD(MEMORYSTATUS, SIZE_T, dwTotalVirtual, 24, 4, 4); + TEST_FIELD(MEMORYSTATUS, SIZE_T, dwAvailVirtual, 28, 4, 4); +} + +static void test_pack_OFSTRUCT(void) +{ + /* OFSTRUCT (pack 4) */ + TEST_TYPE(OFSTRUCT, 136, 2); + TEST_FIELD(OFSTRUCT, BYTE, cBytes, 0, 1, 1); + TEST_FIELD(OFSTRUCT, BYTE, fFixedDisk, 1, 1, 1); + TEST_FIELD(OFSTRUCT, WORD, nErrCode, 2, 2, 2); + TEST_FIELD(OFSTRUCT, WORD, Reserved1, 4, 2, 2); + TEST_FIELD(OFSTRUCT, WORD, Reserved2, 6, 2, 2); + TEST_FIELD(OFSTRUCT, BYTE[OFS_MAXPATHNAME], szPathName, 8, 128, 1); +} + +static void test_pack_OSVERSIONINFOA(void) +{ + /* OSVERSIONINFOA (pack 4) */ + TEST_TYPE(OSVERSIONINFOA, 148, 4); + TEST_FIELD(OSVERSIONINFOA, DWORD, dwOSVersionInfoSize, 0, 4, 4); + TEST_FIELD(OSVERSIONINFOA, DWORD, dwMajorVersion, 4, 4, 4); + TEST_FIELD(OSVERSIONINFOA, DWORD, dwMinorVersion, 8, 4, 4); + TEST_FIELD(OSVERSIONINFOA, DWORD, dwBuildNumber, 12, 4, 4); + TEST_FIELD(OSVERSIONINFOA, DWORD, dwPlatformId, 16, 4, 4); + TEST_FIELD(OSVERSIONINFOA, CHAR[128], szCSDVersion, 20, 128, 1); +} + +static void test_pack_OSVERSIONINFOEXA(void) +{ + /* OSVERSIONINFOEXA (pack 4) */ + TEST_FIELD(OSVERSIONINFOEXA, DWORD, dwOSVersionInfoSize, 0, 4, 4); + TEST_FIELD(OSVERSIONINFOEXA, DWORD, dwMajorVersion, 4, 4, 4); + TEST_FIELD(OSVERSIONINFOEXA, DWORD, dwMinorVersion, 8, 4, 4); + TEST_FIELD(OSVERSIONINFOEXA, DWORD, dwBuildNumber, 12, 4, 4); + TEST_FIELD(OSVERSIONINFOEXA, DWORD, dwPlatformId, 16, 4, 4); + TEST_FIELD(OSVERSIONINFOEXA, CHAR[128], szCSDVersion, 20, 128, 1); + TEST_FIELD(OSVERSIONINFOEXA, WORD, wServicePackMajor, 148, 2, 2); + TEST_FIELD(OSVERSIONINFOEXA, WORD, wServicePackMinor, 150, 2, 2); +} + +static void test_pack_OSVERSIONINFOEXW(void) +{ + /* OSVERSIONINFOEXW (pack 4) */ + TEST_FIELD(OSVERSIONINFOEXW, DWORD, dwOSVersionInfoSize, 0, 4, 4); + TEST_FIELD(OSVERSIONINFOEXW, DWORD, dwMajorVersion, 4, 4, 4); + TEST_FIELD(OSVERSIONINFOEXW, DWORD, dwMinorVersion, 8, 4, 4); + TEST_FIELD(OSVERSIONINFOEXW, DWORD, dwBuildNumber, 12, 4, 4); + TEST_FIELD(OSVERSIONINFOEXW, DWORD, dwPlatformId, 16, 4, 4); + TEST_FIELD(OSVERSIONINFOEXW, WCHAR[128], szCSDVersion, 20, 256, 2); + TEST_FIELD(OSVERSIONINFOEXW, WORD, wServicePackMajor, 276, 2, 2); + TEST_FIELD(OSVERSIONINFOEXW, WORD, wServicePackMinor, 278, 2, 2); +} + +static void test_pack_OSVERSIONINFOW(void) +{ + /* OSVERSIONINFOW (pack 4) */ + TEST_TYPE(OSVERSIONINFOW, 276, 4); + TEST_FIELD(OSVERSIONINFOW, DWORD, dwOSVersionInfoSize, 0, 4, 4); + TEST_FIELD(OSVERSIONINFOW, DWORD, dwMajorVersion, 4, 4, 4); + TEST_FIELD(OSVERSIONINFOW, DWORD, dwMinorVersion, 8, 4, 4); + TEST_FIELD(OSVERSIONINFOW, DWORD, dwBuildNumber, 12, 4, 4); + TEST_FIELD(OSVERSIONINFOW, DWORD, dwPlatformId, 16, 4, 4); + TEST_FIELD(OSVERSIONINFOW, WCHAR[128], szCSDVersion, 20, 256, 2); +} + +static void test_pack_OUTPUT_DEBUG_STRING_INFO(void) +{ + /* OUTPUT_DEBUG_STRING_INFO (pack 4) */ +} + +static void test_pack_OVERLAPPED(void) +{ + /* OVERLAPPED (pack 4) */ + TEST_TYPE(OVERLAPPED, 20, 4); + TEST_FIELD(OVERLAPPED, DWORD, Internal, 0, 4, 4); + TEST_FIELD(OVERLAPPED, DWORD, InternalHigh, 4, 4, 4); + TEST_FIELD(OVERLAPPED, DWORD, Offset, 8, 4, 4); + TEST_FIELD(OVERLAPPED, DWORD, OffsetHigh, 12, 4, 4); + TEST_FIELD(OVERLAPPED, HANDLE, hEvent, 16, 4, 4); +} + +static void test_pack_PAPCFUNC(void) +{ + /* PAPCFUNC */ + TEST_TYPE(PAPCFUNC, 4, 4); +} + +static void test_pack_PBY_HANDLE_FILE_INFORMATION(void) +{ + /* PBY_HANDLE_FILE_INFORMATION */ + TEST_TYPE(PBY_HANDLE_FILE_INFORMATION, 4, 4); + TEST_TYPE_POINTER(PBY_HANDLE_FILE_INFORMATION, 52, 4); +} + +static void test_pack_PCRITICAL_SECTION(void) +{ + /* PCRITICAL_SECTION */ + TEST_TYPE(PCRITICAL_SECTION, 4, 4); +} + +static void test_pack_PCRITICAL_SECTION_DEBUG(void) +{ + /* PCRITICAL_SECTION_DEBUG */ + TEST_TYPE(PCRITICAL_SECTION_DEBUG, 4, 4); +} + +static void test_pack_PFIBER_START_ROUTINE(void) +{ + /* PFIBER_START_ROUTINE */ + TEST_TYPE(PFIBER_START_ROUTINE, 4, 4); +} + +static void test_pack_POFSTRUCT(void) +{ + /* POFSTRUCT */ + TEST_TYPE(POFSTRUCT, 4, 4); + TEST_TYPE_POINTER(POFSTRUCT, 136, 2); +} + +static void test_pack_POSVERSIONINFOA(void) +{ + /* POSVERSIONINFOA */ + TEST_TYPE(POSVERSIONINFOA, 4, 4); + TEST_TYPE_POINTER(POSVERSIONINFOA, 148, 4); +} + +static void test_pack_POSVERSIONINFOEXA(void) +{ + /* POSVERSIONINFOEXA */ + TEST_TYPE(POSVERSIONINFOEXA, 4, 4); +} + +static void test_pack_POSVERSIONINFOEXW(void) +{ + /* POSVERSIONINFOEXW */ + TEST_TYPE(POSVERSIONINFOEXW, 4, 4); +} + +static void test_pack_POSVERSIONINFOW(void) +{ + /* POSVERSIONINFOW */ + TEST_TYPE(POSVERSIONINFOW, 4, 4); + TEST_TYPE_POINTER(POSVERSIONINFOW, 276, 4); +} + +static void test_pack_PPROCESS_HEAP_ENTRY(void) +{ + /* PPROCESS_HEAP_ENTRY */ + TEST_TYPE(PPROCESS_HEAP_ENTRY, 4, 4); +} + +static void test_pack_PPROCESS_INFORMATION(void) +{ + /* PPROCESS_INFORMATION */ + TEST_TYPE(PPROCESS_INFORMATION, 4, 4); + TEST_TYPE_POINTER(PPROCESS_INFORMATION, 16, 4); +} + +static void test_pack_PROCESS_HEAP_ENTRY(void) +{ + /* PROCESS_HEAP_ENTRY (pack 4) */ + TEST_FIELD(PROCESS_HEAP_ENTRY, LPVOID, lpData, 0, 4, 4); + TEST_FIELD(PROCESS_HEAP_ENTRY, DWORD, cbData, 4, 4, 4); + TEST_FIELD(PROCESS_HEAP_ENTRY, BYTE, cbOverhead, 8, 1, 1); + TEST_FIELD(PROCESS_HEAP_ENTRY, BYTE, iRegionIndex, 9, 1, 1); + TEST_FIELD(PROCESS_HEAP_ENTRY, WORD, wFlags, 10, 2, 2); +} + +static void test_pack_PROCESS_INFORMATION(void) +{ + /* PROCESS_INFORMATION (pack 4) */ + TEST_TYPE(PROCESS_INFORMATION, 16, 4); + TEST_FIELD(PROCESS_INFORMATION, HANDLE, hProcess, 0, 4, 4); + TEST_FIELD(PROCESS_INFORMATION, HANDLE, hThread, 4, 4, 4); + TEST_FIELD(PROCESS_INFORMATION, DWORD, dwProcessId, 8, 4, 4); + TEST_FIELD(PROCESS_INFORMATION, DWORD, dwThreadId, 12, 4, 4); +} + +static void test_pack_PSECURITY_ATTRIBUTES(void) +{ + /* PSECURITY_ATTRIBUTES */ + TEST_TYPE(PSECURITY_ATTRIBUTES, 4, 4); + TEST_TYPE_POINTER(PSECURITY_ATTRIBUTES, 12, 4); +} + +static void test_pack_PSYSTEMTIME(void) +{ + /* PSYSTEMTIME */ + TEST_TYPE(PSYSTEMTIME, 4, 4); + TEST_TYPE_POINTER(PSYSTEMTIME, 16, 2); +} + +static void test_pack_PTIMERAPCROUTINE(void) +{ + /* PTIMERAPCROUTINE */ + TEST_TYPE(PTIMERAPCROUTINE, 4, 4); +} + +static void test_pack_PTIME_ZONE_INFORMATION(void) +{ + /* PTIME_ZONE_INFORMATION */ + TEST_TYPE(PTIME_ZONE_INFORMATION, 4, 4); + TEST_TYPE_POINTER(PTIME_ZONE_INFORMATION, 172, 4); +} + +static void test_pack_PWIN32_FIND_DATAA(void) +{ + /* PWIN32_FIND_DATAA */ + TEST_TYPE(PWIN32_FIND_DATAA, 4, 4); + TEST_TYPE_POINTER(PWIN32_FIND_DATAA, 320, 4); +} + +static void test_pack_PWIN32_FIND_DATAW(void) +{ + /* PWIN32_FIND_DATAW */ + TEST_TYPE(PWIN32_FIND_DATAW, 4, 4); + TEST_TYPE_POINTER(PWIN32_FIND_DATAW, 592, 4); +} + +static void test_pack_RIP_INFO(void) +{ + /* RIP_INFO (pack 4) */ + TEST_TYPE(RIP_INFO, 8, 4); + TEST_FIELD(RIP_INFO, DWORD, dwError, 0, 4, 4); + TEST_FIELD(RIP_INFO, DWORD, dwType, 4, 4, 4); +} + +static void test_pack_SECURITY_ATTRIBUTES(void) +{ + /* SECURITY_ATTRIBUTES (pack 4) */ + TEST_TYPE(SECURITY_ATTRIBUTES, 12, 4); + TEST_FIELD(SECURITY_ATTRIBUTES, DWORD, nLength, 0, 4, 4); + TEST_FIELD(SECURITY_ATTRIBUTES, LPVOID, lpSecurityDescriptor, 4, 4, 4); + TEST_FIELD(SECURITY_ATTRIBUTES, BOOL, bInheritHandle, 8, 4, 4); +} + +static void test_pack_STARTUPINFOA(void) +{ + /* STARTUPINFOA (pack 4) */ + TEST_FIELD(STARTUPINFOA, DWORD, cb, 0, 4, 4); +} + +static void test_pack_STARTUPINFOW(void) +{ + /* STARTUPINFOW (pack 4) */ + TEST_TYPE(STARTUPINFOW, 68, 4); + TEST_FIELD(STARTUPINFOW, DWORD, cb, 0, 4, 4); + TEST_FIELD(STARTUPINFOW, LPWSTR, lpReserved, 4, 4, 4); + TEST_FIELD(STARTUPINFOW, LPWSTR, lpDesktop, 8, 4, 4); + TEST_FIELD(STARTUPINFOW, LPWSTR, lpTitle, 12, 4, 4); + TEST_FIELD(STARTUPINFOW, DWORD, dwX, 16, 4, 4); + TEST_FIELD(STARTUPINFOW, DWORD, dwY, 20, 4, 4); + TEST_FIELD(STARTUPINFOW, DWORD, dwXSize, 24, 4, 4); + TEST_FIELD(STARTUPINFOW, DWORD, dwYSize, 28, 4, 4); + TEST_FIELD(STARTUPINFOW, DWORD, dwXCountChars, 32, 4, 4); + TEST_FIELD(STARTUPINFOW, DWORD, dwYCountChars, 36, 4, 4); + TEST_FIELD(STARTUPINFOW, DWORD, dwFillAttribute, 40, 4, 4); + TEST_FIELD(STARTUPINFOW, DWORD, dwFlags, 44, 4, 4); + TEST_FIELD(STARTUPINFOW, WORD, wShowWindow, 48, 2, 2); + TEST_FIELD(STARTUPINFOW, WORD, cbReserved2, 50, 2, 2); + TEST_FIELD(STARTUPINFOW, BYTE *, lpReserved2, 52, 4, 4); + TEST_FIELD(STARTUPINFOW, HANDLE, hStdInput, 56, 4, 4); + TEST_FIELD(STARTUPINFOW, HANDLE, hStdOutput, 60, 4, 4); + TEST_FIELD(STARTUPINFOW, HANDLE, hStdError, 64, 4, 4); +} + +static void test_pack_SYSTEMTIME(void) +{ + /* SYSTEMTIME (pack 4) */ + TEST_TYPE(SYSTEMTIME, 16, 2); + TEST_FIELD(SYSTEMTIME, WORD, wYear, 0, 2, 2); + TEST_FIELD(SYSTEMTIME, WORD, wMonth, 2, 2, 2); + TEST_FIELD(SYSTEMTIME, WORD, wDayOfWeek, 4, 2, 2); + TEST_FIELD(SYSTEMTIME, WORD, wDay, 6, 2, 2); + TEST_FIELD(SYSTEMTIME, WORD, wHour, 8, 2, 2); + TEST_FIELD(SYSTEMTIME, WORD, wMinute, 10, 2, 2); + TEST_FIELD(SYSTEMTIME, WORD, wSecond, 12, 2, 2); + TEST_FIELD(SYSTEMTIME, WORD, wMilliseconds, 14, 2, 2); +} + +static void test_pack_SYSTEM_POWER_STATUS(void) +{ + /* SYSTEM_POWER_STATUS (pack 4) */ + TEST_TYPE(SYSTEM_POWER_STATUS, 12, 4); + TEST_FIELD(SYSTEM_POWER_STATUS, BYTE, ACLineStatus, 0, 1, 1); + TEST_FIELD(SYSTEM_POWER_STATUS, BYTE, BatteryFlag, 1, 1, 1); + TEST_FIELD(SYSTEM_POWER_STATUS, BYTE, BatteryLifePercent, 2, 1, 1); + TEST_FIELD(SYSTEM_POWER_STATUS, BYTE, Reserved1, 3, 1, 1); + TEST_FIELD(SYSTEM_POWER_STATUS, DWORD, BatteryLifeTime, 4, 4, 4); + TEST_FIELD(SYSTEM_POWER_STATUS, DWORD, BatteryFullLifeTime, 8, 4, 4); +} + +static void test_pack_TIME_ZONE_INFORMATION(void) +{ + /* TIME_ZONE_INFORMATION (pack 4) */ + TEST_TYPE(TIME_ZONE_INFORMATION, 172, 4); + TEST_FIELD(TIME_ZONE_INFORMATION, LONG, Bias, 0, 4, 4); + TEST_FIELD(TIME_ZONE_INFORMATION, WCHAR[32], StandardName, 4, 64, 2); + TEST_FIELD(TIME_ZONE_INFORMATION, SYSTEMTIME, StandardDate, 68, 16, 2); + TEST_FIELD(TIME_ZONE_INFORMATION, LONG, StandardBias, 84, 4, 4); + TEST_FIELD(TIME_ZONE_INFORMATION, WCHAR[32], DaylightName, 88, 64, 2); + TEST_FIELD(TIME_ZONE_INFORMATION, SYSTEMTIME, DaylightDate, 152, 16, 2); + TEST_FIELD(TIME_ZONE_INFORMATION, LONG, DaylightBias, 168, 4, 4); +} + +static void test_pack_UNLOAD_DLL_DEBUG_INFO(void) +{ + /* UNLOAD_DLL_DEBUG_INFO (pack 4) */ + TEST_TYPE(UNLOAD_DLL_DEBUG_INFO, 4, 4); + TEST_FIELD(UNLOAD_DLL_DEBUG_INFO, LPVOID, lpBaseOfDll, 0, 4, 4); +} + +static void test_pack_WIN32_FILE_ATTRIBUTE_DATA(void) +{ + /* WIN32_FILE_ATTRIBUTE_DATA (pack 4) */ + TEST_TYPE(WIN32_FILE_ATTRIBUTE_DATA, 36, 4); + TEST_FIELD(WIN32_FILE_ATTRIBUTE_DATA, DWORD, dwFileAttributes, 0, 4, 4); + TEST_FIELD(WIN32_FILE_ATTRIBUTE_DATA, FILETIME, ftCreationTime, 4, 8, 4); + TEST_FIELD(WIN32_FILE_ATTRIBUTE_DATA, FILETIME, ftLastAccessTime, 12, 8, 4); + TEST_FIELD(WIN32_FILE_ATTRIBUTE_DATA, FILETIME, ftLastWriteTime, 20, 8, 4); + TEST_FIELD(WIN32_FILE_ATTRIBUTE_DATA, DWORD, nFileSizeHigh, 28, 4, 4); + TEST_FIELD(WIN32_FILE_ATTRIBUTE_DATA, DWORD, nFileSizeLow, 32, 4, 4); +} + +static void test_pack_WIN32_FIND_DATAA(void) +{ + /* WIN32_FIND_DATAA (pack 4) */ + TEST_TYPE(WIN32_FIND_DATAA, 320, 4); + TEST_FIELD(WIN32_FIND_DATAA, DWORD, dwFileAttributes, 0, 4, 4); + TEST_FIELD(WIN32_FIND_DATAA, FILETIME, ftCreationTime, 4, 8, 4); + TEST_FIELD(WIN32_FIND_DATAA, FILETIME, ftLastAccessTime, 12, 8, 4); + TEST_FIELD(WIN32_FIND_DATAA, FILETIME, ftLastWriteTime, 20, 8, 4); + TEST_FIELD(WIN32_FIND_DATAA, DWORD, nFileSizeHigh, 28, 4, 4); + TEST_FIELD(WIN32_FIND_DATAA, DWORD, nFileSizeLow, 32, 4, 4); + TEST_FIELD(WIN32_FIND_DATAA, DWORD, dwReserved0, 36, 4, 4); + TEST_FIELD(WIN32_FIND_DATAA, DWORD, dwReserved1, 40, 4, 4); + TEST_FIELD(WIN32_FIND_DATAA, CHAR[260], cFileName, 44, 260, 1); + TEST_FIELD(WIN32_FIND_DATAA, CHAR[14], cAlternateFileName, 304, 14, 1); +} + +static void test_pack_WIN32_FIND_DATAW(void) +{ + /* WIN32_FIND_DATAW (pack 4) */ + TEST_TYPE(WIN32_FIND_DATAW, 592, 4); + TEST_FIELD(WIN32_FIND_DATAW, DWORD, dwFileAttributes, 0, 4, 4); + TEST_FIELD(WIN32_FIND_DATAW, FILETIME, ftCreationTime, 4, 8, 4); + TEST_FIELD(WIN32_FIND_DATAW, FILETIME, ftLastAccessTime, 12, 8, 4); + TEST_FIELD(WIN32_FIND_DATAW, FILETIME, ftLastWriteTime, 20, 8, 4); + TEST_FIELD(WIN32_FIND_DATAW, DWORD, nFileSizeHigh, 28, 4, 4); + TEST_FIELD(WIN32_FIND_DATAW, DWORD, nFileSizeLow, 32, 4, 4); + TEST_FIELD(WIN32_FIND_DATAW, DWORD, dwReserved0, 36, 4, 4); + TEST_FIELD(WIN32_FIND_DATAW, DWORD, dwReserved1, 40, 4, 4); + TEST_FIELD(WIN32_FIND_DATAW, WCHAR[260], cFileName, 44, 520, 2); + TEST_FIELD(WIN32_FIND_DATAW, WCHAR[14], cAlternateFileName, 564, 28, 2); +} + +static void test_pack(void) +{ + test_pack_BY_HANDLE_FILE_INFORMATION(); + test_pack_COMMCONFIG(); + test_pack_COMMPROP(); + test_pack_COMMTIMEOUTS(); + test_pack_COMSTAT(); + test_pack_CREATE_PROCESS_DEBUG_INFO(); + test_pack_CREATE_THREAD_DEBUG_INFO(); + test_pack_CRITICAL_SECTION(); + test_pack_CRITICAL_SECTION_DEBUG(); + test_pack_DCB(); + test_pack_DEBUG_EVENT(); + test_pack_EXCEPTION_DEBUG_INFO(); + test_pack_EXIT_PROCESS_DEBUG_INFO(); + test_pack_EXIT_THREAD_DEBUG_INFO(); + test_pack_HW_PROFILE_INFOA(); + test_pack_HW_PROFILE_INFOW(); + test_pack_LDT_ENTRY(); + test_pack_LOAD_DLL_DEBUG_INFO(); + test_pack_LPBY_HANDLE_FILE_INFORMATION(); + test_pack_LPCOMMCONFIG(); + test_pack_LPCOMMPROP(); + test_pack_LPCOMMTIMEOUTS(); + test_pack_LPCOMSTAT(); + test_pack_LPCONTEXT(); + test_pack_LPCRITICAL_SECTION(); + test_pack_LPCRITICAL_SECTION_DEBUG(); + test_pack_LPDCB(); + test_pack_LPDEBUG_EVENT(); + test_pack_LPEXCEPTION_POINTERS(); + test_pack_LPEXCEPTION_RECORD(); + test_pack_LPFIBER_START_ROUTINE(); + test_pack_LPHW_PROFILE_INFOA(); + test_pack_LPHW_PROFILE_INFOW(); + test_pack_LPLDT_ENTRY(); + test_pack_LPMEMORYSTATUS(); + test_pack_LPOFSTRUCT(); + test_pack_LPOSVERSIONINFOA(); + test_pack_LPOSVERSIONINFOEXA(); + test_pack_LPOSVERSIONINFOEXW(); + test_pack_LPOSVERSIONINFOW(); + test_pack_LPOVERLAPPED(); + test_pack_LPOVERLAPPED_COMPLETION_ROUTINE(); + test_pack_LPPROCESS_HEAP_ENTRY(); + test_pack_LPPROCESS_INFORMATION(); + test_pack_LPPROGRESS_ROUTINE(); + test_pack_LPSECURITY_ATTRIBUTES(); + test_pack_LPSTARTUPINFOA(); + test_pack_LPSTARTUPINFOW(); + test_pack_LPSYSTEMTIME(); + test_pack_LPSYSTEM_INFO(); + test_pack_LPSYSTEM_POWER_STATUS(); + test_pack_LPTHREAD_START_ROUTINE(); + test_pack_LPTIME_ZONE_INFORMATION(); + test_pack_LPWIN32_FILE_ATTRIBUTE_DATA(); + test_pack_LPWIN32_FIND_DATAA(); + test_pack_LPWIN32_FIND_DATAW(); + test_pack_LPWIN32_STREAM_ID(); + test_pack_MEMORYSTATUS(); + test_pack_OFSTRUCT(); + test_pack_OSVERSIONINFOA(); + test_pack_OSVERSIONINFOEXA(); + test_pack_OSVERSIONINFOEXW(); + test_pack_OSVERSIONINFOW(); + test_pack_OUTPUT_DEBUG_STRING_INFO(); + test_pack_OVERLAPPED(); + test_pack_PAPCFUNC(); + test_pack_PBY_HANDLE_FILE_INFORMATION(); + test_pack_PCRITICAL_SECTION(); + test_pack_PCRITICAL_SECTION_DEBUG(); + test_pack_PFIBER_START_ROUTINE(); + test_pack_POFSTRUCT(); + test_pack_POSVERSIONINFOA(); + test_pack_POSVERSIONINFOEXA(); + test_pack_POSVERSIONINFOEXW(); + test_pack_POSVERSIONINFOW(); + test_pack_PPROCESS_HEAP_ENTRY(); + test_pack_PPROCESS_INFORMATION(); + test_pack_PROCESS_HEAP_ENTRY(); + test_pack_PROCESS_INFORMATION(); + test_pack_PSECURITY_ATTRIBUTES(); + test_pack_PSYSTEMTIME(); + test_pack_PTIMERAPCROUTINE(); + test_pack_PTIME_ZONE_INFORMATION(); + test_pack_PWIN32_FIND_DATAA(); + test_pack_PWIN32_FIND_DATAW(); + test_pack_RIP_INFO(); + test_pack_SECURITY_ATTRIBUTES(); + test_pack_STARTUPINFOA(); + test_pack_STARTUPINFOW(); + test_pack_SYSTEMTIME(); + test_pack_SYSTEM_POWER_STATUS(); + test_pack_TIME_ZONE_INFORMATION(); + test_pack_UNLOAD_DLL_DEBUG_INFO(); + test_pack_WIN32_FILE_ATTRIBUTE_DATA(); + test_pack_WIN32_FIND_DATAA(); + test_pack_WIN32_FIND_DATAW(); +} + +START_TEST(generated) +{ + test_pack(); +} diff --git a/reactos/apps/tests/kernel32/heap.c b/reactos/apps/tests/kernel32/heap.c new file mode 100644 index 00000000000..358b00d0a5e --- /dev/null +++ b/reactos/apps/tests/kernel32/heap.c @@ -0,0 +1,89 @@ +/* + * Unit test suite for heap functions + * + * Copyright 2003 Dimitrie O. Paun + * + * 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 "windef.h" +#include "winbase.h" +#include "wine/test.h" + +START_TEST(heap) +{ + void *mem; + HGLOBAL gbl; + SIZE_T size; + + /* Heap*() functions */ + mem = HeapAlloc(GetProcessHeap(), 0, 0); + ok(mem != NULL, "memory not allocated for size 0\n"); + + mem = HeapReAlloc(GetProcessHeap(), 0, NULL, 10); + ok(mem == NULL, "memory allocated by HeapReAlloc\n"); + + /* Global*() functions */ + gbl = GlobalAlloc(GMEM_MOVEABLE, 0); + ok(gbl != NULL, "global memory not allocated for size 0\n"); + + gbl = GlobalReAlloc(gbl, 10, GMEM_MOVEABLE); + ok(gbl != NULL, "Can't realloc global memory\n"); + size = GlobalSize(gbl); + ok(size >= 10 && size <= 16, "Memory not resized to size 10, instead size=%ld\n", size); + + todo_wine + { + gbl = GlobalReAlloc(gbl, 0, GMEM_MOVEABLE); + ok(gbl != NULL, "GlobalReAlloc should not fail on size 0\n"); + } + + size = GlobalSize(gbl); + ok(size == 0, "Memory not resized to size 0, instead size=%ld\n", size); + ok(GlobalFree(gbl) == NULL, "Memory not freed\n"); + size = GlobalSize(gbl); + ok(size == 0, "Memory should have been freed, size=%ld\n", size); + + gbl = GlobalReAlloc(0, 10, GMEM_MOVEABLE); + ok(gbl == NULL, "global realloc allocated memory\n"); + + /* Local*() functions */ + gbl = LocalAlloc(GMEM_MOVEABLE, 0); + ok(gbl != NULL, "local memory not allocated for size 0\n"); + + gbl = LocalReAlloc(gbl, 10, GMEM_MOVEABLE); + ok(gbl != NULL, "Can't realloc local memory\n"); + size = LocalSize(gbl); + ok(size >= 10 && size <= 16, "Memory not resized to size 10, instead size=%ld\n", size); + + todo_wine + { + gbl = LocalReAlloc(gbl, 0, GMEM_MOVEABLE); + ok(gbl != NULL, "LocalReAlloc should not fail on size 0\n"); + } + + size = LocalSize(gbl); + ok(size == 0, "Memory not resized to size 0, instead size=%ld\n", size); + ok(LocalFree(gbl) == NULL, "Memory not freed\n"); + size = LocalSize(gbl); + ok(size == 0, "Memory should have been freed, size=%ld\n", size); + + gbl = LocalReAlloc(0, 10, GMEM_MOVEABLE); + ok(gbl == NULL, "local realloc allocated memory\n"); + +} diff --git a/reactos/apps/tests/kernel32/locale.c b/reactos/apps/tests/kernel32/locale.c new file mode 100644 index 00000000000..0c97b6ca6ae --- /dev/null +++ b/reactos/apps/tests/kernel32/locale.c @@ -0,0 +1,2043 @@ +/* + * Unit tests for locale functions + * + * Copyright 2002 YASAR Mehmet + * Copyright 2003 Dmitry Timoshkov + * 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 + * + * NOTES + * We must pass LOCALE_NOUSEROVERRIDE (NUO) to formatting functions so that + * even when the user has overridden their default i8n settings (e.g. in + * the control panel i8n page), we will still get the expected results. + */ + +#include +#include +#include + +#include "wine/test.h" +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "winnls.h" + +#ifndef DATE_YEARMONTH +#define DATE_YEARMONTH 8 +#endif +#ifndef MAP_EXPAND_LIGATURES +#define MAP_EXPAND_LIGATURES 0x2000 +#endif + +static inline unsigned int strlenW( const WCHAR *str ) +{ + const WCHAR *s = str; + while (*s) s++; + return s - str; +} + +static inline int strncmpW( const WCHAR *str1, const WCHAR *str2, int n ) +{ + if (n <= 0) return 0; + while ((--n > 0) && *str1 && (*str1 == *str2)) { str1++; str2++; } + return *str1 - *str2; +} + +static inline WCHAR *strchrW( const WCHAR *str, WCHAR ch ) +{ + for ( ; *str; str++) if (*str == ch) return (WCHAR *)str; + return NULL; +} + +inline static int isdigitW( WCHAR wc ) +{ + WORD type; + GetStringTypeW( CT_CTYPE1, &wc, 1, &type ); + return type & C1_DIGIT; +} + +/* Some functions are only in later versions of kernel32.dll */ +static HMODULE hKernel32; + +typedef BOOL (WINAPI *EnumSystemLanguageGroupsAFn)(LANGUAGEGROUP_ENUMPROC, + DWORD, LONG_PTR); +static EnumSystemLanguageGroupsAFn pEnumSystemLanguageGroupsA; +typedef BOOL (WINAPI *EnumLanguageGroupLocalesAFn)(LANGGROUPLOCALE_ENUMPROC, + LGRPID, DWORD, LONG_PTR); +static EnumLanguageGroupLocalesAFn pEnumLanguageGroupLocalesA; + +typedef INT (WINAPI *FoldStringAFn)(DWORD, LPCSTR, INT, LPSTR, INT); +static FoldStringAFn pFoldStringA; +typedef INT (WINAPI *FoldStringWFn)(DWORD, LPCWSTR, INT, LPWSTR, INT); +static FoldStringWFn pFoldStringW; + +typedef BOOL (WINAPI *IsValidLanguageGroupFn)(LGRPID, DWORD); +static IsValidLanguageGroupFn pIsValidLanguageGroup; + +static void InitFunctionPointers(void) +{ + hKernel32 = GetModuleHandleA("kernel32"); + + if (hKernel32) + { + pEnumSystemLanguageGroupsA = (void*)GetProcAddress(hKernel32, "EnumSystemLanguageGroupsA"); + pEnumLanguageGroupLocalesA = (void*)GetProcAddress(hKernel32, "EnumLanguageGroupLocalesA"); + pFoldStringA = (void*)GetProcAddress(hKernel32, "FoldStringA"); + pFoldStringW = (void*)GetProcAddress(hKernel32, "FoldStringW"); + pIsValidLanguageGroup = (void*)GetProcAddress(hKernel32, "IsValidLanguageGroup"); + } +} + +#define eq(received, expected, label, type) \ + ok((received) == (expected), "%s: got " type " instead of " type "\n", \ + (label), (received), (expected)) + +#define BUFFER_SIZE 128 +char GlobalBuffer[BUFFER_SIZE]; /* Buffer used by callback function */ +#define COUNTOF(x) (sizeof(x)/sizeof(x)[0]) + +#define EXPECT_LEN(len) ok(ret == (len), "Expected Len %d, got %d\n", (len), ret) +#define EXPECT_INVALID ok(GetLastError() == ERROR_INVALID_PARAMETER, \ + "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError()) +#define EXPECT_BUFFER ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, \ + "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError()) +#define EXPECT_FLAGS ok(GetLastError() == ERROR_INVALID_FLAGS, \ + "Expected ERROR_INVALID_FLAGS, got %ld\n", GetLastError()) +#define EXPECT_INVALIDFLAGS ok(GetLastError() == ERROR_INVALID_FLAGS || \ + GetLastError() == ERROR_INVALID_PARAMETER, \ + "Expected ERROR_INVALID_FLAGS, got %ld\n", GetLastError()) +#define EXPECT_VALID ok(GetLastError() == 0, \ + "Expected GetLastError() == 0, got %ld\n", GetLastError()) + +#define STRINGSA(x,y) strcpy(input, x); strcpy(Expected, y); SetLastError(0); buffer[0] = '\0' +#define EXPECT_LENA EXPECT_LEN((int)strlen(Expected)+1) +#define EXPECT_EQA ok(strncmp(buffer, Expected, strlen(Expected)) == 0, \ + "Expected '%s', got '%s'\n", Expected, buffer) + +#define STRINGSW(x,y) MultiByteToWideChar(CP_ACP,0,x,-1,input,COUNTOF(input)); \ + MultiByteToWideChar(CP_ACP,0,y,-1,Expected,COUNTOF(Expected)); \ + SetLastError(0); buffer[0] = '\0' +#define EXPECT_LENW EXPECT_LEN((int)strlenW(Expected)+1) +#define EXPECT_EQW ok(strncmpW(buffer, Expected, strlenW(Expected)) == 0, "Bad conversion\n") + +#define NUO LOCALE_NOUSEROVERRIDE + +static void test_GetLocaleInfoA() +{ + int ret; + LCID lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT); + char buffer[BUFFER_SIZE]; + + ok(lcid == 0x409, "wrong LCID calculated - %ld\n", lcid); + + /* HTMLKit and "Font xplorer lite" expect GetLocaleInfoA to + * partially fill the buffer even if it is too short. See bug 637. + */ + SetLastError(0); memset(buffer, 0, COUNTOF(buffer)); + ret = GetLocaleInfoA(lcid, NUO|LOCALE_SDAYNAME1, buffer, 0); + ok(ret == 7 && !buffer[0], "Expected len=7, got %d\n", ret); + + SetLastError(0); memset(buffer, 0, COUNTOF(buffer)); + ret = GetLocaleInfoA(lcid, NUO|LOCALE_SDAYNAME1, buffer, 3); + EXPECT_BUFFER; EXPECT_LEN(0); + ok(!strcmp(buffer, "Mon"), "Expected 'Mon', got '%s'\n", buffer); + + SetLastError(0); memset(buffer, 0, COUNTOF(buffer)); + ret = GetLocaleInfoA(lcid, NUO|LOCALE_SDAYNAME1, buffer, 10); + EXPECT_VALID; EXPECT_LEN(7); + ok(!strcmp(buffer, "Monday"), "Expected 'Monday', got '%s'\n", buffer); +} + +static void test_GetTimeFormatA() +{ + int ret; + SYSTEMTIME curtime; + LCID lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT); + char buffer[BUFFER_SIZE], input[BUFFER_SIZE], Expected[BUFFER_SIZE]; + + memset(&curtime, 2, sizeof(SYSTEMTIME)); + STRINGSA("tt HH':'mm'@'ss", ""); /* Invalid time */ + ret = GetTimeFormatA(lcid, TIME_FORCE24HOURFORMAT, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_INVALID; EXPECT_LEN(0); EXPECT_EQA; + + curtime.wHour = 8; + curtime.wMinute = 56; + curtime.wSecond = 13; + curtime.wMilliseconds = 22; + STRINGSA("tt HH':'mm'@'ss", "AM 08:56@13"); /* Valid time */ + ret = GetTimeFormatA(lcid, TIME_FORCE24HOURFORMAT, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("tt HH':'mm'@'ss", "A"); /* Insufficent buffer */ + ret = GetTimeFormatA(lcid, TIME_FORCE24HOURFORMAT, &curtime, input, buffer, 2); + EXPECT_BUFFER; EXPECT_LEN(0); EXPECT_EQA; + + STRINGSA("tt HH':'mm'@'ss", "AM 08:56@13"); /* Calculate length only */ + ret = GetTimeFormatA(lcid, TIME_FORCE24HOURFORMAT, &curtime, input, NULL, 0); + EXPECT_VALID; EXPECT_LENA; + + STRINGSA("", "8 AM"); /* TIME_NOMINUTESORSECONDS, default format */ + ret = GetTimeFormatA(lcid, NUO|TIME_NOMINUTESORSECONDS, &curtime, NULL, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("m1s2m3s4", ""); /* TIME_NOMINUTESORSECONDS/complex format */ + ret = GetTimeFormatA(lcid, TIME_NOMINUTESORSECONDS, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("", "8:56 AM"); /* TIME_NOSECONDS/Default format */ + ret = GetTimeFormatA(lcid, NUO|TIME_NOSECONDS, &curtime, NULL, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("h:m:s tt", "8:56 AM"); /* TIME_NOSECONDS */ + strcpy(Expected, "8:56 AM"); + ret = GetTimeFormatA(lcid, TIME_NOSECONDS, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("h.@:m.@:s.@:tt", "8.@:56AM"); /* Multiple delimiters */ + ret = GetTimeFormatA(lcid, TIME_NOSECONDS, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("s1s2s3", ""); /* Duplicate tokens */ + ret = GetTimeFormatA(lcid, TIME_NOSECONDS, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("t/tt", "A/AM"); /* AM time marker */ + ret = GetTimeFormatA(lcid, 0, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + curtime.wHour = 13; + STRINGSA("t/tt", "P/PM"); /* PM time marker */ + ret = GetTimeFormatA(lcid, 0, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("h1t2tt3m", "156"); /* TIME_NOTIMEMARKER: removes text around time marker token */ + ret = GetTimeFormatA(lcid, TIME_NOTIMEMARKER, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("h:m:s tt", "13:56:13 PM"); /* TIME_FORCE24HOURFORMAT */ + ret = GetTimeFormatA(lcid, TIME_FORCE24HOURFORMAT, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("h:m:s", "13:56:13"); /* TIME_FORCE24HOURFORMAT doesn't add time marker */ + ret = GetTimeFormatA(lcid, TIME_FORCE24HOURFORMAT, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + curtime.wHour = 14; /* change this to 14 or 2pm */ + curtime.wMinute = 5; + curtime.wSecond = 3; + STRINGSA("h hh H HH m mm s ss t tt", "2 02 14 14 5 05 3 03 P PM"); /* 24 hrs, leading 0 */ + ret = GetTimeFormatA(lcid, 0, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + curtime.wHour = 0; + STRINGSA("h/H/hh/HH", "12/0/12/00"); /* "hh" and "HH" */ + ret = GetTimeFormatA(lcid, 0, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("h:m:s tt", "12:5:3 AM"); /* non-zero flags should fail with format, doesn't */ + ret = GetTimeFormatA(lcid, 0, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + /* try to convert formatting strings with more than two letters + * "h:hh:hhh:H:HH:HHH:m:mm:mmm:M:MM:MMM:s:ss:sss:S:SS:SSS" + * NOTE: We expect any letter for which there is an upper case value + * we should see a replacement. For letters that DO NOT have + * upper case values we should see NO REPLACEMENT. + */ + curtime.wHour = 8; + curtime.wMinute = 56; + curtime.wSecond = 13; + curtime.wMilliseconds = 22; + STRINGSA("h:hh:hhh H:HH:HHH m:mm:mmm M:MM:MMM s:ss:sss S:SS:SSS", + "8:08:08 8:08:08 56:56:56 M:MM:MMM 13:13:13 S:SS:SSS"); + ret = GetTimeFormatA(lcid, 0, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("h", "text"); /* Don't write to buffer if len is 0 */ + strcpy(buffer, "text"); + ret = GetTimeFormatA(lcid, 0, &curtime, input, buffer, 0); + EXPECT_VALID; EXPECT_LEN(2); EXPECT_EQA; + + STRINGSA("h 'h' H 'H' HH 'HH' m 'm' s 's' t 't' tt 'tt'", + "8 h 8 H 08 HH 56 m 13 s A t AM tt"); /* "'" preserves tokens */ + ret = GetTimeFormatA(lcid, 0, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("'''", "'"); /* invalid quoted string */ + ret = GetTimeFormatA(lcid, 0, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + /* test that msdn suggested single quotation usage works as expected */ + STRINGSA("''''", "'"); /* single quote mark */ + ret = GetTimeFormatA(lcid, 0, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("''HHHHHH", "08"); /* Normal use */ + ret = GetTimeFormatA(lcid, 0, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + /* and test for normal use of the single quotation mark */ + STRINGSA("'''HHHHHH'", "'HHHHHH"); /* Normal use */ + ret = GetTimeFormatA(lcid, 0, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("'''HHHHHH", "'HHHHHH"); /* Odd use */ + ret = GetTimeFormatA(lcid, 0, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("'123'tt", ""); /* TIME_NOTIMEMARKER drops literals too */ + ret = GetTimeFormatA(lcid, TIME_NOTIMEMARKER, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + curtime.wHour = 25; + STRINGSA("'123'tt", ""); /* Invalid time */ + ret = GetTimeFormatA(lcid, 0, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_INVALID; EXPECT_LEN(0); EXPECT_EQA; + + curtime.wHour = 12; + curtime.wMonth = 60; /* Invalid */ + STRINGSA("h:m:s", "12:56:13"); /* Invalid date */ + ret = GetTimeFormatA(lcid, 0, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; +} + +static void test_GetDateFormatA() +{ + int ret; + SYSTEMTIME curtime; + LCID lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT); + char buffer[BUFFER_SIZE], input[BUFFER_SIZE], Expected[BUFFER_SIZE]; + + memset(&curtime, 2, sizeof(SYSTEMTIME)); /* Invalid time */ + STRINGSA("ddd',' MMM dd yy",""); + ret = GetDateFormatA(lcid, 0, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_INVALID; EXPECT_LEN(0); EXPECT_EQA; + + curtime.wYear = 2002; + curtime.wMonth = 5; + curtime.wDay = 4; + curtime.wDayOfWeek = 3; + STRINGSA("ddd',' MMM dd yy","Sat, May 04 02"); /* Simple case */ + ret = GetDateFormatA(lcid, 0, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("ddd',' MMM dd yy","Sat, May 04 02"); /* Format containing "'" */ + ret = GetDateFormatA(lcid, 0, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + curtime.wHour = 36; /* Invalid */ + STRINGSA("ddd',' MMM dd ''''yy","Sat, May 04 '02"); /* Invalid time */ + ret = GetDateFormatA(lcid, 0, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("ddd',' MMM dd ''''yy",""); /* Get size only */ + ret = GetDateFormatA(lcid, 0, &curtime, input, NULL, 0); + EXPECT_VALID; EXPECT_LEN(16); EXPECT_EQA; + + STRINGSA("ddd',' MMM dd ''''yy",""); /* Buffer too small */ + ret = GetDateFormatA(lcid, 0, &curtime, input, buffer, 2); + EXPECT_BUFFER; EXPECT_LEN(0); EXPECT_EQA; + + STRINGSA("ddd',' MMM dd ''''yy","5/4/2002"); /* Default to DATE_SHORTDATE */ + ret = GetDateFormat(lcid, NUO, &curtime, NULL, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("ddd',' MMM dd ''''yy", "Saturday, May 04, 2002"); /* DATE_LONGDATE */ + ret = GetDateFormat(lcid, NUO|DATE_LONGDATE, &curtime, NULL, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + /* test for expected DATE_YEARMONTH behavior with null format */ + /* NT4 returns ERROR_INVALID_FLAGS for DATE_YEARMONTH */ + STRINGSA("ddd',' MMM dd ''''yy", ""); /* DATE_YEARMONTH */ + ret = GetDateFormat(lcid, NUO|DATE_YEARMONTH, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_FLAGS; EXPECT_LEN(0); EXPECT_EQA; + + /* Test that using invalid DATE_* flags results in the correct error */ + /* and return values */ + STRINGSA("m/d/y", ""); /* Invalid flags */ + ret = GetDateFormat(lcid, DATE_YEARMONTH|DATE_SHORTDATE|DATE_LONGDATE, + &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_FLAGS; EXPECT_LEN(0); EXPECT_EQA; +} + +static void test_GetDateFormatW() +{ + int ret; + SYSTEMTIME curtime; + WCHAR buffer[BUFFER_SIZE], input[BUFFER_SIZE], Expected[BUFFER_SIZE]; + LCID lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT); + + STRINGSW("",""); /* If flags is not zero then format must be NULL */ + ret = GetDateFormatW(LOCALE_SYSTEM_DEFAULT, DATE_LONGDATE, NULL, + input, buffer, COUNTOF(buffer)); + if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + return; + EXPECT_FLAGS; EXPECT_LEN(0); EXPECT_EQW; + + STRINGSW("",""); /* NULL buffer, len > 0 */ + ret = GetDateFormatW (lcid, 0, NULL, input, NULL, COUNTOF(buffer)); + EXPECT_INVALID; EXPECT_LEN(0); EXPECT_EQW; + + STRINGSW("",""); /* NULL buffer, len == 0 */ + ret = GetDateFormatW (lcid, 0, NULL, input, NULL, 0); + EXPECT_VALID; EXPECT_LENW; EXPECT_EQW; + + curtime.wYear = 2002; + curtime.wMonth = 10; + curtime.wDay = 23; + curtime.wDayOfWeek = 45612; /* Should be 3 - Wednesday */ + curtime.wHour = 65432; /* Invalid */ + curtime.wMinute = 34512; /* Invalid */ + curtime.wSecond = 65535; /* Invalid */ + curtime.wMilliseconds = 12345; + STRINGSW("dddd d MMMM yyyy","Wednesday 23 October 2002"); /* Incorrect DOW and time */ + ret = GetDateFormatW (lcid, 0, &curtime, input, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENW; EXPECT_EQW; +} + + +#define CY_POS_LEFT 0 +#define CY_POS_RIGHT 1 +#define CY_POS_LEFT_SPACE 2 +#define CY_POS_RIGHT_SPACE 3 + +static void test_GetCurrencyFormatA() +{ + static char szDot[] = { '.', '\0' }; + static char szComma[] = { ',', '\0' }; + static char szDollar[] = { '$', '\0' }; + int ret; + LCID lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT); + char buffer[BUFFER_SIZE], Expected[BUFFER_SIZE], input[BUFFER_SIZE]; + CURRENCYFMTA format; + + memset(&format, 0, sizeof(format)); + + STRINGSA("23",""); /* NULL output, length > 0 --> Error */ + ret = GetCurrencyFormatA(lcid, 0, input, NULL, NULL, COUNTOF(buffer)); + EXPECT_INVALID; EXPECT_LEN(0); EXPECT_EQA; + + STRINGSA("23,53",""); /* Invalid character --> Error */ + ret = GetCurrencyFormatA(lcid, 0, input, NULL, buffer, COUNTOF(buffer)); + EXPECT_INVALID; EXPECT_LEN(0); EXPECT_EQA; + + STRINGSA("--",""); /* Double '-' --> Error */ + ret = GetCurrencyFormatA(lcid, 0, input, NULL, buffer, COUNTOF(buffer)); + EXPECT_INVALID; EXPECT_LEN(0); EXPECT_EQA; + + STRINGSA("0-",""); /* Trailing '-' --> Error */ + ret = GetCurrencyFormatA(lcid, 0, input, NULL, buffer, COUNTOF(buffer)); + EXPECT_INVALID; EXPECT_LEN(0); EXPECT_EQA; + + STRINGSA("0..",""); /* Double '.' --> Error */ + ret = GetCurrencyFormatA(lcid, 0, input, NULL, buffer, COUNTOF(buffer)); + EXPECT_INVALID; EXPECT_LEN(0); EXPECT_EQA; + + STRINGSA(" 0.1",""); /* Leading space --> Error */ + ret = GetCurrencyFormatA(lcid, 0, input, NULL, buffer, COUNTOF(buffer)); + EXPECT_INVALID; EXPECT_LEN(0); EXPECT_EQA; + + STRINGSA("1234","$"); /* Length too small --> Write up to length chars */ + ret = GetCurrencyFormatA(lcid, NUO, input, NULL, buffer, 2); + EXPECT_BUFFER; EXPECT_LEN(0); EXPECT_EQA; + + STRINGSA("2353",""); /* Format and flags given --> Error */ + ret = GetCurrencyFormatA(lcid, NUO, input, &format, buffer, COUNTOF(buffer)); + EXPECT_INVALIDFLAGS; EXPECT_LEN(0); EXPECT_EQA; + + STRINGSA("2353",""); /* Invalid format --> Error */ + ret = GetCurrencyFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_INVALID; EXPECT_LEN(0); EXPECT_EQA; + + STRINGSA("2353","$2,353.00"); /* Valid number */ + ret = GetCurrencyFormatA(lcid, NUO, input, NULL, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("-2353","($2,353.00)"); /* Valid negative number */ + ret = GetCurrencyFormatA(lcid, NUO, input, NULL, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("2353.1","$2,353.10"); /* Valid real number */ + ret = GetCurrencyFormatA(lcid, NUO, input, NULL, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("2353.111","$2,353.11"); /* Too many DP --> Truncated */ + ret = GetCurrencyFormatA(lcid, NUO, input, NULL, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("2353.119","$2,353.12"); /* Too many DP --> Rounded */ + ret = GetCurrencyFormatA(lcid, NUO, input, NULL, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.NumDigits = 0; /* No decimal separator */ + format.LeadingZero = 0; + format.Grouping = 0; /* No grouping char */ + format.NegativeOrder = 0; + format.PositiveOrder = CY_POS_LEFT; + format.lpDecimalSep = szDot; + format.lpThousandSep = szComma; + format.lpCurrencySymbol = szDollar; + + STRINGSA("2353","$2353"); /* No decimal or grouping chars expected */ + ret = GetCurrencyFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.NumDigits = 1; /* 1 DP --> Expect decimal separator */ + STRINGSA("2353","$2353.0"); + ret = GetCurrencyFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.Grouping = 2; /* Group by 100's */ + STRINGSA("2353","$23,53.0"); + ret = GetCurrencyFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.LeadingZero = 1; /* Always provide leading zero */ + STRINGSA(".5","$0.5"); + ret = GetCurrencyFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.PositiveOrder = CY_POS_RIGHT; + STRINGSA("1","1.0$"); + ret = GetCurrencyFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.PositiveOrder = CY_POS_LEFT_SPACE; + STRINGSA("1","$ 1.0"); + ret = GetCurrencyFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.PositiveOrder = CY_POS_RIGHT_SPACE; + STRINGSA("1","1.0 $"); + ret = GetCurrencyFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.NegativeOrder = 0; + STRINGSA("-1","($1.0)"); + ret = GetCurrencyFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.NegativeOrder = 1; + STRINGSA("-1","-$1.0"); + ret = GetCurrencyFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.NegativeOrder = 2; + STRINGSA("-1","$-1.0"); + ret = GetCurrencyFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.NegativeOrder = 3; + STRINGSA("-1","$1.0-"); + ret = GetCurrencyFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.NegativeOrder = 4; + STRINGSA("-1","(1.0$)"); + ret = GetCurrencyFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.NegativeOrder = 5; + STRINGSA("-1","-1.0$"); + ret = GetCurrencyFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.NegativeOrder = 6; + STRINGSA("-1","1.0-$"); + ret = GetCurrencyFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.NegativeOrder = 7; + STRINGSA("-1","1.0$-"); + ret = GetCurrencyFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.NegativeOrder = 8; + STRINGSA("-1","-1.0 $"); + ret = GetCurrencyFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.NegativeOrder = 9; + STRINGSA("-1","-$ 1.0"); + ret = GetCurrencyFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.NegativeOrder = 10; + STRINGSA("-1","1.0 $-"); + ret = GetCurrencyFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.NegativeOrder = 11; + STRINGSA("-1","$ 1.0-"); + ret = GetCurrencyFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.NegativeOrder = 12; + STRINGSA("-1","$ -1.0"); + ret = GetCurrencyFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.NegativeOrder = 13; + STRINGSA("-1","1.0- $"); + ret = GetCurrencyFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.NegativeOrder = 14; + STRINGSA("-1","($ 1.0)"); + ret = GetCurrencyFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.NegativeOrder = 15; + STRINGSA("-1","(1.0 $)"); + ret = GetCurrencyFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; +} + +#define NEG_PARENS 0 /* "(1.1)" */ +#define NEG_LEFT 1 /* "-1.1" */ +#define NEG_LEFT_SPACE 2 /* "- 1.1" */ +#define NEG_RIGHT 3 /* "1.1-" */ +#define NEG_RIGHT_SPACE 4 /* "1.1 -" */ + +static void test_GetNumberFormatA() +{ + static char szDot[] = { '.', '\0' }; + static char szComma[] = { ',', '\0' }; + int ret; + LCID lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT); + char buffer[BUFFER_SIZE], Expected[BUFFER_SIZE], input[BUFFER_SIZE]; + NUMBERFMTA format; + + memset(&format, 0, sizeof(format)); + + STRINGSA("23",""); /* NULL output, length > 0 --> Error */ + ret = GetNumberFormatA(lcid, 0, input, NULL, NULL, COUNTOF(buffer)); + EXPECT_INVALID; EXPECT_LEN(0); EXPECT_EQA; + + STRINGSA("23,53",""); /* Invalid character --> Error */ + ret = GetNumberFormatA(lcid, 0, input, NULL, buffer, COUNTOF(buffer)); + EXPECT_INVALID; EXPECT_LEN(0); EXPECT_EQA; + + STRINGSA("--",""); /* Double '-' --> Error */ + ret = GetNumberFormatA(lcid, 0, input, NULL, buffer, COUNTOF(buffer)); + EXPECT_INVALID; EXPECT_LEN(0); EXPECT_EQA; + + STRINGSA("0-",""); /* Trailing '-' --> Error */ + ret = GetNumberFormatA(lcid, 0, input, NULL, buffer, COUNTOF(buffer)); + EXPECT_INVALID; EXPECT_LEN(0); EXPECT_EQA; + + STRINGSA("0..",""); /* Double '.' --> Error */ + ret = GetNumberFormatA(lcid, 0, input, NULL, buffer, COUNTOF(buffer)); + EXPECT_INVALID; EXPECT_LEN(0); EXPECT_EQA; + + STRINGSA(" 0.1",""); /* Leading space --> Error */ + ret = GetNumberFormatA(lcid, 0, input, NULL, buffer, COUNTOF(buffer)); + EXPECT_INVALID; EXPECT_LEN(0); EXPECT_EQA; + + STRINGSA("1234","1"); /* Length too small --> Write up to length chars */ + ret = GetNumberFormatA(lcid, NUO, input, NULL, buffer, 2); + EXPECT_BUFFER; EXPECT_LEN(0); EXPECT_EQA; + + STRINGSA("2353",""); /* Format and flags given --> Error */ + ret = GetNumberFormatA(lcid, NUO, input, &format, buffer, COUNTOF(buffer)); + EXPECT_INVALIDFLAGS; EXPECT_LEN(0); EXPECT_EQA; + + STRINGSA("2353",""); /* Invalid format --> Error */ + ret = GetNumberFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_INVALID; EXPECT_LEN(0); EXPECT_EQA; + + STRINGSA("2353","2,353.00"); /* Valid number */ + ret = GetNumberFormatA(lcid, NUO, input, NULL, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("-2353","-2,353.00"); /* Valid negative number */ + ret = GetNumberFormatA(lcid, NUO, input, NULL, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("-353","-353.00"); /* test for off by one error in grouping */ + ret = GetNumberFormatA(lcid, NUO, input, NULL, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("2353.1","2,353.10"); /* Valid real number */ + ret = GetNumberFormatA(lcid, NUO, input, NULL, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("2353.111","2,353.11"); /* Too many DP --> Truncated */ + ret = GetNumberFormatA(lcid, NUO, input, NULL, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + STRINGSA("2353.119","2,353.12"); /* Too many DP --> Rounded */ + ret = GetNumberFormatA(lcid, NUO, input, NULL, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.NumDigits = 0; /* No decimal separator */ + format.LeadingZero = 0; + format.Grouping = 0; /* No grouping char */ + format.NegativeOrder = 0; + format.lpDecimalSep = szDot; + format.lpThousandSep = szComma; + + STRINGSA("2353","2353"); /* No decimal or grouping chars expected */ + ret = GetNumberFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.NumDigits = 1; /* 1 DP --> Expect decimal separator */ + STRINGSA("2353","2353.0"); + ret = GetNumberFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.Grouping = 2; /* Group by 100's */ + STRINGSA("2353","23,53.0"); + ret = GetNumberFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.LeadingZero = 1; /* Always provide leading zero */ + STRINGSA(".5","0.5"); + ret = GetNumberFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.NegativeOrder = NEG_PARENS; + STRINGSA("-1","(1.0)"); + ret = GetNumberFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.NegativeOrder = NEG_LEFT; + STRINGSA("-1","-1.0"); + ret = GetNumberFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.NegativeOrder = NEG_LEFT_SPACE; + STRINGSA("-1","- 1.0"); + ret = GetNumberFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.NegativeOrder = NEG_RIGHT; + STRINGSA("-1","1.0-"); + ret = GetNumberFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + format.NegativeOrder = NEG_RIGHT_SPACE; + STRINGSA("-1","1.0 -"); + ret = GetNumberFormatA(lcid, 0, input, &format, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + + lcid = MAKELCID(MAKELANGID(LANG_FRENCH, SUBLANG_DEFAULT), SORT_DEFAULT); + + if (IsValidLocale(lcid, 0)) + { + STRINGSA("-12345","-12 345,00"); /* Try French formatting */ + Expected[3] = 160; /* Non breaking space */ + ret = GetNumberFormatA(lcid, NUO, input, NULL, buffer, COUNTOF(buffer)); + EXPECT_VALID; EXPECT_LENA; EXPECT_EQA; + } +} + + +/* Callback function used by TestEnumTimeFormats */ +static BOOL CALLBACK EnumTimeFormatsProc(char * lpTimeFormatString) +{ + trace("%s\n", lpTimeFormatString); + strcpy(GlobalBuffer, lpTimeFormatString); +#if 0 + return TRUE; +#endif + return FALSE; +} + +void test_EnumTimeFormats() +{ + int ret; + LCID lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT); + + GlobalBuffer[0] = '\0'; + ret = EnumTimeFormatsA(EnumTimeFormatsProc, lcid, 0); + ok (ret == 1 && !strcmp(GlobalBuffer,"h:mm:ss tt"), "Expected %d '%s'\n", ret, GlobalBuffer); +} + +static void test_CompareStringA() +{ + int ret; + LCID lcid = MAKELCID(MAKELANGID(LANG_FRENCH, SUBLANG_DEFAULT), SORT_DEFAULT); + + ret = CompareStringA(lcid, NORM_IGNORECASE, "Salut", -1, "Salute", -1); + ok (ret== 1, "(Salut/Salute) Expected 1, got %d\n", ret); + + ret = CompareStringA(lcid, NORM_IGNORECASE, "Salut", -1, "SaLuT", -1); + ok (ret== 2, "(Salut/SaLuT) Expected 2, got %d\n", ret); + + ret = CompareStringA(lcid, NORM_IGNORECASE, "Salut", -1, "hola", -1); + ok (ret== 3, "(Salut/hola) Expected 3, got %d\n", ret); + + ret = CompareStringA(lcid, NORM_IGNORECASE, "haha", -1, "hoho", -1); + ok (ret== 1, "(haha/hoho) Expected 1, got %d\n", ret); + + lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT); + + ret = CompareStringA(lcid, NORM_IGNORECASE, "haha", -1, "hoho", -1); + ok (ret== 1, "(haha/hoho) Expected 1, got %d\n", ret); + + ret = CompareStringA(lcid, NORM_IGNORECASE, "haha", -1, "hoho", 0); + ok (ret== 3, "(haha/hoho) Expected 3, got %d\n", ret); + + ret = CompareStringA(lcid, NORM_IGNORECASE, "Salut", 5, "saLuT", -1); + ok (ret == 2, "(Salut/saLuT) Expected 2, got %d\n", ret); + + SetLastError(0xdeadbeef); + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0x10, "NULL", -1, "NULL", -1); + ok(GetLastError() == ERROR_INVALID_FLAGS, + "unexpected error code %ld\n", GetLastError()); + ok(!ret, "CompareStringA must fail with invalid flag\n"); + + ret = lstrcmpA("", ""); + ok (!ret, "lstrcmpA(\"\", \"\") should return 0, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT,0,"EndDialog",-1,"_Property",-1); + ok( ret == 3, "EndDialog vs _Property ... expected 3, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT,0,"osp_vba.sreg0070",-1,"_IEWWBrowserComp",-1); + ok( ret == 3, "osp_vba.sreg0070 vs _IEWWBrowserComp ... expected 3, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT,0,"r",-1,"\\",-1); + ok( ret == 3, "r vs \\ ... expected 3, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT,0,"osp_vba.sreg0031", -1, "OriginalDatabase", -1 ); + ok( ret == 3, "osp_vba.sreg0031 vs OriginalDatabase ... expected 3, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, "AAA", -1, "aaa", -1 ); + ok( ret == 3, "AAA vs aaa expected 3, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, "AAA", -1, "aab", -1 ); + ok( ret == 1, "AAA vs aab expected 1, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, "AAA", -1, "Aab", -1 ); + ok( ret == 1, "AAA vs Aab expected 1, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, ".AAA", -1, "Aab", -1 ); + ok( ret == 1, ".AAA vs Aab expected 1, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, ".AAA", -1, "A.ab", -1 ); + ok( ret == 1, ".AAA vs A.ab expected 1, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, "aa", -1, "AB", -1 ); + ok( ret == 1, "aa vs AB expected 1, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, "aa", -1, "Aab", -1 ); + ok( ret == 1, "aa vs Aab expected 1, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, "aB", -1, "Aab", -1 ); + ok( ret == 3, "aB vs Aab expected 3, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, "Ba", -1, "bab", -1 ); + ok( ret == 1, "Ba vs bab expected 1, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, "{100}{83}{71}{71}{71}", -1, "Global_DataAccess_JRO", -1 ); + ok( ret == 1, "{100}{83}{71}{71}{71} vs Global_DataAccess_JRO expected 1, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, "a", -1, "{", -1 ); + ok( ret == 3, "a vs { expected 3, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, "A", -1, "{", -1 ); + ok( ret == 3, "A vs { expected 3, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, "3.5", 0, "4.0", -1 ); + ok(ret == 1, "3.5/0 vs 4.0/-1 expected 1, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, "3.5", -1, "4.0", -1 ); + ok(ret == 1, "3.5 vs 4.0 expected 1, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, "3.520.4403.2", -1, "4.0.2927.10", -1 ); + ok(ret == 1, "3.520.4403.2 vs 4.0.2927.10 expected 1, got %d\n", ret); + + /* hyphen and apostrophe are treated differently depending on + * whether SORT_STRINGSORT specified or not + */ + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, "-o", -1, "/m", -1 ); + ok(ret == 3, "-o vs /m expected 3, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, "/m", -1, "-o", -1 ); + ok(ret == 1, "/m vs -o expected 1, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, SORT_STRINGSORT, "-o", -1, "/m", -1 ); + ok(ret == 1, "-o vs /m expected 1, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, SORT_STRINGSORT, "/m", -1, "-o", -1 ); + ok(ret == 3, "/m vs -o expected 3, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, "'o", -1, "/m", -1 ); + ok(ret == 3, "'o vs /m expected 3, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, "/m", -1, "'o", -1 ); + ok(ret == 1, "/m vs 'o expected 1, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, SORT_STRINGSORT, "'o", -1, "/m", -1 ); + ok(ret == 1, "'o vs /m expected 1, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, SORT_STRINGSORT, "/m", -1, "'o", -1 ); + ok(ret == 3, "/m vs 'o expected 3, got %d\n", ret); + +#if 0 /* this requires collation table patch to make it MS compatible */ + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, "'o", -1, "-o", -1 ); + ok(ret == 1, "'o vs -o expected 1, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, SORT_STRINGSORT, "'o", -1, "-o", -1 ); + ok(ret == 1, "'o vs -o expected 1, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, "'", -1, "-", -1 ); + ok(ret == 1, "' vs - expected 1, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, SORT_STRINGSORT, "'", -1, "-", -1 ); + ok(ret == 1, "' vs - expected 1, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, "`o", -1, "/m", -1 ); + ok(ret == 3, "`o vs /m expected 3, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, "/m", -1, "`o", -1 ); + ok(ret == 1, "/m vs `o expected 1, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, SORT_STRINGSORT, "`o", -1, "/m", -1 ); + ok(ret == 3, "`o vs /m expected 3, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, SORT_STRINGSORT, "/m", -1, "`o", -1 ); + ok(ret == 1, "/m vs `o expected 1, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, "`o", -1, "-m", -1 ); + ok(ret == 1, "`o vs -m expected 1, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, "-m", -1, "`o", -1 ); + ok(ret == 3, "-m vs `o expected 3, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, SORT_STRINGSORT, "`o", -1, "-m", -1 ); + ok(ret == 3, "`o vs -m expected 3, got %d\n", ret); + + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, SORT_STRINGSORT, "-m", -1, "`o", -1 ); + ok(ret == 1, "-m vs `o expected 1, got %d\n", ret); +#endif + + ret = CompareStringA(LOCALE_USER_DEFAULT, 0, "aLuZkUtZ", 8, "aLuZkUtZ", 9); + ok(ret == 2, "aLuZkUtZ vs aLuZkUtZ\\0 expected 2, got %d\n", ret); + + ret = CompareStringA(LOCALE_USER_DEFAULT, 0, "aLuZkUtZ", 7, "aLuZkUtZ\0A", 10); + ok(ret == 1, "aLuZkUtZ vs aLuZkUtZ\\0A expected 1, got %d\n", ret); + + ret = CompareStringA(LOCALE_USER_DEFAULT, 0, "aLuZkUtZ", 8, "aLuZkUtZ\0A", 10); + ok(ret == 2, "aLuZkUtZ vs aLuZkUtZ\\0A expected 2, got %d\n", ret); + + ret = CompareStringA(LOCALE_USER_DEFAULT, 0, "aLu\0ZkUtZ", 8, "aLu\0ZkUtZ\0A", 10); + ok(ret == 2, "aLu\\0ZkUtZ vs aLu\\0ZkUtZ\\0A expected 2, got %d\n", ret); +} + +void test_LCMapStringA(void) +{ + int ret, ret2; + char buf[256], buf2[256]; + static const char upper_case[] = "\tJUST! A, TEST; STRING 1/*+-.\r\n"; + static const char lower_case[] = "\tjust! a, test; string 1/*+-.\r\n"; + static const char symbols_stripped[] = "justateststring1"; + + ret = LCMapStringA(LOCALE_USER_DEFAULT, LCMAP_LOWERCASE | LCMAP_UPPERCASE, + upper_case, -1, buf, sizeof(buf)); + ok(!ret, "LCMAP_LOWERCASE and LCMAP_UPPERCASE are mutually exclusive\n"); + ok(GetLastError() == ERROR_INVALID_FLAGS, + "unexpected error code %ld\n", GetLastError()); + + ret = LCMapStringA(LOCALE_USER_DEFAULT, LCMAP_HIRAGANA | LCMAP_KATAKANA, + upper_case, -1, buf, sizeof(buf)); + ok(!ret, "LCMAP_HIRAGANA and LCMAP_KATAKANA are mutually exclusive\n"); + ok(GetLastError() == ERROR_INVALID_FLAGS, + "unexpected error code %ld\n", GetLastError()); + + ret = LCMapStringA(LOCALE_USER_DEFAULT, LCMAP_HALFWIDTH | LCMAP_FULLWIDTH, + + upper_case, -1, buf, sizeof(buf)); + ok(!ret, "LCMAP_HALFWIDTH | LCMAP_FULLWIDTH are mutually exclusive\n"); + ok(GetLastError() == ERROR_INVALID_FLAGS, + "unexpected error code %ld\n", GetLastError()); + + ret = LCMapStringA(LOCALE_USER_DEFAULT, LCMAP_TRADITIONAL_CHINESE | LCMAP_SIMPLIFIED_CHINESE, + upper_case, -1, buf, sizeof(buf)); + ok(!ret, "LCMAP_TRADITIONAL_CHINESE and LCMAP_SIMPLIFIED_CHINESE are mutually exclusive\n"); + ok(GetLastError() == ERROR_INVALID_FLAGS, + "unexpected error code %ld\n", GetLastError()); + + /* SORT_STRINGSORT must be used exclusively with LCMAP_SORTKEY */ + SetLastError(0xdeadbeef); + ret = LCMapStringA(LOCALE_USER_DEFAULT, LCMAP_LOWERCASE | SORT_STRINGSORT, + upper_case, -1, buf, sizeof(buf)); + ok(GetLastError() == ERROR_INVALID_FLAGS, "expected ERROR_INVALID_FLAGS, got %ld\n", GetLastError()); + ok(!ret, "SORT_STRINGSORT without LCMAP_SORTKEY must fail\n"); + + /* test LCMAP_LOWERCASE */ + ret = LCMapStringA(LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, + upper_case, -1, buf, sizeof(buf)); + ok(ret == lstrlenA(upper_case) + 1, + "ret %d, error %ld, expected value %d\n", + ret, GetLastError(), lstrlenA(upper_case) + 1); + ok(!lstrcmpA(buf, lower_case), "LCMapStringA should return %s, but not %s\n", lower_case, buf); + + /* test LCMAP_UPPERCASE */ + ret = LCMapStringA(LOCALE_USER_DEFAULT, LCMAP_UPPERCASE, + lower_case, -1, buf, sizeof(buf)); + ok(ret == lstrlenA(lower_case) + 1, + "ret %d, error %ld, expected value %d\n", + ret, GetLastError(), lstrlenA(lower_case) + 1); + ok(!lstrcmpA(buf, upper_case), "LCMapStringA should return %s, but not %s\n", upper_case, buf); + + /* test buffer overflow */ + SetLastError(0xdeadbeef); + ret = LCMapStringA(LOCALE_USER_DEFAULT, LCMAP_UPPERCASE, + lower_case, -1, buf, 4); + ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, + "should return 0 and ERROR_INSUFFICIENT_BUFFER, got %d\n", ret); + + /* LCMAP_UPPERCASE or LCMAP_LOWERCASE should accept src == dst */ + lstrcpyA(buf, lower_case); + ret = LCMapStringA(LOCALE_USER_DEFAULT, LCMAP_UPPERCASE, + buf, -1, buf, sizeof(buf)); + if (!ret) /* Win9x */ + trace("Ignoring LCMapStringA(LCMAP_UPPERCASE, buf, buf) error on Win9x\n"); + else + { + ok(ret == lstrlenA(lower_case) + 1, + "ret %d, error %ld, expected value %d\n", + ret, GetLastError(), lstrlenA(lower_case) + 1); + ok(!lstrcmpA(buf, upper_case), "LCMapStringA should return %s, but not %s\n", upper_case, buf); + } + lstrcpyA(buf, upper_case); + ret = LCMapStringA(LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, + buf, -1, buf, sizeof(buf)); + if (!ret) /* Win9x */ + trace("Ignoring LCMapStringA(LCMAP_LOWERCASE, buf, buf) error on Win9x\n"); + else + { + ok(ret == lstrlenA(upper_case) + 1, + "ret %d, error %ld, expected value %d\n", + ret, GetLastError(), lstrlenA(lower_case) + 1); + ok(!lstrcmpA(buf, lower_case), "LCMapStringA should return %s, but not %s\n", lower_case, buf); + } + + /* otherwise src == dst should fail */ + SetLastError(0xdeadbeef); + ret = LCMapStringA(LOCALE_USER_DEFAULT, LCMAP_SORTKEY | LCMAP_UPPERCASE, + buf, 10, buf, sizeof(buf)); + ok(GetLastError() == ERROR_INVALID_FLAGS /* NT */ || + GetLastError() == ERROR_INVALID_PARAMETER /* Win9x */, + "unexpected error code %ld\n", GetLastError()); + ok(!ret, "src == dst without LCMAP_UPPERCASE or LCMAP_LOWERCASE must fail\n"); + + /* test whether '\0' is always appended */ + ret = LCMapStringA(LOCALE_USER_DEFAULT, LCMAP_SORTKEY, + upper_case, -1, buf, sizeof(buf)); + ok(ret, "LCMapStringA must succeed\n"); + ret2 = LCMapStringA(LOCALE_USER_DEFAULT, LCMAP_SORTKEY, + upper_case, lstrlenA(upper_case), buf2, sizeof(buf2)); + ok(ret, "LCMapStringA must succeed\n"); + ok(ret == ret2, "lengths of sort keys must be equal\n"); + ok(!lstrcmpA(buf, buf2), "sort keys must be equal\n"); + + /* test LCMAP_SORTKEY | NORM_IGNORECASE */ + ret = LCMapStringA(LOCALE_USER_DEFAULT, LCMAP_SORTKEY | NORM_IGNORECASE, + upper_case, -1, buf, sizeof(buf)); + ok(ret, "LCMapStringA must succeed\n"); + ret2 = LCMapStringA(LOCALE_USER_DEFAULT, LCMAP_SORTKEY, + lower_case, -1, buf2, sizeof(buf2)); + ok(ret2, "LCMapStringA must succeed\n"); + ok(ret == ret2, "lengths of sort keys must be equal\n"); + ok(!lstrcmpA(buf, buf2), "sort keys must be equal\n"); + + /* test LCMAP_SORTKEY | NORM_IGNORENONSPACE */ + ret = LCMapStringA(LOCALE_USER_DEFAULT, LCMAP_SORTKEY | NORM_IGNORENONSPACE, + lower_case, -1, buf, sizeof(buf)); + ok(ret, "LCMapStringA must succeed\n"); + ret2 = LCMapStringA(LOCALE_USER_DEFAULT, LCMAP_SORTKEY, + lower_case, -1, buf2, sizeof(buf2)); + ok(ret2, "LCMapStringA must succeed\n"); + ok(ret == ret2, "lengths of sort keys must be equal\n"); + ok(!lstrcmpA(buf, buf2), "sort keys must be equal\n"); + + /* test LCMAP_SORTKEY | NORM_IGNORESYMBOLS */ + ret = LCMapStringA(LOCALE_USER_DEFAULT, LCMAP_SORTKEY | NORM_IGNORESYMBOLS, + lower_case, -1, buf, sizeof(buf)); + ok(ret, "LCMapStringA must succeed\n"); + ret2 = LCMapStringA(LOCALE_USER_DEFAULT, LCMAP_SORTKEY, + symbols_stripped, -1, buf2, sizeof(buf2)); + ok(ret2, "LCMapStringA must succeed\n"); + ok(ret == ret2, "lengths of sort keys must be equal\n"); + ok(!lstrcmpA(buf, buf2), "sort keys must be equal\n"); + + /* test NORM_IGNORENONSPACE */ + lstrcpyA(buf, "foo"); + ret = LCMapStringA(LOCALE_USER_DEFAULT, NORM_IGNORENONSPACE, + lower_case, -1, buf, sizeof(buf)); + ok(ret == lstrlenA(lower_case) + 1, "LCMapStringA should return %d, ret = %d\n", + lstrlenA(lower_case) + 1, ret); + ok(!lstrcmpA(buf, lower_case), "LCMapStringA should return %s, but not %s\n", lower_case, buf); + + /* test NORM_IGNORESYMBOLS */ + lstrcpyA(buf, "foo"); + ret = LCMapStringA(LOCALE_USER_DEFAULT, NORM_IGNORESYMBOLS, + lower_case, -1, buf, sizeof(buf)); + ok(ret == lstrlenA(symbols_stripped) + 1, "LCMapStringA should return %d, ret = %d\n", + lstrlenA(symbols_stripped) + 1, ret); + ok(!lstrcmpA(buf, symbols_stripped), "LCMapStringA should return %s, but not %s\n", lower_case, buf); + + /* test srclen = 0 */ + SetLastError(0xdeadbeef); + ret = LCMapStringA(LOCALE_USER_DEFAULT, 0, upper_case, 0, buf, sizeof(buf)); + ok(!ret, "LCMapStringA should fail with srclen = 0\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "unexpected error code %ld\n", GetLastError()); +} + +void test_LCMapStringW(void) +{ + int ret, ret2; + WCHAR buf[256], buf2[256]; + char *p_buf = (char *)buf, *p_buf2 = (char *)buf2; + static const WCHAR upper_case[] = {'\t','J','U','S','T','!',' ','A',',',' ','T','E','S','T',';',' ','S','T','R','I','N','G',' ','1','/','*','+','-','.','\r','\n',0}; + static const WCHAR lower_case[] = {'\t','j','u','s','t','!',' ','a',',',' ','t','e','s','t',';',' ','s','t','r','i','n','g',' ','1','/','*','+','-','.','\r','\n',0}; + static const WCHAR symbols_stripped[] = {'j','u','s','t','a','t','e','s','t','s','t','r','i','n','g','1',0}; + static const WCHAR fooW[] = {'f','o','o',0}; + + ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_LOWERCASE | LCMAP_UPPERCASE, + upper_case, -1, buf, sizeof(buf)/sizeof(WCHAR)); + if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + trace("Skipping LCMapStringW tests on Win9x\n"); + return; + } + ok(!ret, "LCMAP_LOWERCASE and LCMAP_UPPERCASE are mutually exclusive\n"); + ok(GetLastError() == ERROR_INVALID_FLAGS, + "unexpected error code %ld\n", GetLastError()); + + ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_HIRAGANA | LCMAP_KATAKANA, + upper_case, -1, buf, sizeof(buf)/sizeof(WCHAR)); + ok(!ret, "LCMAP_HIRAGANA and LCMAP_KATAKANA are mutually exclusive\n"); + ok(GetLastError() == ERROR_INVALID_FLAGS, + "unexpected error code %ld\n", GetLastError()); + + ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_HALFWIDTH | LCMAP_FULLWIDTH, + upper_case, -1, buf, sizeof(buf)/sizeof(WCHAR)); + ok(!ret, "LCMAP_HALFWIDTH | LCMAP_FULLWIDTH are mutually exclusive\n"); + ok(GetLastError() == ERROR_INVALID_FLAGS, + "unexpected error code %ld\n", GetLastError()); + + ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_TRADITIONAL_CHINESE | LCMAP_SIMPLIFIED_CHINESE, + upper_case, -1, buf, sizeof(buf)/sizeof(WCHAR)); + ok(!ret, "LCMAP_TRADITIONAL_CHINESE and LCMAP_SIMPLIFIED_CHINESE are mutually exclusive\n"); + ok(GetLastError() == ERROR_INVALID_FLAGS, + "unexpected error code %ld\n", GetLastError()); + + /* SORT_STRINGSORT must be used exclusively with LCMAP_SORTKEY */ + SetLastError(0xdeadbeef); + ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_LOWERCASE | SORT_STRINGSORT, + upper_case, -1, buf, sizeof(buf)/sizeof(WCHAR)); + ok(GetLastError() == ERROR_INVALID_FLAGS, "expected ERROR_INVALID_FLAGS, got %ld\n", GetLastError()); + ok(!ret, "SORT_STRINGSORT without LCMAP_SORTKEY must fail\n"); + + /* test LCMAP_LOWERCASE */ + ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, + upper_case, -1, buf, sizeof(buf)/sizeof(WCHAR)); + ok(ret == lstrlenW(upper_case) + 1, + "ret %d, error %ld, expected value %d\n", + ret, GetLastError(), lstrlenW(upper_case) + 1); + ok(!lstrcmpW(buf, lower_case), "string compare mismatch\n"); + + /* test LCMAP_UPPERCASE */ + ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_UPPERCASE, + lower_case, -1, buf, sizeof(buf)/sizeof(WCHAR)); + ok(ret == lstrlenW(lower_case) + 1, + "ret %d, error %ld, expected value %d\n", + ret, GetLastError(), lstrlenW(lower_case) + 1); + ok(!lstrcmpW(buf, upper_case), "string compare mismatch\n"); + + /* test buffer overflow */ + SetLastError(0xdeadbeef); + ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_UPPERCASE, + lower_case, -1, buf, 4); + ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, + "should return 0 and ERROR_INSUFFICIENT_BUFFER, got %d\n", ret); + + /* LCMAP_UPPERCASE or LCMAP_LOWERCASE should accept src == dst */ + lstrcpyW(buf, lower_case); + ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_UPPERCASE, + buf, -1, buf, sizeof(buf)/sizeof(WCHAR)); + ok(ret == lstrlenW(lower_case) + 1, + "ret %d, error %ld, expected value %d\n", + ret, GetLastError(), lstrlenW(lower_case) + 1); + ok(!lstrcmpW(buf, upper_case), "string compare mismatch\n"); + + lstrcpyW(buf, upper_case); + ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, + buf, -1, buf, sizeof(buf)/sizeof(WCHAR)); + ok(ret == lstrlenW(upper_case) + 1, + "ret %d, error %ld, expected value %d\n", + ret, GetLastError(), lstrlenW(lower_case) + 1); + ok(!lstrcmpW(buf, lower_case), "string compare mismatch\n"); + + /* otherwise src == dst should fail */ + SetLastError(0xdeadbeef); + ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_SORTKEY | LCMAP_UPPERCASE, + buf, 10, buf, sizeof(buf)); + ok(GetLastError() == ERROR_INVALID_FLAGS /* NT */ || + GetLastError() == ERROR_INVALID_PARAMETER /* Win9x */, + "unexpected error code %ld\n", GetLastError()); + ok(!ret, "src == dst without LCMAP_UPPERCASE or LCMAP_LOWERCASE must fail\n"); + + /* test whether '\0' is always appended */ + ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_SORTKEY, + upper_case, -1, buf, sizeof(buf)); + ok(ret, "LCMapStringW must succeed\n"); + ret2 = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_SORTKEY, + upper_case, lstrlenW(upper_case), buf2, sizeof(buf2)); + ok(ret, "LCMapStringW must succeed\n"); + ok(ret == ret2, "lengths of sort keys must be equal\n"); + ok(!lstrcmpA(p_buf, p_buf2), "sort keys must be equal\n"); + + /* test LCMAP_SORTKEY | NORM_IGNORECASE */ + ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_SORTKEY | NORM_IGNORECASE, + upper_case, -1, buf, sizeof(buf)); + ok(ret, "LCMapStringW must succeed\n"); + ret2 = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_SORTKEY, + lower_case, -1, buf2, sizeof(buf2)); + ok(ret2, "LCMapStringW must succeed\n"); + ok(ret == ret2, "lengths of sort keys must be equal\n"); + ok(!lstrcmpA(p_buf, p_buf2), "sort keys must be equal\n"); + + /* test LCMAP_SORTKEY | NORM_IGNORENONSPACE */ + ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_SORTKEY | NORM_IGNORENONSPACE, + lower_case, -1, buf, sizeof(buf)); + ok(ret, "LCMapStringW must succeed\n"); + ret2 = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_SORTKEY, + lower_case, -1, buf2, sizeof(buf2)); + ok(ret2, "LCMapStringW must succeed\n"); + ok(ret == ret2, "lengths of sort keys must be equal\n"); + ok(!lstrcmpA(p_buf, p_buf2), "sort keys must be equal\n"); + + /* test LCMAP_SORTKEY | NORM_IGNORESYMBOLS */ + ret = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_SORTKEY | NORM_IGNORESYMBOLS, + lower_case, -1, buf, sizeof(buf)); + ok(ret, "LCMapStringW must succeed\n"); + ret2 = LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_SORTKEY, + symbols_stripped, -1, buf2, sizeof(buf2)); + ok(ret2, "LCMapStringW must succeed\n"); + ok(ret == ret2, "lengths of sort keys must be equal\n"); + ok(!lstrcmpA(p_buf, p_buf2), "sort keys must be equal\n"); + + /* test NORM_IGNORENONSPACE */ + lstrcpyW(buf, fooW); + ret = LCMapStringW(LOCALE_USER_DEFAULT, NORM_IGNORENONSPACE, + lower_case, -1, buf, sizeof(buf)/sizeof(WCHAR)); + ok(ret == lstrlenW(lower_case) + 1, "LCMapStringW should return %d, ret = %d\n", + lstrlenW(lower_case) + 1, ret); + ok(!lstrcmpW(buf, lower_case), "string comparison mismatch\n"); + + /* test NORM_IGNORESYMBOLS */ + lstrcpyW(buf, fooW); + ret = LCMapStringW(LOCALE_USER_DEFAULT, NORM_IGNORESYMBOLS, + lower_case, -1, buf, sizeof(buf)/sizeof(WCHAR)); + ok(ret == lstrlenW(symbols_stripped) + 1, "LCMapStringW should return %d, ret = %d\n", + lstrlenW(symbols_stripped) + 1, ret); + ok(!lstrcmpW(buf, symbols_stripped), "string comparison mismatch\n"); + + /* test srclen = 0 */ + SetLastError(0xdeadbeef); + ret = LCMapStringW(LOCALE_USER_DEFAULT, 0, upper_case, 0, buf, sizeof(buf)); + ok(!ret, "LCMapStringW should fail with srclen = 0\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "unexpected error code %ld\n", GetLastError()); +} + +#if 0 /* this requires collation table patch to make it MS compatible */ +const char *strings_sorted[] = +{ +"'", +"-", +"!", +"\"", +".", +":", +"\\", +"_", +"`", +"{", +"}", +"+", +"0", +"1", +"2", +"3", +"4", +"5", +"6", +"7", +"8", +"9", +"a", +"A", +"b", +"B", +"c", +"C" +}; + +const char *strings[] = +{ +"C", +"\"", +"9", +"'", +"}", +"-", +"7", +"+", +"`", +"1", +"a", +"5", +"\\", +"8", +"B", +"3", +"_", +"6", +"{", +"2", +"c", +"4", +"!", +"0", +"A", +":", +"b", +"." +}; + +static int compare_string1(const void *e1, const void *e2) +{ + const char *s1 = *(const char **)e1; + const char *s2 = *(const char **)e2; + + return lstrcmpA(s1, s2); +} + +static int compare_string2(const void *e1, const void *e2) +{ + const char *s1 = *(const char **)e1; + const char *s2 = *(const char **)e2; + + return CompareStringA(0, 0, s1, -1, s2, -1) - 2; +} + +static int compare_string3(const void *e1, const void *e2) +{ + const char *s1 = *(const char **)e1; + const char *s2 = *(const char **)e2; + char key1[256], key2[256]; + + LCMapStringA(0, LCMAP_SORTKEY, s1, -1, key1, sizeof(key1)); + LCMapStringA(0, LCMAP_SORTKEY, s2, -1, key2, sizeof(key2)); + return strcmp(key1, key2); +} + +static void test_sorting(void) +{ + char buf[256]; + char **str_buf = (char **)buf; + int i; + + assert(sizeof(buf) >= sizeof(strings)); + + /* 1. sort using lstrcmpA */ + memcpy(buf, strings, sizeof(strings)); + qsort(buf, sizeof(strings)/sizeof(strings[0]), sizeof(strings[0]), compare_string1); + for (i = 0; i < sizeof(strings)/sizeof(strings[0]); i++) + { + ok(!strcmp(strings_sorted[i], str_buf[i]), + "qsort using lstrcmpA failed for element %d\n", i); + } + /* 2. sort using CompareStringA */ + memcpy(buf, strings, sizeof(strings)); + qsort(buf, sizeof(strings)/sizeof(strings[0]), sizeof(strings[0]), compare_string2); + for (i = 0; i < sizeof(strings)/sizeof(strings[0]); i++) + { + ok(!strcmp(strings_sorted[i], str_buf[i]), + "qsort using CompareStringA failed for element %d\n", i); + } + /* 3. sort using sort keys */ + memcpy(buf, strings, sizeof(strings)); + qsort(buf, sizeof(strings)/sizeof(strings[0]), sizeof(strings[0]), compare_string3); + for (i = 0; i < sizeof(strings)/sizeof(strings[0]); i++) + { + ok(!strcmp(strings_sorted[i], str_buf[i]), + "qsort using sort keys failed for element %d\n", i); + } +} +#endif + +static void test_FoldStringA(void) +{ + int ret, i; + char src[256], dst[256]; + static const char digits_src[] = { 0xB9,0xB2,0xB3,'\0' }; + static const char digits_dst[] = { '1','2','3','\0' }; + static const char composite_src[] = + { + 0x8a,0x8e,0x9a,0x9e,0x9f,0xc0,0xc1,0xc2, + 0xc3,0xc4,0xc5,0xc7,0xc8,0xc9,0xca,0xcb, + 0xcc,0xcd,0xce,0xcf,0xd1,0xd2,0xd3,0xd4, + 0xd5,0xd6,0xd8,0xd9,0xda,0xdb,0xdc,0xdd, + 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe7,0xe8, + 0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,0xf1, + 0xf2,0xf3,0xf4,0xf5,0xf6,0xf8,0xf9,0xfa, + 0xfb,0xfc,0xfd,0xff,'\0' + }; + static const char composite_dst[] = + { + 0x53,0x3f,0x5a,0x3f,0x73,0x3f,0x7a,0x3f, + 0x59,0xa8,0x41,0x60,0x41,0xb4,0x41,0x5e, + 0x41,0x7e,0x41,0xa8,0x41,0xb0,0x43,0xb8, + 0x45,0x60,0x45,0xb4,0x45,0x5e,0x45,0xa8, + 0x49,0x60,0x49,0xb4,0x49,0x5e,0x49,0xa8, + 0x4e,0x7e,0x4f,0x60,0x4f,0xb4,0x4f,0x5e, + 0x4f,0x7e,0x4f,0xa8,0x4f,0x3f,0x55,0x60, + 0x55,0xb4,0x55,0x5e,0x55,0xa8,0x59,0xb4, + 0x61,0x60,0x61,0xb4,0x61,0x5e,0x61,0x7e, + 0x61,0xa8,0x61,0xb0,0x63,0xb8,0x65,0x60, + 0x65,0xb4,0x65,0x5e,0x65,0xa8,0x69,0x60, + 0x69,0xb4,0x69,0x5e,0x69,0xa8,0x6e,0x7e, + 0x6f,0x60,0x6f,0xb4,0x6f,0x5e,0x6f,0x7e, + 0x6f,0xa8,0x6f,0x3f,0x75,0x60,0x75,0xb4, + 0x75,0x5e,0x75,0xa8,0x79,0xb4,0x79,0xa8,'\0' + }; + static const char ligatures_src[] = + { + 0x8C,0x9C,0xC6,0xDE,0xDF,0xE6,0xFE,'\0' + }; + static const char ligatures_dst[] = + { + 'O','E','o','e','A','E','T','H','s','s','a','e','t','h','\0' + }; + + if (!pFoldStringA) + return; /* FoldString is present in NT v3.1+, but not 95/98/Me */ + + /* these tests are locale specific */ + if (GetACP() != 1252) + { + trace("Skipping FoldStringA tests for a not Latin 1 locale\n"); + return; + } + + /* MAP_FOLDDIGITS */ + SetLastError(0); + ret = pFoldStringA(MAP_FOLDDIGITS, digits_src, -1, dst, 256); + if (GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) + return; + EXPECT_LEN(4); EXPECT_VALID; + ok(strcmp(dst, digits_dst) == 0, + "MAP_FOLDDIGITS: Expected '%s', got '%s'\n", digits_dst, dst); + for (i = 1; i < 256; i++) + { + if (!strchr(digits_src, i)) + { + src[0] = i; + src[1] = '\0'; + SetLastError(0); + ret = pFoldStringA(MAP_FOLDDIGITS, src, -1, dst, 256); + EXPECT_LEN(2); EXPECT_VALID; + ok(dst[0] == src[0], + "MAP_FOLDDIGITS: Expected '%s', got '%s'\n", src, dst); + } + } + + /* MAP_EXPAND_LIGATURES */ + SetLastError(0); + ret = pFoldStringA(MAP_EXPAND_LIGATURES, ligatures_src, -1, dst, 256); + EXPECT_LEN(sizeof(ligatures_dst)); EXPECT_VALID; + ok(strcmp(dst, ligatures_dst) == 0, + "MAP_EXPAND_LIGATURES: Expected '%s', got '%s'\n", ligatures_dst, dst); + for (i = 1; i < 256; i++) + { + if (!strchr(ligatures_src, i)) + { + src[0] = i; + src[1] = '\0'; + SetLastError(0); + ret = pFoldStringA(MAP_EXPAND_LIGATURES, src, -1, dst, 256); + EXPECT_LEN(2); EXPECT_VALID; + ok(dst[0] == src[0], + "MAP_EXPAND_LIGATURES: Expected '%s', got '%s'\n", src, dst); + } + } + + /* MAP_COMPOSITE */ + SetLastError(0); + ret = pFoldStringA(MAP_COMPOSITE, composite_src, -1, dst, 256); + EXPECT_VALID; + todo_wine + { + /* Wine gets close, but doesn't produce quite the same result as native */ + EXPECT_LEN(121); + ok(strcmp(dst, composite_dst) == 0, + "MAP_COMPOSITE: Expected '%s', got '%s'\n", composite_dst, dst); + } + + for (i = 1; i < 256; i++) + { + if (!strchr(composite_src, i)) + { + src[0] = i; + src[1] = '\0'; + SetLastError(0); + ret = pFoldStringA(MAP_COMPOSITE, src, -1, dst, 256); + EXPECT_LEN(2); EXPECT_VALID; + ok(dst[0] == src[0], + "0x%02x, 0x%02x,0x%02x,0x%02x,\n", (unsigned char)src[0], + (unsigned char)dst[0],(unsigned char)dst[1],(unsigned char)dst[2]); + } + } + + /* MAP_FOLDCZONE */ + for (i = 1; i < 256; i++) + { + src[0] = i; + src[1] = '\0'; + SetLastError(0); + ret = pFoldStringA(MAP_FOLDCZONE, src, -1, dst, 256); + EXPECT_LEN(2); EXPECT_VALID; + ok(src[0] == dst[0], + "MAP_FOLDCZONE: Expected 0x%02x, got 0x%02x\n", + (unsigned char)src[0], (unsigned char)dst[0]); + } + + /* MAP_PRECOMPOSED */ + for (i = 1; i < 256; i++) + { + src[0] = i; + src[1] = '\0'; + SetLastError(0); + ret = pFoldStringA(MAP_PRECOMPOSED, src, -1, dst, 256); + EXPECT_LEN(2); EXPECT_VALID; + ok(src[0] == dst[0], + "MAP_PRECOMPOSED: Expected 0x%02x, got 0x%02x\n", + (unsigned char)src[0], (unsigned char)dst[0]); + } +} + +static void test_FoldStringW(void) +{ + int ret; + size_t i, j; + WCHAR src[256], dst[256], ch, prev_ch = 1; + static const DWORD badFlags[] = + { + 0, + MAP_PRECOMPOSED|MAP_COMPOSITE, + MAP_PRECOMPOSED|MAP_EXPAND_LIGATURES, + MAP_COMPOSITE|MAP_EXPAND_LIGATURES + }; + /* Ranges of digits 0-9 : Must be sorted! */ + static const WCHAR digitRanges[] = + { + 0x0030, /* '0'-'9' */ + 0x0660, /* Eastern Arabic */ + 0x06F0, /* Arabic - Hindu */ + 0x0966, /* Devengari */ + 0x09E6, /* Bengalii */ + 0x0A66, /* Gurmukhi */ + 0x0AE6, /* Gujarati */ + 0x0B66, /* Oriya */ + 0x0BE6, /* Tamil - No 0 */ + 0x0C66, /* Telugu */ + 0x0CE6, /* Kannada */ + 0x0D66, /* Maylayalam */ + 0x0E50, /* Thai */ + 0x0ED0, /* Laos */ + 0x2070, /* Superscript - 1, 2, 3 are out of sequence */ + 0x2080, /* Subscript */ + 0x245F, /* Circled - 0 is out of sequence */ + 0x2473, /* Bracketed */ + 0x2487, /* Full stop */ + 0x2775, /* Inverted circled - No 0 */ + 0x277F, /* Patterned circled - No 0 */ + 0x2789, /* Inverted Patterned circled - No 0 */ + 0xff10, /* Pliene chasse (?) */ + 0xffff /* Terminator */ + }; + /* Digits which are represented, but out of sequence */ + static const WCHAR outOfSequenceDigits[] = + { + 0xB9, /* Superscript 1 */ + 0xB2, /* Superscript 2 */ + 0xB3, /* Superscript 3 */ + 0x24EA, /* Circled 0 */ + '\0' /* Terminator */ + }; + /* Digits in digitRanges for which no representation is available */ + static const WCHAR noDigitAvailable[] = + { + 0x0BE6, /* No Tamil 0 */ + 0x2473, /* No Bracketed 0 */ + 0x2487, /* No 0 Full stop */ + 0x2775, /* No inverted circled 0 */ + 0x277F, /* No patterned circled */ + 0x2789, /* No inverted Patterned circled */ + '\0' /* Terminator */ + }; + /* Compatibility conversion results */ + static const WCHAR compat_F900_FA2F[256+48] = + { + 0x8c48, 0x66f4, 0x8eca, 0x8cc8, 0x6ed1, 0x4e32, 0x53e5, 0x9f9c, + 0x9f9c, 0x5951, 0x91d1, 0x5587, 0x5948, 0x61f6, 0x7669, 0x7f85, + 0x863f, 0x87ba, 0x88f8, 0x908f, 0x6a02, 0x6d1b, 0x70d9, 0x73de, + 0x843d, 0x916a, 0x99f1, 0x4e82, 0x5375, 0x6b04, 0x721b, 0x862d, + 0x9e1e, 0x5d50, 0x6feb, 0x85cd, 0x8964, 0x62c9, 0x81d8, 0x881f, + 0x5eca, 0x6717, 0x6d6a, 0x72fc, 0x0000, 0x4f86, 0x51b7, 0x52de, + 0x64c4, 0x6ad3, 0x7210, 0x76e7, 0x8001, 0x8606, 0x865c, 0x8def, + 0x9732, 0x9b6f, 0x9dfa, 0x788c, 0x797f, 0x7da0, 0x83c9, 0x9304, + 0x9e7f, 0x8ad6, 0x58df, 0x5f04, 0x7c60, 0x807e, 0x7262, 0x78ca, + 0x8cc2, 0x96f7, 0x58d8, 0x5c62, 0x6a13, 0x6dda, 0x6f0f, 0x7d2f, + 0x7e37, 0x964b, 0x52d2, 0x808b, 0x51dc, 0x51cc, 0x7a1c, 0x7dbe, + 0x83f1, 0x9675, 0x8b80, 0x62cf, 0x6a02, 0x8afe, 0x4e39, 0x5be7, + 0x6012, 0x7387, 0x7570, 0x5317, 0x78fb, 0x4fbf, 0x5fa9, 0x4e0d, + 0x6ccc, 0x6578, 0x7d22, 0x53c3, 0x585e, 0x7701, 0x8449, 0x8aaa, + 0x6bba, 0x8fb0, 0x6c88, 0x62fe, 0x82e5, 0x63a0, 0x7565, 0x4eae, + 0x5169, 0x0000, 0x6881, 0x7ce7, 0x826f, 0x8ad2, 0x91cf, 0x52f5, + 0x5442, 0x5973, 0x5eec, 0x65c5, 0x6ffe, 0x792a, 0x95ad, 0x9a6a, + 0x9e97, 0x9ece, 0x529b, 0x66c6, 0x6b77, 0x8f62, 0x5e74, 0x6190, + 0x6200, 0x649a, 0x6f23, 0x7149, 0x7489, 0x0000, 0x7df4, 0x806f, + 0x8f26, 0x84ee, 0x9023, 0x934a, 0x5217, 0x52a3, 0x54bd, 0x70c8, + 0x88c2, 0x8aaa, 0x5ec9, 0x5ff5, 0x637b, 0x6bae, 0x7c3e, 0x7375, + 0x4ee4, 0x56f9, 0x5be7, 0x5dba, 0x601c, 0x73b2, 0x7469, 0x7f9a, + 0x8046, 0x9234, 0x96f6, 0x9748, 0x9818, 0x4f8b, 0x79ae, 0x91b4, + 0x96b8, 0x60e1, 0x4e86, 0x50da, 0x5bee, 0x5c3f, 0x6599, 0x6a02, + 0x71ce, 0x7642, 0x84fc, 0x907c, 0x9f8d, 0x6688, 0x962e, 0x5289, + 0x677b, 0x67f3, 0x6d41, 0x6e9c, 0x7409, 0x7559, 0x786b, 0x7d10, + 0x985e, 0x516d, 0x622e, 0x9678, 0x502b, 0x5d19, 0x6dea, 0x8f2a, + 0x5f8b, 0x6144, 0x6817, 0x7387, 0x9686, 0x5229, 0x540f, 0x5c65, + 0x6613, 0x674e, 0x68a8, 0x6ce5, 0x7406, 0x75e2, 0x7f79, 0x0000, + 0x88e1, 0x91cc, 0x96e2, 0x533f, 0x6eba, 0x541d, 0x71d0, 0x7498, + 0x85fa, 0x0000, 0x9c57, 0x9e9f, 0x6797, 0x6dcb, 0x81e8, 0x7acb, + 0x7b20, 0x7c92, 0x72c0, 0x7099, 0x8b58, 0x4ec0, 0x8336, 0x523a, + 0x5207, 0x5ea6, 0x62d3, 0x7cd6, 0x5b85, 0x6d1e, 0x66b4, 0x8f3b, + 0x884c, 0x964d, 0x898b, 0x5ed3, 0x0000, 0x0000, 0x0000, 0x0000, + 0x585a, 0x0000, 0x6674, 0x0000, 0x0000, 0x51de, 0x8c6c, 0x76ca, + 0x0000, 0x795e, 0x7965, 0x798f, 0x9756, 0x7cbe, 0x7fbd, 0x0000, + 0x0000, 0x0000, 0x8af8, 0x0000, 0x0000, 0x9038, 0x90fd, 0x0000, + 0x0000, 0x0000, 0x98ef, 0x98fc, 0x9928, 0x9db4, 0x0000, 0x0000 + }; + static const WCHAR compat_FE30_FEF7[200] = + { + 0x2025, 0x2014, 0x2013, 0x005f, 0x005f, 0x0028, 0x0029, 0x007b, + 0x007d, 0x3014, 0x3015, 0x3010, 0x3011, 0x300a, 0x300b, 0x3008, + 0x3009, 0x300c, 0x300d, 0x300e, 0x300f, 0x0000, 0x0000, 0x0000, + 0x0000, 0x203e, 0x203e, 0x203e, 0x203e, 0x005f, 0x005f, 0x005f, + 0x002c, 0x3001, 0x002e, 0x0000, 0x003b, 0x003a, 0x003f, 0x0021, + 0x2014, 0x0028, 0x0029, 0x007b, 0x007d, 0x3014, 0x3015, 0x0023, + 0x0026, 0x002a, 0x002b, 0x002d, 0x003c, 0x003e, 0x003d, 0x0000, + 0x0000, 0x0024, 0x0025, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, + 0x064b, 0x064b, 0x064c, 0x0000, 0x064d, 0x0000, 0x064e, 0x064e, + 0x064f, 0x064f, 0x0650, 0x0650, 0x0651, 0x0651, 0x0652, 0x0652, + 0x0621, 0x0622, 0x0622, 0x0623, 0x0623, 0x0624, 0x0624, 0x0625, + 0x0625, 0x0626, 0x0626, 0x0626, 0x0626, 0x0627, 0x0627, 0x0628, + 0x0628, 0x0628, 0x0628, 0x0629, 0x0629, 0x062a, 0x062a, 0x062a, + 0x062a, 0x062b, 0x062b, 0x062b, 0x062b, 0x062c, 0x062c, 0x062c, + 0x062c, 0x062d, 0x062d, 0x062d, 0x062d, 0x062e, 0x062e, 0x062e, + 0x062e, 0x062f, 0x062f, 0x0630, 0x0630, 0x0631, 0x0631, 0x0632, + 0x0632, 0x0633, 0x0633, 0x0633, 0x0633, 0x0634, 0x0634, 0x0634, + 0x0634, 0x0635, 0x0635, 0x0635, 0x0635, 0x0636, 0x0636, 0x0636, + 0x0636, 0x0637, 0x0637, 0x0637, 0x0637, 0x0638, 0x0638, 0x0638, + 0x0638, 0x0639, 0x0639, 0x0639, 0x0639, 0x063a, 0x063a, 0x063a, + 0x063a, 0x0641, 0x0641, 0x0641, 0x0641, 0x0642, 0x0642, 0x0642, + 0x0642, 0x0643, 0x0643, 0x0643, 0x0643, 0x0644, 0x0644, 0x0644, + 0x0644, 0x0645, 0x0645, 0x0645, 0x0645, 0x0646, 0x0646, 0x0646, + 0x0646, 0x0647, 0x0647, 0x0647, 0x0647, 0x0648, 0x0648, 0x0649, + 0x0649, 0x064a, 0x064a, 0x064a, 0x064a, 0x0000, 0x0000, 0x0000 + }; + static const WCHAR compat_FF00_FFEF[240] = + { + 0x0000, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005a, 0x005b, 0x0000, 0x005d, 0x005e, 0x005f, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000, + 0x0000, 0x3002, 0x300c, 0x300d, 0x3001, 0x30fb, 0x30f2, 0x30a1, + 0x30a3, 0x30a5, 0x30a7, 0x30a9, 0x30e3, 0x30e5, 0x30e7, 0x30c3, + 0x30fc, 0x30a2, 0x30a4, 0x30a6, 0x30a8, 0x30aa, 0x30ab, 0x30ad, + 0x30af, 0x30b1, 0x30b3, 0x30b5, 0x30b7, 0x30b9, 0x30bb, 0x30bd, + 0x30bf, 0x30c1, 0x30c4, 0x30c6, 0x30c8, 0x30ca, 0x30cb, 0x30cc, + 0x30cd, 0x30ce, 0x30cf, 0x30d2, 0x30d5, 0x30d8, 0x30db, 0x30de, + 0x30df, 0x30e0, 0x30e1, 0x30e2, 0x30e4, 0x30e6, 0x30e8, 0x30e9, + 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ef, 0x30f3, 0x309b, 0x309c, + 0x3164, 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, + 0x3138, 0x3139, 0x313a, 0x313b, 0x313c, 0x313d, 0x313e, 0x313f, + 0x3140, 0x3141, 0x3142, 0x3143, 0x3144, 0x3145, 0x3146, 0x3147, + 0x3148, 0x3149, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e, 0x0000, + 0x0000, 0x0000, 0x314f, 0x3150, 0x3151, 0x3152, 0x3153, 0x3154, + 0x0000, 0x0000, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, 0x315a, + 0x0000, 0x0000, 0x315b, 0x315c, 0x315d, 0x315e, 0x315f, 0x3160, + 0x0000, 0x0000, 0x3161, 0x3162, 0x3163, 0x0000, 0x0000, 0x0000, + 0x00a2, 0x00a3, 0x00ac, 0x00af, 0x00a6, 0x00a5, 0x20a9, 0x0000, + 0x2502, 0x2190, 0x2191, 0x2192, 0x2193, 0x25a0, 0x25cb, 0x0000 + }; + static const WCHAR ligatures_src[] = + { + 0x00c6, 0x00de, 0x00df, 0x00e6, 0x00fe, 0x0132, 0x0133, 0x0152, + 0x0153, 0x01c4, 0x01c5, 0x01c6, 0x01c7, 0x01c8, 0x01c9, 0x01ca, + 0x01cb, 0x01cc, 0x01e2, 0x01e3, 0x01f1, 0x01f2, 0x01f3, 0x01fc, + 0x01fd, 0x05f0, 0x05f1, 0x05f2, 0xfb00, 0xfb01, 0xfb02, 0xfb03, + 0xfb04, 0xfb05, 0xfb06, '\0' + }; + static const WCHAR ligatures_dst[] = + { + 'A','E','T','H','s','s','a','e','t','h','I','J','i','j','O','E','o','e', + 'D',0x017d,'D',0x017e,'d',0x017e,'L','J','L','j','l','j','N','J','N','j', + 'n','j',0x0100,0x0112,0x0101,0x0113,'D','Z','D','z','d','z',0x00c1,0x00c9, + 0x00e1,0x00e9,0x05d5,0x05d5,0x05d5,0x05d9,0x05d9,0x05d9,'f','f','f','i', + 'f','l','f','f','i','f','f','l',0x017f,'t','s','t','\0' + }; + + if (!pFoldStringW) + return; /* FoldString is present in NT v3.1+, but not 95/98/Me */ + + /* Invalid flag combinations */ + for (i = 0; i < sizeof(badFlags)/sizeof(badFlags[0]); i++) + { + src[0] = dst[0] = '\0'; + SetLastError(0); + ret = pFoldStringW(badFlags[i], src, 256, dst, 256); + if (GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) + return; + EXPECT_LEN(0); EXPECT_FLAGS; + } + + /* src & dst cannot be the same */ + SetLastError(0); + ret = pFoldStringW(MAP_FOLDCZONE, src, -1, src, 256); + EXPECT_LEN(0); EXPECT_INVALID; + + /* src can't be NULL */ + SetLastError(0); + ret = pFoldStringW(MAP_FOLDCZONE, NULL, -1, dst, 256); + EXPECT_LEN(0); EXPECT_INVALID; + + /* srclen can't be 0 */ + SetLastError(0); + ret = pFoldStringW(MAP_FOLDCZONE, src, 0, dst, 256); + EXPECT_LEN(0); EXPECT_INVALID; + + /* dstlen can't be < 0 */ + SetLastError(0); + ret = pFoldStringW(MAP_FOLDCZONE, src, -1, dst, -1); + EXPECT_LEN(0); EXPECT_INVALID; + + /* Ret includes terminating NUL which is appended if srclen = -1 */ + SetLastError(0); + src[0] = 'A'; + src[1] = '\0'; + dst[0] = '\0'; + ret = pFoldStringW(MAP_FOLDCZONE, src, -1, dst, 256); + EXPECT_LEN(2); EXPECT_VALID; + ok(dst[0] == 'A' && dst[1] == '\0', + "srclen=-1: Expected ret=2 [%d,%d], got ret=%d [%d,%d], err=%ld\n", + 'A', '\0', ret, dst[0], dst[1], GetLastError()); + + /* If size is given, result is not NUL terminated */ + SetLastError(0); + src[0] = 'A'; + src[1] = 'A'; + dst[0] = 'X'; + dst[1] = 'X'; + ret = pFoldStringW(MAP_FOLDCZONE, src, 1, dst, 256); + EXPECT_LEN(1); EXPECT_VALID; + ok(dst[0] == 'A' && dst[1] == 'X', + "srclen=1: Expected ret=1, [%d,%d], got ret=%d,[%d,%d], err=%ld\n", + 'A','X', ret, dst[0], dst[1], GetLastError()); + + /* MAP_FOLDDIGITS */ + for (j = 0; j < sizeof(digitRanges)/sizeof(digitRanges[0]); j++) + { + /* Check everything before this range */ + for (ch = prev_ch; ch < digitRanges[j]; ch++) + { + SetLastError(0); + src[0] = ch; + src[1] = dst[0] = '\0'; + ret = pFoldStringW(MAP_FOLDDIGITS, src, -1, dst, 256); + EXPECT_LEN(2); EXPECT_VALID; + + ok(dst[0] == ch || strchrW(outOfSequenceDigits, ch) || + /* Wine (correctly) maps all Unicode 4.0+ digits */ + isdigitW(ch) || (ch >= 0x24F5 && ch <= 0x24FD) || ch == 0x24FF, + "MAP_FOLDDIGITS: ch %d 0x%04x Expected unchanged got %d\n", ch, ch, dst[0]); + } + + if (digitRanges[j] == 0xffff) + break; /* Finished the whole code point space */ + + for (ch = digitRanges[j]; ch < digitRanges[j] + 10; ch++) + { + WCHAR c; + + /* Map out of sequence characters */ + if (ch == 0x2071) c = 0x00B9; /* Superscript 1 */ + else if (ch == 0x2072) c = 0x00B2; /* Superscript 2 */ + else if (ch == 0x2073) c = 0x00B3; /* Superscript 3 */ + else if (ch == 0x245F) c = 0x24EA; /* Circled 0 */ + else c = ch; + SetLastError(0); + src[0] = c; + src[1] = dst[0] = '\0'; + ret = pFoldStringW(MAP_FOLDDIGITS, src, -1, dst, 256); + EXPECT_LEN(2); EXPECT_VALID; + + ok((dst[0] == '0' + ch - digitRanges[j] && dst[1] == '\0') || + strchrW(noDigitAvailable, c), + "MAP_FOLDDIGITS: ch %d Expected %d got %d\n", + ch, '0' + digitRanges[j] - ch, dst[0]); + } + prev_ch = ch; + } + + /* MAP_FOLDCZONE */ + for (ch = 1; ch <0xffff; ch++) + { + WCHAR expected = 0; + + if (ch >= 0xF900 && ch <= 0xFA2F) + expected = compat_F900_FA2F[ch - 0xF900]; + else if (ch >= 0xFE30 && ch <= 0xFEF7) + expected = compat_FE30_FEF7[ch - 0xFE30]; + else if (ch >= 0xFF00 && ch <= 0xFFEF) + expected = compat_FF00_FFEF[ch - 0xFF00]; + + if (!expected) + expected = ch; + + SetLastError(0); + src[0] = ch; + src[1] = dst[0] = '\0'; + ret = pFoldStringW(MAP_FOLDCZONE, src, -1, dst, 256); + EXPECT_LEN(2); EXPECT_VALID; + ok(dst[0] == expected || + /* Wine (correctly) uses updated mappings for some Unicode 4.0 chars */ + (ch >= 0xFA0D && ch <= 0xFA47) || + 0xf92c || ch == 0xf979 || ch == 0xf995 || ch == 0xf9e7 || ch == 0xf9f1, + "MAP_FOLDCZONE: ch %d 0x%04x Expected 0x%04x got 0x%04x\n", + ch, ch, expected, dst[0]); + } + + /* MAP_EXPAND_LIGATURES */ + SetLastError(0); + ret = pFoldStringW(MAP_EXPAND_LIGATURES, ligatures_src, -1, dst, 256); + EXPECT_LEN(sizeof(ligatures_dst)/sizeof(ligatures_dst[0])); EXPECT_VALID; + ok(!memcmp(dst, ligatures_dst, sizeof(ligatures_dst)), + "MAP_EXPAND_LIGATURES: Expanded incorrectly\n"); + for (i = 1; i <= 0xffff; i++) + { + if (!strchrW(ligatures_src, i)) + { + src[0] = i; + src[1] = '\0'; + SetLastError(0); + ret = pFoldStringW(MAP_EXPAND_LIGATURES, src, -1, dst, 256); + EXPECT_LEN(2); EXPECT_VALID; + ok(dst[0] == src[0], + "MAP_EXPAND_LIGATURES: 0x%02x : Expected 0x%02x, got 0x%02x\n", + i, src[0], dst[0]); + } + } + + /* FIXME: MAP_PRECOMPOSED : MAP_COMPOSITE */ +} + + + +#define LCID_OK(l) \ + ok(lcid == l, "Expected lcid = %08lx, got %08lx\n", l, lcid) +#define MKLCID(x,y,z) MAKELCID(MAKELANGID(x, y), z) +#define LCID_RES(src, res) lcid = ConvertDefaultLocale(src); LCID_OK(res) +#define TEST_LCIDLANG(a,b) LCID_RES(MAKELCID(a,b), MAKELCID(a,b)) +#define TEST_LCID(a,b,c) LCID_RES(MKLCID(a,b,c), MKLCID(a,b,c)) + +static void test_ConvertDefaultLocale(void) +{ + LCID lcid; + + /* Doesn't change lcid, even if non default sublang/sort used */ + TEST_LCID(LANG_ENGLISH, SUBLANG_ENGLISH_US, SORT_DEFAULT); + TEST_LCID(LANG_ENGLISH, SUBLANG_ENGLISH_UK, SORT_DEFAULT); + TEST_LCID(LANG_JAPANESE, SUBLANG_DEFAULT, SORT_DEFAULT); + TEST_LCID(LANG_JAPANESE, SUBLANG_DEFAULT, SORT_JAPANESE_UNICODE); + + /* SUBLANG_NEUTRAL -> SUBLANG_DEFAULT */ + LCID_RES(MKLCID(LANG_ENGLISH, SUBLANG_NEUTRAL, SORT_DEFAULT), + MKLCID(LANG_ENGLISH, SUBLANG_DEFAULT, SORT_DEFAULT)); + LCID_RES(MKLCID(LANG_JAPANESE, SUBLANG_NEUTRAL, SORT_DEFAULT), + MKLCID(LANG_JAPANESE, SUBLANG_DEFAULT, SORT_DEFAULT)); + LCID_RES(MKLCID(LANG_JAPANESE, SUBLANG_NEUTRAL, SORT_JAPANESE_UNICODE), + MKLCID(LANG_JAPANESE, SUBLANG_DEFAULT, SORT_JAPANESE_UNICODE)); + + /* Invariant language is not treated specially */ + TEST_LCID(LANG_INVARIANT, SUBLANG_DEFAULT, SORT_DEFAULT); + LCID_RES(MKLCID(LANG_INVARIANT, SUBLANG_NEUTRAL, SORT_DEFAULT), + MKLCID(LANG_INVARIANT, SUBLANG_DEFAULT, SORT_DEFAULT)); + + /* User/system default languages alone are not mapped */ + TEST_LCIDLANG(LANG_SYSTEM_DEFAULT, SORT_JAPANESE_UNICODE); + TEST_LCIDLANG(LANG_USER_DEFAULT, SORT_JAPANESE_UNICODE); + + /* Default lcids */ + LCID_RES(LOCALE_SYSTEM_DEFAULT, GetSystemDefaultLCID()); + LCID_RES(LOCALE_USER_DEFAULT, GetUserDefaultLCID()); + LCID_RES(LOCALE_NEUTRAL, GetUserDefaultLCID()); +} + +static BOOL CALLBACK langgrp_procA(LGRPID lgrpid, LPSTR lpszNum, LPSTR lpszName, + DWORD dwFlags, LONG_PTR lParam) +{ + trace("%08lx, %s, %s, %08lx, %08lx\n", + lgrpid, lpszNum, lpszName, dwFlags, lParam); + + ok(pIsValidLanguageGroup(lgrpid, dwFlags) == TRUE, + "Enumerated grp %ld not valid (flags %ld)\n", lgrpid, dwFlags); + + /* If lParam is one, we are calling with flags defaulted from 0 */ + ok(!lParam || (dwFlags == LGRPID_INSTALLED || dwFlags == LGRPID_SUPPORTED), + "Expected dwFlags == LGRPID_INSTALLED || dwFlags == LGRPID_SUPPORTED, got %ld\n", dwFlags); + + return TRUE; +} + +static void test_EnumSystemLanguageGroupsA(void) +{ + if (!pEnumSystemLanguageGroupsA || !pIsValidLanguageGroup) + return; + + /* No enumeration proc */ + SetLastError(0); + pEnumSystemLanguageGroupsA(0, LGRPID_INSTALLED, 0); + EXPECT_INVALID; + + /* Invalid flags */ + SetLastError(0); + pEnumSystemLanguageGroupsA(langgrp_procA, LGRPID_INSTALLED|LGRPID_SUPPORTED, 0); + EXPECT_FLAGS; + + /* No flags - defaults to LGRPID_INSTALLED */ + SetLastError(0); + pEnumSystemLanguageGroupsA(langgrp_procA, 0, 1); + EXPECT_VALID; + + pEnumSystemLanguageGroupsA(langgrp_procA, LGRPID_INSTALLED, 0); + pEnumSystemLanguageGroupsA(langgrp_procA, LGRPID_SUPPORTED, 0); +} + + +static BOOL CALLBACK lgrplocale_procA(LGRPID lgrpid, LCID lcid, LPSTR lpszNum, + LONG_PTR lParam) +{ + trace("%08lx, %08lx, %s, %08lx\n", lgrpid, lcid, lpszNum, lParam); + + ok(pIsValidLanguageGroup(lgrpid, LGRPID_SUPPORTED) == TRUE, + "Enumerated grp %ld not valid\n", lgrpid); + ok(IsValidLocale(lcid, LCID_SUPPORTED) == TRUE, + "Enumerated grp locale %ld not valid\n", lcid); + return TRUE; +} + +static void test_EnumLanguageGroupLocalesA(void) +{ + if (!pEnumLanguageGroupLocalesA || !pIsValidLanguageGroup) + return; + + /* No enumeration proc */ + SetLastError(0); + pEnumLanguageGroupLocalesA(0, LGRPID_WESTERN_EUROPE, 0, 0); + EXPECT_INVALID; + + /* lgrpid too small */ + SetLastError(0); + pEnumLanguageGroupLocalesA(lgrplocale_procA, 0, 0, 0); + EXPECT_INVALID; + + /* lgrpid too big */ + SetLastError(0); + pEnumLanguageGroupLocalesA(lgrplocale_procA, LGRPID_ARMENIAN + 1, 0, 0); + EXPECT_INVALID; + + /* dwFlags is reserved */ + SetLastError(0); + pEnumLanguageGroupLocalesA(0, LGRPID_WESTERN_EUROPE, 0x1, 0); + EXPECT_INVALID; + + pEnumLanguageGroupLocalesA(lgrplocale_procA, LGRPID_WESTERN_EUROPE, 0, 0); +} + +static void test_SetLocaleInfoA(void) +{ + BOOL bRet; + LCID lcid = GetUserDefaultLCID(); + + /* Null data */ + SetLastError(0); + bRet = SetLocaleInfoA(lcid, LOCALE_SDATE, 0); + EXPECT_INVALID; + + /* IDATE */ + SetLastError(0); + bRet = SetLocaleInfoA(lcid, LOCALE_IDATE, (LPSTR)test_SetLocaleInfoA); + EXPECT_FLAGS; + + /* ILDATE */ + SetLastError(0); + bRet = SetLocaleInfoA(lcid, LOCALE_ILDATE, (LPSTR)test_SetLocaleInfoA); + EXPECT_FLAGS; +} + +START_TEST(locale) +{ + InitFunctionPointers(); + +#if 0 + test_EnumTimeFormats(); +#endif + test_GetLocaleInfoA(); + test_GetTimeFormatA(); + test_GetDateFormatA(); + test_GetDateFormatW(); + test_GetCurrencyFormatA(); /* Also tests the W version */ + test_GetNumberFormatA(); /* Also tests the W version */ + test_CompareStringA(); + test_LCMapStringA(); + test_LCMapStringW(); + test_FoldStringA(); + test_FoldStringW(); + test_ConvertDefaultLocale(); + test_EnumSystemLanguageGroupsA(); + test_EnumLanguageGroupLocalesA(); + test_SetLocaleInfoA(); +#if 0 /* this requires collation table patch to make it MS compatible */ + test_sorting(); +#endif +} diff --git a/reactos/apps/tests/kernel32/mailslot.c b/reactos/apps/tests/kernel32/mailslot.c new file mode 100644 index 00000000000..10b9ae5dc26 --- /dev/null +++ b/reactos/apps/tests/kernel32/mailslot.c @@ -0,0 +1,330 @@ +/* + * Mailslot regression test + * + * Copyright 2003 Mike McCormack + * + * 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 + +#ifndef STANDALONE +#include "wine/test.h" +#else +#define START_TEST(name) main(int argc, char **argv) + +#define ok(cond,str) do{ if(!(cond)) printf("line %d: %s\n",__LINE__,str); }while (0) +#define todo_wine + +#endif + +const char szmspath[] = "\\\\.\\mailslot\\wine_mailslot_test"; + +int mailslot_test() +{ + HANDLE hSlot, hSlot2, hWriter, hWriter2; + unsigned char buffer[16]; + DWORD count, dwMax, dwNext, dwMsgCount, dwTimeout; + + /* sanity check on GetMailslotInfo */ + dwMax = dwNext = dwMsgCount = dwTimeout = 0; + ok( !GetMailslotInfo( INVALID_HANDLE_VALUE, &dwMax, &dwNext, + &dwMsgCount, &dwTimeout ), "getmailslotinfo succeeded\n"); + + /* open a mailslot that doesn't exist */ + hWriter = CreateFile(szmspath, GENERIC_READ|GENERIC_WRITE, + FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); + ok( hWriter == INVALID_HANDLE_VALUE, "non-existing mailslot\n"); + + /* open a mailslot without the right name */ + hSlot = CreateMailslot( "blah", 0, 0, NULL ); + ok( hSlot == INVALID_HANDLE_VALUE, + "Created mailslot with invalid name\n"); + todo_wine + { + ok( GetLastError() == ERROR_INVALID_NAME, + "error should be ERROR_INVALID_NAME\n"); + } + + /* open a mailslot with a null name */ + hSlot = CreateMailslot( NULL, 0, 0, NULL ); + ok( hSlot == INVALID_HANDLE_VALUE, + "Created mailslot with invalid name\n"); + todo_wine + { + ok( GetLastError() == ERROR_PATH_NOT_FOUND, + "error should be ERROR_PATH_NOT_FOUND\n"); + } + + todo_wine + { + /* valid open, but with wacky parameters ... then check them */ + hSlot = CreateMailslot( szmspath, -1, -1, NULL ); + ok( hSlot != INVALID_HANDLE_VALUE , "mailslot with valid name failed\n"); + dwMax = dwNext = dwMsgCount = dwTimeout = 0; + ok( GetMailslotInfo( hSlot, &dwMax, &dwNext, &dwMsgCount, &dwTimeout ), + "getmailslotinfo failed\n"); + ok( dwMax == -1, "dwMax incorrect\n"); + ok( dwNext == MAILSLOT_NO_MESSAGE, "dwNext incorrect\n"); + } + ok( dwMsgCount == 0, "dwMsgCount incorrect\n"); + todo_wine + { + ok( dwTimeout == -1, "dwTimeout incorrect\n"); + ok( GetMailslotInfo( hSlot, NULL, NULL, NULL, NULL ), + "getmailslotinfo failed\n"); + ok( CloseHandle(hSlot), "failed to close mailslot\n"); + } + + todo_wine + { + /* now open it for real */ + hSlot = CreateMailslot( szmspath, 0, 0, NULL ); + ok( hSlot != INVALID_HANDLE_VALUE , "valid mailslot failed\n"); + } + + /* try and read/write to it */ + count = 0; + memset(buffer, 0, sizeof buffer); + ok( !ReadFile( hSlot, buffer, sizeof buffer, &count, NULL), + "slot read\n"); + ok( !WriteFile( hSlot, buffer, sizeof buffer, &count, NULL), + "slot write\n"); + + /* now try and openthe client, but with the wrong sharing mode */ + hWriter = CreateFile(szmspath, GENERIC_READ|GENERIC_WRITE, + 0, NULL, OPEN_EXISTING, 0, NULL); + ok( hWriter == INVALID_HANDLE_VALUE, "bad sharing mode\n"); + todo_wine + { + ok( GetLastError() == ERROR_SHARING_VIOLATION, + "error should be ERROR_SHARING_VIOLATION\n"); + + /* now open the client with the correct sharing mode */ + hWriter = CreateFile(szmspath, GENERIC_READ|GENERIC_WRITE, + FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); + ok( hWriter != INVALID_HANDLE_VALUE, "existing mailslot\n"); + } + + /* + * opening a client should make no difference to + * whether we can read or write the mailslot + */ + ok( !ReadFile( hSlot, buffer, sizeof buffer/2, &count, NULL), + "slot read\n"); + ok( !WriteFile( hSlot, buffer, sizeof buffer/2, &count, NULL), + "slot write\n"); + + /* + * we can't read from this client, + * but we should be able to write to it + */ + ok( !ReadFile( hWriter, buffer, sizeof buffer/2, &count, NULL), + "can read client\n"); + todo_wine + { + ok( WriteFile( hWriter, buffer, sizeof buffer/2, &count, NULL), + "can't write client\n"); + } + ok( !ReadFile( hWriter, buffer, sizeof buffer/2, &count, NULL), + "can read client\n"); + + /* + * seeing as there's something in the slot, + * we should be able to read it once + */ + todo_wine + { + ok( ReadFile( hSlot, buffer, sizeof buffer, &count, NULL), + "slot read\n"); + ok( count == (sizeof buffer/2), "short read\n" ); + } + + /* but not again */ + ok( !ReadFile( hSlot, buffer, sizeof buffer, &count, NULL), + "slot read\n"); + + /* now try open another writer... should fail */ + hWriter2 = CreateFile(szmspath, GENERIC_READ|GENERIC_WRITE, + FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); + ok( hWriter2 == INVALID_HANDLE_VALUE, "two writers\n"); + + /* now try open another as a reader ... also fails */ + hWriter2 = CreateFile(szmspath, GENERIC_READ, + FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); + ok( hWriter2 == INVALID_HANDLE_VALUE, "writer + reader\n"); + + /* now try open another as a writer ... still fails */ + hWriter2 = CreateFile(szmspath, GENERIC_WRITE, + FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); + ok( hWriter2 == INVALID_HANDLE_VALUE, "writer\n"); + + /* now open another one */ + hSlot2 = CreateMailslot( szmspath, 0, 0, NULL ); + ok( hSlot2 == INVALID_HANDLE_VALUE , "opened two mailslots\n"); + + todo_wine + { + /* close the client again */ + ok( CloseHandle( hWriter ), "closing the client\n"); + + /* + * now try reopen it with slightly different permissions ... + * shared writing + */ + hWriter = CreateFile(szmspath, GENERIC_WRITE, + FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); + ok( hWriter != INVALID_HANDLE_VALUE, "sharing writer\n"); + } + + /* + * now try open another as a writer ... + * but don't share with the first ... fail + */ + hWriter2 = CreateFile(szmspath, GENERIC_WRITE, + FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); + ok( hWriter2 == INVALID_HANDLE_VALUE, "greedy writer succeeded\n"); + + todo_wine + { + /* now try open another as a writer ... and share with the first */ + hWriter2 = CreateFile(szmspath, GENERIC_WRITE, + FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); + ok( hWriter2 != INVALID_HANDLE_VALUE, "2nd sharing writer\n"); + + /* check the mailslot info */ + dwMax = dwNext = dwMsgCount = dwTimeout = 0; + ok( GetMailslotInfo( hSlot, &dwMax, &dwNext, &dwMsgCount, &dwTimeout ), + "getmailslotinfo failed\n"); + ok( dwNext == MAILSLOT_NO_MESSAGE, "dwNext incorrect\n"); + } + ok( dwMax == 0, "dwMax incorrect\n"); + ok( dwMsgCount == 0, "dwMsgCount incorrect\n"); + ok( dwTimeout == 0, "dwTimeout incorrect\n"); + + /* check there's still no data */ + ok( !ReadFile( hSlot, buffer, sizeof buffer, &count, NULL), "slot read\n"); + + /* write two messages */ + todo_wine + { + buffer[0] = 'a'; + ok( WriteFile( hWriter, buffer, 1, &count, NULL), "1st write failed\n"); + + /* check the mailslot info */ + dwNext = dwMsgCount = 0; + ok( GetMailslotInfo( hSlot, NULL, &dwNext, &dwMsgCount, NULL ), + "getmailslotinfo failed\n"); + ok( dwNext == 1, "dwNext incorrect\n"); + ok( dwMsgCount == 1, "dwMsgCount incorrect\n"); + + buffer[0] = 'b'; + buffer[1] = 'c'; + ok( WriteFile( hWriter2, buffer, 2, &count, NULL), "2nd write failed\n"); + + /* check the mailslot info */ + dwNext = dwMsgCount = 0; + ok( GetMailslotInfo( hSlot, NULL, &dwNext, &dwMsgCount, NULL ), + "getmailslotinfo failed\n"); + ok( dwNext == 1, "dwNext incorrect\n"); + ok( dwMsgCount == 2, "dwMsgCount incorrect\n"); + + /* write a 3rd message with zero size */ + ok( WriteFile( hWriter2, buffer, 0, &count, NULL), "3rd write failed\n"); + + /* check the mailslot info */ + dwNext = dwMsgCount = 0; + ok( GetMailslotInfo( hSlot, NULL, &dwNext, &dwMsgCount, NULL ), + "getmailslotinfo failed\n"); + ok( dwNext == 1, "dwNext incorrect\n"); + ok( dwMsgCount == 3, "dwMsgCount incorrect\n"); + + buffer[0]=buffer[1]=0; + + /* + * then check that they come out with the correct order and size, + * then the slot is empty + */ + ok( ReadFile( hSlot, buffer, sizeof buffer, &count, NULL), + "1st slot read failed\n"); + ok( count == 1, "failed to get 1st message\n"); + ok( buffer[0] == 'a', "1st message wrong\n"); + + /* check the mailslot info */ + dwNext = dwMsgCount = 0; + ok( GetMailslotInfo( hSlot, NULL, &dwNext, &dwMsgCount, NULL ), + "getmailslotinfo failed\n"); + ok( dwNext == 2, "dwNext incorrect\n"); + ok( dwMsgCount == 2, "dwMsgCount incorrect\n"); + + /* read the second message */ + ok( ReadFile( hSlot, buffer, sizeof buffer, &count, NULL), + "2nd slot read failed\n"); + ok( count == 2, "failed to get 2nd message\n"); + ok( ( buffer[0] == 'b' ) && ( buffer[1] == 'c' ), "2nd message wrong\n"); + + /* check the mailslot info */ + dwNext = dwMsgCount = 0; + ok( GetMailslotInfo( hSlot, NULL, &dwNext, &dwMsgCount, NULL ), + "getmailslotinfo failed\n"); + } + ok( dwNext == 0, "dwNext incorrect\n"); + todo_wine + { + ok( dwMsgCount == 1, "dwMsgCount incorrect\n"); + + /* read the 3rd (zero length) message */ + ok( ReadFile( hSlot, buffer, sizeof buffer, &count, NULL), + "3rd slot read failed\n"); + } + ok( count == 0, "failed to get 3rd message\n"); + + /* + * now there should be no more messages + * check the mailslot info + */ + todo_wine + { + dwNext = dwMsgCount = 0; + ok( GetMailslotInfo( hSlot, NULL, &dwNext, &dwMsgCount, NULL ), + "getmailslotinfo failed\n"); + ok( dwNext == MAILSLOT_NO_MESSAGE, "dwNext incorrect\n"); + } + ok( dwMsgCount == 0, "dwMsgCount incorrect\n"); + + /* check that reads fail */ + ok( !ReadFile( hSlot, buffer, sizeof buffer, &count, NULL), + "3rd slot read succeeded\n"); + + /* finally close the mailslot and its client */ + todo_wine + { + ok( CloseHandle( hWriter2 ), "closing 2nd client\n"); + ok( CloseHandle( hWriter ), "closing the client\n"); + ok( CloseHandle( hSlot ), "closing the mailslot\n"); + } + + return 0; +} + +START_TEST(mailslot) +{ + mailslot_test(); +} diff --git a/reactos/apps/tests/kernel32/path.c b/reactos/apps/tests/kernel32/path.c new file mode 100644 index 00000000000..b5f5b536c79 --- /dev/null +++ b/reactos/apps/tests/kernel32/path.c @@ -0,0 +1,946 @@ +/* + * Unit test suite for Get*PathNamesA and (Get|Set)CurrentDirectoryA. + * + * Copyright 2002 Geoffrey Hausheer + * + * 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 "wine/test.h" +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "winerror.h" +#include "winnls.h" + +#define HAS_TRAIL_SLASH_A(string) (string[lstrlenA(string)-1]=='\\') + +#define LONGFILE "Long File test.path" +#define SHORTFILE "pathtest.pth" +#define SHORTDIR "shortdir" +#define LONGDIR "Long Directory" +#define NONFILE_SHORT "noexist.pth" +#define NONFILE_LONG "Non Existent File" +#define NONDIR_SHORT "notadir" +#define NONDIR_LONG "Non Existent Directory" + +#define NOT_A_VALID_DRIVE '@' + +/* the following characters don't work well with GetFullPathNameA + in Win98. I don't know if this is a FAT thing, or if it is an OS thing + but I don't test these characters now. + NOTE: Win2k allows GetFullPathNameA to work with them though + |<>" +*/ +static const CHAR funny_chars[]="!@#$%^&*()=+{}[],?'`"; +static const CHAR is_char_ok[] ="11111110111111111011"; +static const CHAR wine_todo[] ="00000000000000000000"; + +static DWORD (WINAPI *pGetLongPathNameA)(LPCSTR,LPSTR,DWORD); + +/* a structure to deal with wine todos somewhat cleanly */ +typedef struct { + DWORD shortlen; + DWORD shorterror; + DWORD s2llen; + DWORD s2lerror; + DWORD longlen; + DWORD longerror; +} SLpassfail; + +/* function that tests GetFullPathNameA, GetShortPathNameA,GetLongPathNameA */ +/* NOTE: the passfail structure is used to allow cutomizeable todo checking + for wine. It is not very pretty, but it sure beats duplicating this + function lots of times +*/ +static void test_ValidPathA(CHAR *curdir, CHAR *subdir, CHAR *filename, + CHAR *shortstr, SLpassfail *passfail, CHAR *errstr) { + CHAR tmpstr[MAX_PATH], + fullpath[MAX_PATH], /*full path to the file (not short/long) */ + subpath[MAX_PATH], /*relative path to the file */ + fullpathshort[MAX_PATH], /*absolue path to the file (short format) */ + fullpathlong[MAX_PATH], /*absolute path to the file (long format) */ + curdirshort[MAX_PATH], /*absolute path to the current dir (short) */ + curdirlong[MAX_PATH]; /*absolute path to the current dir (long) */ + LPSTR strptr; /*ptr to the filename portion of the path */ + DWORD len; +/* if passfail is NULL, we can perform all checks within this function, + otherwise, we will return the relevant data in the passfail struct, so + we must initialize it first +*/ + if(passfail!=NULL) { + passfail->shortlen=-1;passfail->s2llen=-1;passfail->longlen=-1; + passfail->shorterror=0;passfail->s2lerror=0;passfail->longerror=0; + } +/* GetLongPathNameA is only supported on Win2k+ and Win98+ */ + if(pGetLongPathNameA) { + ok((len=pGetLongPathNameA(curdir,curdirlong,MAX_PATH)), + "%s: GetLongPathNameA failed\n",errstr); +/*GetLongPathNameA can return a trailing '\\' but shouldn't do so here */ + ok(! HAS_TRAIL_SLASH_A(curdirlong), + "%s: GetLongPathNameA should not have a trailing \\\n",errstr); + } + ok((len=GetShortPathNameA(curdir,curdirshort,MAX_PATH)), + "%s: GetShortPathNameA failed\n",errstr); +/*GetShortPathNameA can return a trailing '\\' but shouldn't do so here */ + ok(! HAS_TRAIL_SLASH_A(curdirshort), + "%s: GetShortPathNameA should not have a trailing \\\n",errstr); +/* build relative and absolute paths from inputs */ + if(lstrlenA(subdir)) { + sprintf(subpath,"%s\\%s",subdir,filename); + } else { + lstrcpyA(subpath,filename); + } + sprintf(fullpath,"%s\\%s",curdir,subpath); + sprintf(fullpathshort,"%s\\%s",curdirshort,subpath); + sprintf(fullpathlong,"%s\\%s",curdirlong,subpath); +/* Test GetFullPathNameA functionality */ + len=GetFullPathNameA(subpath,MAX_PATH,tmpstr,&strptr); + ok(len, "GetFullPathNameA failed for: '%s'\n",subpath); + if(HAS_TRAIL_SLASH_A(subpath)) { + ok(strptr==NULL, + "%s: GetFullPathNameA should not return a filename ptr\n",errstr); + ok(lstrcmpiA(fullpath,tmpstr)==0, + "%s: GetFullPathNameA returned '%s' instead of '%s'\n", + errstr,tmpstr,fullpath); + } else { + ok(lstrcmpiA(strptr,filename)==0, + "%s: GetFullPathNameA returned '%s' instead of '%s'\n", + errstr,strptr,filename); + ok(lstrcmpiA(fullpath,tmpstr)==0, + "%s: GetFullPathNameA returned '%s' instead of '%s'\n", + errstr,tmpstr,fullpath); + } +/* Test GetShortPathNameA functionality */ + SetLastError(0); + len=GetShortPathNameA(fullpathshort,shortstr,MAX_PATH); + if(passfail==NULL) { + ok(len, "%s: GetShortPathNameA failed\n",errstr); + } else { + passfail->shortlen=len; + passfail->shorterror=GetLastError(); + } +/* Test GetLongPathNameA functionality + We test both conversion from GetFullPathNameA and from GetShortPathNameA +*/ + if(pGetLongPathNameA) { + if(len!=0) { + SetLastError(0); + len=pGetLongPathNameA(shortstr,tmpstr,MAX_PATH); + if(passfail==NULL) { + ok(len, + "%s: GetLongPathNameA failed during Short->Long conversion\n", errstr); + ok(lstrcmpiA(fullpathlong,tmpstr)==0, + "%s: GetLongPathNameA returned '%s' instead of '%s'\n", + errstr,tmpstr,fullpathlong); + } else { + passfail->s2llen=len; + passfail->s2lerror=GetLastError(); + } + } + SetLastError(0); + len=pGetLongPathNameA(fullpath,tmpstr,MAX_PATH); + if(passfail==NULL) { + ok(len, "%s: GetLongPathNameA failed\n",errstr); + if(HAS_TRAIL_SLASH_A(fullpath)) { + ok(lstrcmpiA(fullpathlong,tmpstr)==0, + "%s: GetLongPathNameA returned '%s' instead of '%s'\n", + errstr,tmpstr,fullpathlong); + } else { + ok(lstrcmpiA(fullpathlong,tmpstr)==0, + "%s: GetLongPathNameA returned '%s' instead of '%s'\n", + errstr,tmpstr,fullpathlong); + } + } else { + passfail->longlen=len; + passfail->longerror=GetLastError(); + } + } +} + +/* split path into leading directory, and 8.3 filename */ +static void test_SplitShortPathA(CHAR *path,CHAR *dir,CHAR *eight,CHAR *three) { + int done,error; + int ext,fil; + int len,i; + len=lstrlenA(path); + ext=len; fil=len; done=0; error=0; +/* walk backwards over path looking for '.' or '\\' separators */ + for(i=len-1;(i>=0) && (!done);i--) { + if(path[i]=='.') + if(ext!=len) error=1; else ext=i; + else if(path[i]=='\\') { + if(i==len-1) { + error=1; + } else { + fil=i; + done=1; + } + } + } +/* Check that we didn't find a trailing '\\' or multiple '.' */ + ok(!error,"Illegal file found in 8.3 path '%s'\n",path); +/* Separate dir, root, and extension */ + if(ext!=len) lstrcpyA(three,path+ext+1); else lstrcpyA(three,""); + if(fil!=len) { + lstrcpynA(eight,path+fil+1,ext-fil); + lstrcpynA(dir,path,fil+1); + } else { + lstrcpynA(eight,path,ext+1); + lstrcpyA(dir,""); + } +/* Validate that root and extension really are 8.3 */ + ok(lstrlenA(eight)<=8 && lstrlenA(three)<=3, + "GetShortPathNAmeA did not return an 8.3 path\n"); +} + +/* Check that GetShortPathNameA returns a valid 8.3 path */ +static void test_LongtoShortA(CHAR *teststr,CHAR *goodstr, + CHAR *ext,CHAR *errstr) { + CHAR dir[MAX_PATH],eight[MAX_PATH],three[MAX_PATH]; + + test_SplitShortPathA(teststr,dir,eight,three); + ok(lstrcmpiA(dir,goodstr)==0, + "GetShortPathNameA returned '%s' instead of '%s'\n",dir,goodstr); + ok(lstrcmpiA(three,ext)==0, + "GetShortPathNameA returned '%s' with incorrect extension\n",three); +} + +/* Test that Get(Short|Long|Full)PathNameA work correctly with interesting + characters in the filename. + 'valid' indicates whether this would be an allowed filename + 'todo' indicates that wine doesn't get this right yet. + NOTE: We always call this routine with a non-existent filename, so + Get(Short|Long)PathNameA should never pass, but GetFullPathNameA + should. +*/ +static void test_FunnyChars(CHAR *curdir,CHAR *filename, + INT valid,INT todo,CHAR *errstr) { + CHAR tmpstr[MAX_PATH],tmpstr1[MAX_PATH]; + SLpassfail passfail; + + test_ValidPathA(curdir,"",filename,tmpstr,&passfail,errstr); + if(valid) { + sprintf(tmpstr1,"%s\\%s",curdir,filename); + if(todo) { + todo_wine { + ok((passfail.shortlen==0 && + (passfail.shorterror==ERROR_FILE_NOT_FOUND || passfail.shorterror==ERROR_PATH_NOT_FOUND || !passfail.shorterror)) || + (passfail.shortlen==strlen(tmpstr1) && lstrcmpiA(tmpstr,tmpstr1)==0), + "%s: GetShortPathNameA error: len=%ld error=%ld tmpstr=[%s]\n", + errstr,passfail.shortlen,passfail.shorterror,tmpstr); + } + } else { + ok((passfail.shortlen==0 && + (passfail.shorterror==ERROR_FILE_NOT_FOUND || passfail.shorterror==ERROR_PATH_NOT_FOUND || !passfail.shorterror)) || + (passfail.shortlen==strlen(tmpstr1) && lstrcmpiA(tmpstr,tmpstr1)==0), + "%s: GetShortPathNameA error: len=%ld error=%ld tmpstr=[%s]\n", + errstr,passfail.shortlen,passfail.shorterror,tmpstr); + } + } else { + if(todo) { + todo_wine { +/* Win2k returns ERROR_INVALID_NAME, Win98, wine return ERROR_FILE_NOT_FOUND, NT4 doesn't set last error */ + ok(passfail.shortlen==0 && + (passfail.shorterror==ERROR_INVALID_NAME || passfail.shorterror==ERROR_FILE_NOT_FOUND || !passfail.shorterror), + "%s: GetShortPathA should have failed len=%ld, error=%ld\n", + errstr,passfail.shortlen,passfail.shorterror); + } + } else { + ok(passfail.shortlen==0 && + (passfail.shorterror==ERROR_INVALID_NAME || passfail.shorterror==ERROR_FILE_NOT_FOUND || !passfail.shorterror), + "%s: GetShortPathA should have failed len=%ld, error=%ld\n", + errstr,passfail.shortlen,passfail.shorterror); + } + } + if(pGetLongPathNameA) { + ok(passfail.longlen==0,"GetLongPathNameA passed when it shouldn't have\n"); + if(valid) { + ok(passfail.longerror==ERROR_FILE_NOT_FOUND, + "%s: GetLongPathA returned %ld and not %d\n", + errstr,passfail.longerror,ERROR_FILE_NOT_FOUND); + } else { + ok(passfail.longerror==ERROR_INVALID_NAME || + passfail.longerror==ERROR_FILE_NOT_FOUND, + "%s: GetLongPathA returned %ld and not %d or %d'\n", + errstr, passfail.longerror,ERROR_INVALID_NAME,ERROR_FILE_NOT_FOUND); + } + } +} + +/* Routine to test that SetCurrentDirectory behaves as expected. */ +static void test_setdir(CHAR *olddir,CHAR *newdir, + CHAR *cmprstr, INT pass,CHAR *errstr) +{ + CHAR tmppath[MAX_PATH], *dirptr; + DWORD val,len,chklen; + + val=SetCurrentDirectoryA(newdir); + len=GetCurrentDirectoryA(MAX_PATH,tmppath); +/* if 'pass' then the SetDirectoryA was supposed to pass */ + if(pass) { + dirptr=(cmprstr==NULL) ? newdir : cmprstr; + chklen=lstrlenA(dirptr); + ok(val,"%s: SetCurrentDirectoryA failed\n",errstr); + ok(len==chklen, + "%s: SetCurrentDirectory did not change the directory, though it passed\n", + errstr); + ok(lstrcmpiA(dirptr,tmppath)==0, + "%s: SetCurrentDirectory did not change the directory, though it passed\n", + errstr); + ok(SetCurrentDirectoryA(olddir), + "%s: Couldn't set directory to it's original value\n",errstr); + } else { +/* else thest that it fails correctly */ + chklen=lstrlenA(olddir); + ok(val==0, + "%s: SetCurrentDirectoryA passed when it should have failed\n",errstr); + ok(len==chklen, + "%s: SetCurrentDirectory changed the directory, though it failed\n", + errstr); + ok(lstrcmpiA(olddir,tmppath)==0, + "%s: SetCurrentDirectory changed the directory, though it failed\n", + errstr); + } +} +static void test_InitPathA(CHAR *newdir, CHAR *curDrive, CHAR *otherDrive) +{ + CHAR tmppath[MAX_PATH], /*path to TEMP */ + tmpstr[MAX_PATH], + tmpstr1[MAX_PATH]; + DWORD len,len1,drives; + INT id; + HANDLE hndl; + + *curDrive = *otherDrive = NOT_A_VALID_DRIVE; + +/* Get the current drive letter */ + if( GetCurrentDirectoryA( MAX_PATH, tmpstr)) + *curDrive = tmpstr[0]; + else + trace( "Unable to discover current drive, some tests will not be conducted.\n"); + +/* Test GetTempPathA */ + len=GetTempPathA(MAX_PATH,tmppath); + ok(len!=0 && len < MAX_PATH,"GetTempPathA failed\n"); + ok(HAS_TRAIL_SLASH_A(tmppath), + "GetTempPathA returned a path that did not end in '\\'\n"); + lstrcpyA(tmpstr,"aaaaaaaa"); + len1=GetTempPathA(len,tmpstr); + ok(len1==len+1, + "GetTempPathA should return string length %ld instead of %ld\n",len+1,len1); + +/* Test GetTmpFileNameA + The only test we do here is whether GetTempFileNameA passes or not. + We do not thoroughly test this function yet (specifically, whether + it behaves correctly when 'unique' is non zero) +*/ + ok((id=GetTempFileNameA(tmppath,"path",0,newdir)),"GetTempFileNameA failed\n"); + sprintf(tmpstr,"pat%.4x.tmp",id & 0xffff); + sprintf(tmpstr1,"pat%x.tmp",id & 0xffff); + ok(lstrcmpiA(newdir+lstrlenA(tmppath),tmpstr)==0 || + lstrcmpiA(newdir+lstrlenA(tmppath),tmpstr1)==0, + "GetTempPath returned '%s' which doesn't match '%s' or '%s'. id=%x\n", + newdir,tmpstr,tmpstr1,id); + +/* Find first valid drive letter that is neither newdir[0] nor curDrive */ + drives = GetLogicalDrives() & ~(1<<(newdir[0]-'A')); + if( *curDrive != NOT_A_VALID_DRIVE) + drives &= ~(1<<(*curDrive-'A')); + if( drives) + for( *otherDrive='A'; (drives & 1) == 0; drives>>=1, (*otherDrive)++); + else + trace( "Could not find alternative drive, some tests will not be conducted.\n"); + +/* Do some CreateDirectoryA tests */ +/* It would be nice to do test the SECURITY_ATTRIBUTES, but I don't + really understand how they work. + More formal tests should be done along with CreateFile tests +*/ + ok(CreateDirectoryA(newdir,NULL)==0, + "CreateDirectoryA succeeded even though a file of the same name exists\n"); + ok(DeleteFileA(newdir),"Couldn't delete the temporary file we just created\n"); + ok(CreateDirectoryA(newdir,NULL),"CreateDirectoryA failed\n"); +/* Create some files to test other functions. Note, we will test CreateFileA + at some later point +*/ + sprintf(tmpstr,"%s\\%s",newdir,SHORTDIR); + ok(CreateDirectoryA(tmpstr,NULL),"CreateDirectoryA failed\n"); + sprintf(tmpstr,"%s\\%s",newdir,LONGDIR); + ok(CreateDirectoryA(tmpstr,NULL),"CreateDirectoryA failed\n"); + sprintf(tmpstr,"%s\\%s\\%s",newdir,SHORTDIR,SHORTFILE); + hndl=CreateFileA(tmpstr,GENERIC_WRITE,0,NULL, + CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL); + ok(hndl!=INVALID_HANDLE_VALUE,"CreateFileA failed\n"); + ok(CloseHandle(hndl),"CloseHandle failed\n"); + sprintf(tmpstr,"%s\\%s\\%s",newdir,SHORTDIR,LONGFILE); + hndl=CreateFileA(tmpstr,GENERIC_WRITE,0,NULL, + CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL); + ok(hndl!=INVALID_HANDLE_VALUE,"CreateFileA failed\n"); + ok(CloseHandle(hndl),"CloseHandle failed\n"); + sprintf(tmpstr,"%s\\%s\\%s",newdir,LONGDIR,SHORTFILE); + hndl=CreateFileA(tmpstr,GENERIC_WRITE,0,NULL, + CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL); + ok(hndl!=INVALID_HANDLE_VALUE,"CreateFileA failed\n"); + ok(CloseHandle(hndl),"CloseHandle failed\n"); + sprintf(tmpstr,"%s\\%s\\%s",newdir,LONGDIR,LONGFILE); + hndl=CreateFileA(tmpstr,GENERIC_WRITE,0,NULL, + CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL); + ok(hndl!=INVALID_HANDLE_VALUE,"CreateFileA failed\n"); + ok(CloseHandle(hndl),"CloseHandle failed\n"); +} + +/* Test GetCurrentDirectory & SetCurrentDirectory */ +static void test_CurrentDirectoryA(CHAR *origdir, CHAR *newdir) +{ + CHAR tmpstr[MAX_PATH],tmpstr1[MAX_PATH]; + DWORD len,len1; +/* Save the original directory, so that we can return to it at the end + of the test +*/ + len=GetCurrentDirectoryA(MAX_PATH,origdir); + ok(len!=0 && len < MAX_PATH,"GetCurrentDirectoryA failed\n"); + ok(lstrcmpiA(origdir+(len-1),"\\")!=0, + "GetCurrentDirectoryA should not have a trailing \\\n"); +/* Make sure that CetCurrentDirectoryA doesn't overwrite the buffer when the + buffer size is too small to hold the current directory +*/ + lstrcpyA(tmpstr,"aaaaaaa"); + len1=GetCurrentDirectoryA(len,tmpstr); + ok(len1==len+1, "GetCurrentDirectoryA returned %ld instead of %ld\n",len1,len+1); + ok(lstrcmpiA(tmpstr,"aaaaaaa")==0, + "GetCurrentDirectoryA should not have modified the buffer\n"); +/* SetCurrentDirectoryA shouldn't care whether the string has a + trailing '\\' or not +*/ + sprintf(tmpstr,"%s\\",newdir); + test_setdir(origdir,tmpstr,newdir,1,"check 1"); + test_setdir(origdir,newdir,NULL,1,"check 2"); +/* Set the directory to the working area. We just tested that this works, + so why check it again. +*/ + SetCurrentDirectoryA(newdir); +/* Check that SetCurrentDirectory fails when a non-existent dir is specified */ + sprintf(tmpstr,"%s\\%s\\%s",newdir,SHORTDIR,NONDIR_SHORT); + test_setdir(newdir,tmpstr,NULL,0,"check 3"); +/* Check that SetCurrentDirectory fails for a non-existent lond directory */ + sprintf(tmpstr,"%s\\%s\\%s",newdir,SHORTDIR,NONDIR_LONG); + test_setdir(newdir,tmpstr,NULL,0,"check 4"); +/* Check that SetCurrentDirectory passes with a long directory */ + sprintf(tmpstr,"%s\\%s",newdir,LONGDIR); + test_setdir(newdir,tmpstr,NULL,1,"check 5"); +/* Check that SetCurrentDirectory passes with a short relative directory */ + sprintf(tmpstr,"%s",SHORTDIR); + sprintf(tmpstr1,"%s\\%s",newdir,SHORTDIR); + test_setdir(newdir,tmpstr,tmpstr1,1,"check 6"); +/* starting with a '.' */ + sprintf(tmpstr,".\\%s",SHORTDIR); + test_setdir(newdir,tmpstr,tmpstr1,1,"check 7"); +/* Check that SetCurrentDirectory passes with a short relative directory */ + sprintf(tmpstr,"%s",LONGDIR); + sprintf(tmpstr1,"%s\\%s",newdir,LONGDIR); + test_setdir(newdir,tmpstr,tmpstr1,1,"check 8"); +/* starting with a '.' */ + sprintf(tmpstr,".\\%s",LONGDIR); + test_setdir(newdir,tmpstr,tmpstr1,1,"check 9"); +} + +/* Cleanup the mess we made while executing these tests */ +static void test_CleanupPathA(CHAR *origdir, CHAR *curdir) +{ + CHAR tmpstr[MAX_PATH]; + sprintf(tmpstr,"%s\\%s\\%s",curdir,SHORTDIR,SHORTFILE); + ok(DeleteFileA(tmpstr),"DeleteFileA failed\n"); + sprintf(tmpstr,"%s\\%s\\%s",curdir,SHORTDIR,LONGFILE); + ok(DeleteFileA(tmpstr),"DeleteFileA failed\n"); + sprintf(tmpstr,"%s\\%s\\%s",curdir,LONGDIR,SHORTFILE); + ok(DeleteFileA(tmpstr),"DeleteFileA failed\n"); + sprintf(tmpstr,"%s\\%s\\%s",curdir,LONGDIR,LONGFILE); + ok(DeleteFileA(tmpstr),"DeleteFileA failed\n"); + sprintf(tmpstr,"%s\\%s",curdir,SHORTDIR); + ok(RemoveDirectoryA(tmpstr),"RemoveDirectoryA failed\n"); + sprintf(tmpstr,"%s\\%s",curdir,LONGDIR); + ok(RemoveDirectoryA(tmpstr),"RemoveDirectoryA failed\n"); + ok(SetCurrentDirectoryA(origdir),"SetCurrentDirectoryA failed\n"); + ok(RemoveDirectoryA(curdir),"RemoveDirectoryA failed\n"); +} + +/* This routine will test Get(Full|Short|Long)PathNameA */ +static void test_PathNameA(CHAR *curdir, CHAR curDrive, CHAR otherDrive) +{ + CHAR curdir_short[MAX_PATH], + longdir_short[MAX_PATH]; + CHAR tmpstr[MAX_PATH],tmpstr1[MAX_PATH],tmpstr2[MAX_PATH]; + LPSTR strptr; /*ptr to the filename portion of the path */ + DWORD len; + INT i; + CHAR dir[MAX_PATH],eight[MAX_PATH],three[MAX_PATH]; + SLpassfail passfail; + +/* Get the short form of the current directory */ + ok((len=GetShortPathNameA(curdir,curdir_short,MAX_PATH)), + "GetShortPathNameA failed\n"); + ok(!HAS_TRAIL_SLASH_A(curdir_short), + "GetShortPathNameA should not have a trailing \\\n"); +/* Get the short form of the absolute-path to LONGDIR */ + sprintf(tmpstr,"%s\\%s",curdir_short,LONGDIR); + ok((len=GetShortPathNameA(tmpstr,longdir_short,MAX_PATH)), + "GetShortPathNameA failed\n"); + ok(lstrcmpiA(longdir_short+(len-1),"\\")!=0, + "GetShortPathNameA should not have a trailing \\\n"); + + if (pGetLongPathNameA) { + DWORD rc1,rc2; + sprintf(tmpstr,"%s\\%s\\%s",curdir,LONGDIR,LONGFILE); + rc1=(*pGetLongPathNameA)(tmpstr,NULL,0); + rc2=(*pGetLongPathNameA)(curdir,NULL,0); + ok((rc1-strlen(tmpstr))==(rc2-strlen(curdir)), + "GetLongPathNameA: wrong return code, %ld instead of %d\n", + rc1, strlen(tmpstr)+1); + + sprintf(dir,"%c:",curDrive); + rc1=(*pGetLongPathNameA)(dir,tmpstr,sizeof(tmpstr)); + ok(strcmp(dir,tmpstr)==0, + "GetLongPathNameA: returned '%s' instead of '%s' (rc=%ld)\n", + tmpstr,dir,rc1); + } + +/* Check the cases where both file and directory exist first */ +/* Start with a 8.3 directory, 8.3 filename */ + test_ValidPathA(curdir,SHORTDIR,SHORTFILE,tmpstr,NULL,"test1"); + sprintf(tmpstr1,"%s\\%s\\%s",curdir_short,SHORTDIR,SHORTFILE); + ok(lstrcmpiA(tmpstr,tmpstr1)==0, + "GetShortPathNameA returned '%s' instead of '%s'\n",tmpstr,tmpstr1); +/* Now try a 8.3 directory, long file name */ + test_ValidPathA(curdir,SHORTDIR,LONGFILE,tmpstr,NULL,"test2"); + sprintf(tmpstr1,"%s\\%s",curdir_short,SHORTDIR); + test_LongtoShortA(tmpstr,tmpstr1,"PAT","test2"); +/* Next is a long directory, 8.3 file */ + test_ValidPathA(curdir,LONGDIR,SHORTFILE,tmpstr,NULL,"test3"); + sprintf(tmpstr1,"%s\\%s",longdir_short,SHORTFILE); + ok(lstrcmpiA(tmpstr,tmpstr1)==0, + "GetShortPathNameA returned '%s' instead of '%s'\n",tmpstr,tmpstr1); +/*Lastly a long directory, long file */ + test_ValidPathA(curdir,LONGDIR,LONGFILE,tmpstr,NULL,"test4"); + test_LongtoShortA(tmpstr,longdir_short,"PAT","test4"); + +/* Now check all of the invalid file w/ valid directory combinations */ +/* Start with a 8.3 directory, 8.3 filename */ + test_ValidPathA(curdir,SHORTDIR,NONFILE_SHORT,tmpstr,&passfail,"test5"); + sprintf(tmpstr1,"%s\\%s\\%s",curdir_short,SHORTDIR,NONFILE_SHORT); + ok((passfail.shortlen==0 && + (passfail.shorterror==ERROR_PATH_NOT_FOUND || + passfail.shorterror==ERROR_FILE_NOT_FOUND)) || + (passfail.shortlen==strlen(tmpstr1) && lstrcmpiA(tmpstr,tmpstr1)==0), + "GetShortPathNameA error: len=%ld error=%ld tmpstr=[%s]\n", + passfail.shortlen,passfail.shorterror,tmpstr); + if(pGetLongPathNameA) { + ok(passfail.longlen==0,"GetLongPathNameA passed when it shouldn't have\n"); + ok(passfail.longerror==ERROR_FILE_NOT_FOUND, + "GetlongPathA should have returned 'ERROR_FILE_NOT_FOUND'\n"); + } +/* Now try a 8.3 directory, long file name */ + test_ValidPathA(curdir,SHORTDIR,NONFILE_LONG,tmpstr,&passfail,"test6"); + ok(passfail.shortlen==0,"GetShortPathNameA passed when it shouldn't have\n"); + ok(passfail.shorterror==ERROR_PATH_NOT_FOUND || + passfail.shorterror==ERROR_FILE_NOT_FOUND || + !passfail.shorterror, + "GetShortPathA should have returned 'ERROR_FILE_NOT_FOUND'\n"); + if(pGetLongPathNameA) { + ok(passfail.longlen==0,"GetLongPathNameA passed when it shouldn't have\n"); + ok(passfail.longerror==ERROR_FILE_NOT_FOUND, + "GetlongPathA should have returned 'ERROR_FILE_NOT_FOUND'\n"); + } +/* Next is a long directory, 8.3 file */ + test_ValidPathA(curdir,LONGDIR,NONFILE_SHORT,tmpstr,&passfail,"test7"); + sprintf(tmpstr2,"%s\\%s",curdir_short,LONGDIR); + GetShortPathNameA(tmpstr2,tmpstr1,MAX_PATH); + strcat(tmpstr1,"\\" NONFILE_SHORT); + ok((passfail.shortlen==0 && + (passfail.shorterror==ERROR_PATH_NOT_FOUND || + passfail.shorterror==ERROR_FILE_NOT_FOUND)) || + (passfail.shortlen==strlen(tmpstr1) && lstrcmpiA(tmpstr,tmpstr1)==0), + "GetShortPathNameA error: len=%ld error=%ld tmpstr=[%s]\n", + passfail.shortlen,passfail.shorterror,tmpstr); + if(pGetLongPathNameA) { + ok(passfail.longlen==0,"GetLongPathNameA passed when it shouldn't have\n"); + ok(passfail.longerror==ERROR_FILE_NOT_FOUND, + "GetlongPathA should have returned 'ERROR_FILE_NOT_FOUND'\n"); + } +/*Lastly a long directory, long file */ + test_ValidPathA(curdir,LONGDIR,NONFILE_LONG,tmpstr,&passfail,"test8"); + ok(passfail.shortlen==0,"GetShortPathNameA passed when it shouldn't have\n"); + ok(passfail.shorterror==ERROR_PATH_NOT_FOUND || + passfail.shorterror==ERROR_FILE_NOT_FOUND || + !passfail.shorterror, + "GetShortPathA should have returned 'ERROR_FILE_NOT_FOUND'\n"); + if(pGetLongPathNameA) { + ok(passfail.longlen==0,"GetLongPathNameA passed when it shouldn't have\n"); + ok(passfail.longerror==ERROR_FILE_NOT_FOUND, + "GetlongPathA should have returned 'ERROR_FILE_NOT_FOUND'\n"); + } +/* Now try again with directories that don't exist */ +/* 8.3 directory, 8.3 filename */ + test_ValidPathA(curdir,NONDIR_SHORT,SHORTFILE,tmpstr,&passfail,"test9"); + sprintf(tmpstr1,"%s\\%s\\%s",curdir_short,NONDIR_SHORT,SHORTFILE); + ok((passfail.shortlen==0 && + (passfail.shorterror==ERROR_PATH_NOT_FOUND || + passfail.shorterror==ERROR_FILE_NOT_FOUND)) || + (passfail.shortlen==strlen(tmpstr1) && lstrcmpiA(tmpstr,tmpstr1)==0), + "GetShortPathNameA error: len=%ld error=%ld tmpstr=[%s]\n", + passfail.shortlen,passfail.shorterror,tmpstr); + if(pGetLongPathNameA) { + ok(passfail.longlen==0,"GetLongPathNameA passed when it shouldn't have\n"); + ok(passfail.longerror==ERROR_PATH_NOT_FOUND || + passfail.longerror==ERROR_FILE_NOT_FOUND, + "GetLongPathA returned %ld and not 'ERROR_PATH_NOT_FOUND'\n", + passfail.longerror); + } +/* Now try a 8.3 directory, long file name */ + test_ValidPathA(curdir,NONDIR_SHORT,LONGFILE,tmpstr,&passfail,"test10"); + ok(passfail.shortlen==0,"GetShortPathNameA passed when it shouldn't have\n"); + ok(passfail.shorterror==ERROR_PATH_NOT_FOUND || + passfail.shorterror==ERROR_FILE_NOT_FOUND || + !passfail.shorterror, + "GetShortPathA returned %ld and not 'ERROR_PATH_NOT_FOUND'\n", + passfail.shorterror); + if(pGetLongPathNameA) { + ok(passfail.longlen==0,"GetLongPathNameA passed when it shouldn't have\n"); + ok(passfail.longerror==ERROR_PATH_NOT_FOUND || + passfail.longerror==ERROR_FILE_NOT_FOUND, + "GetLongPathA returned %ld and not 'ERROR_PATH_NOT_FOUND'\n", + passfail.longerror); + } +/* Next is a long directory, 8.3 file */ + test_ValidPathA(curdir,NONDIR_LONG,SHORTFILE,tmpstr,&passfail,"test11"); + ok(passfail.shortlen==0,"GetShortPathNameA passed when it shouldn't have\n"); + ok(passfail.shorterror==ERROR_PATH_NOT_FOUND || + passfail.shorterror==ERROR_FILE_NOT_FOUND || + !passfail.shorterror, + "GetShortPathA returned %ld and not 'ERROR_PATH_NOT_FOUND'\n", + passfail.shorterror); + if(pGetLongPathNameA) { + ok(passfail.longlen==0,"GetLongPathNameA passed when it shouldn't have\n"); + ok(passfail.longerror==ERROR_PATH_NOT_FOUND || + passfail.longerror==ERROR_FILE_NOT_FOUND, + "GetLongPathA returned %ld and not 'ERROR_PATH_NOT_FOUND'\n", + passfail.longerror); + } +/*Lastly a long directory, long file */ + test_ValidPathA(curdir,NONDIR_LONG,LONGFILE,tmpstr,&passfail,"test12"); + ok(passfail.shortlen==0,"GetShortPathNameA passed when it shouldn't have\n"); + ok(passfail.shorterror==ERROR_PATH_NOT_FOUND || + passfail.shorterror==ERROR_FILE_NOT_FOUND || + !passfail.shorterror, + "GetShortPathA returned %ld and not 'ERROR_PATH_NOT_FOUND'\n", + passfail.shorterror); + if(pGetLongPathNameA) { + ok(passfail.longlen==0,"GetLongPathNameA passed when it shouldn't have\n"); + ok(passfail.longerror==ERROR_PATH_NOT_FOUND || + passfail.longerror==ERROR_FILE_NOT_FOUND, + "GetLongPathA returned %ld and not 'ERROR_PATH_NOT_FOUND'\n", + passfail.longerror); + } +/* Next try directories ending with '\\' */ +/* Existing Directories */ + sprintf(tmpstr,"%s\\",SHORTDIR); + test_ValidPathA(curdir,"",tmpstr,tmpstr1,NULL,"test13"); + sprintf(tmpstr,"%s\\",LONGDIR); + test_ValidPathA(curdir,"",tmpstr,tmpstr1,NULL,"test14"); +/* Non-existent directories */ + sprintf(tmpstr,"%s\\",NONDIR_SHORT); + test_ValidPathA(curdir,"",tmpstr,tmpstr1,&passfail,"test15"); + sprintf(tmpstr2,"%s\\%s",curdir,tmpstr); + ok((passfail.shortlen==0 && + (passfail.shorterror==ERROR_PATH_NOT_FOUND || + passfail.shorterror==ERROR_FILE_NOT_FOUND)) || + (passfail.shortlen==strlen(tmpstr2) && lstrcmpiA(tmpstr1,tmpstr2)==0), + "GetShortPathNameA error: len=%ld error=%ld tmpstr=[%s]\n", + passfail.shortlen,passfail.shorterror,tmpstr); + if(pGetLongPathNameA) { + ok(passfail.longlen==0,"GetLongPathNameA passed when it shouldn't have\n"); + ok(passfail.longerror==ERROR_FILE_NOT_FOUND, + "GetLongPathA returned %ld and not 'ERROR_FILE_NOT_FOUND'\n", + passfail.longerror); + } + sprintf(tmpstr,"%s\\",NONDIR_LONG); + test_ValidPathA(curdir,"",tmpstr,tmpstr1,&passfail,"test16"); + ok(passfail.shortlen==0,"GetShortPathNameA passed when it shouldn't have\n"); + ok(passfail.shorterror==ERROR_PATH_NOT_FOUND || + passfail.shorterror==ERROR_FILE_NOT_FOUND || + !passfail.shorterror, + "GetShortPathA returned %ld and not 'ERROR_FILE_NOT_FOUND'\n", + passfail.shorterror); + if(pGetLongPathNameA) { + ok(passfail.longlen==0,"GetLongPathNameA passed when it shouldn't have\n"); + ok(passfail.longerror==ERROR_FILE_NOT_FOUND, + "GetLongPathA returned %ld and not 'ERROR_FILE_NOT_FOUND'\n", + passfail.longerror); + } +/* Test GetFullPathNameA with drive letters */ + if( curDrive != NOT_A_VALID_DRIVE) { + sprintf(tmpstr,"%c:",curdir[0]); + ok(GetFullPathNameA(tmpstr,MAX_PATH,tmpstr2,&strptr), + "GetFullPathNameA(%c:) failed\n", curdir[0]); + GetCurrentDirectoryA(MAX_PATH,tmpstr); + sprintf(tmpstr1,"%s\\",tmpstr); + ok(lstrcmpiA(tmpstr,tmpstr2)==0 || lstrcmpiA(tmpstr1,tmpstr2)==0, + "GetFullPathNameA(%c:) returned '%s' instead of '%s' or '%s'\n", + curdir[0],tmpstr2,tmpstr,tmpstr1); + + sprintf(tmpstr,"%c:\\%s\\%s",curDrive,SHORTDIR,SHORTFILE); + ok(GetFullPathNameA(tmpstr,MAX_PATH,tmpstr1,&strptr),"GetFullPathNameA failed\n"); + ok(lstrcmpiA(tmpstr,tmpstr1)==0, + "GetFullPathNameA returned '%s' instead of '%s'\n",tmpstr1,tmpstr); + ok(lstrcmpiA(SHORTFILE,strptr)==0, + "GetFullPathNameA returned part '%s' instead of '%s'\n",strptr,SHORTFILE); + } +/* Without a leading slash, insert the current directory if on the current drive */ + sprintf(tmpstr,"%c:%s\\%s",curdir[0],SHORTDIR,SHORTFILE); + ok(GetFullPathNameA(tmpstr,MAX_PATH,tmpstr1,&strptr),"GetFullPathNameA failed\n"); + sprintf(tmpstr,"%s\\%s\\%s",curdir,SHORTDIR,SHORTFILE); + ok(lstrcmpiA(tmpstr,tmpstr1)==0, + "GetFullPathNameA returned '%s' instead of '%s'\n",tmpstr1,tmpstr); + ok(lstrcmpiA(SHORTFILE,strptr)==0, + "GetFullPathNameA returned part '%s' instead of '%s'\n",strptr,SHORTFILE); +/* Otherwise insert the missing leading slash */ + if( otherDrive != NOT_A_VALID_DRIVE) { + sprintf(tmpstr,"%c:%s\\%s",otherDrive,SHORTDIR,SHORTFILE); + ok(GetFullPathNameA(tmpstr,MAX_PATH,tmpstr1,&strptr),"GetFullPathNameA failed for %s\n", tmpstr); + sprintf(tmpstr,"%c:\\%s\\%s",otherDrive,SHORTDIR,SHORTFILE); + ok(lstrcmpiA(tmpstr,tmpstr1)==0, + "GetFullPathNameA returned '%s' instead of '%s'\n",tmpstr1,tmpstr); + ok(lstrcmpiA(SHORTFILE,strptr)==0, + "GetFullPathNameA returned part '%s' instead of '%s'\n",strptr,SHORTFILE); + } +/* Xilinx tools like to mix Unix and DOS formats, which Windows handles fine. + So test for them. */ + if( curDrive != NOT_A_VALID_DRIVE) { + sprintf(tmpstr,"%c:/%s\\%s",curDrive,SHORTDIR,SHORTFILE); + ok(GetFullPathNameA(tmpstr,MAX_PATH,tmpstr1,&strptr),"GetFullPathNameA failed\n"); + sprintf(tmpstr,"%c:\\%s\\%s",curDrive,SHORTDIR,SHORTFILE); + ok(lstrcmpiA(tmpstr,tmpstr1)==0, + "GetFullPathNameA returned '%s' instead of '%s'\n",tmpstr1,tmpstr); + ok(lstrcmpiA(SHORTFILE,strptr)==0, + "GetFullPathNameA returned part '%s' instead of '%s'\n",strptr,SHORTFILE); + } +/**/ + sprintf(tmpstr,"%c:%s/%s",curdir[0],SHORTDIR,SHORTFILE); + ok(GetFullPathNameA(tmpstr,MAX_PATH,tmpstr1,&strptr),"GetFullPathNameA failed\n"); + sprintf(tmpstr,"%s\\%s\\%s",curdir,SHORTDIR,SHORTFILE); + ok(lstrcmpiA(tmpstr,tmpstr1)==0, + "GetFullPathNameA returned '%s' instead of '%s'\n",tmpstr1,tmpstr); + ok(lstrcmpiA(SHORTFILE,strptr)==0, + "GetFullPathNameA returned part '%s' instead of '%s'\n",strptr,SHORTFILE); +/* Windows will insert a drive letter in front of an absolute UNIX path, but + Wine probably shouldn't. */ + sprintf(tmpstr,"/%s/%s",SHORTDIR,SHORTFILE); + ok(GetFullPathNameA(tmpstr,MAX_PATH,tmpstr1,&strptr),"GetFullPathNameA failed\n"); + todo_wine { + if( curDrive != NOT_A_VALID_DRIVE) { + sprintf(tmpstr,"C:\\%s\\%s",SHORTDIR,SHORTFILE); + ok(lstrcmpiA(tmpstr,tmpstr1)==0, + "GetFullPathNameA returned '%s' instead of '%s'\n",tmpstr1,tmpstr); + } + } +/* This passes in Wine because it still contains the pointer from the previous test */ + ok(lstrcmpiA(SHORTFILE,strptr)==0, + "GetFullPathNameA returned part '%s' instead of '%s'\n",strptr,SHORTFILE); + +/* Now try some relative paths */ + ok(GetShortPathNameA(LONGDIR,tmpstr,MAX_PATH),"GetShortPathNameA failed\n"); + test_SplitShortPathA(tmpstr,dir,eight,three); + if(pGetLongPathNameA) { + ok(pGetLongPathNameA(tmpstr,tmpstr1,MAX_PATH),"GetLongPathNameA failed\n"); + ok(lstrcmpiA(tmpstr1,LONGDIR)==0, + "GetLongPathNameA returned '%s' instead of '%s'\n",tmpstr1,LONGDIR); + } + sprintf(tmpstr,".\\%s",LONGDIR); + ok(GetShortPathNameA(tmpstr,tmpstr1,MAX_PATH),"GetShortPathNameA failed\n"); + test_SplitShortPathA(tmpstr1,dir,eight,three); + ok(lstrcmpiA(dir,".")==0 || dir[0]=='\0', + "GetShortPathNameA did not keep relative directory [%s]\n",tmpstr1); + if(pGetLongPathNameA) { + ok(pGetLongPathNameA(tmpstr1,tmpstr1,MAX_PATH),"GetLongPathNameA failed %s\n", + tmpstr); + ok(lstrcmpiA(tmpstr1,tmpstr)==0, + "GetLongPathNameA returned '%s' instead of '%s'\n",tmpstr1,tmpstr); + } +/* Check out Get*PathNameA on some funny characters */ + for(i=0;i= len_with_null, "Expected >= %lu, got %lu\n", len_with_null, len); + + len = GetTempPathA(0, NULL); + ok(len >= len_with_null, "Expected >= %lu, got %lu\n", len_with_null, len); + + /* The call above gave us the buffer size that Windows thinks is needed + * so the next call should work + */ + lstrcpyA(buf, "foo"); + len = GetTempPathA(len, buf); + ok(lstrcmpiA(buf, tmp_dir) == 0, "expected [%s], got [%s]\n",tmp_dir,buf); + ok(len == strlen(buf), "returned length should be equal to the length of string\n"); +} + +static void test_GetTempPathW(char* tmp_dir) +{ + DWORD len, len_with_null; + WCHAR buf[MAX_PATH]; + WCHAR tmp_dirW[MAX_PATH]; + static const WCHAR fooW[] = {'f','o','o',0}; + + MultiByteToWideChar(CP_ACP,0,tmp_dir,-1,tmp_dirW,sizeof(tmp_dirW)/sizeof(*tmp_dirW)); + len_with_null = lstrlenW(tmp_dirW) + 1; + + /* This one is different from ANSI version: ANSI version doesn't + * touch the buffer, unicode version usually truncates the buffer + * to zero size. NT still exagerates the required buffer size + * sometimes so we cannot test for an exact match. Finally, the + * 'len_with_null - 1' case is so buggy on Windows it's not testable. + * For instance on NT4 it will sometimes return a path without the + * trailing '\\' and sometimes return an error. + */ + + lstrcpyW(buf, fooW); + len = GetTempPathW(MAX_PATH, buf); + if (len==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) + return; + ok(lstrcmpiW(buf, tmp_dirW) == 0, "GetTempPathW returned an incorrect temporary path\n"); + ok(len == lstrlenW(buf), "returned length should be equal to the length of string\n"); + + lstrcpyW(buf, fooW); + len = GetTempPathW(1, buf); + ok(buf[0] == 0, "unicode version should truncate the buffer to zero size\n"); + ok(len >= len_with_null, "Expected >= %lu, got %lu\n", len_with_null, len); + + len = GetTempPathW(0, NULL); + ok(len >= len_with_null, "Expected >= %lu, got %lu\n", len_with_null, len); + + lstrcpyW(buf, fooW); + len = GetTempPathW(len, buf); + ok(lstrcmpiW(buf, tmp_dirW) == 0, "GetTempPathW returned an incorrect temporary path\n"); + ok(len == lstrlenW(buf), "returned length should be equal to the length of string\n"); +} + +static void test_GetTempPath(void) +{ + char save_TMP[MAX_PATH]; + char windir[MAX_PATH]; + char buf[MAX_PATH]; + + GetEnvironmentVariableA("TMP", save_TMP, sizeof(save_TMP)); + + /* test default configuration */ + trace("TMP=%s\n", save_TMP); + strcpy(buf,save_TMP); + if (buf[strlen(buf)-1]!='\\') + strcat(buf,"\\"); + test_GetTempPathA(buf); + test_GetTempPathW(buf); + + /* TMP=C:\WINDOWS */ + GetWindowsDirectoryA(windir, sizeof(windir)); + SetEnvironmentVariableA("TMP", windir); + GetEnvironmentVariableA("TMP", buf, sizeof(buf)); + trace("TMP=%s\n", buf); + strcat(windir,"\\"); + test_GetTempPathA(windir); + test_GetTempPathW(windir); + + /* TMP=C:\ */ + GetWindowsDirectoryA(windir, sizeof(windir)); + windir[3] = 0; + SetEnvironmentVariableA("TMP", windir); + GetEnvironmentVariableA("TMP", buf, sizeof(buf)); + trace("TMP=%s\n", buf); + test_GetTempPathA(windir); + test_GetTempPathW(windir); + + /* TMP=C: i.e. use current working directory of the specified drive */ + GetWindowsDirectoryA(windir, sizeof(windir)); + SetCurrentDirectoryA(windir); + windir[2] = 0; + SetEnvironmentVariableA("TMP", windir); + GetEnvironmentVariableA("TMP", buf, sizeof(buf)); + trace("TMP=%s\n", buf); + GetWindowsDirectoryA(windir, sizeof(windir)); + strcat(windir,"\\"); + test_GetTempPathA(windir); + test_GetTempPathW(windir); + + SetEnvironmentVariableA("TMP", save_TMP); +} + +START_TEST(path) +{ + CHAR origdir[MAX_PATH],curdir[MAX_PATH], curDrive, otherDrive; + pGetLongPathNameA = (void*)GetProcAddress( GetModuleHandleA("kernel32.dll"), + "GetLongPathNameA" ); + test_InitPathA(curdir, &curDrive, &otherDrive); + test_CurrentDirectoryA(origdir,curdir); + test_PathNameA(curdir, curDrive, otherDrive); + test_CleanupPathA(origdir,curdir); + test_GetTempPath(); +} diff --git a/reactos/apps/tests/kernel32/pipe.c b/reactos/apps/tests/kernel32/pipe.c new file mode 100644 index 00000000000..b86b985e7c9 --- /dev/null +++ b/reactos/apps/tests/kernel32/pipe.c @@ -0,0 +1,601 @@ +/* + * Unit tests for named pipe functions in Wine + * + * Copyright (c) 2002 Dan Kegel + * + * 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 +#include +#include + +#ifndef STANDALONE +#include "wine/test.h" +#else +#include +#define START_TEST(name) main(int argc, char **argv) +#define ok(condition, msg) \ + do { \ + if(!(condition)) \ + { \ + fprintf(stderr,"failed at %d\n",__LINE__); \ + exit(0); \ + } \ + } while(0) + +#define todo_wine +#endif + +#include +#include + +#define PIPENAME "\\\\.\\PiPe\\tests_" __FILE__ + +void test_CreateNamedPipe(void) +{ + HANDLE hnp; + HANDLE hFile; + const char obuf[] = "Bit Bucket"; + char ibuf[32]; + DWORD written; + DWORD readden; + + trace("test_CreateNamedPipe starting\n"); + /* Bad parameter checks */ + hnp = CreateNamedPipe("not a named pipe", PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_WAIT, + /* nMaxInstances */ 1, + /* nOutBufSize */ 1024, + /* nInBufSize */ 1024, + /* nDefaultWait */ NMPWAIT_USE_DEFAULT_WAIT, + /* lpSecurityAttrib */ NULL); + + if (hnp == INVALID_HANDLE_VALUE && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { + /* Is this the right way to notify user of skipped tests? */ + ok(hnp == INVALID_HANDLE_VALUE && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED, + "CreateNamedPipe not supported on this platform, skipping tests.\n"); + return; + } + ok(hnp == INVALID_HANDLE_VALUE && GetLastError() == ERROR_INVALID_NAME, + "CreateNamedPipe should fail if name doesn't start with \\\\.\\pipe\n"); + + hnp = CreateNamedPipe(NULL, + PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_WAIT, + 1, 1024, 1024, NMPWAIT_USE_DEFAULT_WAIT, NULL); + ok(hnp == INVALID_HANDLE_VALUE && GetLastError() == ERROR_PATH_NOT_FOUND, + "CreateNamedPipe should fail if name is NULL\n"); + + hFile = CreateFileA(PIPENAME, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0); + ok(hFile == INVALID_HANDLE_VALUE + && GetLastError() == ERROR_FILE_NOT_FOUND, + "connecting to nonexistent named pipe should fail with ERROR_FILE_NOT_FOUND\n"); + + /* Functional checks */ + + hnp = CreateNamedPipe(PIPENAME, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_WAIT, + /* nMaxInstances */ 1, + /* nOutBufSize */ 1024, + /* nInBufSize */ 1024, + /* nDefaultWait */ NMPWAIT_USE_DEFAULT_WAIT, + /* lpSecurityAttrib */ NULL); + ok(hnp != INVALID_HANDLE_VALUE, "CreateNamedPipe failed\n"); + + hFile = CreateFileA(PIPENAME, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0); + ok(hFile != INVALID_HANDLE_VALUE, "CreateFile failed\n"); + + /* don't try to do i/o if one side couldn't be opened, as it hangs */ + if (hFile != INVALID_HANDLE_VALUE) { + HANDLE hFile2; + + /* Make sure we can read and write a few bytes in both directions */ + memset(ibuf, 0, sizeof(ibuf)); + ok(WriteFile(hnp, obuf, sizeof(obuf), &written, NULL), "WriteFile\n"); + ok(written == sizeof(obuf), "write file len\n"); + ok(ReadFile(hFile, ibuf, sizeof(obuf), &readden, NULL), "ReadFile\n"); + ok(readden == sizeof(obuf), "read file len\n"); + ok(memcmp(obuf, ibuf, written) == 0, "content check\n"); + + memset(ibuf, 0, sizeof(ibuf)); + ok(WriteFile(hFile, obuf, sizeof(obuf), &written, NULL), "WriteFile\n"); + ok(written == sizeof(obuf), "write file len\n"); + ok(ReadFile(hnp, ibuf, sizeof(obuf), &readden, NULL), "ReadFile\n"); + ok(readden == sizeof(obuf), "read file len\n"); + ok(memcmp(obuf, ibuf, written) == 0, "content check\n"); + + /* Picky conformance tests */ + + /* Verify that you can't connect to pipe again + * until server calls DisconnectNamedPipe+ConnectNamedPipe + * or creates a new pipe + * case 1: other client not yet closed + */ + hFile2 = CreateFileA(PIPENAME, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0); + ok(hFile2 == INVALID_HANDLE_VALUE, + "connecting to named pipe after other client closes but before DisconnectNamedPipe should fail\n"); + ok(GetLastError() == ERROR_PIPE_BUSY, + "connecting to named pipe before other client closes should fail with ERROR_PIPE_BUSY\n"); + + ok(CloseHandle(hFile), "CloseHandle\n"); + + /* case 2: other client already closed */ + hFile = CreateFileA(PIPENAME, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0); + ok(hFile == INVALID_HANDLE_VALUE, + "connecting to named pipe after other client closes but before DisconnectNamedPipe should fail\n"); + ok(GetLastError() == ERROR_PIPE_BUSY, + "connecting to named pipe after other client closes but before DisconnectNamedPipe should fail with ERROR_PIPE_BUSY\n"); + + ok(DisconnectNamedPipe(hnp), "DisconnectNamedPipe\n"); + + /* case 3: server has called DisconnectNamedPipe but not ConnectNamed Pipe */ + hFile = CreateFileA(PIPENAME, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0); + ok(hFile == INVALID_HANDLE_VALUE, + "connecting to named pipe after other client closes but before DisconnectNamedPipe should fail\n"); + ok(GetLastError() == ERROR_PIPE_BUSY, + "connecting to named pipe after other client closes but before ConnectNamedPipe should fail with ERROR_PIPE_BUSY\n"); + + /* to be complete, we'd call ConnectNamedPipe here and loop, + * but by default that's blocking, so we'd either have + * to turn on the uncommon nonblocking mode, or + * use another thread. + */ + } + + ok(CloseHandle(hnp), "CloseHandle\n"); + + trace("test_CreateNamedPipe returning\n"); +} + +void test_CreateNamedPipe_instances_must_match(void) +{ + HANDLE hnp, hnp2; + + /* Check no mismatch */ + hnp = CreateNamedPipe(PIPENAME, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_WAIT, + /* nMaxInstances */ 2, + /* nOutBufSize */ 1024, + /* nInBufSize */ 1024, + /* nDefaultWait */ NMPWAIT_USE_DEFAULT_WAIT, + /* lpSecurityAttrib */ NULL); + ok(hnp != INVALID_HANDLE_VALUE, "CreateNamedPipe failed\n"); + + hnp2 = CreateNamedPipe(PIPENAME, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_WAIT, + /* nMaxInstances */ 2, + /* nOutBufSize */ 1024, + /* nInBufSize */ 1024, + /* nDefaultWait */ NMPWAIT_USE_DEFAULT_WAIT, + /* lpSecurityAttrib */ NULL); + ok(hnp2 != INVALID_HANDLE_VALUE, "CreateNamedPipe failed\n"); + + ok(CloseHandle(hnp), "CloseHandle\n"); + ok(CloseHandle(hnp2), "CloseHandle\n"); + + /* Check nMaxInstances */ + hnp = CreateNamedPipe(PIPENAME, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_WAIT, + /* nMaxInstances */ 1, + /* nOutBufSize */ 1024, + /* nInBufSize */ 1024, + /* nDefaultWait */ NMPWAIT_USE_DEFAULT_WAIT, + /* lpSecurityAttrib */ NULL); + ok(hnp != INVALID_HANDLE_VALUE, "CreateNamedPipe failed\n"); + + hnp2 = CreateNamedPipe(PIPENAME, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_WAIT, + /* nMaxInstances */ 1, + /* nOutBufSize */ 1024, + /* nInBufSize */ 1024, + /* nDefaultWait */ NMPWAIT_USE_DEFAULT_WAIT, + /* lpSecurityAttrib */ NULL); + ok(hnp2 == INVALID_HANDLE_VALUE + && GetLastError() == ERROR_PIPE_BUSY, "nMaxInstances not obeyed\n"); + + ok(CloseHandle(hnp), "CloseHandle\n"); + + /* Check PIPE_ACCESS_* */ + hnp = CreateNamedPipe(PIPENAME, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_WAIT, + /* nMaxInstances */ 2, + /* nOutBufSize */ 1024, + /* nInBufSize */ 1024, + /* nDefaultWait */ NMPWAIT_USE_DEFAULT_WAIT, + /* lpSecurityAttrib */ NULL); + ok(hnp != INVALID_HANDLE_VALUE, "CreateNamedPipe failed\n"); + + hnp2 = CreateNamedPipe(PIPENAME, PIPE_ACCESS_INBOUND, PIPE_TYPE_BYTE | PIPE_WAIT, + /* nMaxInstances */ 1, + /* nOutBufSize */ 1024, + /* nInBufSize */ 1024, + /* nDefaultWait */ NMPWAIT_USE_DEFAULT_WAIT, + /* lpSecurityAttrib */ NULL); + ok(hnp2 == INVALID_HANDLE_VALUE + && GetLastError() == ERROR_ACCESS_DENIED, "PIPE_ACCESS_* mismatch allowed\n"); + + ok(CloseHandle(hnp), "CloseHandle\n"); + + /* etc, etc */ +} + +/** implementation of alarm() */ +static DWORD CALLBACK alarmThreadMain(LPVOID arg) +{ + DWORD timeout = (DWORD) arg; + trace("alarmThreadMain\n"); + Sleep(timeout); + ok(FALSE, "alarm\n"); + ExitProcess(1); + return 1; +} + +HANDLE hnp = INVALID_HANDLE_VALUE; + +/** Trivial byte echo server - disconnects after each session */ +static DWORD CALLBACK serverThreadMain1(LPVOID arg) +{ + int i; + + trace("serverThreadMain1 start\n"); + /* Set up a simple echo server */ + hnp = CreateNamedPipe(PIPENAME "serverThreadMain1", PIPE_ACCESS_DUPLEX, + PIPE_TYPE_BYTE | PIPE_WAIT, + /* nMaxInstances */ 1, + /* nOutBufSize */ 1024, + /* nInBufSize */ 1024, + /* nDefaultWait */ NMPWAIT_USE_DEFAULT_WAIT, + /* lpSecurityAttrib */ NULL); + + ok(hnp != INVALID_HANDLE_VALUE, "CreateNamedPipe failed\n"); + for (i = 0; ; i++) { + char buf[512]; + DWORD written; + DWORD readden; + DWORD success; + + /* Wait for client to connect */ + trace("Server calling ConnectNamedPipe...\n"); + ok(ConnectNamedPipe(hnp, NULL) + || GetLastError() == ERROR_PIPE_CONNECTED, "ConnectNamedPipe\n"); + trace("ConnectNamedPipe returned.\n"); + + /* Echo bytes once */ + memset(buf, 0, sizeof(buf)); + + trace("Server reading...\n"); + success = ReadFile(hnp, buf, sizeof(buf), &readden, NULL); + trace("Server done reading.\n"); + ok(success, "ReadFile\n"); + ok(readden, "short read\n"); + + trace("Server writing...\n"); + ok(WriteFile(hnp, buf, readden, &written, NULL), "WriteFile\n"); + trace("Server done writing.\n"); + ok(written == readden, "write file len\n"); + + /* finish this connection, wait for next one */ + ok(FlushFileBuffers(hnp), "FlushFileBuffers\n"); + trace("Server done flushing.\n"); + ok(DisconnectNamedPipe(hnp), "DisconnectNamedPipe\n"); + trace("Server done disconnecting.\n"); + } +} + +/** Trivial byte echo server - closes after each connection */ +static DWORD CALLBACK serverThreadMain2(LPVOID arg) +{ + int i; + HANDLE hnpNext = 0; + + trace("serverThreadMain2\n"); + /* Set up a simple echo server */ + hnp = CreateNamedPipe(PIPENAME "serverThreadMain2", PIPE_ACCESS_DUPLEX, + PIPE_TYPE_BYTE | PIPE_WAIT, + /* nMaxInstances */ 2, + /* nOutBufSize */ 1024, + /* nInBufSize */ 1024, + /* nDefaultWait */ NMPWAIT_USE_DEFAULT_WAIT, + /* lpSecurityAttrib */ NULL); + ok(hnp != INVALID_HANDLE_VALUE, "CreateNamedPipe failed\n"); + + for (i = 0; ; i++) { + char buf[512]; + DWORD written; + DWORD readden; + DWORD success; + + /* Wait for client to connect */ + trace("Server calling ConnectNamedPipe...\n"); + ok(ConnectNamedPipe(hnp, NULL) + || GetLastError() == ERROR_PIPE_CONNECTED, "ConnectNamedPipe\n"); + trace("ConnectNamedPipe returned.\n"); + + /* Echo bytes once */ + memset(buf, 0, sizeof(buf)); + + trace("Server reading...\n"); + success = ReadFile(hnp, buf, sizeof(buf), &readden, NULL); + trace("Server done reading.\n"); + ok(success, "ReadFile\n"); + + trace("Server writing...\n"); + ok(WriteFile(hnp, buf, readden, &written, NULL), "WriteFile\n"); + trace("Server done writing.\n"); + ok(written == readden, "write file len\n"); + + /* finish this connection, wait for next one */ + ok(FlushFileBuffers(hnp), "FlushFileBuffers\n"); + ok(DisconnectNamedPipe(hnp), "DisconnectNamedPipe\n"); + + /* Set up next echo server */ + hnpNext = + CreateNamedPipe(PIPENAME "serverThreadMain2", PIPE_ACCESS_DUPLEX, + PIPE_TYPE_BYTE | PIPE_WAIT, + /* nMaxInstances */ 2, + /* nOutBufSize */ 1024, + /* nInBufSize */ 1024, + /* nDefaultWait */ NMPWAIT_USE_DEFAULT_WAIT, + /* lpSecurityAttrib */ NULL); + + ok(hnpNext != INVALID_HANDLE_VALUE, "CreateNamedPipe failed\n"); + + ok(CloseHandle(hnp), "CloseHandle\n"); + hnp = hnpNext; + } +} + +/** Trivial byte echo server - uses overlapped named pipe calls */ +static DWORD CALLBACK serverThreadMain3(LPVOID arg) +{ + int i; + HANDLE hEvent; + + trace("serverThreadMain3\n"); + /* Set up a simple echo server */ + hnp = CreateNamedPipe(PIPENAME "serverThreadMain3", PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, + PIPE_TYPE_BYTE | PIPE_WAIT, + /* nMaxInstances */ 1, + /* nOutBufSize */ 1024, + /* nInBufSize */ 1024, + /* nDefaultWait */ NMPWAIT_USE_DEFAULT_WAIT, + /* lpSecurityAttrib */ NULL); + ok(hnp != INVALID_HANDLE_VALUE, "CreateNamedPipe failed\n"); + + hEvent = CreateEvent(NULL, /* security attribute */ + TRUE, /* manual reset event */ + FALSE, /* initial state */ + NULL); /* name */ + ok(hEvent != NULL, "CreateEvent\n"); + + for (i = 0; ; i++) { + char buf[512]; + DWORD written; + DWORD readden; + DWORD dummy; + DWORD success; + OVERLAPPED oOverlap; + int letWFSOEwait = (i & 2); + int letGORwait = (i & 1); + DWORD err; + + memset(&oOverlap, 0, sizeof(oOverlap)); + oOverlap.hEvent = hEvent; + + /* Wait for client to connect */ + trace("Server calling overlapped ConnectNamedPipe...\n"); + success = ConnectNamedPipe(hnp, &oOverlap); + err = GetLastError(); + ok(success || err == ERROR_IO_PENDING + || err == ERROR_PIPE_CONNECTED, "overlapped ConnectNamedPipe\n"); + trace("overlapped ConnectNamedPipe returned.\n"); + if (!success && (err == ERROR_IO_PENDING) && letWFSOEwait) + ok(WaitForSingleObjectEx(hEvent, INFINITE, TRUE) == 0, "wait ConnectNamedPipe\n"); + success = GetOverlappedResult(hnp, &oOverlap, &dummy, letGORwait); + if (!letGORwait && !letWFSOEwait && !success) { + ok(GetLastError() == ERROR_IO_INCOMPLETE, "GetOverlappedResult\n"); + success = GetOverlappedResult(hnp, &oOverlap, &dummy, TRUE); + } + ok(success, "GetOverlappedResult ConnectNamedPipe\n"); + trace("overlapped ConnectNamedPipe operation complete.\n"); + + /* Echo bytes once */ + memset(buf, 0, sizeof(buf)); + + trace("Server reading...\n"); + success = ReadFile(hnp, buf, sizeof(buf), NULL, &oOverlap); + trace("Server ReadFile returned...\n"); + err = GetLastError(); + ok(success || err == ERROR_IO_PENDING, "overlapped ReadFile\n"); + trace("overlapped ReadFile returned.\n"); + if (!success && (err == ERROR_IO_PENDING) && letWFSOEwait) + ok(WaitForSingleObjectEx(hEvent, INFINITE, TRUE) == 0, "wait ReadFile\n"); + success = GetOverlappedResult(hnp, &oOverlap, &readden, letGORwait); + if (!letGORwait && !letWFSOEwait && !success) { + ok(GetLastError() == ERROR_IO_INCOMPLETE, "GetOverlappedResult\n"); + success = GetOverlappedResult(hnp, &oOverlap, &readden, TRUE); + } + trace("Server done reading.\n"); + ok(success, "overlapped ReadFile\n"); + + trace("Server writing...\n"); + success = WriteFile(hnp, buf, readden, NULL, &oOverlap); + trace("Server WriteFile returned...\n"); + err = GetLastError(); + ok(success || err == ERROR_IO_PENDING, "overlapped WriteFile\n"); + trace("overlapped WriteFile returned.\n"); + if (!success && (err == ERROR_IO_PENDING) && letWFSOEwait) + ok(WaitForSingleObjectEx(hEvent, INFINITE, TRUE) == 0, "wait WriteFile\n"); + success = GetOverlappedResult(hnp, &oOverlap, &written, letGORwait); + if (!letGORwait && !letWFSOEwait && !success) { + ok(GetLastError() == ERROR_IO_INCOMPLETE, "GetOverlappedResult\n"); + success = GetOverlappedResult(hnp, &oOverlap, &written, TRUE); + } + trace("Server done writing.\n"); + ok(success, "overlapped WriteFile\n"); + ok(written == readden, "write file len\n"); + + /* finish this connection, wait for next one */ + ok(FlushFileBuffers(hnp), "FlushFileBuffers\n"); + ok(DisconnectNamedPipe(hnp), "DisconnectNamedPipe\n"); + } +} + +static void exercizeServer(const char *pipename, HANDLE serverThread) +{ + int i; + + trace("exercizeServer starting\n"); + for (i = 0; i < 8; i++) { + HANDLE hFile=INVALID_HANDLE_VALUE; + const char obuf[] = "Bit Bucket"; + char ibuf[32]; + DWORD written; + DWORD readden; + int loop; + + for (loop = 0; loop < 3; loop++) { + DWORD err; + trace("Client connecting...\n"); + /* Connect to the server */ + hFile = CreateFileA(pipename, GENERIC_READ | GENERIC_WRITE, 0, + NULL, OPEN_EXISTING, 0, 0); + if (hFile != INVALID_HANDLE_VALUE) + break; + err = GetLastError(); + if (loop == 0) + ok(err == ERROR_PIPE_BUSY || err == ERROR_FILE_NOT_FOUND, "connecting to pipe\n"); + else + ok(err == ERROR_PIPE_BUSY, "connecting to pipe\n"); + trace("connect failed, retrying\n"); + Sleep(200); + } + ok(hFile != INVALID_HANDLE_VALUE, "client opening named pipe\n"); + + /* Make sure it can echo */ + memset(ibuf, 0, sizeof(ibuf)); + trace("Client writing...\n"); + ok(WriteFile(hFile, obuf, sizeof(obuf), &written, NULL), "WriteFile to client end of pipe\n"); + ok(written == sizeof(obuf), "write file len\n"); + trace("Client reading...\n"); + ok(ReadFile(hFile, ibuf, sizeof(obuf), &readden, NULL), "ReadFile from client end of pipe\n"); + ok(readden == sizeof(obuf), "read file len\n"); + ok(memcmp(obuf, ibuf, written) == 0, "content check\n"); + + trace("Client closing...\n"); + ok(CloseHandle(hFile), "CloseHandle\n"); + } + + ok(TerminateThread(serverThread, 0), "TerminateThread\n"); + CloseHandle(hnp); + trace("exercizeServer returning\n"); +} + +void test_NamedPipe_2(void) +{ + HANDLE serverThread; + DWORD serverThreadId; + HANDLE alarmThread; + DWORD alarmThreadId; + + trace("test_NamedPipe_2 starting\n"); + /* Set up a ten second timeout */ + alarmThread = CreateThread(NULL, 0, alarmThreadMain, (void *) 10000, 0, &alarmThreadId); + + /* The servers we're about to exercize do try to clean up carefully, + * but to reduce the change of a test failure due to a pipe handle + * leak in the test code, we'll use a different pipe name for each server. + */ + + /* Try server #1 */ + serverThread = CreateThread(NULL, 0, serverThreadMain1, 0, 0, &serverThreadId); + ok(serverThread != INVALID_HANDLE_VALUE, "CreateThread\n"); + exercizeServer(PIPENAME "serverThreadMain1", serverThread); + + /* Try server #2 */ + serverThread = CreateThread(NULL, 0, serverThreadMain2, 0, 0, &serverThreadId); + ok(serverThread != INVALID_HANDLE_VALUE, "CreateThread\n"); + exercizeServer(PIPENAME "serverThreadMain2", serverThread); + + if( 0 ) /* overlapped pipe server doesn't work yet - it randomly fails */ + { + /* Try server #3 */ + serverThread = CreateThread(NULL, 0, serverThreadMain3, 0, 0, &serverThreadId); + ok(serverThread != INVALID_HANDLE_VALUE, "CreateThread\n"); + exercizeServer(PIPENAME "serverThreadMain3", serverThread); + } + + ok(TerminateThread(alarmThread, 0), "TerminateThread\n"); + trace("test_NamedPipe_2 returning\n"); +} + +void test_DisconnectNamedPipe(void) +{ + HANDLE hnp; + HANDLE hFile; + const char obuf[] = "Bit Bucket"; + char ibuf[32]; + DWORD written; + DWORD readden; + + hnp = CreateNamedPipe(PIPENAME, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_WAIT, + /* nMaxInstances */ 1, + /* nOutBufSize */ 1024, + /* nInBufSize */ 1024, + /* nDefaultWait */ NMPWAIT_USE_DEFAULT_WAIT, + /* lpSecurityAttrib */ NULL); + ok(hnp != INVALID_HANDLE_VALUE, "CreateNamedPipe failed\n"); + + ok(WriteFile(hnp, obuf, sizeof(obuf), &written, NULL) == 0 + && GetLastError() == ERROR_PIPE_LISTENING, "WriteFile to not-yet-connected pipe\n"); + ok(ReadFile(hnp, ibuf, sizeof(ibuf), &readden, NULL) == 0 + && GetLastError() == ERROR_PIPE_LISTENING, "ReadFile from not-yet-connected pipe\n"); + + hFile = CreateFileA(PIPENAME, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0); + ok(hFile != INVALID_HANDLE_VALUE, "CreateFile failed\n"); + + /* don't try to do i/o if one side couldn't be opened, as it hangs */ + if (hFile != INVALID_HANDLE_VALUE) { + + /* see what happens if server calls DisconnectNamedPipe + * when there are bytes in the pipe + */ + + ok(WriteFile(hFile, obuf, sizeof(obuf), &written, NULL), "WriteFile\n"); + ok(written == sizeof(obuf), "write file len\n"); + ok(DisconnectNamedPipe(hnp), "DisconnectNamedPipe while messages waiting\n"); + ok(WriteFile(hFile, obuf, sizeof(obuf), &written, NULL) == 0 + && GetLastError() == ERROR_PIPE_NOT_CONNECTED, "WriteFile to disconnected pipe\n"); + ok(ReadFile(hnp, ibuf, sizeof(ibuf), &readden, NULL) == 0 + && GetLastError() == ERROR_PIPE_NOT_CONNECTED, + "ReadFile from disconnected pipe with bytes waiting\n"); + ok(CloseHandle(hFile), "CloseHandle\n"); + } + + ok(CloseHandle(hnp), "CloseHandle\n"); + +} + +START_TEST(pipe) +{ + trace("test 1 of 4:\n"); + test_DisconnectNamedPipe(); + trace("test 2 of 4:\n"); + test_CreateNamedPipe_instances_must_match(); + trace("test 3 of 4:\n"); + test_NamedPipe_2(); + trace("test 4 of 4:\n"); + test_CreateNamedPipe(); + trace("all tests done\n"); +} diff --git a/reactos/apps/tests/kernel32/process.c b/reactos/apps/tests/kernel32/process.c new file mode 100644 index 00000000000..0d745c89e2a --- /dev/null +++ b/reactos/apps/tests/kernel32/process.c @@ -0,0 +1,1202 @@ +/* + * Unit test suite for CreateProcess function. + * + * Copyright 2002 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 + */ + +#include +#include +#include +#include + +#include "wine/test.h" +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "wincon.h" +#include "winnls.h" + +static char base[MAX_PATH]; +static char selfname[MAX_PATH]; +static char resfile[MAX_PATH]; + +static int myARGC; +static char** myARGV; + +/* As some environment variables get very long on Unix, we only test for + * the first 127 bytes. + * Note that increasing this value past 256 may exceed the buffer size + * limitations of the *Profile functions (at least on Wine). + */ +#define MAX_LISTED_ENV_VAR 128 + +/* ---------------- portable memory allocation thingie */ + +static char memory[1024*32]; +static char* memory_index = memory; + +static char* grab_memory(size_t len) +{ + char* ret = memory_index; + /* align on dword */ + len = (len + 3) & ~3; + memory_index += len; + assert(memory_index <= memory + sizeof(memory)); + return ret; +} + +static void release_memory(void) +{ + memory_index = memory; +} + +/* ---------------- simplistic tool to encode/decode strings (to hide \ " ' and such) */ + +static const char* encodeA(const char* str) +{ + char* ptr; + size_t len,i; + + if (!str) return ""; + len = strlen(str) + 1; + ptr = grab_memory(len * 2 + 1); + for (i = 0; i < len; i++) + sprintf(&ptr[i * 2], "%02x", (unsigned char)str[i]); + ptr[2 * len] = '\0'; + return ptr; +} + +static const char* encodeW(const WCHAR* str) +{ + char* ptr; + size_t len,i; + + if (!str) return ""; + len = lstrlenW(str) + 1; + ptr = grab_memory(len * 4 + 1); + assert(ptr); + for (i = 0; i < len; i++) + sprintf(&ptr[i * 4], "%04x", (unsigned int)(unsigned short)str[i]); + ptr[4 * len] = '\0'; + return ptr; +} + +static unsigned decode_char(char c) +{ + if (c >= '0' && c <= '9') return c - '0'; + if (c >= 'a' && c <= 'f') return c - 'a' + 10; + assert(c >= 'A' && c <= 'F'); + return c - 'A' + 10; +} + +static char* decodeA(const char* str) +{ + char* ptr; + size_t len,i; + + len = strlen(str) / 2; + if (!len--) return NULL; + ptr = grab_memory(len + 1); + for (i = 0; i < len; i++) + ptr[i] = (decode_char(str[2 * i]) << 4) | decode_char(str[2 * i + 1]); + ptr[len] = '\0'; + return ptr; +} + +#if 0 +/* This will be needed to decode Unicode strings saved by the child process + * when we test Unicode functions. + */ +static WCHAR* decodeW(const char* str) +{ + size_t len; + WCHAR* ptr; + int i; + + len = strlen(str) / 4; + if (!len--) return NULL; + ptr = (WCHAR*)grab_memory(len * 2 + 1); + for (i = 0; i < len; i++) + ptr[i] = (decode_char(str[4 * i]) << 12) | + (decode_char(str[4 * i + 1]) << 8) | + (decode_char(str[4 * i + 2]) << 4) | + (decode_char(str[4 * i + 3]) << 0); + ptr[len] = '\0'; + return ptr; +} +#endif + +/****************************************************************** + * init + * + * generates basic information like: + * base: absolute path to curr dir + * selfname: the way to reinvoke ourselves + */ +static int init(void) +{ + myARGC = winetest_get_mainargs( &myARGV ); + if (!GetCurrentDirectoryA(sizeof(base), base)) return 0; + strcpy(selfname, myARGV[0]); + return 1; +} + +/****************************************************************** + * get_file_name + * + * generates an absolute file_name for temporary file + * + */ +static void get_file_name(char* buf) +{ + char path[MAX_PATH]; + + buf[0] = '\0'; + GetTempPathA(sizeof(path), path); + GetTempFileNameA(path, "wt", 0, buf); +} + +/****************************************************************** + * static void childPrintf + * + */ +static void childPrintf(HANDLE h, const char* fmt, ...) +{ + va_list valist; + char buffer[1024+4*MAX_LISTED_ENV_VAR]; + DWORD w; + + va_start(valist, fmt); + vsprintf(buffer, fmt, valist); + va_end(valist); + WriteFile(h, buffer, strlen(buffer), &w, NULL); +} + + +/****************************************************************** + * doChild + * + * output most of the information in the child process + */ +static void doChild(const char* file, const char* option) +{ + STARTUPINFOA siA; + STARTUPINFOW siW; + int i; + char* ptrA; + WCHAR* ptrW; + char bufA[MAX_PATH]; + WCHAR bufW[MAX_PATH]; + HANDLE hFile = CreateFileA(file, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); + + if (hFile == INVALID_HANDLE_VALUE) return; + + /* output of startup info (Ansi) */ + GetStartupInfoA(&siA); + childPrintf(hFile, + "[StartupInfoA]\ncb=%08ld\nlpDesktop=%s\nlpTitle=%s\n" + "dwX=%lu\ndwY=%lu\ndwXSize=%lu\ndwYSize=%lu\n" + "dwXCountChars=%lu\ndwYCountChars=%lu\ndwFillAttribute=%lu\n" + "dwFlags=%lu\nwShowWindow=%u\n" + "hStdInput=%lu\nhStdOutput=%lu\nhStdError=%lu\n\n", + siA.cb, encodeA(siA.lpDesktop), encodeA(siA.lpTitle), + siA.dwX, siA.dwY, siA.dwXSize, siA.dwYSize, + siA.dwXCountChars, siA.dwYCountChars, siA.dwFillAttribute, + siA.dwFlags, siA.wShowWindow, + (DWORD)siA.hStdInput, (DWORD)siA.hStdOutput, (DWORD)siA.hStdError); + + /* since GetStartupInfoW is only implemented in win2k, + * zero out before calling so we can notice the difference + */ + memset(&siW, 0, sizeof(siW)); + GetStartupInfoW(&siW); + childPrintf(hFile, + "[StartupInfoW]\ncb=%08ld\nlpDesktop=%s\nlpTitle=%s\n" + "dwX=%lu\ndwY=%lu\ndwXSize=%lu\ndwYSize=%lu\n" + "dwXCountChars=%lu\ndwYCountChars=%lu\ndwFillAttribute=%lu\n" + "dwFlags=%lu\nwShowWindow=%u\n" + "hStdInput=%lu\nhStdOutput=%lu\nhStdError=%lu\n\n", + siW.cb, encodeW(siW.lpDesktop), encodeW(siW.lpTitle), + siW.dwX, siW.dwY, siW.dwXSize, siW.dwYSize, + siW.dwXCountChars, siW.dwYCountChars, siW.dwFillAttribute, + siW.dwFlags, siW.wShowWindow, + (DWORD)siW.hStdInput, (DWORD)siW.hStdOutput, (DWORD)siW.hStdError); + + /* Arguments */ + childPrintf(hFile, "[Arguments]\nargcA=%d\n", myARGC); + for (i = 0; i < myARGC; i++) + { + childPrintf(hFile, "argvA%d=%s\n", i, encodeA(myARGV[i])); + } + childPrintf(hFile, "CommandLineA=%s\n", encodeA(GetCommandLineA())); + +#if 0 + int argcW; + WCHAR** argvW; + + /* this is part of shell32... and should be tested there */ + argvW = CommandLineToArgvW(GetCommandLineW(), &argcW); + for (i = 0; i < argcW; i++) + { + childPrintf(hFile, "argvW%d=%s\n", i, encodeW(argvW[i])); + } +#endif + childPrintf(hFile, "CommandLineW=%s\n\n", encodeW(GetCommandLineW())); + + /* output of environment (Ansi) */ + ptrA = GetEnvironmentStringsA(); + if (ptrA) + { + char env_var[MAX_LISTED_ENV_VAR]; + + childPrintf(hFile, "[EnvironmentA]\n"); + i = 0; + while (*ptrA) + { + strncpy(env_var, ptrA, MAX_LISTED_ENV_VAR - 1); + env_var[MAX_LISTED_ENV_VAR - 1] = '\0'; + childPrintf(hFile, "env%d=%s\n", i, encodeA(env_var)); + i++; + ptrA += strlen(ptrA) + 1; + } + childPrintf(hFile, "len=%d\n\n", i); + } + + /* output of environment (Unicode) */ + ptrW = GetEnvironmentStringsW(); + if (ptrW) + { + WCHAR env_var[MAX_LISTED_ENV_VAR]; + + childPrintf(hFile, "[EnvironmentW]\n"); + i = 0; + while (*ptrW) + { + lstrcpynW(env_var, ptrW, MAX_LISTED_ENV_VAR - 1); + env_var[MAX_LISTED_ENV_VAR - 1] = '\0'; + childPrintf(hFile, "env%d=%s\n", i, encodeW(env_var)); + i++; + ptrW += lstrlenW(ptrW) + 1; + } + childPrintf(hFile, "len=%d\n\n", i); + } + + childPrintf(hFile, "[Misc]\n"); + if (GetCurrentDirectoryA(sizeof(bufA), bufA)) + childPrintf(hFile, "CurrDirA=%s\n", encodeA(bufA)); + if (GetCurrentDirectoryW(sizeof(bufW) / sizeof(bufW[0]), bufW)) + childPrintf(hFile, "CurrDirW=%s\n", encodeW(bufW)); + childPrintf(hFile, "\n"); + + if (option && strcmp(option, "console") == 0) + { + CONSOLE_SCREEN_BUFFER_INFO sbi; + HANDLE hConIn = GetStdHandle(STD_INPUT_HANDLE); + HANDLE hConOut = GetStdHandle(STD_OUTPUT_HANDLE); + DWORD modeIn, modeOut; + + childPrintf(hFile, "[Console]\n"); + if (GetConsoleScreenBufferInfo(hConOut, &sbi)) + { + childPrintf(hFile, "SizeX=%d\nSizeY=%d\nCursorX=%d\nCursorY=%d\nAttributes=%d\n", + sbi.dwSize.X, sbi.dwSize.Y, sbi.dwCursorPosition.X, sbi.dwCursorPosition.Y, sbi.wAttributes); + childPrintf(hFile, "winLeft=%d\nwinTop=%d\nwinRight=%d\nwinBottom=%d\n", + sbi.srWindow.Left, sbi.srWindow.Top, sbi.srWindow.Right, sbi.srWindow.Bottom); + childPrintf(hFile, "maxWinWidth=%d\nmaxWinHeight=%d\n", + sbi.dwMaximumWindowSize.X, sbi.dwMaximumWindowSize.Y); + } + childPrintf(hFile, "InputCP=%d\nOutputCP=%d\n", + GetConsoleCP(), GetConsoleOutputCP()); + if (GetConsoleMode(hConIn, &modeIn)) + childPrintf(hFile, "InputMode=%ld\n", modeIn); + if (GetConsoleMode(hConOut, &modeOut)) + childPrintf(hFile, "OutputMode=%ld\n", modeOut); + + /* now that we have written all relevant information, let's change it */ + ok(SetConsoleCP(1252), "Setting CP\n"); + ok(SetConsoleOutputCP(1252), "Setting SB CP\n"); + ok(SetConsoleMode(hConIn, modeIn ^ 1), "Setting mode (%ld)\n", GetLastError()); + ok(SetConsoleMode(hConOut, modeOut ^ 1), "Setting mode (%ld)\n", GetLastError()); + sbi.dwCursorPosition.X ^= 1; + sbi.dwCursorPosition.Y ^= 1; + ok(SetConsoleCursorPosition(hConOut, sbi.dwCursorPosition), "Setting cursor position (%ld)\n", GetLastError()); + } + if (option && strcmp(option, "stdhandle") == 0) + { + HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE); + HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); + + if (hStdIn != INVALID_HANDLE_VALUE || hStdOut != INVALID_HANDLE_VALUE) + { + char buf[1024]; + DWORD r, w; + + ok(ReadFile(hStdIn, buf, sizeof(buf), &r, NULL) && r > 0, "Reading message from input pipe\n"); + childPrintf(hFile, "[StdHandle]\nmsg=%s\n\n", encodeA(buf)); + ok(WriteFile(hStdOut, buf, r, &w, NULL) && w == r, "Writing message to output pipe\n"); + } + } + + if (option && strcmp(option, "exit_code") == 0) + { + childPrintf(hFile, "[ExitCode]\nvalue=%d\n\n", 123); + CloseHandle(hFile); + ExitProcess(123); + } + + CloseHandle(hFile); +} + +static char* getChildString(const char* sect, const char* key) +{ + char buf[1024+4*MAX_LISTED_ENV_VAR]; + char* ret; + + GetPrivateProfileStringA(sect, key, "-", buf, sizeof(buf), resfile); + if (buf[0] == '\0' || (buf[0] == '-' && buf[1] == '\0')) return NULL; + assert(!(strlen(buf) & 1)); + ret = decodeA(buf); + return ret; +} + +/* FIXME: this may be moved to the wtmain.c file, because it may be needed by + * others... (windows uses stricmp while Un*x uses strcasecmp...) + */ +static int wtstrcasecmp(const char* p1, const char* p2) +{ + char c1, c2; + + c1 = c2 = '@'; + while (c1 == c2 && c1) + { + c1 = *p1++; c2 = *p2++; + if (c1 != c2) + { + c1 = toupper(c1); c2 = toupper(c2); + } + } + return c1 - c2; +} + +static int strCmp(const char* s1, const char* s2, BOOL sensitive) +{ + if (!s1 && !s2) return 0; + if (!s2) return -1; + if (!s1) return 1; + return (sensitive) ? strcmp(s1, s2) : wtstrcasecmp(s1, s2); +} + +#define okChildString(sect, key, expect) \ + do { \ + char* result = getChildString((sect), (key)); \ + ok(strCmp(result, expect, 1) == 0, "%s:%s expected '%s', got '%s'\n", (sect), (key), (expect)?(expect):"(null)", result); \ + } while (0) + +#define okChildIString(sect, key, expect) \ + do { \ + char* result = getChildString(sect, key); \ + ok(strCmp(result, expect, 0) == 0, "%s:%s expected '%s', got '%s'\n", sect, key, expect, result); \ + } while (0) + +/* using !expect insures that the test will fail if the sect/key isn't present + * in result file + */ +#define okChildInt(sect, key, expect) \ + do { \ + UINT result = GetPrivateProfileIntA((sect), (key), !(expect), resfile); \ + ok(result == expect, "%s:%s expected %d, but got %d\n", (sect), (key), (int)(expect), result); \ + } while (0) + +static void test_Startup(void) +{ + char buffer[MAX_PATH]; + PROCESS_INFORMATION info; + STARTUPINFOA startup,si; + + /* let's start simplistic */ + memset(&startup, 0, sizeof(startup)); + startup.cb = sizeof(startup); + startup.dwFlags = STARTF_USESHOWWINDOW; + startup.wShowWindow = SW_SHOWNORMAL; + + get_file_name(resfile); + sprintf(buffer, "%s tests/process.c %s", selfname, resfile); + ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess\n"); + /* wait for child to terminate */ + ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); + /* child process has changed result file, so let profile functions know about it */ + WritePrivateProfileStringA(NULL, NULL, NULL, resfile); + + GetStartupInfoA(&si); + okChildInt("StartupInfoA", "cb", startup.cb); + okChildString("StartupInfoA", "lpDesktop", si.lpDesktop); + okChildString("StartupInfoA", "lpTitle", si.lpTitle); + okChildInt("StartupInfoA", "dwX", startup.dwX); + okChildInt("StartupInfoA", "dwY", startup.dwY); + okChildInt("StartupInfoA", "dwXSize", startup.dwXSize); + okChildInt("StartupInfoA", "dwYSize", startup.dwYSize); + okChildInt("StartupInfoA", "dwXCountChars", startup.dwXCountChars); + okChildInt("StartupInfoA", "dwYCountChars", startup.dwYCountChars); + okChildInt("StartupInfoA", "dwFillAttribute", startup.dwFillAttribute); + okChildInt("StartupInfoA", "dwFlags", startup.dwFlags); + okChildInt("StartupInfoA", "wShowWindow", startup.wShowWindow); + release_memory(); + assert(DeleteFileA(resfile) != 0); + + /* not so simplistic now */ + memset(&startup, 0, sizeof(startup)); + startup.cb = sizeof(startup); + startup.dwFlags = STARTF_USESHOWWINDOW; + startup.wShowWindow = SW_SHOWNORMAL; + startup.lpTitle = "I'm the title string"; + startup.lpDesktop = "I'm the desktop string"; + startup.dwXCountChars = 0x12121212; + startup.dwYCountChars = 0x23232323; + startup.dwX = 0x34343434; + startup.dwY = 0x45454545; + startup.dwXSize = 0x56565656; + startup.dwYSize = 0x67676767; + startup.dwFillAttribute = 0xA55A; + + get_file_name(resfile); + sprintf(buffer, "%s tests/process.c %s", selfname, resfile); + ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess\n"); + /* wait for child to terminate */ + ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); + /* child process has changed result file, so let profile functions know about it */ + WritePrivateProfileStringA(NULL, NULL, NULL, resfile); + + okChildInt("StartupInfoA", "cb", startup.cb); + okChildString("StartupInfoA", "lpDesktop", startup.lpDesktop); + okChildString("StartupInfoA", "lpTitle", startup.lpTitle); + okChildInt("StartupInfoA", "dwX", startup.dwX); + okChildInt("StartupInfoA", "dwY", startup.dwY); + okChildInt("StartupInfoA", "dwXSize", startup.dwXSize); + okChildInt("StartupInfoA", "dwYSize", startup.dwYSize); + okChildInt("StartupInfoA", "dwXCountChars", startup.dwXCountChars); + okChildInt("StartupInfoA", "dwYCountChars", startup.dwYCountChars); + okChildInt("StartupInfoA", "dwFillAttribute", startup.dwFillAttribute); + okChildInt("StartupInfoA", "dwFlags", startup.dwFlags); + okChildInt("StartupInfoA", "wShowWindow", startup.wShowWindow); + release_memory(); + assert(DeleteFileA(resfile) != 0); + + /* not so simplistic now */ + memset(&startup, 0, sizeof(startup)); + startup.cb = sizeof(startup); + startup.dwFlags = STARTF_USESHOWWINDOW; + startup.wShowWindow = SW_SHOWNORMAL; + startup.lpTitle = "I'm the title string"; + startup.lpDesktop = NULL; + startup.dwXCountChars = 0x12121212; + startup.dwYCountChars = 0x23232323; + startup.dwX = 0x34343434; + startup.dwY = 0x45454545; + startup.dwXSize = 0x56565656; + startup.dwYSize = 0x67676767; + startup.dwFillAttribute = 0xA55A; + + get_file_name(resfile); + sprintf(buffer, "%s tests/process.c %s", selfname, resfile); + ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess\n"); + /* wait for child to terminate */ + ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); + /* child process has changed result file, so let profile functions know about it */ + WritePrivateProfileStringA(NULL, NULL, NULL, resfile); + + okChildInt("StartupInfoA", "cb", startup.cb); + okChildString("StartupInfoA", "lpDesktop", si.lpDesktop); + okChildString("StartupInfoA", "lpTitle", startup.lpTitle); + okChildInt("StartupInfoA", "dwX", startup.dwX); + okChildInt("StartupInfoA", "dwY", startup.dwY); + okChildInt("StartupInfoA", "dwXSize", startup.dwXSize); + okChildInt("StartupInfoA", "dwYSize", startup.dwYSize); + okChildInt("StartupInfoA", "dwXCountChars", startup.dwXCountChars); + okChildInt("StartupInfoA", "dwYCountChars", startup.dwYCountChars); + okChildInt("StartupInfoA", "dwFillAttribute", startup.dwFillAttribute); + okChildInt("StartupInfoA", "dwFlags", startup.dwFlags); + okChildInt("StartupInfoA", "wShowWindow", startup.wShowWindow); + release_memory(); + assert(DeleteFileA(resfile) != 0); + + /* not so simplistic now */ + memset(&startup, 0, sizeof(startup)); + startup.cb = sizeof(startup); + startup.dwFlags = STARTF_USESHOWWINDOW; + startup.wShowWindow = SW_SHOWNORMAL; + startup.lpTitle = "I'm the title string"; + startup.lpDesktop = ""; + startup.dwXCountChars = 0x12121212; + startup.dwYCountChars = 0x23232323; + startup.dwX = 0x34343434; + startup.dwY = 0x45454545; + startup.dwXSize = 0x56565656; + startup.dwYSize = 0x67676767; + startup.dwFillAttribute = 0xA55A; + + get_file_name(resfile); + sprintf(buffer, "%s tests/process.c %s", selfname, resfile); + ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess\n"); + /* wait for child to terminate */ + ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); + /* child process has changed result file, so let profile functions know about it */ + WritePrivateProfileStringA(NULL, NULL, NULL, resfile); + + okChildInt("StartupInfoA", "cb", startup.cb); + todo_wine okChildString("StartupInfoA", "lpDesktop", startup.lpDesktop); + okChildString("StartupInfoA", "lpTitle", startup.lpTitle); + okChildInt("StartupInfoA", "dwX", startup.dwX); + okChildInt("StartupInfoA", "dwY", startup.dwY); + okChildInt("StartupInfoA", "dwXSize", startup.dwXSize); + okChildInt("StartupInfoA", "dwYSize", startup.dwYSize); + okChildInt("StartupInfoA", "dwXCountChars", startup.dwXCountChars); + okChildInt("StartupInfoA", "dwYCountChars", startup.dwYCountChars); + okChildInt("StartupInfoA", "dwFillAttribute", startup.dwFillAttribute); + okChildInt("StartupInfoA", "dwFlags", startup.dwFlags); + okChildInt("StartupInfoA", "wShowWindow", startup.wShowWindow); + release_memory(); + assert(DeleteFileA(resfile) != 0); + + /* not so simplistic now */ + memset(&startup, 0, sizeof(startup)); + startup.cb = sizeof(startup); + startup.dwFlags = STARTF_USESHOWWINDOW; + startup.wShowWindow = SW_SHOWNORMAL; + startup.lpTitle = NULL; + startup.lpDesktop = "I'm the desktop string"; + startup.dwXCountChars = 0x12121212; + startup.dwYCountChars = 0x23232323; + startup.dwX = 0x34343434; + startup.dwY = 0x45454545; + startup.dwXSize = 0x56565656; + startup.dwYSize = 0x67676767; + startup.dwFillAttribute = 0xA55A; + + get_file_name(resfile); + sprintf(buffer, "%s tests/process.c %s", selfname, resfile); + ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess\n"); + /* wait for child to terminate */ + ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); + /* child process has changed result file, so let profile functions know about it */ + WritePrivateProfileStringA(NULL, NULL, NULL, resfile); + + okChildInt("StartupInfoA", "cb", startup.cb); + okChildString("StartupInfoA", "lpDesktop", startup.lpDesktop); + okChildString("StartupInfoA", "lpTitle", si.lpTitle); + okChildInt("StartupInfoA", "dwX", startup.dwX); + okChildInt("StartupInfoA", "dwY", startup.dwY); + okChildInt("StartupInfoA", "dwXSize", startup.dwXSize); + okChildInt("StartupInfoA", "dwYSize", startup.dwYSize); + okChildInt("StartupInfoA", "dwXCountChars", startup.dwXCountChars); + okChildInt("StartupInfoA", "dwYCountChars", startup.dwYCountChars); + okChildInt("StartupInfoA", "dwFillAttribute", startup.dwFillAttribute); + okChildInt("StartupInfoA", "dwFlags", startup.dwFlags); + okChildInt("StartupInfoA", "wShowWindow", startup.wShowWindow); + release_memory(); + assert(DeleteFileA(resfile) != 0); + + /* not so simplistic now */ + memset(&startup, 0, sizeof(startup)); + startup.cb = sizeof(startup); + startup.dwFlags = STARTF_USESHOWWINDOW; + startup.wShowWindow = SW_SHOWNORMAL; + startup.lpTitle = ""; + startup.lpDesktop = "I'm the desktop string"; + startup.dwXCountChars = 0x12121212; + startup.dwYCountChars = 0x23232323; + startup.dwX = 0x34343434; + startup.dwY = 0x45454545; + startup.dwXSize = 0x56565656; + startup.dwYSize = 0x67676767; + startup.dwFillAttribute = 0xA55A; + + get_file_name(resfile); + sprintf(buffer, "%s tests/process.c %s", selfname, resfile); + ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess\n"); + /* wait for child to terminate */ + ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); + /* child process has changed result file, so let profile functions know about it */ + WritePrivateProfileStringA(NULL, NULL, NULL, resfile); + + okChildInt("StartupInfoA", "cb", startup.cb); + okChildString("StartupInfoA", "lpDesktop", startup.lpDesktop); + todo_wine okChildString("StartupInfoA", "lpTitle", startup.lpTitle); + okChildInt("StartupInfoA", "dwX", startup.dwX); + okChildInt("StartupInfoA", "dwY", startup.dwY); + okChildInt("StartupInfoA", "dwXSize", startup.dwXSize); + okChildInt("StartupInfoA", "dwYSize", startup.dwYSize); + okChildInt("StartupInfoA", "dwXCountChars", startup.dwXCountChars); + okChildInt("StartupInfoA", "dwYCountChars", startup.dwYCountChars); + okChildInt("StartupInfoA", "dwFillAttribute", startup.dwFillAttribute); + okChildInt("StartupInfoA", "dwFlags", startup.dwFlags); + okChildInt("StartupInfoA", "wShowWindow", startup.wShowWindow); + release_memory(); + assert(DeleteFileA(resfile) != 0); + + /* not so simplistic now */ + memset(&startup, 0, sizeof(startup)); + startup.cb = sizeof(startup); + startup.dwFlags = STARTF_USESHOWWINDOW; + startup.wShowWindow = SW_SHOWNORMAL; + startup.lpTitle = ""; + startup.lpDesktop = ""; + startup.dwXCountChars = 0x12121212; + startup.dwYCountChars = 0x23232323; + startup.dwX = 0x34343434; + startup.dwY = 0x45454545; + startup.dwXSize = 0x56565656; + startup.dwYSize = 0x67676767; + startup.dwFillAttribute = 0xA55A; + + get_file_name(resfile); + sprintf(buffer, "%s tests/process.c %s", selfname, resfile); + ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess\n"); + /* wait for child to terminate */ + ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); + /* child process has changed result file, so let profile functions know about it */ + WritePrivateProfileStringA(NULL, NULL, NULL, resfile); + + okChildInt("StartupInfoA", "cb", startup.cb); + todo_wine okChildString("StartupInfoA", "lpDesktop", startup.lpDesktop); + todo_wine okChildString("StartupInfoA", "lpTitle", startup.lpTitle); + okChildInt("StartupInfoA", "dwX", startup.dwX); + okChildInt("StartupInfoA", "dwY", startup.dwY); + okChildInt("StartupInfoA", "dwXSize", startup.dwXSize); + okChildInt("StartupInfoA", "dwYSize", startup.dwYSize); + okChildInt("StartupInfoA", "dwXCountChars", startup.dwXCountChars); + okChildInt("StartupInfoA", "dwYCountChars", startup.dwYCountChars); + okChildInt("StartupInfoA", "dwFillAttribute", startup.dwFillAttribute); + okChildInt("StartupInfoA", "dwFlags", startup.dwFlags); + okChildInt("StartupInfoA", "wShowWindow", startup.wShowWindow); + release_memory(); + assert(DeleteFileA(resfile) != 0); + + /* TODO: test for A/W and W/A and W/W */ +} + +static void test_CommandLine(void) +{ + char buffer[MAX_PATH]; + PROCESS_INFORMATION info; + STARTUPINFOA startup; + + memset(&startup, 0, sizeof(startup)); + startup.cb = sizeof(startup); + startup.dwFlags = STARTF_USESHOWWINDOW; + startup.wShowWindow = SW_SHOWNORMAL; + + /* the basics */ + get_file_name(resfile); + sprintf(buffer, "%s tests/process.c %s \"C:\\Program Files\\my nice app.exe\"", selfname, resfile); + ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess\n"); + /* wait for child to terminate */ + ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); + /* child process has changed result file, so let profile functions know about it */ + WritePrivateProfileStringA(NULL, NULL, NULL, resfile); + + okChildInt("Arguments", "argcA", 4); + okChildString("Arguments", "argvA3", "C:\\Program Files\\my nice app.exe"); + okChildString("Arguments", "argvA4", NULL); + okChildString("Arguments", "CommandLineA", buffer); + release_memory(); + assert(DeleteFileA(resfile) != 0); + + memset(&startup, 0, sizeof(startup)); + startup.cb = sizeof(startup); + startup.dwFlags = STARTF_USESHOWWINDOW; + startup.wShowWindow = SW_SHOWNORMAL; + + /* from Frangois */ + get_file_name(resfile); + sprintf(buffer, "%s tests/process.c %s \"a\\\"b\\\\\" c\\\" d", selfname, resfile); + ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess\n"); + /* wait for child to terminate */ + ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); + /* child process has changed result file, so let profile functions know about it */ + WritePrivateProfileStringA(NULL, NULL, NULL, resfile); + + okChildInt("Arguments", "argcA", 6); + okChildString("Arguments", "argvA3", "a\"b\\"); + okChildString("Arguments", "argvA4", "c\""); + okChildString("Arguments", "argvA5", "d"); + okChildString("Arguments", "argvA6", NULL); + okChildString("Arguments", "CommandLineA", buffer); + release_memory(); + assert(DeleteFileA(resfile) != 0); +} + +static void test_Directory(void) +{ + char buffer[MAX_PATH]; + PROCESS_INFORMATION info; + STARTUPINFOA startup; + char windir[MAX_PATH]; + + memset(&startup, 0, sizeof(startup)); + startup.cb = sizeof(startup); + startup.dwFlags = STARTF_USESHOWWINDOW; + startup.wShowWindow = SW_SHOWNORMAL; + + /* the basics */ + get_file_name(resfile); + sprintf(buffer, "%s tests/process.c %s", selfname, resfile); + GetWindowsDirectoryA( windir, sizeof(windir) ); + ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, windir, &startup, &info), "CreateProcess\n"); + /* wait for child to terminate */ + ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); + /* child process has changed result file, so let profile functions know about it */ + WritePrivateProfileStringA(NULL, NULL, NULL, resfile); + + okChildIString("Misc", "CurrDirA", windir); + release_memory(); + assert(DeleteFileA(resfile) != 0); +} + +static BOOL is_str_env_drive_dir(const char* str) +{ + return str[0] == '=' && str[1] >= 'A' && str[1] <= 'Z' && str[2] == ':' && + str[3] == '=' && str[4] == str[1]; +} + +/* compared expected child's environment (in gesA) from actual + * environment our child got + */ +static void cmpEnvironment(const char* gesA) +{ + int i, clen; + const char* ptrA; + char* res; + char key[32]; + BOOL found; + + clen = GetPrivateProfileIntA("EnvironmentA", "len", 0, resfile); + + /* now look each parent env in child */ + if ((ptrA = gesA) != NULL) + { + while (*ptrA) + { + for (i = 0; i < clen; i++) + { + sprintf(key, "env%d", i); + res = getChildString("EnvironmentA", key); + if (strncmp(ptrA, res, MAX_LISTED_ENV_VAR - 1) == 0) + break; + } + found = i < clen; + ok(found, "Parent-env string %s isn't in child process\n", ptrA); + + ptrA += strlen(ptrA) + 1; + release_memory(); + } + } + /* and each child env in parent */ + for (i = 0; i < clen; i++) + { + sprintf(key, "env%d", i); + res = getChildString("EnvironmentA", key); + if ((ptrA = gesA) != NULL) + { + while (*ptrA) + { + if (strncmp(res, ptrA, MAX_LISTED_ENV_VAR - 1) == 0) + break; + ptrA += strlen(ptrA) + 1; + } + if (!*ptrA) ptrA = NULL; + } + + if (!is_str_env_drive_dir(res)) + { + found = ptrA != NULL; + ok(found, "Child-env string %s isn't in parent process\n", res); + } + /* else => should also test we get the right per drive default directory here... */ + } +} + +static void test_Environment(void) +{ + char buffer[MAX_PATH]; + PROCESS_INFORMATION info; + STARTUPINFOA startup; + char child_env[4096]; + char* ptr; + char* env; + + memset(&startup, 0, sizeof(startup)); + startup.cb = sizeof(startup); + startup.dwFlags = STARTF_USESHOWWINDOW; + startup.wShowWindow = SW_SHOWNORMAL; + + /* the basics */ + get_file_name(resfile); + sprintf(buffer, "%s tests/process.c %s", selfname, resfile); + ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess\n"); + /* wait for child to terminate */ + ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); + /* child process has changed result file, so let profile functions know about it */ + WritePrivateProfileStringA(NULL, NULL, NULL, resfile); + + cmpEnvironment(GetEnvironmentStringsA()); + release_memory(); + assert(DeleteFileA(resfile) != 0); + + memset(&startup, 0, sizeof(startup)); + startup.cb = sizeof(startup); + startup.dwFlags = STARTF_USESHOWWINDOW; + startup.wShowWindow = SW_SHOWNORMAL; + + /* the basics */ + get_file_name(resfile); + sprintf(buffer, "%s tests/process.c %s", selfname, resfile); + ptr = child_env; + sprintf(ptr, "=%c:=%s", 'C', "C:\\FOO\\BAR"); + ptr += strlen(ptr) + 1; + strcpy(ptr, "PATH=C:\\WINDOWS;C:\\WINDOWS\\SYSTEM;C:\\MY\\OWN\\DIR"); + ptr += strlen(ptr) + 1; + strcpy(ptr, "FOO=BAR"); + ptr += strlen(ptr) + 1; + strcpy(ptr, "BAR=FOOBAR"); + ptr += strlen(ptr) + 1; + /* copy all existing variables except: + * - WINELOADER + * - PATH (already set above) + * - the directory definitions (=[A-Z]:=) + */ + for (env = GetEnvironmentStringsA(); *env; env += strlen(env) + 1) + { + if (strncmp(env, "PATH=", 5) != 0 && + strncmp(env, "WINELOADER=", 11) != 0 && + !is_str_env_drive_dir(env)) + { + strcpy(ptr, env); + ptr += strlen(ptr) + 1; + } + } + *ptr = '\0'; + ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, child_env, NULL, &startup, &info), "CreateProcess\n"); + /* wait for child to terminate */ + ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); + /* child process has changed result file, so let profile functions know about it */ + WritePrivateProfileStringA(NULL, NULL, NULL, resfile); + + cmpEnvironment(child_env); + + release_memory(); + assert(DeleteFileA(resfile) != 0); +} + +static void test_SuspendFlag(void) +{ + char buffer[MAX_PATH]; + PROCESS_INFORMATION info; + STARTUPINFOA startup; + DWORD exit_status; + + /* let's start simplistic */ + memset(&startup, 0, sizeof(startup)); + startup.cb = sizeof(startup); + startup.dwFlags = STARTF_USESHOWWINDOW; + startup.wShowWindow = SW_SHOWNORMAL; + + get_file_name(resfile); + sprintf(buffer, "%s tests/process.c %s", selfname, resfile); + ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &startup, &info), "CreateProcess\n"); + + ok(GetExitCodeThread(info.hThread, &exit_status) && exit_status == STILL_ACTIVE, "thread still running\n"); + Sleep(8000); + ok(GetExitCodeThread(info.hThread, &exit_status) && exit_status == STILL_ACTIVE, "thread still running\n"); + ok(ResumeThread(info.hThread) == 1, "Resuming thread\n"); + + /* wait for child to terminate */ + ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); + /* child process has changed result file, so let profile functions know about it */ + WritePrivateProfileStringA(NULL, NULL, NULL, resfile); + + okChildInt("StartupInfoA", "cb", startup.cb); + okChildString("StartupInfoA", "lpDesktop", startup.lpDesktop); + okChildString("StartupInfoA", "lpTitle", startup.lpTitle); + okChildInt("StartupInfoA", "dwX", startup.dwX); + okChildInt("StartupInfoA", "dwY", startup.dwY); + okChildInt("StartupInfoA", "dwXSize", startup.dwXSize); + okChildInt("StartupInfoA", "dwYSize", startup.dwYSize); + okChildInt("StartupInfoA", "dwXCountChars", startup.dwXCountChars); + okChildInt("StartupInfoA", "dwYCountChars", startup.dwYCountChars); + okChildInt("StartupInfoA", "dwFillAttribute", startup.dwFillAttribute); + okChildInt("StartupInfoA", "dwFlags", startup.dwFlags); + okChildInt("StartupInfoA", "wShowWindow", startup.wShowWindow); + release_memory(); + assert(DeleteFileA(resfile) != 0); +} + +static void test_DebuggingFlag(void) +{ + char buffer[MAX_PATH]; + PROCESS_INFORMATION info; + STARTUPINFOA startup; + DEBUG_EVENT de; + unsigned dbg = 0; + + /* let's start simplistic */ + memset(&startup, 0, sizeof(startup)); + startup.cb = sizeof(startup); + startup.dwFlags = STARTF_USESHOWWINDOW; + startup.wShowWindow = SW_SHOWNORMAL; + + get_file_name(resfile); + sprintf(buffer, "%s tests/process.c %s", selfname, resfile); + ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, DEBUG_PROCESS, NULL, NULL, &startup, &info), "CreateProcess\n"); + + /* get all startup events up to the entry point break exception */ + do + { + ok(WaitForDebugEvent(&de, INFINITE), "reading debug event\n"); + ContinueDebugEvent(de.dwProcessId, de.dwThreadId, DBG_CONTINUE); + if (de.dwDebugEventCode != EXCEPTION_DEBUG_EVENT) dbg++; + } while (de.dwDebugEventCode != EXIT_PROCESS_DEBUG_EVENT); + + ok(dbg, "I have seen a debug event\n"); + /* wait for child to terminate */ + ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); + /* child process has changed result file, so let profile functions know about it */ + WritePrivateProfileStringA(NULL, NULL, NULL, resfile); + + okChildInt("StartupInfoA", "cb", startup.cb); + okChildString("StartupInfoA", "lpDesktop", startup.lpDesktop); + okChildString("StartupInfoA", "lpTitle", startup.lpTitle); + okChildInt("StartupInfoA", "dwX", startup.dwX); + okChildInt("StartupInfoA", "dwY", startup.dwY); + okChildInt("StartupInfoA", "dwXSize", startup.dwXSize); + okChildInt("StartupInfoA", "dwYSize", startup.dwYSize); + okChildInt("StartupInfoA", "dwXCountChars", startup.dwXCountChars); + okChildInt("StartupInfoA", "dwYCountChars", startup.dwYCountChars); + okChildInt("StartupInfoA", "dwFillAttribute", startup.dwFillAttribute); + okChildInt("StartupInfoA", "dwFlags", startup.dwFlags); + okChildInt("StartupInfoA", "wShowWindow", startup.wShowWindow); + release_memory(); + assert(DeleteFileA(resfile) != 0); +} + +static void test_Console(void) +{ + char buffer[MAX_PATH]; + PROCESS_INFORMATION info; + STARTUPINFOA startup; + SECURITY_ATTRIBUTES sa; + CONSOLE_SCREEN_BUFFER_INFO sbi, sbiC; + DWORD modeIn, modeOut, modeInC, modeOutC; + DWORD cpIn, cpOut, cpInC, cpOutC; + DWORD w; + HANDLE hChildIn, hChildInInh, hChildOut, hChildOutInh, hParentIn, hParentOut; + const char* msg = "This is a std-handle inheritance test."; + unsigned msg_len; + + memset(&startup, 0, sizeof(startup)); + startup.cb = sizeof(startup); + startup.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES; + startup.wShowWindow = SW_SHOWNORMAL; + + sa.nLength = sizeof(sa); + sa.lpSecurityDescriptor = NULL; + sa.bInheritHandle = TRUE; + + startup.hStdInput = CreateFileA("CONIN$", GENERIC_READ|GENERIC_WRITE, 0, &sa, OPEN_EXISTING, 0, 0); + startup.hStdOutput = CreateFileA("CONOUT$", GENERIC_READ|GENERIC_WRITE, 0, &sa, OPEN_EXISTING, 0, 0); + + /* first, we need to be sure we're attached to a console */ + if (startup.hStdInput == INVALID_HANDLE_VALUE || startup.hStdOutput == INVALID_HANDLE_VALUE) + { + /* we're not attached to a console, let's do it */ + AllocConsole(); + startup.hStdInput = CreateFileA("CONIN$", GENERIC_READ|GENERIC_WRITE, 0, &sa, OPEN_EXISTING, 0, 0); + startup.hStdOutput = CreateFileA("CONOUT$", GENERIC_READ|GENERIC_WRITE, 0, &sa, OPEN_EXISTING, 0, 0); + } + /* now verify everything's ok */ + ok(startup.hStdInput != INVALID_HANDLE_VALUE, "Opening ConIn\n"); + ok(startup.hStdOutput != INVALID_HANDLE_VALUE, "Opening ConOut\n"); + startup.hStdError = startup.hStdOutput; + + ok(GetConsoleScreenBufferInfo(startup.hStdOutput, &sbi), "Getting sb info\n"); + ok(GetConsoleMode(startup.hStdInput, &modeIn) && + GetConsoleMode(startup.hStdOutput, &modeOut), "Getting console modes\n"); + cpIn = GetConsoleCP(); + cpOut = GetConsoleOutputCP(); + + get_file_name(resfile); + sprintf(buffer, "%s tests/process.c %s console", selfname, resfile); + ok(CreateProcessA(NULL, buffer, NULL, NULL, TRUE, 0, NULL, NULL, &startup, &info), "CreateProcess\n"); + + /* wait for child to terminate */ + ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); + /* child process has changed result file, so let profile functions know about it */ + WritePrivateProfileStringA(NULL, NULL, NULL, resfile); + + /* now get the modification the child has made, and resets parents expected values */ + ok(GetConsoleScreenBufferInfo(startup.hStdOutput, &sbiC), "Getting sb info\n"); + ok(GetConsoleMode(startup.hStdInput, &modeInC) && + GetConsoleMode(startup.hStdOutput, &modeOutC), "Getting console modes\n"); + + SetConsoleMode(startup.hStdInput, modeIn); + SetConsoleMode(startup.hStdOutput, modeOut); + + cpInC = GetConsoleCP(); + cpOutC = GetConsoleOutputCP(); + SetConsoleCP(cpIn); + SetConsoleOutputCP(cpOut); + + okChildInt("StartupInfoA", "cb", startup.cb); + okChildString("StartupInfoA", "lpDesktop", startup.lpDesktop); + okChildString("StartupInfoA", "lpTitle", startup.lpTitle); + okChildInt("StartupInfoA", "dwX", startup.dwX); + okChildInt("StartupInfoA", "dwY", startup.dwY); + okChildInt("StartupInfoA", "dwXSize", startup.dwXSize); + okChildInt("StartupInfoA", "dwYSize", startup.dwYSize); + okChildInt("StartupInfoA", "dwXCountChars", startup.dwXCountChars); + okChildInt("StartupInfoA", "dwYCountChars", startup.dwYCountChars); + okChildInt("StartupInfoA", "dwFillAttribute", startup.dwFillAttribute); + okChildInt("StartupInfoA", "dwFlags", startup.dwFlags); + okChildInt("StartupInfoA", "wShowWindow", startup.wShowWindow); + + /* check child correctly inherited the console */ + okChildInt("StartupInfoA", "hStdInput", (DWORD)startup.hStdInput); + okChildInt("StartupInfoA", "hStdOutput", (DWORD)startup.hStdOutput); + okChildInt("StartupInfoA", "hStdError", (DWORD)startup.hStdError); + okChildInt("Console", "SizeX", sbi.dwSize.X); + okChildInt("Console", "SizeY", sbi.dwSize.Y); + okChildInt("Console", "CursorX", sbi.dwCursorPosition.X); + okChildInt("Console", "CursorY", sbi.dwCursorPosition.Y); + okChildInt("Console", "Attributes", sbi.wAttributes); + okChildInt("Console", "winLeft", sbi.srWindow.Left); + okChildInt("Console", "winTop", sbi.srWindow.Top); + okChildInt("Console", "winRight", sbi.srWindow.Right); + okChildInt("Console", "winBottom", sbi.srWindow.Bottom); + okChildInt("Console", "maxWinWidth", sbi.dwMaximumWindowSize.X); + okChildInt("Console", "maxWinHeight", sbi.dwMaximumWindowSize.Y); + okChildInt("Console", "InputCP", cpIn); + okChildInt("Console", "OutputCP", cpOut); + okChildInt("Console", "InputMode", modeIn); + okChildInt("Console", "OutputMode", modeOut); + + todo_wine ok(cpInC == 1252, "Wrong console CP (expected 1252 got %ld/%ld)\n", cpInC, cpIn); + todo_wine ok(cpOutC == 1252, "Wrong console-SB CP (expected 1252 got %ld/%ld)\n", cpOutC, cpOut); + ok(modeInC == (modeIn ^ 1), "Wrong console mode\n"); + ok(modeOutC == (modeOut ^ 1), "Wrong console-SB mode\n"); + ok(sbiC.dwCursorPosition.X == (sbi.dwCursorPosition.X ^ 1), "Wrong cursor position\n"); + ok(sbiC.dwCursorPosition.Y == (sbi.dwCursorPosition.Y ^ 1), "Wrong cursor position\n"); + + release_memory(); + assert(DeleteFileA(resfile) != 0); + + ok(CreatePipe(&hParentIn, &hChildOut, NULL, 0), "Creating parent-input pipe\n"); + ok(DuplicateHandle(GetCurrentProcess(), hChildOut, GetCurrentProcess(), + &hChildOutInh, 0, TRUE, DUPLICATE_SAME_ACCESS), + "Duplicating as inheritable child-output pipe\n"); + CloseHandle(hChildOut); + + ok(CreatePipe(&hChildIn, &hParentOut, NULL, 0), "Creating parent-output pipe\n"); + ok(DuplicateHandle(GetCurrentProcess(), hChildIn, GetCurrentProcess(), + &hChildInInh, 0, TRUE, DUPLICATE_SAME_ACCESS), + "Duplicating as inheritable child-input pipe\n"); + CloseHandle(hChildIn); + + memset(&startup, 0, sizeof(startup)); + startup.cb = sizeof(startup); + startup.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES; + startup.wShowWindow = SW_SHOWNORMAL; + startup.hStdInput = hChildInInh; + startup.hStdOutput = hChildOutInh; + startup.hStdError = hChildOutInh; + + get_file_name(resfile); + sprintf(buffer, "%s tests/process.c %s stdhandle", selfname, resfile); + ok(CreateProcessA(NULL, buffer, NULL, NULL, TRUE, DETACHED_PROCESS, NULL, NULL, &startup, &info), "CreateProcess\n"); + ok(CloseHandle(hChildInInh), "Closing handle\n"); + ok(CloseHandle(hChildOutInh), "Closing handle\n"); + + msg_len = strlen(msg) + 1; + ok(WriteFile(hParentOut, msg, msg_len, &w, NULL), "Writing to child\n"); + ok(w == msg_len, "Should have written %u bytes, actually wrote %lu\n", msg_len, w); + memset(buffer, 0, sizeof(buffer)); + ok(ReadFile(hParentIn, buffer, sizeof(buffer), &w, NULL), "Reading from child\n"); + ok(strcmp(buffer, msg) == 0, "Should have received '%s'\n", msg); + + /* wait for child to terminate */ + ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); + /* child process has changed result file, so let profile functions know about it */ + WritePrivateProfileStringA(NULL, NULL, NULL, resfile); + + okChildString("StdHandle", "msg", msg); + + release_memory(); + assert(DeleteFileA(resfile) != 0); +} + +static void test_ExitCode(void) +{ + char buffer[MAX_PATH]; + PROCESS_INFORMATION info; + STARTUPINFOA startup; + DWORD code; + + /* let's start simplistic */ + memset(&startup, 0, sizeof(startup)); + startup.cb = sizeof(startup); + startup.dwFlags = STARTF_USESHOWWINDOW; + startup.wShowWindow = SW_SHOWNORMAL; + + get_file_name(resfile); + sprintf(buffer, "%s tests/process.c %s exit_code", selfname, resfile); + ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0, NULL, NULL, &startup, &info), "CreateProcess\n"); + + /* wait for child to terminate */ + ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); + /* child process has changed result file, so let profile functions know about it */ + WritePrivateProfileStringA(NULL, NULL, NULL, resfile); + + ok(GetExitCodeProcess(info.hProcess, &code), "Getting exit code\n"); + okChildInt("ExitCode", "value", code); + + release_memory(); + assert(DeleteFileA(resfile) != 0); +} + +START_TEST(process) +{ + int b = init(); + ok(b, "Basic init of CreateProcess test\n"); + if (!b) return; + + if (myARGC >= 3) + { + doChild(myARGV[2], (myARGC == 3) ? NULL : myARGV[3]); + return; + } + test_Startup(); + test_CommandLine(); + test_Directory(); + test_Environment(); + test_SuspendFlag(); + test_DebuggingFlag(); + test_Console(); + test_ExitCode(); + /* things that can be tested: + * lookup: check the way program to be executed is searched + * handles: check the handle inheritance stuff (+sec options) + * console: check if console creation parameters work + */ +} diff --git a/reactos/apps/tests/kernel32/profile.c b/reactos/apps/tests/kernel32/profile.c new file mode 100644 index 00000000000..3fff5a45e13 --- /dev/null +++ b/reactos/apps/tests/kernel32/profile.c @@ -0,0 +1,92 @@ +/* + * Unit tests for profile functions + * + * Copyright (c) 2003 Stefan Leichter + * + * 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 "wine/test.h" +#include "windef.h" +#include "winbase.h" +#include "windows.h" + +#define KEY "ProfileInt" +#define SECTION "Test" +#define TESTFILE ".\\testwine.ini" + +struct _profileInt { + LPCSTR section; + LPCSTR key; + LPCSTR value; + LPCSTR iniFile; + INT defaultVal; + UINT result; +}; + +static void test_profile_int(void) +{ + struct _profileInt profileInt[]={ + { NULL, NULL, NULL, NULL, 70, 0 }, /* 0 */ + { NULL, NULL, NULL, TESTFILE, -1, 4294967295U}, + { NULL, NULL, NULL, TESTFILE, 1, 1 }, + { SECTION, NULL, NULL, TESTFILE, -1, 4294967295U}, + { SECTION, NULL, NULL, TESTFILE, 1, 1 }, + { NULL, KEY, NULL, TESTFILE, -1, 4294967295U}, /* 5 */ + { NULL, KEY, NULL, TESTFILE, 1, 1 }, + { SECTION, KEY, NULL, TESTFILE, -1, 4294967295U}, + { SECTION, KEY, NULL, TESTFILE, 1, 1 }, + { SECTION, KEY, "-1", TESTFILE, -1, 4294967295U}, + { SECTION, KEY, "-1", TESTFILE, 1, 4294967295U}, /* 10 */ + { SECTION, KEY, "1", TESTFILE, -1, 1 }, + { SECTION, KEY, "1", TESTFILE, 1, 1 }, + { SECTION, KEY, "+1", TESTFILE, -1, 1 }, + { SECTION, KEY, "+1", TESTFILE, 1, 1 }, + { SECTION, KEY, "4294967296", TESTFILE, -1, 0 }, /* 15 */ + { SECTION, KEY, "4294967296", TESTFILE, 1, 0 }, + { SECTION, KEY, "4294967297", TESTFILE, -1, 1 }, + { SECTION, KEY, "4294967297", TESTFILE, 1, 1 }, + { SECTION, KEY, "-4294967297", TESTFILE, -1, 4294967295U}, + { SECTION, KEY, "-4294967297", TESTFILE, 1, 4294967295U}, /* 20 */ + { SECTION, KEY, "42A94967297", TESTFILE, -1, 42 }, + { SECTION, KEY, "42A94967297", TESTFILE, 1, 42 }, + { SECTION, KEY, "B4294967297", TESTFILE, -1, 0 }, + { SECTION, KEY, "B4294967297", TESTFILE, 1, 0 }, + }; + int i, num_test = (sizeof(profileInt)/sizeof(struct _profileInt)); + UINT res; + + DeleteFileA( TESTFILE); + + for (i=0; i < num_test; i++) { + if (profileInt[i].value) + WritePrivateProfileStringA(SECTION, KEY, profileInt[i].value, + profileInt[i].iniFile); + + res = GetPrivateProfileIntA(profileInt[i].section, profileInt[i].key, + profileInt[i].defaultVal, profileInt[i].iniFile); + ok(res == profileInt[i].result, "test<%02d>: ret<%010u> exp<%010u>\n", + i, res, profileInt[i].result); + } + + DeleteFileA( TESTFILE); +} + +START_TEST(profile) +{ + test_profile_int(); +} diff --git a/reactos/apps/tests/kernel32/testlist.c b/reactos/apps/tests/kernel32/testlist.c new file mode 100644 index 00000000000..38ab39345c8 --- /dev/null +++ b/reactos/apps/tests/kernel32/testlist.c @@ -0,0 +1,66 @@ +/* Automatically generated file; DO NOT EDIT!! */ + +#include +#include +#include +#include "windef.h" +#include "winbase.h" + +#if 0 +extern void func_alloc(void); +#endif +extern void func_atom(void); +extern void func_change(void); +extern void func_codepage(void); +extern void func_comm(void); +extern void func_console(void); +extern void func_directory(void); +extern void func_drive(void); +extern void func_environ(void); +extern void func_file(void); +extern void func_format_msg(void); +extern void func_heap(void); +extern void func_locale(void); +extern void func_mailslot(void); +extern void func_path(void); +extern void func_pipe(void); +extern void func_process(void); +extern void func_profile(void); +extern void func_thread(void); +extern void func_virtual(void); + +struct test +{ + const char *name; + void (*func)(void); +}; + +static const struct test winetest_testlist[] = +{ +#if 0 + { "alloc", func_alloc }, +#endif + { "atom", func_atom }, + { "change", func_change }, + { "codepage", func_codepage }, + { "comm", func_comm }, + { "console", func_console }, + { "directory", func_directory }, + { "drive", func_drive }, + { "environ", func_environ }, + { "file", func_file }, + { "format_msg", func_format_msg }, + { "heap", func_heap }, + { "locale", func_locale }, + { "mailslot", func_mailslot }, + { "path", func_path }, + { "pipe", func_pipe }, + { "process", func_process }, + { "profile", func_profile }, + { "thread", func_thread }, + { "virtual", func_virtual }, + { 0, 0 } +}; + +#define WINETEST_WANT_MAIN +#include "wine/test.h" diff --git a/reactos/apps/tests/kernel32/thread.c b/reactos/apps/tests/kernel32/thread.c new file mode 100644 index 00000000000..5fae9682a91 --- /dev/null +++ b/reactos/apps/tests/kernel32/thread.c @@ -0,0 +1,572 @@ +/* + * Unit test suite for directory functions. + * + * Copyright 2002 Geoffrey Hausheer + * + * 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_WINNT to get SetThreadIdealProcessor on Windows */ +#define _WIN32_WINNT 0x0500 + +#include + +#include "wine/test.h" +#include +#include +#include +#include + +/* Specify the number of simultaneous threads to test */ +#define NUM_THREADS 4 +/* Specify whether to test the extended priorities for Win2k/XP */ +#define USE_EXTENDED_PRIORITIES 0 +/* Specify whether to test the stack allocation in CreateThread */ +#define CHECK_STACK 0 + +/* Set CHECK_STACK to 1 if you want to try to test the stack-limit from + CreateThread. So far I have been unable to make this work, and + I am in doubt as to how portable it is. Also, according to MSDN, + you shouldn't mix C-run-time-libraries (i.e. alloca) with CreateThread. + Anyhow, the check is currently commented out +*/ +#if CHECK_STACK + #ifdef __try + #define __TRY __try + #define __EXCEPT __except + #define __ENDTRY + #else + #include "wine/exception.h" + #endif +#endif + +typedef BOOL (WINAPI *GetThreadPriorityBoost_t)(HANDLE,PBOOL); +static GetThreadPriorityBoost_t pGetThreadPriorityBoost=NULL; + +typedef HANDLE (WINAPI *OpenThread_t)(DWORD,BOOL,DWORD); +static OpenThread_t pOpenThread=NULL; + +typedef DWORD (WINAPI *SetThreadIdealProcessor_t)(HANDLE,DWORD); +static SetThreadIdealProcessor_t pSetThreadIdealProcessor=NULL; + +typedef BOOL (WINAPI *SetThreadPriorityBoost_t)(HANDLE,BOOL); +static SetThreadPriorityBoost_t pSetThreadPriorityBoost=NULL; + +/* Functions not tested yet: + AttachThreadInput + CreateRemoteThread + SetThreadContext + SwitchToThread + +In addition there are no checks that the inheritance works properly in +CreateThread +*/ + +DWORD tlsIndex; + +typedef struct { + int threadnum; + HANDLE *event; + DWORD *threadmem; +} t1Struct; + +/* Basic test that simulatneous threads can access shared memory, + that the thread local storage routines work correctly, and that + threads actually run concurrently +*/ +VOID WINAPI threadFunc1(t1Struct *tstruct) +{ + int i; +/* write our thread # into shared memory */ + tstruct->threadmem[tstruct->threadnum]=GetCurrentThreadId(); + ok(TlsSetValue(tlsIndex,(LPVOID)(tstruct->threadnum+1))!=0, + "TlsSetValue failed\n"); +/* The threads synchronize before terminating. This is done by + Signaling an event, and waiting for all events to occur +*/ + SetEvent(tstruct->event[tstruct->threadnum]); + WaitForMultipleObjects(NUM_THREADS,tstruct->event,TRUE,INFINITE); +/* Double check that all threads really did run by validating that + they have all written to the shared memory. There should be no race + here, since all threads were synchronized after the write.*/ + for(i=0;ithreadmem[i]==0) ; + } +/* Check that noone cahnged our tls memory */ + ok((int)TlsGetValue(tlsIndex)-1==tstruct->threadnum, + "TlsGetValue failed\n"); + ExitThread(NUM_THREADS+tstruct->threadnum); +} + +VOID WINAPI threadFunc2() +{ + ExitThread(99); +} + +VOID WINAPI threadFunc3() +{ + HANDLE thread; + thread=GetCurrentThread(); + SuspendThread(thread); + ExitThread(99); +} + +VOID WINAPI threadFunc4(HANDLE event) +{ + if(event != NULL) { + SetEvent(event); + } + Sleep(99000); + ExitThread(0); +} + +#if CHECK_STACK +VOID WINAPI threadFunc5(DWORD *exitCode) +{ + SYSTEM_INFO sysInfo; + sysInfo.dwPageSize=0; + GetSystemInfo(&sysInfo); + *exitCode=0; + __TRY + { + alloca(2*sysInfo.dwPageSize); + } + __EXCEPT(1) { + *exitCode=1; + } + __ENDTRY + ExitThread(0); +} +#endif + +/* Check basic funcationality of CreateThread and Tls* functions */ +VOID test_CreateThread_basic() +{ + HANDLE thread[NUM_THREADS],event[NUM_THREADS]; + DWORD threadid[NUM_THREADS],curthreadId; + DWORD threadmem[NUM_THREADS]; + DWORD exitCode; + t1Struct tstruct[NUM_THREADS]; + int error; + DWORD i,j; +/* Retrieve current Thread ID for later comparisons */ + curthreadId=GetCurrentThreadId(); +/* Allocate some local storage */ + ok((tlsIndex=TlsAlloc())!=TLS_OUT_OF_INDEXES,"TlsAlloc failed\n"); +/* Create events for thread synchronization */ + for(i=0;i0,"GetSystemInfo should return a valid page size\n"); + thread = CreateThread(NULL,sysInfo.dwPageSize, + (LPTHREAD_START_ROUTINE)threadFunc5,&exitCode, + 0,&threadId); + ok(WaitForSingleObject(thread,5000)==WAIT_OBJECT_0, + "TerminateThread didn't work\n"); + ok(exitCode==1,"CreateThread did not obey stack-size-limit\n"); + ok(CloseHandle(thread)!=0,"CloseHandle failed\n"); +#endif +} + +/* Check whether setting/retrieving thread priorities works */ +VOID test_thread_priority() +{ + HANDLE curthread,access_thread; + DWORD curthreadId,exitCode; + int min_priority=-2,max_priority=2; + BOOL disabled; + int i; + + curthread=GetCurrentThread(); + curthreadId=GetCurrentThreadId(); +/* Check thread priority */ +/* NOTE: on Win2k/XP priority can be from -7 to 6. All other platforms it + is -2 to 2. However, even on a real Win2k system, using thread + priorities beyond the -2 to 2 range does not work. If you want to try + anyway, enable USE_EXTENDED_PRIORITIES +*/ + ok(GetThreadPriority(curthread)==THREAD_PRIORITY_NORMAL, + "GetThreadPriority Failed\n"); + + if (pOpenThread) { +/* check that access control is obeyed */ + access_thread=pOpenThread(THREAD_ALL_ACCESS & + (~THREAD_QUERY_INFORMATION) & (~THREAD_SET_INFORMATION), + 0,curthreadId); + ok(access_thread!=NULL,"OpenThread returned an invalid handle\n"); + if (access_thread!=NULL) { + ok(SetThreadPriority(access_thread,1)==0, + "SetThreadPriority did not obey access restrictions\n"); + ok(GetThreadPriority(access_thread)==THREAD_PRIORITY_ERROR_RETURN, + "GetThreadPriority did not obey access restrictions\n"); + if (pSetThreadPriorityBoost) + ok(pSetThreadPriorityBoost(access_thread,1)==0, + "SetThreadPriorityBoost did not obey access restrictions\n"); + if (pGetThreadPriorityBoost) + ok(pGetThreadPriorityBoost(access_thread,&disabled)==0, + "GetThreadPriorityBoost did not obey access restrictions\n"); + ok(GetExitCodeThread(access_thread,&exitCode)==0, + "GetExitCodeThread did not obey access restrictions\n"); + ok(CloseHandle(access_thread),"Error Closing thread handle\n"); + } +#if USE_EXTENDED_PRIORITIES + min_priority=-7; max_priority=6; +#endif + } + for(i=min_priority;i<=max_priority;i++) { + ok(SetThreadPriority(curthread,i)!=0, + "SetThreadPriority Failed for priority: %d\n",i); + ok(GetThreadPriority(curthread)==i, + "GetThreadPriority Failed for priority: %d\n",i); + } + ok(SetThreadPriority(curthread,THREAD_PRIORITY_TIME_CRITICAL)!=0, + "SetThreadPriority Failed\n"); + ok(GetThreadPriority(curthread)==THREAD_PRIORITY_TIME_CRITICAL, + "GetThreadPriority Failed\n"); + ok(SetThreadPriority(curthread,THREAD_PRIORITY_IDLE)!=0, + "SetThreadPriority Failed\n"); + ok(GetThreadPriority(curthread)==THREAD_PRIORITY_IDLE, + "GetThreadPriority Failed\n"); + ok(SetThreadPriority(curthread,0)!=0,"SetThreadPriority Failed\n"); + +/* Check thread priority boost */ + if (pGetThreadPriorityBoost && pSetThreadPriorityBoost) { + BOOL rc; + todo_wine { + SetLastError(0); + rc=pGetThreadPriorityBoost(curthread,&disabled); + if (rc!=0 || GetLastError()!=ERROR_CALL_NOT_IMPLEMENTED) { + ok(rc!=0,"error=%ld\n",GetLastError()); + + ok(pSetThreadPriorityBoost(curthread,1)!=0, + "error=%ld\n",GetLastError()); + rc=pGetThreadPriorityBoost(curthread,&disabled); + ok(rc!=0 && disabled==1, + "rc=%d error=%ld disabled=%d\n",rc,GetLastError(),disabled); + + ok(pSetThreadPriorityBoost(curthread,0)!=0, + "error=%ld\n",GetLastError()); + rc=pGetThreadPriorityBoost(curthread,&disabled); + ok(rc!=0 && disabled==0, + "rc=%d error=%ld disabled=%d\n",rc,GetLastError(),disabled); + } + } + } +} + +/* check the GetThreadTimes function */ +VOID test_GetThreadTimes() +{ + HANDLE thread,access_thread=NULL; + FILETIME creationTime,exitTime,kernelTime,userTime; + DWORD threadId; + int error; + + thread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)threadFunc2,NULL, + CREATE_SUSPENDED,&threadId); + + ok(thread!=NULL,"Create Thread failed\n"); +/* check that access control is obeyed */ + if (pOpenThread) { + access_thread=pOpenThread(THREAD_ALL_ACCESS & + (~THREAD_QUERY_INFORMATION), 0,threadId); + ok(access_thread!=NULL, + "OpenThread returned an invalid handle\n"); + } + ok(ResumeThread(thread)==1,"Resume thread returned an invalid value\n"); + ok(WaitForSingleObject(thread,5000)==WAIT_OBJECT_0, + "ResumeThread didn't work\n"); + if(access_thread!=NULL) { + error=GetThreadTimes(access_thread,&creationTime,&exitTime, + &kernelTime,&userTime); + ok(error==0, "GetThreadTimes did not obey access restrictions\n"); + ok(CloseHandle(access_thread)!=0,"CloseHandle Failed\n"); + } + creationTime.dwLowDateTime=99; creationTime.dwHighDateTime=99; + exitTime.dwLowDateTime=99; exitTime.dwHighDateTime=99; + kernelTime.dwLowDateTime=99; kernelTime.dwHighDateTime=99; + userTime.dwLowDateTime=99; userTime.dwHighDateTime=99; +/* GetThreadTimes should set all of the parameters passed to it */ + error=GetThreadTimes(thread,&creationTime,&exitTime, + &kernelTime,&userTime); + if (error!=0 || GetLastError()!=ERROR_CALL_NOT_IMPLEMENTED) { + ok(error!=0,"GetThreadTimes failed\n"); + ok(creationTime.dwLowDateTime!=99 || creationTime.dwHighDateTime!=99, + "creationTime was invalid\n"); + ok(exitTime.dwLowDateTime!=99 || exitTime.dwHighDateTime!=99, + "exitTime was invalid\n"); + ok(kernelTime.dwLowDateTime!=99 || kernelTime.dwHighDateTime!=99, + "kernelTimewas invalid\n"); + ok(userTime.dwLowDateTime!=99 || userTime.dwHighDateTime!=99, + "userTime was invalid\n"); + ok(CloseHandle(thread)!=0,"CloseHandle failed\n"); + } +} + +/* Check the processor affinity functions */ +/* NOTE: These functions should also be checked that they obey access control +*/ +VOID test_thread_processor() +{ + HANDLE curthread,curproc; + DWORD processMask,systemMask; + SYSTEM_INFO sysInfo; + int error=0; + + sysInfo.dwNumberOfProcessors=0; + GetSystemInfo(&sysInfo); + ok(sysInfo.dwNumberOfProcessors>0, + "GetSystemInfo failed to return a valid # of processors\n"); +/* Use the current Thread/process for all tests */ + curthread=GetCurrentThread(); + ok(curthread!=NULL,"GetCurrentThread failed\n"); + curproc=GetCurrentProcess(); + ok(curproc!=NULL,"GetCurrentProcess failed\n"); +/* Check the Affinity Mask functions */ + ok(GetProcessAffinityMask(curproc,&processMask,&systemMask)!=0, + "GetProcessAffinityMask failed\n"); + ok(SetThreadAffinityMask(curthread,processMask)==1, + "SetThreadAffinityMask failed\n"); + ok(SetThreadAffinityMask(curthread,processMask+1)==0, + "SetThreadAffinityMask passed for an illegal processor\n"); +/* NOTE: This only works on WinNT/2000/XP) */ + if (pSetThreadIdealProcessor) { + todo_wine { + SetLastError(0); + error=pSetThreadIdealProcessor(curthread,0); + if (GetLastError()!=ERROR_CALL_NOT_IMPLEMENTED) { + ok(error!=-1, "SetThreadIdealProcessor failed\n"); + } + } + if (GetLastError()!=ERROR_CALL_NOT_IMPLEMENTED) { + error=pSetThreadIdealProcessor(curthread,MAXIMUM_PROCESSORS+1); + ok(error==-1, + "SetThreadIdealProcessor succeeded with an illegal processor #\n"); + todo_wine { + error=pSetThreadIdealProcessor(curthread,MAXIMUM_PROCESSORS); + ok(error==0, "SetThreadIdealProcessor returned an incorrect value\n"); + } + } + } +} + +START_TEST(thread) +{ + HINSTANCE lib; +/* Neither Cygwin nor mingW export OpenThread, so do a dynamic check + so that the compile passes +*/ + lib=LoadLibraryA("kernel32"); + ok(lib!=NULL,"Couldn't load kernel32.dll\n"); + pGetThreadPriorityBoost=(GetThreadPriorityBoost_t)GetProcAddress(lib,"GetThreadPriorityBoost"); + pOpenThread=(OpenThread_t)GetProcAddress(lib,"OpenThread"); + pSetThreadIdealProcessor=(SetThreadIdealProcessor_t)GetProcAddress(lib,"SetThreadIdealProcessor"); + pSetThreadPriorityBoost=(SetThreadPriorityBoost_t)GetProcAddress(lib,"SetThreadPriorityBoost"); + test_CreateThread_basic(); + test_CreateThread_suspended(); + test_SuspendThread(); + test_TerminateThread(); + test_CreateThread_stack(); + test_thread_priority(); + test_GetThreadTimes(); + test_thread_processor(); +} diff --git a/reactos/apps/tests/kernel32/virtual.c b/reactos/apps/tests/kernel32/virtual.c new file mode 100644 index 00000000000..b4b40683deb --- /dev/null +++ b/reactos/apps/tests/kernel32/virtual.c @@ -0,0 +1,113 @@ +/* + * Unit test suite for Virtual* family of APIs. + * + * Copyright 2004 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 + */ + +#include + +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "wine/test.h" + +static void test_VirtualAlloc(void) +{ + void *addr1, *addr2; + DWORD old_prot; + MEMORY_BASIC_INFORMATION info; + + SetLastError(0xdeadbeef); + addr1 = VirtualAlloc(0, 0, MEM_RESERVE, PAGE_NOACCESS); + ok(addr1 == NULL, "VirtualAlloc should fail on zero-sized allocation\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER /* NT */ || + GetLastError() == ERROR_NOT_ENOUGH_MEMORY, /* Win9x */ + "got %ld, expected ERROR_INVALID_PARAMETER\n", GetLastError()); + + addr1 = VirtualAlloc(0, 0xFFFC, MEM_RESERVE, PAGE_NOACCESS); + ok(addr1 != NULL, "VirtualAlloc failed\n"); + + /* test a not committed memory */ + ok(VirtualQuery(addr1, &info, sizeof(info)) == sizeof(info), + "VirtualQuery failed\n"); + ok(info.BaseAddress == addr1, "%p != %p\n", info.BaseAddress, addr1); + ok(info.AllocationBase == addr1, "%p != %p\n", info.AllocationBase, addr1); + ok(info.AllocationProtect == PAGE_NOACCESS, "%lx != PAGE_NOACCESS\n", info.AllocationProtect); + ok(info.RegionSize == 0x10000, "%lx != 0x10000\n", info.RegionSize); + ok(info.State == MEM_RESERVE, "%lx != MEM_RESERVE\n", info.State); + /* NT reports Protect == 0 for a not committed memory block */ + ok(info.Protect == 0 /* NT */ || + info.Protect == PAGE_NOACCESS, /* Win9x */ + "%lx != PAGE_NOACCESS\n", info.Protect); + ok(info.Type == MEM_PRIVATE, "%lx != MEM_PRIVATE\n", info.Type); + + SetLastError(0xdeadbeef); + ok(!VirtualProtect(addr1, 0xFFFC, PAGE_READONLY, &old_prot), + "VirtualProtect should fail on a not committed memory\n"); + ok(GetLastError() == ERROR_INVALID_ADDRESS /* NT */ || + GetLastError() == ERROR_INVALID_PARAMETER, /* Win9x */ + "got %ld, expected ERROR_INVALID_ADDRESS\n", GetLastError()); + + addr2 = VirtualAlloc(addr1, 0x1000, MEM_COMMIT, PAGE_NOACCESS); + ok(addr1 == addr2, "VirtualAlloc failed\n"); + + /* test a committed memory */ + ok(VirtualQuery(addr1, &info, sizeof(info)) == sizeof(info), + "VirtualQuery failed\n"); + ok(info.BaseAddress == addr1, "%p != %p\n", info.BaseAddress, addr1); + ok(info.AllocationBase == addr1, "%p != %p\n", info.AllocationBase, addr1); + ok(info.AllocationProtect == PAGE_NOACCESS, "%lx != PAGE_NOACCESS\n", info.AllocationProtect); + ok(info.RegionSize == 0x1000, "%lx != 0x1000\n", info.RegionSize); + ok(info.State == MEM_COMMIT, "%lx != MEM_COMMIT\n", info.State); + /* this time NT reports PAGE_NOACCESS as well */ + ok(info.Protect == PAGE_NOACCESS, "%lx != PAGE_NOACCESS\n", info.Protect); + ok(info.Type == MEM_PRIVATE, "%lx != MEM_PRIVATE\n", info.Type); + + /* this should fail, since not the whole range is committed yet */ + SetLastError(0xdeadbeef); + ok(!VirtualProtect(addr1, 0xFFFC, PAGE_READONLY, &old_prot), + "VirtualProtect should fail on a not committed memory\n"); + ok(GetLastError() == ERROR_INVALID_ADDRESS /* NT */ || + GetLastError() == ERROR_INVALID_PARAMETER, /* Win9x */ + "got %ld, expected ERROR_INVALID_ADDRESS\n", GetLastError()); + + ok(VirtualProtect(addr1, 0x1000, PAGE_READONLY, &old_prot), "VirtualProtect failed\n"); + ok(old_prot == PAGE_NOACCESS, + "wrong old protection: got %04lx instead of PAGE_NOACCESS\n", old_prot); + + ok(VirtualProtect(addr1, 0x1000, PAGE_READWRITE, &old_prot), "VirtualProtect failed\n"); + ok(old_prot == PAGE_READONLY, + "wrong old protection: got %04lx instead of PAGE_READONLY\n", old_prot); + + ok(!VirtualFree(addr1, 0x10000, 0), "VirtualFree should fail with type 0\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "got %ld, expected ERROR_INVALID_PARAMETER\n", GetLastError()); + + ok(VirtualFree(addr1, 0x10000, MEM_DECOMMIT), "VirtualFree failed\n"); + + /* if the type is MEM_RELEASE, size must be 0 */ + ok(!VirtualFree(addr1, 1, MEM_RELEASE), "VirtualFree should fail\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "got %ld, expected ERROR_INVALID_PARAMETER\n", GetLastError()); + + ok(VirtualFree(addr1, 0, MEM_RELEASE), "VirtualFree failed\n"); +} + +START_TEST(virtual) +{ + test_VirtualAlloc(); +} From d93b2368dbfacf2f5c8ac3b214914971c09a9427 Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Sat, 14 Feb 2004 20:13:04 +0000 Subject: [PATCH 0015/1463] Sync WINE user32 Regression tests. svn path=/trunk/; revision=8171 --- reactos/apps/tests/user32/class.c | 362 +++++++++++++++-- reactos/apps/tests/user32/dialog.c | 518 +++++++++++++++++++++++++ reactos/apps/tests/user32/input.c | 44 +-- reactos/apps/tests/user32/listbox.c | 2 +- reactos/apps/tests/user32/makefile | 4 +- reactos/apps/tests/user32/resource.c | 59 +++ reactos/apps/tests/user32/sysparams.c | 22 +- reactos/apps/tests/user32/testlist.c | 4 + reactos/apps/tests/user32/win.c | 538 +++++++++++++++++++++++--- reactos/apps/tests/user32/wsprintf.c | 8 +- 10 files changed, 1433 insertions(+), 128 deletions(-) create mode 100644 reactos/apps/tests/user32/dialog.c create mode 100644 reactos/apps/tests/user32/resource.c diff --git a/reactos/apps/tests/user32/class.c b/reactos/apps/tests/user32/class.c index 33508b2c9a9..ec46a95b359 100644 --- a/reactos/apps/tests/user32/class.c +++ b/reactos/apps/tests/user32/class.c @@ -1,6 +1,7 @@ /* Unit test suite for window classes. * * Copyright 2002 Mike McCormack + * Copyright 2003 Alexandre Julliard * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -17,6 +18,12 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/* To get CS_DROPSHADOW with the MSVC headers */ +#define _WIN32_WINNT 0x0501 +#ifndef CS_DROPSHADOW +#define CS_DROPSHADOW 0x00020000 +#endif + #include #include #include @@ -31,16 +38,14 @@ #define NUMCLASSWORDS 4 -LRESULT WINAPI ClassTest_WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +static LRESULT WINAPI ClassTest_WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { return DefWindowProcW (hWnd, msg, wParam, lParam); } /*********************************************************************** - * - * WinMain */ -void ClassTest(HINSTANCE hInstance, BOOL global) +static void ClassTest(HINSTANCE hInstance, BOOL global) { WNDCLASSW cls, wc; WCHAR className[] = {'T','e','s','t','C','l','a','s','s',0}; @@ -65,19 +70,10 @@ void ClassTest(HINSTANCE hInstance, BOOL global) classatom=RegisterClassW(&cls); if (!classatom && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) return; - ok(classatom, "failed to register class"); + ok(classatom, "failed to register class\n"); ok(!RegisterClassW (&cls), - "RegisterClass of the same class should fail for the second time"); - -#if 0 - /* these succeeds on Wine, but shouldn't cause any trouble ... */ - ok(!GlobalFindAtomW(className), - "Found class as global atom"); - - ok(!FindAtomW(className), - "Found class as global atom"); -#endif + "RegisterClass of the same class should fail for the second time\n"); /* Setup windows */ hTestWnd = CreateWindowW (className, winName, @@ -85,16 +81,16 @@ void ClassTest(HINSTANCE hInstance, BOOL global) CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 0, hInstance, 0); - ok(hTestWnd!=0, "Failed to create window"); + ok(hTestWnd!=0, "Failed to create window\n"); /* test initial values of valid classwords */ for(i=0; i +#include +#include + +#include "wine/test.h" +#include "windef.h" +#include "winbase.h" +#include "winuser.h" + +#define MAXHWNDS 1024 +static HWND hwnd [MAXHWNDS]; +static int numwnds=1; /* 0 is reserved for null */ + +/* Global handles */ +static HINSTANCE g_hinst; /* This application's HINSTANCE */ +static HWND g_hwndMain, g_hwndButton1, g_hwndButton2, g_hwndButtonCancel; +static int g_terminated; + +typedef struct { + int id; + int parent; + DWORD style; + DWORD exstyle; +} h_entry; + +static const h_entry hierarchy [] = { + /* 0 is reserved for the null window */ + { 1, 0, WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE}, + { 20, 1, WS_CHILD | WS_VISIBLE | WS_GROUP, 0}, + { 2, 1, WS_CHILD | WS_VISIBLE, WS_EX_CONTROLPARENT}, + { 60, 2, WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0}, + /* What happens with groups when the parent is disabled */ + { 8, 2, WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_TABSTOP, WS_EX_CONTROLPARENT}, + { 85, 8, WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_GROUP, 0}, + { 9, 8, WS_CHILD, WS_EX_CONTROLPARENT}, + { 86, 9, WS_CHILD | WS_VISIBLE, 0}, + { 87, 9, WS_CHILD | WS_VISIBLE, 0}, + { 31, 8, WS_CHILD | WS_VISIBLE | WS_GROUP, 0}, + { 10, 2, WS_CHILD | WS_VISIBLE, WS_EX_CONTROLPARENT}, + { 88, 10, WS_CHILD | WS_VISIBLE | WS_GROUP, 0}, + { 11, 10, WS_CHILD, WS_EX_CONTROLPARENT}, + { 89, 11, WS_CHILD | WS_VISIBLE, 0}, + { 32, 11, WS_CHILD | WS_VISIBLE | WS_GROUP, 0}, + { 90, 11, WS_CHILD | WS_VISIBLE, 0}, + { 33, 10, WS_CHILD | WS_VISIBLE | WS_GROUP, 0}, + { 21, 2, WS_CHILD | WS_VISIBLE | WS_GROUP, 0}, + { 61, 2, WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0}, + { 3, 1, WS_CHILD | WS_VISIBLE | DS_CONTROL, 0}, + { 22, 3, WS_CHILD | WS_VISIBLE | WS_GROUP, 0}, + { 62, 3, WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0}, + { 7, 3, WS_CHILD | WS_VISIBLE, WS_EX_CONTROLPARENT}, + { 4, 7, WS_CHILD | WS_VISIBLE | DS_CONTROL, 0}, + { 83, 4, WS_CHILD | WS_VISIBLE, 0}, + { 5, 4, WS_CHILD | WS_VISIBLE | DS_CONTROL, 0}, + /* A couple of controls around the main dialog */ + { 29, 5, WS_CHILD | WS_VISIBLE | WS_GROUP, 0}, + { 81, 5, WS_CHILD | WS_VISIBLE, 0}, + /* The main dialog with lots of controls */ + { 6, 5, WS_CHILD | WS_VISIBLE, WS_EX_CONTROLPARENT}, + /* At the start of a dialog */ + /* Disabled controls are skipped */ + { 63, 6, WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_TABSTOP, 0}, + /* Invisible controls are skipped */ + { 64, 6, WS_CHILD | WS_TABSTOP, 0}, + /* Invisible disabled controls are skipped */ + { 65, 6, WS_CHILD | WS_DISABLED | WS_TABSTOP, 0}, + /* Non-tabstop controls are skipped for tabs but not for groups */ + { 66, 6, WS_CHILD | WS_VISIBLE, 0}, + /* End of first group, with no tabstops in it */ + { 23, 6, WS_CHILD | WS_VISIBLE | WS_GROUP, 0}, + /* At last a tabstop */ + { 67, 6, WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0}, + /* A group that is totally disabled or invisible */ + { 24, 6, WS_CHILD | WS_DISABLED | WS_GROUP, 0}, + { 68, 6, WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_TABSTOP, 0}, + { 69, 6, WS_CHILD | WS_TABSTOP, 0}, + /* A valid group in the middle of the dialog (not the first nor last group*/ + { 25, 6, WS_CHILD | WS_VISIBLE | WS_GROUP, 0}, + /* A non-tabstop item will be skipped for tabs */ + { 70, 6, WS_CHILD | WS_VISIBLE, 0}, + /* A disabled item will be skipped for tabs and groups */ + { 71, 6, WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_TABSTOP, 0}, + /* A valid item will be found for tabs and groups */ + { 72, 6, WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0}, + /* A disabled item to skip when looking for the next group item */ + { 73, 6, WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_TABSTOP, 0}, + /* The next group begins with an enabled visible label */ + { 26, 6, WS_CHILD | WS_VISIBLE | WS_GROUP, 0}, + { 74, 6, WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0}, + { 75, 6, WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0}, + /* That group is terminated by a disabled label */ + { 27, 6, WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_GROUP, 0}, + { 76, 6, WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0}, + { 77, 6, WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0}, + /* That group is terminated by an invisible label */ + { 28, 6, WS_CHILD | WS_GROUP, 0}, + /* The end of the dialog with item for loop and recursion testing */ + { 78, 6, WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0}, + /* No tabstop so skipped for prev tab, but found for prev group */ + { 79, 6, WS_CHILD | WS_VISIBLE, 0}, + { 80, 6, WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_TABSTOP, 0}, + /* A couple of controls after the main dialog */ + { 82, 5, WS_CHILD | WS_VISIBLE, 0}, + { 30, 5, WS_CHILD | WS_VISIBLE | WS_GROUP, 0}, + /* And around them */ + { 84, 4, WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0}, + {0, 0, 0, 0} +}; + +static BOOL CreateWindows (HINSTANCE hinst) +{ + const h_entry *p = hierarchy; + + while (p->id != 0) + { + DWORD style, exstyle; + char ctrlname[9]; + + /* Basically assert that the hierarchy is valid and track the + * maximum control number + */ + if (p->id >= numwnds) + { + if (p->id >= sizeof(hwnd)/sizeof(hwnd[0])) + { + trace ("Control %d is out of range\n", p->id); + return FALSE; + } + else + numwnds = p->id+1; + } + if (p->id <= 0) + { + trace ("Control %d is out of range\n", p->id); + return FALSE; + } + if (hwnd[p->id] != 0) + { + trace ("Control %d is used more than once\n", p->id); + return FALSE; + } + + /* Create the control */ + sprintf (ctrlname, "ctrl%4.4d", p->id); + hwnd[p->id] = CreateWindowEx (p->exstyle, TEXT(p->parent ? "static" : "GetNextDlgItemWindowClass"), TEXT(ctrlname), p->style, 10, 10, 10, 10, hwnd[p->parent], p->parent ? (HMENU) (2000 + p->id) : 0, hinst, 0); + if (!hwnd[p->id]) + { + trace ("Failed to create control %d\n", p->id); + return FALSE; + } + + /* Check that the styles are as we specified (except the main one + * which is quite frequently messed up). If this keeps breaking then + * we could mask out the bits that don't concern us. + */ + if (p->parent) + { + style = GetWindowLong (hwnd[p->id], GWL_STYLE); + exstyle = GetWindowLong (hwnd[p->id], GWL_EXSTYLE); + if (style == p->style && exstyle == p->exstyle) + { + trace ("Style mismatch at %d: %8.8lx %8.8lx cf %8.8lx %8.8lx\n", p->id, style, exstyle, p->style, p->exstyle); + } + } + p++; + } + + return TRUE; +} + +/* Form the lParam of a WM_KEYDOWN message */ +static DWORD KeyDownData (int repeat, int scancode, int extended, int wasdown) +{ + return ((repeat & 0x0000FFFF) | ((scancode & 0x00FF) >> 16) | + (extended ? 0x01000000 : 0) | (wasdown ? 0x40000000 : 0)); +} + +/* Form a WM_KEYDOWN VK_TAB message to the specified window */ +static void FormTabMsg (MSG *pMsg, HWND hwnd) +{ + pMsg->hwnd = hwnd; + pMsg->message = WM_KEYDOWN; + pMsg->wParam = VK_TAB; + pMsg->lParam = KeyDownData (1, 0x0F, 0, 0); + /* pMsg->time is not set. It shouldn't be needed */ + /* pMsg->pt is ignored */ +} + +/* Form a WM_KEYDOWN VK_RETURN message to the specified window */ +static void FormEnterMsg (MSG *pMsg, HWND hwnd) +{ + pMsg->hwnd = hwnd; + pMsg->message = WM_KEYDOWN; + pMsg->wParam = VK_RETURN; + pMsg->lParam = KeyDownData (1, 0x1C, 0, 0); + /* pMsg->time is not set. It shouldn't be needed */ + /* pMsg->pt is ignored */ +} + +/*********************************************************************** + * + * The actual tests + */ + +typedef struct +{ + int isok; /* or is it todo */ + int test; + int dlg; + int ctl; + int tab; + int prev; + int res; +} test_record; + +static int id (HWND h) +{ + int i; + for (i = 0; i < numwnds; i++) + if (hwnd[i] == h) + return i; + return -1; +} + +/* Tests + * + * Tests 1-8 test the hCtl argument of null or the dialog itself. + * + * 1. Prev Group of null is null + * 2. Prev Tab of null is null + * 3. Prev Group of hDlg in hDlg is null + * 4. Prev Tab of hDlg in hDlg is null + * 5. Next Group of null is first visible enabled child + * Check it skips invisible, diabled and both. + * 6. Next Tab of null is first visible enabled tabstop + * Check it skips invisible, disabled, nontabstop, and in combination. + * 7. Next Group of hDlg in hDlg is as of null + * 8. Next Tab of hDlg in hDlg is as of null + * + * Tests 9-14 test descent + * + * 9. DS_CONTROL does not result in descending the hierarchy for Tab Next + * 10. DS_CONTROL does not result in descending the hierarchy for Group Next + * 11. WS_EX_CONTROLPARENT results in descending the hierarchy for Tab Next + * 12. WS_EX_CONTROLPARENT results in descending the hierarchy for Group Next + * 13. WS_EX_CONTROLPARENT results in descending the hierarchy for Tab Prev + * 14. WS_EX_CONTROLPARENT results in descending the hierarchy for Group Prev + * + * Tests 15-24 are the basic Prev/Next Group tests + * + * 15. Next Group of a visible enabled non-group control is the next visible + * enabled non-group control, if there is one before the next group + * 16. Next Group of a visible enabled non-group control wraps around to the + * beginning of the group on finding a control that starts another group. + * Note that the group is in the middle of the dialog. + * 17. As 16 except note that the next group is started with a disabled + * visible control. + * 18. As 16 except note that the next group is started with an invisible + * enabled control. + * 19. Next Group wraps around the controls of the dialog + * 20. Next Group is the same even if the initial control is disabled. + * 21. Next Group is the same even if the initial control is invisible. + * 22. Next Group is the same even if the initial control has the group style + * 23. Next Group returns the initial control if there is no visible enabled + * control in the group. (Initial control disabled and not group style). + * 24. Prev version of test 16. + * Prev Group of a visible enabled non-group control wraps around to the + * beginning of the group on finding a control that starts the group. + * Note that the group is in the middle of the dialog. + * + * In tests 25 to 28 the control is sitting under dialogs which do not have + * the WS_EX_CONTROLPARENT style and so cannot be reached from the top of + * the dialog. + * + * 25. Next Group of an inaccessible control is as if it were accessible + * 26. Prev Group of an inaccessible control begins searching at the highest + * level ancestor that did not permit recursion down the hierarchy + * 27. Next Tab of an inaccessible control is as if it were accessible + * 28. Prev Tab of an inaccessible control begins searching at the highest + * level ancestor that did not permit recursion down the hierarchy. + * + * Tests 29- are the basic Tab tests + * + * 29. Next Tab of a control is the next visible enabled control with the + * Tabstop style (N.B. skips disabled, invisible and non-tabstop) + * 30. Prev Tab of a control is the previous visible enabled control with the + * Tabstop style (N.B. skips disabled, invisible and non-tabstop) + * 31. Next Tab test with at least two layers of descent and finding the + * result not at the first control. + * 32. Next Tab test with at least two layers of descent with the descent and + * control at the start of each level. + * 33. Prev Tab test with at least two layers of descent and finding the + * result not at the last control. + * 34. Prev Tab test with at least two layers of descent with the descent and + * control at the end of each level. + * + * 35. Passing NULL may result in the first child being the one returned. + * (group test) + * 36. Passing NULL may result in the first child being the one returned. + * (tab test) + */ + +static void GetNextDlgItemTest (void) +{ + static test_record test [] = + { + /* isok test dlg ctl tab prev res */ + + { 1, 1, 6, 0, 0, 1, 0}, + { 1, 2, 6, 0, 1, 1, 0}, + { 1, 3, 6, 6, 0, 1, 0}, + { 1, 4, 6, 6, 1, 1, 0}, + { 1, 5, 6, 0, 0, 0, 66}, + { 1, 6, 6, 0, 1, 0, 67}, + { 1, 7, 6, 6, 0, 0, 66}, + { 1, 8, 6, 6, 1, 0, 67}, + + { 1, 9, 4, 83, 1, 0, 84}, + { 1, 10, 4, 83, 0, 0, 5}, + { 1, 11, 5, 81, 1, 0, 67}, + { 1, 12, 5, 81, 0, 0, 66}, + { 1, 13, 5, 82, 1, 1, 78}, + + { 1, 14, 5, 82, 0, 1, 79}, + { 1, 15, 6, 70, 0, 0, 72}, + { 1, 16, 6, 72, 0, 0, 25}, + { 1, 17, 6, 75, 0, 0, 26}, + { 1, 18, 6, 77, 0, 0, 76}, + { 1, 19, 6, 79, 0, 0, 66}, + { 1, 20, 6, 71, 0, 0, 72}, + { 1, 21, 6, 64, 0, 0, 66}, + + { 1, 22, 6, 25, 0, 0, 70}, + { 1, 23, 6, 68, 0, 0, 68}, + { 1, 24, 6, 25, 0, 1, 72}, + { 1, 25, 1, 70, 0, 0, 72}, + { 0, 26, 1, 70, 0, 1, 3}, + { 1, 27, 1, 70, 1, 0, 72}, + { 0, 28, 1, 70, 1, 1, 61}, + + { 1, 29, 6, 67, 1, 0, 72}, + { 1, 30, 6, 72, 1, 1, 67}, + + { 1, 35, 2, 0, 0, 0, 60}, + { 1, 36, 2, 0, 1, 0, 60}, + + { 0, 0, 0, 0, 0, 0, 0} /* End of test */ + }; + const test_record *p = test; + + ok (CreateWindows (g_hinst), "Could not create test windows\n"); + + while (p->dlg) + { + HWND a; + a = (p->tab ? GetNextDlgTabItem : GetNextDlgGroupItem) (hwnd[p->dlg], hwnd[p->ctl], p->prev); + if (p->isok) + { + ok (a == hwnd[p->res], "Test %d: %s %s item of %d in %d was %d instead of %d\n", p->test, p->prev ? "Prev" : "Next", p->tab ? "Tab" : "Group", p->ctl, p->dlg, id(a), p->res); + } + else + { + todo_wine + { + ok (a == hwnd[p->res], "Test %d: %s %s item of %d in %d was actually %d matching expected %d\n", p->test, p->prev ? "Prev" : "Next", p->tab ? "Tab" : "Group", p->ctl, p->dlg, id(a), p->res); + } + } + p++; + } +} + +/* + * OnMainWindowCreate + */ +static BOOL OnMainWindowCreate (HWND hwnd, LPCREATESTRUCT lpcs) +{ + g_hwndButton1 = CreateWindow (TEXT("button"), TEXT("Button &1"), + WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_DEFPUSHBUTTON | BS_TEXT, + 10, 10, 80, 80, hwnd, (HMENU)100, g_hinst, 0); + if (!g_hwndButton1) return FALSE; + + g_hwndButton2 = CreateWindow (TEXT("button"), TEXT("Button &2"), + WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_TEXT, + 110, 10, 80, 80, hwnd, (HMENU)200, g_hinst, 0); + if (!g_hwndButton2) return FALSE; + + g_hwndButtonCancel = CreateWindow (TEXT("button"), TEXT("Cancel"), + WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON | BS_TEXT, + 210, 10, 80, 80, hwnd, (HMENU)IDCANCEL, g_hinst, 0); + if (!g_hwndButtonCancel) return FALSE; + + return TRUE; +} + + +static LRESULT CALLBACK main_window_procA (HWND hwnd, UINT uiMsg, WPARAM wParam, + LPARAM lParam) +{ + LRESULT result; + switch (uiMsg) + { + /* Add blank case statements for these to ensure we don't use them + * by mistake. + */ + case DM_GETDEFID: break; + case DM_SETDEFID: break; + + case WM_CREATE: + return (OnMainWindowCreate (hwnd, + (LPCREATESTRUCTA) lParam) ? 0 : (LRESULT) -1); + case WM_COMMAND: + if (wParam == IDCANCEL) + { + g_terminated = TRUE; + return 0; + } + break; + } + + result=DefWindowProcA (hwnd, uiMsg, wParam, lParam); + return result; +} + + +static BOOL RegisterWindowClasses (void) +{ + WNDCLASSA cls; + + cls.style = 0; + cls.lpfnWndProc = DefWindowProcA; + cls.cbClsExtra = 0; + cls.cbWndExtra = 0; + cls.hInstance = g_hinst; + cls.hIcon = NULL; + cls.hCursor = LoadCursorA (NULL, IDC_ARROW); + cls.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); + cls.lpszMenuName = NULL; + cls.lpszClassName = "GetNextDlgItemWindowClass"; + + if (!RegisterClassA (&cls)) return FALSE; + + cls.lpfnWndProc = main_window_procA; + cls.lpszClassName = "IsDialogMessageWindowClass"; + + if (!RegisterClassA (&cls)) return FALSE; + + return TRUE; +} + +static void IsDialogMessageWTest (void) +{ + MSG msg; + + g_hwndMain = CreateWindow ("IsDialogMessageWindowClass", "IsDialogMessageWindowClass", + WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + NULL, NULL, g_hinst, 0); + + assert (g_hwndMain); + assert (g_hwndButton1); + assert (g_hwndButtonCancel); + + /* The focus should initially be nowhere. The first TAB should take it + * to the first button. The second TAB should take it to the Cancel + * button. + */ + FormTabMsg (&msg, g_hwndMain); + ok (IsDialogMessage (g_hwndMain, &msg), "Did not handle first TAB\n"); + ok ((GetFocus() == g_hwndButton1), "Focus did not move to first button\n"); + FormTabMsg (&msg, g_hwndButton1); + ok (IsDialogMessage (g_hwndMain, &msg), "Did not handle second TAB\n"); + ok ((GetFocus() == g_hwndButtonCancel), + "Focus did not move to cancel button\n"); + FormEnterMsg (&msg, g_hwndButtonCancel); + ok (IsDialogMessage (g_hwndMain, &msg), "Did not handle the ENTER\n"); + ok (g_terminated, "ENTER did not terminate\n"); +} + +START_TEST(dialog) +{ + g_hinst = GetModuleHandleA (0); + + if (!RegisterWindowClasses()) assert(0); + + GetNextDlgItemTest(); + IsDialogMessageWTest(); +} diff --git a/reactos/apps/tests/user32/input.c b/reactos/apps/tests/user32/input.c index a1dc2579dde..f068f2ccf49 100644 --- a/reactos/apps/tests/user32/input.c +++ b/reactos/apps/tests/user32/input.c @@ -44,27 +44,12 @@ * */ -/* for definitions of INPUT */ #define _WIN32_WINNT 0x401 -#define NONAMELESSUNION -#define NONAMELESSSTRUCT #include "wine/test.h" - #include "winbase.h" #include "winuser.h" -typedef struct tagINPUT -{ - DWORD type; - union - { - MOUSEINPUT mi; - KEYBDINPUT ki; - HARDWAREINPUT hi; - } DUMMYUNIONNAME; -} INPUT, *PINPUT, *LPINPUT; - #include /* globals */ @@ -91,13 +76,25 @@ int GETUPDOWN[]={0, 0, KEYEVENTF_KEYUP, 0, KEYEVENTF_KEYUP, 0, KEYEVENTF_KEYUP, /* matching descripts */ char *getdesc[]={"", "+alt","-alt","+X","-X","+shift","-shift","+ctrl","-ctrl"}; +/* The MSVC headers ignore our NONAMELESSUNION requests so we have to define our own type */ +typedef struct +{ + DWORD type; + union + { + MOUSEINPUT mi; + KEYBDINPUT ki; + HARDWAREINPUT hi; + } u; +} TEST_INPUT; + #define ADDTOINPUTS(kev) \ inputs[evtctr].type = INPUT_KEYBOARD; \ - inputs[evtctr].u.ki.wVk = GETVKEY[ kev]; \ - inputs[evtctr].u.ki.wScan = GETSCAN[ kev]; \ - inputs[evtctr].u.ki.dwFlags = GETUPDOWN[ kev]; \ - inputs[evtctr].u.ki.dwExtraInfo = 0; \ - inputs[evtctr].u.ki.time = ++timetag; \ + ((TEST_INPUT*)inputs)[evtctr].u.ki.wVk = GETVKEY[ kev]; \ + ((TEST_INPUT*)inputs)[evtctr].u.ki.wScan = GETSCAN[ kev]; \ + ((TEST_INPUT*)inputs)[evtctr].u.ki.dwFlags = GETUPDOWN[ kev]; \ + ((TEST_INPUT*)inputs)[evtctr].u.ki.dwExtraInfo = 0; \ + ((TEST_INPUT*)inputs)[evtctr].u.ki.time = ++timetag; \ if( kev) evtctr++; typedef struct { @@ -210,7 +207,8 @@ void do_test( HWND hwnd, int seqnr, KEV td[] ) KMSG expmsg[MAXKEYEVENTS]; MSG msg; char buf[100]; - int evtctr=0, kmctr, i; + UINT evtctr=0; + int kmctr, i; buf[0]='\0'; TrackSysKey=0; /* see input.c */ for( i = 0; i < MAXKEYEVENTS; i++) { @@ -236,14 +234,14 @@ void do_test( HWND hwnd, int seqnr, KEV td[] ) msg.wParam == expmsg[i].wParam && msg.lParam == expmsg[i].lParam, "wrong message! expected:\n" - "message[%d] %-15s wParam %04x lParam %08lx",i, + "message[%d] %-15s wParam %04x lParam %08lx\n",i, MSGNAME[(expmsg[i]).message - WM_KEYFIRST], expmsg[i].wParam, expmsg[i].lParam ); } i++; } trace("%d messages retrieved\n", i); - ok( i == kmctr, "message count is wrong: got %d expected: %d", i, kmctr); + ok( i == kmctr, "message count is wrong: got %d expected: %d\n", i, kmctr); } /* test all combinations of the specified key events */ diff --git a/reactos/apps/tests/user32/listbox.c b/reactos/apps/tests/user32/listbox.c index ee2fc17ccd3..5304fbff55e 100644 --- a/reactos/apps/tests/user32/listbox.c +++ b/reactos/apps/tests/user32/listbox.c @@ -99,7 +99,7 @@ keypress (HWND handle, WPARAM keycode, BYTE scancode, BOOL extended) #define listbox_field_ok(t, s, f, got) \ ok (t.s.f==got.f, "style %#x, step " #s ", field " #f \ - ": expected %d, got %d", (unsigned int)t.prop.add_style, \ + ": expected %d, got %d\n", (unsigned int)t.prop.add_style, \ t.s.f, got.f) #define listbox_todo_field_ok(t, s, f, got) \ diff --git a/reactos/apps/tests/user32/makefile b/reactos/apps/tests/user32/makefile index 41d2e2add43..7929791fbc1 100644 --- a/reactos/apps/tests/user32/makefile +++ b/reactos/apps/tests/user32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.1 2003/11/18 22:24:42 sedwards Exp $ +# $Id: makefile,v 1.2 2004/02/14 20:13:04 sedwards Exp $ PATH_TO_TOP = ../../.. @@ -18,8 +18,10 @@ TARGET_SDKLIBS = gdi32.a user32.a TARGET_OBJECTS = \ testlist.o \ class.o \ + dialog.o \ listbox.o \ msg.o \ + resource.o \ sysparams.o \ win.o \ wsprintf.o diff --git a/reactos/apps/tests/user32/resource.c b/reactos/apps/tests/user32/resource.c new file mode 100644 index 00000000000..ef82349e34e --- /dev/null +++ b/reactos/apps/tests/user32/resource.c @@ -0,0 +1,59 @@ +/* Unit test suite for resources. + * + * Copyright 2004 Ferenc Wagner + * + * 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 "wine/test.h" + +void +test_LoadStringA (void) +{ + HINSTANCE hInst = GetModuleHandle (NULL); + const char str[] = "String resource"; /* same in resource.rc */ + char buf[128]; + struct string_test { + int bufsiz; + int expected; + }; + struct string_test tests[] = {{sizeof buf, sizeof str - 1}, + {sizeof str, sizeof str - 1}, + {sizeof str - 1, sizeof str - 2}}; + int i; + + assert (sizeof str < sizeof buf); + for (i = 0; i < sizeof tests / sizeof tests[0]; i++) { + const int bufsiz = tests[i].bufsiz; + const int expected = tests[i].expected; + const int len = LoadStringA (hInst, 0, buf, bufsiz); + + ok (len == expected, "bufsiz=%d: got %d, expected %d\n", + bufsiz, len, expected); + ok (!memcmp (buf, str, len), + "bufsiz=%d: got '%s', expected '%.*s'\n", + bufsiz, buf, len, str); + ok (buf[len] == 0, "bufsiz=%d: NUL termination missing\n", + bufsiz); + } +} + +START_TEST(resource) +{ + test_LoadStringA (); +} diff --git a/reactos/apps/tests/user32/sysparams.c b/reactos/apps/tests/user32/sysparams.c index d68f57cb983..21dfa7fcc81 100644 --- a/reactos/apps/tests/user32/sysparams.c +++ b/reactos/apps/tests/user32/sysparams.c @@ -133,10 +133,10 @@ static void test_change_message( int action, int optional ) if (change_counter==0 && optional==1) return; ok( 1 == change_counter, - "Missed a message: change_counter=%d", change_counter ); + "Missed a message: change_counter=%d\n", change_counter ); change_counter = 0; ok( action == change_last_param, - "Wrong action got %d expected %d", change_last_param, action ); + "Wrong action got %d expected %d\n", change_last_param, action ); change_last_param = 0; } @@ -166,13 +166,13 @@ static void _test_reg_key( LPCSTR subKey1, LPCSTR subKey2, LPCSTR valName, LPCST if (rc==ERROR_SUCCESS) { ok( !strcmp( testValue, value ), - "Wrong value in registry: subKey=%s, valName=%s, testValue=%s, value=%s", + "Wrong value in registry: subKey=%s, valName=%s, testValue=%s, value=%s\n", subKey1, valName, testValue, value ); found++; } else if (strict) { - ok(0,"Missing registry entry: subKey=%s, valName=%s", + ok(0,"Missing registry entry: subKey=%s, valName=%s\n", subKey1, valName); } if (subKey2 && !strict) @@ -185,12 +185,12 @@ static void _test_reg_key( LPCSTR subKey1, LPCSTR subKey2, LPCSTR valName, LPCST if (rc==ERROR_SUCCESS) { ok( !strcmp( testValue, value ), - "Wrong value in registry: subKey=%s, valName=%s, testValue=%s, value=%s", + "Wrong value in registry: subKey=%s, valName=%s, testValue=%s, value=%s\n", subKey2, valName, testValue, value ); found++; } } - ok(found,"Missing registry entry: %s in %s or %s", + ok(found,"Missing registry entry: %s in %s or %s\n", valName, subKey1, (subKey2?subKey2:"") ); } @@ -250,7 +250,7 @@ static void test_SPI_SETBEEP( void ) /* 2 */ ok(rc!=0,"SystemParametersInfoW: rc=%d err=%ld\n",rc,GetLastError()); eq( b, curr_val, "SystemParametersInfoW", "%d" ); } - ok( MessageBeep( MB_OK ), "Return value of MessageBeep when sound is disabled" ); + ok( MessageBeep( MB_OK ), "Return value of MessageBeep when sound is disabled\n" ); rc=SystemParametersInfoA( SPI_SETBEEP, old_b, 0, SPIF_UPDATEINIFILE ); ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError()); @@ -294,7 +294,7 @@ static void run_spi_setmouse_test( int curr_val[], POINT *req_change, POINT *pro for (i = 0; i < 3; i++) { ok(mi[i] == curr_val[i], - "incorrect value for %d: %d != %d", i, mi[i], curr_val[i]); + "incorrect value for %d: %d != %d\n", i, mi[i], curr_val[i]); } rc=SystemParametersInfoW( SPI_GETMOUSE, 0, mi, 0 ); @@ -304,7 +304,7 @@ static void run_spi_setmouse_test( int curr_val[], POINT *req_change, POINT *pro for (i = 0; i < 3; i++) { ok(mi[i] == curr_val[i], - "incorrect value for %d: %d != %d", i, mi[i], curr_val[i]); + "incorrect value for %d: %d != %d\n", i, mi[i], curr_val[i]); } } @@ -315,8 +315,8 @@ static void run_spi_setmouse_test( int curr_val[], POINT *req_change, POINT *pro mouse_event( MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 0, 0, 0, 0 ); mouse_event( MOUSEEVENTF_MOVE, req_change[i].x, req_change[i].y, 0, 0 ); GetCursorPos( &mv ); - ok( proj_change[i].x == mv.x, "Projected dx and real dx comparison. May fail under high load." ); - ok( proj_change[i].y == mv.y, "Projected dy equals real dy. May fail under high load." ); + ok( proj_change[i].x == mv.x, "Projected dx and real dx comparison. May fail under high load.\n" ); + ok( proj_change[i].y == mv.y, "Projected dy equals real dy. May fail under high load.\n" ); } #endif } diff --git a/reactos/apps/tests/user32/testlist.c b/reactos/apps/tests/user32/testlist.c index ad55c1afea0..677dd6907be 100644 --- a/reactos/apps/tests/user32/testlist.c +++ b/reactos/apps/tests/user32/testlist.c @@ -7,8 +7,10 @@ #include "winbase.h" extern void func_class(void); +extern void func_dialog(void); extern void func_listbox(void); extern void func_msg(void); +extern void func_resource(void); extern void func_sysparams(void); extern void func_win(void); extern void func_wsprintf(void); @@ -22,8 +24,10 @@ struct test static const struct test winetest_testlist[] = { { "class", func_class }, + { "dialog", func_dialog }, { "listbox", func_listbox }, { "msg", func_msg }, + { "resource", func_resource }, { "sysparams", func_sysparams }, { "win", func_win }, { "wsprintf", func_wsprintf }, diff --git a/reactos/apps/tests/user32/win.c b/reactos/apps/tests/user32/win.c index 455b1d37d48..1ee400d6da5 100644 --- a/reactos/apps/tests/user32/win.c +++ b/reactos/apps/tests/user32/win.c @@ -3,6 +3,7 @@ * * Copyright 2002 Bill Medland * Copyright 2002 Alexandre Julliard + * 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 @@ -19,6 +20,9 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/* To get ICON_SMALL2 with the MSVC headers */ +#define _WIN32_WINNT 0x0501 + #include #include #include @@ -31,8 +35,6 @@ #include "wine/test.h" -HWND WINAPI GetShellWindow(void); - #ifndef SPI_GETDESKWALLPAPER #define SPI_GETDESKWALLPAPER 0x0073 #endif @@ -54,20 +56,20 @@ static void check_parents( HWND hwnd, HWND ga_parent, HWND gwl_parent, HWND get_ if (pGetAncestor) { res = pGetAncestor( hwnd, GA_PARENT ); - ok( res == ga_parent, "Wrong result for GA_PARENT %p expected %p", res, ga_parent ); + ok( res == ga_parent, "Wrong result for GA_PARENT %p expected %p\n", res, ga_parent ); } res = (HWND)GetWindowLongA( hwnd, GWL_HWNDPARENT ); - ok( res == gwl_parent, "Wrong result for GWL_HWNDPARENT %p expected %p", res, gwl_parent ); + ok( res == gwl_parent, "Wrong result for GWL_HWNDPARENT %p expected %p\n", res, gwl_parent ); res = GetParent( hwnd ); - ok( res == get_parent, "Wrong result for GetParent %p expected %p", res, get_parent ); + ok( res == get_parent, "Wrong result for GetParent %p expected %p\n", res, get_parent ); res = GetWindow( hwnd, GW_OWNER ); - ok( res == gw_owner, "Wrong result for GW_OWNER %p expected %p", res, gw_owner ); + ok( res == gw_owner, "Wrong result for GW_OWNER %p expected %p\n", res, gw_owner ); if (pGetAncestor) { res = pGetAncestor( hwnd, GA_ROOT ); - ok( res == ga_root, "Wrong result for GA_ROOT %p expected %p", res, ga_root ); + ok( res == ga_root, "Wrong result for GA_ROOT %p expected %p\n", res, ga_root ); res = pGetAncestor( hwnd, GA_ROOTOWNER ); - ok( res == ga_root_owner, "Wrong result for GA_ROOTOWNER %p expected %p", res, ga_root_owner ); + ok( res == ga_root_owner, "Wrong result for GA_ROOTOWNER %p expected %p\n", res, ga_root_owner ); } } @@ -76,7 +78,7 @@ static HWND create_tool_window( LONG style, HWND parent ) { HWND ret = CreateWindowExA(0, "ToolWindowClass", "Tool window 1", style, 0, 0, 100, 100, parent, 0, 0, NULL ); - ok( ret != 0, "Creation failed" ); + ok( ret != 0, "Creation failed\n" ); return ret; } @@ -93,14 +95,14 @@ static void test_parent_owner(void) /* child without parent, should fail */ test = CreateWindowExA(0, "ToolWindowClass", "Tool window 1", WS_CHILD, 0, 0, 100, 100, 0, 0, 0, NULL ); - ok( !test, "WS_CHILD without parent created" ); + ok( !test, "WS_CHILD without parent created\n" ); /* desktop window */ check_parents( desktop, 0, 0, 0, 0, 0, 0 ); style = GetWindowLongA( desktop, GWL_STYLE ); - ok( !SetWindowLongA( desktop, GWL_STYLE, WS_POPUP ), "Set GWL_STYLE on desktop succeeded" ); - ok( !SetWindowLongA( desktop, GWL_STYLE, 0 ), "Set GWL_STYLE on desktop succeeded" ); - ok( GetWindowLongA( desktop, GWL_STYLE ) == style, "Desktop style changed" ); + ok( !SetWindowLongA( desktop, GWL_STYLE, WS_POPUP ), "Set GWL_STYLE on desktop succeeded\n" ); + ok( !SetWindowLongA( desktop, GWL_STYLE, 0 ), "Set GWL_STYLE on desktop succeeded\n" ); + ok( GetWindowLongA( desktop, GWL_STYLE ) == style, "Desktop style changed\n" ); /* normal child window */ test = create_tool_window( WS_CHILD, hwndMain ); @@ -276,9 +278,9 @@ static void test_parent_owner(void) check_parents( desktop, 0, 0, 0, 0, 0, 0 ); #if 0 /* this test succeeds on NT but crashes on win9x systems */ ret = (HWND)SetWindowLongA( test, GWL_HWNDPARENT, (LONG_PTR)hwndMain2 ); - ok( !ret, "Set GWL_HWNDPARENT succeeded on desktop" ); + ok( !ret, "Set GWL_HWNDPARENT succeeded on desktop\n" ); check_parents( desktop, 0, 0, 0, 0, 0, 0 ); - ok( !SetParent( desktop, hwndMain ), "SetParent succeeded on desktop" ); + ok( !SetParent( desktop, hwndMain ), "SetParent succeeded on desktop\n" ); check_parents( desktop, 0, 0, 0, 0, 0, 0 ); #endif /* normal child window */ @@ -286,24 +288,24 @@ static void test_parent_owner(void) trace( "created child %p\n", test ); ret = (HWND)SetWindowLongA( test, GWL_HWNDPARENT, (LONG_PTR)hwndMain2 ); - ok( ret == hwndMain, "GWL_HWNDPARENT return value %p expected %p", ret, hwndMain ); + ok( ret == hwndMain, "GWL_HWNDPARENT return value %p expected %p\n", ret, hwndMain ); check_parents( test, hwndMain2, hwndMain2, hwndMain2, 0, hwndMain2, hwndMain2 ); ret = (HWND)SetWindowLongA( test, GWL_HWNDPARENT, (LONG_PTR)child ); - ok( ret == hwndMain2, "GWL_HWNDPARENT return value %p expected %p", ret, hwndMain2 ); + ok( ret == hwndMain2, "GWL_HWNDPARENT return value %p expected %p\n", ret, hwndMain2 ); check_parents( test, child, child, child, 0, hwndMain, hwndMain ); ret = (HWND)SetWindowLongA( test, GWL_HWNDPARENT, (LONG_PTR)desktop ); - ok( ret == child, "GWL_HWNDPARENT return value %p expected %p", ret, child ); + ok( ret == child, "GWL_HWNDPARENT return value %p expected %p\n", ret, child ); check_parents( test, desktop, 0, desktop, 0, test, desktop ); /* window is now child of desktop so GWL_HWNDPARENT changes owner from now on */ ret = (HWND)SetWindowLongA( test, GWL_HWNDPARENT, (LONG_PTR)child ); - ok( ret == 0, "GWL_HWNDPARENT return value %p expected 0", ret ); + ok( ret == 0, "GWL_HWNDPARENT return value %p expected 0\n", ret ); check_parents( test, desktop, child, desktop, child, test, desktop ); ret = (HWND)SetWindowLongA( test, GWL_HWNDPARENT, 0 ); - ok( ret == child, "GWL_HWNDPARENT return value %p expected %p", ret, child ); + ok( ret == child, "GWL_HWNDPARENT return value %p expected %p\n", ret, child ); check_parents( test, desktop, 0, desktop, 0, test, desktop ); DestroyWindow( test ); @@ -312,15 +314,15 @@ static void test_parent_owner(void) trace( "created top-level %p\n", test ); ret = (HWND)SetWindowLongA( test, GWL_HWNDPARENT, (LONG_PTR)hwndMain2 ); - ok( ret == 0, "GWL_HWNDPARENT return value %p expected 0", ret ); + ok( ret == 0, "GWL_HWNDPARENT return value %p expected 0\n", ret ); check_parents( test, desktop, hwndMain2, 0, hwndMain2, test, test ); ret = (HWND)SetWindowLongA( test, GWL_HWNDPARENT, (LONG_PTR)child ); - ok( ret == hwndMain2, "GWL_HWNDPARENT return value %p expected %p", ret, hwndMain2 ); + ok( ret == hwndMain2, "GWL_HWNDPARENT return value %p expected %p\n", ret, hwndMain2 ); check_parents( test, desktop, child, 0, child, test, test ); ret = (HWND)SetWindowLongA( test, GWL_HWNDPARENT, 0 ); - ok( ret == child, "GWL_HWNDPARENT return value %p expected %p", ret, child ); + ok( ret == child, "GWL_HWNDPARENT return value %p expected %p\n", ret, child ); check_parents( test, desktop, 0, 0, 0, test, test ); DestroyWindow( test ); @@ -329,15 +331,15 @@ static void test_parent_owner(void) trace( "created popup %p\n", test ); ret = (HWND)SetWindowLongA( test, GWL_HWNDPARENT, (LONG_PTR)hwndMain2 ); - ok( ret == 0, "GWL_HWNDPARENT return value %p expected 0", ret ); + ok( ret == 0, "GWL_HWNDPARENT return value %p expected 0\n", ret ); check_parents( test, desktop, hwndMain2, hwndMain2, hwndMain2, test, hwndMain2 ); ret = (HWND)SetWindowLongA( test, GWL_HWNDPARENT, (LONG_PTR)child ); - ok( ret == hwndMain2, "GWL_HWNDPARENT return value %p expected %p", ret, hwndMain2 ); + ok( ret == hwndMain2, "GWL_HWNDPARENT return value %p expected %p\n", ret, hwndMain2 ); check_parents( test, desktop, child, child, child, test, hwndMain ); ret = (HWND)SetWindowLongA( test, GWL_HWNDPARENT, 0 ); - ok( ret == child, "GWL_HWNDPARENT return value %p expected %p", ret, child ); + ok( ret == child, "GWL_HWNDPARENT return value %p expected %p\n", ret, child ); check_parents( test, desktop, 0, 0, 0, test, test ); DestroyWindow( test ); @@ -346,15 +348,15 @@ static void test_parent_owner(void) trace( "created child %p\n", test ); ret = SetParent( test, desktop ); - ok( ret == hwndMain, "SetParent return value %p expected %p", ret, hwndMain ); + ok( ret == hwndMain, "SetParent return value %p expected %p\n", ret, hwndMain ); check_parents( test, desktop, 0, desktop, 0, test, desktop ); ret = SetParent( test, child ); - ok( ret == desktop, "SetParent return value %p expected %p", ret, desktop ); + ok( ret == desktop, "SetParent return value %p expected %p\n", ret, desktop ); check_parents( test, child, child, child, 0, hwndMain, hwndMain ); ret = SetParent( test, hwndMain2 ); - ok( ret == child, "SetParent return value %p expected %p", ret, child ); + ok( ret == child, "SetParent return value %p expected %p\n", ret, child ); check_parents( test, hwndMain2, hwndMain2, hwndMain2, 0, hwndMain2, hwndMain2 ); DestroyWindow( test ); @@ -363,7 +365,7 @@ static void test_parent_owner(void) trace( "created top-level %p\n", test ); ret = SetParent( test, child ); - ok( ret == desktop, "SetParent return value %p expected %p", ret, desktop ); + ok( ret == desktop, "SetParent return value %p expected %p\n", ret, desktop ); check_parents( test, child, child, 0, 0, hwndMain, test ); DestroyWindow( test ); @@ -372,11 +374,11 @@ static void test_parent_owner(void) trace( "created owned popup %p\n", test ); ret = SetParent( test, child ); - ok( ret == desktop, "SetParent return value %p expected %p", ret, desktop ); + ok( ret == desktop, "SetParent return value %p expected %p\n", ret, desktop ); check_parents( test, child, child, hwndMain2, hwndMain2, hwndMain, hwndMain2 ); ret = (HWND)SetWindowLongA( test, GWL_HWNDPARENT, (ULONG_PTR)hwndMain ); - ok( ret == child, "GWL_HWNDPARENT return value %p expected %p", ret, child ); + ok( ret == child, "GWL_HWNDPARENT return value %p expected %p\n", ret, child ); check_parents( test, hwndMain, hwndMain, hwndMain2, hwndMain2, hwndMain, hwndMain2 ); DestroyWindow( test ); @@ -387,13 +389,13 @@ static void test_parent_owner(void) test = create_tool_window( WS_POPUP, owner ); trace( "created owner %p and popup %p\n", owner, test ); ret = SetParent( test, child ); - ok( ret == desktop, "SetParent return value %p expected %p", ret, desktop ); + ok( ret == desktop, "SetParent return value %p expected %p\n", ret, desktop ); check_parents( test, child, child, owner, owner, hwndMain, owner ); /* window is now child of 'child' but owned by 'owner' */ DestroyWindow( owner ); - ok( IsWindow(test), "Window %p destroyed by owner destruction", test ); + ok( IsWindow(test), "Window %p destroyed by owner destruction\n", test ); check_parents( test, child, child, owner, owner, hwndMain, owner ); - ok( !IsWindow(owner), "Owner %p not destroyed", owner ); + ok( !IsWindow(owner), "Owner %p not destroyed\n", owner ); DestroyWindow(test); /* owned top-level popup */ @@ -402,18 +404,18 @@ static void test_parent_owner(void) trace( "created owner %p and popup %p\n", owner, test ); check_parents( test, desktop, owner, owner, owner, test, owner ); DestroyWindow( owner ); - ok( !IsWindow(test), "Window %p not destroyed by owner destruction", test ); + ok( !IsWindow(test), "Window %p not destroyed by owner destruction\n", test ); /* top-level popup owned by child */ owner = create_tool_window( WS_CHILD, hwndMain2 ); test = create_tool_window( WS_POPUP, 0 ); trace( "created owner %p and popup %p\n", owner, test ); ret = (HWND)SetWindowLongA( test, GWL_HWNDPARENT, (ULONG_PTR)owner ); - ok( ret == 0, "GWL_HWNDPARENT return value %p expected 0", ret ); + ok( ret == 0, "GWL_HWNDPARENT return value %p expected 0\n", ret ); check_parents( test, desktop, owner, owner, owner, test, hwndMain2 ); DestroyWindow( owner ); - ok( IsWindow(test), "Window %p destroyed by owner destruction", test ); - ok( !IsWindow(owner), "Owner %p not destroyed", owner ); + ok( IsWindow(test), "Window %p destroyed by owner destruction\n", test ); + ok( !IsWindow(owner), "Owner %p not destroyed\n", owner ); check_parents( test, desktop, owner, owner, owner, test, owner ); DestroyWindow(test); @@ -554,10 +556,17 @@ static LRESULT CALLBACK cbt_hook_proc(int nCode, WPARAM wParam, LPARAM lParam) { case HCBT_CREATEWND: { + DWORD style; CBT_CREATEWNDA *createwnd = (CBT_CREATEWNDA *)lParam; trace("HCBT_CREATEWND: hwnd %p, parent %p, style %08lx\n", (HWND)wParam, createwnd->lpcs->hwndParent, createwnd->lpcs->style); ok(createwnd->hwndInsertAfter == HWND_TOP, "hwndInsertAfter should be always HWND_TOP\n"); + + /* WS_VISIBLE should be turned off yet */ + style = createwnd->lpcs->style & ~WS_VISIBLE; + ok(style == GetWindowLongA((HWND)wParam, GWL_STYLE), + "style of hwnd and style in the CREATESTRUCT do not match: %08lx != %08lx\n", + GetWindowLongA((HWND)wParam, GWL_STYLE), style); break; } } @@ -599,7 +608,7 @@ static void test_shell_window() GetWindowThreadProcessId(shellWindow, &pid); hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); ret = TerminateProcess(hProcess, 0); - ok(ret, "termination of previous shell process failed: GetLastError()=%ld", GetLastError()); + ok(ret, "termination of previous shell process failed: GetLastError()=%ld\n", GetLastError()); WaitForSingleObject(hProcess, INFINITE); /* wait for termination */ CloseHandle(hProcess); } @@ -610,7 +619,7 @@ static void test_shell_window() ret = SetShellWindow(hwnd1); ok(ret, "first call to SetShellWindow(hwnd1)\n"); shellWindow = GetShellWindow(); - ok(shellWindow==hwnd1, "wrong shell window: %p", shellWindow); + ok(shellWindow==hwnd1, "wrong shell window: %p\n", shellWindow); ret = SetShellWindow(hwnd1); ok(!ret, "second call to SetShellWindow(hwnd1)\n"); @@ -638,7 +647,7 @@ static void test_shell_window() hwnd2 = CreateWindowEx(WS_EX_TOPMOST, TEXT("#32770"), TEXT("TEST2"), WS_OVERLAPPEDWINDOW/*|WS_VISIBLE*/, 150, 250, 300, 200, 0, 0, hinst, 0); trace("created window 2: %p\n", hwnd2); ret = SetShellWindow(hwnd2); - ok(!ret, "SetShellWindow(hwnd2) with WS_EX_TOPMOST"); + ok(!ret, "SetShellWindow(hwnd2) with WS_EX_TOPMOST\n"); hwnd3 = CreateWindowEx(0, TEXT("#32770"), TEXT("TEST3"), WS_OVERLAPPEDWINDOW/*|WS_VISIBLE*/, 200, 400, 300, 200, 0, 0, hinst, 0); trace("created window 3: %p\n", hwnd3); @@ -652,7 +661,7 @@ static void test_shell_window() ret = SetShellWindow(hwnd4); ok(ret, "SetShellWindow(hwnd4)\n"); shellWindow = GetShellWindow(); - ok(shellWindow==hwnd4, "wrong shell window: %p - expected hwnd4", shellWindow); + ok(shellWindow==hwnd4, "wrong shell window: %p - expected hwnd4\n", shellWindow); nextWnd = GetWindow(hwnd4, GW_HWNDNEXT); ok(nextWnd==0, "wrong next window for hwnd4: %p - expected 0\n", nextWnd); @@ -661,12 +670,12 @@ static void test_shell_window() ok(ret, "SetWindowPos(hwnd4, HWND_TOPMOST)\n"); ret = SetWindowPos(hwnd4, hwnd3, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE); - ok(ret, "SetWindowPos(hwnd4, hwnd3"); + ok(ret, "SetWindowPos(hwnd4, hwnd3\n"); ret = SetShellWindow(hwnd3); ok(!ret, "SetShellWindow(hwnd3)\n"); shellWindow = GetShellWindow(); - ok(shellWindow==hwnd4, "wrong shell window: %p - expected hwnd4", shellWindow); + ok(shellWindow==hwnd4, "wrong shell window: %p - expected hwnd4\n", shellWindow); hwnd5 = CreateWindowEx(0, TEXT("#32770"), TEXT("TEST5"), WS_OVERLAPPEDWINDOW/*|WS_VISIBLE*/, 300, 600, 300, 200, 0, 0, hinst, 0); trace("created window 5: %p\n", hwnd5); @@ -686,6 +695,441 @@ static void test_shell_window() DestroyWindow(hwnd5); } +/************** MDI test ****************/ + +static const char mdi_lParam_test_message[] = "just a test string"; + +static void test_MDI_create(HWND parent, HWND mdi_client) +{ + MDICREATESTRUCTA mdi_cs; + HWND mdi_child; + static const WCHAR classW[] = {'M','D','I','_','c','h','i','l','d','_','C','l','a','s','s','_','1',0}; + static const WCHAR titleW[] = {'M','D','I',' ','c','h','i','l','d',0}; + BOOL isWin9x = FALSE; + + mdi_cs.szClass = "MDI_child_Class_1"; + mdi_cs.szTitle = "MDI child"; + mdi_cs.hOwner = GetModuleHandle(0); + mdi_cs.x = CW_USEDEFAULT; + mdi_cs.y = CW_USEDEFAULT; + mdi_cs.cx = CW_USEDEFAULT; + mdi_cs.cy = CW_USEDEFAULT; + mdi_cs.style = 0; + mdi_cs.lParam = (LPARAM)mdi_lParam_test_message; + mdi_child = (HWND)SendMessageA(mdi_client, WM_MDICREATE, 0, (LPARAM)&mdi_cs); + ok(mdi_child != 0, "MDI child creation failed\n"); + DestroyWindow(mdi_child); + + mdi_cs.style = 0x7fffffff; /* without WS_POPUP */ + mdi_child = (HWND)SendMessageA(mdi_client, WM_MDICREATE, 0, (LPARAM)&mdi_cs); + ok(mdi_child != 0, "MDI child creation failed\n"); + DestroyWindow(mdi_child); + + mdi_cs.style = 0xffffffff; /* with WS_POPUP */ + mdi_child = (HWND)SendMessageA(mdi_client, WM_MDICREATE, 0, (LPARAM)&mdi_cs); + if (GetWindowLongA(mdi_client, GWL_STYLE) & MDIS_ALLCHILDSTYLES) + { + ok(!mdi_child, "MDI child with WS_POPUP and with MDIS_ALLCHILDSTYLES should fail\n"); + DestroyWindow(mdi_child); + } + else + ok(mdi_child != 0, "MDI child creation failed\n"); + + /* test MDICREATESTRUCT A<->W mapping */ + /* MDICREATESTRUCTA and MDICREATESTRUCTW have the same layout */ + mdi_cs.style = 0; + mdi_cs.szClass = (LPCSTR)classW; + mdi_cs.szTitle = (LPCSTR)titleW; + SetLastError(0xdeadbeef); + mdi_child = (HWND)SendMessageW(mdi_client, WM_MDICREATE, 0, (LPARAM)&mdi_cs); + if (!mdi_child) + { + if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + isWin9x = TRUE; + else + ok(mdi_child != 0, "MDI child creation failed\n"); + } + DestroyWindow(mdi_child); + + mdi_child = CreateMDIWindowA("MDI_child_Class_1", "MDI child", + 0, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + mdi_client, GetModuleHandle(0), + (LPARAM)mdi_lParam_test_message); + ok(mdi_child != 0, "MDI child creation failed\n"); + DestroyWindow(mdi_child); + + mdi_child = CreateMDIWindowA("MDI_child_Class_1", "MDI child", + 0x7fffffff, /* without WS_POPUP */ + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + mdi_client, GetModuleHandle(0), + (LPARAM)mdi_lParam_test_message); + ok(mdi_child != 0, "MDI child creation failed\n"); + DestroyWindow(mdi_child); + + mdi_child = CreateMDIWindowA("MDI_child_Class_1", "MDI child", + 0xffffffff, /* with WS_POPUP */ + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + mdi_client, GetModuleHandle(0), + (LPARAM)mdi_lParam_test_message); + if (GetWindowLongA(mdi_client, GWL_STYLE) & MDIS_ALLCHILDSTYLES) + { + ok(!mdi_child, "MDI child with WS_POPUP and with MDIS_ALLCHILDSTYLES should fail\n"); + DestroyWindow(mdi_child); + } + else + ok(mdi_child != 0, "MDI child creation failed\n"); + + /* test MDICREATESTRUCT A<->W mapping */ + SetLastError(0xdeadbeef); + mdi_child = CreateMDIWindowW(classW, titleW, + 0, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + mdi_client, GetModuleHandle(0), + (LPARAM)mdi_lParam_test_message); + if (!mdi_child) + { + if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + isWin9x = TRUE; + else + ok(mdi_child != 0, "MDI child creation failed\n"); + } + DestroyWindow(mdi_child); + + mdi_child = CreateWindowExA(WS_EX_MDICHILD, "MDI_child_Class_1", "MDI child", + 0, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + mdi_client, 0, GetModuleHandle(0), + (LPVOID)mdi_lParam_test_message); + ok(mdi_child != 0, "MDI child creation failed\n"); + DestroyWindow(mdi_child); + + mdi_child = CreateWindowExA(WS_EX_MDICHILD, "MDI_child_Class_1", "MDI child", + 0x7fffffff, /* without WS_POPUP */ + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + mdi_client, 0, GetModuleHandle(0), + (LPVOID)mdi_lParam_test_message); + ok(mdi_child != 0, "MDI child creation failed\n"); + DestroyWindow(mdi_child); + + mdi_child = CreateWindowExA(WS_EX_MDICHILD, "MDI_child_Class_1", "MDI child", + 0xffffffff, /* with WS_POPUP */ + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + mdi_client, 0, GetModuleHandle(0), + (LPVOID)mdi_lParam_test_message); + if (GetWindowLongA(mdi_client, GWL_STYLE) & MDIS_ALLCHILDSTYLES) + { + ok(!mdi_child, "MDI child with WS_POPUP and with MDIS_ALLCHILDSTYLES should fail\n"); + DestroyWindow(mdi_child); + } + else + ok(mdi_child != 0, "MDI child creation failed\n"); + + /* test MDICREATESTRUCT A<->W mapping */ + SetLastError(0xdeadbeef); + mdi_child = CreateWindowExW(WS_EX_MDICHILD, classW, titleW, + 0, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + mdi_client, 0, GetModuleHandle(0), + (LPVOID)mdi_lParam_test_message); + if (!mdi_child) + { + if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + isWin9x = TRUE; + else + ok(mdi_child != 0, "MDI child creation failed\n"); + } + DestroyWindow(mdi_child); + + /* This test fails on Win9x */ + if (!isWin9x) + { + mdi_child = CreateWindowExA(WS_EX_MDICHILD, "MDI_child_Class_2", "MDI child", + WS_CHILD, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + parent, 0, GetModuleHandle(0), + (LPVOID)mdi_lParam_test_message); + ok(!mdi_child, "WS_EX_MDICHILD with a not MDIClient parent should fail\n"); + } + + mdi_child = CreateWindowExA(0, "MDI_child_Class_2", "MDI child", + WS_CHILD, /* without WS_POPUP */ + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + mdi_client, 0, GetModuleHandle(0), + (LPVOID)mdi_lParam_test_message); + ok(mdi_child != 0, "MDI child creation failed\n"); + DestroyWindow(mdi_child); + + mdi_child = CreateWindowExA(0, "MDI_child_Class_2", "MDI child", + WS_CHILD | WS_POPUP, /* with WS_POPUP */ + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + mdi_client, 0, GetModuleHandle(0), + (LPVOID)mdi_lParam_test_message); + ok(mdi_child != 0, "MDI child creation failed\n"); + DestroyWindow(mdi_child); +} + +static LRESULT WINAPI mdi_child_wnd_proc_1(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) +{ + switch (msg) + { + case WM_NCCREATE: + case WM_CREATE: + { + CREATESTRUCTA *cs = (CREATESTRUCTA *)lparam; + MDICREATESTRUCTA *mdi_cs = (MDICREATESTRUCTA *)cs->lpCreateParams; + + ok(cs->dwExStyle & WS_EX_MDICHILD, "WS_EX_MDICHILD should be set\n"); + ok(mdi_cs->lParam == (LPARAM)mdi_lParam_test_message, "wrong mdi_cs->lParam\n"); + + ok(!lstrcmpA(cs->lpszClass, "MDI_child_Class_1"), "wrong class name\n"); + ok(!lstrcmpA(cs->lpszClass, mdi_cs->szClass), "class name does not match\n"); + ok(!lstrcmpA(cs->lpszName, "MDI child"), "wrong title\n"); + ok(!lstrcmpA(cs->lpszName, mdi_cs->szTitle), "title does not match\n"); + ok(cs->hInstance == mdi_cs->hOwner, "%p != %p\n", cs->hInstance, mdi_cs->hOwner); + + /* MDICREATESTRUCT should have original values */ + ok(mdi_cs->style == 0 || mdi_cs->style == 0x7fffffff || mdi_cs->style == 0xffffffff, + "mdi_cs->style does not match (%08lx)\n", mdi_cs->style); + ok(mdi_cs->x == CW_USEDEFAULT, "%d != CW_USEDEFAULT\n", mdi_cs->x); + ok(mdi_cs->y == CW_USEDEFAULT, "%d != CW_USEDEFAULT\n", mdi_cs->y); + ok(mdi_cs->cx == CW_USEDEFAULT, "%d != CW_USEDEFAULT\n", mdi_cs->cx); + ok(mdi_cs->cy == CW_USEDEFAULT, "%d != CW_USEDEFAULT\n", mdi_cs->cy); + + /* CREATESTRUCT should have fixed values */ + ok(cs->x != CW_USEDEFAULT, "%d == CW_USEDEFAULT\n", cs->x); + ok(cs->y != CW_USEDEFAULT, "%d == CW_USEDEFAULT\n", cs->y); + + /* cx/cy == CW_USEDEFAULT are translated to NOT zero values */ + ok(cs->cx != CW_USEDEFAULT && cs->cx != 0, "%d == CW_USEDEFAULT\n", cs->cx); + ok(cs->cy != CW_USEDEFAULT && cs->cy != 0, "%d == CW_USEDEFAULT\n", cs->cy); + + ok(!(cs->style & WS_POPUP), "WS_POPUP is not allowed\n"); + + if (GetWindowLongA(cs->hwndParent, GWL_STYLE) & MDIS_ALLCHILDSTYLES) + { + ok(cs->style == (mdi_cs->style | WS_CHILD | WS_CLIPSIBLINGS), + "cs->style does not match (%08lx)\n", cs->style); + } + else + { + DWORD style = mdi_cs->style; + style &= ~WS_POPUP; + style |= WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX; + ok(cs->style == style, + "cs->style does not match (%08lx)\n", cs->style); + } + break; + } + } + return DefMDIChildProcA(hwnd, msg, wparam, lparam); +} + +static LRESULT WINAPI mdi_child_wnd_proc_2(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) +{ + switch (msg) + { + case WM_NCCREATE: + case WM_CREATE: + { + CREATESTRUCTA *cs = (CREATESTRUCTA *)lparam; + + ok(!(cs->dwExStyle & WS_EX_MDICHILD), "WS_EX_MDICHILD should not be set\n"); + ok(cs->lpCreateParams == mdi_lParam_test_message, "wrong cs->lpCreateParams\n"); + + ok(!lstrcmpA(cs->lpszClass, "MDI_child_Class_2"), "wrong class name\n"); + ok(!lstrcmpA(cs->lpszName, "MDI child"), "wrong title\n"); + + /* CREATESTRUCT should have fixed values */ + /* For some reason Win9x doesn't translate cs->x from CW_USEDEFAULT, + while NT does. */ + /*ok(cs->x != CW_USEDEFAULT, "%d == CW_USEDEFAULT\n", cs->x);*/ + ok(cs->y != CW_USEDEFAULT, "%d == CW_USEDEFAULT\n", cs->y); + + /* cx/cy == CW_USEDEFAULT are translated to 0 */ + ok(cs->cx == 0, "%d != 0\n", cs->cx); + ok(cs->cy == 0, "%d != 0\n", cs->cy); + break; + } + } + return DefWindowProcA(hwnd, msg, wparam, lparam); +} + +static LRESULT WINAPI mdi_main_wnd_procA(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) +{ + static HWND mdi_client; + + switch (msg) + { + case WM_CREATE: + { + CLIENTCREATESTRUCT client_cs; + RECT rc; + + GetClientRect(hwnd, &rc); + + client_cs.hWindowMenu = 0; + client_cs.idFirstChild = 1; + + /* MDIClient without MDIS_ALLCHILDSTYLES */ + mdi_client = CreateWindowExA(0, "mdiclient", + NULL, + WS_CHILD /*| WS_VISIBLE*/, + /* tests depend on a not zero MDIClient size */ + 0, 0, rc.right, rc.bottom, + hwnd, 0, GetModuleHandle(0), + (LPVOID)&client_cs); + assert(mdi_client); + test_MDI_create(hwnd, mdi_client); + DestroyWindow(mdi_client); + + /* MDIClient with MDIS_ALLCHILDSTYLES */ + mdi_client = CreateWindowExA(0, "mdiclient", + NULL, + WS_CHILD | MDIS_ALLCHILDSTYLES /*| WS_VISIBLE*/, + /* tests depend on a not zero MDIClient size */ + 0, 0, rc.right, rc.bottom, + hwnd, 0, GetModuleHandle(0), + (LPVOID)&client_cs); + assert(mdi_client); + test_MDI_create(hwnd, mdi_client); + DestroyWindow(mdi_client); + break; + } + + case WM_CLOSE: + PostQuitMessage(0); + break; + } + return DefFrameProcA(hwnd, mdi_client, msg, wparam, lparam); +} + +static BOOL mdi_RegisterWindowClasses(void) +{ + WNDCLASSA cls; + + cls.style = 0; + cls.lpfnWndProc = mdi_main_wnd_procA; + cls.cbClsExtra = 0; + cls.cbWndExtra = 0; + cls.hInstance = GetModuleHandleA(0); + cls.hIcon = 0; + cls.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); + cls.hbrBackground = GetStockObject(WHITE_BRUSH); + cls.lpszMenuName = NULL; + cls.lpszClassName = "MDI_parent_Class"; + if(!RegisterClassA(&cls)) return FALSE; + + cls.lpfnWndProc = mdi_child_wnd_proc_1; + cls.lpszClassName = "MDI_child_Class_1"; + if(!RegisterClassA(&cls)) return FALSE; + + cls.lpfnWndProc = mdi_child_wnd_proc_2; + cls.lpszClassName = "MDI_child_Class_2"; + if(!RegisterClassA(&cls)) return FALSE; + + return TRUE; +} + +static void test_mdi(void) +{ + HWND mdi_hwndMain; + /*MSG msg;*/ + + if (!mdi_RegisterWindowClasses()) assert(0); + + mdi_hwndMain = CreateWindowExA(0, "MDI_parent_Class", "MDI parent window", + WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | + WS_MAXIMIZEBOX /*| WS_VISIBLE*/, + 100, 100, CW_USEDEFAULT, CW_USEDEFAULT, + GetDesktopWindow(), 0, + GetModuleHandle(0), NULL); + assert(mdi_hwndMain); +/* + while(GetMessage(&msg, 0, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } +*/ +} + +static void test_icons(void) +{ + WNDCLASSEXA cls; + HWND hwnd; + HICON icon = LoadIconA(0, (LPSTR)IDI_APPLICATION); + HICON icon2 = LoadIconA(0, (LPSTR)IDI_QUESTION); + HICON small_icon = LoadImageA(0, (LPSTR)IDI_APPLICATION, IMAGE_ICON, + GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_SHARED ); + HICON res; + + cls.cbSize = sizeof(cls); + cls.style = 0; + cls.lpfnWndProc = DefWindowProcA; + cls.cbClsExtra = 0; + cls.cbWndExtra = 0; + cls.hInstance = 0; + cls.hIcon = LoadIconA(0, (LPSTR)IDI_HAND); + cls.hIconSm = small_icon; + cls.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); + cls.hbrBackground = GetStockObject(WHITE_BRUSH); + cls.lpszMenuName = NULL; + cls.lpszClassName = "IconWindowClass"; + + RegisterClassExA(&cls); + + hwnd = CreateWindowExA(0, "IconWindowClass", "icon test", 0, + 100, 100, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, NULL, NULL); + assert( hwnd ); + + res = (HICON)SendMessageA( hwnd, WM_GETICON, ICON_BIG, 0 ); + ok( res == 0, "wrong big icon %p/0\n", res ); + res = (HICON)SendMessageA( hwnd, WM_SETICON, ICON_BIG, (LPARAM)icon ); + ok( res == 0, "wrong previous big icon %p/0\n", res ); + res = (HICON)SendMessageA( hwnd, WM_GETICON, ICON_BIG, 0 ); + ok( res == icon, "wrong big icon after set %p/%p\n", res, icon ); + res = (HICON)SendMessageA( hwnd, WM_SETICON, ICON_BIG, (LPARAM)icon2 ); + ok( res == icon, "wrong previous big icon %p/%p\n", res, icon ); + res = (HICON)SendMessageA( hwnd, WM_GETICON, ICON_BIG, 0 ); + ok( res == icon2, "wrong big icon after set %p/%p\n", res, icon2 ); + + res = (HICON)SendMessageA( hwnd, WM_GETICON, ICON_SMALL, 0 ); + ok( res == 0, "wrong small icon %p/0\n", res ); + /* this test is XP specific */ + /*res = (HICON)SendMessageA( hwnd, WM_GETICON, ICON_SMALL2, 0 ); + ok( res != 0, "wrong small icon %p\n", res );*/ + res = (HICON)SendMessageA( hwnd, WM_SETICON, ICON_SMALL, (LPARAM)icon ); + ok( res == 0, "wrong previous small icon %p/0\n", res ); + res = (HICON)SendMessageA( hwnd, WM_GETICON, ICON_SMALL, 0 ); + ok( res == icon, "wrong small icon after set %p/%p\n", res, icon ); + /* this test is XP specific */ + /*res = (HICON)SendMessageA( hwnd, WM_GETICON, ICON_SMALL2, 0 ); + ok( res == icon, "wrong small icon after set %p/%p\n", res, icon );*/ + res = (HICON)SendMessageA( hwnd, WM_SETICON, ICON_SMALL, (LPARAM)small_icon ); + ok( res == icon, "wrong previous small icon %p/%p\n", res, icon ); + res = (HICON)SendMessageA( hwnd, WM_GETICON, ICON_SMALL, 0 ); + ok( res == small_icon, "wrong small icon after set %p/%p\n", res, small_icon ); + /* this test is XP specific */ + /*res = (HICON)SendMessageA( hwnd, WM_GETICON, ICON_SMALL2, 0 ); + ok( res == small_icon, "wrong small icon after set %p/%p\n", res, small_icon );*/ + + /* make sure the big icon hasn't changed */ + res = (HICON)SendMessageA( hwnd, WM_GETICON, ICON_BIG, 0 ); + ok( res == icon2, "wrong big icon after set %p/%p\n", res, icon2 ); +} START_TEST(win) { @@ -711,5 +1155,9 @@ START_TEST(win) test_parent_owner(); test_shell_window(); + + test_mdi(); + test_icons(); + UnhookWindowsHookEx(hhook); } diff --git a/reactos/apps/tests/user32/wsprintf.c b/reactos/apps/tests/user32/wsprintf.c index b1f8c8f860d..bbebdd75f9d 100644 --- a/reactos/apps/tests/user32/wsprintf.c +++ b/reactos/apps/tests/user32/wsprintf.c @@ -30,9 +30,9 @@ static void wsprintfATest(void) int rc; rc=wsprintfA(buf, "%010ld", -1); - ok(rc == 10, "wsPrintfA length failure: rc=%d error=%ld",rc,GetLastError()); + ok(rc == 10, "wsPrintfA length failure: rc=%d error=%ld\n",rc,GetLastError()); ok((lstrcmpA(buf, "-000000001") == 0), - "wsprintfA zero padded negative value failure: buf=[%s]",buf); + "wsprintfA zero padded negative value failure: buf=[%s]\n",buf); } static void wsprintfWTest(void) @@ -45,9 +45,9 @@ static void wsprintfWTest(void) rc=wsprintfW(buf, fmt, -1); if (rc==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) return; - ok(rc == 10, "wsPrintfW length failure: rc=%d error=%ld",rc,GetLastError()); + ok(rc == 10, "wsPrintfW length failure: rc=%d error=%ld\n",rc,GetLastError()); ok((lstrcmpW(buf, target) == 0), - "wsprintfW zero padded negative value failure"); + "wsprintfW zero padded negative value failure\n"); } START_TEST(wsprintf) From 6817aa33e18e0347051f16e260d12a7e29474ad4 Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Sat, 14 Feb 2004 20:16:24 +0000 Subject: [PATCH 0016/1463] Added User32 and Kernel32 tests to the makefile svn path=/trunk/; revision=8172 --- reactos/apps/tests/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/apps/tests/Makefile b/reactos/apps/tests/Makefile index 6ca956baf68..04a842f5045 100644 --- a/reactos/apps/tests/Makefile +++ b/reactos/apps/tests/Makefile @@ -9,11 +9,11 @@ include $(PATH_TO_TOP)/rules.mak # test_old tests TEST_APPS = accelerator alive apc args atomtest bench bitblt button \ button2 capclock carets combo consume copymove count dibtest dump_shared_data \ -edit enumwnd enumws event global_mem gradient hello mdi \ +edit enumwnd enumws event global_mem gradient hello kernel32 mdi \ hivetest icontest isotest lineclip linetest lpc \ mktime mstest multithrdwin multiwin mutex nptest patblt primitives pteb \ regtest sectest sertest shaptest shm statst statst2 stretchblt suspend \ -tcpsvr terminate txtscale thread thread_msg tokentest vmtest \ +tcpsvr terminate txtscale thread thread_msg tokentest user32 vmtest \ winhello wm_erasebkgnd wm_paint eventpair threadwait popupmenu \ map_dup_inherit p_dup_handle apc2 enhmetafile dirdlg guithreadinfo From 8c9fd640303af9f786ee082db288baca7cc643c3 Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Sat, 14 Feb 2004 21:27:35 +0000 Subject: [PATCH 0017/1463] Edited includes for new tcp ioctl needed by iphlpapi. tcpioctl.h: new I resolved a conflict between iptypes, structs and nspapi regarding some core structures. afd.h: removed definitions needed by both user land and kernel land. tdiinfo.h: added needed definitions. svn path=/trunk/; revision=8173 --- reactos/drivers/net/afd/include/afd.h | 4 - reactos/include/iptypes.h | 1 + reactos/include/net/tdi.h | 1 + reactos/include/net/tdiinfo.h | 142 +++++++++++++++++++++++++- reactos/include/nspapi.h | 37 +------ reactos/include/structs.h | 42 +------- reactos/include/tcpioctl.h | 2 + 7 files changed, 148 insertions(+), 81 deletions(-) diff --git a/reactos/drivers/net/afd/include/afd.h b/reactos/drivers/net/afd/include/afd.h index 32e61b82b41..b685487c261 100644 --- a/reactos/drivers/net/afd/include/afd.h +++ b/reactos/drivers/net/afd/include/afd.h @@ -137,10 +137,6 @@ typedef struct IPADDR_ENTRY { #define TL_INSTANCE 0 -#define IP_MIB_STATS_ID 0x1 -#define IP_MIB_ADDRTABLE_ENTRY_ID 0x102 - - /* IPv4 header format */ typedef struct IPv4_HEADER { UCHAR VerIHL; /* 4-bit version, 4-bit Internet Header Length */ diff --git a/reactos/include/iptypes.h b/reactos/include/iptypes.h index fcfb3b869da..61ec1bee469 100644 --- a/reactos/include/iptypes.h +++ b/reactos/include/iptypes.h @@ -19,6 +19,7 @@ #ifndef WINE_IPTYPES_H_ #define WINE_IPTYPES_H_ +#include #include #define MAX_ADAPTER_DESCRIPTION_LENGTH 128 diff --git a/reactos/include/net/tdi.h b/reactos/include/net/tdi.h index 7052442f023..f667fe7c423 100644 --- a/reactos/include/net/tdi.h +++ b/reactos/include/net/tdi.h @@ -150,6 +150,7 @@ typedef struct _TA_ADDRESS { #define TdiConnectionContext "ConnectionContext" #define TDI_TRANSPORT_ADDRESS_LENGTH (sizeof(TdiTransportAddress) - 1) #define TDI_CONNECTION_CONTEXT_LENGTH (sizeof(TdiConnectionContext) - 1) +#define TDI_ADDRESS_HEADER_LEN (2 * sizeof(USHORT)) typedef struct _TRANSPORT_ADDRESS { LONG TAAddressCount; diff --git a/reactos/include/net/tdiinfo.h b/reactos/include/net/tdiinfo.h index 415c66de48d..a525a4efdbe 100644 --- a/reactos/include/net/tdiinfo.h +++ b/reactos/include/net/tdiinfo.h @@ -35,10 +35,13 @@ extern "C" { #include "ntddk.h" +#ifndef TDI_SUCCESS +#define TDI_SUCCESS 0 +#endif/*TDI_SUCCESS*/ typedef struct TDIEntityID { ULONG tei_entity; - ULONG tei_instance; + ULONG tei_instance; } TDIEntityID; #define MAX_TDI_ENTITIES 512 @@ -69,6 +72,16 @@ typedef struct TDIEntityID { #define IF_GENERIC 0x200 #define IF_MIB 0x202 +/* ID to use for requesting an IFEntry for an interface */ +#define IF_MIB_STATS_ID 1 + +/* ID to use for requesting an IPSNMPInfo for an interface */ +#define IP_MIB_STATS_ID 1 /* Hmm. I'm not sure I like this */ + +/* ID to use for requesting the route table */ +#define IP_MIB_ROUTETABLE_ENTRY_ID 0x101 +#define IP_MIB_ADDRTABLE_ENTRY_ID 102 + /* TDIObjectID.toi_class constants */ #define INFO_CLASS_GENERIC 0x100 #define INFO_CLASS_PROTOCOL 0x200 @@ -86,7 +99,132 @@ typedef struct _TDIObjectID { ULONG toi_id; } TDIObjectID; -#define CONTEXT_SIZE 16 +#define MAX_PHYSADDR_SIZE 010 + +/* Basic interface information like from SIOCGIF* */ +/* 0x5c bytes without description tail */ +typedef struct _IFEntry { + ULONG if_index; + ULONG if_type; + ULONG if_mtu; + ULONG if_speed; + ULONG if_physaddrlen; + UCHAR if_physaddr[MAX_PHYSADDR_SIZE]; + ULONG if_adminstatus; + ULONG if_operstatus; + ULONG if_lastchange; + ULONG if_inoctets; + ULONG if_inucastpkts; + ULONG if_innucastpkts; + ULONG if_indiscards; + ULONG if_inerrors; + ULONG if_inunknownprotos; + ULONG if_outoctets; + ULONG if_outucastpkts; + ULONG if_outnucastpkts; + ULONG if_outdiscards; + ULONG if_outerrors; + ULONG if_outqlen; + ULONG if_descrlen; + UCHAR if_descr[1]; +} IFEntry; + +/* Control information like from /proc/sys/net/ipv4/... */ +/* 0x58 bytes */ +#if 1 +typedef struct _IPSNMPInfo { + ULONG ipsi_index; + ULONG ipsi_forwarding; + ULONG ipsi_defaultttl; + ULONG ipsi_inreceives; + ULONG ipsi_inhdrerrors; + ULONG ipsi_inaddrerrors; + ULONG ipsi_inunknownprotos; + ULONG ipsi_indiscards; + ULONG ipsi_indelivers; + ULONG ipsi_outrequests; + ULONG ipsi_routingdiscards; + ULONG ipsi_outdiscards; + ULONG ipsi_outnoroutes; + ULONG ipsi_reasmtimeout; + ULONG ipsi_reasmreqds; + ULONG ipsi_reasmoks; + ULONG ipsi_reasmfails; + ULONG ipsi_fragoks; + ULONG ipsi_fragfails; + ULONG ipsi_fragcreates; + ULONG ipsi_numif; + ULONG ipsi_numaddr; + ULONG ipsi_numroutes; +} IPSNMPInfo; +#else +typedef struct _IPSNMPInfo { + ULONG ipsi_forwarding; + ULONG ipsi_defaultttl; + ULONG ipsi_inreceives; + ULONG ipsi_inhdrerrors; + ULONG ipsi_inaddrerrors; + ULONG ipsi_inunknownprotos; + ULONG ipsi_indiscards; + ULONG ipsi_indelivers; + ULONG ipsi_outrequests; + ULONG ipsi_routingdiscards; + ULONG ipsi_outdiscards; + ULONG ipsi_outnoroutes; + ULONG ipsi_reasmtimeout; + ULONG ipsi_reasmreqds; + ULONG ipsi_reasmoks; + ULONG ipsi_reasmfails; + ULONG ipsi_fragoks; + ULONG ipsi_fragfails; + ULONG ipsi_fragcreates; + ULONG ipsi_numif; + ULONG ipsi_numaddr; + ULONG ipsi_numroutes; +} IPSNMPInfo; +#endif + +// BEGIN ORIGINAL SOURCE INFORMATION -- +// Gets ip info for the current interface list. + +// Tom Sanfilippo +// tsanfilippo@earthlink.net +// December 12, 1999 + +// Thanks are due to Thomas F. Divine +// for pointing out the updated wshsmple in the NT4DDK. +// The headers in that sample allowed the input parameters +// to finally be discovered. +// END ORIGINAL SOURCE INFORMATION -- + +typedef struct _IPRouteEntry { + ULONG ire_addr; + ULONG ire_index; //matches if_index in IFEntry and iae_index in IPAddrEntry + ULONG ire_metric; + ULONG ire_dest; //?? + ULONG ire_unk2; //?? + ULONG ire_unk3; //?? + ULONG ire_gw; + ULONG ire_unk4; //?? + ULONG ire_unk5; //?? + ULONG ire_unk6; //?? + ULONG ire_mask; + ULONG ire_unk7; //?? + ULONG ire_unk8; //?? +} IPRouteEntry; + +typedef struct _IPAddrEntry { + ULONG iae_addr; + ULONG iae_index; + ULONG iae_mask; + ULONG iae_bcastaddr; + ULONG iae_reasmsize; + ULONG iae_context; + ULONG iae_pad; +} IPAddrEntry; + +#define CONTEXT_SIZE 16 +#define MAX_ADAPTER_DESCRIPTION_LENGTH 64 /* guess */ typedef struct _TCP_REQUEST_QUERY_INFORMATION_EX { TDIObjectID ID; diff --git a/reactos/include/nspapi.h b/reactos/include/nspapi.h index 463b1390255..db9ebcd6c90 100644 --- a/reactos/include/nspapi.h +++ b/reactos/include/nspapi.h @@ -63,42 +63,7 @@ typedef struct _BLOB { } BLOB,*PBLOB,*LPBLOB; #endif -typedef struct _SERVICE_ADDRESS { - DWORD dwAddressType; - DWORD dwAddressFlags; - DWORD dwAddressLength; - DWORD dwPrincipalLength; - BYTE *lpAddress; - BYTE *lpPrincipal; -} SERVICE_ADDRESS; -typedef struct _SERVICE_ADDRESSES { - DWORD dwAddressCount; - SERVICE_ADDRESS Addresses[1]; -} SERVICE_ADDRESSES, *PSERVICE_ADDRESSES, *LPSERVICE_ADDRESSES; -typedef struct _SERVICE_INFOA { - LPGUID lpServiceType; - LPSTR lpServiceName; - LPSTR lpComment; - LPSTR lpLocale; - DWORD dwDisplayHint; - DWORD dwVersion; - DWORD dwTime; - LPSTR lpMachineName; - LPSERVICE_ADDRESSES lpServiceAddress; - BLOB ServiceSpecificInfo; -} SERVICE_INFOA, *LPSERVICE_INFOA; -typedef struct _SERVICE_INFOW { - LPGUID lpServiceType; - LPWSTR lpServiceName; - LPWSTR lpComment; - LPWSTR lpLocale; - DWORD dwDisplayHint; - DWORD dwVersion; - DWORD dwTime; - LPWSTR lpMachineName; - LPSERVICE_ADDRESSES lpServiceAddress; - BLOB ServiceSpecificInfo; -} SERVICE_INFOW, *LPSERVICE_INFOW; +#include typedef void *LPSERVICE_ASYNC_INFO; INT WINAPI SetServiceA(DWORD,DWORD,DWORD,LPSERVICE_INFOA,LPSERVICE_ASYNC_INFO,LPDWORD); diff --git a/reactos/include/structs.h b/reactos/include/structs.h index 4c1e4f3fc80..ead9cab20e7 100644 --- a/reactos/include/structs.h +++ b/reactos/include/structs.h @@ -3746,22 +3746,11 @@ typedef struct tagNONCLIENTMETRICSW { typedef_tident(NONCLIENTMETRICS) typedef_tident(LPNONCLIENTMETRICS) -typedef struct _SERVICE_ADDRESS { - DWORD dwAddressType; - DWORD dwAddressFlags; - DWORD dwAddressLength; - DWORD dwPrincipalLength; - BYTE *lpAddress; - BYTE *lpPrincipal; -} SERVICE_ADDRESS; - -typedef struct _SERVICE_ADDRESSES { - DWORD dwAddressCount; - SERVICE_ADDRESS Addresses[1]; -} SERVICE_ADDRESSES, *LPSERVICE_ADDRESSES; +#include #ifndef GUID_DEFINED #define GUID_DEFINED + typedef struct _GUID { unsigned long Data1; @@ -3770,33 +3759,8 @@ typedef struct _GUID unsigned char Data4[8]; } GUID, *LPGUID; typedef GUID CLSID, *LPCLSID; -#endif -typedef struct _SERVICE_INFOA { - LPGUID lpServiceType; - LPSTR lpServiceName; - LPSTR lpComment; - LPSTR lpLocale; - DWORD dwDisplayHint; - DWORD dwVersion; - DWORD dwTime; - LPSTR lpMachineName; - LPSERVICE_ADDRESSES lpServiceAddress; - BLOB ServiceSpecificInfo; -} SERVICE_INFOA, *LPSERVICE_INFOA; - -typedef struct _SERVICE_INFOW { - LPGUID lpServiceType; - LPWSTR lpServiceName; - LPWSTR lpComment; - LPWSTR lpLocale; - DWORD dwDisplayHint; - DWORD dwVersion; - DWORD dwTime; - LPWSTR lpMachineName; - LPSERVICE_ADDRESSES lpServiceAddress; - BLOB ServiceSpecificInfo; -} SERVICE_INFOW, *LPSERVICE_INFOW; +#endif/*GUID_DEFINED*/ typedef_tident(SERVICE_INFO); typedef_tident(LPSERVICE_INFO); diff --git a/reactos/include/tcpioctl.h b/reactos/include/tcpioctl.h index 3a2bffe4dfd..b1e113daab7 100644 --- a/reactos/include/tcpioctl.h +++ b/reactos/include/tcpioctl.h @@ -22,6 +22,8 @@ #ifndef _TCPIOCTL_H #define _TCPIOCTL_H +#define DD_TCP_DEVICE_NAME L"\\Device\\Tcp" + /* TCP/UDP/RawIP IOCTL code definitions */ #define FSCTL_TCP_BASE FILE_DEVICE_NETWORK From 74974a631d803db09c4038ec5e63bcab348c8ceb Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Sat, 14 Feb 2004 21:38:40 +0000 Subject: [PATCH 0018/1463] Mistaken offset for dest. svn path=/trunk/; revision=8174 --- reactos/include/net/tdiinfo.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/include/net/tdiinfo.h b/reactos/include/net/tdiinfo.h index a525a4efdbe..c9e4ac040ba 100644 --- a/reactos/include/net/tdiinfo.h +++ b/reactos/include/net/tdiinfo.h @@ -198,10 +198,10 @@ typedef struct _IPSNMPInfo { // END ORIGINAL SOURCE INFORMATION -- typedef struct _IPRouteEntry { - ULONG ire_addr; + ULONG ire_dest; ULONG ire_index; //matches if_index in IFEntry and iae_index in IPAddrEntry ULONG ire_metric; - ULONG ire_dest; //?? + ULONG ire_unk1; //?? ULONG ire_unk2; //?? ULONG ire_unk3; //?? ULONG ire_gw; From a3f6dab278d3a6d0e3094b88e5e43db35210d444 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sat, 14 Feb 2004 22:24:54 +0000 Subject: [PATCH 0019/1463] =?UTF-8?q?-=20Don't=20allocate=200=20bytes=20in?= =?UTF-8?q?=20EngCreateBitmap.=20Patch=20by=20Waldo=20Alvarez=20Ca?= =?UTF-8?q?=EF=BF=BDizares.=20-=20Fix=20distortion=20by=20StretchBlt.=20Pa?= =?UTF-8?q?tch=20based=20on=20investigations=20by=20Waldo=20Alvarez=20Ca?= =?UTF-8?q?=EF=BF=BDizares.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit svn path=/trunk/; revision=8175 --- reactos/subsys/win32k/dib/dib16bpp.c | 4 ++-- reactos/subsys/win32k/dib/dib8bpp.c | 4 ++-- reactos/subsys/win32k/eng/surface.c | 21 ++++++++++++++------- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib16bpp.c b/reactos/subsys/win32k/dib/dib16bpp.c index ed4c26c1811..1c8ef15f066 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.17 2003/12/23 19:28:23 navaraf Exp $ */ +/* $Id: dib16bpp.c,v 1.18 2004/02/14 22:24:54 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -422,7 +422,7 @@ void ScaleRectAvg16(PIXEL *Target, PIXEL *Source, int SrcWidth, int SrcHeight, int TgtWidth, int TgtHeight, int srcPitch, int dstPitch) { int NumPixels = TgtHeight; - int IntPart = (SrcHeight / TgtHeight) * (SrcWidth+1); + int IntPart = (SrcHeight / TgtHeight) * SrcWidth; int FractPart = SrcHeight % TgtHeight; int Mid = TgtHeight / 2; int E = 0; diff --git a/reactos/subsys/win32k/dib/dib8bpp.c b/reactos/subsys/win32k/dib/dib8bpp.c index ce5fc6918d6..9c679a2764c 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.12 2003/12/23 19:28:23 navaraf Exp $ */ +/* $Id: dib8bpp.c,v 1.13 2004/02/14 22:24:54 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -393,7 +393,7 @@ void ScaleRectAvg8(PIXEL *Target, PIXEL *Source, int SrcWidth, int SrcHeight, int TgtWidth, int TgtHeight, int srcPitch, int dstPitch) { int NumPixels = TgtHeight; - int IntPart = (SrcHeight / TgtHeight) * (SrcWidth+1); + int IntPart = (SrcHeight / TgtHeight) * SrcWidth; int FractPart = SrcHeight % TgtHeight; int Mid = TgtHeight / 2; int E = 0; diff --git a/reactos/subsys/win32k/eng/surface.c b/reactos/subsys/win32k/eng/surface.c index 9b6f0c55d55..45b98f52bf3 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.31 2004/02/08 21:37:52 weiden Exp $ +/* $Id: surface.c,v 1.32 2004/02/14 22:24:54 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -351,15 +351,22 @@ EngCreateBitmap(IN SIZEL Size, SurfObj->pvBits = UncompressedBits; } else { - if(Flags & BMF_USERMEM) + if (SurfObj->cjBits == 0) { - SurfObj->pvBits = EngAllocUserMem(SurfObj->cjBits, 0); - } else { - if(Flags & BMF_NOZEROINIT) + SurfObj->pvBits = NULL; + } + else + { + if(Flags & BMF_USERMEM) { - SurfObj->pvBits = EngAllocMem(0, SurfObj->cjBits, 0); + SurfObj->pvBits = EngAllocUserMem(SurfObj->cjBits, 0); } else { - SurfObj->pvBits = EngAllocMem(FL_ZERO_MEMORY, SurfObj->cjBits, 0); + if(Flags & BMF_NOZEROINIT) + { + SurfObj->pvBits = EngAllocMem(0, SurfObj->cjBits, 0); + } else { + SurfObj->pvBits = EngAllocMem(FL_ZERO_MEMORY, SurfObj->cjBits, 0); + } } } } From 459d72e610dc6de2cd213c5acd641da17a9a1249 Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Sat, 14 Feb 2004 23:13:58 +0000 Subject: [PATCH 0020/1463] Implemented LsaFreeMemory and changed a few stubs to match WINE so Msys will load. svn path=/trunk/; revision=8176 --- reactos/lib/advapi32/sec/lsa.c | 169 +++++++++++++++++++++++++-------- 1 file changed, 131 insertions(+), 38 deletions(-) diff --git a/reactos/lib/advapi32/sec/lsa.c b/reactos/lib/advapi32/sec/lsa.c index 9240ee6a36a..46b94efad38 100644 --- a/reactos/lib/advapi32/sec/lsa.c +++ b/reactos/lib/advapi32/sec/lsa.c @@ -1,4 +1,4 @@ -/* $Id: lsa.c,v 1.7 2004/01/20 01:40:19 ekohl Exp $ +/* $Id: lsa.c,v 1.8 2004/02/14 23:13:58 sedwards Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -9,40 +9,132 @@ * 19990322 EA created * 19990515 EA stubs * 20030202 KJK compressed stubs + * */ #include #include #include +#include -/* +/****************************************************************************** + * LsaOpenPolicy [ADVAPI32.@] + * + * PARAMS + * x1 [] + * x2 [] + * x3 [] + * x4 [] + * * @unimplemented */ NTSTATUS STDCALL LsaOpenPolicy(PLSA_UNICODE_STRING lsaucs,PLSA_OBJECT_ATTRIBUTES lsaoa,ACCESS_MASK access,PLSA_HANDLE lsah) { - return(FALSE); + DPRINT1("LsaOpenPolicy - stub\n"); + return STATUS_SUCCESS; } /* * @unimplemented */ +#define SID_REVISION (1) /* Current revision - winnt.h */ + NTSTATUS STDCALL -LsaQueryInformationPolicy(LSA_HANDLE lsah,POLICY_INFORMATION_CLASS pic,PVOID* pv) +LsaQueryInformationPolicy(LSA_HANDLE lsah,POLICY_INFORMATION_CLASS pic,PVOID* Buffer) { - return(FALSE); + DPRINT1("(%p,0x%08x,%p):LsaQueryInformationPolicy stub\n", + lsah, pic, Buffer); + + if(!Buffer) return FALSE; + switch (pic) + { + case PolicyAuditEventsInformation: /* 2 */ + { + PPOLICY_AUDIT_EVENTS_INFO p = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(POLICY_AUDIT_EVENTS_INFO)); + p->AuditingMode = FALSE; /* no auditing */ + *Buffer = p; + } + break; + case PolicyPrimaryDomainInformation: /* 3 */ + case PolicyAccountDomainInformation: /* 5 */ + { + struct di + { POLICY_PRIMARY_DOMAIN_INFO ppdi; + SID sid; + }; + SID_IDENTIFIER_AUTHORITY localSidAuthority = {SECURITY_NT_AUTHORITY}; + + struct di * xdi = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(xdi)); + HKEY key; + BOOL useDefault = TRUE; + LONG ret; + + if ((ret = RegOpenKeyExA(HKEY_LOCAL_MACHINE, + "System\\CurrentControlSet\\Services\\VxD\\VNETSUP", 0, + KEY_READ, &key)) == ERROR_SUCCESS) + { + DWORD size = 0; + WCHAR wg[] = { 'W','o','r','k','g','r','o','u','p',0 }; + + ret = RegQueryValueExW(key, wg, NULL, NULL, NULL, &size); + if (ret == ERROR_MORE_DATA || ret == ERROR_SUCCESS) + { + xdi->ppdi.Name.Buffer = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, size); + if ((ret = RegQueryValueExW(key, wg, NULL, NULL, + (LPBYTE)xdi->ppdi.Name.Buffer, &size)) == ERROR_SUCCESS) + { + xdi->ppdi.Name.Length = (USHORT)size; + useDefault = FALSE; + } + else + { + RtlFreeHeap(RtlGetProcessHeap(), 0, xdi->ppdi.Name.Buffer); + xdi->ppdi.Name.Buffer = NULL; + } + } + RegCloseKey(key); + } + if (useDefault) + RtlCreateUnicodeStringFromAsciiz(&(xdi->ppdi.Name), "DOMAIN"); + DPRINT1("setting domain to \n"); + + xdi->ppdi.Sid = &(xdi->sid); + xdi->sid.Revision = SID_REVISION; + xdi->sid.SubAuthorityCount = 1; + xdi->sid.IdentifierAuthority = localSidAuthority; + xdi->sid.SubAuthority[0] = SECURITY_LOCAL_SYSTEM_RID; + *Buffer = xdi; + } + break; + case PolicyAuditLogInformation: + case PolicyPdAccountInformation: + case PolicyLsaServerRoleInformation: + case PolicyReplicaSourceInformation: + case PolicyDefaultQuotaInformation: + case PolicyModificationInformation: + case PolicyAuditFullSetInformation: + case PolicyAuditFullQueryInformation: + case PolicyDnsDomainInformation: + { + DPRINT1("category not implemented\n"); + return FALSE; + } + } + return TRUE; } /* - * @unimplemented + * @implemented */ NTSTATUS STDCALL LsaFreeMemory(PVOID pv) { - return(FALSE); + return RtlFreeHeap(RtlGetProcessHeap(), 0, pv); } /* @@ -52,7 +144,8 @@ NTSTATUS STDCALL LsaClose(LSA_HANDLE ObjectHandle) { - return(FALSE); + DPRINT1("(%p):LsaClose stub\n",ObjectHandle); + return 0xc0000000; } /* @@ -61,7 +154,7 @@ LsaClose(LSA_HANDLE ObjectHandle) NTSTATUS STDCALL LsaAddAccountRights( - LSA_HANDLE PolicyHandle, + LSA_HANDLE lsah, PSID AccountSid, PLSA_UNICODE_STRING UserRights, ULONG CountOfRights @@ -76,7 +169,7 @@ LsaAddAccountRights( NTSTATUS STDCALL LsaCreateTrustedDomainEx( - LSA_HANDLE PolicyHandle, + LSA_HANDLE lsah, PTRUSTED_DOMAIN_INFORMATION_EX TrustedDomainInformation, PTRUSTED_DOMAIN_AUTH_INFORMATION AuthenticationInformation, ACCESS_MASK DesiredAccess, @@ -92,7 +185,7 @@ LsaCreateTrustedDomainEx( NTSTATUS STDCALL LsaDeleteTrustedDomain( - LSA_HANDLE PolicyHandle, + LSA_HANDLE lsah, PSID TrustedDomainSid ) { @@ -105,7 +198,7 @@ LsaDeleteTrustedDomain( NTSTATUS STDCALL LsaEnumerateAccountRights( - LSA_HANDLE PolicyHandle, + LSA_HANDLE lsah, PSID AccountSid, PLSA_UNICODE_STRING *UserRights, PULONG CountOfRights @@ -120,7 +213,7 @@ LsaEnumerateAccountRights( NTSTATUS STDCALL LsaEnumerateAccountsWithUserRight( - LSA_HANDLE PolicyHandle, + LSA_HANDLE lsah, OPTIONAL PLSA_UNICODE_STRING UserRights, PVOID *EnumerationBuffer, PULONG CountReturned @@ -135,7 +228,7 @@ LsaEnumerateAccountsWithUserRight( NTSTATUS STDCALL LsaEnumerateTrustedDomains( - LSA_HANDLE PolicyHandle, + LSA_HANDLE lsah, PLSA_ENUMERATION_HANDLE EnumerationContext, PVOID *Buffer, ULONG PreferedMaximumLength, @@ -151,7 +244,7 @@ LsaEnumerateTrustedDomains( NTSTATUS STDCALL LsaEnumerateTrustedDomainsEx( - LSA_HANDLE PolicyHandle, + LSA_HANDLE lsah, PLSA_ENUMERATION_HANDLE EnumerationContext, PVOID *Buffer, ULONG PreferedMaximumLength, @@ -167,7 +260,7 @@ LsaEnumerateTrustedDomainsEx( NTSTATUS STDCALL LsaLookupNames( - LSA_HANDLE PolicyHandle, + LSA_HANDLE lsah, ULONG Count, PLSA_UNICODE_STRING Names, PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains, @@ -183,7 +276,7 @@ LsaLookupNames( NTSTATUS STDCALL LsaLookupNames2( - LSA_HANDLE PolicyHandle, + LSA_HANDLE lsah, ULONG Flags, ULONG Count, PLSA_UNICODE_STRING Names, @@ -200,7 +293,7 @@ LsaLookupNames2( NTSTATUS STDCALL LsaLookupSids( - LSA_HANDLE PolicyHandle, + LSA_HANDLE lsah, ULONG Count, PSID *Sids, PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains, @@ -216,7 +309,7 @@ LsaLookupSids( NTSTATUS STDCALL LsaOpenTrustedDomainByName( - LSA_HANDLE PolicyHandle, + LSA_HANDLE lsah, PLSA_UNICODE_STRING TrustedDomainName, ACCESS_MASK DesiredAccess, PLSA_HANDLE TrustedDomainHandle @@ -231,8 +324,8 @@ LsaOpenTrustedDomainByName( NTSTATUS STDCALL LsaQueryDomainInformationPolicy( - LSA_HANDLE PolicyHandle, - POLICY_DOMAIN_INFORMATION_CLASS InformationClass, + LSA_HANDLE lsah, + POLICY_DOMAIN_INFORMATION_CLASS pic, PVOID *Buffer ) { @@ -245,7 +338,7 @@ LsaQueryDomainInformationPolicy( NTSTATUS STDCALL LsaQueryForestTrustInformation( - LSA_HANDLE PolicyHandle, + LSA_HANDLE lsah, PLSA_UNICODE_STRING TrustedDomainName, PLSA_FOREST_TRUST_INFORMATION * ForestTrustInfo ) @@ -259,9 +352,9 @@ LsaQueryForestTrustInformation( NTSTATUS STDCALL LsaQueryTrustedDomainInfoByName( - LSA_HANDLE PolicyHandle, + LSA_HANDLE lsah, PLSA_UNICODE_STRING TrustedDomainName, - TRUSTED_INFORMATION_CLASS InformationClass, + TRUSTED_INFORMATION_CLASS pic, PVOID *Buffer ) { @@ -274,9 +367,9 @@ LsaQueryTrustedDomainInfoByName( NTSTATUS STDCALL LsaQueryTrustedDomainInfo( - LSA_HANDLE PolicyHandle, + LSA_HANDLE lsah, PSID TrustedDomainSid, - TRUSTED_INFORMATION_CLASS InformationClass, + TRUSTED_INFORMATION_CLASS pic, PVOID *Buffer ) { @@ -289,7 +382,7 @@ LsaQueryTrustedDomainInfo( NTSTATUS STDCALL LsaRemoveAccountRights( - LSA_HANDLE PolicyHandle, + LSA_HANDLE lsah, PSID AccountSid, BOOL AllRights, PLSA_UNICODE_STRING UserRights, @@ -305,7 +398,7 @@ LsaRemoveAccountRights( NTSTATUS STDCALL LsaRetrievePrivateData( - LSA_HANDLE PolicyHandle, + LSA_HANDLE lsah, PLSA_UNICODE_STRING KeyName, PLSA_UNICODE_STRING * PrivateData ) @@ -319,8 +412,8 @@ LsaRetrievePrivateData( NTSTATUS STDCALL LsaSetDomainInformationPolicy( - LSA_HANDLE PolicyHandle, - POLICY_DOMAIN_INFORMATION_CLASS InformationClass, + LSA_HANDLE lsah, + POLICY_DOMAIN_INFORMATION_CLASS pic, PVOID Buffer ) { @@ -333,8 +426,8 @@ LsaSetDomainInformationPolicy( NTSTATUS STDCALL LsaSetInformationPolicy( - LSA_HANDLE PolicyHandle, - POLICY_INFORMATION_CLASS InformationClass, + LSA_HANDLE lsah, + POLICY_INFORMATION_CLASS pic, PVOID Buffer ) { @@ -347,7 +440,7 @@ LsaSetInformationPolicy( NTSTATUS STDCALL LsaSetForestTrustInformation( - LSA_HANDLE PolicyHandle, + LSA_HANDLE lsah, PLSA_UNICODE_STRING TrustedDomainName, PLSA_FOREST_TRUST_INFORMATION ForestTrustInfo, BOOL CheckOnly, @@ -363,9 +456,9 @@ LsaSetForestTrustInformation( NTSTATUS STDCALL LsaSetTrustedDomainInfoByName( - LSA_HANDLE PolicyHandle, + LSA_HANDLE lsah, PLSA_UNICODE_STRING TrustedDomainName, - TRUSTED_INFORMATION_CLASS InformationClass, + TRUSTED_INFORMATION_CLASS pic, PVOID Buffer ) { @@ -378,9 +471,9 @@ LsaSetTrustedDomainInfoByName( NTSTATUS STDCALL LsaSetTrustedDomainInformation( - LSA_HANDLE PolicyHandle, + LSA_HANDLE lsah, PSID TrustedDomainSid, - TRUSTED_INFORMATION_CLASS InformationClass, + TRUSTED_INFORMATION_CLASS pic, PVOID Buffer ) { @@ -393,7 +486,7 @@ LsaSetTrustedDomainInformation( NTSTATUS STDCALL LsaStorePrivateData( - LSA_HANDLE PolicyHandle, + LSA_HANDLE lsah, PLSA_UNICODE_STRING KeyName, PLSA_UNICODE_STRING PrivateData ) From b8294203960b7a543d32d24468b8b844b253b10b Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Sat, 14 Feb 2004 23:21:44 +0000 Subject: [PATCH 0021/1463] Add some debugging. svn path=/trunk/; revision=8177 --- reactos/lib/netapi32/.cvsignore | 1 - reactos/lib/netapi32/wksta.c | 8 ++++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/reactos/lib/netapi32/.cvsignore b/reactos/lib/netapi32/.cvsignore index 7bb1369867e..bd5600152c0 100644 --- a/reactos/lib/netapi32/.cvsignore +++ b/reactos/lib/netapi32/.cvsignore @@ -1,4 +1,3 @@ -Makefile netapi32.def netapi32.dll netapi32.dll.dbg.c diff --git a/reactos/lib/netapi32/wksta.c b/reactos/lib/netapi32/wksta.c index 8a0ebf36ced..6dd7c55f9cc 100644 --- a/reactos/lib/netapi32/wksta.c +++ b/reactos/lib/netapi32/wksta.c @@ -296,9 +296,9 @@ NetWkstaTransportEnum(LPWSTR ServerName, DWORD level, PBYTE* pbuf, * NetWkstaUserGetInfo (NETAPI32.@) */ NET_API_STATUS WINAPI NetWkstaUserGetInfo(LPWSTR reserved, DWORD level, - PBYTE* bufptr) + LPBYTE* bufptr) { - TRACE("(%s, %ld, %p)\n", debugstr_w(reserved), level, bufptr); + FIXME("(%s, %ld, %p)\n", debugstr_w(reserved), level, bufptr); switch (level) { case 0: @@ -317,9 +317,11 @@ NET_API_STATUS WINAPI NetWkstaUserGetInfo(LPWSTR reserved, DWORD level, if (!GetUserNameW(ui->wkui0_username, &dwSize)) { NetApiBufferFree(ui); + FIXME("NetWkstaUserGetInfo - ERROR_NOT_ENOUGH_MEMORY\n"); return ERROR_NOT_ENOUGH_MEMORY; } else + FIXME("NetWkstaUserGetInfo - trying NetApiBufferReallocate\n"); NetApiBufferReallocate( *bufptr, sizeof(WKSTA_USER_INFO_0) + (lstrlenW(ui->wkui0_username) + 1) * sizeof(WCHAR), @@ -346,6 +348,7 @@ NET_API_STATUS WINAPI NetWkstaUserGetInfo(LPWSTR reserved, DWORD level, /* get some information first to estimate size of the buffer */ ui0 = NULL; + FIXME("NetWkstaUserGetInfo - ??NetWkstaUserGetInfo\n"); NetWkstaUserGetInfo(NULL, 0, (PBYTE *) &ui0); username_sz = lstrlenW(ui0->wkui0_username) + 1; @@ -418,6 +421,7 @@ NET_API_STATUS WINAPI NetWkstaUserGetInfo(LPWSTR reserved, DWORD level, ERR("Invalid level %ld is specified\n", level); return ERROR_INVALID_LEVEL; } + FIXME("NetWkstaUserGetInfo - ERROR_NOT_ENOUGH_MEMORY\n"); return NERR_Success; } From 3bf9107ff9523c202281a57eb7c28db6dc3d99f3 Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Sat, 14 Feb 2004 23:22:29 +0000 Subject: [PATCH 0022/1463] Added Makefile svn path=/trunk/; revision=8178 --- reactos/lib/netapi32/makefile | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 reactos/lib/netapi32/makefile diff --git a/reactos/lib/netapi32/makefile b/reactos/lib/netapi32/makefile new file mode 100644 index 00000000000..75dd327e917 --- /dev/null +++ b/reactos/lib/netapi32/makefile @@ -0,0 +1,9 @@ +# $Id: makefile,v 1.1 2004/02/14 23:22:29 sedwards Exp $ + +PATH_TO_TOP = ../.. + +TARGET_TYPE = winedll + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk From 2124442b3d84d99a95f151333b2cc81623c87784 Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Sun, 15 Feb 2004 00:04:08 +0000 Subject: [PATCH 0023/1463] Added new files for common functions. svn path=/trunk/; revision=8179 --- reactos/lib/rosrtl/makefile | 11 +++- reactos/lib/rosrtl/registry/registry.c | 76 ++++++++++++++++++++++++++ reactos/lib/rosrtl/string/append.c | 38 +++++++++++++ 3 files changed, 123 insertions(+), 2 deletions(-) create mode 100644 reactos/lib/rosrtl/registry/registry.c create mode 100644 reactos/lib/rosrtl/string/append.c diff --git a/reactos/lib/rosrtl/makefile b/reactos/lib/rosrtl/makefile index 64208a4f7c5..730eaeef134 100644 --- a/reactos/lib/rosrtl/makefile +++ b/reactos/lib/rosrtl/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.11 2004/01/11 20:46:06 navaraf Exp $ +# $Id: makefile,v 1.12 2004/02/15 00:04:07 arty Exp $ PATH_TO_TOP = ../.. @@ -15,6 +15,12 @@ THREAD_OBJECTS = \ thread/exit.o \ thread/stack.o +STRING_OBJECTS = \ + string/append.o + +REGISTRY_OBJECTS = \ + registry/registry.o + MISC_OBJECTS = \ misc/devmode.o \ misc/logfont.o \ @@ -30,7 +36,8 @@ TARGET_NAME = rosrtl TARGET_CFLAGS = -D__USE_W32API -Wall -Werror -TARGET_OBJECTS = $(THREAD_OBJECTS) $(MISC_OBJECTS) +TARGET_OBJECTS = $(THREAD_OBJECTS) $(MISC_OBJECTS) $(STRING_OBJECTS) \ + $(REGISTRY_OBJECTS) DEP_OBJECTS = $(TARGET_OBJECTS) diff --git a/reactos/lib/rosrtl/registry/registry.c b/reactos/lib/rosrtl/registry/registry.c new file mode 100644 index 00000000000..f574dad9733 --- /dev/null +++ b/reactos/lib/rosrtl/registry/registry.c @@ -0,0 +1,76 @@ +#define NTOS_MODE_USER +#include +#include + +/* + * Utility function to read a value from the registry more easily. + * + * IN PUNICODE_STRING KeyName -> Name of key to open + * IN PUNICODE_STRING ValueName -> Name of value to open + * OUT PUNICODE_STRING ReturnedValue -> String contained in registry + * + * Returns NTSTATUS + */ + +NTSTATUS NTAPI RosReadRegistryValue( PUNICODE_STRING KeyName, + PUNICODE_STRING ValueName, + PUNICODE_STRING ReturnedValue ) { + NTSTATUS Status; + HANDLE KeyHandle; + OBJECT_ATTRIBUTES KeyAttributes; + PKEY_VALUE_PARTIAL_INFORMATION KeyValuePartialInfo; + ULONG Length = 0; + ULONG ResLength = 0; + UNICODE_STRING Temp; + + InitializeObjectAttributes(&KeyAttributes, KeyName, OBJ_CASE_INSENSITIVE, + NULL, NULL); + Status = ZwOpenKey(&KeyHandle, KEY_ALL_ACCESS, &KeyAttributes); + if( !NT_SUCCESS(Status) ) { + return Status; + } + + Status = ZwQueryValueKey(KeyHandle, ValueName, KeyValuePartialInformation, + 0, + 0, + &ResLength); + + if( Status != STATUS_BUFFER_TOO_SMALL ) { + NtClose(KeyHandle); + return Status; + } + + ResLength += sizeof( *KeyValuePartialInfo ); + KeyValuePartialInfo = + RtlAllocateHeap(GetProcessHeap(), 0, ResLength); + Length = ResLength; + + if( !KeyValuePartialInfo ) { + NtClose(KeyHandle); + return STATUS_NO_MEMORY; + } + + Status = ZwQueryValueKey(KeyHandle, ValueName, KeyValuePartialInformation, + (PVOID)KeyValuePartialInfo, + Length, + &ResLength); + + if( !NT_SUCCESS(Status) ) { + NtClose(KeyHandle); + RtlFreeHeap(GetProcessHeap(),0,KeyValuePartialInfo); + return Status; + } + + Temp.Length = Temp.MaximumLength = KeyValuePartialInfo->DataLength; + Temp.Buffer = (PWCHAR)KeyValuePartialInfo->Data; + + /* At this point, KeyValuePartialInfo->Data contains the key data */ + RtlInitUnicodeString(ReturnedValue,L""); + RosAppendUnicodeString(ReturnedValue,&Temp,FALSE); + + RtlFreeHeap(GetProcessHeap(),0,KeyValuePartialInfo); + NtClose(KeyHandle); + + return Status; +} + diff --git a/reactos/lib/rosrtl/string/append.c b/reactos/lib/rosrtl/string/append.c new file mode 100644 index 00000000000..eb615bde745 --- /dev/null +++ b/reactos/lib/rosrtl/string/append.c @@ -0,0 +1,38 @@ +#define NTOS_MODE_USER +#include + +/* + * Utility to copy and append two unicode strings. + * + * IN OUT PUNICODE_STRING ResultFirst -> First string and result + * IN PUNICODE_STRING Second -> Second string to append + * IN BOOL Deallocate -> TRUE: Deallocate First string before + * overwriting. + * + * Returns NTSTATUS. + */ + +NTSTATUS NTAPI RosAppendUnicodeString(PUNICODE_STRING ResultFirst, + PUNICODE_STRING Second, + BOOL Deallocate) { + NTSTATUS Status; + PWSTR new_string = + RtlAllocateHeap(GetProcessHeap(),0, + (ResultFirst->Length + Second->Length + sizeof(WCHAR))); + if( !new_string ) { + return STATUS_NO_MEMORY; + } + memcpy( new_string, ResultFirst->Buffer, + ResultFirst->Length ); + memcpy( new_string + ResultFirst->Length / sizeof(WCHAR), + Second->Buffer, + Second->Length ); + if( Deallocate ) RtlFreeUnicodeString(ResultFirst); + ResultFirst->Length += Second->Length; + ResultFirst->MaximumLength = ResultFirst->Length; + new_string[ResultFirst->Length / sizeof(WCHAR)] = 0; + Status = RtlCreateUnicodeString(ResultFirst,new_string) ? + STATUS_SUCCESS : STATUS_NO_MEMORY; + RtlFreeHeap(GetProcessHeap(),0,new_string); + return Status; +} From d194919316de2d7001adebcdd78e5be73415c8ce Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Sun, 15 Feb 2004 01:08:54 +0000 Subject: [PATCH 0024/1463] Added definition. svn path=/trunk/; revision=8180 --- reactos/include/rosrtl/string.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/reactos/include/rosrtl/string.h b/reactos/include/rosrtl/string.h index 4bba0a0035a..5822658eace 100644 --- a/reactos/include/rosrtl/string.h +++ b/reactos/include/rosrtl/string.h @@ -1,4 +1,4 @@ -/* $Id: string.h,v 1.1 2003/11/17 02:12:52 hyperion Exp $ +/* $Id: string.h,v 1.2 2004/02/15 01:08:54 arty Exp $ */ #ifndef ROSRTL_STRING_H__ @@ -42,6 +42,10 @@ extern "C" #define ROS_EMPTY_STRING {0, 0, NULL} +NTSTATUS NTAPI RosAppendUnicodeString( PUNICODE_STRING ResultFirst, + PUNICODE_STRING Second, + BOOL Deallocate ); + #ifdef __cplusplus } #endif From 7e4b6ff68a120aac783e4ec0880dbada3a5e9ba7 Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Sun, 15 Feb 2004 02:40:25 +0000 Subject: [PATCH 0025/1463] Added file. Contains common serviceinfo structs. svn path=/trunk/; revision=8181 --- reactos/include/serviceinfo.h | 40 +++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 reactos/include/serviceinfo.h diff --git a/reactos/include/serviceinfo.h b/reactos/include/serviceinfo.h new file mode 100644 index 00000000000..49a54a9efeb --- /dev/null +++ b/reactos/include/serviceinfo.h @@ -0,0 +1,40 @@ +#ifndef _SERVICE_INFO_H +#define _SERVICE_INFO_H + +typedef struct _SERVICE_ADDRESS { + DWORD dwAddressType; + DWORD dwAddressFlags; + DWORD dwAddressLength; + DWORD dwPrincipalLength; + BYTE *lpAddress; + BYTE *lpPrincipal; +} SERVICE_ADDRESS; +typedef struct _SERVICE_ADDRESSES { + DWORD dwAddressCount; + SERVICE_ADDRESS Addresses[1]; +} SERVICE_ADDRESSES, *PSERVICE_ADDRESSES, *LPSERVICE_ADDRESSES; +typedef struct _SERVICE_INFOA { + LPGUID lpServiceType; + LPSTR lpServiceName; + LPSTR lpComment; + LPSTR lpLocale; + DWORD dwDisplayHint; + DWORD dwVersion; + DWORD dwTime; + LPSTR lpMachineName; + LPSERVICE_ADDRESSES lpServiceAddress; + BLOB ServiceSpecificInfo; +} SERVICE_INFOA, *LPSERVICE_INFOA; +typedef struct _SERVICE_INFOW { + LPGUID lpServiceType; + LPWSTR lpServiceName; + LPWSTR lpComment; + LPWSTR lpLocale; + DWORD dwDisplayHint; + DWORD dwVersion; + DWORD dwTime; + LPWSTR lpMachineName; + LPSERVICE_ADDRESSES lpServiceAddress; + BLOB ServiceSpecificInfo; +} SERVICE_INFOW, *LPSERVICE_INFOW; +#endif/*SERVICE_INFO_H*/ From 904bf32b2ad4a6b3395c87bc38ffb0851015b8fc Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Sun, 15 Feb 2004 05:33:19 +0000 Subject: [PATCH 0026/1463] Author: ShadowFlare I(ShadowFlare) improved command line parsing (completely rewrote it), made some changes for the ansi version, and added some comments into the code (there was very few previously). svn path=/trunk/; revision=8182 --- reactos/apps/utils/rundll32/rundll32.c | 778 +++++++++++++++---------- 1 file changed, 467 insertions(+), 311 deletions(-) diff --git a/reactos/apps/utils/rundll32/rundll32.c b/reactos/apps/utils/rundll32/rundll32.c index b2cc558e408..cf7f99edf87 100644 --- a/reactos/apps/utils/rundll32/rundll32.c +++ b/reactos/apps/utils/rundll32/rundll32.c @@ -1,311 +1,467 @@ -/* - * ReactOS rundll32 - * 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. - */ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS rundll32.exe - * FILE: apps/utils/rundll32/rundll32.c - * PURPOSE: Run a DLL as a program - * PROGRAMMER: ShadowFlare (blakflare@hotmail.com) - */ - -#define WIN32_LEAN_AND_MEAN - -// Both UNICODE and _UNICODE must be either defined or undefined -// because some headers use UNICODE and others use _UNICODE -#ifdef UNICODE -#ifndef _UNICODE -#define _UNICODE -#endif -#else -#ifdef _UNICODE -#define UNICODE -#endif -#endif - -#include -#include -#include -#include -#include - -typedef int (WINAPI *DllWinMainW)( - HWND hWnd, - HINSTANCE hInstance, - LPWSTR lpwCmdLine, - int nCmdShow -); -typedef int (WINAPI *DllWinMainA)( - HWND hWnd, - HINSTANCE hInstance, - LPSTR lpCmdLine, - int nCmdShow -); - -LPCTSTR DllNotLoaded = _T("LoadLibrary failed to load \"%s\""); -LPCTSTR MissingEntry = _T("Missing entry point:%s\nIn %s"); -LPCTSTR rundll32_wtitle = _T("rundll32"); -LPCTSTR rundll32_wclass = _T("rundll32_window"); -TCHAR ModuleFileName[MAX_PATH+1]; -LPTSTR ModuleTitle; - -LPTSTR FindArgStart(LPTSTR lpStr) -{ - while (*lpStr) { - switch (*lpStr) { - case _T(' '): - case _T('\t'): - case _T('\r'): - case _T('\n'): - break; - default: - return lpStr; - } - lpStr++; - } - return lpStr; -} - -LPTSTR FindArgEnd(LPTSTR lpStr) -{ - if (*lpStr != _T('\"')) { - while (*lpStr) { - switch (*lpStr) { - case _T(' '): - case _T('\t'): - case _T('\r'): - case _T('\n'): - *(lpStr++) = 0; - return lpStr; - } - lpStr++; - } - } - else { - for (++lpStr;*lpStr && *lpStr != _T('\"');++lpStr) {} - if (*lpStr == _T('\"')) { - *(lpStr++) = 0; - } - } - - return lpStr; -} - -void GetModuleTitle(void) -{ - LPTSTR lpStr; - - GetModuleFileName(0,ModuleFileName,MAX_PATH); - ModuleTitle = ModuleFileName; - - for (lpStr = ModuleFileName;*lpStr;lpStr++) { - if (*lpStr == _T('\\')) - ModuleTitle = lpStr+1; - } - - for (lpStr = ModuleTitle;*lpStr;lpStr++) { - if (_tcsicmp(lpStr,_T(".exe"))==0) - break; - } - - *lpStr = 0; -} - -#ifdef UNICODE -#define ConvertToWideChar(lptString) (lptString) -#define FreeConvertedWideChar(lptString) -#else - -LPWSTR ConvertToWideChar(LPCSTR lpString) -{ - LPWSTR lpwString; - size_t nStrLen; - - nStrLen = strlen(lpString) + 1; - - lpwString = (LPWSTR)malloc(nStrLen * sizeof(WCHAR)); - MultiByteToWideChar(0,0,lpString,nStrLen,lpwString,nStrLen); - - return lpwString; -} - -#define FreeConvertedWideChar(lptString) free(lptString) -#endif - -#ifdef UNICODE -#define ConvertToMultiByte(lptString) DuplicateToMultiByte(lptString,0) -#define FreeConvertedMultiByte(lptString) free(lptString) -#else -#define ConvertToMultiByte(lptString) (lptString) -#define FreeConvertedMultiByte(lptString) -#endif - -LPSTR DuplicateToMultiByte(LPCTSTR lptString, size_t nBufferSize) -{ - LPSTR lpString; - size_t nStrLen; - - nStrLen = _tcslen(lptString) + 1; - if (nBufferSize == 0) nBufferSize = nStrLen; - - lpString = (LPSTR)malloc(nBufferSize); -#ifdef UNICODE - WideCharToMultiByte(0,0,lptString,nStrLen,lpString,nBufferSize,0,0); -#else - strncpy(lpString,lptString,nBufferSize); -#endif - - return lpString; -} - -LRESULT CALLBACK EmptyWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - return DefWindowProc(hWnd, uMsg, wParam, lParam); -} - -ATOM RegisterBlankClass(HINSTANCE hInstance) -{ - WNDCLASSEX wcex; - - wcex.cbSize = sizeof(WNDCLASSEX); - - wcex.style = 0; - wcex.lpfnWndProc = EmptyWindowProc; - wcex.cbClsExtra = 0; - wcex.cbWndExtra = 0; - wcex.hInstance = hInstance; - wcex.hIcon = 0; - wcex.hCursor = 0; - wcex.hbrBackground = 0; - wcex.lpszMenuName = 0; - wcex.lpszClassName = rundll32_wclass; - wcex.hIconSm = 0; - - return RegisterClassEx(&wcex); -} - -int WINAPI WinMain( - HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpCmdLineA, - int nCmdShow -) -{ - LPTSTR lptCmdLineCopy,lptCmdLine,lptDllName,lptFuncName,lptMsgBuffer; - LPSTR lpFuncName,lpaCmdLine; - LPWSTR lpwCmdLine; - HMODULE hDll; - DllWinMainW fnDllWinMainW; - DllWinMainA fnDllWinMainA; - HWND hWindow; - int nRetVal; - size_t nStrLen; - - lptCmdLineCopy = _tcsdup(GetCommandLine()); - - lptCmdLine = FindArgStart(lptCmdLineCopy); - lptCmdLine = FindArgEnd(lptCmdLine); - lptDllName = FindArgStart(lptCmdLine); - while (*lptDllName == _T('/')) - lptDllName = FindArgStart(FindArgEnd(++lptDllName)); - lptCmdLine = FindArgEnd(lptDllName); - if (*lptDllName == _T('\"')) lptDllName++; - - if (!*lptDllName) { - free(lptCmdLineCopy); - return 0; - } - - for (lptFuncName = lptDllName;*lptFuncName && *lptFuncName != _T(',');lptFuncName++) {} - if (*lptFuncName == _T(',')) { - *(lptFuncName++) = 0; - } - else { - lptFuncName = FindArgStart(lptCmdLine); - lptCmdLine = FindArgEnd(lptFuncName); - if (*lptFuncName == _T('\"')) lptFuncName++; - } - - if (!*lptFuncName) { - free(lptCmdLineCopy); - return 0; - } - - if (*lptCmdLine) lptCmdLine = FindArgStart(lptCmdLine); - - nRetVal = 0; - - hDll = LoadLibrary(lptDllName); - if (hDll) { - nStrLen = _tcslen(lptFuncName); - lpFuncName = DuplicateToMultiByte(lptFuncName,nStrLen + 2); - - lpFuncName[nStrLen] = 'W'; - lpFuncName[nStrLen+1] = 0; - fnDllWinMainW = (DllWinMainW)GetProcAddress(hDll,lpFuncName); - fnDllWinMainA = 0; - if (!fnDllWinMainW) { - lpFuncName[nStrLen] = 'A'; - fnDllWinMainA = (DllWinMainA)GetProcAddress(hDll,lpFuncName); - if (!fnDllWinMainA) { - lpFuncName[nStrLen] = 0; - fnDllWinMainA = (DllWinMainA)GetProcAddress(hDll,lpFuncName); - } - } - - free(lpFuncName); - - RegisterBlankClass(hInstance); - // Create a window to pass the handle to the dll function - hWindow = CreateWindowEx(0,rundll32_wclass,rundll32_wtitle,0,CW_USEDEFAULT,0,CW_USEDEFAULT,0,0,0,hInstance,0); - - if (fnDllWinMainW) { - lpwCmdLine = ConvertToWideChar(lptCmdLine); - nRetVal = fnDllWinMainW(hWindow,hInstance,lpwCmdLine,nCmdShow); - FreeConvertedWideChar(lpwCmdLine); - } - else if (fnDllWinMainA) { - lpaCmdLine = ConvertToMultiByte(lptCmdLine); - nRetVal = fnDllWinMainA(hWindow,hInstance,lpaCmdLine,nCmdShow); - FreeConvertedMultiByte(lpaCmdLine); - } - else { - GetModuleTitle(); - lptMsgBuffer = (LPTSTR)malloc((_tcslen(MissingEntry) - 4 + _tcslen(lptFuncName) + _tcslen(lptDllName) + 1) * sizeof(TCHAR)); - _stprintf(lptMsgBuffer,MissingEntry,lptFuncName,lptDllName); - MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONERROR); - free(lptMsgBuffer); - } - - DestroyWindow(hWindow); - UnregisterClass(rundll32_wclass,hInstance); - - FreeLibrary(hDll); - } - else { - GetModuleTitle(); - lptMsgBuffer = (LPTSTR)malloc((_tcslen(DllNotLoaded) - 2 + _tcslen(lptDllName) + 1) * sizeof(TCHAR)); - _stprintf(lptMsgBuffer,DllNotLoaded,lptDllName); - MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONERROR); - free(lptMsgBuffer); - } - - free(lptCmdLineCopy); - return nRetVal; -} - +/* + * ReactOS rundll32 + * Copyright (C) 2003-2004 ReactOS Team + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS rundll32.exe + * FILE: apps/utils/rundll32/rundll32.c + * PURPOSE: Run a DLL as a program + * PROGRAMMER: ShadowFlare (blakflare@hotmail.com) + */ + +#define WIN32_LEAN_AND_MEAN + +// Both UNICODE and _UNICODE must be either defined or undefined +// because some headers use UNICODE and others use _UNICODE +#ifdef UNICODE +#ifndef _UNICODE +#define _UNICODE +#endif +#else +#ifdef _UNICODE +#define UNICODE +#endif +#endif + +#include +#include +#include +#include +#include + +typedef int (WINAPI *DllWinMainW)( + HWND hWnd, + HINSTANCE hInstance, + LPWSTR lpwCmdLine, + int nCmdShow +); +typedef int (WINAPI *DllWinMainA)( + HWND hWnd, + HINSTANCE hInstance, + LPSTR lpCmdLine, + int nCmdShow +); + +LPCTSTR DllNotLoaded = _T("LoadLibrary failed to load \"%s\""); +LPCTSTR MissingEntry = _T("Missing entry point:%s\nIn %s"); +LPCTSTR rundll32_wtitle = _T("rundll32"); +LPCTSTR rundll32_wclass = _T("rundll32_window"); +TCHAR ModuleFileName[MAX_PATH+1]; +LPTSTR ModuleTitle; + +// CommandLineToArgv converts a command-line string to argc and +// argv similar to the ones in the standard main function. +// This is a specialized version coded specifically for rundll32 +// and is not intended to be used in any other program. +LPTSTR *WINAPI CommandLineToArgv(LPCTSTR lpCmdLine, int *lpArgc) +{ + LPTSTR *argv, lpSrc, lpDest, lpArg; + int argc, nBSlash, nNames; + BOOL bInQuotes, bFirstChar; + + // If null was passed in for lpCmdLine, there are no arguments + if (!lpCmdLine) { + if (lpArgc) + *lpArgc = 0; + return 0; + } + + lpSrc = (LPTSTR)lpCmdLine; + // Skip spaces at beginning + while (*lpSrc == _T(' ') || *lpSrc == _T('\t')) + lpSrc++; + + // If command-line starts with null, there are no arguments + if (*lpSrc == 0) { + if (lpArgc) + *lpArgc = 0; + return 0; + } + + lpArg = lpSrc; + argc = 0; + nBSlash = 0; + bInQuotes = FALSE; + bFirstChar = TRUE; + nNames = 0; + + // Count the number of arguments + while (nNames < 4) { + if (*lpSrc == 0 || (*lpSrc == _T(',') && nNames == 2) || ((*lpSrc == _T(' ') || *lpSrc == _T('\t')) && !bInQuotes)) { + // Whitespace not enclosed in quotes signals the start of another argument + argc++; + + // Skip whitespace between arguments + while (*lpSrc == _T(' ') || *lpSrc == _T('\t') || (*lpSrc == _T(',') && nNames == 2)) + lpSrc++; + if (*lpSrc == 0) + break; + if (nNames >= 3) { + // Increment the count for the last argument + argc++; + break; + } + nBSlash = 0; + bFirstChar = TRUE; + continue; + } + else if (*lpSrc == _T('\\')) { + // Count consecutive backslashes + nBSlash++; + bFirstChar = FALSE; + } + else if (*lpSrc == _T('\"') && !(nBSlash & 1)) { + // Open or close quotes + bInQuotes = !bInQuotes; + nBSlash = 0; + } + else { + // Some other character + nBSlash = 0; + if (bFirstChar && ((*lpSrc != _T('/') && nNames <= 1) || nNames > 1)) + nNames++; + bFirstChar = FALSE; + } + lpSrc++; + } + + // Allocate space for the pointers in argv and the strings in one block + argv = (LPTSTR *)malloc(argc * sizeof(LPTSTR) + (_tcslen(lpArg) + 1) * sizeof(TCHAR)); + + if (!argv) { + // Memory allocation failed + if (lpArgc) + *lpArgc = 0; + return 0; + } + + lpSrc = lpArg; + lpDest = lpArg = (LPTSTR)(argv + argc); + argc = 0; + nBSlash = 0; + bInQuotes = FALSE; + bFirstChar = TRUE; + nNames = 0; + + // Fill the argument array + while (nNames < 4) { + if (*lpSrc == 0 || (*lpSrc == _T(',') && nNames == 2) || ((*lpSrc == _T(' ') || *lpSrc == _T('\t')) && !bInQuotes)) { + // Whitespace not enclosed in quotes signals the start of another argument + // Null-terminate argument + *lpDest++ = 0; + argv[argc++] = lpArg; + + // Skip whitespace between arguments + while (*lpSrc == _T(' ') || *lpSrc == _T('\t') || (*lpSrc == _T(',') && nNames == 2)) + lpSrc++; + if (*lpSrc == 0) + break; + lpArg = lpDest; + if (nNames >= 3) { + // Copy the rest of the command-line to the last argument + argv[argc++] = lpArg; + _tcscpy(lpArg,lpSrc); + break; + } + nBSlash = 0; + bFirstChar = TRUE; + continue; + } + else if (*lpSrc == _T('\\')) { + *lpDest++ = _T('\\'); + lpSrc++; + + // Count consecutive backslashes + nBSlash++; + bFirstChar = FALSE; + } + else if (*lpSrc == _T('\"')) { + if (!(nBSlash & 1)) { + // If an even number of backslashes are before the quotes, + // the quotes don't go in the output + lpDest -= nBSlash / 2; + bInQuotes = !bInQuotes; + } + else { + // If an odd number of backslashes are before the quotes, + // output a quote + lpDest -= (nBSlash + 1) / 2; + *lpDest++ = _T('\"'); + bFirstChar = FALSE; + } + lpSrc++; + nBSlash = 0; + } + else { + // Copy other characters + if (bFirstChar && ((*lpSrc != _T('/') && nNames <= 1) || nNames > 1)) + nNames++; + *lpDest++ = *lpSrc++; + nBSlash = 0; + bFirstChar = FALSE; + } + } + + if (lpArgc) + *lpArgc = argc; + return argv; +} + +void GetModuleTitle(void) +{ + LPTSTR lpStr; + + GetModuleFileName(0,ModuleFileName,MAX_PATH); + ModuleTitle = ModuleFileName; + + for (lpStr = ModuleFileName;*lpStr;lpStr++) { + if (*lpStr == _T('\\')) + ModuleTitle = lpStr+1; + } + + for (lpStr = ModuleTitle;*lpStr;lpStr++) { + if (_tcsicmp(lpStr,_T(".exe"))==0) + break; + } + + *lpStr = 0; +} + +// The macro ConvertToWideChar takes a tstring parameter and returns +// a pointer to a unicode string. A conversion is performed if +// neccessary. FreeConvertedWideChar string should be used on the +// return value of ConvertToWideChar when the string is no longer +// needed. The original string or the string that is returned +// should not be modified until FreeConvertedWideChar has been called. +#ifdef UNICODE +#define ConvertToWideChar(lptString) (lptString) +#define FreeConvertedWideChar(lpwString) +#else + +LPWSTR ConvertToWideChar(LPCSTR lpString) +{ + LPWSTR lpwString; + size_t nStrLen; + + nStrLen = strlen(lpString) + 1; + + lpwString = (LPWSTR)malloc(nStrLen * sizeof(WCHAR)); + MultiByteToWideChar(0,0,lpString,nStrLen,lpwString,nStrLen); + + return lpwString; +} + +#define FreeConvertedWideChar(lpwString) free(lpwString) +#endif + +// The macro ConvertToMultiByte takes a tstring parameter and returns +// a pointer to an ansi string. A conversion is performed if +// neccessary. FreeConvertedMultiByte string should be used on the +// return value of ConvertToMultiByte when the string is no longer +// needed. The original string or the string that is returned +// should not be modified until FreeConvertedMultiByte has been called. +#ifdef UNICODE +#define ConvertToMultiByte(lptString) DuplicateToMultiByte(lptString,0) +#define FreeConvertedMultiByte(lpaString) free(lpaString) +#else +#define ConvertToMultiByte(lptString) (lptString) +#define FreeConvertedMultiByte(lpaString) +#endif + +// DuplicateToMultiByte takes a tstring parameter and always returns +// a pointer to a duplicate ansi string. If nBufferSize is zero, +// the buffer length is the exact size of the string plus the +// terminating null. If nBufferSize is nonzero, the buffer length +// is equal to nBufferSize. As with strdup, free should be called +// for the returned string when it is no longer needed. +LPSTR DuplicateToMultiByte(LPCTSTR lptString, size_t nBufferSize) +{ + LPSTR lpString; + size_t nStrLen; + + nStrLen = _tcslen(lptString) + 1; + if (nBufferSize == 0) nBufferSize = nStrLen; + + lpString = (LPSTR)malloc(nBufferSize); +#ifdef UNICODE + WideCharToMultiByte(0,0,lptString,nStrLen,lpString,nBufferSize,0,0); +#else + strncpy(lpString,lptString,nBufferSize); +#endif + + return lpString; +} + +LRESULT CALLBACK EmptyWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + return DefWindowProc(hWnd, uMsg, wParam, lParam); +} + +// Registers a minimal window class for passing to the dll function +ATOM RegisterBlankClass(HINSTANCE hInstance) +{ + WNDCLASSEX wcex; + + wcex.cbSize = sizeof(WNDCLASSEX); + + wcex.style = 0; + wcex.lpfnWndProc = EmptyWindowProc; + wcex.cbClsExtra = 0; + wcex.cbWndExtra = 0; + wcex.hInstance = hInstance; + wcex.hIcon = 0; + wcex.hCursor = 0; + wcex.hbrBackground = 0; + wcex.lpszMenuName = 0; + wcex.lpszClassName = rundll32_wclass; + wcex.hIconSm = 0; + + return RegisterClassEx(&wcex); +} + +int WINAPI WinMain( + HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpCmdLineA, + int nCmdShow +) +{ + int argc; + LPTSTR *argv; + LPTSTR lptCmdLine,lptDllName,lptFuncName,lptMsgBuffer; + LPSTR lpFuncName,lpaCmdLine; + LPWSTR lpwCmdLine; + HMODULE hDll; + DllWinMainW fnDllWinMainW; + DllWinMainA fnDllWinMainA; + HWND hWindow; + int nRetVal,i; + size_t nStrLen; + + // Get command-line in argc-argv format + argv = CommandLineToArgv(GetCommandLine(),&argc); + + // Skip all beginning arguments starting with a slash (/) + for (i = 1; i < argc; i++) + if (*argv[i] != _T('/')) break; + + // If no dll was specified, there is nothing to do + if (i >= argc) { + if (argv) free(argv); + return 0; + } + + lptDllName = argv[i++]; + + // The next argument, which specifies the name of the dll function, + // can either have a comma between it and the dll filename or a space. + // Using a comma here is the preferred method + if (i < argc) + lptFuncName = argv[i++]; + else + lptFuncName = _T(""); + + // If no function name was specified, nothing needs to be done + if (!*lptFuncName) { + if (argv) free(argv); + return 0; + } + + // The rest of the arguments will be passed to dll function + if (i < argc) + lptCmdLine = argv[i]; + else + lptCmdLine = _T(""); + + nRetVal = 0; + + // Everything is all setup, so load the dll now + hDll = LoadLibrary(lptDllName); + if (hDll) { + nStrLen = _tcslen(lptFuncName); + // Make a non-unicode version of the function name, + // since that is all GetProcAddress accepts + lpFuncName = DuplicateToMultiByte(lptFuncName,nStrLen + 2); + +#ifdef UNICODE + lpFuncName[nStrLen] = 'W'; + lpFuncName[nStrLen+1] = 0; + // Get address of unicode version of the dll function if it exists + fnDllWinMainW = (DllWinMainW)GetProcAddress(hDll,lpFuncName); + fnDllWinMainA = 0; + if (!fnDllWinMainW) { + // If no unicode function was found, get the address of the non-unicode function + lpFuncName[nStrLen] = 'A'; + fnDllWinMainA = (DllWinMainA)GetProcAddress(hDll,lpFuncName); + if (!fnDllWinMainA) { + // If first non-unicode function was not found, get the address + // of the other non-unicode function + lpFuncName[nStrLen] = 0; + fnDllWinMainA = (DllWinMainA)GetProcAddress(hDll,lpFuncName); + } + } +#else + // Get address of non-unicode version of the dll function if it exists + fnDllWinMainA = (DllWinMainA)GetProcAddress(hDll,lpFuncName); + fnDllWinMainW = 0; + if (!fnDllWinMainA) { + // If first non-unicode function was not found, get the address + // of the other non-unicode function + lpFuncName[nStrLen] = 'A'; + lpFuncName[nStrLen+1] = 0; + fnDllWinMainA = (DllWinMainA)GetProcAddress(hDll,lpFuncName); + if (!fnDllWinMainA) { + // If non-unicode function was not found, get the address of the unicode function + lpFuncName[nStrLen] = 'W'; + fnDllWinMainW = (DllWinMainW)GetProcAddress(hDll,lpFuncName); + } + } +#endif + + free(lpFuncName); + + RegisterBlankClass(hInstance); + // Create a window so we can pass a window handle to + // the dll function; this is required + hWindow = CreateWindowEx(0,rundll32_wclass,rundll32_wtitle,0,CW_USEDEFAULT,0,CW_USEDEFAULT,0,0,0,hInstance,0); + + if (fnDllWinMainW) { + // Convert the command-line string to unicode and call the dll function + lpwCmdLine = ConvertToWideChar(lptCmdLine); + nRetVal = fnDllWinMainW(hWindow,hInstance,lpwCmdLine,nCmdShow); + FreeConvertedWideChar(lpwCmdLine); + } + else if (fnDllWinMainA) { + // Convert the command-line string to ansi and call the dll function + lpaCmdLine = ConvertToMultiByte(lptCmdLine); + nRetVal = fnDllWinMainA(hWindow,hInstance,lpaCmdLine,nCmdShow); + FreeConvertedMultiByte(lpaCmdLine); + } + else { + // The specified dll function was not found; display an error message + GetModuleTitle(); + lptMsgBuffer = (LPTSTR)malloc((_tcslen(MissingEntry) - 4 + _tcslen(lptFuncName) + _tcslen(lptDllName) + 1) * sizeof(TCHAR)); + _stprintf(lptMsgBuffer,MissingEntry,lptFuncName,lptDllName); + MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONERROR); + free(lptMsgBuffer); + } + + DestroyWindow(hWindow); + UnregisterClass(rundll32_wclass,hInstance); + + // The dll function has finished executing, so unload it + FreeLibrary(hDll); + } + else { + // The dll could not be loaded; display an error message + GetModuleTitle(); + lptMsgBuffer = (LPTSTR)malloc((_tcslen(DllNotLoaded) - 2 + _tcslen(lptDllName) + 1) * sizeof(TCHAR)); + _stprintf(lptMsgBuffer,DllNotLoaded,lptDllName); + MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONERROR); + free(lptMsgBuffer); + } + + if (argv) free(argv); + return nRetVal; +} + From b1fc9ebb0238987e4ae7aa39fa1f506a07467b08 Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Sun, 15 Feb 2004 05:51:20 +0000 Subject: [PATCH 0027/1463] Author: ShadowFlare Arty's note: Added ShadowFlare's regsvr32. The one in rosapps doesn't seem to build, so I think it should be eventually removed. I'm putting this one here instead of rosapps because it goes with some of the other apps in this directory (like rundll32) svn path=/trunk/; revision=8183 --- reactos/apps/utils/regsvr32/.cvsignore | 6 + reactos/apps/utils/regsvr32/makefile | 21 + reactos/apps/utils/regsvr32/regsvr32.c | 487 ++++++++++++++++++++++++ reactos/apps/utils/regsvr32/regsvr32.rc | 38 ++ 4 files changed, 552 insertions(+) create mode 100644 reactos/apps/utils/regsvr32/.cvsignore create mode 100644 reactos/apps/utils/regsvr32/makefile create mode 100644 reactos/apps/utils/regsvr32/regsvr32.c create mode 100644 reactos/apps/utils/regsvr32/regsvr32.rc diff --git a/reactos/apps/utils/regsvr32/.cvsignore b/reactos/apps/utils/regsvr32/.cvsignore new file mode 100644 index 00000000000..d63774a7353 --- /dev/null +++ b/reactos/apps/utils/regsvr32/.cvsignore @@ -0,0 +1,6 @@ +*.o +*.d +*.exe +*.coff +*.sym +*.map diff --git a/reactos/apps/utils/regsvr32/makefile b/reactos/apps/utils/regsvr32/makefile new file mode 100644 index 00000000000..2aef65ae2ed --- /dev/null +++ b/reactos/apps/utils/regsvr32/makefile @@ -0,0 +1,21 @@ +PATH_TO_TOP = ../../.. + +TARGET_TYPE = program + +TARGET_APPTYPE = windows + +TARGET_NAME = regsvr32 + +TARGET_INSTALLDIR = system32 + +TARGET_SDKLIBS = kernel32.a user32.a ole32.a + +TARGET_OBJECTS = regsvr32.o + +TARGET_CFLAGS += -DUNICODE -Wall -Werror -D__USE_W32API + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/reactos/apps/utils/regsvr32/regsvr32.c b/reactos/apps/utils/regsvr32/regsvr32.c new file mode 100644 index 00000000000..4bb958e1958 --- /dev/null +++ b/reactos/apps/utils/regsvr32/regsvr32.c @@ -0,0 +1,487 @@ +/* + * ReactOS regsvr32 + * Copyright (C) 2004 ReactOS Team + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS regsvr32.exe + * FILE: apps/utils/regsvr32/regsvr32.c + * PURPOSE: Register a COM component in the registry + * PROGRAMMER: ShadowFlare (blakflare@hotmail.com) + */ + +#define WIN32_LEAN_AND_MEAN + +// Both UNICODE and _UNICODE must be either defined or undefined +// because some headers use UNICODE and others use _UNICODE +#ifdef UNICODE +#ifndef _UNICODE +#define _UNICODE +#endif +#else +#ifdef _UNICODE +#define UNICODE +#endif +#endif + +#include +#include +#include +#include +#include +#include + +typedef HRESULT (WINAPI *DLLREGISTER)(void); +typedef HRESULT (WINAPI *DLLINSTALL)(BOOL bInstall, LPWSTR lpwCmdLine); + +#define EXITCODE_SUCCESS 0 +#define EXITCODE_PARAMERROR 1 +#define EXITCODE_LOADERROR 3 +#define EXITCODE_NOENTRY 4 +#define EXITCODE_FAILURE 5 + +LPCSTR szDllRegister = "DllRegisterServer"; +LPCSTR szDllUnregister = "DllUnregisterServer"; +LPCSTR szDllInstall = "DllInstall"; +#ifdef UNICODE +LPCWSTR tszDllRegister = L"DllRegisterServer"; +LPCWSTR tszDllUnregister = L"DllUnregisterServer"; +LPCWSTR tszDllInstall = L"DllInstall"; +#else +#define tszDllRegister szDllRegister +#define tszDllUnregister szDllUnregister +#define tszDllInstall szDllInstall +#endif + +LPCTSTR ModuleTitle = _T("RegSvr32"); +LPCTSTR UsageMessage = + _T("%s\n\n") + _T("Usage: regsvr32 [/u] [/s] [/c] [/n] [/i[:cmdline]] dllname\n") + _T("/u - Unregister server\n") + _T("/s - Silent; display no message boxes\n") + _T("/c - Console output\n") + _T("/i - Call DllInstall passing it an optional [cmdline]; when used with /u calls dll uninstall\n") + _T("/n - Do not call DllRegisterServer; this option must be used with /i"); +LPCTSTR NoDllSpecified = _T("No DLL name specified."); +LPCTSTR InvalidFlag = _T("Unrecognized flag: %s"); +LPCTSTR SwitchN_NoI = _T("Unrecognized flag: /n must be used with the /i switch"); +LPCTSTR DllNotLoaded = + _T("LoadLibrary(\"%s\") failed.\n") + _T("GetLastError returns 0x%08x."); +LPCTSTR MissingEntry = + _T("%s was loaded, but the %s entry point was not found.\n\n") + _T("%s may not be exported, or a corrupt version of %s may be in memory. Consider using PView to detect and remove it."); +LPCTSTR FailureMessage = + _T("%s in %s failed.\n") + _T("Return code was: 0x%08x"); +LPCTSTR SuccessMessage = _T("%s in %s succeeded."); + +// The macro CommandLineToArgv maps to a function that converts +// a command-line string to argc and argv similar to the ones +// in the standard main function. If this code is compiled for +// unicode, the build-in Windows API function is used, otherwise +// a non-unicode non-API version is used for compatibility with +// Windows versions that have no unicode support. +#ifdef UNICODE +#define CommandLineToArgv CommandLineToArgvW +#include +#else +#define CommandLineToArgv CommandLineToArgvT + +LPTSTR *WINAPI CommandLineToArgvT(LPCTSTR lpCmdLine, int *lpArgc) +{ + HGLOBAL hargv; + LPTSTR *argv, lpSrc, lpDest, lpArg; + int argc, nBSlash; + BOOL bInQuotes; + + // If null was passed in for lpCmdLine, there are no arguments + if (!lpCmdLine) { + if (lpArgc) + *lpArgc = 0; + return 0; + } + + lpSrc = (LPTSTR)lpCmdLine; + // Skip spaces at beginning + while (*lpSrc == _T(' ') || *lpSrc == _T('\t')) + lpSrc++; + + // If command-line starts with null, there are no arguments + if (*lpSrc == 0) { + if (lpArgc) + *lpArgc = 0; + return 0; + } + + lpArg = lpSrc; + argc = 0; + nBSlash = 0; + bInQuotes = FALSE; + + // Count the number of arguments + while (1) { + if (*lpSrc == 0 || ((*lpSrc == _T(' ') || *lpSrc == _T('\t')) && !bInQuotes)) { + // Whitespace not enclosed in quotes signals the start of another argument + argc++; + + // Skip whitespace between arguments + while (*lpSrc == _T(' ') || *lpSrc == _T('\t')) + lpSrc++; + if (*lpSrc == 0) + break; + nBSlash = 0; + continue; + } + else if (*lpSrc == _T('\\')) { + // Count consecutive backslashes + nBSlash++; + } + else if (*lpSrc == _T('\"') && !(nBSlash & 1)) { + // Open or close quotes + bInQuotes = !bInQuotes; + nBSlash = 0; + } + else { + // Some other character + nBSlash = 0; + } + lpSrc++; + } + + // Allocate space the same way as CommandLineToArgvW for compatibility + hargv = GlobalAlloc(0, argc * sizeof(LPTSTR) + (_tcslen(lpArg) + 1) * sizeof(TCHAR)); + argv = (LPTSTR *)GlobalLock(hargv); + + if (!argv) { + // Memory allocation failed + if (lpArgc) + *lpArgc = 0; + return 0; + } + + lpSrc = lpArg; + lpDest = lpArg = (LPTSTR)(argv + argc); + argc = 0; + nBSlash = 0; + bInQuotes = FALSE; + + // Fill the argument array + while (1) { + if (*lpSrc == 0 || ((*lpSrc == _T(' ') || *lpSrc == _T('\t')) && !bInQuotes)) { + // Whitespace not enclosed in quotes signals the start of another argument + // Null-terminate argument + *lpDest++ = 0; + argv[argc++] = lpArg; + + // Skip whitespace between arguments + while (*lpSrc == _T(' ') || *lpSrc == _T('\t')) + lpSrc++; + if (*lpSrc == 0) + break; + lpArg = lpDest; + nBSlash = 0; + continue; + } + else if (*lpSrc == _T('\\')) { + *lpDest++ = _T('\\'); + lpSrc++; + + // Count consecutive backslashes + nBSlash++; + } + else if (*lpSrc == _T('\"')) { + if (!(nBSlash & 1)) { + // If an even number of backslashes are before the quotes, + // the quotes don't go in the output + lpDest -= nBSlash / 2; + bInQuotes = !bInQuotes; + } + else { + // If an odd number of backslashes are before the quotes, + // output a quote + lpDest -= (nBSlash + 1) / 2; + *lpDest++ = _T('\"'); + } + lpSrc++; + nBSlash = 0; + } + else { + // Copy other characters + *lpDest++ = *lpSrc++; + nBSlash = 0; + } + } + + if (lpArgc) + *lpArgc = argc; + return argv; +} + +#endif + +// The macro ConvertToWideChar takes a tstring parameter and returns +// a pointer to a unicode string. A conversion is performed if +// neccessary. FreeConvertedWideChar string should be used on the +// return value of ConvertToWideChar when the string is no longer +// needed. The original string or the string that is returned +// should not be modified until FreeConvertedWideChar has been called. +#ifdef UNICODE +#define ConvertToWideChar(lptString) (lptString) +#define FreeConvertedWideChar(lpwString) +#else + +LPWSTR ConvertToWideChar(LPCSTR lpString) +{ + LPWSTR lpwString; + size_t nStrLen; + + nStrLen = strlen(lpString) + 1; + + lpwString = (LPWSTR)malloc(nStrLen * sizeof(WCHAR)); + MultiByteToWideChar(0,0,lpString,nStrLen,lpwString,nStrLen); + + return lpwString; +} + +#define FreeConvertedWideChar(lpwString) free(lpwString) +#endif + +int WINAPI WinMain( + HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpCmdLineA, + int nCmdShow +) +{ + int argc; + LPTSTR *argv; + LPTSTR lptDllName,lptDllCmdLine,lptMsgBuffer; + LPCTSTR lptFuncName; + LPCSTR lpFuncName; + LPWSTR lpwDllCmdLine; + BOOL bUnregister,bSilent,bConsole,bInstall,bNoRegister; + UINT nDllCount; + HMODULE hDll; + DLLREGISTER fnDllRegister; + DLLINSTALL fnDllInstall; + HRESULT hResult; + DWORD dwErr; + int nRetValue,i; + + // Get command-line in argc-argv format + argv = CommandLineToArgv(GetCommandLine(),&argc); + + // Initialize variables + lptFuncName = 0; + lptDllCmdLine = 0; + nDllCount = 0; + bUnregister = FALSE; + bSilent = FALSE; + bConsole = FALSE; + bInstall = FALSE; + bNoRegister = FALSE; + + // Find all arguments starting with a slash (/) + for (i = 1; i < argc; i++) { + if (*argv[i] == _T('/')) { + switch (argv[i][1]) { + case _T('u'): + case _T('U'): + bUnregister = TRUE; + break; + case _T('s'): + case _T('S'): + bSilent = TRUE; + break; + case _T('c'): + case _T('C'): + bConsole = TRUE; + break; + case _T('i'): + case _T('I'): + bInstall = TRUE; + if (argv[i][2] == _T(':')) + lptDllCmdLine = argv[i]+3; + else + lptDllCmdLine = _T(""); + break; + case _T('n'): + case _T('N'): + bNoRegister = TRUE; + break; + default: + if (!lptFuncName) + lptFuncName = argv[i]; + } + } + else { + nDllCount++; + } + } + + // An unrecognized flag was used, display a message and show available options + if (lptFuncName) { + if (!bSilent) { + lptMsgBuffer = (LPTSTR)malloc((_tcslen(UsageMessage) - 2 + _tcslen(InvalidFlag) - 2 + _tcslen(lptFuncName) + 1) * sizeof(TCHAR)); + _stprintf(lptMsgBuffer + (_tcslen(UsageMessage) - 2),InvalidFlag,lptFuncName); + _stprintf(lptMsgBuffer,UsageMessage,lptMsgBuffer + (_tcslen(UsageMessage) - 2)); + MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONEXCLAMATION); + free(lptMsgBuffer); + } + GlobalFree(argv); + return EXITCODE_PARAMERROR; + } + + // /n was used without /i, display a message and show available options + if (bNoRegister && (!bInstall)) { + if (!bSilent) { + lptMsgBuffer = (LPTSTR)malloc((_tcslen(UsageMessage) - 2 + _tcslen(SwitchN_NoI) + 1) * sizeof(TCHAR)); + _stprintf(lptMsgBuffer,UsageMessage,SwitchN_NoI); + MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONEXCLAMATION); + free(lptMsgBuffer); + } + GlobalFree(argv); + return EXITCODE_PARAMERROR; + } + + // No dll was specified, display a message and show available options + if (nDllCount == 0) { + if (!bSilent) { + lptMsgBuffer = (LPTSTR)malloc((_tcslen(UsageMessage) - 2 + _tcslen(NoDllSpecified) + 1) * sizeof(TCHAR)); + _stprintf(lptMsgBuffer,UsageMessage,NoDllSpecified); + MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONEXCLAMATION); + free(lptMsgBuffer); + } + GlobalFree(argv); + return EXITCODE_PARAMERROR; + } + + nRetValue = EXITCODE_SUCCESS; + if (!bUnregister) { + lpFuncName = szDllRegister; + lptFuncName = tszDllRegister; + } + else { + lpFuncName = szDllUnregister; + lptFuncName = tszDllUnregister; + } + + if (lptDllCmdLine) + lpwDllCmdLine = ConvertToWideChar(lptDllCmdLine); + else + lpwDllCmdLine = 0; + + // Initialize OLE32 before attempting to register the + // dll. Some dll's require this to register properly + OleInitialize(0); + + // (Un)register every dll whose filename was passed in the command-line string + for (i = 1; i < argc; i++) { + // Arguments that do not start with a slash (/) are filenames + if (*argv[i] != _T('/')) { + lptDllName = argv[i]; + + // Everything is all setup, so load the dll now + hDll = LoadLibrary(lptDllName); + if (hDll) { + if (!bNoRegister) { + // Get the address of DllRegisterServer or DllUnregisterServer + fnDllRegister = (DLLREGISTER)GetProcAddress(hDll,lpFuncName); + if (fnDllRegister) { + // If the function exists, call it + hResult = fnDllRegister(); + if (!bSilent) { + if (hResult == S_OK) { + // (Un)register succeeded, display a message + lptMsgBuffer = (LPTSTR)malloc((_tcslen(SuccessMessage) - 4 + _tcslen(lptFuncName) + _tcslen(lptDllName) + 1) * sizeof(TCHAR)); + _stprintf(lptMsgBuffer,SuccessMessage,lptFuncName,lptDllName); + MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONINFORMATION); + } + else { + // (Un)register failed, display a message + lptMsgBuffer = (LPTSTR)malloc((_tcslen(FailureMessage) + _tcslen(lptFuncName) + _tcslen(lptDllName) + 1) * sizeof(TCHAR)); + _stprintf(lptMsgBuffer,FailureMessage,lptFuncName,lptDllName,hResult); + MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONEXCLAMATION); + } + free(lptMsgBuffer); + } + if (hResult != S_OK) + nRetValue = EXITCODE_FAILURE; + } + else { + FreeLibrary(hDll); + if (!bSilent) { + // Dll(Un)register was not found, display an error message + lptMsgBuffer = (LPTSTR)malloc((_tcslen(MissingEntry) - 8 + _tcslen(lptFuncName) * 2 + _tcslen(lptDllName) * 2 + 1) * sizeof(TCHAR)); + _stprintf(lptMsgBuffer,MissingEntry,lptDllName,lptFuncName,lptFuncName,lptDllName); + MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONEXCLAMATION); + free(lptMsgBuffer); + } + nRetValue = EXITCODE_NOENTRY; + } + } + + if (bInstall) { + // Get the address of DllInstall + fnDllInstall = (DLLINSTALL)GetProcAddress(hDll,szDllInstall); + if (fnDllInstall) { + // If the function exists, call it + if (!bUnregister) + hResult = fnDllInstall(1,lpwDllCmdLine); + else + hResult = fnDllInstall(0,lpwDllCmdLine); + if (!bSilent) { + if (hResult == S_OK) { + // (Un)install succeeded, display a message + lptMsgBuffer = (LPTSTR)malloc((_tcslen(SuccessMessage) - 4 + _tcslen(tszDllInstall) + _tcslen(lptDllName) + 1) * sizeof(TCHAR)); + _stprintf(lptMsgBuffer,SuccessMessage,tszDllInstall,lptDllName); + MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONINFORMATION); + } + else { + // (Un)install failed, display a message + lptMsgBuffer = (LPTSTR)malloc((_tcslen(FailureMessage) + _tcslen(tszDllInstall) + _tcslen(lptDllName) + 1) * sizeof(TCHAR)); + _stprintf(lptMsgBuffer,FailureMessage,tszDllInstall,lptDllName,hResult); + MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONEXCLAMATION); + } + free(lptMsgBuffer); + } + if (hResult != S_OK) + nRetValue = EXITCODE_FAILURE; + } + else { + FreeLibrary(hDll); + if (!bSilent) { + // DllInstall was not found, display an error message + lptMsgBuffer = (LPTSTR)malloc((_tcslen(MissingEntry) - 8 + _tcslen(tszDllInstall) * 2 + _tcslen(lptDllName) * 2 + 1) * sizeof(TCHAR)); + _stprintf(lptMsgBuffer,MissingEntry,lptDllName,tszDllInstall,tszDllInstall,lptDllName); + MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONEXCLAMATION); + free(lptMsgBuffer); + } + nRetValue = EXITCODE_NOENTRY; + } + } + + // The dll function has finished executing, so unload it + FreeLibrary(hDll); + } + else { + if (!bSilent) { + // The dll could not be loaded; display an error message + dwErr = GetLastError(); + lptMsgBuffer = (LPTSTR)malloc((_tcslen(DllNotLoaded) + 2 + _tcslen(lptDllName) + 1) * sizeof(TCHAR)); + _stprintf(lptMsgBuffer,DllNotLoaded,lptDllName,dwErr); + MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONEXCLAMATION); + free(lptMsgBuffer); + } + nRetValue = EXITCODE_LOADERROR; + } + } + } + + if (lpwDllCmdLine) + FreeConvertedWideChar(lpwDllCmdLine); + GlobalFree(argv); + OleUninitialize(); + return nRetValue; +} + diff --git a/reactos/apps/utils/regsvr32/regsvr32.rc b/reactos/apps/utils/regsvr32/regsvr32.rc new file mode 100644 index 00000000000..99c008244e8 --- /dev/null +++ b/reactos/apps/utils/regsvr32/regsvr32.rc @@ -0,0 +1,38 @@ +#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", "Register a COM component in the registry\0" + VALUE "FileVersion", RES_STR_FILE_VERSION + VALUE "InternalName", "regsvr32\0" + VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT + VALUE "OriginalFilename", "regsvr32.exe\0" + VALUE "ProductName", RES_STR_PRODUCT_NAME + VALUE "ProductVersion", RES_STR_PRODUCT_VERSION + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + From e592ecdfeb5172e666124e7554a16e952820487e Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Sun, 15 Feb 2004 05:52:47 +0000 Subject: [PATCH 0028/1463] Added new regsvr32 app. svn path=/trunk/; revision=8184 --- reactos/apps/utils/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/apps/utils/Makefile b/reactos/apps/utils/Makefile index be89a0056a5..ec127395847 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 +UTIL_APPS = cat objdir partinfo pnpdump sc stats tickcount consw rundll32 regsvr32 UTIL_NET_APPS = From a1bb46750c145eee302a7fe2bd7c895bdd12ae21 Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Sun, 15 Feb 2004 06:04:35 +0000 Subject: [PATCH 0029/1463] Removed makefile temporarily. svn path=/trunk/; revision=8185 --- reactos/apps/utils/regsvr32/makefile | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 reactos/apps/utils/regsvr32/makefile diff --git a/reactos/apps/utils/regsvr32/makefile b/reactos/apps/utils/regsvr32/makefile deleted file mode 100644 index 2aef65ae2ed..00000000000 --- a/reactos/apps/utils/regsvr32/makefile +++ /dev/null @@ -1,21 +0,0 @@ -PATH_TO_TOP = ../../.. - -TARGET_TYPE = program - -TARGET_APPTYPE = windows - -TARGET_NAME = regsvr32 - -TARGET_INSTALLDIR = system32 - -TARGET_SDKLIBS = kernel32.a user32.a ole32.a - -TARGET_OBJECTS = regsvr32.o - -TARGET_CFLAGS += -DUNICODE -Wall -Werror -D__USE_W32API - -include $(PATH_TO_TOP)/rules.mak - -include $(TOOLS_PATH)/helper.mk - -# EOF From b972d29c37e189afc9394c25c2893e901f376514 Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Sun, 15 Feb 2004 06:05:05 +0000 Subject: [PATCH 0030/1463] Added with dos eols. svn path=/trunk/; revision=8186 --- reactos/apps/utils/regsvr32/makefile | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 reactos/apps/utils/regsvr32/makefile diff --git a/reactos/apps/utils/regsvr32/makefile b/reactos/apps/utils/regsvr32/makefile new file mode 100644 index 00000000000..2aef65ae2ed --- /dev/null +++ b/reactos/apps/utils/regsvr32/makefile @@ -0,0 +1,21 @@ +PATH_TO_TOP = ../../.. + +TARGET_TYPE = program + +TARGET_APPTYPE = windows + +TARGET_NAME = regsvr32 + +TARGET_INSTALLDIR = system32 + +TARGET_SDKLIBS = kernel32.a user32.a ole32.a + +TARGET_OBJECTS = regsvr32.o + +TARGET_CFLAGS += -DUNICODE -Wall -Werror -D__USE_W32API + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF From 9959de026c0caa8b3642e20078b573c88c9215ed Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Sun, 15 Feb 2004 06:20:54 +0000 Subject: [PATCH 0031/1463] One more try with unix eols. svn path=/trunk/; revision=8187 --- reactos/apps/utils/regsvr32/makefile | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 reactos/apps/utils/regsvr32/makefile diff --git a/reactos/apps/utils/regsvr32/makefile b/reactos/apps/utils/regsvr32/makefile deleted file mode 100644 index 2aef65ae2ed..00000000000 --- a/reactos/apps/utils/regsvr32/makefile +++ /dev/null @@ -1,21 +0,0 @@ -PATH_TO_TOP = ../../.. - -TARGET_TYPE = program - -TARGET_APPTYPE = windows - -TARGET_NAME = regsvr32 - -TARGET_INSTALLDIR = system32 - -TARGET_SDKLIBS = kernel32.a user32.a ole32.a - -TARGET_OBJECTS = regsvr32.o - -TARGET_CFLAGS += -DUNICODE -Wall -Werror -D__USE_W32API - -include $(PATH_TO_TOP)/rules.mak - -include $(TOOLS_PATH)/helper.mk - -# EOF From eee30419e810f0f8f55892ef0831e5afa70ae0d0 Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Sun, 15 Feb 2004 06:21:16 +0000 Subject: [PATCH 0032/1463] Added makefile with unix eols. svn path=/trunk/; revision=8188 --- reactos/apps/utils/regsvr32/makefile | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 reactos/apps/utils/regsvr32/makefile diff --git a/reactos/apps/utils/regsvr32/makefile b/reactos/apps/utils/regsvr32/makefile new file mode 100644 index 00000000000..0dcd5eaa1b6 --- /dev/null +++ b/reactos/apps/utils/regsvr32/makefile @@ -0,0 +1,21 @@ +PATH_TO_TOP = ../../.. + +TARGET_TYPE = program + +TARGET_APPTYPE = windows + +TARGET_NAME = regsvr32 + +TARGET_INSTALLDIR = system32 + +TARGET_SDKLIBS = kernel32.a user32.a ole32.a + +TARGET_OBJECTS = regsvr32.o + +TARGET_CFLAGS += -DUNICODE -Wall -Werror -D__USE_W32API + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF From 89d845f33825c6f7d0a2b5465f5423b3429a284a Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Sun, 15 Feb 2004 07:03:02 +0000 Subject: [PATCH 0033/1463] Some unstub which should allow programs that use getprotobyname to work. This eventually needs to tie in properly to the layered service stuff. svn path=/trunk/; revision=8189 --- reactos/lib/ws2_32/misc/ns.c | 22 ++++++++++++++++++---- reactos/lib/ws2_32/misc/stubs.c | 2 +- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/reactos/lib/ws2_32/misc/ns.c b/reactos/lib/ws2_32/misc/ns.c index ed9cafc8a7e..e5896d53be0 100644 --- a/reactos/lib/ws2_32/misc/ns.c +++ b/reactos/lib/ws2_32/misc/ns.c @@ -380,6 +380,13 @@ gethostname( /* + * XXX arty -- Partial implementation pending a better one. This one will + * do for normal purposes. + * + * Return the address of a static LPPROTOENT corresponding to the named + * protocol. These structs aren't very interesting, so I'm not too ashamed + * to have this function work on builtins for now. + * * @unimplemented */ LPPROTOENT @@ -387,12 +394,19 @@ EXPORT getprotobyname( IN CONST CHAR FAR* name) { - UNIMPLEMENTED - - return (LPPROTOENT)NULL; + static CHAR *udp_aliases = 0; + static PROTOENT udp = { "udp", &udp_aliases, 17 }; + static CHAR *tcp_aliases = 0; + static PROTOENT tcp = { "tcp", &tcp_aliases, 6 }; + if( !_stricmp( name, "udp" ) ) { + return &udp; + } else if( !_stricmp( name, "tcp" ) ) { + return &tcp; + } + + return 0; } - /* * @unimplemented */ diff --git a/reactos/lib/ws2_32/misc/stubs.c b/reactos/lib/ws2_32/misc/stubs.c index 0c56f689ec3..f3b9d1be9e1 100644 --- a/reactos/lib/ws2_32/misc/stubs.c +++ b/reactos/lib/ws2_32/misc/stubs.c @@ -836,7 +836,7 @@ WSANSPIoctl( LPWSACOMPLETION lpCompletion ) { - UNIMPLEMENTED + //UNIMPLEMENTED return 0; } From b900afead35fe4762bc28dfd91d5992cabef558c Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Sun, 15 Feb 2004 07:03:56 +0000 Subject: [PATCH 0034/1463] GetComputerName(Ex)?[AW] implemented. These are needed for the wine iphlpapi_main. svn path=/trunk/; revision=8190 --- reactos/lib/kernel32/makefile | 7 +- reactos/lib/kernel32/misc/computername.c | 324 +++++++++++++++-------- reactos/lib/kernel32/misc/stubs.c | 32 +-- 3 files changed, 222 insertions(+), 141 deletions(-) diff --git a/reactos/lib/kernel32/makefile b/reactos/lib/kernel32/makefile index 470019ec572..c7c83249b32 100644 --- a/reactos/lib/kernel32/makefile +++ b/reactos/lib/kernel32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.75 2004/01/16 21:08:31 mf Exp $ +# $Id: makefile,v 1.76 2004/02/15 07:03:55 arty Exp $ PATH_TO_TOP = ../.. @@ -70,11 +70,10 @@ DEBUG_OBJECTS = debug/debugger.o debug/output.o debug/break.o ARCH_OBJECTS = $(THREAD_I386_OBJECTS) TARGET_OBJECTS = $(MISC_OBJECTS) $(FILE_OBJECTS) $(THREAD_OBJECTS) \ - $(PROCESS_OBJECTS) $(STRING_OBJECTS) $(MEM_OBJECTS) \ - $(SYNCH_OBJECTS) $(EXCEPT_OBJECTS) $(DEBUG_OBJECTS) \ + $(PROCESS_OBJECTS) $(STRING_OBJECTS) $(MEM_OBJECTS) \ + $(SYNCH_OBJECTS) $(EXCEPT_OBJECTS) $(DEBUG_OBJECTS) \ $(ARCH_OBJECTS) - DEP_OBJECTS = $(TARGET_OBJECTS) include $(PATH_TO_TOP)/rules.mak diff --git a/reactos/lib/kernel32/misc/computername.c b/reactos/lib/kernel32/misc/computername.c index 153b517bb3f..ca849656cfa 100644 --- a/reactos/lib/kernel32/misc/computername.c +++ b/reactos/lib/kernel32/misc/computername.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: computername.c,v 1.4 2004/01/23 21:16:03 ekohl Exp $ +/* $Id: computername.c,v 1.5 2004/02/15 07:03:56 arty Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -28,6 +28,8 @@ /* INCLUDES ******************************************************************/ #include +#include +#include #define NDEBUG #include "../include/debug.h" @@ -35,6 +37,217 @@ /* FUNCTIONS *****************************************************************/ +static BOOL GetComputerNameFromRegistry( LPWSTR RegistryKey, + LPWSTR ValueNameStr, + LPWSTR lpBuffer, + LPDWORD nSize ) { + PKEY_VALUE_PARTIAL_INFORMATION KeyInfo; + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING KeyName; + UNICODE_STRING ValueName; + HANDLE KeyHandle; + ULONG KeyInfoSize; + ULONG ReturnSize; + NTSTATUS Status; + + RtlInitUnicodeString (&KeyName,RegistryKey); + InitializeObjectAttributes (&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = ZwOpenKey (&KeyHandle, + KEY_READ, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + SetLastErrorByStatus (Status); + return FALSE; + } + + KeyInfoSize = sizeof(KEY_VALUE_PARTIAL_INFORMATION) + + *nSize * sizeof(WCHAR); + KeyInfo = RtlAllocateHeap (RtlGetProcessHeap (), + 0, + KeyInfoSize); + if (KeyInfo == NULL) + { + ZwClose (KeyHandle); + SetLastError (ERROR_OUTOFMEMORY); + return FALSE; + } + + RtlInitUnicodeString (&ValueName,ValueNameStr); + + Status = ZwQueryValueKey (KeyHandle, + &ValueName, + KeyValuePartialInformation, + KeyInfo, + KeyInfoSize, + &ReturnSize); + if (!NT_SUCCESS(Status)) + { + RtlFreeHeap (RtlGetProcessHeap (), + 0, + KeyInfo); + ZwClose (KeyHandle); + SetLastErrorByStatus (Status); + return FALSE; + } + + DbgPrint("*nSize = %d, KeyInfo->DataLength = %d\n", + *nSize, KeyInfo->DataLength); + if( *nSize > (KeyInfo->DataLength / sizeof(WCHAR)) ) { + *nSize = KeyInfo->DataLength / sizeof(WCHAR); + lpBuffer[*nSize] = 0; + } + + RtlCopyMemory (lpBuffer, + KeyInfo->Data, + *nSize * sizeof(WCHAR)); + + RtlFreeHeap (RtlGetProcessHeap (), + 0, + KeyInfo) +; + ZwClose (KeyHandle); + + return TRUE; +} + +/* + * @implemented + */ +BOOL STDCALL +GetComputerNameExW ( + COMPUTER_NAME_FORMAT NameType, + LPWSTR lpBuffer, + LPDWORD nSize + ) +{ + UNICODE_STRING ResultString; + UNICODE_STRING DomainPart, Dot; + UNICODE_STRING RegKey, RegValue; + + switch( NameType ) { + case ComputerNameNetBIOS: + return GetComputerNameFromRegistry + ( L"\\Registry\\Machine\\System\\CurrentControlSet" + L"\\Control\\ComputerName\\ComputerName", + L"ComputerName", + lpBuffer, + nSize ); + + case ComputerNameDnsDomain: + return GetComputerNameFromRegistry + ( L"\\Registry\\Machine\\System\\CurrentControlSet" + L"\\Services\\Tcpip\\Parameters", + L"Domain", + lpBuffer, + nSize ); + + case ComputerNameDnsFullyQualified: + RtlInitUnicodeString(&Dot,L"."); + RosInitializeString(&ResultString,0,*nSize * sizeof(WCHAR),lpBuffer); + RtlInitUnicodeString(&RegKey, + L"\\Registry\\Machine\\System" + L"\\CurrentControlSet\\Services\\Tcpip" + L"\\Parameters"); + RtlInitUnicodeString(&RegValue,L"HostName"); + RtlInitUnicodeString(&DomainPart,L""); + if( NT_SUCCESS(RosReadRegistryValue(&RegKey,&RegValue,&DomainPart)) ) { + RtlAppendUnicodeStringToString(&ResultString,&DomainPart); + RtlAppendUnicodeStringToString(&ResultString,&Dot); + RtlFreeUnicodeString(&DomainPart); + RtlInitUnicodeString(&RegValue,L"Domain"); + RtlInitUnicodeString(&DomainPart,L""); + if( NT_SUCCESS(RosReadRegistryValue + (&RegKey,&RegValue,&DomainPart)) ) { + RtlAppendUnicodeStringToString(&ResultString,&DomainPart); + RtlFreeUnicodeString(&DomainPart); + *nSize = ResultString.Length / sizeof(WCHAR); + return TRUE; + } + } + return FALSE; + + case ComputerNameDnsHostname: + return GetComputerNameFromRegistry + ( L"\\Registry\\Machine\\System\\CurrentControlSet" + L"\\Services\\Tcpip\\Parameters", + L"Hostname", + lpBuffer, + nSize ); + + case ComputerNamePhysicalDnsDomain: + return GetComputerNameFromRegistry + ( L"\\Registry\\Machine\\System\\CurrentControlSet" + L"\\Services\\Tcpip\\Parameters", + L"Domain", + lpBuffer, + nSize ); + + /* XXX Redo these */ + case ComputerNamePhysicalDnsFullyQualified: + return GetComputerNameExW( ComputerNameDnsFullyQualified, + lpBuffer, nSize ); + case ComputerNamePhysicalDnsHostname: + return GetComputerNameExW( ComputerNameDnsHostname, + lpBuffer, nSize ); + case ComputerNamePhysicalNetBIOS: + return GetComputerNameExW( ComputerNameNetBIOS, + lpBuffer, nSize ); + + case ComputerNameMax: + return FALSE; + } + + return FALSE; +} + +/* + * @implemented + */ +BOOL +STDCALL +GetComputerNameExA ( + COMPUTER_NAME_FORMAT NameType, + LPSTR lpBuffer, + LPDWORD nSize + ) +{ + UNICODE_STRING UnicodeString; + ANSI_STRING AnsiString; + BOOL Result; + PWCHAR TempBuffer = RtlAllocateHeap( GetProcessHeap(), 0, *nSize * sizeof(WCHAR) ); + + if( !TempBuffer ) { + return ERROR_OUTOFMEMORY; + } + + AnsiString.MaximumLength = *nSize; + AnsiString.Length = 0; + AnsiString.Buffer = lpBuffer; + + Result = GetComputerNameExW( NameType, TempBuffer, nSize ); + + if( Result ) { + UnicodeString.MaximumLength = *nSize * sizeof(WCHAR); + UnicodeString.Length = *nSize * sizeof(WCHAR); + UnicodeString.Buffer = TempBuffer; + + DbgPrint("GetComputerNameExW Result: %wZ\n", &UnicodeString); + + RtlUnicodeStringToAnsiString (&AnsiString, + &UnicodeString, + FALSE); + } + + HeapFree( GetProcessHeap(), 0, TempBuffer ); + + return Result; +} + /* * @implemented */ @@ -42,39 +255,7 @@ BOOL STDCALL GetComputerNameA (LPSTR lpBuffer, LPDWORD lpnSize) { - UNICODE_STRING UnicodeString; - ANSI_STRING AnsiString; - - AnsiString.MaximumLength = *lpnSize; - AnsiString.Length = 0; - AnsiString.Buffer = lpBuffer; - - UnicodeString.MaximumLength = *lpnSize * sizeof(WCHAR); - UnicodeString.Length = 0; - UnicodeString.Buffer = RtlAllocateHeap (RtlGetProcessHeap (), - 0, - UnicodeString.MaximumLength); - if (UnicodeString.Buffer == NULL) - { - SetLastError (ERROR_OUTOFMEMORY); - return FALSE; - } - - if (!GetComputerNameW (UnicodeString.Buffer, lpnSize)) - { - RtlFreeUnicodeString (&UnicodeString); - return FALSE; - } - - UnicodeString.Length = *lpnSize * sizeof(WCHAR); - - RtlUnicodeStringToAnsiString (&AnsiString, - &UnicodeString, - FALSE); - - RtlFreeUnicodeString (&UnicodeString); - - return TRUE; + return GetComputerNameExA( ComputerNameNetBIOS, lpBuffer, lpnSize ); } @@ -85,76 +266,7 @@ BOOL STDCALL GetComputerNameW (LPWSTR lpBuffer, LPDWORD lpnSize) { - PKEY_VALUE_PARTIAL_INFORMATION KeyInfo; - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING KeyName; - UNICODE_STRING ValueName; - HANDLE KeyHandle; - ULONG KeyInfoSize; - ULONG ReturnSize; - NTSTATUS Status; - - RtlInitUnicodeString (&KeyName, - L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\ComputerName\\ComputerName"); - InitializeObjectAttributes (&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE, - NULL, - NULL); - Status = NtOpenKey (&KeyHandle, - KEY_READ, - &ObjectAttributes); - if (!NT_SUCCESS(Status)) - { - SetLastErrorByStatus (Status); - return FALSE; - } - - KeyInfoSize = sizeof(KEY_VALUE_PARTIAL_INFORMATION) + - *lpnSize * sizeof(WCHAR); - KeyInfo = RtlAllocateHeap (RtlGetProcessHeap (), - 0, - KeyInfoSize); - if (KeyInfo == NULL) - { - NtClose (KeyHandle); - SetLastError (ERROR_OUTOFMEMORY); - return FALSE; - } - - RtlInitUnicodeString (&ValueName, - L"ComputerName"); - - Status = NtQueryValueKey (KeyHandle, - &ValueName, - KeyValuePartialInformation, - KeyInfo, - KeyInfoSize, - &ReturnSize); - if (!NT_SUCCESS(Status)) - { - RtlFreeHeap (RtlGetProcessHeap (), - 0, - KeyInfo); - NtClose (KeyHandle); - SetLastErrorByStatus (Status); - return FALSE; - } - - *lpnSize = - (KeyInfo->DataLength != 0) ? (KeyInfo->DataLength / sizeof(WCHAR)) - 1 : 0; - - RtlCopyMemory (lpBuffer, - KeyInfo->Data, - KeyInfo->DataLength); - lpBuffer[*lpnSize] = 0; - - RtlFreeHeap (RtlGetProcessHeap (), - 0, - KeyInfo); - NtClose (KeyHandle); - - return TRUE; + return GetComputerNameExW( ComputerNameNetBIOS, lpBuffer, lpnSize ); } @@ -267,13 +379,13 @@ SetComputerNameW (LPCWSTR lpComputerName) (wcslen (lpComputerName) + 1) * sizeof(WCHAR)); if (!NT_SUCCESS(Status)) { - NtClose (KeyHandle); + ZwClose (KeyHandle); SetLastErrorByStatus (Status); return FALSE; } NtFlushKey (KeyHandle); - NtClose (KeyHandle); + ZwClose (KeyHandle); return TRUE; } diff --git a/reactos/lib/kernel32/misc/stubs.c b/reactos/lib/kernel32/misc/stubs.c index fb8e2da1960..8d2eb88474f 100644 --- a/reactos/lib/kernel32/misc/stubs.c +++ b/reactos/lib/kernel32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.61 2004/01/29 23:41:36 navaraf Exp $ +/* $Id: stubs.c,v 1.62 2004/02/15 07:03:56 arty Exp $ * * KERNEL32.DLL stubs (unimplemented functions) * Remove from this file, if you implement them. @@ -1786,21 +1786,6 @@ FindNextVolumeMountPointW( return 0; } -/* - * @unimplemented - */ -BOOL -STDCALL -GetComputerNameExW ( - COMPUTER_NAME_FORMAT NameType, - LPWSTR lpBuffer, - LPDWORD nSize - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented */ @@ -2190,21 +2175,6 @@ FindNextVolumeMountPointA( return 0; } -/* - * @unimplemented - */ -BOOL -STDCALL -GetComputerNameExA ( - COMPUTER_NAME_FORMAT NameType, - LPSTR lpBuffer, - LPDWORD nSize - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented */ From 757ff359b58c15d66807d3183606ee73d97d728d Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Sun, 15 Feb 2004 07:04:45 +0000 Subject: [PATCH 0035/1463] Fixed a bug in AppendUnicodeStringToString which could cause a null to be placed one position after the end of a completely full string. svn path=/trunk/; revision=8191 --- reactos/lib/ntdll/rtl/unicode.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/reactos/lib/ntdll/rtl/unicode.c b/reactos/lib/ntdll/rtl/unicode.c index 42ae9d20682..f182f7f55d8 100644 --- a/reactos/lib/ntdll/rtl/unicode.c +++ b/reactos/lib/ntdll/rtl/unicode.c @@ -1,4 +1,4 @@ -/* $Id: unicode.c,v 1.36 2004/02/03 14:37:35 ekohl Exp $ +/* $Id: unicode.c,v 1.37 2004/02/15 07:04:45 arty Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -203,7 +203,8 @@ RtlAppendUnicodeStringToString( memcpy((PVOID)Destination->Buffer + Destination->Length, Source->Buffer, Source->Length); Destination->Length += Source->Length; - Destination->Buffer[Destination->Length / sizeof(WCHAR)] = 0; + if( Destination->MaximumLength > Destination->Length ) + Destination->Buffer[Destination->Length / sizeof(WCHAR)] = 0; return STATUS_SUCCESS; } From d3a56d75ebb2578be40360c98985581705fe62aa Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Sun, 15 Feb 2004 07:07:11 +0000 Subject: [PATCH 0036/1463] Removed dbgprints. svn path=/trunk/; revision=8192 --- reactos/lib/kernel32/misc/computername.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/reactos/lib/kernel32/misc/computername.c b/reactos/lib/kernel32/misc/computername.c index ca849656cfa..dfb9616e3c1 100644 --- a/reactos/lib/kernel32/misc/computername.c +++ b/reactos/lib/kernel32/misc/computername.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: computername.c,v 1.5 2004/02/15 07:03:56 arty Exp $ +/* $Id: computername.c,v 1.6 2004/02/15 07:07:11 arty Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -95,8 +95,6 @@ static BOOL GetComputerNameFromRegistry( LPWSTR RegistryKey, return FALSE; } - DbgPrint("*nSize = %d, KeyInfo->DataLength = %d\n", - *nSize, KeyInfo->DataLength); if( *nSize > (KeyInfo->DataLength / sizeof(WCHAR)) ) { *nSize = KeyInfo->DataLength / sizeof(WCHAR); lpBuffer[*nSize] = 0; @@ -236,8 +234,6 @@ GetComputerNameExA ( UnicodeString.Length = *nSize * sizeof(WCHAR); UnicodeString.Buffer = TempBuffer; - DbgPrint("GetComputerNameExW Result: %wZ\n", &UnicodeString); - RtlUnicodeStringToAnsiString (&AnsiString, &UnicodeString, FALSE); From a3ac53db3d29f8ab028ea16a418f6de4042adb29 Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Sun, 15 Feb 2004 07:17:00 +0000 Subject: [PATCH 0037/1463] Big merge in wine code. This merged version is far more complete than the previous one. See notes and comments by me and the original author of iphlpapi_main.c, Juan Lang. svn path=/trunk/; revision=8194 --- reactos/lib/iphlpapi/icmp.c | 117 ++ reactos/lib/iphlpapi/ifenum.h | 142 ++ reactos/lib/iphlpapi/ifenum_reactos.c | 723 ++++++++ reactos/lib/iphlpapi/iphlp_res.h | 12 + reactos/lib/iphlpapi/iphlpapi.edf | 12 +- reactos/lib/iphlpapi/iphlpapi_main.c | 2102 ++++++++++++++++++++++++ reactos/lib/iphlpapi/iphlpapiextra.h | 11 + reactos/lib/iphlpapi/iphlpv6.c | 91 + reactos/lib/iphlpapi/ipprivate.h | 95 +- reactos/lib/iphlpapi/ipregprivate.h | 10 +- reactos/lib/iphlpapi/ipstats.h | 108 ++ reactos/lib/iphlpapi/ipstats_reactos.c | 558 +++++++ reactos/lib/iphlpapi/makefile | 8 +- reactos/lib/iphlpapi/media.c | 59 + reactos/lib/iphlpapi/merge-notes.txt | 36 + reactos/lib/iphlpapi/registry.c | 32 +- reactos/lib/iphlpapi/resinfo_reactos.c | 52 + 17 files changed, 4129 insertions(+), 39 deletions(-) create mode 100644 reactos/lib/iphlpapi/icmp.c create mode 100644 reactos/lib/iphlpapi/ifenum.h create mode 100644 reactos/lib/iphlpapi/ifenum_reactos.c create mode 100644 reactos/lib/iphlpapi/iphlp_res.h create mode 100644 reactos/lib/iphlpapi/iphlpapi_main.c create mode 100644 reactos/lib/iphlpapi/iphlpapiextra.h create mode 100644 reactos/lib/iphlpapi/iphlpv6.c create mode 100644 reactos/lib/iphlpapi/ipstats.h create mode 100644 reactos/lib/iphlpapi/ipstats_reactos.c create mode 100644 reactos/lib/iphlpapi/media.c create mode 100644 reactos/lib/iphlpapi/merge-notes.txt create mode 100644 reactos/lib/iphlpapi/resinfo_reactos.c diff --git a/reactos/lib/iphlpapi/icmp.c b/reactos/lib/iphlpapi/icmp.c new file mode 100644 index 00000000000..29fa0f857a0 --- /dev/null +++ b/reactos/lib/iphlpapi/icmp.c @@ -0,0 +1,117 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_ARPA_INET_H +# include +#endif +#ifdef HAVE_ARPA_NAMESER_H +# include +#endif +#ifdef HAVE_RESOLV_H +# include +#endif + +#ifdef __REACTOS__ +# include +# include +# include +# include +# include +# include +# include +# include "iphlpapiextra.h" +#else +# include "windef.h" +# include "winbase.h" +# include "winreg.h" +#endif + +#include "iphlpapi.h" +#include "ifenum.h" +#include "ipstats.h" +#include "iphlp_res.h" +#include "wine/debug.h" + +/* + * @unimplemented + */ +DWORD +STDCALL +IcmpParseReplies( + LPVOID ReplyBuffer, + DWORD ReplySize + ) +{ + UNIMPLEMENTED + return 0L; +} + +/* + * @unimplemented + */ +HANDLE STDCALL IcmpCreateFile( + VOID + ) +{ + UNIMPLEMENTED + return 0L; +} + +/* + * @unimplemented + */ +BOOL STDCALL IcmpCloseHandle( + HANDLE IcmpHandle + ) +{ + UNIMPLEMENTED + return 0L; +} + +/* + * @unimplemented + */ +DWORD STDCALL IcmpSendEcho( + HANDLE IcmpHandle, + IPAddr DestinationAddress, + LPVOID RequestData, + WORD RequestSize, + PIP_OPTION_INFORMATION RequestOptions, + LPVOID ReplyBuffer, + DWORD ReplySize, + DWORD Timeout + ) +{ + UNIMPLEMENTED + return 0L; +} + +/* + * @unimplemented + */ +DWORD +STDCALL +IcmpSendEcho2( + HANDLE IcmpHandle, + HANDLE Event, + FARPROC ApcRoutine, + PVOID ApcContext, + IPAddr DestinationAddress, + LPVOID RequestData, + WORD RequestSize, + PIP_OPTION_INFORMATION RequestOptions, + LPVOID ReplyBuffer, + DWORD ReplySize, + DWORD Timeout + ) +{ + UNIMPLEMENTED + return 0L; +} diff --git a/reactos/lib/iphlpapi/ifenum.h b/reactos/lib/iphlpapi/ifenum.h new file mode 100644 index 00000000000..406fa0f5ada --- /dev/null +++ b/reactos/lib/iphlpapi/ifenum.h @@ -0,0 +1,142 @@ +/* ifenum.h + * Copyright (C) 2003 Juan Lang + * + * 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 + * + * This module implements functions shared by DLLs that need to enumerate + * network interfaces and addresses. It's meant to hide some problematic + * defines like socket(), as well as provide only one file + * that needs to be ported to implement these functions on different platforms, + * since the Windows API provides multiple ways to get at this info. + * + * Like Windows, it uses a numeric index to identify an interface uniquely. + * As implemented, an interface represents a UNIX network interface, virtual + * or real, and thus can have 0 or 1 IP addresses associated with it. (This + * only supports IPv4.) + * The indexes returned are not guaranteed to be contiguous, so don't call + * getNumInterfaces() and assume the values [0,getNumInterfaces() - 1] will be + * valid indexes; use getInterfaceIndexTable() instead. Non-loopback + * interfaces have lower index values than loopback interfaces, in order to + * make the indexes somewhat reusable as Netbios LANA numbers. See ifenum.c + * for more detail on this. + * + * See also the companion file, ipstats.h, for functions related to getting + * statistics. + */ +#ifndef WINE_IFENUM_H_ +#define WINE_IFENUM_H_ + +#include + +#include "windef.h" +#include "winbase.h" +#include "iprtrmib.h" + +#define MAX_INTERFACE_PHYSADDR 8 +#define MAX_INTERFACE_DESCRIPTION 256 + +/* Call before using the functions in this module */ +void interfaceMapInit(void); +/* Call to free resources allocated in interfaceMapInit() */ +void interfaceMapFree(void); + +DWORD getNumInterfaces(void); +DWORD getNumNonLoopbackInterfaces(void); + +/* A table of interface indexes, see get*InterfaceTable(). Ignore numAllocated, + * it's used during the creation of the table. + */ +typedef struct _InterfaceIndexTable { + DWORD numIndexes; + DWORD numAllocated; + DWORD indexes[1]; +} InterfaceIndexTable; + +/* Returns a table with all known interface indexes, or NULL if one could not + * be allocated. free() the returned table. + */ +InterfaceIndexTable *getInterfaceIndexTable(void); + +/* Like getInterfaceIndexTable, but filters out loopback interfaces. */ +InterfaceIndexTable *getNonLoopbackInterfaceIndexTable(void); + +/* ByName/ByIndex versions of various getter functions. */ + +/* can be used as quick check to see if you've got a valid index, returns NULL + * if not. The buffer returned may have been allocated. It should be returned + * by calling consumeInterfaceNmae. + */ +const char *getInterfaceNameByIndex(DWORD index); + +/* consume the interface name provided by getInterfaceName. */ + +void consumeInterfaceName( const char *ifname ); + +/* Fills index with the index of name, if found. Returns + * ERROR_INVALID_PARAMETER if name or index is NULL, ERROR_INVALID_DATA if name + * is not found, and NO_ERROR on success. + */ +DWORD getInterfaceIndexByName(const char *name, PDWORD index); + +/* This bunch returns IP addresses, and INADDR_ANY or INADDR_NONE if not found, + * appropriately depending on the f/n. + */ +DWORD getInterfaceIPAddrByName(const char *name); +DWORD getInterfaceIPAddrByIndex(DWORD index); +DWORD getInterfaceMaskByName(const char *name); +DWORD getInterfaceMaskByIndex(DWORD index); +DWORD getInterfaceBCastAddrByName(const char *name); +DWORD getInterfaceBCastAddrByIndex(DWORD index); + +/* Gets a few physical charactersistics of a device: MAC addr len, MAC addr, + * and type as one of the MIB_IF_TYPEs. + * len's in-out: on in, needs to say how many bytes are available in addr, + * which to be safe should be MAX_INTERFACE_PHYSADDR. On out, it's how many + * bytes were set, or how many were required if addr isn't big enough. + * Returns ERROR_INVALID_PARAMETER if name, len, addr, or type is NULL. + * Returns ERROR_INVALID_DATA if name/index isn't valid. + * Returns ERROR_INSUFFICIENT_BUFFER if addr isn't large enough for the + * physical address; *len will contain the required size. + * May return other errors, e.g. ERROR_OUTOFMEMORY or ERROR_NO_MORE_FILES, + * if internal errors occur. + * Returns NO_ERROR on success. + */ +DWORD getInterfacePhysicalByName(const char *name, PDWORD len, PBYTE addr, + PDWORD type); +DWORD getInterfacePhysicalByIndex(DWORD index, PDWORD len, PBYTE addr, + PDWORD type); + +/* Get the operational status as a (MIB_)IF_OPER_STATUS type. + */ +DWORD getInterfaceStatusByName(const char *name, PDWORD status); +DWORD getInterfaceStatusByIndex(DWORD index, PDWORD status); + +DWORD getInterfaceMtuByName(const char *name, PDWORD mtu); +DWORD getInterfaceMtuByIndex(DWORD index, PDWORD mtu); + +/* Fills in the MIB_IFROW by name/index. Doesn't fill in interface statistics, + * see ipstats.h for that. + * Returns ERROR_INVALID_PARAMETER if name or entry is NULL, ERROR_INVALID_DATA + * if name/index isn't valid, and NO_ERROR otherwise. + */ +DWORD getInterfaceEntryByName(const char *name, PMIB_IFROW entry); +DWORD getInterfaceEntryByIndex(DWORD index, PMIB_IFROW entry); + +/* Converts the network-order bytes in addr to a printable string. Returns + * string. + */ +char *toIPAddressString(unsigned int addr, char string[16]); + +#endif /* ndef WINE_IFENUM_H_ */ diff --git a/reactos/lib/iphlpapi/ifenum_reactos.c b/reactos/lib/iphlpapi/ifenum_reactos.c new file mode 100644 index 00000000000..9956b5e585e --- /dev/null +++ b/reactos/lib/iphlpapi/ifenum_reactos.c @@ -0,0 +1,723 @@ +/* Copyright (C) 2003 Art Yerkes + * A reimplementation of ifenum.c by Juan Lang + * + * 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 + * + * Implementation notes + * - Our bretheren use IOCTL_TCP_QUERY_INFORMATION_EX to get information + * from tcpip.sys and IOCTL_TCP_SET_INFORMATION_EX to set info (such as + * the route table). These ioctls mirror WsControl exactly in usage. + * - This iphlpapi does not rely on any reactos-only features. + * - This implementation is meant to be largely correct. I am not, however, + * paying any attention to performance. It can be done faster, and + * someone should definately optimize this code when speed is more of a + * priority than it is now. + * + * Edited implementation notes from the original -- Basically edited to add + * information and prune things which are not accurate about this file. + * Interface index fun: + * - Windows may rely on an index being cleared in the topmost 8 bits in some + * APIs; see GetFriendlyIfIndex and the mention of "backward compatible" + * indexes. It isn't clear which APIs might fail with non-backward-compatible + * indexes, but I'll keep them bits clear just in case. + * FIXME: + * - We don't support IPv6 addresses here yet -- I moved the upper edge + * functions into iphlpv6.c (arty) + */ + +#include "ipprivate.h" +#include "ifenum.h" + +/* Globals */ +const PWCHAR TcpFileName = L"\\Device\\Tcp"; + +/* Functions */ + +void interfaceMapInit(void) +{ + /* For now, nothing */ +} + +void interfaceMapFree(void) +{ + /* Ditto. */ +} + +NTSTATUS openTcpFile(PHANDLE tcpFile) { + UNICODE_STRING fileName; + OBJECT_ATTRIBUTES objectAttributes; + IO_STATUS_BLOCK ioStatusBlock; + NTSTATUS status; + + TRACE("called.\n"); + + /* Shamelessly ripped from CreateFileW */ + RtlInitUnicodeString( &fileName, TcpFileName ); + + InitializeObjectAttributes( &objectAttributes, + &fileName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL ); + + status = NtCreateFile( tcpFile, + SYNCHRONIZE | GENERIC_EXECUTE, + &objectAttributes, + &ioStatusBlock, + NULL, + FILE_ATTRIBUTE_NORMAL, + FILE_SHARE_READ | FILE_SHARE_WRITE, + FILE_OPEN_IF, + FILE_SYNCHRONOUS_IO_NONALERT, + 0, + 0 ); + + /* String does not need to be freed: it points to the constant + * string we provided */ + + TRACE("returning %08x\n", (int)status); + + return status; +} + +void closeTcpFile( HANDLE h ) { + TRACE("called.\n"); + NtClose( h ); +} + +/* A generic thing-getting function which interacts in the right way with + * TDI. This may seem oblique, but I'm using it to reduce code and hopefully + * make this thing easier to debug. + * + * The things returned can be any of: + * TDIEntityID + * TDIObjectID + * IFEntry + * IPSNMPInfo + * IPAddrEntry + * IPInterfaceInfo + */ +NTSTATUS tdiGetSetOfThings( HANDLE tcpFile, + DWORD toiClass, + DWORD toiType, + DWORD toiId, + DWORD teiEntity, + DWORD fixedPart, + DWORD entrySize, + PVOID *tdiEntitySet, + PDWORD numEntries ) { + TCP_REQUEST_QUERY_INFORMATION_EX req = TCP_REQUEST_QUERY_INFORMATION_INIT; + PVOID entitySet = 0; + NTSTATUS status = STATUS_SUCCESS; + DWORD allocationSizeForEntityArray = entrySize * MAX_TDI_ENTITIES, + arraySize = entrySize * MAX_TDI_ENTITIES; + + DPRINT("TdiGetSetOfThings(tcpFile %x,toiClass %x,toiType %x,toiId %x," + "teiEntity %x,fixedPart %d,entrySize %d)\n", + (int)tcpFile, + (int)toiClass, + (int)toiType, + (int)toiId, + (int)teiEntity, + (int)fixedPart, + (int)entrySize ); + + req.ID.toi_class = toiClass; + req.ID.toi_type = toiType; + req.ID.toi_id = toiId; + req.ID.toi_entity.tei_entity = teiEntity; + + /* There's a subtle problem here... + * If an interface is added at this exact instant, (as if by a PCMCIA + * card insertion), the array will still not have enough entries after + * have allocated it after the first DeviceIoControl call. + * + * We'll get around this by repeating until the number of interfaces + * stabilizes. + */ + do { + assert( !entitySet ); /* We must not have an entity set allocated */ + status = DeviceIoControl( tcpFile, + IOCTL_TCP_QUERY_INFORMATION_EX, + &req, + sizeof(req), + 0, + 0, + &allocationSizeForEntityArray, + NULL ); + + if( !NT_SUCCESS(status) ) { + DPRINT("TdiGetSetOfThings() => %08x\n", (int)status); + return status; + } + + arraySize = allocationSizeForEntityArray; + entitySet = HeapAlloc( GetProcessHeap(), 0, arraySize ); + + if( !entitySet ) { + status = STATUS_INSUFFICIENT_RESOURCES; + DPRINT("TdiGetSetOfThings() => %08x\n", (int)status); + return status; + } + + status = DeviceIoControl( tcpFile, + IOCTL_TCP_QUERY_INFORMATION_EX, + &req, + sizeof(req), + entitySet, + arraySize, + &allocationSizeForEntityArray, + NULL ); + + /* This is why we have the loop -- we might have added an adapter */ + if( arraySize == allocationSizeForEntityArray ) + break; + + HeapFree( GetProcessHeap(), 0, entitySet ); + entitySet = 0; + + if( !NT_SUCCESS(status) ) { + DPRINT("TdiGetSetOfThings() => %08x\n", (int)status); + return status; + } + + DPRINT("TdiGetSetOfThings(): Array changed size: %d -> %d.\n", + arraySize, allocationSizeForEntityArray ); + } while( TRUE ); /* We break if the array we received was the size we + * expected. Therefore, we got here because it wasn't */ + + *numEntries = (arraySize - fixedPart) / entrySize; + *tdiEntitySet = entitySet; + + DPRINT("TdiGetSetOfThings() => Success: %d things @ %08x\n", + (int)*numEntries, (int)entitySet); + + return STATUS_SUCCESS; +} + +VOID tdiFreeThingSet( PVOID things ) { + HeapFree( GetProcessHeap(), 0, things ); +} + +NTSTATUS tdiGetMibForIfEntity +( HANDLE tcpFile, DWORD entityId, IFEntrySafelySized *entry ) { + TCP_REQUEST_QUERY_INFORMATION_EX req = TCP_REQUEST_QUERY_INFORMATION_INIT; + NTSTATUS status = STATUS_SUCCESS; + DWORD returnSize; + + DPRINT("TdiGetMibForIfEntity(tcpFile %x,entityId %x)\n", + (int)tcpFile, (int)entityId); + + req.ID.toi_class = INFO_CLASS_PROTOCOL; + req.ID.toi_type = INFO_TYPE_PROVIDER; + req.ID.toi_id = IF_MIB_STATS_ID; + req.ID.toi_entity.tei_entity = IF_ENTITY; + req.ID.toi_entity.tei_instance = entityId; + + status = DeviceIoControl( tcpFile, + IOCTL_TCP_QUERY_INFORMATION_EX, + &req, + sizeof(req), + entry, + sizeof(*entry), + &returnSize, + NULL ); + + if( !NT_SUCCESS(status) ) { + TRACE("failure: %08x\n", status); + return status; + } else TRACE("Success.\n"); + + DPRINT("TdiGetMibForIfEntity() => {\n" + " if_index ....................... %x\n" + " if_type ........................ %x\n" + " if_mtu ......................... %d\n" + " if_speed ....................... %x\n" + " if_physaddrlen ................. %d\n" + " if_physaddr .................... %02x:%02x:%02x:%02x:%02x:%02x\n", + " if_descr ....................... %s\n" + "} status %08x\n", + (int)entry->offset.ent.if_index, + (int)entry->offset.ent.if_type, + (int)entry->offset.ent.if_mtu, + (int)entry->offset.ent.if_speed, + (int)entry->offset.ent.if_physaddrlen, + entry->offset.ent.if_physaddr[0] & 0xff, + entry->offset.ent.if_physaddr[1] & 0xff, + entry->offset.ent.if_physaddr[2] & 0xff, + entry->offset.ent.if_physaddr[3] & 0xff, + entry->offset.ent.if_physaddr[4] & 0xff, + entry->offset.ent.if_physaddr[5] & 0xff, + entry->offset.ent.if_descr, + (int)status); + + return status; +} + +NTSTATUS tdiGetEntityIDSet( HANDLE tcpFile, + TDIEntityID **entitySet, + PDWORD numEntities ) { + NTSTATUS status = tdiGetSetOfThings( tcpFile, + INFO_CLASS_GENERIC, + INFO_TYPE_PROVIDER, + ENTITY_LIST_ID, + GENERIC_ENTITY, + 0, + sizeof(TDIEntityID), + (PVOID *)entitySet, + numEntities ); + if( NT_SUCCESS(status) ) { + int i; + + for( i = 0; i < *numEntities; i++ ) { + DPRINT("%-4d: %04x:%08x\n", + i, + (*entitySet)[i].tei_entity, + (*entitySet)[i].tei_instance ); + } + } + + return status; +} + +static BOOL isInterface( TDIEntityID *if_maybe ) { + return + if_maybe->tei_entity == IF_ENTITY; +} + +static BOOL isLoopback( HANDLE tcpFile, TDIEntityID *loop_maybe ) { + IFEntrySafelySized entryInfo; + + tdiGetMibForIfEntity( tcpFile, + loop_maybe->tei_instance, + &entryInfo ); + + return !entryInfo.offset.ent.if_type || + entryInfo.offset.ent.if_type == IFENT_SOFTWARE_LOOPBACK; +} + +NTSTATUS tdiGetEntityType( HANDLE tcpFile, TDIEntityID *ent, PULONG type ) { + TCP_REQUEST_QUERY_INFORMATION_EX req = TCP_REQUEST_QUERY_INFORMATION_INIT; + NTSTATUS status = STATUS_SUCCESS; + DWORD returnSize; + + DPRINT("TdiGetEntityType(tcpFile %x,entityId %x)\n", + (DWORD)tcpFile, ent->tei_instance); + + req.ID.toi_class = INFO_CLASS_GENERIC; + req.ID.toi_type = INFO_TYPE_PROVIDER; + req.ID.toi_id = ENTITY_TYPE_ID; + req.ID.toi_entity.tei_entity = ent->tei_entity; + req.ID.toi_entity.tei_instance = ent->tei_instance; + + status = DeviceIoControl( tcpFile, + IOCTL_TCP_QUERY_INFORMATION_EX, + &req, + sizeof(req), + type, + sizeof(*type), + &returnSize, + NULL ); + + DPRINT("TdiGetEntityType() => %08x %08x\n", *type, status); + + return status; +} + +static DWORD getNumInterfacesInt(BOOL onlyLoopback) +{ + DWORD numEntities, numInterfaces = 0; + TDIEntityID *entitySet; + HANDLE tcpFile; + NTSTATUS status; + int i; + + status = openTcpFile( &tcpFile ); + + if( !NT_SUCCESS(status) ) { + DPRINT("getNumInterfaces: failed %08x\n", status ); + return 0; + } + + status = tdiGetEntityIDSet( tcpFile, &entitySet, &numEntities ); + + if( !NT_SUCCESS(status) ) { + DPRINT("getNumInterfaces: failed %08x\n", status ); + return 0; + } + + closeTcpFile( tcpFile ); + + for( i = 0; i < numEntities; i++ ) { + if( isInterface( &entitySet[i] ) && + (!onlyLoopback || isLoopback( tcpFile, &entitySet[i] )) ) + numInterfaces++; + } + + DPRINT("getNumInterfaces: success: %d %d %08x\n", + onlyLoopback, numInterfaces, status ); + + tdiFreeThingSet( entitySet ); + + return numInterfaces; +} + +DWORD getNumInterfaces(void) +{ + return getNumInterfacesInt( FALSE ); +} + +DWORD getNumNonLoopbackInterfaces(void) +{ + return getNumInterfacesInt( TRUE ); +} + +DWORD getNthInterfaceEntity( HANDLE tcpFile, DWORD index, TDIEntityID *ent ) { + DWORD numEntities = 0; + DWORD numInterfaces = 0; + TDIEntityID *entitySet = 0; + NTSTATUS status = tdiGetEntityIDSet( tcpFile, &entitySet, &numEntities ); + int i; + + if( !NT_SUCCESS(status) ) + return status; + + for( i = 0; i < numEntities; i++ ) { + if( isInterface( &entitySet[i] ) ) { + if( numInterfaces == index ) break; + else numInterfaces++; + } + } + + DPRINT("Index %d is entity #%d - %04x:%08x\n", index, i, + entitySet[i].tei_entity, entitySet[i].tei_instance ); + + if( numInterfaces == index && i < numEntities ) { + memcpy( ent, &entitySet[i], sizeof(*ent) ); + tdiFreeThingSet( entitySet ); + return STATUS_SUCCESS; + } else { + tdiFreeThingSet( entitySet ); + return STATUS_UNSUCCESSFUL; + } +} + +/* Note that the result of this operation must be freed later */ + +const char *getInterfaceNameByIndex(DWORD index) +{ + TDIEntityID ent; + IFEntrySafelySized entityInfo; + HANDLE tcpFile = INVALID_HANDLE_VALUE; + NTSTATUS status = STATUS_SUCCESS; + PCHAR interfaceName = 0; + char simple_name_buf[100]; + char *adapter_name; + + status = openTcpFile( &tcpFile ); + if( !NT_SUCCESS(status) ) { + DPRINT("failed %08x\n", status ); + return 0; + } + + status = getNthInterfaceEntity( tcpFile, index, &ent ); + + if( !NT_SUCCESS(status) ) { + DPRINT("failed %08x\n", status ); + return 0; + } + + status = tdiGetMibForIfEntity( tcpFile, + ent.tei_instance, + &entityInfo ); + if( NT_SUCCESS(status) ) { + adapter_name = entityInfo.offset.ent.if_descr; + } else { + sprintf( simple_name_buf, "eth%x", + (int)ent.tei_instance ); + adapter_name = simple_name_buf; + } + interfaceName = HeapAlloc( GetProcessHeap(), 0, + strlen(adapter_name) + 1 ); + strcpy( interfaceName, adapter_name ); + + closeTcpFile( tcpFile ); + + return interfaceName; +} + +void consumeInterfaceName(const char *name) { + HeapFree( GetProcessHeap(), 0, (char *)name ); +} + +DWORD getInterfaceIndexByName(const char *name, PDWORD index) +{ + DWORD ret = STATUS_SUCCESS; + int numInterfaces = getNumInterfaces(); + const char *iname = 0; + int i; + HANDLE tcpFile; + + ret = openTcpFile( &tcpFile ); + + if( !NT_SUCCESS(ret) ) { + DPRINT("Failure: %08x\n", ret); + return ret; + } + + for( i = 0; i < numInterfaces; i++ ) { + iname = getInterfaceNameByIndex( i ); + if( !strcmp(iname, name) ) { + *index = i; + } + HeapFree( GetProcessHeap(), 0, (char *)iname ); + } + + closeTcpFile( tcpFile ); + + return ret; +} + +InterfaceIndexTable *getInterfaceIndexTableInt( BOOL nonLoopbackOnly ) { + HANDLE tcpFile; + DWORD numInterfaces, curInterface = 0; + int i; + InterfaceIndexTable *ret; + TDIEntityID *entitySet; + DWORD numEntities; + NTSTATUS status; + + numInterfaces = getNumInterfaces(); + TRACE("getInterfaceIndexTable: numInterfaces: %d\n", numInterfaces); + ret = (InterfaceIndexTable *)calloc(1, + sizeof(InterfaceIndexTable) + (numInterfaces - 1) * sizeof(DWORD)); + if (ret) { + ret->numAllocated = numInterfaces; + } + + status = openTcpFile( &tcpFile ); + tdiGetEntityIDSet( tcpFile, &entitySet, &numEntities ); + + for( i = 0; i < numEntities; i++ ) { + if( isInterface( &entitySet[i] ) && + (!nonLoopbackOnly || !isLoopback( tcpFile, &entitySet[i] )) ) { + ret->indexes[curInterface++] = entitySet[i].tei_instance; + } + } + + tdiFreeThingSet( entitySet ); + closeTcpFile( tcpFile ); + ret->numIndexes = curInterface; + + return ret; +} + +InterfaceIndexTable *getInterfaceIndexTable(void) { + return getInterfaceIndexTableInt( FALSE ); +} + +InterfaceIndexTable *getNonLoopbackInterfaceIndexTable(void) { + return getInterfaceIndexTableInt( TRUE ); +} + +DWORD getInterfaceIPAddrByName(const char *name) +{ + return INADDR_ANY; +} + +DWORD getInterfaceIPAddrByIndex(DWORD index) +{ + return INADDR_ANY; +} + +DWORD getInterfaceBCastAddrByName(const char *name) +{ + return INADDR_ANY; +} + +DWORD getInterfaceBCastAddrByIndex(DWORD index) +{ + return INADDR_ANY; +} + +DWORD getInterfaceMaskByName(const char *name) +{ + DWORD ret = INADDR_NONE; + return ret; +} + +DWORD getInterfaceMaskByIndex(DWORD index) +{ + DWORD ret = INADDR_NONE; + return ret; +} + +DWORD getInterfacePhysicalByName(const char *name, PDWORD len, PBYTE addr, + PDWORD type) +{ + DWORD ret; + DWORD addrLen; + + if (!name || !len || !addr || !type) + return ERROR_INVALID_PARAMETER; + + if (addrLen > *len) { + ret = ERROR_INSUFFICIENT_BUFFER; + *len = addrLen; + } + else { + /* zero out remaining bytes for broken implementations */ + memset(addr + addrLen, 0, *len - addrLen); + *len = addrLen; + ret = NO_ERROR; + } + + ret = ERROR_NO_MORE_FILES; + return ret; +} + +DWORD getInterfacePhysicalByIndex(DWORD index, PDWORD len, PBYTE addr, + PDWORD type) +{ + const char *name = getInterfaceNameByIndex(index); + + if (name) + return getInterfacePhysicalByName(name, len, addr, type); + else + return ERROR_INVALID_DATA; +} + +DWORD getInterfaceMtuByName(const char *name, PDWORD mtu) +{ + *mtu = 0; + return ERROR_SUCCESS; +} + +DWORD getInterfaceMtuByIndex(DWORD index, PDWORD mtu) +{ + const char *name = getInterfaceNameByIndex(index); + + if (name) + return getInterfaceMtuByName(name, mtu); + else + return ERROR_INVALID_DATA; +} + +DWORD getInterfaceStatusByName(const char *name, PDWORD status) +{ + DWORD ret; + + if (!name) + return ERROR_INVALID_PARAMETER; + if (!status) + return ERROR_INVALID_PARAMETER; + + ret = ERROR_NO_MORE_FILES; + return ret; +} + +DWORD getInterfaceStatusByIndex(DWORD index, PDWORD status) +{ + const char *name = getInterfaceNameByIndex(index); + + if (name) + return getInterfaceStatusByName(name, status); + else + return ERROR_INVALID_DATA; +} + +DWORD getInterfaceEntryByName(const char *name, PMIB_IFROW entry) +{ + BYTE addr[MAX_INTERFACE_PHYSADDR]; + DWORD ret, len = sizeof(addr), type; + + if (!name) + return ERROR_INVALID_PARAMETER; + if (!entry) + return ERROR_INVALID_PARAMETER; + + if (getInterfacePhysicalByName(name, &len, addr, &type) == NO_ERROR) { + WCHAR *assigner; + const char *walker; + + memset(entry, 0, sizeof(MIB_IFROW)); + for (assigner = entry->wszName, walker = name; *walker; + walker++, assigner++) + *assigner = *walker; + *assigner = 0; + getInterfaceIndexByName(name, &entry->dwIndex); + entry->dwPhysAddrLen = len; + memcpy(entry->bPhysAddr, addr, len); + memset(entry->bPhysAddr + len, 0, sizeof(entry->bPhysAddr) - len); + entry->dwType = type; + /* FIXME: how to calculate real speed? */ + getInterfaceMtuByName(name, &entry->dwMtu); + /* lie, there's no "administratively down" here */ + entry->dwAdminStatus = MIB_IF_ADMIN_STATUS_UP; + getInterfaceStatusByName(name, &entry->dwOperStatus); + /* punt on dwLastChange? */ + entry->dwDescrLen = min(strlen(name), MAX_INTERFACE_DESCRIPTION - 1); + memcpy(entry->bDescr, name, entry->dwDescrLen); + entry->bDescr[entry->dwDescrLen] = '\0'; + entry->dwDescrLen++; + ret = NO_ERROR; + } + else + ret = ERROR_INVALID_DATA; + return ret; +} + +DWORD getInterfaceEntryByIndex(DWORD index, PMIB_IFROW entry) +{ + HANDLE tcpFile; + NTSTATUS status = openTcpFile( &tcpFile ); + TDIEntityID entity; + + DPRINT("Called.\n"); + + if( !NT_SUCCESS(status) ) { + DPRINT("Failed: %08x\n", status); + return status; + } + + status = getNthInterfaceEntity( tcpFile, index, &entity ); + + if( !NT_SUCCESS(status) ) { + DPRINT("Failed: %08x\n", status); + closeTcpFile( tcpFile ); + return status; + } + + status = tdiGetMibForIfEntity( tcpFile, + entity.tei_instance, + (IFEntrySafelySized *) + &entry->wszName[MAX_INTERFACE_NAME_LEN] ); + + closeTcpFile( tcpFile ); + return status; +} + +char *toIPAddressString(unsigned int addr, char string[16]) +{ + if (string) { + struct in_addr iAddr; + + iAddr.s_addr = addr; + /* extra-anal, just to make auditors happy */ + strncpy(string, inet_ntoa(iAddr), 16); + string[16] = '\0'; + } + return string; +} diff --git a/reactos/lib/iphlpapi/iphlp_res.h b/reactos/lib/iphlpapi/iphlp_res.h new file mode 100644 index 00000000000..81d41b27de7 --- /dev/null +++ b/reactos/lib/iphlpapi/iphlp_res.h @@ -0,0 +1,12 @@ +#ifndef _IPHLP_RES_H +#define _IPHLP_RES_H + +typedef struct _IPHLP_RES_INFO { + DWORD riCount; + LPSOCKADDR riAddressList; +} IPHLP_RES_INFO, *PIPHLP_RES_INFO; + +PIPHLP_RES_INFO getResInfo(); +VOID disposeResInfo( PIPHLP_RES_INFO InfoPtr ); + +#endif/*_IPHLP_RES_H*/ diff --git a/reactos/lib/iphlpapi/iphlpapi.edf b/reactos/lib/iphlpapi/iphlpapi.edf index ee7dffebed0..7c42cd373e1 100644 --- a/reactos/lib/iphlpapi/iphlpapi.edf +++ b/reactos/lib/iphlpapi/iphlpapi.edf @@ -19,14 +19,14 @@ GetUdpTable=GetUdpTable@12 FlushIpNetTable=FlushIpNetTable@4 ;IpHlpDllEntry ;AllocateAndGetArpEntTableFromStack -AllocateAndGetIfTableFromStack@16 -AllocateAndGetIpAddrTableFromStack@16 -AllocateAndGetIpForwardTableFromStack@16 -AllocateAndGetIpNetTableFromStack@16 +AllocateAndGetIfTableFromStack=AllocateAndGetIfTableFromStack@16 +AllocateAndGetIpAddrTableFromStack=AllocateAndGetIpAddrTableFromStack@16 +AllocateAndGetIpForwardTableFromStack=AllocateAndGetIpForwardTableFromStack@16 +AllocateAndGetIpNetTableFromStack=AllocateAndGetIpNetTableFromStack@16 ;AllocateAndGetTcpExTableFromStack -AllocateAndGetTcpTableFromStack@16 +AllocateAndGetTcpTableFromStack=AllocateAndGetTcpTableFromStack@16 ;AllocateAndGetUdpExTableFromStack -AllocateAndGetUdpTableFromStack@16 +AllocateAndGetUdpTableFromStack=AllocateAndGetUdpTableFromStack@16 CreateIpNetEntry=CreateIpNetEntry@4 CreateProxyArpEntry=CreateProxyArpEntry@12 DeleteIPAddress=DeleteIPAddress@4 diff --git a/reactos/lib/iphlpapi/iphlpapi_main.c b/reactos/lib/iphlpapi/iphlpapi_main.c new file mode 100644 index 00000000000..8a93ef03087 --- /dev/null +++ b/reactos/lib/iphlpapi/iphlpapi_main.c @@ -0,0 +1,2102 @@ +/* + * iphlpapi dll implementation + * + * Copyright (C) 2003 Juan Lang + * + * 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 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_ARPA_INET_H +# include +#endif +#ifdef HAVE_ARPA_NAMESER_H +# include +#endif +#ifdef HAVE_RESOLV_H +# include +#endif + +#ifdef __REACTOS__ +# include +# include +# include +# include +# include +# include +# include +# include "iphlpapiextra.h" +# include "wine/debug.h" +#else +# include "windef.h" +# include "winbase.h" +# include "winreg.h" +# include "debug.h" +#endif + +#include +#include "iphlpapi.h" +#include "ifenum.h" +#include "ipstats.h" +#include "iphlp_res.h" + +WINE_DEFAULT_DEBUG_CHANNEL(iphlpapi); + +BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + switch (fdwReason) { + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls( hinstDLL ); + interfaceMapInit(); + break; + + case DLL_PROCESS_DETACH: + interfaceMapFree(); + break; + } + return TRUE; +} + +/****************************************************************** + * AddIPAddress (IPHLPAPI.@) + * + * + * PARAMS + * + * Address [In] + * IpMask [In] + * IfIndex [In] + * NTEContext [In/Out] + * NTEInstance [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI AddIPAddress(IPAddr Address, IPMask IpMask, DWORD IfIndex, PULONG NTEContext, PULONG NTEInstance) +{ + FIXME(":stub\n"); + /* marking Win2K+ functions not supported */ + return ERROR_NOT_SUPPORTED; +} + + +/****************************************************************** + * AllocateAndGetIfTableFromStack (IPHLPAPI.@) + * + * + * PARAMS + * + * ppIfTable [Out] -- pointer into which the MIB_IFTABLE is + * allocated and returned. + * bOrder [In] -- passed to GetIfTable to order the table + * heap [In] -- heap from which the table is allocated + * flags [In] -- flags to HeapAlloc + * + * RETURNS -- ERROR_INVALID_PARAMETER if ppIfTable is NULL, whatever + * GetIfTable returns otherwise + * + */ +DWORD WINAPI AllocateAndGetIfTableFromStack(PMIB_IFTABLE *ppIfTable, + BOOL bOrder, HANDLE heap, DWORD flags) +{ + DWORD ret; + + TRACE("ppIfTable %p, bOrder %ld, heap 0x%08lx, flags 0x%08lx\n", ppIfTable, + (DWORD)bOrder, (DWORD)heap, flags); + if (!ppIfTable) + ret = ERROR_INVALID_PARAMETER; + else { + DWORD dwSize = 0; + + ret = GetIfTable(*ppIfTable, &dwSize, bOrder); + if (ret == ERROR_INSUFFICIENT_BUFFER) { + *ppIfTable = (PMIB_IFTABLE)HeapAlloc(heap, flags, dwSize); + ret = GetIfTable(*ppIfTable, &dwSize, bOrder); + } + } + TRACE("returning %ld\n", ret); + return ret; +} + + +/****************************************************************** + * AllocateAndGetIpAddrTableFromStack (IPHLPAPI.@) + * + * + * PARAMS + * + * ppIpAddrTable [Out] + * bOrder [In] -- passed to GetIpAddrTable to order the table + * heap [In] -- heap from which the table is allocated + * flags [In] -- flags to HeapAlloc + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI AllocateAndGetIpAddrTableFromStack(PMIB_IPADDRTABLE *ppIpAddrTable, + BOOL bOrder, HANDLE heap, DWORD flags) +{ + DWORD ret; + + TRACE("ppIpAddrTable %p, bOrder %ld, heap 0x%08lx, flags 0x%08lx\n", + ppIpAddrTable, (DWORD)bOrder, (DWORD)heap, flags); + if (!ppIpAddrTable) + ret = ERROR_INVALID_PARAMETER; + else { + DWORD dwSize = 0; + + ret = GetIpAddrTable(*ppIpAddrTable, &dwSize, bOrder); + if (ret == ERROR_INSUFFICIENT_BUFFER) { + *ppIpAddrTable = (PMIB_IPADDRTABLE)HeapAlloc(heap, flags, dwSize); + ret = GetIpAddrTable(*ppIpAddrTable, &dwSize, bOrder); + } + } + TRACE("returning %ld\n", ret); + return ret; +} + + +/****************************************************************** + * AllocateAndGetIpForwardTableFromStack (IPHLPAPI.@) + * + * + * ppIpForwardTable [Out] -- pointer into which the MIB_IPFORWARDTABLE is + * allocated and returned. + * bOrder [In] -- passed to GetIfTable to order the table + * heap [In] -- heap from which the table is allocated + * flags [In] -- flags to HeapAlloc + * + * RETURNS -- ERROR_INVALID_PARAMETER if ppIfTable is NULL, whatever + * GetIpForwardTable returns otherwise + * + */ +DWORD WINAPI AllocateAndGetIpForwardTableFromStack(PMIB_IPFORWARDTABLE * + ppIpForwardTable, BOOL bOrder, HANDLE heap, DWORD flags) +{ + DWORD ret; + + TRACE("ppIpForwardTable %p, bOrder %ld, heap 0x%08lx, flags 0x%08lx\n", + ppIpForwardTable, (DWORD)bOrder, (DWORD)heap, flags); + if (!ppIpForwardTable) + ret = ERROR_INVALID_PARAMETER; + else { + DWORD dwSize = 0; + + ret = GetIpForwardTable(*ppIpForwardTable, &dwSize, bOrder); + if (ret == ERROR_INSUFFICIENT_BUFFER) { + *ppIpForwardTable = (PMIB_IPFORWARDTABLE)HeapAlloc(heap, flags, dwSize); + ret = GetIpForwardTable(*ppIpForwardTable, &dwSize, bOrder); + } + } + TRACE("returning %ld\n", ret); + return ret; +} + + +/****************************************************************** + * AllocateAndGetIpNetTableFromStack (IPHLPAPI.@) + * + * + * PARAMS + * + * ppIpNetTable [Out] + * bOrder [In] -- passed to GetIpNetTable to order the table + * heap [In] -- heap from which the table is allocated + * flags [In] -- flags to HeapAlloc + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI AllocateAndGetIpNetTableFromStack(PMIB_IPNETTABLE *ppIpNetTable, + BOOL bOrder, HANDLE heap, DWORD flags) +{ + DWORD ret; + + TRACE("ppIpNetTable %p, bOrder %ld, heap 0x%08lx, flags 0x%08lx\n", + ppIpNetTable, (DWORD)bOrder, (DWORD)heap, flags); + if (!ppIpNetTable) + ret = ERROR_INVALID_PARAMETER; + else { + DWORD dwSize = 0; + + ret = GetIpNetTable(*ppIpNetTable, &dwSize, bOrder); + if (ret == ERROR_INSUFFICIENT_BUFFER) { + *ppIpNetTable = (PMIB_IPNETTABLE)HeapAlloc(heap, flags, dwSize); + ret = GetIpNetTable(*ppIpNetTable, &dwSize, bOrder); + } + } + TRACE("returning %ld\n", ret); + return ret; +} + + +/****************************************************************** + * AllocateAndGetTcpTableFromStack (IPHLPAPI.@) + * + * + * PARAMS + * + * ppTcpTable [Out] + * bOrder [In] -- passed to GetTcpTable to order the table + * heap [In] -- heap from which the table is allocated + * flags [In] -- flags to HeapAlloc + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI AllocateAndGetTcpTableFromStack(PMIB_TCPTABLE *ppTcpTable, + BOOL bOrder, HANDLE heap, DWORD flags) +{ + DWORD ret; + + TRACE("ppTcpTable %p, bOrder %ld, heap 0x%08lx, flags 0x%08lx\n", + ppTcpTable, (DWORD)bOrder, (DWORD)heap, flags); + if (!ppTcpTable) + ret = ERROR_INVALID_PARAMETER; + else { + DWORD dwSize = 0; + + ret = GetTcpTable(*ppTcpTable, &dwSize, bOrder); + if (ret == ERROR_INSUFFICIENT_BUFFER) { + *ppTcpTable = (PMIB_TCPTABLE)HeapAlloc(heap, flags, dwSize); + ret = GetTcpTable(*ppTcpTable, &dwSize, bOrder); + } + } + TRACE("returning %ld\n", ret); + return ret; +} + + +/****************************************************************** + * AllocateAndGetUdpTableFromStack (IPHLPAPI.@) + * + * + * PARAMS + * + * ppUdpTable [Out] + * bOrder [In] -- passed to GetUdpTable to order the table + * heap [In] -- heap from which the table is allocated + * flags [In] -- flags to HeapAlloc + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI AllocateAndGetUdpTableFromStack(PMIB_UDPTABLE *ppUdpTable, + BOOL bOrder, HANDLE heap, DWORD flags) +{ + DWORD ret; + + TRACE("ppUdpTable %p, bOrder %ld, heap 0x%08lx, flags 0x%08lx\n", + ppUdpTable, (DWORD)bOrder, (DWORD)heap, flags); + if (!ppUdpTable) + ret = ERROR_INVALID_PARAMETER; + else { + DWORD dwSize = 0; + + ret = GetUdpTable(*ppUdpTable, &dwSize, bOrder); + if (ret == ERROR_INSUFFICIENT_BUFFER) { + *ppUdpTable = (PMIB_UDPTABLE)HeapAlloc(heap, flags, dwSize); + ret = GetUdpTable(*ppUdpTable, &dwSize, bOrder); + } + } + TRACE("returning %ld\n", ret); + return ret; +} + + +/****************************************************************** + * CreateIpForwardEntry (IPHLPAPI.@) + * + * + * PARAMS + * + * pRoute [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI CreateIpForwardEntry(PMIB_IPFORWARDROW pRoute) +{ + TRACE("pRoute %p\n", pRoute); + /* could use SIOCADDRT, not sure I want to */ + FIXME(":stub\n"); + return (DWORD) 0; +} + + +/****************************************************************** + * CreateIpNetEntry (IPHLPAPI.@) + * + * + * PARAMS + * + * pArpEntry [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI CreateIpNetEntry(PMIB_IPNETROW pArpEntry) +{ + TRACE("pArpEntry %p\n", pArpEntry); + /* could use SIOCSARP on systems that support it, not sure I want to */ + FIXME(":stub\n"); + return (DWORD) 0; +} + + +/****************************************************************** + * CreateProxyArpEntry (IPHLPAPI.@) + * + * + * PARAMS + * + * dwAddress [In] + * dwMask [In] + * dwIfIndex [In] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI CreateProxyArpEntry(DWORD dwAddress, DWORD dwMask, DWORD dwIfIndex) +{ + TRACE("dwAddress 0x%08lx, dwMask 0x%08lx, dwIfIndex 0x%08lx\n", dwAddress, + dwMask, dwIfIndex); + FIXME(":stub\n"); + /* marking Win2K+ functions not supported */ + return ERROR_NOT_SUPPORTED; +} + + +/****************************************************************** + * DeleteIPAddress (IPHLPAPI.@) + * + * + * PARAMS + * + * NTEContext [In] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI DeleteIPAddress(ULONG NTEContext) +{ + TRACE("NTEContext %ld\n", NTEContext); + FIXME(":stub\n"); + /* marking Win2K+ functions not supported */ + return ERROR_NOT_SUPPORTED; +} + + +/****************************************************************** + * DeleteIpForwardEntry (IPHLPAPI.@) + * + * + * PARAMS + * + * pRoute [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI DeleteIpForwardEntry(PMIB_IPFORWARDROW pRoute) +{ + TRACE("pRoute %p\n", pRoute); + /* could use SIOCDELRT, not sure I want to */ + FIXME(":stub\n"); + return (DWORD) 0; +} + + +/****************************************************************** + * DeleteIpNetEntry (IPHLPAPI.@) + * + * + * PARAMS + * + * pArpEntry [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI DeleteIpNetEntry(PMIB_IPNETROW pArpEntry) +{ + TRACE("pArpEntry %p\n", pArpEntry); + /* could use SIOCDARP on systems that support it, not sure I want to */ + FIXME(":stub\n"); + return (DWORD) 0; +} + + +/****************************************************************** + * DeleteProxyArpEntry (IPHLPAPI.@) + * + * + * PARAMS + * + * dwAddress [In] + * dwMask [In] + * dwIfIndex [In] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI DeleteProxyArpEntry(DWORD dwAddress, DWORD dwMask, DWORD dwIfIndex) +{ + TRACE("dwAddress 0x%08lx, dwMask 0x%08lx, dwIfIndex 0x%08lx\n", dwAddress, + dwMask, dwIfIndex); + FIXME(":stub\n"); + /* marking Win2K+ functions not supported */ + return ERROR_NOT_SUPPORTED; +} + +/****************************************************************** + * EnableRouter (IPHLPAPI.@) + * + * + * PARAMS + * + * pHandle [In/Out] + * pOverlapped [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI EnableRouter(HANDLE * pHandle, OVERLAPPED * pOverlapped) +{ + TRACE("pHandle %p, pOverlapped %p\n", pHandle, pOverlapped); + FIXME(":stub\n"); + /* could echo "1" > /proc/net/sys/net/ipv4/ip_forward, not sure I want to + could map EACCESS to ERROR_ACCESS_DENIED, I suppose + marking Win2K+ functions not supported */ + return ERROR_NOT_SUPPORTED; +} + + +/****************************************************************** + * FlushIpNetTable (IPHLPAPI.@) + * + * + * PARAMS + * + * dwIfIndex [In] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI FlushIpNetTable(DWORD dwIfIndex) +{ + TRACE("dwIfIndex 0x%08lx\n", dwIfIndex); + FIXME(":stub\n"); + /* this flushes the arp cache of the given index + marking Win2K+ functions not supported */ + return ERROR_NOT_SUPPORTED; +} + + +/****************************************************************** + * GetAdapterIndex (IPHLPAPI.@) + * + * + * PARAMS + * + * AdapterName [In/Out] + * IfIndex [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI GetAdapterIndex(LPWSTR AdapterName, PULONG IfIndex) +{ + TRACE("AdapterName %p, IfIndex %p\n", AdapterName, IfIndex); + FIXME(":stub\n"); + /* marking Win2K+ functions not supported */ + return ERROR_NOT_SUPPORTED; +} + + +/****************************************************************** + * GetAdaptersInfo (IPHLPAPI.@) + * + * + * PARAMS + * + * pAdapterInfo [In/Out] + * pOutBufLen [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen) +{ + DWORD ret; + + TRACE("pAdapterInfo %p, pOutBufLen %p\n", pAdapterInfo, pOutBufLen); + if (!pOutBufLen) + ret = ERROR_INVALID_PARAMETER; + else { + DWORD numNonLoopbackInterfaces = getNumNonLoopbackInterfaces(); + + if (numNonLoopbackInterfaces > 0) { + /* this calculation assumes only one address in the IP_ADDR_STRING lists. + that's okay, because: + - we don't get multiple addresses per adapter anyway + - we don't know about per-adapter gateways + - DHCP and WINS servers can have max one entry per list */ + ULONG size = sizeof(IP_ADAPTER_INFO) * numNonLoopbackInterfaces; + + if (!pAdapterInfo || *pOutBufLen < size) { + *pOutBufLen = size; + ret = ERROR_BUFFER_OVERFLOW; + } + else { + InterfaceIndexTable *table = getNonLoopbackInterfaceIndexTable(); + + if (table) { + size = sizeof(IP_ADAPTER_INFO) * table->numIndexes; + if (*pOutBufLen < size) { + *pOutBufLen = size; + ret = ERROR_INSUFFICIENT_BUFFER; + } + else { + DWORD ndx; + HKEY hKey; + BOOL winsEnabled = FALSE; + IP_ADDRESS_STRING primaryWINS, secondaryWINS; + + memset(pAdapterInfo, 0, size); + if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, + "Software\\Wine\\Wine\\Config\\Network", 0, KEY_READ, + &hKey) == ERROR_SUCCESS) { + DWORD size = sizeof(primaryWINS.String); + unsigned long addr; + + RegQueryValueExA(hKey, "WinsServer", NULL, NULL, + primaryWINS.String, &size); + addr = inet_addr(primaryWINS.String); + if (addr != INADDR_NONE && addr != INADDR_ANY) + winsEnabled = TRUE; + size = sizeof(secondaryWINS.String); + RegQueryValueExA(hKey, "BackupWinsServer", NULL, NULL, + secondaryWINS.String, &size); + addr = inet_addr(secondaryWINS.String); + if (addr != INADDR_NONE && addr != INADDR_ANY) + winsEnabled = TRUE; + RegCloseKey(hKey); + } + for (ndx = 0; ndx < table->numIndexes; ndx++) { + PIP_ADAPTER_INFO ptr = &pAdapterInfo[ndx]; + DWORD addrLen = sizeof(ptr->Address), type; + const char *ifname = + getInterfaceNameByIndex(table->indexes[ndx]); + + /* on Win98 this is left empty, but whatever */ + + strncpy(ptr->AdapterName,ifname,sizeof(ptr->AdapterName)); + consumeInterfaceName(ifname); + ptr->AdapterName[MAX_ADAPTER_NAME_LENGTH] = '\0'; + getInterfacePhysicalByIndex(table->indexes[ndx], &addrLen, + ptr->Address, &type); + /* MS defines address length and type as UINT in some places and + DWORD in others, **sigh**. Don't want to assume that PUINT and + PDWORD are equiv (64-bit?) */ + ptr->AddressLength = addrLen; + ptr->Type = type; + ptr->Index = table->indexes[ndx]; + toIPAddressString(getInterfaceIPAddrByIndex(table->indexes[ndx]), + ptr->IpAddressList.IpAddress.String); + toIPAddressString(getInterfaceMaskByIndex(table->indexes[ndx]), + ptr->IpAddressList.IpMask.String); + if (winsEnabled) { + ptr->HaveWins = TRUE; + memcpy(ptr->PrimaryWinsServer.IpAddress.String, + primaryWINS.String, sizeof(primaryWINS.String)); + memcpy(ptr->SecondaryWinsServer.IpAddress.String, + secondaryWINS.String, sizeof(secondaryWINS.String)); + } + if (ndx < table->numIndexes - 1) + ptr->Next = &pAdapterInfo[ndx + 1]; + else + ptr->Next = NULL; + } + ret = NO_ERROR; + } + free(table); + } + else + ret = ERROR_OUTOFMEMORY; + } + } + else + ret = ERROR_NO_DATA; + } + TRACE("returning %ld\n", ret); + return ret; +} + + +/****************************************************************** + * GetBestInterface (IPHLPAPI.@) + * + * + * PARAMS + * + * dwDestAddr [In] + * pdwBestIfIndex [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI GetBestInterface(IPAddr dwDestAddr, PDWORD pdwBestIfIndex) +{ + DWORD ret; + + TRACE("dwDestAddr 0x%08lx, pdwBestIfIndex %p\n", dwDestAddr, pdwBestIfIndex); + if (!pdwBestIfIndex) + ret = ERROR_INVALID_PARAMETER; + else { + MIB_IPFORWARDROW ipRow; + + ret = GetBestRoute(dwDestAddr, 0, &ipRow); + if (ret == ERROR_SUCCESS) + *pdwBestIfIndex = ipRow.dwForwardIfIndex; + } + TRACE("returning %ld\n", ret); + return ret; +} + + +/****************************************************************** + * GetBestRoute (IPHLPAPI.@) + * + * + * PARAMS + * + * dwDestAddr [In] + * dwSourceAddr [In] + * OUT [In] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI GetBestRoute(DWORD dwDestAddr, DWORD dwSourceAddr, PMIB_IPFORWARDROW pBestRoute) +{ + PMIB_IPFORWARDTABLE table; + DWORD ret; + + TRACE("dwDestAddr 0x%08lx, dwSourceAddr 0x%08lx, pBestRoute %p\n", dwDestAddr, + dwSourceAddr, pBestRoute); + if (!pBestRoute) + return ERROR_INVALID_PARAMETER; + + AllocateAndGetIpForwardTableFromStack(&table, FALSE, GetProcessHeap(), 0); + if (table) { + DWORD ndx, matchedBits, matchedNdx = 0; + + for (ndx = 0, matchedBits = 0; ndx < table->dwNumEntries; ndx++) { + if ((dwDestAddr & table->table[ndx].dwForwardMask) == + (table->table[ndx].dwForwardDest & table->table[ndx].dwForwardMask)) { + DWORD numShifts, mask; + + for (numShifts = 0, mask = table->table[ndx].dwForwardMask; + mask && !(mask & 1); mask >>= 1, numShifts++) + ; + if (numShifts > matchedBits) { + matchedBits = numShifts; + matchedNdx = ndx; + } + } + } + memcpy(pBestRoute, &table->table[matchedNdx], sizeof(MIB_IPFORWARDROW)); + HeapFree(GetProcessHeap(), 0, table); + ret = ERROR_SUCCESS; + } + else + ret = ERROR_OUTOFMEMORY; + TRACE("returning %ld\n", ret); + return ret; +} + + +/****************************************************************** + * GetFriendlyIfIndex (IPHLPAPI.@) + * + * + * PARAMS + * + * IfIndex [In] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI GetFriendlyIfIndex(DWORD IfIndex) +{ + /* windows doesn't validate these, either, just makes sure the top byte is + cleared. I assume my ifenum module never gives an index with the top + byte set. */ + TRACE("returning %ld\n", IfIndex); + return IfIndex; +} + + +/****************************************************************** + * GetIcmpStatistics (IPHLPAPI.@) + * + * + * PARAMS + * + * pStats [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI GetIcmpStatistics(PMIB_ICMP pStats) +{ + DWORD ret; + + TRACE("pStats %p\n", pStats); + ret = getICMPStats(pStats); + TRACE("returning %ld\n", ret); + return ret; +} + + +/****************************************************************** + * GetIfEntry (IPHLPAPI.@) + * + * + * PARAMS + * + * pIfRow [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI GetIfEntry(PMIB_IFROW pIfRow) +{ + DWORD ret; + const char *name; + + TRACE("pIfRow %p\n", pIfRow); + if (!pIfRow) + return ERROR_INVALID_PARAMETER; + + name = getInterfaceNameByIndex(pIfRow->dwIndex); + if (name) { + ret = getInterfaceEntryByIndex(pIfRow->dwIndex, pIfRow); + if (ret == NO_ERROR) + ret = getInterfaceStatsByIndex(pIfRow->dwIndex, pIfRow); + consumeInterfaceName(name); + } + else + ret = ERROR_INVALID_DATA; + TRACE("returning %ld\n", ret); + return ret; +} + + +static int IfTableSorter(const void *a, const void *b) +{ + int ret; + + if (a && b) + ret = ((PMIB_IFROW)a)->dwIndex - ((PMIB_IFROW)b)->dwIndex; + else + ret = 0; + return ret; +} + + +/****************************************************************** + * GetIfTable (IPHLPAPI.@) + * + * + * PARAMS + * + * pIfTable [In/Out] + * pdwSize [In/Out] + * bOrder [In] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI GetIfTable(PMIB_IFTABLE pIfTable, PULONG pdwSize, BOOL bOrder) +{ + DWORD ret; + + TRACE("pIfTable %p, pdwSize %p, bOrder %ld\n", pdwSize, pdwSize, + (DWORD)bOrder); + if (!pdwSize) + ret = ERROR_INVALID_PARAMETER; + else { + DWORD numInterfaces = getNumInterfaces(); + TRACE("GetIfTable: numInterfaces = %d\n", (int)numInterfaces); + ULONG size = sizeof(MIB_IFTABLE) + (numInterfaces - 1) * sizeof(MIB_IFROW); + + if (!pIfTable || *pdwSize < size) { + *pdwSize = size; + ret = ERROR_INSUFFICIENT_BUFFER; + } + else { + InterfaceIndexTable *table = getInterfaceIndexTable(); + + if (table) { + size = sizeof(MIB_IFTABLE) + (table->numIndexes - 1) * + sizeof(MIB_IFROW); + if (*pdwSize < size) { + *pdwSize = size; + ret = ERROR_INSUFFICIENT_BUFFER; + } + else { + DWORD ndx; + + pIfTable->dwNumEntries = 0; + for (ndx = 0; ndx < table->numIndexes; ndx++) { + pIfTable->table[ndx].dwIndex = table->indexes[ndx]; + GetIfEntry(&pIfTable->table[ndx]); + pIfTable->dwNumEntries++; + } + if (bOrder) + qsort(pIfTable->table, pIfTable->dwNumEntries, sizeof(MIB_IFROW), + IfTableSorter); + ret = NO_ERROR; + } + free(table); + } + else + ret = ERROR_OUTOFMEMORY; + } + } + TRACE("returning %ld\n", ret); + return ret; +} + + +/****************************************************************** + * GetInterfaceInfo (IPHLPAPI.@) + * + * + * PARAMS + * + * pIfTable [In/Out] + * dwOutBufLen [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI GetInterfaceInfo(PIP_INTERFACE_INFO pIfTable, PULONG dwOutBufLen) +{ + DWORD ret; + + TRACE("pIfTable %p, dwOutBufLen %p\n", pIfTable, dwOutBufLen); + if (!dwOutBufLen) + ret = ERROR_INVALID_PARAMETER; + else { + DWORD numInterfaces = getNumInterfaces(); + ULONG size = sizeof(IP_INTERFACE_INFO) + (numInterfaces - 1) * + sizeof(IP_ADAPTER_INDEX_MAP); + + if (!pIfTable || *dwOutBufLen < size) { + *dwOutBufLen = size; + ret = ERROR_INSUFFICIENT_BUFFER; + } + else { + InterfaceIndexTable *table = getInterfaceIndexTable(); + + if (table) { + size = sizeof(IP_INTERFACE_INFO) + (table->numIndexes - 1) * + sizeof(IP_ADAPTER_INDEX_MAP); + if (*dwOutBufLen < size) { + *dwOutBufLen = size; + ret = ERROR_INSUFFICIENT_BUFFER; + } + else { + DWORD ndx; + + pIfTable->NumAdapters = 0; + for (ndx = 0; ndx < table->numIndexes; ndx++) { + const char *walker, *name; + WCHAR *assigner; + + pIfTable->Adapter[ndx].Index = table->indexes[ndx]; + name = getInterfaceNameByIndex(table->indexes[ndx]); + for (walker = name, assigner = pIfTable->Adapter[ndx].Name; + walker && *walker && + assigner - pIfTable->Adapter[ndx].Name < MAX_ADAPTER_NAME - 1; + walker++, assigner++) + *assigner = *walker; + *assigner = 0; + consumeInterfaceName(name); + pIfTable->NumAdapters++; + } + ret = NO_ERROR; + } + free(table); + } + else + ret = ERROR_OUTOFMEMORY; + } + } + TRACE("returning %ld\n", ret); + return ret; +} + + +static int IpAddrTableSorter(const void *a, const void *b) +{ + int ret; + + if (a && b) + ret = ((PMIB_IPADDRROW)a)->dwAddr - ((PMIB_IPADDRROW)b)->dwAddr; + else + ret = 0; + return ret; +} + + +/****************************************************************** + * GetIpAddrTable (IPHLPAPI.@) + * + * + * PARAMS + * + * pIpAddrTable [In/Out] + * pdwSize [In/Out] + * bOrder [In] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI GetIpAddrTable(PMIB_IPADDRTABLE pIpAddrTable, PULONG pdwSize, BOOL bOrder) +{ + DWORD ret; + + TRACE("pIpAddrTable %p, pdwSize %p, bOrder %ld\n", pIpAddrTable, pdwSize, + (DWORD)bOrder); + if (!pdwSize) + ret = ERROR_INVALID_PARAMETER; + else { + DWORD numInterfaces = getNumInterfaces(); + ULONG size = sizeof(MIB_IPADDRTABLE) + (numInterfaces - 1) * + sizeof(MIB_IPADDRROW); + + if (!pIpAddrTable || *pdwSize < size) { + *pdwSize = size; + ret = ERROR_INSUFFICIENT_BUFFER; + } + else { + InterfaceIndexTable *table = getInterfaceIndexTable(); + + if (table) { + size = sizeof(MIB_IPADDRTABLE) + (table->numIndexes - 1) * + sizeof(MIB_IPADDRROW); + if (*pdwSize < size) { + *pdwSize = size; + ret = ERROR_INSUFFICIENT_BUFFER; + } + else { + DWORD ndx, bcast; + + pIpAddrTable->dwNumEntries = 0; + for (ndx = 0; ndx < table->numIndexes; ndx++) { + pIpAddrTable->table[ndx].dwIndex = table->indexes[ndx]; + pIpAddrTable->table[ndx].dwAddr = + getInterfaceIPAddrByIndex(table->indexes[ndx]); + pIpAddrTable->table[ndx].dwMask = + getInterfaceMaskByIndex(table->indexes[ndx]); + /* the dwBCastAddr member isn't the broadcast address, it indicates + * whether the interface uses the 1's broadcast address (1) or the + * 0's broadcast address (0). + */ + bcast = getInterfaceBCastAddrByIndex(table->indexes[ndx]); + pIpAddrTable->table[ndx].dwBCastAddr = + (bcast & pIpAddrTable->table[ndx].dwMask) ? 1 : 0; + /* FIXME: hardcoded reasm size, not sure where to get it */ + pIpAddrTable->table[ndx].dwReasmSize = 65535; + pIpAddrTable->table[ndx].unused1 = 0; + pIpAddrTable->table[ndx].wType = 0; /* aka unused2 */ + pIpAddrTable->dwNumEntries++; + } + if (bOrder) + qsort(pIpAddrTable->table, pIpAddrTable->dwNumEntries, + sizeof(MIB_IPADDRROW), IpAddrTableSorter); + ret = NO_ERROR; + } + free(table); + } + else + ret = ERROR_OUTOFMEMORY; + } + } + TRACE("returning %ld\n", ret); + return ret; +} + + +static int IpForwardTableSorter(const void *a, const void *b) +{ + int ret; + + if (a && b) { + PMIB_IPFORWARDROW rowA = (PMIB_IPFORWARDROW)a, rowB = (PMIB_IPFORWARDROW)b; + + ret = rowA->dwForwardDest - rowB->dwForwardDest; + if (ret == 0) { + ret = rowA->dwForwardProto - rowB->dwForwardProto; + if (ret == 0) { + ret = rowA->dwForwardPolicy - rowB->dwForwardPolicy; + if (ret == 0) + ret = rowA->dwForwardNextHop - rowB->dwForwardNextHop; + } + } + } + else + ret = 0; + return ret; +} + + +/****************************************************************** + * GetIpForwardTable (IPHLPAPI.@) + * + * + * PARAMS + * + * pIpForwardTable [In/Out] + * pdwSize [In/Out] + * bOrder [In] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI GetIpForwardTable(PMIB_IPFORWARDTABLE pIpForwardTable, PULONG pdwSize, BOOL bOrder) +{ + DWORD ret; + + TRACE("pIpForwardTable %p, pdwSize %p, bOrder %ld\n", pIpForwardTable, + pdwSize, (DWORD)bOrder); + if (!pdwSize) + ret = ERROR_INVALID_PARAMETER; + else { + DWORD numRoutes = getNumRoutes(); + ULONG sizeNeeded = sizeof(MIB_IPFORWARDTABLE) + (numRoutes - 1) * + sizeof(MIB_IPFORWARDROW); + + if (!pIpForwardTable || *pdwSize < sizeNeeded) { + *pdwSize = sizeNeeded; + ret = ERROR_INSUFFICIENT_BUFFER; + } + else { + RouteTable *table = getRouteTable(); + if (table) { + sizeNeeded = sizeof(MIB_IPFORWARDTABLE) + (table->numRoutes - 1) * + sizeof(MIB_IPFORWARDROW); + if (*pdwSize < sizeNeeded) { + *pdwSize = sizeNeeded; + ret = ERROR_INSUFFICIENT_BUFFER; + } + else { + DWORD ndx; + + pIpForwardTable->dwNumEntries = table->numRoutes; + for (ndx = 0; ndx < numRoutes; ndx++) { + pIpForwardTable->table[ndx].dwForwardIfIndex = + table->routes[ndx].ifIndex; + pIpForwardTable->table[ndx].dwForwardDest = + table->routes[ndx].dest; + pIpForwardTable->table[ndx].dwForwardMask = + table->routes[ndx].mask; + pIpForwardTable->table[ndx].dwForwardPolicy = 0; + pIpForwardTable->table[ndx].dwForwardNextHop = + table->routes[ndx].gateway; + /* FIXME: this type is appropriate for local interfaces; may not + always be appropriate */ + pIpForwardTable->table[ndx].dwForwardType = MIB_IPROUTE_TYPE_DIRECT; + /* FIXME: other protos might be appropriate, e.g. the default route + is typically set with MIB_IPPROTO_NETMGMT instead */ + pIpForwardTable->table[ndx].dwForwardProto = MIB_IPPROTO_LOCAL; + /* punt on age and AS */ + pIpForwardTable->table[ndx].dwForwardAge = 0; + pIpForwardTable->table[ndx].dwForwardNextHopAS = 0; + pIpForwardTable->table[ndx].dwForwardMetric1 = + table->routes[ndx].metric; + /* rest of the metrics are 0.. */ + pIpForwardTable->table[ndx].dwForwardMetric2 = 0; + pIpForwardTable->table[ndx].dwForwardMetric3 = 0; + pIpForwardTable->table[ndx].dwForwardMetric4 = 0; + pIpForwardTable->table[ndx].dwForwardMetric5 = 0; + } + if (bOrder) + qsort(pIpForwardTable->table, pIpForwardTable->dwNumEntries, + sizeof(MIB_IPFORWARDROW), IpForwardTableSorter); + ret = NO_ERROR; + } + free(table); + } + else + ret = ERROR_OUTOFMEMORY; + } + } + TRACE("returning %ld\n", ret); + return ret; +} + + +static int IpNetTableSorter(const void *a, const void *b) +{ + int ret; + + if (a && b) + ret = ((PMIB_IPNETROW)a)->dwAddr - ((PMIB_IPNETROW)b)->dwAddr; + else + ret = 0; + return ret; +} + + +/****************************************************************** + * GetIpNetTable (IPHLPAPI.@) + * + * + * PARAMS + * + * pIpNetTable [In/Out] + * pdwSize [In/Out] + * bOrder [In] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI GetIpNetTable(PMIB_IPNETTABLE pIpNetTable, PULONG pdwSize, BOOL bOrder) +{ + DWORD ret; + + TRACE("pIpNetTable %p, pdwSize %p, bOrder %ld\n", pIpNetTable, pdwSize, + (DWORD)bOrder); + if (!pdwSize) + ret = ERROR_INVALID_PARAMETER; + else { + DWORD numEntries = getNumArpEntries(); + ULONG size = sizeof(MIB_IPNETTABLE) + (numEntries - 1) * + sizeof(MIB_IPNETROW); + + if (!pIpNetTable || *pdwSize < size) { + *pdwSize = size; + ret = ERROR_INSUFFICIENT_BUFFER; + } + else { + PMIB_IPNETTABLE table = getArpTable(); + + if (table) { + size = sizeof(MIB_IPNETTABLE) + (table->dwNumEntries - 1) * + sizeof(MIB_IPNETROW); + if (*pdwSize < size) { + *pdwSize = size; + ret = ERROR_INSUFFICIENT_BUFFER; + } + else { + memcpy(pIpNetTable, table, size); + if (bOrder) + qsort(pIpNetTable->table, pIpNetTable->dwNumEntries, + sizeof(MIB_IPNETROW), IpNetTableSorter); + ret = NO_ERROR; + } + free(table); + } + else + ret = ERROR_OUTOFMEMORY; + } + } + TRACE("returning %ld\n", ret); + return ret; +} + + +/****************************************************************** + * GetIpStatistics (IPHLPAPI.@) + * + * + * PARAMS + * + * pStats [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI GetIpStatistics(PMIB_IPSTATS pStats) +{ + return GetIpStatisticsEx(pStats, PF_INET); +} + +/****************************************************************** + * GetIpStatisticsEx (IPHLPAPI.@) + * + * + * PARAMS + * + * pStats [In/Out] + * dwFamily [In] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI GetIpStatisticsEx(PMIB_IPSTATS pStats, DWORD dwFamily) +{ + DWORD ret; + + TRACE("pStats %p\n", pStats); + ret = getIPStats(pStats, dwFamily); + TRACE("returning %ld\n", ret); + return ret; +} + +/****************************************************************** + * GetNetworkParams (IPHLPAPI.@) + * + * + * PARAMS + * + * pFixedInfo [In/Out] + * pOutBufLen [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI GetNetworkParams(PFIXED_INFO pFixedInfo, PULONG pOutBufLen) +{ + DWORD ret, size; + LONG regReturn; + HKEY hKey; + PIPHLP_RES_INFO resInfo; + + TRACE("pFixedInfo %p, pOutBufLen %p\n", pFixedInfo, pOutBufLen); + if (!pOutBufLen) + return ERROR_INVALID_PARAMETER; + + resInfo = getResInfo(); + if (!resInfo) + return ERROR_OUTOFMEMORY; + + TRACE("resInfo->riCount = %d\n", resInfo->riCount); + + size = sizeof(FIXED_INFO) + (resInfo->riCount > 0 ? (resInfo->riCount - 1) * + sizeof(IP_ADDR_STRING) : 0); + if (!pFixedInfo || *pOutBufLen < size) { + *pOutBufLen = size; + disposeResInfo( resInfo ); + return ERROR_BUFFER_OVERFLOW; + } + + memset(pFixedInfo, 0, size); + size = sizeof(pFixedInfo->HostName); + GetComputerNameExA(ComputerNameDnsHostname, pFixedInfo->HostName, &size); + size = sizeof(pFixedInfo->DomainName); + GetComputerNameExA(ComputerNameDnsDomain, pFixedInfo->DomainName, &size); + + TRACE("GetComputerNameExA: %s\n", pFixedInfo->DomainName); + + if (resInfo->riCount > 0) { + PIP_ADDR_STRING ptr; + int i; + + for (i = 0, ptr = &pFixedInfo->DnsServerList; i < resInfo->riCount && ptr; + i++, ptr = ptr->Next) { + toIPAddressString + (((PSOCKADDR_IN)&resInfo->riAddressList[i])->sin_addr.s_addr, + ptr->IpAddress.String); + if (i == resInfo->riCount - 1) + ptr->Next = NULL; + else if (i == 0) + ptr->Next = (PIP_ADDR_STRING)((LPBYTE)pFixedInfo + sizeof(FIXED_INFO)); + else + ptr->Next = (PIP_ADDR_STRING)((PBYTE)ptr + sizeof(IP_ADDR_STRING)); + } + } + pFixedInfo->NodeType = HYBRID_NODETYPE; + regReturn = RegOpenKeyExA(HKEY_LOCAL_MACHINE, + "SYSTEM\\CurrentControlSet\\Services\\VxD\\MSTCP", 0, KEY_READ, &hKey); + if (regReturn != ERROR_SUCCESS) + regReturn = RegOpenKeyExA(HKEY_LOCAL_MACHINE, + "SYSTEM\\CurrentControlSet\\Services\\NetBT\\Parameters", 0, KEY_READ, + &hKey); + if (regReturn == ERROR_SUCCESS) + { + DWORD size = sizeof(pFixedInfo->ScopeId); + + RegQueryValueExA(hKey, "ScopeID", NULL, NULL, pFixedInfo->ScopeId, &size); + RegCloseKey(hKey); + } + + disposeResInfo( resInfo ); + /* FIXME: can check whether routing's enabled in /proc/sys/net/ipv4/ip_forward + I suppose could also check for a listener on port 53 to set EnableDns */ + ret = NO_ERROR; + TRACE("returning %ld\n", ret); + + return ret; +} + + +/****************************************************************** + * GetNumberOfInterfaces (IPHLPAPI.@) + * + * + * PARAMS + * + * pdwNumIf [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI GetNumberOfInterfaces(PDWORD pdwNumIf) +{ + DWORD ret; + + TRACE("pdwNumIf %p\n", pdwNumIf); + if (!pdwNumIf) + ret = ERROR_INVALID_PARAMETER; + else { + *pdwNumIf = getNumInterfaces(); + ret = NO_ERROR; + } + TRACE("returning %ld\n", ret); + return ret; +} + + +/****************************************************************** + * GetPerAdapterInfo (IPHLPAPI.@) + * + * + * PARAMS + * + * IfIndex [In] + * pPerAdapterInfo [In/Out] + * pOutBufLen [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI GetPerAdapterInfo(ULONG IfIndex, PIP_PER_ADAPTER_INFO pPerAdapterInfo, PULONG pOutBufLen) +{ + TRACE("IfIndex %ld, pPerAdapterInfo %p, pOutBufLen %p\n", IfIndex, + pPerAdapterInfo, pOutBufLen); + FIXME(":stub\n"); + /* marking Win2K+ functions not supported */ + return ERROR_NOT_SUPPORTED; +} + + +/****************************************************************** + * GetRTTAndHopCount (IPHLPAPI.@) + * + * + * PARAMS + * + * DestIpAddress [In] + * HopCount [In/Out] + * MaxHops [In] + * RTT [In/Out] + * + * RETURNS + * + * BOOL + * + */ +BOOL WINAPI GetRTTAndHopCount(IPAddr DestIpAddress, PULONG HopCount, ULONG MaxHops, PULONG RTT) +{ + TRACE("DestIpAddress 0x%08lx, HopCount %p, MaxHops %ld, RTT %p\n", + DestIpAddress, HopCount, MaxHops, RTT); + FIXME(":stub\n"); + return (BOOL) 0; +} + + +/****************************************************************** + * GetTcpStatisticsEx (IPHLPAPI.@) + * + * + * PARAMS + * + * pStats [In/Out] + * dwFamily [In] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI GetTcpStatisticsEx(PMIB_TCPSTATS pStats, DWORD dwFamily) +{ + DWORD ret; + + TRACE("pStats %p\n", pStats); + ret = getTCPStats(pStats, dwFamily); + TRACE("returning %ld\n", ret); + return ret; +} + +/****************************************************************** + * GetTcpStatistics (IPHLPAPI.@) + * + * + * PARAMS + * + * pStats [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI GetTcpStatistics(PMIB_TCPSTATS pStats) +{ + return GetTcpStatisticsEx(pStats, PF_INET); +} + + +static int TcpTableSorter(const void *a, const void *b) +{ + int ret; + + if (a && b) { + PMIB_TCPROW rowA = (PMIB_TCPROW)a, rowB = (PMIB_TCPROW)b; + + ret = rowA->dwLocalAddr - rowB->dwLocalAddr; + if (ret == 0) { + ret = rowA->dwLocalPort - rowB->dwLocalPort; + if (ret == 0) { + ret = rowA->dwRemoteAddr - rowB->dwRemoteAddr; + if (ret == 0) + ret = rowA->dwRemotePort - rowB->dwRemotePort; + } + } + } + else + ret = 0; + return ret; +} + + +/****************************************************************** + * GetTcpTable (IPHLPAPI.@) + * + * + * PARAMS + * + * pTcpTable [In/Out] + * pdwSize [In/Out] + * bOrder [In] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI GetTcpTable(PMIB_TCPTABLE pTcpTable, PDWORD pdwSize, BOOL bOrder) +{ + DWORD ret; + + TRACE("pTcpTable %p, pdwSize %p, bOrder %ld\n", pTcpTable, pdwSize, + (DWORD)bOrder); + if (!pdwSize) + ret = ERROR_INVALID_PARAMETER; + else { + DWORD numEntries = getNumTcpEntries(); + ULONG size = sizeof(MIB_TCPTABLE) + (numEntries - 1) * sizeof(MIB_TCPROW); + + if (!pTcpTable || *pdwSize < size) { + *pdwSize = size; + ret = ERROR_INSUFFICIENT_BUFFER; + } + else { + PMIB_TCPTABLE table = getTcpTable(); + + if (table) { + size = sizeof(MIB_TCPTABLE) + (table->dwNumEntries - 1) * + sizeof(MIB_TCPROW); + if (*pdwSize < size) { + *pdwSize = size; + ret = ERROR_INSUFFICIENT_BUFFER; + } + else { + memcpy(pTcpTable, table, size); + if (bOrder) + qsort(pTcpTable->table, pTcpTable->dwNumEntries, + sizeof(MIB_TCPROW), TcpTableSorter); + ret = NO_ERROR; + } + free(table); + } + else + ret = ERROR_OUTOFMEMORY; + } + } + TRACE("returning %ld\n", ret); + return ret; +} + + +/****************************************************************** + * GetUdpStatisticsEx (IPHLPAPI.@) + * + * + * PARAMS + * + * pStats [In/Out] + * dwFamily [In] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI GetUdpStatisticsEx(PMIB_UDPSTATS pStats, DWORD dwFamily) +{ + DWORD ret; + + TRACE("pStats %p\n", pStats); + ret = getUDPStats(pStats, dwFamily); + TRACE("returning %ld\n", ret); + return ret; +} + +/****************************************************************** + * GetUdpStatistics (IPHLPAPI.@) + * + * + * PARAMS + * + * pStats [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI GetUdpStatistics(PMIB_UDPSTATS pStats) +{ + return GetUdpStatisticsEx(pStats, PF_INET); +} + + +static int UdpTableSorter(const void *a, const void *b) +{ + int ret; + + if (a && b) { + PMIB_UDPROW rowA = (PMIB_UDPROW)a, rowB = (PMIB_UDPROW)b; + + ret = rowA->dwLocalAddr - rowB->dwLocalAddr; + if (ret == 0) + ret = rowA->dwLocalPort - rowB->dwLocalPort; + } + else + ret = 0; + return ret; +} + + +/****************************************************************** + * GetUdpTable (IPHLPAPI.@) + * + * + * PARAMS + * + * pUdpTable [In/Out] + * pdwSize [In/Out] + * bOrder [In] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI GetUdpTable(PMIB_UDPTABLE pUdpTable, PDWORD pdwSize, BOOL bOrder) +{ + DWORD ret; + + TRACE("pUdpTable %p, pdwSize %p, bOrder %ld\n", pUdpTable, pdwSize, + (DWORD)bOrder); + if (!pdwSize) + ret = ERROR_INVALID_PARAMETER; + else { + DWORD numEntries = getNumUdpEntries(); + ULONG size = sizeof(MIB_UDPTABLE) + (numEntries - 1) * sizeof(MIB_UDPROW); + + if (!pUdpTable || *pdwSize < size) { + *pdwSize = size; + ret = ERROR_INSUFFICIENT_BUFFER; + } + else { + PMIB_UDPTABLE table = getUdpTable(); + + if (table) { + size = sizeof(MIB_UDPTABLE) + (table->dwNumEntries - 1) * + sizeof(MIB_UDPROW); + if (*pdwSize < size) { + *pdwSize = size; + ret = ERROR_INSUFFICIENT_BUFFER; + } + else { + memcpy(pUdpTable, table, size); + if (bOrder) + qsort(pUdpTable->table, pUdpTable->dwNumEntries, + sizeof(MIB_UDPROW), UdpTableSorter); + ret = NO_ERROR; + } + free(table); + } + else + ret = ERROR_OUTOFMEMORY; + } + } + TRACE("returning %ld\n", ret); + return ret; +} + + +/****************************************************************** + * GetUniDirectionalAdapterInfo (IPHLPAPI.@) + * + * + * PARAMS + * + * pIPIfInfo [In/Out] + * dwOutBufLen [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI GetUniDirectionalAdapterInfo(PIP_UNIDIRECTIONAL_ADAPTER_ADDRESS pIPIfInfo, PULONG dwOutBufLen) +{ + TRACE("pIPIfInfo %p, dwOutBufLen %p\n", pIPIfInfo, dwOutBufLen); + /* a unidirectional adapter?? not bloody likely! */ + return ERROR_NOT_SUPPORTED; +} + + +/****************************************************************** + * IpReleaseAddress (IPHLPAPI.@) + * + * + * PARAMS + * + * AdapterInfo [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI IpReleaseAddress(PIP_ADAPTER_INDEX_MAP AdapterInfo) +{ + TRACE("AdapterInfo %p\n", AdapterInfo); + /* not a stub, never going to support this (and I never mark an adapter as + DHCP enabled, see GetAdaptersInfo, so this should never get called) */ + return ERROR_NOT_SUPPORTED; +} + + +/****************************************************************** + * IpRenewAddress (IPHLPAPI.@) + * + * + * PARAMS + * + * AdapterInfo [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI IpRenewAddress(PIP_ADAPTER_INDEX_MAP AdapterInfo) +{ + TRACE("AdapterInfo %p\n", AdapterInfo); + /* not a stub, never going to support this (and I never mark an adapter as + DHCP enabled, see GetAdaptersInfo, so this should never get called) */ + return ERROR_NOT_SUPPORTED; +} + + +/****************************************************************** + * NotifyAddrChange (IPHLPAPI.@) + * + * + * PARAMS + * + * Handle [In/Out] + * overlapped [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI NotifyAddrChange(PHANDLE Handle, LPOVERLAPPED overlapped) +{ + TRACE("Handle %p, overlapped %p\n", Handle, overlapped); + FIXME(":stub\n"); + /* marking Win2K+ functions not supported */ + return ERROR_NOT_SUPPORTED; +} + + +/****************************************************************** + * NotifyRouteChange (IPHLPAPI.@) + * + * + * PARAMS + * + * Handle [In/Out] + * overlapped [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI NotifyRouteChange(PHANDLE Handle, LPOVERLAPPED overlapped) +{ + TRACE("Handle %p, overlapped %p\n", Handle, overlapped); + FIXME(":stub\n"); + /* marking Win2K+ functions not supported */ + return ERROR_NOT_SUPPORTED; +} + + +/****************************************************************** + * SendARP (IPHLPAPI.@) + * + * + * PARAMS + * + * DestIP [In] + * SrcIP [In] + * pMacAddr [In/Out] + * PhyAddrLen [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI SendARP(IPAddr DestIP, IPAddr SrcIP, PULONG pMacAddr, PULONG PhyAddrLen) +{ + TRACE("DestIP 0x%08lx, SrcIP 0x%08lx, pMacAddr %p, PhyAddrLen %p\n", DestIP, + SrcIP, pMacAddr, PhyAddrLen); + FIXME(":stub\n"); + /* marking Win2K+ functions not supported */ + return ERROR_NOT_SUPPORTED; +} + + +/****************************************************************** + * SetIfEntry (IPHLPAPI.@) + * + * + * PARAMS + * + * pIfRow [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI SetIfEntry(PMIB_IFROW pIfRow) +{ + TRACE("pIfRow %p\n", pIfRow); + /* this is supposed to set an administratively interface up or down. + Could do SIOCSIFFLAGS and set/clear IFF_UP, but, not sure I want to, and + this sort of down is indistinguishable from other sorts of down (e.g. no + link). */ + FIXME(":stub\n"); + return ERROR_NOT_SUPPORTED; +} + + +/****************************************************************** + * SetIpForwardEntry (IPHLPAPI.@) + * + * + * PARAMS + * + * pRoute [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI SetIpForwardEntry(PMIB_IPFORWARDROW pRoute) +{ + TRACE("pRoute %p\n", pRoute); + /* this is to add a route entry, how's it distinguishable from + CreateIpForwardEntry? + could use SIOCADDRT, not sure I want to */ + FIXME(":stub\n"); + return (DWORD) 0; +} + + +/****************************************************************** + * SetIpNetEntry (IPHLPAPI.@) + * + * + * PARAMS + * + * pArpEntry [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI SetIpNetEntry(PMIB_IPNETROW pArpEntry) +{ + TRACE("pArpEntry %p\n", pArpEntry); + /* same as CreateIpNetEntry here, could use SIOCSARP, not sure I want to */ + FIXME(":stub\n"); + return (DWORD) 0; +} + + +/****************************************************************** + * SetIpStatistics (IPHLPAPI.@) + * + * + * PARAMS + * + * pIpStats [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI SetIpStatistics(PMIB_IPSTATS pIpStats) +{ + TRACE("pIpStats %p\n", pIpStats); + FIXME(":stub\n"); + return (DWORD) 0; +} + + +/****************************************************************** + * SetIpTTL (IPHLPAPI.@) + * + * + * PARAMS + * + * nTTL [In] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI SetIpTTL(UINT nTTL) +{ + TRACE("nTTL %d\n", nTTL); + /* could echo nTTL > /proc/net/sys/net/ipv4/ip_default_ttl, not sure I + want to. Could map EACCESS to ERROR_ACCESS_DENIED, I suppose */ + FIXME(":stub\n"); + return (DWORD) 0; +} + + +/****************************************************************** + * SetTcpEntry (IPHLPAPI.@) + * + * + * PARAMS + * + * pTcpRow [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI SetTcpEntry(PMIB_TCPROW pTcpRow) +{ + TRACE("pTcpRow %p\n", pTcpRow); + FIXME(":stub\n"); + return (DWORD) 0; +} + + +/****************************************************************** + * UnenableRouter (IPHLPAPI.@) + * + * + * PARAMS + * + * pOverlapped [In/Out] + * lpdwEnableCount [In/Out] + * + * RETURNS + * + * DWORD + * + */ +DWORD WINAPI UnenableRouter(OVERLAPPED * pOverlapped, LPDWORD lpdwEnableCount) +{ + TRACE("pOverlapped %p, lpdwEnableCount %p\n", pOverlapped, lpdwEnableCount); + FIXME(":stub\n"); + /* could echo "0" > /proc/net/sys/net/ipv4/ip_forward, not sure I want to + could map EACCESS to ERROR_ACCESS_DENIED, I suppose + marking Win2K+ functions not supported */ + return ERROR_NOT_SUPPORTED; +} + +/* + * @unimplemented + */ +DWORD STDCALL GetIpErrorString(IP_STATUS ErrorCode,PWCHAR Buffer,PDWORD Size) +{ + UNIMPLEMENTED + return 0L; +} + + +/* + * @unimplemented + */ +PIP_ADAPTER_ORDER_MAP STDCALL GetAdapterOrderMap(VOID) +{ + UNIMPLEMENTED + return 0L; +} + +/* + * @unimplemented + */ +DWORD STDCALL GetAdaptersAddresses(ULONG Family,DWORD Flags,PVOID Reserved,PIP_ADAPTER_ADDRESSES pAdapterAddresses,PULONG pOutBufLen) +{ + UNIMPLEMENTED + return 0L; +} + +/* + * @unimplemented + */ +BOOL STDCALL CancelIPChangeNotify(LPOVERLAPPED notifyOverlapped) +{ + UNIMPLEMENTED + return 0L; +} + +/* + * @unimplemented + */ +DWORD STDCALL GetBestInterfaceEx(struct sockaddr *pDestAddr,PDWORD pdwBestIfIndex) +{ + UNIMPLEMENTED + return 0L; +} + +/* + * @unimplemented + */ +DWORD STDCALL NhpAllocateAndGetInterfaceInfoFromStack(IP_INTERFACE_NAME_INFO **ppTable,PDWORD pdwCount,BOOL bOrder,HANDLE hHeap,DWORD dwFlags) +{ + UNIMPLEMENTED + return 0L; +} + +/* + * @unimplemented + */ +DWORD STDCALL GetIcmpStatisticsEx(PMIB_ICMP_EX pStats,DWORD dwFamily) +{ + UNIMPLEMENTED + return 0L; +} + diff --git a/reactos/lib/iphlpapi/iphlpapiextra.h b/reactos/lib/iphlpapi/iphlpapiextra.h new file mode 100644 index 00000000000..3aa0ae4d8c0 --- /dev/null +++ b/reactos/lib/iphlpapi/iphlpapiextra.h @@ -0,0 +1,11 @@ +#ifndef _IPHLPAPIEXTRA_H +#define _IPHLPAPIEXTRA_H + +#include +/* This is here until we switch to version 2.5 of the mingw headers */ +#if (__W32API_MAJOR_VERSION < 2 || __W32API_MINOR_VERSION < 5) +BOOL WINAPI +GetComputerNameExA(COMPUTER_NAME_FORMAT,LPSTR,LPDWORD); +#endif + +#endif/*_IPHLPAPIEXTRA_H*/ diff --git a/reactos/lib/iphlpapi/iphlpv6.c b/reactos/lib/iphlpapi/iphlpv6.c new file mode 100644 index 00000000000..6c6472b5488 --- /dev/null +++ b/reactos/lib/iphlpapi/iphlpv6.c @@ -0,0 +1,91 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_ARPA_INET_H +# include +#endif +#ifdef HAVE_ARPA_NAMESER_H +# include +#endif +#ifdef HAVE_RESOLV_H +# include +#endif + +#ifdef __REACTOS__ +# include +# include +# include +# include +# include +# include +# include +# include +# include "iphlpapiextra.h" +#else +# include "windef.h" +# include "winbase.h" +# include "winreg.h" +#endif + +#include "iphlpapi.h" +#include "ifenum.h" +#include "ipstats.h" +#include "iphlp_res.h" +#include "wine/debug.h" + +/* + * @unimplemented + */ +HANDLE STDCALL Icmp6CreateFile( + VOID + ) +{ + UNIMPLEMENTED + return 0L; +} + +/* + * @unimplemented + */ +DWORD +STDCALL +Icmp6SendEcho2( + HANDLE IcmpHandle, + HANDLE Event, + FARPROC ApcRoutine, + PVOID ApcContext, + struct sockaddr_in6 *SourceAddress, + struct sockaddr_in6 *DestinationAddress, + LPVOID RequestData, + WORD RequestSize, + PIP_OPTION_INFORMATION RequestOptions, + LPVOID ReplyBuffer, + DWORD ReplySize, + DWORD Timeout + ) +{ + UNIMPLEMENTED + return 0L; +} + +/* + * @unimplemented + */ +DWORD +STDCALL +Icmp6ParseReplies( + LPVOID ReplyBuffer, + DWORD ReplySize + ) +{ + UNIMPLEMENTED + return 0L; +} + diff --git a/reactos/lib/iphlpapi/ipprivate.h b/reactos/lib/iphlpapi/ipprivate.h index d71fd6268d8..bd4955caeea 100644 --- a/reactos/lib/iphlpapi/ipprivate.h +++ b/reactos/lib/iphlpapi/ipprivate.h @@ -1,15 +1,92 @@ #ifndef IPPRIVATE_H #define IPPRIVATE_H -typedef void (*EnumInterfacesFunc)( HANDLE RegHandle, PWCHAR InterfaceName, - PVOID Data ); -typedef void (*EnumNameServersFunc)( PWCHAR InterfaceName, PWCHAR Server, - PVOID Data ); +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif -typedef struct { - int NumServers; - int CurrentName; - PIP_ADDR_STRING AddrString; -} NAME_SERVER_LIST_PRIVATE, *PNAME_SERVER_LIST_PRIVATE; +#include +#include +#include +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_ARPA_INET_H +# include +#endif +#ifdef HAVE_ARPA_NAMESER_H +# include +#endif +#ifdef HAVE_RESOLV_H +# include +#endif + +#define NTOS_MODE_USER +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "iphlpapiextra.h" +#include "ipregprivate.h" +#include "iphlpapi.h" +#include "ifenum.h" +#include "ipstats.h" +#include "iphlp_res.h" +#include "wine/debug.h" + +#undef TRACE +#define TRACE(fmt,args...) DbgPrint("(%s:%d - %s) " fmt, __FILE__, __LINE__, __FUNCTION__, ## args) + +#include "net/tdiinfo.h" +#include "tcpioctl.h" + +#ifndef ETH_ALEN +#define ETH_ALEN 6 +#endif + +#ifndef INADDR_NONE +#define INADDR_NONE (~0U) +#endif + +#ifndef IFENT_SOFTWARE_LOOPBACK +#define IFENT_SOFTWARE_LOOPBACK 24 /* This is an SNMP constant from rfc1213 */ +#endif/*IFENT_SOFTWARE_LOOPBACK*/ + +#define INDEX_IS_LOOPBACK 0x00800000 + +/* Type declarations */ + +#ifndef IFNAMSIZ +#define IFNAMSIZ 0x20 +#endif/*IFNAMSIZ*/ + +#define TCP_REQUEST_QUERY_INFORMATION_INIT { { { 0 } } } + +/* No caddr_t in reactos headers */ +typedef char *caddr_t; + +typedef union _IFEntrySafelySized { + PCHAR MaxSize[sizeof(DWORD) + + sizeof(IFEntry) + + MAX_ADAPTER_DESCRIPTION_LENGTH + 1]; + struct { + DWORD ProperlyOffsetTheStructure; + IFEntry ent; + } offset; +} IFEntrySafelySized; + +/** Prototypes **/ +NTSTATUS openTcpFile(PHANDLE tcpFile); +VOID closeTcpFile(HANDLE tcpFile); +NTSTATUS tdiGetEntityIDSet( HANDLE tcpFile, TDIEntityID **entitySet, + PDWORD numEntities ); +VOID tdiFreeThingSet( PVOID things ); #endif/*IPPRIVATE_H*/ diff --git a/reactos/lib/iphlpapi/ipregprivate.h b/reactos/lib/iphlpapi/ipregprivate.h index a7b1519d49f..a9e370c2eab 100644 --- a/reactos/lib/iphlpapi/ipregprivate.h +++ b/reactos/lib/iphlpapi/ipregprivate.h @@ -3,11 +3,11 @@ int GetLongestChildKeyName( HANDLE RegHandle ); LONG OpenChildKeyRead( HANDLE RegHandle, - PWCHAR ChildKeyName, + PCHAR ChildKeyName, PHKEY ReturnHandle ); -PWCHAR GetNthChildKeyName( HANDLE RegHandle, DWORD n ); -void ConsumeChildKeyName( PWCHAR Name ); -PWCHAR QueryRegistryValueString( HANDLE RegHandle, PWCHAR ValueName ); -void ConsumeRegValueString( PWCHAR NameServer ); +PCHAR GetNthChildKeyName( HANDLE RegHandle, DWORD n ); +void ConsumeChildKeyName( PCHAR Name ); +PCHAR QueryRegistryValueString( HANDLE RegHandle, PCHAR ValueName ); +void ConsumeRegValueString( PCHAR NameServer ); #endif/*IPREGPRIVATE_H*/ diff --git a/reactos/lib/iphlpapi/ipstats.h b/reactos/lib/iphlpapi/ipstats.h new file mode 100644 index 00000000000..92a61678835 --- /dev/null +++ b/reactos/lib/iphlpapi/ipstats.h @@ -0,0 +1,108 @@ +/* ipstats.h + * Copyright (C) 2003 Juan Lang + * + * 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 + * + * This module implements functions shared by DLLs that need to get network- + * related statistics. It's meant to hide some platform-specificisms, and + * share code that was previously duplicated. + */ +#ifndef WINE_IPSTATS_H_ +#define WINE_IPSTATS_H_ + +#include + +#include "windef.h" +#include "winbase.h" +#include "iprtrmib.h" + +/* Fills in entry's interface stats, using name to find them. + * Returns ERROR_INVALID_PARAMETER if name or entry is NULL, NO_ERROR otherwise. + */ +DWORD getInterfaceStatsByName(const char *name, PMIB_IFROW entry); + +/* Ditto above by index. */ +DWORD getInterfaceStatsByIndex(DWORD index, PMIB_IFROW entry); + +/* Gets ICMP statistics into stats. Returns ERROR_INVALID_PARAMETER if stats is + * NULL, NO_ERROR otherwise. + */ +DWORD getICMPStats(MIB_ICMP *stats); + +/* Gets IP statistics into stats. Returns ERROR_INVALID_PARAMETER if stats is + * NULL, NO_ERROR otherwise. + */ +DWORD getIPStats(PMIB_IPSTATS stats, DWORD family); + +/* Gets TCP statistics into stats. Returns ERROR_INVALID_PARAMETER if stats is + * NULL, NO_ERROR otherwise. + */ +DWORD getTCPStats(MIB_TCPSTATS *stats, DWORD family); + +/* Gets UDP statistics into stats. Returns ERROR_INVALID_PARAMETER if stats is + * NULL, NO_ERROR otherwise. + */ +DWORD getUDPStats(MIB_UDPSTATS *stats, DWORD family); + +/* Route table functions */ + +DWORD getNumRoutes(void); + +/* Minimalist route entry, only has the fields I can actually fill in. How + * these map to the different windows route data structures is up to you. + */ +typedef struct _RouteEntry { + DWORD dest; + DWORD mask; + DWORD gateway; + DWORD ifIndex; + DWORD metric; +} RouteEntry; + +typedef struct _RouteTable { + DWORD numRoutes; + RouteEntry routes[1]; +} RouteTable; + +/* Allocates and returns to you the route table, or NULL if it can't allocate + * enough memory. free() the returned table. + */ +RouteTable *getRouteTable(void); + +/* Returns the number of entries in the arp table. */ +DWORD getNumArpEntries(void); + +/* Allocates and returns to you the arp table, or NULL if it can't allocate + * enough memory. free() the returned table. + */ +PMIB_IPNETTABLE getArpTable(void); + +/* Returns the number of entries in the UDP state table. */ +DWORD getNumUdpEntries(void); + +/* Allocates and returns to you the UDP state table, or NULL if it can't + * allocate enough memory. free() the returned table. + */ +PMIB_UDPTABLE getUdpTable(void); + +/* Returns the number of entries in the TCP state table. */ +DWORD getNumTcpEntries(void); + +/* Allocates and returns to you the TCP state table, or NULL if it can't + * allocate enough memory. free() the returned table. + */ +PMIB_TCPTABLE getTcpTable(void); + +#endif /* ndef WINE_IPSTATS_H_ */ diff --git a/reactos/lib/iphlpapi/ipstats_reactos.c b/reactos/lib/iphlpapi/ipstats_reactos.c new file mode 100644 index 00000000000..34a072375a1 --- /dev/null +++ b/reactos/lib/iphlpapi/ipstats_reactos.c @@ -0,0 +1,558 @@ +/* Copyright (C) 2003 Juan Lang + * + * 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 + * + * This file implements statistics getting using the /proc filesystem exported + * by Linux, and maybe other OSes. + */ + +#include "ipprivate.h" +#include "ipstats.h" +#include "ifenum.h" + +#ifndef TCPS_ESTABLISHED +# define TCPS_ESTABLISHED TCP_ESTABLISHED +#endif +#ifndef TCPS_SYN_SENT +# define TCPS_SYN_SENT TCP_SYN_SENT +#endif +#ifndef TCPS_SYN_RECEIVED +# define TCPS_SYN_RECEIVED TCP_SYN_RECV +#endif +#ifndef TCPS_FIN_WAIT_1 +# define TCPS_FIN_WAIT_1 TCP_FIN_WAIT1 +#endif +#ifndef TCPS_FIN_WAIT_2 +# define TCPS_FIN_WAIT_2 TCP_FIN_WAIT2 +#endif +#ifndef TCPS_TIME_WAIT +# define TCPS_TIME_WAIT TCP_TIME_WAIT +#endif +#ifndef TCPS_CLOSED +# define TCPS_CLOSED TCP_CLOSE +#endif +#ifndef TCPS_CLOSE_WAIT +# define TCPS_CLOSE_WAIT TCP_CLOSE_WAIT +#endif +#ifndef TCPS_LAST_ACK +# define TCPS_LAST_ACK TCP_LAST_ACK +#endif +#ifndef TCPS_LISTEN +# define TCPS_LISTEN TCP_LISTEN +#endif +#ifndef TCPS_CLOSING +# define TCPS_CLOSING TCP_CLOSING +#endif + +BOOL isIpEntity( HANDLE tcpFile, TDIEntityID *ent ) { + DWORD entityType, returnedLen; + NTSTATUS status; + TCP_REQUEST_QUERY_INFORMATION_EX req; + + req.ID.toi_class = INFO_CLASS_GENERIC; + req.ID.toi_type = INFO_TYPE_PROVIDER; + req.ID.toi_id = ENTITY_TYPE_ID; + req.ID.toi_entity = *ent; + + status = + DeviceIoControl + ( tcpFile, + IOCTL_TCP_QUERY_INFORMATION_EX, + &req, + sizeof(req), + &entityType, + sizeof(entityType), + &returnedLen, + NULL ); + + DPRINT("Ent: %04x:d -> %04x\n", + ent->tei_entity, ent->tei_instance, entityType ); + + return NT_SUCCESS(status) && entityType == CL_NL_IP; +} + +NTSTATUS getNthIpEntity( HANDLE tcpFile, DWORD index, TDIEntityID *ent ) { + DWORD numEntities = 0; + DWORD numRoutes = 0; + TDIEntityID *entitySet = 0; + NTSTATUS status = tdiGetEntityIDSet( tcpFile, &entitySet, &numEntities ); + int i; + + if( !NT_SUCCESS(status) ) + return status; + + for( i = 0; i < numEntities; i++ ) { + if( isIpEntity( tcpFile, &entitySet[i] ) ) { + DPRINT("Entity %d is an IP Entity\n", i); + if( numRoutes == index ) break; + else numRoutes++; + } + } + + DPRINT("Index %d is entity #%d - %04x:%08x\n", index, i, + entitySet[i].tei_entity, entitySet[i].tei_instance ); + + if( numRoutes == index && i < numEntities ) { + memcpy( ent, &entitySet[i], sizeof(*ent) ); + tdiFreeThingSet( entitySet ); + return STATUS_SUCCESS; + } else { + tdiFreeThingSet( entitySet ); + return STATUS_UNSUCCESSFUL; + } +} + +NTSTATUS tdiGetMibForIpEntity +( HANDLE tcpFile, TDIEntityID *ent, IPSNMPInfo *entry ) { + TCP_REQUEST_QUERY_INFORMATION_EX req = TCP_REQUEST_QUERY_INFORMATION_INIT; + NTSTATUS status = STATUS_SUCCESS; + DWORD returnSize; + + memset( entry, 0, sizeof( *entry ) ); + + DPRINT("TdiGetMibForIpEntity(tcpFile %x,entityId %x)\n", + (DWORD)tcpFile, ent->tei_instance); + + req.ID.toi_class = INFO_CLASS_PROTOCOL; + req.ID.toi_type = INFO_TYPE_PROVIDER; + req.ID.toi_id = IP_MIB_STATS_ID; + req.ID.toi_entity = *ent; + + status = DeviceIoControl( tcpFile, + IOCTL_TCP_QUERY_INFORMATION_EX, + &req, + sizeof(req), + entry, + sizeof(*entry), + &returnSize, + NULL ); + + DPRINT("TdiGetMibForIpEntity() => {\n" + " ipsi_forwarding ............ %d\n" + " ipsi_defaultttl ............ %d\n" + " ipsi_inreceives ............ %d\n" + " ipsi_indelivers ............ %d\n" + " ipsi_outrequests ........... %d\n" + " ipsi_routingdiscards ....... %d\n" + " ipsi_outdiscards ........... %d\n" + " ipsi_outnoroutes ........... %d\n" + " ipsi_numif ................. %d\n" + " ipsi_numaddr ............... %d\n" + " ipsi_numroutes ............. %d\n" + "} status %08x\n", + entry->ipsi_forwarding, + entry->ipsi_defaultttl, + entry->ipsi_inreceives, + entry->ipsi_indelivers, + entry->ipsi_outrequests, + entry->ipsi_routingdiscards, + entry->ipsi_outdiscards, + entry->ipsi_outnoroutes, + entry->ipsi_numif, + entry->ipsi_numaddr, + entry->ipsi_numroutes, + status); + + return status; +} + +NTSTATUS tdiGetRoutesForIpEntity +( HANDLE tcpFile, TDIEntityID *ent, int numRoutes, IPRouteEntry *routes ) { + TCP_REQUEST_QUERY_INFORMATION_EX req = TCP_REQUEST_QUERY_INFORMATION_INIT; + NTSTATUS status = STATUS_SUCCESS; + DWORD returnSize; + + DPRINT("TdiGetRoutesForIpEntity(tcpFile %x,entityId %x)\n", + (DWORD)tcpFile, ent->tei_instance); + + req.ID.toi_class = INFO_CLASS_PROTOCOL; + req.ID.toi_type = INFO_TYPE_PROVIDER; + req.ID.toi_id = IP_MIB_ROUTETABLE_ENTRY_ID; + req.ID.toi_entity = *ent; + + status = DeviceIoControl( tcpFile, + IOCTL_TCP_QUERY_INFORMATION_EX, + &req, + sizeof(req), + routes, + sizeof(*routes) * numRoutes, + &returnSize, + NULL ); + + return status; +} + +DWORD getInterfaceStatsByName(const char *name, PMIB_IFROW entry) +{ + if (!name) + return ERROR_INVALID_PARAMETER; + if (!entry) + return ERROR_INVALID_PARAMETER; + + return NO_ERROR; +} + +DWORD getInterfaceStatsByIndex(DWORD index, PMIB_IFROW entry) +{ + return ERROR_INVALID_PARAMETER; +} + +DWORD getICMPStats(MIB_ICMP *stats) +{ + FILE *fp; + + if (!stats) + return ERROR_INVALID_PARAMETER; + + memset(stats, 0, sizeof(MIB_ICMP)); + /* get most of these stats from /proc/net/snmp, no error if can't */ + fp = fopen("/proc/net/snmp", "r"); + if (fp) { + const char hdr[] = "Icmp:"; + char buf[512] = { 0 }, *ptr; + + do { + ptr = fgets(buf, sizeof(buf), fp); + } while (ptr && strncasecmp(buf, hdr, sizeof(hdr) - 1)); + if (ptr) { + /* last line was a header, get another */ + ptr = fgets(buf, sizeof(buf), fp); + if (ptr && strncasecmp(buf, hdr, sizeof(hdr) - 1) == 0) { + char *endPtr; + + ptr += sizeof(hdr); + if (ptr && *ptr) { + stats->stats.icmpInStats.dwMsgs = strtoul(ptr, &endPtr, 10); + ptr = endPtr; + } + if (ptr && *ptr) { + stats->stats.icmpInStats.dwErrors = strtoul(ptr, &endPtr, 10); + ptr = endPtr; + } + if (ptr && *ptr) { + stats->stats.icmpInStats.dwDestUnreachs = strtoul(ptr, &endPtr, 10); + ptr = endPtr; + } + if (ptr && *ptr) { + stats->stats.icmpInStats.dwTimeExcds = strtoul(ptr, &endPtr, 10); + ptr = endPtr; + } + if (ptr && *ptr) { + stats->stats.icmpInStats.dwParmProbs = strtoul(ptr, &endPtr, 10); + ptr = endPtr; + } + if (ptr && *ptr) { + stats->stats.icmpInStats.dwSrcQuenchs = strtoul(ptr, &endPtr, 10); + ptr = endPtr; + } + if (ptr && *ptr) { + stats->stats.icmpInStats.dwRedirects = strtoul(ptr, &endPtr, 10); + ptr = endPtr; + } + if (ptr && *ptr) { + stats->stats.icmpInStats.dwEchoReps = strtoul(ptr, &endPtr, 10); + ptr = endPtr; + } + if (ptr && *ptr) { + stats->stats.icmpInStats.dwTimestamps = strtoul(ptr, &endPtr, 10); + ptr = endPtr; + } + if (ptr && *ptr) { + stats->stats.icmpInStats.dwTimestampReps = strtoul(ptr, &endPtr, 10); + ptr = endPtr; + } + if (ptr && *ptr) { + stats->stats.icmpInStats.dwAddrMasks = strtoul(ptr, &endPtr, 10); + ptr = endPtr; + } + if (ptr && *ptr) { + stats->stats.icmpInStats.dwAddrMaskReps = strtoul(ptr, &endPtr, 10); + ptr = endPtr; + } + if (ptr && *ptr) { + stats->stats.icmpOutStats.dwMsgs = strtoul(ptr, &endPtr, 10); + ptr = endPtr; + } + if (ptr && *ptr) { + stats->stats.icmpOutStats.dwErrors = strtoul(ptr, &endPtr, 10); + ptr = endPtr; + } + if (ptr && *ptr) { + stats->stats.icmpOutStats.dwDestUnreachs = strtoul(ptr, &endPtr, 10); + ptr = endPtr; + } + if (ptr && *ptr) { + stats->stats.icmpOutStats.dwTimeExcds = strtoul(ptr, &endPtr, 10); + ptr = endPtr; + } + if (ptr && *ptr) { + stats->stats.icmpOutStats.dwParmProbs = strtoul(ptr, &endPtr, 10); + ptr = endPtr; + } + if (ptr && *ptr) { + stats->stats.icmpOutStats.dwSrcQuenchs = strtoul(ptr, &endPtr, 10); + ptr = endPtr; + } + if (ptr && *ptr) { + stats->stats.icmpOutStats.dwRedirects = strtoul(ptr, &endPtr, 10); + ptr = endPtr; + } + if (ptr && *ptr) { + stats->stats.icmpOutStats.dwEchoReps = strtoul(ptr, &endPtr, 10); + ptr = endPtr; + } + if (ptr && *ptr) { + stats->stats.icmpOutStats.dwTimestamps = strtoul(ptr, &endPtr, 10); + ptr = endPtr; + } + if (ptr && *ptr) { + stats->stats.icmpOutStats.dwTimestampReps = strtoul(ptr, &endPtr, 10); + ptr = endPtr; + } + if (ptr && *ptr) { + stats->stats.icmpOutStats.dwAddrMasks = strtoul(ptr, &endPtr, 10); + ptr = endPtr; + } + if (ptr && *ptr) { + stats->stats.icmpOutStats.dwAddrMaskReps = strtoul(ptr, &endPtr, 10); + ptr = endPtr; + } + } + } + fclose(fp); + } + return NO_ERROR; +} + +DWORD getIPStats(PMIB_IPSTATS stats, DWORD family) +{ + if (!stats) + return ERROR_INVALID_PARAMETER; + return NO_ERROR; +} + +DWORD getTCPStats(MIB_TCPSTATS *stats, DWORD family) +{ + if (!stats) + return ERROR_INVALID_PARAMETER; + return NO_ERROR; +} + +DWORD getUDPStats(MIB_UDPSTATS *stats, DWORD family) +{ + if (!stats) + return ERROR_INVALID_PARAMETER; + return NO_ERROR; +} + +static DWORD getNumWithOneHeader(const char *filename) +{ + return 0; +} + +DWORD getNumRoutes(void) +{ + DWORD numEntities, numRoutes = 0; + TDIEntityID *entitySet; + HANDLE tcpFile; + int i; + NTSTATUS status; + + TRACE("called.\n"); + + status = openTcpFile( &tcpFile ); + + if( !NT_SUCCESS(status) ) { + TRACE("failure: %08x\n", (int)status ); + return 0; + } + + status = tdiGetEntityIDSet( tcpFile, &entitySet, &numEntities ); + + if( !NT_SUCCESS(status) ) { + TRACE("failure: %08x\n", (int)status ); + return 0; + } + + for( i = 0; i < numEntities; i++ ) { + if( isIpEntity( tcpFile, &entitySet[i] ) ) { + IPSNMPInfo isnmp; + memset( &isnmp, 0, sizeof( isnmp ) ); + status = tdiGetMibForIpEntity( tcpFile, &entitySet[i], &isnmp ); + if( !NT_SUCCESS(status) ) { + tdiFreeThingSet( entitySet ); + return status; + } + numRoutes += isnmp.ipsi_numroutes; + } + } + + TRACE("numRoutes: %d\n", (int)numRoutes); + + closeTcpFile( tcpFile ); + + return numRoutes; +} + +VOID HexDump( PCHAR Data, DWORD Len ) { + int i; + + for( i = 0; i < Len; i++ ) { + if( !(i & 0xf) ) { + if( i ) fprintf(stderr,"\n"); + fprintf(stderr,"%08x:", i); + } + fprintf( stderr, " %02x", Data[i] & 0xff ); + } + fprintf(stderr,"\n"); +} + +RouteTable *getRouteTable(void) +{ + RouteTable *out_route_table; + DWORD numRoutes = getNumRoutes(), routesAdded = 0; + IPSNMPInfo snmpInfo; + TDIEntityID ent; + HANDLE tcpFile; + NTSTATUS status = openTcpFile( &tcpFile ); + int i; + + if( !NT_SUCCESS(status) ) + return 0; + + out_route_table = HeapAlloc( GetProcessHeap(), 0, + sizeof(RouteTable) + + (sizeof(RouteEntry) * (numRoutes - 1)) ); + + out_route_table->numRoutes = numRoutes; + + for( i = 0; routesAdded < numRoutes; i++ ) { + int j; + IPRouteEntry *route_set; + + getNthIpEntity( tcpFile, i, &ent ); + tdiGetMibForIpEntity( tcpFile, &ent, &snmpInfo ); + route_set = HeapAlloc( GetProcessHeap(), 0, + sizeof( IPRouteEntry ) * + snmpInfo.ipsi_numroutes ); + + DPRINT( "%d routes in instance %d\n", snmpInfo.ipsi_numroutes, i ); + + if( !route_set ) { + closeTcpFile( tcpFile ); + HeapFree( GetProcessHeap(), 0, out_route_table ); + return 0; + } + + tdiGetRoutesForIpEntity( tcpFile, &ent, numRoutes, route_set ); + + DPRINT("Route set returned\n"); +#if 0 + HexDump( route_set, + sizeof( IPRouteEntry ) * + snmpInfo.ipsi_numroutes ); +#endif + + for( j = 0; j < snmpInfo.ipsi_numroutes; j++ ) { + int routeNum = j + routesAdded; + out_route_table->routes[routeNum].dest = + route_set[j].ire_dest; + out_route_table->routes[routeNum].mask = + route_set[j].ire_mask; + out_route_table->routes[routeNum].gateway = + route_set[j].ire_gw; + out_route_table->routes[routeNum].ifIndex = + route_set[j].ire_index; + out_route_table->routes[routeNum].metric = + route_set[j].ire_metric; + } + + routesAdded += snmpInfo.ipsi_numroutes; + } + + return out_route_table; +} + +DWORD getNumArpEntries(void) +{ + return getNumWithOneHeader("/proc/net/arp"); +} + +PMIB_IPNETTABLE getArpTable(void) +{ + return 0; +} + +DWORD getNumUdpEntries(void) +{ + return getNumWithOneHeader("/proc/net/udp"); +} + +PMIB_UDPTABLE getUdpTable(void) +{ + DWORD numEntries = getNumUdpEntries(); + PMIB_UDPTABLE ret; + + ret = (PMIB_UDPTABLE)calloc(1, sizeof(MIB_UDPTABLE) + + (numEntries - 1) * sizeof(MIB_UDPROW)); + if (ret) { + FILE *fp; + + /* get from /proc/net/udp, no error if can't */ + fp = fopen("/proc/net/udp", "r"); + if (fp) { + char buf[512] = { 0 }, *ptr; + + /* skip header line */ + ptr = fgets(buf, sizeof(buf), fp); + while (ptr && ret->dwNumEntries < numEntries) { + ptr = fgets(buf, sizeof(buf), fp); + if (ptr) { + char *endPtr; + + if (ptr && *ptr) { + strtoul(ptr, &endPtr, 16); /* skip */ + ptr = endPtr; + } + if (ptr && *ptr) { + ptr++; + ret->table[ret->dwNumEntries].dwLocalAddr = strtoul(ptr, &endPtr, + 16); + ptr = endPtr; + } + if (ptr && *ptr) { + ptr++; + ret->table[ret->dwNumEntries].dwLocalPort = strtoul(ptr, &endPtr, + 16); + ptr = endPtr; + } + ret->dwNumEntries++; + } + } + fclose(fp); + } + } + return ret; +} + +DWORD getNumTcpEntries(void) +{ + return getNumWithOneHeader("/proc/net/tcp"); +} + +PMIB_TCPTABLE getTcpTable(void) +{ + return 0; +} diff --git a/reactos/lib/iphlpapi/makefile b/reactos/lib/iphlpapi/makefile index fc8bb93cba7..8871cad628e 100644 --- a/reactos/lib/iphlpapi/makefile +++ b/reactos/lib/iphlpapi/makefile @@ -8,11 +8,13 @@ TARGET_NAME = iphlpapi TARGET_BASE = 0x777c0000 -TARGET_CFLAGS = -DUNICODE -D_UNICODE -D__USE_W32API -Wall -Werror +TARGET_CFLAGS += -DYDEBUG -DUNICODE -D_UNICODE -D__USE_W32API -D__REACTOS__ -D_WIN32_WINNT=0x0500 -Wall +#-Werror -TARGET_SDKLIBS = ntdll.a kernel32.a +TARGET_SDKLIBS = ntdll.a kernel32.a ws2_32.a -TARGET_OBJECTS = $(TARGET_NAME).o registry.o +TARGET_OBJECTS = iphlpapi_main.o icmp.o iphlpv6.o media.o registry.o \ + ifenum_reactos.o ipstats_reactos.o resinfo_reactos.o DEP_OBJECTS = $(TARGET_OBJECTS) diff --git a/reactos/lib/iphlpapi/media.c b/reactos/lib/iphlpapi/media.c new file mode 100644 index 00000000000..bd6a7c74966 --- /dev/null +++ b/reactos/lib/iphlpapi/media.c @@ -0,0 +1,59 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_ARPA_INET_H +# include +#endif +#ifdef HAVE_ARPA_NAMESER_H +# include +#endif +#ifdef HAVE_RESOLV_H +# include +#endif + +#ifdef __REACTOS__ +# include +# include +# include +# include +# include +# include +# include +# include "iphlpapiextra.h" +#else +# include "windef.h" +# include "winbase.h" +# include "winreg.h" +#endif + +#include "iphlpapi.h" +#include "ifenum.h" +#include "ipstats.h" +#include "iphlp_res.h" +#include "wine/debug.h" + +/* + * @unimplemented + */ +DWORD STDCALL DisableMediaSense(HANDLE *pHandle,OVERLAPPED *pOverLapped) +{ + UNIMPLEMENTED + return 0L; +} + +/* + * @unimplemented + */ +DWORD STDCALL RestoreMediaSense(OVERLAPPED* pOverlapped,LPDWORD lpdwEnableCount) +{ + UNIMPLEMENTED + return 0L; +} + diff --git a/reactos/lib/iphlpapi/merge-notes.txt b/reactos/lib/iphlpapi/merge-notes.txt new file mode 100644 index 00000000000..71f318919b1 --- /dev/null +++ b/reactos/lib/iphlpapi/merge-notes.txt @@ -0,0 +1,36 @@ +GetAdaptersInfo -- +Wine uses: Software\\Wine\\Wine\\Config\\Network + -- Wins support is todo so this part isn't so important. + -- Overall, workable +Wine uses ansi functions +GetNetworkParams -- + -- Make workable interface for _res + -- Wine based on real _res + -- Reactos based on my enumerator funcs + +ROUTE PRINT: + +iphlpapi_main.c:137 - ppIfTable 0104bd80, bOrder 1, heap 0xa0000000, flags 0x00000001 + - AllocateAndGetIfTableFromStack +iphlpapi_main.c:898 - pIfTable 0104bd00, pdwSize 0104bd00, bOrder 1 + - GetIfTable +(tcpip/main.c:168)(TiCreateFileObject) No EA information in IRP. + - We need a special case of no EA information to handle these ioctls in + tcpip.sys +iphlpapi_main.c:939 - returning 122 +iphlpapi_main.c:898 - pIfTable 0104bd00, pdwSize 0104bd00, bOrder 1 + - GetIfTable again +(tcpip/main.c:168)(TiCreateFileObject) No EA information in IRP. +(tcpip/main.c:168)(TiCreateFileObject) No EA information in IRP. +getInterfaceIndexTable: numInterfaces: 0 +iphlpapi_main.c:939 - returning 0 +iphlpapi_main.c:149 - returning 0 +iphlpapi_main.c:213 - ppIpForwardTable 0104bd78, bOrder 1, heap 0xa0000000, flags 0x00000001 + - AllocateAndGetIpForwardTableFromStack +iphlpapi_main.c:1151 - pIpForwardTable 00000000, pdwSize 0104bd00, bOrder 1 + - GetIpForwardTable +iphlpapi_main.c:1214 - returning 122 +iphlpapi_main.c:1151 - pIpForwardTable a0001d68, pdwSize 0104bd00, bOrder 1 + - GetIpForwardTable again +iphlpapi_main.c:1214 - returning 122 +iphlpapi_main.c:225 - returning 122 diff --git a/reactos/lib/iphlpapi/registry.c b/reactos/lib/iphlpapi/registry.c index 15eeb8c7425..99ae679931d 100644 --- a/reactos/lib/iphlpapi/registry.c +++ b/reactos/lib/iphlpapi/registry.c @@ -10,7 +10,7 @@ int GetLongestChildKeyName( HANDLE RegHandle ) { LONG Status; DWORD MaxAdapterName; - Status = RegQueryInfoKeyW(RegHandle, + Status = RegQueryInfoKeyA(RegHandle, NULL, NULL, NULL, @@ -29,9 +29,9 @@ int GetLongestChildKeyName( HANDLE RegHandle ) { } LONG OpenChildKeyRead( HANDLE RegHandle, - PWCHAR ChildKeyName, + PCHAR ChildKeyName, PHKEY ReturnHandle ) { - return RegOpenKeyExW( RegHandle, + return RegOpenKeyExA( RegHandle, ChildKeyName, 0, KEY_READ, @@ -42,10 +42,10 @@ LONG OpenChildKeyRead( HANDLE RegHandle, * Yields a malloced value that must be freed. */ -PWCHAR GetNthChildKeyName( HANDLE RegHandle, DWORD n ) { +PCHAR GetNthChildKeyName( HANDLE RegHandle, DWORD n ) { LONG Status; int MaxAdapterName = GetLongestChildKeyName( RegHandle ); - PWCHAR Value; + PCHAR Value; DWORD ValueLen; if (MaxAdapterName == -1) { @@ -54,8 +54,8 @@ PWCHAR GetNthChildKeyName( HANDLE RegHandle, DWORD n ) { } ValueLen = MaxAdapterName; - Value = (PWCHAR)malloc( MaxAdapterName * sizeof(WCHAR) ); - Status = RegEnumKeyExW( RegHandle, n, Value, &ValueLen, + Value = (PCHAR)HeapAlloc( GetProcessHeap(), 0, MaxAdapterName ); + Status = RegEnumKeyExA( RegHandle, n, Value, &ValueLen, NULL, NULL, NULL, NULL ); if (Status != ERROR_SUCCESS) return 0; @@ -65,27 +65,27 @@ PWCHAR GetNthChildKeyName( HANDLE RegHandle, DWORD n ) { } } -void ConsumeChildKeyName( PWCHAR Name ) { - if (Name) free( Name ); +void ConsumeChildKeyName( PCHAR Name ) { + if (Name) HeapFree( GetProcessHeap(), 0, Name ); } -PWCHAR QueryRegistryValueString( HANDLE RegHandle, PWCHAR ValueName ) { - PWCHAR Name; +PCHAR QueryRegistryValueString( HANDLE RegHandle, PCHAR ValueName ) { + PCHAR Name; DWORD ReturnedSize = 0; - if (RegQueryValueExW( RegHandle, ValueName, NULL, NULL, NULL, + if (RegQueryValueExA( RegHandle, ValueName, NULL, NULL, NULL, &ReturnedSize ) != 0) return 0; else { Name = malloc( (ReturnedSize + 1) * sizeof(WCHAR) ); - RegQueryValueExW( RegHandle, ValueName, NULL, NULL, (PVOID)Name, + RegQueryValueExA( RegHandle, ValueName, NULL, NULL, (PVOID)Name, &ReturnedSize ); Name[ReturnedSize] = 0; return Name; } } -void ConsumeRegValueString( PWCHAR Value ) { +void ConsumeRegValueString( PCHAR Value ) { if (Value) free(Value); } @@ -93,8 +93,8 @@ PWCHAR *QueryRegistryValueStringMulti( HANDLE RegHandle, PWCHAR ValueName ) { return 0; /* FIXME if needed */ } -void ConsumeRegValueStringMulti( PWCHAR *Value ) { - PWCHAR *Orig = Value; +void ConsumeRegValueStringMulti( PCHAR *Value ) { + PCHAR *Orig = Value; if (Value) { while (*Value) { free(*Value); diff --git a/reactos/lib/iphlpapi/resinfo_reactos.c b/reactos/lib/iphlpapi/resinfo_reactos.c new file mode 100644 index 00000000000..ec85a600b60 --- /dev/null +++ b/reactos/lib/iphlpapi/resinfo_reactos.c @@ -0,0 +1,52 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_ARPA_INET_H +# include +#endif +#ifdef HAVE_ARPA_NAMESER_H +# include +#endif +#ifdef HAVE_RESOLV_H +# include +#endif + +#include "windef.h" +#include "winbase.h" +#include "winreg.h" + +#ifdef __REACTOS__ +# include /* ULONGLONG */ +# include /* Enables NSPAPI */ +# include /* SOCKET_ADDRESS */ +# include /* IP_ADAPTER_ADDRESSES */ +#endif + +#include "iphlpapi.h" +#include "ifenum.h" +#include "ipstats.h" +#include "iphlp_res.h" +#include "wine/debug.h" + +PIPHLP_RES_INFO getResInfo() { + PIPHLP_RES_INFO InfoPtr = + (PIPHLP_RES_INFO)HeapAlloc( GetProcessHeap(), 0, + sizeof(PIPHLP_RES_INFO) ); + if( InfoPtr ) { + InfoPtr->riCount = 0; + InfoPtr->riAddressList = (LPSOCKADDR)0; + } + + return InfoPtr; +} + +VOID disposeResInfo( PIPHLP_RES_INFO InfoPtr ) { + HeapFree( GetProcessHeap(), 0, InfoPtr ); +} From 6fc29ccca7143e50ecff2305f04fe9ed2d0b57a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sun, 15 Feb 2004 07:39:12 +0000 Subject: [PATCH 0038/1463] Implement menu handling svn path=/trunk/; revision=8195 --- reactos/include/win32k/kapi.h | 1 + reactos/include/win32k/menu.h | 249 +++ reactos/include/win32k/ntuser.h | 212 +-- reactos/lib/user32/windows/menu.c | 2335 ++++++++++++++++++++++++- reactos/subsys/win32k/include/menu.h | 23 +- reactos/subsys/win32k/ntuser/menu.c | 513 ++++-- reactos/subsys/win32k/ntuser/misc.c | 8 +- reactos/subsys/win32k/ntuser/window.c | 147 +- 8 files changed, 2977 insertions(+), 511 deletions(-) create mode 100644 reactos/include/win32k/menu.h diff --git a/reactos/include/win32k/kapi.h b/reactos/include/win32k/kapi.h index 3b99209ba02..5806a614806 100644 --- a/reactos/include/win32k/kapi.h +++ b/reactos/include/win32k/kapi.h @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include diff --git a/reactos/include/win32k/menu.h b/reactos/include/win32k/menu.h new file mode 100644 index 00000000000..94064a1fc1f --- /dev/null +++ b/reactos/include/win32k/menu.h @@ -0,0 +1,249 @@ +/* $Id: menu.h,v 1.1 2004/02/15 07:39:12 gvg Exp $ */ + +#ifndef WIN32K_MENU_H_INCLUDED +#define WIN32K_MENU_H_INCLUDED + +typedef struct tagROSMENUINFO { + /* ----------- MENUINFO ----------- */ + DWORD cbSize; + DWORD fMask; + DWORD dwStyle; + UINT cyMax; + HBRUSH hbrBack; + DWORD dwContextHelpID; + ULONG_PTR dwMenuData; + /* ----------- Extra ----------- */ + HMENU Self; /* Handle of this menu */ + WORD Flags; /* Menu flags (MF_POPUP, MF_SYSMENU) */ + UINT FocusedItem; /* Currently focused item */ + UINT MenuItemCount; /* Number of items in the menu */ + HWND Wnd; /* Window containing the menu */ + WORD Width; /* Width of the whole menu */ + WORD Height; /* Height of the whole menu */ + HWND WndOwner; /* window receiving the messages for ownerdraw */ + BOOL TimeToHide; /* Request hiding when receiving a second click in the top-level menu item */ +} ROSMENUINFO, *PROSMENUINFO; + +/* (other FocusedItem values give the position of the focused item) */ +#define NO_SELECTED_ITEM 0xffff + +typedef struct tagROSMENUITEMINFO +{ + /* ----------- MENUITEMINFOW ----------- */ + UINT cbSize; + UINT fMask; + UINT fType; + UINT fState; + UINT wID; + HMENU hSubMenu; + HBITMAP hbmpChecked; + HBITMAP hbmpUnchecked; + DWORD dwItemData; + LPWSTR dwTypeData; + UINT cch; + HBITMAP hbmpItem; + /* ----------- Extra ----------- */ + RECT Rect; /* Item area (relative to menu window) */ + UINT XTab; /* X position of text after Tab */ +} ROSMENUITEMINFO, *PROSMENUITEMINFO; + +typedef struct _SETMENUITEMRECT +{ + UINT uItem; + BOOL fByPosition; + RECT rcRect; +} SETMENUITEMRECT, *PSETMENUITEMRECT; + +DWORD +STDCALL +NtUserBuildMenuItemList( + HMENU hMenu, + PVOID Buffer, + ULONG nBufSize, + DWORD Reserved); + +DWORD +STDCALL +NtUserCheckMenuItem( + HMENU hmenu, + UINT uIDCheckItem, + UINT uCheck); + +HMENU +STDCALL +NtUserCreateMenu(BOOL PopupMenu); + +BOOL +STDCALL +NtUserDeleteMenu( + HMENU hMenu, + UINT uPosition, + UINT uFlags); + +BOOL +STDCALL +NtUserDestroyMenu( + HMENU hMenu); + +DWORD +STDCALL +NtUserDrawMenuBarTemp( + HWND hWnd, + HDC hDC, + PRECT hRect, + HMENU hMenu, + HFONT hFont); + +UINT +STDCALL +NtUserEnableMenuItem( + HMENU hMenu, + UINT uIDEnableItem, + UINT uEnable); + +DWORD +STDCALL +NtUserInsertMenuItem( + HMENU hMenu, + UINT uItem, + BOOL fByPosition, + LPCMENUITEMINFOW lpmii); + +BOOL +STDCALL +NtUserEndMenu(VOID); + +UINT STDCALL +NtUserGetMenuDefaultItem( + HMENU hMenu, + UINT fByPos, + UINT gmdiFlags); + +BOOL +STDCALL +NtUserGetMenuBarInfo( + HWND hwnd, + LONG idObject, + LONG idItem, + PMENUBARINFO pmbi); + +UINT +STDCALL +NtUserGetMenuIndex( + HMENU hMenu, + UINT wID); + +BOOL +STDCALL +NtUserGetMenuItemRect( + HWND hWnd, + HMENU hMenu, + UINT uItem, + LPRECT lprcItem); + +HMENU +STDCALL +NtUserGetSystemMenu( + HWND hWnd, + BOOL bRevert); + +BOOL +STDCALL +NtUserHiliteMenuItem( + HWND hwnd, + HMENU hmenu, + UINT uItemHilite, + UINT uHilite); + +BOOL +STDCALL +NtUserMenuInfo( + HMENU hmenu, + PROSMENUINFO lpmi, + BOOL fsog +); + +int +STDCALL +NtUserMenuItemFromPoint( + HWND hWnd, + HMENU hMenu, + DWORD X, + DWORD Y); + +BOOL +STDCALL +NtUserMenuItemInfo( + HMENU hMenu, + UINT uItem, + BOOL fByPosition, + PROSMENUITEMINFO lpmii, + BOOL fsog +); + +BOOL +STDCALL +NtUserRemoveMenu( + HMENU hMenu, + UINT uPosition, + UINT uFlags); + +BOOL +STDCALL +NtUserSetMenu( + HWND hWnd, + HMENU hMenu, + BOOL bRepaint); + +BOOL +STDCALL +NtUserSetMenuContextHelpId( + HMENU hmenu, + DWORD dwContextHelpId); + +BOOL +STDCALL +NtUserSetMenuDefaultItem( + HMENU hMenu, + UINT uItem, + UINT fByPos); + +BOOL +STDCALL +NtUserSetMenuFlagRtoL( + HMENU hMenu); + +BOOL +STDCALL +NtUserSetSystemMenu( + HWND hWnd, + HMENU hMenu); + +DWORD +STDCALL +NtUserThunkedMenuInfo( + HMENU hMenu, + LPCMENUINFO lpcmi); + +DWORD +STDCALL +NtUserThunkedMenuItemInfo( + HMENU hMenu, + UINT uItem, + BOOL fByPosition, + BOOL bInsert, + LPMENUITEMINFOW lpmii, + PUNICODE_STRING lpszCaption); + +BOOL +STDCALL +NtUserTrackPopupMenuEx( + HMENU hmenu, + UINT fuFlags, + int x, + int y, + HWND hwnd, + LPTPMPARAMS lptpm); + +#endif /* WIN32K_MENU_H_INCLUDED */ + diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index 82dd775072b..bbf97b8981e 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -84,14 +84,6 @@ NtUserBuildHwndList( HWND* pWnd, ULONG nBufSize); -DWORD -STDCALL -NtUserBuildMenuItemList( - HMENU hMenu, - PVOID Buffer, - ULONG nBufSize, - DWORD Reserved); - NTSTATUS STDCALL NtUserBuildNameList( HWINSTA hWinSta, @@ -225,13 +217,6 @@ NtUserChangeDisplaySettings( DWORD dwflags, LPVOID lParam); -DWORD -STDCALL -NtUserCheckMenuItem( - HMENU hmenu, - UINT uIDCheckItem, - UINT uCheck); - HWND STDCALL NtUserChildWindowFromPointEx(HWND Parent, LONG x, @@ -311,10 +296,6 @@ NtUserCreateLocalMemHandle( DWORD Unknown2, DWORD Unknown3); -HMENU -STDCALL -NtUserCreateMenu(BOOL PopupMenu); - HWND STDCALL NtUserCreateWindowEx( @@ -378,13 +359,6 @@ NtUserDeferWindowPos(HDWP WinPosInfo, BOOL STDCALL NtUserDefSetText(HWND WindowHandle, PANSI_STRING Text); -BOOL -STDCALL -NtUserDeleteMenu( - HMENU hMenu, - UINT uPosition, - UINT uFlags); - BOOLEAN STDCALL NtUserDestroyAcceleratorTable( @@ -396,11 +370,6 @@ NtUserDestroyCursorIcon( HANDLE Handle, DWORD Unknown); -BOOL -STDCALL -NtUserDestroyMenu( - HMENU hMenu); - BOOLEAN STDCALL NtUserDestroyWindow(HWND Wnd); @@ -467,35 +436,10 @@ NtUserDrawIconEx( DWORD Unknown0, DWORD Unknown1); -DWORD -STDCALL -NtUserDrawMenuBarTemp( - HWND hWnd, - HDC hDC, - PRECT hRect, - HMENU hMenu, - HFONT hFont); - DWORD STDCALL NtUserEmptyClipboard(VOID); -UINT -STDCALL -NtUserEnableMenuItem( - HMENU hMenu, - UINT uIDEnableItem, - UINT uEnable); - -DWORD -STDCALL -NtUserInsertMenuItem( - HMENU hMenu, - UINT uItem, - BOOL fByPosition, - LPCMENUITEMINFOW lpmii); - - BOOL STDCALL NtUserEnableScrollBar( @@ -509,10 +453,6 @@ NtUserEndDeferWindowPosEx( DWORD Unknown0, DWORD Unknown1); -BOOL -STDCALL -NtUserEndMenu(VOID); - BOOL STDCALL NtUserEndPaint(HWND hWnd, CONST PAINTSTRUCT* lPs); @@ -693,16 +633,17 @@ STDCALL NtUserGetCursorInfo( PCURSORINFO pci); -UINT STDCALL -NtUserGetMenuDefaultItem( - HMENU hMenu, - UINT fByPos, - UINT gmdiFlags); +HDC +STDCALL +NtUserGetDC( + HWND hWnd); -HDC STDCALL -NtUserGetDC(HWND hWnd); - -HDC STDCALL NtUserGetDCEx(HWND hWnd, HANDLE hRegion, ULONG Flags); +HDC +STDCALL +NtUserGetDCEx( + HWND hWnd, + HANDLE hRegion, + ULONG Flags); UINT STDCALL @@ -782,28 +723,6 @@ STDCALL NtUserGetListBoxInfo( DWORD Unknown0); -BOOL -STDCALL -NtUserGetMenuBarInfo( - HWND hwnd, - LONG idObject, - LONG idItem, - PMENUBARINFO pmbi); - -UINT -STDCALL -NtUserGetMenuIndex( - HMENU hMenu, - UINT wID); - -BOOL -STDCALL -NtUserGetMenuItemRect( - HWND hWnd, - HMENU hMenu, - UINT uItem, - LPRECT lprcItem); - BOOL STDCALL NtUserGetMessage( @@ -858,12 +777,6 @@ NtUserGetScrollInfo( int fnBar, LPSCROLLINFO lpsi); -HMENU -STDCALL -NtUserGetSystemMenu( - HWND hWnd, - BOOL bRevert); - HDESK STDCALL NtUserGetThreadDesktop( @@ -913,14 +826,6 @@ STDCALL NtUserHideCaret( HWND hWnd); -BOOL -STDCALL -NtUserHiliteMenuItem( - HWND hwnd, - HMENU hmenu, - UINT uItemHilite, - UINT uHilite); - DWORD STDCALL NtUserImpersonateDdeClientWindow( @@ -1024,32 +929,6 @@ NtUserMapVirtualKeyEx( UINT keyCode, DWORD keyboardId, HKL dwhkl ); -BOOL -STDCALL -NtUserMenuInfo( - HMENU hmenu, - LPMENUINFO lpmi, - BOOL fsog -); - -int -STDCALL -NtUserMenuItemFromPoint( - HWND hWnd, - HMENU hMenu, - DWORD X, - DWORD Y); - -BOOL -STDCALL -NtUserMenuItemInfo( - HMENU hMenu, - UINT uItem, - BOOL fByPosition, - LPMENUITEMINFOW lpmii, - BOOL fsog -); - DWORD STDCALL NtUserMessageCall( @@ -1226,13 +1105,6 @@ NtUserRegisterTasklist( UINT STDCALL NtUserRegisterWindowMessage(PUNICODE_STRING MessageName); -BOOL -STDCALL -NtUserRemoveMenu( - HMENU hMenu, - UINT uPosition, - UINT uFlags); - HANDLE STDCALL NtUserRemoveProp(HWND hWnd, ATOM Atom); @@ -1419,31 +1291,6 @@ STDCALL NtUserSetLogonNotifyWindow( DWORD Unknown0); -BOOL -STDCALL -NtUserSetMenu( - HWND hWnd, - HMENU hMenu, - BOOL bRepaint); - -BOOL -STDCALL -NtUserSetMenuContextHelpId( - HMENU hmenu, - DWORD dwContextHelpId); - -BOOL -STDCALL -NtUserSetMenuDefaultItem( - HMENU hMenu, - UINT uItem, - UINT fByPos); - -BOOL -STDCALL -NtUserSetMenuFlagRtoL( - HMENU hMenu); - BOOL STDCALL NtUserSetObjectInformation( @@ -1504,12 +1351,6 @@ NtUserSetSystemCursor( HCURSOR hcur, DWORD id); -BOOL -STDCALL -NtUserSetSystemMenu( - HWND hWnd, - HMENU hMenu); - BOOL STDCALL NtUserSetThreadDesktop( @@ -1653,22 +1494,6 @@ NtUserSystemParametersInfo( PVOID pvParam, UINT fWinIni); -DWORD -STDCALL -NtUserThunkedMenuInfo( - HMENU hMenu, - LPCMENUINFO lpcmi); - -DWORD -STDCALL -NtUserThunkedMenuItemInfo( - HMENU hMenu, - UINT uItem, - BOOL fByPosition, - BOOL bInsert, - LPMENUITEMINFOW lpmii, - PUNICODE_STRING lpszCaption); - int STDCALL NtUserToUnicodeEx( @@ -1685,16 +1510,6 @@ STDCALL NtUserTrackMouseEvent( DWORD Unknown0); -BOOL -STDCALL -NtUserTrackPopupMenuEx( - HMENU hmenu, - UINT fuFlags, - int x, - int y, - HWND hwnd, - LPTPMPARAMS lptpm); - int STDCALL NtUserTranslateAccelerator( @@ -1876,13 +1691,6 @@ NtUserSetScrollBarInfo( LONG idObject, SETSCROLLBARINFO *info); -typedef struct _SETMENUITEMRECT -{ - UINT uItem; - BOOL fByPosition; - RECT rcRect; -} SETMENUITEMRECT, *PSETMENUITEMRECT; - #endif /* __WIN32K_NTUSER_H */ /* EOF */ diff --git a/reactos/lib/user32/windows/menu.c b/reactos/lib/user32/windows/menu.c index e3152273e98..7b5eecfc316 100644 --- a/reactos/lib/user32/windows/menu.c +++ b/reactos/lib/user32/windows/menu.c @@ -2,6 +2,11 @@ * ReactOS kernel * Copyright (C) 1998, 1999, 2000, 2001 ReactOS Team * + * Partly based on Wine code + * Copyright 1993 Martin Ayotte + * Copyright 1994 Alexandre Julliard + * Copyright 1997 Morten Welinder + * * 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 @@ -16,7 +21,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: menu.c,v 1.47 2004/02/01 20:50:10 weiden Exp $ +/* $Id: menu.c,v 1.48 2004/02/15 07:39:12 gvg Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/menu.c @@ -30,7 +35,6 @@ #include #include -#include #include #include #include @@ -40,17 +44,40 @@ #include "user32/regcontrol.h" #include "../controls/controls.h" +#define NDEBUG +#include + +/* internal popup menu window messages */ +#define MM_SETMENUHANDLE (WM_USER + 0) +#define MM_GETMENUHANDLE (WM_USER + 1) + +/* Internal MenuTrackMenu() flags */ +#define TPM_INTERNAL 0xF0000000 +#define TPM_ENTERIDLEEX 0x80000000 /* set owner window for WM_ENTERIDLE */ +#define TPM_BUTTONDOWN 0x40000000 /* menu was clicked before tracking */ +#define TPM_POPUPMENU 0x20000000 /* menu is a popup menu */ + /* TYPES *********************************************************************/ -#define MENU_TYPE_MASK ((MF_STRING | MF_BITMAP | MF_OWNERDRAW | MF_SEPARATOR)) +#define MENU_TYPE_MASK (MF_STRING | MF_BITMAP | MF_OWNERDRAW | MF_SEPARATOR) -#define MENU_ITEM_TYPE(flags) \ - ((flags) & (MF_STRING | MF_BITMAP | MF_OWNERDRAW | MF_SEPARATOR)) +#define MENU_ITEM_TYPE(flags) ((flags) & MENU_TYPE_MASK) +#define IS_STRING_ITEM(flags) (MF_STRING == MENU_ITEM_TYPE(flags)) +#define IS_BITMAP_ITEM(flags) (MF_BITMAP == MENU_ITEM_TYPE(flags)) + +#define IS_SYSTEM_MENU(MenuInfo) \ + (0 == ((MenuInfo)->Flags & MF_POPUP) && 0 != ((MenuInfo)->Flags & MF_SYSMENU)) + +#define IS_SYSTEM_POPUP(MenuInfo) \ + (0 != ((MenuInfo)->Flags & MF_POPUP) && 0 != ((MenuInfo)->Flags & MF_SYSMENU)) #define MENU_BAR_ITEMS_SPACE (12) #define SEPARATOR_HEIGHT (5) #define MENU_TAB_SPACE (8) +#define ITEM_PREV -1 +#define ITEM_NEXT 1 + #ifndef MF_END #define MF_END (0x0080) #endif @@ -64,6 +91,21 @@ #define POPUPMENU_CLASS_ATOMA MAKEINTATOMA(32768) /* PopupMenu */ #define POPUPMENU_CLASS_ATOMW MAKEINTATOMW(32768) /* PopupMenu */ +/* internal flags for menu tracking */ + +#define TF_ENDMENU 0x0001 +#define TF_SUSPENDPOPUP 0x0002 +#define TF_SKIPREMOVE 0x0004 + +typedef struct +{ + UINT TrackFlags; + HMENU CurrentMenu; /* current submenu (can be equal to hTopMenu)*/ + HMENU TopMenu; /* initial menu */ + HWND OwnerWnd; /* where notifications are sent */ + POINT Pt; +} MTRACKER; + static LRESULT WINAPI PopupMenuWndProcW(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); /********************************************************************* @@ -98,13 +140,638 @@ const struct builtin_class_descr POPUPMENU_builtin_class = HFONT hMenuFont = NULL; HFONT hMenuFontBold = NULL; -static LRESULT WINAPI PopupMenuWndProcW(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +/* Flag set by EndMenu() to force an exit from menu tracking */ +static BOOL fEndMenu = FALSE; + +/* Use global popup window because there's no way 2 menus can + * be tracked at the same time. */ +static HWND TopPopup; + +/* Dimension of the menu bitmaps */ +static WORD ArrowBitmapWidth = 0/*, ArrowBitmapHeight = 0*/; + + +/*********************************************************************** + * MenuGetRosMenuInfo + * + * Get full information about menu + */ +static BOOL FASTCALL +MenuGetRosMenuInfo(PROSMENUINFO MenuInfo, HMENU Menu) { - switch(message) - { + MenuInfo->cbSize = sizeof(ROSMENUINFO); + MenuInfo->fMask = MIM_BACKGROUND | MIM_HELPID | MIM_MAXHEIGHT | MIM_MENUDATA | MIM_STYLE; + + return NtUserMenuInfo(Menu, MenuInfo, FALSE); +} + +/*********************************************************************** + * MenuSetRosMenuInfo + * + * Set full information about menu + */ +static BOOL FASTCALL +MenuSetRosMenuInfo(PROSMENUINFO MenuInfo) +{ + MenuInfo->cbSize = sizeof(ROSMENUINFO); + MenuInfo->fMask = MIM_BACKGROUND | MIM_HELPID | MIM_MAXHEIGHT | MIM_MENUDATA | MIM_STYLE; + + return NtUserMenuInfo(MenuInfo->Self, MenuInfo, TRUE); +} + +/*********************************************************************** + * MenuInitRosMenuItemInfo + * + * Initialize a buffer for use with MenuGet/SetRosMenuItemInfo + */ +static VOID FASTCALL +MenuInitRosMenuItemInfo(PROSMENUITEMINFO ItemInfo) +{ + ZeroMemory(ItemInfo, sizeof(ROSMENUITEMINFO)); + ItemInfo->cbSize = sizeof(ROSMENUITEMINFO); +} + +/*********************************************************************** + * MenuGetRosMenuItemInfo + * + * Get full information about a menu item + */ +#define INITIAL_STRING_SIZE 32 /* in WCHARs */ +static BOOL FASTCALL +MenuGetRosMenuItemInfo(HMENU Menu, UINT Index, PROSMENUITEMINFO ItemInfo) +{ + UNICODE_STRING Text; + + if (MF_STRING == MENU_ITEM_TYPE(ItemInfo->fType) && NULL != ItemInfo->dwTypeData) + { + /* There's already a buffer allocated */ + Text.Buffer = ItemInfo->dwTypeData; + Text.Length = ItemInfo->cch * sizeof(WCHAR); + Text.MaximumLength = (ItemInfo->cch < INITIAL_STRING_SIZE ? INITIAL_STRING_SIZE + : ItemInfo->cch + 1) * sizeof(WCHAR); + } + else + { + Text.Buffer = HeapAlloc(GetProcessHeap(), 0, INITIAL_STRING_SIZE * sizeof(WCHAR)); + if (NULL == Text.Buffer) + { + return FALSE; + } + Text.Length = 0; + Text.MaximumLength = INITIAL_STRING_SIZE * sizeof(WCHAR); + ItemInfo->cch = INITIAL_STRING_SIZE - 1; + } + ItemInfo->dwTypeData = (LPWSTR) &Text; + + ItemInfo->fMask = MIIM_BITMAP | MIIM_CHECKMARKS | MIIM_DATA | MIIM_FTYPE + | MIIM_ID | MIIM_STATE | MIIM_STRING | MIIM_SUBMENU | MIIM_TYPE; + + if (! NtUserMenuItemInfo(Menu, Index, TRUE, ItemInfo, FALSE)) + { + if (NULL != Text.Buffer) + { + HeapFree(GetProcessHeap(), 0, Text.Buffer); + ItemInfo->dwTypeData = NULL; + ItemInfo->cch = 0; + } + ItemInfo->fType = 0; + } + + if (MF_STRING == MENU_ITEM_TYPE(ItemInfo->fType)) + { + /* We have a string... */ + if (Text.MaximumLength < (ItemInfo->cch + 1) * sizeof(WCHAR)) + { + /* ...but we didn't allocate enough memory. Let's try again */ + HeapFree(GetProcessHeap(), 0, Text.Buffer); + Text.Buffer = HeapAlloc(GetProcessHeap(), 0, (ItemInfo->cch + 1) * sizeof(WCHAR)); + if (NULL == Text.Buffer) + { + ItemInfo->dwTypeData = NULL; + ItemInfo->cch = 0; + return FALSE; + } + Text.Length = (ItemInfo->cch + 1) * sizeof(WCHAR); + Text.MaximumLength = (ItemInfo->cch + 1) * sizeof(WCHAR); + ItemInfo->cch++; + if (! NtUserMenuItemInfo(Menu, Index, TRUE, ItemInfo, FALSE)) + { + HeapFree(GetProcessHeap(), 0, ItemInfo->dwTypeData); + ItemInfo->dwTypeData = NULL; + ItemInfo->cch = 0; + ItemInfo->fType = 0; + } + } + } + + if (MF_STRING == MENU_ITEM_TYPE(ItemInfo->fType)) + { + ItemInfo->dwTypeData = Text.Buffer; + ItemInfo->cch = Text.Length / sizeof(WCHAR); + Text.Buffer[ItemInfo->cch] = L'\0'; + } + else + { + /* Not a string, clean up the buffer */ + if (NULL != Text.Buffer) + { + HeapFree(GetProcessHeap(), 0, Text.Buffer); + } + } + + return TRUE; +} + +/*********************************************************************** + * MenuSetRosMenuItemInfo + * + * Set full information about a menu item + */ +static BOOL FASTCALL +MenuSetRosMenuItemInfo(HMENU Menu, UINT Index, PROSMENUITEMINFO ItemInfo) +{ + UNICODE_STRING Text; + BOOL StringVal; + BOOL Ret; + + StringVal = (MF_STRING == MENU_ITEM_TYPE(ItemInfo->fType) && NULL != ItemInfo->dwTypeData); + if (StringVal) + { + Text.Buffer = ItemInfo->dwTypeData; + Text.Length = wcslen(Text.Buffer) * sizeof(WCHAR); + Text.MaximumLength = Text.Length + sizeof(WCHAR); + ItemInfo->dwTypeData = (LPWSTR) &Text; + } + ItemInfo->fMask = MIIM_BITMAP | MIIM_CHECKMARKS | MIIM_DATA | MIIM_FTYPE + | MIIM_ID | MIIM_STATE | MIIM_STRING | MIIM_SUBMENU | MIIM_TYPE; + + Ret = NtUserMenuItemInfo(Menu, Index, TRUE, ItemInfo, TRUE); + + if (StringVal) + { + ItemInfo->dwTypeData = Text.Buffer; + } + + return Ret; +} + +/*********************************************************************** + * MenuCleanupRosMenuItemInfo + * + * Cleanup after use of MenuGet/SetRosMenuItemInfo + */ +static VOID FASTCALL +MenuCleanupRosMenuItemInfo(PROSMENUITEMINFO ItemInfo) +{ + if (MF_STRING == MENU_ITEM_TYPE(ItemInfo->fType) && NULL != ItemInfo->dwTypeData) + { + HeapFree(GetProcessHeap(), 0, ItemInfo->dwTypeData); + ItemInfo->dwTypeData = NULL; + ItemInfo->cch = 0; + } +} + +/*********************************************************************** + * MenuDrawMenuItem + * + * Draw a single menu item. + */ +static void FASTCALL +MenuDrawMenuItem(HWND Wnd, PROSMENUINFO MenuInfo, HWND WndOwner, HDC Dc, + PROSMENUITEMINFO Item, UINT Height, BOOL MenuBar, UINT Action) +{ + RECT Rect; + PWCHAR Text; + + if (0 != (Item->fType & MF_SYSMENU)) + { +#if 0 /* FIXME */ + if( !IsIconic(hwnd) ) { + if (TWEAK_WineLook > WIN31_LOOK) + NC_DrawSysButton95( hwnd, hdc, + lpitem->fState & + (MF_HILITE | MF_MOUSESELECT) ); + else + NC_DrawSysButton( hwnd, hdc, + lpitem->fState & + (MF_HILITE | MF_MOUSESELECT) ); + } +#endif + + return; + } + + if (0 != (Item->fType & MF_OWNERDRAW)) + { + /* + ** Experimentation under Windows reveals that an owner-drawn + ** menu is given the rectangle which includes the space it requested + ** in its response to WM_MEASUREITEM _plus_ width for a checkmark + ** and a popup-menu arrow. This is the value of lpitem->rect. + ** Windows will leave all drawing to the application except for + ** the popup-menu arrow. Windows always draws that itself, after + ** the menu owner has finished drawing. + */ + DRAWITEMSTRUCT dis; + + dis.CtlType = ODT_MENU; + dis.CtlID = 0; + dis.itemID = Item->wID; + dis.itemData = (DWORD)Item->dwItemData; + dis.itemState = 0; + if (0 != (Item->fState & MF_CHECKED)) + { + dis.itemState |= ODS_CHECKED; + } + if (0 != (Item->fState & MF_GRAYED)) + { + dis.itemState |= ODS_GRAYED | ODS_DISABLED; + } + if (0 != (Item->fState & MF_HILITE)) + { + dis.itemState |= ODS_SELECTED; + } + dis.itemAction = Action; /* ODA_DRAWENTIRE | ODA_SELECT | ODA_FOCUS; */ + dis.hwndItem = (HWND) MenuInfo->Self; + dis.hDC = Dc; + dis.rcItem = Item->Rect; + DPRINT("Ownerdraw: owner=%p itemID=%d, itemState=%d, itemAction=%d, " + "hwndItem=%p, hdc=%p, rcItem={%ld,%ld,%ld,%ld}\n", hwndOwner, + dis.itemID, dis.itemState, dis.itemAction, dis.hwndItem, + dis.hDC, dis.rcItem.left, dis.rcItem.top, dis.rcItem.right, + dis.rcItem.bottom); + SendMessageW(WndOwner, WM_DRAWITEM, 0, (LPARAM) &dis); + /* Fall through to draw popup-menu arrow */ + } + + DPRINT("rect={%ld,%ld,%ld,%ld}\n", Item->rect.left, Item->rect.top, + Item->rect.right, Item->rect.bottom); + + if (MenuBar && 0 != (Item->fType & MF_SEPARATOR)) + { + return; + } + + Rect = Item->Rect; + + if (0 == (Item->fType & MF_OWNERDRAW)) + { + if (Item->fState & MF_HILITE) + { + if (MenuBar) + { + DrawEdge(Dc, &Rect, BDR_SUNKENOUTER, BF_RECT); + } + else + { + FillRect(Dc, &Rect, GetSysColorBrush(COLOR_HIGHLIGHT)); + } + } + else + { + FillRect(Dc, &Rect, GetSysColorBrush(COLOR_MENU)); + } + } + + SetBkMode(Dc, TRANSPARENT); + + if (0 == (Item->fType & MF_OWNERDRAW)) + { + /* vertical separator */ + if (! MenuBar && 0 != (Item->fType & MF_MENUBARBREAK)) + { + RECT rc = Rect; + rc.top = 3; + rc.bottom = Height - 3; + DrawEdge(Dc, &rc, EDGE_ETCHED, BF_LEFT); + } + + /* horizontal separator */ + if (0 != (Item->fType & MF_SEPARATOR)) + { + RECT rc = Rect; + rc.left++; + rc.right--; + rc.top += SEPARATOR_HEIGHT / 2; + DrawEdge(Dc, &rc, EDGE_ETCHED, BF_TOP); + + return; + } + } + + /* Setup colors */ + + if (0 != (Item->fState & MF_HILITE)) + { + if (MenuBar) + { + SetTextColor(Dc, GetSysColor(COLOR_MENUTEXT)); + SetBkColor(Dc, GetSysColor(COLOR_MENU)); + } + else + { + if (0 != (Item->fState & MF_GRAYED)) + { + SetTextColor(Dc, GetSysColor(COLOR_GRAYTEXT)); + } + else + { + SetTextColor(Dc, GetSysColor(COLOR_HIGHLIGHTTEXT)); + } + SetBkColor(Dc, GetSysColor(COLOR_HIGHLIGHT)); + } + } + else + { + if (0 != (Item->fState & MF_GRAYED)) + { + SetTextColor(Dc, GetSysColor(COLOR_GRAYTEXT)); + } + else + { + SetTextColor(Dc, GetSysColor(COLOR_MENUTEXT)); + } + SetBkColor(Dc, GetSysColor(COLOR_MENU)); + } + +#if 0 + /* helper lines for debugging */ + FrameRect(Dc, &Rect, GetStockObject(BLACK_BRUSH)); + SelectObject(Dc, SYSCOLOR_GetPen(COLOR_WINDOWFRAME)); + MoveToEx(Dc, Rect.left, (Rect.top + Rect.bottom) / 2, NULL); + LineTo(Dc, Rect.right, (Rect.top + Rect.bottom) / 2); +#endif + + if (! MenuBar) + { + INT y = Rect.top + Rect.bottom; + UINT CheckBitmapWidth = GetSystemMetrics(SM_CXMENUCHECK); + UINT CheckBitmapHeight = GetSystemMetrics(SM_CYMENUCHECK); + + if (0 == (Item->fType & MF_OWNERDRAW)) + { + /* Draw the check mark + * + * FIXME: + * Custom checkmark bitmaps are monochrome but not always 1bpp. + */ +#if 0 /* FIXME */ + HBITMAP bm = 0 != (Item->fState & MF_CHECKED) ? Item->hCheckBit : Item->hUnCheckBit; + if (NULL != bm) /* we have a custom bitmap */ + { + HDC DcMem = CreateCompatibleDC(Dc); + SelectObject(DcMem, bm); + BitBlt(Dc, Rect.left, (y - CheckBitmapHeight) / 2, + CheckBitmapWidth, CheckBitmapHeight, + DcMem, 0, 0, SRCCOPY); + DeleteDC(DcMem); + } + else if (0 != (Item->fState & MF_CHECKED)) /* standard bitmaps */ +#else + if (0 != (Item->fState & MF_CHECKED)) /* standard bitmaps */ +#endif + { + RECT r; + HBITMAP bm = CreateBitmap(CheckBitmapWidth, CheckBitmapHeight, 1, 1, NULL); + HDC DcMem = CreateCompatibleDC(Dc); + SelectObject(DcMem, bm); + SetRect( &r, 0, 0, CheckBitmapWidth, CheckBitmapHeight); + DrawFrameControl(DcMem, &r, DFC_MENU, + 0 != (Item->fType & MFT_RADIOCHECK) ? + DFCS_MENUBULLET : DFCS_MENUCHECK); + BitBlt(Dc, Rect.left, (y - r.bottom) / 2, r.right, r.bottom, + DcMem, 0, 0, SRCCOPY ); + DeleteDC(DcMem); + DeleteObject(bm); + } + } + +#if 0 /* FIXME */ + /* Draw the popup-menu arrow */ + if (lpitem->fType & MF_POPUP) + { + HDC hdcMem = CreateCompatibleDC( hdc ); + HBITMAP hOrigBitmap; + + hOrigBitmap = SelectObject( hdcMem, hStdMnArrow ); + BitBlt( hdc, rect.right - arrow_bitmap_width - 1, + (y - arrow_bitmap_height) / 2, + arrow_bitmap_width, arrow_bitmap_height, + hdcMem, 0, 0, SRCCOPY ); + SelectObject( hdcMem, hOrigBitmap ); + DeleteDC( hdcMem ); + } +#endif + + Rect.left += CheckBitmapWidth; + Rect.right -= ArrowBitmapWidth; + } + + /* Done for owner-drawn */ + if (0 != (Item->fType & MF_OWNERDRAW)) + { + return; + } + + /* Draw the item text or bitmap */ + if (IS_BITMAP_ITEM(Item->fType)) + { +#if 0 /* FIXME */ + MENU_DrawBitmapItem( hdc, lpitem, &rect, menuBar ); +#endif + return; + } + /* No bitmap - process text if present */ + else if (IS_STRING_ITEM(Item->fType)) + { + register int i; + HFONT FontOld = NULL; + + UINT uFormat = MenuBar ? DT_CENTER | DT_VCENTER | DT_SINGLELINE + : DT_LEFT | DT_VCENTER | DT_SINGLELINE; + + if (0 != (Item->fState & MFS_DEFAULT)) + { + FontOld = SelectObject(Dc, hMenuFontBold); + } + + if (MenuBar) + { + Rect.left += MENU_BAR_ITEMS_SPACE / 2; + Rect.right -= MENU_BAR_ITEMS_SPACE / 2; + } + + Text = (PWCHAR) Item->dwTypeData; + for (i = 0; L'\0' != Text[i]; i++) + { + if (L'\t' == Text[i] || L'\b' == Text[i]) + { + break; + } + } + + if (0 != (Item->fState & MF_GRAYED)) + { + if (0 == (Item->fState & MF_HILITE)) + { + ++Rect.left; ++Rect.top; ++Rect.right; ++Rect.bottom; + SetTextColor(Dc, RGB(0xff, 0xff, 0xff)); + DrawTextW(Dc, Text, i, &Rect, uFormat); + --Rect.left; --Rect.top; --Rect.right; --Rect.bottom; + } + SetTextColor(Dc, RGB(0x80, 0x80, 0x80)); + } + + DrawTextW(Dc, Text, i, &Rect, uFormat); + + /* paint the shortcut text */ + if (! MenuBar && L'\0' != Text[i]) /* There's a tab or flush-right char */ + { + if (L'\t' == Text[i]) + { + Rect.left = Item->XTab; + uFormat = DT_LEFT | DT_VCENTER | DT_SINGLELINE; + } + else + { + uFormat = DT_RIGHT | DT_VCENTER | DT_SINGLELINE; + } + + if (0 != (Item->fState & MF_GRAYED)) + { + if (0 == (Item->fState & MF_HILITE)) + { + ++Rect.left; ++Rect.top; ++Rect.right; ++Rect.bottom; + SetTextColor(Dc, RGB(0xff, 0xff, 0xff)); + DrawTextW(Dc, Text + i + 1, -1, &Rect, uFormat); + --Rect.left; --Rect.top; --Rect.right; --Rect.bottom; + } + SetTextColor(Dc, RGB(0x80, 0x80, 0x80)); + } + DrawTextW(Dc, Text + i + 1, -1, &Rect, uFormat); + } + + if (NULL != FontOld) + { + SelectObject(Dc, FontOld); + } + } +} + +/*********************************************************************** + * MenuDrawPopupMenu + * + * Paint a popup menu. + */ +static void FASTCALL +MenuDrawPopupMenu(HWND Wnd, HDC Dc, HMENU Menu) +{ + HBRUSH PrevBrush = NULL; + HPEN PrevPen; + RECT Rect; + ROSMENUINFO MenuInfo; + ROSMENUITEMINFO ItemInfo; + UINT u; + + DPRINT("wnd=%x dc=%x menu=%x\n", Wnd, Dc, Menu); + + GetClientRect(Wnd, &Rect); + + if (NULL != (PrevBrush = SelectObject(Dc, GetSysColorBrush(COLOR_MENU))) + && NULL != SelectObject(Dc, hMenuFont)) + { + Rectangle(Dc, Rect.left, Rect.top, Rect.right, Rect.bottom); + + PrevPen = SelectObject(Dc, GetStockObject(NULL_PEN)); + if (NULL != PrevPen) + { + DrawEdge(Dc, &Rect, EDGE_RAISED, BF_RECT); + + /* draw menu items */ + + if (MenuGetRosMenuInfo(&MenuInfo, Menu) && 0 != MenuInfo.MenuItemCount) + { + MenuInitRosMenuItemInfo(&ItemInfo); + + for (u = 0; u < MenuInfo.MenuItemCount; u++) + { + if (MenuGetRosMenuItemInfo(MenuInfo.Self, u, &ItemInfo)) + { + MenuDrawMenuItem(Wnd, &MenuInfo, MenuInfo.WndOwner, Dc, &ItemInfo, + MenuInfo.Height, FALSE, ODA_DRAWENTIRE); + } + } + } + } + else + { + SelectObject(Dc, PrevBrush); + } + } +} + +static LRESULT WINAPI +PopupMenuWndProcW(HWND Wnd, UINT Message, WPARAM wParam, LPARAM lParam) +{ + DPRINT("hwnd=%x msg=0x%04x wp=0x%04x lp=0x%08lx\n", Wnd, Message, wParam, lParam); + + switch(Message) + { + case WM_CREATE: + { + CREATESTRUCTW *cs = (CREATESTRUCTW *) lParam; + SetWindowLongW(Wnd, 0, (LONG) cs->lpCreateParams); + return 0; + } + + case WM_MOUSEACTIVATE: /* We don't want to be activated */ + return MA_NOACTIVATE; + + case WM_PAINT: + { + PAINTSTRUCT ps; + BeginPaint(Wnd, &ps); + MenuDrawPopupMenu(Wnd, ps.hdc, (HMENU)GetWindowLongW(Wnd, 0)); + EndPaint(Wnd, &ps); + return 0; + } + + case WM_ERASEBKGND: + return 1; + + case WM_DESTROY: + /* zero out global pointer in case resident popup window was destroyed. */ + if (Wnd == TopPopup) + { + TopPopup = NULL; + } + break; + + case WM_SHOWWINDOW: + if (0 != wParam) + { + if (0 == GetWindowLongW(Wnd, 0)) + { + OutputDebugStringA("no menu to display\n"); + } + } + else + { + SetWindowLongW(Wnd, 0, 0); + } + break; + + case MM_SETMENUHANDLE: + SetWindowLongW(Wnd, 0, wParam); + break; + + case MM_GETMENUHANDLE: + return GetWindowLongW(Wnd, 0); + default: - return DefWindowProcW(hwnd, message, wParam, lParam); - } + return DefWindowProcW(Wnd, Message, wParam, lParam); + } + return 0; } @@ -119,7 +786,7 @@ static LRESULT WINAPI PopupMenuWndProcW(HWND hwnd, UINT message, WPARAM wParam, static LPCSTR MENUEX_ParseResource( LPCSTR res, HMENU hMenu) { WORD resinfo; - + do { MENUITEMINFOW mii; @@ -346,6 +1013,377 @@ DrawMenuItem(HWND hWnd, HMENU mnu, HDC hDC, MENUITEMINFOW *mii, RECT *mir, LPWST } +/*********************************************************************** + * MenuCalcItemSize + * + * Calculate the size of the menu item and store it in ItemInfo->rect. + */ +static void FASTCALL +MenuCalcItemSize(HDC Dc, PROSMENUITEMINFO ItemInfo, HWND WndOwner, + INT OrgX, INT OrgY, BOOL MenuBar) +{ + PWCHAR p; + UINT CheckBitmapWidth = GetSystemMetrics(SM_CXMENUCHECK); + + DPRINT("dc=%x owner=%x (%d,%d)\n", Dc, WndOwner, OrgX, OrgY); + + SetRect(&ItemInfo->Rect, OrgX, OrgY, OrgX, OrgY); + + if (0 != (ItemInfo->fType & MF_OWNERDRAW)) + { + /* + ** Experimentation under Windows reveals that an owner-drawn + ** menu is expected to return the size of the content part of + ** the menu item, not including the checkmark nor the submenu + ** arrow. Windows adds those values itself and returns the + ** enlarged rectangle on subsequent WM_DRAWITEM messages. + */ + MEASUREITEMSTRUCT mis; + mis.CtlType = ODT_MENU; + mis.CtlID = 0; + mis.itemID = ItemInfo->wID; + mis.itemData = (DWORD)ItemInfo->dwItemData; + mis.itemHeight = 0; + mis.itemWidth = 0; + SendMessageW(WndOwner, WM_MEASUREITEM, 0, (LPARAM) &mis); + ItemInfo->Rect.right += mis.itemWidth; + + if (MenuBar) + { + ItemInfo->Rect.right += MENU_BAR_ITEMS_SPACE; + + /* under at least win95 you seem to be given a standard + height for the menu and the height value is ignored */ + + ItemInfo->Rect.bottom += GetSystemMetrics(SM_CYMENU) - 1; + } + else + { + ItemInfo->Rect.bottom += mis.itemHeight; + } + + DPRINT("id=%04x size=%dx%d\n", ItemInfo->wID, mis.itemWidth, mis.itemHeight); + /* Fall through to get check/arrow width calculation. */ + } + + if (0 != (ItemInfo->fType & MF_SEPARATOR)) + { + ItemInfo->Rect.bottom += SEPARATOR_HEIGHT; + return; + } + + if (! MenuBar) + { + ItemInfo->Rect.right += 2 * CheckBitmapWidth; + if (0 != (ItemInfo->fType & MF_POPUP)) + { + ItemInfo->Rect.right += ArrowBitmapWidth; + } + } + + if (0 != (ItemInfo->fType & MF_OWNERDRAW)) + { + return; + } + + if (IS_BITMAP_ITEM(ItemInfo->fType)) + { +#if 0 /* FIXME */ + SIZE size; + + MENU_GetBitmapItemSize( (int)lpitem->text, lpitem->dwItemData, &size ); + lpitem->rect.right += size.cx; + lpitem->rect.bottom += size.cy; + + /* Leave space for the sunken border */ + lpitem->rect.right += 2; + lpitem->rect.bottom += 2; +#endif + } + + /* it must be a text item - unless it's the system menu */ + if (0 == (ItemInfo->fType & MF_SYSMENU) && IS_STRING_ITEM(ItemInfo->fType)) + { + SIZE Size; + + GetTextExtentPoint32W(Dc, (LPWSTR) ItemInfo->dwTypeData, + wcslen((LPWSTR) ItemInfo->dwTypeData), &Size); + + ItemInfo->Rect.right += Size.cx; + ItemInfo->Rect.bottom += max(Size.cy, GetSystemMetrics(SM_CYMENU) - 1); + ItemInfo->XTab = 0; + + if (MenuBar) + { + ItemInfo->Rect.right += MENU_BAR_ITEMS_SPACE; + } + else if ((p = wcschr((LPWSTR) ItemInfo->dwTypeData, L'\t' )) != NULL) + { + /* Item contains a tab (only meaningful in popup menus) */ + GetTextExtentPoint32W(Dc, (LPWSTR) ItemInfo->dwTypeData, + (int)(p - (LPWSTR) ItemInfo->dwTypeData), &Size); + ItemInfo->XTab = CheckBitmapWidth + MENU_TAB_SPACE + Size.cx; + ItemInfo->Rect.right += MENU_TAB_SPACE; + } + else + { + if (NULL != wcschr((LPWSTR) ItemInfo->dwTypeData, L'\b')) + { + ItemInfo->Rect.right += MENU_TAB_SPACE; + } + ItemInfo->XTab = ItemInfo->Rect.right - CheckBitmapWidth + - ArrowBitmapWidth; + } + } + + DPRINT("(%ld,%ld)-(%ld,%ld)\n", ItemInfo->Rect.left, ItemInfo->Rect.top, ItemInfo->Rect.right, ItemInfo->Rect.bottom); +} + +/*********************************************************************** + * MenuPopupMenuCalcSize + * + * Calculate the size of a popup menu. + */ +static void FASTCALL +MenuPopupMenuCalcSize(PROSMENUINFO MenuInfo, HWND WndOwner) +{ + ROSMENUITEMINFO ItemInfo; + HDC Dc; + int Start, i; + int OrgX, OrgY, MaxX, MaxTab, MaxTabWidth; + + MenuInfo->Width = MenuInfo->Height = 0; + if (0 == MenuInfo->MenuItemCount) + { + MenuSetRosMenuInfo(MenuInfo); + return; + } + + Dc = GetDC(NULL); + SelectObject(Dc, hMenuFont); + + Start = 0; + MaxX = 2 + 1; + + MenuInitRosMenuItemInfo(&ItemInfo); + while (Start < MenuInfo->MenuItemCount) + { + OrgX = MaxX; + OrgY = 2; + + MaxTab = MaxTabWidth = 0; + + /* Parse items until column break or end of menu */ + for (i = Start; i < MenuInfo->MenuItemCount; i++) + { + if (! MenuGetRosMenuItemInfo(MenuInfo->Self, i, &ItemInfo)) + { + MenuCleanupRosMenuItemInfo(&ItemInfo); + MenuSetRosMenuInfo(MenuInfo); + return; + } + if (i != Start && + 0 != (ItemInfo.fType & (MF_MENUBREAK | MF_MENUBARBREAK))) + { + break; + } + + MenuCalcItemSize(Dc, &ItemInfo, WndOwner, OrgX, OrgY, FALSE); + if (! MenuSetRosMenuItemInfo(MenuInfo->Self, i, &ItemInfo)) + { + MenuCleanupRosMenuItemInfo(&ItemInfo); + MenuSetRosMenuInfo(MenuInfo); + return; + } + + if (0 != (ItemInfo.fType & MF_MENUBARBREAK)) + { + OrgX++; + } + MaxX = max(MaxX, ItemInfo.Rect.right); + OrgY = ItemInfo.Rect.bottom; + if (IS_STRING_ITEM(ItemInfo.fType) && 0 != ItemInfo.XTab) + { + MaxTab = max(MaxTab, ItemInfo.XTab); + MaxTabWidth = max(MaxTabWidth, ItemInfo.Rect.right - ItemInfo.XTab); + } + } + + /* Finish the column (set all items to the largest width found) */ + MaxX = max(MaxX, MaxTab + MaxTabWidth); + while (Start < i) + { + if (MenuGetRosMenuItemInfo(MenuInfo->Self, Start, &ItemInfo)) + { + ItemInfo.Rect.right = MaxX; + if (IS_STRING_ITEM(ItemInfo.fType) && 0 != ItemInfo.XTab) + { + ItemInfo.XTab = MaxTab; + } + MenuSetRosMenuItemInfo(MenuInfo->Self, Start, &ItemInfo); + } + Start++; + } + MenuInfo->Height = max(MenuInfo->Height, OrgY); + } + + MenuInfo->Width = MaxX; + + /* space for 3d border */ + MenuInfo->Height += 2; + MenuInfo->Width += 2; + + ReleaseDC(NULL, Dc); + MenuCleanupRosMenuItemInfo(&ItemInfo); + MenuSetRosMenuInfo(MenuInfo); +} + +#if 0 /* Not used yet */ +/*********************************************************************** + * MenuMenuBarCalcSize + * + * FIXME: Word 6 implements its own MDI and its own 'close window' bitmap + * height is off by 1 pixel which causes lengthy window relocations when + * active document window is maximized/restored. + * + * Calculate the size of the menu bar. + */ +static void FASTCALL +MenuMenuBarCalcSize(HDC Dc, LPRECT Rect, PROSMENUINFO MenuInfo, HWND WndOwner) +{ + ROSMENUITEMINFO ItemInfo; + int Start, i, OrgX, OrgY, MaxY, HelpPos; + + if (NULL == Rect || NULL == MenuInfo) + { + return; + } + if (0 == MenuInfo->MenuItemCount) + { + return; + } + + DPRINT("left=%ld top=%ld right=%ld bottom=%ld\n", + Rrect->left, Rect->top, Rect->right, Rect->bottom); + MenuInfo->Width = Rect->right - Rect->left; + MenuInfo->Height = 0; + MaxY = Rect->top + 1; + Start = 0; + HelpPos = -1; + MenuInitRosMenuItemInfo(&ItemInfo); + while (Start < MenuInfo->MenuItemCount) + { + if (! MenuGetRosMenuItemInfo(MenuInfo->Self, Start, &ItemInfo)) + { + MenuCleanupRosMenuItemInfo(&ItemInfo); + return; + } + OrgX = Rect->left; + OrgY = MaxY; + + /* Parse items until line break or end of menu */ + for (i = Start; i < MenuInfo->MenuItemCount; i++) + { + if (-1 == HelpPos && 0 != (ItemInfo.fType & MF_RIGHTJUSTIFY)) + { + HelpPos = i; + } + if (i != Start && + 0 != (ItemInfo.fType & (MF_MENUBREAK | MF_MENUBARBREAK))) + { + break; + } + + DPRINT("calling MENU_CalcItemSize org=(%d, %d)\n", OrgX, OrgY); + MenuCalcItemSize(Dc, &ItemInfo, WndOwner, OrgX, OrgY, TRUE); + if (! MenuSetRosMenuItemInfo(MenuInfo->Self, i, &ItemInfo)) + { + MenuCleanupRosMenuItemInfo(&ItemInfo); + return; + } + + if (ItemInfo.Rect.right > Rect->right) + { + if (i != Start) + { + break; + } + else + { + ItemInfo.Rect.right = Rect->right; + } + } + MaxY = max(MaxY, ItemInfo.Rect.bottom ); + OrgX = ItemInfo.Rect.right; + if (i + 1 < MenuInfo->MenuItemCount) + { + if (! MenuGetRosMenuItemInfo(MenuInfo->Self, i + 1, &ItemInfo)) + { + MenuCleanupRosMenuItemInfo(&ItemInfo); + return; + } + } + } + + /* Finish the line (set all items to the largest height found) */ + while (Start < i) + { + if (MenuGetRosMenuItemInfo(MenuInfo->Self, Start, &ItemInfo)) + { + ItemInfo.Rect.bottom = MaxY; + MenuSetRosMenuItemInfo(MenuInfo->Self, Start, &ItemInfo); + } + Start++; + } + } + + Rect->bottom = MaxY; + MenuInfo->Height = Rect->bottom - Rect->top; + MenuSetRosMenuInfo(MenuInfo); + + if (-1 != HelpPos) + { + /* Flush right all items between the MF_RIGHTJUSTIFY and */ + /* the last item (if several lines, only move the last line) */ + if (! MenuGetRosMenuItemInfo(MenuInfo->Self, MenuInfo->MenuItemCount - 1, &ItemInfo)) + { + MenuCleanupRosMenuItemInfo(&ItemInfo); + return; + } + OrgY = ItemInfo.Rect.top; + OrgX = Rect->right; + for (i = MenuInfo->MenuItemCount - 1; HelpPos <= i; i--) + { + if (i < HelpPos) + { + break; /* done */ + } + if (ItemInfo.Rect.top != OrgY) + { + break; /* Other line */ + } + if (OrgX <= ItemInfo.Rect.right) + { + break; /* Too far right already */ + } + ItemInfo.Rect.left += OrgX - ItemInfo.Rect.right; + ItemInfo.Rect.right = OrgX; + OrgX = ItemInfo.Rect.left; + MenuSetRosMenuItemInfo(MenuInfo->Self, i, &ItemInfo); + if (HelpPos + 1 <= i && + ! MenuGetRosMenuItemInfo(MenuInfo->Self, i - 1, &ItemInfo)) + { + MenuCleanupRosMenuItemInfo(&ItemInfo); + return; + } + } + } + + MenuCleanupRosMenuItemInfo(&ItemInfo); +} +#endif + + UINT MenuDrawMenuBar(HDC hDC, LPRECT Rect, HWND hWnd, BOOL Draw) { @@ -513,16 +1551,1198 @@ MenuDrawMenuBar(HDC hDC, LPRECT Rect, HWND hWnd, BOOL Draw) return max(bottom - Rect->top, GetSystemMetrics(SM_CYMENU)); } +/*********************************************************************** + * MenuInitTracking + */ +static BOOL FASTCALL +MenuInitTracking(HWND Wnd, HMENU Menu, BOOL Popup, UINT Flags) +{ + DPRINT("Wnd=%p Menu=%p\n", Wnd, Menu); + + HideCaret(0); + + /* Send WM_ENTERMENULOOP and WM_INITMENU message only if TPM_NONOTIFY flag is not specified */ + if (0 == (Flags & TPM_NONOTIFY)) + { + SendMessageW(Wnd, WM_ENTERMENULOOP, Popup, 0); + } + + SendMessageW(Wnd, WM_SETCURSOR, (WPARAM) Wnd, HTCAPTION); + + if (0 == (Flags & TPM_NONOTIFY)) + { + ROSMENUINFO MenuInfo; + + SendMessageW(Wnd, WM_INITMENU, (WPARAM)Menu, 0); + + if (MenuGetRosMenuInfo(&MenuInfo, Menu) && 0 == MenuInfo.Height) + { + /* app changed/recreated menu bar entries in WM_INITMENU + Recalculate menu sizes else clicks will not work */ + SetWindowPos(Wnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | + SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED ); + + } + } + + return TRUE; +} + + +/*********************************************************************** + * MenuShowPopup + * + * Display a popup menu. + */ +static BOOL FASTCALL +MenuShowPopup(HWND WndOwner, HMENU Menu, UINT Id, + INT X, INT Y, INT XAnchor, INT YAnchor ) +{ + ROSMENUINFO MenuInfo; + ROSMENUITEMINFO ItemInfo; + UINT Width, Height; + + DPRINT("owner=%x hmenu=%x id=0x%04x x=0x%04x y=0x%04x xa=0x%04x ya=0x%04x\n", + WndOwner, Menu, Id, X, Y, XAnchor, YAnchor); + + if (! MenuGetRosMenuInfo(&MenuInfo, Menu)) + { + return FALSE; + } + + if (NO_SELECTED_ITEM != MenuInfo.FocusedItem) + { + MenuInitRosMenuItemInfo(&ItemInfo); + if (MenuGetRosMenuItemInfo(MenuInfo.Self, MenuInfo.FocusedItem, &ItemInfo)) + { + ItemInfo.fState &= ~(MF_HILITE|MF_MOUSESELECT); + MenuSetRosMenuItemInfo(MenuInfo.Self, MenuInfo.FocusedItem, &ItemInfo); + } + MenuCleanupRosMenuItemInfo(&ItemInfo); + MenuInfo.FocusedItem = NO_SELECTED_ITEM; + } + + /* store the owner for DrawItem */ + MenuInfo.WndOwner = WndOwner; + MenuSetRosMenuInfo(&MenuInfo); + + MenuPopupMenuCalcSize(&MenuInfo, WndOwner); + + /* adjust popup menu pos so that it fits within the desktop */ + + Width = MenuInfo.Width + GetSystemMetrics(SM_CXBORDER); + Height = MenuInfo.Height + GetSystemMetrics(SM_CYBORDER); + + if (GetSystemMetrics(SM_CXSCREEN ) < X + Width) + { + if (0 != XAnchor) + { + X -= Width - XAnchor; + } + if (GetSystemMetrics(SM_CXSCREEN) < X + Width) + { + X = GetSystemMetrics(SM_CXSCREEN) - Width; + } + } + if (X < 0 ) + { + X = 0; + } + + if (GetSystemMetrics(SM_CYSCREEN) < Y + Height) + { + if (0 != YAnchor) + { + Y -= Height + YAnchor; + } + if (GetSystemMetrics(SM_CYSCREEN) < Y + Height) + { + Y = GetSystemMetrics(SM_CYSCREEN) - Height; + } + } + if (Y < 0 ) + { + Y = 0; + } + + + /* NOTE: In Windows, top menu popup is not owned. */ + MenuInfo.Wnd = CreateWindowExW(0, POPUPMENU_CLASS_ATOMW, NULL, + WS_POPUP, X, Y, Width, Height, + WndOwner, 0, (HINSTANCE) GetWindowLongW(WndOwner, GWL_HINSTANCE), + (LPVOID) MenuInfo.Self); + if (NULL == MenuInfo.Wnd || ! MenuSetRosMenuInfo(&MenuInfo)) + { + return FALSE; + } + if (NULL == TopPopup) + { + TopPopup = MenuInfo.Wnd; + } + + /* Display the window */ + SetWindowPos(MenuInfo.Wnd, HWND_TOP, 0, 0, 0, 0, + SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE); + UpdateWindow(MenuInfo.Wnd); + + return TRUE; +} + +/*********************************************************************** + * MenuFindSubMenu + * + * Find a Sub menu. Return the position of the submenu, and modifies + * *hmenu in case it is found in another sub-menu. + * If the submenu cannot be found, NO_SELECTED_ITEM is returned. + */ +static UINT FASTCALL +MenuFindSubMenu(HMENU *Menu, HMENU SubTarget) +{ + ROSMENUINFO MenuInfo; + ROSMENUITEMINFO ItemInfo; + UINT i; + HMENU SubMenu; + UINT Pos; + + if ((HMENU) 0xffff == *Menu + || ! MenuGetRosMenuInfo(&MenuInfo, *Menu)) + { + return NO_SELECTED_ITEM; + } + + MenuInitRosMenuItemInfo(&ItemInfo); + for (i = 0; i < MenuInfo.MenuItemCount; i++) + { + if (! MenuGetRosMenuItemInfo(MenuInfo.Self, i, &ItemInfo)) + { + MenuCleanupRosMenuItemInfo(&ItemInfo); + return NO_SELECTED_ITEM; + } + if (0 == (ItemInfo.fType & MF_POPUP)) + { + continue; + } + if (ItemInfo.hSubMenu == SubTarget) + { + MenuCleanupRosMenuItemInfo(&ItemInfo); + return i; + } + SubMenu = ItemInfo.hSubMenu; + Pos = MenuFindSubMenu(&SubMenu, SubTarget); + if (NO_SELECTED_ITEM != Pos) + { + *Menu = SubMenu; + return Pos; + } + } + MenuCleanupRosMenuItemInfo(&ItemInfo); + + return NO_SELECTED_ITEM; +} + +/*********************************************************************** + * MenuSelectItem + */ +static void FASTCALL +MenuSelectItem(HWND WndOwner, PROSMENUINFO MenuInfo, UINT Index, + BOOL SendMenuSelect, HMENU TopMenu) +{ + HDC Dc; + ROSMENUITEMINFO ItemInfo; + ROSMENUINFO TopMenuInfo; + int Pos; + + DPRINT("owner=%x menu=%p index=0x%04x select=0x%04x\n", WndOwner, MenuInfo, Index, SendMenuSelect); + + if (NULL == MenuInfo || 0 == MenuInfo->MenuItemCount || NULL == MenuInfo->Wnd) + { + return; + } + + if (MenuInfo->FocusedItem == Index) + { + return; + } + + if (0 != (MenuInfo->Flags & MF_POPUP)) + { + Dc = GetDC(MenuInfo->Wnd); + } + else + { + Dc = GetDCEx(MenuInfo->Wnd, 0, DCX_CACHE | DCX_WINDOW); + } + + if (NULL == TopPopup) + { + TopPopup = MenuInfo->Wnd; + } + + SelectObject(Dc, hMenuFont); + MenuInitRosMenuItemInfo(&ItemInfo); + + /* Clear previous highlighted item */ + if (NO_SELECTED_ITEM != MenuInfo->FocusedItem) + { + if (MenuGetRosMenuItemInfo(MenuInfo->Self, MenuInfo->FocusedItem, &ItemInfo)) + { + ItemInfo.fState &= ~(MF_HILITE|MF_MOUSESELECT); + MenuSetRosMenuItemInfo(MenuInfo->Self, MenuInfo->FocusedItem, &ItemInfo); + } + MenuDrawMenuItem(MenuInfo->Wnd, MenuInfo, WndOwner, Dc, &ItemInfo, + MenuInfo->Height, ! (MenuInfo->Flags & MF_POPUP), + ODA_SELECT); + } + + /* Highlight new item (if any) */ + MenuInfo->FocusedItem = Index; + MenuSetRosMenuInfo(MenuInfo); + if (NO_SELECTED_ITEM != MenuInfo->FocusedItem) + { + if (MenuGetRosMenuItemInfo(MenuInfo->Self, MenuInfo->FocusedItem, &ItemInfo)) + { + if (0 == (ItemInfo.fType & MF_SEPARATOR)) + { + ItemInfo.fState |= MF_HILITE; + MenuSetRosMenuItemInfo(MenuInfo->Self, MenuInfo->FocusedItem, &ItemInfo); + MenuDrawMenuItem(MenuInfo->Wnd, MenuInfo, WndOwner, Dc, + &ItemInfo, MenuInfo->Height, ! (MenuInfo->Flags & MF_POPUP), + ODA_SELECT); + } + if (SendMenuSelect) + { + SendMessageW(WndOwner, WM_MENUSELECT, + MAKELONG(ItemInfo.fType & MF_POPUP ? Index : ItemInfo.wID, + ItemInfo.fType | ItemInfo.fState | MF_MOUSESELECT | + (MenuInfo->Flags & MF_SYSMENU)), (LPARAM) MenuInfo->Self); + } + } + } + else if (SendMenuSelect) + { + if (NULL != TopMenu) + { + Pos = MenuFindSubMenu(&TopMenu, MenuInfo->Self); + if (NO_SELECTED_ITEM != Pos) + { + if (MenuGetRosMenuInfo(&TopMenuInfo, TopMenu) + && MenuGetRosMenuItemInfo(TopMenu, Pos, &ItemInfo)) + { + SendMessageW(WndOwner, WM_MENUSELECT, + MAKELONG(Pos, ItemInfo.fType | ItemInfo.fState + | MF_MOUSESELECT + | (TopMenuInfo.Flags & MF_SYSMENU)), + (LPARAM) TopMenu); + } + } + } + } + + MenuCleanupRosMenuItemInfo(&ItemInfo); + ReleaseDC(MenuInfo->Wnd, Dc); +} + +/*********************************************************************** + * MenuMoveSelection + * + * Moves currently selected item according to the Offset parameter. + * If there is no selection then it should select the last item if + * Offset is ITEM_PREV or the first item if Offset is ITEM_NEXT. + */ +static void FASTCALL +MenuMoveSelection(HWND WndOwner, PROSMENUINFO MenuInfo, INT Offset) +{ + INT i; + ROSMENUITEMINFO ItemInfo; + + DPRINT("hwnd=%x menu=%x off=0x%04x\n", WndOwner, MenuInfo, offset); + + MenuInitRosMenuItemInfo(&ItemInfo); + if (NO_SELECTED_ITEM != MenuInfo->FocusedItem) + { + if (1 == MenuInfo->MenuItemCount) + { + MenuCleanupRosMenuItemInfo(&ItemInfo); + return; + } + else + { + for (i = MenuInfo->FocusedItem + Offset; + 0 <= i && i < MenuInfo->MenuItemCount; + i += Offset) + { + if (MenuGetRosMenuItemInfo(MenuInfo->Self, i, &ItemInfo) && + 0 == (ItemInfo.fType & MF_SEPARATOR)) + { + MenuSelectItem(WndOwner, MenuInfo, i, TRUE, NULL); + MenuCleanupRosMenuItemInfo(&ItemInfo); + return; + } + } + } + } + + for (i = (0 < Offset) ? 0 : MenuInfo->MenuItemCount - 1; + 0 <= i && i < MenuInfo->MenuItemCount; i += Offset) + { + if (MenuGetRosMenuItemInfo(MenuInfo->Self, i, &ItemInfo) && + 0 == (ItemInfo.fType & MF_SEPARATOR)) + { + MenuSelectItem(WndOwner, MenuInfo, i, TRUE, NULL); + MenuCleanupRosMenuItemInfo(&ItemInfo); + return; + } + } + + MenuCleanupRosMenuItemInfo(&ItemInfo); +} + +/*********************************************************************** + * MenuShowSubPopup + * + * Display the sub-menu of the selected item of this menu. + * Return the handle of the submenu, or menu if no submenu to display. + */ +static HMENU FASTCALL +MenuShowSubPopup(HWND WndOwner, PROSMENUINFO MenuInfo, BOOL SelectFirst, UINT Flags) +{ + RECT Rect; + ROSMENUITEMINFO ItemInfo; + HDC Dc; + HMENU Ret; + + DPRINT("owner=%x menu=%p 0x%04x\n", WndOwner, MenuInfo, SelectFirst); + + if (NO_SELECTED_ITEM == MenuInfo->FocusedItem) + { + return MenuInfo->Self; + } + + MenuInitRosMenuItemInfo(&ItemInfo); + if (! MenuGetRosMenuItemInfo(MenuInfo->Self, MenuInfo->FocusedItem, &ItemInfo)) + { + MenuCleanupRosMenuItemInfo(&ItemInfo); + return MenuInfo->Self; + } + if (0 == (ItemInfo.fType & MF_POPUP) || 0 != (ItemInfo.fState & (MF_GRAYED | MF_DISABLED))) + { + MenuCleanupRosMenuItemInfo(&ItemInfo); + return MenuInfo->Self; + } + + /* message must be sent before using item, + because nearly everything may be changed by the application ! */ + + /* Send WM_INITMENUPOPUP message only if TPM_NONOTIFY flag is not specified */ + if (0 == (Flags & TPM_NONOTIFY)) + { + SendMessageW(WndOwner, WM_INITMENUPOPUP, (WPARAM) ItemInfo.hSubMenu, + MAKELONG(MenuInfo->FocusedItem, IS_SYSTEM_MENU(MenuInfo))); + } + + if (! MenuGetRosMenuItemInfo(MenuInfo->Self, MenuInfo->FocusedItem, &ItemInfo)) + { + MenuCleanupRosMenuItemInfo(&ItemInfo); + return MenuInfo->Self; + } + Rect = ItemInfo.Rect; + + /* correct item if modified as a reaction to WM_INITMENUPOPUP message */ + if (0 == (ItemInfo.fState & MF_HILITE)) + { + if (0 != (MenuInfo->Flags & MF_POPUP)) + { + Dc = GetDC(MenuInfo->Wnd); + } + else + { + Dc = GetDCEx(MenuInfo->Wnd, 0, DCX_CACHE | DCX_WINDOW); + } + + SelectObject(Dc, hMenuFont); + + ItemInfo.fState |= MF_HILITE; + MenuSetRosMenuItemInfo(MenuInfo->Self, MenuInfo->FocusedItem, &ItemInfo); + MenuDrawMenuItem(MenuInfo->Wnd, MenuInfo, WndOwner, Dc, &ItemInfo, MenuInfo->Height, + ! (MenuInfo->Flags & MF_POPUP), ODA_DRAWENTIRE); + ReleaseDC(MenuInfo->Wnd, Dc); + } + + if (0 == ItemInfo.Rect.top && 0 == ItemInfo.Rect.left + && 0 == ItemInfo.Rect.bottom && 0 == ItemInfo.Rect.right) + { + ItemInfo.Rect = Rect; + } + + ItemInfo.fState |= MF_MOUSESELECT; + + MenuSetRosMenuItemInfo(MenuInfo->Self, MenuInfo->FocusedItem, &ItemInfo); + + if (IS_SYSTEM_MENU(MenuInfo)) + { +#if 0 /* FIXME */ + MENU_InitSysMenuPopup(item->hSubMenu, + GetWindowLongW( menu->hWnd, GWL_STYLE ), + GetClassLongW( menu->hWnd, GCL_STYLE)); + + NC_GetSysPopupPos( menu->hWnd, &rect ); + rect.top = rect.bottom; + rect.right = GetSystemMetrics(SM_CXSIZE); + rect.bottom = GetSystemMetrics(SM_CYSIZE); +#endif + } + else + { + GetWindowRect(MenuInfo->Wnd, &Rect); + if (0 != (MenuInfo->Flags & MF_POPUP)) + { + Rect.left += ItemInfo.Rect.right - GetSystemMetrics(SM_CXBORDER); + Rect.top += ItemInfo.Rect.top; + Rect.right = ItemInfo.Rect.left - ItemInfo.Rect.right + GetSystemMetrics(SM_CXBORDER); + Rect.bottom = ItemInfo.Rect.top - ItemInfo.Rect.bottom; + } + else + { + Rect.left += ItemInfo.Rect.left; + Rect.top += ItemInfo.Rect.bottom; + Rect.right = ItemInfo.Rect.right - ItemInfo.Rect.left; + Rect.bottom = ItemInfo.Rect.bottom - ItemInfo.Rect.top; + } + } + + MenuShowPopup(WndOwner, ItemInfo.hSubMenu, MenuInfo->FocusedItem, + Rect.left, Rect.top, Rect.right, Rect.bottom ); + if (SelectFirst) + { + MenuMoveSelection(WndOwner, ItemInfo.hSubMenu, ITEM_NEXT); + } + + Ret = ItemInfo.hSubMenu; + MenuCleanupRosMenuItemInfo(&ItemInfo); + + return Ret; +} + +/*********************************************************************** + * MenuHideSubPopups + * + * Hide the sub-popup menus of this menu. + */ +static void FASTCALL +MenuHideSubPopups(HWND WndOwner, PROSMENUINFO MenuInfo, BOOL SendMenuSelect) +{ + ROSMENUINFO SubMenuInfo; + ROSMENUITEMINFO ItemInfo; + + DPRINT("owner=%x menu=%x 0x%04x\n", WndOwner, MenuInfo, SendMenuSelect); + + if (NULL != MenuInfo && NULL != TopPopup && NO_SELECTED_ITEM != MenuInfo->FocusedItem) + { + MenuInitRosMenuItemInfo(&ItemInfo); + if (! MenuGetRosMenuItemInfo(MenuInfo->Self, MenuInfo->FocusedItem, &ItemInfo) + || 0 == (ItemInfo.fType & MF_POPUP) + || 0 == (ItemInfo.fState & MF_MOUSESELECT)) + { + MenuCleanupRosMenuItemInfo(&ItemInfo); + return; + } + ItemInfo.fState &= ~MF_MOUSESELECT; + MenuSetRosMenuItemInfo(MenuInfo->Self, MenuInfo->FocusedItem, &ItemInfo); + if (MenuGetRosMenuInfo(&SubMenuInfo, ItemInfo.hSubMenu)) + { + MenuHideSubPopups(WndOwner, &SubMenuInfo, FALSE); + MenuSelectItem(WndOwner, &SubMenuInfo, NO_SELECTED_ITEM, SendMenuSelect, NULL); + DestroyWindow(SubMenuInfo.Wnd); + SubMenuInfo.Wnd = NULL; + MenuSetRosMenuInfo(&SubMenuInfo); + } + } +} + +/*********************************************************************** + * MenuSwitchTracking + * + * Helper function for menu navigation routines. + */ +static void FASTCALL +MenuSwitchTracking(MTRACKER* Mt, PROSMENUINFO PtMenuInfo, UINT Index) +{ + ROSMENUINFO TopMenuInfo; + + DPRINT("%x menu=%x 0x%04x\n", Mt, PtMenuInfo->Self, Index); + + if (MenuGetRosMenuInfo(&TopMenuInfo, Mt->TopMenu) && + Mt->TopMenu != PtMenuInfo->Self && + 0 == ((PtMenuInfo->Flags | TopMenuInfo.Flags) & MF_POPUP)) + { + /* both are top level menus (system and menu-bar) */ + MenuHideSubPopups(Mt->OwnerWnd, &TopMenuInfo, FALSE); + MenuSelectItem(Mt->OwnerWnd, &TopMenuInfo, NO_SELECTED_ITEM, FALSE, NULL); + Mt->TopMenu = PtMenuInfo->Self; + } + else + { + MenuHideSubPopups(Mt->OwnerWnd, PtMenuInfo, FALSE); + } + + MenuSelectItem(Mt->OwnerWnd, PtMenuInfo, Index, TRUE, NULL); +} + +/*********************************************************************** + * MenuExecFocusedItem + * + * Execute a menu item (for instance when user pressed Enter). + * Return the wID of the executed item. Otherwise, -1 indicating + * that no menu item was executed; + * Have to receive the flags for the TrackPopupMenu options to avoid + * sending unwanted message. + * + */ +static INT FASTCALL +MenuExecFocusedItem(MTRACKER *Mt, PROSMENUINFO MenuInfo, UINT Flags) +{ + ROSMENUITEMINFO ItemInfo; + UINT wID; + + DPRINT("%p menu=%p\n", Mt, MenuInfo); + + if (0 == MenuInfo->MenuItemCount || NO_SELECTED_ITEM == MenuInfo->FocusedItem) + { + return -1; + } + + MenuInitRosMenuItemInfo(&ItemInfo); + if (! MenuGetRosMenuItemInfo(MenuInfo->Self, MenuInfo->FocusedItem, &ItemInfo)) + { + MenuCleanupRosMenuItemInfo(&ItemInfo); + return -1; + } + + DPRINT("%p %08x %p\n", MenuInfo, ItemInfo.wID, ItemInfo.hSubMenu); + + if (0 == (ItemInfo.fType & MF_POPUP)) + { + if (0 == (ItemInfo.fState & (MF_GRAYED | MF_DISABLED)) + && 0 == (ItemInfo.fType & MF_SEPARATOR)) + { + /* If TPM_RETURNCMD is set you return the id, but + do not send a message to the owner */ + if (0 == (Flags & TPM_RETURNCMD)) + { + if (0 != (MenuInfo->Flags & MF_SYSMENU)) + { + PostMessageW(Mt->OwnerWnd, WM_SYSCOMMAND, ItemInfo.wID, + MAKELPARAM((SHORT) Mt->Pt.x, (SHORT) Mt->Pt.y)); + } + else + { + PostMessageW(Mt->OwnerWnd, WM_COMMAND, ItemInfo.wID, 0); + } + } + wID = ItemInfo.wID; + MenuCleanupRosMenuItemInfo(&ItemInfo); + return wID; + } + } + else + { + Mt->CurrentMenu = MenuShowSubPopup(Mt->OwnerWnd, MenuInfo, TRUE, Flags); + } + + return -1; +} + +/*********************************************************************** + * MenuButtonDown + * + * Return TRUE if we can go on with menu tracking. + */ +static BOOL FASTCALL +MenuButtonDown(MTRACKER* Mt, HMENU PtMenu, UINT Flags) +{ + int Index; + ROSMENUINFO MenuInfo; + ROSMENUITEMINFO Item; + + DPRINT("%x PtMenu=%p\n", Mt, PtMenu); + + if (NULL != PtMenu) + { + if (! MenuGetRosMenuInfo(&MenuInfo, PtMenu)) + { + return FALSE; + } + if (IS_SYSTEM_MENU(&MenuInfo)) + { + Index = 0; + } + else + { + Index = NtUserMenuItemFromPoint(Mt->OwnerWnd, PtMenu, Mt->Pt.x, Mt->Pt.y); + } + MenuInitRosMenuItemInfo(&Item); + if (Index < 0 || ! MenuGetRosMenuItemInfo(PtMenu, Index, &Item)) + { + MenuCleanupRosMenuItemInfo(&Item); + return FALSE; + } + + if (MenuInfo.FocusedItem != Index) + { + MenuSwitchTracking(Mt, &MenuInfo, Index); + } + + /* If the popup menu is not already "popped" */ + if (0 == (Item.fState & MF_MOUSESELECT)) + { + Mt->CurrentMenu = MenuShowSubPopup(Mt->OwnerWnd, &MenuInfo, FALSE, Flags); + } + + MenuCleanupRosMenuItemInfo(&Item); + + return TRUE; + } + + /* else the click was on the menu bar, finish the tracking */ + + return FALSE; +} + +/*********************************************************************** + * MenuButtonUp + * + * Return the value of MenuExecFocusedItem if + * the selected item was not a popup. Else open the popup. + * A -1 return value indicates that we go on with menu tracking. + * + */ +static INT FASTCALL +MenuButtonUp(MTRACKER *Mt, HMENU PtMenu, UINT Flags) +{ + UINT Id; + ROSMENUINFO MenuInfo; + ROSMENUITEMINFO ItemInfo; + + DPRINT("%p hmenu=%x\n", Mt, PtMenu); + + if (NULL != PtMenu) + { + Id = 0; + if (! MenuGetRosMenuInfo(&MenuInfo, PtMenu)) + { + return -1; + } + + if (! IS_SYSTEM_MENU(&MenuInfo)) + { + Id = NtUserMenuItemFromPoint(Mt->OwnerWnd, MenuInfo.Self, Mt->Pt.x, Mt->Pt.y); + } + MenuInitRosMenuItemInfo(&ItemInfo); + if (0 <= Id && MenuGetRosMenuItemInfo(MenuInfo.Self, Id, &ItemInfo) && + MenuInfo.FocusedItem == Id) + { + if (0 == (ItemInfo.fType & MF_POPUP)) + { + MenuCleanupRosMenuItemInfo(&ItemInfo); + return MenuExecFocusedItem(Mt, &MenuInfo, Flags); + } + MenuCleanupRosMenuItemInfo(&ItemInfo); + + /* If we are dealing with the top-level menu */ + /* and this is a click on an already "popped" item: */ + /* Stop the menu tracking and close the opened submenus */ + if (Mt->TopMenu == MenuInfo.Self && MenuInfo.TimeToHide) + { + MenuCleanupRosMenuItemInfo(&ItemInfo); + return 0; + } + } + MenuCleanupRosMenuItemInfo(&ItemInfo); + MenuInfo.TimeToHide = TRUE; + MenuSetRosMenuInfo(&MenuInfo); + } + + return -1; +} + +/*********************************************************************** + * MenuPtMenu + * + * Walks menu chain trying to find a menu pt maps to. + */ +static HMENU FASTCALL +MenuPtMenu(HMENU Menu, POINT Pt) +{ + extern LRESULT DefWndNCHitTest(HWND hWnd, POINT Point); + ROSMENUINFO MenuInfo; + ROSMENUITEMINFO ItemInfo; + HMENU Ret = NULL; + INT Ht; + + if (! MenuGetRosMenuInfo(&MenuInfo, Menu)) + { + return NULL; + } + + /* try subpopup first (if any) */ + if (NO_SELECTED_ITEM != MenuInfo.FocusedItem) + { + MenuInitRosMenuItemInfo(&ItemInfo); + if (MenuGetRosMenuItemInfo(MenuInfo.Self, MenuInfo.FocusedItem, &ItemInfo) && + 0 != (ItemInfo.fType & MF_POPUP) && + 0 != (ItemInfo.fState & MF_MOUSESELECT)) + { + Ret = MenuPtMenu(ItemInfo.hSubMenu, Pt); + if (NULL != Ret) + { + MenuCleanupRosMenuItemInfo(&ItemInfo); + return Ret; + } + } + MenuCleanupRosMenuItemInfo(&ItemInfo); + } + + /* check the current window (avoiding WM_HITTEST) */ + Ht = DefWndNCHitTest(MenuInfo.Wnd, Pt); + if (0 != (MenuInfo.Flags & MF_POPUP )) + { + if (HTNOWHERE != Ht && HTERROR != Ht) + { + Ret = Menu; + } + } + else if (HTSYSMENU == Ht) + { +#if 0 /* FIXME */ + Ret = get_win_sys_menu( menu->hWnd ); +#else + Ret = NULL; +#endif + } + else if (HTMENU == Ht) + { + Ret = GetMenu(MenuInfo.Wnd); + } + + return Ret; +} + +/*********************************************************************** + * MenuMouseMove + * + * Return TRUE if we can go on with menu tracking. + */ +static BOOL FASTCALL +MenuMouseMove(MTRACKER *Mt, HMENU PtMenu, UINT Flags) +{ + UINT Index; + ROSMENUINFO MenuInfo; + + if (NULL != PtMenu) + { + if (! MenuGetRosMenuInfo(&MenuInfo, PtMenu)) + { + return TRUE; + } + if (IS_SYSTEM_MENU(&MenuInfo)) + { + Index = 0; + } + else + { + Index = NtUserMenuItemFromPoint(Mt->OwnerWnd, PtMenu, Mt->Pt.x, Mt->Pt.y); + } + } + else + { + Index = NO_SELECTED_ITEM; + } + + if (NO_SELECTED_ITEM == Index) + { + if (Mt->CurrentMenu == MenuInfo.Self || + MenuGetRosMenuInfo(&MenuInfo, Mt->CurrentMenu)) + { + MenuSelectItem(Mt->OwnerWnd, &MenuInfo, NO_SELECTED_ITEM, + TRUE, Mt->TopMenu); + } + } + else if (MenuInfo.FocusedItem != Index) + { + MenuSwitchTracking(Mt, &MenuInfo, Index); + Mt->CurrentMenu = MenuShowSubPopup(Mt->OwnerWnd, &MenuInfo, FALSE, Flags); + } + + return TRUE; +} + +/*********************************************************************** + * MenuTrackMenu + * + * Menu tracking code. + */ +static INT FASTCALL +MenuTrackMenu(HMENU Menu, UINT Flags, INT x, INT y, + HWND Wnd, const RECT *Rect ) +{ + MSG Msg; + ROSMENUINFO MenuInfo; + BOOL fRemove; + INT ExecutedMenuId = -1; + MTRACKER Mt; + BOOL EnterIdleSent = FALSE; + + Mt.TrackFlags = 0; + Mt.CurrentMenu = Menu; + Mt.TopMenu = Menu; + Mt.OwnerWnd = Wnd; + Mt.Pt.x = x; + Mt.Pt.y = y; + + DPRINT("Menu=%x Flags=0x%08x (%d,%d) Wnd=%x (%ld,%ld)-(%ld,%ld)\n", + Menu, Flags, x, y, Wnd, Rect ? Rect->left : 0, Rect ? Rect->top : 0, + Rect ? Rect->right : 0, Rect ? Rect->bottom : 0); + + fEndMenu = FALSE; + if (! MenuGetRosMenuInfo(&MenuInfo, Menu)) + { + return FALSE; + } + + if (0 != (Flags & TPM_BUTTONDOWN)) + { + /* Get the result in order to start the tracking or not */ + fRemove = MenuButtonDown(&Mt, Menu, Flags); + fEndMenu = ! fRemove; + } + + SetCapture(Mt.OwnerWnd); + + while (! fEndMenu) + { + /* we have to keep the message in the queue until it's + * clear that menu loop is not over yet. */ + + for (;;) + { + if (PeekMessageW(&Msg, 0, 0, 0, PM_NOREMOVE)) + { + if (! CallMsgFilterW(&Msg, MSGF_MENU)) + { + break; + } + /* remove the message from the queue */ + PeekMessageW(&Msg, 0, Msg.message, Msg.message, PM_REMOVE ); + } + else + { + if (! EnterIdleSent) + { + HWND Win = (0 != (Flags & TPM_ENTERIDLEEX) + && 0 != (MenuInfo.Flags & MF_POPUP)) ? MenuInfo.Wnd : NULL; + EnterIdleSent = TRUE; + SendMessageW(Mt.OwnerWnd, WM_ENTERIDLE, MSGF_MENU, (LPARAM) Win); + } + WaitMessage(); + } + } + + /* check if EndMenu() tried to cancel us, by posting this message */ + if (WM_CANCELMODE == Msg.message) + { + /* we are now out of the loop */ + fEndMenu = TRUE; + + /* remove the message from the queue */ + PeekMessageW(&Msg, 0, Msg.message, Msg.message, PM_REMOVE); + + /* break out of internal loop, ala ESCAPE */ + break; + } + + TranslateMessage(&Msg); + Mt.Pt = Msg.pt; + + if (Msg.hwnd == MenuInfo.Wnd || WM_TIMER != Msg.message) + { + EnterIdleSent = FALSE; + } + + fRemove = FALSE; + if (WM_MOUSEFIRST <= Msg.message && Msg.message <= WM_MOUSELAST) + { + /* + * Use the mouse coordinates in lParam instead of those in the MSG + * struct to properly handle synthetic messages. They are already + * in screen coordinates. + */ + Mt.Pt.x = (short) LOWORD(Msg.lParam); + Mt.Pt.y = (short) HIWORD(Msg.lParam); + + /* Find a menu for this mouse event */ + Menu = MenuPtMenu(Mt.TopMenu, Mt.Pt); + + switch(Msg.message) + { + /* no WM_NC... messages in captured state */ + + case WM_RBUTTONDBLCLK: + case WM_RBUTTONDOWN: + if (0 == (Flags & TPM_RIGHTBUTTON)) + { + break; + } + /* fall through */ + case WM_LBUTTONDBLCLK: + case WM_LBUTTONDOWN: + /* If the message belongs to the menu, removes it from the queue */ + /* Else, end menu tracking */ + fRemove = MenuButtonDown(&Mt, Menu, Flags); + fEndMenu = ! fRemove; + break; + + case WM_RBUTTONUP: + if (0 == (Flags & TPM_RIGHTBUTTON)) + { + break; + } + /* fall through */ + case WM_LBUTTONUP: + /* Check if a menu was selected by the mouse */ + if (NULL != Menu) + { + ExecutedMenuId = MenuButtonUp(&Mt, Menu, Flags); + + /* End the loop if ExecutedMenuId is an item ID */ + /* or if the job was done (ExecutedMenuId = 0). */ + fEndMenu = fRemove = (-1 != ExecutedMenuId); + } + else + { + /* No menu was selected by the mouse */ + /* if the function was called by TrackPopupMenu, continue + with the menu tracking. If not, stop it */ + fEndMenu = (0 != (Flags & TPM_POPUPMENU) ? FALSE : TRUE); + } + break; + + case WM_MOUSEMOVE: + if (Menu) + { + fEndMenu |= ! MenuMouseMove(&Mt, Menu, Flags); + } + break; + + } /* switch(Msg.message) - mouse */ + } + else if (WM_KEYFIRST <= Msg.message && Msg.message <= WM_KEYLAST) + { +#if 0 /* FIXME */ + fRemove = TRUE; /* Keyboard messages are always removed */ + switch(msg.message) + { + case WM_KEYDOWN: + switch(msg.wParam) + { + case VK_HOME: + case VK_END: + MENU_SelectItem( mt.hOwnerWnd, mt.hCurrentMenu, + NO_SELECTED_ITEM, FALSE, 0 ); + /* fall through */ + case VK_UP: + MENU_MoveSelection( mt.hOwnerWnd, mt.hCurrentMenu, + (msg.wParam == VK_HOME)? ITEM_NEXT : ITEM_PREV ); + break; + + case VK_DOWN: /* If on menu bar, pull-down the menu */ + + menu = MENU_GetMenu( mt.hCurrentMenu ); + if (!(menu->wFlags & MF_POPUP)) + mt.hCurrentMenu = MENU_ShowSubPopup(mt.hOwnerWnd, mt.hTopMenu, TRUE, wFlags); + else /* otherwise try to move selection */ + MENU_MoveSelection( mt.hOwnerWnd, mt.hCurrentMenu, ITEM_NEXT ); + break; + + case VK_LEFT: + MENU_KeyLeft( &mt, wFlags ); + break; + + case VK_RIGHT: + MENU_KeyRight( &mt, wFlags ); + break; + + case VK_ESCAPE: + fEndMenu = MENU_KeyEscape(&mt, wFlags); + break; + + case VK_F1: + { + HELPINFO hi; + hi.cbSize = sizeof(HELPINFO); + hi.iContextType = HELPINFO_MENUITEM; + if (menu->FocusedItem == NO_SELECTED_ITEM) + hi.iCtrlId = 0; + else + hi.iCtrlId = menu->items[menu->FocusedItem].wID; + hi.hItemHandle = hmenu; + hi.dwContextId = menu->dwContextHelpID; + hi.MousePos = msg.pt; + SendMessageW(hwnd, WM_HELP, 0, (LPARAM)&hi); + break; + } + + default: + break; + } + break; /* WM_KEYDOWN */ + + case WM_SYSKEYDOWN: + switch(msg.wParam) + { + case VK_MENU: + fEndMenu = TRUE; + break; + + } + break; /* WM_SYSKEYDOWN */ + + case WM_CHAR: + { + UINT pos; + + if (msg.wParam == '\r' || msg.wParam == ' ') + { + ExecutedMenuId = MENU_ExecFocusedItem(&mt,mt.hCurrentMenu, wFlags); + fEndMenu = (ExecutedMenuId != -1); + + break; + } + + /* Hack to avoid control chars. */ + /* We will find a better way real soon... */ + if (msg.wParam < 32) break; + + pos = MENU_FindItemByKey( mt.hOwnerWnd, mt.hCurrentMenu, + LOWORD(msg.wParam), FALSE ); + if (pos == (UINT)-2) fEndMenu = TRUE; + else if (pos == (UINT)-1) MessageBeep(0); + else + { + MENU_SelectItem( mt.hOwnerWnd, mt.hCurrentMenu, pos, + TRUE, 0 ); + ExecutedMenuId = MENU_ExecFocusedItem(&mt,mt.hCurrentMenu, wFlags); + fEndMenu = (ExecutedMenuId != -1); + } + } + break; + } /* switch(msg.message) - kbd */ +#endif + } + else + { + DispatchMessageW(&Msg); + } + + if (! fEndMenu) + { + fRemove = TRUE; + } + + /* finally remove message from the queue */ + + if (fRemove && 0 == (Mt.TrackFlags & TF_SKIPREMOVE)) + { + PeekMessageW(&Msg, 0, Msg.message, Msg.message, PM_REMOVE); + } + else + { + Mt.TrackFlags &= ~TF_SKIPREMOVE; + } + } + + SetCapture(NULL); /* release the capture */ + + /* If dropdown is still painted and the close box is clicked on + then the menu will be destroyed as part of the DispatchMessage above. + This will then invalidate the menu handle in Mt.hTopMenu. We should + check for this first. */ + if (IsMenu(Mt.TopMenu)) + { + if (IsWindow(Mt.OwnerWnd)) + { + if (MenuGetRosMenuInfo(&MenuInfo, Mt.TopMenu)) + { + MenuHideSubPopups(Mt.OwnerWnd, &MenuInfo, FALSE); + + if (0 != (MenuInfo.Flags & MF_POPUP)) + { + DestroyWindow(MenuInfo.Wnd); + MenuInfo.Wnd = NULL; + } + MenuSelectItem(Mt.OwnerWnd, &MenuInfo, NO_SELECTED_ITEM, FALSE, NULL); + } + + SendMessageW(Mt.OwnerWnd, WM_MENUSELECT, MAKELONG(0, 0xffff), 0); + } + + if (MenuGetRosMenuInfo(&MenuInfo, Mt.TopMenu)) + { + /* Reset the variable for hiding menu */ + MenuInfo.TimeToHide = FALSE; + MenuSetRosMenuInfo(&MenuInfo); + } + } + + /* The return value is only used by TrackPopupMenu */ + return (-1 != ExecutedMenuId) ? ExecutedMenuId : 0; +} + +/*********************************************************************** + * MenuExitTracking + */ +static BOOL FASTCALL +MenuExitTracking(HWND Wnd) +{ + DPRINT("hwnd=%p\n", hWnd); + + SendMessageW(Wnd, WM_EXITMENULOOP, 0, 0); + ShowCaret(0); + return TRUE; +} + VOID -MenuTrackMouseMenuBar(HWND hWnd, ULONG Ht, POINT Pt) +MenuTrackMouseMenuBar(HWND Wnd, ULONG Ht, POINT Pt) { - int Item = NtUserMenuItemFromPoint(hWnd, GetMenu(hWnd), Pt.x, Pt.y); - - if(Item > -1) - { - /* FIXME */ - } +#if 0 /* FIXME */ + HMENU Menu = (ht == HTSYSMENU) ? get_win_sys_menu( Wnd ) : GetMenu( Wnd ); + UINT Flags = TPM_ENTERIDLEEX | TPM_BUTTONDOWN | TPM_LEFTALIGN | TPM_LEFTBUTTON; +#else + HMENU Menu; + UINT Flags = TPM_ENTERIDLEEX | TPM_BUTTONDOWN | TPM_LEFTALIGN | TPM_LEFTBUTTON; + + if (HTSYSMENU == Ht) + { + return; + } + Menu = GetMenu(Wnd); +#endif + + DPRINT("wnd=%p ht=0x%04x (%ld,%ld)\n", Wnd, Ht, pt.x, pt.y); + + if (IsMenu(Menu)) + { + /* map point to parent client coordinates */ + HWND Parent = GetAncestor(Wnd, GA_PARENT ); + if (Parent != GetDesktopWindow()) + { + ScreenToClient(Parent, &Pt); + } + + MenuInitTracking(Wnd, Menu, FALSE, Flags); + MenuTrackMenu(Menu, Flags, Pt.x, Pt.y, Wnd, NULL); + MenuExitTracking(Wnd); + } } @@ -536,7 +2756,7 @@ MenuTrackKbdMenuBar(HWND hWnd, ULONG wParam, ULONG Key) /*static BOOL MenuIsStringItem(ULONG TypeData) { - return((TypeData & MENU_TYPE_MASK) == MF_STRING); + return(MF_STRING == MENU_ITEM_TYPE(ItemInfo->fType)); }*/ @@ -729,7 +2949,7 @@ BOOL STDCALL GetMenuInfo(HMENU hmenu, LPMENUINFO lpcmi) { - MENUINFO mi; + ROSMENUINFO mi; BOOL res = FALSE; if(!lpcmi || (lpcmi->cbSize != sizeof(MENUINFO))) @@ -763,18 +2983,24 @@ UINT STDCALL GetMenuItemID(HMENU hMenu, int nPos) { - MENUITEMINFOW mii; + ROSMENUITEMINFO mii; mii.cbSize = sizeof(MENUITEMINFOW); mii.fMask = MIIM_ID | MIIM_SUBMENU; - if(!NtUserMenuItemInfo(hMenu, nPos, MF_BYPOSITION, &mii, FALSE)) - { - return -1; - } + if (! NtUserMenuItemInfo(hMenu, nPos, MF_BYPOSITION, &mii, FALSE)) + { + return -1; + } - if(mii.hSubMenu) return -1; - if(mii.wID == 0) return -1; + if (NULL != mii.hSubMenu) + { + return -1; + } + if (0 == mii.wID) + { + return -1; + } return mii.wID; } @@ -835,28 +3061,29 @@ GetMenuState( UINT uId, UINT uFlags) { - MENUITEMINFOW mii; + ROSMENUITEMINFO mii; + mii.cbSize = sizeof(MENUITEMINFOW); mii.fMask = MIIM_STATE | MIIM_TYPE | MIIM_SUBMENU; SetLastError(0); if(NtUserMenuItemInfo(hMenu, uId, uFlags, &mii, FALSE)) - { - UINT nSubItems = 0; - if(mii.hSubMenu) { - nSubItems = (UINT)NtUserBuildMenuItemList(mii.hSubMenu, NULL, 0, 0); + UINT nSubItems = 0; + if(mii.hSubMenu) + { + nSubItems = (UINT)NtUserBuildMenuItemList(mii.hSubMenu, NULL, 0, 0); - /* FIXME - ported from wine, does that work (0xff)? */ - if(GetLastError() != ERROR_INVALID_MENU_HANDLE) - return (nSubItems << 8) | ((mii.fState | mii.fType) & 0xff); + /* FIXME - ported from wine, does that work (0xff)? */ + if(GetLastError() != ERROR_INVALID_MENU_HANDLE) + return (nSubItems << 8) | ((mii.fState | mii.fType) & 0xff); - return (UINT)-1; /* Invalid submenu */ - } + return (UINT)-1; /* Invalid submenu */ + } - /* FIXME - ported from wine, does that work? */ - return (mii.fType | mii.fState); - } + /* FIXME - ported from wine, does that work? */ + return (mii.fType | mii.fState); + } return (UINT)-1; } @@ -905,13 +3132,16 @@ GetSubMenu( HMENU hMenu, int nPos) { - MENUITEMINFOW mi; - mi.cbSize = sizeof(mi); + ROSMENUITEMINFO mi; + + mi.cbSize = sizeof(MENUITEMINFOW); mi.fMask = MIIM_SUBMENU; - if(NtUserMenuItemInfo(hMenu, (UINT)nPos, MF_BYPOSITION, &mi, FALSE)) - { - return mi.hSubMenu; - } + + if (NtUserMenuItemInfo(hMenu, (UINT)nPos, MF_BYPOSITION, &mi, FALSE)) + { + return mi.hSubMenu; + } + return (HMENU)0; } @@ -1140,8 +3370,10 @@ InsertMenuW( } mii.dwTypeData = (LPWSTR)lpNewItem; + mii.cch = (NULL == lpNewItem ? 0 : wcslen(lpNewItem)); if(uFlags & MF_POPUP) { + mii.fType |= MF_POPUP; mii.fMask |= MIIM_SUBMENU; mii.hSubMenu = (HMENU)uIDNewItem; } @@ -1162,10 +3394,7 @@ STDCALL IsMenu( HMENU hMenu) { - DWORD ret; - SetLastError(ERROR_SUCCESS); - ret = NtUserBuildMenuItemList(hMenu, NULL, 0, 0); - return ((ret == (DWORD)-1) || (GetLastError() == ERROR_INVALID_MENU_HANDLE)); + return 0 <= NtUserBuildMenuItemList(hMenu, NULL, 0, 0); } @@ -1349,7 +3578,7 @@ SetMenuInfo( HMENU hmenu, LPCMENUINFO lpcmi) { - MENUINFO mi; + ROSMENUINFO mi; BOOL res = FALSE; if(lpcmi->cbSize != sizeof(MENUINFO)) return res; @@ -1471,8 +3700,8 @@ DWORD STDCALL GetMenuContextHelpId(HMENU hmenu) { - MENUINFO mi; - mi.cbSize = sizeof(MENUINFO); + ROSMENUINFO mi; + mi.cbSize = sizeof(ROSMENUINFO); mi.fMask = MIM_HELPID; if(NtUserMenuInfo(hmenu, &mi, FALSE)) diff --git a/reactos/subsys/win32k/include/menu.h b/reactos/subsys/win32k/include/menu.h index 70ec63c1f36..83ce0984df6 100644 --- a/reactos/subsys/win32k/include/menu.h +++ b/reactos/subsys/win32k/include/menu.h @@ -3,6 +3,7 @@ #include #include +#include #define IS_ATOM(x) \ (((ULONG_PTR)(x) > 0x0) && ((ULONG_PTR)(x) < 0x10000)) @@ -27,21 +28,17 @@ typedef struct _MENU_ITEM UNICODE_STRING Text; HBITMAP hbmpItem; RECT Rect; + UINT XTab; } MENU_ITEM, *PMENU_ITEM; typedef struct _MENU_OBJECT { - HANDLE Self; PW32PROCESS W32Process; LIST_ENTRY ListEntry; - int MenuItemCount; FAST_MUTEX MenuItemsLock; PMENU_ITEM MenuItemList; - MENUINFO MenuInfo; + ROSMENUINFO MenuInfo; BOOL RtoL; - BOOL IsSystemMenu; - BOOL IsMenuBar; - int Height; } MENU_OBJECT, *PMENU_OBJECT; PMENU_OBJECT FASTCALL @@ -77,27 +74,17 @@ BOOL FASTCALL IntSetMenuContextHelpId(PMENU_OBJECT MenuObject, DWORD dwContextHelpId); BOOL FASTCALL -IntGetMenuInfo(PMENU_OBJECT MenuObject, LPMENUINFO lpmi); +IntGetMenuInfo(PMENU_OBJECT MenuObject, PROSMENUINFO lpmi); BOOL FASTCALL IntIsMenu(HMENU hMenu); BOOL FASTCALL -IntSetMenuInfo(PMENU_OBJECT MenuObject, LPMENUINFO lpmi); +IntSetMenuInfo(PMENU_OBJECT MenuObject, PROSMENUINFO lpmi); int FASTCALL IntGetMenuItemByFlag(PMENU_OBJECT MenuObject, UINT uSearchBy, UINT fFlag, PMENU_ITEM *MenuItem, PMENU_ITEM *PrevMenuItem); - -BOOL FASTCALL -IntGetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, LPMENUITEMINFOW lpmii); - -BOOL FASTCALL -IntSetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, LPCMENUITEMINFOW lpmii); - -BOOL FASTCALL -IntInsertMenuItem(PMENU_OBJECT MenuObject, UINT uItem, BOOL fByPosition, - LPCMENUITEMINFOW lpmii); UINT FASTCALL IntEnableMenuItem(PMENU_OBJECT MenuObject, UINT uIDEnableItem, UINT uEnable); diff --git a/reactos/subsys/win32k/ntuser/menu.c b/reactos/subsys/win32k/ntuser/menu.c index 472fb296594..d8625ed601a 100644 --- a/reactos/subsys/win32k/ntuser/menu.c +++ b/reactos/subsys/win32k/ntuser/menu.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: menu.c,v 1.43 2004/01/26 23:22:48 weiden Exp $ +/* $Id: menu.c,v 1.44 2004/02/15 07:39:12 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -71,6 +71,11 @@ } else { \ (state) &= ~MFS_DEFAULT; \ } \ + if((change) & MF_MOUSESELECT) { \ + (state) |= MF_MOUSESELECT; \ + } else { \ + (state) &= ~MF_MOUSESELECT; \ + } \ } #define FreeMenuText(MenuItem) \ @@ -171,7 +176,7 @@ IntFreeMenuItem(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, if(RemoveFromList) { /* FIXME - Remove from List */ - MenuObject->MenuItemCount--; + MenuObject->MenuInfo.MenuItemCount--; } if(bRecurse && MenuItem->hSubMenu) { @@ -225,7 +230,7 @@ IntDeleteMenuItems(PMENU_OBJECT MenuObject, BOOL bRecurse) CurItem = NextItem; res++; } - MenuObject->MenuItemCount = 0; + MenuObject->MenuInfo.MenuItemCount = 0; MenuObject->MenuItemList = NULL; return res; } @@ -248,7 +253,7 @@ IntDestroyMenuObject(PMENU_OBJECT MenuObject, ExReleaseFastMutexUnsafe(&MenuObject->W32Process->MenuListLock); } - ObmCloseHandle(MenuObject->W32Process->WindowStation->HandleTable, MenuObject->Self); + ObmCloseHandle(MenuObject->W32Process->WindowStation->HandleTable, MenuObject->MenuInfo.Self); return TRUE; } @@ -271,8 +276,6 @@ IntCreateMenu(PHANDLE Handle, BOOL IsMenuBar) return NULL; } - MenuObject->Self = *Handle; - MenuObject->IsMenuBar = IsMenuBar; MenuObject->W32Process = Win32Process; MenuObject->RtoL = FALSE; /* default */ MenuObject->MenuInfo.cbSize = sizeof(MENUINFO); /* not used */ @@ -283,8 +286,16 @@ IntCreateMenu(PHANDLE Handle, BOOL IsMenuBar) NtGdiCreateSolidBrush(RGB(192, 192, 192)); /* FIXME: default background color */ MenuObject->MenuInfo.dwContextHelpID = 0; /* default */ MenuObject->MenuInfo.dwMenuData = 0; /* default */ + MenuObject->MenuInfo.Self = *Handle; + MenuObject->MenuInfo.FocusedItem = NO_SELECTED_ITEM; + MenuObject->MenuInfo.Flags = (IsMenuBar ? 0 : MF_POPUP); + MenuObject->MenuInfo.Wnd = NULL; + MenuObject->MenuInfo.WndOwner = NULL; + MenuObject->MenuInfo.Height = 0; + MenuObject->MenuInfo.Width = 0; + MenuObject->MenuInfo.TimeToHide = FALSE; - MenuObject->MenuItemCount = 0; + MenuObject->MenuInfo.MenuItemCount = 0; MenuObject->MenuItemList = NULL; ExInitializeFastMutex(&MenuObject->MenuItemsLock); @@ -302,7 +313,7 @@ IntCloneMenuItems(PMENU_OBJECT Destination, PMENU_OBJECT Source) PMENU_ITEM MenuItem, NewMenuItem = NULL; PMENU_ITEM Old = NULL; - if(!Source->MenuItemCount) + if(!Source->MenuInfo.MenuItemCount) return FALSE; ExAcquireFastMutexUnsafe(&Destination->MenuItemsLock); @@ -354,7 +365,7 @@ IntCloneMenuItems(PMENU_OBJECT Destination, PMENU_OBJECT Source) Old->Next = NewMenuItem; else Destination->MenuItemList = NewMenuItem; - Destination->MenuItemCount++; + Destination->MenuInfo.MenuItemCount++; MenuItem = MenuItem->Next; } @@ -379,7 +390,6 @@ IntCloneMenu(PMENU_OBJECT Source) if(!MenuObject) return NULL; - MenuObject->Self = Handle; MenuObject->W32Process = Process; MenuObject->RtoL = Source->RtoL; MenuObject->MenuInfo.cbSize = sizeof(MENUINFO); /* not used */ @@ -389,8 +399,15 @@ IntCloneMenu(PMENU_OBJECT Source) MenuObject->MenuInfo.hbrBack = Source->MenuInfo.hbrBack; MenuObject->MenuInfo.dwContextHelpID = Source->MenuInfo.dwContextHelpID; MenuObject->MenuInfo.dwMenuData = Source->MenuInfo.dwMenuData; + MenuObject->MenuInfo.Self = Handle; + MenuObject->MenuInfo.FocusedItem = NO_SELECTED_ITEM; + MenuObject->MenuInfo.Wnd = NULL; + MenuObject->MenuInfo.WndOwner = NULL; + MenuObject->MenuInfo.Height = 0; + MenuObject->MenuInfo.Width = 0; + MenuObject->MenuInfo.TimeToHide = FALSE; - MenuObject->MenuItemCount = 0; + MenuObject->MenuInfo.MenuItemCount = 0; MenuObject->MenuItemList = NULL; ExInitializeFastMutex(&MenuObject->MenuItemsLock); @@ -419,23 +436,26 @@ IntSetMenuContextHelpId(PMENU_OBJECT MenuObject, DWORD dwContextHelpId) } BOOL FASTCALL -IntGetMenuInfo(PMENU_OBJECT MenuObject, LPMENUINFO lpmi) +IntGetMenuInfo(PMENU_OBJECT MenuObject, PROSMENUINFO lpmi) { - if(MenuObject) - { - if(lpmi->fMask & MIM_BACKGROUND) - lpmi->hbrBack = MenuObject->MenuInfo.hbrBack; - if(lpmi->fMask & MIM_HELPID) - lpmi->dwContextHelpID = MenuObject->MenuInfo.dwContextHelpID; - if(lpmi->fMask & MIM_MAXHEIGHT) - lpmi->cyMax = MenuObject->MenuInfo.cyMax; - if(lpmi->fMask & MIM_MENUDATA) - lpmi->dwMenuData = MenuObject->MenuInfo.dwMenuData; - if(lpmi->fMask & MIM_STYLE) - lpmi->dwStyle = MenuObject->MenuInfo.dwStyle; - return TRUE; - } - return FALSE; + if(lpmi->fMask & MIM_BACKGROUND) + lpmi->hbrBack = MenuObject->MenuInfo.hbrBack; + if(lpmi->fMask & MIM_HELPID) + lpmi->dwContextHelpID = MenuObject->MenuInfo.dwContextHelpID; + if(lpmi->fMask & MIM_MAXHEIGHT) + lpmi->cyMax = MenuObject->MenuInfo.cyMax; + if(lpmi->fMask & MIM_MENUDATA) + lpmi->dwMenuData = MenuObject->MenuInfo.dwMenuData; + if(lpmi->fMask & MIM_STYLE) + lpmi->dwStyle = MenuObject->MenuInfo.dwStyle; + if (sizeof(MENUINFO) < lpmi->cbSize) + { + RtlCopyMemory((char *) lpmi + sizeof(MENUINFO), + (char *) &MenuObject->MenuInfo + sizeof(MENUINFO), + lpmi->cbSize - sizeof(MENUINFO)); + } + + return TRUE; } @@ -454,7 +474,7 @@ IntIsMenu(HMENU hMenu) BOOL FASTCALL -IntSetMenuInfo(PMENU_OBJECT MenuObject, LPMENUINFO lpmi) +IntSetMenuInfo(PMENU_OBJECT MenuObject, PROSMENUINFO lpmi) { if(lpmi->fMask & MIM_BACKGROUND) MenuObject->MenuInfo.hbrBack = lpmi->hbrBack; @@ -467,9 +487,19 @@ IntSetMenuInfo(PMENU_OBJECT MenuObject, LPMENUINFO lpmi) if(lpmi->fMask & MIM_STYLE) MenuObject->MenuInfo.dwStyle = lpmi->dwStyle; if(lpmi->fMask & MIM_APPLYTOSUBMENUS) - { + { /* FIXME */ - } + } + if (sizeof(MENUINFO) < lpmi->cbSize) + { + MenuObject->MenuInfo.FocusedItem = lpmi->FocusedItem; + MenuObject->MenuInfo.Height = lpmi->Height; + MenuObject->MenuInfo.Width = lpmi->Width; + MenuObject->MenuInfo.Wnd = lpmi->Wnd; + MenuObject->MenuInfo.WndOwner = lpmi->WndOwner; + MenuObject->MenuInfo.TimeToHide = lpmi->TimeToHide; + } + return TRUE; } @@ -582,56 +612,86 @@ IntInsertMenuItemToList(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, int pos) MenuItem->Next = NULL; } } - MenuObject->MenuItemCount++; + MenuObject->MenuInfo.MenuItemCount++; return npos; } BOOL FASTCALL -IntGetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, LPMENUITEMINFOW lpmii) +IntGetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, PROSMENUITEMINFO lpmii) { - if(!MenuItem || !MenuObject || !lpmii) - { - return FALSE; - } - - lpmii->cch = MenuItem->Text.Length; + UNICODE_STRING Text; + NTSTATUS Status; + + lpmii->cch = MenuItem->Text.Length / sizeof(WCHAR); if(lpmii->fMask & MIIM_BITMAP) - { - lpmii->hbmpItem = MenuItem->hbmpItem; - } + { + lpmii->hbmpItem = MenuItem->hbmpItem; + } if(lpmii->fMask & MIIM_CHECKMARKS) - { - lpmii->hbmpChecked = MenuItem->hbmpChecked; - lpmii->hbmpUnchecked = MenuItem->hbmpUnchecked; - } + { + lpmii->hbmpChecked = MenuItem->hbmpChecked; + lpmii->hbmpUnchecked = MenuItem->hbmpUnchecked; + } if(lpmii->fMask & MIIM_DATA) - { - lpmii->dwItemData = MenuItem->dwItemData; - } + { + lpmii->dwItemData = MenuItem->dwItemData; + } if(lpmii->fMask & (MIIM_FTYPE | MIIM_TYPE)) - { - lpmii->fType = MenuItem->fType; - } + { + lpmii->fType = MenuItem->fType; + } if(lpmii->fMask & MIIM_ID) - { - lpmii->wID = MenuItem->wID; - } + { + lpmii->wID = MenuItem->wID; + } if(lpmii->fMask & MIIM_STATE) - { - lpmii->fState = MenuItem->fState; - } + { + lpmii->fState = MenuItem->fState; + } if(lpmii->fMask & MIIM_SUBMENU) - { - lpmii->hSubMenu = MenuItem->hSubMenu; - } + { + lpmii->hSubMenu = MenuItem->hSubMenu; + } + if (0 != (lpmii->fMask & MIIM_STRING) || + 0 != (lpmii->fMask & MIIM_TYPE)) + { + Status = MmCopyFromCaller(&Text, lpmii->dwTypeData, sizeof(UNICODE_STRING)); + if (! NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return FALSE; + } + Text.Length = min(Text.MaximumLength, MenuItem->Text.Length); + if (0 != Text.Length) + { + Status = MmCopyToCaller(Text.Buffer, MenuItem->Text.Buffer, Text.Length); + if (! NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return FALSE; + } + } + Status = MmCopyToCaller(lpmii->dwTypeData, &Text, sizeof(UNICODE_STRING)); + if (! NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return FALSE; + } + } + + if (sizeof(ROSMENUITEMINFO) == lpmii->cbSize) + { + lpmii->Rect = MenuItem->Rect; + lpmii->XTab = MenuItem->XTab; + } return TRUE; } BOOL FASTCALL -IntSetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, LPCMENUITEMINFOW lpmii) +IntSetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, PROSMENUITEMINFO lpmii) { PUNICODE_STRING Source; UINT copylen = 0; @@ -710,43 +770,52 @@ IntSetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, LPCMENUITEMINFO { RtlInitUnicodeString(&MenuItem->Text, NULL); } + + if (sizeof(ROSMENUITEMINFO) == lpmii->cbSize) + { + MenuItem->Rect = lpmii->Rect; + MenuItem->XTab = lpmii->XTab; + } return TRUE; } -BOOL FASTCALL +static BOOL FASTCALL IntInsertMenuItem(PMENU_OBJECT MenuObject, UINT uItem, BOOL fByPosition, - LPCMENUITEMINFOW lpmii) + PROSMENUITEMINFO ItemInfo) { int pos = (int)uItem; PMENU_ITEM MenuItem; - if(MenuObject->MenuItemCount >= MAX_MENU_ITEMS) - { - /* FIXME Set last error code? */ - SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; - } + if (MAX_MENU_ITEMS <= MenuObject->MenuInfo.MenuItemCount) + { + SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } - if(fByPosition) - { - /* calculate position */ - if(pos > MenuObject->MenuItemCount) - pos = MenuObject->MenuItemCount; - } + if (fByPosition) + { + /* calculate position */ + if(MenuObject->MenuInfo.MenuItemCount < pos) + { + pos = MenuObject->MenuInfo.MenuItemCount; + } + } else - { - pos = IntGetMenuItemByFlag(MenuObject, uItem, MF_BYCOMMAND, NULL, NULL); - } - if(pos < -1) pos = -1; + { + pos = IntGetMenuItemByFlag(MenuObject, uItem, MF_BYCOMMAND, NULL, NULL); + } + if (pos < -1) + { + pos = -1; + } MenuItem = ExAllocatePool(PagedPool, sizeof(MENU_ITEM)); - if(!MenuItem) - { - /* FIXME Set last error code? */ - SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; - } + if (NULL == MenuItem) + { + SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } MenuItem->fType = MFT_STRING; MenuItem->fState = MFS_ENABLED | MFS_UNCHECKED; @@ -758,11 +827,11 @@ IntInsertMenuItem(PMENU_OBJECT MenuObject, UINT uItem, BOOL fByPosition, RtlInitUnicodeString(&MenuItem->Text, NULL); MenuItem->hbmpItem = (HBITMAP)0; - if(!IntSetMenuItemInfo(MenuObject, MenuItem, lpmii)) - { - ExFreePool(MenuItem); - return FALSE; - } + if (! IntSetMenuItemInfo(MenuObject, MenuItem, ItemInfo)) + { + ExFreePool(MenuItem); + return FALSE; + } pos = IntInsertMenuItemToList(MenuObject, MenuItem, pos); @@ -1054,7 +1123,7 @@ IntInitTracking(PWINDOW_OBJECT WindowObject, PMENU_OBJECT MenuObject, BOOL Popup /* FIXME - send WM_SETCURSOR message */ if(!(Flags & TPM_NONOTIFY)) - IntSendMessage(WindowObject->Self, WM_INITMENU, (WPARAM)MenuObject->Self, 0); + IntSendMessage(WindowObject->Self, WM_INITMENU, (WPARAM)MenuObject->MenuInfo.Self, 0); } VOID FASTCALL @@ -1164,7 +1233,7 @@ NtUserBuildMenuItemList( } else { - res = MenuObject->MenuItemCount; + res = MenuObject->MenuInfo.MenuItemCount; } IntReleaseMenuObject(MenuObject); @@ -1313,21 +1382,40 @@ NtUserInsertMenuItem( HMENU hMenu, UINT uItem, BOOL fByPosition, - LPCMENUITEMINFOW lpmii) + LPCMENUITEMINFOW UnsafeItemInfo) { - DWORD res = 0; + DWORD Res = 0; PMENU_OBJECT MenuObject; + NTSTATUS Status; + ROSMENUITEMINFO ItemInfo; + MenuObject = IntGetMenuObject(hMenu); if(!MenuObject) - { - SetLastWin32Error(ERROR_INVALID_MENU_HANDLE); - return 0; - } + { + SetLastWin32Error(ERROR_INVALID_MENU_HANDLE); + return 0; + } + + Status = MmCopyFromCaller(&ItemInfo, UnsafeItemInfo, sizeof(MENUITEMINFOW)); + if (! NT_SUCCESS(Status)) + { + IntReleaseMenuObject(MenuObject); + SetLastNtError(Status); + return FALSE; + } + if (ItemInfo.cbSize != sizeof(MENUITEMINFOW)) + { + IntReleaseMenuObject(MenuObject); + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return FALSE; + } + ExAcquireFastMutexUnsafe(&MenuObject->MenuItemsLock); - res = IntInsertMenuItem(MenuObject, uItem, fByPosition, lpmii); + Res = IntInsertMenuItem(MenuObject, uItem, fByPosition, &ItemInfo); ExReleaseFastMutexUnsafe(&MenuObject->MenuItemsLock); IntReleaseMenuObject(MenuObject); - return res; + + return Res; } @@ -1458,36 +1546,64 @@ NtUserHiliteMenuItem( BOOL STDCALL NtUserMenuInfo( - HMENU hmenu, - LPMENUINFO lpmi, - BOOL fsog) + HMENU Menu, + PROSMENUINFO UnsafeMenuInfo, + BOOL SetOrGet) { - BOOL res = FALSE; + BOOL Res; PMENU_OBJECT MenuObject; - - if(lpmi->cbSize != sizeof(MENUINFO)) - { - /* FIXME - Set Last Error */ - return FALSE; - } - MenuObject = IntGetMenuObject(hmenu); - if(!MenuObject) - { - SetLastWin32Error(ERROR_INVALID_MENU_HANDLE); - return FALSE; - } - if(fsog) - { - /* Set MenuInfo */ - res = IntSetMenuInfo(MenuObject, lpmi); - } + DWORD Size; + NTSTATUS Status; + ROSMENUINFO MenuInfo; + + Status = MmCopyFromCaller(&Size, &UnsafeMenuInfo->cbSize, sizeof(DWORD)); + if (! NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return FALSE; + } + if(Size < sizeof(MENUINFO) || sizeof(ROSMENUINFO) < Size) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return FALSE; + } + Status = MmCopyFromCaller(&MenuInfo, UnsafeMenuInfo, Size); + if (! NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return FALSE; + } + + MenuObject = IntGetMenuObject(Menu); + if (NULL == MenuObject) + { + SetLastWin32Error(ERROR_INVALID_MENU_HANDLE); + return FALSE; + } + + if(SetOrGet) + { + /* Set MenuInfo */ + Res = IntSetMenuInfo(MenuObject, &MenuInfo); + } else - { - /* Get MenuInfo */ - res = IntGetMenuInfo(MenuObject, lpmi); - } + { + /* Get MenuInfo */ + Res = IntGetMenuInfo(MenuObject, &MenuInfo); + if (Res) + { + Status = MmCopyToCaller(UnsafeMenuInfo, &MenuInfo, Size); + if (! NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return FALSE; + } + } + } + IntReleaseMenuObject(MenuObject); - return res; + + return Res; } @@ -1496,50 +1612,50 @@ NtUserMenuInfo( */ int STDCALL NtUserMenuItemFromPoint( - HWND hWnd, - HMENU hMenu, + HWND Wnd, + HMENU Menu, DWORD X, DWORD Y) { PMENU_OBJECT MenuObject; - PWINDOW_OBJECT WindowObject; + PWINDOW_OBJECT WindowObject = NULL; PMENU_ITEM mi; int i; - MenuObject = IntGetMenuObject(hMenu); - if(!MenuObject) - { - SetLastWin32Error(ERROR_INVALID_MENU_HANDLE); - return -1; - } - if(hWnd) - { - WindowObject = IntGetWindowObject(hWnd); - if(!WindowObject) + MenuObject = IntGetMenuObject(Menu); + if (NULL == MenuObject) { - SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + SetLastWin32Error(ERROR_INVALID_MENU_HANDLE); return -1; } - } + if (0 != (MenuObject->MenuInfo.Flags & MF_POPUP)) + { + WindowObject = IntGetWindowObject(MenuObject->MenuInfo.Wnd); + if (NULL == WindowObject) + { + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + return -1; + } + X -= WindowObject->WindowRect.left; + Y -= WindowObject->WindowRect.top; + IntReleaseWindowObject(WindowObject); + } ExAcquireFastMutexUnsafe(&MenuObject->MenuItemsLock); mi = MenuObject->MenuItemList; - for(i = 0; mi; i++) - { - if(InRect(mi->Rect, X, Y)) + for (i = 0; NULL != mi; i++) { - break; + if (InRect(mi->Rect, X, Y)) + { + break; + } + mi = mi->Next; } - mi = mi->Next; - } ExReleaseFastMutexUnsafe(&MenuObject->MenuItemsLock); IntReleaseMenuObject(MenuObject); - if(hWnd) - IntReleaseWindowObject(WindowObject); - - return (mi ? i : -1); + return (mi ? i : NO_SELECTED_ITEM); } @@ -1549,49 +1665,76 @@ NtUserMenuItemFromPoint( BOOL STDCALL NtUserMenuItemInfo( - HMENU hMenu, - UINT uItem, - BOOL fByPosition, - LPMENUITEMINFOW lpmii, - BOOL fsog) + HMENU Menu, + UINT Item, + BOOL ByPosition, + PROSMENUITEMINFO UnsafeItemInfo, + BOOL SetOrGet) { PMENU_OBJECT MenuObject; PMENU_ITEM MenuItem; - MENUITEMINFOW Safemii; + ROSMENUITEMINFO ItemInfo; NTSTATUS Status; + UINT Size; + BOOL Ret; - MenuObject = IntGetMenuObject(hMenu); - if(!MenuObject) - { - SetLastWin32Error(ERROR_INVALID_MENU_HANDLE); - return FALSE; - } - - if(fsog) - { - /* Set menu item info */ - } - else - { - if((IntGetMenuItemByFlag(MenuObject, uItem, (fByPosition ? MF_BYPOSITION : MF_BYCOMMAND), - &MenuItem, NULL) > -1) && - IntGetMenuItemInfo(MenuObject, MenuItem, &Safemii)) + MenuObject = IntGetMenuObject(Menu); + if (NULL == MenuObject) { - Status = MmCopyToCaller(lpmii, &Safemii, sizeof(MENUITEMINFOW)); - if(!NT_SUCCESS(Status)) - { - IntReleaseMenuObject(MenuObject); - SetLastNtError(Status); - return FALSE; - } - - IntReleaseMenuObject(MenuObject); - return TRUE; + SetLastWin32Error(ERROR_INVALID_MENU_HANDLE); + return FALSE; + } + Status = MmCopyFromCaller(&Size, &UnsafeItemInfo->cbSize, sizeof(UINT)); + if (! NT_SUCCESS(Status)) + { + IntReleaseMenuObject(MenuObject); + SetLastNtError(Status); + return FALSE; + } + if(sizeof(MENUITEMINFOW) != Size && sizeof(ROSMENUITEMINFO) != Size) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return FALSE; + } + Status = MmCopyFromCaller(&ItemInfo, UnsafeItemInfo, Size); + if (! NT_SUCCESS(Status)) + { + IntReleaseMenuObject(MenuObject); + SetLastNtError(Status); + return FALSE; + } + + if (IntGetMenuItemByFlag(MenuObject, Item, + (ByPosition ? MF_BYPOSITION : MF_BYCOMMAND), + &MenuItem, NULL) < 0) + { + IntReleaseMenuObject(MenuObject); + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return FALSE; + } + + if (SetOrGet) + { + Ret = IntSetMenuItemInfo(MenuObject, MenuItem, &ItemInfo); + } + else + { + Ret = IntGetMenuItemInfo(MenuObject, MenuItem, &ItemInfo); + if (Ret) + { + Status = MmCopyToCaller(UnsafeItemInfo, &ItemInfo, Size); + if (! NT_SUCCESS(Status)) + { + IntReleaseMenuObject(MenuObject); + SetLastNtError(Status); + return FALSE; + } + } } - } IntReleaseMenuObject(MenuObject); - return FALSE; + + return Ret; } diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index 20aa321087c..35325d45513 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.48 2004/01/31 14:57:58 rcampbell Exp $ +/* $Id: misc.c,v 1.49 2004/02/15 07:39:12 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -205,11 +205,11 @@ NtUserCallTwoParam( if(Param2 > 0) { - Ret = (MenuObject->Height == (int)Param2); - MenuObject->Height = (int)Param2; + Ret = (MenuObject->MenuInfo.Height == (int)Param2); + MenuObject->MenuInfo.Height = (int)Param2; } else - Ret = (DWORD)MenuObject->Height; + Ret = (DWORD)MenuObject->MenuInfo.Height; IntReleaseMenuObject(MenuObject); return Ret; } diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 6aff80e67cd..c2daea27b36 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.182 2004/02/08 10:53:17 navaraf Exp $ +/* $Id: window.c,v 1.183 2004/02/15 07:39:12 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -432,6 +432,70 @@ static LRESULT IntDestroyWindow(PWINDOW_OBJECT Window, return 0; } +static BOOL FASTCALL +IntSetMenu( + PWINDOW_OBJECT WindowObject, + HMENU Menu, + BOOL *Changed) +{ + PMENU_OBJECT OldMenuObject, NewMenuObject; + + *Changed = (WindowObject->IDMenu != (UINT) Menu); + if (! *Changed) + { + return TRUE; + } + + if (0 != WindowObject->IDMenu) + { + OldMenuObject = IntGetMenuObject((HMENU) WindowObject->IDMenu); + ASSERT(NULL == OldMenuObject || OldMenuObject->MenuInfo.Wnd == WindowObject->Self); + } + else + { + OldMenuObject = NULL; + } + + if (NULL != Menu) + { + NewMenuObject = IntGetMenuObject(Menu); + if (NULL == NewMenuObject) + { + if (NULL != OldMenuObject) + { + IntReleaseMenuObject(OldMenuObject); + } + SetLastWin32Error(ERROR_INVALID_MENU_HANDLE); + return FALSE; + } + if (NULL != NewMenuObject->MenuInfo.Wnd) + { + /* Can't use the same menu for two windows */ + if (NULL != OldMenuObject) + { + IntReleaseMenuObject(OldMenuObject); + } + SetLastWin32Error(ERROR_INVALID_MENU_HANDLE); + return FALSE; + } + + } + + WindowObject->IDMenu = (UINT) Menu; + if (NULL != NewMenuObject) + { + NewMenuObject->MenuInfo.Wnd = WindowObject->Self; + IntReleaseMenuObject(NewMenuObject); + } + if (NULL != OldMenuObject) + { + OldMenuObject->MenuInfo.Wnd = NULL; + IntReleaseMenuObject(OldMenuObject); + } + + return TRUE; +} + /* INTERNAL ******************************************************************/ @@ -557,8 +621,8 @@ IntGetSystemMenu(PWINDOW_OBJECT WindowObject, BOOL bRevert, BOOL RetMenu) NewMenuObject = IntCloneMenu(MenuObject); if(NewMenuObject) { - WindowObject->SystemMenu = NewMenuObject->Self; - NewMenuObject->IsSystemMenu = TRUE; + WindowObject->SystemMenu = NewMenuObject->MenuInfo.Self; + NewMenuObject->MenuInfo.Flags |= MF_SYSMENU; ret = NewMenuObject; //IntReleaseMenuObject(NewMenuObject); } @@ -576,8 +640,8 @@ IntGetSystemMenu(PWINDOW_OBJECT WindowObject, BOOL bRevert, BOOL RetMenu) NewMenuObject = IntCloneMenu(MenuObject); if(NewMenuObject) { - WindowObject->SystemMenu = NewMenuObject->Self; - NewMenuObject->IsSystemMenu = TRUE; + WindowObject->SystemMenu = NewMenuObject->MenuInfo.Self; + NewMenuObject->MenuInfo.Flags |= MF_SYSMENU; ret = NewMenuObject; //IntReleaseMenuObject(NewMenuObject); } @@ -726,6 +790,7 @@ IntSetParent(PWINDOW_OBJECT Wnd, PWINDOW_OBJECT WndNewParent) PWINDOW_OBJECT WndOldParent; HWND hWnd, hWndNewParent, hWndOldParent; BOOL WasVisible; + BOOL MenuChanged; hWnd = Wnd->Self; hWndNewParent = WndNewParent->Self; @@ -757,7 +822,7 @@ IntSetParent(PWINDOW_OBJECT Wnd, PWINDOW_OBJECT WndNewParent) if (!(Wnd->Style & WS_CHILD)) { //if ( Wnd->Menu ) DestroyMenu ( Wnd->menu ); - Wnd->IDMenu = 0; + IntSetMenu(Wnd, NULL, &MenuChanged); } } } @@ -791,7 +856,7 @@ IntSetSystemMenu(PWINDOW_OBJECT WindowObject, PMENU_OBJECT MenuObject) OldMenuObject = IntGetMenuObject(WindowObject->SystemMenu); if(OldMenuObject) { - OldMenuObject->IsSystemMenu = FALSE; + OldMenuObject->MenuInfo.Flags &= ~ MF_SYSMENU; IntReleaseMenuObject(OldMenuObject); } } @@ -799,8 +864,8 @@ IntSetSystemMenu(PWINDOW_OBJECT WindowObject, PMENU_OBJECT MenuObject) if(MenuObject) { /* FIXME check window style, propably return FALSE ? */ - WindowObject->SystemMenu = MenuObject->Self; - MenuObject->IsSystemMenu = TRUE; + WindowObject->SystemMenu = MenuObject->MenuInfo.Self; + MenuObject->MenuInfo.Flags |= MF_SYSMENU; } else WindowObject->SystemMenu = (HMENU)0; @@ -1096,6 +1161,7 @@ NtUserCreateWindowEx(DWORD dwExStyle, CREATESTRUCTW Cs; CBT_CREATEWNDW CbtCreate; LRESULT Result; + BOOL MenuChanged; DPRINT("NtUserCreateWindowEx(): (%d,%d-%d,%d)\n", x, y, nWidth, nHeight); @@ -1211,9 +1277,10 @@ NtUserCreateWindowEx(DWORD dwExStyle, WindowObject->SystemMenu = (HMENU)0; WindowObject->ContextHelpId = 0; - WindowObject->IDMenu = (UINT)hMenu; + WindowObject->IDMenu = 0; WindowObject->Instance = hInstance; WindowObject->Self = Handle; + IntSetMenu(WindowObject, hMenu, &MenuChanged); WindowObject->MessageQueue = PsGetWin32Thread()->MessageQueue; WindowObject->Parent = ParentWindow; WindowObject->Owner = IntGetWindowObject(OwnerWindowHandle); @@ -1275,7 +1342,7 @@ NtUserCreateWindowEx(DWORD dwExStyle, SystemMenu = IntGetSystemMenu(WindowObject, TRUE, TRUE); if(SystemMenu) { - WindowObject->SystemMenu = SystemMenu->Self; + WindowObject->SystemMenu = SystemMenu->MenuInfo.Self; IntReleaseMenuObject(SystemMenu); } } @@ -3038,53 +3105,35 @@ NtUserSetLogonNotifyWindow(DWORD Unknown0) */ BOOL STDCALL NtUserSetMenu( - HWND hWnd, - HMENU hMenu, - BOOL bRepaint) + HWND Wnd, + HMENU Menu, + BOOL Repaint) { - PWINDOW_OBJECT WindowObject; - PMENU_OBJECT MenuObject; - BOOL Changed = FALSE; + PWINDOW_OBJECT WindowObject; + BOOL Changed; - WindowObject = IntGetWindowObject((HWND)hWnd); - if (!WindowObject) - { + WindowObject = IntGetWindowObject((HWND) Wnd); + if (NULL == WindowObject) + { SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return FALSE; - } + } - if (hMenu) - { - /* assign new menu handle */ - MenuObject = IntGetMenuObject((HWND)hMenu); - if (!MenuObject) - { - IntReleaseWindowObject(WindowObject); - SetLastWin32Error(ERROR_INVALID_MENU_HANDLE); - return FALSE; - } - - Changed = (WindowObject->IDMenu != (UINT)hMenu); - WindowObject->IDMenu = (UINT)hMenu; - - IntReleaseMenuObject(MenuObject); - } - else - { - /* remove the menu handle */ - Changed = (WindowObject->IDMenu != 0); - WindowObject->IDMenu = 0; - } + if (! IntSetMenu(WindowObject, Menu, &Changed)) + { + IntReleaseWindowObject(WindowObject); + return FALSE; + } - IntReleaseWindowObject(WindowObject); + IntReleaseWindowObject(WindowObject); - if (Changed && bRepaint) - { - WinPosSetWindowPos(hWnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | + if (Changed && Repaint) + { + WinPosSetWindowPos(Wnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED); - } + } - return TRUE; + return TRUE; } From 353cf5eb06752eb60f99b400798ac344102a3866 Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Sun, 15 Feb 2004 07:52:18 +0000 Subject: [PATCH 0039/1463] Added registry functions header. svn path=/trunk/; revision=8196 --- reactos/include/rosrtl/registry.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 reactos/include/rosrtl/registry.h diff --git a/reactos/include/rosrtl/registry.h b/reactos/include/rosrtl/registry.h new file mode 100644 index 00000000000..cf0301ca5ae --- /dev/null +++ b/reactos/include/rosrtl/registry.h @@ -0,0 +1,16 @@ +#ifndef _ROSRTL_REGISTRY_H_ +#define _ROSRTL_REGISTRY_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +NTSTATUS NTAPI RosReadRegistryValue( IN PUNICODE_STRING Key, + IN PUNICODE_STRING Value, + OUT PUNICODE_STRING Result ); + +#ifdef __cplusplus +}; +#endif + +#endif/*_ROSRTL_REGISTRY_H_*/ From d3e729a8c7a63eea9739cd0f0047dc2a303d74c4 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sun, 15 Feb 2004 17:04:52 +0000 Subject: [PATCH 0040/1463] - Canceled my last changes. svn path=/trunk/; revision=8197 --- reactos/ntoskrnl/mm/mdl.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/mm/mdl.c b/reactos/ntoskrnl/mm/mdl.c index ca4718774f0..cf270b87c2a 100644 --- a/reactos/ntoskrnl/mm/mdl.c +++ b/reactos/ntoskrnl/mm/mdl.c @@ -1,4 +1,4 @@ -/* $Id: mdl.c,v 1.57 2004/02/14 19:48:07 hbirr Exp $ +/* $Id: mdl.c,v 1.58 2004/02/15 17:04:52 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -383,7 +383,10 @@ VOID STDCALL MmProbeAndLockPages (PMDL Mdl, ExRaiseStatus(Status); } } - MmLockPage(MmGetPhysicalAddressForProcess(NULL, Address)); + else + { + MmLockPage(MmGetPhysicalAddressForProcess(NULL, Address)); + } if ((Operation == IoWriteAccess || Operation == IoModifyAccess) && (!(MmGetPageProtect(NULL, (PVOID)Address) & PAGE_READWRITE))) { From f12e3bf622f9472f96bf8230c32ecde757f98038 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III Date: Sun, 15 Feb 2004 18:37:35 +0000 Subject: [PATCH 0041/1463] removed unnecessary explicit define of _M_IX86 svn path=/trunk/; revision=8198 --- reactos/lib/opengl32/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/opengl32/Makefile b/reactos/lib/opengl32/Makefile index b28acbc8aab..9a84d68e134 100644 --- a/reactos/lib/opengl32/Makefile +++ b/reactos/lib/opengl32/Makefile @@ -7,7 +7,7 @@ TARGET_NORC = yes TARGET_NAME = opengl32 # -fno-builtin -TARGET_CFLAGS = -D__USE_W32API -DUNICODE -D_M_IX86 -Os -g3 +TARGET_CFLAGS = -D__USE_W32API -DUNICODE -Os -g3 # require os code to explicitly request A/W version of structs/functions TARGET_CFLAGS += -D_DISABLE_TIDENTS -Wall -Werror From 48632d639913d858ecd55c33533513318a9462f7 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sun, 15 Feb 2004 19:03:29 +0000 Subject: [PATCH 0042/1463] - Locked the pages in MmCommitPagedPoolAddress, if it is necessary. svn path=/trunk/; revision=8199 --- reactos/ntoskrnl/include/internal/mm.h | 2 +- reactos/ntoskrnl/mm/mm.c | 10 +++++++--- reactos/ntoskrnl/mm/ppool.c | 4 ++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index a21bf7e3355..b58a80dfbcf 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -479,7 +479,7 @@ NTSTATUS MmCreateVirtualMappingForKernel(PVOID Address, ULONG flProtect, PHYSICAL_ADDRESS PhysicalAddress); -NTSTATUS MmCommitPagedPoolAddress(PVOID Address); +NTSTATUS MmCommitPagedPoolAddress(PVOID Address, BOOLEAN Locked); NTSTATUS MmCreateVirtualMapping(struct _EPROCESS* Process, PVOID Address, ULONG flProtect, diff --git a/reactos/ntoskrnl/mm/mm.c b/reactos/ntoskrnl/mm/mm.c index e6ac1844430..648bab6f042 100644 --- a/reactos/ntoskrnl/mm/mm.c +++ b/reactos/ntoskrnl/mm/mm.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: mm.c,v 1.67 2003/12/30 18:52:05 fireball Exp $ +/* $Id: mm.c,v 1.68 2004/02/15 19:03:29 hbirr Exp $ * * COPYRIGHT: See COPYING in the top directory * PROJECT: ReactOS kernel @@ -251,7 +251,7 @@ NTSTATUS MmAccessFault(KPROCESSOR_MODE Mode, return(Status); } -NTSTATUS MmCommitPagedPoolAddress(PVOID Address) +NTSTATUS MmCommitPagedPoolAddress(PVOID Address, BOOLEAN Locked) { NTSTATUS Status; PHYSICAL_ADDRESS AllocatedPage; @@ -279,6 +279,10 @@ NTSTATUS MmCommitPagedPoolAddress(PVOID Address) FALSE); MmLockAddressSpace(MmGetKernelAddressSpace()); } + if (Locked) + { + MmLockPage(AllocatedPage); + } return(Status); } @@ -348,7 +352,7 @@ NTSTATUS MmNotPresentFault(KPROCESSOR_MODE Mode, { case MEMORY_AREA_PAGED_POOL: { - Status = MmCommitPagedPoolAddress((PVOID)Address); + Status = MmCommitPagedPoolAddress((PVOID)Address, Locked); break; } diff --git a/reactos/ntoskrnl/mm/ppool.c b/reactos/ntoskrnl/mm/ppool.c index f316a65e92e..45ce5492777 100644 --- a/reactos/ntoskrnl/mm/ppool.c +++ b/reactos/ntoskrnl/mm/ppool.c @@ -1,4 +1,4 @@ -/* $Id: ppool.c,v 1.24 2003/12/30 18:52:05 fireball Exp $ +/* $Id: ppool.c,v 1.25 2004/02/15 19:03:29 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -80,7 +80,7 @@ MmInitializePagedPool(VOID) * We are still at a high IRQL level at this point so explicitly commit * the first page of the paged pool before writing the first block header. */ - MmCommitPagedPoolAddress((PVOID)MmPagedPoolFirstFreeBlock); + MmCommitPagedPoolAddress((PVOID)MmPagedPoolFirstFreeBlock, FALSE); MmPagedPoolFirstFreeBlock->Size = MmPagedPoolSize; MmPagedPoolFirstFreeBlock->NextFree = NULL; From f273240d3fb60fd18be879ad0834d27cb6fb4cff Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sun, 15 Feb 2004 19:27:36 +0000 Subject: [PATCH 0043/1463] - Used a different buffer to get the mode informations. svn path=/trunk/; revision=8200 --- reactos/drivers/video/miniport/vbe/vbemp.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/drivers/video/miniport/vbe/vbemp.c b/reactos/drivers/video/miniport/vbe/vbemp.c index 310a12da908..6d8b05064c5 100644 --- a/reactos/drivers/video/miniport/vbe/vbemp.c +++ b/reactos/drivers/video/miniport/vbe/vbemp.c @@ -327,17 +327,17 @@ VBEInitialize(PVOID HwDeviceExtension) { BiosRegisters.Eax = 0x4F01; BiosRegisters.Ecx = ModeList[CurrentMode]; - BiosRegisters.Edi = VBEDeviceExtension->PhysicalAddress.QuadPart & 0xF; - BiosRegisters.Es = VBEDeviceExtension->PhysicalAddress.QuadPart >> 4; + BiosRegisters.Edi = (VBEDeviceExtension->PhysicalAddress.QuadPart + 0x200) & 0xF; + BiosRegisters.Es = (VBEDeviceExtension->PhysicalAddress.QuadPart + 0x200) >> 4; Ke386CallBios(0x10, &BiosRegisters); - VbeModeInfo = (PVBE_MODEINFO)VBEDeviceExtension->TrampolineMemory; + VbeModeInfo = (PVBE_MODEINFO)(VBEDeviceExtension->TrampolineMemory + 0x200); if (BiosRegisters.Eax == 0x4F && VbeModeInfo->XResolution >= 640 && VbeModeInfo->YResolution >= 480 && (VbeModeInfo->ModeAttributes & VBE_MODEATTR_LINEAR)) { VideoPortMoveMemory(VBEDeviceExtension->ModeInfo + ModeCount, - VBEDeviceExtension->TrampolineMemory, + VBEDeviceExtension->TrampolineMemory + 0x200, sizeof(VBE_MODEINFO)); VBEDeviceExtension->ModeNumbers[ModeCount] = ModeList[CurrentMode] | 0x4000; if (VbeModeInfo->XResolution == 640 && From a9f236443656043013a95c90c5a355324bb307bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sun, 15 Feb 2004 20:50:56 +0000 Subject: [PATCH 0044/1463] Top level windows have menus, child windows have IDs svn path=/trunk/; revision=8201 --- reactos/subsys/win32k/ntuser/window.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index c2daea27b36..b881dedb0cf 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.183 2004/02/15 07:39:12 gvg Exp $ +/* $Id: window.c,v 1.184 2004/02/15 20:50:56 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1280,7 +1280,14 @@ NtUserCreateWindowEx(DWORD dwExStyle, WindowObject->IDMenu = 0; WindowObject->Instance = hInstance; WindowObject->Self = Handle; - IntSetMenu(WindowObject, hMenu, &MenuChanged); + if (0 != (dwStyle & WS_CHILD)) + { + WindowObject->IDMenu = (UINT) hMenu; + } + else + { + IntSetMenu(WindowObject, hMenu, &MenuChanged); + } WindowObject->MessageQueue = PsGetWin32Thread()->MessageQueue; WindowObject->Parent = ParentWindow; WindowObject->Owner = IntGetWindowObject(OwnerWindowHandle); From fec177ccee9645f674e8771d65bb2fee025f96aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sun, 15 Feb 2004 21:45:37 +0000 Subject: [PATCH 0045/1463] Rollback hinter enabling since font output looks worse with the auto hinter enabled svn path=/trunk/; revision=8202 --- reactos/lib/freetype/ChangeLog | 1754 +- reactos/lib/freetype/Jamfile | 7 +- reactos/lib/freetype/Makefile | 6 +- reactos/lib/freetype/README | 8 +- reactos/lib/freetype/builds/atari/ATARI.H | 16 - reactos/lib/freetype/builds/atari/FNames.SIC | 37 - .../lib/freetype/builds/atari/FREETYPE.PRJ | 33 - reactos/lib/freetype/builds/atari/README.TXT | 51 - reactos/lib/freetype/builds/freetype.mk | 6 +- reactos/lib/freetype/builds/toplevel.mk | 1 - reactos/lib/freetype/builds/unix/.cvsignore | 1 - reactos/lib/freetype/builds/unix/aclocal.m4 | 7226 +++---- reactos/lib/freetype/builds/unix/config.guess | 147 +- reactos/lib/freetype/builds/unix/config.sub | 98 +- reactos/lib/freetype/builds/unix/configure | 17236 +++------------- reactos/lib/freetype/builds/unix/configure.ac | 171 +- reactos/lib/freetype/builds/unix/freetype2.m4 | 263 +- reactos/lib/freetype/builds/unix/ft-munmap.m4 | 43 +- reactos/lib/freetype/builds/unix/ft2unix.h | 23 +- reactos/lib/freetype/builds/unix/ftconfig.in | 112 +- reactos/lib/freetype/builds/unix/install-sh | 60 +- reactos/lib/freetype/builds/unix/install.mk | 2 - reactos/lib/freetype/builds/unix/ltmain.sh | 2697 +-- .../lib/freetype/builds/unix/mkinstalldirs | 52 +- reactos/lib/freetype/builds/unix/unix-cc.in | 5 +- reactos/lib/freetype/builds/vms/ftconfig.h | 155 +- .../freetype/builds/win32/visualc/index.html | 9 - reactos/lib/freetype/devel/ft2build.h | 6 +- reactos/lib/freetype/devel/ftoption.h | 2 +- reactos/lib/freetype/docs/CHANGES | 1371 +- reactos/lib/freetype/docs/CUSTOMIZE | 10 +- reactos/lib/freetype/docs/VERSION.DLL | 27 +- reactos/lib/freetype/docs/license.txt | 27 +- reactos/lib/freetype/docs/raster.txt | 624 - .../lib/freetype/docs/reference/.cvsignore | 1 - reactos/lib/freetype/docs/release | 18 +- reactos/lib/freetype/freetype.def | 82 +- .../include/freetype/cache/ftccache.h | 332 +- .../include/freetype/cache/ftcglyph.h | 298 +- .../include/freetype/cache/ftcimage.h | 309 +- .../include/freetype/cache/ftcmanag.h | 135 +- .../freetype/include/freetype/cache/ftcmru.h | 246 - .../include/freetype/cache/ftcsbits.h | 277 +- .../include/freetype/config/ftconfig.h | 7 +- .../include/freetype/config/ftheader.h | 47 +- .../include/freetype/config/ftoption.h | 9 +- .../include/freetype/config/ftstdlib.h | 13 +- .../lib/freetype/include/freetype/freetype.h | 48 +- .../lib/freetype/include/freetype/ftbbox.h | 8 +- reactos/lib/freetype/include/freetype/ftbdf.h | 6 - .../lib/freetype/include/freetype/ftcache.h | 506 +- .../lib/freetype/include/freetype/ftglyph.h | 12 +- .../lib/freetype/include/freetype/ftgzip.h | 7 - .../lib/freetype/include/freetype/ftimage.h | 4 +- .../lib/freetype/include/freetype/ftincrem.h | 6 - .../lib/freetype/include/freetype/ftlist.h | 8 +- reactos/lib/freetype/include/freetype/ftmm.h | 15 + .../lib/freetype/include/freetype/ftmodapi.h | 314 - .../lib/freetype/include/freetype/ftoutln.h | 74 +- reactos/lib/freetype/include/freetype/ftpfr.h | 6 - .../lib/freetype/include/freetype/ftsizes.h | 12 +- .../lib/freetype/include/freetype/ftsnames.h | 8 +- .../lib/freetype/include/freetype/ftstroke.h | 634 +- .../lib/freetype/include/freetype/ftsynth.h | 8 +- .../lib/freetype/include/freetype/fttrigon.h | 6 - .../lib/freetype/include/freetype/ftwinfnt.h | 130 +- .../lib/freetype/include/freetype/ftxf86.h | 9 +- .../include/freetype/internal/ftcalc.h | 38 +- .../include/freetype/internal/ftdriver.h | 14 +- .../include/freetype/internal/ftgloadr.h | 8 +- .../include/freetype/internal/ftmemory.h | 8 +- .../include/freetype/internal/ftobjs.h | 90 +- .../include/freetype/internal/ftserv.h | 260 - .../include/freetype/internal/internal.h | 11 +- .../include/freetype/internal/psaux.h | 15 +- .../freetype/internal/services/svbdf.h | 57 - .../freetype/internal/services/svgldict.h | 60 - .../include/freetype/internal/services/svmm.h | 68 - .../freetype/internal/services/svpfr.h | 65 - .../freetype/internal/services/svpostnm.h | 58 - .../freetype/internal/services/svpscmap.h | 113 - .../freetype/internal/services/svpsinfo.h | 55 - .../freetype/internal/services/svsfnt.h | 69 - .../freetype/internal/services/svttcmap.h | 77 - .../freetype/internal/services/svwinfnt.h | 50 - .../freetype/internal/services/svxf86nm.h | 55 - .../freetype/include/freetype/internal/sfnt.h | 103 +- .../include/freetype/internal/t1types.h | 30 +- .../include/freetype/internal/tttypes.h | 326 +- .../lib/freetype/include/freetype/t1tables.h | 6 - .../lib/freetype/include/freetype/ttnameid.h | 1 - .../lib/freetype/include/freetype/tttables.h | 32 +- .../lib/freetype/include/freetype/tttags.h | 6 - .../lib/freetype/include/freetype/ttunpat.h | 6 - reactos/lib/freetype/src/autofit/Jamfile | 18 - reactos/lib/freetype/src/autofit/afangles.c | 214 - reactos/lib/freetype/src/autofit/afglobal.c | 231 - reactos/lib/freetype/src/autofit/afglobal.h | 41 - reactos/lib/freetype/src/autofit/afhints.c | 934 - reactos/lib/freetype/src/autofit/afhints.h | 241 - reactos/lib/freetype/src/autofit/aflatin.c | 1784 -- reactos/lib/freetype/src/autofit/aflatin.h | 169 - reactos/lib/freetype/src/autofit/afloader.c | 431 - reactos/lib/freetype/src/autofit/afloader.h | 49 - reactos/lib/freetype/src/autofit/afmodule.c | 68 - reactos/lib/freetype/src/autofit/afmodule.h | 16 - reactos/lib/freetype/src/autofit/aftypes.h | 266 - reactos/lib/freetype/src/autofit/autofit.c | 8 - reactos/lib/freetype/src/autohint/ahglobal.c | 2 +- reactos/lib/freetype/src/autohint/ahglyph.c | 4 +- reactos/lib/freetype/src/autohint/ahhint.c | 99 +- reactos/lib/freetype/src/base/ftbdf.c | 50 +- reactos/lib/freetype/src/base/ftcalc.c | 79 +- reactos/lib/freetype/src/base/ftdbgmem.c | 6 +- reactos/lib/freetype/src/base/ftgloadr.c | 25 +- reactos/lib/freetype/src/base/ftglyph.c | 23 +- reactos/lib/freetype/src/base/ftmm.c | 89 +- reactos/lib/freetype/src/base/ftobjs.c | 371 +- reactos/lib/freetype/src/base/ftoutln.c | 151 +- reactos/lib/freetype/src/base/ftpfr.c | 83 +- reactos/lib/freetype/src/base/ftstroke.c | 278 +- reactos/lib/freetype/src/base/ftsynth.c | 5 +- reactos/lib/freetype/src/base/fttrigon.c | 5 +- reactos/lib/freetype/src/base/fttype1.c | 53 +- reactos/lib/freetype/src/base/ftwinfnt.c | 24 +- reactos/lib/freetype/src/base/ftxf86.c | 51 +- reactos/lib/freetype/src/bdf/bdfdrivr.c | 227 +- reactos/lib/freetype/src/bdf/bdfdrivr.h | 2 +- reactos/lib/freetype/src/bdf/bdflib.c | 8 +- reactos/lib/freetype/src/cache/Jamfile | 12 +- reactos/lib/freetype/src/cache/descrip.mms | 5 +- reactos/lib/freetype/src/cache/ftcache.c | 8 +- reactos/lib/freetype/src/cache/ftcbasic.c | 420 - reactos/lib/freetype/src/cache/ftccache.c | 904 +- reactos/lib/freetype/src/cache/ftccmap.c | 408 +- reactos/lib/freetype/src/cache/ftcglyph.c | 128 +- reactos/lib/freetype/src/cache/ftcimage.c | 337 +- reactos/lib/freetype/src/cache/ftcmanag.c | 730 +- reactos/lib/freetype/src/cache/ftcmru.c | 355 - reactos/lib/freetype/src/cache/ftcsbits.c | Bin 8675 -> 16862 bytes reactos/lib/freetype/src/cache/rules.mk | 6 +- reactos/lib/freetype/src/cff/Jamfile | 2 +- reactos/lib/freetype/src/cff/cff.c | 2 +- reactos/lib/freetype/src/cff/cffcmap.c | 42 +- reactos/lib/freetype/src/cff/cffdrivr.c | 179 +- reactos/lib/freetype/src/cff/cffgload.c | 145 +- reactos/lib/freetype/src/cff/cffload.c | 154 +- reactos/lib/freetype/src/cff/cffload.h | 14 +- reactos/lib/freetype/src/cff/cffobjs.c | 176 +- reactos/lib/freetype/src/cff/cffobjs.h | 15 +- reactos/lib/freetype/src/cff/cffparse.h | 4 +- reactos/lib/freetype/src/cff/cfftoken.h | 4 +- reactos/lib/freetype/src/cff/cfftypes.h | 255 - reactos/lib/freetype/src/cff/rules.mk | 1 - reactos/lib/freetype/src/cid/cidgload.c | 20 +- reactos/lib/freetype/src/cid/cidload.c | 207 +- reactos/lib/freetype/src/cid/cidload.h | 5 +- reactos/lib/freetype/src/cid/cidobjs.c | 37 +- reactos/lib/freetype/src/cid/cidparse.c | 61 +- reactos/lib/freetype/src/cid/cidparse.h | 13 +- reactos/lib/freetype/src/cid/cidriver.c | 55 +- reactos/lib/freetype/src/gzip/adler32.c | 2 +- reactos/lib/freetype/src/gzip/infblock.c | 3 +- reactos/lib/freetype/src/gzip/inffixed.h | 8 +- reactos/lib/freetype/src/gzip/inftrees.c | 10 +- reactos/lib/freetype/src/gzip/inftrees.h | 4 +- reactos/lib/freetype/src/gzip/infutil.c | 2 +- reactos/lib/freetype/src/gzip/zconf.h | 2 +- reactos/lib/freetype/src/gzip/zutil.c | 2 +- reactos/lib/freetype/src/gzip/zutil.h | 2 +- reactos/lib/freetype/src/pcf/pcfdrivr.c | 46 +- reactos/lib/freetype/src/pcf/pcfread.c | 188 +- reactos/lib/freetype/src/pfr/pfrdrivr.c | 91 +- reactos/lib/freetype/src/pfr/pfrgload.c | 6 +- reactos/lib/freetype/src/pfr/pfrload.c | 238 +- reactos/lib/freetype/src/pfr/pfrobjs.c | 77 +- reactos/lib/freetype/src/pfr/pfrsbit.c | 13 +- reactos/lib/freetype/src/pfr/pfrtypes.h | 12 +- reactos/lib/freetype/src/psaux/psauxmod.c | 2 +- reactos/lib/freetype/src/psaux/psobjs.c | 772 +- reactos/lib/freetype/src/psaux/psobjs.h | 10 +- reactos/lib/freetype/src/psaux/t1cmap.c | 26 +- reactos/lib/freetype/src/psaux/t1cmap.h | 19 +- reactos/lib/freetype/src/psaux/t1decode.c | 34 +- reactos/lib/freetype/src/psaux/t1decode.h | 3 +- reactos/lib/freetype/src/pshinter/Jamfile | 2 +- reactos/lib/freetype/src/pshinter/pshalgo.c | 36 +- reactos/lib/freetype/src/pshinter/pshglob.c | 4 +- reactos/lib/freetype/src/pshinter/pshrec.c | 10 +- reactos/lib/freetype/src/pshinter/pshrec.h | 2 +- reactos/lib/freetype/src/psnames/psmodule.c | 68 +- reactos/lib/freetype/src/raster/ftrend1.c | 14 +- reactos/lib/freetype/src/sfnt/Jamfile | 4 +- reactos/lib/freetype/src/sfnt/rules.mk | 1 + reactos/lib/freetype/src/sfnt/sfdriver.c | 95 +- reactos/lib/freetype/src/sfnt/sfnt.c | 3 +- reactos/lib/freetype/src/sfnt/sfobjs.c | 27 +- reactos/lib/freetype/src/sfnt/ttcmap0.c | 141 +- reactos/lib/freetype/src/sfnt/ttcmap0.h | 10 +- reactos/lib/freetype/src/sfnt/ttload.c | 1 + reactos/lib/freetype/src/sfnt/ttpost.c | 10 +- reactos/lib/freetype/src/sfnt/ttsbit.c | 14 +- reactos/lib/freetype/src/sfnt/ttsbit.h | 6 +- reactos/lib/freetype/src/smooth/ftsmooth.c | 10 +- .../freetype/src/tools/docmaker/.cvsignore | 1 - .../freetype/src/tools/docmaker/content.py | 50 +- .../freetype/src/tools/docmaker/docbeauty.py | 109 - .../freetype/src/tools/docmaker/docmaker.py | 52 +- .../freetype/src/tools/docmaker/formatter.py | 9 - .../freetype/src/tools/docmaker/sources.py | 6 +- .../lib/freetype/src/tools/docmaker/utils.py | 43 +- reactos/lib/freetype/src/truetype/ttdriver.c | 45 +- reactos/lib/freetype/src/truetype/ttgload.c | 34 +- reactos/lib/freetype/src/truetype/ttinterp.c | 173 +- reactos/lib/freetype/src/truetype/ttinterp.h | 3 +- reactos/lib/freetype/src/truetype/ttobjs.c | 23 +- reactos/lib/freetype/src/type1/t1driver.c | 158 +- reactos/lib/freetype/src/type1/t1gload.c | 27 +- reactos/lib/freetype/src/type1/t1load.c | 767 +- reactos/lib/freetype/src/type1/t1objs.c | 35 +- reactos/lib/freetype/src/type1/t1parse.c | 205 +- reactos/lib/freetype/src/type1/t1parse.h | 12 +- reactos/lib/freetype/src/type42/t42drivr.c | 112 +- reactos/lib/freetype/src/type42/t42objs.c | 44 +- reactos/lib/freetype/src/type42/t42objs.h | 8 +- reactos/lib/freetype/src/type42/t42parse.c | 825 +- reactos/lib/freetype/src/type42/t42parse.h | 7 +- reactos/lib/freetype/src/type42/t42types.h | 54 - reactos/lib/freetype/src/winfonts/winfnt.c | 113 +- reactos/lib/freetype/src/winfonts/winfnt.h | 69 +- 230 files changed, 13063 insertions(+), 40322 deletions(-) delete mode 100644 reactos/lib/freetype/builds/atari/ATARI.H delete mode 100644 reactos/lib/freetype/builds/atari/FNames.SIC delete mode 100644 reactos/lib/freetype/builds/atari/FREETYPE.PRJ delete mode 100644 reactos/lib/freetype/builds/atari/README.TXT delete mode 100644 reactos/lib/freetype/docs/raster.txt delete mode 100644 reactos/lib/freetype/docs/reference/.cvsignore delete mode 100644 reactos/lib/freetype/include/freetype/cache/ftcmru.h delete mode 100644 reactos/lib/freetype/include/freetype/ftmodapi.h delete mode 100644 reactos/lib/freetype/include/freetype/internal/ftserv.h delete mode 100644 reactos/lib/freetype/include/freetype/internal/services/svbdf.h delete mode 100644 reactos/lib/freetype/include/freetype/internal/services/svgldict.h delete mode 100644 reactos/lib/freetype/include/freetype/internal/services/svmm.h delete mode 100644 reactos/lib/freetype/include/freetype/internal/services/svpfr.h delete mode 100644 reactos/lib/freetype/include/freetype/internal/services/svpostnm.h delete mode 100644 reactos/lib/freetype/include/freetype/internal/services/svpscmap.h delete mode 100644 reactos/lib/freetype/include/freetype/internal/services/svpsinfo.h delete mode 100644 reactos/lib/freetype/include/freetype/internal/services/svsfnt.h delete mode 100644 reactos/lib/freetype/include/freetype/internal/services/svttcmap.h delete mode 100644 reactos/lib/freetype/include/freetype/internal/services/svwinfnt.h delete mode 100644 reactos/lib/freetype/include/freetype/internal/services/svxf86nm.h delete mode 100644 reactos/lib/freetype/src/autofit/Jamfile delete mode 100644 reactos/lib/freetype/src/autofit/afangles.c delete mode 100644 reactos/lib/freetype/src/autofit/afglobal.c delete mode 100644 reactos/lib/freetype/src/autofit/afglobal.h delete mode 100644 reactos/lib/freetype/src/autofit/afhints.c delete mode 100644 reactos/lib/freetype/src/autofit/afhints.h delete mode 100644 reactos/lib/freetype/src/autofit/aflatin.c delete mode 100644 reactos/lib/freetype/src/autofit/aflatin.h delete mode 100644 reactos/lib/freetype/src/autofit/afloader.c delete mode 100644 reactos/lib/freetype/src/autofit/afloader.h delete mode 100644 reactos/lib/freetype/src/autofit/afmodule.c delete mode 100644 reactos/lib/freetype/src/autofit/afmodule.h delete mode 100644 reactos/lib/freetype/src/autofit/aftypes.h delete mode 100644 reactos/lib/freetype/src/autofit/autofit.c delete mode 100644 reactos/lib/freetype/src/cache/ftcbasic.c delete mode 100644 reactos/lib/freetype/src/cache/ftcmru.c delete mode 100644 reactos/lib/freetype/src/cff/cfftypes.h delete mode 100644 reactos/lib/freetype/src/tools/docmaker/.cvsignore delete mode 100644 reactos/lib/freetype/src/tools/docmaker/docbeauty.py delete mode 100644 reactos/lib/freetype/src/type42/t42types.h diff --git a/reactos/lib/freetype/ChangeLog b/reactos/lib/freetype/ChangeLog index 04a32960137..86c6fac670b 100644 --- a/reactos/lib/freetype/ChangeLog +++ b/reactos/lib/freetype/ChangeLog @@ -1,1501 +1,13 @@ -2003-02-03 Werner Lemberg - - * include/freetype/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP): - Initialize `node'. - * src/type1/t1load.c (parse_dict): Initialize `have_integer'. - -2003-02-02 Werner Lemberg - - * src/type1/t1load.c (parse_dict): Handle `RD' and `-|' commands - outside of /Subrs or /CharStrings. This can happen if there is - additional code manipulating those two arrays so that FreeType - doesn't recognize them properly. - (T1_Open_Face): Improve an error message. - -2004-02-01 Werner Lemberg - - * src/type1/t1load.c (parse_charstrings): Exit immediately if - there are no elements in /CharStrings. This is needed for fonts - like Optima-Oblique which not only define /CharStrings but access it - also. - -2004-02-01 David Turner - - * src/sfnt/Jamfile: Removing `ttcmap' from the list of sources. - - * include/freetype/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP) - : Provide macro version which doesn't use inline code. - * include/freetype/cache/ftcglyph.h (FTC_GCACHE_LOOKUP_CMP) - : Ditto. - Use FTC_MRULIST_LOOKUP_CMP. - * include/freetype/cache/ftcmru.h (FTC_MRULIST_LOOKUP_CMP): New - macro. - (FTC_MRULIST_LOOKUP): Use it. - - * src/cache/Jamfile (_sources), src/cache/descrip.mms: Updated. - * src/cache/ftcbasic.c: Fix compiler warnings. - * src/cache/ftcmanag.c (FTC_Manager_LookupSize, - FTC_Manager_LookupFace) : Use FTC_MRULIST_LOOKUP_CMP. - * src/cache/ftcmru.c (FTC_MruList_Find): Fix a bug (found after - heavy testing). - - * Jamfile: Updating `refdoc' target, and adding `autohint' to the - list of modules to build. Both the autohinter and autofitter will - be built by default. But which one will be used is determined by - the content of `ftmodule.h'. - - * src/autofit/*: Many updates, but the code is still buggy... - -2004-01-31 Werner Lemberg - - * src/cff/cffgload.c (cff_operator_seac): Fix magnitude of - accent offset. - Update code similarly to the seac support for Type 1 fonts. - (cff_decoder_parse_charstrings) : Fix magnitude - of accent offset. - Don't hint glyphs twice if seac is emulated. - : Assign correct point tags. - * docs/CHANGES: Updated. - -2004-01-30 Werner Lemberg - - * src/type1/t1parse.c (T1_Get_Private_Dict): Use FT_MEM_MOVE, not - FT_MEM_COPY, for copying the private dict. - - * src/type1/t1load.c (parse_subrs): Assign number of subrs only - in first run. - (parse_charstrings): Parse /CharStrings in second run without - assigning values. - (parse_dict): Skip all /CharStrings arrays but the first. We need - this for non-standard fonts like `Optima' which have different - outlines depending on the resolution. Note that there is no - guarantee that we get fitting /Subrs and /CharStrings arrays; this - can only be done by a real PS interpreter. - -2004-01-29 Antoine Leca - - * builds/win32/visualc/index.html: New file, giving detailed - explanations about forcing CR+LF line endings for the VC++ project - files. - -2004-01-22 Garrick Meeker - - * src/cff/cffload.c (cff_subfont_load): Initialize `dict'. - -2004-01-22 Werner Lemberg - - Add support for the hexadicimal representation of binary data - started with `StartData' in CID-keyed Type 1 fonts. - - * include/freetype/internal/t1types.h (CID_FaceRec): Add new - members `binary_data' and `cid_stream'. - - * src/cid/cidload.c (cid_read_subrs): Use `face->cid_stream'. - (cid_hex_to_binary): New auxiliary function. - (cid_face_open): Add new argument `face_index' to return quickly - if less than zero. Updated all callers. - Call `cid_hex_to_binary', then open and assign memory stream to - `face->cid_stream' if `parser->binary_length' is non-zero. - * src/cid/cidload.h: Updated. - - * src/cid/cidobjs.c (cid_face_done): Free `binary_data' and - `cid_stream'. - - * src/cid/cidparse.c (cid_parser_new): Check arguments to - `StartData' and set parser->binary_length accordingly. - * src/cid/cidparse.h (CID_Parser): New member `binary_length'. - - * src/cid/cidgload.c (cid_load_glyph): Use `face->cid_stream'. - - * docs/CHANGES: Updated. - -2004-01-21 Werner Lemberg - - include/freetype/config/ftstdlib.h (ft_atoi): Replaced with... - (ft_atol): This. - * src/base/ftdbgmem.c: s/atol/ft_atol/. - * src/type42/t42drivr.c: s/ft_atoi/ft_atol/. - -2004-01-20 Masatake YAMATO - - * include/freetype/ftcache.h: Delete duplicated definition of - FTC_FaceID. - - * src/cff/cffdrivr.c (cff_get_cmap_info): Call sfnt module's TT CMap - Info service function if the cmap comes from sfnt. Return 0 if the - cmap is sythesized in cff module. - -2004-01-20 David Turner - - * src/cache/ftcmanag.c (ftc_size_node_compare): Call - FT_Activate_Size. - -2004-01-20 Werner Lemberg - - * src/type1/t1parse.c (T1_Get_Private_Dict): Skip exactly one - CR, LF, or CR/LF after `eexec'. - -2004-01-18 David Turner - - * src/sfnt/ttsbit.c (tt_face_set_sbit_strike): Remove compiler - warning. - - * src/tools/docmaker/*: Updating beautifier tool. - -2004-01-15 David Turner - - * src/base/ftoutln.c (ft_orientation_extremum_compute): Fix - infinite loop bug. - - * include/freetype/ftstroke.h: Include FT_GLYPH_H. - (FT_Stroker_Rewind, FT_Glyph_Stroke, FT_Glyph_StrokeBorder): New - declarations. - - * src/base/ftstroke.c: Include FT_INTERNAL_OBJECTS_H. - (FT_Outline_GetOutsideBorder): Inverse result. - (FT_Stroker_Rewind, FT_Glyph_Stroke, FT_GlyphStrokeBorder): New - functions. - (FT_Stroker_EndSubPath): Close path if needed. - (FT_Stroker_Set, FT_Stroker_ParseOutline): Use FT_Stroker_Rewind. - - * include/freetype/cache/ftcmanag.h (FTC_ScalerRec, - FTC_Manager_LookupSize): Moved to... - * include/freetype/ftcache.h (FTC_ScalerRec, - FTC_Manager_LookupSize): Here. - - * src/tools/docmaker/docbeauty.py: New file to beautify the - documentation comments (e.g., to convert them to single block border - mode). - * src/tools/docmaker/docmaker.py (file_exists, make_file_list): - Moved to... - * src/tools/docmaker/utils.py (file_exists, make_file_list): Here. - -2004-01-14 David Turner - - * include/freetype/internal/ftmemory.h (FT_ARRAY_COPY, - FT_ARRAY_MOVE): New macros to make copying arrays easier. - Updated all relevant code to use them. - -2004-01-14 Werner Lemberg - - * src/cff/cffload.c (cff_font_load): Load charstrings_index earlier. - Use number of charstrings as argument to CFF_Load_FD_Select (as - documented in the CFF specs). - -2004-01-13 Graham Asher - - * src/pshinter/pshalgo.c (psh_glyph_init): Move assignment of - `glyph->memory' up to free arrays properly in case of failure. - -2004-01-10 Masatake YAMATO - - Make `FT_Get_CMap_Language_ID' work with CFF. Bug reported by - Steve Hartwell . - - * src/cff/cffdrivr.c: Include FT_SERVICE_TT_CMAP_H. - (cff_services): Added an entry for FT_SERVICE_ID_TT_CMAP. - (cff_get_cmap_info): New function. - (cff_service_get_cmap_info) New entry for cff_services. - - * src/sfnt/ttcmap0.c: Exit loop after a format match has been found. - Suggested by Steve Hartwell . - -2004-01-03 Masatake YAMATO - - * src/base/ftobjs.c (destroy_charmaps): New function. - (destroy_face, open_face): Use `destroy_charmaps'. - -2004-01-01 Werner Lemberg - - * docs/CHANGES: Updated. - -2004-01-01 Michael Jansson - - * src/winfonts/winfnt.c (FNT_Size_Set_Pixels): Fix sign of - size->metrics.descender. - -2003-12-31 Wolfgang Domr鰏e - - * src/cff/cffgload.c (cff_decoder_parse_charstrings) - [FT_DEBUG_LEVEL_TRACE]: Use `%ld' in FT_TRACE4. - : Change type of dx and dy to FT_Pos and remove - cast for accessing arguments. - -2003-12-31 Werner Lemberg - - * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Revert previous - change. It's not necessary. - -2003-12-29 Smith Charles - - * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Handle `repeated - flags set' correctly. - -2003-12-29 Werner Lemberg - - * src/cff/cffobjs.c (cff_face_init): Fix memory leak by deallocating - `full' and `weight' properly. - * src/cff/cffgload.c (cff_decoder_parse_charstrings) - [FT_DEBUG_LEVEL_TRACE]: Use `0x' as prefix for - tracing output. - -2003-12-26 Werner Lemberg - - * include/freetype/internal/sfnt.h (TT_Set_SBit_Strike_Func): - Use FT_UInt for ppem values. - * src/sfnt/ttsbit.c (tt_face_set_sbit_strike): Use FT_UInt for - ppem values. - * src/sfnt/ttsbit.h: Updated. - - * src/base/ftobjs.c (FT_Set_Pixel_Sizes): Don't allow ppem values - larger than -0FFFF. - -2003-12-25 Werner Lemberg - - * src/base/fttrigon.c, src/base/ftgloadr.c: Inlude - FT_INTERNAL_OBJECTS_H. - - * src/base/ftstroke.c (FT_Outline_GetInsideBorder, - FT_Outline_GetOutsideBorder): s/or/o/ to make it compile with - C++ compilers. - - * src/cache/ftcmru.c, include/freetype/cache/ftcmru.h: - s/select/selection/ to avoid compiler warning. - * src/cff/cffload.h: s/select/ftselect/ to avoid potential - compiler warning. - -2003-12-24 Werner Lemberg - - * src/cache/ftcsbits.c (FTC_SNode_Weight): - s/FTC_SBIT_ITEM_PER_NODE/FTC_SBIT_ITEMS_PER_NODE/. - -2003-12-24 David Turner - - * Fixed compilation problems in the cache sub-system. - - * Partial updates to src/autofit. - - * Jamfile (FT2_COMPONENTS): Add autofit module. - -2003-12-23 Werner Lemberg - - * src/cff/cffgload.c (cff_lookup_glyph_by_stdcharcode): Handle - CID-keyed fonts. - -2003-12-23 David Turner - - * include/freetype/internal/ftobjs.h (FT_PAD_FLOOR, FT_PAD_ROUND, - FT_PAD_CEIL, FT_PIX_FLOOR, FT_PIX_ROUND, FT_CEIL): New macros. They - are used to avoid compiler warnings with very pedantic compilers. - Note that `(x) & -64' causes a warning if (x) is not signed. Use - `(x) & ~63' instead! - Updated all related code. - - Add support for extraction of `inside' and `outside' borders. - - * src/base/ftstroke.c (FT_StrokerBorder): New enumeration. - (FT_Outline_GetInsideBorder, FT_Outline_GetOutsideBorder, - FT_Stroker_GetBorderCounts, FT_Stroker_ExportBorder): New functions. - (FT_StrokeBorderRec): New boolean member `valid'. - (ft_stroke_border_get_counts): Updated. - * include/freetype/ftstroke.h: Updated. - -2003-12-22 Werner Lemberg - - * include/freetype/ftwinfnt.h (FT_WinFNT_ID_*): New definitions - to describe the `charset' field in FT_WinFNT_HeaderRec. - * src/winfonts/winfnt.c (FNT_Face_Init): Set encoding to - FT_ENCODING_NONE except for FT_WinFNT_ID_MAC. - - * include/freetype/freetype.h (FT_Encoding): Improve comment, - based on work by Detlef W黵kner . - - * docs/CHANGES: Updated. - -2003-12-22 David Turner - - * include/freetype/ftcache.h, - include/freetype/cache/ftcmanag.h, - include/freetype/cache/ftccache.h, - include/freetype/cache/ftcmanag.h, - include/freetype/cache/ftcmru.h (added), - include/freetype/cache/ftlru.h (removed), - include/freetype/cache/ftcsbits.h, - include/freetype/cache/ftcimage.h, - include/freetype/cache/ftcglyph.h, - src/cache/ftcmru.c, - src/cache/ftcmanag.c, - src/cache/ftccache.c, - src/cache/ftcglyph.c, - src/cache/ftcimage.c, - src/cache/ftcsbits.c, - src/cache/ftccmap.c, - src/cache/ftcbasic.c (added), - src/cache/ftclru.c (removed): - - *Complete* rewrite of the cache sub-system to `solve' the - following points: - - - all public APIs have been moved to FT_CACHE_H, everything - under `include/freetype/cache' is only needed by client - applications that want to implement their own caches - - - a new function named FTC_Manager_RemoveFaceID to deal - with the uninstallation of FaceIDs - - - the image and sbit cache are now abstract classes, that - can be extended much more easily by client applications - - - better performance in certain areas. Further optimizations - to come shortly anyway... - - - the FTC_CMapCache_Lookup function has changed its signature, - charmaps can now only be retrieved by index - - - FTC_Manager_Lookup_Face => FTC_Manager_LookupFace - FTC_Manager_Lookup_Size => FTC_Manager_LookupSize (still in - private header for the moment) - -2003-12-21 Werner Lemberg - - * src/type1/t1load.c (parse_dict): Stop parsing if `eexec' keyword - is encountered. - -2003-12-19 Werner Lemberg - - * src/cff/cfftypes.h (CFF_MAX_CID_FONTS): Increase to 32. For - example, the Japanese Hiragino font already contains 15 subfonts. - - * src/cff/cffload.c (cff_font_load): Deallocate `sids' array for - CID-keyed fonts. - - * devel/ftoption.h: Define FT_DEBUG_MEMORY. - -2003-12-18 Werner Lemberg - - * include/freetype/ttnameid.h (TT_ADOBE_ID_LATIN_1): New macro. - * src/type1/t1objs.c (T1_Face_Init): Use TT_ADOBE_ID* values. - -2003-12-18 Werner Lemberg - - * src/cff/cfftypes.h (CFF_FontRecDictRec): Change type of - `cid_count' to `FT_ULong'. - - * src/cff/cffgload.c (cff_slot_load): Take care of empty `cids' - array. - - * src/cff/cffload.c (cff_charset_done): Free `cids' array. - (cff_font_load): Create cids array only for CID-keyed fonts which - are subsetted. - - * src/cff/cffobjs.c (cff_face_init): Check the availability of - the PSNames modules for non-pure CFFs also. - Set FT_FACE_FLAG_GLYPH_NAMES for a non-pure CFF also if it isn't - CID-keyed. - - * src/cff/rules.mk (CFF_DRV_H): Add cfftypes.h. - -2003-12-17 Werner Lemberg - - * src/sfnt/sfobjs.c (sfnt_init_face): Don't set - FT_FACE_FLAG_GLYPH_NAMES if the font contains a version 3.0 `post' - table. - - * docs/CHANGES: Updated. - -2003-12-17 Masatake YAMATO - - Add new function FT_Get_CMap_Language_ID to extract the language ID - for TrueType/sfnt fonts. - - * include/freetype/internal/services/svttcmap.h: New file. - * include/freetype/internal/ftserv.h (FT_SERVICE_TT_CMAP_H): Add - svttcmap.h. - - * src/sfnt/sfdriver.c: Include ttcmap0.h. - (tt_service_get_cmap_info): New service. - (sfnt_services): Updated. - - * src/sfnt/ttcmap0.c (tt_cmap*_get_info): New functions. - (tt_cmap*_class_rec): Add tt_cmap*_get_info members. - (tt_get_cmap_info): New function. - * src/sfnt/ttcmap0.h: Include FT_SERVICE_TT_CMAP_H. - (TT_CMap_ClassRec): New field `get_cmap_info'. - (tt_get_cmap_info): New declaration. - - * src/base/ftobjs.c: Include FT_SERVICE_TT_CMAP_H. - (FT_Get_CMap_Language_ID): New function implementation. - * include/freetype/tttables.h (FT_Get_CMap_Language_ID): New - function declaration. - -2003-12-16 Werner Lemberg - - * src/sfnt/ttcmap.c, src/sfnt/ttcmap.h: Removed. Obsolete. - - * include/freetype/internal/sfnt.h (SFNT_Interface): Remove - obsolete fields `load_charmap' and `free_charmap'. - (TT_CharMap_Load_Func, TT_CharMap_Free_Func): Removed. - * src/sfnt/sfnt.c: Don't include ttcmap.c. - * src/sfnt/rules.mk (SFNT_DRV_SRC): Don't include ttcmap.c. - * src/sfnt/ttload.c: Don't include ttcmap.h. - * src/sfnt/sfdriver.c: Don't include ttcmap.h. - (sfnt_interface): Updated. - - * include/freetype/internal/tttypes.h (TT_TableDirRec, - TT_CMapDirRec, TT_CMapDirEntryRec, TT_CMap0, TT_CMap2SubHeaderRec, - TT_CMap2Rec, TT_CMap4Segment, TT_CMap4Rec, TT_CMap6, - TT_CMapGroupRec, TT_CMap8_12Rec, TT_CMap10Rec, TT_CharMap_Func, - TT_CharNext_Func, TT_CMapTableRec, TT_CharMapRec): Removed. - Obsolete. - * src/cff/cffobjs.h (CFF_CharMapRec): Removed. Obsolete. - -2003-12-15 Werner Lemberg - - * docs/CHANGES: Updated. - -2003-12-15 Wolfgang Domr鰏e - - * builds/atari/*: New directory for building FreeType 2 on Atari - with the PureC compiler. - -2003-12-12 Wolfgang Domr鰏e - - * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String): Add - cast. - * src/cff/cffdrivr.c (cff_ps_has_glyph_names): Assure that return - value is either 0 or 1. - -2003-12-12 Werner Lemberg - - * src/cff/cffdrivr.c (cff_get_glyph_name): Improve error message. - (cff_get_name_index): Return if no PSNames service is available. - (cff_ps_has_glyph_names): Handle CID-keyed fonts correctly. - * src/cff/cfftypes.h (CFF_CharsetRec): New field `cids', used for - CID-keyed fonts. This is the inverse mapping of `sids'. - * src/cff/cffload.c (cff_charset_load): New argument `invert'. - Initialize charset->cids if `invert' is set. - (cff_font_load): In call to cff_charset_load, set `invert' to true - for CID-keyed fonts. - * src/cff/cffgload.c (cff_slot_load): Handle glyph index as CID - and map it to the real glyph index. - - * docs/CHANGES: Updated. - -2003-12-11 Werner Lemberg - - * src/cff/cffobjs.c (cff_face_init): Don't set - FT_FACE_FLAG_GLYPH_NAMES for CID-keyed fonts. - Don't construct a cmap for CID-keyed fonts. - -2003-12-10 Werner Lemberg - - Use implementation specific SID value 0xFFFF to indicate that - a dictionary element is missing. - - * src/cff/cffload.c (cff_subfont_load): Initialize all fields - which hold SIDs to 0xFFFF. - (cff_index_get_sid_string): Handle SID value 0xFFFF. - Handle case where `psnames' is zero. - (cff_font_load): Updated. - Don't load encoding for CID-keyed CFFs. - - * src/cff/cffobjs.c (cff_face_init): Updated. - Don't check for PSNames module if font is CID-keyed. - Compute style name properly (using the same algorithm as in the - CID driver). - Fix computation of style flags. - - * src/cff/cfftoken.h: Comment out handling of base_font_name. - Rename `postscript' field to `embedded_postscript' - * src/cff/cfftypes.h (CFF_FontRecDictRec): Remove `base_font_name' - and `postscript'. - -2003-12-10 Detlef W黵kner - - * src/pcf/pcfdrivr.c (pcf_get_charset_id): New function (a clone - of the similar BDF function). - (pcf_service_bdf): Use it. - -2003-12-09 Werner Lemberg - - * src/sfnt/sfobjs.c (sfnt_load_face): Set FT_FACE_FLAG_GLYPH_NAMES - only if a `post' table is present. - -2003-12-09 George Williams - - * src/base/ftobjs.c (load_mac_face): Recent versions of Linux - support Mac's HFS+ file system, thus enable code to read /rsrc on - non-Macintosh platforms also. - -2003-12-08 Werner Lemberg - - * include/freetype/internal/psaux.h (PS_TableRec): Change type - of `lengths' to FT_PtrDist. - (T1_DecoderRec): Change type of `subrs_len' to FT_PtrDist. - * include/freetype/internal/t1types.h (T1_FontRec): Change type - of `subrs_len' and `charstrings_len' to FT_PtrDist. - - * src/base/ftobjs.c (Mac_Read_POST_Resource): Replace `junk' - variable with better solution. - (IsMacResource): Remove unused variable `map_len'. - Replace `junk' variable with better solution. - (FT_Open_Face) [!FT_MACINTOSH]: Add conditional - FT_CONFIG_OPTION_MAC_FONTS. - -2003-12-08 Wolfgang Domr鰏e - - * src/autohint/ahhint.c (ah_hinter_hint_edges, - ah_hinter_align_strong_points): Add some casts. - - * src/base/ftoutln.c (FT_OrientationExtremumRec): Change type - of `pos' to FT_Long. - - * src/base/ftobjs.c (Mac_Read_POST_Resource, - Mac_Read_sfnt_Resource): Change type of `len' to FT_Long. - - * src/type42/t42parse.c (t42_parse_dict): Add cast for `n_keywords'. - -2003-12-07 Werner Lemberg - - * docs/raster.txt: New file, taken from FreeType 1 and completely - revised. - -2003-12-04 Masatake YAMATO - - * src/type1/t1driver.c (Get_Interface): Remove FT_UNUSED for - t1_interface. t1_interface is used. - -2003-11-27 David Turner - - * src/pfr/pfrdrivr.c (pfr_get_metrics): Revert incorrect change of - 2003-11-23: For PFR fonts, metrics->x_scale and metrics->y_scale are - the scaling values for outline units, not for metric units. - -2003-11-25 Werner Lemberg - - * src/base/ftcalc.c, include/freetype/internal/ftcalc.h - (FT_MulDiv_No_Round): Surround code with `#ifdef - TT_CONFIG_OPTION_BYTECODE_INTERPRETER ... #endif'. - -2003-11-23 Werner Lemberg - - * src/base/ftcalc.c (FT_MulDiv_No_Round): New function (32 and - 64 bit version). - * include/freetype/internal/ftcalc.h: Updated. - - * src/truetype/ttinterp.c (TT_MULDIV_NO_ROUND): New macro. - (TT_INT64): Removed. - (DO_DIV): Use TT_MULDIV_NO_ROUND. - - * src/pfr/pfrdrivr.c (pfr_get_metrics): Directly use - metrics->x_scale and metrics->y_scale. - -2003-11-22 Rogier van Dalen - - * src/truetype/ttinterp.c (CUR_Func_move_orig): New macro. - (Direct_Move_Orig, Direct_Move_Orig_X, Direct_Move_Orig_Y): New - functions. Similar to Direct_Move, Direct_Move_X, and - Direct_Move_Y but without touching. - (Compute_Funcs): Use new functions. - - (Round_None, Round_To_Grid, Round_To_Half_Grid, Round_Down_To_Grid, - Round_Up_To_Grid, Round_To_Double_Grid, Round_Super, - Round_Super_45): Fix rounding of value zero. - - (DO_DIV): Don't use TT_MULDIV. - - (Ins_SHC): This instruction actually touches the points. - (Ins_MSIRP): Fix undocumented behaviour. - - * src/truetype/ttinterp.h (TT_ExecContextRec): Updated. - -2003-11-22 Werner Lemberg - - * docs/VERSION.DLL, docs/CHANGES: Updated. - - * src/base/ftobjs.c (FT_Set_Char_Size): Make metrics->x_scale and - metrics->y_scale really precise. - - (FT_Load_Glyph): Update computation of linearHoriAdvance and - linearVertAdvance. - - * src/true/type/ttinterp.c (Update_Max): Use FT_REALLOC. - -2003-11-22 David Turner - - * src/autofit/*: More updates. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 8. - * builds/unix/configure.ac (version_info): Set to 9:6:3. - * README: Updated. - -2003-11-13 John A. Boyd Jr. - - * src/bdf/bdfdrivr.c (bdf_interpret_style), src/pcf/pcfread.c - (pcf_interpret_style): Replace spaces with dashes in properties - SETWIDTH_NAME and ADD_STYLE_NAME to simplify parsing. - -2003-11-11 Werner Lemberg - - * docs/CHANGES: Updated. - -2003-11-11 John A. Boyd Jr. - - Handle SETWIDTH_NAME and ADD_STYLE_NAME properties for BDF and PCF - fonts. - - * src/bdf/bdfdrivr.c (bdf_interpret_style): New auxiliary function. - (BDF_Face_Init): Don't handle style properties but call - bdf_interpret_style. - - * src/pcf/pcfread.c (pcf_interpret_style): New auxiliary function. - (pcf_load_font): Don't handle style properties but call - pcf_interpret_style. - -2003-11-07 Werner Lemberg - - - * Version 2.1.7 released. - ========================= - - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 7. - - * builds/unix/ft2unix.h: Fix comments. - - * builds/unix/ftconfig.in: Synchronized with ANSI version. - Use `#undef' in templates as recommended in the autoconf - documentation. - Since real `#undef' lines don't survive during configuration, use - `/undef' instead; the postprocessing facility of the - AC_CONFIG_HEADERS autoconf macro converts them to `#undef'. - - * builds/unix/install.mk (install): Install Unix version of - `ftconfig.h'. - - * builds/unix/unix-cc.in (CFLAGS): Set FT_CONFIG_CONFIG_H macro - to include the correct `ftconfig.h' file. - - * builds/unix/ft-munmap.m4 (FT_MUNMAP_DECL): Removed. - (FT_MUNMAP_PARAM): Updated syntax to autoconf 2.59. - - * builds/unix/freetype2.m4: Updated syntax to autoconf 2.59. - - * builds/unix/configure.ac: Use AC_CONFIG_HEADERS instead of - AC_CONFIG_HEADER to create ftconfig.h, and use second argument - to replace `/undef' with `#undef'. - Don't use FT_MUNMAP_DECL but AC_CHECK_DECLS to check for munmap. - Use AS_HELP_STRING in AC_ARG_WITH. - Update syntax to autoconf 2.59. - - * builds/unix/ltmain.sh: Regenerated with `libtoolize --force - --copy' from libtool 1.5. - * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from - automake 1.7.8. - * builds/unix/configure: Regenerated with autoconf 2.59. - * builds/unix/config.guess, builds/unix/config.sub: Updated from - `config' CVS module at subversions.gnu.org - * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from - `texinfo' CVS module at subversions.gnu.org. - - * builds/vms/ftconfig.h: Synchronized with ANSI version. - - * docs/CUSTOMIZE: Fix documentation error. - * docs/CHANGES, docs/VERSION.DLL, docs/release: Updated. - - * builds/freetype.mk (refdoc): Updated --title. - -2003-11-07 David Turner - - - * Version 2.1.6 released. - ========================= - - - * install: Removed. Obsolete. - -2003-11-04 Werner Lemberg - - * src/sfnt/sfdriver.c: Include FT_SERVICE_SFNT_H. - (sfnt_service_sfnt_table): New service. - (sfnt_services): Updated. - - * docs/license.txt: Reworded. - -2003-11-03 Werner Lemberg - - * include/freetype/*: Add a guard to all public header files which - load FT_FREETYPE_H to reject freetype.h from FreeType 1. - -2003-11-02 Patrick Welche - - * builds/unix/freetype2.m4, builds/unix/ft-munmap.m4: Protect - first argument of AC_DEFUN with brackets to avoid possible - expansion. - -2003-11-02 Werner Lemberg - - * include/freetype/cache/ftcglyph.h: Don't include stddef.h. - - * include/freetype/freetype.h: Fix check for ft2build.h. - -2003-11-01 Werner Lemberg - - * include/freetype/freetype.h: Check that ft2build.h has been - loaded first. - - * src/base/fttype1.c (FT_Get_PS_Font_Info): Fix incorrectly applied - patch. - -2003-10-31 Detlef W黵kner - - * src/base/fttype1.c (FT_Get_PS_Font_Info, FT_Has_PS_Glyph_Names): - Fix parameter order in calls to FT_FACE_FIND_SERVICE. - -2003-10-31 Werner Lemberg - - * include/freetype/internal/ftserv.h - (FT_SERVICE_POSTSCRIPT_NAMES_H): Removed. Unused. - - * src/type42/t42drivr.c (t42_services): Updated. - -2003-10-29 David Turner - - * include/freetype/internal/bdftypes.h: Removed. Obsolete. - * src/base/ftbdf.c: Updated. - - * include/freetype/internal/cfftypes.h: Moved to... - * src/cff/cfftypes.h: This place since no other module needs to - know about those types. - - * include/freetype/internal/t42types.h: Moved to... - * src/type42/t42types.h: This place since no other module needs to - know about those types. - - * include/freetype/internal/services/svbdf.h: Include FT_BDF_H. - - * include/freetype/internal/services/svpsname.h: Renamed to... - * include/freetype/internal/services/svpscmap.h: This. - Updated `FT_Service_PsNames' -> `FT_Service_PsCMaps' and - `POSTSCRIPT_NAMES' -> `POSTSCRIPT_CMAPS' everywhere. - - * include/freetype/internal/services/svpsinfo.h: New file, providing - PostScript info service. - - * include/freetype/internal/ftserv.h (FT_SERVICE_POSTSCRIPT_CMAPS_H, - FT_SERVICE_POSTSCRIPT_INFO_H): New macros for svpscmap.h and - svpsinfo.h. - * include/freetype/internal/internal.h (FT_INTERNAL_TYPE42_TYPES_H, - FT_INTERNAL_CFF_TYPES_H, FT_INTERNAL_BDF_TYPES_H): Removed. - - * src/base/fttype1.c: Don't include FT_INTERNAL_TYPE1_TYPES_H and - FT_INTERNAL_TYPE42_TYPES_H but FT_INTERNAL_SERVICE_H and - FT_SERVICE_POSTSCRIPT_INFO_H. - (FT_Get_PS_Font_Info, FT_Has_PS_Glyph_Names): Use new - POSTSCRIPT_INFO service. - - * src/cff/cffdrivr.c: Include FT_SERVICE_POSTSCRIPT_INFO_H. - (cff_ps_has_glyph_names): New function. - (cff_service_ps_info): New service. - (cff_services): Updated. - - * src/cff/cffload.h, src/cff/cffobjs.h, src/cff/cffparse.h: Don't - include FT_INTERNAL_CFF_TYPES_H but cfftypes.h directly. - - * src/cif/cidriver.c: Include FT_SERVICE_POSTSCRIPT_INFO_H. - (cid_ps_get_font_info): New function. - (cid_service_ps_info): New service. - (cid_services): Updated. - - * src/type1/t1driver.c: Include FT_SERVICE_POSTSCRIPT_INFO_H. - (t1_ps_get_font_info, t1_ps_has_glyph_names): New functions. - (t1_service_ps_info): New service. - (t1_services): Updated. - - * src/type42/t42drivr.c: Include FT_SERVICE_POSTSCRIPT_INFO_H. - (t42_ps_get_font_info, t42_ps_has_glyph_names): New functions. - (t42_service_ps_info): New service. - - * src/type42/t42objs.h: Don't include FT_INTERNAL_TYPE42_TYPES_H - but t42types.h directly. - - * src/psnames/psmodule.c (psnames_interface, psnames_services): - Renamed to... - (pscmaps_interface, pscmaps_services): This. - Updated all users. - - - * src/gzip/infblock.c (inflate_blocks): Remove compiler warning. - -2003-10-22 Werner Lemberg - - * src/type1/t1load.c (parse_encoding): Handle `/Encoding [ ... ]'. - - * src/type1/t1parse.c (T1_Get_Private_Dict): Test whether `eexec' - is real. - - * src/type42/t42parse.c (t42_parse_encoding): Improve boundary - checking while parsing. - - * docs/CHANGES: Updated. - -2003-10-21 Josselin Mouette - - * include/freetype/internal/t1types.h (T1_FontRec): `paint_type' - and `stroke_width' aren't pointers. - - * src/type42/t42objs.c (T42_Face_Done), src/type1/t1objs.c - (T1_Face_Done): Don't free `paint_type' and `stroke_width'. - -2003-10-20 Graham Asher - - * src/winfonts/winfnt.c (fnt_cmap_class): Fix position of `const'. - -2003-10-19 Werner Lemberg - - * src/autohint/ahhint.c (ah_hinter_load_glyph): Patch from - 2003-08-18 introduced a severe bug (FT_Render_Glyph was called - twice under some circumstances, causing strange results). This - is fixed now by clearing the FT_LOAD_RENDER bit of `load_flags'. - - * src/base/ftpfr.c (FT_Get_PFR_Metrics): Initialize `error'. - * src/psaux/psobjs.c (ps_tobytes): Initialize `n'. - * src/type42/t42parse.c (t42_parse_sfnts): Initialize `string_size'. - -2003-10-16 Werner Lemberg - - Completely revised Type 42 parser. It now handles both fonts - produced with ttftot42 (tested version 0.3.1) and - TrueTypeToType42.ps (tested version May 2001; it is necessary to - fix the broken header comment to be `%!PS-TrueTypeFont...'). - - * src/type42/t42objs.c (T42_GlyphSlot_Load): Change fourth - parameter to `FT_UInt'. - * src/type42/t42objs.h: Updated. - - * src/type42/t42parse.h (T42_ParserRec): Change type of `in_memory' - to FT_Bool. - (T42_Loader): Change type of `num_chars' and `num_glyphs' to - FT_UInt. - Add `swap_table' element. - * src/type42/t42parse.c (T42_KEYWORD_COUNT, T1_ToFixed, - T1_ToCoordArray, T1_ToTokenArray): Removed. - (T1_ToBytes): New macro. - (t42_is_alpha, t42_hexval): Removed. - (t42_is_space): Handle `\0'. - (t42_parse_encoding): Updated to use new PostScript parser routines - from psaux. - Handle `/Encoding [ ... ]' also. - (T42_Load_Status): New enumeration. - (t42_parse_sfnts): Updated to use new PostScript parser routines - from psaux. - (t42_parse_charstrings): Updated to use new PostScript parser - routines from psaux. - Handle `/CharStrings << ... >>' also. - Don't expect that /.notdef is the first element in dictionary. Copy - code from type1 module to handle this. - (t42_parse_dict): Updated to use new PostScript parser routines - from psaux. - Remove code for synthetic fonts (which can't occur in Type 42 - fonts). - (t42_loader_done): Release `swap_table'. - - * src/psaux/psobjs.c (skip_string): Increase `cur' properly. - - * src/type1/t1load.c (parse_charstrings): Make test for `.notdef' - faster. - -2003-10-15 Graham Asher - - * src/autohint/ahglobal.c (blue_chars), src/winfonts/winfnt.c - (fnt_cmap_class_rec, fnt_cmap_class), src/bdf/bdflib.c (empty, - _num_bdf_properties), src/gzip/infutil.c (inflate_mask), - src/gzip/inffixed.h (fixed_bl, fixed_bd, fixed_tl, fixed_td), - src/gzip/inftrees.h (inflate_trees_fixed), srf/gzip/inftrees.c - (inflate_trees_fixed): Decorate with more `const' to avoid - writable global variables which are disallowed on ARM. - -2003-10-08 Werner Lemberg - - * src/type1/t1load.c (parse_font_matrix, parse_charstrings): Remove - code specially for synthetic fonts; this is handled elsewhere. - (parse_encoding): Remove code specially for synthetic fonts; this is - handled elsewhere. - Improve boundary checking while parsing. - (parse_dict): Improve boundary checking while parsing. - Use ft_memcmp to simplify code. - -2003-10-07 Werner Lemberg - - * src/type1/t1load.c (parse_subrs, parse_dict): Handle synthetic - fonts properly. - (parse_charstrings): Copy correct number of characters into - `name_table'. - -2003-10-06 Werner Lemberg - - Heavy modification of the PS parser to handle comments and strings - correctly. This doesn't slow down the loading of PS fonts - significantly since charstrings aren't affected. - - * include/freetype/config/ftstdlib.h (ft_xdigit): Renamed to... - (ft_isxdigit): This. Updated all callers. - (ft_isdigit): New alias to `isdigit'. - - * include/freetype/internal/psaux.h (PS_Parser_FuncsRec): Renamed - `skip_alpha' to `skip_PS_token'. - Add parameter to `to_bytes' and change some argument types. - - * src/psaux/psauxmod.c (ps_parser_funcs): Updated. - * src/psaux/psobjs.c (ft_char_table): New array to map character - codes (ASCII and EBCDIC) of digits to numbers. - (OP): New auxiliary macro holding either `>=' or `<' depending on - the character encoding. - (skip_comment): New function. - (skip_spaces): Use it. - (skip_alpha): Removed. - (skip_literal_string, skip_string): New functions. - (ps_parser_skip_PS_token): New function. This is a better - replacement of... - (ps_parser_skip_alpha): Removed. - (ps_parser_to_token, ps_parser_to_token_array): Updated. - (T1Radix): Rewritten, using `ft_char_table'. - (t1_toint): Renamed to... - (ps_toint): This. Update all callers. - Use `ft_char_table'. - (ps_tobytes): Add parameter to handle delimiters and change some - argument types. - Use `ft_char_table'. - (t1_tofixed): Renamed to... - (ps_tofixed): This. Update all callers. - Use `ft_char_table'. - (t1_tocoordarray): Renamed and updated to... - (ps_tocoordarray): This. Update all callers. - (t1_tofixedarray): Renamed and updated to... - (ps_tofixedarray): This. Update all callers. - (t1_tobool): Renamed to... - (ps_tobool): This. Update all callers. - (ps_parser_load_field): Updated. - (ps_parser_load_field_table): Use `T1_MAX_TABLE_ELEMENTS' - everywhere. - (ps_parser_to_int, ps_parser_to_fixed, ps_parser_to_coord_array, - ps_parser_to_fixed_array): Skip spaces. Updated. - (ps_parser_to_bytes): Add parameter to handle delimiters and change - some argument types. Updated. - * src/psaux/psobjs.h: Updated. - - * src/cid/cidload.c (cid_parse_dict): Updated. - * src/cid/cidparse.c (cid_parser_new): Check whether the `StartData' - token was really found. - * src/cid/cidparse.h (cid_parser_skip_alpha): Updated and renamed - to... - (cid_parser_skip_PS_token): This. - - * src/type1/t1parse.h (T1_ParserRec): Use `FT_Bool' for boolean - fields. - (T1_Skip_Alpha): Replaced with... - (T1_Skip_PS_Token): This new macro. - * src/type1/t1parse.c (hexa_value): Removed. - (T1_Get_Private_Dict): Use `ft_isxdigit' and - `psaux->ps_parser_funcs_to_bytes' for handling ASCII hexadecimal - encoding. - After decrypting, replace the four random bytes at the beginning - with whitespace. - * src/type1/t1load.c (t1_allocate_blend): Use proper error values. - (parser_blend_design_positions, parse_blend_design_map, - parse_weight_vector): Updated. - (is_space): Handle `\f' also. - (is_name_char): Removed. - (read_binary_data): Updated. - (parse_encoding): Use `ft_isdigit'. - Updated. - (parse_subrs): Updated. - (TABLE_EXTEND): New macro. - (parse_charstrings): Updated. - Provide a workaround for buggy fonts which have more entries in the - /CharStrings dictionary then expected; the function now adds some - slots and skips entries which still exceed the new limit. - (parse_dict): Updated. - Terminate on the token `closefile'. - - * src/type42/t42parse.c (T1_Skip_Alpha): Replaced with... - (T1_Skip_PS_Token): This new macro. Updated all callers. - (t42_parse_encoding): Use `ft_isdigit'. - - - * src/base/ftmm.c (ft_face_get_mm_service): Return FT_Err_OK if - success. - -2003-10-05 Werner Lemberg - - * include/freetype/ftmodule.h: Renamed to... - * include/freetype/ftmodapi.h: This to avoid duplicate file names. - * include/freetype/config/ftheader.h (FT_MODULE_H): Updated. - -2003-10-04 Werner Lemberg - - * src/base/ftoutln.c (FT_OrientationExtremumRec, - FT_Outline_Get_Orientation): Trivial typo fixes to make it compile. - -2003-10-02 Markus F.X.J. Oberhumer - - * src/winfonts/winfnt.c (FT_WinFNT_HeaderRec): `color_table_offset' - has four bytes, not two. - Fix all users. - (fnt_font_load, FNT_Load_Glyph): Add more font validity tests. - -2003-10-01 David Turner - - * src/autofit/*: Adding first source files of the new multi-script - `auto-fitter'. - - * include/freetype/ftoutln.h (FT_Orientation): New enumeration. - (FT_Outline_Get_Orientation): New declaration. - - * src/base/ftoutln.c (FT_OrientationExtremumRec): New structure. - (ft_orientation_extremum_compute): New auxiliary function. - (FT_Outline_Get_Orientation): New function to compute the fill - orientation of a given glyph outline. - - * include/freetype/internal/ftserv.h (FT_FACE_LOOKUP_SERVICE): Fixed - trivial bug which could crash the font engine when a cached service - pointer was retrieved. - -2003-09-30 Werner Lemberg - - * src/cid/cidload.c (cid_parse_dict): Skip token if no keyword is - found. - - * src/type1/t1parse.c (IS_T1_WHITESPACE, IS_T1_LINESPACE, - IS_T1_SPACE): Removed. - (PFB_Tag): Removed. - (read_pfb_tag): Don't use PFB_Tag. - - * src/type42/t42parse.c (t42_is_space): Handle `\f' also. - (t42_parse_encoding): Handle synthetic fonts. - -2003-09-29 Werner Lemberg - - * include/freetype/internal/t1types.h: Don't include - FT_INTERNAL_OBJECTS_H but FT_INTERNAL_SERVICE_H. - * src/truetype/ttobjs.c: Don't include - FT_SERVICE_POSTSCRIPT_NAMES_H. - -2003-09-29 David Turner - - Added new service to handle glyph name dictionaries, replacing the - old internal header named `psnames.h' by `services/svpsname.h'. - Note that this is different from `services/svpostnm.h' which only - handles the retrieval of PostScript font names for a given face. - (Should we merge these two services into a single header?) - - * include/freetype/internal/psnames.h: Removed. Most of its - contents is moved to... - * include/freetype/internal/services/svpsname.h: New file. - - * include/freetype/internal/services/svpostnm.h - (FT_SERVICE_ID_POSTSCRIPT_NAME): Replaced with... - (FT_SERVICE_ID_POSTSCRIPT_FONT_NAME): New macro. - (PsName): Service named changed to... - (PsFontName): This. - Updated `FT_Service_PsName' -> `FT_Service_PsFontName' and - `POSTSCRIPT_NAME' -> `POSTSCRIPT_FONT_NAME' everywhere. - - * include/freetype/internal/internal.h - (FT_INTERNAL_POSTSCRIPT_NAMES_H): Removed. - * include/freetype/internal/psaux.h: Include - FT_SERVICE_POSTSCRIPT_NAMES_H. - (T1_DecoderRec): Updated type of `psnames'. - * include/freetype/internal/t1types.h: Don't include - FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. - Include FT_INTERNAL_OBJECTS_H. - * include/freetype/internal/t42types.h: Don't include - FT_INTERNAL_POSTSCRIPT_NAMES_H. - * include/freetype/internal/tttypes.h (TT_FaceRec): Updated. - - * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE): Changed - order of parameters. All callers updated. - (FT_FACE_FIND_GLOBAL_SERVICE): New macro to look up a service - globally, checking all modules. - (FT_ServiceCacheRec): Updated. - (FT_SERVICE_POSTSCRIPT_NAMES_H): New macro for accessing - `svpsname.h'. - - * include/freetype/internal/ftobjs.h, src/base/ftobjs.c - (ft_module_get_service): New function. - - * src/cff/cffdrivr.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H - but FT_SERVICE_POSTSCRIPT_NAMES_H. - (cff_get_glyph_name, cff_get_name_index): Use new POSTSCRIPT_NAMES - service. - * src/cff/cffcmap.c (cff_cmap_unicode_init): Updated. - * src/cff/cffload.c, src/cff/cffload.h: Don't include - FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. - (cff_index_get_sid_string): Updated. - * src/cff/cffobjs.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H - but FT_SERVICE_POSTSCRIPT_NAMES_H. - (cff_face_init): Use new POSTSCRIPT_NAMES service. - * src/cff/cffobjs.h: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H - but FT_SERVICE_POSTSCRIPT_NAMES_H. - - * src/cid/cidobjs.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H - but FT_SERVICE_POSTSCRIPT_NAMES_H. - (cid_face_init): Use new POSTSCRIPT_NAMES service. - * src/cid/cidriver.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H. - - * src/psaux/t1cmap.c (t1_cmap_std_init, t1_cmap_unicode_init): Use - new POSTSCRIPT_NAMES service. - * src/psaux/t1decode.h (t1_lookup_glyph_by_stdcharcode, - t1_decode_init): Use new POSTSCRIPT_NAMES service. - * src/psaux/t1cmap.h, src/psaux/t1decode.h: Dont' include - FT_INTERNAL_POSTSCRIPT_NAMES_H. - - * src/psnames/psmodule.c: Don't include - FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. - (ps_build_unicode_table): Renamed to... - (ps_unicodes_init): This. - (ps_lookup_unicode): Renamed to... - (ps_unicodes_char_index): This. - (ps_next_unicode): Renamed to... - (ps_unicodes_char_next): This. - (psnames_interface): Updated. - (psnames_services): New services list. - (psnames_get_service): New function. - (psnames_module_class): Updated. - - * src/sfnt/sfobjs.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H - but FT_SERVICE_POSTSCRIPT_NAMES_H. - (sfnt_init_face): Use new POSTSCRIPT_NAMES service. - * src/sfnt/ttpost.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H - but FT_SERVICE_POSTSCRIPT_NAMES_H. - (tt_face_get_ps_name): Updated. - - * src/truetype/ttobjs.c: Don't include - FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. - - * src/type1/t1driver.c: Don't include - FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. - * src/type1/t1objs.c: Don't include - FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. - (T1_Face_Init): Use new POSTSCRIPT_NAMES service. - - * src/type42/t42drivr.c (t42_get_ps_name): Renamed to... - (t42_get_ps_font_name): This. - (t42_service_ps_name): Renamed to... - (t42_service_ps_font_name): This. - (t42_services): Updated. - * src/type42/t42objs.c (T42_Face_Init): Use new POSTSCRIPT_NAMES - service. - * src/type42/t42objs.h: Don't include - FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. - - - * src/base/ftglyph.c (FT_Get_Glyph): Don't access `slot' before - testing its validity. Reported by Henry Maddocks - . - -2003-09-21 Werner Lemberg - - * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE): - Fix compilation warning (s/pptr/Pptr/). - - * include/freetype/internal/internal.h (FT_INTERNAL_PFR_H, - FT_INTERNAL_FNT_TYPES_H): Removed. - -2003-09-21 David Turner - - Migrating the PFR and WINFNT drivers to the new service-based - internal API. - - * include/freetype/internal/fnttypes.h: Removed. Most of its data - are moved to winfnt.h and... - * include/freetype/internal/services/svwinfnt.h: New file. - - * include/freetype/internal/pfr.h: Removed. Most of its data are - moved to... - * include/freetype/internal/services/svpfr.h: New file. - - * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE, - FT_FACE_LOOKUP_SERVICE): Simplify fix of 2003-09-16 by removing - pointer type argument. - Updated all callers. - Update macro names of services header files. - - * src/base/ftobjs.c (FT_Get_Name_Index): Simplified code. - - * src/base/ftpfr.c: Include FT_SERVICE_PFR_H instead of - FT_INTERNAL_PFR_H. - (ft_pfr_check, FT_Get_PFR_Metrics, FT_Get_PFR_Kerning, - FT_Get_PFR_Advance): Use services provided in `PFR_METRICS'. - - * src/base/ftwinfnt.c: Include FT_SERVICE_WINFNT_H instead of - FT_INTERNAL_FNT_TYPES_H. - (FT_Get_WinFNT_Header): Use service provided in `WINFNT'. - - * src/pfr/pfrdrivr.c: Include FT_SERVICE_PFR_H and - FT_SERVICE_XFREE86_NAME_H instead of FT_INTERNAL_PFR_H. - (pfr_service_bdf): Updated. - (pfr_services): New services list. - (pfr_get_service): New function. - (pfr_driver_class): Updated. - - * src/winfonts/winfnt.c: Include FT_SERVICE_WINFNT_H and - FT_SERVICE_XFREE86_NAME_H instead of FT_INTERNAL_FNT_TYPES_H. - (winfnt_get_header, winfnt_get_service): New functions. - (winfnt_service_rec): New structure providing WINFNT services. - (winfnt_services): New services list. - (winfnt_driver_class): Updated. - * src/winfonts/winfnt.h: Add most of the removed fnttypes.h data. - - * src/sfnt/sfdriver.c (sfnt_service_ps_name): Fix typo. - - * src/type1/t1driver.c (t1_service_ps_name): Fix typo. - - * src/cff/cffobjs.c, src/cid/cidobjs.c, src/pfr/pfrsbit.c, - src/psaux/psobjs.c, src/sfnt/sfobjs.c, src/truetype/ttobjs.c, - src/type1/t1objs.c, src/type42/t42objs.c: Removing various compiler - warnings. - -2003-09-19 David Bevan - - * src/type1/t1parse.c (pfb_tag_fields): Removed. - (read_pfb_tag): Fix code so that it doesn't fail on end-of-file - indicator (0x8003). - * docs/CHANGES: Updated. - -2003-09-16 Werner Lemberg - - * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE, - FT_FACE_LOOKUP_SERVICE): Add parameter to pass pointer type. - Ugly, I know, but this is needed for compilation with C++ -- - maybe someone knows a better solution? - Updated all callers. - - * src/base/ftobjs.c (FT_Get_Name_Index, FT_Get_Glyph_Name): Remove - C++ compiler warnings. - - * src/base/ftbdf.c (FT_Get_BDF_Charset_ID, FT_Get_BDF_Property): - Fix order of arguments passed to FT_FACE_FIND_SERVICE. - -2003-09-15 Werner Lemberg - - Avoid header files with identical names. - - * include/freetype/internal/services/bdf.h: Renamed to... - * include/freetype/internal/services/svbdf.h: This. - Add copyright notice. - * include/freetype/internal/services/glyfdict.h: Renamed to... - * include/freetype/internal/services/svgldict.h: This. - Add copyright notice. - * include/freetype/internal/services/multmast.h: Renamed to... - * include/freetype/internal/services/svmm.h: This. - Add copyright notice. - Add FT_BEGIN_HEADER and FT_END_HEADER. - * include/freetype/internal/services/sfnt.h: Renamed to... - * include/freetype/internal/services/svsfnt.h: This. - Add copyright notice. - * include/freetype/internal/services/postname.h: Renamed to... - * include/freetype/internal/services/svpostnm.h: This. - Add copyright notice. - * include/freetype/internal/services/xf86name.h: Renamed to... - * include/freetype/internal/services/svxf86nm.h: This. - Add copyright notice. - - * include/freetype/internal/ftserv.h: Add FT_BEGIN_HEADER and - FT_END_HEADER. - Add copyright notice. - Update macro names of services header files. - - * builds/freetype.mk (SERVICES_DIR): New variable. - (BASE_H): Add services header files. - -2003-09-11 Werner Lemberg - - * builds/toplevel.mk (distclean): Remove `builds/unix/freetype2.pc'. - - * src/cff/cffdrivr.c: Don't load headers twice. - - * include/freetype/internal/ftserv.h (FT_SERVICE_SFNT_H): New macro. - * src/base/ftobjs.c: Include FT_SERVICE_SFNT_H. - - * src/cff/cffcmap.c: Include `cfferrs.h'. - * src/pfr/pfrdrivr.c: Include `pfrerror.h'. - * src/sfnt/sfdriver.c: Include `sferrors.h'. - * src/psaux/psobjs.h: Add declaration for `ps_parser_to_bytes'. - -2003-09-11 David Turner - - Introducing the concept of `module services'. This is the first - step towards a massive simplification of the engine's internals, in - order to get rid of various numbers of hacks. - - Note that these changes will break source & binary compatibility for - authors of external font drivers. - - * include/freetype/config/ftconfig.h (FT_BEGIN_STMNT, FT_END_STMNT, - FT_DUMMY_STMNT): New macros. - - * include/freetype/internal/ftserv.h: New file, containing the new - structures and macros to provide `services'. - - * include/freetype/internal/internal.h (FT_INTERNAL_EXTENSION_H, - FT_INTERNAL_EXTEND_H, FT_INTERNAL_HASH_H, FT_INTERNAL_OBJECT_H): - Removed, obsolete. - (FT_INTERNAL_SERVICE_H): New macro for `ftserv.h'. - - * include/freetype/internal/services/bdf.h, - include/freetype/internal/services/glyfdict.h, - include/freetype/internal/services/postname.h, - include/freetype/internal/services/xf86name.h: New files. - - * include/freetype/ftmm.h (FT_Get_MM_Func, FT_Set_MM_Design_Func, - FT_Set_MM_Blend_Func): Function pointers moved (in modified form) - to... - * include/freetype/internal/services/multmast.h: New file. - - * include/freetype/internal/sfnt.h (SFNT_Interface): `get_interface' - is now of type `FT_Module_Requester'. - (SFNT_Get_Interface_Func, SFNT_Load_Table_Func): Function pointers - moved (in modified form) to... - * include/freetype/internal/servies/sfnt.h: New file. - - * include/freetype/tttables.h (FT_Get_Sfnt_Table_Func): Function - pointer moved (in modified form) to `services/sfnt.h'. - - * include/freetype/ftmodule.h (FT_Module_Interface): Make it a - a typedef to `FT_Pointer'. - - * include/freetype/internal/tttypes.h (TT_FaceRec): Add - `postscript_name'. - * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Remove - `postscript_name'. - Add `services' element. - (FT_LibraryRec): Remove `meta_class'. - - * src/base/ftbdf.c: Include FT_SERVICE_BDF_H. - (test_font_type): Removed. - (FT_Get_BDF_Charset_ID, FT_Get_BDF_Property): Use services - provided in `FT_SERVICE_ID_BDF'. - - * src/base/ftmm.c: Include FT_SERVICE_MULTIPLE_MASTERS_H. - (ft_face_get_mm_service): New auxiliary function to get services - from `FT_SERVICE_ID_MULTI_MASTERS'. - (FT_Get_Multi_Master, FT_Set_MM_Design_Coordinates, - FT_Set_MM_Blend_Coordinates): Use `ft_face_get_mm_service'. - - * src/base/ftobjs.c: Include FT_SERVICE_POSTSCRIPT_NAME_H and - FT_SERVICE_GLYPH_DICT_H. - (ft_service_list_lookup): New function to get a specific service. - (destroy_face): Updated. - (Mac_Read_POST_Resource): Simplify some code. - (IsMacResource): Fix warnings. - (FT_Get_Name_Index, FT_Get_Glyph_Name): Use services provided in - `FT_SERVICE_ID_GLYPH_DICT'. - (FT_Get_Postscript_Name): Use service provided in - `FT_SERVICE_ID_POSTSCRIPT_NAME'. - (FT_Get_Sfnt_Table, FT_Load_Sfnt_Table): Use services provided in - `FT_SERVICE_ID_SFNT_TABLE'. - - * src/base/ftxf86.c: Include FT_SERVICE_XFREE86_NAME_H. - (FT_Get_X11_Font_Format): Use service provided in - `FT_SERVICE_ID_XF86_NAME'. - - * src/bdf/bdfdrivr.c: Include FT_SERVICE_BDF_H and - FT_SERVICE_XFREE86_NAME_H. - (bdf_get_charset_id): New function. - (bdf_service_bdf): New structure providing BDF services. - (bdf_services): New services list. - (bdf_driver_requester): Use `ft_service_list_lookup'. - - * src/cff/cffdrivr.c: Include FT_SERVICE_XFREE86_NAME_H and - FT_SERVICE_GLYPH_DICT_H. - (cff_service_glyph_dict): New structure providing CFF services. - (cff_services): New services list. - (cff_get_interface): Use `ft_service_list_lookup'. - - * src/cid/cidriver.c: Include FT_SERVICE_POSTSCRIPT_NAME_H and - FT_SERVICE_XFREE86_NAME_H. - (cid_service_ps_name): New structure providing CID services. - (cid_services): New services list. - (cid_get_interface): Use `ft_service_list_lookup'. - - * src/pcf/pcfdrivr.c: Include FT_SERVICE_BDF_H and - FT_SERVICE_XFREE86_NAME_H. - (pcf_service_bdf): New structure providing PCF services. - (pcf_services): New services list. - (pcf_driver_requester): Use `ft_service_list_lookup'. - - * src/sfnt/sfdriver.c: Include FT_SERVICE_GLYPH_DICT_H and - FT_SERVICE_POSTSCRIPT_NAME_H. - (get_sfnt_glyph_name): Renamed to... - (sfnt_get_glyph_name): This. - (get_sfnt_postscript_name): Renamed to... - (sfnt_get_ps_name): This. - Updated. - (sfnt_service_glyph_dict, sfnt_service_ps_name): New structures - providing services. - (sfnt_services): New services list. - (sfnt_get_interface): Use `ft_service_list_lookup'. - - * src/truetype/ttdriver.c: Include FT_SERVICE_XFREE86_NAME_H. - (tt_services): New services list. - (tt_get_interface): Use `ft_service_list_lookup'. - - * src/type1/t1driver.c: Include FT_SERVICE_MULTIPLE_MASTERS_H, - FT_SERVICE_GLYPH_DICT_H, FT_SERVICE_XFREE86_NAME_H, and - FT_SERVICE_POSTSCRIPT_NAME_H. - (t1_service_glyph_dict, t1_service_ps_name, - t1_service_multi_masters): New structures providing Type 1 services. - (t1_services): New services list. - (Get_Interface): Use `ft_service_list_lookup'. - - * src/type42/t42drivr.c: Include FT_SERVICE_XFREE86_NAME_H, - FT_SERVICE_GLYPH_DICT_H, and FT_SERVICE_POSTSCRIPT_NAME_H. - (t42_service_glyph_dict, t42_service_ps_name): New strucures - providing Type 42 services. - (t42_services): New services list. - (T42_Get_Interface): Use `ft_service_list_lookup'. - - - * README, docs/CHANGES: Updating version numbers for 2.1.6, and - removing obsolete warnings in the documentation. - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 6. - * builds/unix/configure.ac (version_info): Set to 9:5:3. - * builds/unix/configure: Regenerated. - - * include/freetype/internal/ftcore.h, - include/freetype/internal/ftexcept.h, - include/freetype/internal/fthash.h, - include/freetype/internal/ftobject.h: Removed. Obsolete. - -2003-09-09 David Turner - - Fixing PFR kerning support. The tables within the font file contain - (charcode,charcode) kerning pairs, we need to convert them to - (gindex,gindex). - - * src/base/ftpfr.c (ft_pfr_check): Fix serious typo. - * src/pfr/prfload.c: Remove dead code. - (pfr_get_gindex, pfr_compare_kern_pairs, pfr_sort_kerning_pairs): - New functions. - (pfr_phy_font_done): Free `kern_pairs'. - (pfr_phy_font_load): Call `pfr_sort_kerning_pairs'. - * src/pfr/pfrobjs.c (pfr_face_get_kerning): Fix kerning extraction. - * src/pfr/pfrtypes.h (PFR_KERN_PAIR_INDEX): New macro. - (PFR_KernPairRec): Make `kerning' an FT_Int. - (PFR_PhyFontRec): New element `kern_pairs'. - (PFR_KernFlags): Values of PFR_KERN_2BYTE_CHAR and - PFR_KERN_2BYTE_ADJ were erroneously reversed. - - * include/freetype/ftoption.h: Commenting out the macro - TT_CONFIG_OPTION_BYTECODE_INTERPRETER. - 2003-09-02 David Turner + * include/freetype/config/ftoption.h: commenting out the + macro TT_CONFIG_OPTION_BYTECODE_INTERPRETER so that package + managers that define it with additionnal compilation command line + options (e.g. with -DTT_CONFIG_OPTION_BYTECODE_INTERPRETER) still + work correctly. - * Version 2.1.5 released. - ========================= - + Also added a note to indicate that TT_CONFIG_OPTION_UNPATENTED_HINTING + doesn't work as advertised yet. 2003-08-31 Manish Singh @@ -2564,8 +1076,8 @@ (not defined, but in comments) for the unpatented hinting system. * include/freetype/internal/tttypes.h (TT_FaceRec) - [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: New element `FT_Bool - unpatented_hinting'. + [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: New element "FT_Bool + unpatented_hinting". * src/truetype/ttinterp.c (NO_APPLE_PATENT, APPLE_THRESHOLD): Removed. @@ -2631,8 +1143,8 @@ * src/pcf/pcfread.c (pcf_load_font): Fixed the computation of face->num_glyphs. We must increase the value by 1 to respect the - convention that glyph index 0 always corresponds to the `missing - glyph'. + convention that glyph index 0 always corresponds to the "missing + glyph". 2003-04-24 Werner Lemberg @@ -2728,7 +1240,7 @@ 2003-04-09 Torrey Lyons * src/base/ftmac.c (open_face_from_buffer): Removed a double-free - bug that had nasty consequences when trying to open an `invalid' + bug that had nasty consequences when trying to open an "invalid" font on a Mac. 2003-04-09 Mike Fabian @@ -2740,14 +1252,14 @@ 2003-04-08 David Turner - * Version 2.1.4 released. - ========================= + * Version 2.1.4 is released. + ============================ 2003-04-03 Martin Muskens * src/type1/t1load.c (T1_Open_Face): Fixed the code to make it - handle special cases where a font only contains a `.notdef' glyph + handle special cases where a font only contains a ".notdef" glyph (happens in PDF-embedded fonts). Otherwise, FT_Panic was called. 2003-03-27 David Turner @@ -2856,8 +1368,8 @@ 2003-03-13 David Turner Added new environment variables to control memory debugging with - FreeType. See the description of `FT2_DEBUG_MEMORY', - `FT2_ALLOC_TOTAL_MAX' and `FT2_ALLOC_COUNT_MAX' in DEBUG.TXT. + FreeType. See the description of "FT2_DEBUG_MEMORY", + "FT2_ALLOC_TOTAL_MAX" and "FT2_ALLOC_COUNT_MAX" in DEBUG.TXT. * src/base/ftdbgmem.c (FT_MemTableRec): Add `alloc_count', `bound_total', `alloc_total_max', `bound_count', `alloc_count_max'. @@ -2902,7 +1414,7 @@ (ftc_cmap_family_init): The cmap cache now supports UCS-4 charmaps when available in Asian fonts. - * src/sfnt/ttload.c, src/base/ftobjs.c: Changed `asian' to `Asian' + * src/sfnt/ttload.c, src/base/ftobjs.c: Changed "asian" to "Asian" in comments. 2003-02-25 David Turner @@ -2923,7 +1435,7 @@ - The table loaded now scans for *undocumented* elements of a physical font's auxiliary data record. This is necessary to - retrieve the `real' family and style names. + retrieve the "real" family and style names. NOTE THAT THESE CHANGES THE FAMILY NAME OF MANY PFR FONTS! @@ -2969,7 +1481,7 @@ `exec->metrics'. * src/autohint/ahhint.c (ah_hinter_load): Disabled the advance width - `correction' which seemed to provide more trouble than benefits. + "correction" which seemed to provide more trouble than benefits. 2003-02-13 Graham Asher @@ -3010,7 +1522,7 @@ * src/pfr/pfrsbit.c: Removed compiler warnings. * src/cache/ftccmap.c (ftc_cmap_family_init): Changed an FT_ERROR - into an FT_TRACE1 since it caused `ftview' and others to dump too + into an FT_TRACE1 since it caused "ftview" and others to dump too much junk when trying to display a waterfall with a font without a Unicode charmap (e.g. SYMBOL.TTF). @@ -3074,9 +1586,9 @@ (pcf_find_property): Decorate it with FT_LOCAL_DEF. * src/pcf/pcfread.h: New file, providing `pcf_find_property'. - * src/sfnt/ttload.c (sfnt_dir_check): Relaxed the `head' table size + * src/sfnt/ttload.c (sfnt_dir_check): Relaxed the "head" table size verification to accept a few broken fonts who pad the size - incorrectly (the table should be padded, but its `size' field + incorrectly (the table should be padded, but its "size" field shouldn't according to the specification). 2003-01-18 Werner Lemberg @@ -3142,9 +1654,9 @@ Patches to the auto-hinter in order to slightly improve the output. Note that everything is controlled through the new - FT_CONFIG_OPTION_CHESTER_HINTS defined in `ftoption.h'. There are + FT_CONFIG_OPTION_CHESTER_HINTS defined in "ftoption.h". There are also individual FT_CONFIG_CHESTER_XXX macros to control individual - `features'. + "features". Note that all improvements are enabled by default, but can be tweaked for optimization and testing purposes. The configuration @@ -3186,11 +1698,11 @@ 2003-01-08 Huw Dawies * src/winfonts/winfnt.c (winfnt_header_fields): Read 16 bytes into - `reserved2', not `reserved'. + "reserved2", not "reserved". * src/base/ftobjs.c (find_unicode_charmap): Fixed the error code returned when the font doesn't contain a Unicode charmap. This - allows FT2 to load `symbol.ttf' and a few others correctly since the + allows FT2 to load "symbol.ttf" and a few others correctly since the last release. (open_face): Fix return value. @@ -3243,7 +1755,7 @@ assertion, and changing code to avoid hash table size contraction. * src/base/Jamfile, src/base/rules.mk, src/base/descrip.mms: Adding - `ftstroker' to default build, as optional component. + "ftstroker" to default build, as optional component. 2002-12-26 David Turner @@ -3333,8 +1845,8 @@ 2002-11-18 David Turner - * Version 2.1.3 released. - ========================= + * Version 2.1.3 is released. + ============================ 2002-11-07 David Turner @@ -3374,7 +1886,7 @@ configuration (typically by adding -D flags at compile time). * src/sfnt/ttcmap0.c (tt_face_build_cmaps): Removed compiler - warnings in optimized mode relative to the `volatile' local + warnings in optimized mode relative to the "volatile" local variables. This was not a compiler bug after all, but the fact that a pointer to a volatile variable is not the same as a volatile pointer to a variable :-) @@ -3400,9 +1912,9 @@ 2002-11-01 David Turner - Added PFR-specific public API. Fixed the kerning retrievel routine - (it returned invalid values when the outline and metrics resolution - differ). + Added PFR-specific public API. Fixed the kerning retrievel routine + (it returned invalid values when the outline and metrics resolution + differ). * include/freetype/ftpfr.h, include/freetype/internal/pfr.h: New files. @@ -3506,8 +2018,8 @@ src/tools/docmaker/tohtml.py: Fixing a few nasty bugs. * src/sfnt/ttcmap0.c (tt_cmap4_validate): The validator for format 4 - sub-tables is now capable of dealing with invalid `length' fields at - the start of the sub-table. This allows fonts like `mg______.ttf' + sub-tables is now capable of dealing with invalid "length" fields at + the start of the sub-table. This allows fonts like "mg______.ttf" (i.e. Marriage) to return accurate charmaps. * docs/CHANGES: Updated. @@ -3771,7 +2283,7 @@ Removed conditional code. This fixes a bug that prevented compilation in debug mode of template instantiation. - * include/freetype/ftimage.h: Removed incorrect `zft_' definitions + * include/freetype/ftimage.h: Removed incorrect "zft_" definitions and updated constants documentation comments. * src/cff/cffparse.c (cff_parser_run): Fixed the CFF table loader. @@ -3779,7 +2291,7 @@ certain fonts. * include/freetype/freetype.h (FT_FaceRec): Updating documentation - comment. The `descender' value is always *negative*, not positive. + comment. The "descender" value is always *negative*, not positive. 2002-09-09 Owen Taylor @@ -4083,7 +2595,7 @@ The automatic and Postscript hinter now automatically detect inflection points in glyph outlines and treats them specially. This is very useful to prevent nasty effect like the disappearing - diagonals of `S' and `s' in many, many fonts. + diagonals of "S" and "s" in many, many fonts. * src/autohint/ahtypes.h (ah_flag_inflection): New macro. * src/autohint/ahangles.c (ah_angle_diff): New function. @@ -4097,8 +2609,8 @@ * src/tools/docmaker/docmaker.py, src/tools/docmaker/utils.py, src/tools/docmaker/tohtml.py: Updating the DocMaker tool. - * include/freetype/freetype.h: Changing the type of the `load_flags' - parameter from `FT_Int' to `FT_Int32', this in order to support more + * include/freetype/freetype.h: Changing the type of the "load_flags" + parameter from "FT_Int" to "FT_Int32", this in order to support more options. This should only break binary and/or source compatibility on 16-bit platforms (Atari?). (FT_LOAD_NO_AUTOHINT): New macro. @@ -4267,7 +2779,7 @@ 2002-07-30 David Turner * include/freetype/ftincrem.h: Adding new experimental header file - to demonstrate a `cleaner' API to support incremental font loading. + to demonstrate a "cleaner" API to support incremental font loading. * include/freetype/config/ftheader.h (FT_INCREMENTAL_H): New macro. @@ -4303,10 +2815,10 @@ 2002-07-24 Graham Asher * src/truetype/ttobjs.c: Fix for bug reported by Sven Neumann - [sven@gimp.org] on the FreeType development forum: `If + [sven@gimp.org] on the FreeType development forum: "If FT_CONFIG_OPTION_INCREMENTAL is undefined (this is the default), the TrueType loader crashes in line 852 of src/truetype/ttgload.c when - it tries to access face->glyph_locations.' + it tries to access face->glyph_locations." 2002-07-18 Graham Asher @@ -4409,8 +2921,8 @@ 2002-07-11 David Turner Changing the SFNT loader to check for SFNT-based font files - differently. We now ignore the range `helper' fields and check the - `head' table's magic number instead. + differently. We now ignore the range "helper" fields and check the + "head" table's magic number instead. * include/freetype/internal/tttypes.h (SFNT_HeaderRec): Add `offset' field. @@ -4712,7 +3224,7 @@ (FT_Get_PS_Font_Info): Make it work with CID and Type 42 drivers also. -2002-06-19 Sebastien BARRE +2002-06-19 Sebastien BARRE * src/type42/t42parse.c (t42_parse_sfnts): Fix compiler warning. @@ -4927,7 +3439,7 @@ 2002-06-07 David Turner Fixed the bug that prevented the correct display of fonts with - `ftview'. + "ftview". * src/type42/t42drivr.c: Split into... * src/type42/t42drivr.h, src/type42/t42parse.c, @@ -5033,8 +3545,8 @@ * include/freetype/t1tables.h: Updated. * src/base/Jamfile, src/base/rules.mk, src/base/descrip.mms: - Updating build control files for the new files `ftxf86.c' and - `fttype1.c' in src/base. + Updating build control files for the new files "ftxf86.c" and + "fttype1.c" in src/base. * src/pshinter/pshglob.c (psh_blues_scale_zones): Fixed a bug that prevented family blue zones substitution from hapenning correctly. @@ -5056,7 +3568,7 @@ Fixing the SFNT name table loader to support various buggy fonts. It now ignores empty name entries, entries with invalid pointer Offsets and certain fonts containing tables with broken - `storageOffset' fields. + "storageOffset" fields. Name strings are now loaded on demand, which reduces the memory requirements for a given FT_Face tremendously (for example, the name @@ -5110,7 +3622,7 @@ 2002-05-21 David Turner * src/bdf/bdflib.c: Removed compiler warning, and changed all tables - to the `static const' storage specifier (instead of simply + to the "static const" storage specifier (instead of simply `static'). * src/type42/t42drivr.c (hexval): Use more efficient code. @@ -5121,7 +3633,7 @@ src/base/descrip.mms, src/base/Jamfile, src/base/rules.mk (FT_Get_BDF_Charset_ID): New API to retrieve BDF-specific strings from a face. This is much cleaner than accessing the internal types - `BDF_Public_Face' defined in FT_INTERNAL_BDF_TYPES_H. + "BDF_Public_Face" defined in FT_INTERNAL_BDF_TYPES_H. 2002-05-21 Werner Lemberg @@ -5275,11 +3787,11 @@ 2002-05-01 David Turner * src/sfnt/sfobjs.c (tt_face_get_name): Fixing a bug that caused - FreeType to crash when certain broken fonts (e.g. `hya6gb.ttf') + FreeType to crash when certain broken fonts (e.g. "hya6gb.ttf") were opened. * src/sfnt/ttload.c (TT_Load_Names): Applied a small work-around to - manage fonts containing a broken name table (e.g. `hya6gb.ttf'). + manage fonts containing a broken name table (e.g. "hya6gb.ttf"). * src/sfnt/ttcmap0.c (tt_cmap4_validate): Fixed over-restrictive validation test. The charmap validator now accepts overlapping @@ -5446,8 +3958,8 @@ * src/base/ftobjs.c, builds/win32/ftdebug.c, builds/amiga/src/base/ftdebug.c: Version 2.1.0 couldn't be linked against applications in Win32 and Amiga builds due to changes to - `src/base/ftdebug.c' that were not properly propagated to - `builds/win32' and `builds/amiga'. This has been fixed. + "src/base/ftdebug.c" that were not properly propagated to + "builds/win32" and "builds/amiga". This has been fixed. * include/freetype/internal/ftobject.h, include/freetype/internal/ftexcept.h, include/freetype/ftsysmem.h, @@ -5534,7 +4046,7 @@ builds/amiga/src/base/ftdebug.c: - Added the new configuration file `ftstdlib.h' used to define + Added the new configuration file "ftstdlib.h" used to define aliases for all ISO C library functions used by the engine (e.g. strlen, qsort, setjmp, etc.). @@ -5775,7 +4287,7 @@ * src/psaux/t1cmap.h, src/psaux/t1cmap.c, src/type1/t1cmap.h, src/type1/t1cmap.c: Updating and moving the Type 1 FT_CMap support - from `src/type1' to `src/psaux' since it is going to be shared by + from "src/type1" to "src/psaux" since it is going to be shared by the Type 1 and CID font drivers. * src/psaux/Jamfile, src/psaux/psaux.c, src/psaux/psauxmod.c, @@ -5985,11 +4497,11 @@ * src/cid/cidriver.c (cid_get_postscript_name): Fixed a bug that caused the CID driver to return Postscript font names with a leading - slash (`/') as in `/MOEKai-Regular'. + slash ("/") as in "/MOEKai-Regular". * src/sfnt/ttload.c (TT_Load_Names), src/sfnt/sfobjs.c (Get_Name), src/sfnt/sfdriver.c (get_sfnt_postscript_name): Fixed the loader so - that it accepts broken fonts like `foxjump.ttf', which made FreeType + that it accepts broken fonts like "foxjump.ttf", which made FreeType crash when trying to load them. Also improved the name table parser to be able to load @@ -6049,7 +4561,7 @@ * src/sfnt/ttload.c (TT_Load_Names): Simplifying and securing the names table loader. Invalid individual name entries are now handled correctly. This allows the loading of very buggy fonts like - `foxjump.ttf' without allocating tons of memory and causing crashes. + "foxjump.ttf" without allocating tons of memory and causing crashes. * src/otlayout/otlcommon.h, src/otlayout/otlcommon.c: Adding (still experimental) code for OpenType Layout tables validation and @@ -6096,14 +4608,14 @@ ft_io_stream => ft_ansi_stream_io (in base/ftsystem.c only) * src/base/ftutil.c: New file. Contains all memory and list - management code (previously in `ftobjs.c' and `ftlist.c', + management code (previously in "ftobjs.c" and "ftlist.c", respectively). * include/freetype/internal/ftobjs.h: Moving all code related to glyph loaders to ... - * include/freetype/internal/ftgloadr.h: This new file. - `FT_GlyphLoader' is now a pointer to the structure - `FT_GlyphLoaderRec'. + * include/freetype/"internal/ftgloadr.h: This new file. + "FT_GlyphLoader" is now a pointer to the structure + "FT_GlyphLoaderRec". (ft_glyph_own_bitmap): Renamed to ... (FT_GLYPH_OWN_BITMAP): This. * src/base/ftobjs.c: Moving all code related to glyph loaders @@ -6118,8 +4630,8 @@ 2002-02-21 David Turner Modified the debug sub-system initialization. Trace levels can now - be specified within the `FT2_DEBUG' environment variable. See the - comments within `ftdebug.c' for more details. + be specified within the "FT2_DEBUG" environment variable. See the + comments within "ftdebug.c" for more details. * src/base/ftdebug.c: (FT_SetTraceLevel): Removed. (ft_debug_init): New function. @@ -6144,8 +4656,8 @@ Removed. Both files are now completely obsolete. * src/base/Jamfile, src/base/rules.mk: Updated. - * include/freetype/fterrors.h: Adding `#undef FT_ERR_CAT' and - `#undef FT_ERR_XCAT' to avoid warnings with certain compilers (like + * include/freetype/fterrors.h: Adding "#undef FT_ERR_CAT" and + `#undef FT_ERR_XCAT" to avoid warnings with certain compilers (like LCC). * src/pshinter/pshalgo2.c (print_zone): Renamed to ... @@ -6157,7 +4669,7 @@ 2002-02-20 David Turner - * README: Adding `devel@freetype.org' address for bug reports. + * README: Adding "devel@freetype.org" address for bug reports. 2002-02-20 Werner Lemberg @@ -6285,7 +4797,7 @@ * src/pcf/pcfdriver.c (FT_Done_Face): Fixed small memory leak. - * src/pcf/pcfread.c (pcf_load_font): Now handles the `AVERAGE_WIDTH' + * src/pcf/pcfread.c (pcf_load_font): Now handles the "AVERAGE_WIDTH" property to return correct character pixel (width/height) pairs for embedded bitmaps. @@ -6351,7 +4863,7 @@ 2002-01-30 David Turner * INSTALL: Moved to ... - * docs/INSTALL: Here to avoid conflicts with the `install' script on + * docs/INSTALL: Here to avoid conflicts with the "install" script on Windows, where the filesystem doesn't preserve case. 2002-01-29 David Turner @@ -6361,7 +4873,7 @@ ./configure --disable-shared --disable-nls - the `--disable-nls' was incorrectly sent to the `make' program. + the "--disable-nls" was incorrectly sent to the "make" program. 2002-01-29 Werner Lemberg @@ -6408,7 +4920,7 @@ 2002-01-21 Antoine Leca - * docs/PATENTS: Typo fixed (thanks to Detlef `Hawkeye' W黵kner) in + * docs/PATENTS: Typo fixed (thanks to Detlef "Hawkeye" W黵kner) in the URL for the online resource. 2002-01-18 Ian Brown @@ -6468,7 +4980,7 @@ (html_format): Replaced with ... (html_quote): New function. (html_quote0): New function. - (DocCode::dump_html): Small improvement. + (DocCode::dump_html: Small improvement. (DocParagraph::dump, DocBlock::html): Use html_quote0 and html_quote. * include/freetype/config/ftoption.h: Setting default options for @@ -6483,7 +4995,7 @@ * src/autohint/ahhint.c (ah_align_linked_edge): Modified computation of auto-hinted stem widths; this avoids color fringes in - `ClearType-like' rendering. + "ClearType-like" rendering. * src/truetype/ttgload.c (TT_Load_Glyph_Header, TT_Load_Simple_Glyph, TT_Load_Composite_Glyph, load_truetype_glyph): @@ -6510,22 +5022,22 @@ 2002-01-03 Keith Packard * builds/unix/ftsystem.c (FT_New_Stream): Added a fix to ensure that - all FreeType input streams are closed in child processes of a `fork' + all FreeType input streams are closed in child processes of a "fork" on Unix systems. This is important to avoid (potential) access control issues. 2002-01-03 David Turner * src/type1/t1objs.c (T1_Face_Init): Fixed a bug that crashed the - library when dealing with certain weird fonts like `Stalingrad', in - `sadn.pfb' (this font has no full font name entry). + library when dealing with certain weird fonts like "Stalingrad", in + "sadn.pfb" (this font has no full font name entry). * src/base/ftoutln.c, include/freetype/ftoutln.h (FT_Outline_Check): New function to check the consistency of outline data. * src/base/ftobjs.c (FT_Load_Glyph): Use `FT_Outline_Check' to ensure that loaded glyphs are valid. This allows certain fonts like - `tt1095m_.ttf' to be loaded even though it appears they contain + "tt1095m_.ttf" to be loaded even though it appears they contain really funky glyphs. There still is a bug there, though. @@ -6576,8 +5088,8 @@ 2001-12-21 David Turner * src/pshinter/pshrec.c (ps_hints_t2mask, ps_hints_t2counter): - Ignore invalid `hintmask' and `cntrmask' operators (instead of - returning an error). Glyph 2028 of the CFF font `MSung-Light-Acro' + Ignore invalid "hintmask" and "cntrmask" operators (instead of + returning an error). Glyph 2028 of the CFF font "MSung-Light-Acro" couldn't be rendered otherwise (it seems its charstring is buggy, though this requires more analysis). (FT_COMPONENT): Define. @@ -6673,12 +5185,12 @@ routines were never released when CID faces were destroyed. * src/cff/cffload.h, src/cff/cffload.c, src/cff/cffgload.c: Updated - to move the definition of encoding tables back within `cffload.c' + to move the definition of encoding tables back within "cffload.c" instead of making them part of a shared header (causing problems in - `multi' builds). This reverts change 2001-08-08. + "multi" builds). This reverts change 2001-08-08. * docs/CHANGES: Updated for 2.0.6 release. - * docs/TODO: Added `stem3 and counter hints support' to the TODO + * docs/TODO: Added "stem3 and counter hints support" to the TODO list for the Postscript hinter. * docs/BUGS: Closed the AUTOHINT-NO-SBITS bug. @@ -6692,12 +5204,12 @@ that prevented composites from loading correctly, due to missing parentheses around macro parameters. - * src/sfnt/sfobjs.c (SFNT_Load_Face): Make the `post' and `name' + * src/sfnt/sfobjs.c (SFNT_Load_Face): Make the "post" and "name" tables optional to load PCL fonts properly. * src/truetype/ttgload.c (TT_Load_Glyph), src/base/ftobjs.c (FT_Load_Glyph), include/freetype/freetype.h (FT_LOAD_SBITS_ONLY): - `Fixed' the bug that prevented embedded bitmaps to be loaded when + "Fixed" the bug that prevented embedded bitmaps to be loaded when the auto-hinter is used. This actually is a hack but will be enough until the internal re-design scheduled for FreeType 2.1. @@ -6786,9 +5298,9 @@ 2001-12-11 David Turner * builds/unix/freetype-config.in: Modified the script to prevent - passing `-L/usr/lib' to gcc. + passing "-L/usr/lib" to gcc. - * docs/FTL.TXT: Simple fix (change `LICENSE.TXT' to `FTL.TXT'). + * docs/FTL.TXT: Simple fix (change "LICENSE.TXT" to "FTL.TXT"). * builds/unix/freetype2.m4: New file for checking configure paths. We need to install it in $(prefix)/share/aclocal/freetype2.m4 but I @@ -6809,7 +5321,7 @@ 2001-12-10 Francesco Zappa Nardelli * src/pcf/pcfdriver.c (PCF_Init_Face): Allow Xft to use PCF fonts - by setting the `face->metrics.max_advance' correctly. + by setting the "face->metrics.max_advance" correctly. 2001-12-07 David Turner @@ -6908,8 +5420,8 @@ * include/freetype/ttnameid.h: Added some new Microsoft language codes and LCIDs as found in MSDN (Passport SDK). Also added comments about the meaning of bit 57 of the `OS/2' table - (TT_UCR_SURROGATES) which (with OpenType v.1.3) now means `there is - a character beyond 0xFFFF in this font'. Thanks to Detlef W黵kner + (TT_UCR_SURROGATES) which (with OpenType v.1.3) now means "there is + a character beyond 0xFFFF in this font". Thanks to Detlef W黵kner for noticing this. 2001-11-20 David Turner @@ -6956,7 +5468,7 @@ Fix typos. * tests/gview.c: Updated the debugging glyph viewer to show the - hints generated by the `autohint' module. + hints generated by the "autohint" module. 2001-10-27 David Turner @@ -6967,7 +5479,7 @@ * include/freetype/ftcache.h, include/freetype/cache/*.h, src/cache/*.c: Major re-design of the cache sub-system to provide - better performance as well as an `Acquire'/`Release' API. Seems to + better performance as well as an "Acquire"/"Release" API. Seems to work well here, but probably needs a bit more testing. 2001-10-26 Leonard Rosenthol @@ -7035,7 +5547,7 @@ the source file. * src/base/ftdbgmem.c: New debugging memory manager. You must - define the FT_DEBUG_MEMORY macro in `ftoption.h' to enable it. It + define the FT_DEBUG_MEMORY macro in "ftoption.h" to enable it. It will record every memory block allocated and report simple errors like memory leaks and double deletes. @@ -7089,7 +5601,7 @@ compiler warnings. * src/pshinter/module.mk, src/pshinter/rules.mk: Adding control - files to build the PostScript hinter with the `old' build system. + files to build the PostScript hinter with the "old" build system. 2001-10-19 Jacob Jansen @@ -7099,7 +5611,7 @@ 2001-10-18 David Turner * src/psnames/pstables.h, src/tools/glnames.py: Rewrote the - `glnames.py' script used to generate the `pstables.h' header file. + "glnames.py" script used to generate the "pstables.h" header file. The old one contained a serious bug that made FreeType return incorrect glyph names for certain glyphs. @@ -7141,7 +5653,7 @@ * tests/Jamfile, tests/gview.c: Adding a new glyph hinting viewer/debugger to the source tree. Note that you will _not_ be able to compile it since it depends on an unavailable graphics - library named `Nirvana' to render vector images. + library named "Nirvana" to render vector images. 2001-10-17 David Turner @@ -7263,7 +5775,7 @@ in PDF documents that were automatically generated from TrueType ones). - * src/type1/t1load.c (is_alpha): Now supports `+' in font names; + * src/type1/t1load.c (is_alpha): Now supports "+" in font names; this is used in embedded fonts. * src/psaux/psobjs.c (PS_Table_Add): Fixed a reallocation bug that @@ -7345,7 +5857,7 @@ (cff_get_glyph_index): Minor documentation change. * src/type1/t1driver.c (t1_get_name_index): New function used in - Get_Interface as the function returned when the `name_index' + Get_Interface as the function returned when the "name_index" function is requested. (get_t1_glyph_name): Renamed to t1_get_glyph_name for consistency. @@ -7362,10 +5874,10 @@ * src/cff/cffdrivr.c (cff_get_name_index): New function, returned when `cff_get_interface' is called with a request for the - `name_index' function. + "name_index" function. (cff_get_interface): Modified so that it returns the function - `cff_get_name_index' when the `name_index' function is requested. + `cff_get_name_index' when the "name_index" function is requested. * src/base/ftobjs.c (FT_Get_Name_Index): New function, used to return a glyph index for a given glyph name only if the driver @@ -7511,7 +6023,7 @@ Removing _lots_ of compiler warnings when the most pedantic warning levels of Visual C++ and Borland C++ are used. Too many files to be listed here, but FT2 now compiles without warnings with VC++ and the - `/W4' warning level (lint-style). + "/W4" warning level (lint-style). * include/freetype/freetype.h (FT_New_Memory_Face): Updated documentation. @@ -7585,9 +6097,9 @@ 2001-06-14 David Turner Modified the TrueType interpreter to let it use the new - trigonometric functions provided in `fttrigon.h'. This gets rid of + trigonometric functions provided in "fttrigon.h". This gets rid of some old 64-bit computation routines, as well as many warnings when - compiling the library with the `long long' 64-bit integer type. + compiling the library with the "long long" 64-bit integer type. * include/freetype/config/ftoption.h: Undefine FT_CONFIG_OPTION_OLD_CALCS. @@ -7709,7 +6221,7 @@ 2001-05-25 David Turner - Moved several documents from the top-level to the `docs' directory. + Moved several documents from the top-level to the "docs" directory. * src/base/ftcalc.c (FT_DivFix): Small fix to return value. @@ -7763,9 +6275,9 @@ * builds/newline: New file. * builds/top_level.mk, builds/detect.mk: Use it. This fixes - problems with Make on Windows 2000, as well as problems when `make - distclean' is invoked on a non-Unix platform when there is no - `config.mk' in the current directory. + problems with Make on Windows 2000, as well as problems when "make + distclean" is invoked on a non-Unix platform when there is no + "config.mk" in the current directory. * builds/freetype.mk: Fixed a problem with object deletions under Dos/Windows/OS/2 systems. @@ -7817,7 +6329,7 @@ * src/base/ftcalc.c (FT_MulDiv, FT_MulFix, FT_DivFix): Various tiny fixes related to rounding in 64-bits routines and - pseudo-`optimizations'. + pseudo-"optimizations". 2001-04-27 David Turner @@ -7844,7 +6356,7 @@ fixed-point square root computation. It is now used even with 64-bits integers, as it is _much_ faster than calling FT_Sqrt64 :-) - * src/base/ftbbox.c: Removed invalid `#include FT_BEZIER_H' line. + * src/base/ftbbox.c: Removed invalid "#include FT_BEZIER_H" line. 2001-04-25 David Turner @@ -7862,7 +6374,7 @@ 2001-04-20 David Turner - * ftconfig.h, ftoption.h: Updated `ftconfig.h' to detect 64-bit int + * ftconfig.h, ftoption.h: Updated "ftconfig.h" to detect 64-bit int types on platforms where Autoconf is not available). Also removed FTCALC_USE_LONG_LONG and replaced it with FT_CONFIG_OPTION_FORCE_INT64. @@ -7979,7 +6491,7 @@ 2001-03-20 David Turner * include/freetype/config/ftheader.h, include/freetype/ftsnames.h: - Renamed `ftnames.h' to `ftsnames.h', and FT_NAMES_H to + Renamed "ftnames.h" to "ftsnames.h", and FT_NAMES_H to FT_SFNT_NAMES_H. * docs/docmaker.py: Added generation of INDEX link in table of @@ -7989,8 +6501,8 @@ compilation process has changed slightly (no more `src' required in the include path). - * builds/*/*-def.mk: Changed the objects directory from `obj' to - `objs'. + * builds/*/*-def.mk: Changed the objects directory from "obj" to + "objs". * include/freetype/config/ftheader.h: Removed obsolete macros like FT_SOURCE_FILE, etc. and added cache-specific macro definitions that @@ -7999,7 +6511,7 @@ * src/*/*: Removed the use of FT_SOURCE_FILE, etc. Now, each component needs to add its own directory to the include path at - compile time. Modified all `rules.mk' and `descrip.mms' + compile time. Modified all "rules.mk" and "descrip.mms" accordingly. 2001-03-20 Werner Lemberg @@ -8025,7 +6537,7 @@ compiler warnings in pedantic modes. * include/config/ft2build.h, include/config/ftheader.h: The file - `ft2build.h' was renamed to `ftheader.h' to avoid conflicts with the + "ft2build.h" was renamed to "ftheader.h" to avoid conflicts with the top-level . * include/config/ftheader.h: Added new section describing the #include @@ -8047,7 +6559,7 @@ via FT_Get_Glyph_Name(). (cff_get_interface): Added support for getting a glyph name via the - `glyph_name' module interface. Uses the new function + "glyph_name" module interface. Uses the new function get_cff_glyph_name(). Submitted by Sander van der Wal . @@ -8058,7 +6570,7 @@ Submitted by Sander van der Wal . * src/cff/cffgload.c (CFF_Parse_CharStrings): Added support for - deprecated operator `dotsection'. + deprecated operator "dotsection". Submitted by Sander van der Wal . 2001-03-12 Werner Lemberg @@ -8215,7 +6727,7 @@ * src/cff/cffparse.c (cff_parse_font_matrix): Added logic to get the units_per_EM from the FontMatrix. - (cff_parse_fixed_thousand): New function. Gets a real number from + (cff_parse_fixed_thousand): New function. Gets a real number from the CFF font, but multiplies by 1000 (this is to avoid rounding errors when placing this real number into a 16.16 fixed number). @@ -8244,7 +6756,7 @@ 2001-02-01 David Turner * docs/docmaker.py: Improved the index sorting routine to place - capital letters before small ones. Added the `' marker to + capital letters before small ones. Added the "" marker to section blocks in order to give the order of blocks. 2001-01-30 Antoine Leca @@ -8451,7 +6963,7 @@ * src/smooth/ftgrays.c (grays_convert_glyph): Implement it. * INSTALL: Updated installation instructions on Win32, listing the - new `make setup list' target used to list supported + new "make setup list" target used to list supported compilers/targets. * src/raster/ftraster.c (ft_black_render): Test for unsupported @@ -8469,7 +6981,7 @@ * builds/win32/detect.mk: Added support for the Intel C/C++ compiler, as well as _preliminary_ (read: doesn't work!) support for - Watcom. Also added a new setup target. Type `make setup list' for + Watcom. Also added a new setup target. Type "make setup list" for a list of supported command-line compilers on Win32. * src/base/ftdebug.c: Added dummy symbol to avoid empty file if @@ -8570,16 +7082,16 @@ pointer). * src/base/ftsystem.c (FT_Done_Memory): Fixed an obvious bug: - The ANSI `free()' function was called instead of `memory->free()'. + The ANSI "free()" function was called instead of "memory->free()". * docs/docmaker.py: Added section filtering, multi-page generation (index page generation is still missing though). 2000-12-04 David Turner - * builds/unix/install.mk, builds/unix/ft2unix.h: The file `ft2unix.h' + * builds/unix/install.mk, builds/unix/ft2unix.h: The file "ft2unix.h" is now installed as for Unix systems. Note that we - still use the `freetype2/freetype' installation path for now. + still use the "freetype2/freetype" installation path for now. * */*.[ch]: Now using as the default build and setup configuration file in all public headers. Internal source files @@ -8591,7 +7103,7 @@ * builds/win32/detect.mk, builds/win32/w32-bccd.mk, builds/win32/w32-dev.mk: Changed the developer build targets to - `devel-gcc' and `devel-bcc' in order to be able to develop with the + "devel-gcc" and "devel-bcc" in order to be able to develop with the Borland C++ compiler. 2000-12-01 David Turner @@ -8603,7 +7115,7 @@ * builds/unix/configure.in, builds/unix/configure, builds/cygwin/configure.in, builds/cygwin/configure: Setting - `version_info' to 6:1:0 for the 2.0.1 release. + "version_info" to 6:1:0 for the 2.0.1 release. * CHANGES: Added a summary of changes between 2.0.1 and 2.0. @@ -8630,13 +7142,13 @@ 2000-11-30 David Turner * INSTALL: Slightly updated the quick starter documentation to - include IDE compilation, prevent against BSD Make, and specify `make - setup' instead of a single `make' for build configuration. + include IDE compilation, prevent against BSD Make, and specify "make + setup" instead of a single "make" for build configuration. * include/config/ftbuild.h, include/internal/internal.h: Added new configuration files used to determine the location of all public, configuration, and internal header files for FreeType 2. Modified - all headers under `include/freetype' to reflect this change. Note + all headers under "include/freetype" to reflect this change. Note that we still need to change the library source files themselves though. @@ -8644,7 +7156,7 @@ builds/win32/w32-bcc.mk, builds/win32/w32-bccd.mk, builds/win32/detect.mk: Added new files to support compilation with the free Borland C++ command-line compiler. Modified the detection - rules to recognize the new `bcc32' target in `make setup bcc32'. + rules to recognize the new "bcc32" target in "make setup bcc32". * src/sfnt/ttcmap.c, src/sfnt/ttpost.c, src/sfnt/ttsbit.c, src/truetype/ttobjs.c, src/truetype/ttgload.c, diff --git a/reactos/lib/freetype/Jamfile b/reactos/lib/freetype/Jamfile index 61583c72976..6d944669fc3 100644 --- a/reactos/lib/freetype/Jamfile +++ b/reactos/lib/freetype/Jamfile @@ -1,4 +1,4 @@ -# FreeType 2 top Jamfile (c) 2001, 2002, 2003, 2004 David Turner +# FreeType 2 top Jamfile (c) 2001, 2002, 2003 David Turner # # The HDRMACRO is already defined in FTJam and is used to add @@ -61,8 +61,7 @@ FT2_BUILD_INCLUDE ?= ; # IMPORTANT: You'll need to change the content of "ftmodule.h" as well # if you modify this list or provide your own. # -FT2_COMPONENTS ?= autofit # auto-fitter - gzip # support for gzip-compressed files +FT2_COMPONENTS ?= gzip # support for gzip-compressed files autohint # auto-hinter base # base component (public APIs) bdf # BDF font driver @@ -147,7 +146,7 @@ if $(DEBUG_HINTER) actions RefDoc { - python $(FT2_SRC)/tools/docmaker/docmaker.py --prefix=ft2 --title=FreeType-2.1.8 --output=$(DOC_DIR) $(FT2_INCLUDE)/freetype/*.h $(FT2_INCLUDE)/freetype/config/*.h $(FT2_INCLUDE)/freetype/cache/*.h + python $(FT2_SRC)/tools/docmaker/docmaker.py --prefix=ft2 --title=FreeType-2.1.5 --output=$(DOC_DIR) $(FT2_INCLUDE)/freetype/*.h $(FT2_INCLUDE)/freetype/config/*.h $(FT2_INCLUDE)/freetype/cache/*.h } RefDoc refdoc ; diff --git a/reactos/lib/freetype/Makefile b/reactos/lib/freetype/Makefile index dbf65ebb8db..b54f1df7eab 100644 --- a/reactos/lib/freetype/Makefile +++ b/reactos/lib/freetype/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.8 2004/02/07 00:21:45 navaraf Exp $ +# $Id: Makefile,v 1.9 2004/02/15 21:45:28 gvg Exp $ PATH_TO_TOP = ../.. @@ -37,9 +37,9 @@ all: $(MK_FULLNAME) $(MK_NOSTRIPNAME) objs/*.o objs/libfreetype.a: ifeq ($(DBG), 1) - @$(MAKE) -f Makefile.freetype CC:=$(CC) + @$(MAKE) -f Makefile.freetype CFLAGS="-c -g -Wall" CC:=$(CC) else - @$(MAKE) -f Makefile.freetype CC:=$(CC) + @$(MAKE) -f Makefile.freetype CFLAGS="-c -Wall -O3" CC:=$(CC) endif # Automatic dependency tracking diff --git a/reactos/lib/freetype/README b/reactos/lib/freetype/README index 72baf3d6a2f..b50dd0c5769 100644 --- a/reactos/lib/freetype/README +++ b/reactos/lib/freetype/README @@ -9,7 +9,7 @@ is called `libttf'. They are *not* compatible! - FreeType 2.1.8 + FreeType 2.1.5 ============== Please read the docs/CHANGES file, it contains IMPORTANT INFORMATION. @@ -19,9 +19,9 @@ Note that the FreeType 2 documentation is now available as a separate package from our sites. See: - ftp://ftp.freetype.org/pub/freetype2/ftdocs-2.1.8.tar.bz2 - ftp://ftp.freetype.org/pub/freetype2/ftdocs-2.1.8.tar.gz - ftp://ftp.freetype.org/pub/freetype2/ftdoc218.zip + ftp://ftp.freetype.org/pub/freetype2/ftdocs-2.1.5.tar.bz2 + ftp://ftp.freetype.org/pub/freetype2/ftdocs-2.1.5.tar.gz + ftp://ftp.freetype.org/pub/freetype2/ftdoc215.zip Bugs diff --git a/reactos/lib/freetype/builds/atari/ATARI.H b/reactos/lib/freetype/builds/atari/ATARI.H deleted file mode 100644 index 4e99965061b..00000000000 --- a/reactos/lib/freetype/builds/atari/ATARI.H +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef ATARI_H -#define ATARI_H - -#pragma warn -stu - -/* PureC doesn't like 32bit enumerations */ - -#ifndef FT_IMAGE_TAG -#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) value -#endif /* FT_IMAGE_TAG */ - -#ifndef FT_ENC_TAG -#define FT_ENC_TAG( value, a, b, c, d ) value -#endif /* FT_ENC_TAG */ - -#endif /* ATARI_H */ diff --git a/reactos/lib/freetype/builds/atari/FNames.SIC b/reactos/lib/freetype/builds/atari/FNames.SIC deleted file mode 100644 index f3657179d91..00000000000 --- a/reactos/lib/freetype/builds/atari/FNames.SIC +++ /dev/null @@ -1,37 +0,0 @@ -/* the following changes file names for PureC projects */ - -if (argc > 0) -{ - ordner = argv[0]; - if (basename(ordner) == "") /* ist Ordner */ - { - ChangeFilenames(ordner); - } -} - -proc ChangeFilenames(folder) -local i,entries,directory,file; -{ - entries = filelist(directory,folder); - for (i = 0; i < entries; ++i) - { - file = directory[i,0]; - if ((directory[i,3]&16) > 0) /* subdirectory */ - { - ChangeFilenames(folder+file+"\\"); - } - else - { - if ((stricmp(suffix(file),".h")==0)|(stricmp(suffix(file),".c")==0)) - ChangeFilename(folder,file); - } - } -} - -proc ChangeFilename(path,datei) -local newfile,err; -{ - newfile=datei; - newfile[0]=(newfile[0] | 32) ^ 32; - err=files.rename("-q",path+datei,newfile); -} diff --git a/reactos/lib/freetype/builds/atari/FREETYPE.PRJ b/reactos/lib/freetype/builds/atari/FREETYPE.PRJ deleted file mode 100644 index 4e3e6895967..00000000000 --- a/reactos/lib/freetype/builds/atari/FREETYPE.PRJ +++ /dev/null @@ -1,33 +0,0 @@ -;FreeType project file - -FREETYPE.LIB - -.C [-K -P -R -A] -.L [-J -V] -.S - -= - -..\..\src\base\ftsystem.c -..\..\src\base\ftdebug.c - -..\..\src\base\ftinit.c -..\..\src\base\ftglyph.c -..\..\src\base\ftmm -..\..\src\base\ftbbox - -..\..\src\base\ftbase.c -..\..\src\autohint\autohint.c -;..\..\src\cache\ftcache.c -..\..\src\cff\cff.c -..\..\src\cid\type1cid.c -..\..\src\psaux\psaux.c -..\..\src\pshinter\pshinter.c -..\..\src\psnames\psnames.c -..\..\src\raster\raster.c -..\..\src\sfnt\sfnt.c -..\..\src\smooth\smooth.c -..\..\src\truetype\truetype.c -..\..\src\type1\type1.c -..\..\src\type42\type42.c - diff --git a/reactos/lib/freetype/builds/atari/README.TXT b/reactos/lib/freetype/builds/atari/README.TXT deleted file mode 100644 index 04eec63519b..00000000000 --- a/reactos/lib/freetype/builds/atari/README.TXT +++ /dev/null @@ -1,51 +0,0 @@ -Compiling FreeType 2 with PureC compiler -======================================== - -[See below for a German version.] - -To compile FreeType 2 as a library the following changes must be applied: - -- All *.c files must start with an uppercase letter. - (In case GEMSCRIPT is available: - Simply drag the whole FreeType 2 directory to the file `FNames.SIC'.) - -- You have to change the INCLUDE directory in PureC's compiler options - to contain both the `INCLUDE' and `freetype2\include' directory. - Example: - - INCLUDE;E:\freetype2\include - -- The file `freetype2/include/Ft2build.h' must be patched as follows to - include ATARI.H: - - #ifndef __FT2_BUILD_GENERIC_H__ - #define __FT2_BUILD_GENERIC_H__ - - #include "ATARI.H" - - - -Compilieren von FreeType 2 mit PureC -==================================== - -Um FreeType 2 als eine Bibliothek (library) zu compilieren, muss folgendes -ge刵dert werden: - -- Alle *.c-files m乻sen mit einem GROSSBUCHSTABEN beginnen. - (Falls GEMSCRIPT zur Verf乬ung steht: - Den kompletten Ordner freetype2 auf die Datei `FNames.SIC' draggen.) - -- In den Compiler-Optionen von PureC muss das INCLUDE directory auf INCLUDE - und freetype2\include verweisen. Z.B.: - - INCLUDE;E:\freetype2\include - -- In der Datei freetype2/include/Ft2build.h muss zu Beginn - ein #include "ATARI.H" wie folgt eingef乬t werden: - - #ifndef __FT2_BUILD_GENERIC_H__ - #define __FT2_BUILD_GENERIC_H__ - - #include "ATARI.H" - ---- end of README.TXT --- diff --git a/reactos/lib/freetype/builds/freetype.mk b/reactos/lib/freetype/builds/freetype.mk index 649e22e079b..b9e553ba46f 100644 --- a/reactos/lib/freetype/builds/freetype.mk +++ b/reactos/lib/freetype/builds/freetype.mk @@ -97,7 +97,6 @@ BASE_DIR := $(SRC_DIR)/base # PUBLIC_DIR := $(TOP_DIR)/include/freetype INTERNAL_DIR := $(PUBLIC_DIR)/internal -SERVICES_DIR := $(INTERNAL_DIR)/services CONFIG_DIR := $(PUBLIC_DIR)/config CACHE_DIR := $(PUBLIC_DIR)/cache @@ -156,8 +155,7 @@ OBJECTS_LIST := # changes, the whole library is recompiled. # PUBLIC_H := $(wildcard $(PUBLIC_DIR)/*.h) -BASE_H := $(wildcard $(INTERNAL_DIR)/*.h) \ - $(wildcard $(SERVICES_DIR)/*.h) +BASE_H := $(wildcard $(INTERNAL_DIR)/*.h) CONFIG_H := $(wildcard $(CONFIG_DIR)/*.h) \ $(wildcard $(BUILD_DIR)/freetype/config/*.h) CACHE_H := $(wildcard $(CACHE_DIR)/*.h) @@ -254,7 +252,7 @@ library: $(PROJECT_LIBRARY) refdoc: python $(SRC_DIR)/tools/docmaker/docmaker.py \ --prefix=ft2 \ - --title=FreeType-2.1.7 \ + --title=FreeType-2.1.5 \ --output=$(DOC_DIR) \ $(PUBLIC_DIR)/*.h \ $(PUBLIC_DIR)/config/*.h \ diff --git a/reactos/lib/freetype/builds/toplevel.mk b/reactos/lib/freetype/builds/toplevel.mk index 6ee3818dff5..08f50b42e08 100644 --- a/reactos/lib/freetype/builds/toplevel.mk +++ b/reactos/lib/freetype/builds/toplevel.mk @@ -110,7 +110,6 @@ ifdef check_platform $(RM) builds/unix/config.status $(RM) builds/unix/unix-def.mk $(RM) builds/unix/unix-cc.mk - $(RM) builds/unix/freetype2.pc $(RM) nul endif # test is_unix diff --git a/reactos/lib/freetype/builds/unix/.cvsignore b/reactos/lib/freetype/builds/unix/.cvsignore index 808b600590d..cc8ec6a8dad 100644 --- a/reactos/lib/freetype/builds/unix/.cvsignore +++ b/reactos/lib/freetype/builds/unix/.cvsignore @@ -6,4 +6,3 @@ config.log libtool ftconfig.h freetype-config -freetype2.pc diff --git a/reactos/lib/freetype/builds/unix/aclocal.m4 b/reactos/lib/freetype/builds/unix/aclocal.m4 index c277aed35e0..e63092a429f 100644 --- a/reactos/lib/freetype/builds/unix/aclocal.m4 +++ b/reactos/lib/freetype/builds/unix/aclocal.m4 @@ -1,4 +1,4 @@ -# generated automatically by aclocal 1.7.8 -*- Autoconf -*- +# generated automatically by aclocal 1.7.1 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 # Free Software Foundation, Inc. @@ -12,86 +12,42 @@ # PARTICULAR PURPOSE. -# serial 2 +# serial 1 FT_MUNMAP_DECL -AC_DEFUN([FT_MUNMAP_PARAM], - [AC_MSG_CHECKING([for munmap's first parameter type]) - AC_COMPILE_IFELSE([ - AC_LANG_SOURCE([[ +AC_DEFUN(FT_MUNMAP_DECL, +[AC_MSG_CHECKING([whether munmap must be declared]) +AC_CACHE_VAL(ft_cv_munmap_decl, +[AC_TRY_COMPILE([ +#ifdef HAVE_UNISTD_H +#include +#endif +#include ], +[char *(*pfn) = (char *(*))munmap], +ft_cv_munmap_decl=no, +ft_cv_munmap_decl=yes)]) +AC_MSG_RESULT($ft_cv_munmap_decl) +if test $ft_cv_munmap_decl = yes; then + AC_DEFINE(NEED_MUNMAP_DECL,, + [Define to 1 if munmap() is not defined in ]) +fi]) +AC_DEFUN(FT_MUNMAP_PARAM, +[AC_MSG_CHECKING([for munmap's first parameter type]) +AC_TRY_COMPILE([ #include #include -int munmap(void *, size_t); +int munmap(void *, size_t);],, + AC_MSG_RESULT([void *]);AC_DEFINE(MUNMAP_USES_VOIDP,, + [Define to 1 if the first argument of munmap is of type void *]), + AC_MSG_RESULT([char *])) +]) - ]]) - ], - [], - [AC_MSG_RESULT([void *]) - AC_DEFINE([MUNMAP_USES_VOIDP], - [], - [Define to 1 if the first argument of munmap is of type void *])], - [AC_MSG_RESULT([char *])]) - ]) +# libtool.m4 - Configure libtool for the host system. -*-Shell-script-*- -# end of ft-munmap.m4 +# serial 46 AC_PROG_LIBTOOL -# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- - -# serial 47 AC_PROG_LIBTOOL - - -# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) -# ----------------------------------------------------------- -# If this macro is not defined by Autoconf, define it here. -m4_ifdef([AC_PROVIDE_IFELSE], - [], - [m4_define([AC_PROVIDE_IFELSE], - [m4_ifdef([AC_PROVIDE_$1], - [$2], [$3])])]) - - -# AC_PROG_LIBTOOL -# --------------- AC_DEFUN([AC_PROG_LIBTOOL], -[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl -dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX -dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. - AC_PROVIDE_IFELSE([AC_PROG_CXX], - [AC_LIBTOOL_CXX], - [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX - ])]) -dnl And a similar setup for Fortran 77 support - AC_PROVIDE_IFELSE([AC_PROG_F77], - [AC_LIBTOOL_F77], - [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 -])]) - -dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. -dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run -dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. - AC_PROVIDE_IFELSE([AC_PROG_GCJ], - [AC_LIBTOOL_GCJ], - [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], - [AC_LIBTOOL_GCJ], - [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], - [AC_LIBTOOL_GCJ], - [ifdef([AC_PROG_GCJ], - [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) - ifdef([A][M_PROG_GCJ], - [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) - ifdef([LT_AC_PROG_GCJ], - [define([LT_AC_PROG_GCJ], - defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) -])])# AC_PROG_LIBTOOL - - -# _AC_PROG_LIBTOOL -# ---------------- -AC_DEFUN([_AC_PROG_LIBTOOL], [AC_REQUIRE([AC_LIBTOOL_SETUP])dnl -AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl -AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl -AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" @@ -102,13 +58,10 @@ AC_SUBST(LIBTOOL)dnl # Prevent multiple expansion define([AC_PROG_LIBTOOL], []) -])# _AC_PROG_LIBTOOL +]) - -# AC_LIBTOOL_SETUP -# ---------------- AC_DEFUN([AC_LIBTOOL_SETUP], -[AC_PREREQ(2.50)dnl +[AC_PREREQ(2.13)dnl AC_REQUIRE([AC_ENABLE_SHARED])dnl AC_REQUIRE([AC_ENABLE_STATIC])dnl AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl @@ -118,103 +71,15 @@ AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_LD])dnl AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl AC_REQUIRE([AC_PROG_NM])dnl +AC_REQUIRE([LT_AC_PROG_SED])dnl AC_REQUIRE([AC_PROG_LN_S])dnl AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl -# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! AC_REQUIRE([AC_OBJEXT])dnl AC_REQUIRE([AC_EXEEXT])dnl dnl -AC_LIBTOOL_SYS_MAX_CMD_LEN -AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE -AC_LIBTOOL_OBJDIR - -AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl _LT_AC_PROG_ECHO_BACKSLASH - -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -Xsed='sed -e s/^X//' -[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] - -# Same as above, but do not quote variable references. -[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' - -# Constants: -rm="rm -f" - -# Global variables: -default_ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except M$VC, -# which needs '.lib'). -libext=a -ltmain="$ac_aux_dir/ltmain.sh" -ofile="$default_ofile" -with_gnu_ld="$lt_cv_prog_gnu_ld" - -AC_CHECK_TOOL(AR, ar, false) -AC_CHECK_TOOL(RANLIB, ranlib, :) -AC_CHECK_TOOL(STRIP, strip, :) - -old_CC="$CC" -old_CFLAGS="$CFLAGS" - -# Set sane defaults for various variables -test -z "$AR" && AR=ar -test -z "$AR_FLAGS" && AR_FLAGS=cru -test -z "$AS" && AS=as -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$DLLTOOL" && DLLTOOL=dlltool -test -z "$LD" && LD=ld -test -z "$LN_S" && LN_S="ln -s" -test -z "$MAGIC_CMD" && MAGIC_CMD=file -test -z "$NM" && NM=nm -test -z "$SED" && SED=sed -test -z "$OBJDUMP" && OBJDUMP=objdump -test -z "$RANLIB" && RANLIB=: -test -z "$STRIP" && STRIP=: -test -z "$ac_objext" && ac_objext=o - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - openbsd*) - old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" - ;; - *) - old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" -fi - # Only perform the check for file, if the check method requires it case $deplibs_check_method in file_magic*) @@ -224,78 +89,327 @@ file_magic*) ;; esac -AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) -AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_CHECK_TOOL(STRIP, strip, :) + +ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) +ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], enable_win32_dll=yes, enable_win32_dll=no) -AC_ARG_ENABLE([libtool-lock], - [AC_HELP_STRING([--disable-libtool-lock], - [avoid locking (might break parallel builds)])]) +AC_ARG_ENABLE(libtool-lock, + [ --disable-libtool-lock avoid locking (might break parallel builds)]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes -AC_ARG_WITH([pic], - [AC_HELP_STRING([--with-pic], - [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], - [pic_mode="$withval"], - [pic_mode=default]) -test -z "$pic_mode" && pic_mode=default +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + rm -rf conftest* + ;; -# Use C for the default configuration in the libtool script -tagname= -AC_LIBTOOL_LANG_C_CONFIG -_LT_AC_TAGCONFIG -])# AC_LIBTOOL_SETUP +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_SAVE + AC_LANG_C + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_RESTORE]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw* | *-*-pw32*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) -# _LT_AC_SYS_COMPILER -# ------------------- -AC_DEFUN([_LT_AC_SYS_COMPILER], -[AC_REQUIRE([AC_PROG_CC])dnl + # recent cygwin and mingw systems supply a stub DllMain which the user + # can override, but on older systems we have to supply one + AC_CACHE_CHECK([if libtool should supply DllMain function], lt_cv_need_dllmain, + [AC_TRY_LINK([], + [extern int __attribute__((__stdcall__)) DllMain(void*, int, void*); + DllMain (0, 0, 0);], + [lt_cv_need_dllmain=no],[lt_cv_need_dllmain=yes])]) -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} + case $host/$CC in + *-*-cygwin*/gcc*-mno-cygwin*|*-*-mingw*) + # old mingw systems require "-dll" to link a DLL, while more recent ones + # require "-mdll" + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -mdll" + AC_CACHE_CHECK([how to link DLLs], lt_cv_cc_dll_switch, + [AC_TRY_LINK([], [], [lt_cv_cc_dll_switch=-mdll],[lt_cv_cc_dll_switch=-dll])]) + CFLAGS="$SAVE_CFLAGS" ;; + *-*-cygwin* | *-*-pw32*) + # cygwin systems need to pass --dll to the linker, and not link + # crt.o which will require a WinMain@16 definition. + lt_cv_cc_dll_switch="-Wl,--dll -nostartfiles" ;; + esac + ;; + ]) +esac -# Allow CC to be a program name with arguments. -compiler=$CC -])# _LT_AC_SYS_COMPILER +_LT_AC_LTCONFIG_HACK +]) -# _LT_AC_SYS_LIBPATH_AIX -# ---------------------- -# Links a minimal program and checks the executable -# for the system default hardcoded library path. In most cases, -# this is /usr/lib:/lib, but when the MPI compilers are used -# the location of the communication and MPI libs are included too. -# If we don't find anything, use the default library path according -# to the aix ld manual. -AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], -[AC_LINK_IFELSE(AC_LANG_PROGRAM,[ -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi],[]) -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi -])# _LT_AC_SYS_LIBPATH_AIX +# AC_LIBTOOL_HEADER_ASSERT +# ------------------------ +AC_DEFUN([AC_LIBTOOL_HEADER_ASSERT], +[AC_CACHE_CHECK([whether $CC supports assert without backlinking], + [lt_cv_func_assert_works], + [case $host in + *-*-solaris*) + if test "$GCC" = yes && test "$with_gnu_ld" != yes; then + case `$CC --version 2>/dev/null` in + [[12]].*) lt_cv_func_assert_works=no ;; + *) lt_cv_func_assert_works=yes ;; + esac + fi + ;; + esac]) +if test "x$lt_cv_func_assert_works" = xyes; then + AC_CHECK_HEADERS(assert.h) +fi +])# AC_LIBTOOL_HEADER_ASSERT -# _LT_AC_SHELL_INIT(ARG) -# ---------------------- -AC_DEFUN([_LT_AC_SHELL_INIT], -[ifdef([AC_DIVERSION_NOTICE], - [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], - [AC_DIVERT_PUSH(NOTICE)]) -$1 -AC_DIVERT_POP -])# _LT_AC_SHELL_INIT +# _LT_AC_CHECK_DLFCN +# -------------------- +AC_DEFUN([_LT_AC_CHECK_DLFCN], +[AC_CHECK_HEADERS(dlfcn.h) +])# _LT_AC_CHECK_DLFCN +# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +# --------------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], +[AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_NM]) +AC_REQUIRE([AC_OBJEXT]) +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [dnl + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) # Its linker distinguishes data from code symbols + lt_cv_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris* | sysv5*) + symcode='[[BDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $host_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then + symcode='[[ABCDGISTW]]' +fi + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. +lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + rm -f conftest* + cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if egrep ' nm_test_var$' "$nlist" >/dev/null; then + if egrep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_global_symbol_to_cdecl"' < "$nlist" >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr void * +#else +# define lt_ptr char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr address; +} +lt_preloaded_symbols[[]] = +{ +EOF + sed "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr) \&\2},/" < "$nlist" >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$no_builtin_flag" + if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AC_FD_CC + fi + else + echo "cannot find nm_test_var in $nlist" >&AC_FD_CC + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AC_FD_CC + fi + else + echo "$progname: failed program was:" >&AC_FD_CC + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +global_symbol_pipe="$lt_cv_sys_global_symbol_pipe" +if test -z "$lt_cv_sys_global_symbol_pipe"; then + global_symbol_to_cdecl= + global_symbol_to_c_name_address= +else + global_symbol_to_cdecl="$lt_cv_global_symbol_to_cdecl" + global_symbol_to_c_name_address="$lt_cv_global_symbol_to_c_name_address" +fi +if test -z "$global_symbol_pipe$global_symbol_to_cdec$global_symbol_to_c_name_address"; +then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi +]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + +# _LT_AC_LIBTOOL_SYS_PATH_SEPARATOR +# --------------------------------- +AC_DEFUN([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR], +[# Find the correct PATH separator. Usually this is `:', but +# DJGPP uses `;' like DOS. +if test "X${PATH_SEPARATOR+set}" != Xset; then + UNAME=${UNAME-`uname 2>/dev/null`} + case X$UNAME in + *-DOS) lt_cv_sys_path_separator=';' ;; + *) lt_cv_sys_path_separator=':' ;; + esac + PATH_SEPARATOR=$lt_cv_sys_path_separator +fi +])# _LT_AC_LIBTOOL_SYS_PATH_SEPARATOR # _LT_AC_PROG_ECHO_BACKSLASH # -------------------------- # Add some code to the start of the generated configure script which # will find an echo command which doesn't interpret backslashes. AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], -[_LT_AC_SHELL_INIT([ +[ifdef([AC_DIVERSION_NOTICE], [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR + # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} @@ -313,7 +427,7 @@ if test "X[$]1" = X--no-reexec; then elif test "X[$]1" = X--fallback-echo; then # Avoid inline document here, it may be left over : -elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then # Yippee, $echo works! : else @@ -325,7 +439,7 @@ if test "X[$]1" = X--fallback-echo; then # used as fallback echo shift cat </dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && @@ -370,7 +483,7 @@ else break fi done - IFS="$lt_save_ifs" + IFS="$save_ifs" if test "X$echo" = Xecho; then # We didn't find a better echo, so look for alternatives. @@ -443,291 +556,17 @@ if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then fi AC_SUBST(ECHO) -])])# _LT_AC_PROG_ECHO_BACKSLASH - - -# _LT_AC_LOCK -# ----------- -AC_DEFUN([_LT_AC_LOCK], -[AC_ARG_ENABLE([libtool-lock], - [AC_HELP_STRING([--disable-libtool-lock], - [avoid locking (might break parallel builds)])]) -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -ia64-*-hpux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.$ac_objext` in - *ELF-32*) - HPUX_IA64_MODE="32" - ;; - *ELF-64*) - HPUX_IA64_MODE="64" - ;; - esac - fi - rm -rf conftest* - ;; -*-*-irix6*) - # Find out which ABI we are using. - echo '[#]line __oline__ "configure"' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - if test "$lt_cv_prog_gnu_ld" = yes; then - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -melf32bsmip" - ;; - *N32*) - LD="${LD-ld} -melf32bmipn32" - ;; - *64-bit*) - LD="${LD-ld} -melf64bmip" - ;; - esac - else - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - fi - rm -rf conftest* - ;; - -x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case "`/usr/bin/file conftest.o`" in - *32-bit*) - case $host in - x86_64-*linux*) - LD="${LD-ld} -m elf_i386" - ;; - ppc64-*linux*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) - LD="${LD-ld} -m elf_s390" - ;; - sparc64-*linux*) - LD="${LD-ld} -m elf32_sparc" - ;; - esac - ;; - *64-bit*) - case $host in - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - ppc*-*linux*|powerpc*-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*) - LD="${LD-ld} -m elf64_s390" - ;; - sparc*-*linux*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, - [AC_LANG_PUSH(C) - AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) - AC_LANG_POP]) - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; -AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], -[*-*-cygwin* | *-*-mingw* | *-*-pw32*) - AC_CHECK_TOOL(DLLTOOL, dlltool, false) - AC_CHECK_TOOL(AS, as, false) - AC_CHECK_TOOL(OBJDUMP, objdump, false) - ;; - ]) -esac - -need_locks="$enable_libtool_lock" - -])# _LT_AC_LOCK - - -# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, -# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) -# ---------------------------------------------------------------- -# Check whether the given compiler option works -AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], -[AC_CACHE_CHECK([$1], [$2], - [$2=no - ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$3" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ - -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&AS_MESSAGE_LOG_FD - echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test ! -s conftest.err; then - $2=yes - fi - fi - $rm conftest* -]) - -if test x"[$]$2" = xyes; then - ifelse([$5], , :, [$5]) -else - ifelse([$6], , :, [$6]) -fi -])# AC_LIBTOOL_COMPILER_OPTION - - -# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, -# [ACTION-SUCCESS], [ACTION-FAILURE]) -# ------------------------------------------------------------ -# Check whether the given compiler option works -AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], -[AC_CACHE_CHECK([$1], [$2], - [$2=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $3" - printf "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&AS_MESSAGE_LOG_FD - else - $2=yes - fi - fi - $rm conftest* - LDFLAGS="$save_LDFLAGS" -]) - -if test x"[$]$2" = xyes; then - ifelse([$4], , :, [$4]) -else - ifelse([$5], , :, [$5]) -fi -])# AC_LIBTOOL_LINKER_OPTION - - -# AC_LIBTOOL_SYS_MAX_CMD_LEN -# -------------------------- -AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], -[# find the maximum length of command line arguments -AC_MSG_CHECKING([the maximum length of command line arguments]) -AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl - i=0 - testring="ABCD" - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - *) - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while (test "X"`$CONFIG_SHELL [$]0 --fallback-echo "X$testring" 2>/dev/null` \ - = "XX$testring") >/dev/null 2>&1 && - new_result=`expr "X$testring" : ".*" 2>&1` && - lt_cv_sys_max_cmd_len=$new_result && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - testring=$testring$testring - done - testring= - # Add a significant safety factor because C++ compilers can tack on massive - # amounts of additional arguments before passing them to the linker. - # It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - ;; - esac -]) -if test -n $lt_cv_sys_max_cmd_len ; then - AC_MSG_RESULT($lt_cv_sys_max_cmd_len) -else - AC_MSG_RESULT(none) -fi -])# AC_LIBTOOL_SYS_MAX_CMD_LEN - - -# _LT_AC_CHECK_DLFCN -# -------------------- -AC_DEFUN([_LT_AC_CHECK_DLFCN], -[AC_CHECK_HEADERS(dlfcn.h)dnl -])# _LT_AC_CHECK_DLFCN - +AC_DIVERT_POP +])# _LT_AC_PROG_ECHO_BACKSLASH # _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ------------------------------------------------------------------ AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], -[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl -if test "$cross_compiling" = yes; then : +[if test "$cross_compiling" = yes; then : [$4] else + AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext </dev/null - mkdir conftest - cd conftest - mkdir out - printf "$lt_simple_compile_test_code" > conftest.$ac_ext +# Same as above, but do not quote variable references. +double_quote_subst='s/\([[\\"\\`\\\\]]\)/\\\1/g' - # According to Tom Tromey, Ian Lance Taylor reported there are C compilers - # that will create temporary files in the current directory regardless of - # the output directory. Thus, making CWD read-only will cause this test - # to fail, enabling locking or at least warning the user not to do parallel - # builds. - chmod -w . +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ - -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&AS_MESSAGE_LOG_FD - echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test ! -s out/conftest.err; then - _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes - fi - fi - chmod u+w . - $rm conftest* out/* - rmdir out - cd .. - rmdir conftest - $rm conftest* +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" +need_locks="$enable_libtool_lock" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +if test x"$host" != x"$build"; then + ac_tool_prefix=${host_alias}- +else + ac_tool_prefix= +fi + +# Transform linux* to *-*-linux-gnu*, to support old configure scripts. +case $host_os in +linux-gnu*) ;; +linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` +esac + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + ;; + *) + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +# Allow CC to be a program name with arguments. +set dummy $CC +compiler="[$]2" + +AC_MSG_CHECKING([for objdir]) +rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + objdir=_libs +fi +rmdir .libs 2>/dev/null +AC_MSG_RESULT($objdir) + + +AC_ARG_WITH(pic, +[ --with-pic try to use only PIC/non-PIC objects [default=use both]], +pic_mode="$withval", pic_mode=default) +test -z "$pic_mode" && pic_mode=default + +# We assume here that the value for lt_cv_prog_cc_pic will not be cached +# in isolation, and that seeing it set (from the cache) indicates that +# the associated values are set (in the cache) correctly too. +AC_MSG_CHECKING([for $compiler option to produce PIC]) +AC_CACHE_VAL(lt_cv_prog_cc_pic, +[ lt_cv_prog_cc_pic= + lt_cv_prog_cc_shlib= + lt_cv_prog_cc_wl= + lt_cv_prog_cc_static= + lt_cv_prog_cc_no_builtin= + lt_cv_prog_cc_can_build_shared=$can_build_shared + + if test "$GCC" = yes; then + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static='-static' + + case $host_os in + aix*) + # Below there is a dirty hack to force normal static linking with -ldl + # The problem is because libdl dynamically linked with both libc and + # libC (AIX C++ library), which obviously doesn't included in libraries + # list by gcc. This cause undefined symbols with -static flags. + # This hack allows C programs to be linked with "-static -ldl", but + # not sure about C++ programs. + lt_cv_prog_cc_static="$lt_cv_prog_cc_static ${lt_cv_prog_cc_wl}-lC" + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_cv_prog_cc_pic='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_cv_prog_cc_pic='-fno-common' + ;; + cygwin* | mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_cv_prog_cc_pic='-DDLL_EXPORT' + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_cv_prog_cc_pic=-Kconform_pic + fi + ;; + *) + lt_cv_prog_cc_pic='-fPIC' + ;; + esac + else + # PORTME Check for PIC flags for the system compiler. + case $host_os in + aix3* | aix4* | aix5*) + lt_cv_prog_cc_wl='-Wl,' + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_cv_prog_cc_static='-Bstatic' + else + lt_cv_prog_cc_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + hpux9* | hpux10* | hpux11*) + # Is there a better lt_cv_prog_cc_static that works with the bundled CC? + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static="${lt_cv_prog_cc_wl}-a ${lt_cv_prog_cc_wl}archive" + lt_cv_prog_cc_pic='+Z' + ;; + + irix5* | irix6* | nonstopux*) + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static='-non_shared' + # PIC (with -KPIC) is the default. + ;; + + cygwin* | mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_cv_prog_cc_pic='-DDLL_EXPORT' + ;; + + newsos6) + lt_cv_prog_cc_pic='-KPIC' + lt_cv_prog_cc_static='-Bstatic' + ;; + + osf3* | osf4* | osf5*) + # All OSF/1 code is PIC. + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static='-non_shared' + ;; + + sco3.2v5*) + lt_cv_prog_cc_pic='-Kpic' + lt_cv_prog_cc_static='-dn' + lt_cv_prog_cc_shlib='-belf' + ;; + + solaris*) + lt_cv_prog_cc_pic='-KPIC' + lt_cv_prog_cc_static='-Bstatic' + lt_cv_prog_cc_wl='-Wl,' + ;; + + sunos4*) + lt_cv_prog_cc_pic='-PIC' + lt_cv_prog_cc_static='-Bstatic' + lt_cv_prog_cc_wl='-Qoption ld ' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + lt_cv_prog_cc_pic='-KPIC' + lt_cv_prog_cc_static='-Bstatic' + lt_cv_prog_cc_wl='-Wl,' + ;; + + uts4*) + lt_cv_prog_cc_pic='-pic' + lt_cv_prog_cc_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_cv_prog_cc_pic='-Kconform_pic' + lt_cv_prog_cc_static='-Bstatic' + fi + ;; + + *) + lt_cv_prog_cc_can_build_shared=no + ;; + esac + fi ]) -])# AC_LIBTOOL_PROG_CC_C_O +if test -z "$lt_cv_prog_cc_pic"; then + AC_MSG_RESULT([none]) +else + AC_MSG_RESULT([$lt_cv_prog_cc_pic]) + + # Check to make sure the pic_flag actually works. + AC_MSG_CHECKING([if $compiler PIC flag $lt_cv_prog_cc_pic works]) + AC_CACHE_VAL(lt_cv_prog_cc_pic_works, [dnl + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $lt_cv_prog_cc_pic -DPIC" + AC_TRY_COMPILE([], [], [dnl + case $host_os in + hpux9* | hpux10* | hpux11*) + # On HP-UX, both CC and GCC only warn that PIC is supported... then + # they create non-PIC objects. So, if there were any warnings, we + # assume that PIC is not supported. + if test -s conftest.err; then + lt_cv_prog_cc_pic_works=no + else + lt_cv_prog_cc_pic_works=yes + fi + ;; + *) + lt_cv_prog_cc_pic_works=yes + ;; + esac + ], [dnl + lt_cv_prog_cc_pic_works=no + ]) + CFLAGS="$save_CFLAGS" + ]) + + if test "X$lt_cv_prog_cc_pic_works" = Xno; then + lt_cv_prog_cc_pic= + lt_cv_prog_cc_can_build_shared=no + else + lt_cv_prog_cc_pic=" $lt_cv_prog_cc_pic" + fi + + AC_MSG_RESULT([$lt_cv_prog_cc_pic_works]) +fi + +# Check for any special shared library compilation flags. +if test -n "$lt_cv_prog_cc_shlib"; then + AC_MSG_WARN([\`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries]) + if echo "$old_CC $old_CFLAGS " | egrep -e "[[ ]]$lt_cv_prog_cc_shlib[[ ]]" >/dev/null; then : + else + AC_MSG_WARN([add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure]) + lt_cv_prog_cc_can_build_shared=no + fi +fi + +AC_MSG_CHECKING([if $compiler static flag $lt_cv_prog_cc_static works]) +AC_CACHE_VAL([lt_cv_prog_cc_static_works], [dnl + lt_cv_prog_cc_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_cv_prog_cc_static" + AC_TRY_LINK([], [], [lt_cv_prog_cc_static_works=yes]) + LDFLAGS="$save_LDFLAGS" +]) + +# Belt *and* braces to stop my trousers falling down: +test "X$lt_cv_prog_cc_static_works" = Xno && lt_cv_prog_cc_static= +AC_MSG_RESULT([$lt_cv_prog_cc_static_works]) + +pic_flag="$lt_cv_prog_cc_pic" +special_shlib_compile_flags="$lt_cv_prog_cc_shlib" +wl="$lt_cv_prog_cc_wl" +link_static_flag="$lt_cv_prog_cc_static" +no_builtin_flag="$lt_cv_prog_cc_no_builtin" +can_build_shared="$lt_cv_prog_cc_can_build_shared" -# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) -# ----------------------------------------- +# Check to see if options -o and -c are simultaneously supported by compiler +AC_MSG_CHECKING([if $compiler supports -c -o file.$ac_objext]) +AC_CACHE_VAL([lt_cv_compiler_c_o], [ +$rm -r conftest 2>/dev/null +mkdir conftest +cd conftest +echo "int some_variable = 0;" > conftest.$ac_ext +mkdir out +# According to Tom Tromey, Ian Lance Taylor reported there are C compilers +# that will create temporary files in the current directory regardless of +# the output directory. Thus, making CWD read-only will cause this test +# to fail, enabling locking or at least warning the user not to do parallel +# builds. +chmod -w . +save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -o out/conftest2.$ac_objext" +compiler_c_o=no +if { (eval echo configure:__oline__: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s out/conftest.err; then + lt_cv_compiler_c_o=no + else + lt_cv_compiler_c_o=yes + fi +else + # Append any errors to the config.log. + cat out/conftest.err 1>&AC_FD_CC + lt_cv_compiler_c_o=no +fi +CFLAGS="$save_CFLAGS" +chmod u+w . +$rm conftest* out/* +rmdir out +cd .. +rmdir conftest +$rm -r conftest 2>/dev/null +]) +compiler_c_o=$lt_cv_compiler_c_o +AC_MSG_RESULT([$compiler_c_o]) + +if test x"$compiler_c_o" = x"yes"; then + # Check to see if we can write to a .lo + AC_MSG_CHECKING([if $compiler supports -c -o file.lo]) + AC_CACHE_VAL([lt_cv_compiler_o_lo], [ + lt_cv_compiler_o_lo=no + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -c -o conftest.lo" + save_objext="$ac_objext" + ac_objext=lo + AC_TRY_COMPILE([], [int some_variable = 0;], [dnl + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + lt_cv_compiler_o_lo=no + else + lt_cv_compiler_o_lo=yes + fi + ]) + ac_objext="$save_objext" + CFLAGS="$save_CFLAGS" + ]) + compiler_o_lo=$lt_cv_compiler_o_lo + AC_MSG_RESULT([$compiler_o_lo]) +else + compiler_o_lo=no +fi + # Check to see if we can do hard links to lock some files if needed -AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], -[AC_REQUIRE([_LT_AC_LOCK])dnl - hard_links="nottested" -if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then +if test "$compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes @@ -993,77 +1148,764 @@ if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then - AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + AC_MSG_WARN([\`$CC' does not support \`-c -o', so \`make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi -])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS +if test "$GCC" = yes; then + # Check to see if options -fno-rtti -fno-exceptions are supported by compiler + AC_MSG_CHECKING([if $compiler supports -fno-rtti -fno-exceptions]) + echo "int some_variable = 0;" > conftest.$ac_ext + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.$ac_ext" + compiler_rtti_exceptions=no + AC_TRY_COMPILE([], [int some_variable = 0;], [dnl + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + compiler_rtti_exceptions=no + else + compiler_rtti_exceptions=yes + fi + ]) + CFLAGS="$save_CFLAGS" + AC_MSG_RESULT([$compiler_rtti_exceptions]) -# AC_LIBTOOL_OBJDIR -# ----------------- -AC_DEFUN([AC_LIBTOOL_OBJDIR], -[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], -[rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - lt_cv_objdir=.libs -else - # MS-DOS does not allow filenames that begin with a dot. - lt_cv_objdir=_libs + if test "$compiler_rtti_exceptions" = "yes"; then + no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions' + else + no_builtin_flag=' -fno-builtin' + fi fi -rmdir .libs 2>/dev/null]) -objdir=$lt_cv_objdir -])# AC_LIBTOOL_OBJDIR +# See if the linker supports building shared libraries. +AC_MSG_CHECKING([whether the linker ($LD) supports shared libraries]) + +allow_undefined_flag= +no_undefined_flag= +need_lib_prefix=unknown +need_version=unknown +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +archive_cmds= +archive_expsym_cmds= +old_archive_from_new_cmds= +old_archive_from_expsyms_cmds= +export_dynamic_flag_spec= +whole_archive_flag_spec= +thread_safe_flag_spec= +hardcode_into_libs=no +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no +hardcode_shlibpath_var=unsupported +runpath_var= +link_all_deplibs=unknown +always_export_symbols=no +export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols' +# include_expsyms should be a list of space-separated symbols to be *always* +# included in the symbol list +include_expsyms= +# exclude_expsyms can be an egrep regular expression of symbols to exclude +# it will be wrapped by ` (' and `)$', so one must not match beginning or +# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', +# as well as any symbol that contains `d'. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_" +# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out +# platforms (ab)use it in PIC code, but their linkers get confused if +# the symbol is explicitly referenced. Since portable code cannot +# rely on this symbol name, it's probably fine to never include it in +# preloaded symbol tables. +extract_expsyms_cmds= + +case $host_os in +cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; +openbsd*) + with_gnu_ld=no + ;; +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX, the GNU linker is very broken + # Note:Check GNU linker on AIX 5-IA64 when/if it becomes available. + ld_shlibs=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can use + # them. + ld_shlibs=no + ;; + + beos*) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + allow_undefined_flag=unsupported + always_export_symbols=yes + + extract_expsyms_cmds='test -f $output_objdir/impgen.c || \ + sed -e "/^# \/\* impgen\.c starts here \*\//,/^# \/\* impgen.c ends here \*\// { s/^# //;s/^# *$//; p; }" -e d < $''0 > $output_objdir/impgen.c~ + test -f $output_objdir/impgen.exe || (cd $output_objdir && \ + if test "x$HOST_CC" != "x" ; then $HOST_CC -o impgen impgen.c ; \ + else $CC -o impgen impgen.c ; fi)~ + $output_objdir/impgen $dir/$soroot > $output_objdir/$soname-def' + + old_archive_from_expsyms_cmds='$DLLTOOL --as=$AS --dllname $soname --def $output_objdir/$soname-def --output-lib $output_objdir/$newlib' + + # cygwin and mingw dlls have different entry points and sets of symbols + # to exclude. + # FIXME: what about values for MSVC? + dll_entry=__cygwin_dll_entry@12 + dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12~ + case $host_os in + mingw*) + # mingw values + dll_entry=_DllMainCRTStartup@12 + dll_exclude_symbols=DllMain@12,DllMainCRTStartup@12,DllEntryPoint@12~ + ;; + esac + + # mingw and cygwin differ, and it's simplest to just exclude the union + # of the two symbol sets. + dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12,DllMainCRTStartup@12,DllEntryPoint@12 + + # recent cygwin and mingw systems supply a stub DllMain which the user + # can override, but on older systems we have to supply one (in ltdll.c) + if test "x$lt_cv_need_dllmain" = "xyes"; then + ltdll_obj='$output_objdir/$soname-ltdll.'"$ac_objext " + ltdll_cmds='test -f $output_objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $''0 > $output_objdir/$soname-ltdll.c~ + test -f $output_objdir/$soname-ltdll.$ac_objext || (cd $output_objdir && $CC -c $soname-ltdll.c)~' + else + ltdll_obj= + ltdll_cmds= + fi + + # Extract the symbol export list from an `--export-all' def file, + # then regenerate the def file from the symbol export list, so that + # the compiled dll only exports the symbol export list. + # Be careful not to strip the DATA tag left be newer dlltools. + export_symbols_cmds="$ltdll_cmds"' + $DLLTOOL --export-all --exclude-symbols '$dll_exclude_symbols' --output-def $output_objdir/$soname-def '$ltdll_obj'$libobjs $convenience~ + sed -e "1,/EXPORTS/d" -e "s/ @ [[0-9]]*//" -e "s/ *;.*$//" < $output_objdir/$soname-def > $export_symbols' + + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is. + # If DATA tags from a recent dlltool are present, honour them! + archive_expsym_cmds='if test "x`sed 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname-def; + else + echo EXPORTS > $output_objdir/$soname-def; + _lt_hint=1; + cat $export_symbols | while read symbol; do + set dummy \$symbol; + case \[$]# in + 2) echo " \[$]2 @ \$_lt_hint ; " >> $output_objdir/$soname-def;; + 4) echo " \[$]2 \[$]3 \[$]4 ; " >> $output_objdir/$soname-def; _lt_hint=`expr \$_lt_hint - 1`;; + *) echo " \[$]2 @ \$_lt_hint \[$]3 ; " >> $output_objdir/$soname-def;; + esac; + _lt_hint=`expr 1 + \$_lt_hint`; + done; + fi~ + '"$ltdll_cmds"' + $CC -Wl,--base-file,$output_objdir/$soname-base '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~ + $CC -Wl,--base-file,$output_objdir/$soname-base $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp --output-lib $output_objdir/$libname.dll.a~ + $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags' + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + case $host_os in + cygwin* | mingw* | pw32*) + # dlltool doesn't understand --whole-archive et. al. + whole_archive_flag_spec= + ;; + *) + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + ;; + esac + fi +else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + hardcode_direct=yes + archive_cmds='' + hardcode_libdir_separator=':' + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + esac + + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + shared_flag='${wl}-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall can do strange things, so it is better to + # generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib' + archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname ${wl}-h$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + hardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib' + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='${wl}-berok' + # This is a bit strange, but is similar to how AIX traditionally builds + # it's shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"' ~$AR -crlo $objdir/$libname$release.a $objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + ;; + + darwin* | rhapsody*) + case "$host_os" in + rhapsody* | darwin1.[[012]]) + allow_undefined_flag='-undefined suppress' + ;; + *) # Darwin 1.3 on +# allow_undefined_flag='-undefined suppress' + ;; + esac + # FIXME: Relying on posixy $() will cause problems for + # cross-compilation, but unfortunately the echo tests do not + # yet detect zsh echo's removal of \ escapes. Also zsh mangles + # `"' quotes if we put them in here... so don't! + archive_cmds='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs && $CC $(test .$module = .yes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib ${lib}-master.o $deplibs$linker_flags $(test .$module != .yes && echo -install_name $rpath/$soname $verstring)' + # We need to add '_' to the symbols in $export_symbols first + #archive_expsym_cmds="$archive_cmds"' && strip -s $export_symbols' + hardcode_direct=yes + hardcode_shlibpath_var=no + whole_archive_flag_spec='-all_load $convenience' + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd*) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9* | hpux10* | hpux11*) + case $host_os in + hpux9*) archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ;; + *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; + esac + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_minus_L=yes # Not in the search PATH, but as the default + # location of the library. + export_dynamic_flag_spec='${wl}-E' + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + link_all_deplibs=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + openbsd*) + hardcode_direct=yes + hardcode_shlibpath_var=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case "$host_os" in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "-exported_symbol " >> $lib.exp; echo "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + #Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + + sco3.2v5*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + export_dynamic_flag_spec='${wl}-Bexport' + ;; + + solaris*) + # gcc --version < 3.0 without binutils cannot create self contained + # shared libraries reliably, requiring libgcc.a to resolve some of + # the object symbols generated in some cases. Libraries that use + # assert need libgcc.a to resolve __eprintf, for example. Linking + # a copy of libgcc.a into every shared library to guarantee resolving + # such symbols causes other problems: According to Tim Van Holder + # , C++ libraries end up with a separate + # (to the application) exception stack for one thing. + no_undefined_flag=' -z defs' + if test "$GCC" = yes; then + case `$CC --version 2>/dev/null` in + [[12]].*) + cat <&2 + +*** Warning: Releases of GCC earlier than version 3.0 cannot reliably +*** create self contained shared libraries on Solaris systems, without +*** introducing a dependency on libgcc.a. Therefore, libtool is disabling +*** -no-undefined support, which will at least allow you to build shared +*** libraries. However, you may find that when you link such libraries +*** into an application without using GCC, you have to manually add +*** \`gcc --print-libgcc-file-name\` to the link command. We urge you to +*** upgrade to a newer version of GCC. Another option is to rebuild your +*** current GCC to use the GNU linker from GNU binutils 2.9.1 or newer. + +EOF + no_undefined_flag= + ;; + esac + fi + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv5*) + no_undefined_flag=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec= + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=no + hardcode_shlibpath_var=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5uw7* | unixware7*) + no_undefined_flag='${wl}-z ${wl}text' + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac +fi +AC_MSG_RESULT([$ld_shlibs]) +test "$ld_shlibs" = no && can_build_shared=no -# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) -# ---------------------------------------------- # Check hardcoding attributes. -AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], -[AC_MSG_CHECKING([how to hardcode library paths into programs]) -_LT_AC_TAGVAR(hardcode_action, $1)= -if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ - test -n "$_LT_AC_TAGVAR(runpath_var $1)" || \ - test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)"="Xyes" ; then +AC_MSG_CHECKING([how to hardcode library paths into programs]) +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || \ + test -n "$runpath_var"; then # We can hardcode non-existant directories. - if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && + if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one - ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && - test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then + ## test "$hardcode_shlibpath_var" != no && + test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. - _LT_AC_TAGVAR(hardcode_action, $1)=relink + hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. - _LT_AC_TAGVAR(hardcode_action, $1)=immediate + hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. - _LT_AC_TAGVAR(hardcode_action, $1)=unsupported + hardcode_action=unsupported fi -AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) +AC_MSG_RESULT([$hardcode_action]) -if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi -])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH - - -# AC_LIBTOOL_SYS_LIB_STRIP -# ------------------------ -AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], -[striplib= +striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then @@ -1071,33 +1913,17 @@ if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - AC_MSG_RESULT([yes]) - else AC_MSG_RESULT([no]) fi - ;; - *) - AC_MSG_RESULT([no]) - ;; - esac -fi -])# AC_LIBTOOL_SYS_LIB_STRIP +reload_cmds='$LD$reload_flag -o $output$reload_objs' +test -z "$deplibs_check_method" && deplibs_check_method=unknown -# AC_LIBTOOL_SYS_DYNAMIC_LINKER -# ----------------------------- # PORTME Fill in your ld.so characteristics -AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], -[AC_MSG_CHECKING([dynamic linker characteristics]) +AC_MSG_CHECKING([dynamic linker characteristics]) library_names_spec= libname_spec='lib$name' soname_spec= -shrext=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= @@ -1107,35 +1933,16 @@ shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" -if test "$GCC" = yes; then - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown +sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" case $host_os in aix3*) version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + library_names_spec='${libname}${release}.so$versuffix $libname.a' shlibpath_var=LIBPATH - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' + # AIX has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}.so$major' ;; aix4* | aix5*) @@ -1145,7 +1952,7 @@ aix4* | aix5*) hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + library_names_spec='${libname}${release}.so$major ${libname}${release}.so$versuffix $libname.so' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file @@ -1155,31 +1962,33 @@ aix4* | aix5*) # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. + # AIX (on Power*) has no versioning support, so currently we can + # not hardcode correct soname into executable. Probably we can + # add versioning support to collect2, so additional links can + # be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' + soname_spec='${libname}${release}.so$major' fi shlibpath_var=LIBPATH fi + hardcode_into_libs=yes ;; amigaos*) @@ -1189,7 +1998,7 @@ amigaos*) ;; beos*) - library_names_spec='${libname}${shared_ext}' + library_names_spec='${libname}.so' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; @@ -1197,12 +2006,13 @@ beos*) bsdi4*) version_type=linux need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + export_dynamic_flag_spec=-rdynamic # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs @@ -1210,55 +2020,29 @@ bsdi4*) cygwin* | mingw* | pw32*) version_type=windows - shrext=".dll" need_version=no need_lib_prefix=no - case $GCC,$host_os in - yes,cygwin* | yes,mingw* | yes,pw32*) + yes,cygwin*) library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll' + postinstall_cmds='dlpath=`bash 2>&1 -c '\''. $dir/${file}i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + $install_prog .libs/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`bash 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec="/lib /lib/w32api /usr/lib /usr/local/lib" - ;; - mingw*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then - # It is most probably a Windows format PATH printed by - # mingw gcc, but we are running on Cygwin. Gcc prints its search - # path with ; separators, and with drive letters. We can handle the - # drive letters (cygwin fileutils understands them), so leave them, - # especially as we might pass files found there to a mingw objdump, - # which wouldn't understand a cygwinified path. Ahh. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac ;; - + yes,mingw*) + library_names_spec='${libname}`echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g" -e "s,=/,/,g"` + ;; + yes,pw32*) + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll' + ;; *) - library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + library_names_spec='${libname}`echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' @@ -1274,25 +2058,10 @@ darwin* | rhapsody*) # FIXME: Relying on posixy $() will cause problems for # cross-compilation, but unfortunately the echo tests do not # yet detect zsh echo's removal of \ escapes. - library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' + library_names_spec='${libname}${release}${versuffix}.$(test .$module = .yes && echo so || echo dylib) ${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib) ${libname}.$(test .$module = .yes && echo so || echo dylib)' + soname_spec='${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib)' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH - shrext='$(test .$module = .yes && echo .so || echo .dylib)' - # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. - if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then - sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` - fi - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) @@ -1304,12 +2073,12 @@ freebsd*) version_type=freebsd-$objformat case $version_type in freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' need_version=no need_lib_prefix=no ;; freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix' need_version=yes ;; esac @@ -1318,11 +2087,7 @@ freebsd*) freebsd2*) shlibpath_overrides_runpath=yes ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - *) # from 3.2 on + *) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; @@ -1333,8 +2098,8 @@ gnu*) version_type=linux need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so' + soname_spec='${libname}${release}.so$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; @@ -1342,45 +2107,14 @@ gnu*) hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. + dynamic_linker="$host_os dld.sl" version_type=sunos need_lib_prefix=no need_version=no - case "$host_cpu" in - ia64*) - shrext='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl' + soname_spec='${libname}${release}.sl$major' # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; @@ -1388,29 +2122,21 @@ hpux9* | hpux10* | hpux11*) irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux - else - version_type=irix - fi ;; + *) version_type=irix ;; esac need_lib_prefix=no need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; + *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; @@ -1419,21 +2145,20 @@ irix5* | irix6* | nonstopux*) shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) +linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*) dynamic_linker=no ;; # This must be Linux ELF. -linux*) +linux-gnu*) version_type=linux need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no @@ -1456,12 +2181,12 @@ netbsd*) need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so' + soname_spec='${libname}${release}.so$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH @@ -1471,17 +2196,7 @@ netbsd*) newsos6) version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -nto-qnx) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; @@ -1490,47 +2205,46 @@ openbsd*) version_type=sunos need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[[89]] | openbsd2.[[89]].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac + case "$host_os" in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac else shlibpath_overrides_runpath=yes fi + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH ;; os2*) libname_spec='$name' - shrext=".dll" need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' + library_names_spec='$libname.dll $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf - need_lib_prefix=no need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + hardcode_into_libs=yes ;; sco3.2v5*) version_type=osf - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' shlibpath_var=LD_LIBRARY_PATH ;; @@ -1538,8 +2252,8 @@ solaris*) version_type=linux need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes @@ -1549,7 +2263,7 @@ solaris*) sunos4*) version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes @@ -1561,8 +2275,8 @@ sunos4*) sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) @@ -1583,950 +2297,39 @@ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) esac ;; +uts4*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + sysv4*MP*) if test -d /usr/nec ;then version_type=linux - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' + library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so' + soname_spec='$libname.so.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; -uts4*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no -])# AC_LIBTOOL_SYS_DYNAMIC_LINKER - -# _LT_AC_TAGCONFIG -# ---------------- -AC_DEFUN([_LT_AC_TAGCONFIG], -[AC_ARG_WITH([tags], - [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], - [include additional configurations @<:@automatic@:>@])], - [tagnames="$withval"]) - -if test -f "$ltmain" && test -n "$tagnames"; then - if test ! -f "${ofile}"; then - AC_MSG_WARN([output file `$ofile' does not exist]) - fi - - if test -z "$LTCC"; then - eval "`$SHELL ${ofile} --config | grep '^LTCC='`" - if test -z "$LTCC"; then - AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) - else - AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) - fi - fi - - # Extract list of available tagged configurations in $ofile. - # Note that this assumes the entire list is on one line. - available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` - - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for tagname in $tagnames; do - IFS="$lt_save_ifs" - # Check whether tagname contains only valid characters - case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in - "") ;; - *) AC_MSG_ERROR([invalid tag name: $tagname]) - ;; - esac - - if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null - then - AC_MSG_ERROR([tag name \"$tagname\" already exists]) - fi - - # Update the list of available tags. - if test -n "$tagname"; then - echo appending configuration tag \"$tagname\" to $ofile - - case $tagname in - CXX) - if test -n "$CXX" && test "X$CXX" != "Xno"; then - AC_LIBTOOL_LANG_CXX_CONFIG - else - tagname="" - fi - ;; - - F77) - if test -n "$F77" && test "X$F77" != "Xno"; then - AC_LIBTOOL_LANG_F77_CONFIG - else - tagname="" - fi - ;; - - GCJ) - if test -n "$GCJ" && test "X$GCJ" != "Xno"; then - AC_LIBTOOL_LANG_GCJ_CONFIG - else - tagname="" - fi - ;; - - RC) - AC_LIBTOOL_LANG_RC_CONFIG - ;; - - *) - AC_MSG_ERROR([Unsupported tag name: $tagname]) - ;; - esac - - # Append the new tag name to the list of available tags. - if test -n "$tagname" ; then - available_tags="$available_tags $tagname" - fi - fi - done - IFS="$lt_save_ifs" - - # Now substitute the updated list of available tags. - if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then - mv "${ofile}T" "$ofile" - chmod +x "$ofile" - else - rm -f "${ofile}T" - AC_MSG_ERROR([unable to update list of available tagged configurations.]) - fi -fi -])# _LT_AC_TAGCONFIG - - -# AC_LIBTOOL_DLOPEN -# ----------------- -# enable checks for dlopen support -AC_DEFUN([AC_LIBTOOL_DLOPEN], - [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) -])# AC_LIBTOOL_DLOPEN - - -# AC_LIBTOOL_WIN32_DLL -# -------------------- -# declare package support for building win32 dll's -AC_DEFUN([AC_LIBTOOL_WIN32_DLL], -[AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) -])# AC_LIBTOOL_WIN32_DLL - - -# AC_ENABLE_SHARED([DEFAULT]) -# --------------------------- -# implement the --enable-shared flag -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -AC_DEFUN([AC_ENABLE_SHARED], -[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE([shared], - [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], - [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_shared=]AC_ENABLE_SHARED_DEFAULT) -])# AC_ENABLE_SHARED - - -# AC_DISABLE_SHARED -# ----------------- -#- set the default shared flag to --disable-shared -AC_DEFUN([AC_DISABLE_SHARED], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -AC_ENABLE_SHARED(no) -])# AC_DISABLE_SHARED - - -# AC_ENABLE_STATIC([DEFAULT]) -# --------------------------- -# implement the --enable-static flag -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -AC_DEFUN([AC_ENABLE_STATIC], -[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE([static], - [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], - [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_static=]AC_ENABLE_STATIC_DEFAULT) -])# AC_ENABLE_STATIC - - -# AC_DISABLE_STATIC -# ----------------- -# set the default static flag to --disable-static -AC_DEFUN([AC_DISABLE_STATIC], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -AC_ENABLE_STATIC(no) -])# AC_DISABLE_STATIC - - -# AC_ENABLE_FAST_INSTALL([DEFAULT]) -# --------------------------------- -# implement the --enable-fast-install flag -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -AC_DEFUN([AC_ENABLE_FAST_INSTALL], -[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE([fast-install], - [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], - [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) -])# AC_ENABLE_FAST_INSTALL - - -# AC_DISABLE_FAST_INSTALL -# ----------------------- -# set the default to --disable-fast-install -AC_DEFUN([AC_DISABLE_FAST_INSTALL], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -AC_ENABLE_FAST_INSTALL(no) -])# AC_DISABLE_FAST_INSTALL - - -# AC_LIBTOOL_PICMODE([MODE]) -# -------------------------- -# implement the --with-pic flag -# MODE is either `yes' or `no'. If omitted, it defaults to `both'. -AC_DEFUN([AC_LIBTOOL_PICMODE], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -pic_mode=ifelse($#,1,$1,default) -])# AC_LIBTOOL_PICMODE - - -# AC_PROG_EGREP -# ------------- -# This is predefined starting with Autoconf 2.54, so this conditional -# definition can be removed once we require Autoconf 2.54 or later. -m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], -[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], - [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 - then ac_cv_prog_egrep='grep -E' - else ac_cv_prog_egrep='egrep' - fi]) - EGREP=$ac_cv_prog_egrep - AC_SUBST([EGREP]) -])]) - - -# AC_PATH_TOOL_PREFIX -# ------------------- -# find a file program which can recognise shared library -AC_DEFUN([AC_PATH_TOOL_PREFIX], -[AC_REQUIRE([AC_PROG_EGREP])dnl -AC_MSG_CHECKING([for $1]) -AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, -[case $MAGIC_CMD in -[[\\/*] | ?:[\\/]*]) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR -dnl $ac_dummy forces splitting on constant user-supplied paths. -dnl POSIX.2 word splitting is done only on the output of word expansions, -dnl not every word. This closes a longstanding sh security hole. - ac_dummy="ifelse([$2], , $PATH, [$2])" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$1; then - lt_cv_path_MAGIC_CMD="$ac_dir/$1" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac]) -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - AC_MSG_RESULT($MAGIC_CMD) -else - AC_MSG_RESULT(no) -fi -])# AC_PATH_TOOL_PREFIX - - -# AC_PATH_MAGIC -# ------------- -# find a file program which can recognise a shared library -AC_DEFUN([AC_PATH_MAGIC], -[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) - else - MAGIC_CMD=: - fi -fi -])# AC_PATH_MAGIC - - -# AC_PROG_LD -# ---------- -# find the path to the GNU or non-GNU linker -AC_DEFUN([AC_PROG_LD], -[AC_ARG_WITH([gnu-ld], - [AC_HELP_STRING([--with-gnu-ld], - [assume the C compiler uses GNU ld @<:@default=no@:>@])], - [test "$withval" = no || with_gnu_ld=yes], - [with_gnu_ld=no]) -AC_REQUIRE([LT_AC_PROG_SED])dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - AC_MSG_CHECKING([for ld used by $CC]) - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [[\\/]]* | ?:[[\\/]]*) - re_direlt='/[[^/]][[^/]]*/\.\./' - # Canonicalize the path of ld - ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` - while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do - ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - AC_MSG_CHECKING([for GNU ld]) -else - AC_MSG_CHECKING([for non-GNU ld]) -fi -AC_CACHE_VAL(lt_cv_path_LD, -[if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some GNU ld's only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then - case $host_cpu in - i*86 ) - # Not sure whether the presence of OpenBSD here was a mistake. - # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - ;; - esac - else - lt_cv_deplibs_check_method=pass_all - fi - ;; - -gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - -hpux10.20* | hpux11*) - lt_cv_file_magic_cmd=/usr/bin/file - case "$host_cpu" in - ia64*) - lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' - lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so - ;; - hppa*64*) - [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] - lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl - ;; - *) - lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' - lt_cv_file_magic_test_file=/usr/lib/libc.sl - ;; - esac - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - irix5* | nonstopux*) - # this will be overridden with pass_all, but let us keep it just in case - lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" - ;; - *) - case $LD in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - # this will be overridden with pass_all, but let us keep it just in case - lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[[1234]] dynamic lib MIPS - version 1" - ;; - esac - lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*` - lt_cv_deplibs_check_method=pass_all - ;; - -# This must be Linux ELF. -linux*) - case $host_cpu in - alpha* | hppa* | i*86 | ia64* | m68* | mips | mipsel | powerpc* | sparc* | s390* | sh*) - lt_cv_deplibs_check_method=pass_all ;; - *) - # glibc up to 2.1.1 does not perform some relocations on ARM - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; - esac - lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` - ;; - -netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' - fi - ;; - -newos6*) - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=/usr/lib/libnls.so - ;; - -nto-qnx) - lt_cv_deplibs_check_method=unknown - ;; - -openbsd*) - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object' - else - lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' - fi - ;; - -osf3* | osf4* | osf5*) - # this will be overridden with pass_all, but let us keep it just in case - lt_cv_deplibs_check_method='file_magic COFF format alpha shared library' - lt_cv_file_magic_test_file=/shlib/libc.so - lt_cv_deplibs_check_method=pass_all - ;; - -sco3.2v5*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - lt_cv_file_magic_test_file=/lib/libc.so - ;; - -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - case $host_vendor in - motorola) - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - sequent) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' - ;; - sni) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" - lt_cv_file_magic_test_file=/lib/libc.so - ;; - siemens) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; -esac -]) -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -test -z "$deplibs_check_method" && deplibs_check_method=unknown -])# AC_DEPLIBS_CHECK_METHOD - - -# AC_PROG_NM -# ---------- -# find the path to a BSD-compatible name lister -AC_DEFUN([AC_PROG_NM], -[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, -[if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM="$NM" -else - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/${ac_tool_prefix}nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - esac - fi - done - IFS="$lt_save_ifs" - test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm -fi]) -NM="$lt_cv_path_NM" -])# AC_PROG_NM - - -# AC_CHECK_LIBM -# ------------- -# check for math library -AC_DEFUN([AC_CHECK_LIBM], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -LIBM= -case $host in -*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) - # These system don't have libm, or don't need it - ;; -*-ncr-sysv4.3*) - AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") - AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") - ;; -*) - AC_CHECK_LIB(m, cos, LIBM="-lm") - ;; -esac -])# AC_CHECK_LIBM - - -# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) -# ----------------------------------- -# sets LIBLTDL to the link flags for the libltdl convenience library and -# LTDLINCL to the include flags for the libltdl header and adds -# --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL -# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If -# DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will -# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with -# '${top_srcdir}/' (note the single quotes!). If your package is not -# flat and you're not using automake, define top_builddir and -# top_srcdir appropriately in the Makefiles. -AC_DEFUN([AC_LIBLTDL_CONVENIENCE], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl - case $enable_ltdl_convenience in - no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; - "") enable_ltdl_convenience=yes - ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; - esac - LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la - LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) - # For backwards non-gettext consistent compatibility... - INCLTDL="$LTDLINCL" -])# AC_LIBLTDL_CONVENIENCE - - -# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) -# ----------------------------------- -# sets LIBLTDL to the link flags for the libltdl installable library and -# LTDLINCL to the include flags for the libltdl header and adds -# --enable-ltdl-install to the configure arguments. Note that LIBLTDL -# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If -# DIRECTORY is not provided and an installed libltdl is not found, it is -# assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/' -# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single -# quotes!). If your package is not flat and you're not using automake, -# define top_builddir and top_srcdir appropriately in the Makefiles. -# In the future, this macro may have to be called after AC_PROG_LIBTOOL. -AC_DEFUN([AC_LIBLTDL_INSTALLABLE], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl - AC_CHECK_LIB(ltdl, lt_dlinit, - [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], - [if test x"$enable_ltdl_install" = xno; then - AC_MSG_WARN([libltdl not installed, but installation disabled]) - else - enable_ltdl_install=yes - fi - ]) - if test x"$enable_ltdl_install" = x"yes"; then - ac_configure_args="$ac_configure_args --enable-ltdl-install" - LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la - LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) - else - ac_configure_args="$ac_configure_args --enable-ltdl-install=no" - LIBLTDL="-lltdl" - LTDLINCL= - fi - # For backwards non-gettext consistent compatibility... - INCLTDL="$LTDLINCL" -])# AC_LIBLTDL_INSTALLABLE - - -# AC_LIBTOOL_CXX -# -------------- -# enable support for C++ libraries -AC_DEFUN([AC_LIBTOOL_CXX], -[AC_REQUIRE([_LT_AC_LANG_CXX]) -])# AC_LIBTOOL_CXX - - -# _LT_AC_LANG_CXX -# --------------- -AC_DEFUN([_LT_AC_LANG_CXX], -[AC_REQUIRE([AC_PROG_CXX]) -AC_REQUIRE([AC_PROG_CXXCPP]) -_LT_AC_SHELL_INIT([tagnames=`echo "$tagnames,CXX" | sed 's/^,//'`]) -])# _LT_AC_LANG_CXX - - -# AC_LIBTOOL_F77 -# -------------- -# enable support for Fortran 77 libraries -AC_DEFUN([AC_LIBTOOL_F77], -[AC_REQUIRE([_LT_AC_LANG_F77]) -])# AC_LIBTOOL_F77 - - -# _LT_AC_LANG_F77 -# --------------- -AC_DEFUN([_LT_AC_LANG_F77], -[AC_REQUIRE([AC_PROG_F77]) -_LT_AC_SHELL_INIT([tagnames=`echo "$tagnames,F77" | sed 's/^,//'`]) -])# _LT_AC_LANG_F77 - - -# AC_LIBTOOL_GCJ -# -------------- -# enable support for GCJ libraries -AC_DEFUN([AC_LIBTOOL_GCJ], -[AC_REQUIRE([_LT_AC_LANG_GCJ]) -])# AC_LIBTOOL_GCJ - - -# _LT_AC_LANG_GCJ -# --------------- -AC_DEFUN([_LT_AC_LANG_GCJ], -[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], - [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], - [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], - [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], - [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], - [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) -_LT_AC_SHELL_INIT([tagnames=`echo "$tagnames,GCJ" | sed 's/^,//'`]) -])# _LT_AC_LANG_GCJ - - -# AC_LIBTOOL_RC -# -------------- -# enable support for Windows resource files -AC_DEFUN([AC_LIBTOOL_RC], -[AC_REQUIRE([LT_AC_PROG_RC]) -_LT_AC_SHELL_INIT([tagnames=`echo "$tagnames,RC" | sed 's/^,//'`]) -])# AC_LIBTOOL_RC - - -# AC_LIBTOOL_LANG_C_CONFIG -# ------------------------ -# Ensure that the configuration vars for the C compiler are -# suitably defined. Those variables are subsequently used by -# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. -AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) -AC_DEFUN([_LT_AC_LANG_C_CONFIG], -[lt_save_CC="$CC" -AC_LANG_PUSH(C) - -# Source file extension for C test sources. -ac_ext=c - -# Object file extension for compiled C test sources. -objext=o -_LT_AC_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;\n" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}\n' - -_LT_AC_SYS_COMPILER - -# -# Check for any special shared library compilation flags. -# -_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)= -if test "$GCC" = no; then - case $host_os in - sco3.2v5*) - _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf' - ;; - esac -fi -if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then - AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries]) - if echo "$old_CC $old_CFLAGS " | grep "[[ ]]$]_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[[ ]]" >/dev/null; then : - else - AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure]) - _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no - fi -fi - - -# -# Check to make sure the static flag actually works. -# -AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works], - _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), - $_LT_AC_TAGVAR(lt_prog_compiler_static, $1), - [], - [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) - - -AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) -AC_LIBTOOL_PROG_COMPILER_PIC($1) -AC_LIBTOOL_PROG_CC_C_O($1) -AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) -AC_LIBTOOL_PROG_LD_SHLIBS($1) -AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) -AC_LIBTOOL_SYS_LIB_STRIP -AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) -AC_LIBTOOL_DLOPEN_SELF($1) - -# Report which librarie types wil actually be built +# Report the final consequences. AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) @@ -2549,34 +2352,6 @@ aix4*) test "$enable_shared" = yes && enable_static=no fi ;; - darwin* | rhapsody*) - if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - case "$host_os" in - rhapsody* | darwin1.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' - ;; - *) # Darwin 1.3 on - test -z ${LD_TWOLEVEL_NAMESPACE} && _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' - ;; - esac - # FIXME: Relying on posixy $() will cause problems for - # cross-compilation, but unfortunately the echo tests do not - # yet detect zsh echo's removal of \ escapes. Also zsh mangles - # `"' quotes if we put them in here... so don't! - output_verbose_link_cmd='echo' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring' - _LT_AC_TAGVAR(module_cmds, $1)='$CC -bundle $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -bundle $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_automatic, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - fi - ;; esac AC_MSG_RESULT([$enable_shared]) @@ -2585,1292 +2360,111 @@ AC_MSG_CHECKING([whether to build static libraries]) test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) -AC_LIBTOOL_CONFIG($1) - -AC_LANG_POP -CC="$lt_save_CC" -])# AC_LIBTOOL_LANG_C_CONFIG - - -# AC_LIBTOOL_LANG_CXX_CONFIG -# -------------------------- -# Ensure that the configuration vars for the C compiler are -# suitably defined. Those variables are subsequently used by -# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. -AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) -AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], -[AC_LANG_PUSH(C++) -AC_REQUIRE([AC_PROG_CXX]) -AC_REQUIRE([AC_PROG_CXXCPP]) - -_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_AC_TAGVAR(allow_undefined_flag, $1)= -_LT_AC_TAGVAR(always_export_symbols, $1)=no -_LT_AC_TAGVAR(archive_expsym_cmds, $1)= -_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_AC_TAGVAR(hardcode_direct, $1)=no -_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= -_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= -_LT_AC_TAGVAR(hardcode_minus_L, $1)=no -_LT_AC_TAGVAR(hardcode_automatic, $1)=no -_LT_AC_TAGVAR(module_cmds, $1)= -_LT_AC_TAGVAR(module_expsym_cmds, $1)= -_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown -_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_AC_TAGVAR(no_undefined_flag, $1)= -_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= -_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Dependencies to place before and after the object being linked: -_LT_AC_TAGVAR(predep_objects, $1)= -_LT_AC_TAGVAR(postdep_objects, $1)= -_LT_AC_TAGVAR(predeps, $1)= -_LT_AC_TAGVAR(postdeps, $1)= -_LT_AC_TAGVAR(compiler_lib_search_path, $1)= - -# Source file extension for C++ test sources. -ac_ext=cc - -# Object file extension for compiled C++ test sources. -objext=o -_LT_AC_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;\n" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. -_LT_AC_SYS_COMPILER - -# Allow CC to be a program name with arguments. -lt_save_CC=$CC -lt_save_LD=$LD -lt_save_GCC=$GCC -GCC=$GXX -lt_save_with_gnu_ld=$with_gnu_ld -lt_save_path_LD=$lt_cv_path_LD -if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then - lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx -else - unset lt_cv_prog_gnu_ld -fi -if test -n "${lt_cv_path_LDCXX+set}"; then - lt_cv_path_LD=$lt_cv_path_LDCXX -else - unset lt_cv_path_LD -fi -test -z "${LDCXX+set}" || LD=$LDCXX -CC=${CXX-"c++"} -compiler=$CC -_LT_AC_TAGVAR(compiler, $1)=$CC -cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` - -# We don't want -fno-exception wen compiling C++ code, so set the -# no_builtin_flag separately -if test "$GXX" = yes; then - _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' -else - _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= +if test "$hardcode_action" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless fi -if test "$GXX" = yes; then - # Set up default GNU C++ configuration +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi - AC_PROG_LD +AC_LIBTOOL_DLOPEN_SELF - # Check if GNU C++ uses GNU ld as the underlying linker, since the - # archiving commands below assume that GNU ld is being used. - if test "$with_gnu_ld" = yes; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + AC_CACHE_VAL([lt_cv_archive_cmds_need_lc], + [$rm conftest* + echo 'static int dummy;' > conftest.$ac_ext - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - - # If archive_cmds runs LD, not CC, wlarc should be empty - # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to - # investigate it a little bit more. (MM) - wlarc='${wl}' - - # ancient GNU ld didn't support --whole-archive et. al. - if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ - grep 'no-whole-archive' > /dev/null; then - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + if AC_TRY_EVAL(ac_compile); then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_cv_prog_cc_wl + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if AC_TRY_EVAL(archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$save_allow_undefined_flag else - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= - fi - else - with_gnu_ld=no - wlarc= - - # A generic and very simple default shared library creation - # command for GNU C++ for the case where it uses the native - # linker, instead of GNU ld. If possible, this setting should - # overridden to take advantage of the native linker features on - # the platform it is being used on. - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - fi - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' - -else - GXX=no - with_gnu_ld=no - wlarc= + cat conftest.err 1>&5 + fi]) + AC_MSG_RESULT([$lt_cv_archive_cmds_need_lc]) + ;; + esac fi +need_lc=${lt_cv_archive_cmds_need_lc-yes} -# PORTME: fill in a description of your system's C++ link characteristics -AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) -_LT_AC_TAGVAR(ld_shlibs, $1)=yes -case $host_os in - aix3*) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - aix4* | aix5*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) - for ld_flag in $LDFLAGS; do - case $ld_flag in - *-brtl*) - aix_use_runtimelinking=yes - break - ;; - esac - done - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - _LT_AC_TAGVAR(archive_cmds, $1)='' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - - if test "$GXX" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && \ - strings "$collect2name" | grep resolve_lib_name >/dev/null - then - # We have reworked collect2 - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - else - # We have old collect2 - _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= - fi - esac - shared_flag='-shared' - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - _LT_AC_TAGVAR(always_export_symbols, $1)=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' - # Determine the default libpath from the value encoded in an empty executable. - _LT_AC_SYS_LIBPATH_AIX - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' - _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an empty executable. - _LT_AC_SYS_LIBPATH_AIX - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - # -bexpall does not export symbols beginning with underscore (_) - _LT_AC_TAGVAR(always_export_symbols, $1)=yes - # Exported symbols can be pulled into shared objects from archives - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds it's shared libraries. - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - chorus*) - case $cc_basename in - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - cygwin* | mingw* | pw32*) - # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, - # as there is no search path for DLLs. - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_AC_TAGVAR(always_export_symbols, $1)=no - _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - - if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - darwin* | rhapsody*) - if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - case "$host_os" in - rhapsody* | darwin1.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' - ;; - *) # Darwin 1.3 on - test -z ${LD_TWOLEVEL_NAMESPACE} && _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' - ;; - esac - lt_int_apple_cc_single_mod=no - output_verbose_link_cmd='echo' - if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then - lt_int_apple_cc_single_mod=yes - fi - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - fi - _LT_AC_TAGVAR(module_cmds, $1)='$CC -bundle ${wl}-bind_at_load $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags' - - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -bundle $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_automatic, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - fi - ;; - - dgux*) - case $cc_basename in - ec++) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - ghcx) - # Green Hills C++ Compiler - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - freebsd[12]*) - # C++ shared libraries reported to be fairly broken before switch to ELF - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - freebsd-elf*) - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - ;; - freebsd*) - # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF - # conventions - _LT_AC_TAGVAR(ld_shlibs, $1)=yes - ;; - gnu*) - ;; - hpux9*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, - # but as the default - # location of the library. - - case $cc_basename in - CC) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - aCC) - _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | egrep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes; then - _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - hpux10*|hpux11*) - if test $with_gnu_ld = no; then - case "$host_cpu" in - hppa*64*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - ia64*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - ;; - *) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - ;; - esac - fi - case "$host_cpu" in - hppa*64*) - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - ia64*) - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - *) - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - esac - - case $cc_basename in - CC) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - aCC) - case "$host_cpu" in - hppa*64*|ia64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' - ;; - *) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes; then - if test $with_gnu_ld = no; then - case "$host_cpu" in - ia64*|hppa*64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' - ;; - *) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - fi - else - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - irix5* | irix6*) - case $cc_basename in - CC) - # SGI C++ - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' - - # Archives containing C++ object files must be created using - # "CC -ar", where "CC" is the IRIX C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' - ;; - *) - if test "$GXX" = yes; then - if test "$with_gnu_ld" = no; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' - fi - fi - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - ;; - esac - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - linux*) - case $cc_basename in - KCC) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' - ;; - icpc) - # Intel C++ - with_gnu_ld=yes - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - ;; - cxx) - # Compaq C++ - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' - - runpath_var=LD_RUN_PATH - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - esac - ;; - lynxos*) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - m88k*) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - mvs*) - case $cc_basename in - cxx) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' - wlarc= - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - fi - # Workaround some broken pre-1.5 toolchains - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' - ;; - osf3*) - case $cc_basename in - KCC) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' - - ;; - RCC) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - cxx) - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' - - else - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - osf4* | osf5*) - case $cc_basename in - KCC) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Archives containing C++ object files must be created using - # the KAI C++ compiler. - _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' - ;; - RCC) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - cxx) - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ - echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ - $rm $lib.exp' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' - - else - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - psos*) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - sco*) - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - case $cc_basename in - CC) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC) - # Sun C++ 4.x - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - lcc) - # Lucid - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - solaris*) - case $cc_basename in - CC) - # Sun C++ 4.2, 5.x and Centerline C++ - _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The C++ compiler is used as linker so we must use $wl - # flag to pass the commands to the underlying system - # linker. - # Supported since Solaris 2.6 (maybe 2.5.1?) - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - ;; - esac - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[[LR]]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' - ;; - gcx) - # Green Hills C++ Compiler - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - - # The C++ compiler must be used to create the archive. - _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' - ;; - *) - # GNU C++ compiler with Solaris linker - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' - if $CC --version | grep -v '^2\.7' > /dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" - else - # g++ 2.7 appears to require `-G' NOT `-shared' on this - # platform. - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" - fi - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' - fi - ;; - esac - ;; - sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - ;; - tandem*) - case $cc_basename in - NCC) - # NonStop-UX NCC 3.20 - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - vxworks*) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; -esac -AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) -test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no - -_LT_AC_TAGVAR(GCC, $1)="$GXX" -_LT_AC_TAGVAR(LD, $1)="$LD" - -AC_LIBTOOL_POSTDEP_PREDEP($1) -AC_LIBTOOL_PROG_COMPILER_PIC($1) -AC_LIBTOOL_PROG_CC_C_O($1) -AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) -AC_LIBTOOL_PROG_LD_SHLIBS($1) -AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) -AC_LIBTOOL_SYS_LIB_STRIP -AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) -AC_LIBTOOL_DLOPEN_SELF($1) - -AC_LIBTOOL_CONFIG($1) - -AC_LANG_POP -CC=$lt_save_CC -LDCXX=$LD -LD=$lt_save_LD -GCC=$lt_save_GCC -with_gnu_ldcxx=$with_gnu_ld -with_gnu_ld=$lt_save_with_gnu_ld -lt_cv_path_LDCXX=$lt_cv_path_LD -lt_cv_path_LD=$lt_save_path_LD -lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld -lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld -])# AC_LIBTOOL_LANG_CXX_CONFIG - -# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) -# ------------------------ -# Figure out "hidden" library dependencies from verbose -# compiler output when linking a shared library. -# Parse the compiler output and extract the necessary -# objects, libraries and library flags. -AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[ -dnl we can't use the lt_simple_compile_test_code here, -dnl because it contains code intended for an executable, -dnl not a library. It's possible we should let each -dnl tag define a new lt_????_link_test_code variable, -dnl but it's only used here... -ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < "${ofile}T" +#! $SHELL -ifelse([$1], [], - [cfgfile="${ofile}T" - trap "$rm \"$cfgfile\"; exit 1" 1 2 15 - $rm -f "$cfgfile" - AC_MSG_NOTICE([creating $ofile])], - [cfgfile="$ofile"]) - - cat <<__EOF__ >> "$cfgfile" -ifelse([$1], [], -[#! $SHELL - -# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) # NOTE: Changes made to this file will be lost: look at ltmain.sh. # -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. -# -# This file is part of GNU Libtool: +# Copyright (C) 1996-2000 Free Software Foundation, Inc. # Originally by Gordon Matzigkeit , 1996 # # This program is free software; you can redistribute it and/or modify @@ -3926,21 +2503,17 @@ ifelse([$1], [], # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. -# A sed program that does not truncate output. +# A sed that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="$SED -e s/^X//" +Xsed="${SED} -e s/^X//" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi -# The names of the tagged configurations supported by this script. -available_tags= - -# ### BEGIN LIBTOOL CONFIG], -[# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) +# ### BEGIN LIBTOOL CONFIG # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: @@ -3954,10 +2527,7 @@ build_libtool_libs=$enable_shared build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) - -# Whether or not to disallow shared libs when runtime libs are static -allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) +build_libtool_need_lc=$need_lc # Whether or not to optimize for fast installation. fast_install=$enable_fast_install @@ -3973,20 +2543,14 @@ echo=$lt_echo AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS -# A C compiler. -LTCC=$lt_LTCC - -# A language-specific compiler. -CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) +# The default C compiler. +CC=$lt_CC # Is the compiler the GNU C compiler? -with_gcc=$_LT_AC_TAGVAR(GCC, $1) - -# An ERE matcher. -EGREP=$lt_EGREP +with_gcc=$GCC # The linker used to build libraries. -LD=$lt_[]_LT_AC_TAGVAR(LD, $1) +LD=$lt_LD # Whether we need hard or soft links. LN_S=$lt_LN_S @@ -4017,7 +2581,7 @@ reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. -wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) +wl=$lt_wl # Object file suffix (normally "o"). objext="$ac_objext" @@ -4025,21 +2589,18 @@ objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" -# Shared library suffix (normally ".so"). -shrext='$shrext' - # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. -pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) +pic_flag=$lt_pic_flag pic_mode=$pic_mode -# What is the maximum length of a command? -max_cmd_len=$lt_cv_sys_max_cmd_len - # Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) +compiler_c_o=$lt_compiler_c_o + +# Can we write directly to a .lo ? +compiler_o_lo=$lt_compiler_o_lo # Must we lock files when doing compilation ? need_locks=$lt_need_locks @@ -4060,19 +2621,19 @@ dlopen_self=$enable_dlopen_self dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. -link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) +link_static_flag=$lt_link_static_flag # Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) +no_builtin_flag=$lt_no_builtin_flag # Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) +whole_archive_flag_spec=$lt_whole_archive_flag_spec # Compiler flag to generate thread-safe objects. -thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) +thread_safe_flag_spec=$lt_thread_safe_flag_spec # Library versioning type. version_type=$version_type @@ -4089,50 +2650,26 @@ soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB -old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) +old_archive_cmds=$lt_old_archive_cmds old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build and install a shared archive. -archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) -archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds -# Commands used to build a loadable module (assumed same as above if empty) -module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) -module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) - # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib -# Dependencies to place before the objects being linked to create a -# shared library. -predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) - -# Dependencies to place after the objects being linked to create a -# shared library. -postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) - -# Dependencies to place before the objects being linked to create a -# shared library. -predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) - -# Dependencies to place after the objects being linked to create a -# shared library. -postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) - # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method @@ -4140,10 +2677,10 @@ deplibs_check_method=$lt_deplibs_check_method file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) +allow_undefined_flag=$lt_allow_undefined_flag # Flag that forces no undefined symbols. -no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) +no_undefined_flag=$lt_no_undefined_flag # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds @@ -4152,13 +2689,13 @@ finish_cmds=$lt_finish_cmds finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe +global_symbol_pipe=$lt_global_symbol_pipe # Transform the output of nm in a proper C declaration -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl +global_symbol_to_cdecl=$lt_global_symbol_to_cdecl # Transform the output of nm in a C name address pair -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address +global_symbol_to_c_name_address=$lt_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var @@ -4170,45 +2707,36 @@ shlibpath_var=$shlibpath_var shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. -hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) +hardcode_action=$hardcode_action # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. -hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) - -# If ld is used when linking, flag to hardcode \$libdir into -# a binary during linking. This must work even if \$libdir does -# not exist. -hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single -rpath flag with a separated argument. -hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) +hardcode_libdir_separator=$lt_hardcode_libdir_separator -# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the # resulting binary. -hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) +hardcode_direct=$hardcode_direct # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. -hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) +hardcode_minus_L=$hardcode_minus_L # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. -hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) - -# Set to yes if building a shared library automatically hardcodes DIR into the library -# and all subsequent libraries and executables linked against it. -hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) +hardcode_shlibpath_var=$hardcode_shlibpath_var # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) +link_all_deplibs=$link_all_deplibs # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec @@ -4217,33 +2745,30 @@ sys_lib_search_path_spec=$lt_sys_lib_search_path_spec sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. -fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" +fix_srcfile_path="$fix_srcfile_path" # Set to yes if exported symbols are required. -always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) +always_export_symbols=$always_export_symbols # The commands to list exported symbols. -export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) +export_symbols_cmds=$lt_export_symbols_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) +exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. -include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) +include_expsyms=$lt_include_expsyms -ifelse([$1],[], -[# ### END LIBTOOL CONFIG], -[# ### END LIBTOOL TAG CONFIG: $tagname]) +# ### END LIBTOOL CONFIG __EOF__ -ifelse([$1],[], [ case $host_os in aix3*) - cat <<\EOF >> "$cfgfile" + cat <<\EOF >> "${ofile}T" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems @@ -4256,1493 +2781,11 @@ EOF ;; esac - # We use sed instead of cat because bash on DJGPP gets confused if - # if finds mixed CR/LF and LF-only lines. Since sed operates in - # text mode, it properly converts lines to CR/LF. This bash problem - # is reportedly fixed, but why not run on old versions too? - sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) - - mv -f "$cfgfile" "$ofile" || \ - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" -]) -else - # If there is no Makefile yet, we rely on a make rule to execute - # `config.status --recheck' to rerun these tests and create the - # libtool script then. - test -f Makefile && make "$ltmain" -fi -])# AC_LIBTOOL_CONFIG - - -# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) -# ------------------------------------------- -AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], -[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl - -_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= - -if test "$GCC" = yes; then - _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' - - AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], - lt_cv_prog_compiler_rtti_exceptions, - [-fno-rtti -fno-exceptions], [], - [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) -fi -])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI - - -# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE -# --------------------------------- -AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], -[AC_REQUIRE([AC_CANONICAL_HOST]) -AC_REQUIRE([AC_PROG_NM]) -AC_REQUIRE([AC_OBJEXT]) -# Check for command to grab the raw symbol name followed by C symbol from nm. -AC_MSG_CHECKING([command to parse $NM output from $compiler object]) -AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], -[ -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] - -# Character class describing NM global symbol codes. -symcode='[[BCDEGRST]]' - -# Regexp to match symbols that can be accessed directly from C. -sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' - -# Transform the above into a raw symbol and a C symbol. -symxfrm='\1 \2\3 \3' - -# Transform an extracted symbol line into a proper C declaration -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" - -# Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[[BCDT]]' - ;; -cygwin* | mingw* | pw32*) - symcode='[[ABCDGISTW]]' - ;; -hpux*) # Its linker distinguishes data from code symbols - if test "$host_cpu" = ia64; then - symcode='[[ABCDEGRST]]' - fi - lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" - lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" - ;; -irix* | nonstopux*) - symcode='[[BCDEGRST]]' - ;; -osf*) - symcode='[[BCDEGQRST]]' - ;; -solaris* | sysv5*) - symcode='[[BDT]]' - ;; -sysv4) - symcode='[[DFNSTU]]' - ;; -esac - -# Handle CRLF in mingw tool chain -opt_cr= -case $build_os in -mingw*) - opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; -esac - -# If we're using GNU nm, then use its standard symbol codes. -case `$NM -V 2>&1` in -*GNU* | *'with BFD'*) - symcode='[[ABCDGISTW]]' ;; -esac - -# Try without a prefix undercore, then with it. -for ac_symprfx in "" "_"; do - - # Write the raw and C identifiers. - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" - - # Check to see that the pipe works correctly. - pipe_works=no - - rm -f conftest* - cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - - # Make sure that we snagged all the symbols we need. - if grep ' nm_test_var$' "$nlist" >/dev/null; then - if grep ' nm_test_func$' "$nlist" >/dev/null; then - cat < conftest.$ac_ext -#ifdef __cplusplus -extern "C" { -#endif - -EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' - - cat <> conftest.$ac_ext -#if defined (__STDC__) && __STDC__ -# define lt_ptr_t void * -#else -# define lt_ptr_t char * -# define const -#endif - -/* The mapping between symbol names and symbols. */ -const struct { - const char *name; - lt_ptr_t address; -} -lt_preloaded_symbols[[]] = -{ -EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext - cat <<\EOF >> conftest.$ac_ext - {0, (lt_ptr_t) 0} -}; - -#ifdef __cplusplus -} -#endif -EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - lt_save_LIBS="$LIBS" - lt_save_CFLAGS="$CFLAGS" - LIBS="conftstm.$ac_objext" - CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" - if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then - pipe_works=yes - fi - LIBS="$lt_save_LIBS" - CFLAGS="$lt_save_CFLAGS" - else - echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD - fi - else - echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD - fi - else - echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD - fi - else - echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD - cat conftest.$ac_ext >&5 - fi - rm -f conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then - break - else - lt_cv_sys_global_symbol_pipe= - fi -done -]) -if test -z "$lt_cv_sys_global_symbol_pipe"; then - lt_cv_sys_global_symbol_to_cdecl= -fi -if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - AC_MSG_RESULT(failed) -else - AC_MSG_RESULT(ok) -fi -]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE - - -# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) -# --------------------------------------- -AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], -[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= -_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= -_LT_AC_TAGVAR(lt_prog_compiler_static, $1)= - -AC_MSG_CHECKING([for $compiler option to produce PIC]) - ifelse([$1],[CXX],[ - # C++ specific cases for pic, static, wl, etc. - if test "$GXX" = yes; then - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - amigaos*) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' - ;; - beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - mingw* | os2* | pw32*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' - ;; - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' - ;; - *djgpp*) - # DJGPP does not support shared libraries at all - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= - ;; - sysv4*MP*) - if test -d /usr/nec; then - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic - fi - ;; - hpux*) - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case "$host_cpu" in - hppa*64*|ia64*) - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - else - case $host_os in - aix4* | aix5*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - else - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' - fi - ;; - chorus*) - case $cc_basename in - cxch68) - # Green Hills C++ Compiler - # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" - ;; - esac - ;; - dgux*) - case $cc_basename in - ec++) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - ;; - ghcx) - # Green Hills C++ Compiler - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - *) - ;; - esac - ;; - freebsd*) - # FreeBSD uses GNU C++ - ;; - hpux9* | hpux10* | hpux11*) - case $cc_basename in - CC) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" - if test "$host_cpu" != ia64; then - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - fi - ;; - aCC) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" - case "$host_cpu" in - hppa*64*|ia64*) - # +Z the default - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - ;; - esac - ;; - *) - ;; - esac - ;; - irix5* | irix6* | nonstopux*) - case $cc_basename in - CC) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - # CC pic flag -KPIC is the default. - ;; - *) - ;; - esac - ;; - linux*) - case $cc_basename in - KCC) - # KAI C++ Compiler - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - icpc) - # Intel C++ - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - cxx) - # Compaq C++ - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - *) - ;; - esac - ;; - lynxos*) - ;; - m88k*) - ;; - mvs*) - case $cc_basename in - cxx) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' - ;; - *) - ;; - esac - ;; - netbsd*) - ;; - osf3* | osf4* | osf5*) - case $cc_basename in - KCC) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' - ;; - RCC) - # Rational C++ 2.4.1 - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - cxx) - # Digital/Compaq C++ - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - *) - ;; - esac - ;; - psos*) - ;; - sco*) - case $cc_basename in - CC) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - *) - ;; - esac - ;; - solaris*) - case $cc_basename in - CC) - # Sun C++ 4.2, 5.x and Centerline C++ - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - ;; - gcx) - # Green Hills C++ Compiler - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - ;; - *) - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC) - # Sun C++ 4.x - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - lcc) - # Lucid - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - *) - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC) - # NonStop-UX NCC 3.20 - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - ;; - *) - ;; - esac - ;; - unixware*) - ;; - vxworks*) - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - esac - fi -], -[ - if test "$GCC" = yes; then - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - - amigaos*) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' - ;; - - beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - enable_shared=no - ;; - - sysv4*MP*) - if test -d /usr/nec; then - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic - fi - ;; - - hpux*) - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case "$host_cpu" in - hppa*64*|ia64*) - # +Z the default - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - ;; - - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - else - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' - fi - ;; - - mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' - ;; - - hpux9* | hpux10* | hpux11*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case "$host_cpu" in - hppa*64*|ia64*) - # +Z the default - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # PIC (with -KPIC) is the default. - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - newsos6) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - linux*) - case $CC in - icc|ecc) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - ccc) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # All Alpha code is PIC. - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - esac - ;; - - osf3* | osf4* | osf5*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # All OSF/1 code is PIC. - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - sco3.2v5*) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn' - ;; - - solaris*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - sunos4*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - - uts4*) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - *) - _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - esac - fi -]) -AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then - AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], - _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), - [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], - [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in - "" | " "*) ;; - *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; - esac], - [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) -fi -case "$host_os" in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" - ;; -esac -]) - - -# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) -# ------------------------------------ -# See if the linker supports building shared libraries. -AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], -[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) -ifelse([$1],[CXX],[ - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in - aix4* | aix5*) - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - if $NM -V 2>&1 | grep 'GNU' > /dev/null; then - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' - else - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' - fi - ;; - pw32*) - _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" - ;; - cygwin* | mingw*) - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' - ;; - *) - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; - esac -],[ - runpath_var= - _LT_AC_TAGVAR(allow_undefined_flag, $1)= - _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no - _LT_AC_TAGVAR(archive_cmds, $1)= - _LT_AC_TAGVAR(archive_expsym_cmds, $1)= - _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= - _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= - _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_minus_L, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown - _LT_AC_TAGVAR(hardcode_automatic, $1)=no - _LT_AC_TAGVAR(module_cmds, $1)= - _LT_AC_TAGVAR(module_expsym_cmds, $1)= - _LT_AC_TAGVAR(always_export_symbols, $1)=no - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - _LT_AC_TAGVAR(include_expsyms, $1)= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. - _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - extract_expsyms_cmds= - - case $host_os in - cygwin* | mingw* | pw32*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - openbsd*) - with_gnu_ld=no - ;; - esac - - _LT_AC_TAGVAR(ld_shlibs, $1)=yes - if test "$with_gnu_ld" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # See if GNU ld supports shared libraries. - case $host_os in - aix3* | aix4* | aix5*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - _LT_AC_TAGVAR(ld_shlibs, $1)=no - cat <&2 - -*** Warning: the GNU linker, at least up to release 2.9.1, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to modify your PATH -*** so that a non-GNU linker is found, and then restart. - -EOF - fi - ;; - - amigaos*) - _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - - # Samuel A. Falvo II reports - # that the semantics of dynamic libraries on AmigaOS, at least up - # to version 4, is to share data among multiple programs linked - # with the same dynamic library. Since this doesn't match the - # behavior of shared libraries on other platforms, we can't use - # them. - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - - beos*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - cygwin* | mingw* | pw32*) - # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, - # as there is no search path for DLLs. - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_AC_TAGVAR(always_export_symbols, $1)=no - _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' - - if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - else - ld_shlibs=no - fi - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris* | sysv5*) - if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then - _LT_AC_TAGVAR(ld_shlibs, $1)=no - cat <&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -EOF - elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - sunos4*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - - if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then - runpath_var=LD_RUN_PATH - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= - fi - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_AC_TAGVAR(always_export_symbols, $1)=yes - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - if test "$GCC" = yes && test -z "$link_static_flag"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported - fi - ;; - - aix4* | aix5*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - if $NM -V 2>&1 | grep 'GNU' > /dev/null; then - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' - else - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - _LT_AC_TAGVAR(archive_cmds, $1)='' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - - if test "$GCC" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && \ - strings "$collect2name" | grep resolve_lib_name >/dev/null - then - # We have reworked collect2 - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - else - # We have old collect2 - _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= - fi - esac - shared_flag='-shared' - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - _LT_AC_TAGVAR(always_export_symbols, $1)=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' - # Determine the default libpath from the value encoded in an empty executable. - _LT_AC_SYS_LIBPATH_AIX - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' - _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an empty executable. - _LT_AC_SYS_LIBPATH_AIX - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - # -bexpall does not export symbols beginning with underscore (_) - _LT_AC_TAGVAR(always_export_symbols, $1)=yes - # Exported symbols can be pulled into shared objects from archives - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds it's shared libraries. - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - # see comment about different semantics on the GNU ld section - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - - bsdi4*) - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic - ;; - - cygwin* | mingw* | pw32*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' - _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext=".dll" - # FIXME: Setting linknames here is a bad hack. - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' - # FIXME: Should let the user specify the lib program. - _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' - fix_srcfile_path='`cygpath -w "$srcfile"`' - _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - ;; - - darwin* | rhapsody*) - if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - case "$host_os" in - rhapsody* | darwin1.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' - ;; - *) # Darwin 1.3 on - test -z ${LD_TWOLEVEL_NAMESPACE} && _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' - ;; - esac - # FIXME: Relying on posixy $() will cause problems for - # cross-compilation, but unfortunately the echo tests do not - # yet detect zsh echo's removal of \ escapes. Also zsh mangles - # `"' quotes if we put them in here... so don't! - lt_int_apple_cc_single_mod=no - output_verbose_link_cmd='echo' - if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then - lt_int_apple_cc_single_mod=yes - fi - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - fi - _LT_AC_TAGVAR(module_cmds, $1)='$CC -bundle ${wl}-bind_at_load $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -bundle $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_automatic, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - fi - ;; - - dgux*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - freebsd1*) - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd*) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - hpux9*) - if test "$GCC" = yes; then - _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - fi - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - ;; - - hpux10* | hpux11*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then - case "$host_cpu" in - hppa*64*|ia64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case "$host_cpu" in - hppa*64*|ia64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' - ;; - *) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - ;; - esac - fi - if test "$with_gnu_ld" = no; then - case "$host_cpu" in - hppa*64*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - ia64*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - ;; - *) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' - fi - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - newsos6) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - openbsd*) - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - else - case $host_os in - openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - ;; - *) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - ;; - esac - fi - ;; - - os2*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - fi - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - else - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ - $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' - - # Both c and cxx compiler support -rpath directly - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - fi - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - - sco3.2v5*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ;; - - solaris*) - _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' - if test "$GCC" = yes; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - fi - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) # Supported since Solaris 2.6 (maybe 2.5.1?) - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; - esac - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - sysv4) - case $host_vendor in - sni) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' - _LT_AC_TAGVAR(hardcode_direct, $1)=no - ;; - motorola) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - sysv4.3*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - _LT_AC_TAGVAR(ld_shlibs, $1)=yes - fi - ;; - - sysv4.2uw2*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_minus_L, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - hardcode_runpath_var=yes - runpath_var=LD_RUN_PATH - ;; - - sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) - _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text' - if test "$GCC" = yes; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - runpath_var='LD_RUN_PATH' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - sysv5*) - _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' - # $CC -shared without GNU ld will not create a library from C++ - # object files and a static libstdc++, better avoid it by now - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var='LD_RUN_PATH' - ;; - - uts4*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *) - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - fi -]) -AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) -test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -# -# Do we need to explicitly link libc? -# -case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in -x|xyes) - # Assume -lc should be added - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $_LT_AC_TAGVAR(archive_cmds, $1) in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - AC_MSG_CHECKING([whether -lc should be explicitly linked in]) - $rm conftest* - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - if AC_TRY_EVAL(ac_compile) 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) - _LT_AC_TAGVAR(allow_undefined_flag, $1)= - if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) - then - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - else - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes - fi - _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $rm conftest* - AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) - ;; - esac - fi - ;; -esac -])# AC_LIBTOOL_PROG_LD_SHLIBS - - -# _LT_AC_FILE_LTDLL_C -# ------------------- -# Be careful that the start marker always follows a newline. -AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ + cygwin* | mingw* | pw32* | os2*) + cat <<'EOF' >> "${ofile}T" + # This is a source program that is used to create dlls on Windows + # Don't remove nor modify the starting and closing comments # /* ltdll.c starts here */ # #define WIN32_LEAN_AND_MEAN # #include @@ -5776,13 +2819,748 @@ AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ # return TRUE; # } # /* ltdll.c ends here */ -])# _LT_AC_FILE_LTDLL_C + # This is a source program that is used to create import libraries + # on Windows for dlls which lack them. Don't remove nor modify the + # starting and closing comments +# /* impgen.c starts here */ +# /* Copyright (C) 1999-2000 Free Software Foundation, Inc. +# +# This file is part of GNU libtool. +# +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# */ +# +# #include /* for printf() */ +# #include /* for open(), lseek(), read() */ +# #include /* for O_RDONLY, O_BINARY */ +# #include /* for strdup() */ +# +# /* O_BINARY isn't required (or even defined sometimes) under Unix */ +# #ifndef O_BINARY +# #define O_BINARY 0 +# #endif +# +# static unsigned int +# pe_get16 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[2]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 2); +# return b[0] + (b[1]<<8); +# } +# +# static unsigned int +# pe_get32 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[4]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 4); +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# static unsigned int +# pe_as32 (ptr) +# void *ptr; +# { +# unsigned char *b = ptr; +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# int +# main (argc, argv) +# int argc; +# char *argv[]; +# { +# int dll; +# unsigned long pe_header_offset, opthdr_ofs, num_entries, i; +# unsigned long export_rva, export_size, nsections, secptr, expptr; +# unsigned long name_rvas, nexp; +# unsigned char *expdata, *erva; +# char *filename, *dll_name; +# +# filename = argv[1]; +# +# dll = open(filename, O_RDONLY|O_BINARY); +# if (dll < 1) +# return 1; +# +# dll_name = filename; +# +# for (i=0; filename[i]; i++) +# if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':') +# dll_name = filename + i +1; +# +# pe_header_offset = pe_get32 (dll, 0x3c); +# opthdr_ofs = pe_header_offset + 4 + 20; +# num_entries = pe_get32 (dll, opthdr_ofs + 92); +# +# if (num_entries < 1) /* no exports */ +# return 1; +# +# export_rva = pe_get32 (dll, opthdr_ofs + 96); +# export_size = pe_get32 (dll, opthdr_ofs + 100); +# nsections = pe_get16 (dll, pe_header_offset + 4 +2); +# secptr = (pe_header_offset + 4 + 20 + +# pe_get16 (dll, pe_header_offset + 4 + 16)); +# +# expptr = 0; +# for (i = 0; i < nsections; i++) +# { +# char sname[8]; +# unsigned long secptr1 = secptr + 40 * i; +# unsigned long vaddr = pe_get32 (dll, secptr1 + 12); +# unsigned long vsize = pe_get32 (dll, secptr1 + 16); +# unsigned long fptr = pe_get32 (dll, secptr1 + 20); +# lseek(dll, secptr1, SEEK_SET); +# read(dll, sname, 8); +# if (vaddr <= export_rva && vaddr+vsize > export_rva) +# { +# expptr = fptr + (export_rva - vaddr); +# if (export_rva + export_size > vaddr + vsize) +# export_size = vsize - (export_rva - vaddr); +# break; +# } +# } +# +# expdata = (unsigned char*)malloc(export_size); +# lseek (dll, expptr, SEEK_SET); +# read (dll, expdata, export_size); +# erva = expdata - export_rva; +# +# nexp = pe_as32 (expdata+24); +# name_rvas = pe_as32 (expdata+32); +# +# printf ("EXPORTS\n"); +# for (i = 0; i> "${ofile}T" || (rm -f "${ofile}T"; exit 1) + + mv -f "${ofile}T" "$ofile" || \ + (rm -f "$ofile" && cp "${ofile}T" "$ofile" && rm -f "${ofile}T") + chmod +x "$ofile" +fi + +])# _LT_AC_LTCONFIG_HACK + +# AC_LIBTOOL_DLOPEN - enable checks for dlopen support +AC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])]) + +# AC_LIBTOOL_WIN32_DLL - declare package support for building win32 dll's +AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])]) + +# AC_ENABLE_SHARED - implement the --enable-shared flag +# Usage: AC_ENABLE_SHARED[(DEFAULT)] +# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +# `yes'. +AC_DEFUN([AC_ENABLE_SHARED], +[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE(shared, +changequote(<<, >>)dnl +<< --enable-shared[=PKGS] build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT], +changequote([, ])dnl +[p=${PACKAGE-default} +case $enableval in +yes) enable_shared=yes ;; +no) enable_shared=no ;; +*) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac], +enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl +]) + +# AC_DISABLE_SHARED - set the default shared flag to --disable-shared +AC_DEFUN([AC_DISABLE_SHARED], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no)]) + +# AC_ENABLE_STATIC - implement the --enable-static flag +# Usage: AC_ENABLE_STATIC[(DEFAULT)] +# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +# `yes'. +AC_DEFUN([AC_ENABLE_STATIC], +[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE(static, +changequote(<<, >>)dnl +<< --enable-static[=PKGS] build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT], +changequote([, ])dnl +[p=${PACKAGE-default} +case $enableval in +yes) enable_static=yes ;; +no) enable_static=no ;; +*) + enable_static=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac], +enable_static=AC_ENABLE_STATIC_DEFAULT)dnl +]) + +# AC_DISABLE_STATIC - set the default static flag to --disable-static +AC_DEFUN([AC_DISABLE_STATIC], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no)]) -# _LT_AC_TAGVAR(VARNAME, [TAGNAME]) -# --------------------------------- -AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) +# AC_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag +# Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)] +# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +# `yes'. +AC_DEFUN([AC_ENABLE_FAST_INSTALL], +[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE(fast-install, +changequote(<<, >>)dnl +<< --enable-fast-install[=PKGS] optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT], +changequote([, ])dnl +[p=${PACKAGE-default} +case $enableval in +yes) enable_fast_install=yes ;; +no) enable_fast_install=no ;; +*) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac], +enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl +]) +# AC_DISABLE_FAST_INSTALL - set the default to --disable-fast-install +AC_DEFUN([AC_DISABLE_FAST_INSTALL], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no)]) + +# AC_LIBTOOL_PICMODE - implement the --with-pic flag +# Usage: AC_LIBTOOL_PICMODE[(MODE)] +# Where MODE is either `yes' or `no'. If omitted, it defaults to +# `both'. +AC_DEFUN([AC_LIBTOOL_PICMODE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +pic_mode=ifelse($#,1,$1,default)]) + + +# AC_PATH_TOOL_PREFIX - find a file program which can recognise shared library +AC_DEFUN([AC_PATH_TOOL_PREFIX], +[AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in + /*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; + ?:/*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path. + ;; + *) + ac_save_MAGIC_CMD="$MAGIC_CMD" + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="ifelse([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + egrep "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$ac_save_ifs" + MAGIC_CMD="$ac_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +]) + + +# AC_PATH_MAGIC - find a file program which can recognise a shared library +AC_DEFUN([AC_PATH_MAGIC], +[AC_REQUIRE([AC_CHECK_TOOL_PREFIX])dnl +AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin:$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + AC_PATH_TOOL_PREFIX(file, /usr/bin:$PATH) + else + MAGIC_CMD=: + fi +fi +]) + + +# AC_PROG_LD - find the path to the GNU or non-GNU linker +AC_DEFUN([AC_PROG_LD], +[AC_ARG_WITH(gnu-ld, +[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], +test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR])dnl +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by GCC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | [[A-Za-z]]:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$lt_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" +else + lt_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$lt_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT($LD) +else + AC_MSG_RESULT(no) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_PROG_LD_GNU +]) + +# AC_PROG_LD_GNU - +AC_DEFUN([AC_PROG_LD_GNU], +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + lt_cv_prog_gnu_ld=yes +else + lt_cv_prog_gnu_ld=no +fi]) +with_gnu_ld=$lt_cv_prog_gnu_ld +]) + +# AC_PROG_LD_RELOAD_FLAG - find reload flag for linker +# -- PORTME Some linkers may need a different reload flag. +AC_DEFUN([AC_PROG_LD_RELOAD_FLAG], +[AC_CACHE_CHECK([for $LD option to reload object files], lt_cv_ld_reload_flag, +[lt_cv_ld_reload_flag='-r']) +reload_flag=$lt_cv_ld_reload_flag +test -n "$reload_flag" && reload_flag=" $reload_flag" +]) + +# AC_DEPLIBS_CHECK_METHOD - how to check for library dependencies +# -- PORTME fill in with the dynamic library characteristics +AC_DEFUN([AC_DEPLIBS_CHECK_METHOD], +[AC_CACHE_CHECK([how to recognise dependent libraries], +lt_cv_deplibs_check_method, +[lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given egrep regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix4* | aix5*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi4*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin* | mingw* | pw32*) + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method='file_magic Mach-O dynamically linked shared library' + lt_cv_file_magic_cmd='/usr/bin/file -L' + case "$host_os" in + rhapsody* | darwin1.[[012]]) + lt_cv_file_magic_test_file=`echo /System/Library/Frameworks/System.framework/Versions/*/System | head -1` + ;; + *) # Darwin 1.3 on + lt_cv_file_magic_test_file='/usr/lib/libSystem.dylib' + ;; + esac + ;; + +freebsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20*|hpux11*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + irix5* | nonstopux*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" + ;; + *) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[[1234]] dynamic lib MIPS - version 1" + ;; + esac + lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*` + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux-gnu*) + case $host_cpu in + alpha* | hppa* | i*86 | mips | mipsel | powerpc* | sparc* | ia64*) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; + esac + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/\.]]+\.so\.[[0-9]]+\.[[0-9]]+$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/\.]]+\.so$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +openbsd*) + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object' + else + lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' + fi + ;; + +osf3* | osf4* | osf5*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method='file_magic COFF format alpha shared library' + lt_cv_file_magic_test_file=/shlib/libc.so + lt_cv_deplibs_check_method=pass_all + ;; + +sco3.2v5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + lt_cv_file_magic_test_file=/lib/libc.so + ;; + +sysv5uw[[78]]* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +]) + + +# AC_PROG_NM - find the path to a BSD-compatible name lister +AC_DEFUN([AC_PROG_NM], +[AC_REQUIRE([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR])dnl +AC_MSG_CHECKING([for BSD-compatible nm]) +AC_CACHE_VAL(lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/${ac_tool_prefix}nm + if test -f $tmp_nm || test -f $tmp_nm$ac_exeext ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + if ($tmp_nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep '(/dev/null|Invalid file or object type)' >/dev/null; then + lt_cv_path_NM="$tmp_nm -B" + break + elif ($tmp_nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + lt_cv_path_NM="$tmp_nm -p" + break + else + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + fi + fi + done + IFS="$ac_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi]) +NM="$lt_cv_path_NM" +AC_MSG_RESULT([$NM]) +]) + +# AC_CHECK_LIBM - check for math library +AC_DEFUN([AC_CHECK_LIBM], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32*) + # These system don't have libm + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, main, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, main, LIBM="-lm") + ;; +esac +]) + +# AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for +# the libltdl convenience library and LTDLINCL to the include flags for +# the libltdl header and adds --enable-ltdl-convenience to the +# configure arguments. Note that LIBLTDL and LTDLINCL are not +# AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If DIR is not +# provided, it is assumed to be `libltdl'. LIBLTDL will be prefixed +# with '${top_builddir}/' and LTDLINCL will be prefixed with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and +# top_srcdir appropriately in the Makefiles. +AC_DEFUN([AC_LIBLTDL_CONVENIENCE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +]) + +# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for +# the libltdl installable library and LTDLINCL to the include flags for +# the libltdl header and adds --enable-ltdl-install to the configure +# arguments. Note that LIBLTDL and LTDLINCL are not AC_SUBSTed, nor is +# AC_CONFIG_SUBDIRS called. If DIR is not provided and an installed +# libltdl is not found, it is assumed to be `libltdl'. LIBLTDL will +# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed +# with '${top_srcdir}/' (note the single quotes!). If your package is +# not flat and you're not using automake, define top_builddir and +# top_srcdir appropriately in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN([AC_LIBLTDL_INSTALLABLE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, main, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + LTDLINCL= + fi + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +]) # old names AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) @@ -5796,16 +3574,6 @@ AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) # This is just to silence aclocal about the macro not being used ifelse([AC_DISABLE_FAST_INSTALL]) -AC_DEFUN([LT_AC_PROG_GCJ], -[AC_CHECK_TOOL(GCJ, gcj, no) - test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" - AC_SUBST(GCJFLAGS) -]) - -AC_DEFUN([LT_AC_PROG_RC], -[AC_CHECK_TOOL(RC, windres, no) -]) - # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # @@ -5819,51 +3587,79 @@ AC_DEFUN([LT_AC_PROG_SED], AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. +as_executable_p="test -f" as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for lt_ac_prog in sed gsed; do + for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then - lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + _sed_list="$_sed_list $as_dir/$ac_prog$ac_exec_ext" fi done done done -lt_ac_max=0 -lt_ac_count=0 -# Add /usr/xpg4/bin/sed as it is typically found on Solaris -# along with /bin/sed that truncates output. -for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do - test ! -f $lt_ac_sed && break - cat /dev/null > conftest.in - lt_ac_count=0 - echo $ECHO_N "0123456789$ECHO_C" >conftest.in - # Check for GNU sed and select it if it is found. - if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then - lt_cv_path_SED=$lt_ac_sed - break - fi - while true; do - cat conftest.in conftest.in >conftest.tmp - mv conftest.tmp conftest.in - cp conftest.in conftest.nl - echo >>conftest.nl - $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break - cmp -s conftest.out conftest.nl || break - # 10000 chars as input seems more than enough - test $lt_ac_count -gt 10 && break - lt_ac_count=`expr $lt_ac_count + 1` - if test $lt_ac_count -gt $lt_ac_max; then - lt_ac_max=$lt_ac_count - lt_cv_path_SED=$lt_ac_sed + + # Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. +: ${TMPDIR=/tmp} +{ + tmp=`(umask 077 && mktemp -d -q "$TMPDIR/sedXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=$TMPDIR/sed$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in $TMPDIR" >&2 + { (exit 1); exit 1; } +} + _max=0 + _count=0 + # Add /usr/xpg4/bin/sed as it is typically found on Solaris + # along with /bin/sed that truncates output. + for _sed in $_sed_list /usr/xpg4/bin/sed; do + test ! -f ${_sed} && break + cat /dev/null > "$tmp/sed.in" + _count=0 + echo ${ECHO_N-$ac_n} "0123456789${ECHO_C-$ac_c}" >"$tmp/sed.in" + # Check for GNU sed and select it if it is found. + if "${_sed}" --version 2>&1 < /dev/null | egrep '(GNU)' > /dev/null; then + lt_cv_path_SED=${_sed} + break fi + while true; do + cat "$tmp/sed.in" "$tmp/sed.in" >"$tmp/sed.tmp" + mv "$tmp/sed.tmp" "$tmp/sed.in" + cp "$tmp/sed.in" "$tmp/sed.nl" + echo >>"$tmp/sed.nl" + ${_sed} -e 's/a$//' < "$tmp/sed.nl" >"$tmp/sed.out" || break + cmp -s "$tmp/sed.out" "$tmp/sed.nl" || break + # 40000 chars as input seems more than enough + test $_count -gt 10 && break + _count=`expr $_count + 1` + if test $_count -gt $_max; then + _max=$_count + lt_cv_path_SED=$_sed + fi + done done -done -SED=$lt_cv_path_SED + rm -rf "$tmp" ]) +if test "X$SED" != "X"; then + lt_cv_path_SED=$SED +else + SED=$lt_cv_path_SED +fi AC_MSG_RESULT([$SED]) ]) diff --git a/reactos/lib/freetype/builds/unix/config.guess b/reactos/lib/freetype/builds/unix/config.guess index 193e328202a..78f6b92cd30 100644 --- a/reactos/lib/freetype/builds/unix/config.guess +++ b/reactos/lib/freetype/builds/unix/config.guess @@ -3,7 +3,7 @@ # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003 Free Software Foundation, Inc. -timestamp='2003-10-16' +timestamp='2003-01-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -106,7 +106,6 @@ trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || - { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; @@ -221,9 +220,6 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in mvmeppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; - pegasos:OpenBSD:*:*) - echo powerpc-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; pmax:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; @@ -239,56 +235,74 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:OpenBSD:*:*) echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} exit 0 ;; + *:MicroBSD:*:*) + echo ${UNAME_MACHINE}-unknown-microbsd${UNAME_RELEASE} + exit 0 ;; alpha:OSF1:*:*) if test $UNAME_RELEASE = "V4.0"; then UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` fi - # According to Compaq, /usr/sbin/psrinfo has been available on - # OSF/1 and Tru64 systems produced since 1995. I hope that - # covers most systems running today. This code pipes the CPU - # types through head -n 1, so we only detect the type of CPU 0. - ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` - case "$ALPHA_CPU_TYPE" in - "EV4 (21064)") - UNAME_MACHINE="alpha" ;; - "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; - "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; - "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; - "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; - "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; - "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; - "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; - "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; - "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; - "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; - "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; - "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; - esac # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. + eval $set_cc_for_build + cat <$dummy.s + .data +\$Lformat: + .byte 37,100,45,37,120,10,0 # "%d-%x\n" + + .text + .globl main + .align 4 + .ent main +main: + .frame \$30,16,\$26,0 + ldgp \$29,0(\$27) + .prologue 1 + .long 0x47e03d80 # implver \$0 + lda \$2,-1 + .long 0x47e20c21 # amask \$2,\$1 + lda \$16,\$Lformat + mov \$0,\$17 + not \$1,\$18 + jsr \$26,printf + ldgp \$29,0(\$26) + mov 0,\$16 + jsr \$26,exit + .end main +EOF + $CC_FOR_BUILD -o $dummy $dummy.s 2>/dev/null + if test "$?" = 0 ; then + case `$dummy` in + 0-0) + UNAME_MACHINE="alpha" + ;; + 1-0) + UNAME_MACHINE="alphaev5" + ;; + 1-1) + UNAME_MACHINE="alphaev56" + ;; + 1-101) + UNAME_MACHINE="alphapca56" + ;; + 2-303) + UNAME_MACHINE="alphaev6" + ;; + 2-307) + UNAME_MACHINE="alphaev67" + ;; + 2-1307) + UNAME_MACHINE="alphaev68" + ;; + 3-1307) + UNAME_MACHINE="alphaev7" + ;; + esac + fi echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit 0 ;; - Alpha*:OpenVMS:*:*) - echo alpha-hp-vms - exit 0 ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead @@ -310,9 +324,6 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:OS/390:*:*) echo i370-ibm-openedition exit 0 ;; - *:OS400:*:*) - echo powerpc-ibm-os400 - exit 0 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit 0;; @@ -330,9 +341,6 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit 0 ;; - DRS?6000:unix:4.0:6*) - echo sparc-icl-nx6 - exit 0 ;; DRS?6000:UNIX_SV:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7 && exit 0 ;; @@ -740,7 +748,7 @@ EOF echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; *:UNICOS/mp:*:*) - echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` @@ -748,11 +756,6 @@ EOF FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; - 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` - echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit 0 ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit 0 ;; @@ -774,10 +777,7 @@ EOF #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` - # GNU/KFreeBSD systems have a "k" prefix to indicate we are using - # FreeBSD's kernel, but not the complete OS. - case ${LIBC} in gnu) kernel_only='k' ;; esac - echo ${UNAME_MACHINE}-unknown-${kernel_only}freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} exit 0 ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin @@ -788,8 +788,8 @@ EOF i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit 0 ;; - x86:Interix*:[34]*) - echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' + x86:Interix*:3*) + echo i586-pc-interix3 exit 0 ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks @@ -810,22 +810,14 @@ EOF echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; *:GNU:*:*) - # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit 0 ;; - *:GNU/*:*:*) - # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu - exit 0 ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit 0 ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; - cris:Linux:*:*) - echo cris-axis-linux-gnu - exit 0 ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; @@ -904,9 +896,6 @@ EOF s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit 0 ;; - sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit 0 ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; @@ -964,9 +953,6 @@ EOF LIBC=gnuaout #endif #endif - #ifdef __dietlibc__ - LIBC=dietlibc - #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 @@ -1068,7 +1054,7 @@ EOF exit 0 ;; M68*:*:R3V[567]*:*) test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; - 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0) + 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` @@ -1183,7 +1169,7 @@ EOF *:QNX:*:4*) echo i386-pc-qnx exit 0 ;; - NSR-[DGKLNPTVWY]:NONSTOP_KERNEL:*:*) + NSR-[DGKLNPTVW]:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit 0 ;; *:NonStop-UX:*:*) @@ -1224,9 +1210,6 @@ EOF *:ITS:*:*) echo pdp10-unknown-its exit 0 ;; - SEI:*:*:SEIUX) - echo mips-sei-seiux${UNAME_RELEASE} - exit 0 ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 diff --git a/reactos/lib/freetype/builds/unix/config.sub b/reactos/lib/freetype/builds/unix/config.sub index e1e455b776e..04baf3d80d1 100644 --- a/reactos/lib/freetype/builds/unix/config.sub +++ b/reactos/lib/freetype/builds/unix/config.sub @@ -3,7 +3,7 @@ # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003 Free Software Foundation, Inc. -timestamp='2003-11-03' +timestamp='2003-01-03' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software @@ -118,8 +118,7 @@ esac # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in - nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ - kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; @@ -229,14 +228,13 @@ case $basic_machine in | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ - | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ - | c4x | clipper \ + | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ - | ip2k | iq2000 \ + | ip2k \ | m32r | m68000 | m68k | m88k | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ @@ -249,7 +247,6 @@ case $basic_machine in | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ @@ -260,11 +257,11 @@ case $basic_machine in | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ - | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ + | sh | sh[1234] | sh3e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ | strongarm \ - | tahoe | thumb | tic4x | tic80 | tron \ + | tahoe | thumb | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xscale | xstormy16 | xtensa \ @@ -299,7 +296,7 @@ case $basic_machine in | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* \ | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* \ | clipper-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ @@ -307,7 +304,7 @@ case $basic_machine in | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ - | ip2k-* | iq2000-* \ + | ip2k-* \ | m32r-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | mcore-* \ @@ -322,7 +319,6 @@ case $basic_machine in | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ - | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ @@ -333,13 +329,11 @@ case $basic_machine in | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ - | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ + | sh-* | sh[1234]-* | sh3e-* | sh[34]eb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ - | tahoe-* | thumb-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ - | tron-* \ + | tahoe-* | thumb-* | tic30-* | tic4x-* | tic54x-* | tic80-* | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ @@ -377,9 +371,6 @@ case $basic_machine in basic_machine=a29k-none os=-bsd ;; - amd64) - basic_machine=x86_64-pc - ;; amdahl) basic_machine=580-amdahl os=-sysv @@ -744,10 +735,6 @@ case $basic_machine in basic_machine=or32-unknown os=-coff ;; - os400) - basic_machine=powerpc-ibm - os=-os400 - ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose @@ -779,24 +766,18 @@ case $basic_machine in pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; - pentiumii | pentium2 | pentiumiii | pentium3) + pentiumii | pentium2) basic_machine=i686-pc ;; - pentium4) - basic_machine=i786-pc - ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; - pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + pentiumii-* | pentium2-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; - pentium4-*) - basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; pn) basic_machine=pn-gould ;; @@ -855,10 +836,6 @@ case $basic_machine in sb1el) basic_machine=mipsisa64sb1el-unknown ;; - sei) - basic_machine=mips-sei - os=-seiux - ;; sequent) basic_machine=i386-sequent ;; @@ -866,9 +843,6 @@ case $basic_machine in basic_machine=sh-hitachi os=-hms ;; - sh64) - basic_machine=sh64-unknown - ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks @@ -943,18 +917,14 @@ case $basic_machine in basic_machine=t90-cray os=-unicos ;; + tic4x | c4x*) + basic_machine=tic4x-unknown + os=-coff + ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; - tic55x | c55x*) - basic_machine=tic55x-unknown - os=-coff - ;; - tic6x | c6x*) - basic_machine=tic6x-unknown - os=-coff - ;; tx39) basic_machine=mipstx39-unknown ;; @@ -968,10 +938,6 @@ case $basic_machine in tower | tower-32) basic_machine=m68k-ncr ;; - tpf) - basic_machine=s390x-ibm - os=-tpf - ;; udi29k) basic_machine=a29k-amd os=-udi @@ -1061,7 +1027,7 @@ case $basic_machine in we32k) basic_machine=we32k-att ;; - sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) + sh3 | sh4 | sh3eb | sh4eb | sh[1234]le | sh3ele) basic_machine=sh-unknown ;; sh64) @@ -1140,19 +1106,19 @@ case $os in | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -knetbsd* | -netbsd* | -openbsd* | -kfreebsd* | -freebsd* | -riscix* \ + | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ - | -powermax* | -dnix* | -nx6 | -nx7 | -sei*) + | -powermax* | -dnix* | -microbsd*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) @@ -1176,9 +1142,6 @@ case $os in -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; - -linux-dietlibc) - os=-linux-dietlibc - ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; @@ -1191,9 +1154,6 @@ case $os in -opened*) os=-openedition ;; - -os400*) - os=-os400 - ;; -wince*) os=-wince ;; @@ -1237,9 +1197,6 @@ case $os in -sinix*) os=-sysv4 ;; - -tpf*) - os=-tpf - ;; -triton*) os=-sysv3 ;; @@ -1270,12 +1227,6 @@ case $os in -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; - -aros*) - os=-aros - ;; - -kaos*) - os=-kaos - ;; -none) ;; *) @@ -1307,9 +1258,6 @@ case $basic_machine in arm*-semi) os=-aout ;; - c4x-* | tic4x-*) - os=-coff - ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 @@ -1488,15 +1436,9 @@ case $basic_machine in -mvs* | -opened*) vendor=ibm ;; - -os400*) - vendor=ibm - ;; -ptx*) vendor=sequent ;; - -tpf*) - vendor=ibm - ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; diff --git a/reactos/lib/freetype/builds/unix/configure b/reactos/lib/freetype/builds/unix/configure index 251f9e5cc33..cfcf8bdcf1d 100644 --- a/reactos/lib/freetype/builds/unix/configure +++ b/reactos/lib/freetype/builds/unix/configure @@ -1,8 +1,9 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.59. +# Generated by GNU Autoconf 2.54. # -# Copyright (C) 2003 Free Software Foundation, Inc. +# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +# Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## @@ -19,10 +20,9 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi -DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then as_unset=unset else as_unset=false @@ -36,12 +36,9 @@ PS2='> ' PS4='+ ' # NLS nuisances. -for as_var in \ - LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ - LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ - LC_TELEPHONE LC_TIME +for as_var in LANG LANGUAGE LC_ALL LC_COLLATE LC_CTYPE LC_NUMERIC LC_MESSAGES LC_TIME do - if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var @@ -85,15 +82,15 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + echo "#! /bin/sh" >conftest.sh + echo "exit 0" >>conftest.sh + chmod +x conftest.sh + if (PATH="/nonexistent;."; conftest.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi - rm -f conf$$.sh + rm -f conftest.sh fi @@ -218,17 +215,16 @@ rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else - test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" +as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" # Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" +as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" # IFS @@ -241,6 +237,17 @@ IFS=" $as_nl" $as_unset CDPATH +# Find the correct PATH separator. Usually this is `:', but +# DJGPP uses `;' like DOS. +if test "X${PATH_SEPARATOR+set}" != Xset; then + UNAME=${UNAME-`uname 2>/dev/null`} + case X$UNAME in + *-DOS) lt_cv_sys_path_separator=';' ;; + *) lt_cv_sys_path_separator=':' ;; + esac + PATH_SEPARATOR=$lt_cv_sys_path_separator +fi + # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} @@ -259,7 +266,7 @@ if test "X$1" = X--no-reexec; then elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : -elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then # Yippee, $echo works! : else @@ -271,7 +278,7 @@ if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat </dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && @@ -316,7 +322,7 @@ else break fi done - IFS="$lt_save_ifs" + IFS="$save_ifs" if test "X$echo" = Xecho; then # We didn't find a better echo, so look for alternatives. @@ -390,11 +396,6 @@ fi - -tagnames=`echo "$tagnames,CXX" | sed 's/^,//'` - -tagnames=`echo "$tagnames,F77" | sed 's/^,//'` - # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. @@ -463,7 +464,7 @@ ac_includes_default="\ # include #endif" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS version_info ft_version build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP XX_CFLAGS XX_ANSIFLAGS RMF RMDIR INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA EGREP FTSYS_SRC LIBZ SYSTEM_ZLIB LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB STRIP ac_ct_STRIP CXX CXXFLAGS ac_ct_CXX CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL LIBOBJS LTLIBOBJS' +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS version_info ft_version build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP XX_CFLAGS XX_ANSIFLAGS RMF RMDIR INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA EGREP FTSYS_SRC LIBZ SYSTEM_ZLIB LN_S ECHO RANLIB ac_ct_RANLIB STRIP ac_ct_STRIP LIBTOOL LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. @@ -822,7 +823,7 @@ done # Be sure to have absolute paths. for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ - localstatedir libdir includedir oldincludedir infodir mandir + localstatedir libdir includedir oldincludedir infodir mandir do eval ac_val=$`echo $ac_var` case $ac_val in @@ -862,10 +863,10 @@ if test -z "$srcdir"; then # Try the directory containing this script, then its parent. ac_confdir=`(dirname "$0") 2>/dev/null || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$0" : 'X\(//\)[^/]' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } @@ -924,26 +925,6 @@ ac_env_CPP_set=${CPP+set} ac_env_CPP_value=$CPP ac_cv_env_CPP_set=${CPP+set} ac_cv_env_CPP_value=$CPP -ac_env_CXX_set=${CXX+set} -ac_env_CXX_value=$CXX -ac_cv_env_CXX_set=${CXX+set} -ac_cv_env_CXX_value=$CXX -ac_env_CXXFLAGS_set=${CXXFLAGS+set} -ac_env_CXXFLAGS_value=$CXXFLAGS -ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} -ac_cv_env_CXXFLAGS_value=$CXXFLAGS -ac_env_CXXCPP_set=${CXXCPP+set} -ac_env_CXXCPP_value=$CXXCPP -ac_cv_env_CXXCPP_set=${CXXCPP+set} -ac_cv_env_CXXCPP_value=$CXXCPP -ac_env_F77_set=${F77+set} -ac_env_F77_value=$F77 -ac_cv_env_F77_set=${F77+set} -ac_cv_env_F77_value=$F77 -ac_env_FFLAGS_set=${FFLAGS+set} -ac_env_FFLAGS_value=$FFLAGS -ac_cv_env_FFLAGS_set=${FFLAGS+set} -ac_cv_env_FFLAGS_value=$FFLAGS # # Report the --help message. @@ -977,9 +958,9 @@ _ACEOF cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] + [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] + [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify @@ -1019,24 +1000,18 @@ if test -n "$ac_init_help"; then Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --enable-shared[=PKGS] - build shared libraries [default=yes] - --enable-static[=PKGS] - build static libraries [default=yes] - --enable-fast-install[=PKGS] - optimize for fast installation [default=yes] + --enable-shared=PKGS build shared libraries default=yes + --enable-static=PKGS build static libraries default=yes + --enable-fast-install=PKGS optimize for fast installation default=yes --disable-libtool-lock avoid locking (might break parallel builds) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --without-zlib use internal zlib instead of system-wide - --with-old-mac-fonts allow Mac resource-based fonts to be used - --with-gnu-ld assume the C compiler uses GNU ld [default=no] - --with-pic try to use only PIC/non-PIC objects [default=use - both] - --with-tags[=TAGS] - include additional configurations [automatic] + --without-zlib use internal zlib instead of system-wide + --with-old-mac-fonts allow Mac resource-based fonts to be used + --with-gnu-ld assume the C compiler uses GNU ld default=no + --with-pic try to use only PIC/non-PIC objects default=use both Some influential environment variables: CC C compiler command @@ -1046,11 +1021,6 @@ Some influential environment variables: CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor - CXX C++ compiler command - CXXFLAGS C++ compiler flags - CXXCPP C++ preprocessor - F77 Fortran 77 compiler command - FFLAGS Fortran 77 compiler flags Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. @@ -1088,45 +1058,12 @@ case $srcdir in ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac - -# Do not use `cd foo && pwd` to compute absolute paths, because -# the directories may not exist. -case `pwd` in -.) ac_abs_builddir="$ac_dir";; -*) - case "$ac_dir" in - .) ac_abs_builddir=`pwd`;; - [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; - *) ac_abs_builddir=`pwd`/"$ac_dir";; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_builddir=${ac_top_builddir}.;; -*) - case ${ac_top_builddir}. in - .) ac_abs_top_builddir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; - *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_srcdir=$ac_srcdir;; -*) - case $ac_srcdir in - .) ac_abs_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; - *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_srcdir=$ac_top_srcdir;; -*) - case $ac_top_srcdir in - .) ac_abs_top_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; - *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; - esac;; -esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` cd $ac_dir # Check for guested configure; otherwise get Cygnus style configure. @@ -1137,7 +1074,7 @@ esac echo $SHELL $ac_srcdir/configure --help=recursive elif test -f $ac_srcdir/configure.ac || - test -f $ac_srcdir/configure.in; then + test -f $ac_srcdir/configure.in; then echo $ac_configure --help else @@ -1151,7 +1088,8 @@ test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF -Copyright (C) 2003 Free Software Foundation, Inc. +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF @@ -1163,7 +1101,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was -generated by GNU Autoconf 2.59. Invocation command line was +generated by GNU Autoconf 2.54. Invocation command line was $ $0 $@ @@ -1215,54 +1153,24 @@ _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= -ac_configure_args0= -ac_configure_args1= ac_sep= -ac_must_keep_next=false -for ac_pass in 1 2 +for ac_arg do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) - ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; - 2) - ac_configure_args1="$ac_configure_args1 '$ac_arg'" - if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. - else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac - fi - ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" - # Get rid of the leading space. - ac_sep=" " - ;; - esac - done + case $ac_arg in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n ) continue ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + continue ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + # Get rid of the leading space. + ac_sep=" " done -$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } -$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there @@ -1286,12 +1194,12 @@ _ASBOX case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in *ac_space=\ *) sed -n \ - "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" ;; *) sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } @@ -1320,7 +1228,7 @@ _ASBOX for ac_var in $ac_subst_files do eval ac_val=$`echo $ac_var` - echo "$ac_var='"'"'$ac_val'"'"'" + echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo fi @@ -1339,7 +1247,7 @@ _ASBOX echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 - rm -f core *.core && + rm -f core core.* *.core && rm -rf conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 @@ -1419,7 +1327,7 @@ fi # value. ac_cache_corrupted=false for ac_var in `(set) 2>&1 | - sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val="\$ac_cv_env_${ac_var}_value" @@ -1436,13 +1344,13 @@ echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then - { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} - { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} - ac_cache_corrupted=: + ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. @@ -1492,17 +1400,14 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu + ac_config_headers="$ac_config_headers ftconfig.h:ftconfig.in" -# Don't forget to update docs/VERSION.DLL! -version_info='9:6:3' +version_info='9:4:3' ft_version=`echo $version_info | tr : .` - -# checks for system type - ac_aux_dir= for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do if test -f $ac_dir/install-sh; then @@ -1611,9 +1516,6 @@ test -n "$target_alias" && NONENONEs,x,x, && program_prefix=${target_alias}- - -# checks for programs - ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -1923,10 +1825,8 @@ fi fi -test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&5 -echo "$as_me: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&2;} +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH" >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH" >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. @@ -1950,11 +1850,8 @@ ac_compiler=`set X $ac_compile; echo $2` (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" int main () @@ -1965,12 +1862,12 @@ main () } _ACEOF ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.exe b.out" +ac_clean_files="$ac_clean_files a.out a.exe" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. -echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 -echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 +echo "$as_me:$LINENO: checking for C compiler default output" >&5 +echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 (eval $ac_link_default) 2>&5 @@ -1984,39 +1881,27 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 # Be careful to initialize this variable, since it used to be cached. # Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. ac_cv_exeext= -# b.out is created by i960 compilers. -for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out -do +for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.*; do test -f "$ac_file" || continue case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) - ;; - conftest.$ac_ext ) - # This is the source file. - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - # FIXME: I believe we export ac_cv_exeext for Libtool, - # but it would be cool to find out if it's true. Does anybody - # maintain Libtool? --akim. - export ac_cv_exeext - break;; - * ) - break;; + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; + a.out ) # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool --akim. + export ac_cv_exeext + break;; + * ) break;; esac done else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: C compiler cannot create executables -See \`config.log' for more details." >&5 +check \`config.log' for details." >&5 echo "$as_me: error: C compiler cannot create executables -See \`config.log' for more details." >&2;} +check \`config.log' for details." >&2;} { (exit 77); exit 77; }; } fi @@ -2043,11 +1928,9 @@ if test "$cross_compiling" != yes; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&5 +If you meant to cross compile, use \`--host'." >&5 echo "$as_me: error: cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&2;} +If you meant to cross compile, use \`--host'." >&2;} { (exit 1); exit 1; }; } fi fi @@ -2055,7 +1938,7 @@ fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 -rm -f a.out a.exe conftest$ac_cv_exeext b.out +rm -f a.out a.exe conftest$ac_cv_exeext ac_clean_files=$ac_clean_files_save # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. @@ -2080,16 +1963,14 @@ for ac_file in conftest.exe conftest conftest.*; do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - export ac_cv_exeext - break;; + export ac_cv_exeext + break;; * ) break;; esac done else - { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&2;} + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link" >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link" >&2;} { (exit 1); exit 1; }; } fi @@ -2106,11 +1987,8 @@ if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" int main () @@ -2135,12 +2013,9 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 done else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&2;} +cat conftest.$ac_ext >&5 +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile" >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile" >&2;} { (exit 1); exit 1; }; } fi @@ -2156,11 +2031,8 @@ if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" int main () @@ -2175,21 +2047,11 @@ main () _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 + (eval $ac_compile) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2198,11 +2060,10 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 ac_compiler_gnu=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi @@ -2218,11 +2079,8 @@ if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" int main () @@ -2234,21 +2092,11 @@ main () _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 + (eval $ac_compile) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2257,11 +2105,10 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 ac_cv_prog_cc_g=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 @@ -2288,11 +2135,8 @@ else ac_cv_prog_cc_stdc=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" #include #include #include @@ -2315,16 +2159,6 @@ static char *f (char * (*g) (char **, int), char **p, ...) va_end (v); return s; } - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std1 is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std1. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; @@ -2351,21 +2185,11 @@ do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 + (eval $ac_compile) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2375,10 +2199,9 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 break else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 fi -rm -f conftest.err conftest.$ac_objext +rm -f conftest.$ac_objext done rm -f conftest.$ac_ext conftest.$ac_objext CC=$ac_save_CC @@ -2406,28 +2229,19 @@ cat >conftest.$ac_ext <<_ACEOF _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 + (eval $ac_compile) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then for ac_declaration in \ - '' \ + ''\ + '#include ' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ @@ -2435,13 +2249,10 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration +#line $LINENO "configure" +#include "confdefs.h" #include +$ac_declaration int main () { @@ -2452,21 +2263,11 @@ exit (42); _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 + (eval $ac_compile) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2475,17 +2276,13 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 : else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 continue fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" $ac_declaration int main () @@ -2497,21 +2294,11 @@ exit (42); _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 + (eval $ac_compile) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2520,10 +2307,9 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 break else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then @@ -2534,10 +2320,9 @@ fi else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -2567,22 +2352,13 @@ for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error +#line $LINENO "configure" +#include "confdefs.h" +#include + Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 @@ -2594,7 +2370,6 @@ if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -2605,8 +2380,7 @@ if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - + cat conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi @@ -2615,11 +2389,8 @@ rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 @@ -2632,7 +2403,6 @@ if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -2644,8 +2414,7 @@ if test -z "$ac_cpp_err"; then continue else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - + cat conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break @@ -2674,22 +2443,13 @@ for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error +#line $LINENO "configure" +#include "confdefs.h" +#include + Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 @@ -2701,7 +2461,6 @@ if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -2712,8 +2471,7 @@ if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - + cat conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi @@ -2722,11 +2480,8 @@ rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 @@ -2739,7 +2494,6 @@ if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -2751,8 +2505,7 @@ if test -z "$ac_cpp_err"; then continue else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - + cat conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break @@ -2765,10 +2518,8 @@ rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else - { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&5 -echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&2;} + { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check" >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check" >&2;} { (exit 1); exit 1; }; } fi @@ -2779,31 +2530,25 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu - -# get compiler flags right - if test "x$CC" = xgcc; then XX_CFLAGS="-Wall" XX_ANSIFLAGS="-pedantic -ansi" else case "$host" in - *-dec-osf*) - CFLAGS= - XX_CFLAGS="-std1 -g3" - XX_ANSIFLAGS= - ;; - *) - XX_CFLAGS= - XX_ANSIFLAGS= - ;; + *-dec-osf*) + CFLAGS= + XX_CFLAGS="-std1 -g3" + XX_ANSIFLAGS= + ;; + *) + XX_CFLAGS= + XX_ANSIFLAGS= + ;; esac fi - -# auxiliary programs - # Extract the first word of "rm", so it can be a program name with args. set dummy rm; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 @@ -2875,11 +2620,6 @@ echo "${ECHO_T}no" >&6 fi - -# Since this file will be finally moved to another directory we make -# the path of the install script absolute. This small code snippet has -# been taken from automake's `ylwrap' script. - # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: @@ -2891,7 +2631,6 @@ fi # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 @@ -2908,7 +2647,6 @@ do case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. @@ -2916,20 +2654,20 @@ case $as_dir/ in # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi + if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi done done ;; @@ -2960,16 +2698,13 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' case "$INSTALL" in -/*) - ;; -*/*) - INSTALL="`pwd`/$INSTALL" ;; + /*) + ;; + */*) + INSTALL="`pwd`/$INSTALL" ;; esac -# checks for header files - - echo "$as_me:$LINENO: checking for egrep" >&5 echo $ECHO_N "checking for egrep... $ECHO_C" >&6 @@ -2992,63 +2727,44 @@ if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" #include #include #include #include -int -main () -{ - - ; - return 0; -} _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_header_stdc=no + cat conftest.$ac_ext >&5 + ac_cv_header_stdc=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" #include _ACEOF @@ -3065,11 +2781,8 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" #include _ACEOF @@ -3089,20 +2802,16 @@ if test $ac_cv_header_stdc = yes; then : else cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) +# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif @@ -3113,7 +2822,7 @@ main () int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) + || toupper (i) != TOUPPER (i)) exit(2); exit (0); } @@ -3133,12 +2842,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi @@ -3163,7 +2871,7 @@ fi for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h + inttypes.h stdint.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_header" >&5 @@ -3172,32 +2880,19 @@ if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 + (eval $ac_compile) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3206,11 +2901,10 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 @@ -3242,31 +2936,18 @@ else echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 + (eval $ac_compile) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3275,11 +2956,10 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 @@ -3287,11 +2967,8 @@ echo "${ECHO_T}$ac_header_compiler" >&6 echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 @@ -3304,7 +2981,6 @@ if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -3315,8 +2991,7 @@ if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - + cat conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext @@ -3324,43 +2999,26 @@ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) +case $ac_header_compiler:$ac_header_preproc in + yes:no ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; + no:yes ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------------ ## -## Report this to the AC_PACKAGE_NAME lists. ## -## ------------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - eval "$as_ac_Header=\$ac_header_preproc" + eval "$as_ac_Header=$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 @@ -3376,20 +3034,14 @@ fi done - -# checks for typedefs, structures, and compiler characteristics - echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6 if test "${ac_cv_c_const+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" int main () @@ -3447,21 +3099,11 @@ main () _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 + (eval $ac_compile) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3470,11 +3112,10 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_cv_c_const=yes else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 ac_cv_c_const=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 echo "${ECHO_T}$ac_cv_c_const" >&6 @@ -3492,11 +3133,8 @@ if test "${ac_cv_type_int+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" $ac_includes_default int main () @@ -3511,21 +3149,11 @@ if (sizeof (int)) _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 + (eval $ac_compile) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3534,11 +3162,10 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_cv_type_int=yes else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 ac_cv_type_int=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5 echo "${ECHO_T}$ac_cv_type_int" >&6 @@ -3556,11 +3183,8 @@ else if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" $ac_includes_default int main () @@ -3574,21 +3198,11 @@ test_array [0] = 0 _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 + (eval $ac_compile) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3597,11 +3211,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_lo=0 ac_mid=0 while :; do cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" $ac_includes_default int main () @@ -3615,21 +3226,11 @@ test_array [0] = 0 _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 + (eval $ac_compile) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3638,27 +3239,22 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" $ac_includes_default int main () @@ -3672,21 +3268,11 @@ test_array [0] = 0 _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 + (eval $ac_compile) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3695,11 +3281,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_hi=-1 ac_mid=-1 while :; do cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" $ac_includes_default int main () @@ -3713,21 +3296,11 @@ test_array [0] = 0 _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 + (eval $ac_compile) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3736,35 +3309,30 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 ac_lo= ac_hi= fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f conftest.$ac_objext conftest.$ac_ext fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" $ac_includes_default int main () @@ -3778,21 +3346,11 @@ test_array [0] = 0 _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 + (eval $ac_compile) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3801,34 +3359,26 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_int=$ac_lo;; -'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (int), 77 -See \`config.log' for more details." >&2;} +'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77" >&5 +echo "$as_me: error: cannot compute sizeof (int), 77" >&2;} { (exit 1); exit 1; }; } ;; esac else if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} + { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling" >&5 +echo "$as_me: error: cannot run test program while cross compiling" >&2;} { (exit 1); exit 1; }; } else cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" $ac_includes_default long longval () { return (long) (sizeof (int)); } unsigned long ulongval () { return (long) (sizeof (int)); } @@ -3876,16 +3426,13 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 ( exit $ac_status ) -{ { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (int), 77 -See \`config.log' for more details." >&2;} +{ { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77" >&5 +echo "$as_me: error: cannot compute sizeof (int), 77" >&2;} { (exit 1); exit 1; }; } fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi rm -f conftest.val @@ -3906,11 +3453,8 @@ if test "${ac_cv_type_long+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" $ac_includes_default int main () @@ -3925,21 +3469,11 @@ if (sizeof (long)) _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 + (eval $ac_compile) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3948,11 +3482,10 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_cv_type_long=yes else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 ac_cv_type_long=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5 echo "${ECHO_T}$ac_cv_type_long" >&6 @@ -3970,11 +3503,8 @@ else if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" $ac_includes_default int main () @@ -3988,21 +3518,11 @@ test_array [0] = 0 _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 + (eval $ac_compile) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -4011,11 +3531,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_lo=0 ac_mid=0 while :; do cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" $ac_includes_default int main () @@ -4029,21 +3546,11 @@ test_array [0] = 0 _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 + (eval $ac_compile) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -4052,27 +3559,22 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" $ac_includes_default int main () @@ -4086,21 +3588,11 @@ test_array [0] = 0 _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 + (eval $ac_compile) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -4109,11 +3601,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_hi=-1 ac_mid=-1 while :; do cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" $ac_includes_default int main () @@ -4127,21 +3616,11 @@ test_array [0] = 0 _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 + (eval $ac_compile) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -4150,35 +3629,30 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 ac_lo= ac_hi= fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f conftest.$ac_objext conftest.$ac_ext fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" $ac_includes_default int main () @@ -4192,21 +3666,11 @@ test_array [0] = 0 _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 + (eval $ac_compile) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -4215,34 +3679,26 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_long=$ac_lo;; -'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (long), 77 -See \`config.log' for more details." >&2;} +'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77" >&5 +echo "$as_me: error: cannot compute sizeof (long), 77" >&2;} { (exit 1); exit 1; }; } ;; esac else if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} + { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling" >&5 +echo "$as_me: error: cannot run test program while cross compiling" >&2;} { (exit 1); exit 1; }; } else cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" $ac_includes_default long longval () { return (long) (sizeof (long)); } unsigned long ulongval () { return (long) (sizeof (long)); } @@ -4290,16 +3746,13 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 ( exit $ac_status ) -{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (long), 77 -See \`config.log' for more details." >&2;} +{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77" >&5 +echo "$as_me: error: cannot compute sizeof (long), 77" >&2;} { (exit 1); exit 1; }; } fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi rm -f conftest.val @@ -4316,10 +3769,6 @@ _ACEOF -# checks for library functions - -# Here we check whether we can use our mmap file component. - for ac_header in stdlib.h unistd.h @@ -4338,31 +3787,18 @@ else echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 + (eval $ac_compile) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -4371,11 +3807,10 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 @@ -4383,11 +3818,8 @@ echo "${ECHO_T}$ac_header_compiler" >&6 echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 @@ -4400,7 +3832,6 @@ if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -4411,8 +3842,7 @@ if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - + cat conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext @@ -4420,43 +3850,26 @@ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) +case $ac_header_compiler:$ac_header_preproc in + yes:no ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; + no:yes ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------------ ## -## Report this to the AC_PACKAGE_NAME lists. ## -## ------------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - eval "$as_ac_Header=\$ac_header_preproc" + eval "$as_ac_Header=$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 @@ -4481,73 +3894,43 @@ if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - +#line $LINENO "configure" +#include "confdefs.h" /* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - + which can conflict with char $ac_func (); below. */ +#include /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" -{ #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); +char (*f) (); + +int +main () +{ /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} +f = $ac_func; #endif -int -main () -{ -return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 + (eval $ac_link) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -4556,12 +3939,10 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 @@ -4582,11 +3963,8 @@ else ac_cv_func_mmap_fixed_mapped=no else cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" $ac_includes_default /* malloc might have been renamed as rpl_malloc. */ #undef malloc @@ -4689,9 +4067,9 @@ main () data2 = (char *) malloc (2 * pagesize); if (!data2) exit (1); - data2 += (pagesize - ((long) data2 & (pagesize - 1))) & (pagesize - 1); + data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1); if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_FIXED, fd, 0L)) + MAP_PRIVATE | MAP_FIXED, fd, 0L)) exit (1); for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data2 + i)) @@ -4729,12 +4107,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_func_mmap_fixed_mapped=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi echo "$as_me:$LINENO: result: $ac_cv_func_mmap_fixed_mapped" >&5 @@ -4753,32 +4130,69 @@ if test "$ac_cv_func_mmap_fixed_mapped" != yes; then else FTSYS_SRC='$(BUILD_DIR)/ftsystem.c' - echo "$as_me:$LINENO: checking whether munmap is declared" >&5 -echo $ECHO_N "checking whether munmap is declared... $ECHO_C" >&6 -if test "${ac_cv_have_decl_munmap+set}" = set; then + echo "$as_me:$LINENO: checking whether munmap must be declared" >&5 +echo $ECHO_N "checking whether munmap must be declared... $ECHO_C" >&6 +if test "${ft_cv_munmap_decl+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - +#line $LINENO "configure" +#include "confdefs.h" #ifdef HAVE_UNISTD_H #include #endif #include - - - int main () { -#ifndef munmap - char *p = (char *) munmap; -#endif +char *(*pfn) = (char *(*))munmap + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ft_cv_munmap_decl=no +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ft_cv_munmap_decl=yes +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi + +echo "$as_me:$LINENO: result: $ft_cv_munmap_decl" >&5 +echo "${ECHO_T}$ft_cv_munmap_decl" >&6 +if test $ft_cv_munmap_decl = yes; then + +cat >>confdefs.h <<\_ACEOF +#define NEED_MUNMAP_DECL +_ACEOF + +fi + echo "$as_me:$LINENO: checking for munmap's first parameter type" >&5 +echo $ECHO_N "checking for munmap's first parameter type... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" + +#include +#include +int munmap(void *, size_t); +int +main () +{ ; return 0; @@ -4786,108 +4200,29 @@ main () _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 + (eval $ac_compile) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then - ac_cv_have_decl_munmap=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_have_decl_munmap=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_have_decl_munmap" >&5 -echo "${ECHO_T}$ac_cv_have_decl_munmap" >&6 -if test $ac_cv_have_decl_munmap = yes; then - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_MUNMAP 1 -_ACEOF - - -else - cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_MUNMAP 0 -_ACEOF - - -fi - - - - echo "$as_me:$LINENO: checking for munmap's first parameter type" >&5 -echo $ECHO_N "checking for munmap's first parameter type... $ECHO_C" >&6 - cat >conftest.$ac_ext <<_ACEOF - - /* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - - -#include -#include -int munmap(void *, size_t); - - - -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -echo "$as_me:$LINENO: result: void *" >&5 -echo "${ECHO_T}void *" >&6 - + echo "$as_me:$LINENO: result: void *" >&5 +echo "${ECHO_T}void *" >&6; cat >>confdefs.h <<\_ACEOF #define MUNMAP_USES_VOIDP _ACEOF +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +echo "$as_me:$LINENO: result: char *" >&5 +echo "${ECHO_T}char *" >&6 fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f conftest.$ac_objext conftest.$ac_ext fi @@ -4903,73 +4238,43 @@ if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - +#line $LINENO "configure" +#include "confdefs.h" /* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - + which can conflict with char $ac_func (); below. */ +#include /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" -{ #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); +char (*f) (); + +int +main () +{ /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} +f = $ac_func; #endif -int -main () -{ -return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 + (eval $ac_link) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -4978,12 +4283,10 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 @@ -4997,9 +4300,6 @@ done -# Check for system zlib - - # Check whether --with-zlib or --without-zlib was given. if test "${with_zlib+set}" = set; then withval="$with_zlib" @@ -5014,11 +4314,8 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -5037,21 +4334,11 @@ gzsetparams (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 + (eval $ac_link) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -5060,12 +4347,10 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_z_gzsetparams=yes else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 ac_cv_lib_z_gzsetparams=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_z_gzsetparams" >&5 @@ -5084,31 +4369,18 @@ else echo "$as_me:$LINENO: checking zlib.h usability" >&5 echo $ECHO_N "checking zlib.h usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" $ac_includes_default #include _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 + (eval $ac_compile) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -5117,11 +4389,10 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 @@ -5129,11 +4400,8 @@ echo "${ECHO_T}$ac_header_compiler" >&6 echo "$as_me:$LINENO: checking zlib.h presence" >&5 echo $ECHO_N "checking zlib.h presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 @@ -5146,7 +4414,6 @@ if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -5157,8 +4424,7 @@ if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - + cat conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext @@ -5166,36 +4432,19 @@ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) +case $ac_header_compiler:$ac_header_preproc in + yes:no ) { echo "$as_me:$LINENO: WARNING: zlib.h: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: zlib.h: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: zlib.h: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: zlib.h: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) + { echo "$as_me:$LINENO: WARNING: zlib.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: zlib.h: proceeding with the preprocessor's result" >&2;};; + no:yes ) { echo "$as_me:$LINENO: WARNING: zlib.h: present but cannot be compiled" >&5 echo "$as_me: WARNING: zlib.h: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: zlib.h: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: zlib.h: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: zlib.h: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: zlib.h: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: zlib.h: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: zlib.h: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: zlib.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: zlib.h: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: zlib.h: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: zlib.h: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: zlib.h: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: zlib.h: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------------ ## -## Report this to the AC_PACKAGE_NAME lists. ## -## ------------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; +echo "$as_me: WARNING: zlib.h: proceeding with the preprocessor's result" >&2;};; esac echo "$as_me:$LINENO: checking for zlib.h" >&5 echo $ECHO_N "checking for zlib.h... $ECHO_C" >&6 @@ -5223,9 +4472,6 @@ if test x$with_zlib != xno && test -n "$LIBZ"; then fi -# Whether to use Mac OS resource-based fonts or not - - # Check whether --with-old-mac-fonts or --without-old-mac-fonts was given. if test "${with_old_mac_fonts+set}" = set; then withval="$with_old_mac_fonts" @@ -5244,137 +4490,83 @@ fi - - # Check whether --enable-shared or --disable-shared was given. if test "${enable_shared+set}" = set; then enableval="$enable_shared" p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac +case $enableval in +yes) enable_shared=yes ;; +no) enable_shared=no ;; +*) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac else enable_shared=yes fi; - # Check whether --enable-static or --disable-static was given. if test "${enable_static+set}" = set; then enableval="$enable_static" p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac +case $enableval in +yes) enable_static=yes ;; +no) enable_static=no ;; +*) + enable_static=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac else enable_static=yes fi; - # Check whether --enable-fast-install or --disable-fast-install was given. if test "${enable_fast_install+set}" = set; then enableval="$enable_fast_install" p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac +case $enableval in +yes) enable_fast_install=yes ;; +no) enable_fast_install=no ;; +*) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac else enable_fast_install=yes fi; - -echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 -echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6 -if test "${lt_cv_path_SED+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Loop through the user's path and test for sed and gsed. -# Then use that list of sed's as ones to test for truncation. -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for lt_ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then - lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" - fi - done - done -done -lt_ac_max=0 -lt_ac_count=0 -# Add /usr/xpg4/bin/sed as it is typically found on Solaris -# along with /bin/sed that truncates output. -for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do - test ! -f $lt_ac_sed && break - cat /dev/null > conftest.in - lt_ac_count=0 - echo $ECHO_N "0123456789$ECHO_C" >conftest.in - # Check for GNU sed and select it if it is found. - if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then - lt_cv_path_SED=$lt_ac_sed - break - fi - while true; do - cat conftest.in conftest.in >conftest.tmp - mv conftest.tmp conftest.in - cp conftest.in conftest.nl - echo >>conftest.nl - $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break - cmp -s conftest.out conftest.nl || break - # 10000 chars as input seems more than enough - test $lt_ac_count -gt 10 && break - lt_ac_count=`expr $lt_ac_count + 1` - if test $lt_ac_count -gt $lt_ac_max; then - lt_ac_max=$lt_ac_count - lt_cv_path_SED=$lt_ac_sed - fi - done -done -SED=$lt_cv_path_SED - +# Find the correct PATH separator. Usually this is `:', but +# DJGPP uses `;' like DOS. +if test "X${PATH_SEPARATOR+set}" != Xset; then + UNAME=${UNAME-`uname 2>/dev/null`} + case X$UNAME in + *-DOS) lt_cv_sys_path_separator=';' ;; + *) lt_cv_sys_path_separator=':' ;; + esac + PATH_SEPARATOR=$lt_cv_sys_path_separator fi -echo "$as_me:$LINENO: result: $SED" >&5 -echo "${ECHO_T}$SED" >&6 - # Check whether --with-gnu-ld or --without-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then @@ -5386,8 +4578,8 @@ fi; ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. - echo "$as_me:$LINENO: checking for ld used by $CC" >&5 -echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 + echo "$as_me:$LINENO: checking for ld used by GCC" >&5 +echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6 case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw @@ -5397,12 +4589,12 @@ echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 esac case $ac_prog in # Accept absolute paths. - [\\/]* | ?:[\\/]*) + [\\/]* | [A-Za-z]:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the path of ld - ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do - ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; @@ -5426,26 +4618,22 @@ if test "${lt_cv_path_LD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do - IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then test "$with_gnu_ld" != no && break - ;; - *) + else test "$with_gnu_ld" != yes && break - ;; - esac + fi fi done - IFS="$lt_save_ifs" + IFS="$ac_save_ifs" else lt_cv_path_LD="$LD" # Let the user override the test with a path. fi @@ -5468,14 +4656,11 @@ if test "${lt_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # I'd rather use --version here, but apparently some GNU ld's only accept -v. -case `"$LD" -v 2>&1 &1 &5; then lt_cv_prog_gnu_ld=yes - ;; -*) +else lt_cv_prog_gnu_ld=no - ;; -esac +fi fi echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5 echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 @@ -5492,11 +4677,7 @@ fi echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6 reload_flag=$lt_cv_ld_reload_flag -case $reload_flag in -"" | " "*) ;; -*) reload_flag=" $reload_flag" ;; -esac -reload_cmds='$LD$reload_flag -o $output$reload_objs' +test -n "$reload_flag" && reload_flag=" $reload_flag" echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6 @@ -5507,42 +4688,120 @@ else # Let the user override the test. lt_cv_path_NM="$NM" else - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/${ac_tool_prefix}nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + tmp_nm=$ac_dir/${ac_tool_prefix}nm + if test -f $tmp_nm || test -f $tmp_nm$ac_exeext ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) + if ($tmp_nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep '(/dev/null|Invalid file or object type)' >/dev/null; then lt_cv_path_NM="$tmp_nm -B" break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - esac + elif ($tmp_nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + lt_cv_path_NM="$tmp_nm -p" + break + else + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + fi fi done - IFS="$lt_save_ifs" + IFS="$ac_save_ifs" test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi fi -echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 -echo "${ECHO_T}$lt_cv_path_NM" >&6 + NM="$lt_cv_path_NM" +echo "$as_me:$LINENO: result: $NM" >&5 +echo "${ECHO_T}$NM" >&6 + +echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 +echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6 +if test "${lt_cv_path_SED+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_executable_p="test -f" +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + _sed_list="$_sed_list $as_dir/$ac_prog$ac_exec_ext" + fi + done + done +done + + # Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. +: ${TMPDIR=/tmp} +{ + tmp=`(umask 077 && mktemp -d -q "$TMPDIR/sedXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=$TMPDIR/sed$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in $TMPDIR" >&2 + { (exit 1); exit 1; } +} + _max=0 + _count=0 + # Add /usr/xpg4/bin/sed as it is typically found on Solaris + # along with /bin/sed that truncates output. + for _sed in $_sed_list /usr/xpg4/bin/sed; do + test ! -f ${_sed} && break + cat /dev/null > "$tmp/sed.in" + _count=0 + echo ${ECHO_N-$ac_n} "0123456789${ECHO_C-$ac_c}" >"$tmp/sed.in" + # Check for GNU sed and select it if it is found. + if "${_sed}" --version 2>&1 < /dev/null | egrep '(GNU)' > /dev/null; then + lt_cv_path_SED=${_sed} + break + fi + while true; do + cat "$tmp/sed.in" "$tmp/sed.in" >"$tmp/sed.tmp" + mv "$tmp/sed.tmp" "$tmp/sed.in" + cp "$tmp/sed.in" "$tmp/sed.nl" + echo >>"$tmp/sed.nl" + ${_sed} -e 's/a$//' < "$tmp/sed.nl" >"$tmp/sed.out" || break + cmp -s "$tmp/sed.out" "$tmp/sed.nl" || break + # 40000 chars as input seems more than enough + test $_count -gt 10 && break + _count=`expr $_count + 1` + if test $_count -gt $_max; then + _max=$_count + lt_cv_path_SED=$_sed + fi + done + done + rm -rf "$tmp" + +fi + +if test "X$SED" != "X"; then + lt_cv_path_SED=$SED +else + SED=$lt_cv_path_SED +fi +echo "$as_me:$LINENO: result: $SED" >&5 +echo "${ECHO_T}$SED" >&6 echo "$as_me:$LINENO: checking whether ln -s works" >&5 echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 @@ -5570,7 +4829,7 @@ lt_cv_deplibs_check_method='unknown' # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path -# which responds to the $file_magic_cmd with a given extended regex. +# which responds to the $file_magic_cmd with a given egrep regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. @@ -5590,24 +4849,21 @@ bsdi4*) ;; cygwin* | mingw* | pw32*) - # win32_libid is a shell function defined in ltmain.sh - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='win32_libid' + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) - # this will be overwritten by pass_all, but leave it in just in case lt_cv_deplibs_check_method='file_magic Mach-O dynamically linked shared library' lt_cv_file_magic_cmd='/usr/bin/file -L' case "$host_os" in rhapsody* | darwin1.[012]) - lt_cv_file_magic_test_file=`/System/Library/Frameworks/System.framework/System` + lt_cv_file_magic_test_file=`echo /System/Library/Frameworks/System.framework/Versions/*/System | head -1` ;; *) # Darwin 1.3 on lt_cv_file_magic_test_file='/usr/lib/libSystem.dylib' ;; esac - lt_cv_deplibs_check_method=pass_all ;; freebsd*) @@ -5630,22 +4886,10 @@ gnu*) lt_cv_deplibs_check_method=pass_all ;; -hpux10.20* | hpux11*) +hpux10.20*|hpux11*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' lt_cv_file_magic_cmd=/usr/bin/file - case "$host_cpu" in - ia64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' - lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so - ;; - hppa*64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' - lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl - ;; - *) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' - lt_cv_file_magic_test_file=/usr/lib/libc.sl - ;; - esac + lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; irix5* | irix6* | nonstopux*) @@ -5670,9 +4914,9 @@ irix5* | irix6* | nonstopux*) ;; # This must be Linux ELF. -linux*) +linux-gnu*) case $host_cpu in - alpha* | hppa* | i*86 | ia64* | m68* | mips | mipsel | powerpc* | sparc* | s390* | sh*) + alpha* | hppa* | i*86 | mips | mipsel | powerpc* | sparc* | ia64*) lt_cv_deplibs_check_method=pass_all ;; *) # glibc up to 2.1.1 does not perform some relocations on ARM @@ -5683,9 +4927,9 @@ linux*) netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so$' fi ;; @@ -5695,10 +4939,6 @@ newos6*) lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; -nto-qnx) - lt_cv_deplibs_check_method=unknown - ;; - openbsd*) lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` @@ -5725,6 +4965,10 @@ solaris*) lt_cv_file_magic_test_file=/lib/libc.so ;; +sysv5uw[78]* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) case $host_vendor in motorola) @@ -5748,10 +4992,6 @@ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) ;; esac ;; - -sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; esac fi @@ -5759,1259 +4999,16 @@ echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6 file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method -test -z "$deplibs_check_method" && deplibs_check_method=unknown -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# Allow CC to be a program name with arguments. -compiler=$CC - -# Check whether --enable-libtool-lock or --disable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then - enableval="$enable_libtool_lock" - -fi; -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -ia64-*-hpux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - case `/usr/bin/file conftest.$ac_objext` in - *ELF-32*) - HPUX_IA64_MODE="32" - ;; - *ELF-64*) - HPUX_IA64_MODE="64" - ;; - esac - fi - rm -rf conftest* - ;; -*-*-irix6*) - # Find out which ABI we are using. - echo '#line 5804 "configure"' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - if test "$lt_cv_prog_gnu_ld" = yes; then - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -melf32bsmip" - ;; - *N32*) - LD="${LD-ld} -melf32bmipn32" - ;; - *64-bit*) - LD="${LD-ld} -melf64bmip" - ;; - esac - else - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - fi - rm -rf conftest* - ;; - -x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - case "`/usr/bin/file conftest.o`" in - *32-bit*) - case $host in - x86_64-*linux*) - LD="${LD-ld} -m elf_i386" - ;; - ppc64-*linux*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) - LD="${LD-ld} -m elf_s390" - ;; - sparc64-*linux*) - LD="${LD-ld} -m elf32_sparc" - ;; - esac - ;; - *64-bit*) - case $host in - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - ppc*-*linux*|powerpc*-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*) - LD="${LD-ld} -m elf64_s390" - ;; - sparc*-*linux*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 -echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6 -if test "${lt_cv_cc_needs_belf+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - lt_cv_cc_needs_belf=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -lt_cv_cc_needs_belf=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -fi -echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 -echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6 - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; - -esac - -need_locks="$enable_libtool_lock" - - - -for ac_header in dlfcn.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------------ ## -## Report this to the AC_PACKAGE_NAME lists. ## -## ------------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - -ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test -n "$ac_tool_prefix"; then - for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CXX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -CXX=$ac_cv_prog_CXX -if test -n "$CXX"; then - echo "$as_me:$LINENO: result: $CXX" >&5 -echo "${ECHO_T}$CXX" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - test -n "$CXX" && break - done -fi -if test -z "$CXX"; then - ac_ct_CXX=$CXX - for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CXX"; then - ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CXX="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -ac_ct_CXX=$ac_cv_prog_ac_ct_CXX -if test -n "$ac_ct_CXX"; then - echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 -echo "${ECHO_T}$ac_ct_CXX" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - test -n "$ac_ct_CXX" && break -done -test -n "$ac_ct_CXX" || ac_ct_CXX="g++" - - CXX=$ac_ct_CXX -fi - - -# Provide some information about the compiler. -echo "$as_me:$LINENO:" \ - "checking for C++ compiler version" >&5 -ac_compiler=`set X $ac_compile; echo $2` -{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 - (eval $ac_compiler --version &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 - (eval $ac_compiler -v &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 - (eval $ac_compiler -V &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - -echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 -echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 -if test "${ac_cv_cxx_compiler_gnu+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_compiler_gnu=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_compiler_gnu=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_cxx_compiler_gnu=$ac_compiler_gnu - -fi -echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 -echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 -GXX=`test $ac_compiler_gnu = yes && echo yes` -ac_test_CXXFLAGS=${CXXFLAGS+set} -ac_save_CXXFLAGS=$CXXFLAGS -CXXFLAGS="-g" -echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 -echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 -if test "${ac_cv_prog_cxx_g+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_prog_cxx_g=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_prog_cxx_g=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 -echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 -if test "$ac_test_CXXFLAGS" = set; then - CXXFLAGS=$ac_save_CXXFLAGS -elif test $ac_cv_prog_cxx_g = yes; then - if test "$GXX" = yes; then - CXXFLAGS="-g -O2" - else - CXXFLAGS="-g" - fi -else - if test "$GXX" = yes; then - CXXFLAGS="-O2" - else - CXXFLAGS= - fi -fi -for ac_declaration in \ - '' \ - 'extern "C" void std::exit (int) throw (); using std::exit;' \ - 'extern "C" void std::exit (int); using std::exit;' \ - 'extern "C" void exit (int) throw ();' \ - 'extern "C" void exit (int);' \ - 'void exit (int);' -do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -#include -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -continue -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -rm -f conftest* -if test -n "$ac_declaration"; then - echo '#ifdef __cplusplus' >>confdefs.h - echo $ac_declaration >>confdefs.h - echo '#endif' >>confdefs.h -fi - -ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - -ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 -echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6 -if test -z "$CXXCPP"; then - if test "${ac_cv_prog_CXXCPP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Double quotes because CXXCPP needs to be expanded - for CXXCPP in "$CXX -E" "/lib/cpp" - do - ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_cxx_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.$ac_ext - - # OK, works on sane cases. Now check whether non-existent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_cxx_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - # Broken: success on invalid input. -continue -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - break -fi - - done - ac_cv_prog_CXXCPP=$CXXCPP - -fi - CXXCPP=$ac_cv_prog_CXXCPP -else - ac_cv_prog_CXXCPP=$CXXCPP -fi -echo "$as_me:$LINENO: result: $CXXCPP" >&5 -echo "${ECHO_T}$CXXCPP" >&6 -ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_cxx_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.$ac_ext - - # OK, works on sane cases. Now check whether non-existent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_cxx_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - # Broken: success on invalid input. -continue -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - : -else - { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check -See \`config.log' for more details." >&5 -echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi - -ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - -ac_ext=f -ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' -ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_f77_compiler_gnu -if test -n "$ac_tool_prefix"; then - for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_F77+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$F77"; then - ac_cv_prog_F77="$F77" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_F77="$ac_tool_prefix$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -F77=$ac_cv_prog_F77 -if test -n "$F77"; then - echo "$as_me:$LINENO: result: $F77" >&5 -echo "${ECHO_T}$F77" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - test -n "$F77" && break - done -fi -if test -z "$F77"; then - ac_ct_F77=$F77 - for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_F77+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_F77"; then - ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_F77="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -ac_ct_F77=$ac_cv_prog_ac_ct_F77 -if test -n "$ac_ct_F77"; then - echo "$as_me:$LINENO: result: $ac_ct_F77" >&5 -echo "${ECHO_T}$ac_ct_F77" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - test -n "$ac_ct_F77" && break -done - - F77=$ac_ct_F77 -fi - - -# Provide some information about the compiler. -echo "$as_me:6794:" \ - "checking for Fortran 77 compiler version" >&5 -ac_compiler=`set X $ac_compile; echo $2` -{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 - (eval $ac_compiler --version &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 - (eval $ac_compiler -v &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 - (eval $ac_compiler -V &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -rm -f a.out - -# If we don't use `.F' as extension, the preprocessor is not run on the -# input file. (Note that this only needs to work for GNU compilers.) -ac_save_ext=$ac_ext -ac_ext=F -echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5 -echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6 -if test "${ac_cv_f77_compiler_gnu+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF - program main -#ifndef __GNUC__ - choke me -#endif - - end -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_f77_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_compiler_gnu=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_compiler_gnu=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_f77_compiler_gnu=$ac_compiler_gnu - -fi -echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5 -echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6 -ac_ext=$ac_save_ext -ac_test_FFLAGS=${FFLAGS+set} -ac_save_FFLAGS=$FFLAGS -FFLAGS= -echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5 -echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6 -if test "${ac_cv_prog_f77_g+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - FFLAGS=-g -cat >conftest.$ac_ext <<_ACEOF - program main - - end -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_f77_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_prog_f77_g=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_prog_f77_g=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - -fi -echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5 -echo "${ECHO_T}$ac_cv_prog_f77_g" >&6 -if test "$ac_test_FFLAGS" = set; then - FFLAGS=$ac_save_FFLAGS -elif test $ac_cv_prog_f77_g = yes; then - if test "x$ac_cv_f77_compiler_gnu" = xyes; then - FFLAGS="-g -O2" - else - FFLAGS="-g" - fi -else - if test "x$ac_cv_f77_compiler_gnu" = xyes; then - FFLAGS="-O2" - else - FFLAGS= - fi -fi - -G77=`test $ac_compiler_gnu = yes && echo yes` -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - -# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! - -# find the maximum length of command line arguments -echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 -echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6 -if test "${lt_cv_sys_max_cmd_len+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - i=0 - testring="ABCD" - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - *) - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while (test "X"`$CONFIG_SHELL $0 --fallback-echo "X$testring" 2>/dev/null` \ - = "XX$testring") >/dev/null 2>&1 && - new_result=`expr "X$testring" : ".*" 2>&1` && - lt_cv_sys_max_cmd_len=$new_result && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - testring=$testring$testring - done - testring= - # Add a significant safety factor because C++ compilers can tack on massive - # amounts of additional arguments before passing them to the linker. - # It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - ;; - esac - -fi - -if test -n $lt_cv_sys_max_cmd_len ; then - echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 -echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6 -else - echo "$as_me:$LINENO: result: none" >&5 -echo "${ECHO_T}none" >&6 -fi - # Check for command to grab the raw symbol name followed by C symbol from nm. -echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 -echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6 +echo "$as_me:$LINENO: checking command to parse $NM output" >&5 +echo $ECHO_N "checking command to parse $NM output... $ECHO_C" >&6 if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -7029,10 +5026,10 @@ sympat='\([_A-Za-z][_A-Za-z0-9]*\)' symxfrm='\1 \2\3 \3' # Transform an extracted symbol line into a proper C declaration -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" +lt_cv_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" +lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" # Define system-specific variables. case $host_os in @@ -7043,11 +5040,8 @@ cygwin* | mingw* | pw32*) symcode='[ABCDGISTW]' ;; hpux*) # Its linker distinguishes data from code symbols - if test "$host_cpu" = ia64; then - symcode='[ABCDEGRST]' - fi - lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" - lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + lt_cv_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ;; irix* | nonstopux*) symcode='[BCDEGRST]' @@ -7065,27 +5059,25 @@ esac # Handle CRLF in mingw tool chain opt_cr= -case $build_os in +case $host_os in mingw*) opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # If we're using GNU nm, then use its standard symbol codes. -case `$NM -V 2>&1` in -*GNU* | *'with BFD'*) - symcode='[ABCDGISTW]' ;; -esac +if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then + symcode='[ABCDGISTW]' +fi # Try without a prefix undercore, then with it. for ac_symprfx in "" "_"; do # Write the raw and C identifiers. - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" +lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" # Check to see that the pipe works correctly. pipe_works=no - rm -f conftest* cat > conftest.$ac_ext </dev/null; then - if grep ' nm_test_func$' "$nlist" >/dev/null; then + if egrep ' nm_test_var$' "$nlist" >/dev/null; then + if egrep ' nm_test_func$' "$nlist" >/dev/null; then cat < conftest.$ac_ext #ifdef __cplusplus extern "C" { @@ -7128,27 +5120,27 @@ extern "C" { EOF # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + eval "$lt_cv_global_symbol_to_cdecl"' < "$nlist" >> conftest.$ac_ext' cat <> conftest.$ac_ext #if defined (__STDC__) && __STDC__ -# define lt_ptr_t void * +# define lt_ptr void * #else -# define lt_ptr_t char * +# define lt_ptr char * # define const #endif /* The mapping between symbol names and symbols. */ const struct { const char *name; - lt_ptr_t address; + lt_ptr address; } lt_preloaded_symbols[] = { EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + sed "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr) \&\2},/" < "$nlist" >> conftest.$ac_ext cat <<\EOF >> conftest.$ac_ext - {0, (lt_ptr_t) 0} + {0, (lt_ptr) 0} }; #ifdef __cplusplus @@ -7157,19 +5149,19 @@ EOF EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext - lt_save_LIBS="$LIBS" - lt_save_CFLAGS="$CFLAGS" + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" - CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + CFLAGS="$CFLAGS$no_builtin_flag" if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext}; then + (exit $ac_status); } && test -s conftest$ac_exeext; then pipe_works=yes fi - LIBS="$lt_save_LIBS" - CFLAGS="$lt_save_CFLAGS" + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" else echo "cannot find nm_test_func in $nlist" >&5 fi @@ -7195,10 +5187,16 @@ done fi +global_symbol_pipe="$lt_cv_sys_global_symbol_pipe" if test -z "$lt_cv_sys_global_symbol_pipe"; then - lt_cv_sys_global_symbol_to_cdecl= + global_symbol_to_cdecl= + global_symbol_to_c_name_address= +else + global_symbol_to_cdecl="$lt_cv_global_symbol_to_cdecl" + global_symbol_to_c_name_address="$lt_cv_global_symbol_to_c_name_address" fi -if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then +if test -z "$global_symbol_pipe$global_symbol_to_cdec$global_symbol_to_c_name_address"; +then echo "$as_me:$LINENO: result: failed" >&5 echo "${ECHO_T}failed" >&6 else @@ -7206,150 +5204,264 @@ else echo "${ECHO_T}ok" >&6 fi -echo "$as_me:$LINENO: checking for objdir" >&5 -echo $ECHO_N "checking for objdir... $ECHO_C" >&6 -if test "${lt_cv_objdir+set}" = set; then + +for ac_header in dlfcn.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_header_compiler=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc in + yes:no ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; + no:yes ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - lt_cv_objdir=.libs + eval "$as_ac_Header=$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + + + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 +echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6 +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 else - # MS-DOS does not allow filenames that begin with a dot. - lt_cv_objdir=_libs + case $MAGIC_CMD in + /*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; + ?:/*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path. + ;; + *) + ac_save_MAGIC_CMD="$MAGIC_CMD" + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="/usr/bin:$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + egrep "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$ac_save_ifs" + MAGIC_CMD="$ac_save_MAGIC_CMD" + ;; +esac fi -rmdir .libs 2>/dev/null + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +echo "${ECHO_T}$MAGIC_CMD" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 fi -echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 -echo "${ECHO_T}$lt_cv_objdir" >&6 -objdir=$lt_cv_objdir +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + echo "$as_me:$LINENO: checking for file" >&5 +echo $ECHO_N "checking for file... $ECHO_C" >&6 +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $MAGIC_CMD in + /*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; + ?:/*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path. + ;; + *) + ac_save_MAGIC_CMD="$MAGIC_CMD" + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="/usr/bin:$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + egrep "$file_magic_regex" > /dev/null; then + : + else + cat <&2 +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org +EOF + fi ;; + esac + fi + break + fi + done + IFS="$ac_save_ifs" + MAGIC_CMD="$ac_save_MAGIC_CMD" + ;; +esac +fi +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +echo "${ECHO_T}$MAGIC_CMD" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + else + MAGIC_CMD=: + fi +fi -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES fi ;; esac -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -Xsed='sed -e s/^X//' -sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' - -# Constants: -rm="rm -f" - -# Global variables: -default_ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except M$VC, -# which needs '.lib'). -libext=a -ltmain="$ac_aux_dir/ltmain.sh" -ofile="$default_ofile" -with_gnu_ld="$lt_cv_prog_gnu_ld" - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. -set dummy ${ac_tool_prefix}ar; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_AR+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$AR"; then - ac_cv_prog_AR="$AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AR="${ac_tool_prefix}ar" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -AR=$ac_cv_prog_AR -if test -n "$AR"; then - echo "$as_me:$LINENO: result: $AR" >&5 -echo "${ECHO_T}$AR" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -fi -if test -z "$ac_cv_prog_AR"; then - ac_ct_AR=$AR - # Extract the first word of "ar", so it can be a program name with args. -set dummy ar; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_AR+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_AR"; then - ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_AR="ar" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - - test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false" -fi -fi -ac_ct_AR=$ac_cv_prog_ac_ct_AR -if test -n "$ac_ct_AR"; then - echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 -echo "${ECHO_T}$ac_ct_AR" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - AR=$ac_ct_AR -else - AR="$ac_cv_prog_AR" -fi - if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 @@ -7511,6 +5623,135 @@ else fi +enable_dlopen=no +enable_win32_dll=no + +# Check whether --enable-libtool-lock or --disable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then + enableval="$enable_libtool_lock" + +fi; +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +*-*-irix6*) + # Find out which ABI we are using. + echo '#line 5641 "configure"' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 +echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6 +if test "${lt_cv_cc_needs_belf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + lt_cv_cc_needs_belf=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +lt_cv_cc_needs_belf=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 +echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6 + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; + + +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" +need_locks="$enable_libtool_lock" + old_CC="$CC" old_CFLAGS="$CFLAGS" @@ -7519,18 +5760,40 @@ test -z "$AR" && AR=ar test -z "$AR_FLAGS" && AR_FLAGS=cru test -z "$AS" && AS=as test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$LD" && LD=ld test -z "$LN_S" && LN_S="ln -s" test -z "$MAGIC_CMD" && MAGIC_CMD=file test -z "$NM" && NM=nm -test -z "$SED" && SED=sed test -z "$OBJDUMP" && OBJDUMP=objdump test -z "$RANLIB" && RANLIB=: test -z "$STRIP" && STRIP=: test -z "$ac_objext" && ac_objext=o +if test x"$host" != x"$build"; then + ac_tool_prefix=${host_alias}- +else + ac_tool_prefix= +fi + +# Transform linux* to *-*-linux-gnu*, to support old configure scripts. +case $host_os in +linux-gnu*) ;; +linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` +esac + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' old_postinstall_cmds='chmod 644 $oldlib' @@ -7548,150 +5811,24 @@ if test -n "$RANLIB"; then old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi -# Only perform the check for file, if the check method requires it -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 -echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6 -if test "${lt_cv_path_MAGIC_CMD+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +# Allow CC to be a program name with arguments. +set dummy $CC +compiler="$2" + +echo "$as_me:$LINENO: checking for objdir" >&5 +echo $ECHO_N "checking for objdir... $ECHO_C" >&6 +rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + objdir=.libs else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/${ac_tool_prefix}file; then - lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac + # MS-DOS does not allow filenames that begin with a dot. + objdir=_libs fi +rmdir .libs 2>/dev/null +echo "$as_me:$LINENO: result: $objdir" >&5 +echo "${ECHO_T}$objdir" >&6 -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 -echo "${ECHO_T}$MAGIC_CMD" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - echo "$as_me:$LINENO: checking for file" >&5 -echo $ECHO_N "checking for file... $ECHO_C" >&6 -if test "${lt_cv_path_MAGIC_CMD+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/file; then - lt_cv_path_MAGIC_CMD="$ac_dir/file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac -fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 -echo "${ECHO_T}$MAGIC_CMD" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - else - MAGIC_CMD=: - fi -fi - - fi - ;; -esac - -enable_dlopen=no -enable_win32_dll=no - -# Check whether --enable-libtool-lock or --disable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then - enableval="$enable_libtool_lock" - -fi; -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Check whether --with-pic or --without-pic was given. @@ -7703,447 +5840,410 @@ else fi; test -z "$pic_mode" && pic_mode=default -# Use C for the default configuration in the libtool script -tagname= -lt_save_CC="$CC" -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -# Source file extension for C test sources. -ac_ext=c - -# Object file extension for compiled C test sources. -objext=o -objext=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;\n" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}\n' - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# -# Check for any special shared library compilation flags. -# -lt_prog_cc_shlib= -if test "$GCC" = no; then - case $host_os in - sco3.2v5*) - lt_prog_cc_shlib='-belf' - ;; - esac -fi -if test -n "$lt_prog_cc_shlib"; then - { echo "$as_me:$LINENO: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&5 -echo "$as_me: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&2;} - if echo "$old_CC $old_CFLAGS " | grep "[ ]$lt_prog_cc_shlib[ ]" >/dev/null; then : - else - { echo "$as_me:$LINENO: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5 -echo "$as_me: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;} - lt_cv_prog_cc_can_build_shared=no - fi -fi - - -# -# Check to make sure the static flag actually works. -# -echo "$as_me:$LINENO: checking if $compiler static flag $lt_prog_compiler_static works" >&5 -echo $ECHO_N "checking if $compiler static flag $lt_prog_compiler_static works... $ECHO_C" >&6 -if test "${lt_prog_compiler_static_works+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_prog_compiler_static_works=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_prog_compiler_static" - printf "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - else - lt_prog_compiler_static_works=yes - fi - fi - $rm conftest* - LDFLAGS="$save_LDFLAGS" - -fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 -echo "${ECHO_T}$lt_prog_compiler_static_works" >&6 - -if test x"$lt_prog_compiler_static_works" = xyes; then - : -else - lt_prog_compiler_static= -fi - - - - -lt_prog_compiler_no_builtin_flag= - -if test "$GCC" = yes; then - lt_prog_compiler_no_builtin_flag=' -fno-builtin' - - echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 -if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_cv_prog_compiler_rtti_exceptions=no - ac_outfile=conftest.$ac_objext - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="-fno-rtti -fno-exceptions" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7821: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:7825: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test ! -s conftest.err; then - lt_cv_prog_compiler_rtti_exceptions=yes - fi - fi - $rm conftest* - -fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 - -if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then - lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" -else - : -fi - -fi - -lt_prog_compiler_wl= -lt_prog_compiler_pic= -lt_prog_compiler_static= - +# We assume here that the value for lt_cv_prog_cc_pic will not be cached +# in isolation, and that seeing it set (from the cache) indicates that +# the associated values are set (in the cache) correctly too. echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 +if test "${lt_cv_prog_cc_pic+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_cc_pic= + lt_cv_prog_cc_shlib= + lt_cv_prog_cc_wl= + lt_cv_prog_cc_static= + lt_cv_prog_cc_no_builtin= + lt_cv_prog_cc_can_build_shared=$can_build_shared if test "$GCC" = yes; then - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_static='-static' + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static='-static' case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - fi + aix*) + # Below there is a dirty hack to force normal static linking with -ldl + # The problem is because libdl dynamically linked with both libc and + # libC (AIX C++ library), which obviously doesn't included in libraries + # list by gcc. This cause undefined symbols with -static flags. + # This hack allows C programs to be linked with "-static -ldl", but + # not sure about C++ programs. + lt_cv_prog_cc_static="$lt_cv_prog_cc_static ${lt_cv_prog_cc_wl}-lC" ;; - amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. - lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + lt_cv_prog_cc_pic='-m68020 -resident32 -malways-restore-a4' ;; - - beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; - - mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; - darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic='-fno-common' + lt_cv_prog_cc_pic='-fno-common' ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - lt_prog_compiler_can_build_shared=no - enable_shared=no + cygwin* | mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_cv_prog_cc_pic='-DDLL_EXPORT' ;; - sysv4*MP*) if test -d /usr/nec; then - lt_prog_compiler_pic=-Kconform_pic + lt_cv_prog_cc_pic=-Kconform_pic fi ;; - - hpux*) - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case "$host_cpu" in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - ;; - *) - lt_prog_compiler_pic='-fPIC' + lt_cv_prog_cc_pic='-fPIC' ;; esac else - # PORTME Check for flag to pass linker flags through the system compiler. + # PORTME Check for PIC flags for the system compiler. case $host_os in - aix*) - lt_prog_compiler_wl='-Wl,' + aix3* | aix4* | aix5*) + lt_cv_prog_cc_wl='-Wl,' + # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' + lt_cv_prog_cc_static='-Bstatic' else - lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + lt_cv_prog_cc_static='-bnso -bI:/lib/syscalls.exp' fi ;; - mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; - hpux9* | hpux10* | hpux11*) - lt_prog_compiler_wl='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case "$host_cpu" in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - lt_prog_compiler_static='${wl}-a ${wl}archive' + # Is there a better lt_cv_prog_cc_static that works with the bundled CC? + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static="${lt_cv_prog_cc_wl}-a ${lt_cv_prog_cc_wl}archive" + lt_cv_prog_cc_pic='+Z' ;; irix5* | irix6* | nonstopux*) - lt_prog_compiler_wl='-Wl,' + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static='-non_shared' # PIC (with -KPIC) is the default. - lt_prog_compiler_static='-non_shared' + ;; + + cygwin* | mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_cv_prog_cc_pic='-DDLL_EXPORT' ;; newsos6) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - linux*) - case $CC in - icc|ecc) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-static' - ;; - ccc) - lt_prog_compiler_wl='-Wl,' - # All Alpha code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - esac + lt_cv_prog_cc_pic='-KPIC' + lt_cv_prog_cc_static='-Bstatic' ;; osf3* | osf4* | osf5*) - lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. - lt_prog_compiler_static='-non_shared' + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static='-non_shared' ;; sco3.2v5*) - lt_prog_compiler_pic='-Kpic' - lt_prog_compiler_static='-dn' + lt_cv_prog_cc_pic='-Kpic' + lt_cv_prog_cc_static='-dn' + lt_cv_prog_cc_shlib='-belf' ;; solaris*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' + lt_cv_prog_cc_pic='-KPIC' + lt_cv_prog_cc_static='-Bstatic' + lt_cv_prog_cc_wl='-Wl,' ;; sunos4*) - lt_prog_compiler_wl='-Qoption ld ' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' + lt_cv_prog_cc_pic='-PIC' + lt_cv_prog_cc_static='-Bstatic' + lt_cv_prog_cc_wl='-Qoption ld ' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' + lt_cv_prog_cc_pic='-KPIC' + lt_cv_prog_cc_static='-Bstatic' + lt_cv_prog_cc_wl='-Wl,' + ;; + + uts4*) + lt_cv_prog_cc_pic='-pic' + lt_cv_prog_cc_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then - lt_prog_compiler_pic='-Kconform_pic' - lt_prog_compiler_static='-Bstatic' + lt_cv_prog_cc_pic='-Kconform_pic' + lt_cv_prog_cc_static='-Bstatic' fi ;; - uts4*) - lt_prog_compiler_pic='-pic' - lt_prog_compiler_static='-Bstatic' - ;; - *) - lt_prog_compiler_can_build_shared=no + lt_cv_prog_cc_can_build_shared=no ;; esac fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic" >&6 +fi -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic"; then - echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6 -if test "${lt_prog_compiler_pic_works+set}" = set; then +if test -z "$lt_cv_prog_cc_pic"; then + echo "$as_me:$LINENO: result: none" >&5 +echo "${ECHO_T}none" >&6 +else + echo "$as_me:$LINENO: result: $lt_cv_prog_cc_pic" >&5 +echo "${ECHO_T}$lt_cv_prog_cc_pic" >&6 + + # Check to make sure the pic_flag actually works. + echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_cv_prog_cc_pic works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_cv_prog_cc_pic works... $ECHO_C" >&6 + if test "${lt_cv_prog_cc_pic_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - lt_prog_compiler_pic_works=no - ac_outfile=conftest.$ac_objext - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic -DPIC" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8053: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:8057: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test ! -s conftest.err; then - lt_prog_compiler_pic_works=yes - fi - fi - $rm conftest* + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $lt_cv_prog_cc_pic -DPIC" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" -fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6 +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + case $host_os in + hpux9* | hpux10* | hpux11*) + # On HP-UX, both CC and GCC only warn that PIC is supported... then + # they create non-PIC objects. So, if there were any warnings, we + # assume that PIC is not supported. + if test -s conftest.err; then + lt_cv_prog_cc_pic_works=no + else + lt_cv_prog_cc_pic_works=yes + fi + ;; + *) + lt_cv_prog_cc_pic_works=yes + ;; + esac -if test x"$lt_prog_compiler_pic_works" = xyes; then - case $lt_prog_compiler_pic in - "" | " "*) ;; - *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; - esac else - lt_prog_compiler_pic= - lt_prog_compiler_can_build_shared=no -fi + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 + lt_cv_prog_cc_pic_works=no fi -case "$host_os" in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic= - ;; - *) - lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" - ;; -esac +rm -f conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" +fi + + + if test "X$lt_cv_prog_cc_pic_works" = Xno; then + lt_cv_prog_cc_pic= + lt_cv_prog_cc_can_build_shared=no + else + lt_cv_prog_cc_pic=" $lt_cv_prog_cc_pic" + fi + + echo "$as_me:$LINENO: result: $lt_cv_prog_cc_pic_works" >&5 +echo "${ECHO_T}$lt_cv_prog_cc_pic_works" >&6 +fi + +# Check for any special shared library compilation flags. +if test -n "$lt_cv_prog_cc_shlib"; then + { echo "$as_me:$LINENO: WARNING: \`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries" >&5 +echo "$as_me: WARNING: \`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries" >&2;} + if echo "$old_CC $old_CFLAGS " | egrep -e "[ ]$lt_cv_prog_cc_shlib[ ]" >/dev/null; then : + else + { echo "$as_me:$LINENO: WARNING: add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5 +echo "$as_me: WARNING: add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;} + lt_cv_prog_cc_can_build_shared=no + fi +fi + +echo "$as_me:$LINENO: checking if $compiler static flag $lt_cv_prog_cc_static works" >&5 +echo $ECHO_N "checking if $compiler static flag $lt_cv_prog_cc_static works... $ECHO_C" >&6 +if test "${lt_cv_prog_cc_static_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_cc_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_cv_prog_cc_static" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + lt_cv_prog_cc_static_works=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + +fi + + +# Belt *and* braces to stop my trousers falling down: +test "X$lt_cv_prog_cc_static_works" = Xno && lt_cv_prog_cc_static= +echo "$as_me:$LINENO: result: $lt_cv_prog_cc_static_works" >&5 +echo "${ECHO_T}$lt_cv_prog_cc_static_works" >&6 + +pic_flag="$lt_cv_prog_cc_pic" +special_shlib_compile_flags="$lt_cv_prog_cc_shlib" +wl="$lt_cv_prog_cc_wl" +link_static_flag="$lt_cv_prog_cc_static" +no_builtin_flag="$lt_cv_prog_cc_no_builtin" +can_build_shared="$lt_cv_prog_cc_can_build_shared" + + +# Check to see if options -o and -c are simultaneously supported by compiler echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 -if test "${lt_cv_prog_compiler_c_o+set}" = set; then +if test "${lt_cv_compiler_c_o+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - lt_cv_prog_compiler_c_o=no - $rm -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - # According to Tom Tromey, Ian Lance Taylor reported there are C compilers - # that will create temporary files in the current directory regardless of - # the output directory. Thus, making CWD read-only will cause this test - # to fail, enabling locking or at least warning the user not to do parallel - # builds. - chmod -w . - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8120: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:8124: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test ! -s out/conftest.err; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . - $rm conftest* out/* - rmdir out - cd .. - rmdir conftest - $rm conftest* +$rm -r conftest 2>/dev/null +mkdir conftest +cd conftest +echo "int some_variable = 0;" > conftest.$ac_ext +mkdir out +# According to Tom Tromey, Ian Lance Taylor reported there are C compilers +# that will create temporary files in the current directory regardless of +# the output directory. Thus, making CWD read-only will cause this test +# to fail, enabling locking or at least warning the user not to do parallel +# builds. +chmod -w . +save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -o out/conftest2.$ac_objext" +compiler_c_o=no +if { (eval echo configure:6155: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s out/conftest.err; then + lt_cv_compiler_c_o=no + else + lt_cv_compiler_c_o=yes + fi +else + # Append any errors to the config.log. + cat out/conftest.err 1>&5 + lt_cv_compiler_c_o=no +fi +CFLAGS="$save_CFLAGS" +chmod u+w . +$rm conftest* out/* +rmdir out +cd .. +rmdir conftest +$rm -r conftest 2>/dev/null fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6 +compiler_c_o=$lt_cv_compiler_c_o +echo "$as_me:$LINENO: result: $compiler_c_o" >&5 +echo "${ECHO_T}$compiler_c_o" >&6 +if test x"$compiler_c_o" = x"yes"; then + # Check to see if we can write to a .lo + echo "$as_me:$LINENO: checking if $compiler supports -c -o file.lo" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.lo... $ECHO_C" >&6 + if test "${lt_cv_compiler_o_lo+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + lt_cv_compiler_o_lo=no + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -c -o conftest.lo" + save_objext="$ac_objext" + ac_objext=lo + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" + +int +main () +{ +int some_variable = 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + lt_cv_compiler_o_lo=no + else + lt_cv_compiler_o_lo=yes + fi + +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest.$ac_ext + ac_objext="$save_objext" + CFLAGS="$save_CFLAGS" + +fi + + compiler_o_lo=$lt_cv_compiler_o_lo + echo "$as_me:$LINENO: result: $compiler_o_lo" >&5 +echo "${ECHO_T}$compiler_o_lo" >&6 +else + compiler_o_lo=no +fi + +# Check to see if we can do hard links to lock some files if needed hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then +if test "$compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 @@ -8164,72 +6264,130 @@ else need_locks=no fi -echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 +if test "$GCC" = yes; then + # Check to see if options -fno-rtti -fno-exceptions are supported by compiler + echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 + echo "int some_variable = 0;" > conftest.$ac_ext + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.$ac_ext" + compiler_rtti_exceptions=no + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" - runpath_var= - allow_undefined_flag= - enable_shared_with_static_runtimes=no - archive_cmds= - archive_expsym_cmds= - old_archive_From_new_cmds= - old_archive_from_expsyms_cmds= - export_dynamic_flag_spec= - whole_archive_flag_spec= - thread_safe_flag_spec= - hardcode_libdir_flag_spec= - hardcode_libdir_flag_spec_ld= - hardcode_libdir_separator= - hardcode_direct=no - hardcode_minus_L=no - hardcode_shlibpath_var=unsupported - link_all_deplibs=unknown - hardcode_automatic=no - module_cmds= - module_expsym_cmds= - always_export_symbols=no - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - include_expsyms= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. - exclude_expsyms="_GLOBAL_OFFSET_TABLE_" - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - extract_expsyms_cmds= - - case $host_os in - cygwin* | mingw* | pw32*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no +int +main () +{ +int some_variable = 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + compiler_rtti_exceptions=no + else + compiler_rtti_exceptions=yes fi - ;; - openbsd*) + +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + echo "$as_me:$LINENO: result: $compiler_rtti_exceptions" >&5 +echo "${ECHO_T}$compiler_rtti_exceptions" >&6 + + if test "$compiler_rtti_exceptions" = "yes"; then + no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions' + else + no_builtin_flag=' -fno-builtin' + fi +fi + +# See if the linker supports building shared libraries. +echo "$as_me:$LINENO: checking whether the linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the linker ($LD) supports shared libraries... $ECHO_C" >&6 + +allow_undefined_flag= +no_undefined_flag= +need_lib_prefix=unknown +need_version=unknown +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +archive_cmds= +archive_expsym_cmds= +old_archive_from_new_cmds= +old_archive_from_expsyms_cmds= +export_dynamic_flag_spec= +whole_archive_flag_spec= +thread_safe_flag_spec= +hardcode_into_libs=no +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no +hardcode_shlibpath_var=unsupported +runpath_var= +link_all_deplibs=unknown +always_export_symbols=no +export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols' +# include_expsyms should be a list of space-separated symbols to be *always* +# included in the symbol list +include_expsyms= +# exclude_expsyms can be an egrep regular expression of symbols to exclude +# it will be wrapped by ` (' and `)$', so one must not match beginning or +# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', +# as well as any symbol that contains `d'. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_" +# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out +# platforms (ab)use it in PIC code, but their linkers get confused if +# the symbol is explicitly referenced. Since portable code cannot +# rely on this symbol name, it's probably fine to never include it in +# preloaded symbol tables. +extract_expsyms_cmds= + +case $host_os in +cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then with_gnu_ld=no - ;; - esac + fi + ;; +openbsd*) + with_gnu_ld=no + ;; +esac - ld_shlibs=yes - if test "$with_gnu_ld" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' - # See if GNU ld supports shared libraries. - case $host_os in - aix3* | aix4* | aix5*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - ld_shlibs=no - cat <&2 + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX, the GNU linker is very broken + # Note:Check GNU linker on AIX 5-IA64 when/if it becomes available. + ld_shlibs=no + cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. @@ -8238,73 +6396,125 @@ echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared librar *** so that a non-GNU linker is found, and then restart. EOF - fi - ;; + ;; - amigaos*) - archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes - # Samuel A. Falvo II reports - # that the semantics of dynamic libraries on AmigaOS, at least up - # to version 4, is to share data among multiple programs linked - # with the same dynamic library. Since this doesn't match the - # behavior of shared libraries on other platforms, we can't use - # them. - ld_shlibs=no - ;; + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can use + # them. + ld_shlibs=no + ;; - beos*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs=no - fi - ;; - - cygwin* | mingw* | pw32*) - # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec='-L$libdir' + beos*) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported - always_export_symbols=no - enable_shared_with_static_runtimes=yes - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; - if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - else - ld_shlibs=no - fi + cygwin* | mingw* | pw32*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + allow_undefined_flag=unsupported + always_export_symbols=yes + + extract_expsyms_cmds='test -f $output_objdir/impgen.c || \ + sed -e "/^# \/\* impgen\.c starts here \*\//,/^# \/\* impgen.c ends here \*\// { s/^# //;s/^# *$//; p; }" -e d < $''0 > $output_objdir/impgen.c~ + test -f $output_objdir/impgen.exe || (cd $output_objdir && \ + if test "x$HOST_CC" != "x" ; then $HOST_CC -o impgen impgen.c ; \ + else $CC -o impgen impgen.c ; fi)~ + $output_objdir/impgen $dir/$soroot > $output_objdir/$soname-def' + + old_archive_from_expsyms_cmds='$DLLTOOL --as=$AS --dllname $soname --def $output_objdir/$soname-def --output-lib $output_objdir/$newlib' + + # cygwin and mingw dlls have different entry points and sets of symbols + # to exclude. + # FIXME: what about values for MSVC? + dll_entry=__cygwin_dll_entry@12 + dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12~ + case $host_os in + mingw*) + # mingw values + dll_entry=_DllMainCRTStartup@12 + dll_exclude_symbols=DllMain@12,DllMainCRTStartup@12,DllEntryPoint@12~ ;; + esac - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= + # mingw and cygwin differ, and it's simplest to just exclude the union + # of the two symbol sets. + dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12,DllMainCRTStartup@12,DllEntryPoint@12 + + # recent cygwin and mingw systems supply a stub DllMain which the user + # can override, but on older systems we have to supply one (in ltdll.c) + if test "x$lt_cv_need_dllmain" = "xyes"; then + ltdll_obj='$output_objdir/$soname-ltdll.'"$ac_objext " + ltdll_cmds='test -f $output_objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $''0 > $output_objdir/$soname-ltdll.c~ + test -f $output_objdir/$soname-ltdll.$ac_objext || (cd $output_objdir && $CC -c $soname-ltdll.c)~' + else + ltdll_obj= + ltdll_cmds= + fi + + # Extract the symbol export list from an `--export-all' def file, + # then regenerate the def file from the symbol export list, so that + # the compiled dll only exports the symbol export list. + # Be careful not to strip the DATA tag left be newer dlltools. + export_symbols_cmds="$ltdll_cmds"' + $DLLTOOL --export-all --exclude-symbols '$dll_exclude_symbols' --output-def $output_objdir/$soname-def '$ltdll_obj'$libobjs $convenience~ + sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]*//" -e "s/ *;.*$//" < $output_objdir/$soname-def > $export_symbols' + + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is. + # If DATA tags from a recent dlltool are present, honour them! + archive_expsym_cmds='if test "x`sed 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname-def; else - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; + echo EXPORTS > $output_objdir/$soname-def; + _lt_hint=1; + cat $export_symbols | while read symbol; do + set dummy \$symbol; + case \$# in + 2) echo " \$2 @ \$_lt_hint ; " >> $output_objdir/$soname-def;; + 4) echo " \$2 \$3 \$4 ; " >> $output_objdir/$soname-def; _lt_hint=`expr \$_lt_hint - 1`;; + *) echo " \$2 @ \$_lt_hint \$3 ; " >> $output_objdir/$soname-def;; + esac; + _lt_hint=`expr 1 + \$_lt_hint`; + done; + fi~ + '"$ltdll_cmds"' + $CC -Wl,--base-file,$output_objdir/$soname-base '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~ + $CC -Wl,--base-file,$output_objdir/$soname-base $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp --output-lib $output_objdir/$libname.dll.a~ + $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags' + ;; - solaris* | sysv5*) - if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then - ld_shlibs=no - cat <&2 + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool @@ -8314,754 +6524,515 @@ EOF *** used, and then restart. EOF - elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - - sunos4*) - archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - *) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - - if test "$ld_shlibs" = yes; then - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec= - fi + elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no fi - else - # PORTME fill in a description of your system's linker (not GNU ld) + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' case $host_os in - aix3*) - allow_undefined_flag=unsupported - always_export_symbols=yes - archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L=yes - if test "$GCC" = yes && test -z "$link_static_flag"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct=unsupported - fi - ;; - - aix4* | aix5*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - if $NM -V 2>&1 | grep 'GNU' > /dev/null; then - export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix5*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds='' - hardcode_direct=yes - hardcode_libdir_separator=':' - link_all_deplibs=yes - - if test "$GCC" = yes; then - case $host_os in aix4.012|aix4.012.*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && \ - strings "$collect2name" | grep resolve_lib_name >/dev/null - then - # We have reworked collect2 - hardcode_direct=yes - else - # We have old collect2 - hardcode_direct=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L=yes - hardcode_libdir_flag_spec='-L$libdir' - hardcode_libdir_separator= - fi - esac - shared_flag='-shared' - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - always_export_symbols=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag='-berok' - # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag="-z nodefs" - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag=' ${wl}-bernotok' - allow_undefined_flag=' ${wl}-berok' - # -bexpall does not export symbols beginning with underscore (_) - always_export_symbols=yes - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec=' ' - archive_cmds_need_lc=yes - # This is similar to how AIX traditionally builds it's shared libraries. - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - # see comment about different semantics on the GNU ld section - ld_shlibs=no - ;; - - bsdi4*) - export_dynamic_flag_spec=-rdynamic - ;; - cygwin* | mingw* | pw32*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_From_new_cmds='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' - fix_srcfile_path='`cygpath -w "$srcfile"`' - enable_shared_with_static_runtimes=yes + # dlltool doesn't understand --whole-archive et. al. + whole_archive_flag_spec= ;; - - darwin* | rhapsody*) - if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then - archive_cmds_need_lc=no - case "$host_os" in - rhapsody* | darwin1.[012]) - allow_undefined_flag='-undefined suppress' - ;; - *) # Darwin 1.3 on - test -z ${LD_TWOLEVEL_NAMESPACE} && allow_undefined_flag='-flat_namespace -undefined suppress' - ;; - esac - # FIXME: Relying on posixy $() will cause problems for - # cross-compilation, but unfortunately the echo tests do not - # yet detect zsh echo's removal of \ escapes. Also zsh mangles - # `"' quotes if we put them in here... so don't! - lt_int_apple_cc_single_mod=no - output_verbose_link_cmd='echo' - if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then - lt_int_apple_cc_single_mod=yes - fi - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - archive_cmds='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - else - archive_cmds='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - fi - module_cmds='$CC -bundle ${wl}-bind_at_load $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -bundle $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - hardcode_direct=no - hardcode_automatic=yes - hardcode_shlibpath_var=unsupported - whole_archive_flag_spec='-all_load $convenience' - link_all_deplibs=yes - fi - ;; - - dgux*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - freebsd1*) - ld_shlibs=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd*) - archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - hpux9*) - if test "$GCC" = yes; then - archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - fi - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - export_dynamic_flag_spec='${wl}-E' - ;; - - hpux10* | hpux11*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then - case "$host_cpu" in - hppa*64*|ia64*) - archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case "$host_cpu" in - hppa*64*|ia64*) - archive_cmds='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' - ;; - *) - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - ;; - esac - fi - if test "$with_gnu_ld" = no; then - case "$host_cpu" in - hppa*64*) - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_flag_spec_ld='+b $libdir' - hardcode_libdir_separator=: - hardcode_direct=no - hardcode_shlibpath_var=no - ;; - ia64*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_direct=no - hardcode_shlibpath_var=no - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - ;; - *) - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - export_dynamic_flag_spec='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec_ld='-rpath $libdir' - fi - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - link_all_deplibs=yes - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - newsos6) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_shlibpath_var=no - ;; - - openbsd*) - hardcode_direct=yes - hardcode_shlibpath_var=no - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - else - case $host_os in - openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-R$libdir' - ;; - *) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - ;; - esac - fi - ;; - - os2*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - allow_undefined_flag=unsupported - archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - fi - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ - $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' - - # Both c and cxx compiler support -rpath directly - hardcode_libdir_flag_spec='-rpath $libdir' - fi - hardcode_libdir_separator=: - ;; - - sco3.2v5*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - export_dynamic_flag_spec='${wl}-Bexport' - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ;; - - solaris*) - no_undefined_flag=' -z text' - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' - else - archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_shlibpath_var=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; - esac - link_all_deplibs=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - hardcode_libdir_flag_spec='-L$libdir' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - sysv4) - case $host_vendor in - sni) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' - reload_cmds='$CC -r -o $output$reload_objs' - hardcode_direct=no - ;; - motorola) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no - ;; - - sysv4.3*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - export_dynamic_flag_spec='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ld_shlibs=yes - fi - ;; - - sysv4.2uw2*) - archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_minus_L=no - hardcode_shlibpath_var=no - hardcode_runpath_var=yes - runpath_var=LD_RUN_PATH - ;; - - sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) - no_undefined_flag='${wl}-z ${wl}text' - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no - ;; - - sysv5*) - no_undefined_flag=' -z text' - # $CC -shared without GNU ld will not create a library from C++ - # object files and a static libstdc++, better avoid it by now - archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - hardcode_libdir_flag_spec= - hardcode_shlibpath_var=no - runpath_var='LD_RUN_PATH' - ;; - - uts4*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - *) - ld_shlibs=no + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi ;; esac fi +else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + hardcode_direct=yes + archive_cmds='' + hardcode_libdir_separator=':' + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + esac + + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + shared_flag='${wl}-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall can do strange things, so it is better to + # generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib' + archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname ${wl}-h$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + hardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib' + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='${wl}-berok' + # This is a bit strange, but is similar to how AIX traditionally builds + # it's shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"' ~$AR -crlo $objdir/$libname$release.a $objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + ;; + + darwin* | rhapsody*) + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag='-undefined suppress' + ;; + *) # Darwin 1.3 on +# allow_undefined_flag='-undefined suppress' + ;; + esac + # FIXME: Relying on posixy $() will cause problems for + # cross-compilation, but unfortunately the echo tests do not + # yet detect zsh echo's removal of \ escapes. Also zsh mangles + # `"' quotes if we put them in here... so don't! + archive_cmds='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs && $CC $(test .$module = .yes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib ${lib}-master.o $deplibs$linker_flags $(test .$module != .yes && echo -install_name $rpath/$soname $verstring)' + # We need to add '_' to the symbols in $export_symbols first + #archive_expsym_cmds="$archive_cmds"' && strip -s $export_symbols' + hardcode_direct=yes + hardcode_shlibpath_var=no + whole_archive_flag_spec='-all_load $convenience' + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd*) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9* | hpux10* | hpux11*) + case $host_os in + hpux9*) archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ;; + *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; + esac + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_minus_L=yes # Not in the search PATH, but as the default + # location of the library. + export_dynamic_flag_spec='${wl}-E' + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + link_all_deplibs=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + openbsd*) + hardcode_direct=yes + hardcode_shlibpath_var=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case "$host_os" in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "-exported_symbol " >> $lib.exp; echo "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + #Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + + sco3.2v5*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + export_dynamic_flag_spec='${wl}-Bexport' + ;; + + solaris*) + # gcc --version < 3.0 without binutils cannot create self contained + # shared libraries reliably, requiring libgcc.a to resolve some of + # the object symbols generated in some cases. Libraries that use + # assert need libgcc.a to resolve __eprintf, for example. Linking + # a copy of libgcc.a into every shared library to guarantee resolving + # such symbols causes other problems: According to Tim Van Holder + # , C++ libraries end up with a separate + # (to the application) exception stack for one thing. + no_undefined_flag=' -z defs' + if test "$GCC" = yes; then + case `$CC --version 2>/dev/null` in + [12].*) + cat <&2 + +*** Warning: Releases of GCC earlier than version 3.0 cannot reliably +*** create self contained shared libraries on Solaris systems, without +*** introducing a dependency on libgcc.a. Therefore, libtool is disabling +*** -no-undefined support, which will at least allow you to build shared +*** libraries. However, you may find that when you link such libraries +*** into an application without using GCC, you have to manually add +*** \`gcc --print-libgcc-file-name\` to the link command. We urge you to +*** upgrade to a newer version of GCC. Another option is to rebuild your +*** current GCC to use the GNU linker from GNU binutils 2.9.1 or newer. + +EOF + no_undefined_flag= + ;; + esac + fi + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv5*) + no_undefined_flag=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec= + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=no + hardcode_shlibpath_var=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5uw7* | unixware7*) + no_undefined_flag='${wl}-z ${wl}text' + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac +fi echo "$as_me:$LINENO: result: $ld_shlibs" >&5 echo "${ECHO_T}$ld_shlibs" >&6 test "$ld_shlibs" = no && can_build_shared=no -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 - $rm conftest* - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag - allow_undefined_flag= - if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 - (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - then - archive_cmds_need_lc=no - else - archive_cmds_need_lc=yes - fi - allow_undefined_flag=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $rm conftest* - echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 -echo "${ECHO_T}$archive_cmds_need_lc" >&6 - ;; - esac - fi - ;; -esac - +# Check hardcoding attributes. echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 hardcode_action= if test -n "$hardcode_libdir_flag_spec" || \ - test -n "$runpath_var " || \ - test "X$hardcode_automatic"="Xyes" ; then + test -n "$runpath_var"; then # We can hardcode non-existant directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one - ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no && + ## test "$hardcode_shlibpath_var" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink @@ -9077,15 +7048,6 @@ fi echo "$as_me:$LINENO: result: $hardcode_action" >&5 echo "${ECHO_T}$hardcode_action" >&6 -if test "$hardcode_action" = relink; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - striplib= old_striplib= echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 @@ -9096,31 +7058,19 @@ if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 -fi - ;; - *) - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 - ;; - esac fi +reload_cmds='$LD$reload_flag -o $output$reload_objs' +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +# PORTME Fill in your ld.so characteristics echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 library_names_spec= libname_spec='lib$name' soname_spec= -shrext=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= @@ -9130,35 +7080,16 @@ shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" -if test "$GCC" = yes; then - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown +sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" case $host_os in aix3*) version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + library_names_spec='${libname}${release}.so$versuffix $libname.a' shlibpath_var=LIBPATH - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' + # AIX has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}.so$major' ;; aix4* | aix5*) @@ -9168,7 +7099,7 @@ aix4* | aix5*) hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + library_names_spec='${libname}${release}.so$major ${libname}${release}.so$versuffix $libname.so' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file @@ -9178,31 +7109,33 @@ aix4* | aix5*) # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. + # AIX (on Power*) has no versioning support, so currently we can + # not hardcode correct soname into executable. Probably we can + # add versioning support to collect2, so additional links can + # be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' + soname_spec='${libname}${release}.so$major' fi shlibpath_var=LIBPATH fi + hardcode_into_libs=yes ;; amigaos*) @@ -9212,7 +7145,7 @@ amigaos*) ;; beos*) - library_names_spec='${libname}${shared_ext}' + library_names_spec='${libname}.so' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; @@ -9220,12 +7153,13 @@ beos*) bsdi4*) version_type=linux need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + export_dynamic_flag_spec=-rdynamic # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs @@ -9233,55 +7167,29 @@ bsdi4*) cygwin* | mingw* | pw32*) version_type=windows - shrext=".dll" need_version=no need_lib_prefix=no - case $GCC,$host_os in - yes,cygwin* | yes,mingw* | yes,pw32*) + yes,cygwin*) library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll' + postinstall_cmds='dlpath=`bash 2>&1 -c '\''. $dir/${file}i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + $install_prog .libs/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`bash 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec="/lib /lib/w32api /usr/lib /usr/local/lib" - ;; - mingw*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH printed by - # mingw gcc, but we are running on Cygwin. Gcc prints its search - # path with ; separators, and with drive letters. We can handle the - # drive letters (cygwin fileutils understands them), so leave them, - # especially as we might pass files found there to a mingw objdump, - # which wouldn't understand a cygwinified path. Ahh. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' - ;; - esac ;; - + yes,mingw*) + library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g" -e "s,=/,/,g"` + ;; + yes,pw32*) + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/./-/g'`${versuffix}.dll' + ;; *) - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' @@ -9297,25 +7205,10 @@ darwin* | rhapsody*) # FIXME: Relying on posixy $() will cause problems for # cross-compilation, but unfortunately the echo tests do not # yet detect zsh echo's removal of \ escapes. - library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' + library_names_spec='${libname}${release}${versuffix}.$(test .$module = .yes && echo so || echo dylib) ${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib) ${libname}.$(test .$module = .yes && echo so || echo dylib)' + soname_spec='${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib)' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH - shrext='$(test .$module = .yes && echo .so || echo .dylib)' - # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. - if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then - sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` - fi - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) @@ -9327,12 +7220,12 @@ freebsd*) version_type=freebsd-$objformat case $version_type in freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' need_version=no need_lib_prefix=no ;; freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix' need_version=yes ;; esac @@ -9341,11 +7234,7 @@ freebsd*) freebsd2*) shlibpath_overrides_runpath=yes ;; - freebsd3.01* | freebsdelf3.01*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - *) # from 3.2 on + *) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; @@ -9356,8 +7245,8 @@ gnu*) version_type=linux need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so' + soname_spec='${libname}${release}.so$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; @@ -9365,45 +7254,14 @@ gnu*) hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. + dynamic_linker="$host_os dld.sl" version_type=sunos need_lib_prefix=no need_version=no - case "$host_cpu" in - ia64*) - shrext='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl' + soname_spec='${libname}${release}.sl$major' # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; @@ -9411,29 +7269,21 @@ hpux9* | hpux10* | hpux11*) irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux - else - version_type=irix - fi ;; + *) version_type=irix ;; esac need_lib_prefix=no need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; + *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; @@ -9442,21 +7292,20 @@ irix5* | irix6* | nonstopux*) shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) +linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*) dynamic_linker=no ;; # This must be Linux ELF. -linux*) +linux-gnu*) version_type=linux need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no @@ -9479,12 +7328,12 @@ netbsd*) need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so' + soname_spec='${libname}${release}.so$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH @@ -9494,17 +7343,7 @@ netbsd*) newsos6) version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -nto-qnx) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; @@ -9513,47 +7352,46 @@ openbsd*) version_type=sunos need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac + case "$host_os" in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac else shlibpath_overrides_runpath=yes fi + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH ;; os2*) libname_spec='$name' - shrext=".dll" need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' + library_names_spec='$libname.dll $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf - need_lib_prefix=no need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + hardcode_into_libs=yes ;; sco3.2v5*) version_type=osf - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' shlibpath_var=LD_LIBRARY_PATH ;; @@ -9561,8 +7399,8 @@ solaris*) version_type=linux need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes @@ -9572,7 +7410,7 @@ solaris*) sunos4*) version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes @@ -9584,8 +7422,8 @@ sunos4*) sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) @@ -9606,22 +7444,31 @@ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) esac ;; +uts4*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + sysv4*MP*) if test -d /usr/nec ;then version_type=linux - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' + library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so' + soname_spec='$libname.so.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; -uts4*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - *) dynamic_linker=no ;; @@ -9630,6 +7477,57 @@ echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6 test "$dynamic_linker" = no && can_build_shared=no +# Report the final consequences. +echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $can_build_shared" >&5 +echo "${ECHO_T}$can_build_shared" >&6 + +echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 +echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +echo "$as_me:$LINENO: result: $enable_shared" >&5 +echo "${ECHO_T}$enable_shared" >&6 + +echo "$as_me:$LINENO: checking whether to build static libraries" >&5 +echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +echo "$as_me:$LINENO: result: $enable_static" >&5 +echo "${ECHO_T}$enable_static" >&6 + +if test "$hardcode_action" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown @@ -9645,94 +7543,11 @@ else lt_cv_dlopen_self=yes ;; - mingw* | pw32*) + cygwin* | mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 -if test "${ac_cv_lib_dl_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char dlopen (); -int -main () -{ -dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_dl_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dl_dlopen=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 -if test $ac_cv_lib_dl_dlopen = yes; then - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - -fi - - ;; - *) echo "$as_me:$LINENO: checking for shl_load" >&5 echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 @@ -9740,73 +7555,43 @@ if test "${ac_cv_func_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define shl_load to an innocuous variant, in case declares shl_load. - For example, HP-UX 11i declares gettimeofday. */ -#define shl_load innocuous_shl_load - +#line $LINENO "configure" +#include "confdefs.h" /* System header to define __stub macros and hopefully few prototypes, - which can conflict with char shl_load (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef shl_load - + which can conflict with char shl_load (); below. */ +#include /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" -{ #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); +char (*f) (); + +int +main () +{ /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_shl_load) || defined (__stub___shl_load) choke me #else -char (*f) () = shl_load; -#endif -#ifdef __cplusplus -} +f = shl_load; #endif -int -main () -{ -return f != shl_load; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 + (eval $ac_link) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -9815,12 +7600,10 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_func_shl_load=yes else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 ac_cv_func_shl_load=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 echo "${ECHO_T}$ac_cv_func_shl_load" >&6 @@ -9835,11 +7618,8 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -9858,21 +7638,11 @@ shl_load (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 + (eval $ac_link) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -9881,12 +7651,10 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_dld_shl_load=yes else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 ac_cv_lib_dld_shl_load=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 @@ -9900,73 +7668,43 @@ if test "${ac_cv_func_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define dlopen to an innocuous variant, in case declares dlopen. - For example, HP-UX 11i declares gettimeofday. */ -#define dlopen innocuous_dlopen - +#line $LINENO "configure" +#include "confdefs.h" /* System header to define __stub macros and hopefully few prototypes, - which can conflict with char dlopen (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef dlopen - + which can conflict with char dlopen (); below. */ +#include /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" -{ #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); +char (*f) (); + +int +main () +{ /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_dlopen) || defined (__stub___dlopen) choke me #else -char (*f) () = dlopen; -#endif -#ifdef __cplusplus -} +f = dlopen; #endif -int -main () -{ -return f != dlopen; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 + (eval $ac_link) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -9975,12 +7713,10 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_func_dlopen=yes else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 ac_cv_func_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 echo "${ECHO_T}$ac_cv_func_dlopen" >&6 @@ -9995,11 +7731,8 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -10018,21 +7751,11 @@ dlopen (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 + (eval $ac_link) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -10041,12 +7764,10 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 @@ -10062,11 +7783,8 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -10085,21 +7803,11 @@ dlopen (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 + (eval $ac_link) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -10108,12 +7816,10 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_svld_dlopen=yes else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 ac_cv_lib_svld_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 @@ -10129,11 +7835,8 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +#line $LINENO "configure" +#include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -10152,21 +7855,11 @@ dld_link (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 + (eval $ac_link) 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -10175,12 +7868,10 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_dld_dld_link=yes else echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +cat conftest.$ac_ext >&5 ac_cv_lib_dld_dld_link=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 @@ -10216,7 +7907,7 @@ fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" @@ -10232,10 +7923,10 @@ else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext <&6 fi -# Report which librarie types wil actually be built -echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 -echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 -echo "$as_me:$LINENO: result: $can_build_shared" >&5 -echo "${ECHO_T}$can_build_shared" >&6 - -echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 -echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 -test "$can_build_shared" = "no" && enable_shared=no - -# On AIX, shared libraries and static libraries use the same namespace, and -# are all built from PIC. -case "$host_os" in -aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - -aix4*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - darwin* | rhapsody*) - if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then - archive_cmds_need_lc=no - case "$host_os" in - rhapsody* | darwin1.[012]) - allow_undefined_flag='-undefined suppress' - ;; - *) # Darwin 1.3 on - test -z ${LD_TWOLEVEL_NAMESPACE} && allow_undefined_flag='-flat_namespace -undefined suppress' - ;; - esac - # FIXME: Relying on posixy $() will cause problems for - # cross-compilation, but unfortunately the echo tests do not - # yet detect zsh echo's removal of \ escapes. Also zsh mangles - # `"' quotes if we put them in here... so don't! - output_verbose_link_cmd='echo' - archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring' - module_cmds='$CC -bundle $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's - archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -bundle $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - hardcode_direct=no - hardcode_automatic=yes - hardcode_shlibpath_var=unsupported - whole_archive_flag_spec='-all_load $convenience' - link_all_deplibs=yes - fi +if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. ;; -esac -echo "$as_me:$LINENO: result: $enable_shared" >&5 -echo "${ECHO_T}$enable_shared" >&6 + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + if test "${lt_cv_archive_cmds_need_lc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + $rm conftest* + echo 'static int dummy;' > conftest.$ac_ext -echo "$as_me:$LINENO: checking whether to build static libraries" >&5 -echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 -# Make sure either enable_shared or enable_static is yes. -test "$enable_shared" = yes || enable_static=yes -echo "$as_me:$LINENO: result: $enable_static" >&5 -echo "${ECHO_T}$enable_static" >&6 + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_cv_prog_cc_wl + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi +fi -# The else clause should only fire when bootstrapping the + echo "$as_me:$LINENO: result: $lt_cv_archive_cmds_need_lc" >&5 +echo "${ECHO_T}$lt_cv_archive_cmds_need_lc" >&6 + ;; + esac +fi +need_lc=${lt_cv_archive_cmds_need_lc-yes} + +# The second clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then - # See if we are running on zsh, and set the options which allow our commands through - # without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi + : +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + test -f Makefile && make "$ltmain" +fi + +if test -f "$ltmain"; then + trap "$rm \"${ofile}T\"; exit 1" 1 2 15 + $rm -f "${ofile}T" + + echo creating $ofile + # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. - for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM SED SHELL \ - libname_spec library_names_spec soname_spec extract_expsyms_cmds \ - old_striplib striplib file_magic_cmd finish_cmds finish_eval \ - deplibs_check_method reload_flag reload_cmds need_locks \ - lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ - lt_cv_sys_global_symbol_to_c_name_address \ + for var in echo old_CC old_CFLAGS SED \ + AR AR_FLAGS CC LD LN_S NM SHELL \ + reload_flag reload_cmds wl \ + pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \ + thread_safe_flag_spec whole_archive_flag_spec libname_spec \ + library_names_spec soname_spec \ + RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \ + old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds \ + postuninstall_cmds extract_expsyms_cmds old_archive_from_expsyms_cmds \ + old_striplib striplib file_magic_cmd export_symbols_cmds \ + deplibs_check_method allow_undefined_flag no_undefined_flag \ + finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \ + global_symbol_to_c_name_address \ + hardcode_libdir_flag_spec hardcode_libdir_separator \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ - old_postinstall_cmds old_postuninstall_cmds \ - compiler \ - CC \ - LD \ - lt_prog_compiler_wl \ - lt_prog_compiler_pic \ - lt_prog_compiler_static \ - lt_prog_compiler_no_builtin_flag \ - export_dynamic_flag_spec \ - thread_safe_flag_spec \ - whole_archive_flag_spec \ - enable_shared_with_static_runtimes \ - old_archive_cmds \ - old_archive_from_new_cmds \ - predep_objects \ - postdep_objects \ - predeps \ - postdeps \ - compiler_lib_search_path \ - archive_cmds \ - archive_expsym_cmds \ - postinstall_cmds \ - postuninstall_cmds \ - old_archive_from_expsyms_cmds \ - allow_undefined_flag \ - no_undefined_flag \ - export_symbols_cmds \ - hardcode_libdir_flag_spec \ - hardcode_libdir_flag_spec_ld \ - hardcode_libdir_separator \ - hardcode_automatic \ - module_cmds \ - module_expsym_cmds \ - lt_cv_prog_compiler_c_o \ - exclude_expsyms \ - include_expsyms; do + compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do case $var in - old_archive_cmds | \ - old_archive_from_new_cmds | \ - archive_cmds | \ - archive_expsym_cmds | \ - module_cmds | \ - module_expsym_cmds | \ - old_archive_from_expsyms_cmds | \ - export_symbols_cmds | \ - extract_expsyms_cmds | reload_cmds | finish_cmds | \ - postinstall_cmds | postuninstall_cmds | \ + reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ - sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + export_symbols_cmds | archive_cmds | archive_expsym_cmds | \ + extract_expsyms_cmds | old_archive_from_expsyms_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; @@ -10581,29 +8240,14 @@ if test -f "$ltmain"; then esac done - case $lt_echo in - *'\$0 --fallback-echo"') - lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` - ;; - esac - -cfgfile="${ofile}T" - trap "$rm \"$cfgfile\"; exit 1" 1 2 15 - $rm -f "$cfgfile" - { echo "$as_me:$LINENO: creating $ofile" >&5 -echo "$as_me: creating $ofile" >&6;} - - cat <<__EOF__ >> "$cfgfile" + cat <<__EOF__ > "${ofile}T" #! $SHELL -# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) # NOTE: Changes made to this file will be lost: look at ltmain.sh. # -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. -# -# This file is part of GNU Libtool: +# Copyright (C) 1996-2000 Free Software Foundation, Inc. # Originally by Gordon Matzigkeit , 1996 # # This program is free software; you can redistribute it and/or modify @@ -10625,19 +8269,16 @@ echo "$as_me: creating $ofile" >&6;} # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. -# A sed program that does not truncate output. +# A sed that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="$SED -e s/^X//" +Xsed="${SED} -e s/^X//" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi -# The names of the tagged configurations supported by this script. -available_tags= - # ### BEGIN LIBTOOL CONFIG # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: @@ -10652,10 +8293,7 @@ build_libtool_libs=$enable_shared build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc - -# Whether or not to disallow shared libs when runtime libs are static -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes +build_libtool_need_lc=$need_lc # Whether or not to optimize for fast installation. fast_install=$enable_fast_install @@ -10671,18 +8309,12 @@ echo=$lt_echo AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS -# A C compiler. -LTCC=$lt_LTCC - -# A language-specific compiler. -CC=$lt_compiler +# The default C compiler. +CC=$lt_CC # Is the compiler the GNU C compiler? with_gcc=$GCC -# An ERE matcher. -EGREP=$lt_EGREP - # The linker used to build libraries. LD=$lt_LD @@ -10715,7 +8347,7 @@ reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl +wl=$lt_wl # Object file suffix (normally "o"). objext="$ac_objext" @@ -10723,21 +8355,18 @@ objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" -# Shared library suffix (normally ".so"). -shrext='$shrext' - # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic +pic_flag=$lt_pic_flag pic_mode=$pic_mode -# What is the maximum length of a command? -max_cmd_len=$lt_cv_sys_max_cmd_len - # Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o +compiler_c_o=$lt_compiler_c_o + +# Can we write directly to a .lo ? +compiler_o_lo=$lt_compiler_o_lo # Must we lock files when doing compilation ? need_locks=$lt_need_locks @@ -10758,10 +8387,10 @@ dlopen_self=$enable_dlopen_self dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static +link_static_flag=$lt_link_static_flag # Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag +no_builtin_flag=$lt_no_builtin_flag # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec @@ -10803,34 +8432,10 @@ archive_expsym_cmds=$lt_archive_expsym_cmds postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds -# Commands used to build a loadable module (assumed same as above if empty) -module_cmds=$lt_module_cmds -module_expsym_cmds=$lt_module_expsym_cmds - # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib -# Dependencies to place before the objects being linked to create a -# shared library. -predep_objects=$lt_predep_objects - -# Dependencies to place after the objects being linked to create a -# shared library. -postdep_objects=$lt_postdep_objects - -# Dependencies to place before the objects being linked to create a -# shared library. -predeps=$lt_predeps - -# Dependencies to place after the objects being linked to create a -# shared library. -postdeps=$lt_postdeps - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path - # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method @@ -10850,13 +8455,13 @@ finish_cmds=$lt_finish_cmds finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe +global_symbol_pipe=$lt_global_symbol_pipe # Transform the output of nm in a proper C declaration -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl +global_symbol_to_cdecl=$lt_global_symbol_to_cdecl # Transform the output of nm in a C name address pair -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address +global_symbol_to_c_name_address=$lt_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var @@ -10877,15 +8482,10 @@ hardcode_into_libs=$hardcode_into_libs # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec -# If ld is used when linking, flag to hardcode \$libdir into -# a binary during linking. This must work even if \$libdir does -# not exist. -hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld - # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator -# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct @@ -10897,10 +8497,6 @@ hardcode_minus_L=$hardcode_minus_L # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var -# Set to yes if building a shared library automatically hardcodes DIR into the library -# and all subsequent libraries and executables linked against it. -hardcode_automatic=$hardcode_automatic - # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" @@ -10936,10 +8532,9 @@ include_expsyms=$lt_include_expsyms __EOF__ - case $host_os in aix3*) - cat <<\EOF >> "$cfgfile" + cat <<\EOF >> "${ofile}T" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems @@ -10948,6 +8543,186 @@ if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi +EOF + ;; + esac + + case $host_os in + cygwin* | mingw* | pw32* | os2*) + cat <<'EOF' >> "${ofile}T" + # This is a source program that is used to create dlls on Windows + # Don't remove nor modify the starting and closing comments +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ + # This is a source program that is used to create import libraries + # on Windows for dlls which lack them. Don't remove nor modify the + # starting and closing comments +# /* impgen.c starts here */ +# /* Copyright (C) 1999-2000 Free Software Foundation, Inc. +# +# This file is part of GNU libtool. +# +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# */ +# +# #include /* for printf() */ +# #include /* for open(), lseek(), read() */ +# #include /* for O_RDONLY, O_BINARY */ +# #include /* for strdup() */ +# +# /* O_BINARY isn't required (or even defined sometimes) under Unix */ +# #ifndef O_BINARY +# #define O_BINARY 0 +# #endif +# +# static unsigned int +# pe_get16 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[2]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 2); +# return b[0] + (b[1]<<8); +# } +# +# static unsigned int +# pe_get32 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[4]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 4); +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# static unsigned int +# pe_as32 (ptr) +# void *ptr; +# { +# unsigned char *b = ptr; +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# int +# main (argc, argv) +# int argc; +# char *argv[]; +# { +# int dll; +# unsigned long pe_header_offset, opthdr_ofs, num_entries, i; +# unsigned long export_rva, export_size, nsections, secptr, expptr; +# unsigned long name_rvas, nexp; +# unsigned char *expdata, *erva; +# char *filename, *dll_name; +# +# filename = argv[1]; +# +# dll = open(filename, O_RDONLY|O_BINARY); +# if (dll < 1) +# return 1; +# +# dll_name = filename; +# +# for (i=0; filename[i]; i++) +# if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':') +# dll_name = filename + i +1; +# +# pe_header_offset = pe_get32 (dll, 0x3c); +# opthdr_ofs = pe_header_offset + 4 + 20; +# num_entries = pe_get32 (dll, opthdr_ofs + 92); +# +# if (num_entries < 1) /* no exports */ +# return 1; +# +# export_rva = pe_get32 (dll, opthdr_ofs + 96); +# export_size = pe_get32 (dll, opthdr_ofs + 100); +# nsections = pe_get16 (dll, pe_header_offset + 4 +2); +# secptr = (pe_header_offset + 4 + 20 + +# pe_get16 (dll, pe_header_offset + 4 + 16)); +# +# expptr = 0; +# for (i = 0; i < nsections; i++) +# { +# char sname[8]; +# unsigned long secptr1 = secptr + 40 * i; +# unsigned long vaddr = pe_get32 (dll, secptr1 + 12); +# unsigned long vsize = pe_get32 (dll, secptr1 + 16); +# unsigned long fptr = pe_get32 (dll, secptr1 + 20); +# lseek(dll, secptr1, SEEK_SET); +# read(dll, sname, 8); +# if (vaddr <= export_rva && vaddr+vsize > export_rva) +# { +# expptr = fptr + (export_rva - vaddr); +# if (export_rva + export_size > vaddr + vsize) +# export_size = vsize - (export_rva - vaddr); +# break; +# } +# } +# +# expdata = (unsigned char*)malloc(export_size); +# lseek (dll, expptr, SEEK_SET); +# read (dll, expdata, export_size); +# erva = expdata - export_rva; +# +# nexp = pe_as32 (expdata+24); +# name_rvas = pe_as32 (expdata+32); +# +# printf ("EXPORTS\n"); +# for (i = 0; i> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + sed '$q' "$ltmain" >> "${ofile}T" || (rm -f "${ofile}T"; exit 1) - mv -f "$cfgfile" "$ofile" || \ - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + mv -f "${ofile}T" "$ofile" || \ + (rm -f "$ofile" && cp "${ofile}T" "$ofile" && rm -f "${ofile}T") chmod +x "$ofile" - -else - # If there is no Makefile yet, we rely on a make rule to execute - # `config.status --recheck' to rerun these tests and create the - # libtool script then. - test -f Makefile && make "$ltmain" -fi - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -CC="$lt_save_CC" - - -# Check whether --with-tags or --without-tags was given. -if test "${with_tags+set}" = set; then - withval="$with_tags" - tagnames="$withval" -fi; - -if test -f "$ltmain" && test -n "$tagnames"; then - if test ! -f "${ofile}"; then - { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5 -echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} - fi - - if test -z "$LTCC"; then - eval "`$SHELL ${ofile} --config | grep '^LTCC='`" - if test -z "$LTCC"; then - { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5 -echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} - else - { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 -echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} - fi - fi - - # Extract list of available tagged configurations in $ofile. - # Note that this assumes the entire list is on one line. - available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` - - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for tagname in $tagnames; do - IFS="$lt_save_ifs" - # Check whether tagname contains only valid characters - case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in - "") ;; - *) { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5 -echo "$as_me: error: invalid tag name: $tagname" >&2;} - { (exit 1); exit 1; }; } - ;; - esac - - if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null - then - { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5 -echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} - { (exit 1); exit 1; }; } - fi - - # Update the list of available tags. - if test -n "$tagname"; then - echo appending configuration tag \"$tagname\" to $ofile - - case $tagname in - CXX) - if test -n "$CXX" && test "X$CXX" != "Xno"; then - ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - - - -archive_cmds_need_lc_CXX=no -allow_undefined_flag_CXX= -always_export_symbols_CXX=no -archive_expsym_cmds_CXX= -export_dynamic_flag_spec_CXX= -hardcode_direct_CXX=no -hardcode_libdir_flag_spec_CXX= -hardcode_libdir_flag_spec_ld_CXX= -hardcode_libdir_separator_CXX= -hardcode_minus_L_CXX=no -hardcode_automatic_CXX=no -module_cmds_CXX= -module_expsym_cmds_CXX= -link_all_deplibs_CXX=unknown -old_archive_cmds_CXX=$old_archive_cmds -no_undefined_flag_CXX= -whole_archive_flag_spec_CXX= -enable_shared_with_static_runtimes_CXX=no - -# Dependencies to place before and after the object being linked: -predep_objects_CXX= -postdep_objects_CXX= -predeps_CXX= -postdeps_CXX= -compiler_lib_search_path_CXX= - -# Source file extension for C++ test sources. -ac_ext=cc - -# Object file extension for compiled C++ test sources. -objext=o -objext_CXX=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;\n" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(int, char *) { return(0); }\n' - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# Allow CC to be a program name with arguments. -lt_save_CC=$CC -lt_save_LD=$LD -lt_save_GCC=$GCC -GCC=$GXX -lt_save_with_gnu_ld=$with_gnu_ld -lt_save_path_LD=$lt_cv_path_LD -if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then - lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx -else - unset lt_cv_prog_gnu_ld -fi -if test -n "${lt_cv_path_LDCXX+set}"; then - lt_cv_path_LD=$lt_cv_path_LDCXX -else - unset lt_cv_path_LD -fi -test -z "${LDCXX+set}" || LD=$LDCXX -CC=${CXX-"c++"} -compiler=$CC -compiler_CXX=$CC -cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` - -# We don't want -fno-exception wen compiling C++ code, so set the -# no_builtin_flag separately -if test "$GXX" = yes; then - lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' -else - lt_prog_compiler_no_builtin_flag_CXX= -fi - -if test "$GXX" = yes; then - # Set up default GNU C++ configuration - - -# Check whether --with-gnu-ld or --without-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then - withval="$with_gnu_ld" - test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi; -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - echo "$as_me:$LINENO: checking for ld used by $CC" >&5 -echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the path of ld - ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` - while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do - ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - echo "$as_me:$LINENO: checking for GNU ld" >&5 -echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 -else - echo "$as_me:$LINENO: checking for non-GNU ld" >&5 -echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 -fi -if test "${lt_cv_path_LD+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some GNU ld's only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &5 -echo "${ECHO_T}$LD" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi -test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 -echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} - { (exit 1); exit 1; }; } -echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 -echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 -if test "${lt_cv_prog_gnu_ld+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # I'd rather use --version here, but apparently some GNU ld's only accept -v. -case `"$LD" -v 2>&1 &5 -echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - # Check if GNU C++ uses GNU ld as the underlying linker, since the - # archiving commands below assume that GNU ld is being used. - if test "$with_gnu_ld" = yes; then - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - - hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - - # If archive_cmds runs LD, not CC, wlarc should be empty - # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to - # investigate it a little bit more. (MM) - wlarc='${wl}' - - # ancient GNU ld didn't support --whole-archive et. al. - if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ - grep 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec_CXX= - fi - else - with_gnu_ld=no - wlarc= - - # A generic and very simple default shared library creation - # command for GNU C++ for the case where it uses the native - # linker, instead of GNU ld. If possible, this setting should - # overridden to take advantage of the native linker features on - # the platform it is being used on. - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - fi - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' - -else - GXX=no - with_gnu_ld=no - wlarc= -fi - -# PORTME: fill in a description of your system's C++ link characteristics -echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 -ld_shlibs_CXX=yes -case $host_os in - aix3*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aix4* | aix5*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix5*) - for ld_flag in $LDFLAGS; do - case $ld_flag in - *-brtl*) - aix_use_runtimelinking=yes - break - ;; - esac - done - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds_CXX='' - hardcode_direct_CXX=yes - hardcode_libdir_separator_CXX=':' - link_all_deplibs_CXX=yes - - if test "$GXX" = yes; then - case $host_os in aix4.012|aix4.012.*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && \ - strings "$collect2name" | grep resolve_lib_name >/dev/null - then - # We have reworked collect2 - hardcode_direct_CXX=yes - else - # We have old collect2 - hardcode_direct_CXX=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L_CXX=yes - hardcode_libdir_flag_spec_CXX='-L$libdir' - hardcode_libdir_separator_CXX= - fi - esac - shared_flag='-shared' - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - always_export_symbols_CXX=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag_CXX='-berok' - # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - - hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" - - archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag_CXX="-z nodefs" - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - - hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag_CXX=' ${wl}-bernotok' - allow_undefined_flag_CXX=' ${wl}-berok' - # -bexpall does not export symbols beginning with underscore (_) - always_export_symbols_CXX=yes - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec_CXX=' ' - archive_cmds_need_lc_CXX=yes - # This is similar to how AIX traditionally builds it's shared libraries. - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - chorus*) - case $cc_basename in - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - cygwin* | mingw* | pw32*) - # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec_CXX='-L$libdir' - allow_undefined_flag_CXX=unsupported - always_export_symbols_CXX=no - enable_shared_with_static_runtimes_CXX=yes - - if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - else - ld_shlibs_CXX=no - fi - ;; - - darwin* | rhapsody*) - if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then - archive_cmds_need_lc_CXX=no - case "$host_os" in - rhapsody* | darwin1.[012]) - allow_undefined_flag_CXX='-undefined suppress' - ;; - *) # Darwin 1.3 on - test -z ${LD_TWOLEVEL_NAMESPACE} && allow_undefined_flag_CXX='-flat_namespace -undefined suppress' - ;; - esac - lt_int_apple_cc_single_mod=no - output_verbose_link_cmd='echo' - if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then - lt_int_apple_cc_single_mod=yes - fi - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - else - archive_cmds_CXX='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - fi - module_cmds_CXX='$CC -bundle ${wl}-bind_at_load $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags' - - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -bundle $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - hardcode_direct_CXX=no - hardcode_automatic_CXX=yes - hardcode_shlibpath_var_CXX=unsupported - whole_archive_flag_spec_CXX='-all_load $convenience' - link_all_deplibs_CXX=yes - fi - ;; - - dgux*) - case $cc_basename in - ec++) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - ghcx) - # Green Hills C++ Compiler - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - freebsd12*) - # C++ shared libraries reported to be fairly broken before switch to ELF - ld_shlibs_CXX=no - ;; - freebsd-elf*) - archive_cmds_need_lc_CXX=no - ;; - freebsd*) - # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF - # conventions - ld_shlibs_CXX=yes - ;; - gnu*) - ;; - hpux9*) - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_CXX=: - export_dynamic_flag_spec_CXX='${wl}-E' - hardcode_direct_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - - case $cc_basename in - CC) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC) - archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | egrep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes; then - archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - hpux10*|hpux11*) - if test $with_gnu_ld = no; then - case "$host_cpu" in - hppa*64*) - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_flag_spec_ld_CXX='+b $libdir' - hardcode_libdir_separator_CXX=: - ;; - ia64*) - hardcode_libdir_flag_spec_CXX='-L$libdir' - ;; - *) - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_CXX=: - export_dynamic_flag_spec_CXX='${wl}-E' - ;; - esac - fi - case "$host_cpu" in - hppa*64*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - ;; - ia64*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - *) - hardcode_direct_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - esac - - case $cc_basename in - CC) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC) - case "$host_cpu" in - hppa*64*|ia64*) - archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' - ;; - *) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes; then - if test $with_gnu_ld = no; then - case "$host_cpu" in - ia64*|hppa*64*) - archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' - ;; - *) - archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - fi - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - irix5* | irix6*) - case $cc_basename in - CC) - # SGI C++ - archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' - - # Archives containing C++ object files must be created using - # "CC -ar", where "CC" is the IRIX C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' - ;; - *) - if test "$GXX" = yes; then - if test "$with_gnu_ld" = no; then - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' - else - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' - fi - fi - link_all_deplibs_CXX=yes - ;; - esac - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - ;; - linux*) - case $cc_basename in - KCC) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - - hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' - ;; - icpc) - # Intel C++ - with_gnu_ld=yes - archive_cmds_need_lc_CXX=no - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - ;; - cxx) - # Compaq C++ - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' - - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - esac - ;; - lynxos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - m88k*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - mvs*) - case $cc_basename in - cxx) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' - wlarc= - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - fi - # Workaround some broken pre-1.5 toolchains - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' - ;; - osf3*) - case $cc_basename in - KCC) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - hardcode_libdir_separator_CXX=: - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' - - ;; - RCC) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - cxx) - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' - - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - osf4* | osf5*) - case $cc_basename in - KCC) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - hardcode_libdir_separator_CXX=: - - # Archives containing C++ object files must be created using - # the KAI C++ compiler. - old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' - ;; - RCC) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - cxx) - allow_undefined_flag_CXX=' -expect_unresolved \*' - archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' - archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ - echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ - $rm $lib.exp' - - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' - - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - psos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - sco*) - archive_cmds_need_lc_CXX=no - case $cc_basename in - CC) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC) - # Sun C++ 4.x - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - lcc) - # Lucid - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - solaris*) - case $cc_basename in - CC) - # Sun C++ 4.2, 5.x and Centerline C++ - no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' - - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_shlibpath_var_CXX=no - case $host_os in - solaris2.0-5 | solaris2.0-5.*) ;; - *) - # The C++ compiler is used as linker so we must use $wl - # flag to pass the commands to the underlying system - # linker. - # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - ;; - esac - link_all_deplibs_CXX=yes - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[LR]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' - ;; - gcx) - # Green Hills C++ Compiler - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - - # The C++ compiler must be used to create the archive. - old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' - ;; - *) - # GNU C++ compiler with Solaris linker - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - no_undefined_flag_CXX=' ${wl}-z ${wl}defs' - if $CC --version | grep -v '^2\.7' > /dev/null; then - archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" - else - # g++ 2.7 appears to require `-G' NOT `-shared' on this - # platform. - archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" - fi - - hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' - fi - ;; - esac - ;; - sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) - archive_cmds_need_lc_CXX=no - ;; - tandem*) - case $cc_basename in - NCC) - # NonStop-UX NCC 3.20 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - vxworks*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; -esac -echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 -echo "${ECHO_T}$ld_shlibs_CXX" >&6 -test "$ld_shlibs_CXX" = no && can_build_shared=no - -GCC_CXX="$GXX" -LD_CXX="$LD" - - -cat > conftest.$ac_ext <&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - # Parse the compiler output and extract the necessary - # objects, libraries and library flags. - - # Sentinel used to keep track of whether or not we are before - # the conftest object file. - pre_test_object_deps_done=no - - # The `*' in the case matches for architectures that use `case' in - # $output_verbose_cmd can trigger glob expansion during the loop - # eval without this substitution. - output_verbose_link_cmd="`$echo \"X$output_verbose_link_cmd\" | $Xsed -e \"$no_glob_subst\"`" - - for p in `eval $output_verbose_link_cmd`; do - case $p in - - -L* | -R* | -l*) - # Some compilers place space between "-{L,R}" and the path. - # Remove the space. - if test $p = "-L" \ - || test $p = "-R"; then - prev=$p - continue - else - prev= - fi - - if test "$pre_test_object_deps_done" = no; then - case $p in - -L* | -R*) - # Internal compiler library paths should come after those - # provided the user. The postdeps already come after the - # user supplied libs so there is no need to process them. - if test -z "$compiler_lib_search_path_CXX"; then - compiler_lib_search_path_CXX="${prev}${p}" - else - compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" - fi - ;; - # The "-l" case would never come before the object being - # linked, so don't bother handling this case. - esac - else - if test -z "$postdeps_CXX"; then - postdeps_CXX="${prev}${p}" - else - postdeps_CXX="${postdeps_CXX} ${prev}${p}" - fi - fi - ;; - - *.$objext) - # This assumes that the test object file only shows up - # once in the compiler output. - if test "$p" = "conftest.$objext"; then - pre_test_object_deps_done=yes - continue - fi - - if test "$pre_test_object_deps_done" = no; then - if test -z "$predep_objects_CXX"; then - predep_objects_CXX="$p" - else - predep_objects_CXX="$predep_objects_CXX $p" - fi - else - if test -z "$postdep_objects_CXX"; then - postdep_objects_CXX="$p" - else - postdep_objects_CXX="$postdep_objects_CXX $p" - fi - fi - ;; - - *) ;; # Ignore the rest. - - esac - done - - # Clean up. - rm -f a.out a.exe -else - echo "libtool.m4: error: problem compiling CXX test program" -fi - -$rm -f confest.$objext - -case " $postdeps_CXX " in -*" -lc "*) archive_cmds_need_lc_CXX=no ;; -esac - -lt_prog_compiler_wl_CXX= -lt_prog_compiler_pic_CXX= -lt_prog_compiler_static_CXX= - -echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 - - # C++ specific cases for pic, static, wl, etc. - if test "$GXX" = yes; then - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' - fi - ;; - amigaos*) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' - ;; - beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - mingw* | os2* | pw32*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic_CXX='-DDLL_EXPORT' - ;; - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic_CXX='-fno-common' - ;; - *djgpp*) - # DJGPP does not support shared libraries at all - lt_prog_compiler_pic_CXX= - ;; - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic_CXX=-Kconform_pic - fi - ;; - hpux*) - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case "$host_cpu" in - hppa*64*|ia64*) - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - else - case $host_os in - aix4* | aix5*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' - else - lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' - fi - ;; - chorus*) - case $cc_basename in - cxch68) - # Green Hills C++ Compiler - # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" - ;; - esac - ;; - dgux*) - case $cc_basename in - ec++) - lt_prog_compiler_pic_CXX='-KPIC' - ;; - ghcx) - # Green Hills C++ Compiler - lt_prog_compiler_pic_CXX='-pic' - ;; - *) - ;; - esac - ;; - freebsd*) - # FreeBSD uses GNU C++ - ;; - hpux9* | hpux10* | hpux11*) - case $cc_basename in - CC) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" - if test "$host_cpu" != ia64; then - lt_prog_compiler_pic_CXX='+Z' - fi - ;; - aCC) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" - case "$host_cpu" in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic_CXX='+Z' - ;; - esac - ;; - *) - ;; - esac - ;; - irix5* | irix6* | nonstopux*) - case $cc_basename in - CC) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-non_shared' - # CC pic flag -KPIC is the default. - ;; - *) - ;; - esac - ;; - linux*) - case $cc_basename in - KCC) - # KAI C++ Compiler - lt_prog_compiler_wl_CXX='--backend -Wl,' - lt_prog_compiler_pic_CXX='-fPIC' - ;; - icpc) - # Intel C++ - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-static' - ;; - cxx) - # Compaq C++ - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - *) - ;; - esac - ;; - lynxos*) - ;; - m88k*) - ;; - mvs*) - case $cc_basename in - cxx) - lt_prog_compiler_pic_CXX='-W c,exportall' - ;; - *) - ;; - esac - ;; - netbsd*) - ;; - osf3* | osf4* | osf5*) - case $cc_basename in - KCC) - lt_prog_compiler_wl_CXX='--backend -Wl,' - ;; - RCC) - # Rational C++ 2.4.1 - lt_prog_compiler_pic_CXX='-pic' - ;; - cxx) - # Digital/Compaq C++ - lt_prog_compiler_wl_CXX='-Wl,' - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - *) - ;; - esac - ;; - psos*) - ;; - sco*) - case $cc_basename in - CC) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - *) - ;; - esac - ;; - solaris*) - case $cc_basename in - CC) - # Sun C++ 4.2, 5.x and Centerline C++ - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - lt_prog_compiler_wl_CXX='-Qoption ld ' - ;; - gcx) - # Green Hills C++ Compiler - lt_prog_compiler_pic_CXX='-PIC' - ;; - *) - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC) - # Sun C++ 4.x - lt_prog_compiler_pic_CXX='-pic' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - lcc) - # Lucid - lt_prog_compiler_pic_CXX='-pic' - ;; - *) - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC) - # NonStop-UX NCC 3.20 - lt_prog_compiler_pic_CXX='-KPIC' - ;; - *) - ;; - esac - ;; - unixware*) - ;; - vxworks*) - ;; - *) - lt_prog_compiler_can_build_shared_CXX=no - ;; - esac - fi - -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6 - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic_CXX"; then - echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 -echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6 -if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_prog_compiler_pic_works_CXX=no - ac_outfile=conftest.$ac_objext - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:12488: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:12492: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test ! -s conftest.err; then - lt_prog_compiler_pic_works_CXX=yes - fi - fi - $rm conftest* - -fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6 - -if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then - case $lt_prog_compiler_pic_CXX in - "" | " "*) ;; - *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; - esac -else - lt_prog_compiler_pic_CXX= - lt_prog_compiler_can_build_shared_CXX=no -fi - -fi -case "$host_os" in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic_CXX= - ;; - *) - lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" - ;; -esac - -echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 -if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_cv_prog_compiler_c_o_CXX=no - $rm -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - # According to Tom Tromey, Ian Lance Taylor reported there are C compilers - # that will create temporary files in the current directory regardless of - # the output directory. Thus, making CWD read-only will cause this test - # to fail, enabling locking or at least warning the user not to do parallel - # builds. - chmod -w . - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:12555: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:12559: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test ! -s out/conftest.err; then - lt_cv_prog_compiler_c_o_CXX=yes - fi - fi - chmod u+w . - $rm conftest* out/* - rmdir out - cd .. - rmdir conftest - $rm conftest* - -fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6 - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 -echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 - hard_links=yes - $rm conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - echo "$as_me:$LINENO: result: $hard_links" >&5 -echo "${ECHO_T}$hard_links" >&6 - if test "$hard_links" = no; then - { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - -echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 - - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - case $host_os in - aix4* | aix5*) - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - if $NM -V 2>&1 | grep 'GNU' > /dev/null; then - export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' - fi - ;; - pw32*) - export_symbols_cmds_CXX="$ltdll_cmds" - ;; - cygwin* | mingw*) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' - ;; - *) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; - esac - -echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 -echo "${ECHO_T}$ld_shlibs_CXX" >&6 -test "$ld_shlibs_CXX" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc_CXX" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc_CXX=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds_CXX in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 - $rm conftest* - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl_CXX - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag_CXX - allow_undefined_flag_CXX= - if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 - (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - then - archive_cmds_need_lc_CXX=no - else - archive_cmds_need_lc_CXX=yes - fi - allow_undefined_flag_CXX=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $rm conftest* - echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 -echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6 - ;; - esac - fi - ;; -esac - -echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 -hardcode_action_CXX= -if test -n "$hardcode_libdir_flag_spec_CXX" || \ - test -n "$runpath_var CXX" || \ - test "X$hardcode_automatic_CXX"="Xyes" ; then - - # We can hardcode non-existant directories. - if test "$hardcode_direct_CXX" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no && - test "$hardcode_minus_L_CXX" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action_CXX=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action_CXX=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action_CXX=unsupported -fi -echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 -echo "${ECHO_T}$hardcode_action_CXX" >&6 - -if test "$hardcode_action_CXX" = relink; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - -striplib= -old_striplib= -echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 -echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 -if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - ;; - *) - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 - ;; - esac -fi - -echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -if test "$GCC" = yes; then - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix4* | aix5*) - version_type=linux - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done' - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi4*) - version_type=linux - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32*) - version_type=windows - shrext=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$host_os in - yes,cygwin* | yes,mingw* | yes,pw32*) - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $rm \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec="/lib /lib/w32api /usr/lib /usr/local/lib" - ;; - mingw*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH printed by - # mingw gcc, but we are running on Cygwin. Gcc prints its search - # path with ; separators, and with drive letters. We can handle the - # drive letters (cygwin fileutils understands them), so leave them, - # especially as we might pass files found there to a mingw objdump, - # which wouldn't understand a cygwinified path. Ahh. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' - ;; - esac - ;; - - *) - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - ;; - esac - dynamic_linker='Win32 ld.exe' - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - # FIXME: Relying on posixy $() will cause problems for - # cross-compilation, but unfortunately the echo tests do not - # yet detect zsh echo's removal of \ escapes. - library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext='$(test .$module = .yes && echo .so || echo .dylib)' - # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. - if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then - sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` - fi - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd1*) - dynamic_linker=no - ;; - -freebsd*) - objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.01* | freebsdelf3.01*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - *) # from 3.2 on - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case "$host_cpu" in - ia64*) - shrext='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555. - postinstall_cmds='chmod 555 $lib' - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be Linux ELF. -linux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -nto-qnx) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -openbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -sco3.2v5*) - version_type=osf - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - ;; - -solaris*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - export_dynamic_flag_spec='${wl}-Blargedynsym' - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -uts4*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -echo "$as_me:$LINENO: result: $dynamic_linker" >&5 -echo "${ECHO_T}$dynamic_linker" >&6 -test "$dynamic_linker" = no && can_build_shared=no - -if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 -if test "${ac_cv_lib_dl_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char dlopen (); -int -main () -{ -dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_dl_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dl_dlopen=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 -if test $ac_cv_lib_dl_dlopen = yes; then - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - -fi - - ;; - - *) - echo "$as_me:$LINENO: checking for shl_load" >&5 -echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 -if test "${ac_cv_func_shl_load+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define shl_load to an innocuous variant, in case declares shl_load. - For example, HP-UX 11i declares gettimeofday. */ -#define shl_load innocuous_shl_load - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char shl_load (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef shl_load - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char shl_load (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_shl_load) || defined (__stub___shl_load) -choke me -#else -char (*f) () = shl_load; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != shl_load; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_shl_load=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_shl_load=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 -echo "${ECHO_T}$ac_cv_func_shl_load" >&6 -if test $ac_cv_func_shl_load = yes; then - lt_cv_dlopen="shl_load" -else - echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 -echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 -if test "${ac_cv_lib_dld_shl_load+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char shl_load (); -int -main () -{ -shl_load (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_dld_shl_load=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dld_shl_load=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 -if test $ac_cv_lib_dld_shl_load = yes; then - lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" -else - echo "$as_me:$LINENO: checking for dlopen" >&5 -echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 -if test "${ac_cv_func_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define dlopen to an innocuous variant, in case declares dlopen. - For example, HP-UX 11i declares gettimeofday. */ -#define dlopen innocuous_dlopen - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char dlopen (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef dlopen - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char dlopen (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_dlopen) || defined (__stub___dlopen) -choke me -#else -char (*f) () = dlopen; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != dlopen; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_dlopen=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 -echo "${ECHO_T}$ac_cv_func_dlopen" >&6 -if test $ac_cv_func_dlopen = yes; then - lt_cv_dlopen="dlopen" -else - echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 -if test "${ac_cv_lib_dl_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char dlopen (); -int -main () -{ -dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_dl_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dl_dlopen=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 -if test $ac_cv_lib_dl_dlopen = yes; then - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 -echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 -if test "${ac_cv_lib_svld_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsvld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char dlopen (); -int -main () -{ -dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_svld_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_svld_dlopen=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 -if test $ac_cv_lib_svld_dlopen = yes; then - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" -else - echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 -echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 -if test "${ac_cv_lib_dld_dld_link+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char dld_link (); -int -main () -{ -dld_link (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_dld_dld_link=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dld_dld_link=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 -if test $ac_cv_lib_dld_dld_link = yes; then - lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" -fi - - -fi - - -fi - - -fi - - -fi - - -fi - - ;; - esac - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS="$LDFLAGS" - eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 -echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 -if test "${lt_cv_dlopen_self+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext < -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -#ifdef __cplusplus -extern "C" void exit (int); -#endif - -void fnord() { int i=42;} -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - /* dlclose (self); */ - } - - exit (status); -} -EOF - if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; - x$lt_unknown|x*) lt_cv_dlopen_self=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self=no - fi -fi -rm -fr conftest* - - -fi -echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 -echo "${ECHO_T}$lt_cv_dlopen_self" >&6 - - if test "x$lt_cv_dlopen_self" = xyes; then - LDFLAGS="$LDFLAGS $link_static_flag" - echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 -echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 -if test "${lt_cv_dlopen_self_static+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self_static=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext < -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -#ifdef __cplusplus -extern "C" void exit (int); -#endif - -void fnord() { int i=42;} -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - /* dlclose (self); */ - } - - exit (status); -} -EOF - if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self_static=no - fi -fi -rm -fr conftest* - - -fi -echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 -echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 - fi - - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi - - -# The else clause should only fire when bootstrapping the -# libtool distribution, otherwise you forgot to ship ltmain.sh -# with your package, and you will get complaints that there are -# no rules to generate ltmain.sh. -if test -f "$ltmain"; then - # See if we are running on zsh, and set the options which allow our commands through - # without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - # Now quote all the things that may contain metacharacters while being - # careful not to overquote the AC_SUBSTed values. We take copies of the - # variables and quote the copies for generation of the libtool script. - for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM SED SHELL \ - libname_spec library_names_spec soname_spec extract_expsyms_cmds \ - old_striplib striplib file_magic_cmd finish_cmds finish_eval \ - deplibs_check_method reload_flag reload_cmds need_locks \ - lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ - lt_cv_sys_global_symbol_to_c_name_address \ - sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ - old_postinstall_cmds old_postuninstall_cmds \ - compiler_CXX \ - CC_CXX \ - LD_CXX \ - lt_prog_compiler_wl_CXX \ - lt_prog_compiler_pic_CXX \ - lt_prog_compiler_static_CXX \ - lt_prog_compiler_no_builtin_flag_CXX \ - export_dynamic_flag_spec_CXX \ - thread_safe_flag_spec_CXX \ - whole_archive_flag_spec_CXX \ - enable_shared_with_static_runtimes_CXX \ - old_archive_cmds_CXX \ - old_archive_from_new_cmds_CXX \ - predep_objects_CXX \ - postdep_objects_CXX \ - predeps_CXX \ - postdeps_CXX \ - compiler_lib_search_path_CXX \ - archive_cmds_CXX \ - archive_expsym_cmds_CXX \ - postinstall_cmds_CXX \ - postuninstall_cmds_CXX \ - old_archive_from_expsyms_cmds_CXX \ - allow_undefined_flag_CXX \ - no_undefined_flag_CXX \ - export_symbols_cmds_CXX \ - hardcode_libdir_flag_spec_CXX \ - hardcode_libdir_flag_spec_ld_CXX \ - hardcode_libdir_separator_CXX \ - hardcode_automatic_CXX \ - module_cmds_CXX \ - module_expsym_cmds_CXX \ - lt_cv_prog_compiler_c_o_CXX \ - exclude_expsyms_CXX \ - include_expsyms_CXX; do - - case $var in - old_archive_cmds_CXX | \ - old_archive_from_new_cmds_CXX | \ - archive_cmds_CXX | \ - archive_expsym_cmds_CXX | \ - module_cmds_CXX | \ - module_expsym_cmds_CXX | \ - old_archive_from_expsyms_cmds_CXX | \ - export_symbols_cmds_CXX | \ - extract_expsyms_cmds | reload_cmds | finish_cmds | \ - postinstall_cmds | postuninstall_cmds | \ - old_postinstall_cmds | old_postuninstall_cmds | \ - sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) - # Double-quote double-evaled strings. - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" - ;; - *) - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" - ;; - esac - done - - case $lt_echo in - *'\$0 --fallback-echo"') - lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` - ;; - esac - -cfgfile="$ofile" - - cat <<__EOF__ >> "$cfgfile" -# ### BEGIN LIBTOOL TAG CONFIG: $tagname - -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc_CXX - -# Whether or not to disallow shared libs when runtime libs are static -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# The host system. -host_alias=$host_alias -host=$host - -# An echo program that does not interpret backslashes. -echo=$lt_echo - -# The archiver. -AR=$lt_AR -AR_FLAGS=$lt_AR_FLAGS - -# A C compiler. -LTCC=$lt_LTCC - -# A language-specific compiler. -CC=$lt_compiler_CXX - -# Is the compiler the GNU C compiler? -with_gcc=$GCC_CXX - -# An ERE matcher. -EGREP=$lt_EGREP - -# The linker used to build libraries. -LD=$lt_LD_CXX - -# Whether we need hard or soft links. -LN_S=$lt_LN_S - -# A BSD-compatible nm program. -NM=$lt_NM - -# A symbol stripping program -STRIP=$STRIP - -# Used to examine libraries when file_magic_cmd begins "file" -MAGIC_CMD=$MAGIC_CMD - -# Used on cygwin: DLL creation program. -DLLTOOL="$DLLTOOL" - -# Used on cygwin: object dumper. -OBJDUMP="$OBJDUMP" - -# Used on cygwin: assembler. -AS="$AS" - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl_CXX - -# Object file suffix (normally "o"). -objext="$ac_objext" - -# Old archive suffix (normally "a"). -libext="$libext" - -# Shared library suffix (normally ".so"). -shrext='$shrext' - -# Executable file suffix (normally ""). -exeext="$exeext" - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic_CXX -pic_mode=$pic_mode - -# What is the maximum length of a command? -max_cmd_len=$lt_cv_sys_max_cmd_len - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX - -# Must we lock files when doing compilation ? -need_locks=$lt_need_locks - -# Do we need the lib prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static_CXX - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX - -# Compiler flag to generate thread-safe objects. -thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX - -# Library versioning type. -version_type=$version_type - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME. -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Commands used to build and install an old-style archive. -RANLIB=$lt_RANLIB -old_archive_cmds=$lt_old_archive_cmds_CXX -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX - -# Commands used to build and install a shared archive. -archive_cmds=$lt_archive_cmds_CXX -archive_expsym_cmds=$lt_archive_expsym_cmds_CXX -postinstall_cmds=$lt_postinstall_cmds -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to build a loadable module (assumed same as above if empty) -module_cmds=$lt_module_cmds_CXX -module_expsym_cmds=$lt_module_expsym_cmds_CXX - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - -# Dependencies to place before the objects being linked to create a -# shared library. -predep_objects=$lt_predep_objects_CXX - -# Dependencies to place after the objects being linked to create a -# shared library. -postdep_objects=$lt_postdep_objects_CXX - -# Dependencies to place before the objects being linked to create a -# shared library. -predeps=$lt_predeps_CXX - -# Dependencies to place after the objects being linked to create a -# shared library. -postdeps=$lt_postdeps_CXX - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path_CXX - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method == file_magic. -file_magic_cmd=$lt_file_magic_cmd - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag_CXX - -# Flag that forces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag_CXX - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# Same as above, but a single script fragment to be evaled but not shown. -finish_eval=$lt_finish_eval - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# This is the shared library runtime path variable. -runpath_var=$runpath_var - -# This is the shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action_CXX - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist. -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX - -# If ld is used when linking, flag to hardcode \$libdir into -# a binary during linking. This must work even if \$libdir does -# not exist. -hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX - -# Whether we need a single -rpath flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX - -# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the -# resulting binary. -hardcode_direct=$hardcode_direct_CXX - -# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -# resulting binary. -hardcode_minus_L=$hardcode_minus_L_CXX - -# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -# the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX - -# Set to yes if building a shared library automatically hardcodes DIR into the library -# and all subsequent libraries and executables linked against it. -hardcode_automatic=$hardcode_automatic_CXX - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at relink time. -variables_saved_for_relink="$variables_saved_for_relink" - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs_CXX - -# Compile-time system search path for libraries -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Fix the shell variable \$srcfile for the compiler. -fix_srcfile_path="$fix_srcfile_path_CXX" - -# Set to yes if exported symbols are required. -always_export_symbols=$always_export_symbols_CXX - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds_CXX - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms_CXX - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms_CXX - -# ### END LIBTOOL TAG CONFIG: $tagname - -__EOF__ - - -else - # If there is no Makefile yet, we rely on a make rule to execute - # `config.status --recheck' to rerun these tests and create the - # libtool script then. - test -f Makefile && make "$ltmain" -fi - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -CC=$lt_save_CC -LDCXX=$LD -LD=$lt_save_LD -GCC=$lt_save_GCC -with_gnu_ldcxx=$with_gnu_ld -with_gnu_ld=$lt_save_with_gnu_ld -lt_cv_path_LDCXX=$lt_cv_path_LD -lt_cv_path_LD=$lt_save_path_LD -lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld -lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld - - else - tagname="" - fi - ;; - - F77) - if test -n "$F77" && test "X$F77" != "Xno"; then - -ac_ext=f -ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' -ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_f77_compiler_gnu - - -archive_cmds_need_lc_F77=no -allow_undefined_flag_F77= -always_export_symbols_F77=no -archive_expsym_cmds_F77= -export_dynamic_flag_spec_F77= -hardcode_direct_F77=no -hardcode_libdir_flag_spec_F77= -hardcode_libdir_flag_spec_ld_F77= -hardcode_libdir_separator_F77= -hardcode_minus_L_F77=no -hardcode_automatic_F77=no -module_cmds_F77= -module_expsym_cmds_F77= -link_all_deplibs_F77=unknown -old_archive_cmds_F77=$old_archive_cmds -no_undefined_flag_F77= -whole_archive_flag_spec_F77= -enable_shared_with_static_runtimes_F77=no - -# Source file extension for f77 test sources. -ac_ext=f - -# Object file extension for compiled f77 test sources. -objext=o -objext_F77=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code=" subroutine t\n return\n end\n" - -# Code to be used in simple link tests -lt_simple_link_test_code=" program t\n end\n" - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# Allow CC to be a program name with arguments. -lt_save_CC="$CC" -CC=${F77-"f77"} -compiler=$CC -compiler_F77=$CC -cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` - -echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 -echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 -echo "$as_me:$LINENO: result: $can_build_shared" >&5 -echo "${ECHO_T}$can_build_shared" >&6 - -echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 -echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 -test "$can_build_shared" = "no" && enable_shared=no - -# On AIX, shared libraries and static libraries use the same namespace, and -# are all built from PIC. -case "$host_os" in -aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; -aix4*) - test "$enable_shared" = yes && enable_static=no - ;; -esac -echo "$as_me:$LINENO: result: $enable_shared" >&5 -echo "${ECHO_T}$enable_shared" >&6 - -echo "$as_me:$LINENO: checking whether to build static libraries" >&5 -echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 -# Make sure either enable_shared or enable_static is yes. -test "$enable_shared" = yes || enable_static=yes -echo "$as_me:$LINENO: result: $enable_static" >&5 -echo "${ECHO_T}$enable_static" >&6 - -test "$ld_shlibs_F77" = no && can_build_shared=no - -GCC_F77="$G77" -LD_F77="$LD" - -lt_prog_compiler_wl_F77= -lt_prog_compiler_pic_F77= -lt_prog_compiler_static_F77= - -echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 - - if test "$GCC" = yes; then - lt_prog_compiler_wl_F77='-Wl,' - lt_prog_compiler_static_F77='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_F77='-Bstatic' - fi - ;; - - amigaos*) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' - ;; - - beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic_F77='-DDLL_EXPORT' - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic_F77='-fno-common' - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - lt_prog_compiler_can_build_shared_F77=no - enable_shared=no - ;; - - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic_F77=-Kconform_pic - fi - ;; - - hpux*) - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case "$host_cpu" in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic_F77='-fPIC' - ;; - esac - ;; - - *) - lt_prog_compiler_pic_F77='-fPIC' - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - lt_prog_compiler_wl_F77='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_F77='-Bstatic' - else - lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' - fi - ;; - - mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic_F77='-DDLL_EXPORT' - ;; - - hpux9* | hpux10* | hpux11*) - lt_prog_compiler_wl_F77='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case "$host_cpu" in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic_F77='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - lt_prog_compiler_static_F77='${wl}-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - lt_prog_compiler_wl_F77='-Wl,' - # PIC (with -KPIC) is the default. - lt_prog_compiler_static_F77='-non_shared' - ;; - - newsos6) - lt_prog_compiler_pic_F77='-KPIC' - lt_prog_compiler_static_F77='-Bstatic' - ;; - - linux*) - case $CC in - icc|ecc) - lt_prog_compiler_wl_F77='-Wl,' - lt_prog_compiler_pic_F77='-KPIC' - lt_prog_compiler_static_F77='-static' - ;; - ccc) - lt_prog_compiler_wl_F77='-Wl,' - # All Alpha code is PIC. - lt_prog_compiler_static_F77='-non_shared' - ;; - esac - ;; - - osf3* | osf4* | osf5*) - lt_prog_compiler_wl_F77='-Wl,' - # All OSF/1 code is PIC. - lt_prog_compiler_static_F77='-non_shared' - ;; - - sco3.2v5*) - lt_prog_compiler_pic_F77='-Kpic' - lt_prog_compiler_static_F77='-dn' - ;; - - solaris*) - lt_prog_compiler_wl_F77='-Wl,' - lt_prog_compiler_pic_F77='-KPIC' - lt_prog_compiler_static_F77='-Bstatic' - ;; - - sunos4*) - lt_prog_compiler_wl_F77='-Qoption ld ' - lt_prog_compiler_pic_F77='-PIC' - lt_prog_compiler_static_F77='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - lt_prog_compiler_wl_F77='-Wl,' - lt_prog_compiler_pic_F77='-KPIC' - lt_prog_compiler_static_F77='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - lt_prog_compiler_pic_F77='-Kconform_pic' - lt_prog_compiler_static_F77='-Bstatic' - fi - ;; - - uts4*) - lt_prog_compiler_pic_F77='-pic' - lt_prog_compiler_static_F77='-Bstatic' - ;; - - *) - lt_prog_compiler_can_build_shared_F77=no - ;; - esac - fi - -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6 - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic_F77"; then - echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 -echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6 -if test "${lt_prog_compiler_pic_works_F77+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_prog_compiler_pic_works_F77=no - ac_outfile=conftest.$ac_objext - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic_F77" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:14804: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:14808: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test ! -s conftest.err; then - lt_prog_compiler_pic_works_F77=yes - fi - fi - $rm conftest* - -fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6 - -if test x"$lt_prog_compiler_pic_works_F77" = xyes; then - case $lt_prog_compiler_pic_F77 in - "" | " "*) ;; - *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; - esac -else - lt_prog_compiler_pic_F77= - lt_prog_compiler_can_build_shared_F77=no -fi - -fi -case "$host_os" in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic_F77= - ;; - *) - lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" - ;; -esac - -echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 -if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_cv_prog_compiler_c_o_F77=no - $rm -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - # According to Tom Tromey, Ian Lance Taylor reported there are C compilers - # that will create temporary files in the current directory regardless of - # the output directory. Thus, making CWD read-only will cause this test - # to fail, enabling locking or at least warning the user not to do parallel - # builds. - chmod -w . - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:14871: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:14875: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test ! -s out/conftest.err; then - lt_cv_prog_compiler_c_o_F77=yes - fi - fi - chmod u+w . - $rm conftest* out/* - rmdir out - cd .. - rmdir conftest - $rm conftest* - -fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6 - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 -echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 - hard_links=yes - $rm conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - echo "$as_me:$LINENO: result: $hard_links" >&5 -echo "${ECHO_T}$hard_links" >&6 - if test "$hard_links" = no; then - { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - -echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 - - runpath_var= - allow_undefined_flag_F77= - enable_shared_with_static_runtimes_F77=no - archive_cmds_F77= - archive_expsym_cmds_F77= - old_archive_From_new_cmds_F77= - old_archive_from_expsyms_cmds_F77= - export_dynamic_flag_spec_F77= - whole_archive_flag_spec_F77= - thread_safe_flag_spec_F77= - hardcode_libdir_flag_spec_F77= - hardcode_libdir_flag_spec_ld_F77= - hardcode_libdir_separator_F77= - hardcode_direct_F77=no - hardcode_minus_L_F77=no - hardcode_shlibpath_var_F77=unsupported - link_all_deplibs_F77=unknown - hardcode_automatic_F77=no - module_cmds_F77= - module_expsym_cmds_F77= - always_export_symbols_F77=no - export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - include_expsyms_F77= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. - exclude_expsyms_F77="_GLOBAL_OFFSET_TABLE_" - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - extract_expsyms_cmds= - - case $host_os in - cygwin* | mingw* | pw32*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - openbsd*) - with_gnu_ld=no - ;; - esac - - ld_shlibs_F77=yes - if test "$with_gnu_ld" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # See if GNU ld supports shared libraries. - case $host_os in - aix3* | aix4* | aix5*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - ld_shlibs_F77=no - cat <&2 - -*** Warning: the GNU linker, at least up to release 2.9.1, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to modify your PATH -*** so that a non-GNU linker is found, and then restart. - -EOF - fi - ;; - - amigaos*) - archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_minus_L_F77=yes - - # Samuel A. Falvo II reports - # that the semantics of dynamic libraries on AmigaOS, at least up - # to version 4, is to share data among multiple programs linked - # with the same dynamic library. Since this doesn't match the - # behavior of shared libraries on other platforms, we can't use - # them. - ld_shlibs_F77=no - ;; - - beos*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag_F77=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs_F77=no - fi - ;; - - cygwin* | mingw* | pw32*) - # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec_F77='-L$libdir' - allow_undefined_flag_F77=unsupported - always_export_symbols_F77=no - enable_shared_with_static_runtimes_F77=yes - export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' - - if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - else - ld_shlibs=no - fi - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris* | sysv5*) - if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then - ld_shlibs_F77=no - cat <&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -EOF - elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs_F77=no - fi - ;; - - sunos4*) - archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - hardcode_direct_F77=yes - hardcode_shlibpath_var_F77=no - ;; - - *) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs_F77=no - fi - ;; - esac - - if test "$ld_shlibs_F77" = yes; then - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec_F77='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec_F77= - fi - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - allow_undefined_flag_F77=unsupported - always_export_symbols_F77=yes - archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L_F77=yes - if test "$GCC" = yes && test -z "$link_static_flag"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct_F77=unsupported - fi - ;; - - aix4* | aix5*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - if $NM -V 2>&1 | grep 'GNU' > /dev/null; then - export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix5*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds_F77='' - hardcode_direct_F77=yes - hardcode_libdir_separator_F77=':' - link_all_deplibs_F77=yes - - if test "$GCC" = yes; then - case $host_os in aix4.012|aix4.012.*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && \ - strings "$collect2name" | grep resolve_lib_name >/dev/null - then - # We have reworked collect2 - hardcode_direct_F77=yes - else - # We have old collect2 - hardcode_direct_F77=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L_F77=yes - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_libdir_separator_F77= - fi - esac - shared_flag='-shared' - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - always_export_symbols_F77=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag_F77='-berok' - # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF - program main - - end -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_f77_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - - hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag_F77="-z nodefs" - archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF - program main - - end -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_f77_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - - hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag_F77=' ${wl}-bernotok' - allow_undefined_flag_F77=' ${wl}-berok' - # -bexpall does not export symbols beginning with underscore (_) - always_export_symbols_F77=yes - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec_F77=' ' - archive_cmds_need_lc_F77=yes - # This is similar to how AIX traditionally builds it's shared libraries. - archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_minus_L_F77=yes - # see comment about different semantics on the GNU ld section - ld_shlibs_F77=no - ;; - - bsdi4*) - export_dynamic_flag_spec_F77=-rdynamic - ;; - - cygwin* | mingw* | pw32*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec_F77=' ' - allow_undefined_flag_F77=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_From_new_cmds_F77='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs' - fix_srcfile_path='`cygpath -w "$srcfile"`' - enable_shared_with_static_runtimes_F77=yes - ;; - - darwin* | rhapsody*) - if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then - archive_cmds_need_lc_F77=no - case "$host_os" in - rhapsody* | darwin1.[012]) - allow_undefined_flag_F77='-undefined suppress' - ;; - *) # Darwin 1.3 on - test -z ${LD_TWOLEVEL_NAMESPACE} && allow_undefined_flag_F77='-flat_namespace -undefined suppress' - ;; - esac - # FIXME: Relying on posixy $() will cause problems for - # cross-compilation, but unfortunately the echo tests do not - # yet detect zsh echo's removal of \ escapes. Also zsh mangles - # `"' quotes if we put them in here... so don't! - lt_int_apple_cc_single_mod=no - output_verbose_link_cmd='echo' - if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then - lt_int_apple_cc_single_mod=yes - fi - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - archive_cmds_F77='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - else - archive_cmds_F77='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - fi - module_cmds_F77='$CC -bundle ${wl}-bind_at_load $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -bundle $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - hardcode_direct_F77=no - hardcode_automatic_F77=yes - hardcode_shlibpath_var_F77=unsupported - whole_archive_flag_spec_F77='-all_load $convenience' - link_all_deplibs_F77=yes - fi - ;; - - dgux*) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_shlibpath_var_F77=no - ;; - - freebsd1*) - ld_shlibs_F77=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - hardcode_libdir_flag_spec_F77='-R$libdir' - hardcode_direct_F77=yes - hardcode_shlibpath_var_F77=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2*) - archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_F77=yes - hardcode_minus_L_F77=yes - hardcode_shlibpath_var_F77=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd*) - archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec_F77='-R$libdir' - hardcode_direct_F77=yes - hardcode_shlibpath_var_F77=no - ;; - - hpux9*) - if test "$GCC" = yes; then - archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - fi - hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_F77=: - hardcode_direct_F77=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L_F77=yes - export_dynamic_flag_spec_F77='${wl}-E' - ;; - - hpux10* | hpux11*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then - case "$host_cpu" in - hppa*64*|ia64*) - archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case "$host_cpu" in - hppa*64*|ia64*) - archive_cmds_F77='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' - ;; - *) - archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - ;; - esac - fi - if test "$with_gnu_ld" = no; then - case "$host_cpu" in - hppa*64*) - hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' - hardcode_libdir_flag_spec_ld_F77='+b $libdir' - hardcode_libdir_separator_F77=: - hardcode_direct_F77=no - hardcode_shlibpath_var_F77=no - ;; - ia64*) - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_direct_F77=no - hardcode_shlibpath_var_F77=no - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L_F77=yes - ;; - *) - hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_F77=: - hardcode_direct_F77=yes - export_dynamic_flag_spec_F77='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L_F77=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec_ld_F77='-rpath $libdir' - fi - hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_F77=: - link_all_deplibs_F77=yes - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - hardcode_libdir_flag_spec_F77='-R$libdir' - hardcode_direct_F77=yes - hardcode_shlibpath_var_F77=no - ;; - - newsos6) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_F77=yes - hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_F77=: - hardcode_shlibpath_var_F77=no - ;; - - openbsd*) - hardcode_direct_F77=yes - hardcode_shlibpath_var_F77=no - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' - export_dynamic_flag_spec_F77='${wl}-E' - else - case $host_os in - openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) - archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec_F77='-R$libdir' - ;; - *) - archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' - ;; - esac - fi - ;; - - os2*) - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_minus_L_F77=yes - allow_undefined_flag_F77=unsupported - archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - allow_undefined_flag_F77=' -expect_unresolved \*' - archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - fi - hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_F77=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' - else - allow_undefined_flag_F77=' -expect_unresolved \*' - archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ - $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' - - # Both c and cxx compiler support -rpath directly - hardcode_libdir_flag_spec_F77='-rpath $libdir' - fi - hardcode_libdir_separator_F77=: - ;; - - sco3.2v5*) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var_F77=no - export_dynamic_flag_spec_F77='${wl}-Bexport' - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ;; - - solaris*) - no_undefined_flag_F77=' -z text' - if test "$GCC" = yes; then - archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' - else - archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - fi - hardcode_libdir_flag_spec_F77='-R$libdir' - hardcode_shlibpath_var_F77=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;; - esac - link_all_deplibs_F77=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_direct_F77=yes - hardcode_minus_L_F77=yes - hardcode_shlibpath_var_F77=no - ;; - - sysv4) - case $host_vendor in - sni) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_F77=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' - reload_cmds_F77='$CC -r -o $output$reload_objs' - hardcode_direct_F77=no - ;; - motorola) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var_F77=no - ;; - - sysv4.3*) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var_F77=no - export_dynamic_flag_spec_F77='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var_F77=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ld_shlibs_F77=yes - fi - ;; - - sysv4.2uw2*) - archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_F77=yes - hardcode_minus_L_F77=no - hardcode_shlibpath_var_F77=no - hardcode_runpath_var=yes - runpath_var=LD_RUN_PATH - ;; - - sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) - no_undefined_flag_F77='${wl}-z ${wl}text' - if test "$GCC" = yes; then - archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds_F77='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var_F77=no - ;; - - sysv5*) - no_undefined_flag_F77=' -z text' - # $CC -shared without GNU ld will not create a library from C++ - # object files and a static libstdc++, better avoid it by now - archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - hardcode_libdir_flag_spec_F77= - hardcode_shlibpath_var_F77=no - runpath_var='LD_RUN_PATH' - ;; - - uts4*) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_shlibpath_var_F77=no - ;; - - *) - ld_shlibs_F77=no - ;; - esac - fi - -echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5 -echo "${ECHO_T}$ld_shlibs_F77" >&6 -test "$ld_shlibs_F77" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc_F77" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc_F77=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds_F77 in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 - $rm conftest* - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl_F77 - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag_F77 - allow_undefined_flag_F77= - if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 - (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - then - archive_cmds_need_lc_F77=no - else - archive_cmds_need_lc_F77=yes - fi - allow_undefined_flag_F77=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $rm conftest* - echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5 -echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6 - ;; - esac - fi - ;; -esac - -echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 -hardcode_action_F77= -if test -n "$hardcode_libdir_flag_spec_F77" || \ - test -n "$runpath_var F77" || \ - test "X$hardcode_automatic_F77"="Xyes" ; then - - # We can hardcode non-existant directories. - if test "$hardcode_direct_F77" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no && - test "$hardcode_minus_L_F77" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action_F77=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action_F77=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action_F77=unsupported -fi -echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5 -echo "${ECHO_T}$hardcode_action_F77" >&6 - -if test "$hardcode_action_F77" = relink; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - -striplib= -old_striplib= -echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 -echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 -if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - ;; - *) - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 - ;; - esac -fi - -echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -if test "$GCC" = yes; then - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix4* | aix5*) - version_type=linux - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done' - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi4*) - version_type=linux - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32*) - version_type=windows - shrext=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$host_os in - yes,cygwin* | yes,mingw* | yes,pw32*) - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $rm \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec="/lib /lib/w32api /usr/lib /usr/local/lib" - ;; - mingw*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH printed by - # mingw gcc, but we are running on Cygwin. Gcc prints its search - # path with ; separators, and with drive letters. We can handle the - # drive letters (cygwin fileutils understands them), so leave them, - # especially as we might pass files found there to a mingw objdump, - # which wouldn't understand a cygwinified path. Ahh. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' - ;; - esac - ;; - - *) - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - ;; - esac - dynamic_linker='Win32 ld.exe' - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - # FIXME: Relying on posixy $() will cause problems for - # cross-compilation, but unfortunately the echo tests do not - # yet detect zsh echo's removal of \ escapes. - library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext='$(test .$module = .yes && echo .so || echo .dylib)' - # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. - if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then - sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` - fi - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd1*) - dynamic_linker=no - ;; - -freebsd*) - objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.01* | freebsdelf3.01*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - *) # from 3.2 on - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case "$host_cpu" in - ia64*) - shrext='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555. - postinstall_cmds='chmod 555 $lib' - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be Linux ELF. -linux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -nto-qnx) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -openbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -sco3.2v5*) - version_type=osf - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - ;; - -solaris*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - export_dynamic_flag_spec='${wl}-Blargedynsym' - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -uts4*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -echo "$as_me:$LINENO: result: $dynamic_linker" >&5 -echo "${ECHO_T}$dynamic_linker" >&6 -test "$dynamic_linker" = no && can_build_shared=no - - -# The else clause should only fire when bootstrapping the -# libtool distribution, otherwise you forgot to ship ltmain.sh -# with your package, and you will get complaints that there are -# no rules to generate ltmain.sh. -if test -f "$ltmain"; then - # See if we are running on zsh, and set the options which allow our commands through - # without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - # Now quote all the things that may contain metacharacters while being - # careful not to overquote the AC_SUBSTed values. We take copies of the - # variables and quote the copies for generation of the libtool script. - for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM SED SHELL \ - libname_spec library_names_spec soname_spec extract_expsyms_cmds \ - old_striplib striplib file_magic_cmd finish_cmds finish_eval \ - deplibs_check_method reload_flag reload_cmds need_locks \ - lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ - lt_cv_sys_global_symbol_to_c_name_address \ - sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ - old_postinstall_cmds old_postuninstall_cmds \ - compiler_F77 \ - CC_F77 \ - LD_F77 \ - lt_prog_compiler_wl_F77 \ - lt_prog_compiler_pic_F77 \ - lt_prog_compiler_static_F77 \ - lt_prog_compiler_no_builtin_flag_F77 \ - export_dynamic_flag_spec_F77 \ - thread_safe_flag_spec_F77 \ - whole_archive_flag_spec_F77 \ - enable_shared_with_static_runtimes_F77 \ - old_archive_cmds_F77 \ - old_archive_from_new_cmds_F77 \ - predep_objects_F77 \ - postdep_objects_F77 \ - predeps_F77 \ - postdeps_F77 \ - compiler_lib_search_path_F77 \ - archive_cmds_F77 \ - archive_expsym_cmds_F77 \ - postinstall_cmds_F77 \ - postuninstall_cmds_F77 \ - old_archive_from_expsyms_cmds_F77 \ - allow_undefined_flag_F77 \ - no_undefined_flag_F77 \ - export_symbols_cmds_F77 \ - hardcode_libdir_flag_spec_F77 \ - hardcode_libdir_flag_spec_ld_F77 \ - hardcode_libdir_separator_F77 \ - hardcode_automatic_F77 \ - module_cmds_F77 \ - module_expsym_cmds_F77 \ - lt_cv_prog_compiler_c_o_F77 \ - exclude_expsyms_F77 \ - include_expsyms_F77; do - - case $var in - old_archive_cmds_F77 | \ - old_archive_from_new_cmds_F77 | \ - archive_cmds_F77 | \ - archive_expsym_cmds_F77 | \ - module_cmds_F77 | \ - module_expsym_cmds_F77 | \ - old_archive_from_expsyms_cmds_F77 | \ - export_symbols_cmds_F77 | \ - extract_expsyms_cmds | reload_cmds | finish_cmds | \ - postinstall_cmds | postuninstall_cmds | \ - old_postinstall_cmds | old_postuninstall_cmds | \ - sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) - # Double-quote double-evaled strings. - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" - ;; - *) - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" - ;; - esac - done - - case $lt_echo in - *'\$0 --fallback-echo"') - lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` - ;; - esac - -cfgfile="$ofile" - - cat <<__EOF__ >> "$cfgfile" -# ### BEGIN LIBTOOL TAG CONFIG: $tagname - -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc_F77 - -# Whether or not to disallow shared libs when runtime libs are static -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# The host system. -host_alias=$host_alias -host=$host - -# An echo program that does not interpret backslashes. -echo=$lt_echo - -# The archiver. -AR=$lt_AR -AR_FLAGS=$lt_AR_FLAGS - -# A C compiler. -LTCC=$lt_LTCC - -# A language-specific compiler. -CC=$lt_compiler_F77 - -# Is the compiler the GNU C compiler? -with_gcc=$GCC_F77 - -# An ERE matcher. -EGREP=$lt_EGREP - -# The linker used to build libraries. -LD=$lt_LD_F77 - -# Whether we need hard or soft links. -LN_S=$lt_LN_S - -# A BSD-compatible nm program. -NM=$lt_NM - -# A symbol stripping program -STRIP=$STRIP - -# Used to examine libraries when file_magic_cmd begins "file" -MAGIC_CMD=$MAGIC_CMD - -# Used on cygwin: DLL creation program. -DLLTOOL="$DLLTOOL" - -# Used on cygwin: object dumper. -OBJDUMP="$OBJDUMP" - -# Used on cygwin: assembler. -AS="$AS" - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl_F77 - -# Object file suffix (normally "o"). -objext="$ac_objext" - -# Old archive suffix (normally "a"). -libext="$libext" - -# Shared library suffix (normally ".so"). -shrext='$shrext' - -# Executable file suffix (normally ""). -exeext="$exeext" - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic_F77 -pic_mode=$pic_mode - -# What is the maximum length of a command? -max_cmd_len=$lt_cv_sys_max_cmd_len - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 - -# Must we lock files when doing compilation ? -need_locks=$lt_need_locks - -# Do we need the lib prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static_F77 - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 - -# Compiler flag to generate thread-safe objects. -thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77 - -# Library versioning type. -version_type=$version_type - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME. -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Commands used to build and install an old-style archive. -RANLIB=$lt_RANLIB -old_archive_cmds=$lt_old_archive_cmds_F77 -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 - -# Commands used to build and install a shared archive. -archive_cmds=$lt_archive_cmds_F77 -archive_expsym_cmds=$lt_archive_expsym_cmds_F77 -postinstall_cmds=$lt_postinstall_cmds -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to build a loadable module (assumed same as above if empty) -module_cmds=$lt_module_cmds_F77 -module_expsym_cmds=$lt_module_expsym_cmds_F77 - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - -# Dependencies to place before the objects being linked to create a -# shared library. -predep_objects=$lt_predep_objects_F77 - -# Dependencies to place after the objects being linked to create a -# shared library. -postdep_objects=$lt_postdep_objects_F77 - -# Dependencies to place before the objects being linked to create a -# shared library. -predeps=$lt_predeps_F77 - -# Dependencies to place after the objects being linked to create a -# shared library. -postdeps=$lt_postdeps_F77 - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path_F77 - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method == file_magic. -file_magic_cmd=$lt_file_magic_cmd - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag_F77 - -# Flag that forces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag_F77 - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# Same as above, but a single script fragment to be evaled but not shown. -finish_eval=$lt_finish_eval - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# This is the shared library runtime path variable. -runpath_var=$runpath_var - -# This is the shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action_F77 - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist. -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 - -# If ld is used when linking, flag to hardcode \$libdir into -# a binary during linking. This must work even if \$libdir does -# not exist. -hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77 - -# Whether we need a single -rpath flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 - -# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the -# resulting binary. -hardcode_direct=$hardcode_direct_F77 - -# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -# resulting binary. -hardcode_minus_L=$hardcode_minus_L_F77 - -# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -# the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 - -# Set to yes if building a shared library automatically hardcodes DIR into the library -# and all subsequent libraries and executables linked against it. -hardcode_automatic=$hardcode_automatic_F77 - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at relink time. -variables_saved_for_relink="$variables_saved_for_relink" - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs_F77 - -# Compile-time system search path for libraries -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Fix the shell variable \$srcfile for the compiler. -fix_srcfile_path="$fix_srcfile_path_F77" - -# Set to yes if exported symbols are required. -always_export_symbols=$always_export_symbols_F77 - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds_F77 - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms_F77 - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms_F77 - -# ### END LIBTOOL TAG CONFIG: $tagname - -__EOF__ - - -else - # If there is no Makefile yet, we rely on a make rule to execute - # `config.status --recheck' to rerun these tests and create the - # libtool script then. - test -f Makefile && make "$ltmain" -fi - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -CC="$lt_save_CC" - - else - tagname="" - fi - ;; - - GCJ) - if test -n "$GCJ" && test "X$GCJ" != "Xno"; then - - - -# Source file extension for Java test sources. -ac_ext=java - -# Object file extension for compiled Java test sources. -objext=o -objext_GCJ=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="class foo {}\n" - -# Code to be used in simple link tests -lt_simple_link_test_code='public class conftest { public static void main(String argv) {}; }\n' - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# Allow CC to be a program name with arguments. -lt_save_CC="$CC" -CC=${GCJ-"gcj"} -compiler=$CC -compiler_GCJ=$CC - -# GCJ did not exist at the time GCC didn't implicitly link libc in. -archive_cmds_need_lc_GCJ=no - - -lt_prog_compiler_no_builtin_flag_GCJ= - -if test "$GCC" = yes; then - lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' - - echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 -if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_cv_prog_compiler_rtti_exceptions=no - ac_outfile=conftest.$ac_objext - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="-fno-rtti -fno-exceptions" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:16833: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:16837: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test ! -s conftest.err; then - lt_cv_prog_compiler_rtti_exceptions=yes - fi - fi - $rm conftest* - -fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 - -if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then - lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" -else - : -fi - -fi - -lt_prog_compiler_wl_GCJ= -lt_prog_compiler_pic_GCJ= -lt_prog_compiler_static_GCJ= - -echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 - - if test "$GCC" = yes; then - lt_prog_compiler_wl_GCJ='-Wl,' - lt_prog_compiler_static_GCJ='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_GCJ='-Bstatic' - fi - ;; - - amigaos*) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4' - ;; - - beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic_GCJ='-fno-common' - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - lt_prog_compiler_can_build_shared_GCJ=no - enable_shared=no - ;; - - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic_GCJ=-Kconform_pic - fi - ;; - - hpux*) - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case "$host_cpu" in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic_GCJ='-fPIC' - ;; - esac - ;; - - *) - lt_prog_compiler_pic_GCJ='-fPIC' - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - lt_prog_compiler_wl_GCJ='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_GCJ='-Bstatic' - else - lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp' - fi - ;; - - mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' - ;; - - hpux9* | hpux10* | hpux11*) - lt_prog_compiler_wl_GCJ='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case "$host_cpu" in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic_GCJ='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - lt_prog_compiler_wl_GCJ='-Wl,' - # PIC (with -KPIC) is the default. - lt_prog_compiler_static_GCJ='-non_shared' - ;; - - newsos6) - lt_prog_compiler_pic_GCJ='-KPIC' - lt_prog_compiler_static_GCJ='-Bstatic' - ;; - - linux*) - case $CC in - icc|ecc) - lt_prog_compiler_wl_GCJ='-Wl,' - lt_prog_compiler_pic_GCJ='-KPIC' - lt_prog_compiler_static_GCJ='-static' - ;; - ccc) - lt_prog_compiler_wl_GCJ='-Wl,' - # All Alpha code is PIC. - lt_prog_compiler_static_GCJ='-non_shared' - ;; - esac - ;; - - osf3* | osf4* | osf5*) - lt_prog_compiler_wl_GCJ='-Wl,' - # All OSF/1 code is PIC. - lt_prog_compiler_static_GCJ='-non_shared' - ;; - - sco3.2v5*) - lt_prog_compiler_pic_GCJ='-Kpic' - lt_prog_compiler_static_GCJ='-dn' - ;; - - solaris*) - lt_prog_compiler_wl_GCJ='-Wl,' - lt_prog_compiler_pic_GCJ='-KPIC' - lt_prog_compiler_static_GCJ='-Bstatic' - ;; - - sunos4*) - lt_prog_compiler_wl_GCJ='-Qoption ld ' - lt_prog_compiler_pic_GCJ='-PIC' - lt_prog_compiler_static_GCJ='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - lt_prog_compiler_wl_GCJ='-Wl,' - lt_prog_compiler_pic_GCJ='-KPIC' - lt_prog_compiler_static_GCJ='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - lt_prog_compiler_pic_GCJ='-Kconform_pic' - lt_prog_compiler_static_GCJ='-Bstatic' - fi - ;; - - uts4*) - lt_prog_compiler_pic_GCJ='-pic' - lt_prog_compiler_static_GCJ='-Bstatic' - ;; - - *) - lt_prog_compiler_can_build_shared_GCJ=no - ;; - esac - fi - -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6 - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic_GCJ"; then - echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 -echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6 -if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_prog_compiler_pic_works_GCJ=no - ac_outfile=conftest.$ac_objext - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic_GCJ" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:17065: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:17069: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test ! -s conftest.err; then - lt_prog_compiler_pic_works_GCJ=yes - fi - fi - $rm conftest* - -fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6 - -if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then - case $lt_prog_compiler_pic_GCJ in - "" | " "*) ;; - *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;; - esac -else - lt_prog_compiler_pic_GCJ= - lt_prog_compiler_can_build_shared_GCJ=no -fi - -fi -case "$host_os" in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic_GCJ= - ;; - *) - lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ" - ;; -esac - -echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 -if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_cv_prog_compiler_c_o_GCJ=no - $rm -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - # According to Tom Tromey, Ian Lance Taylor reported there are C compilers - # that will create temporary files in the current directory regardless of - # the output directory. Thus, making CWD read-only will cause this test - # to fail, enabling locking or at least warning the user not to do parallel - # builds. - chmod -w . - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:17132: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:17136: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test ! -s out/conftest.err; then - lt_cv_prog_compiler_c_o_GCJ=yes - fi - fi - chmod u+w . - $rm conftest* out/* - rmdir out - cd .. - rmdir conftest - $rm conftest* - -fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6 - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 -echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 - hard_links=yes - $rm conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - echo "$as_me:$LINENO: result: $hard_links" >&5 -echo "${ECHO_T}$hard_links" >&6 - if test "$hard_links" = no; then - { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - -echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 - - runpath_var= - allow_undefined_flag_GCJ= - enable_shared_with_static_runtimes_GCJ=no - archive_cmds_GCJ= - archive_expsym_cmds_GCJ= - old_archive_From_new_cmds_GCJ= - old_archive_from_expsyms_cmds_GCJ= - export_dynamic_flag_spec_GCJ= - whole_archive_flag_spec_GCJ= - thread_safe_flag_spec_GCJ= - hardcode_libdir_flag_spec_GCJ= - hardcode_libdir_flag_spec_ld_GCJ= - hardcode_libdir_separator_GCJ= - hardcode_direct_GCJ=no - hardcode_minus_L_GCJ=no - hardcode_shlibpath_var_GCJ=unsupported - link_all_deplibs_GCJ=unknown - hardcode_automatic_GCJ=no - module_cmds_GCJ= - module_expsym_cmds_GCJ= - always_export_symbols_GCJ=no - export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - include_expsyms_GCJ= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. - exclude_expsyms_GCJ="_GLOBAL_OFFSET_TABLE_" - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - extract_expsyms_cmds= - - case $host_os in - cygwin* | mingw* | pw32*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - openbsd*) - with_gnu_ld=no - ;; - esac - - ld_shlibs_GCJ=yes - if test "$with_gnu_ld" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # See if GNU ld supports shared libraries. - case $host_os in - aix3* | aix4* | aix5*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - ld_shlibs_GCJ=no - cat <&2 - -*** Warning: the GNU linker, at least up to release 2.9.1, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to modify your PATH -*** so that a non-GNU linker is found, and then restart. - -EOF - fi - ;; - - amigaos*) - archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec_GCJ='-L$libdir' - hardcode_minus_L_GCJ=yes - - # Samuel A. Falvo II reports - # that the semantics of dynamic libraries on AmigaOS, at least up - # to version 4, is to share data among multiple programs linked - # with the same dynamic library. Since this doesn't match the - # behavior of shared libraries on other platforms, we can't use - # them. - ld_shlibs_GCJ=no - ;; - - beos*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag_GCJ=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs_GCJ=no - fi - ;; - - cygwin* | mingw* | pw32*) - # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec_GCJ='-L$libdir' - allow_undefined_flag_GCJ=unsupported - always_export_symbols_GCJ=no - enable_shared_with_static_runtimes_GCJ=yes - export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' - - if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - else - ld_shlibs=no - fi - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris* | sysv5*) - if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then - ld_shlibs_GCJ=no - cat <&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -EOF - elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs_GCJ=no - fi - ;; - - sunos4*) - archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - hardcode_direct_GCJ=yes - hardcode_shlibpath_var_GCJ=no - ;; - - *) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs_GCJ=no - fi - ;; - esac - - if test "$ld_shlibs_GCJ" = yes; then - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec_GCJ='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec_GCJ= - fi - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - allow_undefined_flag_GCJ=unsupported - always_export_symbols_GCJ=yes - archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L_GCJ=yes - if test "$GCC" = yes && test -z "$link_static_flag"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct_GCJ=unsupported - fi - ;; - - aix4* | aix5*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - if $NM -V 2>&1 | grep 'GNU' > /dev/null; then - export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix5*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds_GCJ='' - hardcode_direct_GCJ=yes - hardcode_libdir_separator_GCJ=':' - link_all_deplibs_GCJ=yes - - if test "$GCC" = yes; then - case $host_os in aix4.012|aix4.012.*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && \ - strings "$collect2name" | grep resolve_lib_name >/dev/null - then - # We have reworked collect2 - hardcode_direct_GCJ=yes - else - # We have old collect2 - hardcode_direct_GCJ=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L_GCJ=yes - hardcode_libdir_flag_spec_GCJ='-L$libdir' - hardcode_libdir_separator_GCJ= - fi - esac - shared_flag='-shared' - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - always_export_symbols_GCJ=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag_GCJ='-berok' - # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - - hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag_GCJ="-z nodefs" - archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - - hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag_GCJ=' ${wl}-bernotok' - allow_undefined_flag_GCJ=' ${wl}-berok' - # -bexpall does not export symbols beginning with underscore (_) - always_export_symbols_GCJ=yes - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec_GCJ=' ' - archive_cmds_need_lc_GCJ=yes - # This is similar to how AIX traditionally builds it's shared libraries. - archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec_GCJ='-L$libdir' - hardcode_minus_L_GCJ=yes - # see comment about different semantics on the GNU ld section - ld_shlibs_GCJ=no - ;; - - bsdi4*) - export_dynamic_flag_spec_GCJ=-rdynamic - ;; - - cygwin* | mingw* | pw32*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec_GCJ=' ' - allow_undefined_flag_GCJ=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_From_new_cmds_GCJ='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs' - fix_srcfile_path='`cygpath -w "$srcfile"`' - enable_shared_with_static_runtimes_GCJ=yes - ;; - - darwin* | rhapsody*) - if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then - archive_cmds_need_lc_GCJ=no - case "$host_os" in - rhapsody* | darwin1.[012]) - allow_undefined_flag_GCJ='-undefined suppress' - ;; - *) # Darwin 1.3 on - test -z ${LD_TWOLEVEL_NAMESPACE} && allow_undefined_flag_GCJ='-flat_namespace -undefined suppress' - ;; - esac - # FIXME: Relying on posixy $() will cause problems for - # cross-compilation, but unfortunately the echo tests do not - # yet detect zsh echo's removal of \ escapes. Also zsh mangles - # `"' quotes if we put them in here... so don't! - lt_int_apple_cc_single_mod=no - output_verbose_link_cmd='echo' - if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then - lt_int_apple_cc_single_mod=yes - fi - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - archive_cmds_GCJ='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - else - archive_cmds_GCJ='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - fi - module_cmds_GCJ='$CC -bundle ${wl}-bind_at_load $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -bundle $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - hardcode_direct_GCJ=no - hardcode_automatic_GCJ=yes - hardcode_shlibpath_var_GCJ=unsupported - whole_archive_flag_spec_GCJ='-all_load $convenience' - link_all_deplibs_GCJ=yes - fi - ;; - - dgux*) - archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec_GCJ='-L$libdir' - hardcode_shlibpath_var_GCJ=no - ;; - - freebsd1*) - ld_shlibs_GCJ=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - hardcode_libdir_flag_spec_GCJ='-R$libdir' - hardcode_direct_GCJ=yes - hardcode_shlibpath_var_GCJ=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2*) - archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_GCJ=yes - hardcode_minus_L_GCJ=yes - hardcode_shlibpath_var_GCJ=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd*) - archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec_GCJ='-R$libdir' - hardcode_direct_GCJ=yes - hardcode_shlibpath_var_GCJ=no - ;; - - hpux9*) - if test "$GCC" = yes; then - archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - fi - hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_GCJ=: - hardcode_direct_GCJ=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L_GCJ=yes - export_dynamic_flag_spec_GCJ='${wl}-E' - ;; - - hpux10* | hpux11*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then - case "$host_cpu" in - hppa*64*|ia64*) - archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case "$host_cpu" in - hppa*64*|ia64*) - archive_cmds_GCJ='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' - ;; - *) - archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - ;; - esac - fi - if test "$with_gnu_ld" = no; then - case "$host_cpu" in - hppa*64*) - hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' - hardcode_libdir_flag_spec_ld_GCJ='+b $libdir' - hardcode_libdir_separator_GCJ=: - hardcode_direct_GCJ=no - hardcode_shlibpath_var_GCJ=no - ;; - ia64*) - hardcode_libdir_flag_spec_GCJ='-L$libdir' - hardcode_direct_GCJ=no - hardcode_shlibpath_var_GCJ=no - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L_GCJ=yes - ;; - *) - hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_GCJ=: - hardcode_direct_GCJ=yes - export_dynamic_flag_spec_GCJ='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L_GCJ=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir' - fi - hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_GCJ=: - link_all_deplibs_GCJ=yes - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - hardcode_libdir_flag_spec_GCJ='-R$libdir' - hardcode_direct_GCJ=yes - hardcode_shlibpath_var_GCJ=no - ;; - - newsos6) - archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_GCJ=yes - hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_GCJ=: - hardcode_shlibpath_var_GCJ=no - ;; - - openbsd*) - hardcode_direct_GCJ=yes - hardcode_shlibpath_var_GCJ=no - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' - export_dynamic_flag_spec_GCJ='${wl}-E' - else - case $host_os in - openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) - archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec_GCJ='-R$libdir' - ;; - *) - archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' - ;; - esac - fi - ;; - - os2*) - hardcode_libdir_flag_spec_GCJ='-L$libdir' - hardcode_minus_L_GCJ=yes - allow_undefined_flag_GCJ=unsupported - archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - allow_undefined_flag_GCJ=' -expect_unresolved \*' - archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - fi - hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_GCJ=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' - else - allow_undefined_flag_GCJ=' -expect_unresolved \*' - archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ - $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' - - # Both c and cxx compiler support -rpath directly - hardcode_libdir_flag_spec_GCJ='-rpath $libdir' - fi - hardcode_libdir_separator_GCJ=: - ;; - - sco3.2v5*) - archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var_GCJ=no - export_dynamic_flag_spec_GCJ='${wl}-Bexport' - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ;; - - solaris*) - no_undefined_flag_GCJ=' -z text' - if test "$GCC" = yes; then - archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' - else - archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - fi - hardcode_libdir_flag_spec_GCJ='-R$libdir' - hardcode_shlibpath_var_GCJ=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;; - esac - link_all_deplibs_GCJ=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - hardcode_libdir_flag_spec_GCJ='-L$libdir' - hardcode_direct_GCJ=yes - hardcode_minus_L_GCJ=yes - hardcode_shlibpath_var_GCJ=no - ;; - - sysv4) - case $host_vendor in - sni) - archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_GCJ=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' - reload_cmds_GCJ='$CC -r -o $output$reload_objs' - hardcode_direct_GCJ=no - ;; - motorola) - archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var_GCJ=no - ;; - - sysv4.3*) - archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var_GCJ=no - export_dynamic_flag_spec_GCJ='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var_GCJ=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ld_shlibs_GCJ=yes - fi - ;; - - sysv4.2uw2*) - archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_GCJ=yes - hardcode_minus_L_GCJ=no - hardcode_shlibpath_var_GCJ=no - hardcode_runpath_var=yes - runpath_var=LD_RUN_PATH - ;; - - sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) - no_undefined_flag_GCJ='${wl}-z ${wl}text' - if test "$GCC" = yes; then - archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds_GCJ='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var_GCJ=no - ;; - - sysv5*) - no_undefined_flag_GCJ=' -z text' - # $CC -shared without GNU ld will not create a library from C++ - # object files and a static libstdc++, better avoid it by now - archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - hardcode_libdir_flag_spec_GCJ= - hardcode_shlibpath_var_GCJ=no - runpath_var='LD_RUN_PATH' - ;; - - uts4*) - archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec_GCJ='-L$libdir' - hardcode_shlibpath_var_GCJ=no - ;; - - *) - ld_shlibs_GCJ=no - ;; - esac - fi - -echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5 -echo "${ECHO_T}$ld_shlibs_GCJ" >&6 -test "$ld_shlibs_GCJ" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc_GCJ" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc_GCJ=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds_GCJ in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 - $rm conftest* - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl_GCJ - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ - allow_undefined_flag_GCJ= - if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 - (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - then - archive_cmds_need_lc_GCJ=no - else - archive_cmds_need_lc_GCJ=yes - fi - allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $rm conftest* - echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5 -echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6 - ;; - esac - fi - ;; -esac - -echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 -hardcode_action_GCJ= -if test -n "$hardcode_libdir_flag_spec_GCJ" || \ - test -n "$runpath_var GCJ" || \ - test "X$hardcode_automatic_GCJ"="Xyes" ; then - - # We can hardcode non-existant directories. - if test "$hardcode_direct_GCJ" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && - test "$hardcode_minus_L_GCJ" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action_GCJ=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action_GCJ=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action_GCJ=unsupported -fi -echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 -echo "${ECHO_T}$hardcode_action_GCJ" >&6 - -if test "$hardcode_action_GCJ" = relink; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - -striplib= -old_striplib= -echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 -echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 -if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - ;; - *) - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 - ;; - esac -fi - -echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -if test "$GCC" = yes; then - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix4* | aix5*) - version_type=linux - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done' - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi4*) - version_type=linux - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32*) - version_type=windows - shrext=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$host_os in - yes,cygwin* | yes,mingw* | yes,pw32*) - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $rm \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec="/lib /lib/w32api /usr/lib /usr/local/lib" - ;; - mingw*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH printed by - # mingw gcc, but we are running on Cygwin. Gcc prints its search - # path with ; separators, and with drive letters. We can handle the - # drive letters (cygwin fileutils understands them), so leave them, - # especially as we might pass files found there to a mingw objdump, - # which wouldn't understand a cygwinified path. Ahh. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' - ;; - esac - ;; - - *) - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - ;; - esac - dynamic_linker='Win32 ld.exe' - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - # FIXME: Relying on posixy $() will cause problems for - # cross-compilation, but unfortunately the echo tests do not - # yet detect zsh echo's removal of \ escapes. - library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext='$(test .$module = .yes && echo .so || echo .dylib)' - # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. - if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then - sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` - fi - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd1*) - dynamic_linker=no - ;; - -freebsd*) - objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.01* | freebsdelf3.01*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - *) # from 3.2 on - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case "$host_cpu" in - ia64*) - shrext='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555. - postinstall_cmds='chmod 555 $lib' - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be Linux ELF. -linux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -nto-qnx) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -openbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -sco3.2v5*) - version_type=osf - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - ;; - -solaris*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - export_dynamic_flag_spec='${wl}-Blargedynsym' - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -uts4*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -echo "$as_me:$LINENO: result: $dynamic_linker" >&5 -echo "${ECHO_T}$dynamic_linker" >&6 -test "$dynamic_linker" = no && can_build_shared=no - -if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 -if test "${ac_cv_lib_dl_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char dlopen (); -int -main () -{ -dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_dl_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dl_dlopen=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 -if test $ac_cv_lib_dl_dlopen = yes; then - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - -fi - - ;; - - *) - echo "$as_me:$LINENO: checking for shl_load" >&5 -echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 -if test "${ac_cv_func_shl_load+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define shl_load to an innocuous variant, in case declares shl_load. - For example, HP-UX 11i declares gettimeofday. */ -#define shl_load innocuous_shl_load - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char shl_load (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef shl_load - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char shl_load (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_shl_load) || defined (__stub___shl_load) -choke me -#else -char (*f) () = shl_load; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != shl_load; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_shl_load=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_shl_load=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 -echo "${ECHO_T}$ac_cv_func_shl_load" >&6 -if test $ac_cv_func_shl_load = yes; then - lt_cv_dlopen="shl_load" -else - echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 -echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 -if test "${ac_cv_lib_dld_shl_load+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char shl_load (); -int -main () -{ -shl_load (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_dld_shl_load=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dld_shl_load=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 -if test $ac_cv_lib_dld_shl_load = yes; then - lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" -else - echo "$as_me:$LINENO: checking for dlopen" >&5 -echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 -if test "${ac_cv_func_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define dlopen to an innocuous variant, in case declares dlopen. - For example, HP-UX 11i declares gettimeofday. */ -#define dlopen innocuous_dlopen - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char dlopen (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef dlopen - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char dlopen (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_dlopen) || defined (__stub___dlopen) -choke me -#else -char (*f) () = dlopen; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != dlopen; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_dlopen=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 -echo "${ECHO_T}$ac_cv_func_dlopen" >&6 -if test $ac_cv_func_dlopen = yes; then - lt_cv_dlopen="dlopen" -else - echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 -if test "${ac_cv_lib_dl_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char dlopen (); -int -main () -{ -dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_dl_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dl_dlopen=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 -if test $ac_cv_lib_dl_dlopen = yes; then - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 -echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 -if test "${ac_cv_lib_svld_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsvld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char dlopen (); -int -main () -{ -dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_svld_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_svld_dlopen=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 -if test $ac_cv_lib_svld_dlopen = yes; then - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" -else - echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 -echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 -if test "${ac_cv_lib_dld_dld_link+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char dld_link (); -int -main () -{ -dld_link (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_dld_dld_link=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dld_dld_link=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 -if test $ac_cv_lib_dld_dld_link = yes; then - lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" -fi - - -fi - - -fi - - -fi - - -fi - - fi - ;; - esac - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS="$LDFLAGS" - eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 -echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 -if test "${lt_cv_dlopen_self+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext < -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -#ifdef __cplusplus -extern "C" void exit (int); -#endif - -void fnord() { int i=42;} -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - /* dlclose (self); */ - } - - exit (status); -} -EOF - if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; - x$lt_unknown|x*) lt_cv_dlopen_self=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self=no - fi -fi -rm -fr conftest* - - -fi -echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 -echo "${ECHO_T}$lt_cv_dlopen_self" >&6 - - if test "x$lt_cv_dlopen_self" = xyes; then - LDFLAGS="$LDFLAGS $link_static_flag" - echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 -echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 -if test "${lt_cv_dlopen_self_static+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self_static=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext < -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -#ifdef __cplusplus -extern "C" void exit (int); -#endif - -void fnord() { int i=42;} -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - /* dlclose (self); */ - } - - exit (status); -} -EOF - if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self_static=no - fi -fi -rm -fr conftest* - - -fi -echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 -echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 - fi - - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi - - -# The else clause should only fire when bootstrapping the -# libtool distribution, otherwise you forgot to ship ltmain.sh -# with your package, and you will get complaints that there are -# no rules to generate ltmain.sh. -if test -f "$ltmain"; then - # See if we are running on zsh, and set the options which allow our commands through - # without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - # Now quote all the things that may contain metacharacters while being - # careful not to overquote the AC_SUBSTed values. We take copies of the - # variables and quote the copies for generation of the libtool script. - for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM SED SHELL \ - libname_spec library_names_spec soname_spec extract_expsyms_cmds \ - old_striplib striplib file_magic_cmd finish_cmds finish_eval \ - deplibs_check_method reload_flag reload_cmds need_locks \ - lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ - lt_cv_sys_global_symbol_to_c_name_address \ - sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ - old_postinstall_cmds old_postuninstall_cmds \ - compiler_GCJ \ - CC_GCJ \ - LD_GCJ \ - lt_prog_compiler_wl_GCJ \ - lt_prog_compiler_pic_GCJ \ - lt_prog_compiler_static_GCJ \ - lt_prog_compiler_no_builtin_flag_GCJ \ - export_dynamic_flag_spec_GCJ \ - thread_safe_flag_spec_GCJ \ - whole_archive_flag_spec_GCJ \ - enable_shared_with_static_runtimes_GCJ \ - old_archive_cmds_GCJ \ - old_archive_from_new_cmds_GCJ \ - predep_objects_GCJ \ - postdep_objects_GCJ \ - predeps_GCJ \ - postdeps_GCJ \ - compiler_lib_search_path_GCJ \ - archive_cmds_GCJ \ - archive_expsym_cmds_GCJ \ - postinstall_cmds_GCJ \ - postuninstall_cmds_GCJ \ - old_archive_from_expsyms_cmds_GCJ \ - allow_undefined_flag_GCJ \ - no_undefined_flag_GCJ \ - export_symbols_cmds_GCJ \ - hardcode_libdir_flag_spec_GCJ \ - hardcode_libdir_flag_spec_ld_GCJ \ - hardcode_libdir_separator_GCJ \ - hardcode_automatic_GCJ \ - module_cmds_GCJ \ - module_expsym_cmds_GCJ \ - lt_cv_prog_compiler_c_o_GCJ \ - exclude_expsyms_GCJ \ - include_expsyms_GCJ; do - - case $var in - old_archive_cmds_GCJ | \ - old_archive_from_new_cmds_GCJ | \ - archive_cmds_GCJ | \ - archive_expsym_cmds_GCJ | \ - module_cmds_GCJ | \ - module_expsym_cmds_GCJ | \ - old_archive_from_expsyms_cmds_GCJ | \ - export_symbols_cmds_GCJ | \ - extract_expsyms_cmds | reload_cmds | finish_cmds | \ - postinstall_cmds | postuninstall_cmds | \ - old_postinstall_cmds | old_postuninstall_cmds | \ - sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) - # Double-quote double-evaled strings. - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" - ;; - *) - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" - ;; - esac - done - - case $lt_echo in - *'\$0 --fallback-echo"') - lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` - ;; - esac - -cfgfile="$ofile" - - cat <<__EOF__ >> "$cfgfile" -# ### BEGIN LIBTOOL TAG CONFIG: $tagname - -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc_GCJ - -# Whether or not to disallow shared libs when runtime libs are static -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# The host system. -host_alias=$host_alias -host=$host - -# An echo program that does not interpret backslashes. -echo=$lt_echo - -# The archiver. -AR=$lt_AR -AR_FLAGS=$lt_AR_FLAGS - -# A C compiler. -LTCC=$lt_LTCC - -# A language-specific compiler. -CC=$lt_compiler_GCJ - -# Is the compiler the GNU C compiler? -with_gcc=$GCC_GCJ - -# An ERE matcher. -EGREP=$lt_EGREP - -# The linker used to build libraries. -LD=$lt_LD_GCJ - -# Whether we need hard or soft links. -LN_S=$lt_LN_S - -# A BSD-compatible nm program. -NM=$lt_NM - -# A symbol stripping program -STRIP=$STRIP - -# Used to examine libraries when file_magic_cmd begins "file" -MAGIC_CMD=$MAGIC_CMD - -# Used on cygwin: DLL creation program. -DLLTOOL="$DLLTOOL" - -# Used on cygwin: object dumper. -OBJDUMP="$OBJDUMP" - -# Used on cygwin: assembler. -AS="$AS" - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl_GCJ - -# Object file suffix (normally "o"). -objext="$ac_objext" - -# Old archive suffix (normally "a"). -libext="$libext" - -# Shared library suffix (normally ".so"). -shrext='$shrext' - -# Executable file suffix (normally ""). -exeext="$exeext" - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic_GCJ -pic_mode=$pic_mode - -# What is the maximum length of a command? -max_cmd_len=$lt_cv_sys_max_cmd_len - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ - -# Must we lock files when doing compilation ? -need_locks=$lt_need_locks - -# Do we need the lib prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static_GCJ - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ - -# Compiler flag to generate thread-safe objects. -thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ - -# Library versioning type. -version_type=$version_type - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME. -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Commands used to build and install an old-style archive. -RANLIB=$lt_RANLIB -old_archive_cmds=$lt_old_archive_cmds_GCJ -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ - -# Commands used to build and install a shared archive. -archive_cmds=$lt_archive_cmds_GCJ -archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ -postinstall_cmds=$lt_postinstall_cmds -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to build a loadable module (assumed same as above if empty) -module_cmds=$lt_module_cmds_GCJ -module_expsym_cmds=$lt_module_expsym_cmds_GCJ - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - -# Dependencies to place before the objects being linked to create a -# shared library. -predep_objects=$lt_predep_objects_GCJ - -# Dependencies to place after the objects being linked to create a -# shared library. -postdep_objects=$lt_postdep_objects_GCJ - -# Dependencies to place before the objects being linked to create a -# shared library. -predeps=$lt_predeps_GCJ - -# Dependencies to place after the objects being linked to create a -# shared library. -postdeps=$lt_postdeps_GCJ - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method == file_magic. -file_magic_cmd=$lt_file_magic_cmd - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag_GCJ - -# Flag that forces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag_GCJ - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# Same as above, but a single script fragment to be evaled but not shown. -finish_eval=$lt_finish_eval - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# This is the shared library runtime path variable. -runpath_var=$runpath_var - -# This is the shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action_GCJ - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist. -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ - -# If ld is used when linking, flag to hardcode \$libdir into -# a binary during linking. This must work even if \$libdir does -# not exist. -hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ - -# Whether we need a single -rpath flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ - -# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the -# resulting binary. -hardcode_direct=$hardcode_direct_GCJ - -# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -# resulting binary. -hardcode_minus_L=$hardcode_minus_L_GCJ - -# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -# the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ - -# Set to yes if building a shared library automatically hardcodes DIR into the library -# and all subsequent libraries and executables linked against it. -hardcode_automatic=$hardcode_automatic_GCJ - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at relink time. -variables_saved_for_relink="$variables_saved_for_relink" - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs_GCJ - -# Compile-time system search path for libraries -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Fix the shell variable \$srcfile for the compiler. -fix_srcfile_path="$fix_srcfile_path_GCJ" - -# Set to yes if exported symbols are required. -always_export_symbols=$always_export_symbols_GCJ - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds_GCJ - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms_GCJ - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms_GCJ - -# ### END LIBTOOL TAG CONFIG: $tagname - -__EOF__ - - -else - # If there is no Makefile yet, we rely on a make rule to execute - # `config.status --recheck' to rerun these tests and create the - # libtool script then. - test -f Makefile && make "$ltmain" -fi - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -CC="$lt_save_CC" - - else - tagname="" - fi - ;; - - RC) - - - -# Source file extension for RC test sources. -ac_ext=rc - -# Object file extension for compiled RC test sources. -objext=o -objext_RC=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n' - -# Code to be used in simple link tests -lt_simple_link_test_code="$lt_simple_compile_test_code" - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# Allow CC to be a program name with arguments. -lt_save_CC="$CC" -CC=${RC-"windres"} -compiler=$CC -compiler_RC=$CC -lt_cv_prog_compiler_c_o_RC=yes - -# The else clause should only fire when bootstrapping the -# libtool distribution, otherwise you forgot to ship ltmain.sh -# with your package, and you will get complaints that there are -# no rules to generate ltmain.sh. -if test -f "$ltmain"; then - # See if we are running on zsh, and set the options which allow our commands through - # without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - # Now quote all the things that may contain metacharacters while being - # careful not to overquote the AC_SUBSTed values. We take copies of the - # variables and quote the copies for generation of the libtool script. - for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM SED SHELL \ - libname_spec library_names_spec soname_spec extract_expsyms_cmds \ - old_striplib striplib file_magic_cmd finish_cmds finish_eval \ - deplibs_check_method reload_flag reload_cmds need_locks \ - lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ - lt_cv_sys_global_symbol_to_c_name_address \ - sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ - old_postinstall_cmds old_postuninstall_cmds \ - compiler_RC \ - CC_RC \ - LD_RC \ - lt_prog_compiler_wl_RC \ - lt_prog_compiler_pic_RC \ - lt_prog_compiler_static_RC \ - lt_prog_compiler_no_builtin_flag_RC \ - export_dynamic_flag_spec_RC \ - thread_safe_flag_spec_RC \ - whole_archive_flag_spec_RC \ - enable_shared_with_static_runtimes_RC \ - old_archive_cmds_RC \ - old_archive_from_new_cmds_RC \ - predep_objects_RC \ - postdep_objects_RC \ - predeps_RC \ - postdeps_RC \ - compiler_lib_search_path_RC \ - archive_cmds_RC \ - archive_expsym_cmds_RC \ - postinstall_cmds_RC \ - postuninstall_cmds_RC \ - old_archive_from_expsyms_cmds_RC \ - allow_undefined_flag_RC \ - no_undefined_flag_RC \ - export_symbols_cmds_RC \ - hardcode_libdir_flag_spec_RC \ - hardcode_libdir_flag_spec_ld_RC \ - hardcode_libdir_separator_RC \ - hardcode_automatic_RC \ - module_cmds_RC \ - module_expsym_cmds_RC \ - lt_cv_prog_compiler_c_o_RC \ - exclude_expsyms_RC \ - include_expsyms_RC; do - - case $var in - old_archive_cmds_RC | \ - old_archive_from_new_cmds_RC | \ - archive_cmds_RC | \ - archive_expsym_cmds_RC | \ - module_cmds_RC | \ - module_expsym_cmds_RC | \ - old_archive_from_expsyms_cmds_RC | \ - export_symbols_cmds_RC | \ - extract_expsyms_cmds | reload_cmds | finish_cmds | \ - postinstall_cmds | postuninstall_cmds | \ - old_postinstall_cmds | old_postuninstall_cmds | \ - sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) - # Double-quote double-evaled strings. - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" - ;; - *) - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" - ;; - esac - done - - case $lt_echo in - *'\$0 --fallback-echo"') - lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` - ;; - esac - -cfgfile="$ofile" - - cat <<__EOF__ >> "$cfgfile" -# ### BEGIN LIBTOOL TAG CONFIG: $tagname - -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc_RC - -# Whether or not to disallow shared libs when runtime libs are static -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# The host system. -host_alias=$host_alias -host=$host - -# An echo program that does not interpret backslashes. -echo=$lt_echo - -# The archiver. -AR=$lt_AR -AR_FLAGS=$lt_AR_FLAGS - -# A C compiler. -LTCC=$lt_LTCC - -# A language-specific compiler. -CC=$lt_compiler_RC - -# Is the compiler the GNU C compiler? -with_gcc=$GCC_RC - -# An ERE matcher. -EGREP=$lt_EGREP - -# The linker used to build libraries. -LD=$lt_LD_RC - -# Whether we need hard or soft links. -LN_S=$lt_LN_S - -# A BSD-compatible nm program. -NM=$lt_NM - -# A symbol stripping program -STRIP=$STRIP - -# Used to examine libraries when file_magic_cmd begins "file" -MAGIC_CMD=$MAGIC_CMD - -# Used on cygwin: DLL creation program. -DLLTOOL="$DLLTOOL" - -# Used on cygwin: object dumper. -OBJDUMP="$OBJDUMP" - -# Used on cygwin: assembler. -AS="$AS" - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl_RC - -# Object file suffix (normally "o"). -objext="$ac_objext" - -# Old archive suffix (normally "a"). -libext="$libext" - -# Shared library suffix (normally ".so"). -shrext='$shrext' - -# Executable file suffix (normally ""). -exeext="$exeext" - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic_RC -pic_mode=$pic_mode - -# What is the maximum length of a command? -max_cmd_len=$lt_cv_sys_max_cmd_len - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC - -# Must we lock files when doing compilation ? -need_locks=$lt_need_locks - -# Do we need the lib prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static_RC - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC - -# Compiler flag to generate thread-safe objects. -thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC - -# Library versioning type. -version_type=$version_type - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME. -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Commands used to build and install an old-style archive. -RANLIB=$lt_RANLIB -old_archive_cmds=$lt_old_archive_cmds_RC -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC - -# Commands used to build and install a shared archive. -archive_cmds=$lt_archive_cmds_RC -archive_expsym_cmds=$lt_archive_expsym_cmds_RC -postinstall_cmds=$lt_postinstall_cmds -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to build a loadable module (assumed same as above if empty) -module_cmds=$lt_module_cmds_RC -module_expsym_cmds=$lt_module_expsym_cmds_RC - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - -# Dependencies to place before the objects being linked to create a -# shared library. -predep_objects=$lt_predep_objects_RC - -# Dependencies to place after the objects being linked to create a -# shared library. -postdep_objects=$lt_postdep_objects_RC - -# Dependencies to place before the objects being linked to create a -# shared library. -predeps=$lt_predeps_RC - -# Dependencies to place after the objects being linked to create a -# shared library. -postdeps=$lt_postdeps_RC - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path_RC - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method == file_magic. -file_magic_cmd=$lt_file_magic_cmd - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag_RC - -# Flag that forces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag_RC - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# Same as above, but a single script fragment to be evaled but not shown. -finish_eval=$lt_finish_eval - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# This is the shared library runtime path variable. -runpath_var=$runpath_var - -# This is the shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action_RC - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist. -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC - -# If ld is used when linking, flag to hardcode \$libdir into -# a binary during linking. This must work even if \$libdir does -# not exist. -hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC - -# Whether we need a single -rpath flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC - -# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the -# resulting binary. -hardcode_direct=$hardcode_direct_RC - -# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -# resulting binary. -hardcode_minus_L=$hardcode_minus_L_RC - -# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -# the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var_RC - -# Set to yes if building a shared library automatically hardcodes DIR into the library -# and all subsequent libraries and executables linked against it. -hardcode_automatic=$hardcode_automatic_RC - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at relink time. -variables_saved_for_relink="$variables_saved_for_relink" - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs_RC - -# Compile-time system search path for libraries -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Fix the shell variable \$srcfile for the compiler. -fix_srcfile_path="$fix_srcfile_path_RC" - -# Set to yes if exported symbols are required. -always_export_symbols=$always_export_symbols_RC - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds_RC - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms_RC - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms_RC - -# ### END LIBTOOL TAG CONFIG: $tagname - -__EOF__ - - -else - # If there is no Makefile yet, we rely on a make rule to execute - # `config.status --recheck' to rerun these tests and create the - # libtool script then. - test -f Makefile && make "$ltmain" -fi - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -CC="$lt_save_CC" - - ;; - - *) - { { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5 -echo "$as_me: error: Unsupported tag name: $tagname" >&2;} - { (exit 1); exit 1; }; } - ;; - esac - - # Append the new tag name to the list of available tags. - if test -n "$tagname" ; then - available_tags="$available_tags $tagname" - fi - fi - done - IFS="$lt_save_ifs" - - # Now substitute the updated list of available tags. - if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then - mv "${ofile}T" "$ofile" - chmod +x "$ofile" - else - rm -f "${ofile}T" - { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5 -echo "$as_me: error: unable to update list of available tagged configurations." >&2;} - { (exit 1); exit 1; }; } - fi -fi @@ -20334,42 +8752,9 @@ LIBTOOL='$(SHELL) $(top_builddir)/libtool' - - - - - - - - - - - - - - - - - - - -# configuration file -- stay in 8.3 limit -# -# since #undef doesn't survive in configuration header files we replace -# `/undef' with `#undef' after creating the output file - - ac_config_headers="$ac_config_headers ftconfig.h:ftconfig.in" - - -# create the Unix-specific sub-Makefiles `builds/unix/unix-def.mk' -# and 'builds/unix/unix-cc.mk' that will be used by the build system -# ac_config_files="$ac_config_files unix-cc.mk:unix-cc.in unix-def.mk:unix-def.in freetype-config freetype2.pc:freetype2.in" -# re-generate the Jamfile to use libtool now -# -# AC_CONFIG_FILES([../../Jamfile:../../Jamfile.in]) cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -20399,13 +8784,13 @@ _ACEOF # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } | @@ -20416,7 +8801,7 @@ _ACEOF t end /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ : end' >>confcache -if diff $cache_file confcache >/dev/null 2>&1; then :; else +if cmp -s $cache_file confcache; then :; else if test -w $cache_file; then test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" cat confcache >$cache_file @@ -20435,13 +8820,13 @@ test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ + ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; -s/^\([^=]*=[ ]*\):*/\1/; +s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; -s/^[^=]*=[ ]*$//; +s/^[^=]*=[ ]*$//; }' fi @@ -20452,7 +8837,7 @@ ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_i=`echo "$ac_i" | - sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + sed 's/\$U\././;s/\.o$//;s/\.obj$//'` # 2. Add them. ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' @@ -20476,8 +8861,6 @@ cat >$CONFIG_STATUS <<_ACEOF # configure, is in config.log if it exists. debug=false -ac_cs_recheck=false -ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF @@ -20496,10 +8879,9 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi -DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then as_unset=unset else as_unset=false @@ -20513,12 +8895,9 @@ PS2='> ' PS4='+ ' # NLS nuisances. -for as_var in \ - LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ - LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ - LC_TELEPHONE LC_TIME +for as_var in LANG LANGUAGE LC_ALL LC_COLLATE LC_CTYPE LC_NUMERIC LC_MESSAGES LC_TIME do - if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var @@ -20562,15 +8941,15 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + echo "#! /bin/sh" >conftest.sh + echo "exit 0" >>conftest.sh + chmod +x conftest.sh + if (PATH="/nonexistent;."; conftest.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi - rm -f conf$$.sh + rm -f conftest.sh fi @@ -20697,17 +9076,16 @@ rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else - test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" +as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" # Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" +as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" # IFS @@ -20734,7 +9112,7 @@ _ASBOX cat >&5 <<_CSEOF This file was extended by $as_me, which was -generated by GNU Autoconf 2.59. Invocation command line was +generated by GNU Autoconf 2.54. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -20774,13 +9152,12 @@ Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number, then exit - -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] - instantiate the configuration file FILE + instantiate the configuration file FILE --header=FILE[:TEMPLATE] - instantiate the configuration header FILE + instantiate the configuration header FILE Configuration files: $config_files @@ -20794,10 +9171,11 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ config.status -configured by $0, generated by GNU Autoconf 2.59, +configured by $0, generated by GNU Autoconf 2.54, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" -Copyright (C) 2003 Free Software Foundation, Inc. +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." srcdir=$srcdir @@ -20830,9 +9208,12 @@ do case $ac_option in # Handling of the options. _ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; + echo "running $SHELL $0 " $ac_configure_args " --no-create --no-recursion" + exec $SHELL $0 $ac_configure_args --no-create --no-recursion ;; +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF --version | --vers* | -V ) echo "$ac_cs_version"; exit 0 ;; --he | --h) @@ -20854,9 +9235,6 @@ Try \`$0 --help' for more information." >&2;} $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; # This is an error. -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 @@ -20871,20 +9249,6 @@ Try \`$0 --help' for more information." >&2;} shift done -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF -if \$ac_cs_recheck; then - echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 - exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion -fi - _ACEOF @@ -20916,9 +9280,6 @@ if $ac_need_defaults; then test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason to put it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. # Create a temporary directory, and hook for its removal unless debugging. $debug || { @@ -20927,17 +9288,17 @@ $debug || } # Create a (secure) tmp directory for tmp files. - +: ${TMPDIR=/tmp} { - tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { - tmp=./confstat$$-$RANDOM + tmp=$TMPDIR/cs$$-$RANDOM (umask 077 && mkdir $tmp) } || { - echo "$me: cannot create a temporary directory in ." >&2 + echo "$me: cannot create a temporary directory in $TMPDIR" >&2 { (exit 1); exit 1; } } @@ -21020,19 +9381,10 @@ s,@LIBZ@,$LIBZ,;t t s,@SYSTEM_ZLIB@,$SYSTEM_ZLIB,;t t s,@LN_S@,$LN_S,;t t s,@ECHO@,$ECHO,;t t -s,@AR@,$AR,;t t -s,@ac_ct_AR@,$ac_ct_AR,;t t s,@RANLIB@,$RANLIB,;t t s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t s,@STRIP@,$STRIP,;t t s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t -s,@CXX@,$CXX,;t t -s,@CXXFLAGS@,$CXXFLAGS,;t t -s,@ac_ct_CXX@,$ac_ct_CXX,;t t -s,@CXXCPP@,$CXXCPP,;t t -s,@F77@,$F77,;t t -s,@FFLAGS@,$FFLAGS,;t t -s,@ac_ct_F77@,$ac_ct_F77,;t t s,@LIBTOOL@,$LIBTOOL,;t t s,@LIBOBJS@,$LIBOBJS,;t t s,@LTLIBOBJS@,$LTLIBOBJS,;t t @@ -21065,9 +9417,9 @@ _ACEOF (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" else - ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr $ac_sed_frag + 1` ac_beg=$ac_end @@ -21085,21 +9437,21 @@ for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin - cat >$tmp/stdin - ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } @@ -21115,10 +9467,10 @@ echo X"$ac_file" | as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } @@ -21156,45 +9508,12 @@ case $srcdir in ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac - -# Do not use `cd foo && pwd` to compute absolute paths, because -# the directories may not exist. -case `pwd` in -.) ac_abs_builddir="$ac_dir";; -*) - case "$ac_dir" in - .) ac_abs_builddir=`pwd`;; - [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; - *) ac_abs_builddir=`pwd`/"$ac_dir";; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_builddir=${ac_top_builddir}.;; -*) - case ${ac_top_builddir}. in - .) ac_abs_top_builddir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; - *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_srcdir=$ac_srcdir;; -*) - case $ac_srcdir in - .) ac_abs_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; - *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_srcdir=$ac_top_srcdir;; -*) - case $ac_top_srcdir in - .) ac_abs_top_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; - *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; - esac;; -esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` case $INSTALL in @@ -21216,7 +9535,7 @@ echo "$as_me: creating $ac_file" >&6;} configure_input="$ac_file. " fi configure_input=$configure_input"Generated from `echo $ac_file_in | - sed 's,.*/,,'` by configure." + sed 's,.*/,,'` by configure." # First look for the input files in the build tree, otherwise in the # src tree. @@ -21225,24 +9544,24 @@ echo "$as_me: creating $ac_file" >&6;} case $f in -) echo $tmp/stdin ;; [\\/$]*) - # Absolute (can't be DOS-style, as IFS=:) - test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } - echo "$f";; + echo $f;; *) # Relative - if test -f "$f"; then - # Build tree - echo "$f" - elif test -f "$srcdir/$f"; then - # Source tree - echo "$srcdir/$f" - else - # /dev/null tree - { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo $srcdir/$f + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } - fi;; + fi;; esac done` || { (exit 1); exit 1; } _ACEOF @@ -21284,12 +9603,12 @@ cat >>$CONFIG_STATUS <<\_ACEOF # NAME is the cpp macro being defined and VALUE is the value it is being given. # # ac_d sets the value in "#define NAME VALUE" lines. -ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' -ac_dB='[ ].*$,\1#\2' +ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='[ ].*$,\1#\2' ac_dC=' ' ac_dD=',;t' # ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". -ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ac_uB='$,\1#\2define\3' ac_uC=' ' ac_uD=',;t' @@ -21298,11 +9617,11 @@ for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin - cat >$tmp/stdin - ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac @@ -21316,29 +9635,28 @@ echo "$as_me: creating $ac_file" >&6;} case $f in -) echo $tmp/stdin ;; [\\/$]*) - # Absolute (can't be DOS-style, as IFS=:) - test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } - # Do quote $f, to prevent DOS paths from being IFS'd. - echo "$f";; + echo $f;; *) # Relative - if test -f "$f"; then - # Build tree - echo "$f" - elif test -f "$srcdir/$f"; then - # Source tree - echo "$srcdir/$f" - else - # /dev/null tree - { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo $srcdir/$f + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } - fi;; + fi;; esac done` || { (exit 1); exit 1; } # Remove the trailing spaces. - sed 's/[ ]*$//' $ac_file_inputs >$tmp/in + sed 's/[ ]*$//' $ac_file_inputs >$tmp/in _ACEOF @@ -21361,9 +9679,9 @@ s/[\\&,]/\\&/g s,[\\$`],\\&,g t clear : clear -s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp t end -s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp : end _ACEOF # If some macros were called several times there might be several times @@ -21377,13 +9695,13 @@ rm -f confdef2sed.sed # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. cat >>conftest.undefs <<\_ACEOF -s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, +s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, _ACEOF # Break up conftest.defines because some shells have a limit on the size # of here documents, and old seds have small limits too (100 cmds). echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS -echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS +echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS echo ' :' >>$CONFIG_STATUS rm -f conftest.tail @@ -21392,7 +9710,7 @@ do # Write a limited-size here document to $tmp/defines.sed. echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS # Speed up: don't consider the non `#define' lines. - echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS + echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS # Work around the forget-to-reset-the-flag bug. echo 't clr' >>$CONFIG_STATUS echo ': clr' >>$CONFIG_STATUS @@ -21419,7 +9737,7 @@ do # Write a limited-size here document to $tmp/undefs.sed. echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS # Speed up: don't consider the non `#undef' - echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS + echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS # Work around the forget-to-reset-the-flag bug. echo 't clr' >>$CONFIG_STATUS echo ': clr' >>$CONFIG_STATUS @@ -21447,16 +9765,16 @@ cat >>$CONFIG_STATUS <<\_ACEOF cat $tmp/in >>$tmp/config.h rm -f $tmp/in if test x"$ac_file" != x-; then - if diff $ac_file $tmp/config.h >/dev/null 2>&1; then + if cmp -s $ac_file $tmp/config.h 2>/dev/null; then { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 echo "$as_me: $ac_file is unchanged" >&6;} else ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } @@ -21472,10 +9790,10 @@ echo X"$ac_file" | as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } @@ -21495,12 +9813,6 @@ echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} cat $tmp/config.h rm -f $tmp/config.h fi - # Run the commands associated with the file. - case $ac_file in - ftconfig.h ) mv ftconfig.h ftconfig.tmp - sed 's|/undef|#undef|' < ftconfig.tmp > ftconfig.h - rm ftconfig.tmp ;; - esac done _ACEOF @@ -21522,11 +9834,8 @@ ac_clean_files=$ac_clean_files_save # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: - ac_config_status_args= - test "$silent" = yes && - ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null - $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + $SHELL $CONFIG_STATUS || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. @@ -21534,4 +9843,3 @@ if test "$no_create" != yes; then fi -# end of configure.ac diff --git a/reactos/lib/freetype/builds/unix/configure.ac b/reactos/lib/freetype/builds/unix/configure.ac index 89ba574aa5d..5f4d7ef82ab 100644 --- a/reactos/lib/freetype/builds/unix/configure.ac +++ b/reactos/lib/freetype/builds/unix/configure.ac @@ -1,121 +1,91 @@ -# This file is part of the FreeType project. -# -# Process this file with autoconf to produce a configure script. +dnl This file is part of the FreeType project. +dnl +dnl Process this file with autoconf to produce a configure script. +dnl AC_INIT AC_CONFIG_SRCDIR([ftconfig.in]) +dnl configuration file -- stay in 8.3 limit +AC_CONFIG_HEADER(ftconfig.h:ftconfig.in) -# Don't forget to update docs/VERSION.DLL! - -version_info='9:6:3' -AC_SUBST([version_info]) +dnl Don't forget to update VERSION.DLL! +version_info='9:4:3' +AC_SUBST(version_info) ft_version=`echo $version_info | tr : .` -AC_SUBST([ft_version]) +AC_SUBST(ft_version) +dnl checks for system type +AC_CANONICAL_TARGET([]) -# checks for system type - -AC_CANONICAL_TARGET - - -# checks for programs - +dnl checks for programs AC_PROG_CC AC_PROG_CPP - -# get compiler flags right - +dnl get Compiler flags right. if test "x$CC" = xgcc; then XX_CFLAGS="-Wall" XX_ANSIFLAGS="-pedantic -ansi" else case "$host" in - *-dec-osf*) - CFLAGS= - XX_CFLAGS="-std1 -g3" - XX_ANSIFLAGS= - ;; - *) - XX_CFLAGS= - XX_ANSIFLAGS= - ;; + *-dec-osf*) + CFLAGS= + XX_CFLAGS="-std1 -g3" + XX_ANSIFLAGS= + ;; + *) + XX_CFLAGS= + XX_ANSIFLAGS= + ;; esac fi -AC_SUBST([XX_CFLAGS]) -AC_SUBST([XX_ANSIFLAGS]) +AC_SUBST(XX_CFLAGS) +AC_SUBST(XX_ANSIFLAGS) +AC_CHECK_PROG(RMF, rm, rm -f) +AC_CHECK_PROG(RMDIR, rmdir, rmdir) -# auxiliary programs - -AC_CHECK_PROG([RMF], [rm], [rm -f]) -AC_CHECK_PROG([RMDIR], [rmdir], [rmdir]) - - -# Since this file will be finally moved to another directory we make -# the path of the install script absolute. This small code snippet has -# been taken from automake's `ylwrap' script. - +dnl Since this file will be finally moved to another directory we make +dnl the path of the install script absolute. This small code snippet has +dnl been taken from automake's `ylwrap' script. AC_PROG_INSTALL case "$INSTALL" in -/*) - ;; -*/*) - INSTALL="`pwd`/$INSTALL" ;; + /*) + ;; + */*) + INSTALL="`pwd`/$INSTALL" ;; esac - -# checks for header files - +dnl checks for header files AC_HEADER_STDC -AC_CHECK_HEADERS([fcntl.h unistd.h]) - - -# checks for typedefs, structures, and compiler characteristics +AC_CHECK_HEADERS(fcntl.h unistd.h) +dnl checks for typedefs, structures, and compiler characteristics AC_C_CONST -AC_CHECK_SIZEOF([int]) -AC_CHECK_SIZEOF([long]) +AC_CHECK_SIZEOF(int) +AC_CHECK_SIZEOF(long) +dnl checks for library functions -# checks for library functions - -# Here we check whether we can use our mmap file component. - +dnl Here we check whether we can use our mmap file component. AC_FUNC_MMAP if test "$ac_cv_func_mmap_fixed_mapped" != yes; then FTSYS_SRC='$(BASE_DIR)/ftsystem.c' else FTSYS_SRC='$(BUILD_DIR)/ftsystem.c' - AC_CHECK_DECLS([munmap], - [], - [], - [ - -#ifdef HAVE_UNISTD_H -#include -#endif -#include - - ]) - + FT_MUNMAP_DECL FT_MUNMAP_PARAM fi -AC_SUBST([FTSYS_SRC]) +AC_SUBST(FTSYS_SRC) -AC_CHECK_FUNCS([memcpy memmove]) +AC_CHECK_FUNCS(memcpy memmove) - -# Check for system zlib - -AC_ARG_WITH([zlib], - dnl don't quote AS_HELP_STRING! - AS_HELP_STRING([--without-zlib], - [use internal zlib instead of system-wide])) +dnl Check for system zlib +AC_ARG_WITH(zlib, + [ --without-zlib use internal zlib instead of system-wide]) if test x$with_zlib != xno && test -z "$LIBZ"; then - AC_CHECK_LIB([z], [gzsetparams], [AC_CHECK_HEADER([zlib.h], [LIBZ='-lz'])]) + AC_CHECK_LIB(z, gzsetparams, [AC_CHECK_HEADER(zlib.h, LIBZ='-lz')]) fi if test x$with_zlib != xno && test -n "$LIBZ"; then CFLAGS="$CFLAGS -DFT_CONFIG_OPTION_SYSTEM_ZLIB" @@ -123,13 +93,9 @@ if test x$with_zlib != xno && test -n "$LIBZ"; then SYSTEM_ZLIB=yes fi - -# Whether to use Mac OS resource-based fonts or not - -AC_ARG_WITH([old-mac-fonts], - dnl don't quote AS_HELP_STRING! - AS_HELP_STRING([--with-old-mac-fonts], - [allow Mac resource-based fonts to be used])) +dnl Whether to use Mac OS resource-based fonts or not +AC_ARG_WITH(old-mac-fonts, + [ --with-old-mac-fonts allow Mac resource-based fonts to be used]) if test x$with_old_mac_fonts = xyes; then CFLAGS="$CFLAGS -DTARGET_API_MAC_CARBON" LDFLAGS="$LDFLAGS -Xlinker -framework -Xlinker CoreServices \ @@ -138,38 +104,25 @@ else CFLAGS="$CFLAGS -DDARWIN_NO_CARBON" fi - -AC_SUBST([LIBZ]) -AC_SUBST([CFLAGS]) -AC_SUBST([LDFLAGS]) -AC_SUBST([SYSTEM_ZLIB]) - +AC_SUBST(LIBZ) +AC_SUBST(CFLAGS) +AC_SUBST(LDFLAGS) +AC_SUBST(SYSTEM_ZLIB) AC_PROG_LIBTOOL - -# configuration file -- stay in 8.3 limit -# -# since #undef doesn't survive in configuration header files we replace -# `/undef' with `#undef' after creating the output file - -AC_CONFIG_HEADERS([ftconfig.h:ftconfig.in], - [mv ftconfig.h ftconfig.tmp - sed 's|/undef|#undef|' < ftconfig.tmp > ftconfig.h - rm ftconfig.tmp]) - -# create the Unix-specific sub-Makefiles `builds/unix/unix-def.mk' -# and 'builds/unix/unix-cc.mk' that will be used by the build system -# +dnl create the Unix-specific sub-Makefiles `builds/unix/unix-def.mk' +dnl and 'builds/unix/unix-cc.mk' that will be used by the build system +dnl AC_CONFIG_FILES([unix-cc.mk:unix-cc.in unix-def.mk:unix-def.in freetype-config freetype2.pc:freetype2.in]) -# re-generate the Jamfile to use libtool now -# -# AC_CONFIG_FILES([../../Jamfile:../../Jamfile.in]) +dnl re-generate the Jamfile to use libtool now +dnl +dnl AC_CONFIG_FILES([../../Jamfile:../../Jamfile.in]) AC_OUTPUT -# end of configure.ac +dnl end of configure.ac diff --git a/reactos/lib/freetype/builds/unix/freetype2.m4 b/reactos/lib/freetype/builds/unix/freetype2.m4 index 7424a32ab5a..21c6445e2cc 100644 --- a/reactos/lib/freetype/builds/unix/freetype2.m4 +++ b/reactos/lib/freetype/builds/unix/freetype2.m4 @@ -1,104 +1,88 @@ # Configure paths for FreeType2 # Marcelo Magallon 2001-10-26, based on gtk.m4 by Owen Taylor -# -# serial 2 -# AC_CHECK_FT2([MINIMUM-VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) -# Test for FreeType 2, and define FT2_CFLAGS and FT2_LIBS. -# MINIMUM-VERSION is what libtool reports; the default is `7.0.1' (this is -# FreeType 2.0.4). -# -AC_DEFUN([AC_CHECK_FT2], - [# Get the cflags and libraries from the freetype-config script - # - AC_ARG_WITH([ft-prefix], - dnl don't quote AS_HELP_STRING! - AS_HELP_STRING([--with-ft-prefix=PREFIX], - [Prefix where FreeType is installed (optional)]), - [ft_config_prefix="$withval"], - [ft_config_prefix=""]) +dnl AC_CHECK_FT2([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl Test for FreeType2, and define FT2_CFLAGS and FT2_LIBS +dnl +AC_DEFUN(AC_CHECK_FT2, +[dnl +dnl Get the cflags and libraries from the freetype-config script +dnl +AC_ARG_WITH(ft-prefix, +[ --with-ft-prefix=PREFIX + Prefix where FreeType is installed (optional)], + ft_config_prefix="$withval", ft_config_prefix="") +AC_ARG_WITH(ft-exec-prefix, +[ --with-ft-exec-prefix=PREFIX + Exec prefix where FreeType is installed (optional)], + ft_config_exec_prefix="$withval", ft_config_exec_prefix="") +AC_ARG_ENABLE(freetypetest, +[ --disable-freetypetest Do not try to compile and run + a test FreeType program], + [], enable_fttest=yes) - AC_ARG_WITH([ft-exec-prefix], - dnl don't quote AS_HELP_STRING! - AS_HELP_STRING([--with-ft-exec-prefix=PREFIX], - [Exec prefix where FreeType is installed (optional)]), - [ft_config_exec_prefix="$withval"], - [ft_config_exec_prefix=""]) - - AC_ARG_ENABLE([freetypetest], - dnl don't quote AS_HELP_STRING! - AS_HELP_STRING([--disable-freetypetest], - [Do not try to compile and run a test FreeType program]), - [], - [enable_fttest=yes]) - - if test x$ft_config_exec_prefix != x ; then - ft_config_args="$ft_config_args --exec-prefix=$ft_config_exec_prefix" - if test x${FT2_CONFIG+set} != xset ; then - FT2_CONFIG=$ft_config_exec_prefix/bin/freetype-config - fi - fi - - if test x$ft_config_prefix != x ; then - ft_config_args="$ft_config_args --prefix=$ft_config_prefix" - if test x${FT2_CONFIG+set} != xset ; then - FT2_CONFIG=$ft_config_prefix/bin/freetype-config - fi - fi - - AC_PATH_PROG([FT2_CONFIG], [freetype-config], [no]) - - min_ft_version=m4_if([$1], [], [7.0.1], [$1]) - AC_MSG_CHECKING([for FreeType -- version >= $min_ft_version]) - no_ft="" - if test "$FT2_CONFIG" = "no" ; then - no_ft=yes - else - FT2_CFLAGS=`$FT2_CONFIG $ft_config_args --cflags` - FT2_LIBS=`$FT2_CONFIG $ft_config_args --libs` - ft_config_major_version=`$FT2_CONFIG $ft_config_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` - ft_config_minor_version=`$FT2_CONFIG $ft_config_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` - ft_config_micro_version=`$FT2_CONFIG $ft_config_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` - ft_min_major_version=`echo $min_ft_version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` - ft_min_minor_version=`echo $min_ft_version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` - ft_min_micro_version=`echo $min_ft_version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` - if test x$enable_fttest = xyes ; then - ft_config_is_lt="" - if test $ft_config_major_version -lt $ft_min_major_version ; then - ft_config_is_lt=yes - else - if test $ft_config_major_version -eq $ft_min_major_version ; then - if test $ft_config_minor_version -lt $ft_min_minor_version ; then - ft_config_is_lt=yes - else - if test $ft_config_minor_version -eq $ft_min_minor_version ; then - if test $ft_config_micro_version -lt $ft_min_micro_version ; then - ft_config_is_lt=yes - fi - fi - fi - fi - fi - if test x$ft_config_is_lt = xyes ; then - no_ft=yes - else - ac_save_CFLAGS="$CFLAGS" - ac_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $FT2_CFLAGS" - LIBS="$FT2_LIBS $LIBS" - - # - # Sanity checks for the results of freetype-config to some extent. - # - AC_RUN_IFELSE([ - AC_LANG_SOURCE([[ +if test x$ft_config_exec_prefix != x ; then + ft_config_args="$ft_config_args --exec-prefix=$ft_config_exec_prefix" + if test x${FT2_CONFIG+set} != xset ; then + FT2_CONFIG=$ft_config_exec_prefix/bin/freetype-config + fi +fi +if test x$ft_config_prefix != x ; then + ft_config_args="$ft_config_args --prefix=$ft_config_prefix" + if test x${FT2_CONFIG+set} != xset ; then + FT2_CONFIG=$ft_config_prefix/bin/freetype-config + fi +fi +AC_PATH_PROG(FT2_CONFIG, freetype-config, no) +min_ft_version=ifelse([$1], ,6.1.0,$1) +AC_MSG_CHECKING(for FreeType - version >= $min_ft_version) +no_ft="" +if test "$FT2_CONFIG" = "no" ; then + no_ft=yes +else + FT2_CFLAGS=`$FT2_CONFIG $ft_config_args --cflags` + FT2_LIBS=`$FT2_CONFIG $ft_config_args --libs` + ft_config_major_version=`$FT2_CONFIG $ft_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + ft_config_minor_version=`$FT2_CONFIG $ft_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + ft_config_micro_version=`$FT2_CONFIG $ft_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + ft_min_major_version=`echo $min_ft_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + ft_min_minor_version=`echo $min_ft_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + ft_min_micro_version=`echo $min_ft_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test x$enable_fttest = xyes ; then + ft_config_is_lt="" + if test $ft_config_major_version -lt $ft_min_major_version ; then + ft_config_is_lt=yes + else + if test $ft_config_major_version -eq $ft_min_major_version ; then + if test $ft_config_minor_version -lt $ft_min_minor_version ; then + ft_config_is_lt=yes + else + if test $ft_config_minor_version -eq $ft_min_minor_version ; then + if test $ft_config_micro_version -lt $ft_min_micro_version ; then + ft_config_is_lt=yes + fi + fi + fi + fi + fi + if test x$ft_config_is_lt = xyes ; then + no_ft=yes + else + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $FT2_CFLAGS" + LIBS="$FT2_LIBS $LIBS" +dnl +dnl Sanity checks for the results of freetype-config to some extent +dnl + AC_TRY_RUN([ #include #include FT_FREETYPE_H #include @@ -108,7 +92,7 @@ int main() { FT_Library library; - FT_Error error; + FT_Error error; error = FT_Init_FreeType(&library); @@ -120,59 +104,40 @@ main() return 0; } } - - ]]) - ], - [], - [no_ft=yes], - [echo $ECHO_N "cross compiling; assuming OK... $ECHO_C"]) - - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi # test $ft_config_version -lt $ft_min_version - fi # test x$enable_fttest = xyes - fi # test "$FT2_CONFIG" = "no" - - if test x$no_ft = x ; then - AC_MSG_RESULT([yes]) - m4_if([$2], [], [:], [$2]) +],, no_ft=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi # test $ft_config_version -lt $ft_min_version + fi # test x$enable_fttest = xyes +fi # test "$FT2_CONFIG" = "no" +if test x$no_ft = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) +else + AC_MSG_RESULT(no) + if test "$FT2_CONFIG" = "no" ; then + echo "*** The freetype-config script installed by FreeType 2 could not be found." + echo "*** If FreeType 2 was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the FT2_CONFIG environment variable to the" + echo "*** full path to freetype-config." else - AC_MSG_RESULT([no]) - if test "$FT2_CONFIG" = "no" ; then - AC_MSG_WARN([ - - The freetype-config script installed by FreeType 2 could not be found. - If FreeType 2 was installed in PREFIX, make sure PREFIX/bin is in - your path, or set the FT2_CONFIG environment variable to the - full path to freetype-config. - ]) + if test x$ft_config_is_lt = xyes ; then + echo "*** Your installed version of the FreeType 2 library is too old." + echo "*** If you have different versions of FreeType 2, make sure that" + echo "*** correct values for --with-ft-prefix or --with-ft-exec-prefix" + echo "*** are used, or set the FT2_CONFIG environment variable to the" + echo "*** full path to freetype-config." else - if test x$ft_config_is_lt = xyes ; then - AC_MSG_WARN([ - - Your installed version of the FreeType 2 library is too old. - If you have different versions of FreeType 2, make sure that - correct values for --with-ft-prefix or --with-ft-exec-prefix - are used, or set the FT2_CONFIG environment variable to the - full path to freetype-config. - ]) - else - AC_MSG_WARN([ - - The FreeType test program failed to run. If your system uses - shared libraries and they are installed outside the normal - system library path, make sure the variable LD_LIBRARY_PATH - (or whatever is appropiate for your system) is correctly set. - ]) - fi + echo "*** The FreeType test program failed to run. If your system uses" + echo "*** shared libraries and they are installed outside the normal" + echo "*** system library path, make sure the variable LD_LIBRARY_PATH" + echo "*** (or whatever is appropiate for your system) is correctly set." fi - - FT2_CFLAGS="" - FT2_LIBS="" - m4_if([$3], [], [:], [$3]) fi - - AC_SUBST([FT2_CFLAGS]) - AC_SUBST([FT2_LIBS])]) - -# end of freetype2.m4 + FT2_CFLAGS="" + FT2_LIBS="" + ifelse([$3], , :, [$3]) +fi +AC_SUBST(FT2_CFLAGS) +AC_SUBST(FT2_LIBS) +]) diff --git a/reactos/lib/freetype/builds/unix/ft-munmap.m4 b/reactos/lib/freetype/builds/unix/ft-munmap.m4 index d68d49fa7cf..37ebbd92d9d 100644 --- a/reactos/lib/freetype/builds/unix/ft-munmap.m4 +++ b/reactos/lib/freetype/builds/unix/ft-munmap.m4 @@ -1,24 +1,31 @@ ## FreeType specific autoconf tests -# serial 2 +# serial 1 FT_MUNMAP_DECL -AC_DEFUN([FT_MUNMAP_PARAM], - [AC_MSG_CHECKING([for munmap's first parameter type]) - AC_COMPILE_IFELSE([ - AC_LANG_SOURCE([[ +AC_DEFUN(FT_MUNMAP_DECL, +[AC_MSG_CHECKING([whether munmap must be declared]) +AC_CACHE_VAL(ft_cv_munmap_decl, +[AC_TRY_COMPILE([ +#ifdef HAVE_UNISTD_H +#include +#endif +#include ], +[char *(*pfn) = (char *(*))munmap], +ft_cv_munmap_decl=no, +ft_cv_munmap_decl=yes)]) +AC_MSG_RESULT($ft_cv_munmap_decl) +if test $ft_cv_munmap_decl = yes; then + AC_DEFINE(NEED_MUNMAP_DECL,, + [Define to 1 if munmap() is not defined in ]) +fi]) +AC_DEFUN(FT_MUNMAP_PARAM, +[AC_MSG_CHECKING([for munmap's first parameter type]) +AC_TRY_COMPILE([ #include #include -int munmap(void *, size_t); - - ]]) - ], - [], - [AC_MSG_RESULT([void *]) - AC_DEFINE([MUNMAP_USES_VOIDP], - [], - [Define to 1 if the first argument of munmap is of type void *])], - [AC_MSG_RESULT([char *])]) - ]) - -# end of ft-munmap.m4 +int munmap(void *, size_t);],, + AC_MSG_RESULT([void *]);AC_DEFINE(MUNMAP_USES_VOIDP,, + [Define to 1 if the first argument of munmap is of type void *]), + AC_MSG_RESULT([char *])) +]) diff --git a/reactos/lib/freetype/builds/unix/ft2unix.h b/reactos/lib/freetype/builds/unix/ft2unix.h index 7390dc49401..c4299c3abf6 100644 --- a/reactos/lib/freetype/builds/unix/ft2unix.h +++ b/reactos/lib/freetype/builds/unix/ft2unix.h @@ -4,7 +4,7 @@ /* */ /* Build macros of the FreeType 2 library. */ /* */ -/* Copyright 1996-2001, 2003 by */ +/* Copyright 1996-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -21,15 +21,14 @@ /* This is a Unix-specific version of that should be used */ /* exclusively *after* installation of the library. */ /* */ - /* It assumes that "/usr/local/include/freetype2" (or whatever is */ - /* returned by the "freetype-config --cflags" or "pkg-config --cflags" */ - /* command) is in your compilation include path. */ + /* It assumes that "/usr/local/include/freetype2" (or wathever is */ + /* returned by the "freetype-config --cflags" command) is in your */ + /* compilation include path. */ /* */ /* We don't need to do anything special in this release. However, for */ - /* a future FreeType 2 release, the following installation changes will */ - /* be performed: */ + /* FreeType 2.1, the following installation changes will be performed: */ /* */ - /* - The contents of "freetype-2.x/include/freetype" will be installed */ + /* - The contents of "freetype-2.1/include/freetype" will be installed */ /* to "/usr/local/include/freetype2" instead of */ /* "/usr/local/include/freetype2/freetype". */ /* */ @@ -40,11 +39,11 @@ /* replace all "" with "". */ /* */ /* - Adding "/usr/local/include/freetype2" to your compilation include */ - /* path will not be necessary anymore. */ + /* path will not be necessary anymore. The command */ + /* "freetype-config --cflags" will return an empty string. */ /* */ - /* These changes will be transparent to client applications which use */ - /* freetype-config (or pkg-config). No modifications will be necessary */ - /* to compile with the new scheme. */ + /* - Client applications which adhere to the new inclusion scheme */ + /* WILL NOT NEED TO BE MODIFIED to compile with FT 2.1! */ /* */ /*************************************************************************/ @@ -52,7 +51,7 @@ #ifndef __FT2_BUILD_UNIX_H__ #define __FT2_BUILD_UNIX_H__ - /* "/include/freetype2" must be in your current inclusion path */ + /* "/usr/local/include/freetype2" must be in your current inclusion path */ #include #endif /* __FT2_BUILD_UNIX_H__ */ diff --git a/reactos/lib/freetype/builds/unix/ftconfig.in b/reactos/lib/freetype/builds/unix/ftconfig.in index 39205d63788..c7511039f52 100644 --- a/reactos/lib/freetype/builds/unix/ftconfig.in +++ b/reactos/lib/freetype/builds/unix/ftconfig.in @@ -4,7 +4,7 @@ /* */ /* UNIX-specific configuration file (specification only). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2000, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -57,12 +57,11 @@ FT_BEGIN_HEADER /*************************************************************************/ -#undef HAVE_UNISTD_H -#undef HAVE_FCNTL_H - -#undef SIZEOF_INT -#undef SIZEOF_LONG +#define HAVE_UNISTD_H 0 +#define HAVE_FCNTL_H 0 +#define SIZEOF_INT 2 +#define SIZEOF_LONG 2 #define FT_SIZEOF_INT SIZEOF_INT #define FT_SIZEOF_LONG SIZEOF_LONG @@ -90,19 +89,6 @@ FT_BEGIN_HEADER /*************************************************************************/ - /*************************************************************************/ - /* */ - /* Mac support */ - /* */ - /* This is the only necessary change, so it is defined here instead */ - /* providing a new configuration file. */ - /* */ -#if ( defined( __APPLE__ ) && !defined( DARWIN_NO_CARBON ) ) || \ - ( defined( __MWERKS__ ) && defined( macintosh ) ) -#define FT_MACINTOSH 1 -#endif - - /*************************************************************************/ /* */ /* IntN types */ @@ -126,88 +112,31 @@ FT_BEGIN_HEADER #error "no 32bit type found -- please check your configuration files" #endif - - /* look up an integer type that is at least 32 bits */ -#if FT_SIZEOF_INT >= 4 - - typedef int FT_Fast; - typedef unsigned int FT_UFast; - -#elif FT_SIZEOF_LONG >= 4 - - typedef long FT_Fast; - typedef unsigned long FT_UFast; - -#endif - - - /* determine whether we have a 64-bit int type for platforms without */ - /* Autoconf */ #if FT_SIZEOF_LONG == 8 /* FT_LONG64 must be defined if a 64-bit type is available */ #define FT_LONG64 -#define FT_INT64 long - -#elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ - - /* this compiler provides the __int64 type */ -#define FT_LONG64 -#define FT_INT64 __int64 - -#elif defined( __BORLANDC__ ) /* Borland C++ */ - - /* XXXX: We should probably check the value of __BORLANDC__ in order */ - /* to test the compiler version. */ - - /* this compiler provides the __int64 type */ -#define FT_LONG64 -#define FT_INT64 __int64 - -#elif defined( __WATCOMC__ ) /* Watcom C++ */ - - /* Watcom doesn't provide 64-bit data types */ - -#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */ - -#define FT_LONG64 -#define FT_INT64 long long int - -#elif defined( __GNUC__ ) - - /* GCC provides the "long long" type */ -#define FT_LONG64 -#define FT_INT64 long long int - -#endif /* FT_SIZEOF_LONG == 8 */ - - -#define FT_BEGIN_STMNT do { -#define FT_END_STMNT } while ( 0 ) -#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT +#define FT_INT64 long +#else /*************************************************************************/ /* */ - /* A 64-bit data type will create compilation problems if you compile */ - /* in strict ANSI mode. To avoid them, we disable their use if */ - /* __STDC__ is defined. You can however ignore this rule by */ - /* defining the FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */ + /* Many compilers provide the non-ANSI `long long' 64-bit type. You can */ + /* activate it by defining the FTCALC_USE_LONG_LONG macro in */ + /* `ftoption.h'. */ /* */ -#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 ) + /* Note that this will produce many -ansi warnings during library */ + /* compilation, and that in many cases, the generated code will be */ + /* neither smaller nor faster! */ + /* */ +#ifdef FTCALC_USE_LONG_LONG -#ifdef __STDC__ +#define FT_LONG64 +#define FT_INT64 long long - /* Undefine the 64-bit macros in strict ANSI compilation mode. */ - /* Since `#undef' doesn't survive in configuration header files */ - /* we use the postprocessing facility of AC_CONFIG_HEADERS to */ - /* replace the leading `/' with `#'. */ -/undef FT_LONG64 -/undef FT_INT64 - -#endif /* __STDC__ */ - -#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */ +#endif /* FTCALC_USE_LONG_LONG */ +#endif /* FT_SIZEOF_LONG == 8 */ #ifdef FT_MAKE_OPTION_SINGLE_OBJECT @@ -222,7 +151,7 @@ FT_BEGIN_HEADER #define FT_LOCAL_DEF( x ) extern "C" x #else #define FT_LOCAL( x ) extern x -#define FT_LOCAL_DEF( x ) x +#define FT_LOCAL_DEF( x ) extern x #endif #endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ @@ -326,7 +255,6 @@ FT_BEGIN_HEADER FT_END_HEADER - #endif /* __FTCONFIG_H__ */ diff --git a/reactos/lib/freetype/builds/unix/install-sh b/reactos/lib/freetype/builds/unix/install-sh index f5061e7e269..57a2fbd1861 100644 --- a/reactos/lib/freetype/builds/unix/install-sh +++ b/reactos/lib/freetype/builds/unix/install-sh @@ -1,38 +1,21 @@ #!/bin/sh # install - install a program, script, or datafile +# This originally came from X11R5 (mit/util/scripts/install.sh). -scriptversion=2003-09-24.23 +scriptversion=2003-01-17.15 -# This originates from X11R5 (mit/util/scripts/install.sh), which was -# later released in X11R6 (xc/config/util/install.sh) with the -# following copyright and license. +# Copyright 1991 by the Massachusetts Institute of Technology +# (FSF changes in the public domain.) # -# Copyright (C) 1994 X Consortium -# -# 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 -# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- -# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# -# Except as contained in this notice, the name of the X Consortium shall not -# be used in advertising or otherwise to promote the sale, use or other deal- -# ings in this Software without prior written authorization from the X Consor- -# tium. -# -# -# FSF changes to this file are in the public domain. +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of M.I.T. not be used in advertising or +# publicity pertaining to distribution of the software without specific, +# written prior permission. M.I.T. makes no representations about the +# suitability of this software for any purpose. It is provided "as is" +# without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it @@ -151,11 +134,6 @@ if test -z "$src"; then exit 1 fi -# Protect names starting with `-'. -case $src in - -*) src=./$src ;; -esac - if test -n "$dir_arg"; then dst=$src src= @@ -180,11 +158,6 @@ else exit 1 fi - # Protect names starting with `-'. - case $dst in - -*) dst=./$dst ;; - esac - # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then @@ -192,10 +165,11 @@ else fi fi -# This sed command emulates the dirname command. +## this sed command emulates the dirname command dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. +# (this part is taken from Noah Friedman's mkinstalldirs script.) # Skip lots of stat calls in the usual case. if test ! -d "$dstdir"; then @@ -239,8 +213,8 @@ else test -z "$dstfile" && dstfile=`basename "$dst"` # Make a couple of temp file names in the proper directory. - dsttmp=$dstdir/_inst.$$_ - rmtmp=$dstdir/_rm.$$_ + dsttmp=$dstdir/#inst.$$# + rmtmp=$dstdir/#rm.$$# # Trap to clean up those temp files at exit. trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0 diff --git a/reactos/lib/freetype/builds/unix/install.mk b/reactos/lib/freetype/builds/unix/install.mk index 1930d371601..935005edb49 100644 --- a/reactos/lib/freetype/builds/unix/install.mk +++ b/reactos/lib/freetype/builds/unix/install.mk @@ -51,8 +51,6 @@ install: $(PROJECT_LIBRARY) done $(INSTALL_DATA) $(BUILD_DIR)/ft2unix.h \ $(DESTDIR)$(includedir)/ft2build.h - $(INSTALL_DATA) $(BUILD_DIR)/ftconfig.h \ - $(DESTDIR)$(includedir)/freetype2/freetype/config/ftconfig.h $(INSTALL_SCRIPT) -m 755 $(OBJ_BUILD)/freetype-config \ $(DESTDIR)$(bindir)/freetype-config $(INSTALL_SCRIPT) -m 644 $(BUILD_DIR)/freetype2.m4 \ diff --git a/reactos/lib/freetype/builds/unix/ltmain.sh b/reactos/lib/freetype/builds/unix/ltmain.sh index fe83ff4fb74..8b50e531910 100644 --- a/reactos/lib/freetype/builds/unix/ltmain.sh +++ b/reactos/lib/freetype/builds/unix/ltmain.sh @@ -1,7 +1,7 @@ # ltmain.sh - Provide generalized library-building support services. # NOTE: Changing this file will not affect anything until you rerun configure. # -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003 +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # Originally by Gordon Matzigkeit , 1996 # @@ -55,8 +55,8 @@ modename="$progname" # Constants. PROGRAM=ltmain.sh PACKAGE=libtool -VERSION=1.5 -TIMESTAMP=" (1.1220 2003/04/05 19:32:58)" +VERSION=1.4.3 +TIMESTAMP=" (1.922.2.110 2002/10/23 01:39:54)" default_mode= help="Try \`$progname --help' for more information." @@ -69,17 +69,17 @@ rm="rm -f" # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g' -# test EBCDIC or ASCII -case `echo A|od -x` in - *[Cc]1*) # EBCDIC based system - SP2NL="tr '\100' '\n'" - NL2SP="tr '\r\n' '\100\100'" - ;; - *) # Assume ASCII based system - SP2NL="tr '\040' '\012'" - NL2SP="tr '\015\012' '\040\040'" - ;; -esac +# test EBCDIC or ASCII +case `echo A|od -x` in + *[Cc]1*) # EBCDIC based system + SP2NL="tr '\100' '\n'" + NL2SP="tr '\r\n' '\100\100'" + ;; + *) # Assume ASCII based system + SP2NL="tr '\040' '\012'" + NL2SP="tr '\015\012' '\040\040'" + ;; +esac # NLS nuisances. # Only set LANG and LC_ALL to C if already set. @@ -97,8 +97,8 @@ fi : ${IFS=" "} if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then - $echo "$modename: not configured to build any kind of library" 1>&2 - $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + echo "$modename: not configured to build any kind of library" 1>&2 + echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 exit 1 fi @@ -114,51 +114,8 @@ execute_dlfiles= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" -##################################### -# Shell function definitions: -# This seems to be the best place for them - -# Need a lot of goo to handle *both* DLLs and import libs -# Has to be a shell function in order to 'eat' the argument -# that is supplied when $file_magic_command is called. -win32_libid () { - win32_libid_type="unknown" - win32_fileres=`file -L $1 2>/dev/null` - case $win32_fileres in - *ar\ archive\ import\ library*) # definitely import - win32_libid_type="x86 archive import" - ;; - *ar\ archive*) # could be an import, or static - if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ - grep -E 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then - win32_nmres=`eval $NM -f posix -A $1 | \ - sed -n -e '1,100{/ I /{x;/import/!{s/^/import/;h;p;};x;};}'` - if test "X$win32_nmres" = "Ximport" ; then - win32_libid_type="x86 archive import" - else - win32_libid_type="x86 archive static" - fi - fi - ;; - *DLL*) - win32_libid_type="x86 DLL" - ;; - *executable*) # but shell scripts are "executable" too... - case $win32_fileres in - *MS\ Windows\ PE\ Intel*) - win32_libid_type="x86 DLL" - ;; - esac - ;; - esac - $echo $win32_libid_type -} - -# End of Shell function definitions -##################################### - # Parse our command line options once, thoroughly. -while test "$#" -gt 0 +while test $# -gt 0 do arg="$1" shift @@ -174,33 +131,6 @@ do execute_dlfiles) execute_dlfiles="$execute_dlfiles $arg" ;; - tag) - tagname="$arg" - - # Check whether tagname contains only valid characters - case $tagname in - *[!-_A-Za-z0-9,/]*) - $echo "$progname: invalid tag name: $tagname" 1>&2 - exit 1 - ;; - esac - - case $tagname in - CC) - # Don't test for the "default" C tag, as we know, it's there, but - # not specially marked. - ;; - *) - if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$0" > /dev/null; then - taglist="$taglist $tagname" - # Evaluate the configuration. - eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $0`" - else - $echo "$progname: ignoring unknown tag $tagname" 1>&2 - fi - ;; - esac - ;; *) eval "$prev=\$arg" ;; @@ -218,25 +148,17 @@ do ;; --version) - $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" - $echo - $echo "Copyright (C) 2003 Free Software Foundation, Inc." - $echo "This is free software; see the source for copying conditions. There is NO" - $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" exit 0 ;; --config) ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $0 - # Now print the configurations for the tags. - for tagname in $taglist; do - ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$0" - done exit 0 ;; --debug) - $echo "$progname: enabling shell trace mode" + echo "$progname: enabling shell trace mode" set -x ;; @@ -245,16 +167,16 @@ do ;; --features) - $echo "host: $host" + echo "host: $host" if test "$build_libtool_libs" = yes; then - $echo "enable shared libraries" + echo "enable shared libraries" else - $echo "disable shared libraries" + echo "disable shared libraries" fi if test "$build_old_libs" = yes; then - $echo "enable static libraries" + echo "enable static libraries" else - $echo "disable static libraries" + echo "disable static libraries" fi exit 0 ;; @@ -270,13 +192,6 @@ do show=: ;; - --tag) prevopt="--tag" prev=tag ;; - --tag=*) - set tag "$optarg" ${1+"$@"} - shift - prev=tag - ;; - -dlopen) prevopt="-dlopen" prev=execute_dlfiles @@ -310,10 +225,8 @@ if test -z "$show_help"; then # Infer the operation mode. if test -z "$mode"; then - $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 - $echo "*** Future versions of Libtool will require -mode=MODE be specified." 1>&2 case $nonopt in - *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) + *cc | *++ | gcc* | *-gcc* | xlc*) mode=link for arg do @@ -368,127 +281,158 @@ if test -z "$show_help"; then modename="$modename: compile" # Get the compilation command and the source file. base_compile= - srcfile="$nonopt" # always keep a non-empty value in "srcfile" + prev= + lastarg= + srcfile="$nonopt" suppress_output= - arg_mode=normal - libobj= + user_target=no for arg do - case "$arg_mode" in - arg ) - # do not "continue". Instead, add this to base_compile - lastarg="$arg" - arg_mode=normal + case $prev in + "") ;; + xcompiler) + # Aesthetically quote the previous argument. + prev= + lastarg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + + case $arg in + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + + # Add the previous argument to base_compile. + if test -z "$base_compile"; then + base_compile="$lastarg" + else + base_compile="$base_compile $lastarg" + fi + continue + ;; + esac + + # Accept any command-line options. + case $arg in + -o) + if test "$user_target" != "no"; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit 1 + fi + user_target=next ;; - target ) - libobj="$arg" - arg_mode=normal + -static) + build_old_libs=yes continue ;; - normal ) - # Accept any command-line options. - case $arg in - -o) - if test -n "$libobj" ; then - $echo "$modename: you cannot specify \`-o' more than once" 1>&2 - exit 1 - fi - arg_mode=target - continue - ;; - - -static) - build_old_libs=yes - continue - ;; - - -prefer-pic) - pic_mode=yes - continue - ;; - - -prefer-non-pic) - pic_mode=no - continue - ;; - - -Xcompiler) - arg_mode=arg # the next one goes into the "base_compile" arg list - continue # The current "srcfile" will either be retained or - ;; # replaced later. I would guess that would be a bug. - - -Wc,*) - args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` - lastarg= - save_ifs="$IFS"; IFS=',' - for arg in $args; do - IFS="$save_ifs" - - # Double-quote args containing other shell metacharacters. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - lastarg="$lastarg $arg" - done - IFS="$save_ifs" - lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` - - # Add the arguments to base_compile. - base_compile="$base_compile $lastarg" - continue - ;; - - * ) - # Accept the current argument as the source file. - # The previous "srcfile" becomes the current argument. - # - lastarg="$srcfile" - srcfile="$arg" - ;; - esac # case $arg + -prefer-pic) + pic_mode=yes + continue ;; - esac # case $arg_mode + + -prefer-non-pic) + pic_mode=no + continue + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + lastarg="$lastarg $arg" + done + IFS="$save_ifs" + lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` + + # Add the arguments to base_compile. + if test -z "$base_compile"; then + base_compile="$lastarg" + else + base_compile="$base_compile $lastarg" + fi + continue + ;; + esac + + case $user_target in + next) + # The next one is the -o target name + user_target=yes + continue + ;; + yes) + # We got the output file + user_target=set + libobj="$arg" + continue + ;; + esac + + # Accept the current argument as the source file. + lastarg="$srcfile" + srcfile="$arg" # Aesthetically quote the previous argument. + + # Backslashify any backslashes, double quotes, and dollar signs. + # These are the only characters that are still specially + # interpreted inside of double-quoted scrings. lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` - case $lastarg in # Double-quote args containing other shell metacharacters. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. + case $lastarg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") lastarg="\"$lastarg\"" ;; esac - base_compile="$base_compile $lastarg" - done # for arg + # Add the previous argument to base_compile. + if test -z "$base_compile"; then + base_compile="$lastarg" + else + base_compile="$base_compile $lastarg" + fi + done - case $arg_mode in - arg) - $echo "$modename: you must specify an argument for -Xcompile" - exit 1 + case $user_target in + set) ;; - target) - $echo "$modename: you must specify a target with \`-o'" 1>&2 - exit 1 + no) + # Get the name of the library object. + libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` ;; *) - # Get the name of the library object. - [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit 1 ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo - xform='[cCFSifmso]' + xform='[cCFSfmso]' case $libobj in *.ada) xform=ada ;; *.adb) xform=adb ;; @@ -496,13 +440,10 @@ if test -z "$show_help"; then *.asm) xform=asm ;; *.c++) xform=c++ ;; *.cc) xform=cc ;; - *.ii) xform=ii ;; - *.class) xform=class ;; *.cpp) xform=cpp ;; *.cxx) xform=cxx ;; *.f90) xform=f90 ;; *.for) xform=for ;; - *.java) xform=java ;; esac libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` @@ -515,56 +456,6 @@ if test -z "$show_help"; then ;; esac - # Infer tagged configuration to use if any are available and - # if one wasn't chosen via the "--tag" command line option. - # Only attempt this if the compiler in the base compile - # command doesn't match the default compiler. - if test -n "$available_tags" && test -z "$tagname"; then - case $base_compile in - # Blanks in the command may have been stripped by the calling shell, - # but not from the CC environment variable when configure was run. - " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "*) ;; - # Blanks at the start of $base_compile will cause this to fail - # if we don't check for them as well. - *) - for z in $available_tags; do - if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$0" > /dev/null; then - # Evaluate the configuration. - eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $0`" - case "$base_compile " in - "$CC "* | " $CC "* | "`$echo $CC` "* | " `$echo $CC` "*) - # The compiler in the base compile command matches - # the one in the tagged configuration. - # Assume this is the tagged configuration we want. - tagname=$z - break - ;; - esac - fi - done - # If $tagname still isn't set, then no tagged configuration - # was found and let the user know that the "--tag" command - # line option must be used. - if test -z "$tagname"; then - $echo "$modename: unable to infer tagged configuration" - $echo "$modename: specify a tag with \`--tag'" 1>&2 - exit 1 -# else -# $echo "$modename: using $tagname tagged configuration" - fi - ;; - esac - fi - - objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` - xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$obj"; then - xdir= - else - xdir=$xdir/ - fi - lobj=${xdir}$objdir/$objname - if test -z "$base_compile"; then $echo "$modename: you must specify a compilation command" 1>&2 $echo "$help" 1>&2 @@ -573,9 +464,9 @@ if test -z "$show_help"; then # Delete any leftover library objects. if test "$build_old_libs" = yes; then - removelist="$obj $lobj $libobj ${libobj}T" + removelist="$obj $libobj" else - removelist="$lobj $libobj ${libobj}T" + removelist="$libobj" fi $run $rm $removelist @@ -600,7 +491,6 @@ if test -z "$show_help"; then removelist="$removelist $output_obj $lockfile" trap "$run $rm $removelist; exit 1" 1 2 15 else - output_obj= need_locks=no lockfile= fi @@ -614,7 +504,7 @@ if test -z "$show_help"; then done elif test "$need_locks" = warn; then if test -f "$lockfile"; then - $echo "\ + echo "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` @@ -628,55 +518,56 @@ compiler." $run $rm $removelist exit 1 fi - $echo $srcfile > "$lockfile" + echo $srcfile > "$lockfile" fi if test -n "$fix_srcfile_path"; then eval srcfile=\"$fix_srcfile_path\" fi - $run $rm "$libobj" "${libobj}T" - - # Create a libtool object file (analogous to a ".la" file), - # but don't create it if we're doing a dry run. - test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then - $echo "\ + test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then + echo "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` @@ -705,9 +596,9 @@ compiler." fi # Just move the object if needed, then go on to compile the next one - if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then - $show "$mv $output_obj $lobj" - if $run $mv $output_obj $lobj; then : + if test x"$output_obj" != x"$libobj"; then + $show "$mv $output_obj $libobj" + if $run $mv $output_obj $libobj; then : else error=$? $run $rm $removelist @@ -715,21 +606,48 @@ compiler." fi fi - # Append the name of the PIC object to the libtool object file. - test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then - $echo "\ + test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then + echo "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` @@ -775,7 +695,7 @@ compiler." fi # Just move the object if needed - if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + if test x"$output_obj" != x"$obj"; then $show "$mv $output_obj $obj" if $run $mv $output_obj $obj; then : else @@ -785,25 +705,23 @@ compiler." fi fi - # Append the name of the non-PIC object the libtool object file. - # Only append if the libtool object file exists. - test -z "$run" && cat >> ${libobj}T <> ${libobj}T < $libobj" + $run eval "echo timestamp > \$libobj" || exit $? + else + # Move the .lo from within objdir + $show "$mv $libobj $lo_libobj" + if $run $mv $libobj $lo_libobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi fi - $run $mv "${libobj}T" "${libobj}" - # Unlock the critical section if it was locked if test "$need_locks" != no; then $run $rm "$lockfile" @@ -820,7 +738,7 @@ EOF # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra - # flag for every libtool invocation. + # flag for every libtool invokation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying @@ -835,7 +753,6 @@ EOF ;; esac libtool_args="$nonopt" - base_compile="$nonopt" compile_command="$nonopt" finalize_command="$nonopt" @@ -851,7 +768,6 @@ EOF linker_flags= dllsearchpath= lib_search_path=`pwd` - inst_prefix_dir= avoid_version=no dlfiles= @@ -866,7 +782,6 @@ EOF module=no no_install=no objs= - non_pic_objects= prefer_static_libs=no preload=no prev= @@ -878,7 +793,6 @@ EOF temp_rpath= thread_safe=no vinfo= - vinfo_number=no # We need to know -static, to get the right output filenames. for arg @@ -909,9 +823,8 @@ EOF test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. - while test "$#" -gt 0; do + while test $# -gt 0; do arg="$1" - base_compile="$base_compile $arg" shift case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") @@ -985,123 +898,11 @@ EOF prev= continue ;; - inst_prefix) - inst_prefix_dir="$arg" - prev= - continue - ;; release) release="-$arg" prev= continue ;; - objectlist) - if test -f "$arg"; then - save_arg=$arg - moreargs= - for fil in `cat $save_arg` - do -# moreargs="$moreargs $fil" - arg=$fil - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - pic_object= - non_pic_object= - - # Read the .lo file - # If there is no directory component, then add one. - case $arg in - */* | *\\*) . $arg ;; - *) . ./$arg ;; - esac - - if test -z "$pic_object" || \ - test -z "$non_pic_object" || - test "$pic_object" = none && \ - test "$non_pic_object" = none; then - $echo "$modename: cannot find name of object for \`$arg'" 1>&2 - exit 1 - fi - - # Extract subdirectory from the argument. - xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$arg"; then - xdir= - else - xdir="$xdir/" - fi - - if test "$pic_object" != none; then - # Prepend the subdirectory the object is found in. - pic_object="$xdir$pic_object" - - if test "$prev" = dlfiles; then - if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then - dlfiles="$dlfiles $pic_object" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - # CHECK ME: I think I busted this. -Ossama - if test "$prev" = dlprefiles; then - # Preload the old-style object. - dlprefiles="$dlprefiles $pic_object" - prev= - fi - - # A PIC object. - libobjs="$libobjs $pic_object" - arg="$pic_object" - fi - - # Non-PIC object. - if test "$non_pic_object" != none; then - # Prepend the subdirectory the object is found in. - non_pic_object="$xdir$non_pic_object" - - # A standard non-PIC object - non_pic_objects="$non_pic_objects $non_pic_object" - if test -z "$pic_object" || test "$pic_object" = none ; then - arg="$non_pic_object" - fi - fi - else - # Only an error if not doing a dry-run. - if test -z "$run"; then - $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 - exit 1 - else - # Dry-run case. - - # Extract subdirectory from the argument. - xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$arg"; then - xdir= - else - xdir="$xdir/" - fi - - pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` - non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` - libobjs="$libobjs $pic_object" - non_pic_objects="$non_pic_objects $non_pic_object" - fi - fi - done - else - $echo "$modename: link input file \`$save_arg' does not exist" - exit 1 - fi - arg=$save_arg - prev= - continue - ;; rpath | xrpath) # We need an absolute path. case $arg in @@ -1140,21 +941,13 @@ EOF finalize_command="$finalize_command $wl$qarg" continue ;; - xcclinker) - linker_flags="$linker_flags $qarg" - compiler_flags="$compiler_flags $qarg" - prev= - compile_command="$compile_command $qarg" - finalize_command="$finalize_command $qarg" - continue - ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac - fi # test -n "$prev" + fi # test -n $prev prevarg="$arg" @@ -1206,16 +999,11 @@ EOF continue ;; - -inst-prefix-dir) - prev=inst_prefix - continue - ;; - # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in - no/*-*-irix* | /*-*-irix*) + no/*-*-irix* | no/*-*-nonstopux*) compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" ;; @@ -1270,18 +1058,14 @@ EOF # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; - *-*-rhapsody* | *-*-darwin1.[012]) - # Rhapsody C and math libraries are in the System framework - deplibs="$deplibs -framework System" - continue esac - elif test "X$arg" = "X-lc_r"; then - case $host in + elif test "X$arg" = "X-lc_r"; then + case $host in *-*-openbsd* | *-*-freebsd*) - # Do not include libc_r directly, use -pthread flag. - continue - ;; - esac + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac fi deplibs="$deplibs $arg" continue @@ -1292,34 +1076,6 @@ EOF continue ;; - # gcc -m* arguments should be passed to the linker via $compiler_flags - # in order to pass architecture information to the linker - # (e.g. 32 vs 64-bit). This may also be accomplished via -Wl,-mfoo - # but this is not reliable with gcc because gcc may use -mfoo to - # select a different linker, different libraries, etc, while - # -Wl,-mfoo simply passes -mfoo to the linker. - -m*) - # Unknown arguments in both finalize_command and compile_command need - # to be aesthetically quoted because they are evaled later. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" - if test "$with_gcc" = "yes" ; then - compiler_flags="$compiler_flags $arg" - fi - continue - ;; - - -shrext) - prev=shrext - continue - ;; - -no-fast-install) fast_install=no continue @@ -1344,11 +1100,6 @@ EOF continue ;; - -objectlist) - prev=objectlist - continue - ;; - -o) prev=output ;; -release) @@ -1401,11 +1152,6 @@ EOF prev=vinfo continue ;; - -version-number) - prev=vinfo - vinfo_number=yes - continue - ;; -Wc,*) args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` @@ -1454,11 +1200,6 @@ EOF continue ;; - -XCClinker) - prev=xcclinker - continue - ;; - # Some other compiler flag. -* | +*) # Unknown arguments in both finalize_command and compile_command need @@ -1471,102 +1212,30 @@ EOF esac ;; - *.$objext) - # A standard object. - objs="$objs $arg" - ;; - - *.lo) - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - pic_object= - non_pic_object= - - # Read the .lo file - # If there is no directory component, then add one. - case $arg in - */* | *\\*) . $arg ;; - *) . ./$arg ;; - esac - - if test -z "$pic_object" || \ - test -z "$non_pic_object" || - test "$pic_object" = none && \ - test "$non_pic_object" = none; then - $echo "$modename: cannot find name of object for \`$arg'" 1>&2 - exit 1 - fi - - # Extract subdirectory from the argument. - xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$arg"; then - xdir= - else - xdir="$xdir/" - fi - - if test "$pic_object" != none; then - # Prepend the subdirectory the object is found in. - pic_object="$xdir$pic_object" - - if test "$prev" = dlfiles; then - if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then - dlfiles="$dlfiles $pic_object" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - # CHECK ME: I think I busted this. -Ossama - if test "$prev" = dlprefiles; then - # Preload the old-style object. - dlprefiles="$dlprefiles $pic_object" - prev= - fi - - # A PIC object. - libobjs="$libobjs $pic_object" - arg="$pic_object" - fi - - # Non-PIC object. - if test "$non_pic_object" != none; then - # Prepend the subdirectory the object is found in. - non_pic_object="$xdir$non_pic_object" - - # A standard non-PIC object - non_pic_objects="$non_pic_objects $non_pic_object" - if test -z "$pic_object" || test "$pic_object" = none ; then - arg="$non_pic_object" - fi - fi - else - # Only an error if not doing a dry-run. - if test -z "$run"; then - $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 - exit 1 + *.lo | *.$objext) + # A library or standard object. + if test "$prev" = dlfiles; then + # This file was specified with -dlopen. + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $arg" + prev= + continue else - # Dry-run case. - - # Extract subdirectory from the argument. - xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$arg"; then - xdir= - else - xdir="$xdir/" - fi - - pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` - non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` - libobjs="$libobjs $pic_object" - non_pic_objects="$non_pic_objects $non_pic_object" + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles fi fi + + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"` + prev= + else + case $arg in + *.lo) libobjs="$libobjs $arg" ;; + *) objs="$objs $arg" ;; + esac + fi ;; *.$libext) @@ -1619,54 +1288,12 @@ EOF exit 1 fi - # Infer tagged configuration to use if any are available and - # if one wasn't chosen via the "--tag" command line option. - # Only attempt this if the compiler in the base link - # command doesn't match the default compiler. - if test -n "$available_tags" && test -z "$tagname"; then - case $base_compile in - # Blanks in the command may have been stripped by the calling shell, - # but not from the CC environment variable when configure was run. - "$CC "* | " $CC "* | "`$echo $CC` "* | " `$echo $CC` "*) ;; - # Blanks at the start of $base_compile will cause this to fail - # if we don't check for them as well. - *) - for z in $available_tags; do - if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$0" > /dev/null; then - # Evaluate the configuration. - eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $0`" - case $base_compile in - "$CC "* | " $CC "* | "`$echo $CC` "* | " `$echo $CC` "*) - # The compiler in $compile_command matches - # the one in the tagged configuration. - # Assume this is the tagged configuration we want. - tagname=$z - break - ;; - esac - fi - done - # If $tagname still isn't set, then no tagged configuration - # was found and let the user know that the "--tag" command - # line option must be used. - if test -z "$tagname"; then - $echo "$modename: unable to infer tagged configuration" - $echo "$modename: specify a tag with \`--tag'" 1>&2 - exit 1 -# else -# $echo "$modename: using $tagname tagged configuration" - fi - ;; - esac - fi - if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" fi - oldlibs= # calculate the name of the file, without its directory outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` libobjs_save="$libobjs" @@ -1687,11 +1314,11 @@ EOF output_objdir="$output_objdir/$objdir" fi # Create the object directory. - if test ! -d "$output_objdir"; then + if test ! -d $output_objdir; then $show "$mkdir $output_objdir" $run $mkdir $output_objdir status=$? - if test "$status" -ne 0 && test ! -d "$output_objdir"; then + if test $status -ne 0 && test ! -d $output_objdir; then exit $status fi fi @@ -1709,17 +1336,7 @@ EOF *) linkmode=prog ;; # Anything else should be a program. esac - case $host in - *cygwin* | *mingw* | *pw32*) - # don't eliminate duplcations in $postdeps and $predeps - duplicate_compiler_generated_deps=yes - ;; - *) - duplicate_compiler_generated_deps=$duplicate_deps - ;; - esac specialdeplibs= - libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) @@ -1731,25 +1348,6 @@ EOF fi libs="$libs $deplib" done - - if test "$linkmode" = lib; then - libs="$predeps $libs $compiler_lib_search_path $postdeps" - - # Compute libraries that are listed more than once in $predeps - # $postdeps and mark them as special (i.e., whose duplicates are - # not to be eliminated). - pre_post_deps= - if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then - for pre_post_dep in $predeps $postdeps; do - case "$pre_post_deps " in - *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; - esac - pre_post_deps="$pre_post_deps $pre_post_dep" - done - fi - pre_post_deps= - fi - deplibs= newdependency_libs= newlib_search_path= @@ -1781,33 +1379,28 @@ EOF ;; esac for pass in $passes; do - if test "$linkmode,$pass" = "lib,link" || - test "$linkmode,$pass" = "prog,scan"; then - libs="$deplibs" - deplibs= - fi - if test "$linkmode" = prog; then + if test $linkmode = prog; then + # Determine which files to process case $pass in - dlopen) libs="$dlfiles" ;; + dlopen) + libs="$dlfiles" + save_deplibs="$deplibs" # Collect dlpreopened libraries + deplibs= + ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi - if test "$pass" = dlopen; then - # Collect dlpreopened libraries - save_deplibs="$deplibs" - deplibs= - fi for deplib in $libs; do lib= found=no case $deplib in -l*) - if test "$linkmode" != lib && test "$linkmode" != prog; then - $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 + if test $linkmode = oldlib && test $linkmode = obj; then + $echo "$modename: warning: \`-l' is ignored for archives/objects: $deplib" 1>&2 continue fi - if test "$pass" = conv; then + if test $pass = conv; then deplibs="$deplib $deplibs" continue fi @@ -1827,61 +1420,25 @@ EOF finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" - test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + test $linkmode = lib && newdependency_libs="$deplib $newdependency_libs" fi continue - else # deplib is a libtool library - # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, - # We need to do some special things here, and not later. - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $deplib "*) - if (${SED} -e '2q' $lib | - grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - library_names= - old_library= - case $lib in - */* | *\\*) . $lib ;; - *) . ./$lib ;; - esac - for l in $old_library $library_names; do - ll="$l" - done - if test "X$ll" = "X$old_library" ; then # only static version available - found=no - ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` - test "X$ladir" = "X$lib" && ladir="." - lib=$ladir/$old_library - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" - fi - continue - fi - fi - ;; - *) ;; - esac - fi fi ;; # -l -L*) case $linkmode in lib) deplibs="$deplib $deplibs" - test "$pass" = conv && continue + test $pass = conv && continue newdependency_libs="$deplib $newdependency_libs" newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` ;; prog) - if test "$pass" = conv; then + if test $pass = conv; then deplibs="$deplib $deplibs" continue fi - if test "$pass" = scan; then + if test $pass = scan; then deplibs="$deplib $deplibs" newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` else @@ -1890,13 +1447,13 @@ EOF fi ;; *) - $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 + $echo "$modename: warning: \`-L' is ignored for archives/objects: $deplib" 1>&2 ;; esac # linkmode continue ;; # -L -R*) - if test "$pass" = link; then + if test $pass = link; then dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` # Make sure the xrpath contains only unique directories. case "$xrpath " in @@ -1909,30 +1466,30 @@ EOF ;; *.la) lib="$deplib" ;; *.$libext) - if test "$pass" = conv; then + if test $pass = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) if test "$deplibs_check_method" != pass_all; then - $echo - $echo "*** Warning: Trying to link with static lib archive $deplib." - $echo "*** I have the capability to make that library automatically link in when" - $echo "*** you link to this library. But I can only do this if you have a" - $echo "*** shared version of the library, which you do not appear to have" - $echo "*** because the file extensions .$libext of this argument makes me believe" - $echo "*** that it is just a static archive that I should not used here." + echo + echo "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not used here." else - $echo - $echo "*** Warning: Linking the shared library $output against the" - $echo "*** static library $deplib is not portable!" + echo + echo "*** Warning: Linking the shared library $output against the" + echo "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi continue ;; prog) - if test "$pass" != link; then + if test $pass != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" @@ -1943,18 +1500,14 @@ EOF esac # linkmode ;; # *.$libext *.lo | *.$objext) - if test "$pass" = conv; then - deplibs="$deplib $deplibs" - elif test "$linkmode" = prog; then - if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then - # If there is no dlopen support or we're linking statically, - # we need to preload. - newdlprefiles="$newdlprefiles $deplib" - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - newdlfiles="$newdlfiles $deplib" - fi + if test $pass = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" fi continue ;; @@ -1963,14 +1516,14 @@ EOF continue ;; esac # case $deplib - if test "$found" = yes || test -f "$lib"; then : + if test $found = yes || test -f "$lib"; then : else $echo "$modename: cannot find the library \`$lib'" 1>&2 exit 1 fi # Check to see that this really is a libtool archive. - if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + if (${SED} -e '2q' $lib | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit 1 @@ -1986,9 +1539,8 @@ EOF library_names= old_library= # If the library was installed with an old release of libtool, - # it will not redefine variables installed, or shouldnotlink + # it will not redefine variable installed. installed=yes - shouldnotlink=no # Read the .la file case $lib in @@ -1998,12 +1550,13 @@ EOF if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || - { test "$linkmode" != prog && test "$linkmode" != lib; }; then + { test $linkmode = oldlib && test $linkmode = obj; }; then + # Add dl[pre]opened files of deplib test -n "$dlopen" && dlfiles="$dlfiles $dlopen" test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" fi - if test "$pass" = conv; then + if test $pass = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then @@ -2024,14 +1577,13 @@ EOF fi tmp_libs="$tmp_libs $deplib" done - elif test "$linkmode" != prog && test "$linkmode" != lib; then + elif test $linkmode != prog && test $linkmode != lib; then $echo "$modename: \`$lib' is not a convenience library" 1>&2 exit 1 fi continue fi # $pass = conv - # Get the name of the library we link against. linklib= for l in $old_library $library_names; do @@ -2043,17 +1595,15 @@ EOF fi # This library was specified with -dlopen. - if test "$pass" = dlopen; then + if test $pass = dlopen; then if test -z "$libdir"; then $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 exit 1 fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking - # statically, we need to preload. We also need to preload any - # dependent libraries so libltdl's deplib preloader doesn't - # bomb out in the load deplibs phase. - dlprefiles="$dlprefiles $lib $dependency_libs" + # statically, we need to preload. + dlprefiles="$dlprefiles $lib" else newdlfiles="$newdlfiles $lib" fi @@ -2094,7 +1644,7 @@ EOF name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` # This library was specified with -dlpreopen. - if test "$pass" = dlpreopen; then + if test $pass = dlpreopen; then if test -z "$libdir"; then $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 exit 1 @@ -2113,19 +1663,18 @@ EOF if test -z "$libdir"; then # Link the convenience library - if test "$linkmode" = lib; then + if test $linkmode = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else - deplibs="$lib $deplibs" # used for prog,scan pass + deplibs="$lib $deplibs" fi continue fi - - if test "$linkmode" = prog && test "$pass" != link; then + if test $linkmode = prog && test $pass != link; then newlib_search_path="$newlib_search_path $ladir" deplibs="$lib $deplibs" @@ -2141,7 +1690,7 @@ EOF -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test esac # Need to link against all dependency_libs? - if test "$linkalldeplibs" = yes; then + if test $linkalldeplibs = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths @@ -2158,19 +1707,13 @@ EOF continue fi # $linkmode = prog... - if test "$linkmode,$pass" = "prog,link"; then - if test -n "$library_names" && - { test "$prefer_static_libs" = no || test -z "$old_library"; }; then - # We need to hardcode the library path - if test -n "$shlibpath_var"; then - # Make sure the rpath contains only unique directories. - case "$temp_rpath " in - *" $dir "*) ;; - *" $absdir "*) ;; - *) temp_rpath="$temp_rpath $dir" ;; - esac - fi + link_static=no # Whether the deplib will be linked statically + if test -n "$library_names" && + { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + # Link against this shared library + if test "$linkmode,$pass" = "prog,link" || + { test $linkmode = lib && test $hardcode_into_libs = yes; }; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. @@ -2192,6 +1735,17 @@ EOF esac ;; esac + if test $linkmode = prog; then + # We need to hardcode the library path + if test -n "$shlibpath_var"; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath " in + *" $dir "*) ;; + *" $absdir "*) ;; + *) temp_rpath="$temp_rpath $dir" ;; + esac + fi + fi fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && @@ -2201,51 +1755,11 @@ EOF # We only need to search for static libraries continue fi - fi - link_static=no # Whether the deplib will be linked statically - if test -n "$library_names" && - { test "$prefer_static_libs" = no || test -z "$old_library"; }; then if test "$installed" = no; then notinst_deplibs="$notinst_deplibs $lib" need_relink=yes fi - # This is a shared library - - # Warn about portability, can't link against -module's on some systems (darwin) - if test "$shouldnotlink" = yes && test "$pass" = link ; then - $echo - if test "$linkmode" = prog; then - $echo "*** Warning: Linking the executable $output against the loadable module" - else - $echo "*** Warning: Linking the shared library $output against the loadable module" - fi - $echo "*** $linklib is not portable!" - fi - if test "$linkmode" = lib && - test "$hardcode_into_libs" = yes; then - # Hardcode the library path. - # Skip directories that are in the system default run-time - # search path. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in - *" $absdir "*) ;; - *) compile_rpath="$compile_rpath $absdir" - esac - ;; - esac - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" - esac - ;; - esac - fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname @@ -2259,7 +1773,7 @@ EOF elif test -n "$soname_spec"; then # bleh windows case $host in - *cygwin* | mingw*) + *cygwin*) major=`expr $current - $age` versuffix="-$major" ;; @@ -2271,8 +1785,8 @@ EOF # Make a new name for the extract_expsyms_cmds to use soroot="$soname" - soname=`$echo $soroot | ${SED} -e 's/^.*\///'` - newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" + soname=`echo $soroot | ${SED} -e 's/^.*\///'` + newlib="libimp-`echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : @@ -2303,9 +1817,9 @@ EOF # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib - fi # test -n "$old_archive_from_expsyms_cmds" + fi # test -n $old_archive_from_expsyms_cmds - if test "$linkmode" = prog || test "$mode" != relink; then + if test $linkmode = prog || test "$mode" != relink; then add_shlibpath= add_dir= add= @@ -2314,22 +1828,6 @@ EOF immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" - case $host in - *-*-sco3.2v5* ) add_dir="-L$dir" ;; - *-*-darwin* ) - # if the lib is a module then we can not link against it, someone - # is ignoring the new warnings I added - if /usr/bin/file -L $add 2> /dev/null | grep "bundle" >/dev/null ; then - $echo "** Warning, lib $linklib is a module, not a shared library" - if test -z "$old_library" ; then - $echo - $echo "** And there doesn't seem to be a static archive available" - $echo "** The link will probably fail, sorry" - else - add="$dir/$old_library" - fi - fi - esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; @@ -2348,14 +1846,6 @@ EOF add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$dir" - # Try looking first in the location we're being installed to. - if test -n "$inst_prefix_dir"; then - case "$libdir" in - [\\/]*) - add_dir="-L$inst_prefix_dir$libdir $add_dir" - ;; - esac - fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" @@ -2378,7 +1868,7 @@ EOF *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; esac fi - if test "$linkmode" = prog; then + if test $linkmode = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else @@ -2395,7 +1885,7 @@ EOF fi fi - if test "$linkmode" = prog || test "$mode" = relink; then + if test $linkmode = prog || test "$mode" = relink; then add_shlibpath= add_dir= add= @@ -2411,27 +1901,13 @@ EOF *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac add="-l$name" - elif test "$hardcode_automatic" = yes; then - if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then - add="$inst_prefix_dir$libdir/$linklib" - else - add="$libdir/$linklib" - fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" - # Try looking first in the location we're being installed to. - if test -n "$inst_prefix_dir"; then - case "$libdir" in - [\\/]*) - add_dir="-L$inst_prefix_dir$libdir $add_dir" - ;; - esac - fi add="-l$name" fi - if test "$linkmode" = prog; then + if test $linkmode = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else @@ -2439,7 +1915,16 @@ EOF test -n "$add" && deplibs="$add $deplibs" fi fi - elif test "$linkmode" = prog; then + elif test $linkmode = prog; then + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + + # Try to link the static library # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. @@ -2459,21 +1944,21 @@ EOF # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. - $echo - $echo "*** Warning: This system can not link to static lib archive $lib." - $echo "*** I have the capability to make that library automatically link in when" - $echo "*** you link to this library. But I can only do this if you have a" - $echo "*** shared version of the library, which you do not appear to have." + echo + echo "*** Warning: This system can not link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then - $echo "*** But as you try to build a module library, libtool will still create " - $echo "*** a static module, that should work as long as the dlopening application" - $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then - $echo - $echo "*** However, this would only work if libtool was able to extract symbol" - $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" - $echo "*** not find such a program. So, this module is probably useless." - $echo "*** \`nm' from GNU binutils and a full rebuild may help." + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module @@ -2490,10 +1975,10 @@ EOF fi fi # link shared/static library? - if test "$linkmode" = lib; then + if test $linkmode = lib; then if test -n "$dependency_libs" && - { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || - test "$link_static" = yes; }; then + { test $hardcode_into_libs != yes || test $build_old_libs = yes || + test $link_static = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do @@ -2524,7 +2009,7 @@ EOF tmp_libs="$tmp_libs $deplib" done - if test "$link_all_deplibs" != no; then + if test $link_all_deplibs != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do case $deplib in @@ -2544,7 +2029,7 @@ EOF ;; esac if grep "^installed=no" $deplib > /dev/null; then - path="$absdir/$objdir" + path="-L$absdir/$objdir" else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` if test -z "$libdir"; then @@ -2554,53 +2039,12 @@ EOF if test "$absdir" != "$libdir"; then $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 fi - path="$absdir" + path="-L$absdir" fi - depdepl= - case $host in - *-*-darwin*) - # we do not want to link against static libs, but need to link against shared - eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` - if test -n "$deplibrary_names" ; then - for tmp in $deplibrary_names ; do - depdepl=$tmp - done - if test -f "$path/$depdepl" ; then - depdepl="$path/$depdepl" - fi - newlib_search_path="$newlib_search_path $path" - path="" - fi - ;; - *) - path="-L$path" - ;; - esac - - ;; - -l*) - case $host in - *-*-darwin*) - # Again, we only want to link against shared libraries - eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` - for tmp in $newlib_search_path ; do - if test -f "$tmp/lib$tmp_libs.dylib" ; then - eval depdepl="$tmp/lib$tmp_libs.dylib" - break - fi - done - path="" - ;; - *) continue ;; - esac ;; *) continue ;; esac case " $deplibs " in - *" $depdepl "*) ;; - *) deplibs="$deplibs $depdepl" ;; - esac - case " $deplibs " in *" $path "*) ;; *) deplibs="$deplibs $path" ;; esac @@ -2608,15 +2052,15 @@ EOF fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs - dependency_libs="$newdependency_libs" - if test "$pass" = dlpreopen; then + if test $pass = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi - if test "$pass" != dlopen; then - if test "$pass" != conv; then + if test $pass != dlopen; then + test $pass != scan && dependency_libs="$newdependency_libs" + if test $pass != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do @@ -2638,30 +2082,9 @@ EOF eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do - # FIXME: Pedantically, this is the right thing to do, so - # that some nasty dependency loop isn't accidentally - # broken: - #new_libs="$deplib $new_libs" - # Pragmatically, this seems to cause very few problems in - # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; - -R*) ;; *) - # And here is the reason: when a library appears more - # than once as an explicit dependence of a library, or - # is implicitly linked in more than once by the - # compiler, it is considered special, and multiple - # occurrences thereof are not removed. Compare this - # with having the same library being listed as a - # dependency of multiple other libraries: in this case, - # we know (pedantically, we assume) the library does not - # need to be listed more than once, so we keep only the - # last copy. This is not always right, but it is rare - # enough that we require users that really mean to play - # such unportable linking tricks to link the library - # using -Wl,-lname, so that libtool does not consider it - # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) @@ -2689,31 +2112,19 @@ EOF eval $var=\"$tmp_libs\" done # for var fi - # Last step: remove runtime libs from dependency_libs (they stay in deplibs) - tmp_libs= - for i in $dependency_libs ; do - case " $predeps $postdeps $compiler_lib_search_path " in - *" $i "*) - i="" - ;; - esac - if test -n "$i" ; then - tmp_libs="$tmp_libs $i" - fi - done - dependency_libs=$tmp_libs + if test "$pass" = "conv" && + { test "$linkmode" = "lib" || test "$linkmode" = "prog"; }; then + libs="$deplibs" # reset libs + deplibs= + fi done # for pass - if test "$linkmode" = prog; then + if test $linkmode = prog; then dlfiles="$newdlfiles" dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) - if test -n "$deplibs"; then - $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 - fi - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 fi @@ -2727,7 +2138,7 @@ EOF fi if test -n "$vinfo"; then - $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 + $echo "$modename: warning: \`-version-info' is ignored for archives" 1>&2 fi if test -n "$release"; then @@ -2749,7 +2160,6 @@ EOF case $outputname in lib*) name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` - eval shared_ext=\"$shrext\" eval libname=\"$libname_spec\" ;; *) @@ -2761,7 +2171,6 @@ EOF if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` - eval shared_ext=\"$shrext\" eval libname=\"$libname_spec\" else libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` @@ -2774,9 +2183,9 @@ EOF $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 exit 1 else - $echo - $echo "*** Warning: Linking the shared library $output against the non-libtool" - $echo "*** objects $objs is not portable!" + echo + echo "*** Warning: Linking the shared library $output against the non-libtool" + echo "*** objects $objs is not portable!" libobjs="$libobjs $objs" fi fi @@ -2786,7 +2195,7 @@ EOF fi set dummy $rpath - if test "$#" -gt 2; then + if test $# -gt 2; then $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 fi install_libdir="$2" @@ -2795,16 +2204,14 @@ EOF if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. - # Some compilers have problems with a `.al' extension so - # convenience libraries should have the same extension an - # archive normally would. + libext=al oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi if test -n "$vinfo"; then - $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 + $echo "$modename: warning: \`-version-info' is ignored for convenience libraries" 1>&2 fi if test -n "$release"; then @@ -2823,46 +2230,9 @@ EOF exit 1 fi - # convert absolute version numbers to libtool ages - # this retains compatibility with .la files and attempts - # to make the code below a bit more comprehensible - - case $vinfo_number in - yes) - number_major="$2" - number_minor="$3" - number_revision="$4" - # - # There are really only two kinds -- those that - # use the current revision as the major version - # and those that subtract age and use age as - # a minor version. But, then there is irix - # which has an extra 1 added just for fun - # - case $version_type in - darwin|linux|osf|windows) - current=`expr $number_major + $number_minor` - age="$number_minor" - revision="$number_revision" - ;; - freebsd-aout|freebsd-elf|sunos) - current="$number_major" - revision="$number_minor" - age="0" - ;; - irix|nonstopux) - current=`expr $number_major + $number_minor - 1` - age="$number_minor" - revision="$number_minor" - ;; - esac - ;; - no) - current="$2" - revision="$3" - age="$4" - ;; - esac + current="$2" + revision="$3" + age="$4" # Check that each of the things are valid numbers. case $current in @@ -2892,7 +2262,7 @@ EOF ;; esac - if test "$age" -gt "$current"; then + if test $age -gt $current; then $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit 1 @@ -2905,15 +2275,28 @@ EOF case $version_type in none) ;; - darwin) - # Like Linux, but with the current version available in - # verstring for coding it into the library header - major=.`expr $current - $age` - versuffix="$major.$age.$revision" - # Darwin ld doesn't like 0 for these options... - minor_current=`expr $current + 1` - verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" - ;; + darwin* | rhapsody*) + case "$host_os" in + darwin1.[012]) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + minor_current=`expr $current + 1` + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + *) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + major=`expr $current - $age` + versuffix="$major.$age.$revision" + compatage=`expr $age - 1` + compatver="$major.$compatage.0" + verstring="-compatibility_version $compatver -current_version $versuffix" + ;; + esac + ;; freebsd-aout) major=".$current" @@ -2936,7 +2319,7 @@ EOF # Add in all the interfaces that we are compatible with. loop=$revision - while test "$loop" -ne 0; do + while test $loop != 0; do iface=`expr $revision - $loop` loop=`expr $loop - 1` verstring="$verstring_prefix$major.$iface:$verstring" @@ -2959,7 +2342,7 @@ EOF # Add in all the interfaces that we are compatible with. loop=$age - while test "$loop" -ne 0; do + while test $loop != 0; do iface=`expr $current - $loop` loop=`expr $loop - 1` verstring="$verstring:${iface}.0" @@ -2983,7 +2366,7 @@ EOF *) $echo "$modename: unknown library version type \`$version_type'" 1>&2 - $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 exit 1 ;; esac @@ -2991,11 +2374,12 @@ EOF # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= + verstring="0.0" case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely - verstring= + verstring="" ;; *) verstring="0.0" @@ -3029,24 +2413,9 @@ EOF fi if test "$mode" != relink; then - # Remove our outputs, but don't remove object files since they - # may have been created when compiling PIC objects. - removelist= - tempremovelist=`$echo "$output_objdir/*"` - for p in $tempremovelist; do - case $p in - *.$objext) - ;; - $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) - removelist="$removelist $p" - ;; - *) ;; - esac - done - if test -n "$removelist"; then - $show "${rm}r $removelist" - $run ${rm}r $removelist - fi + # Remove our outputs. + $show "${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*" + $run ${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.* fi # Now set the variables for building old libraries. @@ -3059,9 +2428,9 @@ EOF # Eliminate all temporary directories. for path in $notinst_path; do - lib_search_path=`$echo "$lib_search_path " | ${SED} -e 's% $path % %g'` - deplibs=`$echo "$deplibs " | ${SED} -e 's% -L$path % %g'` - dependency_libs=`$echo "$dependency_libs " | ${SED} -e 's% -L$path % %g'` + lib_search_path=`echo "$lib_search_path " | ${SED} -e 's% $path % %g'` + deplibs=`echo "$deplibs " | ${SED} -e 's% -L$path % %g'` + dependency_libs=`echo "$dependency_libs " | ${SED} -e 's% -L$path % %g'` done if test -n "$xrpath"; then @@ -3074,7 +2443,7 @@ EOF *) finalize_rpath="$finalize_rpath $libdir" ;; esac done - if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + if test $hardcode_into_libs != yes || test $build_old_libs = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi @@ -3114,11 +2483,10 @@ EOF ;; *-*-openbsd* | *-*-freebsd*) # Do not include libc due to us having libc/libc_r. - test "X$arg" = "X-lc" && continue ;; - *) + *) # Add libc to deplibs on all other systems if necessary. - if test "$build_libtool_need_lc" = "yes"; then + if test $build_libtool_need_lc = "yes"; then deplibs="$deplibs -lc" fi ;; @@ -3145,7 +2513,7 @@ EOF # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just - # implementing what was already the behavior. + # implementing what was already the behaviour. newdeplibs=$deplibs ;; test_compile) @@ -3158,22 +2526,45 @@ EOF int main() { return 0; } EOF $rm conftest - $LTCC -o conftest conftest.c $deplibs - if test "$?" -eq 0 ; then + $CC -o conftest conftest.c $deplibs + if test $? -eq 0 ; then ldd_output=`ldd conftest` for i in $deplibs; do name="`expr $i : '-l\(.*\)'`" # If $name is empty we are operating on a -L argument. - if test "$name" != "" && test "$name" -ne "0"; then - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $i "*) - newdeplibs="$newdeplibs $i" - i="" - ;; - esac - fi - if test -n "$i" ; then + if test -n "$name" && test "$name" != "0"; then + libname=`eval \\$echo \"$libname_spec\"` + deplib_matches=`eval \\$echo \"$library_names_spec\"` + set dummy $deplib_matches + deplib_match=$2 + if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then + newdeplibs="$newdeplibs $i" + else + droppeddeps=yes + echo + echo "*** Warning: dynamic linker does not accept needed library $i." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which I believe you do not have" + echo "*** because a test_compile did reveal that the linker did not use it for" + echo "*** its dynamic dependency list that programs get resolved with at runtime." + fi + else + newdeplibs="$newdeplibs $i" + fi + done + else + # Error occured in the first compile. Let's try to salvage + # the situation: Compile a separate program for each library. + for i in $deplibs; do + name="`expr $i : '-l\(.*\)'`" + # If $name is empty we are operating on a -L argument. + if test -n "$name" && test "$name" != "0"; then + $rm conftest + $CC -o conftest conftest.c $i + # Did it work? + if test $? -eq 0 ; then + ldd_output=`ldd conftest` libname=`eval \\$echo \"$libname_spec\"` deplib_matches=`eval \\$echo \"$library_names_spec\"` set dummy $deplib_matches @@ -3182,64 +2573,21 @@ EOF newdeplibs="$newdeplibs $i" else droppeddeps=yes - $echo - $echo "*** Warning: dynamic linker does not accept needed library $i." - $echo "*** I have the capability to make that library automatically link in when" - $echo "*** you link to this library. But I can only do this if you have a" - $echo "*** shared version of the library, which I believe you do not have" - $echo "*** because a test_compile did reveal that the linker did not use it for" - $echo "*** its dynamic dependency list that programs get resolved with at runtime." - fi - fi - else - newdeplibs="$newdeplibs $i" - fi - done - else - # Error occurred in the first compile. Let's try to salvage - # the situation: Compile a separate program for each library. - for i in $deplibs; do - name="`expr $i : '-l\(.*\)'`" - # If $name is empty we are operating on a -L argument. - if test "$name" != "" && test "$name" != "0"; then - $rm conftest - $LTCC -o conftest conftest.c $i - # Did it work? - if test "$?" -eq 0 ; then - ldd_output=`ldd conftest` - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $i "*) - newdeplibs="$newdeplibs $i" - i="" - ;; - esac - fi - if test -n "$i" ; then - libname=`eval \\$echo \"$libname_spec\"` - deplib_matches=`eval \\$echo \"$library_names_spec\"` - set dummy $deplib_matches - deplib_match=$2 - if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then - newdeplibs="$newdeplibs $i" - else - droppeddeps=yes - $echo - $echo "*** Warning: dynamic linker does not accept needed library $i." - $echo "*** I have the capability to make that library automatically link in when" - $echo "*** you link to this library. But I can only do this if you have a" - $echo "*** shared version of the library, which you do not appear to have" - $echo "*** because a test_compile did reveal that the linker did not use this one" - $echo "*** as a dynamic dependency that programs can get resolved with at runtime." - fi + echo + echo "*** Warning: dynamic linker does not accept needed library $i." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because a test_compile did reveal that the linker did not use this one" + echo "*** as a dynamic dependency that programs can get resolved with at runtime." fi else droppeddeps=yes - $echo - $echo "*** Warning! Library $i is needed by this library but I was not able to" - $echo "*** make it link in! You will probably need to install it or some" - $echo "*** library that it depends on before this library will be fully" - $echo "*** functional. Installing it before continuing would be even better." + echo + echo "*** Warning! Library $i is needed by this library but I was not able to" + echo "*** make it link in! You will probably need to install it or some" + echo "*** library that it depends on before this library will be fully" + echo "*** functional. Installing it before continuing would be even better." fi else newdeplibs="$newdeplibs $i" @@ -3253,20 +2601,11 @@ EOF for a_deplib in $deplibs; do name="`expr $a_deplib : '-l\(.*\)'`" # If $name is empty we are operating on a -L argument. - if test "$name" != "" && test "$name" != "0"; then - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $a_deplib "*) - newdeplibs="$newdeplibs $a_deplib" - a_deplib="" - ;; - esac - fi - if test -n "$a_deplib" ; then - libname=`eval \\$echo \"$libname_spec\"` - for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do - potential_libs=`ls $i/$libname[.-]* 2>/dev/null` - for potent_lib in $potential_libs; do + if test -n "$name" && test "$name" != "0"; then + libname=`eval \\$echo \"$libname_spec\"` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null \ | grep " -> " >/dev/null; then @@ -3287,27 +2626,26 @@ EOF done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ | ${SED} 10q \ - | $EGREP "$file_magic_regex" > /dev/null; then + | egrep "$file_magic_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi - done - done - fi + done + done if test -n "$a_deplib" ; then droppeddeps=yes - $echo - $echo "*** Warning: linker path does not have real file for library $a_deplib." - $echo "*** I have the capability to make that library automatically link in when" - $echo "*** you link to this library. But I can only do this if you have a" - $echo "*** shared version of the library, which you do not appear to have" - $echo "*** because I did check the linker path looking for a file starting" + echo + echo "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then - $echo "*** with $libname but no candidates were found. (...for file magic test)" + echo "*** with $libname but no candidates were found. (...for file magic test)" else - $echo "*** with $libname and none of the candidates passed a file format test" - $echo "*** using a file magic. Last file checked: $potlib" + echo "*** with $libname and none of the candidates passed a file format test" + echo "*** using a file magic. Last file checked: $potlib" fi fi else @@ -3323,43 +2661,33 @@ EOF name="`expr $a_deplib : '-l\(.*\)'`" # If $name is empty we are operating on a -L argument. if test -n "$name" && test "$name" != "0"; then - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $a_deplib "*) - newdeplibs="$newdeplibs $a_deplib" - a_deplib="" - ;; - esac - fi - if test -n "$a_deplib" ; then - libname=`eval \\$echo \"$libname_spec\"` - for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do - potential_libs=`ls $i/$libname[.-]* 2>/dev/null` - for potent_lib in $potential_libs; do - potlib="$potent_lib" # see symlink-check above in file_magic test - if eval $echo \"$potent_lib\" 2>/dev/null \ - | ${SED} 10q \ - | $EGREP "$match_pattern_regex" > /dev/null; then - newdeplibs="$newdeplibs $a_deplib" - a_deplib="" - break 2 - fi - done + libname=`eval \\$echo \"$libname_spec\"` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check below in file_magic test + if eval echo \"$potent_lib\" 2>/dev/null \ + | ${SED} 10q \ + | egrep "$match_pattern_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi done - fi + done if test -n "$a_deplib" ; then droppeddeps=yes - $echo - $echo "*** Warning: linker path does not have real file for library $a_deplib." - $echo "*** I have the capability to make that library automatically link in when" - $echo "*** you link to this library. But I can only do this if you have a" - $echo "*** shared version of the library, which you do not appear to have" - $echo "*** because I did check the linker path looking for a file starting" + echo + echo "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then - $echo "*** with $libname but no candidates were found. (...for regex pattern test)" + echo "*** with $libname but no candidates were found. (...for regex pattern test)" else - $echo "*** with $libname and none of the candidates passed a file format test" - $echo "*** using a regex pattern. Last file checked: $potlib" + echo "*** with $libname and none of the candidates passed a file format test" + echo "*** using a regex pattern. Last file checked: $potlib" fi fi else @@ -3370,23 +2698,16 @@ EOF ;; none | unknown | *) newdeplibs="" - tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ - -e 's/ -[LR][^ ]*//g'` - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - for i in $predeps $postdeps ; do - # can't use Xsed below, because $i might contain '/' - tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` - done - fi - if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ - | grep . >/dev/null; then - $echo + if $echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g' -e 's/[ ]//g' | + grep . >/dev/null; then + echo if test "X$deplibs_check_method" = "Xnone"; then - $echo "*** Warning: inter-library dependencies are not supported in this platform." + echo "*** Warning: inter-library dependencies are not supported in this platform." else - $echo "*** Warning: inter-library dependencies are not known to be supported." + echo "*** Warning: inter-library dependencies are not known to be supported." fi - $echo "*** All declared inter-library dependencies are being dropped." + echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes fi ;; @@ -3406,17 +2727,17 @@ EOF if test "$droppeddeps" = yes; then if test "$module" = yes; then - $echo - $echo "*** Warning: libtool could not satisfy all declared inter-library" - $echo "*** dependencies of module $libname. Therefore, libtool will create" - $echo "*** a static module, that should work as long as the dlopening" - $echo "*** application is linked with the -dlopen flag." + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + echo "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then - $echo - $echo "*** However, this would only work if libtool was able to extract symbol" - $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" - $echo "*** not find such a program. So, this module is probably useless." - $echo "*** \`nm' from GNU binutils and a full rebuild may help." + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" @@ -3426,16 +2747,16 @@ EOF build_libtool_libs=no fi else - $echo "*** The inter-library dependencies that have been dropped here will be" - $echo "*** automatically added whenever a program is linked with this library" - $echo "*** or is declared to -dlopen it." + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." - if test "$allow_undefined" = no; then - $echo - $echo "*** Since this library must not contain undefined symbols," - $echo "*** because either the platform does not support them or" - $echo "*** it was explicitly requested with -no-undefined," - $echo "*** libtool will only create a static version of it." + if test $allow_undefined = no; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module @@ -3457,7 +2778,7 @@ EOF # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then - if test "$hardcode_into_libs" = yes; then + if test $hardcode_into_libs = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= @@ -3493,11 +2814,7 @@ EOF if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" - if test -n "$hardcode_libdir_flag_spec_ld"; then - eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" - else - eval dep_rpath=\"$hardcode_libdir_flag_spec\" - fi + eval dep_rpath=\"$hardcode_libdir_flag_spec\" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. @@ -3517,7 +2834,6 @@ EOF fi # Get the real and link names of the library. - eval shared_ext=\"$shrext\" eval library_names=\"$library_names_spec\" set dummy $library_names realname="$2" @@ -3528,9 +2844,7 @@ EOF else soname="$realname" fi - if test -z "$dlname"; then - dlname=$soname - fi + test -z "$dlname" && dlname=$soname lib="$output_objdir/$realname" for link @@ -3538,6 +2852,23 @@ EOF linknames="$linknames $link" done + # Ensure that we have .o objects for linkers which dislike .lo + # (e.g. aix) in case we are running --disable-static + for obj in $libobjs; do + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir="." + else + xdir="$xdir" + fi + baseobj=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"` + if test ! -f $xdir/$oldobj; then + $show "(cd $xdir && ${LN_S} $baseobj $oldobj)" + $run eval '(cd $xdir && ${LN_S} $baseobj $oldobj)' || exit $? + fi + done + # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` @@ -3551,21 +2882,13 @@ EOF save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" - if len=`expr "X$cmd" : ".*"` && - test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then - $show "$cmd" - $run eval "$cmd" || exit $? - skipped_export=false - else - # The command line is too long to execute in one step. - $show "using reloadable object file for export list..." - skipped_export=: - fi + $show "$cmd" + $run eval "$cmd" || exit $? done IFS="$save_ifs" if test -n "$export_symbols_regex"; then - $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" - $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + $show "egrep -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" + $run eval 'egrep -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' $show "$mv \"${export_symbols}T\" \"$export_symbols\"" $run eval '$mv "${export_symbols}T" "$export_symbols"' fi @@ -3576,29 +2899,17 @@ EOF $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' fi - tmp_deplibs= - for test_deplib in $deplibs; do - case " $convenience " in - *" $test_deplib "*) ;; - *) - tmp_deplibs="$tmp_deplibs $test_deplib" - ;; - esac - done - deplibs="$tmp_deplibs" - if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then - save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" else gentop="$output_objdir/${outputname}x" $show "${rm}r $gentop" $run ${rm}r "$gentop" - $show "$mkdir $gentop" - $run $mkdir "$gentop" + $show "mkdir $gentop" + $run mkdir "$gentop" status=$? - if test "$status" -ne 0 && test ! -d "$gentop"; then + if test $status -ne 0 && test ! -d "$gentop"; then exit $status fi generated="$generated $gentop" @@ -3614,42 +2925,16 @@ EOF $show "${rm}r $xdir" $run ${rm}r "$xdir" - $show "$mkdir $xdir" - $run $mkdir "$xdir" + $show "mkdir $xdir" + $run mkdir "$xdir" status=$? - if test "$status" -ne 0 && test ! -d "$xdir"; then + if test $status -ne 0 && test ! -d "$xdir"; then exit $status fi - # We will extract separately just the conflicting names and we will no - # longer touch any unique names. It is faster to leave these extract - # automatically by $AR in one run. $show "(cd $xdir && $AR x $xabs)" $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? - if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then - : - else - $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 - $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 - $AR t "$xabs" | sort | uniq -cd | while read -r count name - do - i=1 - while test "$i" -le "$count" - do - # Put our $i before any first dot (extension) - # Never overwrite any file - name_to="$name" - while test "X$name_to" = "X$name" || test -f "$xdir/$name_to" - do - name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` - done - $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')" - $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $? - i=`expr $i + 1` - done - done - fi - libobjs="$libobjs "`find $xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + libobjs="$libobjs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` done fi fi @@ -3665,130 +2950,21 @@ EOF fi # Do each of the archive commands. - if test "$module" = yes && test -n "$module_cmds" ; then - if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then - eval cmds=\"$module_expsym_cmds\" - else - eval cmds=\"$module_cmds\" - fi - else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval cmds=\"$archive_expsym_cmds\" else - eval cmds=\"$archive_cmds\" - fi - fi - - if test "X$skipped_export" != "X:" && len=`expr "X$cmds" : ".*"` && - test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then - : - else - # The command line is too long to link in one step, link piecewise. - $echo "creating reloadable object files..." - - # Save the value of $output and $libobjs because we want to - # use them later. If we have whole_archive_flag_spec, we - # want to use save_libobjs as it was before - # whole_archive_flag_spec was expanded, because we can't - # assume the linker understands whole_archive_flag_spec. - # This may have to be revisited, in case too many - # convenience libraries get linked in and end up exceeding - # the spec. - if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then - save_libobjs=$libobjs - fi - save_output=$output - - # Clear the reloadable object creation command queue and - # initialize k to one. - test_cmds= - concat_cmds= - objlist= - delfiles= - last_robj= - k=1 - output=$output_objdir/$save_output-${k}.$objext - # Loop over the list of objects to be linked. - for obj in $save_libobjs - do - eval test_cmds=\"$reload_cmds $objlist $last_robj\" - if test "X$objlist" = X || - { len=`expr "X$test_cmds" : ".*"` && - test "$len" -le "$max_cmd_len"; }; then - objlist="$objlist $obj" - else - # The command $test_cmds is almost too long, add a - # command to the queue. - if test "$k" -eq 1 ; then - # The first file doesn't have a previous command to add. - eval concat_cmds=\"$reload_cmds $objlist $last_robj\" - else - # All subsequent reloadable object files will link in - # the last one created. - eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" + save_deplibs="$deplibs" + for conv in $convenience; do + tmp_deplibs= + for test_deplib in $deplibs; do + if test "$test_deplib" != "$conv"; then + tmp_deplibs="$tmp_deplibs $test_deplib" fi - last_robj=$output_objdir/$save_output-${k}.$objext - k=`expr $k + 1` - output=$output_objdir/$save_output-${k}.$objext - objlist=$obj - len=1 - fi + done + deplibs="$tmp_deplibs" done - # Handle the remaining objects by creating one last - # reloadable object file. All subsequent reloadable object - # files will link in the last one created. - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" - - if ${skipped_export-false}; then - $show "generating symbol list for \`$libname.la'" - export_symbols="$output_objdir/$libname.exp" - $run $rm $export_symbols - libobjs=$output - # Append the command to create the export file. - eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" - fi - - # Set up a command to remove the reloadale object files - # after they are used. - i=0 - while test "$i" -lt "$k" - do - i=`expr $i + 1` - delfiles="$delfiles $output_objdir/$save_output-${i}.$objext" - done - - $echo "creating a temporary reloadable object file: $output" - - # Loop through the commands generated above and execute them. - save_ifs="$IFS"; IFS='~' - for cmd in $concat_cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - - libobjs=$output - # Restore the value of output. - output=$save_output - - if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then - eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - fi - # Expand the library linking commands again to reset the - # value of $libobjs for piecewise linking. - - # Do each of the archive commands. - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - eval cmds=\"$archive_expsym_cmds\" - else - eval cmds=\"$archive_cmds\" - fi - - # Append the command to remove the reloadable object files - # to the just-reset $cmds. - eval cmds=\"\$cmds~$rm $delfiles\" + eval cmds=\"$archive_cmds\" + deplibs="$save_deplibs" fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do @@ -3880,10 +3056,10 @@ EOF gentop="$output_objdir/${obj}x" $show "${rm}r $gentop" $run ${rm}r "$gentop" - $show "$mkdir $gentop" - $run $mkdir "$gentop" + $show "mkdir $gentop" + $run mkdir "$gentop" status=$? - if test "$status" -ne 0 && test ! -d "$gentop"; then + if test $status -ne 0 && test ! -d "$gentop"; then exit $status fi generated="$generated $gentop" @@ -3899,42 +3075,16 @@ EOF $show "${rm}r $xdir" $run ${rm}r "$xdir" - $show "$mkdir $xdir" - $run $mkdir "$xdir" + $show "mkdir $xdir" + $run mkdir "$xdir" status=$? - if test "$status" -ne 0 && test ! -d "$xdir"; then + if test $status -ne 0 && test ! -d "$xdir"; then exit $status fi - # We will extract separately just the conflicting names and we will no - # longer touch any unique names. It is faster to leave these extract - # automatically by $AR in one run. $show "(cd $xdir && $AR x $xabs)" $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? - if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then - : - else - $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 - $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 - $AR t "$xabs" | sort | uniq -cd | while read -r count name - do - i=1 - while test "$i" -le "$count" - do - # Put our $i before any first dot (extension) - # Never overwrite any file - name_to="$name" - while test "X$name_to" = "X$name" || test -f "$xdir/$name_to" - do - name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` - done - $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')" - $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $? - i=`expr $i + 1` - done - done - fi - reload_conv_objs="$reload_objs "`find $xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + reload_conv_objs="$reload_objs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` done fi fi @@ -3970,8 +3120,8 @@ EOF # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. - # $show "echo timestamp > $libobj" - # $run eval "echo timestamp > $libobj" || exit $? + $show "echo timestamp > $libobj" + $run eval "echo timestamp > $libobj" || exit $? exit 0 fi @@ -3987,6 +3137,20 @@ EOF $run eval "$cmd" || exit $? done IFS="$save_ifs" + else + # Just create a symlink. + $show $rm $libobj + $run $rm $libobj + xdir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$libobj"; then + xdir="." + else + xdir="$xdir" + fi + baseobj=`$echo "X$libobj" | $Xsed -e 's%^.*/%%'` + oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"` + $show "(cd $xdir && $LN_S $oldobj $baseobj)" + $run eval '(cd $xdir && $LN_S $oldobj $baseobj)' || exit $? fi if test -n "$gentop"; then @@ -3999,7 +3163,7 @@ EOF prog) case $host in - *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; + *cygwin*) output=`echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; esac if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 @@ -4021,19 +3185,16 @@ EOF # On Rhapsody replace the C library is the System framework compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + case $host in + *darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + ;; + esac ;; esac - case $host in - *darwin*) - # Don't allow lazy linking, it breaks C++ global constructors - if test "$tagname" = CXX ; then - compile_command="$compile_command ${wl}-bind_at_load" - finalize_command="$finalize_command ${wl}-bind_at_load" - fi - ;; - esac - compile_command="$compile_command $compile_deplibs" finalize_command="$finalize_command $finalize_deplibs" @@ -4184,12 +3345,12 @@ extern \"C\" { done if test -n "$exclude_expsyms"; then - $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + $run eval 'egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' $run eval '$mv "$nlist"T "$nlist"' fi if test -n "$export_symbols_regex"; then - $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + $run eval 'egrep -e "$export_symbols_regex" "$nlist" > "$nlist"T' $run eval '$mv "$nlist"T "$nlist"' fi @@ -4207,8 +3368,8 @@ extern \"C\" { for arg in $dlprefiles; do $show "extracting global C symbols from \`$arg'" - name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` - $run eval '$echo ": $name " >> "$nlist"' + name=`echo "$arg" | ${SED} -e 's%^.*/%%'` + $run eval 'echo ": $name " >> "$nlist"' $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" done @@ -4217,7 +3378,7 @@ extern \"C\" { test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then - $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $mv "$nlist"T "$nlist" fi @@ -4237,7 +3398,7 @@ extern \"C\" { if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' else - $echo '/* NONE */' >> "$output_objdir/$dlsyms" + echo '/* NONE */' >> "$output_objdir/$dlsyms" fi $echo >> "$output_objdir/$dlsyms" "\ @@ -4289,18 +3450,18 @@ static const void *lt_preloaded_setup() { *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) case "$compile_command " in *" -static "*) ;; - *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; + *) pic_flag_for_symtable=" $pic_flag -DPIC -DFREEBSD_WORKAROUND";; esac;; *-*-hpux*) case "$compile_command " in *" -static "*) ;; - *) pic_flag_for_symtable=" $pic_flag";; + *) pic_flag_for_symtable=" $pic_flag -DPIC";; esac esac # Now compile the dynamic symbol file. - $show "(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" - $run eval '(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + $show "(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? # Clean up the generated files. $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" @@ -4325,7 +3486,7 @@ static const void *lt_preloaded_setup() { finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` fi - if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + if test $need_relink = no || test "$build_libtool_libs" != yes; then # Replace the output file specification. compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" @@ -4470,228 +3631,13 @@ static const void *lt_preloaded_setup() { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in - *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; + *.exe) output=`echo $output|${SED} 's,.exe$,,'` ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in - *cygwin*) - exeext=.exe - outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; + *cygwin*) exeext=.exe ;; *) exeext= ;; esac - case $host in - *cygwin* | *mingw* ) - cwrappersource=`$echo ${objdir}/lt-${output}.c` - cwrapper=`$echo ${output}.exe` - $rm $cwrappersource $cwrapper - trap "$rm $cwrappersource $cwrapper; exit 1" 1 2 15 - - cat > $cwrappersource <> $cwrappersource<<"EOF" -#include -#include -#include -#include -#include -#include - -#if defined(PATH_MAX) -# define LT_PATHMAX PATH_MAX -#elif defined(MAXPATHLEN) -# define LT_PATHMAX MAXPATHLEN -#else -# define LT_PATHMAX 1024 -#endif - -#ifndef DIR_SEPARATOR -#define DIR_SEPARATOR '/' -#endif - -#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ - defined (__OS2__) -#define HAVE_DOS_BASED_FILE_SYSTEM -#ifndef DIR_SEPARATOR_2 -#define DIR_SEPARATOR_2 '\\' -#endif -#endif - -#ifndef DIR_SEPARATOR_2 -# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) -#else /* DIR_SEPARATOR_2 */ -# define IS_DIR_SEPARATOR(ch) \ - (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) -#endif /* DIR_SEPARATOR_2 */ - -#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) -#define XFREE(stale) do { \ - if (stale) { free ((void *) stale); stale = 0; } \ -} while (0) - -const char *program_name = NULL; - -void * xmalloc (size_t num); -char * xstrdup (const char *string); -char * basename (const char *name); -char * fnqualify(const char *path); -char * strendzap(char *str, const char *pat); -void lt_fatal (const char *message, ...); - -int -main (int argc, char *argv[]) -{ - char **newargz; - int i; - - program_name = (char *) xstrdup ((char *) basename (argv[0])); - newargz = XMALLOC(char *, argc+2); -EOF - - cat >> $cwrappersource <> $cwrappersource <<"EOF" - newargz[1] = fnqualify(argv[0]); - /* we know the script has the same name, without the .exe */ - /* so make sure newargz[1] doesn't end in .exe */ - strendzap(newargz[1],".exe"); - for (i = 1; i < argc; i++) - newargz[i+1] = xstrdup(argv[i]); - newargz[argc+1] = NULL; -EOF - - cat >> $cwrappersource <> $cwrappersource <<"EOF" -} - -void * -xmalloc (size_t num) -{ - void * p = (void *) malloc (num); - if (!p) - lt_fatal ("Memory exhausted"); - - return p; -} - -char * -xstrdup (const char *string) -{ - return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL -; -} - -char * -basename (const char *name) -{ - const char *base; - -#if defined (HAVE_DOS_BASED_FILE_SYSTEM) - /* Skip over the disk name in MSDOS pathnames. */ - if (isalpha (name[0]) && name[1] == ':') - name += 2; -#endif - - for (base = name; *name; name++) - if (IS_DIR_SEPARATOR (*name)) - base = name + 1; - return (char *) base; -} - -char * -fnqualify(const char *path) -{ - size_t size; - char *p; - char tmp[LT_PATHMAX + 1]; - - assert(path != NULL); - - /* Is it qualified already? */ -#if defined (HAVE_DOS_BASED_FILE_SYSTEM) - if (isalpha (path[0]) && path[1] == ':') - return xstrdup (path); -#endif - if (IS_DIR_SEPARATOR (path[0])) - return xstrdup (path); - - /* prepend the current directory */ - /* doesn't handle '~' */ - if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal ("getcwd failed"); - size = strlen(tmp) + 1 + strlen(path) + 1; /* +2 for '/' and '\0' */ - p = XMALLOC(char, size); - sprintf(p, "%s%c%s", tmp, DIR_SEPARATOR, path); - return p; -} - -char * -strendzap(char *str, const char *pat) -{ - size_t len, patlen; - - assert(str != NULL); - assert(pat != NULL); - - len = strlen(str); - patlen = strlen(pat); - - if (patlen <= len) - { - str += len - patlen; - if (strcmp(str, pat) == 0) - *str = '\0'; - } - return str; -} - -static void -lt_error_core (int exit_status, const char * mode, - const char * message, va_list ap) -{ - fprintf (stderr, "%s: %s: ", program_name, mode); - vfprintf (stderr, message, ap); - fprintf (stderr, ".\n"); - - if (exit_status >= 0) - exit (exit_status); -} - -void -lt_fatal (const char *message, ...) -{ - va_list ap; - va_start (ap, message); - lt_error_core (EXIT_FAILURE, "FATAL", message, ap); - va_end (ap); -} -EOF - # we should really use a build-platform specific compiler - # here, but OTOH, the wrappers (shell script and this C one) - # are only useful if you want to execute the "real" binary. - # Since the "real" binary is built for $host, then this - # wrapper might as well be built for $host, too. - $run $LTCC -s -o $cwrapper $cwrappersource - ;; - esac $rm $output trap "$rm $output; exit 1" 1 2 15 @@ -4709,7 +3655,7 @@ EOF # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. -Xsed='${SED} -e 1s/^X//' +Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='$sed_quote_subst' # The HP-UX ksh and POSIX shell print the target directory to stdout @@ -4769,7 +3715,7 @@ else " if test "$fast_install" = yes; then - $echo >> $output "\ + echo >> $output "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" @@ -4785,7 +3731,7 @@ else $rm \"\$progdir/\$file\" fi" - $echo >> $output "\ + echo >> $output "\ # relink executable if necessary if test -n \"\$relink_command\"; then @@ -4803,13 +3749,13 @@ else $rm \"\$progdir/\$file\" fi" else - $echo >> $output "\ + echo >> $output "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi - $echo >> $output "\ + echo >> $output "\ if test -f \"\$progdir/\$program\"; then" @@ -4820,7 +3766,7 @@ else $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var - # The second colon is a workaround for a bug in BeOS R4 sed + # The second colon is a workaround for a bug in BeOS R4 ${SED} $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` export $shlibpath_var @@ -4840,6 +3786,14 @@ else # Run the actual program with our arguments. " case $host in + # win32 systems need to use the prog path for dll + # lookup to work + *-*-cygwin* | *-*-pw32*) + $echo >> $output "\ + exec \$progdir/\$program \${1+\"\$@\"} +" + ;; + # Backslashes separate directories on plain windows *-*-mingw | *-*-os2*) $echo >> $output "\ @@ -4849,7 +3803,11 @@ else *) $echo >> $output "\ - exec \$progdir/\$program \${1+\"\$@\"} + # Export the path to the program. + PATH=\"\$progdir:\$PATH\" + export PATH + + exec \$program \${1+\"\$@\"} " ;; esac @@ -4861,7 +3819,7 @@ else # The program doesn't exist. \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2 \$echo \"This script is just a wrapper for \$program.\" 1>&2 - $echo \"See the $PACKAGE documentation for more information.\" 1>&2 + echo \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ @@ -4884,7 +3842,7 @@ fi\ oldobjs="$libobjs_save" build_libtool_libs=no else - oldobjs="$old_deplibs $non_pic_objects" + oldobjs="$objs$old_deplibs "`$echo "X$libobjs_save" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP` fi addlibs="$old_convenience" fi @@ -4893,10 +3851,10 @@ fi\ gentop="$output_objdir/${outputname}x" $show "${rm}r $gentop" $run ${rm}r "$gentop" - $show "$mkdir $gentop" - $run $mkdir "$gentop" + $show "mkdir $gentop" + $run mkdir "$gentop" status=$? - if test "$status" -ne 0 && test ! -d "$gentop"; then + if test $status -ne 0 && test ! -d "$gentop"; then exit $status fi generated="$generated $gentop" @@ -4913,40 +3871,14 @@ fi\ $show "${rm}r $xdir" $run ${rm}r "$xdir" - $show "$mkdir $xdir" - $run $mkdir "$xdir" + $show "mkdir $xdir" + $run mkdir "$xdir" status=$? - if test "$status" -ne 0 && test ! -d "$xdir"; then + if test $status -ne 0 && test ! -d "$xdir"; then exit $status fi - # We will extract separately just the conflicting names and we will no - # longer touch any unique names. It is faster to leave these extract - # automatically by $AR in one run. $show "(cd $xdir && $AR x $xabs)" $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? - if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then - : - else - $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 - $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 - $AR t "$xabs" | sort | uniq -cd | while read -r count name - do - i=1 - while test "$i" -le "$count" - do - # Put our $i before any first dot (extension) - # Never overwrite any file - name_to="$name" - while test "X$name_to" = "X$name" || test -f "$xdir/$name_to" - do - name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` - done - $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')" - $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $? - i=`expr $i + 1` - done - done - fi oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP` done @@ -4956,65 +3888,25 @@ fi\ if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then eval cmds=\"$old_archive_from_new_cmds\" else - eval cmds=\"$old_archive_cmds\" - - if len=`expr "X$cmds" : ".*"` && - test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then - : - else - # the command line is too long to link in one step, link in parts - $echo "using piecewise archive linking..." - save_RANLIB=$RANLIB - RANLIB=: - objlist= - concat_cmds= - save_oldobjs=$oldobjs - # GNU ar 2.10+ was changed to match POSIX; thus no paths are - # encoded into archives. This makes 'ar r' malfunction in - # this piecewise linking case whenever conflicting object - # names appear in distinct ar calls; check, warn and compensate. - if (for obj in $save_oldobjs - do - $echo "X$obj" | $Xsed -e 's%^.*/%%' - done | sort | sort -uc >/dev/null 2>&1); then - : - else - $echo "$modename: warning: object name conflicts; overriding AR_FLAGS to 'cq'" 1>&2 - $echo "$modename: warning: to ensure that POSIX-compatible ar will work" 1>&2 - AR_FLAGS=cq - fi - # Is there a better way of finding the last object in the list? - for obj in $save_oldobjs - do - last_oldobj=$obj - done - for obj in $save_oldobjs - do - oldobjs="$objlist $obj" - objlist="$objlist $obj" - eval test_cmds=\"$old_archive_cmds\" - if len=`expr "X$test_cmds" : ".*"` && - test "$len" -le "$max_cmd_len"; then - : + # Ensure that we have .o objects in place in case we decided + # not to build a shared library, and have fallen back to building + # static libs even though --disable-static was passed! + for oldobj in $oldobjs; do + if test ! -f $oldobj; then + xdir=`$echo "X$oldobj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$oldobj"; then + xdir="." else - # the above command should be used before it gets too long - oldobjs=$objlist - if test "$obj" = "$last_oldobj" ; then - RANLIB=$save_RANLIB - fi - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" - objlist= + xdir="$xdir" fi - done - RANLIB=$save_RANLIB - oldobjs=$objlist - if test "X$oldobjs" = "X" ; then - eval cmds=\"\$concat_cmds\" - else - eval cmds=\"\$concat_cmds~$old_archive_cmds\" + baseobj=`$echo "X$oldobj" | $Xsed -e 's%^.*/%%'` + obj=`$echo "X$baseobj" | $Xsed -e "$o2lo"` + $show "(cd $xdir && ${LN_S} $obj $baseobj)" + $run eval '(cd $xdir && ${LN_S} $obj $baseobj)' || exit $? fi - fi + done + + eval cmds=\"$old_archive_cmds\" fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do @@ -5049,7 +3941,7 @@ fi\ fi done # Quote the link command for shipping. - relink_command="(cd `pwd`; $SHELL $0 --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command="(cd `pwd`; $SHELL $0 --mode=relink $libtool_args)" relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` # Only create the output if not a dry run. @@ -5104,7 +3996,7 @@ fi\ # place dlname in correct position for cygwin tdlname=$dlname case $host,$output,$installed,$module,$dlname in - *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + *cygwin*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; esac $echo > $output "\ # $outputname - a libtool library file @@ -5133,16 +4025,13 @@ revision=$revision # Is this an already installed library? installed=$installed -# Should we warn about portability when linking against -modules? -shouldnotlink=$module - # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" - if test "$installed" = no && test "$need_relink" = yes; then + if test "$installed" = no && test $need_relink = yes; then $echo >> $output "\ relink_command=\"$relink_command\"" fi @@ -5278,7 +4167,7 @@ relink_command=\"$relink_command\"" # Not a directory, so check to see that there is only one file specified. set dummy $files - if test "$#" -gt 2; then + if test $# -gt 2; then $echo "$modename: \`$dest' is not a directory" 1>&2 $echo "$help" 1>&2 exit 1 @@ -5318,7 +4207,7 @@ relink_command=\"$relink_command\"" *.la) # Check to see that this really is a libtool archive. - if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + if (${SED} -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 $echo "$help" 1>&2 @@ -5353,33 +4242,12 @@ relink_command=\"$relink_command\"" dir="$dir$objdir" if test -n "$relink_command"; then - # Determine the prefix the user has applied to our future dir. - inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"` - - # Don't allow the user to place us outside of our expected - # location b/c this prevents finding dependent libraries that - # are installed to the same prefix. - # At present, this check doesn't affect windows .dll's that - # are installed into $libdir/../bin (currently, that works fine) - # but it's something to keep an eye on. - if test "$inst_prefix_dir" = "$destdir"; then - $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 - exit 1 - fi - - if test -n "$inst_prefix_dir"; then - # Stick the inst_prefix_dir data into the link command. - relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` - else - relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"` - fi - $echo "$modename: warning: relinking \`$file'" 1>&2 $show "$relink_command" if $run eval "$relink_command"; then : else $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 - exit 1 + continue fi fi @@ -5401,7 +4269,7 @@ relink_command=\"$relink_command\"" $run eval "$striplib $destdir/$realname" || exit $? fi - if test "$#" -gt 0; then + if test $# -gt 0; then # Delete the old symlinks, and create new ones. for linkname do @@ -5487,43 +4355,23 @@ relink_command=\"$relink_command\"" destfile="$destdir/$destfile" fi - # If the file is missing, and there is a .exe on the end, strip it - # because it is most likely a libtool script we actually want to - # install - stripped_ext="" - case $file in - *.exe) - if test ! -f "$file"; then - file=`$echo $file|${SED} 's,.exe$,,'` - stripped_ext=".exe" - fi - ;; - esac - # Do a test to see if this is really a libtool program. case $host in *cygwin*|*mingw*) - wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` + wrapper=`echo $file | ${SED} -e 's,.exe$,,'` ;; *) wrapper=$file ;; esac - if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then + if (${SED} -e '4q' $wrapper | egrep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then notinst_deplibs= relink_command= - # To insure that "foo" is sourced, and not "foo.exe", - # finese the cygwin/MSYS system by explicitly sourcing "foo." - # which disallows the automatic-append-.exe behavior. - case $build in - *cygwin* | *mingw*) wrapperdot=${wrapper}. ;; - *) wrapperdot=${wrapper} ;; - esac # If there is no directory component, then add one. case $file in - */* | *\\*) . ${wrapperdot} ;; - *) . ./${wrapperdot} ;; + */* | *\\*) . $wrapper ;; + *) . ./$wrapper ;; esac # Check the variables that should have been set. @@ -5551,17 +4399,10 @@ relink_command=\"$relink_command\"" done relink_command= - # To insure that "foo" is sourced, and not "foo.exe", - # finese the cygwin/MSYS system by explicitly sourcing "foo." - # which disallows the automatic-append-.exe behavior. - case $build in - *cygwin* | *mingw*) wrapperdot=${wrapper}. ;; - *) wrapperdot=${wrapper} ;; - esac # If there is no directory component, then add one. case $file in - */* | *\\*) . ${wrapperdot} ;; - *) . ./${wrapperdot} ;; + */* | *\\*) . $wrapper ;; + *) . ./$wrapper ;; esac outputname= @@ -5575,7 +4416,7 @@ relink_command=\"$relink_command\"" $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2 continue fi - file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` + file=`$echo "X$file" | $Xsed -e 's%^.*/%%'` outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` @@ -5593,14 +4434,14 @@ relink_command=\"$relink_command\"" fi else # Install the binary that we compiled earlier. - file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + file=`$echo "X$file" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyways case $install_prog,$host in - */usr/bin/install*,*cygwin*) + /usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok @@ -5609,7 +4450,7 @@ relink_command=\"$relink_command\"" destfile=$destfile.exe ;; *:*.exe) - destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` + destfile=`echo $destfile | ${SED} -e 's,.exe$,,'` ;; esac ;; @@ -5694,42 +4535,42 @@ relink_command=\"$relink_command\"" fi # Exit here if they wanted silent mode. - test "$show" = : && exit 0 + test "$show" = ":" && exit 0 - $echo "----------------------------------------------------------------------" - $echo "Libraries have been installed in:" + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" for libdir in $libdirs; do - $echo " $libdir" + echo " $libdir" done - $echo - $echo "If you ever happen to want to link against installed libraries" - $echo "in a given directory, LIBDIR, you must either use libtool, and" - $echo "specify the full pathname of the library, or use the \`-LLIBDIR'" - $echo "flag during linking and do at least one of the following:" + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then - $echo " - add LIBDIR to the \`$shlibpath_var' environment variable" - $echo " during execution" + echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + echo " during execution" fi if test -n "$runpath_var"; then - $echo " - add LIBDIR to the \`$runpath_var' environment variable" - $echo " during linking" + echo " - add LIBDIR to the \`$runpath_var' environment variable" + echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" - $echo " - use the \`$flag' linker flag" + echo " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then - $echo " - have your system administrator run these commands:$admincmds" + echo " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then - $echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi - $echo - $echo "See any operating system documentation about shared libraries for" - $echo "more information, such as the ld(1) and ld.so(8) manual pages." - $echo "----------------------------------------------------------------------" + echo + echo "See any operating system documentation about shared libraries for" + echo "more information, such as the ld(1) and ld.so(8) manual pages." + echo "----------------------------------------------------------------------" exit 0 ;; @@ -5757,7 +4598,7 @@ relink_command=\"$relink_command\"" case $file in *.la) # Check to see that this really is a libtool archive. - if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + if (${SED} -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 $echo "$help" 1>&2 @@ -5828,7 +4669,7 @@ relink_command=\"$relink_command\"" -*) ;; *) # Do a test to see if this is really a libtool program. - if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + if (${SED} -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; @@ -5851,7 +4692,7 @@ relink_command=\"$relink_command\"" eval "export $shlibpath_var" fi - # Restore saved environment variables + # Restore saved enviroment variables if test "${save_LC_ALL+set}" = set; then LC_ALL="$save_LC_ALL"; export LC_ALL fi @@ -5901,20 +4742,19 @@ relink_command=\"$relink_command\"" rmdirs= - origobjdir="$objdir" for file in $files; do dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` if test "X$dir" = "X$file"; then dir=. - objdir="$origobjdir" + objdir="$objdir" else - objdir="$dir/$origobjdir" + objdir="$dir/$objdir" fi name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - test "$mode" = uninstall && objdir="$dir" + test $mode = uninstall && objdir="$dir" # Remember objdir for removal later, being careful to avoid duplicates - if test "$mode" = clean; then + if test $mode = clean; then case " $rmdirs " in *" $objdir "*) ;; *) rmdirs="$rmdirs $objdir" ;; @@ -5938,7 +4778,7 @@ relink_command=\"$relink_command\"" case $name in *.la) # Possibly a libtool archive, so verify it. - if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + if (${SED} -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then . $dir/$name # Delete the libtool libraries and symlinks. @@ -5946,9 +4786,9 @@ relink_command=\"$relink_command\"" rmfiles="$rmfiles $objdir/$n" done test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" - test "$mode" = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + test $mode = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" - if test "$mode" = uninstall; then + if test $mode = uninstall; then if test -n "$library_names"; then # Do each command in the postuninstall commands. eval cmds=\"$postuninstall_cmds\" @@ -5957,7 +4797,7 @@ relink_command=\"$relink_command\"" IFS="$save_ifs" $show "$cmd" $run eval "$cmd" - if test "$?" -ne 0 && test "$rmforce" != yes; then + if test $? != 0 && test "$rmforce" != yes; then exit_status=1 fi done @@ -5972,7 +4812,7 @@ relink_command=\"$relink_command\"" IFS="$save_ifs" $show "$cmd" $run eval "$cmd" - if test "$?" -ne 0 && test "$rmforce" != yes; then + if test $? != 0 && test "$rmforce" != yes; then exit_status=1 fi done @@ -5984,52 +4824,22 @@ relink_command=\"$relink_command\"" ;; *.lo) - # Possibly a libtool object, so verify it. - if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - - # Read the .lo file - . $dir/$name - - # Add PIC object to the list of files to remove. - if test -n "$pic_object" \ - && test "$pic_object" != none; then - rmfiles="$rmfiles $dir/$pic_object" - fi - - # Add non-PIC object to the list of files to remove. - if test -n "$non_pic_object" \ - && test "$non_pic_object" != none; then - rmfiles="$rmfiles $dir/$non_pic_object" - fi + if test "$build_old_libs" = yes; then + oldobj=`$echo "X$name" | $Xsed -e "$lo2o"` + rmfiles="$rmfiles $dir/$oldobj" fi ;; *) - if test "$mode" = clean ; then - noexename=$name - case $file in - *.exe) - file=`$echo $file|${SED} 's,.exe$,,'` - noexename=`$echo $name|${SED} 's,.exe$,,'` - # $file with .exe has already been added to rmfiles, - # add $file without .exe - rmfiles="$rmfiles $file" - ;; - esac - # Do a test to see if this is a libtool program. - if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - relink_command= - . $dir/$noexename + # Do a test to see if this is a libtool program. + if test $mode = clean && + (${SED} -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + relink_command= + . $dir/$file - # note $name still contains .exe if it was in $file originally - # as does the version of $file that was added into $rmfiles - rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" - if test "$fast_install" = yes && test -n "$relink_command"; then - rmfiles="$rmfiles $objdir/lt-$name" - fi - if test "X$noexename" != "X$name" ; then - rmfiles="$rmfiles $objdir/lt-${noexename}.c" - fi + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" fi fi ;; @@ -6037,7 +4847,6 @@ relink_command=\"$relink_command\"" $show "$rm $rmfiles" $run $rm $rmfiles || exit_status=1 done - objdir="$origobjdir" # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do @@ -6085,7 +4894,6 @@ Provide generalized library-building support services. --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] --quiet same as \`--silent' --silent don't print informational messages - --tag=TAG use configuration variables from tag TAG --version print version information MODE must be one of the following: @@ -6099,9 +4907,7 @@ MODE must be one of the following: uninstall remove libraries from an installed directory MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for -a more detailed description of MODE. - -Report bugs to ." +a more detailed description of MODE." exit 0 ;; @@ -6213,7 +5019,6 @@ The following components of LINK-COMMAND are treated specially: -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects - -objectlist FILE Use a list of object files found in FILE to specify objects -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries @@ -6259,31 +5064,11 @@ Otherwise, only FILE itself is deleted using RM." ;; esac -$echo +echo $echo "Try \`$modename --help' for more information about other modes." exit 0 -# The TAGs below are defined such that we never get into a situation -# in which we disable both kinds of libraries. Given conflicting -# choices, we go for a static library, that is the most portable, -# since we can't tell whether shared libraries were disabled because -# the user asked for that or because the platform doesn't support -# them. This is particularly important on AIX, because we don't -# support having both static and shared libraries enabled at the same -# time on that platform, so we default to a shared-only configuration. -# If a disable-shared tag is given, we'll fallback to a static-only -# configuration. But we'll never go from static-only to shared-only. - -# ### BEGIN LIBTOOL TAG CONFIG: disable-shared -build_libtool_libs=no -build_old_libs=yes -# ### END LIBTOOL TAG CONFIG: disable-shared - -# ### BEGIN LIBTOOL TAG CONFIG: disable-static -build_old_libs=`case $build_libtool_libs in yes) $echo no;; *) $echo yes;; esac` -# ### END LIBTOOL TAG CONFIG: disable-static - # Local Variables: # mode:shell-script # sh-indentation:2 diff --git a/reactos/lib/freetype/builds/unix/mkinstalldirs b/reactos/lib/freetype/builds/unix/mkinstalldirs index a55cff67069..d2d5f21b611 100644 --- a/reactos/lib/freetype/builds/unix/mkinstalldirs +++ b/reactos/lib/freetype/builds/unix/mkinstalldirs @@ -1,26 +1,20 @@ #! /bin/sh # mkinstalldirs --- make directory hierarchy -# Original author: Noah Friedman +# Author: Noah Friedman # Created: 1993-05-16 -# Public domain. - -scriptversion=2003-09-26.19 +# Public domain errstatus=0 dirmode="" usage="\ -Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... - -Create each directory DIR (with mode MODE, if specified), including all -leading file name components. -" +Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help - echo "$usage" + echo "$usage" 1>&2 exit 0 ;; -m) # -m PERM arg @@ -29,10 +23,6 @@ while test $# -gt 0 ; do dirmode=$1 shift ;; - --version) - echo "$0 $scriptversion" - exit 0 - ;; --) # stop option processing shift break @@ -65,25 +55,12 @@ case $dirmode in if mkdir -p -- . 2>/dev/null; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" - else - # On NextStep and OpenStep, the `mkdir' command does not - # recognize any option. It will interpret all options as - # directories to create, and then abort because `.' already - # exists. - test -d ./-p && rmdir ./-p - test -d ./-- && rmdir ./-- fi ;; *) if mkdir -m "$dirmode" -p -- . 2>/dev/null; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" - else - # Clean up after NextStep and OpenStep mkdir. - for d in ./-m ./-p ./-- "./$dirmode"; - do - test -d $d && rmdir $d - done fi ;; esac @@ -107,17 +84,17 @@ do mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then - errstatus=$lasterr + errstatus=$lasterr else - if test ! -z "$dirmode"; then + if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" - lasterr="" - chmod "$dirmode" "$pathcomp" || lasterr=$? + lasterr="" + chmod "$dirmode" "$pathcomp" || lasterr=$? - if test ! -z "$lasterr"; then - errstatus=$lasterr - fi - fi + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi fi fi @@ -130,8 +107,5 @@ exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-end: "$" # End: +# mkinstalldirs ends here diff --git a/reactos/lib/freetype/builds/unix/unix-cc.in b/reactos/lib/freetype/builds/unix/unix-cc.in index 2d1f17e5f5f..50df267842b 100644 --- a/reactos/lib/freetype/builds/unix/unix-cc.in +++ b/reactos/lib/freetype/builds/unix/unix-cc.in @@ -70,10 +70,7 @@ T := -o$(space) # Use the ANSIFLAGS variable to define the compiler flags used to enfore # ANSI compliance. # -# We use our own FreeType configuration file. -# -CFLAGS := -c @XX_CFLAGS@ @CPPFLAGS@ @CFLAGS@ \ - -DFT_CONFIG_CONFIG_H="" +CFLAGS := -c @XX_CFLAGS@ @CPPFLAGS@ @CFLAGS@ # ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. # diff --git a/reactos/lib/freetype/builds/vms/ftconfig.h b/reactos/lib/freetype/builds/vms/ftconfig.h index 795e757dadd..3174ffeab95 100644 --- a/reactos/lib/freetype/builds/vms/ftconfig.h +++ b/reactos/lib/freetype/builds/vms/ftconfig.h @@ -4,7 +4,7 @@ /* */ /* VMS-specific configuration file (specification only). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -34,8 +34,8 @@ /*************************************************************************/ -#ifndef __FTCONFIG_H__ -#define __FTCONFIG_H__ +#ifndef FTCONFIG_H +#define FTCONFIG_H /* Include the header file containing all developer build options */ @@ -43,7 +43,6 @@ #include FT_CONFIG_OPTIONS_H #include FT_CONFIG_STANDARD_LIBRARY_H - FT_BEGIN_HEADER /*************************************************************************/ @@ -90,19 +89,6 @@ FT_BEGIN_HEADER /*************************************************************************/ - /*************************************************************************/ - /* */ - /* Mac support */ - /* */ - /* This is the only necessary change, so it is defined here instead */ - /* providing a new configuration file. */ - /* */ -#if ( defined( __APPLE__ ) && !defined( DARWIN_NO_CARBON ) ) || \ - ( defined( __MWERKS__ ) && defined( macintosh ) ) -#define FT_MACINTOSH 1 -#endif - - /*************************************************************************/ /* */ /* IntN types */ @@ -126,84 +112,32 @@ FT_BEGIN_HEADER #error "no 32bit type found -- please check your configuration files" #endif - /* look up an integer type that is at least 32 bits */ -#if FT_SIZEOF_INT >= 4 - - typedef int FT_Fast; - typedef unsigned int FT_UFast; - -#elif FT_SIZEOF_LONG >= 4 - - typedef long FT_Fast; - typedef unsigned long FT_UFast; - -#endif - - - /* determine whether we have a 64-bit int type for platforms without */ - /* Autoconf */ #if FT_SIZEOF_LONG == 8 /* FT_LONG64 must be defined if a 64-bit type is available */ #define FT_LONG64 -#define FT_INT64 long - -#elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ - - /* this compiler provides the __int64 type */ -#define FT_LONG64 -#define FT_INT64 __int64 - -#elif defined( __BORLANDC__ ) /* Borland C++ */ - - /* XXXX: We should probably check the value of __BORLANDC__ in order */ - /* to test the compiler version. */ - - /* this compiler provides the __int64 type */ -#define FT_LONG64 -#define FT_INT64 __int64 - -#elif defined( __WATCOMC__ ) /* Watcom C++ */ - - /* Watcom doesn't provide 64-bit data types */ - -#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */ - -#define FT_LONG64 -#define FT_INT64 long long int - -#elif defined( __GNUC__ ) - - /* GCC provides the "long long" type */ -#define FT_LONG64 -#define FT_INT64 long long int - -#endif /* FT_SIZEOF_LONG == 8 */ - - -#define FT_BEGIN_STMNT do { -#define FT_END_STMNT } while ( 0 ) -#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT +#define FT_INT64 long +#else /*************************************************************************/ /* */ - /* A 64-bit data type will create compilation problems if you compile */ - /* in strict ANSI mode. To avoid them, we disable their use if */ - /* __STDC__ is defined. You can however ignore this rule by */ - /* defining the FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */ + /* Many compilers provide the non-ANSI `long long' 64-bit type. You can */ + /* activate it by defining the FTCALC_USE_LONG_LONG macro in */ + /* `ftoption.h'. */ /* */ -#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 ) + /* Note that this will produce many -ansi warnings during library */ + /* compilation, and that in many cases, the generated code will be */ + /* neither smaller nor faster! */ + /* */ +#ifdef FTCALC_USE_LONG_LONG -#ifdef __STDC__ +#define FT_LONG64 +#define FT_INT64 long long - /* undefine the 64-bit macros in strict ANSI compilation mode */ -#undef FT_LONG64 -#undef FT_INT64 +#endif /* FTCALC_USE_LONG_LONG */ -#endif /* __STDC__ */ - -#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */ +#endif /* FT_SIZEOF_LONG == 8 */ #ifdef FT_MAKE_OPTION_SINGLE_OBJECT @@ -223,7 +157,6 @@ FT_BEGIN_HEADER #endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ - #ifndef FT_BASE #ifdef __cplusplus @@ -234,16 +167,15 @@ FT_BEGIN_HEADER #endif /* !FT_BASE */ - -#ifndef FT_BASE_DEF +#ifndef BASE_DEF #ifdef __cplusplus -#define FT_BASE_DEF( x ) extern "C" x +#define BASE_DEF( x ) extern "C" x #else -#define FT_BASE_DEF( x ) extern x +#define BASE_DEF( x ) extern x #endif -#endif /* !FT_BASE_DEF */ +#endif /* !BASE_DEF */ #ifndef FT_EXPORT @@ -256,7 +188,6 @@ FT_BEGIN_HEADER #endif /* !FT_EXPORT */ - #ifndef FT_EXPORT_DEF #ifdef __cplusplus @@ -278,9 +209,6 @@ FT_BEGIN_HEADER #endif /* !FT_EXPORT_VAR */ - /* The following macros are needed to compile the library with a */ - /* C++ compiler and with 16bit compilers. */ - /* */ /* This is special. Within C++, you must specify `extern "C"' for */ /* functions which are used via function pointers, and you also */ @@ -288,42 +216,23 @@ FT_BEGIN_HEADER /* assure C linkage -- it's not possible to have (local) anonymous */ /* functions which are accessed by (global) function pointers. */ /* */ - /* */ - /* FT_CALLBACK_DEF is used to _define_ a callback function. */ - /* */ - /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */ - /* contains pointers to callback functions. */ - /* */ - /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */ - /* that contains pointers to callback functions. */ - /* */ - /* */ - /* Some 16bit compilers have to redefine these macros to insert */ - /* the infamous `_cdecl' or `__fastcall' declarations. */ - /* */ -#ifndef FT_CALLBACK_DEF #ifdef __cplusplus -#define FT_CALLBACK_DEF( x ) extern "C" x -#else -#define FT_CALLBACK_DEF( x ) static x -#endif -#endif /* FT_CALLBACK_DEF */ -#ifndef FT_CALLBACK_TABLE -#ifdef __cplusplus -#define FT_CALLBACK_TABLE extern "C" -#define FT_CALLBACK_TABLE_DEF extern "C" -#else -#define FT_CALLBACK_TABLE extern -#define FT_CALLBACK_TABLE_DEF /* nothing */ -#endif -#endif /* FT_CALLBACK_TABLE */ +#define FT_CALLBACK_DEF( x ) extern "C" x +#define FT_CALLBACK_TABLE extern "C" +#define FT_CALLBACK_TABLE_DEF extern "C" +#else + +#define FT_CALLBACK_DEF( x ) static x +#define FT_CALLBACK_TABLE extern +#define FT_CALLBACK_TABLE_DEF + +#endif /* __cplusplus */ FT_END_HEADER - -#endif /* __FTCONFIG_H__ */ +#endif /* FTCONFIG_H */ /* END */ diff --git a/reactos/lib/freetype/builds/win32/visualc/index.html b/reactos/lib/freetype/builds/win32/visualc/index.html index f17246a1103..d491c5a5d50 100644 --- a/reactos/lib/freetype/builds/win32/visualc/index.html +++ b/reactos/lib/freetype/builds/win32/visualc/index.html @@ -19,15 +19,6 @@ -

Be sure to extract the files with the Windows (CR+LF) line endings. -ZIP archives are already stored this way, so no further step is required. -If you use some .tar.*z archives, be sure to configure your extracting -tool to convert the line endings. For example, with -WinZip, you should set the "TAR file -smart CR/LF Conversion" option on. Alternatively, you may consider using -the "unix2dos" or "u2d" utilities that are floating around, which -specifically deal with this particular problem. -

Build directories are placed in the top-level "objs" directory

Enjoy :-)

diff --git a/reactos/lib/freetype/devel/ft2build.h b/reactos/lib/freetype/devel/ft2build.h index 242ac1e85e5..ff0e0031aae 100644 --- a/reactos/lib/freetype/devel/ft2build.h +++ b/reactos/lib/freetype/devel/ft2build.h @@ -28,14 +28,14 @@ * "ftoption.h"), then invoke Jam as usual. */ -#ifndef __FT2_BUILD_DEVEL_H__ -#define __FT2_BUILD_DEVEL_H__ +#ifndef __FT2_BUILD_GENERIC_H__ +#define __FT2_BUILD_GENERIC_H__ #define FT_CONFIG_OPTIONS_H #include -#endif /* __FT2_BUILD_DEVEL_H__ */ +#endif /* __FT2_BUILD_GENERIC_H__ */ /* END */ diff --git a/reactos/lib/freetype/devel/ftoption.h b/reactos/lib/freetype/devel/ftoption.h index 3ba11bfae0d..3d806c9926b 100644 --- a/reactos/lib/freetype/devel/ftoption.h +++ b/reactos/lib/freetype/devel/ftoption.h @@ -296,7 +296,7 @@ FT_BEGIN_HEADER /* Do not #undef this macro here since the build system might define */ /* it for certain configurations only. */ /* */ -#define FT_DEBUG_MEMORY +/* #define FT_DEBUG_MEMORY */ /*************************************************************************/ diff --git a/reactos/lib/freetype/docs/CHANGES b/reactos/lib/freetype/docs/CHANGES index ddcc31e6bbe..42afa8b0071 100644 --- a/reactos/lib/freetype/docs/CHANGES +++ b/reactos/lib/freetype/docs/CHANGES @@ -1,528 +1,316 @@ -LATEST CHANGES BETWEEN 2.1.8 and 2.1.7 - - I. IMPORTANT BUG FIXES - - - The native TrueType hinter contained some bugs which prevented - some fonts to be rendered correctly, most notably Legendum.otf. - - - The linear advance width and height values were incorrectly - rounded, making them virtually unusable if not loaded with - FT_LOAD_LINEAR_DESIGN. - - - Indexing CID-keyed CFF fonts is now working: The glyph index is - correctly treated as a CID, similar to FreeType's CID driver - module. Note that CID CMaps support is still missing. - - - The FT_FACE_FLAGS_GLYPH_NAMES is now set correctly for all font - formats. - - - Some subsetted Type 1 fonts weren't parsed correctly. This bug - has been introduced in 2.1.7. - - - The WinFNT driver now correctly reports FT_ENCODING_NONE for all - but one encoding. Use the new FT_WinFNT_ID_XXX values together - with FT_Get_WinFNT_Header() to get the WinFNT charset ID. - - - The descender metrics (face->size->metrics.descender) for WinFNT - bitmap fonts had the wrong sign. - - - The (emulated) seac support for CFF fonts was broken. - - - The flex operator didn't work for CFF fonts. - - - II. IMPORTANT CHANGES - - - Both PCF and BDF drivers now handle the SETWIDTH_NAME and - ADD_STYLE_NAME properties. Values are appended to - face->style_name; example: `Bold SemiCondensed'. - - - A new API function `FT_Get_CMap_Language_ID' (declared in - `tttables.h') is available to get the language ID of a - TrueType/SFNT cmap. - - - The hexadecimal format of data after the `StartData' command in - CID-keyed Type 1 fonts is now supported. While this can't occur - in file-based fonts, it can happen in document-embedded - resources of PostScript documents. - - - The cache sub-system has been rewritten. - - - There is now support for deinstallation of faces. - - - A new API function `FTC_Manager_RemoveFaceID' has been added - to delete all `idle' nodes that correspond to a given - FTC_FaceID. All `locked' nodes (i.e., those with a reference - count > 0), will be modified to prevent them from appearing in - further lookups (they will be cleaned normally when their - reference count reaches 0). - - - There is now support for point scaling (i.e., providing - character sizes in points + dpis, instead of pixels). - - - Three abstract cache classes are now available: - - FTC_GCache: Used to store one glyph item per cache node, - with the ability to group common attributes into - `families'. This replaces the old - FTC_GlyphCache class. - - FTC_ICache: Used to store one FT_Glyph per cache node. This - extends FTC_GCache. Family definition, family - comparison, and glyph loading are however left - to sub-classes. - - FTC_SCache: Used to store up to 16 small bitmaps per cache - node. This extends FTC_GCache. Family - definition, family comparison and glyph loading - are however left to sub-classes. - - - The file `src/cache/ftcbasic.c' implements: - - FTC_ImageCache: Extends FTC_ICache; implements family - definitions and glyph loading similar to the - old API. - - FTC_SBitCache: Extends FTC_SCache, implements family - definitions and glyph loading similar to the - old API - - Client applications should be able to extend FTC_GCache, - FTC_ICache, or FTC_SCache much more easily (i.e., less code to - write, and less callbacks). For example, one could envision - caches that are capable of storing transformed (obliqued), - stroked, emboldened, or colored glyph images. Use - `ftcbasic.c' as an example. - - - All public APIs are now in `include/freetype/ftcache.h', (to - be accessed as `FT_CACHE_H'). The contents of - `include/freetype/cache/' is only needed by applications that - wish to implement their own caches. - - - There were some major performance improvements through the use - of various programming tricks. Cache hits are up to 70% - faster than in the old code. - - - The FTC_CMapCache has been simplied. Charmaps can only be - accessed by index right now. There is also a new API named - `FT_Charmap_GetIndex' for this purpose. - - - The demo programs have been updated to the new code. The - previous versions will not work with the current one. - - - III. MISCELLANEOUS - - - Wolfgang Domr鰏e contributed support files for building FreeType - on the Atari using the PureC compiler. Note that the Atari is a - 16bit platform. - - -====================================================================== - -LATEST CHANGES BETWEEN 2.1.7 and 2.1.6 - - I. IMPORTANT BUG FIXES - - - Updated to newest libtool version, fixing build problems on - various platforms. - - - On Unix platforms, `make install' didn't copy the correct - `ftconfig.h' file. - - Note that version 2.1.7 contains the same library C source code as - version 2.1.6. - - -====================================================================== - -LATEST CHANGES BETWEEN 2.1.6 and 2.1.5 - - I. IMPORTANT BUG FIXES - - - The PFR font driver didn't load kerning tables correctly, and - the functions in FT_PFR_H didn't work at all. - - - Type 1 font files in binary format (PFB) with an end-of-file - indicator weren't accepted by the FreeType engine. - - - Fonts which contain /PaintType and /StrokeWidth no longer cause - a segfault. This bug has been introduced in version 2.1.5. - - - Fonts loaded with FT_LOAD_RENDER no longer cause strange - results. This bug has been introduced in version 2.1.5. - - - Some Windows (bitmap) FNT/FON files couldn't be handled - correctly. - - - II. IMPORTANT CHANGES - - - The internal module API has been heavily changed in favor of - massive simplifications within the font engine. This also means - that authors of third-party modules must adapt their code to the - new scheme. - - NOTE: THE NEW SCHEME IS NOT COMPLETED YET. PLEASE WAIT UNTIL A - FINAL ANNOUNCEMENT! - - - The PostScript parser has been enhanced to handle comments and - strings correctly. Additionally, more syntax forms are - recognized. - - - Added the optional unpatented hinting system for TrueType. It - allows typefaces which need hinting to produce correct glyph - forms (e.g., Chinese typefaces from Dynalab) to work acceptably - without infringing Apple patents. This system is compiled only - if TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING is defined in - ftoption.h (activated by default). - - - III. MISCELLANEOUS - - - There is now a guard in the public header files to protect - against inclusion of freetype.h from FreeType 1. - - - Direct inclusion of freetype.h and other public header files no - longer works. You have to use the documented scheme - - #include - #include FT_FREETYPE_H - - to load freetype.h with a symbolic name. This protects against - renaming of public header files (which shouldn't happen but - actually has, avoiding two public header files with the same - name). - - -====================================================================== - LATEST CHANGES BETWEEN 2.1.5 and 2.1.4 + I. IMPORTANT BUG FIXES - - Parsing the /CIDFontName field now removes the leading slash to + - Parsing the /CIDFontName field now removes the leading slash to be in sync with other font drivers. - - gzip support was buggy. Some fonts could not be read. + - gzip support was buggy. Some fonts could not be read. - - Fonts which have nested subglyphs more than one level deep no + - Fonts which have nested subglyphs more than one level deep no longer cause a segfault. - - Creation of synthetic cmaps for fonts in CFF format was broken + - Creation of synthetic cmaps for fonts in CFF format was broken partially. - - Numeric font dictionary entries for synthetic fonts are no - longer overwritten. + - Numeric font dictionary entries for synthetic fonts are no longer + overwritten. - - The font matrix wasn't applied to the advance width for Type1, - CID, and CFF fonts. This caused problems when loading certain - synthetic Type 1 fonts like `Helvetica Narrow'. + - The font matrix wasn't applied to the advance width for Type1, CID, + and CFF fonts. This caused problem when loading certain synthetic + Type 1 fonts like "Helvetica Narrow" - - The test for the charset registry in BDF and PCF fonts is now + - The test for the charset registry in BDF and PCF fonts is now case-insensitive. - - FT_Vector_Rotate sometimes returned strange values due to + - FT_Vector_Rotate rotating sometimes returned strange values due to rounding errors. - - The PCF driver now returns the correct number of glyphs - (including an artificial `notdef' glyph at index 0). + - The PCF driver now returns the correct number of glyphs (including + an artificial `notdef' glyph at index 0). - - FreeType now supports buggy CMaps which are contained in many - CJK fonts from Dynalab. + - FreeType now supports buggy CMaps which are contained in many CJK + fonts from Dynalab. - - Opening an invalid font on a Mac caused a segfault due to + - Opening an invalid font on a Mac caused a segfault due to double-freeing memory. - - BDF fonts with more than 32768 glyphs weren't supported - properly. + - BDF fonts with more than 32768 glyphs weren't supported properly. II. IMPORTANT CHANGES - Accessing bitmap font formats has been synchronized. To do that - the FT_Bitmap_Size structure has been extended to contain new + the FT_Bitmap_Size structure has been extended to contain new fields `size', `x_ppem', and `y_ppem'. - The FNT driver now returns multiple faces, not multiple strikes. - - The `psnames' module has been updated to the Adobe Glyph List + - The `psnames' module has been updated to the Adobe Glyph List version 2.0. - The `psnames' module now understands `uXXXX[X[X]]' glyph names. - The algorithm for guessing the font style has been improved. - - For fonts in SFNT format, root->height is no longer increased if - the line gap is zero. There exist fonts (containing e.g. form - drawing characters) which intentionally have a zero line gap - value. + - For fonts in sfnt format, root->height is no longer increased if + the line gap is zero. There exist fonts (containing e.g. form + drawing characters) which intentionally have a zero line gap value. - - ft_glyph_bbox_xxx flags are now deprecated in favour of + - ft_glyph_bbox_xxx flags are now deprecated in favour of FT_GLYPH_BBOX_XXX. - - ft_module_xxx flags are now deprecated in favour of - FT_MODULE_XXX. + - ft_module_xxx flags are now deprecated in favour of FT_MODULE_XXX. - - FT_ENCODING_MS_{SJIS,GB2312,BIG5,WANSUNG,JOHAB} are now - deprecated in favour of - FT_ENCODING_{SJIS,GB2312,GIB5,WANSONG,JOHAB} -- those encodings - are not specific to Microsoft. + - FT_ENCODING_MS_{SJIS,GB2312,BIG5,WANSUNG,JOHAB} are now deprecated + in favour of FT_ENCODING_{SJIS,GB2312,GIB5,WANSONG,JOHAB} -- those + encodings are not specific to Microsoft. III. MISCELLANEOUS - - The autohinter has been further improved; for example, `m' - glyphs now retain its vertical symmetry. + - The autohinter has been further improved; for example, `m' glyphs + now retain its vertical symmetry. - Partial support of Mac fonts on non-Mac platforms. - - `make refdoc' (after first `make') builds the HTML - documentation. You need Python for this. + - `make refdoc' (after first `make') builds the HTML documentation. + You need Python for this. - - The make build system should now work more reliably on DOS-like + - The make build system should now work more reliably on DOS-like platforms. - - Support for EMX gcc and Watson C/C++ compilers on MS-DOS has - been added. + - Support for EMX gcc and Watson C/C++ compilers on MS-DOS has been + added. - Better VMS build support. - - Support for the pkg-config package by providing a `freetype.pc' + - Support for the pkg-config package by providing a `freetype.pc' file. - New configure option --with-old-mac-fonts for Darwin. - - Some source files have been renamed (mainly to fit into the 8.3 + - Some source files have been renamed (mainly to fit into the 8.3 naming scheme). -====================================================================== +============================================================================== LATEST CHANGES BETWEEN 2.1.4 and 2.1.3 I. IMPORTANT BUG FIXES - - Updated to newest libtool version, fixing build problems on - various platforms. + - Updated to newest libtool version, fixing build problems on various + platforms. - - A fix in the Gzip stream reader: It couldn't read certain .gz - files properly due to a small typo. In certain cases, FreeType - could also loop endlessly when trying to load tiny gzipped - files. + - A fix in the Gzip stream reader: It couldn't read certain .gz files + properly due to a small typo. In certain cases, FreeType could also + loop endlessly when trying to load tiny gzipped files. - - The configure script now tries to use the system-wide zlib when - it finds one (instead of the copy found in src/gzip). And - "freetype-config" has been updated to return relevant flags in - this case when invoked with "--libs" (e.g. "-lzlib"). + - The configure script now tries to use the system-wide zlib when + it finds one (instead of the copy found in src/gzip). And + "freetype-config" has been updated to return relevant flags in this + case when invoked with "--libs" (e.g. "-lzlib"). - - Certain fonts couldn't be loaded by 2.1.3 because they lacked a - Unicode charmap (e.g. SYMBOL.TTF). FreeType erroneously - rejected them. + - Certain fonts couldn't be loaded by 2.1.3 because they lacked a + Unicode charmap (e.g. SYMBOL.TTF). FreeType erroneously rejected + them. - The CFF loader was modified to accept fonts which only contain a - subset of their reference charset. This prevented the correct - use of PDF-embedded fonts. + subset of their reference charset. This prevented the correct use + of PDF-embedded fonts. - The logic to detect Unicode charmaps has been modified. This is - required to support fonts which include both 16-bit and 32-bit - charmaps (like very recent asian ones) using the new 10 and 12 - SFNT formats. + required to support fonts which include both 16-bit and 32-bit + charmaps (like very recent asian ones) using the new 10 and 12 SFNT + formats. - - The TrueType loader now limits the depth of composite glyphs. - This is necessary to prevent broken fonts to break the engine by - blowing the stack with recursive glyph definitions. + - The TrueType loader now limits the depth of composite glyphs. This is + necessary to prevent broken fonts to break the engine by blowing the + stack with recursive glyph definitions. - - The CMap cache is now capable of managing UCS-4 character codes - that are mapped through extended charmaps in recent - TrueType/OpenType fonts. + - The CMap cache is now capable of managing UCS-4 character codes that + are mapped through extended charmaps in recent TrueType/OpenType + fonts. - - The cache sub-system now properly manages out-of-memory - conditions instead of blindly reporting them to the caller. - This means that it will try to empty the cache before restarting - its allocations to see if that can help. + - The cache sub-system now properly manages out-of-memory conditions + instead of blindly reporting them to the caller. This means that it + will try to empty the cache before restarting its allocations to see + if that can help. - - The PFR driver didn't return the list of available embedded - bitmaps properly. + - The PFR driver didn't return the list of available embedded bitmaps + properly. - - There was a nasty memory leak when using embedded bitmaps in - certain font formats. + - There was a nasty memory leak when using embedded bitmaps in certain + font formats. II. IMPORTANT CHANGES - - David Chester contributed some enhancements to the auto-hinter - that significantly increase the quality of its output. The - Postscript hinter was also improved in several ways. + - David Chester contributed some enhancements to the auto-hinter that + significantly increase the quality of its output. The Postscript + hinter was also improved in several ways. - The FT_RENDER_MODE_LIGHT render mode was implemented. - - A new API function called `FT_Get_BDF_Property' has been added - to FT_BDF_H to retrieve BDF properties from BDF _and_ PCF font - files. THIS IS STILL EXPERIMENTAL, since it hasn't been - properly tested yet. + - A new API function called `FT_Get_BDF_Property' has been added to + FT_BDF_H to retrieve BDF properties from BDF _and_ PCF font files. + THIS IS STILL EXPERIMENTAL, since it hasn't been properly tested yet. - A Windows FNT specific API has been added, mostly to access font headers. This is used by Wine. - - TrueType tables without an "hmtx" table are now tolerated when - an incremental interface is used. This happens for certain - Type42 fonts passed from Ghostscript to FreeType. + - TrueType tables without an "hmtx" table are now tolerated when an + incremental interface is used. This happens for certain Type42 fonts + passed from Ghostscript to FreeType. - - The PFR font driver is now capable of returning the font family - and style names when they are available (instead of the sole - "FontID"). This is performed by parsing an *undocumented* - portion of the font file! + - The PFR font driver is now capable of returning the font family and + style names when they are available (instead of the sole "FontID"). + This is performed by parsing an *undocumented* portion of the font + file! III. MISCELLANEOUS - - The path stroker in FT_STROKER_H has entered beta stage. It now - works very well, but its interface might change a bit in the - future. More on this in later releases. + - The path stroker in FT_STROKER_H has entered beta stage. It now works + very well, but its interface might change a bit in the future. More + on this in later releases. - - The documentation for FT_Size_Metrics didn't appear properly in - the API reference. + - The documentation for FT_Size_Metrics didn't appear properly in the + API reference. - The file docs/VERSION.DLL has been updated to explain versioning - with FreeType (i.e., comparing release/libtool/so numbers, and - how to use them in autoconf scripts). + with FreeType (i.e., comparing release/libtool/so numbers, and how to + use them in autoconf scripts). - - The installation documentation has been seriously revamped. + - The installation documentation has been seriously revamped. Everything is now in the "docs" directory. -====================================================================== +============================================================================== LATEST CHANGES BETWEEN 2.1.3 and 2.1.2 I. IMPORTANT BUG FIXES - - FT_Vector_Transform had been incorrectly modified in 2.1.2, - resulting in incorrect transformations being applied (for - example, rotations were processed in opposite angles). + - FT_Vector_Transform had been incorrectly modified in 2.1.2, resulting + in incorrect transformations being applied (for example, rotations + were processed in opposite angles). - - The format 8 and 12 TrueType charmap enumeration routines have - been fixed (FT_Get_Next_Char returned invalid values). + - The format 8 and 12 TrueType charmap enumeration routines have been + fixed (FT_Get_Next_Char returned invalid values). - - The PFR font driver returned incorrect advance widths if the - outline and metrics resolution defined in the font file were - different. + - The PFR font driver returned incorrect advance widths if the outline + and metrics resolution defined in the font file were different. - - FT_Glyph_To_Bitmap now returns successfully when called with an + - FT_Glyph_To_Bitmap now returns successfully when called with an FT_BitmapGlyph argument (it previously returned an error). - - A bug in the Type 1 loader that prevented valid font bounding - boxes to be loaded from multiple master fonts. + - A bug in the Type 1 loader that prevented valid font bounding boxes to + be loaded from multiple master fonts. - - The SFNT validation code has been rewritten. FreeType can now - load "broken" fonts that were usable on Windows, but not with - previous versions of the library. + - The SFNT validation code has been rewritten. FreeType can now load + "broken" fonts that were usable on Windows, but not with previous + versions of the library. - The computation of bearings in the BDF driver has been fixed. - - The Postscript hinter crashed when trying to hint certain glyphs - (more precisely, when trying to apply hints to an empty glyph - outline). + - The Postscript hinter crashed when trying to hint certain glyphs (more + precisely, when trying to apply hints to an empty glyph outline). - - The TrueType glyph loader now supports composites in "Apple - format" (they differ slightly from Microsoft/OpenType ones in - the way transformation offsets are computed). + - The TrueType glyph loader now supports composites in "Apple format" + (they differ slightly from Microsoft/OpenType ones in the way + transformation offsets are computed). - - FreeType was very slow at opening certain asian CID/CFF fonts, - due to fixed increment in dynamic array re-allocations. This - has been changed to exponential behaviour to get acceptable - performance. + - FreeType was very slow at opening certain asian CID/CFF fonts, due + to fixed increment in dynamic array re-allocations. This has been + changed to exponential behaviour to get acceptable performance. II. IMPORTANT CHANGES - - The PCF driver now supports gzip-compressed font files natively. - This means that you will be able to use all these bitmap fonts - that come with XFree86 with FreeType (and libXft/libXft2, by - extension). + - The PCF driver now supports gzip-compressed font files natively. This + means that you will be able to use all these bitmap fonts that come + with XFree86 with FreeType (and libXft/libXft2, by extension). - - The automatic and postscript hinters have both been updated. - This results in a relatively important increase of rendering - quality since many nasty defaults have been supressed. Please - visit the web page: + - The automatic and postscript hinters have both been updated. This + results in a relatively important increase of rendering quality since + many nasty defaults have been supressed. Please visit the web page: http://www.freetype.org/hinting/smooth-hinting.html for additional details on this topic. - - The "load_flags" parameter of FT_Load_Glyph is now an FT_Int32 - (instead of just being an FT_Int). This breaks source and - binary compatibility for 16bit systems only, while retaining - both of them for 32 and 64 bit ones. + - The "load_flags" parameter of FT_Load_Glyph is now an FT_Int32 + (instead of just being an FT_Int). This breaks source and binary + compatibility for 16bit systems only, while retaining both of them for + 32 and 64 bit ones. Some new flags have been added consequently: FT_LOAD_NO_AUTOHINT :: Disable the use of the auto-hinter (but not native format hinters). - FT_LOAD_TARGET_NORMAL :: Hint and render for normal - anti-aliased displays. + FT_LOAD_TARGET_NORMAL :: Hint and render for normal anti-aliased + displays. FT_LOAD_TARGET_MONO :: Hint and render for 1-bit displays. - FT_LOAD_TARGET_LCD :: Hint and render for horizontal RGB or - BGR sub-pixel displays (like LCD - screens). THIS IS STILL - EXPERIMENTAL! + FT_LOAD_TARGET_LCD :: Hint and render for horizontal RGB or BGR + sub-pixel displays (like LCD screens). + THIS IS STILL EXPERIMENTAL! - FT_LOAD_TARGET_LCD_V :: Same as FT_LOAD_TARGET_LCD, for - vertical sub-pixel displays (like - rotated LCD screens). THIS IS STILL - EXPERIMENTAL! + FT_LOAD_TARGET_LCD_V :: Same as FT_LOAD_TARGET_LCD, for vertical + sub-pixel displays (like rotated LCD + screens). THIS IS STILL EXPERIMENTAL! - FT_LOAD_MONOCHROME is still supported, but only affects - rendering, not the hinting. + FT_LOAD_MONOCHROME is still supported, but only affects rendering, not + the hinting. - Note that the `ftview' demo program available in the `ft2demos' - package has been updated to support LCD-optimized display on - non-paletted displays (under Win32 and X11). + Note that the 'ftview' demo program available in the 'ft2demos' package + has been updated to support LCD-optimized display on non-paletted + displays (under Win32 and X11). - - The PFR driver now supports embedded bitmaps (all formats - supported), and returns correct kerning metrics for all glyphs. + - The PFR driver now supports embedded bitmaps (all formats supported), + and returns correct kerning metrics for all glyphs. - - The TrueType charmap loader now supports certain `broken' fonts - that load under Windows without problems. + - The TrueType charmap loader now supports certain "broken" fonts that + load under Windows without problems. - The cache API has been slightly modified (it's still a beta!): - - The type FTC_ImageDesc has been removed; it is now replaced - by FTC_ImageTypeRec. Note that one of its fields is a - `load_flag' parameter for FT_Load_Glyph. + - The type FTC_ImageDesc has been removed; it is now replaced by + FTC_ImageTypeRec. Note that one of its fields is a `load_flag' + parameter for FT_Load_Glyph. - - The field "num_grays" of FT_SBitRec has been changed to - "max_grays" in order to fit within a single byte. Its - maximum value is thus 255 (instead of 256 as previously). + - The field "num_grays" of FT_SBitRec has been changed to "max_grays" + in order to fit within a single byte. Its maximum value is thus 255 + (instead of 256 as previously). III. MISCELLANEOUS - - Added support for the DESTDIR variable during "make install". - This simplifies packaging of FreeType. + - Added support for the DESTDIR variable during "make install". This + simplifies packaging of FreeType. - - Included modified copies of the ZLib sources in `src/gzip' in - order to support gzip-compressed PCF fonts. We do not use the - system-provided zlib for now, though this is a probable - enhancement for future releases. + - Included modified copies of the ZLib sources in 'src/gzip' in order to + support gzip-compressed PCF fonts. We do not use the system-provided + zlib for now, though this is a probable enhancement for future + releases. - - The DocMaker tool used to generate the on-line API reference has - been completely rewritten. It is now located in + - The DocMaker tool used to generate the on-line API reference has been + completely rewritten. It is now located in "src/tools/docmaker/docmaker.py". Features: - better cross-referenced output - more polished output - - uses Python regular expressions (though it didn't speed the + - uses Python regular expressions (though it didn't speed the program) - - much more modular structure, which allows for different - "backends" in order to generate HTML, XML, or whatever - format. + - much more modular structure, which allows for different "backends" + in order to generate HTML, XML, or whatever format. One can regenerate the API reference by calling: @@ -535,92 +323,86 @@ LATEST CHANGES BETWEEN 2.1.3 and 2.1.2 include/freetype/cache/*.h - A new, experimental, support for incremental font loading (i.e., - loading of fonts where the glyphs are not in the font file - itself, but provided by an external component, like a Postscript - interpreter) has been added by Graham Asher. This is still work - in progress, however. + loading of fonts where the glyphs are not in the font file itself, but + provided by an external component, like a Postscript interpreter) has + been added by Graham Asher. This is still work in progress, however. - - A new, EXPERIMENTAL, path stroker has been added. It doesn't - suffer from severe rounding errors and treat bezier arcs - directly. Still work in progress (i.e. not part of the official - API). See the file for some of the - details. + - A new, EXPERIMENTAL, path stroker has been added. It doesn't suffer + from severe rounding errors and treat bezier arcs directly. Still + work in progress (i.e. not part of the official API). See the file + for some of the details. - - The massive re-formatting of sources and internal re-design is - still under-way. Many internal functions, constants, and types - have been renamed. + - The massive re-formatting of sources and internal re-design is still + under-way. Many internal functions, constants, and types have been + renamed. -====================================================================== +======================================================================== LATEST CHANGES BETWEEN 2.1.2 and 2.1.1 I. IMPORTANT BUG FIXES - - Many font drivers didn't select a Unicode charmap by default - when a new face was opened (with the FT_CONFIG_OPTION_USE_CMAPS - options enabled), causing many applications to not be able to - display text correctly with the 2.1.x releases. + - Many font drivers didn't select a Unicode charmap by default when + a new face was opened (with the FT_CONFIG_OPTION_USE_CMAPS options + enabled), causing many applications to not be able to display text + correctly with the 2.1.x releases. - - The PFR driver had a bug in its composite loading code that - produces incorrectly placed accents with many fonts. + - The PFR driver had a bug in its composite loading code that produces + incorrectly placed accents with many fonts. - The Type42 driver crashed sometimes due to a nasty bug. - - The Type 1 custom encoding charmap didn't handle the case where - the first glyph index wasn't 0. + - The Type 1 custom encoding charmap didn't handle the case where the + first glyph index wasn't 0. - - A serious typo in the TrueType composite loader produced - incorrectly placed glyphs in fonts like "Wingdings" and a few - others. + - A serious typo in the TrueType composite loader produced incorrectly + placed glyphs in fonts like "Wingdings" and a few others. II. MISCELLANEOUS - - The Win32 Visual C++ project file has been updated to include - the PFR driver as well. + - The Win32 Visual C++ project file has been updated to include the + PFR driver as well. - - "freetype.m4" is now installed by default by "make install" on - Unix systems. + - "freetype.m4" is now installed by default by "make install" on Unix + systems. - - The function FT_Get_PS_Font_Info now works with CID and Type42 - fonts as well. + - The function FT_Get_PS_Font_Info now works with CID and Type42 fonts + as well. -====================================================================== +======================================================================== LATEST CHANGES BETWEEN 2.1.1 and 2.1.0 I. IMPORTANT BUG FIXES - - The `version_info' returned by `freetype-config' in 2.1.0 - returned an invalid value. It now returns 9:1:3 (2.0.9 returned - 9:0:3). + - The `version_info' returned by `freetype-config' in 2.1.0 returned an + invalid value. It now returns 9:1:3 (2.0.9 returned 9:0:3). - - Version 2.1.0 couldn't be linked against applications on Win32 - and Amiga systems due to a new debug function that wasn't - properly propagated to the system-specific directory in - `builds'. + - Version 2.1.0 couldn't be linked against applications on Win32 and + Amiga systems due to a new debug function that wasn't properly + propagated to the system-specific directory in `builds'. - Various MacOS and Mac OS X specific fixes. - - Fixed a bug in the TrueType charmap validation routines that - made version 2.1.0 too restrictive -- many popular fonts have - been rejected. + - Fixed a bug in the TrueType charmap validation routines that made + version 2.1.0 too restrictive -- many popular fonts have been + rejected. - - There was still a very small difference between the monochrome - glyph bitmaps produced by FreeType 1.x and FreeType 2.x with the - bytecode interpreter enabled. This was caused by an invalid - flag setting in the TrueType glyph loader, making the rasterizer - change its drop-out control mode. Now theresults should - _really_ be completely identical. + - There was still a very small difference between the monochrome glyph + bitmaps produced by FreeType 1.x and FreeType 2.x with the bytecode + interpreter enabled. This was caused by an invalid flag setting in + the TrueType glyph loader, making the rasterizer change its drop-out + control mode. Now theresults should _really_ be completely identical. - The TrueType name table loader has been improved to support many - popular though buggy Asian fonts. It now ignores empty name - entries, invalid pointer offsets and a few other incorrect - subtleties. Moreover, name strings are now loaded on demand, - which reduces the memory load of many faces (e.g. the ARIAL.TTF - font file contains a 10kByte name table with 70 names). + popular though buggy Asian fonts. It now ignores empty name entries, + invalid pointer offsets and a few other incorrect subtleties. + Moreover, name strings are now loaded on demand, which reduces the + memory load of many faces (e.g. the ARIAL.TTF font file contains a + 10kByte name table with 70 names). - Fixed a bug in the Postscript hinter that prevented family blues substitution to happen correctly. @@ -630,119 +412,116 @@ LATEST CHANGES BETWEEN 2.1.1 and 2.1.0 - Three new font drivers in this release: - * A BDF font driver, contributed by Franco Zappa Nardelli, - heavily modified by Werner Lemberg. It also supports - anti-aliased bitmaps (using a slightly extended BDF format). + * A BDF font driver, contributed by Franco Zappa Nardelli, heavily + modified by Werner Lemberg. It also supports anti-aliased bitmaps + (using a slightly extended BDF format). - * A Type42 font driver, contributed by Roberto Alameda. It is + * A Type42 font driver, contributed by Roberto Alameda. It is still experimental but seems to work relatively well. - * A PFR font driver, contributed by David Turner himself. It - doesn't support PFR hinting -- note that BitStream has at - least two patents on this format! + * A PFR font driver, contributed by David Turner himself. It doesn't + support PFR hinting -- note that BitStream has at least two patents + on this format! III. MISCELLANEOUS - - The cache sub-system has been optimized in important ways. - Cache hits are now significantly faster. For example, using the - CMap cache is about twice faster than calling FT_Get_Char_Index - on most platforms. Similarly, using an SBit cache is about five - times faster than loading the bitmaps from a bitmap file, and - 300 to 500 times faster than generating them from a scalable - format. + - The cache sub-system has been optimized in important ways. Cache hits + are now significantly faster. For example, using the CMap cache is + about twice faster than calling FT_Get_Char_Index on most platforms. + Similarly, using an SBit cache is about five times faster than loading + the bitmaps from a bitmap file, and 300 to 500 times faster than + generating them from a scalable format. - Note that you should recompile your sources if you designed a - custom cache class for the FT2 Cache subsystem, since the - changes performed are source, but not binary, compatible. + Note that you should recompile your sources if you designed a custom + cache class for the FT2 Cache subsystem, since the changes performed + are source, but not binary, compatible. -====================================================================== +======================================================================== LATEST CHANGES BETWEEN 2.1.0 and 2.0.9 I. IMPORTANT BUG FIXES - - The TrueType bytecode interpreter has been fixed to produce + - The TrueType bytecode interpreter has been fixed to produce _exactly_ the same output as FreeType 1.x. Previous differences - were due to slightly distinct fixed-point computation routines + were due to slightly distinct fixed-point computation routines used to perform dot products and vector length measurements. - It seems that native TrueType hinting is _extremely_ sensitive - to rounding errors. The required vector computation routines - have been optimized and placed within the "ttinterp.c" file. + It seems that native TrueType hinting is _extremely_ sensitive + to rounding errors. The required vector computation routines have + been optimized and placed within the "ttinterp.c" file. - Fixed the parsing of accelerator tables in the PCF font driver. - - Fixed the Type1 glyph loader routine used to compute the font's + - Fixed the Type1 glyph loader routine used to compute the font's maximum advance width. - II. NEW FEATURES - The `configure' script used on Unix systems has been modified to - check that GNU Make is being used to build the library. - Otherwise, it will display a message proposing to use the - GNUMAKE environment variable to name it. + check that GNU Make is being used to build the library. Otherwise, + it will display a message proposing to use the GNUMAKE environment + variable to name it. The Unix-specific file README.UNX has been modified accordingly. III. MISCELLANEOUS - - The FreeType License in `docs/FTL.txt' has been updated to - include a proposed preferred disclaimer. If you are using - FreeType in your products, you are encouraged (but not mandated) - to use the following text in your documentation: + - The FreeType License in `docs/FTL.txt' has been updated to include + a proposed preferred disclaimer. If you are using FreeType in your + products, you are encouraged (but not mandated) to use the following + text in your documentation: """ - Portions of this software are copyright 1996-2002 The - FreeType Project (www.freetype.org). All rights reserved. + Portions of this software are copyright 1996-2002 The FreeType + Project (www.freetype.org). All rights reserved. """ - The default size of the render pool has been reduced to 16kByte. - This shouldn't result in any noticeable performance penalty, - unless you are using the engine as-is to render very large and - complex glyphs. + This shouldn't result in any noticeable performance penalty, unless + you are using the engine as-is to render very large and complex + glyphs. - - The FreeType 2 redesign has begun. More information can be - found at this URL: + - The FreeType 2 redesign has begun. More information can be found + at this URL: http://www.freetype.org/freetype2/redesign.html - The following internal changes have been performed within the - sources of this release: + The following internal changes have been performed within the sources + of this release: - - Many internal types have been renamed to increase - consistency. The following should be true, except for - public types: + - Many internal types have been renamed to increase consistency. + The following should be true, except for public types: - * All structure types have a name ending in "Rec" (short - for `record'). + * All structure types have a name ending in "Rec" (short for + `record'). - * A pointer-to-structure type has the same name as the + * A pointer-to-structure type has the same name as the structure, _without_ the "Rec" suffix. - Example: + Example: - typedef struct FooRec_ - { - ... + typedef struct FooRec_ + { + ... - } FooRec, *Foo; + } FooRec, *Foo; - - Many internal macros have been renamed to increase - consistency. The following should be true: + - Many internal macros have been renamed to increase consistency. + The following should be true: - * All macros have a name beginning with "FT_". This - required a few changes like + * All macros have a name beginning with "FT_". This required + a few changes like ALLOC => FT_ALLOC FREE => FT_FREE REALLOC => FT_REALLOC - * All macros are completely UPPERCASE. This required a - few changes like: + * All macros are completely UPPERCASE. This required a few + changes like: READ_Short => FT_READ_SHORT NEXT_Short => FT_NEXT_SHORT @@ -751,7 +530,7 @@ LATEST CHANGES BETWEEN 2.1.0 and 2.0.9 MEM_Copy => FT_MEM_COPY etc. - * Whenever possible, all macro names follow the + * Whenever possible, all macro names follow the FT__ pattern. For example ACCESS_Frame => FT_FRAME_ENTER @@ -765,7 +544,7 @@ LATEST CHANGES BETWEEN 2.1.0 and 2.0.9 FILE_ReadAt => FT_STREAM_READ_AT READ_Fields => FT_STREAM_READ_FIELDS - - Many internal functions have been renamed to follow the + - Many internal functions have been renamed to follow the FT__ pattern. For example: FT_Seek_Stream => FT_Stream_Seek @@ -777,299 +556,288 @@ LATEST CHANGES BETWEEN 2.1.0 and 2.0.9 Note that method names do not contain "_". - - The FT_ALLOC_ARRAY and FT_REALLOC_ARRAY have been replaced - with FT_NEW_ARRAY and FT_RENEW_ARRAY which do not take a - type as the fourth argument. Instead, the array element - type size is computed automatically from the type of the - target pointer used. + - The FT_ALLOC_ARRAY and FT_REALLOC_ARRAY have been replaced + with FT_NEW_ARRAY and FT_RENEW_ARRAY which do not take a type + as the fourth argument. Instead, the array element type size + is computed automatically from the type of the target pointer + used. - - A new object class, FT_CMap, has been introduced. These - internal objects are used to model character maps. This - eases the support of additional charmap types within the - engine. + - A new object class, FT_CMap, has been introduced. These + internal objects are used to model character maps. This eases + the support of additional charmap types within the engine. - - A new configuration file named "ftstdlib.h" has been added - to `include/freetype/config'. It is used to define aliases - for _every_ routine of the ISO C library that the font - engine uses. Each aliases has a "ft_" prefix - (e.g. "ft_strlen" is an alias for "strlen"). + - A new configuration file named "ftstdlib.h" has been added + to `include/freetype/config'. It is used to define aliases + for _every_ routine of the ISO C library that the font engine + uses. Each aliases has a "ft_" prefix (e.g. "ft_strlen" is an + alias for "strlen"). - This is used to ease the porting of FreeType 2 to exotic - runtime environments where the ISO C Library isn't available - (e.g. XFree86 extension modules). + This is used to ease the porting of FreeType 2 to exotic runtime + environments where the ISO C Library isn't available (e.g. + XFree86 extension modules). More details are available in the "ChangeLog" file. -====================================================================== +============================================================================ LATEST CHANGES BETWEEN 2.0.9 and 2.0.8 I. IMPORTANT BUG FIXES - Certain fonts like "foxjump.ttf" contain broken name tables with - invalid entries and wild offsets. This caused FreeType to crash - when trying to load them. + invalid entries and wild offsets. This caused FreeType to crash when + trying to load them. - The SFNT `name' table loader has been fixed to be able to - support these strange fonts. + The SFNT `name' table loader has been fixed to be able to support + these strange fonts. - Moreover, the code in charge of processing this table has been - changed to always favour Windows-formatted entries over other - ones. Hence, a font that works on Windows but not on the Mac - will load cleanly in FreeType and report accurate values for - Family & PostScript names. + Moreover, the code in charge of processing this table has been changed + to always favour Windows-formatted entries over other ones. Hence, a + font that works on Windows but not on the Mac will load cleanly in + FreeType and report accurate values for Family & PostScript names. - The CID font driver has been fixed. It unfortunately returned a - Postscript Font name with a leading slash, as in + Postscript Font name with a leading slash, as in "/MunhwaGothic-Regular". - - FreeType 2 should now compile fine on AIX 4.3.3 as a shared - library. + - FreeType 2 should now compile fine on AIX 4.3.3 as a shared library. - - A bug in the Postscript hinter has been found and fixed, - removing un-even stem widths at small pixel sizes (like 14-17). + - A bug in the Postscript hinter has been found and fixed, removing + un-even stem widths at small pixel sizes (like 14-17). - This improves the quality of a certain number of Postscript - fonts. + This improves the quality of a certain number of Postscript fonts. II. NEW FEATURES - - A new function named `FT_Library_Version' has been added to - return the current library's major, minor, and patch version - numbers. This is important since the macros FREETYPE_MAJOR, - FREETYPE_MINOR, and FREETYPE_PATCH cannot be used when the - library is dynamically linked by a program. + - A new function named `FT_Library_Version' has been added to return + the current library's major, minor, and patch version numbers. This + is important since the macros FREETYPE_MAJOR, FREETYPE_MINOR, and + FREETYPE_PATCH cannot be used when the library is dynamically linked + by a program. - - Two new APIs have been added: `FT_Get_First_Char' and + - Two new APIs have been added: `FT_Get_First_Char' and `FT_Get_Next_Char'. - Together, these can be used to iterate efficiently over the - currently selected charmap of a given face. Read the API - reference for more details. + Together, these can be used to iterate efficiently over the currently + selected charmap of a given face. Read the API reference for more + details. III. MISCELLANEOUS - - The FreeType sources are under heavy internal re-factoring. As - a consequence, we have created a branch named "STABLE" on the - CVS to hold all future releases/fixes in the 2.0.x family. + - The FreeType sources are under heavy internal re-factoring. As a + consequence, we have created a branch named "STABLE" on the CVS to + hold all future releases/fixes in the 2.0.x family. - The HEAD branch now contains the re-factored sources and - shouldn't be used for testing or packaging new releases. In - case you would like to access the 2.0.9 sources from our CVS - repository, use the tag `VER-2-0-9'. + The HEAD branch now contains the re-factored sources and shouldn't be + used for testing or packaging new releases. In case you would like + to access the 2.0.9 sources from our CVS repository, use the tag + `VER-2-0-9'. -====================================================================== +============================================================================ LATEST CHANGES BETWEEN 2.0.8 and 2.0.7 I. IMPORTANT BUG FIXES - - There was a small but nasty bug in "freetype-config.in" which + - There was a small but nasty bug in "freetype-config.in" which caused the "freetype-config" script to fail on Unix. - This didn't prevent the installation of the library or even its - execution, but caused problems when trying to compile many Unix - packages that depend on it. + This didn't prevent the installation of the library or even + its execution, but caused problems when trying to compile many + Unix packages that depend on it. - - Some TrueType or OpenType fonts embedded in PDF documents do not - have a 'cmap', 'post' and 'name' as is required by the + - Some TrueType or OpenType fonts embedded in PDF documents do + not have a 'cmap', 'post' and 'name' as is required by the specification. FreeType no longer refuses to load such fonts. - - Various fixes to the PCF font driver. + - various fixes to the PCF font driver -====================================================================== +============================================================================ LATEST CHANGES BETWEEN 2.0.7 and 2.0.6 I. IMPORTANT BUG FIXES - - Fixed two bugs in the Type 1 font driver. The first one - resulted in a memory leak in subtle cases. The other one caused - FreeType to crash when trying to load ".gsf" files (Ghostscript - so-called Postscript fonts). + - Fixed two bugs in the Type 1 font driver. The first one resulted in a + memory leak in subtle cases. The other one caused FreeType to crash + when trying to load ".gsf" files (Ghostscript so-called Postscript + fonts). - (This made _many_ KDE applications crash on certain systems. - FreeType _is_ becoming a critical system component on Linux :-) + (This made _many_ KDE applications crash on certain systems. FreeType + _is_ becoming a critical system component on Linux :-) - Fixed a memory leak in the CFF font driver. - Fixed a memory leak in the PCF font driver. - - Fixed the Visual C++ project file - "builds/win32/visualc/freetype.dsp" since it didn't include the - Postscript hinter component, causing errors at build time. + - Fixed the Visual C++ project file "builds/win32/visualc/freetype.dsp" + since it didn't include the Postscript hinter component, causing + errors at build time. - - Fixed a small rendering bug in the anti-aliased renderer that - only occurred when trying to draw thin (less than 1 pixel) - strokes. + - Fixed a small rendering bug in the anti-aliased renderer that only + occurred when trying to draw thin (less than 1 pixel) strokes. - - Fixed "builds/unix/freetype2.a4" which is used to generate a - valid "freetype2.m4" for use with autoconf. + - Fixed "builds/unix/freetype2.a4" which is used to generate a valid + "freetype2.m4" for use with autoconf. - Fixed the OpenVMS Makefiles. II. MISCELLANEOUS - - Added "configure" and "install" scripts to the top-level - directory. A GNU-style installation is thus now easily possible - with + - Added "configure" and "install" scripts to the top-level directory. + A GNU-style installation is thus now easily possible with - ./configure - make - make install + ./configure + make + make install -====================================================================== +============================================================================ LATEST CHANGES BETWEEN 2.0.6 and 2.0.5 I. IMPORTANT BUG FIXES - - It wasn't possible to load embedded bitmaps when the auto-hinter - was used. This is now fixed. + - It wasn't possible to load embedded bitmaps when the auto-hinter was + used. This is now fixed. - - The TrueType font driver didn't load some composites properly - (the sub-glyphs were slightly shifted, and this was only - noticeable when using monochrome rendering). + - The TrueType font driver didn't load some composites properly (the + sub-glyphs were slightly shifted, and this was only noticeable when + using monochrome rendering). - - Various fixes to the auto-hinter. They merely improve the - output of sans-serif fonts. Note that there are still problems - with serifed fonts and composites (accented characters). + - Various fixes to the auto-hinter. They merely improve the output of + sans-serif fonts. Note that there are still problems with serifed + fonts and composites (accented characters). - - All scalable font drivers erroneously returned un-fitted glyph - advances when hinting was requested. This created problems for - a number of layout applications. This is a very old bug that - got undetected mainly because most test/demo program perform - rounding explicitly or implicitly (through the cache). + - All scalable font drivers erroneously returned un-fitted glyph + advances when hinting was requested. This created problems for a + number of layout applications. This is a very old bug that got + undetected mainly because most test/demo program perform rounding + explicitly or implicitly (through the cache). - - FT_Glyph_To_Bitmap() did erroneously modify the source glyph in + - FT_Glyph_To_Bitmap() did erroneously modify the source glyph in certain cases. - - "glnames.py" still contained a bug that made FreeType return - invalid names for certain glyphs. + - "glnames.py" still contained a bug that made FreeType return invalid + names for certain glyphs. - - The library crashed when loading certain Type 1 fonts like - "sadn.pfb" ("Stalingrad Normal"), which appear to contain - pathetic font info dictionaries. + - The library crashed when loading certain Type 1 fonts like "sadn.pfb" + ("Stalingrad Normal"), which appear to contain pathetic font info + dictionaries. - - The TrueType glyph loader is now much more paranoid and checks - everything when loading a given glyph image. This was necessary - to avoid problems (crashes and/or memory overwrites) with broken - fonts that came from a really buggy automatic font converter. + - The TrueType glyph loader is now much more paranoid and checks everything + when loading a given glyph image. This was necessary to avoid + problems (crashes and/or memory overwrites) with broken fonts that + came from a really buggy automatic font converter. II. IMPORTANT UPDATES AND NEW FEATURES - Important updates to the Mac-specific parts of the library. - - The caching sub-system has been completely re-designed, and its - API has evolved (the old one is still supported for backwards + - The caching sub-system has been completely re-designed, and its API + has evolved (the old one is still supported for backwards compatibility). - The documentation for it is not yet completed, sorry. For now, - you are encouraged to continue using the old API. However, the - ftview demo program in the ft2demos package has already been - updated to use the new caching functions. + The documentation for it is not yet completed, sorry. For now, you + are encouraged to continue using the old API. However, the ftview + demo program in the ft2demos package has already been updated to use + the new caching functions. - - A new charmap cache is provided too. See FTC_CMapCache(). This - is useful to perform character code -> glyph index translations - quickly, without the need for an opened FT_Face. + - A new charmap cache is provided too. See FTC_CMapCache(). This is + useful to perform character code -> glyph index translations quickly, + without the need for an opened FT_Face. - - A NEW POSTSCRIPT HINTER module has been added to support native - hints in the following formats: PostScript Type 1, PostScript - CID, and CFF/CEF. + - A NEW POSTSCRIPT HINTER module has been added to support native hints + in the following formats: PostScript Type 1, PostScript CID, and + CFF/CEF. - Please test! Note that the auto-hinter produces better results - for a number of badly-hinted fonts (mostly auto-generated ones) - though. + Please test! Note that the auto-hinter produces better results for a + number of badly-hinted fonts (mostly auto-generated ones) though. - - A memory debugger is now part of the standard FreeType sources. - To enable it, define FT_DEBUG_MEMORY in - , and recompile the library. + - A memory debugger is now part of the standard FreeType sources. To + enable it, define FT_DEBUG_MEMORY in , and + recompile the library. - Additionally, define the _environment_ variable FT_DEBUG_MEMORY - and run any program using FreeType. When the library is exited, - a summary of memory footprints and possible leaks will be - displayed. + Additionally, define the _environment_ variable FT_DEBUG_MEMORY and + run any program using FreeType. When the library is exited, a summary + of memory footprints and possible leaks will be displayed. - This works transparently with _any_ program that uses FreeType. - However, you will need a lot of memory to use this (allocated - blocks are never released to the heap to detect double deletes - easily). + This works transparently with _any_ program that uses FreeType. + However, you will need a lot of memory to use this (allocated blocks + are never released to the heap to detect double deletes easily). III. MISCELLANEOUS - - We are aware of subtle differences between the output of - FreeType versions 1 and 2 when it comes to monochrome - TrueType-hinted glyphs. These are most probably due to small - differences in the monochrome rasterizers and will be worked out - in an upcoming release. + - We are aware of subtle differences between the output of FreeType + versions 1 and 2 when it comes to monochrome TrueType-hinted glyphs. + These are most probably due to small differences in the monochrome + rasterizers and will be worked out in an upcoming release. - We have decided to fork the sources in a "stable" branch, and an - "unstable" one, since FreeType is becoming a critical component - of many Unix systems. + "unstable" one, since FreeType is becoming a critical component of + many Unix systems. - The next bug-fix releases of the library will be named 2.0.7, - 2.0.8, etc., while the "2.1" branch will contain a version of - the sources where we will start major reworking of the library's - internals, in order to produce FreeType 2.2.0 (or even 3.0) in a - more distant future. + The next bug-fix releases of the library will be named 2.0.7, 2.0.8, + etc., while the "2.1" branch will contain a version of the sources + where we will start major reworking of the library's internals, in + order to produce FreeType 2.2.0 (or even 3.0) in a more distant + future. - We also hope that this scheme will allow much more frequent - releases than in the past. + We also hope that this scheme will allow much more frequent releases + than in the past. -====================================================================== +============================================================================ LATEST CHANGES BETWEEN 2.0.5 and 2.0.4 - NOTE THAT 2.0.5 DOES NOT CONTAIN THE POSTSCRIPT HINTER. THIS MODULE - WILL BE PART OF THE NEXT RELEASE (EITHER 2.0.6 or 2.1) + NOTE THAT 2.0.5 DOES NOT CONTAIN THE POSTSCRIPT HINTER. THIS MODULE WILL + BE PART OF THE NEXT RELEASE (EITHER 2.0.6 or 2.1) - - Fixed a bug that made certain glyphs, like "Cacute", "cacute" and - "lslash" unavailable from Unicode charmaps of Postscript fonts. - This prevented the correct display of Polish text, for example. + - Fixed a bug that made certain glyphs, like "Cacute", "cacute" and + "lslash" unavailable from Unicode charmaps of Postscript fonts. This + prevented the correct display of Polish text, for example. - - The kerning table of Type 1 fonts was loaded by FreeType, when its - AFM file was attached to its face, but the - FT_FACE_FLAG_HAS_KERNING bit flags was not set correctly, - preventing FT_Get_Kerning to return meaningful values. + - The kerning table of Type 1 fonts was loaded by FreeType, when its AFM + file was attached to its face, but the FT_FACE_FLAG_HAS_KERNING bit + flags was not set correctly, preventing FT_Get_Kerning to return + meaningful values. - - Improved SFNT (TrueType & OpenType) charmap support. Slightly - better performance, as well as support for the new formats defined - by the OpenType 1.3 specification (8, 10, and 12) + - Improved SFNT (TrueType & OpenType) charmap support. Slightly better + performance, as well as support for the new formats defined by the + OpenType 1.3 specification (8, 10, and 12) - - Fixed a serious typo in "src/base/ftcalc.c" which caused invalid + - Fixed a serious typo in "src/base/ftcalc.c" which caused invalid computations in certain rare cases, producing ugly artefacts. - - The size of the EM square is computed with a more accurate - algorithm for Postscript fonts. The old one caused slight errors - with embedded fonts found in PDF documents. + - The size of the EM square is computed with a more accurate algorithm + for Postscript fonts. The old one caused slight errors with embedded + fonts found in PDF documents. - - Fixed a bug in the cache manager that prevented normal LRU - behaviour within the cache manager, causing unnecessary reloads - (for FT_Face and FT_Size objects only). + - Fixed a bug in the cache manager that prevented normal LRU behaviour + within the cache manager, causing unnecessary reloads (for FT_Face and + FT_Size objects only). - - Added a new function named "FT_Get_Name_Index" to retrieve the - glyph index of a given glyph name, when found in a face. + - Added a new function named "FT_Get_Name_Index" to retrieve the glyph + index of a given glyph name, when found in a face. - - Added a new function named "FT_Get_Postscript_Name" to retrieve - the "unique" Postscript font name of a given face. + - Added a new function named "FT_Get_Postscript_Name" to retrieve the + "unique" Postscript font name of a given face. - - Added a new public header size named FT_SIZES_H (or - ) providing new FT_Size-management functions: + - Added a new public header size named FT_SIZES_H (or + ) providing new FT_Size-management functions: FT_New_Size, FT_Activate_Size, FT_Done_Size. - - Fixed a reallocation bug that generated a dangling pointer (and - possibly memory leaks) with Postscript fonts (in - src/psaux/psobjs.c). + - Fixed a reallocation bug that generated a dangling pointer (and possibly + memory leaks) with Postscript fonts (in src/psaux/psobjs.c). - Many fixes for 16-bit correctness. @@ -1077,156 +845,149 @@ LATEST CHANGES BETWEEN 2.0.5 and 2.0.4 - Added an Amiga build directory in "builds/amiga". - -====================================================================== +============================================================================ LATEST CHANGES BETWEEN 2.0.4 and 2.0.3 - - Fixed a rather annoying bug that was introduced in 2.0.3. Namely, - the font transformation set through FT_Set_Transform was applied - twice to auto-hinted glyphs, resulting in incorrectly rotated text - output. + - Fixed a rather annoying bug that was introduced in 2.0.3. Namely, the + font transformation set through FT_Set_Transform was applied twice to + auto-hinted glyphs, resulting in incorrectly rotated text output. - - Fixed _many_ compiler warnings. FT2 should now compile cleanly - with Visual C++'s most pedantic warning level (/W4). It already - compiled fine with GCC and a few other compilers. + - Fixed _many_ compiler warnings. FT2 should now compile cleanly with + Visual C++'s most pedantic warning level (/W4). It already compiled + fine with GCC and a few other compilers. - - Fixed a bug that prevented the linear advance width of composite + - Fixed a bug that prevented the linear advance width of composite TrueType glyphs to be correctly returned. - - Fixed the Visual C++ project files located in - "builds/win32/visualc" (previous versions used older names of the - library). + - Fixed the Visual C++ project files located in "builds/win32/visualc" + (previous versions used older names of the library). - - Many 32-bit constants have an "L" appended to their value, in - order to improve the 16-bitness of the code. Someone is actually - trying to use FT2 on an Atari ST machine! + - Many 32-bit constants have an "L" appended to their value, in order + to improve the 16-bitness of the code. Someone is actually trying to + use FT2 on an Atari ST machine! - - Updated the "builds/detect.mk" file in order to automatically - build FT2 on AIX systems. AIX uses "/usr/sbin/init" instead of - "/sbin/init" and wasn't previously detected as a Unix platform by - the FreeType build system. + - Updated the "builds/detect.mk" file in order to automatically build + FT2 on AIX systems. AIX uses "/usr/sbin/init" instead of "/sbin/init" + and wasn't previously detected as a Unix platform by the FreeType build + system. - - Updated the Unix-specific portions of the build system (new - libtool version, etc.). + - Updated the Unix-specific portions of the build system (new libtool + version, etc.). - - The SFNT kerning lodaer now ensures that the table is sorted - (since some problem fonts do not meet this requirement). + - The SFNT kerning lodaer now ensures that the table is sorted (since some + problem fonts do not meet this requirement). - -======================================================================= +============================================================================ LATEST CHANGES BETWEEN 2.0.3 and 2.0.2 I. CHANGES TO THE MODULES / FONT DRIVERS - - THE AUTO-HINTER HAS BEEN SLIGHTLY IMPROVED, in order to fix - several annoying artefacts, mainly: + - THE AUTO-HINTER HAS BEEN SLIGHTLY IMPROVED, in order to fix several + annoying artefacts, mainly: - - Blue zone alignement of horizontal stems wasn't performed - correctly, resulting in artefacts like the "d" being placed - one pixel below the "b" in some fonts like Time New Roman. + - Blue zone alignement of horizontal stems wasn't performed + correctly, resulting in artefacts like the "d" being placed one + pixel below the "b" in some fonts like Time New Roman. - - Overshoot thresholding wasn't performed correctly, creating + - Overshoot thresholding wasn't performed correctly, creating unpleasant artefacts at large character pixel sizes. - - Composite glyph loading has been simplified. This gets rid - of various artefacts where the components of a composite - glyphs were not correctly spaced. + - Composite glyph loading has been simplified. This gets rid + of various artefacts where the components of a composite glyphs + were not correctly spaced. - These are the last changes to the current auto-hinting module. - A new hinting sub-system is currently in the work in order to - support native hints in Type 1 / CFF / OpenType fonts, as well - as globally improve rendering. + These are the last changes to the current auto-hinting module. A new + hinting sub-system is currently in the work in order to support native + hints in Type 1 / CFF / OpenType fonts, as well as globally improve + rendering. - - The PCF driver has been fixed. It reported invalid glyph - dimensions for the fonts available on Solaris. + - The PCF driver has been fixed. It reported invalid glyph dimensions + for the fonts available on Solaris. - - The Type 1, CID and CFF drivers have been modified to fix the + - The Type 1, CID and CFF drivers have been modified to fix the computation of the EM size. - - The Type 1 driver has been fixed to avoid a dangerous bug that - crashed the library with non-conforming fonts (i.e. ones that do - not place the .notdef glyph at position 0). + - The Type 1 driver has been fixed to avoid a dangerous bug that + crashed the library with non-conforming fonts (i.e. ones that do not + place the .notdef glyph at position 0). - - The TrueType driver had a rather subtle bug (dangling pointer - when loading composite glyphs) that could crash the library in - rare occasions! + - The TrueType driver had a rather subtle bug (dangling pointer when + loading composite glyphs) that could crash the library in rare + occasions! II. HIGH-LEVEL API CHANGES - - The error code enumeration values have been changed. An error - value is decomposed in a generic error code, and a module - number. see for details. + - The error code enumeration values have been changed. An error value + is decomposed in a generic error code, and a module number. see + for details. - - A new public header file has been introduced, named - FT_TRIGONOMETRY_H (include/freetype/fttrig.h), providing - trigonometric functions to compute sines, cosines, arctangents, - etc. with 16.16 fixed precision. The implementation is based on - the CORDIC algorithm and is very fast while being sufficiently - accurate. + - A new public header file has been introduced, named FT_TRIGONOMETRY_H + (include/freetype/fttrig.h), providing trigonometric functions to + compute sines, cosines, arctangents, etc. with 16.16 fixed precision. + The implementation is based on the CORDIC algorithm and is very fast + while being sufficiently accurate. III. INTERNALS - - Added BeOS-specific files in the old build sub-system. Note - that no changes were required to compile the library with Jam. + - Added BeOS-specific files in the old build sub-system. Note that + no changes were required to compile the library with Jam. - - The configuration is now capable of automatically detecting - 64-bit integers on a set of predefined compilers (GCC, Visual - C++, Borland C++) and will use them by default. This provides a - small performance boost. + - The configuration is now capable of automatically detecting 64-bit + integers on a set of predefined compilers (GCC, Visual C++, Borland + C++) and will use them by default. This provides a small performance + boost. - - A small memory leak that happened when opening 0-sized files - (duh!) have been fixed. + - A small memory leak that happened when opening 0-sized files (duh!) + have been fixed. - - Fixed bezier stack depth bug in the routines provided by the - FT_BBOX_H header file. Also fixed similar bugs in the - rasterizers. + - Fixed bezier stack depth bug in the routines provided by the + FT_BBOX_H header file. Also fixed similar bugs in the rasterizers. - - The outline bounding box code has been rewritten to use direct - computations, instead of bezier sub-division, to compute the - exact bounding box of glyphs. This is slightly slower but more - accurate. + - The outline bounding box code has been rewritten to use direct + computations, instead of bezier sub-division, to compute the exact + bounding box of glyphs. This is slightly slower but more accurate. - - The build system has been improved and fixed, mainly to support - "make" on Windows 2000 correctly, avoid problems with "make - distclean" on non Unix systems, etc. + - The build system has been improved and fixed, mainly to support "make" + on Windows 2000 correctly, avoid problems with "make distclean" on non + Unix systems, etc. - - Hexadecimal constants have been suffixed with "U" to avoid - problems with certain compilers on 64-bit platforms. + - Hexadecimal constants have been suffixed with "U" to avoid problems + with certain compilers on 64-bit platforms. - A new directory named "src/tools" has been created. It contains Python scripts and simple unit test programs used to develop the library. - - The DocMaker tool has been moved from "docs" to "src/tools" and + - The DocMaker tool has been moved from "docs" to "src/tools" and has been updated with the following: - Now accepts the "--title=XXXX" or "-t XXXX" option from the command line to set the project's name in the generated API reference. - - Now accepts the "--output=DIR" or "-o DIR" option from the - command line to set the output directory for all generated - HTML files. + - Now accepts the "--output=DIR" or "-o DIR" option from the + command line to set the output directory for all generated HTML + files. - Now accepts the "--prefix=XXXX" or "-p XXX" option from the - command line to set the file prefix to use for all - generated HTML files. + command line to set the file prefix to use for all generated HTML + files. - - Now generates the current time/data on each generated page + - Now generates the current time/data on each generated page in order to distinguish between versions. - DocMaker can be used with other projects now, not only FT2 - (e.g. MLib, FTLayout, etc.). + DocMaker can be used with other projects now, not only FT2 (e.g. MLib, + FTLayout, etc.). - -====================================================================== +=========================================================================== LATEST CHANGES BETWEEN 2.0.2 and 2.0.1 + I. CHANGES TO THE MODULES / FONT DRIVERS - THE TRUETYPE BYTECODE INTERPRETER IS NOW TURNED OFF, in order to @@ -1667,7 +1428,7 @@ BETA-8 (RELEASE CANDIDATE) CHANGES * Support for transforms and direct rendering in FT_Load_Glyph: Most of the functionality found in has been - moved to the core library. Hence, the following: + moved to the core library. Hence, the following: - A transform can be specified for a face through FT_Set_Transform. this transform is applied by FT_Load_Glyph @@ -1698,7 +1459,7 @@ BETA-8 (RELEASE CANDIDATE) CHANGES OLD CHANGES FOR BETA 7 - - bug-fixed the OpenType/CFF parser. It now loads and displays my + - bug-fixed the OpenType/CFF parser. It now loads and displays my two fonts nicely, but I'm pretty certain that more testing is needed :-) @@ -1706,20 +1467,20 @@ OLD CHANGES FOR BETA 7 correctly (well, the accent is not always well placed, but that's another problem..) - - added the CID-keyed Type 1 driver in "src/cid". Works pretty well + - added the CID-keyed Type 1 driver in "src/cid". Works pretty well for only 13 Kb of code ;-) Doesn't read AFM files though, nor the really useful CMAP files.. - - fixed two bugs in the smooth renderer (src/base/ftgrays.c). - Thanks to Boris Letocha for spotting them and providing a fix. + - fixed two bugs in the smooth renderer (src/base/ftgrays.c). Thanks + to Boris Letocha for spotting them and providing a fix.. - - fixed potential "divide by zero" bugs in ftcalc.c. + - fixed potential "divide by zero" bugs in ftcalc.c.. my god.. - added source code for the OpenType/CFF driver (still incomplete though..) - modified the SFNT driver slightly to perform more robust header - checks in TT_Load_SFNT_Header. This prevents certain font files + checks in TT_Load_SFNT_Header. This prevents certain font files (e.g. some Type 1 Multiple Masters) from being incorrectly "recognized" as TrueType font files.. @@ -1730,8 +1491,8 @@ OLD CHANGES FOR BETA 7 - added a tiny segment cache to the SFNT Charmap 4 decoder, in order to minimally speed it up.. - - added support for Multiple Master fonts in "type1z". There is - also a new file named which defines functions to + - added support for Multiple Master fonts in "type1z". There is also + a new file named which defines functions to manage them from client applications. The new file "src/base/ftmm.c" is also optional to the engine.. @@ -1743,7 +1504,7 @@ OLD CHANGES FOR BETA 7 correctly (used for many oblique fonts..) - some fixes for 64-bit systems (mainly changing some FT_TRACE calls - to use %p instead of %lx). Thanks to Karl Robillard. + to use %p instead of %lx).. Thanks to Karl Robillard - fixed some bugs in the sbit loader (src/base/sfnt/ttsbit.c) + added a new flag, FT_LOAD_CROP_BITMAP to query that bitmaps be @@ -1762,7 +1523,7 @@ OLD CHANGES FOR BETA 7 OLD CHANGES 16 May 2000 - - tagged "BETA-6" in the CVS tree. This one is a serious release + - tagged "BETA-6" in the CVS tree. This one is a serious release candidate even though it doesn't incorporate the auto-hinter yet.. - various obsolete files were removed, and copyright header updated @@ -1792,8 +1553,8 @@ OLD CHANGES 16 May 2000 | | It seems the C pre-processor that comes with LCC is broken, it | doesn't recognize the ANSI standard directives # and ## - | correctly when one of the argument is a macro. Also, - | something like: + | correctly when one of the argument is a macro. Also, something + | like: | | #define F(x) print##x | @@ -1803,12 +1564,12 @@ OLD CHANGES 16 May 2000 | | print "hello") | - | by its pre-processor. For this reason, you simply cannot build + | by its pre-processor. For this reason, you simply cannot build | FreeType 2 in debug mode with this compiler.. - - yet another massive grunt work. I've changed the definition of - the EXPORT_DEF, EXPORT_FUNC, BASE_DEF & BASE_FUNC macros. These - now take an argument, which is the function's return value type. + - yet another massive grunt work. I've changed the definition of the + EXPORT_DEF, EXPORT_FUNC, BASE_DEF & BASE_FUNC macros. These now + take an argument, which is the function's return value type. This is necessary to compile FreeType as a DLL on Windows and OS/2. Depending on the compiler used, a compiler-specific keyword @@ -1816,7 +1577,7 @@ OLD CHANGES 16 May 2000 after (BorlandC++) the type.. Of course, this needed a lot of changes throughout the source code - to make it compile again... All cleaned up now, apparently.. + to make it compile again... All cleaned up now, apparently.. Note also that there is a new EXPORT_VAR macro defined to allow the _declaration_ of an exportable public (constant) @@ -1845,17 +1606,17 @@ OLD CHANGES 16 May 2000 (the implementation was already in "ftobjs.c"). - the file has been seriously updated in order - to allow the automatic generation of error message tables. See - the comments within it for more information. + to allow the automatic generation of error message tables. See the + comments within it for more information. - - major directory hierarchy re-organisation. This was done for two + - major directory hierarchy re-organisation. This was done for two things: * first, to ease the "manual" compilation of the library by requiring at lot less include paths :-) * second, to allow external programs to effectively access - internal data fields. For example, this can be extremely + internal data fields. For example, this can be extremely useful if someone wants to write a font producer or a font manager on top of FreeType. @@ -1868,15 +1629,14 @@ OLD CHANGES 16 May 2000 Some new include sub-directories are available: a. the "freetype/config" directory, contains two files used to - configure the build of the library. Client applications - should not need to look at these normally, but they can if - they want. + configure the build of the library. Client applications should + not need to look at these normally, but they can if they want. #include #include b. the "freetype/internal" directory, contains header files that - describes library internals. These are the header files that + describes library internals. These are the header files that were previously found in the "src/base" and "src/shared" directories. @@ -1959,9 +1719,9 @@ OLD CHANGES - 14-apr-2000 to handle the new XFree86 4.0 fonts (and a few other ones..) - the smooth renderer is now complete and supports sub-banding to - render large glyphs at high speed. However, it is still located - in "demos/src/ftgrays.c" and should move to the library itself in - the next beta. NOTE: The smooth renderer doesn't compile in + render large glyphs at high speed. However, it is still located in + "demos/src/ftgrays.c" and should move to the library itself in the + next beta.. NOTE: The smooth renderer doesn't compile in stand-alone mode anymore, but this should be fixed RSN.. - introduced convenience functions to more easily deal with glyph @@ -1974,14 +1734,14 @@ OLD CHANGES - 14-apr-2000 results). - changed the raster interface, in order to allow client - applications to provide their own span-drawing callbacks. - However, only the smooth renderer supports this. See - "FT_Raster_Params" in the file "include/ftimage.h". + applications to provide their own span-drawing callbacks. However, + only the smooth renderer supports this. See "FT_Raster_Params" in + the file "include/ftimage.h" - fixed a small bug in FT_MulFix that caused incorrect transform computation! - - Note: The tutorial is out-of-date. + - Note: The tutorial is out-of-date, grumpf.. :-( ====================================================================== @@ -2023,7 +1783,7 @@ OLD CHANGES - 12-mar-2000 OLD CHANGES - 22-feb-2000 - - introduced the "psnames" module. It is used to: + - introduced the "psnames" module. It is used to: o convert a Postscript glyph name into the equivalent Unicode character code (used by the Type 1 driver(s) to synthetize on @@ -2035,16 +1795,16 @@ OLD CHANGES - 22-feb-2000 names support routines, while the other two tables are used by the Type 1 driver(s)). - - introduced the "type1z" alternate Type 1 driver. This is a (still + - introduced the "type1z" alternate Type 1 driver. This is a (still experimental) driver for the Type 1 format that will ultimately - replace the one in "src/type1". It uses pattern matching to load - data from the font, instead of a finite state analyzer. It works - much better than the "old" driver with "broken" fonts. It is also + replace the one in "src/type1". It uses pattern matching to load + data from the font, instead of a finite state analyzer. It works + much better than the "old" driver with "broken" fonts. It is also much smaller (under 15 Kb). - the Type 1 drivers (both in "src/type1" and "src/type1z") are nearly complete. They both provide automatic Unicode charmap - synthesis through the "psnames" module. No re-encoding vector is + synthesis through the "psnames" module. No re-encoding vector is needed. (note that they still leak memory due to some code missing, and I'm getting lazy). @@ -2052,7 +1812,7 @@ OLD CHANGES - 22-feb-2000 wasn't exactly tested as it should ;-) - The TrueType glyph loader has been seriously rewritten (see the - file "src/truetype/ttgload.c". It is now much, much simpler as + file "src/truetype/ttgload.c". It is now much, much simpler as well as easier to read, maintain and understand :-) Preliminary versions introduced a memory leak that has been reported by Jack Davis, and is now fixed.. @@ -2103,7 +1863,7 @@ OLDER CHANGES - 27-jan-2000 drivers to co-exist peacefully - updated the "T1_Face" type to better separate Postscript font - content from the rest of the FT_Face structure. Might be used + content from the rest of the FT_Face structure. Might be used later by the CFF/Type2 driver.. - added an experimental replacement Type 1 driver featuring advanced @@ -2155,9 +1915,9 @@ High-Level Interface: field "face->glyph.format" - the list of available charmaps is directly accessible through - "face->charmaps", counting "face->num_charmaps" elements. Each + "face->charmaps", counting "face->num_charmaps" elements. Each charmap has an 'encoding' field which specifies which known - encoding it deals with. Valid values are, for example: + encoding it deals with. Valid values are, for example : ft_encoding_unicode (for ASCII, Latin-1 and Unicode) ft_encoding_apple_roman @@ -2165,7 +1925,7 @@ High-Level Interface: ft_encoding_adobe_standard ft_encoding_adobe_expert - other values may be added in the future. Each charmap still + other values may be added in the future. Each charmap still holds its "platform_id" and "encoding_id" values in case the encoding is too exotic for the current library @@ -2215,12 +1975,12 @@ Glyph Image Formats: should encompass all known bitmap types. Each new image format must provide at least one "raster", i.e. a - module capable of transforming the glyph image into a bitmap. It's + module capable of transforming the glyph image into a bitmap. It's also possible to change the default raster used for a given glyph image format. The default outline scan-converter now uses 128 levels of grays by - default, which tends to smooth many things. Note that the demo + default, which tends to smooth many things. Note that the demo programs have been updated significantly in order to display these.. @@ -2235,7 +1995,7 @@ Build system: it is not detected, with pseudo-standard compilation flags) - the ability to compile from the Makefiles with very different and - exotic compilers. Note that linking the library can be difficult + exotic compilers. Note that linking the library can be difficult for some platforms. For example, the file `config/win32/lcclib.bat' is invoked by the @@ -2246,9 +2006,9 @@ Build system: Here's how it works: - the first time you type `make', the build system runs a series of - sub-makefiles in order to detect your host platform. It then - dumps what it found, and creates a file called `config.mk' in the - current directory. This is a sub-Makefile used to define many + sub-makefiles in order to detect your host platform. It then dumps + what it found, and creates a file called `config.mk' in the + current directory. This is a sub-Makefile used to define many important Make variables used to build the library. - the second time, the build system detects the `config.mk' then use @@ -2262,7 +2022,7 @@ Build system: re-run make. Finally, the default compiler for all platforms is gcc (for now, - this will hopefully changed in the future). You can however specify + this will hopefully changed in the future). You can however specify a different compiler by specifying it after the 'setup' target as in: @@ -2286,7 +2046,7 @@ Portability: In the previous beta, a single FT_System object was used to encompass all low-level operations like thread synchronisation, - memory management and i/o access. This has been greatly simplified: + memory management and i/o access. This has been greatly simplified: - thread synchronisation has been dropped, for the simple reason that the library is already re-entrant, and that if you really @@ -2300,12 +2060,12 @@ Portability: - resources have disappeared (they created more problems than they solved), and i/o management have been simplified greatly as a - result. Streams are defined through FT_Stream objects, which - can be either memory-based or disk-based. + result. Streams are defined through FT_Stream objects, which can + be either memory-based or disk-based. Note that each face has its own stream, which is closed only when the face object is destroyed. Hence, a function like - TT_Flush_Face in 1.x cannot be directly supported. However, if + TT_Flush_Face in 1.x cannot be directly supported. However, if you really need something like this, you can easily tailor your own streams to achieve the same feature at a lower level (and use FT_Open_Face instead of FT_New_Face to create the face). @@ -2326,19 +2086,18 @@ Font Drivers: library at compile time is managed through a new configuration file called `config//ftmodule.h'. - This file is autogenerated when invoking `make modules'. This - target will parse all sub-directories of 'src', looking for a - "module.mk" rules file, used to describe the driver to the build - system. + This file is autogenerated when invoking `make modules'. This target + will parse all sub-directories of 'src', looking for a "module.mk" + rules file, used to describe the driver to the build system. Hence, one should call `make modules' each time a font driver is added or removed from the `src' directory. - Finally, this version provides a "pseudo-driver" in `src/sfnt'. - This driver doesn't support font files directly, but provides - services used by all TrueType-like font drivers. Hence, its code is - shared between the TrueType & OpenType font formats, and possibly - more formats to come if we're lucky.. + Finally, this version provides a "pseudo-driver" in `src/sfnt'. This + driver doesn't support font files directly, but provides services + used by all TrueType-like font drivers. Hence, its code is shared + between the TrueType & OpenType font formats, and possibly more + formats to come if we're lucky.. ---------------------------------------------------------------------- @@ -2352,14 +2111,14 @@ Extensions support: driver. Extension ids are now strings, rather than 4-byte tags, as this is - usually more readable. + usually more readable.. Each extension has: - some data, associated to each face object - an interface (table of function pointers) An extension that is format-specific should simply register itself - to the correct font driver. Here is some example code: + to the correct font driver. Here is some example code: // Registering an extensions // diff --git a/reactos/lib/freetype/docs/CUSTOMIZE b/reactos/lib/freetype/docs/CUSTOMIZE index 8709b3decb6..2961d174e63 100644 --- a/reactos/lib/freetype/docs/CUSTOMIZE +++ b/reactos/lib/freetype/docs/CUSTOMIZE @@ -101,15 +101,15 @@ IV. Overriding default configuration and module headers name the configuration headers. To do so, you need a custom "ft2build.h" whose content can be as simple as: - #ifndef __FT2_BUILD_MY_PLATFORM_H__ - #define __FT2_BUILD_MY_PLATFORM_H__ + #ifndef __FT2_BUILD_GENERIC_H__ + #define __FT2_BUILD_GENERIC_H__ - #define FT_CONFIG_OPTIONS_H - #define FT_CONFIG_MODULES_H + #define FT_CONFIG_OPTIONS_H + #define FT_CONFIG_MACROS_H #include - #endif /* __FT2_BUILD_MY_PLATFORM_H__ */ + #endif /* __FT2_BUILD_GENERIC_H__ */ Place those files in a separate directory, e.g.: diff --git a/reactos/lib/freetype/docs/VERSION.DLL b/reactos/lib/freetype/docs/VERSION.DLL index 5b178bdc4ba..2e1f1af45d6 100644 --- a/reactos/lib/freetype/docs/VERSION.DLL +++ b/reactos/lib/freetype/docs/VERSION.DLL @@ -51,10 +51,7 @@ libtool number, as well as the shared object number found on _most_ systems, but not all of them: release libtool so - ------------------------------- - 2.1.8 9.6.3 6.3.6 - 2.1.7 9.5.3 6.3.5 - 2.1.6 9.5.3 6.3.5 + -------------------------------------------------------------------- 2.1.5 9.4.3 6.3.4 2.1.4 9.3.3 6.3.3 2.1.3 9.2.3 6.3.2 @@ -63,8 +60,6 @@ systems, but not all of them: 2.1.0 8.0.2 ? 2.0.9 9.0.3 ? 2.0.8 8.0.2 ? - 2.0.4 7.0.1 ? - 2.0.1 6.1.0 ? The libtool numbers are a bit inconsistent due to the library's history: @@ -91,19 +86,19 @@ other release numbers. old_CPPFLAGS="$CPPFLAGS" CPPFLAGS=`freetype-config --cflags` AC_TRY_CPP([ - -#include -#include FT_FREETYPE_H +#include #if (FREETYPE_MAJOR*1000 + FREETYPE_MINOR)*1000 + FREETYPE_PATCH < 2000009 #error Freetype version too low. #endif - ], - [AC_MSG_RESULT(yes) - FREETYPE_LIBS=`freetype-config --libs` - AC_SUBST(FREETYPE_LIBS) - AC_DEFINE(HAVE_FREETYPE,1,[Define if you have the FreeType2 library]) - CPPFLAGS="$old_CPPFLAGS"], - [AC_MSG_ERROR([Need FreeType library version 2.0.9 or higher])]) + ],[ + AC_MSG_RESULT(yes) + FREETYPE_LIBS=`freetype-config --libs` + AC_SUBST(FREETYPE_LIBS) + AC_DEFINE(HAVE_FREETYPE,1,[Define if you have the FreeType2 library]) + CPPFLAGS="$old_CPPFLAGS" + ],[ + AC_MSG_ERROR([Need FreeType library version 2.0.9 or higher]) + ]) --- end of VERSION.DLL --- diff --git a/reactos/lib/freetype/docs/license.txt b/reactos/lib/freetype/docs/license.txt index 876cc4b93a5..dc011d1d560 100644 --- a/reactos/lib/freetype/docs/license.txt +++ b/reactos/lib/freetype/docs/license.txt @@ -2,27 +2,24 @@ The FreeType 2 font engine is copyrighted work and cannot be used legally without a software license. In order to make this project usable to a vast majority of developers, we distribute it under two -mutually exclusive open-source licenses. +mutually exclusive licenses. -This means that *you* must choose *one* of the two licenses described +This means that *you* must choose *one* license of the two described below, then obey all its terms and conditions when using FreeType 2 in any of your projects or products. - - The FreeType License, found in the file `FTL.TXT', which is similar - to the original BSD license *with* an advertising clause that forces - you to explicitly cite the FreeType project in your product's - documentation. All details are in the license file. This license - is suited to products which don't use the GNU General Public - License. + - The FreeType License, found in the file "FTL.TXT", which is an + BSD-style open-source license *with* an advertising clause that + forces you to explicitely cite the FreeType project in your + product's documentation. All details are in the license file. - - The GNU General Public License version 2, found in `GPL.TXT' (any - later version can be used also), for programs which already use the - GPL. Note that the FTL is incompatible with the GPL due to its - advertisement clause. + - The GNU General Public License, found in "GPL.TXT", which is the + traditionnal and "viral" GPL license that forces you to redistribute + the _complete_ sources of all your products that use FreeType 2. -The contributed PCF driver comes with a license similar to that of the X -Window System. It is compatible to the above two licenses (see file -src/pcf/readme). +Note that the contributed PCF driver comes with a license similar to +that of X Window System which is compatible to the above two licenses +(see file src/pcf/readme). --- end of licence.txt --- diff --git a/reactos/lib/freetype/docs/raster.txt b/reactos/lib/freetype/docs/raster.txt deleted file mode 100644 index 078c51aa19b..00000000000 --- a/reactos/lib/freetype/docs/raster.txt +++ /dev/null @@ -1,624 +0,0 @@ - - How FreeType's rasterizer work - - by David Turner - - Revised 2003-Dec-08 - - -This file is an attempt to explain the internals of the FreeType -rasterizer. The rasterizer is of quite general purpose and could -easily be integrated into other programs. - - - I. Introduction - - II. Rendering Technology - 1. Requirements - 2. Profiles and Spans - a. Sweeping the Shape - b. Decomposing Outlines into Profiles - c. The Render Pool - d. Computing Profiles Extents - e. Computing Profiles Coordinates - f. Sweeping and Sorting the Spans - - -I. Introduction -=============== - - A rasterizer is a library in charge of converting a vectorial - representation of a shape into a bitmap. The FreeType rasterizer - has been originally developed to render the glyphs found in - TrueType files, made up of segments and second-order B閦iers. - Meanwhile it has been extended to render third-order B閦ier curves - also. This document is an explanation of its design and - implementation. - - While these explanations start from the basics, a knowledge of - common rasterization techniques is assumed. - - -II. Rendering Technology -======================== - -1. Requirements ---------------- - - We assume that all scaling, rotating, hinting, etc., has been - already done. The glyph is thus described by a list of points in - the device space. - - - All point coordinates are in the 26.6 fixed float format. The - used orientation is: - - - ^ y - | reference orientation - | - *----> x - 0 - - - `26.6' means that 26 bits are used for the integer part of a - value and 6 bits are used for the fractional part. - Consequently, the `distance' between two neighbouring pixels is - 64 `units' (1 unit = 1/64th of a pixel). - - Note that, for the rasterizer, pixel centers are located at - integer coordinates. The TrueType bytecode interpreter, - however, assumes that the lower left edge of a pixel (which is - taken to be a square with a length of 1 unit) has integer - coordinates. - - - ^ y ^ y - | | - | (1,1) | (0.5,0.5) - +-----------+ +-----+-----+ - | | | | | - | | | | | - | | | o-----+-----> x - | | | (0,0) | - | | | | - o-----------+-----> x +-----------+ - (0,0) (-0.5,-0.5) - - TrueType bytecode interpreter FreeType rasterizer - - - A pixel line in the target bitmap is called a `scanline'. - - - A glyph is usually made of several contours, also called - `outlines'. A contour is simply a closed curve that delimits an - outer or inner region of the glyph. It is described by a series - of successive points of the points table. - - Each point of the glyph has an associated flag that indicates - whether it is `on' or `off' the curve. Two successive `on' - points indicate a line segment joining the two points. - - One `off' point amidst two `on' points indicates a second-degree - (conic) B閦ier parametric arc, defined by these three points - (the `off' point being the control point, and the `on' ones the - start and end points). Similarly, a third-degree (cubic) B閦ier - curve is described by four points (two `off' control points - between two `on' points). - - Finally, for second-order curves only, two successive `off' - points forces the rasterizer to create, during rendering, an - `on' point amidst them, at their exact middle. This greatly - facilitates the definition of successive B閦ier arcs. - - The parametric form of a second-order B閦ier curve is: - - P(t) = (1-t)^2*P1 + 2*t*(1-t)*P2 + t^2*P3 - - (P1 and P3 are the end points, P2 the control point.) - - The parametric form of a third-order B閦ier curve is: - - P(t) = (1-t)^3*P1 + 3*t*(1-t)^2*P2 + 3*t^2*(1-t)*P3 + t^3*P4 - - (P1 and P4 are the end points, P2 and P3 the control points.) - - For both formulae, t is a real number in the range [0..1]. - - Note that the rasterizer does not use these formulae directly. - They exhibit, however, one very useful property of B閦ier arcs: - Each point of the curve is a weighted average of the control - points. - - As all weights are positive and always sum up to 1, whatever the - value of t, each arc point lies within the triangle (polygon) - defined by the arc's three (four) control points. - - In the following, only second-order curves are discussed since - rasterization of third-order curves is completely identical. - - Here some samples for second-order curves. - - - * # on curve - * off curve - __---__ - #-__ _-- -_ - --__ _- - - --__ # \ - --__ # - -# - Two `on' points - Two `on' points and one `off' point - between them - - * - # __ Two `on' points with two `off' - \ - - points between them. The point - \ / \ marked `0' is the middle of the - - 0 \ `off' points, and is a `virtual - -_ _- # on' point where the curve passes. - -- It does not appear in the point - * list. - - -2. Profiles and Spans ---------------------- - - The following is a basic explanation of the _kind_ of computations - made by the rasterizer to build a bitmap from a vector - representation. Note that the actual implementation is slightly - different, due to performance tuning and other factors. - - However, the following ideas remain in the same category, and are - more convenient to understand. - - - a. Sweeping the Shape - - The best way to fill a shape is to decompose it into a number of - simple horizontal segments, then turn them on in the target - bitmap. These segments are called `spans'. - - __---__ - _-- -_ - _- - - - \ - / \ - / \ - | \ - - __---__ Example: filling a shape - _----------_ with spans. - _-------------- - ----------------\ - /-----------------\ This is typically done from the top - / \ to the bottom of the shape, in a - | | \ movement called a `sweep'. - V - - __---__ - _----------_ - _-------------- - ----------------\ - /-----------------\ - /-------------------\ - |---------------------\ - - - In order to draw a span, the rasterizer must compute its - coordinates, which are simply the x coordinates of the shape's - contours, taken on the y scanlines. - - - /---/ |---| Note that there are usually - /---/ |---| several spans per scanline. - | /---/ |---| - | /---/_______|---| When rendering this shape to the - V /----------------| current scanline y, we must - /-----------------| compute the x values of the - a /----| |---| points a, b, c, and d. - - - - * * - - - - * * - - y - - / / b c| |d - - - /---/ |---| - /---/ |---| And then turn on the spans a-b - /---/ |---| and c-d. - /---/_______|---| - /----------------| - /-----------------| - a /----| |---| - - - - ####### - - - - ##### - - y - - / / b c| |d - - - b. Decomposing Outlines into Profiles - - For each scanline during the sweep, we need the following - information: - - o The number of spans on the current scanline, given by the - number of shape points intersecting the scanline (these are - the points a, b, c, and d in the above example). - - o The x coordinates of these points. - - x coordinates are computed before the sweep, in a phase called - `decomposition' which converts the glyph into *profiles*. - - Put it simply, a `profile' is a contour's portion that can only - be either ascending or descending, i.e., it is monotonic in the - vertical direction (we also say y-monotonic). There is no such - thing as a horizontal profile, as we shall see. - - Here are a few examples: - - - this square - 1 2 - ---->---- is made of two - | | | | - | | profiles | | - ^ v ^ + v - | | | | - | | | | - ----<---- - - up down - - - this triangle - - P2 1 2 - - |\ is made of two | \ - ^ | \ \ | \ - | | \ \ profiles | \ | - | | \ v ^ | \ | - | \ | | + \ v - | \ | | \ - P1 ---___ \ ---___ \ - ---_\ ---_ \ - <--__ P3 up down - - - - A more general contour can be made of more than two profiles: - - __ ^ - / | / ___ / | - / | / | / | / | - | | / / => | v / / - | | | | | | ^ | - ^ | |___| | | ^ + | + | + v - | | | v | | - | | | up | - |___________| | down | - - <-- up down - - - Successive profiles are always joined by horizontal segments - that are not part of the profiles themselves. - - For the rasterizer, a profile is simply an *array* that - associates one horizontal *pixel* coordinate to each bitmap - *scanline* crossed by the contour's section containing the - profile. Note that profiles are *oriented* up or down along the - glyph's original flow orientation. - - In other graphics libraries, profiles are also called `edges' or - `edgelists'. - - - c. The Render Pool - - FreeType has been designed to be able to run well on _very_ - light systems, including embedded systems with very few memory. - - A render pool will be allocated once; the rasterizer uses this - pool for all its needs by managing this memory directly in it. - The algorithms that are used for profile computation make it - possible to use the pool as a simple growing heap. This means - that this memory management is actually quite easy and faster - than any kind of malloc()/free() combination. - - Moreover, we'll see later that the rasterizer is able, when - dealing with profiles too large and numerous to lie all at once - in the render pool, to immediately decompose recursively the - rendering process into independent sub-tasks, each taking less - memory to be performed (see `sub-banding' below). - - The render pool doesn't need to be large. A 4KByte pool is - enough for nearly all renditions, though nearly 100% slower than - a more confortable 16KByte or 32KByte pool (that was tested with - complex glyphs at sizes over 500 pixels). - - - d. Computing Profiles Extents - - Remember that a profile is an array, associating a _scanline_ to - the x pixel coordinate of its intersection with a contour. - - Though it's not exactly how the FreeType rasterizer works, it is - convenient to think that we need a profile's height before - allocating it in the pool and computing its coordinates. - - The profile's height is the number of scanlines crossed by the - y-monotonic section of a contour. We thus need to compute these - sections from the vectorial description. In order to do that, - we are obliged to compute all (local and global) y extrema of - the glyph (minima and maxima). - - - P2 For instance, this triangle has only - two y-extrema, which are simply - |\ - | \ P2.y as a vertical maximum - | \ P3.y as a vertical minimum - | \ - | \ P1.y is not a vertical extremum (though - | \ it is a horizontal minimum, which we - P1 ---___ \ don't need). - ---_\ - P3 - - - Note that the extrema are expressed in pixel units, not in - scanlines. The triangle's height is certainly (P3.y-P2.y+1) - pixel units, but its profiles' heights are computed in - scanlines. The exact conversion is simple: - - - min scanline = FLOOR ( min y ) - - max scanline = CEILING( max y ) - - A problem arises with B閦ier Arcs. While a segment is always - necessarily y-monotonic (i.e., flat, ascending, or descending), - which makes extrema computations easy, the ascent of an arc can - vary between its control points. - - - P2 - * - # on curve - * off curve - __-x--_ - _-- -_ - P1 _- - A non y-monotonic B閦ier arc. - # \ - - The arc goes from P1 to P3. - \ - \ P3 - # - - - We first need to be able to easily detect non-monotonic arcs, - according to their control points. I will state here, without - proof, that the monotony condition can be expressed as: - - P1.y <= P2.y <= P3.y for an ever-ascending arc - - P1.y >= P2.y >= P3.y for an ever-descending arc - - with the special case of - - P1.y = P2.y = P3.y where the arc is said to be `flat'. - - As you can see, these conditions can be very easily tested. - They are, however, extremely important, as any arc that does not - satisfy them necessarily contains an extremum. - - Note also that a monotonic arc can contain an extremum too, - which is then one of its `on' points: - - - P1 P2 - #---__ * P1P2P3 is ever-descending, but P1 - -_ is an y-extremum. - - - ---_ \ - -> \ - \ P3 - # - - - Let's go back to our previous example: - - - P2 - * - # on curve - * off curve - __-x--_ - _-- -_ - P1 _- - A non-y-monotonic B閦ier arc. - # \ - - Here we have - \ P2.y >= P1.y && - \ P3 P2.y >= P3.y (!) - # - - - We need to compute the vertical maximum of this arc to be able - to compute a profile's height (the point marked by an `x'). The - arc's equation indicates that a direct computation is possible, - but we rely on a different technique, which use will become - apparent soon. - - B閦ier arcs have the special property of being very easily - decomposed into two sub-arcs, which are themselves B閦ier arcs. - Moreover, it is easy to prove that there is at most one vertical - extremum on each B閦ier arc (for second-degree curves; similar - conditions can be found for third-order arcs). - - For instance, the following arc P1P2P3 can be decomposed into - two sub-arcs Q1Q2Q3 and R1R2R3: - - - P2 - * - # on curve - * off curve - - - original B閦ier arc P1P2P3. - __---__ - _-- --_ - _- -_ - - - - / \ - / \ - # # - P1 P3 - - - - P2 - * - - - - Q3 Decomposed into two subarcs - Q2 R2 Q1Q2Q3 and R1R2R3 - * __-#-__ * - _-- --_ - _- R1 -_ Q1 = P1 R3 = P3 - - - Q2 = (P1+P2)/2 R2 = (P2+P3)/2 - / \ - / \ Q3 = R1 = (Q2+R2)/2 - # # - Q1 R3 Note that Q2, R2, and Q3=R1 - are on a single line which is - tangent to the curve. - - - We have then decomposed a non-y-monotonic B閦ier curve into two - smaller sub-arcs. Note that in the above drawing, both sub-arcs - are monotonic, and that the extremum is then Q3=R1. However, in - a more general case, only one sub-arc is guaranteed to be - monotonic. Getting back to our former example: - - - Q2 - * - - __-x--_ R1 - _-- #_ - Q1 _- Q3 - R2 - # \ * - - - \ - \ R3 - # - - - Here, we see that, though Q1Q2Q3 is still non-monotonic, R1R2R3 - is ever descending: We thus know that it doesn't contain the - extremum. We can then re-subdivide Q1Q2Q3 into two sub-arcs and - go on recursively, stopping when we encounter two monotonic - subarcs, or when the subarcs become simply too small. - - We will finally find the vertical extremum. Note that the - iterative process of finding an extremum is called `flattening'. - - - e. Computing Profiles Coordinates - - Once we have the height of each profile, we are able to allocate - it in the render pool. The next task is to compute coordinates - for each scanline. - - In the case of segments, the computation is straightforward, - using the Euclidian algorithm (also known as Bresenham). - However, for B閦ier arcs, the job is a little more complicated. - - We assume that all B閦iers that are part of a profile are the - result of flattening the curve, which means that they are all - y-monotonic (ascending or descending, and never flat). We now - have to compute the intersections of arcs with the profile's - scanlines. One way is to use a similar scheme to flattening - called `stepping'. - - - Consider this arc, going from P1 to - --------------------- P3. Suppose that we need to - compute its intersections with the - drawn scanlines. As already - --------------------- mentioned this can be done - directly, but the involed algorithm - * P2 _---# P3 is far too slow. - ------------- _-- -- - _- - _/ Instead, it is still possible to - ---------/----------- use the decomposition property in - / the same recursive way, i.e., - | subdivide the arc into subarcs - ------|-------------- until these get too small to cross - | more than one scanline! - | - -----|--------------- This is very easily done using a - | rasterizer-managed stack of - | subarcs. - # P1 - - - f. Sweeping and Sorting the Spans - - Once all our profiles have been computed, we begin the sweep to - build (and fill) the spans. - - As both the TrueType and Type 1 specifications use the winding - fill rule (but with opposite directions), we place, on each - scanline, the present profiles in two separate lists. - - One list, called the `left' one, only contains ascending - profiles, while the other `right' list contains the descending - profiles. - - As each glyph is made of closed curves, a simple geometric - property ensures that the two lists contain the same number of - elements. - - Creating spans is thus straightforward: - - 1. We sort each list in increasing horizontal order. - - 2. We pair each value of the left list with its corresponding - value in the right list. - - - / / | | For example, we have here - / / | | four profiles. Two of - >/ / | | | them are ascending (1 & - 1// / ^ | | | 2 3), while the two others - // // 3| | | v are descending (2 & 4). - / //4 | | | On the given scanline, - a / /< | | the left list is (1,3), - - - - *-----* - - - - *---* - - y - and the right one is - / / b c| |d (4,2) (sorted). - - There are then two spans, joining - 1 to 4 (i.e. a-b) and 3 to 2 - (i.e. c-d)! - - - Sorting doesn't necessarily take much time, as in 99 cases out - of 100, the lists' order is kept from one scanline to the next. - We can thus implement it with two simple singly-linked lists, - sorted by a classic bubble-sort, which takes a minimum amount of - time when the lists are already sorted. - - A previous version of the rasterizer used more elaborate - structures, like arrays to perform `faster' sorting. It turned - out that this old scheme is not faster than the one described - above. - - Once the spans have been `created', we can simply draw them in - the target bitmap. - - ---- end of raster.txt --- - -Local Variables: -coding: latin-1 -End: diff --git a/reactos/lib/freetype/docs/reference/.cvsignore b/reactos/lib/freetype/docs/reference/.cvsignore deleted file mode 100644 index 2d19fc766d9..00000000000 --- a/reactos/lib/freetype/docs/reference/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -*.html diff --git a/reactos/lib/freetype/docs/release b/reactos/lib/freetype/docs/release index 7cf37b84968..df3ef5485c6 100644 --- a/reactos/lib/freetype/docs/release +++ b/reactos/lib/freetype/docs/release @@ -7,26 +7,12 @@ How to prepare a new release . builds/unix/configure.ac (version_info): Update according to the libtool rules, then regenerate the configure script. -. builds/freetype.mk (refdoc): Update the `--title' option. +. builds/freetype.mk (refdoc): Update the --title option. . docs/CHANGES: Document differences to last release. . README: Update. -. docs/VERSION.DLL: Document changed `version_info'. +. docs/VERSION.DLL: Document changed version_info. . ChangeLog: Announce new release. - -. Call `make refdoc' to update HTML reference. Copy it to - freetype2/docs/reference in the `www' CVS module and update the CVS. - Then call `update-www' in ~/cvs/scripts on www.freetype.org to - update and distribute everything to sourceforge. - -. Tag the CVS (freetype, ft2demos, www/freetype2/docs). - -. Update `make-release' and `make-current' in ~/cvs/scripts/ on - www.freetype.org, then call them. - -. Create an md5 checksum file (with md5sum). - -. Announce new release on announce@freetype.org and to relevant newsgroups. diff --git a/reactos/lib/freetype/freetype.def b/reactos/lib/freetype/freetype.def index c1f59970a18..6f1689ce818 100644 --- a/reactos/lib/freetype/freetype.def +++ b/reactos/lib/freetype/freetype.def @@ -29,7 +29,6 @@ FT_Done_Size FT_FloorFix FT_Free FT_Get_Char_Index -FT_Get_CMap_Language_ID FT_Get_First_Char FT_Get_Glyph_Name FT_Get_Kerning @@ -67,7 +66,6 @@ FT_Load_Char FT_Load_Glyph FT_Load_Sfnt_Table FT_Lookup_Renderer -ft_module_get_service FT_MulDiv FT_MulFix FT_MulTo64 @@ -84,7 +82,6 @@ FT_Outline_Done FT_Outline_Done_Internal FT_Outline_Get_Bitmap FT_Outline_Get_CBox -FT_Outline_Get_Orientation FT_Outline_New FT_Outline_New_Internal FT_Outline_Render @@ -97,7 +94,6 @@ FT_Render_Glyph FT_Render_Glyph_Internal FT_RoundFix FT_Select_Charmap -ft_service_list_lookup FT_Set_Char_Size FT_Set_Charmap FT_Set_Debug_Hook @@ -162,23 +158,16 @@ FT_Get_X11_Font_Format FT_Get_PFR_Advance FT_Get_PFR_Kerning FT_Get_PFR_Metrics -FT_Glyph_Stroke -FT_Glyph_StrokeBorder -FT_Outline_GetInsideBorder -FT_Outline_GetOutsideBorder FT_Stroker_BeginSubPath FT_Stroker_ConicTo FT_Stroker_CubicTo FT_Stroker_Done FT_Stroker_EndSubPath FT_Stroker_Export -FT_Stroker_ExportBorder -FT_Stroker_GetBorderCounts FT_Stroker_GetCounts FT_Stroker_LineTo FT_Stroker_New FT_Stroker_ParseOutline -FT_Stroker_Rewind FT_Stroker_Set FT_Get_WinFNT_Header FT_Outline_Get_BBox @@ -187,57 +176,50 @@ autohint_module_class ft_autohinter_service bdf_cmap_class bdf_driver_class -FTC_Cache_Clear -FTC_Cache_Done -FTC_Cache_Init -FTC_Cache_Lookup -FTC_Cache_NewNode -FTC_Cache_RemoveFaceID +FT_LruList_Destroy +FT_LruList_Lookup +FT_LruList_New +FT_LruList_Remove +FT_LruList_Remove_Selection +FT_LruList_Reset +ftc_cache_clear +ftc_cache_done +ftc_cache_init +ftc_cache_lookup ftc_cmap_cache_class FTC_CMapCache_Lookup FTC_CMapCache_New -FTC_Family_Init -FTC_GCache_Done -FTC_GCache_Init -FTC_GCache_Lookup -FTC_GCache_New -FTC_GNode_Compare -FTC_GNode_Done -FTC_GNode_Init -FTC_GNode_UnselectFamily +ftc_face_list_class +ftc_family_done +ftc_family_init +ftc_family_table_alloc +ftc_family_table_free +ftc_glyph_family_done +ftc_glyph_family_init +ftc_glyph_node_compare +ftc_glyph_node_done +ftc_glyph_node_init +ftc_image_cache_class +FTC_Image_Cache_Lookup +FTC_Image_Cache_New FTC_ImageCache_Lookup FTC_ImageCache_New -FTC_INode_Free -FTC_INode_New -FTC_INode_Weight FTC_Manager_Compress FTC_Manager_Done -FTC_Manager_FlushN -FTC_Manager_LookupFace -FTC_Manager_LookupSize +FTC_Manager_Lookup_Face +FTC_Manager_Lookup_Size FTC_Manager_New -FTC_Manager_RegisterCache -FTC_Manager_RemoveFaceID +FTC_Manager_Register_Cache FTC_Manager_Reset -FTC_MruList_Done -FTC_MruList_Find -FTC_MruList_Init -FTC_MruList_Lookup -FTC_MruList_New -FTC_MruList_Remove -FTC_MruList_RemoveSelection -FTC_MruList_Reset -FTC_MruNode_Prepend -FTC_MruNode_Remove -FTC_MruNode_Up ftc_node_destroy +ftc_node_done FTC_Node_Unref +ftc_sbit_cache_class +FTC_SBit_Cache_Lookup +FTC_SBit_Cache_New FTC_SBitCache_Lookup FTC_SBitCache_New -FTC_SNode_Compare -FTC_SNode_Free -FTC_SNode_New -FTC_SNode_Weight +ftc_size_list_class cff_cmap_encoding_class_rec cff_cmap_unicode_class_rec cff_driver_class @@ -251,7 +233,7 @@ RepadBitmap TwoByteSwap pfr_cmap_class_rec pfr_driver_class -pfr_metrics_service_rec +pfr_service_rec ps_parser_funcs ps_table_funcs psaux_module_class diff --git a/reactos/lib/freetype/include/freetype/cache/ftccache.h b/reactos/lib/freetype/include/freetype/cache/ftccache.h index 7c7688dba26..701b13eb0ee 100644 --- a/reactos/lib/freetype/include/freetype/cache/ftccache.h +++ b/reactos/lib/freetype/include/freetype/cache/ftccache.h @@ -4,7 +4,7 @@ /* */ /* FreeType internal cache interface (specification). */ /* */ -/* Copyright 2000-2001, 2002, 2003, 2004 by */ +/* Copyright 2000-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -20,7 +20,9 @@ #define __FTCCACHE_H__ -#include FT_CACHE_INTERNAL_MRU_H +/* define to allow cache lookup inlining */ +#define FTC_CACHE_USE_INLINE + FT_BEGIN_HEADER @@ -28,7 +30,13 @@ FT_BEGIN_HEADER typedef struct FTC_CacheRec_* FTC_Cache; /* handle to cache class */ - typedef const struct FTC_CacheClassRec_* FTC_CacheClass; + typedef const struct FTC_Cache_ClassRec_* FTC_Cache_Class; + + /* handle to cache node family */ + typedef struct FTC_FamilyRec_* FTC_Family; + + /* handle to cache root query */ + typedef struct FTC_QueryRec_* FTC_Query; /*************************************************************************/ @@ -54,11 +62,12 @@ FT_BEGIN_HEADER /* structure size should be 20 bytes on 32-bits machines */ typedef struct FTC_NodeRec_ { - FTC_MruNodeRec mru; /* circular mru list pointer */ - FTC_Node link; /* used for hashing */ - FT_UInt32 hash; /* used for hashing too */ - FT_UShort cache_index; /* index of cache the node belongs to */ - FT_Short ref_count; /* reference count for this node */ + FTC_Node mru_next; /* circular mru list pointer */ + FTC_Node mru_prev; /* circular mru list pointer */ + FTC_Node link; /* used for hashing */ + FT_UInt32 hash; /* used for hashing too */ + FT_UShort fam_index; /* index of family the node belongs to */ + FT_Short ref_count; /* reference count for this node */ } FTC_NodeRec; @@ -66,9 +75,6 @@ FT_BEGIN_HEADER #define FTC_NODE( x ) ( (FTC_Node)(x) ) #define FTC_NODE_P( x ) ( (FTC_Node*)(x) ) -#define FTC_NODE__NEXT(x) FTC_NODE( (x)->mru.next ) -#define FTC_NODE__PREV(x) FTC_NODE( (x)->mru.prev ) - /*************************************************************************/ /* */ @@ -77,12 +83,83 @@ FT_BEGIN_HEADER /* cache sub-system internals. */ /* */ + /* can be used as a FTC_Node_DoneFunc */ + FT_EXPORT( void ) + ftc_node_done( FTC_Node node, + FTC_Cache cache ); + /* reserved for manager's use */ FT_EXPORT( void ) ftc_node_destroy( FTC_Node node, FTC_Manager manager ); + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CACHE QUERY DEFINITIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* A structure modelling a cache node query. The following fields must */ + /* all be set by the @FTC_Family_CompareFunc method of a cache's family */ + /* list. */ + /* */ + typedef struct FTC_QueryRec_ + { + FTC_Family family; + FT_UFast hash; + + } FTC_QueryRec; + + +#define FTC_QUERY( x ) ( (FTC_Query)(x) ) +#define FTC_QUERY_P( x ) ( (FTC_Query*)(x) ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CACHE FAMILY DEFINITIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct FTC_FamilyRec_ + { + FT_LruNodeRec lru; + FTC_Cache cache; + FT_UInt num_nodes; + FT_UInt fam_index; + + } FTC_FamilyRec; + + +#define FTC_FAMILY( x ) ( (FTC_Family)(x) ) +#define FTC_FAMILY_P( x ) ( (FTC_Family*)(x) ) + + + /*************************************************************************/ + /* */ + /* These functions are exported so that they can be called from */ + /* user-provided cache classes; otherwise, they are really part of the */ + /* cache sub-system internals. */ + /* */ + + /* must be called by any FTC_Node_InitFunc routine */ + FT_EXPORT( FT_Error ) + ftc_family_init( FTC_Family family, + FTC_Query query, + FTC_Cache cache ); + + + /* can be used as a FTC_Family_DoneFunc; otherwise, must be called */ + /* by any family finalizer function */ + FT_EXPORT( void ) + ftc_family_done( FTC_Family family ); + + /*************************************************************************/ /*************************************************************************/ /***** *****/ @@ -91,12 +168,64 @@ FT_BEGIN_HEADER /*************************************************************************/ /*************************************************************************/ + /* each cache really implements a dynamic hash table to manage its nodes */ + typedef struct FTC_CacheRec_ + { + FTC_Manager manager; + FT_Memory memory; + FTC_Cache_Class clazz; + + FT_UInt cache_index; /* in manager's table */ + FT_Pointer cache_data; /* used by cache node methods */ + + FT_UFast p; + FT_UFast mask; + FT_Long slack; + FTC_Node* buckets; + + FT_LruList_ClassRec family_class; + FT_LruList families; + + } FTC_CacheRec; + + +#define FTC_CACHE( x ) ( (FTC_Cache)(x) ) +#define FTC_CACHE_P( x ) ( (FTC_Cache*)(x) ) + + + /* initialize a given cache */ + typedef FT_Error + (*FTC_Cache_InitFunc)( FTC_Cache cache ); + + /* clear a cache */ + typedef void + (*FTC_Cache_ClearFunc)( FTC_Cache cache ); + + /* finalize a given cache */ + typedef void + (*FTC_Cache_DoneFunc)( FTC_Cache cache ); + + + typedef FT_Error + (*FTC_Family_InitFunc)( FTC_Family family, + FTC_Query query, + FTC_Cache cache ); + + typedef FT_Int + (*FTC_Family_CompareFunc)( FTC_Family family, + FTC_Query query ); + + typedef void + (*FTC_Family_DoneFunc)( FTC_Family family, + FTC_Cache cache ); + /* initialize a new cache node */ typedef FT_Error - (*FTC_Node_NewFunc)( FTC_Node *pnode, - FT_Pointer query, - FTC_Cache cache ); + (*FTC_Node_InitFunc)( FTC_Node node, + FT_Pointer type, + FTC_Cache cache ); + /* compute the weight of a given cache node */ typedef FT_ULong (*FTC_Node_WeightFunc)( FTC_Node node, FTC_Cache cache ); @@ -107,159 +236,62 @@ FT_BEGIN_HEADER FT_Pointer key, FTC_Cache cache ); - + /* finalize a given cache node */ typedef void - (*FTC_Node_FreeFunc)( FTC_Node node, + (*FTC_Node_DoneFunc)( FTC_Node node, FTC_Cache cache ); - typedef FT_Error - (*FTC_Cache_InitFunc)( FTC_Cache cache ); - typedef void - (*FTC_Cache_DoneFunc)( FTC_Cache cache ); - - - typedef struct FTC_CacheClassRec_ + typedef struct FTC_Cache_ClassRec_ { - FTC_Node_NewFunc node_new; - FTC_Node_WeightFunc node_weight; - FTC_Node_CompareFunc node_compare; - FTC_Node_CompareFunc node_remove_faceid; - FTC_Node_FreeFunc node_free; + FT_UInt cache_size; + FTC_Cache_InitFunc cache_init; + FTC_Cache_ClearFunc cache_clear; + FTC_Cache_DoneFunc cache_done; - FT_UInt cache_size; - FTC_Cache_InitFunc cache_init; - FTC_Cache_DoneFunc cache_done; + FT_UInt family_size; + FTC_Family_InitFunc family_init; + FTC_Family_CompareFunc family_compare; + FTC_Family_DoneFunc family_done; - } FTC_CacheClassRec; + FT_UInt node_size; + FTC_Node_InitFunc node_init; + FTC_Node_WeightFunc node_weight; + FTC_Node_CompareFunc node_compare; + FTC_Node_DoneFunc node_done; + + } FTC_Cache_ClassRec; - /* each cache really implements a dynamic hash table to manage its nodes */ - typedef struct FTC_CacheRec_ - { - FT_UFast p; - FT_UFast mask; - FT_Long slack; - FTC_Node* buckets; - - FTC_CacheClassRec clazz; /* local copy, for speed */ - - FTC_Manager manager; - FT_Memory memory; - FT_UInt index; /* in manager's table */ - - FTC_CacheClass org_class; /* original class pointer */ - - } FTC_CacheRec; + /* */ -#define FTC_CACHE( x ) ( (FTC_Cache)(x) ) -#define FTC_CACHE_P( x ) ( (FTC_Cache*)(x) ) + /*************************************************************************/ + /* */ + /* These functions are exported so that they can be called from */ + /* user-provided cache classes; otherwise, they are really part of the */ + /* cache sub-system internals. */ + /* */ - - /* default cache initialize */ - FT_EXPORT( FT_Error ) - FTC_Cache_Init( FTC_Cache cache ); - - /* default cache finalizer */ + /* can be used directly as FTC_Cache_DoneFunc(), or called by custom */ + /* cache finalizers */ FT_EXPORT( void ) - FTC_Cache_Done( FTC_Cache cache ); + ftc_cache_done( FTC_Cache cache ); - /* Call this function to lookup the cache. If no corresponding - * node is found, a new one is automatically created. This function - * is capable of flushing the cache adequately to make room for the - * new cache object. - */ - FT_EXPORT( FT_Error ) - FTC_Cache_Lookup( FTC_Cache cache, - FT_UInt32 hash, - FT_Pointer query, - FTC_Node *anode ); - - FT_EXPORT( FT_Error ) - FTC_Cache_NewNode( FTC_Cache cache, - FT_UInt32 hash, - FT_Pointer query, - FTC_Node *anode ); - - /* Remove all nodes that relate to a given face_id. This is useful - * when un-installing fonts. Note that if a cache node relates to - * the face_id, but is locked (i.e., has 'ref_count > 0'), the node - * will _not_ be destroyed, but its internal face_id reference will - * be modified. - * - * The final result will be that the node will never come back - * in further lookup requests, and will be flushed on demand from - * the cache normally when its reference count reaches 0. - */ + /* can be used directly as FTC_Cache_ClearFunc(), or called by custom */ + /* cache clear routines */ FT_EXPORT( void ) - FTC_Cache_RemoveFaceID( FTC_Cache cache, - FTC_FaceID face_id ); + ftc_cache_clear( FTC_Cache cache ); + /* initalize the hash table within the cache */ + FT_EXPORT( FT_Error ) + ftc_cache_init( FTC_Cache cache ); -#ifdef FTC_INLINE - -#define FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ) \ - FT_BEGIN_STMNT \ - FTC_Node *_bucket, *_pnode, _node; \ - FTC_Cache _cache = FTC_CACHE(cache); \ - FT_UInt32 _hash = (FT_UInt32)(hash); \ - FTC_Node_CompareFunc _nodcomp = (FTC_Node_CompareFunc)(nodecmp); \ - FT_UInt _idx; \ - \ - \ - error = 0; \ - node = NULL; \ - _idx = _hash & _cache->mask; \ - if ( _idx < _cache->p ) \ - _idx = _hash & ( _cache->mask*2 + 1 ); \ - \ - _bucket = _pnode = _cache->buckets + _idx; \ - for (;;) \ - { \ - _node = *_pnode; \ - if ( _node == NULL ) \ - goto _NewNode; \ - \ - if ( _node->hash == _hash && _nodcomp( _node, query, _cache ) ) \ - break; \ - \ - _pnode = &_node->link; \ - } \ - \ - if ( _node != *_bucket ) \ - { \ - *_pnode = _node->link; \ - _node->link = *_bucket; \ - *_bucket = _node; \ - } \ - \ - { \ - FTC_Manager _manager = _cache->manager; \ - \ - \ - if ( _node != _manager->nodes_list ) \ - FTC_MruNode_Up( (FTC_MruNode*)&_manager->nodes_list, \ - (FTC_MruNode)_node ); \ - } \ - goto _Ok; \ - \ - _NewNode: \ - error = FTC_Cache_NewNode( _cache, _hash, query, &_node ); \ - \ - _Ok: \ - *(FTC_Node*)&(node) = _node; \ - FT_END_STMNT - -#else /* !FTC_INLINE */ - -#define FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ) \ - FT_BEGIN_STMNT \ - error = FTC_Cache_Lookup( FTC_CACHE( cache ), hash, query, \ - (FTC_Node*)&(node) ); \ - FT_END_STMNT - -#endif /* !FTC_INLINE */ + /* can be called when the key's hash value has been computed */ + FT_EXPORT( FT_Error ) + ftc_cache_lookup( FTC_Cache cache, + FTC_Query query, + FTC_Node *anode ); /* */ diff --git a/reactos/lib/freetype/include/freetype/cache/ftcglyph.h b/reactos/lib/freetype/include/freetype/cache/ftcglyph.h index be237f934ad..8a2f0f3a7e2 100644 --- a/reactos/lib/freetype/include/freetype/cache/ftcglyph.h +++ b/reactos/lib/freetype/include/freetype/cache/ftcglyph.h @@ -4,7 +4,7 @@ /* */ /* FreeType abstract glyph cache (specification). */ /* */ -/* Copyright 2000-2001, 2003, 2004 by */ +/* Copyright 2000-2001, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -16,84 +16,13 @@ /***************************************************************************/ - /* - * - * FTC_GCache is an _abstract_ cache object optimized to store glyph - * data. It works as follows: - * - * - It manages FTC_GNode objects. Each one of them can hold one or more - * glyph `items'. Item types are not specified in the FTC_GCache but - * in classes that extend it. - * - * - Glyph attributes, like face ID, character size, render mode, etc., - * can be grouped into abstract `glyph families'. This avoids storing - * the attributes within the FTC_GCache, since it is likely that many - * FTC_GNodes will belong to the same family in typical uses. - * - * - Each FTC_GNode is thus an FTC_Node with two additional fields: - * - * * gindex: A glyph index, or the first index in a glyph range. - * * family: A pointer to a glyph `family'. - * - * - Family types are not fully specific in the FTC_Family type, but - * by classes that extend it. - * - * Note that both FTC_ImageCache and FTC_SBitCache extend FTC_GCache. - * They share an FTC_Family sub-class called FTC_BasicFamily which is - * used to store the following data: face ID, pixel/point sizes, load - * flags. For more details see the file `src/cache/ftcbasic.c'. - * - * Client applications can extend FTC_GNode with their own FTC_GNode - * and FTC_Family sub-classes to implement more complex caches (e.g., - * handling automatic synthesis, like obliquing & emboldening, colored - * glyphs, etc.). - * - * See also the FTC_ICache & FTC_SCache classes in `ftcimage.h' and - * `ftcsbits.h', which both extend FTC_GCache with additional - * optimizations. - * - * A typical FTC_GCache implementation must provide at least the - * following: - * - * - FTC_GNode sub-class, e.g. MyNode, with relevant methods: - * my_node_new (must call FTC_GNode_Init) - * my_node_free (must call FTC_GNode_Done) - * my_node_compare (must call FTC_GNode_Compare) - * my_node_remove_faceid (must call ftc_gnode_unselect in case - * of match) - * - * - FTC_Family sub-class, e.g. MyFamily, with relevant methods: - * my_family_compare - * my_family_init - * my_family_reset (optional) - * my_family_done - * - * - FTC_GQuery sub-class, e.g. MyQuery, to hold cache-specific query - * data. - * - * - Constant structures for a FTC_GNodeClass. - * - * - MyCacheNew() can be implemented easily as a call to the convenience - * function FTC_GCache_New. - * - * - MyCacheLookup with a call to FTC_GCache_Lookup. This function will - * automatically: - * - * - Search for the corresponding family in the cache, or create - * a new one if necessary. Put it in FTC_GQUERY(myquery).family - * - * - Call FTC_Cache_Lookup. - * - * If it returns NULL, you should create a new node, then call - * ftc_cache_add as usual. - */ - - /*************************************************************************/ /* */ /* Important: The functions defined in this file are only used to */ /* implement an abstract glyph cache class. You need to */ /* provide additional logic to implement a complete cache. */ + /* For example, see `ftcimage.h' and `ftcimage.c' which */ + /* implement a FT_Glyph cache based on this code. */ /* */ /*************************************************************************/ @@ -118,53 +47,99 @@ #include -#include FT_CACHE_INTERNAL_MANAGER_H +#include FT_CACHE_H +#include FT_CACHE_MANAGER_H + +#include FT_BEGIN_HEADER - /* - * We can group glyphs into `families'. Each family correspond to a - * given face ID, character size, transform, etc. - * - * Families are implemented as MRU list nodes. They are - * reference-counted. - */ + /* each glyph set is characterized by a "glyph set type" which must be */ + /* defined by sub-classes */ + typedef struct FTC_GlyphFamilyRec_* FTC_GlyphFamily; - typedef struct FTC_FamilyRec_ + /* handle to a glyph cache node */ + typedef struct FTC_GlyphNodeRec_* FTC_GlyphNode; + + + /* size should be 24 + chunk size on 32-bit machines; */ + /* note that the node's hash is ((gfam->hash << 16) | glyph_index) -- */ + /* this _must_ be set properly by the glyph node initializer */ + /* */ + typedef struct FTC_GlyphNodeRec_ { - FTC_MruNodeRec mrunode; - FT_UInt num_nodes; /* current number of nodes in this family */ - FTC_Cache cache; - FTC_MruListClass clazz; + FTC_NodeRec node; + FT_UShort item_count; + FT_UShort item_start; - } FTC_FamilyRec, *FTC_Family; - -#define FTC_FAMILY(x) ( (FTC_Family)(x) ) -#define FTC_FAMILY_P(x) ( (FTC_Family*)(x) ) + } FTC_GlyphNodeRec; - typedef struct FTC_GNodeRec_ +#define FTC_GLYPH_NODE( x ) ( (FTC_GlyphNode)(x) ) +#define FTC_GLYPH_NODE_P( x ) ( (FTC_GlyphNode*)(x) ) + + + typedef struct FTC_GlyphQueryRec_ { - FTC_NodeRec node; - FTC_Family family; - FT_UInt gindex; + FTC_QueryRec query; + FT_UInt gindex; - } FTC_GNodeRec, *FTC_GNode; - -#define FTC_GNODE( x ) ( (FTC_GNode)(x) ) -#define FTC_GNODE_P( x ) ( (FTC_GNode*)(x) ) + } FTC_GlyphQueryRec, *FTC_GlyphQuery; - typedef struct FTC_GQueryRec_ +#define FTC_GLYPH_QUERY( x ) ( (FTC_GlyphQuery)(x) ) + + + /* a glyph set is used to categorize glyphs of a given type */ + typedef struct FTC_GlyphFamilyRec_ { - FT_UInt gindex; - FTC_Family family; + FTC_FamilyRec family; + FT_UInt32 hash; + FT_UInt item_total; /* total number of glyphs in family */ + FT_UInt item_count; /* number of glyph items per node */ - } FTC_GQueryRec, *FTC_GQuery; + } FTC_GlyphFamilyRec; -#define FTC_GQUERY( x ) ( (FTC_GQuery)(x) ) + +#define FTC_GLYPH_FAMILY( x ) ( (FTC_GlyphFamily)(x) ) +#define FTC_GLYPH_FAMILY_P( x ) ( (FTC_GlyphFamily*)(x) ) + +#define FTC_GLYPH_FAMILY_MEMORY( x ) FTC_FAMILY(x)->cache->memory + + + /* each glyph node contains a 'chunk' of glyph items; */ + /* translate a glyph index into a chunk index */ +#define FTC_GLYPH_FAMILY_CHUNK( gfam, gindex ) \ + ( ( gindex ) / FTC_GLYPH_FAMILY( gfam )->item_count ) + + /* find a glyph index's chunk, and return its start index */ +#define FTC_GLYPH_FAMILY_START( gfam, gindex ) \ + ( FTC_GLYPH_FAMILY_CHUNK( gfam, gindex ) * \ + FTC_GLYPH_FAMILY( gfam )->item_count ) + + /* compute a glyph request's hash value */ +#define FTC_GLYPH_FAMILY_HASH( gfam, gindex ) \ + ( (FT_UFast)( \ + ( FTC_GLYPH_FAMILY( gfam )->hash << 16 ) | \ + ( FTC_GLYPH_FAMILY_CHUNK( gfam, gindex ) & 0xFFFFU ) ) ) + + /* must be called in an FTC_Family_CompareFunc to update the query */ + /* whenever a glyph set is matched in the lookup, or when it */ + /* is created */ +#define FTC_GLYPH_FAMILY_FOUND( gfam, gquery ) \ + do \ + { \ + FTC_QUERY( gquery )->family = FTC_FAMILY( gfam ); \ + FTC_QUERY( gquery )->hash = \ + FTC_GLYPH_FAMILY_HASH( gfam, \ + FTC_GLYPH_QUERY( gquery )->gindex ); \ + } while ( 0 ) + + /* retrieve glyph index of glyph node */ +#define FTC_GLYPH_NODE_GINDEX( x ) \ + ( (FT_UInt)( FTC_GLYPH_NODE( x )->node.hash & 0xFFFFU ) ) /*************************************************************************/ @@ -176,116 +151,39 @@ FT_BEGIN_HEADER /* must be called by derived FTC_Node_InitFunc routines */ FT_EXPORT( void ) - FTC_GNode_Init( FTC_GNode node, - FT_UInt gindex, /* glyph index for node */ - FTC_Family family ); + ftc_glyph_node_init( FTC_GlyphNode node, + FT_UInt gindex, /* glyph index for node */ + FTC_GlyphFamily gfam ); /* returns TRUE iff the query's glyph index correspond to the node; */ /* this assumes that the "family" and "hash" fields of the query are */ /* already correctly set */ FT_EXPORT( FT_Bool ) - FTC_GNode_Compare( FTC_GNode gnode, - FTC_GQuery gquery ); - - /* call this function to clear a node's family -- this is necessary */ - /* to implement the `node_remove_faceid' cache method correctly */ - FT_EXPORT( void ) - FTC_GNode_UnselectFamily( FTC_GNode gnode, - FTC_Cache cache ); + ftc_glyph_node_compare( FTC_GlyphNode gnode, + FTC_GlyphQuery gquery ); /* must be called by derived FTC_Node_DoneFunc routines */ FT_EXPORT( void ) - FTC_GNode_Done( FTC_GNode node, - FTC_Cache cache ); + ftc_glyph_node_done( FTC_GlyphNode node, + FTC_Cache cache ); + /* must be called by derived FTC_Family_InitFunc; */ + /* calls "ftc_family_init" */ + FT_EXPORT( FT_Error ) + ftc_glyph_family_init( FTC_GlyphFamily gfam, + FT_UInt32 hash, + FT_UInt item_count, + FT_UInt item_total, + FTC_GlyphQuery gquery, + FTC_Cache cache ); + FT_EXPORT( void ) - FTC_Family_Init( FTC_Family family, - FTC_Cache cache ); - - typedef struct FTC_GCacheRec_ - { - FTC_CacheRec cache; - FTC_MruListRec families; - - } FTC_GCacheRec, *FTC_GCache; - -#define FTC_GCACHE( x ) ((FTC_GCache)(x)) + ftc_glyph_family_done( FTC_GlyphFamily gfam ); - /* can be used as @FTC_Cache_InitFunc */ - FT_EXPORT( FT_Error ) - FTC_GCache_Init( FTC_GCache cache ); - - - /* can be used as @FTC_Cache_DoneFunc */ - FT_EXPORT( void ) - FTC_GCache_Done( FTC_GCache cache ); - - - /* the glyph cache class adds fields for the family implementation */ - typedef struct FTC_GCacheClassRec_ - { - FTC_CacheClassRec clazz; - FTC_MruListClass family_class; - - } FTC_GCacheClassRec; - - typedef const FTC_GCacheClassRec* FTC_GCacheClass; - -#define FTC_GCACHE_CLASS( x ) ((FTC_GCacheClass)(x)) - -#define FTC_CACHE__GCACHE_CLASS( x ) \ - FTC_GCACHE_CLASS( FTC_CACHE(x)->org_class ) -#define FTC_CACHE__FAMILY_CLASS( x ) \ - ((FTC_MruListClass) FTC_CACHE__GCACHE_CLASS(x)->family_class) - - - /* convenience function; use it instead of FTC_Manager_Register_Cache */ - FT_EXPORT( FT_Error ) - FTC_GCache_New( FTC_Manager manager, - FTC_GCacheClass clazz, - FTC_GCache *acache ); - - FT_EXPORT( FT_Error ) - FTC_GCache_Lookup( FTC_GCache cache, - FT_UInt32 hash, - FT_UInt gindex, - FTC_GQuery query, - FTC_Node *anode ); - - -#ifdef FTC_INLINE - -#define FTC_GCACHE_LOOKUP_CMP( cache, famcmp, nodecmp, hash, \ - gindex, query, node, error ) \ - FT_BEGIN_STMNT \ - FTC_GCache _gcache = FTC_GCACHE( cache ); \ - FTC_GQuery _gquery = (FTC_GQuery)( query ); \ - FTC_MruNode_CompareFunc _fcompare = (FTC_MruNode_CompareFunc)(famcmp); \ - \ - \ - _gquery->gindex = (gindex); \ - \ - FTC_MRULIST_LOOKUP_CMP( &_gcache->families, _gquery, _fcompare, \ - _gquery->family, error ); \ - if ( !error ) \ - FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ); \ - FT_END_STMNT /* */ - -#else /* !FTC_INLINE */ - -#define FTC_GCACHE_LOOKUP_CMP( cache, famcmp, nodecmp, hash, \ - gindex, query, node, error ) \ - FT_BEGIN_STMNT \ - error = FTC_GCache_Lookup( FTC_GCACHE( cache ), hash, gindex, \ - FTC_GQUERY( query ), (FTC_Node*)&(node) ); \ - FT_END_STMNT - -#endif /* !FTC_INLINE */ - - + FT_END_HEADER diff --git a/reactos/lib/freetype/include/freetype/cache/ftcimage.h b/reactos/lib/freetype/include/freetype/cache/ftcimage.h index 1bf12db13db..2d0b780e173 100644 --- a/reactos/lib/freetype/include/freetype/cache/ftcimage.h +++ b/reactos/lib/freetype/include/freetype/cache/ftcimage.h @@ -2,7 +2,7 @@ /* */ /* ftcimage.h */ /* */ -/* FreeType Generic Image cache (specification) */ +/* FreeType Image cache (specification). */ /* */ /* Copyright 2000-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ @@ -16,15 +16,6 @@ /***************************************************************************/ - /* - * FTC_ICache is an _abstract_ cache used to store a single FT_Glyph - * image per cache node. - * - * FTC_ICache extends FTC_GCache. For an implementation example, - * see FTC_ImageCache in `src/cache/ftbasic.c'. - */ - - /*************************************************************************/ /* */ /* Each image cache really manages FT_Glyph objects. */ @@ -38,66 +29,284 @@ #include #include FT_CACHE_H -#include FT_CACHE_INTERNAL_GLYPH_H + FT_BEGIN_HEADER - /* the FT_Glyph image node type - we store only 1 glyph per node */ - typedef struct FTC_INodeRec_ + /*************************************************************************/ + /* */ + /*
*/ + /* cache_subsystem */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** IMAGE CACHE OBJECT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @struct: + * FTC_ImageTypeRec + * + * @description: + * A simple structure used to describe the type of glyph image to be + * loaded into the cache. + * + * @fields: + * font :: An @FTC_FontRec used to describe the glyph's face and size. + * + * flags :: The load flags to be applied when loading the glyph; see + * the @FT_LOAD_XXX constants for details. + * + * @note: + * This type completely replaces the @FTC_Image_Desc structure which is + * now obsolete. + */ + typedef struct FTC_ImageTypeRec_ { - FTC_GNodeRec gnode; - FT_Glyph glyph; + FTC_FontRec font; + FT_Int32 flags; - } FTC_INodeRec, *FTC_INode; + } FTC_ImageTypeRec; -#define FTC_INODE( x ) ( (FTC_INode)( x ) ) -#define FTC_INODE_GINDEX( x ) FTC_GNODE(x)->gindex -#define FTC_INODE_FAMILY( x ) FTC_GNODE(x)->family + typedef struct FTC_ImageTypeRec_* FTC_ImageType; - typedef FT_Error - (*FTC_IFamily_LoadGlyphFunc)( FTC_Family family, - FT_UInt gindex, - FTC_Cache cache, - FT_Glyph *aglyph ); + /* */ - typedef struct FTC_IFamilyClassRec_ - { - FTC_MruListClassRec clazz; - FTC_IFamily_LoadGlyphFunc family_load_glyph; +#define FTC_IMAGE_TYPE_COMPARE( d1, d2 ) \ + ( FTC_FONT_COMPARE( &(d1)->font, &(d2)->font ) && \ + (d1)->flags == (d2)->flags ) - } FTC_IFamilyClassRec; - - typedef const FTC_IFamilyClassRec* FTC_IFamilyClass; - -#define FTC_IFAMILY_CLASS( x ) ((FTC_IFamilyClass)(x)) - -#define FTC_CACHE__IFAMILY_CLASS( x ) \ - FTC_IFAMILY_CLASS( FTC_CACHE__GCACHE_CLASS(x)->family_class ) +#define FTC_IMAGE_TYPE_HASH( d ) \ + (FT_UFast)( FTC_FONT_HASH( &(d)->font ) ^ \ + ( (d)->flags << 4 ) ) - /* can be used as a @FTC_Node_FreeFunc */ - FT_EXPORT( void ) - FTC_INode_Free( FTC_INode inode, - FTC_Cache cache ); + /*************************************************************************/ + /* */ + /* */ + /* FTC_ImageCache */ + /* */ + /* */ + /* A handle to an glyph image cache object. They are designed to */ + /* hold many distinct glyph images while not exceeding a certain */ + /* memory threshold. */ + /* */ + typedef struct FTC_ImageCacheRec_* FTC_ImageCache; - /* Can be used as @FTC_Node_NewFunc. `gquery.index' and `gquery.family' - * must be set correctly. This function will call the `family_load_glyph' - * method to load the FT_Glyph into the cache node. - */ + + /*************************************************************************/ + /* */ + /* */ + /* FTC_ImageCache_New */ + /* */ + /* */ + /* Creates a new glyph image cache. */ + /* */ + /* */ + /* manager :: The parent manager for the image cache. */ + /* */ + /* */ + /* acache :: A handle to the new glyph image cache object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ FT_EXPORT( FT_Error ) - FTC_INode_New( FTC_INode *pinode, - FTC_GQuery gquery, - FTC_Cache cache ); + FTC_ImageCache_New( FTC_Manager manager, + FTC_ImageCache *acache ); - /* can be used as @FTC_Node_WeightFunc */ - FT_EXPORT( FT_ULong ) - FTC_INode_Weight( FTC_INode inode ); + + /*************************************************************************/ + /* */ + /* */ + /* FTC_ImageCache_Lookup */ + /* */ + /* */ + /* Retrieves a given glyph image from a glyph image cache. */ + /* */ + /* */ + /* cache :: A handle to the source glyph image cache. */ + /* */ + /* type :: A pointer to a glyph image type descriptor. */ + /* */ + /* gindex :: The glyph index to retrieve. */ + /* */ + /* */ + /* aglyph :: The corresponding @FT_Glyph object. 0 in case of */ + /* failure. */ + /* */ + /* anode :: Used to return the address of of the corresponding cache */ + /* node after incrementing its reference count (see note */ + /* below). */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* The returned glyph is owned and managed by the glyph image cache. */ + /* Never try to transform or discard it manually! You can however */ + /* create a copy with @FT_Glyph_Copy and modify the new one. */ + /* */ + /* If "anode" is _not_ NULL, it receives the address of the cache */ + /* node containing the glyph image, after increasing its reference */ + /* count. This ensures that the node (as well as the FT_Glyph) will */ + /* always be kept in the cache until you call @FTC_Node_Unref to */ + /* "release" it. */ + /* */ + /* If "anode" is NULL, the cache node is left unchanged, which means */ + /* that the FT_Glyph could be flushed out of the cache on the next */ + /* call to one of the caching sub-system APIs. Don't assume that it */ + /* is persistent! */ + /* */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_Lookup( FTC_ImageCache cache, + FTC_ImageType type, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ); + + /* */ + +#define ftc_image_format( x ) ( (x) & 7 ) + + +#define ftc_image_format_bitmap 0x0000 +#define ftc_image_format_outline 0x0001 + +#define ftc_image_format_mask 0x000F + +#define ftc_image_flag_monochrome 0x0010 +#define ftc_image_flag_unhinted 0x0020 +#define ftc_image_flag_autohinted 0x0040 +#define ftc_image_flag_unscaled 0x0080 +#define ftc_image_flag_no_sbits 0x0100 + + /* monochrome bitmap */ +#define ftc_image_mono ftc_image_format_bitmap | \ + ftc_image_flag_monochrome + + /* anti-aliased bitmap */ +#define ftc_image_grays ftc_image_format_bitmap + + /* scaled outline */ +#define ftc_image_outline ftc_image_format_outline + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_Image_Desc */ + /* */ + /* */ + /* THIS TYPE IS DEPRECATED. Use @FTC_ImageTypeRec instead. */ + /* */ + /* A simple structure used to describe a given glyph image category. */ + /* */ + /* */ + /* font :: An @FTC_FontRec used to describe the glyph's face */ + /* and size. */ + /* */ + /* image_type :: The glyph image's type. */ + /* */ + typedef struct FTC_Image_Desc_ + { + FTC_FontRec font; + FT_UInt image_type; + + } FTC_Image_Desc; + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_Image_Cache */ + /* */ + /* */ + /* THIS TYPE IS DEPRECATED. Use @FTC_ImageCache instead. */ + /* */ + typedef FTC_ImageCache FTC_Image_Cache; + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_Image_Cache_New */ + /* */ + /* */ + /* THIS FUNCTION IS DEPRECATED. Use @FTC_ImageCache_New instead. */ + /* */ + /* Creates a new glyph image cache. */ + /* */ + /* */ + /* manager :: The parent manager for the image cache. */ + /* */ + /* */ + /* acache :: A handle to the new glyph image cache object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_Image_Cache_New( FTC_Manager manager, + FTC_Image_Cache *acache ); + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_Image_Cache_Lookup */ + /* */ + /* */ + /* THIS FUNCTION IS DEPRECATED. Use @FTC_ImageCache_Lookup instead. */ + /* */ + /* */ + /* cache :: A handle to the source glyph image cache. */ + /* */ + /* desc :: A pointer to a glyph image descriptor. */ + /* */ + /* gindex :: The glyph index to retrieve. */ + /* */ + /* */ + /* aglyph :: The corresponding @FT_Glyph object. 0 in case of */ + /* failure. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* The returned glyph is owned and managed by the glyph image cache. */ + /* Never try to transform or discard it manually! You can however */ + /* create a copy with @FT_Glyph_Copy and modify the new one. */ + /* */ + /* Because the glyph image cache limits the total amount of memory */ + /* taken by the glyphs it holds, the returned glyph might disappear */ + /* on a later invocation of this function! It is a cache after */ + /* all... */ + /* */ + /* Use this function to "lock" the glyph as long as it is needed. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_Image_Cache_Lookup( FTC_Image_Cache cache, + FTC_Image_Desc* desc, + FT_UInt gindex, + FT_Glyph *aglyph ); /* */ FT_END_HEADER + #endif /* __FTCIMAGE_H__ */ diff --git a/reactos/lib/freetype/include/freetype/cache/ftcmanag.h b/reactos/lib/freetype/include/freetype/cache/ftcmanag.h index 52658482286..97c77591b8d 100644 --- a/reactos/lib/freetype/include/freetype/cache/ftcmanag.h +++ b/reactos/lib/freetype/include/freetype/cache/ftcmanag.h @@ -4,7 +4,7 @@ /* */ /* FreeType Cache Manager (specification). */ /* */ -/* Copyright 2000-2001, 2003, 2004 by */ +/* Copyright 2000-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -65,7 +65,7 @@ #include #include FT_CACHE_H -#include FT_CACHE_INTERNAL_MRU_H +#include FT_CACHE_INTERNAL_LRU_H #include FT_CACHE_INTERNAL_CACHE_H @@ -88,25 +88,91 @@ FT_BEGIN_HEADER #define FTC_MAX_CACHES 16 + typedef struct FTC_FamilyEntryRec_ + { + FTC_Family family; + FTC_Cache cache; + FT_UInt index; + FT_UInt link; + + } FTC_FamilyEntryRec, *FTC_FamilyEntry; + + +#define FTC_FAMILY_ENTRY_NONE ( (FT_UInt)-1 ) + + + typedef struct FTC_FamilyTableRec_ + { + FT_UInt count; + FT_UInt size; + FTC_FamilyEntry entries; + FT_UInt free; + + } FTC_FamilyTableRec, *FTC_FamilyTable; + + + FT_EXPORT( FT_Error ) + ftc_family_table_alloc( FTC_FamilyTable table, + FT_Memory memory, + FTC_FamilyEntry *aentry ); + + FT_EXPORT( void ) + ftc_family_table_free( FTC_FamilyTable table, + FT_UInt idx ); + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_ManagerRec */ + /* */ + /* */ + /* The cache manager structure. */ + /* */ + /* */ + /* library :: A handle to a FreeType library instance. */ + /* */ + /* faces_list :: The lru list of @FT_Face objects in the cache. */ + /* */ + /* sizes_list :: The lru list of @FT_Size objects in the cache. */ + /* */ + /* max_weight :: The maximum cache pool weight. */ + /* */ + /* cur_weight :: The current cache pool weight. */ + /* */ + /* num_nodes :: The current number of nodes in the manager. */ + /* */ + /* nodes_list :: The global lru list of all cache nodes. */ + /* */ + /* caches :: A table of installed/registered cache objects. */ + /* */ + /* request_data :: User-provided data passed to the requester. */ + /* */ + /* request_face :: User-provided function used to implement a mapping */ + /* between abstract @FTC_FaceID values and real */ + /* @FT_Face objects. */ + /* */ + /* families :: Global table of families. */ + /* */ typedef struct FTC_ManagerRec_ { FT_Library library; - FT_Memory memory; + FT_LruList faces_list; + FT_LruList sizes_list; - FTC_Node nodes_list; FT_ULong max_weight; FT_ULong cur_weight; + FT_UInt num_nodes; - + FTC_Node nodes_list; + FTC_Cache caches[FTC_MAX_CACHES]; - FT_UInt num_caches; - - FTC_MruListRec faces; - FTC_MruListRec sizes; FT_Pointer request_data; FTC_Face_Requester request_face; + FTC_FamilyTableRec families; + } FTC_ManagerRec; @@ -135,40 +201,43 @@ FT_BEGIN_HEADER FTC_Manager_Compress( FTC_Manager manager ); - /* try to flush `count' old nodes from the cache; return the number - * of really flushed nodes - */ - FT_EXPORT( FT_UInt ) - FTC_Manager_FlushN( FTC_Manager manager, - FT_UInt count ); - - /* this must be used internally for the moment */ FT_EXPORT( FT_Error ) - FTC_Manager_RegisterCache( FTC_Manager manager, - FTC_CacheClass clazz, - FTC_Cache *acache ); + FTC_Manager_Register_Cache( FTC_Manager manager, + FTC_Cache_Class clazz, + FTC_Cache *acache ); - /* */ -#define FTC_SCALER_COMPARE( a, b ) \ - ( (a)->face_id == (b)->face_id && \ - (a)->width == (b)->width && \ - (a)->height == (b)->height && \ - ((a)->pixel != 0) == ((b)->pixel != 0) && \ - ( (a)->pixel || \ - ( (a)->x_res == (b)->x_res && \ - (a)->y_res == (b)->y_res ) ) ) + /* can be called to increment a node's reference count */ + FT_EXPORT( void ) + FTC_Node_Ref( FTC_Node node, + FTC_Manager manager ); -#define FTC_SCALER_HASH( q ) \ - ( FTC_FACE_ID_HASH( (q)->face_id ) + \ - (q)->width + (q)->height*7 + \ - ( (q)->pixel ? 0 : ( (q)->x_res*33 ^ (q)->y_res*61 ) ) ) + + /*************************************************************************/ + /* */ + /* */ + /* FTC_Node_Unref */ + /* */ + /* */ + /* Decrement a cache node's internal reference count. When the count */ + /* reaches 0, it is not destroyed but becomes eligible for subsequent */ + /* cache flushes. */ + /* */ + /* */ + /* node :: The cache node handle. */ + /* */ + /* manager :: The cache manager handle. */ + /* */ + FT_EXPORT( void ) + FTC_Node_Unref( FTC_Node node, + FTC_Manager manager ); /* */ FT_END_HEADER + #endif /* __FTCMANAG_H__ */ diff --git a/reactos/lib/freetype/include/freetype/cache/ftcmru.h b/reactos/lib/freetype/include/freetype/cache/ftcmru.h deleted file mode 100644 index 9556f58e75e..00000000000 --- a/reactos/lib/freetype/include/freetype/cache/ftcmru.h +++ /dev/null @@ -1,246 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftcmru.h */ -/* */ -/* Simple MRU list-cache (specification). */ -/* */ -/* Copyright 2000-2001, 2003, 2004 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* An MRU is a list that cannot hold more than a certain number of */ - /* elements (`max_elements'). All elements in the list are sorted in */ - /* least-recently-used order, i.e., the `oldest' element is at the tail */ - /* of the list. */ - /* */ - /* When doing a lookup (either through `Lookup()' or `Lookup_Node()'), */ - /* the list is searched for an element with the corresponding key. If */ - /* it is found, the element is moved to the head of the list and is */ - /* returned. */ - /* */ - /* If no corresponding element is found, the lookup routine will try to */ - /* obtain a new element with the relevant key. If the list is already */ - /* full, the oldest element from the list is discarded and replaced by a */ - /* new one; a new element is added to the list otherwise. */ - /* */ - /* Note that it is possible to pre-allocate the element list nodes. */ - /* This is handy if `max_elements' is sufficiently small, as it saves */ - /* allocations/releases during the lookup process. */ - /* */ - /*************************************************************************/ - - -#ifndef __FTCMRU_H__ -#define __FTCMRU_H__ - - -#include -#include FT_FREETYPE_H - -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - -#define xxFT_DEBUG_ERROR -#define FTC_INLINE - -FT_BEGIN_HEADER - - typedef struct FTC_MruNodeRec_* FTC_MruNode; - - typedef struct FTC_MruNodeRec_ - { - FTC_MruNode next; - FTC_MruNode prev; - - } FTC_MruNodeRec; - - - FT_EXPORT( void ) - FTC_MruNode_Prepend( FTC_MruNode *plist, - FTC_MruNode node ); - - FT_EXPORT( void ) - FTC_MruNode_Up( FTC_MruNode *plist, - FTC_MruNode node ); - - FT_EXPORT( void ) - FTC_MruNode_Remove( FTC_MruNode *plist, - FTC_MruNode node ); - - - typedef struct FTC_MruListRec_* FTC_MruList; - - typedef struct FTC_MruListClassRec_ const * FTC_MruListClass; - - - typedef FT_Int - (*FTC_MruNode_CompareFunc)( FTC_MruNode node, - FT_Pointer key ); - - typedef FT_Error - (*FTC_MruNode_InitFunc)( FTC_MruNode node, - FT_Pointer key, - FT_Pointer data ); - - typedef FT_Error - (*FTC_MruNode_ResetFunc)( FTC_MruNode node, - FT_Pointer key, - FT_Pointer data ); - - typedef void - (*FTC_MruNode_DoneFunc)( FTC_MruNode node, - FT_Pointer data ); - - - typedef struct FTC_MruListClassRec_ - { - FT_UInt node_size; - FTC_MruNode_CompareFunc node_compare; - FTC_MruNode_InitFunc node_init; - FTC_MruNode_ResetFunc node_reset; - FTC_MruNode_DoneFunc node_done; - - } FTC_MruListClassRec; - - typedef struct FTC_MruListRec_ - { - FT_UInt num_nodes; - FT_UInt max_nodes; - FTC_MruNode nodes; - FT_Pointer data; - FTC_MruListClassRec clazz; - FT_Memory memory; - - } FTC_MruListRec; - - - FT_EXPORT( void ) - FTC_MruList_Init( FTC_MruList list, - FTC_MruListClass clazz, - FT_UInt max_nodes, - FT_Pointer data, - FT_Memory memory ); - - FT_EXPORT( void ) - FTC_MruList_Reset( FTC_MruList list ); - - - FT_EXPORT( void ) - FTC_MruList_Done( FTC_MruList list ); - - FT_EXPORT( FTC_MruNode ) - FTC_MruList_Find( FTC_MruList list, - FT_Pointer key ); - - FT_EXPORT( FT_Error ) - FTC_MruList_New( FTC_MruList list, - FT_Pointer key, - FTC_MruNode *anode ); - - FT_EXPORT( FT_Error ) - FTC_MruList_Lookup( FTC_MruList list, - FT_Pointer key, - FTC_MruNode *pnode ); - - - FT_EXPORT( void ) - FTC_MruList_Remove( FTC_MruList list, - FTC_MruNode node ); - - FT_EXPORT( void ) - FTC_MruList_RemoveSelection( FTC_MruList list, - FTC_MruNode_CompareFunc selection, - FT_Pointer key ); - - -#ifdef FTC_INLINE - -#define FTC_MRULIST_LOOKUP_CMP( list, key, compare, node, error ) \ - FT_BEGIN_STMNT \ - FTC_MruNode* _pfirst = &(list)->nodes; \ - FTC_MruNode_CompareFunc _compare = (FTC_MruNode_CompareFunc)(compare); \ - FTC_MruNode _first, _node; \ - \ - \ - error = 0; \ - _first = *(_pfirst); \ - _node = NULL; \ - \ - if ( _first ) \ - { \ - _node = _first; \ - do \ - { \ - if ( _compare( _node, (key) ) ) \ - { \ - if ( _node != _first ) \ - FTC_MruNode_Up( _pfirst, _node ); \ - \ - *(FTC_MruNode*)&(node) = _node; \ - goto _MruOk; \ - } \ - _node = _node->next; \ - \ - } while ( _node != _first) ; \ - } \ - \ - error = FTC_MruList_New( (list), (key), (FTC_MruNode*)&(node) ); \ - _MruOk: \ - ; \ - FT_END_STMNT - -#define FTC_MRULIST_LOOKUP( list, key, node, error ) \ - FTC_MRULIST_LOOKUP_CMP( list, key, (list)->clazz.node_compare, node, error ) - -#else /* !FTC_INLINE */ - -#define FTC_MRULIST_LOOKUP( list, key, node, error ) \ - error = FTC_MruList_Lookup( (list), (key), (FTC_MruNode*)&(node) ) - -#endif /* !FTC_INLINE */ - - -#define FTC_MRULIST_LOOP( list, node ) \ - FT_BEGIN_STMNT \ - FTC_MruNode _first = (list)->nodes; \ - \ - \ - if ( _first ) \ - { \ - FTC_MruNode _node = _first; \ - \ - \ - do \ - { \ - *(FTC_MruNode*)&(node) = _node; - - -#define FTC_MRULIST_LOOP_END() \ - _node = _node->next; \ - \ - } while ( _node != _first ); \ - } \ - FT_END_STMNT - - /* */ - -FT_END_HEADER - - -#endif /* __FTCMRU_H__ */ - - -/* END */ diff --git a/reactos/lib/freetype/include/freetype/cache/ftcsbits.h b/reactos/lib/freetype/include/freetype/cache/ftcsbits.h index b2ef0f1818d..6f8ef99cf78 100644 --- a/reactos/lib/freetype/include/freetype/cache/ftcsbits.h +++ b/reactos/lib/freetype/include/freetype/cache/ftcsbits.h @@ -4,7 +4,7 @@ /* */ /* A small-bitmap cache (specification). */ /* */ -/* Copyright 2000-2001, 2002, 2003 by */ +/* Copyright 2000-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -22,72 +22,251 @@ #include #include FT_CACHE_H -#include FT_CACHE_INTERNAL_GLYPH_H +#include FT_CACHE_IMAGE_H FT_BEGIN_HEADER -#define FTC_SBIT_ITEMS_PER_NODE 16 - typedef struct FTC_SNodeRec_ + /*************************************************************************/ + /* */ + /*
*/ + /* cache_subsystem */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_SBit */ + /* */ + /* */ + /* A handle to a small bitmap descriptor. See the @FTC_SBitRec */ + /* structure for details. */ + /* */ + typedef struct FTC_SBitRec_* FTC_SBit; + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_SBitRec */ + /* */ + /* */ + /* A very compact structure used to describe a small glyph bitmap. */ + /* */ + /* */ + /* width :: The bitmap width in pixels. */ + /* */ + /* height :: The bitmap height in pixels. */ + /* */ + /* left :: The horizontal distance from the pen position to the */ + /* left bitmap border (a.k.a. `left side bearing', or */ + /* `lsb'). */ + /* */ + /* top :: The vertical distance from the pen position (on the */ + /* baseline) to the upper bitmap border (a.k.a. `top */ + /* side bearing'). The distance is positive for upwards */ + /* Y coordinates. */ + /* */ + /* format :: The format of the glyph bitmap (monochrome or gray). */ + /* */ + /* max_grays :: Maximum gray level value (in the range 1 to 255). */ + /* */ + /* pitch :: The number of bytes per bitmap line. May be positive */ + /* or negative. */ + /* */ + /* xadvance :: The horizontal advance width in pixels. */ + /* */ + /* yadvance :: The vertical advance height in pixels. */ + /* */ + /* buffer :: A pointer to the bitmap pixels. */ + /* */ + typedef struct FTC_SBitRec_ { - FTC_GNodeRec gnode; - FT_UInt count; - FTC_SBitRec sbits[FTC_SBIT_ITEMS_PER_NODE]; + FT_Byte width; + FT_Byte height; + FT_Char left; + FT_Char top; - } FTC_SNodeRec, *FTC_SNode; + FT_Byte format; + FT_Byte max_grays; + FT_Short pitch; + FT_Char xadvance; + FT_Char yadvance; + + FT_Byte* buffer; + + } FTC_SBitRec; -#define FTC_SNODE( x ) ( (FTC_SNode)( x ) ) -#define FTC_SNODE_GINDEX( x ) FTC_GNODE( x )->gindex -#define FTC_SNODE_FAMILY( x ) FTC_GNODE( x )->family - - typedef FT_UInt - (*FTC_SFamily_GetCountFunc)( FTC_Family family, - FTC_Manager manager ); - - typedef FT_Error - (*FTC_SFamily_LoadGlyphFunc)( FTC_Family family, - FT_UInt gindex, - FTC_Manager manager, - FT_Face *aface ); - - typedef struct FTC_SFamilyClassRec_ - { - FTC_MruListClassRec clazz; - FTC_SFamily_GetCountFunc family_get_count; - FTC_SFamily_LoadGlyphFunc family_load_glyph; - - } FTC_SFamilyClassRec; - - typedef const FTC_SFamilyClassRec* FTC_SFamilyClass; - -#define FTC_SFAMILY_CLASS( x ) ((FTC_SFamilyClass)(x)) - -#define FTC_CACHE__SFAMILY_CLASS( x ) \ - FTC_SFAMILY_CLASS( FTC_CACHE__GCACHE_CLASS( x )->family_class ) + /*************************************************************************/ + /* */ + /* */ + /* FTC_SBitCache */ + /* */ + /* */ + /* A handle to a small bitmap cache. These are special cache objects */ + /* used to store small glyph bitmaps (and anti-aliased pixmaps) in a */ + /* much more efficient way than the traditional glyph image cache */ + /* implemented by @FTC_ImageCache. */ + /* */ + typedef struct FTC_SBitCacheRec_* FTC_SBitCache; - FT_EXPORT( void ) - FTC_SNode_Free( FTC_SNode snode, - FTC_Cache cache ); + /*************************************************************************/ + /* */ + /* */ + /* FTC_SBit_Cache */ + /* */ + /* */ + /* DEPRECATED. Use @FTC_SBitCache instead. */ + /* */ + typedef FTC_SBitCache FTC_SBit_Cache; + + /*************************************************************************/ + /* */ + /* */ + /* FTC_SBitCache_New */ + /* */ + /* */ + /* Creates a new cache to store small glyph bitmaps. */ + /* */ + /* */ + /* manager :: A handle to the source cache manager. */ + /* */ + /* */ + /* acache :: A handle to the new sbit cache. NULL in case of error. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ FT_EXPORT( FT_Error ) - FTC_SNode_New( FTC_SNode *psnode, - FTC_GQuery gquery, - FTC_Cache cache ); - - FT_EXPORT( FT_ULong ) - FTC_SNode_Weight( FTC_SNode inode ); + FTC_SBitCache_New( FTC_Manager manager, + FTC_SBitCache *acache ); - FT_EXPORT( FT_Bool ) - FTC_SNode_Compare( FTC_SNode snode, - FTC_GQuery gquery, - FTC_Cache cache ); + /*************************************************************************/ + /* */ + /* */ + /* FTC_SBitCache_Lookup */ + /* */ + /* */ + /* Looks up a given small glyph bitmap in a given sbit cache and */ + /* "lock" it to prevent its flushing from the cache until needed */ + /* */ + /* */ + /* cache :: A handle to the source sbit cache. */ + /* */ + /* type :: A pointer to the glyph image type descriptor. */ + /* */ + /* gindex :: The glyph index. */ + /* */ + /* */ + /* sbit :: A handle to a small bitmap descriptor. */ + /* */ + /* anode :: Used to return the address of of the corresponding cache */ + /* node after incrementing its reference count (see note */ + /* below). */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* The small bitmap descriptor and its bit buffer are owned by the */ + /* cache and should never be freed by the application. They might */ + /* as well disappear from memory on the next cache lookup, so don't */ + /* treat them as persistent data. */ + /* */ + /* The descriptor's `buffer' field is set to 0 to indicate a missing */ + /* glyph bitmap. */ + /* */ + /* If "anode" is _not_ NULL, it receives the address of the cache */ + /* node containing the bitmap, after increasing its reference count. */ + /* This ensures that the node (as well as the image) will always be */ + /* kept in the cache until you call @FTC_Node_Unref to "release" it. */ + /* */ + /* If "anode" is NULL, the cache node is left unchanged, which means */ + /* that the bitmap could be flushed out of the cache on the next */ + /* call to one of the caching sub-system APIs. Don't assume that it */ + /* is persistent! */ + /* */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_Lookup( FTC_SBitCache cache, + FTC_ImageType type, + FT_UInt gindex, + FTC_SBit *sbit, + FTC_Node *anode ); + /* */ + + /*************************************************************************/ + /* */ + /* */ + /* FTC_SBit_Cache_New */ + /* */ + /* */ + /* DEPRECATED. Use @FTC_SBitCache_New instead. */ + /* */ + /* Creates a new cache to store small glyph bitmaps. */ + /* */ + /* */ + /* manager :: A handle to the source cache manager. */ + /* */ + /* */ + /* acache :: A handle to the new sbit cache. NULL in case of error. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_SBit_Cache_New( FTC_Manager manager, + FTC_SBit_Cache *acache ); + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_SBit_Cache_Lookup */ + /* */ + /* */ + /* DEPRECATED. Use @FTC_SBitCache_Lookup instead. */ + /* */ + /* Looks up a given small glyph bitmap in a given sbit cache. */ + /* */ + /* */ + /* cache :: A handle to the source sbit cache. */ + /* */ + /* desc :: A pointer to the glyph image descriptor. */ + /* */ + /* gindex :: The glyph index. */ + /* */ + /* */ + /* sbit :: A handle to a small bitmap descriptor. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* The small bitmap descriptor and its bit buffer are owned by the */ + /* cache and should never be freed by the application. They might */ + /* as well disappear from memory on the next cache lookup, so don't */ + /* treat them as persistent data. */ + /* */ + /* The descriptor's `buffer' field is set to 0 to indicate a missing */ + /* glyph bitmap. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_SBit_Cache_Lookup( FTC_SBit_Cache cache, + FTC_Image_Desc* desc, + FT_UInt gindex, + FTC_SBit *sbit ); + + FT_END_HEADER #endif /* __FTCSBITS_H__ */ diff --git a/reactos/lib/freetype/include/freetype/config/ftconfig.h b/reactos/lib/freetype/include/freetype/config/ftconfig.h index d23b73e3937..4f5d7fe8e23 100644 --- a/reactos/lib/freetype/include/freetype/config/ftconfig.h +++ b/reactos/lib/freetype/include/freetype/config/ftconfig.h @@ -137,7 +137,7 @@ FT_BEGIN_HEADER #error "no 32bit type found -- please check your configuration files" #endif - /* look up an integer type that is at least 32 bits */ + /* now, lookup for an integer type that is at least 32 bits */ #if FT_SIZEOF_INT >= 4 typedef int FT_Fast; @@ -192,11 +192,6 @@ FT_BEGIN_HEADER #endif /* FT_SIZEOF_LONG == 8 */ -#define FT_BEGIN_STMNT do { -#define FT_END_STMNT } while ( 0 ) -#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT - - /*************************************************************************/ /* */ /* A 64-bit data type will create compilation problems if you compile */ diff --git a/reactos/lib/freetype/include/freetype/config/ftheader.h b/reactos/lib/freetype/include/freetype/config/ftheader.h index 52d18195cdb..2bd5bd61c27 100644 --- a/reactos/lib/freetype/include/freetype/config/ftheader.h +++ b/reactos/lib/freetype/include/freetype/config/ftheader.h @@ -4,7 +4,7 @@ /* */ /* Build macros of the FreeType 2 library. */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -281,7 +281,7 @@ /* A macro used in #include statements to name the file containing */ /* the module management API of FreeType 2. */ /* */ -#define FT_MODULE_H +#define FT_MODULE_H /*************************************************************************/ @@ -433,10 +433,7 @@ /* see the API defined in @FT_CACHE_SMALL_BITMAPS_H if you only need */ /* to store small glyph bitmaps, as it will use less memory. */ /* */ - /* This macro is deprecated. Simply include @FT_CACHE_H to have all */ - /* glyph image-related cache declarations. */ - /* */ -#define FT_CACHE_IMAGE_H FT_CACHE_H +#define FT_CACHE_IMAGE_H /*************************************************************************/ @@ -453,10 +450,7 @@ /* in @FT_CACHE_IMAGE_H if you want to cache arbitrary glyph images, */ /* including scalable outlines. */ /* */ - /* This macro is deprecated. Simply include @FT_CACHE_H to have all */ - /* small bitmaps-related cache declarations. */ - /* */ -#define FT_CACHE_SMALL_BITMAPS_H FT_CACHE_H +#define FT_CACHE_SMALL_BITMAPS_H /*************************************************************************/ @@ -468,10 +462,7 @@ /* A macro used in #include statements to name the file containing */ /* the `charmap' API of the FreeType 2 cache sub-system. */ /* */ - /* This macro is deprecated. Simply include @FT_CACHE_H to have all */ - /* charmap-based cache declarations. */ - /* */ -#define FT_CACHE_CHARMAP_H FT_CACHE_H +#define FT_CACHE_CHARMAP_H /*************************************************************************/ @@ -517,30 +508,26 @@ /* */ -#define FT_TRIGONOMETRY_H -#define FT_STROKER_H -#define FT_SYNTHESIS_H -#define FT_ERROR_DEFINITIONS_H +#define FT_TRIGONOMETRY_H +#define FT_STROKER_H +#define FT_SYNTHESIS_H +#define FT_ERROR_DEFINITIONS_H -#define FT_CACHE_MANAGER_H +#define FT_CACHE_MANAGER_H -#define FT_CACHE_INTERNAL_MRU_H -#define FT_CACHE_INTERNAL_MANAGER_H -#define FT_CACHE_INTERNAL_CACHE_H -#define FT_CACHE_INTERNAL_GLYPH_H -#define FT_CACHE_INTERNAL_IMAGE_H -#define FT_CACHE_INTERNAL_SBITS_H +#define FT_CACHE_INTERNAL_LRU_H +#define FT_CACHE_INTERNAL_GLYPH_H +#define FT_CACHE_INTERNAL_CACHE_H +#define FT_XFREE86_H -#define FT_XFREE86_H +#define FT_INCREMENTAL_H -#define FT_INCREMENTAL_H - -#define FT_TRUETYPE_UNPATENTED_H +#define FT_TRUETYPE_UNPATENTED_H /* now include internal headers definitions from */ -#define FT_INTERNAL_INTERNAL_H +#define FT_INTERNAL_INTERNAL_H #include FT_INTERNAL_INTERNAL_H diff --git a/reactos/lib/freetype/include/freetype/config/ftoption.h b/reactos/lib/freetype/include/freetype/config/ftoption.h index 0bf80453be2..0e02192c405 100644 --- a/reactos/lib/freetype/include/freetype/config/ftoption.h +++ b/reactos/lib/freetype/include/freetype/config/ftoption.h @@ -257,7 +257,7 @@ FT_BEGIN_HEADER /* The maximum number of modules that can be registered in a single */ /* FreeType library object. 32 is the default. */ /* */ -#define FT_MAX_MODULES 32767 +#define FT_MAX_MODULES 32 /*************************************************************************/ @@ -399,7 +399,7 @@ FT_BEGIN_HEADER /* Do not #undef this macro here, since the build system might */ /* define it for certain configurations only. */ /* */ - #define TT_CONFIG_OPTION_BYTECODE_INTERPRETER +/* #define TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ /*************************************************************************/ @@ -411,7 +411,10 @@ FT_BEGIN_HEADER /* FT_PARAM_TAG_UNPATENTED_HINTING; or when the debug hook */ /* FT_DEBUG_HOOK_UNPATENTED_HINTING is globally actived */ /* */ -#define TT_CONFIG_OPTION_UNPATENTED_HINTING + /* XXX: WARNING: THIS DOESN'T WORK AS ADVERTISED YET. PLEASE DO NOT */ + /* DEFINE FOR THE MOMENT.. */ + /* */ +/* #define TT_CONFIG_OPTION_UNPATENTED_HINTING */ /*************************************************************************/ diff --git a/reactos/lib/freetype/include/freetype/config/ftstdlib.h b/reactos/lib/freetype/include/freetype/config/ftstdlib.h index 871590ffd93..7868fd402a1 100644 --- a/reactos/lib/freetype/include/freetype/config/ftstdlib.h +++ b/reactos/lib/freetype/include/freetype/config/ftstdlib.h @@ -5,7 +5,7 @@ /* ANSI-specific library and header configuration file (specification */ /* only). */ /* */ -/* Copyright 2002, 2003, 2004 by */ +/* Copyright 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -73,11 +73,10 @@ #include -#define ft_isalnum isalnum -#define ft_isupper isupper -#define ft_islower islower -#define ft_isdigit isdigit -#define ft_isxdigit isxdigit +#define ft_isalnum isalnum +#define ft_isupper isupper +#define ft_islower islower +#define ft_xdigit isxdigit #include @@ -110,7 +109,7 @@ #define ft_qsort qsort #define ft_exit exit /* only used to exit from unhandled exceptions */ -#define ft_atol atol +#define ft_atoi atoi /**********************************************************************/ diff --git a/reactos/lib/freetype/include/freetype/freetype.h b/reactos/lib/freetype/include/freetype/freetype.h index ff7d987924e..413e6c6b270 100644 --- a/reactos/lib/freetype/include/freetype/freetype.h +++ b/reactos/lib/freetype/include/freetype/freetype.h @@ -16,15 +16,6 @@ /***************************************************************************/ -#ifndef FT_FREETYPE_H -#error "`ft2build.h' hasn't been included yet!" -#error "Please always use macros to include FreeType header files." -#error "Example:" -#error " #include " -#error " #include FT_FREETYPE_H" -#endif - - #ifndef __FREETYPE_H__ #define __FREETYPE_H__ @@ -44,7 +35,7 @@ /* */ #define FREETYPE_MAJOR 2 #define FREETYPE_MINOR 1 -#define FREETYPE_PATCH 8 +#define FREETYPE_PATCH 5 #include @@ -590,37 +581,6 @@ FT_BEGIN_HEADER /* the font file, for the cases when they are needed, with the Adobe */ /* values as well. */ /* */ - /* FT_ENCODING_NONE is set by the BDF and PCF drivers if the charmap */ - /* is neither Unicode nor ISO-8859-1 (otherwise it is set to */ - /* FT_ENCODING_UNICODE). Use `FT_Get_BDF_Charset_ID' to find out */ - /* which encoding is really present. If, for example, the */ - /* `cs_registry' field is `KOI8' and the `cs_encoding' field is `R', */ - /* the font is encoded in KOI8-R. */ - /* */ - /* FT_ENCODING_NONE is always set (with a single exception) by the */ - /* winfonts driver. Use `FT_Get_WinFNT_Header' and examine the */ - /* `charset' field of the `FT_WinFNT_HeaderRec' structure to find out */ - /* which encoding is really present. For example, FT_WinFNT_ID_CP1251 */ - /* (204) means Windows code page 1251 (for Russian). */ - /* */ - /* FT_ENCODING_NONE is set if `platform_id' is `TT_PLATFORM_MACINTOSH' */ - /* and `encoding_id' is not `TT_MAC_ID_ROMAN' (otherwise it is set to */ - /* FT_ENCODING_APPLE_ROMAN). */ - /* */ - /* If `platform_id' is `TT_PLATFORM_MACINTOSH', use the function */ - /* `FT_Get_CMap_Language_ID' to query the Mac language ID which may be */ - /* needed to be able to distinguish Apple encoding variants. See */ - /* */ - /* http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/README.TXT */ - /* */ - /* to get an idea how to do that. Basically, if the language ID is 0, */ - /* dont use it, otherwise subtract 1 from the language ID. Then */ - /* examine `encoding_id'. If, for example, `encoding_id' is */ - /* `TT_MAC_ID_ROMAN' and the language ID (minus 1) is */ - /* `TT_MAC_LANGID_GREEK', it is the Greek encoding, not Roman. */ - /* `TT_MAC_ID_ARABIC' with `TT_MAC_LANGID_FARSI' means the Farsi */ - /* variant the Arabic encoding. */ - /* */ typedef enum FT_Encoding_ { FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ), @@ -972,7 +932,7 @@ FT_BEGIN_HEADER /* FT_FACE_FLAG_XXX */ /* */ /* */ - /* A list of bit flags used in the `face_flags' field of the */ + /* A list of bit flags used in the 'face_flags' field of the */ /* @FT_FaceRec structure. They inform client applications of */ /* properties of the corresponding face. */ /* */ @@ -2061,9 +2021,7 @@ FT_BEGIN_HEADER /* will be loaded. */ /* */ /* */ - /* glyph_index :: The index of the glyph in the font file. For */ - /* CID-keyed fonts (either in PS or in CFF format) */ - /* this argument specifies the CID value. */ + /* glyph_index :: The index of the glyph in the font file. */ /* */ /* load_flags :: A flag indicating what to load for this glyph. The */ /* @FT_LOAD_XXX constants can be used to control the */ diff --git a/reactos/lib/freetype/include/freetype/ftbbox.h b/reactos/lib/freetype/include/freetype/ftbbox.h index f98c89eb2d6..e6616135a2d 100644 --- a/reactos/lib/freetype/include/freetype/ftbbox.h +++ b/reactos/lib/freetype/include/freetype/ftbbox.h @@ -4,7 +4,7 @@ /* */ /* FreeType exact bbox computation (specification). */ /* */ -/* Copyright 1996-2001, 2003 by */ +/* Copyright 1996-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -34,12 +34,6 @@ #include #include FT_FREETYPE_H -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - FT_BEGIN_HEADER diff --git a/reactos/lib/freetype/include/freetype/ftbdf.h b/reactos/lib/freetype/include/freetype/ftbdf.h index aa411440d96..3d2d04b3dc1 100644 --- a/reactos/lib/freetype/include/freetype/ftbdf.h +++ b/reactos/lib/freetype/include/freetype/ftbdf.h @@ -22,12 +22,6 @@ #include #include FT_FREETYPE_H -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - FT_BEGIN_HEADER diff --git a/reactos/lib/freetype/include/freetype/ftcache.h b/reactos/lib/freetype/include/freetype/ftcache.h index c6dc14aeca2..fd13f5d0902 100644 --- a/reactos/lib/freetype/include/freetype/ftcache.h +++ b/reactos/lib/freetype/include/freetype/ftcache.h @@ -4,7 +4,7 @@ /* */ /* FreeType Cache subsystem (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* Copyright 1996-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -63,8 +63,8 @@ FT_BEGIN_HEADER /* FTC_Face_Requester */ /* */ /* FTC_Manager_New */ - /* FTC_Manager_LookupFace */ - /* FTC_Manager_LookupSize */ + /* FTC_Manager_Lookup_Face */ + /* FTC_Manager_Lookup_Size */ /* */ /* FTC_Node */ /* FTC_Node_Ref */ @@ -108,10 +108,10 @@ FT_BEGIN_HEADER /* FTC_FaceID */ /* */ /* */ - /* An opaque pointer type that is used to identity face objects. The */ + /* A generic pointer type that is used to identity face objects. The */ /* contents of such objects is application-dependent. */ /* */ - typedef struct FTC_FaceIDRec_* FTC_FaceID; + typedef FT_Pointer FTC_FaceID; /*************************************************************************/ @@ -257,16 +257,22 @@ FT_BEGIN_HEADER /* Creates a new cache manager. */ /* */ /* */ - /* library :: The parent FreeType library handle to use. */ + /* library :: The parent FreeType library handle to use. */ /* */ - /* max_bytes :: Maximum number of bytes to use for cached data. */ - /* Use 0 for defaults. */ + /* max_faces :: Maximum number of faces to keep alive in manager. */ + /* Use 0 for defaults. */ /* */ - /* requester :: An application-provided callback used to translate */ - /* face IDs into real @FT_Face objects. */ + /* max_sizes :: Maximum number of sizes to keep alive in manager. */ + /* Use 0 for defaults. */ /* */ - /* req_data :: A generic pointer that is passed to the requester */ - /* each time it is called (see @FTC_Face_Requester). */ + /* max_bytes :: Maximum number of bytes to use for cached data. */ + /* Use 0 for defaults. */ + /* */ + /* requester :: An application-provided callback used to translate */ + /* face IDs into real @FT_Face objects. */ + /* */ + /* req_data :: A generic pointer that is passed to the requester */ + /* each time it is called (see @FTC_Face_Requester). */ /* */ /* */ /* amanager :: A handle to a new manager object. 0 in case of */ @@ -319,7 +325,7 @@ FT_BEGIN_HEADER /*************************************************************************/ /* */ /* */ - /* FTC_Manager_LookupFace */ + /* FTC_Manager_Lookup_Face */ /* */ /* */ /* Retrieves the @FT_Face object that corresponds to a given face ID */ @@ -342,480 +348,64 @@ FT_BEGIN_HEADER /* */ /* The @FT_Face object doesn't necessarily have a current size object */ /* (i.e., face->size can be 0). If you need a specific `font size', */ - /* use @FTC_Manager_LookupSize instead. */ + /* use @FTC_Manager_Lookup_Size instead. */ /* */ /* Never change the face's transformation matrix (i.e., never call */ /* the @FT_Set_Transform function) on a returned face! If you need */ /* to transform glyphs, do it yourself after glyph loading. */ /* */ FT_EXPORT( FT_Error ) - FTC_Manager_LookupFace( FTC_Manager manager, - FTC_FaceID face_id, - FT_Face *aface ); - - - /*************************************************************************/ - /* */ - /* */ - /* FTC_ScalerRec */ - /* */ - /* */ - /* A structure used to describe a given character size in either */ - /* pixels or points to the cache manager. See */ - /* @FTC_Manager_LookupSize. */ - /* */ - /* */ - /* face_id :: The source face ID. */ - /* */ - /* width :: The character width. */ - /* */ - /* height :: The character height. */ - /* */ - /* pixel :: A Boolean. If TRUE, the `width' and `height' fields */ - /* are interpreted as integer pixel character sizes. */ - /* Otherwise, they are expressed as 1/64th of points. */ - /* */ - /* x_res :: Only used when `pixel' is FALSE to indicate the */ - /* horizontal resolution in dpi. */ - /* */ - /* y_res :: Only used when `pixel' is FALSE to indicate the */ - /* vertical resolution in dpi. */ - /* */ - /* */ - /* This type is mainly used to retrieve @FT_Size objects through the */ - /* cache manager. */ - /* */ - typedef struct FTC_ScalerRec_ - { - FTC_FaceID face_id; - FT_UInt width; - FT_UInt height; - FT_Int pixel; - FT_UInt x_res; - FT_UInt y_res; - - } FTC_ScalerRec, *FTC_Scaler; + FTC_Manager_Lookup_Face( FTC_Manager manager, + FTC_FaceID face_id, + FT_Face *aface ); /*************************************************************************/ /* */ /* */ - /* FTC_Manager_LookupSize */ + /* FTC_Manager_Lookup_Size */ /* */ /* */ - /* Retrieve the @FT_Size object that corresponds to a given */ - /* @FTC_Scaler through a cache manager. */ + /* Retrieves the @FT_Face and @FT_Size objects that correspond to a */ + /* given font. */ /* */ /* */ /* manager :: A handle to the cache manager. */ /* */ - /* scaler :: A scaler handle. */ + /* font :: The font to use. */ /* */ /* */ - /* asize :: A handle to the size object. */ + /* aface :: A pointer to the handle of the face object. Set it to */ + /* zero if you don't need it. */ + /* */ + /* asize :: A pointer to the handle of the size object. Set it to */ + /* zero if you don't need it. */ /* */ /* */ /* FreeType error code. 0 means success. */ /* */ /* */ - /* The returned @FT_Size object is always owned by the manager. You */ - /* should never try to discard it by yourself. */ + /* The returned @FT_Face object is always owned by the manager. You */ + /* should never try to discard it yourself. */ /* */ - /* You can access the parent @FT_Face object simply as `size->face' */ - /* if you need it. Note that this object is also owned by the */ - /* manager. */ + /* Never change the face's transformation matrix (i.e., never call */ + /* the @FT_Set_Transform function) on a returned face! If you need */ + /* to transform glyphs, do it yourself after glyph loading. */ + /* */ + /* Similarly, the returned @FT_Size object is always owned by the */ + /* manager. You should never try to discard it, and never change its */ + /* settings with @FT_Set_Pixel_Sizes or @FT_Set_Char_Size! */ + /* */ + /* The returned size object is the face's current size, which means */ + /* that you can call @FT_Load_Glyph with the face if you need to. */ /* */ FT_EXPORT( FT_Error ) - FTC_Manager_LookupSize( FTC_Manager manager, - FTC_Scaler scaler, - FT_Size *asize ); + FTC_Manager_Lookup_Size( FTC_Manager manager, + FTC_Font font, + FT_Face *aface, + FT_Size *asize ); - /*************************************************************************/ - /* */ - /* */ - /* FTC_Node_Unref */ - /* */ - /* */ - /* Decrement a cache node's internal reference count. When the count */ - /* reaches 0, it is not destroyed but becomes eligible for subsequent */ - /* cache flushes. */ - /* */ - /* */ - /* node :: The cache node handle. */ - /* */ - /* manager :: The cache manager handle. */ - /* */ - FT_EXPORT( void ) - FTC_Node_Unref( FTC_Node node, - FTC_Manager manager ); - - - /* remove all nodes belonging to a given face_id */ - FT_EXPORT( void ) - FTC_Manager_RemoveFaceID( FTC_Manager manager, - FTC_FaceID face_id ); - - - /*************************************************************************/ - /* */ - /*
*/ - /* cache_subsystem */ - /* */ - /*************************************************************************/ - - /************************************************************************ - * - * @type: - * FTC_CMapCache - * - * @description: - * An opaque handle used to manager a charmap cache. This cache is - * to hold character codes -> glyph indices mappings. - */ - typedef struct FTC_CMapCacheRec_* FTC_CMapCache; - - - /*************************************************************************/ - /* */ - /* @function: */ - /* FTC_CMapCache_New */ - /* */ - /* @description: */ - /* Create a new charmap cache. */ - /* */ - /* @input: */ - /* manager :: A handle to the cache manager. */ - /* */ - /* @output: */ - /* acache :: A new cache handle. NULL in case of error. */ - /* */ - /* @return: */ - /* FreeType error code. 0 means success. */ - /* */ - /* @note: */ - /* Like all other caches, this one will be destroyed with the cache */ - /* manager. */ - /* */ - FT_EXPORT( FT_Error ) - FTC_CMapCache_New( FTC_Manager manager, - FTC_CMapCache *acache ); - - - /* retrieve the index of a given charmap */ - FT_EXPORT( FT_Int ) - FT_Get_CharMap_Index( FT_CharMap charmap ); - - - /*************************************************************************/ - /* */ - /* @function: */ - /* FTC_CMapCache_Lookup */ - /* */ - /* @description: */ - /* Translate a character code into a glyph index, using the charmap */ - /* cache. */ - /* */ - /* @input: */ - /* cache :: A charmap cache handle. */ - /* */ - /* face_id :: source face id */ - /* */ - /* cmap_index :: index of charmap in source face */ - /* */ - /* char_code :: The character code (in the corresponding charmap). */ - /* */ - /* @return: */ - /* Glyph index. 0 means `no glyph'. */ - /* */ - FT_EXPORT( FT_UInt ) - FTC_CMapCache_Lookup( FTC_CMapCache cache, - FTC_FaceID face_id, - FT_Int cmap_index, - FT_UInt32 char_code ); - - - /*************************************************************************/ - /* */ - /*
*/ - /* cache_subsystem */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** IMAGE CACHE OBJECT *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct FTC_ImageTypeRec_ - { - FTC_FaceID face_id; - FT_Int width; - FT_Int height; - FT_Int32 flags; - - } FTC_ImageTypeRec; - - typedef struct FTC_ImageTypeRec_* FTC_ImageType; - - /* */ - -#define FTC_IMAGE_TYPE_COMPARE( d1, d2 ) \ - ( FTC_FONT_COMPARE( &(d1)->font, &(d2)->font ) && \ - (d1)->flags == (d2)->flags ) - -#define FTC_IMAGE_TYPE_HASH( d ) \ - (FT_UFast)( FTC_FONT_HASH( &(d)->font ) ^ \ - ( (d)->flags << 4 ) ) - - - /*************************************************************************/ - /* */ - /* */ - /* FTC_ImageCache */ - /* */ - /* */ - /* A handle to an glyph image cache object. They are designed to */ - /* hold many distinct glyph images while not exceeding a certain */ - /* memory threshold. */ - /* */ - typedef struct FTC_ImageCacheRec_* FTC_ImageCache; - - - /*************************************************************************/ - /* */ - /* */ - /* FTC_ImageCache_New */ - /* */ - /* */ - /* Creates a new glyph image cache. */ - /* */ - /* */ - /* manager :: The parent manager for the image cache. */ - /* */ - /* */ - /* acache :: A handle to the new glyph image cache object. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - FT_EXPORT( FT_Error ) - FTC_ImageCache_New( FTC_Manager manager, - FTC_ImageCache *acache ); - - - /*************************************************************************/ - /* */ - /* */ - /* FTC_ImageCache_Lookup */ - /* */ - /* */ - /* Retrieves a given glyph image from a glyph image cache. */ - /* */ - /* */ - /* cache :: A handle to the source glyph image cache. */ - /* */ - /* type :: A pointer to a glyph image type descriptor. */ - /* */ - /* gindex :: The glyph index to retrieve. */ - /* */ - /* */ - /* aglyph :: The corresponding @FT_Glyph object. 0 in case of */ - /* failure. */ - /* */ - /* anode :: Used to return the address of of the corresponding cache */ - /* node after incrementing its reference count (see note */ - /* below). */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - /* */ - /* The returned glyph is owned and managed by the glyph image cache. */ - /* Never try to transform or discard it manually! You can however */ - /* create a copy with @FT_Glyph_Copy and modify the new one. */ - /* */ - /* If `anode' is _not_ NULL, it receives the address of the cache */ - /* node containing the glyph image, after increasing its reference */ - /* count. This ensures that the node (as well as the FT_Glyph) will */ - /* always be kept in the cache until you call @FTC_Node_Unref to */ - /* `release' it. */ - /* */ - /* If `anode' is NULL, the cache node is left unchanged, which means */ - /* that the FT_Glyph could be flushed out of the cache on the next */ - /* call to one of the caching sub-system APIs. Don't assume that it */ - /* is persistent! */ - /* */ - FT_EXPORT( FT_Error ) - FTC_ImageCache_Lookup( FTC_ImageCache cache, - FTC_ImageType type, - FT_UInt gindex, - FT_Glyph *aglyph, - FTC_Node *anode ); - - - /*************************************************************************/ - /* */ - /* */ - /* FTC_SBit */ - /* */ - /* */ - /* A handle to a small bitmap descriptor. See the @FTC_SBitRec */ - /* structure for details. */ - /* */ - typedef struct FTC_SBitRec_* FTC_SBit; - - - /*************************************************************************/ - /* */ - /* */ - /* FTC_SBitRec */ - /* */ - /* */ - /* A very compact structure used to describe a small glyph bitmap. */ - /* */ - /* */ - /* width :: The bitmap width in pixels. */ - /* */ - /* height :: The bitmap height in pixels. */ - /* */ - /* left :: The horizontal distance from the pen position to the */ - /* left bitmap border (a.k.a. `left side bearing', or */ - /* `lsb'). */ - /* */ - /* top :: The vertical distance from the pen position (on the */ - /* baseline) to the upper bitmap border (a.k.a. `top */ - /* side bearing'). The distance is positive for upwards */ - /* Y coordinates. */ - /* */ - /* format :: The format of the glyph bitmap (monochrome or gray). */ - /* */ - /* max_grays :: Maximum gray level value (in the range 1 to 255). */ - /* */ - /* pitch :: The number of bytes per bitmap line. May be positive */ - /* or negative. */ - /* */ - /* xadvance :: The horizontal advance width in pixels. */ - /* */ - /* yadvance :: The vertical advance height in pixels. */ - /* */ - /* buffer :: A pointer to the bitmap pixels. */ - /* */ - typedef struct FTC_SBitRec_ - { - FT_Byte width; - FT_Byte height; - FT_Char left; - FT_Char top; - - FT_Byte format; - FT_Byte max_grays; - FT_Short pitch; - FT_Char xadvance; - FT_Char yadvance; - - FT_Byte* buffer; - - } FTC_SBitRec; - - - /*************************************************************************/ - /* */ - /* */ - /* FTC_SBitCache */ - /* */ - /* */ - /* A handle to a small bitmap cache. These are special cache objects */ - /* used to store small glyph bitmaps (and anti-aliased pixmaps) in a */ - /* much more efficient way than the traditional glyph image cache */ - /* implemented by @FTC_ImageCache. */ - /* */ - typedef struct FTC_SBitCacheRec_* FTC_SBitCache; - - - /*************************************************************************/ - /* */ - /* */ - /* FTC_SBitCache_New */ - /* */ - /* */ - /* Creates a new cache to store small glyph bitmaps. */ - /* */ - /* */ - /* manager :: A handle to the source cache manager. */ - /* */ - /* */ - /* acache :: A handle to the new sbit cache. NULL in case of error. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - FT_EXPORT( FT_Error ) - FTC_SBitCache_New( FTC_Manager manager, - FTC_SBitCache *acache ); - - - /*************************************************************************/ - /* */ - /* */ - /* FTC_SBitCache_Lookup */ - /* */ - /* */ - /* Looks up a given small glyph bitmap in a given sbit cache and */ - /* `lock' it to prevent its flushing from the cache until needed. */ - /* */ - /* */ - /* cache :: A handle to the source sbit cache. */ - /* */ - /* type :: A pointer to the glyph image type descriptor. */ - /* */ - /* gindex :: The glyph index. */ - /* */ - /* */ - /* sbit :: A handle to a small bitmap descriptor. */ - /* */ - /* anode :: Used to return the address of of the corresponding cache */ - /* node after incrementing its reference count (see note */ - /* below). */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - /* */ - /* The small bitmap descriptor and its bit buffer are owned by the */ - /* cache and should never be freed by the application. They might */ - /* as well disappear from memory on the next cache lookup, so don't */ - /* treat them as persistent data. */ - /* */ - /* The descriptor's `buffer' field is set to 0 to indicate a missing */ - /* glyph bitmap. */ - /* */ - /* If `anode' is _not_ NULL, it receives the address of the cache */ - /* node containing the bitmap, after increasing its reference count. */ - /* This ensures that the node (as well as the image) will always be */ - /* kept in the cache until you call @FTC_Node_Unref to `release' it. */ - /* */ - /* If `anode' is NULL, the cache node is left unchanged, which means */ - /* that the bitmap could be flushed out of the cache on the next */ - /* call to one of the caching sub-system APIs. Don't assume that it */ - /* is persistent! */ - /* */ - FT_EXPORT( FT_Error ) - FTC_SBitCache_Lookup( FTC_SBitCache cache, - FTC_ImageType type, - FT_UInt gindex, - FTC_SBit *sbit, - FTC_Node *anode ); - - - /* */ - FT_END_HEADER #endif /* __FTCACHE_H__ */ diff --git a/reactos/lib/freetype/include/freetype/ftglyph.h b/reactos/lib/freetype/include/freetype/ftglyph.h index 14050a21d90..9c2a999b964 100644 --- a/reactos/lib/freetype/include/freetype/ftglyph.h +++ b/reactos/lib/freetype/include/freetype/ftglyph.h @@ -36,12 +36,6 @@ #include #include FT_FREETYPE_H -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - FT_BEGIN_HEADER @@ -241,8 +235,7 @@ FT_BEGIN_HEADER /* FT_Glyph_Copy */ /* */ /* */ - /* A function used to copy a glyph image. Note that the created */ - /* @FT_Glyph object must be released with @FT_Done_Glyph. */ + /* A function used to copy a glyph image. */ /* */ /* */ /* source :: A handle to the source glyph object. */ @@ -479,7 +472,8 @@ FT_BEGIN_HEADER /* } */ /* */ /* */ - /* This function does nothing if the glyph format isn't scalable. */ + /* This function will always fail if the glyph's format isn't */ + /* scalable. */ /* */ FT_EXPORT( FT_Error ) FT_Glyph_To_Bitmap( FT_Glyph* the_glyph, diff --git a/reactos/lib/freetype/include/freetype/ftgzip.h b/reactos/lib/freetype/include/freetype/ftgzip.h index 5d7228bb493..673b4885bc1 100644 --- a/reactos/lib/freetype/include/freetype/ftgzip.h +++ b/reactos/lib/freetype/include/freetype/ftgzip.h @@ -22,13 +22,6 @@ #include #include FT_FREETYPE_H -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - FT_BEGIN_HEADER /*************************************************************************/ diff --git a/reactos/lib/freetype/include/freetype/ftimage.h b/reactos/lib/freetype/include/freetype/ftimage.h index 28759650770..d54ef2dec01 100644 --- a/reactos/lib/freetype/include/freetype/ftimage.h +++ b/reactos/lib/freetype/include/freetype/ftimage.h @@ -53,8 +53,8 @@ FT_BEGIN_HEADER /* */ /* The type FT_Pos is a 32-bit integer used to store vectorial */ /* coordinates. Depending on the context, these can represent */ - /* distances in integer font units, or 16,16, or 26.6 fixed float */ - /* pixel coordinates. */ + /* distances in integer font units, or 26.6 fixed float pixel */ + /* coordinates. */ /* */ typedef signed long FT_Pos; diff --git a/reactos/lib/freetype/include/freetype/ftincrem.h b/reactos/lib/freetype/include/freetype/ftincrem.h index 6a1aa1fc31a..e3477120e59 100644 --- a/reactos/lib/freetype/include/freetype/ftincrem.h +++ b/reactos/lib/freetype/include/freetype/ftincrem.h @@ -22,12 +22,6 @@ #include #include FT_FREETYPE_H -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - FT_BEGIN_HEADER diff --git a/reactos/lib/freetype/include/freetype/ftlist.h b/reactos/lib/freetype/include/freetype/ftlist.h index ae9801b9d8f..1c5101700bb 100644 --- a/reactos/lib/freetype/include/freetype/ftlist.h +++ b/reactos/lib/freetype/include/freetype/ftlist.h @@ -4,7 +4,7 @@ /* */ /* Generic list support for FreeType (specification). */ /* */ -/* Copyright 1996-2001, 2003 by */ +/* Copyright 1996-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -31,12 +31,6 @@ #include #include FT_FREETYPE_H -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - FT_BEGIN_HEADER diff --git a/reactos/lib/freetype/include/freetype/ftmm.h b/reactos/lib/freetype/include/freetype/ftmm.h index 7f565bef947..5e681b2c4fc 100644 --- a/reactos/lib/freetype/include/freetype/ftmm.h +++ b/reactos/lib/freetype/include/freetype/ftmm.h @@ -100,6 +100,21 @@ FT_BEGIN_HEADER /* */ + typedef FT_Error + (*FT_Get_MM_Func)( FT_Face face, + FT_Multi_Master* master ); + + typedef FT_Error + (*FT_Set_MM_Design_Func)( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + typedef FT_Error + (*FT_Set_MM_Blend_Func)( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + /*************************************************************************/ /* */ /* */ diff --git a/reactos/lib/freetype/include/freetype/ftmodapi.h b/reactos/lib/freetype/include/freetype/ftmodapi.h deleted file mode 100644 index caf081d6d09..00000000000 --- a/reactos/lib/freetype/include/freetype/ftmodapi.h +++ /dev/null @@ -1,314 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftmodule.h */ -/* */ -/* FreeType modules public interface (specification). */ -/* */ -/* Copyright 1996-2001, 2002, 2003 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FTMODULE_H__ -#define __FTMODULE_H__ - - -#include -#include FT_FREETYPE_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /*
*/ - /* module_management */ - /* */ - /* */ - /* Module Management */ - /* */ - /* <Abstract> */ - /* How to add, upgrade, and remove modules from FreeType. */ - /* */ - /* <Description> */ - /* The definitions below are used to manage modules within FreeType. */ - /* Modules can be added, upgraded, and removed at runtime. */ - /* */ - /*************************************************************************/ - - - /* module bit flags */ -#define FT_MODULE_FONT_DRIVER 1 /* this module is a font driver */ -#define FT_MODULE_RENDERER 2 /* this module is a renderer */ -#define FT_MODULE_HINTER 4 /* this module is a glyph hinter */ -#define FT_MODULE_STYLER 8 /* this module is a styler */ - -#define FT_MODULE_DRIVER_SCALABLE 0x100 /* the driver supports */ - /* scalable fonts */ -#define FT_MODULE_DRIVER_NO_OUTLINES 0x200 /* the driver does not */ - /* support vector outlines */ -#define FT_MODULE_DRIVER_HAS_HINTER 0x400 /* the driver provides its */ - /* own hinter */ - - - /* deprecated values */ -#define ft_module_font_driver FT_MODULE_FONT_DRIVER -#define ft_module_renderer FT_MODULE_RENDERER -#define ft_module_hinter FT_MODULE_HINTER -#define ft_module_styler FT_MODULE_STYLER - -#define ft_module_driver_scalable FT_MODULE_DRIVER_SCALABLE -#define ft_module_driver_no_outlines FT_MODULE_DRIVER_NO_OUTLINES -#define ft_module_driver_has_hinter FT_MODULE_DRIVER_HAS_HINTER - - - typedef void - (*FT_Module_Interface)( void ); - - typedef FT_Error - (*FT_Module_Constructor)( FT_Module module ); - - typedef void - (*FT_Module_Destructor)( FT_Module module ); - - typedef FT_Module_Interface - (*FT_Module_Requester)( FT_Module module, - const char* name ); - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* FT_Module_Class */ - /* */ - /* <Description> */ - /* The module class descriptor. */ - /* */ - /* <Fields> */ - /* module_flags :: Bit flags describing the module. */ - /* */ - /* module_size :: The size of one module object/instance in */ - /* bytes. */ - /* */ - /* module_name :: The name of the module. */ - /* */ - /* module_version :: The version, as a 16.16 fixed number */ - /* (major.minor). */ - /* */ - /* module_requires :: The version of FreeType this module requires */ - /* (starts at version 2.0, i.e 0x20000) */ - /* */ - /* module_init :: A function used to initialize (not create) a */ - /* new module object. */ - /* */ - /* module_done :: A function used to finalize (not destroy) a */ - /* given module object */ - /* */ - /* get_interface :: Queries a given module for a specific */ - /* interface by name. */ - /* */ - typedef struct FT_Module_Class_ - { - FT_ULong module_flags; - FT_Long module_size; - const FT_String* module_name; - FT_Fixed module_version; - FT_Fixed module_requires; - - const void* module_interface; - - FT_Module_Constructor module_init; - FT_Module_Destructor module_done; - FT_Module_Requester get_interface; - - } FT_Module_Class; - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Add_Module */ - /* */ - /* <Description> */ - /* Adds a new module to a given library instance. */ - /* */ - /* <InOut> */ - /* library :: A handle to the library object. */ - /* */ - /* <Input> */ - /* clazz :: A pointer to class descriptor for the module. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* An error will be returned if a module already exists by that name, */ - /* or if the module requires a version of FreeType that is too great. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Add_Module( FT_Library library, - const FT_Module_Class* clazz ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_Module */ - /* */ - /* <Description> */ - /* Finds a module by its name. */ - /* */ - /* <Input> */ - /* library :: A handle to the library object. */ - /* */ - /* module_name :: The module's name (as an ASCII string). */ - /* */ - /* <Return> */ - /* A module handle. 0 if none was found. */ - /* */ - /* <Note> */ - /* You should better be familiar with FreeType internals to know */ - /* which module to look for :-) */ - /* */ - FT_EXPORT( FT_Module ) - FT_Get_Module( FT_Library library, - const char* module_name ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Remove_Module */ - /* */ - /* <Description> */ - /* Removes a given module from a library instance. */ - /* */ - /* <InOut> */ - /* library :: A handle to a library object. */ - /* */ - /* <Input> */ - /* module :: A handle to a module object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* The module object is destroyed by the function in case of success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Remove_Module( FT_Library library, - FT_Module module ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_New_Library */ - /* */ - /* <Description> */ - /* This function is used to create a new FreeType library instance */ - /* from a given memory object. It is thus possible to use libraries */ - /* with distinct memory allocators within the same program. */ - /* */ - /* <Input> */ - /* memory :: A handle to the original memory object. */ - /* */ - /* <Output> */ - /* alibrary :: A pointer to handle of a new library object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_New_Library( FT_Memory memory, - FT_Library *alibrary ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Done_Library */ - /* */ - /* <Description> */ - /* Discards a given library object. This closes all drivers and */ - /* discards all resource objects. */ - /* */ - /* <Input> */ - /* library :: A handle to the target library. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_EXPORT( FT_Error ) - FT_Done_Library( FT_Library library ); - - - - typedef void - (*FT_DebugHook_Func)( void* arg ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Set_Debug_Hook */ - /* */ - /* <Description> */ - /* Sets a debug hook function for debugging the interpreter of a font */ - /* format. */ - /* */ - /* <InOut> */ - /* library :: A handle to the library object. */ - /* */ - /* <Input> */ - /* hook_index :: The index of the debug hook. You should use the */ - /* values defined in ftobjs.h, e.g. */ - /* FT_DEBUG_HOOK_TRUETYPE. */ - /* */ - /* debug_hook :: The function used to debug the interpreter. */ - /* */ - /* <Note> */ - /* Currently, four debug hook slots are available, but only two (for */ - /* the TrueType and the Type 1 interpreter) are defined. */ - /* */ - FT_EXPORT( void ) - FT_Set_Debug_Hook( FT_Library library, - FT_UInt hook_index, - FT_DebugHook_Func debug_hook ); - - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Add_Default_Modules */ - /* */ - /* <Description> */ - /* Adds the set of default drivers to a given library object. */ - /* This is only useful when you create a library object with */ - /* FT_New_Library() (usually to plug a custom memory manager). */ - /* */ - /* <InOut> */ - /* library :: A handle to a new library object. */ - /* */ - FT_EXPORT( void ) - FT_Add_Default_Modules( FT_Library library ); - - - /* */ - - -FT_END_HEADER - -#endif /* __FTMODULE_H__ */ - - -/* END */ diff --git a/reactos/lib/freetype/include/freetype/ftoutln.h b/reactos/lib/freetype/include/freetype/ftoutln.h index 79ed35b5970..19b5724a5c8 100644 --- a/reactos/lib/freetype/include/freetype/ftoutln.h +++ b/reactos/lib/freetype/include/freetype/ftoutln.h @@ -5,7 +5,7 @@ /* Support for the FT_Outline type used to store glyph shapes of */ /* most scalable font formats (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -24,12 +24,6 @@ #include <ft2build.h> #include FT_FREETYPE_H -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - FT_BEGIN_HEADER @@ -395,72 +389,6 @@ FT_BEGIN_HEADER FT_Raster_Params* params ); - /************************************************************************** - * - * @enum: - * FT_Orientation - * - * @description: - * A list of values used to describe an outline's contour orientation. - * - * The TrueType and Postscript specifications use different conventions - * to determine whether outline contours should be filled or unfilled. - * - * @values: - * FT_ORIENTATION_TRUETYPE :: - * According to the TrueType specification, clockwise contours must - * be filled, and counter-clockwise ones must be unfilled. - * - * FT_ORIENTATION_POSTSCRIPT :: - * According to the Postscript specification, counter-clockwise contours - * must be filled, and clockwise ones must be unfilled. - * - * FT_ORIENTATION_FILL_RIGHT :: - * This is identical to @FT_ORIENTATION_TRUETYPE, but is used to - * remember that in TrueType, everything that is to the right of - * the drawing direction of a contour must be filled. - * - * FT_ORIENTATION_FILL_LEFT :: - * This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to - * remember that in Postscript, everything that is to the left of - * the drawing direction of a contour must be filled. - */ - typedef enum - { - FT_ORIENTATION_TRUETYPE = 0, - FT_ORIENTATION_POSTSCRIPT = 1, - FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE, - FT_ORIENTATION_FILL_LEFT = FT_ORIENTATION_POSTSCRIPT - - } FT_Orientation; - - - /************************************************************************** - * - * @function: - * FT_Outline_Get_Orientation - * - * @description: - * This function analyzes a glyph outline and tries to compute its - * fill orientation (see @FT_Orientation). This is done by computing - * the direction of each global horizontal and/or vertical extrema - * within the outline. - * - * Note that this will return @FT_ORIENTATION_TRUETYPE for empty - * outlines. - * - * @input: - * outline :: - * A handle to the source outline. - * - * @return: - * The orientation. - * - */ - FT_EXPORT( FT_Orientation ) - FT_Outline_Get_Orientation( FT_Outline* outline ); - - /* */ diff --git a/reactos/lib/freetype/include/freetype/ftpfr.h b/reactos/lib/freetype/include/freetype/ftpfr.h index c9a5675445a..7b687dacc2e 100644 --- a/reactos/lib/freetype/include/freetype/ftpfr.h +++ b/reactos/lib/freetype/include/freetype/ftpfr.h @@ -22,12 +22,6 @@ #include <ft2build.h> #include FT_FREETYPE_H -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - FT_BEGIN_HEADER diff --git a/reactos/lib/freetype/include/freetype/ftsizes.h b/reactos/lib/freetype/include/freetype/ftsizes.h index f0ec9159977..0fd6f0ffbaf 100644 --- a/reactos/lib/freetype/include/freetype/ftsizes.h +++ b/reactos/lib/freetype/include/freetype/ftsizes.h @@ -4,7 +4,7 @@ /* */ /* FreeType size objects management (specification). */ /* */ -/* Copyright 1996-2001, 2003 by */ +/* Copyright 1996-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -32,12 +32,6 @@ #include <ft2build.h> #include FT_FREETYPE_H -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - FT_BEGIN_HEADER @@ -107,9 +101,7 @@ FT_BEGIN_HEADER /* FT_Done_Size */ /* */ /* <Description> */ - /* Discards a given size object. Note that @FT_Done_Face */ - /* automatically discards all size objects allocated with */ - /* @FT_New_Size. */ + /* Discards a given size object. */ /* */ /* <Input> */ /* size :: A handle to a target size object. */ diff --git a/reactos/lib/freetype/include/freetype/ftsnames.h b/reactos/lib/freetype/include/freetype/ftsnames.h index 0e2d9a4adcc..356f9834904 100644 --- a/reactos/lib/freetype/include/freetype/ftsnames.h +++ b/reactos/lib/freetype/include/freetype/ftsnames.h @@ -7,7 +7,7 @@ /* */ /* This is _not_ used to retrieve glyph names! */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -26,12 +26,6 @@ #include <ft2build.h> #include FT_FREETYPE_H -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - FT_BEGIN_HEADER diff --git a/reactos/lib/freetype/include/freetype/ftstroke.h b/reactos/lib/freetype/include/freetype/ftstroke.h index a3052e858e0..a92c68d622a 100644 --- a/reactos/lib/freetype/include/freetype/ftstroke.h +++ b/reactos/lib/freetype/include/freetype/ftstroke.h @@ -4,7 +4,7 @@ /* */ /* FreeType path stroker (specification). */ /* */ -/* Copyright 2002, 2003, 2004 by */ +/* Copyright 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -21,45 +21,42 @@ #include <ft2build.h> #include FT_OUTLINE_H -#include FT_GLYPH_H FT_BEGIN_HEADER - /*@************************************************************* - * - * @type: - * FT_Stroker - * - * @description: - * Opaque handler to a path stroker object. - */ - typedef struct FT_StrokerRec_* FT_Stroker; +/*@************************************************************* + * + * @type: FT_Stroker + * + * @description: + * opaque handler to a path stroker object + */ + typedef struct FT_StrokerRec_* FT_Stroker; - /*@************************************************************* - * - * @enum: - * FT_Stroker_LineJoin - * - * @description: - * These values determine how two joining lines are rendered - * in a stroker. - * - * @values: - * FT_STROKER_LINEJOIN_ROUND :: - * Used to render rounded line joins. Circular arcs are used - * to join two lines smoothly. - * - * FT_STROKER_LINEJOIN_BEVEL :: - * Used to render beveled line joins; i.e., the two joining lines - * are extended until they intersect. - * - * FT_STROKER_LINEJOIN_MITER :: - * Same as beveled rendering, except that an additional line - * break is added if the angle between the two joining lines - * is too closed (this is useful to avoid unpleasant spikes - * in beveled rendering). - */ +/*@************************************************************* + * + * @enum: FT_Stroker_LineJoin + * + * @description: + * these values determine how two joining lines are rendered + * in a stroker. + * + * @values: + * FT_STROKER_LINEJOIN_ROUND :: + * used to render rounded line joins. circular arcs are used + * to join two lines smoothly + * + * FT_STROKER_LINEJOIN_BEVEL :: + * used to render beveled line joins; i.e. the two joining lines + * are extended until they intersect + * + * FT_STROKER_LINEJOIN_MITER :: + * same as beveled rendering, except that an additional line + * break is added if the angle between the two joining lines + * is too closed (this is useful to avoid unpleasant spikes + * in beveled rendering). + */ typedef enum { FT_STROKER_LINEJOIN_ROUND = 0, @@ -69,28 +66,27 @@ FT_BEGIN_HEADER } FT_Stroker_LineJoin; - /*@************************************************************* - * - * @enum: - * FT_Stroker_LineCap - * - * @description: - * These values determine how the end of opened sub-paths are - * rendered in a stroke. - * - * @values: - * FT_STROKER_LINECAP_BUTT :: - * The end of lines is rendered as a full stop on the last - * point itself. - * - * FT_STROKER_LINECAP_ROUND :: - * The end of lines is rendered as a half-circle around the - * last point. - * - * FT_STROKER_LINECAP_SQUARE :: - * The end of lines is rendered as a square around the - * last point. - */ +/*@************************************************************* + * + * @enum: FT_Stroker_LineCap + * + * @description: + * these values determine how the end of opened sub-paths are + * rendered in a stroke + * + * @values: + * FT_STROKER_LINECAP_BUTT :: + * the end of lines is rendered as a full stop on the last + * point itself + * + * FT_STROKER_LINECAP_ROUND :: + * the end of lines is rendered as a half-circle around the + * last point + * + * FT_STROKER_LINECAP_SQUARE :: + * the end of lines is rendered as a square around the + * last point + */ typedef enum { FT_STROKER_LINECAP_BUTT = 0, @@ -99,134 +95,12 @@ FT_BEGIN_HEADER } FT_Stroker_LineCap; + /* */ - /************************************************************** - * - * @enum: - * FT_StrokerBorder - * - * @description: - * These values are used to select a given stroke border - * in @FT_Stroker_GetBorderCounts and @FT_Stroker_ExportBorder. - * - * @values: - * FT_STROKER_BORDER_LEFT :: - * Select the left border, relative to the drawing direction. - * - * FT_STROKER_BORDER_RIGHT :: - * Select the right border, relative to the drawing direction. - * - * @note: - * Applications are generally interested in the `inside' and `outside' - * borders. However, there is no direct mapping between these and - * the `left' / `right' ones, since this really depends on the glyph's - * drawing orientation, which varies between font formats. - * - * You can however use @FT_Outline_GetInsideBorder and - * @FT_Outline_GetOutsideBorder to get these. - */ - typedef enum - { - FT_STROKER_BORDER_LEFT = 0, - FT_STROKER_BORDER_RIGHT - - } FT_StrokerBorder; - - - /************************************************************** - * - * @function: - * FT_Outline_GetInsideBorder - * - * @description: - * Retrieve the @FT_StrokerBorder value corresponding to the - * `inside' borders of a given outline. - * - * @input: - * outline :: - * The source outline handle. - * - * @return: - * The border index. @FT_STROKER_BORDER_LEFT for empty or invalid - * outlines. - */ - FT_EXPORT( FT_StrokerBorder ) - FT_Outline_GetInsideBorder( FT_Outline* outline ); - - - /************************************************************** - * - * @function: - * FT_Outline_GetOutsideBorder - * - * @description: - * Retrieve the @FT_StrokerBorder value corresponding to the - * `outside' borders of a given outline. - * - * @input: - * outline :: - * The source outline handle. - * - * @return: - * The border index. @FT_STROKER_BORDER_LEFT for empty or invalid - * outlines. - */ - FT_EXPORT( FT_StrokerBorder ) - FT_Outline_GetOutsideBorder( FT_Outline* outline ); - - - /************************************************************** - * - * @function: - * FT_Stroker_New - * - * @description: - * Create a new stroker object. - * - * @input: - * memory :: - * The memory manager handle. - * - * @output: - * A new stroker object handle. NULL in case of error. - * - * @return: - * FreeType error code. 0 means success. - */ FT_EXPORT( FT_Error ) FT_Stroker_New( FT_Memory memory, FT_Stroker *astroker ); - - /************************************************************** - * - * @function: - * FT_Stroker_Set - * - * @description: - * Reset a stroker object's attributes. - * - * @input: - * stroker :: - * The target stroker handle. - * - * radius :: - * The border radius. - * - * line_cap :: - * The line cap style. - * - * line_join :: - * The line join style. - * - * miter_limit :: - * The miter limit for the FT_STROKER_LINEJOIN_MITER style, - * expressed as 16.16 fixed point value. - * - * @note: - * The radius is expressed in the same units that the outline - * coordinates. - */ FT_EXPORT( void ) FT_Stroker_Set( FT_Stroker stroker, FT_Fixed radius, @@ -235,208 +109,29 @@ FT_BEGIN_HEADER FT_Fixed miter_limit ); - /************************************************************** - * - * @function: - * FT_Stroker_Rewind - * - * @description: - * Reset a stroker object without changing its attributes. - * You should call this function before beginning a new - * series of calls to @FT_Stroker_BeginSubPath or - * @FT_Stroker_EndSubPath. - * - * @input: - * stroker :: - * The target stroker handle. - */ - FT_EXPORT( void ) - FT_Stroker_Rewind( FT_Stroker stroker ); - - - /************************************************************** - * - * @function: - * FT_Stroker_ParseOutline - * - * @description: - * A convenience function used to parse a whole outline with - * the stroker. The resulting outline(s) can be retrieved - * later by functions like @FT_Stroker_GetCounts and @FT_Stroker_Export. - * - * @input: - * stroker :: - * The target stroker handle. - * - * outline :: - * The source outline. - * - * opened :: - * A boolean. If TRUE, the outline is treated as an open path - * instead of a closed one. - * - * @return: - * FreeType error code. 0 means success. - * - * @note: - * If `opened' is 0 (the default), the outline is treated as a closed - * path, and the stroker will generate two distinct `border' outlines. - * - * If `opened' is 1, the outline is processed as an open path, and the - * stroker will generate a single `stroke' outline. - * - * This function calls @FT_Stroker_Rewind automatically. - */ FT_EXPORT( FT_Error ) FT_Stroker_ParseOutline( FT_Stroker stroker, FT_Outline* outline, FT_Bool opened ); - - /************************************************************** - * - * @function: - * FT_Stroker_BeginSubPath - * - * @description: - * Start a new sub-path in the stroker. - * - * @input: - * stroker :: - * The target stroker handle. - * - * to :: - * A pointer to the start vector. - * - * open :: - * A boolean. If TRUE, the sub-path is treated as an open one. - * - * @return: - * FreeType error code. 0 means success. - * - * @note: - * This function is useful when you need to stroke a path that is - * not stored as a @FT_Outline object. - */ FT_EXPORT( FT_Error ) FT_Stroker_BeginSubPath( FT_Stroker stroker, FT_Vector* to, FT_Bool open ); - - /************************************************************** - * - * @function: - * FT_Stroker_EndSubPath - * - * @description: - * Close the current sub-path in the stroker. - * - * @input: - * stroker :: - * The target stroker handle. - * - * @return: - * FreeType error code. 0 means success. - * - * @note: - * You should call this function after @FT_Stroker_BeginSubPath. - * If the subpath was not `opened', this function will `draw' a - * single line segment to the start position when needed. - */ FT_EXPORT( FT_Error ) FT_Stroker_EndSubPath( FT_Stroker stroker ); - /************************************************************** - * - * @function: - * FT_Stroker_LineTo - * - * @description: - * `Draw' a single line segment in the stroker's current sub-path, - * from the last position. - * - * @input: - * stroker :: - * The target stroker handle. - * - * to :: - * A pointer to the destination point. - * - * @return: - * FreeType error code. 0 means success. - * - * @note: - * You should call this function between @FT_Stroker_BeginSubPath and - * @FT_Stroker_EndSubPath. - */ FT_EXPORT( FT_Error ) FT_Stroker_LineTo( FT_Stroker stroker, FT_Vector* to ); - - /************************************************************** - * - * @function: - * FT_Stroker_ConicTo - * - * @description: - * `Draw; a single quadratic bezier in the stroker's current sub-path, - * from the last position. - * - * @input: - * stroker :: - * The target stroker handle. - * - * control :: - * A pointer to a B閦ier control point. - * - * to :: - * A pointer to the destination point. - * - * @return: - * FreeType error code. 0 means success. - * - * @note: - * You should call this function between @FT_Stroker_BeginSubPath and - * @FT_Stroker_EndSubPath. - */ FT_EXPORT( FT_Error ) FT_Stroker_ConicTo( FT_Stroker stroker, FT_Vector* control, FT_Vector* to ); - - /************************************************************** - * - * @function: - * FT_Stroker_CubicTo - * - * @description: - * `Draw' a single cubic B閦ier in the stroker's current sub-path, - * from the last position. - * - * @input: - * stroker :: - * The target stroker handle. - * - * control1 :: - * A pointer to the first B閦ier control point. - * - * control2 :: - * A pointer to second B閦ier control point. - * - * to :: - * A pointer to the destination point. - * - * @return: - * FreeType error code. 0 means success. - * - * @note: - * You should call this function between @FT_Stroker_BeginSubPath and - * @FT_Stroker_EndSubPath. - */ FT_EXPORT( FT_Error ) FT_Stroker_CubicTo( FT_Stroker stroker, FT_Vector* control1, @@ -444,240 +139,19 @@ FT_BEGIN_HEADER FT_Vector* to ); - /************************************************************** - * - * @function: - * FT_Stroker_GetBorderCounts - * - * @description: - * Vall this function once you have finished parsing your paths - * with the stroker. It will return the number of points and - * contours necessary to export one of the `border' or `stroke' - * outlines generated by the stroker. - * - * @input: - * stroker :: - * The target stroker handle. - * - * border :: - * The border index. - * - * @output: - * anum_points :: - * The number of points. - * - * anum_contours :: - * The number of contours. - * - * @return: - * FreeType error code. 0 means success. - * - * @note: - * When an outline, or a sub-path, is `closed', the stroker generates - * two independent `border' outlines, named `left' and `right'. - * - * When the outline, or a sub-path, is `opened', the stroker merges - * the `border' outlines with caps. The `left' border receives all - * points, while the `right' border becomes empty. - * - * Use the function @FT_Stroker_GetCounts instead if you want to - * retrieve the counts associated to both borders. - */ - FT_EXPORT( FT_Error ) - FT_Stroker_GetBorderCounts( FT_Stroker stroker, - FT_StrokerBorder border, - FT_UInt *anum_points, - FT_UInt *anum_contours ); - - - /************************************************************** - * - * @function: - * FT_Stroker_ExportBorder - * - * @description: - * Call this function after @FT_Stroker_GetBorderCounts to - * export the corresponding border to your own @FT_Outline - * structure. - * - * Note that this function will append the border points and - * contours to your outline, but will not try to resize its - * arrays. - * - * @input: - * stroker :: - * The target stroker handle. - * - * border :: - * The border index. - * - * outline :: - * The target outline handle. - * - * @note: - * Always call this function after @FT_Stroker_GetBorderCounts to - * get sure that there is enough room in your @FT_Outline object to - * receive all new data. - * - * When an outline, or a sub-path, is `closed', the stroker generates - * two independent `border' outlines, named `left' and `right' - * - * When the outline, or a sub-path, is `opened', the stroker merges - * the `border' outlines with caps. The `left' border receives all - * points, while the `right' border becomes empty. - * - * Use the function @FT_Stroker_Export instead if you want to - * retrieve all borders at once. - */ - FT_EXPORT( void ) - FT_Stroker_ExportBorder( FT_Stroker stroker, - FT_StrokerBorder border, - FT_Outline* outline ); - - - /************************************************************** - * - * @function: - * FT_Stroker_GetCounts - * - * @description: - * Call this function once you have finished parsing your paths - * with the stroker. It returns the number of points and - * contours necessary to export all points/borders from the stroked - * outline/path. - * - * @input: - * stroker :: - * The target stroker handle. - * - * @output: - * anum_points :: - * The number of points. - * - * anum_contours :: - * The number of contours. - * - * @return: - * FreeType error code. 0 means success. - */ FT_EXPORT( FT_Error ) FT_Stroker_GetCounts( FT_Stroker stroker, FT_UInt *anum_points, FT_UInt *anum_contours ); - - /************************************************************** - * - * @function: - * FT_Stroker_Export - * - * @description: - * Call this function after @FT_Stroker_GetBorderCounts to - * export the all borders to your own @FT_Outline structure. - * - * Note that this function will append the border points and - * contours to your outline, but will not try to resize its - * arrays. - * - * @input: - * stroker :: - * The target stroker handle. - * - * outline :: - * The target outline handle. - */ FT_EXPORT( void ) FT_Stroker_Export( FT_Stroker stroker, FT_Outline* outline ); - - /************************************************************** - * - * @function: - * FT_Stroker_Done - * - * @description: - * Destroy a stroker object. - * - * @input: - * stroker :: - * A stroker handle. Can be NULL. - */ FT_EXPORT( void ) FT_Stroker_Done( FT_Stroker stroker ); - /************************************************************** - * - * @function: - * FT_Glyph_Stroke - * - * @description: - * Stroke a given outline glyph object with a given stroker. - * - * @inout: - * pglyph :: Source glyph handle on input, new glyph handle - * on output. - * - * @input: - * stroker :: - * A stroker handle. - * - * destroy :: - * A Boolean. If TRUE, the source glyph object is destroyed - * on success. - * - * @return: - * FreeType error code. 0 means success. - * - * @note: - * The source glyph is untouched in case of error. - */ - FT_EXPORT( FT_Error ) - FT_Glyph_Stroke( FT_Glyph *pglyph, - FT_Stroker stroker, - FT_Bool destroy ); - - - /************************************************************** - * - * @function: - * FT_Glyph_StrokeBorder - * - * @description: - * Stroke a given outline glyph object with a given stroker, but - * only return either its inside or outside border. - * - * @inout: - * pglyph :: - * Source glyph handle on input, new glyph handle on output. - * - * @input: - * stroker :: - * A stroker handle. - * - * inside :: - * A Boolean. If TRUE, return the inside border, otherwise - * the outside border. - * - * destroy :: - * A Boolean. If TRUE, the source glyph object is destroyed - * on success. - * - * @return: - * FreeType error code. 0 means success. - * - * @note: - * The source glyph is untouched in case of error. - */ - FT_EXPORT( FT_Error ) - FT_Glyph_StrokeBorder( FT_Glyph *pglyph, - FT_Stroker stroker, - FT_Bool inside, - FT_Bool destroy ); - - /* */ - FT_END_HEADER #endif /* __FT_STROKE_H__ */ diff --git a/reactos/lib/freetype/include/freetype/ftsynth.h b/reactos/lib/freetype/include/freetype/ftsynth.h index f0c738532f3..2424ff6273c 100644 --- a/reactos/lib/freetype/include/freetype/ftsynth.h +++ b/reactos/lib/freetype/include/freetype/ftsynth.h @@ -5,7 +5,7 @@ /* FreeType synthesizing code for emboldening and slanting */ /* (specification). */ /* */ -/* Copyright 2000-2001, 2003 by */ +/* Copyright 2000-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -41,12 +41,6 @@ #include <ft2build.h> #include FT_FREETYPE_H -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - FT_BEGIN_HEADER diff --git a/reactos/lib/freetype/include/freetype/fttrigon.h b/reactos/lib/freetype/include/freetype/fttrigon.h index 0462265e3c7..cf0650e2f5d 100644 --- a/reactos/lib/freetype/include/freetype/fttrigon.h +++ b/reactos/lib/freetype/include/freetype/fttrigon.h @@ -21,12 +21,6 @@ #include FT_FREETYPE_H -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - FT_BEGIN_HEADER diff --git a/reactos/lib/freetype/include/freetype/ftwinfnt.h b/reactos/lib/freetype/include/freetype/ftwinfnt.h index a19a12d9720..9b308af27d1 100644 --- a/reactos/lib/freetype/include/freetype/ftwinfnt.h +++ b/reactos/lib/freetype/include/freetype/ftwinfnt.h @@ -22,12 +22,6 @@ #include <ft2build.h> #include FT_FREETYPE_H -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - FT_BEGIN_HEADER @@ -49,132 +43,10 @@ FT_BEGIN_HEADER /* */ /*************************************************************************/ - - /************************************************************************* - * - * @enum: - * FT_WinFNT_ID_XXX - * - * @description: - * A list of valid values for the `charset' byte in - * @FT_WinFNT_HeaderRec. Exact mapping tables for the various cpXXXX - * encodings (except for cp1361) can be found at ftp://ftp.unicode.org - * in the MAPPINGS/VENDORS/MICSFT/WINDOWS subdirectory. cp1361 is - * roughly a superset of MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT. - * - * @values: - * FT_WinFNT_ID_DEFAULT :: - * This is used for font enumeration and font creation as a - * `don't care' value. Valid font files don't contain this value. - * When querying for information about the character set of the font - * that is currently selected into a specified device context, this - * return value (of the related Windows API) simply denotes failure. - * - * FT_WinFNT_ID_SYMBOL :: - * There is no known mapping table available. - * - * FT_WinFNT_ID_MAC :: - * Mac Roman encoding. - * - * FT_WinFNT_ID_OEM :: - * From Michael P鰐tgen <michael@poettgen.de>: - * The `Windows Font Mapping' article says that FT_WinFNT_ID_OEM - * is used for the charset of vector fonts, like `modern.fon', - * `roman.fon', and `script.fon' on Windows. - * - * The `CreateFont' documentation says: The FT_WinFNT_ID_OEM value - * specifies a character set that is operating-system dependent. - * - * The `IFIMETRICS' documentation from the `Windows Driver - * Development Kit' says: This font supports an OEM-specific - * character set. The OEM character set is system dependent. - * - * In general OEM, as opposed to ANSI (i.e., cp1252), denotes the - * second default codepage that most international versions of - * Windows have. It is one of the OEM codepages from - * - * http://www.microsoft.com/globaldev/reference/cphome.mspx, - * - * and is used for the `DOS boxes', to support legacy applications. - * A German Windows version for example usually uses ANSI codepage - * 1252 and OEM codepage 850. - * - * FT_WinFNT_ID_CP874 :: - * A superset of Thai TIS 620 and ISO 8859-11. - * - * FT_WinFNT_ID_CP932 :: - * A superset of Japanese Shift-JIS (with minor deviations). - * - * FT_WinFNT_ID_CP936 :: - * A superset of simplified Chinese GB 2312-1980 (with different - * ordering and minor deviations). - * - * FT_WinFNT_ID_CP949 :: - * A superset of Korean Hangul KS C 5601-1987 (with different - * ordering and minor deviations). - * - * FT_WinFNT_ID_CP950 :: - * A superset of traditional Chinese Big 5 ETen (with different - * ordering and minor deviations). - * - * FT_WinFNT_ID_CP1250 :: - * A superset of East European ISO 8859-2 (with slightly different - * ordering). - * - * FT_WinFNT_ID_CP1251 :: - * A superset of Russian ISO 8859-5 (with different ordering). - * - * FT_WinFNT_ID_CP1252 :: - * ANSI encoding. A superset of ISO 8859-1. - * - * FT_WinFNT_ID_CP1253 :: - * A superset of Greek ISO 8859-7 (with minor modifications). - * - * FT_WinFNT_ID_CP1254 :: - * A superset of Turkish ISO 8859-9. - * - * FT_WinFNT_ID_CP1255 :: - * A superset of Hebrew ISO 8859-8 (with some modifications). - * - * FT_WinFNT_ID_CP1256 :: - * A superset of Arabic ISO 8859-6 (with different ordering). - * - * FT_WinFNT_ID_CP1257 :: - * A superset of Baltic ISO 8859-13 (with some deviations). - * - * FT_WinFNT_ID_CP1258 :: - * For Vietnamese. This encoding doesn't cover all necessary - * characters. - * - * FT_WinFNT_ID_CP1361 :: - * Korean (Johab). - */ - -#define FT_WinFNT_ID_CP1252 0 -#define FT_WinFNT_ID_DEFAULT 1 -#define FT_WinFNT_ID_SYMBOL 2 -#define FT_WinFNT_ID_MAC 77 -#define FT_WinFNT_ID_CP932 128 -#define FT_WinFNT_ID_CP949 129 -#define FT_WinFNT_ID_CP1361 130 -#define FT_WinFNT_ID_CP936 134 -#define FT_WinFNT_ID_CP950 136 -#define FT_WinFNT_ID_CP1253 161 -#define FT_WinFNT_ID_CP1254 162 -#define FT_WinFNT_ID_CP1258 163 -#define FT_WinFNT_ID_CP1255 177 -#define FT_WinFNT_ID_CP1256 178 -#define FT_WinFNT_ID_CP1257 186 -#define FT_WinFNT_ID_CP1251 204 -#define FT_WinFNT_ID_CP874 222 -#define FT_WinFNT_ID_CP1250 238 -#define FT_WinFNT_ID_OEM 255 - - /*************************************************************************/ /* */ /* <Struct> */ - /* FT_WinFNT_HeaderRec */ + /* FT_WinFNT_HeaderRec_ */ /* */ /* <Description> */ /* Windows FNT Header info. */ diff --git a/reactos/lib/freetype/include/freetype/ftxf86.h b/reactos/lib/freetype/include/freetype/ftxf86.h index aa93275a464..5a7582f9172 100644 --- a/reactos/lib/freetype/include/freetype/ftxf86.h +++ b/reactos/lib/freetype/include/freetype/ftxf86.h @@ -4,7 +4,7 @@ /* */ /* Support functions for X11. */ /* */ -/* Copyright 2002, 2003 by */ +/* Copyright 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -22,13 +22,6 @@ #include <ft2build.h> #include FT_FREETYPE_H -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - - FT_BEGIN_HEADER /* this comment is intentionally disabled for now, to prevent this */ diff --git a/reactos/lib/freetype/include/freetype/internal/ftcalc.h b/reactos/lib/freetype/include/freetype/internal/ftcalc.h index 7866c46273a..af1f6407202 100644 --- a/reactos/lib/freetype/include/freetype/internal/ftcalc.h +++ b/reactos/lib/freetype/include/freetype/internal/ftcalc.h @@ -4,7 +4,7 @@ /* */ /* Arithmetic computations (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -27,8 +27,7 @@ FT_BEGIN_HEADER - FT_EXPORT( FT_Int32 ) - FT_SqrtFixed( FT_Int32 x ); + FT_EXPORT( FT_Int32 ) FT_SqrtFixed( FT_Int32 x ); #define SQRT_32( x ) FT_Sqrt32( x ) @@ -60,39 +59,6 @@ FT_BEGIN_HEADER /*************************************************************************/ -#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_MulDiv_No_Round */ - /* */ - /* <Description> */ - /* A very simple function used to perform the computation `(a*b)/c' */ - /* (without rounding) with maximal accuracy (it uses a 64-bit */ - /* intermediate integer whenever necessary). */ - /* */ - /* This function isn't necessarily as fast as some processor specific */ - /* operations, but is at least completely portable. */ - /* */ - /* <Input> */ - /* a :: The first multiplier. */ - /* b :: The second multiplier. */ - /* c :: The divisor. */ - /* */ - /* <Return> */ - /* The result of `(a*b)/c'. This function never traps when trying to */ - /* divide by zero; it simply returns `MaxInt' or `MinInt' depending */ - /* on the signs of `a' and `b'. */ - /* */ - FT_BASE( FT_Long ) - FT_MulDiv_No_Round( FT_Long a, - FT_Long b, - FT_Long c ); - -#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ - - #define INT_TO_F26DOT6( x ) ( (FT_Long)(x) << 6 ) #define INT_TO_F2DOT14( x ) ( (FT_Long)(x) << 14 ) #define INT_TO_FIXED( x ) ( (FT_Long)(x) << 16 ) diff --git a/reactos/lib/freetype/include/freetype/internal/ftdriver.h b/reactos/lib/freetype/include/freetype/internal/ftdriver.h index 02f585d6b08..1f1c55aaa53 100644 --- a/reactos/lib/freetype/include/freetype/internal/ftdriver.h +++ b/reactos/lib/freetype/include/freetype/internal/ftdriver.h @@ -155,15 +155,11 @@ FT_BEGIN_HEADER /* add data from AFM or PFM files on a Type 1 */ /* face, or a CIDMap on a CID-keyed face. */ /* */ - /* get_advances :: A function handle used to return advance */ - /* widths of 'count' glyphs (in font units), */ - /* starting at `first'. The `vertical' flag must */ - /* be set to get vertical advance heights. The */ - /* `advances' buffer is caller-allocated. */ - /* Currently not implemented. The idea of this */ - /* function is to be able to perform */ - /* device-independent text layout without loading */ - /* a single glyph image. */ + /* get_advances :: A function handle used to return the advances */ + /* of 'count' glyphs, starting at `index'. the */ + /* `vertical' flags must be set when vertical */ + /* advances are queried. The advances buffer is */ + /* caller-allocated. */ /* */ /* <Note> */ /* Most function pointers, with the exception of `load_glyph' and */ diff --git a/reactos/lib/freetype/include/freetype/internal/ftgloadr.h b/reactos/lib/freetype/include/freetype/internal/ftgloadr.h index abc56e25664..284f4e3b6ac 100644 --- a/reactos/lib/freetype/include/freetype/internal/ftgloadr.h +++ b/reactos/lib/freetype/include/freetype/internal/ftgloadr.h @@ -110,15 +110,15 @@ FT_BEGIN_HEADER FT_BASE( void ) FT_GlyphLoader_Rewind( FT_GlyphLoader loader ); - /* check that there is enough space to add `n_points' and `n_contours' */ - /* to the glyph loader */ + /* check that there is enough room to add 'n_points' and 'n_contours' */ + /* to the glyph loader */ FT_BASE( FT_Error ) FT_GlyphLoader_CheckPoints( FT_GlyphLoader loader, FT_UInt n_points, FT_UInt n_contours ); - /* check that there is enough space to add `n_subs' sub-glyphs to */ - /* a glyph loader */ + /* check that there is enough room to add 'n_subs' sub-glyphs to */ + /* a glyph loader */ FT_BASE( FT_Error ) FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader loader, FT_UInt n_subs ); diff --git a/reactos/lib/freetype/include/freetype/internal/ftmemory.h b/reactos/lib/freetype/include/freetype/internal/ftmemory.h index 63f37aff7ce..8da5fadc3c6 100644 --- a/reactos/lib/freetype/include/freetype/internal/ftmemory.h +++ b/reactos/lib/freetype/include/freetype/internal/ftmemory.h @@ -4,7 +4,7 @@ /* */ /* The FreeType memory management macros (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2004 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -180,12 +180,6 @@ FT_BEGIN_HEADER #define FT_ZERO( p ) FT_MEM_ZERO( p, sizeof ( *(p) ) ) -#define FT_ARRAY_COPY( dest, source, count ) \ - FT_MEM_COPY( dest, source, (count) * sizeof( *(dest) ) ) - -#define FT_ARRAY_MOVE( dest, source, count ) \ - FT_MEM_MOVE( dest, source, (count) * sizeof( *(dest) ) ) - /*************************************************************************/ /* */ diff --git a/reactos/lib/freetype/include/freetype/internal/ftobjs.h b/reactos/lib/freetype/include/freetype/internal/ftobjs.h index 75569b7f818..79319e8742b 100644 --- a/reactos/lib/freetype/include/freetype/internal/ftobjs.h +++ b/reactos/lib/freetype/include/freetype/internal/ftobjs.h @@ -34,7 +34,7 @@ #include FT_INTERNAL_GLYPH_LOADER_H #include FT_INTERNAL_DRIVER_H #include FT_INTERNAL_AUTOHINT_H -#include FT_INTERNAL_SERVICE_H +#include FT_INTERNAL_OBJECT_H #ifdef FT_CONFIG_OPTION_INCREMENTAL #include FT_INCREMENTAL_H @@ -79,15 +79,6 @@ FT_BEGIN_HEADER #endif -#define FT_PAD_FLOOR( x, n ) ( (x) & ~((n)-1) ) -#define FT_PAD_ROUND( x, n ) FT_PAD_FLOOR( (x) + ((n)/2), n ) -#define FT_PAD_CEIL( x, n ) FT_PAD_FLOOR( (x) + ((n)-1), n ) - -#define FT_PIX_FLOOR( x ) ( (x) & ~63 ) -#define FT_PIX_ROUND( x ) FT_PIX_FLOOR( (x) + 32 ) -#define FT_PIX_CEIL( x ) FT_PIX_FLOOR( (x) + 63 ) - - /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ @@ -280,52 +271,51 @@ FT_BEGIN_HEADER /* FreeType. */ /* */ /* <Fields> */ - /* max_points :: */ - /* The maximal number of points used to store the vectorial outline */ - /* of any glyph in this face. If this value cannot be known in */ - /* advance, or if the face isn't scalable, this should be set to 0. */ - /* Only relevant for scalable formats. */ + /* max_points :: The maximal number of points used to store the */ + /* vectorial outline of any glyph in this face. */ + /* If this value cannot be known in advance, or */ + /* if the face isn't scalable, this should be set */ + /* to 0. Only relevant for scalable formats. */ /* */ - /* max_contours :: */ - /* The maximal number of contours used to store the vectorial */ - /* outline of any glyph in this face. If this value cannot be */ - /* known in advance, or if the face isn't scalable, this should be */ - /* set to 0. Only relevant for scalable formats. */ + /* max_contours :: The maximal number of contours used to store */ + /* the vectorial outline of any glyph in this */ + /* face. If this value cannot be known in */ + /* advance, or if the face isn't scalable, this */ + /* should be set to 0. Only relevant for */ + /* scalable formats. */ /* */ - /* transform_matrix :: */ - /* A 2x2 matrix of 16.16 coefficients used to transform glyph */ - /* outlines after they are loaded from the font. Only used by the */ - /* convenience functions. */ + /* transform_matrix :: A 2x2 matrix of 16.16 coefficients used to */ + /* transform glyph outlines after they are loaded */ + /* from the font. Only used by the convenience */ + /* functions. */ /* */ - /* transform_delta :: */ - /* A translation vector used to transform glyph outlines after they */ - /* are loaded from the font. Only used by the convenience */ - /* functions. */ + /* transform_delta :: A translation vector used to transform glyph */ + /* outlines after they are loaded from the font. */ + /* Only used by the convenience functions. */ /* */ - /* transform_flags :: */ - /* Some flags used to classify the transform. Only used by the */ - /* convenience functions. */ + /* transform_flags :: Some flags used to classify the transform. */ + /* Only used by the convenience functions. */ /* */ - /* services :: */ - /* A cache for frequently used services. It should be only */ - /* accessed with the macro `FT_FACE_LOOKUP_SERVICE'. */ + /* postscript_name :: Postscript font name for this face. */ /* */ /* incremental_interface :: */ - /* If non-null, the interface through which glyph data and metrics */ - /* are loaded incrementally for faces that do not provide all of */ - /* this data when first opened. This field exists only if */ - /* @FT_CONFIG_OPTION_INCREMENTAL is defined. */ + /* If non-null, the interface through */ + /* which glyph data and metrics are loaded */ + /* incrementally for faces that do not provide */ + /* all of this data when first opened. */ + /* This field exists only if */ + /* @FT_CONFIG_OPTION_INCREMENTAL is defined. */ /* */ typedef struct FT_Face_InternalRec_ { - FT_UShort max_points; - FT_Short max_contours; + FT_UShort max_points; + FT_Short max_contours; - FT_Matrix transform_matrix; - FT_Vector transform_delta; - FT_Int transform_flags; + FT_Matrix transform_matrix; + FT_Vector transform_delta; + FT_Int transform_flags; - FT_ServiceCacheRec services; + const char* postscript_name; #ifdef FT_CONFIG_OPTION_INCREMENTAL FT_Incremental_InterfaceRec* incremental_interface; @@ -476,10 +466,6 @@ FT_BEGIN_HEADER FT_Get_Module_Interface( FT_Library library, const char* mod_name ); - FT_BASE( FT_Pointer ) - ft_module_get_service( FT_Module module, - const char* service_id ); - /* */ @@ -718,12 +704,6 @@ FT_BEGIN_HEADER /* generic :: Client data variable. Used to extend the */ /* Library class by higher levels and clients. */ /* */ - /* version_major :: The major version number of the library. */ - /* */ - /* version_minor :: The minor version number of the library. */ - /* */ - /* version_patch :: The current patch level of the library. */ - /* */ /* num_modules :: The number of modules currently registered */ /* within this library. This is set to 0 for new */ /* libraries. New modules are added through the */ @@ -774,6 +754,8 @@ FT_BEGIN_HEADER FT_DebugHook_Func debug_hooks[4]; + FT_MetaClassRec meta_class; + } FT_LibraryRec; diff --git a/reactos/lib/freetype/include/freetype/internal/ftserv.h b/reactos/lib/freetype/include/freetype/internal/ftserv.h deleted file mode 100644 index e5ed8895b36..00000000000 --- a/reactos/lib/freetype/include/freetype/internal/ftserv.h +++ /dev/null @@ -1,260 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftserv.h */ -/* */ -/* The FreeType services (specification only). */ -/* */ -/* Copyright 2003 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - /*************************************************************************/ - /* */ - /* Each module can export one or more `services'. Each service is */ - /* identified by a constant string and modeled by a pointer; the latter */ - /* generally corresponds to a structure containing function pointers. */ - /* */ - /* Note that a service's data cannot be a mere function pointer because */ - /* in C it is possible that function pointers might be implemented */ - /* differently than data pointers (e.g. 48 bits instead of 32). */ - /* */ - /*************************************************************************/ - - -#ifndef __FTSERV_H__ -#define __FTSERV_H__ - - -FT_BEGIN_HEADER - - - /* - * @macro: - * FT_FACE_FIND_SERVICE - * - * @description: - * This macro is used to look up a service from a face's driver module. - * - * @input: - * face :: - * The source face handle. - * - * id :: - * A string describing the service as defined in the service's - * header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to - * `multi-masters'). It is automatically prefixed with - * `FT_SERVICE_ID_'. - * - * @output: - * ptr :: - * A variable that receives the service pointer. Will be NULL - * if not found. - */ -#define FT_FACE_FIND_SERVICE( face, ptr, id ) \ - FT_BEGIN_STMNT \ - FT_Module module = FT_MODULE( FT_FACE(face)->driver ); \ - /* the strange cast is to allow C++ compilation */ \ - FT_Pointer* Pptr = (FT_Pointer*) &(ptr); \ - \ - \ - *Pptr = NULL; \ - if ( module->clazz->get_interface ) \ - *Pptr = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \ - FT_END_STMNT - - - /* - * @macro: - * FT_FACE_FIND_GLOBAL_SERVICE - * - * @description: - * This macro is used to look up a service from all modules. - * - * @input: - * face :: - * The source face handle. - * - * id :: - * A string describing the service as defined in the service's - * header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to - * `multi-masters'). It is automatically prefixed with - * `FT_SERVICE_ID_'. - * - * @output: - * ptr :: - * A variable that receives the service pointer. Will be NULL - * if not found. - */ -#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \ - FT_BEGIN_STMNT \ - FT_Module module = FT_MODULE( FT_FACE(face)->driver ); \ - /* the strange cast is to allow C++ compilation */ \ - FT_Pointer* Pptr = (FT_Pointer*) &(ptr); \ - \ - \ - *Pptr = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \ - FT_END_STMNT - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** S E R V I C E D E S C R I P T O R S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* - * The following structure is used to _describe_ a given service - * to the library. This is useful to build simple static service lists. - */ - typedef struct FT_ServiceDescRec_ - { - const char* serv_id; /* service name */ - const void* serv_data; /* service pointer/data */ - - } FT_ServiceDescRec; - - typedef const FT_ServiceDescRec* FT_ServiceDesc; - - - /* - * Parse a list of FT_ServiceDescRec descriptors and look for - * a specific service by ID. Note that the last element in the - * array must be { NULL, NULL }, and that the function should - * return NULL if the service isn't available. - * - * This function can be used by modules to implement their - * `get_service' method. - */ - FT_BASE( FT_Pointer ) - ft_service_list_lookup( FT_ServiceDesc service_descriptors, - const char* service_id ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** S E R V I C E S C A C H E *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* - * This structure is used to store a cache for several frequently used - * services. It is the type of `face->internal->services'. You - * should only use FT_FACE_LOOKUP_SERVICE to access it. - * - * All fields should have the type FT_Pointer to relax compilation - * dependencies. We assume the developer isn't completely stupid. - * - * Each field must be named `service_XXXX' where `XXX' corresponds to - * the correct FT_SERVICE_ID_XXXX macro. See the definition of - * FT_FACE_LOOKUP_SERVICE below how this is implemented. - * - */ - typedef struct FT_ServiceCacheRec_ - { - FT_Pointer service_POSTSCRIPT_FONT_NAME; - FT_Pointer service_MULTI_MASTERS; - FT_Pointer service_GLYPH_DICT; - FT_Pointer service_PFR_METRICS; - FT_Pointer service_WINFNT; - - } FT_ServiceCacheRec, *FT_ServiceCache; - - - /* - * A magic number used within the services cache. - */ -#define FT_SERVICE_UNAVAILABLE ((FT_Pointer)-2) /* magic number */ - - - /* - * @macro: - * FT_FACE_LOOKUP_SERVICE - * - * @description: - * This macro is used to lookup a service from a face's driver module - * using its cache. - * - * @input: - * face:: - * The source face handle containing the cache. - * - * field :: - * The field name in the cache. - * - * id :: - * The service ID. - * - * @output: - * ptr :: - * A variable receiving the service data. NULL if not available. - */ -#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \ - FT_BEGIN_STMNT \ - /* the strange cast is to allow C++ compilation */ \ - FT_Pointer* pptr = (FT_Pointer*)&(ptr); \ - FT_Pointer svc; \ - \ - \ - svc = FT_FACE(face)->internal->services. service_ ## id ; \ - if ( svc == FT_SERVICE_UNAVAILABLE ) \ - svc = NULL; \ - else if ( svc == NULL ) \ - { \ - FT_FACE_FIND_SERVICE( face, svc, id ); \ - \ - FT_FACE(face)->internal->services. service_ ## id = \ - (FT_Pointer)( svc != NULL ? svc \ - : FT_SERVICE_UNAVAILABLE ); \ - } \ - *pptr = svc; \ - FT_END_STMNT - - - /* - * A macro used to define new service structure types. - */ - -#define FT_DEFINE_SERVICE( name ) \ - typedef struct FT_Service_ ## name ## Rec_ \ - FT_Service_ ## name ## Rec ; \ - typedef struct FT_Service_ ## name ## Rec_ \ - const * FT_Service_ ## name ; \ - struct FT_Service_ ## name ## Rec_ - - /* */ - - /* - * The header files containing the services. - */ - -#define FT_SERVICE_MULTIPLE_MASTERS_H <freetype/internal/services/svmm.h> -#define FT_SERVICE_POSTSCRIPT_NAME_H <freetype/internal/services/svpostnm.h> -#define FT_SERVICE_POSTSCRIPT_CMAPS_H <freetype/internal/services/svpscmap.h> -#define FT_SERVICE_POSTSCRIPT_INFO_H <freetype/internal/services/svpsinfo.h> -#define FT_SERVICE_GLYPH_DICT_H <freetype/internal/services/svgldict.h> -#define FT_SERVICE_BDF_H <freetype/internal/services/svbdf.h> -#define FT_SERVICE_XFREE86_NAME_H <freetype/internal/services/svxf86nm.h> -#define FT_SERVICE_SFNT_H <freetype/internal/services/svsfnt.h> -#define FT_SERVICE_PFR_H <freetype/internal/services/svpfr.h> -#define FT_SERVICE_WINFNT_H <freetype/internal/services/svwinfnt.h> -#define FT_SERVICE_TT_CMAP_H <freetype/internal/services/svttcmap.h> - - /* */ - -FT_END_HEADER - -#endif /* __FTSERV_H__ */ - - -/* END */ diff --git a/reactos/lib/freetype/include/freetype/internal/internal.h b/reactos/lib/freetype/include/freetype/internal/internal.h index 03487894213..872f6ac7977 100644 --- a/reactos/lib/freetype/include/freetype/internal/internal.h +++ b/reactos/lib/freetype/include/freetype/internal/internal.h @@ -27,17 +27,26 @@ #define FT_INTERNAL_OBJECTS_H <freetype/internal/ftobjs.h> #define FT_INTERNAL_STREAM_H <freetype/internal/ftstream.h> #define FT_INTERNAL_MEMORY_H <freetype/internal/ftmemory.h> +#define FT_INTERNAL_EXTENSION_H <freetype/internal/ftextend.h> #define FT_INTERNAL_DEBUG_H <freetype/internal/ftdebug.h> #define FT_INTERNAL_CALC_H <freetype/internal/ftcalc.h> #define FT_INTERNAL_DRIVER_H <freetype/internal/ftdriver.h> +#define FT_INTERNAL_EXTEND_H <freetype/internal/ftextend.h> #define FT_INTERNAL_TRACE_H <freetype/internal/fttrace.h> #define FT_INTERNAL_GLYPH_LOADER_H <freetype/internal/ftgloadr.h> #define FT_INTERNAL_SFNT_H <freetype/internal/sfnt.h> -#define FT_INTERNAL_SERVICE_H <freetype/internal/ftserv.h> +#define FT_INTERNAL_HASH_H <freetype/internal/fthash.h> +#define FT_INTERNAL_OBJECT_H <freetype/internal/ftobject.h> #define FT_INTERNAL_TRUETYPE_TYPES_H <freetype/internal/tttypes.h> #define FT_INTERNAL_TYPE1_TYPES_H <freetype/internal/t1types.h> +#define FT_INTERNAL_TYPE42_TYPES_H <freetype/internal/t42types.h> +#define FT_INTERNAL_CFF_TYPES_H <freetype/internal/cfftypes.h> +#define FT_INTERNAL_FNT_TYPES_H <freetype/internal/fnttypes.h> +#define FT_INTERNAL_BDF_TYPES_H <freetype/internal/bdftypes.h> +#define FT_INTERNAL_PFR_H <freetype/internal/pfr.h> +#define FT_INTERNAL_POSTSCRIPT_NAMES_H <freetype/internal/psnames.h> #define FT_INTERNAL_POSTSCRIPT_AUX_H <freetype/internal/psaux.h> #define FT_INTERNAL_POSTSCRIPT_HINTS_H <freetype/internal/pshints.h> #define FT_INTERNAL_POSTSCRIPT_GLOBALS_H <freetype/internal/psglobal.h> diff --git a/reactos/lib/freetype/include/freetype/internal/psaux.h b/reactos/lib/freetype/include/freetype/internal/psaux.h index 8d419be087f..c7093fe5470 100644 --- a/reactos/lib/freetype/include/freetype/internal/psaux.h +++ b/reactos/lib/freetype/include/freetype/internal/psaux.h @@ -24,7 +24,6 @@ #include <ft2build.h> #include FT_INTERNAL_OBJECTS_H #include FT_INTERNAL_TYPE1_TYPES_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H FT_BEGIN_HEADER @@ -124,7 +123,7 @@ FT_BEGIN_HEADER FT_Int max_elems; FT_Int num_elems; FT_Byte** elements; /* addresses of table elements */ - FT_PtrDist* lengths; /* lengths of table elements */ + FT_Int* lengths; /* lengths of table elements */ FT_Memory memory; PS_Table_FuncsRec funcs; @@ -330,20 +329,18 @@ FT_BEGIN_HEADER void (*skip_spaces)( PS_Parser parser ); void - (*skip_PS_token)( PS_Parser parser ); + (*skip_alpha)( PS_Parser parser ); FT_Long (*to_int)( PS_Parser parser ); FT_Fixed (*to_fixed)( PS_Parser parser, FT_Int power_ten ); - FT_Error (*to_bytes)( PS_Parser parser, FT_Byte* bytes, - FT_Long max_bytes, - FT_Long* pnum_bytes, - FT_Bool delimiters ); + FT_Int max_bytes, + FT_Int* pnum_bytes ); FT_Int (*to_coord_array)( PS_Parser parser, @@ -651,14 +648,14 @@ FT_BEGIN_HEADER T1_Decoder_ZoneRec zones[T1_MAX_SUBRS_CALLS + 1]; T1_Decoder_Zone zone; - FT_Service_PsCMaps psnames; /* for seac */ + PSNames_Service psnames; /* for seac */ FT_UInt num_glyphs; FT_Byte** glyph_names; FT_Int lenIV; /* internal for sub routine calls */ FT_UInt num_subrs; FT_Byte** subrs; - FT_PtrDist* subrs_len; /* array of subrs length (optional) */ + FT_Int* subrs_len; /* array of subrs length (optional) */ FT_Matrix font_matrix; FT_Vector font_offset; diff --git a/reactos/lib/freetype/include/freetype/internal/services/svbdf.h b/reactos/lib/freetype/include/freetype/internal/services/svbdf.h deleted file mode 100644 index 0f7fc6115d6..00000000000 --- a/reactos/lib/freetype/include/freetype/internal/services/svbdf.h +++ /dev/null @@ -1,57 +0,0 @@ -/***************************************************************************/ -/* */ -/* svbdf.h */ -/* */ -/* The FreeType BDF services (specification). */ -/* */ -/* Copyright 2003 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SVBDF_H__ -#define __SVBDF_H__ - -#include FT_BDF_H -#include FT_INTERNAL_SERVICE_H - - -FT_BEGIN_HEADER - - -#define FT_SERVICE_ID_BDF "bdf" - - typedef FT_Error - (*FT_BDF_GetCharsetIdFunc)( FT_Face face, - const char* *acharset_encoding, - const char* *acharset_registry ); - - typedef FT_Error - (*FT_BDF_GetPropertyFunc)( FT_Face face, - const char* prop_name, - BDF_PropertyRec *aproperty ); - - - FT_DEFINE_SERVICE( BDF ) - { - FT_BDF_GetCharsetIdFunc get_charset_id; - FT_BDF_GetPropertyFunc get_property; - }; - - /* */ - - -FT_END_HEADER - - -#endif /* __SVBDF_H__ */ - - -/* END */ diff --git a/reactos/lib/freetype/include/freetype/internal/services/svgldict.h b/reactos/lib/freetype/include/freetype/internal/services/svgldict.h deleted file mode 100644 index e5e56b253c1..00000000000 --- a/reactos/lib/freetype/include/freetype/internal/services/svgldict.h +++ /dev/null @@ -1,60 +0,0 @@ -/***************************************************************************/ -/* */ -/* svgldict.h */ -/* */ -/* The FreeType glyph dictionary services (specification). */ -/* */ -/* Copyright 2003 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SVGLDICT_H__ -#define __SVGLDICT_H__ - -#include FT_INTERNAL_SERVICE_H - - -FT_BEGIN_HEADER - - - /* - * A service used to retrieve glyph names, as well as to find the - * index of a given glyph name in a font. - * - */ - -#define FT_SERVICE_ID_GLYPH_DICT "glyph-dict" - - - typedef FT_Error - (*FT_GlyphDict_GetNameFunc)( FT_Face face, - FT_UInt glyph_index, - FT_Pointer buffer, - FT_UInt buffer_max ); - - typedef FT_UInt - (*FT_GlyphDict_NameIndexFunc)( FT_Face face, - FT_String* glyph_name ); - - - FT_DEFINE_SERVICE( GlyphDict ) - { - FT_GlyphDict_GetNameFunc get_name; - FT_GlyphDict_NameIndexFunc name_index; /* optional */ - }; - - /* */ - - -FT_END_HEADER - - -#endif /* __SVGLDICT_H__ */ diff --git a/reactos/lib/freetype/include/freetype/internal/services/svmm.h b/reactos/lib/freetype/include/freetype/internal/services/svmm.h deleted file mode 100644 index 926975ce88b..00000000000 --- a/reactos/lib/freetype/include/freetype/internal/services/svmm.h +++ /dev/null @@ -1,68 +0,0 @@ -/***************************************************************************/ -/* */ -/* svmm.h */ -/* */ -/* The FreeType Multiple Masters services (specification). */ -/* */ -/* Copyright 2003 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SVMM_H__ -#define __SVMM_H__ - -#include FT_INTERNAL_SERVICE_H - - -FT_BEGIN_HEADER - - - /* - * A service used to manage multiple-masters data in a given face. - * - * See the related APIs in `ftmm.h' (FT_MULTIPLE_MASTERS_H). - * - */ - -#define FT_SERVICE_ID_MULTI_MASTERS "multi-masters" - - - typedef FT_Error - (*FT_Get_MM_Func)( FT_Face face, - FT_Multi_Master* master ); - - typedef FT_Error - (*FT_Set_MM_Design_Func)( FT_Face face, - FT_UInt num_coords, - FT_Long* coords ); - - typedef FT_Error - (*FT_Set_MM_Blend_Func)( FT_Face face, - FT_UInt num_coords, - FT_Long* coords ); - - - FT_DEFINE_SERVICE( MultiMasters ) - { - FT_Get_MM_Func get_mm; - FT_Set_MM_Design_Func set_mm_design; - FT_Set_MM_Blend_Func set_mm_blend; - }; - - /* */ - - -FT_END_HEADER - -#endif /* __SVMM_H__ */ - - -/* END */ diff --git a/reactos/lib/freetype/include/freetype/internal/services/svpfr.h b/reactos/lib/freetype/include/freetype/internal/services/svpfr.h deleted file mode 100644 index b61050543e8..00000000000 --- a/reactos/lib/freetype/include/freetype/internal/services/svpfr.h +++ /dev/null @@ -1,65 +0,0 @@ -/***************************************************************************/ -/* */ -/* svpfr.h */ -/* */ -/* Internal PFR service functions (specification). */ -/* */ -/* Copyright 2003 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SVPFR_H__ -#define __SVPFR_H__ - -#include FT_INTERNAL_SERVICE_H - - -FT_BEGIN_HEADER - - -#define FT_SERVICE_ID_PFR_METRICS "pfr-metrics" - - - typedef FT_Error - (*FT_PFR_GetMetricsFunc)( FT_Face face, - FT_UInt *aoutline, - FT_UInt *ametrics, - FT_Fixed *ax_scale, - FT_Fixed *ay_scale ); - - typedef FT_Error - (*FT_PFR_GetKerningFunc)( FT_Face face, - FT_UInt left, - FT_UInt right, - FT_Vector *avector ); - - typedef FT_Error - (*FT_PFR_GetAdvanceFunc)( FT_Face face, - FT_UInt gindex, - FT_Pos *aadvance ); - - - FT_DEFINE_SERVICE( PfrMetrics ) - { - FT_PFR_GetMetricsFunc get_metrics; - FT_PFR_GetKerningFunc get_kerning; - FT_PFR_GetAdvanceFunc get_advance; - - }; - - /* */ - -FT_END_HEADER - -#endif /* __SVPFR_H__ */ - - -/* END */ diff --git a/reactos/lib/freetype/include/freetype/internal/services/svpostnm.h b/reactos/lib/freetype/include/freetype/internal/services/svpostnm.h deleted file mode 100644 index 7f1700adb39..00000000000 --- a/reactos/lib/freetype/include/freetype/internal/services/svpostnm.h +++ /dev/null @@ -1,58 +0,0 @@ -/***************************************************************************/ -/* */ -/* svpostnm.h */ -/* */ -/* The FreeType PostScript name services (specification). */ -/* */ -/* Copyright 2003 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SVPOSTNM_H__ -#define __SVPOSTNM_H__ - -#include FT_INTERNAL_SERVICE_H - - -FT_BEGIN_HEADER - - /* - * A trivial service used to retrieve the PostScript name of a given - * font when available. The `get_name' field should never be NULL. - * - * The correponding function can return NULL to indicate that the - * PostScript name is not available. - * - * The name is owned by the face and will be destroyed with it. - */ - -#define FT_SERVICE_ID_POSTSCRIPT_FONT_NAME "postscript-font-name" - - - typedef const char* - (*FT_PsName_GetFunc)( FT_Face face ); - - - FT_DEFINE_SERVICE( PsFontName ) - { - FT_PsName_GetFunc get_ps_font_name; - }; - - /* */ - - -FT_END_HEADER - - -#endif /* __SVPOSTNM_H__ */ - - -/* END */ diff --git a/reactos/lib/freetype/include/freetype/internal/services/svpscmap.h b/reactos/lib/freetype/include/freetype/internal/services/svpscmap.h deleted file mode 100644 index ade96ef8f16..00000000000 --- a/reactos/lib/freetype/include/freetype/internal/services/svpscmap.h +++ /dev/null @@ -1,113 +0,0 @@ -/***************************************************************************/ -/* */ -/* svpscmap.h */ -/* */ -/* The FreeType PostScript charmap service (specification). */ -/* */ -/* Copyright 2003 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SVPSCMAP_H__ -#define __SVPSCMAP_H__ - - -FT_BEGIN_HEADER - - -#define FT_SERVICE_ID_POSTSCRIPT_CMAPS "postscript-cmaps" - - - /* - * Adobe glyph name to unicode value - */ - typedef FT_UInt32 - (*PS_Unicode_ValueFunc)( const char* glyph_name ); - - /* - * Unicode value to Adobe glyph name index. 0xFFFF if not found. - */ - typedef FT_UInt - (*PS_Unicode_Index_Func)( FT_UInt num_glyphs, - const char** glyph_names, - FT_ULong unicode ); - - /* - * Macintosh name id to glyph name. NULL if invalid index. - */ - typedef const char* - (*PS_Macintosh_Name_Func)( FT_UInt name_index ); - - /* - * Adobe standard string ID to glyph name. NULL if invalid index. - */ - typedef const char* - (*PS_Adobe_Std_Strings_Func)( FT_UInt string_index ); - - /* - * Simple unicode -> glyph index charmap built from font glyph names - * table. - */ - typedef struct PS_UniMap_ - { - FT_UInt unicode; - FT_UInt glyph_index; - - } PS_UniMap; - - - typedef struct PS_Unicodes_ - { - FT_UInt num_maps; - PS_UniMap* maps; - - } PS_Unicodes; - - - typedef FT_Error - (*PS_Unicodes_InitFunc)( FT_Memory memory, - FT_UInt num_glyphs, - const char** glyph_names, - PS_Unicodes* unicodes ); - - typedef FT_UInt - (*PS_Unicodes_CharIndexFunc)( PS_Unicodes* unicodes, - FT_UInt unicode ); - - typedef FT_ULong - (*PS_Unicodes_CharNextFunc)( PS_Unicodes* unicodes, - FT_ULong unicode ); - - - FT_DEFINE_SERVICE( PsCMaps ) - { - PS_Unicode_ValueFunc unicode_value; - - PS_Unicodes_InitFunc unicodes_init; - PS_Unicodes_CharIndexFunc unicodes_char_index; - PS_Unicodes_CharNextFunc unicodes_char_next; - - PS_Macintosh_Name_Func macintosh_name; - PS_Adobe_Std_Strings_Func adobe_std_strings; - const unsigned short* adobe_std_encoding; - const unsigned short* adobe_expert_encoding; - }; - - /* */ - - -FT_END_HEADER - - -#endif /* __SVPSCMAP_H__ */ - - -/* END */ diff --git a/reactos/lib/freetype/include/freetype/internal/services/svpsinfo.h b/reactos/lib/freetype/include/freetype/internal/services/svpsinfo.h deleted file mode 100644 index 73c02cdb738..00000000000 --- a/reactos/lib/freetype/include/freetype/internal/services/svpsinfo.h +++ /dev/null @@ -1,55 +0,0 @@ -/***************************************************************************/ -/* */ -/* svpsinfo.h */ -/* */ -/* The FreeType PostScript info service (specification). */ -/* */ -/* Copyright 2003 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SVPSINFO_H__ -#define __SVPSINFO_H__ - -#include FT_INTERNAL_SERVICE_H -#include FT_INTERNAL_TYPE1_TYPES_H - - -FT_BEGIN_HEADER - - -#define FT_SERVICE_ID_POSTSCRIPT_INFO "postscript-info" - - - typedef FT_Error - (*PS_GetFontInfoFunc)( FT_Face face, - PS_FontInfoRec* afont_info ); - - typedef FT_Int - (*PS_HasGlyphNamesFunc)( FT_Face face ); - - - FT_DEFINE_SERVICE( PsInfo ) - { - PS_GetFontInfoFunc ps_get_font_info; - PS_HasGlyphNamesFunc ps_has_glyph_names; - }; - - /* */ - - -FT_END_HEADER - - -#endif /* __SVPSINFO_H__ */ - - -/* END */ diff --git a/reactos/lib/freetype/include/freetype/internal/services/svsfnt.h b/reactos/lib/freetype/include/freetype/internal/services/svsfnt.h deleted file mode 100644 index 06a5b1c23d3..00000000000 --- a/reactos/lib/freetype/include/freetype/internal/services/svsfnt.h +++ /dev/null @@ -1,69 +0,0 @@ -/***************************************************************************/ -/* */ -/* svsfnt.h */ -/* */ -/* The FreeType PostScript name services (specification). */ -/* */ -/* Copyright 2003 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SVSFNT_H__ -#define __SVSFNT_H__ - -#include FT_INTERNAL_SERVICE_H -#include FT_TRUETYPE_TABLES_H - - -FT_BEGIN_HEADER - - - /* - * SFNT table loading service. - */ - -#define FT_SERVICE_ID_SFNT_TABLE "sfnt-table" - - - /* - * Used to implement FT_Load_Sfnt_Table(). - */ - typedef FT_Error - (*FT_SFNT_TableLoadFunc)( FT_Face face, - FT_ULong tag, - FT_Long offset, - FT_Byte* buffer, - FT_ULong* length ); - - /* - * Used to implement FT_Get_Sfnt_Table(). - */ - typedef void* - (*FT_SFNT_TableGetFunc)( FT_Face face, - FT_Sfnt_Tag tag ); - - - FT_DEFINE_SERVICE( SFNT_Table ) - { - FT_SFNT_TableLoadFunc load_table; - FT_SFNT_TableGetFunc get_table; - }; - - /* */ - - -FT_END_HEADER - - -#endif /* __SVSFNT_H__ */ - - -/* END */ diff --git a/reactos/lib/freetype/include/freetype/internal/services/svttcmap.h b/reactos/lib/freetype/include/freetype/internal/services/svttcmap.h deleted file mode 100644 index f92fcd0e2c4..00000000000 --- a/reactos/lib/freetype/include/freetype/internal/services/svttcmap.h +++ /dev/null @@ -1,77 +0,0 @@ -/***************************************************************************/ -/* */ -/* svsttcmap.h */ -/* */ -/* The FreeType TrueType/sfnt cmap extra information service. */ -/* */ -/* Copyright 2003 by */ -/* Masatake YAMATO, Redhat K.K. */ -/* */ -/* Copyright 2003 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - -/* Development of this service is support of - Information-technology Promotion Agency, Japan. */ - -#ifndef __SVTTCMAP_H__ -#define __SVTTCMAP_H__ - -#include FT_INTERNAL_SERVICE_H -#include FT_TRUETYPE_TABLES_H - - -FT_BEGIN_HEADER - - -#define FT_SERVICE_ID_TT_CMAP "tt-cmaps" - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_CMapInfo */ - /* */ - /* <Description> */ - /* A structure used to store TrueType/sfnt specific cmap information */ - /* which is not covered by the generic @FT_CharMap structure. This */ - /* structure can be accessed with the @FT_Get_TT_CMap_Info function. */ - /* */ - /* <Fields> */ - /* language :: */ - /* The language ID used in Mac fonts. Definitions of values are in */ - /* freetype/ttnameid.h. */ - /* */ - typedef struct TT_CMapInfo_ - { - FT_ULong language; - - } TT_CMapInfo; - - - typedef FT_Error - (*TT_CMap_Info_GetFunc)( FT_CharMap charmap, - TT_CMapInfo *cmap_info ); - - - FT_DEFINE_SERVICE( TTCMaps ) - { - TT_CMap_Info_GetFunc get_cmap_info; - }; - - /* */ - - -FT_END_HEADER - -#endif /* __SVTTCMAP_H__ */ - - -/* END */ diff --git a/reactos/lib/freetype/include/freetype/internal/services/svwinfnt.h b/reactos/lib/freetype/include/freetype/internal/services/svwinfnt.h deleted file mode 100644 index 57f7765d92f..00000000000 --- a/reactos/lib/freetype/include/freetype/internal/services/svwinfnt.h +++ /dev/null @@ -1,50 +0,0 @@ -/***************************************************************************/ -/* */ -/* svwinfnt.h */ -/* */ -/* The FreeType Windows FNT/FONT service (specification). */ -/* */ -/* Copyright 2003 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SVWINFNT_H__ -#define __SVWINFNT_H__ - -#include FT_INTERNAL_SERVICE_H -#include FT_WINFONTS_H - - -FT_BEGIN_HEADER - - -#define FT_SERVICE_ID_WINFNT "winfonts" - - typedef FT_Error - (*FT_WinFnt_GetHeaderFunc)( FT_Face face, - FT_WinFNT_HeaderRec *aheader ); - - - FT_DEFINE_SERVICE( WinFnt ) - { - FT_WinFnt_GetHeaderFunc get_header; - }; - - /* */ - - -FT_END_HEADER - - -#endif /* __SVWINFNT_H__ */ - - -/* END */ diff --git a/reactos/lib/freetype/include/freetype/internal/services/svxf86nm.h b/reactos/lib/freetype/include/freetype/internal/services/svxf86nm.h deleted file mode 100644 index 3a33abcd8de..00000000000 --- a/reactos/lib/freetype/include/freetype/internal/services/svxf86nm.h +++ /dev/null @@ -1,55 +0,0 @@ -/***************************************************************************/ -/* */ -/* svxf86nm.h */ -/* */ -/* The FreeType XFree86 services (specification only). */ -/* */ -/* Copyright 2003 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __SVXF86NM_H__ -#define __SVXF86NM_H__ - -#include FT_INTERNAL_SERVICE_H - - -FT_BEGIN_HEADER - - - /* - * A trivial service used to return the name of a face's font driver, - * according to the XFree86 nomenclature. Note that the service data - * is a simple constant string pointer. - */ - -#define FT_SERVICE_ID_XF86_NAME "xf86-driver-name" - -#define FT_XF86_FORMAT_TRUETYPE "TrueType" -#define FT_XF86_FORMAT_TYPE_1 "Type 1" -#define FT_XF86_FORMAT_BDF "BDF" -#define FT_XF86_FORMAT_PCF "PCF" -#define FT_XF86_FORMAT_TYPE_42 "Type 42" -#define FT_XF86_FORMAT_CID "CID Type 1" -#define FT_XF86_FORMAT_CFF "CFF" -#define FT_XF86_FORMAT_PFR "PFR" -#define FT_XF86_FORMAT_WINFNT "Windows FNT" - - /* */ - - -FT_END_HEADER - - -#endif /* __SVXF86NM_H__ */ - - -/* END */ diff --git a/reactos/lib/freetype/include/freetype/internal/sfnt.h b/reactos/lib/freetype/include/freetype/internal/sfnt.h index 2a9a645db18..10b2275531a 100644 --- a/reactos/lib/freetype/include/freetype/internal/sfnt.h +++ b/reactos/lib/freetype/include/freetype/internal/sfnt.h @@ -125,6 +125,11 @@ FT_BEGIN_HEADER (*TT_Done_Face_Func)( TT_Face face ); + typedef FT_Module_Interface + (*SFNT_Get_Interface_Func)( FT_Module module, + const char* func_interface ); + + /*************************************************************************/ /* */ /* <FuncType> */ @@ -250,27 +255,20 @@ FT_BEGIN_HEADER /* returns its metrics. */ /* */ /* <Input> */ - /* face :: */ - /* The target face object. */ + /* face :: The target face object. */ /* */ - /* strike_index :: */ - /* The strike index. */ + /* x_ppem :: The horizontal resolution in points per EM. */ /* */ - /* glyph_index :: */ - /* The current glyph index. */ + /* y_ppem :: The vertical resolution in points per EM. */ /* */ - /* load_flags :: */ - /* The current load flags. */ + /* glyph_index :: The current glyph index. */ /* */ - /* stream :: */ - /* The input stream. */ + /* stream :: The input stream. */ /* */ /* <Output> */ - /* amap :: */ - /* The target pixmap. */ + /* amap :: The target pixmap. */ /* */ - /* ametrics :: */ - /* A big sbit metrics structure for the glyph image. */ + /* ametrics :: A big sbit metrics structure for the glyph image. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. Returns an error if no */ @@ -314,8 +312,8 @@ FT_BEGIN_HEADER /* */ typedef FT_Error (*TT_Set_SBit_Strike_Func)( TT_Face face, - FT_UInt x_ppem, - FT_UInt y_ppem, + FT_Int x_ppem, + FT_Int y_ppem, FT_ULong *astrike_index ); @@ -368,6 +366,57 @@ FT_BEGIN_HEADER FT_Bool vertical ); + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_CharMap_Load_Func */ + /* */ + /* <Description> */ + /* Loads a given TrueType character map into memory. */ + /* */ + /* <Input> */ + /* face :: A handle to the parent face object. */ + /* */ + /* stream :: A handle to the current stream object. */ + /* */ + /* <InOut> */ + /* cmap :: A pointer to a cmap object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The function assumes that the stream is already in use (i.e., */ + /* opened). In case of error, all partially allocated tables are */ + /* released. */ + /* */ + typedef FT_Error + (*TT_CharMap_Load_Func)( TT_Face face, + TT_CMapTable cmap, + FT_Stream input ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_CharMap_Free_Func */ + /* */ + /* <Description> */ + /* Destroys a character mapping table. */ + /* */ + /* <Input> */ + /* face :: A handle to the parent face object. */ + /* */ + /* cmap :: A handle to a cmap object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + typedef FT_Error + (*TT_CharMap_Free_Func)( TT_Face face, + TT_CMapTable cmap ); + + /*************************************************************************/ /* */ /* <FuncType> */ @@ -408,6 +457,22 @@ FT_BEGIN_HEADER (*TT_Free_Table_Func)( TT_Face face ); + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* SFNT_Load_Table_Func */ + /* */ + /* <Description> */ + /* Loads a given SFNT table into memory. */ + /* */ + typedef FT_Error + (*SFNT_Load_Table_Func)( FT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ); + + /*************************************************************************/ /* */ /* <Struct> */ @@ -427,7 +492,7 @@ FT_BEGIN_HEADER TT_Init_Face_Func init_face; TT_Load_Face_Func load_face; TT_Done_Face_Func done_face; - FT_Module_Requester get_interface; + SFNT_Get_Interface_Func get_interface; TT_Load_Any_Func load_any; TT_Load_SFNT_HeaderRec_Func load_sfnt_header; @@ -466,6 +531,10 @@ FT_BEGIN_HEADER TT_Get_PS_Name_Func get_psname; TT_Free_Table_Func free_psnames; + /* see `ttcmap.h' */ + TT_CharMap_Load_Func load_charmap; + TT_CharMap_Free_Func free_charmap; + } SFNT_Interface; diff --git a/reactos/lib/freetype/include/freetype/internal/t1types.h b/reactos/lib/freetype/include/freetype/internal/t1types.h index 702bb1e4c68..f6f68f4a58e 100644 --- a/reactos/lib/freetype/include/freetype/internal/t1types.h +++ b/reactos/lib/freetype/include/freetype/internal/t1types.h @@ -5,7 +5,7 @@ /* Basic Type1/Type2 type definitions and interface (specification */ /* only). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* Copyright 1996-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -23,9 +23,8 @@ #include <ft2build.h> #include FT_TYPE1_TABLES_H +#include FT_INTERNAL_POSTSCRIPT_NAMES_H #include FT_INTERNAL_POSTSCRIPT_HINTS_H -#include FT_INTERNAL_SERVICE_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H FT_BEGIN_HEADER @@ -102,21 +101,21 @@ FT_BEGIN_HEADER FT_Int num_subrs; FT_Byte** subrs; - FT_PtrDist* subrs_len; + FT_Int* subrs_len; FT_Int num_glyphs; FT_String** glyph_names; /* array of glyph names */ FT_Byte** charstrings; /* array of glyph charstrings */ - FT_PtrDist* charstrings_len; + FT_Int* charstrings_len; - FT_Byte paint_type; + FT_Byte* paint_type; FT_Byte font_type; FT_Matrix font_matrix; FT_Vector font_offset; FT_BBox font_bbox; FT_Long font_id; - FT_Fixed stroke_width; + FT_Fixed* stroke_width; } T1_FontRec, *T1_Font; @@ -142,6 +141,17 @@ FT_BEGIN_HEADER /*************************************************************************/ + /*************************************************************************/ + /* */ + /* This structure/class is defined here because it is common to the */ + /* following formats: TTF, OpenType-TT, and OpenType-CFF. */ + /* */ + /* Note, however, that the classes TT_Size, TT_GlyphSlot, and TT_CharMap */ + /* are not shared between font drivers, and are thus defined normally in */ + /* `ttobjs.h'. */ + /* */ + /*************************************************************************/ + typedef struct T1_FaceRec_* T1_Face; typedef struct CID_FaceRec_* CID_Face; @@ -159,7 +169,7 @@ FT_BEGIN_HEADER /* support for Multiple Masters fonts */ PS_Blend blend; - + /* since FT 2.1 - interface to PostScript hinter */ const void* pshinter; @@ -173,10 +183,8 @@ FT_BEGIN_HEADER void* psaux; CID_FaceInfoRec cid; void* afm_data; - FT_Byte* binary_data; /* used if hex data has been converted */ - FT_Stream cid_stream; CID_Subrs subrs; - + /* since FT 2.1 - interface to PostScript hinter */ void* pshinter; diff --git a/reactos/lib/freetype/include/freetype/internal/tttypes.h b/reactos/lib/freetype/include/freetype/internal/tttypes.h index 1e451ac1803..736d9075157 100644 --- a/reactos/lib/freetype/include/freetype/internal/tttypes.h +++ b/reactos/lib/freetype/include/freetype/internal/tttypes.h @@ -105,6 +105,41 @@ FT_BEGIN_HEADER } SFNT_HeaderRec, *SFNT_Header; + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_TableDirRec */ + /* */ + /* <Description> */ + /* This structure models a TrueType table directory. It is used to */ + /* access the various tables of the font face. */ + /* */ + /* <Fields> */ + /* version :: The version number; starts with 0x00010000. */ + /* */ + /* numTables :: The number of tables. */ + /* */ + /* searchRange :: Unused. */ + /* */ + /* entrySelector :: Unused. */ + /* */ + /* rangeShift :: Unused. */ + /* */ + /* <Note> */ + /* This structure is only used during font opening. */ + /* */ + typedef struct TT_TableDirRec_ + { + FT_Fixed version; /* should be 0x10000 */ + FT_UShort numTables; /* number of tables */ + + FT_UShort searchRange; /* These parameters are only used */ + FT_UShort entrySelector; /* for a dichotomy search in the */ + FT_UShort rangeShift; /* directory. We ignore them. */ + + } TT_TableDirRec; + + /*************************************************************************/ /* */ /* <Struct> */ @@ -133,6 +168,61 @@ FT_BEGIN_HEADER } TT_TableRec, *TT_Table; + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_CMapDirRec */ + /* */ + /* <Description> */ + /* This structure describes the directory of the `cmap' table, */ + /* containing the font's character mappings table. */ + /* */ + /* <Fields> */ + /* tableVersionNumber :: The version number. */ + /* */ + /* numCMaps :: The number of charmaps in the font. */ + /* */ + /* <Note> */ + /* This structure is only used during font loading. */ + /* */ + typedef struct TT_CMapDirRec_ + { + FT_UShort tableVersionNumber; + FT_UShort numCMaps; + + } TT_CMapDirRec, *TT_CMapDir; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_CMapDirEntryRec */ + /* */ + /* <Description> */ + /* This structure describes a charmap in a TrueType font. */ + /* */ + /* <Fields> */ + /* platformID :: An ID used to specify for which platform this */ + /* charmap is defined (FreeType manages all platforms). */ + /* */ + /* encodingID :: A platform-specific ID used to indicate which source */ + /* encoding is used in this charmap. */ + /* */ + /* offset :: The offset of the charmap relative to the start of */ + /* the `cmap' table. */ + /* */ + /* <Note> */ + /* This structure is only used during font loading. */ + /* */ + typedef struct TT_CMapDirEntryRec_ + { + FT_UShort platformID; + FT_UShort platformEncodingID; + FT_Long offset; + + } TT_CMapDirEntryRec, *TT_CMapDirEntry; + + /*************************************************************************/ /* */ /* <Struct> */ @@ -818,6 +908,201 @@ FT_BEGIN_HEADER } TT_Post_NamesRec, *TT_Post_Names; + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** TRUETYPE CHARMAPS SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* format 0 */ + + typedef struct TT_CMap0_ + { + FT_ULong language; /* for Mac fonts (originally ushort) */ + + FT_Byte* glyphIdArray; + + } TT_CMap0Rec, *TT_CMap0; + + + /* format 2 */ + + typedef struct TT_CMap2SubHeaderRec_ + { + FT_UShort firstCode; /* first valid low byte */ + FT_UShort entryCount; /* number of valid low bytes */ + FT_Short idDelta; /* delta value to glyphIndex */ + FT_UShort idRangeOffset; /* offset from here to 1st code */ + + } TT_CMap2SubHeaderRec, *TT_CMap2SubHeader; + + + typedef struct TT_CMap2Rec_ + { + FT_ULong language; /* for Mac fonts (originally ushort) */ + + FT_UShort* subHeaderKeys; /* high byte mapping table */ + /* value = subHeader index * 8 */ + TT_CMap2SubHeader subHeaders; + FT_UShort* glyphIdArray; + FT_UShort numGlyphId; /* control value */ + + } TT_CMap2Rec, *TT_CMap2; + + + /* format 4 */ + + typedef struct TT_CMap4Segment_ + { + FT_UShort endCount; + FT_UShort startCount; + FT_Short idDelta; + FT_UShort idRangeOffset; + + } TT_CMap4SegmentRec, *TT_CMap4Segment; + + + typedef struct TT_CMap4Rec_ + { + FT_ULong language; /* for Mac fonts (originally ushort) */ + + FT_UShort segCountX2; /* number of segments * 2 */ + FT_UShort searchRange; /* these parameters can be used */ + FT_UShort entrySelector; /* for a binary search */ + FT_UShort rangeShift; + + TT_CMap4Segment segments; + FT_UShort* glyphIdArray; + FT_UShort numGlyphId; /* control value */ + + TT_CMap4Segment last_segment; /* last used segment; this is a small */ + /* cache to potentially increase speed */ + } TT_CMap4Rec, *TT_CMap4; + + + /* format 6 */ + + typedef struct TT_CMap6_ + { + FT_ULong language; /* for Mac fonts (originally ushort) */ + + FT_UShort firstCode; /* first character code of subrange */ + FT_UShort entryCount; /* number of character codes in subrange */ + + FT_UShort* glyphIdArray; + + } TT_CMap6Rec, *TT_CMap6; + + + /* auxiliary table for format 8 and 12 */ + + typedef struct TT_CMapGroupRec_ + { + FT_ULong startCharCode; + FT_ULong endCharCode; + FT_ULong startGlyphID; + + } TT_CMapGroupRec, *TT_CMapGroup; + + + /* FreeType handles format 8 and 12 identically. It is not necessary to + cover mixed 16bit and 32bit codes since FreeType always uses FT_ULong + for input character codes -- converting Unicode surrogates to 32bit + character codes must be done by the application. */ + + typedef struct TT_CMap8_12Rec_ + { + FT_ULong language; /* for Mac fonts */ + + FT_ULong nGroups; + TT_CMapGroup groups; + + TT_CMapGroup last_group; /* last used group; this is a small */ + /* cache to potentially increase speed */ + } TT_CMap8_12Rec, *TT_CMap8_12; + + + /* format 10 */ + + typedef struct TT_CMap10Rec_ + { + FT_ULong language; /* for Mac fonts */ + + FT_ULong startCharCode; /* first character covered */ + FT_ULong numChars; /* number of characters covered */ + + FT_UShort* glyphs; + + } TT_CMap10Rec, *TT_CMap10; + + + typedef struct TT_CMapTableRec_* TT_CMapTable; + + + typedef FT_UInt + (*TT_CharMap_Func)( TT_CMapTable charmap, + FT_ULong char_code ); + + typedef FT_ULong + (*TT_CharNext_Func)( TT_CMapTable charmap, + FT_ULong char_code ); + + + /* charmap table */ + typedef struct TT_CMapTableRec_ + { + FT_UShort platformID; + FT_UShort platformEncodingID; + FT_UShort format; + FT_ULong length; /* must be ulong for formats 8, 10, and 12 */ + + FT_Bool loaded; + FT_ULong offset; + + union + { + TT_CMap0Rec cmap0; + TT_CMap2Rec cmap2; + TT_CMap4Rec cmap4; + TT_CMap6Rec cmap6; + TT_CMap8_12Rec cmap8_12; + TT_CMap10Rec cmap10; + } c; + + TT_CharMap_Func get_index; + TT_CharNext_Func get_next_char; + + } TT_CMapTableRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_CharMapRec */ + /* */ + /* <Description> */ + /* The TrueType character map object type. */ + /* */ + /* <Fields> */ + /* root :: The parent character map structure. */ + /* */ + /* cmap :: The used character map. */ + /* */ + typedef struct TT_CharMapRec_ + { + FT_CharMapRec root; + TT_CMapTableRec cmap; + + } TT_CharMapRec; + + /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ @@ -836,8 +1121,9 @@ FT_BEGIN_HEADER /* This structure/class is defined here because it is common to the */ /* following formats: TTF, OpenType-TT, and OpenType-CFF. */ /* */ - /* Note, however, that the classes TT_Size and TT_GlyphSlot are not */ - /* shared between font drivers, and are thus defined in `ttobjs.h'. */ + /* Note, however, that the classes TT_Size, TT_GlyphSlot, and TT_CharMap */ + /* are not shared between font drivers, and are thus defined in */ + /* `ttobjs.h'. */ /* */ /*************************************************************************/ @@ -859,6 +1145,17 @@ FT_BEGIN_HEADER typedef struct TT_FaceRec_* TT_Face; + /*************************************************************************/ + /* */ + /* <Type> */ + /* TT_CharMap */ + /* */ + /* <Description> */ + /* A handle to a TrueType character mapping object. */ + /* */ + typedef struct TT_CharMapRec_* TT_CharMap; + + /* a function type used for the truetype bytecode interpreter hooks */ typedef FT_Error (*TT_Interpreter)( void* exec_context ); @@ -1044,6 +1341,15 @@ FT_BEGIN_HEADER /* cmap_size :: The size in bytes of the `cmap_table' */ /* described above. */ /* */ + /* num_charmaps :: The number of character mappings in the */ + /* font. */ + /* */ + /* charmaps :: The array of charmap objects for this font */ + /* file. Note that this field is a typeless */ + /* pointer. The Reason is that the format of */ + /* charmaps varies with the underlying font */ + /* format and cannot be determined here. */ + /* */ /* goto_table :: A function called by each TrueType table */ /* loader to position a stream's cursor to */ /* the start of a given table according to */ @@ -1069,9 +1375,10 @@ FT_BEGIN_HEADER /* It must be called after the header was */ /* read, and before the `forget'. */ /* */ - /* sfnt :: A pointer to the SFNT service. */ + /* sfnt :: A pointer to the SFNT `driver' interface. */ /* */ - /* psnames :: A pointer to the PostScript names service. */ + /* psnames :: A pointer to the `PSNames' module */ + /* interface. */ /* */ /* hdmx :: The face's horizontal device metrics */ /* (`hdmx' table). This table is optional in */ @@ -1190,15 +1497,14 @@ FT_BEGIN_HEADER TT_Loader_ReadGlyphFunc read_simple_glyph; TT_Loader_ReadGlyphFunc read_composite_glyph; - /* a typeless pointer to the SFNT_Interface table used to load */ - /* the basic TrueType tables in the face object */ + /* a typeless pointer to the SFNT_Interface table used to load */ + /* the basic TrueType tables in the face object */ void* sfnt; - /* a typeless pointer to the FT_Service_PsCMapsRec table used to */ - /* handle glyph names <-> unicode & Mac values */ + /* a typeless pointer to the PSNames_Interface table used to */ + /* handle glyph names <-> unicode & Mac values */ void* psnames; - /***********************************************************************/ /* */ /* Optional TrueType/OpenType tables */ @@ -1270,8 +1576,6 @@ FT_BEGIN_HEADER FT_Generic extra; - const char* postscript_name; - } TT_FaceRec; diff --git a/reactos/lib/freetype/include/freetype/t1tables.h b/reactos/lib/freetype/include/freetype/t1tables.h index af8c416117d..70ea43897fe 100644 --- a/reactos/lib/freetype/include/freetype/t1tables.h +++ b/reactos/lib/freetype/include/freetype/t1tables.h @@ -24,12 +24,6 @@ #include <ft2build.h> #include FT_FREETYPE_H -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - FT_BEGIN_HEADER diff --git a/reactos/lib/freetype/include/freetype/ttnameid.h b/reactos/lib/freetype/include/freetype/ttnameid.h index 848374fe227..8b56686bb44 100644 --- a/reactos/lib/freetype/include/freetype/ttnameid.h +++ b/reactos/lib/freetype/include/freetype/ttnameid.h @@ -291,7 +291,6 @@ FT_BEGIN_HEADER #define TT_ADOBE_ID_STANDARD 0 #define TT_ADOBE_ID_EXPERT 1 #define TT_ADOBE_ID_CUSTOM 2 -#define TT_ADOBE_ID_LATIN_1 3 /*************************************************************************/ diff --git a/reactos/lib/freetype/include/freetype/tttables.h b/reactos/lib/freetype/include/freetype/tttables.h index 22247913efb..2d2e63c9080 100644 --- a/reactos/lib/freetype/include/freetype/tttables.h +++ b/reactos/lib/freetype/include/freetype/tttables.h @@ -24,12 +24,6 @@ #include <ft2build.h> #include FT_FREETYPE_H -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - FT_BEGIN_HEADER @@ -572,6 +566,11 @@ FT_BEGIN_HEADER /* */ + /* internal use only */ + typedef void* + (*FT_Get_Sfnt_Table_Func)( FT_Face face, + FT_Sfnt_Tag tag ); + /*************************************************************************/ /* */ @@ -663,27 +662,6 @@ FT_BEGIN_HEADER FT_Byte* buffer, FT_ULong* length ); - - /*************************************************************************/ - /* */ - /* <Function> */ - /* FT_Get_CMap_Language_ID */ - /* */ - /* <Description> */ - /* Return TrueType/sfnt specific cmap language ID. Definitions of */ - /* language ID values are in freetype/ttnameid.h. */ - /* */ - /* <Input> */ - /* charmap :: */ - /* The target charmap. */ - /* */ - /* <Return> */ - /* The language ID of `charmap'. If `charmap' doesn't belong to a */ - /* TrueType/sfnt face, just return 0 as the default value. */ - /* */ - FT_EXPORT( FT_ULong ) - FT_Get_CMap_Language_ID( FT_CharMap charmap ); - /* */ diff --git a/reactos/lib/freetype/include/freetype/tttags.h b/reactos/lib/freetype/include/freetype/tttags.h index ac64758b103..df09f2a69c4 100644 --- a/reactos/lib/freetype/include/freetype/tttags.h +++ b/reactos/lib/freetype/include/freetype/tttags.h @@ -23,12 +23,6 @@ #include <ft2build.h> #include FT_FREETYPE_H -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - FT_BEGIN_HEADER diff --git a/reactos/lib/freetype/include/freetype/ttunpat.h b/reactos/lib/freetype/include/freetype/ttunpat.h index 0bc0a6fe092..e4885aaa32d 100644 --- a/reactos/lib/freetype/include/freetype/ttunpat.h +++ b/reactos/lib/freetype/include/freetype/ttunpat.h @@ -25,12 +25,6 @@ #include <ft2build.h> #include FT_FREETYPE_H -#ifdef FREETYPE_H -#error "freetype.h of FreeType 1 has been loaded!" -#error "Please fix the directory search order for header files" -#error "so that freetype.h of FreeType 2 is found first." -#endif - FT_BEGIN_HEADER diff --git a/reactos/lib/freetype/src/autofit/Jamfile b/reactos/lib/freetype/src/autofit/Jamfile deleted file mode 100644 index 3253c821ede..00000000000 --- a/reactos/lib/freetype/src/autofit/Jamfile +++ /dev/null @@ -1,18 +0,0 @@ -SubDir FT2_TOP src autofit ; - -{ - local _sources ; - - if $(FT2_MULTI) - { - _sources = afangles afglobal afhints aflatin afloader afmodule ; - } - else - { - _sources = autofit ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/autofir Jamfile diff --git a/reactos/lib/freetype/src/autofit/afangles.c b/reactos/lib/freetype/src/autofit/afangles.c deleted file mode 100644 index 10a8cff2576..00000000000 --- a/reactos/lib/freetype/src/autofit/afangles.c +++ /dev/null @@ -1,214 +0,0 @@ -#include "aftypes.h" - - /* this table was generated for AF_ANGLE_PI = 256 */ -#define AF_ANGLE_MAX_ITERS 8 -#define AF_TRIG_MAX_ITERS 9 - - static const FT_Fixed - af_angle_arctan_table[9] = - { - 90, 64, 38, 20, 10, 5, 3, 1, 1 - }; - - - static FT_Int - af_angle_prenorm( FT_Vector* vec ) - { - FT_Fixed x, y, z; - FT_Int shift; - - - x = vec->x; - y = vec->y; - - z = ( ( x >= 0 ) ? x : - x ) | ( (y >= 0) ? y : -y ); - shift = 0; - - if ( z < ( 1L << 27 ) ) - { - do - { - shift++; - z <<= 1; - } while ( z < ( 1L << 27 ) ); - - vec->x = x << shift; - vec->y = y << shift; - } - else if ( z > ( 1L << 28 ) ) - { - do - { - shift++; - z >>= 1; - } while ( z > ( 1L << 28 ) ); - - vec->x = x >> shift; - vec->y = y >> shift; - shift = -shift; - } - return shift; - } - - - static void - af_angle_pseudo_polarize( FT_Vector* vec ) - { - FT_Fixed theta; - FT_Fixed yi, i; - FT_Fixed x, y; - const FT_Fixed *arctanptr; - - - x = vec->x; - y = vec->y; - - /* Get the vector into the right half plane */ - theta = 0; - if ( x < 0 ) - { - x = -x; - y = -y; - theta = 2 * AF_ANGLE_PI2; - } - - if ( y > 0 ) - theta = - theta; - - arctanptr = af_angle_arctan_table; - - if ( y < 0 ) - { - /* Rotate positive */ - yi = y + ( x << 1 ); - x = x - ( y << 1 ); - y = yi; - theta -= *arctanptr++; /* Subtract angle */ - } - else - { - /* Rotate negative */ - yi = y - ( x << 1 ); - x = x + ( y << 1 ); - y = yi; - theta += *arctanptr++; /* Add angle */ - } - - i = 0; - do - { - if ( y < 0 ) - { - /* Rotate positive */ - yi = y + ( x >> i ); - x = x - ( y >> i ); - y = yi; - theta -= *arctanptr++; - } - else - { - /* Rotate negative */ - yi = y - ( x >> i ); - x = x + ( y >> i ); - y = yi; - theta += *arctanptr++; - } - } while ( ++i < AF_TRIG_MAX_ITERS ); - - /* round theta */ - if ( theta >= 0 ) - theta = FT_PAD_ROUND( theta, 4 ); - else - theta = - FT_PAD_ROUND( theta, 4 ); - - vec->x = x; - vec->y = theta; - } - - - /* documentation is in fttrigon.h */ - - FT_LOCAL_DEF( AF_Angle ) - af_angle_atan( FT_Fixed dx, - FT_Fixed dy ) - { - FT_Vector v; - - - if ( dx == 0 && dy == 0 ) - return 0; - - v.x = dx; - v.y = dy; - af_angle_prenorm( &v ); - af_angle_pseudo_polarize( &v ); - - return v.y; - } - - - - FT_LOCAL_DEF( AF_Angle ) - af_angle_diff( AF_Angle angle1, - AF_Angle angle2 ) - { - AF_Angle delta = angle2 - angle1; - - delta %= AF_ANGLE_2PI; - if ( delta < 0 ) - delta += AF_ANGLE_2PI; - - if ( delta > AF_ANGLE_PI ) - delta -= AF_ANGLE_2PI; - - return delta; - } - - - /* well, this needs to be somewhere, right :-) - */ - - FT_LOCAL_DEF( void ) - af_sort_pos( FT_UInt count, - FT_Pos* table ) - { - FT_UInt i, j; - FT_Pos swap; - - - for ( i = 1; i < count; i++ ) - { - for ( j = i; j > 0; j-- ) - { - if ( table[j] > table[j - 1] ) - break; - - swap = table[j]; - table[j] = table[j - 1]; - table[j - 1] = swap; - } - } - } - - - FT_LOCAL_DEF( void ) - af_sort_widths( FT_UInt count, - AF_Width table ) - { - FT_UInt i, j; - AF_WidthRec swap; - - - for ( i = 1; i < count; i++ ) - { - for ( j = i; j > 0; j-- ) - { - if ( table[j].org > table[j - 1].org ) - break; - - swap = table[j]; - table[j] = table[j - 1]; - table[j - 1] = swap; - } - } - } diff --git a/reactos/lib/freetype/src/autofit/afglobal.c b/reactos/lib/freetype/src/autofit/afglobal.c deleted file mode 100644 index 636203637ed..00000000000 --- a/reactos/lib/freetype/src/autofit/afglobal.c +++ /dev/null @@ -1,231 +0,0 @@ -#include "afglobal.h" -#include "aflatin.h" - - /* populate this list when you add new scripts - */ - static AF_ScriptClass const af_script_classes[] = - { - & af_latin_script_class, - - NULL /* do not remove */ - }; - -#define AF_SCRIPT_LIST_DEFAULT 0 /* index of default script in 'af_script_classes' */ -#define AF_SCRIPT_LIST_NONE 255 /* indicates an uncovered glyph */ - - /* - * note that glyph_scripts[] is used to map each glyph into - * an index into the 'af_script_classes' array. - * - */ - typedef struct AF_FaceGlobalsRec_ - { - FT_Face face; - FT_UInt glyph_count; /* same as face->num_glyphs */ - FT_Byte* glyph_scripts; - - AF_ScriptMetrics metrics[ AF_SCRIPT_MAX ]; - - } AF_FaceGlobalsRec; - - - - - /* this function is used to compute the script index of each glyph - * within a given face - */ - static FT_Error - af_face_globals_compute_script_coverage( AF_FaceGlobals globals ) - { - FT_Error error = 0; - FT_Face face = globals->face; - FT_CharMap old_charmap = face->charmap; - FT_Byte* gscripts = globals->glyph_scripts; - FT_UInt ss; - - /* the value 255 means "uncovered glyph" - */ - FT_MEM_SET( globals->glyph_scripts, - AF_SCRIPT_LIST_NONE, - globals->glyph_count ); - - error = FT_Select_Charmap( face, FT_ENCODING_UNICODE ); - if ( error ) - { - /* ignore this error, we'll simply use Latin as the standard - * script. XXX: Shouldn't we rather disable hinting ?? - */ - error = 0; - goto Exit; - } - - /* scan each script in a Unicode charmap - */ - for ( ss = 0; af_script_classes[ss]; ss++ ) - { - AF_ScriptClass clazz = af_script_classes[ss]; - AF_Script_UniRange range; - - /* scan all unicode points in the range, and set the corresponding - * glyph script index - */ - for ( range = clazz->script_uni_ranges; range->first != 0; range++ ) - { - FT_ULong charcode = range->first; - FT_UInt gindex; - - gindex = FT_Get_Char_Index( face, charcode ); - - if ( gindex != 0 && - gindex < globals->glyph_count && - gscripts[ gindex ] == AF_SCRIPT_LIST_NONE ) - { - gscripts[ gindex ] = (FT_Byte) ss; - } - for (;;) - { - charcode = FT_Get_Next_Char( face, charcode, &gindex ); - - if ( gindex == 0 || charcode > range->last ) - break; - - if ( gindex < globals->glyph_count && - gscripts[ gindex ] == AF_SCRIPT_LIST_NONE ) - { - gscripts[ gindex ] = (FT_Byte) ss; - } - } - } - } - - Exit: - /* by default, all uncovered glyphs are set to the latin script - * XXX: shouldnt' we disable hinting or do something similar ? - */ - { - FT_UInt nn; - - for ( nn = 0; nn < globals->glyph_count; nn++ ) - { - if ( gscripts[ nn ] == AF_SCRIPT_LIST_NONE ) - gscripts[ nn ] = AF_SCRIPT_LIST_DEFAULT; - } - } - - FT_Set_Charmap( face, old_charmap ); - return error; - } - - - - FT_LOCAL_DEF( FT_Error ) - af_face_globals_new( FT_Face face, - AF_FaceGlobals *aglobals ) - { - FT_Error error; - FT_Memory memory; - AF_FaceGlobals globals; - - memory = face->memory; - - if ( !FT_ALLOC( globals, sizeof(*globals) + - face->num_glyphs*sizeof(FT_Byte) ) ) - { - globals->face = face; - globals->glyph_count = face->num_glyphs; - globals->glyph_scripts = (FT_Byte*)( globals+1 ); - - error = af_face_globals_compute_script_coverage( globals ); - if ( error ) - { - af_face_globals_free( globals ); - globals = NULL; - } - } - - *aglobals = globals; - return error; - } - - - FT_LOCAL_DEF( void ) - af_face_globals_free( AF_FaceGlobals globals ) - { - if ( globals ) - { - FT_Memory memory = globals->face->memory; - FT_UInt nn; - - for ( nn = 0; nn < AF_SCRIPT_MAX; nn++ ) - { - if ( globals->metrics[nn] ) - { - AF_ScriptClass clazz = af_script_classes[nn]; - - FT_ASSERT( globals->metrics[nn]->clazz == clazz ); - - if ( clazz->script_metrics_done ) - clazz->script_metrics_done( globals->metrics[nn] ); - - FT_FREE( globals->metrics[nn] ); - } - } - - globals->glyph_count = 0; - globals->glyph_scripts = NULL; /* no need to free this one !! */ - globals->face = NULL; - FT_FREE( globals ); - } - } - - - FT_LOCAL_DEF( FT_Error ) - af_face_globals_get_metrics( AF_FaceGlobals globals, - FT_UInt gindex, - AF_ScriptMetrics *ametrics ) - { - AF_ScriptMetrics metrics = NULL; - FT_UInt index; - AF_ScriptClass clazz; - FT_Error error = 0; - - if ( gindex >= globals->glyph_count ) - { - error = FT_Err_Invalid_Argument; - goto Exit; - } - - index = globals->glyph_scripts[ gindex ]; - clazz = af_script_classes[ index ]; - metrics = globals->metrics[ clazz->script ]; - if ( metrics == NULL ) - { - /* create the global metrics object when needed - */ - FT_Memory memory = globals->face->memory; - - if ( FT_ALLOC( metrics, clazz->script_metrics_size ) ) - goto Exit; - - metrics->clazz = clazz; - - if ( clazz->script_metrics_init ) - { - error = clazz->script_metrics_init( metrics, globals->face ); - if ( error ) - { - if ( clazz->script_metrics_done ) - clazz->script_metrics_done( metrics ); - - FT_FREE( metrics ); - goto Exit; - } - } - - globals->metrics[ clazz->script ] = metrics; - } - - Exit: - *ametrics = metrics; - return error; - } diff --git a/reactos/lib/freetype/src/autofit/afglobal.h b/reactos/lib/freetype/src/autofit/afglobal.h deleted file mode 100644 index 64f35c3fff9..00000000000 --- a/reactos/lib/freetype/src/autofit/afglobal.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef __AF_GLOBAL_H__ -#define __AF_GLOBAL_H__ - -#include "aftypes.h" - -FT_BEGIN_HEADER - - /**************************************************************************/ - /**************************************************************************/ - /***** *****/ - /***** F A C E G L O B A L S *****/ - /***** *****/ - /**************************************************************************/ - /**************************************************************************/ - - - /* - * models the global hints data for a given face, decomposed into - * script-specific items.. - * - */ - typedef struct AF_FaceGlobalsRec_* AF_FaceGlobals; - - - FT_LOCAL( FT_Error ) - af_face_globals_new( FT_Face face, - AF_FaceGlobals *aglobals ); - - FT_LOCAL( FT_Error ) - af_face_globals_get_metrics( AF_FaceGlobals globals, - FT_UInt gindex, - AF_ScriptMetrics *ametrics ); - - FT_LOCAL( void ) - af_face_globals_free( AF_FaceGlobals globals ); - - /* */ - -FT_END_HEADER - -#endif /* __AF_GLOBALS_H__ */ diff --git a/reactos/lib/freetype/src/autofit/afhints.c b/reactos/lib/freetype/src/autofit/afhints.c deleted file mode 100644 index 4cc55ebefd0..00000000000 --- a/reactos/lib/freetype/src/autofit/afhints.c +++ /dev/null @@ -1,934 +0,0 @@ -#include "afhints.h" - -#ifdef AF_DEBUG - -#include <stdio.h> - - void - af_glyph_hints_dump_edges( AF_GlyphHints hints ) - { - AF_Edge edges; - AF_Edge edge_limit; - AF_Segment segments; - FT_Int dimension; - - - edges = hints->horz_edges; - edge_limit = edges + hints->num_hedges; - segments = hints->horz_segments; - - for ( dimension = 1; dimension >= 0; dimension-- ) - { - AF_Edge edge; - - - printf ( "Table of %s edges:\n", - !dimension ? "vertical" : "horizontal" ); - printf ( " [ index | pos | dir | link |" - " serif | blue | opos | pos ]\n" ); - - for ( edge = edges; edge < edge_limit; edge++ ) - { - printf ( " [ %5d | %4d | %5s | %4d | %5d | %c | %5.2f | %5.2f ]\n", - edge - edges, - (int)edge->fpos, - edge->dir == AF_DIR_UP - ? "up" - : ( edge->dir == AF_DIR_DOWN - ? "down" - : ( edge->dir == AF_DIR_LEFT - ? "left" - : ( edge->dir == AF_DIR_RIGHT - ? "right" - : "none" ) ) ), - edge->link ? ( edge->link - edges ) : -1, - edge->serif ? ( edge->serif - edges ) : -1, - edge->blue_edge ? 'y' : 'n', - edge->opos / 64.0, - edge->pos / 64.0 ); - } - - edges = hints->vert_edges; - edge_limit = edges + hints->num_vedges; - segments = hints->vert_segments; - } - } - - - /* A function used to dump the array of linked segments */ - void - af_glyph_hints_dump_segments( AF_GlyphHints hints ) - { - AF_Segment segments; - AF_Segment segment_limit; - AF_Point points; - FT_Int dimension; - - - points = hints->points; - segments = hints->horz_segments; - segment_limit = segments + hints->num_hsegments; - - for ( dimension = 1; dimension >= 0; dimension-- ) - { - AF_Segment seg; - - - printf ( "Table of %s segments:\n", - !dimension ? "vertical" : "horizontal" ); - printf ( " [ index | pos | dir | link | serif |" - " numl | first | start ]\n" ); - - for ( seg = segments; seg < segment_limit; seg++ ) - { - printf ( " [ %5d | %4d | %5s | %4d | %5d | %4d | %5d | %5d ]\n", - seg - segments, - (int)seg->pos, - seg->dir == AF_DIR_UP - ? "up" - : ( seg->dir == AF_DIR_DOWN - ? "down" - : ( seg->dir == AF_DIR_LEFT - ? "left" - : ( seg->dir == AF_DIR_RIGHT - ? "right" - : "none" ) ) ), - seg->link ? ( seg->link - segments ) : -1, - seg->serif ? ( seg->serif - segments ) : -1, - (int)seg->num_linked, - seg->first - points, - seg->last - points ); - } - - segments = hints->vert_segments; - segment_limit = segments + hints->num_vsegments; - } - } - -#endif /* AF_DEBUG */ - - - /* compute the direction value of a given vector */ - FT_LOCAL_DEF( AF_Direction ) - af_direction_compute( FT_Pos dx, - FT_Pos dy ) - { - AF_Direction dir; - FT_Pos ax = ABS( dx ); - FT_Pos ay = ABS( dy ); - - - dir = AF_DIR_NONE; - - /* atan(1/12) == 4.7 degrees */ - - /* test for vertical direction */ - if ( ax * 12 < ay ) - { - dir = dy > 0 ? AF_DIR_UP : AF_DIR_DOWN; - } - /* test for horizontal direction */ - else if ( ay * 12 < ax ) - { - dir = dx > 0 ? AF_DIR_RIGHT : AF_DIR_LEFT; - } - - return dir; - } - - - /* compute all inflex points in a given glyph */ - static void - af_glyph_hints_compute_inflections( AF_GlyphHints hints ) - { - AF_Point* contour = hints->contours; - AF_Point* contour_limit = contour + hints->num_contours; - - - /* do each contour separately */ - for ( ; contour < contour_limit; contour++ ) - { - AF_Point point = contour[0]; - AF_Point first = point; - AF_Point start = point; - AF_Point end = point; - AF_Point before; - AF_Point after; - AF_Angle angle_in, angle_seg, angle_out; - AF_Angle diff_in, diff_out; - FT_Int finished = 0; - - - /* compute first segment in contour */ - first = point; - - start = end = first; - do - { - end = end->next; - if ( end == first ) - goto Skip; - - } while ( end->fx == first->fx && end->fy == first->fy ); - - angle_seg = af_angle_atan( end->fx - start->fx, - end->fy - start->fy ); - - /* extend the segment start whenever possible */ - before = start; - do - { - do - { - start = before; - before = before->prev; - if ( before == first ) - goto Skip; - - } while ( before->fx == start->fx && before->fy == start->fy ); - - angle_in = af_angle_atan( start->fx - before->fx, - start->fy - before->fy ); - - } while ( angle_in == angle_seg ); - - first = start; - diff_in = af_angle_diff( angle_in, angle_seg ); - - /* now, process all segments in the contour */ - do - { - /* first, extend current segment's end whenever possible */ - after = end; - do - { - do - { - end = after; - after = after->next; - if ( after == first ) - finished = 1; - - } while ( end->fx == after->fx && end->fy == after->fy ); - - angle_out = af_angle_atan( after->fx - end->fx, - after->fy - end->fy ); - - } while ( angle_out == angle_seg ); - - diff_out = af_angle_diff( angle_seg, angle_out ); - - if ( ( diff_in ^ diff_out ) < 0 ) - { - /* diff_in and diff_out have different signs, we have */ - /* inflection points here... */ - do - { - start->flags |= AF_FLAG_INFLECTION; - start = start->next; - - } while ( start != end ); - - start->flags |= AF_FLAG_INFLECTION; - } - - start = end; - end = after; - angle_seg = angle_out; - diff_in = diff_out; - - } while ( !finished ); - - Skip: - ; - } - } - - - - FT_LOCAL_DEF( void ) - af_glyph_hints_init( AF_GlyphHints hints, - FT_Memory memory ) - { - FT_ZERO( hints ); - hints->memory = memory; - } - - - - FT_LOCAL_DEF( void ) - af_glyph_hints_done( AF_GlyphHints hints ) - { - if ( hints && hints->memory ) - { - FT_Memory memory = hints->memory; - AF_Dimension dim; - - /* note that we don't need to free the segment and edge - * buffers, since they're really within the hints->points array - */ - for ( dim = 0; dim < 2; dim++ ) - { - AF_AxisHints axis = &hints->axis[ dim ]; - - axis->num_segments = 0; - axis->num_edges = 0; - axis->segments = NULL; - axis->edges = NULL; - } - - FT_FREE( hints->contours ); - hints->max_contours = 0; - hints->num_contours = 0; - - FT_FREE( hints->points ); - hints->num_points = 0; - hints->max_points = 0; - - hints->memory = NULL; - } - } - - - - FT_LOCAL_DEF( FT_Error ) - af_glyph_hints_reset( AF_GlyphHints hints, - AF_Scaler scaler, - FT_Outline* outline ) - { - FT_Error error = FT_Err_Ok; - AF_Point points; - FT_UInt old_max, new_max; - FT_Fixed x_scale = scaler->x_scale; - FT_Fixed y_scale = scaler->y_scale; - FT_Pos x_delta = scaler->x_delta; - FT_Pos y_delta = scaler->y_delta; - FT_Memory memory = hints->memory; - - hints->scaler_flags = scaler->flags; - hints->other_flags = 0; - - hints->num_points = 0; - hints->num_contours = 0; - - hints->axis[0].num_segments = 0; - hints->axis[0].num_edges = 0; - hints->axis[1].num_segments = 0; - hints->axis[1].num_edges = 0; - - /* first of all, reallocate the contours array when necessary - */ - new_max = (FT_UInt) outline->n_contours; - old_max = hints->max_contours; - if ( new_max > old_max ) - { - new_max = (new_max + 3) & ~3; - - if ( FT_RENEW_ARRAY( hints->contours, old_max, new_max ) ) - goto Exit; - - hints->max_contours = new_max; - } - - /* then, reallocate the points, segments & edges arrays if needed -- - * note that we reserved two additional point positions, used to - * hint metrics appropriately - */ - new_max = (FT_UInt)( outline->n_points + 2 ); - old_max = hints->max_points; - if ( new_max > old_max ) - { - FT_Byte* items; - FT_ULong off1, off2, off3; - - /* we store in a single buffer the following arrays: - * - * - an array of N AF_PointRec items - * - an array of 2*N AF_SegmentRec items - * - an array of 2*N AF_EdgeRec items - * - */ - - new_max = ( new_max + 2 + 7 ) & ~7; - -#undef OFF_INCREMENT -#define OFF_INCREMENT( _off, _type, _count ) \ - ( FT_PAD_CEIL( _off, sizeof(_type) ) + (_count)*sizeof(_type)) - - off1 = OFF_INCREMENT( 0, AF_PointRec, new_max ); - off2 = OFF_INCREMENT( off1, AF_SegmentRec, new_max ); - off3 = OFF_INCREMENT( off2, AF_EdgeRec, new_max*2 ); - - FT_FREE( hints->points ); - - if ( FT_ALLOC( items, off3 ) ) - { - hints->max_points = 0; - hints->axis[0].segments = NULL; - hints->axis[0].edges = NULL; - hints->axis[1].segments = NULL; - hints->axis[1].edges = NULL; - goto Exit; - } - - /* readjust some pointers - */ - hints->max_points = new_max; - hints->points = (AF_Point) items; - - hints->axis[0].segments = (AF_Segment)( items + off1 ); - hints->axis[1].segments = hints->axis[0].segments + new_max; - - hints->axis[0].edges = (AF_Edge) ( items + off2 ); - hints->axis[1].edges = hints->axis[0].edges + new_max; - } - - hints->num_points = outline->n_points; - hints->num_contours = outline->n_contours; - - - /* We can't rely on the value of `FT_Outline.flags' to know the fill */ - /* direction used for a glyph, given that some fonts are broken (e.g. */ - /* the Arphic ones). We thus recompute it each time we need to. */ - /* */ - hints->axis[ AF_DIMENSION_HORZ ].major_dir = AF_DIR_UP; - hints->axis[ AF_DIMENSION_VERT ].major_dir = AF_DIR_LEFT; - - if ( FT_Outline_Get_Orientation( outline ) == FT_ORIENTATION_POSTSCRIPT ) - { - hints->axis[ AF_DIMENSION_HORZ ].major_dir = AF_DIR_DOWN; - hints->axis[ AF_DIMENSION_VERT ].major_dir = AF_DIR_RIGHT; - } - - hints->x_scale = x_scale; - hints->y_scale = y_scale; - hints->x_delta = x_delta; - hints->y_delta = y_delta; - - points = hints->points; - if ( hints->num_points == 0 ) - goto Exit; - - { - AF_Point point; - AF_Point point_limit = points + hints->num_points; - - - /* compute coordinates & bezier flags */ - { - FT_Vector* vec = outline->points; - char* tag = outline->tags; - - - for ( point = points; point < point_limit; point++, vec++, tag++ ) - { - point->fx = vec->x; - point->fy = vec->y; - point->ox = point->x = FT_MulFix( vec->x, x_scale ) + x_delta; - point->oy = point->y = FT_MulFix( vec->y, y_scale ) + y_delta; - - switch ( FT_CURVE_TAG( *tag ) ) - { - case FT_CURVE_TAG_CONIC: - point->flags = AF_FLAG_CONIC; - break; - case FT_CURVE_TAG_CUBIC: - point->flags = AF_FLAG_CUBIC; - break; - default: - point->flags = 0; - ; - } - } - } - - /* compute `next' and `prev' */ - { - FT_Int contour_index; - AF_Point prev; - AF_Point first; - AF_Point end; - - - contour_index = 0; - - first = points; - end = points + outline->contours[0]; - prev = end; - - for ( point = points; point < point_limit; point++ ) - { - point->prev = prev; - if ( point < end ) - { - point->next = point + 1; - prev = point; - } - else - { - point->next = first; - contour_index++; - if ( point + 1 < point_limit ) - { - end = points + outline->contours[contour_index]; - first = point + 1; - prev = end; - } - } - } - } - - /* set-up the contours array */ - { - AF_Point* contour = hints->contours; - AF_Point* contour_limit = contour + hints->num_contours; - short* end = outline->contours; - short idx = 0; - - - for ( ; contour < contour_limit; contour++, end++ ) - { - contour[0] = points + idx; - idx = (short)( end[0] + 1 ); - } - } - - /* compute directions of in & out vectors */ - { - for ( point = points; point < point_limit; point++ ) - { - AF_Point prev; - AF_Point next; - FT_Pos in_x, in_y, out_x, out_y; - - - prev = point->prev; - in_x = point->fx - prev->fx; - in_y = point->fy - prev->fy; - - point->in_dir = af_direction_compute( in_x, in_y ); - - next = point->next; - out_x = next->fx - point->fx; - out_y = next->fy - point->fy; - - point->out_dir = af_direction_compute( out_x, out_y ); - - if ( point->flags & ( AF_FLAG_CONIC | AF_FLAG_CUBIC ) ) - { - Is_Weak_Point: - point->flags |= AF_FLAG_WEAK_INTERPOLATION; - } - else if ( point->out_dir == point->in_dir ) - { - AF_Angle angle_in, angle_out, delta; - - - if ( point->out_dir != AF_DIR_NONE ) - goto Is_Weak_Point; - - angle_in = af_angle_atan( in_x, in_y ); - angle_out = af_angle_atan( out_x, out_y ); - delta = af_angle_diff( angle_in, angle_out ); - - if ( delta < 2 && delta > -2 ) - goto Is_Weak_Point; - } - else if ( point->in_dir == -point->out_dir ) - goto Is_Weak_Point; - } - } - } - - /* compute inflection points - */ - af_glyph_hints_compute_inflections( hints ); - - Exit: - return error; - } - - - - - /* - * - * E D G E P O I N T G R I D - F I T T I N G - * - */ - - - FT_LOCAL_DEF( void ) - af_glyph_hints_align_edge_points( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = & hints->axis[ dim ]; - AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; - AF_Edge edge; - - for ( edge = edges; edge < edge_limit; edge++ ) - { - /* move the points of each segment */ - /* in each edge to the edge's position */ - AF_Segment seg = edge->first; - - - do - { - AF_Point point = seg->first; - - - for (;;) - { - if ( dim == AF_DIMENSION_HORZ ) - { - point->x = edge->pos; - point->flags |= AF_FLAG_TOUCH_X; - } - else - { - point->y = edge->pos; - point->flags |= AF_FLAG_TOUCH_Y; - } - - if ( point == seg->last ) - break; - - point = point->next; - } - - seg = seg->edge_next; - - } while ( seg != edge->first ); - } - } - - - /* - * - * S T R O N G P O I N T I N T E R P O L A T I O N - * - */ - - - /* hint the strong points -- this is equivalent to the TrueType `IP' */ - /* hinting instruction */ - FT_LOCAL_DEF( void ) - af_glyph_hints_align_strong_points( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_Point points = hints->points; - AF_Point point_limit = points + hints->num_points; - AF_AxisHints axis = &hints->axis[dim]; - AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; - AF_Flags touch_flag; - - - if ( dim == AF_DIMENSION_HORZ ) - touch_flag = AF_FLAG_TOUCH_X; - else - touch_flag = AF_FLAG_TOUCH_Y; - - if ( edges < edge_limit ) - { - AF_Point point; - AF_Edge edge; - - for ( point = points; point < point_limit; point++ ) - { - FT_Pos u, ou, fu; /* point position */ - FT_Pos delta; - - - if ( point->flags & touch_flag ) - continue; - - /* if this point is candidate to weak interpolation, we will */ - /* interpolate it after all strong points have been processed */ - if ( ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) && - !( point->flags & AF_FLAG_INFLECTION ) ) - continue; - - if ( dim == AF_DIMENSION_VERT ) - { - u = point->fy; - ou = point->oy; - } - else - { - u = point->fx; - ou = point->ox; - } - - fu = u; - - /* is the point before the first edge? */ - edge = edges; - delta = edge->fpos - u; - if ( delta >= 0 ) - { - u = edge->pos - ( edge->opos - ou ); - goto Store_Point; - } - - /* is the point after the last edge? */ - edge = edge_limit - 1; - delta = u - edge->fpos; - if ( delta >= 0 ) - { - u = edge->pos + ( ou - edge->opos ); - goto Store_Point; - } - - { - FT_UInt min, max, mid; - FT_Pos fpos; - - - /* find enclosing edges */ - min = 0; - max = edge_limit - edges; - - while ( min < max ) - { - mid = ( max + min ) >> 1; - edge = edges + mid; - fpos = edge->fpos; - - if ( u < fpos ) - max = mid; - else if ( u > fpos ) - min = mid + 1; - else - { - /* we are on the edge */ - u = edge->pos; - goto Store_Point; - } - } - - { - AF_Edge before = edges + min - 1; - AF_Edge after = edges + min + 0; - - - /* assert( before && after && before != after ) */ - if ( before->scale == 0 ) - before->scale = FT_DivFix( after->pos - before->pos, - after->fpos - before->fpos ); - - u = before->pos + FT_MulFix( fu - before->fpos, - before->scale ); - } - } - - - Store_Point: - - /* save the point position */ - if ( dim == AF_DIMENSION_HORZ ) - point->x = u; - else - point->y = u; - - point->flags |= touch_flag; - } - } - } - - - /* - * - * W E A K P O I N T I N T E R P O L A T I O N - * - */ - - static void - af_iup_shift( AF_Point p1, - AF_Point p2, - AF_Point ref ) - { - AF_Point p; - FT_Pos delta = ref->u - ref->v; - - - for ( p = p1; p < ref; p++ ) - p->u = p->v + delta; - - for ( p = ref + 1; p <= p2; p++ ) - p->u = p->v + delta; - } - - - static void - af_iup_interp( AF_Point p1, - AF_Point p2, - AF_Point ref1, - AF_Point ref2 ) - { - AF_Point p; - FT_Pos u; - FT_Pos v1 = ref1->v; - FT_Pos v2 = ref2->v; - FT_Pos d1 = ref1->u - v1; - FT_Pos d2 = ref2->u - v2; - - - if ( p1 > p2 ) - return; - - if ( v1 == v2 ) - { - for ( p = p1; p <= p2; p++ ) - { - u = p->v; - - if ( u <= v1 ) - u += d1; - else - u += d2; - - p->u = u; - } - return; - } - - if ( v1 < v2 ) - { - for ( p = p1; p <= p2; p++ ) - { - u = p->v; - - if ( u <= v1 ) - u += d1; - else if ( u >= v2 ) - u += d2; - else - u = ref1->u + FT_MulDiv( u - v1, ref2->u - ref1->u, v2 - v1 ); - - p->u = u; - } - } - else - { - for ( p = p1; p <= p2; p++ ) - { - u = p->v; - - if ( u <= v2 ) - u += d2; - else if ( u >= v1 ) - u += d1; - else - u = ref1->u + FT_MulDiv( u - v1, ref2->u - ref1->u, v2 - v1 ); - - p->u = u; - } - } - } - - - FT_LOCAL_DEF( void ) - af_glyph_hints_align_weak_points( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_Point points = hints->points; - AF_Point point_limit = points + hints->num_points; - AF_Point* contour = hints->contours; - AF_Point* contour_limit = contour + hints->num_contours; - AF_Flags touch_flag; - AF_Point point; - AF_Point end_point; - AF_Point first_point; - - - /* PASS 1: Move segment points to edge positions */ - - if ( dim == AF_DIMENSION_HORZ ) - { - touch_flag = AF_FLAG_TOUCH_X; - - for ( point = points; point < point_limit; point++ ) - { - point->u = point->x; - point->v = point->ox; - } - } - else - { - touch_flag = AF_FLAG_TOUCH_Y; - - for ( point = points; point < point_limit; point++ ) - { - point->u = point->y; - point->v = point->oy; - } - } - - point = points; - - for ( ; contour < contour_limit; contour++ ) - { - point = *contour; - end_point = point->prev; - first_point = point; - - while ( point <= end_point && !( point->flags & touch_flag ) ) - point++; - - if ( point <= end_point ) - { - AF_Point first_touched = point; - AF_Point cur_touched = point; - - - point++; - while ( point <= end_point ) - { - if ( point->flags & touch_flag ) - { - /* we found two successive touched points; we interpolate */ - /* all contour points between them */ - af_iup_interp( cur_touched + 1, point - 1, - cur_touched, point ); - cur_touched = point; - } - point++; - } - - if ( cur_touched == first_touched ) - { - /* this is a special case: only one point was touched in the */ - /* contour; we thus simply shift the whole contour */ - af_iup_shift( first_point, end_point, cur_touched ); - } - else - { - /* now interpolate after the last touched point to the end */ - /* of the contour */ - af_iup_interp( cur_touched + 1, end_point, - cur_touched, first_touched ); - - /* if the first contour point isn't touched, interpolate */ - /* from the contour start to the first touched point */ - if ( first_touched > points ) - af_iup_interp( first_point, first_touched - 1, - cur_touched, first_touched ); - } - } - } - - /* now save the interpolated values back to x/y */ - if ( dim == AF_DIMENSION_HORZ ) - { - for ( point = points; point < point_limit; point++ ) - point->x = point->u; - } - else - { - for ( point = points; point < point_limit; point++ ) - point->y = point->u; - } - } diff --git a/reactos/lib/freetype/src/autofit/afhints.h b/reactos/lib/freetype/src/autofit/afhints.h deleted file mode 100644 index 7283cc39e59..00000000000 --- a/reactos/lib/freetype/src/autofit/afhints.h +++ /dev/null @@ -1,241 +0,0 @@ -#ifndef __AFHINTS_H__ -#define __AFHINTS_H__ - -#include "aftypes.h" - -FT_BEGIN_HEADER - - /* - * The definition of outline glyph hints. These are shared by all - * script analysis routines (until now) - * - */ - - typedef enum - { - AF_DIMENSION_HORZ = 0, /* x coordinates, i.e. vertical segments & edges */ - AF_DIMENSION_VERT = 1, /* y coordinates, i.e. horizontal segments & edges */ - - AF_DIMENSION_MAX /* do not remove */ - - } AF_Dimension; - - - /* hint directions -- the values are computed so that two vectors are */ - /* in opposite directions iff `dir1+dir2 == 0' */ - typedef enum - { - AF_DIR_NONE = 4, - AF_DIR_RIGHT = 1, - AF_DIR_LEFT = -1, - AF_DIR_UP = 2, - AF_DIR_DOWN = -2 - - } AF_Direction; - - - /* point hint flags */ - typedef enum - { - AF_FLAG_NONE = 0, - - /* point type flags */ - AF_FLAG_CONIC = (1 << 0), - AF_FLAG_CUBIC = (1 << 1), - AF_FLAG_CONTROL = AF_FLAG_CONIC | AF_FLAG_CUBIC, - - /* point extremum flags */ - AF_FLAG_EXTREMA_X = (1 << 2), - AF_FLAG_EXTREMA_Y = (1 << 3), - - /* point roundness flags */ - AF_FLAG_ROUND_X = (1 << 4), - AF_FLAG_ROUND_Y = (1 << 5), - - /* point touch flags */ - AF_FLAG_TOUCH_X = (1 << 6), - AF_FLAG_TOUCH_Y = (1 << 7), - - /* candidates for weak interpolation have this flag set */ - AF_FLAG_WEAK_INTERPOLATION = (1 << 8), - - /* all inflection points in the outline have this flag set */ - AF_FLAG_INFLECTION = (1 << 9) - - } AF_Flags; - - - /* edge hint flags */ - typedef enum - { - AF_EDGE_NORMAL = 0, - AF_EDGE_ROUND = (1 << 0), - AF_EDGE_SERIF = (1 << 1), - AF_EDGE_DONE = (1 << 2) - - } AF_Edge_Flags; - - - - typedef struct AF_PointRec_* AF_Point; - typedef struct AF_SegmentRec_* AF_Segment; - typedef struct AF_EdgeRec_* AF_Edge; - - - typedef struct AF_PointRec_ - { - AF_Flags flags; /* point flags used by hinter */ - FT_Pos ox, oy; /* original, scaled position */ - FT_Pos fx, fy; /* original, unscaled position (font units) */ - FT_Pos x, y; /* current position */ - FT_Pos u, v; /* current (x,y) or (y,x) depending on context */ - - AF_Direction in_dir; /* direction of inwards vector */ - AF_Direction out_dir; /* direction of outwards vector */ - - AF_Point next; /* next point in contour */ - AF_Point prev; /* previous point in contour */ - - } AF_PointRec; - - - typedef struct AF_SegmentRec_ - { - AF_Edge_Flags flags; /* edge/segment flags for this segment */ - AF_Direction dir; /* segment direction */ - FT_Pos pos; /* position of segment */ - FT_Pos min_coord; /* minimum coordinate of segment */ - FT_Pos max_coord; /* maximum coordinate of segment */ - - AF_Edge edge; /* the segment's parent edge */ - AF_Segment edge_next; /* link to next segment in parent edge */ - - AF_Segment link; /* (stem) link segment */ - AF_Segment serif; /* primary segment for serifs */ - FT_Pos num_linked; /* number of linked segments */ - FT_Pos score; /* used during stem matching */ - - AF_Point first; /* first point in edge segment */ - AF_Point last; /* last point in edge segment */ - AF_Point* contour; /* ptr to first point of segment's contour */ - - } AF_SegmentRec; - - - typedef struct AF_EdgeRec_ - { - FT_Pos fpos; /* original, unscaled position (font units) */ - FT_Pos opos; /* original, scaled position */ - FT_Pos pos; /* current position */ - - AF_Edge_Flags flags; /* edge flags */ - AF_Direction dir; /* edge direction */ - FT_Fixed scale; /* used to speed up interpolation between edges */ - AF_Width blue_edge; /* non-NULL if this is a blue edge */ - - AF_Edge link; - AF_Edge serif; - FT_Int num_linked; - - FT_Int score; - - AF_Segment first; - AF_Segment last; - - } AF_EdgeRec; - - - typedef struct AF_AxisHintsRec_ - { - FT_Int num_segments; - AF_Segment segments; - - FT_Int num_edges; - AF_Edge edges; - - AF_Direction major_dir; - - } AF_AxisHintsRec, *AF_AxisHints; - - - typedef struct AF_GlyphHintsRec_ - { - FT_Memory memory; - - FT_Fixed x_scale; - FT_Pos x_delta; - - FT_Fixed y_scale; - FT_Pos y_delta; - - FT_Pos edge_distance_threshold; - - FT_Int max_points; - FT_Int num_points; - AF_Point points; - - FT_Int max_contours; - FT_Int num_contours; - AF_Point* contours; - - AF_AxisHintsRec axis[ AF_DIMENSION_MAX ]; - - FT_UInt32 scaler_flags; /* copy of scaler flags */ - FT_UInt32 other_flags; /* free for script-specific implementations */ - AF_ScriptMetrics metrics; - - } AF_GlyphHintsRec; - - -#define AF_HINTS_TEST_SCALER(h,f) ( (h)->scaler_flags & (f) ) -#define AF_HINTS_TEST_OTHER(h,f) ( (h)->other_flags & (f) ) - -#define AF_HINTS_DO_HORIZONTAL(h) \ - !AF_HINTS_TEST_SCALER(h,AF_SCALER_FLAG_NO_HORIZONTAL) - -#define AF_HINTS_DO_VERTICAL(h) \ - !AF_HINTS_TEST_SCALER(h,AF_SCALER_FLAG_NO_VERTICAL) - -#define AF_HINTS_DO_ADVANCE(h) \ - !AF_HINTS_TEST_SCALER(h,AF_SCALER_FLAG_NO_ADVANCE) - - - FT_LOCAL( AF_Direction ) - af_direction_compute( FT_Pos dx, - FT_Pos dy ); - - - FT_LOCAL( void ) - af_glyph_hints_init( AF_GlyphHints hints, - FT_Memory memory ); - - - - /* recomputes all AF_Point in a AF_GlyphHints from the definitions - * in a source outline - */ - FT_LOCAL( FT_Error ) - af_glyph_hints_reset( AF_GlyphHints hints, - AF_Scaler scaler, - FT_Outline* outline ); - - FT_LOCAL( void ) - af_glyph_hints_align_edge_points( AF_GlyphHints hints, - AF_Dimension dim ); - - FT_LOCAL( void ) - af_glyph_hints_align_strong_points( AF_GlyphHints hints, - AF_Dimension dim ); - - FT_LOCAL( void ) - af_glyph_hints_align_weak_points( AF_GlyphHints hints, - AF_Dimension dim ); - - FT_LOCAL( void ) - af_glyph_hints_done( AF_GlyphHints hints ); - -/* */ - -FT_END_HEADER - -#endif /* __AFHINTS_H__ */ diff --git a/reactos/lib/freetype/src/autofit/aflatin.c b/reactos/lib/freetype/src/autofit/aflatin.c deleted file mode 100644 index 0ddc562acfb..00000000000 --- a/reactos/lib/freetype/src/autofit/aflatin.c +++ /dev/null @@ -1,1784 +0,0 @@ -#include "aflatin.h" - - /***************************************************************************/ - /***************************************************************************/ - /***** *****/ - /***** L A T I N G L O B A L M E T R I C S *****/ - /***** *****/ - /***************************************************************************/ - /***************************************************************************/ - - static void - af_latin_metrics_init_widths( AF_LatinMetrics metrics, - FT_Face face ) - { - /* scan the array of segments in each direction */ - AF_GlyphHintsRec hints[1]; - - af_glyph_hints_init( hints, face->memory ); - - metrics->axis[ AF_DIMENSION_HORZ ].width_count = 0; - metrics->axis[ AF_DIMENSION_VERT ].width_count = 0; - - /* For now, compute the standard width and height from the `o' */ - { - FT_Error error; - FT_UInt glyph_index; - AF_Dimension dim; - AF_ScalerRec scaler[1]; - - - glyph_index = FT_Get_Char_Index( face, 'o' ); - if ( glyph_index == 0 ) - goto Exit; - - error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); - if ( error || face->glyph->outline.n_points <= 0 ) - goto Exit; - - scaler->x_scale = scaler->y_scale = 0x10000L; - scaler->x_delta = scaler->y_delta = 0; - scaler->face = face; - scaler->render_mode = 0; - scaler->flags = 0; - - error = af_glyph_hints_reset( hints, scaler, &face->glyph->outline ); - if ( error ) - goto Exit; - - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { - AF_LatinAxis axis = & metrics->axis[ dim ]; - AF_AxisHints axhints = & hints->axis[ dim ]; - AF_Segment seg, limit, link; - FT_UInt num_widths = 0; - FT_Pos edge_distance_threshold = 32000; - - af_latin_hints_compute_segments( hints, dim ); - af_latin_hints_link_segments ( hints, dim ); - - seg = axhints->segments; - limit = seg + axhints->num_segments; - - for ( ; seg < limit; seg++ ) - { - link = seg->link; - /* we only consider stem segments there! */ - if ( link && link->link == seg && link > seg ) - { - FT_Pos dist; - - - dist = seg->pos - link->pos; - if ( dist < 0 ) - dist = -dist; - - if ( num_widths < AF_LATIN_MAX_WIDTHS ) - axis->widths[ num_widths++ ].org = dist; - } - } - - af_sort_widths( num_widths, axis->widths ); - axis->width_count = num_widths; - - /* we will now try to find the smallest width */ - if ( num_widths > 0 && axis->widths[0].org < edge_distance_threshold ) - edge_distance_threshold = axis->widths[0].org; - - /* Now, compute the edge distance threshold as a fraction of the */ - /* smallest width in the font. Set it in `hinter->glyph' too! */ - if ( edge_distance_threshold == 32000 ) - edge_distance_threshold = 50; - - /* let's try 20% */ - axis->edge_distance_threshold = edge_distance_threshold / 5; - } - } - - Exit: - af_glyph_hints_done( hints ); - } - - - -#define AF_LATIN_MAX_TEST_CHARACTERS 12 - - - static const char* const af_latin_blue_chars[ AF_LATIN_MAX_BLUES ] = - { - "THEZOCQS", - "HEZLOCUS", - "fijkdbh", - "xzroesc", - "xzroesc", - "pqgjy" - }; - - - static void - af_latin_metrics_init_blues( AF_LatinMetrics metrics, - FT_Face face ) - { - FT_Pos flats [ AF_LATIN_MAX_TEST_CHARACTERS ]; - FT_Pos rounds[ AF_LATIN_MAX_TEST_CHARACTERS ]; - FT_Int num_flats; - FT_Int num_rounds; - FT_Int bb; - AF_LatinBlue blue; - FT_Error error; - AF_LatinAxis axis = &metrics->axis[ AF_DIMENSION_VERT ]; - FT_GlyphSlot glyph = face->glyph; - - /* we compute the blues simply by loading each character from the */ - /* 'af_latin_blue_chars[blues]' string, then compute its top-most or */ - /* bottom-most points (depending on `AF_IS_TOP_BLUE') */ - - AF_LOG(( "blue zones computation\n" )); - AF_LOG(( "------------------------------------------------\n" )); - - for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ ) - { - const char* p = af_latin_blue_chars[bb]; - const char* limit = p + AF_LATIN_MAX_TEST_CHARACTERS; - FT_Pos* blue_ref; - FT_Pos* blue_shoot; - - AF_LOG(( "blue %3d: ", blue )); - - num_flats = 0; - num_rounds = 0; - - for ( ; p < limit && *p; p++ ) - { - FT_UInt glyph_index; - FT_Vector* extremum; - FT_Vector* points; - FT_Vector* point_limit; - FT_Vector* point; - FT_Bool round; - - - AF_LOG(( "'%c'", *p )); - - /* load the character in the face -- skip unknown or empty ones */ - glyph_index = FT_Get_Char_Index( face, (FT_UInt)*p ); - if ( glyph_index == 0 ) - continue; - - error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); - if ( error || glyph->outline.n_points <= 0 ) - continue; - - /* now compute min or max point indices and coordinates */ - points = glyph->outline.points; - point_limit = points + glyph->outline.n_points; - point = points; - extremum = point; - point++; - - if ( AF_LATIN_IS_TOP_BLUE( bb ) ) - { - for ( ; point < point_limit; point++ ) - if ( point->y > extremum->y ) - extremum = point; - } - else - { - for ( ; point < point_limit; point++ ) - if ( point->y < extremum->y ) - extremum = point; - } - - AF_LOG(( "%5d", (int)extremum->y )); - - /* now, check whether the point belongs to a straight or round */ - /* segment; we first need to find in which contour the extremum */ - /* lies, then see its previous and next points */ - { - FT_Int idx = (FT_Int)( extremum - points ); - FT_Int n; - FT_Int first, last, prev, next, end; - FT_Pos dist; - - - last = -1; - first = 0; - - for ( n = 0; n < glyph->outline.n_contours; n++ ) - { - end = glyph->outline.contours[n]; - if ( end >= idx ) - { - last = end; - break; - } - first = end + 1; - } - - /* XXX: should never happen! */ - if ( last < 0 ) - continue; - - /* now look for the previous and next points that are not on the */ - /* same Y coordinate. Threshold the `closeness'... */ - - prev = idx; - next = prev; - - do - { - if ( prev > first ) - prev--; - else - prev = last; - - dist = points[prev].y - extremum->y; - if ( dist < -5 || dist > 5 ) - break; - - } while ( prev != idx ); - - do - { - if ( next < last ) - next++; - else - next = first; - - dist = points[next].y - extremum->y; - if ( dist < -5 || dist > 5 ) - break; - - } while ( next != idx ); - - /* now, set the `round' flag depending on the segment's kind */ - round = FT_BOOL( - FT_CURVE_TAG( glyph->outline.tags[prev] ) != FT_CURVE_TAG_ON || - FT_CURVE_TAG( glyph->outline.tags[next] ) != FT_CURVE_TAG_ON ); - - AF_LOG(( "%c ", round ? 'r' : 'f' )); - } - - if ( round ) - rounds[num_rounds++] = extremum->y; - else - flats[num_flats++] = extremum->y; - } - - AF_LOG(( "\n" )); - - if ( num_flats == 0 && num_rounds == 0 ) - { - /* we couldn't find a single glyph to compute this blue zone, - * we will simply ignore it then - */ - AF_LOG(( "empty !!\n" )); - continue; - } - - /* we have computed the contents of the `rounds' and `flats' tables, */ - /* now determine the reference and overshoot position of the blue -- */ - /* we simply take the median value after a simple sort */ - af_sort_pos( num_rounds, rounds ); - af_sort_pos( num_flats, flats ); - - blue = & axis->blues[ axis->blue_count ]; - blue_ref = & blue->ref.org; - blue_shoot = & blue->shoot.org; - - axis->blue_count ++; - - if ( num_flats == 0 ) - { - *blue_ref = - *blue_shoot = rounds[num_rounds / 2]; - } - else if ( num_rounds == 0 ) - { - *blue_ref = - *blue_shoot = flats[num_flats / 2]; - } - else - { - *blue_ref = flats[num_flats / 2]; - *blue_shoot = rounds[num_rounds / 2]; - } - - /* there are sometimes problems: if the overshoot position of top */ - /* zones is under its reference position, or the opposite for bottom */ - /* zones. We must thus check everything there and correct the errors */ - if ( *blue_shoot != *blue_ref ) - { - FT_Pos ref = *blue_ref; - FT_Pos shoot = *blue_shoot; - FT_Bool over_ref = FT_BOOL( shoot > ref ); - - - if ( AF_LATIN_IS_TOP_BLUE( bb ) ^ over_ref ) - *blue_shoot = *blue_ref = ( shoot + ref ) / 2; - } - - blue->flags = 0; - if ( AF_LATIN_IS_TOP_BLUE(bb) ) - blue->flags |= AF_LATIN_BLUE_TOP; - - AF_LOG(( "-- ref = %ld, shoot = %ld\n", *blue_ref, *blue_shoot )); - } - - return; - } - - - static FT_Error - af_latin_metrics_init( AF_LatinMetrics metrics, - FT_Face face ) - { - FT_Error error; - FT_CharMap oldmap = face->charmap; - - /* do we have a Unicode charmap in there? */ - error = FT_Select_Charmap( face, FT_ENCODING_UNICODE ); - if ( error ) goto Exit; - - metrics->units_per_em = face->units_per_EM; - - af_latin_metrics_init_widths( metrics, face ); - af_latin_metrics_init_blues( metrics, face ); - - Exit: - FT_Set_Charmap( face, oldmap ); - return error; - } - - - static void - af_latin_metrics_scale_dim( AF_LatinMetrics metrics, - AF_Scaler scaler, - AF_Dimension dim ) - { - FT_Fixed scale; - FT_Pos delta; - AF_LatinAxis axis; - FT_UInt nn; - - if ( dim == AF_DIMENSION_HORZ ) - { - scale = scaler->x_scale; - delta = scaler->x_delta; - } - else - { - scale = scaler->y_scale; - delta = scaler->y_delta; - } - - axis = & metrics->axis[ dim ]; - - if ( axis->org_scale == scale && axis->org_delta == delta ) - return; - - axis->org_scale = scale; - axis->org_delta = delta; - - /* XXX: TODO: Correct Y and X scale according to Chester rules - */ - axis->scale = scale; - axis->delta = delta; - - if ( dim == AF_DIMENSION_HORZ ) - { - metrics->scaler.x_scale = scale; - metrics->scaler.x_delta = delta; - } - else - { - metrics->scaler.y_scale = scale; - metrics->scaler.y_delta = delta; - } - - /* scale the standard widths - */ - for ( nn = 0; nn < axis->width_count; nn++ ) - { - AF_Width width = axis->widths + nn; - - width->cur = FT_MulFix( width->org, scale ); - width->fit = width->cur; - } - - if ( dim == AF_DIMENSION_VERT ) - { - /* scale the blue zones - */ - for ( nn = 0; nn < axis->blue_count; nn++ ) - { - AF_LatinBlue blue = & axis->blues[nn]; - FT_Pos dist; - - blue->ref.cur = FT_MulFix( blue->ref.org, scale ) + delta; - blue->ref.fit = blue->ref.cur; - - blue->shoot.cur = FT_MulFix( blue->shoot.org, scale ) + delta; - blue->shoot.fit = blue->shoot.cur; - - /* a blue zone is only active when it is less than 3/4 pixels tall - */ - dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale ); - if ( dist >= 48 || dist <= -48 ) - blue->flags |= ~AF_LATIN_BLUE_ACTIVE; - } - } - } - - - FT_LOCAL_DEF( void ) - af_latin_metrics_scale( AF_LatinMetrics metrics, - AF_Scaler scaler ) - { - metrics->scaler = scaler[0]; - - af_latin_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ ); - af_latin_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT ); - } - - - /***************************************************************************/ - /***************************************************************************/ - /***** *****/ - /***** L A T I N G L Y P H A N A L Y S I S *****/ - /***** *****/ - /***************************************************************************/ - /***************************************************************************/ - - FT_LOCAL_DEF( void ) - af_latin_hints_compute_segments( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - AF_Segment segments = axis->segments; - AF_Segment segment = segments; - FT_Int num_segments = 0; - AF_Point* contour = hints->contours; - AF_Point* contour_limit = contour + hints->num_contours; - AF_Direction major_dir, segment_dir; - -#ifdef AF_HINT_METRICS - AF_Point min_point = 0; - AF_Point max_point = 0; - FT_Pos min_coord = 32000; - FT_Pos max_coord = -32000; -#endif - - major_dir = ABS( axis->major_dir ); - segment_dir = major_dir; - - /* set up (u,v) in each point */ - if ( dim == AF_DIMENSION_HORZ ) - { - AF_Point point = hints->points; - AF_Point limit = point + hints->num_points; - - for ( ; point < limit; point++ ) - { - point->u = point->fx; - point->v = point->fy; - } - } - else - { - AF_Point point = hints->points; - AF_Point limit = point + hints->num_points; - - for ( ; point < limit; point++ ) - { - point->u = point->fy; - point->v = point->fx; - } - } - - - /* do each contour separately */ - for ( ; contour < contour_limit; contour++ ) - { - AF_Point point = contour[0]; - AF_Point last = point->prev; - int on_edge = 0; - FT_Pos min_pos = 32000; /* minimum segment pos != min_coord */ - FT_Pos max_pos = -32000; /* maximum segment pos != max_coord */ - FT_Bool passed; - - -#ifdef AF_HINT_METRICS - if ( point->u < min_coord ) - { - min_coord = point->u; - min_point = point; - } - if ( point->u > max_coord ) - { - max_coord = point->u; - max_point = point; - } -#endif - - if ( point == last ) /* skip singletons -- just in case */ - continue; - - if ( ABS( last->out_dir ) == major_dir && - ABS( point->out_dir ) == major_dir ) - { - /* we are already on an edge, try to locate its start */ - last = point; - - for (;;) - { - point = point->prev; - if ( ABS( point->out_dir ) != major_dir ) - { - point = point->next; - break; - } - if ( point == last ) - break; - } - } - - last = point; - passed = 0; - - for (;;) - { - FT_Pos u, v; - - - if ( on_edge ) - { - u = point->u; - if ( u < min_pos ) - min_pos = u; - if ( u > max_pos ) - max_pos = u; - - if ( point->out_dir != segment_dir || point == last ) - { - /* we are just leaving an edge; record a new segment! */ - segment->last = point; - segment->pos = ( min_pos + max_pos ) >> 1; - - /* a segment is round if either its first or last point */ - /* is a control point */ - if ( ( segment->first->flags | point->flags ) & - AF_FLAG_CONTROL ) - segment->flags |= AF_EDGE_ROUND; - - /* compute segment size */ - min_pos = max_pos = point->v; - - v = segment->first->v; - if ( v < min_pos ) - min_pos = v; - if ( v > max_pos ) - max_pos = v; - - segment->min_coord = min_pos; - segment->max_coord = max_pos; - - on_edge = 0; - num_segments++; - segment++; - /* fallthrough */ - } - } - - /* now exit if we are at the start/end point */ - if ( point == last ) - { - if ( passed ) - break; - passed = 1; - } - - if ( !on_edge && ABS( point->out_dir ) == major_dir ) - { - /* this is the start of a new segment! */ - segment_dir = point->out_dir; - - /* clear all segment fields */ - FT_ZERO( segment ); - - segment->dir = segment_dir; - segment->flags = AF_EDGE_NORMAL; - min_pos = max_pos = point->u; - segment->first = point; - segment->last = point; - segment->contour = contour; - segment->score = 32000; - segment->link = NULL; - on_edge = 1; - -#ifdef AF_HINT_METRICS - if ( point == max_point ) - max_point = 0; - - if ( point == min_point ) - min_point = 0; -#endif - } - - point = point->next; - } - - } /* contours */ - -#ifdef AF_HINT_METRICS - /* we need to ensure that there are edges on the left-most and */ - /* right-most points of the glyph in order to hint the metrics; */ - /* we do this by inserting fake segments when needed */ - if ( dim == AF_DIMENSION_HORZ ) - { - AF_Point point = hints->points; - AF_Point point_limit = point + hints->num_points; - - FT_Pos min_pos = 32000; - FT_Pos max_pos = -32000; - - - min_point = 0; - max_point = 0; - - /* compute minimum and maximum points */ - for ( ; point < point_limit; point++ ) - { - FT_Pos x = point->fx; - - - if ( x < min_pos ) - { - min_pos = x; - min_point = point; - } - if ( x > max_pos ) - { - max_pos = x; - max_point = point; - } - } - - /* insert minimum segment */ - if ( min_point ) - { - /* clear all segment fields */ - FT_ZERO( segment ); - - segment->dir = segment_dir; - segment->flags = AF_EDGE_NORMAL; - segment->first = min_point; - segment->last = min_point; - segment->pos = min_pos; - segment->score = 32000; - segment->link = NULL; - - num_segments++; - segment++; - } - - /* insert maximum segment */ - if ( max_point ) - { - /* clear all segment fields */ - FT_ZERO( segment ); - - segment->dir = segment_dir; - segment->flags = AF_EDGE_NORMAL; - segment->first = max_point; - segment->last = max_point; - segment->pos = max_pos; - segment->score = 32000; - segment->link = NULL; - - num_segments++; - segment++; - } - } -#endif /* AF_HINT_METRICS */ - - axis->num_segments = num_segments; - } - - - FT_LOCAL_DEF( void ) - af_latin_hints_link_segments( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - AF_Segment segments = axis->segments; - AF_Segment segment_limit = segments + axis->num_segments; - AF_Direction major_dir = axis->major_dir; - AF_Segment seg1, seg2; - - /* now compare each segment to the others */ - for ( seg1 = segments; seg1 < segment_limit; seg1++ ) - { - /* the fake segments are introduced to hint the metrics -- */ - /* we must never link them to anything */ - if ( seg1->first == seg1->last || seg1->dir != major_dir ) - continue; - - for ( seg2 = segments; seg2 < segment_limit; seg2++ ) - if ( seg2 != seg1 && seg1->dir + seg2->dir == 0 ) - { - FT_Pos pos1 = seg1->pos; - FT_Pos pos2 = seg2->pos; - FT_Pos dist = pos2 - pos1; - - - if ( dist < 0 ) - continue; - - { - FT_Pos min = seg1->min_coord; - FT_Pos max = seg1->max_coord; - FT_Pos len, score; - - - if ( min < seg2->min_coord ) - min = seg2->min_coord; - - if ( max > seg2->max_coord ) - max = seg2->max_coord; - - len = max - min; - if ( len >= 8 ) - { - score = dist + 3000 / len; - - if ( score < seg1->score ) - { - seg1->score = score; - seg1->link = seg2; - } - - if ( score < seg2->score ) - { - seg2->score = score; - seg2->link = seg1; - } - } - } - } - } - - /* now, compute the `serif' segments */ - for ( seg1 = segments; seg1 < segment_limit; seg1++ ) - { - seg2 = seg1->link; - - if ( seg2 ) - { - seg2->num_linked++; - if ( seg2->link != seg1 ) - { - seg1->link = 0; - seg1->serif = seg2->link; - } - } - } - } - - - FT_LOCAL_DEF( void ) - af_latin_hints_compute_edges( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - AF_Edge edges = axis->edges; - AF_Edge edge, edge_limit; - - AF_Segment segments = axis->segments; - AF_Segment segment_limit = segments + axis->num_segments; - AF_Segment seg; - - AF_Direction up_dir; - FT_Fixed scale; - FT_Pos edge_distance_threshold; - - - scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale - : hints->y_scale; - - up_dir = ( dim == AF_DIMENSION_HORZ ) ? AF_DIR_UP - : AF_DIR_RIGHT; - - /*********************************************************************/ - /* */ - /* We will begin by generating a sorted table of edges for the */ - /* current direction. To do so, we simply scan each segment and try */ - /* to find an edge in our table that corresponds to its position. */ - /* */ - /* If no edge is found, we create and insert a new edge in the */ - /* sorted table. Otherwise, we simply add the segment to the edge's */ - /* list which will be processed in the second step to compute the */ - /* edge's properties. */ - /* */ - /* Note that the edges table is sorted along the segment/edge */ - /* position. */ - /* */ - /*********************************************************************/ - - edge_distance_threshold = FT_MulFix( hints->edge_distance_threshold, - scale ); - if ( edge_distance_threshold > 64 / 4 ) - edge_distance_threshold = 64 / 4; - - edge_distance_threshold = FT_DivFix( edge_distance_threshold, - scale ); - - edge_limit = edges; - for ( seg = segments; seg < segment_limit; seg++ ) - { - AF_Edge found = 0; - - - /* look for an edge corresponding to the segment */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - FT_Pos dist; - - - dist = seg->pos - edge->fpos; - if ( dist < 0 ) - dist = -dist; - - if ( dist < edge_distance_threshold ) - { - found = edge; - break; - } - } - - if ( !found ) - { - /* insert a new edge in the list and */ - /* sort according to the position */ - while ( edge > edges && edge[-1].fpos > seg->pos ) - { - edge[0] = edge[-1]; - edge--; - } - edge_limit++; - - /* clear all edge fields */ - FT_MEM_ZERO( edge, sizeof ( *edge ) ); - - /* add the segment to the new edge's list */ - edge->first = seg; - edge->last = seg; - edge->fpos = seg->pos; - edge->opos = edge->pos = FT_MulFix( seg->pos, scale ); - seg->edge_next = seg; - } - else - { - /* if an edge was found, simply add the segment to the edge's */ - /* list */ - seg->edge_next = edge->first; - edge->last->edge_next = seg; - edge->last = seg; - } - } - axis->num_edges = (FT_Int)( edge_limit - edges ); - - - /*********************************************************************/ - /* */ - /* Good, we will now compute each edge's properties according to */ - /* segments found on its position. Basically, these are: */ - /* */ - /* - edge's main direction */ - /* - stem edge, serif edge or both (which defaults to stem then) */ - /* - rounded edge, straight or both (which defaults to straight) */ - /* - link for edge */ - /* */ - /*********************************************************************/ - - /* first of all, set the `edge' field in each segment -- this is */ - /* required in order to compute edge links */ - - /* Note that I've tried to remove this loop, setting - * the "edge" field of each segment directly in the - * code above. For some reason, it slows down execution - * speed -- on a Sun. - */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - seg = edge->first; - if ( seg ) - do - { - seg->edge = edge; - seg = seg->edge_next; - } - while ( seg != edge->first ); - } - - /* now, compute each edge properties */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - FT_Int is_round = 0; /* does it contain round segments? */ - FT_Int is_straight = 0; /* does it contain straight segments? */ - FT_Pos ups = 0; /* number of upwards segments */ - FT_Pos downs = 0; /* number of downwards segments */ - - - seg = edge->first; - - do - { - FT_Bool is_serif; - - - /* check for roundness of segment */ - if ( seg->flags & AF_EDGE_ROUND ) - is_round++; - else - is_straight++; - - /* check for segment direction */ - if ( seg->dir == up_dir ) - ups += seg->max_coord-seg->min_coord; - else - downs += seg->max_coord-seg->min_coord; - - /* check for links -- if seg->serif is set, then seg->link must */ - /* be ignored */ - is_serif = (FT_Bool)( seg->serif && seg->serif->edge != edge ); - - if ( seg->link || is_serif ) - { - AF_Edge edge2; - AF_Segment seg2; - - - edge2 = edge->link; - seg2 = seg->link; - - if ( is_serif ) - { - seg2 = seg->serif; - edge2 = edge->serif; - } - - if ( edge2 ) - { - FT_Pos edge_delta; - FT_Pos seg_delta; - - - edge_delta = edge->fpos - edge2->fpos; - if ( edge_delta < 0 ) - edge_delta = -edge_delta; - - seg_delta = seg->pos - seg2->pos; - if ( seg_delta < 0 ) - seg_delta = -seg_delta; - - if ( seg_delta < edge_delta ) - edge2 = seg2->edge; - } - else - edge2 = seg2->edge; - - if ( is_serif ) - { - edge->serif = edge2; - edge2->flags |= AF_EDGE_SERIF; - } - else - edge->link = edge2; - } - - seg = seg->edge_next; - - } while ( seg != edge->first ); - - /* set the round/straight flags */ - edge->flags = AF_EDGE_NORMAL; - - if ( is_round > 0 && is_round >= is_straight ) - edge->flags |= AF_EDGE_ROUND; - - /* set the edge's main direction */ - edge->dir = AF_DIR_NONE; - - if ( ups > downs ) - edge->dir = up_dir; - - else if ( ups < downs ) - edge->dir = -up_dir; - - else if ( ups == downs ) - edge->dir = 0; /* both up and down! */ - - /* gets rid of serifs if link is set */ - /* XXX: This gets rid of many unpleasant artefacts! */ - /* Example: the `c' in cour.pfa at size 13 */ - - if ( edge->serif && edge->link ) - edge->serif = 0; - } - } - - - FT_LOCAL_DEF( void ) - af_latin_hints_detect_features( AF_GlyphHints hints, - AF_Dimension dim ) - { - af_latin_hints_compute_segments( hints, dim ); - af_latin_hints_link_segments ( hints, dim ); - af_latin_hints_compute_edges ( hints, dim ); - } - - - FT_LOCAL_DEF( void ) - af_latin_hints_compute_blue_edges( AF_GlyphHints hints, - AF_LatinMetrics metrics ) - { - AF_AxisHints axis = &hints->axis[ AF_DIMENSION_VERT ]; - AF_Edge edge = axis->edges; - AF_Edge edge_limit = edge + axis->num_edges; - AF_LatinAxis latin = &metrics->axis[ AF_DIMENSION_VERT ]; - FT_Fixed scale = latin->scale; - - - /* compute which blue zones are active, i.e. have their scaled */ - /* size < 3/4 pixels */ - - /* for each horizontal edge search the blue zone which is closest */ - for ( ; edge < edge_limit; edge++ ) - { - FT_Int bb; - AF_Width best_blue = NULL; - FT_Pos best_dist; /* initial threshold */ - - - /* compute the initial threshold as a fraction of the EM size */ - best_dist = FT_MulFix( metrics->units_per_em / 40, scale ); - - if ( best_dist > 64 / 2 ) - best_dist = 64 / 2; - - for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ ) - { - AF_LatinBlue blue = latin->blues + bb; - FT_Bool is_top_blue, is_major_dir; - - /* skip inactive blue zones (i.e. those that are too small - */ - if ( !(blue->flags & AF_LATIN_BLUE_ACTIVE) ) - continue; - - /* if it is a top zone, check for right edges -- if it is a bottom */ - /* zone, check for left edges */ - /* */ - /* of course, that's for TrueType */ - is_top_blue = (blue->flags & AF_LATIN_BLUE_TOP) != 0; - is_major_dir = FT_BOOL( edge->dir == axis->major_dir ); - - /* if it is a top zone, the edge must be against the major */ - /* direction; if it is a bottom zone, it must be in the major */ - /* direction */ - if ( is_top_blue ^ is_major_dir ) - { - FT_Pos dist; - - - /* first of all, compare it to the reference position */ - dist = edge->fpos - blue->ref.org; - if ( dist < 0 ) - dist = -dist; - - dist = FT_MulFix( dist, scale ); - if ( dist < best_dist ) - { - best_dist = dist; - best_blue = & blue->ref; - } - - /* now, compare it to the overshoot position if the edge is */ - /* rounded, and if the edge is over the reference position of a */ - /* top zone, or under the reference position of a bottom zone */ - if ( edge->flags & AF_EDGE_ROUND && dist != 0 ) - { - FT_Bool is_under_ref = FT_BOOL( edge->fpos < blue->ref.org ); - - - if ( is_top_blue ^ is_under_ref ) - { - blue = latin->blues + bb; - dist = edge->fpos - blue->shoot.org; - if ( dist < 0 ) - dist = -dist; - - dist = FT_MulFix( dist, scale ); - if ( dist < best_dist ) - { - best_dist = dist; - best_blue = & blue->shoot; - } - } - } - } - } - - if ( best_blue ) - edge->blue_edge = best_blue; - } - } - - - static FT_Error - af_latin_hints_init( AF_GlyphHints hints, - FT_Outline* outline, - AF_LatinMetrics metrics ) - { - FT_Error error; - FT_Render_Mode mode; - - error = af_glyph_hints_reset( hints, &metrics->scaler, outline ); - if (error) - goto Exit; - - - /* compute flags depending on render mode, etc... - */ - - mode = metrics->scaler.render_mode; - - /* we snap the width of vertical stems for the monochrome and - * horizontal LCD rendering targets only. - */ - if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD ) - hints->other_flags |= AF_LATIN_HINTS_HORZ_SNAP; - - /* we snap the width of horizontal stems for the monochrome and - * vertical LCD rendering targets only. - */ - if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V ) - hints->other_flags |= AF_LATIN_HINTS_VERT_SNAP; - - /* XXX - */ - if ( mode != FT_RENDER_MODE_LIGHT ) - hints->other_flags |= AF_LATIN_HINTS_STEM_ADJUST; - - if ( mode == FT_RENDER_MODE_MONO ) - hints->other_flags |= AF_LATIN_HINTS_MONO; - - /* analyze glyph outline - */ - if ( AF_HINTS_DO_HORIZONTAL(hints) ) - af_latin_hints_detect_features( hints, AF_DIMENSION_HORZ ); - - if ( AF_HINTS_DO_VERTICAL(hints) ) - { - af_latin_hints_detect_features( hints, AF_DIMENSION_VERT ); - af_latin_hints_compute_blue_edges( hints, metrics ); - } - - Exit: - return error; - } - - /***************************************************************************/ - /***************************************************************************/ - /***** *****/ - /***** L A T I N G L Y P H G R I D - F I T T I N G *****/ - /***** *****/ - /***************************************************************************/ - /***************************************************************************/ - - /* snap a given width in scaled coordinates to one of the */ - /* current standard widths */ - static FT_Pos - af_latin_snap_width( AF_Width widths, - FT_Int count, - FT_Pos width ) - { - int n; - FT_Pos best = 64 + 32 + 2; - FT_Pos reference = width; - FT_Pos scaled; - - - for ( n = 0; n < count; n++ ) - { - FT_Pos w; - FT_Pos dist; - - - w = widths[n].cur; - dist = width - w; - if ( dist < 0 ) - dist = -dist; - if ( dist < best ) - { - best = dist; - reference = w; - } - } - - scaled = FT_PIX_ROUND( reference ); - - if ( width >= reference ) - { - if ( width < scaled + 48 ) - width = reference; - } - else - { - if ( width > scaled - 48 ) - width = reference; - } - - return width; - } - - - /* compute the snapped width of a given stem */ - - static FT_Pos - af_latin_compute_stem_width( AF_GlyphHints hints, - AF_Dimension dim, - FT_Pos width, - AF_Edge_Flags base_flags, - AF_Edge_Flags stem_flags ) - { - AF_LatinMetrics metrics = (AF_LatinMetrics) hints->metrics; - AF_LatinAxis axis = & metrics->axis[ dim ]; - FT_Pos dist = width; - FT_Int sign = 0; - FT_Int vertical = AF_HINTS_DO_VERTICAL( hints ); - - - if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ) - return width; - - if ( dist < 0 ) - { - dist = -width; - sign = 1; - } - - if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) || - ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) - { - /* smooth hinting process: very lightly quantize the stem width */ - /* */ - - /* leave the widths of serifs alone */ - - if ( ( stem_flags & AF_EDGE_SERIF ) && vertical && ( dist < 3 * 64 ) ) - goto Done_Width; - - else if ( ( base_flags & AF_EDGE_ROUND ) ) - { - if ( dist < 80 ) - dist = 64; - } - else if ( dist < 56 ) - dist = 56; - - if ( axis->width_count > 0 ) - { - FT_Pos delta; - - /* compare to standard width - */ - if ( axis->width_count > 0 ) - { - delta = dist - axis->widths[0].cur; - - if ( delta < 0 ) - delta = -delta; - - if ( delta < 40 ) - { - dist = axis->widths[ 0 ].cur; - if ( dist < 48 ) - dist = 48; - - goto Done_Width; - } - } - - if ( dist < 3 * 64 ) - { - delta = dist & 63; - dist &= -64; - - if ( delta < 10 ) - dist += delta; - - else if ( delta < 32 ) - dist += 10; - - else if ( delta < 54 ) - dist += 54; - - else - dist += delta; - } - else - dist = ( dist + 32 ) & ~63; - } - } - else - { - /* strong hinting process: snap the stem width to integer pixels */ - /* */ - dist = af_latin_snap_width( axis->widths, axis->width_count, dist ); - - if ( vertical ) - { - /* in the case of vertical hinting, always round */ - /* the stem heights to integer pixels */ - if ( dist >= 64 ) - dist = ( dist + 16 ) & ~63; - else - dist = 64; - } - else - { - if ( AF_LATIN_HINTS_DO_MONO( hints ) ) - { - /* monochrome horizontal hinting: snap widths to integer pixels */ - /* with a different threshold */ - if ( dist < 64 ) - dist = 64; - else - dist = ( dist + 32 ) & ~63; - } - else - { - /* for horizontal anti-aliased hinting, we adopt a more subtle */ - /* approach: we strengthen small stems, round stems whose size */ - /* is between 1 and 2 pixels to an integer, otherwise nothing */ - if ( dist < 48 ) - dist = ( dist + 64 ) >> 1; - - else if ( dist < 128 ) - dist = ( dist + 22 ) & ~63; - else - /* round otherwise to prevent color fringes in LCD mode */ - dist = ( dist + 32 ) & ~63; - } - } - } - - Done_Width: - if ( sign ) - dist = -dist; - - return dist; - } - - - - /* align one stem edge relative to the previous stem edge */ - static void - af_latin_align_linked_edge( AF_GlyphHints hints, - AF_Dimension dim, - AF_Edge base_edge, - AF_Edge stem_edge ) - { - FT_Pos dist = stem_edge->opos - base_edge->opos; - - FT_Pos fitted_width = af_latin_compute_stem_width( hints, - dim, - dist, - base_edge->flags, - stem_edge->flags ); - - stem_edge->pos = base_edge->pos + fitted_width; - } - - - static void - af_latin_align_serif_edge( AF_GlyphHints hints, - AF_Edge base, - AF_Edge serif ) - { - FT_UNUSED( hints ); - - serif->pos = base->pos + (serif->opos - base->opos); - } - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** E D G E H I N T I N G ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - FT_LOCAL_DEF( void ) - af_latin_hint_edges( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = & hints->axis[dim]; - AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; - FT_Int n_edges; - AF_Edge edge; - AF_Edge anchor = 0; - FT_Int has_serifs = 0; - - - /* we begin by aligning all stems relative to the blue zone */ - /* if needed -- that's only for horizontal edges */ - if ( dim == AF_DIMENSION_VERT ) - { - for ( edge = edges; edge < edge_limit; edge++ ) - { - AF_Width blue; - AF_Edge edge1, edge2; - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - blue = edge->blue_edge; - edge1 = NULL; - edge2 = edge->link; - - if ( blue ) - { - edge1 = edge; - } - else if ( edge2 && edge2->blue_edge ) - { - blue = edge2->blue_edge; - edge1 = edge2; - edge2 = edge; - } - - if ( !edge1 ) - continue; - - edge1->pos = blue->fit; - edge1->flags |= AF_EDGE_DONE; - - if ( edge2 && !edge2->blue_edge ) - { - af_latin_align_linked_edge( hints, dim, edge1, edge2 ); - edge2->flags |= AF_EDGE_DONE; - } - - if ( !anchor ) - anchor = edge; - } - } - - /* now we will align all stem edges, trying to maintain the */ - /* relative order of stems in the glyph */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - AF_Edge edge2; - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - /* skip all non-stem edges */ - edge2 = edge->link; - if ( !edge2 ) - { - has_serifs++; - continue; - } - - /* now align the stem */ - - /* this should not happen, but it's better to be safe */ - if ( edge2->blue_edge || edge2 < edge ) - { - af_latin_align_linked_edge( hints, dim, edge2, edge ); - edge->flags |= AF_EDGE_DONE; - continue; - } - - if ( !anchor ) - { - FT_Pos org_len, org_center, cur_len; - FT_Pos cur_pos1, error1, error2, u_off, d_off; - - - org_len = edge2->opos - edge->opos; - cur_len = af_latin_compute_stem_width( hints, dim, org_len, - edge->flags, edge2->flags ); - if ( cur_len <= 64 ) - u_off = d_off = 32; - else - { - u_off = 38; - d_off = 26; - } - - if ( cur_len < 96 ) - { - org_center = edge->opos + ( org_len >> 1 ); - - cur_pos1 = FT_PIX_ROUND( org_center ); - - error1 = org_center - ( cur_pos1 - u_off ); - if ( error1 < 0 ) - error1 = -error1; - - error2 = org_center - ( cur_pos1 + d_off ); - if ( error2 < 0 ) - error2 = -error2; - - if ( error1 < error2 ) - cur_pos1 -= u_off; - else - cur_pos1 += d_off; - - edge->pos = cur_pos1 - cur_len / 2; - edge2->pos = cur_pos1 + cur_len / 2; - - } - else - edge->pos = FT_PIX_ROUND( edge->opos ); - - anchor = edge; - - edge->flags |= AF_EDGE_DONE; - - af_latin_align_linked_edge( hints, dim, edge, edge2 ); - } - else - { - FT_Pos org_pos, org_len, org_center, cur_len; - FT_Pos cur_pos1, cur_pos2, delta1, delta2; - - - org_pos = anchor->pos + ( edge->opos - anchor->opos ); - org_len = edge2->opos - edge->opos; - org_center = org_pos + ( org_len >> 1 ); - - cur_len = af_latin_compute_stem_width( hints, dim, org_len, - edge->flags, edge2->flags ); - - if ( cur_len < 96 ) - { - FT_Pos u_off, d_off; - - - cur_pos1 = FT_PIX_ROUND( org_center ); - - if (cur_len <= 64 ) - u_off = d_off = 32; - else - { - u_off = 38; - d_off = 26; - } - - delta1 = org_center - ( cur_pos1 - u_off ); - if ( delta1 < 0 ) - delta1 = -delta1; - - delta2 = org_center - ( cur_pos1 + d_off ); - if ( delta2 < 0 ) - delta2 = -delta2; - - if ( delta1 < delta2 ) - cur_pos1 -= u_off; - else - cur_pos1 += d_off; - - edge->pos = cur_pos1 - cur_len / 2; - edge2->pos = cur_pos1 + cur_len / 2; - } - else - { - org_pos = anchor->pos + ( edge->opos - anchor->opos ); - org_len = edge2->opos - edge->opos; - org_center = org_pos + ( org_len >> 1 ); - - cur_len = af_latin_compute_stem_width( hints, dim, org_len, - edge->flags, edge2->flags ); - - cur_pos1 = FT_PIX_ROUND( org_pos ); - delta1 = ( cur_pos1 + ( cur_len >> 1 ) - org_center ); - if ( delta1 < 0 ) - delta1 = -delta1; - - cur_pos2 = FT_PIX_ROUND( org_pos + org_len ) - cur_len; - delta2 = ( cur_pos2 + ( cur_len >> 1 ) - org_center ); - if ( delta2 < 0 ) - delta2 = -delta2; - - edge->pos = ( delta1 < delta2 ) ? cur_pos1 : cur_pos2; - edge2->pos = edge->pos + cur_len; - } - - edge->flags |= AF_EDGE_DONE; - edge2->flags |= AF_EDGE_DONE; - - if ( edge > edges && edge->pos < edge[-1].pos ) - edge->pos = edge[-1].pos; - } - } - - /* make sure that lowercase m's maintain their symmetry */ - - /* In general, lowercase m's have six vertical edges if they are sans */ - /* serif, or twelve if they are avec serif. This implementation is */ - /* based on that assumption, and seems to work very well with most */ - /* faces. However, if for a certain face this assumption is not */ - /* true, the m is just rendered like before. In addition, any stem */ - /* correction will only be applied to symmetrical glyphs (even if the */ - /* glyph is not an m), so the potential for unwanted distortion is */ - /* relatively low. */ - - /* We don't handle horizontal edges since we can't easily assure that */ - /* the third (lowest) stem aligns with the base line; it might end up */ - /* one pixel higher or lower. */ - - n_edges = edge_limit - edges; - if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) ) - { - AF_Edge edge1, edge2, edge3; - FT_Pos dist1, dist2, span, delta; - - - if ( n_edges == 6 ) - { - edge1 = edges; - edge2 = edges + 2; - edge3 = edges + 4; - } - else - { - edge1 = edges + 1; - edge2 = edges + 5; - edge3 = edges + 9; - } - - dist1 = edge2->opos - edge1->opos; - dist2 = edge3->opos - edge2->opos; - - span = dist1 - dist2; - if ( span < 0 ) - span = -span; - - if ( span < 8 ) - { - delta = edge3->pos - ( 2 * edge2->pos - edge1->pos ); - edge3->pos -= delta; - if ( edge3->link ) - edge3->link->pos -= delta; - - /* move the serifs along with the stem */ - if ( n_edges == 12 ) - { - ( edges + 8 )->pos -= delta; - ( edges + 11 )->pos -= delta; - } - - edge3->flags |= AF_EDGE_DONE; - if ( edge3->link ) - edge3->link->flags |= AF_EDGE_DONE; - } - } - - if ( has_serifs || !anchor ) - { - /* now hint the remaining edges (serifs and single) in order - * to complete our processing - */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - if ( edge->flags & AF_EDGE_DONE ) - continue; - - if ( edge->serif ) - af_latin_align_serif_edge( hints, edge->serif, edge ); - else if ( !anchor ) - { - edge->pos = FT_PIX_ROUND( edge->opos ); - anchor = edge; - } - else - edge->pos = anchor->pos + - FT_PIX_ROUND( edge->opos - anchor->opos ); - - edge->flags |= AF_EDGE_DONE; - - if ( edge > edges && edge->pos < edge[-1].pos ) - edge->pos = edge[-1].pos; - - if ( edge + 1 < edge_limit && - edge[1].flags & AF_EDGE_DONE && - edge->pos > edge[1].pos ) - edge->pos = edge[1].pos; - } - } - } - - - static FT_Error - af_latin_hints_apply( AF_GlyphHints hints, - AF_LatinMetrics metrics ) - { - AF_Dimension dim; - - FT_UNUSED( metrics ); - - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { - if ( (dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL(hints)) || - (dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL(hints)) ) - { - af_latin_hint_edges( hints, dim ); - af_glyph_hints_align_edge_points( hints, dim ); - af_glyph_hints_align_strong_points( hints, dim ); - af_glyph_hints_align_weak_points( hints, dim ); - } - } - return 0; - } - - /***************************************************************************/ - /***************************************************************************/ - /***** *****/ - /***** L A T I N S C R I P T C L A S S *****/ - /***** *****/ - /***************************************************************************/ - /***************************************************************************/ - - static const AF_Script_UniRangeRec af_latin_uniranges[] = - { - { 32, 127 }, /* XXX: TODO: Add new Unicode ranges here !! */ - { 160, 255 }, - { 0, 0 } - }; - - FT_LOCAL_DEF( const AF_ScriptClassRec ) af_latin_script_class = - { - AF_SCRIPT_LATIN, - af_latin_uniranges, - - sizeof( AF_LatinMetricsRec ), - (AF_Script_InitMetricsFunc) af_latin_metrics_init, - (AF_Script_ScaleMetricsFunc) af_latin_metrics_scale, - (AF_Script_DoneMetricsFunc) NULL, - - (AF_Script_InitHintsFunc) af_latin_hints_init, - (AF_Script_ApplyHintsFunc) af_latin_hints_apply - }; - diff --git a/reactos/lib/freetype/src/autofit/aflatin.h b/reactos/lib/freetype/src/autofit/aflatin.h deleted file mode 100644 index da51cad69c8..00000000000 --- a/reactos/lib/freetype/src/autofit/aflatin.h +++ /dev/null @@ -1,169 +0,0 @@ -#ifndef __AFLATIN_H__ -#define __AFLATIN_H__ - -#include "afhints.h" - -FT_BEGIN_HEADER - - /* - * the latin-specific script class - * - */ - FT_LOCAL( const AF_ScriptClassRec ) af_latin_script_class; - - /***************************************************************************/ - /***************************************************************************/ - /***** *****/ - /***** L A T I N G L O B A L M E T R I C S *****/ - /***** *****/ - /***************************************************************************/ - /***************************************************************************/ - - /* - * the following declarations could be embedded in the file "aflatin.c" - * they've been made semi-public to allow alternate script hinters to - * re-use some of them - */ - - /* - * Latin (global) metrics management - * - */ - - enum - { - AF_LATIN_BLUE_CAPITAL_TOP, - AF_LATIN_BLUE_CAPITAL_BOTTOM, - AF_LATIN_BLUE_SMALL_F_TOP, - AF_LATIN_BLUE_SMALL_TOP, - AF_LATIN_BLUE_SMALL_BOTTOM, - AF_LATIN_BLUE_SMALL_MINOR, - - AF_LATIN_BLUE_MAX - }; - -#define AF_LATIN_IS_TOP_BLUE( b ) ( (b) == AF_LATIN_BLUE_CAPITAL_TOP || \ - (b) == AF_LATIN_BLUE_SMALL_F_TOP || \ - (b) == AF_LATIN_BLUE_SMALL_TOP ) - -#define AF_LATIN_MAX_WIDTHS 16 -#define AF_LATIN_MAX_BLUES AF_LATIN_BLUE_MAX - - enum - { - AF_LATIN_BLUE_ACTIVE = (1 << 0), - AF_LATIN_BLUE_TOP = (1 << 1), - - AF_LATIN_BLUE_FLAG_MAX - }; - - - typedef struct AF_LatinBlueRec_ - { - AF_WidthRec ref; - AF_WidthRec shoot; - FT_UInt flags; - - } AF_LatinBlueRec, *AF_LatinBlue; - - - typedef struct AF_LatinAxisRec_ - { - FT_Fixed scale; - FT_Pos delta; - - FT_UInt width_count; - AF_WidthRec widths[ AF_LATIN_MAX_WIDTHS ]; - FT_Pos edge_distance_threshold; - - /* ignored for horizontal metrics */ - FT_Bool control_overshoot; - FT_UInt blue_count; - AF_LatinBlueRec blues[ AF_LATIN_BLUE_MAX ]; - - FT_Fixed org_scale; - FT_Pos org_delta; - - } AF_LatinAxisRec, *AF_LatinAxis; - - - typedef struct AF_LatinMetricsRec_ - { - AF_ScriptMetricsRec root; - FT_UInt units_per_em; - AF_LatinAxisRec axis[ AF_DIMENSION_MAX ]; - AF_ScalerRec scaler; - - } AF_LatinMetricsRec, *AF_LatinMetrics; - - - - FT_LOCAL( FT_Error ) - af_latin_metrics_init( AF_LatinMetrics metrics, - FT_Face face ); - - FT_LOCAL( void ) - af_latin_metrics_scale( AF_LatinMetrics metrics, - AF_Scaler scaler ); - - - - /***************************************************************************/ - /***************************************************************************/ - /***** *****/ - /***** L A T I N G L Y P H A N A L Y S I S *****/ - /***** *****/ - /***************************************************************************/ - /***************************************************************************/ - - enum - { - AF_LATIN_HINTS_HORZ_SNAP = (1 << 0), /* enable stem width snapping */ - AF_LATIN_HINTS_VERT_SNAP = (1 << 1), /* enable stem height snapping */ - AF_LATIN_HINTS_STEM_ADJUST = (1 << 2), /* enable stem width/height adjustment */ - AF_LATIN_HINTS_MONO = (1 << 3) /* indicate monochrome rendering */ - }; - -#define AF_LATIN_HINTS_DO_HORZ_SNAP(h) \ - AF_HINTS_TEST_OTHER(h,AF_LATIN_HINTS_HORZ_SNAP) - -#define AF_LATIN_HINTS_DO_VERT_SNAP(h) \ - AF_HINTS_TEST_OTHER(h,AF_LATIN_HINTS_VERT_SNAP) - -#define AF_LATIN_HINTS_DO_STEM_ADJUST(h) \ - AF_HINTS_TEST_OTHER(h,AF_LATIN_HINTS_STEM_ADJUST) - -#define AF_LATIN_HINTS_DO_MONO(h) \ - AF_HINTS_TEST_OTHER(h,AF_LATIN_HINTS_MONO) - - - /* this shouldn't normally be exported. However, other scripts might - * like to use this function as-is - */ - FT_LOCAL( void ) - af_latin_hints_compute_segments( AF_GlyphHints hints, - AF_Dimension dim ); - - /* this shouldn't normally be exported. However, other scripts might - * want to use this function as-is - */ - FT_LOCAL( void ) - af_latin_hints_link_segments( AF_GlyphHints hints, - AF_Dimension dim ); - - /* this shouldn't normally be exported. However, other scripts might - * want to use this function as-is - */ - FT_LOCAL( void ) - af_latin_hints_compute_edges( AF_GlyphHints hints, - AF_Dimension dim ); - - FT_LOCAL( void ) - af_latin_hints_detect_features( AF_GlyphHints hints, - AF_Dimension dim ); - -/* */ - -FT_END_HEADER - -#endif /* __AFLATIN_H__ */ diff --git a/reactos/lib/freetype/src/autofit/afloader.c b/reactos/lib/freetype/src/autofit/afloader.c deleted file mode 100644 index f51a6cf2ba0..00000000000 --- a/reactos/lib/freetype/src/autofit/afloader.c +++ /dev/null @@ -1,431 +0,0 @@ -#include "afloader.h" -#include "afhints.h" -#include "afglobal.h" -#include "aflatin.h" - - FT_LOCAL_DEF( FT_Error ) - af_loader_init( AF_Loader loader, - FT_Memory memory ) - { - FT_Error error; - - FT_ZERO( loader ); - - af_glyph_hints_init( &loader->hints, memory ); - - error = FT_GlyphLoader_New( memory, &loader->gloader ); - if ( !error ) - { - error = FT_GlyphLoader_CreateExtra( loader->gloader ); - if ( error ) - { - FT_GlyphLoader_Done( loader->gloader ); - loader->gloader = NULL; - } - } - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - af_loader_reset( AF_Loader loader, - FT_Face face ) - { - FT_Error error = 0; - - loader->face = face; - loader->gloader = face->glyph->internal->loader; - loader->globals = (AF_FaceGlobals) face->autohint.data; - - if ( loader->globals == NULL ) - { - error = af_face_globals_new( face, &loader->globals ); - if ( !error ) - { - face->autohint.data = (FT_Pointer) loader->globals; - face->autohint.finalizer = (FT_Generic_Finalizer) af_face_globals_free; - } - } - return error; - } - - - FT_LOCAL_DEF( void ) - af_loader_done( AF_Loader loader ) - { - loader->face = NULL; - loader->globals = NULL; - - FT_GlyphLoader_Done( loader->gloader ); - loader->gloader = NULL; - } - - - static FT_Error - af_loader_load_g( AF_Loader loader, - AF_Scaler scaler, - FT_UInt glyph_index, - FT_Int32 load_flags, - FT_UInt depth ) - { - FT_Error error = 0; - FT_Face face = loader->face; - AF_FaceGlobals globals = loader->globals; - FT_GlyphLoader gloader = loader->gloader; - AF_ScriptMetrics metrics = loader->metrics; - AF_GlyphHints hints = &loader->hints; - FT_GlyphSlot slot = face->glyph; - FT_Slot_Internal internal = slot->internal; - - error = FT_Load_Glyph( face, glyph_index, load_flags ); - if ( error ) - goto Exit; - - loader->transformed = internal->glyph_transformed; - if ( loader->transformed ) - { - FT_Matrix inverse; - - loader->trans_matrix = internal->glyph_matrix; - loader->trans_delta = internal->glyph_delta; - - inverse = loader->trans_matrix; - FT_Matrix_Invert( &inverse ); - FT_Vector_Transform( &loader->trans_delta, &inverse ); - } - - /* set linear metrics */ - slot->linearHoriAdvance = slot->metrics.horiAdvance; - slot->linearVertAdvance = slot->metrics.vertAdvance; - - switch ( slot->format ) - { - case FT_GLYPH_FORMAT_OUTLINE: - /* translate the loaded glyph when an internal transform - * is needed - */ - if ( loader->transformed ) - { - FT_Vector* point = slot->outline.points; - FT_Vector* limit = point + slot->outline.n_points; - - for ( ; point < limit; point++ ) - { - point->x += loader->trans_delta.x; - point->y += loader->trans_delta.y; - } - } - - /* copy the outline points in the loader's current */ - /* extra points which is used to keep original glyph coordinates */ - error = FT_GlyphLoader_CheckPoints( gloader, - slot->outline.n_points + 2, - slot->outline.n_contours ); - if ( error ) - goto Exit; - - FT_ARRAY_COPY( gloader->current.extra_points, - slot->outline.points, - slot->outline.n_points ); - - FT_ARRAY_COPY( gloader->current.outline.contours, - slot->outline.contours, - slot->outline.n_contours ); - - FT_ARRAY_COPY( gloader->current.outline.tags, - slot->outline.tags, - slot->outline.n_points ); - - gloader->current.outline.n_points = slot->outline.n_points; - gloader->current.outline.n_contours = slot->outline.n_contours; - - /* compute original phantom points */ - loader->pp1.x = hints->x_delta; - loader->pp1.y = hints->y_delta; - loader->pp2.x = FT_MulFix( slot->metrics.horiAdvance, - hints->x_scale ) + hints->x_delta; - loader->pp2.y = hints->y_delta; - - /* be sure to check for spacing glyphs */ - if ( slot->outline.n_points == 0 ) - goto Hint_Metrics; - - /* now load the slot image into the auto-outline and run the */ - /* automatic hinting process */ - error = metrics->clazz->script_hints_init( hints, - &gloader->current.outline, - metrics ); - if ( error ) - goto Exit; - - /* apply the hints */ - metrics->clazz->script_hints_apply( hints, - &gloader->current.outline, - metrics ); - /* we now need to hint the metrics according to the change in */ - /* width/positioning that occured during the hinting process */ - { - FT_Pos old_advance, old_rsb, old_lsb, new_lsb; - AF_AxisHints axis = &hints->axis[ AF_DIMENSION_HORZ ]; - AF_Edge edge1 = axis->edges; /* leftmost edge */ - AF_Edge edge2 = edge1 + axis->num_edges - 1; /* rightmost edge */ - - - old_advance = loader->pp2.x; - old_rsb = old_advance - edge2->opos; - old_lsb = edge1->opos; - new_lsb = edge1->pos; - - loader->pp1.x = FT_PIX_ROUND( new_lsb - old_lsb ); - loader->pp2.x = FT_PIX_ROUND( edge2->pos + old_rsb ); - -#if 0 - /* try to fix certain bad advance computations */ - if ( loader->pp2.x + loader->pp1.x == edge2->pos && old_rsb > 4 ) - loader->pp2.x += 64; -#endif - } - - /* good, we simply add the glyph to our loader's base */ - FT_GlyphLoader_Add( gloader ); - break; - - case FT_GLYPH_FORMAT_COMPOSITE: - { - FT_UInt nn, num_subglyphs = slot->num_subglyphs; - FT_UInt num_base_subgs, start_point; - FT_SubGlyph subglyph; - - - start_point = gloader->base.outline.n_points; - - /* first of all, copy the subglyph descriptors in the glyph loader */ - error = FT_GlyphLoader_CheckSubGlyphs( gloader, num_subglyphs ); - if ( error ) - goto Exit; - - FT_ARRAY_COPY( gloader->current.subglyphs, - slot->subglyphs, - num_subglyphs ); - - gloader->current.num_subglyphs = num_subglyphs; - num_base_subgs = gloader->base.num_subglyphs; - - /* now, read each subglyph independently */ - for ( nn = 0; nn < num_subglyphs; nn++ ) - { - FT_Vector pp1, pp2; - FT_Pos x, y; - FT_UInt num_points, num_new_points, num_base_points; - - - /* gloader.current.subglyphs can change during glyph loading due */ - /* to re-allocation -- we must recompute the current subglyph on */ - /* each iteration */ - subglyph = gloader->base.subglyphs + num_base_subgs + nn; - - pp1 = loader->pp1; - pp2 = loader->pp2; - - num_base_points = gloader->base.outline.n_points; - - error = af_loader_load_g( loader, scaler, subglyph->index, - load_flags, depth + 1 ); - if ( error ) - goto Exit; - - /* recompute subglyph pointer */ - subglyph = gloader->base.subglyphs + num_base_subgs + nn; - - if ( subglyph->flags & FT_SUBGLYPH_FLAG_USE_MY_METRICS ) - { - pp1 = loader->pp1; - pp2 = loader->pp2; - } - else - { - loader->pp1 = pp1; - loader->pp2 = pp2; - } - - num_points = gloader->base.outline.n_points; - num_new_points = num_points - num_base_points; - - /* now perform the transform required for this subglyph */ - - if ( subglyph->flags & ( FT_SUBGLYPH_FLAG_SCALE | - FT_SUBGLYPH_FLAG_XY_SCALE | - FT_SUBGLYPH_FLAG_2X2 ) ) - { - FT_Vector* cur = gloader->base.outline.points + - num_base_points; - FT_Vector* org = gloader->base.extra_points + - num_base_points; - FT_Vector* limit = cur + num_new_points; - - - for ( ; cur < limit; cur++, org++ ) - { - FT_Vector_Transform( cur, &subglyph->transform ); - FT_Vector_Transform( org, &subglyph->transform ); - } - } - - /* apply offset */ - - if ( !( subglyph->flags & FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES ) ) - { - FT_Int k = subglyph->arg1; - FT_UInt l = subglyph->arg2; - FT_Vector* p1; - FT_Vector* p2; - - - if ( start_point + k >= num_base_points || - l >= (FT_UInt)num_new_points ) - { - error = FT_Err_Invalid_Composite; - goto Exit; - } - - l += num_base_points; - - /* for now, only use the current point coordinates; */ - /* we may consider another approach in the near future */ - p1 = gloader->base.outline.points + start_point + k; - p2 = gloader->base.outline.points + start_point + l; - - x = p1->x - p2->x; - y = p1->y - p2->y; - } - else - { - x = FT_MulFix( subglyph->arg1, hints->x_scale ) + hints->x_delta; - y = FT_MulFix( subglyph->arg2, hints->y_scale ) + hints->y_delta; - - x = FT_PIX_ROUND(x); - y = FT_PIX_ROUND(y); - } - - { - FT_Outline dummy = gloader->base.outline; - - - dummy.points += num_base_points; - dummy.n_points = (short)num_new_points; - - FT_Outline_Translate( &dummy, x, y ); - } - } - } - break; - - default: - /* we don't support other formats (yet?) */ - error = FT_Err_Unimplemented_Feature; - } - - Hint_Metrics: - if ( depth == 0 ) - { - FT_BBox bbox; - - - /* transform the hinted outline if needed */ - if ( loader->transformed ) - FT_Outline_Transform( &gloader->base.outline, &loader->trans_matrix ); - - /* we must translate our final outline by -pp1.x and compute */ - /* the new metrics */ - if ( loader->pp1.x ) - FT_Outline_Translate( &gloader->base.outline, -loader->pp1.x, 0 ); - - FT_Outline_Get_CBox( &gloader->base.outline, &bbox ); - - bbox.xMin = FT_PIX_FLOOR( bbox.xMin ); - bbox.yMin = FT_PIX_FLOOR( bbox.yMin ); - bbox.xMax = FT_PIX_CEIL( bbox.xMax ); - bbox.yMax = FT_PIX_CEIL( bbox.yMax ); - - slot->metrics.width = bbox.xMax - bbox.xMin; - slot->metrics.height = bbox.yMax - bbox.yMin; - slot->metrics.horiBearingX = bbox.xMin; - slot->metrics.horiBearingY = bbox.yMax; - - /* for mono-width fonts (like Andale, Courier, etc.) we need */ - /* to keep the original rounded advance width */ -#if 0 - if ( !FT_IS_FIXED_WIDTH( slot->face ) ) - slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; - else - slot->metrics.horiAdvance = FT_MulFix( slot->metrics.horiAdvance, - x_scale ); -#else - slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; -#endif - - slot->metrics.horiAdvance = FT_PIX_ROUND( slot->metrics.horiAdvance ); - - /* now copy outline into glyph slot */ - FT_GlyphLoader_Rewind( loader->gloader ); - error = FT_GlyphLoader_CopyPoints( loader->gloader, gloader ); - if ( error ) - goto Exit; - - slot->outline = slot->internal->loader->base.outline; - slot->format = FT_GLYPH_FORMAT_OUTLINE; - } - -#ifdef DEBUG_HINTER - af_debug_hinter = hinter; -#endif - - Exit: - return error; - } - - - - - FT_LOCAL_DEF( FT_Error ) - af_loader_load_glyph( AF_Loader loader, - FT_Face face, - FT_UInt gindex, - FT_UInt32 load_flags ) - { - FT_Error error; - FT_Size size = face->size; - AF_ScalerRec scaler; - - if ( !size ) - return FT_Err_Invalid_Argument; - - FT_ZERO( &scaler ); - - scaler.face = face; - scaler.x_scale = size->metrics.x_scale; - scaler.x_delta = 0; /* XXX: TODO: add support for sub-pixel hinting */ - scaler.y_scale = size->metrics.y_scale; - scaler.y_delta = 0; /* XXX: TODO: add support for sub-pixel hinting */ - - scaler.render_mode = FT_LOAD_TARGET_MODE( load_flags ); - scaler.flags = 0; /* XXX: fix this */ - - error = af_loader_reset( loader, face ); - if ( !error ) - { - AF_ScriptMetrics metrics; - - error = af_face_globals_get_metrics( loader->globals, gindex, &metrics ); - if ( !error ) - { - metrics->clazz->script_metrics_scale( metrics, &scaler ); - - load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_IGNORE_TRANSFORM; - load_flags &= ~FT_LOAD_RENDER; - - error = af_loader_load_g( loader, &scaler, gindex, load_flags, 0 ); - } - } - return error; - } diff --git a/reactos/lib/freetype/src/autofit/afloader.h b/reactos/lib/freetype/src/autofit/afloader.h deleted file mode 100644 index b4a8417cddc..00000000000 --- a/reactos/lib/freetype/src/autofit/afloader.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef __AF_LOADER_H__ -#define __AF_LOADER_H__ - -#include "afhints.h" -#include "afglobal.h" - -FT_BEGIN_HEADER - - typedef struct AF_LoaderRec_ - { - FT_Face face; /* current face */ - AF_FaceGlobals globals; /* current face globals */ - FT_GlyphLoader gloader; /* glyph loader */ - AF_GlyphHintsRec hints; - AF_ScriptMetrics metrics; - FT_Bool transformed; - FT_Matrix trans_matrix; - FT_Vector trans_delta; - FT_Vector pp1; - FT_Vector pp2; - - } AF_LoaderRec, *AF_Loader; - - - FT_LOCAL( FT_Error ) - af_loader_init( AF_Loader loader, - FT_Memory memory ); - - - FT_LOCAL( FT_Error ) - af_loader_reset( AF_Loader loader, - FT_Face face ); - - - FT_LOCAL( void ) - af_loader_done( AF_Loader loader ); - - - FT_LOCAL( FT_Error ) - af_loader_load_glyph( AF_Loader loader, - FT_Face face, - FT_UInt gindex, - FT_UInt32 load_flags ); - -/* */ - -FT_END_HEADER - -#endif /* __AF_LOADER_H__ */ diff --git a/reactos/lib/freetype/src/autofit/afmodule.c b/reactos/lib/freetype/src/autofit/afmodule.c deleted file mode 100644 index d088c24ae55..00000000000 --- a/reactos/lib/freetype/src/autofit/afmodule.c +++ /dev/null @@ -1,68 +0,0 @@ -#include "afmodule.h" -#include "afloader.h" -#include FT_INTERNAL_OBJECTS_H - - typedef struct FT_AutofitterRec_ - { - FT_ModuleRec root; - AF_LoaderRec loader[1]; - - } FT_AutofitterRec, *FT_Autofitter; - - - FT_CALLBACK_DEF( FT_Error ) - af_autofitter_init( FT_Autofitter module ) - { - return af_loader_init( module->loader, module->root.library->memory ); - } - - - FT_CALLBACK_DEF( void ) - af_autofitter_done( FT_Autofitter module ) - { - af_loader_done( module->loader ); - } - - - FT_CALLBACK_DEF( FT_Error ) - af_autofitter_load_glyph( FT_Autofitter module, - FT_GlyphSlot slot, - FT_Size size, - FT_UInt glyph_index, - FT_Int32 load_flags ) - { - return af_loader_load_glyph( module->loader, slot->face, - glyph_index, load_flags ); - } - - - - FT_CALLBACK_TABLE_DEF - const FT_AutoHinter_ServiceRec af_autofitter_service = - { - NULL, - NULL, - NULL, - (FT_AutoHinter_GlyphLoadFunc) af_autofitter_load_glyph - }; - - - FT_CALLBACK_TABLE_DEF - const FT_Module_Class autofit_module_class = - { - FT_MODULE_HINTER, - sizeof ( FT_AutofitterRec ), - - "autofitter", - 0x10000L, /* version 1.0 of the autofitter */ - 0x20000L, /* requires FreeType 2.0 or above */ - - (const void*) &af_autofitter_service, - - (FT_Module_Constructor) af_autofitter_init, - (FT_Module_Destructor) af_autofitter_done, - (FT_Module_Requester) 0 - }; - - -/* END */ diff --git a/reactos/lib/freetype/src/autofit/afmodule.h b/reactos/lib/freetype/src/autofit/afmodule.h deleted file mode 100644 index b898cb375fd..00000000000 --- a/reactos/lib/freetype/src/autofit/afmodule.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef __AFMODULE_H__ -#define __AFMODULE_H__ - -#include <ft2build.h> -#include FT_MODULE_H - - -FT_BEGIN_HEADER - - FT_CALLBACK_TABLE - const FT_Module_Class autofit_module_class; - - -FT_END_HEADER - -#endif /* __AFMODULE_H__ */ diff --git a/reactos/lib/freetype/src/autofit/aftypes.h b/reactos/lib/freetype/src/autofit/aftypes.h deleted file mode 100644 index 3f968fc332d..00000000000 --- a/reactos/lib/freetype/src/autofit/aftypes.h +++ /dev/null @@ -1,266 +0,0 @@ -#ifndef __AFTYPES_H__ -#define __AFTYPES_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_OUTLINE_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H - -FT_BEGIN_HEADER - - /**************************************************************************/ - /**************************************************************************/ - /***** *****/ - /***** D E B U G G I N G *****/ - /***** *****/ - /**************************************************************************/ - /**************************************************************************/ - -#define xxAF_DEBUG - -#ifdef AF_DEBUG - -# include <stdio.h> -# define AF_LOG( x ) printf ## x - -#else - -# define AF_LOG( x ) do ; while ( 0 ) /* nothing */ - -#endif /* AF_DEBUG */ - - /**************************************************************************/ - /**************************************************************************/ - /***** *****/ - /***** U T I L I T Y *****/ - /***** *****/ - /**************************************************************************/ - /**************************************************************************/ - - typedef struct AF_WidthRec_ - { - FT_Pos org; /* original position/width in font units */ - FT_Pos cur; /* current/scaled position/width in device sub-pixels */ - FT_Pos fit; /* current/fitted position/width in device sub-pixels */ - - } AF_WidthRec, *AF_Width; - - - FT_LOCAL( void ) - af_sort_pos( FT_UInt count, - FT_Pos* table ); - - FT_LOCAL( void ) - af_sort_widths( FT_UInt count, - AF_Width widths ); - - - /**************************************************************************/ - /**************************************************************************/ - /***** *****/ - /***** A N G L E T Y P E S *****/ - /***** *****/ - /**************************************************************************/ - /**************************************************************************/ - - /* - * Angle type. The auto-fitter doesn't need a very high angular accuracy, - * and this allows us to speed up some computations considerably with a - * light Cordic algorithm (see afangles.c) - * - */ - - typedef FT_Int AF_Angle; - -#define AF_ANGLE_PI 128 -#define AF_ANGLE_2PI (AF_ANGLE_PI*2) -#define AF_ANGLE_PI2 (AF_ANGLE_PI/2) -#define AF_ANGLE_PI4 (AF_ANGLE_PI/4) - - /* - * compute the angle of a given 2-D vector - * - */ - FT_LOCAL( AF_Angle ) - af_angle_atan( FT_Pos dx, - FT_Pos dy ); - - - /* - * computes "angle2 - angle1", the result is always within - * the range [ -AF_ANGLE_PI .. AF_ANGLE_PI-1 ] - * - */ - FT_LOCAL( AF_Angle ) - af_angle_diff( AF_Angle angle1, - AF_Angle angle2 ); - - - /**************************************************************************/ - /**************************************************************************/ - /***** *****/ - /***** O U T L I N E S *****/ - /***** *****/ - /**************************************************************************/ - /**************************************************************************/ - - /* opaque handle to glyph-specific hints. see "afhints.h" for more - * details - */ - typedef struct AF_GlyphHintsRec_* AF_GlyphHints; - - /* this structure is used to model an input glyph outline to - * the auto-hinter. The latter will set the "hints" field - * depending on the glyph's script - */ - typedef struct AF_OutlineRec_ - { - FT_Face face; - FT_Outline outline; - FT_UInt outline_resolution; - - FT_Int advance; - FT_UInt metrics_resolution; - - AF_GlyphHints hints; - - } AF_OutlineRec; - - - /**************************************************************************/ - /**************************************************************************/ - /***** *****/ - /***** S C A L E R S *****/ - /***** *****/ - /**************************************************************************/ - /**************************************************************************/ - - /* - * A scaler models the target pixel device that will receive the - * auto-hinted glyph image - * - */ - - typedef enum - { - AF_SCALER_FLAG_NO_HORIZONTAL = 1, /* disable horizontal hinting */ - AF_SCALER_FLAG_NO_VERTICAL = 2, /* disable vertical hinting */ - AF_SCALER_FLAG_NO_ADVANCE = 4 /* disable advance hinting */ - - } AF_ScalerFlags; - - - typedef struct AF_ScalerRec_ - { - FT_Face face; /* source font face */ - FT_Fixed x_scale; /* from font units to 1/64th device pixels */ - FT_Fixed y_scale; /* from font units to 1/64th device pixels */ - FT_Pos x_delta; /* in 1/64th device pixels */ - FT_Pos y_delta; /* in 1/64th device pixels */ - FT_Render_Mode render_mode; /* monochrome, anti-aliased, LCD, etc.. */ - FT_UInt32 flags; /* additionnal control flags, see above */ - - } AF_ScalerRec, *AF_Scaler; - - - - /**************************************************************************/ - /**************************************************************************/ - /***** *****/ - /***** S C R I P T S *****/ - /***** *****/ - /**************************************************************************/ - /**************************************************************************/ - - /* - * the list of know scripts. Each different script correspond to the - * following information: - * - * - a set of Unicode ranges to test weither the face supports the - * script - * - * - a specific global analyzer that will compute global metrics - * specific to the script. - * - * - a specific glyph analyzer that will compute segments and - * edges for each glyph covered by the script - * - * - a specific grid-fitting algorithm that will distort the - * scaled glyph outline according to the results of the glyph - * analyzer - * - * note that a given analyzer and/or grid-fitting algorithm can be - * used by more than one script - */ - typedef enum - { - AF_SCRIPT_LATIN = 0, - /* add new scripts here. don't forget to update the list in "afglobal.c" */ - - AF_SCRIPT_MAX /* do not remove */ - - } AF_Script; - - - - typedef struct AF_ScriptClassRec_ const* AF_ScriptClass; - - typedef struct AF_ScriptMetricsRec_ - { - AF_ScriptClass clazz; - - } AF_ScriptMetricsRec, *AF_ScriptMetrics; - - - /* this function parses a FT_Face to compute global metrics for - * a specific script - */ - typedef FT_Error (*AF_Script_InitMetricsFunc)( AF_ScriptMetrics metrics, - FT_Face face ); - - typedef void (*AF_Script_ScaleMetricsFunc)( AF_ScriptMetrics metrics, - AF_Scaler scaler ); - - typedef void (*AF_Script_DoneMetricsFunc)( AF_ScriptMetrics metrics ); - - - typedef FT_Error (*AF_Script_InitHintsFunc)( AF_GlyphHints hints, - FT_Outline* outline, - AF_ScriptMetrics metrics ); - - typedef void (*AF_Script_ApplyHintsFunc)( AF_GlyphHints hints, - FT_Outline* outline, - AF_ScriptMetrics metrics ); - - - typedef struct AF_Script_UniRangeRec_ - { - FT_UInt32 first; - FT_UInt32 last; - - } AF_Script_UniRangeRec; - - typedef const AF_Script_UniRangeRec * AF_Script_UniRange; - - typedef struct AF_ScriptClassRec_ - { - AF_Script script; - AF_Script_UniRange script_uni_ranges; /* last must be { 0, 0 } */ - - FT_UInt script_metrics_size; - AF_Script_InitMetricsFunc script_metrics_init; - AF_Script_ScaleMetricsFunc script_metrics_scale; - AF_Script_DoneMetricsFunc script_metrics_done; - - AF_Script_InitHintsFunc script_hints_init; - AF_Script_ApplyHintsFunc script_hints_apply; - - } AF_ScriptClassRec; - - -/* */ - -FT_END_HEADER - -#endif /* __AFTYPES_H__ */ diff --git a/reactos/lib/freetype/src/autofit/autofit.c b/reactos/lib/freetype/src/autofit/autofit.c deleted file mode 100644 index 91e4db307f7..00000000000 --- a/reactos/lib/freetype/src/autofit/autofit.c +++ /dev/null @@ -1,8 +0,0 @@ -#define FT_MAKE_OPTION_SINGLE_OBJECT -#include <ft2build.h> -#include "afangles.c" -#include "afglobal.c" -#include "afhints.c" -#include "aflatin.c" -#include "afloader.c" -#include "afmodule.c" diff --git a/reactos/lib/freetype/src/autohint/ahglobal.c b/reactos/lib/freetype/src/autohint/ahglobal.c index 273a1e52246..4183b010999 100644 --- a/reactos/lib/freetype/src/autohint/ahglobal.c +++ b/reactos/lib/freetype/src/autohint/ahglobal.c @@ -30,7 +30,7 @@ /* cf. AH_BLUE_XXX constants in ahtypes.h */ static - const char* const blue_chars[AH_BLUE_MAX] = + const char* blue_chars[AH_BLUE_MAX] = { "THEZOCQS", "HEZLOCUS", diff --git a/reactos/lib/freetype/src/autohint/ahglyph.c b/reactos/lib/freetype/src/autohint/ahglyph.c index ad2f46efe8e..85c3b380e65 100644 --- a/reactos/lib/freetype/src/autohint/ahglyph.c +++ b/reactos/lib/freetype/src/autohint/ahglyph.c @@ -418,7 +418,7 @@ /* first of all, reallocate the contours array if necessary */ if ( num_contours > outline->max_contours ) { - FT_Int new_contours = FT_PAD_CEIL( num_contours, 4 ); + FT_Int new_contours = ( num_contours + 3 ) & -4; if ( FT_RENEW_ARRAY( outline->contours, @@ -435,7 +435,7 @@ /* */ if ( num_points + 2 > outline->max_points ) { - FT_Int news = FT_PAD_CEIL( num_points, 8 ); + FT_Int news = ( num_points + 2 + 7 ) & -8; FT_Int max = outline->max_points; diff --git a/reactos/lib/freetype/src/autohint/ahhint.c b/reactos/lib/freetype/src/autohint/ahhint.c index a79e19db600..c4c8cfc50d1 100644 --- a/reactos/lib/freetype/src/autohint/ahhint.c +++ b/reactos/lib/freetype/src/autohint/ahhint.c @@ -4,7 +4,7 @@ /* */ /* Glyph hinter (body). */ /* */ -/* Copyright 2000-2001, 2002, 2003, 2004 Catharon Productions Inc. */ +/* Copyright 2000-2001, 2002, 2003 Catharon Productions Inc. */ /* Author: David Turner */ /* */ /* This file is part of the Catharon Typography Project and shall only */ @@ -71,7 +71,7 @@ } } - scaled = FT_PIX_ROUND( reference ); + scaled = ( reference + 32 ) & -64; if ( width >= reference ) { @@ -167,7 +167,7 @@ dist += delta; } else - dist = ( dist + 32 ) & ~63; + dist = ( dist + 32 ) & -64; } } else @@ -181,7 +181,7 @@ /* in the case of vertical hinting, always round */ /* the stem heights to integer pixels */ if ( dist >= 64 ) - dist = ( dist + 16 ) & ~63; + dist = ( dist + 16 ) & -64; else dist = 64; } @@ -196,7 +196,7 @@ if ( dist < 64 ) dist = 64; else - dist = ( dist + 32 ) & ~63; + dist = ( dist + 32 ) & -64; } else { @@ -207,10 +207,10 @@ dist = ( dist + 64 ) >> 1; else if ( dist < 128 ) - dist = ( dist + 22 ) & ~63; + dist = ( dist + 22 ) & -64; else /* XXX: round otherwise to prevent color fringes in LCD mode */ - dist = ( dist + 32 ) & ~63; + dist = ( dist + 32 ) & -64; } } } @@ -284,7 +284,7 @@ dist += delta; } else - dist = ( dist + 32 ) & ~63; + dist = ( dist + 32 ) & -64; } } else @@ -298,7 +298,7 @@ /* in the case of vertical hinting, always round */ /* the stem heights to integer pixels */ if ( dist >= 64 ) - dist = ( dist + 16 ) & ~63; + dist = ( dist + 16 ) & -64; else dist = 64; } @@ -313,7 +313,7 @@ if ( dist < 64 ) dist = 64; else - dist = ( dist + 32 ) & ~63; + dist = ( dist + 32 ) & -64; } else { @@ -324,10 +324,10 @@ dist = ( dist + 64 ) >> 1; else if ( dist < 128 ) - dist = ( dist + 22 ) & ~63; + dist = ( dist + 22 ) & -64; else /* XXX: round otherwise to prevent color fringes in LCD mode */ - dist = ( dist + 32 ) & ~63; + dist = ( dist + 32 ) & -64; } } } @@ -396,7 +396,7 @@ if ( base->flags & AH_EDGE_DONE ) { if ( dist >= 64 ) - dist = ( dist + 8 ) & ~63; + dist = ( dist + 8 ) & -64; else if ( dist <= 32 && !vertical ) dist = ( dist + 33 ) >> 1; @@ -545,7 +545,7 @@ { org_center = edge->opos + ( org_len >> 1 ); - cur_pos1 = FT_PIX_ROUND( org_center ); + cur_pos1 = ( org_center + 32 ) & -64; error1 = org_center - ( cur_pos1 - u_off ); if ( error1 < 0 ) @@ -565,7 +565,7 @@ } else - edge->pos = FT_PIX_ROUND( edge->opos ); + edge->pos = ( edge->opos + 32 ) & -64; anchor = edge; @@ -575,7 +575,7 @@ #else /* !FT_CONFIG_CHESTER_STEM */ - edge->pos = FT_PIX_ROUND( edge->opos ); + edge->pos = ( edge->opos + 32 ) & -64; anchor = edge; edge->flags |= AH_EDGE_DONE; @@ -614,7 +614,7 @@ FT_Pos u_off, d_off; - cur_pos1 = FT_PIX_ROUND( org_center ); + cur_pos1 = ( org_center + 32 ) & -64; if (cur_len <= 64 ) u_off = d_off = 32; @@ -649,12 +649,12 @@ cur_len = ah_compute_stem_width( hinter, dimension, org_len, edge->flags, edge2->flags ); - cur_pos1 = FT_PIX_ROUND( org_pos ); + cur_pos1 = ( org_pos + 32 ) & -64; delta1 = ( cur_pos1 + ( cur_len >> 1 ) - org_center ); if ( delta1 < 0 ) delta1 = -delta1; - cur_pos2 = FT_PIX_ROUND( org_pos + org_len ) - cur_len; + cur_pos2 = ( ( org_pos + org_len + 32 ) & -64 ) - cur_len; delta2 = ( cur_pos2 + ( cur_len >> 1 ) - org_center ); if ( delta2 < 0 ) delta2 = -delta2; @@ -665,12 +665,12 @@ #else /* !FT_CONFIG_CHESTER_STEM */ - cur_pos1 = FT_PIX_ROUND( org_pos ); + cur_pos1 = ( org_pos + 32 ) & -64; delta1 = ( cur_pos1 + ( cur_len >> 1 ) - org_center ); if ( delta1 < 0 ) delta1 = -delta1; - cur_pos2 = FT_PIX_ROUND( org_pos + org_len ) - cur_len; + cur_pos2 = ( ( org_pos + org_len + 32 ) & -64 ) - cur_len; delta2 = ( cur_pos2 + ( cur_len >> 1 ) - org_center ); if ( delta2 < 0 ) delta2 = -delta2; @@ -703,7 +703,7 @@ /* the third (lowest) stem aligns with the base line; it might end up */ /* one pixel higher or lower. */ - n_edges = (FT_Int)( edge_limit - edges ); + n_edges = edge_limit - edges; if ( !dimension && ( n_edges == 6 || n_edges == 12 ) ) { AH_EdgeRec *edge1, *edge2, *edge3; @@ -764,12 +764,12 @@ ah_align_serif_edge( hinter, edge->serif, edge, dimension ); else if ( !anchor ) { - edge->pos = FT_PIX_ROUND( edge->opos ); + edge->pos = ( edge->opos + 32 ) & -64; anchor = edge; } else edge->pos = anchor->pos + - FT_PIX_ROUND( edge->opos - anchor->opos ); + ( ( edge->opos-anchor->opos + 32 ) & -64 ); edge->flags |= AH_EDGE_DONE; @@ -943,7 +943,7 @@ /* find enclosing edges */ min = 0; - max = (FT_UInt)( edge_limit - edges ); + max = edge_limit - edges; while ( min < max ) { @@ -1299,16 +1299,15 @@ if ( delta2 < 32 ) delta2 = 0; else if ( delta2 < 64 ) - delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 ); + delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & -32 ); else - delta2 = FT_PIX_ROUND( delta2 ); + delta2 = ( delta2 + 32 ) & -64; if ( delta < 0 ) delta2 = -delta2; scaled->blue_refs[n] = - FT_PIX_ROUND( FT_MulFix( design->blue_refs[n], y_scale ) ); - + ( FT_MulFix( design->blue_refs[n], y_scale ) + 32 ) & -64; scaled->blue_shoots[n] = scaled->blue_refs[n] + delta2; } @@ -1494,14 +1493,14 @@ if ( error ) goto Exit; - FT_ARRAY_COPY( gloader->current.extra_points, slot->outline.points, - slot->outline.n_points ); + FT_MEM_COPY( gloader->current.extra_points, slot->outline.points, + slot->outline.n_points * sizeof ( FT_Vector ) ); - FT_ARRAY_COPY( gloader->current.outline.contours, slot->outline.contours, - slot->outline.n_contours ); + FT_MEM_COPY( gloader->current.outline.contours, slot->outline.contours, + slot->outline.n_contours * sizeof ( short ) ); - FT_ARRAY_COPY( gloader->current.outline.tags, slot->outline.tags, - slot->outline.n_points ); + FT_MEM_COPY( gloader->current.outline.tags, slot->outline.tags, + slot->outline.n_points * sizeof ( char ) ); gloader->current.outline.n_points = slot->outline.n_points; gloader->current.outline.n_contours = slot->outline.n_contours; @@ -1552,8 +1551,8 @@ old_lsb = edge1->opos; new_lsb = edge1->pos; - hinter->pp1.x = FT_PIX_ROUND( new_lsb - old_lsb ); - hinter->pp2.x = FT_PIX_ROUND( edge2->pos + old_rsb ); + hinter->pp1.x = ( ( new_lsb - old_lsb ) + 32 ) & -64; + hinter->pp2.x = ( ( edge2->pos + old_rsb ) + 32 ) & -64; #if 0 /* try to fix certain bad advance computations */ @@ -1580,8 +1579,8 @@ if ( error ) goto Exit; - FT_ARRAY_COPY( gloader->current.subglyphs, slot->subglyphs, - num_subglyphs ); + FT_MEM_COPY( gloader->current.subglyphs, slot->subglyphs, + num_subglyphs * sizeof ( FT_SubGlyph ) ); gloader->current.num_subglyphs = num_subglyphs; num_base_subgs = gloader->base.num_subglyphs; @@ -1678,8 +1677,8 @@ x = FT_MulFix( subglyph->arg1, x_scale ); y = FT_MulFix( subglyph->arg2, y_scale ); - x = FT_PIX_ROUND(x); - y = FT_PIX_ROUND(y); + x = ( x + 32 ) & -64; + y = ( y + 32 ) & -64; } { @@ -1716,10 +1715,10 @@ FT_Outline_Translate( &gloader->base.outline, -hinter->pp1.x, 0 ); FT_Outline_Get_CBox( &gloader->base.outline, &bbox ); - bbox.xMin = FT_PIX_FLOOR( bbox.xMin ); - bbox.yMin = FT_PIX_FLOOR( bbox.yMin ); - bbox.xMax = FT_PIX_CEIL( bbox.xMax ); - bbox.yMax = FT_PIX_CEIL( bbox.yMax ); + bbox.xMin &= -64; + bbox.yMin &= -64; + bbox.xMax = ( bbox.xMax + 63 ) & -64; + bbox.yMax = ( bbox.yMax + 63 ) & -64; slot->metrics.width = bbox.xMax - bbox.xMin; slot->metrics.height = bbox.yMax - bbox.yMin; @@ -1734,7 +1733,7 @@ slot->metrics.horiAdvance = FT_MulFix( slot->metrics.horiAdvance, x_scale ); - slot->metrics.horiAdvance = FT_PIX_ROUND( slot->metrics.horiAdvance ); + slot->metrics.horiAdvance = ( slot->metrics.horiAdvance + 32 ) & -64; /* now copy outline into glyph slot */ ah_loader_rewind( slot->internal->loader ); @@ -1803,7 +1802,7 @@ if ( shoot > 0 ) { FT_Pos scaled = FT_MulFix( shoot, y_scale ); - FT_Pos fitted = FT_PIX_ROUND( scaled ); + FT_Pos fitted = ( scaled + 32 ) & -64; if ( scaled != fitted ) @@ -1851,9 +1850,9 @@ hinter->do_stem_adjust = FT_BOOL( hint_mode != FT_RENDER_MODE_LIGHT ); - load_flags |= FT_LOAD_NO_SCALE - | FT_LOAD_IGNORE_TRANSFORM; - load_flags &= ~FT_LOAD_RENDER; + + load_flags |= FT_LOAD_NO_SCALE + | FT_LOAD_IGNORE_TRANSFORM ; error = ah_hinter_load( hinter, glyph_index, load_flags, 0 ); diff --git a/reactos/lib/freetype/src/base/ftbdf.c b/reactos/lib/freetype/src/base/ftbdf.c index d2f133db778..63e3071c11d 100644 --- a/reactos/lib/freetype/src/base/ftbdf.c +++ b/reactos/lib/freetype/src/base/ftbdf.c @@ -17,8 +17,27 @@ #include <ft2build.h> +#include FT_INTERNAL_BDF_TYPES_H #include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_BDF_H + + + static FT_Bool + test_font_type( FT_Face face, + const char* name ) + { + if ( face && face->driver ) + { + FT_Module driver = (FT_Module)face->driver; + + + if ( driver->clazz && driver->clazz->module_name ) + { + if ( ft_strcmp( driver->clazz->module_name, name ) == 0 ) + return 1; + } + } + return 0; + } FT_EXPORT_DEF( FT_Error ) @@ -33,15 +52,14 @@ error = FT_Err_Invalid_Argument; - if ( face ) + if ( test_font_type( face, "bdf" ) ) { - FT_Service_BDF service; + BDF_Public_Face bdf_face = (BDF_Public_Face)face; - FT_FACE_FIND_SERVICE( face, service, BDF ); - - if ( service && service->get_charset_id ) - error = service->get_charset_id( face, &encoding, ®istry ); + encoding = (const char*) bdf_face->charset_encoding; + registry = (const char*) bdf_face->charset_registry; + error = 0; } if ( acharset_encoding ) @@ -66,18 +84,22 @@ aproperty->type = BDF_PROPERTY_TYPE_NONE; - if ( face ) + if ( face != NULL && face->driver != NULL ) { - FT_Service_BDF service; + FT_Driver driver = face->driver; + BDF_GetPropertyFunc func; - FT_FACE_FIND_SERVICE( face, service, BDF ); - - if ( service && service->get_property ) - error = service->get_property( face, prop_name, aproperty ); + if ( driver->root.clazz->get_interface ) + { + func = (BDF_GetPropertyFunc)driver->root.clazz->get_interface( + FT_MODULE( driver ), "get_bdf_property" ); + if ( func ) + error = func( face, prop_name, aproperty ); + } } - return error; + return error; } diff --git a/reactos/lib/freetype/src/base/ftcalc.c b/reactos/lib/freetype/src/base/ftcalc.c index 4fb2366276e..29a3a59fc04 100644 --- a/reactos/lib/freetype/src/base/ftcalc.c +++ b/reactos/lib/freetype/src/base/ftcalc.c @@ -74,8 +74,8 @@ FT_EXPORT_DEF( FT_Fixed ) FT_RoundFix( FT_Fixed a ) { - return ( a >= 0 ) ? ( a + 0x8000L ) & ~0xFFFFL - : -((-a + 0x8000L ) & ~0xFFFFL ); + return ( a >= 0 ) ? ( a + 0x8000L ) & -0x10000L + : -((-a + 0x8000L ) & -0x10000L ); } @@ -84,8 +84,8 @@ FT_EXPORT_DEF( FT_Fixed ) FT_CeilFix( FT_Fixed a ) { - return ( a >= 0 ) ? ( a + 0xFFFFL ) & ~0xFFFFL - : -((-a + 0xFFFFL ) & ~0xFFFFL ); + return ( a >= 0 ) ? ( a + 0xFFFFL ) & -0x10000L + : -((-a + 0xFFFFL ) & -0x10000L ); } @@ -94,8 +94,8 @@ FT_EXPORT_DEF( FT_Fixed ) FT_FloorFix( FT_Fixed a ) { - return ( a >= 0 ) ? a & ~0xFFFFL - : -((-a) & ~0xFFFFL ); + return ( a >= 0 ) ? a & -0x10000L + : -((-a) & -0x10000L ); } @@ -155,33 +155,6 @@ } -#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER - - /* documentation is in ftcalc.h */ - - FT_BASE_DEF( FT_Long ) - FT_MulDiv_No_Round( FT_Long a, - FT_Long b, - FT_Long c ) - { - FT_Int s; - FT_Long d; - - - s = 1; - if ( a < 0 ) { a = -a; s = -1; } - if ( b < 0 ) { b = -b; s = -s; } - if ( c < 0 ) { c = -c; s = -s; } - - d = (FT_Long)( c > 0 ? (FT_Int64)a * b / c - : 0x7FFFFFFFL ); - - return ( s > 0 ) ? d : -d; - } - -#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ - - /* documentation is in freetype.h */ FT_EXPORT_DEF( FT_Long ) @@ -330,8 +303,9 @@ s ^= c; c = ABS( c ); if ( a <= 46340L && b <= 46340L && c <= 176095L && c > 0 ) + { a = ( a * b + ( c >> 1 ) ) / c; - + } else if ( c > 0 ) { FT_Int64 temp, temp2; @@ -351,43 +325,6 @@ } -#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER - - FT_BASE_DEF( FT_Long ) - FT_MulDiv_No_Round( FT_Long a, - FT_Long b, - FT_Long c ) - { - long s; - - - if ( a == 0 || b == c ) - return a; - - s = a; a = ABS( a ); - s ^= b; b = ABS( b ); - s ^= c; c = ABS( c ); - - if ( a <= 46340L && b <= 46340L && c > 0 ) - a = a * b / c; - - else if ( c > 0 ) - { - FT_Int64 temp; - - - ft_multo64( a, b, &temp ); - a = ft_div64by32( temp.hi, temp.lo, c ); - } - else - a = 0x7FFFFFFFL; - - return ( s < 0 ? -a : a ); - } - -#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ - - /* documentation is in freetype.h */ FT_EXPORT_DEF( FT_Long ) diff --git a/reactos/lib/freetype/src/base/ftdbgmem.c b/reactos/lib/freetype/src/base/ftdbgmem.c index 152220c605d..dc4a1bbf2b4 100644 --- a/reactos/lib/freetype/src/base/ftdbgmem.c +++ b/reactos/lib/freetype/src/base/ftdbgmem.c @@ -4,7 +4,7 @@ /* */ /* Memory debugger (body). */ /* */ -/* Copyright 2001, 2002, 2003, 2004 by */ +/* Copyright 2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -604,7 +604,7 @@ p = getenv( "FT2_ALLOC_TOTAL_MAX" ); if ( p != NULL ) { - FT_Long total_max = ft_atol(p); + FT_Long total_max = atol(p); if ( total_max > 0 ) { @@ -616,7 +616,7 @@ p = getenv( "FT2_ALLOC_COUNT_MAX" ); if ( p != NULL ) { - FT_Long total_count = ft_atol(p); + FT_Long total_count = atol(p); if ( total_count > 0 ) { diff --git a/reactos/lib/freetype/src/base/ftgloadr.c b/reactos/lib/freetype/src/base/ftgloadr.c index 0308f713c88..5a2eb51606e 100644 --- a/reactos/lib/freetype/src/base/ftgloadr.c +++ b/reactos/lib/freetype/src/base/ftgloadr.c @@ -4,7 +4,7 @@ /* */ /* The FreeType glyph loader (body). */ /* */ -/* Copyright 2002, 2003, 2004 by */ +/* Copyright 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -19,7 +19,6 @@ #include <ft2build.h> #include FT_INTERNAL_GLYPH_LOADER_H #include FT_INTERNAL_MEMORY_H -#include FT_INTERNAL_OBJECTS_H #undef FT_COMPONENT #define FT_COMPONENT trace_gloader @@ -206,7 +205,7 @@ if ( new_max > old_max ) { - new_max = FT_PAD_CEIL( new_max, 8 ); + new_max = ( new_max + 7 ) & -8; if ( FT_RENEW_ARRAY( base->points, old_max, new_max ) || FT_RENEW_ARRAY( base->tags, old_max, new_max ) ) @@ -226,7 +225,7 @@ n_contours; if ( new_max > old_max ) { - new_max = FT_PAD_CEIL( new_max, 4 ); + new_max = ( new_max + 3 ) & -4; if ( FT_RENEW_ARRAY( base->contours, old_max, new_max ) ) goto Exit; @@ -262,7 +261,7 @@ old_max = loader->max_subglyphs; if ( new_max > old_max ) { - new_max = FT_PAD_CEIL( new_max, 2 ); + new_max = ( new_max + 1 ) & -2; if ( FT_RENEW_ARRAY( base->subglyphs, old_max, new_max ) ) goto Exit; @@ -337,17 +336,17 @@ FT_Outline* in = &source->base.outline; - FT_ARRAY_COPY( out->points, in->points, - num_points ); - FT_ARRAY_COPY( out->tags, in->tags, - num_points ); - FT_ARRAY_COPY( out->contours, in->contours, - num_contours ); + FT_MEM_COPY( out->points, in->points, + num_points * sizeof ( FT_Vector ) ); + FT_MEM_COPY( out->tags, in->tags, + num_points * sizeof ( char ) ); + FT_MEM_COPY( out->contours, in->contours, + num_contours * sizeof ( short ) ); /* do we need to copy the extra points? */ if ( target->use_extra && source->use_extra ) - FT_ARRAY_COPY( target->base.extra_points, source->base.extra_points, - num_points ); + FT_MEM_COPY( target->base.extra_points, source->base.extra_points, + num_points * sizeof ( FT_Vector ) ); out->n_points = (short)num_points; out->n_contours = (short)num_contours; diff --git a/reactos/lib/freetype/src/base/ftglyph.c b/reactos/lib/freetype/src/base/ftglyph.c index e6311b53f28..fad5a620daf 100644 --- a/reactos/lib/freetype/src/base/ftglyph.c +++ b/reactos/lib/freetype/src/base/ftglyph.c @@ -4,7 +4,7 @@ /* */ /* FreeType convenience functions to handle glyphs (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* Copyright 1996-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -253,11 +253,14 @@ goto Exit; /* copy it */ - FT_ARRAY_COPY( target->points, source->points, source->n_points ); + FT_MEM_COPY( target->points, source->points, + source->n_points * sizeof ( FT_Vector ) ); - FT_ARRAY_COPY( target->tags, source->tags, source->n_points ); + FT_MEM_COPY( target->tags, source->tags, + source->n_points * sizeof ( FT_Byte ) ); - FT_ARRAY_COPY( target->contours, source->contours, source->n_contours ); + FT_MEM_COPY( target->contours, source->contours, + source->n_contours * sizeof ( FT_Short ) ); /* copy all flags, except the `FT_OUTLINE_OWNER' one */ target->flags = source->flags | FT_OUTLINE_OWNER; @@ -418,7 +421,7 @@ FT_Get_Glyph( FT_GlyphSlot slot, FT_Glyph *aglyph ) { - FT_Library library; + FT_Library library = slot->library; FT_Error error; FT_Glyph glyph; @@ -428,8 +431,6 @@ if ( !slot ) return FT_Err_Invalid_Slot_Handle; - library = slot->library; - if ( !aglyph ) return FT_Err_Invalid_Argument; @@ -543,10 +544,10 @@ if ( bbox_mode == FT_GLYPH_BBOX_GRIDFIT || bbox_mode == FT_GLYPH_BBOX_PIXELS ) { - acbox->xMin = FT_PIX_FLOOR( acbox->xMin ); - acbox->yMin = FT_PIX_FLOOR( acbox->yMin ); - acbox->xMax = FT_PIX_CEIL( acbox->xMax ); - acbox->yMax = FT_PIX_CEIL( acbox->yMax ); + acbox->xMin &= -64; + acbox->yMin &= -64; + acbox->xMax = ( acbox->xMax + 63 ) & -64; + acbox->yMax = ( acbox->yMax + 63 ) & -64; } /* convert to integer pixels if needed */ diff --git a/reactos/lib/freetype/src/base/ftmm.c b/reactos/lib/freetype/src/base/ftmm.c index 0bb2813092c..229a0431654 100644 --- a/reactos/lib/freetype/src/base/ftmm.c +++ b/reactos/lib/freetype/src/base/ftmm.c @@ -4,7 +4,7 @@ /* */ /* Multiple Master font support (body). */ /* */ -/* Copyright 1996-2001, 2003 by */ +/* Copyright 1996-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -19,7 +19,6 @@ #include <ft2build.h> #include FT_MULTIPLE_MASTERS_H #include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_MULTIPLE_MASTERS_H /*************************************************************************/ @@ -32,15 +31,15 @@ #define FT_COMPONENT trace_mm - static FT_Error - ft_face_get_mm_service( FT_Face face, - FT_Service_MultiMasters *aservice ) + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Multi_Master( FT_Face face, + FT_Multi_Master *amaster ) { FT_Error error; - *aservice = NULL; - if ( !face ) return FT_Err_Invalid_Face_Handle; @@ -48,34 +47,14 @@ if ( FT_HAS_MULTIPLE_MASTERS( face ) ) { - FT_FACE_LOOKUP_SERVICE( face, - *aservice, - MULTI_MASTERS ); - - if ( aservice ) - error = FT_Err_Ok; - } - - return error; - } + FT_Driver driver = face->driver; + FT_Get_MM_Func func; - /* documentation is in ftmm.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_Multi_Master( FT_Face face, - FT_Multi_Master *amaster ) - { - FT_Error error; - FT_Service_MultiMasters service; - - - error = ft_face_get_mm_service( face, &service ); - if ( !error ) - { - error = FT_Err_Invalid_Argument; - if ( service->get_mm ) - error = service->get_mm( face, amaster ); + func = (FT_Get_MM_Func)driver->root.clazz->get_interface( + FT_MODULE( driver ), "get_mm" ); + if ( func ) + error = func( face, amaster ); } return error; @@ -89,16 +68,24 @@ FT_UInt num_coords, FT_Long* coords ) { - FT_Error error; - FT_Service_MultiMasters service; + FT_Error error; - error = ft_face_get_mm_service( face, &service ); - if ( !error ) + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + error = FT_Err_Invalid_Argument; + + if ( FT_HAS_MULTIPLE_MASTERS( face ) ) { - error = FT_Err_Invalid_Argument; - if ( service->set_mm_design ) - error = service->set_mm_design( face, num_coords, coords ); + FT_Driver driver = face->driver; + FT_Set_MM_Design_Func func; + + + func = (FT_Set_MM_Design_Func)driver->root.clazz->get_interface( + FT_MODULE( driver ), "set_mm_design" ); + if ( func ) + error = func( face, num_coords, coords ); } return error; @@ -112,16 +99,24 @@ FT_UInt num_coords, FT_Fixed* coords ) { - FT_Error error; - FT_Service_MultiMasters service; + FT_Error error; - error = ft_face_get_mm_service( face, &service ); - if ( !error ) + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + error = FT_Err_Invalid_Argument; + + if ( FT_HAS_MULTIPLE_MASTERS( face ) ) { - error = FT_Err_Invalid_Argument; - if ( service->set_mm_blend ) - error = service->set_mm_blend( face, num_coords, coords ); + FT_Driver driver = face->driver; + FT_Set_MM_Blend_Func func; + + + func = (FT_Set_MM_Blend_Func)driver->root.clazz->get_interface( + FT_MODULE( driver ), "set_mm_blend" ); + if ( func ) + error = func( face, num_coords, coords ); } return error; diff --git a/reactos/lib/freetype/src/base/ftobjs.c b/reactos/lib/freetype/src/base/ftobjs.c index b48288c3c71..8fdcc883e1f 100644 --- a/reactos/lib/freetype/src/base/ftobjs.c +++ b/reactos/lib/freetype/src/base/ftobjs.c @@ -4,7 +4,7 @@ /* */ /* The FreeType private base classes (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* Copyright 1996-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -27,35 +27,6 @@ #include FT_TRUETYPE_IDS_H #include FT_OUTLINE_H -#include FT_SERVICE_SFNT_H -#include FT_SERVICE_POSTSCRIPT_NAME_H -#include FT_SERVICE_GLYPH_DICT_H -#include FT_SERVICE_TT_CMAP_H - - - FT_BASE_DEF( FT_Pointer ) - ft_service_list_lookup( FT_ServiceDesc service_descriptors, - const char* service_id ) - { - FT_Pointer result = NULL; - FT_ServiceDesc desc = service_descriptors; - - - if ( desc && service_id ) - { - for ( ; desc->serv_id != NULL; desc++ ) - { - if ( ft_strcmp( desc->serv_id, service_id ) == 0 ) - { - result = (FT_Pointer)desc->serv_data; - break; - } - } - } - - return result; - } - FT_BASE_DEF( void ) ft_validator_init( FT_Validator valid, @@ -576,14 +547,15 @@ if ( ( load_flags & FT_LOAD_LINEAR_DESIGN ) == 0 && ( face->face_flags & FT_FACE_FLAG_SCALABLE ) ) { + FT_UInt EM = face->units_per_EM; FT_Size_Metrics* metrics = &face->size->metrics; slot->linearHoriAdvance = FT_MulDiv( slot->linearHoriAdvance, - metrics->x_scale, 64 ); + (FT_Long)metrics->x_ppem << 16, EM ); slot->linearVertAdvance = FT_MulDiv( slot->linearVertAdvance, - metrics->y_scale, 64 ); + (FT_Long)metrics->y_ppem << 16, EM ); } if ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM ) == 0 ) @@ -669,28 +641,6 @@ } - static void - destroy_charmaps( FT_Face face, - FT_Memory memory ) - { - FT_Int n; - - - for ( n = 0; n < face->num_charmaps; n++ ) - { - FT_CMap cmap = FT_CMAP( face->charmaps[n] ); - - - FT_CMap_Done( cmap ); - - face->charmaps[n] = NULL; - } - - FT_FREE( face->charmaps ); - face->num_charmaps = 0; - } - - /* destructor for faces list */ static void destroy_face( FT_Memory memory, @@ -711,9 +661,9 @@ /* discard all sizes for this face */ FT_List_Finalize( &face->sizes_list, - (FT_List_Destructor)destroy_size, - memory, - driver ); + (FT_List_Destructor)destroy_size, + memory, + driver ); face->size = 0; /* now discard client data */ @@ -721,8 +671,25 @@ face->generic.finalizer( face ); /* discard charmaps */ - destroy_charmaps( face, memory ); - + { + FT_Int n; + + + for ( n = 0; n < face->num_charmaps; n++ ) + { + FT_CMap cmap = FT_CMAP( face->charmaps[n] ); + + + FT_CMap_Done( cmap ); + + face->charmaps[n] = NULL; + } + + FT_FREE( face->charmaps ); + face->num_charmaps = 0; + } + + /* finalize format-specific stuff */ if ( clazz->done_face ) clazz->done_face( face ); @@ -737,6 +704,7 @@ /* get rid of it */ if ( face->internal ) { + FT_FREE( face->internal->postscript_name ); FT_FREE( face->internal ); } FT_FREE( face ); @@ -780,7 +748,7 @@ /* caller should have already checked that `face' is valid */ - FT_ASSERT( face ); + FT_ASSERT ( face ); first = face->charmaps; @@ -929,7 +897,6 @@ Fail: if ( error ) { - destroy_charmaps( face, memory ); clazz->done_face( face ); FT_FREE( internal ); FT_FREE( face ); @@ -1142,10 +1109,9 @@ FT_Error error = FT_Err_Cannot_Open_Resource; FT_Memory memory = library->memory; FT_Byte* pfb_data; - int i, type, flags; - FT_Long len; + int i, type, flags, len; FT_Long pfb_len, pfb_pos, pfb_lenpos; - FT_Long rlen, temp; + FT_Long rlen, junk, temp; FT_Long *offsets; @@ -1164,11 +1130,12 @@ /* Find all the POST resource offsets */ for ( i = 0; i < resource_cnt; ++i ) { - (void)FT_STREAM_SKIP( 4 ); /* resource id and resource name */ + (void)FT_READ_USHORT( junk ); /* resource id */ + (void)FT_READ_USHORT( junk ); /* rsource name */ if ( FT_READ_LONG( temp ) ) goto Exit; offsets[i] = resource_data + ( temp & 0xFFFFFFL ); - (void)FT_STREAM_SKIP( 4 ); /* mbz */ + (void)FT_READ_LONG( junk ); /* mbz */ } /* Find the length of all the POST resources, concatenated. Assume */ @@ -1187,14 +1154,14 @@ if ( FT_ALLOC( pfb_data, (FT_Long)pfb_len + 2 ) ) goto Exit; - pfb_data[0] = 0x80; - pfb_data[1] = 1; /* Ascii section */ - pfb_data[2] = 0; /* 4-byte length, fill in later */ - pfb_data[3] = 0; - pfb_data[4] = 0; - pfb_data[5] = 0; - pfb_pos = 7; - pfb_lenpos = 2; + pfb_pos = 0; + pfb_data[pfb_pos++] = 0x80; + pfb_data[pfb_pos++] = 1; /* Ascii section */ + pfb_lenpos = pfb_pos; + pfb_data[pfb_pos++] = 0; /* 4-byte length, fill in later */ + pfb_data[pfb_pos++] = 0; + pfb_data[pfb_pos++] = 0; + pfb_data[pfb_pos++] = 0; len = 0; type = 1; @@ -1212,10 +1179,10 @@ len += rlen; else { - pfb_data[pfb_lenpos ] = (FT_Byte)( len ); - pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 ); - pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 ); - pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 ); + pfb_data[pfb_lenpos ] = len & 0xFF; + pfb_data[pfb_lenpos + 1] = ( len >> 8 ) & 0xFF; + pfb_data[pfb_lenpos + 2] = ( len >> 16 ) & 0xFF; + pfb_data[pfb_lenpos + 3] = ( len >> 24 ) & 0xFF; if ( ( flags >> 8 ) == 5 ) /* End of font mark */ break; @@ -1225,8 +1192,8 @@ type = flags >> 8; len = rlen; - pfb_data[pfb_pos++] = (FT_Byte)type; - pfb_lenpos = (FT_Byte)pfb_pos; + pfb_data[pfb_pos++] = type; + pfb_lenpos = pfb_pos; pfb_data[pfb_pos++] = 0; /* 4-byte length, fill in later */ pfb_data[pfb_pos++] = 0; pfb_data[pfb_pos++] = 0; @@ -1240,10 +1207,10 @@ pfb_data[pfb_pos++] = 0x80; pfb_data[pfb_pos++] = 3; - pfb_data[pfb_lenpos ] = (FT_Byte)( len ); - pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 ); - pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 ); - pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 ); + pfb_data[pfb_lenpos ] = len & 0xFF; + pfb_data[pfb_lenpos + 1] = ( len >> 8 ) & 0xFF; + pfb_data[pfb_lenpos + 2] = ( len >> 16 ) & 0xFF; + pfb_data[pfb_lenpos + 3] = ( len >> 24 ) & 0xFF; return open_face_from_buffer( library, pfb_data, @@ -1280,7 +1247,7 @@ FT_Error error; int i; FT_Long flag_offset= 0xFFFFFFL; - FT_Long rlen; + FT_Long rlen, junk; int is_cff; @@ -1295,11 +1262,12 @@ for ( i = 0; i <= face_index; ++i ) { - (void)FT_STREAM_SKIP( 4 ); /* resource id and resource name */ + (void)FT_READ_USHORT( junk ); /* resource id */ + (void)FT_READ_USHORT( junk ); /* rsource name */ if ( FT_READ_LONG( flag_offset ) ) goto Exit; flag_offset &= 0xFFFFFFL; - (void)FT_STREAM_SKIP( 4 ); /* mbz */ + (void)FT_READ_LONG( junk ); /* mbz */ } if ( flag_offset == 0xFFFFFFL ) @@ -1350,10 +1318,9 @@ { FT_Error error; unsigned char head[16], head2[16]; - FT_Long rdata_pos, map_pos, rdata_len; + FT_Long rdata_pos, map_pos, rdata_len, map_len; int allzeros, allmatch, i, cnt, subcnt; - FT_Long type_list, rpos; - FT_ULong tag; + FT_Long type_list, tag, rpos, junk; error = FT_Stream_Seek( stream, resource_offset ); @@ -1375,7 +1342,10 @@ ( head[ 9] << 16 ) | ( head[10] << 8 ) | head[11]; - /* map_len = head[12] .. head[15] */ + map_len = ( head[12] << 24 ) | + ( head[13] << 16 ) | + ( head[14] << 8 ) | + head[15]; if ( rdata_pos + rdata_len != map_pos || map_pos == resource_offset ) return FT_Err_Unknown_File_Format; @@ -1384,7 +1354,7 @@ if ( error ) goto Exit; - head2[15] = (FT_Byte)( head[15] + 1 ); /* make it be different */ + head2[15] = head[15] + 1; /* make it be different */ error = FT_Stream_Read( stream, (FT_Byte*)head2, 16 ); if ( error ) @@ -1405,9 +1375,9 @@ /* If we've gotten this far then it's probably a mac resource file. */ /* Now, does it contain any interesting resources? */ - /* Skip handle to next resource map, the file resource number, and */ - /* attributes. */ - (void)FT_STREAM_SKIP( 4 + 2 + 2 ); + (void)FT_READ_LONG( junk ); /* skip handle to next resource map */ + (void)FT_READ_USHORT( junk ); /* skip file resource number */ + (void)FT_READ_USHORT( junk ); /* skip attributes */ if ( FT_READ_USHORT( type_list ) ) goto Exit; @@ -1527,8 +1497,14 @@ if ( FT_ERROR_BASE( error ) == FT_Err_Unknown_File_Format ) error = IsMacResource( library, stream, 0, face_index, aface ); - /* Only meaningful on sytems with hfs+ drivers (or Macs) */ - +#ifdef FT_MACINTOSH + /* + I know this section is within code which is normally turned off + for the Mac. It provides an alternative approach to reading the + mac resource forks on OS/X in the event that a user does not wish + to compile ftmac.c. + */ + if ( ( FT_ERROR_BASE( error ) == FT_Err_Unknown_File_Format || FT_ERROR_BASE( error ) == FT_Err_Invalid_Stream_Operation ) && ( args->flags & FT_OPEN_PATHNAME ) ) @@ -1541,10 +1517,8 @@ memory = library->memory; - if ( FT_ALLOC( newpath, - ft_strlen( args->pathname ) + ft_strlen( "/rsrc" ) + 1 ) ) - goto Fail; - + FT_ALLOC( newpath, + ft_strlen( args->pathname ) + ft_strlen( "/rsrc" ) + 1 ); ft_strcpy( newpath, args->pathname ); ft_strcat( newpath, "/rsrc" ); @@ -1559,7 +1533,8 @@ FT_FREE( newpath ); } - Fail: +#endif /* FT_MACINTOSH */ + return error; } @@ -1673,7 +1648,7 @@ FT_ERROR_BASE( error ) != FT_Err_Invalid_Stream_Operation ) goto Fail2; -#if !defined( FT_MACINTOSH ) && defined( FT_CONFIG_OPTION_MAC_FONTS ) +#ifndef FT_MACINTOSH error = load_mac_face( library, stream, face_index, aface, args ); if ( !error ) { @@ -1688,7 +1663,7 @@ if ( FT_ERROR_BASE( error ) != FT_Err_Unknown_File_Format ) goto Fail2; -#endif /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */ +#endif /* !FT_MACINTOSH */ /* no driver is able to handle this format */ error = FT_Err_Unknown_File_Format; @@ -1983,17 +1958,17 @@ { /* Compute root ascender, descender, test height, and max_advance */ - metrics->ascender = FT_PIX_CEIL( FT_MulFix( face->ascender, - metrics->y_scale ) ); + metrics->ascender = ( FT_MulFix( face->ascender, + metrics->y_scale ) + 63 ) & -64; - metrics->descender = FT_PIX_FLOOR( FT_MulFix( face->descender, - metrics->y_scale ) ); + metrics->descender = ( FT_MulFix( face->descender, + metrics->y_scale ) + 0 ) & -64; - metrics->height = FT_PIX_ROUND( FT_MulFix( face->height, - metrics->y_scale ) ); + metrics->height = ( FT_MulFix( face->height, + metrics->y_scale ) + 32 ) & -64; - metrics->max_advance = FT_PIX_ROUND( FT_MulFix( face->max_advance_width, - metrics->x_scale ) ); + metrics->max_advance = ( FT_MulFix( face->max_advance_width, + metrics->x_scale ) + 32 ) & -64; } @@ -2039,11 +2014,11 @@ char_height = 1 * 64; /* Compute pixel sizes in 26.6 units with rounding */ - dim_x = ( char_width * horz_resolution + 36 ) / 72; - dim_y = ( char_height * vert_resolution + 36 ) / 72; + dim_x = ( ( char_width * horz_resolution + (36+32*72) ) / 72 ) & -64; + dim_y = ( ( char_height * vert_resolution + (36+32*72) ) / 72 ) & -64; - metrics->x_ppem = (FT_UShort)( ( dim_x + 32 ) >> 6 ); - metrics->y_ppem = (FT_UShort)( ( dim_y + 32 ) >> 6 ); + metrics->x_ppem = (FT_UShort)( dim_x >> 6 ); + metrics->y_ppem = (FT_UShort)( dim_y >> 6 ); metrics->x_scale = 0x10000L; metrics->y_scale = 0x10000L; @@ -2086,6 +2061,7 @@ metrics = &face->size->metrics; clazz = driver->clazz; + /* default processing -- this can be overridden by the driver */ if ( pixel_width == 0 ) pixel_width = pixel_height; @@ -2097,12 +2073,6 @@ if ( pixel_height < 1 ) pixel_height = 1; - /* use `>=' to avoid potention compiler warning on 16bit platforms */ - if ( pixel_width >= 0xFFFFU ) - pixel_width = 0xFFFFU; - if ( pixel_height >= 0xFFFFU ) - pixel_height = 0xFFFFU; - metrics->x_ppem = (FT_UShort)pixel_width; metrics->y_ppem = (FT_UShort)pixel_height; @@ -2164,8 +2134,8 @@ if ( kern_mode != FT_KERNING_UNFITTED ) { - akerning->x = FT_PIX_ROUND( akerning->x ); - akerning->y = FT_PIX_ROUND( akerning->y ); + akerning->x = ( akerning->x + 32 ) & -64; + akerning->y = ( akerning->y + 32 ) & -64; } } } @@ -2398,15 +2368,21 @@ if ( face && FT_HAS_GLYPH_NAMES( face ) ) { - FT_Service_GlyphDict service; + /* now, lookup for glyph name */ + FT_Driver driver = face->driver; + FT_Module_Class* clazz = FT_MODULE_CLASS( driver ); - FT_FACE_LOOKUP_SERVICE( face, - service, - GLYPH_DICT ); + if ( clazz->get_interface ) + { + FT_Face_GetGlyphNameIndexFunc requester; - if ( service && service->name_index ) - result = service->name_index( face, glyph_name ); + + requester = (FT_Face_GetGlyphNameIndexFunc)clazz->get_interface( + FT_MODULE( driver ), "name_index" ); + if ( requester ) + result = requester( face, glyph_name ); + } } return result; @@ -2432,15 +2408,21 @@ glyph_index <= (FT_UInt)face->num_glyphs && FT_HAS_GLYPH_NAMES( face ) ) { - FT_Service_GlyphDict service; + /* now, lookup for glyph name */ + FT_Driver driver = face->driver; + FT_Module_Class* clazz = FT_MODULE_CLASS( driver ); - FT_FACE_LOOKUP_SERVICE( face, - service, - GLYPH_DICT ); + if ( clazz->get_interface ) + { + FT_Face_GetGlyphNameFunc requester; - if ( service && service->get_name ) - error = service->get_name( face, glyph_index, buffer, buffer_max ); + + requester = (FT_Face_GetGlyphNameFunc)clazz->get_interface( + FT_MODULE( driver ), "glyph_name" ); + if ( requester ) + error = requester( face, glyph_index, buffer, buffer_max ); + } } return error; @@ -2458,19 +2440,25 @@ if ( !face ) goto Exit; + result = face->internal->postscript_name; if ( !result ) { - FT_Service_PsFontName service; + /* now, look up glyph name */ + FT_Driver driver = face->driver; + FT_Module_Class* clazz = FT_MODULE_CLASS( driver ); - FT_FACE_LOOKUP_SERVICE( face, - service, - POSTSCRIPT_FONT_NAME ); + if ( clazz->get_interface ) + { + FT_Face_GetPostscriptNameFunc requester; - if ( service && service->get_ps_font_name ) - result = service->get_ps_font_name( face ); + + requester = (FT_Face_GetPostscriptNameFunc)clazz->get_interface( + FT_MODULE( driver ), "postscript_name" ); + if ( requester ) + result = requester( face ); + } } - Exit: return result; } @@ -2482,17 +2470,21 @@ FT_Get_Sfnt_Table( FT_Face face, FT_Sfnt_Tag tag ) { - void* table = 0; - FT_Service_SFNT_Table service; + void* table = 0; + FT_Get_Sfnt_Table_Func func; + FT_Driver driver; - if ( face && FT_IS_SFNT( face ) ) - { - FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); - if ( service != NULL ) - table = service->get_table( face, tag ); - } + if ( !face || !FT_IS_SFNT( face ) ) + goto Exit; + driver = face->driver; + func = (FT_Get_Sfnt_Table_Func)driver->root.clazz->get_interface( + FT_MODULE( driver ), "get_sfnt" ); + if ( func ) + table = func( face, tag ); + + Exit: return table; } @@ -2506,39 +2498,20 @@ FT_Byte* buffer, FT_ULong* length ) { - FT_Service_SFNT_Table service; + SFNT_Load_Table_Func func; + FT_Driver driver; if ( !face || !FT_IS_SFNT( face ) ) return FT_Err_Invalid_Face_Handle; - FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); - if ( service == NULL ) + driver = face->driver; + func = (SFNT_Load_Table_Func) driver->root.clazz->get_interface( + FT_MODULE( driver ), "load_sfnt" ); + if ( !func ) return FT_Err_Unimplemented_Feature; - return service->load_table( face, tag, offset, buffer, length ); - } - - - FT_EXPORT_DEF( FT_ULong ) - FT_Get_CMap_Language_ID( FT_CharMap charmap ) - { - FT_Service_TTCMaps service; - FT_Face face; - TT_CMapInfo cmap_info; - - - if ( !charmap || !charmap->face ) - return 0; - - face = charmap->face; - FT_FACE_FIND_SERVICE( face, service, TT_CMAP ); - if ( service == NULL ) - return 0; - if ( service->get_cmap_info( charmap, &cmap_info )) - return 0; - - return cmap_info.language; + return func( face, tag, offset, buffer, length ); } @@ -3088,50 +3061,6 @@ } - FT_BASE_DEF( FT_Pointer ) - ft_module_get_service( FT_Module module, - const char* service_id ) - { - FT_Pointer result = NULL; - - if ( module ) - { - FT_ASSERT( module->clazz && module->clazz->get_interface ); - - /* first, look for the service in the module - */ - if ( module->clazz->get_interface ) - result = module->clazz->get_interface( module, service_id ); - - if ( result == NULL ) - { - /* we didn't find it, look in all other modules then - */ - FT_Library library = module->library; - FT_Module* cur = library->modules; - FT_Module* limit = cur + library->num_modules; - - for ( ; cur < limit; cur++ ) - { - if ( cur[0] != module ) - { - FT_ASSERT( cur[0]->clazz ); - - if ( cur[0]->clazz->get_interface ) - { - result = cur[0]->clazz->get_interface( cur[0], service_id ); - if ( result != NULL ) - break; - } - } - } - } - } - - return result; - } - - /* documentation is in ftmodule.h */ FT_EXPORT_DEF( FT_Error ) diff --git a/reactos/lib/freetype/src/base/ftoutln.c b/reactos/lib/freetype/src/base/ftoutln.c index 5cae931f67e..c59043bc049 100644 --- a/reactos/lib/freetype/src/base/ftoutln.c +++ b/reactos/lib/freetype/src/base/ftoutln.c @@ -4,7 +4,7 @@ /* */ /* FreeType outline management (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -26,7 +26,6 @@ #include <ft2build.h> #include FT_OUTLINE_H #include FT_INTERNAL_OBJECTS_H -#include FT_TRIGONOMETRY_H /*************************************************************************/ @@ -358,11 +357,14 @@ source->n_contours != target->n_contours ) return FT_Err_Invalid_Argument; - FT_ARRAY_COPY( target->points, source->points, source->n_points ); + FT_MEM_COPY( target->points, source->points, + source->n_points * sizeof ( FT_Vector ) ); - FT_ARRAY_COPY( target->tags, source->tags, source->n_points ); + FT_MEM_COPY( target->tags, source->tags, + source->n_points * sizeof ( FT_Byte ) ); - FT_ARRAY_COPY( target->contours, source->contours, source->n_contours ); + FT_MEM_COPY( target->contours, source->contours, + source->n_contours * sizeof ( FT_Short ) ); /* copy all flags, except the `FT_OUTLINE_OWNER' one */ is_owner = target->flags & FT_OUTLINE_OWNER; @@ -653,143 +655,4 @@ } - typedef struct FT_OrientationExtremumRec_ - { - FT_Int index; - FT_Long pos; - FT_Int first; - FT_Int last; - - } FT_OrientationExtremumRec; - - - static FT_Orientation - ft_orientation_extremum_compute( FT_OrientationExtremumRec* extremum, - FT_Outline* outline ) - { - FT_Vector *point, *first, *last, *prev, *next; - FT_Vector* points = outline->points; - FT_Angle angle_in, angle_out; - - - /* compute the previous and next points in the same contour */ - point = points + extremum->index; - first = points + extremum->first; - last = points + extremum->last; - - prev = point; - next = point; - - do - { - prev = ( prev == first ) ? last : prev - 1; - if ( prev == point ) - return FT_ORIENTATION_TRUETYPE; /* degenerate case */ - - } while ( prev->x != point->x || prev->y != point->y ); - - do - { - next = ( next == last ) ? first : next + 1; - if ( next == point ) - return FT_ORIENTATION_TRUETYPE; /* shouldn't happen */ - - } while ( next->x != point->x || next->y != point->y ); - - /* now compute the orientation of the `out' vector relative */ - /* to the `in' vector. */ - angle_in = FT_Atan2( point->x - prev->x, point->y - prev->y ); - angle_out = FT_Atan2( next->x - point->x, next->y - point->y ); - - return ( FT_Angle_Diff( angle_in, angle_out ) >= 0 ) - ? FT_ORIENTATION_TRUETYPE - : FT_ORIENTATION_POSTSCRIPT; - } - - - FT_EXPORT_DEF( FT_Orientation ) - FT_Outline_Get_Orientation( FT_Outline* outline ) - { - FT_Orientation result = FT_ORIENTATION_TRUETYPE; - - - if ( outline && outline->n_points > 0 ) - { - FT_OrientationExtremumRec xmin, ymin, xmax, ymax; - FT_Int n; - FT_Int first, last; - FT_Vector* points = outline->points; - - - xmin.pos = ymin.pos = +32768L; - xmax.pos = ymax.pos = -32768L; - - xmin.index = ymin.index = xmax.index = ymax.index = -1; - - first = 0; - for ( n = 0; n < outline->n_contours; n++, first = last + 1 ) - { - last = outline->contours[n]; - - /* skip single-point contours; these are degenerated cases */ - if ( last > first + 1 ) - { - FT_Int i; - - - for ( i = first; i < last; i++ ) - { - FT_Pos x = points[i].x; - FT_Pos y = points[i].y; - - - if ( x < xmin.pos ) - { - xmin.pos = x; - xmin.index = i; - xmin.first = first; - xmin.last = last; - } - if ( x > xmax.pos ) - { - xmax.pos = x; - xmax.index = i; - xmax.first = first; - xmax.last = last; - } - if ( y < ymin.pos ) - { - ymin.pos = y; - ymin.index = i; - ymin.first = first; - ymin.last = last; - } - if ( y > ymax.pos ) - { - ymax.pos = y; - ymax.index = i; - ymax.first = first; - ymax.last = last; - } - } - } - - if ( xmin.index >= 0 ) - result = ft_orientation_extremum_compute( &xmin, outline ); - - else if ( xmax.index >= 0 ) - result = ft_orientation_extremum_compute( &xmax, outline ); - - else if ( ymin.index >= 0 ) - result = ft_orientation_extremum_compute( &ymin, outline ); - - else if ( ymax.index >= 0 ) - result = ft_orientation_extremum_compute( &ymax, outline ); - } - } - - return result; - } - - /* END */ diff --git a/reactos/lib/freetype/src/base/ftpfr.c b/reactos/lib/freetype/src/base/ftpfr.c index fb959e37fc9..d9594cb788a 100644 --- a/reactos/lib/freetype/src/base/ftpfr.c +++ b/reactos/lib/freetype/src/base/ftpfr.c @@ -16,20 +16,34 @@ /***************************************************************************/ #include <ft2build.h> +#include FT_INTERNAL_PFR_H #include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_PFR_H /* check the format */ - static FT_Service_PfrMetrics - ft_pfr_check( FT_Face face ) + static FT_Error + ft_pfr_check( FT_Face face, + FT_PFR_Service *aservice ) { - FT_Service_PfrMetrics service; + FT_Error error = FT_Err_Bad_Argument; - FT_FACE_LOOKUP_SERVICE( face, service, PFR_METRICS ); + if ( face && face->driver ) + { + FT_Module module = (FT_Module) face->driver; + const char* name = module->clazz->module_name; - return service; + + if ( name[0] == 'p' && + name[1] == 'f' && + name[2] == 'r' && + name[4] == 0 ) + { + *aservice = (FT_PFR_Service) module->clazz->module_interface; + error = 0; + } + } + return error; } @@ -40,12 +54,12 @@ FT_Fixed *ametrics_x_scale, FT_Fixed *ametrics_y_scale ) { - FT_Error error = FT_Err_Ok; - FT_Service_PfrMetrics service; + FT_Error error; + FT_PFR_Service service; - service = ft_pfr_check( face ); - if ( service ) + error = ft_pfr_check( face, &service ); + if ( !error ) { error = service->get_metrics( face, aoutline_resolution, @@ -53,27 +67,6 @@ ametrics_x_scale, ametrics_y_scale ); } - else if ( face ) - { - FT_Fixed x_scale, y_scale; - - - /* this is not a PFR font */ - *aoutline_resolution = face->units_per_EM; - *ametrics_resolution = face->units_per_EM; - - x_scale = y_scale = 0x10000L; - if ( face->size ) - { - x_scale = face->size->metrics.x_scale; - y_scale = face->size->metrics.y_scale; - } - *ametrics_x_scale = x_scale; - *ametrics_y_scale = y_scale; - } - else - error = FT_Err_Invalid_Argument; - return error; } @@ -84,19 +77,15 @@ FT_UInt right, FT_Vector *avector ) { - FT_Error error; - FT_Service_PfrMetrics service; + FT_Error error; + FT_PFR_Service service; - service = ft_pfr_check( face ); - if ( service ) + error = ft_pfr_check( face, &service ); + if ( !error ) + { error = service->get_kerning( face, left, right, avector ); - else if ( face ) - error = FT_Get_Kerning( face, left, right, - FT_KERNING_UNSCALED, avector ); - else - error = FT_Err_Invalid_Argument; - + } return error; } @@ -106,19 +95,15 @@ FT_UInt gindex, FT_Pos *aadvance ) { - FT_Error error; - FT_Service_PfrMetrics service; + FT_Error error; + FT_PFR_Service service; - service = ft_pfr_check( face ); - if ( service ) + error = ft_pfr_check( face, &service ); + if ( !error ) { error = service->get_advance( face, gindex, aadvance ); } - else - /* XXX: TODO: PROVIDE ADVANCE-LOADING METHOD TO ALL FONT DRIVERS */ - error = FT_Err_Invalid_Argument; - return error; } diff --git a/reactos/lib/freetype/src/base/ftstroke.c b/reactos/lib/freetype/src/base/ftstroke.c index 942820ad960..d6d5be3211e 100644 --- a/reactos/lib/freetype/src/base/ftstroke.c +++ b/reactos/lib/freetype/src/base/ftstroke.c @@ -4,7 +4,7 @@ /* */ /* FreeType path stroker (body). */ /* */ -/* Copyright 2002, 2003, 2004 by */ +/* Copyright 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -19,31 +19,8 @@ #include <ft2build.h> #include FT_STROKER_H #include FT_TRIGONOMETRY_H -#include FT_OUTLINE_H #include FT_INTERNAL_MEMORY_H #include FT_INTERNAL_DEBUG_H -#include FT_INTERNAL_OBJECTS_H - - FT_EXPORT_DEF( FT_StrokerBorder ) - FT_Outline_GetInsideBorder( FT_Outline* outline ) - { - FT_Orientation o = FT_Outline_Get_Orientation( outline ); - - - return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_RIGHT - : FT_STROKER_BORDER_LEFT ; - } - - - FT_EXPORT_DEF( FT_StrokerBorder ) - FT_Outline_GetOutsideBorder( FT_Outline* outline ) - { - FT_Orientation o = FT_Outline_Get_Orientation( outline ); - - - return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_LEFT - : FT_STROKER_BORDER_RIGHT ; - } /***************************************************************************/ @@ -244,7 +221,6 @@ FT_Bool movable; FT_Int start; /* index of current sub-path start point */ FT_Memory memory; - FT_Bool valid; } FT_StrokeBorderRec, *FT_StrokeBorder; @@ -492,7 +468,6 @@ border->num_points = 0; border->max_points = 0; border->start = -1; - border->valid = 0; } @@ -501,7 +476,6 @@ { border->num_points = 0; border->start = -1; - border->valid = 0; } @@ -517,7 +491,6 @@ border->num_points = 0; border->max_points = 0; border->start = -1; - border->valid = 0; } @@ -547,7 +520,7 @@ } else if ( in_contour == 0 ) goto Fail; - + if ( tags[0] & FT_STROKE_TAG_END ) { if ( in_contour == 0 ) @@ -561,8 +534,6 @@ if ( in_contour != 0 ) goto Fail; - border->valid = 1; - Exit: *anum_points = num_points; *anum_contours = num_contours; @@ -580,9 +551,9 @@ FT_Outline* outline ) { /* copy point locations */ - FT_ARRAY_COPY( outline->points + outline->n_points, - border->points, - border->num_points ); + FT_MEM_COPY( outline->points + outline->n_points, + border->points, + border->num_points * sizeof ( FT_Vector ) ); /* copy tags */ { @@ -690,18 +661,10 @@ stroker->line_join = line_join; stroker->miter_limit = miter_limit; - FT_Stroker_Rewind( stroker ); - } + stroker->valid = 0; - - FT_EXPORT_DEF( void ) - FT_Stroker_Rewind( FT_Stroker stroker ) - { - if ( stroker ) - { - ft_stroke_border_reset( &stroker->borders[0] ); - ft_stroke_border_reset( &stroker->borders[1] ); - } + ft_stroke_border_reset( &stroker->borders[0] ); + ft_stroke_border_reset( &stroker->borders[1] ); } @@ -1384,6 +1347,7 @@ { FT_Error error = 0; + if ( stroker->subpath_open ) { FT_StrokeBorder right = stroker->borders; @@ -1416,14 +1380,6 @@ FT_Angle turn; FT_Int inside_side; - /* close the path if needed */ - if ( stroker->center.x != stroker->subpath_start.x || - stroker->center.y != stroker->subpath_start.y ) - { - error = FT_Stroker_LineTo( stroker, &stroker->subpath_start ); - if ( error ) - goto Exit; - } /* process the corner */ stroker->angle_out = stroker->subpath_angle; @@ -1452,9 +1408,14 @@ goto Exit; } - /* then end our two subpaths */ + /* we will first end our two subpaths */ ft_stroke_border_close( stroker->borders + 0 ); ft_stroke_border_close( stroker->borders + 1 ); + + /* now, add the reversed left subpath to "right" */ + error = ft_stroker_add_reverse_left( stroker, 0 ); + if ( error ) + goto Exit; } Exit: @@ -1462,35 +1423,6 @@ } - FT_EXPORT_DEF( FT_Error ) - FT_Stroker_GetBorderCounts( FT_Stroker stroker, - FT_StrokerBorder border, - FT_UInt *anum_points, - FT_UInt *anum_contours ) - { - FT_UInt num_points = 0, num_contours = 0; - FT_Error error; - - - if ( !stroker || border > 1 ) - { - error = FT_Err_Invalid_Argument; - goto Exit; - } - - error = ft_stroke_border_get_counts( stroker->borders + border, - &num_points, &num_contours ); - Exit: - if ( anum_points ) - *anum_points = num_points; - - if ( anum_contours ) - *anum_contours = num_contours; - - return error; - } - - FT_EXPORT_DEF( FT_Error ) FT_Stroker_GetCounts( FT_Stroker stroker, FT_UInt *anum_points, @@ -1514,6 +1446,8 @@ num_points = count1 + count3; num_contours = count2 + count4; + stroker->valid = 1; + Exit: *anum_points = num_points; *anum_contours = num_contours; @@ -1521,29 +1455,15 @@ } - FT_EXPORT_DEF( void ) - FT_Stroker_ExportBorder( FT_Stroker stroker, - FT_StrokerBorder border, - FT_Outline* outline ) - { - if ( border == FT_STROKER_BORDER_LEFT || - border == FT_STROKER_BORDER_RIGHT ) - { - FT_StrokeBorder sborder = & stroker->borders[border]; - - - if ( sborder->valid ) - ft_stroke_border_export( sborder, outline ); - } - } - - FT_EXPORT_DEF( void ) FT_Stroker_Export( FT_Stroker stroker, FT_Outline* outline ) { - FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_LEFT, outline ); - FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_RIGHT, outline ); + if ( stroker->valid ) + { + ft_stroke_border_export( stroker->borders + 0, outline ); + ft_stroke_border_export( stroker->borders + 1, outline ); + } } @@ -1574,8 +1494,6 @@ if ( !outline || !stroker ) return FT_Err_Invalid_Argument; - FT_Stroker_Rewind( stroker ); - first = 0; for ( n = 0; n < outline->n_contours; n++ ) @@ -1746,156 +1664,4 @@ } - extern const FT_Glyph_Class ft_outline_glyph_class; - - - FT_EXPORT_DEF( FT_Error ) - FT_Glyph_Stroke( FT_Glyph *pglyph, - FT_Stroker stroker, - FT_Bool destroy ) - { - FT_Error error = FT_Err_Invalid_Argument; - FT_Glyph glyph = NULL; - - - if ( pglyph == NULL ) - goto Exit; - - glyph = *pglyph; - if ( glyph == NULL || glyph->clazz != &ft_outline_glyph_class ) - goto Exit; - - { - FT_Glyph copy; - - - error = FT_Glyph_Copy( glyph, © ); - if ( error ) - goto Exit; - - glyph = copy; - } - - { - FT_OutlineGlyph oglyph = (FT_OutlineGlyph) glyph; - FT_Outline* outline = &oglyph->outline; - FT_UInt num_points, num_contours; - - - error = FT_Stroker_ParseOutline( stroker, outline, 0 ); - if ( error ) - goto Fail; - - (void)FT_Stroker_GetCounts( stroker, &num_points, &num_contours ); - - FT_Outline_Done( glyph->library, outline ); - - error = FT_Outline_New( glyph->library, - num_points, num_contours, outline ); - if ( error ) - goto Fail; - - outline->n_points = 0; - outline->n_contours = 0; - - FT_Stroker_Export( stroker, outline ); - } - - if ( destroy ) - FT_Done_Glyph( *pglyph ); - - *pglyph = glyph; - goto Exit; - - Fail: - FT_Done_Glyph( glyph ); - glyph = NULL; - - if ( !destroy ) - *pglyph = NULL; - - Exit: - return error; - } - - - FT_EXPORT_DEF( FT_Error ) - FT_Glyph_StrokeBorder( FT_Glyph *pglyph, - FT_Stroker stroker, - FT_Bool inside, - FT_Bool destroy ) - { - FT_Error error = FT_Err_Invalid_Argument; - FT_Glyph glyph = NULL; - - - if ( pglyph == NULL ) - goto Exit; - - glyph = *pglyph; - if ( glyph == NULL || glyph->clazz != &ft_outline_glyph_class ) - goto Exit; - - { - FT_Glyph copy; - - - error = FT_Glyph_Copy( glyph, © ); - if ( error ) - goto Exit; - - glyph = copy; - } - - { - FT_OutlineGlyph oglyph = (FT_OutlineGlyph) glyph; - FT_StrokerBorder border; - FT_Outline* outline = &oglyph->outline; - FT_UInt num_points, num_contours; - - - border = FT_Outline_GetOutsideBorder( outline ); - if ( inside ) - border = 1 - border; - - error = FT_Stroker_ParseOutline( stroker, outline, 0 ); - if ( error ) - goto Fail; - - (void)FT_Stroker_GetBorderCounts( stroker, border, - &num_points, &num_contours ); - - FT_Outline_Done( glyph->library, outline ); - - error = FT_Outline_New( glyph->library, - num_points, - num_contours, - outline ); - if ( error ) - goto Fail; - - outline->n_points = 0; - outline->n_contours = 0; - - FT_Stroker_ExportBorder( stroker, border, outline ); - } - - if ( destroy ) - FT_Done_Glyph( *pglyph ); - - *pglyph = glyph; - goto Exit; - - Fail: - FT_Done_Glyph( glyph ); - glyph = NULL; - - if ( !destroy ) - *pglyph = NULL; - - Exit: - return error; - } - - /* END */ diff --git a/reactos/lib/freetype/src/base/ftsynth.c b/reactos/lib/freetype/src/base/ftsynth.c index cee36822fd2..72979faae57 100644 --- a/reactos/lib/freetype/src/base/ftsynth.c +++ b/reactos/lib/freetype/src/base/ftsynth.c @@ -4,7 +4,7 @@ /* */ /* FreeType synthesizing code for emboldening and slanting (body). */ /* */ -/* Copyright 2000-2001, 2002, 2003 by */ +/* Copyright 2000-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -279,8 +279,7 @@ first = last + 1; } - slot->metrics.horiAdvance = - ( slot->metrics.horiAdvance + distance*4 ) & ~63; + slot->metrics.horiAdvance = ( slot->metrics.horiAdvance + distance*4 ) & -64; } diff --git a/reactos/lib/freetype/src/base/fttrigon.c b/reactos/lib/freetype/src/base/fttrigon.c index 5347dd852a3..82cd3b246fb 100644 --- a/reactos/lib/freetype/src/base/fttrigon.c +++ b/reactos/lib/freetype/src/base/fttrigon.c @@ -17,7 +17,6 @@ #include <ft2build.h> -#include FT_INTERNAL_OBJECTS_H #include FT_TRIGONOMETRY_H @@ -272,9 +271,9 @@ /* round theta */ if ( theta >= 0 ) - theta = FT_PAD_ROUND( theta, 32 ); + theta = ( theta + 16 ) & -32; else - theta = - FT_PAD_ROUND( -theta, 32 ); + theta = - (( -theta + 16 ) & -32); vec->x = x; vec->y = theta; diff --git a/reactos/lib/freetype/src/base/fttype1.c b/reactos/lib/freetype/src/base/fttype1.c index 553b84f56f8..d8b188647d7 100644 --- a/reactos/lib/freetype/src/base/fttype1.c +++ b/reactos/lib/freetype/src/base/fttype1.c @@ -4,7 +4,7 @@ /* */ /* FreeType utility file for PS names support (body). */ /* */ -/* Copyright 2002, 2003 by */ +/* Copyright 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -17,9 +17,9 @@ #include <ft2build.h> +#include FT_INTERNAL_TYPE1_TYPES_H +#include FT_INTERNAL_TYPE42_TYPES_H #include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_SERVICE_H -#include FT_SERVICE_POSTSCRIPT_INFO_H /* documentation is in t1tables.h */ @@ -28,39 +28,56 @@ FT_Get_PS_Font_Info( FT_Face face, PS_FontInfoRec* afont_info ) { - FT_Error error = FT_Err_Invalid_Argument; + PS_FontInfo font_info = NULL; + FT_Error error = FT_Err_Invalid_Argument; + const char* driver_name; - if ( face ) + if ( face && face->driver && face->driver->root.clazz ) { - FT_Service_PsInfo service = NULL; - - - FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); - - if ( service && service->ps_get_font_info ) - error = service->ps_get_font_info( face, afont_info ); + driver_name = face->driver->root.clazz->module_name; + if ( ft_strcmp( driver_name, "type1" ) == 0 ) + font_info = &((T1_Face)face)->type1.font_info; + else if ( ft_strcmp( driver_name, "t1cid" ) == 0 ) + font_info = &((CID_Face)face)->cid.font_info; + else if ( ft_strcmp( driver_name, "type42" ) == 0 ) + font_info = &((T42_Face)face)->type1.font_info; + } + if ( font_info != NULL ) + { + *afont_info = *font_info; + error = FT_Err_Ok; } return error; } + /* XXX: Bad hack, but I didn't want to change several drivers here. */ + /* documentation is in t1tables.h */ FT_EXPORT_DEF( FT_Int ) FT_Has_PS_Glyph_Names( FT_Face face ) { - FT_Int result = 0; - FT_Service_PsInfo service = NULL; + FT_Int result = 0; + const char* driver_name; - if ( face ) + if ( face && face->driver && face->driver->root.clazz ) { - FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); + /* Currently, only the type1, type42, and cff drivers provide */ + /* reliable glyph names... */ - if ( service && service->ps_has_glyph_names ) - result = service->ps_has_glyph_names( face ); + /* We could probably hack the TrueType driver to recognize */ + /* certain cases where the glyph names are most certainly */ + /* correct (e.g. using a 20 or 22 format `post' table), but */ + /* this will probably happen later... */ + + driver_name = face->driver->root.clazz->module_name; + result = ( ft_strcmp( driver_name, "type1" ) == 0 || + ft_strcmp( driver_name, "type42" ) == 0 || + ft_strcmp( driver_name, "cff" ) == 0 ); } return result; diff --git a/reactos/lib/freetype/src/base/ftwinfnt.c b/reactos/lib/freetype/src/base/ftwinfnt.c index 46f618c5182..2cbe343d1c7 100644 --- a/reactos/lib/freetype/src/base/ftwinfnt.c +++ b/reactos/lib/freetype/src/base/ftwinfnt.c @@ -18,30 +18,38 @@ #include <ft2build.h> #include FT_WINFONTS_H +#include FT_INTERNAL_FNT_TYPES_H #include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_WINFNT_H FT_EXPORT_DEF( FT_Error ) FT_Get_WinFNT_Header( FT_Face face, FT_WinFNT_HeaderRec *header ) { - FT_Service_WinFnt service; - FT_Error error; + FT_Error error; error = FT_Err_Invalid_Argument; - if ( face != NULL ) + if ( face != NULL && face->driver != NULL ) { - FT_FACE_LOOKUP_SERVICE( face, service, WINFNT ); + FT_Module driver = (FT_Module) face->driver; - if ( service != NULL ) + + if ( driver->clazz && driver->clazz->module_name && + ft_strcmp( driver->clazz->module_name, "winfonts" ) == 0 ) { - error = service->get_header( face, header ); + FNT_Face fnt_face = (FNT_Face)face; + FNT_Font font = fnt_face->font; + + + if ( font ) + { + FT_MEM_COPY( header, &font->header, sizeof ( *header ) ); + error = FT_Err_Ok; + } } } - return error; } diff --git a/reactos/lib/freetype/src/base/ftxf86.c b/reactos/lib/freetype/src/base/ftxf86.c index 04e80236e61..1f5e42ced47 100644 --- a/reactos/lib/freetype/src/base/ftxf86.c +++ b/reactos/lib/freetype/src/base/ftxf86.c @@ -4,7 +4,7 @@ /* */ /* FreeType utility file for X11 support (body). */ /* */ -/* Copyright 2002, 2003 by */ +/* Copyright 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -19,16 +19,59 @@ #include <ft2build.h> #include FT_XFREE86_H #include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_XFREE86_NAME_H + + /* XXX: This really is a sad hack, but I didn't want to change every */ + /* driver just to support this at the moment, since other important */ + /* changes are coming anyway. */ + + typedef struct FT_FontFormatRec_ + { + const char* driver_name; + const char* format_name; + + } FT_FontFormatRec; + FT_EXPORT_DEF( const char* ) FT_Get_X11_Font_Format( FT_Face face ) { + static const FT_FontFormatRec font_formats[] = + { + { "type1", "Type 1" }, + { "truetype", "TrueType" }, + { "bdf", "BDF" }, + { "pcf", "PCF" }, + { "type42", "Type 42" }, + { "cidtype1", "CID Type 1" }, + { "cff", "CFF" }, + { "pfr", "PFR" }, + { "winfonts", "Windows FNT" } + }; + const char* result = NULL; - if ( face ) - FT_FACE_FIND_SERVICE( face, result, XF86_NAME ); + if ( face && face->driver ) + { + FT_Module driver = (FT_Module)face->driver; + + + if ( driver->clazz && driver->clazz->module_name ) + { + FT_Int n; + FT_Int count = sizeof( font_formats ) / sizeof ( font_formats[0] ); + + + result = driver->clazz->module_name; + + for ( n = 0; n < count; n++ ) + if ( ft_strcmp( result, font_formats[n].driver_name ) == 0 ) + { + result = font_formats[n].format_name; + break; + } + } + } return result; } diff --git a/reactos/lib/freetype/src/bdf/bdfdrivr.c b/reactos/lib/freetype/src/bdf/bdfdrivr.c index a231fcd4fce..dbd4a2f6475 100644 --- a/reactos/lib/freetype/src/bdf/bdfdrivr.c +++ b/reactos/lib/freetype/src/bdf/bdfdrivr.c @@ -31,9 +31,6 @@ THE SOFTWARE. #include FT_INTERNAL_OBJECTS_H #include FT_BDF_H -#include FT_SERVICE_BDF_H -#include FT_SERVICE_XFREE86_NAME_H - #include "bdf.h" #include "bdfdrivr.h" @@ -172,118 +169,6 @@ THE SOFTWARE. }; - static FT_Error - bdf_interpret_style( BDF_Face bdf ) - { - FT_Error error = BDF_Err_Ok; - FT_Face face = FT_FACE( bdf ); - FT_Memory memory = face->memory; - bdf_font_t* font = bdf->bdffont; - bdf_property_t* prop; - - char *istr = NULL, *bstr = NULL; - char *sstr = NULL, *astr = NULL; - - int parts = 0, len = 0; - - - face->style_flags = 0; - - prop = bdf_get_font_property( font, (char *)"SLANT" ); - if ( prop && prop->format == BDF_ATOM && - prop->value.atom && - ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' || - *(prop->value.atom) == 'I' || *(prop->value.atom) == 'i' ) ) - { - face->style_flags |= FT_STYLE_FLAG_ITALIC; - istr = ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' ) - ? (char *)"Oblique" - : (char *)"Italic"; - len += ft_strlen( istr ); - parts++; - } - - prop = bdf_get_font_property( font, (char *)"WEIGHT_NAME" ); - if ( prop && prop->format == BDF_ATOM && - prop->value.atom && - ( *(prop->value.atom) == 'B' || *(prop->value.atom) == 'b' ) ) - { - face->style_flags |= FT_STYLE_FLAG_BOLD; - bstr = (char *)"Bold"; - len += ft_strlen( bstr ); - parts++; - } - - prop = bdf_get_font_property( font, (char *)"SETWIDTH_NAME" ); - if ( prop && prop->format == BDF_ATOM && - prop->value.atom && *(prop->value.atom) && - !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) - { - sstr = (char *)(prop->value.atom); - len += ft_strlen( sstr ); - parts++; - } - - prop = bdf_get_font_property( font, (char *)"ADD_STYLE_NAME" ); - if ( prop && prop->format == BDF_ATOM && - prop->value.atom && *(prop->value.atom) && - !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) - { - astr = (char *)(prop->value.atom); - len += ft_strlen( astr ); - parts++; - } - - if ( !parts || !len ) - face->style_name = (char *)"Regular"; - else - { - char *style, *s; - unsigned int i; - - - if ( FT_ALLOC( style, len + parts ) ) - return error; - - s = style; - - if ( astr ) - { - ft_strcpy( s, astr ); - for ( i = 0; i < ft_strlen( astr ); i++, s++ ) - if ( *s == ' ' ) - *s = '-'; /* replace spaces with dashes */ - *(s++) = ' '; - } - if ( bstr ) - { - ft_strcpy( s, bstr ); - s += ft_strlen( bstr ); - *(s++) = ' '; - } - if ( istr ) - { - ft_strcpy( s, istr ); - s += ft_strlen( istr ); - *(s++) = ' '; - } - if ( sstr ) - { - ft_strcpy( s, sstr ); - for ( i = 0; i < ft_strlen( sstr ); i++, s++ ) - if ( *s == ' ' ) - *s = '-'; /* replace spaces with dashes */ - *(s++) = ' '; - } - *(--s) = '\0'; /* overwrite last ' ', terminate the string */ - - face->style_name = style; /* allocated string */ - } - - return error; - } - - FT_CALLBACK_DEF( FT_Error ) BDF_Face_Done( BDF_Face face ) { @@ -364,17 +249,39 @@ THE SOFTWARE. FT_FACE_FLAG_FAST_GLYPHS; prop = bdf_get_font_property( font, "SPACING" ); - if ( prop && prop->format == BDF_ATOM && - prop->value.atom && - ( *(prop->value.atom) == 'M' || *(prop->value.atom) == 'm' || - *(prop->value.atom) == 'C' || *(prop->value.atom) == 'c' ) ) - root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; + if ( prop != NULL ) + if ( prop->format == BDF_ATOM ) + if ( prop->value.atom != NULL ) + if ( ( *(prop->value.atom) == 'M' ) || + ( *(prop->value.atom) == 'm' ) || + ( *(prop->value.atom) == 'C' ) || + ( *(prop->value.atom) == 'c' ) ) + root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; /* FZ XXX: TO DO: FT_FACE_FLAGS_VERTICAL */ /* FZ XXX: I need a font to implement this */ + root->style_flags = 0; + prop = bdf_get_font_property( font, "SLANT" ); + if ( prop != NULL ) + if ( prop->format == BDF_ATOM ) + if ( prop->value.atom != NULL ) + if ( ( *(prop->value.atom) == 'O' ) || + ( *(prop->value.atom) == 'o' ) || + ( *(prop->value.atom) == 'I' ) || + ( *(prop->value.atom) == 'i' ) ) + root->style_flags |= FT_STYLE_FLAG_ITALIC; + + prop = bdf_get_font_property( font, "WEIGHT_NAME" ); + if ( prop != NULL ) + if ( prop->format == BDF_ATOM ) + if ( prop->value.atom != NULL ) + if ( ( *(prop->value.atom) == 'B' ) || + ( *(prop->value.atom) == 'b' ) ) + root->style_flags |= FT_STYLE_FLAG_BOLD; + prop = bdf_get_font_property( font, "FAMILY_NAME" ); - if ( prop && prop->value.atom ) + if ( ( prop != NULL ) && ( prop->value.atom != NULL ) ) { int l = ft_strlen( prop->value.atom ) + 1; @@ -386,8 +293,16 @@ THE SOFTWARE. else root->family_name = 0; - if ( ( error = bdf_interpret_style( face ) ) != 0 ) - goto Exit; + root->style_name = (char *)"Regular"; + if ( root->style_flags & FT_STYLE_FLAG_BOLD ) + { + if ( root->style_flags & FT_STYLE_FLAG_ITALIC ) + root->style_name = (char *)"Bold Italic"; + else + root->style_name = (char *)"Bold"; + } + else if ( root->style_flags & FT_STYLE_FLAG_ITALIC ) + root->style_name = (char *)"Italic"; root->num_glyphs = font->glyphs_size; /* unencoded included */ @@ -402,26 +317,26 @@ THE SOFTWARE. FT_MEM_ZERO( bsize, sizeof ( FT_Bitmap_Size ) ); prop = bdf_get_font_property( font, "PIXEL_SIZE" ); - if ( prop ) + if ( prop != NULL ) bsize->height = (FT_Short)prop->value.int32; prop = bdf_get_font_property( font, "AVERAGE_WIDTH" ); - if ( prop ) + if ( prop != NULL ) bsize->width = (FT_Short)( ( prop->value.int32 + 5 ) / 10 ); prop = bdf_get_font_property( font, "POINT_SIZE" ); - if ( prop ) + if ( prop != NULL ) /* convert from 722.7 decipoints to 72 points per inch */ bsize->size = (FT_Pos)( ( prop->value.int32 * 64 * 7200 + 36135L ) / 72270L ); prop = bdf_get_font_property( font, "RESOLUTION_X" ); - if ( prop ) + if ( prop != NULL ) bsize->x_ppem = (FT_Pos)( ( prop->value.int32 * bsize->size + 36 ) / 72 ); prop = bdf_get_font_property( font, "RESOLUTION_Y" ); - if ( prop ) + if ( prop != NULL ) bsize->y_ppem = (FT_Pos)( ( prop->value.int32 * bsize->size + 36 ) / 72 ); @@ -463,12 +378,12 @@ THE SOFTWARE. bdf_get_font_property( font, "CHARSET_REGISTRY" ); charset_encoding = bdf_get_font_property( font, "CHARSET_ENCODING" ); - if ( charset_registry && charset_encoding ) + if ( ( charset_registry != NULL ) && ( charset_encoding != NULL ) ) { - if ( charset_registry->format == BDF_ATOM && - charset_encoding->format == BDF_ATOM && - charset_registry->value.atom && - charset_encoding->value.atom ) + if ( ( charset_registry->format == BDF_ATOM ) && + ( charset_encoding->format == BDF_ATOM ) && + ( charset_registry->value.atom != NULL ) && + ( charset_encoding->value.atom != NULL ) ) { const char* s; @@ -734,12 +649,6 @@ THE SOFTWARE. } - /* - * - * BDF SERVICE - * - */ - static FT_Error bdf_get_bdf_property( BDF_Face face, const char* prop_name, @@ -751,7 +660,7 @@ THE SOFTWARE. FT_ASSERT( face && face->bdffont ); prop = bdf_get_font_property( face->bdffont, prop_name ); - if ( prop ) + if ( prop != NULL ) { switch ( prop->format ) { @@ -780,38 +689,6 @@ THE SOFTWARE. return BDF_Err_Invalid_Argument; } - static FT_Error - bdf_get_charset_id( BDF_Face face, - const char* *acharset_encoding, - const char* *acharset_registry ) - { - *acharset_encoding = face->charset_encoding; - *acharset_registry = face->charset_registry; - - return 0; - } - - - static const FT_Service_BDFRec bdf_service_bdf = - { - (FT_BDF_GetCharsetIdFunc)bdf_get_charset_id, - (FT_BDF_GetPropertyFunc) bdf_get_bdf_property - }; - - - /* - * - * SERVICES LIST - * - */ - - static const FT_ServiceDescRec bdf_services[] = - { - { FT_SERVICE_ID_BDF, &bdf_service_bdf }, - { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_BDF }, - { NULL, NULL } - }; - static FT_Module_Interface bdf_driver_requester( FT_Module module, @@ -819,9 +696,11 @@ THE SOFTWARE. { FT_UNUSED( module ); - return ft_service_list_lookup( bdf_services, name ); - } + if ( name && ft_strcmp( name, "get_bdf_property" ) == 0 ) + return (FT_Module_Interface)bdf_get_bdf_property; + return NULL; + } FT_CALLBACK_TABLE_DEF diff --git a/reactos/lib/freetype/src/bdf/bdfdrivr.h b/reactos/lib/freetype/src/bdf/bdfdrivr.h index 148041ff24d..1e0224c33d2 100644 --- a/reactos/lib/freetype/src/bdf/bdfdrivr.h +++ b/reactos/lib/freetype/src/bdf/bdfdrivr.h @@ -2,7 +2,7 @@ FreeType font driver for bdf fonts - Copyright (C) 2001, 2002, 2003 by + Copyright (C) 2001, 2002 by Francesco Zappa Nardelli Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/reactos/lib/freetype/src/bdf/bdflib.c b/reactos/lib/freetype/src/bdf/bdflib.c index b4066db46a0..2d90b4c5bb1 100644 --- a/reactos/lib/freetype/src/bdf/bdflib.c +++ b/reactos/lib/freetype/src/bdf/bdflib.c @@ -163,7 +163,7 @@ { (char *)"_MULE_RELATIVE_COMPOSE", BDF_INTEGER, 1, { 0 } }, }; - static const unsigned long + static unsigned long _num_bdf_properties = sizeof ( _bdf_properties ) / sizeof ( _bdf_properties[0] ); @@ -391,7 +391,7 @@ /* An empty string for empty fields. */ - static const char empty[1] = { 0 }; /* XXX eliminate this */ + static char empty[1] = { 0 }; /* XXX eliminate this */ /* Assume the line is NULL-terminated and that the `list' parameter */ @@ -468,7 +468,7 @@ } /* Assign the field appropriately. */ - list->field[list->used++] = ( ep > sp ) ? sp : (char*)empty; + list->field[list->used++] = ( ep > sp ) ? sp : empty; sp = ep; @@ -511,7 +511,7 @@ } if ( final_empty ) - list->field[list->used++] = (char*)empty; + list->field[list->used++] = empty; if ( list->used == list->size ) { diff --git a/reactos/lib/freetype/src/cache/Jamfile b/reactos/lib/freetype/src/cache/Jamfile index b269c9557bb..099fd5e3653 100644 --- a/reactos/lib/freetype/src/cache/Jamfile +++ b/reactos/lib/freetype/src/cache/Jamfile @@ -1,4 +1,4 @@ -# FreeType 2 src/cache Jamfile (c) 2001, 2003, 2004 David Turner +# FreeType 2 src/cache Jamfile (c) 2001 David Turner # SubDir FT2_TOP $(FT2_SRC_DIR) cache ; @@ -14,15 +14,7 @@ HDRMACRO [ FT2_SubDir include ftcache.h ] ; if $(FT2_MULTI) { - _sources = ftcmru - ftcmanag - ftccache - ftcglyph - ftcsbits - ftcimage - ftcbasic - ftccmap - ; + _sources = ftlru ftcmanag ftccache ftcglyph ftcsbits ftcimage ftccmap ; } else { diff --git a/reactos/lib/freetype/src/cache/descrip.mms b/reactos/lib/freetype/src/cache/descrip.mms index 4d967dc1815..ea12f2e3766 100644 --- a/reactos/lib/freetype/src/cache/descrip.mms +++ b/reactos/lib/freetype/src/cache/descrip.mms @@ -3,7 +3,7 @@ # -# Copyright 2001, 2002, 2003, 2004 by +# Copyright 2001, 2002 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, @@ -20,6 +20,7 @@ OBJS=ftcache.obj all : $(OBJS) library [--.lib]freetype.olb $(OBJS) -ftcache.obj : ftcache.c +ftcache.obj : ftcache.c ftlru.c ftcmanag.c ftccache.c ftcglyph.c ftcimage.c \ + ftcsbits.c ftccmap.c # EOF diff --git a/reactos/lib/freetype/src/cache/ftcache.c b/reactos/lib/freetype/src/cache/ftcache.c index d41e91e5ec1..07e85e1ea47 100644 --- a/reactos/lib/freetype/src/cache/ftcache.c +++ b/reactos/lib/freetype/src/cache/ftcache.c @@ -4,7 +4,7 @@ /* */ /* The FreeType Caching sub-system (body only). */ /* */ -/* Copyright 2000-2001, 2003 by */ +/* Copyright 2000-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -19,13 +19,13 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT #include <ft2build.h> -#include "ftcmru.c" +#include "ftlru.c" #include "ftcmanag.c" #include "ftccache.c" -#include "ftccmap.c" #include "ftcglyph.c" #include "ftcimage.c" #include "ftcsbits.c" -#include "ftcbasic.c" +#include "ftccmap.c" + /* END */ diff --git a/reactos/lib/freetype/src/cache/ftcbasic.c b/reactos/lib/freetype/src/cache/ftcbasic.c deleted file mode 100644 index f7d7ab048ef..00000000000 --- a/reactos/lib/freetype/src/cache/ftcbasic.c +++ /dev/null @@ -1,420 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftcbasic.c */ -/* */ -/* The FreeType basic cache interface (body). */ -/* */ -/* Copyright 2003, 2004 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_CACHE_H -#include FT_CACHE_INTERNAL_GLYPH_H -#include FT_CACHE_INTERNAL_IMAGE_H -#include FT_CACHE_INTERNAL_SBITS_H -#include FT_INTERNAL_MEMORY_H - -#include "ftcerror.h" - - - /* - * Basic Families - * - */ - typedef struct FTC_BasicAttrRec_ - { - FTC_ScalerRec scaler; - FT_UInt load_flags; - - } FTC_BasicAttrRec, *FTC_BasicAttrs; - -#define FTC_BASIC_ATTR_COMPARE( a, b ) \ - ( FTC_SCALER_COMPARE( &(a)->scaler, &(b)->scaler ) && \ - (a)->load_flags == (b)->load_flags ) - -#define FTC_BASIC_ATTR_HASH( a ) \ - ( FTC_SCALER_HASH( &(a)->scaler ) + 31*(a)->load_flags ) - - - typedef struct FTC_BasicQueryRec_ - { - FTC_GQueryRec gquery; - FTC_BasicAttrRec attrs; - - } FTC_BasicQueryRec, *FTC_BasicQuery; - - - typedef struct FTC_BasicFamilyRec_ - { - FTC_FamilyRec family; - FTC_BasicAttrRec attrs; - - } FTC_BasicFamilyRec, *FTC_BasicFamily; - - - static FT_Bool - ftc_basic_family_compare( FTC_BasicFamily family, - FTC_BasicQuery query ) - { - return FT_BOOL( FTC_BASIC_ATTR_COMPARE( &family->attrs, &query->attrs ) ); - } - - - static FT_Error - ftc_basic_family_init( FTC_BasicFamily family, - FTC_BasicQuery query, - FTC_Cache cache ) - { - FTC_Family_Init( FTC_FAMILY( family ), cache ); - family->attrs = query->attrs; - return 0; - } - - - static FT_UInt - ftc_basic_family_get_count( FTC_BasicFamily family, - FTC_Manager manager ) - { - FT_Error error; - FT_Face face; - FT_UInt result = 0; - - - error = FTC_Manager_LookupFace( manager, family->attrs.scaler.face_id, - &face ); - if ( !error ) - result = face->num_glyphs; - - return result; - } - - - static FT_Error - ftc_basic_family_load_bitmap( FTC_BasicFamily family, - FT_UInt gindex, - FTC_Manager manager, - FT_Face *aface ) - { - FT_Error error; - FT_Size size; - - - error = FTC_Manager_LookupSize( manager, &family->attrs.scaler, &size ); - if ( !error ) - { - FT_Face face = size->face; - - - error = FT_Load_Glyph( face, gindex, - family->attrs.load_flags | FT_LOAD_RENDER ); - if ( !error ) - *aface = face; - } - - return error; - } - - - static FT_Error - ftc_basic_family_load_glyph( FTC_BasicFamily family, - FT_UInt gindex, - FTC_Cache cache, - FT_Glyph *aglyph ) - { - FT_Error error; - FTC_Scaler scaler = &family->attrs.scaler; - FT_Face face; - FT_Size size; - - - /* we will now load the glyph image */ - error = FTC_Manager_LookupSize( cache->manager, - scaler, - &size ); - if ( !error ) - { - face = size->face; - - error = FT_Load_Glyph( face, gindex, family->attrs.load_flags ); - if ( !error ) - { - if ( face->glyph->format == FT_GLYPH_FORMAT_BITMAP || - face->glyph->format == FT_GLYPH_FORMAT_OUTLINE ) - { - /* ok, copy it */ - FT_Glyph glyph; - - - error = FT_Get_Glyph( face->glyph, &glyph ); - if ( !error ) - { - *aglyph = glyph; - goto Exit; - } - } - else - error = FTC_Err_Invalid_Argument; - } - } - - Exit: - return error; - } - - - static FT_Bool - ftc_basic_gnode_compare_faceid( FTC_GNode gnode, - FTC_FaceID face_id, - FTC_Cache cache ) - { - FTC_BasicFamily family = (FTC_BasicFamily)gnode->family; - FT_Bool result; - - - result = FT_BOOL( family->attrs.scaler.face_id == face_id ); - if ( result ) - { - /* we must call this function to avoid this node from appearing - * in later lookups with the same face_id! - */ - FTC_GNode_UnselectFamily( gnode, cache ); - } - return result; - } - - - /* - * - * basic image cache - * - */ - - static const FTC_IFamilyClassRec ftc_basic_image_family_class = - { - { - sizeof( FTC_BasicFamilyRec ), - (FTC_MruNode_CompareFunc)ftc_basic_family_compare, - (FTC_MruNode_InitFunc) ftc_basic_family_init, - (FTC_MruNode_ResetFunc) NULL, - (FTC_MruNode_DoneFunc) NULL - }, - (FTC_IFamily_LoadGlyphFunc)ftc_basic_family_load_glyph - }; - - - static const FTC_GCacheClassRec ftc_basic_image_cache_class = - { - { - (FTC_Node_NewFunc) FTC_INode_New, - (FTC_Node_WeightFunc) FTC_INode_Weight, - (FTC_Node_CompareFunc)FTC_GNode_Compare, - (FTC_Node_CompareFunc)ftc_basic_gnode_compare_faceid, - (FTC_Node_FreeFunc) FTC_INode_Free, - - sizeof( FTC_GCacheRec ), - (FTC_Cache_InitFunc) FTC_GCache_Init, - (FTC_Cache_DoneFunc) FTC_GCache_Done - }, - (FTC_MruListClass)&ftc_basic_image_family_class - }; - - - FT_EXPORT_DEF( FT_Error ) - FTC_ImageCache_New( FTC_Manager manager, - FTC_ImageCache *acache ) - { - return FTC_GCache_New( manager, &ftc_basic_image_cache_class, - (FTC_GCache*)acache ); - } - - - /* documentation is in ftcimage.h */ - - FT_EXPORT_DEF( FT_Error ) - FTC_ImageCache_Lookup( FTC_ImageCache cache, - FTC_ImageType type, - FT_UInt gindex, - FT_Glyph *aglyph, - FTC_Node *anode ) - { - FTC_BasicQueryRec query; - FTC_INode node; - FT_Error error; - FT_UInt32 hash; - - - /* some argument checks are delayed to FTC_Cache_Lookup */ - if ( !aglyph ) - { - error = FTC_Err_Invalid_Argument; - goto Exit; - } - - *aglyph = NULL; - if ( anode ) - *anode = NULL; - - query.attrs.scaler.face_id = type->face_id; - query.attrs.scaler.width = type->width; - query.attrs.scaler.height = type->height; - query.attrs.scaler.pixel = 1; - query.attrs.load_flags = type->flags; - - query.attrs.scaler.x_res = 0; /* make compilers happy */ - query.attrs.scaler.y_res = 0; - - hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + gindex; - -#if 1 /* inlining is about 50% faster! */ - FTC_GCACHE_LOOKUP_CMP( cache, - ftc_basic_family_compare, - FTC_GNode_Compare, - hash, gindex, - &query, - node, - error ); -#else - error = FTC_GCache_Lookup( FTC_GCACHE( cache ), - hash, gindex, - FTC_GQUERY( &query ), - (FTC_Node*) &node ); -#endif - if ( !error ) - { - *aglyph = FTC_INODE( node )->glyph; - - if ( anode ) - { - *anode = FTC_NODE( node ); - FTC_NODE( node )->ref_count++; - } - } - - Exit: - return error; - } - - - /* - * - * basic small bitmap cache - * - */ - - - static const FTC_SFamilyClassRec ftc_basic_sbit_family_class = - { - { - sizeof( FTC_BasicFamilyRec ), - (FTC_MruNode_CompareFunc)ftc_basic_family_compare, - (FTC_MruNode_InitFunc) ftc_basic_family_init, - (FTC_MruNode_ResetFunc) NULL, - (FTC_MruNode_DoneFunc) NULL - }, - (FTC_SFamily_GetCountFunc) ftc_basic_family_get_count, - (FTC_SFamily_LoadGlyphFunc)ftc_basic_family_load_bitmap - }; - - - static const FTC_GCacheClassRec ftc_basic_sbit_cache_class = - { - { - (FTC_Node_NewFunc) FTC_SNode_New, - (FTC_Node_WeightFunc) FTC_SNode_Weight, - (FTC_Node_CompareFunc)FTC_SNode_Compare, - (FTC_Node_CompareFunc)ftc_basic_gnode_compare_faceid, - (FTC_Node_FreeFunc) FTC_SNode_Free, - - sizeof( FTC_GCacheRec ), - (FTC_Cache_InitFunc) FTC_GCache_Init, - (FTC_Cache_DoneFunc) FTC_GCache_Done - }, - (FTC_MruListClass)&ftc_basic_sbit_family_class - }; - - - FT_EXPORT_DEF( FT_Error ) - FTC_SBitCache_New( FTC_Manager manager, - FTC_SBitCache *acache ) - { - return FTC_GCache_New( manager, &ftc_basic_sbit_cache_class, - (FTC_GCache*)acache ); - } - - - FT_EXPORT_DEF( FT_Error ) - FTC_SBitCache_Lookup( FTC_SBitCache cache, - FTC_ImageType type, - FT_UInt gindex, - FTC_SBit *ansbit, - FTC_Node *anode ) - { - FT_Error error; - FTC_BasicQueryRec query; - FTC_SNode node; - FT_UInt32 hash; - - - if ( anode ) - *anode = NULL; - - /* other argument checks delayed to FTC_Cache_Lookup */ - if ( !ansbit ) - return FTC_Err_Invalid_Argument; - - *ansbit = NULL; - - query.attrs.scaler.face_id = type->face_id; - query.attrs.scaler.width = type->width; - query.attrs.scaler.height = type->height; - query.attrs.scaler.pixel = 1; - query.attrs.load_flags = type->flags; - - query.attrs.scaler.x_res = 0; /* make compilers happy */ - query.attrs.scaler.y_res = 0; - - /* beware, the hash must be the same for all glyph ranges! */ - hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + - gindex / FTC_SBIT_ITEMS_PER_NODE; - -#if 1 /* inlining is about 50% faster! */ - FTC_GCACHE_LOOKUP_CMP( cache, - ftc_basic_family_compare, - FTC_SNode_Compare, - hash, gindex, - &query, - node, - error ); -#else - error = FTC_GCache_Lookup( FTC_GCACHE( cache ), - hash, - gindex, - FTC_GQUERY( &query ), - (FTC_Node*)&node ); -#endif - if ( error ) - goto Exit; - - *ansbit = node->sbits + ( gindex - FTC_GNODE( node )->gindex ); - - if ( anode ) - { - *anode = FTC_NODE( node ); - FTC_NODE( node )->ref_count++; - } - - Exit: - return error; - } - - -/* END */ diff --git a/reactos/lib/freetype/src/cache/ftccache.c b/reactos/lib/freetype/src/cache/ftccache.c index 7e0630260f3..cc01c397811 100644 --- a/reactos/lib/freetype/src/cache/ftccache.c +++ b/reactos/lib/freetype/src/cache/ftccache.c @@ -17,7 +17,7 @@ #include <ft2build.h> -#include FT_CACHE_INTERNAL_MANAGER_H +#include FT_CACHE_MANAGER_H #include FT_INTERNAL_OBJECTS_H #include FT_INTERNAL_DEBUG_H @@ -40,13 +40,53 @@ /*************************************************************************/ /*************************************************************************/ + FT_EXPORT_DEF( void ) + ftc_node_done( FTC_Node node, + FTC_Cache cache ) + { + FTC_Family family; + FTC_FamilyEntry entry; + + + entry = cache->manager->families.entries + node->fam_index; + family = entry->family; + + /* remove from parent set table - eventually destroy the set */ + if ( --family->num_nodes == 0 ) + FT_LruList_Remove( cache->families, (FT_LruNode) family ); + } + + /* add a new node to the head of the manager's circular MRU list */ static void ftc_node_mru_link( FTC_Node node, FTC_Manager manager ) { - FTC_MruNode_Prepend( (FTC_MruNode*)&manager->nodes_list, - (FTC_MruNode)node ); + FTC_Node first = manager->nodes_list; + + + if ( first ) + { + FTC_Node last = first->mru_prev; + + + FT_ASSERT( last->mru_next == first ); + + node->mru_prev = last; + node->mru_next = first; + + last->mru_next = node; + first->mru_prev = node; + } + else + { + FT_ASSERT( manager->num_nodes == 0 ); + + node->mru_next = node; + node->mru_prev = node; + } + + manager->nodes_list = node; manager->num_nodes++; } @@ -56,8 +96,29 @@ ftc_node_mru_unlink( FTC_Node node, FTC_Manager manager ) { - FTC_MruNode_Remove( (FTC_MruNode*)&manager->nodes_list, - (FTC_MruNode)node ); + FTC_Node first = manager->nodes_list; + FTC_Node prev = node->mru_prev; + FTC_Node next = node->mru_next; + + + FT_ASSERT( first != NULL && manager->num_nodes > 0 ); + FT_ASSERT( next->mru_prev == node ); + FT_ASSERT( prev->mru_next == node ); + + next->mru_prev = prev; + prev->mru_next = next; + + if ( node == first ) + { + /* this is the last node in the list; update its head pointer */ + if ( node == next ) + manager->nodes_list = NULL; + else + manager->nodes_list = next; + } + + node->mru_next = NULL; + node->mru_prev = NULL; manager->num_nodes--; } @@ -67,167 +128,120 @@ ftc_node_mru_up( FTC_Node node, FTC_Manager manager ) { - FTC_MruNode_Up( (FTC_MruNode*)&manager->nodes_list, - (FTC_MruNode)node ); - } + FTC_Node first = manager->nodes_list; - /* Note that this function cannot fail. If we cannot re-size the - * buckets array appropriately, we simply degrade the hash table's - * performance! - */ - static void - ftc_cache_resize( FTC_Cache cache ) - { - for (;;) + if ( node != first ) { - FTC_Node node, *pnode; - FT_UInt p = cache->p; - FT_UInt mask = cache->mask; - FT_UInt count = mask + p + 1; /* number of buckets */ + FTC_Node prev = node->mru_prev; + FTC_Node next = node->mru_next; + FTC_Node last; - /* do we need to shrink the buckets array? */ - if ( cache->slack < 0 ) - { - FTC_Node new_list = NULL; + prev->mru_next = next; + next->mru_prev = prev; + last = first->mru_prev; + node->mru_next = first; + node->mru_prev = last; + first->mru_prev = node; + last->mru_next = node; - /* try to expand the buckets array _before_ splitting - * the bucket lists - */ - if ( p >= mask ) - { - FT_Memory memory = cache->memory; - - - /* if we can't expand the array, leave immediately */ - if ( FT_MEM_RENEW_ARRAY( cache->buckets, (mask+1)*2, (mask+1)*4 ) ) - break; - } - - /* split a single bucket */ - pnode = cache->buckets + p; - - for (;;) - { - node = *pnode; - if ( node == NULL ) - break; - - if ( node->hash & ( mask + 1 ) ) - { - *pnode = node->link; - node->link = new_list; - new_list = node; - } - else - pnode = &node->link; - } - - cache->buckets[p + mask + 1] = new_list; - - cache->slack += FTC_HASH_MAX_LOAD; - - if ( p >= mask ) - { - cache->mask = 2 * mask + 1; - cache->p = 0; - } - else - cache->p = p + 1; - } - - /* do we need to expand the buckets array? */ - else if ( cache->slack > (FT_Long)count * FTC_HASH_SUB_LOAD ) - { - FT_UInt old_index = p + mask; - FTC_Node* pold; - - - if ( old_index + 1 <= FTC_HASH_INITIAL_SIZE ) - break; - - if ( p == 0 ) - { - FT_Memory memory = cache->memory; - - - /* if we can't shrink the array, leave immediately */ - if ( FT_MEM_RENEW_ARRAY( cache->buckets, - ( mask + 1 ) * 2, mask + 1 ) ) - break; - - cache->mask >>= 1; - p = cache->mask; - } - else - p--; - - pnode = cache->buckets + p; - while ( *pnode ) - pnode = &(*pnode)->link; - - pold = cache->buckets + old_index; - *pnode = *pold; - *pold = NULL; - - cache->slack -= FTC_HASH_MAX_LOAD; - cache->p = p; - } - else /* the hash table is balanced */ - break; + manager->nodes_list = node; } } /* remove a node from its cache's hash table */ - static void - ftc_node_hash_unlink( FTC_Node node0, + static FT_Error + ftc_node_hash_unlink( FTC_Node node, FTC_Cache cache ) { + FT_Error error = 0; FTC_Node *pnode; - FT_UInt idx; + FT_UInt idx, num_buckets; - idx = (FT_UInt)( node0->hash & cache->mask ); + idx = (FT_UInt)( node->hash & cache->mask ); if ( idx < cache->p ) - idx = (FT_UInt)( node0->hash & ( 2 * cache->mask + 1 ) ); + idx = (FT_UInt)( node->hash & ( 2 * cache->mask + 1 ) ); pnode = cache->buckets + idx; for (;;) { - FTC_Node node = *pnode; - - - if ( node == NULL ) + if ( *pnode == NULL ) { FT_ERROR(( "ftc_node_hash_unlink: unknown node!\n" )); - return; + return FTC_Err_Ok; } - if ( node == node0 ) + if ( *pnode == node ) + { + *pnode = node->link; + node->link = NULL; break; + } pnode = &(*pnode)->link; } - *pnode = node0->link; - node0->link = NULL; + num_buckets = ( cache->p + cache->mask + 1 ); - cache->slack++; - ftc_cache_resize( cache ); + if ( ++cache->slack > (FT_Long)num_buckets * FTC_HASH_SUB_LOAD ) + { + FT_UInt p = cache->p; + FT_UInt mask = cache->mask; + FT_UInt old_index = p + mask; + FTC_Node* pold; + + + if ( old_index + 1 <= FTC_HASH_INITIAL_SIZE ) + goto Exit; + + if ( p == 0 ) + { + FT_Memory memory = cache->memory; + + + cache->mask >>= 1; + p = cache->mask; + + if ( FT_RENEW_ARRAY( cache->buckets, ( mask + 1 ) * 2, (mask+1) ) ) + { + FT_ERROR(( "ftc_node_hash_unlink: couldn't shunk buckets!\n" )); + goto Exit; + } + } + else + p--; + + pnode = cache->buckets + p; + while ( *pnode ) + pnode = &(*pnode)->link; + + pold = cache->buckets + old_index; + *pnode = *pold; + *pold = NULL; + + cache->slack -= FTC_HASH_MAX_LOAD; + cache->p = p; + } + + Exit: + return error; } - /* add a node to the `top' of its cache's hash table */ - static void + + /* add a node to the "top" of its cache's hash table */ + static FT_Error ftc_node_hash_link( FTC_Node node, FTC_Cache cache ) { FTC_Node *pnode; FT_UInt idx; + FT_Error error = 0; idx = (FT_UInt)( node->hash & cache->mask ); @@ -239,29 +253,85 @@ node->link = *pnode; *pnode = node; - cache->slack--; - ftc_cache_resize( cache ); + if ( --cache->slack < 0 ) + { + FT_UInt p = cache->p; + FT_UInt mask = cache->mask; + FTC_Node new_list; + + + /* split a single bucket */ + new_list = NULL; + pnode = cache->buckets + p; + + for (;;) + { + node = *pnode; + if ( node == NULL ) + break; + + if ( node->hash & ( mask + 1 ) ) + { + *pnode = node->link; + node->link = new_list; + new_list = node; + } + else + pnode = &node->link; + } + + cache->buckets[p + mask + 1] = new_list; + + cache->slack += FTC_HASH_MAX_LOAD; + + if ( p >= mask ) + { + FT_Memory memory = cache->memory; + + + if ( FT_RENEW_ARRAY( cache->buckets, + ( mask + 1 ) * 2, ( mask + 1 ) * 4 ) ) + { + FT_ERROR(( "ftc_node_hash_link: couldn't expand buckets!\n" )); + goto Exit; + } + + cache->mask = 2 * mask + 1; + cache->p = 0; + } + else + cache->p = p + 1; + } + + Exit: + return error; } + + /* remove a node from the cache manager */ FT_EXPORT_DEF( void ) ftc_node_destroy( FTC_Node node, FTC_Manager manager ) { - FTC_Cache cache; + FT_Memory memory = manager->library->memory; + FTC_Cache cache; + FTC_FamilyEntry entry; + FTC_Cache_Class clazz; #ifdef FT_DEBUG_ERROR /* find node's cache */ - if ( node->cache_index >= manager->num_caches ) + if ( node->fam_index >= manager->families.count ) { FT_ERROR(( "ftc_node_destroy: invalid node handle\n" )); return; } #endif - cache = manager->caches[node->cache_index]; + entry = manager->families.entries + node->fam_index; + cache = entry->cache; #ifdef FT_DEBUG_ERROR if ( cache == NULL ) @@ -271,7 +341,9 @@ } #endif - manager->cur_weight -= cache->clazz.node_weight( node, cache ); + clazz = cache->clazz; + + manager->cur_weight -= clazz->node_weight( node, cache ); /* remove node from mru list */ ftc_node_mru_unlink( node, manager ); @@ -280,7 +352,10 @@ ftc_node_hash_unlink( node, cache ); /* now finalize it */ - cache->clazz.node_free( node, cache ); + if ( clazz->node_done ) + clazz->node_done( node, cache ); + + FT_FREE( node ); #if 0 /* check, just in case of general corruption :-) */ @@ -294,35 +369,120 @@ /*************************************************************************/ /*************************************************************************/ /***** *****/ - /***** ABSTRACT CACHE CLASS *****/ + /***** CACHE FAMILY DEFINITIONS *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ FT_EXPORT_DEF( FT_Error ) - FTC_Cache_Init( FTC_Cache cache ) + ftc_family_init( FTC_Family family, + FTC_Query query, + FTC_Cache cache ) { - FT_Memory memory = cache->memory; + FT_Error error; + FTC_Manager manager = cache->manager; + FT_Memory memory = manager->library->memory; + FTC_FamilyEntry entry; + + + family->cache = cache; + family->num_nodes = 0; + + /* now add to manager's family table */ + error = ftc_family_table_alloc( &manager->families, memory, &entry ); + if ( !error ) + { + entry->cache = cache; + entry->family = family; + family->fam_index = entry->index; + + query->family = family; /* save family in query */ + } + + return error; + } + + + FT_EXPORT_DEF( void ) + ftc_family_done( FTC_Family family ) + { + if ( family && family->cache ) + { + FTC_Manager manager = family->cache->manager; + + + /* remove from manager's family table */ + ftc_family_table_free( &manager->families, family->fam_index ); + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** ABSTRACT CACHE CLASS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + + FT_EXPORT_DEF( FT_Error ) + ftc_cache_init( FTC_Cache cache ) + { + FT_Memory memory = cache->memory; + FTC_Cache_Class clazz = cache->clazz; + FT_Error error; cache->p = 0; cache->mask = FTC_HASH_INITIAL_SIZE - 1; cache->slack = FTC_HASH_INITIAL_SIZE * FTC_HASH_MAX_LOAD; - return ( FT_MEM_NEW_ARRAY( cache->buckets, FTC_HASH_INITIAL_SIZE * 2 ) ); + if ( FT_NEW_ARRAY( cache->buckets, FTC_HASH_INITIAL_SIZE * 2 ) ) + goto Exit; + + /* now, initialize the lru list of families for this cache */ + if ( clazz->family_size > 0 ) + { + FT_LruList_ClassRec* lru_class = &cache->family_class; + + + lru_class->list_size = sizeof( FT_LruListRec ); + lru_class->list_init = NULL; + lru_class->list_done = NULL; + + lru_class->node_size = clazz->family_size; + lru_class->node_init = (FT_LruNode_InitFunc) clazz->family_init; + lru_class->node_done = (FT_LruNode_DoneFunc) clazz->family_done; + lru_class->node_flush = (FT_LruNode_FlushFunc) NULL; + lru_class->node_compare = (FT_LruNode_CompareFunc)clazz->family_compare; + + error = FT_LruList_New( (FT_LruList_Class) lru_class, + 0, /* max items == 0 => unbounded list */ + cache, + memory, + &cache->families ); + if ( error ) + FT_FREE( cache->buckets ); + } + + Exit: + return error; } FT_EXPORT_DEF( void ) - FTC_Cache_Clear( FTC_Cache cache ) + ftc_cache_clear( FTC_Cache cache ) { if ( cache ) { - FTC_Manager manager = cache->manager; - FT_UFast i; - FT_UInt count; - + FT_Memory memory = cache->memory; + FTC_Cache_Class clazz = cache->clazz; + FTC_Manager manager = cache->manager; + FT_UFast i; + FT_UInt count; count = cache->p + cache->mask + 1; @@ -340,249 +500,309 @@ ftc_node_mru_unlink( node, manager ); /* now finalize it */ - manager->cur_weight -= cache->clazz.node_weight( node, cache ); + manager->cur_weight -= clazz->node_weight( node, cache ); - cache->clazz.node_free( node, cache ); + if ( clazz->node_done ) + clazz->node_done( node, cache ); + + FT_FREE( node ); node = next; } cache->buckets[i] = NULL; } - ftc_cache_resize( cache ); + + cache->p = 0; + + /* destroy the families */ + if ( cache->families ) + FT_LruList_Reset( cache->families ); } } FT_EXPORT_DEF( void ) - FTC_Cache_Done( FTC_Cache cache ) + ftc_cache_done( FTC_Cache cache ) { - if ( cache->memory ) + if ( cache ) { FT_Memory memory = cache->memory; - FTC_Cache_Clear( cache ); + ftc_cache_clear( cache ); FT_FREE( cache->buckets ); cache->mask = 0; - cache->p = 0; cache->slack = 0; - cache->memory = NULL; - } - } - - - static void - ftc_cache_add( FTC_Cache cache, - FT_UInt32 hash, - FTC_Node node ) - { - node->hash = hash; - node->cache_index = (FT_UInt16) cache->index; - node->ref_count = 0; - - ftc_node_hash_link( node, cache ); - ftc_node_mru_link( node, cache->manager ); - - { - FTC_Manager manager = cache->manager; - - - manager->cur_weight += cache->clazz.node_weight( node, cache ); - - if ( manager->cur_weight >= manager->max_weight ) + if ( cache->families ) { - node->ref_count++; - FTC_Manager_Compress( manager ); - node->ref_count--; + FT_LruList_Destroy( cache->families ); + cache->families = NULL; } } } + /* Look up a node in "top" of its cache's hash table. */ + /* If not found, create a new node. */ + /* */ FT_EXPORT_DEF( FT_Error ) - FTC_Cache_NewNode( FTC_Cache cache, - FT_UInt32 hash, - FT_Pointer query, - FTC_Node *anode ) - { - FT_Error error; - FTC_Node node; - - /* - * Try to allocate a new cache node. Note that in case of - * out-of-memory error (OOM), we'll flush the cache a bit, - * then try again. - * - * On each try, the `tries' variable gives the number - * of old nodes we want to flush from the manager's global list - * before the next allocation attempt. It barely doubles on - * each iteration. - * - */ - error = cache->clazz.node_new( &node, query, cache ); - if ( error ) - goto FlushCache; - - AddNode: - /* don't assume that the cache has the same number of buckets, since - * our allocation request might have triggered global cache flushing - */ - ftc_cache_add( cache, hash, node ); - - Exit: - *anode = node; - return error; - - FlushCache: - node = NULL; - if ( error != FT_Err_Out_Of_Memory ) - goto Exit; - - { - FTC_Manager manager = cache->manager; - FT_UInt count, tries = 1; - - - for (;;) - { - error = cache->clazz.node_new( &node, query, cache ); - if ( !error ) - break; - - node = NULL; - if ( error != FT_Err_Out_Of_Memory ) - goto Exit; - - count = FTC_Manager_FlushN( manager, tries ); - if ( count == 0 ) - goto Exit; - - if ( count == tries ) - { - count = tries * 2; - if ( count < tries || count > manager->num_nodes ) - count = manager->num_nodes; - } - tries = count; - } - } - goto AddNode; - } - - - FT_EXPORT_DEF( FT_Error ) - FTC_Cache_Lookup( FTC_Cache cache, - FT_UInt32 hash, - FT_Pointer query, + ftc_cache_lookup( FTC_Cache cache, + FTC_Query query, FTC_Node *anode ) { - FT_UFast idx; - FTC_Node* bucket; - FTC_Node* pnode; - FTC_Node node; - FT_Error error = 0; - - FTC_Node_CompareFunc compare = cache->clazz.node_compare; + FT_Error error = FTC_Err_Ok; + FTC_Manager manager; + FT_LruNode lru; + FT_UInt free_count = 0; - if ( cache == NULL || anode == NULL ) - return FT_Err_Invalid_Argument; + if ( !cache || !query || !anode ) + return FTC_Err_Invalid_Argument; - idx = hash & cache->mask; - if ( idx < cache->p ) - idx = hash & ( cache->mask * 2 + 1 ); + *anode = NULL; + + query->hash = 0; + query->family = NULL; + + manager = cache->manager; + + /* here's a small note explaining what's happening in the code below. + * + * We need to deal intelligently with out-of-memory (OOM) conditions + * when trying to create a new family or cache node during the lookup. + * + * When an OOM is detected, we try to free one or more "old" nodes + * from the cache, then try again. It may be necessary to do that + * several times, so a loop is needed. + * + * The local variable "free_count" holds the number of "old" nodes to + * discard on each attempt. It starts at 1 and doubles on each + * iteration. The loop stops when: + * + * - a non-OOM error is detected + * - a succesful lookup is performed + * - there are no more unused nodes in the cache + * + * For the record, remember that all used nodes appear _before_ + * unused ones in the manager's MRU node list. + */ - bucket = cache->buckets + idx; - pnode = bucket; for (;;) { - node = *pnode; - if ( node == NULL ) - goto NewNode; - - if ( node->hash == hash && compare( node, query, cache ) ) - break; - - pnode = &node->link; - } - - if ( node != *bucket ) - { - *pnode = node->link; - node->link = *bucket; - *bucket = node; - } - - /* move to head of MRU list */ - { - FTC_Manager manager = cache->manager; - - - if ( node != manager->nodes_list ) - ftc_node_mru_up( node, manager ); - } - *anode = node; - return error; - - NewNode: - return FTC_Cache_NewNode( cache, hash, query, anode ); - } - - - FT_EXPORT_DEF( void ) - FTC_Cache_RemoveFaceID( FTC_Cache cache, - FTC_FaceID face_id ) - { - FT_UFast i, count; - FTC_Manager manager = cache->manager; - FTC_Node frees = NULL; - - - count = cache->p + cache->mask; - for ( i = 0; i < count; i++ ) - { - FTC_Node* bucket = cache->buckets + i; - FTC_Node* pnode = bucket; - - - for ( ;; ) { - FTC_Node node = *pnode; + /* first of all, find the relevant family */ + FT_LruList list = cache->families; + FT_LruNode fam, *pfam; + FT_LruNode_CompareFunc compare = list->clazz->node_compare; - - if ( node == NULL ) - break; - - if ( cache->clazz.node_remove_faceid( node, face_id, cache ) ) + pfam = &list->nodes; + for (;;) { - *pnode = node->link; - node->link = frees; - frees = node; + fam = *pfam; + if ( fam == NULL ) + { + error = FT_LruList_Lookup( list, query, &lru ); + if ( error ) + goto Fail; + + goto Skip; + } + + if ( compare( fam, query, list->data ) ) + break; + + pfam = &fam->next; + } + + FT_ASSERT( fam != NULL ); + + /* move to top of list when needed */ + if ( fam != list->nodes ) + { + *pfam = fam->next; + fam->next = list->nodes; + list->nodes = fam; + } + + lru = fam; + + Skip: + ; + } + + { + FTC_Family family = (FTC_Family) lru; + FT_UFast hash = query->hash; + FTC_Node* bucket; + FT_UInt idx; + + + idx = hash & cache->mask; + if ( idx < cache->p ) + idx = hash & ( cache->mask * 2 + 1 ); + + bucket = cache->buckets + idx; + + + if ( query->family != family || + family->fam_index >= manager->families.size ) + { + FT_ERROR(( + "ftc_cache_lookup: invalid query (bad 'family' field)\n" )); + error = FTC_Err_Invalid_Argument; + goto Exit; + } + + if ( *bucket ) + { + FTC_Node* pnode = bucket; + FTC_Node_CompareFunc compare = cache->clazz->node_compare; + + + for ( ;; ) + { + FTC_Node node; + + + node = *pnode; + if ( node == NULL ) + break; + + if ( node->hash == hash && + (FT_UInt)node->fam_index == family->fam_index && + compare( node, query, cache ) ) + { + /* move to head of bucket list */ + if ( pnode != bucket ) + { + *pnode = node->link; + node->link = *bucket; + *bucket = node; + } + + /* move to head of MRU list */ + if ( node != manager->nodes_list ) + ftc_node_mru_up( node, manager ); + + *anode = node; + goto Exit; + } + + pnode = &node->link; + } + } + + /* didn't find a node, create a new one */ + { + FTC_Cache_Class clazz = cache->clazz; + FT_Memory memory = cache->memory; + FTC_Node node; + + + if ( FT_ALLOC( node, clazz->node_size ) ) + goto Fail; + + node->fam_index = (FT_UShort) family->fam_index; + node->hash = query->hash; + node->ref_count = 0; + + error = clazz->node_init( node, query, cache ); + if ( error ) + { + FT_FREE( node ); + goto Fail; + } + + error = ftc_node_hash_link( node, cache ); + if ( error ) + { + clazz->node_done( node, cache ); + FT_FREE( node ); + goto Fail; + } + + ftc_node_mru_link( node, cache->manager ); + + cache->manager->cur_weight += clazz->node_weight( node, cache ); + + /* now try to compress the node pool when necessary */ + if ( manager->cur_weight >= manager->max_weight ) + { + node->ref_count++; + FTC_Manager_Compress( manager ); + node->ref_count--; + } + + *anode = node; + } + + /* all is well, exit now + */ + goto Exit; + } + + Fail: + if ( error != FTC_Err_Out_Of_Memory ) + goto Exit; + + /* There is not enough memory; try to release some unused nodes + * from the cache to make room for a new one. + */ + { + FT_UInt new_count; + + + new_count = 1 + free_count * 2; + + /* check overflow and bounds */ + if ( new_count < free_count || free_count > manager->num_nodes ) + goto Exit; + + free_count = new_count; + + /* try to remove "new_count" nodes from the list */ + { + FTC_Node first = manager->nodes_list; + FTC_Node node; + + + if ( first == NULL ) /* empty list! */ + goto Exit; + + /* go to last node - it's a circular list */ + node = first->mru_prev; + for ( ; node && new_count > 0; new_count-- ) + { + FTC_Node prev = node->mru_prev; + + + /* Used nodes always appear before unused one in the MRU + * list. If we find one here, we'd better stop right now + * our iteration. + */ + if ( node->ref_count > 0 ) + { + /* if there are no unused nodes in the list, we'd better exit */ + if ( new_count == free_count ) + goto Exit; + + break; + } + + ftc_node_destroy( node, manager ); + + if ( node == first ) + break; + + node = prev; + } } - else - pnode = &node->link; } } - /* remove all nodes in the free list */ - while ( frees ) - { - FTC_Node node; - - - node = frees; - frees = node->link; - - manager->cur_weight -= cache->clazz.node_weight( node, cache ); - ftc_node_mru_unlink( node, manager ); - - cache->clazz.node_free( node, cache ); - - cache->slack++; - } - - ftc_cache_resize( cache ); + Exit: + return error; } diff --git a/reactos/lib/freetype/src/cache/ftccmap.c b/reactos/lib/freetype/src/cache/ftccmap.c index 63dea49247b..bdb83abb530 100644 --- a/reactos/lib/freetype/src/cache/ftccmap.c +++ b/reactos/lib/freetype/src/cache/ftccmap.c @@ -4,7 +4,7 @@ /* */ /* FreeType CharMap cache (body) */ /* */ -/* Copyright 2000-2001, 2002, 2003, 2004 by */ +/* Copyright 2000-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -19,7 +19,8 @@ #include <ft2build.h> #include FT_FREETYPE_H #include FT_CACHE_H -#include FT_CACHE_INTERNAL_MANAGER_H +#include FT_CACHE_CHARMAP_H +#include FT_CACHE_MANAGER_H #include FT_INTERNAL_MEMORY_H #include FT_INTERNAL_DEBUG_H #include FT_TRUETYPE_IDS_H @@ -29,7 +30,6 @@ #undef FT_COMPONENT #define FT_COMPONENT trace_cache - /*************************************************************************/ /* */ /* Each FTC_CMapNode contains a simple array to map a range of character */ @@ -47,44 +47,56 @@ /* number of glyph indices / character code per node */ #define FTC_CMAP_INDICES_MAX 128 - /* compute a query/node hash */ -#define FTC_CMAP_HASH( faceid, index, charcode ) \ - ( FTC_FACE_ID_HASH( faceid ) + 211 * ( index ) + \ - ( (char_code) / FTC_CMAP_INDICES_MAX ) ) - /* the charmap query */ - typedef struct FTC_CMapQueryRec_ - { - FTC_FaceID face_id; - FT_UInt cmap_index; - FT_UInt32 char_code; - - } FTC_CMapQueryRec, *FTC_CMapQuery; - -#define FTC_CMAP_QUERY( x ) ((FTC_CMapQuery)(x)) -#define FTC_CMAP_QUERY_HASH( x ) \ - FTC_CMAP_HASH( (x)->face_id, (x)->cmap_index, (x)->char_code ) - - /* the cmap cache node */ typedef struct FTC_CMapNodeRec_ { FTC_NodeRec node; - FTC_FaceID face_id; - FT_UInt cmap_index; FT_UInt32 first; /* first character in node */ FT_UInt16 indices[FTC_CMAP_INDICES_MAX]; /* array of glyph indices */ } FTC_CMapNodeRec, *FTC_CMapNode; + #define FTC_CMAP_NODE( x ) ( (FTC_CMapNode)( x ) ) -#define FTC_CMAP_NODE_HASH( x ) \ - FTC_CMAP_HASH( (x)->face_id, (x)->cmap_index, (x)->first ) + + + /* compute node hash value from cmap family and "requested" glyph index */ +#define FTC_CMAP_HASH( cfam, cquery ) \ + ( (cfam)->hash + ( (cquery)->char_code / FTC_CMAP_INDICES_MAX ) ) /* if (indices[n] == FTC_CMAP_UNKNOWN), we assume that the corresponding */ /* glyph indices haven't been queried through FT_Get_Glyph_Index() yet */ #define FTC_CMAP_UNKNOWN ( (FT_UInt16)-1 ) + /* the charmap query */ + typedef struct FTC_CMapQueryRec_ + { + FTC_QueryRec query; + FTC_CMapDesc desc; + FT_UInt32 char_code; + + } FTC_CMapQueryRec, *FTC_CMapQuery; + + +#define FTC_CMAP_QUERY( x ) ( (FTC_CMapQuery)( x ) ) + + + /* the charmap family */ + typedef struct FTC_CMapFamilyRec_ + { + FTC_FamilyRec family; + FT_UInt32 hash; + FTC_CMapDescRec desc; + FT_UInt index; + + } FTC_CMapFamilyRec, *FTC_CMapFamily; + + +#define FTC_CMAP_FAMILY( x ) ( (FTC_CMapFamily)( x ) ) +#define FTC_CMAP_FAMILY_MEMORY( x ) FTC_FAMILY( x )->memory + + /*************************************************************************/ /*************************************************************************/ /***** *****/ @@ -94,44 +106,27 @@ /*************************************************************************/ - /* no need for specific finalizer; we use `ftc_node_done' directly */ - - FT_CALLBACK_DEF( void ) - ftc_cmap_node_free( FTC_CMapNode node, - FTC_Cache cache ) - { - FT_Memory memory = cache->memory; - - - FT_FREE( node ); - } - + /* no need for specific finalizer; we use "ftc_node_done" directly */ /* initialize a new cmap node */ FT_CALLBACK_DEF( FT_Error ) - ftc_cmap_node_new( FTC_CMapNode *anode, - FTC_CMapQuery query, - FTC_Cache cache ) + ftc_cmap_node_init( FTC_CMapNode cnode, + FTC_CMapQuery cquery, + FTC_Cache cache ) { - FT_Error error; - FT_Memory memory = cache->memory; - FTC_CMapNode node; - FT_UInt nn; + FT_UInt32 first; + FT_UInt n; + FT_UNUSED( cache ); - if ( !FT_NEW( node ) ) - { - node->face_id = query->face_id; - node->cmap_index = query->cmap_index; - node->first = (query->char_code / FTC_CMAP_INDICES_MAX) * - FTC_CMAP_INDICES_MAX; + first = ( cquery->char_code / FTC_CMAP_INDICES_MAX ) * + FTC_CMAP_INDICES_MAX; - for ( nn = 0; nn < FTC_CMAP_INDICES_MAX; nn++ ) - node->indices[nn] = FTC_CMAP_UNKNOWN; - } + cnode->first = first; + for ( n = 0; n < FTC_CMAP_INDICES_MAX; n++ ) + cnode->indices[n] = FTC_CMAP_UNKNOWN; - *anode = node; - return error; + return 0; } @@ -147,27 +142,185 @@ /* compare a cmap node to a given query */ FT_CALLBACK_DEF( FT_Bool ) - ftc_cmap_node_compare( FTC_CMapNode node, - FTC_CMapQuery query ) + ftc_cmap_node_compare( FTC_CMapNode cnode, + FTC_CMapQuery cquery ) { - if ( node->face_id == query->face_id && - node->cmap_index == query->cmap_index ) + FT_UInt32 offset = (FT_UInt32)( cquery->char_code - cnode->first ); + + + return FT_BOOL( offset < FTC_CMAP_INDICES_MAX ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CHARMAP FAMILY *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_DEF( FT_Error ) + ftc_cmap_family_init( FTC_CMapFamily cfam, + FTC_CMapQuery cquery, + FTC_Cache cache ) + { + FTC_Manager manager = cache->manager; + FTC_CMapDesc desc = cquery->desc; + FT_UInt32 hash = 0; + FT_Error error; + FT_Face face; + + + /* setup charmap descriptor */ + cfam->desc = *desc; + + /* let's see whether the rest is correct too */ + error = FTC_Manager_Lookup_Face( manager, desc->face_id, &face ); + if ( !error ) { - FT_UInt32 offset = (FT_UInt32)( query->char_code - node->first ); + FT_UInt count = face->num_charmaps; + FT_UInt idx = count; + FT_CharMap* cur = face->charmaps; - return FT_BOOL( offset < FTC_CMAP_INDICES_MAX ); + switch ( desc->type ) + { + case FTC_CMAP_BY_INDEX: + idx = desc->u.index; + hash = idx * 33; + break; + + case FTC_CMAP_BY_ENCODING: + if ( desc->u.encoding == FT_ENCODING_UNICODE ) + { + /* Since the `interesting' table, pid/eid (3,10), is normally the + * last one, we loop backwards. This looses with type1 fonts with + * non-BMP characters (<.0001%), this wins with .ttf with non-BMP + * chars (.01% ?), and this is the same about 99.99% of the time! + */ + + FT_UInt unicmap_idx = count; /* some UCS-2 map, if we found it */ + + + cur += count - 1; + + for ( idx = 0; idx < count; idx++, cur-- ) + { + if ( cur[0]->encoding == FT_ENCODING_UNICODE ) + { + unicmap_idx = idx; /* record we found a Unicode charmap */ + + /* XXX If some new encodings to represent UCS-4 are added, + * they should be added here. + */ + if ( ( cur[0]->platform_id == TT_PLATFORM_MICROSOFT && + cur[0]->encoding_id == TT_MS_ID_UCS_4 ) || + ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE && + cur[0]->encoding_id == TT_APPLE_ID_UNICODE_32 ) ) + + /* Hurray! We found a UCS-4 charmap. We can stop the scan! */ + { + idx = count - 1 - idx; + goto Found_idx_for_FTC_CMAP_BY_ENCODING; + } + } + } + + /* We do not have any UCS-4 charmap. Sigh. + * Let's see if we have some other kind of Unicode charmap, though. + */ + if ( unicmap_idx < count ) + idx = count - 1 - unicmap_idx; + } + else + { + for ( idx = 0; idx < count; idx++, cur++ ) + if ( cur[0]->encoding == desc->u.encoding ) + break; + } + + Found_idx_for_FTC_CMAP_BY_ENCODING: + hash = idx * 67; + break; + + case FTC_CMAP_BY_ID: + for ( idx = 0; idx < count; idx++, cur++ ) + { + if ( (FT_UInt)cur[0]->platform_id == desc->u.id.platform && + (FT_UInt)cur[0]->encoding_id == desc->u.id.encoding ) + { + hash = ( ( desc->u.id.platform << 8 ) | desc->u.id.encoding ) * 7; + break; + } + } + break; + + default: + ; + } + + if ( idx >= count ) + goto Bad_Descriptor; + + /* compute hash value, both in family and query */ + cfam->index = idx; + cfam->hash = hash ^ FTC_FACE_ID_HASH( desc->face_id ); + FTC_QUERY( cquery )->hash = FTC_CMAP_HASH( cfam, cquery ); + + error = ftc_family_init( FTC_FAMILY( cfam ), + FTC_QUERY( cquery ), cache ); } - return 0; + return error; + + Bad_Descriptor: + FT_TRACE1(( "ftp_cmap_family_init: invalid charmap descriptor\n" )); + return FTC_Err_Invalid_Argument; } FT_CALLBACK_DEF( FT_Bool ) - ftc_cmap_node_remove_faceid( FTC_CMapNode node, - FTC_FaceID face_id ) + ftc_cmap_family_compare( FTC_CMapFamily cfam, + FTC_CMapQuery cquery ) { - return FT_BOOL( node->face_id == face_id ); + FT_Int result = 0; + + + /* first, compare face id and type */ + if ( cfam->desc.face_id != cquery->desc->face_id || + cfam->desc.type != cquery->desc->type ) + goto Exit; + + switch ( cfam->desc.type ) + { + case FTC_CMAP_BY_INDEX: + result = ( cfam->desc.u.index == cquery->desc->u.index ); + break; + + case FTC_CMAP_BY_ENCODING: + result = ( cfam->desc.u.encoding == cquery->desc->u.encoding ); + break; + + case FTC_CMAP_BY_ID: + result = ( cfam->desc.u.id.platform == cquery->desc->u.id.platform && + cfam->desc.u.id.encoding == cquery->desc->u.id.encoding ); + break; + + default: + ; + } + + if ( result ) + { + /* when found, update the 'family' and 'hash' field of the query */ + FTC_QUERY( cquery )->family = FTC_FAMILY( cfam ); + FTC_QUERY( cquery )->hash = FTC_CMAP_HASH( cfam, cquery ); + } + + Exit: + return FT_BOOL( result ); } @@ -181,17 +334,23 @@ FT_CALLBACK_TABLE_DEF - const FTC_CacheClassRec ftc_cmap_cache_class = + const FTC_Cache_ClassRec ftc_cmap_cache_class = { - (FTC_Node_NewFunc) ftc_cmap_node_new, + sizeof ( FTC_CacheRec ), + (FTC_Cache_InitFunc) ftc_cache_init, + (FTC_Cache_ClearFunc)ftc_cache_clear, + (FTC_Cache_DoneFunc) ftc_cache_done, + + sizeof ( FTC_CMapFamilyRec ), + (FTC_Family_InitFunc) ftc_cmap_family_init, + (FTC_Family_CompareFunc)ftc_cmap_family_compare, + (FTC_Family_DoneFunc) ftc_family_done, + + sizeof ( FTC_CMapNodeRec ), + (FTC_Node_InitFunc) ftc_cmap_node_init, (FTC_Node_WeightFunc) ftc_cmap_node_weight, (FTC_Node_CompareFunc)ftc_cmap_node_compare, - (FTC_Node_CompareFunc)ftc_cmap_node_remove_faceid, - (FTC_Node_FreeFunc) ftc_cmap_node_free, - - sizeof ( FTC_CacheRec ), - (FTC_Cache_InitFunc) FTC_Cache_Init, - (FTC_Cache_DoneFunc) FTC_Cache_Done, + (FTC_Node_DoneFunc) ftc_node_done }; @@ -201,84 +360,99 @@ FTC_CMapCache_New( FTC_Manager manager, FTC_CMapCache *acache ) { - return FTC_Manager_RegisterCache( manager, - &ftc_cmap_cache_class, - FTC_CACHE_P( acache ) ); + return FTC_Manager_Register_Cache( + manager, + (FTC_Cache_Class)&ftc_cmap_cache_class, + FTC_CACHE_P( acache ) ); } +#ifdef FTC_CACHE_USE_INLINE + +#define GEN_CACHE_FAMILY_COMPARE( f, q, c ) \ + ftc_cmap_family_compare( (FTC_CMapFamily)(f), (FTC_CMapQuery)(q) ) + +#define GEN_CACHE_NODE_COMPARE( n, q, c ) \ + ftc_cmap_node_compare( (FTC_CMapNode)(n), (FTC_CMapQuery)(q) ) + +#define GEN_CACHE_LOOKUP ftc_cmap_cache_lookup + +#include "ftccache.i" + +#else /* !FTC_CACHE_USE_INLINE */ + +#define ftc_cmap_cache_lookup ftc_cache_lookup + +#endif /* !FTC_CACHE_USE_INLINE */ + + /* documentation is in ftccmap.h */ FT_EXPORT_DEF( FT_UInt ) - FTC_CMapCache_Lookup( FTC_CMapCache cmap_cache, - FTC_FaceID face_id, - FT_Int cmap_index, + FTC_CMapCache_Lookup( FTC_CMapCache cache, + FTC_CMapDesc desc, FT_UInt32 char_code ) { - FTC_Cache cache = FTC_CACHE( cmap_cache ); - FTC_CMapQueryRec query; + FTC_CMapQueryRec cquery; FTC_CMapNode node; FT_Error error; FT_UInt gindex = 0; - FT_UInt32 hash; - if ( !cache ) + if ( !cache || !desc ) { FT_ERROR(( "FTC_CMapCache_Lookup: bad arguments, returning 0!\n" )); return 0; } - query.face_id = face_id; - query.cmap_index = (FT_UInt)cmap_index; - query.char_code = char_code; + cquery.desc = desc; + cquery.char_code = char_code; - hash = FTC_CMAP_HASH( face_id, cmap_index, char_code ); - -#if 1 - FTC_CACHE_LOOKUP_CMP( cache, ftc_cmap_node_compare, hash, &query, - node, error ); -#else - error = FTC_Cache_Lookup( cache, hash, &query, (FTC_Node*) &node ); -#endif - if ( error ) - goto Exit; - - FT_ASSERT( (FT_UInt)( char_code - node->first ) < FTC_CMAP_INDICES_MAX ); - - gindex = node->indices[char_code - node->first]; - if ( gindex == FTC_CMAP_UNKNOWN ) + error = ftc_cmap_cache_lookup( FTC_CACHE( cache ), + FTC_QUERY( &cquery ), + (FTC_Node*)&node ); + if ( !error ) { - FT_Face face; + FT_UInt offset = (FT_UInt)( char_code - node->first ); - gindex = 0; + FT_ASSERT( offset < FTC_CMAP_INDICES_MAX ); - error = FTC_Manager_LookupFace( cache->manager, node->face_id, &face ); - if ( error ) - goto Exit; - - if ( (FT_UInt)cmap_index < (FT_UInt)face->num_charmaps ) + gindex = node->indices[offset]; + if ( gindex == FTC_CMAP_UNKNOWN ) { - FT_CharMap old, cmap = NULL; + FT_Face face; - old = face->charmap; - cmap = face->charmaps[cmap_index]; + /* we need to use FT_Get_Char_Index */ + gindex = 0; + + error = FTC_Manager_Lookup_Face( FTC_CACHE(cache)->manager, + desc->face_id, + &face ); + if ( !error ) + { + FT_CharMap old, cmap = NULL; + FT_UInt cmap_index; + + + /* save old charmap, select new one */ + old = face->charmap; + cmap_index = FTC_CMAP_FAMILY( FTC_QUERY( &cquery )->family )->index; + cmap = face->charmaps[cmap_index]; - if ( old != cmap ) FT_Set_Charmap( face, cmap ); - gindex = FT_Get_Char_Index( face, char_code ); + /* perform lookup */ + gindex = FT_Get_Char_Index( face, char_code ); + node->indices[offset] = (FT_UInt16)gindex; - if ( old != cmap ) + /* restore old charmap */ FT_Set_Charmap( face, old ); + } } - - node->indices[char_code - node->first] = gindex; } - Exit: return gindex; } diff --git a/reactos/lib/freetype/src/cache/ftcglyph.c b/reactos/lib/freetype/src/cache/ftcglyph.c index eb48d6696e9..aa21228a79b 100644 --- a/reactos/lib/freetype/src/cache/ftcglyph.c +++ b/reactos/lib/freetype/src/cache/ftcglyph.c @@ -4,7 +4,7 @@ /* */ /* FreeType Glyph Image (FT_Glyph) cache (body). */ /* */ -/* Copyright 2000-2001, 2003 by */ +/* Copyright 2000-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -20,6 +20,7 @@ #include FT_CACHE_H #include FT_CACHE_INTERNAL_GLYPH_H #include FT_ERRORS_H +#include FT_LIST_H #include FT_INTERNAL_OBJECTS_H #include FT_INTERNAL_DEBUG_H @@ -28,47 +29,45 @@ /* create a new chunk node, setting its cache index and ref count */ FT_EXPORT_DEF( void ) - FTC_GNode_Init( FTC_GNode gnode, - FT_UInt gindex, - FTC_Family family ) + ftc_glyph_node_init( FTC_GlyphNode gnode, + FT_UInt gindex, + FTC_GlyphFamily gfam ) { - gnode->family = family; - gnode->gindex = gindex; - family->num_nodes++; + FT_UInt len; + FT_UInt start = FTC_GLYPH_FAMILY_START( gfam, gindex ); + + + gnode->item_start = (FT_UShort)start; + + len = gfam->item_total - start; + if ( len > gfam->item_count ) + len = gfam->item_count; + + gnode->item_count = (FT_UShort)len; + gfam->family.num_nodes++; } FT_EXPORT_DEF( void ) - FTC_GNode_UnselectFamily( FTC_GNode gnode, - FTC_Cache cache ) - { - FTC_Family family = gnode->family; - - - gnode->family = NULL; - if ( family && --family->num_nodes <= 0 ) - FTC_MruList_Remove( &FTC_GCACHE( cache )->families, - (FTC_MruNode)family ); - } - - - FT_EXPORT_DEF( void ) - FTC_GNode_Done( FTC_GNode gnode, - FTC_Cache cache ) + ftc_glyph_node_done( FTC_GlyphNode gnode, + FTC_Cache cache ) { /* finalize the node */ - gnode->gindex = 0; + gnode->item_count = 0; + gnode->item_start = 0; - FTC_GNode_UnselectFamily( gnode, cache ); + ftc_node_done( FTC_NODE( gnode ), cache ); } FT_EXPORT_DEF( FT_Bool ) - FTC_GNode_Compare( FTC_GNode gnode, - FTC_GQuery gquery ) + ftc_glyph_node_compare( FTC_GlyphNode gnode, + FTC_GlyphQuery gquery ) { - return FT_BOOL( gnode->family == gquery->family && - gnode->gindex == gquery->gindex ); + FT_UInt start = (FT_UInt)gnode->item_start; + FT_UInt count = (FT_UInt)gnode->item_count; + + return FT_BOOL( (FT_UInt)( gquery->gindex - start ) < count ); } @@ -80,34 +79,26 @@ /*************************************************************************/ /*************************************************************************/ - FT_EXPORT_DEF( void ) - FTC_Family_Init( FTC_Family family, - FTC_Cache cache ) - { - FTC_GCacheClass clazz = FTC_CACHE__GCACHE_CLASS( cache ); - - - family->clazz = clazz->family_class; - family->num_nodes = 0; - family->cache = cache; - } - FT_EXPORT_DEF( FT_Error ) - FTC_GCache_Init( FTC_GCache cache ) + ftc_glyph_family_init( FTC_GlyphFamily gfam, + FT_UInt32 hash, + FT_UInt item_count, + FT_UInt item_total, + FTC_GlyphQuery gquery, + FTC_Cache cache ) { - FT_Error error; + FT_Error error; - error = FTC_Cache_Init( FTC_CACHE( cache ) ); + + error = ftc_family_init( FTC_FAMILY( gfam ), FTC_QUERY( gquery ), cache ); if ( !error ) { - FTC_GCacheClass clazz = (FTC_GCacheClass)FTC_CACHE( cache )->org_class; - - FTC_MruList_Init( &cache->families, - clazz->family_class, - 0, /* no maximum here! */ - cache, - FTC_CACHE( cache )->memory ); + gfam->hash = hash; + gfam->item_total = item_total; + gfam->item_count = item_count; + + FTC_GLYPH_FAMILY_FOUND( gfam, gquery ); } return error; @@ -115,40 +106,9 @@ FT_EXPORT_DEF( void ) - FTC_GCache_Done( FTC_GCache cache ) + ftc_glyph_family_done( FTC_GlyphFamily gfam ) { - FTC_Cache_Done( (FTC_Cache)cache ); - FTC_MruList_Done( &cache->families ); - } - - - FT_EXPORT_DEF( FT_Error ) - FTC_GCache_New( FTC_Manager manager, - FTC_GCacheClass clazz, - FTC_GCache *acache ) - { - return FTC_Manager_RegisterCache( manager, (FTC_CacheClass)clazz, - (FTC_Cache*)acache ); - } - - - FT_EXPORT_DEF( FT_Error ) - FTC_GCache_Lookup( FTC_GCache cache, - FT_UInt32 hash, - FT_UInt gindex, - FTC_GQuery query, - FTC_Node *anode ) - { - FT_Error error; - - - query->gindex = gindex; - - FTC_MRULIST_LOOKUP( &cache->families, query, query->family, error ); - if ( !error ) - error = FTC_Cache_Lookup( FTC_CACHE( cache ), hash, query, anode ); - - return error; + ftc_family_done( FTC_FAMILY( gfam ) ); } diff --git a/reactos/lib/freetype/src/cache/ftcimage.c b/reactos/lib/freetype/src/cache/ftcimage.c index 2c942d12326..fa1b6ac7177 100644 --- a/reactos/lib/freetype/src/cache/ftcimage.c +++ b/reactos/lib/freetype/src/cache/ftcimage.c @@ -4,7 +4,7 @@ /* */ /* FreeType Image cache (body). */ /* */ -/* Copyright 2000-2001, 2003 by */ +/* Copyright 2000-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -18,65 +18,133 @@ #include <ft2build.h> #include FT_CACHE_H -#include FT_CACHE_INTERNAL_IMAGE_H +#include FT_CACHE_IMAGE_H +#include FT_CACHE_INTERNAL_GLYPH_H #include FT_INTERNAL_MEMORY_H #include "ftcerror.h" - /* finalize a given glyph image node */ - FT_EXPORT_DEF( void ) - FTC_INode_Free( FTC_INode inode, - FTC_Cache cache ) + /* the FT_Glyph image node type */ + typedef struct FTC_ImageNodeRec_ { - FT_Memory memory = cache->memory; + FTC_GlyphNodeRec gnode; + FT_Glyph glyph; + + } FTC_ImageNodeRec, *FTC_ImageNode; +#define FTC_IMAGE_NODE( x ) ( (FTC_ImageNode)( x ) ) +#define FTC_IMAGE_NODE_GINDEX( x ) FTC_GLYPH_NODE_GINDEX( x ) + + + /* the glyph image query */ + typedef struct FTC_ImageQueryRec_ + { + FTC_GlyphQueryRec gquery; + FTC_ImageTypeRec type; + + } FTC_ImageQueryRec, *FTC_ImageQuery; + + +#define FTC_IMAGE_QUERY( x ) ( (FTC_ImageQuery)( x ) ) + + + /* the glyph image set type */ + typedef struct FTC_ImageFamilyRec_ + { + FTC_GlyphFamilyRec gfam; + FTC_ImageTypeRec type; + + } FTC_ImageFamilyRec, *FTC_ImageFamily; + + +#define FTC_IMAGE_FAMILY( x ) ( (FTC_ImageFamily)( x ) ) +#define FTC_IMAGE_FAMILY_MEMORY( x ) FTC_GLYPH_FAMILY_MEMORY( &(x)->gfam ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLYPH IMAGE NODES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* finalize a given glyph image node */ + FT_CALLBACK_DEF( void ) + ftc_image_node_done( FTC_ImageNode inode, + FTC_Cache cache ) + { if ( inode->glyph ) { FT_Done_Glyph( inode->glyph ); inode->glyph = NULL; } - FTC_GNode_Done( FTC_GNODE( inode ), cache ); - FT_FREE( inode ); + ftc_glyph_node_done( FTC_GLYPH_NODE( inode ), cache ); } /* initialize a new glyph image node */ - FT_EXPORT_DEF( FT_Error ) - FTC_INode_New( FTC_INode *pinode, - FTC_GQuery gquery, - FTC_Cache cache ) + FT_CALLBACK_DEF( FT_Error ) + ftc_image_node_init( FTC_ImageNode inode, + FTC_GlyphQuery gquery, + FTC_Cache cache ) { - FT_Memory memory = cache->memory; - FT_Error error; - FTC_INode inode; + FTC_ImageFamily ifam = FTC_IMAGE_FAMILY( gquery->query.family ); + FT_Error error; + FT_Face face; + FT_Size size; - if ( !FT_NEW( inode ) ) + /* initialize its inner fields */ + ftc_glyph_node_init( FTC_GLYPH_NODE( inode ), + gquery->gindex, + FTC_GLYPH_FAMILY( ifam ) ); + + /* we will now load the glyph image */ + error = FTC_Manager_Lookup_Size( FTC_FAMILY( ifam )->cache->manager, + &ifam->type.font, + &face, &size ); + if ( !error ) { - FTC_GNode gnode = FTC_GNODE( inode ); - FTC_Family family = gquery->family; - FT_UInt gindex = gquery->gindex; - FTC_IFamilyClass clazz = FTC_CACHE__IFAMILY_CLASS( cache ); + FT_UInt gindex = FTC_GLYPH_NODE_GINDEX( inode ); - /* initialize its inner fields */ - FTC_GNode_Init( gnode, gindex, family ); + error = FT_Load_Glyph( face, gindex, ifam->type.flags ); + if ( !error ) + { + if ( face->glyph->format == FT_GLYPH_FORMAT_BITMAP || + face->glyph->format == FT_GLYPH_FORMAT_OUTLINE ) + { + /* ok, copy it */ + FT_Glyph glyph; - /* we will now load the glyph image */ - error = clazz->family_load_glyph( family, gindex, cache, - &inode->glyph ); + + error = FT_Get_Glyph( face->glyph, &glyph ); + if ( !error ) + { + inode->glyph = glyph; + goto Exit; + } + } + else + error = FTC_Err_Invalid_Argument; + } } - *pinode = inode; + /* in case of error */ + ftc_glyph_node_done( FTC_GLYPH_NODE(inode), cache ); + + Exit: return error; } - FT_EXPORT_DEF( FT_ULong ) - FTC_INode_Weight( FTC_INode inode ) + FT_CALLBACK_DEF( FT_ULong ) + ftc_image_node_weight( FTC_ImageNode inode ) { FT_ULong size = 0; FT_Glyph glyph = inode->glyph; @@ -117,4 +185,215 @@ } + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLYPH IMAGE SETS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_DEF( FT_Error ) + ftc_image_family_init( FTC_ImageFamily ifam, + FTC_ImageQuery iquery, + FTC_Cache cache ) + { + FTC_Manager manager = cache->manager; + FT_Error error; + FT_Face face; + + + ifam->type = iquery->type; + + /* we need to compute "iquery.item_total" now */ + error = FTC_Manager_Lookup_Face( manager, + iquery->type.font.face_id, + &face ); + if ( !error ) + { + error = ftc_glyph_family_init( FTC_GLYPH_FAMILY( ifam ), + FTC_IMAGE_TYPE_HASH( &ifam->type ), + 1, + face->num_glyphs, + FTC_GLYPH_QUERY( iquery ), + cache ); + } + + return error; + } + + + FT_CALLBACK_DEF( FT_Bool ) + ftc_image_family_compare( FTC_ImageFamily ifam, + FTC_ImageQuery iquery ) + { + FT_Bool result; + + + result = FT_BOOL( FTC_IMAGE_TYPE_COMPARE( &ifam->type, &iquery->type ) ); + if ( result ) + FTC_GLYPH_FAMILY_FOUND( ifam, iquery ); + + return result; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLYPH IMAGE CACHE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + + FT_CALLBACK_TABLE_DEF + const FTC_Cache_ClassRec ftc_image_cache_class = + { + sizeof ( FTC_CacheRec ), + (FTC_Cache_InitFunc) ftc_cache_init, + (FTC_Cache_ClearFunc)ftc_cache_clear, + (FTC_Cache_DoneFunc) ftc_cache_done, + + sizeof ( FTC_ImageFamilyRec ), + (FTC_Family_InitFunc) ftc_image_family_init, + (FTC_Family_CompareFunc)ftc_image_family_compare, + (FTC_Family_DoneFunc) ftc_glyph_family_done, + + sizeof ( FTC_ImageNodeRec ), + (FTC_Node_InitFunc) ftc_image_node_init, + (FTC_Node_WeightFunc) ftc_image_node_weight, + (FTC_Node_CompareFunc)ftc_glyph_node_compare, + (FTC_Node_DoneFunc) ftc_image_node_done + }; + + + /* documentation is in ftcimage.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_ImageCache_New( FTC_Manager manager, + FTC_ImageCache *acache ) + { + return FTC_Manager_Register_Cache( + manager, + (FTC_Cache_Class)&ftc_image_cache_class, + FTC_CACHE_P( acache ) ); + } + + + /* documentation is in ftcimage.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_ImageCache_Lookup( FTC_ImageCache cache, + FTC_ImageType type, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ) + { + FTC_ImageQueryRec iquery; + FTC_ImageNode node; + FT_Error error; + + + /* some argument checks are delayed to ftc_cache_lookup */ + if ( !aglyph ) + return FTC_Err_Invalid_Argument; + + if ( anode ) + *anode = NULL; + + iquery.gquery.gindex = gindex; + iquery.type = *type; + + error = ftc_cache_lookup( FTC_CACHE( cache ), + FTC_QUERY( &iquery ), + (FTC_Node*)&node ); + if ( !error ) + { + *aglyph = node->glyph; + + if ( anode ) + { + *anode = (FTC_Node)node; + FTC_NODE( node )->ref_count++; + } + } + + return error; + } + + + /* backwards-compatibility functions */ + + FT_EXPORT_DEF( FT_Error ) + FTC_Image_Cache_New( FTC_Manager manager, + FTC_Image_Cache *acache ) + { + return FTC_ImageCache_New( manager, (FTC_ImageCache*)acache ); + } + + + FT_EXPORT_DEF( FT_Error ) + FTC_Image_Cache_Lookup( FTC_Image_Cache icache, + FTC_Image_Desc* desc, + FT_UInt gindex, + FT_Glyph *aglyph ) + { + FTC_ImageTypeRec type0; + + + if ( !desc ) + return FTC_Err_Invalid_Argument; + + type0.font = desc->font; + + /* convert image type flags to load flags */ + { + FT_UInt load_flags = FT_LOAD_DEFAULT; + FT_UInt type = desc->image_type; + + + /* determine load flags, depending on the font description's */ + /* image type */ + + if ( ftc_image_format( type ) == ftc_image_format_bitmap ) + { + if ( type & ftc_image_flag_monochrome ) + load_flags |= FT_LOAD_MONOCHROME; + + /* disable embedded bitmaps loading if necessary */ + if ( type & ftc_image_flag_no_sbits ) + load_flags |= FT_LOAD_NO_BITMAP; + } + else + { + /* we want an outline, don't load embedded bitmaps */ + load_flags |= FT_LOAD_NO_BITMAP; + + if ( type & ftc_image_flag_unscaled ) + load_flags |= FT_LOAD_NO_SCALE; + } + + /* always render glyphs to bitmaps */ + load_flags |= FT_LOAD_RENDER; + + if ( type & ftc_image_flag_unhinted ) + load_flags |= FT_LOAD_NO_HINTING; + + if ( type & ftc_image_flag_autohinted ) + load_flags |= FT_LOAD_FORCE_AUTOHINT; + + type0.flags = load_flags; + } + + return FTC_ImageCache_Lookup( (FTC_ImageCache)icache, + &type0, + gindex, + aglyph, + NULL ); + } + + /* END */ diff --git a/reactos/lib/freetype/src/cache/ftcmanag.c b/reactos/lib/freetype/src/cache/ftcmanag.c index 6d60e4cf744..7cdb8f9da77 100644 --- a/reactos/lib/freetype/src/cache/ftcmanag.c +++ b/reactos/lib/freetype/src/cache/ftcmanag.c @@ -4,7 +4,7 @@ /* */ /* FreeType Cache Manager (body). */ /* */ -/* Copyright 2000-2001, 2002, 2003, 2004 by */ +/* Copyright 2000-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -18,7 +18,8 @@ #include <ft2build.h> #include FT_CACHE_H -#include FT_CACHE_INTERNAL_MANAGER_H +#include FT_CACHE_MANAGER_H +#include FT_CACHE_INTERNAL_LRU_H #include FT_INTERNAL_OBJECTS_H #include FT_INTERNAL_DEBUG_H #include FT_SIZES_H @@ -32,170 +33,32 @@ #define FTC_LRU_GET_MANAGER( lru ) ( (FTC_Manager)(lru)->user_data ) - static FT_Error - ftc_scaler_lookup_size( FTC_Manager manager, - FTC_Scaler scaler, - FT_Size *asize ) + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FACE LRU IMPLEMENTATION *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct FTC_FaceNodeRec_* FTC_FaceNode; + typedef struct FTC_SizeNodeRec_* FTC_SizeNode; + + + typedef struct FTC_FaceNodeRec_ { - FT_Face face; - FT_Size size = NULL; - FT_Error error; + FT_LruNodeRec lru; + FT_Face face; - - error = FTC_Manager_LookupFace( manager, scaler->face_id, &face ); - if ( error ) - goto Exit; - - error = FT_New_Size( face, &size ); - if ( error ) - goto Exit; - - FT_Activate_Size( size ); - - if ( scaler->pixel ) - error = FT_Set_Pixel_Sizes( face, scaler->width, scaler->height ); - else - error = FT_Set_Char_Size( face, scaler->width, scaler->height, - scaler->x_res, scaler->y_res ); - if ( error ) - { - FT_Done_Size( size ); - size = NULL; - } - - Exit: - *asize = size; - return error; - } + } FTC_FaceNodeRec; typedef struct FTC_SizeNodeRec_ { - FTC_MruNodeRec node; - FT_Size size; - FTC_ScalerRec scaler; + FT_LruNodeRec lru; + FT_Size size; - } FTC_SizeNodeRec, *FTC_SizeNode; - - - FT_CALLBACK_DEF( void ) - ftc_size_node_done( FTC_SizeNode node ) - { - FT_Size size = node->size; - - - if ( size ) - FT_Done_Size( size ); - } - - - FT_CALLBACK_DEF( FT_Bool ) - ftc_size_node_compare( FTC_SizeNode node, - FTC_Scaler scaler ) - { - FTC_Scaler scaler0 = &node->scaler; - - - if ( FTC_SCALER_COMPARE( scaler0, scaler ) ) - { - FT_Activate_Size( node->size ); - return 1; - } - return 0; - } - - - FT_CALLBACK_DEF( FT_Error ) - ftc_size_node_init( FTC_SizeNode node, - FTC_Scaler scaler, - FTC_Manager manager ) - { - node->scaler = scaler[0]; - - return ftc_scaler_lookup_size( manager, scaler, &node->size ); - } - - - FT_CALLBACK_DEF( FT_Error ) - ftc_size_node_reset( FTC_SizeNode node, - FTC_Scaler scaler, - FTC_Manager manager ) - { - FT_Done_Size( node->size ); - - node->scaler = scaler[0]; - - return ftc_scaler_lookup_size( manager, scaler, &node->size ); - } - - - static const FTC_MruListClassRec ftc_size_list_class = - { - sizeof( FTC_SizeNodeRec ), - (FTC_MruNode_CompareFunc)ftc_size_node_compare, - (FTC_MruNode_InitFunc) ftc_size_node_init, - (FTC_MruNode_ResetFunc) ftc_size_node_reset, - (FTC_MruNode_DoneFunc) ftc_size_node_done - }; - - - /* helper function used by ftc_face_node_done */ - static FT_Bool - ftc_size_node_compare_faceid( FTC_SizeNode node, - FTC_FaceID face_id ) - { - return FT_BOOL( node->scaler.face_id == face_id ); - } - - - FT_EXPORT_DEF( FT_Error ) - FTC_Manager_LookupSize( FTC_Manager manager, - FTC_Scaler scaler, - FT_Size *asize ) - { - FT_Error error; - FTC_SizeNode node; - - - if ( asize == NULL ) - return FTC_Err_Bad_Argument; - - *asize = NULL; - - if ( !manager ) - return FTC_Err_Invalid_Cache_Handle; - -#ifdef FTC_INLINE - - FTC_MRULIST_LOOKUP_CMP( &manager->sizes, scaler, ftc_size_node_compare, - node, error ); - -#else - error = FTC_MruList_Lookup( &manager->sizes, scaler, (FTC_MruNode*)&node ); -#endif - - if ( !error ) - *asize = node->size; - - return error; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** FACE MRU IMPLEMENTATION *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct FTC_FaceNodeRec_ - { - FTC_MruNodeRec node; - FTC_FaceID face_id; - FT_Face face; - - } FTC_FaceNodeRec, *FTC_FaceNode; + } FTC_SizeNodeRec; FT_CALLBACK_DEF( FT_Error ) @@ -206,8 +69,6 @@ FT_Error error; - node->face_id = face_id; - error = manager->request_face( face_id, manager->library, manager->request_data, @@ -223,49 +84,55 @@ } + /* helper function for ftc_face_node_done() */ + FT_CALLBACK_DEF( FT_Bool ) + ftc_size_node_select( FTC_SizeNode node, + FT_Face face ) + { + return FT_BOOL( node->size->face == face ); + } + + FT_CALLBACK_DEF( void ) ftc_face_node_done( FTC_FaceNode node, FTC_Manager manager ) { - /* we must begin by removing all scalers for the target face */ - /* from the manager's list */ - FTC_MruList_RemoveSelection( - & manager->sizes, - (FTC_MruNode_CompareFunc)ftc_size_node_compare_faceid, - node->face_id ); + FT_Face face = node->face; + + + /* we must begin by removing all sizes for the target face */ + /* from the manager's list */ + FT_LruList_Remove_Selection( manager->sizes_list, + (FT_LruNode_SelectFunc)ftc_size_node_select, + face ); /* all right, we can discard the face now */ - FT_Done_Face( node->face ); - node->face = NULL; - node->face_id = NULL; + FT_Done_Face( face ); + node->face = NULL; } - FT_CALLBACK_DEF( FT_Bool ) - ftc_face_node_compare( FTC_FaceNode node, - FTC_FaceID face_id ) + FT_CALLBACK_TABLE_DEF + const FT_LruList_ClassRec ftc_face_list_class = { - return FT_BOOL( node->face_id == face_id ); - } + sizeof ( FT_LruListRec ), + (FT_LruList_InitFunc)0, + (FT_LruList_DoneFunc)0, - - static const FTC_MruListClassRec ftc_face_list_class = - { - sizeof( FTC_FaceNodeRec), - - (FTC_MruNode_CompareFunc)ftc_face_node_compare, - (FTC_MruNode_InitFunc) ftc_face_node_init, - (FTC_MruNode_ResetFunc) NULL, - (FTC_MruNode_DoneFunc) ftc_face_node_done + sizeof ( FTC_FaceNodeRec ), + (FT_LruNode_InitFunc) ftc_face_node_init, + (FT_LruNode_DoneFunc) ftc_face_node_done, + (FT_LruNode_FlushFunc) 0, /* no flushing needed */ + (FT_LruNode_CompareFunc)0, /* direct comparison of FTC_FaceID handles */ }; /* documentation is in ftcache.h */ FT_EXPORT_DEF( FT_Error ) - FTC_Manager_LookupFace( FTC_Manager manager, - FTC_FaceID face_id, - FT_Face *aface ) + FTC_Manager_Lookup_Face( FTC_Manager manager, + FTC_FaceID face_id, + FT_Face *aface ) { FT_Error error; FTC_FaceNode node; @@ -279,16 +146,9 @@ if ( !manager ) return FTC_Err_Invalid_Cache_Handle; - /* we break encapsulation for the sake of speed */ -#ifdef FTC_INLINE - - FTC_MRULIST_LOOKUP_CMP( &manager->faces, face_id, ftc_face_node_compare, - node, error ); - -#else - error = FTC_MruList_Lookup( &manager->faces, face_id, (FTC_MruNode*)&node ); -#endif - + error = FT_LruList_Lookup( manager->faces_list, + (FT_LruKey)face_id, + (FT_LruNode*)&node ); if ( !error ) *aface = node->face; @@ -296,6 +156,283 @@ } + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SIZES LRU IMPLEMENTATION *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct FTC_SizeQueryRec_ + { + FT_Face face; + FT_UInt width; + FT_UInt height; + + } FTC_SizeQueryRec, *FTC_SizeQuery; + + + FT_CALLBACK_DEF( FT_Error ) + ftc_size_node_init( FTC_SizeNode node, + FTC_SizeQuery query ) + { + FT_Face face = query->face; + FT_Size size; + FT_Error error; + + + node->size = NULL; + error = FT_New_Size( face, &size ); + if ( !error ) + { + FT_Activate_Size( size ); + error = FT_Set_Pixel_Sizes( query->face, + query->width, + query->height ); + if ( error ) + FT_Done_Size( size ); + else + node->size = size; + } + return error; + } + + + FT_CALLBACK_DEF( void ) + ftc_size_node_done( FTC_SizeNode node ) + { + if ( node->size ) + { + FT_Done_Size( node->size ); + node->size = NULL; + } + } + + + FT_CALLBACK_DEF( FT_Error ) + ftc_size_node_flush( FTC_SizeNode node, + FTC_SizeQuery query ) + { + FT_Size size = node->size; + FT_Error error; + + + if ( size->face == query->face ) + { + FT_Activate_Size( size ); + error = FT_Set_Pixel_Sizes( query->face, query->width, query->height ); + if ( error ) + { + FT_Done_Size( size ); + node->size = NULL; + } + } + else + { + FT_Done_Size( size ); + node->size = NULL; + + error = ftc_size_node_init( node, query ); + } + return error; + } + + + FT_CALLBACK_DEF( FT_Bool ) + ftc_size_node_compare( FTC_SizeNode node, + FTC_SizeQuery query ) + { + FT_Size size = node->size; + + + return FT_BOOL( size->face == query->face && + (FT_UInt)size->metrics.x_ppem == query->width && + (FT_UInt)size->metrics.y_ppem == query->height ); + } + + + FT_CALLBACK_TABLE_DEF + const FT_LruList_ClassRec ftc_size_list_class = + { + sizeof ( FT_LruListRec ), + (FT_LruList_InitFunc)0, + (FT_LruList_DoneFunc)0, + + sizeof ( FTC_SizeNodeRec ), + (FT_LruNode_InitFunc) ftc_size_node_init, + (FT_LruNode_DoneFunc) ftc_size_node_done, + (FT_LruNode_FlushFunc) ftc_size_node_flush, + (FT_LruNode_CompareFunc)ftc_size_node_compare + }; + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_Manager_Lookup_Size( FTC_Manager manager, + FTC_Font font, + FT_Face *aface, + FT_Size *asize ) + { + FT_Error error; + + + /* check for valid `manager' delayed to FTC_Manager_Lookup_Face() */ + if ( aface ) + *aface = 0; + + if ( asize ) + *asize = 0; + + error = FTC_Manager_Lookup_Face( manager, font->face_id, aface ); + if ( !error ) + { + FTC_SizeQueryRec query; + FTC_SizeNode node; + + + query.face = *aface; + query.width = font->pix_width; + query.height = font->pix_height; + + error = FT_LruList_Lookup( manager->sizes_list, + (FT_LruKey)&query, + (FT_LruNode*)&node ); + if ( !error ) + { + /* select the size as the current one for this face */ + FT_Activate_Size( node->size ); + + if ( asize ) + *asize = node->size; + } + } + + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SET TABLE MANAGEMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + ftc_family_table_init( FTC_FamilyTable table ) + { + table->count = 0; + table->size = 0; + table->entries = NULL; + table->free = FTC_FAMILY_ENTRY_NONE; + } + + + static void + ftc_family_table_done( FTC_FamilyTable table, + FT_Memory memory ) + { + FT_FREE( table->entries ); + table->free = 0; + table->count = 0; + table->size = 0; + } + + + FT_EXPORT_DEF( FT_Error ) + ftc_family_table_alloc( FTC_FamilyTable table, + FT_Memory memory, + FTC_FamilyEntry *aentry ) + { + FTC_FamilyEntry entry; + FT_Error error = 0; + + + /* re-allocate table size when needed */ + if ( table->free == FTC_FAMILY_ENTRY_NONE && table->count >= table->size ) + { + FT_UInt old_size = table->size; + FT_UInt new_size, idx; + + + if ( old_size == 0 ) + new_size = 8; + else + { + new_size = old_size * 2; + + /* check for (unlikely) overflow */ + if ( new_size < old_size ) + new_size = 65534; + } + + if ( FT_RENEW_ARRAY( table->entries, old_size, new_size ) ) + return error; + + table->size = new_size; + + entry = table->entries + old_size; + table->free = old_size; + + for ( idx = old_size; idx + 1 < new_size; idx++, entry++ ) + { + entry->link = idx + 1; + entry->index = idx; + } + + entry->link = FTC_FAMILY_ENTRY_NONE; + entry->index = idx; + } + + if ( table->free != FTC_FAMILY_ENTRY_NONE ) + { + entry = table->entries + table->free; + table->free = entry->link; + } + else if ( table->count < table->size ) + { + entry = table->entries + table->count++; + } + else + { + FT_ERROR(( "ftc_family_table_alloc: internal bug!" )); + return FTC_Err_Invalid_Argument; + } + + entry->link = FTC_FAMILY_ENTRY_NONE; + table->count++; + + *aentry = entry; + return error; + } + + + FT_EXPORT_DEF( void ) + ftc_family_table_free( FTC_FamilyTable table, + FT_UInt idx ) + { + /* simply add it to the linked list of free entries */ + if ( idx < table->count ) + { + FTC_FamilyEntry entry = table->entries + idx; + + + if ( entry->link != FTC_FAMILY_ENTRY_NONE ) + FT_ERROR(( "ftc_family_table_free: internal bug!\n" )); + else + { + entry->link = table->free; + table->free = entry->index; + table->count--; + } + } + } + + /*************************************************************************/ /*************************************************************************/ /***** *****/ @@ -338,28 +475,41 @@ if ( max_bytes == 0 ) max_bytes = FTC_MAX_BYTES_DEFAULT; + error = FT_LruList_New( &ftc_face_list_class, + max_faces, + manager, + memory, + &manager->faces_list ); + if ( error ) + goto Exit; + + error = FT_LruList_New( &ftc_size_list_class, + max_sizes, + manager, + memory, + &manager->sizes_list ); + if ( error ) + goto Exit; + manager->library = library; - manager->memory = memory; manager->max_weight = max_bytes; + manager->cur_weight = 0; manager->request_face = requester; manager->request_data = req_data; - FTC_MruList_Init( &manager->faces, - &ftc_face_list_class, - max_faces, - manager, - memory ); - - FTC_MruList_Init( &manager->sizes, - &ftc_size_list_class, - max_sizes, - manager, - memory ); + ftc_family_table_init( &manager->families ); *amanager = manager; Exit: + if ( error && manager ) + { + FT_LruList_Destroy( manager->faces_list ); + FT_LruList_Destroy( manager->sizes_list ); + FT_FREE( manager ); + } + return error; } @@ -376,29 +526,31 @@ if ( !manager || !manager->library ) return; - memory = manager->memory; + memory = manager->library->memory; /* now discard all caches */ - for (idx = manager->num_caches; idx-- > 0; ) + for (idx = 0; idx < FTC_MAX_CACHES; idx++ ) { FTC_Cache cache = manager->caches[idx]; if ( cache ) { - cache->clazz.cache_done( cache ); + cache->clazz->cache_done( cache ); FT_FREE( cache ); - manager->caches[idx] = NULL; + manager->caches[idx] = 0; } } - manager->num_caches = 0; + + /* discard families table */ + ftc_family_table_done( &manager->families, memory ); /* discard faces and sizes */ - FTC_MruList_Done( &manager->sizes ); - FTC_MruList_Done( &manager->faces ); + FT_LruList_Destroy( manager->faces_list ); + manager->faces_list = 0; - manager->library = NULL; - manager->memory = NULL; + FT_LruList_Destroy( manager->sizes_list ); + manager->sizes_list = 0; FT_FREE( manager ); } @@ -411,8 +563,8 @@ { if ( manager ) { - FTC_MruList_Reset( &manager->sizes ); - FTC_MruList_Reset( &manager->faces ); + FT_LruList_Reset( manager->sizes_list ); + FT_LruList_Reset( manager->faces_list ); } /* XXX: FIXME: flush the caches? */ } @@ -424,7 +576,7 @@ FTC_Manager_Check( FTC_Manager manager ) { FTC_Node node, first; - + first = manager->nodes_list; @@ -432,22 +584,26 @@ if ( first ) { FT_ULong weight = 0; - + node = first; do { - FTC_Cache cache = manager->caches[node->cache_index]; + FTC_FamilyEntry entry = manager->families.entries + node->fam_index; + FTC_Cache cache; - - if ( (FT_UInt)node->cache_index >= manager->num_caches ) - FT_ERROR(( "FTC_Manager_Check: invalid node (cache index = %ld\n", - node->cache_index )); + if ( (FT_UInt)node->fam_index >= manager->families.count || + entry->link != FTC_FAMILY_ENTRY_NONE ) + FT_ERROR(( "FTC_Manager_Check: invalid node (family index = %ld\n", + node->fam_index )); else - weight += cache->clazz.node_weight( node, cache ); + { + cache = entry->cache; + weight += cache->clazz->node_weight( node, cache ); + } - node = FTC_NODE__NEXT( node ); + node = node->mru_next; } while ( node != first ); @@ -466,7 +622,7 @@ do { count++; - node = FTC_NODE__NEXT( node ); + node = node->mru_next; } while ( node != first ); @@ -508,14 +664,14 @@ if ( manager->cur_weight < manager->max_weight || first == NULL ) return; - /* go to last node -- it's a circular list */ - node = FTC_NODE__PREV( first ); + /* go to last node - it's a circular list */ + node = first->mru_prev; do { - FTC_Node prev; + FTC_Node prev = node->mru_prev; - prev = ( node == first ) ? NULL : FTC_NODE__PREV( node ); + prev = ( node == first ) ? NULL : node->mru_prev; if ( node->ref_count <= 0 ) ftc_node_destroy( node, manager ); @@ -529,9 +685,9 @@ /* documentation is in ftcmanag.h */ FT_EXPORT_DEF( FT_Error ) - FTC_Manager_RegisterCache( FTC_Manager manager, - FTC_CacheClass clazz, - FTC_Cache *acache ) + FTC_Manager_Register_Cache( FTC_Manager manager, + FTC_Cache_Class clazz, + FTC_Cache *acache ) { FT_Error error = FTC_Err_Invalid_Argument; FTC_Cache cache = NULL; @@ -539,37 +695,50 @@ if ( manager && clazz && acache ) { - FT_Memory memory = manager->memory; + FT_Memory memory = manager->library->memory; + FT_UInt idx = 0; - if ( manager->num_caches >= FTC_MAX_CACHES ) + /* check for an empty cache slot in the manager's table */ + for ( idx = 0; idx < FTC_MAX_CACHES; idx++ ) + { + if ( manager->caches[idx] == 0 ) + break; + } + + /* return an error if there are too many registered caches */ + if ( idx >= FTC_MAX_CACHES ) { error = FTC_Err_Too_Many_Caches; - FT_ERROR(( "%s: too many registered caches\n", - "FTC_Manager_Register_Cache" )); + FT_ERROR(( "FTC_Manager_Register_Cache:" )); + FT_ERROR(( " too many registered caches\n" )); goto Exit; } if ( !FT_ALLOC( cache, clazz->cache_size ) ) { - cache->manager = manager; - cache->memory = memory; - cache->clazz = clazz[0]; - cache->org_class = clazz; + cache->manager = manager; + cache->memory = memory; + cache->clazz = clazz; /* THIS IS VERY IMPORTANT! IT WILL WRETCH THE MANAGER */ /* IF IT IS NOT SET CORRECTLY */ - cache->index = manager->num_caches; + cache->cache_index = idx; - error = clazz->cache_init( cache ); - if ( error ) + if ( clazz->cache_init ) { - clazz->cache_done( cache ); - FT_FREE( cache ); - goto Exit; + error = clazz->cache_init( cache ); + if ( error ) + { + if ( clazz->cache_done ) + clazz->cache_done( cache ); + + FT_FREE( cache ); + goto Exit; + } } - manager->caches[manager->num_caches++] = cache; + manager->caches[idx] = cache; } } @@ -579,66 +748,17 @@ } - FT_EXPORT_DEF( FT_UInt ) - FTC_Manager_FlushN( FTC_Manager manager, - FT_UInt count ) - { - FTC_Node first = manager->nodes_list; - FTC_Node node; - FT_UInt result; - - - /* try to remove `count' nodes from the list */ - if ( first == NULL ) /* empty list! */ - return 0; - - /* go to last node - it's a circular list */ - node = FTC_NODE__PREV(first); - for ( result = 0; result < count; ) - { - FTC_Node prev = FTC_NODE__PREV( node ); - - - /* don't touch locked nodes */ - if ( node->ref_count <= 0 ) - { - ftc_node_destroy( node, manager ); - result++; - } - - if ( prev == manager->nodes_list ) - break; - - node = prev; - } - return result; - } - - - FT_EXPORT_DEF( void ) - FTC_Manager_RemoveFaceID( FTC_Manager manager, - FTC_FaceID face_id ) - { - FT_UInt nn; - - /* this will remove all FTC_SizeNode that correspond to - * the face_id as well - */ - FTC_MruList_RemoveSelection( &manager->faces, NULL, face_id ); - - for ( nn = 0; nn < manager->num_caches; nn++ ) - FTC_Cache_RemoveFaceID( manager->caches[nn], face_id ); - } - - /* documentation is in ftcmanag.h */ FT_EXPORT_DEF( void ) FTC_Node_Unref( FTC_Node node, FTC_Manager manager ) { - if ( node && (FT_UInt)node->cache_index < manager->num_caches ) + if ( node && (FT_UInt)node->fam_index < manager->families.count && + manager->families.entries[node->fam_index].cache ) + { node->ref_count--; + } } diff --git a/reactos/lib/freetype/src/cache/ftcmru.c b/reactos/lib/freetype/src/cache/ftcmru.c deleted file mode 100644 index 4b2a7fff501..00000000000 --- a/reactos/lib/freetype/src/cache/ftcmru.c +++ /dev/null @@ -1,355 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftcmru.c */ -/* */ -/* FreeType MRU support (body). */ -/* */ -/* Copyright 2003, 2004 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_CACHE_H -#include FT_CACHE_INTERNAL_MRU_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H - -#include "ftcerror.h" - - - FT_EXPORT_DEF( void ) - FTC_MruNode_Prepend( FTC_MruNode *plist, - FTC_MruNode node ) - { - FTC_MruNode first = *plist; - - - if ( first ) - { - FTC_MruNode last = first->prev; - - -#ifdef FT_DEBUG_ERROR - { - FTC_MruNode cnode = first; - - - do - { - if ( cnode == node ) - { - fprintf( stderr, "FTC_MruNode_Prepend: invalid action!\n" ); - exit( 2 ); - } - cnode = cnode->next; - - } while ( cnode != first ); - } -#endif - - first->prev = node; - last->next = node; - node->next = first; - node->prev = last; - } - else - { - node->next = node; - node->prev = node; - } - *plist = node; - } - - - FT_EXPORT_DEF( void ) - FTC_MruNode_Up( FTC_MruNode *plist, - FTC_MruNode node ) - { - FTC_MruNode first = *plist; - - - FT_ASSERT( first != NULL ); - - if ( first != node ) - { - FTC_MruNode prev, next, last; - - -#ifdef FT_DEBUG_ERROR - { - FTC_MruNode cnode = first; - do - { - if ( cnode == node ) - goto Ok; - cnode = cnode->next; - - } while ( cnode != first ); - - fprintf( stderr, "FTC_MruNode_Up: invalid action!\n" ); - exit( 2 ); - Ok: - } -#endif - prev = node->prev; - next = node->next; - - prev->next = next; - next->prev = prev; - - last = first->prev; - - last->next = node; - first->prev = node; - - node->next = first; - node->prev = last; - - *plist = node; - } - } - - - FT_EXPORT_DEF( void ) - FTC_MruNode_Remove( FTC_MruNode *plist, - FTC_MruNode node ) - { - FTC_MruNode first = *plist; - FTC_MruNode prev, next; - - - FT_ASSERT( first != NULL ); - -#ifdef FT_DEBUG_ERROR - { - FTC_MruNode cnode = first; - - - do - { - if ( cnode == node ) - goto Ok; - cnode = cnode->next; - - } while ( cnode != first ); - - fprintf( stderr, "FTC_MruNode_Remove: invalid action!\n" ); - exit( 2 ); - Ok: - } -#endif - - prev = node->prev; - next = node->next; - - prev->next = next; - next->prev = prev; - - if ( node == next ) - { - FT_ASSERT( first == node ); - FT_ASSERT( prev == node ); - - *plist = NULL; - } - else if ( node == first ) - *plist = next; - } - - - FT_EXPORT_DEF( void ) - FTC_MruList_Init( FTC_MruList list, - FTC_MruListClass clazz, - FT_UInt max_nodes, - FT_Pointer data, - FT_Memory memory ) - { - list->num_nodes = 0; - list->max_nodes = max_nodes; - list->nodes = NULL; - list->clazz = *clazz; - list->data = data; - list->memory = memory; - } - - - FT_EXPORT( void ) - FTC_MruList_Reset( FTC_MruList list ) - { - while ( list->nodes ) - FTC_MruList_Remove( list, list->nodes ); - - FT_ASSERT( list->num_nodes == 0 ); - } - - - FT_EXPORT( void ) - FTC_MruList_Done( FTC_MruList list ) - { - FTC_MruList_Reset( list ); - } - - - FT_EXPORT_DEF( FTC_MruNode ) - FTC_MruList_Find( FTC_MruList list, - FT_Pointer key ) - { - FTC_MruNode_CompareFunc compare = list->clazz.node_compare; - FTC_MruNode first, node; - - - first = list->nodes; - node = NULL; - - if ( first ) - { - node = first; - do - { - if ( compare( node, key ) ) - { - if ( node != first ) - FTC_MruNode_Up( &list->nodes, node ); - - return node; - } - - node = node->next; - - } while ( node != first); - } - - return NULL; - } - - - FT_EXPORT_DEF( FT_Error ) - FTC_MruList_New( FTC_MruList list, - FT_Pointer key, - FTC_MruNode *anode ) - { - FT_Error error; - FTC_MruNode node; - FT_Memory memory = list->memory; - - - if ( list->num_nodes >= list->max_nodes && list->max_nodes > 0 ) - { - node = list->nodes->prev; - - FT_ASSERT( node ); - - if ( list->clazz.node_reset ) - { - FTC_MruNode_Up( &list->nodes, node ); - - error = list->clazz.node_reset( node, key, list->data ); - if ( !error ) - goto Exit; - } - - FTC_MruNode_Remove( &list->nodes, node ); - list->num_nodes--; - - if ( list->clazz.node_done ) - list->clazz.node_done( node, list->data ); - } - else if ( FT_ALLOC( node, list->clazz.node_size ) ) - goto Exit; - - error = list->clazz.node_init( node, key, list->data ); - if ( error ) - goto Fail; - - FTC_MruNode_Prepend( &list->nodes, node ); - list->num_nodes++; - - Exit: - *anode = node; - return error; - - Fail: - if ( list->clazz.node_done ) - list->clazz.node_done( node, list->data ); - - FT_FREE( node ); - goto Exit; - } - - - FT_EXPORT( FT_Error ) - FTC_MruList_Lookup( FTC_MruList list, - FT_Pointer key, - FTC_MruNode *anode ) - { - FTC_MruNode node; - - - node = FTC_MruList_Find( list, key ); - if ( node == NULL ) - return FTC_MruList_New( list, key, anode ); - - *anode = node; - return 0; - } - - - FT_EXPORT_DEF( void ) - FTC_MruList_Remove( FTC_MruList list, - FTC_MruNode node ) - { - FTC_MruNode_Remove( &list->nodes, node ); - list->num_nodes--; - - { - FT_Memory memory = list->memory; - - - if ( list->clazz.node_done ) - list->clazz.node_done( node, list->data ); - - FT_FREE( node ); - } - } - - - FT_EXPORT_DEF( void ) - FTC_MruList_RemoveSelection( FTC_MruList list, - FTC_MruNode_CompareFunc selection, - FT_Pointer key ) - { - FTC_MruNode first, node, next; - - - first = list->nodes; - while ( first && selection( first, key ) ) - { - FTC_MruList_Remove( list, first ); - first = list->nodes; - } - - if ( first ) - { - node = first->next; - while ( node != first ) - { - next = node->next; - - if ( selection( node, key ) ) - FTC_MruList_Remove( list, node ); - - node = next; - } - } - } - - -/* END */ diff --git a/reactos/lib/freetype/src/cache/ftcsbits.c b/reactos/lib/freetype/src/cache/ftcsbits.c index 98f68ee8ca7ec9292a3d3d730f34e619d5fcc732..2faf80f33ed3f6d12988c495bf963b5beed19dd8 100644 GIT binary patch literal 16862 zcmeHOZFAc;68@fFfuu8zWJ_+EPCGYktr=OC6JKR1mE~zVcQ-tmqAXq{(j}=lYMcA* z_v|hJf)phyjr;95i7gR}#bV!g0e^Y;c+ZzlzC2Wq^&ASeSsr9JQJx(KpM_Xs`z##A zWQ*-Q4a3R$E>ujTTKchn8>XsplT6pm<6^?jPZrxwsC@@DwqA0#PNUm-u3o-)@uH0% zU$yAtOaA$_x>@gqP-8pu-$zq5S*3B9w$wPe3DaEt94+SIV%buDJXJr3G^PgO5@WYp zw*HswbTW@JHH#LZ!tXmDge5bT&qHN}bC)Ln34>e+UHWU4#EZ4M3DqhKr!CC~P1`b= zMze@s)2^mbmZ#CpDi5b>6;H82LY#-`GTXL_pwrkEQ4q#i*iwUwUVnJiKc2jufH$XW z6(n&U#j7a3Re3^$v=lGBZmA@7)@5`WTW)u{PF5<4r%~YNAZPC9ir&oq_n}Hdf67$q zwRs;US!-;(pDd?s^8X+R?{XF8YPMP|)>|Z4Lgdo6Iq;|6Fl~?Nk)AyHB8r2>Y8t8^ zX8FsTRkWBM&pXB2^NH8%_FnhB*ER31F1v$)cX~0o?7q3Gg}4|_`r~1D;Jq6B^5%5~ z#14*5|K9ISsu=9>S^xC<Rb_5}JRXf{MnTpyIKwbalk|B0><Qja!&wwV&nG?a3N(5b zlm6wE_ohGghNH8-QeS-wD5Y{ZD1a)c@+!zRc$5#5X*do84=!6U$gA&brj!6^4zT`? z|1$H{VtqH)*p#}Bf%khmcy$`(n4y({-Q+*E5d1G*`eSu5yxrU?ZLpy}sHRd4)o|%= z%Ijv`)-CFvR$;oX--sE)PJSh*Vk;L*ICt{)vL9k=g<><er49{A{Hk^fKVA37zX-9; z78ril9t`4he;F-!4~_ukB~yh^Ox#v8hSS1drJ;g}ZRmt$Oo0_Z6%pGpum)JSGKLkd z!WlcamKEpS%Zq{Lg>f4WPh_%X%7)&{bnmi%IWipO4T(usMh}?f?M{$|xe_h;^3fa) zvG%XPW|;CPfAjtd+G??o2T|+^6&cr6EfBxl2ix}9)sYIe#}Gxa)5pO^9ua{uj{>Nb z*C!8*H*m%tS(q0f)$;IR>EAW1A<;Hzv<1le2dGYY(xFl^dnfE=xJ*(?+LrR63B<-g zg(jsqI2gP1F5;Y4zKil;u1@qC?GAspK-Yr=DTvCV-^iIUvC#}ZRc8I5Ucg3#euJm2 z5%6o82i)+$9%F)$3f!SxFHP<<)ntF56ytshXvEb~ufZ&8cWzd*86}pCt!Y;T7;M_> zjo!dF5Hkx%VOa59X6i-KFh{0ZaN{Fy4A^>D^|agj(L3v(H`MzCIW6tZN|HjCH%;QO zkR!!4u!lyriHAIL&kv9o(i89}S2`4(;fO^a@asg-wL7$>tdNA3SCFhoa3_unlW508 zsAjtp<>3-q2QWL?Xopsg6CtDBk?%&bGo+Rc^*xeLTB4&~e9vq>I%>(QcH8Cs`M8f5 z>+;=-kvMisVc)B;Ok8e>Uf>p%5V0bP9md4?7KuNtieL{RT<Y?R#Gp&DT{0u7NN53W z1hnn2-nEtuVOF=uyu%N>pv9&b_|O;C#NK~ri-8)l2jS6*$@V;(OX);vyBchWo)8*w z(`PJn?gyfj_&UR9JLihbRzF0a8L+BKV<dT_Ic&GGarFaoE+8kKG&$ST8VRYQ_^NyU z_=C63LmEj(JB@lIN0LUms;)Itn8>^147t%zlopF8w#xGzs-yS*0`|>XO0`n>;hAc} z4GDePMUd%28gP{i?RC@J)iN}81!W~@Yg1aM+MPvolltk}F)xB6epQTH9l_r8j@zX@ z3A2n_WXG*#t+m)2B+0wgokyZ-Santhq^a!=C7;JL)R5cMkO*>~0}_7=vq|up3*w7q zX>sy~xyT*SA3)9EuNEkqO{JMBU;TR-Wf`j0=bE#eP0~UoKXC%rBFxho&U?d_{HdsT zgY~gxY>Dm9>}uiPX6g^p-@&MR=8gNqv;No+Z9<4kwlOUt1G5}kg`>PPBIhx-ud77@ zJ<a$h2qV_CJFF-rShxp-^h3f5$>Jkm4`>#`4u3B}JF9;1r|<ok_`TMjj2RIwFc+~R zcqesxvPu<nZxvDx1Lb#&ZouE#q)F5v@KN8T*;AT^$MTwyTu_$-Ef4&Qu^(zo1U~f< z2&E<%V|kLOg`eIUdoLrQ%Ktu8_t9dZ79sTyu(F>yV!n^^IScn#qBNNBf+(>y8ER)l z)ZXjvxS<eFsURb^1CG2zZ|<i}bW`Nj2|-k5p8hgHnAx0py3WJuOzTF##J6wXey7ea z-d^^<Q~q?Sven&P0tZAv?mhZbXpUe{J{lu=2K!l~-$P^zE184yB#nL}E-!$9B?kT@ zfB6tDGMCv#p0p)a8!~+Kg@WvuP;~X&BlY!5?7!1d-xiu-G@xcK5m`Ie(#RGn{1q;V zSlb=WsfgEj4h}3lf3JhTkEW2~E_jij!7n-7!|<*(c#Cj`ifRizg1-cxCwJ-rc*}Vq zWygL6zvZ?AZ}L~yOBi=0d?B==t*mo~2|QRx(#)BM+*YlhLxS0yBJ3=dVWTk1=yaM! z<q=QH+~gOIA(i+?5Swc;S9i_>#O5^1Y1eMe%S~|0XcyeP+ysYBF43gKQ^RLAI1k-V zorW;+I-V^358iF+uQPXI!>}%1E%j(yeMPbK3s}qx^04d~r%9N_&vSL3r0?M6;NsYs zQHy#yMMqcAu&FyHgxOf}h8?OvsQY;czmOpC-Js3fwtm+~%QblS)b$lQK8c{<&CwS3 z7wyiBgW3UwCrOb<KM!?Z(WczA@82ClBt#(xs$w}&|E<B}a^2{vcG<#F`dO5LGUQJB z=&TJ77(V$TM2mUmye(5lfefXu%P0<CzKX+prI$uY5g|!L-$^326Ml#ulla&au2f8u zCA74d&>z=@Z<%I?JP;Ho_f*R)@6fWBa<a4_JJcd0Cko`zY5Ixko?e-n$2dW0q_sO@ z_%^RWF~d<rGR$d&yfKTC7zYFIoIvxDv{68)s-b>=wnD2t%g|<b-~grhM1h>yg4j)+ z{Uy5_?(HW*uu4;CF1YHX1DJ~#zVxBxtC&^+1TUG1!vCB2Xu~(+_wzzyF_&_H=i&)Z zPSne9zIonK&$XAs3qY42%Tdhz)W^<cNr?0h4zwCPm72GYgnYEhz0u6OEP5TZQlWq1 zBQ?=PbD<Q1R0!id)X)fWWtvH3PSo&vFrW;{F=4R+o%-+DNq{wiXyhH6-GnHP@;_0^ zzM|rqd%>m;y)Dr%cOUBd52oH^#+XdBQo$Ew)>ZJ1jTvU@-_j#T_Pnzu1~8H7_G3{N z{Yvfic87l*qpCqW8|gr`B(k2t7I&~u`n-)H1%=#qK&~cjfrsIVMm|U}{b+ij+w?*$ zbzcmn592dCe2_VsWY$KvI1^Pi2~0&~MW3opWJS}3g}1*VOG9u|k?%R}sj9N>Nns7K zO%}5`58A(n;r3UgIdxL1mP^g9jV1+!H72CmQoE22D6`i|vtX{e?a3q30FlZ7K7#x& z=@%-YEL_ZttK`ZV>!5(f`Eo-Y>aFW|peK@p!4Yhbq*Gf$@XVvV`gsa2$}Aw-D5qz} zC~6vb%$jx^%~LFWbW~}Ru$wJ;J)=#9FO@iltpP!)JxttT1OnkUgK5ajD>Z~^0KA}r zj2Ov#2fut&`tOlMNhFNuB+W3EW*8O;O5>+Zz$FN39m-EvpJ^U>{w*C|2>LWh7By~} zQUpKU=<`14S&UG$YtGnt?eGKyU-X8JQEr-x#;3iEt1H_7$V#RQQZX~J6*2=J;FIW5 z4_2b1VF$AlKhiKmf5$`w`34*nKVw<Ny*{*Tc+Z9s)(<^ZRLdw9v_SeC06}^Zhsa9M z+@Sn~RYOz(I!B!q<ZXpMkbR2j>ed;Y0WWIejBH1OiuBgm?y7!ZpY9uLlS$gy04mu5 zvJ){3Nj8w9AltAxyV)!^muk*Zh}F!Zr!{d*uWiHuGvK%;TCyW<i4x+#za~x@J=qnf zbUZTMK)V?tq#QGGOu9-vas3J|%-9=2*4d-cC}WX-#aZa%oavF5qK9_!84u$q&Kqkn zQA%;8SXLLi&Q+1o)AInf+9hgVR<QBc&-_u)_L+z@Z4`82?d5Yhyr{{hCGGNxM0MZe zo5D?KC#xRv+7+i=>$P>4-X1i;Z<bBRx?I@{Nk}K)^bvb34rk<OMiP*sy-!Jv_ImcJ z3CC8)nVL%XS-_CTd@`6P=x9E3U8>}f5*;eX3q(b6ys+Vsh}MnAC5sOski7??7fp8r zLKg`iMw9}`Q=zaNKn&GIJlfEKaz#PBQ_VezAR%8|c3<_q$uDnk`>T8Py5XL#d=jFX z>sNb{L7Z!MxRFI^bGGNSBF<OxgFWZ7t{M@1a<RLaRB6fBTtPzAe&?&K8fHS-MmaP| zjD^MUvX!g_S%zZ|bf<^XPGb*r$>$jkR>H-Uu2s^>2pb9?66jt8FwFc6jXIs2${wPO zS~)llD93HRL9NXN23Ng5<+H|Mb1&NEXf%*A%TdqX=<-c>jB^s_{Ev?F90wt_GcCTE zlZg*>t;IVZT@TMtN<(s}9fT{U%+S^1|D$=0C?%T9MX8!$=ar6ee@&+GIPure_Bhz8 z(R|W99rWq04Z;deGc&n+%H@#PTliVV7b&fQu}|^>8c-*gB6d$HCl}o0A$Ts$(q5i# zehR`1G}_KranNLo6<m}oh(mM$dpPGz8Io2ui{jk|<QZ-PRZ&vcrKLl)OIeYPRLMK% z&K6Fk4SmjqBkeXTbm|#BsZlMdREBtZhW0}a$$C;jvn<0^mYKDS_#s*zRnqBQJ>gWS za4zOhz|cQ)o2cL#6V1?4MO5KyH_7muTjT|*8!Q%}-9c?WN<j;^K1~9?&4HVHNlfSD z;?8LXPHw5*1UO}zZ{Li@6S)*dUu`Sb1SQe1VR$co+2(#Q_TA0J5(4D+KC7D()tq}M zCNUd_xA?1rFcoG0)Z7f`!F2{DY<HZ~wvUCO95xNLl*&qnWk06k6prqjv%&J!`s=H{ zcQG7X4Ex2kfmi*ZzIZQHEUx+K5I1Y7UvY?oc=k^$Y#zI-vIW#!6P`6&#g%Z*Cz_34 z=~kh=cu=fOU6Nwuc=yV#S~}~JS~eST?W(+wx`hX$(T~?}99JNYXu+3$%2)n*<T%2W z|1aoRj%xs1p@cWAFqbvj+>W;VauLgV?i)f%r+n13+m7^8%tY=j6^-Jaz8cA^Zr4NF zkiB6Kp;OJX3)-}ZL_Z#Cu^U6w+H~m0<OO!&?|CHG0-nB5ePXjwaT6M#Qrt<4nstw3 zoa9$zN0NzAv?$P%UYRZ&#E>9^O%<-}u=A28T87(LxXU6fv?6Yax|q(HG@4{<Oe-zt zco<L&Z(hCW#zbj`pys4Q2;I|Wd_GZUu>p?0mcV3l$I_xZE?RbcBqV#*AS6?wNuCpR z=oGeYwZ}f))l$(W*7t@f$F~d5EP&r6cU>XrWZ9$+4p7}k_Jbs%!{&i-Kz1TL7Glfg zYQaK+*GCcM79>&Q9@Yrr()CG`g6k~4%ze>4BG<}+P)e)UrIJ9ZBe*pb&g9zg(UEMX zXyVa?`ZFRZ<P9!4-1|7uXmd=?qnl_E<!k(*SR7DjH8&{s38fO%yxLg$KrrPUk>!|< z`p$4lfb4o?Efc4U$iRbjLGBZ_QT26(GSSf;8cM=pZ|9wbS#YRe-dV5{zU=SJ#Yr|^ z65hr`D-aLNfKgA^hdCaX-4vN4UEE}>qUl7Jwf_Bl31i{D5H;ip0h-acW+ytQNBKSs zAJ6k*&@xmAbR$m5;Shl-xiw=B4dk1yn2jkwSaMcC=L(*HP@_xkj-vMHUJoWl+bu9- z7tR<8d0CGJ3<EgOPDA=@Px>=EKDgioTG-SbMNM4hKw?P^2ihNRHI44bB%a&TKgQzh z$;e~R-;$&fFw28nzfdYys&Lnm7}Zp`s8Jo$f0JURXIQ3D@x%jn7G#2JSaA}}(_~rr zd|KS$?jHqvFGs^s@AY_e+1C++Kp{%}*{n}Dr8aI_5gOte_7aD52?n>QP4uF<yvKUN z;)L&b<4;K(ov$ZrIMP?EjNIj@0x_CyHPJdIjMFF3iw@Gg4*~iyT15E*(uRm3#9V~F zu??+*H2XmcEVVoKwu&=cRz+~%Yj0O*mxJN7I_Kr`0o(8w_jFS(g=(5^7Ty1K@3{$V zJ<)Q}+DdXKy>q&h=F(e_5|Vh0zjD18zS;+^zsi$65ucC7y}sAIo{R{;MNX>o;@EhB zf+pcsxzA}Fqy!1$$vN)Z*wN%9WQSiCe&Xi=FTD@sL#e7o33c3^q!y6H%@L~8pbEG% HPj>Y`>8a1y delta 2767 zcmaJ@OK)366eg|GhZDznIB{g>ahy28c5PZ35`@#Zb^J(E5+`+BN~MaMTl?BEvVG0< zO`E=CAvP?!pqv!~vET<Fq%KO4kPt$EfWjX@-5{}{E5rtY1ZQUM*tH3@WZ84?nKR${ z<~!faqqn+#iGMQDjc2-#c5f}OX16fiUAcGQ=x+yu$yYZwGFc^&O!?ueUdltj29V0e zm94a%*OZi@X?`(Auuq~g-Gk@t=MLAa^fnyD2lm^;EP91UC-kZny@KCOj@wgNC6!4g z{lLO;r_a~VrYU7z&C8_KaW8(`XUC7`Ja~V>j^8Y}kI=LWYkIYammNM#y*N0=vxEE; zSrULH4r>K#FdT_1DYa56UzZ^TF<Js18;*+cB9+F9Q`WVLZirx<92mhL9UlDE;b>6R z%Oz7L0jOUonQ{`n6KllFYP}ASE2}qdEZS^5XQ=>w@H5=2RWsl(ma2Je55jVJF%Cd< zi8DdO<@DXE$+-r&$x{$8e9+&I5Bp!iFTjbf4GcG|JOP1$uSjLnI_+QrqCCoKVPX|9 z?BVE@-9kY#XwnIS${uTmp|dd$mBjEJQHtg3wH-f*WFaV)oUDovRMe_k)Qk|!7Sx=E z?@W3|in^)8vYKCEQ>@H4ZFpwLiH`<*@$p~~M~6a~8VWWzHTAMiU<$fXQBCl&ol{oU zE^VGwQX84|SXLoTuE#blK3a_M%}Qo68yUYJre^99;241kNXtXMl&?N(f}xqaMio?` ziYsc(d$~FlvM2?>*L!+SPZi9Z!X?Wqoq~WxDPyFg7WN3>wqOh3co3e!t3#*p{!kqM z9(sU(Is@n%j^Ot2qNvRqKbwrdtSn#3lF$W&aMaMRkwyYM*R5MkG&J5f{8}k*?mR6# zem0hAWv`XY9ECUjKfQ<-v<pm1Su2p@U|%%*gqwPe74Vesy(u++RjuYU3;2F$@XL{4 ze+R=h{C#8rL$2efxK1FtUcm2Nb9i9%7(P$m?a_IBkG}Kn1UB3YT{isM?Xz<gsrAwg zTFi$3xL?9;&n&*}iQreB$h%_^OoZo9A3KbDV{;ABP*R=|i+#}$f@x}ilk@YUtz@h0 zXr<zgDO!b>(%C}k3u|j~ifAJd)|w(zgSL<xM;0es+!NE<HOuSR5Fl7X$Mk47H%<It z9LQ38(H9szB3%g|+TC%MnVKZYyOsX)^~B;$bEd~!)65E6*enww<-hNP1`8Ip1y*BI zaPf^@&A2X`-)i4ZQ?VS5!r7a6j8v|W1;*A_*DfjXwb<5{A98ALhc-mw;_k<gTOU(z zm}*&iq^Z+@(zQEJQ8N{8hArdaS;JAwc4T_404oRC83~gdirXx?s(8+hu9kT)$__EB zOJ%WZz(dW#b(q|fo^JIxPwXYy(#ebBq+)_@&($QALk&UQR1G>Aq)G50BUbvpU;drp z?6ET!&mD8j$zq6HegH`1VVO}d$03P`D8`PB4mO>!IgveXSX;-WB9GwJYRMFOTS;#u ztfQ9-vM`6F3TV@0U$Em;o=CJk3|RA}(D@Ry8>mGSel`L4^Tc!b>7w`Ub~oOc>?M{t zcrj0q*xC{S^vRnA7jURuNQ?s^>?d{2Jej@WyT&$A^mVW%L-}vlBL37nLEY!b^D6`= zj!T<2<3--%ZT%>wGo&|p{^nLUsct*7rPjq&0Y3--DelJdxwyHo3dpOZLMSKoOEQzS zh?8ueT4LLHkW_(3y{GSe?Dcjr=-y>rFLxl1>y?^nShuS!JTg7qv=E<VA<kjzp7fs! z(gc3!8+Q^4o|wQHT79?7b{XFcyC&N%NwCyu5O>cz56sS@+T%Ley5dNIcieHPb56DK zg+GMdnDHeJS%j?)1P_Te!M}WU8`GY+58|B}|K06A{A0$Ak4Jj3e>QlKb{lQu9!$^n O+2|lnrV|i6Zu=KfCl_-7 diff --git a/reactos/lib/freetype/src/cache/rules.mk b/reactos/lib/freetype/src/cache/rules.mk index 154f126dc30..617ca48dae8 100644 --- a/reactos/lib/freetype/src/cache/rules.mk +++ b/reactos/lib/freetype/src/cache/rules.mk @@ -25,9 +25,8 @@ CACHE_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(CACHE_DIR)) # Cache driver sources (i.e., C files) # -CACHE_DRV_SRC := $(CACHE_DIR)/ftcmru.c \ +CACHE_DRV_SRC := $(CACHE_DIR)/ftlru.c \ $(CACHE_DIR)/ftcmanag.c \ - $(CACHE_DIR)/ftcbasic.c \ $(CACHE_DIR)/ftccache.c \ $(CACHE_DIR)/ftcglyph.c \ $(CACHE_DIR)/ftcsbits.c \ @@ -36,11 +35,10 @@ CACHE_DRV_SRC := $(CACHE_DIR)/ftcmru.c \ # Cache driver headers # -CACHE_DRV_H := $(CACHE_H_DIR)/ftcmru.h \ +CACHE_DRV_H := $(CACHE_H_DIR)/ftlru.h \ $(CACHE_H_DIR)/ftcmanag.h \ $(CACHE_H_DIR)/ftcglyph.h \ $(CACHE_H_DIR)/ftcimage.h \ - $(CACHE_H_DIR)/ftccmap.h \ $(CACHE_DIR)/ftcerror.h diff --git a/reactos/lib/freetype/src/cff/Jamfile b/reactos/lib/freetype/src/cff/Jamfile index dcf24c818a1..cf7cf631336 100644 --- a/reactos/lib/freetype/src/cff/Jamfile +++ b/reactos/lib/freetype/src/cff/Jamfile @@ -1,4 +1,4 @@ -# FreeType 2 src/cff Jamfile (c) 2001, 2002 David Turner +# FreeType 2 src/cff Jamfile (c) 2001 David Turner # SubDir FT2_TOP $(FT2_SRC_DIR) cff ; diff --git a/reactos/lib/freetype/src/cff/cff.c b/reactos/lib/freetype/src/cff/cff.c index e6d8954c9ab..013c329cab3 100644 --- a/reactos/lib/freetype/src/cff/cff.c +++ b/reactos/lib/freetype/src/cff/cff.c @@ -4,7 +4,7 @@ /* */ /* FreeType OpenType driver component (body only). */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 1996-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/reactos/lib/freetype/src/cff/cffcmap.c b/reactos/lib/freetype/src/cff/cffcmap.c index c50718a74a5..5ed9d5dcf9a 100644 --- a/reactos/lib/freetype/src/cff/cffcmap.c +++ b/reactos/lib/freetype/src/cff/cffcmap.c @@ -19,8 +19,6 @@ #include "cffcmap.h" #include "cffload.h" -#include "cfferrs.h" - /*************************************************************************/ /*************************************************************************/ @@ -39,7 +37,7 @@ cmap->gids = encoding->codes; - + return 0; } @@ -60,7 +58,7 @@ if ( char_code < 256 ) result = cmap->gids[char_code]; - + return result; } @@ -71,27 +69,27 @@ { FT_UInt result = 0; FT_UInt32 char_code = *pchar_code; - + *pchar_code = 0; if ( char_code < 255 ) { FT_UInt code = (FT_UInt)(char_code + 1); - + for (;;) { if ( code >= 256 ) break; - + result = cmap->gids[code]; if ( result != 0 ) { *pchar_code = code; break; } - + code++; } } @@ -125,28 +123,28 @@ { FT_UInt32 u1 = ((CFF_CMapUniPair)pair1)->unicode; FT_UInt32 u2 = ((CFF_CMapUniPair)pair2)->unicode; - + if ( u1 < u2 ) return -1; - + if ( u1 > u2 ) return +1; - + return 0; - } + } FT_CALLBACK_DEF( FT_Error ) cff_cmap_unicode_init( CFF_CMapUnicode cmap ) { - FT_Error error; - FT_UInt count; - TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); - FT_Memory memory = FT_FACE_MEMORY( face ); - CFF_Font cff = (CFF_Font)face->extra.data; - CFF_Charset charset = &cff->charset; - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + FT_Error error; + FT_UInt count; + TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + CFF_Font cff = (CFF_Font)face->extra.data; + CFF_Charset charset = &cff->charset; + PSNames_Service psnames = (PSNames_Service)cff->psnames; cmap->num_pairs = 0; @@ -169,7 +167,7 @@ gname = cff_index_get_sid_string( &cff->string_index, sid, psnames ); - + /* build unsorted pair table by matching glyph names */ if ( gname ) { @@ -181,7 +179,7 @@ pair->gindex = n; pair++; } - + FT_FREE( gname ); } } @@ -223,7 +221,7 @@ FT_Face face = FT_CMAP_FACE( cmap ); FT_Memory memory = FT_FACE_MEMORY( face ); - + FT_FREE( cmap->pairs ); cmap->num_pairs = 0; } diff --git a/reactos/lib/freetype/src/cff/cffdrivr.c b/reactos/lib/freetype/src/cff/cffdrivr.c index 077d28ec702..54929b7155f 100644 --- a/reactos/lib/freetype/src/cff/cffdrivr.c +++ b/reactos/lib/freetype/src/cff/cffdrivr.c @@ -4,7 +4,7 @@ /* */ /* OpenType font driver implementation (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* Copyright 1996-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -22,19 +22,14 @@ #include FT_INTERNAL_STREAM_H #include FT_INTERNAL_SFNT_H #include FT_TRUETYPE_IDS_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H -#include FT_SERVICE_POSTSCRIPT_INFO_H -#include FT_SERVICE_TT_CMAP_H +#include FT_INTERNAL_POSTSCRIPT_NAMES_H #include "cffdrivr.h" #include "cffgload.h" #include "cffload.h" -#include "cffcmap.h" #include "cfferrs.h" -#include FT_SERVICE_XFREE86_NAME_H -#include FT_SERVICE_GLYPH_DICT_H /*************************************************************************/ /* */ @@ -215,10 +210,17 @@ } - /* - * GLYPH DICT SERVICE - * - */ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** C H A R A C T E R M A P P I N G S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ static FT_Error cff_get_glyph_name( CFF_Face face, @@ -226,19 +228,21 @@ FT_Pointer buffer, FT_UInt buffer_max ) { - CFF_Font font = (CFF_Font)face->extra.data; - FT_Memory memory = FT_FACE_MEMORY( face ); - FT_String* gname; - FT_UShort sid; - FT_Service_PsCMaps psnames; - FT_Error error; + CFF_Font font = (CFF_Font)face->extra.data; + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_String* gname; + FT_UShort sid; + PSNames_Service psnames; + FT_Error error; - FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + psnames = (PSNames_Service)FT_Get_Module_Interface( + face->root.driver->root.library, "psnames" ); + if ( !psnames ) { FT_ERROR(( "cff_get_glyph_name:" )); - FT_ERROR(( " cannot get glyph name from CFF & CEF fonts\n" )); + FT_ERROR(( " cannot open CFF & CEF fonts\n" )); FT_ERROR(( " " )); FT_ERROR(( " without the `PSNames' module\n" )); error = CFF_Err_Unknown_File_Format; @@ -271,26 +275,42 @@ } + /*************************************************************************/ + /* */ + /* <Function> */ + /* cff_get_name_index */ + /* */ + /* <Description> */ + /* Uses the psnames module and the CFF font's charset to to return a */ + /* a given glyph name's glyph index. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* glyph_name :: The glyph name. */ + /* */ + /* <Return> */ + /* Glyph index. 0 means `undefined character code'. */ + /* */ static FT_UInt cff_get_name_index( CFF_Face face, FT_String* glyph_name ) { - CFF_Font cff; - CFF_Charset charset; - FT_Service_PsCMaps psnames; - FT_Memory memory = FT_FACE_MEMORY( face ); - FT_String* name; - FT_UShort sid; - FT_UInt i; - FT_Int result; + CFF_Font cff; + CFF_Charset charset; + PSNames_Service psnames; + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_String* name; + FT_UShort sid; + FT_UInt i; + FT_Int result; cff = (CFF_FontRec *)face->extra.data; charset = &cff->charset; - FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); - if ( !psnames ) - return 0; + psnames = (PSNames_Service)FT_Get_Module_Interface( + face->root.driver->root.library, "psnames" ); for ( i = 0; i < cff->num_glyphs; i++ ) { @@ -314,76 +334,6 @@ } - static const FT_Service_GlyphDictRec cff_service_glyph_dict = - { - (FT_GlyphDict_GetNameFunc) cff_get_glyph_name, - (FT_GlyphDict_NameIndexFunc)cff_get_name_index, - }; - - - /* - * POSTSCRIPT INFO SERVICE - * - */ - - static FT_Int - cff_ps_has_glyph_names( FT_Face face ) - { - return ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) > 0; - } - - - static const FT_Service_PsInfoRec cff_service_ps_info = - { - (PS_GetFontInfoFunc) NULL, /* unsupported with CFF fonts */ - (PS_HasGlyphNamesFunc)cff_ps_has_glyph_names - }; - - - /* - * TT CMAP INFO - * - * If the charmap is a synthetic Unicode encoding cmap or - * a Type 1 standard (or expert) encoding cmap, hide TT CMAP INFO - * service defined in SFNT module. - * - * Otherwise call the service function in the sfnt module. - * - */ - static FT_Error - cff_get_cmap_info( FT_CharMap charmap, - TT_CMapInfo *cmap_info ) - { - FT_CMap cmap = FT_CMAP( charmap ); - FT_Error error = CFF_Err_Ok; - - - cmap_info->language = 0; - - if ( cmap->clazz != &cff_cmap_encoding_class_rec && - cmap->clazz != &cff_cmap_unicode_class_rec ) - { - FT_Face face = FT_CMAP_FACE( cmap ); - FT_Library library = FT_FACE_LIBRARY( face ); - FT_Module sfnt = FT_Get_Module( library, "sfnt" ); - FT_Service_TTCMaps service = ft_module_get_service ( - sfnt, FT_SERVICE_ID_TT_CMAP ); - - - if ( service && service->get_cmap_info ) - error = service->get_cmap_info( charmap, cmap_info ); - } - - return error; - } - - - static const FT_Service_TTCMapsRec cff_service_get_cmap_info = - { - (TT_CMap_Info_GetFunc)cff_get_cmap_info - }; - - /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ @@ -396,31 +346,24 @@ /*************************************************************************/ /*************************************************************************/ - static const FT_ServiceDescRec cff_services[] = - { - { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CFF }, - { FT_SERVICE_ID_POSTSCRIPT_INFO, &cff_service_ps_info }, -#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES - { FT_SERVICE_ID_GLYPH_DICT, &cff_service_glyph_dict }, -#endif - { FT_SERVICE_ID_TT_CMAP, &cff_service_get_cmap_info }, - { NULL, NULL } - }; - - static FT_Module_Interface cff_get_interface( CFF_Driver driver, const char* module_interface ) { - FT_Module sfnt; - FT_Module_Interface result; + FT_Module sfnt; - result = ft_service_list_lookup( cff_services, module_interface ); - if ( result != NULL ) - return result; +#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES - /* we pass our request to the `sfnt' module */ + if ( ft_strcmp( (const char*)module_interface, "glyph_name" ) == 0 ) + return (FT_Module_Interface)cff_get_glyph_name; + + if ( ft_strcmp( (const char*)module_interface, "name_index" ) == 0 ) + return (FT_Module_Interface)cff_get_name_index; + +#endif + + /* we simply pass our request to the `sfnt' module */ sfnt = FT_Get_Module( driver->root.root.library, "sfnt" ); return sfnt ? sfnt->clazz->get_interface( sfnt, module_interface ) : 0; diff --git a/reactos/lib/freetype/src/cff/cffgload.c b/reactos/lib/freetype/src/cff/cffgload.c index af2b206a3e2..43d68494147 100644 --- a/reactos/lib/freetype/src/cff/cffgload.c +++ b/reactos/lib/freetype/src/cff/cffgload.c @@ -4,7 +4,7 @@ /* */ /* OpenType Glyph Loader (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* Copyright 1996-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -366,7 +366,7 @@ decoder->num_globals = cff->num_global_subrs; decoder->globals = cff->global_subrs; decoder->globals_bias = cff_compute_bias( decoder->num_globals ); - + decoder->hint_mode = hint_mode; } @@ -398,7 +398,7 @@ } - /* check that there is enough space for `count' more points */ + /* check that there is enough room for `count' more points */ static FT_Error check_points( CFF_Builder* builder, FT_Int count ) @@ -451,7 +451,7 @@ } - /* check space for a new contour, then add it */ + /* check room for a new contour, then add it */ static FT_Error cff_builder_add_contour( CFF_Builder* builder ) { @@ -545,10 +545,6 @@ FT_UShort glyph_sid; - /* CID-keyed fonts don't have glyph names */ - if ( !cff->charset.sids ) - return -1; - /* check range of standard char code */ if ( charcode < 0 || charcode > 255 ) return -1; @@ -644,13 +640,13 @@ FT_Int bchar, FT_Int achar ) { - FT_Error error; - CFF_Builder* builder = &decoder->builder; - FT_Int bchar_index, achar_index; - TT_Face face = decoder->builder.face; - FT_Vector left_bearing, advance; - FT_Byte* charstring; - FT_ULong charstring_len; + FT_Error error; + FT_Int bchar_index, achar_index, n_base_points; + FT_Outline* base = decoder->builder.base; + TT_Face face = decoder->builder.face; + FT_Vector left_bearing, advance; + FT_Byte* charstring; + FT_ULong charstring_len; #ifdef FT_CONFIG_OPTION_INCREMENTAL @@ -680,9 +676,9 @@ /* If we are trying to load a composite glyph, do not load the */ /* accent character and return the array of subglyphs. */ - if ( builder->no_recurse ) + if ( decoder->builder.no_recurse ) { - FT_GlyphSlot glyph = (FT_GlyphSlot)builder->glyph; + FT_GlyphSlot glyph = (FT_GlyphSlot)decoder->builder.glyph; FT_GlyphLoader loader = glyph->internal->loader; FT_SubGlyph subg; @@ -705,8 +701,8 @@ /* subglyph 1 = accent character */ subg->index = achar_index; subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES; - subg->arg1 = (FT_Int)( adx >> 16 ); - subg->arg2 = (FT_Int)( ady >> 16 ); + subg->arg1 = (FT_Int)adx; + subg->arg2 = (FT_Int)ady; /* set up remaining glyph fields */ glyph->num_subglyphs = 2; @@ -716,8 +712,6 @@ loader->current.num_subglyphs = 2; } - FT_GlyphLoader_Prepare( builder->loader ); - /* First load `bchar' in builder */ error = cff_get_glyph_data( face, bchar_index, &charstring, &charstring_len ); @@ -732,17 +726,16 @@ cff_free_glyph_data( face, &charstring, charstring_len ); } + n_base_points = base->n_points; + /* Save the left bearing and width of the base character */ /* as they will be erased by the next load. */ - left_bearing = builder->left_bearing; - advance = builder->advance; + left_bearing = decoder->builder.left_bearing; + advance = decoder->builder.advance; - builder->left_bearing.x = 0; - builder->left_bearing.y = 0; - - builder->pos_x = adx; - builder->pos_y = ady; + decoder->builder.left_bearing.x = 0; + decoder->builder.left_bearing.y = 0; /* Now load `achar' on top of the base outline. */ error = cff_get_glyph_data( face, achar_index, @@ -760,11 +753,20 @@ /* Restore the left side bearing and advance width */ /* of the base character. */ - builder->left_bearing = left_bearing; - builder->advance = advance; + decoder->builder.left_bearing = left_bearing; + decoder->builder.advance = advance; - builder->pos_x = 0; - builder->pos_y = 0; + /* Finally, move the accent. */ + if ( decoder->builder.load_points ) + { + FT_Outline dummy; + + + dummy.n_points = (short)( base->n_points - n_base_points ); + dummy.points = base->points + n_base_points; + + FT_Outline_Translate( &dummy, adx, ady ); + } Exit: return error; @@ -901,7 +903,7 @@ #ifdef FT_DEBUG_LEVEL_TRACE if ( !( val & 0xFFFFL ) ) - FT_TRACE4(( " %ld", (FT_Int32)( val >> 16 ) )); + FT_TRACE4(( " %d", (FT_Int32)( val >> 16 ) )); else FT_TRACE4(( " %.2f", val / 65536.0 )); #endif @@ -1221,7 +1223,7 @@ for ( maskbyte = 0; maskbyte < (FT_UInt)(( decoder->num_hints + 7 ) >> 3); maskbyte++, ip++ ) - FT_TRACE4(( "0x%02X", *ip )); + FT_TRACE4(( "%02X", *ip )); } #else ip += ( decoder->num_hints + 7 ) >> 3; @@ -1647,11 +1649,11 @@ case cff_op_flex1: { - FT_Pos start_x, start_y; /* record start x, y values for */ - /* alter use */ - FT_Fixed dx = 0, dy = 0; /* used in horizontal/vertical */ - /* algorithm below */ - FT_Int horizontal, count; + FT_Pos start_x, start_y; /* record start x, y values for alter */ + /* use */ + FT_Int dx = 0, dy = 0; /* used in horizontal/vertical */ + /* algorithm below */ + FT_Int horizontal, count; FT_TRACE4(( " flex1" )); @@ -1673,8 +1675,8 @@ /* grab up to the last argument */ for ( count = 5; count > 0; count-- ) { - dx += args[0]; - dy += args[1]; + dx += (FT_Int)args[0]; + dy += (FT_Int)args[1]; args += 2; } @@ -1730,7 +1732,7 @@ x += args[0]; y += args[1]; cff_builder_add_point( builder, x, y, - (FT_Bool)( count == 4 || count == 1 ) ); + (FT_Bool)( count == 3 || count == 0 ) ); args += 2; } @@ -1745,36 +1747,34 @@ if ( num_args == 4 ) { error = cff_operator_seac( decoder, - args[0], - args[1], + args[0] >> 16, + args[1] >> 16, (FT_Int)( args[2] >> 16 ), (FT_Int)( args[3] >> 16 ) ); args += 4; } - else + + if ( !error ) + error = CFF_Err_Ok; + + cff_builder_close_contour( builder ); + + /* close hints recording session */ + if ( hinter ) { - if ( !error ) - error = CFF_Err_Ok; + if (hinter->close( hinter->hints, builder->current->n_points ) ) + goto Syntax_Error; - cff_builder_close_contour( builder ); - - /* close hints recording session */ - if ( hinter ) - { - if (hinter->close( hinter->hints, builder->current->n_points ) ) - goto Syntax_Error; - - /* apply hints to the loaded glyph outline now */ - hinter->apply( hinter->hints, - builder->current, - (PSH_Globals)builder->hints_globals, - decoder->hint_mode ); - } - - /* add current outline to the glyph slot */ - FT_GlyphLoader_Add( builder->loader ); + /* apply hints to the loaded glyph outline now */ + hinter->apply( hinter->hints, + builder->current, + (PSH_Globals)builder->hints_globals, + decoder->hint_mode ); } + /* add current outline to the glyph slot */ + FT_GlyphLoader_Add( builder->loader ); + /* return now! */ FT_TRACE4(( "\n\n" )); return error; @@ -2315,13 +2315,6 @@ FT_ULong charstring_len; - /* in a CID-keyed font, consider `glyph_index' as a CID and map */ - /* it immediately to the real glyph_index -- if it isn't a */ - /* subsetted font, glyph_indices and CIDs are identical, though */ - if ( cff->top_font.font_dict.cid_registry != 0xFFFFU && - cff->charset.cids ) - glyph_index = cff->charset.cids[glyph_index]; - cff_decoder_init( &decoder, face, size, glyph, hinting, FT_LOAD_TARGET_MODE(load_flags) ); @@ -2369,7 +2362,7 @@ cff_builder_done( &decoder.builder ); } -#ifdef FT_CONFIG_OPTION_INCREMENTAL + #ifdef FT_CONFIG_OPTION_INCREMENTAL /* Incremental fonts can optionally override the metrics. */ if ( !error && @@ -2486,11 +2479,11 @@ if ( hinting ) { - metrics->horiAdvance = FT_PIX_ROUND( metrics->horiAdvance ); - metrics->vertAdvance = FT_PIX_ROUND( metrics->vertAdvance ); + metrics->horiAdvance = ( metrics->horiAdvance + 32 ) & -64; + metrics->vertAdvance = ( metrics->vertAdvance + 32 ) & -64; - metrics->vertBearingX = FT_PIX_ROUND( metrics->vertBearingX ); - metrics->vertBearingY = FT_PIX_ROUND( metrics->vertBearingY ); + metrics->vertBearingX = ( metrics->vertBearingX + 32 ) & -64; + metrics->vertBearingY = ( metrics->vertBearingY + 32 ) & -64; } } diff --git a/reactos/lib/freetype/src/cff/cffload.c b/reactos/lib/freetype/src/cff/cffload.c index bbec294ed91..cc95e790eb5 100644 --- a/reactos/lib/freetype/src/cff/cffload.c +++ b/reactos/lib/freetype/src/cff/cffload.c @@ -4,7 +4,7 @@ /* */ /* OpenType and CFF data/program tables loader (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* Copyright 1996-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -20,7 +20,7 @@ #include FT_INTERNAL_DEBUG_H #include FT_INTERNAL_OBJECTS_H #include FT_INTERNAL_STREAM_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_INTERNAL_POSTSCRIPT_NAMES_H #include FT_TRUETYPE_TAGS_H #include "cffload.h" @@ -1172,7 +1172,7 @@ } - /* allocate a table containing pointers to an index's elements */ + /* allocate a table containing pointers to an index's elements */ static FT_Error cff_index_get_pointers( CFF_Index idx, FT_Byte*** table ) @@ -1211,7 +1211,7 @@ FT_Byte** pbytes, FT_ULong* pbyte_len ) { - FT_Error error = CFF_Err_Ok; + FT_Error error = 0; if ( idx && idx->count > element ) @@ -1312,26 +1312,18 @@ FT_LOCAL_DEF( FT_String* ) - cff_index_get_sid_string( CFF_Index idx, - FT_UInt sid, - FT_Service_PsCMaps psnames ) + cff_index_get_sid_string( CFF_Index idx, + FT_UInt sid, + PSNames_Service psnames_service ) { - /* value 0xFFFFU indicates a missing dictionary entry */ - if ( sid == 0xFFFFU ) - return 0; - /* if it is not a standard string, return it */ if ( sid > 390 ) return cff_index_get_name( idx, sid - 391 ); - /* CID-keyed CFF fonts don't have glyph names */ - if ( !psnames ) - return 0; - /* that's a standard string, fetch a copy from the PSName module */ { FT_String* name = 0; - const char* adobe_name = psnames->adobe_std_strings( sid ); + const char* adobe_name = psnames_service->adobe_std_strings( sid ); FT_UInt len; @@ -1501,7 +1493,6 @@ FT_FREE( charset->sids ); - FT_FREE( charset->cids ); charset->format = 0; charset->offset = 0; } @@ -1512,8 +1503,7 @@ FT_UInt num_glyphs, FT_Stream stream, FT_ULong base_offset, - FT_ULong offset, - FT_Bool invert ) + FT_ULong offset ) { FT_Memory memory = stream->memory; FT_Error error = 0; @@ -1613,8 +1603,8 @@ case 0: if ( num_glyphs > 229 ) { - FT_ERROR(( "cff_charset_load: implicit charset larger than\n" - "predefined charset (Adobe ISO-Latin)!\n" )); + FT_ERROR(("cff_charset_load: implicit charset larger than\n" + "predefined charset (Adobe ISO-Latin)!\n" )); error = CFF_Err_Invalid_File_Format; goto Exit; } @@ -1624,7 +1614,8 @@ goto Exit; /* Copy the predefined charset into the allocated memory. */ - FT_ARRAY_COPY( charset->sids, cff_isoadobe_charset, num_glyphs ); + FT_MEM_COPY( charset->sids, cff_isoadobe_charset, + num_glyphs * sizeof ( FT_UShort ) ); break; @@ -1642,7 +1633,8 @@ goto Exit; /* Copy the predefined charset into the allocated memory. */ - FT_ARRAY_COPY( charset->sids, cff_expert_charset, num_glyphs ); + FT_MEM_COPY( charset->sids, cff_expert_charset, + num_glyphs * sizeof ( FT_UShort ) ); break; @@ -1660,7 +1652,8 @@ goto Exit; /* Copy the predefined charset into the allocated memory. */ - FT_ARRAY_COPY( charset->sids, cff_expertsubset_charset, num_glyphs ); + FT_MEM_COPY( charset->sids, cff_expertsubset_charset, + num_glyphs * sizeof ( FT_UShort ) ); break; @@ -1670,36 +1663,17 @@ } } - /* we have to invert the `sids' array for subsetted CID-keyed fonts */ - if ( invert ) - { - FT_UInt i; - FT_UShort max_cid = 0; - - - for ( i = 0; i < num_glyphs; i++ ) - if ( charset->sids[i] > max_cid ) - max_cid = charset->sids[i]; - max_cid++; - - if ( FT_NEW_ARRAY( charset->cids, max_cid ) ) - goto Exit; - FT_MEM_ZERO( charset->cids, sizeof ( FT_UShort ) * max_cid ); - - for ( i = 0; i < num_glyphs; i++ ) - charset->cids[charset->sids[i]] = i; - } - Exit: + /* Clean up if there was an error. */ if ( error ) - { - FT_FREE( charset->sids ); - FT_FREE( charset->cids ); - charset->format = 0; - charset->offset = 0; - charset->sids = 0; - } + if ( charset->sids ) + { + FT_FREE( charset->sids ); + charset->format = 0; + charset->offset = 0; + charset->sids = 0; + } return error; } @@ -1906,12 +1880,15 @@ { case 0: /* First, copy the code to SID mapping. */ - FT_ARRAY_COPY( encoding->sids, cff_standard_encoding, 256 ); + FT_MEM_COPY( encoding->sids, cff_standard_encoding, + 256 * sizeof ( FT_UShort ) ); + goto Populate; case 1: /* First, copy the code to SID mapping. */ - FT_ARRAY_COPY( encoding->sids, cff_expert_encoding, 256 ); + FT_MEM_COPY( encoding->sids, cff_expert_encoding, + 256 * sizeof ( FT_UShort ) ); Populate: /* Construct code to GID mapping from code to SID mapping */ @@ -1972,7 +1949,7 @@ { FT_Error error; CFF_ParserRec parser; - FT_Byte* dict = NULL; + FT_Byte* dict; FT_ULong dict_len; CFF_FontRecDict top = &font->font_dict; CFF_Private priv = &font->private_dict; @@ -1990,20 +1967,6 @@ top->font_matrix.yy = 0x10000L; top->cid_count = 8720; - /* we use the implementation specific SID value 0xFFFF to indicate */ - /* missing entries */ - top->version = 0xFFFFU; - top->notice = 0xFFFFU; - top->copyright = 0xFFFFU; - top->full_name = 0xFFFFU; - top->family_name = 0xFFFFU; - top->weight = 0xFFFFU; - top->embedded_postscript = 0xFFFFU; - - top->cid_registry = 0xFFFFU; - top->cid_ordering = 0xFFFFU; - top->cid_font_name = 0xFFFFU; - error = cff_index_access_element( idx, font_index, &dict, &dict_len ) || cff_parser_run( &parser, dict, dict + dict_len ); @@ -2013,7 +1976,7 @@ goto Exit; /* if it is a CID font, we stop there */ - if ( top->cid_registry != 0xFFFFU ) + if ( top->cid_registry ) goto Exit; /* parse the private dictionary, if any */ @@ -2154,15 +2117,8 @@ if ( error ) goto Exit; - if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) ) - goto Exit; - - error = cff_new_index( &font->charstrings_index, stream, 0 ); - if ( error ) - goto Exit; - /* now, check for a CID font */ - if ( dict->cid_registry != 0xFFFFU ) + if ( dict->cid_registry ) { CFF_IndexRec fd_index; CFF_SubFont sub; @@ -2205,7 +2161,7 @@ /* now load the FD Select array */ error = CFF_Load_FD_Select( &font->fd_select, - font->charstrings_index.count, + (FT_UInt)dict->cid_count, stream, base_offset + dict->cid_fd_select_offset ); @@ -2226,6 +2182,13 @@ goto Exit; } + if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) ) + goto Exit; + + error = cff_new_index( &font->charstrings_index, stream, 0 ); + if ( error ) + goto Exit; + /* explicit the global subrs */ font->num_global_subrs = font->global_subrs_index.count; font->num_glyphs = font->charstrings_index.count; @@ -2236,38 +2199,25 @@ if ( error ) goto Exit; - /* read the Charset and Encoding tables if available */ + /* read the Charset and Encoding tables when available */ if ( font->num_glyphs > 0 ) { - FT_Bool invert; - - - invert = dict->cid_registry != 0xFFFFU && - font->charstrings_index.count != dict->cid_count; error = cff_charset_load( &font->charset, font->num_glyphs, stream, - base_offset, dict->charset_offset, invert ); + base_offset, dict->charset_offset ); if ( error ) goto Exit; - /* CID-keyed CFFs don't have an encoding */ - if ( dict->cid_registry == 0xFFFFU ) - { - error = cff_encoding_load( &font->encoding, - &font->charset, - font->num_glyphs, - stream, - base_offset, - dict->encoding_offset ); - if ( error ) - goto Exit; - } - else - /* CID-keyed fonts only need CIDs */ - FT_FREE( font->charset.sids ); + error = cff_encoding_load( &font->encoding, + &font->charset, + font->num_glyphs, + stream, + base_offset, + dict->encoding_offset ); + if ( error ) + goto Exit; } - /* get the font name (/CIDFontName for CID-keyed fonts, */ - /* /FontName otherwise) */ + /* get the font name */ font->font_name = cff_index_get_name( &font->name_index, face_index ); Exit: diff --git a/reactos/lib/freetype/src/cff/cffload.h b/reactos/lib/freetype/src/cff/cffload.h index ccf8ada1c3c..4cadfe6bbbf 100644 --- a/reactos/lib/freetype/src/cff/cffload.h +++ b/reactos/lib/freetype/src/cff/cffload.h @@ -4,7 +4,7 @@ /* */ /* OpenType & CFF data/program tables loader (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -21,8 +21,8 @@ #include <ft2build.h> -#include "cfftypes.h" -#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_INTERNAL_CFF_TYPES_H +#include FT_INTERNAL_POSTSCRIPT_NAMES_H FT_BEGIN_HEADER @@ -36,9 +36,9 @@ FT_BEGIN_HEADER FT_UInt element ); FT_LOCAL( FT_String* ) - cff_index_get_sid_string( CFF_Index idx, - FT_UInt sid, - FT_Service_PsCMaps psnames ); + cff_index_get_sid_string( CFF_Index idx, + FT_UInt sid, + PSNames_Service psnames_interface ); FT_LOCAL( FT_Error ) @@ -62,7 +62,7 @@ FT_BEGIN_HEADER FT_LOCAL( FT_Byte ) - cff_fd_select_get( CFF_FDSelect fdselect, + cff_fd_select_get( CFF_FDSelect select, FT_UInt glyph_index ); diff --git a/reactos/lib/freetype/src/cff/cffobjs.c b/reactos/lib/freetype/src/cff/cffobjs.c index 6abb84b608c..f0700d1890b 100644 --- a/reactos/lib/freetype/src/cff/cffobjs.c +++ b/reactos/lib/freetype/src/cff/cffobjs.c @@ -24,7 +24,7 @@ #include FT_TRUETYPE_IDS_H #include FT_TRUETYPE_TAGS_H #include FT_INTERNAL_SFNT_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_INTERNAL_POSTSCRIPT_NAMES_H #include FT_INTERNAL_POSTSCRIPT_HINTS_H #include "cffobjs.h" #include "cffload.h" @@ -244,6 +244,8 @@ } + + FT_LOCAL_DEF( FT_Error ) cff_face_init( FT_Stream stream, CFF_Face face, @@ -251,37 +253,30 @@ FT_Int num_params, FT_Parameter* params ) { - FT_Error error; - SFNT_Service sfnt; - FT_Service_PsCMaps psnames; - PSHinter_Service pshinter; - FT_Bool pure_cff = 1; - FT_Bool sfnt_format = 0; + FT_Error error; + SFNT_Service sfnt; + PSNames_Service psnames; + PSHinter_Service pshinter; + FT_Bool pure_cff = 1; + FT_Bool sfnt_format = 0; -#if 0 - FT_FACE_FIND_GLOBAL_SERVICE( face, sfnt, SFNT ); - FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_NAMES ); - FT_FACE_FIND_GLOBAL_SERVICE( face, pshinter, POSTSCRIPT_HINTER ); - if ( !sfnt ) - goto Bad_Format; -#else sfnt = (SFNT_Service)FT_Get_Module_Interface( face->root.driver->root.library, "sfnt" ); if ( !sfnt ) goto Bad_Format; - FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + psnames = (PSNames_Service)FT_Get_Module_Interface( + face->root.driver->root.library, "psnames" ); pshinter = (PSHinter_Service)FT_Get_Module_Interface( face->root.driver->root.library, "pshinter" ); -#endif /* create input stream from resource */ if ( FT_STREAM_SEEK( 0 ) ) goto Exit; - /* check whether we have a valid OpenType file */ + /* check that we have a valid OpenType file */ error = sfnt->init_face( stream, face, face_index, num_params, params ); if ( !error ) { @@ -298,7 +293,7 @@ sfnt_format = 1; /* now, the font can be either an OpenType/CFF font, or an SVG CEF */ - /* font; in the latter case it doesn't have a `head' table */ + /* font; in the later case it doesn't have a `head' table */ error = face->goto_table( face, TTAG_head, stream, 0 ); if ( !error ) { @@ -312,7 +307,7 @@ } else { - /* load the `cmap' table explicitly */ + /* load the `cmap' table by hand */ error = sfnt->load_charmaps( face, stream ); if ( error ) goto Exit; @@ -322,7 +317,7 @@ /* FreeType 2 */ } - /* now load the CFF part of the file */ + /* now, load the CFF part of the file */ error = face->goto_table( face, TTAG_CFF, stream, 0 ); if ( error ) goto Exit; @@ -337,11 +332,10 @@ /* now load and parse the CFF table in the file */ { - CFF_Font cff; - CFF_FontRecDict dict; - FT_Memory memory = face->root.memory; - FT_Face root; - FT_Int32 flags; + CFF_Font cff; + FT_Memory memory = face->root.memory; + FT_Face root; + FT_Int32 flags; if ( FT_NEW( cff ) ) @@ -353,7 +347,7 @@ goto Exit; cff->pshinter = pshinter; - cff->psnames = (void*)psnames; + cff->psnames = psnames; /* Complement the root flags with some interesting information. */ /* Note that this is only necessary for pure CFF and CEF fonts. */ @@ -361,29 +355,26 @@ root = &face->root; root->num_glyphs = cff->num_glyphs; - dict = &cff->top_font.font_dict; - - /* we need the `PSNames' module for CFF and CEF formats */ - /* which aren't CID-keyed */ - if ( dict->cid_registry == 0xFFFFU && !psnames ) - { - FT_ERROR(( "cff_face_init:" )); - FT_ERROR(( " cannot open CFF & CEF fonts\n" )); - FT_ERROR(( " " )); - FT_ERROR(( " without the `PSNames' module\n" )); - goto Bad_Format; - } - if ( pure_cff ) { - char* style_name = NULL; + CFF_FontRecDict dict = &cff->top_font.font_dict; + /* we need the `PSNames' module for pure-CFF and CEF formats */ + if ( !psnames ) + { + FT_ERROR(( "cff_face_init:" )); + FT_ERROR(( " cannot open CFF & CEF fonts\n" )); + FT_ERROR(( " " )); + FT_ERROR(( " without the `PSNames' module\n" )); + goto Bad_Format; + } + /* Set up num_faces. */ root->num_faces = cff->num_faces; /* compute number of glyphs */ - if ( dict->cid_registry != 0xFFFFU ) + if ( dict->cid_registry ) root->num_glyphs = dict->cid_count; else root->num_glyphs = cff->charstrings_index.count; @@ -394,6 +385,7 @@ root->bbox.xMax = ( dict->font_bbox.xMax + 0xFFFFU ) >> 16; root->bbox.yMax = ( dict->font_bbox.yMax + 0xFFFFU ) >> 16; + root->ascender = (FT_Short)( root->bbox.yMax ); root->descender = (FT_Short)( root->bbox.yMin ); root->height = (FT_Short)( @@ -404,70 +396,17 @@ else root->units_per_EM = 1000; - root->underline_position = - (FT_Short)( dict->underline_position >> 16 ); - root->underline_thickness = - (FT_Short)( dict->underline_thickness >> 16 ); + root->underline_position = dict->underline_position >> 16; + root->underline_thickness = dict->underline_thickness >> 16; /* retrieve font family & style name */ - root->family_name = cff_index_get_name( &cff->name_index, - face_index ); - - if ( root->family_name ) - { - char* full = cff_index_get_sid_string( &cff->string_index, - dict->full_name, - psnames ); - char* fullp = full; - char* family = root->family_name; - - - if ( full ) - { - while ( *fullp ) - { - if ( *fullp == *family ) - { - family++; - fullp++; - } - else - { - if ( *fullp == ' ' || *fullp == '-' ) - fullp++; - else if ( *family == ' ' || *family == '-' ) - family++; - else - { - if ( !*family ) - { - style_name = cff_strcpy( memory, fullp ); - FT_FREE( full ); - } - break; - } - } - } - } - } + root->family_name = cff_index_get_name( &cff->name_index, face_index ); + if ( dict->cid_registry ) + root->style_name = cff_strcpy( memory, "Regular" ); /* XXXX */ else - { - char *cid_font_name = - cff_index_get_sid_string( &cff->string_index, - dict->cid_font_name, - psnames ); - - - /* do we have a `/FontName' for a CID-keyed font? */ - if ( cid_font_name ) - root->family_name = cid_font_name; - } - - if ( style_name ) - root->style_name = style_name; - else - /* assume "Regular" style if we don't know better */ - root->style_name = cff_strcpy( memory, (char *)"Regular" ); + root->style_name = cff_index_get_sid_string( &cff->string_index, + dict->weight, + psnames ); /*******************************************************************/ /* */ @@ -490,6 +429,10 @@ flags |= FT_FACE_FLAG_KERNING; #endif +#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES + flags |= FT_FACE_FLAG_GLYPH_NAMES; +#endif + root->face_flags = flags; /*******************************************************************/ @@ -501,29 +444,13 @@ if ( dict->italic_angle ) flags |= FT_STYLE_FLAG_ITALIC; - { - char *weight = cff_index_get_sid_string( &cff->string_index, - dict->weight, - psnames ); - - - if ( weight ) - if ( !ft_strcmp( weight, "Bold" ) || - !ft_strcmp( weight, "Black" ) ) - flags |= FT_STYLE_FLAG_BOLD; - FT_FREE( weight ); - } + /* XXX: may not be correct */ + if ( cff->top_font.private_dict.force_bold ) + flags |= FT_STYLE_FLAG_BOLD; root->style_flags = flags; } -#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES - /* CID-keyed CFF fonts don't have glyph names -- the SFNT loader */ - /* has unset this flag because of the 3.0 `post' table */ - if ( dict->cid_registry == 0xFFFFU ) - root->face_flags |= FT_FACE_FLAG_GLYPH_NAMES; -#endif - /*******************************************************************/ /* */ /* Compute char maps. */ @@ -552,12 +479,7 @@ goto Skip_Unicode; /* Standard Unicode (deprecated) */ } - /* since CID-keyed fonts don't contain glyph names, we can't */ - /* construct a cmap */ - if ( pure_cff && cff->top_font.font_dict.cid_registry != 0xFFFFU ) - goto Exit; - - /* we didn't find a Unicode charmap -- synthetize one */ + /* we didn't find a Unicode charmap, synthetize one */ cmaprec.face = root; cmaprec.platform_id = 3; cmaprec.encoding_id = 1; diff --git a/reactos/lib/freetype/src/cff/cffobjs.h b/reactos/lib/freetype/src/cff/cffobjs.h index 49d566550de..cf60ecfb254 100644 --- a/reactos/lib/freetype/src/cff/cffobjs.h +++ b/reactos/lib/freetype/src/cff/cffobjs.h @@ -4,7 +4,7 @@ /* */ /* OpenType objects manager (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -22,9 +22,9 @@ #include <ft2build.h> #include FT_INTERNAL_OBJECTS_H -#include "cfftypes.h" +#include FT_INTERNAL_CFF_TYPES_H #include FT_INTERNAL_TRUETYPE_TYPES_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_INTERNAL_POSTSCRIPT_NAMES_H FT_BEGIN_HEADER @@ -89,6 +89,15 @@ FT_BEGIN_HEADER } CFF_Transform; + /* this is only used in the case of a pure CFF font with no charmap */ + typedef struct CFF_CharMapRec_ + { + TT_CharMapRec root; + PS_Unicodes unicodes; + + } CFF_CharMapRec, *CFF_CharMap; + + /***********************************************************************/ /* */ /* TrueType driver class. */ diff --git a/reactos/lib/freetype/src/cff/cffparse.h b/reactos/lib/freetype/src/cff/cffparse.h index 8f3fa588592..2de95a2c5bb 100644 --- a/reactos/lib/freetype/src/cff/cffparse.h +++ b/reactos/lib/freetype/src/cff/cffparse.h @@ -4,7 +4,7 @@ /* */ /* CFF token stream parser (specification) */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -21,7 +21,7 @@ #include <ft2build.h> -#include "cfftypes.h" +#include FT_INTERNAL_CFF_TYPES_H #include FT_INTERNAL_OBJECTS_H diff --git a/reactos/lib/freetype/src/cff/cfftoken.h b/reactos/lib/freetype/src/cff/cfftoken.h index 659d1576aab..65a84683e8f 100644 --- a/reactos/lib/freetype/src/cff/cfftoken.h +++ b/reactos/lib/freetype/src/cff/cfftoken.h @@ -43,10 +43,10 @@ CFF_FIELD_NUM ( 17, charstrings_offset ) CFF_FIELD_CALLBACK( 18, private_dict ) CFF_FIELD_NUM ( 0x114, synthetic_base ) - CFF_FIELD_STRING ( 0x115, embedded_postscript ) + CFF_FIELD_STRING ( 0x115, postscript ) + CFF_FIELD_STRING ( 0x116, base_font_name ) #if 0 - CFF_FIELD_STRING ( 0x116, base_font_name ) CFF_FIELD_DELTA ( 0x117, base_font_blend, 16 ) CFF_FIELD_CALLBACK( 0x118, multiple_master ) CFF_FIELD_CALLBACK( 0x119, blend_axit_types ) diff --git a/reactos/lib/freetype/src/cff/cfftypes.h b/reactos/lib/freetype/src/cff/cfftypes.h deleted file mode 100644 index 9ddc663dea6..00000000000 --- a/reactos/lib/freetype/src/cff/cfftypes.h +++ /dev/null @@ -1,255 +0,0 @@ -/***************************************************************************/ -/* */ -/* cfftypes.h */ -/* */ -/* Basic OpenType/CFF type definitions and interface (specification */ -/* only). */ -/* */ -/* Copyright 1996-2001, 2002, 2003 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __CFFTYPES_H__ -#define __CFFTYPES_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* CFF_IndexRec */ - /* */ - /* <Description> */ - /* A structure used to model a CFF Index table. */ - /* */ - /* <Fields> */ - /* stream :: The source input stream. */ - /* */ - /* count :: The number of elements in the index. */ - /* */ - /* off_size :: The size in bytes of object offsets in index. */ - /* */ - /* data_offset :: The position of first data byte in the index's */ - /* bytes. */ - /* */ - /* offsets :: A table of element offsets in the index. */ - /* */ - /* bytes :: If the index is loaded in memory, its bytes. */ - /* */ - typedef struct CFF_IndexRec_ - { - FT_Stream stream; - FT_UInt count; - FT_Byte off_size; - FT_ULong data_offset; - - FT_ULong* offsets; - FT_Byte* bytes; - - } CFF_IndexRec, *CFF_Index; - - - typedef struct CFF_EncodingRec_ - { - FT_UInt format; - FT_ULong offset; - - FT_UInt count; - FT_UShort sids [256]; /* avoid dynamic allocations */ - FT_UShort codes[256]; - - } CFF_EncodingRec, *CFF_Encoding; - - - typedef struct CFF_CharsetRec_ - { - - FT_UInt format; - FT_ULong offset; - - FT_UShort* sids; - FT_UShort* cids; /* the inverse mapping of `sids'; only needed */ - /* for CID-keyed fonts */ - } CFF_CharsetRec, *CFF_Charset; - - - typedef struct CFF_FontRecDictRec_ - { - FT_UInt version; - FT_UInt notice; - FT_UInt copyright; - FT_UInt full_name; - FT_UInt family_name; - FT_UInt weight; - FT_Bool is_fixed_pitch; - FT_Fixed italic_angle; - FT_Fixed underline_position; - FT_Fixed underline_thickness; - FT_Int paint_type; - FT_Int charstring_type; - FT_Matrix font_matrix; - FT_UShort units_per_em; - FT_Vector font_offset; - FT_ULong unique_id; - FT_BBox font_bbox; - FT_Pos stroke_width; - FT_ULong charset_offset; - FT_ULong encoding_offset; - FT_ULong charstrings_offset; - FT_ULong private_offset; - FT_ULong private_size; - FT_Long synthetic_base; - FT_UInt embedded_postscript; - - /* these should only be used for the top-level font dictionary */ - FT_UInt cid_registry; - FT_UInt cid_ordering; - FT_ULong cid_supplement; - - FT_Long cid_font_version; - FT_Long cid_font_revision; - FT_Long cid_font_type; - FT_ULong cid_count; - FT_ULong cid_uid_base; - FT_ULong cid_fd_array_offset; - FT_ULong cid_fd_select_offset; - FT_UInt cid_font_name; - - } CFF_FontRecDictRec, *CFF_FontRecDict; - - - typedef struct CFF_PrivateRec_ - { - FT_Byte num_blue_values; - FT_Byte num_other_blues; - FT_Byte num_family_blues; - FT_Byte num_family_other_blues; - - FT_Pos blue_values[14]; - FT_Pos other_blues[10]; - FT_Pos family_blues[14]; - FT_Pos family_other_blues[10]; - - FT_Fixed blue_scale; - FT_Pos blue_shift; - FT_Pos blue_fuzz; - FT_Pos standard_width; - FT_Pos standard_height; - - FT_Byte num_snap_widths; - FT_Byte num_snap_heights; - FT_Pos snap_widths[13]; - FT_Pos snap_heights[13]; - FT_Bool force_bold; - FT_Fixed force_bold_threshold; - FT_Int lenIV; - FT_Int language_group; - FT_Fixed expansion_factor; - FT_Long initial_random_seed; - FT_ULong local_subrs_offset; - FT_Pos default_width; - FT_Pos nominal_width; - - } CFF_PrivateRec, *CFF_Private; - - - typedef struct CFF_FDSelectRec_ - { - FT_Byte format; - FT_UInt range_count; - - /* that's the table, taken from the file `as is' */ - FT_Byte* data; - FT_UInt data_size; - - /* small cache for format 3 only */ - FT_UInt cache_first; - FT_UInt cache_count; - FT_Byte cache_fd; - - } CFF_FDSelectRec, *CFF_FDSelect; - - - /* A SubFont packs a font dict and a private dict together. They are */ - /* needed to support CID-keyed CFF fonts. */ - typedef struct CFF_SubFontRec_ - { - CFF_FontRecDictRec font_dict; - CFF_PrivateRec private_dict; - - CFF_IndexRec local_subrs_index; - FT_UInt num_local_subrs; - FT_Byte** local_subrs; - - } CFF_SubFontRec, *CFF_SubFont; - - - /* maximum number of sub-fonts in a CID-keyed file */ -#define CFF_MAX_CID_FONTS 32 - - - typedef struct CFF_FontRec_ - { - FT_Stream stream; - FT_Memory memory; - FT_UInt num_faces; - FT_UInt num_glyphs; - - FT_Byte version_major; - FT_Byte version_minor; - FT_Byte header_size; - FT_Byte absolute_offsize; - - - CFF_IndexRec name_index; - CFF_IndexRec top_dict_index; - CFF_IndexRec string_index; - CFF_IndexRec global_subrs_index; - - CFF_EncodingRec encoding; - CFF_CharsetRec charset; - - CFF_IndexRec charstrings_index; - CFF_IndexRec font_dict_index; - CFF_IndexRec private_index; - CFF_IndexRec local_subrs_index; - - FT_String* font_name; - FT_UInt num_global_subrs; - FT_Byte** global_subrs; - - CFF_SubFontRec top_font; - FT_UInt num_subfonts; - CFF_SubFont subfonts[CFF_MAX_CID_FONTS]; - - CFF_FDSelectRec fd_select; - - /* interface to PostScript hinter */ - void* pshinter; - - /* interface to Postscript Names service */ - void* psnames; - - } CFF_FontRec, *CFF_Font; - - -FT_END_HEADER - -#endif /* __CFFTYPES_H__ */ - - -/* END */ diff --git a/reactos/lib/freetype/src/cff/rules.mk b/reactos/lib/freetype/src/cff/rules.mk index 4100c806875..579f144e019 100644 --- a/reactos/lib/freetype/src/cff/rules.mk +++ b/reactos/lib/freetype/src/cff/rules.mk @@ -34,7 +34,6 @@ CFF_DRV_SRC := $(CFF_DIR)/cffobjs.c \ # CFF_DRV_H := $(CFF_DRV_SRC:%.c=%.h) \ $(CFF_DIR)/cfftoken.h \ - $(CFF_DIR)/cfftypes.h \ $(CFF_DIR)/cfferrs.h diff --git a/reactos/lib/freetype/src/cid/cidgload.c b/reactos/lib/freetype/src/cid/cidgload.c index 4c21097e45e..e07fb717c66 100644 --- a/reactos/lib/freetype/src/cid/cidgload.c +++ b/reactos/lib/freetype/src/cid/cidgload.c @@ -4,7 +4,7 @@ /* */ /* CID-keyed Type1 Glyph Loader (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* Copyright 1996-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -44,7 +44,7 @@ CID_FaceInfo cid = &face->cid; FT_Byte* p; FT_UInt fd_select; - FT_Stream stream = face->cid_stream; + FT_Stream stream = face->root.stream; FT_Error error = 0; FT_Byte* charstring = 0; FT_Memory memory = face->root.memory; @@ -412,11 +412,11 @@ if ( hinting ) { - metrics->horiAdvance = FT_PIX_ROUND( metrics->horiAdvance ); - metrics->vertAdvance = FT_PIX_ROUND( metrics->vertAdvance ); + metrics->horiAdvance = ( metrics->horiAdvance + 32 ) & -64; + metrics->vertAdvance = ( metrics->vertAdvance + 32 ) & -64; - metrics->vertBearingX = FT_PIX_ROUND( metrics->vertBearingX ); - metrics->vertBearingY = FT_PIX_ROUND( metrics->vertBearingY ); + metrics->vertBearingX = ( metrics->vertBearingX + 32 ) & -64; + metrics->vertBearingY = ( metrics->vertBearingY + 32 ) & -64; } } @@ -426,10 +426,10 @@ /* grid fit the bounding box if necessary */ if ( hinting ) { - cbox.xMin = FT_PIX_FLOOR( cbox.xMin ); - cbox.yMin = FT_PIX_FLOOR( cbox.yMin ); - cbox.xMax = FT_PIX_CEIL( cbox.xMax ); - cbox.yMax = FT_PIX_CEIL( cbox.yMax ); + cbox.xMin &= -64; + cbox.yMin &= -64; + cbox.xMax = ( cbox.xMax + 63 ) & -64; + cbox.yMax = ( cbox.yMax + 63 ) & -64; } metrics->width = cbox.xMax - cbox.xMin; diff --git a/reactos/lib/freetype/src/cid/cidload.c b/reactos/lib/freetype/src/cid/cidload.c index 5b69ba59a57..7b0aba6af9f 100644 --- a/reactos/lib/freetype/src/cid/cidload.c +++ b/reactos/lib/freetype/src/cid/cidload.c @@ -4,7 +4,7 @@ /* */ /* CID-keyed Type1 font loader (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* Copyright 1996-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -39,7 +39,7 @@ /* read a single offset */ FT_LOCAL_DEF( FT_Long ) - cid_get_offset( FT_Byte* *start, + cid_get_offset( FT_Byte** start, FT_Byte offsize ) { FT_Long result; @@ -164,9 +164,9 @@ temp_scale = ABS( temp[3] ); - /* Set units per EM based on FontMatrix values. We set the value to */ + /* Set Units per EM based on FontMatrix values. We set the value to */ /* `1000/temp_scale', because temp_scale was already multiplied by */ - /* 1000 (in `t1_tofixed', from psobjs.c). */ + /* 1000 (in t1_tofixed(), from psobjs.c). */ root->units_per_EM = (FT_UShort)( FT_DivFix( 0x10000L, FT_DivFix( temp_scale, 1000 ) ) ); @@ -191,7 +191,7 @@ offset->y = temp[5] >> 16; } - return CID_Err_Ok; /* this is a callback function; */ + return CID_Err_Ok; /* this is a callback function; */ /* we must return an error code */ } @@ -258,61 +258,42 @@ parser->root.cursor = base; parser->root.limit = base + size; - parser->root.error = CID_Err_Ok; + parser->root.error = 0; { FT_Byte* cur = base; FT_Byte* limit = cur + size; - for (;;) + for ( ;cur < limit; cur++ ) { - FT_Byte* newlimit; - - - parser->root.cursor = cur; - cid_parser_skip_spaces( parser ); - - if ( parser->root.cursor >= limit ) - newlimit = limit - 1 - 17; - else - newlimit = parser->root.cursor - 17; - /* look for `%ADOBeginFontDict' */ - for ( ; cur < newlimit; cur++ ) + if ( *cur == '%' && cur + 20 < limit && + ft_strncmp( (char*)cur, "%ADOBeginFontDict", 17 ) == 0 ) { - if ( *cur == '%' && - ft_strncmp( (char*)cur, "%ADOBeginFontDict", 17 ) == 0 ) - { - /* if /FDArray was found, then cid->num_dicts is > 0, and */ - /* we can start increasing parser->num_dict */ - if ( face->cid.num_dicts > 0 ) - parser->num_dict++; - } + cur += 17; + + /* if /FDArray was found, then cid->num_dicts is > 0, and */ + /* we can start increasing parser->num_dict */ + if ( face->cid.num_dicts > 0 ) + parser->num_dict++; } - - cur = parser->root.cursor; - /* no error can occur in cid_parser_skip_spaces */ - if ( cur >= limit ) - break; - - cid_parser_skip_PS_token( parser ); - if ( parser->root.cursor >= limit || parser->root.error ) - break; - /* look for immediates */ - if ( *cur == '/' && cur + 2 < limit ) + else if ( *cur == '/' && cur + 2 < limit ) { - FT_PtrDist len; + FT_Int len; cur++; - len = parser->root.cursor - cur; + parser->root.cursor = cur; + cid_parser_skip_alpha( parser ); + + len = (FT_Int)( parser->root.cursor - cur ); if ( len > 0 && len < 22 ) { /* now compare the immediate name to the keyword table */ - T1_Field keyword = (T1_Field)cid_field_records; + T1_Field keyword = (T1_Field) cid_field_records; for (;;) @@ -324,10 +305,10 @@ if ( !name ) break; - if ( cur[0] == name[0] && - len == ft_strlen( (const char*)name ) ) + if ( cur[0] == name[0] && + len == (FT_Int)ft_strlen( (const char*)name ) ) { - FT_PtrDist n; + FT_Int n; for ( n = 1; n < len; n++ ) @@ -337,11 +318,14 @@ if ( n >= len ) { /* we found it - run the parsing callback */ + cid_parser_skip_spaces( parser ); parser->root.error = cid_load_keyword( face, loader, keyword ); if ( parser->root.error ) return parser->root.error; + + cur = parser->root.cursor; break; } } @@ -349,8 +333,6 @@ } } } - - cur = parser->root.cursor; } } return parser->root.error; @@ -363,7 +345,7 @@ { CID_FaceInfo cid = &face->cid; FT_Memory memory = face->root.memory; - FT_Stream stream = face->cid_stream; + FT_Stream stream = face->root.stream; FT_Error error; FT_Int n; CID_Subrs subr; @@ -388,7 +370,7 @@ /* reallocate offsets array if needed */ if ( num_subrs + 1 > max_offsets ) { - FT_UInt new_max = FT_PAD_CEIL( num_subrs + 1, 4 ); + FT_UInt new_max = ( num_subrs + 1 + 3 ) & -4; if ( FT_RENEW_ARRAY( offsets, max_offsets, new_max ) ) @@ -399,7 +381,7 @@ /* read the subrmap's offsets */ if ( FT_STREAM_SEEK( cid->data_offset + dict->subrmap_offset ) || - FT_FRAME_ENTER( ( num_subrs + 1 ) * dict->sd_bytes ) ) + FT_FRAME_ENTER( ( num_subrs + 1 ) * dict->sd_bytes ) ) goto Fail; p = (FT_Byte*)stream->cursor; @@ -487,111 +469,11 @@ } - static FT_Error - cid_hex_to_binary( FT_Byte* data, - FT_Long data_len, - FT_ULong offset, - CID_Face face ) - { - FT_Stream stream = face->root.stream; - FT_Error error; - - FT_Byte buffer[256]; - FT_Byte *p, *plimit; - FT_Byte *d, *dlimit; - FT_Byte val; - - FT_Bool upper_nibble, done; - - - if ( FT_STREAM_SEEK( offset ) ) - goto Exit; - - d = data; - dlimit = d + data_len; - p = buffer; - plimit = p; - - upper_nibble = 1; - done = 0; - - while ( d < dlimit ) - { - if ( p >= plimit ) - { - FT_ULong oldpos = FT_STREAM_POS(); - FT_ULong size = stream->size - oldpos; - - - if ( size == 0 ) - { - error = CID_Err_Syntax_Error; - goto Exit; - } - - if ( FT_STREAM_READ( buffer, 256 > size ? size : 256 ) ) - goto Exit; - p = buffer; - plimit = p + FT_STREAM_POS() - oldpos; - } - - if ( ft_isdigit( *p ) ) - val = *p - '0'; - else if ( *p >= 'a' && *p <= 'f' ) - val = *p - 'a'; - else if ( *p >= 'A' && *p <= 'F' ) - val = *p - 'A' + 10; - else if ( *p == ' ' || - *p == '\t' || - *p == '\r' || - *p == '\n' || - *p == '\f' || - *p == '\0' ) - { - p++; - continue; - } - else if ( *p == '>' ) - { - val = 0; - done = 1; - } - else - { - error = CID_Err_Syntax_Error; - goto Exit; - } - - if ( upper_nibble ) - *d = val << 4; - else - { - *d += val; - d++; - } - - upper_nibble = 1 - upper_nibble; - - if ( done ) - break; - - p++; - } - - error = CID_Err_Ok; - - Exit: - return error; - } - - FT_LOCAL_DEF( FT_Error ) - cid_face_open( CID_Face face, - FT_Int face_index ) + cid_face_open( CID_Face face ) { CID_Loader loader; CID_Parser* parser; - FT_Memory memory = face->root.memory; FT_Error error; @@ -609,30 +491,7 @@ if ( error ) goto Exit; - if ( face_index < 0 ) - goto Exit; - - if ( parser->binary_length ) - { - /* we must convert the data section from hexadecimal to binary */ - if ( FT_ALLOC( face->binary_data, parser->binary_length ) || - cid_hex_to_binary( face->binary_data, parser->binary_length, - parser->data_offset, face ) ) - goto Exit; - - if ( FT_NEW( face->cid_stream ) ) - goto Exit; - - FT_Stream_OpenMemory( face->cid_stream, - face->binary_data, parser->binary_length ); - face->cid.data_offset = 0; - } - else - { - face->cid_stream = face->root.stream; - face->cid.data_offset = loader.parser.data_offset; - } - + face->cid.data_offset = loader.parser.data_offset; error = cid_read_subrs( face ); Exit: diff --git a/reactos/lib/freetype/src/cid/cidload.h b/reactos/lib/freetype/src/cid/cidload.h index 8c172ffee2d..a7f4bceab37 100644 --- a/reactos/lib/freetype/src/cid/cidload.h +++ b/reactos/lib/freetype/src/cid/cidload.h @@ -4,7 +4,7 @@ /* */ /* CID-keyed Type1 font loader (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* Copyright 1996-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -41,8 +41,7 @@ FT_BEGIN_HEADER FT_Byte offsize ); FT_LOCAL( FT_Error ) - cid_face_open( CID_Face face, - FT_Int face_index ); + cid_face_open( CID_Face face ); FT_END_HEADER diff --git a/reactos/lib/freetype/src/cid/cidobjs.c b/reactos/lib/freetype/src/cid/cidobjs.c index 6999217a6f6..313d315055b 100644 --- a/reactos/lib/freetype/src/cid/cidobjs.c +++ b/reactos/lib/freetype/src/cid/cidobjs.c @@ -4,7 +4,7 @@ /* */ /* CID objects manager (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* Copyright 1996-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -23,7 +23,7 @@ #include "cidgload.h" #include "cidload.h" -#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_INTERNAL_POSTSCRIPT_NAMES_H #include FT_INTERNAL_POSTSCRIPT_AUX_H #include FT_INTERNAL_POSTSCRIPT_HINTS_H @@ -199,12 +199,12 @@ if ( face->subrs ) { FT_Int n; - + for ( n = 0; n < cid->num_dicts; n++ ) { CID_Subrs subr = face->subrs + n; - + if ( subr->code ) { @@ -234,9 +234,6 @@ face->root.family_name = 0; face->root.style_name = 0; - - FT_FREE( face->binary_data ); - FT_FREE( face->cid_stream ); } } @@ -271,19 +268,27 @@ FT_Int num_params, FT_Parameter* params ) { - FT_Error error; - FT_Service_PsCMaps psnames; - PSAux_Service psaux; - PSHinter_Service pshinter; + FT_Error error; + PSNames_Service psnames; + PSAux_Service psaux; + PSHinter_Service pshinter; FT_UNUSED( num_params ); FT_UNUSED( params ); + FT_UNUSED( face_index ); FT_UNUSED( stream ); face->root.num_faces = 1; - FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + psnames = (PSNames_Service)face->psnames; + if ( !psnames ) + { + psnames = (PSNames_Service)FT_Get_Module_Interface( + FT_FACE_LIBRARY( face ), "psnames" ); + + face->psnames = psnames; + } psaux = (PSAux_Service)face->psaux; if ( !psaux ) @@ -307,7 +312,7 @@ if ( FT_STREAM_SEEK( 0 ) ) goto Exit; - error = cid_face_open( face, face_index ); + error = cid_face_open( face ); if ( error ) goto Exit; @@ -418,10 +423,8 @@ root->height = (FT_Short)( ( ( root->ascender - root->descender ) * 12 ) / 10 ); - root->underline_position = - (FT_Short)( info->underline_position >> 16 ); - root->underline_thickness = - (FT_Short)( info->underline_thickness >> 16 ); + root->underline_position = info->underline_position >> 16; + root->underline_thickness = info->underline_thickness >> 16; root->internal->max_points = 0; root->internal->max_contours = 0; diff --git a/reactos/lib/freetype/src/cid/cidparse.c b/reactos/lib/freetype/src/cid/cidparse.c index 3f18749f607..397a66ff8f0 100644 --- a/reactos/lib/freetype/src/cid/cidparse.c +++ b/reactos/lib/freetype/src/cid/cidparse.c @@ -4,7 +4,7 @@ /* */ /* CID-keyed Type1 parser (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -58,8 +58,6 @@ FT_ULong base_offset, offset, ps_len; FT_Byte buffer[256 + 10]; FT_Int buff_len; - FT_Byte *cur, *limit; - FT_Byte *arg1, *arg2; FT_MEM_ZERO( parser, sizeof ( *parser ) ); @@ -69,7 +67,7 @@ base_offset = FT_STREAM_POS(); - /* first of all, check the font format in the header */ + /* first of all, check the font format in the header */ if ( FT_FRAME_ENTER( 31 ) ) goto Exit; @@ -84,17 +82,15 @@ if ( error ) goto Exit; - Again: - /* now, read the rest of the file until we find a `StartData' */ + /* now, read the rest of the file, until we find a `StartData' */ buff_len = 256; for (;;) { - FT_Byte* p; + FT_Byte *p, *limit = buffer + 256; FT_ULong top_position; /* fill input buffer */ - limit = buffer + 256; buff_len -= 256; if ( buff_len > 0 ) FT_MEM_MOVE( buffer, limit, buff_len ); @@ -105,7 +101,7 @@ goto Exit; top_position = FT_STREAM_POS() - buff_len; - buff_len = 256 + 10; + buff_len = 256 + 10; /* look for `StartData' */ for ( p = buffer; p < limit; p++ ) @@ -120,12 +116,12 @@ } Found: - /* we have found the start of the binary data. We will now */ - /* rewind and extract the frame corresponding to the PostScript */ - /* section */ + /* we have found the start of the binary data. We will now */ + /* rewind and extract the frame of corresponding to the Postscript */ + /* section */ ps_len = offset - base_offset; - if ( FT_STREAM_SEEK( base_offset ) || + if ( FT_STREAM_SEEK( base_offset ) || FT_FRAME_EXTRACT( ps_len, parser->postscript ) ) goto Exit; @@ -136,45 +132,6 @@ parser->root.limit = parser->root.cursor + ps_len; parser->num_dict = -1; - /* Finally, we check whether `StartData' was real -- it could be */ - /* in a comment or string. We also get its arguments to find out */ - /* whether the data is represented in binary or hex format. */ - - arg1 = parser->root.cursor; - cid_parser_skip_PS_token( parser ); - cid_parser_skip_spaces ( parser ); - arg2 = parser->root.cursor; - cid_parser_skip_PS_token( parser ); - cid_parser_skip_spaces ( parser ); - - limit = parser->root.limit; - cur = parser->root.cursor; - - while ( cur < limit ) - { - if ( *cur == 'S' && ft_strncmp( (char*)cur, "StartData", 9 ) == 0 ) - { - if ( ft_strncmp( (char*)arg1, "(Hex)", 5 ) == 0 ) - parser->binary_length = ft_atol( (const char *)arg2 ); - - limit = parser->root.limit; - cur = parser->root.cursor; - goto Exit; - } - - cid_parser_skip_PS_token( parser ); - cid_parser_skip_spaces ( parser ); - arg1 = arg2; - arg2 = cur; - cur = parser->root.cursor; - } - - /* we haven't found the correct `StartData'; go back and continue */ - /* searching */ - FT_FRAME_RELEASE( parser->postscript ); - if ( !FT_STREAM_SEEK( offset ) ) - goto Again; - Exit: return error; } diff --git a/reactos/lib/freetype/src/cid/cidparse.h b/reactos/lib/freetype/src/cid/cidparse.h index ca37deab936..1b3e0b9670a 100644 --- a/reactos/lib/freetype/src/cid/cidparse.h +++ b/reactos/lib/freetype/src/cid/cidparse.h @@ -4,7 +4,7 @@ /* */ /* CID-keyed Type1 parser (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -50,9 +50,6 @@ FT_BEGIN_HEADER /* data_offset :: The start position of the binary data (i.e., the */ /* end of the data to be parsed. */ /* */ - /* binary_length :: The length of the data after the `StartData' */ - /* command if the data format is hexadecimal. */ - /* */ /* cid :: A structure which holds the information about */ /* the current font. */ /* */ @@ -68,8 +65,6 @@ FT_BEGIN_HEADER FT_ULong data_offset; - FT_Long binary_length; - CID_FaceInfo cid; FT_Int num_dict; @@ -92,10 +87,8 @@ FT_BEGIN_HEADER /* */ /*************************************************************************/ -#define cid_parser_skip_spaces( p ) \ - (p)->root.funcs.skip_spaces( &(p)->root ) -#define cid_parser_skip_PS_token( p ) \ - (p)->root.funcs.skip_PS_token( &(p)->root ) +#define cid_parser_skip_spaces( p ) (p)->root.funcs.skip_spaces( &(p)->root ) +#define cid_parser_skip_alpha( p ) (p)->root.funcs.skip_alpha ( &(p)->root ) #define cid_parser_to_int( p ) (p)->root.funcs.to_int( &(p)->root ) #define cid_parser_to_fixed( p, t ) (p)->root.funcs.to_fixed( &(p)->root, t ) diff --git a/reactos/lib/freetype/src/cid/cidriver.c b/reactos/lib/freetype/src/cid/cidriver.c index f5639b9f760..471f196379d 100644 --- a/reactos/lib/freetype/src/cid/cidriver.c +++ b/reactos/lib/freetype/src/cid/cidriver.c @@ -21,12 +21,10 @@ #include "cidgload.h" #include FT_INTERNAL_DEBUG_H #include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_POSTSCRIPT_NAMES_H #include "ciderrs.h" -#include FT_SERVICE_POSTSCRIPT_NAME_H -#include FT_SERVICE_XFREE86_NAME_H -#include FT_SERVICE_POSTSCRIPT_INFO_H /*************************************************************************/ /* */ @@ -38,11 +36,6 @@ #define FT_COMPONENT trace_ciddriver - /* - * POSTSCRIPT NAME SERVICE - * - */ - static const char* cid_get_postscript_name( CID_Face face ) { @@ -56,47 +49,6 @@ } - static const FT_Service_PsFontNameRec cid_service_ps_name = - { - (FT_PsName_GetFunc) cid_get_postscript_name - }; - - - /* - * POSTSCRIPT INFO SERVICE - * - */ - - static FT_Error - cid_ps_get_font_info( FT_Face face, - PS_FontInfoRec* afont_info ) - { - *afont_info = ((CID_Face)face)->cid.font_info; - return 0; - } - - - static const FT_Service_PsInfoRec cid_service_ps_info = - { - (PS_GetFontInfoFunc) cid_ps_get_font_info, - (PS_HasGlyphNamesFunc)NULL /* unsupported with CID fonts */ - }; - - - /* - * SERVICE LIST - * - */ - - static const FT_ServiceDescRec cid_services[] = - { - { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &cid_service_ps_name }, - { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CID }, - { FT_SERVICE_ID_POSTSCRIPT_INFO, &cid_service_ps_info }, - { NULL, NULL } - }; - - static FT_Module_Interface cid_get_interface( FT_Driver driver, const FT_String* cid_interface ) @@ -104,7 +56,10 @@ FT_UNUSED( driver ); FT_UNUSED( cid_interface ); - return ft_service_list_lookup( cid_services, cid_interface ); + if ( ft_strcmp( (const char*)cid_interface, "postscript_name" ) == 0 ) + return (FT_Module_Interface)cid_get_postscript_name; + + return 0; } diff --git a/reactos/lib/freetype/src/gzip/adler32.c b/reactos/lib/freetype/src/gzip/adler32.c index f905d083883..337589818fe 100644 --- a/reactos/lib/freetype/src/gzip/adler32.c +++ b/reactos/lib/freetype/src/gzip/adler32.c @@ -3,7 +3,7 @@ * For conditions of distribution and use, see copyright notice in zlib.h */ -/* @(#) $Id: adler32.c,v 1.4 2004/02/06 21:53:10 rcampbell Exp $ */ +/* @(#) $Id: adler32.c,v 1.5 2004/02/15 21:45:34 gvg Exp $ */ #include "zlib.h" diff --git a/reactos/lib/freetype/src/gzip/infblock.c b/reactos/lib/freetype/src/gzip/infblock.c index d6e2dc297da..8d3e2104296 100644 --- a/reactos/lib/freetype/src/gzip/infblock.c +++ b/reactos/lib/freetype/src/gzip/infblock.c @@ -156,8 +156,7 @@ int r ) uInt bl, bd; inflate_huft *tl, *td; - inflate_trees_fixed(&bl, &bd, (const inflate_huft**)&tl, - (const inflate_huft**)&td, z); + inflate_trees_fixed(&bl, &bd, &tl, &td, z); s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z); if (s->sub.decode.codes == Z_NULL) { diff --git a/reactos/lib/freetype/src/gzip/inffixed.h b/reactos/lib/freetype/src/gzip/inffixed.h index 4d4760ea00e..77f7e763145 100644 --- a/reactos/lib/freetype/src/gzip/inffixed.h +++ b/reactos/lib/freetype/src/gzip/inffixed.h @@ -7,9 +7,9 @@ subject to change. Applications should only use zlib.h. */ -local const uInt fixed_bl = 9; -local const uInt fixed_bd = 5; -local const inflate_huft fixed_tl[] = { +local uInt fixed_bl = 9; +local uInt fixed_bd = 5; +local inflate_huft fixed_tl[] = { {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115}, {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},192}, {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},160}, @@ -139,7 +139,7 @@ local const inflate_huft fixed_tl[] = { {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},191}, {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},255} }; -local const inflate_huft fixed_td[] = { +local inflate_huft fixed_td[] = { {{{80,5}},1}, {{{87,5}},257}, {{{83,5}},17}, {{{91,5}},4097}, {{{81,5}},5}, {{{89,5}},1025}, {{{85,5}},65}, {{{93,5}},16385}, {{{80,5}},3}, {{{88,5}},513}, {{{84,5}},33}, {{{92,5}},8193}, diff --git a/reactos/lib/freetype/src/gzip/inftrees.c b/reactos/lib/freetype/src/gzip/inftrees.c index 9002bf5b899..2bceb467413 100644 --- a/reactos/lib/freetype/src/gzip/inftrees.c +++ b/reactos/lib/freetype/src/gzip/inftrees.c @@ -401,11 +401,11 @@ local inflate_huft *fixed_td; local int inflate_trees_fixed( /* bl, bd, tl, td, z) */ -uIntf *bl, /* literal desired/actual bit depth */ -uIntf *bd, /* distance desired/actual bit depth */ -const inflate_huft * FAR *tl, /* literal/length tree result */ -const inflate_huft * FAR *td, /* distance tree result */ -z_streamp z /* for memory allocation */ +uIntf *bl, /* literal desired/actual bit depth */ +uIntf *bd, /* distance desired/actual bit depth */ +inflate_huft * FAR *tl, /* literal/length tree result */ +inflate_huft * FAR *td, /* distance tree result */ +z_streamp z /* for memory allocation */ ) { #ifdef BUILDFIXED diff --git a/reactos/lib/freetype/src/gzip/inftrees.h b/reactos/lib/freetype/src/gzip/inftrees.h index 07bf2aa0bf8..92d2f284ef8 100644 --- a/reactos/lib/freetype/src/gzip/inftrees.h +++ b/reactos/lib/freetype/src/gzip/inftrees.h @@ -56,8 +56,8 @@ local int inflate_trees_dynamic OF(( local int inflate_trees_fixed OF(( uIntf *, /* literal desired/actual bit depth */ uIntf *, /* distance desired/actual bit depth */ - const inflate_huft * FAR *, /* literal/length tree result */ - const inflate_huft * FAR *, /* distance tree result */ + inflate_huft * FAR *, /* literal/length tree result */ + inflate_huft * FAR *, /* distance tree result */ z_streamp)); /* for memory allocation */ #endif /* _INFTREES_H */ diff --git a/reactos/lib/freetype/src/gzip/infutil.c b/reactos/lib/freetype/src/gzip/infutil.c index 6087b406473..87358d714cd 100644 --- a/reactos/lib/freetype/src/gzip/infutil.c +++ b/reactos/lib/freetype/src/gzip/infutil.c @@ -11,7 +11,7 @@ /* And'ing with mask[n] masks the lower n bits */ -local const uInt inflate_mask[17] = { +local uInt inflate_mask[17] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff diff --git a/reactos/lib/freetype/src/gzip/zconf.h b/reactos/lib/freetype/src/gzip/zconf.h index 55f29714675..53c21455c5f 100644 --- a/reactos/lib/freetype/src/gzip/zconf.h +++ b/reactos/lib/freetype/src/gzip/zconf.h @@ -3,7 +3,7 @@ * For conditions of distribution and use, see copyright notice in zlib.h */ -/* @(#) $Id: zconf.h,v 1.4 2004/02/06 21:53:10 rcampbell Exp $ */ +/* @(#) $Id: zconf.h,v 1.5 2004/02/15 21:45:34 gvg Exp $ */ #ifndef _ZCONF_H #define _ZCONF_H diff --git a/reactos/lib/freetype/src/gzip/zutil.c b/reactos/lib/freetype/src/gzip/zutil.c index 3ea92c8561c..032eccdfde7 100644 --- a/reactos/lib/freetype/src/gzip/zutil.c +++ b/reactos/lib/freetype/src/gzip/zutil.c @@ -3,7 +3,7 @@ * For conditions of distribution and use, see copyright notice in zlib.h */ -/* @(#) $Id: zutil.c,v 1.4 2004/02/06 21:53:10 rcampbell Exp $ */ +/* @(#) $Id: zutil.c,v 1.5 2004/02/15 21:45:34 gvg Exp $ */ #include "zutil.h" diff --git a/reactos/lib/freetype/src/gzip/zutil.h b/reactos/lib/freetype/src/gzip/zutil.h index 259bab8cf4e..206e9241574 100644 --- a/reactos/lib/freetype/src/gzip/zutil.h +++ b/reactos/lib/freetype/src/gzip/zutil.h @@ -8,7 +8,7 @@ subject to change. Applications should only use zlib.h. */ -/* @(#) $Id: zutil.h,v 1.4 2004/02/06 21:53:10 rcampbell Exp $ */ +/* @(#) $Id: zutil.h,v 1.5 2004/02/15 21:45:34 gvg Exp $ */ #ifndef _Z_UTIL_H #define _Z_UTIL_H diff --git a/reactos/lib/freetype/src/pcf/pcfdrivr.c b/reactos/lib/freetype/src/pcf/pcfdrivr.c index 8807332dfdc..3681b1cbfc4 100644 --- a/reactos/lib/freetype/src/pcf/pcfdrivr.c +++ b/reactos/lib/freetype/src/pcf/pcfdrivr.c @@ -44,8 +44,6 @@ THE SOFTWARE. #undef FT_COMPONENT #define FT_COMPONENT trace_pcfread -#include FT_SERVICE_BDF_H -#include FT_SERVICE_XFREE86_NAME_H typedef struct PCF_CMapRec_ { @@ -473,12 +471,6 @@ THE SOFTWARE. } - /* - * - * BDF SERVICE - * - */ - static FT_Error pcf_get_bdf_property( PCF_Face face, const char* prop_name, @@ -511,46 +503,16 @@ THE SOFTWARE. } - static FT_Error - pcf_get_charset_id( PCF_Face face, - const char* *acharset_encoding, - const char* *acharset_registry ) - { - *acharset_encoding = face->charset_encoding; - *acharset_registry = face->charset_registry; - - return 0; - } - - - static FT_Service_BDFRec pcf_service_bdf = - { - (FT_BDF_GetCharsetIdFunc)pcf_get_charset_id, - (FT_BDF_GetPropertyFunc) pcf_get_bdf_property - }; - - - /* - * - * SERVICE LIST - * - */ - - static FT_ServiceDescRec pcf_services[] = - { - { FT_SERVICE_ID_BDF, &pcf_service_bdf }, - { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_PCF }, - { NULL, NULL } - }; - - static FT_Module_Interface pcf_driver_requester( FT_Module module, const char* name ) { FT_UNUSED( module ); - return ft_service_list_lookup( pcf_services, name ); + if ( name && ft_strcmp( name, "get_bdf_property" ) == 0 ) + return (FT_Module_Interface) pcf_get_bdf_property; + + return NULL; } diff --git a/reactos/lib/freetype/src/pcf/pcfread.c b/reactos/lib/freetype/src/pcf/pcfread.c index f29512fad48..1b377b5b1e0 100644 --- a/reactos/lib/freetype/src/pcf/pcfread.c +++ b/reactos/lib/freetype/src/pcf/pcfread.c @@ -862,116 +862,6 @@ THE SOFTWARE. } - static FT_Error - pcf_interpret_style( PCF_Face pcf ) - { - FT_Error error = PCF_Err_Ok; - FT_Face face = FT_FACE( pcf ); - FT_Memory memory = face->memory; - - PCF_Property prop; - - char *istr = NULL, *bstr = NULL; - char *sstr = NULL, *astr = NULL; - - int parts = 0, len = 0; - - - face->style_flags = 0; - - prop = pcf_find_property( pcf, "SLANT" ); - if ( prop && prop->isString && - ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' || - *(prop->value.atom) == 'I' || *(prop->value.atom) == 'i' ) ) - { - face->style_flags |= FT_STYLE_FLAG_ITALIC; - istr = ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' ) - ? (char *)"Oblique" - : (char *)"Italic"; - len += ft_strlen( istr ); - parts++; - } - - prop = pcf_find_property( pcf, "WEIGHT_NAME" ); - if ( prop && prop->isString && - ( *(prop->value.atom) == 'B' || *(prop->value.atom) == 'b' ) ) - { - face->style_flags |= FT_STYLE_FLAG_BOLD; - bstr = (char *)"Bold"; - len += ft_strlen( bstr ); - parts++; - } - - prop = pcf_find_property( pcf, "SETWIDTH_NAME" ); - if ( prop && prop->isString && - *(prop->value.atom) && - !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) - { - sstr = (char *)(prop->value.atom); - len += ft_strlen( sstr ); - parts++; - } - - prop = pcf_find_property( pcf, "ADD_STYLE_NAME" ); - if ( prop && prop->isString && - *(prop->value.atom) && - !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) - { - astr = (char *)(prop->value.atom); - len += ft_strlen( astr ); - parts++; - } - - if ( !parts || !len ) - face->style_name = (char *)"Regular"; - else - { - char *style, *s; - unsigned int i; - - - if ( FT_ALLOC( style, len + parts ) ) - return error; - - s = style; - - if ( astr ) - { - ft_strcpy( s, astr ); - for ( i = 0; i < ft_strlen( astr ); i++, s++ ) - if ( *s == ' ' ) - *s = '-'; /* replace spaces with dashes */ - *(s++) = ' '; - } - if ( bstr ) - { - ft_strcpy( s, bstr ); - s += ft_strlen( bstr ); - *(s++) = ' '; - } - if ( istr ) - { - ft_strcpy( s, istr ); - s += ft_strlen( istr ); - *(s++) = ' '; - } - if ( sstr ) - { - ft_strcpy( s, sstr ); - for ( i = 0; i < ft_strlen( sstr ); i++, s++ ) - if ( *s == ' ' ) - *s = '-'; /* replace spaces with dashes */ - *(s++) = ' '; - } - *(--s) = '\0'; /* overwrite last ' ', terminate the string */ - - face->style_name = style; /* allocated string */ - } - - return error; - } - - FT_LOCAL_DEF( FT_Error ) pcf_load_font( FT_Stream stream, PCF_Face face ) @@ -1040,21 +930,49 @@ THE SOFTWARE. if ( face->accel.constantWidth ) root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; - if ( ( error = pcf_interpret_style( face ) ) != 0 ) - goto Exit; + root->style_flags = 0; + prop = pcf_find_property( face, "SLANT" ); + if ( prop != NULL ) + if ( prop->isString ) + if ( ( *(prop->value.atom) == 'O' ) || + ( *(prop->value.atom) == 'o' ) || + ( *(prop->value.atom) == 'I' ) || + ( *(prop->value.atom) == 'i' ) ) + root->style_flags |= FT_STYLE_FLAG_ITALIC; + + prop = pcf_find_property( face, "WEIGHT_NAME" ); + if ( prop != NULL ) + if ( prop->isString ) + if ( ( *(prop->value.atom) == 'B' ) || + ( *(prop->value.atom) == 'b' ) ) + root->style_flags |= FT_STYLE_FLAG_BOLD; + + root->style_name = (char *)"Regular"; + + if ( root->style_flags & FT_STYLE_FLAG_BOLD ) { + if ( root->style_flags & FT_STYLE_FLAG_ITALIC ) + root->style_name = (char *)"Bold Italic"; + else + root->style_name = (char *)"Bold"; + } + else if ( root->style_flags & FT_STYLE_FLAG_ITALIC ) + root->style_name = (char *)"Italic"; prop = pcf_find_property( face, "FAMILY_NAME" ); - if ( prop && prop->isString ) + if ( prop != NULL ) { - int l = ft_strlen( prop->value.atom ) + 1; + if ( prop->isString ) + { + int l = ft_strlen( prop->value.atom ) + 1; - if ( FT_NEW_ARRAY( root->family_name, l ) ) - goto Exit; - ft_strcpy( root->family_name, prop->value.atom ); + if ( FT_NEW_ARRAY( root->family_name, l ) ) + goto Exit; + ft_strcpy( root->family_name, prop->value.atom ); + } } else - root->family_name = NULL; + root->family_name = 0; /* Note: We shift all glyph indices by +1 since we must * respect the convention that glyph 0 always corresponds @@ -1075,26 +993,26 @@ THE SOFTWARE. FT_MEM_ZERO( bsize, sizeof ( FT_Bitmap_Size ) ); prop = pcf_find_property( face, "PIXEL_SIZE" ); - if ( prop ) + if ( prop != NULL ) bsize->height = (FT_Short)prop->value.integer; prop = pcf_find_property( face, "AVERAGE_WIDTH" ); - if ( prop ) + if ( prop != NULL ) bsize->width = (FT_Short)( ( prop->value.integer + 5 ) / 10 ); prop = pcf_find_property( face, "POINT_SIZE" ); - if ( prop ) + if ( prop != NULL ) /* convert from 722,7 decipoints to 72 points per inch */ bsize->size = (FT_Pos)( ( prop->value.integer * 64 * 7200 + 36135L ) / 72270L ); prop = pcf_find_property( face, "RESOLUTION_X" ); - if ( prop ) + if ( prop != NULL ) bsize->x_ppem = (FT_Pos)( ( prop->value.integer * bsize->size + 36 ) / 72 ); prop = pcf_find_property( face, "RESOLUTION_Y" ); - if ( prop ) + if ( prop != NULL ) bsize->y_ppem = (FT_Pos)( ( prop->value.integer * bsize->size + 36 ) / 72 ); @@ -1113,19 +1031,23 @@ THE SOFTWARE. charset_registry = pcf_find_property( face, "CHARSET_REGISTRY" ); charset_encoding = pcf_find_property( face, "CHARSET_ENCODING" ); - if ( charset_registry && charset_registry->isString && - charset_encoding && charset_encoding->isString ) + if ( ( charset_registry != NULL ) && + ( charset_encoding != NULL ) ) { - if ( FT_NEW_ARRAY( face->charset_encoding, - ft_strlen( charset_encoding->value.atom ) + 1 ) ) - goto Exit; + if ( ( charset_registry->isString ) && + ( charset_encoding->isString ) ) + { + if ( FT_NEW_ARRAY( face->charset_encoding, + ft_strlen( charset_encoding->value.atom ) + 1 ) ) + goto Exit; - if ( FT_NEW_ARRAY( face->charset_registry, - ft_strlen( charset_registry->value.atom ) + 1 ) ) - goto Exit; + if ( FT_NEW_ARRAY( face->charset_registry, + ft_strlen( charset_registry->value.atom ) + 1 ) ) + goto Exit; - ft_strcpy( face->charset_registry, charset_registry->value.atom ); - ft_strcpy( face->charset_encoding, charset_encoding->value.atom ); + ft_strcpy( face->charset_registry, charset_registry->value.atom ); + ft_strcpy( face->charset_encoding, charset_encoding->value.atom ); + } } } } diff --git a/reactos/lib/freetype/src/pfr/pfrdrivr.c b/reactos/lib/freetype/src/pfr/pfrdrivr.c index 4e0d6fdb472..3935e2e544d 100644 --- a/reactos/lib/freetype/src/pfr/pfrdrivr.c +++ b/reactos/lib/freetype/src/pfr/pfrdrivr.c @@ -19,13 +19,10 @@ #include <ft2build.h> #include FT_INTERNAL_DEBUG_H #include FT_INTERNAL_STREAM_H -#include FT_SERVICE_PFR_H -#include FT_SERVICE_XFREE86_NAME_H +#include FT_INTERNAL_PFR_H #include "pfrdrivr.h" #include "pfrobjs.h" -#include "pfrerror.h" - static FT_Error pfr_get_kerning( PFR_Face face, @@ -54,28 +51,23 @@ } - /* - * PFR METRICS SERVICE - * - */ - static FT_Error - pfr_get_advance( PFR_Face face, - FT_UInt gindex, - FT_Pos *anadvance ) + pfr_get_advance( PFR_Face face, + FT_UInt gindex, + FT_Pos *aadvance ) { FT_Error error = PFR_Err_Bad_Argument; - *anadvance = 0; + *aadvance = 0; if ( face ) { - PFR_PhyFont phys = &face->phy_font; + PFR_PhyFont phys = &face->phy_font; if ( gindex < phys->num_chars ) { - *anadvance = phys->chars[gindex].advance; + *aadvance = phys->chars[ gindex ].advance; error = 0; } } @@ -86,18 +78,18 @@ static FT_Error pfr_get_metrics( PFR_Face face, - FT_UInt *anoutline_resolution, + FT_UInt *aoutline_resolution, FT_UInt *ametrics_resolution, FT_Fixed *ametrics_x_scale, FT_Fixed *ametrics_y_scale ) { - PFR_PhyFont phys = &face->phy_font; + PFR_PhyFont phys = &face->phy_font; FT_Fixed x_scale, y_scale; FT_Size size = face->root.size; - if ( anoutline_resolution ) - *anoutline_resolution = phys->outline_resolution; + if ( aoutline_resolution ) + *aoutline_resolution = phys->outline_resolution; if ( ametrics_resolution ) *ametrics_resolution = phys->metrics_resolution; @@ -120,42 +112,19 @@ if ( ametrics_y_scale ) *ametrics_y_scale = y_scale; - return PFR_Err_Ok; + return 0; } FT_CALLBACK_TABLE_DEF - const FT_Service_PfrMetricsRec pfr_metrics_service_rec = + const FT_PFR_ServiceRec pfr_service_rec = { - (FT_PFR_GetMetricsFunc)pfr_get_metrics, - (FT_PFR_GetKerningFunc)pfr_face_get_kerning, - (FT_PFR_GetAdvanceFunc)pfr_get_advance + (FT_PFR_GetMetricsFunc) pfr_get_metrics, + (FT_PFR_GetKerningFunc) pfr_get_kerning, + (FT_PFR_GetAdvanceFunc) pfr_get_advance }; - /* - * SERVICE LIST - * - */ - - static const FT_ServiceDescRec pfr_services[] = - { - { FT_SERVICE_ID_PFR_METRICS, &pfr_metrics_service_rec }, - { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_PFR }, - { NULL, NULL } - }; - - - static FT_Module_Interface - pfr_get_service( FT_Driver driver, - const FT_String* service_id ) - { - FT_UNUSED( driver ); - - return ft_service_list_lookup( pfr_services, service_id ); - } - - FT_CALLBACK_TABLE_DEF const FT_Driver_ClassRec pfr_driver_class = { @@ -169,31 +138,31 @@ 0x10000L, 0x20000L, - NULL, + (FT_PFR_Service) &pfr_service_rec, /* format interface */ (FT_Module_Constructor)NULL, (FT_Module_Destructor) NULL, - (FT_Module_Requester) pfr_get_service + (FT_Module_Requester) NULL }, sizeof( PFR_FaceRec ), sizeof( PFR_SizeRec ), sizeof( PFR_SlotRec ), - (FT_Face_InitFunc) pfr_face_init, - (FT_Face_DoneFunc) pfr_face_done, - (FT_Size_InitFunc) NULL, - (FT_Size_DoneFunc) NULL, - (FT_Slot_InitFunc) pfr_slot_init, - (FT_Slot_DoneFunc) pfr_slot_done, + (FT_Face_InitFunc) pfr_face_init, + (FT_Face_DoneFunc) pfr_face_done, + (FT_Size_InitFunc) NULL, + (FT_Size_DoneFunc) NULL, + (FT_Slot_InitFunc) pfr_slot_init, + (FT_Slot_DoneFunc) pfr_slot_done, - (FT_Size_ResetPointsFunc)NULL, - (FT_Size_ResetPixelsFunc)NULL, - (FT_Slot_LoadFunc) pfr_slot_load, + (FT_Size_ResetPointsFunc) NULL, + (FT_Size_ResetPixelsFunc) NULL, + (FT_Slot_LoadFunc) pfr_slot_load, - (FT_Face_GetKerningFunc) pfr_get_kerning, - (FT_Face_AttachFunc) 0, - (FT_Face_GetAdvancesFunc)0 + (FT_Face_GetKerningFunc) pfr_get_kerning, + (FT_Face_AttachFunc) 0, + (FT_Face_GetAdvancesFunc) 0 }; diff --git a/reactos/lib/freetype/src/pfr/pfrgload.c b/reactos/lib/freetype/src/pfr/pfrgload.c index 87ba6846e83..cb5c60b88e3 100644 --- a/reactos/lib/freetype/src/pfr/pfrgload.c +++ b/reactos/lib/freetype/src/pfr/pfrgload.c @@ -4,7 +4,7 @@ /* */ /* FreeType PFR glyph loader (body). */ /* */ -/* Copyright 2002, 2003 by */ +/* Copyright 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -198,7 +198,7 @@ /* indicate that a new contour has started */ glyph->path_begun = 1; - /* check that there is space for a new contour and a new point */ + /* check that there is room for a new contour and a new point */ error = FT_GlyphLoader_CheckPoints( loader, 1, 1 ); if ( !error ) /* add new start point */ @@ -276,7 +276,7 @@ /* re-allocate array when necessary */ if ( count > glyph->max_xy_control ) { - FT_UInt new_max = FT_PAD_CEIL( count, 8 ); + FT_UInt new_max = ( count + 7 ) & -8; if ( FT_RENEW_ARRAY( glyph->x_control, diff --git a/reactos/lib/freetype/src/pfr/pfrload.c b/reactos/lib/freetype/src/pfr/pfrload.c index 19ced45d133..e92ead95b5f 100644 --- a/reactos/lib/freetype/src/pfr/pfrload.c +++ b/reactos/lib/freetype/src/pfr/pfrload.c @@ -365,7 +365,7 @@ /* re-allocate when needed */ if ( phy_font->num_strikes + count > phy_font->max_strikes ) { - FT_UInt new_max = FT_PAD_CEIL( phy_font->num_strikes + count, 4 ); + FT_UInt new_max = ( phy_font->num_strikes + count + 3 ) & -4; if ( FT_RENEW_ARRAY( phy_font->strikes, @@ -511,6 +511,89 @@ } +#if 0 + + /* load kerning pair data */ + FT_CALLBACK_DEF( FT_Error ) + pfr_extra_item_load_kerning_pairs( FT_Byte* p, + FT_Byte* limit, + PFR_PhyFont phy_font ) + { + FT_Int count; + FT_UShort base_adj; + FT_UInt flags; + FT_UInt num_pairs; + PFR_KernPair pairs; + FT_Error error = 0; + FT_Memory memory = phy_font->memory; + + + /* allocate a new kerning item */ + /* XXX: there may be multiple extra items for kerning */ + if ( phy_font->kern_pairs != NULL ) + goto Exit; + + FT_TRACE2(( "pfr_extra_item_load_kerning_pairs()\n" )); + + PFR_CHECK( 4 ); + + num_pairs = PFR_NEXT_BYTE( p ); + base_adj = PFR_NEXT_SHORT( p ); + flags = PFR_NEXT_BYTE( p ); + +#ifndef PFR_CONFIG_NO_CHECKS + count = 3; + + if ( flags & PFR_KERN_2BYTE_CHAR ) + count += 2; + + if ( flags & PFR_KERN_2BYTE_ADJ ) + count += 1; + + PFR_CHECK( num_pairs * count ); +#endif + + if ( FT_NEW_ARRAY( pairs, num_pairs ) ) + goto Exit; + + phy_font->num_kern_pairs = num_pairs; + phy_font->kern_pairs = pairs; + + for (count = num_pairs ; count > 0; count--, pairs++ ) + { + if ( flags & PFR_KERN_2BYTE_CHAR ) + { + pairs->glyph1 = PFR_NEXT_USHORT( p ); + pairs->glyph2 = PFR_NEXT_USHORT( p ); + } + else + { + pairs->glyph1 = PFR_NEXT_BYTE( p ); + pairs->glyph2 = PFR_NEXT_BYTE( p ); + } + + if ( flags & PFR_KERN_2BYTE_ADJ ) + pairs->kerning.x = base_adj + PFR_NEXT_SHORT( p ); + else + pairs->kerning.x = base_adj + PFR_NEXT_INT8( p ); + + pairs->kerning.y = 0; + + FT_TRACE2(( "kerning %d <-> %d : %ld\n", + pairs->glyph1, pairs->glyph2, pairs->kerning.x )); + } + + Exit: + return error; + + Too_Short: + error = PFR_Err_Invalid_Table; + FT_ERROR(( "pfr_extra_item_load_kerning_pairs: " + "invalid kerning pairs table\n" )); + goto Exit; + } + +#else /* 0 */ /* load kerning pair data */ FT_CALLBACK_DEF( FT_Error ) @@ -607,154 +690,15 @@ "invalid kerning pairs table\n" )); goto Exit; } - - - /* - * The kerning data embedded in a PFR font are (charcode,charcode) - * pairs; we need to translate them to (gindex,gindex) and sort - * the resulting array. - */ - static FT_UInt - pfr_get_gindex( PFR_Char chars, - FT_UInt count, - FT_UInt charcode ) - { - FT_UInt min = 0; - FT_UInt max = count; - - - while ( min < max ) - { - FT_UInt mid = ( min + max ) >> 1; - PFR_Char c = chars + mid; - - - if ( c->char_code == charcode ) - return mid + 1; - - if ( c->char_code < charcode ) - min = mid + 1; - else - max = mid; - } - return 0; - } - - - FT_CALLBACK_DEF( int ) - pfr_compare_kern_pairs( const void* pair1, - const void* pair2 ) - { - FT_UInt32 p1 = PFR_KERN_PAIR_INDEX( (PFR_KernPair)pair1 ); - FT_UInt32 p2 = PFR_KERN_PAIR_INDEX( (PFR_KernPair)pair2 ); - - - if ( p1 < p2 ) - return -1; - if ( p1 > p2 ) - return 1; - return 0; - } - - - static FT_Error - pfr_sort_kerning_pairs( FT_Stream stream, - PFR_PhyFont phy_font ) - { - FT_Error error; - FT_Memory memory = stream->memory; - PFR_KernPair pairs; - PFR_KernItem item; - PFR_Char chars = phy_font->chars; - FT_UInt num_chars = phy_font->num_chars; - FT_UInt count; - - - /* create kerning pairs array - */ - if ( FT_NEW_ARRAY( phy_font->kern_pairs, phy_font->num_kern_pairs ) ) - goto Exit; - - /* load all kerning items into the array, - * converting character codes into glyph indices - */ - pairs = phy_font->kern_pairs; - item = phy_font->kern_items; - count = 0; - - for ( ; item; item = item->next ) - { - FT_UInt limit = count + item->pair_count; - FT_Byte* p; - - - if ( limit > phy_font->num_kern_pairs ) - { - error = PFR_Err_Invalid_Table; - goto Exit; - } - - if ( FT_STREAM_SEEK( item->offset ) || - FT_FRAME_ENTER( item->pair_count * item->pair_size ) ) - goto Exit; - - p = stream->cursor; - - for ( ; count < limit; count++ ) - { - PFR_KernPair pair = pairs + count; - FT_UInt char1, char2; - FT_Int kerning; - - - if ( item->flags & PFR_KERN_2BYTE_CHAR ) - { - char1 = FT_NEXT_USHORT( p ); - char2 = FT_NEXT_USHORT( p ); - } - else - { - char1 = FT_NEXT_BYTE( p ); - char2 = FT_NEXT_BYTE( p ); - } - - if ( item->flags & PFR_KERN_2BYTE_ADJ ) - kerning = item->base_adj + FT_NEXT_SHORT( p ); - else - kerning = item->base_adj + FT_NEXT_CHAR( p ); - - pair->glyph1 = pfr_get_gindex( chars, num_chars, char1 ); - pair->glyph2 = pfr_get_gindex( chars, num_chars, char2 ); - pair->kerning = kerning; - } - - FT_FRAME_EXIT(); - } - - /* sort the resulting array - */ - ft_qsort( pairs, count, - sizeof ( PFR_KernPairRec ), - pfr_compare_kern_pairs ); - - Exit: - if ( error ) - { - /* disable kerning data in case of error - */ - phy_font->num_kern_pairs = 0; - } - - return error; - } +#endif /* 0 */ static const PFR_ExtraItemRec pfr_phy_font_extra_items[] = { - { 1, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_bitmap_info }, - { 2, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_font_id }, - { 3, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_stem_snaps }, - { 4, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_kerning_pairs }, + { 1, (PFR_ExtraItem_ParseFunc) pfr_extra_item_load_bitmap_info }, + { 2, (PFR_ExtraItem_ParseFunc) pfr_extra_item_load_font_id }, + { 3, (PFR_ExtraItem_ParseFunc) pfr_extra_item_load_stem_snaps }, + { 4, (PFR_ExtraItem_ParseFunc) pfr_extra_item_load_kerning_pairs }, { 0, NULL } }; @@ -826,7 +770,6 @@ FT_FREE( phy_font->blue_values ); phy_font->num_blue_values = 0; - FT_FREE( phy_font->kern_pairs ); { PFR_KernItem item, next; @@ -1065,9 +1008,6 @@ phy_font->bct_offset = FT_STREAM_POS(); phy_font->cursor = NULL; - /* now sort kerning pairs */ - error = pfr_sort_kerning_pairs( stream, phy_font ); - Exit: return error; diff --git a/reactos/lib/freetype/src/pfr/pfrobjs.c b/reactos/lib/freetype/src/pfr/pfrobjs.c index 4c6179aa577..402db95d3d6 100644 --- a/reactos/lib/freetype/src/pfr/pfrobjs.c +++ b/reactos/lib/freetype/src/pfr/pfrobjs.c @@ -419,9 +419,8 @@ { FT_Error error = PFR_Err_Ok; PFR_PhyFont phy_font = &face->phy_font; - PFR_KernPair pairs = phy_font->kern_pairs; + PFR_KernItem item = phy_font->kern_items; FT_UInt32 idx = PFR_KERN_INDEX( glyph1, glyph2 ); - FT_UInt min, max; FT_UNUSED( error ); /* just needed as syntactical sugar */ @@ -429,26 +428,68 @@ kerning->x = 0; kerning->y = 0; - min = 0; - max = phy_font->num_kern_pairs; - - while ( min < max ) + /* find the kerning item containing our pair */ + while ( item ) { - FT_UInt mid = ( min + max ) >> 1; - PFR_KernPair pair = pairs + mid; - FT_UInt32 pidx = PFR_KERN_PAIR_INDEX( pair ); - + if ( item->pair1 <= idx && idx <= item->pair2 ) + goto Found_Item; - if ( pidx == idx ) + item = item->next; + } + + /* not found */ + return; + + Found_Item: + { + /* perform simply binary search within the item */ + FT_UInt min, mid, max; + FT_Stream stream = face->root.stream; + FT_Byte* p; + + + if ( FT_STREAM_SEEK( item->offset ) || + FT_FRAME_ENTER( item->pair_count * item->pair_size ) ) + return; + + min = 0; + max = item->pair_count; + while ( min < max ) { - kerning->x = pair->kerning; - break; + FT_UInt char1, char2, charcode; + + + mid = ( min + max ) >> 1; + p = stream->cursor + mid*item->pair_size; + + if ( item->flags & PFR_KERN_2BYTE_CHAR ) + { + char1 = FT_NEXT_USHORT( p ); + char2 = FT_NEXT_USHORT( p ); + } + else + { + char1 = FT_NEXT_USHORT( p ); + char2 = FT_NEXT_USHORT( p ); + } + charcode = PFR_KERN_INDEX( char1, char2 ); + + if ( idx == charcode ) + { + if ( item->flags & PFR_KERN_2BYTE_ADJ ) + kerning->x = item->base_adj + FT_NEXT_SHORT( p ); + else + kerning->x = item->base_adj + FT_NEXT_CHAR( p ); + + break; + } + if ( idx > charcode ) + min = mid + 1; + else + max = mid; } - - if ( pidx < idx ) - min = mid + 1; - else - max = mid; + + FT_FRAME_EXIT(); } } diff --git a/reactos/lib/freetype/src/pfr/pfrsbit.c b/reactos/lib/freetype/src/pfr/pfrsbit.c index da8fdba337f..84aeb7a047a 100644 --- a/reactos/lib/freetype/src/pfr/pfrsbit.c +++ b/reactos/lib/freetype/src/pfr/pfrsbit.c @@ -635,7 +635,7 @@ glyph->root.metrics.height = (FT_Long)ysize << 6; glyph->root.metrics.horiBearingX = xpos << 6; glyph->root.metrics.horiBearingY = ypos << 6; - glyph->root.metrics.horiAdvance = FT_PIX_ROUND( ( advance >> 2 ) ); + glyph->root.metrics.horiAdvance = ( ( advance >> 2 ) + 32 ) & -64; glyph->root.metrics.vertBearingX = - glyph->root.metrics.width >> 1; glyph->root.metrics.vertBearingY = 0; glyph->root.metrics.vertAdvance = size->root.metrics.height; @@ -651,12 +651,11 @@ error = ft_glyphslot_alloc_bitmap( &glyph->root, len ); if ( !error ) { - error = pfr_load_bitmap_bits( - p, - stream->limit, - format, - FT_BOOL(face->header.color_flags & 2), - &glyph->root.bitmap ); + error = pfr_load_bitmap_bits( p, + stream->limit, + format, + face->header.color_flags & 2, + &glyph->root.bitmap ); } } } diff --git a/reactos/lib/freetype/src/pfr/pfrtypes.h b/reactos/lib/freetype/src/pfr/pfrtypes.h index a10a2b26c8e..21b4e3d2ea9 100644 --- a/reactos/lib/freetype/src/pfr/pfrtypes.h +++ b/reactos/lib/freetype/src/pfr/pfrtypes.h @@ -209,14 +209,11 @@ FT_BEGIN_HEADER #define PFR_KERN_INDEX( g1, g2 ) \ ( ( (FT_UInt32)(g1) << 16 ) | (FT_UInt16)(g2) ) -#define PFR_KERN_PAIR_INDEX( pair ) \ - PFR_KERN_INDEX( (pair)->glyph1, (pair)->glyph2 ) - typedef struct PFR_KernPairRec_ { FT_UInt glyph1; FT_UInt glyph2; - FT_Int kerning; + FT_Vector kerning; } PFR_KernPairRec, *PFR_KernPair; @@ -233,7 +230,7 @@ FT_BEGIN_HEADER FT_BBox bbox; FT_UInt flags; FT_UInt standard_advance; - + FT_Int ascent; /* optional, bbox.yMax if not present */ FT_Int descent; /* optional, bbox.yMin if not present */ FT_Int leading; /* optional, 0 if not present */ @@ -261,7 +258,6 @@ FT_BEGIN_HEADER FT_UInt num_kern_pairs; PFR_KernItem kern_items; PFR_KernItem* kern_items_tail; - PFR_KernPair kern_pairs; /* not part of the spec, but used during load */ FT_UInt32 bct_offset; @@ -285,8 +281,8 @@ FT_BEGIN_HEADER typedef enum PFR_KernFlags_ { - PFR_KERN_2BYTE_CHAR = 0x01, - PFR_KERN_2BYTE_ADJ = 0x02 + PFR_KERN_2BYTE_ADJ = 0x01, + PFR_KERN_2BYTE_CHAR = 0x02 } PFR_KernFlags; diff --git a/reactos/lib/freetype/src/psaux/psauxmod.c b/reactos/lib/freetype/src/psaux/psauxmod.c index 756ec1c5652..d6024178b87 100644 --- a/reactos/lib/freetype/src/psaux/psauxmod.c +++ b/reactos/lib/freetype/src/psaux/psauxmod.c @@ -39,7 +39,7 @@ ps_parser_init, ps_parser_done, ps_parser_skip_spaces, - ps_parser_skip_PS_token, + ps_parser_skip_alpha, ps_parser_to_int, ps_parser_to_fixed, ps_parser_to_bytes, diff --git a/reactos/lib/freetype/src/psaux/psobjs.c b/reactos/lib/freetype/src/psaux/psobjs.c index 5ce8721f1c9..fca38baf589 100644 --- a/reactos/lib/freetype/src/psaux/psobjs.c +++ b/reactos/lib/freetype/src/psaux/psobjs.c @@ -142,7 +142,7 @@ /* table :: The target table. */ /* */ /* <Input> */ - /* idx :: The index of the object in the table. */ + /* idx :: The index of the object in the table. */ /* */ /* object :: The address of the object to copy in memory. */ /* */ @@ -181,7 +181,7 @@ /* increase size by 25% and round up to the nearest multiple of 1024 */ new_size += ( new_size >> 2 ) + 1; - new_size = FT_PAD_CEIL( new_size, 1024 ); + new_size = ( new_size + 1023 ) & -1024; } error = reallocate_t1_table( table, new_size ); @@ -267,101 +267,53 @@ /*************************************************************************/ /* In the PostScript Language Reference Manual (PLRM) the following */ - /* characters are called `whitespace characters'. */ + /* characters are called `white-space characters'. */ #define IS_T1_WHITESPACE( c ) ( (c) == ' ' || (c) == '\t' ) #define IS_T1_LINESPACE( c ) ( (c) == '\r' || (c) == '\n' || (c) == '\f' ) #define IS_T1_NULLSPACE( c ) ( (c) == '\0' ) - /* According to the PLRM all whitespace characters are equivalent, */ - /* except in comments and strings. */ + /* According to the PLRM all white-space characters are equivalent, */ + /* except in comments and strings. */ #define IS_T1_SPACE( c ) ( IS_T1_WHITESPACE( c ) || \ IS_T1_LINESPACE( c ) || \ IS_T1_NULLSPACE( c ) ) - /* The following array is used by various functions to quickly convert */ - /* digits (both decimal and non-decimal) into numbers. */ - -#if 'A' == 65 - /* ASCII */ - - char ft_char_table[128] = - { - /* 0x00 */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, - -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, - -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, - }; - - /* no character >= 0x80 can represent a valid number */ -#define OP >= - -#endif /* 'A' == 65 */ - -#if 'A' == 193 - /* EBCDIC */ - - char ft_char_table[128] = - { - /* 0x80 */ - -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1, - -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, - -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1, - -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, - -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, - } - - /* no character < 0x80 can represent a valid number */ -#define OP < - -#endif /* 'A' == 193 */ - - - /* first character must be already part of the comment */ - static void - skip_comment( FT_Byte* *acur, - FT_Byte* limit ) - { - FT_Byte* cur = *acur; - - - while ( cur < limit ) - { - if ( IS_T1_LINESPACE( *cur ) ) - break; - cur++; - } - - *acur = cur; - } - - - static void - skip_spaces( FT_Byte* *acur, + skip_spaces( FT_Byte** acur, FT_Byte* limit ) + { + FT_Byte* cur = *acur; + + + while ( cur < limit ) + { + FT_Byte c = *cur; + + + if ( !IS_T1_SPACE( c ) ) + break; + cur++; + } + + *acur = cur; + } + + + static void + skip_alpha( FT_Byte** acur, + FT_Byte* limit ) { FT_Byte* cur = *acur; while ( cur < limit ) { - if ( !IS_T1_SPACE( *cur ) ) - { - if ( *cur == '%' ) - /* According to the PLRM, a comment is equal to a space. */ - skip_comment( &cur, limit ); - else - break; - } + FT_Byte c = *cur; + + + if ( IS_T1_SPACE( c ) ) + break; cur++; } @@ -369,165 +321,6 @@ } - /* first character must be `(' */ - - static void - skip_literal_string( FT_Byte* *acur, - FT_Byte* limit ) - { - FT_Byte* cur = *acur; - FT_Int embed = 0; - - - while ( cur < limit ) - { - if ( *cur == '\\' ) - cur++; - else if ( *cur == '(' ) - embed++; - else if ( *cur == ')' ) - { - embed--; - if ( embed == 0 ) - { - cur++; - break; - } - } - cur++; - } - - *acur = cur; - } - - - /* first character must be `<' */ - - static void - skip_string( PS_Parser parser ) - { - FT_Byte* cur = parser->cursor; - FT_Byte* limit = parser->limit; - - - while ( ++cur < limit ) - { - int d; - - - /* All whitespace characters are ignored. */ - skip_spaces( &cur, limit ); - if ( cur >= limit ) - break; - - if ( *cur OP 0x80 ) - break; - - d = ft_char_table[*cur & 0x7F]; - if ( d < 0 || d >= 16 ) - break; - } - - if ( cur < limit && *cur != '>' ) - parser->error = PSaux_Err_Invalid_File_Format; - else - cur++; - - parser->cursor = cur; - } - - - /***********************************************************************/ - /* */ - /* All exported parsing routines handle leading whitespace and stop at */ - /* the first character which isn't part of the just handled token. */ - /* */ - /***********************************************************************/ - - - FT_LOCAL_DEF( void ) - ps_parser_skip_PS_token( PS_Parser parser ) - { - /* Note: PostScript allows any non-delimiting, non-whitespace */ - /* character in a name (PS Ref Manual, 3rd ed, p31). */ - /* PostScript delimiters are (, ), <, >, [, ], {, }, /, and %. */ - - FT_Byte* cur = parser->cursor; - FT_Byte* limit = parser->limit; - - - skip_spaces( &cur, limit ); /* this also skips comments */ - if ( cur >= limit ) - goto Exit; - - /* self-delimiting, single-character tokens */ - if ( *cur == '[' || *cur == ']' || - *cur == '{' || *cur == '}' ) - { - cur++; - goto Exit; - } - - if ( *cur == '(' ) /* (...) */ - { - skip_literal_string( &cur, limit ); - goto Exit; - } - - if ( *cur == '<' ) /* <...> */ - { - if ( cur + 1 < limit && *(cur + 1) == '<' ) /* << */ - { - cur++; - cur++; - goto Exit; - } - parser->cursor = cur; - skip_string( parser ); - return; - } - - if ( *cur == '>' ) - { - cur++; - if ( cur >= limit || *cur != '>' ) /* >> */ - { - parser->error = PSaux_Err_Invalid_File_Format; - goto Exit; - } - cur++; - goto Exit; - } - - if ( *cur == '/' ) - cur++; - - /* anything else */ - while ( cur < limit ) - { - if ( IS_T1_SPACE( *cur ) || - *cur == '(' || - *cur == '/' || - *cur == '%' || - *cur == '[' || *cur == ']' || - *cur == '{' || *cur == '}' || - *cur == '<' || *cur == '>' ) - break; - - if ( *cur == ')' ) - { - parser->error = PSaux_Err_Invalid_File_Format; - goto Exit; - } - - cur++; - } - - Exit: - parser->cursor = cur; - } - - FT_LOCAL_DEF( void ) ps_parser_skip_spaces( PS_Parser parser ) { @@ -535,8 +328,12 @@ } - /* `token' here means either something between balanced delimiters */ - /* or the next token; the delimiters are not removed. */ + FT_LOCAL_DEF( void ) + ps_parser_skip_alpha( PS_Parser parser ) + { + skip_alpha( &parser->cursor, parser->limit ); + } + FT_LOCAL_DEF( void ) ps_parser_to_token( PS_Parser parser, @@ -552,87 +349,72 @@ token->start = 0; token->limit = 0; - /* first of all, skip leading whitespace */ + /* first of all, skip space */ ps_parser_skip_spaces( parser ); cur = parser->cursor; limit = parser->limit; - if ( cur >= limit ) - return; - - switch ( *cur ) + if ( cur < limit ) { - /************* check for literal string *****************/ - case '(': - token->type = T1_TOKEN_TYPE_STRING; - token->start = cur; - skip_literal_string( &cur, limit ); - if ( cur < limit ) - token->limit = cur; - break; - - /************* check for programs/array *****************/ - case '{': - token->type = T1_TOKEN_TYPE_ARRAY; - ender = '}'; - goto Lookup_Ender; - - /************* check for table/array ********************/ - case '[': - token->type = T1_TOKEN_TYPE_ARRAY; - ender = ']'; - /* fall through */ - - Lookup_Ender: - embed = 1; - starter = *cur; - token->start = cur++; - - /* we need this to catch `[ ]' */ - parser->cursor = cur; - ps_parser_skip_spaces( parser ); - cur = parser->cursor; - - while ( cur < limit && !parser->error ) + switch ( *cur ) { - if ( *cur == starter ) - embed++; - else if ( *cur == ender ) + /************* check for strings ***********************/ + case '(': + token->type = T1_TOKEN_TYPE_STRING; + ender = ')'; + goto Lookup_Ender; + + /************* check for programs/array ****************/ + case '{': + token->type = T1_TOKEN_TYPE_ARRAY; + ender = '}'; + goto Lookup_Ender; + + /************* check for table/array ******************/ + case '[': + token->type = T1_TOKEN_TYPE_ARRAY; + ender = ']'; + + Lookup_Ender: + embed = 1; + starter = *cur++; + token->start = cur; + while ( cur < limit ) { - embed--; - if ( embed <= 0 ) + if ( *cur == starter ) + embed++; + else if ( *cur == ender ) { - token->limit = ++cur; - break; + embed--; + if ( embed <= 0 ) + { + token->limit = cur++; + break; + } } + cur++; } + break; - parser->cursor = cur; - ps_parser_skip_PS_token( parser ); - /* we need this to catch `[XXX ]' */ - ps_parser_skip_spaces ( parser ); - cur = parser->cursor; - } - break; + /* **************** otherwise, it's any token **********/ + default: + token->start = cur++; + token->type = T1_TOKEN_TYPE_ANY; + while ( cur < limit && !IS_T1_SPACE( *cur ) ) + cur++; - /* ************ otherwise, it is any token **************/ - default: - token->start = cur; - token->type = T1_TOKEN_TYPE_ANY; - ps_parser_skip_PS_token( parser ); - cur = parser->cursor; - if ( !parser->error ) token->limit = cur; - } + } - if ( !token->limit ) - { - token->start = 0; - token->type = T1_TOKEN_TYPE_NONE; - } + if ( !token->limit ) + { + token->start = 0; + token->type = T1_TOKEN_TYPE_NONE; + } - parser->cursor = cur; + parser->cursor = cur; + } } @@ -647,9 +429,7 @@ *pnum_tokens = -1; - /* this also handles leading whitespace */ ps_parser_to_token( parser, &master ); - if ( master.type == T1_TOKEN_TYPE_ARRAY ) { FT_Byte* old_cursor = parser->cursor; @@ -658,9 +438,8 @@ T1_Token limit = cur + max_tokens; - /* don't include outermost delimiters */ - parser->cursor = master.start + 1; - parser->limit = master.limit - 1; + parser->cursor = master.start; + parser->limit = master.limit; while ( parser->cursor < parser->limit ) { @@ -685,161 +464,150 @@ } - /* first character must be already part of the number */ - static FT_Long T1Radix( FT_Long radixBase, - FT_Byte* *acur, + FT_Byte** cur, FT_Byte* limit ) { - FT_Long result = 0; - FT_Byte* cur = *acur; + FT_Long result = 0; + FT_Byte radixEndChar0 = + (FT_Byte)( radixBase > 10 ? '9' + 1 : '0' + radixBase ); + FT_Byte radixEndChar1 = + (FT_Byte)( 'A' + radixBase - 10 ); + FT_Byte radixEndChar2 = + (FT_Byte)( 'a' + radixBase - 10 ); - if ( radixBase < 2 || radixBase > 36 ) - return 0; - - while ( cur < limit ) + while( *cur < limit ) { - int d; + if ( (*cur)[0] >= '0' && (*cur)[0] < radixEndChar0 ) + result = result * radixBase + (*cur)[0] - '0'; + else if ( radixBase > 10 && + (*cur)[0] >= 'A' && (*cur)[0] < radixEndChar1 ) + result = result * radixBase + ( (*cur)[0] - 'A' + 10 ); - if ( *cur OP 0x80 ) - break; + else if ( radixBase > 10 && + (*cur)[0] >= 'a' && (*cur)[0] < radixEndChar2 ) + result = result * radixBase + ( (*cur)[0] - 'a' + 10 ); - d = ft_char_table[*cur & 0x7F]; - if ( d < 0 || d >= radixBase ) - break; + else + return result; - result = result * radixBase + d; - - cur++; + (*cur)++; } return result; } - /* first character must be already part of the number */ - static FT_Long - ps_toint( FT_Byte* *acur, + t1_toint( FT_Byte** cursor, FT_Byte* limit ) { FT_Long result = 0; - FT_Byte* cur = *acur; - FT_Byte c; + FT_Byte* cur = *cursor; + FT_Byte c = '\0', d; - if ( cur >= limit ) - goto Exit; - - c = *cur; - if ( c == '-' ) - cur++; - - while ( cur < limit ) + for ( ; cur < limit; cur++ ) { - int d; + c = *cur; + d = (FT_Byte)( c - '0' ); + if ( d < 10 ) + break; - - if ( *cur == '#' ) + if ( c == '-' ) { cur++; - result = T1Radix( result, &cur, limit ); break; } + } - if ( *cur OP 0x80 ) - break; + if ( cur < limit ) + { + do + { + d = (FT_Byte)( cur[0] - '0' ); + if ( d >= 10 ) + { + if ( cur[0] == '#' ) + { + cur++; + result = T1Radix( result, &cur, limit ); + } + break; + } - d = ft_char_table[*cur & 0x7F]; - if ( d < 0 || d >= 10 ) - break; - result = result * 10 + d; + result = result * 10 + d; + cur++; - cur++; - }; + } while ( cur < limit ); - if ( c == '-' ) - result = -result; + if ( c == '-' ) + result = -result; + } - Exit: - *acur = cur; + *cursor = cur; return result; } - /* first character must be `<' if `delimiters' is non-zero */ - + /* <...>: hexadecimal string */ static FT_Error - ps_tobytes( FT_Byte* *acur, + ps_tobytes( FT_Byte** cursor, FT_Byte* limit, - FT_Long max_bytes, + FT_Int max_bytes, FT_Byte* bytes, - FT_Long* pnum_bytes, - FT_Bool delimiters ) + FT_Int* pnum_bytes ) { FT_Error error = PSaux_Err_Ok; - FT_Byte* cur = *acur; - FT_Long n = 0; + FT_Byte* cur = *cursor; + FT_Int n = 0; + FT_Byte b; - if ( cur >= limit ) - goto Exit; + skip_spaces( &cur, limit ); - if ( delimiters ) + if ( *cur != '<' ) { - if ( *cur != '<' ) - { - error = PSaux_Err_Invalid_File_Format; - goto Exit; - } - - cur++; + error = PSaux_Err_Invalid_File_Format; + goto Exit; } - max_bytes = max_bytes * 2; + cur++; - for ( n = 0; cur < limit; n++, cur++ ) + for ( ; cur < limit; n++ ) { - int d; + FT_Byte* cur2 = cur; - if ( n >= max_bytes ) - /* buffer is full */ + if ( n + 1 > max_bytes * 2 ) goto Exit; - /* All whitespace characters are ignored. */ + /* All white-space charcters are ignored. */ skip_spaces( &cur, limit ); - if ( cur >= limit ) - break; - if ( *cur OP 0x80 ) - break; + b = T1Radix( 16, &cur, cur + 1 ); - d = ft_char_table[*cur & 0x7F]; - if ( d < 0 || d >= 16 ) + if ( cur == cur2 ) break; /* <f> == <f0> != <0f> */ - bytes[n / 2] = (FT_Byte)( ( n % 2 ) ? bytes[n / 2] + d - : d * 16 ); + bytes[n / 2] = ( n % 2 ) ? bytes[n / 2] + b + : b * 16; } - if ( delimiters ) + skip_spaces( &cur, limit ); + + if ( *cur != '>' ) { - if ( cur < limit && *cur != '>' ) - { - error = PSaux_Err_Invalid_File_Format; - goto Exit; - } - - cur++; + error = PSaux_Err_Invalid_File_Format; + goto Exit; } - *acur = cur; + *cursor = ++cur; Exit: *pnum_bytes = ( n + 1 ) / 2; @@ -848,23 +616,22 @@ } - /* first character must be already part of the number */ - static FT_Long - ps_tofixed( FT_Byte* *acur, + t1_tofixed( FT_Byte** cursor, FT_Byte* limit, FT_Long power_ten ) { - FT_Byte* cur = *acur; + FT_Byte* cur = *cursor; FT_Long num, divider, result; FT_Int sign = 0; + FT_Byte d; if ( cur >= limit ) return 0; /* first of all, check the sign */ - if ( *cur == '-' && cur + 1 < limit ) + if ( *cur == '-' ) { sign = 1; cur++; @@ -872,7 +639,7 @@ /* then, read the integer part, if any */ if ( *cur != '.' ) - result = ps_toint( &cur, limit ) << 16; + result = t1_toint( &cur, limit ) << 16; else result = 0; @@ -889,14 +656,8 @@ for (;;) { - int d; - - - if ( *cur OP 0x80 ) - break; - - d = ft_char_table[*cur & 0x7F]; - if ( d < 0 || d >= 10 ) + d = (FT_Byte)( *cur - '0' ); + if ( d >= 10 ) break; if ( divider < 10000000L ) @@ -915,7 +676,7 @@ if ( cur + 1 < limit && ( *cur == 'e' || *cur == 'E' ) ) { cur++; - power_ten += ps_toint( &cur, limit ); + power_ten += t1_toint( &cur, limit ); } Exit: @@ -940,20 +701,18 @@ if ( sign ) result = -result; - *acur = cur; + *cursor = cur; return result; } - /* first character must be a delimiter or a part of a number */ - static FT_Int - ps_tocoordarray( FT_Byte* *acur, + t1_tocoordarray( FT_Byte** cursor, FT_Byte* limit, FT_Int max_coords, FT_Short* coords ) { - FT_Byte* cur = *acur; + FT_Byte* cur = *cursor; FT_Int count = 0; FT_Byte c, ender; @@ -961,8 +720,8 @@ if ( cur >= limit ) goto Exit; - /* check for the beginning of an array; otherwise, only one number */ - /* will be read */ + /* check for the beginning of an array; if not, only one number will */ + /* be read */ c = *cur; ender = 0; @@ -976,23 +735,24 @@ cur++; /* now, read the coordinates */ - while ( cur < limit ) + for ( ; cur < limit; ) { /* skip whitespace in front of data */ - skip_spaces( &cur, limit ); - if ( cur >= limit ) - goto Exit; - - if ( count >= max_coords ) - break; - - if ( c == ender ) + for (;;) { + c = *cur; + if ( c != ' ' && c != '\t' ) + break; + cur++; - break; + if ( cur >= limit ) + goto Exit; } - coords[count] = (FT_Short)( ps_tofixed( &cur, limit, 0 ) >> 16 ); + if ( count >= max_coords || c == ender ) + break; + + coords[count] = (FT_Short)( t1_tofixed( &cur, limit, 0 ) >> 16 ); count++; if ( !ender ) @@ -1000,30 +760,27 @@ } Exit: - *acur = cur; + *cursor = cur; return count; } - /* first character must be a delimiter or a part of a number */ - static FT_Int - ps_tofixedarray( FT_Byte* *acur, + t1_tofixedarray( FT_Byte** cursor, FT_Byte* limit, FT_Int max_values, FT_Fixed* values, FT_Int power_ten ) { - FT_Byte* cur = *acur; + FT_Byte* cur = *cursor; FT_Int count = 0; FT_Byte c, ender; - if ( cur >= limit ) - goto Exit; + if ( cur >= limit ) goto Exit; - /* Check for the beginning of an array. Otherwise, only one number */ - /* will be read. */ + /* check for the beginning of an array. If not, only one number will */ + /* be read */ c = *cur; ender = 0; @@ -1037,23 +794,24 @@ cur++; /* now, read the values */ - while ( cur < limit ) + for ( ; cur < limit; ) { /* skip whitespace in front of data */ - skip_spaces( &cur, limit ); - if ( cur >= limit ) - goto Exit; - - if ( count >= max_values ) - break; - - if ( c == ender ) + for (;;) { + c = *cur; + if ( c != ' ' && c != '\t' ) + break; + cur++; - break; + if ( cur >= limit ) + goto Exit; } - values[count] = ps_tofixed( &cur, limit, power_ten ); + if ( count >= max_values || c == ender ) + break; + + values[count] = t1_tofixed( &cur, limit, power_ten ); count++; if ( !ender ) @@ -1061,7 +819,7 @@ } Exit: - *acur = cur; + *cursor = cur; return count; } @@ -1069,7 +827,7 @@ #if 0 static FT_String* - ps_tostring( FT_Byte** cursor, + t1_tostring( FT_Byte** cursor, FT_Byte* limit, FT_Memory memory ) { @@ -1129,41 +887,40 @@ static int - ps_tobool( FT_Byte* *acur, + t1_tobool( FT_Byte** cursor, FT_Byte* limit ) { - FT_Byte* cur = *acur; + FT_Byte* cur = *cursor; FT_Bool result = 0; /* return 1 if we find `true', 0 otherwise */ if ( cur + 3 < limit && - cur[0] == 't' && - cur[1] == 'r' && - cur[2] == 'u' && - cur[3] == 'e' ) + cur[0] == 't' && + cur[1] == 'r' && + cur[2] == 'u' && + cur[3] == 'e' ) { result = 1; cur += 5; } else if ( cur + 4 < limit && - cur[0] == 'f' && - cur[1] == 'a' && - cur[2] == 'l' && - cur[3] == 's' && - cur[4] == 'e' ) + cur[0] == 'f' && + cur[1] == 'a' && + cur[2] == 'l' && + cur[3] == 's' && + cur[4] == 'e' ) { result = 0; cur += 6; } - *acur = cur; + *cursor = cur; return result; } - /* load a simple field (i.e. non-table) into the current list of objects */ - + /* Load a simple field (i.e. non-table) into the current list of objects */ FT_LOCAL_DEF( FT_Error ) ps_parser_load_field( PS_Parser parser, const T1_Field field, @@ -1179,7 +936,6 @@ FT_Error error; - /* this also skips leading whitespace */ ps_parser_to_token( parser, &token ); if ( !token.type ) goto Fail; @@ -1189,7 +945,7 @@ cur = token.start; limit = token.limit; - /* we must detect arrays in /FontBBox */ + /* we must detect arrays */ if ( field->type == T1_FIELD_TYPE_BBOX ) { T1_TokenRec token2; @@ -1197,9 +953,8 @@ FT_Byte* old_limit = parser->limit; - /* don't include delimiters */ - parser->cursor = token.start + 1; - parser->limit = token.limit - 1; + parser->cursor = token.start; + parser->limit = token.limit; ps_parser_to_token( parser, &token2 ); parser->cursor = old_cur; @@ -1211,16 +966,12 @@ else if ( token.type == T1_TOKEN_TYPE_ARRAY ) { FieldArray: - /* if this is an array and we have no blend, an error occurs */ + /* if this is an array, and we have no blend, an error occurs */ if ( max_objects == 0 ) goto Fail; count = max_objects; - idx = 1; - - /* don't include delimiters */ - cur++; - limit--; + idx = 1; } for ( ; count > 0; count--, idx++ ) @@ -1230,25 +981,23 @@ FT_String* string; - skip_spaces( &cur, limit ); - switch ( field->type ) { case T1_FIELD_TYPE_BOOL: - val = ps_tobool( &cur, limit ); + val = t1_tobool( &cur, limit ); goto Store_Integer; case T1_FIELD_TYPE_FIXED: - val = ps_tofixed( &cur, limit, 0 ); + val = t1_tofixed( &cur, limit, 0 ); goto Store_Integer; case T1_FIELD_TYPE_FIXED_1000: - val = ps_tofixed( &cur, limit, 3 ); + val = t1_tofixed( &cur, limit, 3 ); goto Store_Integer; case T1_FIELD_TYPE_INTEGER: - val = ps_toint( &cur, limit ); - /* fall through */ + val = t1_toint( &cur, limit ); + goto Store_Integer; Store_Integer: switch ( field->size ) @@ -1277,25 +1026,15 @@ FT_UInt len = (FT_UInt)( limit - cur ); - if ( cur >= limit ) - break; - - /* with synthetic fonts, it is possible to find a field twice */ + /* with synthetic fonts, it's possible to find a field twice */ if ( *(FT_String**)q ) break; if ( field->type == T1_FIELD_TYPE_KEY ) { - /* don't include leading `/' */ len--; cur++; } - else - { - /* don't include delimiting parentheses */ - cur++; - len -= 2; - } if ( FT_ALLOC( string, len + 1 ) ) goto Exit; @@ -1313,7 +1052,10 @@ FT_BBox* bbox = (FT_BBox*)q; - (void)ps_tofixedarray( &token.start, token.limit, 4, temp, 0 ); + /* we need the '[' and ']' delimiters */ + token.start--; + token.limit++; + (void)t1_tofixedarray( &token.start, token.limit, 4, temp, 0 ); bbox->xMin = FT_RoundFix( temp[0] ); bbox->yMin = FT_RoundFix( temp[1] ); @@ -1328,7 +1070,7 @@ } } -#if 0 /* obsolete -- keep for reference */ +#if 0 /* obsolete - keep for reference */ if ( pflags ) *pflags |= 1L << field->flag_bit; #else @@ -1371,8 +1113,7 @@ fieldrec.type = T1_FIELD_TYPE_FIXED; #endif - ps_parser_to_token_array( parser, elements, - T1_MAX_TABLE_ELEMENTS, &num_elements ); + ps_parser_to_token_array( parser, elements, 32, &num_elements ); if ( num_elements < 0 ) goto Fail; @@ -1418,25 +1159,21 @@ FT_LOCAL_DEF( FT_Long ) ps_parser_to_int( PS_Parser parser ) { - ps_parser_skip_spaces( parser ); - return ps_toint( &parser->cursor, parser->limit ); + return t1_toint( &parser->cursor, parser->limit ); } FT_LOCAL_DEF( FT_Error ) ps_parser_to_bytes( PS_Parser parser, FT_Byte* bytes, - FT_Long max_bytes, - FT_Long* pnum_bytes, - FT_Bool delimiters ) + FT_Int max_bytes, + FT_Int* pnum_bytes ) { - ps_parser_skip_spaces( parser ); return ps_tobytes( &parser->cursor, parser->limit, max_bytes, bytes, - pnum_bytes, - delimiters ); + pnum_bytes ); } @@ -1444,8 +1181,7 @@ ps_parser_to_fixed( PS_Parser parser, FT_Int power_ten ) { - ps_parser_skip_spaces( parser ); - return ps_tofixed( &parser->cursor, parser->limit, power_ten ); + return t1_tofixed( &parser->cursor, parser->limit, power_ten ); } @@ -1454,8 +1190,7 @@ FT_Int max_coords, FT_Short* coords ) { - ps_parser_skip_spaces( parser ); - return ps_tocoordarray( &parser->cursor, parser->limit, + return t1_tocoordarray( &parser->cursor, parser->limit, max_coords, coords ); } @@ -1466,8 +1201,7 @@ FT_Fixed* values, FT_Int power_ten ) { - ps_parser_skip_spaces( parser ); - return ps_tofixedarray( &parser->cursor, parser->limit, + return t1_tofixedarray( &parser->cursor, parser->limit, max_values, values, power_ten ); } @@ -1477,14 +1211,14 @@ FT_LOCAL_DEF( FT_String* ) T1_ToString( PS_Parser parser ) { - return ps_tostring( &parser->cursor, parser->limit, parser->memory ); + return t1_tostring( &parser->cursor, parser->limit, parser->memory ); } FT_LOCAL_DEF( FT_Bool ) T1_ToBool( PS_Parser parser ) { - return ps_tobool( &parser->cursor, parser->limit ); + return t1_tobool( &parser->cursor, parser->limit ); } #endif /* 0 */ @@ -1496,7 +1230,7 @@ FT_Byte* limit, FT_Memory memory ) { - parser->error = PSaux_Err_Ok; + parser->error = 0; parser->base = base; parser->limit = limit; parser->cursor = base; @@ -1670,7 +1404,7 @@ } - /* check space for a new contour, then add it */ + /* check room for a new contour, then add it */ FT_LOCAL_DEF( FT_Error ) t1_builder_add_contour( T1_Builder builder ) { diff --git a/reactos/lib/freetype/src/psaux/psobjs.h b/reactos/lib/freetype/src/psaux/psobjs.h index c2cbf2c79b3..8b214f652ba 100644 --- a/reactos/lib/freetype/src/psaux/psobjs.h +++ b/reactos/lib/freetype/src/psaux/psobjs.h @@ -78,7 +78,7 @@ FT_BEGIN_HEADER ps_parser_skip_spaces( PS_Parser parser ); FT_LOCAL( void ) - ps_parser_skip_PS_token( PS_Parser parser ); + ps_parser_skip_alpha( PS_Parser parser ); FT_LOCAL( void ) ps_parser_to_token( PS_Parser parser, @@ -108,14 +108,6 @@ FT_BEGIN_HEADER ps_parser_to_int( PS_Parser parser ); - FT_LOCAL( FT_Error ) - ps_parser_to_bytes( PS_Parser parser, - FT_Byte* bytes, - FT_Long max_bytes, - FT_Long* pnum_bytes, - FT_Bool delimiters ); - - FT_LOCAL( FT_Fixed ) ps_parser_to_fixed( PS_Parser parser, FT_Int power_ten ); diff --git a/reactos/lib/freetype/src/psaux/t1cmap.c b/reactos/lib/freetype/src/psaux/t1cmap.c index dcd99be49fd..3fdf2ee3ce3 100644 --- a/reactos/lib/freetype/src/psaux/t1cmap.c +++ b/reactos/lib/freetype/src/psaux/t1cmap.c @@ -4,7 +4,7 @@ /* */ /* Type 1 character map support (body). */ /* */ -/* Copyright 2002, 2003 by */ +/* Copyright 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -35,8 +35,8 @@ t1_cmap_std_init( T1_CMapStd cmap, FT_Int is_expert ) { - T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); + PSNames_Service psnames = (PSNames_Service)face->psnames; cmap->num_glyphs = face->type1.num_glyphs; @@ -263,26 +263,26 @@ { FT_UInt32 u1 = ((T1_CMapUniPair)pair1)->unicode; FT_UInt32 u2 = ((T1_CMapUniPair)pair2)->unicode; - + if ( u1 < u2 ) return -1; - + if ( u1 > u2 ) return +1; - + return 0; - } + } FT_CALLBACK_DEF( FT_Error ) t1_cmap_unicode_init( T1_CMapUnicode cmap ) { - FT_Error error; - FT_UInt count; - T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); - FT_Memory memory = FT_FACE_MEMORY( face ); - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + FT_Error error; + FT_UInt count; + T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + PSNames_Service psnames = (PSNames_Service)face->psnames; cmap->num_pairs = 0; @@ -316,7 +316,7 @@ } } } - + new_count = (FT_UInt)( pair - cmap->pairs ); if ( new_count == 0 ) { diff --git a/reactos/lib/freetype/src/psaux/t1cmap.h b/reactos/lib/freetype/src/psaux/t1cmap.h index aa93d746c17..0d68c999c12 100644 --- a/reactos/lib/freetype/src/psaux/t1cmap.h +++ b/reactos/lib/freetype/src/psaux/t1cmap.h @@ -4,7 +4,7 @@ /* */ /* Type 1 character map support (specification). */ /* */ -/* Copyright 2002, 2003 by */ +/* Copyright 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -22,6 +22,7 @@ #include <ft2build.h> #include FT_INTERNAL_OBJECTS_H #include FT_INTERNAL_TYPE1_TYPES_H +#include FT_INTERNAL_POSTSCRIPT_NAMES_H FT_BEGIN_HEADER @@ -46,16 +47,16 @@ FT_BEGIN_HEADER FT_UInt num_glyphs; const char* const* glyph_names; - + } T1_CMapStdRec; FT_CALLBACK_TABLE const FT_CMap_ClassRec t1_cmap_standard_class_rec; - + FT_CALLBACK_TABLE const FT_CMap_ClassRec t1_cmap_expert_class_rec; - + /*************************************************************************/ /*************************************************************************/ @@ -66,20 +67,20 @@ FT_BEGIN_HEADER /*************************************************************************/ typedef struct T1_CMapCustomRec_* T1_CMapCustom; - + typedef struct T1_CMapCustomRec_ { FT_CMapRec cmap; FT_UInt first; FT_UInt count; FT_UShort* indices; - + } T1_CMapCustomRec; FT_CALLBACK_TABLE const FT_CMap_ClassRec t1_cmap_custom_class_rec; - + /*************************************************************************/ /*************************************************************************/ @@ -96,7 +97,7 @@ FT_BEGIN_HEADER { FT_UInt32 unicode; FT_UInt gindex; - + } T1_CMapUniPairRec, *T1_CMapUniPair; @@ -114,7 +115,7 @@ FT_BEGIN_HEADER /* */ - + FT_END_HEADER #endif /* __T1CMAP_H__ */ diff --git a/reactos/lib/freetype/src/psaux/t1decode.c b/reactos/lib/freetype/src/psaux/t1decode.c index db1911e7bd6..dd8719f12af 100644 --- a/reactos/lib/freetype/src/psaux/t1decode.c +++ b/reactos/lib/freetype/src/psaux/t1decode.c @@ -4,7 +4,7 @@ /* */ /* PostScript Type 1 decoding routines (body). */ /* */ -/* Copyright 2000-2001, 2002, 2003, 2004 by */ +/* Copyright 2000-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -125,9 +125,9 @@ t1_lookup_glyph_by_stdcharcode( T1_Decoder decoder, FT_Int charcode ) { - FT_UInt n; - const FT_String* glyph_name; - FT_Service_PsCMaps psnames = decoder->psnames; + FT_UInt n; + const FT_String* glyph_name; + PSNames_Service psnames = decoder->psnames; /* check range of standard char code */ @@ -143,7 +143,7 @@ if ( name && name[0] == glyph_name[0] && - ft_strcmp( name, glyph_name ) == 0 ) + ft_strcmp( name,glyph_name ) == 0 ) return n; } @@ -262,6 +262,10 @@ if ( error ) goto Exit; +#if 0 + n_base_points = base->n_points; +#endif + /* save the left bearing and width of the base character */ /* as they will be erased by the next load. */ @@ -286,8 +290,23 @@ decoder->builder.left_bearing = left_bearing; decoder->builder.advance = advance; + /* XXX: old code doesn't work with PostScript hinter */ +#if 0 + /* Finally, move the accent */ + if ( decoder->builder.load_points ) + { + FT_Outline dummy; + + + dummy.n_points = (short)( base->n_points - n_base_points ); + dummy.points = base->points + n_base_points; + + FT_Outline_Translate( &dummy, adx - asb, ady ); + } +#else decoder->builder.pos_x = 0; decoder->builder.pos_y = 0; +#endif Exit: return error; @@ -1110,10 +1129,11 @@ /* retrieve PSNames interface from list of current modules */ { - FT_Service_PsCMaps psnames = 0; + PSNames_Service psnames = 0; - FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + psnames = (PSNames_Service)FT_Get_Module_Interface( + FT_FACE_LIBRARY(face), "psnames" ); if ( !psnames ) { FT_ERROR(( "t1_decoder_init: " )); diff --git a/reactos/lib/freetype/src/psaux/t1decode.h b/reactos/lib/freetype/src/psaux/t1decode.h index 00728db501e..fcb853ce804 100644 --- a/reactos/lib/freetype/src/psaux/t1decode.h +++ b/reactos/lib/freetype/src/psaux/t1decode.h @@ -4,7 +4,7 @@ /* */ /* PostScript Type 1 decoding routines (specification). */ /* */ -/* Copyright 2000-2001, 2002, 2003 by */ +/* Copyright 2000-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -22,6 +22,7 @@ #include <ft2build.h> #include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_INTERNAL_POSTSCRIPT_NAMES_H #include FT_INTERNAL_TYPE1_TYPES_H diff --git a/reactos/lib/freetype/src/pshinter/Jamfile b/reactos/lib/freetype/src/pshinter/Jamfile index ee02a144be6..bdde744b0ed 100644 --- a/reactos/lib/freetype/src/pshinter/Jamfile +++ b/reactos/lib/freetype/src/pshinter/Jamfile @@ -1,4 +1,4 @@ -# FreeType 2 src/pshinter Jamfile (c) 2001, 2003 David Turner +# FreeType 2 src/pshinter Jamfile (c) 2001 David Turner # SubDir FT2_TOP $(FT2_SRC_DIR) pshinter ; diff --git a/reactos/lib/freetype/src/pshinter/pshalgo.c b/reactos/lib/freetype/src/pshinter/pshalgo.c index 30ad1fbdd7d..3e76529ac92 100644 --- a/reactos/lib/freetype/src/pshinter/pshalgo.c +++ b/reactos/lib/freetype/src/pshinter/pshalgo.c @@ -2,9 +2,9 @@ /* */ /* pshalgo.c */ /* */ -/* PostScript hinting algorithm (body). */ +/* PostScript hinting algorithm 3 (body). */ /* */ -/* Copyright 2001, 2002, 2003, 2004 by */ +/* Copyright 2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used */ @@ -375,11 +375,11 @@ len += delta; } else - len = FT_PIX_ROUND( len ); + len = ( len + 32 ) & -64; } if ( do_snapping ) - len = FT_PIX_ROUND( len ); + len = ( len + 32 ) & -64; return len; } @@ -417,8 +417,8 @@ psh_hint_snap_stem_side_delta( FT_Fixed pos, FT_Fixed len ) { - FT_Fixed delta1 = FT_PIX_ROUND( pos ) - pos; - FT_Fixed delta2 = FT_PIX_ROUND( pos + len ) - pos - len; + FT_Fixed delta1 = ( ( pos + 32 ) & -64 ) - pos; + FT_Fixed delta2 = ( ( pos + len + 32 ) & -64 ) - pos - len; if ( ABS( delta1 ) <= ABS( delta2 ) ) @@ -534,10 +534,10 @@ * around the nearest pixel center */ #if 1 - pos = FT_PIX_FLOOR( pos + ( len >> 1 ) ); + pos = ( pos + ( len >> 1 ) ) & -64; #else /* this seems to be a bug! */ - pos = pos + FT_PIX_FLOOR( len >> 1 ); + pos = ( pos + ( ( len >> 1 ) & -64 ) ); #endif len = 64; } @@ -562,7 +562,7 @@ if ( len < 64 ) len = 64; else - len = FT_PIX_ROUND( len ); + len = ( len + 32 ) & -64; switch ( align.align ) { @@ -583,9 +583,9 @@ default: hint->cur_len = len; if ( len & 64 ) - pos = FT_PIX_FLOOR( pos + ( len >> 1 ) ) + 32; + pos = ( ( pos + ( len >> 1 ) ) & -64 ) + 32; else - pos = FT_PIX_ROUND( pos + ( len >> 1 ) ); + pos = ( pos + ( len >> 1 ) + 32 ) & -64; hint->cur_pos = pos - ( len >> 1 ); hint->cur_len = len; @@ -739,13 +739,13 @@ if ( ( len / 64 ) & 1 ) { - delta_a = FT_PIX_FLOOR( center ) + 32 - center; - delta_b = FT_PIX_ROUND( center ) - center; + delta_a = ( center & -64 ) + 32 - center; + delta_b = ( ( center + 32 ) & - 64 ) - center; } else { - delta_a = FT_PIX_ROUND( center ) - center; - delta_b = FT_PIX_FLOOR( center ) + 32 - center; + delta_a = ( ( center + 32 ) & - 64 ) - center; + delta_b = ( center & -64 ) + 32 - center; } /* We choose between B) and C) above based on the amount @@ -762,6 +762,7 @@ FT_Fixed side_delta = psh_hint_snap_stem_side_delta ( pos, len ); + if ( ABS( side_delta ) < ABS( delta_b ) ) pos += side_delta; else @@ -1110,7 +1111,7 @@ /* clear all fields */ FT_MEM_ZERO( glyph, sizeof ( *glyph ) ); - memory = glyph->memory = globals->memory; + memory = globals->memory; /* allocate and setup points + contours arrays */ if ( FT_NEW_ARRAY( glyph->points, outline->n_points ) || @@ -1217,6 +1218,7 @@ } } + glyph->memory = memory; glyph->outline = outline; glyph->globals = globals; @@ -1938,7 +1940,7 @@ scaled = FT_MulFix( globals->blues.normal_top.zones->org_ref, y_scale ); - fitted = FT_PIX_ROUND( scaled ); + fitted = ( scaled + 32 ) & -64; if (scaled != fitted ) { y_scale = FT_MulDiv( y_scale, fitted, scaled ); diff --git a/reactos/lib/freetype/src/pshinter/pshglob.c b/reactos/lib/freetype/src/pshinter/pshglob.c index 3971c590202..3ae57283cd6 100644 --- a/reactos/lib/freetype/src/pshinter/pshglob.c +++ b/reactos/lib/freetype/src/pshinter/pshglob.c @@ -448,7 +448,7 @@ zone->cur_delta = FT_MulFix( zone->org_delta, scale ); /* round scaled reference position */ - zone->cur_ref = FT_PIX_ROUND( zone->cur_ref ); + zone->cur_ref = ( zone->cur_ref + 32 ) & -64; #if 0 if ( zone->cur_ref > zone->cur_top ) @@ -654,7 +654,7 @@ write->org = priv->standard_height[0]; - write++; + write++; read = priv->snap_heights; for ( count = priv->num_snap_heights; count > 0; count-- ) { diff --git a/reactos/lib/freetype/src/pshinter/pshrec.c b/reactos/lib/freetype/src/pshinter/pshrec.c index 13e0795c564..b0fee3d9530 100644 --- a/reactos/lib/freetype/src/pshinter/pshrec.c +++ b/reactos/lib/freetype/src/pshinter/pshrec.c @@ -68,7 +68,7 @@ if ( new_max > old_max ) { /* try to grow the table */ - new_max = FT_PAD_CEIL( new_max, 8 ); + new_max = ( new_max + 7 ) & -8; if ( !FT_RENEW_ARRAY( table->hints, old_max, new_max ) ) table->max_hints = new_max; } @@ -142,7 +142,7 @@ if ( new_max > old_max ) { - new_max = FT_PAD_CEIL( new_max, 8 ); + new_max = ( new_max + 7 ) & -8; if ( !FT_RENEW_ARRAY( mask->bytes, old_max, new_max ) ) mask->max_bits = new_max * 8; } @@ -239,7 +239,7 @@ if ( new_max > old_max ) { - new_max = FT_PAD_CEIL( new_max, 8 ); + new_max = ( new_max + 7 ) & -8; if ( !FT_RENEW_ARRAY( table->masks, old_max, new_max ) ) table->max_masks = new_max; } @@ -1012,7 +1012,7 @@ FT_ERROR(( "ps_hints_t2mask: " "called with invalid bitcount %d (instead of %d)\n", bit_count, count1 + count2 )); - + /* simply ignore the operator */ return; } @@ -1057,7 +1057,7 @@ FT_ERROR(( "ps_hints_t2counter: " "called with invalid bitcount %d (instead of %d)\n", bit_count, count1 + count2 )); - + /* simply ignore the operator */ return; } diff --git a/reactos/lib/freetype/src/pshinter/pshrec.h b/reactos/lib/freetype/src/pshinter/pshrec.h index 0159e9cd5d7..29d3718901f 100644 --- a/reactos/lib/freetype/src/pshinter/pshrec.h +++ b/reactos/lib/freetype/src/pshinter/pshrec.h @@ -4,7 +4,7 @@ /* */ /* Postscript (Type1/Type2) hints recorder (specification). */ /* */ -/* Copyright 2001, 2002, 2003 by */ +/* Copyright 2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/reactos/lib/freetype/src/psnames/psmodule.c b/reactos/lib/freetype/src/psnames/psmodule.c index f6d6ae3285c..af364285c09 100644 --- a/reactos/lib/freetype/src/psnames/psmodule.c +++ b/reactos/lib/freetype/src/psnames/psmodule.c @@ -17,8 +17,8 @@ #include <ft2build.h> +#include FT_INTERNAL_POSTSCRIPT_NAMES_H #include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H #include "psmodule.h" #include "pstables.h" @@ -176,10 +176,10 @@ /* Builds a table that maps Unicode values to glyph indices */ static FT_Error - ps_unicodes_init( FT_Memory memory, - FT_UInt num_glyphs, - const char** glyph_names, - PS_Unicodes* table ) + ps_build_unicode_table( FT_Memory memory, + FT_UInt num_glyphs, + const char** glyph_names, + PS_Unicodes* table ) { FT_Error error; @@ -242,8 +242,8 @@ static FT_UInt - ps_unicodes_char_index( PS_Unicodes* table, - FT_ULong unicode ) + ps_lookup_unicode( PS_Unicodes* table, + FT_ULong unicode ) { PS_UniMap *min, *max, *mid; @@ -273,8 +273,8 @@ static FT_ULong - ps_unicodes_char_next( PS_Unicodes* table, - FT_ULong unicode ) + ps_next_unicode( PS_Unicodes* table, + FT_ULong unicode ) { PS_UniMap *min, *max, *mid; @@ -335,52 +335,40 @@ static - const FT_Service_PsCMapsRec pscmaps_interface = + const PSNames_Interface psnames_interface = { #ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST - (PS_Unicode_ValueFunc) ps_unicode_value, - (PS_Unicodes_InitFunc) ps_unicodes_init, - (PS_Unicodes_CharIndexFunc)ps_unicodes_char_index, - (PS_Unicodes_CharNextFunc) ps_unicodes_char_next, + (PS_Unicode_Value_Func) ps_unicode_value, + (PS_Build_Unicodes_Func) ps_build_unicode_table, + (PS_Lookup_Unicode_Func) ps_lookup_unicode, #else 0, 0, 0, - 0, #endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ - (PS_Macintosh_Name_Func) ps_get_macintosh_name, - (PS_Adobe_Std_Strings_Func)ps_get_standard_strings, + (PS_Macintosh_Name_Func) ps_get_macintosh_name, + (PS_Adobe_Std_Strings_Func) ps_get_standard_strings, t1_standard_encoding, - t1_expert_encoding + t1_expert_encoding, + +#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + (PS_Next_Unicode_Func) ps_next_unicode +#else + 0 +#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ + }; - static const FT_ServiceDescRec pscmaps_services[] = - { - { FT_SERVICE_ID_POSTSCRIPT_CMAPS, &pscmaps_interface }, - { NULL, NULL } - }; - - - static FT_Pointer - psnames_get_service( FT_Module module, - const char* service_id ) - { - FT_UNUSED( module ); - - return ft_service_list_lookup( pscmaps_services, service_id ); - } - #endif /* !FT_CONFIG_OPTION_NO_POSTSCRIPT_NAMES */ - FT_CALLBACK_TABLE_DEF const FT_Module_Class psnames_module_class = { @@ -393,15 +381,13 @@ #ifdef FT_CONFIG_OPTION_NO_POSTSCRIPT_NAMES 0, +#else + (void*)&psnames_interface, /* module specific interface */ +#endif + (FT_Module_Constructor)0, (FT_Module_Destructor) 0, (FT_Module_Requester) 0 -#else - (void*)&pscmaps_interface, /* module specific interface */ - (FT_Module_Constructor)0, - (FT_Module_Destructor) 0, - (FT_Module_Requester) psnames_get_service -#endif }; diff --git a/reactos/lib/freetype/src/raster/ftrend1.c b/reactos/lib/freetype/src/raster/ftrend1.c index a17ef9b6138..b6c0f028249 100644 --- a/reactos/lib/freetype/src/raster/ftrend1.c +++ b/reactos/lib/freetype/src/raster/ftrend1.c @@ -140,10 +140,10 @@ /* compute the control box, and grid fit it */ FT_Outline_Get_CBox( outline, &cbox ); - cbox.xMin = FT_PIX_FLOOR( cbox.xMin ); - cbox.yMin = FT_PIX_FLOOR( cbox.yMin ); - cbox.xMax = FT_PIX_CEIL( cbox.xMax ); - cbox.yMax = FT_PIX_CEIL( cbox.yMax ); + cbox.xMin &= -64; + cbox.yMin &= -64; + cbox.xMax = ( cbox.xMax + 63 ) & -64; + cbox.yMax = ( cbox.yMax + 63 ) & -64; width = (FT_UInt)( ( cbox.xMax - cbox.xMin ) >> 6 ); height = (FT_UInt)( ( cbox.yMax - cbox.yMin ) >> 6 ); @@ -161,7 +161,7 @@ if ( !( mode & FT_RENDER_MODE_MONO ) ) { /* we pad to 32 bits, only for backwards compatibility with FT 1.x */ - pitch = FT_PAD_CEIL( width, 4 ); + pitch = ( width + 3 ) & -4; bitmap->pixel_mode = FT_PIXEL_MODE_GRAY; bitmap->num_grays = 256; } @@ -193,9 +193,9 @@ /* render outline into the bitmap */ error = render->raster_render( render->raster, ¶ms ); - + FT_Outline_Translate( outline, cbox.xMin, cbox.yMin ); - + if ( error ) goto Exit; diff --git a/reactos/lib/freetype/src/sfnt/Jamfile b/reactos/lib/freetype/src/sfnt/Jamfile index 257b3442cb7..adddfb6fd24 100644 --- a/reactos/lib/freetype/src/sfnt/Jamfile +++ b/reactos/lib/freetype/src/sfnt/Jamfile @@ -1,4 +1,4 @@ -# FreeType 2 src/sfnt Jamfile (c) 2001, 2002, 2004 David Turner +# FreeType 2 src/sfnt Jamfile (c) 2001, 2002 David Turner # SubDir FT2_TOP $(FT2_SRC_DIR) sfnt ; @@ -8,7 +8,7 @@ SubDir FT2_TOP $(FT2_SRC_DIR) sfnt ; if $(FT2_MULTI) { - _sources = sfobjs sfdriver ttcmap0 ttpost ttload ttsbit ; + _sources = sfobjs sfdriver ttcmap ttcmap0 ttpost ttload ttsbit ; } else { diff --git a/reactos/lib/freetype/src/sfnt/rules.mk b/reactos/lib/freetype/src/sfnt/rules.mk index f1323854914..14078974713 100644 --- a/reactos/lib/freetype/src/sfnt/rules.mk +++ b/reactos/lib/freetype/src/sfnt/rules.mk @@ -26,6 +26,7 @@ SFNT_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(SFNT_DIR)) # SFNT driver sources (i.e., C files) # SFNT_DRV_SRC := $(SFNT_DIR)/ttload.c \ + $(SFNT_DIR)/ttcmap.c \ $(SFNT_DIR)/ttcmap0.c \ $(SFNT_DIR)/ttsbit.c \ $(SFNT_DIR)/ttpost.c \ diff --git a/reactos/lib/freetype/src/sfnt/sfdriver.c b/reactos/lib/freetype/src/sfnt/sfdriver.c index c2bf948c7cf..ea504bdd7bd 100644 --- a/reactos/lib/freetype/src/sfnt/sfdriver.c +++ b/reactos/lib/freetype/src/sfnt/sfdriver.c @@ -22,10 +22,9 @@ #include "sfdriver.h" #include "ttload.h" +#include "ttcmap.h" #include "sfobjs.h" -#include "sferrors.h" - #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS #include "ttsbit.h" #endif @@ -34,18 +33,6 @@ #include "ttpost.h" #endif -#include "ttcmap0.h" - -#include FT_SERVICE_GLYPH_DICT_H -#include FT_SERVICE_POSTSCRIPT_NAME_H -#include FT_SERVICE_SFNT_H -#include FT_SERVICE_TT_CMAP_H - - - /* - * SFNT TABLE SERVICE - * - */ static void* get_sfnt_table( TT_Face face, @@ -92,22 +79,11 @@ } - static const FT_Service_SFNT_TableRec sfnt_service_sfnt_table = - { - (FT_SFNT_TableLoadFunc)tt_face_load_any, - (FT_SFNT_TableGetFunc) get_sfnt_table - }; - - #ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES - /* - * GLYPH DICT SERVICE - * - */ static FT_Error - sfnt_get_glyph_name( TT_Face face, + get_sfnt_glyph_name( TT_Face face, FT_UInt glyph_index, FT_Pointer buffer, FT_UInt buffer_max ) @@ -133,30 +109,16 @@ } - static const FT_Service_GlyphDictRec sfnt_service_glyph_dict = - { - (FT_GlyphDict_GetNameFunc) sfnt_get_glyph_name, - (FT_GlyphDict_NameIndexFunc)NULL - }; - -#endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ - - - /* - * POSTSCRIPT NAME SERVICE - * - */ - static const char* - sfnt_get_ps_name( TT_Face face ) + get_sfnt_postscript_name( TT_Face face ) { FT_Int n, found_win, found_apple; const char* result = NULL; /* shouldn't happen, but just in case to avoid memory leaks */ - if ( face->postscript_name ) - return face->postscript_name; + if ( face->root.internal->postscript_name ) + return face->root.internal->postscript_name; /* scan the name table to see whether we have a Postscript name here, */ /* either in Macintosh or Windows platform encodings */ @@ -253,42 +215,12 @@ } Exit: - face->postscript_name = result; + face->root.internal->postscript_name = result; return result; } - static const FT_Service_PsFontNameRec sfnt_service_ps_name = - { - (FT_PsName_GetFunc)sfnt_get_ps_name - }; - - /* - * TT CMAP INFO - * - */ - static const FT_Service_TTCMapsRec tt_service_get_cmap_info = - { - (TT_CMap_Info_GetFunc)tt_get_cmap_info - }; - - - /* - * SERVICE LIST - * - */ - - static const FT_ServiceDescRec sfnt_services[] = - { - { FT_SERVICE_ID_SFNT_TABLE, &sfnt_service_sfnt_table }, - { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &sfnt_service_ps_name }, -#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES - { FT_SERVICE_ID_GLYPH_DICT, &sfnt_service_glyph_dict }, -#endif - { FT_SERVICE_ID_TT_CMAP, &tt_service_get_cmap_info }, - - { NULL, NULL } - }; +#endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ FT_CALLBACK_DEF( FT_Module_Interface ) @@ -303,7 +235,15 @@ if ( ft_strcmp( module_interface, "load_sfnt" ) == 0 ) return (FT_Module_Interface)tt_face_load_any; - return ft_service_list_lookup( sfnt_services, module_interface ); +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + if ( ft_strcmp( module_interface, "glyph_name" ) == 0 ) + return (FT_Module_Interface)get_sfnt_glyph_name; +#endif + + if ( ft_strcmp( module_interface, "postscript_name" ) == 0 ) + return (FT_Module_Interface)get_sfnt_postscript_name; + + return 0; } @@ -372,6 +312,9 @@ #endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + /* see `ttcmap.h' */ + tt_face_load_charmap, + tt_face_free_charmap, }; diff --git a/reactos/lib/freetype/src/sfnt/sfnt.c b/reactos/lib/freetype/src/sfnt/sfnt.c index 90c1bee911e..6e0757aa856 100644 --- a/reactos/lib/freetype/src/sfnt/sfnt.c +++ b/reactos/lib/freetype/src/sfnt/sfnt.c @@ -4,7 +4,7 @@ /* */ /* Single object library component. */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -20,6 +20,7 @@ #include <ft2build.h> #include "ttload.c" +#include "ttcmap.c" #include "ttcmap0.c" #include "sfobjs.c" #include "sfdriver.c" diff --git a/reactos/lib/freetype/src/sfnt/sfobjs.c b/reactos/lib/freetype/src/sfnt/sfobjs.c index cb304fdc182..33a71ae3f9d 100644 --- a/reactos/lib/freetype/src/sfnt/sfobjs.c +++ b/reactos/lib/freetype/src/sfnt/sfobjs.c @@ -21,9 +21,10 @@ #include "ttload.h" #include "ttcmap0.h" #include FT_INTERNAL_SFNT_H +#include FT_INTERNAL_POSTSCRIPT_NAMES_H #include FT_TRUETYPE_IDS_H #include FT_TRUETYPE_TAGS_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H + #include "sferrors.h" @@ -364,7 +365,11 @@ face->goto_table = sfnt->goto_table; } - FT_FACE_FIND_GLOBAL_SERVICE( face, face->psnames, POSTSCRIPT_CMAPS ); + if ( !face->psnames ) + { + face->psnames = (PSNames_Service) + FT_Get_Module_Interface( library, "psnames" ); + } /* check that we have a valid TrueType file */ error = sfnt->load_sfnt_header( face, stream, face_index, &sfnt_header ); @@ -400,7 +405,7 @@ FT_Int num_params, FT_Parameter* params ) { - FT_Error error, psnames_error; + FT_Error error; FT_Bool has_outline; FT_Bool is_apple_sbit; @@ -462,7 +467,7 @@ /* the following tables are optional in PCL fonts -- */ /* don't check for errors */ (void)LOAD_( names ); - psnames_error = LOAD_( psnames ); + (void)LOAD_( psnames ); /* do not load the metrics headers and tables if this is an Apple */ /* sbit font file */ @@ -529,9 +534,9 @@ FT_FACE_FLAG_HORIZONTAL; /* horizontal data */ #ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES - if ( psnames_error == SFNT_Err_Ok && - face->postscript.FormatType != 0x00030000L ) - flags |= FT_FACE_FLAG_GLYPH_NAMES; + /* might need more polish to detect the presence of a Postscript */ + /* name table in the font */ + flags |= FT_FACE_FLAG_GLYPH_NAMES; #endif /* fixed width font? */ @@ -638,14 +643,14 @@ FT_Bitmap_Size* bsize = root->available_sizes + n; TT_SBit_Strike strike = face->sbit_strikes + n; FT_UShort fupem = face->header.Units_Per_EM; - FT_Short height = (FT_Short)( face->horizontal.Ascender - - face->horizontal.Descender + - face->horizontal.Line_Gap ); + FT_Short height = face->horizontal.Ascender - + face->horizontal.Descender + + face->horizontal.Line_Gap; FT_Short avg = face->os2.xAvgCharWidth; /* assume 72dpi */ - bsize->height = + bsize->height = (FT_Short)( ( height * strike->y_ppem + fupem/2 ) / fupem ); bsize->width = (FT_Short)( ( avg * strike->y_ppem + fupem/2 ) / fupem ); diff --git a/reactos/lib/freetype/src/sfnt/ttcmap0.c b/reactos/lib/freetype/src/sfnt/ttcmap0.c index dd1c76aaa7b..4c9dadfbb42 100644 --- a/reactos/lib/freetype/src/sfnt/ttcmap0.c +++ b/reactos/lib/freetype/src/sfnt/ttcmap0.c @@ -144,19 +144,6 @@ } - FT_CALLBACK_DEF( FT_Error ) - tt_cmap0_get_info( TT_CMap cmap, - TT_CMapInfo *cmap_info ) - { - FT_Byte* p = cmap->data + 4; - - - cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); - - return FT_Err_Ok; - } - - FT_CALLBACK_TABLE_DEF const TT_CMap_ClassRec tt_cmap0_class_rec = { @@ -169,8 +156,7 @@ (FT_CMap_CharNextFunc) tt_cmap0_char_next }, 0, - (TT_CMap_ValidateFunc) tt_cmap0_validate, - (TT_CMap_Info_GetFunc) tt_cmap0_get_info + (TT_CMap_ValidateFunc) tt_cmap0_validate }; #endif /* TT_CONFIG_CMAP_FORMAT_0 */ @@ -392,13 +378,10 @@ else { /* a 16-bit character code */ + p += char_hi * 2; /* jump to key entry */ + sub = subs + ( TT_PEEK_USHORT( p ) & -8 ); /* jump to sub-header */ - /* jump to key entry */ - p += char_hi * 2; - /* jump to sub-header */ - sub = subs + ( FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 8 ) ); - - /* check that the high byte isn't a valid one-byte value */ + /* check that the hi byte isn't a valid one-byte value */ if ( sub == subs ) goto Exit; } @@ -484,7 +467,7 @@ pos = (FT_UInt)( char_lo - start ); p += offset + pos * 2; - charcode = FT_PAD_FLOOR( charcode, 256 ) + char_lo; + charcode = ( charcode & -256 ) + char_lo; for ( ; pos < count; pos++, charcode++ ) { @@ -504,7 +487,7 @@ /* jump to next sub-header, i.e. higher byte value */ Next_SubHeader: - charcode = FT_PAD_FLOOR( charcode, 256 ) + 256; + charcode = ( charcode & -256 ) + 256; } Exit: @@ -514,19 +497,6 @@ } - FT_CALLBACK_DEF( FT_Error ) - tt_cmap2_get_info( TT_CMap cmap, - TT_CMapInfo *cmap_info ) - { - FT_Byte* p = cmap->data + 4; - - - cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); - - return FT_Err_Ok; - } - - FT_CALLBACK_TABLE_DEF const TT_CMap_ClassRec tt_cmap2_class_rec = { @@ -539,8 +509,7 @@ (FT_CMap_CharNextFunc) tt_cmap2_char_next }, 2, - (TT_CMap_ValidateFunc) tt_cmap2_validate, - (TT_CMap_Info_GetFunc) tt_cmap2_get_info + (TT_CMap_ValidateFunc) tt_cmap2_validate }; #endif /* TT_CONFIG_CMAP_FORMAT_2 */ @@ -798,7 +767,7 @@ p = table + 6; - num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 ); /* be paranoid! */ + num_segs2 = TT_PEEK_USHORT( p ) & -2; /* be paranoid! */ #if 1 /* Some fonts have more than 170 segments in their charmaps! */ @@ -921,7 +890,7 @@ code = (FT_UInt)char_code + 1; p = table + 6; - num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT(p), 2 ); /* ensure even-ness */ + num_segs2 = TT_PEEK_USHORT(p) & -2; /* ensure even-ness */ #if 1 @@ -1089,19 +1058,6 @@ } - FT_CALLBACK_DEF( FT_Error ) - tt_cmap4_get_info( TT_CMap cmap, - TT_CMapInfo *cmap_info ) - { - FT_Byte* p = cmap->data + 4; - - - cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); - - return FT_Err_Ok; - } - - FT_CALLBACK_TABLE_DEF const TT_CMap_ClassRec tt_cmap4_class_rec = { @@ -1114,8 +1070,7 @@ (FT_CMap_CharNextFunc) tt_cmap4_char_next }, 4, - (TT_CMap_ValidateFunc) tt_cmap4_validate, - (TT_CMap_Info_GetFunc) tt_cmap4_get_info + (TT_CMap_ValidateFunc) tt_cmap4_validate }; #endif /* TT_CONFIG_CMAP_FORMAT_4 */ @@ -1247,19 +1202,6 @@ } - FT_CALLBACK_DEF( FT_Error ) - tt_cmap6_get_info( TT_CMap cmap, - TT_CMapInfo *cmap_info ) - { - FT_Byte* p = cmap->data + 4; - - - cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); - - return FT_Err_Ok; - } - - FT_CALLBACK_TABLE_DEF const TT_CMap_ClassRec tt_cmap6_class_rec = { @@ -1272,8 +1214,7 @@ (FT_CMap_CharNextFunc) tt_cmap6_char_next }, 6, - (TT_CMap_ValidateFunc) tt_cmap6_validate, - (TT_CMap_Info_GetFunc) tt_cmap6_get_info + (TT_CMap_ValidateFunc) tt_cmap6_validate }; #endif /* TT_CONFIG_CMAP_FORMAT_6 */ @@ -1498,18 +1439,6 @@ } - FT_CALLBACK_DEF( FT_Error ) - tt_cmap8_get_info( TT_CMap cmap, - TT_CMapInfo *cmap_info ) - { - FT_Byte* p = cmap->data + 8; - - - cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); - return FT_Err_Ok; - } - - FT_CALLBACK_TABLE_DEF const TT_CMap_ClassRec tt_cmap8_class_rec = { @@ -1522,8 +1451,7 @@ (FT_CMap_CharNextFunc) tt_cmap8_char_next }, 8, - (TT_CMap_ValidateFunc) tt_cmap8_validate, - (TT_CMap_Info_GetFunc) tt_cmap8_get_info + (TT_CMap_ValidateFunc) tt_cmap8_validate }; #endif /* TT_CONFIG_CMAP_FORMAT_8 */ @@ -1643,19 +1571,6 @@ } - FT_CALLBACK_DEF( FT_Error ) - tt_cmap10_get_info( TT_CMap cmap, - TT_CMapInfo *cmap_info ) - { - FT_Byte* p = cmap->data + 8; - - - cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); - - return FT_Err_Ok; - } - - FT_CALLBACK_TABLE_DEF const TT_CMap_ClassRec tt_cmap10_class_rec = { @@ -1668,8 +1583,7 @@ (FT_CMap_CharNextFunc) tt_cmap10_char_next }, 10, - (TT_CMap_ValidateFunc) tt_cmap10_validate, - (TT_CMap_Info_GetFunc) tt_cmap10_get_info + (TT_CMap_ValidateFunc) tt_cmap10_validate }; #endif /* TT_CONFIG_CMAP_FORMAT_10 */ @@ -1827,19 +1741,6 @@ } - FT_CALLBACK_DEF( FT_Error ) - tt_cmap12_get_info( TT_CMap cmap, - TT_CMapInfo *cmap_info ) - { - FT_Byte* p = cmap->data + 8; - - - cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); - - return FT_Err_Ok; - } - - FT_CALLBACK_TABLE_DEF const TT_CMap_ClassRec tt_cmap12_class_rec = { @@ -1852,8 +1753,7 @@ (FT_CMap_CharNextFunc) tt_cmap12_char_next }, 12, - (TT_CMap_ValidateFunc) tt_cmap12_validate, - (TT_CMap_Info_GetFunc) tt_cmap12_get_info + (TT_CMap_ValidateFunc) tt_cmap12_validate }; @@ -1966,7 +1866,6 @@ FT_ERROR(( "tt_face_build_cmaps:" )); FT_ERROR(( " broken cmap sub-table ignored!\n" )); } - break; } } } @@ -1976,16 +1875,4 @@ } - FT_LOCAL( FT_Error ) - tt_get_cmap_info( FT_CharMap charmap, - TT_CMapInfo *cmap_info ) - { - FT_CMap cmap = (FT_CMap)charmap; - TT_CMap_Class clazz = (TT_CMap_Class)cmap->clazz; - - - return clazz->get_cmap_info( charmap, cmap_info ); - } - - /* END */ diff --git a/reactos/lib/freetype/src/sfnt/ttcmap0.h b/reactos/lib/freetype/src/sfnt/ttcmap0.h index 6ca9ca11002..ff1276e09b0 100644 --- a/reactos/lib/freetype/src/sfnt/ttcmap0.h +++ b/reactos/lib/freetype/src/sfnt/ttcmap0.h @@ -4,7 +4,7 @@ /* */ /* TrueType new character mapping table (cmap) support (specification). */ /* */ -/* Copyright 2002, 2003 by */ +/* Copyright 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -23,7 +23,7 @@ #include <ft2build.h> #include FT_INTERNAL_TRUETYPE_TYPES_H #include FT_INTERNAL_OBJECTS_H -#include FT_SERVICE_TT_CMAP_H + FT_BEGIN_HEADER @@ -46,7 +46,6 @@ FT_BEGIN_HEADER FT_CMap_ClassRec clazz; FT_UInt format; TT_CMap_ValidateFunc validate; - TT_CMap_Info_GetFunc get_cmap_info; } TT_CMap_ClassRec; @@ -66,11 +65,6 @@ FT_BEGIN_HEADER FT_LOCAL( FT_Error ) tt_face_build_cmaps( TT_Face face ); - /* used in tt-cmaps service */ - FT_LOCAL( FT_Error ) - tt_get_cmap_info( FT_CharMap charmap, - TT_CMapInfo *cmap_info ); - FT_END_HEADER diff --git a/reactos/lib/freetype/src/sfnt/ttload.c b/reactos/lib/freetype/src/sfnt/ttload.c index 27323f2594d..13b7e867790 100644 --- a/reactos/lib/freetype/src/sfnt/ttload.c +++ b/reactos/lib/freetype/src/sfnt/ttload.c @@ -22,6 +22,7 @@ #include FT_INTERNAL_STREAM_H #include FT_TRUETYPE_TAGS_H #include "ttload.h" +#include "ttcmap.h" #include "sferrors.h" diff --git a/reactos/lib/freetype/src/sfnt/ttpost.c b/reactos/lib/freetype/src/sfnt/ttpost.c index 3d526db4cfd..486ba3dd255 100644 --- a/reactos/lib/freetype/src/sfnt/ttpost.c +++ b/reactos/lib/freetype/src/sfnt/ttpost.c @@ -5,7 +5,7 @@ /* Postcript name table processing for TrueType and OpenType fonts */ /* (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -50,7 +50,7 @@ #ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES -#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_INTERNAL_POSTSCRIPT_NAMES_H #define MAC_NAME( x ) ( (FT_String*)psnames->macintosh_name( x ) ) @@ -441,7 +441,7 @@ FT_Fixed format; #ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES - FT_Service_PsCMaps psnames; + PSNames_Service psnames; #endif @@ -452,7 +452,7 @@ return SFNT_Err_Invalid_Glyph_Index; #ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES - psnames = (FT_Service_PsCMaps)face->psnames; + psnames = (PSNames_Service)face->psnames; if ( !psnames ) return SFNT_Err_Unimplemented_Feature; #endif @@ -510,7 +510,7 @@ *PSname = MAC_NAME( idx ); } } - + /* nothing to do for format == 0x00030000L */ End: diff --git a/reactos/lib/freetype/src/sfnt/ttsbit.c b/reactos/lib/freetype/src/sfnt/ttsbit.c index bb6f227a707..d4c16b15f51 100644 --- a/reactos/lib/freetype/src/sfnt/ttsbit.c +++ b/reactos/lib/freetype/src/sfnt/ttsbit.c @@ -4,7 +4,7 @@ /* */ /* TrueType and OpenType embedded bitmap support (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* Copyright 1996-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -622,22 +622,22 @@ FT_LOCAL_DEF( FT_Error ) tt_face_set_sbit_strike( TT_Face face, - FT_UInt x_ppem, - FT_UInt y_ppem, + FT_Int x_ppem, + FT_Int y_ppem, FT_ULong *astrike_index ) { FT_ULong i; - if ( x_ppem > 255 || + if ( x_ppem < 0 || x_ppem > 255 || y_ppem < 1 || y_ppem > 255 ) return SFNT_Err_Invalid_PPem; for ( i = 0; i < face->num_sbit_strikes; i++ ) { - if ( ( (FT_UInt)face->sbit_strikes[i].y_ppem == y_ppem ) && - ( ( x_ppem == 0 ) || - ( (FT_UInt)face->sbit_strikes[i].x_ppem == x_ppem ) ) ) + if ( ( face->sbit_strikes[i].y_ppem == y_ppem ) && + ( ( x_ppem == 0 ) || + ( face->sbit_strikes[i].x_ppem == x_ppem ) ) ) { *astrike_index = i; return SFNT_Err_Ok; diff --git a/reactos/lib/freetype/src/sfnt/ttsbit.h b/reactos/lib/freetype/src/sfnt/ttsbit.h index 89499bbb80a..edc858a60c4 100644 --- a/reactos/lib/freetype/src/sfnt/ttsbit.h +++ b/reactos/lib/freetype/src/sfnt/ttsbit.h @@ -4,7 +4,7 @@ /* */ /* TrueType and OpenType embedded bitmap support (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -37,8 +37,8 @@ FT_BEGIN_HEADER FT_LOCAL( FT_Error ) tt_face_set_sbit_strike( TT_Face face, - FT_UInt x_ppem, - FT_UInt y_ppem, + FT_Int x_ppem, + FT_Int y_ppem, FT_ULong *astrike_index ); FT_LOCAL( FT_Error ) diff --git a/reactos/lib/freetype/src/smooth/ftsmooth.c b/reactos/lib/freetype/src/smooth/ftsmooth.c index 40d5f504f20..cc84acd0490 100644 --- a/reactos/lib/freetype/src/smooth/ftsmooth.c +++ b/reactos/lib/freetype/src/smooth/ftsmooth.c @@ -132,10 +132,10 @@ /* compute the control box, and grid fit it */ FT_Outline_Get_CBox( outline, &cbox ); - cbox.xMin = FT_PIX_FLOOR( cbox.xMin ); - cbox.yMin = FT_PIX_FLOOR( cbox.yMin ); - cbox.xMax = FT_PIX_CEIL( cbox.xMax ); - cbox.yMax = FT_PIX_CEIL( cbox.yMax ); + cbox.xMin &= -64; + cbox.yMin &= -64; + cbox.xMax = ( cbox.xMax + 63 ) & -64; + cbox.yMax = ( cbox.yMax + 63 ) & -64; width = (FT_UInt)( ( cbox.xMax - cbox.xMin ) >> 6 ); height = (FT_UInt)( ( cbox.yMax - cbox.yMin ) >> 6 ); @@ -154,7 +154,7 @@ if ( hmul ) { width = width * hmul; - pitch = FT_PAD_CEIL( width, 4 ); + pitch = ( width + 3 ) & -4; } if ( vmul ) diff --git a/reactos/lib/freetype/src/tools/docmaker/.cvsignore b/reactos/lib/freetype/src/tools/docmaker/.cvsignore deleted file mode 100644 index 0d20b6487c6..00000000000 --- a/reactos/lib/freetype/src/tools/docmaker/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -*.pyc diff --git a/reactos/lib/freetype/src/tools/docmaker/content.py b/reactos/lib/freetype/src/tools/docmaker/content.py index ebfeb8bf487..6d33b5db27e 100644 --- a/reactos/lib/freetype/src/tools/docmaker/content.py +++ b/reactos/lib/freetype/src/tools/docmaker/content.py @@ -56,16 +56,8 @@ class DocCode: self.lines.append( l ) def dump( self, prefix = "", width=60 ): - lines = self.dump_lines( 0, width ) - for l in lines: - print prefix + l - - def dump_lines( self, margin=0, width=60 ): - result = [] for l in self.lines: - result.append( " "*margin + l ) - return result - + print prefix + l ############################################################################# @@ -84,14 +76,8 @@ class DocPara: self.words.extend( string.split( l ) ) def dump( self, prefix = "", width = 60 ): - lines = self.dump_lines( 0, width ) - for l in lines: - print prefix + l - - def dump_lines( self, margin=0, width = 60 ): - cur = "" # current line - col = 0 # current width - result = [] + cur = "" # current line + col = 0 # current width for word in self.words: ln = len(word) @@ -99,7 +85,7 @@ class DocPara: ln = ln+1 if col + ln > width: - result.append( " "*margin + cur ) + print prefix + cur cur = word col = len(word) else: @@ -109,11 +95,8 @@ class DocPara: col = col + ln if col > 0: - result.append( " "*margin + cur ) - - return result + print prefix + cur - ############################################################################# @@ -204,17 +187,6 @@ class DocField: p.dump( prefix ) first = 0 - def dump_lines( self, margin=0, width=60 ): - result = [] - nl = None - for p in self.items: - if nl: - result.append( "" ) - - result.extend( p.dump_lines( margin, width ) ) - nl = 1 - - return result # this regular expression is used to detect field definitions # @@ -261,16 +233,6 @@ class DocMarkup: except: return None - - def get_start( self ): - try: - result = "" - for word in self.fields[0].items[0].words: - result = result + " " + word - return result[1:] - - except: - return "ERROR" def dump( self, margin ): print " "*margin + "<" + self.tag + ">" @@ -582,4 +544,4 @@ class DocBlock: m = self.get_markup( tag_name ) return m.fields[0].items except: - return None + return None \ No newline at end of file diff --git a/reactos/lib/freetype/src/tools/docmaker/docbeauty.py b/reactos/lib/freetype/src/tools/docmaker/docbeauty.py deleted file mode 100644 index 94b266b6d10..00000000000 --- a/reactos/lib/freetype/src/tools/docmaker/docbeauty.py +++ /dev/null @@ -1,109 +0,0 @@ -#!/usr/bin/env python -# -# DocBeauty (c) 2003, 2004 David Turner <david@freetype.org> -# -# This program is used to beautify the documentation comments used -# in the FreeType 2 public headers. -# - -from sources import * -from content import * -from utils import * - -import utils - -import sys, os, time, string, getopt - -content_processor = ContentProcessor() - - -def beautify_block( block ): - if block.content: - content_processor.reset() - - markups = content_processor.process_content( block.content ) - text = [] - first = 1 - - for markup in markups: - text.extend( markup.beautify( first ) ) - first = 0 - - # now beautify the documentation "borders" themselves - lines = [ " /*************************************************************************" ] - for l in text: - lines.append( " *" + l ) - lines.append( " */" ) - - block.lines = lines - - -def usage(): - print "\nDocBeauty 0.1 Usage information\n" - print " docbeauty [options] file1 [ file2 ... ]\n" - print "using the following options:\n" - print " -h : print this page" - print " -b : backup original files with the 'orig' extension" - print "" - print " --backup : same as -b" - - -def main( argv ): - """main program loop""" - - global output_dir - - try: - opts, args = getopt.getopt( sys.argv[1:], - "hb", - [ "help", "backup" ] ) - - except getopt.GetoptError: - usage() - sys.exit( 2 ) - - if args == []: - usage() - sys.exit( 1 ) - - # process options - # - output_dir = None - do_backup = None - - for opt in opts: - if opt[0] in ( "-h", "--help" ): - usage() - sys.exit( 0 ) - - if opt[0] in ( "-b", "--backup" ): - do_backup = 1 - - # create context and processor - source_processor = SourceProcessor() - - # retrieve the list of files to process - file_list = make_file_list( args ) - for filename in file_list: - source_processor.parse_file( filename ) - for block in source_processor.blocks: - beautify_block( block ) - new_name = filename + ".new" - ok = None - try: - file = open( new_name, "wt" ) - for block in source_processor.blocks: - for line in block.lines: - file.write( line ) - file.write( "\n" ) - file.close() - except: - ok = 0 - -# if called from the command line -# -if __name__ == '__main__': - main( sys.argv ) - - -# eof diff --git a/reactos/lib/freetype/src/tools/docmaker/docmaker.py b/reactos/lib/freetype/src/tools/docmaker/docmaker.py index 9da4bbf8ea7..285bcd6a21b 100644 --- a/reactos/lib/freetype/src/tools/docmaker/docmaker.py +++ b/reactos/lib/freetype/src/tools/docmaker/docmaker.py @@ -1,16 +1,16 @@ #!/usr/bin/env python # -# DocMaker (c) 2002, 2004 David Turner <david@freetype.org> +# DocMaker 0.2 (c) 2002 David Turner <david@freetype.org> # # This program is a re-write of the original DocMaker took used # to generate the API Reference of the FreeType font engine -# by converting in-source comments into structured HTML. +# by converting in-source comments into structured HTML # # This new version is capable of outputting XML data, as well -# as accepts more liberal formatting options. +# as accepts more liberal formatting options # # It also uses regular expression matching and substitution -# to speed things significantly. +# to speed things significantly # from sources import * @@ -24,8 +24,50 @@ import utils import sys, os, time, string, glob, getopt +def file_exists( pathname ): + """checks that a given file exists""" + result = 1 + try: + file = open( pathname, "r" ) + file.close() + except: + result = None + sys.stderr.write( pathname + " couldn't be accessed\n" ) + + return result + + +def make_file_list( args = None ): + """builds a list of input files from command-line arguments""" + + file_list = [] + # sys.stderr.write( repr( sys.argv[1 :] ) + '\n' ) + + if not args: + args = sys.argv[1 :] + + for pathname in args: + if string.find( pathname, '*' ) >= 0: + newpath = glob.glob( pathname ) + newpath.sort() # sort files -- this is important because + # of the order of files + else: + newpath = [pathname] + + file_list.extend( newpath ) + + if len( file_list ) == 0: + file_list = None + else: + # now filter the file list to remove non-existing ones + file_list = filter( file_exists, file_list ) + + return file_list + + + def usage(): - print "\nDocMaker Usage information\n" + print "\nDocMaker 0.2 Usage information\n" print " docmaker [options] file1 [ file2 ... ]\n" print "using the following options:\n" print " -h : print this page" diff --git a/reactos/lib/freetype/src/tools/docmaker/formatter.py b/reactos/lib/freetype/src/tools/docmaker/formatter.py index 63ecddc973c..36d72aeca04 100644 --- a/reactos/lib/freetype/src/tools/docmaker/formatter.py +++ b/reactos/lib/freetype/src/tools/docmaker/formatter.py @@ -2,15 +2,6 @@ from sources import * from content import * from utils import * -# This is the base Formatter class. its purpose is to convert -# a content processor's data into specific documents (i.e. table of -# contents, global index, and individual API reference indices). -# -# You'll need to sub-class it to output anything sensible. For example, -# the file tohtml.py contains the definition of the HtmlFormatter sub-class -# used to output, you guessed it, HTML. -# - class Formatter: def __init__( self, processor ): diff --git a/reactos/lib/freetype/src/tools/docmaker/sources.py b/reactos/lib/freetype/src/tools/docmaker/sources.py index 4923005624c..c270e54118e 100644 --- a/reactos/lib/freetype/src/tools/docmaker/sources.py +++ b/reactos/lib/freetype/src/tools/docmaker/sources.py @@ -200,7 +200,7 @@ class SourceBlock: self.processor = processor self.filename = filename self.lineno = lineno - self.lines = lines[:] + self.lines = lines self.format = processor.format self.content = [] @@ -212,7 +212,7 @@ class SourceBlock: # extract comment lines lines = [] - for line0 in self.lines: + for line0 in self.lines[1:]: m = self.format.column.match( line0 ) if m: lines.append( m.group(1) ) @@ -304,7 +304,7 @@ class SourceProcessor: if self.format.end.match( line ): # that's a normal block end, add it to lines and # create a new block - self.lines.append( line ) + # self.lines.append( line ) self.add_block_lines() elif self.format.column.match( line ): diff --git a/reactos/lib/freetype/src/tools/docmaker/utils.py b/reactos/lib/freetype/src/tools/docmaker/utils.py index c3e9e2700f5..6d4653db527 100644 --- a/reactos/lib/freetype/src/tools/docmaker/utils.py +++ b/reactos/lib/freetype/src/tools/docmaker/utils.py @@ -1,4 +1,4 @@ -import string, sys, os, glob +import string, sys, os # current output directory # @@ -85,44 +85,3 @@ def check_output( ): sys.exit( 2 ) else: output_dir = None - -def file_exists( pathname ): - """checks that a given file exists""" - result = 1 - try: - file = open( pathname, "r" ) - file.close() - except: - result = None - sys.stderr.write( pathname + " couldn't be accessed\n" ) - - return result - - -def make_file_list( args = None ): - """builds a list of input files from command-line arguments""" - - file_list = [] - # sys.stderr.write( repr( sys.argv[1 :] ) + '\n' ) - - if not args: - args = sys.argv[1 :] - - for pathname in args: - if string.find( pathname, '*' ) >= 0: - newpath = glob.glob( pathname ) - newpath.sort() # sort files -- this is important because - # of the order of files - else: - newpath = [pathname] - - file_list.extend( newpath ) - - if len( file_list ) == 0: - file_list = None - else: - # now filter the file list to remove non-existing ones - file_list = filter( file_exists, file_list ) - - return file_list - diff --git a/reactos/lib/freetype/src/truetype/ttdriver.c b/reactos/lib/freetype/src/truetype/ttdriver.c index e23fc351573..193be06052f 100644 --- a/reactos/lib/freetype/src/truetype/ttdriver.c +++ b/reactos/lib/freetype/src/truetype/ttdriver.c @@ -21,7 +21,6 @@ #include FT_INTERNAL_STREAM_H #include FT_INTERNAL_SFNT_H #include FT_TRUETYPE_IDS_H -#include FT_SERVICE_XFREE86_NAME_H #include "ttdriver.h" #include "ttgload.h" @@ -208,8 +207,8 @@ /* we need to use rounding in the following computations. Otherwise, * the resulting hinted outlines will be very slightly distorted */ - dim_x = ( ( char_width * horz_resolution + (36+32*72) ) / 72 ) & ~63; - dim_y = ( ( char_height * vert_resolution + (36+32*72) ) / 72 ) & ~63; + dim_x = ( ( char_width * horz_resolution + (36+32*72) ) / 72 ) & -64; + dim_y = ( ( char_height * vert_resolution + (36+32*72) ) / 72 ) & -64; } else { @@ -345,27 +344,17 @@ /*************************************************************************/ /*************************************************************************/ - static const FT_ServiceDescRec tt_services[] = - { - { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_TRUETYPE }, - { NULL, NULL } - }; static FT_Module_Interface tt_get_interface( TT_Driver driver, const char* tt_interface ) { - FT_Module_Interface result; - FT_Module sfntd; - SFNT_Service sfnt; + FT_Module sfntd = FT_Get_Module( driver->root.root.library, + "sfnt" ); + SFNT_Service sfnt; - result = ft_service_list_lookup( tt_services, tt_interface ); - if ( result != NULL ) - return result; - /* only return the default interface from the SFNT module */ - sfntd = FT_Get_Module( driver->root.root.library, "sfnt" ); if ( sfntd ) { sfnt = (SFNT_Service)( sfntd->clazz->module_interface ); @@ -409,20 +398,20 @@ sizeof ( FT_GlyphSlotRec ), - (FT_Face_InitFunc) tt_face_init, - (FT_Face_DoneFunc) tt_face_done, - (FT_Size_InitFunc) tt_size_init, - (FT_Size_DoneFunc) tt_size_done, - (FT_Slot_InitFunc) 0, - (FT_Slot_DoneFunc) 0, + (FT_Face_InitFunc) tt_face_init, + (FT_Face_DoneFunc) tt_face_done, + (FT_Size_InitFunc) tt_size_init, + (FT_Size_DoneFunc) tt_size_done, + (FT_Slot_InitFunc) 0, + (FT_Slot_DoneFunc) 0, - (FT_Size_ResetPointsFunc)Set_Char_Sizes, - (FT_Size_ResetPixelsFunc)Set_Pixel_Sizes, - (FT_Slot_LoadFunc) Load_Glyph, + (FT_Size_ResetPointsFunc) Set_Char_Sizes, + (FT_Size_ResetPixelsFunc) Set_Pixel_Sizes, + (FT_Slot_LoadFunc) Load_Glyph, - (FT_Face_GetKerningFunc) Get_Kerning, - (FT_Face_AttachFunc) 0, - (FT_Face_GetAdvancesFunc)0 + (FT_Face_GetKerningFunc) Get_Kerning, + (FT_Face_AttachFunc) 0, + (FT_Face_GetAdvancesFunc) 0 }; diff --git a/reactos/lib/freetype/src/truetype/ttgload.c b/reactos/lib/freetype/src/truetype/ttgload.c index 3f5e6ee9fc7..a8b82eee834 100644 --- a/reactos/lib/freetype/src/truetype/ttgload.c +++ b/reactos/lib/freetype/src/truetype/ttgload.c @@ -4,7 +4,7 @@ /* */ /* TrueType Glyph Loader (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* Copyright 1996-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -163,10 +163,10 @@ #define cur_to_org( n, zone ) \ - FT_ARRAY_COPY( (zone)->org, (zone)->cur, (n) ) + FT_MEM_COPY( (zone)->org, (zone)->cur, (n) * sizeof ( FT_Vector ) ) #define org_to_cur( n, zone ) \ - FT_ARRAY_COPY( (zone)->cur, (zone)->org, (n) ) + FT_MEM_COPY( (zone)->cur, (zone)->org, (n) * sizeof ( FT_Vector ) ) /*************************************************************************/ @@ -690,12 +690,12 @@ FT_Pos x = zone->org[n_points-2].x; - x = FT_PIX_ROUND( x ) - x; + x = ( ( x + 32 ) & -64 ) - x; translate_array( n_points, zone->org, x, 0 ); org_to_cur( n_points, zone ); - zone->cur[n_points - 1].x = FT_PIX_ROUND( zone->cur[n_points - 1].x ); + zone->cur[n_points - 1].x = ( zone->cur[n_points - 1].x + 32 ) & -64; #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER @@ -1202,8 +1202,8 @@ if ( subglyph->flags & ROUND_XY_TO_GRID ) { - x = FT_PIX_ROUND( x ); - y = FT_PIX_ROUND( y ); + x = ( x + 32 ) & -64; + y = ( y + 32 ) & -64; } } } @@ -1296,8 +1296,8 @@ /* if hinting, round the phantom points */ if ( IS_HINTED( loader->load_flags ) ) { - pp1[0].x = FT_PIX_ROUND( loader->pp1.x ); - pp1[1].x = FT_PIX_ROUND( loader->pp2.x ); + pp1[0].x = ( ( loader->pp1.x + 32 ) & -64 ); + pp1[1].x = ( ( loader->pp2.x + 32 ) & -64 ); } { @@ -1390,10 +1390,10 @@ if ( IS_HINTED( loader->load_flags ) ) { /* grid-fit the bounding box */ - bbox.xMin = FT_PIX_FLOOR( bbox.xMin ); - bbox.yMin = FT_PIX_FLOOR( bbox.yMin ); - bbox.xMax = FT_PIX_CEIL( bbox.xMax ); - bbox.yMax = FT_PIX_CEIL( bbox.yMax ); + bbox.xMin &= -64; + bbox.yMin &= -64; + bbox.xMax = ( bbox.xMax + 63 ) & -64; + bbox.yMax = ( bbox.yMax + 63 ) & -64; } } else @@ -1425,7 +1425,7 @@ /* don't forget to hint the advance when we need to */ if ( IS_HINTED( loader->load_flags ) ) - glyph->metrics.horiAdvance = FT_PIX_ROUND( glyph->metrics.horiAdvance ); + glyph->metrics.horiAdvance = ( glyph->metrics.horiAdvance + 32 ) & -64; /* Now take care of vertical metrics. In the case where there is */ /* no vertical information within the font (relatively common), make */ @@ -1538,9 +1538,9 @@ /* grid-fit them if necessary */ if ( IS_HINTED( loader->load_flags ) ) { - left = FT_PIX_FLOOR( left ); - top = FT_PIX_CEIL( top ); - advance = FT_PIX_ROUND( advance ); + left &= -64; + top = ( top + 63 ) & -64; + advance = ( advance + 32 ) & -64; } glyph->metrics.vertBearingX = left; diff --git a/reactos/lib/freetype/src/truetype/ttinterp.c b/reactos/lib/freetype/src/truetype/ttinterp.c index 0186541296a..2dca6a21293 100644 --- a/reactos/lib/freetype/src/truetype/ttinterp.c +++ b/reactos/lib/freetype/src/truetype/ttinterp.c @@ -4,7 +4,7 @@ /* */ /* TrueType bytecode interpreter (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* Copyright 1996-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -30,10 +30,9 @@ #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER -#define TT_MULFIX FT_MulFix -#define TT_MULDIV FT_MulDiv -#define TT_MULDIV_NO_ROUND FT_MulDiv_No_Round - +#define TT_MULFIX FT_MulFix +#define TT_MULDIV FT_MulDiv +#define TT_INT64 FT_Int64 /*************************************************************************/ /* */ @@ -163,9 +162,6 @@ #define CUR_Func_move( z, p, d ) \ CUR.func_move( EXEC_ARG_ z, p, d ) -#define CUR_Func_move_orig( z, p, d ) \ - CUR.func_move_orig( EXEC_ARG_ z, p, d ) - #define CUR_Func_dualproj( x, y ) \ CUR.func_dualproj( EXEC_ARG_ x, y ) @@ -519,7 +515,8 @@ if ( *size < new_max ) { - if ( FT_REALLOC( *buff, *size, new_max * multiplier ) ) + FT_FREE( *buff ); + if ( FT_ALLOC( *buff, new_max * multiplier ) ) return error; *size = new_max; } @@ -1569,6 +1566,7 @@ if ( v != 0 ) { + zone->cur[point].x += TT_MULDIV( distance, v * 0x10000L, CUR.F_dot_P ); @@ -1580,6 +1578,7 @@ if ( v != 0 ) { + zone->cur[point].y += TT_MULDIV( distance, v * 0x10000L, CUR.F_dot_P ); @@ -1589,51 +1588,6 @@ } - /*************************************************************************/ - /* */ - /* <Function> */ - /* Direct_Move_Orig */ - /* */ - /* <Description> */ - /* Moves the *original* position of a point by a given distance along */ - /* the freedom vector. Obviously, the point will not be `touched'. */ - /* */ - /* <Input> */ - /* point :: The index of the point to move. */ - /* */ - /* distance :: The distance to apply. */ - /* */ - /* <InOut> */ - /* zone :: The affected glyph zone. */ - /* */ - static void - Direct_Move_Orig( EXEC_OP_ TT_GlyphZone zone, - FT_UShort point, - FT_F26Dot6 distance ) - { - FT_F26Dot6 v; - - -#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING - FT_ASSERT( !CUR.face->unpatented_hinting ); -#endif - - v = CUR.GS.freeVector.x; - - if ( v != 0 ) - zone->org[point].x += TT_MULDIV( distance, - v * 0x10000L, - CUR.F_dot_P ); - - v = CUR.GS.freeVector.y; - - if ( v != 0 ) - zone->org[point].y += TT_MULDIV( distance, - v * 0x10000L, - CUR.F_dot_P ); - } - - /*************************************************************************/ /* */ /* Special versions of Direct_Move() */ @@ -1668,38 +1622,6 @@ } - /*************************************************************************/ - /* */ - /* Special versions of Direct_Move_Orig() */ - /* */ - /* The following versions are used whenever both vectors are both */ - /* along one of the coordinate unit vectors, i.e. in 90% of the cases. */ - /* */ - /*************************************************************************/ - - - static void - Direct_Move_Orig_X( EXEC_OP_ TT_GlyphZone zone, - FT_UShort point, - FT_F26Dot6 distance ) - { - FT_UNUSED_EXEC; - - zone->org[point].x += distance; - } - - - static void - Direct_Move_Orig_Y( EXEC_OP_ TT_GlyphZone zone, - FT_UShort point, - FT_F26Dot6 distance ) - { - FT_UNUSED_EXEC; - - zone->org[point].y += distance; - } - - /*************************************************************************/ /* */ /* <Function> */ @@ -1734,7 +1656,7 @@ if ( distance >= 0 ) { val = distance + compensation; - if ( distance && val < 0 ) + if ( val < 0 ) val = 0; } else { @@ -1774,14 +1696,14 @@ if ( distance >= 0 ) { val = distance + compensation + 32; - if ( distance && val > 0 ) + if ( val > 0 ) val &= ~63; else val = 0; } else { - val = -FT_PIX_ROUND( compensation - distance ); + val = -( ( compensation - distance + 32 ) & -64 ); if ( val > 0 ) val = 0; } @@ -1817,13 +1739,13 @@ if ( distance >= 0 ) { - val = FT_PIX_FLOOR( distance + compensation ) + 32; - if ( distance && val < 0 ) + val = ( ( distance + compensation ) & -64 ) + 32; + if ( val < 0 ) val = 0; } else { - val = -( FT_PIX_FLOOR( compensation - distance ) + 32 ); + val = -( ( (compensation - distance) & -64 ) + 32 ); if ( val > 0 ) val = 0; } @@ -1860,7 +1782,7 @@ if ( distance >= 0 ) { val = distance + compensation; - if ( distance && val > 0 ) + if ( val > 0 ) val &= ~63; else val = 0; @@ -1904,14 +1826,14 @@ if ( distance >= 0 ) { val = distance + compensation + 63; - if ( distance && val > 0 ) + if ( val > 0 ) val &= ~63; else val = 0; } else { - val = - FT_PIX_CEIL( compensation - distance ); + val = -( ( compensation - distance + 63 ) & -64 ); if ( val > 0 ) val = 0; } @@ -1948,14 +1870,14 @@ if ( distance >= 0 ) { val = distance + compensation + 16; - if ( distance && val > 0 ) + if ( val > 0 ) val &= ~31; else val = 0; } else { - val = -FT_PAD_ROUND( compensation - distance, 32 ); + val = -( ( compensation - distance + 16 ) & -32 ); if ( val > 0 ) val = 0; } @@ -1997,7 +1919,7 @@ { val = ( distance - CUR.phase + CUR.threshold + compensation ) & -CUR.period; - if ( distance && val < 0 ) + if ( val < 0 ) val = 0; val += CUR.phase; } @@ -2045,7 +1967,7 @@ { val = ( ( distance - CUR.phase + CUR.threshold + compensation ) / CUR.period ) * CUR.period; - if ( distance && val < 0 ) + if ( val < 0 ) val = 0; val += CUR.phase; } @@ -2321,15 +2243,13 @@ if ( CUR.GS.both_x_axis ) { - CUR.func_project = Project_x; - CUR.func_move = Direct_Move_X; - CUR.func_move_orig = Direct_Move_Orig_X; + CUR.func_project = Project_x; + CUR.func_move = Direct_Move_X; } else { - CUR.func_project = Project_y; - CUR.func_move = Direct_Move_Y; - CUR.func_move_orig = Direct_Move_Orig_Y; + CUR.func_project = Project_y; + CUR.func_move = Direct_Move_Y; } if ( CUR.GS.dualVector.x == 0x4000 ) @@ -2380,23 +2300,16 @@ CUR.func_dualproj = (TT_Project_Func)Dual_Project; } - CUR.func_move = (TT_Move_Func)Direct_Move; - CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig; + CUR.func_move = (TT_Move_Func)Direct_Move; if ( CUR.F_dot_P == 0x40000000L ) { if ( CUR.GS.freeVector.x == 0x4000 ) - { - CUR.func_move = (TT_Move_Func)Direct_Move_X; - CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_X; - } + CUR.func_move = (TT_Move_Func)Direct_Move_X; else { if ( CUR.GS.freeVector.y == 0x4000 ) - { - CUR.func_move = (TT_Move_Func)Direct_Move_Y; - CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_Y; - } + CUR.func_move = (TT_Move_Func)Direct_Move_Y; } } @@ -2974,11 +2887,11 @@ args[0] -= args[1]; -#define DO_DIV \ - if ( args[1] == 0 ) \ - CUR.error = TT_Err_Divide_By_Zero; \ - else \ - args[0] = TT_MULDIV_NO_ROUND( args[0], 64L, args[1] ); +#define DO_DIV \ + if ( args[1] == 0 ) \ + CUR.error = TT_Err_Divide_By_Zero; \ + else \ + args[0] = TT_MULDIV( args[0], 64L, args[1] ); #define DO_MUL \ @@ -2994,11 +2907,11 @@ #define DO_FLOOR \ - args[0] = FT_PIX_FLOOR( args[0] ); + args[0] &= -64; #define DO_CEILING \ - args[0] = FT_PIX_CEIL( args[0] ); + args[0] = ( args[0] + 63 ) & -64; #define DO_RS \ @@ -4106,9 +4019,9 @@ K = CUR.stack[CUR.args - L]; - FT_ARRAY_MOVE( &CUR.stack[CUR.args - L ], - &CUR.stack[CUR.args - L + 1], - ( L - 1 ) ); + FT_MEM_MOVE( &CUR.stack[CUR.args - L ], + &CUR.stack[CUR.args - L + 1], + ( L - 1 ) * sizeof ( FT_Long ) ); CUR.stack[CUR.args - 1] = K; } @@ -5288,7 +5201,7 @@ { *x = 0; *y = d; - } + } } else #endif @@ -5446,11 +5359,11 @@ last_point = 0; } - /* XXX: UNDOCUMENTED! SHC does touch the points */ + /* XXX: UNDOCUMENTED! SHC doesn't touch the points */ for ( i = first_point; i <= last_point; i++ ) { if ( zp.cur != CUR.zp2.cur || refp != i ) - MOVE_Zp2_Point( i, dx, dy, TRUE ); + MOVE_Zp2_Point( i, dx, dy, FALSE ); } } @@ -5585,11 +5498,9 @@ } /* XXX: UNDOCUMENTED! behaviour */ - if ( CUR.GS.gep1 == 0 ) /* if the point that is to be moved */ - /* is in twilight zone */ + if ( CUR.GS.gep0 == 0 ) /* if in twilight zone */ { CUR.zp1.org[point] = CUR.zp0.org[CUR.GS.rp0]; - CUR_Func_move_orig( &CUR.zp1, point, args[1] ); CUR.zp1.cur[point] = CUR.zp1.org[point]; } diff --git a/reactos/lib/freetype/src/truetype/ttinterp.h b/reactos/lib/freetype/src/truetype/ttinterp.h index eb0bb0bb60e..e750963ff50 100644 --- a/reactos/lib/freetype/src/truetype/ttinterp.h +++ b/reactos/lib/freetype/src/truetype/ttinterp.h @@ -4,7 +4,7 @@ /* */ /* TrueType bytecode interpreter (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -210,7 +210,6 @@ FT_BEGIN_HEADER func_freeProj; /* current freedom proj. func */ TT_Move_Func func_move; /* current point move function */ - TT_Move_Func func_move_orig; /* move original position function */ TT_Get_CVT_Func func_read_cvt; /* read a cvt entry */ TT_Set_CVT_Func func_write_cvt; /* write a cvt entry (in pixels) */ diff --git a/reactos/lib/freetype/src/truetype/ttobjs.c b/reactos/lib/freetype/src/truetype/ttobjs.c index d5210f2cd07..e1e69cdf875 100644 --- a/reactos/lib/freetype/src/truetype/ttobjs.c +++ b/reactos/lib/freetype/src/truetype/ttobjs.c @@ -23,6 +23,7 @@ #include FT_TRUETYPE_IDS_H #include FT_TRUETYPE_TAGS_H #include FT_INTERNAL_SFNT_H +#include FT_INTERNAL_POSTSCRIPT_NAMES_H #include "ttgload.h" #include "ttpload.h" @@ -227,7 +228,7 @@ #ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING /* Determine whether unpatented hinting is to be used for this face. */ - face->unpatented_hinting = FT_BOOL + face->unpatented_hinting = ( library->debug_hooks[ FT_DEBUG_HOOK_UNPATENTED_HINTING ] != NULL ); { @@ -590,15 +591,14 @@ } /* Compute root ascender, descender, text height, and max_advance */ - metrics->ascender = - FT_PIX_ROUND( FT_MulFix( face->root.ascender, metrics->y_scale ) ); - metrics->descender = - FT_PIX_ROUND( FT_MulFix( face->root.descender, metrics->y_scale ) ); - metrics->height = - FT_PIX_ROUND( FT_MulFix( face->root.height, metrics->y_scale ) ); - metrics->max_advance = - FT_PIX_ROUND( FT_MulFix( face->root.max_advance_width, - metrics->x_scale ) ); + metrics->ascender = ( FT_MulFix( face->root.ascender, + metrics->y_scale ) + 32 ) & -64; + metrics->descender = ( FT_MulFix( face->root.descender, + metrics->y_scale ) + 32 ) & -64; + metrics->height = ( FT_MulFix( face->root.height, + metrics->y_scale ) + 32 ) & -64; + metrics->max_advance = ( FT_MulFix( face->root.max_advance_width, + metrics->x_scale ) + 32 ) & -64; #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS @@ -749,8 +749,7 @@ sbit_metrics->descender = strike->hori.descender << 6; /* XXX: Is this correct? */ - sbit_metrics->height = sbit_metrics->ascender - - sbit_metrics->descender; + sbit_metrics->height = sbit_metrics->ascender - sbit_metrics->descender; /* XXX: Is this correct? */ sbit_metrics->max_advance = ( strike->hori.min_origin_SB + diff --git a/reactos/lib/freetype/src/type1/t1driver.c b/reactos/lib/freetype/src/type1/t1driver.c index fd201db8e38..ebd6a65907e 100644 --- a/reactos/lib/freetype/src/type1/t1driver.c +++ b/reactos/lib/freetype/src/type1/t1driver.c @@ -4,7 +4,7 @@ /* */ /* Type 1 driver interface (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -29,13 +29,8 @@ #include FT_INTERNAL_DEBUG_H #include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_POSTSCRIPT_NAMES_H -#include FT_SERVICE_MULTIPLE_MASTERS_H -#include FT_SERVICE_GLYPH_DICT_H -#include FT_SERVICE_XFREE86_NAME_H -#include FT_SERVICE_POSTSCRIPT_NAME_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H -#include FT_SERVICE_POSTSCRIPT_INFO_H /*************************************************************************/ /* */ @@ -46,10 +41,6 @@ #undef FT_COMPONENT #define FT_COMPONENT trace_t1driver - /* - * GLYPH DICT SERVICE - * - */ static FT_Error t1_get_glyph_name( T1_Face face, @@ -78,6 +69,23 @@ } + /*************************************************************************/ + /* */ + /* <Function> */ + /* t1_get_name_index */ + /* */ + /* <Description> */ + /* Uses the Type 1 font's `glyph_names' table to find a given glyph */ + /* name's glyph index. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* glyph_name :: The glyph name. */ + /* */ + /* <Return> */ + /* Glyph index. 0 means `undefined character code'. */ + /* */ static FT_UInt t1_get_name_index( T1_Face face, FT_String* glyph_name ) @@ -97,17 +105,6 @@ return 0; } - static const FT_Service_GlyphDictRec t1_service_glyph_dict = - { - (FT_GlyphDict_GetNameFunc) t1_get_glyph_name, - (FT_GlyphDict_NameIndexFunc)t1_get_name_index - }; - - - /* - * POSTSCRIPT NAME SERVICE - * - */ static const char* t1_get_ps_name( T1_Face face ) @@ -115,82 +112,61 @@ return (const char*) face->type1.font_name; } - static const FT_Service_PsFontNameRec t1_service_ps_name = - { - (FT_PsName_GetFunc)t1_get_ps_name - }; - - - /* - * MULTIPLE MASTERS SERVICE - * - */ - -#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT - static const FT_Service_MultiMastersRec t1_service_multi_masters = - { - (FT_Get_MM_Func) T1_Get_Multi_Master, - (FT_Set_MM_Design_Func)T1_Set_MM_Design, - (FT_Set_MM_Blend_Func) T1_Set_MM_Blend - }; -#endif - - - /* - * POSTSCRIPT INFO SERVICE - * - */ - - static FT_Error - t1_ps_get_font_info( FT_Face face, - PS_FontInfoRec* afont_info ) - { - *afont_info = ((T1_Face)face)->type1.font_info; - return 0; - } - - - static FT_Int - t1_ps_has_glyph_names( FT_Face face ) - { - FT_UNUSED( face ); - return 1; - } - - - static const FT_Service_PsInfoRec t1_service_ps_info = - { - (PS_GetFontInfoFunc) t1_ps_get_font_info, - (PS_HasGlyphNamesFunc)t1_ps_has_glyph_names - }; - - - /* - * SERVICE LIST - * - */ - - static const FT_ServiceDescRec t1_services[] = - { - { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &t1_service_ps_name }, - { FT_SERVICE_ID_GLYPH_DICT, &t1_service_glyph_dict }, - { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_TYPE_1 }, - { FT_SERVICE_ID_POSTSCRIPT_INFO, &t1_service_ps_info }, - -#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT - { FT_SERVICE_ID_MULTI_MASTERS, &t1_service_multi_masters }, -#endif - { NULL, NULL } - }; - + /*************************************************************************/ + /* */ + /* <Function> */ + /* Get_Interface */ + /* */ + /* <Description> */ + /* Each driver can provide one or more extensions to the base */ + /* FreeType API. These can be used to access format specific */ + /* features (e.g., all TrueType/OpenType resources share a common */ + /* file structure and common tables which can be accessed through the */ + /* `sfnt' interface), or more simply generic ones (e.g., the */ + /* `postscript names' interface which can be used to retrieve the */ + /* PostScript name of a given glyph index). */ + /* */ + /* <InOut> */ + /* driver :: A handle to a driver object. */ + /* */ + /* <Input> */ + /* t1_interface :: A string designing the interface. Examples are */ + /* `sfnt', `post_names', `charmaps', etc. */ + /* */ + /* <Return> */ + /* A typeless pointer to the extension's interface (normally a table */ + /* of function pointers). Returns NULL if the requested extension */ + /* isn't available (i.e., wasn't compiled in the driver at build */ + /* time). */ + /* */ static FT_Module_Interface Get_Interface( FT_Driver driver, const FT_String* t1_interface ) { FT_UNUSED( driver ); + FT_UNUSED( t1_interface ); - return ft_service_list_lookup( t1_services, t1_interface ); + if ( ft_strcmp( (const char*)t1_interface, "glyph_name" ) == 0 ) + return (FT_Module_Interface)t1_get_glyph_name; + + if ( ft_strcmp( (const char*)t1_interface, "name_index" ) == 0 ) + return (FT_Module_Interface)t1_get_name_index; + + if ( ft_strcmp( (const char*)t1_interface, "postscript_name" ) == 0 ) + return (FT_Module_Interface)t1_get_ps_name; + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + if ( ft_strcmp( (const char*)t1_interface, "get_mm" ) == 0 ) + return (FT_Module_Interface)T1_Get_Multi_Master; + + if ( ft_strcmp( (const char*)t1_interface, "set_mm_design") == 0 ) + return (FT_Module_Interface)T1_Set_MM_Design; + + if ( ft_strcmp( (const char*)t1_interface, "set_mm_blend") == 0 ) + return (FT_Module_Interface)T1_Set_MM_Blend; +#endif + return 0; } diff --git a/reactos/lib/freetype/src/type1/t1gload.c b/reactos/lib/freetype/src/type1/t1gload.c index c8d1db79f45..b4573d60f71 100644 --- a/reactos/lib/freetype/src/type1/t1gload.c +++ b/reactos/lib/freetype/src/type1/t1gload.c @@ -81,7 +81,7 @@ /* For ordinary fonts get the character data stored in the face record. */ { char_string->pointer = type1->charstrings[glyph_index]; - char_string->length = (FT_Int)type1->charstrings_len[glyph_index]; + char_string->length = type1->charstrings_len[glyph_index]; } if ( !error ) @@ -97,7 +97,6 @@ { FT_Incremental_MetricsRec metrics; - metrics.bearing_x = decoder->builder.left_bearing.x; metrics.bearing_y = decoder->builder.left_bearing.y; metrics.advance = decoder->builder.advance.x; @@ -112,7 +111,7 @@ #endif /* FT_CONFIG_OPTION_INCREMENTAL */ - return error; + return error; } @@ -121,12 +120,11 @@ FT_UInt glyph_index ) { FT_Data glyph_data; - FT_Error error = T1_Parse_Glyph_And_Get_Char_String( + FT_Error error = T1_Parse_Glyph_And_Get_Char_String( decoder, glyph_index, &glyph_data ); #ifdef FT_CONFIG_OPTION_INCREMENTAL - if ( !error ) { T1_Face face = (T1_Face)decoder->builder.face; @@ -137,7 +135,6 @@ face->root.internal->incremental_interface->object, &glyph_data ); } - #endif /* FT_CONFIG_OPTION_INCREMENTAL */ return error; @@ -187,7 +184,7 @@ error = T1_Parse_Glyph( &decoder, glyph_index ); if ( glyph_index == 0 || decoder.builder.advance.x > *max_advance ) *max_advance = decoder.builder.advance.x; - + /* ignore the error if one occurred - skip to next glyph */ } @@ -374,11 +371,11 @@ if ( hinting ) { - metrics->horiAdvance = FT_PIX_ROUND( metrics->horiAdvance ); - metrics->vertAdvance = FT_PIX_ROUND( metrics->vertAdvance ); + metrics->horiAdvance = ( metrics->horiAdvance + 32 ) & -64; + metrics->vertAdvance = ( metrics->vertAdvance + 32 ) & -64; - metrics->vertBearingX = FT_PIX_ROUND( metrics->vertBearingX ); - metrics->vertBearingY = FT_PIX_ROUND( metrics->vertBearingY ); + metrics->vertBearingX = ( metrics->vertBearingX + 32 ) & -64; + metrics->vertBearingY = ( metrics->vertBearingY + 32 ) & -64; } } @@ -388,10 +385,10 @@ /* grid fit the bounding box if necessary */ if ( hinting ) { - cbox.xMin = FT_PIX_FLOOR( cbox.xMin ); - cbox.yMin = FT_PIX_FLOOR( cbox.yMin ); - cbox.xMax = FT_PIX_CEIL( cbox.xMax ); - cbox.yMax = FT_PIX_CEIL( cbox.yMax ); + cbox.xMin &= -64; + cbox.yMin &= -64; + cbox.xMax = ( cbox.xMax+63 ) & -64; + cbox.yMax = ( cbox.yMax+63 ) & -64; } metrics->width = cbox.xMax - cbox.xMin; diff --git a/reactos/lib/freetype/src/type1/t1load.c b/reactos/lib/freetype/src/type1/t1load.c index f830484e1be..6bc7b928583 100644 --- a/reactos/lib/freetype/src/type1/t1load.c +++ b/reactos/lib/freetype/src/type1/t1load.c @@ -4,7 +4,7 @@ /* */ /* Type 1 font loader (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* Copyright 1996-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -41,10 +41,11 @@ /* */ /* All other common cases are handled very simply. The matching rules */ /* are defined in the file `t1tokens.h' through the use of several */ - /* macros calls PARSE_XXX. This file is included twice here; the first */ - /* time to generate parsing callback functions, the second time to */ - /* generate a table of keywords (with pointers to the associated */ - /* callback functions). */ + /* macros calls PARSE_XXX. */ + /* */ + /* This file is included twice here; the first time to generate parsing */ + /* callback functions, the second to generate a table of keywords (with */ + /* pointers to the associated callback). */ /* */ /* The function `parse_dict' simply scans *linearly* a given dictionary */ /* (either the top-level or private one) and calls the appropriate */ @@ -70,6 +71,7 @@ #include "t1errors.h" + /*************************************************************************/ /* */ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ @@ -98,7 +100,7 @@ { PS_Blend blend; FT_Memory memory = face->root.memory; - FT_Error error = T1_Err_Ok; + FT_Error error = 0; blend = face->blend; @@ -172,7 +174,7 @@ return error; Fail: - error = T1_Err_Invalid_File_Format; + error = -1; goto Exit; } @@ -203,10 +205,8 @@ axis->minimum = map->design_points[0]; axis->maximum = map->design_points[map->num_points - 1]; } - - error = T1_Err_Ok; + error = 0; } - return error; } @@ -253,7 +253,6 @@ error = T1_Err_Ok; } - return error; } @@ -290,7 +289,7 @@ FT_Fixed p_design = designs[p]; - /* exact match? */ + /* exact match ? */ if ( design == p_design ) { the_blend = blends[p]; @@ -306,7 +305,7 @@ before = p; } - /* now interpolate if necessary */ + /* now, interpolate if needed */ if ( before < 0 ) the_blend = blends[0]; @@ -387,9 +386,9 @@ parse_blend_axis_types( T1_Face face, T1_Loader loader ) { - T1_TokenRec axis_tokens[T1_MAX_MM_AXIS]; + T1_TokenRec axis_tokens[ T1_MAX_MM_AXIS ]; FT_Int n, num_axis; - FT_Error error = T1_Err_Ok; + FT_Error error = 0; PS_Blend blend; FT_Memory memory; @@ -449,16 +448,16 @@ parse_blend_design_positions( T1_Face face, T1_Loader loader ) { - T1_TokenRec design_tokens[T1_MAX_MM_DESIGNS]; + T1_TokenRec design_tokens[ T1_MAX_MM_DESIGNS ]; FT_Int num_designs; FT_Int num_axis; T1_Parser parser = &loader->parser; - FT_Error error = T1_Err_Ok; + FT_Error error = 0; PS_Blend blend; - /* get the array of design tokens -- compute number of designs */ + /* get the array of design tokens - compute number of designs */ T1_ToTokenArray( parser, design_tokens, T1_MAX_MM_DESIGNS, &num_designs ); if ( num_designs <= 0 || num_designs > T1_MAX_MM_DESIGNS ) { @@ -480,15 +479,15 @@ for ( n = 0; n < (FT_UInt)num_designs; n++ ) { - T1_TokenRec axis_tokens[T1_MAX_MM_DESIGNS]; + T1_TokenRec axis_tokens[ T1_MAX_MM_DESIGNS ]; T1_Token token; FT_Int axis, n_axis; /* read axis/coordinates tokens */ token = design_tokens + n; - parser->root.cursor = token->start; - parser->root.limit = token->limit; + parser->root.cursor = token->start - 1; + parser->root.limit = token->limit + 1; T1_ToTokenArray( parser, axis_tokens, T1_MAX_MM_AXIS, &n_axis ); if ( n == 0 ) @@ -506,7 +505,7 @@ goto Exit; } - /* now read each axis token into the design position */ + /* now, read each axis token into the design position */ for ( axis = 0; axis < n_axis; axis++ ) { T1_Token token2 = axis_tokens + axis; @@ -531,7 +530,7 @@ parse_blend_design_map( T1_Face face, T1_Loader loader ) { - FT_Error error = T1_Err_Ok; + FT_Error error = 0; T1_Parser parser = &loader->parser; PS_Blend blend; T1_TokenRec axis_tokens[T1_MAX_MM_AXIS]; @@ -549,7 +548,6 @@ error = T1_Err_Invalid_File_Format; goto Exit; } - old_cursor = parser->root.cursor; old_limit = parser->root.limit; @@ -558,22 +556,29 @@ goto Exit; blend = face->blend; - /* now read each axis design map */ + /* now, read each axis design map */ for ( n = 0; n < num_axis; n++ ) { PS_DesignMap map = blend->design_map + n; - T1_Token axis_token; - T1_TokenRec point_tokens[T1_MAX_MM_MAP_POINTS]; + T1_Token token; FT_Int p, num_points; - axis_token = axis_tokens + n; + token = axis_tokens + n; + parser->root.cursor = token->start; + parser->root.limit = token->limit; - parser->root.cursor = axis_token->start; - parser->root.limit = axis_token->limit; - T1_ToTokenArray( parser, point_tokens, - T1_MAX_MM_MAP_POINTS, &num_points ); + /* count the number of map points */ + { + FT_Byte* ptr = token->start; + FT_Byte* limit = token->limit; + + num_points = 0; + for ( ; ptr < limit; ptr++ ) + if ( ptr[0] == '[' ) + num_points++; + } if ( num_points <= 0 || num_points > T1_MAX_MM_MAP_POINTS ) { FT_ERROR(( "parse_blend_design_map: incorrect table\n" )); @@ -589,15 +594,6 @@ for ( p = 0; p < num_points; p++ ) { - T1_Token point_token; - - - point_token = point_tokens + p; - - /* don't include delimiting brackets */ - parser->root.cursor = point_token->start + 1; - parser->root.limit = point_token->limit - 1; - map->design_points[p] = T1_ToInt( parser ); map->blend_points [p] = T1_ToFixed( parser, 0 ); } @@ -615,7 +611,7 @@ parse_weight_vector( T1_Face face, T1_Loader loader ) { - FT_Error error = T1_Err_Ok; + FT_Error error = 0; T1_Parser parser = &loader->parser; PS_Blend blend = face->blend; T1_TokenRec master; @@ -642,9 +638,8 @@ old_cursor = parser->root.cursor; old_limit = parser->root.limit; - /* don't include the delimiting brackets */ - parser->root.cursor = master.start + 1; - parser->root.limit = master.limit - 1; + parser->root.cursor = master.start; + parser->root.limit = master.limit; for ( n = 0; n < blend->num_designs; n++ ) { @@ -680,8 +675,6 @@ #endif /* T1_CONFIG_OPTION_NO_MM_SUPPORT */ - - /*************************************************************************/ /*************************************************************************/ /***** *****/ @@ -690,6 +683,15 @@ /*************************************************************************/ /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* First of all, define the token field static variables. This is a set */ + /* of T1_FieldRec variables used later. */ + /* */ + /*************************************************************************/ + + static FT_Error t1_load_keyword( T1_Face face, T1_Loader loader, @@ -772,12 +774,32 @@ static int is_space( FT_Byte c ) { - return ( c == ' ' || c == '\t' || - c == '\r' || c == '\n' || c == '\f' || - c == '\0' ); + return ( c == ' ' || c == '\t' || c == '\r' || c == '\n' ); } + static int + is_name_char( FT_Byte c ) + { + /* Note: PostScript allows any non-delimiting, non-whitespace */ + /* in a name (PS Ref Manual, 3rd Ed, p31) */ + /* PostScript delimiters include (,),<,>,[,],{,},/ and % */ + + return ( c != '(' && + c != ')' && + c != '<' && + c != '>' && + c != '[' && + c != ']' && + c != '{' && + c != '}' && + c != '/' && + c != '%' && + ! is_space( c ) + ); + } + + static int read_binary_data( T1_Parser parser, FT_Long* size, @@ -787,21 +809,20 @@ FT_Byte* limit = parser->root.limit; - /* the binary data has one of the following formats */ - /* */ - /* `size' [white*] RD white ....... ND */ - /* `size' [white*] -| white ....... |- */ - /* */ + /* the binary data has the following format */ + /* */ + /* `size' [white*] RD white ....... ND */ + /* */ T1_Skip_Spaces( parser ); - cur = parser->root.cursor; - if ( cur < limit && ft_isdigit( *cur ) ) + if ( cur < limit && (FT_Byte)( *cur - '0' ) < 10 ) { *size = T1_ToInt( parser ); - T1_Skip_PS_Token( parser ); /* `RD' or `-|' or something else */ + T1_Skip_Spaces( parser ); + T1_Skip_Alpha ( parser ); /* `RD' or `-|' or something else */ /* there is only one whitespace char after the */ /* `RD' or `-|' token */ @@ -817,8 +838,9 @@ } - /* We now define the routines to handle the `/Encoding', `/Subrs', */ - /* and `/CharStrings' dictionaries. */ + /* we will now define the routines used to handle */ + /* the `/Encoding', `/Subrs', and `/CharStrings' */ + /* dictionaries */ static void parse_font_matrix( T1_Face face, @@ -832,6 +854,10 @@ FT_Fixed temp_scale; + if ( matrix->xx || matrix->yx ) + /* with synthetic fonts, it's possible we get here twice */ + return; + (void)T1_ToFixedArray( parser, 6, temp, 3 ); temp_scale = ABS( temp[3] ); @@ -860,8 +886,8 @@ matrix->yy = temp[3]; /* note that the offsets must be expressed in integer font units */ - offset->x = temp[4] >> 16; - offset->y = temp[5] >> 16; + offset->x = temp[4] >> 16; + offset->y = temp[5] >> 16; } @@ -869,52 +895,49 @@ parse_encoding( T1_Face face, T1_Loader loader ) { - T1_Parser parser = &loader->parser; - FT_Byte* cur; - FT_Byte* limit = parser->root.limit; + T1_Parser parser = &loader->parser; + FT_Byte* cur = parser->root.cursor; + FT_Byte* limit = parser->root.limit; - PSAux_Service psaux = (PSAux_Service)face->psaux; + PSAux_Service psaux = (PSAux_Service)face->psaux; - T1_Skip_Spaces( parser ); - cur = parser->root.cursor; - if ( cur >= limit ) + /* skip whitespace */ + while ( is_space( *cur ) ) { - FT_ERROR(( "parse_encoding: out of bounds!\n" )); - parser->root.error = T1_Err_Invalid_File_Format; - return; + cur++; + if ( cur >= limit ) + { + FT_ERROR(( "parse_encoding: out of bounds!\n" )); + parser->root.error = T1_Err_Invalid_File_Format; + return; + } } - /* if we have a number or `[', the encoding is an array, */ - /* and we must load it now */ - if ( ft_isdigit( *cur ) || *cur == '[' ) + /* if we have a number, then the encoding is an array, */ + /* and we must load it now */ + if ( (FT_Byte)( *cur - '0' ) < 10 ) { - T1_Encoding encode = &face->type1.encoding; + T1_Encoding encode = &face->type1.encoding; FT_Int count, n; - PS_Table char_table = &loader->encoding_table; - FT_Memory memory = parser->root.memory; + PS_Table char_table = &loader->encoding_table; + FT_Memory memory = parser->root.memory; FT_Error error; - FT_Bool only_immediates = 0; - /* read the number of entries in the encoding; should be 256 */ - if ( *cur == '[' ) - { - count = 256; - only_immediates = 1; - parser->root.cursor++; - } - else - count = (FT_Int)T1_ToInt( parser ); + if ( encode->char_index ) + /* with synthetic fonts, it's possible we get here twice */ + return; - T1_Skip_Spaces( parser ); - if ( parser->root.cursor >= limit ) + /* read the number of entries in the encoding, should be 256 */ + count = (FT_Int)T1_ToInt( parser ); + if ( parser->root.error ) return; /* we use a T1_Table to store our charnames */ loader->num_chars = encode->num_chars = count; - if ( FT_NEW_ARRAY( encode->char_index, count ) || - FT_NEW_ARRAY( encode->char_name, count ) || + if ( FT_NEW_ARRAY( encode->char_index, count ) || + FT_NEW_ARRAY( encode->char_name, count ) || FT_SET_ERROR( psaux->ps_table_funcs->init( char_table, count, memory ) ) ) { @@ -931,11 +954,8 @@ T1_Add_Table( char_table, n, notdef, 8 ); } - /* Now we need to read records of the form */ - /* */ - /* ... charcode /charname ... */ - /* */ - /* for each entry in our table. */ + /* Now, we will need to read a record of the form */ + /* ... charcode /charname ... for each entry in our table */ /* */ /* We simply look for a number followed by an immediate */ /* name. Note that this ignores correctly the sequence */ @@ -945,85 +965,75 @@ /* */ /* used to clean the encoding array before anything else. */ /* */ - /* Alternatively, if the array is directly given as */ - /* */ - /* /Encoding [ ... ] */ - /* */ - /* we only read immediates. */ + /* We stop when we encounter a `def'. */ - n = 0; - T1_Skip_Spaces( parser ); + cur = parser->root.cursor; + limit = parser->root.limit; + n = 0; - while ( parser->root.cursor < limit ) + for ( ; cur < limit; ) { - cur = parser->root.cursor; + FT_Byte c; - /* we stop when we encounter a `def' or `]' */ - if ( *cur == 'd' && cur + 3 < limit ) + + c = *cur; + + /* we stop when we encounter a `def' */ + if ( c == 'd' && cur + 3 < limit ) { - if ( cur[1] == 'e' && - cur[2] == 'f' && - is_space( cur[3] ) ) + if ( cur[1] == 'e' && + cur[2] == 'f' && + is_space( cur[-1] ) && + is_space( cur[3] ) ) { FT_TRACE6(( "encoding end\n" )); - cur += 3; break; } } - if ( *cur == ']' ) - { - FT_TRACE6(( "encoding end\n" )); - cur++; - break; - } - /* check whether we've found an entry */ - if ( ft_isdigit( *cur ) || only_immediates ) + /* otherwise, we must find a number before anything else */ + if ( (FT_Byte)( c - '0' ) < 10 ) { FT_Int charcode; - if ( only_immediates ) - charcode = n; - else - { - charcode = (FT_Int)T1_ToInt( parser ); - T1_Skip_Spaces( parser ); - } + parser->root.cursor = cur; + charcode = (FT_Int)T1_ToInt( parser ); + cur = parser->root.cursor; - cur = parser->root.cursor; + /* skip whitespace */ + while ( cur < limit && is_space( *cur ) ) + cur++; - if ( *cur == '/' && cur + 2 < limit && n < count ) + if ( cur < limit && *cur == '/' ) { + /* bingo, we have an immediate name -- it must be a */ + /* character name */ + FT_Byte* cur2 = cur + 1; FT_PtrDist len; - cur++; + while ( cur2 < limit && is_name_char( *cur2 ) ) + cur2++; - parser->root.cursor = cur; - T1_Skip_PS_Token( parser ); - - len = parser->root.cursor - cur; + len = cur2 - cur - 1; parser->root.error = T1_Add_Table( char_table, charcode, - cur, len + 1 ); + cur + 1, len + 1 ); char_table->elements[charcode][len] = '\0'; if ( parser->root.error ) return; - n++; + cur = cur2; } } else - T1_Skip_PS_Token( parser ); - - T1_Skip_Spaces( parser ); + cur++; } face->type1.encoding_type = T1_ENCODING_TYPE_ARRAY; parser->root.cursor = cur; } - /* Otherwise, we should have either `StandardEncoding', */ /* `ExpertEncoding', or `ISOLatin1Encoding' */ else @@ -1053,49 +1063,46 @@ parse_subrs( T1_Face face, T1_Loader loader ) { - T1_Parser parser = &loader->parser; - PS_Table table = &loader->subrs; - FT_Memory memory = parser->root.memory; - FT_Error error; - FT_Int n, num_subrs; + T1_Parser parser = &loader->parser; + PS_Table table = &loader->subrs; + FT_Memory memory = parser->root.memory; + FT_Error error; + FT_Int n; PSAux_Service psaux = (PSAux_Service)face->psaux; - T1_Skip_Spaces( parser ); + if ( loader->num_subrs ) + /* with synthetic fonts, it's possible we get here twice */ + return; - /* test for empty array */ - if ( parser->root.cursor < parser->root.limit && - *parser->root.cursor == '[' ) + if ( parser->root.cursor + 2 > parser->root.limit && + parser->root.cursor[0] == '[' && + parser->root.cursor[1] == ']' ) { - T1_Skip_PS_Token( parser ); - T1_Skip_Spaces ( parser ); - if ( parser->root.cursor >= parser->root.limit || - *parser->root.cursor != ']' ) - parser->root.error = T1_Err_Invalid_File_Format; + /* empty array */ return; } - num_subrs = (FT_Int)T1_ToInt( parser ); + loader->num_subrs = (FT_Int)T1_ToInt( parser ); + if ( parser->root.error ) + return; /* position the parser right before the `dup' of the first subr */ - T1_Skip_PS_Token( parser ); /* `array' */ - T1_Skip_Spaces ( parser ); + T1_Skip_Spaces( parser ); + T1_Skip_Alpha( parser ); /* `array' */ + T1_Skip_Spaces( parser ); - /* initialize subrs array -- with synthetic fonts it is possible */ - /* we get here twice */ - if ( !loader->num_subrs ) - { - error = psaux->ps_table_funcs->init( table, num_subrs, memory ); - if ( error ) - goto Fail; - } + /* initialize subrs array */ + error = psaux->ps_table_funcs->init( table, loader->num_subrs, memory ); + if ( error ) + goto Fail; /* the format is simple: */ /* */ /* `index' + binary data */ /* */ - for ( n = 0; n < num_subrs; n++ ) + for ( n = 0; n < loader->num_subrs; n++ ) { FT_Long idx, size; FT_Byte* base; @@ -1106,8 +1113,6 @@ if ( ft_strncmp( (char*)parser->root.cursor, "dup", 3 ) != 0 ) break; - T1_Skip_PS_Token( parser ); /* `dup' */ - idx = T1_ToInt( parser ); if ( !read_binary_data( parser, &size, &base ) ) @@ -1117,19 +1122,16 @@ /* (bound to `noaccess put') or by two separate tokens: */ /* `noaccess' & `put'. We position the parser right */ /* before the next `dup', if any. */ - T1_Skip_PS_Token( parser ); /* `NP' or `|' or `noaccess' */ - T1_Skip_Spaces ( parser ); + T1_Skip_Spaces( parser ); + T1_Skip_Alpha( parser ); /* `NP' or `I' or `noaccess' */ + T1_Skip_Spaces( parser ); if ( ft_strncmp( (char*)parser->root.cursor, "put", 3 ) == 0 ) { - T1_Skip_PS_Token( parser ); /* skip `put' */ - T1_Skip_Spaces ( parser ); + T1_Skip_Alpha( parser ); /* skip `put' */ + T1_Skip_Spaces( parser ); } - /* with synthetic fonts it is possible we get here twice */ - if ( loader->num_subrs ) - continue; - /* some fonts use a value of -1 for lenIV to indicate that */ /* the charstrings are unencoded */ /* */ @@ -1155,10 +1157,6 @@ if ( error ) goto Fail; } - - if ( !loader->num_subrs ) - loader->num_subrs = num_subrs; - return; Fail: @@ -1166,9 +1164,6 @@ } -#define TABLE_EXTEND 5 - - static void parse_charstrings( T1_Face face, T1_Loader loader ) @@ -1184,43 +1179,41 @@ FT_Byte* cur; FT_Byte* limit = parser->root.limit; - FT_Int n, num_glyphs; + FT_Int n; FT_UInt notdef_index = 0; FT_Byte notdef_found = 0; - num_glyphs = (FT_Int)T1_ToInt( parser ); - /* some fonts like Optima-Oblique not only define the /CharStrings */ - /* array but access it also */ - if ( num_glyphs == 0 || parser->root.error ) + if ( loader->num_glyphs ) + /* with synthetic fonts, it's possible we get here twice */ return; - /* initialize tables, leaving space for addition of .notdef, */ - /* if necessary, and a few other glyphs to handle buggy */ - /* fonts which have more glyphs than specified. */ + loader->num_glyphs = (FT_Int)T1_ToInt( parser ); + if ( parser->root.error ) + return; - /* for some non-standard fonts like `Optima' which provides */ - /* different outlines depending on the resolution it is */ - /* possible to get here twice */ - if ( !loader->num_glyphs ) - { - error = psaux->ps_table_funcs->init( - code_table, num_glyphs + 1 + TABLE_EXTEND, memory ); - if ( error ) - goto Fail; + /* initialize tables (leaving room for addition of .notdef, */ + /* if necessary). */ - error = psaux->ps_table_funcs->init( - name_table, num_glyphs + 1 + TABLE_EXTEND, memory ); - if ( error ) - goto Fail; + error = psaux->ps_table_funcs->init( code_table, + loader->num_glyphs + 1, + memory ); + if ( error ) + goto Fail; - /* Initialize table for swapping index notdef_index and */ - /* index 0 names and codes (if necessary). */ + error = psaux->ps_table_funcs->init( name_table, + loader->num_glyphs + 1, + memory ); + if ( error ) + goto Fail; - error = psaux->ps_table_funcs->init( swap_table, 4, memory ); - if ( error ) - goto Fail; - } + /* Initialize table for swapping index notdef_index and */ + /* index 0 names and codes (if necessary). */ + + error = psaux->ps_table_funcs->init( swap_table, 4, memory ); + + if ( error ) + goto Fail; n = 0; @@ -1232,7 +1225,9 @@ /* the format is simple: */ /* `/glyphname' + binary data */ - + /* */ + /* note that we stop when we find a `def' */ + /* */ T1_Skip_Spaces( parser ); cur = parser->root.cursor; @@ -1240,62 +1235,50 @@ break; /* we stop when we find a `def' or `end' keyword */ - if ( cur + 3 < limit && is_space( cur[3] ) ) - { - if ( cur[0] == 'd' && - cur[1] == 'e' && - cur[2] == 'f' ) - break; - - if ( cur[0] == 'e' && - cur[1] == 'n' && - cur[2] == 'd' ) - break; - } - - T1_Skip_PS_Token( parser ); - - if ( *cur == '/' ) + if ( *cur == 'd' && + cur + 3 < limit && + cur[1] == 'e' && + cur[2] == 'f' ) + break; + + if ( *cur == 'e' && + cur + 3 < limit && + cur[1] == 'n' && + cur[2] == 'd' ) + break; + + if ( *cur != '/' ) + T1_Skip_Alpha( parser ); + else { + FT_Byte* cur2 = cur + 1; FT_PtrDist len; - if ( cur + 1 >= limit ) - { - error = T1_Err_Invalid_File_Format; - goto Fail; - } + while ( cur2 < limit && is_name_char( *cur2 ) ) + cur2++; + len = cur2 - cur - 1; - cur++; /* skip `/' */ - len = parser->root.cursor - cur; - - if ( !read_binary_data( parser, &size, &base ) ) - return; - - /* for some non-standard fonts like `Optima' which provides */ - /* different outlines depending on the resolution it is */ - /* possible to get here twice */ - if ( loader->num_glyphs ) - continue; - - error = T1_Add_Table( name_table, n, cur, len + 1 ); + error = T1_Add_Table( name_table, n, cur + 1, len + 1 ); if ( error ) goto Fail; /* add a trailing zero to the name table */ name_table->elements[n][len] = '\0'; - /* record index of /.notdef */ - if ( *cur == '.' && - ft_strcmp( ".notdef", + /* record index of /.notdef */ + if ( ft_strcmp( (const char*)".notdef", (const char*)(name_table->elements[n]) ) == 0 ) { notdef_index = n; notdef_found = 1; } - if ( face->type1.private_dict.lenIV >= 0 && - n < num_glyphs + TABLE_EXTEND ) + parser->root.cursor = cur2; + if ( !read_binary_data( parser, &size, &base ) ) + return; + + if ( face->type1.private_dict.lenIV >= 0 ) { FT_Byte* temp; @@ -1316,24 +1299,23 @@ goto Fail; n++; + if ( n >= loader->num_glyphs ) + break; } } - if ( loader->num_glyphs ) - return; - else - loader->num_glyphs = n; + loader->num_glyphs = n; - /* if /.notdef is found but does not occupy index 0, do our magic. */ + /* if /.notdef is found but does not occupy index 0, do our magic. */ if ( ft_strcmp( (const char*)".notdef", (const char*)name_table->elements[0] ) && notdef_found ) { - /* Swap glyph in index 0 with /.notdef glyph. First, add index 0 */ - /* name and code entries to swap_table. Then place notdef_index */ - /* name and code entries into swap_table. Then swap name and code */ - /* entries at indices notdef_index and 0 using values stored in */ - /* swap_table. */ + /* Swap glyph in index 0 with /.notdef glyph. First, add index 0 */ + /* name and code entries to swap_table. Then place notdef_index name */ + /* and code entries into swap_table. Then swap name and code */ + /* entries at indices notdef_index and 0 using values stored in */ + /* swap_table. */ /* Index 0 name */ error = T1_Add_Table( swap_table, 0, @@ -1444,14 +1426,6 @@ } - /*************************************************************************/ - /* */ - /* Define the token field static variables. This is a set of */ - /* T1_FieldRec variables. */ - /* */ - /*************************************************************************/ - - static const T1_FieldRec t1_keywords[] = { @@ -1488,181 +1462,121 @@ FT_Byte* keyword_flags ) { T1_Parser parser = &loader->parser; - FT_Byte *limit, *start_binary; - FT_Bool have_integer = 0; parser->root.cursor = base; parser->root.limit = base + size; - parser->root.error = T1_Err_Ok; + parser->root.error = 0; - limit = parser->root.limit; - - T1_Skip_Spaces( parser ); - - while ( parser->root.cursor < limit ) { - FT_Byte* cur; + FT_Byte* cur = base; + FT_Byte* limit = cur + size; - cur = parser->root.cursor; - - /* look for `FontDirectory' which causes problems for some fonts */ - if ( *cur == 'F' && cur + 25 < limit && - ft_strncmp( (char*)cur, "FontDirectory", 13 ) == 0 ) + for ( ; cur < limit; cur++ ) { - FT_Byte* cur2; - - - /* skip the `FontDirectory' keyword */ - T1_Skip_PS_Token( parser ); - T1_Skip_Spaces ( parser ); - cur = cur2 = parser->root.cursor; - - /* look up the `known' keyword */ - while ( cur < limit ) + /* look for `FontDirectory', which causes problems on some fonts */ + if ( *cur == 'F' && cur + 25 < limit && + ft_strncmp( (char*)cur, "FontDirectory", 13 ) == 0 ) { - if ( *cur == 'k' && cur + 5 < limit && - ft_strncmp( (char*)cur, "known", 5 ) == 0 ) - break; - - T1_Skip_PS_Token( parser ); - T1_Skip_Spaces ( parser ); - cur = parser->root.cursor; - } - - if ( cur < limit ) - { - T1_TokenRec token; + FT_Byte* cur2; - /* skip the `known' keyword and the token following it */ - T1_Skip_PS_Token( parser ); - T1_ToToken( parser, &token ); + /* skip the `FontDirectory' keyword */ + cur += 13; + cur2 = cur; - /* if the last token was an array, skip it! */ - if ( token.type == T1_TOKEN_TYPE_ARRAY ) - cur2 = parser->root.cursor; - } - parser->root.cursor = cur2; - have_integer = 0; - } + /* lookup the `known' keyword */ + while ( cur < limit && *cur != 'k' && + ft_strncmp( (char*)cur, "known", 5 ) ) + cur++; - /* look for `eexec' */ - else if ( *cur == 'e' && cur + 5 < limit && - ft_strncmp( (char*)cur, "eexec", 5 ) == 0 ) - break; - - /* look for `closefile' which ends the eexec section */ - else if ( *cur == 'c' && cur + 9 < limit && - ft_strncmp( (char*)cur, "closefile", 9 ) == 0 ) - break; - - /* check whether we have an integer */ - else if ( ft_isdigit( *cur ) ) - { - start_binary = cur; - T1_Skip_PS_Token( parser ); - have_integer = 1; - } - - /* in valid Type 1 fonts we don't see `RD' or `-|' directly */ - /* since those tokens are handled by parse_subrs and */ - /* parse_charstrings */ - else if ( *cur == 'R' && cur + 6 < limit && *(cur + 1) == 'D' && - have_integer ) - { - FT_Long s; - FT_Byte* b; - - - parser->root.cursor = start_binary; - if ( !read_binary_data( parser, &s, &b ) ) - return T1_Err_Invalid_File_Format; - have_integer = 0; - } - - else if ( *cur == '-' && cur + 6 < limit && *(cur + 1) == '|' && - have_integer ) - { - FT_Long s; - FT_Byte* b; - - - parser->root.cursor = start_binary; - if ( !read_binary_data( parser, &s, &b ) ) - return T1_Err_Invalid_File_Format; - have_integer = 0; - } - - /* look for immediates */ - else if ( *cur == '/' && cur + 2 < limit ) - { - FT_PtrDist len; - - - cur++; - - parser->root.cursor = cur; - T1_Skip_PS_Token( parser ); - - len = parser->root.cursor - cur; - - if ( len > 0 && len < 22 && parser->root.cursor < limit ) - { - /* now compare the immediate name to the keyword table */ - T1_Field keyword = (T1_Field)t1_keywords; - FT_Byte* keyword_flag = keyword_flags; - - - for (;;) + if ( cur < limit ) { - FT_Byte* name; + T1_TokenRec token; - name = (FT_Byte*)keyword->ident; - if ( !name ) - break; + /* skip the `known' keyword and the token following it */ + cur += 5; + loader->parser.root.cursor = cur; + T1_ToToken( &loader->parser, &token ); - if ( cur[0] == name[0] && - len == ft_strlen( (const char *)name ) && - ft_memcmp( cur, name, len ) == 0 ) + /* if the last token was an array, skip it! */ + if ( token.type == T1_TOKEN_TYPE_ARRAY ) + cur2 = parser->root.cursor; + } + cur = cur2; + } + /* look for immediates */ + else if ( *cur == '/' && cur + 2 < limit ) + { + FT_Byte* cur2; + FT_PtrDist len; + + + cur++; + cur2 = cur; + while ( cur2 < limit && is_name_char( *cur2 ) ) + cur2++; + + len = cur2 - cur; + if ( len > 0 && len < 22 ) + { { - /* We found it -- run the parsing callback! */ - /* We only record the first instance of any */ - /* field to deal adequately with synthetic */ - /* fonts; /Subrs and /CharStrings are */ - /* handled specially. */ - if ( keyword_flag[0] == 0 || - ft_strcmp( (const char*)name, "Subrs" ) == 0 || - ft_strcmp( (const char*)name, "CharStrings") == 0 ) - { - parser->root.error = t1_load_keyword( face, - loader, - keyword ); - if ( parser->root.error ) - return parser->root.error; - } - keyword_flag[0] = 1; - break; - } + /* now, compare the immediate name to the keyword table */ + T1_Field keyword = (T1_Field)t1_keywords; + FT_Byte* keyword_flag = keyword_flags; - keyword++; - keyword_flag++; + + for (;;) + { + FT_Byte* name; + + + name = (FT_Byte*)keyword->ident; + if ( !name ) + break; + + if ( cur[0] == name[0] && + len == ft_strlen( (const char*)name ) ) + { + FT_PtrDist n; + + + for ( n = 1; n < len; n++ ) + if ( cur[n] != name[n] ) + break; + + if ( n >= len ) + { + /* we found it -- run the parsing callback! */ + parser->root.cursor = cur2; + T1_Skip_Spaces( parser ); + + /* we only record the first instance of any */ + /* field to deal adequately with synthetic fonts */ + if ( keyword_flag[0] == 0 ) + { + parser->root.error = t1_load_keyword( face, + loader, + keyword ); + if ( parser->root.error ) + return parser->root.error; + } + keyword_flag[0] = 1; + + cur = parser->root.cursor; + break; + } + } + keyword++; + keyword_flag++; + } + } } } - - have_integer = 0; } - else - { - T1_Skip_PS_Token( parser ); - have_integer = 0; - } - - T1_Skip_Spaces( parser ); } - return parser->root.error; } @@ -1774,7 +1688,7 @@ #endif if ( !loader.charstrings.init ) { - FT_ERROR(( "T1_Open_Face: no `/CharStrings' array in face!\n" )); + FT_ERROR(( "T1_Open_Face: no charstrings array in face!\n" )); error = T1_Err_Invalid_File_Format; } @@ -1828,21 +1742,16 @@ if ( ft_strcmp( (const char*)".notdef", (const char*)glyph_name ) != 0 ) { - if ( charcode < min_char ) - min_char = charcode; - if ( charcode > max_char ) - max_char = charcode; + if ( charcode < min_char ) min_char = charcode; + if ( charcode > max_char ) max_char = charcode; } break; } } } - - /* - * Yes, this happens: Certain PDF-embedded fonts have only a - * `.notdef' glyph defined! + /* Yes, this happens: Certain PDF-embedded fonts have only a ".notdef" + * glyph defined! */ - if ( min_char > max_char ) { min_char = 0; diff --git a/reactos/lib/freetype/src/type1/t1objs.c b/reactos/lib/freetype/src/type1/t1objs.c index 64d2885a61b..c62e72b7e12 100644 --- a/reactos/lib/freetype/src/type1/t1objs.c +++ b/reactos/lib/freetype/src/type1/t1objs.c @@ -19,7 +19,6 @@ #include <ft2build.h> #include FT_INTERNAL_DEBUG_H #include FT_INTERNAL_STREAM_H -#include FT_TRUETYPE_IDS_H #include "t1gload.h" #include "t1load.h" @@ -30,7 +29,7 @@ #include "t1afm.h" #endif -#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_INTERNAL_POSTSCRIPT_NAMES_H #include FT_INTERNAL_POSTSCRIPT_AUX_H @@ -230,6 +229,9 @@ FT_FREE( type1->encoding.char_name ); FT_FREE( type1->font_name ); + FT_FREE( type1->paint_type ); + FT_FREE( type1->stroke_width ); + #ifndef T1_CONFIG_OPTION_NO_AFM /* release afm data if present */ if ( face->afm_data ) @@ -276,11 +278,11 @@ FT_Int num_params, FT_Parameter* params ) { - FT_Error error; - FT_Service_PsCMaps psnames; - PSAux_Service psaux; - T1_Font type1 = &face->type1; - PS_FontInfo info = &type1->font_info; + FT_Error error; + PSNames_Service psnames; + PSAux_Service psaux; + T1_Font type1 = &face->type1; + PS_FontInfo info = &type1->font_info; FT_UNUSED( num_params ); FT_UNUSED( params ); @@ -290,8 +292,9 @@ face->root.num_faces = 1; - FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); - face->psnames = psnames; + face->psnames = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), + "psnames" ); + psnames = (PSNames_Service)face->psnames; face->psaux = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), "psaux" ); @@ -431,10 +434,8 @@ root->max_advance_height = root->height; - root->underline_position = - (FT_Short)( info->underline_position >> 16 ); - root->underline_thickness = - (FT_Short)( info->underline_thickness >> 16 ); + root->underline_position = info->underline_position >> 16; + root->underline_thickness = info->underline_thickness >> 16; root->internal->max_points = 0; root->internal->max_contours = 0; @@ -468,25 +469,25 @@ { case T1_ENCODING_TYPE_STANDARD: charmap.encoding = FT_ENCODING_ADOBE_STANDARD; - charmap.encoding_id = TT_ADOBE_ID_STANDARD; + charmap.encoding_id = 0; clazz = cmap_classes->standard; break; case T1_ENCODING_TYPE_EXPERT: charmap.encoding = FT_ENCODING_ADOBE_EXPERT; - charmap.encoding_id = TT_ADOBE_ID_EXPERT; + charmap.encoding_id = 1; clazz = cmap_classes->expert; break; case T1_ENCODING_TYPE_ARRAY: charmap.encoding = FT_ENCODING_ADOBE_CUSTOM; - charmap.encoding_id = TT_ADOBE_ID_CUSTOM; + charmap.encoding_id = 2; clazz = cmap_classes->custom; break; case T1_ENCODING_TYPE_ISOLATIN1: charmap.encoding = FT_ENCODING_ADOBE_LATIN_1; - charmap.encoding_id = TT_ADOBE_ID_LATIN_1; + charmap.encoding_id = 3; clazz = cmap_classes->unicode; break; diff --git a/reactos/lib/freetype/src/type1/t1parse.c b/reactos/lib/freetype/src/type1/t1parse.c index 544aa093f8d..c1783f02936 100644 --- a/reactos/lib/freetype/src/type1/t1parse.c +++ b/reactos/lib/freetype/src/type1/t1parse.c @@ -4,7 +4,7 @@ /* */ /* Type 1 parser (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -65,30 +65,53 @@ /*************************************************************************/ - static FT_Error - read_pfb_tag( FT_Stream stream, - FT_UShort *atag, - FT_Long *asize ) +#define IS_T1_WHITESPACE( c ) ( (c) == ' ' || (c) == '\t' ) +#define IS_T1_LINESPACE( c ) ( (c) == '\r' || (c) == '\n' ) + +#define IS_T1_SPACE( c ) ( IS_T1_WHITESPACE( c ) || IS_T1_LINESPACE( c ) ) + + + typedef struct PFB_Tag_ { - FT_Error error; FT_UShort tag; FT_Long size; + } PFB_Tag; - *atag = 0; - *asize = 0; - if ( !FT_READ_USHORT( tag ) ) +#undef FT_STRUCTURE +#define FT_STRUCTURE PFB_Tag + + + static + const FT_Frame_Field pfb_tag_fields[] = + { + FT_FRAME_START( 6 ), + FT_FRAME_USHORT ( tag ), + FT_FRAME_LONG_LE( size ), + FT_FRAME_END + }; + + + static FT_Error + read_pfb_tag( FT_Stream stream, + FT_UShort* tag, + FT_Long* size ) + { + FT_Error error; + PFB_Tag head; + + + *tag = 0; + *size = 0; + if ( !FT_STREAM_READ_FIELDS( pfb_tag_fields, &head ) ) { - if ( tag == 0x8001U || tag == 0x8002U ) + if ( head.tag == 0x8001U || head.tag == 0x8002U ) { - if ( !FT_READ_LONG_LE( size ) ) - *asize = size; + *tag = head.tag; + *size = head.size; } - - *atag = tag; } - return error; } @@ -104,7 +127,7 @@ FT_Long size; - psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory ); + psaux->ps_parser_funcs->init( &parser->root,0, 0, memory ); parser->stream = stream; parser->base_len = 0; @@ -219,13 +242,36 @@ } + /* return the value of an hexadecimal digit */ + static int + hexa_value( char c ) + { + unsigned int d; + + + d = (unsigned int)( c - '0' ); + if ( d <= 9 ) + return (int)d; + + d = (unsigned int)( c - 'a' ); + if ( d <= 5 ) + return (int)( d + 10 ); + + d = (unsigned int)( c - 'A' ); + if ( d <= 5 ) + return (int)( d + 10 ); + + return -1; + } + + FT_LOCAL_DEF( FT_Error ) T1_Get_Private_Dict( T1_Parser parser, PSAux_Service psaux ) { FT_Stream stream = parser->stream; FT_Memory memory = parser->root.memory; - FT_Error error = T1_Err_Ok; + FT_Error error = 0; FT_Long size; @@ -279,8 +325,7 @@ break; } - if ( FT_STREAM_READ( parser->private_dict + parser->private_len, - size ) ) + if ( FT_STREAM_READ( parser->private_dict + parser->private_len, size ) ) goto Fail; parser->private_len += size; @@ -288,9 +333,9 @@ } else { - /* We have already `loaded' the whole PFA font file into memory; */ + /* we have already `loaded' the whole PFA font file into memory; */ /* if this is a memory resource, allocate a new block to hold */ - /* the private dict. Otherwise, simply overwrite into the base */ + /* the private dict. Otherwise, simply overwrite into the base */ /* dictionary block in the heap. */ /* first of all, look at the `eexec' keyword */ @@ -299,18 +344,24 @@ FT_Byte c; - Again: for (;;) { c = cur[0]; if ( c == 'e' && cur + 9 < limit ) /* 9 = 5 letters for `eexec' + */ /* newline + 4 chars */ { - if ( cur[1] == 'e' && - cur[2] == 'x' && - cur[3] == 'e' && - cur[4] == 'c' ) + if ( cur[1] == 'e' && cur[2] == 'x' && + cur[3] == 'e' && cur[4] == 'c' ) + { + cur += 6; /* we skip the newling after the `eexec' */ + + /* XXX: Some fonts use DOS-linefeeds, i.e. \r\n; we need to */ + /* skip the extra \n if we find it */ + if ( cur[0] == '\n' ) + cur++; + break; + } } cur++; if ( cur >= limit ) @@ -322,57 +373,10 @@ } } - /* check whether `eexec' was real -- it could be in a comment */ - /* or string (as e.g. in u003043t.gsf from ghostscript) */ - - parser->root.cursor = parser->base_dict; - parser->root.limit = cur + 9; - - cur = parser->root.cursor; - limit = parser->root.limit; - - while ( cur < limit ) - { - if ( *cur == 'e' && ft_strncmp( (char*)cur, "eexec", 5 ) == 0 ) - goto Found; - - T1_Skip_PS_Token( parser ); - T1_Skip_Spaces ( parser ); - cur = parser->root.cursor; - } - - /* we haven't found the correct `eexec'; go back and continue */ - /* searching */ - - cur = limit; - limit = parser->base_dict + parser->base_len; - goto Again; - /* now determine where to write the _encrypted_ binary private */ /* dictionary. We overwrite the base dictionary for disk-based */ /* resources and allocate a new block otherwise */ - Found: - parser->root.limit = parser->base_dict + parser->base_len; - - T1_Skip_PS_Token( parser ); - cur = parser->root.cursor; - if ( *cur == '\r' ) - { - cur++; - if ( *cur == '\n' ) - cur++; - } - else if ( *cur == '\n' ) - cur++; - else - { - FT_ERROR(( "T1_Get_Private_Dict:" )); - FT_ERROR(( " `eexec' not properly terminated\n" )); - error = T1_Err_Invalid_File_Format; - goto Exit; - } - size = (FT_Long)( parser->base_len - ( cur - parser->base_dict ) ); if ( parser->in_memory ) @@ -398,38 +402,51 @@ /* the `eexec' keyword); if they all are hexadecimal digits, then */ /* we have a case of ASCII storage */ - if ( ft_isxdigit( cur[0] ) && ft_isxdigit( cur[1] ) && - ft_isxdigit( cur[2] ) && ft_isxdigit( cur[3] ) ) + if ( ( hexa_value( cur[0] ) | hexa_value( cur[1] ) | + hexa_value( cur[2] ) | hexa_value( cur[3] ) ) < 0 ) + + /* binary encoding -- `simply' copy the private dict */ + FT_MEM_COPY( parser->private_dict, cur, size ); + + else { /* ASCII hexadecimal encoding */ - FT_Long len; + + FT_Byte* write; + FT_Int count; - parser->root.cursor = cur; - (void)psaux->ps_parser_funcs->to_bytes( &parser->root, - parser->private_dict, - parser->private_len, - &len, - 0 ); - parser->private_len = len; + write = parser->private_dict; + count = 0; + + for ( ;cur < limit; cur++ ) + { + int hex1; + + + /* check for newline */ + if ( cur[0] == '\r' || cur[0] == '\n' ) + continue; + + /* exit if we have a non-hexadecimal digit that isn't a newline */ + hex1 = hexa_value( cur[0] ); + if ( hex1 < 0 || cur + 1 >= limit ) + break; + + /* otherwise, store byte */ + *write++ = (FT_Byte)( ( hex1 << 4 ) | hexa_value( cur[1] ) ); + count++; + cur++; + } /* put a safeguard */ - parser->private_dict[len] = '\0'; + parser->private_len = write - parser->private_dict; + *write++ = 0; } - else - /* binary encoding -- copy the private dict */ - FT_MEM_MOVE( parser->private_dict, cur, size ); } /* we now decrypt the encoded binary private dictionary */ psaux->t1_decrypt( parser->private_dict, parser->private_len, 55665U ); - - /* replace the four random bytes at the beginning with whitespace */ - parser->private_dict[0] = ' '; - parser->private_dict[1] = ' '; - parser->private_dict[2] = ' '; - parser->private_dict[3] = ' '; - parser->root.base = parser->private_dict; parser->root.cursor = parser->private_dict; parser->root.limit = parser->root.cursor + parser->private_len; diff --git a/reactos/lib/freetype/src/type1/t1parse.h b/reactos/lib/freetype/src/type1/t1parse.h index 6fa4ca624a2..ecc206739ef 100644 --- a/reactos/lib/freetype/src/type1/t1parse.h +++ b/reactos/lib/freetype/src/type1/t1parse.h @@ -4,7 +4,7 @@ /* */ /* Type 1 parser (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -69,9 +69,9 @@ FT_BEGIN_HEADER FT_Byte* private_dict; FT_Long private_len; - FT_Bool in_pfb; - FT_Bool in_memory; - FT_Bool single_block; + FT_Byte in_pfb; + FT_Byte in_memory; + FT_Byte single_block; } T1_ParserRec, *T1_Parser; @@ -91,8 +91,8 @@ FT_BEGIN_HEADER } while ( 0 ) -#define T1_Skip_Spaces( p ) (p)->root.funcs.skip_spaces( &(p)->root ) -#define T1_Skip_PS_Token( p ) (p)->root.funcs.skip_PS_token( &(p)->root ) +#define T1_Skip_Spaces( p ) (p)->root.funcs.skip_spaces( &(p)->root ) +#define T1_Skip_Alpha( p ) (p)->root.funcs.skip_alpha ( &(p)->root ) #define T1_ToInt( p ) (p)->root.funcs.to_int( &(p)->root ) #define T1_ToFixed( p, t ) (p)->root.funcs.to_fixed( &(p)->root, t ) diff --git a/reactos/lib/freetype/src/type42/t42drivr.c b/reactos/lib/freetype/src/type42/t42drivr.c index f4a7becbad7..d9668775c9c 100644 --- a/reactos/lib/freetype/src/type42/t42drivr.c +++ b/reactos/lib/freetype/src/type42/t42drivr.c @@ -4,7 +4,7 @@ /* */ /* High-level Type 42 driver interface (body). */ /* */ -/* Copyright 2002, 2003, 2004 by Roberto Alameda. */ +/* Copyright 2002, 2003 by Roberto Alameda. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ @@ -24,9 +24,10 @@ /* 2) Incremental fonts making use of the GlyphDirectory keyword */ /* will be loaded, but the rendering will be using the TrueType */ /* tables. */ - /* 3) As for Type1 fonts, CDevProc is not supported. */ - /* 4) The Metrics dictionary is not supported. */ - /* 5) AFM metrics are not supported. */ + /* 3) The sfnts array is expected to be ASCII, not binary. */ + /* 4) As for Type1 fonts, CDevProc is not supported. */ + /* 5) The Metrics dictionary is not supported. */ + /* 6) AFM metrics are not supported. */ /* */ /* In other words, this driver supports Type42 fonts derived from */ /* TrueType fonts in a non-CID manner, as done by usual conversion */ @@ -40,21 +41,11 @@ #include "t42error.h" #include FT_INTERNAL_DEBUG_H -#include FT_SERVICE_XFREE86_NAME_H -#include FT_SERVICE_GLYPH_DICT_H -#include FT_SERVICE_POSTSCRIPT_NAME_H -#include FT_SERVICE_POSTSCRIPT_INFO_H #undef FT_COMPONENT #define FT_COMPONENT trace_t42 - /* - * - * GLYPH DICT SERVICE - * - */ - static FT_Error t42_get_glyph_name( T42_Face face, FT_UInt glyph_index, @@ -82,6 +73,13 @@ } + static const char* + t42_get_ps_name( T42_Face face ) + { + return (const char*)face->type1.font_name; + } + + static FT_UInt t42_get_name_index( T42_Face face, FT_String* glyph_name ) @@ -95,92 +93,30 @@ gname = face->type1.glyph_names[i]; if ( !ft_strcmp( glyph_name, gname ) ) - return (FT_UInt)ft_atol( (const char *)face->type1.charstrings[i] ); + return ft_atoi( (const char *)face->type1.charstrings[i] ); } return 0; } - static FT_Service_GlyphDictRec t42_service_glyph_dict = - { - (FT_GlyphDict_GetNameFunc) t42_get_glyph_name, - (FT_GlyphDict_NameIndexFunc)t42_get_name_index - }; - - - /* - * - * POSTSCRIPT NAME SERVICE - * - */ - - static const char* - t42_get_ps_font_name( T42_Face face ) - { - return (const char*)face->type1.font_name; - } - - - static FT_Service_PsFontNameRec t42_service_ps_font_name = - { - (FT_PsName_GetFunc)t42_get_ps_font_name - }; - - - /* - * - * POSTSCRIPT INFO SERVICE - * - */ - - static FT_Error - t42_ps_get_font_info( FT_Face face, - PS_FontInfoRec* afont_info ) - { - *afont_info = ((T42_Face)face)->type1.font_info; - return 0; - } - - - static FT_Int - t42_ps_has_glyph_names( FT_Face face ) - { - FT_UNUSED( face ); - return 1; - } - - - static const FT_Service_PsInfoRec t42_service_ps_info = - { - (PS_GetFontInfoFunc) t42_ps_get_font_info, - (PS_HasGlyphNamesFunc)t42_ps_has_glyph_names - }; - - - /* - * - * SERVICE LIST - * - */ - - static const FT_ServiceDescRec t42_services[] = - { - { FT_SERVICE_ID_GLYPH_DICT, &t42_service_glyph_dict }, - { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &t42_service_ps_font_name }, - { FT_SERVICE_ID_POSTSCRIPT_INFO, &t42_service_ps_info }, - { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_TYPE_42 }, - { NULL, NULL } - }; - - static FT_Module_Interface T42_Get_Interface( FT_Driver driver, const FT_String* t42_interface ) { FT_UNUSED( driver ); - return ft_service_list_lookup( t42_services, t42_interface ); + /* Any additional interface are defined here */ + if (ft_strcmp( (const char*)t42_interface, "glyph_name" ) == 0 ) + return (FT_Module_Interface)t42_get_glyph_name; + + if ( ft_strcmp( (const char*)t42_interface, "name_index" ) == 0 ) + return (FT_Module_Interface)t42_get_name_index; + + if ( ft_strcmp( (const char*)t42_interface, "postscript_name" ) == 0 ) + return (FT_Module_Interface)t42_get_ps_name; + + return 0; } diff --git a/reactos/lib/freetype/src/type42/t42objs.c b/reactos/lib/freetype/src/type42/t42objs.c index a3763c811b5..bb4120571e4 100644 --- a/reactos/lib/freetype/src/type42/t42objs.c +++ b/reactos/lib/freetype/src/type42/t42objs.c @@ -53,8 +53,7 @@ if ( error ) goto Exit; - error = t42_parse_dict( face, &loader, - parser->base_dict, parser->base_len ); + error = t42_parse_dict( face, &loader, parser->base_dict, parser->base_len ); if ( type1->font_type != 42 ) { @@ -66,8 +65,7 @@ /* to the Type1 data */ type1->num_glyphs = loader.num_glyphs; - if ( !loader.charstrings.init ) - { + if ( !loader.charstrings.init ) { FT_ERROR(( "T42_Open_Face: no charstrings array in face!\n" )); error = T42_Err_Invalid_File_Format; } @@ -123,10 +121,8 @@ if ( ft_strcmp( (const char*)".notdef", (const char*)glyph_name ) != 0 ) { - if ( charcode < min_char ) - min_char = charcode; - if ( charcode > max_char ) - max_char = charcode; + if ( charcode < min_char ) min_char = charcode; + if ( charcode > max_char ) max_char = charcode; } break; } @@ -153,12 +149,12 @@ FT_Int num_params, FT_Parameter* params ) { - FT_Error error; - FT_Service_PsCMaps psnames; - PSAux_Service psaux; - FT_Face root = (FT_Face)&face->root; - T1_Font type1 = &face->type1; - PS_FontInfo info = &type1->font_info; + FT_Error error; + PSNames_Service psnames; + PSAux_Service psaux; + FT_Face root = (FT_Face)&face->root; + T1_Font type1 = &face->type1; + PS_FontInfo info = &type1->font_info; FT_UNUSED( num_params ); FT_UNUSED( params ); @@ -169,8 +165,9 @@ face->ttf_face = NULL; face->root.num_faces = 1; - FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); - face->psnames = psnames; + face->psnames = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), + "psnames" ); + psnames = (PSNames_Service)face->psnames; face->psaux = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), "psaux" ); @@ -193,7 +190,7 @@ goto Exit; } - /* Now load the font program into the face object */ + /* Now, load the font program into the face object */ /* Init the face object fields */ /* Now set up root face fields */ @@ -281,8 +278,8 @@ root->max_advance_width = face->ttf_face->max_advance_width; root->max_advance_height = face->ttf_face->max_advance_height; - root->underline_position = (FT_Short)( info->underline_position >> 16 ); - root->underline_thickness = (FT_Short)( info->underline_thickness >> 16 ); + root->underline_position = info->underline_position >> 16; + root->underline_thickness = info->underline_thickness >> 16; root->internal->max_points = 0; root->internal->max_contours = 0; @@ -354,7 +351,7 @@ #if 0 /* Select default charmap */ - if ( root->num_charmaps ) + if (root->num_charmaps) root->charmap = root->charmaps[0]; #endif } @@ -401,6 +398,9 @@ FT_FREE( type1->encoding.char_name ); FT_FREE( type1->font_name ); + FT_FREE( type1->paint_type ); + FT_FREE( type1->stroke_width ); + FT_FREE( face->ttf_data ); #if 0 @@ -453,6 +453,8 @@ } + + FT_LOCAL_DEF( FT_Error ) T42_Size_Init( T42_Size size ) { @@ -600,7 +602,7 @@ FT_LOCAL_DEF( FT_Error ) T42_GlyphSlot_Load( FT_GlyphSlot glyph, FT_Size size, - FT_UInt glyph_index, + FT_Int glyph_index, FT_Int32 load_flags ) { FT_Error error; diff --git a/reactos/lib/freetype/src/type42/t42objs.h b/reactos/lib/freetype/src/type42/t42objs.h index 623809573e3..6fb176917ee 100644 --- a/reactos/lib/freetype/src/type42/t42objs.h +++ b/reactos/lib/freetype/src/type42/t42objs.h @@ -4,7 +4,7 @@ /* */ /* Type 42 objects manager (specification). */ /* */ -/* Copyright 2002, 2003 by Roberto Alameda. */ +/* Copyright 2002 by Roberto Alameda. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ @@ -22,10 +22,10 @@ #include FT_FREETYPE_H #include FT_TYPE1_TABLES_H #include FT_INTERNAL_TYPE1_TYPES_H -#include "t42types.h" +#include FT_INTERNAL_TYPE42_TYPES_H #include FT_INTERNAL_OBJECTS_H #include FT_INTERNAL_DRIVER_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_INTERNAL_POSTSCRIPT_NAMES_H #include FT_INTERNAL_POSTSCRIPT_HINTS_H @@ -102,7 +102,7 @@ FT_BEGIN_HEADER FT_LOCAL( FT_Error ) T42_GlyphSlot_Load( FT_GlyphSlot glyph, FT_Size size, - FT_UInt glyph_index, + FT_Int glyph_index, FT_Int32 load_flags ); FT_LOCAL( void ) diff --git a/reactos/lib/freetype/src/type42/t42parse.c b/reactos/lib/freetype/src/type42/t42parse.c index bf979479058..ae4b7fcd57d 100644 --- a/reactos/lib/freetype/src/type42/t42parse.c +++ b/reactos/lib/freetype/src/type42/t42parse.c @@ -93,6 +93,10 @@ }; +#define T42_KEYWORD_COUNT \ + ( sizeof ( t42_keywords ) / sizeof ( t42_keywords[0] ) ) + + #define T1_Add_Table( p, i, o, l ) (p)->funcs.add( (p), i, o, l ) #define T1_Done_Table( p ) \ do \ @@ -107,18 +111,20 @@ (p)->funcs.release( p ); \ } while ( 0 ) -#define T1_Skip_Spaces( p ) (p)->root.funcs.skip_spaces( &(p)->root ) -#define T1_Skip_PS_Token( p ) (p)->root.funcs.skip_PS_token( &(p)->root ) +#define T1_Skip_Spaces( p ) (p)->root.funcs.skip_spaces( &(p)->root ) +#define T1_Skip_Alpha( p ) (p)->root.funcs.skip_alpha ( &(p)->root ) -#define T1_ToInt( p ) \ - (p)->root.funcs.to_int( &(p)->root ) -#define T1_ToBytes( p, b, m, n, d ) \ - (p)->root.funcs.to_bytes( &(p)->root, b, m, n, d ) +#define T1_ToInt( p ) (p)->root.funcs.to_int( &(p)->root ) +#define T1_ToFixed( p, t ) (p)->root.funcs.to_fixed( &(p)->root, t ) +#define T1_ToCoordArray( p, m, c ) \ + (p)->root.funcs.to_coord_array( &(p)->root, m, c ) #define T1_ToFixedArray( p, m, f, t ) \ (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t ) #define T1_ToToken( p, t ) \ (p)->root.funcs.to_token( &(p)->root, t ) +#define T1_ToTokenArray( p, t, m, c ) \ + (p)->root.funcs.to_token_array( &(p)->root, t, m, c ) #define T1_Load_Field( p, f, o, m, pf ) \ (p)->root.funcs.load_field( &(p)->root, f, o, m, pf ) @@ -152,8 +158,8 @@ /* When creating a new Type 42 parser, we try to locate and load */ /* the base dictionary, loading the whole font into memory. */ /* */ - /* When `loading' the base dictionary, we only set up pointers */ - /* in the case of a memory-based stream. Otherwise, we allocate */ + /* When `loading' the base dictionary, we only setup pointers in */ + /* the case of a memory-based stream. Otherwise, we allocate */ /* and load the base dictionary in it. */ /* */ /* parser->in_memory is set if we have a memory stream. */ @@ -189,9 +195,9 @@ } /* Now check font format; we must see `%!PS-TrueTypeFont' */ - if ( size <= 17 || - ( ft_strncmp( (const char*)parser->base_dict, - "%!PS-TrueTypeFont", 17 ) ) ) + if (size <= 17 || + ( ft_strncmp( (const char*)parser->base_dict, + "%!PS-TrueTypeFont", 17) ) ) error = T42_Err_Unknown_File_Format; else { @@ -222,12 +228,24 @@ } + static int + t42_is_alpha( FT_Byte c ) + { + /* Note: we must accept "+" as a valid character, as it is used in */ + /* embedded type1 fonts in PDF documents. */ + /* */ + return ( ft_isalnum( c ) || + c == '.' || + c == '_' || + c == '-' || + c == '+' ); + } + + static int t42_is_space( FT_Byte c ) { - return ( c == ' ' || c == '\t' || - c == '\r' || c == '\n' || c == '\f' || - c == '\0' ); + return ( c == ' ' || c == '\t' || c == '\r' || c == '\n' ); } @@ -270,8 +288,8 @@ matrix->yy = temp[3]; /* note that the offsets must be expressed in integer font units */ - offset->x = temp[4] >> 16; - offset->y = temp[5] >> 16; + offset->x = temp[4] >> 16; + offset->y = temp[5] >> 16; } @@ -279,52 +297,45 @@ t42_parse_encoding( T42_Face face, T42_Loader loader ) { - T42_Parser parser = &loader->parser; - FT_Byte* cur; - FT_Byte* limit = parser->root.limit; + T42_Parser parser = &loader->parser; + FT_Byte* cur = parser->root.cursor; + FT_Byte* limit = parser->root.limit; PSAux_Service psaux = (PSAux_Service)face->psaux; - T1_Skip_Spaces( parser ); - cur = parser->root.cursor; - if ( cur >= limit ) + /* skip whitespace */ + while ( t42_is_space( *cur ) ) { - FT_ERROR(( "t42_parse_encoding: out of bounds!\n" )); - parser->root.error = T42_Err_Invalid_File_Format; - return; + cur++; + if ( cur >= limit ) + { + FT_ERROR(( "t42_parse_encoding: out of bounds!\n" )); + parser->root.error = T42_Err_Invalid_File_Format; + return; + } } - /* if we have a number or `[', the encoding is an array, */ - /* and we must load it now */ - if ( ft_isdigit( *cur ) || *cur == '[' ) + /* if we have a number, then the encoding is an array, */ + /* and we must load it now */ + if ( (FT_Byte)( *cur - '0' ) < 10 ) { - T1_Encoding encode = &face->type1.encoding; - FT_UInt count, n; - PS_Table char_table = &loader->encoding_table; - FT_Memory memory = parser->root.memory; + T1_Encoding encode = &face->type1.encoding; + FT_Int count, n; + PS_Table char_table = &loader->encoding_table; + FT_Memory memory = parser->root.memory; FT_Error error; - FT_Bool only_immediates = 0; - /* read the number of entries in the encoding; should be 256 */ - if ( *cur == '[' ) - { - count = 256; - only_immediates = 1; - parser->root.cursor++; - } - else - count = (FT_UInt)T1_ToInt( parser ); - - T1_Skip_Spaces( parser ); - if ( parser->root.cursor >= limit ) + /* read the number of entries in the encoding, should be 256 */ + count = (FT_Int)T1_ToInt( parser ); + if ( parser->root.error ) return; /* we use a T1_Table to store our charnames */ loader->num_chars = encode->num_chars = count; - if ( FT_NEW_ARRAY( encode->char_index, count ) || - FT_NEW_ARRAY( encode->char_name, count ) || + if ( FT_NEW_ARRAY( encode->char_index, count ) || + FT_NEW_ARRAY( encode->char_name, count ) || FT_SET_ERROR( psaux->ps_table_funcs->init( char_table, count, memory ) ) ) { @@ -341,99 +352,86 @@ T1_Add_Table( char_table, n, notdef, 8 ); } - /* Now we need to read records of the form */ - /* */ - /* ... charcode /charname ... */ - /* */ - /* for each entry in our table. */ + /* Now, we will need to read a record of the form */ + /* ... charcode /charname ... for each entry in our table */ /* */ /* We simply look for a number followed by an immediate */ /* name. Note that this ignores correctly the sequence */ - /* that is often seen in type42 fonts: */ + /* that is often seen in type1 fonts: */ /* */ /* 0 1 255 { 1 index exch /.notdef put } for dup */ /* */ /* used to clean the encoding array before anything else. */ /* */ - /* Alternatively, if the array is directly given as */ - /* */ - /* /Encoding [ ... ] */ - /* */ - /* we only read immediates. */ + /* We stop when we encounter a `def'. */ - n = 0; - T1_Skip_Spaces( parser ); + cur = parser->root.cursor; + limit = parser->root.limit; + n = 0; - while ( parser->root.cursor < limit ) + for ( ; cur < limit; ) { - cur = parser->root.cursor; + FT_Byte c; - /* we stop when we encounter `def' or `]' */ - if ( *cur == 'd' && cur + 3 < limit ) + + c = *cur; + + /* we stop when we encounter a `def' */ + if ( c == 'd' && cur + 3 < limit ) { - if ( cur[1] == 'e' && - cur[2] == 'f' && - t42_is_space( cur[3] ) ) + if ( cur[1] == 'e' && + cur[2] == 'f' && + t42_is_space( cur[-1] ) && + t42_is_space( cur[3] ) ) { FT_TRACE6(( "encoding end\n" )); - cur += 3; break; } } - if ( *cur == ']' ) - { - FT_TRACE6(( "encoding end\n" )); - cur++; - break; - } - /* check whether we've found an entry */ - if ( ft_isdigit( *cur ) || only_immediates ) + /* otherwise, we must find a number before anything else */ + if ( (FT_Byte)( c - '0' ) < 10 ) { FT_Int charcode; - if ( only_immediates ) - charcode = n; - else - { - charcode = (FT_Int)T1_ToInt( parser ); - T1_Skip_Spaces( parser ); - } - - cur = parser->root.cursor; - - if ( *cur == '/' && cur + 2 < limit && n < count ) - { - FT_PtrDist len; - + parser->root.cursor = cur; + charcode = (FT_Int)T1_ToInt( parser ); + cur = parser->root.cursor; + /* skip whitespace */ + while ( cur < limit && t42_is_space( *cur ) ) cur++; - parser->root.cursor = cur; - T1_Skip_PS_Token( parser ); + if ( cur < limit && *cur == '/' ) + { + /* bingo, we have an immediate name -- it must be a */ + /* character name */ + FT_Byte* cur2 = cur + 1; + FT_Int len; - len = parser->root.cursor - cur; + + while ( cur2 < limit && t42_is_alpha( *cur2 ) ) + cur2++; + + len = (FT_Int)( cur2 - cur - 1 ); parser->root.error = T1_Add_Table( char_table, charcode, - cur, len + 1 ); + cur + 1, len + 1 ); char_table->elements[charcode][len] = '\0'; if ( parser->root.error ) return; - n++; + cur = cur2; } } else - T1_Skip_PS_Token( parser ); - - T1_Skip_Spaces( parser ); + cur++; } face->type1.encoding_type = T1_ENCODING_TYPE_ARRAY; parser->root.cursor = cur; } - /* Otherwise, we should have either `StandardEncoding', */ /* `ExpertEncoding', or `ISOLatin1Encoding' */ else @@ -450,8 +448,7 @@ ft_strncmp( (const char*)cur, "ISOLatin1Encoding", 17 ) == 0 ) face->type1.encoding_type = T1_ENCODING_TYPE_ISOLATIN1; - else - { + else { FT_ERROR(( "t42_parse_encoding: invalid token!\n" )); parser->root.error = T42_Err_Invalid_File_Format; } @@ -459,13 +456,34 @@ } - typedef enum + static FT_UInt + t42_hexval( FT_Byte v ) { - BEFORE_START, - BEFORE_TABLE_DIR, - OTHER_TABLES + FT_UInt d; - } T42_Load_Status; + d = (FT_UInt)( v - 'A' ); + if ( d < 6 ) + { + d += 10; + goto Exit; + } + + d = (FT_UInt)( v - 'a' ); + if ( d < 6 ) + { + d += 10; + goto Exit; + } + + d = (FT_UInt)( v - '0' ); + if ( d < 10 ) + goto Exit; + + d = 0; + + Exit: + return d; + } static void @@ -474,177 +492,154 @@ { T42_Parser parser = &loader->parser; FT_Memory memory = parser->root.memory; - FT_Byte* cur; + FT_Byte* cur = parser->root.cursor; FT_Byte* limit = parser->root.limit; FT_Error error; - FT_Int num_tables = 0; - FT_ULong count, ttf_size = 0; - - FT_Long n, string_size, old_string_size, real_size; - FT_Byte* string_buf = NULL; - FT_Bool alloc = 0; - - T42_Load_Status status; + FT_Int num_tables = 0, status; + FT_ULong count, ttf_size = 0, string_size = 0; + FT_Bool in_string = 0; + FT_Byte v = 0; - /* The format is */ - /* */ - /* /sfnts [ <hexstring> <hexstring> ... ] def */ - /* */ - /* or */ - /* */ - /* /sfnts [ */ - /* <num_bin_bytes> RD <binary data> */ - /* <num_bin_bytes> RD <binary data> */ - /* ... */ - /* ] def */ - /* */ - /* with exactly one space after the `RD' token. */ + /* The format is `/sfnts [ <...> <...> ... ] def' */ - T1_Skip_Spaces( parser ); + while ( t42_is_space( *cur ) ) + cur++; - if ( parser->root.cursor >= limit || *parser->root.cursor++ != '[' ) + if (*cur++ == '[') + { + status = 0; + count = 0; + } + else { FT_ERROR(( "t42_parse_sfnts: can't find begin of sfnts vector!\n" )); error = T42_Err_Invalid_File_Format; goto Fail; } - T1_Skip_Spaces( parser ); - status = BEFORE_START; - string_size = 0; - old_string_size = 0; - count = 0; - - while ( parser->root.cursor < limit ) + while ( cur < limit - 2 ) { - cur = parser->root.cursor; + while ( t42_is_space( *cur ) ) + cur++; - if ( *cur == ']' ) + switch ( *cur ) { - parser->root.cursor++; - goto Exit; - } + case ']': + parser->root.cursor = cur++; + return; - else if ( *cur == '<' ) - { - T1_Skip_PS_Token( parser ); - if ( parser->root.error ) - goto Exit; + case '<': + in_string = 1; + string_size = 0; + cur++; + continue; - /* don't include delimiters */ - string_size = (FT_Long)( ( parser->root.cursor - cur - 2 + 1 ) / 2 ); - if ( FT_REALLOC( string_buf, old_string_size, string_size ) ) - goto Fail; - - alloc = 1; - - parser->root.cursor = cur; - (void)T1_ToBytes( parser, string_buf, string_size, &real_size, 1 ); - old_string_size = string_size; - string_size = real_size; - } - - else if ( ft_isdigit( *cur ) ) - { - string_size = T1_ToInt( parser ); - - T1_Skip_PS_Token( parser ); /* `RD' */ - - string_buf = parser->root.cursor + 1; /* one space after `RD' */ - - parser->root.cursor += string_size + 1; - if ( parser->root.cursor >= limit ) + case '>': + if ( !in_string ) { - FT_ERROR(( "t42_parse_sfnts: too many binary data!\n" )); + FT_ERROR(( "t42_parse_sfnts: found unpaired `>'!\n" )); error = T42_Err_Invalid_File_Format; goto Fail; } - } - /* A string can have a trailing zero byte for padding. Ignore it. */ - if ( string_buf[string_size - 1] == 0 && ( string_size % 2 == 1 ) ) - string_size--; + /* A string can have, as a last byte, */ + /* a zero byte for padding. If so, ignore it */ + if ( ( v == 0 ) && ( string_size % 2 == 1 ) ) + count--; + in_string = 0; + cur++; + continue; - for ( n = 0; n < string_size; n++ ) - { - switch ( status ) + case '%': + if ( !in_string ) { - case BEFORE_START: - /* load offset table, 12 bytes */ - if ( count < 12 ) - { - face->ttf_data[count++] = string_buf[n]; - continue; - } - else - { - num_tables = 16 * face->ttf_data[4] + face->ttf_data[5]; - status = BEFORE_TABLE_DIR; - ttf_size = 12 + 16 * num_tables; - - if ( FT_REALLOC( face->ttf_data, 12, ttf_size ) ) - goto Fail; - } - /* fall through */ - - case BEFORE_TABLE_DIR: - /* the offset table is read; read the table directory */ - if ( count < ttf_size ) - { - face->ttf_data[count++] = string_buf[n]; - continue; - } - else - { - int i; - FT_ULong len; - - - for ( i = 0; i < num_tables; i++ ) - { - FT_Byte* p = face->ttf_data + 12 + 16 * i + 12; - - - len = FT_PEEK_ULONG( p ); - - /* Pad to a 4-byte boundary length */ - ttf_size += ( len + 3 ) & ~3; - } - - status = OTHER_TABLES; - face->ttf_size = ttf_size; - - if ( FT_REALLOC( face->ttf_data, 12 + 16 * num_tables, - ttf_size + 1 ) ) - goto Fail; - } - /* fall through */ - - case OTHER_TABLES: - /* all other tables are just copied */ - if ( count >= ttf_size ) - { - FT_ERROR(( "t42_parse_sfnts: too many binary data!\n" )); - error = T42_Err_Invalid_File_Format; - goto Fail; - } - face->ttf_data[count++] = string_buf[n]; + /* Comment found; skip till end of line */ + while ( *cur != '\n' ) + cur++; + continue; } + else + { + FT_ERROR(( "t42_parse_sfnts: found `%' in string!\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + + default: + if ( !ft_xdigit( *cur ) || !ft_xdigit( *(cur + 1) ) ) + { + FT_ERROR(( "t42_parse_sfnts: found non-hex characters in string" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + + v = (FT_Byte)( 16 * t42_hexval( cur[0] ) + t42_hexval( cur[1] ) ); + cur += 2; + string_size++; } - T1_Skip_Spaces( parser ); + switch ( status ) + { + case 0: /* The '[' was read, so load offset table, 12 bytes */ + if ( count < 12 ) + { + face->ttf_data[count++] = v; + continue; + } + else + { + num_tables = 16 * face->ttf_data[4] + face->ttf_data[5]; + status = 1; + ttf_size = 12 + 16 * num_tables; + + if ( FT_REALLOC( face->ttf_data, 12, ttf_size ) ) + goto Fail; + } + /* No break, fall-through */ + + case 1: /* The offset table is read; read now the table directory */ + if ( count < ttf_size ) + { + face->ttf_data[count++] = v; + continue; + } + else + { + int i; + FT_ULong len; + + + for ( i = 0; i < num_tables; i++ ) + { + FT_Byte* p = face->ttf_data + 12 + 16*i + 12; + + len = FT_PEEK_ULONG( p ); + + /* Pad to a 4-byte boundary length */ + ttf_size += ( len + 3 ) & ~3; + } + + status = 2; + face->ttf_size = ttf_size; + + if ( FT_REALLOC( face->ttf_data, 12 + 16 * num_tables, + ttf_size + 1 ) ) + goto Fail; + } + /* No break, fall-through */ + + case 2: /* We are reading normal tables; just swallow them */ + face->ttf_data[count++] = v; + + } } - /* if control reaches this point, the format was not valid */ + /* If control reaches this point, the format was not valid */ error = T42_Err_Invalid_File_Format; Fail: parser->root.error = error; - - Exit: - if ( alloc ) - FT_FREE( string_buf ); } @@ -652,75 +647,22 @@ t42_parse_charstrings( T42_Face face, T42_Loader loader ) { - T42_Parser parser = &loader->parser; - PS_Table code_table = &loader->charstrings; - PS_Table name_table = &loader->glyph_names; - PS_Table swap_table = &loader->swap_table; - FT_Memory memory = parser->root.memory; + T42_Parser parser = &loader->parser; + PS_Table code_table = &loader->charstrings; + PS_Table name_table = &loader->glyph_names; + FT_Memory memory = parser->root.memory; FT_Error error; - PSAux_Service psaux = (PSAux_Service)face->psaux; + PSAux_Service psaux = (PSAux_Service)face->psaux; FT_Byte* cur; - FT_Byte* limit = parser->root.limit; - FT_UInt n; - FT_UInt notdef_index = 0; - FT_Byte notdef_found = 0; + FT_Byte* limit = parser->root.limit; + FT_Int n; - T1_Skip_Spaces( parser ); - - if ( parser->root.cursor >= limit ) - { - FT_ERROR(( "t42_parse_charstrings: out of bounds!\n" )); - error = T42_Err_Invalid_File_Format; - goto Fail; - } - - if ( ft_isdigit( *parser->root.cursor ) ) - { - loader->num_glyphs = (FT_UInt)T1_ToInt( parser ); - if ( parser->root.error ) - return; - } - else if ( *parser->root.cursor == '<' ) - { - /* We have `<< ... >>'. Count the number of `/' in the dictionary */ - /* to get its size. */ - FT_UInt count = 0; - - - T1_Skip_PS_Token( parser ); - T1_Skip_Spaces( parser ); - cur = parser->root.cursor; - - while ( parser->root.cursor < limit ) - { - if ( *parser->root.cursor == '/' ) - count++; - else if ( *parser->root.cursor == '>' ) - { - loader->num_glyphs = count; - parser->root.cursor = cur; /* rewind */ - break; - } - T1_Skip_PS_Token( parser ); - T1_Skip_Spaces( parser ); - } - } - else - { - FT_ERROR(( "t42_parse_charstrings: invalid token!\n" )); - error = T42_Err_Invalid_File_Format; - goto Fail; - } - - if ( parser->root.cursor >= limit ) - { - FT_ERROR(( "t42_parse_charstrings: out of bounds!\n" )); - error = T42_Err_Invalid_File_Format; - goto Fail; - } + loader->num_glyphs = (FT_Int)T1_ToInt( parser ); + if ( parser->root.error ) + return; /* initialize tables */ @@ -736,82 +678,57 @@ if ( error ) goto Fail; - /* Initialize table for swapping index notdef_index and */ - /* index 0 names and codes (if necessary). */ - - error = psaux->ps_table_funcs->init( swap_table, 4, memory ); - if ( error ) - goto Fail; - n = 0; for (;;) { - /* The format is simple: */ - /* `/glyphname' + index [+ def] */ - + /* the format is simple: */ + /* `/glyphname' + index + def */ + /* */ + /* note that we stop when we find an `end' */ + /* */ T1_Skip_Spaces( parser ); cur = parser->root.cursor; if ( cur >= limit ) break; - /* We stop when we find an `end' keyword or '>' */ - if ( *cur == 'e' && - cur + 3 < limit && - cur[1] == 'n' && - cur[2] == 'd' && - t42_is_space( cur[3] ) ) - break; - if ( *cur == '>' ) + /* we stop when we find an `end' keyword */ + if ( *cur == 'e' && + cur + 3 < limit && + cur[1] == 'n' && + cur[2] == 'd' ) break; - T1_Skip_PS_Token( parser ); - - if ( *cur == '/' ) + if ( *cur != '/' ) + T1_Skip_Alpha( parser ); + else { - FT_PtrDist len; + FT_Byte* cur2 = cur + 1; + FT_Int len; - if ( cur + 1 >= limit ) - { - FT_ERROR(( "t42_parse_charstrings: out of bounds!\n" )); - error = T42_Err_Invalid_File_Format; - goto Fail; - } + while ( cur2 < limit && t42_is_alpha( *cur2 ) ) + cur2++; + len = (FT_Int)( cur2 - cur - 1 ); - cur++; /* skip `/' */ - len = parser->root.cursor - cur; - - error = T1_Add_Table( name_table, n, cur, len + 1 ); + error = T1_Add_Table( name_table, n, cur + 1, len + 1 ); if ( error ) goto Fail; /* add a trailing zero to the name table */ name_table->elements[n][len] = '\0'; - /* record index of /.notdef */ - if ( *cur == '.' && - ft_strcmp( ".notdef", - (const char*)(name_table->elements[n]) ) == 0 ) - { - notdef_index = n; - notdef_found = 1; - } - + parser->root.cursor = cur2; T1_Skip_Spaces( parser ); - cur = parser->root.cursor; + cur2 = cur = parser->root.cursor; + if ( cur >= limit ) + break; - (void)T1_ToInt( parser ); - if ( parser->root.cursor >= limit ) - { - FT_ERROR(( "t42_parse_charstrings: out of bounds!\n" )); - error = T42_Err_Invalid_File_Format; - goto Fail; - } - - len = parser->root.cursor - cur; + while ( cur2 < limit && t42_is_alpha( *cur2 ) ) + cur2++; + len = (FT_Int)( cur2 - cur ); error = T1_Add_Table( code_table, n, cur, len + 1 ); if ( error ) @@ -825,79 +742,15 @@ } } - loader->num_glyphs = n; - - if ( !notdef_found ) + /* Index 0 must be a .notdef element */ + if ( ft_strcmp( (char *)name_table->elements[0], ".notdef" ) ) { - FT_ERROR(( "t42_parse_charstrings: no /.notdef glyph!\n" )); + FT_ERROR(( "t42_parse_charstrings: Index 0 is not `.notdef'!\n" )); error = T42_Err_Invalid_File_Format; goto Fail; } - /* if /.notdef does not occupy index 0, do our magic. */ - if ( ft_strcmp( (const char*)".notdef", - (const char*)name_table->elements[0] ) ) - { - /* Swap glyph in index 0 with /.notdef glyph. First, add index 0 */ - /* name and code entries to swap_table. Then place notdef_index */ - /* name and code entries into swap_table. Then swap name and code */ - /* entries at indices notdef_index and 0 using values stored in */ - /* swap_table. */ - - /* Index 0 name */ - error = T1_Add_Table( swap_table, 0, - name_table->elements[0], - name_table->lengths [0] ); - if ( error ) - goto Fail; - - /* Index 0 code */ - error = T1_Add_Table( swap_table, 1, - code_table->elements[0], - code_table->lengths [0] ); - if ( error ) - goto Fail; - - /* Index notdef_index name */ - error = T1_Add_Table( swap_table, 2, - name_table->elements[notdef_index], - name_table->lengths [notdef_index] ); - if ( error ) - goto Fail; - - /* Index notdef_index code */ - error = T1_Add_Table( swap_table, 3, - code_table->elements[notdef_index], - code_table->lengths [notdef_index] ); - if ( error ) - goto Fail; - - error = T1_Add_Table( name_table, notdef_index, - swap_table->elements[0], - swap_table->lengths [0] ); - if ( error ) - goto Fail; - - error = T1_Add_Table( code_table, notdef_index, - swap_table->elements[1], - swap_table->lengths [1] ); - if ( error ) - goto Fail; - - error = T1_Add_Table( name_table, 0, - swap_table->elements[2], - swap_table->lengths [2] ); - if ( error ) - goto Fail; - - error = T1_Add_Table( code_table, 0, - swap_table->elements[3], - swap_table->lengths [3] ); - if ( error ) - goto Fail; - - } - + loader->num_glyphs = n; return; Fail: @@ -917,16 +770,14 @@ /* if the keyword has a dedicated callback, call it */ - if ( field->type == T1_FIELD_TYPE_CALLBACK ) - { + if ( field->type == T1_FIELD_TYPE_CALLBACK ) { field->reader( (FT_Face)face, loader ); error = loader->parser.root.error; goto Exit; } - /* now the keyword is either a simple field or a table of fields; */ - /* we are now going to take care of it */ - + /* now, the keyword is either a simple field, or a table of fields; */ + /* we are now going to take care of it */ switch ( field->location ) { case T1_FIELD_LOCATION_FONT_INFO: @@ -963,27 +814,28 @@ FT_Long size ) { T42_Parser parser = &loader->parser; - FT_Byte* limit; - FT_Int n_keywords = (FT_Int)( sizeof ( t42_keywords ) / - sizeof ( t42_keywords[0] ) ); + FT_Byte* cur = base; + FT_Byte* limit = cur + size; + FT_UInt n_keywords = (FT_UInt)( sizeof ( t42_keywords ) / + sizeof ( t42_keywords[0] ) ); + FT_Byte keyword_flags[T42_KEYWORD_COUNT]; + + { + FT_UInt n; + + + for ( n = 0; n < T42_KEYWORD_COUNT; n++ ) + keyword_flags[n] = 0; + } parser->root.cursor = base; parser->root.limit = base + size; - parser->root.error = T42_Err_Ok; + parser->root.error = 0; - limit = parser->root.limit; - - T1_Skip_Spaces( parser ); - - while ( parser->root.cursor < limit ) + for ( ; cur < limit; cur++ ) { - FT_Byte* cur; - - - cur = parser->root.cursor; - - /* look for `FontDirectory' which causes problems for some fonts */ + /* look for `FontDirectory', which causes problems on some fonts */ if ( *cur == 'F' && cur + 25 < limit && ft_strncmp( (char*)cur, "FontDirectory", 13 ) == 0 ) { @@ -991,21 +843,13 @@ /* skip the `FontDirectory' keyword */ - T1_Skip_PS_Token( parser ); - T1_Skip_Spaces ( parser ); - cur = cur2 = parser->root.cursor; + cur += 13; + cur2 = cur; - /* look up the `known' keyword */ - while ( cur < limit ) - { - if ( *cur == 'k' && cur + 5 < limit && - ft_strncmp( (char*)cur, "known", 5 ) == 0 ) - break; - - T1_Skip_PS_Token( parser ); - T1_Skip_Spaces ( parser ); - cur = parser->root.cursor; - } + /* lookup the `known' keyword */ + while ( cur < limit && *cur != 'k' && + ft_strncmp( (char*)cur, "known", 5 ) ) + cur++; if ( cur < limit ) { @@ -1013,37 +857,34 @@ /* skip the `known' keyword and the token following it */ - T1_Skip_PS_Token( parser ); - T1_ToToken( parser, &token ); + cur += 5; + loader->parser.root.cursor = cur; + T1_ToToken( &loader->parser, &token ); /* if the last token was an array, skip it! */ if ( token.type == T1_TOKEN_TYPE_ARRAY ) cur2 = parser->root.cursor; } - parser->root.cursor = cur2; + cur = cur2; } - /* look for immediates */ else if ( *cur == '/' && cur + 2 < limit ) { - FT_PtrDist len; + FT_Byte* cur2; + FT_UInt i, len; cur++; + cur2 = cur; + while ( cur2 < limit && t42_is_alpha( *cur2 ) ) + cur2++; - parser->root.cursor = cur; - T1_Skip_PS_Token( parser ); - - len = parser->root.cursor - cur; - - if ( len > 0 && len < 22 && parser->root.cursor < limit ) + len = (FT_UInt)( cur2 - cur ); + if ( len > 0 && len < 22 ) /* XXX What shall it this 22? */ { - int i; + /* now, compare the immediate name to the keyword table */ - - /* now compare the immediate name to the keyword table */ - - /* loop through all known keywords */ + /* Loop through all known keywords */ for ( i = 0; i < n_keywords; i++ ) { T1_Field keyword = (T1_Field)&t42_keywords[i]; @@ -1053,27 +894,32 @@ if ( !name ) continue; - if ( cur[0] == name[0] && - len == ft_strlen( (const char *)name ) && - ft_memcmp( cur, name, len ) == 0 ) + if ( ( len == ft_strlen( (const char *)name ) ) && + ( ft_memcmp( cur, name, len ) == 0 ) ) { /* we found it -- run the parsing callback! */ - parser->root.error = t42_load_keyword( face, - loader, - keyword ); - if ( parser->root.error ) - return parser->root.error; + parser->root.cursor = cur2; + T1_Skip_Spaces( parser ); + + /* only record the first instance of each field/keyword */ + /* to deal with synthetic fonts correctly */ + if ( keyword_flags[i] == 0 ) + { + parser->root.error = t42_load_keyword(face, + loader, + keyword ); + if ( parser->root.error ) + return parser->root.error; + } + keyword_flags[i] = 1; + + cur = parser->root.cursor; break; } } } } - else - T1_Skip_PS_Token( parser ); - - T1_Skip_Spaces( parser ); } - return parser->root.error; } @@ -1105,7 +951,6 @@ T1_Release_Table( &loader->encoding_table ); T1_Release_Table( &loader->charstrings ); T1_Release_Table( &loader->glyph_names ); - T1_Release_Table( &loader->swap_table ); /* finalize parser */ t42_parser_done( parser ); diff --git a/reactos/lib/freetype/src/type42/t42parse.h b/reactos/lib/freetype/src/type42/t42parse.h index f77ec4af4f4..7339aa63b52 100644 --- a/reactos/lib/freetype/src/type42/t42parse.h +++ b/reactos/lib/freetype/src/type42/t42parse.h @@ -33,7 +33,7 @@ FT_BEGIN_HEADER FT_Byte* base_dict; FT_Long base_len; - FT_Bool in_memory; + FT_Byte in_memory; } T42_ParserRec, *T42_Parser; @@ -42,14 +42,13 @@ FT_BEGIN_HEADER { T42_ParserRec parser; /* parser used to read the stream */ - FT_UInt num_chars; /* number of characters in encoding */ + FT_Int num_chars; /* number of characters in encoding */ PS_TableRec encoding_table; /* PS_Table used to store the */ /* encoding character names */ - FT_UInt num_glyphs; + FT_Int num_glyphs; PS_TableRec glyph_names; PS_TableRec charstrings; - PS_TableRec swap_table; /* For moving .notdef glyph to index 0. */ } T42_LoaderRec, *T42_Loader; diff --git a/reactos/lib/freetype/src/type42/t42types.h b/reactos/lib/freetype/src/type42/t42types.h deleted file mode 100644 index d44ac4e671f..00000000000 --- a/reactos/lib/freetype/src/type42/t42types.h +++ /dev/null @@ -1,54 +0,0 @@ -/***************************************************************************/ -/* */ -/* t42types.h */ -/* */ -/* Type 42 font data types (specification only). */ -/* */ -/* Copyright 2002, 2003 by Roberto Alameda. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __T42TYPES_H__ -#define __T42TYPES_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_TYPE1_TABLES_H -#include FT_INTERNAL_TYPE1_TYPES_H -#include FT_INTERNAL_POSTSCRIPT_HINTS_H - - -FT_BEGIN_HEADER - - - typedef struct T42_FaceRec_ - { - FT_FaceRec root; - T1_FontRec type1; - const void* psnames; - const void* psaux; - const void* afm_data; - FT_Byte* ttf_data; - FT_ULong ttf_size; - FT_Face ttf_face; - FT_CharMapRec charmaprecs[2]; - FT_CharMap charmaps[2]; - PS_Unicodes unicode_map; - - } T42_FaceRec, *T42_Face; - - -FT_END_HEADER - -#endif /* __T1TYPES_H__ */ - - -/* END */ diff --git a/reactos/lib/freetype/src/winfonts/winfnt.c b/reactos/lib/freetype/src/winfonts/winfnt.c index abca96a5a14..b2e315f63cd 100644 --- a/reactos/lib/freetype/src/winfonts/winfnt.c +++ b/reactos/lib/freetype/src/winfonts/winfnt.c @@ -4,7 +4,7 @@ /* */ /* FreeType font driver for Windows FNT/FON files */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* Copyright 1996-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -21,11 +21,12 @@ #include FT_INTERNAL_DEBUG_H #include FT_INTERNAL_STREAM_H #include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_FNT_TYPES_H #include "winfnt.h" + #include "fnterrs.h" -#include FT_SERVICE_WINFNT_H -#include FT_SERVICE_XFREE86_NAME_H + /*************************************************************************/ /* */ @@ -37,7 +38,8 @@ #define FT_COMPONENT trace_winfnt - static const FT_Frame_Field winmz_header_fields[] = + static + const FT_Frame_Field winmz_header_fields[] = { #undef FT_STRUCTURE #define FT_STRUCTURE WinMZ_HeaderRec @@ -49,7 +51,8 @@ FT_FRAME_END }; - static const FT_Frame_Field winne_header_fields[] = + static + const FT_Frame_Field winne_header_fields[] = { #undef FT_STRUCTURE #define FT_STRUCTURE WinNE_HeaderRec @@ -62,12 +65,13 @@ FT_FRAME_END }; - static const FT_Frame_Field winfnt_header_fields[] = + static + const FT_Frame_Field winfnt_header_fields[] = { #undef FT_STRUCTURE #define FT_STRUCTURE FT_WinFNT_HeaderRec - FT_FRAME_START( 148 ), + FT_FRAME_START( 146 ), FT_FRAME_USHORT_LE( version ), FT_FRAME_ULONG_LE ( file_size ), FT_FRAME_BYTES ( copyright, 60 ), @@ -102,7 +106,7 @@ FT_FRAME_USHORT_LE( A_space ), FT_FRAME_USHORT_LE( B_space ), FT_FRAME_USHORT_LE( C_space ), - FT_FRAME_ULONG_LE ( color_table_offset ), + FT_FRAME_USHORT_LE( color_table_offset ), FT_FRAME_BYTES ( reserved1, 16 ), FT_FRAME_END }; @@ -133,8 +137,6 @@ { FT_Error error; FT_WinFNT_Header header = &font->header; - FT_Bool new_format; - FT_UInt size; /* first of all, read the FNT header */ @@ -151,16 +153,6 @@ goto Exit; } - new_format = FT_BOOL( font->header.version == 0x300 ); - size = new_format ? 148 : 118; - - if ( header->file_size < size ) - { - FT_TRACE2(( "[not a valid FNT file]\n" )); - error = FNT_Err_Unknown_File_Format; - goto Exit; - } - /* Version 2 doesn't have these fields */ if ( header->version == 0x200 ) { @@ -369,7 +361,7 @@ } - static const FT_CMap_ClassRec fnt_cmap_class_rec = + static FT_CMap_ClassRec fnt_cmap_class_rec = { sizeof ( FNT_CMapRec ), @@ -379,7 +371,7 @@ (FT_CMap_CharNextFunc) fnt_cmap_char_next }; - static FT_CMap_Class const fnt_cmap_class = &fnt_cmap_class_rec; + static FT_CMap_Class fnt_cmap_class = &fnt_cmap_class_rec; static void @@ -461,10 +453,10 @@ bsize->width = font->header.avg_width; - bsize->height = (FT_Short)( - font->header.pixel_height + font->header.external_leading ); + bsize->height = + font->header.pixel_height + font->header.external_leading; bsize->size = font->header.nominal_point_size << 6; - bsize->x_ppem = + bsize->x_ppem = (FT_Pos)( ( font->header.horizontal_resolution * bsize->size + 36 ) / 72 ); bsize->y_ppem = @@ -476,18 +468,11 @@ FT_CharMapRec charmap; - charmap.encoding = FT_ENCODING_NONE; - charmap.platform_id = 0; - charmap.encoding_id = 0; + charmap.encoding = FT_ENCODING_UNICODE; + charmap.platform_id = 3; + charmap.encoding_id = 1; charmap.face = root; - if ( font->header.charset == FT_WinFNT_ID_MAC ) - { - charmap.encoding = FT_ENCODING_APPLE_ROMAN; - charmap.platform_id = 1; -/* charmap.encoding_id = 0; */ - } - error = FT_CMap_New( fnt_cmap_class, NULL, &charmap, @@ -543,8 +528,8 @@ size->metrics.ascender = font->header.ascent * 64; - size->metrics.descender = -( font->header.pixel_height - - font->header.ascent ) * 64; + size->metrics.descender = ( font->header.pixel_height - + font->header.ascent ) * 64; size->metrics.height = font->header.pixel_height * 64; size->metrics.max_advance = font->header.max_width * 64; @@ -588,7 +573,7 @@ len = new_format ? 6 : 4; /* jump to glyph entry */ - p = font->fnt_frame + ( new_format ? 148 : 118 ) + len * glyph_index; + p = font->fnt_frame + ( new_format ? 146 : 118 ) + len * glyph_index; bitmap->width = FT_NEXT_SHORT_LE( p ); @@ -597,13 +582,6 @@ else offset = FT_NEXT_USHORT_LE( p ); - if ( offset >= font->header.file_size ) - { - FT_TRACE2(( "invalid FNT offset!\n" )); - error = FNT_Err_Invalid_File_Format; - goto Exit; - } - /* jump to glyph data */ p = font->fnt_frame + /* font->header.bits_offset */ + offset; @@ -654,49 +632,6 @@ } - static FT_Error - winfnt_get_header( FT_Face face, - FT_WinFNT_HeaderRec *aheader ) - { - FNT_Font font = ((FNT_Face)face)->font; - - - *aheader = font->header; - - return 0; - } - - - static const FT_Service_WinFntRec winfnt_service_rec = - { - winfnt_get_header - }; - - /* - * SERVICE LIST - * - */ - - static const FT_ServiceDescRec winfnt_services[] = - { - { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_WINFNT }, - { FT_SERVICE_ID_WINFNT, &winfnt_service_rec }, - { NULL, NULL } - }; - - - static FT_Module_Interface - winfnt_get_service( FT_Driver driver, - const FT_String* service_id ) - { - FT_UNUSED( driver ); - - return ft_service_list_lookup( winfnt_services, service_id ); - } - - - - FT_CALLBACK_TABLE_DEF const FT_Driver_ClassRec winfnt_driver_class = { @@ -713,7 +648,7 @@ (FT_Module_Constructor)0, (FT_Module_Destructor) 0, - (FT_Module_Requester) winfnt_get_service + (FT_Module_Requester) 0 }, sizeof( FNT_FaceRec ), diff --git a/reactos/lib/freetype/src/winfonts/winfnt.h b/reactos/lib/freetype/src/winfonts/winfnt.h index f36901e916a..4ba85e0b233 100644 --- a/reactos/lib/freetype/src/winfonts/winfnt.h +++ b/reactos/lib/freetype/src/winfonts/winfnt.h @@ -4,7 +4,7 @@ /* */ /* FreeType font driver for Windows FNT/FON files */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -21,78 +21,11 @@ #include <ft2build.h> -#include FT_WINFONTS_H #include FT_INTERNAL_DRIVER_H FT_BEGIN_HEADER - typedef struct WinMZ_HeaderRec_ - { - FT_UShort magic; - /* skipped content */ - FT_UShort lfanew; - - } WinMZ_HeaderRec; - - - typedef struct WinNE_HeaderRec_ - { - FT_UShort magic; - /* skipped content */ - FT_UShort resource_tab_offset; - FT_UShort rname_tab_offset; - - } WinNE_HeaderRec; - - - typedef struct WinNameInfoRec_ - { - FT_UShort offset; - FT_UShort length; - FT_UShort flags; - FT_UShort id; - FT_UShort handle; - FT_UShort usage; - - } WinNameInfoRec; - - - typedef struct WinResourceInfoRec_ - { - FT_UShort type_id; - FT_UShort count; - - } WinResourceInfoRec; - - -#define WINFNT_MZ_MAGIC 0x5A4D -#define WINFNT_NE_MAGIC 0x454E - - - typedef struct FNT_FontRec_ - { - FT_ULong offset; - FT_Int size_shift; - - FT_WinFNT_HeaderRec header; - - FT_Byte* fnt_frame; - FT_ULong fnt_size; - - } FNT_FontRec, *FNT_Font; - - - typedef struct FNT_FaceRec_ - { - FT_FaceRec root; - FNT_Font font; - - FT_CharMap charmap_handle; - FT_CharMapRec charmap; /* a single charmap per face */ - - } FNT_FaceRec, *FNT_Face; - FT_EXPORT_VAR( const FT_Driver_ClassRec ) winfnt_driver_class; From e410002732a246f5387a0ecffe0627a380438b22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Sun, 15 Feb 2004 21:57:34 +0000 Subject: [PATCH 0046/1463] Don't build kernel32 test because of build failure svn path=/trunk/; revision=8203 --- reactos/apps/tests/Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/apps/tests/Makefile b/reactos/apps/tests/Makefile index 04a842f5045..1b6c8426129 100644 --- a/reactos/apps/tests/Makefile +++ b/reactos/apps/tests/Makefile @@ -9,13 +9,15 @@ include $(PATH_TO_TOP)/rules.mak # test_old tests TEST_APPS = accelerator alive apc args atomtest bench bitblt button \ button2 capclock carets combo consume copymove count dibtest dump_shared_data \ -edit enumwnd enumws event global_mem gradient hello kernel32 mdi \ +edit enumwnd enumws event global_mem gradient hello mdi \ hivetest icontest isotest lineclip linetest lpc \ mktime mstest multithrdwin multiwin mutex nptest patblt primitives pteb \ regtest sectest sertest shaptest shm statst statst2 stretchblt suspend \ tcpsvr terminate txtscale thread thread_msg tokentest user32 vmtest \ winhello wm_erasebkgnd wm_paint eventpair threadwait popupmenu \ map_dup_inherit p_dup_handle apc2 enhmetafile dirdlg guithreadinfo +# Build failure: +# kernel32 TEST_MISC = From 02f6c6d6eee8ff01c3901cef90a41aee96f286ba Mon Sep 17 00:00:00 2001 From: Richard Campbell <betam4x@gmail.com> Date: Mon, 16 Feb 2004 01:30:38 +0000 Subject: [PATCH 0047/1463] advapi dependency. svn path=/trunk/; revision=8204 --- reactos/lib/user32/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/user32/Makefile b/reactos/lib/user32/Makefile index c80a14529be..3a19ccb6c3f 100644 --- a/reactos/lib/user32/Makefile +++ b/reactos/lib/user32/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.34 2004/01/03 23:34:17 sedwards Exp $ +# $Id: Makefile,v 1.35 2004/02/16 01:30:38 rcampbell Exp $ PATH_TO_TOP = ../.. @@ -8,7 +8,7 @@ TARGET_NAME = user32 TARGET_BASE = 0x77e70000 -TARGET_SDKLIBS = libwine.a ntdll.a kernel32.a gdi32.a rosrtl.a +TARGET_SDKLIBS = libwine.a ntdll.a kernel32.a gdi32.a rosrtl.a advapi32.a TARGET_CFLAGS = \ -I./include \ From fcb45adac8bba8133d7745d5d51cde8dd86a87fc Mon Sep 17 00:00:00 2001 From: Richard Campbell <betam4x@gmail.com> Date: Mon, 16 Feb 2004 07:25:01 +0000 Subject: [PATCH 0048/1463] SystemParametersInfo: - SPI_GETNONCLIENTMETRICS and SPI_GETICONTITLELOGFONT now load their settings from the registry. - SPI_SET* aren't yet implemented, because i'd like to test my implementation before i commit them. svn path=/trunk/; revision=8206 --- reactos/lib/user32/include/user32.h | 3 ++ reactos/lib/user32/misc/desktop.c | 73 ++++++++++++++++++++++++++++- reactos/subsys/win32k/ntuser/misc.c | 33 +------------ 3 files changed, 75 insertions(+), 34 deletions(-) diff --git a/reactos/lib/user32/include/user32.h b/reactos/lib/user32/include/user32.h index 1b32e4ef497..d44f29edf27 100644 --- a/reactos/lib/user32/include/user32.h +++ b/reactos/lib/user32/include/user32.h @@ -82,3 +82,6 @@ void DrawCaret(HWND hWnd, PTHRDCARETINFO CaretInfo); #define NtUserGetWindowContextHelpId(hwnd) \ NtUserCallOneParam((DWORD)hwnd, ONEPARAM_ROUTINE_GETWNDCONTEXTHLPID) +LONG WINAPI RegCloseKey(HKEY); +LONG WINAPI RegOpenKeyExW(HKEY,LPCWSTR,DWORD,REGSAM,PHKEY); +LONG WINAPI RegQueryValueExW(HKEY,LPCWSTR,LPDWORD,LPDWORD,LPBYTE,LPDWORD); diff --git a/reactos/lib/user32/misc/desktop.c b/reactos/lib/user32/misc/desktop.c index a51af63df8b..84aeef7927d 100644 --- a/reactos/lib/user32/misc/desktop.c +++ b/reactos/lib/user32/misc/desktop.c @@ -1,4 +1,4 @@ -/* $Id: desktop.c,v 1.28 2004/01/23 23:38:26 ekohl Exp $ +/* $Id: desktop.c,v 1.29 2004/02/16 07:25:01 rcampbell Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -14,6 +14,8 @@ #include <debug.h> #include <rosrtl/devmode.h> #include <rosrtl/logfont.h> +#include <malloc.h> + /* * @implemented @@ -87,6 +89,22 @@ SystemParametersInfoA(UINT uiAction, } +BOOL IntGetFontMetricSetting(LPCWSTR lpKey, PLOGFONTW font) +{ + HKEY hKey; + DWORD dwType = REG_BINARY; + DWORD dwSize = sizeof(LOGFONTW); + BOOL bRet = FALSE; + if ( RegOpenKeyExW(HKEY_CURRENT_USER, L"Control Panel\\Desktop\\WindowMetrics", 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS ) + { + if ( RegQueryValueExW(hKey, lpKey, NULL, &dwType, (LPBYTE)font, &dwSize) == ERROR_SUCCESS ) + bRet = TRUE; + } + + RegCloseKey(hKey); + return bRet; +} + /* * @implemented */ @@ -96,7 +114,58 @@ SystemParametersInfoW(UINT uiAction, PVOID pvParam, UINT fWinIni) { - return NtUserSystemParametersInfo(uiAction, uiParam, pvParam, fWinIni); + static LOGFONTW IconFont; + static NONCLIENTMETRICSW pMetrics; + static BOOL bInitialized = FALSE; + + if (!bInitialized) + { + ZeroMemory(&IconFont, sizeof(LOGFONTW)); + ZeroMemory(&pMetrics, sizeof(NONCLIENTMETRICSW)); + + IntGetFontMetricSetting(L"CaptionFont", &pMetrics.lfCaptionFont); + IntGetFontMetricSetting(L"SmCaptionFont", &pMetrics.lfSmCaptionFont); + IntGetFontMetricSetting(L"MenuFont", &pMetrics.lfMenuFont); + IntGetFontMetricSetting(L"StatusFont", &pMetrics.lfStatusFont); + IntGetFontMetricSetting(L"MessageFont", &pMetrics.lfStatusFont); + IntGetFontMetricSetting(L"IconFont", &IconFont); + + pMetrics.iBorderWidth = 1; + pMetrics.iScrollWidth = NtUserGetSystemMetrics(SM_CXVSCROLL); + pMetrics.iScrollHeight = NtUserGetSystemMetrics(SM_CYHSCROLL); + pMetrics.iCaptionWidth = NtUserGetSystemMetrics(SM_CXSIZE); + pMetrics.iCaptionHeight = NtUserGetSystemMetrics(SM_CYSIZE); + pMetrics.iSmCaptionWidth = NtUserGetSystemMetrics(SM_CXSMSIZE); + pMetrics.iSmCaptionHeight = NtUserGetSystemMetrics(SM_CYSMSIZE); + pMetrics.iMenuWidth = NtUserGetSystemMetrics(SM_CXMENUSIZE); + pMetrics.iMenuHeight = NtUserGetSystemMetrics(SM_CYMENUSIZE); + pMetrics.cbSize = sizeof(LPNONCLIENTMETRICSW); + + bInitialized = TRUE; + } + switch(uiAction) + { + + case SPI_GETICONTITLELOGFONT: + { + memcpy(pvParam, (PVOID)&IconFont, sizeof(LOGFONTW)); + return TRUE; + } + case SPI_GETNONCLIENTMETRICS: + { + /* FIXME: Is this windows default behavior? */ + LPNONCLIENTMETRICSW lpMetrics = (LPNONCLIENTMETRICSW)pvParam; + if ( lpMetrics->cbSize != sizeof(NONCLIENTMETRICSW) || + uiParam != sizeof(NONCLIENTMETRICSW )) + { + return FALSE; + } + memcpy(pvParam, (PVOID)&pMetrics, sizeof(NONCLIENTMETRICSW)); + return TRUE; + } + default: + return NtUserSystemParametersInfo(uiAction, uiParam, pvParam, fWinIni); + } } diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index 35325d45513..4b9a23437d8 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.49 2004/02/15 07:39:12 gvg Exp $ +/* $Id: misc.c,v 1.50 2004/02/16 07:25:01 rcampbell Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -548,37 +548,6 @@ NtUserSystemParametersInfo( } return TRUE; } - case SPI_GETNONCLIENTMETRICS: - { - /* FIXME - use MmCopyToCaller() !!! */ - LPNONCLIENTMETRICSW pMetrics = (LPNONCLIENTMETRICSW)pvParam; - - if (pMetrics->cbSize != sizeof(NONCLIENTMETRICSW) || - uiParam != sizeof(NONCLIENTMETRICSW)) - { - return FALSE; - } - - memset((char *)pvParam + sizeof(pMetrics->cbSize), 0, - pMetrics->cbSize - sizeof(pMetrics->cbSize)); - - pMetrics->iBorderWidth = 1; - pMetrics->iScrollWidth = NtUserGetSystemMetrics(SM_CXVSCROLL); - pMetrics->iScrollHeight = NtUserGetSystemMetrics(SM_CYHSCROLL); - pMetrics->iCaptionWidth = NtUserGetSystemMetrics(SM_CXSIZE); - pMetrics->iCaptionHeight = NtUserGetSystemMetrics(SM_CYSIZE); - memcpy((LPVOID)&(pMetrics->lfCaptionFont), &CaptionFont, sizeof(CaptionFont)); - pMetrics->lfCaptionFont.lfWeight = FW_BOLD; - pMetrics->iSmCaptionWidth = NtUserGetSystemMetrics(SM_CXSMSIZE); - pMetrics->iSmCaptionHeight = NtUserGetSystemMetrics(SM_CYSMSIZE); - memcpy((LPVOID)&(pMetrics->lfSmCaptionFont), &CaptionFont, sizeof(CaptionFont)); - pMetrics->iMenuWidth = NtUserGetSystemMetrics(SM_CXMENUSIZE); - pMetrics->iMenuHeight = NtUserGetSystemMetrics(SM_CYMENUSIZE); - memcpy((LPVOID)&(pMetrics->lfMenuFont), &CaptionFont, sizeof(CaptionFont)); - memcpy((LPVOID)&(pMetrics->lfStatusFont), &CaptionFont, sizeof(CaptionFont)); - memcpy((LPVOID)&(pMetrics->lfMessageFont), &CaptionFont, sizeof(CaptionFont)); - return TRUE; - } case SPI_GETGRADIENTCAPTIONS: { HDC hDC; From 2af64c018676e99e5e2063b03234ad1c775a29ce Mon Sep 17 00:00:00 2001 From: Richard Campbell <betam4x@gmail.com> Date: Mon, 16 Feb 2004 07:26:25 +0000 Subject: [PATCH 0049/1463] NtUserSystemParametersInfo: - Removed static font variables. svn path=/trunk/; revision=8207 --- reactos/subsys/win32k/ntuser/misc.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index 4b9a23437d8..a426c692525 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.50 2004/02/16 07:25:01 rcampbell Exp $ +/* $Id: misc.c,v 1.51 2004/02/16 07:26:25 rcampbell Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -453,13 +453,6 @@ NtUserSystemParametersInfo( UINT fWinIni) { static BOOL GradientCaptions = TRUE; - /* FIXME: This should be obtained from the registry */ - static LOGFONTW CaptionFont = - { 11, 0, 0, 0, FW_HEAVY, FALSE, FALSE, FALSE, ANSI_CHARSET, - 0, 0, DEFAULT_QUALITY, VARIABLE_PITCH, L"Bitstream Vera Sans" }; - static LOGFONTW IconFont = - { 10, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, - 0, 0, DEFAULT_QUALITY, VARIABLE_PITCH, L"Bitstream Vera Sans" }; NTSTATUS Status; PWINSTATION_OBJECT WinStaObject; From 583ae62ff81d91d6efa03539449f8a61edf343ca Mon Sep 17 00:00:00 2001 From: Richard Campbell <betam4x@gmail.com> Date: Mon, 16 Feb 2004 11:16:06 +0000 Subject: [PATCH 0050/1463] NtUserSystemParametersInfo: - removed a case statement, it is now handled in USER32 svn path=/trunk/; revision=8210 --- reactos/subsys/win32k/ntuser/misc.c | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index a426c692525..80067415d43 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.51 2004/02/16 07:26:25 rcampbell Exp $ +/* $Id: misc.c,v 1.52 2004/02/16 11:16:06 rcampbell Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -529,16 +529,6 @@ NtUserSystemParametersInfo( return FALSE; } - return TRUE; - } - case SPI_GETICONTITLELOGFONT: - { - Status = MmCopyToCaller(pvParam, &IconFont, sizeof(IconFont)); - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return FALSE; - } return TRUE; } case SPI_GETGRADIENTCAPTIONS: From 596a4b878e9fd85a33d2a673afe7a62e09248a53 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Mon, 16 Feb 2004 21:46:12 +0000 Subject: [PATCH 0051/1463] merged Wine commits to shell32 svn path=/trunk/; revision=8211 --- reactos/include/wine/shlobj.h | 78 ++++++++++++ reactos/lib/shell32/iconcache.c | 8 +- reactos/lib/shell32/pidl.c | 15 +-- reactos/lib/shell32/shell.c | 15 +-- reactos/lib/shell32/shell32_main.h | 2 +- reactos/lib/shell32/shellord.c | 2 +- reactos/lib/shell32/shellstring.c | 50 ++++---- reactos/lib/shell32/shlexec.c | 4 +- reactos/lib/shell32/shlview.c | 2 +- reactos/lib/shell32/undocshell.h | 188 +---------------------------- 10 files changed, 124 insertions(+), 240 deletions(-) diff --git a/reactos/include/wine/shlobj.h b/reactos/include/wine/shlobj.h index d674203d249..5a3714800a8 100644 --- a/reactos/include/wine/shlobj.h +++ b/reactos/include/wine/shlobj.h @@ -34,6 +34,34 @@ extern "C" { #include <shobjidl.h> +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); @@ -872,6 +900,56 @@ struct IFileSystemBindDataVtbl { #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) */ diff --git a/reactos/lib/shell32/iconcache.c b/reactos/lib/shell32/iconcache.c index 45d77f48deb..a5ea881698d 100644 --- a/reactos/lib/shell32/iconcache.c +++ b/reactos/lib/shell32/iconcache.c @@ -347,7 +347,7 @@ BOOL PidlToSicIndex ( LPCITEMIDLIST pidl, BOOL bBigIcon, UINT uFlags, - UINT * pIndex) + int * pIndex) { IExtractIconA *ei; char szIconFile[MAX_PATH]; /* file containing the icon */ @@ -383,11 +383,11 @@ BOOL PidlToSicIndex ( * */ int WINAPI SHMapPIDLToSystemImageListIndex( - LPSHELLFOLDER sh, + IShellFolder *sh, LPCITEMIDLIST pidl, - UINT * pIndex) + int *pIndex) { - UINT Index; + int Index; TRACE("(SF=%p,pidl=%p,%p)\n",sh,pidl,pIndex); pdump(pidl); diff --git a/reactos/lib/shell32/pidl.c b/reactos/lib/shell32/pidl.c index 48ab6652c5c..29f11875ade 100644 --- a/reactos/lib/shell32/pidl.c +++ b/reactos/lib/shell32/pidl.c @@ -764,10 +764,10 @@ LPITEMIDLIST WINAPI SHLogILFromFSIL(LPITEMIDLIST pidl) * NOTES * exported by ordinal */ -DWORD WINAPI ILGetSize(LPCITEMIDLIST pidl) +UINT WINAPI ILGetSize(LPCITEMIDLIST pidl) { LPCSHITEMID si = &(pidl->mkid); - DWORD len=0; + UINT len=0; if (pidl) { while (si->cb) @@ -776,7 +776,7 @@ DWORD WINAPI ILGetSize(LPCITEMIDLIST pidl) } len += 2; } - TRACE("pidl=%p size=%lu\n",pidl, len); + TRACE("pidl=%p size=%u\n",pidl, len); return len; } @@ -871,13 +871,10 @@ LPITEMIDLIST WINAPI ILAppend(LPITEMIDLIST pidl, LPCITEMIDLIST item, BOOL bEnd) * NOTES * exported by ordinal */ -DWORD WINAPI ILFree(LPITEMIDLIST pidl) +void WINAPI ILFree(LPITEMIDLIST pidl) { - TRACE("(pidl=0x%08lx)\n",(DWORD)pidl); - - if(!pidl) return FALSE; - SHFree(pidl); - return TRUE; + TRACE("(pidl=%p)\n",pidl); + if(pidl) SHFree(pidl); } /************************************************************************* diff --git a/reactos/lib/shell32/shell.c b/reactos/lib/shell32/shell.c index 9aa46e5fdd2..419e2fd0ab2 100644 --- a/reactos/lib/shell32/shell.c +++ b/reactos/lib/shell32/shell.c @@ -633,17 +633,10 @@ HINSTANCE16 WINAPI ShellExecute16( HWND16 hWnd, LPCSTR lpOperation, WCHAR *wVerb = NULL, *wFile = NULL, *wParameters = NULL, *wDirectory = NULL; HANDLE hProcess = 0; - if (lpOperation) - seiW.lpVerb = __SHCloneStrAtoW(&wVerb, lpOperation); - - if (lpFile) - seiW.lpFile = __SHCloneStrAtoW(&wFile, lpFile); - - if (lpParameters) - seiW.lpParameters = __SHCloneStrAtoW(&wParameters, lpParameters); - - if (lpDirectory) - seiW.lpDirectory = __SHCloneStrAtoW(&wDirectory, lpDirectory); + seiW.lpVerb = lpOperation ? __SHCloneStrAtoW(&wVerb, lpOperation) : NULL; + seiW.lpFile = lpFile ? __SHCloneStrAtoW(&wFile, lpFile) : NULL; + seiW.lpParameters = lpParameters ? __SHCloneStrAtoW(&wParameters, lpParameters) : NULL; + seiW.lpDirectory = lpDirectory ? __SHCloneStrAtoW(&wDirectory, lpDirectory) : NULL; seiW.cbSize = sizeof(seiW); seiW.fMask = 0; diff --git a/reactos/lib/shell32/shell32_main.h b/reactos/lib/shell32/shell32_main.h index 6709f0b3fd9..33f52cbb575 100644 --- a/reactos/lib/shell32/shell32_main.h +++ b/reactos/lib/shell32/shell32_main.h @@ -52,7 +52,7 @@ BOOL WINAPI Shell_GetImageList(HIMAGELIST * lpBigList, HIMAGELIST * lpSmallList) #define INVALID_INDEX -1 BOOL SIC_Initialize(void); void SIC_Destroy(void); -BOOL PidlToSicIndex (IShellFolder * sh, LPCITEMIDLIST pidl, BOOL bBigIcon, UINT uFlags, UINT * pIndex); +BOOL PidlToSicIndex (IShellFolder * sh, LPCITEMIDLIST pidl, BOOL bBigIcon, UINT uFlags, int * pIndex); INT SIC_GetIconIndex (LPCSTR sSourceFile, INT dwSourceIndex ); /* Classes Root */ diff --git a/reactos/lib/shell32/shellord.c b/reactos/lib/shell32/shellord.c index 6dcafbfe9bb..894de4dcf01 100644 --- a/reactos/lib/shell32/shellord.c +++ b/reactos/lib/shell32/shellord.c @@ -1025,7 +1025,7 @@ void WINAPI SHFreeUnusedLibraries (void) * DAD_AutoScroll [SHELL32.129] * */ -DWORD WINAPI DAD_AutoScroll(HWND hwnd, LPSCROLLSAMPLES samples, LPPOINT pt) +BOOL WINAPI DAD_AutoScroll(HWND hwnd, AUTO_SCROLL_DATA *samples, LPPOINT pt) { FIXME("hwnd = %p %p %p\n",hwnd,samples,pt); return 0; diff --git a/reactos/lib/shell32/shellstring.c b/reactos/lib/shell32/shellstring.c index d48f707c0f6..3581768d72d 100644 --- a/reactos/lib/shell32/shellstring.c +++ b/reactos/lib/shell32/shellstring.c @@ -44,16 +44,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell); /************************* STRRET functions ****************************/ -/* - * ***** NOTE ***** - * These routines are identical to StrRetToBuf[AW] in dlls/shlwapi/string.c. - * They were duplicated here because not every version of Shlwapi.dll exports - * StrRetToBuf[AW]. If you change one routine, change them both. YOU HAVE BEEN - * WARNED. - * ***** NOTE ***** - */ - -HRESULT WINAPI StrRetToStrNA (LPVOID dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl) +BOOL WINAPI StrRetToStrNA(LPSTR dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl) { TRACE("dest=%p len=0x%lx strret=%p(%s) pidl=%p\n", dest,len,src, @@ -62,33 +53,36 @@ HRESULT WINAPI StrRetToStrNA (LPVOID dest, DWORD len, LPSTRRET src, const ITEMID (src->uType == STRRET_OFFSET) ? "STRRET_OFFSET" : "STRRET_???", pidl); + if (!dest) + return FALSE; + switch (src->uType) { case STRRET_WSTR: - WideCharToMultiByte(CP_ACP, 0, src->u.pOleStr, -1, (LPSTR)dest, len, NULL, NULL); + WideCharToMultiByte(CP_ACP, 0, src->u.pOleStr, -1, dest, len, NULL, NULL); CoTaskMemFree(src->u.pOleStr); break; case STRRET_CSTR: - lstrcpynA((LPSTR)dest, src->u.cStr, len); + lstrcpynA(dest, src->u.cStr, len); break; case STRRET_OFFSET: - lstrcpynA((LPSTR)dest, ((LPCSTR)&pidl->mkid)+src->u.uOffset, len); + lstrcpynA(dest, ((LPCSTR)&pidl->mkid)+src->u.uOffset, len); break; default: FIXME("unknown type!\n"); - if (len) *(LPSTR)dest = '\0'; - return(FALSE); + if (len) *dest = '\0'; + return FALSE; } TRACE("-- %s\n", debugstr_a(dest) ); - return S_OK; + return TRUE; } /************************************************************************/ -HRESULT WINAPI StrRetToStrNW (LPVOID dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl) +BOOL WINAPI StrRetToStrNW(LPWSTR dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl) { TRACE("dest=%p len=0x%lx strret=%p(%s) pidl=%p\n", dest,len,src, @@ -97,29 +91,32 @@ HRESULT WINAPI StrRetToStrNW (LPVOID dest, DWORD len, LPSTRRET src, const ITEMID (src->uType == STRRET_OFFSET) ? "STRRET_OFFSET" : "STRRET_???", pidl); + if (!dest) + return FALSE; + switch (src->uType) { case STRRET_WSTR: - lstrcpynW((LPWSTR)dest, src->u.pOleStr, len); + lstrcpynW(dest, src->u.pOleStr, len); CoTaskMemFree(src->u.pOleStr); break; case STRRET_CSTR: if (!MultiByteToWideChar( CP_ACP, 0, src->u.cStr, -1, dest, len ) && len) - ((LPWSTR)dest)[len-1] = 0; + dest[len-1] = 0; break; case STRRET_OFFSET: if (!MultiByteToWideChar( CP_ACP, 0, ((LPCSTR)&pidl->mkid)+src->u.uOffset, -1, dest, len ) && len) - ((LPWSTR)dest)[len-1] = 0; + dest[len-1] = 0; break; default: FIXME("unknown type!\n"); - if (len) *(LPWSTR)dest = '\0'; - return(FALSE); + if (len) *dest = '\0'; + return FALSE; } - return S_OK; + return TRUE; } @@ -131,11 +128,12 @@ HRESULT WINAPI StrRetToStrNW (LPVOID dest, DWORD len, LPSTRRET src, const ITEMID * NOTES * the pidl is for STRRET OFFSET */ -HRESULT WINAPI StrRetToStrNAW (LPVOID dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl) +BOOL WINAPI StrRetToStrNAW(LPVOID dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl) { if(SHELL_OsIsUnicode()) - return StrRetToStrNW (dest, len, src, pidl); - return StrRetToStrNA (dest, len, src, pidl); + return StrRetToStrNW(dest, len, src, pidl); + else + return StrRetToStrNA(dest, len, src, pidl); } /************************* OLESTR functions ****************************/ diff --git a/reactos/lib/shell32/shlexec.c b/reactos/lib/shell32/shlexec.c index ee1fdb93784..d25e156004a 100644 --- a/reactos/lib/shell32/shlexec.c +++ b/reactos/lib/shell32/shlexec.c @@ -332,6 +332,8 @@ static UINT SHELL_ExecuteW(const WCHAR *lpCmd, void *env, BOOL shWait, retval = ERROR_BAD_FORMAT; } + TRACE("returning %u\n", retval); + psei_out->hInstApp = (HINSTANCE)retval; return retval; } @@ -1260,7 +1262,7 @@ BOOL WINAPI ShellExecuteExW32 (LPSHELLEXECUTEINFOW psei, SHELL_ExecuteW32 execfu if (sei_tmp.lpIDList!=psei->lpIDList && sei_tmp.lpIDList) SHFree(sei_tmp.lpIDList); - TRACE("ShellExecuteExW32 retval=%d\n", retval); + TRACE("retval %u\n", retval); if (retval <= 32) { diff --git a/reactos/lib/shell32/shlview.c b/reactos/lib/shell32/shlview.c index ed451c80091..8dd25d54a88 100644 --- a/reactos/lib/shell32/shlview.c +++ b/reactos/lib/shell32/shlview.c @@ -1293,7 +1293,7 @@ static LRESULT ShellView_OnNotify(IShellViewImpl * This, UINT CtlID, LPNMHDR lpn } else /* LVN_GETDISPINFOW */ { - StrRetToStrNW( lpdi->item.pszText, lpdi->item.cchTextMax, &sd.str, NULL); + StrRetToStrNW( ((NMLVDISPINFOW *)lpdi)->item.pszText, lpdi->item.cchTextMax, &sd.str, NULL); TRACE("-- text=%s\n",debugstr_w((WCHAR*)(lpdi->item.pszText))); } } diff --git a/reactos/lib/shell32/undocshell.h b/reactos/lib/shell32/undocshell.h index aa4f36e4f54..695e15a205b 100644 --- a/reactos/lib/shell32/undocshell.h +++ b/reactos/lib/shell32/undocshell.h @@ -34,37 +34,6 @@ extern "C" { /**************************************************************************** * IDList Functions */ -LPITEMIDLIST WINAPI ILClone (LPCITEMIDLIST pidl); -LPITEMIDLIST WINAPI ILCloneFirst(LPCITEMIDLIST pidl); - -LPITEMIDLIST WINAPI ILCombine( - LPCITEMIDLIST iil1, - LPCITEMIDLIST iil2); - -DWORD WINAPI ILGetSize(LPCITEMIDLIST pidl); - -LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl); -LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl); -BOOL WINAPI ILRemoveLastID(LPCITEMIDLIST pidl); - -LPITEMIDLIST WINAPI ILFindChild( - LPCITEMIDLIST pidl1, - LPCITEMIDLIST pidl2); - -LPITEMIDLIST WINAPI ILAppendID( - LPITEMIDLIST pidl, - LPCSHITEMID lpItemID, - BOOL bAddToEnd); - -BOOL WINAPI ILIsEqual( - LPCITEMIDLIST pidl1, - LPCITEMIDLIST pidl2); - -BOOL WINAPI ILIsParent( - LPCITEMIDLIST pidlParent, - LPCITEMIDLIST pidlChild, - BOOL bImmediate); - BOOL WINAPI ILGetDisplayName( LPCITEMIDLIST pidl, LPVOID path); @@ -80,8 +49,6 @@ BOOL WINAPI ILGetDisplayNameEx( LPVOID path, DWORD type); -DWORD WINAPI ILFree(LPITEMIDLIST pidl); - HRESULT WINAPI ILSaveToStream( LPSTREAM pstrm, LPCITEMIDLIST pidl); @@ -95,7 +62,6 @@ void WINAPI ILGlobalFree(LPITEMIDLIST pidl); LPITEMIDLIST WINAPI SHSimpleIDListFromPathA (LPCSTR lpszPath); LPITEMIDLIST WINAPI SHSimpleIDListFromPathW (LPCWSTR lpszPath); -LPITEMIDLIST WINAPI SHSimpleIDListFromPathAW (LPCVOID lpszPath); HRESULT WINAPI SHILCreateFromPathA ( LPCSTR path, @@ -107,35 +73,14 @@ HRESULT WINAPI SHILCreateFromPathW ( LPITEMIDLIST * ppidl, DWORD *attributes); -HRESULT WINAPI SHILCreateFromPathAW ( - LPCVOID path, - LPITEMIDLIST * ppidl, - DWORD *attributes); - LPITEMIDLIST WINAPI ILCreateFromPathA(LPCSTR path); LPITEMIDLIST WINAPI ILCreateFromPathW(LPCWSTR path); -LPITEMIDLIST WINAPI ILCreateFromPathAW(LPCVOID path); /* string functions */ -HRESULT WINAPI StrRetToStrNA ( - LPVOID dest, - DWORD len, - LPSTRRET src, - const ITEMIDLIST *pidl); - -HRESULT WINAPI StrRetToStrNW ( - LPVOID dest, - DWORD len, - LPSTRRET src, - const ITEMIDLIST *pidl); - -HRESULT WINAPI StrRetToStrNAW ( - LPVOID dest, - DWORD len, - LPSTRRET src, - const ITEMIDLIST *pidl); +BOOL WINAPI StrRetToStrNA(LPSTR,DWORD,LPSTRRET,const ITEMIDLIST*); +BOOL WINAPI StrRetToStrNW(LPWSTR,DWORD,LPSTRRET,const ITEMIDLIST*); /**************************************************************************** @@ -196,24 +141,10 @@ BOOL WINAPI GetFileNameFromBrowse( LPCSTR lpstrFilter, LPCSTR lpstrTitle); -BOOL WINAPI SHFindFiles( - LPCITEMIDLIST pidlRoot, - LPCITEMIDLIST pidlSavedSearch); - BOOL WINAPI SHFindComputer( LPCITEMIDLIST pidlRoot, LPCITEMIDLIST pidlSavedSearch); -/* SHObjectProperties flags */ -#define OPF_PRINTERNAME 0x01 -#define OPF_PATHNAME 0x02 - -BOOL WINAPI SHObjectProperties( - HWND hwndOwner, - UINT uFlags, - LPCSTR lpstrName, - LPCSTR lpstrParameters); - void WINAPI SHHandleDiskFull(HWND hwndOwner, UINT uDrive); @@ -227,31 +158,10 @@ DWORD WINAPI SHNetConnectionDialog( LPCSTR lpstrRemoteName, DWORD dwType); -int WINAPIV ShellMessageBoxA( - HINSTANCE hInstance, - HWND hWnd, - LPCSTR lpText, - LPCSTR lpCaption, - UINT uType, - ...); - -int WINAPIV ShellMessageBoxW( - HINSTANCE hInstance, - HWND hWnd, - LPCWSTR lpText, - LPCWSTR lpCaption, - UINT uType, - ...); - -#define ShellMessageBox WINELIB_NAME_AW(ShellMessageBox) - /**************************************************************************** * Memory Routines */ -LPVOID WINAPI SHAlloc(ULONG cb); -void WINAPI SHFree(LPVOID pv); - HANDLE WINAPI SHAllocShared( LPVOID pv, ULONG cb, @@ -311,11 +221,6 @@ HICON WINAPI SHGetFileIcon( DWORD dwFileAttributes, UINT uFlags); -int WINAPI SHMapPIDLToSystemImageListIndex( - LPSHELLFOLDER psf, - LPCITEMIDLIST pidl, - UINT * pOpenIndex); - BOOL WINAPI FileIconInit(BOOL bFullInit); /**************************************************************************** @@ -459,58 +364,14 @@ HRESULT WINAPI SHRegisterDragDrop( HRESULT WINAPI SHRevokeDragDrop(HWND hWnd); -HRESULT WINAPI SHDoDragDrop( - HWND hWnd, - LPDATAOBJECT lpDataObject, - LPDROPSOURCE lpDropSource, - DWORD dwOKEffect, - LPDWORD pdwEffect); - BOOL WINAPI DAD_DragEnter(HWND hWnd); -BOOL WINAPI DAD_DragEnterEx( - HWND hWnd, - POINT pt); - -BOOL WINAPI DAD_DragMove(POINT pt); - -/* DAD_AutoScroll return values */ -#define DAD_SCROLL_UP 1 -#define DAD_SCROLL_DOWN 2 -#define DAD_SCROLL_LEFT 4 -#define DAD_SCROLL_RIGHT 8 - -/* DAD_AutoScroll sample structure */ -typedef struct -{ - DWORD dwCount; - DWORD dwLastTime; - BOOL bWrapped; - POINT aptPositions[3]; - DWORD adwTimes[3]; -} SCROLLSAMPLES, *LPSCROLLSAMPLES; - -DWORD WINAPI DAD_AutoScroll(HWND hWnd, - LPSCROLLSAMPLES lpSamples, - LPPOINT lppt); - -BOOL WINAPI DAD_DragLeave(); - BOOL WINAPI DAD_SetDragImageFromListView( HWND hWnd, POINT pt); -BOOL WINAPI DAD_SetDragImage( - HIMAGELIST himlTrack, - LPPOINT lppt); - BOOL WINAPI DAD_ShowDragImage(BOOL bShow); -HRESULT WINAPI SHCreateStdEnumFmtEtc( - DWORD cFormats, - const FORMATETC *lpFormats, - LPENUMFORMATETC *ppenumFormatetc); - HRESULT WINAPI CIDLData_CreateFromIDArray( LPCITEMIDLIST pidlFolder, DWORD cpidlFiles, @@ -844,57 +705,12 @@ HRESULT WINAPI SHCreateLinks( UINT uFlags, LPITEMIDLIST *lppidlLinks); -/* SHGetNewLinkInfo flags */ -#define SHGNLI_PIDL 0x01 -#define SHGNLI_PREFIXNAME 0x02 -#define SHGNLI_NOUNIQUE 0x04 - -BOOL WINAPI SHGetNewLinkInfoA( - LPCSTR pszLinkTo, - LPCSTR pszDir, - LPSTR pszName, - BOOL *pfMustCopy, - UINT uFlags); - -BOOL WINAPI SHGetNewLinkInfoW( - LPCWSTR pszLinkTo, - LPCWSTR pszDir, - LPWSTR pszName, - BOOL *pfMustCopy, - UINT uFlags); -#define SHGetNewLinkInfo WINELIB_NAME_AW(SHGetNewLinkInfo) - DWORD WINAPI CheckEscapesA(LPSTR string, DWORD len); DWORD WINAPI CheckEscapesW(LPWSTR string, DWORD len); /* policy functions */ BOOL WINAPI SHInitRestricted(LPCVOID unused, LPCVOID inpRegKey); -/* cabinet functions */ - -#include "pshpack1.h" - -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; - -#include "poppack.h" - -BOOL WINAPI ReadCabinetState(CABINETSTATE *, int); -BOOL WINAPI WriteCabinetState(CABINETSTATE *); - #ifdef __cplusplus } /* extern "C" */ #endif /* defined(__cplusplus) */ From 3b0926761a0c2e848d6cbf30caf4cabcffc1d8c1 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Mon, 16 Feb 2004 22:01:02 +0000 Subject: [PATCH 0052/1463] added .cvsignore svn path=/trunk/; revision=8212 --- .../system/explorer/winefile/.cvsignore | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 reactos/subsys/system/explorer/winefile/.cvsignore diff --git a/reactos/subsys/system/explorer/winefile/.cvsignore b/reactos/subsys/system/explorer/winefile/.cvsignore new file mode 100644 index 00000000000..dc6d4630f7e --- /dev/null +++ b/reactos/subsys/system/explorer/winefile/.cvsignore @@ -0,0 +1,19 @@ +*.coff +*.exe +*.d +*.o +*.sym +*.map +Debug +Release +UDebug +URelease +winefileDebug +winefileRelease +winefileUDebug +winefileURelease +*.ncb +*.opt +*.aps +*.ncb +*.plg From ec74cd68bcbb56da89ec8c7176d92cbe91a70b01 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Mon, 16 Feb 2004 22:54:53 +0000 Subject: [PATCH 0053/1463] cleanup in project file svn path=/trunk/; revision=8215 --- .../subsys/system/explorer/doxy-footer.html | 2 +- reactos/subsys/system/explorer/explorer.dsp | 148 +----------------- 2 files changed, 2 insertions(+), 148 deletions(-) diff --git a/reactos/subsys/system/explorer/doxy-footer.html b/reactos/subsys/system/explorer/doxy-footer.html index c1c70340c06..5855b19a591 100644 --- a/reactos/subsys/system/explorer/doxy-footer.html +++ b/reactos/subsys/system/explorer/doxy-footer.html @@ -3,7 +3,7 @@ <tr> <td><address style="align: right;"><small> ROS Explorer Source Code Documentation -<br>generated on 10.02.2004 by <a href="http://www.doxygen.org/index.html"> +<br>generated on 11.02.2004 by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border=0> </small></address> </td> diff --git a/reactos/subsys/system/explorer/explorer.dsp b/reactos/subsys/system/explorer/explorer.dsp index 7f962bda815..47e3fe33c8f 100644 --- a/reactos/subsys/system/explorer/explorer.dsp +++ b/reactos/subsys/system/explorer/explorer.dsp @@ -365,55 +365,6 @@ SOURCE=.\res\config.ico # End Source File # Begin Source File -SOURCE=.\de.rc - -!IF "$(CFG)" == "explorer - Win32 Release" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "explorer - Win32 Debug" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "explorer - Win32 Debug Release" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "explorer - Win32 Unicode Release" - -# PROP BASE Exclude_From_Build 1 -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "explorer - Win32 Unicode Debug" - -# PROP BASE Exclude_From_Build 1 -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "explorer - Win32 _NO_COMUTIL" - -# PROP BASE Exclude_From_Build 1 -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "explorer - Win32" - -# PROP BASE Exclude_From_Build 1 -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "explorer - Win32 WineRelease" - -# PROP BASE Exclude_From_Build 1 -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "explorer - Win32 WineDll" - -# PROP BASE Exclude_From_Build 1 -# PROP Exclude_From_Build 1 - -!ENDIF - -# End Source File -# Begin Source File - SOURCE=.\res\documents.ico # End Source File # Begin Source File @@ -422,52 +373,8 @@ SOURCE=.\res\drivebar.bmp # End Source File # Begin Source File -SOURCE=.\en.rc - -!IF "$(CFG)" == "explorer - Win32 Release" - +SOURCE=".\explorer-jp.rc" # PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "explorer - Win32 Debug" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "explorer - Win32 Debug Release" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "explorer - Win32 Unicode Release" - -# PROP BASE Exclude_From_Build 1 -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "explorer - Win32 Unicode Debug" - -# PROP BASE Exclude_From_Build 1 -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "explorer - Win32 _NO_COMUTIL" - -# PROP BASE Exclude_From_Build 1 -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "explorer - Win32" - -# PROP BASE Exclude_From_Build 1 -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "explorer - Win32 WineRelease" - -# PROP BASE Exclude_From_Build 1 -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "explorer - Win32 WineDll" - -# PROP BASE Exclude_From_Build 1 -# PROP Exclude_From_Build 1 - -!ENDIF - # End Source File # Begin Source File @@ -575,55 +482,6 @@ SOURCE=.\res\reactos.ico # End Source File # Begin Source File -SOURCE=.\resource.rc - -!IF "$(CFG)" == "explorer - Win32 Release" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "explorer - Win32 Debug" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "explorer - Win32 Debug Release" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "explorer - Win32 Unicode Release" - -# PROP BASE Exclude_From_Build 1 -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "explorer - Win32 Unicode Debug" - -# PROP BASE Exclude_From_Build 1 -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "explorer - Win32 _NO_COMUTIL" - -# PROP BASE Exclude_From_Build 1 -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "explorer - Win32" - -# PROP BASE Exclude_From_Build 1 -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "explorer - Win32 WineRelease" - -# PROP BASE Exclude_From_Build 1 -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "explorer - Win32 WineDll" - -# PROP BASE Exclude_From_Build 1 -# PROP Exclude_From_Build 1 - -!ENDIF - -# End Source File -# Begin Source File - SOURCE=".\res\ros-big.ico" # End Source File # Begin Source File @@ -636,10 +494,6 @@ SOURCE=.\res\search.ico # End Source File # Begin Source File -SOURCE=.\res\startmenu.bmp -# End Source File -# Begin Source File - SOURCE=.\res\startmenu.ico # End Source File # Begin Source File From b84451d1c35f25bb108bf2c70202bf55e94dc182 Mon Sep 17 00:00:00 2001 From: Mike Nordell <tamlin@algonet.se> Date: Tue, 17 Feb 2004 10:52:03 +0000 Subject: [PATCH 0054/1463] Changed timeout from 2000 to 2001 ms, to be able to find it easier in kmode. svn path=/trunk/; revision=8218 --- reactos/apps/tests/apc2/apc2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/apps/tests/apc2/apc2.c b/reactos/apps/tests/apc2/apc2.c index 739fc181984..ca3699cca58 100644 --- a/reactos/apps/tests/apc2/apc2.c +++ b/reactos/apps/tests/apc2/apc2.c @@ -31,7 +31,7 @@ int main() bSuccess = SetWaitableTimer( hTimer, &DueTime, - 2000 /*interval*/, + 2001 /*interval (using an odd number to be able to find it easy in kmode) */, TimerApcProc, &value /*callback argument*/, FALSE ); From d3a4b4244c90ac360c9590bd4e9af16639cad92c Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Tue, 17 Feb 2004 14:55:59 +0000 Subject: [PATCH 0055/1463] Added test app for AlphaBlend() svn path=/trunk/; revision=8219 --- reactos/apps/tests/Makefile | 2 +- reactos/apps/tests/alphablend/.cvsignore | 6 + reactos/apps/tests/alphablend/alphablend.c | 213 ++++++++++++++++++++ reactos/apps/tests/alphablend/lena.bmp | Bin 0 -> 89322 bytes reactos/apps/tests/alphablend/lenaalpha.bmp | Bin 0 -> 89322 bytes reactos/apps/tests/alphablend/makefile | 22 ++ 6 files changed, 242 insertions(+), 1 deletion(-) create mode 100644 reactos/apps/tests/alphablend/.cvsignore create mode 100644 reactos/apps/tests/alphablend/alphablend.c create mode 100644 reactos/apps/tests/alphablend/lena.bmp create mode 100644 reactos/apps/tests/alphablend/lenaalpha.bmp create mode 100644 reactos/apps/tests/alphablend/makefile diff --git a/reactos/apps/tests/Makefile b/reactos/apps/tests/Makefile index 1b6c8426129..3db6e33c24a 100644 --- a/reactos/apps/tests/Makefile +++ b/reactos/apps/tests/Makefile @@ -7,7 +7,7 @@ PATH_TO_TOP = ../.. include $(PATH_TO_TOP)/rules.mak # test_old tests -TEST_APPS = accelerator alive apc args atomtest bench bitblt button \ +TEST_APPS = accelerator alive alphablend apc args atomtest bench bitblt button \ button2 capclock carets combo consume copymove count dibtest dump_shared_data \ edit enumwnd enumws event global_mem gradient hello mdi \ hivetest icontest isotest lineclip linetest lpc \ diff --git a/reactos/apps/tests/alphablend/.cvsignore b/reactos/apps/tests/alphablend/.cvsignore new file mode 100644 index 00000000000..d63774a7353 --- /dev/null +++ b/reactos/apps/tests/alphablend/.cvsignore @@ -0,0 +1,6 @@ +*.o +*.d +*.exe +*.coff +*.sym +*.map diff --git a/reactos/apps/tests/alphablend/alphablend.c b/reactos/apps/tests/alphablend/alphablend.c new file mode 100644 index 00000000000..ee3942d8992 --- /dev/null +++ b/reactos/apps/tests/alphablend/alphablend.c @@ -0,0 +1,213 @@ +#include <windows.h> +#include <string.h> + +#ifndef AC_SRC_ALPHA +#define AC_SRC_ALPHA (0x1) +#endif + +HINSTANCE HInst; +const char* WndClassName = "GMainWnd"; +LRESULT CALLBACK MainWndProc(HWND HWnd, UINT Msg, WPARAM WParam, + LPARAM LParam); + +WINBOOL +STDCALL +GdiAlphaBlend(HDC hdcDst,LONG DstX,LONG DstY,LONG DstCx,LONG DstCy,HDC hdcSrc,LONG SrcX,LONG SrcY,LONG SrcCx,LONG SrcCy,BLENDFUNCTION BlendFunction); + + +int APIENTRY WinMain(HINSTANCE HInstance, HINSTANCE HPrevInstance, + LPTSTR lpCmdLine, int nCmdShow) +{ + WNDCLASS wc; + MSG msg; + + HInst = HInstance; + + memset(&wc, 0, sizeof(WNDCLASS)); + + wc.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS; + wc.lpfnWndProc = MainWndProc; + wc.hInstance = HInstance; + wc.hCursor = LoadCursor(NULL, (LPCTSTR)IDC_ARROW); + /* wc.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_BTNFACE + 1); */ + wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); + wc.lpszClassName = WndClassName; + + if (RegisterClass(&wc)) + { + HWND HWnd = + CreateWindow( + WndClassName, TEXT("AlphaBlend Rendering Demo"), + WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION | + WS_VISIBLE | WS_CLIPSIBLINGS, + 0, 0, 320, 430, + NULL, NULL, HInst, NULL + ); + + if (HWnd) + { + ShowWindow(HWnd, nCmdShow); + UpdateWindow(HWnd); + + while (GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + } + return 0; +} + +/* image related */ +BITMAP bmp; +LPCSTR filename = TEXT("lena.bmp"); +HDC HMemDC = NULL, HMemDC2 = NULL; +HBITMAP HOldBmp = NULL; +PVOID pBmpBits = NULL; +HBITMAP H32BppBitmap = NULL; +BITMAPINFO bmpi; + +BOOL ConvertBitmapTo32Bpp(HDC hDC, BITMAP *bmp) +{ + ZeroMemory(&bmpi, sizeof(BITMAPINFO)); + bmpi.bmiHeader.biSize = sizeof(BITMAPINFO); + bmpi.bmiHeader.biWidth = bmp->bmWidth; + bmpi.bmiHeader.biHeight = bmp->bmHeight; + bmpi.bmiHeader.biPlanes = 1; + bmpi.bmiHeader.biBitCount = 32; + bmpi.bmiHeader.biCompression = BI_RGB; + bmpi.bmiHeader.biSizeImage = 4 * bmpi.bmiHeader.biWidth * bmpi.bmiHeader.biHeight; + H32BppBitmap = CreateDIBSection(hDC, &bmpi, DIB_RGB_COLORS, &pBmpBits, 0, 0); + if(H32BppBitmap) + { + HBITMAP bmpalpha; + SelectObject(hDC, H32BppBitmap); + BitBlt(hDC, 0, 0, bmp->bmWidth, bmp->bmHeight, HMemDC, 0, 0, SRCCOPY); + + /* load and apply alpha channel */ + bmpalpha = LoadImage(HInst, TEXT("lenaalpha.bmp"), IMAGE_BITMAP, + 0, 0, LR_LOADFROMFILE); + if(bmpalpha) + { + COLORREF *col = pBmpBits; + int x, y; + HDC hdcTemp = CreateCompatibleDC(NULL); + if(!hdcTemp) + { + DeleteObject(bmpalpha); + return FALSE; + } + SelectObject(hdcTemp, bmpalpha); + + for(y = 0; y < bmp->bmHeight; y++) + { + for(x = 0; x < bmp->bmWidth; x++) + { + COLORREF Color = (COLORREF)GetRValue(GetPixel(hdcTemp, x, y)) << 24; + *col++ |= Color; + } + } + + DeleteObject(bmpalpha); + DeleteDC(hdcTemp); + return TRUE; + } + return FALSE; + } + return FALSE; +} + +LRESULT CALLBACK MainWndProc(HWND HWnd, UINT Msg, WPARAM WParam, + LPARAM LParam) +{ + switch (Msg) + { + case WM_CREATE: + { + /* create a memory DC */ + HMemDC = CreateCompatibleDC(NULL); + if (HMemDC) + { + /* load a bitmap from file */ + HBITMAP HBmp = + /* static_cast<HBITMAP> */( + LoadImage(HInst, filename, IMAGE_BITMAP, + 0, 0, LR_LOADFROMFILE) + ); + if (HBmp) + { + /* extract dimensions of the bitmap */ + GetObject(HBmp, sizeof(BITMAP), &bmp); + + /* associate the bitmap with the memory DC */ + /* HOldBmp = static_cast<HBITMAP> */ + (SelectObject(HMemDC, HBmp) + ); + HMemDC2 = CreateCompatibleDC(NULL); + if(!ConvertBitmapTo32Bpp(HMemDC2, &bmp)) + { + PostQuitMessage(0); + return 0; + } + } + } + } + case WM_PAINT: + { + PAINTSTRUCT ps; + BLENDFUNCTION BlendFunc; + HDC Hdc = BeginPaint(HWnd, &ps); +#if 0 + try +#endif + { + + BlendFunc.BlendOp = AC_SRC_OVER; + BlendFunc.BlendFlags = 0; + BlendFunc.SourceConstantAlpha = 128; + BlendFunc.AlphaFormat = 0; + + BitBlt(Hdc, 100, 90, + bmp.bmWidth, bmp.bmHeight, + HMemDC2, 0, 0, + SRCCOPY); + GdiAlphaBlend(Hdc, 0, 0, bmp.bmWidth, bmp.bmHeight, + HMemDC2, 0, 0, bmp.bmWidth, bmp.bmHeight, + BlendFunc); + GdiAlphaBlend(Hdc, bmp.bmWidth - 15, 10, bmp.bmWidth / 2, bmp.bmHeight / 2, + HMemDC2, 0, 0, bmp.bmWidth, bmp.bmHeight, + BlendFunc); + + BlendFunc.SourceConstantAlpha = 255; + BlendFunc.AlphaFormat = AC_SRC_ALPHA; + + GdiAlphaBlend(Hdc, 140, 200, bmp.bmWidth, bmp.bmHeight, + HMemDC2, 0, 0, bmp.bmWidth, bmp.bmHeight, + BlendFunc); + GdiAlphaBlend(Hdc, 20, 210, (bmp.bmWidth / 3) * 2, (bmp.bmHeight / 3) * 2, + HMemDC2, 0, 0, bmp.bmWidth, bmp.bmHeight, + BlendFunc); + } +#if 0 + catch (...) + { + EndPaint(HWnd, &ps); + } +#endif + EndPaint(HWnd, &ps); + break; + } + case WM_DESTROY: + { + /* clean up */ + DeleteObject(SelectObject(HMemDC, HOldBmp)); + DeleteDC(HMemDC); + DeleteDC(HMemDC2); + + PostQuitMessage(0); + return 0; + } + } + return DefWindowProc(HWnd, Msg, WParam, LParam); +} diff --git a/reactos/apps/tests/alphablend/lena.bmp b/reactos/apps/tests/alphablend/lena.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e9916963852a9748baf1b9ac6093fb3b9179dbbc GIT binary patch literal 89322 zcma&vKawKP@-6s!8<;{I4aBE`G%DEWW8?zHjNC!81K0uV0Q9jj5Jsnj(W`b)EkC7u z2R)zTkx*23-}jro@#QATpUMnBas0T4NASP@AOGY3{BJM$_rLk?zx(h1^56gMzyJ2~ zzj}Om`G36r|Nbv8^<SOv(Cywf+jo!M?tQ&|(>iT<Tld#xcNvDuYB|hj%lT|ROIu8* z^O-iAJD5&q4(9VkJ)PB4$F1ef`AEHgu~>Rl^JZ=GI$bT-i}|u!d0Z^#%T3qMr@m;u znlBH-cC}cp{cpb94ZHnzKb_3Hc|KdbzD{!ivt>2kznnWiUrr`Ix}MEe_w%mP`EIt@ z%~$({wmvRaCvDlC=BtCRs#mwm^>MX1uR86r+PLMb$3L2ry5iohOK-ckyt7Z!UF-gq zHr(`{KHNODe)rz*--rFj_VBSge(X=52ko48JpVXdTKjpr{5)NMp05smc)Y#;?uX-a z-gm>b8!n6WuIu+*e^~d&?yGrvSZ~I*8V~mC&2H80)}6=wsyi$@w|QD_PV@C~>3+Aj zHM<`^kJq0K16?ri-t9jc05*<?H+Q#KpEuocK3%iUocYSQQ;*X!?q4t{Jj5cgek?U& zARS(x4OAut16Z2Oy7dOMrjzM<#eDPSa@DQ7q1$we)zA;C#cI15cKwd^nSQ<A_`>$( z1%sgR^>sFx%)C0Atv8#!$3n$o;si9!*VFj`NAvZLt(Pm^s2`5=)o~H<bn`_pur3U^ z*=FlM0MMQm0Al)oyjmD27<^&i833Ez8w>!zaQFm(-SM+wfc5X~vtTfq{(*tFkKY0I zyl1|3e`eoqII{TN(9Q15U9CTWM=YMFyEGWcBMj_eU{P%~T!!Q4aQe|5K6+Pj`B4~n z-|RkIr`Bz6kAwB#mM^`(zTQ^PvuRrOe+~?1$8B_b%2JLOdVaQQW0rl}$-C{wZ-575 zA4pg{%+L@rVU^|3^&2qQ^xble2fB5?T&!#C&tTx?Wipxg#L~fRzM0N8^Z91GzjeUB z?&tH6z%=*_Khyz3Zy0*P=<9Px00z4Ae0`cNdepI8Zk8+k0~-PSx&wnt2%*?u9QbAT z=i?CuHSq5YF!Deb5*VqVVDKIWs5b218wot|KrryI{;|e>o?b%&m$%=}yu7?Fmi>Bj zS@q{O-n;&^8OBln82%#+I@W)@6w_A=AuPMYVtrWk0l@b1b9epKpMPwQKX#Xq2Vj8p zHFmEC&j5c}bm#SI-}i?i*s|bbbl12x29f-F)xiMkFza%@X0_#fWtbOWJT{|z15dCq zft3}HFf(SWVViBg-EViBRkz*reb+DZY8Yd+1g%BBdD(9^yM8!z-OhzASN(2#SmeBG zSUwuihOfdK2K%r;{wprv6ds77&rVLJ%jKe5u295zQB=RK$L18q;a{BZc*H>Yi)SkM zasi_k2mtgUBK?Me0>Cyr5E2Lv+(}@>!1X7KJANR6BiIb*U|_*d76vwZXorEggD+b@ zj*AVR&VR>1sKAA7Pe1q9-@EJY;rw%R`mt?1!29n|LF0iE1609qgK#_m1ItCPGufJn z8KQWAXAdMEoWQ2q>+6J>3|_}~{osYwVqt{Vo9k2U%`EG{tG*Kkmh;61bM;$P&||S- zJ8YsufMf_T_8iCMbUhy~kkfTrULb_<I!6g8<T3CY3EW)<7_8@ue!eU{u#O&RFqkj5 zFi_yxI`cOM)_2-(u0J%=B*FdsgAGP1C<bUe;PK%L`Z$8OI|+;!IGlcr7`Q6|1HZMV z2acD|ID*CS@`~}0+{gow0q`FTaADd50OLWk`*{Ar1M3|vfd_og?i>tkuRr_KXMg-L zoXZ!C7ytvR021EGgJ58|!9dp?m&-wiXH2ybO}W7X3NLpMRFsQnBZRP=QF0xt#ORZU z2yE|Xk^86O3xa_~zIILz001vQBCeM!Fxd73kH8&lhg~qB6L0V9`RXPAe6R0c#^cBO z;fiMr6azT#qy~OquwAWBgdcMg13bcFxtmTS7#0-o>Nt-Wh!<#&&m;Yt{QCm{o<0O& zlY-RXvmpG_5q!r$0Pv*)BLk|PuRpGDzqFT0+$(WQ4-l>efM6gd?*AhO?!eeLB@jnI z4s|d<Dx7!Vcl)(#7&v`lpnO3wKnNlFu<^jWJHx<gwVg~x+ePV(8X#v}VM9W51YodP zZMs#*-M5$Ov4O|?n^7VpAg8H?1yoFChCBewUVZg!O$zn{7ijFC4#ZpdfmEOm&--IX z4;{`h@Dd#uUBT}cIF}F8*FpPR9(5zMY?izsFTnc5Vf5iX7~o`r0W1**QAz+3u1ya# zNc>v|mi5O#pu&M-004*{h^!J6JOSWu9*7!zVBm5mfl(5K1a^nZ%Zu(^==@bw{UzZ* zG$9OltoAP|cwpem7u+$x9c+)EhuiP{?H5(R9cTtsjeUCHfq{?0z#D`c9h?4aq)aLh zXasBUHv5)M1Bo)hIO@0EFmywEPvl<tj`qPu0^=hxK_~NNBteY6O_0c@qJ#P3xIcyp z1O>x(`a0e34hUgw3<m?<<#?hKpe|n<*<6nygjl@V0|0f9i$?`f1?31%t6<;=Zslv7 z-%~#E`0EA$kB>;OnBhqegeW%GXY1eN!Loj1g8(40K!pP$g7@K&sBl|R;g=W~9YNUO zLIjQ^@CzZlfBYtOUS5K8H@eyc10D+l#Q<Lz_$MJe1fhe{glob$?qE2)A8)^p?|}h9 zIGleyVc?z|s4T&1cw6>27#OI;ZjW{2mrBTmz%hA5U`U{>Tx{TKU#FX8w;x1v;Q<(+ z1ZV~y$!G8RgnWuGC-LS<0!Rh0tl`fKEDHv50(iig)BXS(Gy}Kt`ZB=`!*)j|=@ws} zZ(eNX-1@950Jy400}Ra2@ag1Agf(046BVwGBL=2%BC92}uv>JrV#7cH&@k|fgytRo z=7cXz*usH7asmkn$Fx8N1x*l^7`PCD<p}EWQn5e<1xX8B-+rR6l3Rs=j-<y<M4bah z7b-q@pkV+=4hB9FxDWpa41xhFn@7NSo89dIZ12AhZ@+h!U&E<*AfT<W-x5SEQzSny z+~(bdC!Nl^O}~rkZ$rM^!M(Td?m*|)`PFoO7<TOYio#gA)S#}$|1cA)1rLl8t%yK2 zte-KyGW=lx9yAdFAZ=D_Cg&zV3*j61``!L_erNH?tFKxRmEKMel6DXNciu6`1$Dtd zd=_$;&)IrEUF>Cz_=UytIGwJi6RLE>&-{gf>%-{5#$Vw;EK=Ga7%1!C+2AQPG^Pat zgL_o?FAOv_c=>U;Vt`*@00W2P4GHKdU8LWZ>wW&v=F|lP<exaPU@$5}Fi6tiFY7lL z6b9D8z-+Ny50|an)a{qHJyV9k0JoLQK%`*Y!Ce#b1-C_aoh}C7j5e86m(~z&z1l`x zJI*88(){11+o1Q?muc7a#RFI()(4x_BHEA9E9u1WYXct)hyfqr^gS-7i|uB6+U~Z! zxNqOB`su6ASm}z5M9KNBTW<l3t$poc-Z=;c@)Y^NWLjZh6+9SCqmNjx5(XY%U<wBG zKqZtGi;g~AuF4mbBq(iwc+(012H-9HU#%U$z?VCCR)b?mm{_3NodiVX<qk-){rSh? z@>5)p&>%{H-8q6!RB*ZdyxgJ&XY-E#Ef@nTQP>OXk|~NBqz~l@?-*!=5ON3=G%@f1 zL&-vSy~P6y?tn1x+1+g$H7GXx`NRXw^xrUm_hyvRdVjinaJzc4>=+uak<~Cz-9C=B zAi;lYp_}B7QQ8uQO*&4A|BjV8eUH36{%7%(Eb+R-{K3F%*>MXlbl5{44A2S7#d@{u z03aCXpyIgSoduz}7^aRLSM$ma!9ZPDE+go0GQd~{8>I{diCn)_bOHhSfk|FUnrOLi z7$BP$1%|RdR7lOW@g593TEfOZF+dDFM+B5W>47+cz~HV2K4BorysRHz&|-mL;Kvyi z+~Npy_{$3<=i&oYJh0qswyuHogMo;{KQK@L_y-0y4=TU|fx(<A;8Up9!)Jf`;W2t( z`%fOYE&J<2o)GHRTk-e?C-VpCUVT3T08l-fIvoP2&M!ybwY+W&5xaN;LNMwvTM54< z81Mzo@B&?>1QCLl0*rZLLykbw__#j|!(Id@RoHI^c-Rhy<KbF75axjaw)XWEB<61w z5^{MXFp3`<3=FR5qT~$4hFil+KNk<|D}@-NkFqc#uwmfY5j1iL7)l1T$0UWuprDC? zimzKvAlARbfFQ2~(U1KT2FB1Jg3$2)eZGF)-ha9E*NGchx+&?gsP6gN7n<pi`7b3< zBv51jo+t<j<kdz6V`hLnXc6L0#-&t&JB=zZalqGidm@n2X}+LB!uWy&hCD)x4c+N> zdlo&-gjXSR7n4UeZJbaTc=UW;!V<)Qct7Uml*1nE!P6VdKIYVlI|xNoo)8%L1xldA z;fnVM1E`Q30K3C>-*0w$gCP9%gMytN<%pL3OA;1yT)-F9U~vu5*si25qc9L)z(B4% z0f)a++W3@&;c`gK7%dTBfE<L4QYh>08egzJM;Vqo@Teb(1V#+RDLnDOJs!L(fiWU@ z%Oueu4DbgDGz>I%Fh+>Q2J%85KYo*5Nq|Jatm@W+0XI7AZZII_Tkast|5rOac;G8_ zOeHova0lz{nlF$nN`P=AffjggbN&khqcDI02_pTl+g<0g4h}Pv47_;uVBy~38R?A{ z8Y(=t0iHJ@0oOl?cZe{c2^}x_{*EtbAb|nqfeNYs7044x1Uv3KXy6Wp#bPb7KWw(= zqpO`<ukWH})^`COmy1oaelaHupnW}-%WHk;uLPO(bjoWi2g!l?@@O8xr@e;)B@%Kb zxg#BWN&E-{cK{RySRV}T7zhBgn|24lABn-5BlyD$-~o;xx#E%pl^+NXG<R_QAt!LX zePRG!FVil;0E+Wywsh8SFXsFHje##hxbwg$3?7bP2LSRs9(jaH85IUhp{|cG(0oCr zkBbM|^l^9~-tcm}{hmzLr_*iI4T7>VD<H(a)r=!oyG$o%Op#&L;d&l}c`UmZlA$M( z00x}&66<4(g_)z$gn2rL0qKRF7jWDylPs#Cx<2fWuP?7YemY*0Icap1*Mb2|^A8N@ zz`G-Gg}M|)QJ`h<LljO#S1=&v;vk|E2!l!|W{##JL_JWdpjp2m;o%ELFR=M5GmHVA zTX>)xK?Gp|AhNI|0RVu3CK!Bs|D}T~9p}Q9@>dyp^R<hdyi7Noa)pQYx#MyN-`L>r z!~+csUl@ol2oE$E>|lvI04jdrfq@njBs)|QVlW^8*<9Y<B`dZ(sSYe#V|xH#^w_#R zim+O+HV(=7vLIy11Mu}p8!|^ofX-)kB!DZp1C8mCfbkhNSgm2eWP$nt2m9@o-NhF_ zK7I|u&c{!C*&%^plz_qFu?Q*{sEcXW<FD5RL<i=4Y+e1CF*S#*oq(6>o=#lkda>wN zLdARDpmK)Cv7DgQ5{!Z20|xD&s36vFtsFtc0uKRDV&LuzLIUA|F(|kQ4PyG%Dk=1{ z%P5=F@ORmI8%kYpVZhWmN=MG!aU(W-)`WK$L=W8Kg3%X55H=aG;|1<KFjRmbHG1F< z8V1JLP|*lwd&dBZGa@9@ge|+n+v{W{d@mCR1LL?J(?tBfjH_IKudz`h1S36zeZl*i z4(>zV2^;&A3gEh^1#d8Y3;?U;Ec2t48_a~!zLyq02re+s`FK6-PSrWf<Msd&H3cvW z;pBh0ss{#&g#v(pFluTkO;t!()~C{?kvH=pVxR<}sj4u;iXJ$2o0Ft^BvYKiHTpk^ zqw}*ixO)VXIB^Ge43sY@B@hhI0Anohi2+)RBY2R&0|VzzR3H`*1Gz`NN4MnqGivZa zmkcK`yv{=A!y7;T2L{USu2vf{&;r8-gAoG&Knbk)K>%n?YP8(J`cOPT3XXA2%@)ZH z1rN*3ZMr;l^Zs!Dn2}8L&8yKqU%XB;W5n%}c&uzrM_P{`r|VFy`5lI4V%pCzhZb?% zTJ+ZqGj#DXA@3y+V!ddCqzB!wq|jz9OCTvEMcDVN)h3xzPG@yJ-HHuf_uGTh{%E{p zqW)aKa?#DEp2p~{HD}ZqX*?Oucga4I!L?X!5JJHQunEF}CKNNWyB@}Vq*o-9e6p$Y za{Z5}@CyJX6umm?0UEmqVc5S(#-{Bh1b)Z~IBo?4`{R$p>F43}!3*rqKM$8*&YK>3 z`}n!(F@Q8cf|MHjF3$xA1I1l(BN&r9W)y%lM2?9L*xlnO2JTAW9uX80iUdjn$j3(v ztlVtxmWBK<Fk2sIOMjXk7y-cUsUv#K8&(~WDSf>LpZ)HKfip>WGvFfjuK)oI!uAxJ zS)5Gz#GvKeg?SqU?hR9pV492&+UM(s8uFfc2@+B<LK66r>FluG4eM^(ZCGk0iGMgH zNjRDJN=0_Z9HW0;GLk+XAs849`oKUt@P_e>g9He746u6%tw18tA`B#86g2S&VS^B0 zO)V7+gyfgVgTGpX2d4=JW{6raxIH8#XkH)(9-9nkH3Mh9pa4+C1CB459Q?6LZHyap zwdl0>hy<!(fDUnKdO%iOnimF)_kMe-*+YnB`UZo;IQ$=hz}*YP^y^{dfdD|?4)lO* z13^e62LqMd2mo4(GK7lgfeejI8p7xLc>dgME|U^u$r&=h9Rr<ty{JLv$viScd%Bnz z<Qr4~-~O@kVRtYG6c;d^p?wT6f1R2b3INs#3Y_E-r~)8yse83^nHxen*k;d&i7w+r zMz7?_-xw&<v-lkVBSkpVjJ_(&R411__yYqewlPVUgdrpZ4~{c^|G>aKW(14|1I2zk z!WRZoEv6a%VE}<Z;{gI-fBq~r_*o+G*X8=LT*colFl*WUfq_y5<qM(*U_R0%DT2bl zrg$I%U`z;<BlyMu`xw0#AgQ4Y|AE(o|0=5C{&td$ZgwuvZafgXx3qwSAvQ~9Beg5t z5n-42%#2>TWr2-ZB_t4GP#)hXL$)vg1qdOK;0V|!s&9eG6$fS#fnAaS#TzaB@7FUp zFkiT$30c3V9TxNfJS<O#^XYiO`2@gmci=v_OTvRG8xH`0zlc1`7vxHw+8-DQ09<|} zSdZ1bKb@RGQ6x|nXY`{PC3pJO((MV6{@IdJh)1|G&>aRJk$;cc(JCA@SLmciL#eXC zKWJWe)O1d+yduFT48XaY4GC!J;n{k-e>X6V_m(2KD?nEZ41C#cd>oSiv3ps+kM-44 zRU5w$Ap{$mj(uq*PdF{KHj=>Atqr@k^X1oUagJ7Tg_GrEKHHyu#|`WKVt7`Ty9+3C z7YqOI%vx#L)M$?wn7cRAGrPS<4G&}*$Q+cit>bCCF&8jRXt3l6xazg!FwMYCm@|?g zWINR($HUQJDd5Gp(Sb?vH4LP$?i%132IDc9XoZ}H0pAcHl}}4hAnHj;VTOF^0oIQ% z2n>`LW_Bh37%`Bs{|yYG2<?dq-gtpn9RHiCulnJ}3DQC5>+jp!PXj`{uUG4ia%}-; zc)*Ot&_tktQU@E}DhJ*$U2gYpMb7&MgAoj2g95;4`m(H1Z$4B3RmT3txb(=IWSTX{ z^)wTv-mt!7KxotQ19;#aDqy<}gtzO*didd*IV6>09w$?Z&Oh#epl=Y3=$e}+s=`0k zZ${znJKks`@k`@%l74g}TEGU*lL5!wZdD|J^E;rV6lexT=4!=XQ&9~t=Kw$)SgD3& zp7DTgVbJISPO2R{ESKsH-`X<<d^WAfB;T_L1{SF+K%1fc#{BJ|j-S~e)-V1a5AL)8 zBo7SSXhIlh<PQUT1p|kV)A`5s_Um|j(-|CVvp&DsFpwxUjI_dO4Ffe)0oCON1758G zwb&lm<s3Oj;MLe?{RV)fear<!-xlqM`9}aW7?c$3+hYQRw0^NN1o{UCMh0j+P>)ox znO4$W0&}(fEn6GIFHrYD!7u?62LsqWOvN;M82hi9j{pO2pbw4ujUaQ_cFUDB-X{6K zk~)|zoK!)IAJ#NkWe9~8%OzxTAN$+ocHHi!uk=JDfzSH?h5=Mi7y!vH4E$mJ_Oy{e z1zZJy27`Q+3+8G!=9DvU7#VQNkgr5>!9Z^Z6=`t|4FJ~;^Cwuy@Yf(AJkZ?1HW=8A z7_f-oLxr$uAQQnLPuRGxN$vq$4WnSS=m-zQ7r+2tP$41yU%~cb9t;3O@$do<ARN}O zZ0BhGdH6idN&Ve0@bt*a1Yt9}a9|6EY2B9ec3y)4)-QJu9az=HZ%GqXu2^3EWxgi( zKW^#|e~Dk#3p}25O<|aoSwGeRRJ89PnxLk<bAwh8tkyklmGU9=;X6q}ce_>%66Z0U zoel?&TcvW~u<0p(2oXAn2-G9tA7A1Px@=O+^Bn{Jq`uOJW0yK^eOr$?uI^pJK(WLF z20A|&2oES8$b5mp6&Q3fz?B&o^8>~Fv32|cbB`EkNFbS-^_eD;V0()rsA8c?{(PDP zpQIB0Re&7Z=Z@WXt|wPG>Q!KH{mTai97OXZGl04`U=YduIvaKop8^2|4>7l7R~=;d zgF%E1zm|jXxPn0zmn3X+MubGILCDiCOAod}hVa0>a$ux_$DC1O!&A+#t<aY$zQf@P zr9za9bPQ$q#sqGmQ9+Q9`^uft1B=<~B!%e%3g`i2U1D$P>g6v42vdncLFH^%uMgYp zcG!Bl-wfB|`5+%iFuzU{6x8?Ez{wviZ*IuwA`wTruG!sRZ14R3m{%K4>Vr9Mf>8J( zF<Cmf@$gzCqQkLqb=p2_7Vz!*P!!?#q-{3mK?uOyVu3QcsT^(VaeI-@)zrOftN_e% zylx?OPcYl=C1@<pbn8y$(NkBIs4W(EB^@3ph~{ZIg@lL0aO}6&#B^{=Ig~?>>bp}x z)yXp}TH952Xy1&^?p2EHX|)O)3mC~B{|5|=HKi%2UhP~%Ze+@H_k8i>wNcsJl_v%S zgV7y?5M<|=Lv!bI$zk~~^};n_<jvmDnGdSAo-ZK5jDXaTlZX9fn_zIscXXI@nrtwq zIeuIEs(7Z19#f`1Wb8}_-%bB`8VroB*j3*~fa!Jx^Q9|Xe0|k&GF@phq8h;hB-2^n zmMMiI%qo_%F!mz=`b)!r;oo#){7B{<@Cg&_eSfaM0k{lZ7-$#cvR7Xh_BRFuJI@#x z)5S9x!hRPwq_@cD8vdd8yV2tvBv}(R)Ob%F^4R`?fdUB(jK1KT7<ll2`hoRXYCZm_ z3UvgAUAL!dbhx|2(#}_0FggWh0*OL34B-6Lt{;?wQ2qw;LTIpDt(Wv+90Xs#+n@-U zg5-|+&7S+4OOVc1QjtMXH6LuPtPEMBO`F}TGaDu!c7GhScaBC64-^b|f%I@oE&)$Q zD2s5xoARf-$b*U$Qg#?6a4sve``r<Q2X6iLZO~Uqs@!J}=>)!`atrv=6^^|Ti25rJ zrg~7*crRZ4;(<uPZy2bUZY4+CNtwXFz$Lk=40aXcvHLhp5Q~@fAEvJ}wIJmi52UCd z?x0aY(*xfy@HJ-?Uyypj>6+h{nQ<}Jn}o0G?pPTB+-6e9<2WS?*2UZU*0F-{p3%KZ zEeHq5KWB1MM`wy~vrH;!z;d--Y^OK47}AMx7m=4nkB=Ipp&d_04BY*D!$2HRjkxcR z)x#P1%><sZH3DG*_p+`4(@Q`rR_cpj_q7b6*}X(yVgW-B1Lv{yz-=?U0YL9j<ydP? zQw0nS1}B8@`dY+T7hf32MHX~J{`WIEaE0zmu~7Q<2?H+7({fnrh5>#D2D$+(GuUhL zs2Td$j;%*)V?PVi9>+xs1&{hv^9XqagZP3!05DD)B~RG&z>b$JNW<r5KHDhaVD}P% zv6llz&)Cn<^@7XJz{LD8z{)V-J;t7#fTsYEgFG7bGwGy(GMOtMR2{UK%moR<NzwbO z9&3U#!>4*F%n*YD*NB0KW6hiY0f0McR6lz|Fwl&CKMt@fj2f~uHN*dW4+=~i7}S(M z(<>Dy3{+Zp*nRZd_h0}LSRW@0RKdH9$|j!T+$qR67xUWKuYvG>7b7Rc^mV~G(7oR< zVBW1L%e7V5=qYzR#{+}Kl>;|~3Tm)hbCmW4gF6xeiSa#8?x5HJ3|N0`_~fAnYWDCw zlLZf7P#B0W&`aq$$)D|Nx#baDVKKw1cp&!@#|;F90Y1V3yHkBU{(1=nV*g%*2m`#p z#!Lc)m_(jT`;B8OiQW{9Ot=}L!=itC`%pAdb4I+(oMUZN;14_ob^7h!!@uDned{{E z-k&}%3>2a1+uT=zXx87hxWEi@6_MVppT#D@z!wR?KurIhnt}U)aNyBc2LLo)8^BA_ zr0X(1a={~popDEBkEw?-D|6?82L>unSge(4qlN)I;IFi@(gMH;gJ$&ab}yWa^GczG zVvjEXK*AFSQc{=zp{+A&Yt5nuPK)J!HtQ-yuf}V?TnupscOIw%jGYl0!|U{gkrhZp z56l;*-Ja~<7~2TJcToofVUo#94UOQ0Zbf65E+H7ylgJS(u6|$dJ`^VFL&KioVJcJ* zU+^$-x^x`-kAu8Az9B$u7#NAy({&B2jD4jm0Khe6_*X4i0FYDw00aY#1oGJ20XEot z%@U%85d%>LXd#jN7$-)volu8TRRqrTE~EMf5+0Z5WMSaWR8JV-FuVGQffh#~H1PC0 z2Ix<mU)FDrZ6>jq`z{3=9ts<=ep3r28Vd#y5|NR29(e!q2!Hax4hFbRvoqV_)O>;A z9|1t-%~$IcmT+tA59HH`f2U0^7~`w;?Rcd6Omx9L0BEbZyzojYcrg`JtOi-Hg<0vD zIR*THUbfrg_3}QPf14(gA4otFl8Gw#GWtlQ>C$v&Vc@BU!vL-2<T&CA15+>QVF1YR zFB!kD3Zmn3B}<IM`GVqsmJ=S`!9{Lc>X?<2C8*YBjW^qmnsDbVZqC4l_1)f}D!bd9 zBUB0lP+WxXMgq}1e#1a`Ah98E5>3eufX#@3;C2=ahzsPP$`=F!lwoEM8|T9Sk5EXs zV*?2^ijefU69NfQrhoDUhX)46S>sSa-Bf==gDpQW3#Um7Z??lxZQ&y8H+PIxH#k!d zkStbi%}m0S=3nUcN#X)tz(OI@!N8%@RR?)hnutwhd=P?(@Qo-zVsqwW{aV6&zT54u zTPq4pGMs<gDBzx3GirdWz)%4A!b3TQ29oMt?@R}VX{)yz7#3qj(a7qv=4i21xu$^e z;ROJIq;C}?Rb3o0fD_^liWcq^Q8)pK;KA5u@nA#Sq}?=MwO;G_%WS?SZ02pDO-7AN z3T~^_<>lD;U}BTA0cT8KQn1~Egm&G?qG3QH0tONqSa0$T1H8{Evq-5qub0|m7AXfO zccFN!Y7>tKEkNqNFi>8=YNIST!U@51sw<E4`L@<#L`A~@Js?a#q3czj(WhEqGobX+ z0O*>iwN?mj!}ClpIY0>{QD81W-lQaArTnB0QaZR^C?Cm7NCqb?mpeJA%jF&X46D=a z*Nd7T*os3nSdhQ==*eZE*lgW8bA0-Qfl>wfv)q~f1jfNMHNO-RsPv%lziP>d`O`=O zv3pD$B~XtK0Nk_3&~j3VYEo;q*k^N_d+h<!hb}6j<P>DWn7A%GobU_)S3ZV0rp56< zr3V`iRB9+NPMlbnfq}k1N)-lmqv~kG-0*i03=}7{lTR>s=z+5P_sWxiq47XlYt~@k zm@p{Cd&6c%y{V$uHp6;zJiIqI+O4<61BR{@B^z0+<`Hn5GbWCM0Sr>>#gP2A&+1VK zfrq6*XgT?I@0~*ysG2MoPN(a(KTj9OZoU6}|9G7av(<KYe6wSQbd6mGA`L3yxOd~D zKc5dqNZfhAOUR$;?}JMUA{wBHKrkrlr%ZwvVAg6i_D4xjdr)MPqM#x~5l)acQHQ+r zsbFSwA2qY!d%PzYXzAttB1e){TFv^&b+oH(*O|*}EfH&^l*qdIf?RW;n~IlwBp4V> zu=wV)JxPLuHoyx2r9w|4s*wb0_=hM)U_9{vNZbq0T5bUbYTz6DqabXl;}k_?wdrxA z#BMRfmnD1CDNXGAv(Y3*fC>yu^&7|mz?33bsv{x`VZfP?;9|iY4C@Vb#7C@BC&2EK z2AMd>?ej7QWM-Bqg4^rjvRa*feEeV?EIM6pRo#Q7dNcxKGV{-;(kFFEc`PXAOtrB~ z<4*~~ba*hp*Hlu7zM=z1{x^{|>cCVD6$3;Gq#6FTHxV9Cx^uJUj(32HB+V>D%JO8s zGVfV;Z`!7R*Sh{Ki`KoWWzso%GL>noo%JkrdCwS#%Ke4`*O^iO7Y1~GVPKGj-p2J5 z1_Fi*{4Wv+0~9dsNEn^M7$oM+vHqjQ9eDbMfeH#59+LQqgS#wO2ZGKL0}KEIA=24q z7%mdJ0)(WFo1ru0n=qS`ZaFFAL6uSS^SR02&T7F|_m-$oPyh+5L>4QOZzE#xMVsUa zm;L)}{We`5HmmLB@-bcXFT~qwdq`2%Pt!@0L<r5+&yTUYUP_mSb@Q~wRKoxU$oMK! z?e1RSFj9IAUdPWEFwzM;)=wkvtva#xc6FXro3A0^I$sHzAmqK%3IOZwrj;Ieg8`;* z7^ugS*|S<YGy?eRg6}YB*~_{}S4$WOVWJbl1EqrSfb~8m(;5#%jRXT3`y9c@1EKv9 z28{$BJn&@tK;o-CFi<j}r3m5|66xIhmC^%)OY+ytLv=F&{pMiipD<_%Ls3A+CiPom z-*G#@^Yj3Jrhuf+0&_`$qy@UfiM@l>GP~BS)sGZxfMK<LUvAzf%j3`=fB*bF9Bwc| zhPZ&!5l!9b!@Cr0!>ayhLV!OopzGE;uy~+hpsN(zM!F+1Amnf0KbihfJZvD3Nul&W ziGd7f4B&idAq$b1*!<mF*MIExpNFHZrGDk{WXafXg*TE#CKocr(54-IT>M*gun!Ce zv^BsRXoG<;z$S^onkR~P2s0pC?+k(Lb{Cb;BL;Gjgu!{l02ow^P)08?Q10N%*3Bt= zk-&ou!UIMAS!<Sqv=;0rS-IMOU{yI!Gm^vhl#KecH{Xhsr1e~I^97ad!P3ZI)Whx= zKwU9r$bh8%dP_?b3sDXg7nCNPry9Aom{`f*PFR!O_S5+e1--xjyxl%;*Uv?Fu)>9` zfUDExmsAs3aEC!Tf>8a4hwwlnfsFc$BmLGG0E*JR<p`Pv`11Z=G9YXpdJhSBOshzN zDbGG7h^RQ?(4xpzX~12kF^yTp{<7V@?JO`ct0;an6Fp8JAn*$<YAio6;2<z)v^K_x zFwj9lFc3dm7ziO024>6Mo)0=?<!Sb*dtiX|t6~0xhj$)$V1V5p1OI`6C%^FU1!ImV z)kGib?Z;{`ByV_cX@+_xeqR{={6d1fS<e^1fN9o(XpAmnU|h4~)S#vjaB}W9(K`%m zk_YJ4-WFgangD?1j0OT1$wRbYa<M-hWD9p{T~rc^5O231r^Ds-btx2e4H6W`%Wo61 zPZ;ng5*pN*P(fj!2L3pF7J5}H4D_rJ5*TFww|;LG5;hTNjN|_r@)3cIE{aW?cJh8o zD+NmJ(Vdz1RvxRcN-o3!ygRvAX#4q0Le;X4L;l>Fjqt{?O}G662EjnQ*aHJ#@W4RO zqSHhmd$ME?16eVOlp+i9Kyw7~3zZ-E3j-qnoc|j8&#oaD7;A?T5;kR+*l^sV@>Fqj zpDUcI@-hUrYJ}(W%=ve#fzdgA<K2z{WL_>+&Jzg}|GIy^KoQP6;}J__u#<&d?+ug8 z1EsWas1*m(*B4*at<Pf5{q_g|SMBXXp{8pTR;p98Olfoc^=e^u$e&2$PFP`8*1wZL z8%H685CuZev9i=ipeBMDCGxLyehvHxJdMB$36u;l{Kpm%xIC$)$xHW^cSaSQou98r zh0AQ|Z4gB#_>#Bj;yjt*jl*QN1rL2F!omsD+0Gh`5LXDw1;?_2?#5S*0R#~c8y*;M z#5+~i>9~z?VXcsezLWp}fNNo33=AU`9(v$0_D4zZV1s8WC{#2Iuz1xKH(yZ8&F=e@ z%A*?l8BL+ne!IOe$82W4cfYZMmG+b8o@d{Hq=o{CSef-1v>x*m28?}g@XkOY5^)L% z*Z@UjE#a%!NB2NQ?(}%LsXbv|QzUW)-B#~yL?wD=ceu`0CxFS^LP81`!`$h{c94_t zr-gxBOkuz(V|k%DF_3)V7X}dB9Ro43!BvJXFc1Sx{0Az<3?&tiaCrEZ#9$udG)F`g zv{Yv1WOwnZX$2_)<df`i3e`^B!QCUw4Vhea3mKwj%L`<VAa{C)M0%BYMvuXO`Qp`% z>mgC%5uPwmDT04u;K>&}Q$gd0rU}1zV8lQrKXYp}3U-kJ$q#f0SuV$}05Cu&Q1W<~ zp_#S6FDP>+=0*U81jp-$!&o0Y0s!Z$f`|)PGvPRkcz&I79ejOm)|eF~!Jb<d6rXQ; z^^AycvYxS22mMYVM%7330Dv{N3=BMtKW!Mum8=!%6%Pz;Nohp{l?|>){|f^#E-z4y zpzu&n%kE|IN6M%PMUTON$)l<&S4V1Ho@Vbs(#5KxR$8poBx@F`P`UCgwYR_*31pb# zOBWpVR7yZ^Hw?Jh!gi7aqH;U&tm7*OOrBEbCk!-6@E>^KI|iERACKQKfC}FJ(1evM z-m^tvV3S0_e6!im?HJq2!R^vD8@t(0W+Uwr!B!0bIEcVt1VgyOpiNaFR4|4mW$Vor z4AvbIATn!LkeLp7jp|!31ra72vk%YVu)m(KLdC7f&c$rjo89T>>q`KWUV_82c-g&S zVD-QN6|qhY?Y1I<!*eWPr~*J?pctSqFh+%q_7eyM7#a0BF#PZBer(ktU(e9W$g_#W z<wrkU_Q!W+<SNXqIU;c@PUL-#+IoFX!4kALM}R!xA&@8xB%FyC2nNCo<t8|_$wGa_ zc6WsYQ~62r%0I*xoY;NTgcUYE`2sJoetW#bpgDpk0Du!;P|J(%D+^j^5IrC_!sVUf z3+&$&C$$M7Bh?ugoZM;4^J6L|!1LUJ%0Wh7WxEO1i5CD5t@#V-qfTfbPE3rjmOZxc zB#bv(t&&#SU=&Z=7b+uJO4gj;i4diF$K!Q>`FxqwWlZg2x<^(*#d!)%@xa`tn%(O$ z!^#<C%Z)0T`;Qoi68PfzB7yM#=oeVO0ia=^%w1mKj)a_f0}O^f9BnA{OBuOT-tm+@ zs1=vi6b~RJUnERW!7hgY$uAT5jdluynP(aC5FRK3{K7!pS9m}?z8S=uTWSFt@CA1a zRDR$NfEF7*A>nTQX7^_d+=am%15bJ&6UR>&5D*m)z<^S#w0Xa@YgB*E7A1?An}1&x z44Av`$;Gab18jJSnbxaytiMXl*fOM{mMqC4EpsJsf=mEpb*MQqj1lt@jovuaN?Qw& zk0+gZOu`Tsbz3X-3;{4$rm!T)xwi&@FAU%l5dj{M(yyRETA(6=27rcvhuz168v9KD z)QtC*Hu)liki$q3+ub`Cz!8KKj-SWV2R5)=E0SQ$5}*P`r0r?NTwX8$sA(`<m;H=^ z+*F;+o@@&%EflP>e&Gb~76uY0{(*sW0{}4G@$el6&tQm8sXXCddf-u8UcMka5Tz<A zj4$Z<BNz|_ZHF_(#Vs4}cplp$I71#xfuSXV+j%ko05CxF1@N$0nL!wwgm4&09D(+` z%d}z&B!V3H`=#o&NC^BxKtjPMkKke?4=qf%y#H2*Uc#Wdbc8|mTO9)uF#rQ_o6tTp zJICDAm>G`Pi{5K?_ZaeLvOE750BWSO{@cAp3O<_mH)de#qisL!@Uyw>jz3OTmK6rT z=8l02N8nFGLV9x4FkC=jaHp?`nSwL`Gz^r~A%;~D*;1@9;HA+Q{Qt$k=^iFHxF0|B zK&>#!+;KLi`q=Ep330w4`}Ww$t?_`25CGJe5)>?!hsAto)NQbH1T~hk`j{`bbqo^F zg#Rmg&{r(i6rkgcl*;bF9ncT6xc)%sm4nIB-FFz6*oT(&ad-ld*=v}>XZw7j-&x0J zXDzb90=T^`)82o-yujPbodh18nIVRwh!$JYmB`$+%m6Foz8=Yer?{X7buci(pzM1$ z{fGgjBRTWL4>iBQp<GO|#58!|@+%my^cWA+By6Yy*o2c2hXRBH@RvV;fo1ar4zwtN zSiiO4*?gS13<gp$zD}R(9)C2x;0Xg27a040@c>(w-5WC$IXp4L$OA1iaCZlMK`vWT z^dgiN+X_{TccB^d@?~tHLZ(YyS#O*wAfybnH7B2h%*tW}Bc0xZie)L7S3xo<H;XVh z?+y|ItiS2{1cTJkH2kraG~gN29qyV?o^<O??l(kHT`?6VhiceVj4We>R1e2DG1u#> z%kx1)CK$-DLP~k+vRv)JeT)lBD`Rty1qed?Jn}$u{eO_a!xxknXuco=KNv8t6q_2? zSH&_ld34ib0zkE1`@<WRsK^io+T;s(w5(%v>FOxa1l_snv>>*qU<?lvAP5r@DJ&$& z*WGr1e1iczP^i!edNHBFqD>)Hv9Y}Ivm<zN2jlrW8yxRBqJuN^KxGE*0H6uKW59$y zFOX@kOl0)3L+0I*^bn{To3k}ZkR;)puU9CR5vu1cim_)17r;Sa306k?cz`gl?{pMG zla4SzwiWxCT@3){U@+Ao(6Sb#3j<#lCX1XB^m$Bm78LH^jI!bIMs!_GEDl$|8}T#h z!}O|;0f4kdMYTKC0yS621fw4K3JOv!5aX78+el}-2mfbKv{oz;CCS{aDMR9D+ESDn zGFvMr<OIkSaRDEZGP721Y#Ol^vj+w?P0j8Z!GKQtCk6@?Fp!l6Kotz+w_1!5k%VbB zmc5J^*j~Z|cV!3(O$@Zh$J6f!8QI{U7^pm9@jxzhM_QZN^Qb3FT<O&<j@59KOKO}S zr!QTcjL_2BVe(G~p!s@6H#cl>dbIMCkP{mUik;6GPm+X}=ok@NAYTU2jf2Oa{v-&| z5Ws{;&{y1tx&l?!fx-T|KVD_&lSo7q$-2y{KQpX6b=j40aOGPuPL07};7Jyi4EO^B z{b=;kfei@)KnIWjEyV!KBOU+)i@;u9Rxctxp;OY)haiNMeJBJ;T@o(JFtX66f&@FJ z)@GyygCMpnzA9g!8^Z&d{*WM&B-!q-95GE;LPAF^GxIxK>_{MWoB}h`%5emb1|fg6 zCl^qaMU56<pk|BkKv6;Qz=(m04FhZmqM09(I09Z}+xkuowuJ(sRBI$7?2Xxye9FZO z1J0-zNfyXLV=GL}pxff|<@I3hAhiS&g@rUgFpye7_FWj}3GrABr9k_911b|kWyQGp z64<C1aBj%=7O>m(#jkSgPW`?S?+?R7Zo%6UXarh~2l_1P7u4j3jrPGn1flWB5G_;G zq+s#DoeCbKKC}?Kr;!0Uh+>rXIoqFyt$BaKDUu+mgAAPbP%fswZA~fKj`H*)Q%<77 zz@WJU$T`XyNx13T!Ywuk4DNd1fq^<n2k*|31L|>tf!y6(%2}Lf?88-lprk*;K+*+I zRPYxDK*D8wZ{-Wd8N(>U_sS7P9wa}IdpQXKQcISU1vXIVbzIxIg({efyLT`Et9-$7 zE-nx;q6h~mB0_P<9}GBs2pKr{>Flg_$ctj&<r)UO$L)ZPv48~XskBm8=%Rm!$B+6e zo3-vrasUpvhRikO=WGUc9LPx_sje7y7i7|aL>uT*-3tKm1qp0<F&H=+xv|t229h6m zsKI9L$Kyi~I@2^j>|Ry(rUQIQl64v2K=QuYyqR)JlPKPP><*vik!|cISg-?F(g=+W z{FFw@mb8PStWpKJ+Kl>8qONnN#RFsPuo4(bk{I~pc5@%x0e*{>bwZi779IRY5=gz- zpS0kTv_p76IPf5W?|Pu(f+4Y3E~ztH#2ruqEF$3QGn2S;<pv!Lunt?VQ%IJAVK7)q z9Mw|?n_y!B1B?zN9yx2bBaIw}7X{YIjAB1xRhg4iF<E$0GEY8A|I`#Ski<o@uT)dI zalTPyCn4h=%`0Kf0KluDrK2)s+$FRr4CwsYi!xI1p$wlez?7Qto*~}=kewOsfuWQ2 z<}2%~dIcvkFC-sfnJ?sJ8b~(VPeH-^`|r=s-_pp!fhc)VL*5Cx4FjlPhvgax+%e$k zh=HR0g#sRNundXD?hONVgKI^kMFl5eJ|3uY)BgyAf6>B-frNw&1C0kNM^yDQ=EaVQ ztO-BeIHBXVm;_O;<{N7RN$y%CNR#_@!a-a>3W5O>fB{1<*}Z~6Pkpk>E(AN|&vNnF zd^Zw+{3hmEjcc&*1dZ1em1HRi#Ba(AQ6L9V;XG`=;4&=ej!;y}aLbI$dUw9r<K-uE zurkGaA~c$3sj7^mx$YRKF~|z#2!w%*a_4~tfJnjC?n}uY7;s=X8~7o~(u6j<RzAwb zlvzC{Ou!hM;eEGz`~3L*@$uW<5w_RzS7_HDWPCqaa^#+Ba6Ndy!7~Qt!lE^?&AxiR zKOt8^W#dmBW#uU^008O=MhtxEfd&Rv{?9G@pWk^P!~ZS`;s`Pd+HI;CYwU#o2foI1 zVYlCJ&jg{kz~vdmeAC97!Oc#Dn1n#p3I+xh2=D@oYpMx`919Kh{g$Vf7Jz|K55%m& z05}=B?l(b)x8McE=iRB&?{6>Qp(@L&UJzQ$1Wh8o_4<ltdKG8q_v`JqB5LOYG2f1$ z;;lNqfSPT-pjp2?Vs)l@!oXJ`@F0O_9;iTXlms>KGwQYA0SxL_^YUYGg@NPo-R_!r z08P;hnOP`3S-eqiP9?*EtE!Ne_4$IoFfbJW>{JlxHn%1+h5@~zuX3;)0DvB_&)7F# zFsgzl805@fV7Ox--alg>^^LOzj&(~F(VbF_uMb72rtmfgz96~c_2IZX?o@-TIGxM) z+Bo86MG1*vTd1gnqvF2g3~Pl55=b%0(hQ>j!PpN8AdKd?0U&3pv96D#f-(6bUS_>s z_xt@DA~nV*i=C{j?xHUIQ>3Tvak|{C=%&;A^>W4ruS+rS#8>+_Pcg|#8Dzx;`&5xd zlb0_j{Z;^ooNKKcu;M#kPzN97D0Ais3F#ayqN2F~<2pn8++q!ofFFBQp3k2j@4w#O ze#Zp_0HYtdyMsm@2azsZhxVfhgM>s$p|4eSh($MNgCYgm!?BS-hE8^A1B5kTm`cV% zOswLRJBUXJ8$>E3U@X&fl&y_Ocv6P+Krz6b2bvyGJWxE4LdslBFu)^c0A?0`2(J== z>;2C5A)6frpz2+c8e@xyIrp`Mv7(WTYd7VJmryG(><9+i&As6L7}`ti4dLy)QztlZ zYdk)`&?1H40quk{=N*MW9oZ2jq~UEAq$zIPoRst^EjV7@ZTNP!Dq#YIule$EUOpJ8 zg#fxsnvTgbew#I0W*|IYe!p3~-<k3G^r+RDH?iR(Jd6%}U?6TK7--xQ3?wM{xL$w4 zfL|$sfr>G~tWkl_dh>_@9+s>{><t5Pg(C)9sGAb9h<PJ@v)9S#qQXGIMm)AxWSAMr z%_$Y9g@F+UBL=`ANcf*(000W-_qae;6b7!TlWC$_l2EEGGcSWUPkU9NtuBkFn5YWg z+Ivt4uy}R#=7xHmzp*vx+J+U371z8XqpN<5k8nmCwavrs@&VxiW0&Y#>55p{vnf?U zY(ziHl?4DTXQV5NH;6_jmFN&BL-v5We3(wkw*2*{t4rZW(wn@I){FH=3|w2F_aFfW zkig>oHl}aQa>AUcj2~YR7*vGVU=VK-HHZWXU15d{d4lkE`}O|*%Vu=QU#<WE>dzJS zzAzA3n25V3!Q&3TVZi;b_J>;lU>Q*b1?jhjfdoEsZ94vxs*>)QQ6IaH;;=mhfCn3l zB#`&ROtmpjn9M*5O8?Y^mk|TapTa<LZUgQzrk3Ulk_<USb>m%GS(CyMg!F*WAZ*X| zYZ=#eJFUg$D>>lN2jmTH$QKww0^xx&YsHE5q|fH<O@FTPTbE~L2Co5%cY;Vh@~Y~T zEFsiqYrlJ|^vK?Zehy}`veo&7%dEI#t=Ny5U?9Q!I7eW7u}gV@dTanFix&W5dTj8K zmFB^KcBg`ekVxI>Hw^erI1$wf3f|w;8-GX=wneE0gCc=v46OE{*6$cFT>=l2+#|nx zizC=x1ZX7~U;tO7MO7JeWlat`V0d8QOB|j?*HBL33kL1!*L*=`24J9C@j(1tX4$H2 z0|}5WG+ikxJb(eVwff*JStOcsDNLr;2oC^2^d3V61|48H-~}jw%^I0_brkIk)a?F9 z??VM8i3d0rw_kLJ4RV`SNyjUNE<j_+6X>A4Ax{<Cz3Iu__GB+m8tizy9nL@1qm~0* z)nv!E<_&{^FW#<%&s_-=17wYr^rOh`bKH15gb)m5tASwP_TYhnP%!Y^3Ip#-2tM9_ zzukUHX2O8!Btb#gAb+u75Z;J8pj4kRP{!2*?lc%64Df&jLBsA$9kubIbE*g0(^a_x z!REoxZX|G*1n0*T(x0Y(;Gr;3CFLKr(y%?!hkU^o1|q66_uBIdFd$f~{k_jAY*RwE zG6!rPa8MKasw5~Jp1I)Iu|_Lxu#`a(KMD_19JcLN1O{?=4Ez|;8RHswV4#7A2FB+E zXEKNV$)7XQ89c}-)5rMr=S&r3*_7G&WiO}N**RRWc(YIJhfG4YRfOTTzN~m4X`;wN z=BW1N0(|g80{{;FjsYjf);vO-do&~^nU4nmB@Y@Bobe6k^A9|5z5cLOT`*8BaX}{g zf|-&Kg#k0#Dbk2p%MmOc2Ln>>>BbaT8Un&z-mrLpYKkV*4@H}zuPp}P3q%L3Pck(O zZ~<veA3lu!*FiKPFOW4RU(LMX0|T*sZQ&IR#0!Y9b`tM8d}{-_?dhP_Yd9S(7T(gX z(frNbmrZjl&A;*U<?|J1u}*F)Yt6s_PTCzYy%yM1I0-6SmBwfTz`ISp!GiSR$P)=V ziU&dk4-ToWU}(7ls=(Lp`h(w*dGo6``SAt&Y`p5Lb@<9|QI)QbJE(LYBeJFzy_aD= zVt^6D20N3#AaTb)p(1Qh69?^szM+}E%o?W<4D3HImmhebVW2JEwCDf^3IGoc84RG) zP(d&d71R!rluKFNv|)e~lq&HogC!#?eNsIm)n?fA6&(n9_75Hy0Z<qKgSd&O_Vn~V zZ<wDgc*4NQ1IZCpAkbH?6$XaNwCpmGWcF}wx!Jb2wb7h5-I+B%4Euvz&Q3m==i=^j z!4MlNSVS$v`h0<^M2Uj+CdnMbAJ};S-yYLjiMH~F1*O-m{D#?1YSF9SlU$;XLKjO9 z>4(f_*1=31F;Q)$ORZ32e0vwzAoO~^oZo)QRjV-|Xfa9pJZYS;af3ljnYcKXjo-h+ zfZ-k(Xv1I1*BMax;(?-(jOhBdz@TAZ_sRM&014(b+Tu-AP#9<c;F7eXG?7Y-I}a2F z+@oN2#K43OJRIzOccuL*s|+NMR%1tBMG_pCSY?IBP(ftj7YY1<0RU*Nq2j><Sz?yf zgu%!Ixx(a#HkD)P0e~6=TG=hjC>$7B$N>wrr52n;c9V)e>{g`)SxTl0y~`fU9HN4L z-LvoX1>bF!wcTig3Jd^%tb#1iZrJVp;t8$`k1uIKtY}b7$xEZ4A_!n;AIzEHVJ=+2 zU>0`_+~WSNKU{aa_v`uHR^c!9zMfDbJA)1ktO6J@fSfb2iwABQ`xP5HXwB0BB&vBs zV*ns&ZaqM{=l?6xyn2KIubL^i_<^d=->35j^F^udq6aEb;8O$%1~?S}OlR+FAx~GH zE(07DM8_rrpbBTFM#7v?W$H%j7Y~feu(^-5eMdJ31<Z*chVwXw7#Jj1@EG+4hIj|< zK@0!FK-L>Jiu(ft907|r4CH{I&5uPMhrw+Ahb*GfO>F-%UA&MlfIt$uCmG}n-o%4c zzA=ssHWCR-z=%g%q_P@B#1uq)>WeleA!j5e_hBpZjgN;YvXg_aYo`AKK%Gq2Q6sCY zasQB8-tNy-B44ckKi;!p_{+-@L~FKAjxK2;+AI#8JE*`d1HX8{s5fAn(QP#J@C8Nb zA%{=_y+m7%lLc%Vby3Y2yzTZM0z=s$!K`0_No8qmO5mk9BY(Z>O9fWt2zFdp$z41U zU+-REpt3+SC3Y}S3;ovRCLS=*1JMuTD9ZpkNEp&ZBL>Dek*#CyhxH$(e<0y+474?; z!9Z3@;sKX8^1w3&YU}%*c>oi*U3VJnb3UB8hK>Cjmwl}naVI7Y)=Bvq!S0R#@B`Lc zTNK%pW*E9uma}Ym4XP0a7QJ&UKPM>p4@;2pGnZZF91~zZVL(TXtp-Joeb40e#g&`Y zwcT;%9R04Vg5<;P!*1cbcQDY~7&z7bMcN!eFi`P++d>2$P(%SE`mMDJ?tp<UV*LWf zTQNxi=^hufyc3^dx9Z#NCrx-b286xML-JQjIn+EdE+Vbf=R{m3dA0pd7%;A3Kn;nM zU<(JBzS_tGj>SHFhs=K_4pNPOEMIUDCswFf7`O|AKQMqI{>A`zP_<;a;ED~OFd#Mz z59~72u{>BcSXs)g#O%t_0r5+a5RqekxwC1f5=7URVGh{A0D}&jVTviF6;|Lu7P4%d zg=VlzEAa&!N56uG6drRQ8`&p*VS)nKI!I_vp~0YGKrf^elPg-1$?wyNkm|h30ubv! z75ct^y#GM^FR!>~8vw+EvtWchi+g0FI(cGZ6k)Ui0KjC}W~Eq$lC5IhvO(=V&I>l% z_mmQdBXEE&tU-Qz%dD|K?IYgoZ;kvPL86QHgjPk|-0OfEi|W7eKpA%?BH&Q;EfNre zJ6X41{SaM5IV6m79!}UdrMZa^%L~B3Q-bJ01rG*j{P4iQJvxXUxW|U)Y_-wygqd^c zd1e?86r{xw$WmS?{g>>>Y^0NLG?isyM;_U_06*Vj&QyGt<UI>5q6cE%ZeVd&?)q8Q z0TO61C^pE`9gna|1VJKl5HQeCG-9BTQy55}Xx>rbGd6f(CVQgOoRom2J$691JmGYD zyS!OWdzri<9~~7KRO<c$0BpzZHCpqC0INbQ_voc0nGMyHHJQL213ljW1F8qhxJ*oA z<f~x7A|n{Mz5TL%5De&ZcK4l9Wm)r>QEzlGXa@#5me6YMK2j$jceCXSQbl%x0r@er z9x#v|OI#fNGkT3g$_cauM6AyjWS5~*hT(z2z~6e{!3GY#Fpwl+X~LR6s@M<)4!J@F z7~e1u7zo!is57j*Dl|*=*HXDa&jjk|6x$2v{BC2n|IE7G>{l;YH1ki6$nnNzR;rN! zTL9#f3)O}lBzQ>_AUs@3p`wB+NXu=G<nMrQX-}bO!~kytBq#*4IL6*eAC(<%liRs$ z_kJ<srkyWu$YDO|65fJA`8&3Y^<{Jg@0GM6)RT7GDCswGf92q|nWwm#x>C2Md2{mx zF>Z!7D~ALc27v$l!w=W~@R3aCWfA(xu}5Kk;+L@wr_Y)rQ9w4DSTX(I81Vk%={<~U z`Yc&EZwux%7$^<|m_Q=4Dx!n@uEF7p3K|BUVuXkFA8c^PKuZ+=i2;NUsBu-+7ucGz z@`Q~F+<U?VOOGSA4Z5ScfXOWLxiYjH8<7sD{3g}$^VhH6d%xkk;xZ(W%pGw6v#C2z zq!6^TySr$Eo%JEXQ`V;nh(lr^lMZ}A@bl#b>P&{r*e4+hU!F5j1)E)T*RrDqvp7z8 zWyia~;KQU+CgP)S_iYqILISsJGO&+4n-6S6-dF*rNjYAxpK?ChLBgk25F6BnKch!7 z<v19SS#21Ae?M1Ovqi_OJDv@Z>q_{#y>VgtcLk!ZA;Tw`&$9kE4A9TT1Genjs+7Am zPk{%XG0<S(v0=dXBw=U<EigD11C%8A4=@M@LKF`k_^&V!7<|J(t>Hb03#vsVRE)D* zEfdiU!$BRmA~f^4!%=v}lfJcj2{*!;3!_%?KLX2sR-T3jfEfvRbW<<{6&|5t9Q8Hi z+c5wv+fw&7BG6;1j^&_%B%=uqWrtjYKCx`sxX_s-`sE~dbUj}2!!=$w<GqnNQ%b^g zCL93(Y$WFkvA%O@x#QK3)St6*#NPFs2!`ZG_=qPA1OWKNomy;S3fuBSrBFa+X`U(9 z>4e}ho0)QV7(gbdCL9|WBX*Cuat$#)Fd#{2-ms>>^KmyG)AI$n(=-R}TBnghS-_Ws z;X%T%VW6xWTYojC|K7p_$bT##$>fpaID!&Iwmr}lK<Ke~u7n0@Nf;u88chIDPm@CA zCbsSxf7+PEmJx!B5>75m|Gc5i?d}7mAUBt-Apr$QMmlm>Ep>>wu$gC@1dm`prjGOG z+<V~R&5#2#jw2`Z07JE&^fhTH0VIS~x8<z!V}h2ZEwf3;Wxu~%uJ1N;IA1>c{k8T- z-2rC|lt1l~Fwf5YM!#gaL?>foqU!zax0(>s!Kwl#6C+|sVQ_Y~Ilx2l0Pn!3+(eGs zR1$tFXaSh4k#t{mBjBX2s<vWQhyzQ(Kx*Vf(q+xu3k>9O86@bt<2!f21jde&&Wx|# z-ydfRJk>wO1$P7R_^-;$$Xd-{Ps-@w1@0%uS4Up}1AN?=AfgFXI}pY}d-;Mp2AV2p zFer033^Xw0n6{a245;Jn_xAil*|Sg}ezTEne|??O_-CbJh-+RI#f<Afo~uCu4=4y^ z3mCuyYz+w*qu!PwkOMklGo;fTS6Ao(<4aOHx}suCXN=;mW22K$v_Ji%5KJjrtz%@J z&dhYZUOz;FGRcduT>r}Gf!RXY$)mUP6gC%|_qR{Gr(Vt<qigmH3${iP-<2;YZ6Nt0 z#7Ndr99q9&BuDg<uk<JArF>^Bg(-V^Z-`QqWq`NrUzyT-zM4PH?i2`8Dhzbq0|V`y zjS3#`PY(n$WY&=aj5|oF;YqHb(nMq0u<#I}_=JaZ<AIcs{D}clxnZCyXQY=J6~xdZ z53qPUzVkqVp=Tn!onLr7f6hpzV4xINX3Y$iBg#sa*r2H2wwS6_t<<sJH@eY+l!5~h zLAO$Z*0Xi|MLCPc4D<$%<Hp^!18?Z%667E=Kb0ub+d>HTDcHX8x#9vTqxz*DY;f}v z-iITORd)0)#KQ)pN9vQ4u@4*LBFJn#tlL-1?)~k}UKv!G-`ewcO-jRn+ex4|CZE4B zV6sVgsHm7Qkf%b7U?AI{FP}<{^)kS_-APbiro>voh7Nhy)Pa|xXZAN+06p<Q8};z- z@^bw3k;Dt-4hF&O!AB(uT4hn=fw+V3Ucgg$C=9$k`GU9u1tg6J9=;$j_>KXz-<ZEW z7BGSh8^-7yCk3_#<rCX07|aui`*ZS6hDo$HyV%X9c!MdUB!l4<yDL{RQLsstprS%? zK`=0#!$1H~L88GP)0cPf>Uu?kZoOJQrP<C$rqh%b^z-g*!_wEE3p4wbw)GQZ=kv#I zf2IoPJ=maE<E#^-E$@C7ikODs(zkGBiBk?zv0y-hE!H(sA}3lz&`3az$h71Bki`X( zMPMLawu@2yLW+-Lxm<an*F`=|2?O6?;H4E?9^TMJb^gj<_o*klKaRN)$BQImlpoe2 zf=Uz|GT9_|mn`KI0G{N*h=KbYK^2w306p-9fjI60z#Rj9Gk0Z*wg&##q7c$ju9G>1 z9T-T1bDApf`Qn&fX>@ln9=E$sgK@wAl$y)vrZ=o%*S)Xq#HxhAKrb^lHfR`NaVB12 z>9ULC=%~Vmlirh2uW_bffWW{&)+CVaXrvC@1Vn%QSSjb&UDS1)&+^+6zvqEMxTqAm zDNv2>4GcDM)3dcHhGK@G0#{H4HI|VEF@R>t8*yJU#=$^x&TmzPA~~ENH*7y{m4kyI z@r`CCgn&Qsps$($n7=4C3=I6a^mAa)Fr0aoV8AcpS?3#77EHoGYvbGMPV3mE<|Dqr z3?p{{1C=*EMG4#s%<4E}|G9++zF{B%LaQltYhOIz8vc@n4>1ty-@#xrE-=t?%e6R> zHkK#B$pZ7)`Z63oOA>4Z3kpJw(;*S`!Dz;f3r3VZAp~k+0$Uqzz+iwo0}_qr<3ws% z3O(R_-eA!42|6&xfrq~GaSN0d3v+HCrjKohyOslyKsK{1Wpw$pEJaKW6>rMVhHKC` z->t-Yazu9|Po^MhqJg&Q=@bjTBn|AqT{`g8LW9BpihI*_O%ulS^~0uS8!bgQ2Q6OU zIP7I@n+3TGLaTBD?B2Pyc%m5k3j;v1UYj%o9)s%(18f~(@azQwn_!?E1aCSdDMS)j zpXjGdf&ut63>|#4enUd@1z&n#tRu2N=k+@V$`?oxR2fOApjMuGEDaC_NYcAnNWkt- zwH-8J>#4kPTxZ8G;Li(z#5Avy$&1u&3JQ)^j|nJo4#O?Wz6}HH>M2N|g`wZl)$H4h z8$y^Stl$?MOlOE84mVqP%}iTv)*MPHx`|Q81?z{^kaU4uO|nL})7kv;EwefH0k#$1 z)sK_Di56XR(R*e9#d;Qyde83g!$}e={Fa%%U2=T}wLR$8##(9*G(DLjg#CvsS$^sG z(0=q*ZE9B5OCXrqmiz!Dv%OhBZCRo`)gq9qI1wbunnmp0CQ)SL0pzA(w%EE{NxjpX z+xr_TavX`>)|6#!TBeZjK(#vnzMuJqfkcSkc|eZzD>g(0!9a>hf`M543j+lPC#TNi z1jS||rfQ-md;*hBZgy8<fMQ?p_GO@rw26~8|Fqj!$T0U}I2+odaS4Nkp`NT0Ht^D8 zj3WW9^+^~Y91;(*u_S?(m`Ol)xW!3uvm?ao{HQjSFj$2O&eWP6V|Yw5)uRF=0i#kh zS1UOd=ia|rDk9t)cAuF`k{nLK55Gf=_;beWl5%ETMsFBUl+{WQ8vq1};ek^snh@Zy z{{dGCMTH?2QC5S8d48O3uVc#{=z-i69_Y<{?QbyPe7Ou%4+e1u?XDXDbVxld07TQS zk}y<cXhm4JYZxdVfP|ug_IURQUl;&jPN5P72#t~?qil`&gn@X;;sF@YjQyb=+wdRm zF~SZo+!511S`w;>qj%@G-)Ix5z8IX5Y?JxR%YJ*f+<vR}oZ(@gU35u1&)Gd*AY)wa z#>A1DlUH|}knr9E>8rHnQtP~UDm)ocy(Z($U+bueudo~5_I)xP`flhCAFG~nvqJ60 zYuB$%oa}t1_Rl70)~Xn!?k)_L8KP6lB-}E?P1Y1|a{f?lCPJZ6ejj{nRfilr82<ZH z_9gS`NC@@AmsH}8P(1x47(h#YNvbW{BfcOc)^4Zt3@<j{*p3blWQ+K+Z;~EM&JG(C z3?4|(365LKON4}_$|6ML4jB6FsTG((LW2RnptXH$V4yMB(=VL9m4Hvw6Jq@0f$tbd zJoweZ2_r280|kR83<M8H<7=}QqkR}(p%LpoXpCCA$O|9}GN!Kil;R~u6zGgo3`X^8 zWBKX?<Nq-b3IGpjRABHPLjwTx#zIUP81Oy@?I3Ayqm;7#yG*_qHk%k^AK<+_l6YY+ zi+FxNoV<DxSz1)?vG9QN_q>2`Kw>%b$RYe#*+>V5R*2p>p<%$xQ2<a*q2xir1kOkn zQN3$k#U5FG1_=WT#=dt*OG+3Y!`71XTb4={2JUiqX(0TCfe{8x4+|<yBl>0u21v*x z1rK-!Kx9B+U|s8WpLrlDf;$f+HiUs1m8F!rB#Rz7qHzN8j)8`U$ilLIJsK&-zAw>S zjO-=9nHlHB0Uu_=Rm+NZAN%X?6vQf$Ck*ntjk;PI_83$r=rgFp0}DwUL1MZndd~q* z5jB{6PUC^rE#8oW5)$i$fy0$7JJs((=gI49XGgF8&C}!YQjYH?S(NRb?DQ)$zn3>q z^$~tBQ{&Mfa!Ia-j%~BRv3{#FtWv{2Fc4rg9yl8Bp#rS|poNN-8~7Pqxg$t8R`94d zqP_1E2kjowAa}FhpQX5?6@!6*q)|jL@HFu2Bf0Usr-nmVw5Ac0#j-q5!h8%3GW;K{ zA>j)H$r1en1J67F2IU2~fI-isW$bHAKOP_i6dE3Yfm(wA44Un0@SgLCG?4JqZzk`! zLNnvpTjnUEz9o~g-$i|Srp3(&%h8oVCGT)TBY_&`?U;RWzIOsf4UKe#GYta}Qk86( zTrjgNdgOrYgRKUh_SnkQk@5X0(E&~vNCH#;Hl0q2Uf75ec6Lm);5XBMvVXBYd7qX- z)8+y~{#ug(n4ydw0Hi$u;Ba;Z2>^giEc56XFenYbExu4r5Ez6C+PxG8F8=znOe(Gj z57awH^7oN@i<Bx|v{)xPh&x!^qk}R%<kP^35gzRe1C0T`c;GCzU%o)kBh~Q09Rs5# z{Dy&tUl>V%BserGs7H7}q=$-;2kw>9wjcjI8<lUABxQL%_u8F$Qr2o#FtE|ItX-v8 z2|-}M>aBCw+CfyolwSmrbqf_o3_wmzCwVDnqC72_rziD|839<aWbrCvpqCh(Uv@FA z>=W^-{xYp#S%>ni?EbL>hHDZmDH~7>KqcN<tLjro;1os}H1ELfESphZ7-+{HS-e{I zGCgNU)4;%+Nv}zEx*qNrAnK4G`>s@zmP-mSf{i>r><$TO4K@!9j0aqywcw=;@c@a~ zEUwNl?Fj=E<A27$CB7hfV8p;9KY*40;(-vtT@utm6`zZ;E1iyx_=2NKr-l7nQrmxW z*M9kHd;Co&geVAxyhl;TxmzE5gaE*$lc`*uk)bhvZm>+xk|P7unT+=*CD5#|e;Q^M z5F`xA0@Wm(x0}wrU~EBpzuEPBc~LW)oB}U^|49OK3K!v|^?f{o>E@PXgVG8l1BQl& z$bc$8Zd6bh_$UnAVbJi9@g4>U|5vMBZ9Nq^zN;=Eh9iM0ED8Y1)>6v!iQujnY{Wq0 zf%b;~fC0crFHu2!YomhvidiH<YE2)*-vKZ<`3(bq_yX7VZw&n93%-#+!vHCA5?PNV zknr$0Gr;4XNFa`2IKBPeoqzcmOpL)nU;}eZeyAZ?<-F}wxu$^#(FyLi_&j63n2?(Q z&ISpOj{!0c8Mba+K{f~te4L{2{=xq0**Wc%i49@X1Z2OEE$&{`+2I}elL6{@S8D?D z#2v&t9Pz*5qlhSjh>!~m$|JPEKXs=i5u5jC@yGDz0@A_*CQ^S=0&QDkk5J(n&||!0 z){*7niv&DUbvrx&v%x@6fgf_dd3?kFUl<5ixN$r}LMZX7M1cV%iXjP}G0;3hZt8&n zp7AaSA8|opAnH24;LZaDfKdkAHQ^ltlt7CRnKhFFC{Bu?oI<VlOzOCVLBA4+{{Fo( zE1F5zqmx?2Vz^=-0IW`(TFtnRUF{)I{4cM72kJH%Hy**rPPVyWz`dtuXaH1DZ(Al& zurwXqRibIJ-|lszK2_nivVWe+Llt5J@nzNkFR261T+(iLrm56MatD~<cut9UHiX%+ ze#^AzL%F8ALI?&Zf$)C;VATJO{{w)A0fi{d3tR#Wi~&wYioO5k$ZL%Acg<%B3@xs> z*qrl$0d{W~Xt(L{$u)#1v<C)~H=dhHre>+H-NF=7s2~HshJO)4QUs|XQ9YPBBf0Ku zM4(9y+(hviu#{f;f&xHE0{q;3LCAj?a{_k^Jd`2r*O-$*n<^-4${8~BmIk<e{Kf+l z&O)HQ+9isSBrzMi<h(B4hDLHSt6VpbpV{+x_GJRSshOj7seNc)(7;L8WG1@7BLPJK zASmD#%{XL@+a_^kmc9-W1$=_R^71M!J|$4~1DotCNVLkJ<R1nYq!IRFKuLpale>*; zh5^Z?7DvP{q-X>iRDy_K2nHeoM=>x`K{)~zmz%mr1kr@_p{$Xihiv7Y7DP@Bb5{=4 zENDLks8esi71p>83Al1^Yvz8Ug2x%}Y`|y?Ictf6R&!1j6b1x|O%R?E4SlUU1^@{n zt&q^>j1tNvW7BwGl!cWfwBU3Ug!eSjSFWG}ghU4!!sY7|Bt{Sh0BUto9&&j5{H?}d zzPZHiG@-$sb}+vt4I3CF%M@lv{jG^ek!kj(US)uTgz1!o3GoY&h((q2TCLz!ZbDZC z5|w#gl*JjoXV%&ytKL5|zBmOtJgkRzl^%zkJ!a(tDd)EgdF5ya6^5!0j`>lo;34`j zk3|SoA7~t9DkLF8d_e_<6$=1BaYBvvxQ2v;1V9`?;)0(r06b!F61DCThUErh=z;;k zdi1w=tE9)>VEMaT`Is(_t-mZj0;4))gn<F#{@1PM92F3U%^f67G%huQf#QL(`vU-B zgZ~l(V<cEeaQp>{oQdJwmzGf<cb^u9Kj4R#>6&}><CTZ&@74CrFQXEKg{T4Z<o&_V z(ZpPQMCnr45K#EV1dPGrlj)50mu3;G3I%x<3^MlFJ@BZyyP#!G4XhU}+4!2u_EL{? z18ttk1(SCRtU!Brez<4u7dlR0V1}jN9y(JsP_c_PD20$Rqym6=?SwbD3`xAE61jC+ zqErDk;0W?72CQuOa|cZxG{4ZqfMah19xKiw222>mh|KE30`g&yLeF2pz~O;7!Cdek z82H;4_?{<VRBwzcQuV*VbxcrTMoA{woI*`2lrOl&1^m+&Fz$c!1;fbv<p?nRof!%S z>gNjp8UASjLy`tnU2u8(b-e!EU4CxQzs$Qyo(CRzPYH&UrwR`b000T_Q1ZZW+AIuz zr~Mic%>@(y+<)plbV578|MWoP1Z=P$pond|;t=KTx_$K`k34zh?(Hr`bs6J+BV(oC zbkO<3z;B_VvL6{FM$upfi^4`$0_G%<03IR>lCq|XT3X=van}Qph$RUE2@NWc1`d%l z<6CX>;`+<h4!Ab^&m5=`M6KvjxdO}w1KDvgP_GsqxVMKdc)ZjO@@8tv1#<*2KpX-< ze)kFnMi_(#M*bf$01r=kfYTo*wbyq|*hdefNFE02G49|C4<!-|<YIuz2{?{@Yp~C< zYPG+9{61U(;OFl8TR$Wypdkr>xPwvxshY@lGP>|tW?tl&Z}3&Eo}oI5NNCdm#glcv zbtV{)Pw<O5DGH1#z@@xEzoxI$2+gCH(yP^<nZZ{dGTHV#k;=w}0d7l^?Ql?hnDR5B zq6G5sU4VcGf&uAwCC4;_z(GDi0z7dRwJ^fqo*nuqNkAdQ7bvkVLdYYi$SQCIfLRy_ zP-R19MXJ!qFGQ$o-4_q=1r76w3nni6Yoz}R1G%Z@91%iP0R`o&zzG0~3J&4DT7&G7 zLbzk#-4;v@45KfICX5~!c>od~^#fn|fhP<!Bor7T6e~~I)L`&XjX$b=0{e?aSmA+R zy;+sxr(!ej%pxh_WM*b7gj9iFydggyczBdv?v4Zly0DHZRe9OMF1@F<q2Xz=0hKsP z4{!!mf#y+E$SIgL(35l1E;=*0CLc_vDO;LOWRef7Ok`LBw>sDi%rfee1mM-oa;x!% zhrpnGfdje3iX(Co2E>mV>WHmJ7Z3nEFwl<8Qo#TTQM2=$W*@5os`80NS7nfcZJiXN zGgc(DT-h}4?_u009%$qJ>9GO3C}Ph3{N&6OQlESg4A^NrKOO?Zk%cWlXc(xt;BO3w z3+@=;5&p!$zW~q(A@YC)k^gA@P(hxGfHnf&>-+EH_4jc69F9LcN*1AgQZODNo~8Fr z+2csW(b43k1_m<2oO`cMM%T5xL8SsRU09~a3}Dbuq3c2jI>Ac`A7XuvNL80c59nB< zZ{mEsEq@Viv9;O+Z*0tC5r#O^0FP4;Gafv~^bd2hzVm63i(0a~sbj|*B?S$CMh^)% zILIKS!2mHJUap^G*tn$NcC~5pTjpw$p9(+f1Op*qV=Sw=$e6plm>bEx{MF2-<X-YN zUt4cR1xP@q$TTz<z(Zh=j7KJtN)HeNx4Ry2F#3YZ6>mphP$`0zE565uLj{J0yw=13 zRBX!^IMXmtvM>P10hb~5?bhCZ_zhF*S>CqCA66lyx**H(7(LN}H&+pw9#9MuY$Obs z$1iw~1wQ<RH>BVs9zpLhTw(#{BL-}S)Aqg81J!jYNLw$~a>WIbgk5@%QqZaSY}GG0 zvs@T20ZeDUWnr2U26}9~-Chm{PT`H+0U%ps7cJ<+GCBe2Ad0bpq|G%LVwH6qEzam6 zfe`~?23aOzK;=v`F{1;3&G$M>r#Cx1VB!yRrb{Eq3bZMe2@(q7|HgoU@2)|m;oJ>+ zvyMtl5e(#KeFjAZ<plzO<_kgs_g3QYHr5kHlQ#?)VqJ?34djM_JU&dHSl|l=i3^(1 zgM@@6?VW;s`MHyonCG8TL}t=^U9o?E@hfRr;CTiHMGL0vZIX<*R70g8DnFoh?ER{d zqz$Q--=r``PQCD)di1jzHp?nJ<W7~I-FL(iLrpPgReu@=>Q6E*;sqAiAdTI<*%*n6 z2vp3n-~<_D`GljzWt$zU$%L|klZ1!w<`)QnQV3xNJ|feOjR(RHK|-aNgbWVaQ*)8; zvA!zP{3<RakPtU`Mgl3wF>A8Lc&QRGg#iHAM_f;K0^VX{g@O%u`Kp8l#Rg^NcrkuI zu0Q0!)^%%*C<-&*Kw_GV=~2OAJuKH-U!G~uWIIP5_y-1BjtIB6xZp_-6bAa}z-sq_ z|A2w}Dqql~V8H-FAVFcR?rIp2Rg+Z7x{uROB^=pw#LqFvB35dM-Sd%}tVacDtG$WE z&SaCvoH@7*HQU}s8`!)K57Yoj)j@<}>8Q9-GYbnvr$ZcWF=sSG+(*)h)o-ix?L>@` zrEN-Ey2Tm>yyv(*E`??@Kb7G+#d_~*)KwRlS!i0Z>49<ha}%W)J!ZxM2GTO~s1`^K zZSZs86hJ6dNydc%&NP;^I55RS5GEF|n}j0yZ1Q~&a%L&S@t2JvOBqJYlzm61(2gIE zZs&0fA@`P#7$BKROmwgXc3&><t>F0&3?w4ZOzuDOg#W@oO&=Et++pw(7mV(pcmNwP zrAOA>shPAJ=k4?N*7htXGT?`~LWL`GWvS_%VBZ~;!tWa(Z3&MEDaZMZ$V8VZQPx)G z`}hbR;h4Zvpkbfti4ndILzbayTzeWrXVhEMvX)}X@X;GEpsx@@>#jf|!jhBC!j?eA zMkw2Tic#fo2Oe44s#jIwht>AVOYC@dyzNeJLzNk1)Hg$C$CyzrHdJsNUV?}Cj>MRp zh`>Qq_{J8E!KgKs^8GRuveTXYhy7H<JW8Gpk&ZSe<xk6{G(r&V-oc!EX(FL)UD&8# zx!qSiHW)P6@O53>K}V!*rRhq<CaP_EAUu$a@iz<@mGSt+17ni#tClPzaMuId2Pf1) zNTB(Gl7i!_2+j7P^2384elqqg$?vgf>bR;-&!8Aw7!LMXek%IV_f#5LH~<U{2}UPq zNh9Nph+7?Hfv`)RMpPTTZD`YVkWk_fg(h7lGzbPlr{u%R(~%0)m}F9N!xvBjKB(B$ zl;O7Dy}pPPEC_nzOr<wdlzwSHTE`<?_h3+~mTI1{WMOQ5=_$t224mDvlTg?I5}-mj zz_?j?^a^5Yjq8`M;Lb#&R@-?>>QGJbkA55>yJTdvillnK^E=(VzDxpxkbg7oLmvE1 z4$m0yW>iqMthGM91%`JF)NIi+25LS2e~E!-(>FXs(SZ%yl{+XT#77_jk?D;TBmfSd zy)vq-0er&%U_hPH{4zzt!@z*W{f4-FrgFGi!^n^5x1tEIp6ZukaK%{$DV|8Iks2fg zy2k9rol3T_HK#yoha8NTsV)mV?qh^*pdvyYc>_mmjF5ub+81&Y6YQMt@dqpk+P_&U zrOadKEu8sD$yBLHvInC8Xp(?Ch&*8EXag-2k&?wUt^snwAz_1e6{8fOA!gvS>3(<O zfHW{jX25a``yp8GQ}yby**NoHZ>7smsYNho$)dXc5ee9!JjLT4+j&ph88oN}yN52; z*U7rHMF+(L|8op<2@N8iH}@J6B+$p`UpjE)1bp6rk@<pR0|3yJkjqUS-+lwYqlpX5 z3($d8zv_}sflAdBB`;*8$L>uSNO18HfrnPvhMm9VIO)U{AA0F+{*bbNKpIeMO)jvz zcp<}_m9c0uw?1)<B{tlya4eN7q(aJ=<&mI8?QwYu(-MIPFQfM?7#}QK%R1#9a;`;W zLcDSKGiwROjC2@)gc|kDO_U@6hQt(h!@%vVDTVmc81&c7U?LybD>?!R0m&h`#}ev> z$!hz)%+6`rl_K@Sj)sr@oMjRi{SIt!ZRY+11CUTSuXq7f`f}qdJsDqfy2plpVW9ND zod;k*7}foOfsq8hMFfS45(xm%ECnY~0@E(Z;p?vs30QP<{JFH33zM~kuz~^Qjy4am z@ISlYlCLKjsuU7P4Vh8Ox9NNsI7KKXW<2o-90ZSG`XfuN*LWi+f*gd9ZFQADMJ^{; zSZ0E$Iw!s$eImq$fxa_?(2Xz%8?3d(j8g~<3^wpU5ghjG%Zoh^JC!FU<-5T$I)q?Q zSDr9DZ@d@bCw^?hKPL+e&KD0v8#s_*R+@4+y_rcw2yi}|lQc^hSS}6JEn&b+RRx-5 zl2il|SSFDR=dzJ+=l9<$+ZB#!WWK;nHF?kg(7@niYYhYAu`v>kMFo{Erop~=pv@XT zX~H`O^d1)NlB9hqD>b@{_P1e!;)Hgl9zy~x+3Tfdm+R;6jrARpLWiGVAYnZB<34G! z!RI+@Qm-WqnCatChvgXAR5q1G@DLJ+Bq+Iv_LDaVDk2Ojf9O4760#Fx*duFW$pBe( z-{(YctoV9vSAD6ZP|`srpsjC51y-tJgPcJEn_7|p0GstD{@Q;!&qTA$)?Q!aoB8Ew zavgqCL2ZfYp$~em>Q90PCQgeBpcWbf1RH!u0MHKVJ<fp8>GE;3m+9$~xRtats9lmj z0`r`s)VkZOC_dGUT*D&Tz;>W#lke0WHi$O3W1v-`6xyHJAYYr7DG6do)M@w|Uq}@R zHw?%THBCqsW<?m^7Zaqur8FT~_(&3F?zjTOX8IcS4F=6SuwaP+*w~dv*xE79P85gR zZ!$nafD-VywC7LOvRTS;c8?lsHgjj*5F4;>1qE;t*B}*;=>sGX0JK(ALn?$8vf3*f zkN7NiAhD1<gQ5i^y31w-G63sk48724#vP}xPnr(g2%2nsB0ZSxl2E}0MR-3#(165o zJ|)mJoq(aPzg!iSOZ6Qx3oLI?*?_S9do>oXOhUn+r4$+!82(IO0JtCI%$te=n4#F^ z+zbIz>TU$m#@IX|OZo}`Y`@7tSR-@HYSydOva$q|VmWDomOJIb7`=GFWdnd4$^8O3 z_aRa6|5bK2R*fsc622MS&0seJ$Y99;GJp&q1IPepfHN=|m<%8T$N)0f_kC3}vJC8f z?{Vhn2w9eGb#--h&yT2Ndf(FI0pkvm<Jkg{9f)9H?-&v=fQefls2&&q2nK5X6$Ws5 zzPw{2Q{cs9BzOD^23Ss>G32BJW`#Tv`2Llo0Bu8<r5mW@%qf_FI(}(5<f`GGaDec` z#}fs7$s%EdL1Dl?NDx0R7m0+}W<1h0b9G?@Pv%0`_cv6_F(v*Em_Y)rBL)~yWEmNk zzr^pE(n7f8;qoUSp{F4!$t7vOBe!6LGZ$e)f^46;Q4C2yCuqL=XIDlQ08C+{A|wEi z4MqX^Uw)7Z^!+2#^Di?W0R~ydmIW?$@30CImsPxAU2Z8wB>u$*Ehf-KV&C6}&!XFr z<&{{TodI|#isX#^EQ-U!<%59+2rk8s^|y!t<S`(3{J@sG%GJO?3PfUnor!_R1p|Ea zK@$c8mbPg4`>KH!+Q7h|0y8_ZU?+R-u|7RS000trBdW>+JS3EH0$H>(LkR9FA;JKJ zNN6xVo)h@C!NUe_;cK@E21CFW&H>V4jK{zLJHn_?!S<Xl_VdEB5~b#o>)R`qR^Aa2 zxDgooH>JfB;=$!P(owHxEIJS&hq}b>fCN_}OtV9Y#(&wO;{N?fjCkDB-|?!5WtP32 zL}@<i8W>nhobIpP1A~Et!2>Zp0GRF7H$FZi`50sZj}b#ff?^CFzMQ?Zk^^9d%+U#V ztg^LFrtmM{jW5NQ<Sn*-d3M5J{M)n$3_xe-o?A-XVj%05x2GWW0Wh$iv0!T~F!L$~ zxM{#r>lXu<dyN4QYfC7{A~<Xk!&^8F7@%Rm09^wB01{vUG(Lr{qCR(+N!-qBqeD<1 zCj`*Z`M~wL3H;05pwXd#7>Ki@25)7CbRTGXcjObgp*ewnNe~Q4jL0L((C^HzKqs7D z`HZCGVoY?!#HfWUYO_{mt}oA!V%LFz{VcSz-&PB`liWS%^tTIMnSjT?oNq||_LAim z?_c@aRJNI`$U<bB9bLl|63GFbtTatOFc4ud0>Lyr<Cbl#i2*iP@`z!~h=kqV>yS7= zW0WSCb)9gG6)p(qHo9r3nX^>dh9t$RMIMMlyy6e{rwtf@fuH^>20#c5$PrQ}ZVthP z8)z(;;|W_M`h)>vK|72l2Bsc}(WmKaeSvX6!VM5&i4i)gb}wQeS>YQ1fNjzxAr%mJ zob1LlXN!L7e{LyOhO7Vs7sS4JI*mBoWC8R#$gM*TA_buZQw(*&0|^4FAvGwRQ5a`5 zHE)NJs0GnGKnMK~*z)Z3r%`|*gOu+WEObpec78<}{RT}=wc$jHKs45yPE9Z`ev@S2 zRzF<yrodq0G!<Zm1{qi{?#cdG#Eg+AOfs$YF}ilw<sE*Ih_J@M000;uf{1~~7j}XQ zkl>Tr7>YozCBA^`!3LS>e1UZ3hwv}=iady9lOY*QnK39}?~_nLG9Zx9hGtM0B(xC` zxC6XV7)%T#93&7lFR(^5cmNEf9e7}3Kyzc|#pnTmc1O)F`(S{&==P<85KZ{T_%Ui< zV1V)$V=|eL&Q6AiMC2#^Phk+#!v?nmg*Y1V3+`$Ndq5>Ro`evPh=w*GcTQ-yXK?@t zf%U<zA7y}_%)EPm_sE4!jp;p4J@(`$W<94fh|{iFNsQ(0eLNq6kidX8xS&?UG>1E) zJk!P<-*`*i-~#I4w6lxbn_KVXuXD!|TyGf~#E{gi2DU*A81&8l!UG8k`ByeL2tuR4 z#K3l70GSbf;9tVMumK677qdu|GhbQHasefLlYn)Ji{Z||;Q9HD+vos^pZGch5{C8H z7+@b5z!JPl2O{4bRUi)>It{HAAM=3Z`5zb%0EZS-P{2<_C?|jc3R4RPR03$uw203g zv;V+=vA_qaUgOb;?`DED$dG`G$i&K!Jake002KfULjX@Sg9?yI42*G281hF{#3PU( zOk-cZ9?K6vp04P^Lq(;;^Rtu7YbJZ9f0m)4bm)+hV^GGBWI0L(7(cQUA>x@T@!16m z<c1z(W+YKCyuT&;plb;-;izLvv;s5e@1GFrd@iyULx-Q4S7Im8IwBk}5H%PWJZbtg zq5#%sX-$v-A%q;n!{h#q#tyYdEPi^i;TgziSAG||lpk_;_pp0>XGKtc9p%TFBpzT8 zO$!gGaBLAa8K$ypEKm)$CK(Jks6!sOvx_jX;G5iVA%SHlfdBx|rZBjn<_ZsNo)v^D zfxDOU+h?eNyr8K8pUXOU02pi14~X3{G+sRV1%Lta)v+b9wYkjBzD4o{RiaV>>BtF~ zPgLXkgbdOsW(Qv}((n0}5x;~6jGG>r3)Vom*jyV5;SGrN4(Ui1#%y<-`+oCI+J)-2 zX64XvO4f9)VQBhpxSC&##F=Z}@ca(f7~}|@un?4zfU$@~bB2=gi@*jM0T|GoLkJd* z)CnUNurnor7?3C?5|9?Gth*HhJk@=_+p>t(69*snALu}_&F~MF*>oL)3-!s*Gq6e| zdZilgSaAl+Vd%x&Fn?(Q+@47Vri~n-G)lcF7%&~MyU->E{F%lAW{E~bWf%#cH8f!z ze?)-;2}lTr?{pUUYQR9DgFt!zgcx|cWC0?Vg3;(M>3}0+N{U5x3*KW&$^wqGcQzuS zf5Ue$aiC1Z+R+&|;-U(cm5>L@Kfu7h)B*Tht^gh|lhHo`g8hz@0T`?t&cDzCD-7JY zqVkT>g9!?bMqnHxUy{3#M!(OKZ*&qOrspDn!Lfo4A<pb$jyST2&!TF_;KQteX@%dq z#JzUkzF6qH-kL1}0Bg$(B(~yronfdIhdy*^vc$kce82k&gObDcdAoaN0VPlY8#ppB zOK#Hto9M9l_vGrw$tAwFhb#84ROVF$Lkax;sY;x9FcuuxfPLQ8Snw4C^1#3V)=wi* zH7^+C|1Acvdx`@Bz*rD%&(8h+orQp40OAe+pwS_M!=6z3)6n<!GL!Um3?cLmw@a#; zSScv;vvWsWpj_ZffdS+URPYNlfMUQnLUh(N97kkoGHe&+<33;@MkH~#!hf$GV0cUY ztU}B%p*&_n32Kj|NWk}bm-|jlWk*hM8w}X*<_^Gkz_?i4<AjFuTMj-@{o6b<sfSk` zOHazc=n*Og8G^zIkOsx%)(s#5?2dGd^&<(k2@pL95?nnA81VGQSMZaM5SC=$%pO82 z5P&E%Q$J+l24<z>dzBiH6zKSk0tp9)eO%xh42152fm^kx<BE|V2Oc0mWEhEtULY}c z1_rRcK|C1nWH3NtC=7xDNWkkeZX70O#aD+Ka{geFp#y*4YA-RMFrX;_lCIiGWW1n~ z3`^joP_Zxo0PF-mc(h1hKhCS$V$iAxUSc1kv(v^obkk#W2!}JdGG!}X>boS6m|mO^ z7s3G90a1Jqrj!%dM^}IWSXx)TxQ7HXt5kT<upRuMz(XW7Ku{Wz3fhsRk`x2e{ksD& zk|~fjJ|`l)?pO-@R?eZ5n$>sBhOX{8!WSU4Q8nU?BnZL4uyw7kN=&jaVL)i0ogXye zq6a1hu*-r0slc@KzyqJHKlvfR7#M)np$j^UzyLi3V4yvr$PXC4VI4Pz#{H}eS8i^o z6yfPqIBa;hgis5@{9IFSl?w1O12?P^>+6{8G>&5|V8F!_$_b+ur3v>gHE{Rrq*0qN zh=Al$dRE;($8m6CmcBns@2j>D0%%c8LL>GU$N>J^0i|(sFv<7dHZ*7>rlpu80F0N1 zM>2ZlqK#lNYKapDC4^9c<d6UnB&Z6uy!Y`H1p>qP9q!Riw=e@43J8Q-s4}_s9VqyD zW=t3iu*SpKFBpz7pfDgnR}&TkSRWopIH(>NvEUmFg#6>t!GJNEN)fW~V)OLDYO&{* z2UQ&k!b&@p=VoHSOfw|{H69IAAQCW5Jo*9M2z!JafB~_Fm$Z@M&FT<=!;pc!=38(^ z6vE!bfq;Ier_=KS3^2M@)~Pudo9e}CKaTSj4ssoA-Al2h&HxYK^7VReK8uz-y!2n+ z8%P8U^c!*o9CK^7f>^!Tk|tn!1{-*tSp4BZVrN<7ipB^7iwVI)bfZX65=<(P5Wv6& zVX%AQOjH3#;Da(L1}?qf`x9cQFOiFd3eHw+@CgI_t1zG)VIbo0TMSTVBO65)Vwdlg zKt!M<&<bI!A5O4L#PFeDfUY6|kkSx}&R8GS5fzc}LBz-IG<01Olk4Pty1YuB*g*=Q z#kc(|0s-#KaqK0B6AM5>oHwWtKfV-r#EZ#*c6P!}k0$THd`bfBm^aq$yo>Y8|KiFi zB%;D`BMt)5qXmEiMOeBd*bqe-Oqi}BUJ?moYSISlJU&tLdFd!4XrCyMOpq!u&Q5@^ z!Ym935Q`G9b`&tQTrfDn&INj`2s+#!cK9+XqD$&jkAQ@DL3R)ZSa{&{XHvq(g#`eF zg98RqB_Lj(B`?503l9uUc$^m;cmVz1KoEI=hYEw3vYfz-!p;8uYWqPfpg6!%r6>Vo zfl*+C<C_trysY(210@iGzGKER?+h^D@<s%$4-z)m0s#Pi%<n98#P_9oGQN8nAn}|P zjq@+Zu_nX&vFsxA+y@U)2#f|V0|YJd0}bcmc)<`<Xzm1h-uMWUW3`MNekv8K^kPbO z5*oJr3j-k4nEr`hL*{rc@1<e=dbjn2nMj5iA`zno4F?heX=YD0XQYO}huRD5xFFbX zw_zoAhr!DsJUsy^&M?bq@urGvD&R=lXABsrKVu-8a6WZq6baYSKNvWWLwJB%E(Q$` z+<<}m-P;Z8*hde50d$~h-v$Q2%;bTA2XhMG0Sv$Z;))Z1L8!pcubzzNM`&@Jb8viG zg&a&C0crGy8EQW4m<*0PM$pvjfd?lL7fc5X3Rw9CN*Rz46<CntBQD_VxG;qv0KmQs z-~$o#S*(L8Lj|A(g+Q2y>^C}SWiWuN!ULF$No4FZ2boT13K1j@^gM1K1|bj{8Z~^E z1q5S3AYlQ49hO=4X)Ie2vfID$aUnW6N~J-hp!*=ollm3U7@A@LHdu_l>?9VH2RhR* zy#}ohWa5uhOkY*Rz|;eS3L**ClMNS0BqGGD_8H;bn2$C6wqW4#{WmohiUU6KL-z+Z zG{j6g&9VD!T^RAN>9Y_VN67d2w-sZI-l~EX1J2Re_p$*GMo$ta|6gq_t0pes^_YHf zZ5TlDpOh0GV9Eg2$J4=yDWu6h{2&$dEs{ogKGC21ETWiL>UCrTOrU`><&bST0lSNk zPC3a?B58pg`GFY3cP1^p!}RC@@WYw-G62KwczRSHYn8m^$`CsP+HrqV3Hq05vVmZz zHc%K4TmTHr05%8&k90H`GG6~-4NNp4GZBva4pw;h{cDARxdw$bBJy{W_vQudFk0n? z9pqqF=BG9zLW$j!KP7$g0`BDI`Oo>S15_dd#6Y5nB%s#^Fm59TFntnUV+4S)=97G% ze-#7P18L-XaKZ*lUD7#7;86KL5+m?mBEI%jG<tH)hv7H^42V8~v0NgfzzZs!6& zhZBebfCr09?@%t)zZvm`2N>WbjS^wc{nva6+#rE{qJUMw0>EKKV1Pn|MM8%f-fmeu z|Bkte#&KBv&EQVFFoKvGKnpxu!3qO?h^B-XRAp$3=@$%`Tr?O79!p6e0Sxf={nMY{ z=QrkvmW5S-E7KpSfaB_cu0m5bNS$zvfhh)3A6R(cZzK>NPzKCKWJgAtA_W5#1DJJX z`T+orcraxmWq-5*Tira&05H7l*&SAp=Tk5wG_Zrc00XCKyIW)@zQ#Q#-!A}+>~Oo= z$h?|3EIN)D?s5NWgPapz#(YnFdBV35pGS&hjk16TTN{zd$P@rg@zin#ZXprVfCK;_ zNU|eiP%eh~=_$V30tvd)_$^@X`GtimUl5$Y6+B>W42tS7Iz%U^AyZEPY()jYP$Z0M zgA7m%unapGcz*pu(D^45lxEFvG5xZ$@PK1V54B=*!@&ba{}u_$0}BSUbz7o&)L@H3 zF>Wvr5-0|6d8QXJgzSW8CQcbpC4g(YTE!fCWHE5eO*1s0^RX;2C=xglkg(`tq`ndV zF{K7nqK*%`cuNfm0OHHfY`L+p0Xt9xTTX!0F{L#|O+X0H!M*>+h>$~`e*|)Xfyb49 z-0;`#vn9$*)00!|f`pnoNC-<509Jv*;p|Xb1`qf5TVOye;G3`n9knvP6&Bn*y;1eQ z@ib@w&fjwmao?2CvXU^+^a%$XF;WNvU-BUE;3AJN6czW+AB-?z)Kk*KZ}oskfFc$i z7#Khhnt~lLu+$074XqKSOe6rx;ckZu=LoK<SsMuOVvulpV>qB-&VyYpwm)6Cl7os0 z^Z+Nfjf+_B5C-J|g+Y1@MM4@!dS-lCMVI~^vqeii85Dtpz`1zI!rgFc?TF(G14urT zf;kdr7aqy@JcpMI0lte80agYNVneU5S>bB(`o}knj>gmF>x}VzjS|z;DDKY)&JNc1 z2;&4E9*Ny#aAdV6J4`*JUV27NiJJd2-GAWCI<s)yLHLjRcS}P?`4JaH!g1pWP|3++ zfQz$FU)X<R02mAmw8O~l#DJ-pG+qpZ4OSTV$^#P#OB8^#Yey0UMg$Q<S%3&Vz#?^? zlT|Dh3?wUz>BUcApvAd@`mlXK_&Aw@gph|xv2sPp9QRN0nS7IbXe^*>m8|)O`cJqW zqsQF(K4gwf@jm1wJ6Kks=+jF#oWr_9)blYtFyQ0@fGzt&0Nh8w+r8@;53KLRJ(n)g z^szghm~kM(UL6zigxv)L%8lTzu;0_a1Kwaohttq9eZZ85g^_UJ=QmbqKo2l>6c{i$ z1w!C0k&y@Y4-AX~3PMVV#lYh;;eg>N+x;7BE-`p)#)9uv!Q=tUcWIw6KwStW&~}7@ z2)P3lOkD>jsO!Q5^;`=+jE2J3SaX2-188^I!wx=d5OJ##pf(t`*UFkZ7;xWamw^ur z$xEp%+%lYo(lKcrRG<{B^)DZ8DFqW3c+}=p`1*CcJ4WYK<UtLs@5jobf_-GRxqy<7 z`!8Cs6r!CdfW?*Hdb-4$`_CA{7v4yN_GjRZKY|mRZkzMP0Q)F*o{hzL4|)L6rKDig z&%pqtD$_9@{dW2IBfWJD33z?|!)ZY4>ShCnU|C_Xr&jF6Cl8D-1NJz=aUR@;EaYGM z4yf>FN>T;DHyCIvz=@c`;HaLjJmC1H^Dp6`xgmzjPWp!A=fv~`f~g533BUk+LSge^ z|A!$2S#{)=5k8IscjOq`8wn?aNMmAUKvp8U$0-;SQZP_42nMVK+EQB}LXklb1sK^& zoreIyKC-_NpHxwCc#ns^4mKc@n%2kAn0ujmkN^fIy}$A*uz@9bFBni3&PpAA$K6Kn zF?ta7&J~~n(toI+7FV0q`q}E9>;wZmDT603zrFoofVb7}OU6}}2b5%^Nb5+;`=3sL z`hh85-u_^B*1cg48bBh@Z-GIyVm<{7P^0iGffh6*fq;iJ@kZw$oHMrnXZi(z!8aIa zEC2(9fB}FchD-X!9nQGcvy5D#N&ppHPGK;WK;>MK5O+4dEAM3h;yBEJ&Sw?k%?s(_ zv&)A2_~6SEXIpccNT5V4czAmPft+AjSTO)9#6V;NL_x#{7?u!|=5w5Y0u1nUtqj|z z{=;eD0VMRek=+FR1uG{U=;m5k$Jgr#>usKpo|jr2vr?Af#wIV|K6~@w3KV{0f&7na zKfP-LI{~?lT!GKhFd2%@e_`e=86W!pjflW6{dIbe#c7Sdi3o6lN34U9o1>$6P72dg zPk%o?y}Z2tA$g?6h5mecerGKgz7_i4ERxae6sgQg>|V?lW>o6i)APs0<&6t9AI6n^ z1B1qb1q1Am6nw(K*P%psv0h&dAO_~Y8Zj+4#dg5J=+D8^tE2{Rrx$xM@cW7uyGLH8 zwj6)2*Ao{ce+gj)13{G@0ZE|q)H41M81N~Iy;OS$3dDkNf~j9&5N}2Hs{t@{CIMlu zD7|1HVDMF}&j~H@QE7>HgCA@y6)5#PKq!7!e?%gx*%FZr+4v(dx*{!9Ky{ZRPy5%` z*LQd|qvohl=z0vK2@E6wDqt4DQb)y!phrgj(EIbxKmXp|ZQeh4e(qbBl6c;~U}9$Q zQG->Z!UM8_amUXEa=T}S6@dZXK6#)K;q!K4ps}EsJi-9qVPatL0I5MR&_M8I8(`FJ zO9df(#))0vi7Z5Ra`EV+GtDdp2C5}O8u52!fTF^;Cq2aFiv<34-3jZ)4lgNJ7(Oyh zo-4$53F47|R)cK>dJo3It-}l$Kmw`!<K4J9-dzXB(3l(RQ^CXBC4|_T(;yI3pJ}_N zd8T#3k^mS007PWS-$x{;Xj7>M5A2^_-{1dSGNt{;89xnYCoGo#O%2kUCI*HNK7>NA z8M%=;Xs7@F^UvwYZ_G+#VKf$$;QC|`Ec8b_;wxDfdh{zXOdUM%aWAj(fCb}k3dIK` z3{6NlP!D{Afe{P7j3gOJVx}87<g7Vk6@pX{ZjU~!L6wCU8)lp#d%yr=kMouh3m^(C z7`rzqpcg<6Nhh+s25>@pnV|(jgPjq9f$_p-A(6gjGR+&r9s|Y%15|IX3i;sZ><cHL z7Lbv=8Za0LDB{84+`SZnC~2nT?#&!^9>~G+9l*f!w1~Z^vcLe-<9&_A_~2~S>XGZ) zXW0Ao^@EIn0iR3_z`l@e9e<GUf`PyQctdn}3O%+N$IiHR9^#BSPkD6v+XpGbGb3H^ z2x%|x5CWsn13cje4uJ=<lTSQ7bw<oD>x2iRf7%xV2}xsXJdy{HD~4JGfK&6Nf}`vp z<2@1rt{i8Q=D(>M$ovZiEEMR}E^)@pET$gcz7Pv|ycf5E(_(!AgIR?^c53AwiJQ0c z2sUu^ATVeK!An8HPC^*(<vU;TDpoEG2oM`q22TBF=zL0lb|R<*hAK$qUw@BH4gK(g z4kaN>H%CBvu!LXl=3gCu2=bV_R4@hxTezb^0?*IyGzR&TtO3*o14LeKxDI%X0Z{Et z<Cf}uzfWRBwg^1p!qxRPabf@bo|O_w81VV`=a&zjvdsVzCP3|<-Y7io_b;gt{nh#f zLwG><|4$46fMNg@N7L)E;LHogPHZ|vf_B%wq4W|v!@z!8C1ASQ51wel_z<JU0Rtm& zq_{L75t4@l+RFd6JCy<cWuKQk4yj%~a5Y~=Apk;V8QOnm_a7L5{IU2*;<W5*<bmTx zM1oZUx3mZV{2JT6QsHN(jX;dE8yeDs(^wzo=LBp$9I!`Xcbt)fi~@b-;fc^PkJ2+V zGf{}ivk(`<<OpX90ICz8Vu6}4()We|<hUWLVPulX8RNl7_K6E12{$KYKngm3z|4{7 z@xEbwnjiZ7!D_d`03>iybAP)91IY`(VUQ3WV2nq5_9b~oBZmi^13Lh)X8uJRu*0vz zuLrS91)+B_!2Ug`CLHk0f?re%$pnJ|?G@6<79QwZ*c#>aml(RnMHNH_C={vc#QNFK zEp5(-`!Keg?*Jiy2g*JG0E<KTRRZou5{QtI1tb<I|KjyVc}oGM{g^T`Z-je|PAlgx z0N^wL;J--<)CT+Z-Mp5TS!{|2JK{vL9KfchV~Rj;J{cmlg0&_z{Xt7#Fx3$<X9P%K zAgiBR;AMr~UyM9gC_a4<8m@029yVK$kZ)rB0ekt0a>)M$14lft#(;Vt(;i1Gm^|=_ z1p2RdIAB17O3@PoSckC$w-4{9R11Rvj!f7H7%a|KclKS?02Z182DO3FVXRHzkfFds z$4?=V;i=XQC=v<=I~u4)UQu?g(b>ZMxH(`jOauuKLJ*SiKSq2DK}3XR0eC%m7LP-v zVez%OL-GK|G!SOM`ZR7n|C$vhK-h%`4E8TLEOi@{fV1|P_9#mEwj}{aSsM!k09G(G zL>49%uqXjfK{Xu1=O<dzj$r$OV_D}2&<$<M`TRy`xTgccYSIqH!WcF_iy}joLH>jR zP$8DurXGkUOuCxfaEA%7Mf3pi=saKkKmuO_!2uHW>%spR)TVE0$_-00Qo~{1G|z2w zlIei~z`$rRG+^*w_8a;|0xhZH;Qt!B@xtTST^QIDihLXc(iD(f2LX^2;3W)TDS-N( zFfcE0+y%-I$EOPbgNE(#XyO87uJw%zkZt;Ist2&I=GNB0Mv;If<X~}v50V$q5|=;N zTC@Gdbf=5aB`Q$GfDBMJ00Yqm69e05Lh|m5xM9WskmPANFNIbN15;<XA!?*-&hW(z zOFCrGKKDUxVeKZS$4Udz2mysX-g`C&6$pc=2S#216k8uS!oZkziaxxwYIG2UpCv(% zfMsJ`eR*jDAU}$n=z-*&eZIVUAaw>U?#bGVgKRNhdX9RWm-yF)gVWkmpeiUT3=LwS zFvt!nf|C`EUdKtSTc|z^fT59pa)K@|KTyO29^gR@Kq~{(`XGT(9OmGT|7_?lFq{G= z=aZU^9t5kkmV+qW$N+E9#mnm-W`yx*W2~vH$}C!Yy5Rwh9tJKFiUD)O9V2auffQ+> zVq{^b3hKgmH@AA>6Lp1|vd9MjN_vXw)fg=D@Qan!zyQ`41I|Vq1;arF!9c6TZmCm= zf#`u4=xUHa`;Myy8~2+Ae%?;kE)T!}BfeukF#uwnGOTr!aKa$9!4O3Q$3TKVu&Bt+ zV*O=DF>utP5+#9x0jMNQxG)7r_;ldJ5R?ayV8h>0{%E}L0NCIlrDGLfa)Gb`em(ph z<0=e-gu(eCe^bIRKXwNpFoX4c3q%~ZN<+3zP-aORGX2aMM+``43kD_(s1YrJfNl|D z!M&=6H$wh)@=gq>5-)Qzy@>XrqoGv=bSC(T+T;jxx*2kV3-C}~r%THr!N3?+^aTU6 zzu@l}0LBdm-?~2sWq@v{Ut`d?Z~{Rnnh@iWxUJzPrde6P7H<fc``$F#3Jg7hWfvH5 zq&%QU#3?2QgbIwosBiLuk^?S}lL7-K{s05#f<+hr1HIm?5PyG7xCa;w`un&%_BB9Y zaRb2!2gOFR09TMODD3F@`}lLW*%1YJ*u9f<vS<Lm*DoItn<!8j02{0^fE$VdbHnj~ z%K`u+qR%h6&zv9tv^W3|1Ny%6vc&*!3MzI^BfZ+;cO(>H0NKFOvABXyxZvnJwzFVj zz_&YSGkSo;zha<WheHqs17C8(1p}(t!R-SBfwZQlDf~k0gmpP##0&ZV(AtNXmj)q3 z8vyCpy5Ziqu*8CihX6nr==<aj^SDUB+0g?W<lbIiKN#6@d4(K<MH#I@(N%88^s)hE zpVa>={KST`(BquLc6fc*AhlUg!KI#v0`ULa`yaZ1E$XNPkpaVfWW0d^13_Ezf{_#q zJs=g|1p|Wz;>8$_t6lR_ei!5IQ4|Y%pojU@xIY*$@nqDN<!EN)F%+LiGeAcMf;RRu z+I(PO4k8-;hARx%ou?qICZy(X5rFTY{!jZH3rr7(DTi?jgFA~()AZGcr3Fql=uAS8 z78Wo}9_T^9P<?2*AhD0_(##H0Kz103cLt9r4BU|ioO@z7B8dPJk=YrPA_)gZb3NL0 z00(EsQb2TI4b4{4i13T=W9Wg9?2tn8MoaVn0R0aD;C~dmiGV9bzyRJibd)zo3|QEV zw@wTYg}>8;0|SKb!QN-+G42MPs`*h2MrAzJ0{iZ0J};iQkjv&%6y!b<Wx_xV1XtmK z3?yrnVCaE`2kf($7?{NYev7iO82FA2j(I?@w-p2Bfpi3TH!$VWskG`gitmU2mk=N} z2sGC^(Nu=rDb?fM#C`U;Ioy^s|K)}k5A3J!fNo`SLrVl<3Az||`~5psM#kIiqNgkP z_fH-K5=4JsKoO?QUsb@XhW?U33PiX+JOBV#*E&naoe}+Eau$+ONF$|yfxbg5_<{j6 z;Vcf62dId0)2yg-{}&9nEERVkIYlPjWV(&Hr0JwGpdr98(SzAmcJBG;e+^872MPeT zizakEqS1f7TQp&6M0|$>52QLoopAEN7YwYu7%R_q?^-cQ+4SNxej^9*-@w2ep`5_B zz^J(mpd$Y+i<x^5xn`-L7Y{2sr3)*!P#^;Y21y^txq^xeGzA6)z*Pq9!3i#0aJ8X7 z7hg_C4@f{3Dg~j1XnxgT&7E+7-t!1sKtkRZz|c|q&OR6*WG4+|dM1r~Wdp$SfJ@J* z2OI<0q#*aavQX<!V)um9h!y|<2Cn9<$gfL5$#inqT|HpSzk?9CNJ4`MIlp>_e4v6Z za{DW3W>Q5lK+pA}2lx(L<WM7W{6GK@Nwa9eL2J@}$zKme4|Ev70R|%}00~e*w@LF8 z6atBM1gJfVfy^V&;uAdOfB#J&pxPh?3XgdGhCwDqgt~lWKvBWg<k1KBxD6h5j36Qq zID{bMNbOgmhI|8WFb<96@finyijQMrNMJOTgR{S>|FjI~mI#8F3`=1B$ER0@^8P-% zrdyD^AzNzw=`7wK@0F5xr3aK@=_yG3!loevMg9XnGqJ$>a8k=l2^Rdw02UTNjuxMG zPY4*Cup)tR<hO5mLP`Gk>Dp^2lnbf{ex8H}o|bXN0|SW#eh2%E<N=F>M-{@t+uwEE zK*eA5z?6cTFA*WCpyYtYLoL+4az0o}I51yO2eO?QC;-@YCqAV_oHgWzgXn|^LdGw} z`V1+F^&MMiAjm*sdk;HKjH(eBaG*GY|F<Gx|MZbqFmgkzzx>;9KnmGNvDAVX5y~t- zhel|6%zbooa%a>7#Xv&#&;wD1k%+2-$IP1u28_jEKq+VxkPnePV!*dFB^-gEG5{Bz z5kZPj7=RP$B5wgX+({5sRbXDg`m0@+EP<f)0nwFl#eCZZ15IrXfgtb>s`E3~KlZN} zkO%6&0|rKR%xB1!-|~26Z&6}FLO=je47g?;;0Xf+LY|p_+l?p{C=`1s_rntRU6+Q@ zj1>cpBqTd%4?;*l7&!Qc!66n0C>3^Km}Me|aYiaQcFVlL`he8{ic73M<jy|TV6p%n zNttT!CB}*(0t118H{^had}sB5t{PvS8Dd;J%21CE54c=y=Y2N{@arN26c1Xq+n88F zsP#W%VBrMtpz6EYL$>xo_&0MyHQ`7NI+jU#AwON!iofH5uv|#5ELWW8=Ns8;qc7VP z3<Lm74g=VLHx82Gp~meMhS5dKAOsvCw{ctt05oANA&3NFFfd>sNY@e>L1D1;8mC|= zA%FoII}{Bp6tl8imI`4sFO9?yuZQX}J>+lOTO6KXV2~%>0e|SzM+agr01)9<0IaqP zVRC1p2cTS2!o-5?sN9BkD+b^J?gp9=Do{@32l8|Bt}wuafk>D#U@-q;_tj20fs>y= z3*P-hHGn=`cz~HZtrjx0H6dnV;7AV)g=4Ub-6es!-zd;+Fu;%ftOr5`2R0A`tT+S= z5QhjDMt?2+3t}KZ8YWISD2<d5S^{FfFqn34i5Nry1FGnn-liaQFo|OhBL?t#Tg{yj zMEsjhWIBwjB<CgS36zfMYuJ%8Ap04s6YWPG7(BetNB{oz=jG)iHF*I5eO3JP<--Gk z!2p0aCwc~UT6h4*)bs(v2o2b%X;eIdcNrOjZFEbZa$o>#S_}-%Um5)q9w-_-svEfi z1K1dmWkg`8Vf6qNDlh;Q*nJ!fh(o@uNzI}O)dr)`5lvV%C=C2*V^m=eev1J!M2#3G zU&H_mAm;V%`^*Gnd7=`2s31R|J5WA}n`3m|qWc#BDHE9#a8R#L;iyAR_*WQY6^rnI zOG%6=26i1jCJJOIQ6d5*0!hF!vgHCAE)O}-okVBc?d?NW6WuW!h~7X<|HLeS$CtBn zdiRh_@z(KGhr|UE0kii<p0r-gubZ&|^Bt(b@q{CGPYkrXE%yybH{H|dIZe|C08xfB z?sHHLU|jfw3RDEeqP!P>=aC$yiYUXO35f;G4T}M*j%y4o>yS(g=>8SGV>`r;Kl6J% zFsK_d@r&AGM@gU&0n^u5V9yXR?e0yR|7!GDU%R`1SAS1p=n;2P9t;=)2@A!x4j?HT zKm~LaWkdl{Ks|uD2Oh!<{+l)kAtMH<5)c~Fqx48nV1x#BU`p{M0szt=I03*8ze1M} zl}#ip%(gNp7zhJ9u6SxZ%6;Ru=r!J-@J6LzX}{Lbw%NhT;sXPb2c-og1>K0^&GZu_ z<l}gP#&vn1x#3p~@crfaB`>hY&}O!~M7Qol6Jq`3hH_T{Kkv!G?gs$OU)LYY&qNb) zJ{By6*6!j&$FXru{w)UBveaskkgabN4~2m{B#g#_nx4*rDgmq?CBU#@dy@e`{$(oh z5f~;UL;}g96VRd?JJ5)^8!qYQpzkY9e;#w&#S_yrZb5(dpsyAQb1N|TQH=!)4_GH0 zJb=BjRF@(-))xT90OpIE3xfk2m>>*b<oGzJ)?c>2FZc+;!G`U?0Mqu*x6KQjVB+wh zRlng%6WZ5oM^$sf#sYr$5QGrIXhym+UeUg|z<pE!Fu;zo!6bpeyC6>>;P<AJ;+_=% zkOwSw?XrOx15gYU6}`RKceKC*i*pV~1}&%qjRJ0cF6{vTDH1xcygN~Y4jaJ4?i&a& zw~`>Lz;z>;@_!>j2pnVzZ@`064?|?XKz#(PiF|2);<=D87Pvyo0Rv49w3@9Z#(%Bt z*kb)r@TqRhnF$J0KrU8Zb_@g~aDa_QknDJUuZFo#=|Q;Mv2f_=%{#eaFks4%+;GpT z@~gan+~hosPQ${Wm4U!u0RTInF|gbatv~Jl1p^U;T0e~d#5#3O8oGOif@GBx3cA&` zn;q2L(teN-oP4%^XaN#f0s;OWDj+vR@MClx-<J8{W8WNMfFV@i3G8q(03Z|Oz2s}O z8d|4b#jO0y@xxbCU}y_19O;3C>}mRx<}hM{c#WQ|rld84h`+DwyBK}h>D!Be!+x${ zcTxb5lef-uynf`7(>zzA7--t~83Wd-5(|XE(s4X7Fzg;4knwB__2pL&(|eb~05V&6 zAc8PFfFKOfu>}So->C;ozvX$*ErwYB<xH*L7P~t@s14umtAqxbAqrub-g)Kb0xS;3 z46;N4rx_Ll!k`$y?s+O%4E@B!-_ky>Mkkm%V153@{r~-mBi!(bHGO{0_?de5AiBO< zcuZC_G#q0frqTBY!>i(I@tSF|Y#G2%Ua=P+H^i4cR@+=*0BK-A<`+f2ceXAKdUgN8 zV-p#QoElLQ!*6*YeaD{}U~&K9`@mpeU<kq~;SSM%a()P(dldkzw*vzPJ_3P*Va^e9 z&J`k?yJR^L!QgXmT||0?2W5b!4<r%-AcSgwGC%@>NWjpC{j41~2q72{4?6o25gbCC zkpmP1Us)>#@=qPxh!(jH1wACG8K$2ADDMrB#QlXqyd!$am>A?Q7?|!KW{ACl3Je#! zuSj4TG}inE0}E`v?r^DM0KpFlP#L}p2|Vrx29&0Y9$3eMZ!jS3>+&o9pBUiB@{;(+ z(+2?R_-k_?_SHPqgwa3Ry+M$BTNo5A^aOzckbp;H?nwxA6dL#2AOT*b-piKbHrzi) zYI-aV33R16_KEKk0}=vMKej9o7cdY4SVoDW0Y9qbpD*L@>em*l?jN=M>IDGoa5okV z5ELQ?iUC-Cc&HJf2KvkcqmI-xFo9#`^?8>__?8fQ!DX8(`-xzHD8Qq8A%VNckL}Y( zcp&Ksxe4mj`oKyL7z+{wW>y$0A7h|wQ0ve5$eo$@2c<V|S`E6|4h#qYHSnq>>Tv`l zh=+_Z?kWWK3lKF}i;M-S=nRUvYxja-NI@4d4kTC#%tG-404V<phShUOTMz6@DFwLh zQ|bdR01xXE^!s!AHIyz>#u&ni_K5_d-e^ZUArXO_L-Wi=KrB-03xL{a<-d~<)P5`L zv)_NeO9w<nZ{3%zu^<cp28aU4003~m|G0lr6QUB6qEaK87~oQ^6N-V9hEf>B_ho>k zWjJX5mFpsqB!Pto;v-^UO1>{4ASMnf)B}G1AVD@*b^?#S3MA}Lab+_!zjKa=1q`O8 zuLnaL6kNeo5~vc0<706rkdg^vXd08mZ7deYs!(}4Z6RSHsDlhyM)GC{^OHWuppmQ- z$^9*C!vnk&n;yuGe*=Rf42*i$AW7aba>L00i}qW)dCmQ4%LyK_xRe6XK+yu8&lso% z$lCA5S*76qW{dUz007pH-F%0ER;!8uN&!`ajv!iOKt_QsNbq;fM0iR;U@$ln`yOFn zxP0zv?pw29jINcjdjYJi2Q4%xX#I9-pYKj>z6u*)cQ6nb7zH$ap4`V4yJKQ@$^ZoS zVxVgWUEQD(x0ZrU`fz-;A7CJ+@Y5RlDM)H-n@p8&D2$_6^yQP!0N~Yufl$X16jnU2 z=mCDI1}d4$1L+HxE+0c%MxI7@f2I%FKZ3y;1Ksydu40XS>i~~uOmE&o0%Cx5q_@Gq z09AUi1wdi}HyOVsL0d9{6$Z=&1|bv}Q3ySf2-x3Fc_;T|;sKMz<qz9=S65LW#^u|J zhs1*QPEEfY8UF@0M2g4;$iXN8DtL}OeR*+tqkx=m2v7;c==2&78NjQs2j4%Xe$ZRT z59hmYNc!~6SO1EQwjKoYfJ89(!zT=8*)Sj(v0xhRkj_tws|FQ>MZzc~YV<I6t4YDY z0+Oi;tnnry;8uXDA%M$LOXnq4k7uz^)ZhjZkO%(UMH7xIA8SH>^@0ImFnItZaIZA? zffj~J?D0sTH3n+&PlP#Ou)1|$VDJ?K{JJ9K%hqp;vC{Q`A<}=8qOqmIjeWrpgb;!| zLmV;~kGIgp!*6LI8&ZGT^wU>5Kz9XzVSV1R95j6V2L=*T{2@v478o4#K&(IV!3_1E zP8tjZ20em|U%fO4q!^f&6$9)S6&I|<y8B@IKQn(>6NcrX?!mxgG~q<oK@ZGz$x<H} zT}5__F8~k&Us~Bf8T`Lupl;<&{uTz)_3D7r7JtD&Pj>8+I)QC28%XHUizj9WV2kY- zJ^Q3Em~Zu#75UUseRZ`xm>auKz#I;Gq||rJ0~G^-$B`z~Uif=5!J2+$+3D;Cf<tR8 zkQ3H0(CZI5Li5UATwo9d9^NYjO9Ds&@No0+f+pnRe)J?9yOuhJq|Y&N_|Tz`V3NSG zG8~-X!F4R?tr$1N+jS5Ly?e*^aN2t1<~8WJ|0@hkyB|PO46Kh&RA`;WQY*+|DcfS) ze3r6g`OxKR%Q;_n))(Z1=4a)Xe!)P>-JwKvk)&N4h56g3<92QCZ})Rf`uf)x2#^XV zFFRXR$9bcGxxl+paQ{IRxZZxyoqE6kSIhXuH3mZXqo1hc9}FZ5_?`!v4i6sqgn{0o z)s3p}VESd}7zW2i=l*}S&T?d0N1JNdvxm0D${I8lpF5v{vBJst8lE{Jv3j*{9AD;p z4E%)$#6V>v7>FPY28P}B#I%Fmld|>Sc>REfjIH(CJXquis;USHfgU1h0YS?$)Rzy5 z0{f2#a{(|w6mW?!x_<t@7#QimR{+Sa(Fx6hCEhtyAW}It`iresjz3KqEBqY;%V{xF z&C!cfIuKOdvV)B{xyh#Xiti&H`chsUV2BWvrF+e<AF+Ja@lHQteEPU-F(B{N9kS)l zG%4U4&U&x;-88)bm~4EodmPhq=1X&D!2mmxIvNXdK{bF~klR!HhF-6!3PuAYAN+$F zq)Y@(Sl<r}cun7R)Mw<+q$gC8Pl<qS^guB{JZ(xCad<2Y#6SVC+?I&sshWD*dx!ZH zZrXCUk9Gh+F|a~{CoKQY6LJyq#9?U8nTA%MYxnulYrE%jmv7hroiAgS8c<2s6A!CA zrLV5G6GHP-{KRU)zhZ!oO9^NJz$noS6C7+ByVvNYh!swbFc2fsJ3PSvDjL(t4v>P| zK?3SPQ$m!$2X!HyGmeSHKwvXIsNrC0LQYu545YtUPfs<V3Gc9e4-QmV9i5CfZp#q{ zhS3`kL$-$_LSnXQVvSzAueZx-K}FpBAP8~uB=tNr4I|dj1zT+Gdvh?MA&fCTG=NzE zFu)+j`W?PU!Wsj;PEqHtUh@DFlv^}Dx)_N6P7^1-bN{E~v$Gf_CLZ=J4075520atI zvm=Dk)z}<?g23$#)2Arp)_f3V_{9KYtDraG0p7UqKt2c>kq2%ifukYib`OQ~BMH{o zL9l@!v_ECZ3v#RD6zdx`_7``{ogbdK9F&=l@A(l49PAQ=2oKtD+qIJ(K&9yyThIM| z%KV^lf))=F{FI!TtzZ~O!d>HFEuJ$yGQy3HFg0PMU`vHz$WYc)0wLi~=Kk*AgVBBU zsl2_$M%g2#WU8q!00WeT$p>k5f9u0fe{Og0zpoy6BqBYbm~6y?Wef=gA^?yvB&JRW z3@l}V8TS`SV3jzbA^jsA0@psHV!jv{caOU?@8`kX%e~D@^UP`79*igI?_b+^dto3F zmNu-mI<k6cfo07%hi!23{E~;A<=}YfKQS<(&*Xu~fDl3k5;)J!UUGdl@i*HM?(5E< zwpw5BPU}7}=zEKnF!_ui%@8dTf`psxI|<<Jbbn>Q?)~C+|1$-#VBii6j4>n`UY^ei z3_kNfF#wwl421t18kVhGC*zG+z)g^HNeNpJ9=Ei&acuRtZ`<13-m%&KhJi099AEY; z48Hx`*n0Wsxx=N7zvuDQ5^m<ljnKmnpBShtOd!DNCIGDYFLs=Rx)0%C4TBm*6Cc39 sdsnb&G#`=0m-xaY1?d}-1i%0SfDk|+xZ1q@I=}ltsV6h|Fcuj2A2>c|lK=n! literal 0 HcmV?d00001 diff --git a/reactos/apps/tests/alphablend/lenaalpha.bmp b/reactos/apps/tests/alphablend/lenaalpha.bmp new file mode 100644 index 0000000000000000000000000000000000000000..71982ce8b062acb7bb115e84d4490815f4a8936b GIT binary patch literal 89322 zcmeI*3*2^XS`P59BuUzcls3vl*%Xmd*=BDVLI~MpQ+5fVq7<?zAxVQGB%4NIlu?l| zNQj{^i6~K1l9Vx0e)+%mG56touC?y_x!>*gz3+Elzu))F^WOJb*Sgkq9M^Fk=ee%+ z%)3AD>)z+pp1RZC$$xL_zZdxLGyL~zPrb39Pd)WnzJKxSK6Uu-@WJ)Rbq208aGinc z3|wd6*){{OcCYQ(Hc?N^{TA?7zuCUS-L#vhzIyw7VrJ<HyO9D^;EMKZ+-%?RvUc;N z*Jy9;zgK+1X7aJSod6MB3RB@L+OK)DeW%;n&BI@_{j}#^E0@kN9=q9ltOvY>KIjCj zB3P(j>t_4Tx3!yxzgGKc&$&=88a`af@MsuS=riqG+yhn-EYz=kvwfG_+RejXyZyB1 zTqu;-<-=7O9xNpay|o7Y1^S75z$$`;`gKP8u9vlO#_P17_M8ia66M1}hO06>5E>Ny zF8r$f0)5a4Sb?ulzwWWU-d=nCW83@k^^T{$ZhK4Txlk^O52wh`FmaWId*H)FzY9Ow z3w?7wmpnu!?g1{C9ua>1HyG`^-PXpjZ_pmnVLA^b%7>C6d@#a>iFyXIaAm@UOjyvL z3qQ-vJe%__`M^=!16e>U)Ngof-~Ddd@uW9wKj}7?K#7G96^E$|$j}%;7OqS<PlNO5 z2l}9I0T%kM_u?MxiuU(7v^N^<d*0T@v2T>q+gm!vit?fQP;o$pDg)j|7OqS<kG^ja zpq6i0``d+Y0h;+P`K(ju1SzNm#6tbXhxR5n+xOaQHxGG}oY;QSt^RW%SInjHVTuDX zVCf<Yr<ic-%sd+onCOe12tYp@^yk8#f^XW*f0z8keIg#5-}KntY_Glfo4@(q$8UB# z=}pr~=uuWoK1^{yh8ZS826vGFQ6?-t;n@K6?mceB{|x$B_<=s?Ta1A|>l8X*nxF?+ z5NmI7Y~TB`c0Bwoa(cQ7D@qAh%%$-m;;<+~$WU3>Wx})BB+TW1e(g{6P4a}kOCBx( z2v|W4h(Y@;kL|6F?fcx;jt9Qg@zl3WSNbd^$_K=o;xNgO7;#rj*j+47<cGTiXxxwG zYtXOkFX(60!(zcbzy-&k{hUL4>tp-Ax3%MeZ=Dm<NjgmDD6#MX2}1_Tu*kw0Cd|-K zL3kn&pEtFOe)9c<e#*IvzKJ!x75qXU(FO{1z*NwKW6=J7hxRtd_O`dR<AHCJ6VpjL z#EMeF6+?#b0TqpEAp_nfKrBp1?yxlpPdpR01eoY&`EQl~4Ehs#=zyu92gjiO{SWO2 z9NG`OtmWXGm`>6mR+JLq1LBnoBE^MF*qVe?5_rWYm<A=lHu_KTpUS_WAI-PucA<w( zafe+I|3QcLcE|SiH`@<BwwoWn{qgX(%jt+yR-nY>1LB<`!x>GOCSmIppGX?a+`r~O z;=e5ay1uFW3;NW!t3J@fWx+ilLN*}(kVAWi(SGP&8{fY}PRZ%|Nrx!0<wL}wWLRWj zGNF#Kp<xQbEGShFW+Z(~fA8{d?mzXv(Z9<->0aahL_gua=v$119xl)UQ<gK}AQ(Uc z^$$C=cRaQqe!3kGdB>cR)6<nc^_)w%R{4N_5eH$SOfcHGg#?H)A&#*op@J|S!jlvi z76P>L<9>ISf5qR7@mFRq%3t(N@?7{6`UQ6g22E(c)1kfdvHghK+VQ}5&WU<RSNcSW zg%2e|nGjiMfG88<7|}bqL+s*K5NZ?!&8mT!d>ln!5@4(UG5@>EKc2sFKgwV9qxnHU zQlBLco!~w}58ChYF7NWL$M$Z=_9OS&@ymBR9{#S*O(%#kDN#OD9HuPLsL6yzhd9P$ zk-LImX+#hj7am_4oFTxX|H=9-jpX|g|G2(W=tuJ{d`ohH9#SAH=r9e`KkCqa^r8Kj z+gc9GDLGv~VMQnrK13f%hJ*=Yi($akT_()X;I88kR6Z?-B`!SHG$;X@0<``U0w}7x z<=8*VA<=&>f8w9GALY;5Z^ZAyC(&8;6Z+r|!6N=+5ADYt+PfdykKb#@FW)@}=R}k# zD^MbQ*peY(!q{RUjaDjACd4PyBrJk3;{t^=OSK2BBRxjR!YKkw1CWA$?O&sRm%kY! z{&9U~(#p!(5Bk;o1^VEgRSrHl!Zc9-ghTs@hxU_hYdI{Z<aGV$O`qu;C0uJELuG+F zl?l;==@^MyLIXjlLzr<PPo2=fj3sS+yl8MC0k-;I@7LuY&%cYlxE%E9b5=c2pfhoY zU=jbxhxStr?WZ2vPdnXmKn~7{C{tFT#N>nPRvE;g#0ctyr3(`Xf;%E>TR}+5Fyq4G zOM?=Cjfn|N2&e+Y0U`j}#{g9SEsaKh%fI3u*JnPn_Je-Hy~)qQ-$D;H@WBzFLHoJS zeeQc4+w+d?r{8SHkDqru@I9QB)Age_eTEMRHpviKFdm#VwuK4t2{Sa1xMU6P8u=R+ z%!!#XKeY#2HF$<w#1?{XB|r@TJ)HV)nat&%bWfa3+&8xq{Ve>beOCR%y`V!D)Ia0U z-t*Xg=IM4k<UMnWbM+8bgc9WgaVQxQCU9~xA<@D3g$DN$yEp}5i3`maE~LRTEnB=R z0!#xC`<K)Y0YraG#`16IH<Qq(v{qTx{zM-TS@l`+fxfr{6xu)Q(0=xzz1Ok*oV|AZ z^1X6!PSk^bP@;S&8LAACg@p-;4#q!2Lj)mlA%YO2xY&cojs~It*Gi@&0x1MBGrJ*x z0w6#Wz!D((pXfiAKk*Ox;=WZ@^p}NS=pj|y;TTMz{c{iP=N;O6AKTBr*^VE-cMi)b z&P^wJLy7Vs;^4ZAEYPJgA*Rvz-32Mz3WB>{Xkcc{k6Ahu6p}Eud}QXI32G1<un<6M zBbG^crw1qj1VN$j6af<bv;2vF&=+&ftr?!^3)WD`s$ZZF?$CrRsDHts{lY_gpV5BN zv5n8(Cx_(}=juT}C=otPGDI073o#4{5Me@mg7L>BR1judm^7$8I7Ne5J_-%U@6%3$ z5P%365*vV}c@h)?@VD$uOyEKQp^!t40hs!q=-=f}{LQ50FEyjLW;j6~`eHQnv+%9Z zta?aI+@T5F;QWgZ?Ux+dFFoCIKn~7{de9F_Og<2YkRf3rvS3tYg3%hYksE(Z!XgOb z-HZ!nBlaLJaiKvoh0?%moAYNv(I7UU1ds?s0Tep!lK|W0FYcS+iGE@|II`-y<Us~L zI2Q5uec$)}Wrz055A9c+ZaE+aI}2IL3Vlv8R2dQ@uyHcMXi3&02=_^YmXFM{<u+;X zbVURr5F5}$00G#5dmzBB{x8d4<c;!o?FaoVeCu>V54+$FQ-J@<LwmpXd%yQTwqLc^ zj$gjNBXf##^?(xP18S8F2@{DCm{3hHPNOARgsXzU&urtu-Kv4PHN)l^4N^Nwwg`(y zPXiYv0*eg@0b&D`f>i=r2jF|fyKM*%947%{{^@6<|6Km!uX#4x(2wjV)<^Iy*g#+0 z13I*S^`ZTmL;JOd_UraqzRF=a#kq(PN`wz3117j`VnhssQH2S{DO4piEP{}@Ak&%l zU^gfvQ;;yGd}KcROu;;hxzis$dSeg*oU#FV7O)UN9e@d(9zeca0xSk#M*q3|iN7dp z-I;UfTli3j=4aJs$p?BMLKCb(`vX4U1AhIXec-YEhMVp9@dxHG$LB;n=tpmp3{eKG zbM+Vo<1s2@GeYA`XxIwEVh@rw#wGGa$r;VkOc=K`V7Ev?XfPwfqf`UeY81dmx@1V( zM8M!x0#gV|7BEfVmH^5ALVz>Np8{KbL4Pj%E%d=1xX}KMhxVHe?Sqc(Hy_*agAd99 zIoMgwMTziXA;Xk~Fu|ydjX<3egc%noUhF|>Fx5aIaiPIBTTDcVF?hrgVTl3=fRKp- zyFM@q;HKoltpc4QK(fCOz#@wC&+<376MbvY+9&%0H}oU;S@lpW?l6TfsDI0${nkVK z;L$$hLq25u>w|MZ4tADv^?(xP195N_vfzq|5yoI7)r2x(5d?;|ae>uA_%k$^b%Slu zz&ytonE4n3wj2!}SwwK5B?=%wMIbg{$pk|Hxp33Kcz}d}qyVNR1Yo72|1<hm{6*m{ z`m`D}R%@Xz?l1*0ptTSE&=37>hxXe~w;bTeoZ?(PphWmkGDI0%cguu0#)O6`2#pKL z7eWK~KGmQWv2}x`XduGY7?|@KgBcMXwmF<pfG=I5KnPGDm|74Yh}CXNshr%o%}D@j zAt7KAfT0Qj8vUpEi^X&}Yk#5-AZs>DKF|mB0RCYg_F*6X;UE4x4(%gOw;bR|$LB<> z(9a}8lmXusCK#2m2~Q0TbqK6%j3Rm?`J}<32BCqu3JqE`5LHhZgGd1yJc5XDVHB7) zpoxH+QVMp19t4PhTrvKiA;6;l%kpQ>s4-2>+AsPG^u-<KANi3V`8yBocOBaA-fQ_P zhdJI^C{aF4GGN+dLZX9F2}}(Q#=OLZ^E61Nki7@y%8ap3{GmA%Pn#yx7(6WzVTu4N zA{b38NCXV8QJ^*;KG01`1l*uXpqrH(ogx57jQ~_M1|V6##nt713jL_P#S41a6?e!2 z{G&eVqkhk!{oX_SeS0lm<uJ!P%eg2~K13W6De!HV2?VNwfCk22qv*ce9hKWvgCvZ3 ztYEIpSkeTMH2!cJgBcNKj_^>WU@HO(0h$aNYN9}FKzyK^;sa9(4gqA!iw7_{lK?`h z38bqC5bu}eFZ6SLOj?v57DYd5pCw=1Aq()|e`p{5(I5RW$My$qw&TYi<Cq-mEa##` z_z*Hg88B^Og7FxYv7u-MA#uT7xR>M$r)bc+L7py|D>IgCG5)Z|;Cw`QsOB&t;1c3a zL|``;Xfl{6P#fT;*Z?=k2YQC$mSxJ)K#?&fa7%z>e=+}!{uO_&k5v<<VF3~7XW?hn z11``9^q~E*AN#R?@X-Fyq5a{TEg$9pN9Gj7&_l@(Wr!@eVwhkIMq)fdQcOa<V&X#V z!5JEuhtv(sjQKH3=E{t*Pca5dL?E`i5g~aZjF@(KJy>&ii3luFz_3Mu#RfDH2m$2F z(j~%(0AgiBfaxj$=qdtK|L5}GqHn==)q@X?!5zK;|G1C)xIc1eAAf9r^w^Fce0&aY zq~o2165)g1h(pNWDwwt~p`pPD5j76M$c-P3w=}3XFaxO@n3I_%Y>mMZ5tbYw<pM_i zAxXilBCzBFOBARL-~*EhDg}oCvSvxstpuq4clmQ@iTkjCNYS@!3w?11F|<G76F%XO z9oi?3_Wb8RfBfqcbATfq?<|xEA4-PGLYW{s7>V&z5N2FBPXqU!x`Ej+CwZn|mRP15 zgKb1;j*zV;(;Pk|DY#VxY6VjgJQW2NALw~X2_SWn28x)A0!#xyX%QgNzv3@O(`U+W zg$8|KS-)BGKn(6shV>smv_ElZe{!$os~i??poAVuhA0D$g$b_f>c$`pB{Xm*MwqxT z?ZH+J+;0-b(7<fSj#D(?md(}qh|q`2i#dEqC8G;PU|PZE0!;>YZGfjLDuE>c{~QxY zJWW~&Ajl#B6K;B=|CU~t{}%nMdhiwc0RBmz^huxm$)EhE4((6xwS46mN9GiKC>f#* z*tIZW3PK!0;zH~}U1DkA9+N4A24=uKq-d}h14(ovLUV-096kamxCaqPMTmkm7ocp3 z0zzJ+Kx}|Sz_T`wS{4Gt1DL=PAoef%-{mhxi_}7P)_&2?s)u87hxw;`%BTF9L;JIb z_UCT4e3%0q>3EbVA3_GanoMxr_=E~V;sT-?Ez(XJ%%Bh&xNG;`Y%#{b{L~mEA~Z*6 z)hOkHM<xXk0a@p%bRbS3BEYn80@Dg67dR6I;se#wlv8BWNdtEY5CcGU5g^gO;xFzC z+|Yp$^hrAOv*d$2d;$KcpZckP{?I<{*#5$?9Y6TA9N<XDI}0WB5Hjdf&-xD&T+wxf zo`eQo)Tj~{Y7e$FkSVywl#krCGKd*qht5X?a;jXAs*xEs&$4fGo;>lC6g;R}L7xun zR))7uV2S`8Ye|q5OfHaQa7KYs1Q1UX0<5VLAoef%KbL>dw_1aKR(+udF|_~Uq5Y*p z`^$SRU*#~zJF8@fGT@c|s|jQ$p}|Pv5E2&<b)iAM0eUYqI293+Banhbgp>>JRthAE z5WJrxv4Nl>AOZ2js?P^ci9nwVFg6u|-6&8W=t+=DpjxY^FcPa%1c?2M{&)F{`xAYO z7y4QCfgZRp|MXA)^cTF~1%KtxK4Y)tE5|s}@y@~rJrD=IMHaBDOmJP|6G2E^Ku#k> z)Lk05FL&o2-KqPP|E6fL8xitgvF4Bzq+CE|&r1P}y0w55+~>o@Q*N-kL{bxII<OUi zTEUbAXD*N^u-E`TP=Q5$Exk$>Ahudlrqsli02CMjEJLO};xFz~Y^ycsXW<9>;12W8 z{LIh%tB3a24(+esZ22$;IMVSb;oOj+vY`J&2UkpJNaB#VfSd~rj6az|>IUx4Jud$6 zR76loOV#LBDQK;r&y*ijl88cxq~@>$g6<a1<DpiD&o}`hu#EylU~2;|ApiwNfarh4 z-|`p4tyy?MKdZjbgBa#7eBlfK#-V-Iv3>SufA;a$&&pShairt%A!LX$=rfw&Dy~&Q zh(kzRK+aofpx(7a1oN<s2xe?61=AHIK}fBjWkVbJJX7A*i|#EPoOgqHI>4H8CTwbJ z0!atr1a?J0NpR)@^srID<RlUBAVBq1t}WH#v||FTFVkz1OMvMAvi!UDp%27B4_rWl z`)?lFi(d4izqQwVo&!P*XO#?kt0u%JR1o425OSeGETZwd3-{uV+?O;b+2V`{#Bk;a z$|fxroRWf8kIg?61Z9X=o7;NP{W!x0f<*)p2;v6wbO0emD1kr@i>M;kk`8P|fcnJ> zDx$U;u-JeL3DD&)cGGQ0W$i;ht3J>N_s{v9&-vWX{oKzxw!eLB#}7Www~j%O@WHv5 zpdY<e6I{i$2u=h62``~Rvqe_Noz93r43i@$mCSO%DJd||X4{;b`8-q36NFRsqI-UP zup0<Yxk0p?kB8JbQxibr=>#eQ(+cv*Nd{*WkO-)}DFi9RNxQgirYj!6ilYEA03m>d z83KslkecWhdME?@?;P6afBxtH-M!}X9N<XDmkbLNTqQJc-O|8#j4EnioXHf7-1yyv zdvQn87&Id6n!`m3T0LGKB%MkUA4oXZW(0joh-_qM>juw=fMU2hSn|OZ1X>boE<h&} z1r{H;C4hBj^&tSe4v0j5&=7y>ZRJ8O=x5bKHn@Mm7kt6rJG8%lX#e2Y^3Qzb7z7C) zFhLKIg)l+?uHst!hU+FS7|EgrrNK-S+*cz)bA&umG8>Ts^HV7>Z|9{z2%hz#IK$m= za1YtR3<MmeTx0GSY#><NpyUNnD*~wrD1$d0s1wL@fmVc)3$z+Aqku}FB8)Pi6f9Z5 zmH^Rz&=75LUrdKu(FbUt2Q<uI{Nfk?!$bQ=H(NgRtz#UC4<Q5olnHv)zpJ=b9Kx0c zETVB5tuY(9@lRvWh(Pq*b<JV&#JYl6GTN36XOdWFxD5x%5QXx4dzy?kg2<_iU?~eE z5bU}^G)Cq;AVzQTZgBz;fm*>l5oi>cK2RoZdP@Kz90dpgqW=K0{AoDUU>EcYJ<R{{ zp?%>Oe&IjaYd+5bjw~4_6ZEYA(7+WZ4H^`T&^V2jcWs)`h>%pV<}l@gNWtO?)Y4l$ zKI05`!@)K?xZ7gUnLxmKHY1p2f!#nb3xkNQBHBj-NeAKtrU)b#Xf<F)0R<WPxcZFr ze3t;xf6HGqr{u5;`W84$gZmeK(HH&GL;Gik_Ro(k|IAm8K@i6~%ej#Sz3EfW`bPuT zicwr>U~EQcoJK26*hYlp2&o}YDTpg*f{^O*e2_FBCZ=>8XE?*b`Rw4X!a)LooTBBy zn1NFnLCON#Ku|ZB$3sLw7TlUZ(g6!$R|M!M5oi>s50sTl%6M`nP(%hn6aXmE{}6zZ zNA`<8d;tyfFaF{${uhV#FK@Pd=v&7)((z?NG(n%Gfon|~7)de(V>80~!$t)6;*Met zw^ERjQ63_+R=_`-w<d`#9SgN}hN&6uW(P~L=x#H_X$F?v;~q~i11${^qEmrDeItQj zaf2xgrY6vIAWmS4Kyrap1C}Vj2Q~|c2Pgre{~>@SOxWQV^aDNEU-FWd{HsIz*Ed@} z^sQs?!SQ8+ej*5Z7GGQ?Mlm#qMNFn(Z1smTA`moplp69P1xXN6J<jvQlnuAeaJOb? z{u2&nvB+xO4F{0DuvoNf24+?`OGB*>FJ*xSf@~Ct8%#===Yz;EM`n+c4ooL7MS!A4 z1ZEU4;mHDG0*NzFN&w3?%b%*lG3W<+uz$&ye922+`qF>1*L?0<$KZqG%LM%-H0XKK zpx&S~U{S=WM1-b_F^8w5ptXWLPn=H>;tbVSv#($Y2MpMJgw$eDA0sXq;$2w+9M}c| z99XhK5+oQcrJ-&W*bM};F2oI{FsP6&J~GTn2P~Fd5oi=(#rZ&W0BKrGU_5{o3ZM`m z%b%*l(Yl6dp?}%SUiPJ5`lbJNuld}!*by=~E1IC6ga*_q4eAYy!AOk9sEkdVN<>)9 zVWl9I!z2jqy=BAc3{yHj6%Lf(7E6$DkR1i*GsH`DfL!cy;6gJn>%++iW?7(tpl&eF z2W8Ev38W}gClC>c6-+fi#hwVn2B-r_)_C=LfGq(mXX`o(KhS^Kmwnm4JG6g)v*knI zVuvHc1m{K&wls)0aCKualB5a7W`v0dF^8!dRSJ?IcnX$UfgorGnj{L5+i;NVz?y1y zaL<+ivX_Jd#}JLF1FZ~PXa@4~2s4m}L^C5GblX6X=Yz^<c{HG?BBxeolUvmZL<E`) zT6Cg7Y=ATn9Pt3wX%(Q$ADUJ-WZ?_;FaPo{{||@uA8)pN=v&8x3DE=s5<!?WU^rdT zbzQywuu@>0TPbiy?#tbI{NYYpHWUiC;UI;AnH{uPWR)$C5zkwK`5YOtmvi9O%7F6J zVhHCmf|!AnhEgAHMvw;tyMaJTXqgBEc{apUPbXk;Sz^rvEWO$Qi5pPZHc^{s18Wk% zqMqnO{wu!XE57n8zw$rbY(DY1Z;_!)h#)L9aFtj@*Ns0kl1hOQMhd1Ya4)G9xI6dg zP6fU*;UL)o6J_>NH{M!;?kWifAi@&NokjO-3-8ttE|r1q8%%kySz$^;gsvGu%K|eH z)D6n41p--iibBZ;;{;|dU>ULj>Hwku_s+Z_01prYKmja&B5!F!w$OjoSAErgKD7UG zZ270p@gih!ytACE2mOQwde*<IxRxuruB%TeFt+ImQb2C4K&o43IKx2;1<eln2x(e^ z77Xpo*;;~dAkPr*(-y`IOdaUPp;;Z8hH$A22wQ^Jt{G@)C>eoJsA47~AdG5*M3Pjd zE+i17GA!3lQD|`jiwGnN$O6D5f`hCCu&A^4;R|K3fAv>?_17HR%U}NT<F8-ibKiyu z(FEsC8pIp8iiqQi#AjCu;tG-=7=NnA?kEqE5)RyN!hsp+lSDSj8Zk?Z)65X3C0L#x zwNg}DxKxVnVJ|^AuvCX;QZSzvFV&$M!dV$;d2pJ6mWG&tB_r4dg1A97fu;j>0ug~m z0coHpz{nv083$hoU}<OV2YtAI?bm+o*WGMB2_GCo798&^<OvND6!ffrR}pa%5f&+E zf?%|DhDj1<IFS1^J1_&;RA5fz%gqpL37Bd%7Hi6^UT6#NCpBOgb~&&l1<Ru%fvKBD zwuZ2kfovI)0WD^rr6GZGW&|@3#0{n<Ao3<15R2mkrU-}vvH*529sr0TfCX;72mSwg zXkY*JU;p2Z&F}fJOo$+a262h{)U*Cc%~lGUAf#3xY{ePQa4@rjSOWJhFJ3al77Vk` zkf~15c-IzovoRfjixoN_9&M|I@I7w}cR9dXlmq80gxx;Mz(@+1nXMrd^1=Z@P-eso zm<Pd8R>%x+&VnX0Ff#(8Is-v!0-|uz0dd)qv@k8t83pPAqW=hxwIAre;Tyi;zu#;= z!3f`y2S++SG!PWx4QdQrrBdMPO%PHtnn|LO%V=6Ca9{4uJ-So(>#p6q888oKL$$=r zm>;&;dRc5?Dn;F0c57;&m;*J~sq@d&;1UijiJ>0CfhLB`C%#>t6yz}hlfw|YJNKwW z%n%BK;ebrJW}sOiGmwoU%m7g(t^9WCLJ0(F0tp0L5un>dfQEyQ2O#W|073s7zwsOY z$Ia#wr10&efphhsAHC^Q&s!--I53_hi3taJf?(vvpT`I8D3+iZqPyN!3Bmz$WyV@5 zx-d0>OHu>%e0c40;MVkz4mgG(tRL7G2V7+)hRfzLk2cuXGf4s4!w`l8HH57UFobfb znH4evc|ybtBqLY?LDPXc0Sh)FkSHL&3jtO)a6ugOzv-L4>6^d#oB!vr`Q0Z-;oH){ zS<a0ym{Jf|&;+5*FyTPqBH01n8oBW+7EMdw9%BnzC5SCFCuSzLFdSeDt)OjcFgKi= ze-+~;J)9hXV08epmvdm*L+Ft)UNM|vK{&9j5=&T;7^X_h%1R8oXMoXNl7c=aNOdSB z;%Nw#2L;n`KzN;IAWsK~Fe%1?83^J8Vg)VX*Z|r-2@v#O@rqacuVeE&I{19jpb<eo zF^8l;|B{Y|gCvPYl0rdhhP4FYfV*%nY8_i!*wmnvq9rxJ0dr_3&8L-RZu0=~OnP{q zC4%a}J#b)oQeezWl^6$@-ubAgNdbdY4lqus41@zJ12u#~ZAwEm1I-Bdw79{f1E~gB z!Vv*}Ppl{PAPxb5|H@as@_!$j-+fXVIMVUXsuaW(NHk_RXm&6yfe{)f#!g%4UQ#7+ zcX+N+<bGQzN@_5xg}dqD<bc^eRU&xU98iMT)q(CG+bs@AbD{&`z&0^78%YYxPdUI! zwM5)!1Pr0Div!IHrRrRIIMA8^4hRHw0?<qpAozd|0lwv1zUBWMo8L<V$0Q;+D^j2z zz3H>Hf|(uQ;mi<?u(mL%L2TjVfb?fp3%BWEIAGqoz0jJH9?}6b+!Dd^<Y-$a;^oAG zSt7XqSa7!-P#ka<?xh<D=|DIjA(}eS#Bf#!%^quQCc^=CYvDi*;bI0zcimu|Kt+J; zgF6KH)^GjRZ~L}y^Ai_B1K%bhI6mf(pNuoqC!3M%AeNvR;=%#r^i<23jl8KrIFQs} z%YmeaEfL^=84Cx@Aw_+9IdEp@KnlfkAL*h4lLLKPR1Wl!adn`Hp&5$~n8PN9<v@}G zW-J_F&vrQwGk^mP1Q7ud0O+9qzsD9D_&gCo$VfPFZj!`Uf`tRF+kzooN@{?m<$#e- z4oG-+InWY8Ibg0X;eeUv30o@M>HzE>hz=|q*lr`d9}Y;6Jw4fSKz((W12ZwagagS4 zb~!)+P~h9Y{oDQYJ67y+Ko7WdIR}hzmjl^WwB>*qcz_&$&aICOZmkg|H=Leu;lS1p z+z$s*DBg15ssqm`9pEdP8(#guv(pdU4+rG7@r2jB;EBl#&eVvm^#K`cH<LWU^?@@S zxYh|(FQ243;q`fetguDG6o|HoVKx*!k<Sa}hSKYELs{Xo?YW`n%ex%#JlfMJvA`~c z?X%<TA-V1!n1$k5AezO2Xa4?yEeGsH@gzDNuty~vuxsTx&w16KBE0S+^3d>!*+=9h zlwA%e6XAeeYT<xl)Z{?-lwS7}su1Qa1DgjP)BS|yfXxOi6<+rhr!JIj1G}3EWdzL% z^Ry^|Ae)E;f^H(}29js^zT$f*7x#tJY$G|pm8jdvx~0&Ts%|OFw$l0Z&>oEI`vo=+ zJhJx-F5gCS`IbUki?8n)Jx1>tg#$A+@bGcjR(d8iU<tO{%RNEPUm)=uq)(9h;<;S} zdCjD|3cIs(?k?_zqP%5reczB3&+F&eOek4{i^T2JW<r?Wx`8BbCF8)ZEnHHATWz5o zFZR7`ca+&J=~WuL=C-?w6ArqWBpZrs!?O{~woDrfxvcIb$i6alIfmSW`|dN(jsm;9 zJlq$%ZTz#}!)D;Tbt1Cc6KFe-rsgwSKJ=|)Y#4LAvz)63{pd}f*)7oh<gVLvpnHdm zux`-Ejo;Qd_mUUQ++B8+Z+8@TH|d#|jPhqF9`<|3wS_GeDig&PHZ}0{FdW$KEM1-& zc<r>W90~{5zdv9bVc#(7wt>7^;O(2dSul5%o4xIyquK5xl%{3pfW+;7UNVXfgadbF z3+-(tO0|Wl6frP;)5M!HecNa^9AuNZrNJ%dWs^9=N`bxEq=3!t*0O9fzWyB&e*?ry zyl@8*g)hqIe>r6fg#$axZ><)lN^t#qM5zsWuY?<v63)HE**nzNi-bkFk`O6SE`gwL z8k)~X`S*ynwlLw~LQ8Ny9C(GQFCKP(Y2P*2m4d!<;)R{;G|pQm-sQ<3B&k1?r`H>J zlp}Dn2i`;z$3=5nK!tU$iHYx;Er_$_L*F{ak%|7!)q{TYmJQ_kcNKe^?HP03*nqrM zWK@i+5$46ByiialkoU{-ZV?Ym`rNfYM3X&)0zqFh?CV9lf#9Caz=eh|`f$n?W>cAP z<7Jar0ur>f1Rf$U;Q*QEUn9wWlIaXnC=egJy-?irGLGfreeKo?Vh$S-Y~Yt8Od2TE zlm=c$wcQtX_I{TMp7a4%gR%zhwEQz)IR<BfzH{}UAHA`iA%Lq)0vJPHB@m~KP0TXR z?jr8{=6#`Hihy^Eh`@ZW#9m@KluW9xnr{F4#CA)0%)s*2xs}^Dj3fmD0c6jIfcdTC zx0YaTD9T2HQxA`pqOt4%rR^#5)=d5w1u5Wvkl$OD*=D?zf+Pre^N6B0Pt40lF$N0_ zJhA~0uWmbs8os^0WkNK;Ye8C+0nkhHc@F5>5BmDin?Cide^;pjOajPUjLlZq83l|# zJIVQ+T@f$?(+%eRGIM3dvY&jua(?PnQ=2>?f&+rJjen5ZZYRFn3{(orf$QHZhJN&4 zDjEWKn~eUH07(W*0F`0!D^Va%3G+9I?4ZuypNSKw2zd3TFBJ5B^Soy|%Y%aKZXify zKt{l-$=!tPa3CU}=6}g+hEoB`0koNwqEi{-`EYQ`8A^ZnpD6|2w2Bn;Pt(|Jyp0Hg ztQ^5wiyD~xyon|vCsXj$#@k-B+JY6eVHZuH<dFqoU9-S7I-iz*<}1?SNXKXG2mR>3 zp7o#C30*NEU=kqjmMRE{UrQ8F{YXt9PQd*Vz>0v`FegNyFBVNVsO+}9XFA_0xG*cc zt3VJMgah;85qX*W%(vmd-$Up##5lvea)Qi~-2OQNRObvOiO649AV=m3^72vtIt~34 z5jg5;3_=6GYX$|+>Acs21|Hk-X|#GWA<;oJ2dfr70D5V`-2sk_@?%lakN)f5Rb0yz z^BPe?Kz-mOfRU#tBnss9Qbkes=uX}5bOL6>oJ0h?Xj~CkUM{nZ-wd1QzH3YbmOucb zB@o06Y*+fNpP)^{!SWYt2@cs=o+B@Rtg_B9Qs7T0Aa>qD-MWIlh?+l2z#R4u)KF25 zT1c%iFv*J=@CL~gKogg^FoA|g7LXyz0AdZ+Y5Aw0zI9BXcNRUtrJ^7G4*^`!b?X7D z07(X81B`qd1^U;A-1V*#$RD3EWBtP;yCU$M=REZPACqukHym&s%?^+-;Xu_o#iF^T zL`r)~3K-xf2(n|UXlclm8WEBs<RQX&8gS#1vc`onfoRi&L<eykpkUR)2S6{)=Q+TU zj*s%|q0wK@)qhuX-FSdo3E*DDxaNZ?45lVP49!E*0hP3^2%IVlETticz=a4X>Mj|9 zwR{hO;7mAZb})-Yb4!Ug;Fg-<t`zi1VxA)93BnQ)1W;kL#$c-k95`<v9g~$?k`V+I zdq|1b)r68EF#@<CP7B=m-RGKP&?eB+ldSzje?52kyQ1s5x-rlt>NFKVVw+?zHb8XS zMuGhKss7oS{HcLkMPT~}hy-O=oXQC9IS_;c4F}7!gA|JpPdHc#1(!%cY6Z*>3uFn@ z93~=g%hMQ~qCtuV95@K%<FN-*5W<9Lf(Q;ufFeWq5Pg7kn@_YH5a^wSMOpiL6a7g| zm%l5zuB#gZ0vL~aU_!td0=PR5OdAE<yBUZTOif^M0=pv6`tafg;j)Opy=4T`C*Z)6 z9e9(y+lmlRLOPwH2-Uw<w<`sCk|^_~c=HJYJ!B3O5x8ZZc^U(5YO4mR9ZA8|4HRUk z@f3uF25S~}%o|w%Wt0K38cJ+izJj|W1HE&z_JcmD>GF3)*L8JcNEWaqfRQ&Dj15RG z&?vB2!C4a^o=Z9qH)w{<v&|d3ZV);!x}Va}BtXN#t<Lbg6tr~Qr%2Nr_F>`@5g3D0 zG>A7yrXUBWz?LC3wj?JLq6wlyd_u?&K7<lbUYgG}$7o&nddS+J=uiDOhNOW)m9aGh zECg^z%>^0-<b$aUD+)CVq%fGjIb-&gy3kexma+g2@bE1Q+-+%S%YpOG@Qf7fx&oO_ z^TZhuOogzxr2&7aoRT!5YLHAp+Jy!l%2Qy=FoF;!kmzUv!-feKFAzfp%Ais8G(e{v zKe+z?o^L7eRKvkiDBuj|BcxMOFkeeYY*HZK*+zuq2-6tIotq|<2Jr^T6y)8)t|}Y_ zwhSu>#Cd9hsLi<{gH;?pgc4x|Vzl{0^R4Dc$2-fpdcY_OleMq^*uN})S2qSDF`lG> zF@X&MXj}zYY{1L~W)v_>6@e56yJhIEL?CVuf;+h0<wubM99W#;ZoQ}pLjFVvSI|FU znmqATL{K5w`oo0=+%+1gxT1mb5!G#6h#)LX5U(2`;8;F{5>Q^6&$Z%S==FnF6Mf?2 ziiD{8Z#>x?VuZ#?yHK|T*!n>CdnyXZrl%D&heXwU#tE3=Q%+!}g!k_TCr$1_3Q{X* z+0ee1Su)y21Zj~8Y4I>M<fI9qLA*hB9;R-f@+N1r^dbnbXlMu%L<b9&X$N1)U^$Bv z8hp1cUpYoYo<JYluQ$d+&lCMFe<Lv-<TSRVfe2vCQGiJR?l(R#1lZ;Rixpf7gQ*EL z9XR6z9-s(>3>Qkld<7|GL;H(TGNNfUhbb2%B1na%G1$_eLBW)!lC0Q5X=4wjAaDp} zg6I&R0JxCBDh?k)3HYW3>*K%ftar_kS@nTFd7nPJ_FXIXFUz0)#{n8!>HsBx@izpN z08291=YwWuMgbC<D3GTEDGcTb(R@m{tqVO^5hw?CA0N~ev{sO^VYZzoPmDQiMCc0$ z-0w67RzxZWr)VHyOx-}WjnXzQL=YMp!i4w)kcAA^FC4>%P=Z8gfKJOl{q(KoNXKW@ z2l~W)9GmEO`B(pqEsq0?Hd(+K0!WZ+17<GZ$$N5vM1d5ANUK>@k~PEJm&%MepHB&A zI`F_npfpI5c*+&fr9MHJ)#D{1bZfyh2BsnvgIyY=gebF4`6$VP<rYDRLzqlRbf_$V z4;jh_`T$%F%CqG|-)h0#Db7vM*ISgI3Bk9CK2gf@j{!hb<1|_dVB~osuqZ%k!tPp{ z?72V)P#Yj_ik_#U0I@aCEet*y5hw?4m4aC^iaDGSAvr>gL7yY!anddgk}1fhO{ND5 z0&DGo<yJuuh0BCQhxi0?4Y(=;aR4Y-(+<4&|38i&-vQl`T2{Rt^b^}3<xl8$#YBIi zl;vOjH%_B9W+Ufq+(kS<Lcl@*$ufgvHd+yyxxf+y`iSt+i$G~W3g}Fwfc|()*@zG+ zpj3?rsT{fy5n&pGY&H}A;tx;JAelny25M_`HTEEJA%d`Fg6ND1mMX}Q!ODeT_z+5j z6(C-k&o#$r!QHuf$immBo*BOd{VxBh|3;faP^!TK+!+GY2eM2E5F0Rafh7uTt>7#S z!svnIg8_Z{xlIsUT0SzX$A-tQ&@0}x5n*c#;t%si(v}AC2FVoAAmt;)WV$*9VV4P% z8Aco$us~+bPCkSZVFh9=&F7k9wBoLZK(9|d>p!U<?k(td`5ULvqOOq}KLWTHVa|QU z10)1Q0YU&a$(-!kfaU`8HKOGaVGDx~$q7s*BteK2^u^>U1vDxVp*cb}oqCoOW5DMK zc5aq2aN}oakc3eoB~?Trm9AP`6@)kh`IitpH9>R+(<H;>LnuKdcAIat;_k!=y`H1| zMc>sM{mE38zi}EZ0vNgRHw`>PfcQW&V}80zBo(0)1VR9FdnyVLXSh665hxS50vB3J zMhgv?mP7=JOpQSvDZ0Uh2C|`TP)Ndv2Da8vQIjd8(p8IV3WCtEFo9115XT6tl0o3s zq7RV>;O;ixYEgTqWYq_Hed<~N_=a^8{Y3vRf8#V-V>WW*cNY}E9n}O@0g?$W1dvdh zD+FjVcq$jz7KQHr=|F)#^UH-1p)?Q?gfq8Oe~1SB;TbiMFQ;zcNeTx=MQ2=yAZ(ey zE{YDI;myDlGEnUDA(V(j05>f_AOCen=QT%aSmfMjexQ%*OWcq1pXhh_PyIK3cYy%z z$bE4>B>)Yige5={0R*TI+}eO_5}3Kbql^NR6*D5(b!-^Z912y2x)_7dfH81`Zu1Nc zS~oCh9;MMwi>QJiw#FeeG{hvtE+%mx&LM-<I{9D~15|@-8kEzHAKXD)bEH<>v+DJ! zXH0XIRDPHfSC9FR_y_&D{EgpTgaGOx?vDSd2iPTmS+Zn80Jdte0UpyZ;e<B@0rUST zqd;j8DOe)Hq=DMSGzRg9Zc3q}G>|52)j*1rx`FAk4V8DIpBB*+ggAtRhN%hh2^J=R z7BUcr@FA3-5*mnS%ZGkCMhosvT%gx~;(nArYro>3=uf!1{G<QwB?NGHNdp%JXg$#U zv>a3d?An0l0;vj$0&potkKmWkfC(`G<`5g3BQ#Z9Xuufohm!_V4Y=YYjG=+Yi!_sR zCNAs>LQDedg$eNqmLzB_PcW4XMBC!ktYQtO8gREQU*)iz;@qtIK;MNQ+n=?c&`+RF zE&u4hJ1PO(X|ezTafW~pz$}@oQv{HO)dpmf02CfQ0m3mfAO!|Mi<%>BQ^gvC_`@v? zY7s*NkId>46Bo9E(9jS~NOXu}v@ih_GEj!{p_G8B2Hb7SSAJ3w$7{Hx2mPRyKJ~1B zd~+?_bKN-qqJL`nNB`ZIyPE_^77!0G31F`314Y%v1|$lY^QR>WEDD2uGa}R&EER)G zXrM5nJfeyyMAFI7z{1%TgocJ>4VVz0U`c{zl40^8ln5(;yW4!LIZ`X`3-qp%xbM0_ zzv4fm|6KkIKvMwsm_pD!5MZ$ZjRFfUkMf_12$KdPLX83YT7P&CG+>((7c8PF2=$6# zLNr0*01iyBFacCDBurSj)~^Ol&5AzNazGAtmZpcS`arM$$i6Ek@5|aR`aDddzmZq} zV*u`%0QG@SyA9Y9EHqe*L21Cmo}xiA1qoxyM=2)PB`$Gc3PM6dm=L>|#KB?&O2`mp zn0$ynKoh2IK{-J8L&s>2*Cy^+^?}~CaL;w|&=}(UgZ_5;FZ%BuIY9TTXx2J_+28?o zL%>V~LV%~;2JF%x#$fS>ge(4VOM_+#sT(XbSmFXfs6%LIC=-%6Sca8_Ne1E&K13qI z3PKUB0C8JB^wTk#<F(+flL>tnKJ;B38yEB&{aXR(@;^lYRTOiw^#CQn)(4t%3vdg^ z)AdP=!Ssh1YuKk~Am?3Zz!9}{AW)(~ibxRzLYmN!iei|M{88cn0$5m#KnWSFP)J#- z;Y0Kx5&=*RxZ9Sm{B)$|EG<i3Z&~&F&%$>_*LC$MzbwY6f_}5VY5&~OVgP91QU_36 z6*OxC7Xq+b(+8UKrwi^=*S#wm%;!o=&PX8}7b*x14ZBPrzf%@UhRKIe0xLoc$nLfr z;HTrY;y$6D3m*@+=vVxAmp`h{6d($aLeOJP0K}+2yhIK9T#5QMXPj{%wL}Z24#9j% z8LTWbTqeXPaEyQeN5~LmfK<d`QX;GnH8l9nmJj`OOj_2v(<}H{^{x`=UDw(-2I`cx zAM}mWXgwE8`rqY04M2(jF#sWeIk{W`o>5U?%0g+t7_?|GgF-WfmXG>qsgD&}M5-W| z!-j@3A<=<PXzl=xg$%?Yd?4B=5muBKz}+_AYB|_hT5#9Z0)0KdF(mHe=R`l^U;EeP zU;VEGq>8BowhoXiAReG0pqbz^mH;8cg)~Sp8SRrZ)*du2BwvU_NN8A?P@fQ4h-tJW zL8DDRL?0p%VFg&vG{<O;*PN>nnJoEqo`oOiT^$<}_q+Bd`l<iK|D$)7fAzlxz@jiG z%(G?kSQFqp4U#aXe8laz<vdzKgV=+_g+&mOG9)xuQ)NO5N|=xU0f>@;G7x7-Y2iaC z5tRU_7I2rJ`N~g6YR=O1kgg*53-qpT4A3_o%3t)A!HqfMpXk3V|HS~94ReA3<|l<9 z`uW%?z-~~eH^>8p(qQI{OI%345J8ATFo$JAH6cF1%nQ39*ph)h!wVlmiOGsA=Tkq6 zctCf0aMxj1eW7>tpl>|*8Reho$NbObp9FBx|D*tu0A_5-0-oU^U=m<agDnm6OrbQe z1kfOHVG)EgOt8?*xtX{0EWm{f6^H5r1T|=;9jLMXIDUC2zNZEBsJ%Y5tolOl>OtRl z@be7%)BeT(SN}@@Gh>-hfG2<eTN<={MBm(IO9#}?3^XpVM$;jfw}b}kXleqV5XWfd z6Cg^4$%pC#?1bzzfSzy11Me6-EubgXXURwNyYPd)@fa1oqFP=1s(;4sE{GfPPxP<< zum0Bnm>KgE0+=z&M<Gbk{n#nM)P!0@x07VS4Z2NK-^PVS5Rx*Oy@d&!RUM<5xAZK) zl3|KN_z;Om$N;4V)>AD9`004fxte~oF8OHwT=+rXsEiF)F?OO~@jtcvrvWfOQmQA0 z03}1qN1=f*=T1X|T|pp{5d@)OVM3!rm=LQFSwM!#hw4KlA|WGa`WbMSpZzw72lTFY z9Ts;NS{8oMH^Q#{iM~5>Uu^L1@}K%Y3D7xw0)D9=Od3QGLIZYaI)tPQXP982B|uCv zkm4;LA`uYOEaBPUn>Ii6dk*%~xmp7K#J!qd=#A$L`YHZEU-sANZ~41-=vV)v08fDa zpJHrjup1Y`1T=_4Fjr=5%LGx?;%a~}?F$(Qa>OBg2qh9Sq7neTwK-CAmZk?yZ(3sg zqWKH-iTf0c^3Tv8^xfTz{w2T@ssFo7*wP?zVe1esXF}XU$xv~KK7<lw1ssFvnV$!= zUxoMty-PmfzR<_=Vdf?1&+Knm{!fMj+{JzS;Vu(OgBcnYCWxm*bq0va!c>OvA^H$X z@M#cC!;16mc;Fp(r|Ch{o2F;2;oe1ep>N!uYd`3_J7ze`Kk5IB{$^%7T~F#KyEK?7 z!-Y(sxABe0u;l}=4xrun5fJ?hre}Wk$eyboE$h9wyBxn7&9CfVh`u|0mJ=YvMgwg( zWjL=1wF;GmsSI#A(BY14&_JevFD+=^`tx}BoxEO4SLs&&TEl%J{)GPg+CPQ9sd!S? z`>ppiX;81Yn1pIVa)%ip;u}MThKYzn^Z{PM&d)%({4B)F=RNCy`5n+TJ!`?;<qCZb ze=MJIYO(!Q{ssMKRrJ4=1`e1^5Fa%@d0~RdEE$qMlnhk{dBo%cu(SXd5c@O8E<gKi ze#wdH#803X_oVr*tI73@L^G-h{Vw`$?TY>>N}$25OkkzT1gp%1n|96o144s{C8@zE z4JFEofLKgV{gT7-Gp8RryHnoLg1gHFcLNCYbKy7XYusPZceAIa;#vOrfe1HD!qkLm z8W%Ez4|i7M;KQ9&dSnIc3gsog9MFCh;_2tWvKvc&fqpLhsr*;;?}60|6Y3LYfQWCb zG9*ky9Hu@@Rs_TVdgf;in~3Y=pf`8cyXGpID{8?#tA6JDt@%vlzpnkeCBtNb@@be* zS%_PxGK35f2hap2KZBZ|0de^mh7{uE+n(Fr4zS<BU2{b(xM$UGWxrM5EBbef{ye@+ zXcl>f3>63H1SvlQTz(eK^S{hf+Rp*=SK)pJ`YwC}&fw?mTz|ix87LVnF3nVHWFg9s zFi~-cK0rz<cKM~4p891uKArff&oo!jTv5vaGMEhP3jO_{eBrqzLzH2c56}rxejcHF z)&CaLQ@<?7x1R&%Cvm?*e<6Gi_OLA(%7;osRiX$M(^J3n$o!I(?q?RepIPsI!u<;U zgT?fodkY!-3@CmUrUI8=3h4P?mb2Ph`|lO+dCb=nAL<MgphA{k3gsogEa$e*hdT0W z=MQfNis0S;^6-Xq?fE(b*BQ9Zz;y<$GjN@O>kM3H;5q}>8Mw~Cbq208@JyJ2{|6jJ B;)?(P literal 0 HcmV?d00001 diff --git a/reactos/apps/tests/alphablend/makefile b/reactos/apps/tests/alphablend/makefile new file mode 100644 index 00000000000..9beb3ca2a3c --- /dev/null +++ b/reactos/apps/tests/alphablend/makefile @@ -0,0 +1,22 @@ + +PATH_TO_TOP = ../../.. + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = windows + +TARGET_NAME = alphablend + +TARGET_SDKLIBS = kernel32.a gdi32.a + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_CFLAGS = -Wall -Werror -D__USE_W32API + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF From f3a00751378f38af3978dcd258a8f698e26f470e Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Tue, 17 Feb 2004 17:43:09 +0000 Subject: [PATCH 0056/1463] fixed WindowFromPoint() to search backwards svn path=/trunk/; revision=8220 --- reactos/subsys/win32k/ntuser/winpos.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index 2cef774c86e..116d1eb6f6b 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.88 2004/02/08 10:53:17 navaraf Exp $ +/* $Id: winpos.c,v 1.89 2004/02/17 17:43:09 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1246,7 +1246,7 @@ WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, POINT Point, PWINDOW_OBJECT Current; ExAcquireFastMutexUnsafe(&ScopeWin->ChildrenListLock); - Current = ScopeWin->FirstChild; + Current = ScopeWin->LastChild; while (Current) { if (Current->Style & WS_VISIBLE && @@ -1278,7 +1278,7 @@ WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, POINT Point, ExReleaseFastMutexUnsafe(&ScopeWin->ChildrenListLock); return(0); } - Current = Current->NextSibling; + Current = Current->PrevSibling; } ExReleaseFastMutexUnsafe(&ScopeWin->ChildrenListLock); From 7595e479e5aff36b7b8929626c4dbef1db1bc794 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Tue, 17 Feb 2004 18:01:59 +0000 Subject: [PATCH 0057/1463] - Work on serial mouse detection to fix bug #198. svn path=/trunk/; revision=8221 --- reactos/drivers/input/sermouse/sermouse.c | 123 +++++++++++++--------- 1 file changed, 75 insertions(+), 48 deletions(-) diff --git a/reactos/drivers/input/sermouse/sermouse.c b/reactos/drivers/input/sermouse/sermouse.c index 46b0bc58908..9f73ee80630 100644 --- a/reactos/drivers/input/sermouse/sermouse.c +++ b/reactos/drivers/input/sermouse/sermouse.c @@ -254,21 +254,21 @@ SerialMouseStartIo(PDEVICE_OBJECT DeviceObject, PIRP Irp) if (KeSynchronizeExecution(DeviceExtension->MouseInterrupt, MouseSynchronizeRoutine, Irp)) { - KIRQL oldIrql; + KIRQL oldIrql; Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); - oldIrql = KeGetCurrentIrql(); - if (oldIrql < DISPATCH_LEVEL) - { - KeRaiseIrql (DISPATCH_LEVEL, &oldIrql); - IoStartNextPacket (DeviceObject, FALSE); - KeLowerIrql(oldIrql); - } - else - { - IoStartNextPacket (DeviceObject, FALSE); - } + oldIrql = KeGetCurrentIrql(); + if (oldIrql < DISPATCH_LEVEL) + { + KeRaiseIrql(DISPATCH_LEVEL, &oldIrql); + IoStartNextPacket(DeviceObject, FALSE); + KeLowerIrql(oldIrql); + } + else + { + IoStartNextPacket (DeviceObject, FALSE); + } } } @@ -377,65 +377,95 @@ VOID SerialMouseIsrDpc(PKDPC Dpc, PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID C void InitializeSerialPort(ULONG Port) { - /* DLAB off */ - WRITE_PORT_UCHAR((PUCHAR)Port + 3, 0); - WRITE_PORT_UCHAR((PUCHAR)Port + 2, 0); /* FCR: disable FIFO */ - WRITE_PORT_UCHAR((PUCHAR)Port + 1, 0); /* IER: disable ints */ - /* Set DLAB on */ + /* DLAB off */ + WRITE_PORT_UCHAR((PUCHAR)Port + 3, 0); + WRITE_PORT_UCHAR((PUCHAR)Port + 2, 0); /* FCR: disable FIFO */ + WRITE_PORT_UCHAR((PUCHAR)Port + 1, 0); /* IER: disable ints */ + /* Set DLAB on */ WRITE_PORT_UCHAR((PUCHAR)Port + 3, 0x80); /* Set serial port speed */ WRITE_PORT_UCHAR((PUCHAR)Port, 0x60); WRITE_PORT_UCHAR((PUCHAR)Port + 1, 0); - /* Set DLAB off and set LCR */ + /* Set DLAB off and set LCR */ WRITE_PORT_UCHAR((PUCHAR)Port + 3, 2); +} - WRITE_PORT_UCHAR((PUCHAR)Port + 4, 0x09); /* DR int enable */ +BOOL UARTReadChar(ULONG Port, CHAR *Value, ULONG Timeout) +{ + ULONG i, j; + + for (i = 0; i < Timeout; i++) + { + for (j = 0; j < 1000; j++) + { + /* Is there a character ready? */ + if (READ_PORT_UCHAR((PUCHAR)Port + 5) & 0x01) + { + /* Yes, read it and return */ + *Value = READ_PORT_UCHAR((PUCHAR)Port); + return TRUE; + } + else + { + /* No, wait */ + KeStallExecutionProcessor(1); + } + } + } + + return FALSE; } ULONG DetectMicrosoftMouse(ULONG Port) { - CHAR Buffer[4]; - ULONG i; + CHAR Buffer[8]; + ULONG Count, i; UCHAR LCR, MCR; - /* Save original LCR/MCR */ - LCR = READ_PORT_UCHAR((PUCHAR)Port + 3); /* LCR (line ctrl reg) */ - MCR = READ_PORT_UCHAR((PUCHAR)Port + 4); /* MCR (modem ctrl reg) */ + /* Save original LCR/MCR */ + LCR = READ_PORT_UCHAR((PUCHAR)Port + 3); /* LCR (line ctrl reg) */ + MCR = READ_PORT_UCHAR((PUCHAR)Port + 4); /* MCR (modem ctrl reg) */ - /* Reset UART */ - WRITE_PORT_UCHAR((PUCHAR)Port + 4, 0); /* MCR: DTR/RTS/OUT2 off */ + /* Reset UART */ + WRITE_PORT_UCHAR((PUCHAR)Port + 4, 0); /* MCR: DTR/RTS/OUT2 off */ - /* Set communications parameters */ - InitializeSerialPort(Port); + /* Set communications parameters */ + InitializeSerialPort(Port); - /* Flush receive buffer */ - (void) READ_PORT_UCHAR((PUCHAR)Port); - KeStallExecutionProcessor(150000); /* Wait > 100 ms */ + /* Flush receive buffer */ + (void) READ_PORT_UCHAR((PUCHAR)Port); + /* right? -> wait two ticks (approx 1/9 sec) */ + KeStallExecutionProcessor(100000); /* Enable DTR/RTS (OUT2 disabled) */ WRITE_PORT_UCHAR((PUCHAR)Port + 4, 3); - /* Discard serial buffer data */ - while (READ_PORT_UCHAR((PUCHAR)Port + 5) & 0x01) - (void)READ_PORT_UCHAR((PUCHAR)Port); - KeStallExecutionProcessor(200000); /* Wait */ - - /* Read the data */ - for (i = 0; i < 4; i++) - Buffer[i] = READ_PORT_UCHAR((PUCHAR)Port); + if (UARTReadChar(Port, &Buffer[0], 500)) + { + Count = 1; + while (Count < 8) + { + if (UARTReadChar(Port, &Buffer[Count], 100)) + Count++; + else + break; + } + } + else + return MOUSE_TYPE_NONE; /* Restore LCR/MCR */ WRITE_PORT_UCHAR((PUCHAR)Port + 3, LCR); /* LCR (line ctrl reg) */ WRITE_PORT_UCHAR((PUCHAR)Port + 4, MCR); /* MCR (modem ctrl reg) */ - for (i = 0; i < 4; ++i) + for (i = 0; i < Count; ++i) { /* Sign for Microsoft Ballpoint */ if (Buffer[i] == 'B') { DbgPrint("Microsoft Ballpoint device detected"); DbgPrint("THIS DEVICE IS NOT SUPPORTED, YET"); - return MOUSE_TYPE_NONE; + return MOUSE_TYPE_NONE; } else /* Sign for Microsoft Mouse protocol followed by button specifier */ if (Buffer[i] == 'M') @@ -462,7 +492,6 @@ ULONG DetectMicrosoftMouse(ULONG Port) } return MOUSE_TYPE_NONE; - } PDEVICE_OBJECT @@ -545,8 +574,6 @@ InitializeMouse(ULONG Port, ULONG Irq, PDRIVER_OBJECT DriverObject) /* No mouse, no need to continue */ if (MouseType == MOUSE_TYPE_NONE) { - WRITE_PORT_UCHAR((PUCHAR)(Port) + 1, 1); - InitializeSerialPort(Port); return FALSE; } @@ -555,7 +582,7 @@ InitializeMouse(ULONG Port, ULONG Irq, PDRIVER_OBJECT DriverObject) ClearMouse(Port); - /* Enable RTS, DTR and OUT2 */ + /* Enable RTS, DTR and OUT2 */ WRITE_PORT_UCHAR((PUCHAR)Port + 4, 0x0b); /* Allocate new device */ @@ -625,9 +652,9 @@ DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) return STATUS_UNSUCCESSFUL; } - DriverObject->MajorFunction[IRP_MJ_CREATE] = SerialMouseDispatch; - DriverObject->MajorFunction[IRP_MJ_CLOSE] = SerialMouseDispatch; - DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = SerialMouseInternalDeviceControl; + DriverObject->MajorFunction[IRP_MJ_CREATE] = (PDRIVER_DISPATCH)SerialMouseDispatch; + DriverObject->MajorFunction[IRP_MJ_CLOSE] = (PDRIVER_DISPATCH)SerialMouseDispatch; + DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = (PDRIVER_DISPATCH)SerialMouseInternalDeviceControl; DriverObject->DriverStartIo = SerialMouseStartIo; return STATUS_SUCCESS; From a57cc3b82aa9990c7de4fe33b8e71f937984a53d Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Tue, 17 Feb 2004 20:20:01 +0000 Subject: [PATCH 0058/1463] disable autostart if the SHIFT key is pressed svn path=/trunk/; revision=8223 --- reactos/subsys/system/explorer/doc/changes.txt | 3 ++- reactos/subsys/system/explorer/explorer.cpp | 4 ++++ reactos/subsys/system/explorer/taskbar/startmenu.cpp | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/system/explorer/doc/changes.txt b/reactos/subsys/system/explorer/doc/changes.txt index cf77c591a0f..6c1b4fe15ad 100644 --- a/reactos/subsys/system/explorer/doc/changes.txt +++ b/reactos/subsys/system/explorer/doc/changes.txt @@ -61,4 +61,5 @@ If you search for more information, look into the CVS repository. 31.01.2004 m. fuchs included Registry as virtual file system 02.02.2004 m. fuchs reading of FAT image files 07.02.2004 m. fuchs included IE/Mozilla as Active X control -08.02.3004 m. fuchs desktop switching +08.02.2003 m. fuchs desktop switching +16.02.200 m. fuchs lean explorer version without additional bells and whistles -> see CVS branch "lean-explorer" diff --git a/reactos/subsys/system/explorer/explorer.cpp b/reactos/subsys/system/explorer/explorer.cpp index 0b7fa95bb41..a39a2e8482b 100644 --- a/reactos/subsys/system/explorer/explorer.cpp +++ b/reactos/subsys/system/explorer/explorer.cpp @@ -625,6 +625,10 @@ int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdL bool autostart = true; + // disable autostart if the SHIFT key is pressed + if (GetAsyncKeyState(VK_SHIFT) < 0) + autostart = false; + #ifdef _DEBUG //MF: disabled for debugging autostart = false; #endif diff --git a/reactos/subsys/system/explorer/taskbar/startmenu.cpp b/reactos/subsys/system/explorer/taskbar/startmenu.cpp index 48a76c9ac3e..fcb71556b79 100644 --- a/reactos/subsys/system/explorer/taskbar/startmenu.cpp +++ b/reactos/subsys/system/explorer/taskbar/startmenu.cpp @@ -1597,7 +1597,7 @@ int StartMenuHandler::Command(int id, int code) case IDC_CONTROL_PANEL: CloseStartMenu(id); - MainFrame::Create(TEXT("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}"), FALSE); + MainFrame::Create(TEXT("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}"), 0); break; case IDC_ADMIN: From d842500eb18da8a526061c387c4556d839b5dc13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Tue, 17 Feb 2004 21:11:17 +0000 Subject: [PATCH 0059/1463] Always return 8-byte aligned blocks svn path=/trunk/; revision=8226 --- reactos/lib/ntdll/rtl/heap.c | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/reactos/lib/ntdll/rtl/heap.c b/reactos/lib/ntdll/rtl/heap.c index f81077f9c24..8737de52dbe 100644 --- a/reactos/lib/ntdll/rtl/heap.c +++ b/reactos/lib/ntdll/rtl/heap.c @@ -46,7 +46,6 @@ typedef struct tagARENA_INUSE DWORD size; /* Block size; must be the first field */ WORD threadId; /* Allocating thread id */ WORD magic; /* Magic number */ - void *callerEIP; /* EIP of caller upon allocation */ } ARENA_INUSE; typedef struct tagARENA_FREE @@ -94,7 +93,6 @@ typedef struct tagSUBHEAP struct tagSUBHEAP *next; /* Next sub-heap */ struct tagHEAP *heap; /* Main heap structure */ DWORD magic; /* Magic number */ - WORD selector; /* Selector for HEAP_WINE_SEGPTR heaps */ } SUBHEAP, *PSUBHEAP; #define SUBHEAP_MAGIC ((DWORD)('S' | ('U'<<8) | ('B'<<16) | ('H'<<24))) @@ -107,7 +105,7 @@ typedef struct tagHEAP CRITICAL_SECTION critSection; /* Critical section for serialization */ DWORD flags; /* Heap flags */ DWORD magic; /* Magic number */ - void *private; /* Private pointer for the user of the heap */ + BYTE filler[4]; /* Make multiple of 8 bytes */ } HEAP, *PHEAP; #define HEAP_MAGIC ((DWORD)('H' | ('E'<<8) | ('A'<<16) | ('P'<<24))) @@ -119,14 +117,6 @@ typedef struct tagHEAP static BOOL HEAP_IsRealArena( HANDLE heap, DWORD flags, LPCVOID block, BOOL quiet ); -#ifdef __GNUC__ -#define GET_EIP() (__builtin_return_address(0)) -#define SET_EIP(ptr) ((ARENA_INUSE*)(ptr) - 1)->callerEIP = GET_EIP() -#else -#define GET_EIP() 0 -#define SET_EIP(ptr) /* nothing */ -#endif /* __GNUC__ */ - /*********************************************************************** * HEAP_Dump @@ -181,10 +171,9 @@ HEAP_Dump(PHEAP heap) else if (*(DWORD *)ptr & ARENA_FLAG_PREV_FREE) { ARENA_INUSE *pArena = (ARENA_INUSE *)ptr; - DPRINTF( "%08lx Used %08lx %04x back=%08lx EIP=%p\n", + DPRINTF( "%08lx Used %08lx %04x back=%08lx\n", (DWORD)pArena, pArena->size & ARENA_SIZE_MASK, - pArena->threadId, *((DWORD *)pArena - 1), - pArena->callerEIP ); + pArena->threadId, *((DWORD *)pArena - 1)); ptr += sizeof(*pArena) + (pArena->size & ARENA_SIZE_MASK); arenaSize += sizeof(ARENA_INUSE); usedSize += pArena->size & ARENA_SIZE_MASK; @@ -192,9 +181,9 @@ HEAP_Dump(PHEAP heap) else { ARENA_INUSE *pArena = (ARENA_INUSE *)ptr; - DPRINTF( "%08lx used %08lx %04x EIP=%p\n", + DPRINTF( "%08lx used %08lx %04x\n", (DWORD)pArena, pArena->size & ARENA_SIZE_MASK, - pArena->threadId, pArena->callerEIP ); + pArena->threadId); ptr += sizeof(*pArena) + (pArena->size & ARENA_SIZE_MASK); arenaSize += sizeof(ARENA_INUSE); usedSize += pArena->size & ARENA_SIZE_MASK; @@ -524,7 +513,6 @@ static BOOL HEAP_InitSubHeap( HEAP *heap, LPVOID address, DWORD flags, DWORD commitSize, DWORD totalSize ) { SUBHEAP *subheap = (SUBHEAP *)address; - WORD selector = 0; FREE_LIST_ENTRY *pEntry; int i; NTSTATUS Status; @@ -550,7 +538,6 @@ static BOOL HEAP_InitSubHeap( HEAP *heap, LPVOID address, DWORD flags, subheap = (SUBHEAP *)address; subheap->heap = heap; - subheap->selector = selector; subheap->size = totalSize; subheap->commitSize = commitSize; subheap->magic = SUBHEAP_MAGIC; @@ -1172,7 +1159,6 @@ RtlAllocateHeap(HANDLE heap, /* [in] Handle of private heap block */ pInUse = (ARENA_INUSE *)pArena; pInUse->size = (pInUse->size & ~ARENA_FLAG_FREE) + sizeof(ARENA_FREE) - sizeof(ARENA_INUSE); - pInUse->callerEIP = GET_EIP(); pInUse->threadId = (DWORD)NtCurrentTeb()->Cid.UniqueThread; pInUse->magic = ARENA_INUSE_MAGIC; @@ -1363,7 +1349,6 @@ LPVOID STDCALL RtlReAllocateHeap( /* Return the new arena */ - pArena->callerEIP = GET_EIP(); if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveCriticalSection( &heapPtr->critSection ); TRACE("(%08x,%08lx,%08lx,%08lx): returning %08lx\n", From 0d03cadfe15a1122a506d269c1d13423a164e7d1 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Tue, 17 Feb 2004 21:50:07 +0000 Subject: [PATCH 0060/1463] corrected comment svn path=/trunk/; revision=8228 --- reactos/subsys/system/explorer/desktop/desktop.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/subsys/system/explorer/desktop/desktop.cpp b/reactos/subsys/system/explorer/desktop/desktop.cpp index 9bd74e8180f..f72af94dd5e 100644 --- a/reactos/subsys/system/explorer/desktop/desktop.cpp +++ b/reactos/subsys/system/explorer/desktop/desktop.cpp @@ -38,7 +38,7 @@ #include "desktop.h" #include "../taskbar/desktopbar.h" -#include "../shell/mainframe.h" // for MainFrame::Create() +#include "../shell/mainframe.h" // for MainFrame::OpenShellFolders() static BOOL (WINAPI*SetShellWindow)(HWND); From 6cecd7c5a3be62d97506fb3131fb19068f835209 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Tue, 17 Feb 2004 21:50:44 +0000 Subject: [PATCH 0061/1463] inserted _NO_MDI questions svn path=/trunk/; revision=8229 --- .../system/explorer/shell/mainframe.cpp | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/reactos/subsys/system/explorer/shell/mainframe.cpp b/reactos/subsys/system/explorer/shell/mainframe.cpp index 9e1d6fffe2b..be209339d0b 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.cpp +++ b/reactos/subsys/system/explorer/shell/mainframe.cpp @@ -427,7 +427,7 @@ LRESULT MainFrame::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) #ifndef _NO_MDI return DefFrameProc(_hwnd, _hmdiclient, nmsg, wparam, lparam); #else - return super::WNdProc(nmsg, wparam, lparam); + return super::WndProc(nmsg, wparam, lparam); #endif } @@ -454,8 +454,10 @@ int MainFrame::Command(int id, int code) while(*root) ++root; +#ifndef _NO_MDI if (activate_drive_window(root)) return 0; +#endif _tsplitpath(root, drv, 0, 0, 0); @@ -547,12 +549,12 @@ int MainFrame::Command(int id, int code) TCHAR path[MAX_PATH]; FileChildWindow* child; - if (activate_child_window(TEXT("unixfs"))) - break; - getcwd(path, MAX_PATH); #ifndef _NO_MDI + if (activate_child_window(TEXT("unixfs"))) + break; + FileChildWindow::create(_hmdiclient, FileChildWndInfo(path)); #else ///@todo SDI implementation @@ -563,8 +565,10 @@ int MainFrame::Command(int id, int code) case ID_DRIVE_DESKTOP: { TCHAR path[MAX_PATH]; +#ifndef _NO_MDI if (activate_child_window(TEXT("Desktop"))) break; +#endif GetCurrentDirectory(MAX_PATH, path); @@ -573,13 +577,12 @@ int MainFrame::Command(int id, int code) case ID_DRIVE_SHELL_NS: { TCHAR path[MAX_PATH]; - - if (activate_child_window(TEXT("Shell"))) - break; - GetCurrentDirectory(MAX_PATH, path); #ifndef _NO_MDI + if (activate_child_window(TEXT("Shell"))) + break; + FileChildWindow::create(ShellChildWndInfo(_hmdiclient, path, DesktopFolderPath())); #else ///@todo SDI implementation @@ -587,10 +590,10 @@ int MainFrame::Command(int id, int code) break;} case ID_DRIVE_NTOBJ_NS: { +#ifndef _NO_MDI if (activate_child_window(TEXT("NTOBJ"))) break; -#ifndef _NO_MDI FileChildWindow::create(NtObjChildWndInfo(_hmdiclient, TEXT("\\"))); #else ///@todo SDI implementation @@ -612,10 +615,10 @@ int MainFrame::Command(int id, int code) ///@todo prompt for image file +#ifndef _NO_MDI if (activate_child_window(TEXT("FAT"))) break; -#ifndef _NO_MDI FileChildWindow::create(FATChildWndInfo(_hmdiclient, TEXT("FAT Image"))); //@@ #else ///@todo SDI implementation From 1a0c8484561ab41431738bee5d0529b6bfccdfc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Tue, 17 Feb 2004 22:32:53 +0000 Subject: [PATCH 0062/1463] Sync with Wine-20040213: Robert Shearman <R.J.Shearman@warwick.ac.uk> Fix nGrow initialization in DPA_CreateEx. svn path=/trunk/; revision=8230 --- reactos/lib/comctl32/comctl32undoc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/comctl32/comctl32undoc.c b/reactos/lib/comctl32/comctl32undoc.c index 6a4186eb880..1a966566711 100644 --- a/reactos/lib/comctl32/comctl32undoc.c +++ b/reactos/lib/comctl32/comctl32undoc.c @@ -2195,7 +2195,7 @@ DPA_CreateEx (INT nGrow, HANDLE hHeap) hdpa = Alloc (sizeof(*hdpa)); if (hdpa) { - hdpa->nGrow = min(8, nGrow); + hdpa->nGrow = max(8, nGrow); hdpa->hHeap = hHeap ? hHeap : GetProcessHeap(); hdpa->nMaxCount = hdpa->nGrow * 2; hdpa->ptrs = HeapAlloc (hdpa->hHeap, HEAP_ZERO_MEMORY, From fe941591fef2ce73e37b89f7b7e735c687670c38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Tue, 17 Feb 2004 22:33:55 +0000 Subject: [PATCH 0063/1463] Sync with Wine-20040213: Aric Stewart <aric@codeweavers.com> Work toward properly updating the SelectionMark when the selected state changed inside a listbox. svn path=/trunk/; revision=8231 --- reactos/lib/comctl32/listview.c | 34 +++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/reactos/lib/comctl32/listview.c b/reactos/lib/comctl32/listview.c index cf151d8f8a4..8c43634ede9 100644 --- a/reactos/lib/comctl32/listview.c +++ b/reactos/lib/comctl32/listview.c @@ -7043,6 +7043,40 @@ static BOOL LISTVIEW_SetItemState(LISTVIEW_INFO *infoPtr, INT nItem, const LVITE else bResult = LISTVIEW_SetItemT(infoPtr, &lvItem, TRUE); + /* + *update selection mark + * + * Investigation on windows 2k showed that selection mark was updated + * whenever a new selection was made, but if the selected item was + * unselected it was not updated. + * + * we are probably still not 100% accurate, but this at least sets the + * proper selection mark when it is needed + */ + + if (bResult && (lvItem.state & lvItem.stateMask & LVIS_SELECTED) && + ((infoPtr->nSelectionMark == -1) || (lvItem.iItem <= infoPtr->nSelectionMark))) + { + int i; + infoPtr->nSelectionMark = -1; + for (i = 0; i < infoPtr->nItemCount; i++) + { + if (infoPtr->uCallbackMask & LVIS_SELECTED) + { + if (LISTVIEW_GetItemState(infoPtr, i, LVIS_SELECTED)) + { + infoPtr->nSelectionMark = i; + break; + } + } + else if (ranges_contain(infoPtr->selectionRanges, i)) + { + infoPtr->nSelectionMark = i; + break; + } + } + } + return bResult; } From d8aa2b9e91522a57af232dbc7531f1e526d9f92d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Tue, 17 Feb 2004 22:35:27 +0000 Subject: [PATCH 0064/1463] Sync with Wine-20040213: Francois Gouget <fgouget@free.fr> Assorted spelling and case fixes. Alexandre Julliard: Moved a few remaining 16-bit definitions out of the standard headers. svn path=/trunk/; revision=8232 --- reactos/lib/comctl32/rebar.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/comctl32/rebar.c b/reactos/lib/comctl32/rebar.c index 226605016cb..f53da410a60 100644 --- a/reactos/lib/comctl32/rebar.c +++ b/reactos/lib/comctl32/rebar.c @@ -3443,7 +3443,7 @@ REBAR_MoveBand (REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam) /* save one to be moved */ memcpy (&holder, &oldBands[uFrom], sizeof(REBAR_BAND)); - /* close up rest of bands (psuedo delete) */ + /* close up rest of bands (pseudo delete) */ if (uFrom < infoPtr->uNumBands - 1) { memcpy (&oldBands[uFrom], &oldBands[uFrom+1], (infoPtr->uNumBands - uFrom - 1) * sizeof(REBAR_BAND)); From df3569b50b1f0492f7edd0cd385815f05ed6382b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Tue, 17 Feb 2004 22:38:03 +0000 Subject: [PATCH 0065/1463] Sync with Wine-20040213: Vitaliy Margolen <wine-patch@kievinfo.com> - Fix handling of TCS_RAGGEDRIGHT style. - Clip UpDown control only if it is present. - Add ToDos. svn path=/trunk/; revision=8233 --- reactos/lib/comctl32/tab.c | 142 ++++++++++++++++++++++--------------- 1 file changed, 83 insertions(+), 59 deletions(-) diff --git a/reactos/lib/comctl32/tab.c b/reactos/lib/comctl32/tab.c index 7d1f1b90b6e..f38dd9cda25 100644 --- a/reactos/lib/comctl32/tab.c +++ b/reactos/lib/comctl32/tab.c @@ -21,9 +21,18 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * TODO: - * Image list support * Unicode support (under construction) * + * Styles: + * TCIF_RTLREADING + * + * Messages: + * TCM_SETITEMEXTRA + * TCM_REMOVEIMAGE + * TCM_DESELECTALL + * TCM_GETEXTENDEDSTYLE + * TCM_SETEXTENDEDSTYLE + * * FIXME: * UpDown control not displayed until after a tab is clicked on */ @@ -652,9 +661,13 @@ TAB_DrawLoneItemInterior(HWND hwnd, TAB_INFO* infoPtr, int iItem) HDC hdc = GetDC(hwnd); RECT r, rC; - GetWindowRect(hwnd, &rC); - GetWindowRect(infoPtr->hwndUpDown, &r); - ExcludeClipRect(hdc, r.left - rC.left, r.top - rC.top, r.right - rC.left, r.bottom - rC.top); + /* Clip UpDown control to not draw over it */ + if (infoPtr->needsScrolling) + { + GetWindowRect(hwnd, &rC); + GetWindowRect(infoPtr->hwndUpDown, &r); + ExcludeClipRect(hdc, r.left - rC.left, r.top - rC.top, r.right - rC.left, r.bottom - rC.top); + } TAB_DrawItemInterior(hwnd, hdc, iItem, NULL); ReleaseDC(hwnd, hdc); } @@ -1188,8 +1201,7 @@ static void TAB_SetItemBounds (HWND hwnd) * Check if this is a multiline tab control and if so * check to see if we should wrap the tabs * - * Because we are going to arange all these tabs evenly - * really we are basically just counting rows at this point + * Wrap all these tabs. We will arange them evenly later. * */ @@ -1242,19 +1254,26 @@ static void TAB_SetItemBounds (HWND hwnd) /* Don't need scrolling, then update infoPtr->leftmostVisible */ if(!infoPtr->needsScrolling) infoPtr->leftmostVisible = 0; - - TAB_SetupScrolling(hwnd, infoPtr, &clientRect); } + else + { + /* + * No scrolling in Multiline or Vertical styles. + */ + infoPtr->needsScrolling = FALSE; + infoPtr->leftmostVisible = 0; + } + TAB_SetupScrolling(hwnd, infoPtr, &clientRect); /* Set the number of rows */ infoPtr->uNumRows = curItemRowCount; - if (((lStyle & TCS_MULTILINE) || (lStyle & TCS_VERTICAL)) && (infoPtr->uNumItem > 0)) + /* Arange all tabs evenly if style says so */ + if (!(lStyle & TCS_RAGGEDRIGHT) && ((lStyle & TCS_MULTILINE) || (lStyle & TCS_VERTICAL)) && (infoPtr->uNumItem > 0)) { - INT widthDiff, remainder; INT tabPerRow,remTab; INT iRow,iItm; - INT iIndexStart=0,iIndexEnd=0, iCount=0; + INT iCount=0; /* * Ok windows tries to even out the rows. place the same @@ -1335,66 +1354,68 @@ static void TAB_SetItemBounds (HWND hwnd) * Justify the rows */ { - while(iIndexStart < infoPtr->uNumItem) + INT widthDiff, iIndexStart=0, iIndexEnd=0; + INT remainder; + INT iCount=0; + + while(iIndexStart < infoPtr->uNumItem) { - /* - * find the indexs of the row - */ - /* find the first item on the next row */ - for (iIndexEnd=iIndexStart; - (iIndexEnd < infoPtr->uNumItem) && - (infoPtr->items[iIndexEnd].rect.top == + /* + * find the indexs of the row + */ + /* find the first item on the next row */ + for (iIndexEnd=iIndexStart; + (iIndexEnd < infoPtr->uNumItem) && + (infoPtr->items[iIndexEnd].rect.top == infoPtr->items[iIndexStart].rect.top) ; - iIndexEnd++) - /* intentionally blank */; + iIndexEnd++) + /* intentionally blank */; - /* - * we need to justify these tabs so they fill the whole given - * client area - * - */ - /* find the amount of space remaining on this row */ - widthDiff = clientRect.right - (2 * SELECTED_TAB_OFFSET) - - infoPtr->items[iIndexEnd - 1].rect.right; + /* + * we need to justify these tabs so they fill the whole given + * client area + * + */ + /* find the amount of space remaining on this row */ + widthDiff = clientRect.right - (2 * SELECTED_TAB_OFFSET) - + infoPtr->items[iIndexEnd - 1].rect.right; - /* iCount is the number of tab items on this row */ - iCount = iIndexEnd - iIndexStart; + /* iCount is the number of tab items on this row */ + iCount = iIndexEnd - iIndexStart; - - if (iCount > 1) - { - remainder = widthDiff % iCount; - widthDiff = widthDiff / iCount; - /* add widthDiff/iCount, or extra space/items on row, to each item on this row */ - for (iIndex=iIndexStart,iCount=0; iIndex < iIndexEnd; - iIndex++,iCount++) - { - infoPtr->items[iIndex].rect.left += iCount * widthDiff; - infoPtr->items[iIndex].rect.right += (iCount + 1) * widthDiff; + if (iCount > 1) + { + remainder = widthDiff % iCount; + widthDiff = widthDiff / iCount; + /* add widthDiff/iCount, or extra space/items on row, to each item on this row */ + for (iIndex=iIndexStart, iCount=0; iIndex < iIndexEnd; iIndex++, iCount++) + { + infoPtr->items[iIndex].rect.left += iCount * widthDiff; + infoPtr->items[iIndex].rect.right += (iCount + 1) * widthDiff; TRACE("adjusting 1 <%s>, l,r=%ld,%ld\n", debugstr_w(infoPtr->items[iIndex].pszText), infoPtr->items[iIndex].rect.left, infoPtr->items[iIndex].rect.right); - } - infoPtr->items[iIndex - 1].rect.right += remainder; - } - else /* we have only one item on this row, make it take up the entire row */ - { - infoPtr->items[iIndexStart].rect.left = clientRect.left; - infoPtr->items[iIndexStart].rect.right = clientRect.right - 4; + } + infoPtr->items[iIndex - 1].rect.right += remainder; + } + else /* we have only one item on this row, make it take up the entire row */ + { + infoPtr->items[iIndexStart].rect.left = clientRect.left; + infoPtr->items[iIndexStart].rect.right = clientRect.right - 4; - TRACE("adjusting 2 <%s>, l,r=%ld,%ld\n", - debugstr_w(infoPtr->items[iIndexStart].pszText), - infoPtr->items[iIndexStart].rect.left, - infoPtr->items[iIndexStart].rect.right); + TRACE("adjusting 2 <%s>, l,r=%ld,%ld\n", + debugstr_w(infoPtr->items[iIndexStart].pszText), + infoPtr->items[iIndexStart].rect.left, + infoPtr->items[iIndexStart].rect.right); - } + } - iIndexStart = iIndexEnd; - } + iIndexStart = iIndexEnd; + } } } @@ -1865,9 +1886,12 @@ static void TAB_DrawItem( RECT rUD, rC; /* Clip UpDown control to not draw over it */ - GetWindowRect(hwnd, &rC); - GetWindowRect(infoPtr->hwndUpDown, &rUD); - ExcludeClipRect(hdc, rUD.left - rC.left, rUD.top - rC.top, rUD.right - rC.left, rUD.bottom - rC.top); + if (infoPtr->needsScrolling) + { + GetWindowRect(hwnd, &rC); + GetWindowRect(infoPtr->hwndUpDown, &rUD); + ExcludeClipRect(hdc, rUD.left - rC.left, rUD.top - rC.top, rUD.right - rC.left, rUD.bottom - rC.top); + } /* If you need to see what the control is doing, * then override these variables. They will change what From f3b3a68770a35b00bb18e50513a255fed7bd061a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Tue, 17 Feb 2004 22:39:49 +0000 Subject: [PATCH 0066/1463] Sync with Wine-20040213: Huw Davies <huw@codeweavers.com> Only redraw button in PressButton and Indeterminate if its state has changed. Huw Davies <huw@codeweavers.com> Honour TB_SETMAXTEXTROWS. Ulrich Czekalla <ulrich@codeweavers.com> Add support for BTNS_WHOLEDROPDOWN. Populate button rect when sending TBN_DROPDOWN. Dmitry Timoshkov <dmitry@codeweavers.com> Add partial support for some undocumented toolbar messages. Huw Davies <huw@codeweavers.com> TB_ADDBUTTONS can pass a string ptr instead of an index. TB_GETBUTTONINFO only returns a string if it's not in the internal string list. Huw Davies <huw@codeweavers.com> Use the BTNS_* toolbar button style defines rather than the outdated TBSTYLE_*. Huw Davies <huw@codeweavers.com> Add a missing return. Jon Griffiths <jon_p_griffiths@yahoo.com> Draw disabled toolbar buttons correctly. svn path=/trunk/; revision=8234 --- reactos/lib/comctl32/toolbar.c | 272 +++++++++++++++++++++------------ 1 file changed, 175 insertions(+), 97 deletions(-) diff --git a/reactos/lib/comctl32/toolbar.c b/reactos/lib/comctl32/toolbar.c index 8c1c67ea331..73d5cf3133c 100644 --- a/reactos/lib/comctl32/toolbar.c +++ b/reactos/lib/comctl32/toolbar.c @@ -497,7 +497,7 @@ TOOLBAR_DrawFlatSeparator (LPRECT lpRect, HDC hdc, TOOLBAR_INFO *infoPtr) /*********************************************************************** * TOOLBAR_DrawDDFlatSeparator * -* This function draws the separator that was flaged as TBSTYLE_DROPDOWN. +* This function draws the separator that was flaged as BTNS_DROPDOWN. * In this case, the separator is a pixel high line of COLOR_BTNSHADOW, * followed by a pixel high line of COLOR_BTNHIGHLIGHT. These separators * are horizontal as opposed to the vertical separators for not dropdown @@ -614,39 +614,51 @@ TOOLBAR_DrawPattern (HDC hdc, LPRECT lpRect) } -static void -TOOLBAR_DrawMasked (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, - HDC hdc, INT x, INT y) +static void TOOLBAR_DrawMasked(TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, + HDC hdc, INT x, INT y) { HIMAGELIST himl = GETDEFIMAGELIST(infoPtr, 0); - INT cx, cy; - HBITMAP hbmMask; - HDC hdcMask; - if (!himl) - return; + if (himl) + { + INT cx, cy; + HBITMAP hbmMask, hbmImage; + HDC hdcMask, hdcImage; - ImageList_GetIconSize(himl, &cx, &cy); + ImageList_GetIconSize(himl, &cx, &cy); - /* create new dc's */ - hdcMask = CreateCompatibleDC (0); + /* Create src image */ + hdcImage = CreateCompatibleDC(hdc); + hbmImage = CreateBitmap(cx, cy, GetDeviceCaps(hdc,PLANES), + GetDeviceCaps(hdc,BITSPIXEL), NULL); + SelectObject(hdcImage, hbmImage); + ImageList_DrawEx(himl, btnPtr->iBitmap, hdcImage, 0, 0, cx, cy, + RGB(0xff, 0xff, 0xff), RGB(0,0,0), ILD_NORMAL); - /* create new bitmap */ - hbmMask = CreateBitmap (cx, cy, 1, 1, NULL); - SelectObject (hdcMask, hbmMask); + /* Create Mask */ + hdcMask = CreateCompatibleDC(0); + hbmMask = CreateBitmap(cx, cy, 1, 1, NULL); + SelectObject(hdcMask, hbmMask); - /* copy the mask bitmap */ - ImageList_DrawEx(himl, btnPtr->iBitmap, hdcMask, 0, 0, 0, 0, RGB(255, 255, 255), RGB(0, 0, 0), ILD_MASK); + /* Remove the background and all white pixels */ + SetBkColor(hdcImage, ImageList_GetBkColor(himl)); + BitBlt(hdcMask, 0, 0, cx, cy, hdcImage, 0, 0, SRCCOPY); + SetBkColor(hdcImage, RGB(0xff, 0xff, 0xff)); + BitBlt(hdcMask, 0, 0, cx, cy, hdcImage, 0, 0, NOTSRCERASE); - /* draw the new mask */ - SelectObject (hdc, GetSysColorBrush (COLOR_3DHILIGHT)); - BitBlt (hdc, x+1, y+1, cx, cy, hdcMask, 0, 0, 0xB8074A); + /* draw the new mask 'etched' to hdc */ + SetBkColor(hdc, RGB(255, 255, 255)); + SelectObject(hdc, GetSysColorBrush(COLOR_3DHILIGHT)); + BitBlt(hdc, x + 1, y + 1, cx, cy, hdcMask, 0, 0, 0xE20746); + SelectObject(hdc, GetSysColorBrush(COLOR_3DSHADOW)); + BitBlt(hdc, x, y, cx, cy, hdcMask, 0, 0, 0xE20746); - SelectObject (hdc, GetSysColorBrush (COLOR_3DSHADOW)); - BitBlt (hdc, x, y, cx, cy, hdcMask, 0, 0, 0xB8074A); - - DeleteObject (hbmMask); - DeleteDC (hdcMask); + /* Cleanup */ + DeleteObject(hbmImage); + DeleteDC(hdcImage); + DeleteObject (hbmMask); + DeleteDC(hdcMask); + } } @@ -672,8 +684,11 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) { TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); - BOOL hasDropDownArrow = TOOLBAR_HasDropDownArrows(infoPtr->dwExStyle) && - (btnPtr->fsStyle & TBSTYLE_DROPDOWN); + BOOL hasDropDownArrow = (TOOLBAR_HasDropDownArrows(infoPtr->dwExStyle) && + (btnPtr->fsStyle & BTNS_DROPDOWN)) || + (btnPtr->fsStyle & BTNS_WHOLEDROPDOWN); + BOOL drawSepDropDownArrow = hasDropDownArrow && + (~btnPtr->fsStyle & BTNS_WHOLEDROPDOWN); RECT rc, rcArrow, rcBitmap, rcText, rcFill; LPWSTR lpText = NULL; NMTBCUSTOMDRAW tbcd; @@ -693,11 +708,17 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) if (hasDropDownArrow) { + int right; + if (dwStyle & TBSTYLE_FLAT) - rc.right = max(rc.left, rc.right - DDARROW_WIDTH); + right = max(rc.left, rc.right - DDARROW_WIDTH); else - rc.right = max(rc.left, rc.right - DDARROW_WIDTH - 2); - rcArrow.left = rc.right; + right = max(rc.left, rc.right - DDARROW_WIDTH - 2); + + if (drawSepDropDownArrow) + rc.right = right; + + rcArrow.left = right; } /* copy text rect after adjusting for drop-down arrow @@ -733,7 +754,7 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) * I changed it. IE4 "Links" toolbar would not * draw correctly with the original code. - GA 8/01 * ((dwStyle & TBSTYLE_LIST) && - * ((btnPtr->fsStyle & TBSTYLE_AUTOSIZE) == 0) && + * ((btnPtr->fsStyle & BTNS_AUTOSIZE) == 0) && * (btnPtr->iBitmap != I_IMAGENONE)) */ if (dwStyle & TBSTYLE_LIST) { @@ -810,19 +831,19 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) FillRect( hdc, &rcFill, GetSysColorBrush(COLOR_BTNFACE)); /* separator */ - if (btnPtr->fsStyle & TBSTYLE_SEP) { + if (btnPtr->fsStyle & BTNS_SEP) { /* with the FLAT style, iBitmap is the width and has already */ /* been taken into consideration in calculating the width */ /* so now we need to draw the vertical separator */ /* empirical tests show that iBitmap can/will be non-zero */ /* when drawing the vertical bar... */ if ((dwStyle & TBSTYLE_FLAT) /* && (btnPtr->iBitmap == 0) */) { - if (btnPtr->fsStyle & TBSTYLE_DROPDOWN) + if (btnPtr->fsStyle & BTNS_DROPDOWN) TOOLBAR_DrawDDFlatSeparator (&rc, hdc, btnPtr, infoPtr); else TOOLBAR_DrawFlatSeparator (&rc, hdc, infoPtr); } - else if (btnPtr->fsStyle != TBSTYLE_SEP) { + else if (btnPtr->fsStyle != BTNS_SEP) { FIXME("Draw some kind of separator: fsStyle=%x\n", btnPtr->fsStyle); } @@ -858,7 +879,7 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) { DrawEdge (hdc, &rc, EDGE_RAISED, BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST); - if (hasDropDownArrow) + if (drawSepDropDownArrow) DrawEdge (hdc, &rcArrow, EDGE_RAISED, BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST); } @@ -879,7 +900,7 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) goto FINALNOTIFY; } - /* pressed TBSTYLE_BUTTON */ + /* pressed BTNS_BUTTON */ if (tbcd.nmcd.uItemState & CDIS_SELECTED) { offset = (infoPtr->dwItemCDFlag & TBCDRF_NOOFFSET) ? 0 : 1; if (!(infoPtr->dwItemCDFlag & TBCDRF_NOEDGES)) @@ -887,13 +908,13 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) if (dwStyle & TBSTYLE_FLAT) { DrawEdge (hdc, &rc, BDR_SUNKENOUTER, BF_RECT | BF_ADJUST); - if (hasDropDownArrow) + if (drawSepDropDownArrow) DrawEdge (hdc, &rcArrow, BDR_SUNKENOUTER, BF_RECT | BF_ADJUST); } else { DrawEdge (hdc, &rc, EDGE_SUNKEN, BF_RECT | BF_MIDDLE | BF_ADJUST); - if (hasDropDownArrow) + if (drawSepDropDownArrow) DrawEdge (hdc, &rcArrow, EDGE_SUNKEN, BF_RECT | BF_MIDDLE | BF_ADJUST); } } @@ -910,9 +931,9 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) goto FINALNOTIFY; } - /* checked TBSTYLE_CHECK */ + /* checked BTNS_CHECK */ if ((tbcd.nmcd.uItemState & CDIS_CHECKED) && - (btnPtr->fsStyle & TBSTYLE_CHECK)) { + (btnPtr->fsStyle & BTNS_CHECK)) { if (!(infoPtr->dwItemCDFlag & TBCDRF_NOEDGES)) { if (dwStyle & TBSTYLE_FLAT) @@ -977,7 +998,7 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) if (hasDropDownArrow) { - if (!(infoPtr->dwItemCDFlag & TBCDRF_NOEDGES)) + if (drawSepDropDownArrow && !(infoPtr->dwItemCDFlag & TBCDRF_NOEDGES)) DrawEdge (hdc, &rcArrow, EDGE_RAISED, BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST); TOOLBAR_DrawArrow(hdc, rcArrow.left, rcArrow.top + (rcArrow.bottom - rcArrow.top - ARROW_HEIGHT) / 2, COLOR_WINDOWFRAME); @@ -1084,7 +1105,7 @@ TOOLBAR_Refresh (HWND hwnd, HDC hdc, PAINTSTRUCT* ps) * prefix characters as M$ likes to call them). The prefix character * indicates where the underline goes, except for the string "&&" which * is reduced to a single "&". GetTextExtentPoint does not process these -* only DrawText does. Note that the TBSTYLE_NOPREFIX is handled here. +* only DrawText does. Note that the BTNS_NOPREFIX is handled here. */ static void TOOLBAR_MeasureString(TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, @@ -1112,7 +1133,7 @@ TOOLBAR_MeasureString(TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, /* Use DrawText to get true size as drawn (less pesky "&") */ DrawTextW (hdc, lpText, -1, &myrect, DT_VCENTER | DT_SINGLELINE | - DT_CALCRECT | ((btnPtr->fsStyle & TBSTYLE_NOPREFIX) ? + DT_CALCRECT | ((btnPtr->fsStyle & BTNS_NOPREFIX) ? DT_NOPREFIX : 0)); /* feed back to caller */ @@ -1143,6 +1164,9 @@ TOOLBAR_CalcStrings (HWND hwnd, LPSIZE lpSize) lpSize->cx = 0; lpSize->cy = 0; + if(infoPtr->nMaxTextRows == 0) + return; + hdc = GetDC (hwnd); hOldFont = SelectObject (hdc, infoPtr->hFont); @@ -1221,10 +1245,10 @@ TOOLBAR_WrapToolbar( HWND hwnd, DWORD dwStyle ) /* it is the actual width of the separator. This is used for */ /* custom controls in toolbars. */ /* */ - /* TBSTYLE_DROPDOWN separators are treated as buttons for */ + /* BTNS_DROPDOWN separators are treated as buttons for */ /* width. - GA 8/01 */ - if ((btnPtr[i].fsStyle & TBSTYLE_SEP) && - !(btnPtr[i].fsStyle & TBSTYLE_DROPDOWN)) + if ((btnPtr[i].fsStyle & BTNS_SEP) && + !(btnPtr[i].fsStyle & BTNS_DROPDOWN)) cx = (btnPtr[i].iBitmap > 0) ? btnPtr[i].iBitmap : SEPARATOR_WIDTH; else @@ -1234,9 +1258,9 @@ TOOLBAR_WrapToolbar( HWND hwnd, DWORD dwStyle ) /* The first separator in a group should be wrapped to the */ /* next row if the previous wrapping is on a button. */ if( bButtonWrap && - (btnPtr[i].fsStyle & TBSTYLE_SEP) && + (btnPtr[i].fsStyle & BTNS_SEP) && (i + 1 < infoPtr->nNumButtons ) && - (btnPtr[i + 1].fsStyle & TBSTYLE_SEP) ) + (btnPtr[i + 1].fsStyle & BTNS_SEP) ) { TRACE("wrap point 1 btn %d style %02x\n", i, btnPtr[i].fsStyle); btnPtr[i].fsState |= TBSTATE_WRAP; @@ -1258,8 +1282,8 @@ TOOLBAR_WrapToolbar( HWND hwnd, DWORD dwStyle ) /* If the current button is a separator and not hidden, */ /* go to the next until it reaches a non separator. */ /* Wrap the last separator if it is before a button. */ - while( ( ((btnPtr[i].fsStyle & TBSTYLE_SEP) && - !(btnPtr[i].fsStyle & TBSTYLE_DROPDOWN)) || + while( ( ((btnPtr[i].fsStyle & BTNS_SEP) && + !(btnPtr[i].fsStyle & BTNS_DROPDOWN)) || (btnPtr[i].fsState & TBSTATE_HIDDEN) ) && i < infoPtr->nNumButtons ) { @@ -1284,7 +1308,7 @@ TOOLBAR_WrapToolbar( HWND hwnd, DWORD dwStyle ) /* separator and wrap it. */ for ( j = i - 1; j >= 0 && !(btnPtr[j].fsState & TBSTATE_WRAP); j--) { - if ((btnPtr[j].fsStyle & TBSTYLE_SEP) && + if ((btnPtr[j].fsStyle & BTNS_SEP) && !(btnPtr[j].fsState & TBSTATE_HIDDEN)) { bFound = TRUE; @@ -1327,7 +1351,7 @@ TOOLBAR_WrapToolbar( HWND hwnd, DWORD dwStyle ) btnPtr[i].fsState |= TBSTATE_WRAP; bFound = TRUE; x = infoPtr->nIndent; - if (btnPtr[i].fsStyle & TBSTYLE_SEP ) + if (btnPtr[i].fsStyle & BTNS_SEP ) bButtonWrap = FALSE; else bButtonWrap = TRUE; @@ -1394,13 +1418,13 @@ TOOLBAR_CalcToolbar (HWND hwnd) else infoPtr->nButtonHeight = sizeString.cy + 6; } - else if (infoPtr->nButtonHeight < infoPtr->nBitmapHeight + 6) + else infoPtr->nButtonHeight = infoPtr->nBitmapHeight + 6; if (sizeString.cx > infoPtr->nBitmapWidth) infoPtr->nButtonWidth = sizeString.cx + 6; - else if (infoPtr->nButtonWidth < infoPtr->nBitmapWidth + 6) - infoPtr->nButtonWidth = infoPtr->nBitmapWidth + 6; + else + infoPtr->nButtonWidth = infoPtr->nBitmapWidth + 6; } if ( infoPtr->cxMin >= 0 && infoPtr->nButtonWidth < infoPtr->cxMin ) @@ -1464,8 +1488,8 @@ TOOLBAR_CalcToolbar (HWND hwnd) /* UNDOCUMENTED: If a separator has a non zero bitmap index, */ /* it is the actual width of the separator. This is used for */ /* custom controls in toolbars. */ - if (btnPtr->fsStyle & TBSTYLE_SEP) { - if (btnPtr->fsStyle & TBSTYLE_DROPDOWN) { + if (btnPtr->fsStyle & BTNS_SEP) { + if (btnPtr->fsStyle & BTNS_DROPDOWN) { cy = (btnPtr->iBitmap > 0) ? btnPtr->iBitmap : SEPARATOR_WIDTH; cx = infoPtr->nButtonWidth; @@ -1477,7 +1501,7 @@ TOOLBAR_CalcToolbar (HWND hwnd) else { if ((infoPtr->dwExStyle & TBSTYLE_EX_MIXEDBUTTONS) || - (btnPtr->fsStyle & TBSTYLE_AUTOSIZE)) + (btnPtr->fsStyle & BTNS_AUTOSIZE)) { SIZE sz; HDC hdc; @@ -1507,7 +1531,7 @@ TOOLBAR_CalcToolbar (HWND hwnd) else cx = infoPtr->nButtonWidth; - if (hasDropDownArrows && (btnPtr->fsStyle & TBSTYLE_DROPDOWN)) + if ((hasDropDownArrows && (btnPtr->fsStyle & BTNS_DROPDOWN)) || (btnPtr->fsStyle & BTNS_WHOLEDROPDOWN)) cx += DDARROW_WIDTH; } if (btnPtr->fsState & TBSTATE_WRAP ) @@ -1523,7 +1547,7 @@ TOOLBAR_CalcToolbar (HWND hwnd) infoPtr->rcBound.bottom = y + cy; /* Set the toolTip only for non-hidden, non-separator button */ - if (infoPtr->hwndToolTip && !(btnPtr->fsStyle & TBSTYLE_SEP )) + if (infoPtr->hwndToolTip && !(btnPtr->fsStyle & BTNS_SEP )) { TTTOOLINFOA ti; @@ -1546,14 +1570,14 @@ TOOLBAR_CalcToolbar (HWND hwnd) if( bWrap ) { - if ( !(btnPtr->fsStyle & TBSTYLE_SEP) ) + if ( !(btnPtr->fsStyle & BTNS_SEP) ) y += cy; else { /* UNDOCUMENTED: If a separator has a non zero bitmap index, */ /* it is the actual width of the separator. This is used for */ /* custom controls in toolbars. */ - if ( !(btnPtr->fsStyle & TBSTYLE_DROPDOWN)) + if ( !(btnPtr->fsStyle & BTNS_DROPDOWN)) y += cy + ( (btnPtr->iBitmap > 0 ) ? btnPtr->iBitmap : SEPARATOR_WIDTH) * 2 /3; else @@ -1613,7 +1637,7 @@ TOOLBAR_InternalHitTest (HWND hwnd, LPPOINT lpPt) if (btnPtr->fsState & TBSTATE_HIDDEN) continue; - if (btnPtr->fsStyle & TBSTYLE_SEP) { + if (btnPtr->fsStyle & BTNS_SEP) { if (PtInRect (&btnPtr->rect, *lpPt)) { TRACE(" ON SEPARATOR %d!\n", i); return -i; @@ -1666,7 +1690,7 @@ TOOLBAR_GetCheckedGroupButtonIndex (TOOLBAR_INFO *infoPtr, INT nIndex) /* check index button */ btnPtr = &infoPtr->buttons[nIndex]; - if ((btnPtr->fsStyle & TBSTYLE_CHECKGROUP) == TBSTYLE_CHECKGROUP) { + if ((btnPtr->fsStyle & BTNS_CHECKGROUP) == BTNS_CHECKGROUP) { if (btnPtr->fsState & TBSTATE_CHECKED) return nIndex; } @@ -1675,7 +1699,7 @@ TOOLBAR_GetCheckedGroupButtonIndex (TOOLBAR_INFO *infoPtr, INT nIndex) nRunIndex = nIndex - 1; while (nRunIndex >= 0) { btnPtr = &infoPtr->buttons[nRunIndex]; - if ((btnPtr->fsStyle & TBSTYLE_CHECKGROUP) == TBSTYLE_CHECKGROUP) { + if ((btnPtr->fsStyle & BTNS_CHECKGROUP) == BTNS_CHECKGROUP) { if (btnPtr->fsState & TBSTATE_CHECKED) return nRunIndex; } @@ -1688,7 +1712,7 @@ TOOLBAR_GetCheckedGroupButtonIndex (TOOLBAR_INFO *infoPtr, INT nIndex) nRunIndex = nIndex + 1; while (nRunIndex < infoPtr->nNumButtons) { btnPtr = &infoPtr->buttons[nRunIndex]; - if ((btnPtr->fsStyle & TBSTYLE_CHECKGROUP) == TBSTYLE_CHECKGROUP) { + if ((btnPtr->fsStyle & BTNS_CHECKGROUP) == BTNS_CHECKGROUP) { if (btnPtr->fsState & TBSTATE_CHECKED) return nRunIndex; } @@ -1766,7 +1790,7 @@ TOOLBAR_CustomizeDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { btnInfo = (PCUSTOMBUTTON)Alloc(sizeof(CUSTOMBUTTON)); memset (&btnInfo->btn, 0, sizeof(TBBUTTON)); - btnInfo->btn.fsStyle = TBSTYLE_SEP; + btnInfo->btn.fsStyle = BTNS_SEP; btnInfo->bVirtual = FALSE; LoadStringW (COMCTL32_hModule, IDS_SEPARATOR, btnInfo->text, 64); @@ -1780,7 +1804,7 @@ TOOLBAR_CustomizeDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) /* insert separator button into 'available buttons' list */ btnInfo = (PCUSTOMBUTTON)Alloc(sizeof(CUSTOMBUTTON)); memset (&btnInfo->btn, 0, sizeof(TBBUTTON)); - btnInfo->btn.fsStyle = TBSTYLE_SEP; + btnInfo->btn.fsStyle = BTNS_SEP; btnInfo->bVirtual = FALSE; btnInfo->bRemovable = TRUE; LoadStringW (COMCTL32_hModule, IDS_SEPARATOR, btnInfo->text, 64); @@ -1828,7 +1852,7 @@ TOOLBAR_CustomizeDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) } memcpy (&btnInfo->btn, &nmtb.tbButton, sizeof(TBBUTTON)); - if (!(nmtb.tbButton.fsStyle & TBSTYLE_SEP)) + if (!(nmtb.tbButton.fsStyle & BTNS_SEP)) { if (lstrlenW(nmtb.pszText)) lstrcpyW(btnInfo->text, nmtb.pszText); @@ -1847,7 +1871,7 @@ TOOLBAR_CustomizeDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) /* append 'virtual' separator button to the 'toolbar buttons' list */ btnInfo = (PCUSTOMBUTTON)Alloc(sizeof(CUSTOMBUTTON)); memset (&btnInfo->btn, 0, sizeof(TBBUTTON)); - btnInfo->btn.fsStyle = TBSTYLE_SEP; + btnInfo->btn.fsStyle = BTNS_SEP; btnInfo->bVirtual = TRUE; btnInfo->bRemovable = FALSE; LoadStringW (COMCTL32_hModule, IDS_SEPARATOR, btnInfo->text, 64); @@ -2017,7 +2041,7 @@ TOOLBAR_CustomizeDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) SendMessageA (custInfo->tbHwnd, TB_DELETEBUTTON, index, 0); /* insert into 'available button' list */ - if (!(btnInfo->btn.fsStyle & TBSTYLE_SEP)) + if (!(btnInfo->btn.fsStyle & BTNS_SEP)) { index = (int)SendDlgItemMessageA (hwnd, IDC_AVAILBTN_LBOX, LB_ADDSTRING, 0, 0); SendDlgItemMessageA (hwnd, IDC_AVAILBTN_LBOX, LB_SETITEMDATA, index, (LPARAM)btnInfo); @@ -2164,7 +2188,7 @@ TOOLBAR_CustomizeDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) DrawEdge (lpdis->hDC, &rcButton, EDGE_RAISED, BF_RECT|BF_MIDDLE|BF_SOFT); /* draw image and text */ - if ((btnInfo->btn.fsStyle & TBSTYLE_SEP) == 0) { + if ((btnInfo->btn.fsStyle & BTNS_SEP) == 0) { HIMAGELIST himl = GETDEFIMAGELIST(infoPtr, GETHIMLID(infoPtr, btnInfo->btn.iBitmap)); ImageList_Draw (himl, GETIBITMAP(infoPtr, btnInfo->btn.iBitmap), @@ -2461,10 +2485,13 @@ TOOLBAR_AddButtonsA (HWND hwnd, WPARAM wParam, LPARAM lParam) btnPtr->fsState = lpTbb[nCount].fsState; btnPtr->fsStyle = lpTbb[nCount].fsStyle; btnPtr->dwData = lpTbb[nCount].dwData; - btnPtr->iString = lpTbb[nCount].iString; + if(HIWORD(lpTbb[nCount].iString) && lpTbb[nCount].iString != -1) + Str_SetPtrAtoW ((LPWSTR*)&btnPtr->iString, (LPSTR)lpTbb[nCount].iString ); + else + btnPtr->iString = lpTbb[nCount].iString; btnPtr->bHot = FALSE; - if ((infoPtr->hwndToolTip) && !(btnPtr->fsStyle & TBSTYLE_SEP)) { + if ((infoPtr->hwndToolTip) && !(btnPtr->fsStyle & BTNS_SEP)) { TTTOOLINFOA ti; ZeroMemory (&ti, sizeof(TTTOOLINFOA)); @@ -2525,10 +2552,13 @@ TOOLBAR_AddButtonsW (HWND hwnd, WPARAM wParam, LPARAM lParam) btnPtr->fsState = lpTbb[nCount].fsState; btnPtr->fsStyle = lpTbb[nCount].fsStyle; btnPtr->dwData = lpTbb[nCount].dwData; - btnPtr->iString = lpTbb[nCount].iString; + if(HIWORD(lpTbb[nCount].iString) && lpTbb[nCount].iString != -1) + Str_SetPtrW ((LPWSTR*)&btnPtr->iString, (LPWSTR)lpTbb[nCount].iString ); + else + btnPtr->iString = lpTbb[nCount].iString; btnPtr->bHot = FALSE; - if ((infoPtr->hwndToolTip) && !(btnPtr->fsStyle & TBSTYLE_SEP)) { + if ((infoPtr->hwndToolTip) && !(btnPtr->fsStyle & BTNS_SEP)) { TTTOOLINFOW ti; ZeroMemory (&ti, sizeof(TTTOOLINFOW)); @@ -2869,7 +2899,7 @@ TOOLBAR_CheckButton (HWND hwnd, WPARAM wParam, LPARAM lParam) btnPtr = &infoPtr->buttons[nIndex]; - if (!(btnPtr->fsStyle & TBSTYLE_CHECK)) + if (!(btnPtr->fsStyle & BTNS_CHECK)) return FALSE; bChecked = (btnPtr->fsState & TBSTATE_CHECKED) ? TRUE : FALSE; @@ -2877,7 +2907,7 @@ TOOLBAR_CheckButton (HWND hwnd, WPARAM wParam, LPARAM lParam) if (LOWORD(lParam) == FALSE) btnPtr->fsState &= ~TBSTATE_CHECKED; else { - if (btnPtr->fsStyle & TBSTYLE_GROUP) { + if (btnPtr->fsStyle & BTNS_GROUP) { nOldIndex = TOOLBAR_GetCheckedGroupButtonIndex (infoPtr, nIndex); if (nOldIndex == nIndex) @@ -2962,7 +2992,7 @@ TOOLBAR_DeleteButton (HWND hwnd, WPARAM wParam, LPARAM lParam) return FALSE; if ((infoPtr->hwndToolTip) && - !(infoPtr->buttons[nIndex].fsStyle & TBSTYLE_SEP)) { + !(infoPtr->buttons[nIndex].fsStyle & BTNS_SEP)) { TTTOOLINFOA ti; ZeroMemory (&ti, sizeof(TTTOOLINFOA)); @@ -3135,10 +3165,16 @@ TOOLBAR_GetButtonInfoA (HWND hwnd, WPARAM wParam, LPARAM lParam) lpTbInfo->fsState = btnPtr->fsState; if (lpTbInfo->dwMask & TBIF_STYLE) lpTbInfo->fsStyle = btnPtr->fsStyle; - if (lpTbInfo->dwMask & TBIF_TEXT) { - LPWSTR lpText = TOOLBAR_GetText(infoPtr,btnPtr); - Str_GetPtrWtoA (lpText, lpTbInfo->pszText,lpTbInfo->cchText); - } + if (lpTbInfo->dwMask & TBIF_TEXT) { + /* TB_GETBUTTONINFO doesn't retrieve text from the string list, so we + can't use TOOLBAR_GetText here */ + LPWSTR lpText; + if (HIWORD(btnPtr->iString) && (btnPtr->iString != -1)) { + lpText = (LPWSTR)btnPtr->iString; + Str_GetPtrWtoA (lpText, lpTbInfo->pszText,lpTbInfo->cchText); + } else + lpTbInfo->pszText[0] = '\0'; + } return nIndex; } @@ -3181,8 +3217,14 @@ TOOLBAR_GetButtonInfoW (HWND hwnd, WPARAM wParam, LPARAM lParam) if (lpTbInfo->dwMask & TBIF_STYLE) lpTbInfo->fsStyle = btnPtr->fsStyle; if (lpTbInfo->dwMask & TBIF_TEXT) { - LPWSTR lpText = TOOLBAR_GetText(infoPtr,btnPtr); - Str_GetPtrW (lpText,lpTbInfo->pszText,lpTbInfo->cchText); + /* TB_GETBUTTONINFO doesn't retrieve text from the string list, so we + can't use TOOLBAR_GetText here */ + LPWSTR lpText; + if (HIWORD(btnPtr->iString) && (btnPtr->iString != -1)) { + lpText = (LPWSTR)btnPtr->iString; + Str_GetPtrW (lpText,lpTbInfo->pszText,lpTbInfo->cchText); + } else + lpTbInfo->pszText[0] = '\0'; } return nIndex; @@ -3509,18 +3551,21 @@ TOOLBAR_Indeterminate (HWND hwnd, WPARAM wParam, LPARAM lParam) TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); TBUTTON_INFO *btnPtr; INT nIndex; + DWORD oldState; nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE); if (nIndex == -1) return FALSE; btnPtr = &infoPtr->buttons[nIndex]; + oldState = btnPtr->fsState; if (LOWORD(lParam) == FALSE) btnPtr->fsState &= ~TBSTATE_INDETERMINATE; else btnPtr->fsState |= TBSTATE_INDETERMINATE; - InvalidateRect(hwnd, &btnPtr->rect, TOOLBAR_HasText(infoPtr, btnPtr)); + if(oldState != btnPtr->fsState) + InvalidateRect(hwnd, &btnPtr->rect, TOOLBAR_HasText(infoPtr, btnPtr)); return TRUE; } @@ -3596,7 +3641,7 @@ TOOLBAR_InsertButtonA (HWND hwnd, WPARAM wParam, LPARAM lParam) else infoPtr->buttons[nIndex].iString = lpTbb->iString; - if ((infoPtr->hwndToolTip) && !(lpTbb->fsStyle & TBSTYLE_SEP)) { + if ((infoPtr->hwndToolTip) && !(lpTbb->fsStyle & BTNS_SEP)) { TTTOOLINFOA ti; ZeroMemory (&ti, sizeof(TTTOOLINFOA)); @@ -3696,7 +3741,7 @@ TOOLBAR_InsertButtonW (HWND hwnd, WPARAM wParam, LPARAM lParam) else infoPtr->buttons[nIndex].iString = lpTbb->iString; - if ((infoPtr->hwndToolTip) && !(lpTbb->fsStyle & TBSTYLE_SEP)) { + if ((infoPtr->hwndToolTip) && !(lpTbb->fsStyle & BTNS_SEP)) { TTTOOLINFOW ti; ZeroMemory (&ti, sizeof(TTTOOLINFOW)); @@ -3825,18 +3870,21 @@ TOOLBAR_PressButton (HWND hwnd, WPARAM wParam, LPARAM lParam) TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); TBUTTON_INFO *btnPtr; INT nIndex; + DWORD oldState; nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE); if (nIndex == -1) return FALSE; btnPtr = &infoPtr->buttons[nIndex]; + oldState = btnPtr->fsState; if (LOWORD(lParam) == FALSE) btnPtr->fsState &= ~TBSTATE_PRESSED; else btnPtr->fsState |= TBSTATE_PRESSED; - InvalidateRect(hwnd, &btnPtr->rect, TOOLBAR_HasText(infoPtr, btnPtr)); + if(oldState != btnPtr->fsState) + InvalidateRect(hwnd, &btnPtr->rect, TOOLBAR_HasText(infoPtr, btnPtr)); return TRUE; } @@ -4419,6 +4467,7 @@ TOOLBAR_SetMaxTextRows (HWND hwnd, WPARAM wParam, LPARAM lParam) infoPtr->nMaxTextRows = (INT)wParam; + TOOLBAR_CalcToolbar(hwnd); return TRUE; } @@ -4604,6 +4653,11 @@ TOOLBAR_SetVersion (HWND hwnd, INT iVersion) return iOldVersion; } +static LRESULT TOOLBAR_Unkwn45D(HWND hwnd, WPARAM wParam, LPARAM lParam) +{ + FIXME("hwnd=%p wParam %08x lParam %08lx stub!\n", hwnd, wParam, lParam); + return 0; +} /*********************************************************************/ /* */ @@ -4657,6 +4711,13 @@ TOOLBAR_Unkwn45E (HWND hwnd, WPARAM wParam, LPARAM lParam) return (LRESULT)nOldHotItem; } +static LRESULT TOOLBAR_Unkwn460(HWND hwnd, WPARAM wParam, LPARAM lParam) +{ + TRACE("hwnd=%p wParam %08x lParam %08lx\n", hwnd, wParam, lParam); + + InvalidateRect(hwnd, NULL, TRUE); + return 0; +} static LRESULT TOOLBAR_Unkwn463 (HWND hwnd, WPARAM wParam, LPARAM lParam) @@ -4687,7 +4748,6 @@ TOOLBAR_Unkwn463 (HWND hwnd, WPARAM wParam, LPARAM lParam) RECT rc; HWND hwndParent = GetParent(hwnd); - InvalidateRect(hwnd, 0, 1); GetWindowRect(hwnd, &rc); MapWindowPoints(0, hwndParent, (LPPOINT)&rc, 2); TRACE("mapped to (%ld,%ld)-(%ld,%ld)\n", @@ -4713,6 +4773,14 @@ TOOLBAR_Unkwn463 (HWND hwnd, WPARAM wParam, LPARAM lParam) return 1; } +static LRESULT TOOLBAR_Unkwn464(HWND hwnd, WPARAM wParam, LPARAM lParam) +{ + TRACE("hwnd=%p wParam %08x lParam %08lx\n", hwnd, wParam, lParam); + + InvalidateRect(hwnd, NULL, TRUE); + return 1; +} + static LRESULT TOOLBAR_Create (HWND hwnd, WPARAM wParam, LPARAM lParam) @@ -4963,9 +5031,11 @@ TOOLBAR_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam) arrowRect.left = max(btnPtr->rect.left, btnPtr->rect.right - DDARROW_WIDTH); /* for EX_DRAWDDARROWS style, click must be in the drop-down arrow rect */ - if ((btnPtr->fsState & TBSTATE_ENABLED) && (btnPtr->fsStyle & TBSTYLE_DROPDOWN) && - ((TOOLBAR_HasDropDownArrows(infoPtr->dwExStyle) && PtInRect(&arrowRect, pt)) || - (!TOOLBAR_HasDropDownArrows(infoPtr->dwExStyle)))) + if ((btnPtr->fsState & TBSTATE_ENABLED) && + ((btnPtr->fsStyle & BTNS_WHOLEDROPDOWN) || + ((btnPtr->fsStyle & BTNS_DROPDOWN) && + ((TOOLBAR_HasDropDownArrows(infoPtr->dwExStyle) && PtInRect(&arrowRect, pt)) || + (!TOOLBAR_HasDropDownArrows(infoPtr->dwExStyle)))))) { LRESULT res; /* @@ -4979,7 +5049,7 @@ TOOLBAR_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam) memset(&nmtb.tbButton, 0, sizeof(TBBUTTON)); nmtb.cchText = 0; nmtb.pszText = 0; - memset(&nmtb.rcButton, 0, sizeof(RECT)); + CopyRect(&nmtb.rcButton, &btnPtr->rect); res = TOOLBAR_SendNotify ((NMHDR *) &nmtb, infoPtr, TBN_DROPDOWN); if (res != TBDDRET_TREATPRESSED) @@ -5046,8 +5116,8 @@ TOOLBAR_LButtonUp (HWND hwnd, WPARAM wParam, LPARAM lParam) btnPtr = &infoPtr->buttons[infoPtr->nButtonDown]; btnPtr->fsState &= ~TBSTATE_PRESSED; - if (btnPtr->fsStyle & TBSTYLE_CHECK) { - if (btnPtr->fsStyle & TBSTYLE_GROUP) { + if (btnPtr->fsStyle & BTNS_CHECK) { + if (btnPtr->fsStyle & BTNS_GROUP) { nOldIndex = TOOLBAR_GetCheckedGroupButtonIndex (infoPtr, nHit); if (nOldIndex == nHit) @@ -5936,12 +6006,20 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case TB_SETUNICODEFORMAT: return TOOLBAR_SetUnicodeFormat (hwnd, wParam, lParam); + case TB_UNKWN45D: + return TOOLBAR_Unkwn45D(hwnd, wParam, lParam); + case TB_UNKWN45E: return TOOLBAR_Unkwn45E (hwnd, wParam, lParam); + case TB_UNKWN460: + return TOOLBAR_Unkwn460(hwnd, wParam, lParam); + case TB_UNKWN463: return TOOLBAR_Unkwn463 (hwnd, wParam, lParam); + case TB_UNKWN464: + return TOOLBAR_Unkwn464(hwnd, wParam, lParam); /* Common Control Messages */ @@ -6011,7 +6089,7 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) return TOOLBAR_Notify (hwnd, wParam, lParam); case WM_NOTIFYFORMAT: - TOOLBAR_NotifyFormatFake (hwnd, wParam, lParam); + return TOOLBAR_NotifyFormatFake (hwnd, wParam, lParam); case WM_PAINT: return TOOLBAR_Paint (hwnd, wParam); From a8d545f53b1fc15d5e9f666e5c5dcd4ee3bdd269 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Tue, 17 Feb 2004 22:40:47 +0000 Subject: [PATCH 0067/1463] Sync with Wine-20040213: Huw Davies <huw@codeweavers.com> Fix a TRACE. svn path=/trunk/; revision=8235 --- reactos/lib/comctl32/treeview.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/comctl32/treeview.c b/reactos/lib/comctl32/treeview.c index 1c1caec0c77..41147d3f4de 100644 --- a/reactos/lib/comctl32/treeview.c +++ b/reactos/lib/comctl32/treeview.c @@ -1203,7 +1203,7 @@ TREEVIEW_InsertItemT(TREEVIEW_INFO *infoPtr, const TVINSERTSTRUCTW *ptdi, BOOL i TRACE("parent %p position %p: %s\n", parentItem, insertAfter, (tvItem->mask & TVIF_TEXT) ? ((tvItem->pszText == LPSTR_TEXTCALLBACKW) ? "<callback>" - : debugstr_w(tvItem->pszText)) + : (isW ? debugstr_w(tvItem->pszText) : debugstr_a((LPSTR)tvItem->pszText))) : "<no label>"); newItem = TREEVIEW_AllocateItem(infoPtr); From 9b03fed40e2cfddeb2b8c6b9262429cb304500e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Tue, 17 Feb 2004 23:00:01 +0000 Subject: [PATCH 0068/1463] Sync with Wine-20040213: Robert Shearman <R.J.Shearman@warwick.ac.uk> - CoSetState info should be thread local. - SetErrorInfo should allocate an apartment when no apartment present. Alexandre Julliard Moved a few remaining 16-bit definitions out of the standard headers. svn path=/trunk/; revision=8236 --- reactos/lib/ole32/compobj.c | 70 ++++++++++++++++++++--------- reactos/lib/ole32/compobj_private.h | 9 ++++ reactos/lib/ole32/errorinfo.c | 25 ++++++++--- 3 files changed, 76 insertions(+), 28 deletions(-) diff --git a/reactos/lib/ole32/compobj.c b/reactos/lib/ole32/compobj.c index f21ce78e426..2e6e6db7ff5 100644 --- a/reactos/lib/ole32/compobj.c +++ b/reactos/lib/ole32/compobj.c @@ -184,16 +184,27 @@ static void COM_UninitMTA(void) MTA.oxid = 0; } -static APARTMENT* COM_CreateApartment(DWORD model) +/* creates an apartment structure which stores OLE thread-local + * information. Call with COINIT_UNINITIALIZED to create an apartment + * that will be initialized with a model later. Note: do not call + * with COINIT_UNINITIALIZED if the apartment has already been initialized + * with a different COINIT value */ +APARTMENT* COM_CreateApartment(DWORD model) { APARTMENT *apt; + BOOL create = (NtCurrentTeb()->ReservedForOle == NULL); - apt = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(APARTMENT)); + if (create) + { + apt = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(APARTMENT)); + apt->tid = GetCurrentThreadId(); + DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), + GetCurrentProcess(), &apt->thread, + THREAD_ALL_ACCESS, FALSE, 0); + } + else + apt = NtCurrentTeb()->ReservedForOle; apt->model = model; - apt->tid = GetCurrentThreadId(); - DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), - GetCurrentProcess(), &apt->thread, - THREAD_ALL_ACCESS, FALSE, 0); if (model & COINIT_APARTMENTTHREADED) { /* FIXME: how does windoze create OXIDs? */ apt->oxid = MTA.oxid | GetCurrentThreadId(); @@ -202,14 +213,17 @@ static APARTMENT* COM_CreateApartment(DWORD model) 0, 0, OLE32_hInstance, NULL); InitializeCriticalSection(&apt->cs); } - else { + else if (!(model & COINIT_UNINITIALIZED)) { apt->parent = &MTA; apt->oxid = MTA.oxid; } EnterCriticalSection(&csApartment); - if (apts) apts->prev = apt; - apt->next = apts; - apts = apt; + if (create) + { + if (apts) apts->prev = apt; + apt->next = apts; + apts = apt; + } LeaveCriticalSection(&csApartment); NtCurrentTeb()->ReservedForOle = apt; return apt; @@ -384,8 +398,17 @@ HRESULT WINAPI CoInitializeEx( } apt = NtCurrentTeb()->ReservedForOle; - if (apt && dwCoInit != apt->model) return RPC_E_CHANGED_MODE; - hr = apt ? S_FALSE : S_OK; + if (apt && !(apt->model == COINIT_UNINITIALIZED)) + { + if (dwCoInit != apt->model) + { + WARN("Apartment threading model already initialized with another model\n"); + return RPC_E_CHANGED_MODE; + } + hr = S_FALSE; + } + else + hr = S_OK; /* * Check the lock count. If this is the first time going through the initialize @@ -405,7 +428,7 @@ HRESULT WINAPI CoInitializeEx( RunningObjectTableImpl_Initialize(); } - if (!apt) apt = COM_CreateApartment(dwCoInit); + if (!apt || apt->model == COINIT_UNINITIALIZED) apt = COM_CreateApartment(dwCoInit); InterlockedIncrement(&apt->inits); if (hr == S_OK) NtCurrentTeb()->ReservedForOle = apt; @@ -1861,7 +1884,6 @@ HRESULT WINAPI CoInitializeWOW(DWORD x,DWORD y) { return 0; } -static IUnknown * pUnkState = 0; /* FIXME: thread local */ static int nStatCounter = 0; /* global */ static HMODULE hOleAut32 = 0; /* global */ @@ -1872,11 +1894,13 @@ static HMODULE hOleAut32 = 0; /* global */ */ HRESULT WINAPI CoGetState(IUnknown ** ppv) { + APARTMENT * apt = COM_CurrentInfo(); + FIXME("\n"); - if(pUnkState) { - IUnknown_AddRef(pUnkState); - *ppv = pUnkState; + if(apt && apt->state) { + IUnknown_AddRef(apt->state); + *ppv = apt->state; FIXME("-- %p\n", *ppv); return S_OK; } @@ -1892,6 +1916,10 @@ HRESULT WINAPI CoGetState(IUnknown ** ppv) */ HRESULT WINAPI CoSetState(IUnknown * pv) { + APARTMENT * apt = COM_CurrentInfo(); + + if (!apt) apt = COM_CreateApartment(COINIT_UNINITIALIZED); + FIXME("(%p),stub!\n", pv); if (pv) { @@ -1900,13 +1928,13 @@ HRESULT WINAPI CoSetState(IUnknown * pv) if (nStatCounter == 1) LoadLibraryA("OLEAUT32.DLL"); } - if (pUnkState) { - TRACE("-- release %p now\n", pUnkState); - IUnknown_Release(pUnkState); + if (apt->state) { + TRACE("-- release %p now\n", apt->state); + IUnknown_Release(apt->state); nStatCounter--; if (!nStatCounter) FreeLibrary(hOleAut32); } - pUnkState = pv; + apt->state = pv; return S_OK; } diff --git a/reactos/lib/ole32/compobj_private.h b/reactos/lib/ole32/compobj_private.h index 9ff9258eaf4..b316636c2c9 100644 --- a/reactos/lib/ole32/compobj_private.h +++ b/reactos/lib/ole32/compobj_private.h @@ -35,6 +35,13 @@ #include "winreg.h" #include "winternl.h" +/* Windows maps COINIT values to 0x80 for apartment threaded, 0x140 + * for free threaded, and 0 for uninitialized apartments. There is + * no real advantage in us doing this and certainly no release version + * of an app should be poking around with these flags. So we need a + * special value for uninitialized */ +#define COINIT_UNINITIALIZED 0x100 + /* exported interface */ typedef struct tagXIF { struct tagXIF *next; @@ -96,6 +103,7 @@ typedef struct tagAPARTMENT { LPMESSAGEFILTER filter; /* message filter */ XOBJECT *objs; /* exported objects */ IOBJECT *proxies; /* imported objects */ + LPUNKNOWN state; /* state object (see Co[Get,Set]State) */ LPVOID ErrorInfo; /* thread error info */ } APARTMENT; @@ -217,6 +225,7 @@ static inline APARTMENT* COM_CurrentApt(void) } /* compobj.c */ +APARTMENT* COM_CreateApartment(DWORD model); HWND COM_GetApartmentWin(OXID oxid); #endif /* __WINE_OLE_COMPOBJ_H */ diff --git a/reactos/lib/ole32/errorinfo.c b/reactos/lib/ole32/errorinfo.c index e9256cd6ffc..a946f4516d0 100644 --- a/reactos/lib/ole32/errorinfo.c +++ b/reactos/lib/ole32/errorinfo.c @@ -484,13 +484,20 @@ HRESULT WINAPI CreateErrorInfo(ICreateErrorInfo **pperrinfo) */ HRESULT WINAPI GetErrorInfo(ULONG dwReserved, IErrorInfo **pperrinfo) { - TRACE("(%ld, %p, %p): stub:\n", dwReserved, pperrinfo, COM_CurrentInfo()->ErrorInfo); + APARTMENT * apt = COM_CurrentInfo(); - if(! pperrinfo ) return E_INVALIDARG; - if(!(*pperrinfo = (IErrorInfo*)(COM_CurrentInfo()->ErrorInfo))) return S_FALSE; + TRACE("(%ld, %p, %p)\n", dwReserved, pperrinfo, COM_CurrentInfo()->ErrorInfo); + if(!pperrinfo) return E_INVALIDARG; + if (!apt || !apt->ErrorInfo) + { + *pperrinfo = NULL; + return S_FALSE; + } + + *pperrinfo = (IErrorInfo*)(apt->ErrorInfo); /* clear thread error state */ - COM_CurrentInfo()->ErrorInfo = NULL; + apt->ErrorInfo = NULL; return S_OK; } @@ -500,14 +507,18 @@ HRESULT WINAPI GetErrorInfo(ULONG dwReserved, IErrorInfo **pperrinfo) HRESULT WINAPI SetErrorInfo(ULONG dwReserved, IErrorInfo *perrinfo) { IErrorInfo * pei; - TRACE("(%ld, %p): stub:\n", dwReserved, perrinfo); + APARTMENT * apt = COM_CurrentInfo(); + + TRACE("(%ld, %p)\n", dwReserved, perrinfo); + + if (!apt) apt = COM_CreateApartment(COINIT_UNINITIALIZED); /* release old errorinfo */ - pei = (IErrorInfo*)COM_CurrentInfo()->ErrorInfo; + pei = (IErrorInfo*)apt->ErrorInfo; if(pei) IErrorInfo_Release(pei); /* set to new value */ - COM_CurrentInfo()->ErrorInfo = perrinfo; + apt->ErrorInfo = perrinfo; if(perrinfo) IErrorInfo_AddRef(perrinfo); return S_OK; } From 503a4764b19eeda1b21c9abd797bee59930719fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Tue, 17 Feb 2004 23:01:19 +0000 Subject: [PATCH 0069/1463] Sync with Wine-20040213: Troy Rollo <wine@troy.rollo.name> Added documentation for DocFiles, based on the CorVu implementation of DocFiles. svn path=/trunk/; revision=8237 --- reactos/lib/ole32/storage.c | 218 ++++++++++++++++++++++++++++++++++++ 1 file changed, 218 insertions(+) diff --git a/reactos/lib/ole32/storage.c b/reactos/lib/ole32/storage.c index 75522120fcd..2f753ad6712 100644 --- a/reactos/lib/ole32/storage.c +++ b/reactos/lib/ole32/storage.c @@ -101,6 +101,224 @@ static void _create_istream16(LPSTREAM16 *str); #define IMPLEMENTED 1 +/* The following is taken from the CorVu implementation of docfiles, and + * documents things about the file format that are not implemented here, and + * not documented by the LAOLA project. The CorVu implementation was posted + * to wine-devel in February 2004, and released under the LGPL at the same + * time. Because that implementation is in C++, it's not directly usable in + * Wine, but does have documentation value. + * + * + * #define DF_EXT_VTOC -4 + * #define DF_VTOC_VTOC -3 + * #define DF_VTOC_EOF -2 + * #define DF_VTOC_FREE -1 + * #define DF_NAMELEN 0x20 // Maximum entry name length - 31 characters plus + * // a NUL terminator + * + * #define DF_FT_STORAGE 1 + * #define DF_FT_STREAM 2 + * #define DF_FT_LOCKBYTES 3 // Not used -- How the bloody hell did I manage + * #define DF_FT_PROPERTY 4 // Not Used -- to figure these two out? + * #define DF_FT_ROOT 5 + * + * #define DF_BLOCK_SIZE 0x200 + * #define DF_VTOC_SIZE 0x80 + * #define DF_DE_PER_BLOCK 4 + * #define DF_STREAM_BLOCK_SIZE 0x40 + * + * A DocFile is divided into blocks of 512 bytes. + * The first block contains the header. + * + * The file header contains The first 109 entries in the VTOC of VTOCs. + * + * Each block pointed to by a VTOC of VTOCs contains a VTOC, which + * includes block chains - just like FAT. This is a somewhat poor + * design for the following reasons: + * + * 1. FAT was a poor file system design to begin with, and + * has long been known to be horrendously inefficient + * for day to day operations. + * + * 2. The problem is compounded here, since the file + * level streams are generally *not* read sequentially. + * This means that a significant percentage of reads + * require seeking from the start of the chain. + * + * Data chains also contain an internal VTOC. The block size for + * the standard VTOC is 512. The block size for the internal VTOC + * is 64. + * + * Now, the 109 blocks in the VTOC of VTOCs allows for files of + * up to around 7MB. So what do you think happens if that's + * exceeded? Well, there's an entry in the header block which + * points to the first block used as additional storage for + * the VTOC of VTOCs. + * + * Now we can get up to around 15MB. Now, guess how the file + * format adds in another block to the VTOC of VTOCs. Come on, + * it's no big surprise. That's right - the last entry in each + * block extending the VTOC of VTOCs is, you guessed it, the + * block number of the next block containing an extension to + * the VTOC of VTOCs. The VTOC of VTOCs is chained!!!! + * + * So, to review: + * + * 1. If you are using a FAT file system, the location of + * your file's blocks is stored in chains. + * + * 2. At the abstract level, the file contains a VTOC of VTOCs, + * which is stored in the most inefficient possible format for + * random access - a chain (AKA list). + * + * 3. The VTOC of VTOCs contains descriptions of three file level + * streams: + * + * a. The Directory stream + * b. The Data stream + * c. The Data VTOC stream + * + * These are, of course, represented as chains. + * + * 4. The Data VTOC contains data describing the chains of blocks + * within the Data stream. + * + * That's right - we have a total of four levels of block chains! + * + * Now, is that complicated enough for you? No? OK, there's another + * complication. If an individual stream (ie. an IStream) reaches + * 4096 bytes in size, it gets moved from the Data Stream to + * a new file level stream. Now, if the stream then gets truncated + * back to less than 4096 bytes, it returns to the data stream. + * + * The effect of using this format can be seen very easily. Pick + * an arbitrary application with a grid data representation that + * can export to both Lotus 123 and Excel 5 or higher. Export + * a large file to Lotus 123 and time it. Export the same thing + * to Excel 5 and time that. The difference is the inefficiency + * of the Microsoft DocFile format. + * + * + * #define TOTAL_SIMPLE_VTOCS 109 + * + * struct DocFile_Header + * { + * df_byte iMagic1; // 0xd0 + * df_byte iMagic2; // 0xcf + * df_byte iMagic3; // 0x11 + * df_byte iMagic4; // 0xe0 - Spells D0CF11E0, or DocFile + * df_byte iMagic5; // 161 (igi upside down) + * df_byte iMagic6; // 177 (lli upside down - see below + * df_byte iMagic7; // 26 (gz upside down) + * df_byte iMagic8; // 225 (szz upside down) - see below + * df_int4 aiUnknown1[4]; + * df_int4 iVersion; // DocFile Version - 0x03003E + * df_int4 aiUnknown2[4]; + * df_int4 nVTOCs; // Number of VTOCs + * df_int4 iFirstDirBlock; // First Directory Block + * df_int4 aiUnknown3[2]; + * df_int4 iFirstDataVTOC; // First data VTOC block + * df_int4 iHasData; // 1 if there is data in the file - yes, this is important + * df_int4 iExtendedVTOC; // Extended VTOC location + * df_int4 iExtendedVTOCSize; // Size of extended VTOC (+1?) + * df_int4 aiVTOCofVTOCs[TOTAL_SIMPLE_VTOCS]; + * }; + * + * struct DocFile_VTOC + * { + * df_int4 aiBlocks[DF_VTOC_SIZE]; + * }; + * + * + * The meaning of the magic numbers + * + * 0xd0cf11e0 is DocFile with a zero on the end (sort of) + * + * If you key 177161 into a calculator, then turn the calculator + * upside down, you get igilli, which may be a reference to + * somebody's name, or to the Hebrew word for "angel". + * + * If you key 26225 into a calculator, then turn it upside down, you + * get szzgz. Microsoft has a tradition of creating nonsense words + * using the letters s, g, z and y. We think szzgz may be one of the + * Microsoft placeholder variables, along the lines of foo, bar and baz. + * Alternatively, it could be 22526, which would be gzszz. + * + * + * struct DocFile_DirEnt + * { + * df_char achEntryName[DF_NAMELEN]; // Entry Name + * df_int2 iNameLen; // Name length in bytes, including NUL terminator + * df_byte iFileType; // Entry type + * df_byte iColour; // 1 = Black, 0 = Red + * df_int4 iLeftSibling; // Next Left Sibling Entry - See below + * df_int4 iRightSibling; // Next Right Sibling Entry + * df_int4 iFirstChild; // First Child Entry + * df_byte achClassID[16]; // Class ID + * df_int4 iStateBits; // [GS]etStateBits value + * df_int4 iCreatedLow; // Low DWORD of creation time + * df_int4 iCreatedHigh; // High DWORD of creation time + * df_int4 iModifiedLow; // Low DWORD of modification time + * df_int4 iModifiedHigh; // High DWORD of modification time + * df_int4 iVTOCPosition; // VTOC Position + * df_int4 iFileSize; // Size of the stream + * df_int4 iZero; // We think this is part of the 64 bit stream size - must be 0 + * }; + * + * Siblings + * ======== + * + * Siblings are stored in an obscure but incredibly elegant + * data structure called a red-black tree. This is generally + * defined as a 2-3-4 tree stored in a binary tree. + * + * A red-black tree can always be balanced very easily. The rules + * for a red-black tree are as follows: + * + * 1. The root node is always black. + * 2. The parent of a red node is always black. + * + * There is a Java demo of red-black trees at: + * + * http://langevin.usc.edu/BST/RedBlackTree-Example.html + * + * This demo is an excellent tool for learning how red-black + * trees work, without having to go through the process of + * learning how they were derived. + * + * Within the tree, elements are ordered by the length of the + * name and within that, ASCII order by name. This causes the + * apparently bizarre reordering you see when you use dfview. + * + * This is a somewhat bizarre choice. It suggests that the + * designer of the DocFile format was trying to optimise + * searching through the directory entries. However searching + * through directory entries is a relatively rare operation. + * Reading and seeking within a stream are much more common + * operations, especially within the file level streams, yet + * these use the horrendously inefficient FAT chains. + * + * This suggests that the designer was probably somebody + * fresh out of university, who had some basic knowledge of + * basic data structures, but little knowledge of anything + * more practical. It is bizarre to attempt to optimise + * directory searches while not using a more efficient file + * block locating system than FAT (seedling/sapling/tree + * would result in a massive improvement - in fact we have + * an alternative to DocFiles that we use internally that + * uses seedling/sapling/tree and *is* far more efficient). + * + * It is worth noting that the MS implementation of red-black + * trees is incorrect (I can tell you're surprised) and + * actually causes more operations to occur than are really + * needed. Fortunately the fact that our implementation is + * correct will not cause any problems - the MS implementation + * still appears to cause the tree to satisfy the rules, albeit + * a sequence of the same insertions in the different + * implementations may result in a different, and possibly + * deeper (but never shallower) tree. + */ + /****************************************************************************** * STORAGE_get_big_block [Internal] From b7ee835601521cdf65576f366eccdd6605a5b8de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Tue, 17 Feb 2004 23:09:05 +0000 Subject: [PATCH 0070/1463] Sync with Wine-20040213 svn path=/trunk/; revision=8238 --- reactos/lib/richedit/winehq2ros.patch | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/reactos/lib/richedit/winehq2ros.patch b/reactos/lib/richedit/winehq2ros.patch index e69de29bb2d..4d5c3f3dc7e 100644 --- a/reactos/lib/richedit/winehq2ros.patch +++ b/reactos/lib/richedit/winehq2ros.patch @@ -0,0 +1,27 @@ +Index: reader.c +=================================================================== +RCS file: /home/wine/wine/dlls/richedit/reader.c,v +retrieving revision 1.13 +diff -u -r1.13 reader.c +--- reader.c 30 Jan 2004 22:56:33 -0000 1.13 ++++ reader.c 17 Feb 2004 23:16:04 -0000 +@@ -126,11 +126,17 @@ + { + char buff[10]; + long pcb; +- info->editstream.pfnCallback(info->editstream.dwCookie, buff, 1, &pcb); ++ info->editstream.pfnCallback(info->editstream.dwCookie, buff, sizeof(buff), &pcb); + if(pcb == 0) + return EOF; + else +- CHARLIST_Enqueue(&info->inputCharList, buff[0]); ++ { ++ int i; ++ for (i = 0; i < pcb; i++) ++ { ++ CHARLIST_Enqueue(&info->inputCharList, buff[i]); ++ } ++ } + } + myChar = CHARLIST_Dequeue(&info->inputCharList); + return (int) myChar; From faf755d78e6830a99b7fefebc39aec5a94510d88 Mon Sep 17 00:00:00 2001 From: Mike Nordell <tamlin@algonet.se> Date: Tue, 17 Feb 2004 23:58:54 +0000 Subject: [PATCH 0071/1463] Remove not needed specific-compiler compile-time warning. svn path=/trunk/; revision=8239 --- reactos/ntoskrnl/mm/mminit.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 759bc0f663a..4242a46ad4e 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -1,4 +1,4 @@ -/* $Id: mminit.c,v 1.59 2003/12/31 05:33:04 jfilby Exp $ +/* $Id: mminit.c,v 1.60 2004/02/17 23:58:54 tamlin Exp $ * * COPYRIGHT: See COPYING in the top directory * PROJECT: ReactOS kernel @@ -41,11 +41,6 @@ extern unsigned int _init_end__; extern unsigned int _bss_end__; -#if defined(_MSC_VER) - -#pragma message("This will never work until we somehow fix these!") - -#endif static BOOLEAN IsThisAnNtAsSystem = FALSE; static MM_SYSTEM_SIZE MmSystemSize = MmSmallSystem; From d406d24f2974141600f47c931755a4d35b650e59 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Wed, 18 Feb 2004 00:01:59 +0000 Subject: [PATCH 0072/1463] correct comments svn path=/trunk/; revision=8242 --- reactos/subsys/system/explorer/shell/filechild.cpp | 3 ++- reactos/subsys/system/explorer/shell/mainframe.cpp | 4 +--- reactos/subsys/system/explorer/utility/window.cpp | 5 +++-- reactos/subsys/system/explorer/utility/window.h | 2 +- reactos/subsys/system/explorer/winefile/winefile.c | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/reactos/subsys/system/explorer/shell/filechild.cpp b/reactos/subsys/system/explorer/shell/filechild.cpp index 171cc676a6e..28ca0572140 100644 --- a/reactos/subsys/system/explorer/shell/filechild.cpp +++ b/reactos/subsys/system/explorer/shell/filechild.cpp @@ -365,7 +365,8 @@ void FileChildWindow::resize_children(int cx, int cy) if (_left_hwnd) hdwp = DeferWindowPos(hdwp, _left_hwnd, 0, rt.left, rt.top, _split_pos-SPLIT_WIDTH/2-rt.left, rt.bottom-rt.top, SWP_NOZORDER|SWP_NOACTIVATE); - hdwp = DeferWindowPos(hdwp, _right_hwnd, 0, rt.left+cx+1, rt.top, rt.right-cx, rt.bottom-rt.top, SWP_NOZORDER|SWP_NOACTIVATE); + if (_right_hwnd) + hdwp = DeferWindowPos(hdwp, _right_hwnd, 0, rt.left+cx+1, rt.top, rt.right-cx, rt.bottom-rt.top, SWP_NOZORDER|SWP_NOACTIVATE); EndDeferWindowPos(hdwp); } diff --git a/reactos/subsys/system/explorer/shell/mainframe.cpp b/reactos/subsys/system/explorer/shell/mainframe.cpp index be209339d0b..9db46e270c7 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.cpp +++ b/reactos/subsys/system/explorer/shell/mainframe.cpp @@ -666,8 +666,6 @@ int MainFrame::Command(int id, int code) void MainFrame::resize_frame_rect(PRECT prect) { - int new_top; - if (IsWindowVisible(_htoolbar)) { SendMessage(_htoolbar, WM_SIZE, 0, 0); ClientRect rt(_htoolbar); @@ -678,7 +676,7 @@ void MainFrame::resize_frame_rect(PRECT prect) if (IsWindowVisible(_hdrivebar)) { SendMessage(_hdrivebar, WM_SIZE, 0, 0); ClientRect rt(_hdrivebar); - new_top = --prect->top + rt.bottom+3; + int new_top = --prect->top + rt.bottom+3; MoveWindow(_hdrivebar, 0, prect->top, rt.right, new_top, TRUE); prect->top = new_top; // prect->bottom -= rt.bottom+2; diff --git a/reactos/subsys/system/explorer/utility/window.cpp b/reactos/subsys/system/explorer/utility/window.cpp index 54a0f69d8c7..1a3d6d1bfad 100644 --- a/reactos/subsys/system/explorer/utility/window.cpp +++ b/reactos/subsys/system/explorer/utility/window.cpp @@ -503,7 +503,7 @@ LRESULT ChildWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) void ChildWindow::resize_children(int cx, int cy) { - HDWP hdwp = BeginDeferWindowPos(4); + HDWP hdwp = BeginDeferWindowPos(2); RECT rt; rt.left = 0; @@ -520,7 +520,8 @@ void ChildWindow::resize_children(int cx, int cy) cx = 0; } - hdwp = DeferWindowPos(hdwp, _right_hwnd, 0, rt.left+cx+1, rt.top, rt.right-cx, rt.bottom-rt.top, SWP_NOZORDER|SWP_NOACTIVATE); + if (_right_hwnd) + hdwp = DeferWindowPos(hdwp, _right_hwnd, 0, rt.left+cx+1, rt.top, rt.right-cx, rt.bottom-rt.top, SWP_NOZORDER|SWP_NOACTIVATE); EndDeferWindowPos(hdwp); } diff --git a/reactos/subsys/system/explorer/utility/window.h b/reactos/subsys/system/explorer/utility/window.h index 836406eacc1..c5493be0513 100644 --- a/reactos/subsys/system/explorer/utility/window.h +++ b/reactos/subsys/system/explorer/utility/window.h @@ -265,7 +265,7 @@ struct IconWindowClass : public WindowClass #define COLOR_SPLITBAR LTGRAY_BRUSH - /// menu info structure for MDI child windows + /// menu info structure struct MenuInfo { HMENU _hMenuView; diff --git a/reactos/subsys/system/explorer/winefile/winefile.c b/reactos/subsys/system/explorer/winefile/winefile.c index 6cf39b26b96..e7839e625d1 100644 --- a/reactos/subsys/system/explorer/winefile/winefile.c +++ b/reactos/subsys/system/explorer/winefile/winefile.c @@ -3670,7 +3670,7 @@ void explorer_show_frame(HWND hwndParent, int cmdshow) for(p=Globals.drives; *p; ) { #ifdef _NO_EXTENSIONS - /* insert drive letter */ + /* insert drive letter */ TCHAR b[3] = {tolower(*p)}; SendMessage(Globals.hdrivebar, TB_ADDSTRING, 0, (LPARAM)b); #endif From 14f2cc4e3b6037bdd85eb5ce9906781e0f114f53 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III <royce3@ev1.net> Date: Wed, 18 Feb 2004 02:37:18 +0000 Subject: [PATCH 0073/1463] fix bug in NtGdiExtEscape - not checking for NULL == DriverFunctions.Escape. also added buffer copying. svn path=/trunk/; revision=8243 --- reactos/subsys/win32k/objects/print.c | 131 ++++++++++++++++++++++---- 1 file changed, 112 insertions(+), 19 deletions(-) diff --git a/reactos/subsys/win32k/objects/print.c b/reactos/subsys/win32k/objects/print.c index e7d1d7f19ff..41435daefe9 100644 --- a/reactos/subsys/win32k/objects/print.c +++ b/reactos/subsys/win32k/objects/print.c @@ -16,13 +16,15 @@ * 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.12 2004/02/08 16:16:24 navaraf Exp $ */ +/* $Id: print.c,v 1.13 2004/02/18 02:37:18 royce Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> #include <ddk/ntddk.h> #include <win32k/print.h> #include <win32k/dc.h> +#include <include/error.h> +#include <internal/safe.h> #define NDEBUG #include <win32k/debug1.h> @@ -59,33 +61,124 @@ NtGdiEscape(HDC hDC, UNIMPLEMENTED; } -INT STDCALL -NtGdiExtEscape( - HDC hDC, - INT Escape, - INT InSize, - LPCSTR InData, - INT OutSize, - LPSTR OutData) +INT +STDCALL +IntEngExtEscape( + HSURF Surface, + INT Escape, + INT InSize, + LPVOID InData, + INT OutSize, + LPVOID OutData) { - PDC pDC = DC_LockDc(hDC); - INT Result; + UNIMPLEMENTED; + return -1; +} - if (pDC == NULL) +INT +STDCALL +IntGdiExtEscape( + PDC dc, + INT Escape, + INT InSize, + LPCSTR InData, + INT OutSize, + LPSTR OutData) +{ + if ( NULL == dc->DriverFunctions.Escape ) { + return IntEngExtEscape( + dc->Surface, + Escape, + InSize, + (PVOID)InData, + OutSize, + (PVOID)OutData); + } + else + { + return dc->DriverFunctions.Escape( + dc->Surface, + Escape, + InSize, + (PVOID)InData, + OutSize, + (PVOID)OutData ); + } +} + +INT +STDCALL +NtGdiExtEscape( + HDC hDC, + INT Escape, + INT InSize, + LPCSTR UnsafeInData, + INT OutSize, + LPSTR UnsafeOutData) +{ + PDC pDC = DC_LockDc(hDC); + LPVOID SafeInData = NULL; + LPVOID SafeOutData = NULL; + NTSTATUS Status; + INT Result; + + if ( pDC == NULL ) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); return -1; } - Result = pDC->DriverFunctions.Escape( - pDC->Surface, - Escape, - InSize, - (PVOID)InData, - OutSize, - (PVOID)OutData); + if ( InSize && UnsafeInData ) + { + SafeInData = ExAllocatePool ( NonPagedPool, InSize ); + if ( !SafeInData ) + { + DC_UnlockDc(hDC); + SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); + return -1; + } + Status = MmCopyFromCaller ( SafeInData, UnsafeInData, InSize ); + if ( !NT_SUCCESS(Status) ) + { + ExFreePool ( SafeInData ); + DC_UnlockDc(hDC); + SetLastNtError(Status); + return -1; + } + } + + if ( OutSize && UnsafeOutData ) + { + SafeOutData = ExAllocatePool ( NonPagedPool, OutSize ); + if ( !SafeOutData ) + { + if ( SafeInData ) + ExFreePool ( SafeInData ); + DC_UnlockDc(hDC); + SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); + return -1; + } + } + + Result = IntGdiExtEscape ( pDC, Escape, InSize, SafeInData, OutSize, SafeOutData ); DC_UnlockDc(hDC); + if ( SafeInData ) + ExFreePool ( SafeInData ); + + if ( SafeOutData ) + { + Status = MmCopyToCaller ( UnsafeOutData, SafeOutData, OutSize ); + ExFreePool ( SafeOutData ); + if ( !NT_SUCCESS(Status) ) + { + SetLastNtError(Status); + return -1; + } + } + return Result; } From 9cff9f7701576549c32a81ebb35b7fc91dde8ceb Mon Sep 17 00:00:00 2001 From: Richard Campbell <betam4x@gmail.com> Date: Wed, 18 Feb 2004 12:21:57 +0000 Subject: [PATCH 0074/1463] roll back thomas's change, apparently it IS causing the problems, my build system is just being stupid. svn path=/trunk/; revision=8244 --- reactos/subsys/win32k/ntuser/winpos.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index 116d1eb6f6b..60e888422cb 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.89 2004/02/17 17:43:09 weiden Exp $ +/* $Id: winpos.c,v 1.90 2004/02/18 12:21:57 rcampbell Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1246,7 +1246,7 @@ WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, POINT Point, PWINDOW_OBJECT Current; ExAcquireFastMutexUnsafe(&ScopeWin->ChildrenListLock); - Current = ScopeWin->LastChild; + Current = ScopeWin->FirstChild; while (Current) { if (Current->Style & WS_VISIBLE && @@ -1278,7 +1278,7 @@ WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, POINT Point, ExReleaseFastMutexUnsafe(&ScopeWin->ChildrenListLock); return(0); } - Current = Current->PrevSibling; + Current = Current->NextSibling; } ExReleaseFastMutexUnsafe(&ScopeWin->ChildrenListLock); From d0a5ab99481d9cd163db0cb0c0418eae89bbfb1c Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Wed, 18 Feb 2004 13:46:15 +0000 Subject: [PATCH 0075/1463] Patch by Sylvain Petreolle: 'No newline at EOF' warning fix. svn path=/trunk/; revision=8245 --- rosapps/net/telnet/src/tnclass.h | 3 ++- rosapps/net/telnet/src/tnclip.cpp | 3 ++- rosapps/net/telnet/src/tnconfig.cpp | 3 ++- rosapps/net/telnet/src/tnetwork.cpp | 3 ++- rosapps/net/telnet/src/tscript.cpp | 3 ++- rosapps/winfile/format.h | 3 ++- 6 files changed, 12 insertions(+), 6 deletions(-) diff --git a/rosapps/net/telnet/src/tnclass.h b/rosapps/net/telnet/src/tnclass.h index 0cad8131d0c..faab2bf3762 100644 --- a/rosapps/net/telnet/src/tnclass.h +++ b/rosapps/net/telnet/src/tnclass.h @@ -70,4 +70,5 @@ private: void SetLocalAddress(SOCKET s); }; -#endif \ No newline at end of file +#endif + diff --git a/rosapps/net/telnet/src/tnclip.cpp b/rosapps/net/telnet/src/tnclip.cpp index 83fd5b3d117..d957d5ab7a6 100644 --- a/rosapps/net/telnet/src/tnclip.cpp +++ b/rosapps/net/telnet/src/tnclip.cpp @@ -56,4 +56,5 @@ void Tnclip::Paste() { GlobalUnlock(clipboard_data); CloseClipboard(); -} \ No newline at end of file +} + diff --git a/rosapps/net/telnet/src/tnconfig.cpp b/rosapps/net/telnet/src/tnconfig.cpp index 71e007a513b..4440e970867 100644 --- a/rosapps/net/telnet/src/tnconfig.cpp +++ b/rosapps/net/telnet/src/tnconfig.cpp @@ -700,4 +700,5 @@ void TConfig::set_bool(bool *boolval, const char *str) { if(!stricmp(str, "true")) *boolval = true; else if(!stricmp(str, "on")) *boolval = true; else *boolval = (bool)atoi(str); -} \ No newline at end of file +} + diff --git a/rosapps/net/telnet/src/tnetwork.cpp b/rosapps/net/telnet/src/tnetwork.cpp index 9fc0bbb705c..64eed9be358 100644 --- a/rosapps/net/telnet/src/tnetwork.cpp +++ b/rosapps/net/telnet/src/tnetwork.cpp @@ -88,4 +88,5 @@ void TNetwork::do_naws(int width, int height) { void TNetwork::SetLocalAddress(char *buf) { local_address = new char[strlen(buf) + 1]; strcpy(local_address, buf); -} \ No newline at end of file +} + diff --git a/rosapps/net/telnet/src/tscript.cpp b/rosapps/net/telnet/src/tscript.cpp index c81311401ee..2045e43ce17 100644 --- a/rosapps/net/telnet/src/tscript.cpp +++ b/rosapps/net/telnet/src/tscript.cpp @@ -59,4 +59,5 @@ BOOL TScript::processScript (char* data) { void TScript::initScript (char *filename) { if(fp) fclose(fp); fp = fopen(filename, "rt"); -} \ No newline at end of file +} + diff --git a/rosapps/winfile/format.h b/rosapps/winfile/format.h index 2ea3ca79fc5..9427b1b0029 100644 --- a/rosapps/winfile/format.h +++ b/rosapps/winfile/format.h @@ -89,4 +89,5 @@ #if defined (__cplusplus) } #endif - #endif \ No newline at end of file + #endif + From d3753b2d2f194144f40e0d49e959301fe4ea22f8 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Wed, 18 Feb 2004 16:00:56 +0000 Subject: [PATCH 0076/1463] - Attempt to avoid interaction with kernel debugging over serial port. svn path=/trunk/; revision=8246 --- reactos/drivers/input/sermouse/sermouse.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/reactos/drivers/input/sermouse/sermouse.c b/reactos/drivers/input/sermouse/sermouse.c index 9f73ee80630..f1b64e189d5 100644 --- a/reactos/drivers/input/sermouse/sermouse.c +++ b/reactos/drivers/input/sermouse/sermouse.c @@ -11,6 +11,12 @@ #include <ddk/ntddk.h> #include <ddk/ntddmou.h> +/* + * HAL:KdComPortInUse used to prevent detecting mouse on port + * that is occupied by kernel debugger. + */ +ULONG DECLSPEC_IMPORT KdComPortInUse; + /* * Compile time options */ @@ -568,6 +574,10 @@ InitializeMouse(ULONG Port, ULONG Irq, PDRIVER_OBJECT DriverObject) KAFFINITY Affinity; ULONG MouseType; + /* Don't detect mouse on port that is occupied by kernel debugger */ + if (KdComPortInUse == Port) + return FALSE; + /* Try to detect mouse on specified port */ MouseType = DetectMicrosoftMouse(Port); From 0a2bff78f8619edad039bc049f32322413dfc97a Mon Sep 17 00:00:00 2001 From: Casper Hornstrup <chorns@users.sourceforge.net> Date: Wed, 18 Feb 2004 21:29:20 +0000 Subject: [PATCH 0077/1463] 2004-02-18 Casper S. Hornstrup <chorns@users.sourceforge.net> * apistatus.lst: Correct path of videoprt.dll. svn path=/trunk/; revision=8248 --- reactos/ChangeLog | 4 ++++ reactos/apistatus.lst | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/reactos/ChangeLog b/reactos/ChangeLog index bfebd3d0a62..bc76663081d 100644 --- a/reactos/ChangeLog +++ b/reactos/ChangeLog @@ -1,3 +1,7 @@ +2004-02-18 Casper S. Hornstrup <chorns@users.sourceforge.net> + + * apistatus.lst: Correct path of videoprt.dll. + 2004-02-10 Casper S. Hornstrup <chorns@users.sourceforge.net> * bootdata/packages/reactos.dff: Add oleaut32.dll. diff --git a/reactos/apistatus.lst b/reactos/apistatus.lst index d43b238a020..0a755196bbc 100755 --- a/reactos/apistatus.lst +++ b/reactos/apistatus.lst @@ -22,7 +22,7 @@ winmm.dll reactos/lib/winmm winspool.dll reactos/lib/winspool ws2_32.dll reactos/lib/ws2_32 wsock32.dll reactos/lib/wsock32 -videoprt.dll reactos/drivers/dd/videoprt +videoprt.dll reactos/drivers/video/videoprt ndis.sys reactos/drivers/net/ndis tdi.sys reactos/drivers/net/tdi class2.sys reactos/drivers/storage/class2 From 0e77dd590361038b7487f7c6f893af7f0b0d67f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Wed, 18 Feb 2004 23:20:14 +0000 Subject: [PATCH 0078/1463] Patch by Mark Tempel and Ge van Geldorp Check RtlAllocateHeap() return value for 8-byte alignment. svn path=/trunk/; revision=8249 --- reactos/lib/kernel32/mem/global.c | 35 ++++++++++++++++--------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/reactos/lib/kernel32/mem/global.c b/reactos/lib/kernel32/mem/global.c index b12c25b250a..3184b896bf1 100644 --- a/reactos/lib/kernel32/mem/global.c +++ b/reactos/lib/kernel32/mem/global.c @@ -1,4 +1,4 @@ -/* $Id: global.c,v 1.20 2004/01/23 21:16:03 ekohl Exp $ +/* $Id: global.c,v 1.21 2004/02/18 23:20:14 gvg Exp $ * * Win32 Global/Local heap functions (GlobalXXX, LocalXXX). * These functions included in Win32 for compatibility with 16 bit Windows @@ -68,10 +68,6 @@ GlobalAlloc(UINT uFlags, PGLOBAL_HANDLE phandle = 0; PVOID palloc = 0; UINT heap_flags = 0; - /*Fixme: When we are sure all allocations are 8-byte aligned, - **we can remove this hack. - */ - PGLOBAL_HANDLE hack_fix = 0; if (uFlags & GMEM_ZEROINIT) { @@ -83,24 +79,20 @@ GlobalAlloc(UINT uFlags, //Changed hProcessHeap to GetProcessHeap() if ((uFlags & GMEM_MOVEABLE)==0) /* POINTER */ { - return ((HGLOBAL)RtlAllocateHeap(GetProcessHeap(), heap_flags, dwBytes)); + palloc = RtlAllocateHeap(GetProcessHeap(), heap_flags, dwBytes); + if (! ISPOINTER(palloc)) + { + DPRINT1("GlobalAlloced pointer which is not 8-byte aligned\n"); + RtlFreeHeap(GetProcessHeap(), 0, palloc); + return NULL; + } + return (HGLOBAL) palloc; } else /* HANDLE */ { HeapLock(hProcessHeap); phandle = RtlAllocateHeap(GetProcessHeap(), 0, sizeof(GLOBAL_HANDLE)); - /* This little hack is to make sure that we get a pointer with 8-byte - ** alignment. - ** Fixme: When we are sure all allocations are 8-byte aligned, - ** we can remove this hack. - */ - if (ISPOINTER(INTERN_TO_HANDLE(phandle))) - { - hack_fix = RtlAllocateHeap(GetProcessHeap(), 0, sizeof(GLOBAL_HANDLE)); - RtlFreeHeap(GetProcessHeap(), 0, phandle); - phandle = hack_fix; - } if (phandle) { phandle->Magic = MAGIC_GLOBAL_USED; @@ -133,7 +125,16 @@ GlobalAlloc(UINT uFlags, HeapUnlock(hProcessHeap); if (phandle) + { + if (ISPOINTER(INTERN_TO_HANDLE(phandle))) + { + DPRINT1("GlobalAlloced handle which is 8-byte aligned but shouldn't be\n"); + RtlFreeHeap(GetProcessHeap(), 0, palloc); + RtlFreeHeap(GetProcessHeap(), 0, phandle); + return NULL; + } return INTERN_TO_HANDLE(phandle); + } else return (HGLOBAL)0; } From e5d1ab1c0656c959b0e6563bfbed776b8aa3abf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Wed, 18 Feb 2004 23:29:12 +0000 Subject: [PATCH 0079/1463] CVS maintenance svn path=/trunk/; revision=8250 --- reactos/lib/rosrtl/registry/.cvsignore | 2 ++ reactos/lib/rosrtl/string/.cvsignore | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 reactos/lib/rosrtl/registry/.cvsignore create mode 100644 reactos/lib/rosrtl/string/.cvsignore diff --git a/reactos/lib/rosrtl/registry/.cvsignore b/reactos/lib/rosrtl/registry/.cvsignore new file mode 100644 index 00000000000..31dc3078b3a --- /dev/null +++ b/reactos/lib/rosrtl/registry/.cvsignore @@ -0,0 +1,2 @@ +*.d +*.o diff --git a/reactos/lib/rosrtl/string/.cvsignore b/reactos/lib/rosrtl/string/.cvsignore new file mode 100644 index 00000000000..31dc3078b3a --- /dev/null +++ b/reactos/lib/rosrtl/string/.cvsignore @@ -0,0 +1,2 @@ +*.d +*.o From 839f724098726e39e68c560e94ee6434f278fc21 Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Thu, 19 Feb 2004 03:33:33 +0000 Subject: [PATCH 0080/1463] Import from the release branch. svn path=/trunk/; revision=8252 --- reactos/lib/kbdus/kbdus.c | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/lib/kbdus/kbdus.c b/reactos/lib/kbdus/kbdus.c index b648993af28..78cfc2aa202 100644 --- a/reactos/lib/kbdus/kbdus.c +++ b/reactos/lib/kbdus/kbdus.c @@ -266,6 +266,7 @@ ROSDATA VK_TO_WCHARS1 keypad_numbers[] = { { VK_NUMPAD7, 0, '7' }, { VK_NUMPAD8, 0, '8' }, { VK_NUMPAD9, 0, '9' }, + { VK_DECIMAL, 0, '.' }, { VK_BACK, 0, '\010' }, { 0,0 } }; From aa83ce6cde56f76b6a24bc70aba13ca7aefd6b38 Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Thu, 19 Feb 2004 03:45:44 +0000 Subject: [PATCH 0081/1463] Fixed bug 167. svn path=/trunk/; revision=8254 --- reactos/subsys/win32k/ntuser/keyboard.c | 182 ++++++++++++------------ 1 file changed, 94 insertions(+), 88 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/keyboard.c b/reactos/subsys/win32k/ntuser/keyboard.c index 341e4811b24..e325b094e1c 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.21 2003/12/28 14:21:03 weiden Exp $ +/* $Id: keyboard.c,v 1.22 2004/02/19 03:45:44 arty Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -40,6 +40,7 @@ #include <include/error.h> #include <include/object.h> #include <include/winsta.h> +#include <rosrtl/string.h> #define NDEBUG #include <debug.h> @@ -62,7 +63,6 @@ #define KNUMP 0x400 /* Lock the keyboard state to prevent unusual concurrent access */ -/* This really should be a mutex. */ FAST_MUTEX QueueStateLock; BYTE QueueKeyStateTable[256]; @@ -78,6 +78,9 @@ NTSTATUS FASTCALL InitKeyboardImpl(VOID) { /*** Statics used by TranslateMessage ***/ +/*** Shift state code needs to be cleaned up here. Sorry, I let it get out + * of hand. */ + static UINT DontDistinguishShifts( UINT ret ) { if( ret == VK_LSHIFT || ret == VK_RSHIFT ) ret = VK_SHIFT; if( ret == VK_LCONTROL || ret == VK_RCONTROL ) ret = VK_CONTROL; @@ -352,29 +355,29 @@ int STDCALL ToUnicode( UINT wVirtKey, * Returns NTSTATUS. */ -static NTSTATUS ReallyAppendUnicodeString(PUNICODE_STRING ResultFirst, - PUNICODE_STRING Second, - BOOL Deallocate) { - NTSTATUS Status; - PWSTR new_string = - ExAllocatePool(PagedPool, - (ResultFirst->Length + Second->Length + sizeof(WCHAR))); - if( !new_string ) { - return STATUS_NO_MEMORY; - } - memcpy( new_string, ResultFirst->Buffer, - ResultFirst->Length ); - memcpy( new_string + ResultFirst->Length / sizeof(WCHAR), - Second->Buffer, - Second->Length ); - if( Deallocate ) RtlFreeUnicodeString(ResultFirst); - ResultFirst->Length += Second->Length; - ResultFirst->MaximumLength = ResultFirst->Length; - new_string[ResultFirst->Length / sizeof(WCHAR)] = 0; - Status = RtlCreateUnicodeString(ResultFirst,new_string) ? - STATUS_SUCCESS : STATUS_NO_MEMORY; - ExFreePool(new_string); - return Status; +NTSTATUS NTAPI AppendUnicodeString(PUNICODE_STRING ResultFirst, + PUNICODE_STRING Second, + BOOL Deallocate) { + NTSTATUS Status; + PWSTR new_string = + ExAllocatePool(PagedPool, + (ResultFirst->Length + Second->Length + sizeof(WCHAR))); + if( !new_string ) { + return STATUS_NO_MEMORY; + } + memcpy( new_string, ResultFirst->Buffer, + ResultFirst->Length ); + memcpy( new_string + ResultFirst->Length / sizeof(WCHAR), + Second->Buffer, + Second->Length ); + if( Deallocate ) RtlFreeUnicodeString(ResultFirst); + ResultFirst->Length += Second->Length; + ResultFirst->MaximumLength = ResultFirst->Length; + new_string[ResultFirst->Length / sizeof(WCHAR)] = 0; + Status = RtlCreateUnicodeString(ResultFirst,new_string) ? + STATUS_SUCCESS : STATUS_NO_MEMORY; + ExFreePool(new_string); + return Status; } /* @@ -387,66 +390,66 @@ static NTSTATUS ReallyAppendUnicodeString(PUNICODE_STRING ResultFirst, * Returns NTSTATUS */ -static NTSTATUS ReadRegistryValue( PUNICODE_STRING KeyName, - PUNICODE_STRING ValueName, - PUNICODE_STRING ReturnedValue ) { - NTSTATUS Status; - HANDLE KeyHandle; - OBJECT_ATTRIBUTES KeyAttributes; - PKEY_VALUE_PARTIAL_INFORMATION KeyValuePartialInfo; - ULONG Length = 0; - ULONG ResLength = 0; - UNICODE_STRING Temp; - - InitializeObjectAttributes(&KeyAttributes, KeyName, OBJ_CASE_INSENSITIVE, - NULL, NULL); - Status = ZwOpenKey(&KeyHandle, KEY_ALL_ACCESS, &KeyAttributes); - if( !NT_SUCCESS(Status) ) { - return Status; - } - - Status = ZwQueryValueKey(KeyHandle, ValueName, KeyValuePartialInformation, - 0, - 0, - &ResLength); - - if( Status != STATUS_BUFFER_TOO_SMALL ) { - NtClose(KeyHandle); - return Status; - } - - ResLength += sizeof( *KeyValuePartialInfo ); - KeyValuePartialInfo = - ExAllocatePool(PagedPool, ResLength); - Length = ResLength; - - if( !KeyValuePartialInfo ) { - NtClose(KeyHandle); - return STATUS_NO_MEMORY; - } - - Status = ZwQueryValueKey(KeyHandle, ValueName, KeyValuePartialInformation, - (PVOID)KeyValuePartialInfo, - Length, - &ResLength); - - if( !NT_SUCCESS(Status) ) { - NtClose(KeyHandle); +static NTSTATUS NTAPI ReadRegistryValue( PUNICODE_STRING KeyName, + PUNICODE_STRING ValueName, + PUNICODE_STRING ReturnedValue ) { + NTSTATUS Status; + HANDLE KeyHandle; + OBJECT_ATTRIBUTES KeyAttributes; + PKEY_VALUE_PARTIAL_INFORMATION KeyValuePartialInfo; + ULONG Length = 0; + ULONG ResLength = 0; + UNICODE_STRING Temp; + + InitializeObjectAttributes(&KeyAttributes, KeyName, OBJ_CASE_INSENSITIVE, + NULL, NULL); + Status = ZwOpenKey(&KeyHandle, KEY_ALL_ACCESS, &KeyAttributes); + if( !NT_SUCCESS(Status) ) { + return Status; + } + + Status = ZwQueryValueKey(KeyHandle, ValueName, KeyValuePartialInformation, + 0, + 0, + &ResLength); + + if( Status != STATUS_BUFFER_TOO_SMALL ) { + NtClose(KeyHandle); + return Status; + } + + ResLength += sizeof( *KeyValuePartialInfo ); + KeyValuePartialInfo = + ExAllocatePool(PagedPool, ResLength); + Length = ResLength; + + if( !KeyValuePartialInfo ) { + NtClose(KeyHandle); + return STATUS_NO_MEMORY; + } + + Status = ZwQueryValueKey(KeyHandle, ValueName, KeyValuePartialInformation, + (PVOID)KeyValuePartialInfo, + Length, + &ResLength); + + if( !NT_SUCCESS(Status) ) { + NtClose(KeyHandle); + ExFreePool(KeyValuePartialInfo); + return Status; + } + + Temp.Length = Temp.MaximumLength = KeyValuePartialInfo->DataLength; + Temp.Buffer = (PWCHAR)KeyValuePartialInfo->Data; + + /* At this point, KeyValuePartialInfo->Data contains the key data */ + RtlInitUnicodeString(ReturnedValue,L""); + AppendUnicodeString(ReturnedValue,&Temp,FALSE); + ExFreePool(KeyValuePartialInfo); + NtClose(KeyHandle); + return Status; - } - - Temp.Length = Temp.MaximumLength = KeyValuePartialInfo->DataLength; - Temp.Buffer = (PWCHAR)KeyValuePartialInfo->Data; - - /* At this point, KeyValuePartialInfo->Data contains the key data */ - RtlInitUnicodeString(ReturnedValue,L""); - ReallyAppendUnicodeString(ReturnedValue,&Temp,FALSE); - - ExFreePool(KeyValuePartialInfo); - NtClose(KeyHandle); - - return Status; } typedef PVOID (*KbdLayerDescriptor)(VOID); @@ -491,7 +494,7 @@ void InitKbdLayout( PVOID *pkKeyboardLayout ) { L"\\REGISTRY\\Machine\\SYSTEM\\CurrentControlSet" L"\\Control\\KeyboardLayouts\\"); - ReallyAppendUnicodeString(&LayoutKeyName,&DefaultLocale,FALSE); + AppendUnicodeString(&LayoutKeyName,&DefaultLocale,FALSE); RtlFreeUnicodeString(&DefaultLocale); RtlInitUnicodeString(&LayoutValueName,L"Layout File"); @@ -508,7 +511,7 @@ void InitKbdLayout( PVOID *pkKeyboardLayout ) { RtlFreeUnicodeString(&LayoutKeyName); - ReallyAppendUnicodeString(&FullLayoutPath,&LayoutFile,FALSE); + AppendUnicodeString(&FullLayoutPath,&LayoutFile,FALSE); DPRINT("Loading Keyboard DLL %wZ\n", &FullLayoutPath); @@ -963,7 +966,9 @@ VOID FASTCALL W32kKeyProcessMessage(LPMSG Msg, PKBDTABLES KeyboardLayout) { ModifierBits = ModBits(KeyboardLayout,QueueKeyStateTable); /* Get the raw scan code, so we can look up whether the key is a numpad - * key */ + * key + * + * Shift and the LP_EXT_BIT cancel. */ ScanCode = (Msg->lParam >> 16) & 0xff; BaseMapping = Msg->wParam = IntMapVirtualKeyEx( ScanCode, 1, KeyboardLayout ); @@ -971,12 +976,13 @@ VOID FASTCALL W32kKeyProcessMessage(LPMSG Msg, PKBDTABLES KeyboardLayout) { if ((ModifierBits & NUMLOCK_BIT) && !(ModifierBits & GetShiftBit(KeyboardLayout)) && - (RawVk & KNUMP)) + (RawVk & KNUMP) && + !(Msg->lParam & LP_EXT_BIT)) { /* The key in question is a numpad key. Search for a translation. */ for (i = 0; NumpadConversion[i][0]; i++) { - if ((RawVk & 0xff) == NumpadConversion[i][0]) + if ((BaseMapping & 0xff) == NumpadConversion[i][0]) /* RawVk? */ { Msg->wParam = NumpadConversion[i][1]; break; From a8842367375638eb1e5df486ba8ab6387746cb79 Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Thu, 19 Feb 2004 03:51:29 +0000 Subject: [PATCH 0082/1463] Added VK_DECIMAL in numberpad chars. svn path=/trunk/; revision=8257 --- reactos/lib/kbdfr/kbdfr.c | 1 + reactos/lib/kbdgr/kbdgr.c | 1 + reactos/lib/kbdse/kbdse.c | 1 + reactos/lib/kbduk/kbduk.c | 1 + 4 files changed, 4 insertions(+) diff --git a/reactos/lib/kbdfr/kbdfr.c b/reactos/lib/kbdfr/kbdfr.c index 0e174e29cee..dc32fbd4572 100644 --- a/reactos/lib/kbdfr/kbdfr.c +++ b/reactos/lib/kbdfr/kbdfr.c @@ -300,6 +300,7 @@ ROSDATA VK_TO_WCHARS5 key_to_chars_5mod[] = { }; ROSDATA VK_TO_WCHARS1 keypad_numbers[] = { + { VK_DECIMAL, 0, '.' }, { VK_NUMPAD0, 0, '0' }, { VK_NUMPAD1, 0, '1' }, { VK_NUMPAD2, 0, '2' }, diff --git a/reactos/lib/kbdgr/kbdgr.c b/reactos/lib/kbdgr/kbdgr.c index 0aa28e2c2d1..a530e9ab6ae 100644 --- a/reactos/lib/kbdgr/kbdgr.c +++ b/reactos/lib/kbdgr/kbdgr.c @@ -307,6 +307,7 @@ ROSDATA VK_TO_WCHARS5 key_to_chars_5mod[] = { }; ROSDATA VK_TO_WCHARS1 keypad_numbers[] = { + { VK_DECIMAL, 0, '.' }, { VK_NUMPAD0, 0, '0' }, { VK_NUMPAD1, 0, '1' }, { VK_NUMPAD2, 0, '2' }, diff --git a/reactos/lib/kbdse/kbdse.c b/reactos/lib/kbdse/kbdse.c index 0acb4e8c787..9addb8facdb 100644 --- a/reactos/lib/kbdse/kbdse.c +++ b/reactos/lib/kbdse/kbdse.c @@ -310,6 +310,7 @@ ROSDATA VK_TO_WCHARS5 key_to_chars_5mod[] = { }; ROSDATA VK_TO_WCHARS1 keypad_numbers[] = { + { VK_DECIMAL, 0, '.' }, { VK_NUMPAD0, 0, '0' }, { VK_NUMPAD1, 0, '1' }, { VK_NUMPAD2, 0, '2' }, diff --git a/reactos/lib/kbduk/kbduk.c b/reactos/lib/kbduk/kbduk.c index 29bb8341fcf..fd695ec5b1d 100644 --- a/reactos/lib/kbduk/kbduk.c +++ b/reactos/lib/kbduk/kbduk.c @@ -273,6 +273,7 @@ ROSDATA VK_TO_WCHARS6 key_to_chars_6mod[] = { }; ROSDATA VK_TO_WCHARS1 keypad_numbers[] = { + { VK_DECIMAL, 0, '.' }, { VK_NUMPAD0, 0, '0' }, { VK_NUMPAD1, 0, '1' }, { VK_NUMPAD2, 0, '2' }, From 82bad008ac3c08364f9cf4719d01fb7409aed367 Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Thu, 19 Feb 2004 06:59:50 +0000 Subject: [PATCH 0083/1463] Commits for bug 193, merged from release branch. svn path=/trunk/; revision=8259 --- reactos/subsys/csrss/win32csr/conio.c | 61 ++++----- reactos/subsys/win32k/makefile | 4 +- reactos/subsys/win32k/ntuser/keyboard.c | 163 +++++++++++++----------- 3 files changed, 113 insertions(+), 115 deletions(-) diff --git a/reactos/subsys/csrss/win32csr/conio.c b/reactos/subsys/csrss/win32csr/conio.c index 362abf7fa12..5c76ba5c138 100644 --- a/reactos/subsys/csrss/win32csr/conio.c +++ b/reactos/subsys/csrss/win32csr/conio.c @@ -1,4 +1,4 @@ -/* $Id: conio.c,v 1.3 2004/01/11 17:31:16 gvg Exp $ +/* $Id: conio.c,v 1.4 2004/02/19 06:59:50 arty Exp $ * * reactos/subsys/csrss/win32csr/conio.c * @@ -1125,30 +1125,6 @@ ConioGetShiftState(PBYTE KeyState) UINT vk = MapVirtualKeyExW(i, 3, 0) & 0xff; switch(vk) { - case VK_LSHIFT: - case VK_RSHIFT: - case VK_SHIFT: - ssOut |= SHIFT_PRESSED; - break; - - case VK_LCONTROL: - case VK_CONTROL: - ssOut |= LEFT_CTRL_PRESSED; - break; - - case VK_RCONTROL: - ssOut |= RIGHT_CTRL_PRESSED | ENHANCED_KEY; - break; - - case VK_LMENU: - case VK_MENU: - ssOut |= LEFT_ALT_PRESSED; - break; - - case VK_RMENU: - ssOut |= RIGHT_ALT_PRESSED | ENHANCED_KEY; - break; - case VK_CAPITAL: ssOut |= CAPSLOCK_ON; break; @@ -1164,6 +1140,19 @@ ConioGetShiftState(PBYTE KeyState) } } + if (KeyState[VK_LSHIFT] || KeyState[VK_RSHIFT] & 0x80) + ssOut |= SHIFT_PRESSED; + + if (KeyState[VK_LCONTROL] & 0x80) + ssOut |= RIGHT_CTRL_PRESSED; + else if (KeyState[VK_RCONTROL] & 0x80) + ssOut |= LEFT_CTRL_PRESSED; + + if (KeyState[VK_LMENU] & 0x80) + ssOut |= RIGHT_ALT_PRESSED; + else if (KeyState[VK_RMENU] & 0x80) + ssOut |= LEFT_ALT_PRESSED; + return ssOut; } @@ -1270,7 +1259,7 @@ ConioProcessKey(MSG *msg, PCSRSS_CONSOLE Console, BOOL TextMode) } ConInRec->InputEvent = er; - ConInRec->Fake = AsciiChar && + ConInRec->Fake = (msg->message != WM_CHAR && msg->message != WM_SYSCHAR && msg->message != WM_KEYUP && msg->message != WM_SYSKEYUP); ConInRec->NotChar = (msg->message != WM_CHAR && msg->message != WM_SYSCHAR); @@ -1278,16 +1267,16 @@ ConioProcessKey(MSG *msg, PCSRSS_CONSOLE Console, BOOL TextMode) if (ConInRec->NotChar) LastVirtualKey = msg->wParam; - DPRINT("csrss: %s %s %s %s %02x %02x '%c' %04x\n", - Down ? "down" : "up ", - (msg->message == WM_CHAR || msg->message == WM_SYSCHAR) ? - "char" : "key ", - ConInRec->Fake ? "fake" : "real", - ConInRec->NotChar ? "notc" : "char", - VirtualScanCode, - VirtualKeyCode, - (AsciiChar >= ' ') ? AsciiChar : '.', - ShiftState); + DPRINT ("csrss: %s %s %s %s %02x %02x '%c' %04x\n", + Down ? "down" : "up ", + (msg->message == WM_CHAR || msg->message == WM_SYSCHAR) ? + "char" : "key ", + ConInRec->Fake ? "fake" : "real", + ConInRec->NotChar ? "notc" : "char", + VirtualScanCode, + VirtualKeyCode, + (AsciiChar >= ' ') ? AsciiChar : '.', + ShiftState); if (! ConInRec->Fake || ! ConInRec->NotChar) { diff --git a/reactos/subsys/win32k/makefile b/reactos/subsys/win32k/makefile index 2b9a8783290..a99cbc05316 100644 --- a/reactos/subsys/win32k/makefile +++ b/reactos/subsys/win32k/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.92 2004/02/08 21:37:52 weiden Exp $ +# $Id: makefile,v 1.93 2004/02/19 06:59:50 arty Exp $ PATH_TO_TOP = ../.. @@ -42,7 +42,7 @@ 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/gradient.o + eng/gradient.o MAIN_OBJECTS = main/dllmain.o main/svctabm.o diff --git a/reactos/subsys/win32k/ntuser/keyboard.c b/reactos/subsys/win32k/ntuser/keyboard.c index e325b094e1c..d4c962a0474 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.22 2004/02/19 03:45:44 arty Exp $ +/* $Id: keyboard.c,v 1.23 2004/02/19 06:59:50 arty Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -55,7 +55,6 @@ /* Key States */ #define KS_DOWN_MASK 0xc0 #define KS_DOWN_BIT 0x80 -#define KS_EXT_BIT 0x40 #define KS_LOCK_BIT 0x01 /* lParam bits */ #define LP_EXT_BIT (1<<24) @@ -78,25 +77,43 @@ NTSTATUS FASTCALL InitKeyboardImpl(VOID) { /*** Statics used by TranslateMessage ***/ -/*** Shift state code needs to be cleaned up here. Sorry, I let it get out - * of hand. */ +/*** Shift state code was out of hand, sorry. --- arty */ static UINT DontDistinguishShifts( UINT ret ) { - if( ret == VK_LSHIFT || ret == VK_RSHIFT ) ret = VK_SHIFT; - if( ret == VK_LCONTROL || ret == VK_RCONTROL ) ret = VK_CONTROL; - if( ret == VK_LMENU || ret == VK_RMENU ) ret = VK_MENU; + if( ret == VK_LSHIFT || ret == VK_RSHIFT ) ret = VK_LSHIFT; + if( ret == VK_LCONTROL || ret == VK_RCONTROL ) ret = VK_LCONTROL; + if( ret == VK_LMENU || ret == VK_RMENU ) ret = VK_LMENU; return ret; } static VOID STDCALL SetKeyState(DWORD key, DWORD vk, DWORD ext, BOOL down) { /* 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 (down) - QueueKeyStateTable[key] |= KS_DOWN_BIT | (ext ? KS_EXT_BIT : 0); + QueueKeyStateTable[key] |= KS_DOWN_BIT; else QueueKeyStateTable[key] &= ~KS_DOWN_MASK; } @@ -112,71 +129,64 @@ VOID DumpKeyState( PBYTE KeyState ) { } static BYTE KeysSet( PKBDTABLES pkKT, PBYTE KeyState, - int Mod, int FakeModLeft, int FakeModRight ) { - int i; - UINT Vk = 0; - + int FakeModLeft, int FakeModRight ) { if( !KeyState || !pkKT ) return 0; - for( i = 0; i < pkKT->bMaxVSCtoVK; i++ ) { - Vk = pkKT->pusVSCtoVK[i] & 0xff; - if( KeyState[i] && - ((Vk == Mod) || - (FakeModLeft && Vk == FakeModLeft) || - (FakeModRight && Vk == FakeModRight)) ) { - return KeyState[i]; - } - } + /* Search special codes first */ + if( FakeModLeft && KeyState[FakeModLeft] ) + return KeyState[FakeModLeft]; + else if( FakeModRight && KeyState[FakeModRight] ) + return KeyState[FakeModRight]; + + return 0; +} + +/* Search the keyboard layout modifiers table for the shift bit. I don't + * want to count on the shift bit not moving, because it can be specified + * in the layout */ + +static DWORD FASTCALL GetShiftBit( PKBDTABLES pkKT, DWORD Vk ) { + int i; + + for( i = 0; pkKT->pCharModifiers->pVkToBit[i].Vk; i++ ) + if( pkKT->pCharModifiers->pVkToBit[i].Vk == Vk ) + return pkKT->pCharModifiers->pVkToBit[i].ModBits; return 0; } static DWORD ModBits( PKBDTABLES pkKT, PBYTE KeyState ) { - int i; DWORD ModBits = 0; - BYTE Mask; if( !KeyState ) return 0; /* DumpKeyState( KeyState ); */ - for( i = 0; pkKT->pCharModifiers->pVkToBit[i].Vk; i++ ) { - int Vk = pkKT->pCharModifiers->pVkToBit[i].Vk; - switch(Vk) - { - case VK_SHIFT: - Mask = KeysSet( pkKT, KeyState, Vk, VK_LSHIFT, VK_RSHIFT ); - if (Mask & KS_DOWN_MASK) - ModBits |= pkKT->pCharModifiers->pVkToBit[i].ModBits; - break; - case VK_CONTROL: - Mask = KeysSet( pkKT, KeyState, Vk, VK_LCONTROL, VK_RCONTROL ); - if (Mask & KS_DOWN_MASK) - ModBits |= pkKT->pCharModifiers->pVkToBit[i].ModBits; - break; - case VK_MENU: - Mask = KeysSet( pkKT, KeyState, Vk, VK_LMENU, VK_RMENU ); - if (Mask & KS_DOWN_MASK) - ModBits |= pkKT->pCharModifiers->pVkToBit[i].ModBits; - if (Mask & KS_EXT_BIT) - ModBits |= MOD_KCTRL; - break; - default: - Mask = KeysSet( pkKT, KeyState, Vk, 0, 0 ); - if (Mask & KS_DOWN_BIT) - ModBits |= pkKT->pCharModifiers->pVkToBit[i].ModBits; - break; - } - } + if (KeysSet( pkKT, KeyState, VK_LSHIFT, VK_RSHIFT ) & + KS_DOWN_BIT) + ModBits |= GetShiftBit( pkKT, VK_SHIFT ); + + if (KeysSet( pkKT, KeyState, VK_LCONTROL, VK_RCONTROL ) & + KS_DOWN_BIT ) + ModBits |= GetShiftBit( pkKT, VK_CONTROL ); - /* Deal with VK_CAPITAL */ - if (KeysSet( pkKT, KeyState, VK_CAPITAL, 0, 0 ) & KS_LOCK_BIT) + if (KeysSet( pkKT, KeyState, VK_LMENU, VK_RMENU ) & + KS_DOWN_BIT ) + ModBits |= GetShiftBit( pkKT, VK_MENU ); + + /* Handle Alt+Gr */ + if (KeysSet( pkKT, KeyState, VK_RMENU, 0 ) & + KS_DOWN_BIT ) + ModBits |= GetShiftBit( pkKT, VK_CONTROL ); + + /* Deal with VK_CAPITAL */ + if (KeysSet( pkKT, KeyState, VK_CAPITAL, 0 ) & KS_LOCK_BIT) { ModBits |= CAPITAL_BIT; } /* Deal with VK_NUMLOCK */ - if (KeysSet( pkKT, KeyState, VK_NUMLOCK, 0, 0 ) & KS_LOCK_BIT) + if (KeysSet( pkKT, KeyState, VK_NUMLOCK, 0 ) & KS_LOCK_BIT) { ModBits |= NUMLOCK_BIT; } @@ -209,13 +219,9 @@ static BOOL TryToTranslateChar(WORD wVirtKey, return FALSE; } shift = keyLayout->pCharModifiers->ModNumber[ModBits]; - + for (nMod = 0; keyLayout->pVkToWcharTable[nMod].nModifications; nMod++) { - if (shift > keyLayout->pVkToWcharTable[nMod].nModifications) - { - continue; - } vtwTbl = &keyLayout->pVkToWcharTable[nMod]; size_this_entry = vtwTbl->cbSize; vkPtr = (PVK_TO_WCHARS10)((BYTE *)vtwTbl->pVkToWchars); @@ -225,13 +231,24 @@ static BOOL TryToTranslateChar(WORD wVirtKey, { CapsMod = shift | ((CapsState & CAPITAL_BIT) ? vkPtr->Attributes : 0); + + if( CapsMod > keyLayout->pVkToWcharTable[nMod].nModifications ) { + DWORD MaxBit = 1; + while( MaxBit < + keyLayout->pVkToWcharTable[nMod].nModifications ) + MaxBit <<= 1; + + CapsMod &= MaxBit - 1; /* Guarantee that CapsMod lies + in bounds. */ + } *pbDead = vkPtr->wch[CapsMod] == WCH_DEAD; *pbLigature = vkPtr->wch[CapsMod] == WCH_LGTR; *pwcTranslatedChar = vkPtr->wch[CapsMod]; - DPRINT("CapsMod %08x CapsState %08x shift %08x Char %04x\n", - CapsMod, CapsState, shift, *pwcTranslatedChar); + DPRINT("%d %04x: CapsMod %08x CapsState %08x shift %08x Char %04x\n", + nMod, wVirtKey, + CapsMod, CapsState, shift, *pwcTranslatedChar); if( *pbDead ) { @@ -299,7 +316,6 @@ NtUserGetKeyState( ExAcquireFastMutex(&QueueStateLock); if( key < 0x100 ) { ret = ((DWORD)(QueueKeyStateTable[key] & KS_DOWN_BIT) << 8 ) | - (QueueKeyStateTable[key] & KS_EXT_BIT) | (QueueKeyStateTable[key] & KS_LOCK_BIT); } ExReleaseFastMutex(&QueueStateLock); @@ -780,6 +796,7 @@ static UINT IntMapVirtualKeyEx( UINT Code, UINT Type, PKBDTABLES keyLayout ) { } break; case 3: + ret = ScanToVk( Code, FALSE, keyLayout ); break; } @@ -914,20 +931,6 @@ NtUserGetKeyNameText( LONG lParam, LPWSTR lpString, int nSize ) { return ret; } -/* Search the keyboard layout modifiers table for the shift bit. I don't - * want to count on the shift bit not moving, because it can be specified - * in the layout */ - -static DWORD FASTCALL GetShiftBit( PKBDTABLES pkKT ) { - int i; - - for( i = 0; pkKT->pCharModifiers->pVkToBit[i].Vk; i++ ) - if( pkKT->pCharModifiers->pVkToBit[i].Vk == VK_SHIFT ) - return pkKT->pCharModifiers->pVkToBit[i].ModBits; - - return 0; -} - /* * Filter this message according to the current key layout, setting wParam * appropriately. @@ -975,7 +978,7 @@ VOID FASTCALL W32kKeyProcessMessage(LPMSG Msg, PKBDTABLES KeyboardLayout) { RawVk = KeyboardLayout->pusVSCtoVK[ScanCode]; if ((ModifierBits & NUMLOCK_BIT) && - !(ModifierBits & GetShiftBit(KeyboardLayout)) && + !(ModifierBits & GetShiftBit(KeyboardLayout, VK_SHIFT)) && (RawVk & KNUMP) && !(Msg->lParam & LP_EXT_BIT)) { @@ -1006,6 +1009,12 @@ VOID FASTCALL W32kKeyProcessMessage(LPMSG Msg, PKBDTABLES KeyboardLayout) { FALSE ); /* Release key */ } + /* We need to unset SYSKEYDOWN if the ALT key is an ALT+Gr */ + if( QueueKeyStateTable[VK_RMENU] & KS_DOWN_BIT ) { + if( Msg->message == WM_SYSKEYDOWN ) Msg->message = WM_KEYDOWN; + else Msg->message = WM_KEYUP; + } + ExReleaseFastMutex(&QueueStateLock); } /* EOF */ From 98efb8ab35556522f79a71e607ecf4223bd32749 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin <aleksey@reactos.org> Date: Thu, 19 Feb 2004 09:31:30 +0000 Subject: [PATCH 0084/1463] Fix by Waldo Alvarez Cacizares, fixes 16<->16 bpp stretchblitting (AbiWord splashscreen will look good) svn path=/trunk/; revision=8260 --- reactos/subsys/win32k/dib/dib16bpp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib16bpp.c b/reactos/subsys/win32k/dib/dib16bpp.c index 1c8ef15f066..efb81a620c0 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.18 2004/02/14 22:24:54 navaraf Exp $ */ +/* $Id: dib16bpp.c,v 1.19 2004/02/19 09:31:30 fireball Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> #include <stdlib.h> @@ -422,7 +422,7 @@ void ScaleRectAvg16(PIXEL *Target, PIXEL *Source, int SrcWidth, int SrcHeight, int TgtWidth, int TgtHeight, int srcPitch, int dstPitch) { int NumPixels = TgtHeight; - int IntPart = (SrcHeight / TgtHeight) * SrcWidth; + int IntPart = ((SrcHeight / TgtHeight) * srcPitch) / 2; //(SrcHeight / TgtHeight) * SrcWidth; int FractPart = SrcHeight % TgtHeight; int Mid = TgtHeight / 2; int E = 0; From 3ea22628797a566927191f949f148f0f33d6453c Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Thu, 19 Feb 2004 15:27:55 +0000 Subject: [PATCH 0085/1463] fixed WinPosWindowFromPoint(), now it should work properly. svn path=/trunk/; revision=8262 --- reactos/subsys/win32k/ntuser/msgqueue.c | 4 +- reactos/subsys/win32k/ntuser/winpos.c | 95 +++++++++++++------------ 2 files changed, 51 insertions(+), 48 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index 165c48757f0..f318532cd3d 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.65 2004/02/08 21:47:10 gvg Exp $ +/* $Id: msgqueue.c,v 1.66 2004/02/19 15:27:55 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -291,6 +291,8 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, } else { + if(Window) + IntReleaseWindowObject(Window); ExFreePool(Message); *Freed = TRUE; return(FALSE); diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index 60e888422cb..aa9871ef69d 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.90 2004/02/18 12:21:57 rcampbell Exp $ +/* $Id: winpos.c,v 1.91 2004/02/19 15:27:55 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1231,17 +1231,8 @@ WinPosShowWindow(HWND Wnd, INT Cmd) } BOOL STATIC FASTCALL -WinPosPtInWindow(PWINDOW_OBJECT Window, POINT Point) -{ - return(Point.x >= Window->WindowRect.left && - Point.x < Window->WindowRect.right && - Point.y >= Window->WindowRect.top && - Point.y < Window->WindowRect.bottom); -} - -USHORT STATIC FASTCALL -WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, POINT Point, - PWINDOW_OBJECT* Window) +WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, POINT *Point, + PWINDOW_OBJECT* Window, USHORT *HitTest) { PWINDOW_OBJECT Current; @@ -1252,37 +1243,64 @@ WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, POINT Point, if (Current->Style & WS_VISIBLE && ((!(Current->Style & WS_DISABLED)) || (Current->Style & (WS_CHILD | WS_POPUP)) != WS_CHILD) && - WinPosPtInWindow(Current, Point)) + (Point->x >= Current->WindowRect.left && + Point->x < Current->WindowRect.right && + Point->y >= Current->WindowRect.top && + Point->y < Current->WindowRect.bottom)) + /* FIXME - check if Point is in window region */ { if(*Window) + { ObmDereferenceObject(*Window); + } ObmReferenceObjectByPointer(Current, otWindow); - *Window = Current; if (Current->Style & WS_DISABLED) { - ExReleaseFastMutexUnsafe(&ScopeWin->ChildrenListLock); - return(HTERROR); + ExReleaseFastMutexUnsafe(&ScopeWin->ChildrenListLock); + *HitTest = HTERROR; + return TRUE; } - if (Point.x >= Current->ClientRect.left && - Point.x < Current->ClientRect.right && - Point.y >= Current->ClientRect.top && - Point.y < Current->ClientRect.bottom) + if(Current->MessageQueue == PsGetWin32Thread()->MessageQueue) + { + *HitTest = IntSendMessage(Current->Self, WM_NCHITTEST, 0, + MAKELONG(Point->x, Point->y)); + if((*HitTest) == (USHORT)HTTRANSPARENT) { - - ExReleaseFastMutexUnsafe(&ScopeWin->ChildrenListLock); - return(WinPosSearchChildren(Current, Point, Window)); + Current = Current->NextSibling; + continue; + } + } + else + { + *HitTest = HTCLIENT; + } + + if (Point->x >= Current->ClientRect.left && + Point->x < Current->ClientRect.right && + Point->y >= Current->ClientRect.top && + Point->y < Current->ClientRect.bottom) + { + USHORT ChildHitTest; + ExReleaseFastMutexUnsafe(&ScopeWin->ChildrenListLock); + if(WinPosSearchChildren(Current, Point, Window, &ChildHitTest)) + { + *HitTest = ChildHitTest; + return TRUE; + } } ExReleaseFastMutexUnsafe(&ScopeWin->ChildrenListLock); - return(0); + return TRUE; } Current = Current->NextSibling; } ExReleaseFastMutexUnsafe(&ScopeWin->ChildrenListLock); - return(0); + if(*Window == NULL) + *HitTest = HTNOWHERE; + return FALSE; } USHORT FASTCALL @@ -1314,28 +1332,11 @@ WinPosWindowFromPoint(PWINDOW_OBJECT ScopeWin, POINT WinPoint, Point.y += ScopeWin->ClientRect.top - DesktopWindow->ClientRect.top; IntReleaseWindowObject(DesktopWindow); - HitTest = WinPosSearchChildren(ScopeWin, Point, Window); - if (HitTest != 0) - { - return(HitTest); - } - - if ((*Window) == NULL) - { - return(HTNOWHERE); - } - if ((*Window)->MessageQueue == PsGetWin32Thread()->MessageQueue) - { - HitTest = IntSendMessage((*Window)->Self, WM_NCHITTEST, 0, - MAKELONG(Point.x, Point.y)); - /* FIXME: Check for HTTRANSPARENT here. */ - } - else - { - HitTest = HTCLIENT; - } - - return(HitTest); + if(WinPosSearchChildren(ScopeWin, &Point, Window, &HitTest)) + { + return HitTest; + } + return HTNOWHERE; } BOOL From ecfd9db94417a086dccbcb4769120a2b2a55aaef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Thu, 19 Feb 2004 17:04:11 +0000 Subject: [PATCH 0086/1463] =?UTF-8?q?Patch=20by=20H=EF=BF=BDseyin=20Uslu?= =?UTF-8?q?=20<20194562@mail.baskent.edu.tr>=20Check=20color=20passed=20on?= =?UTF-8?q?=20command=20line,=20make=20sure=20foreground=20and=20backgroun?= =?UTF-8?q?d=20are=20not=20the=20same.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit svn path=/trunk/; revision=8263 --- reactos/subsys/system/cmd/color.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/reactos/subsys/system/cmd/color.c b/reactos/subsys/system/cmd/color.c index a5fbc5f22c2..9150bc8b38f 100644 --- a/reactos/subsys/system/cmd/color.c +++ b/reactos/subsys/system/cmd/color.c @@ -1,4 +1,4 @@ -/* $Id: color.c,v 1.3 2003/08/07 09:27:42 hbirr Exp $ +/* $Id: color.c,v 1.4 2004/02/19 17:04:11 gvg Exp $ * * COLOR.C - color internal command. * @@ -68,19 +68,26 @@ VOID SetScreenColor (WORD wColor, BOOL bFill) CONSOLE_SCREEN_BUFFER_INFO csbi; COORD coPos; - if (bFill == TRUE) + if ((wColor & 0xF) == (wColor &0xF0) >> 4) { - GetConsoleScreenBufferInfo (hConsole, &csbi); + ConErrPuts (_T("Same colors error! (Background and foreground can't be the same color)")); + } + else + { + if (bFill == TRUE) + { + GetConsoleScreenBufferInfo (hConsole, &csbi); - coPos.X = 0; - coPos.Y = 0; - FillConsoleOutputAttribute (hConsole, + coPos.X = 0; + coPos.Y = 0; + FillConsoleOutputAttribute (hConsole, (WORD)(wColor & 0x00FF), (csbi.dwSize.X)*(csbi.dwSize.Y), coPos, &dwWritten); - } - SetConsoleTextAttribute (hConsole, (WORD)(wColor & 0x00FF)); + } + SetConsoleTextAttribute (hConsole, (WORD)(wColor & 0x00FF)); + } } From bb25722258397a9942477212d9f00ff06f913da8 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Thu, 19 Feb 2004 17:54:05 +0000 Subject: [PATCH 0087/1463] - Revert the last change, because it really doesn't help. - Don't detect mouse on COM2 by default. svn path=/trunk/; revision=8264 --- reactos/drivers/input/sermouse/sermouse.c | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/reactos/drivers/input/sermouse/sermouse.c b/reactos/drivers/input/sermouse/sermouse.c index f1b64e189d5..b67fa14b8d2 100644 --- a/reactos/drivers/input/sermouse/sermouse.c +++ b/reactos/drivers/input/sermouse/sermouse.c @@ -11,12 +11,6 @@ #include <ddk/ntddk.h> #include <ddk/ntddmou.h> -/* - * HAL:KdComPortInUse used to prevent detecting mouse on port - * that is occupied by kernel debugger. - */ -ULONG DECLSPEC_IMPORT KdComPortInUse; - /* * Compile time options */ @@ -26,7 +20,7 @@ ULONG DECLSPEC_IMPORT KdComPortInUse; /* Check for mouse on COM1? */ #define SERMOUSE_COM1_SUPPORT /* Check for mouse on COM2? */ -#define SERMOUSE_COM2_SUPPORT +/* #define SERMOUSE_COM2_SUPPORT */ /* Create \??\Mouse* symlink for device? */ #define SERMOUSE_MOUSESYMLINK_SUPPORT @@ -574,10 +568,6 @@ InitializeMouse(ULONG Port, ULONG Irq, PDRIVER_OBJECT DriverObject) KAFFINITY Affinity; ULONG MouseType; - /* Don't detect mouse on port that is occupied by kernel debugger */ - if (KdComPortInUse == Port) - return FALSE; - /* Try to detect mouse on specified port */ MouseType = DetectMicrosoftMouse(Port); From e4340278d78ddddf44955fb83a799fc974985c26 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Thu, 19 Feb 2004 19:26:52 +0000 Subject: [PATCH 0088/1463] - Fixed line endings - Updated regsvr32 to latest version by ShadowFlare. svn path=/trunk/; revision=8265 --- reactos/apps/utils/regsvr32/regsvr32.c | 967 ++++++++++++------------- reactos/apps/utils/rundll32/rundll32.c | 934 ++++++++++++------------ 2 files changed, 947 insertions(+), 954 deletions(-) diff --git a/reactos/apps/utils/regsvr32/regsvr32.c b/reactos/apps/utils/regsvr32/regsvr32.c index 4bb958e1958..cb6889c2268 100644 --- a/reactos/apps/utils/regsvr32/regsvr32.c +++ b/reactos/apps/utils/regsvr32/regsvr32.c @@ -1,487 +1,480 @@ -/* - * ReactOS regsvr32 - * Copyright (C) 2004 ReactOS Team - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS regsvr32.exe - * FILE: apps/utils/regsvr32/regsvr32.c - * PURPOSE: Register a COM component in the registry - * PROGRAMMER: ShadowFlare (blakflare@hotmail.com) - */ - -#define WIN32_LEAN_AND_MEAN - -// Both UNICODE and _UNICODE must be either defined or undefined -// because some headers use UNICODE and others use _UNICODE -#ifdef UNICODE -#ifndef _UNICODE -#define _UNICODE -#endif -#else -#ifdef _UNICODE -#define UNICODE -#endif -#endif - -#include <windows.h> -#include <ole2.h> -#include <stdio.h> -#include <string.h> -#include <malloc.h> -#include <tchar.h> - -typedef HRESULT (WINAPI *DLLREGISTER)(void); -typedef HRESULT (WINAPI *DLLINSTALL)(BOOL bInstall, LPWSTR lpwCmdLine); - -#define EXITCODE_SUCCESS 0 -#define EXITCODE_PARAMERROR 1 -#define EXITCODE_LOADERROR 3 -#define EXITCODE_NOENTRY 4 -#define EXITCODE_FAILURE 5 - -LPCSTR szDllRegister = "DllRegisterServer"; -LPCSTR szDllUnregister = "DllUnregisterServer"; -LPCSTR szDllInstall = "DllInstall"; -#ifdef UNICODE -LPCWSTR tszDllRegister = L"DllRegisterServer"; -LPCWSTR tszDllUnregister = L"DllUnregisterServer"; -LPCWSTR tszDllInstall = L"DllInstall"; -#else -#define tszDllRegister szDllRegister -#define tszDllUnregister szDllUnregister -#define tszDllInstall szDllInstall -#endif - -LPCTSTR ModuleTitle = _T("RegSvr32"); -LPCTSTR UsageMessage = - _T("%s\n\n") - _T("Usage: regsvr32 [/u] [/s] [/c] [/n] [/i[:cmdline]] dllname\n") - _T("/u - Unregister server\n") - _T("/s - Silent; display no message boxes\n") - _T("/c - Console output\n") - _T("/i - Call DllInstall passing it an optional [cmdline]; when used with /u calls dll uninstall\n") - _T("/n - Do not call DllRegisterServer; this option must be used with /i"); -LPCTSTR NoDllSpecified = _T("No DLL name specified."); -LPCTSTR InvalidFlag = _T("Unrecognized flag: %s"); -LPCTSTR SwitchN_NoI = _T("Unrecognized flag: /n must be used with the /i switch"); -LPCTSTR DllNotLoaded = - _T("LoadLibrary(\"%s\") failed.\n") - _T("GetLastError returns 0x%08x."); -LPCTSTR MissingEntry = - _T("%s was loaded, but the %s entry point was not found.\n\n") - _T("%s may not be exported, or a corrupt version of %s may be in memory. Consider using PView to detect and remove it."); -LPCTSTR FailureMessage = - _T("%s in %s failed.\n") - _T("Return code was: 0x%08x"); -LPCTSTR SuccessMessage = _T("%s in %s succeeded."); - -// The macro CommandLineToArgv maps to a function that converts -// a command-line string to argc and argv similar to the ones -// in the standard main function. If this code is compiled for -// unicode, the build-in Windows API function is used, otherwise -// a non-unicode non-API version is used for compatibility with -// Windows versions that have no unicode support. -#ifdef UNICODE -#define CommandLineToArgv CommandLineToArgvW -#include <shellapi.h> -#else -#define CommandLineToArgv CommandLineToArgvT - -LPTSTR *WINAPI CommandLineToArgvT(LPCTSTR lpCmdLine, int *lpArgc) -{ - HGLOBAL hargv; - LPTSTR *argv, lpSrc, lpDest, lpArg; - int argc, nBSlash; - BOOL bInQuotes; - - // If null was passed in for lpCmdLine, there are no arguments - if (!lpCmdLine) { - if (lpArgc) - *lpArgc = 0; - return 0; - } - - lpSrc = (LPTSTR)lpCmdLine; - // Skip spaces at beginning - while (*lpSrc == _T(' ') || *lpSrc == _T('\t')) - lpSrc++; - - // If command-line starts with null, there are no arguments - if (*lpSrc == 0) { - if (lpArgc) - *lpArgc = 0; - return 0; - } - - lpArg = lpSrc; - argc = 0; - nBSlash = 0; - bInQuotes = FALSE; - - // Count the number of arguments - while (1) { - if (*lpSrc == 0 || ((*lpSrc == _T(' ') || *lpSrc == _T('\t')) && !bInQuotes)) { - // Whitespace not enclosed in quotes signals the start of another argument - argc++; - - // Skip whitespace between arguments - while (*lpSrc == _T(' ') || *lpSrc == _T('\t')) - lpSrc++; - if (*lpSrc == 0) - break; - nBSlash = 0; - continue; - } - else if (*lpSrc == _T('\\')) { - // Count consecutive backslashes - nBSlash++; - } - else if (*lpSrc == _T('\"') && !(nBSlash & 1)) { - // Open or close quotes - bInQuotes = !bInQuotes; - nBSlash = 0; - } - else { - // Some other character - nBSlash = 0; - } - lpSrc++; - } - - // Allocate space the same way as CommandLineToArgvW for compatibility - hargv = GlobalAlloc(0, argc * sizeof(LPTSTR) + (_tcslen(lpArg) + 1) * sizeof(TCHAR)); - argv = (LPTSTR *)GlobalLock(hargv); - - if (!argv) { - // Memory allocation failed - if (lpArgc) - *lpArgc = 0; - return 0; - } - - lpSrc = lpArg; - lpDest = lpArg = (LPTSTR)(argv + argc); - argc = 0; - nBSlash = 0; - bInQuotes = FALSE; - - // Fill the argument array - while (1) { - if (*lpSrc == 0 || ((*lpSrc == _T(' ') || *lpSrc == _T('\t')) && !bInQuotes)) { - // Whitespace not enclosed in quotes signals the start of another argument - // Null-terminate argument - *lpDest++ = 0; - argv[argc++] = lpArg; - - // Skip whitespace between arguments - while (*lpSrc == _T(' ') || *lpSrc == _T('\t')) - lpSrc++; - if (*lpSrc == 0) - break; - lpArg = lpDest; - nBSlash = 0; - continue; - } - else if (*lpSrc == _T('\\')) { - *lpDest++ = _T('\\'); - lpSrc++; - - // Count consecutive backslashes - nBSlash++; - } - else if (*lpSrc == _T('\"')) { - if (!(nBSlash & 1)) { - // If an even number of backslashes are before the quotes, - // the quotes don't go in the output - lpDest -= nBSlash / 2; - bInQuotes = !bInQuotes; - } - else { - // If an odd number of backslashes are before the quotes, - // output a quote - lpDest -= (nBSlash + 1) / 2; - *lpDest++ = _T('\"'); - } - lpSrc++; - nBSlash = 0; - } - else { - // Copy other characters - *lpDest++ = *lpSrc++; - nBSlash = 0; - } - } - - if (lpArgc) - *lpArgc = argc; - return argv; -} - -#endif - -// The macro ConvertToWideChar takes a tstring parameter and returns -// a pointer to a unicode string. A conversion is performed if -// neccessary. FreeConvertedWideChar string should be used on the -// return value of ConvertToWideChar when the string is no longer -// needed. The original string or the string that is returned -// should not be modified until FreeConvertedWideChar has been called. -#ifdef UNICODE -#define ConvertToWideChar(lptString) (lptString) -#define FreeConvertedWideChar(lpwString) -#else - -LPWSTR ConvertToWideChar(LPCSTR lpString) -{ - LPWSTR lpwString; - size_t nStrLen; - - nStrLen = strlen(lpString) + 1; - - lpwString = (LPWSTR)malloc(nStrLen * sizeof(WCHAR)); - MultiByteToWideChar(0,0,lpString,nStrLen,lpwString,nStrLen); - - return lpwString; -} - -#define FreeConvertedWideChar(lpwString) free(lpwString) -#endif - -int WINAPI WinMain( - HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpCmdLineA, - int nCmdShow -) -{ - int argc; - LPTSTR *argv; - LPTSTR lptDllName,lptDllCmdLine,lptMsgBuffer; - LPCTSTR lptFuncName; - LPCSTR lpFuncName; - LPWSTR lpwDllCmdLine; - BOOL bUnregister,bSilent,bConsole,bInstall,bNoRegister; - UINT nDllCount; - HMODULE hDll; - DLLREGISTER fnDllRegister; - DLLINSTALL fnDllInstall; - HRESULT hResult; - DWORD dwErr; - int nRetValue,i; - - // Get command-line in argc-argv format - argv = CommandLineToArgv(GetCommandLine(),&argc); - - // Initialize variables - lptFuncName = 0; - lptDllCmdLine = 0; - nDllCount = 0; - bUnregister = FALSE; - bSilent = FALSE; - bConsole = FALSE; - bInstall = FALSE; - bNoRegister = FALSE; - - // Find all arguments starting with a slash (/) - for (i = 1; i < argc; i++) { - if (*argv[i] == _T('/')) { - switch (argv[i][1]) { - case _T('u'): - case _T('U'): - bUnregister = TRUE; - break; - case _T('s'): - case _T('S'): - bSilent = TRUE; - break; - case _T('c'): - case _T('C'): - bConsole = TRUE; - break; - case _T('i'): - case _T('I'): - bInstall = TRUE; - if (argv[i][2] == _T(':')) - lptDllCmdLine = argv[i]+3; - else - lptDllCmdLine = _T(""); - break; - case _T('n'): - case _T('N'): - bNoRegister = TRUE; - break; - default: - if (!lptFuncName) - lptFuncName = argv[i]; - } - } - else { - nDllCount++; - } - } - - // An unrecognized flag was used, display a message and show available options - if (lptFuncName) { - if (!bSilent) { - lptMsgBuffer = (LPTSTR)malloc((_tcslen(UsageMessage) - 2 + _tcslen(InvalidFlag) - 2 + _tcslen(lptFuncName) + 1) * sizeof(TCHAR)); - _stprintf(lptMsgBuffer + (_tcslen(UsageMessage) - 2),InvalidFlag,lptFuncName); - _stprintf(lptMsgBuffer,UsageMessage,lptMsgBuffer + (_tcslen(UsageMessage) - 2)); - MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONEXCLAMATION); - free(lptMsgBuffer); - } - GlobalFree(argv); - return EXITCODE_PARAMERROR; - } - - // /n was used without /i, display a message and show available options - if (bNoRegister && (!bInstall)) { - if (!bSilent) { - lptMsgBuffer = (LPTSTR)malloc((_tcslen(UsageMessage) - 2 + _tcslen(SwitchN_NoI) + 1) * sizeof(TCHAR)); - _stprintf(lptMsgBuffer,UsageMessage,SwitchN_NoI); - MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONEXCLAMATION); - free(lptMsgBuffer); - } - GlobalFree(argv); - return EXITCODE_PARAMERROR; - } - - // No dll was specified, display a message and show available options - if (nDllCount == 0) { - if (!bSilent) { - lptMsgBuffer = (LPTSTR)malloc((_tcslen(UsageMessage) - 2 + _tcslen(NoDllSpecified) + 1) * sizeof(TCHAR)); - _stprintf(lptMsgBuffer,UsageMessage,NoDllSpecified); - MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONEXCLAMATION); - free(lptMsgBuffer); - } - GlobalFree(argv); - return EXITCODE_PARAMERROR; - } - - nRetValue = EXITCODE_SUCCESS; - if (!bUnregister) { - lpFuncName = szDllRegister; - lptFuncName = tszDllRegister; - } - else { - lpFuncName = szDllUnregister; - lptFuncName = tszDllUnregister; - } - - if (lptDllCmdLine) - lpwDllCmdLine = ConvertToWideChar(lptDllCmdLine); - else - lpwDllCmdLine = 0; - - // Initialize OLE32 before attempting to register the - // dll. Some dll's require this to register properly - OleInitialize(0); - - // (Un)register every dll whose filename was passed in the command-line string - for (i = 1; i < argc; i++) { - // Arguments that do not start with a slash (/) are filenames - if (*argv[i] != _T('/')) { - lptDllName = argv[i]; - - // Everything is all setup, so load the dll now - hDll = LoadLibrary(lptDllName); - if (hDll) { - if (!bNoRegister) { - // Get the address of DllRegisterServer or DllUnregisterServer - fnDllRegister = (DLLREGISTER)GetProcAddress(hDll,lpFuncName); - if (fnDllRegister) { - // If the function exists, call it - hResult = fnDllRegister(); - if (!bSilent) { - if (hResult == S_OK) { - // (Un)register succeeded, display a message - lptMsgBuffer = (LPTSTR)malloc((_tcslen(SuccessMessage) - 4 + _tcslen(lptFuncName) + _tcslen(lptDllName) + 1) * sizeof(TCHAR)); - _stprintf(lptMsgBuffer,SuccessMessage,lptFuncName,lptDllName); - MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONINFORMATION); - } - else { - // (Un)register failed, display a message - lptMsgBuffer = (LPTSTR)malloc((_tcslen(FailureMessage) + _tcslen(lptFuncName) + _tcslen(lptDllName) + 1) * sizeof(TCHAR)); - _stprintf(lptMsgBuffer,FailureMessage,lptFuncName,lptDllName,hResult); - MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONEXCLAMATION); - } - free(lptMsgBuffer); - } - if (hResult != S_OK) - nRetValue = EXITCODE_FAILURE; - } - else { - FreeLibrary(hDll); - if (!bSilent) { - // Dll(Un)register was not found, display an error message - lptMsgBuffer = (LPTSTR)malloc((_tcslen(MissingEntry) - 8 + _tcslen(lptFuncName) * 2 + _tcslen(lptDllName) * 2 + 1) * sizeof(TCHAR)); - _stprintf(lptMsgBuffer,MissingEntry,lptDllName,lptFuncName,lptFuncName,lptDllName); - MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONEXCLAMATION); - free(lptMsgBuffer); - } - nRetValue = EXITCODE_NOENTRY; - } - } - - if (bInstall) { - // Get the address of DllInstall - fnDllInstall = (DLLINSTALL)GetProcAddress(hDll,szDllInstall); - if (fnDllInstall) { - // If the function exists, call it - if (!bUnregister) - hResult = fnDllInstall(1,lpwDllCmdLine); - else - hResult = fnDllInstall(0,lpwDllCmdLine); - if (!bSilent) { - if (hResult == S_OK) { - // (Un)install succeeded, display a message - lptMsgBuffer = (LPTSTR)malloc((_tcslen(SuccessMessage) - 4 + _tcslen(tszDllInstall) + _tcslen(lptDllName) + 1) * sizeof(TCHAR)); - _stprintf(lptMsgBuffer,SuccessMessage,tszDllInstall,lptDllName); - MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONINFORMATION); - } - else { - // (Un)install failed, display a message - lptMsgBuffer = (LPTSTR)malloc((_tcslen(FailureMessage) + _tcslen(tszDllInstall) + _tcslen(lptDllName) + 1) * sizeof(TCHAR)); - _stprintf(lptMsgBuffer,FailureMessage,tszDllInstall,lptDllName,hResult); - MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONEXCLAMATION); - } - free(lptMsgBuffer); - } - if (hResult != S_OK) - nRetValue = EXITCODE_FAILURE; - } - else { - FreeLibrary(hDll); - if (!bSilent) { - // DllInstall was not found, display an error message - lptMsgBuffer = (LPTSTR)malloc((_tcslen(MissingEntry) - 8 + _tcslen(tszDllInstall) * 2 + _tcslen(lptDllName) * 2 + 1) * sizeof(TCHAR)); - _stprintf(lptMsgBuffer,MissingEntry,lptDllName,tszDllInstall,tszDllInstall,lptDllName); - MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONEXCLAMATION); - free(lptMsgBuffer); - } - nRetValue = EXITCODE_NOENTRY; - } - } - - // The dll function has finished executing, so unload it - FreeLibrary(hDll); - } - else { - if (!bSilent) { - // The dll could not be loaded; display an error message - dwErr = GetLastError(); - lptMsgBuffer = (LPTSTR)malloc((_tcslen(DllNotLoaded) + 2 + _tcslen(lptDllName) + 1) * sizeof(TCHAR)); - _stprintf(lptMsgBuffer,DllNotLoaded,lptDllName,dwErr); - MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONEXCLAMATION); - free(lptMsgBuffer); - } - nRetValue = EXITCODE_LOADERROR; - } - } - } - - if (lpwDllCmdLine) - FreeConvertedWideChar(lpwDllCmdLine); - GlobalFree(argv); - OleUninitialize(); - return nRetValue; -} - +/* + * ReactOS regsvr32 + * Copyright (C) 2004 ReactOS Team + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS regsvr32.exe + * FILE: apps/utils/regsvr32/regsvr32.c + * PURPOSE: Register a COM component in the registry + * PROGRAMMER: ShadowFlare (blakflare@hotmail.com) + */ + +#define WIN32_LEAN_AND_MEAN + +// Both UNICODE and _UNICODE must be either defined or undefined +// because some headers use UNICODE and others use _UNICODE +#ifdef UNICODE +#ifndef _UNICODE +#define _UNICODE +#endif +#else +#ifdef _UNICODE +#define UNICODE +#endif +#endif + +#include <windows.h> +#include <ole2.h> +#include <stdio.h> +#include <string.h> +#include <malloc.h> +#include <tchar.h> + +typedef HRESULT (WINAPI *DLLREGISTER)(void); +typedef HRESULT (WINAPI *DLLINSTALL)(BOOL bInstall, LPWSTR lpwCmdLine); + +#define EXITCODE_SUCCESS 0 +#define EXITCODE_PARAMERROR 1 +#define EXITCODE_LOADERROR 3 +#define EXITCODE_NOENTRY 4 +#define EXITCODE_FAILURE 5 + +LPCSTR szDllRegister = "DllRegisterServer"; +LPCSTR szDllUnregister = "DllUnregisterServer"; +LPCSTR szDllInstall = "DllInstall"; +#ifdef UNICODE +LPCWSTR tszDllRegister = L"DllRegisterServer"; +LPCWSTR tszDllUnregister = L"DllUnregisterServer"; +LPCWSTR tszDllInstall = L"DllInstall"; +#else +#define tszDllRegister szDllRegister +#define tszDllUnregister szDllUnregister +#define tszDllInstall szDllInstall +#endif + +LPCTSTR ModuleTitle = _T("RegSvr32"); +LPCTSTR UsageMessage = + _T("%s\n\n") + _T("Usage: regsvr32 [/u] [/s] [/c] [/n] [/i[:cmdline]] dllname\n") + _T("/u - Unregister server\n") + _T("/s - Silent; display no message boxes\n") + _T("/c - Console output\n") + _T("/i - Call DllInstall passing it an optional [cmdline]; when used with /u calls dll uninstall\n") + _T("/n - Do not call DllRegisterServer; this option must be used with /i"); +LPCTSTR NoDllSpecified = _T("No DLL name specified."); +LPCTSTR InvalidFlag = _T("Unrecognized flag: %s"); +LPCTSTR SwitchN_NoI = _T("Unrecognized flag: /n must be used with the /i switch"); +LPCTSTR DllNotLoaded = + _T("LoadLibrary(\"%s\") failed.\n") + _T("GetLastError returns 0x%08x."); +LPCTSTR MissingEntry = + _T("%s was loaded, but the %s entry point was not found.\n\n") + _T("%s may not be exported, or a corrupt version of %s may be in memory. Consider using PView to detect and remove it."); +LPCTSTR FailureMessage = + _T("%s in %s failed.\n") + _T("Return code was: 0x%08x"); +LPCTSTR SuccessMessage = _T("%s in %s succeeded."); + +// The macro CommandLineToArgv maps to a function that converts +// a command-line string to argc and argv similar to the ones +// in the standard main function. If this code is compiled for +// unicode, the build-in Windows API function is used, otherwise +// a non-unicode non-API version is used for compatibility with +// Windows versions that have no unicode support. +#ifdef UNICODE +#define CommandLineToArgv CommandLineToArgvW +#include <shellapi.h> +#else +#define CommandLineToArgv CommandLineToArgvT + +LPTSTR *WINAPI CommandLineToArgvT(LPCTSTR lpCmdLine, int *lpArgc) +{ + HGLOBAL hargv; + LPTSTR *argv, lpSrc, lpDest, lpArg; + int argc, nBSlash; + BOOL bInQuotes; + + // If null was passed in for lpCmdLine, there are no arguments + if (!lpCmdLine) { + if (lpArgc) + *lpArgc = 0; + return 0; + } + + lpSrc = (LPTSTR)lpCmdLine; + // Skip spaces at beginning + while (*lpSrc == _T(' ') || *lpSrc == _T('\t')) + lpSrc++; + + // If command-line starts with null, there are no arguments + if (*lpSrc == 0) { + if (lpArgc) + *lpArgc = 0; + return 0; + } + + lpArg = lpSrc; + argc = 0; + nBSlash = 0; + bInQuotes = FALSE; + + // Count the number of arguments + while (1) { + if (*lpSrc == 0 || ((*lpSrc == _T(' ') || *lpSrc == _T('\t')) && !bInQuotes)) { + // Whitespace not enclosed in quotes signals the start of another argument + argc++; + + // Skip whitespace between arguments + while (*lpSrc == _T(' ') || *lpSrc == _T('\t')) + lpSrc++; + if (*lpSrc == 0) + break; + nBSlash = 0; + continue; + } + else if (*lpSrc == _T('\\')) { + // Count consecutive backslashes + nBSlash++; + } + else if (*lpSrc == _T('\"') && !(nBSlash & 1)) { + // Open or close quotes + bInQuotes = !bInQuotes; + nBSlash = 0; + } + else { + // Some other character + nBSlash = 0; + } + lpSrc++; + } + + // Allocate space the same way as CommandLineToArgvW for compatibility + hargv = GlobalAlloc(0, argc * sizeof(LPTSTR) + (_tcslen(lpArg) + 1) * sizeof(TCHAR)); + argv = (LPTSTR *)GlobalLock(hargv); + + if (!argv) { + // Memory allocation failed + if (lpArgc) + *lpArgc = 0; + return 0; + } + + lpSrc = lpArg; + lpDest = lpArg = (LPTSTR)(argv + argc); + argc = 0; + nBSlash = 0; + bInQuotes = FALSE; + + // Fill the argument array + while (1) { + if (*lpSrc == 0 || ((*lpSrc == _T(' ') || *lpSrc == _T('\t')) && !bInQuotes)) { + // Whitespace not enclosed in quotes signals the start of another argument + // Null-terminate argument + *lpDest++ = 0; + argv[argc++] = lpArg; + + // Skip whitespace between arguments + while (*lpSrc == _T(' ') || *lpSrc == _T('\t')) + lpSrc++; + if (*lpSrc == 0) + break; + lpArg = lpDest; + nBSlash = 0; + continue; + } + else if (*lpSrc == _T('\\')) { + *lpDest++ = _T('\\'); + lpSrc++; + + // Count consecutive backslashes + nBSlash++; + } + else if (*lpSrc == _T('\"')) { + if (!(nBSlash & 1)) { + // If an even number of backslashes are before the quotes, + // the quotes don't go in the output + lpDest -= nBSlash / 2; + bInQuotes = !bInQuotes; + } + else { + // If an odd number of backslashes are before the quotes, + // output a quote + lpDest -= (nBSlash + 1) / 2; + *lpDest++ = _T('\"'); + } + lpSrc++; + nBSlash = 0; + } + else { + // Copy other characters + *lpDest++ = *lpSrc++; + nBSlash = 0; + } + } + + if (lpArgc) + *lpArgc = argc; + return argv; +} + +#endif + +// The macro ConvertToWideChar takes a tstring parameter and returns +// a pointer to a unicode string. A conversion is performed if +// neccessary. FreeConvertedWideChar string should be used on the +// return value of ConvertToWideChar when the string is no longer +// needed. The original string or the string that is returned +// should not be modified until FreeConvertedWideChar has been called. +#ifdef UNICODE +#define ConvertToWideChar(lptString) (lptString) +#define FreeConvertedWideChar(lpwString) +#else + +LPWSTR ConvertToWideChar(LPCSTR lpString) +{ + LPWSTR lpwString; + size_t nStrLen; + + nStrLen = strlen(lpString) + 1; + + lpwString = (LPWSTR)malloc(nStrLen * sizeof(WCHAR)); + MultiByteToWideChar(0,0,lpString,nStrLen,lpwString,nStrLen); + + return lpwString; +} + +#define FreeConvertedWideChar(lpwString) free(lpwString) +#endif + +void DisplayMessage(BOOL bConsole, BOOL bSilent, LPCTSTR lpMessage, LPCTSTR lpTitle, UINT uType) +{ + if (!bSilent) + MessageBox(0,lpMessage,lpTitle,uType); + if (bConsole) + _tprintf(_T("%s: %s\n\n"),lpTitle,lpMessage); +} + +int WINAPI WinMain( + HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpCmdLineA, + int nCmdShow +) +{ + int argc; + LPTSTR *argv; + LPTSTR lptDllName,lptDllCmdLine,lptMsgBuffer; + LPCTSTR lptFuncName; + LPCSTR lpFuncName; + LPWSTR lpwDllCmdLine; + BOOL bUnregister,bSilent,bConsole,bInstall,bNoRegister; + UINT nDllCount; + HMODULE hDll; + DLLREGISTER fnDllRegister; + DLLINSTALL fnDllInstall; + HRESULT hResult; + DWORD dwErr; + int nRetValue,i; + + // Get command-line in argc-argv format + argv = CommandLineToArgv(GetCommandLine(),&argc); + + // Initialize variables + lptFuncName = 0; + lptDllCmdLine = 0; + nDllCount = 0; + bUnregister = FALSE; + bSilent = FALSE; + bConsole = FALSE; + bInstall = FALSE; + bNoRegister = FALSE; + + // Find all arguments starting with a slash (/) + for (i = 1; i < argc; i++) { + if (*argv[i] == _T('/')) { + switch (argv[i][1]) { + case _T('u'): + case _T('U'): + bUnregister = TRUE; + break; + case _T('s'): + case _T('S'): + bSilent = TRUE; + break; + case _T('c'): + case _T('C'): + bConsole = TRUE; + break; + case _T('i'): + case _T('I'): + bInstall = TRUE; + lptDllCmdLine = argv[i]; + while (*lptDllCmdLine != 0 && *lptDllCmdLine != _T(':')) + lptDllCmdLine++; + if (*lptDllCmdLine == _T(':')) + lptDllCmdLine++; + break; + case _T('n'): + case _T('N'): + bNoRegister = TRUE; + break; + default: + if (!lptFuncName) + lptFuncName = argv[i]; + } + } + else { + nDllCount++; + } + } + + // An unrecognized flag was used, display a message and show available options + if (lptFuncName) { + lptMsgBuffer = (LPTSTR)malloc((_tcslen(UsageMessage) - 2 + _tcslen(InvalidFlag) - 2 + _tcslen(lptFuncName) + 1) * sizeof(TCHAR)); + _stprintf(lptMsgBuffer + (_tcslen(UsageMessage) - 2),InvalidFlag,lptFuncName); + _stprintf(lptMsgBuffer,UsageMessage,lptMsgBuffer + (_tcslen(UsageMessage) - 2)); + DisplayMessage(bConsole,bSilent,lptMsgBuffer,ModuleTitle,MB_ICONEXCLAMATION); + free(lptMsgBuffer); + GlobalFree(argv); + return EXITCODE_PARAMERROR; + } + + // /n was used without /i, display a message and show available options + if (bNoRegister && (!bInstall)) { + lptMsgBuffer = (LPTSTR)malloc((_tcslen(UsageMessage) - 2 + _tcslen(SwitchN_NoI) + 1) * sizeof(TCHAR)); + _stprintf(lptMsgBuffer,UsageMessage,SwitchN_NoI); + DisplayMessage(bConsole,bSilent,lptMsgBuffer,ModuleTitle,MB_ICONEXCLAMATION); + free(lptMsgBuffer); + GlobalFree(argv); + return EXITCODE_PARAMERROR; + } + + // No dll was specified, display a message and show available options + if (nDllCount == 0) { + lptMsgBuffer = (LPTSTR)malloc((_tcslen(UsageMessage) - 2 + _tcslen(NoDllSpecified) + 1) * sizeof(TCHAR)); + _stprintf(lptMsgBuffer,UsageMessage,NoDllSpecified); + DisplayMessage(bConsole,bSilent,lptMsgBuffer,ModuleTitle,MB_ICONEXCLAMATION); + free(lptMsgBuffer); + GlobalFree(argv); + return EXITCODE_PARAMERROR; + } + + nRetValue = EXITCODE_SUCCESS; + if (!bUnregister) { + lpFuncName = szDllRegister; + lptFuncName = tszDllRegister; + } + else { + lpFuncName = szDllUnregister; + lptFuncName = tszDllUnregister; + } + + if (lptDllCmdLine) + lpwDllCmdLine = ConvertToWideChar(lptDllCmdLine); + else + lpwDllCmdLine = 0; + + // Initialize OLE32 before attempting to register the + // dll. Some dll's require this to register properly + OleInitialize(0); + + // (Un)register every dll whose filename was passed in the command-line string + for (i = 1; i < argc; i++) { + // Arguments that do not start with a slash (/) are filenames + if (*argv[i] != _T('/')) { + lptDllName = argv[i]; + + // Everything is all setup, so load the dll now + hDll = LoadLibraryEx(lptDllName,0,LOAD_WITH_ALTERED_SEARCH_PATH); + if (hDll) { + if (!bNoRegister) { + // Get the address of DllRegisterServer or DllUnregisterServer + fnDllRegister = (DLLREGISTER)GetProcAddress(hDll,lpFuncName); + if (fnDllRegister) { + // If the function exists, call it + hResult = fnDllRegister(); + if (hResult == S_OK) { + // (Un)register succeeded, display a message + lptMsgBuffer = (LPTSTR)malloc((_tcslen(SuccessMessage) - 4 + _tcslen(lptFuncName) + _tcslen(lptDllName) + 1) * sizeof(TCHAR)); + _stprintf(lptMsgBuffer,SuccessMessage,lptFuncName,lptDllName); + DisplayMessage(bConsole,bSilent,lptMsgBuffer,ModuleTitle,MB_ICONINFORMATION); + } + else { + // (Un)register failed, display a message + lptMsgBuffer = (LPTSTR)malloc((_tcslen(FailureMessage) + _tcslen(lptFuncName) + _tcslen(lptDllName) + 1) * sizeof(TCHAR)); + _stprintf(lptMsgBuffer,FailureMessage,lptFuncName,lptDllName,hResult); + DisplayMessage(bConsole,bSilent,lptMsgBuffer,ModuleTitle,MB_ICONEXCLAMATION); + } + free(lptMsgBuffer); + if (hResult != S_OK) + nRetValue = EXITCODE_FAILURE; + } + else { + FreeLibrary(hDll); + // Dll(Un)register was not found, display an error message + lptMsgBuffer = (LPTSTR)malloc((_tcslen(MissingEntry) - 8 + _tcslen(lptFuncName) * 2 + _tcslen(lptDllName) * 2 + 1) * sizeof(TCHAR)); + _stprintf(lptMsgBuffer,MissingEntry,lptDllName,lptFuncName,lptFuncName,lptDllName); + DisplayMessage(bConsole,bSilent,lptMsgBuffer,ModuleTitle,MB_ICONEXCLAMATION); + free(lptMsgBuffer); + nRetValue = EXITCODE_NOENTRY; + } + } + + if (bInstall) { + // Get the address of DllInstall + fnDllInstall = (DLLINSTALL)GetProcAddress(hDll,szDllInstall); + if (fnDllInstall) { + // If the function exists, call it + if (!bUnregister) + hResult = fnDllInstall(1,lpwDllCmdLine); + else + hResult = fnDllInstall(0,lpwDllCmdLine); + if (hResult == S_OK) { + // (Un)install succeeded, display a message + lptMsgBuffer = (LPTSTR)malloc((_tcslen(SuccessMessage) - 4 + _tcslen(tszDllInstall) + _tcslen(lptDllName) + 1) * sizeof(TCHAR)); + _stprintf(lptMsgBuffer,SuccessMessage,tszDllInstall,lptDllName); + DisplayMessage(bConsole,bSilent,lptMsgBuffer,ModuleTitle,MB_ICONINFORMATION); + } + else { + // (Un)install failed, display a message + lptMsgBuffer = (LPTSTR)malloc((_tcslen(FailureMessage) + _tcslen(tszDllInstall) + _tcslen(lptDllName) + 1) * sizeof(TCHAR)); + _stprintf(lptMsgBuffer,FailureMessage,tszDllInstall,lptDllName,hResult); + DisplayMessage(bConsole,bSilent,lptMsgBuffer,ModuleTitle,MB_ICONEXCLAMATION); + } + free(lptMsgBuffer); + if (hResult != S_OK) + nRetValue = EXITCODE_FAILURE; + } + else { + FreeLibrary(hDll); + // DllInstall was not found, display an error message + lptMsgBuffer = (LPTSTR)malloc((_tcslen(MissingEntry) - 8 + _tcslen(tszDllInstall) * 2 + _tcslen(lptDllName) * 2 + 1) * sizeof(TCHAR)); + _stprintf(lptMsgBuffer,MissingEntry,lptDllName,tszDllInstall,tszDllInstall,lptDllName); + DisplayMessage(bConsole,bSilent,lptMsgBuffer,ModuleTitle,MB_ICONEXCLAMATION); + free(lptMsgBuffer); + nRetValue = EXITCODE_NOENTRY; + } + } + + // The dll function has finished executing, so unload it + FreeLibrary(hDll); + } + else { + // The dll could not be loaded; display an error message + dwErr = GetLastError(); + lptMsgBuffer = (LPTSTR)malloc((_tcslen(DllNotLoaded) + 2 + _tcslen(lptDllName) + 1) * sizeof(TCHAR)); + _stprintf(lptMsgBuffer,DllNotLoaded,lptDllName,dwErr); + DisplayMessage(bConsole,bSilent,lptMsgBuffer,ModuleTitle,MB_ICONEXCLAMATION); + free(lptMsgBuffer); + nRetValue = EXITCODE_LOADERROR; + } + } + } + + if (lpwDllCmdLine) + FreeConvertedWideChar(lpwDllCmdLine); + GlobalFree(argv); + OleUninitialize(); + return nRetValue; +} + diff --git a/reactos/apps/utils/rundll32/rundll32.c b/reactos/apps/utils/rundll32/rundll32.c index cf7f99edf87..560e60b30d4 100644 --- a/reactos/apps/utils/rundll32/rundll32.c +++ b/reactos/apps/utils/rundll32/rundll32.c @@ -1,467 +1,467 @@ -/* - * ReactOS rundll32 - * Copyright (C) 2003-2004 ReactOS Team - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS rundll32.exe - * FILE: apps/utils/rundll32/rundll32.c - * PURPOSE: Run a DLL as a program - * PROGRAMMER: ShadowFlare (blakflare@hotmail.com) - */ - -#define WIN32_LEAN_AND_MEAN - -// Both UNICODE and _UNICODE must be either defined or undefined -// because some headers use UNICODE and others use _UNICODE -#ifdef UNICODE -#ifndef _UNICODE -#define _UNICODE -#endif -#else -#ifdef _UNICODE -#define UNICODE -#endif -#endif - -#include <windows.h> -#include <stdio.h> -#include <string.h> -#include <malloc.h> -#include <tchar.h> - -typedef int (WINAPI *DllWinMainW)( - HWND hWnd, - HINSTANCE hInstance, - LPWSTR lpwCmdLine, - int nCmdShow -); -typedef int (WINAPI *DllWinMainA)( - HWND hWnd, - HINSTANCE hInstance, - LPSTR lpCmdLine, - int nCmdShow -); - -LPCTSTR DllNotLoaded = _T("LoadLibrary failed to load \"%s\""); -LPCTSTR MissingEntry = _T("Missing entry point:%s\nIn %s"); -LPCTSTR rundll32_wtitle = _T("rundll32"); -LPCTSTR rundll32_wclass = _T("rundll32_window"); -TCHAR ModuleFileName[MAX_PATH+1]; -LPTSTR ModuleTitle; - -// CommandLineToArgv converts a command-line string to argc and -// argv similar to the ones in the standard main function. -// This is a specialized version coded specifically for rundll32 -// and is not intended to be used in any other program. -LPTSTR *WINAPI CommandLineToArgv(LPCTSTR lpCmdLine, int *lpArgc) -{ - LPTSTR *argv, lpSrc, lpDest, lpArg; - int argc, nBSlash, nNames; - BOOL bInQuotes, bFirstChar; - - // If null was passed in for lpCmdLine, there are no arguments - if (!lpCmdLine) { - if (lpArgc) - *lpArgc = 0; - return 0; - } - - lpSrc = (LPTSTR)lpCmdLine; - // Skip spaces at beginning - while (*lpSrc == _T(' ') || *lpSrc == _T('\t')) - lpSrc++; - - // If command-line starts with null, there are no arguments - if (*lpSrc == 0) { - if (lpArgc) - *lpArgc = 0; - return 0; - } - - lpArg = lpSrc; - argc = 0; - nBSlash = 0; - bInQuotes = FALSE; - bFirstChar = TRUE; - nNames = 0; - - // Count the number of arguments - while (nNames < 4) { - if (*lpSrc == 0 || (*lpSrc == _T(',') && nNames == 2) || ((*lpSrc == _T(' ') || *lpSrc == _T('\t')) && !bInQuotes)) { - // Whitespace not enclosed in quotes signals the start of another argument - argc++; - - // Skip whitespace between arguments - while (*lpSrc == _T(' ') || *lpSrc == _T('\t') || (*lpSrc == _T(',') && nNames == 2)) - lpSrc++; - if (*lpSrc == 0) - break; - if (nNames >= 3) { - // Increment the count for the last argument - argc++; - break; - } - nBSlash = 0; - bFirstChar = TRUE; - continue; - } - else if (*lpSrc == _T('\\')) { - // Count consecutive backslashes - nBSlash++; - bFirstChar = FALSE; - } - else if (*lpSrc == _T('\"') && !(nBSlash & 1)) { - // Open or close quotes - bInQuotes = !bInQuotes; - nBSlash = 0; - } - else { - // Some other character - nBSlash = 0; - if (bFirstChar && ((*lpSrc != _T('/') && nNames <= 1) || nNames > 1)) - nNames++; - bFirstChar = FALSE; - } - lpSrc++; - } - - // Allocate space for the pointers in argv and the strings in one block - argv = (LPTSTR *)malloc(argc * sizeof(LPTSTR) + (_tcslen(lpArg) + 1) * sizeof(TCHAR)); - - if (!argv) { - // Memory allocation failed - if (lpArgc) - *lpArgc = 0; - return 0; - } - - lpSrc = lpArg; - lpDest = lpArg = (LPTSTR)(argv + argc); - argc = 0; - nBSlash = 0; - bInQuotes = FALSE; - bFirstChar = TRUE; - nNames = 0; - - // Fill the argument array - while (nNames < 4) { - if (*lpSrc == 0 || (*lpSrc == _T(',') && nNames == 2) || ((*lpSrc == _T(' ') || *lpSrc == _T('\t')) && !bInQuotes)) { - // Whitespace not enclosed in quotes signals the start of another argument - // Null-terminate argument - *lpDest++ = 0; - argv[argc++] = lpArg; - - // Skip whitespace between arguments - while (*lpSrc == _T(' ') || *lpSrc == _T('\t') || (*lpSrc == _T(',') && nNames == 2)) - lpSrc++; - if (*lpSrc == 0) - break; - lpArg = lpDest; - if (nNames >= 3) { - // Copy the rest of the command-line to the last argument - argv[argc++] = lpArg; - _tcscpy(lpArg,lpSrc); - break; - } - nBSlash = 0; - bFirstChar = TRUE; - continue; - } - else if (*lpSrc == _T('\\')) { - *lpDest++ = _T('\\'); - lpSrc++; - - // Count consecutive backslashes - nBSlash++; - bFirstChar = FALSE; - } - else if (*lpSrc == _T('\"')) { - if (!(nBSlash & 1)) { - // If an even number of backslashes are before the quotes, - // the quotes don't go in the output - lpDest -= nBSlash / 2; - bInQuotes = !bInQuotes; - } - else { - // If an odd number of backslashes are before the quotes, - // output a quote - lpDest -= (nBSlash + 1) / 2; - *lpDest++ = _T('\"'); - bFirstChar = FALSE; - } - lpSrc++; - nBSlash = 0; - } - else { - // Copy other characters - if (bFirstChar && ((*lpSrc != _T('/') && nNames <= 1) || nNames > 1)) - nNames++; - *lpDest++ = *lpSrc++; - nBSlash = 0; - bFirstChar = FALSE; - } - } - - if (lpArgc) - *lpArgc = argc; - return argv; -} - -void GetModuleTitle(void) -{ - LPTSTR lpStr; - - GetModuleFileName(0,ModuleFileName,MAX_PATH); - ModuleTitle = ModuleFileName; - - for (lpStr = ModuleFileName;*lpStr;lpStr++) { - if (*lpStr == _T('\\')) - ModuleTitle = lpStr+1; - } - - for (lpStr = ModuleTitle;*lpStr;lpStr++) { - if (_tcsicmp(lpStr,_T(".exe"))==0) - break; - } - - *lpStr = 0; -} - -// The macro ConvertToWideChar takes a tstring parameter and returns -// a pointer to a unicode string. A conversion is performed if -// neccessary. FreeConvertedWideChar string should be used on the -// return value of ConvertToWideChar when the string is no longer -// needed. The original string or the string that is returned -// should not be modified until FreeConvertedWideChar has been called. -#ifdef UNICODE -#define ConvertToWideChar(lptString) (lptString) -#define FreeConvertedWideChar(lpwString) -#else - -LPWSTR ConvertToWideChar(LPCSTR lpString) -{ - LPWSTR lpwString; - size_t nStrLen; - - nStrLen = strlen(lpString) + 1; - - lpwString = (LPWSTR)malloc(nStrLen * sizeof(WCHAR)); - MultiByteToWideChar(0,0,lpString,nStrLen,lpwString,nStrLen); - - return lpwString; -} - -#define FreeConvertedWideChar(lpwString) free(lpwString) -#endif - -// The macro ConvertToMultiByte takes a tstring parameter and returns -// a pointer to an ansi string. A conversion is performed if -// neccessary. FreeConvertedMultiByte string should be used on the -// return value of ConvertToMultiByte when the string is no longer -// needed. The original string or the string that is returned -// should not be modified until FreeConvertedMultiByte has been called. -#ifdef UNICODE -#define ConvertToMultiByte(lptString) DuplicateToMultiByte(lptString,0) -#define FreeConvertedMultiByte(lpaString) free(lpaString) -#else -#define ConvertToMultiByte(lptString) (lptString) -#define FreeConvertedMultiByte(lpaString) -#endif - -// DuplicateToMultiByte takes a tstring parameter and always returns -// a pointer to a duplicate ansi string. If nBufferSize is zero, -// the buffer length is the exact size of the string plus the -// terminating null. If nBufferSize is nonzero, the buffer length -// is equal to nBufferSize. As with strdup, free should be called -// for the returned string when it is no longer needed. -LPSTR DuplicateToMultiByte(LPCTSTR lptString, size_t nBufferSize) -{ - LPSTR lpString; - size_t nStrLen; - - nStrLen = _tcslen(lptString) + 1; - if (nBufferSize == 0) nBufferSize = nStrLen; - - lpString = (LPSTR)malloc(nBufferSize); -#ifdef UNICODE - WideCharToMultiByte(0,0,lptString,nStrLen,lpString,nBufferSize,0,0); -#else - strncpy(lpString,lptString,nBufferSize); -#endif - - return lpString; -} - -LRESULT CALLBACK EmptyWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - return DefWindowProc(hWnd, uMsg, wParam, lParam); -} - -// Registers a minimal window class for passing to the dll function -ATOM RegisterBlankClass(HINSTANCE hInstance) -{ - WNDCLASSEX wcex; - - wcex.cbSize = sizeof(WNDCLASSEX); - - wcex.style = 0; - wcex.lpfnWndProc = EmptyWindowProc; - wcex.cbClsExtra = 0; - wcex.cbWndExtra = 0; - wcex.hInstance = hInstance; - wcex.hIcon = 0; - wcex.hCursor = 0; - wcex.hbrBackground = 0; - wcex.lpszMenuName = 0; - wcex.lpszClassName = rundll32_wclass; - wcex.hIconSm = 0; - - return RegisterClassEx(&wcex); -} - -int WINAPI WinMain( - HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpCmdLineA, - int nCmdShow -) -{ - int argc; - LPTSTR *argv; - LPTSTR lptCmdLine,lptDllName,lptFuncName,lptMsgBuffer; - LPSTR lpFuncName,lpaCmdLine; - LPWSTR lpwCmdLine; - HMODULE hDll; - DllWinMainW fnDllWinMainW; - DllWinMainA fnDllWinMainA; - HWND hWindow; - int nRetVal,i; - size_t nStrLen; - - // Get command-line in argc-argv format - argv = CommandLineToArgv(GetCommandLine(),&argc); - - // Skip all beginning arguments starting with a slash (/) - for (i = 1; i < argc; i++) - if (*argv[i] != _T('/')) break; - - // If no dll was specified, there is nothing to do - if (i >= argc) { - if (argv) free(argv); - return 0; - } - - lptDllName = argv[i++]; - - // The next argument, which specifies the name of the dll function, - // can either have a comma between it and the dll filename or a space. - // Using a comma here is the preferred method - if (i < argc) - lptFuncName = argv[i++]; - else - lptFuncName = _T(""); - - // If no function name was specified, nothing needs to be done - if (!*lptFuncName) { - if (argv) free(argv); - return 0; - } - - // The rest of the arguments will be passed to dll function - if (i < argc) - lptCmdLine = argv[i]; - else - lptCmdLine = _T(""); - - nRetVal = 0; - - // Everything is all setup, so load the dll now - hDll = LoadLibrary(lptDllName); - if (hDll) { - nStrLen = _tcslen(lptFuncName); - // Make a non-unicode version of the function name, - // since that is all GetProcAddress accepts - lpFuncName = DuplicateToMultiByte(lptFuncName,nStrLen + 2); - -#ifdef UNICODE - lpFuncName[nStrLen] = 'W'; - lpFuncName[nStrLen+1] = 0; - // Get address of unicode version of the dll function if it exists - fnDllWinMainW = (DllWinMainW)GetProcAddress(hDll,lpFuncName); - fnDllWinMainA = 0; - if (!fnDllWinMainW) { - // If no unicode function was found, get the address of the non-unicode function - lpFuncName[nStrLen] = 'A'; - fnDllWinMainA = (DllWinMainA)GetProcAddress(hDll,lpFuncName); - if (!fnDllWinMainA) { - // If first non-unicode function was not found, get the address - // of the other non-unicode function - lpFuncName[nStrLen] = 0; - fnDllWinMainA = (DllWinMainA)GetProcAddress(hDll,lpFuncName); - } - } -#else - // Get address of non-unicode version of the dll function if it exists - fnDllWinMainA = (DllWinMainA)GetProcAddress(hDll,lpFuncName); - fnDllWinMainW = 0; - if (!fnDllWinMainA) { - // If first non-unicode function was not found, get the address - // of the other non-unicode function - lpFuncName[nStrLen] = 'A'; - lpFuncName[nStrLen+1] = 0; - fnDllWinMainA = (DllWinMainA)GetProcAddress(hDll,lpFuncName); - if (!fnDllWinMainA) { - // If non-unicode function was not found, get the address of the unicode function - lpFuncName[nStrLen] = 'W'; - fnDllWinMainW = (DllWinMainW)GetProcAddress(hDll,lpFuncName); - } - } -#endif - - free(lpFuncName); - - RegisterBlankClass(hInstance); - // Create a window so we can pass a window handle to - // the dll function; this is required - hWindow = CreateWindowEx(0,rundll32_wclass,rundll32_wtitle,0,CW_USEDEFAULT,0,CW_USEDEFAULT,0,0,0,hInstance,0); - - if (fnDllWinMainW) { - // Convert the command-line string to unicode and call the dll function - lpwCmdLine = ConvertToWideChar(lptCmdLine); - nRetVal = fnDllWinMainW(hWindow,hInstance,lpwCmdLine,nCmdShow); - FreeConvertedWideChar(lpwCmdLine); - } - else if (fnDllWinMainA) { - // Convert the command-line string to ansi and call the dll function - lpaCmdLine = ConvertToMultiByte(lptCmdLine); - nRetVal = fnDllWinMainA(hWindow,hInstance,lpaCmdLine,nCmdShow); - FreeConvertedMultiByte(lpaCmdLine); - } - else { - // The specified dll function was not found; display an error message - GetModuleTitle(); - lptMsgBuffer = (LPTSTR)malloc((_tcslen(MissingEntry) - 4 + _tcslen(lptFuncName) + _tcslen(lptDllName) + 1) * sizeof(TCHAR)); - _stprintf(lptMsgBuffer,MissingEntry,lptFuncName,lptDllName); - MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONERROR); - free(lptMsgBuffer); - } - - DestroyWindow(hWindow); - UnregisterClass(rundll32_wclass,hInstance); - - // The dll function has finished executing, so unload it - FreeLibrary(hDll); - } - else { - // The dll could not be loaded; display an error message - GetModuleTitle(); - lptMsgBuffer = (LPTSTR)malloc((_tcslen(DllNotLoaded) - 2 + _tcslen(lptDllName) + 1) * sizeof(TCHAR)); - _stprintf(lptMsgBuffer,DllNotLoaded,lptDllName); - MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONERROR); - free(lptMsgBuffer); - } - - if (argv) free(argv); - return nRetVal; -} - +/* + * ReactOS rundll32 + * Copyright (C) 2003-2004 ReactOS Team + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS rundll32.exe + * FILE: apps/utils/rundll32/rundll32.c + * PURPOSE: Run a DLL as a program + * PROGRAMMER: ShadowFlare (blakflare@hotmail.com) + */ + +#define WIN32_LEAN_AND_MEAN + +// Both UNICODE and _UNICODE must be either defined or undefined +// because some headers use UNICODE and others use _UNICODE +#ifdef UNICODE +#ifndef _UNICODE +#define _UNICODE +#endif +#else +#ifdef _UNICODE +#define UNICODE +#endif +#endif + +#include <windows.h> +#include <stdio.h> +#include <string.h> +#include <malloc.h> +#include <tchar.h> + +typedef int (WINAPI *DllWinMainW)( + HWND hWnd, + HINSTANCE hInstance, + LPWSTR lpwCmdLine, + int nCmdShow +); +typedef int (WINAPI *DllWinMainA)( + HWND hWnd, + HINSTANCE hInstance, + LPSTR lpCmdLine, + int nCmdShow +); + +LPCTSTR DllNotLoaded = _T("LoadLibrary failed to load \"%s\""); +LPCTSTR MissingEntry = _T("Missing entry point:%s\nIn %s"); +LPCTSTR rundll32_wtitle = _T("rundll32"); +LPCTSTR rundll32_wclass = _T("rundll32_window"); +TCHAR ModuleFileName[MAX_PATH+1]; +LPTSTR ModuleTitle; + +// CommandLineToArgv converts a command-line string to argc and +// argv similar to the ones in the standard main function. +// This is a specialized version coded specifically for rundll32 +// and is not intended to be used in any other program. +LPTSTR *WINAPI CommandLineToArgv(LPCTSTR lpCmdLine, int *lpArgc) +{ + LPTSTR *argv, lpSrc, lpDest, lpArg; + int argc, nBSlash, nNames; + BOOL bInQuotes, bFirstChar; + + // If null was passed in for lpCmdLine, there are no arguments + if (!lpCmdLine) { + if (lpArgc) + *lpArgc = 0; + return 0; + } + + lpSrc = (LPTSTR)lpCmdLine; + // Skip spaces at beginning + while (*lpSrc == _T(' ') || *lpSrc == _T('\t')) + lpSrc++; + + // If command-line starts with null, there are no arguments + if (*lpSrc == 0) { + if (lpArgc) + *lpArgc = 0; + return 0; + } + + lpArg = lpSrc; + argc = 0; + nBSlash = 0; + bInQuotes = FALSE; + bFirstChar = TRUE; + nNames = 0; + + // Count the number of arguments + while (nNames < 4) { + if (*lpSrc == 0 || (*lpSrc == _T(',') && nNames == 2) || ((*lpSrc == _T(' ') || *lpSrc == _T('\t')) && !bInQuotes)) { + // Whitespace not enclosed in quotes signals the start of another argument + argc++; + + // Skip whitespace between arguments + while (*lpSrc == _T(' ') || *lpSrc == _T('\t') || (*lpSrc == _T(',') && nNames == 2)) + lpSrc++; + if (*lpSrc == 0) + break; + if (nNames >= 3) { + // Increment the count for the last argument + argc++; + break; + } + nBSlash = 0; + bFirstChar = TRUE; + continue; + } + else if (*lpSrc == _T('\\')) { + // Count consecutive backslashes + nBSlash++; + bFirstChar = FALSE; + } + else if (*lpSrc == _T('\"') && !(nBSlash & 1)) { + // Open or close quotes + bInQuotes = !bInQuotes; + nBSlash = 0; + } + else { + // Some other character + nBSlash = 0; + if (bFirstChar && ((*lpSrc != _T('/') && nNames <= 1) || nNames > 1)) + nNames++; + bFirstChar = FALSE; + } + lpSrc++; + } + + // Allocate space for the pointers in argv and the strings in one block + argv = (LPTSTR *)malloc(argc * sizeof(LPTSTR) + (_tcslen(lpArg) + 1) * sizeof(TCHAR)); + + if (!argv) { + // Memory allocation failed + if (lpArgc) + *lpArgc = 0; + return 0; + } + + lpSrc = lpArg; + lpDest = lpArg = (LPTSTR)(argv + argc); + argc = 0; + nBSlash = 0; + bInQuotes = FALSE; + bFirstChar = TRUE; + nNames = 0; + + // Fill the argument array + while (nNames < 4) { + if (*lpSrc == 0 || (*lpSrc == _T(',') && nNames == 2) || ((*lpSrc == _T(' ') || *lpSrc == _T('\t')) && !bInQuotes)) { + // Whitespace not enclosed in quotes signals the start of another argument + // Null-terminate argument + *lpDest++ = 0; + argv[argc++] = lpArg; + + // Skip whitespace between arguments + while (*lpSrc == _T(' ') || *lpSrc == _T('\t') || (*lpSrc == _T(',') && nNames == 2)) + lpSrc++; + if (*lpSrc == 0) + break; + lpArg = lpDest; + if (nNames >= 3) { + // Copy the rest of the command-line to the last argument + argv[argc++] = lpArg; + _tcscpy(lpArg,lpSrc); + break; + } + nBSlash = 0; + bFirstChar = TRUE; + continue; + } + else if (*lpSrc == _T('\\')) { + *lpDest++ = _T('\\'); + lpSrc++; + + // Count consecutive backslashes + nBSlash++; + bFirstChar = FALSE; + } + else if (*lpSrc == _T('\"')) { + if (!(nBSlash & 1)) { + // If an even number of backslashes are before the quotes, + // the quotes don't go in the output + lpDest -= nBSlash / 2; + bInQuotes = !bInQuotes; + } + else { + // If an odd number of backslashes are before the quotes, + // output a quote + lpDest -= (nBSlash + 1) / 2; + *lpDest++ = _T('\"'); + bFirstChar = FALSE; + } + lpSrc++; + nBSlash = 0; + } + else { + // Copy other characters + if (bFirstChar && ((*lpSrc != _T('/') && nNames <= 1) || nNames > 1)) + nNames++; + *lpDest++ = *lpSrc++; + nBSlash = 0; + bFirstChar = FALSE; + } + } + + if (lpArgc) + *lpArgc = argc; + return argv; +} + +void GetModuleTitle(void) +{ + LPTSTR lpStr; + + GetModuleFileName(0,ModuleFileName,MAX_PATH); + ModuleTitle = ModuleFileName; + + for (lpStr = ModuleFileName;*lpStr;lpStr++) { + if (*lpStr == _T('\\')) + ModuleTitle = lpStr+1; + } + + for (lpStr = ModuleTitle;*lpStr;lpStr++) { + if (_tcsicmp(lpStr,_T(".exe"))==0) + break; + } + + *lpStr = 0; +} + +// The macro ConvertToWideChar takes a tstring parameter and returns +// a pointer to a unicode string. A conversion is performed if +// neccessary. FreeConvertedWideChar string should be used on the +// return value of ConvertToWideChar when the string is no longer +// needed. The original string or the string that is returned +// should not be modified until FreeConvertedWideChar has been called. +#ifdef UNICODE +#define ConvertToWideChar(lptString) (lptString) +#define FreeConvertedWideChar(lpwString) +#else + +LPWSTR ConvertToWideChar(LPCSTR lpString) +{ + LPWSTR lpwString; + size_t nStrLen; + + nStrLen = strlen(lpString) + 1; + + lpwString = (LPWSTR)malloc(nStrLen * sizeof(WCHAR)); + MultiByteToWideChar(0,0,lpString,nStrLen,lpwString,nStrLen); + + return lpwString; +} + +#define FreeConvertedWideChar(lpwString) free(lpwString) +#endif + +// The macro ConvertToMultiByte takes a tstring parameter and returns +// a pointer to an ansi string. A conversion is performed if +// neccessary. FreeConvertedMultiByte string should be used on the +// return value of ConvertToMultiByte when the string is no longer +// needed. The original string or the string that is returned +// should not be modified until FreeConvertedMultiByte has been called. +#ifdef UNICODE +#define ConvertToMultiByte(lptString) DuplicateToMultiByte(lptString,0) +#define FreeConvertedMultiByte(lpaString) free(lpaString) +#else +#define ConvertToMultiByte(lptString) (lptString) +#define FreeConvertedMultiByte(lpaString) +#endif + +// DuplicateToMultiByte takes a tstring parameter and always returns +// a pointer to a duplicate ansi string. If nBufferSize is zero, +// the buffer length is the exact size of the string plus the +// terminating null. If nBufferSize is nonzero, the buffer length +// is equal to nBufferSize. As with strdup, free should be called +// for the returned string when it is no longer needed. +LPSTR DuplicateToMultiByte(LPCTSTR lptString, size_t nBufferSize) +{ + LPSTR lpString; + size_t nStrLen; + + nStrLen = _tcslen(lptString) + 1; + if (nBufferSize == 0) nBufferSize = nStrLen; + + lpString = (LPSTR)malloc(nBufferSize); +#ifdef UNICODE + WideCharToMultiByte(0,0,lptString,nStrLen,lpString,nBufferSize,0,0); +#else + strncpy(lpString,lptString,nBufferSize); +#endif + + return lpString; +} + +LRESULT CALLBACK EmptyWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + return DefWindowProc(hWnd, uMsg, wParam, lParam); +} + +// Registers a minimal window class for passing to the dll function +ATOM RegisterBlankClass(HINSTANCE hInstance) +{ + WNDCLASSEX wcex; + + wcex.cbSize = sizeof(WNDCLASSEX); + + wcex.style = 0; + wcex.lpfnWndProc = EmptyWindowProc; + wcex.cbClsExtra = 0; + wcex.cbWndExtra = 0; + wcex.hInstance = hInstance; + wcex.hIcon = 0; + wcex.hCursor = 0; + wcex.hbrBackground = 0; + wcex.lpszMenuName = 0; + wcex.lpszClassName = rundll32_wclass; + wcex.hIconSm = 0; + + return RegisterClassEx(&wcex); +} + +int WINAPI WinMain( + HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpCmdLineA, + int nCmdShow +) +{ + int argc; + LPTSTR *argv; + LPTSTR lptCmdLine,lptDllName,lptFuncName,lptMsgBuffer; + LPSTR lpFuncName,lpaCmdLine; + LPWSTR lpwCmdLine; + HMODULE hDll; + DllWinMainW fnDllWinMainW; + DllWinMainA fnDllWinMainA; + HWND hWindow; + int nRetVal,i; + size_t nStrLen; + + // Get command-line in argc-argv format + argv = CommandLineToArgv(GetCommandLine(),&argc); + + // Skip all beginning arguments starting with a slash (/) + for (i = 1; i < argc; i++) + if (*argv[i] != _T('/')) break; + + // If no dll was specified, there is nothing to do + if (i >= argc) { + if (argv) free(argv); + return 0; + } + + lptDllName = argv[i++]; + + // The next argument, which specifies the name of the dll function, + // can either have a comma between it and the dll filename or a space. + // Using a comma here is the preferred method + if (i < argc) + lptFuncName = argv[i++]; + else + lptFuncName = _T(""); + + // If no function name was specified, nothing needs to be done + if (!*lptFuncName) { + if (argv) free(argv); + return 0; + } + + // The rest of the arguments will be passed to dll function + if (i < argc) + lptCmdLine = argv[i]; + else + lptCmdLine = _T(""); + + nRetVal = 0; + + // Everything is all setup, so load the dll now + hDll = LoadLibrary(lptDllName); + if (hDll) { + nStrLen = _tcslen(lptFuncName); + // Make a non-unicode version of the function name, + // since that is all GetProcAddress accepts + lpFuncName = DuplicateToMultiByte(lptFuncName,nStrLen + 2); + +#ifdef UNICODE + lpFuncName[nStrLen] = 'W'; + lpFuncName[nStrLen+1] = 0; + // Get address of unicode version of the dll function if it exists + fnDllWinMainW = (DllWinMainW)GetProcAddress(hDll,lpFuncName); + fnDllWinMainA = 0; + if (!fnDllWinMainW) { + // If no unicode function was found, get the address of the non-unicode function + lpFuncName[nStrLen] = 'A'; + fnDllWinMainA = (DllWinMainA)GetProcAddress(hDll,lpFuncName); + if (!fnDllWinMainA) { + // If first non-unicode function was not found, get the address + // of the other non-unicode function + lpFuncName[nStrLen] = 0; + fnDllWinMainA = (DllWinMainA)GetProcAddress(hDll,lpFuncName); + } + } +#else + // Get address of non-unicode version of the dll function if it exists + fnDllWinMainA = (DllWinMainA)GetProcAddress(hDll,lpFuncName); + fnDllWinMainW = 0; + if (!fnDllWinMainA) { + // If first non-unicode function was not found, get the address + // of the other non-unicode function + lpFuncName[nStrLen] = 'A'; + lpFuncName[nStrLen+1] = 0; + fnDllWinMainA = (DllWinMainA)GetProcAddress(hDll,lpFuncName); + if (!fnDllWinMainA) { + // If non-unicode function was not found, get the address of the unicode function + lpFuncName[nStrLen] = 'W'; + fnDllWinMainW = (DllWinMainW)GetProcAddress(hDll,lpFuncName); + } + } +#endif + + free(lpFuncName); + + RegisterBlankClass(hInstance); + // Create a window so we can pass a window handle to + // the dll function; this is required + hWindow = CreateWindowEx(0,rundll32_wclass,rundll32_wtitle,0,CW_USEDEFAULT,0,CW_USEDEFAULT,0,0,0,hInstance,0); + + if (fnDllWinMainW) { + // Convert the command-line string to unicode and call the dll function + lpwCmdLine = ConvertToWideChar(lptCmdLine); + nRetVal = fnDllWinMainW(hWindow,hInstance,lpwCmdLine,nCmdShow); + FreeConvertedWideChar(lpwCmdLine); + } + else if (fnDllWinMainA) { + // Convert the command-line string to ansi and call the dll function + lpaCmdLine = ConvertToMultiByte(lptCmdLine); + nRetVal = fnDllWinMainA(hWindow,hInstance,lpaCmdLine,nCmdShow); + FreeConvertedMultiByte(lpaCmdLine); + } + else { + // The specified dll function was not found; display an error message + GetModuleTitle(); + lptMsgBuffer = (LPTSTR)malloc((_tcslen(MissingEntry) - 4 + _tcslen(lptFuncName) + _tcslen(lptDllName) + 1) * sizeof(TCHAR)); + _stprintf(lptMsgBuffer,MissingEntry,lptFuncName,lptDllName); + MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONERROR); + free(lptMsgBuffer); + } + + DestroyWindow(hWindow); + UnregisterClass(rundll32_wclass,hInstance); + + // The dll function has finished executing, so unload it + FreeLibrary(hDll); + } + else { + // The dll could not be loaded; display an error message + GetModuleTitle(); + lptMsgBuffer = (LPTSTR)malloc((_tcslen(DllNotLoaded) - 2 + _tcslen(lptDllName) + 1) * sizeof(TCHAR)); + _stprintf(lptMsgBuffer,DllNotLoaded,lptDllName); + MessageBox(0,lptMsgBuffer,ModuleTitle,MB_ICONERROR); + free(lptMsgBuffer); + } + + if (argv) free(argv); + return nRetVal; +} + From 4e2ccf1842cebf03be75a7d9ba6d84bee66c46f9 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Thu, 19 Feb 2004 19:44:39 +0000 Subject: [PATCH 0089/1463] added pool tags for better debugging svn path=/trunk/; revision=8266 --- reactos/subsys/win32k/ntuser/menu.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/menu.c b/reactos/subsys/win32k/ntuser/menu.c index d8625ed601a..974a7443bcf 100644 --- a/reactos/subsys/win32k/ntuser/menu.c +++ b/reactos/subsys/win32k/ntuser/menu.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: menu.c,v 1.44 2004/02/15 07:39:12 gvg Exp $ +/* $Id: menu.c,v 1.45 2004/02/19 19:44:39 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -43,6 +43,8 @@ #define NDEBUG #include <debug.h> +#define TAG_MENU TAG('M', 'E', 'N', 'U') + /* INTERNAL ******************************************************************/ /* maximum number of menu items a menu can contain */ @@ -325,7 +327,7 @@ IntCloneMenuItems(PMENU_OBJECT Destination, PMENU_OBJECT Source) Old = NewMenuItem; if(NewMenuItem) NewMenuItem->Next = MenuItem; - NewMenuItem = ExAllocatePool(PagedPool, sizeof(MENU_ITEM)); + NewMenuItem = ExAllocatePoolWithTag(PagedPool, sizeof(MENU_ITEM), TAG_MENU); if(!NewMenuItem) break; NewMenuItem->fType = MenuItem->fType; @@ -341,7 +343,7 @@ IntCloneMenuItems(PMENU_OBJECT Destination, PMENU_OBJECT Source) { NewMenuItem->Text.Length = 0; NewMenuItem->Text.MaximumLength = MenuItem->Text.MaximumLength; - NewMenuItem->Text.Buffer = (PWSTR)ExAllocatePool(PagedPool, MenuItem->Text.MaximumLength); + NewMenuItem->Text.Buffer = (PWSTR)ExAllocatePoolWithTag(PagedPool, MenuItem->Text.MaximumLength, TAG_MENU); if(!NewMenuItem->Text.Buffer) { ExFreePool(NewMenuItem); @@ -746,7 +748,7 @@ IntSetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, PROSMENUITEMINF Source = (PUNICODE_STRING)lpmii->dwTypeData; FreeMenuText(MenuItem); copylen = min((UINT)Source->MaximumLength, (lpmii->cch + 1) * sizeof(WCHAR)); - MenuItem->Text.Buffer = (PWSTR)ExAllocatePool(PagedPool, copylen); + MenuItem->Text.Buffer = (PWSTR)ExAllocatePoolWithTag(PagedPool, copylen, TAG_MENU); if(MenuItem->Text.Buffer) { MenuItem->Text.Length = 0; @@ -810,7 +812,7 @@ IntInsertMenuItem(PMENU_OBJECT MenuObject, UINT uItem, BOOL fByPosition, pos = -1; } - MenuItem = ExAllocatePool(PagedPool, sizeof(MENU_ITEM)); + MenuItem = ExAllocatePoolWithTag(PagedPool, sizeof(MENU_ITEM), TAG_MENU); if (NULL == MenuItem) { SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); From c0b75c3e30cae5ec5f306af8816608452769e918 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Thu, 19 Feb 2004 19:45:52 +0000 Subject: [PATCH 0090/1463] samlib is needed for 2nd stage setup svn path=/trunk/; revision=8268 --- 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 3064be317f7..f9c85199709 100755 --- a/reactos/bootdata/packages/reactos.dff +++ b/reactos/bootdata/packages/reactos.dff @@ -71,6 +71,7 @@ lib\ntdll\ntdll.dll 1 lib\ole32\ole32.dll 1 lib\oleaut32\oleaut32.dll 1 lib\rpcrt4\rpcrt4.dll 1 +lib\samlib\samlib.dll 1 lib\secur32\secur32.dll 1 lib\shell32\shell32.dll 1 lib\shlwapi\shlwapi.dll 1 From 8c80ebb0d1cb2c792b77e5a99cba8e65b3a03504 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Thu, 19 Feb 2004 20:24:22 +0000 Subject: [PATCH 0091/1463] remove duplicate windres include directory to get notepad build svn path=/trunk/; revision=8269 --- reactos/rules.mak | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/rules.mak b/reactos/rules.mak index e23920f6fc7..4ef0db56021 100644 --- a/reactos/rules.mak +++ b/reactos/rules.mak @@ -86,7 +86,7 @@ CPP = $(PREFIX)cpp AR = $(PREFIX)ar RC = $(PREFIX)windres WRC = $(WINE_TOP)/tools/wrc/wrc -RCINC = --include-dir $(PATH_TO_TOP)/include +# already defined via makefile "helper.mk": RCINC = --include-dir $(PATH_TO_TOP)/include OBJCOPY = $(PREFIX)objcopy OBJDUMP =$(PREFIX)objdump TOOLS_PATH = $(PATH_TO_TOP)/tools From 90fb2c7def698823014ef19107eeb086d8811b4d Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Thu, 19 Feb 2004 21:12:11 +0000 Subject: [PATCH 0092/1463] added pool tags for better debugging svn path=/trunk/; revision=8271 --- reactos/subsys/win32k/eng/mouse.c | 9 ++--- reactos/subsys/win32k/include/tags.h | 44 ++++++++++++++++++++++ reactos/subsys/win32k/ntuser/accelerator.c | 5 ++- reactos/subsys/win32k/ntuser/caret.c | 5 ++- reactos/subsys/win32k/ntuser/class.c | 9 +++-- reactos/subsys/win32k/ntuser/clipboard.c | 4 +- reactos/subsys/win32k/ntuser/hook.c | 5 +-- reactos/subsys/win32k/ntuser/hotkey.c | 6 +-- reactos/subsys/win32k/ntuser/keyboard.c | 18 +++++---- reactos/subsys/win32k/ntuser/menu.c | 13 +++---- reactos/subsys/win32k/ntuser/message.c | 5 +-- reactos/subsys/win32k/ntuser/misc.c | 5 ++- reactos/subsys/win32k/ntuser/msgqueue.c | 16 ++++---- reactos/subsys/win32k/ntuser/prop.c | 5 ++- reactos/subsys/win32k/ntuser/scrollbar.c | 5 ++- reactos/subsys/win32k/ntuser/timer.c | 11 +++--- reactos/subsys/win32k/ntuser/window.c | 13 +++---- reactos/subsys/win32k/ntuser/winpos.c | 5 ++- reactos/subsys/win32k/ntuser/winsta.c | 5 ++- reactos/subsys/win32k/objects/bezier.c | 7 ++-- reactos/subsys/win32k/objects/bitmaps.c | 9 +++-- reactos/subsys/win32k/objects/brush.c | 5 ++- reactos/subsys/win32k/objects/coord.c | 7 ++-- reactos/subsys/win32k/objects/dc.c | 7 ++-- reactos/subsys/win32k/objects/dib.c | 11 +++--- reactos/subsys/win32k/objects/fillshap.c | 11 +++--- reactos/subsys/win32k/objects/gdiobj.c | 11 +++--- reactos/subsys/win32k/objects/line.c | 19 +++++----- reactos/subsys/win32k/objects/palette.c | 9 +++-- reactos/subsys/win32k/objects/path.c | 9 +++-- reactos/subsys/win32k/objects/print.c | 7 ++-- reactos/subsys/win32k/objects/region.c | 21 ++++++----- reactos/subsys/win32k/objects/text.c | 17 +++++---- 33 files changed, 201 insertions(+), 137 deletions(-) create mode 100644 reactos/subsys/win32k/include/tags.h diff --git a/reactos/subsys/win32k/eng/mouse.c b/reactos/subsys/win32k/eng/mouse.c index 32a9b1241ad..65e94d18fde 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.60 2004/02/08 09:27:39 navaraf Exp $ +/* $Id: mouse.c,v 1.61 2004/02/19 21:12:09 weiden Exp $ * * PROJECT: ReactOS kernel * PURPOSE: Mouse @@ -43,6 +43,7 @@ #include "include/palette.h" #include "include/inteng.h" #include "include/eng.h" +#include "include/tags.h" #include <include/mouse.h> #define NDEBUG @@ -538,8 +539,6 @@ EnableMouse(HDC hDisplayDC) /* SOFTWARE MOUSE POINTER IMPLEMENTATION **************************************/ -#define MOUSE_TAG TAG('M', 'O', 'U', 'S') - VOID FASTCALL IntHideMousePointer(GDIDEVICE *ppdev, SURFOBJ *DestSurface) { @@ -753,7 +752,7 @@ EngSetPointerShape( Size.cx = ppdev->PointerAttributes.Width; Size.cy = ppdev->PointerAttributes.Height; - Bits = EngAllocMem(0, psoColor->cjBits, MOUSE_TAG); + Bits = EngAllocMem(0, psoColor->cjBits, TAG_MOUSE); memcpy(Bits, psoColor->pvBits, psoColor->cjBits); ppdev->PointerColorSurface = (HSURF)EngCreateBitmap(Size, @@ -770,7 +769,7 @@ EngSetPointerShape( Size.cx = ppdev->PointerAttributes.Width; Size.cy = ppdev->PointerAttributes.Height << 1; - Bits = EngAllocMem(0, psoMask->cjBits, MOUSE_TAG); + Bits = EngAllocMem(0, psoMask->cjBits, TAG_MOUSE); memcpy(Bits, psoMask->pvBits, psoMask->cjBits); ppdev->PointerMaskSurface = (HSURF)EngCreateBitmap(Size, diff --git a/reactos/subsys/win32k/include/tags.h b/reactos/subsys/win32k/include/tags.h new file mode 100644 index 00000000000..3dcf20d4016 --- /dev/null +++ b/reactos/subsys/win32k/include/tags.h @@ -0,0 +1,44 @@ +#ifndef _WIN32K_TAGS_H +#define _WIN32K_TAGS_H + +#define TAG_STRING TAG('S', 'T', 'R', ' ') /* string */ + +/* ntuser */ +#define TAG_MOUSE TAG('M', 'O', 'U', 'S') /* mouse */ +#define TAG_ACCEL TAG('A', 'C', 'C', 'L') /* accelerator */ +#define TAG_HOOK TAG('W', 'N', 'H', 'K') /* hook */ +#define TAG_HOTKEY TAG('H', 'O', 'T', 'K') /* hotkey */ +#define TAG_MENUITEM TAG('M', 'E', 'N', 'I') /* menu itme */ +#define TAG_MSG TAG('M', 'E', 'S', 'G') /* message */ +#define TAG_MSGQ TAG('M', 'S', 'G', 'Q') /* message queue */ +#define TAG_USRMSG TAG('U', 'M', 'S', 'G') /* user message */ +#define TAG_WNDPROP TAG('W', 'P', 'R', 'P') /* window property */ +#define TAG_WNAM TAG('W', 'N', 'A', 'M') /* window name */ +#define TAG_WINLIST TAG('W', 'N', 'L', 'S') /* window handle list */ +#define TAG_WININTLIST TAG('W', 'N', 'I', 'P') /* window internal pos */ +#define TAG_WINPROCLST TAG('W', 'N', 'P', 'L') /* window proc list */ +#define TAG_SBARINFO TAG('S', 'B', 'I', 'N') /* scrollbar info */ +#define TAG_TIMER TAG('T', 'I', 'M', 'R') /* timer entry */ +#define TAG_TIMERTD TAG('T', 'I', 'M', 'T') /* timer thread dereference list */ +#define TAG_TIMERBMP TAG('T', 'I', 'M', 'B') /* timers bitmap */ + +/* objects */ +#define TAG_BEZIER TAG('B', 'E', 'Z', 'R') /* bezier */ +#define TAG_BITMAP TAG('B', 'T', 'M', 'P') /* bitmap */ +#define TAG_PATBLT TAG('P', 'B', 'L', 'T') /* patblt */ +#define TAG_COORD TAG('C', 'O', 'R', 'D') /* coords */ +#define TAG_DC TAG('D', 'C', 'D', 'C') /* dc */ +#define TAG_GDIOBJ TAG('G', 'D', 'I', 'O') /* gdi obj */ +#define TAG_GDIHNDTBLE TAG('G', 'D', 'I', 'H') /* gdi handle table */ +#define TAG_DIB TAG('D', 'I', 'B', ' ') /* dib */ +#define TAG_COLORMAP TAG('C', 'O', 'L', 'M') /* color map */ +#define TAG_SHAPE TAG('S', 'H', 'A', 'P') /* shape */ +#define TAG_PALETTE TAG('P', 'A', 'L', 'E') /* palette */ +#define TAG_PALETTEMAP TAG('P', 'A', 'L', 'M') /* palette mapping */ +#define TAG_PATH TAG('P', 'A', 'T', 'H') /* path */ +#define TAG_PRINT TAG('P', 'R', 'N', 'T') /* print */ +#define TAG_REGION TAG('P', 'R', 'N', 'T') /* region */ +#define TAG_GDITEXT TAG('T', 'X', 'T', 'O') /* text */ +#define TAG_FONT TAG('F', 'N', 'T', 'O') /* font entry */ + +#endif /* _WIN32K_TAGS_H */ diff --git a/reactos/subsys/win32k/ntuser/accelerator.c b/reactos/subsys/win32k/ntuser/accelerator.c index 7d45f7ac211..405e21c4792 100644 --- a/reactos/subsys/win32k/ntuser/accelerator.c +++ b/reactos/subsys/win32k/ntuser/accelerator.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: accelerator.c,v 1.8 2004/02/02 15:16:53 gvg Exp $ +/* $Id: accelerator.c,v 1.9 2004/02/19 21:12:09 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -59,6 +59,7 @@ #include <include/guicheck.h> #include <include/window.h> #include <include/focus.h> +#include <include/tags.h> #include <include/accelerator.h> #define NDEBUG @@ -175,7 +176,7 @@ NtUserCreateAcceleratorTable( AcceleratorTable->Count = EntriesCount; if (AcceleratorTable->Count > 0) { - AcceleratorTable->Table = ExAllocatePool(PagedPool, EntriesCount * sizeof(ACCEL)); + AcceleratorTable->Table = ExAllocatePoolWithTag(PagedPool, EntriesCount * sizeof(ACCEL), TAG_ACCEL); if (AcceleratorTable->Table == NULL) { ObmCloseHandle(WindowStation->HandleTable, Handle); diff --git a/reactos/subsys/win32k/ntuser/caret.c b/reactos/subsys/win32k/ntuser/caret.c index 5993c7c95f5..40b8c46c70a 100644 --- a/reactos/subsys/win32k/ntuser/caret.c +++ b/reactos/subsys/win32k/ntuser/caret.c @@ -1,4 +1,4 @@ -/* $Id: caret.c,v 1.10 2003/12/26 22:52:11 gvg Exp $ +/* $Id: caret.c,v 1.11 2004/02/19 21:12:09 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -17,6 +17,7 @@ #include <include/caret.h> #include <include/timer.h> #include <include/callback.h> +#include <include/tags.h> #include <rosrtl/string.h> #define NDEBUG @@ -122,7 +123,7 @@ IntQueryCaretBlinkRate(VOID) } ResLength += sizeof(KEY_VALUE_PARTIAL_INFORMATION); - KeyValuePartialInfo = ExAllocatePool(PagedPool, ResLength); + KeyValuePartialInfo = ExAllocatePoolWithTag(PagedPool, ResLength, TAG_STRING); Length = ResLength; if(!KeyValuePartialInfo) diff --git a/reactos/subsys/win32k/ntuser/class.c b/reactos/subsys/win32k/ntuser/class.c index df04b92e8c7..45d37f7522c 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.46 2004/02/11 17:56:29 navaraf Exp $ +/* $Id: class.c,v 1.47 2004/02/19 21:12:09 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -38,6 +38,7 @@ #include <include/guicheck.h> #include <include/window.h> #include <include/color.h> +#include <include/tags.h> #define NDEBUG #include <debug.h> @@ -215,7 +216,7 @@ IntGetClassName(struct _WINDOW_OBJECT *WindowObject, LPWSTR lpClassName, Length = 0; Status = RtlQueryAtomInAtomTable(WinStaObject->AtomTable, WindowObject->Class->Atom, NULL, NULL, Name, &Length); - Name = ExAllocatePool(NonPagedPool, Length + sizeof(UNICODE_NULL)); + Name = ExAllocatePoolWithTag(NonPagedPool, Length + sizeof(UNICODE_NULL), TAG_STRING); Status = RtlQueryAtomInAtomTable(WinStaObject->AtomTable, WindowObject->Class->Atom, NULL, NULL, Name, &Length); if (!NT_SUCCESS(Status)) @@ -335,7 +336,7 @@ IntCreateClass(CONST WNDCLASSEXW *lpwcx, } else { - ClassObject->lpszMenuName = ExAllocatePool(NonPagedPool,sizeof(UNICODE_STRING)); + ClassObject->lpszMenuName = ExAllocatePoolWithTag(NonPagedPool,sizeof(UNICODE_STRING), TAG_STRING); RtlCreateUnicodeString(ClassObject->lpszMenuName,(LPWSTR)lpwcx->lpszMenuName); } /* Extra class data */ @@ -548,7 +549,7 @@ IntSetClassLong(PWINDOW_OBJECT WindowObject, ULONG Offset, LONG dwNewLong, BOOL case GCL_MENUNAME: if (!IS_INTRESOURCE(dwNewLong)) { - str = ExAllocatePool(PagedPool,sizeof(UNICODE_STRING)+((PUNICODE_STRING)dwNewLong)->Length); + str = ExAllocatePoolWithTag(PagedPool,sizeof(UNICODE_STRING)+((PUNICODE_STRING)dwNewLong)->Length, TAG_STRING); memcpy(str,(PUNICODE_STRING)dwNewLong,sizeof(UNICODE_STRING)+((PUNICODE_STRING)dwNewLong)->Length); WindowObject->Class->lpszMenuName = str; } diff --git a/reactos/subsys/win32k/ntuser/clipboard.c b/reactos/subsys/win32k/ntuser/clipboard.c index 850aeb14fe2..f89c580f7d1 100644 --- a/reactos/subsys/win32k/ntuser/clipboard.c +++ b/reactos/subsys/win32k/ntuser/clipboard.c @@ -31,6 +31,8 @@ #include <include/cleanup.h> #include <include/error.h> #include <include/useratom.h> +#include <include/tags.h> + #define NDEBUG #include <debug.h> @@ -152,7 +154,7 @@ NtUserGetClipboardFormatName(UINT format, PUNICODE_STRING FormatName, } /* Allocate memory for the string */ - Buf = ExAllocatePool(NonPagedPool, cchMaxCount * sizeof(WCHAR)); + Buf = ExAllocatePoolWithTag(NonPagedPool, cchMaxCount * sizeof(WCHAR), TAG_STRING); if(!Buf) { SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); diff --git a/reactos/subsys/win32k/ntuser/hook.c b/reactos/subsys/win32k/ntuser/hook.c index 2d69557b365..05bd006e136 100644 --- a/reactos/subsys/win32k/ntuser/hook.c +++ b/reactos/subsys/win32k/ntuser/hook.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: hook.c,v 1.4 2003/12/14 22:34:47 gvg Exp $ +/* $Id: hook.c,v 1.5 2004/02/19 21:12:09 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -37,14 +37,13 @@ #include <include/object.h> #include <include/msgqueue.h> #include <include/winsta.h> +#include <include/tags.h> #include <internal/ps.h> #include <internal/safe.h> #define NDEBUG #include <win32k/debug1.h> -#define TAG_HOOK TAG('W', 'N', 'H', 'K') - #define HOOKID_TO_INDEX(HookId) (HookId - WH_MINHOOK) STATIC PHOOKTABLE GlobalHooks; diff --git a/reactos/subsys/win32k/ntuser/hotkey.c b/reactos/subsys/win32k/ntuser/hotkey.c index 48c22de7d66..9f93a82f025 100644 --- a/reactos/subsys/win32k/ntuser/hotkey.c +++ b/reactos/subsys/win32k/ntuser/hotkey.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: hotkey.c,v 1.6 2004/01/26 23:29:23 gvg Exp $ +/* $Id: hotkey.c,v 1.7 2004/02/19 21:12:09 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -36,6 +36,7 @@ #include <include/error.h> #include <include/msgqueue.h> #include <include/hotkey.h> +#include <include/tags.h> #define NDEBUG #include <debug.h> @@ -243,8 +244,7 @@ NtUserRegisterHotKey(HWND hWnd, return FALSE; } - HotKeyItem = ExAllocatePool (PagedPool, - sizeof(HOT_KEY_ITEM)); + HotKeyItem = ExAllocatePoolWithTag (PagedPool, sizeof(HOT_KEY_ITEM), TAG_HOTKEY); if (HotKeyItem == NULL) { ExReleaseFastMutex (&WinStaObject->HotKeyListLock); diff --git a/reactos/subsys/win32k/ntuser/keyboard.c b/reactos/subsys/win32k/ntuser/keyboard.c index d4c962a0474..0d1e09a6619 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.23 2004/02/19 06:59:50 arty Exp $ +/* $Id: keyboard.c,v 1.24 2004/02/19 21:12:09 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -40,6 +40,7 @@ #include <include/error.h> #include <include/object.h> #include <include/winsta.h> +#include <include/tags.h> #include <rosrtl/string.h> #define NDEBUG @@ -376,8 +377,9 @@ NTSTATUS NTAPI AppendUnicodeString(PUNICODE_STRING ResultFirst, BOOL Deallocate) { NTSTATUS Status; PWSTR new_string = - ExAllocatePool(PagedPool, - (ResultFirst->Length + Second->Length + sizeof(WCHAR))); + ExAllocatePoolWithTag(PagedPool, + (ResultFirst->Length + Second->Length + sizeof(WCHAR)), + TAG_STRING); if( !new_string ) { return STATUS_NO_MEMORY; } @@ -436,7 +438,7 @@ static NTSTATUS NTAPI ReadRegistryValue( PUNICODE_STRING KeyName, ResLength += sizeof( *KeyValuePartialInfo ); KeyValuePartialInfo = - ExAllocatePool(PagedPool, ResLength); + ExAllocatePoolWithTag(PagedPool, ResLength, TAG_STRING); Length = ResLength; if( !KeyValuePartialInfo ) { @@ -533,9 +535,9 @@ void InitKbdLayout( PVOID *pkKeyboardLayout ) { RtlFreeUnicodeString(&LayoutFile); - KeyboardLayoutWSTR = ExAllocatePool(PagedPool, - (FullLayoutPath.Length + 1) * - sizeof(WCHAR)); + KeyboardLayoutWSTR = ExAllocatePoolWithTag(PagedPool, + (FullLayoutPath.Length + 1) * + sizeof(WCHAR), TAG_STRING); if( !KeyboardLayoutWSTR ) { DPRINT1("Couldn't allocate a string for the keyboard layout name.\n"); @@ -837,7 +839,7 @@ NtUserToUnicodeEx( DPRINT1( "Couldn't copy key state from caller.\n" ); return 0; } - OutPwszBuff = ExAllocatePool(NonPagedPool,sizeof(WCHAR) * cchBuff); + OutPwszBuff = ExAllocatePoolWithTag(NonPagedPool,sizeof(WCHAR) * cchBuff, TAG_STRING); if( !OutPwszBuff ) { DPRINT1( "ExAllocatePool(%d) failed\n", sizeof(WCHAR) * cchBuff); return 0; diff --git a/reactos/subsys/win32k/ntuser/menu.c b/reactos/subsys/win32k/ntuser/menu.c index 974a7443bcf..d3f62ddceb8 100644 --- a/reactos/subsys/win32k/ntuser/menu.c +++ b/reactos/subsys/win32k/ntuser/menu.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: menu.c,v 1.45 2004/02/19 19:44:39 weiden Exp $ +/* $Id: menu.c,v 1.46 2004/02/19 21:12:09 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -38,13 +38,12 @@ #include <include/guicheck.h> #include <include/window.h> #include <include/color.h> +#include <include/tags.h> #include <internal/safe.h> #define NDEBUG #include <debug.h> -#define TAG_MENU TAG('M', 'E', 'N', 'U') - /* INTERNAL ******************************************************************/ /* maximum number of menu items a menu can contain */ @@ -327,7 +326,7 @@ IntCloneMenuItems(PMENU_OBJECT Destination, PMENU_OBJECT Source) Old = NewMenuItem; if(NewMenuItem) NewMenuItem->Next = MenuItem; - NewMenuItem = ExAllocatePoolWithTag(PagedPool, sizeof(MENU_ITEM), TAG_MENU); + NewMenuItem = ExAllocatePoolWithTag(PagedPool, sizeof(MENU_ITEM), TAG_MENUITEM); if(!NewMenuItem) break; NewMenuItem->fType = MenuItem->fType; @@ -343,7 +342,7 @@ IntCloneMenuItems(PMENU_OBJECT Destination, PMENU_OBJECT Source) { NewMenuItem->Text.Length = 0; NewMenuItem->Text.MaximumLength = MenuItem->Text.MaximumLength; - NewMenuItem->Text.Buffer = (PWSTR)ExAllocatePoolWithTag(PagedPool, MenuItem->Text.MaximumLength, TAG_MENU); + NewMenuItem->Text.Buffer = (PWSTR)ExAllocatePoolWithTag(PagedPool, MenuItem->Text.MaximumLength, TAG_STRING); if(!NewMenuItem->Text.Buffer) { ExFreePool(NewMenuItem); @@ -748,7 +747,7 @@ IntSetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, PROSMENUITEMINF Source = (PUNICODE_STRING)lpmii->dwTypeData; FreeMenuText(MenuItem); copylen = min((UINT)Source->MaximumLength, (lpmii->cch + 1) * sizeof(WCHAR)); - MenuItem->Text.Buffer = (PWSTR)ExAllocatePoolWithTag(PagedPool, copylen, TAG_MENU); + MenuItem->Text.Buffer = (PWSTR)ExAllocatePoolWithTag(PagedPool, copylen, TAG_STRING); if(MenuItem->Text.Buffer) { MenuItem->Text.Length = 0; @@ -812,7 +811,7 @@ IntInsertMenuItem(PMENU_OBJECT MenuObject, UINT uItem, BOOL fByPosition, pos = -1; } - MenuItem = ExAllocatePoolWithTag(PagedPool, sizeof(MENU_ITEM), TAG_MENU); + MenuItem = ExAllocatePoolWithTag(PagedPool, sizeof(MENU_ITEM), TAG_MENUITEM); if (NULL == MenuItem) { SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); diff --git a/reactos/subsys/win32k/ntuser/message.c b/reactos/subsys/win32k/ntuser/message.c index c98afdfabac..8d518c87202 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.49 2004/02/05 20:09:10 gvg Exp $ +/* $Id: message.c,v 1.50 2004/02/19 21:12:09 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -41,13 +41,12 @@ #include <include/painting.h> #include <include/input.h> #include <include/desktop.h> +#include <include/tags.h> #include <internal/safe.h> #define NDEBUG #include <debug.h> -#define TAG_MSG TAG('M', 'E', 'S', 'G') - /* FUNCTIONS *****************************************************************/ NTSTATUS FASTCALL diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index 80067415d43..81ef4209fa6 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.52 2004/02/16 11:16:06 rcampbell Exp $ +/* $Id: misc.c,v 1.53 2004/02/19 21:12:09 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -27,6 +27,7 @@ #include <include/msgqueue.h> #include <include/desktop.h> #include <include/text.h> +#include <include/tags.h> #define NDEBUG #include <debug.h> @@ -787,7 +788,7 @@ IntSafeCopyUnicodeString(PUNICODE_STRING Dest, { Src = Dest->Buffer; - Dest->Buffer = ExAllocatePool(NonPagedPool, Dest->MaximumLength); + Dest->Buffer = ExAllocatePoolWithTag(NonPagedPool, Dest->MaximumLength, TAG_STRING); if(!Dest->Buffer) { return STATUS_NO_MEMORY; diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index f318532cd3d..f2bbfc05426 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.66 2004/02/19 15:27:55 weiden Exp $ +/* $Id: msgqueue.c,v 1.67 2004/02/19 21:12:09 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -43,6 +43,7 @@ #include <include/cursoricon.h> #include <include/focus.h> #include <include/caret.h> +#include <include/tags.h> #define NDEBUG #include <win32k/debug1.h> @@ -50,8 +51,6 @@ /* GLOBALS *******************************************************************/ -#define TAG_MSGQ TAG('M', 'S', 'G', 'Q') - #define SYSTEM_MESSAGE_QUEUE_SIZE (256) static MSG SystemMessageQueue[SYSTEM_MESSAGE_QUEUE_SIZE]; @@ -788,8 +787,8 @@ MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) /* Notify the sender if they specified a callback. */ if (Message->CompletionCallback != NULL) { - NotifyMessage = ExAllocatePool(NonPagedPool, - sizeof(USER_SENT_MESSAGE_NOTIFY)); + NotifyMessage = ExAllocatePoolWithTag(NonPagedPool, + sizeof(USER_SENT_MESSAGE_NOTIFY), TAG_USRMSG); NotifyMessage->CompletionCallback = Message->CompletionCallback; NotifyMessage->CompletionCallbackContext = @@ -828,7 +827,7 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, KeInitializeEvent(&CompletionEvent, NotificationEvent, FALSE); - Message = ExAllocatePoolWithTag(PagedPool, sizeof(USER_SENT_MESSAGE), TAG_MSGQ); + Message = ExAllocatePoolWithTag(PagedPool, sizeof(USER_SENT_MESSAGE), TAG_USRMSG); Message->Msg.hwnd = Wnd; Message->Msg.message = Msg; Message->Msg.wParam = wParam; @@ -980,8 +979,9 @@ MsqCreateMessageQueue(struct _ETHREAD *Thread) { PUSER_MESSAGE_QUEUE MessageQueue; - MessageQueue = (PUSER_MESSAGE_QUEUE)ExAllocatePool(PagedPool, - sizeof(USER_MESSAGE_QUEUE) + sizeof(THRDCARETINFO)); + MessageQueue = (PUSER_MESSAGE_QUEUE)ExAllocatePoolWithTag(PagedPool, + sizeof(USER_MESSAGE_QUEUE) + sizeof(THRDCARETINFO), + TAG_MSGQ); if (!MessageQueue) { return NULL; diff --git a/reactos/subsys/win32k/ntuser/prop.c b/reactos/subsys/win32k/ntuser/prop.c index f11f8b346b6..fc2159beb35 100644 --- a/reactos/subsys/win32k/ntuser/prop.c +++ b/reactos/subsys/win32k/ntuser/prop.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: prop.c,v 1.6 2003/11/20 15:35:33 weiden Exp $ +/* $Id: prop.c,v 1.7 2004/02/19 21:12:09 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -41,6 +41,7 @@ #include <include/callback.h> #include <include/msgqueue.h> #include <include/rect.h> +#include <include/tags.h> //#define NDEBUG #include <debug.h> @@ -215,7 +216,7 @@ IntSetProp(PWINDOW_OBJECT Wnd, ATOM Atom, HANDLE Data) if (Prop == NULL) { - Prop = ExAllocatePool(PagedPool, sizeof(PROPERTY)); + Prop = ExAllocatePoolWithTag(PagedPool, sizeof(PROPERTY), TAG_WNDPROP); if (Prop == NULL) { return FALSE; diff --git a/reactos/subsys/win32k/ntuser/scrollbar.c b/reactos/subsys/win32k/ntuser/scrollbar.c index bec06610005..e3f97e8b0de 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.26 2004/01/14 22:18:35 gvg Exp $ +/* $Id: scrollbar.c,v 1.27 2004/02/19 21:12:09 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -41,6 +41,7 @@ #include <include/rect.h> #include <include/scroll.h> #include <include/painting.h> +#include <include/tags.h> #define NDEBUG #include <debug.h> @@ -485,7 +486,7 @@ IntCreateScrollBar(PWINDOW_OBJECT Window, LONG idObject) LRESULT Result; INT i; - psbi = ExAllocatePool(PagedPool, sizeof(SCROLLBARINFO) + sizeof(SCROLLINFO)); + psbi = ExAllocatePoolWithTag(PagedPool, sizeof(SCROLLBARINFO) + sizeof(SCROLLINFO), TAG_SBARINFO); if(!psbi) return FALSE; diff --git a/reactos/subsys/win32k/ntuser/timer.c b/reactos/subsys/win32k/ntuser/timer.c index 6ccf1dbdc35..0fdb492b435 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.22 2004/02/10 18:11:12 navaraf Exp $ +/* $Id: timer.c,v 1.23 2004/02/19 21:12:09 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -39,6 +39,7 @@ #include <include/window.h> #include <include/error.h> #include <include/timer.h> +#include <include/tags.h> #include <messages.h> #include <napi/win32.h> @@ -259,7 +260,7 @@ IntSetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc, B else { /* FIXME: use lookaside? */ - NewTimer = ExAllocatePool(PagedPool, sizeof(MSG_TIMER_ENTRY)); + NewTimer = ExAllocatePoolWithTag(PagedPool, sizeof(MSG_TIMER_ENTRY), TAG_TIMER); if(!NewTimer) { ExReleaseFastMutex(&Mutex); @@ -436,8 +437,8 @@ TimerThreadMain(PVOID StartContext) break; } - ThreadsToDereference = (PETHREAD *)ExAllocatePool( - NonPagedPool, ThreadsToDereferenceCount * sizeof(PETHREAD)); + ThreadsToDereference = (PETHREAD *)ExAllocatePoolWithTag( + NonPagedPool, ThreadsToDereferenceCount * sizeof(PETHREAD), TAG_TIMERTD); EnumEntry = TimerListHead.Flink; while (EnumEntry != &TimerListHead) @@ -573,7 +574,7 @@ InitTimerImpl(VOID) KeInitializeTimer(&Timer); ExInitializeFastMutex(&Mutex); - HandleLessTimersBitMapBuffer = ExAllocatePool(PagedPool, BitmapBytes); + HandleLessTimersBitMapBuffer = ExAllocatePoolWithTag(PagedPool, BitmapBytes, TAG_TIMERBMP); RtlInitializeBitMap(&HandleLessTimersBitMap, HandleLessTimersBitMapBuffer, BitmapBytes * 8); diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index b881dedb0cf..0a7b6d000d8 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.184 2004/02/15 20:50:56 gvg Exp $ +/* $Id: window.c,v 1.185 2004/02/19 21:12:09 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -52,13 +52,12 @@ #include <include/focus.h> #include <include/hook.h> #include <include/useratom.h> +#include <include/tags.h> #define NDEBUG #include <win32k/debug1.h> #include <debug.h> -#define TAG_WNAM TAG('W', 'N', 'A', 'M') - static WndProcHandle *WndProcHandlesArray = 0; static WORD WndProcHandlesArraySize = 0; #define WPH_SIZE 0x40 /* the size to add to the WndProcHandle array each time */ @@ -76,7 +75,7 @@ static WORD WndProcHandlesArraySize = 0; NTSTATUS FASTCALL InitWindowImpl(VOID) { - WndProcHandlesArray = ExAllocatePool(PagedPool,WPH_SIZE * sizeof(WndProcHandle)); + WndProcHandlesArray = ExAllocatePoolWithTag(PagedPool,WPH_SIZE * sizeof(WndProcHandle), TAG_WINPROCLST); WndProcHandlesArraySize = WPH_SIZE; return STATUS_SUCCESS; } @@ -227,7 +226,7 @@ IntWinListChildren(PWINDOW_OBJECT Window) if (NumChildren != 0) { - List = ExAllocatePool(PagedPool, (NumChildren + 1) * sizeof(HWND)); + List = ExAllocatePoolWithTag(PagedPool, (NumChildren + 1) * sizeof(HWND), TAG_WINLIST); if (List != NULL) { for (Child = Window->FirstChild, Index = 0; @@ -3201,7 +3200,7 @@ NtUserSetWindowPlacement(HWND hWnd, WinPosShowWindow(WindowObject->Self, Safepl.showCmd); if (WindowObject->InternalPos == NULL) - WindowObject->InternalPos = ExAllocatePool(PagedPool, sizeof(INTERNALPOS)); + WindowObject->InternalPos = ExAllocatePoolWithTag(PagedPool, sizeof(INTERNALPOS), TAG_WININTLIST); WindowObject->InternalPos->NormalRect = Safepl.rcNormalPosition; WindowObject->InternalPos->IconPos = Safepl.ptMinPosition; WindowObject->InternalPos->MaxPos = Safepl.ptMaxPosition; @@ -3584,7 +3583,7 @@ IntAddWndProcHandle(WNDPROC WindowProc, BOOL IsUnicode) { OldArray = WndProcHandlesArray; OldArraySize = WndProcHandlesArraySize; - WndProcHandlesArray = ExAllocatePool(PagedPool,(OldArraySize + WPH_SIZE) * sizeof(WndProcHandle)); + WndProcHandlesArray = ExAllocatePoolWithTag(PagedPool,(OldArraySize + WPH_SIZE) * sizeof(WndProcHandle), TAG_WINPROCLST); WndProcHandlesArraySize = OldArraySize + WPH_SIZE; RtlCopyMemory(WndProcHandlesArray,OldArray,OldArraySize * sizeof(WndProcHandle)); ExFreePool(OldArray); diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index aa9871ef69d..f0b7c198a62 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.91 2004/02/19 15:27:55 weiden Exp $ +/* $Id: winpos.c,v 1.92 2004/02/19 21:12:09 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -45,6 +45,7 @@ #include <include/dce.h> #include <include/vis.h> #include <include/focus.h> +#include <include/tags.h> #define NDEBUG #include <debug.h> @@ -172,7 +173,7 @@ WinPosInitInternalPos(PWINDOW_OBJECT WindowObject, POINT pt, PRECT RestoreRect) else WorkArea = WindowObject->Parent->ClientRect; - WindowObject->InternalPos = ExAllocatePool(NonPagedPool, sizeof(INTERNALPOS)); + WindowObject->InternalPos = ExAllocatePoolWithTag(NonPagedPool, sizeof(INTERNALPOS), TAG_WININTLIST); if(!WindowObject->InternalPos) { DPRINT1("Failed to allocate INTERNALPOS structure for window 0x%x\n", WindowObject->Self); diff --git a/reactos/subsys/win32k/ntuser/winsta.c b/reactos/subsys/win32k/ntuser/winsta.c index 2d7c102d841..c2459ed704b 100644 --- a/reactos/subsys/win32k/ntuser/winsta.c +++ b/reactos/subsys/win32k/ntuser/winsta.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: winsta.c,v 1.55 2004/01/15 16:29:10 gvg Exp $ + * $Id: winsta.c,v 1.56 2004/02/19 21:12:10 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -52,6 +52,7 @@ #include <include/callback.h> #include <include/guicheck.h> #include <include/intgdi.h> +#include <include/tags.h> /* Needed for DIRECTORY_OBJECT */ #include <internal/ob.h> @@ -124,7 +125,7 @@ IntGetFullWindowStationName( FullName->Length += WinStaName->Length + sizeof(WCHAR); if (DesktopName != NULL) FullName->Length += DesktopName->Length + sizeof(WCHAR); - FullName->Buffer = ExAllocatePool(NonPagedPool, FullName->Length); + FullName->Buffer = ExAllocatePoolWithTag(NonPagedPool, FullName->Length, TAG_STRING); if (FullName->Buffer == NULL) { return FALSE; diff --git a/reactos/subsys/win32k/objects/bezier.c b/reactos/subsys/win32k/objects/bezier.c index 7020c0d5857..edf7c4e65ae 100644 --- a/reactos/subsys/win32k/objects/bezier.c +++ b/reactos/subsys/win32k/objects/bezier.c @@ -16,10 +16,11 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: bezier.c,v 1.4 2003/08/11 21:10:49 royce Exp $ */ +/* $Id: bezier.c,v 1.5 2004/02/19 21:12:10 weiden Exp $ */ #include <windows.h> #include <ddk/ntddk.h> #include <math.h> +#include <include/tags.h> /****************************************************************** * @@ -154,7 +155,7 @@ static void STDCALL GDI_InternalBezier( POINT *Points, POINT **PtsOut, INT *dwOu { if(*nPtsOut == *dwOut) { *dwOut *= 2; - *PtsOut = ExAllocatePool(NonPagedPool, *dwOut * sizeof(POINT)); + *PtsOut = ExAllocatePoolWithTag(NonPagedPool, *dwOut * sizeof(POINT), TAG_BEZIER); } if(!level || BezierCheck(level, Points)) { @@ -218,7 +219,7 @@ POINT * FASTCALL GDI_Bezier( const POINT *Points, INT count, INT *nPtsOut ) return NULL; } *nPtsOut = 0; - out = ExAllocatePool(NonPagedPool, dwOut * sizeof(POINT)); + out = ExAllocatePoolWithTag(NonPagedPool, dwOut * sizeof(POINT), TAG_BEZIER); for(Bezier = 0; Bezier < (count-1)/3; Bezier++) { POINT ptBuf[4]; memcpy(ptBuf, Points + Bezier * 3, sizeof(POINT) * 4); diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index e90ef97f5e9..1085bff3364 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.54 2004/02/12 21:50:19 navaraf Exp $ */ +/* $Id: bitmaps.c,v 1.55 2004/02/19 21:12:10 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> #include <stdlib.h> @@ -32,6 +32,7 @@ #include <include/error.h> #include <include/surface.h> #include <include/palette.h> +#include <include/tags.h> #define NDEBUG #include <win32k/debug1.h> @@ -290,7 +291,7 @@ HBITMAP STDCALL NtGdiCreateBitmap(INT Width, bmp->dib = NULL; // Allocate memory for bitmap bits - bmp->bitmap.bmBits = ExAllocatePool(PagedPool, bmp->bitmap.bmWidthBytes * bmp->bitmap.bmHeight); + bmp->bitmap.bmBits = ExAllocatePoolWithTag(PagedPool, bmp->bitmap.bmWidthBytes * bmp->bitmap.bmHeight, TAG_BITMAP); BITMAPOBJ_UnlockBitmap( hBitmap ); @@ -729,7 +730,7 @@ LONG STDCALL NtGdiSetBitmapBits(HBITMAP hBitmap, /* FIXME: Alloc enough for entire bitmap */ if (bmp->bitmap.bmBits == NULL) { - bmp->bitmap.bmBits = ExAllocatePool (PagedPool, Bytes); + bmp->bitmap.bmBits = ExAllocatePoolWithTag(PagedPool, Bytes, TAG_BITMAP); } if(!bmp->bitmap.bmBits) { @@ -1060,7 +1061,7 @@ HBITMAP FASTCALL BITMAPOBJ_CopyBitmap(HBITMAP hBitmap) { char *buf; - buf = ExAllocatePool (NonPagedPool, bm.bmWidthBytes * bm.bmHeight); + buf = ExAllocatePoolWithTag (NonPagedPool, bm.bmWidthBytes * bm.bmHeight, TAG_BITMAP); NtGdiGetBitmapBits (hBitmap, bm.bmWidthBytes * bm.bmHeight, buf); NtGdiSetBitmapBits (res, bm.bmWidthBytes * bm.bmHeight, buf); ExFreePool (buf); diff --git a/reactos/subsys/win32k/objects/brush.c b/reactos/subsys/win32k/objects/brush.c index 71e847130b0..988633f644b 100644 --- a/reactos/subsys/win32k/objects/brush.c +++ b/reactos/subsys/win32k/objects/brush.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: brush.c,v 1.31 2004/01/15 21:03:05 gvg Exp $ +/* $Id: brush.c,v 1.32 2004/02/19 21:12:10 weiden Exp $ */ @@ -30,6 +30,7 @@ #include <include/object.h> #include <include/inteng.h> #include <include/error.h> +#include <include/tags.h> #define NDEBUG #include <win32k/debug1.h> @@ -335,7 +336,7 @@ BOOL STDCALL NtGdiPolyPatBlt(HDC hDC, if(cRects > 0) { - rb = ExAllocatePool(PagedPool, sizeof(PATRECT) * cRects); + rb = ExAllocatePoolWithTag(PagedPool, sizeof(PATRECT) * cRects, TAG_PATBLT); if(!rb) { SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); diff --git a/reactos/subsys/win32k/objects/coord.c b/reactos/subsys/win32k/objects/coord.c index db36ccf5f69..ab723defed1 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.21 2004/01/04 21:26:59 weiden Exp $ +/* $Id: coord.c,v 1.22 2004/02/19 21:12:10 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -33,6 +33,7 @@ #include <win32k/coord.h> #include <win32k/dc.h> #include <include/error.h> +#include <include/tags.h> #define NDEBUG #include <win32k/debug1.h> @@ -155,7 +156,7 @@ NtGdiDPtoLP(HDC hDC, Size = Count * sizeof(POINT); - Points = (LPPOINT)ExAllocatePool(PagedPool, Size); + Points = (LPPOINT)ExAllocatePoolWithTag(PagedPool, Size, TAG_COORD); if(!Points) { DC_UnlockDc(hDC); @@ -304,7 +305,7 @@ NtGdiLPtoDP ( HDC hDC, LPPOINT UnsafePoints, INT Count ) Size = Count * sizeof(POINT); - Points = (LPPOINT)ExAllocatePool(PagedPool, Size); + Points = (LPPOINT)ExAllocatePoolWithTag(PagedPool, Size, TAG_COORD); if(!Points) { DC_UnlockDc(hDC); diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index 6e547e38a2d..b709d7d6d39 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.120 2004/02/01 15:45:41 gvg Exp $ +/* $Id: dc.c,v 1.121 2004/02/19 21:12:10 weiden Exp $ * * DC.C - Device context functions * @@ -52,12 +52,11 @@ #include <include/desktop.h> #include <include/intgdi.h> #include <include/cleanup.h> +#include <include/tags.h> #define NDEBUG #include <win32k/debug1.h> -#define TAG_DC TAG('D', 'C', 'D', 'C') - static GDIDEVICE PrimarySurface; /* FIXME: DCs should probably be thread safe */ @@ -1455,7 +1454,7 @@ NtGdiGetObject(HANDLE handle, INT count, LPVOID buffer) return 0; } - SafeBuf = ExAllocatePool(NonPagedPool, count); + SafeBuf = ExAllocatePoolWithTag(NonPagedPool, count, TAG_GDIOBJ); if(!SafeBuf) { SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); diff --git a/reactos/subsys/win32k/objects/dib.c b/reactos/subsys/win32k/objects/dib.c index bef83957c8d..1992312c169 100644 --- a/reactos/subsys/win32k/objects/dib.c +++ b/reactos/subsys/win32k/objects/dib.c @@ -1,5 +1,5 @@ /* - * $Id: dib.c,v 1.41 2004/02/11 17:56:29 navaraf Exp $ + * $Id: dib.c,v 1.42 2004/02/19 21:12:10 weiden Exp $ * * ReactOS W32 Subsystem * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team @@ -34,6 +34,7 @@ #include <internal/safe.h> #include <include/surface.h> #include <include/palette.h> +#include <include/tags.h> #define NDEBUG #include <win32k/debug1.h> @@ -993,7 +994,7 @@ DIB_CreateDIBSection( // Allocate Memory for DIB and fill structure if (bm.bmBits) { - dib = ExAllocatePool(PagedPool, sizeof(DIBSECTION)); + dib = ExAllocatePoolWithTag(PagedPool, sizeof(DIBSECTION), TAG_DIB); RtlZeroMemory(dib, sizeof(DIBSECTION)); } @@ -1058,7 +1059,7 @@ DIB_CreateDIBSection( if(bi->biBitCount == 4) { Entries = 16; } else if(bi->biBitCount == 8) { Entries = 256; } - bmp->ColorMap = ExAllocatePool(NonPagedPool, sizeof(RGBQUAD)*Entries); + bmp->ColorMap = ExAllocatePoolWithTag(NonPagedPool, sizeof(RGBQUAD)*Entries, TAG_COLORMAP); RtlCopyMemory(bmp->ColorMap, bmi->bmiColors, sizeof(RGBQUAD)*Entries); } @@ -1236,7 +1237,7 @@ DIB_MapPaletteColors(PDC dc, CONST BITMAPINFO* lpbmi) nNumColors = min(nNumColors, lpbmi->bmiHeader.biClrUsed); } - lpRGB = (RGBQUAD *)ExAllocatePool(NonPagedPool, sizeof(RGBQUAD) * nNumColors); + lpRGB = (RGBQUAD *)ExAllocatePoolWithTag(NonPagedPool, sizeof(RGBQUAD) * nNumColors, TAG_COLORMAP); lpIndex = (DWORD *)&lpbmi->bmiColors[0]; for (i = 0; i < nNumColors; i++) @@ -1309,7 +1310,7 @@ BuildDIBPalette (PBITMAPINFO bmi, PINT paletteType) if (PAL_INDEXED == *paletteType) { - palEntries = ExAllocatePool(NonPagedPool, sizeof(PALETTEENTRY)*ColorCount); + palEntries = ExAllocatePoolWithTag(NonPagedPool, sizeof(PALETTEENTRY)*ColorCount, TAG_COLORMAP); DIBColorTableToPaletteEntries(palEntries, bmi->bmiColors, ColorCount); } hPal = PALETTE_AllocPalette( *paletteType, ColorCount, (ULONG*)palEntries, 0, 0, 0 ); diff --git a/reactos/subsys/win32k/objects/fillshap.c b/reactos/subsys/win32k/objects/fillshap.c index c5d9a979b37..4b77c936e58 100644 --- a/reactos/subsys/win32k/objects/fillshap.c +++ b/reactos/subsys/win32k/objects/fillshap.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: fillshap.c,v 1.40 2004/02/08 21:37:53 weiden Exp $ */ +/* $Id: fillshap.c,v 1.41 2004/02/19 21:12:10 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> @@ -34,6 +34,7 @@ #include <include/palette.h> #include <include/eng.h> #include <include/intgdi.h> +#include <include/tags.h> #include <internal/safe.h> #define NDEBUG @@ -700,7 +701,7 @@ NtGdiPie(HDC hDC, /* Number of points for the circle is 4 * sqrt(2) * Radius, start and end line have at most Radius points, so allocate at least that much */ - ShapePoints = ExAllocatePool(PagedPool, 8 * (Right - Left + 1) / 2 * sizeof(SHAPEPOINT)); + ShapePoints = ExAllocatePoolWithTag(PagedPool, 8 * (Right - Left + 1) / 2 * sizeof(SHAPEPOINT), TAG_SHAPE); if (NULL == ShapePoints) { BRUSHOBJ_UnlockBrush(dc->w.hBrush); @@ -850,7 +851,7 @@ NtGdiPolygon(HDC hDC, if(Count >= 2) { - Safept = ExAllocatePool(NonPagedPool, sizeof(POINT) * Count); + Safept = ExAllocatePoolWithTag(NonPagedPool, sizeof(POINT) * Count, TAG_SHAPE); if(!Safept) { DC_UnlockDc(hDC); @@ -905,7 +906,7 @@ NtGdiPolyPolygon(HDC hDC, if(Count > 0) { - Safept = ExAllocatePool(NonPagedPool, (sizeof(POINT) + sizeof(INT)) * Count); + Safept = ExAllocatePoolWithTag(NonPagedPool, (sizeof(POINT) + sizeof(INT)) * Count, TAG_SHAPE); if(!Safept) { DC_UnlockDc(hDC); @@ -1474,7 +1475,7 @@ NtGdiGradientFill( return FALSE; } - if(!(SafeVertex = ExAllocatePool(PagedPool, (uVertex * sizeof(TRIVERTEX)) + SizeMesh))) + if(!(SafeVertex = ExAllocatePoolWithTag(PagedPool, (uVertex * sizeof(TRIVERTEX)) + SizeMesh, TAG_SHAPE))) { DC_UnlockDc(hdc); SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); diff --git a/reactos/subsys/win32k/objects/gdiobj.c b/reactos/subsys/win32k/objects/gdiobj.c index d2cb7ed6ddd..e79f779784b 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.59 2004/02/01 09:58:30 mf Exp $ + * $Id: gdiobj.c,v 1.60 2004/02/19 21:12:10 weiden Exp $ * */ @@ -39,6 +39,7 @@ #include <win32k/cursoricon.h> #include <include/palette.h> #include <include/intgdi.h> +#include <include/tags.h> #define NDEBUG #include <win32k/debug1.h> @@ -169,9 +170,9 @@ GDIOBJ_iAllocHandleTable (WORD Size) /* prevent APC delivery for the *FastMutexUnsafe calls */ const KIRQL PrevIrql = KfRaiseIrql(APC_LEVEL); ExAcquireFastMutexUnsafe (&HandleTableMutex); - handleTable = ExAllocatePool(PagedPool, - sizeof(GDI_HANDLE_TABLE) + - sizeof(PGDIOBJ) * Size); + handleTable = ExAllocatePoolWithTag(PagedPool, + sizeof(GDI_HANDLE_TABLE) + + sizeof(PGDIOBJ) * Size, TAG_GDIHNDTBLE); ASSERT( handleTable ); memset (handleTable, 0, @@ -261,7 +262,7 @@ GDIOBJ_AllocObj(WORD Size, DWORD ObjectType, GDICLEANUPPROC CleanupProc) } DPRINT("GDIOBJ_AllocObj: handle: %d, size: %d, type: 0x%08x\n", Index, Size, ObjectType); - newObject = ExAllocatePool(PagedPool, Size + sizeof (GDIOBJHDR)); + newObject = ExAllocatePoolWithTag(PagedPool, Size + sizeof (GDIOBJHDR), TAG_GDIOBJ); if (newObject == NULL) { DPRINT1("GDIOBJ_AllocObj: failed\n"); diff --git a/reactos/subsys/win32k/objects/line.c b/reactos/subsys/win32k/objects/line.c index 4ddc288e609..2048e216308 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.26 2003/12/13 10:57:29 weiden Exp $ */ +/* $Id: line.c,v 1.27 2004/02/19 21:12:10 weiden Exp $ */ // Some code from the WINE project source (www.winehq.com) @@ -34,6 +34,7 @@ #include <include/object.h> #include <include/path.h> #include <include/intgdi.h> +#include <include/tags.h> #define NDEBUG #include <win32k/debug1.h> @@ -180,7 +181,7 @@ IntGdiPolyBezierTo(DC *dc, else /* We'll do it using PolyBezier */ { POINT *npt; - npt = ExAllocatePool(NonPagedPool, sizeof(POINT) * (Count + 1)); + npt = ExAllocatePoolWithTag(NonPagedPool, sizeof(POINT) * (Count + 1), TAG_BEZIER); if ( npt ) { npt[0].x = dc->w.CursPosX; @@ -222,7 +223,7 @@ IntGdiPolyline(DC *dc, //FIXME: Do somthing with reg... //Allocate "Count" bytes of memory to hold a safe copy of pt - pts = (POINT*)ExAllocatePool ( NonPagedPool, sizeof(POINT)*Count ); + pts = (POINT*)ExAllocatePoolWithTag ( NonPagedPool, sizeof(POINT)*Count, TAG_SHAPE ); if ( pts ) { // safely copy pt to local version @@ -269,7 +270,7 @@ IntGdiPolylineTo(DC *dc, } else /* do it using Polyline */ { - POINT *pts = ExAllocatePool(NonPagedPool, sizeof(POINT) * (Count + 1)); + POINT *pts = ExAllocatePoolWithTag(NonPagedPool, sizeof(POINT) * (Count + 1), TAG_SHAPE); if ( pts ) { pts[0].x = dc->w.CursPosX; @@ -540,7 +541,7 @@ NtGdiPolyBezier(HDC hDC, if(Count > 0) { - Safept = ExAllocatePool(NonPagedPool, sizeof(POINT) * Count); + Safept = ExAllocatePoolWithTag(NonPagedPool, sizeof(POINT) * Count, TAG_BEZIER); if(!Safept) { DC_UnlockDc(hDC); @@ -591,7 +592,7 @@ NtGdiPolyBezierTo(HDC hDC, if(Count > 0) { - Safept = ExAllocatePool(NonPagedPool, sizeof(POINT) * Count); + Safept = ExAllocatePoolWithTag(NonPagedPool, sizeof(POINT) * Count, TAG_BEZIER); if(!Safept) { DC_UnlockDc(hDC); @@ -652,7 +653,7 @@ NtGdiPolyline(HDC hDC, if(Count >= 2) { - Safept = ExAllocatePool(NonPagedPool, sizeof(POINT) * Count); + Safept = ExAllocatePoolWithTag(NonPagedPool, sizeof(POINT) * Count, TAG_SHAPE); if(!Safept) { DC_UnlockDc(hDC); @@ -703,7 +704,7 @@ NtGdiPolylineTo(HDC hDC, if(Count > 0) { - Safept = ExAllocatePool(NonPagedPool, sizeof(POINT) * Count); + Safept = ExAllocatePoolWithTag(NonPagedPool, sizeof(POINT) * Count, TAG_SHAPE); if(!Safept) { DC_UnlockDc(hDC); @@ -756,7 +757,7 @@ NtGdiPolyPolyline(HDC hDC, if(Count > 0) { - Safept = ExAllocatePool(NonPagedPool, (sizeof(POINT) + sizeof(DWORD)) * Count); + Safept = ExAllocatePoolWithTag(NonPagedPool, (sizeof(POINT) + sizeof(DWORD)) * Count, TAG_SHAPE); if(!Safept) { DC_UnlockDc(hDC); diff --git a/reactos/subsys/win32k/objects/palette.c b/reactos/subsys/win32k/objects/palette.c index 9168d0d5691..64f7279c6ee 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.14 2003/12/20 10:31:32 navaraf Exp $ */ +/* $Id: palette.c,v 1.15 2004/02/19 21:12:10 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> @@ -29,6 +29,7 @@ #include <include/palette.h> #include <include/object.h> #include <include/color.h> +#include <include/tags.h> static int PALETTE_firstFree = 0; static unsigned char PALETTE_freeList[256]; @@ -81,7 +82,7 @@ PALETTE_AllocPalette(ULONG Mode, if (NULL != Colors) { - PalGDI->IndexedColors = ExAllocatePool(NonPagedPool, sizeof(PALETTEENTRY) * NumColors); + PalGDI->IndexedColors = ExAllocatePoolWithTag(NonPagedPool, sizeof(PALETTEENTRY) * NumColors, TAG_PALETTE); if (NULL == PalGDI->IndexedColors) { PALETTE_UnlockPalette(NewPalette); @@ -117,7 +118,7 @@ HPALETTE FASTCALL PALETTE_Init(VOID) const PALETTEENTRY* __sysPalTemplate = (const PALETTEENTRY*)COLOR_GetSystemPaletteTemplate(); // create default palette (20 system colors) - palPtr = ExAllocatePool(NonPagedPool, sizeof(LOGPALETTE) + (NB_RESERVED_COLORS * sizeof(PALETTEENTRY))); + palPtr = ExAllocatePoolWithTag(NonPagedPool, sizeof(LOGPALETTE) + (NB_RESERVED_COLORS * sizeof(PALETTEENTRY)), TAG_PALETTE); if (!palPtr) return FALSE; palPtr->palVersion = 0x300; @@ -201,7 +202,7 @@ INT STDCALL PALETTE_SetMapping(PPALOBJ palPtr, UINT uStart, UINT uNum, BOOL mapO //mapping = HeapReAlloc( GetProcessHeap(), 0, palPtr->mapping, // sizeof(int)*palPtr->logpalette->palNumEntries); ExFreePool(palPtr->mapping); - mapping = ExAllocatePool(NonPagedPool, sizeof(int)*palGDI->NumColors); + mapping = ExAllocatePoolWithTag(NonPagedPool, sizeof(int)*palGDI->NumColors, TAG_PALETTEMAP); palPtr->mapping = mapping; diff --git a/reactos/subsys/win32k/objects/path.c b/reactos/subsys/win32k/objects/path.c index 5f971881bb7..87516286efb 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.17 2003/12/13 10:18:01 weiden Exp $ */ +/* $Id: path.c,v 1.18 2004/02/19 21:12:10 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> #include <ddk/ntddk.h> @@ -31,6 +31,7 @@ #include <include/object.h> #include <include/path.h> #include <include/intgdi.h> +#include <include/tags.h> #include <math.h> #include <float.h> @@ -858,7 +859,7 @@ PATH_PathToRegion ( const GdiPath *pPath, INT nPolyFillMode, HRGN *pHrgn ) numStrokes++; /* Allocate memory for number-of-points-in-stroke array */ - pNumPointsInStroke=(int *)ExAllocatePool(NonPagedPool, sizeof(int) * numStrokes); + pNumPointsInStroke=(int *)ExAllocatePoolWithTag(NonPagedPool, sizeof(int) * numStrokes, TAG_PATH); if(!pNumPointsInStroke) { // SetLastError(ERROR_NOT_ENOUGH_MEMORY); @@ -981,10 +982,10 @@ PATH_ReserveEntries ( GdiPath *pPath, INT numEntries ) numEntriesToAllocate=numEntries; /* Allocate new arrays */ - pPointsNew=(POINT *)ExAllocatePool(NonPagedPool, numEntriesToAllocate * sizeof(POINT)); + pPointsNew=(POINT *)ExAllocatePoolWithTag(NonPagedPool, numEntriesToAllocate * sizeof(POINT), TAG_PATH); if(!pPointsNew) return FALSE; - pFlagsNew=(BYTE *)ExAllocatePool(NonPagedPool, numEntriesToAllocate * sizeof(BYTE)); + pFlagsNew=(BYTE *)ExAllocatePoolWithTag(NonPagedPool, numEntriesToAllocate * sizeof(BYTE), TAG_PATH); if(!pFlagsNew) { ExFreePool(pPointsNew); diff --git a/reactos/subsys/win32k/objects/print.c b/reactos/subsys/win32k/objects/print.c index 41435daefe9..c9d09acf7b1 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.13 2004/02/18 02:37:18 royce Exp $ */ +/* $Id: print.c,v 1.14 2004/02/19 21:12:10 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> @@ -24,6 +24,7 @@ #include <win32k/print.h> #include <win32k/dc.h> #include <include/error.h> +#include <include/tags.h> #include <internal/safe.h> #define NDEBUG @@ -131,7 +132,7 @@ NtGdiExtEscape( if ( InSize && UnsafeInData ) { - SafeInData = ExAllocatePool ( NonPagedPool, InSize ); + SafeInData = ExAllocatePoolWithTag ( NonPagedPool, InSize, TAG_PRINT ); if ( !SafeInData ) { DC_UnlockDc(hDC); @@ -150,7 +151,7 @@ NtGdiExtEscape( if ( OutSize && UnsafeOutData ) { - SafeOutData = ExAllocatePool ( NonPagedPool, OutSize ); + SafeOutData = ExAllocatePoolWithTag ( NonPagedPool, OutSize, TAG_PRINT ); if ( !SafeOutData ) { if ( SafeInData ) diff --git a/reactos/subsys/win32k/objects/region.c b/reactos/subsys/win32k/objects/region.c index 966aa325ce3..3ae533bc2d3 100644 --- a/reactos/subsys/win32k/objects/region.c +++ b/reactos/subsys/win32k/objects/region.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: region.c,v 1.41 2004/02/11 17:56:29 navaraf Exp $ */ +/* $Id: region.c,v 1.42 2004/02/19 21:12:10 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> #include <ddk/ntddk.h> @@ -31,6 +31,7 @@ #include <include/object.h> #include <include/inteng.h> #include <include/error.h> +#include <include/tags.h> #define NDEBUG #include <win32k/debug1.h> @@ -71,7 +72,7 @@ IntEngPaint(IN SURFOBJ *Surface,IN CLIPOBJ *ClipRegion,IN BRUSHOBJ *Brush,IN POI static inline int xmemcheck(ROSRGNDATA *reg, LPRECT *rect, LPRECT *firstrect ) { if ( (reg->rdh.nCount+1)*sizeof( RECT ) >= reg->rdh.nRgnSize ) { PRECT temp; - temp = ExAllocatePool( PagedPool, (2 * (reg->rdh.nRgnSize))); + temp = ExAllocatePoolWithTag( PagedPool, (2 * (reg->rdh.nRgnSize)), TAG_REGION); if (temp == 0) return 0; @@ -136,7 +137,7 @@ static BOOL FASTCALL REGION_CopyRegion(PROSRGNDATA dst, PROSRGNDATA src) { PCHAR temp; - temp = ExAllocatePool(PagedPool, src->rdh.nCount * sizeof(RECT) ); + temp = ExAllocatePoolWithTag(PagedPool, src->rdh.nCount * sizeof(RECT), TAG_REGION ); if( !temp ) return FALSE; @@ -214,7 +215,7 @@ static BOOL FASTCALL REGION_CropAndOffsetRegion(const PPOINT off, const PRECT re return TRUE; } else{ - xrect = ExAllocatePool(PagedPool, rgnSrc->rdh.nCount * sizeof(RECT)); + xrect = ExAllocatePoolWithTag(PagedPool, rgnSrc->rdh.nCount * sizeof(RECT), TAG_REGION); if( rgnDst->Buffer ) ExFreePool( rgnDst->Buffer ); //free the old buffer. will be assigned to xrect below. } @@ -274,7 +275,7 @@ static BOOL FASTCALL REGION_CropAndOffsetRegion(const PPOINT off, const PRECT re if((rgnDst != rgnSrc) && (rgnDst->rdh.nCount < (i = (clipb - clipa)))) { PCHAR temp; - temp = ExAllocatePool( PagedPool, i * sizeof(RECT) ); + temp = ExAllocatePoolWithTag( PagedPool, i * sizeof(RECT), TAG_REGION ); if(!temp) return FALSE; @@ -339,7 +340,7 @@ static BOOL FASTCALL REGION_CropAndOffsetRegion(const PPOINT off, const PRECT re empty: if(!rgnDst->Buffer) { - rgnDst->Buffer = (char*)ExAllocatePool(PagedPool, RGN_DEFAULT_RECTS * sizeof(RECT)); + rgnDst->Buffer = (char*)ExAllocatePoolWithTag(PagedPool, RGN_DEFAULT_RECTS * sizeof(RECT), TAG_REGION); if(rgnDst->Buffer){ rgnDst->rdh.nCount = RGN_DEFAULT_RECTS; rgnDst->rdh.nRgnSize = RGN_DEFAULT_RECTS * sizeof(RECT); @@ -619,7 +620,7 @@ REGION_RegionOp( */ newReg->rdh.nRgnSize = max(reg1->rdh.nCount,reg2->rdh.nCount) * 2 * sizeof(RECT); - if (! (newReg->Buffer = ExAllocatePool( PagedPool, newReg->rdh.nRgnSize ))) + if (! (newReg->Buffer = ExAllocatePoolWithTag( PagedPool, newReg->rdh.nRgnSize, TAG_REGION ))) { newReg->rdh.nRgnSize = 0; return; @@ -809,7 +810,7 @@ REGION_RegionOp( if (REGION_NOT_EMPTY(newReg)) { RECT *prev_rects = (PRECT)newReg->Buffer; - newReg->Buffer = ExAllocatePool( PagedPool, newReg->rdh.nCount*sizeof(RECT) ); + newReg->Buffer = ExAllocatePoolWithTag( PagedPool, newReg->rdh.nCount*sizeof(RECT), TAG_REGION ); if (! newReg->Buffer) newReg->Buffer = (char*)prev_rects; @@ -827,7 +828,7 @@ REGION_RegionOp( */ newReg->rdh.nRgnSize = sizeof(RECT); ExFreePool( newReg->Buffer ); - newReg->Buffer = ExAllocatePool( PagedPool, sizeof(RECT) ); + newReg->Buffer = ExAllocatePoolWithTag( PagedPool, sizeof(RECT), TAG_REGION ); ASSERT( newReg->Buffer ); } } @@ -1476,7 +1477,7 @@ HRGN FASTCALL RGNDATA_AllocRgn(INT n) (GDICLEANUPPROC) RGNDATA_InternalDelete))){ if( (pReg = RGNDATA_LockRgn(hReg)) ){ - if ((pReg->Buffer = ExAllocatePool(PagedPool, n * sizeof(RECT)))){ + if ((pReg->Buffer = ExAllocatePoolWithTag(PagedPool, n * sizeof(RECT), TAG_REGION))){ EMPTY_REGION(pReg); pReg->rdh.dwSize = sizeof(RGNDATAHEADER); pReg->rdh.nCount = n; diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index 03c051add06..52b0d073ec3 100644 --- a/reactos/subsys/win32k/objects/text.c +++ b/reactos/subsys/win32k/objects/text.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: text.c,v 1.73 2004/02/11 21:52:28 sedwards Exp $ */ +/* $Id: text.c,v 1.74 2004/02/19 21:12:10 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -40,6 +40,7 @@ #include <include/text.h> #include <include/eng.h> #include <include/palette.h> +#include <include/tags.h> #define NDEBUG #include <win32k/debug1.h> @@ -155,7 +156,7 @@ IntGdiAddFontResource(PUNICODE_STRING Filename, DWORD fl) // Allocate nonpageable memory for driver size = FileStdInfo.EndOfFile.u.LowPart; - buffer = ExAllocatePool(NonPagedPool, size); + buffer = ExAllocatePoolWithTag(NonPagedPool, size, TAG_GDITEXT); if (buffer == NULL) { @@ -197,7 +198,7 @@ IntGdiAddFontResource(PUNICODE_STRING Filename, DWORD fl) return 0; } - entry = ExAllocatePool(NonPagedPool, sizeof(FONT_ENTRY)); + entry = ExAllocatePoolWithTag(NonPagedPool, sizeof(FONT_ENTRY), TAG_FONT); if(!entry) { SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); @@ -284,7 +285,7 @@ BOOL FASTCALL InitFontSupport(VOID) pBuff = ExAllocatePool(NonPagedPool,0x4000); RtlInitUnicodeString(&cchFilename,0); cchFilename.MaximumLength = 0x1000; - cchFilename.Buffer = ExAllocatePool(PagedPool,cchFilename.MaximumLength); + cchFilename.Buffer = ExAllocatePoolWithTag(PagedPool,cchFilename.MaximumLength, TAG_STRING); cchFilename.Length = 0; @@ -382,7 +383,7 @@ NtGdiAddFontResource(PUNICODE_STRING Filename, DWORD fl) } src = SafeFileName.Buffer; - SafeFileName.Buffer = (PWSTR)ExAllocatePool(PagedPool, SafeFileName.MaximumLength); + SafeFileName.Buffer = (PWSTR)ExAllocatePoolWithTag(PagedPool, SafeFileName.MaximumLength, TAG_STRING); if(!SafeFileName.Buffer) { SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); @@ -916,7 +917,7 @@ NtGdiGetCharWidth32(HDC hDC, } BufferSize = (LastChar - FirstChar) * sizeof(INT); - SafeBuffer = ExAllocatePool(PagedPool, BufferSize); + SafeBuffer = ExAllocatePoolWithTag(PagedPool, BufferSize, TAG_GDITEXT); if (SafeBuffer == NULL) { SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); @@ -1219,7 +1220,7 @@ NtGdiGetTextExtentExPoint(HDC hDC, return TRUE; } - String = ExAllocatePool(PagedPool, Count * sizeof(WCHAR)); + String = ExAllocatePoolWithTag(PagedPool, Count * sizeof(WCHAR), TAG_GDITEXT); if (NULL == String) { SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); @@ -1228,7 +1229,7 @@ NtGdiGetTextExtentExPoint(HDC hDC, if (NULL != UnsafeDx) { - Dx = ExAllocatePool(PagedPool, Count * sizeof(INT)); + Dx = ExAllocatePoolWithTag(PagedPool, Count * sizeof(INT), TAG_GDITEXT); if (NULL == Dx) { ExFreePool(String); From 6bd07e5854ba04613728c001b447e9911aaa3701 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Thu, 19 Feb 2004 21:19:27 +0000 Subject: [PATCH 0093/1463] Sync to Wine-20040213 * Jon Griffiths <jon_p_griffiths@yahoo.com> Add some missing prototypes, fix AssocIsDangerous. Implement StrRetToBSTR, delay-import oleaut32. * Alexandre Julliard Only link against libdxguid where necessary. * Juan Lang <juan_lang@yahoo.com> Stub for MLIsMLHInstance. * Francois Gouget <fgouget@free.fr> Add missing '\n's to debug traces. svn path=/trunk/; revision=8272 --- reactos/lib/shlwapi/Makefile.in | 1 + reactos/lib/shlwapi/Makefile.ros-template | 5 +- reactos/lib/shlwapi/assoc.c | 15 ++++- reactos/lib/shlwapi/ordinal.c | 11 ++++ reactos/lib/shlwapi/shlwapi.spec | 11 ++-- reactos/lib/shlwapi/string.c | 69 ++++++++++++++++++++++- 6 files changed, 100 insertions(+), 12 deletions(-) diff --git a/reactos/lib/shlwapi/Makefile.in b/reactos/lib/shlwapi/Makefile.in index 828ee7b3951..f5eee2e2a52 100644 --- a/reactos/lib/shlwapi/Makefile.in +++ b/reactos/lib/shlwapi/Makefile.in @@ -5,6 +5,7 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = shlwapi.dll IMPORTS = ole32 user32 gdi32 advapi32 kernel32 +DELAYIMPORTS = oleaut32 EXTRALIBS = -luuid $(LIBUNICODE) C_SRCS = \ diff --git a/reactos/lib/shlwapi/Makefile.ros-template b/reactos/lib/shlwapi/Makefile.ros-template index 66a6c752210..50743c4bbfa 100644 --- a/reactos/lib/shlwapi/Makefile.ros-template +++ b/reactos/lib/shlwapi/Makefile.ros-template @@ -1,4 +1,4 @@ -# $Id: Makefile.ros-template,v 1.2 2004/01/03 23:45:25 sedwards Exp $ +# $Id: Makefile.ros-template,v 1.3 2004/02/19 21:19:27 gvg Exp $ TARGET_NAME = shlwapi @@ -6,7 +6,8 @@ TARGET_OBJECTS = @C_SRCS@ TARGET_CFLAGS = -D__REACTOS__ @EXTRADEFS@ -TARGET_SDKLIBS = @IMPORTS@ libwine.a wine_uuid.a ntdll.a libwine_unicode.a +# FIXME: we don't do delayed imports yet so oleaut32.a is listed explicitly +TARGET_SDKLIBS = @IMPORTS@ oleaut32.a libwine.a wine_uuid.a ntdll.a libwine_unicode.a TARGET_NORC = yes diff --git a/reactos/lib/shlwapi/assoc.c b/reactos/lib/shlwapi/assoc.c index 849748d896e..753828944ca 100644 --- a/reactos/lib/shlwapi/assoc.c +++ b/reactos/lib/shlwapi/assoc.c @@ -414,11 +414,20 @@ HRESULT WINAPI AssocQueryStringByKeyA(ASSOCF cfFlags, ASSOCSTR str, HKEY hkAssoc /************************************************************************** * AssocIsDangerous (SHLWAPI.@) + * + * Determine if a file association is dangerous (potentially malware). + * + * PARAMS + * lpszAssoc [I] Name of file or file extention to check. + * + * RETURNS + * TRUE, if lpszAssoc may potentially be malware (executable), + * FALSE, Otherwise. */ -HRESULT WINAPI AssocIsDangerous( ASSOCSTR str ) +BOOL WINAPI AssocIsDangerous(LPCWSTR lpszAssoc) { - FIXME("%08x\n", str); - return S_FALSE; + FIXME("%s\n", debugstr_w(lpszAssoc)); + return FALSE; } /************************************************************************** diff --git a/reactos/lib/shlwapi/ordinal.c b/reactos/lib/shlwapi/ordinal.c index 9451a845649..99a182172e7 100644 --- a/reactos/lib/shlwapi/ordinal.c +++ b/reactos/lib/shlwapi/ordinal.c @@ -3677,6 +3677,17 @@ BOOL WINAPI MLFreeLibrary(HMODULE hModule) return FreeLibrary(hModule); } +/************************************************************************* + * @ [SHLWAPI.429] + * FIXME I have no idea what this function does or what its arguments are. + */ +BOOL WINAPI MLIsMLHInstance(HINSTANCE hInst) +{ + FIXME("(%p) stub\n", hInst); + return FALSE; +} + + /************************************************************************* * @ [SHLWAPI.430] */ diff --git a/reactos/lib/shlwapi/shlwapi.spec b/reactos/lib/shlwapi/shlwapi.spec index 639ac5ff56c..adf2adc96f5 100644 --- a/reactos/lib/shlwapi/shlwapi.spec +++ b/reactos/lib/shlwapi/shlwapi.spec @@ -426,7 +426,7 @@ 426 stub -noname DestroyMenuWrap 427 stub -noname TrackPopupMenuWrap 428 stdcall @(long long long long long ptr) user32.TrackPopupMenuEx -429 stub -noname MLIsMLHInstance +429 stdcall -noname MLIsMLHInstance(long) 430 stdcall -noname MLSetMLHInstance(long long) 431 stdcall -noname MLClearMLHInstance(long) 432 stub -noname SHSendMessageBroadcastA @@ -796,10 +796,11 @@ # exported in later versions @ stdcall AssocIsDangerous(long) -@ stdcall StrRetToBufA (ptr ptr ptr long) -@ stdcall StrRetToBufW (ptr ptr ptr long) -@ stdcall StrRetToStrA (ptr ptr ptr) -@ stdcall StrRetToStrW (ptr ptr ptr) +@ stdcall StrRetToBufA(ptr ptr ptr long) +@ stdcall StrRetToBufW(ptr ptr ptr long) +@ stdcall StrRetToBSTR(ptr ptr ptr) +@ stdcall StrRetToStrA(ptr ptr ptr) +@ stdcall StrRetToStrW(ptr ptr ptr) @ stdcall SHRegGetPathA(long str str ptr long) @ stdcall SHRegGetPathW(long wstr wstr ptr long) @ stdcall PathIsDirectoryEmptyA(str) diff --git a/reactos/lib/shlwapi/string.c b/reactos/lib/shlwapi/string.c index 2779ab7c303..85584b2afd2 100644 --- a/reactos/lib/shlwapi/string.c +++ b/reactos/lib/shlwapi/string.c @@ -1333,7 +1333,7 @@ LPWSTR WINAPI StrCatBuffW(LPWSTR lpszStr, LPCWSTR lpszCat, INT cchMax) * * PARAMS * lpStrRet [O] STRRET to convert - * pIdl [I] ITEMIDLIST for lpStrRet->uType = STRRET_OFFSETA + * pIdl [I] ITEMIDLIST for lpStrRet->uType == STRRET_OFFSET * lpszDest [O] Destination for normal string * dwLen [I] Length of lpszDest * @@ -1444,7 +1444,7 @@ HRESULT WINAPI StrRetToBufW (LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest, * * PARAMS * lpStrRet [O] STRRET to convert - * pidl [I] ITEMIDLIST for lpStrRet->uType = STRRET_OFFSETA + * pidl [I] ITEMIDLIST for lpStrRet->uType == STRRET_OFFSET * ppszName [O] Destination for converted string * * RETURNS @@ -1508,6 +1508,71 @@ HRESULT WINAPI StrRetToStrW(LPSTRRET lpStrRet, const ITEMIDLIST *pidl, LPWSTR *p return hRet; } +/* Create an ASCII string copy using SysAllocString() */ +static HRESULT _SHStrDupAToBSTR(LPCSTR src, BSTR *pBstrOut) +{ + *pBstrOut = NULL; + + if (src) + { + INT len = MultiByteToWideChar(CP_ACP, 0, src, -1, NULL, 0); + WCHAR* szTemp = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); + + if (szTemp) + { + MultiByteToWideChar(CP_ACP, 0, src, -1, szTemp, len); + *pBstrOut = SysAllocString(szTemp); + HeapFree(GetProcessHeap(), 0, szTemp); + + if (*pBstrOut) + return S_OK; + } + } + return E_OUTOFMEMORY; +} + +/************************************************************************* + * StrRetToBSTR [SHLWAPI.@] + * + * Converts a STRRET to a BSTR. + * + * PARAMS + * lpStrRet [O] STRRET to convert + * pidl [I] ITEMIDLIST for lpStrRet->uType = STRRET_OFFSET + * pBstrOut [O] Destination for converted BSTR + * + * RETURNS + * Success: S_OK. pBstrOut contains the new string. + * Failure: E_FAIL, if any parameters are invalid. + */ +HRESULT WINAPI StrRetToBSTR(STRRET *lpStrRet, LPCITEMIDLIST pidl, BSTR* pBstrOut) +{ + HRESULT hRet = E_FAIL; + + switch (lpStrRet->uType) + { + case STRRET_WSTR: + *pBstrOut = SysAllocString(lpStrRet->u.pOleStr); + if (*pBstrOut) + hRet = S_OK; + CoTaskMemFree(lpStrRet->u.pOleStr); + break; + + case STRRET_CSTR: + hRet = _SHStrDupAToBSTR(lpStrRet->u.cStr, pBstrOut); + break; + + case STRRET_OFFSET: + hRet = _SHStrDupAToBSTR(((LPCSTR)&pidl->mkid) + lpStrRet->u.uOffset, pBstrOut); + break; + + default: + *pBstrOut = NULL; + } + + return hRet; +} + /************************************************************************* * StrFormatKBSizeA [SHLWAPI.@] * From 59e447fc8fdcaef89fb4557a8d11a76337c2df35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Thu, 19 Feb 2004 21:24:54 +0000 Subject: [PATCH 0094/1463] Also zero out first sector of root dir when formatting FAT12 and FAT16 volumes svn path=/trunk/; revision=8274 --- reactos/lib/fslib/vfatlib/fat12.c | 2 +- reactos/lib/fslib/vfatlib/fat16.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/fslib/vfatlib/fat12.c b/reactos/lib/fslib/vfatlib/fat12.c index f22cb01683d..16dca94701b 100644 --- a/reactos/lib/fslib/vfatlib/fat12.c +++ b/reactos/lib/fslib/vfatlib/fat12.c @@ -223,7 +223,7 @@ Fat12WriteRootDirectory(IN HANDLE FileHandle, memset(Buffer, 0, 32 * 1024); Sectors = 32 * 1024 / BootSector->BytesPerSector; - for (i = 1; i < RootDirSectors; i += Sectors) + for (i = 0; i < RootDirSectors; i += Sectors) { /* Zero some sectors of the root directory */ FileOffset.QuadPart = (FirstRootDirSector + i) * BootSector->BytesPerSector; diff --git a/reactos/lib/fslib/vfatlib/fat16.c b/reactos/lib/fslib/vfatlib/fat16.c index d7a2877a579..0867d8a08ce 100644 --- a/reactos/lib/fslib/vfatlib/fat16.c +++ b/reactos/lib/fslib/vfatlib/fat16.c @@ -226,7 +226,7 @@ Fat16WriteRootDirectory(IN HANDLE FileHandle, memset(Buffer, 0, 32 * 1024); Sectors = 32 * 1024 / BootSector->BytesPerSector; - for (i = 1; i < RootDirSectors; i += Sectors) + for (i = 0; i < RootDirSectors; i += Sectors) { /* Zero some sectors of the root directory */ FileOffset.QuadPart = (FirstRootDirSector + i) * BootSector->BytesPerSector; From 1355d672b4e7ea2847e7485670fe420123a7c943 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Thu, 19 Feb 2004 22:24:59 +0000 Subject: [PATCH 0095/1463] Move --include-dir from helper.mk to rules.mak svn path=/trunk/; revision=8275 --- reactos/rules.mak | 2 +- reactos/tools/helper.mk | 15 +-------------- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/reactos/rules.mak b/reactos/rules.mak index 4ef0db56021..e23920f6fc7 100644 --- a/reactos/rules.mak +++ b/reactos/rules.mak @@ -86,7 +86,7 @@ CPP = $(PREFIX)cpp AR = $(PREFIX)ar RC = $(PREFIX)windres WRC = $(WINE_TOP)/tools/wrc/wrc -# already defined via makefile "helper.mk": RCINC = --include-dir $(PATH_TO_TOP)/include +RCINC = --include-dir $(PATH_TO_TOP)/include OBJCOPY = $(PREFIX)objcopy OBJDUMP =$(PREFIX)objdump TOOLS_PATH = $(PATH_TO_TOP)/tools diff --git a/reactos/tools/helper.mk b/reactos/tools/helper.mk index 7ef2c01786f..0a6d2deb261 100644 --- a/reactos/tools/helper.mk +++ b/reactos/tools/helper.mk @@ -1,4 +1,4 @@ -# $Id: helper.mk,v 1.50 2004/02/09 07:03:16 vizzini Exp $ +# $Id: helper.mk,v 1.51 2004/02/19 22:24:58 gvg Exp $ # # Helper makefile for ReactOS modules # Variables this makefile accepts: @@ -150,7 +150,6 @@ ifeq ($(TARGET_TYPE),proglib) MK_SDKLIBS := MK_CFLAGS := -I./ -I$(SDK_PATH_INC) MK_CPPFLAGS := -I./ -I$(SDK_PATH_INC) - MK_RCFLAGS := --include-dir $(SDK_PATH_INC) MK_IMPLIB := yes MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := $(SDK_PATH_LIB) @@ -171,7 +170,6 @@ ifeq ($(TARGET_TYPE),dynlink) ifneq ($(WINE_MODE),yes) MK_CFLAGS := -I./ -I$(SDK_PATH_INC) MK_CPPFLAGS := -I./ -I$(SDK_PATH_INC) - MK_RCFLAGS := --include-dir $(SDK_PATH_INC) else MK_CFLAGS := -I$(PATH_TO_TOP)/include/wine -I./ -I$(WINE_INCLUDE) MK_CPPFLAGS := -I$(PATH_TO_TOP)/include/wine -I./ -I$(WINE_INCLUDE) @@ -201,7 +199,6 @@ ifeq ($(TARGET_TYPE),library) MK_SDKLIBS := MK_CFLAGS := -I./ -I$(SDK_PATH_INC) MK_CPPFLAGS := -I./ -I$(SDK_PATH_INC) - MK_RCFLAGS := --include-dir $(SDK_PATH_INC) MK_IMPLIB := no MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := @@ -218,7 +215,6 @@ ifeq ($(TARGET_TYPE),kmlibrary) MK_DEFEXT := .a MK_CFLAGS := -I./ -I$(DDK_PATH_INC) MK_CPPFLAGS := -I./ -I$(DDK_PATH_INC) - MK_RCFLAGS := --include-dir $(SDK_PATH_INC) MK_IMPLIB := no MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := $(DDK_PATH_LIB) @@ -233,7 +229,6 @@ ifeq ($(TARGET_TYPE),driver_library) MK_SDKLIBS := MK_CFLAGS := -I./ -I$(DDK_PATH_INC) MK_CPPFLAGS := -I./ -I$(DDK_PATH_INC) - MK_RCFLAGS := --include-dir $(SDK_PATH_INC) MK_IMPLIB := no MK_IMPLIBONLY := yes MK_IMPLIBDEFPATH := $(DDK_PATH_LIB) @@ -253,7 +248,6 @@ ifeq ($(TARGET_TYPE),driver) MK_SDKLIBS := MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) - MK_RCFLAGS := --include-dir $(SDK_PATH_INC) MK_IMPLIB := no MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := @@ -273,7 +267,6 @@ ifeq ($(TARGET_TYPE),export_driver) MK_SDKLIBS := MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) - MK_RCFLAGS := --include-dir $(SDK_PATH_INC) MK_IMPLIB := yes MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := $(DDK_PATH_LIB) @@ -293,7 +286,6 @@ ifeq ($(TARGET_TYPE),hal) MK_SDKLIBS := MK_CFLAGS := -D__NTHAL__ -I./ -I$(DDK_PATH_INC) MK_CPPFLAGS := -D__NTHAL__ -I./ -I$(DDK_PATH_INC) - MK_RCFLAGS := --include-dir $(SDK_PATH_INC) MK_IMPLIB := yes MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := @@ -313,7 +305,6 @@ ifeq ($(TARGET_TYPE),bootpgm) MK_SDKLIBS := MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) - MK_RCFLAGS := --include-dir $(SDK_PATH_INC) MK_IMPLIB := no MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := @@ -333,7 +324,6 @@ ifeq ($(TARGET_TYPE),miniport) MK_SDKLIBS := MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) - MK_RCFLAGS := --include-dir $(SDK_PATH_INC) MK_IMPLIB := no MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := @@ -353,7 +343,6 @@ ifeq ($(TARGET_TYPE),gdi_driver) MK_SDKLIBS := MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) - MK_RCFLAGS := --include-dir $(SDK_PATH_INC) MK_IMPLIB := yes MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := $(DDK_PATH_LIB) @@ -418,7 +407,6 @@ ifeq ($(TARGET_TYPE),subsystem) MK_SDKLIBS := MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) - MK_RCFLAGS := --include-dir $(SDK_PATH_INC) MK_IMPLIB := yes MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := $(DDK_PATH_LIB) @@ -437,7 +425,6 @@ ifeq ($(TARGET_TYPE),kmdll) MK_SDKLIBS := MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) - MK_RCFLAGS := --include-dir $(SDK_PATH_INC) MK_IMPLIB := yes MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := $(DDK_PATH_LIB) From a7e30599ea011632e9cfd4e24026cc88bd2c7da6 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III <royce3@ev1.net> Date: Fri, 20 Feb 2004 07:45:58 +0000 Subject: [PATCH 0096/1463] If nWidth or nHeight is zero, CreateBitmap returns the handle to a 1- by 1-pixel, monochrome bitmap. svn path=/trunk/; revision=8276 --- reactos/subsys/win32k/objects/bitmaps.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index 1085bff3364..e8bff7e148b 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.55 2004/02/19 21:12:10 weiden Exp $ */ +/* $Id: bitmaps.c,v 1.56 2004/02/20 07:45:58 royce Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> #include <stdlib.h> @@ -249,7 +249,8 @@ HBITMAP STDCALL NtGdiCreateBitmap(INT Width, /* Check parameters */ if (!Height || !Width) { - return 0; + Width = 1; + Height = 1; } if (Planes != 1) { From 4009a9e979dc93ef7b491ee8616197adb0a24172 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Fri, 20 Feb 2004 08:33:37 +0000 Subject: [PATCH 0097/1463] Kill another --include-dir svn path=/trunk/; revision=8277 --- reactos/tools/helper.mk | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/reactos/tools/helper.mk b/reactos/tools/helper.mk index 0a6d2deb261..f376b40edcf 100644 --- a/reactos/tools/helper.mk +++ b/reactos/tools/helper.mk @@ -1,4 +1,4 @@ -# $Id: helper.mk,v 1.51 2004/02/19 22:24:58 gvg Exp $ +# $Id: helper.mk,v 1.52 2004/02/20 08:33:37 gvg Exp $ # # Helper makefile for ReactOS modules # Variables this makefile accepts: @@ -121,7 +121,6 @@ ifeq ($(TARGET_TYPE),program) ifneq ($(WINE_MODE),yes) MK_CFLAGS := -I./ -I$(SDK_PATH_INC) MK_CPPFLAGS := -I./ -I$(SDK_PATH_INC) - MK_RCFLAGS := --include-dir $(SDK_PATH_INC) else MK_CFLAGS := -I$(PATH_TO_TOP)/include/wine -I./ -I$(WINE_INCLUDE) MK_CPPFLAGS := -I$(PATH_TO_TOP)/include/wine -I./ -I$(WINE_INCLUDE) From fd26a9a27b89a7fc27c860486fa919df5089c80b Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 20 Feb 2004 15:05:36 +0000 Subject: [PATCH 0098/1463] - Fixed line endings svn path=/trunk/; revision=8278 --- reactos/apps/utils/regsvr32/regsvr32.rc | 76 ++++++++++++------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/reactos/apps/utils/regsvr32/regsvr32.rc b/reactos/apps/utils/regsvr32/regsvr32.rc index 99c008244e8..9c4131fbe41 100644 --- a/reactos/apps/utils/regsvr32/regsvr32.rc +++ b/reactos/apps/utils/regsvr32/regsvr32.rc @@ -1,38 +1,38 @@ -#include <defines.h> -#include <reactos/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", "Register a COM component in the registry\0" - VALUE "FileVersion", RES_STR_FILE_VERSION - VALUE "InternalName", "regsvr32\0" - VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT - VALUE "OriginalFilename", "regsvr32.exe\0" - VALUE "ProductName", RES_STR_PRODUCT_NAME - VALUE "ProductVersion", RES_STR_PRODUCT_VERSION - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - +#include <defines.h> +#include <reactos/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", "Register a COM component in the registry\0" + VALUE "FileVersion", RES_STR_FILE_VERSION + VALUE "InternalName", "regsvr32\0" + VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT + VALUE "OriginalFilename", "regsvr32.exe\0" + VALUE "ProductName", RES_STR_PRODUCT_NAME + VALUE "ProductVersion", RES_STR_PRODUCT_VERSION + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + From 184c8d2fba15405c41fc23196b262e84b1835e88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Fri, 20 Feb 2004 23:24:30 +0000 Subject: [PATCH 0099/1463] Bump version number on HEAD svn path=/trunk/; revision=8279 --- reactos/include/reactos/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/include/reactos/version.h b/reactos/include/reactos/version.h index 0903a5418cc..00c68942cb4 100644 --- a/reactos/include/reactos/version.h +++ b/reactos/include/reactos/version.h @@ -1,4 +1,4 @@ -/* $Id: version.h,v 1.19 2004/01/14 23:40:14 gvg Exp $ +/* $Id: version.h,v 1.20 2004/02/20 23:24:30 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -19,7 +19,7 @@ #define KERNEL_VERSION_MAJOR 0 #define KERNEL_VERSION_MINOR 2 -#define KERNEL_VERSION_PATCH_LEVEL 1 +#define KERNEL_VERSION_PATCH_LEVEL 2 /* KERNEL_VERSION_BUILD_TYPE is L"CVS", L"RC1", L"RC2" or L"FINAL" */ #define KERNEL_VERSION_BUILD_TYPE L"CVS" From b3e3acc7848519e7503b3c0cb4e0828f3dd9ead5 Mon Sep 17 00:00:00 2001 From: Mike Nordell <tamlin@algonet.se> Date: Sat, 21 Feb 2004 08:02:49 +0000 Subject: [PATCH 0100/1463] Fix environment variable handling. The (optional) envp argument to main() shall not contain strings of the form "=C:=C:\directory\". svn path=/trunk/; revision=8280 --- reactos/lib/msvcrt/misc/environ.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/reactos/lib/msvcrt/misc/environ.c b/reactos/lib/msvcrt/misc/environ.c index 1416792ef6f..e3ee991e27f 100644 --- a/reactos/lib/msvcrt/misc/environ.c +++ b/reactos/lib/msvcrt/misc/environ.c @@ -1,4 +1,4 @@ -/* $Id: environ.c,v 1.6 2003/12/24 23:20:08 sedwards Exp $ +/* $Id: environ.c,v 1.7 2004/02/21 08:02:49 tamlin Exp $ * * dllmain.c * @@ -43,7 +43,7 @@ int *__p__commode(void) // not exported by NTDLL int BlockEnvToEnviron(void) { char * ptr, * ptr2; - int i, len; + int i, count; DPRINT("BlockEnvToEnviron()\n"); @@ -57,18 +57,25 @@ int BlockEnvToEnviron(void) DPRINT("GetEnvironmentStringsA() returnd NULL\n"); return -1; } - len = 0; + count = 0; while (*ptr2) { - len++; + /* skip current directory of the form "=C:=C:\directory\" */ + if (*ptr2 != '=') { + count++; + } ptr2 += strlen(ptr2) + 1; } - _environ = malloc((len + 1) * sizeof(char*)); + _environ = malloc((count + 1) * sizeof(char*)); if (_environ == NULL) { FreeEnvironmentStringsA(ptr); return -1; } - for (i = 0; i < len && *ptr; i++) { - _environ[i] = ptr; + i = 0; + while (i < count && *ptr) { + if (*ptr != '=') { + _environ[i] = ptr; + ++i; + } ptr += strlen(ptr) + 1; } _environ[i] = NULL; From 6659cc3181d98cb6d15f4f67b46ffc09698c1725 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 21 Feb 2004 09:06:25 +0000 Subject: [PATCH 0101/1463] =?UTF-8?q?-=20Fix=20by=20Waldo=20Alvarez=20Ca?= =?UTF-8?q?=EF=BF=BDizares=20for=208=20<->=208=20bpp=20and=2032=20<->=2032?= =?UTF-8?q?=20bpp=20StretchBlt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit svn path=/trunk/; revision=8281 --- reactos/subsys/win32k/dib/dib32bpp.c | 4 ++-- reactos/subsys/win32k/dib/dib8bpp.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib32bpp.c b/reactos/subsys/win32k/dib/dib32bpp.c index e735af40645..63e40058aac 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.11 2003/12/23 19:28:23 navaraf Exp $ */ +/* $Id: dib32bpp.c,v 1.12 2004/02/21 09:06:25 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> #include <stdlib.h> @@ -338,7 +338,7 @@ void ScaleRectAvg32(PIXEL *Target, PIXEL *Source, int SrcWidth, int SrcHeight, int TgtWidth, int TgtHeight, int srcPitch, int dstPitch) { int NumPixels = TgtHeight; - int IntPart = (SrcHeight / TgtHeight) * SrcWidth; + int IntPart = ((SrcHeight / TgtHeight) * srcPitch) / 2; //(SrcHeight / TgtHeight) * SrcWidth; int FractPart = SrcHeight % TgtHeight; int Mid = TgtHeight / 2; int E = 0; diff --git a/reactos/subsys/win32k/dib/dib8bpp.c b/reactos/subsys/win32k/dib/dib8bpp.c index 9c679a2764c..20727dd46bb 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.13 2004/02/14 22:24:54 navaraf Exp $ */ +/* $Id: dib8bpp.c,v 1.14 2004/02/21 09:06:25 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> #include <stdlib.h> @@ -393,7 +393,7 @@ void ScaleRectAvg8(PIXEL *Target, PIXEL *Source, int SrcWidth, int SrcHeight, int TgtWidth, int TgtHeight, int srcPitch, int dstPitch) { int NumPixels = TgtHeight; - int IntPart = (SrcHeight / TgtHeight) * SrcWidth; + int IntPart = ((SrcHeight / TgtHeight) * srcPitch) / 2; //(SrcHeight / TgtHeight) * SrcWidth; int FractPart = SrcHeight % TgtHeight; int Mid = TgtHeight / 2; int E = 0; From 30e8e2d0b0066fb8848ee8800e02a1c4adbdcef7 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 21 Feb 2004 09:06:27 +0000 Subject: [PATCH 0102/1463] =?UTF-8?q?-=20Minor=20correction=20to=20NtConne?= =?UTF-8?q?ctPort=20to=20avoid=20freeing=20NULL=20pointer.=20Based=20on=20?= =?UTF-8?q?patch=20by=20Waldo=20Alvarez=20Ca=EF=BF=BDizares.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit svn path=/trunk/; revision=8282 --- reactos/ntoskrnl/lpc/connect.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/reactos/ntoskrnl/lpc/connect.c b/reactos/ntoskrnl/lpc/connect.c index c2066be4677..48d9eaf41fe 100644 --- a/reactos/ntoskrnl/lpc/connect.c +++ b/reactos/ntoskrnl/lpc/connect.c @@ -1,4 +1,4 @@ -/* $Id: connect.c,v 1.25 2004/02/02 23:48:42 ea Exp $ +/* $Id: connect.c,v 1.26 2004/02/21 09:06:27 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -432,17 +432,6 @@ NtConnectPort (PHANDLE UnsafeConnectedPortHandle, { if (UnsafeConnectDataLength != NULL) { - if (ExGetPreviousMode() != KernelMode) - { - Status = MmCopyToCaller(UnsafeConnectData, - ConnectData, - ConnectDataLength); - ExFreePool(ConnectData); - if (!NT_SUCCESS(Status)) - { - return(Status); - } - } Status = MmCopyToCaller(UnsafeConnectDataLength, &ConnectDataLength, sizeof(ULONG)); @@ -451,6 +440,17 @@ NtConnectPort (PHANDLE UnsafeConnectedPortHandle, return(Status); } } + if (UnsafeConnectData != NULL && ConnectData != NULL) + { + Status = MmCopyToCaller(UnsafeConnectData, + ConnectData, + ConnectDataLength); + ExFreePool(ConnectData); + if (!NT_SUCCESS(Status)) + { + return(Status); + } + } } Status = ObInsertObject(ConnectedPort, NULL, From 1f1b824d087e5332ea4996f4deb9bf81deb30d45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Sat, 21 Feb 2004 09:20:39 +0000 Subject: [PATCH 0103/1463] Import w32api version 2.5 include files svn path=/trunk/; revision=8283 --- reactos/apps/tests/lpc/makefile | 2 +- reactos/apps/tests/mstest/Makefile | 2 +- reactos/apps/tests/nptest/Makefile | 2 +- reactos/apps/tests/shm/makefile | 2 +- reactos/include/napi/types.h | 2 + reactos/include/ntos/zwtypes.h | 2 + reactos/ntoskrnl/Makefile | 8 +- reactos/rules.mak | 29 +- reactos/subsys/system/cmd/makefile | 2 +- reactos/subsys/system/explorer/Makefile | 5 +- reactos/tools/Makefile | 4 +- reactos/tools/cabman/makefile | 2 +- reactos/tools/helper.mk | 78 +- reactos/tools/pipetools/Makefile | 9 +- reactos/tools/winebuild/Makefile | 2 +- reactos/w32api/README.w32api | 93 + reactos/w32api/include/GL/gl.h | 1472 ++++ reactos/w32api/include/GL/glext.h | 4623 ++++++++++++ reactos/w32api/include/GL/glu.h | 278 + reactos/w32api/include/accctrl.h | 329 + reactos/w32api/include/aclapi.h | 117 + reactos/w32api/include/afxres.h | 23 + reactos/w32api/include/basetsd.h | 119 + reactos/w32api/include/basetyps.h | 166 + reactos/w32api/include/cderr.h | 44 + reactos/w32api/include/cguid.h | 83 + reactos/w32api/include/comcat.h | 177 + reactos/w32api/include/commctrl.h | 3513 +++++++++ reactos/w32api/include/commdlg.h | 583 ++ reactos/w32api/include/cpl.h | 61 + reactos/w32api/include/cplext.h | 12 + reactos/w32api/include/custcntl.h | 102 + reactos/w32api/include/dbt.h | 114 + reactos/w32api/include/dde.h | 64 + reactos/w32api/include/ddeml.h | 314 + reactos/w32api/include/ddk/atm.h | 510 ++ reactos/w32api/include/ddk/batclass.h | 302 + reactos/w32api/include/ddk/cfg.h | 143 + reactos/w32api/include/ddk/cfgmgr32.h | 1533 ++++ reactos/w32api/include/ddk/d4drvif.h | 108 + reactos/w32api/include/ddk/d4iface.h | 88 + reactos/w32api/include/ddk/ddkmapi.h | 338 + reactos/w32api/include/ddk/hidclass.h | 151 + reactos/w32api/include/ddk/hidpi.h | 608 ++ reactos/w32api/include/ddk/hidusage.h | 210 + reactos/w32api/include/ddk/mcd.h | 147 + reactos/w32api/include/ddk/miniport.h | 82 + reactos/w32api/include/ddk/minitape.h | 223 + reactos/w32api/include/ddk/mountdev.h | 84 + reactos/w32api/include/ddk/mountmgr.h | 144 + reactos/w32api/include/ddk/ndis.h | 5189 +++++++++++++ reactos/w32api/include/ddk/ndisguid.h | 439 ++ reactos/w32api/include/ddk/ndistapi.h | 1312 ++++ reactos/w32api/include/ddk/ndiswan.h | 255 + reactos/w32api/include/ddk/netevent.h | 42 + reactos/w32api/include/ddk/netpnp.h | 73 + reactos/w32api/include/ddk/newdev.h | 70 + reactos/w32api/include/ddk/ntapi.h | 2887 +++++++ reactos/w32api/include/ddk/ntdd8042.h | 218 + reactos/w32api/include/ddk/ntddbeep.h | 59 + reactos/w32api/include/ddk/ntddcdrm.h | 352 + reactos/w32api/include/ddk/ntddcdvd.h | 214 + reactos/w32api/include/ddk/ntddchgr.h | 358 + reactos/w32api/include/ddk/ntdddisk.h | 522 ++ reactos/w32api/include/ddk/ntddk.h | 90 + reactos/w32api/include/ddk/ntddkbd.h | 140 + reactos/w32api/include/ddk/ntddmou.h | 120 + reactos/w32api/include/ddk/ntddndis.h | 188 + reactos/w32api/include/ddk/ntddpar.h | 124 + reactos/w32api/include/ddk/ntddpcm.h | 170 + reactos/w32api/include/ddk/ntddscsi.h | 176 + reactos/w32api/include/ddk/ntddser.h | 454 ++ reactos/w32api/include/ddk/ntddstor.h | 338 + reactos/w32api/include/ddk/ntddtape.h | 84 + reactos/w32api/include/ddk/ntddtdi.h | 66 + reactos/w32api/include/ddk/ntddvdeo.h | 444 ++ reactos/w32api/include/ddk/ntddvol.h | 146 + reactos/w32api/include/ddk/ntifs.h | 4691 ++++++++++++ reactos/w32api/include/ddk/ntpoapi.h | 234 + reactos/w32api/include/ddk/ntstatus.h | 1105 +++ reactos/w32api/include/ddk/parallel.h | 282 + reactos/w32api/include/ddk/pfhook.h | 81 + reactos/w32api/include/ddk/poclass.h | 123 + reactos/w32api/include/ddk/scsi.h | 1698 +++++ reactos/w32api/include/ddk/scsiscan.h | 135 + reactos/w32api/include/ddk/scsiwmi.h | 215 + reactos/w32api/include/ddk/smbus.h | 194 + reactos/w32api/include/ddk/srb.h | 757 ++ reactos/w32api/include/ddk/storport.h | 426 ++ reactos/w32api/include/ddk/tdi.h | 597 ++ reactos/w32api/include/ddk/tdiinfo.h | 115 + reactos/w32api/include/ddk/tdikrnl.h | 1166 +++ reactos/w32api/include/ddk/tdistat.h | 83 + reactos/w32api/include/ddk/tvout.h | 121 + reactos/w32api/include/ddk/upssvc.h | 98 + reactos/w32api/include/ddk/usb.h | 475 ++ reactos/w32api/include/ddk/usb100.h | 233 + reactos/w32api/include/ddk/usbcamdi.h | 404 + reactos/w32api/include/ddk/usbdi.h | 412 + reactos/w32api/include/ddk/usbioctl.h | 353 + reactos/w32api/include/ddk/usbiodef.h | 111 + reactos/w32api/include/ddk/usbscan.h | 163 + reactos/w32api/include/ddk/usbuser.h | 329 + reactos/w32api/include/ddk/video.h | 1570 ++++ reactos/w32api/include/ddk/videoagp.h | 133 + reactos/w32api/include/ddk/win2k.h | 106 + reactos/w32api/include/ddk/winddi.h | 4146 +++++++++++ reactos/w32api/include/ddk/winddk.h | 9103 +++++++++++++++++++++++ reactos/w32api/include/ddk/winnt4.h | 608 ++ reactos/w32api/include/ddk/winxp.h | 38 + reactos/w32api/include/ddk/ws2san.h | 252 + reactos/w32api/include/ddk/xfilter.h | 239 + reactos/w32api/include/dhcpcsdk.h | 42 + reactos/w32api/include/dlgs.h | 186 + reactos/w32api/include/docobj.h | 148 + reactos/w32api/include/errorrep.h | 40 + reactos/w32api/include/exdisp.h | 257 + reactos/w32api/include/exdispid.h | 14 + reactos/w32api/include/httpext.h | 90 + reactos/w32api/include/idispids.h | 10 + reactos/w32api/include/imagehlp.h | 329 + reactos/w32api/include/imm.h | 430 ++ reactos/w32api/include/initguid.h | 12 + reactos/w32api/include/intshcut.h | 82 + reactos/w32api/include/ipexport.h | 88 + reactos/w32api/include/iphlpapi.h | 60 + reactos/w32api/include/ipifcons.h | 23 + reactos/w32api/include/iprtrmib.h | 209 + reactos/w32api/include/iptypes.h | 78 + reactos/w32api/include/isguids.h | 15 + reactos/w32api/include/largeint.h | 112 + reactos/w32api/include/lm.h | 27 + reactos/w32api/include/lmaccess.h | 610 ++ reactos/w32api/include/lmalert.h | 60 + reactos/w32api/include/lmapibuf.h | 18 + reactos/w32api/include/lmat.h | 39 + reactos/w32api/include/lmaudit.h | 250 + reactos/w32api/include/lmbrowsr.h | 74 + reactos/w32api/include/lmchdev.h | 61 + reactos/w32api/include/lmconfig.h | 21 + reactos/w32api/include/lmcons.h | 75 + reactos/w32api/include/lmerr.h | 306 + reactos/w32api/include/lmerrlog.h | 211 + reactos/w32api/include/lmmsg.h | 27 + reactos/w32api/include/lmremutl.h | 45 + reactos/w32api/include/lmrepl.h | 94 + reactos/w32api/include/lmserver.h | 606 ++ reactos/w32api/include/lmshare.h | 147 + reactos/w32api/include/lmsname.h | 58 + reactos/w32api/include/lmstats.h | 114 + reactos/w32api/include/lmsvc.h | 134 + reactos/w32api/include/lmuse.h | 60 + reactos/w32api/include/lmuseflg.h | 10 + reactos/w32api/include/lmwksta.h | 233 + reactos/w32api/include/lzexpand.h | 40 + reactos/w32api/include/mapi.h | 163 + reactos/w32api/include/mciavi.h | 25 + reactos/w32api/include/mcx.h | 77 + reactos/w32api/include/mgmtapi.h | 58 + reactos/w32api/include/mmsystem.h | 1941 +++++ reactos/w32api/include/mshtml.h | 454 ++ reactos/w32api/include/mswsock.h | 113 + reactos/w32api/include/nb30.h | 186 + reactos/w32api/include/nddeapi.h | 133 + reactos/w32api/include/nspapi.h | 126 + reactos/w32api/include/ntdef.h | 60 + reactos/w32api/include/ntdll.h | 15 + reactos/w32api/include/ntldap.h | 60 + reactos/w32api/include/ntsecapi.h | 612 ++ reactos/w32api/include/ntsecpkg.h | 44 + reactos/w32api/include/oaidl.h | 705 ++ reactos/w32api/include/objbase.h | 188 + reactos/w32api/include/objfwd.h | 57 + reactos/w32api/include/objidl.h | 1734 +++++ reactos/w32api/include/ocidl.h | 817 ++ reactos/w32api/include/odbcinst.h | 148 + reactos/w32api/include/ole.h | 308 + reactos/w32api/include/ole2.h | 110 + reactos/w32api/include/ole2ver.h | 8 + reactos/w32api/include/oleacc.h | 219 + reactos/w32api/include/oleauto.h | 261 + reactos/w32api/include/olectl.h | 323 + reactos/w32api/include/olectlid.h | 114 + reactos/w32api/include/oledlg.h | 935 +++ reactos/w32api/include/oleidl.h | 575 ++ reactos/w32api/include/pbt.h | 20 + reactos/w32api/include/poppack.h | 3 + reactos/w32api/include/powrprof.h | 120 + reactos/w32api/include/prsht.h | 304 + reactos/w32api/include/psapi.h | 95 + reactos/w32api/include/pshpack1.h | 3 + reactos/w32api/include/pshpack2.h | 3 + reactos/w32api/include/pshpack4.h | 3 + reactos/w32api/include/pshpack8.h | 3 + reactos/w32api/include/rapi.h | 54 + reactos/w32api/include/ras.h | 966 +++ reactos/w32api/include/rasdlg.h | 148 + reactos/w32api/include/raserror.h | 210 + reactos/w32api/include/rassapi.h | 182 + reactos/w32api/include/regstr.h | 769 ++ reactos/w32api/include/richedit.h | 513 ++ reactos/w32api/include/richole.h | 107 + reactos/w32api/include/rpc.h | 59 + reactos/w32api/include/rpcdce.h | 392 + reactos/w32api/include/rpcdce2.h | 56 + reactos/w32api/include/rpcdcep.h | 128 + reactos/w32api/include/rpcndr.h | 473 ++ reactos/w32api/include/rpcnsi.h | 122 + reactos/w32api/include/rpcnsip.h | 25 + reactos/w32api/include/rpcnterr.h | 23 + reactos/w32api/include/rpcproxy.h | 200 + reactos/w32api/include/schannel.h | 90 + reactos/w32api/include/schnlsp.h | 14 + reactos/w32api/include/scrnsave.h | 81 + reactos/w32api/include/secext.h | 43 + reactos/w32api/include/security.h | 42 + reactos/w32api/include/servprov.h | 33 + reactos/w32api/include/setupapi.h | 1579 ++++ reactos/w32api/include/shellapi.h | 282 + reactos/w32api/include/shlguid.h | 94 + reactos/w32api/include/shlobj.h | 1440 ++++ reactos/w32api/include/shlwapi.h | 712 ++ reactos/w32api/include/snmp.h | 259 + reactos/w32api/include/sql.h | 408 + reactos/w32api/include/sqlext.h | 1218 +++ reactos/w32api/include/sqltypes.h | 165 + reactos/w32api/include/sqlucode.h | 142 + reactos/w32api/include/sspi.h | 338 + reactos/w32api/include/subauth.h | 209 + reactos/w32api/include/svcguid.h | 33 + reactos/w32api/include/tlhelp32.h | 140 + reactos/w32api/include/tmschema.h | 664 ++ reactos/w32api/include/unknwn.h | 76 + reactos/w32api/include/userenv.h | 57 + reactos/w32api/include/uxtheme.h | 120 + reactos/w32api/include/vfw.h | 1130 +++ reactos/w32api/include/w32api.h | 11 + reactos/w32api/include/winable.h | 99 + reactos/w32api/include/winbase.h | 2317 ++++++ reactos/w32api/include/winber.h | 67 + reactos/w32api/include/wincon.h | 216 + reactos/w32api/include/wincrypt.h | 695 ++ reactos/w32api/include/windef.h | 331 + reactos/w32api/include/windns.h | 363 + reactos/w32api/include/windows.h | 128 + reactos/w32api/include/windowsx.h | 544 ++ reactos/w32api/include/winerror.h | 2229 ++++++ reactos/w32api/include/wingdi.h | 2981 ++++++++ reactos/w32api/include/wininet.h | 921 +++ reactos/w32api/include/winioctl.h | 546 ++ reactos/w32api/include/winldap.h | 713 ++ reactos/w32api/include/winnetwk.h | 346 + reactos/w32api/include/winnls.h | 705 ++ reactos/w32api/include/winnt.h | 3341 +++++++++ reactos/w32api/include/winperf.h | 139 + reactos/w32api/include/winreg.h | 161 + reactos/w32api/include/winresrc.h | 14 + reactos/w32api/include/winsnmp.h | 329 + reactos/w32api/include/winsock.h | 535 ++ reactos/w32api/include/winsock2.h | 1218 +++ reactos/w32api/include/winspool.h | 791 ++ reactos/w32api/include/winsvc.h | 309 + reactos/w32api/include/winuser.h | 4123 ++++++++++ reactos/w32api/include/winver.h | 133 + reactos/w32api/include/ws2spi.h | 200 + reactos/w32api/include/ws2tcpip.h | 358 + reactos/w32api/include/wsahelp.h | 92 + reactos/w32api/include/wsipx.h | 28 + reactos/w32api/include/wsnetbs.h | 35 + reactos/w32api/include/wtypes.h | 173 + reactos/w32api/include/zmouse.h | 36 + rosapps/calc/makefile | 2 + rosapps/dflat32/makefile | 2 + rosapps/hcalc/Makefile | 2 + rosapps/mc/Makefile | 8 +- rosapps/notepad/makefile | 4 +- rosapps/rules.mak | 3 + rosapps/winfile/Makefile | 2 +- 278 files changed, 118055 insertions(+), 94 deletions(-) create mode 100644 reactos/w32api/README.w32api create mode 100644 reactos/w32api/include/GL/gl.h create mode 100644 reactos/w32api/include/GL/glext.h create mode 100644 reactos/w32api/include/GL/glu.h create mode 100644 reactos/w32api/include/accctrl.h create mode 100644 reactos/w32api/include/aclapi.h create mode 100644 reactos/w32api/include/afxres.h create mode 100644 reactos/w32api/include/basetsd.h create mode 100644 reactos/w32api/include/basetyps.h create mode 100644 reactos/w32api/include/cderr.h create mode 100644 reactos/w32api/include/cguid.h create mode 100644 reactos/w32api/include/comcat.h create mode 100644 reactos/w32api/include/commctrl.h create mode 100644 reactos/w32api/include/commdlg.h create mode 100644 reactos/w32api/include/cpl.h create mode 100644 reactos/w32api/include/cplext.h create mode 100644 reactos/w32api/include/custcntl.h create mode 100644 reactos/w32api/include/dbt.h create mode 100644 reactos/w32api/include/dde.h create mode 100644 reactos/w32api/include/ddeml.h create mode 100644 reactos/w32api/include/ddk/atm.h create mode 100644 reactos/w32api/include/ddk/batclass.h create mode 100644 reactos/w32api/include/ddk/cfg.h create mode 100644 reactos/w32api/include/ddk/cfgmgr32.h create mode 100644 reactos/w32api/include/ddk/d4drvif.h create mode 100644 reactos/w32api/include/ddk/d4iface.h create mode 100644 reactos/w32api/include/ddk/ddkmapi.h create mode 100644 reactos/w32api/include/ddk/hidclass.h create mode 100644 reactos/w32api/include/ddk/hidpi.h create mode 100644 reactos/w32api/include/ddk/hidusage.h create mode 100644 reactos/w32api/include/ddk/mcd.h create mode 100644 reactos/w32api/include/ddk/miniport.h create mode 100644 reactos/w32api/include/ddk/minitape.h create mode 100644 reactos/w32api/include/ddk/mountdev.h create mode 100644 reactos/w32api/include/ddk/mountmgr.h create mode 100644 reactos/w32api/include/ddk/ndis.h create mode 100644 reactos/w32api/include/ddk/ndisguid.h create mode 100644 reactos/w32api/include/ddk/ndistapi.h create mode 100644 reactos/w32api/include/ddk/ndiswan.h create mode 100644 reactos/w32api/include/ddk/netevent.h create mode 100644 reactos/w32api/include/ddk/netpnp.h create mode 100644 reactos/w32api/include/ddk/newdev.h create mode 100644 reactos/w32api/include/ddk/ntapi.h create mode 100644 reactos/w32api/include/ddk/ntdd8042.h create mode 100644 reactos/w32api/include/ddk/ntddbeep.h create mode 100644 reactos/w32api/include/ddk/ntddcdrm.h create mode 100644 reactos/w32api/include/ddk/ntddcdvd.h create mode 100644 reactos/w32api/include/ddk/ntddchgr.h create mode 100644 reactos/w32api/include/ddk/ntdddisk.h create mode 100644 reactos/w32api/include/ddk/ntddk.h create mode 100644 reactos/w32api/include/ddk/ntddkbd.h create mode 100644 reactos/w32api/include/ddk/ntddmou.h create mode 100644 reactos/w32api/include/ddk/ntddndis.h create mode 100644 reactos/w32api/include/ddk/ntddpar.h create mode 100644 reactos/w32api/include/ddk/ntddpcm.h create mode 100644 reactos/w32api/include/ddk/ntddscsi.h create mode 100644 reactos/w32api/include/ddk/ntddser.h create mode 100644 reactos/w32api/include/ddk/ntddstor.h create mode 100644 reactos/w32api/include/ddk/ntddtape.h create mode 100644 reactos/w32api/include/ddk/ntddtdi.h create mode 100644 reactos/w32api/include/ddk/ntddvdeo.h create mode 100644 reactos/w32api/include/ddk/ntddvol.h create mode 100644 reactos/w32api/include/ddk/ntifs.h create mode 100644 reactos/w32api/include/ddk/ntpoapi.h create mode 100644 reactos/w32api/include/ddk/ntstatus.h create mode 100644 reactos/w32api/include/ddk/parallel.h create mode 100644 reactos/w32api/include/ddk/pfhook.h create mode 100644 reactos/w32api/include/ddk/poclass.h create mode 100644 reactos/w32api/include/ddk/scsi.h create mode 100644 reactos/w32api/include/ddk/scsiscan.h create mode 100644 reactos/w32api/include/ddk/scsiwmi.h create mode 100644 reactos/w32api/include/ddk/smbus.h create mode 100644 reactos/w32api/include/ddk/srb.h create mode 100644 reactos/w32api/include/ddk/storport.h create mode 100644 reactos/w32api/include/ddk/tdi.h create mode 100644 reactos/w32api/include/ddk/tdiinfo.h create mode 100644 reactos/w32api/include/ddk/tdikrnl.h create mode 100644 reactos/w32api/include/ddk/tdistat.h create mode 100644 reactos/w32api/include/ddk/tvout.h create mode 100644 reactos/w32api/include/ddk/upssvc.h create mode 100644 reactos/w32api/include/ddk/usb.h create mode 100644 reactos/w32api/include/ddk/usb100.h create mode 100644 reactos/w32api/include/ddk/usbcamdi.h create mode 100644 reactos/w32api/include/ddk/usbdi.h create mode 100644 reactos/w32api/include/ddk/usbioctl.h create mode 100644 reactos/w32api/include/ddk/usbiodef.h create mode 100644 reactos/w32api/include/ddk/usbscan.h create mode 100644 reactos/w32api/include/ddk/usbuser.h create mode 100644 reactos/w32api/include/ddk/video.h create mode 100644 reactos/w32api/include/ddk/videoagp.h create mode 100644 reactos/w32api/include/ddk/win2k.h create mode 100644 reactos/w32api/include/ddk/winddi.h create mode 100644 reactos/w32api/include/ddk/winddk.h create mode 100644 reactos/w32api/include/ddk/winnt4.h create mode 100644 reactos/w32api/include/ddk/winxp.h create mode 100644 reactos/w32api/include/ddk/ws2san.h create mode 100644 reactos/w32api/include/ddk/xfilter.h create mode 100644 reactos/w32api/include/dhcpcsdk.h create mode 100644 reactos/w32api/include/dlgs.h create mode 100644 reactos/w32api/include/docobj.h create mode 100644 reactos/w32api/include/errorrep.h create mode 100644 reactos/w32api/include/exdisp.h create mode 100644 reactos/w32api/include/exdispid.h create mode 100644 reactos/w32api/include/httpext.h create mode 100644 reactos/w32api/include/idispids.h create mode 100644 reactos/w32api/include/imagehlp.h create mode 100644 reactos/w32api/include/imm.h create mode 100644 reactos/w32api/include/initguid.h create mode 100644 reactos/w32api/include/intshcut.h create mode 100644 reactos/w32api/include/ipexport.h create mode 100644 reactos/w32api/include/iphlpapi.h create mode 100644 reactos/w32api/include/ipifcons.h create mode 100644 reactos/w32api/include/iprtrmib.h create mode 100644 reactos/w32api/include/iptypes.h create mode 100644 reactos/w32api/include/isguids.h create mode 100644 reactos/w32api/include/largeint.h create mode 100644 reactos/w32api/include/lm.h create mode 100644 reactos/w32api/include/lmaccess.h create mode 100644 reactos/w32api/include/lmalert.h create mode 100644 reactos/w32api/include/lmapibuf.h create mode 100644 reactos/w32api/include/lmat.h create mode 100644 reactos/w32api/include/lmaudit.h create mode 100644 reactos/w32api/include/lmbrowsr.h create mode 100644 reactos/w32api/include/lmchdev.h create mode 100644 reactos/w32api/include/lmconfig.h create mode 100644 reactos/w32api/include/lmcons.h create mode 100644 reactos/w32api/include/lmerr.h create mode 100644 reactos/w32api/include/lmerrlog.h create mode 100644 reactos/w32api/include/lmmsg.h create mode 100644 reactos/w32api/include/lmremutl.h create mode 100644 reactos/w32api/include/lmrepl.h create mode 100644 reactos/w32api/include/lmserver.h create mode 100644 reactos/w32api/include/lmshare.h create mode 100644 reactos/w32api/include/lmsname.h create mode 100644 reactos/w32api/include/lmstats.h create mode 100644 reactos/w32api/include/lmsvc.h create mode 100644 reactos/w32api/include/lmuse.h create mode 100644 reactos/w32api/include/lmuseflg.h create mode 100644 reactos/w32api/include/lmwksta.h create mode 100644 reactos/w32api/include/lzexpand.h create mode 100644 reactos/w32api/include/mapi.h create mode 100644 reactos/w32api/include/mciavi.h create mode 100644 reactos/w32api/include/mcx.h create mode 100644 reactos/w32api/include/mgmtapi.h create mode 100644 reactos/w32api/include/mmsystem.h create mode 100644 reactos/w32api/include/mshtml.h create mode 100644 reactos/w32api/include/mswsock.h create mode 100644 reactos/w32api/include/nb30.h create mode 100644 reactos/w32api/include/nddeapi.h create mode 100644 reactos/w32api/include/nspapi.h create mode 100644 reactos/w32api/include/ntdef.h create mode 100644 reactos/w32api/include/ntdll.h create mode 100644 reactos/w32api/include/ntldap.h create mode 100644 reactos/w32api/include/ntsecapi.h create mode 100644 reactos/w32api/include/ntsecpkg.h create mode 100644 reactos/w32api/include/oaidl.h create mode 100644 reactos/w32api/include/objbase.h create mode 100644 reactos/w32api/include/objfwd.h create mode 100644 reactos/w32api/include/objidl.h create mode 100644 reactos/w32api/include/ocidl.h create mode 100644 reactos/w32api/include/odbcinst.h create mode 100644 reactos/w32api/include/ole.h create mode 100644 reactos/w32api/include/ole2.h create mode 100644 reactos/w32api/include/ole2ver.h create mode 100644 reactos/w32api/include/oleacc.h create mode 100644 reactos/w32api/include/oleauto.h create mode 100644 reactos/w32api/include/olectl.h create mode 100644 reactos/w32api/include/olectlid.h create mode 100644 reactos/w32api/include/oledlg.h create mode 100644 reactos/w32api/include/oleidl.h create mode 100644 reactos/w32api/include/pbt.h create mode 100644 reactos/w32api/include/poppack.h create mode 100644 reactos/w32api/include/powrprof.h create mode 100644 reactos/w32api/include/prsht.h create mode 100644 reactos/w32api/include/psapi.h create mode 100644 reactos/w32api/include/pshpack1.h create mode 100644 reactos/w32api/include/pshpack2.h create mode 100644 reactos/w32api/include/pshpack4.h create mode 100644 reactos/w32api/include/pshpack8.h create mode 100644 reactos/w32api/include/rapi.h create mode 100644 reactos/w32api/include/ras.h create mode 100644 reactos/w32api/include/rasdlg.h create mode 100644 reactos/w32api/include/raserror.h create mode 100644 reactos/w32api/include/rassapi.h create mode 100644 reactos/w32api/include/regstr.h create mode 100644 reactos/w32api/include/richedit.h create mode 100644 reactos/w32api/include/richole.h create mode 100644 reactos/w32api/include/rpc.h create mode 100644 reactos/w32api/include/rpcdce.h create mode 100644 reactos/w32api/include/rpcdce2.h create mode 100644 reactos/w32api/include/rpcdcep.h create mode 100644 reactos/w32api/include/rpcndr.h create mode 100644 reactos/w32api/include/rpcnsi.h create mode 100644 reactos/w32api/include/rpcnsip.h create mode 100644 reactos/w32api/include/rpcnterr.h create mode 100644 reactos/w32api/include/rpcproxy.h create mode 100644 reactos/w32api/include/schannel.h create mode 100644 reactos/w32api/include/schnlsp.h create mode 100644 reactos/w32api/include/scrnsave.h create mode 100644 reactos/w32api/include/secext.h create mode 100644 reactos/w32api/include/security.h create mode 100644 reactos/w32api/include/servprov.h create mode 100644 reactos/w32api/include/setupapi.h create mode 100644 reactos/w32api/include/shellapi.h create mode 100644 reactos/w32api/include/shlguid.h create mode 100644 reactos/w32api/include/shlobj.h create mode 100644 reactos/w32api/include/shlwapi.h create mode 100644 reactos/w32api/include/snmp.h create mode 100644 reactos/w32api/include/sql.h create mode 100644 reactos/w32api/include/sqlext.h create mode 100644 reactos/w32api/include/sqltypes.h create mode 100644 reactos/w32api/include/sqlucode.h create mode 100644 reactos/w32api/include/sspi.h create mode 100644 reactos/w32api/include/subauth.h create mode 100644 reactos/w32api/include/svcguid.h create mode 100644 reactos/w32api/include/tlhelp32.h create mode 100644 reactos/w32api/include/tmschema.h create mode 100644 reactos/w32api/include/unknwn.h create mode 100644 reactos/w32api/include/userenv.h create mode 100644 reactos/w32api/include/uxtheme.h create mode 100644 reactos/w32api/include/vfw.h create mode 100644 reactos/w32api/include/w32api.h create mode 100644 reactos/w32api/include/winable.h create mode 100644 reactos/w32api/include/winbase.h create mode 100644 reactos/w32api/include/winber.h create mode 100644 reactos/w32api/include/wincon.h create mode 100644 reactos/w32api/include/wincrypt.h create mode 100644 reactos/w32api/include/windef.h create mode 100644 reactos/w32api/include/windns.h create mode 100644 reactos/w32api/include/windows.h create mode 100644 reactos/w32api/include/windowsx.h create mode 100644 reactos/w32api/include/winerror.h create mode 100644 reactos/w32api/include/wingdi.h create mode 100644 reactos/w32api/include/wininet.h create mode 100644 reactos/w32api/include/winioctl.h create mode 100644 reactos/w32api/include/winldap.h create mode 100644 reactos/w32api/include/winnetwk.h create mode 100644 reactos/w32api/include/winnls.h create mode 100644 reactos/w32api/include/winnt.h create mode 100644 reactos/w32api/include/winperf.h create mode 100644 reactos/w32api/include/winreg.h create mode 100644 reactos/w32api/include/winresrc.h create mode 100644 reactos/w32api/include/winsnmp.h create mode 100644 reactos/w32api/include/winsock.h create mode 100644 reactos/w32api/include/winsock2.h create mode 100644 reactos/w32api/include/winspool.h create mode 100644 reactos/w32api/include/winsvc.h create mode 100644 reactos/w32api/include/winuser.h create mode 100644 reactos/w32api/include/winver.h create mode 100644 reactos/w32api/include/ws2spi.h create mode 100644 reactos/w32api/include/ws2tcpip.h create mode 100644 reactos/w32api/include/wsahelp.h create mode 100644 reactos/w32api/include/wsipx.h create mode 100644 reactos/w32api/include/wsnetbs.h create mode 100644 reactos/w32api/include/wtypes.h create mode 100644 reactos/w32api/include/zmouse.h diff --git a/reactos/apps/tests/lpc/makefile b/reactos/apps/tests/lpc/makefile index 8e02a78f92e..078bc684c58 100644 --- a/reactos/apps/tests/lpc/makefile +++ b/reactos/apps/tests/lpc/makefile @@ -10,7 +10,7 @@ CLT_OBJECTS= lpcclt.o PROGS= lpcsrv.exe lpcclt.exe -BASE_CFLAGS = -I$(PATH_TO_TOP)/include -Wall -Werror +CFLAGS = $(STD_CFLAGS) LIBS = $(SDK_PATH_LIB)/kernel32.a \ $(SDK_PATH_LIB)/ntdll.a diff --git a/reactos/apps/tests/mstest/Makefile b/reactos/apps/tests/mstest/Makefile index e118fd72b0c..0781c0fb47f 100644 --- a/reactos/apps/tests/mstest/Makefile +++ b/reactos/apps/tests/mstest/Makefile @@ -10,7 +10,7 @@ CLT_OBJECTS = msclient.o PROGS = msserver.exe msclient.exe -BASE_CFLAGS = -I$(PATH_TO_TOP)/include -Wall -Werror +CFLAGS = $(STD_CFLAGS) LIBS = $(SDK_PATH_LIB)/kernel32.a \ $(SDK_PATH_LIB)/ntdll.a diff --git a/reactos/apps/tests/nptest/Makefile b/reactos/apps/tests/nptest/Makefile index b6fa4a5eeb9..20ab9404d41 100644 --- a/reactos/apps/tests/nptest/Makefile +++ b/reactos/apps/tests/nptest/Makefile @@ -10,7 +10,7 @@ CLT_OBJECTS = npclient.o PROGS = npserver.exe npclient.exe -BASE_CFLAGS = -I$(PATH_TO_TOP)/include -Wall -Werror +CFLAGS = $(STD_CFLAGS) LIBS = $(SDK_PATH_LIB)/kernel32.a diff --git a/reactos/apps/tests/shm/makefile b/reactos/apps/tests/shm/makefile index e467c3bfd4b..a58494fde01 100644 --- a/reactos/apps/tests/shm/makefile +++ b/reactos/apps/tests/shm/makefile @@ -10,7 +10,7 @@ CLT_OBJECTS= shmclt.o PROGS= shmsrv.exe shmclt.exe -BASE_CFLAGS = -I$(PATH_TO_TOP)/include -Werror -Wall +CFLAGS = $(STD_CFLAGS) LIBS = $(SDK_PATH_LIB)/kernel32.a \ $(SDK_PATH_LIB)/ntdll.a diff --git a/reactos/include/napi/types.h b/reactos/include/napi/types.h index 0a65ce79f44..d8a35f93997 100644 --- a/reactos/include/napi/types.h +++ b/reactos/include/napi/types.h @@ -3,6 +3,7 @@ /* these should be moved to a file like ntdef.h */ +#ifndef __USE_W32API enum { DIRECTORY_QUERY, @@ -11,6 +12,7 @@ enum DIRECTORY_CREATE_SUBDIRECTORY, DIRECTORY_ALL_ACCESS, }; +#endif /* * General type for status information diff --git a/reactos/include/ntos/zwtypes.h b/reactos/include/ntos/zwtypes.h index 380a01c0418..c3950585efd 100755 --- a/reactos/include/ntos/zwtypes.h +++ b/reactos/include/ntos/zwtypes.h @@ -1575,10 +1575,12 @@ struct _SYSTEM_QUOTA_INFORMATION // directory access rights +#ifndef __USE_W32API #define DIRECTORY_QUERY 0x0001 #define DIRECTORY_TRAVERSE 0x0002 #define DIRECTORY_CREATE_OBJECT 0x0004 #define DIRECTORY_CREATE_SUBDIRECTORY 0x0008 +#endif #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF) diff --git a/reactos/ntoskrnl/Makefile b/reactos/ntoskrnl/Makefile index 82266b57aee..e7947641a51 100644 --- a/reactos/ntoskrnl/Makefile +++ b/reactos/ntoskrnl/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.113 2004/02/02 00:35:24 ekohl Exp $ +# $Id: Makefile,v 1.114 2004/02/21 09:20:33 gvg Exp $ # # ReactOS Operating System # @@ -52,6 +52,10 @@ endif # require os code to explicitly request A/W version of structs/functions CFLAGS += -D_DISABLE_TIDENTS +CFLAGS += $(STD_CFLAGS) +ASFLAGS += $(STD_ASFLAGS) +RCFLAGS += $(STD_RCFLAGS) + # # Build configuration # @@ -742,7 +746,7 @@ ke/main.o: ke/main.c $(PATH_TO_TOP)/include/reactos/buildno.h %.o: %.asm $(NASM_CMD) $(NFLAGS) $< -o $@ %.coff: %.rc - $(RC) $(RCINC) $< -o $@ + $(RC) $(RCFLAGS) $< -o $@ # # diff --git a/reactos/rules.mak b/reactos/rules.mak index e23920f6fc7..3a8337f9450 100644 --- a/reactos/rules.mak +++ b/reactos/rules.mak @@ -19,14 +19,6 @@ endif # uncomment if you use bochs and it displays only 30 rows # BOCHS_30ROWS = yes -ifeq ($(HOST),mingw32-linux) -TOPDIR := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi) -else -TOPDIR := $(shell cd) -endif - -TOPDIR := $(TOPDIR)/$(PATH_TO_TOP) - # # Choose various options # @@ -86,10 +78,10 @@ CPP = $(PREFIX)cpp AR = $(PREFIX)ar RC = $(PREFIX)windres WRC = $(WINE_TOP)/tools/wrc/wrc -RCINC = --include-dir $(PATH_TO_TOP)/include OBJCOPY = $(PREFIX)objcopy OBJDUMP =$(PREFIX)objdump TOOLS_PATH = $(PATH_TO_TOP)/tools +W32API_PATH = $(PATH_TO_TOP)/w32api CP = $(TOOLS_PATH)/rcopy RM = $(TOOLS_PATH)/rdel RLINE = $(TOOLS_PATH)/rline @@ -104,21 +96,10 @@ WINEBUILD = $(TOOLS_PATH)/winebuild/winebuild WINE2ROS = $(TOOLS_PATH)/wine2ros/wine2ros XSLTPROC = xsltproc - -# Maybe we can delete these soon - -ifeq ($(HOST),mingw32-linux) -CFLAGS := $(CFLAGS) -I$(PATH_TO_TOP)/include -pipe -march=i386 -D_M_IX86 -endif - -ifeq ($(HOST),mingw32-windows) -CFLAGS := $(CFLAGS) -I$(PATH_TO_TOP)/include -pipe -march=i386 -D_M_IX86 -endif - -CXXFLAGS = $(CFLAGS) -NFLAGS = -i$(PATH_TO_TOP)/include/ -f$(NASM_FORMAT) -d$(NASM_FORMAT) -ASFLAGS := $(ASFLAGS) -I$(PATH_TO_TOP)/include -D__ASM__ - +STD_CFLAGS = -I$(PATH_TO_TOP)/include -I$(W32API_PATH)/include -pipe -march=i386 -D_M_IX86 +STD_CPPFLAGS = $(STD_CFLAGS) +STD_ASFLAGS = -I$(PATH_TO_TOP)/include -I$(W32API_PATH)/include -D__ASM__ -D_M_IX86 +STD_RCFLAGS = --include-dir $(PATH_TO_TOP)/include --include-dir $(W32API_PATH)/include # Developer Kits DK_PATH=$(PATH_TO_TOP)/dk diff --git a/reactos/subsys/system/cmd/makefile b/reactos/subsys/system/cmd/makefile index 087033a8185..bff0aa2a8d4 100644 --- a/reactos/subsys/system/cmd/makefile +++ b/reactos/subsys/system/cmd/makefile @@ -15,7 +15,7 @@ TARGET_NAME = cmd TARGET_INSTALLDIR = system32 -TARGET_CFLAGS = -D__USE_W32API -DANONYMOUSUNIONS -Wall -Werror -I$(PATH_TO_TOP)/include \ +TARGET_CFLAGS = -D__USE_W32API -DANONYMOUSUNIONS -Wall -Werror \ -I$(PATH_TO_TOP)/include/msvcrt -D_WIN32_WINNT=0x0501 WINE_MODE = yes diff --git a/reactos/subsys/system/explorer/Makefile b/reactos/subsys/system/explorer/Makefile index 19e2e49ffd0..6a0cac62543 100644 --- a/reactos/subsys/system/explorer/Makefile +++ b/reactos/subsys/system/explorer/Makefile @@ -32,14 +32,15 @@ EXE_POSTFIX := .exe endif PATH_TO_TOP = ../../.. +W32API_PATH = $(PATH_TO_TOP)/w32api TOOLS_PATH = $(PATH_TO_TOP)/tools ifndef UNICODE UNICODE = 1 endif -CFLAGS = -DWIN32 -D_ROS_ -D_WIN32_IE=0x0501 -D_WIN32_WINNT=0x0501 -fexceptions -Wall -RCFLAGS = -DWIN32 -D_ROS_ -D__WINDRES__ +CFLAGS = -DWIN32 -D_ROS_ -D_WIN32_IE=0x0501 -D_WIN32_WINNT=0x0501 -fexceptions -Wall -I$(W32API_PATH)/include +RCFLAGS = -DWIN32 -D_ROS_ -D__WINDRES__ --include-dir $(W32API_PATH)/include LFLAGS = -Wl,--subsystem,windows ifdef DEBUG diff --git a/reactos/tools/Makefile b/reactos/tools/Makefile index bd08e860300..05b1e0ec922 100644 --- a/reactos/tools/Makefile +++ b/reactos/tools/Makefile @@ -1,5 +1,7 @@ PATH_TO_TOP = .. +include $(PATH_TO_TOP)/rules.mak + CFLAGS += -Wall -Werror TOOLS = \ @@ -160,5 +162,3 @@ clean: endif .PHONY: all clean - -include $(PATH_TO_TOP)/rules.mak diff --git a/reactos/tools/cabman/makefile b/reactos/tools/cabman/makefile index 9b48548ae8c..3761209d826 100755 --- a/reactos/tools/cabman/makefile +++ b/reactos/tools/cabman/makefile @@ -11,7 +11,7 @@ OBJECTS = cabinet.o mszip.o raw.o main.o dfp.o CLEAN_FILES = *.o cabman$(EXE_POSTFIX) -HOST_CFLAGS = -g -I. -I $(PATH_TO_TOP)/lib/zlib -Werror -Wall +HOST_CFLAGS = -g -I. -I$(PATH_TO_TOP)/lib/zlib -I$(W32API_PATH)/include -Werror -Wall HOST_LFLAGS = -g $(PATH_TO_TOP)/lib/zlib/zlib.host.a diff --git a/reactos/tools/helper.mk b/reactos/tools/helper.mk index f376b40edcf..428adca0bd7 100644 --- a/reactos/tools/helper.mk +++ b/reactos/tools/helper.mk @@ -1,4 +1,4 @@ -# $Id: helper.mk,v 1.52 2004/02/20 08:33:37 gvg Exp $ +# $Id: helper.mk,v 1.53 2004/02/21 09:20:33 gvg Exp $ # # Helper makefile for ReactOS modules # Variables this makefile accepts: @@ -119,11 +119,11 @@ ifeq ($(TARGET_TYPE),program) MK_DDKLIBS := MK_SDKLIBS := ifneq ($(WINE_MODE),yes) - MK_CFLAGS := -I./ -I$(SDK_PATH_INC) - MK_CPPFLAGS := -I./ -I$(SDK_PATH_INC) + MK_CFLAGS := -I./ + MK_CPPFLAGS := -I./ else - MK_CFLAGS := -I$(PATH_TO_TOP)/include/wine -I./ -I$(WINE_INCLUDE) - MK_CPPFLAGS := -I$(PATH_TO_TOP)/include/wine -I./ -I$(WINE_INCLUDE) + MK_CFLAGS := -I$(PATH_TO_TOP)/include/wine + MK_CPPFLAGS := -I$(PATH_TO_TOP)/include/wine MK_RCFLAGS := --include-dir $(PATH_TO_TOP)/include/wine --include-dir $(WINE_INCLUDE) endif MK_IMPLIB := no @@ -147,8 +147,8 @@ ifeq ($(TARGET_TYPE),proglib) MK_DEFENTRY := _WinMain@16 MK_DDKLIBS := MK_SDKLIBS := - MK_CFLAGS := -I./ -I$(SDK_PATH_INC) - MK_CPPFLAGS := -I./ -I$(SDK_PATH_INC) + MK_CFLAGS := -I./ + MK_CPPFLAGS := -I./ MK_IMPLIB := yes MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := $(SDK_PATH_LIB) @@ -167,8 +167,8 @@ ifeq ($(TARGET_TYPE),dynlink) MK_DDKLIBS := MK_SDKLIBS := ifneq ($(WINE_MODE),yes) - MK_CFLAGS := -I./ -I$(SDK_PATH_INC) - MK_CPPFLAGS := -I./ -I$(SDK_PATH_INC) + MK_CFLAGS := -I./ + MK_CPPFLAGS := -I./ else MK_CFLAGS := -I$(PATH_TO_TOP)/include/wine -I./ -I$(WINE_INCLUDE) MK_CPPFLAGS := -I$(PATH_TO_TOP)/include/wine -I./ -I$(WINE_INCLUDE) @@ -196,8 +196,8 @@ ifeq ($(TARGET_TYPE),library) MK_DEFENTRY := MK_DDKLIBS := MK_SDKLIBS := - MK_CFLAGS := -I./ -I$(SDK_PATH_INC) - MK_CPPFLAGS := -I./ -I$(SDK_PATH_INC) + MK_CFLAGS := -I./ + MK_CPPFLAGS := -I./ MK_IMPLIB := no MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := @@ -212,8 +212,8 @@ ifeq ($(TARGET_TYPE),kmlibrary) TARGET_NORC := yes MK_MODE := static MK_DEFEXT := .a - MK_CFLAGS := -I./ -I$(DDK_PATH_INC) - MK_CPPFLAGS := -I./ -I$(DDK_PATH_INC) + MK_CFLAGS := -I./ + MK_CPPFLAGS := -I./ MK_IMPLIB := no MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := $(DDK_PATH_LIB) @@ -226,8 +226,8 @@ ifeq ($(TARGET_TYPE),driver_library) MK_DEFENTRY := MK_DDKLIBS := MK_SDKLIBS := - MK_CFLAGS := -I./ -I$(DDK_PATH_INC) - MK_CPPFLAGS := -I./ -I$(DDK_PATH_INC) + MK_CFLAGS := -I./ + MK_CPPFLAGS := -I./ MK_IMPLIB := no MK_IMPLIBONLY := yes MK_IMPLIBDEFPATH := $(DDK_PATH_LIB) @@ -245,8 +245,8 @@ ifeq ($(TARGET_TYPE),driver) MK_DEFENTRY := _DriverEntry@8 MK_DDKLIBS := ntoskrnl.a hal.a MK_SDKLIBS := - MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) - MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) + MK_CFLAGS := -D__NTDRIVER__ -I./ + MK_CPPFLAGS := -D__NTDRIVER__ -I./ MK_IMPLIB := no MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := @@ -264,8 +264,8 @@ ifeq ($(TARGET_TYPE),export_driver) MK_DEFENTRY := _DriverEntry@8 MK_DDKLIBS := ntoskrnl.a hal.a MK_SDKLIBS := - MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) - MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) + MK_CFLAGS := -D__NTDRIVER__ -I./ + MK_CPPFLAGS := -D__NTDRIVER__ -I./ MK_IMPLIB := yes MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := $(DDK_PATH_LIB) @@ -283,8 +283,8 @@ ifeq ($(TARGET_TYPE),hal) MK_DEFENTRY := _DriverEntry@8 MK_DDKLIBS := ntoskrnl.a MK_SDKLIBS := - MK_CFLAGS := -D__NTHAL__ -I./ -I$(DDK_PATH_INC) - MK_CPPFLAGS := -D__NTHAL__ -I./ -I$(DDK_PATH_INC) + MK_CFLAGS := -D__NTHAL__ -I./ + MK_CPPFLAGS := -D__NTHAL__ -I./ MK_IMPLIB := yes MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := @@ -302,8 +302,8 @@ ifeq ($(TARGET_TYPE),bootpgm) MK_DEFENTRY := _DriverEntry@8 MK_DDKLIBS := MK_SDKLIBS := - MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) - MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) + MK_CFLAGS := -D__NTDRIVER__ -I./ + MK_CPPFLAGS := -D__NTDRIVER__ -I./ MK_IMPLIB := no MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := @@ -321,8 +321,8 @@ ifeq ($(TARGET_TYPE),miniport) MK_DEFENTRY := _DriverEntry@8 MK_DDKLIBS := MK_SDKLIBS := - MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) - MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) + MK_CFLAGS := -D__NTDRIVER__ -I./ + MK_CPPFLAGS := -D__NTDRIVER__ -I./ MK_IMPLIB := no MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := @@ -340,8 +340,8 @@ ifeq ($(TARGET_TYPE),gdi_driver) MK_DEFENTRY := _DrvEnableDriver@12 MK_DDKLIBS := ntoskrnl.a hal.a win32k.a MK_SDKLIBS := - MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) - MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) + MK_CFLAGS := -D__NTDRIVER__ -I./ + MK_CPPFLAGS := -D__NTDRIVER__ -I./ MK_IMPLIB := yes MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := $(DDK_PATH_LIB) @@ -404,8 +404,8 @@ ifeq ($(TARGET_TYPE),subsystem) MK_DEFENTRY := _DriverEntry@8 MK_DDKLIBS := ntoskrnl.a hal.a MK_SDKLIBS := - MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) - MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) + MK_CFLAGS := -D__NTDRIVER__ -I./ + MK_CPPFLAGS := -D__NTDRIVER__ -I./ MK_IMPLIB := yes MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := $(DDK_PATH_LIB) @@ -422,8 +422,8 @@ ifeq ($(TARGET_TYPE),kmdll) MK_DEFENTRY := 0x0 MK_DDKLIBS := ntoskrnl.a hal.a MK_SDKLIBS := - MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) - MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC) + MK_CFLAGS := -D__NTDRIVER__ -I./ + MK_CPPFLAGS := -D__NTDRIVER__ -I./ MK_IMPLIB := yes MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := $(DDK_PATH_LIB) @@ -442,7 +442,7 @@ ifeq ($(TARGET_TYPE),winedll) MK_DEFENTRY := _DllMain@12 MK_DDKLIBS := MK_SDKLIBS := - MK_CFLAGS := -D__USE_W32API -D_WIN32_IE=0x600 -D_WIN32_WINNT=0x501 -DWINVER=0x501 -D__need_offsetof -DCOBJMACROS -I$(PATH_TO_TOP)/include -I$(PATH_TO_TOP)/include/wine + MK_CFLAGS := -D__USE_W32API -D_WIN32_IE=0x600 -D_WIN32_WINNT=0x501 -DWINVER=0x501 -D__need_offsetof -DCOBJMACROS -I$(PATH_TO_TOP)/include/wine MK_CPPFLAGS := -D__USE_W32API -D_WIN32_IE=0x600 -D_WIN32_WINNT=0x501 -DWINVER=0x501 -D__need_offsetof -DCOBJMACROS -I$(PATH_TO_TOP)/include -I$(PATH_TO_TOP)/include/wine MK_RCFLAGS := --define __USE_W32API --include-dir $(PATH_TO_TOP)/include/wine MK_IMPLIB := yes @@ -565,22 +565,18 @@ endif include $(PATH_TO_TOP)/config -TARGET_ASFLAGS += -march=$(ARCH) -D$(MK_ARCH_ID) -TARGET_CFLAGS += $(MK_CFLAGS) -TARGET_CFLAGS += -pipe -march=$(ARCH) -D$(MK_ARCH_ID) +TARGET_CFLAGS += $(MK_CFLAGS) $(STD_CFLAGS) ifeq ($(DBG),1) TARGET_ASFLAGS += -g TARGET_CFLAGS += -g TARGET_LFLAGS += -g endif -TARGET_CPPFLAGS += $(MK_CPPFLAGS) -TARGET_CPPFLAGS += -pipe -march=$(ARCH) -D$(MK_ARCH_ID) +TARGET_CPPFLAGS += $(MK_CPPFLAGS) $(STD_CPPFLAGS) -TARGET_RCFLAGS += $(MK_RCFLAGS) +TARGET_RCFLAGS += $(MK_RCFLAGS) $(STD_RCFLAGS) -TARGET_ASFLAGS += $(MK_ASFLAGS) -TARGET_ASFLAGS += -pipe -march=$(ARCH) +TARGET_ASFLAGS += $(MK_ASFLAGS) $(STD_ASFLAGS) TARGET_NFLAGS += $(MK_NFLAGS) @@ -992,7 +988,7 @@ endif # ROS_USE_PCH %.o: %.asm $(NASM_CMD) $(NFLAGS) $(TARGET_NFLAGS) $< -o $@ %.coff: %.rc - $(RC) $(TARGET_RCFLAGS) $(RCINC) $< -o $@ + $(RC) $(TARGET_RCFLAGS) $< -o $@ %.spec.def: %.spec $(WINEBUILD) $(DEFS) -o $@ --def $< # Kill implicit rule diff --git a/reactos/tools/pipetools/Makefile b/reactos/tools/pipetools/Makefile index b26df5467cb..9377c558b89 100644 --- a/reactos/tools/pipetools/Makefile +++ b/reactos/tools/pipetools/Makefile @@ -2,13 +2,9 @@ # pipetools Makefile # -CC = gcc -CXX = g++ -LINK = g++ +PATH_TO_TOP = ../.. -TOOLS_PATH = .. - -CFLAGS = -DWIN32 -Wall +CFLAGS = -DWIN32 -Wall -I$(W32API_PATH)/include RCFLAGS = -DWIN32 LFLAGS = @@ -42,3 +38,4 @@ all: $(TARGETS) clean: $(TOOLS_PATH)/rdel $(TARGETS) *.o +include $(PATH_TO_TOP)/rules.mak diff --git a/reactos/tools/winebuild/Makefile b/reactos/tools/winebuild/Makefile index 27025f13827..0c1d8c8b5e3 100644 --- a/reactos/tools/winebuild/Makefile +++ b/reactos/tools/winebuild/Makefile @@ -20,7 +20,7 @@ OBJECTS = \ CLEAN_FILES = *.o $(TARGET) -HOST_CFLAGS = -D__USE_W32API -D__REACTOS__ -I$(PATH_TO_TOP)/include -I$(PATH_TO_TOP)/include/wine +HOST_CFLAGS = -D__USE_W32API -D__REACTOS__ -I$(PATH_TO_TOP)/include -I$(PATH_TO_TOP)/include/wine -I$(W32API_PATH)/include %.o: %.c $(HOST_CC) $(HOST_CFLAGS) -c $< -o $@ diff --git a/reactos/w32api/README.w32api b/reactos/w32api/README.w32api new file mode 100644 index 00000000000..6cf2a6a3c66 --- /dev/null +++ b/reactos/w32api/README.w32api @@ -0,0 +1,93 @@ + Free headers and libraries for the Win32 API + + Originally written by Anders Norlander + Last known and not working email: <anorland@hem2.passagen.se> + + Now maintained by MinGW Developers + Send bug reports and questions to MinGW-users@lists.sourceforge.net + URL: http://www.mingw.org + +* License 2.0 + + You are free to use, modify and copy this package as long as this + README.w32api file is included unmodified with any distribution, source or + binary, of this package. No restrictions are imposed on any package or + product using or incorporating this package. You are free to license your + package as you see fit. + + You may not restrict others freedoms as set forth in the above paragraph. + You may distribute this library as part of another package or as a + modified package if and only if you do *not* restrict others freedoms as + set forth in the above paragraph as it concerns this package. You do have + the right to restrict uses of any package using this package. + + This package 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. + +* What is it? + + This is a free set of headers and import libraries for the Win32 + API. The library differs from the GNU Windows32 library in that I + have tried to use a file structure that mirrors Microsoft's. I + don't like having *all* definitions in one single header as in the + GNU Windows32 library, I want a clean separation between different + parts of the API. + + Daniel Guerrero Miralles contributed the DirectX 6.1 import + libraries and DirectX GUID definitions. + + See the files NOTES and TODO for what needs to be done. + +* Size does matter + + Since the WIN32 API is severely bloated (as most MS products seem to + be) the headers are designed to be as compact as possible, while + still being readable, in order to minimize parsing time. + + The convention is to omit parameter names for function prototypes, + no excessive white space. Struct/union members are indented with tab + characters to make them readable. Comment only when necessary. + + If you are contributing a patch please follow the above mentioned + convention. Make sure your editor does not convert tabs to spaces. + +* What do I need to use it? + + The library is intended for use with egcs 1.1 or later but it is + possible to use with some other tools as well (although it is not + very useful). LCC-Win32, MSVC and Borland C++ 5.01 or higher may + work as well. The import libraries are for GNU tools only. + + The library requires egcs 1.1 or later, since the `#pragma pack' + feature is used. Mumit Khan provides egcs patches and binaries for + win32 at `http://www.xraylith.wisc.edu/~khan/software/gnu-win32/'. + + If you are going to use C++ COM objects, you will need a version of + egcs that recognizes the `comobject' attribute and then define + HAVE_COMOBJECT when compiling your program. Antonio Mendes de + Oliveira Neto has a prebuilt version at + `http://li.facens.br/EGCS-WIN32/english/index.html'. Note that this + is very experimental. If you want to use COM objects in C++ but with + C interfaces you must define CINTERFACE. + + Objective-C programs cannot use COM functionality because of + conflicts between the interface define and the Objective-C + @interface directive. There is also a conflict between the windows + Obj-C BOOL types. To avoid this conflict you should use WINBOOL in + all places where you would use BOOL in a C/C++ windows program. If + you include any windows headers *after* `windows.h' you must use the + method outlined below: + + /* non-windows includes */ + #include <objc/objc.h> + ... + /* windows specific headers */ + #include <windows.h> + #define BOOL WINBOOL + #include <commctrl.h> + ... + #undef BOOL + ... + /* include other headers */ + diff --git a/reactos/w32api/include/GL/gl.h b/reactos/w32api/include/GL/gl.h new file mode 100644 index 00000000000..e140604476e --- /dev/null +++ b/reactos/w32api/include/GL/gl.h @@ -0,0 +1,1472 @@ +/* $Id: gl.h,v 1.1 2004/02/21 09:20:38 gvg Exp $ */ + +/* + * Mesa 3-D graphics library + * Version: 4.0 + * + * 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. + */ + + +/************************************************************************ + * 2002-Apr-22, Jos Fonseca: + * Removed non Win32 system-specific stuff + * + * 2002-Apr-17, Marcus Geelnard: + * For win32, OpenGL 1.2 & 1.3 definitions are not made in this file + * anymore, since under Windows those are regarded as extensions, and + * are better defined in glext.h (especially the function prototypes may + * conflict with extension function pointers). A few "cosmetical" + * changes were also made to this file. + * + * 2002-Apr-15, Marcus Geelnard: + * Modified this file to better fit a wider range of compilers, removed + * Mesa specific stuff, and removed extension definitions (this file now + * relies on GL/glext.h). Hopefully this file should now function as a + * generic OpenGL gl.h include file for most compilers and environments. + * Changed GLAPIENTRY to APIENTRY (to be consistent with GL/glext.h). + ************************************************************************/ + + +#ifndef __gl_h_ +#define __gl_h_ + + + +/************************************************************************ + * Begin system-specific stuff. + */ +/* __WIN32__ */ +#if !defined(__WIN32__) && (defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__)) +# define __WIN32__ +#endif + +/* GLAPI, part 1 (use WINGDIAPI, if defined) */ +#if defined(__WIN32__) && defined(WINGDIAPI) +# define GLAPI WINGDIAPI +#endif + +/* GLAPI, part 2 */ +#if !defined(GLAPI) +# if defined(_MSC_VER) /* Microsoft Visual C++ */ +# define GLAPI __declspec(dllimport) +# elif defined(__LCC__) && defined(__WIN32__) /* LCC-Win32 */ +# define GLAPI __stdcall +# else /* Others (e.g. MinGW, Cygwin, non-win32) */ +# define GLAPI extern +# endif +#endif + +/* APIENTRY */ +#if !defined(APIENTRY) +# if defined(__WIN32__) +# define APIENTRY __stdcall +# else +# define APIENTRY +# endif +#endif +/* + * End system-specific stuff. + ************************************************************************/ + + + +#ifdef __cplusplus +extern "C" { +#endif + + + +#define GL_VERSION_1_1 1 + +#if !defined(__WIN32__) +#define GL_VERSION_1_2 1 +#define GL_VERSION_1_3 1 +#define GL_ARB_imaging 1 +#endif + + +/* + * + * Datatypes + * + */ +#ifdef CENTERLINE_CLPP +#define signed +#endif +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 +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 + +/* 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_GRID_DOMAIN 0x0DD0 +#define GL_MAP1_GRID_SEGMENTS 0x0DD1 +#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_GRID_DOMAIN 0x0DD2 +#define GL_MAP2_GRID_SEGMENTS 0x0DD3 +#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_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 + + +/* Under Windows, we do not define OpenGL 1.2 & 1.3 functionality, since + it is treated as extensions (defined in glext.h) */ +#if !defined(__WIN32__) + +/* 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 + +/* OpenGL 1.2 imaging subset */ +/* GL_EXT_color_table */ +#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 +/* GL_EXT_convolution and GL_HP_convolution_border_modes */ +#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 +/* GL_SGI_color_matrix */ +#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 +/* GL_EXT_histogram */ +#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 +/* GL_EXT_blend_color, GL_EXT_blend_minmax */ +#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 + + +/* 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 + +#endif /* __WIN32__ */ + + + +/************************************************************************ + * + * Function prototypes + * + ************************************************************************/ + +/* Miscellaneous */ +GLAPI void APIENTRY glClearIndex( GLfloat c ); +GLAPI void APIENTRY glClearColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ); +GLAPI void APIENTRY glClear( GLbitfield mask ); +GLAPI void APIENTRY glIndexMask( GLuint mask ); +GLAPI void APIENTRY glColorMask( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha ); +GLAPI void APIENTRY glAlphaFunc( GLenum func, GLclampf ref ); +GLAPI void APIENTRY glBlendFunc( GLenum sfactor, GLenum dfactor ); +GLAPI void APIENTRY glLogicOp( GLenum opcode ); +GLAPI void APIENTRY glCullFace( GLenum mode ); +GLAPI void APIENTRY glFrontFace( GLenum mode ); +GLAPI void APIENTRY glPointSize( GLfloat size ); +GLAPI void APIENTRY glLineWidth( GLfloat width ); +GLAPI void APIENTRY glLineStipple( GLint factor, GLushort pattern ); +GLAPI void APIENTRY glPolygonMode( GLenum face, GLenum mode ); +GLAPI void APIENTRY glPolygonOffset( GLfloat factor, GLfloat units ); +GLAPI void APIENTRY glPolygonStipple( const GLubyte *mask ); +GLAPI void APIENTRY glGetPolygonStipple( GLubyte *mask ); +GLAPI void APIENTRY glEdgeFlag( GLboolean flag ); +GLAPI void APIENTRY glEdgeFlagv( const GLboolean *flag ); +GLAPI void APIENTRY glScissor( GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glClipPlane( GLenum plane, const GLdouble *equation ); +GLAPI void APIENTRY glGetClipPlane( GLenum plane, GLdouble *equation ); +GLAPI void APIENTRY glDrawBuffer( GLenum mode ); +GLAPI void APIENTRY glReadBuffer( GLenum mode ); +GLAPI void APIENTRY glEnable( GLenum cap ); +GLAPI void APIENTRY glDisable( GLenum cap ); +GLAPI GLboolean APIENTRY glIsEnabled( GLenum cap ); +GLAPI void APIENTRY glEnableClientState( GLenum cap ); /* 1.1 */ +GLAPI void APIENTRY glDisableClientState( GLenum cap ); /* 1.1 */ +GLAPI void APIENTRY glGetBooleanv( GLenum pname, GLboolean *params ); +GLAPI void APIENTRY glGetDoublev( GLenum pname, GLdouble *params ); +GLAPI void APIENTRY glGetFloatv( GLenum pname, GLfloat *params ); +GLAPI void APIENTRY glGetIntegerv( GLenum pname, GLint *params ); +GLAPI void APIENTRY glPushAttrib( GLbitfield mask ); +GLAPI void APIENTRY glPopAttrib( void ); +GLAPI void APIENTRY glPushClientAttrib( GLbitfield mask ); /* 1.1 */ +GLAPI void APIENTRY glPopClientAttrib( void ); /* 1.1 */ +GLAPI GLint APIENTRY glRenderMode( GLenum mode ); +GLAPI GLenum APIENTRY glGetError( void ); +GLAPI const GLubyte* APIENTRY glGetString( GLenum name ); +GLAPI void APIENTRY glFinish( void ); +GLAPI void APIENTRY glFlush( void ); +GLAPI void APIENTRY glHint( GLenum target, GLenum mode ); + +/* Depth Buffer */ +GLAPI void APIENTRY glClearDepth( GLclampd depth ); +GLAPI void APIENTRY glDepthFunc( GLenum func ); +GLAPI void APIENTRY glDepthMask( GLboolean flag ); +GLAPI void APIENTRY glDepthRange( GLclampd near_val, GLclampd far_val ); + +/* Accumulation Buffer */ +GLAPI void APIENTRY glClearAccum( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ); +GLAPI void APIENTRY glAccum( GLenum op, GLfloat value ); + +/* Transformation */ +GLAPI void APIENTRY glMatrixMode( GLenum mode ); +GLAPI void APIENTRY glOrtho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val ); +GLAPI void APIENTRY glFrustum( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val ); +GLAPI void APIENTRY glViewport( GLint x, GLint y, GLsizei width, GLsizei height ); +GLAPI void APIENTRY glPushMatrix( void ); +GLAPI void APIENTRY glPopMatrix( void ); +GLAPI void APIENTRY glLoadIdentity( void ); +GLAPI void APIENTRY glLoadMatrixd( const GLdouble *m ); +GLAPI void APIENTRY glLoadMatrixf( const GLfloat *m ); +GLAPI void APIENTRY glMultMatrixd( const GLdouble *m ); +GLAPI void APIENTRY glMultMatrixf( const GLfloat *m ); +GLAPI void APIENTRY glRotated( GLdouble angle, GLdouble x, GLdouble y, GLdouble z ); +GLAPI void APIENTRY glRotatef( GLfloat angle, GLfloat x, GLfloat y, GLfloat z ); +GLAPI void APIENTRY glScaled( GLdouble x, GLdouble y, GLdouble z ); +GLAPI void APIENTRY glScalef( GLfloat x, GLfloat y, GLfloat z ); +GLAPI void APIENTRY glTranslated( GLdouble x, GLdouble y, GLdouble z ); +GLAPI void APIENTRY glTranslatef( GLfloat x, GLfloat y, GLfloat z ); + +/* Display Lists */ +GLAPI GLboolean APIENTRY glIsList( GLuint list ); +GLAPI void APIENTRY glDeleteLists( GLuint list, GLsizei range ); +GLAPI GLuint APIENTRY glGenLists( GLsizei range ); +GLAPI void APIENTRY glNewList( GLuint list, GLenum mode ); +GLAPI void APIENTRY glEndList( void ); +GLAPI void APIENTRY glCallList( GLuint list ); +GLAPI void APIENTRY glCallLists( GLsizei n, GLenum type, const GLvoid *lists ); +GLAPI void APIENTRY glListBase( GLuint base ); + +/* Drawing Functions */ +GLAPI void APIENTRY glBegin( GLenum mode ); +GLAPI void APIENTRY glEnd( void ); +GLAPI void APIENTRY glVertex2d( GLdouble x, GLdouble y ); +GLAPI void APIENTRY glVertex2f( GLfloat x, GLfloat y ); +GLAPI void APIENTRY glVertex2i( GLint x, GLint y ); +GLAPI void APIENTRY glVertex2s( GLshort x, GLshort y ); +GLAPI void APIENTRY glVertex3d( GLdouble x, GLdouble y, GLdouble z ); +GLAPI void APIENTRY glVertex3f( GLfloat x, GLfloat y, GLfloat z ); +GLAPI void APIENTRY glVertex3i( GLint x, GLint y, GLint z ); +GLAPI void APIENTRY glVertex3s( GLshort x, GLshort y, GLshort z ); +GLAPI void APIENTRY glVertex4d( GLdouble x, GLdouble y, GLdouble z, GLdouble w ); +GLAPI void APIENTRY glVertex4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w ); +GLAPI void APIENTRY glVertex4i( GLint x, GLint y, GLint z, GLint w ); +GLAPI void APIENTRY glVertex4s( GLshort x, GLshort y, GLshort z, GLshort w ); +GLAPI void APIENTRY glVertex2dv( const GLdouble *v ); +GLAPI void APIENTRY glVertex2fv( const GLfloat *v ); +GLAPI void APIENTRY glVertex2iv( const GLint *v ); +GLAPI void APIENTRY glVertex2sv( const GLshort *v ); +GLAPI void APIENTRY glVertex3dv( const GLdouble *v ); +GLAPI void APIENTRY glVertex3fv( const GLfloat *v ); +GLAPI void APIENTRY glVertex3iv( const GLint *v ); +GLAPI void APIENTRY glVertex3sv( const GLshort *v ); +GLAPI void APIENTRY glVertex4dv( const GLdouble *v ); +GLAPI void APIENTRY glVertex4fv( const GLfloat *v ); +GLAPI void APIENTRY glVertex4iv( const GLint *v ); +GLAPI void APIENTRY glVertex4sv( const GLshort *v ); +GLAPI void APIENTRY glNormal3b( GLbyte nx, GLbyte ny, GLbyte nz ); +GLAPI void APIENTRY glNormal3d( GLdouble nx, GLdouble ny, GLdouble nz ); +GLAPI void APIENTRY glNormal3f( GLfloat nx, GLfloat ny, GLfloat nz ); +GLAPI void APIENTRY glNormal3i( GLint nx, GLint ny, GLint nz ); +GLAPI void APIENTRY glNormal3s( GLshort nx, GLshort ny, GLshort nz ); +GLAPI void APIENTRY glNormal3bv( const GLbyte *v ); +GLAPI void APIENTRY glNormal3dv( const GLdouble *v ); +GLAPI void APIENTRY glNormal3fv( const GLfloat *v ); +GLAPI void APIENTRY glNormal3iv( const GLint *v ); +GLAPI void APIENTRY glNormal3sv( const GLshort *v ); +GLAPI void APIENTRY glIndexd( GLdouble c ); +GLAPI void APIENTRY glIndexf( GLfloat c ); +GLAPI void APIENTRY glIndexi( GLint c ); +GLAPI void APIENTRY glIndexs( GLshort c ); +GLAPI void APIENTRY glIndexub( GLubyte c ); /* 1.1 */ +GLAPI void APIENTRY glIndexdv( const GLdouble *c ); +GLAPI void APIENTRY glIndexfv( const GLfloat *c ); +GLAPI void APIENTRY glIndexiv( const GLint *c ); +GLAPI void APIENTRY glIndexsv( const GLshort *c ); +GLAPI void APIENTRY glIndexubv( const GLubyte *c ); /* 1.1 */ +GLAPI void APIENTRY glColor3b( GLbyte red, GLbyte green, GLbyte blue ); +GLAPI void APIENTRY glColor3d( GLdouble red, GLdouble green, GLdouble blue ); +GLAPI void APIENTRY glColor3f( GLfloat red, GLfloat green, GLfloat blue ); +GLAPI void APIENTRY glColor3i( GLint red, GLint green, GLint blue ); +GLAPI void APIENTRY glColor3s( GLshort red, GLshort green, GLshort blue ); +GLAPI void APIENTRY glColor3ub( GLubyte red, GLubyte green, GLubyte blue ); +GLAPI void APIENTRY glColor3ui( GLuint red, GLuint green, GLuint blue ); +GLAPI void APIENTRY glColor3us( GLushort red, GLushort green, GLushort blue ); +GLAPI void APIENTRY glColor4b( GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha ); +GLAPI void APIENTRY glColor4d( GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha ); +GLAPI void APIENTRY glColor4f( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ); +GLAPI void APIENTRY glColor4i( GLint red, GLint green, GLint blue, GLint alpha ); +GLAPI void APIENTRY glColor4s( GLshort red, GLshort green, GLshort blue, GLshort alpha ); +GLAPI void APIENTRY glColor4ub( GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha ); +GLAPI void APIENTRY glColor4ui( GLuint red, GLuint green, GLuint blue, GLuint alpha ); +GLAPI void APIENTRY glColor4us( GLushort red, GLushort green, GLushort blue, GLushort alpha ); +GLAPI void APIENTRY glColor3bv( const GLbyte *v ); +GLAPI void APIENTRY glColor3dv( const GLdouble *v ); +GLAPI void APIENTRY glColor3fv( const GLfloat *v ); +GLAPI void APIENTRY glColor3iv( const GLint *v ); +GLAPI void APIENTRY glColor3sv( const GLshort *v ); +GLAPI void APIENTRY glColor3ubv( const GLubyte *v ); +GLAPI void APIENTRY glColor3uiv( const GLuint *v ); +GLAPI void APIENTRY glColor3usv( const GLushort *v ); +GLAPI void APIENTRY glColor4bv( const GLbyte *v ); +GLAPI void APIENTRY glColor4dv( const GLdouble *v ); +GLAPI void APIENTRY glColor4fv( const GLfloat *v ); +GLAPI void APIENTRY glColor4iv( const GLint *v ); +GLAPI void APIENTRY glColor4sv( const GLshort *v ); +GLAPI void APIENTRY glColor4ubv( const GLubyte *v ); +GLAPI void APIENTRY glColor4uiv( const GLuint *v ); +GLAPI void APIENTRY glColor4usv( const GLushort *v ); +GLAPI void APIENTRY glTexCoord1d( GLdouble s ); +GLAPI void APIENTRY glTexCoord1f( GLfloat s ); +GLAPI void APIENTRY glTexCoord1i( GLint s ); +GLAPI void APIENTRY glTexCoord1s( GLshort s ); +GLAPI void APIENTRY glTexCoord2d( GLdouble s, GLdouble t ); +GLAPI void APIENTRY glTexCoord2f( GLfloat s, GLfloat t ); +GLAPI void APIENTRY glTexCoord2i( GLint s, GLint t ); +GLAPI void APIENTRY glTexCoord2s( GLshort s, GLshort t ); +GLAPI void APIENTRY glTexCoord3d( GLdouble s, GLdouble t, GLdouble r ); +GLAPI void APIENTRY glTexCoord3f( GLfloat s, GLfloat t, GLfloat r ); +GLAPI void APIENTRY glTexCoord3i( GLint s, GLint t, GLint r ); +GLAPI void APIENTRY glTexCoord3s( GLshort s, GLshort t, GLshort r ); +GLAPI void APIENTRY glTexCoord4d( GLdouble s, GLdouble t, GLdouble r, GLdouble q ); +GLAPI void APIENTRY glTexCoord4f( GLfloat s, GLfloat t, GLfloat r, GLfloat q ); +GLAPI void APIENTRY glTexCoord4i( GLint s, GLint t, GLint r, GLint q ); +GLAPI void APIENTRY glTexCoord4s( GLshort s, GLshort t, GLshort r, GLshort q ); +GLAPI void APIENTRY glTexCoord1dv( const GLdouble *v ); +GLAPI void APIENTRY glTexCoord1fv( const GLfloat *v ); +GLAPI void APIENTRY glTexCoord1iv( const GLint *v ); +GLAPI void APIENTRY glTexCoord1sv( const GLshort *v ); +GLAPI void APIENTRY glTexCoord2dv( const GLdouble *v ); +GLAPI void APIENTRY glTexCoord2fv( const GLfloat *v ); +GLAPI void APIENTRY glTexCoord2iv( const GLint *v ); +GLAPI void APIENTRY glTexCoord2sv( const GLshort *v ); +GLAPI void APIENTRY glTexCoord3dv( const GLdouble *v ); +GLAPI void APIENTRY glTexCoord3fv( const GLfloat *v ); +GLAPI void APIENTRY glTexCoord3iv( const GLint *v ); +GLAPI void APIENTRY glTexCoord3sv( const GLshort *v ); +GLAPI void APIENTRY glTexCoord4dv( const GLdouble *v ); +GLAPI void APIENTRY glTexCoord4fv( const GLfloat *v ); +GLAPI void APIENTRY glTexCoord4iv( const GLint *v ); +GLAPI void APIENTRY glTexCoord4sv( const GLshort *v ); +GLAPI void APIENTRY glRasterPos2d( GLdouble x, GLdouble y ); +GLAPI void APIENTRY glRasterPos2f( GLfloat x, GLfloat y ); +GLAPI void APIENTRY glRasterPos2i( GLint x, GLint y ); +GLAPI void APIENTRY glRasterPos2s( GLshort x, GLshort y ); +GLAPI void APIENTRY glRasterPos3d( GLdouble x, GLdouble y, GLdouble z ); +GLAPI void APIENTRY glRasterPos3f( GLfloat x, GLfloat y, GLfloat z ); +GLAPI void APIENTRY glRasterPos3i( GLint x, GLint y, GLint z ); +GLAPI void APIENTRY glRasterPos3s( GLshort x, GLshort y, GLshort z ); +GLAPI void APIENTRY glRasterPos4d( GLdouble x, GLdouble y, GLdouble z, GLdouble w ); +GLAPI void APIENTRY glRasterPos4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w ); +GLAPI void APIENTRY glRasterPos4i( GLint x, GLint y, GLint z, GLint w ); +GLAPI void APIENTRY glRasterPos4s( GLshort x, GLshort y, GLshort z, GLshort w ); +GLAPI void APIENTRY glRasterPos2dv( const GLdouble *v ); +GLAPI void APIENTRY glRasterPos2fv( const GLfloat *v ); +GLAPI void APIENTRY glRasterPos2iv( const GLint *v ); +GLAPI void APIENTRY glRasterPos2sv( const GLshort *v ); +GLAPI void APIENTRY glRasterPos3dv( const GLdouble *v ); +GLAPI void APIENTRY glRasterPos3fv( const GLfloat *v ); +GLAPI void APIENTRY glRasterPos3iv( const GLint *v ); +GLAPI void APIENTRY glRasterPos3sv( const GLshort *v ); +GLAPI void APIENTRY glRasterPos4dv( const GLdouble *v ); +GLAPI void APIENTRY glRasterPos4fv( const GLfloat *v ); +GLAPI void APIENTRY glRasterPos4iv( const GLint *v ); +GLAPI void APIENTRY glRasterPos4sv( const GLshort *v ); +GLAPI void APIENTRY glRectd( GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2 ); +GLAPI void APIENTRY glRectf( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 ); +GLAPI void APIENTRY glRecti( GLint x1, GLint y1, GLint x2, GLint y2 ); +GLAPI void APIENTRY glRects( GLshort x1, GLshort y1, GLshort x2, GLshort y2 ); +GLAPI void APIENTRY glRectdv( const GLdouble *v1, const GLdouble *v2 ); +GLAPI void APIENTRY glRectfv( const GLfloat *v1, const GLfloat *v2 ); +GLAPI void APIENTRY glRectiv( const GLint *v1, const GLint *v2 ); +GLAPI void APIENTRY glRectsv( const GLshort *v1, const GLshort *v2 ); + +/* Lighting */ +GLAPI void APIENTRY glShadeModel( GLenum mode ); +GLAPI void APIENTRY glLightf( GLenum light, GLenum pname, GLfloat param ); +GLAPI void APIENTRY glLighti( GLenum light, GLenum pname, GLint param ); +GLAPI void APIENTRY glLightfv( GLenum light, GLenum pname, const GLfloat *params ); +GLAPI void APIENTRY glLightiv( GLenum light, GLenum pname, const GLint *params ); +GLAPI void APIENTRY glGetLightfv( GLenum light, GLenum pname, GLfloat *params ); +GLAPI void APIENTRY glGetLightiv( GLenum light, GLenum pname, GLint *params ); +GLAPI void APIENTRY glLightModelf( GLenum pname, GLfloat param ); +GLAPI void APIENTRY glLightModeli( GLenum pname, GLint param ); +GLAPI void APIENTRY glLightModelfv( GLenum pname, const GLfloat *params ); +GLAPI void APIENTRY glLightModeliv( GLenum pname, const GLint *params ); +GLAPI void APIENTRY glMaterialf( GLenum face, GLenum pname, GLfloat param ); +GLAPI void APIENTRY glMateriali( GLenum face, GLenum pname, GLint param ); +GLAPI void APIENTRY glMaterialfv( GLenum face, GLenum pname, const GLfloat *params ); +GLAPI void APIENTRY glMaterialiv( GLenum face, GLenum pname, const GLint *params ); +GLAPI void APIENTRY glGetMaterialfv( GLenum face, GLenum pname, GLfloat *params ); +GLAPI void APIENTRY glGetMaterialiv( GLenum face, GLenum pname, GLint *params ); +GLAPI void APIENTRY glColorMaterial( GLenum face, GLenum mode ); + +/* Raster functions */ +GLAPI void APIENTRY glPixelZoom( GLfloat xfactor, GLfloat yfactor ); +GLAPI void APIENTRY glPixelStoref( GLenum pname, GLfloat param ); +GLAPI void APIENTRY glPixelStorei( GLenum pname, GLint param ); +GLAPI void APIENTRY glPixelTransferf( GLenum pname, GLfloat param ); +GLAPI void APIENTRY glPixelTransferi( GLenum pname, GLint param ); +GLAPI void APIENTRY glPixelMapfv( GLenum map, GLint mapsize, const GLfloat *values ); +GLAPI void APIENTRY glPixelMapuiv( GLenum map, GLint mapsize, const GLuint *values ); +GLAPI void APIENTRY glPixelMapusv( GLenum map, GLint mapsize, const GLushort *values ); +GLAPI void APIENTRY glGetPixelMapfv( GLenum map, GLfloat *values ); +GLAPI void APIENTRY glGetPixelMapuiv( GLenum map, GLuint *values ); +GLAPI void APIENTRY glGetPixelMapusv( GLenum map, GLushort *values ); +GLAPI void APIENTRY glBitmap( GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap ); +GLAPI void APIENTRY glReadPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels ); +GLAPI void APIENTRY glDrawPixels( GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels ); +GLAPI void APIENTRY glCopyPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum type ); + +/* Stenciling */ +GLAPI void APIENTRY glStencilFunc( GLenum func, GLint ref, GLuint mask ); +GLAPI void APIENTRY glStencilMask( GLuint mask ); +GLAPI void APIENTRY glStencilOp( GLenum fail, GLenum zfail, GLenum zpass ); +GLAPI void APIENTRY glClearStencil( GLint s ); + +/* Texture mapping */ +GLAPI void APIENTRY glTexGend( GLenum coord, GLenum pname, GLdouble param ); +GLAPI void APIENTRY glTexGenf( GLenum coord, GLenum pname, GLfloat param ); +GLAPI void APIENTRY glTexGeni( GLenum coord, GLenum pname, GLint param ); +GLAPI void APIENTRY glTexGendv( GLenum coord, GLenum pname, const GLdouble *params ); +GLAPI void APIENTRY glTexGenfv( GLenum coord, GLenum pname, const GLfloat *params ); +GLAPI void APIENTRY glTexGeniv( GLenum coord, GLenum pname, const GLint *params ); +GLAPI void APIENTRY glGetTexGendv( GLenum coord, GLenum pname, GLdouble *params ); +GLAPI void APIENTRY glGetTexGenfv( GLenum coord, GLenum pname, GLfloat *params ); +GLAPI void APIENTRY glGetTexGeniv( GLenum coord, GLenum pname, GLint *params ); +GLAPI void APIENTRY glTexEnvf( GLenum target, GLenum pname, GLfloat param ); +GLAPI void APIENTRY glTexEnvi( GLenum target, GLenum pname, GLint param ); +GLAPI void APIENTRY glTexEnvfv( GLenum target, GLenum pname, const GLfloat *params ); +GLAPI void APIENTRY glTexEnviv( GLenum target, GLenum pname, const GLint *params ); +GLAPI void APIENTRY glGetTexEnvfv( GLenum target, GLenum pname, GLfloat *params ); +GLAPI void APIENTRY glGetTexEnviv( GLenum target, GLenum pname, GLint *params ); +GLAPI void APIENTRY glTexParameterf( GLenum target, GLenum pname, GLfloat param ); +GLAPI void APIENTRY glTexParameteri( GLenum target, GLenum pname, GLint param ); +GLAPI void APIENTRY glTexParameterfv( GLenum target, GLenum pname, const GLfloat *params ); +GLAPI void APIENTRY glTexParameteriv( GLenum target, GLenum pname, const GLint *params ); +GLAPI void APIENTRY glGetTexParameterfv( GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTexParameteriv( GLenum target, GLenum pname, GLint *params ); +GLAPI void APIENTRY glGetTexLevelParameterfv( GLenum target, GLint level, GLenum pname, GLfloat *params ); +GLAPI void APIENTRY glGetTexLevelParameteriv( GLenum target, GLint level, GLenum pname, GLint *params ); +GLAPI void APIENTRY glTexImage1D( GLenum target, GLint level, GLint internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels ); +GLAPI void APIENTRY glTexImage2D( GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels ); +GLAPI void APIENTRY glGetTexImage( GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels ); + +/* Evaluators */ +GLAPI void APIENTRY glMap1d( GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points ); +GLAPI void APIENTRY glMap1f( GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points ); +GLAPI void APIENTRY glMap2d( GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points ); +GLAPI void APIENTRY glMap2f( GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points ); +GLAPI void APIENTRY glGetMapdv( GLenum target, GLenum query, GLdouble *v ); +GLAPI void APIENTRY glGetMapfv( GLenum target, GLenum query, GLfloat *v ); +GLAPI void APIENTRY glGetMapiv( GLenum target, GLenum query, GLint *v ); +GLAPI void APIENTRY glEvalCoord1d( GLdouble u ); +GLAPI void APIENTRY glEvalCoord1f( GLfloat u ); +GLAPI void APIENTRY glEvalCoord1dv( const GLdouble *u ); +GLAPI void APIENTRY glEvalCoord1fv( const GLfloat *u ); +GLAPI void APIENTRY glEvalCoord2d( GLdouble u, GLdouble v ); +GLAPI void APIENTRY glEvalCoord2f( GLfloat u, GLfloat v ); +GLAPI void APIENTRY glEvalCoord2dv( const GLdouble *u ); +GLAPI void APIENTRY glEvalCoord2fv( const GLfloat *u ); +GLAPI void APIENTRY glMapGrid1d( GLint un, GLdouble u1, GLdouble u2 ); +GLAPI void APIENTRY glMapGrid1f( GLint un, GLfloat u1, GLfloat u2 ); +GLAPI void APIENTRY glMapGrid2d( GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2 ); +GLAPI void APIENTRY glMapGrid2f( GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2 ); +GLAPI void APIENTRY glEvalPoint1( GLint i ); +GLAPI void APIENTRY glEvalPoint2( GLint i, GLint j ); +GLAPI void APIENTRY glEvalMesh1( GLenum mode, GLint i1, GLint i2 ); +GLAPI void APIENTRY glEvalMesh2( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 ); + +/* Fog */ +GLAPI void APIENTRY glFogf( GLenum pname, GLfloat param ); +GLAPI void APIENTRY glFogi( GLenum pname, GLint param ); +GLAPI void APIENTRY glFogfv( GLenum pname, const GLfloat *params ); +GLAPI void APIENTRY glFogiv( GLenum pname, const GLint *params ); + +/* Selection and Feedback */ +GLAPI void APIENTRY glFeedbackBuffer( GLsizei size, GLenum type, GLfloat *buffer ); +GLAPI void APIENTRY glPassThrough( GLfloat token ); +GLAPI void APIENTRY glSelectBuffer( GLsizei size, GLuint *buffer ); +GLAPI void APIENTRY glInitNames( void ); +GLAPI void APIENTRY glLoadName( GLuint name ); +GLAPI void APIENTRY glPushName( GLuint name ); +GLAPI void APIENTRY glPopName( void ); + + +/* 1.1 functions */ +/* texture objects */ +GLAPI void APIENTRY glGenTextures( GLsizei n, GLuint *textures ); +GLAPI void APIENTRY glDeleteTextures( GLsizei n, const GLuint *textures); +GLAPI void APIENTRY glBindTexture( GLenum target, GLuint texture ); +GLAPI void APIENTRY glPrioritizeTextures( GLsizei n, const GLuint *textures, const GLclampf *priorities ); +GLAPI GLboolean APIENTRY glAreTexturesResident( GLsizei n, const GLuint *textures, GLboolean *residences ); +GLAPI GLboolean APIENTRY glIsTexture( GLuint texture ); +/* texture mapping */ +GLAPI void APIENTRY glTexSubImage1D( GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels ); +GLAPI void APIENTRY glTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels ); +GLAPI void APIENTRY glCopyTexImage1D( GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border ); +GLAPI void APIENTRY glCopyTexImage2D( GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border ); +GLAPI void APIENTRY glCopyTexSubImage1D( GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width ); +GLAPI void APIENTRY glCopyTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height ); +/* vertex arrays */ +GLAPI void APIENTRY glVertexPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *ptr ); +GLAPI void APIENTRY glNormalPointer( GLenum type, GLsizei stride, const GLvoid *ptr ); +GLAPI void APIENTRY glColorPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *ptr ); +GLAPI void APIENTRY glIndexPointer( GLenum type, GLsizei stride, const GLvoid *ptr ); +GLAPI void APIENTRY glTexCoordPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *ptr ); +GLAPI void APIENTRY glEdgeFlagPointer( GLsizei stride, const GLvoid *ptr ); +GLAPI void APIENTRY glGetPointerv( GLenum pname, GLvoid **params ); +GLAPI void APIENTRY glArrayElement( GLint i ); +GLAPI void APIENTRY glDrawArrays( GLenum mode, GLint first, GLsizei count ); +GLAPI void APIENTRY glDrawElements( GLenum mode, GLsizei count, GLenum type, const GLvoid *indices ); +GLAPI void APIENTRY glInterleavedArrays( GLenum format, GLsizei stride, const GLvoid *pointer ); + + + +/* Under Windows, we do not define OpenGL 1.2 & 1.3 functionality, since + it is treated as extensions (defined in glext.h) */ +#if !defined(__WIN32__) + +/* 1.2 functions */ +GLAPI void APIENTRY glDrawRangeElements( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices ); +GLAPI void APIENTRY glTexImage3D( GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels ); +GLAPI void APIENTRY 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 APIENTRY glCopyTexSubImage3D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height ); + +/* 1.2 imaging extension functions */ +GLAPI void APIENTRY glColorTable( GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table ); +GLAPI void APIENTRY glColorSubTable( GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data ); +GLAPI void APIENTRY glColorTableParameteriv(GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glCopyColorSubTable( GLenum target, GLsizei start, GLint x, GLint y, GLsizei width ); +GLAPI void APIENTRY glCopyColorTable( GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width ); +GLAPI void APIENTRY glGetColorTable( GLenum target, GLenum format, GLenum type, GLvoid *table ); +GLAPI void APIENTRY glGetColorTableParameterfv( GLenum target, GLenum pname, GLfloat *params ); +GLAPI void APIENTRY glGetColorTableParameteriv( GLenum target, GLenum pname, GLint *params ); +GLAPI void APIENTRY glBlendEquation( GLenum mode ); +GLAPI void APIENTRY glBlendColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ); +GLAPI void APIENTRY glHistogram( GLenum target, GLsizei width, GLenum internalformat, GLboolean sink ); +GLAPI void APIENTRY glResetHistogram( GLenum target ); +GLAPI void APIENTRY glGetHistogram( GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values ); +GLAPI void APIENTRY glGetHistogramParameterfv( GLenum target, GLenum pname, GLfloat *params ); +GLAPI void APIENTRY glGetHistogramParameteriv( GLenum target, GLenum pname, GLint *params ); +GLAPI void APIENTRY glMinmax( GLenum target, GLenum internalformat, GLboolean sink ); +GLAPI void APIENTRY glResetMinmax( GLenum target ); +GLAPI void APIENTRY glGetMinmax( GLenum target, GLboolean reset, GLenum format, GLenum types, GLvoid *values ); +GLAPI void APIENTRY glGetMinmaxParameterfv( GLenum target, GLenum pname, GLfloat *params ); +GLAPI void APIENTRY glGetMinmaxParameteriv( GLenum target, GLenum pname, GLint *params ); +GLAPI void APIENTRY glConvolutionFilter1D( GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image ); +GLAPI void APIENTRY glConvolutionFilter2D( GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image ); +GLAPI void APIENTRY glConvolutionParameterf( GLenum target, GLenum pname, GLfloat params ); +GLAPI void APIENTRY glConvolutionParameterfv( GLenum target, GLenum pname, const GLfloat *params ); +GLAPI void APIENTRY glConvolutionParameteri( GLenum target, GLenum pname, GLint params ); +GLAPI void APIENTRY glConvolutionParameteriv( GLenum target, GLenum pname, const GLint *params ); +GLAPI void APIENTRY glCopyConvolutionFilter1D( GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width ); +GLAPI void APIENTRY glCopyConvolutionFilter2D( GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetConvolutionFilter( GLenum target, GLenum format, GLenum type, GLvoid *image ); +GLAPI void APIENTRY glGetConvolutionParameterfv( GLenum target, GLenum pname, GLfloat *params ); +GLAPI void APIENTRY glGetConvolutionParameteriv( GLenum target, GLenum pname, GLint *params ); +GLAPI void APIENTRY glSeparableFilter2D( GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column ); +GLAPI void APIENTRY glGetSeparableFilter( GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span ); + +/* 1.3 functions */ +GLAPI void APIENTRY glActiveTexture( GLenum texture ); +GLAPI void APIENTRY glClientActiveTexture( GLenum texture ); +GLAPI void APIENTRY glCompressedTexImage1D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data ); +GLAPI void APIENTRY glCompressedTexImage2D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data ); +GLAPI void APIENTRY glCompressedTexImage3D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data ); +GLAPI void APIENTRY glCompressedTexSubImage1D( GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data ); +GLAPI void APIENTRY glCompressedTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data ); +GLAPI void APIENTRY 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 APIENTRY glGetCompressedTexImage( GLenum target, GLint lod, GLvoid *img ); +GLAPI void APIENTRY glMultiTexCoord1d( GLenum target, GLdouble s ); +GLAPI void APIENTRY glMultiTexCoord1dv( GLenum target, const GLdouble *v ); +GLAPI void APIENTRY glMultiTexCoord1f( GLenum target, GLfloat s ); +GLAPI void APIENTRY glMultiTexCoord1fv( GLenum target, const GLfloat *v ); +GLAPI void APIENTRY glMultiTexCoord1i( GLenum target, GLint s ); +GLAPI void APIENTRY glMultiTexCoord1iv( GLenum target, const GLint *v ); +GLAPI void APIENTRY glMultiTexCoord1s( GLenum target, GLshort s ); +GLAPI void APIENTRY glMultiTexCoord1sv( GLenum target, const GLshort *v ); +GLAPI void APIENTRY glMultiTexCoord2d( GLenum target, GLdouble s, GLdouble t ); +GLAPI void APIENTRY glMultiTexCoord2dv( GLenum target, const GLdouble *v ); +GLAPI void APIENTRY glMultiTexCoord2f( GLenum target, GLfloat s, GLfloat t ); +GLAPI void APIENTRY glMultiTexCoord2fv( GLenum target, const GLfloat *v ); +GLAPI void APIENTRY glMultiTexCoord2i( GLenum target, GLint s, GLint t ); +GLAPI void APIENTRY glMultiTexCoord2iv( GLenum target, const GLint *v ); +GLAPI void APIENTRY glMultiTexCoord2s( GLenum target, GLshort s, GLshort t ); +GLAPI void APIENTRY glMultiTexCoord2sv( GLenum target, const GLshort *v ); +GLAPI void APIENTRY glMultiTexCoord3d( GLenum target, GLdouble s, GLdouble t, GLdouble r ); +GLAPI void APIENTRY glMultiTexCoord3dv( GLenum target, const GLdouble *v ); +GLAPI void APIENTRY glMultiTexCoord3f( GLenum target, GLfloat s, GLfloat t, GLfloat r ); +GLAPI void APIENTRY glMultiTexCoord3fv( GLenum target, const GLfloat *v ); +GLAPI void APIENTRY glMultiTexCoord3i( GLenum target, GLint s, GLint t, GLint r ); +GLAPI void APIENTRY glMultiTexCoord3iv( GLenum target, const GLint *v ); +GLAPI void APIENTRY glMultiTexCoord3s( GLenum target, GLshort s, GLshort t, GLshort r ); +GLAPI void APIENTRY glMultiTexCoord3sv( GLenum target, const GLshort *v ); +GLAPI void APIENTRY glMultiTexCoord4d( GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q ); +GLAPI void APIENTRY glMultiTexCoord4dv( GLenum target, const GLdouble *v ); +GLAPI void APIENTRY glMultiTexCoord4f( GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q ); +GLAPI void APIENTRY glMultiTexCoord4fv( GLenum target, const GLfloat *v ); +GLAPI void APIENTRY glMultiTexCoord4i( GLenum target, GLint s, GLint t, GLint r, GLint q ); +GLAPI void APIENTRY glMultiTexCoord4iv( GLenum target, const GLint *v ); +GLAPI void APIENTRY glMultiTexCoord4s( GLenum target, GLshort s, GLshort t, GLshort r, GLshort q ); +GLAPI void APIENTRY glMultiTexCoord4sv( GLenum target, const GLshort *v ); +GLAPI void APIENTRY glLoadTransposeMatrixd( const GLdouble m[16] ); +GLAPI void APIENTRY glLoadTransposeMatrixf( const GLfloat m[16] ); +GLAPI void APIENTRY glMultTransposeMatrixd( const GLdouble m[16] ); +GLAPI void APIENTRY glMultTransposeMatrixf( const GLfloat m[16] ); +GLAPI void APIENTRY glSampleCoverage( GLclampf value, GLboolean invert ); +GLAPI void APIENTRY glSamplePass( GLenum pass ); + +#endif /* __WIN32__ */ + + +/* Include external definitions of OpenGL extensions */ +/* Removed, see this bug report for reference: + * http://sourceforge.net/tracker/index.php?func=detail&aid=610178&group_id=2435&atid=102435 + * + * #include <GL/glext.h> + */ + + +/************************************************************************ + * Begin system-specific stuff + */ +/* + * End system-specific stuff + ************************************************************************/ + + +#ifdef __cplusplus +} +#endif + +#endif /* __gl_h_ */ diff --git a/reactos/w32api/include/GL/glext.h b/reactos/w32api/include/GL/glext.h new file mode 100644 index 00000000000..c4b4baa0930 --- /dev/null +++ b/reactos/w32api/include/GL/glext.h @@ -0,0 +1,4623 @@ +#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-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 <windows.h> +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif +#ifndef GLAPI +#define GLAPI extern +#endif + +/*************************************************************/ + +/* Header file version number, required by OpenGL ABI for Linux */ +/* glext.h last updated 2002/03/22 */ +/* Current version at http://oss.sgi.com/projects/ogl-sample/registry/ */ +#define GL_GLEXT_VERSION 11 + +#ifndef GL_VERSION_1_2 +#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_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_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_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_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_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_IGNORE_BORDER 0x8150 +#define GL_CONSTANT_BORDER 0x8151 +#define GL_WRAP_BORDER 0x8152 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 +#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_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_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_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MIN_SGIS 0x8126 +#define GL_POINT_SIZE_MAX_ARB 0x8127 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_SIZE_MAX_SGIS 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 +#define GL_DISTANCE_ATTENUATION_SGIS 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_RGB_EXT 0x86AE +#define GL_DOT3_RGBA_ARB 0x86AF +#define GL_DOT3_RGBA_EXT 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_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 0x806B +#define GL_PACK_SKIP_IMAGES_EXT 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_DEPTH_EXT 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_TEXTURE_WRAP_R_EXT 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#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_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_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_TEXTURE_RECTANGLE_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_INARIANTS_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_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 (APIENTRY * PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +typedef void (APIENTRY * PFNGLBLENDEQUATIONPROC) (GLenum mode); +typedef void (APIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +typedef void (APIENTRY * PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (APIENTRY * PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRY * PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRY * PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRY * PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); +typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRY * PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +typedef void (APIENTRY * PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (APIENTRY * PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRY * PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRY * PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); +typedef void (APIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRY * PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +typedef void (APIENTRY * PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); +typedef void (APIENTRY * PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRY * PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRY * PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRY * PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRY * PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRY * PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRY * PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRY * PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRY * PFNGLRESETHISTOGRAMPROC) (GLenum target); +typedef void (APIENTRY * PFNGLRESETMINMAXPROC) (GLenum target); +typedef void (APIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRY * 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 (APIENTRY * 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, void *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRY * PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRY * PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRY * PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); +typedef void (APIENTRY * PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); +typedef void (APIENTRY * PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); +typedef void (APIENTRY * PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); +typedef void (APIENTRY * PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRY * PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRY * PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRY * PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRY * PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRY * PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRY * PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRY * PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRY * PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRY * PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRY * PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRY * PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRY * PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRY * PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRY * PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); +typedef void (APIENTRY * PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRY * PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); +typedef void (APIENTRY * PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, void *img); +#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 (APIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRY * PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (APIENTRY * PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (APIENTRY * PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (APIENTRY * PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (APIENTRY * PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRY * PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRY * PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRY * PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRY * PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRY * PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRY * PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRY * PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRY * PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRY * PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRY * PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRY * PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRY * PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRY * PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +typedef void (APIENTRY * PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRY * 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 (APIENTRY * 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, void *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, void *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 (APIENTRY * PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights); +typedef void (APIENTRY * PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights); +typedef void (APIENTRY * PFNGLWEIGHTIVARBPROC) (GLint size, const GLint *weights); +typedef void (APIENTRY * PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights); +typedef void (APIENTRY * PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights); +typedef void (APIENTRY * PFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights); +typedef void (APIENTRY * PFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights); +typedef void (APIENTRY * PFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights); +typedef void (APIENTRY * PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); +typedef void (APIENTRY * PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices); +typedef void (APIENTRY * PFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices); +typedef void (APIENTRY * PFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices); +typedef void (APIENTRY * 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_mirror_repeat +#define GL_ARB_texture_mirror_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 (APIENTRY * PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRY * PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v); +typedef void (APIENTRY * PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRY * PFNGLWINDOWPOS2FVARBPROC) (const GLfloat *v); +typedef void (APIENTRY * PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); +typedef void (APIENTRY * PFNGLWINDOWPOS2IVARBPROC) (const GLint *v); +typedef void (APIENTRY * PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); +typedef void (APIENTRY * PFNGLWINDOWPOS2SVARBPROC) (const GLshort *v); +typedef void (APIENTRY * PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRY * PFNGLWINDOWPOS3DVARBPROC) (const GLdouble *v); +typedef void (APIENTRY * PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY * PFNGLWINDOWPOS3FVARBPROC) (const GLfloat *v); +typedef void (APIENTRY * PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRY * PFNGLWINDOWPOS3IVARBPROC) (const GLint *v); +typedef void (APIENTRY * PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRY * PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v); +#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 (APIENTRY * 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 (APIENTRY * 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 (APIENTRY * PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRY * PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRY * PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRY * PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRY * PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRY * PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRY * PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRY * PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRY * PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRY * PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRY * PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRY * PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRY * PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRY * PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRY * PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); +typedef void (APIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRY * PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (APIENTRY * PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRY * PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRY * PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRY * PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); +typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRY * 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 (APIENTRY * 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 (APIENTRY * PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); +typedef void (APIENTRY * PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRY * PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRY * PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRY * PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); +typedef void (APIENTRY * 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 (APIENTRY * 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 (APIENTRY * 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 (APIENTRY * PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); +typedef void (APIENTRY * PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); +typedef void (APIENTRY * PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); +typedef void (APIENTRY * PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); +typedef GLboolean (APIENTRY * PFNGLISTEXTUREEXTPROC) (GLuint texture); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i); +typedef void (APIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); +typedef void (APIENTRY * PFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* *params); +typedef void (APIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRY * 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 (APIENTRY * 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 (APIENTRY * PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRY * PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRY * PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLGETINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRY * PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); +typedef GLint (APIENTRY * PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); +typedef void (APIENTRY * PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); +typedef void (APIENTRY * PFNGLSTARTINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRY * 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 (APIENTRY * 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 (APIENTRY * 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 (APIENTRY * 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 (APIENTRY * 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 (APIENTRY * PFNGLDEFORMSGIXPROC) (GLbitfield mask); +typedef void (APIENTRY * 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 (APIENTRY * 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 (APIENTRY * 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 (APIENTRY * PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRY * PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRY * PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRY * PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +typedef void (APIENTRY * 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 (APIENTRY * 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 (APIENTRY * PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (APIENTRY * PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *data); +typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); +typedef void (APIENTRY * PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); +typedef void (APIENTRY * PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); +typedef void (APIENTRY * PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); +typedef void (APIENTRY * PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); +typedef void (APIENTRY * 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 (APIENTRY * 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 (APIENTRY * 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 (APIENTRY * PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); +typedef void (APIENTRY * PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (APIENTRY * PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); +typedef void (APIENTRY * PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); +typedef void (APIENTRY * PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); +typedef void (APIENTRY * PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRY * PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRY * PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRY * PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRY * PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); +typedef void (APIENTRY * PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); +typedef void (APIENTRY * PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); +typedef void (APIENTRY * PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); +typedef void (APIENTRY * PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); +typedef void (APIENTRY * PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); +typedef void (APIENTRY * PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); +typedef void (APIENTRY * PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); +typedef void (APIENTRY * 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 (APIENTRY * 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 (APIENTRY * PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); +typedef void (APIENTRY * PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLASYNCMARKERSGIXPROC) (GLuint marker); +typedef GLint (APIENTRY * PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp); +typedef GLint (APIENTRY * PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp); +typedef GLuint (APIENTRY * PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); +typedef void (APIENTRY * PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); +typedef GLboolean (APIENTRY * 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 (APIENTRY * PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +typedef void (APIENTRY * PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const GLvoid* *pointer); +typedef void (APIENTRY * PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRY * PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRY * PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRY * PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRY * PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRY * PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRY * PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRY * PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRY * PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); +typedef void (APIENTRY * PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRY * PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); +typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); +typedef void (APIENTRY * PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRY * PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); +typedef void (APIENTRY * 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 (APIENTRY * 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 (APIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord); +typedef void (APIENTRY * PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); +typedef void (APIENTRY * PFNGLFOGCOORDDEXTPROC) (GLdouble coord); +typedef void (APIENTRY * PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); +typedef void (APIENTRY * PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRY * PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); +typedef void (APIENTRY * PFNGLTANGENT3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRY * PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); +typedef void (APIENTRY * PFNGLTANGENT3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRY * PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); +typedef void (APIENTRY * PFNGLTANGENT3IVEXTPROC) (const GLint *v); +typedef void (APIENTRY * PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); +typedef void (APIENTRY * PFNGLTANGENT3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRY * PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); +typedef void (APIENTRY * PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRY * PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); +typedef void (APIENTRY * PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRY * PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); +typedef void (APIENTRY * PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRY * PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); +typedef void (APIENTRY * PFNGLBINORMAL3IVEXTPROC) (const GLint *v); +typedef void (APIENTRY * PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); +typedef void (APIENTRY * PFNGLBINORMAL3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRY * PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRY * 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 (APIENTRY * 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 (APIENTRY * PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); +typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); +typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); +typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); +typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); +typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); +typedef void (APIENTRY * PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); +typedef void (APIENTRY * PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); +typedef void (APIENTRY * PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); +typedef void (APIENTRY * PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); +typedef void (APIENTRY * PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); +typedef void (APIENTRY * PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); +typedef void (APIENTRY * 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 (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLenum *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLenum, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLenum *, const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLenum, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLenum *, const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRY * PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +typedef void (APIENTRY * PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRY * PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY * PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRY * PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY * PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); +typedef void (APIENTRY * PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY * PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); +typedef void (APIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRY * PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY * PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRY * PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRY * PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLenum rc, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *v); +typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLenum rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLenum *rc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLenum rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLenum rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLenum rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLenum rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLenum rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLenum *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLenum 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 (APIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLenum *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); +GLAPI void APIENTRY glBlendFuncSeparateINGR (GLenum, GLenum, GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRY * PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); +typedef void (APIENTRY * PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRY * PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRY * PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRY * PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRY * PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRY * PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +typedef void (APIENTRY * PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRY * PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRY * PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); +typedef void (APIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); +typedef void (APIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); +typedef void (APIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRY * 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 (APIENTRY * 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 (APIENTRY * PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRY * PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRY * PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRY * PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRY * PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); +typedef void (APIENTRY * PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); +typedef void (APIENTRY * PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); +typedef void (APIENTRY * PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); +typedef void (APIENTRY * PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRY * PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRY * PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY * PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRY * PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRY * PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); +typedef void (APIENTRY * PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRY * PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); +typedef void (APIENTRY * PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRY * PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRY * PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRY * PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRY * PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRY * PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); +typedef void (APIENTRY * PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRY * 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 (GLenum, const GLint *, const GLsizei *, GLsizei, GLint); +GLAPI void APIENTRY glMultiModeDrawElementsIBM (const GLenum *, const GLsizei *, GLenum, const GLvoid* *, GLsizei, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRY * PFNGLMULTIMODEDRAWARRAYSIBMPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +typedef void (APIENTRY * PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* *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 (APIENTRY * PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRY * PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRY * PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean* *pointer, GLint ptrstride); +typedef void (APIENTRY * PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRY * PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRY * PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRY * PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRY * 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 (APIENTRY * 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 (APIENTRY * PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRY * 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 (APIENTRY * 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 (APIENTRY * PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const GLvoid *params); +#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 (APIENTRY * PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); +typedef void (APIENTRY * PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); +typedef GLboolean (APIENTRY * PFNGLISFENCENVPROC) (GLuint fence); +typedef GLboolean (APIENTRY * PFNGLTESTFENCENVPROC) (GLuint fence); +typedef void (APIENTRY * PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); +typedef void (APIENTRY * PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points); +typedef void (APIENTRY * PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRY * PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRY * PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *points); +typedef void (APIENTRY * PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRY * PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRY * PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRY * PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences); +typedef void (APIENTRY * PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); +typedef void (APIENTRY * PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRY * PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat *params); +typedef void (APIENTRY * PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRY * PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRY * PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRY * PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRY * PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte *program); +typedef void (APIENTRY * PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params); +typedef void (APIENTRY * PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRY * PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRY * PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRY * PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); +typedef GLboolean (APIENTRY * PFNGLISPROGRAMNVPROC) (GLuint id); +typedef void (APIENTRY * PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); +typedef void (APIENTRY * PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRY * PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v); +typedef void (APIENTRY * PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRY * PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v); +typedef void (APIENTRY * PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint count, const GLdouble *v); +typedef void (APIENTRY * PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint count, const GLfloat *v); +typedef void (APIENTRY * PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRY * PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); +typedef void (APIENTRY * PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRY * PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); +typedef void (APIENTRY * PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRY * PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); +typedef void (APIENTRY * PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRY * PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); +typedef void (APIENTRY * PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRY * PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRY * PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRY * PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRY * PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRY * PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRY * PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRY * PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRY * PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRY * PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY * PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRY * PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRY * PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRY * PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRY * PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRY * PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRY * PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRY * PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRY * PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRY * PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRY * PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRY * PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRY * PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRY * PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRY * PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRY * PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRY * PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRY * PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRY * PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRY * PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRY * PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRY * PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRY * PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param); +typedef void (APIENTRY * PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param); +typedef void (APIENTRY * PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); +typedef void (APIENTRY * PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRY * PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRY * PFNGLBEGINFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRY * PFNGLENDFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRY * PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); +typedef void (APIENTRY * PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); +typedef void (APIENTRY * PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRY * PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRY * PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRY * 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 (APIENTRY * 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 (APIENTRY * PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRY * 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 glDeleteObjectBufferATI (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 (APIENTRY * PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const GLvoid *pointer, GLenum usage); +typedef GLboolean (APIENTRY * PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRY * PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve); +typedef void (APIENTRY * PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat *params); +typedef void (APIENTRY * PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRY * PFNGLDELETEOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRY * PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRY * PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat *params); +typedef void (APIENTRY * PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint *params); +typedef void (APIENTRY * PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRY * PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat *params); +typedef void (APIENTRY * 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 void *); +GLAPI void APIENTRY glSetLocalConstantEXT (GLuint, GLenum, const void *); +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 void *); +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 (APIENTRY * PFNGLBEGINVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRY * PFNGLENDVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRY * PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); +typedef GLuint (APIENTRY * PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); +typedef void (APIENTRY * PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); +typedef void (APIENTRY * PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); +typedef void (APIENTRY * PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +typedef void (APIENTRY * PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +typedef void (APIENTRY * PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRY * PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRY * PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef void (APIENTRY * PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLuint (APIENTRY * PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); +typedef void (APIENTRY * PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const void *addr); +typedef void (APIENTRY * PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const void *addr); +typedef void (APIENTRY * PFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte *addr); +typedef void (APIENTRY * PFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort *addr); +typedef void (APIENTRY * PFNGLVARIANTIVEXTPROC) (GLuint id, const GLint *addr); +typedef void (APIENTRY * PFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat *addr); +typedef void (APIENTRY * PFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble *addr); +typedef void (APIENTRY * PFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte *addr); +typedef void (APIENTRY * PFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort *addr); +typedef void (APIENTRY * PFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint *addr); +typedef void (APIENTRY * PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const void *addr); +typedef void (APIENTRY * PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (APIENTRY * PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef GLuint (APIENTRY * PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); +typedef GLuint (APIENTRY * PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); +typedef GLuint (APIENTRY * PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); +typedef GLuint (APIENTRY * PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); +typedef GLuint (APIENTRY * PFNGLBINDPARAMETEREXTPROC) (GLenum value); +typedef GLboolean (APIENTRY * PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); +typedef void (APIENTRY * PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRY * PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRY * PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRY * PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid* *data); +typedef void (APIENTRY * PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRY * PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRY * PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRY * PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRY * PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); +typedef void (APIENTRY * PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRY * PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); +typedef void (APIENTRY * PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRY * PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); +typedef void (APIENTRY * PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRY * PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); +typedef void (APIENTRY * PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRY * PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); +typedef void (APIENTRY * PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRY * PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); +typedef void (APIENTRY * PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRY * PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); +typedef void (APIENTRY * PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRY * PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); +typedef void (APIENTRY * PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRY * PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRY * PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRY * PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (APIENTRY * PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRY * PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY * PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRY * PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRY * PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRY * PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRY * PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRY * PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRY * PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRY * PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRY * PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRY * PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRY * PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRY * PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); +typedef void (APIENTRY * PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); +typedef void (APIENTRY * PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); +typedef void (APIENTRY * PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRY * PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz); +typedef void (APIENTRY * PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRY * PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); +typedef void (APIENTRY * PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRY * PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); +typedef void (APIENTRY * PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRY * PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); +typedef void (APIENTRY * PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLELEMENTPOINTERATIPROC) (GLenum type, const GLvoid *pointer); +typedef void (APIENTRY * PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); +typedef void (APIENTRY * 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 (APIENTRY * 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 (APIENTRY * PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRY * PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRY * PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRY * PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRY * PFNGLENDOCCLUSIONQUERYNVPROC) (void); +typedef void (APIENTRY * PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRY * 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 (APIENTRY * PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRY * 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 + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/reactos/w32api/include/GL/glu.h b/reactos/w32api/include/GL/glu.h new file mode 100644 index 00000000000..7c6ee748ba8 --- /dev/null +++ b/reactos/w32api/include/GL/glu.h @@ -0,0 +1,278 @@ +/* +** 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__ +#define _GLU_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#include <GL/gl.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/*************************************************************/ + +/* Boolean */ +#define GLU_FALSE 0 +#define GLU_TRUE 1 + +/* Version */ +#define GLU_VERSION_1_1 1 +#define GLU_VERSION_1_2 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_INVALID_OPERATION 100904 + +/* NurbsDisplay */ +/* GLU_FILL */ +#define GLU_OUTLINE_POLYGON 100240 +#define GLU_OUTLINE_PATCH 100241 + +/* 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 + +/* NurbsSampling */ +#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 + +/* Obsolete. For compatibility with previous Sun OpenGL versions */ +#define GLU_INCOMPATIBLE_GL_VERSION 100903 + + +/*************************************************************/ + + +#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 (APIENTRY *_GLUfuncptr)(); + +GLAPI void APIENTRY gluBeginCurve (GLUnurbs* nurb); +GLAPI void APIENTRY gluBeginPolygon (GLUtesselator* tess); +GLAPI void APIENTRY gluBeginSurface (GLUnurbs* nurb); +GLAPI void APIENTRY gluBeginTrim (GLUnurbs* nurb); +GLAPI GLint APIENTRY gluBuild1DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void *data); +GLAPI GLint APIENTRY gluBuild2DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY gluCylinder (GLUquadric* quad, GLdouble base, GLdouble top, GLdouble height, GLint slices, GLint stacks); +GLAPI void APIENTRY gluDeleteNurbsRenderer (GLUnurbs* nurb); +GLAPI void APIENTRY gluDeleteQuadric (GLUquadric* quad); +GLAPI void APIENTRY gluDeleteTess (GLUtesselator* tess); +GLAPI void APIENTRY gluDisk (GLUquadric* quad, GLdouble inner, GLdouble outer, GLint slices, GLint loops); +GLAPI void APIENTRY gluEndCurve (GLUnurbs* nurb); +GLAPI void APIENTRY gluEndPolygon (GLUtesselator* tess); +GLAPI void APIENTRY gluEndSurface (GLUnurbs* nurb); +GLAPI void APIENTRY gluEndTrim (GLUnurbs* nurb); +GLAPI const GLubyte * APIENTRY gluErrorString (GLenum error); +GLAPI const wchar_t * APIENTRY gluErrorUnicodeStringEXT (GLenum error); +GLAPI void APIENTRY gluGetNurbsProperty (GLUnurbs* nurb, GLenum property, GLfloat* data); +GLAPI const GLubyte * APIENTRY gluGetString (GLenum name); +GLAPI void APIENTRY gluGetTessProperty (GLUtesselator* tess, GLenum which, GLdouble* data); +GLAPI void APIENTRY gluLoadSamplingMatrices (GLUnurbs* nurb, const GLfloat *model, const GLfloat *perspective, const GLint *view); +GLAPI void APIENTRY gluLookAt (GLdouble eyeX, GLdouble eyeY, GLdouble eyeZ, GLdouble centerX, GLdouble centerY, GLdouble centerZ, GLdouble upX, GLdouble upY, GLdouble upZ); +GLAPI GLUnurbs* APIENTRY gluNewNurbsRenderer (void); +GLAPI GLUquadric* APIENTRY gluNewQuadric (void); +GLAPI GLUtesselator* APIENTRY gluNewTess (void); +GLAPI void APIENTRY gluNextContour (GLUtesselator* tess, GLenum type); +GLAPI void APIENTRY gluNurbsCallback (GLUnurbs* nurb, GLenum which, _GLUfuncptr CallBackFunc); +GLAPI void APIENTRY gluNurbsCurve (GLUnurbs* nurb, GLint knotCount, GLfloat *knots, GLint stride, GLfloat *control, GLint order, GLenum type); +GLAPI void APIENTRY gluNurbsProperty (GLUnurbs* nurb, GLenum property, GLfloat value); +GLAPI void APIENTRY 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 APIENTRY gluOrtho2D (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top); +GLAPI void APIENTRY gluPartialDisk (GLUquadric* quad, GLdouble inner, GLdouble outer, GLint slices, GLint loops, GLdouble start, GLdouble sweep); +GLAPI void APIENTRY gluPerspective (GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar); +GLAPI void APIENTRY gluPickMatrix (GLdouble x, GLdouble y, GLdouble delX, GLdouble delY, GLint *viewport); +GLAPI GLint APIENTRY gluProject (GLdouble objX, GLdouble objY, GLdouble objZ, const GLdouble *model, const GLdouble *proj, const GLint *view, GLdouble* winX, GLdouble* winY, GLdouble* winZ); +GLAPI void APIENTRY gluPwlCurve (GLUnurbs* nurb, GLint count, GLfloat* data, GLint stride, GLenum type); +GLAPI void APIENTRY gluQuadricCallback (GLUquadric* quad, GLenum which, _GLUfuncptr CallBackFunc); +GLAPI void APIENTRY gluQuadricDrawStyle (GLUquadric* quad, GLenum draw); +GLAPI void APIENTRY gluQuadricNormals (GLUquadric* quad, GLenum normal); +GLAPI void APIENTRY gluQuadricOrientation (GLUquadric* quad, GLenum orientation); +GLAPI void APIENTRY gluQuadricTexture (GLUquadric* quad, GLboolean texture); +GLAPI GLint APIENTRY gluScaleImage (GLenum format, GLsizei wIn, GLsizei hIn, GLenum typeIn, const void *dataIn, GLsizei wOut, GLsizei hOut, GLenum typeOut, GLvoid* dataOut); +GLAPI void APIENTRY gluSphere (GLUquadric* quad, GLdouble radius, GLint slices, GLint stacks); +GLAPI void APIENTRY gluTessBeginContour (GLUtesselator* tess); +GLAPI void APIENTRY gluTessBeginPolygon (GLUtesselator* tess, GLvoid* data); +GLAPI void APIENTRY gluTessCallback (GLUtesselator* tess, GLenum which, _GLUfuncptr CallBackFunc); +GLAPI void APIENTRY gluTessEndContour (GLUtesselator* tess); +GLAPI void APIENTRY gluTessEndPolygon (GLUtesselator* tess); +GLAPI void APIENTRY gluTessNormal (GLUtesselator* tess, GLdouble valueX, GLdouble valueY, GLdouble valueZ); +GLAPI void APIENTRY gluTessProperty (GLUtesselator* tess, GLenum which, GLdouble data); +GLAPI void APIENTRY gluTessVertex (GLUtesselator* tess, GLdouble *location, GLvoid* data); +GLAPI GLint APIENTRY gluUnProject (GLdouble winX, GLdouble winY, GLdouble winZ, const GLdouble *model, const GLdouble *proj, const GLint *view, GLdouble* objX, GLdouble* objY, GLdouble* objZ); +GLAPI GLint APIENTRY 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 UNICODE +#define gluErrorStringWIN gluErrorUnicodeStringEXT +#else +#define gluErrorStringWIN gluErrorString +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __glu_h__ */ diff --git a/reactos/w32api/include/accctrl.h b/reactos/w32api/include/accctrl.h new file mode 100644 index 00000000000..6f969042f3e --- /dev/null +++ b/reactos/w32api/include/accctrl.h @@ -0,0 +1,329 @@ +#ifndef _ACCCTRL_H +#define _ACCCTRL_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define AccFree LocalFree +#define ACTRL_RESERVED 0x00000000 +#define ACTRL_ACCESS_PROTECTED 0x00000001 +#define ACTRL_ACCESS_ALLOWED 0x00000001 +#define ACTRL_ACCESS_DENIED 0x00000002 +#define ACTRL_AUDIT_SUCCESS 0x00000004 +#define ACTRL_AUDIT_FAILURE 0x00000008 +#define ACTRL_SYSTEM_ACCESS 0x04000000 +#define ACTRL_DELETE 0x08000000 +#define ACTRL_READ_CONTROL 0x10000000 +#define ACTRL_CHANGE_ACCESS 0x20000000 +#define ACTRL_CHANGE_OWNER 0x40000000 +#define ACTRL_SYNCHRONIZE 0x80000000 +#define ACTRL_STD_RIGHTS_ALL 0xf8000000 + +#define ACTRL_FILE_READ 0x00000001 +#define ACTRL_FILE_WRITE 0x00000002 +#define ACTRL_FILE_APPEND 0x00000004 +#define ACTRL_FILE_READ_PROP 0x00000008 +#define ACTRL_FILE_WRITE_PROP 0x00000010 +#define ACTRL_FILE_EXECUTE 0x00000020 +#define ACTRL_FILE_READ_ATTRIB 0x00000080 +#define ACTRL_FILE_WRITE_ATTRIB 0x00000100 +#define ACTRL_FILE_CREATE_PIPE 0x00000200 +#define ACTRL_DIR_LIST 0x00000001 +#define ACTRL_DIR_CREATE_OBJECT 0x00000002 +#define ACTRL_DIR_CREATE_CHILD 0x00000004 +#define ACTRL_DIR_DELETE_CHILD 0x00000040 +#define ACTRL_DIR_TRAVERSE 0x00000020 +#define ACTRL_KERNEL_TERMINATE 0x00000001 +#define ACTRL_KERNEL_THREAD 0x00000002 +#define ACTRL_KERNEL_VM 0x00000004 +#define ACTRL_KERNEL_VM_READ 0x00000008 +#define ACTRL_KERNEL_VM_WRITE 0x00000010 +#define ACTRL_KERNEL_DUP_HANDLE 0x00000020 +#define ACTRL_KERNEL_PROCESS 0x00000040 +#define ACTRL_KERNEL_SET_INFO 0x00000080 +#define ACTRL_KERNEL_GET_INFO 0x00000100 +#define ACTRL_KERNEL_CONTROL 0x00000200 +#define ACTRL_KERNEL_ALERT 0x00000400 +#define ACTRL_KERNEL_GET_CONTEXT 0x00000800 +#define ACTRL_KERNEL_SET_CONTEXT 0x00001000 +#define ACTRL_KERNEL_TOKEN 0x00002000 +#define ACTRL_KERNEL_IMPERSONATE 0x00004000 +#define ACTRL_KERNEL_DIMPERSONATE 0x00008000 +#define ACTRL_PRINT_SADMIN 0x00000001 +#define ACTRL_PRINT_SLIST 0x00000002 +#define ACTRL_PRINT_PADMIN 0x00000004 +#define ACTRL_PRINT_PUSE 0x00000008 +#define ACTRL_PRINT_JADMIN 0x00000010 +#define ACTRL_SVC_GET_INFO 0x00000001 +#define ACTRL_SVC_SET_INFO 0x00000002 +#define ACTRL_SVC_STATUS 0x00000004 +#define ACTRL_SVC_LIST 0x00000008 +#define ACTRL_SVC_START 0x00000010 +#define ACTRL_SVC_STOP 0x00000020 +#define ACTRL_SVC_PAUSE 0x00000040 +#define ACTRL_SVC_INTERROGATE 0x00000080 +#define ACTRL_SVC_UCONTROL 0x00000100 +#define ACTRL_REG_QUERY 0x00000001 +#define ACTRL_REG_SET 0x00000002 +#define ACTRL_REG_CREATE_CHILD 0x00000004 +#define ACTRL_REG_LIST 0x00000008 +#define ACTRL_REG_NOTIFY 0x00000010 +#define ACTRL_REG_LINK 0x00000020 +#define ACTRL_WIN_CLIPBRD 0x00000001 +#define ACTRL_WIN_GLOBAL_ATOMS 0x00000002 +#define ACTRL_WIN_CREATE 0x00000004 +#define ACTRL_WIN_LIST_DESK 0x00000008 +#define ACTRL_WIN_LIST 0x00000010 +#define ACTRL_WIN_READ_ATTRIBS 0x00000020 +#define ACTRL_WIN_WRITE_ATTRIBS 0x00000040 +#define ACTRL_WIN_SCREEN 0x00000080 +#define ACTRL_WIN_EXIT 0x00000100 +#define ACTRL_ACCESS_NO_OPTIONS 0x00000000 +#define ACTRL_ACCESS_SUPPORTS_OBJECT_ENTRIES 0x00000001 +#define ACCCTRL_DEFAULT_PROVIDERA "Windows NT Access Provider" +#define ACCCTRL_DEFAULT_PROVIDERW L"Windows NT Access Provider" +#define TRUSTEE_ACCESS_ALLOWED 0x00000001L +#define TRUSTEE_ACCESS_READ 0x00000002L +#define TRUSTEE_ACCESS_WRITE 0x00000004L +#define TRUSTEE_ACCESS_EXPLICIT 0x00000001L +#define TRUSTEE_ACCESS_READ_WRITE (TRUSTEE_ACCESS_READ | TRUSTEE_ACCESS_WRITE) +#define TRUSTEE_ACCESS_ALL 0xFFFFFFFFL +#define NO_INHERITANCE 0x0 +#define SUB_OBJECTS_ONLY_INHERIT 0x1 +#define SUB_CONTAINERS_ONLY_INHERIT 0x2 +#define SUB_CONTAINERS_AND_OBJECTS_INHERIT 0x3 +#define INHERIT_NO_PROPAGATE 0x4 +#define INHERIT_ONLY 0x8 +#define INHERITED_ACCESS_ENTRY 0x10 +#define INHERITED_PARENT 0x10000000 +#define INHERITED_GRANDPARENT 0x20000000 + +typedef ULONG INHERIT_FLAGS, *PINHERIT_FLAGS; +typedef ULONG ACCESS_RIGHTS, *PACCESS_RIGHTS; + +typedef enum _ACCESS_MODE { + NOT_USED_ACCESS = 0, + GRANT_ACCESS, + SET_ACCESS, + DENY_ACCESS, + REVOKE_ACCESS, + SET_AUDIT_SUCCESS, + SET_AUDIT_FAILURE +} ACCESS_MODE; +typedef enum _SE_OBJECT_TYPE { + SE_UNKNOWN_OBJECT_TYPE = 0, + SE_FILE_OBJECT, + SE_SERVICE, + SE_PRINTER, + SE_REGISTRY_KEY, + SE_LMSHARE, + SE_KERNEL_OBJECT, + SE_WINDOW_OBJECT, + SE_DS_OBJECT, + SE_DS_OBJECT_ALL, + SE_PROVIDER_DEFINED_OBJECT, + SE_WMIGUID_OBJECT, + SE_REGISTRY_WOW64_32KEY +} SE_OBJECT_TYPE; +typedef enum _TRUSTEE_TYPE { + TRUSTEE_IS_UNKNOWN, + TRUSTEE_IS_USER, + TRUSTEE_IS_GROUP, + TRUSTEE_IS_DOMAIN, + TRUSTEE_IS_ALIAS, + TRUSTEE_IS_WELL_KNOWN_GROUP, + TRUSTEE_IS_DELETED, + TRUSTEE_IS_INVALID, + TRUSTEE_IS_COMPUTER +} TRUSTEE_TYPE; +typedef enum _TRUSTEE_FORM { + TRUSTEE_IS_SID, + TRUSTEE_IS_NAME, + TRUSTEE_BAD_FORM, + TRUSTEE_IS_OBJECTS_AND_SID, + TRUSTEE_IS_OBJECTS_AND_NAME +} TRUSTEE_FORM; +typedef enum _MULTIPLE_TRUSTEE_OPERATION { + NO_MULTIPLE_TRUSTEE, + TRUSTEE_IS_IMPERSONATE +} MULTIPLE_TRUSTEE_OPERATION; +typedef struct _TRUSTEE_A { + struct _TRUSTEE_A *pMultipleTrustee; + MULTIPLE_TRUSTEE_OPERATION MultipleTrusteeOperation; + TRUSTEE_FORM TrusteeForm; + TRUSTEE_TYPE TrusteeType; + LPSTR ptstrName; +} TRUSTEE_A, *PTRUSTEE_A, TRUSTEEA, *PTRUSTEEA; +typedef struct _TRUSTEE_W { + struct _TRUSTEE_W *pMultipleTrustee; + MULTIPLE_TRUSTEE_OPERATION MultipleTrusteeOperation; + TRUSTEE_FORM TrusteeForm; + TRUSTEE_TYPE TrusteeType; + LPWSTR ptstrName; +} TRUSTEE_W, *PTRUSTEE_W, TRUSTEEW, *PTRUSTEEW; +typedef struct _ACTRL_ACCESS_ENTRYA { + TRUSTEE_A Trustee; + ULONG fAccessFlags; + ACCESS_RIGHTS Access; + ACCESS_RIGHTS ProvSpecificAccess; + INHERIT_FLAGS Inheritance; + LPCSTR lpInheritProperty; +} ACTRL_ACCESS_ENTRYA, *PACTRL_ACCESS_ENTRYA; +typedef struct _ACTRL_ACCESS_ENTRYW { + TRUSTEE_W Trustee; + ULONG fAccessFlags; + ACCESS_RIGHTS Access; + ACCESS_RIGHTS ProvSpecificAccess; + INHERIT_FLAGS Inheritance; + LPCWSTR lpInheritProperty; +} ACTRL_ACCESS_ENTRYW, *PACTRL_ACCESS_ENTRYW; +typedef struct _ACTRL_ACCESS_ENTRY_LISTA { + ULONG cEntries; + ACTRL_ACCESS_ENTRYA *pAccessList; +} ACTRL_ACCESS_ENTRY_LISTA, *PACTRL_ACCESS_ENTRY_LISTA; +typedef struct _ACTRL_ACCESS_ENTRY_LISTW { + ULONG cEntries; + ACTRL_ACCESS_ENTRYW *pAccessList; +} ACTRL_ACCESS_ENTRY_LISTW, *PACTRL_ACCESS_ENTRY_LISTW; +typedef struct _ACTRL_PROPERTY_ENTRYA { + LPCSTR lpProperty; + PACTRL_ACCESS_ENTRY_LISTA pAccessEntryList; + ULONG fListFlags; +} ACTRL_PROPERTY_ENTRYA, *PACTRL_PROPERTY_ENTRYA; +typedef struct _ACTRL_PROPERTY_ENTRYW { + LPCWSTR lpProperty; + PACTRL_ACCESS_ENTRY_LISTW pAccessEntryList; + ULONG fListFlags; +} ACTRL_PROPERTY_ENTRYW, *PACTRL_PROPERTY_ENTRYW; +typedef struct _ACTRL_ALISTA { + ULONG cEntries; + PACTRL_PROPERTY_ENTRYA pPropertyAccessList; +} ACTRL_ACCESSA, *PACTRL_ACCESSA, ACTRL_AUDITA, *PACTRL_AUDITA; +typedef struct _ACTRL_ALISTW { + ULONG cEntries; + PACTRL_PROPERTY_ENTRYW pPropertyAccessList; +} ACTRL_ACCESSW, *PACTRL_ACCESSW, ACTRL_AUDITW, *PACTRL_AUDITW; +typedef struct _TRUSTEE_ACCESSA { + LPSTR lpProperty; + ACCESS_RIGHTS Access; + ULONG fAccessFlags; + ULONG fReturnedAccess; +} TRUSTEE_ACCESSA, *PTRUSTEE_ACCESSA; +typedef struct _TRUSTEE_ACCESSW { + LPWSTR lpProperty; + ACCESS_RIGHTS Access; + ULONG fAccessFlags; + ULONG fReturnedAccess; +} TRUSTEE_ACCESSW, *PTRUSTEE_ACCESSW; +typedef struct _ACTRL_OVERLAPPED { + _ANONYMOUS_UNION + union { + PVOID Provider; + ULONG Reserved1; + } DUMMYUNIONNAME; + ULONG Reserved2; + HANDLE hEvent; +} ACTRL_OVERLAPPED, *PACTRL_OVERLAPPED; +typedef struct _ACTRL_ACCESS_INFOA { + ULONG fAccessPermission; + LPSTR lpAccessPermissionName; +} ACTRL_ACCESS_INFOA, *PACTRL_ACCESS_INFOA; +typedef struct _ACTRL_ACCESS_INFOW { + ULONG fAccessPermission; + LPWSTR lpAccessPermissionName; +} ACTRL_ACCESS_INFOW, *PACTRL_ACCESS_INFOW; +typedef struct _ACTRL_CONTROL_INFOA { + LPSTR lpControlId; + LPSTR lpControlName; +} ACTRL_CONTROL_INFOA, *PACTRL_CONTROL_INFOA; +typedef struct _ACTRL_CONTROL_INFOW { + LPWSTR lpControlId; + LPWSTR lpControlName; +} ACTRL_CONTROL_INFOW, *PACTRL_CONTROL_INFOW; +typedef struct _EXPLICIT_ACCESS_A { + DWORD grfAccessPermissions; + ACCESS_MODE grfAccessMode; + DWORD grfInheritance; + TRUSTEE_A Trustee; +} EXPLICIT_ACCESS_A, *PEXPLICIT_ACCESS_A, EXPLICIT_ACCESSA, *PEXPLICIT_ACCESSA; +typedef struct _EXPLICIT_ACCESS_W { + DWORD grfAccessPermissions; + ACCESS_MODE grfAccessMode; + DWORD grfInheritance; + TRUSTEE_W Trustee; +} EXPLICIT_ACCESS_W, *PEXPLICIT_ACCESS_W, EXPLICIT_ACCESSW, *PEXPLICIT_ACCESSW; +typedef struct _OBJECTS_AND_SID { + DWORD ObjectsPresent; + GUID ObjectTypeGuid; + GUID InheritedObjectTypeGuid; + SID * pSid; +} OBJECTS_AND_SID, *POBJECTS_AND_SID; +typedef struct _OBJECTS_AND_NAME_A { + DWORD ObjectsPresent; + SE_OBJECT_TYPE ObjectType; + LPSTR ObjectTypeName; + LPSTR InheritedObjectTypeName; + LPSTR ptstrName; +} OBJECTS_AND_NAME_A, *POBJECTS_AND_NAME_A; +typedef struct _OBJECTS_AND_NAME_W { + DWORD ObjectsPresent; + SE_OBJECT_TYPE ObjectType; + LPWSTR ObjectTypeName; + LPWSTR InheritedObjectTypeName; + LPWSTR ptstrName; +} OBJECTS_AND_NAME_W, *POBJECTS_AND_NAME_W; +#if (_WIN32_WINNT >= 0x0501) +typedef struct { + LONG GenerationGap; + LPSTR AncestorName; +} INHERITED_FROMA, *PINHERITED_FROMA; +typedef struct { + LONG GenerationGap; + LPWSTR AncestorName; +} INHERITED_FROMW, *PINHERITED_FROMW; +#endif /* (_WIN32_WINNT >= 0x0501) */ + +#ifdef UNICODE +#define ACCCTRL_DEFAULT_PROVIDER ACCCTRL_DEFAULT_PROVIDERW +typedef TRUSTEE_W TRUSTEE_, *PTRUSTEE_; +typedef TRUSTEEW TRUSTEE, *PTRUSTEE; +typedef ACTRL_ACCESSW ACTRL_ACCESS, *PACTRL_ACCESS; +typedef ACTRL_ACCESS_ENTRY_LISTW ACTRL_ACCESS_ENTRY_LIST, *PACTRL_ACCESS_ENTRY_LIST; +typedef ACTRL_ACCESS_INFOW ACTRL_ACCESS_INFO, *PACTRL_ACCESS_INFO; +typedef ACTRL_ACCESS_ENTRYW ACTRL_ACCESS_ENTRY, *PACTRL_ACCESS_ENTRY; +typedef ACTRL_AUDITW ACTRL_AUDIT, *PACTRL_AUDIT; +typedef ACTRL_CONTROL_INFOW ACTRL_CONTROL_INFO, *PACTRL_CONTROL_INFO; +typedef EXPLICIT_ACCESS_W EXPLICIT_ACCESS_, *PEXPLICIT_ACCESS_; +typedef EXPLICIT_ACCESSW EXPLICIT_ACCESS, *PEXPLICIT_ACCESS; +typedef TRUSTEE_ACCESSW TRUSTEE_ACCESS, *PTRUSTEE_ACCESS; +typedef OBJECTS_AND_NAME_W OBJECTS_AND_NAME_, *POBJECTS_AND_NAME_; +#if (_WIN32_WINNT >= 0x0501) +typedef INHERITED_FROMW INHERITED_FROM, *PINHERITED_FROM; +#endif +#else +#define ACCCTRL_DEFAULT_PROVIDER ACCCTRL_DEFAULT_PROVIDERA +typedef TRUSTEE_A TRUSTEE_, *PTRUSTEE_; +typedef TRUSTEEA TRUSTEE, *PTRUSTEE; +typedef ACTRL_ACCESSA ACTRL_ACCESS, *PACTRL_ACCESS; +typedef ACTRL_ACCESS_ENTRY_LISTA ACTRL_ACCESS_ENTRY_LIST, *PACTRL_ACCESS_ENTRY_LIST; +typedef ACTRL_ACCESS_INFOA ACTRL_ACCESS_INFO, *PACTRL_ACCESS_INFO; +typedef ACTRL_ACCESS_ENTRYA ACTRL_ACCESS_ENTRY, *PACTRL_ACCESS_ENTRY; +typedef ACTRL_AUDITA ACTRL_AUDIT, *PACTRL_AUDIT; +typedef ACTRL_CONTROL_INFOA ACTRL_CONTROL_INFO, *PACTRL_CONTROL_INFO; +typedef EXPLICIT_ACCESS_A EXPLICIT_ACCESS_, *PEXPLICIT_ACCESS_; +typedef EXPLICIT_ACCESSA EXPLICIT_ACCESS, *PEXPLICIT_ACCESS; +typedef TRUSTEE_ACCESSA TRUSTEE_ACCESS, *PTRUSTEE_ACCESS; +typedef OBJECTS_AND_NAME_A OBJECTS_AND_NAME_, *POBJECTS_AND_NAME_; +#if (_WIN32_WINNT >= 0x0501) +typedef INHERITED_FROMA INHERITED_FROM, *PINHERITED_FROM; +#endif +#endif /* UNICODE */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/aclapi.h b/reactos/w32api/include/aclapi.h new file mode 100644 index 00000000000..d4ef6a794c5 --- /dev/null +++ b/reactos/w32api/include/aclapi.h @@ -0,0 +1,117 @@ +#ifndef _ACLAPI_H +#define _ACLAPI_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#include <windows.h> +#include <accctrl.h> + +#ifdef __cplusplus +extern "C" { +#endif + +VOID WINAPI BuildExplicitAccessWithNameA(PEXPLICIT_ACCESS_A,LPSTR,DWORD,ACCESS_MODE,DWORD); +VOID WINAPI BuildExplicitAccessWithNameW(PEXPLICIT_ACCESS_W,LPWSTR,DWORD,ACCESS_MODE,DWORD); +DWORD WINAPI BuildSecurityDescriptorA(PTRUSTEE_A,PTRUSTEE_A ,ULONG,PEXPLICIT_ACCESS_A, + ULONG,PEXPLICIT_ACCESS_A,PSECURITY_DESCRIPTOR,PULONG,PSECURITY_DESCRIPTOR*); +DWORD WINAPI BuildSecurityDescriptorW(PTRUSTEE_W,PTRUSTEE_W ,ULONG,PEXPLICIT_ACCESS_W, + ULONG,PEXPLICIT_ACCESS_W,PSECURITY_DESCRIPTOR,PULONG,PSECURITY_DESCRIPTOR*); +VOID WINAPI BuildTrusteeWithNameA(PTRUSTEE_A,LPSTR); +VOID WINAPI BuildTrusteeWithNameW(PTRUSTEE_W,LPWSTR); +VOID WINAPI BuildTrusteeWithObjectsAndNameA(PTRUSTEE_A,POBJECTS_AND_NAME_A,SE_OBJECT_TYPE, + LPSTR,LPSTR,LPSTR); +VOID WINAPI BuildTrusteeWithObjectsAndNameW(PTRUSTEE_W,POBJECTS_AND_NAME_W,SE_OBJECT_TYPE, + LPWSTR,LPWSTR,LPWSTR); +VOID WINAPI BuildTrusteeWithObjectsAndSidA(PTRUSTEE_A,POBJECTS_AND_SID,GUID*,GUID*,PSID); +VOID WINAPI BuildTrusteeWithObjectsAndSidW(PTRUSTEE_W,POBJECTS_AND_SID,GUID*,GUID*,PSID); +VOID WINAPI BuildTrusteeWithSidA(PTRUSTEE_A,PSID); +VOID WINAPI BuildTrusteeWithSidW(PTRUSTEE_W,PSID); +DWORD WINAPI GetAuditedPermissionsFromAclA(PACL,PTRUSTEE_A,PACCESS_MASK,PACCESS_MASK); +DWORD WINAPI GetAuditedPermissionsFromAclW(PACL,PTRUSTEE_W,PACCESS_MASK,PACCESS_MASK); +DWORD WINAPI GetEffectiveRightsFromAclA(PACL,PTRUSTEE_A,PACCESS_MASK); +DWORD WINAPI GetEffectiveRightsFromAclW(PACL,PTRUSTEE_W,PACCESS_MASK); +DWORD WINAPI GetExplicitEntriesFromAclA(PACL,PULONG,PEXPLICIT_ACCESS_A*); +DWORD WINAPI GetExplicitEntriesFromAclW(PACL,PULONG,PEXPLICIT_ACCESS_W*); +#if (_WIN32_WINNT >= 0x0501) +DWORD WINAPI GetInheritanceSourceA(LPSTR,SE_OBJECT_TYPE,SECURITY_INFORMATION,BOOL,GUID**,DWORD,PACL,void*,PGENERIC_MAPPING,PINHERITED_FROMA); +DWORD WINAPI GetInheritanceSourceW(LPWSTR,SE_OBJECT_TYPE,SECURITY_INFORMATION,BOOL,GUID**,DWORD,PACL,void*,PGENERIC_MAPPING,PINHERITED_FROMW); +#endif +DWORD WINAPI GetNamedSecurityInfoA(LPSTR,SE_OBJECT_TYPE,SECURITY_INFORMATION, + PSID*,PSID*,PACL*,PACL*,PSECURITY_DESCRIPTOR*); +DWORD WINAPI GetNamedSecurityInfoW(LPWSTR,SE_OBJECT_TYPE,SECURITY_INFORMATION, + PSID*,PSID*,PACL*,PACL*,PSECURITY_DESCRIPTOR*); +DWORD WINAPI GetSecurityInfo(HANDLE,SE_OBJECT_TYPE,SECURITY_INFORMATION, + PSID*,PSID*,PACL*,PACL*,PSECURITY_DESCRIPTOR*); +TRUSTEE_FORM WINAPI GetTrusteeFormA(PTRUSTEE_A); +TRUSTEE_FORM WINAPI GetTrusteeFormW(PTRUSTEE_W); +LPSTR WINAPI GetTrusteeNameA(PTRUSTEE_A); +LPWSTR WINAPI GetTrusteeNameW(PTRUSTEE_W); +TRUSTEE_TYPE WINAPI GetTrusteeTypeA(PTRUSTEE_A); +TRUSTEE_TYPE WINAPI GetTrusteeTypeW(PTRUSTEE_W); +DWORD WINAPI LookupSecurityDescriptorPartsA(PTRUSTEE_A*,PTRUSTEE_A*,PULONG,PEXPLICIT_ACCESS_A*, + PULONG,PEXPLICIT_ACCESS_A*,PSECURITY_DESCRIPTOR); +DWORD WINAPI LookupSecurityDescriptorPartsW(PTRUSTEE_W*,PTRUSTEE_W*,PULONG,PEXPLICIT_ACCESS_W*, + PULONG,PEXPLICIT_ACCESS_W*,PSECURITY_DESCRIPTOR); +DWORD WINAPI SetEntriesInAclA(ULONG,PEXPLICIT_ACCESS_A,PACL,PACL*); +DWORD WINAPI SetEntriesInAclW(ULONG,PEXPLICIT_ACCESS_W,PACL,PACL*); +DWORD WINAPI SetNamedSecurityInfoA(LPSTR,SE_OBJECT_TYPE,SECURITY_INFORMATION,PSID,PSID,PACL,PACL); +DWORD WINAPI SetNamedSecurityInfoW(LPWSTR,SE_OBJECT_TYPE,SECURITY_INFORMATION,PSID,PSID,PACL,PACL); +DWORD WINAPI SetSecurityInfo(HANDLE,SE_OBJECT_TYPE,SECURITY_INFORMATION,PSID,PSID,PACL,PACL); +VOID WINAPI BuildImpersonateExplicitAccessWithNameA(PEXPLICIT_ACCESS_A,LPSTR,PTRUSTEE_A,DWORD,ACCESS_MODE,DWORD); +VOID WINAPI BuildImpersonateExplicitAccessWithNameW(PEXPLICIT_ACCESS_W,LPWSTR,PTRUSTEE_W,DWORD,ACCESS_MODE,DWORD); +VOID WINAPI BuildImpersonateTrusteeA(PTRUSTEE_A,PTRUSTEE_A); +VOID WINAPI BuildImpersonateTrusteeW(PTRUSTEE_W,PTRUSTEE_W); +PTRUSTEE_A WINAPI GetMultipleTrusteeA(PTRUSTEE_A); +PTRUSTEE_W WINAPI GetMultipleTrusteeW(PTRUSTEE_W); +MULTIPLE_TRUSTEE_OPERATION WINAPI GetMultipleTrusteeOperationA(PTRUSTEE_A); +MULTIPLE_TRUSTEE_OPERATION WINAPI GetMultipleTrusteeOperationW(PTRUSTEE_W); + +#ifdef UNICODE +#define BuildExplicitAccessWithName BuildExplicitAccessWithNameW +#define BuildSecurityDescriptor BuildSecurityDescriptorW +#define BuildTrusteeWithName BuildTrusteeWithNameW +#define BuildTrusteeWithObjectsAndName BuildTrusteeWithObjectsAndNameW +#define BuildTrusteeWithObjectsAndSid BuildTrusteeWithObjectsAndSidW +#define BuildTrusteeWithSid BuildTrusteeWithSidW +#define GetAuditedPermissionsFromAcl GetAuditedPermissionsFromAclW +#define GetEffectiveRightsFromAcl GetEffectiveRightsFromAclW +#define GetExplicitEntriesFromAcl GetExplicitEntriesFromAclW +#define GetNamedSecurityInfo GetNamedSecurityInfoW +#define GetTrusteeForm GetTrusteeFormW +#define GetTrusteeName GetTrusteeNameW +#define GetTrusteeType GetTrusteeTypeW +#define LookupSecurityDescriptorParts LookupSecurityDescriptorPartsW +#define SetEntriesInAcl SetEntriesInAclW +#define SetNamedSecurityInfo SetNamedSecurityInfoW +#define BuildImpersonateExplicitAccessWithName BuildImpersonateExplicitAccessWithNameW +#define BuildImpersonateTrustee BuildImpersonateTrusteeW +#define GetMultipleTrustee GetMultipleTrusteeW +#define GetMultipleTrusteeOperation GetMultipleTrusteeOperationW +#else +#define BuildExplicitAccessWithName BuildExplicitAccessWithNameA +#define BuildSecurityDescriptor BuildSecurityDescriptorA +#define BuildTrusteeWithName BuildTrusteeWithNameA +#define BuildTrusteeWithObjectsAndName BuildTrusteeWithObjectsAndNameA +#define BuildTrusteeWithObjectsAndSid BuildTrusteeWithObjectsAndSidA +#define BuildTrusteeWithSid BuildTrusteeWithSidA +#define GetAuditedPermissionsFromAcl GetAuditedPermissionsFromAclA +#define GetEffectiveRightsFromAcl GetEffectiveRightsFromAclA +#define GetExplicitEntriesFromAcl GetExplicitEntriesFromAclA +#define GetNamedSecurityInfo GetNamedSecurityInfoA +#define GetTrusteeForm GetTrusteeFormA +#define GetTrusteeName GetTrusteeNameA +#define GetTrusteeType GetTrusteeTypeA +#define LookupSecurityDescriptorParts LookupSecurityDescriptorPartsA +#define SetEntriesInAcl SetEntriesInAclA +#define SetNamedSecurityInfo SetNamedSecurityInfoA +#define BuildImpersonateExplicitAccessWithName BuildImpersonateExplicitAccessWithNameA +#define BuildImpersonateTrustee BuildImpersonateTrusteeA +#define GetMultipleTrustee GetMultipleTrusteeA +#define GetMultipleTrusteeOperation GetMultipleTrusteeOperationA +#endif /* UNICODE */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/afxres.h b/reactos/w32api/include/afxres.h new file mode 100644 index 00000000000..91e7f495a16 --- /dev/null +++ b/reactos/w32api/include/afxres.h @@ -0,0 +1,23 @@ +#ifndef _AFXRES_H +#define _AFXRES_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _WINDOWS_H +#include <windows.h> +#endif + +/* IDC_STATIC is documented in winuser.h, but not defined. */ +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/basetsd.h b/reactos/w32api/include/basetsd.h new file mode 100644 index 00000000000..d9c375dd9a5 --- /dev/null +++ b/reactos/w32api/include/basetsd.h @@ -0,0 +1,119 @@ +#ifndef _BASETSD_H +#define _BASETSD_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __GNUC__ +#ifndef __int64 +#define __int64 long long +#endif +#endif + +#if defined(_WIN64) +#define __int3264 __int64 +#define ADDRESS_TAG_BIT 0x40000000000UI64 +#else /* !_WIN64 */ +#define __int3264 __int32 +#define ADDRESS_TAG_BIT 0x80000000UL +#define HandleToUlong( h ) ((ULONG)(ULONG_PTR)(h) ) +#define HandleToLong( h ) ((LONG)(LONG_PTR) (h) ) +#define LongToHandle( h) ((HANDLE)(LONG_PTR) (h)) +#define PtrToUlong( p ) ((ULONG)(ULONG_PTR) (p) ) +#define PtrToLong( p ) ((LONG)(LONG_PTR) (p) ) +#define PtrToUint( p ) ((UINT)(UINT_PTR) (p) ) +#define PtrToInt( p ) ((INT)(INT_PTR) (p) ) +#define PtrToUshort( p ) ((unsigned short)(ULONG_PTR)(p) ) +#define PtrToShort( p ) ((short)(LONG_PTR)(p) ) +#define IntToPtr( i ) ((VOID*)(INT_PTR)((int)i)) +#define UIntToPtr( ui ) ((VOID*)(UINT_PTR)((unsigned int)ui)) +#define LongToPtr( l ) ((VOID*)(LONG_PTR)((long)l)) +#define ULongToPtr( ul ) ((VOID*)(ULONG_PTR)((unsigned long)ul)) +#endif /* !_WIN64 */ + +#define UlongToPtr(ul) ULongToPtr(ul) +#define UintToPtr(ui) UIntToPtr(ui) +#define MAXUINT_PTR (~((UINT_PTR)0)) +#define MAXINT_PTR ((INT_PTR)(MAXUINT_PTR >> 1)) +#define MININT_PTR (~MAXINT_PTR) +#define MAXULONG_PTR (~((ULONG_PTR)0)) +#define MAXLONG_PTR ((LONG_PTR)(MAXULONG_PTR >> 1)) +#define MINLONG_PTR (~MAXLONG_PTR) +#define MAXUHALF_PTR ((UHALF_PTR)~0) +#define MAXHALF_PTR ((HALF_PTR)(MAXUHALF_PTR >> 1)) +#define MINHALF_PTR (~MAXHALF_PTR) + +#ifndef RC_INVOKED +#ifdef __cplusplus +extern "C" { +#endif +typedef int LONG32, *PLONG32; +#ifndef XFree86Server +typedef int INT32, *PINT32; +#endif /* ndef XFree86Server */ +typedef unsigned int ULONG32, *PULONG32; +typedef unsigned int DWORD32, *PDWORD32; +typedef unsigned int UINT32, *PUINT32; + +#if defined(_WIN64) +typedef __int64 INT_PTR, *PINT_PTR; +typedef unsigned __int64 UINT_PTR, *PUINT_PTR; +typedef __int64 LONG_PTR, *PLONG_PTR; +typedef unsigned __int64 ULONG_PTR, *PULONG_PTR; +typedef unsigned __int64 HANDLE_PTR; +typedef unsigned int UHALF_PTR, *PUHALF_PTR; +typedef int HALF_PTR, *PHALF_PTR; + +#if 0 /* TODO when WIN64 is here */ +inline unsigned long HandleToUlong(const void* h ) + { return((unsigned long) h ); } +inline long HandleToLong( const void* h ) + { return((long) h ); } +inline void* LongToHandle( const long h ) + { return((void*) (INT_PTR) h ); } +inline unsigned long PtrToUlong( const void* p) + { return((unsigned long) p ); } +inline unsigned int PtrToUint( const void* p ) + { return((unsigned int) p ); } +inline unsigned short PtrToUshort( const void* p ) + { return((unsigned short) p ); } +inline long PtrToLong( const void* p ) + { return((long) p ); } +inline int PtrToInt( const void* p ) + { return((int) p ); } +inline short PtrToShort( const void* p ) + { return((short) p ); } +inline void* IntToPtr( const int i ) + { return( (void*)(INT_PTR)i ); } +inline void* UIntToPtr(const unsigned int ui) + { return( (void*)(UINT_PTR)ui ); } +inline void* LongToPtr( const long l ) + { return( (void*)(LONG_PTR)l ); } +inline void* ULongToPtr( const unsigned long ul ) + { return( (void*)(ULONG_PTR)ul ); } +#endif /* 0_ */ + +#else /* !_WIN64 */ +typedef int INT_PTR, *PINT_PTR; +typedef unsigned int UINT_PTR, *PUINT_PTR; +typedef long LONG_PTR, *PLONG_PTR; +typedef unsigned long ULONG_PTR, *PULONG_PTR; +typedef unsigned short UHALF_PTR, *PUHALF_PTR; +typedef short HALF_PTR, *PHALF_PTR; +typedef unsigned long HANDLE_PTR; +#endif /* !_WIN64 */ + +typedef ULONG_PTR SIZE_T, *PSIZE_T; +typedef LONG_PTR SSIZE_T, *PSSIZE_T; +typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR; +typedef __int64 LONG64, *PLONG64; +typedef __int64 INT64, *PINT64; +typedef unsigned __int64 ULONG64, *PULONG64; +typedef unsigned __int64 DWORD64, *PDWORD64; +typedef unsigned __int64 UINT64, *PUINT64; +#ifdef __cplusplus +} +#endif +#endif /* !RC_INVOKED */ + +#endif /* _BASETSD_H */ diff --git a/reactos/w32api/include/basetyps.h b/reactos/w32api/include/basetyps.h new file mode 100644 index 00000000000..d8cb3c72cca --- /dev/null +++ b/reactos/w32api/include/basetyps.h @@ -0,0 +1,166 @@ +#ifndef _BASETYPS_H +#define _BASETYPS_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifndef __OBJC__ +# ifdef __cplusplus +# define EXTERN_C extern "C" +# else +# define EXTERN_C extern +# endif /* __cplusplus */ +# ifndef __int64 +# define __int64 long long +# endif +# ifndef __int32 +# define __int32 long +# endif +# ifndef __int16 +# define __int16 int +# endif +# ifndef __int8 +# define __int8 char +# endif +# ifndef __small +# define __small char +# endif +# ifndef __hyper +# define __hyper long long +# endif +# define STDMETHODCALLTYPE __stdcall +# define STDMETHODVCALLTYPE __cdecl +# define STDAPICALLTYPE __stdcall +# define STDAPIVCALLTYPE __cdecl +# define STDAPI EXTERN_C HRESULT STDAPICALLTYPE +# define STDAPI_(t) EXTERN_C t STDAPICALLTYPE +# define STDMETHODIMP HRESULT STDMETHODCALLTYPE +# define STDMETHODIMP_(t) t STDMETHODCALLTYPE +# define STDAPIV EXTERN_C HRESULT STDAPIVCALLTYPE +# define STDAPIV_(t) EXTERN_C t STDAPIVCALLTYPE +# define STDMETHODIMPV HRESULT STDMETHODVCALLTYPE +# define STDMETHODIMPV_(t) t STDMETHODVCALLTYPE +# define interface struct +# if defined(__cplusplus) && !defined(CINTERFACE) +# define STDMETHOD(m) virtual HRESULT STDMETHODCALLTYPE m +# define STDMETHOD_(t,m) virtual t STDMETHODCALLTYPE m +# define PURE =0 +# define THIS_ +# define THIS void +/* + __attribute__((com_interface)) is obsolete in __GNUC__ >= 3 + g++ vtables are now COM-compatible by default +*/ +# if defined(__GNUC__) && __GNUC__ < 3 && !defined(NOCOMATTRIBUTE) +# define DECLARE_INTERFACE(i) interface __attribute__((com_interface)) i +# define DECLARE_INTERFACE_(i,b) interface __attribute__((com_interface)) i : public b +# else +# define DECLARE_INTERFACE(i) interface i +# define DECLARE_INTERFACE_(i,b) interface i : public b +# endif +# else +# define STDMETHOD(m) HRESULT(STDMETHODCALLTYPE *m) +# define STDMETHOD_(t,m) t(STDMETHODCALLTYPE *m) +# define PURE +# define THIS_ INTERFACE *, +# define THIS INTERFACE * +# ifndef CONST_VTABLE +# define CONST_VTABLE +# endif +# define DECLARE_INTERFACE(i) \ + typedef interface i { CONST_VTABLE struct i##Vtbl *lpVtbl; } i; \ + typedef CONST_VTABLE struct i##Vtbl i##Vtbl; \ + CONST_VTABLE struct i##Vtbl +# define DECLARE_INTERFACE_(i,b) DECLARE_INTERFACE(i) +# endif +# define BEGIN_INTERFACE +# define END_INTERFACE + +# define FWD_DECL(i) typedef interface i i +# if defined(__cplusplus) && !defined(CINTERFACE) +# define IENUM_THIS(T) +# define IENUM_THIS_(T) +# else +# define IENUM_THIS(T) T* +# define IENUM_THIS_(T) T*, +# endif +# define DECLARE_ENUMERATOR_(I,T) \ + DECLARE_INTERFACE_(I,IUnknown) \ + { \ + STDMETHOD(QueryInterface)(IENUM_THIS_(I) REFIID,PVOID*) PURE; \ + STDMETHOD_(ULONG,AddRef)(IENUM_THIS(I)) PURE; \ + STDMETHOD_(ULONG,Release)(IENUM_THIS(I)) PURE; \ + STDMETHOD(Next)(IENUM_THIS_(I) ULONG,T*,ULONG*) PURE; \ + STDMETHOD(Skip)(IENUM_THIS_(I) ULONG) PURE; \ + STDMETHOD(Reset)(IENUM_THIS(I)) PURE; \ + STDMETHOD(Clone)(IENUM_THIS_(I) I**) PURE; \ + } +# define DECLARE_ENUMERATOR(T) DECLARE_ENUMERATOR_(IEnum##T,T) + +#endif /* __OBJC__ */ + +#ifdef _GUID_DEFINED +# warning _GUID_DEFINED is deprecated, use GUID_DEFINED instead +#endif + +#if ! (defined _GUID_DEFINED || defined GUID_DEFINED) /* also defined in winnt.h */ +#define GUID_DEFINED +typedef struct _GUID +{ + unsigned long Data1; + unsigned short Data2; + unsigned short Data3; + unsigned char Data4[8]; +} GUID,*REFGUID,*LPGUID; +#endif /* GUID_DEFINED */ +#ifndef UUID_DEFINED +#define UUID_DEFINED +typedef GUID UUID; +#endif /* UUID_DEFINED */ +typedef GUID IID; +typedef GUID CLSID; +typedef CLSID *LPCLSID; +typedef IID *LPIID; +typedef IID *REFIID; +typedef CLSID *REFCLSID; +typedef GUID FMTID; +typedef FMTID *REFFMTID; +typedef unsigned long error_status_t; +#define uuid_t UUID +typedef unsigned long PROPID; + +#ifndef _REFGUID_DEFINED +#if defined (__cplusplus) && !defined (CINTERFACE) +#define REFGUID const GUID& +#define REFIID const IID& +#define REFCLSID const CLSID& +#else +#define REFGUID const GUID* const +#define REFIID const IID* const +#define REFCLSID const CLSID* const +#endif +#define _REFGUID_DEFINED +#define _REFIID_DEFINED +#define _REFCLSID_DEFINED +#endif +#ifndef GUID_SECTION +#define GUID_SECTION ".text" +#endif +#ifdef __GNUC__ +#define GUID_SECT __attribute__ ((section (GUID_SECTION))) +#else +#define GUID_SECT +#endif +#if !defined(INITGUID) || (defined(INITGUID) && defined(__cplusplus)) +#define GUID_EXT EXTERN_C +#else +#define GUID_EXT +#endif +#ifdef INITGUID +#define DEFINE_GUID(n,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) GUID_EXT const GUID n GUID_SECT = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}} +#define DEFINE_OLEGUID(n,l,w1,w2) DEFINE_GUID(n,l,w1,w2,0xC0,0,0,0,0,0,0,0x46) +#else +#define DEFINE_GUID(n,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) GUID_EXT const GUID n +#define DEFINE_OLEGUID(n,l,w1,w2) DEFINE_GUID(n,l,w1,w2,0xC0,0,0,0,0,0,0,0x46) +#endif +#endif diff --git a/reactos/w32api/include/cderr.h b/reactos/w32api/include/cderr.h new file mode 100644 index 00000000000..e9a5b057027 --- /dev/null +++ b/reactos/w32api/include/cderr.h @@ -0,0 +1,44 @@ +#ifndef _CDERR_H +#define _CDERR_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#define CDERR_DIALOGFAILURE 0xFFFF +#define CDERR_GENERALCODES 0x0000 +#define CDERR_STRUCTSIZE 0x0001 +#define CDERR_INITIALIZATION 0x0002 +#define CDERR_NOTEMPLATE 0x0003 +#define CDERR_NOHINSTANCE 0x0004 +#define CDERR_LOADSTRFAILURE 0x0005 +#define CDERR_FINDRESFAILURE 0x0006 +#define CDERR_LOADRESFAILURE 0x0007 +#define CDERR_LOCKRESFAILURE 0x0008 +#define CDERR_MEMALLOCFAILURE 0x0009 +#define CDERR_MEMLOCKFAILURE 0x000A +#define CDERR_NOHOOK 0x000B +#define CDERR_REGISTERMSGFAIL 0x000C +#define PDERR_PRINTERCODES 0x1000 +#define PDERR_SETUPFAILURE 0x1001 +#define PDERR_PARSEFAILURE 0x1002 +#define PDERR_RETDEFFAILURE 0x1003 +#define PDERR_LOADDRVFAILURE 0x1004 +#define PDERR_GETDEVMODEFAIL 0x1005 +#define PDERR_INITFAILURE 0x1006 +#define PDERR_NODEVICES 0x1007 +#define PDERR_NODEFAULTPRN 0x1008 +#define PDERR_DNDMMISMATCH 0x1009 +#define PDERR_CREATEICFAILURE 0x100A +#define PDERR_PRINTERNOTFOUND 0x100B +#define PDERR_DEFAULTDIFFERENT 0x100C +#define CFERR_CHOOSEFONTCODES 0x2000 +#define CFERR_NOFONTS 0x2001 +#define CFERR_MAXLESSTHANMIN 0x2002 +#define FNERR_FILENAMECODES 0x3000 +#define FNERR_SUBCLASSFAILURE 0x3001 +#define FNERR_INVALIDFILENAME 0x3002 +#define FNERR_BUFFERTOOSMALL 0x3003 +#define FRERR_FINDREPLACECODES 0x4000 +#define FRERR_BUFFERLENGTHZERO 0x4001 +#define CCERR_CHOOSECOLORCODES 0x5000 +#endif diff --git a/reactos/w32api/include/cguid.h b/reactos/w32api/include/cguid.h new file mode 100644 index 00000000000..ca64c5e6630 --- /dev/null +++ b/reactos/w32api/include/cguid.h @@ -0,0 +1,83 @@ +#ifndef _CGUID_H +#define _CGUID_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +extern const IID GUID_NULL; +extern const IID IID_IRpcChannel; +extern const IID IID_IRpcStub; +extern const IID IID_IStubManager; +extern const IID IID_IRpcProxy; +extern const IID IID_IProxyManager; +extern const IID IID_IPSFactory; +extern const IID IID_IInternalMoniker; +extern const IID IID_IDfReserved1; +extern const IID IID_IDfReserved2; +extern const IID IID_IDfReserved3; +extern const CLSID CLSID_StdMarshal; +extern const IID IID_IStub; +extern const IID IID_IProxy; +extern const IID IID_IEnumGeneric; +extern const IID IID_IEnumHolder; +extern const IID IID_IEnumCallback; +extern const IID IID_IOleManager; +extern const IID IID_IOlePresObj; +extern const IID IID_IDebug; +extern const IID IID_IDebugStream; +extern const CLSID CLSID_PSGenObject; +extern const CLSID CLSID_PSClientSite; +extern const CLSID CLSID_PSClassObject; +extern const CLSID CLSID_PSInPlaceActive; +extern const CLSID CLSID_PSInPlaceFrame; +extern const CLSID CLSID_PSDragDrop; +extern const CLSID CLSID_PSBindCtx; +extern const CLSID CLSID_PSEnumerators; +extern const CLSID CLSID_StaticMetafile; +extern const CLSID CLSID_StaticDib; +extern const CLSID CID_CDfsVolume; +extern const CLSID CLSID_CCDFormKrnl; +extern const CLSID CLSID_CCDPropertyPage; +extern const CLSID CLSID_CCDFormDialog; +extern const CLSID CLSID_CCDCommandButton; +extern const CLSID CLSID_CCDComboBox; +extern const CLSID CLSID_CCDTextBox; +extern const CLSID CLSID_CCDCheckBox; +extern const CLSID CLSID_CCDLabel; +extern const CLSID CLSID_CCDOptionButton; +extern const CLSID CLSID_CCDListBox; +extern const CLSID CLSID_CCDScrollBar; +extern const CLSID CLSID_CCDGroupBox; +extern const CLSID CLSID_CCDGeneralPropertyPage; +extern const CLSID CLSID_CCDGenericPropertyPage; +extern const CLSID CLSID_CCDFontPropertyPage; +extern const CLSID CLSID_CCDColorPropertyPage; +extern const CLSID CLSID_CCDLabelPropertyPage; +extern const CLSID CLSID_CCDCheckBoxPropertyPage; +extern const CLSID CLSID_CCDTextBoxPropertyPage; +extern const CLSID CLSID_CCDOptionButtonPropertyPage; +extern const CLSID CLSID_CCDListBoxPropertyPage; +extern const CLSID CLSID_CCDCommandButtonPropertyPage; +extern const CLSID CLSID_CCDComboBoxPropertyPage; +extern const CLSID CLSID_CCDScrollBarPropertyPage; +extern const CLSID CLSID_CCDGroupBoxPropertyPage; +extern const CLSID CLSID_CCDXObjectPropertyPage; +extern const CLSID CLSID_CStdPropertyFrame; +extern const CLSID CLSID_CFormPropertyPage; +extern const CLSID CLSID_CGridPropertyPage; +extern const CLSID CLSID_CWSJArticlePage; +extern const CLSID CLSID_CSystemPage; +extern const CLSID CLSID_IdentityUnmarshal; +extern const CLSID CLSID_InProcFreeMarshaler; +extern const CLSID CLSID_Picture_Metafile; +extern const CLSID CLSID_Picture_EnhMetafile; +extern const CLSID CLSID_Picture_Dib; +extern const CLSID CLSID_StdGlobalInterfaceTable; +extern const GUID GUID_TRISTATE; +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/comcat.h b/reactos/w32api/include/comcat.h new file mode 100644 index 00000000000..e264ac999d0 --- /dev/null +++ b/reactos/w32api/include/comcat.h @@ -0,0 +1,177 @@ +#ifndef _COMCAT_H +#define _COMCAT_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifndef COM_NO_WINDOWS_H +#include <windows.h> +#include <ole2.h> +#endif + +#ifndef _RC_INVOKED + +#ifdef __cplusplus +extern "C"{ +#endif + +EXTERN_C const IID IID_IEnumGUID; +typedef interface IEnumGUID *LPENUMGUID; + +#undef INTERFACE +#define INTERFACE IEnumGUID +DECLARE_INTERFACE_(IEnumGUID,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Next)(THIS_ ULONG,GUID*,ULONG*) PURE; + STDMETHOD(Skip)(THIS_ ULONG) PURE; + STDMETHOD(Reset)(THIS) PURE; + STDMETHOD(Clone)(THIS_ LPENUMGUID*) PURE; +}; +#undef INTERFACE +#if (!defined (__cplusplus) || defined (CINTERFACE)) \ + && defined (COBJMACROS) +#define IEnumGUID_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IEnumGUID_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IEnumGUID_Release(p) (p)->lpVtbl->Release(p) +#define IEnumGUID_Next(p,a,b,c) (p)->lpVtbl->Next(p,a,b,c) +#define IEnumGUID_Skip(p,a) (p)->lpVtbl->Skip(p,a) +#define IEnumGUID_Reset(p) (p)->lpVtbl->Reset(p) +#define IEnumGUID_Clone(p,a) (p)->lpVtbl->Clone(p,a) +#endif + +typedef GUID CATID; +typedef REFGUID REFCATID; +#define CATID_NULL GUID_NULL +#define IsEqualCATID(a, b) IsEqualGUID(a, b) + +typedef struct tagCATEGORYINFO { + CATID catid; /* category identifier for component */ + LCID lcid; /* locale identifier */ + OLECHAR szDescription[128]; /* description of the category */ +} CATEGORYINFO, *LPCATEGORYINFO; + +EXTERN_C const CATID CATID_Insertable; +EXTERN_C const CATID CATID_Control; +EXTERN_C const CATID CATID_Programmable; +EXTERN_C const CATID CATID_IsShortcut; +EXTERN_C const CATID CATID_NeverShowExt; +EXTERN_C const CATID CATID_DocObject; +EXTERN_C const CATID CATID_Printable; +EXTERN_C const CATID CATID_RequiresDataPathHost; +EXTERN_C const CATID CATID_PersistsToMoniker; +EXTERN_C const CATID CATID_PersistsToStorage; +EXTERN_C const CATID CATID_PersistsToStreamInit; +EXTERN_C const CATID CATID_PersistsToStream; +EXTERN_C const CATID CATID_PersistsToMemory; +EXTERN_C const CATID CATID_PersistsToFile; +EXTERN_C const CATID CATID_PersistsToPropertyBag; +EXTERN_C const CATID CATID_InternetAware; +EXTERN_C const CATID CATID_DesignTimeUIActivatableControl; + +#define IEnumCATID IEnumGUID +#define LPENUMCATID LPENUMGUID +#define IID_IEnumCATID IID_IEnumGUID + +#define IEnumCLSID IEnumGUID +#define LPENUMCLSID LPENUMGUID +#define IID_IEnumCLSID IID_IEnumGUID + +EXTERN_C const IID IID_ICatInformation; +typedef interface ICatInformation *LPCATINFORMATION; + +EXTERN_C const IID IID_ICatRegister; +typedef interface ICatRegister *LPCATREGISTER; + +EXTERN_C const IID IID_IEnumCATEGORYINFO; +typedef interface IEnumCATEGORYINFO *LPENUMCATEGORYINFO; + +EXTERN_C const CLSID CLSID_StdComponentCategoriesMgr; + +#define INTERFACE ICatInformation +DECLARE_INTERFACE_(ICatInformation,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(EnumCategories)(THIS_ LCID,LPENUMCATEGORYINFO*) PURE; + STDMETHOD(GetCategoryDesc)(THIS_ REFCATID,LCID,PWCHAR*) PURE; + STDMETHOD(EnumClassesOfCategories)(THIS_ ULONG,CATID*,ULONG,CATID*,LPENUMCLSID*) PURE; + STDMETHOD(IsClassOfCategories)(THIS_ REFCLSID,ULONG,CATID*,ULONG,CATID*) PURE; + STDMETHOD(EnumImplCategoriesOfClass)(THIS_ REFCLSID,LPENUMCATID*) PURE; + STDMETHOD(EnumReqCategoriesOfClass)(THIS_ REFCLSID,LPENUMCATID*) PURE; +}; +#undef INTERFACE +#if (!defined (__cplusplus) || defined (CINTERFACE)) \ + && defined (COBJMACROS) +#define ICatInformation_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define ICatInformation_AddRef(p) (p)->lpVtbl->AddRef(p) +#define ICatInformation_Release(p) (p)->lpVtbl->Release(p) +#define ICatInformation_EnumCategories(p,a,b) (p)->lpVtbl->EnumCategories(p,a,b) +#define ICatInformation_GetCategoryDesc(p,a,b,c) (p)->lpVtbl->GetCategoryDesc(p,a,b,c) +#define ICatInformation_EnumClassesOfCategories(p,a,b,c,d,e) (p)->lpVtbl->EnumClassesOfCategories(p,a,b,c,d,e) +#define ICatInformation_IsClassOfCategories(p,a,b,c,d,e) (p)->lpVtbl->IsClassOfCategories(p,a,b,c,d,e) +#define ICatInformation_EnumImplCategoriesOfClass(p,a,b) (p)->lpVtbl->EnumImplCategoriesOfClass(p,a,b) +#define ICatInformation_EnumReqCategoriesOfClass(p,a,b) (p)->lpVtbl->EnumReqCategoriesOfClass(p,a,b) +#endif + +#define INTERFACE ICatRegister +DECLARE_INTERFACE_(ICatRegister,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(RegisterCategories)(THIS_ ULONG,CATEGORYINFO*) PURE; + STDMETHOD(UnRegisterCategories)(THIS_ ULONG,CATID*) PURE; + STDMETHOD(RegisterClassImplCategories)(THIS_ REFCLSID,ULONG,CATID*) PURE; + STDMETHOD(UnRegisterClassImplCategories)(THIS_ REFCLSID,ULONG,CATID*) PURE; + STDMETHOD(RegisterClassReqCategories)(THIS_ REFCLSID,ULONG,CATID*) PURE; + STDMETHOD(UnRegisterClassReqCategories)(THIS_ REFCLSID,ULONG,CATID*) PURE; +}; +#undef INTERFACE +#if (!defined (__cplusplus) || defined (CINTERFACE)) \ + && defined (COBJMACROS) +#define ICatRegister_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define ICatRegister_AddRef(p) (p)->lpVtbl->AddRef(p) +#define ICatRegister_Release(p) (p)->lpVtbl->Release(p) +#define ICatRegister_RegisterCategories(p,a,b) (p)->lpVtbl->RegisterCategories(p,a,b) +#define ICatRegister_UnRegisterCategories(p,a,b) (p)->lpVtbl->UnRegisterCategories(p,a,b) +#define ICatRegister_RegisterClassImplCategories(p,a,b,c) (p)->lpVtbl->RegisterClassImplCategories(p,a,b,c) +#define ICatRegister_UnRegisterClassImplCategories(p,a,b,c) (p)->lpVtbl->UnRegisterClassImplCategories(p,a,b,c) +#define ICatRegister_RegisterClassReqCategories(p,a,b,c) (p)->lpVtbl->RegisterClassReqCategories(p,a,b,c) +#define ICatRegister_UnRegisterClassReqCategories(p,a,b,c) (p)->lpVtbl->UnRegisterClassReqCategories(p,a,b,c) +#endif + +EXTERN_C const IID IID_IEnumCATEGORYINFO; +#undef INTERFACE +#define INTERFACE IEnumCATEGORYINFO +DECLARE_INTERFACE_(IEnumCATEGORYINFO,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Next)(THIS_ ULONG,CATEGORYINFO*,ULONG*) PURE; + STDMETHOD(Skip)(THIS_ ULONG) PURE; + STDMETHOD(Reset)(THIS) PURE; + STDMETHOD(Clone)(THIS_ LPENUMCATEGORYINFO*) PURE; +}; +#undef INTERFACE +#if (!defined (__cplusplus) || defined (CINTERFACE)) \ + && defined (COBJMACROS) +#define IEnumCATEGORYINFO_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IEnumCATEGORYINFO_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IEnumCATEGORYINFO_Release(p) (p)->lpVtbl->Release(p) +#define IEnumCATEGORYINFO_Next(p,a,b,c) (p)->lpVtbl->Next(p,a,b,c) +#define IEnumCATEGORYINFO_Skip(p,a) (p)->lpVtbl->Skip(p,a) +#define IEnumCATEGORYINFO_Reset(p) (p)->lpVtbl->Reset(p) +#define IEnumCATEGORYINFO_Clone(p,a) (p)->lpVtbl->Clone(p,a) +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _RC_INVOKED */ +#endif diff --git a/reactos/w32api/include/commctrl.h b/reactos/w32api/include/commctrl.h new file mode 100644 index 00000000000..3c15dffa5d8 --- /dev/null +++ b/reactos/w32api/include/commctrl.h @@ -0,0 +1,3513 @@ +#ifndef _COMMCTRL_H +#define _COMMCTRL_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#include <prsht.h> +#ifdef __cplusplus +extern "C" { +#endif +#ifndef _WIN32_IE +/* define _WIN32_IE if you really want it */ +#if 0 +#define _WIN32_IE 0x0300 +#endif +#endif + +#ifndef SNDMSG +#ifdef __cplusplus +#define SNDMSG ::SendMessage +#else +#define SNDMSG SendMessage +#endif +#endif /* ifndef SNDMSG */ + +#define DRAGLISTMSGSTRING TEXT("commctrl_DragListMsg") +#define HOTKEY_CLASSA "msctls_hotkey32" +#define HOTKEY_CLASSW L"msctls_hotkey32" +#define PROGRESS_CLASSA "msctls_progress32" +#define PROGRESS_CLASSW L"msctls_progress32" +#define STATUSCLASSNAMEA "msctls_statusbar32" +#define STATUSCLASSNAMEW L"msctls_statusbar32" +#define TOOLBARCLASSNAMEA "ToolbarWindow32" +#define TOOLBARCLASSNAMEW L"ToolbarWindow32" +#define TOOLTIPS_CLASSA "tooltips_class32" +#define TOOLTIPS_CLASSW L"tooltips_class32" +#define TRACKBAR_CLASSA "msctls_trackbar32" +#define TRACKBAR_CLASSW L"msctls_trackbar32" +#define UPDOWN_CLASSA "msctls_updown32" +#define UPDOWN_CLASSW L"msctls_updown32" +#define ANIMATE_CLASSA "SysAnimate32" +#define ANIMATE_CLASSW L"SysAnimate32" +#define DATETIMEPICK_CLASSW L"SysDateTimePick32" +#define DATETIMEPICK_CLASSA "SysDateTimePick32" +#define MONTHCAL_CLASSW L"SysMonthCal32" +#define MONTHCAL_CLASSA "SysMonthCal32" +#define REBARCLASSNAMEW L"ReBarWindow32" +#define REBARCLASSNAMEA "ReBarWindow32" +#define WC_COMBOBOXEXW L"ComboBoxEx32" +#define WC_COMBOBOXEXA "ComboBoxEx32" +#define WC_IPADDRESSW L"SysIPAddress32" +#define WC_IPADDRESSA "SysIPAddress32" +#define WC_LISTVIEWA "SysListView32" +#define WC_LISTVIEWW L"SysListView32" +#define WC_TABCONTROLA "SysTabControl32" +#define WC_TABCONTROLW L"SysTabControl32" +#define WC_TREEVIEWA ("SysTreeView32") +#define WC_TREEVIEWW L"SysTreeView32" +#define WC_HEADERA "SysHeader32" +#define WC_HEADERW L"SysHeader32" +#define WC_PAGESCROLLERW L"SysPager" +#define WC_PAGESCROLLERA "SysPager" +#define WC_NATIVEFONTCTLW L"NativeFontCtl" +#define WC_NATIVEFONTCTLA "NativeFontCtl" +#define WC_BUTTONA "Button" +#define WC_BUTTONW L"Button" +#define WC_STATICA "Static" +#define WC_STATICW L"Static" +#define WC_EDITA "Edit" +#define WC_EDITW L"Edit" +#define WC_LISTBOXA "ListBox" +#define WC_LISTBOXW L"ListBox" +#define WC_COMBOBOXA "ComboBox" +#define WC_COMBOBOXW L"ComboBox" +#define WC_SCROLLBARA "ScrollBar" +#define WC_SCROLLBARW L"ScrollBar" + +#ifdef UNICODE +#define HOTKEY_CLASS HOTKEY_CLASSW +#define PROGRESS_CLASS PROGRESS_CLASSW +#define STATUSCLASSNAME STATUSCLASSNAMEW +#define TOOLBARCLASSNAME TOOLBARCLASSNAMEW +#define TOOLTIPS_CLASS TOOLTIPS_CLASSW +#define TRACKBAR_CLASS TRACKBAR_CLASSW +#define UPDOWN_CLASS UPDOWN_CLASSW +#define ANIMATE_CLASS ANIMATE_CLASSW +#define DATETIMEPICK_CLASS DATETIMEPICK_CLASSW +#define MONTHCAL_CLASS MONTHCAL_CLASSW +#define REBARCLASSNAME REBARCLASSNAMEW +#define WC_COMBOBOXEX WC_COMBOBOXEXW +#define WC_HEADER WC_HEADERW +#define WC_IPADDRESS WC_IPADDRESSW +#define WC_LISTVIEW WC_LISTVIEWW +#define WC_TABCONTROL WC_TABCONTROLW +#define WC_TREEVIEW WC_TREEVIEWW +#define WC_PAGESCROLLER WC_PAGESCROLLERW +#define WC_NATIVEFONTCTL WC_NATIVEFONTCTLW +#define WC_BUTTON WC_BUTTONW +#define WC_STATIC WC_STATICW +#define WC_EDIT WC_EDITW +#define WC_LISTBOX WC_LISTBOXW +#define WC_COMBOBOX WC_COMBOBOXW +#define WC_SCROLLBAR WC_SCROLLBARW +#else +#define ANIMATE_CLASS ANIMATE_CLASSA +#define HOTKEY_CLASS HOTKEY_CLASSA +#define PROGRESS_CLASS PROGRESS_CLASSA +#define STATUSCLASSNAME STATUSCLASSNAMEA +#define TOOLBARCLASSNAME TOOLBARCLASSNAMEA +#define TOOLTIPS_CLASS TOOLTIPS_CLASSA +#define TRACKBAR_CLASS TRACKBAR_CLASSA +#define UPDOWN_CLASS UPDOWN_CLASSA +#define DATETIMEPICK_CLASS DATETIMEPICK_CLASSA +#define MONTHCAL_CLASS MONTHCAL_CLASSA +#define REBARCLASSNAME REBARCLASSNAMEA +#define WC_COMBOBOXEX WC_COMBOBOXEXA +#define WC_HEADER WC_HEADERA +#define WC_IPADDRESS WC_IPADDRESSA +#define WC_LISTVIEW WC_LISTVIEWA +#define WC_TABCONTROL WC_TABCONTROLA +#define WC_TREEVIEW WC_TREEVIEWA +#define WC_PAGESCROLLER WC_PAGESCROLLERA +#define WC_NATIVEFONTCTL WC_NATIVEFONTCTLA +#define WC_BUTTON WC_BUTTONA +#define WC_STATIC WC_STATICA +#define WC_EDIT WC_EDITA +#define WC_LISTBOX WC_LISTBOXA +#define WC_COMBOBOX WC_COMBOBOXA +#define WC_SCROLLBAR WC_SCROLLBARA +#endif + +#if (_WIN32_IE >= 0x0500) +#if (_WIN32_WINNT >= 0x0501) +#define COMCTL32_VERSION 6 +#else +#define COMCTL32_VERSION 5 +#endif +#endif + +#define LVM_FIRST 0x1000 +#define TV_FIRST 0x1100 +#define HDM_FIRST 0x1200 +#define ACM_OPENA (WM_USER+100) +#define ACM_PLAY (WM_USER+101) +#define ACM_STOP (WM_USER+102) +#define ACM_OPENW (WM_USER+103) +#define ACN_START 1 +#define ACN_STOP 2 +#define CBEIF_TEXT 0x00000001 +#define CBEIF_IMAGE 0x00000002 +#define CBEIF_SELECTEDIMAGE 0x00000004 +#define CBEIF_OVERLAY 0x00000008 +#define CBEIF_INDENT 0x00000010 +#define CBEIF_LPARAM 0x00000020 +#define CBEIF_DI_SETITEM 0x10000000 +#define CBEN_INSERTITEM (CBEN_FIRST - 1) +#define CBEN_DELETEITEM (CBEN_FIRST - 2) +#define CBEN_BEGINEDIT (CBEN_FIRST - 4) +#define CBEN_ENDEDITA (CBEN_FIRST - 5) +#define CBEN_ENDEDITW (CBEN_FIRST - 6) +#define CBENF_KILLFOCUS 1 +#define CBENF_RETURN 2 +#define CBENF_ESCAPE 3 +#define CBENF_DROPDOWN 4 +#define CBEMAXSTRLEN 260 +#define DL_BEGINDRAG 1157 +#define DL_CANCELDRAG 1160 +#define DL_DRAGGING 1158 +#define DL_DROPPED 1159 +#define DL_CURSORSET 0 +#define DL_STOPCURSOR 1 +#define DL_COPYCURSOR 2 +#define DL_MOVECURSOR 3 +#define CCS_TOP 1 +#define CCS_NOMOVEY 2 +#define CCS_BOTTOM 3 +#define CCS_NORESIZE 4 +#define CCS_NOPARENTALIGN 8 +#define CCS_ADJUSTABLE 32 +#define CCS_NODIVIDER 64 +#if (_WIN32_IE >= 0x0300) +#define CCS_VERT 128 +#define CCS_LEFT 129 +#define CCS_NOMOVEX 130 +#define CCS_RIGHT 131 +#endif +#define ACS_CENTER 0x0001 +#define ACS_TRANSPARENT 0x0002 +#define ACS_AUTOPLAY 0x0004 +#define ACS_TIMER 0x0008 +#define PGS_VERT 0x00000000 +#define PGS_HORZ 0x00000001 +#define PGS_AUTOSCROLL 0x00000002 +#define PGS_DRAGNDROP 0x00000004 +#define CMB_MASKED 2 +#define MINSYSCOMMAND SC_SIZE +#define SBT_OWNERDRAW 0x1000 +#define SBT_NOBORDERS 256 +#define SBT_POPOUT 512 +#define SBT_RTLREADING 1024 +#define SB_SETTEXTA (WM_USER+1) +#define SB_SETTEXTW (WM_USER+11) +#define SB_GETTEXTA (WM_USER+2) +#define SB_GETTEXTW (WM_USER+13) +#define SB_GETTEXTLENGTHA (WM_USER+3) +#define SB_GETTEXTLENGTHW (WM_USER+12) +#define SB_SETPARTS (WM_USER+4) +#define SB_GETPARTS (WM_USER+6) +#define SB_GETBORDERS (WM_USER+7) +#define SB_SETMINHEIGHT (WM_USER+8) +#define SB_SIMPLE (WM_USER+9) +#define SB_GETRECT (WM_USER+10) +#define MSGF_COMMCTRL_BEGINDRAG 0x4200 +#define MSGF_COMMCTRL_SIZEHEADER 0x4201 +#define MSGF_COMMCTRL_DRAGSELECT 0x4202 +#define MSGF_COMMCTRL_TOOLBARCUST 0x4203 +#define ILC_COLOR 0 +#define ILC_COLOR4 4 +#define ILC_COLOR8 8 +#define ILC_COLOR16 16 +#define ILC_COLOR24 24 +#define ILC_COLOR32 32 +#define ILC_COLORDDB 254 +#define ILC_MASK 1 +#define ILC_PALETTE 2048 +#define ILCF_MOVE 0 +#define ILCF_SWAP 1 +#define ILS_NORMAL 0 +#define ILS_GLOW 1 +#define ILS_SHADOW 2 +#define ILS_SATURATE 4 +#define ILS_ALPHA 8 +#define ILD_BLEND25 2 +#define ILD_BLEND50 4 +#define ILD_SELECTED 4 +#define ILD_BLEND 4 +#define ILD_FOCUS 2 +#define ILD_MASK 16 +#define ILD_NORMAL 0 +#define ILD_TRANSPARENT 1 +#define ILD_IMAGE 0x0020 +#define ILD_ROP 0x0040 +#define ILD_OVERLAYMASK 0x0F00 +#define ILD_PRESERVEALPHA 0x1000 +#define ILD_SCALE 0x2000 +#define ILD_DPISCALE 0x4000 +#define HDS_HORZ 0 +#define HDS_BUTTONS 2 +#define HDS_HIDDEN 8 +#if (_WIN32_IE > 0x0300) +#define HDS_HOTTRACK 4 +#define HDS_DRAGDROP 0x0040 +#define HDS_FULLDRAG 0x0080 +#endif /* _WIN32_IE > 0x0300 */ +#if (_WIN32_IE >= 0x0500) +#define HDS_FILTERBAR 0x0100 +#endif /* _WIN32_IE >= 0x0500 */ +#define NM_FIRST 0 +#define NM_LAST ((UINT)-99) +#define LVN_FIRST ((UINT)-100) +#define LVN_LAST ((UINT)-199) +#define HDN_FIRST ((UINT)-300) +#define HDN_LAST ((UINT)-399) +#define TVN_FIRST ((UINT)-400) +#define TVN_LAST ((UINT)-499) +#define TTN_FIRST ((UINT)-520) +#define TTN_LAST ((UINT)-549) +#define TCN_FIRST ((UINT)-550) +#define TCN_LAST ((UINT)-580) +#ifndef CDN_FIRST +#define CDN_FIRST ((UINT)-601) /* also in commdlg.h */ +#define CDN_LAST ((UINT)-699) +#endif +#define TBN_FIRST ((UINT)-700) +#define TBN_LAST ((UINT)-720) +#define UDN_FIRST ((UINT)-721) +#define UDN_LAST ((UINT)-740) +#if (_WIN32_IE >= 0x0300) +#define RBN_FIRST ((UINT)-831) +#define RBN_LAST ((UINT)-859) +#define MCN_FIRST ((UINT)-750) +#define MCN_LAST ((UINT)-759) +#define DTN_FIRST ((UINT)-760) +#define DTN_LAST ((UINT)-799) +#define CBEN_FIRST ((UINT)-800) +#define CBEN_LAST ((UINT)-830) +#endif /* _WIN32_IE */ +#if (_WIN32_IE >= 0x0400) +#define IPN_FIRST ((UINT)-860) +#define IPN_LAST ((UINT)-879) +#define IPN_FIELDCHANGED (IPN_FIRST-0) +#define SBN_FIRST ((UINT)-880U) +#define SBN_LAST ((UINT)-899U) +#define PGN_FIRST ((UINT)-900U) +#define PGN_LAST ((UINT)-950U) +#define PGN_SCROLL (PGN_FIRST-1) +#define PGN_CALCSIZE (PGN_FIRST-2) +#endif /* _WIN32_IE >= 0x0400 */ +#define HDI_WIDTH 1 +#define HDI_HEIGHT 1 +#define HDI_TEXT 2 +#define HDI_FORMAT 4 +#define HDI_LPARAM 8 +#define HDI_BITMAP 16 +#if (_WIN32_IE >= 0x0300) +#define HDI_IMAGE 32 +#define HDI_DI_SETITEM 64 +#define HDI_ORDER 128 +#endif +#define CBES_EX_NOEDITIMAGE 0x00000001 +#define CBES_EX_NOEDITIMAGEINDENT 0x00000002 +#define CBES_EX_PATHWORDBREAKPROC 0x00000004 +#if (_WIN32_IE >= 0x0400) +#define CBES_EX_NOSIZELIMIT 0x00000008 +#define CBES_EX_CASESENSITIVE 0x00000010 +#define CBEN_GETDISPINFOA (CBEN_FIRST - 0) +#define CBEN_GETDISPINFOW (CBEN_FIRST - 7) +#define CBEN_DRAGBEGINA (CBEN_FIRST - 8) +#define CBEN_DRAGBEGINW (CBEN_FIRST - 9) +#endif /* _WIN32_IE >= 0x0400 */ +#if (_WIN32_IE >= 0x0500) +#define HDI_FILTER 256 +#endif +#define HDF_LEFT 0 +#define HDF_RIGHT 1 +#define HDF_CENTER 2 +#define HDF_JUSTIFYMASK 3 +#define HDF_RTLREADING 4 +#define HDF_OWNERDRAW 0x8000 +#define HDF_STRING 0x4000 +#define HDF_BITMAP 0x2000 +#if (_WIN32_IE >= 0x0300) +#define HDF_BITMAP_ON_RIGHT 0x1000 +#define HDF_IMAGE 0x0800 +#endif +#define HDM_GETITEMCOUNT HDM_FIRST +#define HDM_INSERTITEMA (HDM_FIRST+1) +#define HDM_INSERTITEMW (HDM_FIRST+10) +#define HDM_DELETEITEM (HDM_FIRST+2) +#define HDM_GETITEMA (HDM_FIRST+3) +#define HDM_GETITEMW (HDM_FIRST+11) +#define HDM_SETITEMA (HDM_FIRST+4) +#define HDM_SETITEMW (HDM_FIRST+12) +#define HDM_LAYOUT (HDM_FIRST+5) +#if (_WIN32_IE >= 0x0300) +#define HDM_GETITEMRECT (HDM_FIRST+7) +#define HDM_SETIMAGELIST (HDM_FIRST+8) +#define HDM_GETIMAGELIST (HDM_FIRST+9) +#define HDM_ORDERTOINDEX (HDM_FIRST+15) +#define HDM_CREATEDRAGIMAGE (HDM_FIRST+16) +#define HDM_GETORDERARRAY (HDM_FIRST+17) +#define HDM_SETORDERARRAY (HDM_FIRST+18) +#define HDM_SETHOTDIVIDER (HDM_FIRST+19) +#endif +#if (_WIN32_IE >= 0x0400) +#define HDM_GETUNICODEFORMAT CCM_GETUNICODEFORMAT +#define HDM_SETUNICODEFORMAT CCM_SETUNICODEFORMAT +#endif +#define HHT_NOWHERE 1 +#define HHT_ONHEADER 2 +#define HHT_ONDIVIDER 4 +#define HHT_ONDIVOPEN 8 +#define HHT_ABOVE 256 +#define HHT_BELOW 512 +#define HHT_TORIGHT 1024 +#define HHT_TOLEFT 2048 +#define HDM_HITTEST (HDM_FIRST+6) +#define HDN_ITEMCHANGINGA (HDN_FIRST-0) +#define HDN_ITEMCHANGINGW (HDN_FIRST-20) +#define HDN_ITEMCHANGEDA (HDN_FIRST-1) +#define HDN_ITEMCHANGEDW (HDN_FIRST-21) +#define HDN_ITEMCLICKA (HDN_FIRST-2) +#define HDN_ITEMCLICKW (HDN_FIRST-22) +#define HDN_ITEMDBLCLICKA (HDN_FIRST-3) +#define HDN_ITEMDBLCLICKW (HDN_FIRST-23) +#define HDN_DIVIDERDBLCLICKA (HDN_FIRST-5) +#define HDN_DIVIDERDBLCLICKW (HDN_FIRST-25) +#define HDN_BEGINTRACKA (HDN_FIRST-6) +#define HDN_BEGINTRACKW (HDN_FIRST-26) +#define HDN_ENDTRACKA (HDN_FIRST-7) +#define HDN_ENDTRACKW (HDN_FIRST-27) +#define HDN_TRACKA (HDN_FIRST-8) +#define HDN_TRACKW (HDN_FIRST-28) +#if _WIN32_IE >= 0x0300 +#define HDN_ENDDRAG (HDN_FIRST-11) +#define HDN_BEGINDRAG (HDN_FIRST-10) +#define HDN_GETDISPINFOA (HDN_FIRST-9) +#define HDN_GETDISPINFOW (HDN_FIRST-29) +#endif +#if (_WIN32_IE >= 0x0400) +#define HICF_OTHER 0x00 +#define HICF_MOUSE 0x01 +#define HICF_ARROWKEYS 0x02 +#define HICF_ACCELERATOR 0x04 +#define HICF_DUPACCEL 0x08 +#define HICF_ENTERING 0x10 +#define HICF_LEAVING 0x20 +#define HICF_RESELECT 0x40 +#define HICF_LMOUSE 0x80 +#define HICF_TOGGLEDROPDOWN 0x100 +#endif /* _WIN32_IE >= 0x0400 */ +#define IPM_CLEARADDRESS (WM_USER+100) +#define IPM_SETADDRESS (WM_USER+101) +#define IPM_GETADDRESS (WM_USER+102) +#define IPM_SETRANGE (WM_USER+103) +#define IPM_SETFOCUS (WM_USER+104) +#define IPM_ISBLANK (WM_USER+105) +#if (_WIN32_IE >= 0x0500) +#define I_INDENTCALLBACK (-1) +#define I_IMAGENONE (-2) +#endif +#define CMB_MASKED 2 +#define TBSTATE_CHECKED 1 +#define TBSTATE_PRESSED 2 +#define TBSTATE_ENABLED 4 +#define TBSTATE_HIDDEN 8 +#define TBSTATE_INDETERMINATE 16 +#define TBSTATE_WRAP 32 +#if (_WIN32_IE >= 0x0400) +#define TBSTATE_MARKED 0x0080 +#endif +#define TBSTYLE_BUTTON 0 +#define TBSTYLE_SEP 1 +#define TBSTYLE_CHECK 2 +#define TBSTYLE_GROUP 4 +#define TBSTYLE_CHECKGROUP (TBSTYLE_GROUP|TBSTYLE_CHECK) +#if (_WIN32_IE >= 0x0300) +#define TBSTYLE_DROPDOWN 8 +#endif +#if (_WIN32_IE >= 0x0400) +#define TBSTYLE_AUTOSIZE 16 +#define TBSTYLE_NOPREFIX 32 +#endif +#define TBSTYLE_TOOLTIPS 256 +#define TBSTYLE_WRAPABLE 512 +#define TBSTYLE_ALTDRAG 1024 +#if (_WIN32_IE >= 0x0300) +#define TBSTYLE_FLAT 2048 +#define TBSTYLE_LIST 4096 +#define TBSTYLE_CUSTOMERASE 8192 +#endif +#if (_WIN32_IE >= 0x0400) +#define TBSTYLE_REGISTERDROP 0x4000 +#define TBSTYLE_TRANSPARENT 0x8000 +#define TBSTYLE_EX_DRAWDDARROWS 0x00000001 +#endif /* _WIN32_IE >= 0x0400 */ +#if (_WIN32_IE >= 0x0501) +#define TBSTYLE_EX_MIXEDBUTTONS 8 +#define TBSTYLE_EX_HIDECLIPPEDBUTTONS 16 +#endif /* _WIN32_IE >= 0x0501 */ +#if (_WIN32_WINNT >= 0x0501) +#define TBSTYLE_EX_DOUBLEBUFFER 0x80 +#endif /* _WIN32_WINNT >= 0x0501 */ +#if (_WIN32_IE >= 0x0500) +#define BTNS_BUTTON TBSTYLE_BUTTON +#define BTNS_SEP TBSTYLE_SEP +#define BTNS_CHECK TBSTYLE_CHECK +#define BTNS_GROUP TBSTYLE_GROUP +#define BTNS_CHECKGROUP TBSTYLE_CHECKGROUP +#define BTNS_DROPDOWN TBSTYLE_DROPDOWN +#define BTNS_AUTOSIZE TBSTYLE_AUTOSIZE +#define BTNS_NOPREFIX TBSTYLE_NOPREFIX +#define BTNS_WHOLEDROPDOWN 0x0080 +#endif /* _WIN32_IE >= 0x0500 */ +#if _WIN32_IE >= 0x0501 +#define BTNS_SHOWTEXT 0x0040 +#endif +#if (_WIN32_IE >= 0x0400) +#define TBCDRF_NOEDGES 0x10000 +#define TBCDRF_HILITEHOTTRACK 0x20000 +#define TBCDRF_NOOFFSET 0x40000 +#define TBCDRF_NOMARK 0x80000 +#define TBCDRF_NOETCHEDEFFECT 0x100000 +#endif /* _WIN32_IE >= 0x0400 */ +#define HINST_COMMCTRL ((HINSTANCE)-1) +#define IDB_STD_SMALL_COLOR 0 +#define IDB_STD_LARGE_COLOR 1 +#define IDB_VIEW_SMALL_COLOR 4 +#define IDB_VIEW_LARGE_COLOR 5 +#if (_WIN32_IE >= 0x0300) +#define IDB_HIST_SMALL_COLOR 8 +#define IDB_HIST_LARGE_COLOR 9 +#endif +#define STD_CUT 0 +#define STD_COPY 1 +#define STD_PASTE 2 +#define STD_UNDO 3 +#define STD_REDOW 4 +#define STD_DELETE 5 +#define STD_FILENEW 6 +#define STD_FILEOPEN 7 +#define STD_FILESAVE 8 +#define STD_PRINTPRE 9 +#define STD_PROPERTIES 10 +#define STD_HELP 11 +#define STD_FIND 12 +#define STD_REPLACE 13 +#define STD_PRINT 14 +#define VIEW_LARGEICONS 0 +#define VIEW_SMALLICONS 1 +#define VIEW_LIST 2 +#define VIEW_DETAILS 3 +#define VIEW_SORTNAME 4 +#define VIEW_SORTSIZE 5 +#define VIEW_SORTDATE 6 +#define VIEW_SORTTYPE 7 +#define VIEW_PARENTFOLDER 8 +#define VIEW_NETCONNECT 9 +#define VIEW_NETDISCONNECT 10 +#define VIEW_NEWFOLDER 11 +#define TB_ENABLEBUTTON (WM_USER+1) +#define TB_CHECKBUTTON (WM_USER+2) +#define TB_PRESSBUTTON (WM_USER+3) +#define TB_HIDEBUTTON (WM_USER+4) +#define TB_INDETERMINATE (WM_USER+5) +#define TB_ISBUTTONENABLED (WM_USER+9) +#define TB_ISBUTTONCHECKED (WM_USER+10) +#define TB_ISBUTTONPRESSED (WM_USER+11) +#define TB_ISBUTTONHIDDEN (WM_USER+12) +#define TB_ISBUTTONINDETERMINATE (WM_USER+13) +#if (_WIN32_IE >= 0x0400) +#define TB_ISBUTTONHIGHLIGHTED (WM_USER+14) +#endif +#define TB_SETSTATE (WM_USER+17) +#define TB_GETSTATE (WM_USER+18) +#define TB_ADDBITMAP (WM_USER+19) +#if (_WIN32_IE >= 0x0400) +#define TB_ADDBUTTONSA (WM_USER+20) +#define TB_INSERTBUTTONA (WM_USER+21) +#else +#define TB_ADDBUTTONS (WM_USER+20) +#define TB_INSERTBUTTON (WM_USER+21) +#endif +#define TB_DELETEBUTTON (WM_USER+22) +#define TB_GETBUTTON (WM_USER+23) +#define TB_BUTTONCOUNT (WM_USER+24) +#define TB_COMMANDTOINDEX (WM_USER+25) +#define TB_SAVERESTOREA (WM_USER+26) +#define TB_SAVERESTOREW (WM_USER+76) +#define TB_CUSTOMIZE (WM_USER+27) +#define TB_ADDSTRINGA (WM_USER+28) +#define TB_ADDSTRINGW (WM_USER+77) +#define TB_GETITEMRECT (WM_USER+29) +#define TB_BUTTONSTRUCTSIZE (WM_USER+30) +#define TB_SETBUTTONSIZE (WM_USER+31) +#define TB_SETBITMAPSIZE (WM_USER+32) +#define TB_AUTOSIZE (WM_USER+33) +#define TB_GETTOOLTIPS (WM_USER+35) +#define TB_SETTOOLTIPS (WM_USER+36) +#define TB_SETPARENT (WM_USER+37) +#define TB_SETROWS (WM_USER+39) +#define TB_GETROWS (WM_USER+40) +#define TB_GETBITMAPFLAGS (WM_USER+41) +#define TB_SETCMDID (WM_USER+42) +#define TB_CHANGEBITMAP (WM_USER+43) +#define TB_GETBITMAP (WM_USER+44) +#define TB_GETBUTTONTEXTA (WM_USER+45) +#define TB_GETBUTTONTEXTW (WM_USER+75) +#define TB_REPLACEBITMAP (WM_USER+46) +#define TB_GETBUTTONSIZE (WM_USER+58) +#define TB_SETBUTTONWIDTH (WM_USER+59) +#if (_WIN32_IE >= 0x0300) +#define TB_SETINDENT (WM_USER+47) +#define TB_SETIMAGELIST (WM_USER+48) +#define TB_GETIMAGELIST (WM_USER+49) +#define TB_LOADIMAGES (WM_USER+50) +#define TB_GETRECT (WM_USER+51) +#define TB_SETHOTIMAGELIST (WM_USER+52) +#define TB_GETHOTIMAGELIST (WM_USER+53) +#define TB_SETDISABLEDIMAGELIST (WM_USER+54) +#define TB_GETDISABLEDIMAGELIST (WM_USER+55) +#define TB_SETSTYLE (WM_USER+56) +#define TB_GETSTYLE (WM_USER+57) +#define TB_GETBUTTONSIZE (WM_USER+58) +#define TB_SETBUTTONWIDTH (WM_USER+59) +#define TB_SETMAXTEXTROWS (WM_USER+60) +#define TB_GETTEXTROWS (WM_USER+61) +#endif +#if _WIN32_IE >= 0x400 +#define TB_GETOBJECT (WM_USER+62) +#define TB_GETBUTTONINFOW (WM_USER+63) +#define TB_SETBUTTONINFOW (WM_USER+64) +#define TB_GETBUTTONINFOA (WM_USER+65) +#define TB_SETBUTTONINFOA (WM_USER+66) +#define TB_INSERTBUTTONW (WM_USER+67) +#define TB_ADDBUTTONSW (WM_USER+68) +#define TB_HITTEST (WM_USER+69) +#define TB_SETEXTENDEDSTYLE (WM_USER+84) +#define TB_GETEXTENDEDSTYLE (WM_USER+85) +#define TB_SETDRAWTEXTFLAGS (WM_USER+70) +#define TB_GETHOTITEM (WM_USER+71) +#define TB_SETHOTITEM (WM_USER+72) +#define TB_SETANCHORHIGHLIGHT (WM_USER+73) +#define TB_GETANCHORHIGHLIGHT (WM_USER+74) +#define TB_MAPACCELERATORA (WM_USER+78) +#define TB_GETINSERTMARK (WM_USER+79) +#define TB_SETINSERTMARK (WM_USER+80) +#define TB_INSERTMARKHITTEST (WM_USER+81) +#define TB_MOVEBUTTON (WM_USER+82) +#define TB_GETMAXSIZE (WM_USER+83) +#define TB_SETEXTENDEDSTYLE (WM_USER+84) +#define TB_GETEXTENDEDSTYLE (WM_USER+85) +#define TB_GETPADDING (WM_USER+86) +#define TB_SETPADDING (WM_USER+87) +#define TB_SETINSERTMARKCOLOR (WM_USER+88) +#define TB_GETINSERTMARKCOLOR (WM_USER+89) +#define TB_MAPACCELERATORW (WM_USER+90) +#define TB_SETCOLORSCHEME CCM_SETCOLORSCHEME +#define TB_GETCOLORSCHEME CCM_GETCOLORSCHEME +#define TB_SETUNICODEFORMAT CCM_SETUNICODEFORMAT +#define TB_GETUNICODEFORMAT CCM_GETUNICODEFORMAT +#endif +#define TBBF_LARGE 1 +#define TBN_GETBUTTONINFOA (TBN_FIRST-0) +#define TBN_BEGINDRAG (TBN_FIRST-1) +#define TBN_ENDDRAG (TBN_FIRST-2) +#define TBN_BEGINADJUST (TBN_FIRST-3) +#define TBN_ENDADJUST (TBN_FIRST-4) +#define TBN_RESET (TBN_FIRST-5) +#define TBN_QUERYINSERT (TBN_FIRST-6) +#define TBN_QUERYDELETE (TBN_FIRST-7) +#define TBN_TOOLBARCHANGE (TBN_FIRST-8) +#define TBN_CUSTHELP (TBN_FIRST-9) +#if (_WIN32_IE >= 0x0300) +#define TBN_DROPDOWN (TBN_FIRST-10) +#endif +#if (_WIN32_IE >= 0x0400) +#define TBN_HOTITEMCHANGE (TBN_FIRST-13) +#define TBN_DRAGOUT (TBN_FIRST-14) +#define TBN_DELETINGBUTTON (TBN_FIRST-15) +#define TBN_GETDISPINFOA (TBN_FIRST-16) +#define TBN_GETDISPINFOW (TBN_FIRST-17) +#define TBN_GETINFOTIPA (TBN_FIRST-18) +#define TBN_GETINFOTIPW (TBN_FIRST-19) +#define TBN_GETBUTTONINFOW (TBN_FIRST-20) +#endif +#if (_WIN32_IE >= 0x0500) +#define TBN_RESTORE (TBN_FIRST-21) +#define TBN_SAVE (TBN_FIRST-22) +#define TBN_INITCUSTOMIZE (TBN_FIRST-23) +#define TBNRF_HIDEHELP 1 +#define TBNRF_ENDCUSTOMIZE 2 +#define TBNF_IMAGE 1 +#define TBNF_TEXT 2 +#define TBNF_DI_SETITEM 0x10000000 +#endif /* _WIN32_IE >= 0x0500 */ +#define TTS_ALWAYSTIP 1 +#define TTS_NOPREFIX 2 +#if( _WIN32_IE >= 0x0500 ) +#define TTS_NOANIMATE 0x10 +#define TTS_NOFADE 0x20 +#define TTS_BALLOON 0x40 +#define TTS_CLOSE 0x80 +#endif /* _WIN32_IE >= 0x0500 */ +#define TTF_IDISHWND 1 +#define TTF_CENTERTIP 2 +#define TTF_RTLREADING 4 +#define TTF_SUBCLASS 16 +#if (_WIN32_IE >= 0x0300) +#define TTF_TRACK 0x0020 +#define TTF_ABSOLUTE 0x0080 +#define TTF_TRANSPARENT 0x0100 +#if (_WIN32_IE >= 0x0501) +#define TTF_PARSELINKS 0x1000 +#endif +#define TTF_DI_SETITEM 0x8000 +#define TBCD_TICS 1 +#define TBCD_THUMB 2 +#define TBCD_CHANNEL 3 +#endif /* _WIN32_IE >= 0x0300 */ +#if (_WIN32_IE >= 0x0400) +#define TBDDRET_DEFAULT 0 +#define TBDDRET_NODEFAULT 1 +#define TBDDRET_TREATPRESSED 2 +#define TBIMHT_AFTER 1 +#define TBIMHT_BACKGROUND 2 +#endif +#define TTDT_AUTOMATIC 0 +#define TTDT_RESHOW 1 +#define TTDT_AUTOPOP 2 +#define TTDT_INITIAL 3 +#define TTM_ACTIVATE (WM_USER+1) +#define TTM_SETDELAYTIME (WM_USER+3) +#define TTM_ADDTOOLA (WM_USER+4) +#define TTM_ADDTOOLW (WM_USER+50) +#define TTM_DELTOOLA (WM_USER+5) +#define TTM_DELTOOLW (WM_USER+51) +#define TTM_NEWTOOLRECTA (WM_USER+6) +#define TTM_NEWTOOLRECTW (WM_USER+52) +#define TTM_RELAYEVENT (WM_USER+7) +#define TTM_GETTOOLINFOA (WM_USER+8) +#define TTM_GETTOOLINFOW (WM_USER+53) +#define TTM_SETTOOLINFOA (WM_USER+9) +#define TTM_SETTOOLINFOW (WM_USER+54) +#define TTM_HITTESTA (WM_USER+10) +#define TTM_HITTESTW (WM_USER+55) +#define TTM_GETTEXTA (WM_USER+11) +#define TTM_GETTEXTW (WM_USER+56) +#define TTM_UPDATETIPTEXTA (WM_USER+12) +#define TTM_UPDATETIPTEXTW (WM_USER+57) +#define TTM_GETTOOLCOUNT (WM_USER+13) +#define TTM_ENUMTOOLSA (WM_USER+14) +#define TTM_ENUMTOOLSW (WM_USER+58) +#define TTM_GETCURRENTTOOLA (WM_USER+15) +#define TTM_GETCURRENTTOOLW (WM_USER+59) +#define TTM_WINDOWFROMPOINT (WM_USER+16) +#if (_WIN32_IE >= 0x0300) +#define TTM_TRACKACTIVATE (WM_USER+17) +#define TTM_TRACKPOSITION (WM_USER+18) +#define TTM_SETTIPBKCOLOR (WM_USER+19) +#define TTM_SETTIPTEXTCOLOR (WM_USER+20) +#define TTM_GETDELAYTIME (WM_USER+21) +#define TTM_GETTIPBKCOLOR (WM_USER+22) +#define TTM_GETTIPTEXTCOLOR (WM_USER+23) +#define TTM_SETMAXTIPWIDTH (WM_USER+24) +#define TTM_GETMAXTIPWIDTH (WM_USER+25) +#define TTM_SETMARGIN (WM_USER+26) +#define TTM_GETMARGIN (WM_USER+27) +#define TTM_POP (WM_USER+28) +#endif /* _WIN32_IE */ +#if (_WIN32_IE >= 0x0400) /* IE4.0 ??? */ +#define TTM_UPDATE (WM_USER+29) +#define TTM_GETBUBBLESIZE (WM_USER+30) +#define TTM_ADJUSTRECT (WM_USER+31) +#define TTM_SETTITLEA (WM_USER+32) +#define TTM_SETTITLEW (WM_USER+33) +#endif +#define TTN_GETDISPINFOA (TTN_FIRST - 0) +#define TTN_GETDISPINFOW (TTN_FIRST - 10) +#define TTN_NEEDTEXTA TTN_GETDISPINFOA +#define TTN_NEEDTEXTW TTN_GETDISPINFOW +#define TTN_SHOW (TTN_FIRST-1) +#define TTN_POP (TTN_FIRST-2) +#define UD_MAXVAL 0x7fff +#define UD_MINVAL (-UD_MAXVAL) +#define UDN_DELTAPOS (UDN_FIRST-1) +#define UDS_WRAP 1 +#define UDS_SETBUDDYINT 2 +#define UDS_ALIGNRIGHT 4 +#define UDS_ALIGNLEFT 8 +#define UDS_AUTOBUDDY 16 +#define UDS_ARROWKEYS 32 +#define UDS_HORZ 64 +#define UDS_NOTHOUSANDS 128 +#if ( _WIN32_IE >= 0x0300 ) +#define UDS_HOTTRACK 0x0100 +#endif /* _WIN32_IE >= 0x0300 */ +#define UDM_SETRANGE (WM_USER+101) +#define UDM_GETRANGE (WM_USER+102) +#define UDM_SETPOS (WM_USER+103) +#define UDM_GETPOS (WM_USER+104) +#define UDM_SETBUDDY (WM_USER+105) +#define UDM_GETBUDDY (WM_USER+106) +#define UDM_SETACCEL (WM_USER+107) +#define UDM_GETACCEL (WM_USER+108) +#define UDM_SETBASE (WM_USER+109) +#define UDM_GETBASE (WM_USER+110) +#if (_WIN32_IE >= 0x0400) +#define UDM_SETRANGE32 (WM_USER+111) +#define UDM_GETRANGE32 (WM_USER+112) +#define UDM_SETPOS32 (WM_USER+113) +#define UDM_GETPOS32 (WM_USER+114) +#endif +#if (_WIN32_IE >= 0x0500) +#define UDM_SETUNICODEFORMAT CCM_SETUNICODEFORMAT +#define UDM_GETUNICODEFORMAT CCM_GETUNICODEFORMAT +#endif +#define SB_SETTEXTA (WM_USER+1) +#define SB_SETTEXTW (WM_USER+11) +#define SB_GETTEXTA (WM_USER+2) +#define SB_GETTEXTW (WM_USER+13) +#define SB_GETTEXTLENGTHA (WM_USER+3) +#define SB_GETTEXTLENGTHW (WM_USER+12) +#define SB_SETPARTS (WM_USER+4) +#define SB_GETPARTS (WM_USER+6) +#define SB_GETBORDERS (WM_USER+7) +#define SB_SETMINHEIGHT (WM_USER+8) +#define SB_SIMPLE (WM_USER+9) +#define SB_GETRECT (WM_USER+10) +#define SBT_OWNERDRAW 0x1000 +#define SBT_NOBORDERS 256 +#define SBT_POPOUT 512 +#define SBT_RTLREADING 1024 +#if( _WIN32_IE >= 0x0400 ) +#define SBT_TOOLTIPS 0x0800 +#define SBN_SIMPLEMODECHANGE (SBN_FIRST) +#endif /* _WIN32_IE >= 0x0400 */ +#define TBS_AUTOTICKS 1 +#define TBS_VERT 2 +#define TBS_HORZ 0 +#define TBS_TOP 4 +#define TBS_BOTTOM 0 +#define TBS_LEFT 4 +#define TBS_RIGHT 0 +#define TBS_BOTH 8 +#define TBS_NOTICKS 16 +#define TBS_ENABLESELRANGE 32 +#define TBS_FIXEDLENGTH 64 +#define TBS_NOTHUMB 128 +#if (_WIN32_IE >= 0x0300) +#define TBS_TOOLTIPS 0x0100 +#define TBTS_TOP 0 +#define TBTS_LEFT 1 +#define TBTS_BOTTOM 2 +#define TBTS_RIGHT 3 +#endif +#if (_WIN32_IE >= 0x0500) +#define TBS_REVERSED 0x0200 +#endif +#if (_WIN32_IE >= 0x0501) +#define TBS_DOWNISLEFT 0x0400 +#endif +#if _WIN32_IE >= 0x400 +#define TBIF_BYINDEX 0x80000000 +#define TBIF_COMMAND 32 +#define TBIF_IMAGE 1 +#define TBIF_LPARAM 16 +#define TBIF_SIZE 64 +#define TBIF_STATE 4 +#define TBIF_STYLE 8 +#define TBIF_TEXT 2 +#endif +#define TBM_GETPOS (WM_USER) +#define TBM_GETRANGEMIN (WM_USER+1) +#define TBM_GETRANGEMAX (WM_USER+2) +#define TBM_GETTIC (WM_USER+3) +#define TBM_SETTIC (WM_USER+4) +#define TBM_SETPOS (WM_USER+5) +#define TBM_SETRANGE (WM_USER+6) +#define TBM_SETRANGEMIN (WM_USER+7) +#define TBM_SETRANGEMAX (WM_USER+8) +#define TBM_CLEARTICS (WM_USER+9) +#define TBM_SETSEL (WM_USER+10) +#define TBM_SETSELSTART (WM_USER+11) +#define TBM_SETSELEND (WM_USER+12) +#define TBM_GETPTICS (WM_USER+14) +#define TBM_GETTICPOS (WM_USER+15) +#define TBM_GETNUMTICS (WM_USER+16) +#define TBM_GETSELSTART (WM_USER+17) +#define TBM_GETSELEND (WM_USER+18) +#define TBM_CLEARSEL (WM_USER+19) +#define TBM_SETTICFREQ (WM_USER+20) +#define TBM_SETPAGESIZE (WM_USER+21) +#define TBM_GETPAGESIZE (WM_USER+22) +#define TBM_SETLINESIZE (WM_USER+23) +#define TBM_GETLINESIZE (WM_USER+24) +#define TBM_GETTHUMBRECT (WM_USER+25) +#define TBM_GETCHANNELRECT (WM_USER+26) +#define TBM_SETTHUMBLENGTH (WM_USER+27) +#define TBM_GETTHUMBLENGTH (WM_USER+28) +#define TBM_SETTOOLTIPS (WM_USER+29) +#define TBM_GETTOOLTIPS (WM_USER+30) +#define TBM_SETTIPSIDE (WM_USER+31) +#define TBM_SETBUDDY (WM_USER+32) +#define TBM_GETBUDDY (WM_USER+33) +#define TBM_GETUNICODEFORMAT CCM_GETUNICODEFORMAT +#define TBM_SETUNICODEFORMAT CCM_SETUNICODEFORMAT +#define TB_LINEUP 0 +#define TB_LINEDOWN 1 +#define TB_PAGEUP 2 +#define TB_PAGEDOWN 3 +#define TB_THUMBPOSITION 4 +#define TB_THUMBTRACK 5 +#define TB_TOP 6 +#define TB_BOTTOM 7 +#define TB_ENDTRACK 8 +#define HOTKEYF_SHIFT 1 +#define HOTKEYF_CONTROL 2 +#define HOTKEYF_ALT 4 +#define HOTKEYF_EXT 8 +#define HKCOMB_NONE 1 +#define HKCOMB_S 2 +#define HKCOMB_C 4 +#define HKCOMB_A 8 +#define HKCOMB_SC 16 +#define HKCOMB_SA 32 +#define HKCOMB_CA 64 +#define HKCOMB_SCA 128 +#define HKM_SETHOTKEY (WM_USER+1) +#define HKM_GETHOTKEY (WM_USER+2) +#define HKM_SETRULES (WM_USER+3) +#define PBM_SETRANGE (WM_USER+1) +#define PBM_SETPOS (WM_USER+2) +#define PBM_DELTAPOS (WM_USER+3) +#define PBM_SETSTEP (WM_USER+4) +#define PBM_STEPIT (WM_USER+5) +#define PBM_SETRANGE32 1030 +#define PBM_GETRANGE 1031 +#define PBM_GETPOS 1032 +#define PBM_SETBARCOLOR 1033 +#define PBM_SETBKCOLOR CCM_SETBKCOLOR +#define PBS_SMOOTH 1 +#define PBS_VERTICAL 4 +#define LVS_ICON 0 +#define LVS_REPORT 1 +#define LVS_SMALLICON 2 +#define LVS_LIST 3 +#define LVS_TYPEMASK 3 +#define LVS_SINGLESEL 4 +#define LVS_SHOWSELALWAYS 8 +#define LVS_SORTASCENDING 16 +#define LVS_SORTDESCENDING 32 +#define LVS_SHAREIMAGELISTS 64 +#define LVS_NOLABELWRAP 128 +#define LVS_AUTOARRANGE 256 +#define LVS_EDITLABELS 512 +#define LVS_NOSCROLL 0x2000 +#define LVS_TYPESTYLEMASK 0xfc00 +#define LVS_ALIGNTOP 0 +#define LVS_ALIGNLEFT 0x800 +#define LVS_ALIGNMASK 0xc00 +#define LVS_OWNERDRAWFIXED 0x400 +#define LVS_NOCOLUMNHEADER 0x4000 +#define LVS_NOSORTHEADER 0x8000 +#if (_WIN32_IE >= 0x0300) +#define CDIS_CHECKED 8 +#define CDIS_DEFAULT 32 +#define CDIS_DISABLED 4 +#define CDIS_FOCUS 16 +#define CDIS_GRAYED 2 +#define CDIS_HOT 64 +#define CDIS_SELECTED 1 +#define CDIS_MARKED 128 +#define CDIS_INDETERMINATE 256 +#if (_WIN32_WINNT >= 0x0501) +#define CDIS_SHOWKEYBOARDCUES 512 +#endif +#define CDDS_POSTERASE 4 +#define CDDS_POSTPAINT 2 +#define CDDS_PREERASE 3 +#define CDDS_PREPAINT 1 +#define CDDS_ITEM 65536 +#define CDDS_ITEMPOSTERASE 65540 +#define CDDS_ITEMPOSTPAINT 65538 +#define CDDS_ITEMPREERASE 65539 +#define CDDS_ITEMPREPAINT 65537 +#if (_WIN32_IE >= 0x0400) +#define CDDS_SUBITEM 0x20000 +#endif +/* FIXME: missing CDRF_NOTIFYSUBITEMDRAW */ +#define CDRF_DODEFAULT 0 +#define CDRF_NOTIFYITEMDRAW 32 +#define CDRF_NOTIFYITEMERASE 128 +#define CDRF_NOTIFYPOSTERASE 64 +#define CDRF_NOTIFYPOSTPAINT 16 +#define CDRF_NEWFONT 2 +#define CDRF_SKIPDEFAULT 4 +#if (_WIN32_IE >= 0x0400) +#define LVBKIF_SOURCE_NONE 0x00000000 +#define LVBKIF_SOURCE_HBITMAP 0x00000001 +#define LVBKIF_SOURCE_URL 0x00000002 +#define LVBKIF_SOURCE_MASK 0x00000003 +#define LVBKIF_STYLE_NORMAL 0x00000000 +#define LVBKIF_STYLE_TILE 0x00000010 +#define LVBKIF_STYLE_MASK 0x00000010 +#endif /* _WIN32_IE >=0x0400 */ +#if (_WIN32_WINNT >= 0x501) +#define LVBKIF_FLAG_TILEOFFSET 0x00000100 +#define LVBKIF_TYPE_WATERMARK 0x10000000 +#endif /* _WIN32_WINNT >= 0x501 */ +#define LVS_OWNERDATA 4096 +#define LVS_EX_CHECKBOXES 4 +#define LVS_EX_FULLROWSELECT 32 +#define LVS_EX_GRIDLINES 1 +#define LVS_EX_HEADERDRAGDROP 16 +#define LVS_EX_ONECLICKACTIVATE 64 +#define LVS_EX_SUBITEMIMAGES 2 +#define LVS_EX_TRACKSELECT 8 +#define LVS_EX_TWOCLICKACTIVATE 128 +#define LVSICF_NOINVALIDATEALL 0x00000001 +#define LVSICF_NOSCROLL 0x00000002 +#if( _WIN32_IE >= 0x0400 ) +#define LVS_EX_FLATSB 0x00000100 +#define LVS_EX_REGIONAL 0x00000200 +#define LVS_EX_INFOTIP 0x00000400 +#define LVS_EX_UNDERLINEHOT 0x00000800 +#define LVS_EX_UNDERLINECOLD 0x00001000 +#define LVS_EX_MULTIWORKAREAS 0x00002000 +#endif /* _WIN32_IE >=0x0400 */ +#if( _WIN32_IE >= 0x0500 ) +#define LVS_EX_LABELTIP 0x00004000 +#define LVS_EX_BORDERSELECT 0x00008000 +#endif /* _WIN32_IE >= 0x0500 */ +#endif /* _WIN32_IE >= 0x0300 */ +#define LVSIL_NORMAL 0 +#define LVSIL_SMALL 1 +#define LVSIL_STATE 2 +#define LVM_GETBKCOLOR LVM_FIRST +#define LVM_SETBKCOLOR (LVM_FIRST+1) +#define LVM_GETIMAGELIST (LVM_FIRST+2) +#define LVM_SETIMAGELIST (LVM_FIRST+3) +#define LVM_GETITEMCOUNT (LVM_FIRST+4) +#define LVIF_TEXT 1 +#define LVIF_IMAGE 2 +#define LVIF_PARAM 4 +#define LVIF_STATE 8 +#if (_WIN32_IE >= 0x0300) +#define LVIF_INDENT 16 +#define LVIF_NORECOMPUTE 2048 +#endif +#if (_WIN32_WINNT >= 0x0501) +#define LVIF_GROUPID 128 +#define LVIF_COLUMNS 256 +#endif +#define LVIS_FOCUSED 1 +#define LVIS_SELECTED 2 +#define LVIS_CUT 4 +#define LVIS_DROPHILITED 8 +#define LVIS_OVERLAYMASK 0xF00 +#define LVIS_STATEIMAGEMASK 0xF000 +#define LPSTR_TEXTCALLBACKW ((LPWSTR)-1) +#define LPSTR_TEXTCALLBACKA ((LPSTR)-1) +#define I_IMAGECALLBACK (-1) +#define LVM_GETITEMA (LVM_FIRST+5) +#define LVM_GETITEMW (LVM_FIRST+75) +#define LVM_SETITEMA (LVM_FIRST+6) +#define LVM_SETITEMW (LVM_FIRST+76) +#define LVM_INSERTITEMA (LVM_FIRST+7) +#define LVM_INSERTITEMW (LVM_FIRST+77) +#define LVM_DELETEITEM (LVM_FIRST+8) +#define LVM_DELETEALLITEMS (LVM_FIRST+9) +#define LVM_GETCALLBACKMASK (LVM_FIRST+10) +#define LVM_SETCALLBACKMASK (LVM_FIRST+11) +#if( _WIN32_IE >= 0x0400 ) +#define LVM_SETBKIMAGEA (LVM_FIRST + 68) +#define LVM_SETBKIMAGEW (LVM_FIRST + 138) +#define LVM_GETBKIMAGEA (LVM_FIRST + 69) +#define LVM_GETBKIMAGEW (LVM_FIRST + 139) +#define LV_MAX_WORKAREAS 16 +#define LVM_SETWORKAREAS (LVM_FIRST+65) +#define LVM_GETWORKAREAS (LVM_FIRST+70) +#define LVM_GETNUMBEROFWORKAREAS (LVM_FIRST+73) +#define LVM_GETSELECTIONMARK (LVM_FIRST+66) +#define LVM_SETSELECTIONMARK (LVM_FIRST+67) +#define LVM_SETHOVERTIME (LVM_FIRST+71) +#define LVM_GETHOVERTIME (LVM_FIRST+72) +#define LVM_SETTOOLTIPS (LVM_FIRST+74) +#define LVM_GETTOOLTIPS (LVM_FIRST+78) +#endif /* _WIN32_IE >= 0x0400 */ +#define LVNI_ALL 0 +#define LVNI_FOCUSED 1 +#define LVNI_SELECTED 2 +#define LVNI_CUT 4 +#define LVNI_DROPHILITED 8 +#define LVNI_ABOVE 256 +#define LVNI_BELOW 512 +#define LVNI_TOLEFT 1024 +#define LVNI_TORIGHT 2048 +#define LVM_GETNEXTITEM (LVM_FIRST+12) +#define LVFI_PARAM 1 +#define LVFI_STRING 2 +#define LVFI_PARTIAL 8 +#define LVFI_WRAP 32 +#define LVFI_NEARESTXY 64 +#define LVIF_DI_SETITEM 0x1000 +#define LVM_FINDITEMA (LVM_FIRST+13) +#define LVM_FINDITEMW (LVM_FIRST+83) +#define LVIR_BOUNDS 0 +#define LVIR_ICON 1 +#define LVIR_LABEL 2 +#define LVIR_SELECTBOUNDS 3 +#define LVM_GETITEMRECT (LVM_FIRST+14) +#define LVM_SETITEMPOSITION (LVM_FIRST+15) +#define LVM_GETITEMPOSITION (LVM_FIRST+16) +#define LVM_GETSTRINGWIDTHA (LVM_FIRST+17) +#define LVM_GETSTRINGWIDTHW (LVM_FIRST+87) +#define LVHT_NOWHERE 1 +#define LVHT_ONITEMICON 2 +#define LVHT_ONITEMLABEL 4 +#define LVHT_ONITEMSTATEICON 8 +#define LVHT_ONITEM (LVHT_ONITEMICON|LVHT_ONITEMLABEL|LVHT_ONITEMSTATEICON) +#define LVHT_ABOVE 8 +#define LVHT_BELOW 16 +#define LVHT_TORIGHT 32 +#define LVHT_TOLEFT 64 +#define LVM_HITTEST (LVM_FIRST+18) +#define LVM_ENSUREVISIBLE (LVM_FIRST+19) +#define LVM_SCROLL (LVM_FIRST+20) +#define LVM_REDRAWITEMS (LVM_FIRST+21) +#define LVA_DEFAULT 0 +#define LVA_ALIGNLEFT 1 +#define LVA_ALIGNTOP 2 +#define LVA_SNAPTOGRID 5 +#define LVM_ARRANGE (LVM_FIRST+22) +#define LVM_EDITLABELA (LVM_FIRST+23) +#define LVM_EDITLABELW (LVM_FIRST+118) +#define LVM_GETEDITCONTROL (LVM_FIRST+24) +#define LVCF_FMT 1 +#define LVCF_WIDTH 2 +#define LVCF_TEXT 4 +#define LVCF_SUBITEM 8 +#if (_WIN32_IE >= 0x0300) +#define LVCF_IMAGE 16 +#define LVCF_ORDER 32 +#endif +#define LVCFMT_LEFT 0 +#define LVCFMT_RIGHT 1 +#define LVCFMT_CENTER 2 +#define LVCFMT_JUSTIFYMASK 3 +#if (_WIN32_IE >= 0x0300) +#define LVCFMT_BITMAP_ON_RIGHT 4096 +#define LVCFMT_COL_HAS_IMAGES 32768 +#define LVCFMT_IMAGE 2048 +#endif +#define LVM_GETCOLUMNA (LVM_FIRST+25) +#define LVM_GETCOLUMNW (LVM_FIRST+95) +#define LVM_SETCOLUMNA (LVM_FIRST+26) +#define LVM_SETCOLUMNW (LVM_FIRST+96) +#define LVM_INSERTCOLUMNA (LVM_FIRST+27) +#define LVM_INSERTCOLUMNW (LVM_FIRST+97) +#define LVM_DELETECOLUMN (LVM_FIRST+28) +#define LVM_GETCOLUMNWIDTH (LVM_FIRST+29) +#define LVSCW_AUTOSIZE (-1) +#define LVSCW_AUTOSIZE_USEHEADER (-2) +#define LVM_SETCOLUMNWIDTH (LVM_FIRST+30) +#define LVM_CREATEDRAGIMAGE (LVM_FIRST+33) +#define LVM_GETVIEWRECT (LVM_FIRST+34) +#define LVM_GETTEXTCOLOR (LVM_FIRST+35) +#define LVM_SETTEXTCOLOR (LVM_FIRST+36) +#define LVM_GETTEXTBKCOLOR (LVM_FIRST+37) +#define LVM_SETTEXTBKCOLOR (LVM_FIRST+38) +#define LVM_GETTOPINDEX (LVM_FIRST+39) +#define LVM_GETCOUNTPERPAGE (LVM_FIRST+40) +#define LVM_GETORIGIN (LVM_FIRST+41) +#define LVM_GETORIGIN (LVM_FIRST+41) +#define LVM_UPDATE (LVM_FIRST+42) +#define LVM_SETITEMSTATE (LVM_FIRST+43) +#define LVM_GETITEMSTATE (LVM_FIRST+44) +#define LVM_GETITEMTEXTA (LVM_FIRST+45) +#define LVM_GETITEMTEXTW (LVM_FIRST+115) +#define LVM_SETITEMTEXTA (LVM_FIRST+46) +#define LVM_SETITEMTEXTW (LVM_FIRST+116) +#define LVM_SETITEMCOUNT (LVM_FIRST+47) +#define LVM_SORTITEMS (LVM_FIRST+48) +#define LVM_SETITEMPOSITION32 (LVM_FIRST+49) +#define LVM_GETSELECTEDCOUNT (LVM_FIRST+50) +#define LVM_GETITEMSPACING (LVM_FIRST+51) +#define LVM_GETISEARCHSTRINGA (LVM_FIRST+52) +#define LVM_GETISEARCHSTRINGW (LVM_FIRST+117) +#if (_WIN32_IE >= 0x0300) +#define LVM_APPROXIMATEVIEWRECT (LVM_FIRST+64) +#define LVM_SETEXTENDEDLISTVIEWSTYLE (LVM_FIRST+54) +#define LVM_GETEXTENDEDLISTVIEWSTYLE (LVM_FIRST+55) +#define LVM_SETCOLUMNORDERARRAY (LVM_FIRST+58) +#define LVM_GETCOLUMNORDERARRAY (LVM_FIRST+59) +#define LVM_GETHEADER (LVM_FIRST+31) +#define LVM_GETHOTCURSOR (LVM_FIRST+63) +#define LVM_GETHOTITEM (LVM_FIRST+61) +#define LVM_GETSUBITEMRECT (LVM_FIRST+56) +#define LVM_SETHOTCURSOR (LVM_FIRST+62) +#define LVM_SETHOTITEM (LVM_FIRST+60) +#define LVM_SETICONSPACING (LVM_FIRST+53) +#define LVM_SUBITEMHITTEST (LVM_FIRST+57) +#endif +#define LVN_ITEMCHANGING LVN_FIRST +#define LVN_ITEMCHANGED (LVN_FIRST-1) +#define LVN_INSERTITEM (LVN_FIRST-2) +#define LVN_DELETEITEM (LVN_FIRST-3) +#define LVN_DELETEALLITEMS (LVN_FIRST-4) +#define LVN_BEGINLABELEDITA (LVN_FIRST-5) +#define LVN_BEGINLABELEDITW (LVN_FIRST-75) +#define LVN_ENDLABELEDITA (LVN_FIRST-6) +#define LVN_ENDLABELEDITW (LVN_FIRST-76) +#define LVN_COLUMNCLICK (LVN_FIRST-8) +#define LVN_BEGINDRAG (LVN_FIRST-9) +#define LVN_BEGINRDRAG (LVN_FIRST-11) +#define LVN_GETDISPINFOA (LVN_FIRST-50) +#define LVN_GETDISPINFOW (LVN_FIRST-77) +#define LVN_SETDISPINFOA (LVN_FIRST-51) +#define LVN_SETDISPINFOW (LVN_FIRST-78) +#define LVN_KEYDOWN (LVN_FIRST-55) +#if (_WIN32_IE >= 0x0400) +#define LVN_GETINFOTIPA (LVN_FIRST-57) +#define LVN_GETINFOTIPW (LVN_FIRST-58) +#define LVKF_ALT 0x0001 +#define LVKF_CONTROL 0x0002 +#define LVKF_SHIFT 0x0004 +#define LVGIT_UNFOLDED 1 +#endif +#define TVS_HASBUTTONS 1 +#define TVS_HASLINES 2 +#define TVS_LINESATROOT 4 +#define TVS_EDITLABELS 8 +#define TVS_DISABLEDRAGDROP 16 +#define TVS_SHOWSELALWAYS 32 +#if (_WIN32_IE >= 0x0300) +#define TVS_CHECKBOXES 256 +#define TVS_NOTOOLTIPS 128 +#define TVS_RTLREADING 64 +#define TVS_TRACKSELECT 512 +#endif +#if (_WIN32_IE >= 0x0400) +#define TVS_FULLROWSELECT 4096 +#define TVS_INFOTIP 2048 +#define TVS_NONEVENHEIGHT 16384 +#define TVS_NOSCROLL 8192 +#define TVS_SINGLEEXPAND 1024 +#endif +#if( _WIN32_IE >= 0x0500 ) +#define TVS_NOHSCROLL 0x8000 +#endif /* _WIN32_IE >= 0x0500 */ +#define TVIF_TEXT 1 +#define TVIF_IMAGE 2 +#define TVIF_PARAM 4 +#define TVIF_STATE 8 +#define TVIF_HANDLE 16 +#define TVIF_SELECTEDIMAGE 32 +#define TVIF_CHILDREN 64 +#if (_WIN32_IE >= 0x0400) +#define TVIF_INTEGRAL 0x0080 +#endif /* _WIN32_IE >= 0x0400 */ +#define TVIS_FOCUSED 1 +#define TVIS_SELECTED 2 +#define TVIS_CUT 4 +#define TVIS_DROPHILITED 8 +#define TVIS_BOLD 16 +#define TVIS_EXPANDED 32 +#define TVIS_EXPANDEDONCE 64 +#define TVIS_OVERLAYMASK 0xF00 +#define TVIS_STATEIMAGEMASK 0xF000 +#define TVIS_USERMASK 0xF000 +#define I_CHILDRENCALLBACK (-1) +#define TVI_ROOT ((HTREEITEM)0xFFFF0000) +#define TVI_FIRST ((HTREEITEM)0xFFFF0001) +#define TVI_LAST ((HTREEITEM)0xFFFF0002) +#define TVI_SORT ((HTREEITEM)0xFFFF0003) +#define TVSIL_NORMAL 0 +#define TVSIL_STATE 2 +#define TVM_INSERTITEMA TV_FIRST +#define TVM_INSERTITEMW (TV_FIRST+50) +#define TVM_DELETEITEM (TV_FIRST+1) +#define TVM_EXPAND (TV_FIRST+2) +#define TVM_GETITEMRECT (TV_FIRST+4) +#define TVM_GETCOUNT (TV_FIRST+5) +#define TVM_GETINDENT (TV_FIRST+6) +#define TVM_SETINDENT (TV_FIRST+7) +#define TVM_GETIMAGELIST (TV_FIRST+8) +#define TVM_SETIMAGELIST (TV_FIRST+9) +#define TVM_GETNEXTITEM (TV_FIRST+10) +#define TVM_SELECTITEM (TV_FIRST+11) +#define TVM_GETITEMA (TV_FIRST+12) +#define TVM_GETITEMW (TV_FIRST+62) +#define TVM_SETITEMA (TV_FIRST+13) +#define TVM_SETITEMW (TV_FIRST+63) +#define TVM_EDITLABELA (TV_FIRST+14) +#define TVM_EDITLABELW (TV_FIRST+65) +#define TVM_GETEDITCONTROL (TV_FIRST+15) +#define TVM_GETVISIBLECOUNT (TV_FIRST+16) +#define TVM_HITTEST (TV_FIRST+17) +#define TVM_CREATEDRAGIMAGE (TV_FIRST+18) +#define TVM_SORTCHILDREN (TV_FIRST+19) +#define TVM_ENSUREVISIBLE (TV_FIRST+20) +#define TVM_SORTCHILDRENCB (TV_FIRST+21) +#define TVM_ENDEDITLABELNOW (TV_FIRST+22) +#define TVM_GETISEARCHSTRINGA (TV_FIRST+23) +#define TVM_GETISEARCHSTRINGW (TV_FIRST+64) +#if (_WIN32_IE >= 0x0300) +#define TVM_GETTOOLTIPS (TV_FIRST+25) +#define TVM_SETTOOLTIPS (TV_FIRST+24) +#endif +#if (_WIN32_IE >= 0x0400) +#define TVM_GETBKCOLOR (TV_FIRST+31) +#define TVM_GETINSERTMARKCOLOR (TV_FIRST+38) +#define TVM_GETITEMHEIGHT (TV_FIRST+28) +#define TVM_GETSCROLLTIME (TV_FIRST+34) +#define TVM_GETTEXTCOLOR (TV_FIRST+32) +#define TVM_SETBKCOLOR (TV_FIRST+29) +#define TVM_SETINSERTMARK (TV_FIRST+26) +#define TVM_SETINSERTMARKCOLOR (TV_FIRST+37) +#define TVM_SETITEMHEIGHT (TV_FIRST+27) +#define TVM_SETSCROLLTIME (TV_FIRST+33) +#define TVM_SETTEXTCOLOR (TV_FIRST+30) +#define TVM_SETUNICODEFORMAT CCM_SETUNICODEFORMAT +#define TVM_GETUNICODEFORMAT CCM_GETUNICODEFORMAT +#endif +#if (_WIN32_IE >= 0x0500) +#define TVM_GETITEMSTATE (TV_FIRST+39) +#define TVM_SETLINECOLOR (TV_FIRST+40) +#define TVM_GETLINECOLOR (TV_FIRST+41) +#endif +#define TVE_COLLAPSE 1 +#define TVE_EXPAND 2 +#define TVE_TOGGLE 3 +#define TVE_COLLAPSERESET 0x8000 +#if (_WIN32_IE >= 0x0300) +#define TVE_EXPANDPARTIAL 0x4000 +#endif +#define TVC_UNKNOWN 0 +#define TVC_BYMOUSE 1 +#define TVC_BYKEYBOARD 2 +#define TVGN_ROOT 0 +#define TVGN_NEXT 1 +#define TVGN_PREVIOUS 2 +#define TVGN_PARENT 3 +#define TVGN_CHILD 4 +#define TVGN_FIRSTVISIBLE 5 +#define TVGN_NEXTVISIBLE 6 +#define TVGN_PREVIOUSVISIBLE 7 +#define TVGN_DROPHILITE 8 +#define TVGN_CARET 9 +#if (_WIN32_IE >= 0x0400) +#define TVGN_LASTVISIBLE 10 +#endif +#define TVN_SELCHANGINGA (TVN_FIRST-1) +#define TVN_SELCHANGINGW (TVN_FIRST-50) +#define TVN_SELCHANGEDA (TVN_FIRST-2) +#define TVN_SELCHANGEDW (TVN_FIRST-51) +#define TVN_GETDISPINFOA (TVN_FIRST-3) +#define TVN_GETDISPINFOW (TVN_FIRST-52) +#define TVN_SETDISPINFOA (TVN_FIRST-4) +#define TVN_SETDISPINFOW (TVN_FIRST-53) +#define TVN_ITEMEXPANDINGA (TVN_FIRST-5) +#define TVN_ITEMEXPANDINGW (TVN_FIRST-54) +#define TVN_ITEMEXPANDEDA (TVN_FIRST-6) +#define TVN_ITEMEXPANDEDW (TVN_FIRST-55) +#define TVN_BEGINDRAGA (TVN_FIRST-7) +#define TVN_BEGINDRAGW (TVN_FIRST-56) +#define TVN_BEGINRDRAGA (TVN_FIRST-8) +#define TVN_BEGINRDRAGW (TVN_FIRST-57) +#define TVN_DELETEITEMA (TVN_FIRST-9) +#define TVN_DELETEITEMW (TVN_FIRST-58) +#define TVN_BEGINLABELEDITA (TVN_FIRST-10) +#define TVN_BEGINLABELEDITW (TVN_FIRST-59) +#define TVN_ENDLABELEDITA (TVN_FIRST-11) +#define TVN_ENDLABELEDITW (TVN_FIRST-60) +#define TVN_KEYDOWN (TVN_FIRST-12) +#if (_WIN32_IE >= 0x0400) +#define TVN_GETINFOTIPA (TVN_FIRST-13) +#define TVN_GETINFOTIPW (TVN_FIRST-14) +#define TVN_SINGLEEXPAND (TVN_FIRST-15) +#define TVNRET_DEFAULT 0 +#define TVNRET_SKIPOLD 1 +#define TVNRET_SKIPNEW 2 +#endif /* _WIN32_IE >= 0x0400 */ +#define TVIF_DI_SETITEM 0x1000 +#define TVHT_NOWHERE 1 +#define TVHT_ONITEMICON 2 +#define TVHT_ONITEMLABEL 4 +#define TVHT_ONITEM (TVHT_ONITEMICON|TVHT_ONITEMLABEL|TVHT_ONITEMSTATEICON) +#define TVHT_ONITEMINDENT 8 +#define TVHT_ONITEMBUTTON 16 +#define TVHT_ONITEMRIGHT 32 +#define TVHT_ONITEMSTATEICON 64 +#define TVHT_ABOVE 256 +#define TVHT_BELOW 512 +#define TVHT_TORIGHT 1024 +#define TVHT_TOLEFT 2048 +#define TCHT_NOWHERE 1 +#define TCHT_ONITEMICON 2 +#define TCHT_ONITEMLABEL 4 +#define TCHT_ONITEM (TCHT_ONITEMICON|TCHT_ONITEMLABEL) +#define TCS_FORCEICONLEFT 16 +#define TCS_FORCELABELLEFT 32 +#define TCS_TABS 0 +#define TCS_BUTTONS 256 +#define TCS_SINGLELINE 0 +#define TCS_MULTILINE 512 +#define TCS_RIGHTJUSTIFY 0 +#define TCS_FIXEDWIDTH 1024 +#define TCS_RAGGEDRIGHT 2048 +#define TCS_FOCUSONBUTTONDOWN 0x1000 +#define TCS_OWNERDRAWFIXED 0x2000 +#define TCS_TOOLTIPS 0x4000 +#define TCS_FOCUSNEVER 0x8000 +#if (_WIN32_IE >= 0x0300) +#define TCS_BOTTOM 2 +#define TCS_RIGHT 2 +#define TCS_VERTICAL 128 +#define TCS_SCROLLOPPOSITE 0x0001 +#define TCS_HOTTRACK 0x0040 +#define TCS_MULTISELECT 0x0004 +#endif +#if( _WIN32_IE >= 0x0400 ) +#define TCS_FLATBUTTONS 0x0008 +#define TCS_EX_FLATSEPARATORS 0x00000001 +#define TCS_EX_REGISTERDROP 0x00000002 +#endif /* _WIN32_IE >= 0x0400 */ +#define TCIF_TEXT 1 +#define TCIF_IMAGE 2 +#define TCIF_RTLREADING 4 +#define TCIF_PARAM 8 +#if (_WIN32_IE >= 0x0400) +#define TCIF_STATE 16 +#endif +#define TCIS_BUTTONPRESSED 1 +#if (_WIN32_IE >= 0x0400) +#define TCIS_HIGHLIGHTED 2 +#endif +#define TCM_FIRST 0x1300 +#define TCM_GETIMAGELIST (TCM_FIRST+2) +#define TCM_SETIMAGELIST (TCM_FIRST+3) +#define TCM_GETITEMCOUNT (TCM_FIRST+4) +#define TCM_GETITEMA (TCM_FIRST+5) +#define TCM_GETITEMW (TCM_FIRST+60) +#define TCM_SETITEMA (TCM_FIRST+6) +#define TCM_SETITEMW (TCM_FIRST+61) +#define TCM_INSERTITEMA (TCM_FIRST+7) +#define TCM_INSERTITEMW (TCM_FIRST+62) +#define TCM_DELETEITEM (TCM_FIRST+8) +#define TCM_DELETEALLITEMS (TCM_FIRST+9) +#define TCM_GETITEMRECT (TCM_FIRST+10) +#define TCM_GETCURSEL (TCM_FIRST+11) +#define TCM_SETCURSEL (TCM_FIRST+12) +#define TCM_HITTEST (TCM_FIRST+13) +#define TCM_SETITEMEXTRA (TCM_FIRST+14) + +#define TCM_ADJUSTRECT (TCM_FIRST+40) +#define TCM_SETITEMSIZE (TCM_FIRST+41) +#define TCM_REMOVEIMAGE (TCM_FIRST+42) +#define TCM_SETPADDING (TCM_FIRST+43) +#define TCM_GETROWCOUNT (TCM_FIRST+44) +#define TCM_GETTOOLTIPS (TCM_FIRST+45) +#define TCM_SETTOOLTIPS (TCM_FIRST+46) +#define TCM_GETCURFOCUS (TCM_FIRST+47) +#define TCM_SETCURFOCUS (TCM_FIRST+48) +#define TCM_SETMINTABWIDTH (TCM_FIRST + 49) +#define TCM_DESELECTALL (TCM_FIRST + 50) +#if (_WIN32_IE >=0x0400) +#define TCM_HIGHLIGHTITEM (TCM_FIRST + 51) +#define TCM_SETEXTENDEDSTYLE (TCM_FIRST + 52) +#define TCM_GETEXTENDEDSTYLE (TCM_FIRST + 53) +#define TCM_SETUNICODEFORMAT CCM_SETUNICODEFORMAT +#define TCM_GETUNICODEFORMAT CCM_GETUNICODEFORMAT +#endif /* _WIN32_IE >=0x0400 */ +#define TCN_KEYDOWN TCN_FIRST +#define TCN_SELCHANGE (TCN_FIRST-1) +#define TCN_SELCHANGING (TCN_FIRST-2) +#define NM_OUTOFMEMORY (NM_FIRST-1) +#define NM_CLICK (NM_FIRST-2) +#define NM_DBLCLK (NM_FIRST-3) +#define NM_RETURN (NM_FIRST-4) +#define NM_RCLICK (NM_FIRST-5) +#define NM_RDBLCLK (NM_FIRST-6) +#define NM_SETFOCUS (NM_FIRST-7) +#define NM_KILLFOCUS (NM_FIRST-8) +#define NM_CUSTOMDRAW (NM_FIRST-12) +#define NM_HOVER (NM_FIRST-13) +#define NM_NCHITTEST (NM_FIRST-14) +#define NM_KEYDOWN (NM_FIRST-15) +#define NM_RELEASEDCAPTURE (NM_FIRST-16) +#define NM_SETCURSOR (NM_FIRST-17) +#define NM_CHAR (NM_FIRST-18) +#define NM_TOOLTIPSCREATED (NM_FIRST-19) +#define SBARS_SIZEGRIP 256 +#define CCM_FIRST 0x2000 +#define CCM_LAST (CCM_FIRST+0x200) +#define CCM_SETBKCOLOR 8193 +#define CCM_SETCOLORSCHEME 8194 +#define CCM_GETCOLORSCHEME 8195 +#define CCM_GETDROPTARGET 8196 +#define CCM_SETUNICODEFORMAT 8197 +#define CCM_GETUNICODEFORMAT 8198 +#define CCM_SETVERSION 0x2007 +#define CCM_GETVERSION 0x2008 +#define CCM_SETNOTIFYWINDOW 0x2009 +#if (_WIN32_WINNT >= 0x0501) +#define CCM_SETWINDOWTHEME 0x200b +#define CCM_DPISCALE 0x200c +#endif +#define ICC_LISTVIEW_CLASSES 1 +#define ICC_TREEVIEW_CLASSES 2 +#define ICC_BAR_CLASSES 4 +#define ICC_TAB_CLASSES 8 +#define ICC_UPDOWN_CLASS 16 +#define ICC_PROGRESS_CLASS 32 +#define ICC_HOTKEY_CLASS 64 +#define ICC_ANIMATE_CLASS 128 +#define ICC_WIN95_CLASSES 255 +#define ICC_DATE_CLASSES 256 +#define ICC_USEREX_CLASSES 512 +#define ICC_COOL_CLASSES 1024 +#if (_WIN32_IE >= 0x0400) +#define ICC_INTERNET_CLASSES 2048 +#define ICC_PAGESCROLLER_CLASS 4096 +#define ICC_NATIVEFNTCTL_CLASS 8192 +#define INFOTIPSIZE 1024 +#endif /* _WIN32_IE */ +#if (_WIN32_WINNT >= 0x501) +#define ICC_STANDARD_CLASSES 0x00004000 +#define ICC_LINK_CLASS 0x00008000 +#endif +#define GDTR_MIN 1 +#define GDTR_MAX 2 +#define GMR_VISIBLE 0 +#define GMR_DAYSTATE 1 +#define GDT_ERROR -1 +#define GDT_VALID 0 +#define GDT_NONE 1 +#define DTS_UPDOWN 1 +#define DTS_SHOWNONE 2 +#define DTS_SHORTDATEFORMAT 0 +#define DTS_LONGDATEFORMAT 4 +#define DTS_TIMEFORMAT 9 +#define DTS_APPCANPARSE 16 +#define DTS_RIGHTALIGN 32 +#if ( _WIN32_IE >= 0x500 ) +#define DTS_SHORTDATECENTURYFORMAT 0x000C +#endif /* _WIN32_IE >= 0x500 */ +#define MCS_DAYSTATE 1 +#define MCS_MULTISELECT 2 +#define MCS_WEEKNUMBERS 4 +#if (_WIN32_IE >= 0x0400) +#define MCS_NOTODAYCIRCLE 0x0008 +#define MCS_NOTODAY 0x0010 +#else /* _WIN32_IE >= 0x0400 */ +#define MCS_NOTODAY 0x0008 +#endif /* _WIN32_IE >= 0x0400 */ +#define DTM_GETSYSTEMTIME 0x1001 +#define DTM_SETSYSTEMTIME 0x1002 +#define DTM_GETRANGE 0x1003 +#define DTM_SETRANGE 0x1004 +#define DTM_SETFORMATA 0x1005 +#define DTM_SETFORMATW 0x1050 +#define DTM_SETMCCOLOR 0x1006 +#define DTM_GETMCCOLOR 0x1007 +#define DTM_GETMONTHCAL 0x1008 +#define DTM_SETMCFONT 0x1009 +#define DTM_GETMCFONT 0x100a +#define DTN_USERSTRINGA ((UINT)-758) +#define DTN_USERSTRINGW ((UINT)-745) +#define DTN_WMKEYDOWNA ((UINT)-757) +#define DTN_WMKEYDOWNW ((UINT)-744) +#define DTN_FORMATA ((UINT)-756) +#define DTN_FORMATW ((UINT)-743) +#define DTN_FORMATQUERYA ((UINT)-755) +#define DTN_FORMATQUERYW ((UINT)-742) +#define DTN_DROPDOWN ((UINT)-754) +#define DTN_CLOSEUP ((UINT)-753) +#define DTN_DATETIMECHANGE ((UINT)-759) +#define MCM_GETCURSEL 0x1001 +#define MCM_SETCURSEL 0x1002 +#define MCM_GETMAXSELCOUNT 0x1003 +#define MCM_SETMAXSELCOUNT 0x1004 +#define MCM_GETSELRANGE 0x1005 +#define MCM_SETSELRANGE 0x1006 +#define MCM_GETMONTHRANGE 0x1007 +#define MCM_SETDAYSTATE 0x1008 +#define MCM_GETMINREQRECT 0x1009 +#define MCM_SETCOLOR 0x100a +#define MCM_GETCOLOR 0x100b +#define MCM_SETTODAY 0x100c +#define MCM_GETTODAY 0x100d +#define MCM_HITTEST 0x100e +#define MCM_SETFIRSTDAYOFWEEK 0x100f +#define MCM_GETFIRSTDAYOFWEEK 0x1010 +#define MCM_GETRANGE 0x1011 +#define MCM_SETRANGE 0x1012 +#define MCM_GETMONTHDELTA 0x1013 +#define MCM_SETMONTHDELTA 0x1014 +#define MCM_GETMAXTODAYWIDTH 0x1015 +#define MCN_SELCHANGE ((UINT)-749) +#define MCN_GETDAYSTATE ((UINT)-747) +#define MCN_SELECT ((UINT)-746) +#define ODT_HEADER 100 +#define ODT_TAB 101 +#define ODT_LISTVIEW 102 +#define SB_SETBKCOLOR 0x2001 +#if (_WIN32_IE >= 0x0300) +#define SB_ISSIMPLE 1038 +#define MCSC_BACKGROUND 0 +#define MCSC_TEXT 1 +#define MCSC_TITLEBK 2 +#define MCSC_TITLETEXT 3 +#define MCSC_MONTHBK 4 +#define MCSC_TRAILINGTEXT 5 +#endif +#if (_WIN32_IE >= 0x0400) +#define MCHT_TITLE 0x10000 +#define MCHT_CALENDAR 0x20000 +#define MCHT_TODAYLINK 0x30000 +#define MCHT_NEXT 0x1000000 +#define MCHT_PREV 0x2000000 +#define MCHT_NOWHERE 0x00 +#define MCHT_TITLEBK (MCHT_TITLE) +#define MCHT_TITLEMONTH (MCHT_TITLE | 0x0001) +#define MCHT_TITLEYEAR (MCHT_TITLE | 0x0002) +#define MCHT_TITLEBTNNEXT (MCHT_TITLE | MCHT_NEXT | 0x0003) +#define MCHT_TITLEBTNPREV (MCHT_TITLE | MCHT_PREV | 0x0003) +#define MCHT_CALENDARBK (MCHT_CALENDAR) +#define MCHT_CALENDARDATE (MCHT_CALENDAR | 0x0001) +#define MCHT_CALENDARDATENEXT (MCHT_CALENDARDATE | MCHT_NEXT) +#define MCHT_CALENDARDATEPREV (MCHT_CALENDARDATE | MCHT_PREV) +#define MCHT_CALENDARDAY (MCHT_CALENDAR | 0x0002) +#define MCHT_CALENDARWEEKNUM (MCHT_CALENDAR | 0x0003) +#endif /* _WIN32_IE >= 0x0400 */ +#define RBS_TOOLTIPS 256 +#define RBS_VARHEIGHT 512 +#define RBS_BANDBORDERS 1024 +#define RBS_FIXEDORDER 2048 +#define RBIM_IMAGELIST 1 +#define RB_SETCOLORSCHEME CCM_SETCOLORSCHEME +#define RB_GETCOLORSCHEME CCM_GETCOLORSCHEME +#define RBBS_BREAK 1 +#define RBBS_FIXEDSIZE 2 +#define RBBS_CHILDEDGE 4 +#define RBBS_HIDDEN 8 +#define RBBS_NOVERT 16 +#define RBBS_FIXEDBMP 32 +#define RBBIM_STYLE 1 +#define RBBIM_COLORS 2 +#define RBBIM_TEXT 4 +#define RBBIM_IMAGE 8 +#define RBBIM_CHILD 16 +#define RBBIM_CHILDSIZE 32 +#define RBBIM_SIZE 64 +#define RBBIM_BACKGROUND 128 +#define RBBIM_ID 256 +#define RB_INSERTBANDA (WM_USER+1) +#define RB_INSERTBANDW (WM_USER+10) +#define RB_DELETEBAND (WM_USER+2) +#define RB_GETBARINFO (WM_USER+3) +#define RB_SETBARINFO (WM_USER+4) +#define RB_GETBANDCOUNT (WM_USER+12) +#define RB_GETROWCOUNT (WM_USER+13) +#define RB_GETROWHEIGHT (WM_USER+14) +#define RB_SETBANDINFOA (WM_USER+6) +#define RB_SETBANDINFOW (WM_USER+11) +#define RB_SETPARENT (WM_USER+7) +#define RBN_HEIGHTCHANGE RBN_FIRST +#if (_WIN32_IE >= 0x0300) +#define LVN_ODCACHEHINT (LVN_FIRST-13) +#define LVN_ODFINDITEMA (LVN_FIRST-52) +#define LVN_ODFINDITEMW (LVN_FIRST-79) +#define LVN_ITEMACTIVATE (LVN_FIRST-14) +#define LVN_ODSTATECHANGED (LVN_FIRST-15) +#ifdef UNICODE +#define LVN_ODFINDITEM LVN_ODFINDITEMW +#else +#define LVN_ODFINDITEM LVN_ODFINDITEMA +#endif +#endif /* _WIN32_IE */ +#if (_WIN32_IE >= 0x0400) +#define SB_SETICON 1039 +#define SB_SETTIPTEXTA 1040 +#define SB_SETTIPTEXTW 1041 +#define SB_GETTIPTEXTA 1042 +#define SB_GETTIPTEXTW 1043 +#define SB_GETICON 1044 +#define SB_SETUNICODEFORMAT 0x2005 +#define SB_GETUNICODEFORMAT 0x2006 +#define PGF_INVISIBLE 0 +#define PGF_NORMAL 1 +#define PGF_GRAYED 2 +#define PGF_DEPRESSED 4 +#define PGF_HOT 8 +#define PGB_TOPORLEFT 0 +#define PGB_BOTTOMORRIGHT 1 +#define PGF_SCROLLUP 1 +#define PGF_SCROLLDOWN 2 +#define PGF_SCROLLLEFT 4 +#define PGF_SCROLLRIGHT 8 +#define PGK_SHIFT 1 +#define PGK_CONTROL 2 +#define PGK_MENU 4 +#define PGF_CALCWIDTH 1 +#define PGF_CALCHEIGHT 2 +#define PGM_FIRST 0x1400 +#define PGM_SETCHILD (PGM_FIRST+1) +#define PGM_RECALCSIZE (PGM_FIRST+2) +#define PGM_FORWARDMOUSE (PGM_FIRST+3) +#define PGM_SETBKCOLOR (PGM_FIRST+4) +#define PGM_GETBKCOLOR (PGM_FIRST+5) +#define PGM_SETBORDER (PGM_FIRST+6) +#define PGM_GETBORDER (PGM_FIRST+7) +#define PGM_SETPOS (PGM_FIRST+8) +#define PGM_GETPOS (PGM_FIRST+9) +#define PGM_SETBUTTONSIZE (PGM_FIRST+10) +#define PGM_GETBUTTONSIZE (PGM_FIRST+11) +#define PGM_GETBUTTONSTATE (PGM_FIRST+12) +#define PGM_GETDROPTARGET CCM_GETDROPTARGET + +#define RBS_REGISTERDROP 4096 +#define RBS_AUTOSIZE 8192 +#define RBS_VERTICALGRIPPER 16384 +#define RBS_DBLCLKTOGGLE 32768 +#define RBBS_VARIABLEHEIGHT 64 +#define RBBS_GRIPPERALWAYS 128 +#define RBBS_NOGRIPPER 256 +#define RBBIM_IDEALSIZE 512 +#define RBBIM_LPARAM 1024 +#define RBBIM_HEADERSIZE 2048 +#define RB_HITTEST (WM_USER+8) +#define RB_GETRECT (WM_USER+9) +#define RB_IDTOINDEX (WM_USER+16) +#define RB_GETTOOLTIPS (WM_USER+17) +#define RB_SETTOOLTIPS (WM_USER+18) +#define RB_SETBKCOLOR (WM_USER+19) +#define RB_GETBKCOLOR (WM_USER+20) +#define RB_SETTEXTCOLOR (WM_USER+21) +#define RB_GETTEXTCOLOR (WM_USER+22) +#define RB_SIZETORECT (WM_USER+23) +#define RB_BEGINDRAG (WM_USER+24) +#define RB_ENDDRAG (WM_USER+25) +#define RB_DRAGMOVE (WM_USER+26) +#define RB_GETBARHEIGHT (WM_USER+27) +#define RB_GETBANDINFOW (WM_USER+28) +#define RB_GETBANDINFOA (WM_USER+29) +#define RB_MINIMIZEBAND (WM_USER+30) +#define RB_MAXIMIZEBAND (WM_USER+31) +#define RB_GETDROPTARGET CCM_GETDROPTARGET +#define RB_GETBANDBORDERS (WM_USER+34) +#define RB_SHOWBAND (WM_USER+35) +#define RB_SETPALETTE (WM_USER+37) +#define RB_GETPALETTE (WM_USER+38) +#define RB_MOVEBAND (WM_USER+39) +#define RB_SETUNICODEFORMAT CCM_SETUNICODEFORMAT +#define RB_GETUNICODEFORMAT CCM_GETUNICODEFORMAT +#define RBN_GETOBJECT (RBN_FIRST-1) +#define RBN_LAYOUTCHANGED (RBN_FIRST-2) +#define RBN_AUTOSIZE (RBN_FIRST-3) +#define RBN_BEGINDRAG (RBN_FIRST-4) +#define RBN_ENDDRAG (RBN_FIRST-5) +#define RBN_DELETINGBAND (RBN_FIRST-6) +#define RBN_DELETEDBAND (RBN_FIRST-7) +#define RBN_CHILDSIZE (RBN_FIRST-8) +#define RBNM_ID 1 +#define RBNM_STYLE 2 +#define RBNM_LPARAM 4 +#define RBHT_NOWHERE 1 +#define RBHT_CAPTION 2 +#define RBHT_CLIENT 3 +#define RBHT_GRABBER 4 +#ifdef UNICODE +#define SB_SETTIPTEXT SB_SETTIPTEXTW +#define SB_GETTIPTEXT SB_GETTIPTEXTW +#define RB_GETBANDINFO RB_GETBANDINFOW +#else +#define SB_SETTIPTEXT SB_SETTIPTEXTA +#define SB_GETTIPTEXT SB_GETTIPTEXTA +#define RB_GETBANDINFO RB_GETBANDINFOA +#endif +#else +#define RB_GETBANDINFO (WM_USER+5) +#endif /* _WIN32_IE >= 0x0400 */ +#define CBEM_INSERTITEMA (WM_USER + 1) +#define CBEM_SETIMAGELIST (WM_USER + 2) +#define CBEM_GETIMAGELIST (WM_USER + 3) +#define CBEM_GETITEMA (WM_USER + 4) +#define CBEM_SETITEMA (WM_USER + 5) +#define CBEM_DELETEITEM CB_DELETESTRING +#define CBEM_GETCOMBOCONTROL (WM_USER + 6) +#define CBEM_GETEDITCONTROL (WM_USER + 7) +#define CBEM_SETEXSTYLE (WM_USER + 8) +#define CBEM_GETEXSTYLE (WM_USER + 9) +#if (_WIN32_IE >= 0x0400) +#define CBEM_SETEXTENDEDSTYLE (WM_USER + 14) +#define CBEM_GETEXTENDEDSTYLE (WM_USER + 9) +#define CBEM_SETUNICODEFORMAT CCM_SETUNICODEFORMAT +#define CBEM_GETUNICODEFORMAT CCM_GETUNICODEFORMAT +#endif /* _WIN32_IE >= 0x0400 */ +#define CBEM_HASEDITCHANGED (WM_USER + 10) +#define CBEM_INSERTITEMW (WM_USER + 11) +#define CBEM_SETITEMW (WM_USER + 12) +#define CBEM_GETITEMW (WM_USER + 13) +#define DA_LAST 0x7fffffff +#define DPA_APPEND 0x7fffffff +#define DPA_ERR -1 +#define DSA_APPEND 0x7fffffff +#define DSA_ERR -1 +#define DPAS_SORTED 1 +#define DPAS_INSERTBEFORE 2 +#define DPAS_INSERTAFTER 4 +#if (_WIN32_IE >= 0x400) +#define WSB_PROP_CYVSCROLL 1 +#define WSB_PROP_CXHSCROLL 2 +#define WSB_PROP_CYHSCROLL 4 +#define WSB_PROP_CXVSCROLL 8 +#define WSB_PROP_CXHTHUMB 16 +#define WSB_PROP_CYVTHUMB 32 +#define WSB_PROP_VBKGCOLOR 64 +#define WSB_PROP_HBKGCOLOR 128 +#define WSB_PROP_VSTYLE 256 +#define WSB_PROP_HSTYLE 512 +#define WSB_PROP_WINSTYLE 1024 +#define WSB_PROP_PALETTE 2048 +#define WSB_PROP_MASK 0xfff +#define FSB_FLAT_MODE 2 +#define FSB_ENCARTA_MODE 1 +#define FSB_REGULAR_MODE 0 +#endif /* _WIN32_IE >= 0x400 */ + +#ifndef RC_INVOKED +typedef struct tagCOMBOBOXEXITEMA{ + UINT mask; + int iItem; + LPSTR pszText; + int cchTextMax; + int iImage; + int iSelectedImage; + int iOverlay; + int iIndent; + LPARAM lParam; +} COMBOBOXEXITEMA, *PCOMBOBOXEXITEMA; +typedef COMBOBOXEXITEMA CONST *PCCOMBOEXITEMA; +typedef struct tagCOMBOBOXEXITEMW{ + UINT mask; + int iItem; + LPWSTR pszText; + int cchTextMax; + int iImage; + int iSelectedImage; + int iOverlay; + int iIndent; + LPARAM lParam; +} COMBOBOXEXITEMW, *PCOMBOBOXEXITEMW; +typedef COMBOBOXEXITEMW CONST *PCCOMBOEXITEMW; +#if (_WIN32_IE >= 0x0400) +typedef struct { + NMHDR hdr; + COMBOBOXEXITEMA ceItem; +} NMCOMBOBOXEXA, *PNMCOMBOBOXEXA; +typedef struct { + NMHDR hdr; + COMBOBOXEXITEMW ceItem; +} NMCOMBOBOXEXW, *PNMCOMBOBOXEXW; +typedef struct { + NMHDR hdr; + int iItemid; + WCHAR szText[CBEMAXSTRLEN]; +}NMCBEDRAGBEGINW, *LPNMCBEDRAGBEGINW, *PNMCBEDRAGBEGINW; +typedef struct { + NMHDR hdr; + int iItemid; + char szText[CBEMAXSTRLEN]; +}NMCBEDRAGBEGINA, *LPNMCBEDRAGBEGINA, *PNMCBEDRAGBEGINA; +typedef struct tagNMIPADDRESS{ + NMHDR hdr; + int iField; + int iValue; +} NMIPADDRESS, *LPNMIPADDRESS; +typedef struct tagLVKEYDOWN { + NMHDR hdr; + WORD wVKey; + UINT flags; +} NMLVKEYDOWN, *LPNMLVKEYDOWN; +typedef struct { + NMHDR hdr; + DWORD dwFlag; + int iWidth; + int iHeight; +} NMPGCALCSIZE, *LPNMPGCALCSIZE; +typedef struct { + NMHDR hdr; + BOOL fwKeys; + RECT rcParent; + int iDir; + int iXpos; + int iYpos; + int iScroll; +} NMPGSCROLL, *LPNMPGSCROLL; +typedef struct tagNMSELCHANGE { + NMHDR nmhdr; + SYSTEMTIME stSelStart; + SYSTEMTIME stSelEnd; +} NMSELCHANGE, *LPNMSELCHANGE; +typedef struct tagNMTBHOTITEM { + NMHDR hdr; + int idOld; + int idNew; + DWORD dwFlags; +} NMTBHOTITEM, *LPNMTBHOTITEM; +typedef struct { + NMHDR hdr; + DWORD dwMask; + int idCommand; + DWORD_PTR lParam; + int iImage; + LPSTR pszText; + int cchText; +} NMTBDISPINFOA, *LPNMTBDISPINFOA; +typedef struct { + NMHDR hdr; + DWORD dwMask; + int idCommand; + DWORD_PTR lParam; + int iImage; + LPWSTR pszText; + int cchText; +} NMTBDISPINFOW, *LPNMTBDISPINFOW; +typedef struct tagNMMOUSE { + NMHDR hdr; + DWORD_PTR dwItemSpec; + DWORD_PTR dwItemData; + POINT pt; + LPARAM dwHitInfo; +} NMMOUSE, *LPNMMOUSE; +#endif /*_WIN32_IE >= 0x0400 */ +#if (_WIN32_IE >= 0x0401) +typedef struct tagNMTOOLTIPSCREATED +{ + NMHDR hdr; + HWND hwndToolTips; +} NMTOOLTIPSCREATED, *LPNMTOOLTIPSCREATED; +#endif +typedef struct tagNMDATETIMECHANGE +{ + NMHDR nmhdr; + DWORD dwFlags; + SYSTEMTIME st; +} NMDATETIMECHANGE, *LPNMDATETIMECHANGE; +typedef struct { + NMHDR hdr; + BOOL fChanged; + int iNewSelection; + WCHAR szText[CBEMAXSTRLEN]; + int iWhy; +} NMCBEENDEDITW, *LPNMCBEENDEDITW, *PNMCBEENDEDITW; +typedef struct { + NMHDR hdr; + BOOL fChanged; + int iNewSelection; + char szText[CBEMAXSTRLEN]; + int iWhy; +} NMCBEENDEDITA, *LPNMCBEENDEDITA,*PNMCBEENDEDITA; +typedef struct _COLORMAP { + COLORREF from; + COLORREF to; +} COLORMAP,*LPCOLORMAP; +typedef struct { + UINT uNotification; + HWND hWnd; + POINT ptCursor; +} DRAGLISTINFO,*LPDRAGLISTINFO; +typedef struct _TBBUTTON { + int iBitmap; + int idCommand; + BYTE fsState; + BYTE fsStyle; + BYTE bReserved[2]; + DWORD dwData; + int iString; +} TBBUTTON,*PTBBUTTON,*LPTBBUTTON; +typedef const TBBUTTON *LPCTBBUTTON; +#if _WIN32_IE >= 0x400 +typedef struct { + UINT cbSize; + DWORD dwMask; + int idCommand; + int iImage; + BYTE fsState; + BYTE fsStyle; + WORD cx; + DWORD lParam; + LPSTR pszText; + int cchText; +} TBBUTTONINFOA, *LPTBBUTTONINFOA; +typedef struct { + UINT cbSize; + DWORD dwMask; + int idCommand; + int iImage; + BYTE fsState; + BYTE fsStyle; + WORD cx; + DWORD lParam; + LPWSTR pszText; + int cchText; +} TBBUTTONINFOW, *LPTBBUTTONINFOW; +typedef struct { + int iButton; + DWORD dwFlags; +} TBINSERTMARK, *LPTBINSERTMARK; +typedef struct tagLVBKIMAGEA { + ULONG ulFlags; + HBITMAP hbm; + LPSTR pszImage; + UINT cchImageMax; + int xOffsetPercent; + int yOffsetPercent; +} LVBKIMAGEA, *LPLVBKIMAGEA; +typedef struct tagLVBKIMAGEW { + ULONG ulFlags; + HBITMAP hbm; + LPWSTR pszImage; + UINT cchImageMax; + int xOffsetPercent; + int yOffsetPercent; +} LVBKIMAGEW, *LPLVBKIMAGEW; +#endif /* _WIN32_IE >= 0x400 */ +typedef struct { + NMHDR hdr; + int iItem; + TBBUTTON tbButton; + int cchText; + LPTSTR pszText; +} TBNOTIFY,*LPTBNOTIFY; +typedef struct { + HKEY hkr; + LPCTSTR pszSubKey; + LPCTSTR pszValueName; +} TBSAVEPARAMS; +typedef struct _IMAGEINFO { + HBITMAP hbmImage; + HBITMAP hbmMask; + int Unused1; + int Unused2; + RECT rcImage; +} IMAGEINFO, *LPIMAGEINFO; +typedef struct _IMAGELIST *HIMAGELIST; +typedef struct _HDITEMA { + UINT mask; + int cxy; + LPSTR pszText; + HBITMAP hbm; + int cchTextMax; + int fmt; + LPARAM lParam; +#if (_WIN32_IE >= 0x0300) + int iImage; + int iOrder; +#endif +#if (_WIN32_IE >= 0x0500) + UINT type; + LPVOID pvFilter; +#endif +} HDITEMA, * LPHDITEMA; +typedef struct _HDITEMW { + UINT mask; + int cxy; + LPWSTR pszText; + HBITMAP hbm; + int cchTextMax; + int fmt; + LPARAM lParam; +#if (_WIN32_IE >= 0x0300) + int iImage; + int iOrder; +#endif +#if (_WIN32_IE >= 0x0500) + UINT type; + LPVOID pvFilter; +#endif +} HDITEMW, * LPHDITEMW; +/* for backward compatability */ +#define HD_ITEMA HDITEMA +#define HD_ITEMW HDITEMW +#define HD_ITEM HDITEM +typedef struct _HD_LAYOUT { + RECT *prc; + WINDOWPOS *pwpos; +} HDLAYOUT, *LPHDLAYOUT; +#define HD_LAYOUT HDLAYOUT /* backward compatability */ +typedef struct _HD_HITTESTINFO { + POINT pt; + UINT flags; + int iItem; +} HD_HITTESTINFO, *LPHDHITTESTINFO; +typedef struct _HD_NOTIFYA { + NMHDR hdr; + int iItem; + int iButton; + HD_ITEMA *pitem; +} HD_NOTIFYA; +typedef struct _HD_NOTIFYW { + NMHDR hdr; + int iItem; + int iButton; + HD_ITEMW *pitem; +} HD_NOTIFYW; +/* FIXME: NMHEADER structure (base for all events of the comctl controls) + is the same as HD_NOTIFY depending on the value of _WIN32_IE macro. + I'm defining both for now. */ +typedef struct _NMHEADERA { + NMHDR hdr; + int iItem; + int iButton; + HD_ITEMA* pitem; +} NMHEADERA, *LPNMHEADERA; + +typedef struct _NMHEADERW { + NMHDR hdr; + int iItem; + int iButton; + HD_ITEMW* pitem; +} NMHEADERW, *LPNMHEADERW; +#ifdef UNICODE +#define NMHEADER NMHEADERW +#define LPNMHEADER LPNMHEADERW +#else +#define NMHEADER NMHEADERA +#define LPNMHEADER LPNMHEADERA +#endif +/* End FIXME. */ +typedef struct tagNMHDDISPINFOA { + NMHDR hdr; + int iItem; + UINT mask; + LPSTR pszText; + int cchTextMax; + int iImage; + LPARAM lParam; +} NMHDDISPINFOA, *LPNMHDDISPINFOA; +typedef struct tagNMHDDISPINFOW { + NMHDR hdr; + int iItem; + UINT mask; + LPWSTR pszText; + int cchTextMax; + int iImage; + LPARAM lParam; +} NMHDDISPINFOW, *LPNMHDDISPINFOW; +typedef struct tagNMCUSTOMDRAWINFO { + NMHDR hdr; + DWORD dwDrawStage; + HDC hdc; + RECT rc; + DWORD dwItemSpec; + UINT uItemState; + LPARAM lItemlParam; +} NMCUSTOMDRAW, *LPNMCUSTOMDRAW; +typedef struct tagNMLVCUSTOMDRAW { + NMCUSTOMDRAW nmcd; + COLORREF clrText; + COLORREF clrTextBk; +#if _WIN32_IE >= 0x0400 + int iSubItem; +#endif +} NMLVCUSTOMDRAW, *LPNMLVCUSTOMDRAW; +#if (_WIN32_IE >= 0x0400) +typedef struct tagNMLVGETINFOTIPA +{ + NMHDR hdr; + DWORD dwFlags; + LPSTR pszText; + int cchTextMax; + int iItem; + int iSubItem; + LPARAM lParam; +} NMLVGETINFOTIPA, *LPNMLVGETINFOTIPA; +typedef struct tagNMLVGETINFOTIPW +{ + NMHDR hdr; + DWORD dwFlags; + LPWSTR pszText; + int cchTextMax; + int iItem; + int iSubItem; + LPARAM lParam; +} NMLVGETINFOTIPW, *LPNMLVGETINFOTIPW; +#endif /* _WIN32_IE >= 0x0400 */ +typedef struct tagNMTVCUSTOMDRAW { + NMCUSTOMDRAW nmcd; + COLORREF clrText; + COLORREF clrTextBk; +#if _WIN32_IE >= 0x0400 + int iLevel; +#endif +} NMTVCUSTOMDRAW, *LPNMTVCUSTOMDRAW; +#if (_WIN32_IE >= 0x400) +typedef struct _NMTBCUSTOMDRAW { + NMCUSTOMDRAW nmcd; + HBRUSH hbrMonoDither; + HBRUSH hbrLines; + HPEN hpenLines; + COLORREF clrText; + COLORREF clrMark; + COLORREF clrTextHighlight; + COLORREF clrBtnFace; + COLORREF clrBtnHighlight; + COLORREF clrHighlightHotTrack; + RECT rcText; + int nStringBkMode; + int nHLStringBkMode; +#if (_WIN32_WINNT >= 0x0501) + int iListGap; +#endif +} NMTBCUSTOMDRAW, * LPNMTBCUSTOMDRAW; +typedef struct tagNMITEMACTIVATE { + NMHDR hdr; + int iItem; + int iSubItem; + UINT uNewState; + UINT uOldState; + UINT uChanged; + POINT ptAction; + LPARAM lParam; + UINT uKeyFlags; +} NMITEMACTIVATE, *LPNMITEMACTIVATE; +#endif /* _WIN32_IE >= 0x0400 */ +typedef struct tagTBADDBITMAP { + HINSTANCE hInst; + UINT nID; +} TBADDBITMAP,*LPTBADDBITMAP; +typedef struct tagTBSAVEPARAMSA { + HKEY hkr; + LPCSTR pszSubKey; + LPCSTR pszValueName; +} TBSAVEPARAMSA; +typedef struct tagTBSAVEPARAMSW { + HKEY hkr; + LPCWSTR pszSubKey; + LPCWSTR pszValueName; +} TBSAVEPARAMSW; +typedef struct { + HINSTANCE hInstOld; + UINT nIDOld; + HINSTANCE hInstNew; + UINT nIDNew; + int nButtons; +} TBREPLACEBITMAP,*LPTBREPLACEBITMAP; +typedef struct tagNMTOOLBARA { + NMHDR hdr; + int iItem; + TBBUTTON tbButton; + int cchText; + LPSTR pszText; +#if (_WIN32_IE >= 0x500) + RECT rcButton; +#endif +} NMTOOLBARA, *LPNMTOOLBARA; +#define TBNOTIFYA NMTOOLBARA +#define LPTBNOTIFYA LPNMTOOLBARA +typedef struct tagNMTOOLBARW { + NMHDR hdr; + int iItem; + TBBUTTON tbButton; + int cchText; + LPWSTR pszText; +#if (_WIN32_IE >= 0x500) + RECT rcButton; +#endif +} NMTOOLBARW, *LPNMTOOLBARW; +#define TBNOTIFYW NMTOOLBARW +#define LPTBNOTIFYW LPNMTOOLBARW +typedef struct tagTOOLINFOA { + UINT cbSize; + UINT uFlags; + HWND hwnd; + UINT uId; + RECT rect; + HINSTANCE hinst; + LPSTR lpszText; +#if (_WIN32_IE >= 0x0300) + LPARAM lParam; +#endif +} TTTOOLINFOA,*LPTTTOOLINFOA,*PTOOLINFOA; +#define TOOLINFOA TTTOOLINFOA +#define LPTOOLINFOA LPTTTOOLINFOA +#define TTTOOLINFOA_V1_SIZE CCSIZEOF_STRUCT(TTTOOLINFOA, lpszText) +#define TTTOOLINFOA_V2_SIZE CCSIZEOF_STRUCT(TTTOOLINFOA, lParam) +#define TTTOOLINFOA_V3_SIZE CCSIZEOF_STRUCT(TTTOOLINFOA, lpReserved) +typedef struct tagTOOLINFOW { + UINT cbSize; + UINT uFlags; + HWND hwnd; + UINT uId; + RECT rect; + HINSTANCE hinst; + LPWSTR lpszText; +#if (_WIN32_IE >= 0x0300) + LPARAM lParam; +#endif +} TTTOOLINFOW,*LPTTTOOLINFOW,*PTOOLINFOW; +#define TOOLINFOW TTTOOLINFOW +#define LPTOOLINFOW LPTTTOOLINFOW +#define TTTOOLINFOW_V1_SIZE CCSIZEOF_STRUCT(TTTOOLINFOW, lpszText) +#define TTTOOLINFOW_V2_SIZE CCSIZEOF_STRUCT(TTTOOLINFOW, lParam) +#define TTTOOLINFOW_V3_SIZE CCSIZEOF_STRUCT(TTTOOLINFOW, lpReserved) +typedef struct _TT_HITTESTINFOA { + HWND hwnd; + POINT pt; + TOOLINFOA ti; +} TTHITTESTINFOA,*LPTTHITTESTINFOA; +#define LPHITTESTINFOA LPTTHITTESTINFOA +typedef struct _TT_HITTESTINFOW { + HWND hwnd; + POINT pt; + TOOLINFOW ti; +} TTHITTESTINFOW,*LPTTHITTESTINFOW; +#define LPHITTESTINFOW LPTTHITTESTINFOW +typedef struct tagNMTTDISPINFOA { + NMHDR hdr; + LPSTR lpszText; + char szText[80]; + HINSTANCE hinst; + UINT uFlags; +#if (_WIN32_IE >= 0x0300) + LPARAM lParam; +#endif +} NMTTDISPINFOA, *LPNMTTDISPINFOA; +#define TOOLTIPTEXTA NMTTDISPINFOA +#define LPTOOLTIPTEXTA LPNMTTDISPINFOA +typedef struct tagNMTTDISPINFOW { + NMHDR hdr; + LPWSTR lpszText; + WCHAR szText[80]; + HINSTANCE hinst; + UINT uFlags; +#if (_WIN32_IE >= 0x0300) + LPARAM lParam; +#endif +} NMTTDISPINFOW, *LPNMTTDISPINFOW; +#define TOOLTIPTEXTW NMTTDISPINFOW +#define LPTOOLTIPTEXTW LPNMTTDISPINFOW +typedef struct _UDACCEL { + UINT nSec; + UINT nInc; +} UDACCEL,*LPUDACCEL; +typedef struct _NM_UPDOWN { + NMHDR hdr; + int iPos; + int iDelta; +} NMUPDOWN,*LPNMUPDOWN; +/* for backward compatability */ +#define NM_UPDOWN NMUPDOWN +#define LPNM_UPDOWN LPNMUPDOWN +typedef struct _LVITEMA { + UINT mask; + int iItem; + int iSubItem; + UINT state; + UINT stateMask; + LPSTR pszText; + int cchTextMax; + int iImage; + LPARAM lParam; +#if (_WIN32_IE >= 0x0300) + int iIndent; +#endif +#if (_WIN32_WINNT >= 0x0501) + int iGroupId; + UINT cColumns; + PUINT puColumns; +#endif +} LVITEMA, FAR *LPLVITEMA; +#define _LV_ITEMA _LVITEMA +#define LV_ITEMA LVITEMA +typedef struct _LVITEMW { + UINT mask; + int iItem; + int iSubItem; + UINT state; + UINT stateMask; + LPWSTR pszText; + int cchTextMax; + int iImage; + LPARAM lParam; +#if (_WIN32_IE >= 0x0300) + int iIndent; +#endif +#if (_WIN32_WINNT >= 0x0501) + int iGroupId; + UINT cColumns; + PUINT puColumns; +#endif +} LVITEMW, FAR *LPLVITEMW; +#define _LV_ITEMW _LVITEMW +#define LV_ITEMW LVITEMW +typedef struct tagLVFINDINFOA { + UINT flags; + LPCSTR psz; + LPARAM lParam; + POINT pt; + UINT vkDirection; +} LVFINDINFOA, FAR* LPFINDINFOA; +#define _LV_FINDINFOA tagLVFINDINFOA +#define LV_FINDINFOA LVFINDINFOA +typedef struct tagLVFINDINFOW { + UINT flags; + LPCWSTR psz; + LPARAM lParam; + POINT pt; + UINT vkDirection; +} LVFINDINFOW, FAR* LPFINDINFOW; +#define _LV_FINDINFOW tagLVFINDINFOW +#define LV_FINDINFOW LVFINDINFOW +typedef struct _LVHITTESTINFO { + POINT pt; + UINT flags; + int iItem; +#if (_WIN32_IE >= 0x0300) + int iSubItem; +#endif +} LVHITTESTINFO, FAR *LPLVHITTESTINFO; +#define _LV_HITTESTINFO _LVHITTESTINFO +#define LV_HITTESTINFO LVHITTESTINFO +typedef struct _LVCOLUMNA { + UINT mask; + int fmt; + int cx; + LPSTR pszText; + int cchTextMax; + int iSubItem; +#if (_WIN32_IE >= 0x0300) + int iImage; + int iOrder; +#endif +} LVCOLUMNA, FAR *LPLVCOLUMNA; +#define _LV_COLUMNA _LVCOLUMNA +#define LV_COLUMNA LVCOLUMNA +typedef struct _LVCOLUMNW { + UINT mask; + int fmt; + int cx; + LPWSTR pszText; + int cchTextMax; + int iSubItem; +#if (_WIN32_IE >= 0x0300) + int iImage; + int iOrder; +#endif +} LVCOLUMNW, FAR *LPLVCOLUMNW; +#define _LV_COLUMNW _LVCOLUMNW +#define LV_COLUMNW LVCOLUMNW +typedef int(CALLBACK *PFNLVCOMPARE)(LPARAM,LPARAM,LPARAM); +typedef struct tagNMLISTVIEW { + NMHDR hdr; + int iItem; + int iSubItem; + UINT uNewState; + UINT uOldState; + UINT uChanged; + POINT ptAction; + LPARAM lParam; +} NMLISTVIEW, *LPNMLISTVIEW; +/* for backward compatability */ +#define _NM_LISTVIEW tagNMLISTVIEW +#define NM_LISTVIEW NMLISTVIEW +#define LPNM_LISTVIEW LPNMLISTVIEW +typedef struct tagNMLVDISPINFOA { + NMHDR hdr; + LV_ITEMA item; +} NMLVDISPINFOA, FAR *LPNMLVDISPINFOA; +#define _LV_DISPINFOA tagNMLVDISPINFOA +#define LV_DISPINFOA NMLVDISPINFOA +typedef struct tagNMLVDISPINFOW { + NMHDR hdr; + LV_ITEMW item; +} NMLVDISPINFOW, FAR *LPNMLVDISPINFOW; +#define _LV_DISPINFOW tagNMLVDISPINFOW +#define LV_DISPINFOW NMLVDISPINFOW +typedef struct _LV_KEYDOWN { + NMHDR hdr; + WORD wVKey; + UINT flags; +} LV_KEYDOWN; +typedef struct tagNMLVCACHEHINT { + NMHDR hdr; + int iFrom; + int iTo; +} NMLVCACHEHINT, *PNMLVCACHEHINT; +#define NM_CACHEHINT NMLVCACHEHINT +typedef struct _TREEITEM *HTREEITEM; +typedef struct tagTVITEMA { + UINT mask; + HTREEITEM hItem; + UINT state; + UINT stateMask; + LPSTR pszText; + int cchTextMax; + int iImage; + int iSelectedImage; + int cChildren; + LPARAM lParam; +} TVITEMA,*LPTVITEMA; +#define _TV_ITEMA tagTVITEMA +#define TV_ITEMA TVITEMA +#define LPTV_ITEMA LPTVITEMA +typedef struct tagTVITEMW { + UINT mask; + HTREEITEM hItem; + UINT state; + UINT stateMask; + LPWSTR pszText; + int cchTextMax; + int iImage; + int iSelectedImage; + int cChildren; + LPARAM lParam; +} TVITEMW,*LPTVITEMW; +#define _TV_ITEMW tagTVITEMW +#define TV_ITEMW TVITEMW +#define LPTV_ITEMW LPTVITEMW +#if (_WIN32_IE >= 0x0400) +typedef struct tagTVITEMEXA { + UINT mask; + HTREEITEM hItem; + UINT state; + UINT stateMask; + LPSTR pszText; + int cchTextMax; + int iImage; + int iSelectedImage; + int cChildren; + LPARAM lParam; + int iIntegral; +} TVITEMEXA, *LPTVITEMEXA; +typedef struct tagTVITEMEXW { + UINT mask; + HTREEITEM hItem; + UINT state; + UINT stateMask; + LPWSTR pszText; + int cchTextMax; + int iImage; + int iSelectedImage; + int cChildren; + LPARAM lParam; + int iIntegral; +} TVITEMEXW, *LPTVITEMEXW; +#endif /* _WIN32_IE >= 0x0400 */ +typedef struct tagTVINSERTSTRUCTA { + HTREEITEM hParent; + HTREEITEM hInsertAfter; +#if (_WIN32_IE >= 0x0400) + _ANONYMOUS_UNION union { + TVITEMEXA itemex; + TV_ITEMA item; + } DUMMYUNIONNAME; +#else + TV_ITEMA item; +#endif +} TVINSERTSTRUCTA,*LPTVINSERTSTRUCTA; +#define _TV_INSERTSTRUCTA tagTVINSERTSTRUCTA +#define TV_INSERTSTRUCTA TVINSERTSTRUCTA +#define LPTV_INSERTSTRUCTA LPTVINSERTSTRUCTA +typedef struct tagTVINSERTSTRUCTW { + HTREEITEM hParent; + HTREEITEM hInsertAfter; +#if (_WIN32_IE >= 0x0400) + _ANONYMOUS_UNION union { + TVITEMEXW itemex; + TV_ITEMW item; + } DUMMYUNIONNAME; +#else + TV_ITEMW item; +#endif +} TVINSERTSTRUCTW,*LPTVINSERTSTRUCTW; +#define _TV_INSERTSTRUCTW tagTVINSERTSTRUCTW +#define TV_INSERTSTRUCTW TVINSERTSTRUCTW +#define LPTV_INSERTSTRUCTW LPTVINSERTSTRUCTW +typedef struct tagTVHITTESTINFO { + POINT pt; + UINT flags; + HTREEITEM hItem; +} TVHITTESTINFO, *LPTVHITTESTINFO; +#define _TV_HITTESTINFO tagTVHITTESTINFO +#define TV_HITTESTINFO TVHITTESTINFO +#define LPTV_HITTESTINFO LPTVHITTESTINFO +typedef int(CALLBACK *PFNTVCOMPARE)(LPARAM,LPARAM,LPARAM); +typedef struct tagTVSORTCB { + HTREEITEM hParent; + PFNTVCOMPARE lpfnCompare; + LPARAM lParam; +} TVSORTCB,*LPTVSORTCB; +#define _TV_SORTCB tagTVSORTCB +#define TV_SORTCB TVSORTCB +#define LPTV_SORTCB LPTVSORTCB +typedef struct tagNMTREEVIEWA { + NMHDR hdr; + UINT action; + TV_ITEMA itemOld; + TV_ITEMA itemNew; + POINT ptDrag; +} NMTREEVIEWA,*LPNMTREEVIEWA; +#define _NM_TREEVIEWA tagNMTREEVIEWA +#define NM_TREEVIEWA NMTREEVIEWA +#define LPNM_TREEVIEWA LPNMTREEVIEWA +typedef struct tagNMTREEVIEWW { + NMHDR hdr; + UINT action; + TV_ITEMW itemOld; + TV_ITEMW itemNew; + POINT ptDrag; +} NMTREEVIEWW,*LPNMTREEVIEWW; +#define _NM_TREEVIEWW tagNMTREEVIEWW +#define NM_TREEVIEWW NMTREEVIEWW +#define LPNM_TREEVIEWW LPNMTREEVIEWW +typedef struct tagNMTVDISPINFOA { + NMHDR hdr; + TVITEMA item; +} NMTVDISPINFOA, *LPNMTVDISPINFOA; +#define _TV_DISPINFOA tagNMTVDISPINFOA +#define TV_DISPINFOA NMTVDISPINFOA +typedef struct tagNMTVDISPINFOW { + NMHDR hdr; + TVITEMW item; +} NMTVDISPINFOW, *LPNMTVDISPINFOW; +#define _TV_DISPINFOW tagNMTVDISPINFOW +#define TV_DISPINFOW NMTVDISPINFOW +#if (_WIN32_IE >= 0x0400) +typedef struct tagNMTVGETINFOTIPA { + NMHDR hdr; + LPSTR pszText; + int cchTextMax; + HTREEITEM hItem; + LPARAM lParam; +} NMTVGETINFOTIPA, *LPNMTVGETINFOTIPA; +typedef struct tagNMTVGETINFOTIPW { + NMHDR hdr; + LPWSTR pszText; + int cchTextMax; + HTREEITEM hItem; + LPARAM lParam; +} NMTVGETINFOTIPW, *LPNMTVGETINFOTIPW; +#endif +typedef struct _TV_KEYDOWN { + NMHDR hdr; + WORD wVKey; + UINT flags; +} TV_KEYDOWN; +typedef struct _TC_ITEMHEADERA { + UINT mask; + UINT lpReserved1; + UINT lpReserved2; + LPSTR pszText; + int cchTextMax; + int iImage; +} TC_ITEMHEADERA; +typedef struct _TC_ITEMHEADERW { + UINT mask; + UINT lpReserved1; + UINT lpReserved2; + LPWSTR pszText; + int cchTextMax; + int iImage; +} TC_ITEMHEADERW; +typedef struct tagTCITEMA { + UINT mask; +#if (_WIN32_IE >= 0x0300) + DWORD dwState; + DWORD dwStateMask; +#else + UINT lpReserved1; + UINT lpReserved2; +#endif + LPSTR pszText; + int cchTextMax; + int iImage; + LPARAM lParam; +} TCITEMA, *LPTCITEMA; +#define TC_ITEMA TCITEMA +typedef struct tagTCITEMW { + UINT mask; +#if (_WIN32_IE >= 0x0300) + DWORD dwState; + DWORD dwStateMask; +#else + UINT lpReserved1; + UINT lpReserved2; +#endif + LPWSTR pszText; + int cchTextMax; + int iImage; + LPARAM lParam; +} TCITEMW, *LPTCITEMW; +#define TC_ITEMW TCITEMW +typedef struct tagTCHITTESTINFO { + POINT pt; + UINT flags; +} TCHITTESTINFO, *LPTCHITTESTINFO; +#define TC_HITTESTINFO TCHITTESTINFO +#define LPTC_HITTESTINFO LPTCHITTESTINFO +typedef struct _TC_KEYDOWN { + NMHDR hdr; + WORD wVKey; + UINT flags; +} TC_KEYDOWN; +#if (_WIN32_IE >= 0x0300) +typedef struct tagINITCOMMONCONTROLSEX { + DWORD dwSize; + DWORD dwICC; +} INITCOMMONCONTROLSEX,*LPINITCOMMONCONTROLSEX; +#endif +typedef struct tagPBRANGE { + int iLow; + int iHigh; +} PBRANGE,*PPBRANGE; +typedef struct tagCOLORSCHEME { + DWORD dwSize; + COLORREF clrBtnHighlight; + COLORREF clrBtnShadow; +} COLORSCHEME,*LPCOLORSCHEME; +typedef struct tagMCHITTESTINFO { + UINT cbSize; + POINT pt; + UINT uHit; + SYSTEMTIME st; +}MCHITTESTINFO, *PMCHITTESTINFO; +typedef DWORD MONTHDAYSTATE; +typedef MONTHDAYSTATE *LPMONTHDAYSTATE; +typedef struct tagNMDAYSTATE { + NMHDR nmhdr; + SYSTEMTIME stStart; + int cDayState; + LPMONTHDAYSTATE prgDayState; +}NMDAYSTATE,*LPNMDAYSTATE; +typedef struct tagREBARINFO { + UINT cbSize; + UINT fMask; + HIMAGELIST himl; +} REBARINFO,*LPREBARINFO; +typedef struct tagREBARBANDINFOA { + UINT cbSize; + UINT fMask; + UINT fStyle; + COLORREF clrFore; + COLORREF clrBack; + LPSTR lpText; + UINT cch; + int iImage; + HWND hwndChild; + UINT cxMinChild; + UINT cyMinChild; + UINT cx; + HBITMAP hbmBack; + UINT wID; +#if (_WIN32_IE >= 0x0400) + UINT cyChild; + UINT cyMaxChild; + UINT cyIntegral; + UINT cxIdeal; + LPARAM lParam; + UINT cxHeader; +#endif +} REBARBANDINFOA,*LPREBARBANDINFOA; +typedef struct tagREBARBANDINFOW { + UINT cbSize; + UINT fMask; + UINT fStyle; + COLORREF clrFore; + COLORREF clrBack; + LPWSTR lpText; + UINT cch; + int iImage; + HWND hwndChild; + UINT cxMinChild; + UINT cyMinChild; + UINT cx; + HBITMAP hbmBack; + UINT wID; +#if (_WIN32_IE >= 0x0400) + UINT cyChild; + UINT cyMaxChild; + UINT cyIntegral; + UINT cxIdeal; + LPARAM lParam; + UINT cxHeader; +#endif +} REBARBANDINFOW,*LPREBARBANDINFOW; +typedef REBARBANDINFOA const *LPCREBARBANDINFOA; +typedef REBARBANDINFOW const *LPCREBARBANDINFOW; +#define REBARBANDINFOA_V3_SIZE CCSIZEOF_STRUCT(REBARBANDINFOA,wID) +#define REBARBANDINFOW_V3_SIZE CCSIZEOF_STRUCT(REBARBANDINFOW, wID) +#if (_WIN32_IE >= 0x0300) +typedef struct tagIMAGELISTDRAWPARAMS { + DWORD cbSize; + HIMAGELIST himl; + int i; + HDC hdcDst; + int x; + int y; + int cx; + int cy; + int xBitmap; + int yBitmap; + COLORREF rgbBk; + COLORREF rgbFg; + UINT fStyle; + DWORD dwRop; +#if (_WIN32_WINNT >= 0x0501) + DWORD fState; + DWORD Frame; + COLORREF crEffect; +#endif +} IMAGELISTDRAWPARAMS,*LPIMAGELISTDRAWPARAMS; +#endif /* (_WIN32_IE >= 0x0300) */ +#if (_WIN32_IE >= 0x0400) +typedef struct tagNMREBARCHILDSIZE { + NMHDR hdr; + UINT uBand; + UINT wID; + RECT rcChild; + RECT rcBand; +} NMREBARCHILDSIZE,*LPNMREBARCHILDSIZE; +typedef struct tagNMREBAR { + NMHDR hdr; + DWORD dwMask; + UINT uBand; + UINT fStyle; + UINT wID; + LPARAM lParam; +} NMREBAR,*LPNMREBAR; +typedef struct tagNMRBAUTOSIZE { + NMHDR hdr; + BOOL fChanged; + RECT rcTarget; + RECT rcActual; +} NMRBAUTOSIZE,*LPNMRBAUTOSIZE; +#if (_WIN32_IE >= 0x0500) +typedef struct tagNMREBARCHEVRON { + NMHDR hdr; + UINT uBand; + UINT wID; + LPARAM lParam; + RECT rc; + LPARAM lParamNM; +} NMREBARCHEVRON, *LPNMREBARCHEVRON; +#endif +typedef struct _RB_HITTESTINFO { + POINT pt; + UINT flags; + int iBand; +} RBHITTESTINFO,*LPRBHITTESTINFO; +#endif +typedef struct _DSA *HDSA; +typedef struct _DPA *HDPA; +typedef INT (CALLBACK *PFNDPAENUMCALLBACK)(PVOID,PVOID); +typedef INT (CALLBACK *PFNDSAENUMCALLBACK)(PVOID,PVOID); +typedef INT (CALLBACK *PFNDPACOMPARE)(PVOID,PVOID,LPARAM); +#if (_WIN32_WINNT >= 0x0501) +typedef LRESULT (CALLBACK *SUBCLASSPROC)(HWND,UINT,WPARAM,LPARAM,UINT_PTR,DWORD_PTR); +#endif /* _WIN32_WINNT >= 0x0501 */ + +#define INDEXTOOVERLAYMASK(i) ((i)<<8) +#define INDEXTOSTATEIMAGEMASK(i) ((i)<<12) +#define HANDLE_WM_NOTIFY(h,w,l,f) (f)((h),(int)(w),(NMHDR*)(l)) +#define FORWARD_WM_NOTIFY(h,i,p,f) (LRESULT)(f)((h),WM_NOTIFY,(WPARAM)(int)(i),(LPARAM)(NMHDR*)(p)) +#define CCSIZEOF_STRUCT(s,m) (((int)((PBYTE)(&((s*)0)->m)-((PBYTE)((s*)0))))+sizeof(((s*)0)->m)) +#define MAKEIPADDRESS(b1,b2,b3,b4) ((LPARAM)(((DWORD)(b1)<<24)+((DWORD)(b2)<<16)+((DWORD)(b3)<<8)+((DWORD)(b4)))) +#define MAKEIPRANGE(low,high) ((LPARAM)(WORD)(((BYTE)(high)<<8)+(BYTE)(low))) +#define FIRST_IPADDRESS(a) ((a>>24) & 0xff) +#define SECOND_IPADDRESS(a) ((a>>16) & 0xff) +#define THIRD_IPADDRESS(a) ((a>>8) & 0xff) +#define FOURTH_IPADDRESS(a) (a & 0xff) +#define Animate_Create(w,i,s,hI) CreateWindow(ANIMATE_CLASS,NULL,s,0,0,0,0,w,(HMENU)(i),hI,NULL) +#define Animate_Open(w,f) (BOOL)SNDMSG(w,ACM_OPEN,0,(LPARAM)f) +#define Animate_Play(w,f,t,r) (BOOL)SNDMSG(w,ACM_PLAY,(r),(LPARAM)MAKELONG(f,t)) +#define Animate_Stop(w) (BOOL)SNDMSG(w,ACM_STOP,0,0) +#define Animate_Close(w) Animate_Open(w,NULL) +#define Animate_Seek(w,f) Animate_Play(w,f,f,1) +HBITMAP WINAPI CreateMappedBitmap(HINSTANCE,int,UINT,LPCOLORMAP,int); +HWND WINAPI CreateStatusWindowA(LONG,LPCSTR,HWND,UINT); +HWND WINAPI CreateStatusWindowW(LONG,LPCWSTR,HWND,UINT); +HWND WINAPI CreateToolbarEx(HWND,DWORD,UINT,int,HINSTANCE,UINT,LPCTBBUTTON,int,int,int,int,int,UINT); +HWND WINAPI CreateUpDownControl(DWORD,int,int,int,int,HWND,int,HINSTANCE,HWND,int,int,int); +#define DateTime_GetMonthCal(hwnd) SNDMSG(hwnd, DTM_GETMONTHCAL, 0, 0) +#define DateTime_GetMonthCalColor(hwnd, icolor) SNDMSG(hwnd, DTM_GETMONTHCAL, (WPARAM)icolor,0) +#define DateTime_GetMonthCalFont(hwnd) SNDMSG(hwnd,DTM_GETMCFONT,0,0) +#define DateTime_GetRange(hwnd,lpsystimearray) SNDMSG(hwnd,DTM_GETRANGE,0,(LPARAM)lpsystimearray) +#define DateTime_GetSystemTime(hwnd,lpsystime) SNDMSG(hwnd,DTM_GETSYSTEMTIME,0,(LPARAM)lpsystime) +#define DateTime_SetFormat(hwnd,lpszformat) SNDMSG(hwnd,DTM_SETFORMAT,0,(LPARAM)lpszformat) +#define DateTime_SetMonthCalColor(hwnd,icolor,clr) SNDMSG(hwnd,DTM_SETMCCOLOR,(WPARAM)icolor,(LPARAM)clr) +#define DateTime_SetMonthCalFont(hwnd,hfont,lparam) SNDMSG(hwnd,DTM_SETMCFONT,(WPARAM)hfont,(LPARAM)lparam) +#define DateTime_SetRange(hwnd,flags,lpsystimearray) SNDMSG(hwnd,DTM_SETRANGE,(WPARAM)flags,(LPARAM)lpsystimearray) +#define DateTime_SetSystemTime(hwnd,flag,lpsystime) SNDMSG(hwnd,DTM_SETSYSTEMTIME,(WPARAM)flag,(LPARAM)lpsystime) +void WINAPI DrawInsert(HWND,HWND,int); +void WINAPI DrawStatusTextA(HDC,LPRECT,LPCSTR,UINT); +void WINAPI DrawStatusTextW(HDC,LPRECT,LPCWSTR,UINT); +void WINAPI GetEffectiveClientRect(HWND,LPRECT,LPINT); +#define Header_GetItemCount(w) (int)SNDMSG((w),HDM_GETITEMCOUNT,0,0) +#define Header_InsertItem(w,i,phdi) (int)SNDMSG((w),HDM_INSERTITEM,(WPARAM)(int)(i),(LPARAM)(const HD_ITEM*)(phdi)) +#define Header_DeleteItem(w,i) (BOOL)SNDMSG((w),HDM_DELETEITEM,(WPARAM)(int)(i),0) +#define Header_GetItem(w,i,phdi) (BOOL)SNDMSG((w),HDM_GETITEM,(WPARAM)(int)(i),(LPARAM)(HD_ITEM*)(phdi)) +#define Header_SetItem(w,i,phdi) (BOOL)SNDMSG((w),HDM_SETITEM,(WPARAM)(int)(i),(LPARAM)(const HD_ITEM*)(phdi)) +#define Header_Layout(w,l) (BOOL)SNDMSG((w),HDM_LAYOUT,0,(LPARAM)(HD_LAYOUT*)(l)) +#if (_WIN32_IE >= 0x0300) +#define Header_OrderToIndex(w,o) (int)SNDMSG((w),HDM_ORDERTOINDEX,(WPARAM)(o),0) +#define Header_GetItemRect(w,i,r) (BOOL)SNDMSG((w),HDM_GETITEMRECT,(WPARAM)(i),(LPARAM)(r)) +#define Header_GetOrderArray(w,l,a) (BOOL)SNDMSG((w),HDM_GETORDERARRAY,(WPARAM)(l),(LPARAM)(a)) +#define Header_SetOrderArray(w,l,a) (BOOL)SNDMSG((w),HDM_SETORDERARRAY,(WPARAM)(l),(LPARAM)(a)) +#endif +HDSA WINAPI DSA_Create(INT,INT); +BOOL WINAPI DSA_Destroy(HDSA); +VOID WINAPI DSA_DestroyCallback(HDSA,PFNDSAENUMCALLBACK,PVOID); +PVOID WINAPI DSA_GetItemPtr(HDSA,INT); +INT WINAPI DSA_InsertItem(HDSA,INT,PVOID); +HDPA WINAPI DPA_Create(INT); +BOOL WINAPI DPA_Destroy(HDPA); +PVOID WINAPI DPA_DeletePtr(HDPA,INT); +BOOL WINAPI DPA_DeleteAllPtrs(HDPA); +VOID WINAPI DPA_EnumCallback(HDPA,PFNDPAENUMCALLBACK,PVOID); +VOID WINAPI DPA_DestroyCallback(HDPA,PFNDPAENUMCALLBACK,PVOID); +BOOL WINAPI DPA_SetPtr(HDPA,INT,PVOID); +INT WINAPI DPA_InsertPtr(HDPA,INT,PVOID); +PVOID WINAPI DPA_GetPtr(HDPA,INT_PTR); +BOOL WINAPI DPA_Sort(HDPA,PFNDPACOMPARE,LPARAM); +INT WINAPI DPA_Search(HDPA,PVOID,INT,PFNDPACOMPARE,LPARAM,UINT); +BOOL WINAPI Str_SetPtrW(LPWSTR*,LPCWSTR); +#if (_WIN32_IE >= 0x0400) +BOOL WINAPI FlatSB_EnableScrollBar(HWND,INT,UINT); +BOOL WINAPI FlatSB_ShowScrollBar(HWND,INT,BOOL); +BOOL WINAPI FlatSB_GetScrollRange(HWND,INT,LPINT,LPINT); +BOOL WINAPI FlatSB_GetScrollInfo(HWND,INT,LPSCROLLINFO); +INT WINAPI FlatSB_GetScrollPos(HWND,INT); +BOOL WINAPI FlatSB_GetScrollProp(HWND,INT,LPINT); +#ifdef _WIN64 +BOOL WINAPI FlatSB_GetScrollPropPtr(HWND,INT,PINT_PTR); +#else +#define FlatSB_GetScrollPropPtr FlatSB_GetScrollProp +#endif +INT WINAPI FlatSB_SetScrollPos(HWND,INT,INT,BOOL); +INT WINAPI FlatSB_SetScrollInfo(HWND,INT,LPSCROLLINFO,BOOL); +INT WINAPI FlatSB_SetScrollRange(HWND,INT,INT,INT,BOOL); +BOOL WINAPI FlatSB_SetScrollProp(HWND,UINT,INT_PTR,BOOL); +#define FlatSB_SetScrollPropPtr FlatSB_SetScrollProp +BOOL WINAPI InitializeFlatSB(HWND); +HRESULT WINAPI UninitializeFlatSB(HWND); +#endif /* _WIN32_IE >= 0x0400 */ +#if (_WIN32_WINNT >= 0x0501) +BOOL WINAPI SetWindowSubclass(HWND,SUBCLASSPROC,UINT_PTR,DWORD_PTR); +BOOL WINAPI GetWindowSubclass(HWND,SUBCLASSPROC,UINT_PTR,DWORD_PTR*); +BOOL WINAPI RemoveWindowSubclass(HWND,SUBCLASSPROC,UINT_PTR); +LRESULT WINAPI DefSubclassProc(HWND,UINT,WPARAM,LPARAM); +INT WINAPI DrawShadowText(HDC,LPCWSTR,UINT,RECT*,DWORD,COLORREF,COLORREF,INT,INT); +#endif /* _WIN32_WINNT >= 0x0501 */ +int WINAPI ImageList_Add(HIMAGELIST,HBITMAP,HBITMAP); +#define ImageList_AddIcon(l,i) ImageList_ReplaceIcon(l,-1,i) +int WINAPI ImageList_AddMasked(HIMAGELIST,HBITMAP,COLORREF); +BOOL WINAPI ImageList_BeginDrag(HIMAGELIST,int,int,int); +HIMAGELIST WINAPI ImageList_Create(int,int,UINT,int,int); +BOOL WINAPI ImageList_Destroy(HIMAGELIST); +BOOL WINAPI ImageList_DragEnter(HWND,int,int); +BOOL WINAPI ImageList_DragLeave(HWND); +BOOL WINAPI ImageList_DragMove(int,int); +BOOL WINAPI ImageList_DragShowNolock(BOOL); +BOOL WINAPI ImageList_Draw(HIMAGELIST,int,HDC,int,int,UINT); +BOOL WINAPI ImageList_DrawEx(HIMAGELIST,int,HDC,int,int,int,int,COLORREF,COLORREF,UINT); +void WINAPI ImageList_EndDrag(VOID); +#define ImageList_ExtractIcon(h,l,i) ImageList_GetIcon(l,i,0) +COLORREF WINAPI ImageList_GetBkColor(HIMAGELIST); +HIMAGELIST WINAPI ImageList_GetDragImage(LPPOINT,LPPOINT); +HICON WINAPI ImageList_GetIcon(HIMAGELIST,int,UINT); +BOOL WINAPI ImageList_GetIconSize(HIMAGELIST,int*,int*); +int WINAPI ImageList_GetImageCount(HIMAGELIST); +BOOL WINAPI ImageList_GetImageInfo(HIMAGELIST,int,IMAGEINFO*); +#define ImageList_LoadBitmap(h,l,x,G,M) ImageList_LoadImage(h,l,x,G,M,IMAGE_BITMAP,0) +HIMAGELIST WINAPI ImageList_LoadImageA(HINSTANCE,LPCSTR,int,int,COLORREF,UINT,UINT); +HIMAGELIST WINAPI ImageList_LoadImageW(HINSTANCE,LPCWSTR,int,int,COLORREF,UINT,UINT); +HIMAGELIST WINAPI ImageList_Merge(HIMAGELIST,int,HIMAGELIST,int,int,int); +BOOL WINAPI ImageList_Remove(HIMAGELIST,int); +#define ImageList_RemoveAll(l) ImageList_Remove(l,-1) +BOOL WINAPI ImageList_Replace(HIMAGELIST,int,HBITMAP,HBITMAP); +int WINAPI ImageList_ReplaceIcon(HIMAGELIST,int,HICON); +COLORREF WINAPI ImageList_SetBkColor(HIMAGELIST,COLORREF); +BOOL WINAPI ImageList_SetDragCursorImage(HIMAGELIST,int,int,int); +BOOL WINAPI ImageList_SetIconSize(HIMAGELIST,int,int); +BOOL WINAPI ImageList_SetOverlayImage(HIMAGELIST,int,int); +#ifdef _OBJIDL_H +HIMAGELIST WINAPI ImageList_Read(LPSTREAM); +BOOL WINAPI ImageList_Write(HIMAGELIST,LPSTREAM); +#endif +void WINAPI InitCommonControls(void); +#if (_WIN32_IE >= 0x0300) +BOOL WINAPI InitCommonControlsEx(LPINITCOMMONCONTROLSEX); +#endif +int WINAPI LBItemFromPt(HWND,POINT,BOOL); +#define ListView_GetBkColor(w) (COLORREF)SNDMSG((w),LVM_GETBKCOLOR,0,0) +#define ListView_GetImageList(w,i) (HIMAGELIST)SNDMSG((w),LVM_GETIMAGELIST,(i),0) +#define ListView_GetItemCount(w) (int)SNDMSG((w),LVM_GETITEMCOUNT,0,0) +#define ListView_GetItem(w,i) (BOOL)SNDMSG((w),LVM_GETITEM,0,(LPARAM)(i)) +#define ListView_SetBkColor(w,c) (BOOL)SNDMSG((w),LVM_SETBKCOLOR,0,(LPARAM)c) +#define ListView_SetImageList(w,h,i) (HIMAGELIST)(UINT)SNDMSG((w),LVM_SETIMAGELIST,(i),(LPARAM)(h)) +#define ListView_SetItem(w,i) (BOOL)SNDMSG((w),LVM_SETITEM,0,(LPARAM)(const LV_ITEM*)(i)) +#define ListView_InsertItem(w,i) (int)SNDMSG((w),LVM_INSERTITEM,0,(LPARAM)(const LV_ITEM*)(i)) +#define ListView_DeleteItem(w,i) (BOOL)SNDMSG((w),LVM_DELETEITEM,i,0) +#define ListView_DeleteAllItems(w) (BOOL)SNDMSG((w),LVM_DELETEALLITEMS,0,0) +#define ListView_GetCallbackMask(w) (BOOL)SNDMSG((w),LVM_GETCALLBACKMASK,0,0) +#define ListView_SetCallbackMask(w,m) (BOOL)SNDMSG((w),LVM_SETCALLBACKMASK,m,0) +#define ListView_GetNextItem(w,i,f) (int)SNDMSG((w),LVM_GETNEXTITEM,i,MAKELPARAM((f),0)) +#define ListView_FindItem(w,i,p) (int)SNDMSG((w), LVM_FINDITEM,(WPARAM)i,(LPARAM)(const LV_FINDINFO*)(p)) +#define ListView_GetItemRect(w,i,p,c) (BOOL)SNDMSG((w),LVM_GETITEMRECT,i,((p)?(((LPRECT)(p))->left=(c),(LPARAM)(LPRECT)(p)):0)) +#define ListView_SetItemPosition(w,i,x,y) (BOOL)SNDMSG((w),LVM_SETITEMPOSITION,i,MAKELPARAM(x,y)) +#define ListView_GetItemPosition(w,i,p) (BOOL)SNDMSG((w),LVM_GETITEMPOSITION,i,(LPARAM)p) +#define ListView_GetItemSpacing(w,f) (DWORD)SNDMSG((w),LVM_GETITEMSPACING,f,0) +#define ListView_GetStringWidth(w,s) (int)SNDMSG((w),LVM_GETSTRINGWIDTH,0,(LPARAM)s) +#define ListView_HitTest(w,p) (int)SNDMSG((w),LVM_HITTEST,0,(LPARAM)(LV_HITTESTINFO*)(p)) +#define ListView_EnsureVisible(w,i,f) (BOOL)SNDMSG((w),LVM_ENSUREVISIBLE,i,MAKELPARAM((f),0)) +#define ListView_Scroll(w,dx,dy) (BOOL)SNDMSG((w),LVM_SCROLL,dx,dy) +#define ListView_RedrawItems(w,f,l) (BOOL)SNDMSG((w),LVM_REDRAWITEMS,f,l) +#define ListView_Arrange(w,c) (BOOL)SNDMSG((w),LVM_ARRANGE,c,0) +#define ListView_EditLabel(w,i) (HWND)SNDMSG((w),LVM_EDITLABEL,i,0) +#define ListView_GetEditControl(w) (HWND)SNDMSG((w),LVM_GETEDITCONTROL,0,0) +#define ListView_GetColumn(w,i,p) (BOOL)SNDMSG((w),LVM_GETCOLUMN,i,(LPARAM)(LV_COLUMN*)(p)) +#define ListView_SetColumn(w,i,p) (BOOL)SNDMSG((w),LVM_SETCOLUMN,i,(LPARAM)(const LV_COLUMN*)(p)) +#define ListView_InsertColumn(w,i,p) (int)SNDMSG((w),LVM_INSERTCOLUMN,i,(LPARAM)(const LV_COLUMN*)(p)) +#define ListView_DeleteColumn(w,i) (BOOL)SNDMSG((w),LVM_DELETECOLUMN,i,0) +#define ListView_GetColumnWidth(w,i) (int)SNDMSG((w),LVM_GETCOLUMNWIDTH,i,0) +#define ListView_SetColumnWidth(w,i,x) (BOOL)SNDMSG((w),LVM_SETCOLUMNWIDTH,i,MAKELPARAM((x),0)) +#define ListView_CreateDragImage(w,i,p) (HIMAGELIST)SNDMSG((w),LVM_CREATEDRAGIMAGE,i,(LPARAM)(LPPOINT)(p)) +#define ListView_GetViewRect(w,p) (BOOL)SNDMSG((w),LVM_GETVIEWRECT,0,(LPARAM)(LPRECT)(p)) +#define ListView_GetTextColor(w) (COLORREF)SNDMSG((w),LVM_GETTEXTCOLOR,0,0) +#define ListView_SetTextColor(w,c) (BOOL)SNDMSG((w),LVM_SETTEXTCOLOR,0,(LPARAM)(COLORREF)(c)) +#define ListView_GetTextBkColor(w) (COLORREF)SNDMSG((w),LVM_GETTEXTBKCOLOR,0,0) +#define ListView_SetTextBkColor(w,c) (BOOL)SNDMSG((w),LVM_SETTEXTBKCOLOR,0,(LPARAM)(COLORREF)(c)) +#define ListView_GetTopIndex(w) (int)SNDMSG((w),LVM_GETTOPINDEX,0,0) +#define ListView_GetCountPerPage(w) (int)SNDMSG((w),LVM_GETCOUNTPERPAGE,0,0) +#define ListView_GetOrigin(w,p) (BOOL)SNDMSG((w),LVM_GETORIGIN,0,(LPARAM)(POINT*)(p)) +#define ListView_GetOrigin(w,p) (BOOL)SNDMSG((w),LVM_GETORIGIN,0,(LPARAM)(POINT*)(p)) +#define ListView_Update(w,i) (BOOL)SNDMSG((w),LVM_UPDATE,i,0) +#define ListView_SetItemState(w,i,d,m) \ +{ \ + LV_ITEM _lvi;\ + _lvi.stateMask=m;\ + _lvi.state=d;\ + SNDMSG((w),LVM_SETITEMSTATE,i,(LPARAM)(LV_ITEM*)&_lvi);\ +} +#define ListView_GetItemState(w,i,m) (UINT)SNDMSG((w),LVM_GETITEMSTATE,i,m) +#define ListView_GetItemText(w,i,iS,s,n) \ +{ \ + LV_ITEM _lvi;\ + _lvi.iSubItem=iS;\ + _lvi.cchTextMax=n;\ + _lvi.pszText=s;\ + SNDMSG((w),LVM_GETITEMTEXT,i,(LPARAM)(LV_ITEM*)&_lvi);\ +} +#define ListView_SetItemText(w,i,iS,s) \ +{ \ + LV_ITEM _lvi;\ + _lvi.iSubItem=iS;\ + _lvi.pszText=s;\ + SNDMSG((w),LVM_SETITEMTEXT,i,(LPARAM)(LV_ITEM*)&_lvi);\ +} +#define ListView_SetItemCount(w,n) SNDMSG((w),LVM_SETITEMCOUNT,n,0) +#define ListView_SortItems(w,f,l) (BOOL)SNDMSG((w),LVM_SORTITEMS,l,(LPARAM)f) +#define ListView_SetItemPosition32(w,i,x,y) \ +{ \ + POINT p={x,y}; \ + SNDMSG((w),LVM_SETITEMPOSITION32,i,(LPARAM)&p);\ +} +#define ListView_GetSelectedCount(w) (UINT)SNDMSG((w),LVM_GETSELECTEDCOUNT,0,0) +#define ListView_GetCheckState(w,i) ((((UINT)(SNDMSG((w),LVM_GETITEMSTATE,(WPARAM)(i),LVIS_STATEIMAGEMASK)))>>12)-1) +#define ListView_SetCheckState(w,i,f) ListView_SetItemState(w,i,INDEXTOSTATEIMAGEMASK((f)+1),LVIS_STATEIMAGEMASK) + +BOOL WINAPI MakeDragList(HWND); +void WINAPI MenuHelp(UINT,WPARAM,LPARAM,HMENU,HINSTANCE,HWND,PUINT); +#define MonthCal_GetColor(hwnd,icolor) SNDMSG(hwnd,MCM_GETCOLOR,(WPARAM)icolor,(LPARAM)0) +#define MonthCal_GetCurSel(hwnd,lpsystime) SNDMSG(hwnd,MCM_GETCURSEL,0,(LPARAM)lpsystime) +#define MonthCal_GetFirstDayOfWeek(hwnd) SNDMSG(hwnd,MCM_GETFIRSTDAYOFWEEK,0,0) +#define MonthCal_GetMaxSelCount(hwnd) SNDMSG(hwnd,MCM_GETMAXSELCOUNT,0,0) +#define MonthCal_GetMaxTodayWidth(hwnd) SNDMSG(hwnd,MCM_GETMAXTODAYWIDTH,0,0) +#define MonthCal_GetMinReqRect(hwnd,lpRectInfo) SNDMSG(hwnd,MCM_GETMINREQRECT,0,(LPARAM)lpRectInfo) +#define MonthCal_GetMonthDelta(hwnd) SNDMSG(hwnd,MCM_GETMONTHDELTA,0,0) +#define MonthCal_GetMonthRange(hwnd,flag,systimearray) SNDMSG(hwnd,MCM_GETMONTHRANGE,(WPARAM)flag,(LPARAM)systimearray) +#define MonthCal_GetRange(hwnd,systimearray) SNDMSG(hwnd,MCM_GETRANGE,0,(LPARAM)systimearray) +#define MonthCal_GetSelRange(hwnd,systimearray) SNDMSG(hwnd,MCM_GETSELRANGE,0,(LPARAM)systimearray) +#define MonthCal_GetToday(hwnd,systime) SNDMSG(hwnd,MCM_GETTODAY,0,(LPARAM)systime) +#define MonthCal_GetUnicodeFormat(hwnd) SNDMSG(hwnd,MCM_GETUNICODEFORMAT,0,0) +#define MonthCal_HitTest(hwnd,pmchittest) SNDMSG(hwnd,MCM_HITTEST,0,(LPARAM)pmchittest) +#define MonthCal_SetColor(hwnd,icolor,clr) SNDMSG(hwnd,MCM_SETCOLOR,(WPARAM)icolor,(LPARAM)clr) +#define MonthCal_SetCurSel(hwnd,lpsystime) SNDMSG(hwnd,MCM_SETCURSEL,0,(LPARAM)lpsystime) +#define MonthCal_SetDayState(hwnd,imonths,lpdatestatearray) SNDMSG(hwnd,MCM_SETDAYSTATE,(WPARAM)imonths,(LPARAM)lpdatestatearray) +#define MonthCal_SetFirstDayOfWeek(hwnd,iday) SNDMSG(hwnd,MCM_SETFIRSTDAYOFWEEK,0,(LPARAM)iday) +#define MonthCal_SetMaxSelCount(hwnd,imax) SNDMSG(hwnd,MCM_SETMAXSELCOUNT,(WPARAM)imax,0) +#define MonthCal_SetMonthDelta(hwnd,idelta) SNDMSG(hwnd,MCM_SETMONTHDELTA,(WPARAM)idelta,0) +#define MonthCal_SetRange(hwnd,whichlimit,systimearray) SNDMSG(hwnd,MCM_SETRANGE,whichlimit,systimearray) +#define MonthCal_SetSelRange(hwnd,systimearray) SNDMSG(hwnd,MCM_SETSELRANGE,0,(LPARAM)systimearray) +#define MonthCal_SetToday(hwnd,systime) SNDMSG(hwnd,MCM_SETTODAY,0,(LPARAM)systime) +#define MonthCal_SetUnicodeFormat(hwnd,unicode) SNDMSG(hwnd,MCM_SETUNICODEFORMAT,(WPARAM)unicode,0) +BOOL WINAPI ShowHideMenuCtl(HWND,UINT,PINT); +#define TabCtrl_GetItem(w,i,p) (BOOL)SNDMSG((w),TCM_GETITEM,i,(LPARAM)(TC_ITEM*)(p)) +#define TabCtrl_SetItem(w,i,p) (BOOL)SNDMSG((w),TCM_SETITEM,i,(LPARAM)(TC_ITEM*)(p)) +#define TabCtrl_InsertItem(w,i,p) (int)SNDMSG((w),TCM_INSERTITEM,i,(LPARAM)(const TC_ITEM*)(p)) +#define TabCtrl_DeleteItem(w,i) (BOOL)SNDMSG((w),TCM_DELETEITEM,i,0) +#define TabCtrl_DeleteAllItems(w) (BOOL)SNDMSG((w),TCM_DELETEALLITEMS,0,0) +#define TabCtrl_GetItemRect(w,i,p) (BOOL)SNDMSG((w),TCM_GETITEMRECT,i,(LPARAM)(LPRECT)(p)) +#define TabCtrl_GetCurSel(w) (int)SNDMSG((w),TCM_GETCURSEL,0,0) +#define TabCtrl_SetCurSel(w,i) (int)SNDMSG((w),TCM_SETCURSEL,i,0) +#define TabCtrl_HitTest(w,p) (int)SNDMSG((w),TCM_HITTEST,0,(LPARAM)(TC_HITTESTINFO*)(p)) +#define TabCtrl_SetItemExtra(w,c) (BOOL)SNDMSG((w),TCM_SETITEMEXTRA,c,0) +#define TabCtrl_AdjustRect(w,b,p) (int)SNDMSG((w),TCM_ADJUSTRECT,b,(LPARAM)(LPRECT)p) +#define TabCtrl_SetItemSize(w,x,y) (DWORD)SNDMSG((w),TCM_SETITEMSIZE,0,MAKELPARAM(x,y)) +#define TabCtrl_RemoveImage(w,i) (void)SNDMSG((w),TCM_REMOVEIMAGE,i,0) +#define TabCtrl_SetPadding(w,x,y) (void)SNDMSG((w),TCM_SETPADDING,0,MAKELPARAM(x,y)) +#define TabCtrl_GetRowCount(w) (int)SNDMSG((w),TCM_GETROWCOUNT,0,0) +#define TabCtrl_GetToolTips(w) (HWND)SNDMSG((w),TCM_GETTOOLTIPS,0,0) +#define TabCtrl_SetToolTips(w,t) (void)SNDMSG((w),TCM_SETTOOLTIPS,(WPARAM)t,0) +#define TabCtrl_GetCurFocus(w) (int)SNDMSG((w),TCM_GETCURFOCUS,0,0) +#define TabCtrl_SetCurFocus(w,i) (void)SNDMSG((w),TCM_SETCURFOCUS,i,0) +#define TabCtrl_GetImageList(w) (HIMAGELIST)SNDMSG((w),TCM_GETIMAGELIST,0,0) +#define TabCtrl_SetImageList(w,h) (HIMAGELIST)SNDMSG((w),TCM_SETIMAGELIST,0,(LPARAM)(UINT)(h)) +#define TabCtrl_GetItemCount(w) (int)SNDMSG((w),TCM_GETITEMCOUNT,0,0) +BOOL WINAPI _TrackMouseEvent(LPTRACKMOUSEEVENT); +#define TreeView_InsertItem(w,i) (HTREEITEM)SNDMSG((w),TVM_INSERTITEM,0,(LPARAM)(LPTV_INSERTSTRUCT)(i)) +#define TreeView_DeleteItem(w,i) (BOOL)SNDMSG((w),TVM_DELETEITEM,0,(LPARAM)(HTREEITEM)(i)) +#define TreeView_DeleteAllItems(w) (BOOL)SNDMSG((w),TVM_DELETEITEM,0,(LPARAM)TVI_ROOT) +#define TreeView_Expand(w,i,c) (BOOL)SNDMSG((w),TVM_EXPAND,c,(LPARAM)(HTREEITEM)(i)) +#define TreeView_GetItemRect(w,i,p,c) (*(HTREEITEM*)p=(i),(BOOL)SNDMSG((w),TVM_GETITEMRECT,c,(LPARAM)(LPRECT)(p))) +#define TreeView_GetCount(w) (UINT)SNDMSG((w),TVM_GETCOUNT,0,0) +#define TreeView_GetIndent(w) (UINT)SNDMSG((w),TVM_GETINDENT,0,0) +#define TreeView_SetIndent(w,i) (BOOL)SNDMSG((w),TVM_SETINDENT,i,0) +#define TreeView_GetImageList(w,i) (HIMAGELIST)SNDMSG((w),TVM_GETIMAGELIST,i,0) +#define TreeView_SetImageList(w,h,i) (HIMAGELIST)SNDMSG((w),TVM_SETIMAGELIST,i,(LPARAM)(HIMAGELIST)(h)) +#define TreeView_GetNextItem(w,i,c) (HTREEITEM)SNDMSG((w),TVM_GETNEXTITEM,c,(LPARAM)(HTREEITEM)(i)) +#define TreeView_GetChild(w,i) TreeView_GetNextItem(w,i,TVGN_CHILD) +#define TreeView_GetNextSibling(w,i) TreeView_GetNextItem(w,i,TVGN_NEXT) +#define TreeView_GetPrevSibling(w,i) TreeView_GetNextItem(w,i,TVGN_PREVIOUS) +#define TreeView_GetParent(w,i) TreeView_GetNextItem(w,i,TVGN_PARENT) +#define TreeView_GetFirstVisible(w) TreeView_GetNextItem(w,NULL,TVGN_FIRSTVISIBLE) +#define TreeView_GetNextVisible(w,i) TreeView_GetNextItem(w,i,TVGN_NEXTVISIBLE) +#define TreeView_GetPrevVisible(w,i) TreeView_GetNextItem(w,i,TVGN_PREVIOUSVISIBLE) +#define TreeView_GetSelection(w) TreeView_GetNextItem(w,NULL,TVGN_CARET) +#define TreeView_GetDropHilight(w) TreeView_GetNextItem(w,NULL,TVGN_DROPHILITE) +#define TreeView_GetRoot(w) TreeView_GetNextItem(w,NULL,TVGN_ROOT) +#define TreeView_Select(w,i,c) (BOOL)SNDMSG((w),TVM_SELECTITEM,c,(LPARAM)(HTREEITEM)(i)) +#define TreeView_SelectItem(w,i) TreeView_Select(w,i,TVGN_CARET) +#define TreeView_SelectDropTarget(w,i) TreeView_Select(w,i,TVGN_DROPHILITE) +#define TreeView_SelectSetFirstVisible(w,i) TreeView_Select(w,i,TVGN_FIRSTVISIBLE) +#define TreeView_GetItem(w,i) (BOOL)SNDMSG((w),TVM_GETITEM,0,(LPARAM)(TV_ITEM*)(i)) +#define TreeView_SetItem(w,i) (BOOL)SNDMSG((w),TVM_SETITEM,0,(LPARAM)(const TV_ITEM*)(i)) +#define TreeView_EditLabel(w,i) (HWND)SNDMSG((w),TVM_EDITLABEL,0,(LPARAM)(HTREEITEM)(i)) +#define TreeView_GetEditControl(w) (HWND)SNDMSG((w),TVM_GETEDITCONTROL,0,0) +#define TreeView_GetVisibleCount(w) (UINT)SNDMSG((w),TVM_GETVISIBLECOUNT,0,0) +#define TreeView_HitTest(w,p) (HTREEITEM)SNDMSG((w),TVM_HITTEST,0,(LPARAM)(LPTV_HITTESTINFO)(p)) +#define TreeView_CreateDragImage(w,i) (HIMAGELIST)SNDMSG((w),TVM_CREATEDRAGIMAGE,0,(LPARAM)(HTREEITEM)(i)) +#define TreeView_SortChildren(w,i,r) (BOOL)SNDMSG((w),TVM_SORTCHILDREN,r,(LPARAM)(HTREEITEM)(i)) +#define TreeView_EnsureVisible(w,i) (BOOL)SNDMSG((w),TVM_ENSUREVISIBLE,0,(LPARAM)(HTREEITEM)(i)) +#define TreeView_SortChildrenCB(w,s,r) (BOOL)SNDMSG((w),TVM_SORTCHILDRENCB,r,(LPARAM)(LPTVSORTCB)(s)) +#define TreeView_EndEditLabelNow(w,f) (BOOL)SNDMSG((w),TVM_ENDEDITLABELNOW,f,0) +#define TreeView_GetISearchString(w,s) (BOOL)SNDMSG((w),TVM_GETISEARCHSTRING,0,(LPARAM)s) +#if (_WIN32_IE >= 0x0300) +#define ListView_ApproximateViewRect(w,iw,ih,i) (DWORD)SNDMSG((w),LVM_APPROXIMATEVIEWRECT,(i),MAKELPARAM((iw),(ih))) +#define ListView_SetExtendedListViewStyle(w,s) (DWORD)SNDMSG((w),LVM_SETEXTENDEDLISTVIEWSTYLE,0,(s)) +#define ListView_GetExtendedListViewStyle(w) (DWORD)SNDMSG((w),LVM_GETEXTENDEDLISTVIEWSTYLE,0,0) +#define ListView_SetColumnOrderArray(w,i,a) (BOOL)SNDMSG((w),LVM_SETCOLUMNORDERARRAY,(WPARAM)(i),(LPARAM)(LPINT)(a)) +#define ListView_GetColumnOrderArray(w,i,a) (BOOL)SNDMSG((w),LVM_GETCOLUMNORDERARRAY,(WPARAM)(i),(LPARAM)(LPINT)(a)) +#define ListView_GetHeader(w) (HWND)SNDMSG((w),LVM_GETHEADER,0,0) +#define ListView_GetHotCursor(w) (HCURSOR)SNDMSG((w),LVM_GETHOTCURSOR,0,0) +#define ListView_GetHotItem(w) (INT)SNDMSG((w),LVM_GETHOTITEM,0,0) +#define ListView_GetSubItemRect(w,i,is,c,p) (BOOL)SNDMSG((w),LVM_GETSUBITEMRECT,(WPARAM)(int)(i),((p)?(((LPRECT)(p))->left=(c),(((LPRECT)(p))->top=(is)),(LPARAM)(LPRECT)(p)):0)) +#define ListView_SetHotCursor(w,c) (HCURSOR)SNDMSG((w),LVM_SETHOTCURSOR,0,(LPARAM)(c)) +#define ListView_SetHotItem(w,i) (int)SNDMSG((w),LVM_SETHOTITEM,(WPARAM)(i),0) +#define ListView_SetIconSpacing(w,x,y) (DWORD)SNDMSG((w),LVM_SETICONSPACING,0,MAKELONG(x,y)) +#define ListView_SubItemHitTest(w,p) (int)SNDMSG((w),LVM_SUBITEMHITTEST,0,(LPARAM)(LPLVHITTESTINFO)(p)) +WINBOOL WINAPI ImageList_SetImageCount(HIMAGELIST,UINT); +WINBOOL WINAPI ImageList_Copy(HIMAGELIST,int,HIMAGELIST,int,UINT); +WINBOOL WINAPI ImageList_DrawIndirect(IMAGELISTDRAWPARAMS*); +#define TabCtrl_SetMinTabWidth(hwnd, x) SNDMSG((hwnd), TCM_SETMINTABWIDTH, 0, x) +#define TabCtrl_DeselectAll(hwnd, fExcludeFocus) SNDMSG((hwnd), TCM_DESELECTALL, fExcludeFocus, 0) +#define TreeView_GetToolTips(w) (HWND)SNDMSG((w),TVM_GETTOOLTIPS,0,0) +#define TreeView_SetToolTips(w,wt) (HWND)SNDMSG((w),TVM_SETTOOLTIPS,(WPARAM)(wt),0) +#endif +#if (_WIN32_IE >= 0x0400) +#define ListView_GetBkImage(h,plvbki) (BOOL)SNDMSG((h), LVM_GETBKIMAGE, 0, (LPARAM)(plvbki)) +#define ListView_SetBkImage(h, plvbki) (BOOL)SNDMSG((h), LVM_SETBKIMAGE, 0, (LPARAM)(plvbki)) +#define ListView_SetExtendedListViewStyleEx(w,m,s) (DWORD)SNDMSG((w),LVM_SETEXTENDEDLISTVIEWSTYLE,(m),(s)) +#define ListView_SetWorkAreas(w,n,r) (BOOL)SNDMSG((w),LVM_SETWORKAREAS,(WPARAM)(n),(LPARAM)(RECT *)(r)) +#define ListView_GetWorkAreas(w,n,r) (BOOL)SNDMSG((w),LVM_GETWORKAREAS,(WPARAM)(n),(LPARAM)(RECT *)(r)) +#define ListView_GetNumberOfWorkAreas(w,n) (BOOL)SNDMSG((w),LVM_GETNUMBEROFWORKAREAS,0,(LPARAM)(UINT *)(pnWorkAreas)) +#define ListView_SetHoverTime(w,t) (DWORD)SNDMSG((w),LVM_SETHOVERTIME,0,(LPARAM)(t)) +#define ListView_GetHoverTime(w) (DWORD)SNDMSG((w),LVM_GETHOVERTIME,0,0) +#define ListView_GetSelectionMark(w) (INT)SNDMSG((w),LVM_GETSELECTIONMARK,0,0) +#define ListView_SetSelectionMark(w,i) (INT)SNDMSG((w),LVM_SETSELECTIONMARK,0,(LPARAM)(i)) +#define ListView_SetToolTips(w,n) (HWND)SNDMSG((w),LVM_SETTOOLTIPS,(WPARAM)(n),0) +#define ListView_GetToolTips(w) (HWND)SNDMSG((w),LVM_GETTOOLTIPS,0,0) +#define TabCtrl_HighlightItem(hwnd, i, fHighlight) SNDMSG((hwnd), TCM_HIGHLIGHTITEM, (WPARAM)i, (LPARAM)MAKELONG (fHighlight, 0)) +#define TabCtrl_SetExtendedStyle(hwnd, dw) SNDMSG((hwnd), TCM_SETEXTENDEDSTYLE, 0, dw) +#define TabCtrl_GetExtendedStyle(hwnd) SNDMSG((hwnd), TCM_GETEXTENDEDSTYLE, 0, 0) +#define TabCtrl_SetUnicodeFormat(hwnd, fUnicode) SNDMSG((hwnd), TCM_SETUNICODEFORMAT, (WPARAM)(fUnicode), 0) +#define TabCtrl_GetUnicodeFormat(hwnd) SNDMSG((hwnd), TCM_GETUNICODEFORMAT, 0, 0) +#define TreeView_GetBkColor(w) (COLORREF)SNDMSG((w),TVM_GETBKCOLOR,0,0) +#define TreeView_GetInsertMarkColor(w) (COLORREF)SNDMSG((w),TVM_GETINSERTMARKCOLOR,0,0) +#define TreeView_GetItemHeight(w) (int)SNDMSG((w),TVM_GETITEMHEIGHT,0,0) +#define TreeView_GetScrollTime(w) (UINT)SNDMSG((w),TVM_GETSCROLLTIME,0,0) +#define TreeView_GetTextColor(w) (COLORREF)SNDMSG((w),TVM_GETTEXTCOLOR,0,0) +#define TreeView_SetBkColor(w,c) (COLORREF)SNDMSG((w),TVM_SETBKCOLOR,0,(LPARAM)(c)) +#define TreeView_SetInsertMarkColor(w,c) (COLORREF)SNDMSG((w),TVM_SETINSERTMARKCOLOR,0,(LPARAM)(c)) +#define TreeView_SetItemHeight(w,h) (int)SNDMSG((w),TVM_SETITEMHEIGHT,(WPARAM)(h),0) +#define TreeView_SetScrollTime(w,t) (UINT)SNDMSG((w),TVM_SETSCROLLTIME,(WPARAM)(UINT)(t),0) +#define TreeView_SetTextColor(w,c) (COLORREF)SNDMSG((w),TVM_SETTEXTCOLOR,0,(LPARAM)(c)) +#define TreeView_SetInsertMark(w,i,a) (BOOL)SNDMSG((w),TVM_SETINSERTMARK,(WPARAM)(a),(LPARAM)(i)) +#define TreeView_SetUnicodeFormat(w,u) (BOOL)SNDMSG((w),TVM_SETUNICODEFORMAT,(WPARAM)(u),0) +#define TreeView_GetUnicodeFormat(w) (BOOL)SNDMSG((w),TVM_GETUNICODEFORMAT,0,0) +#endif +#if (_WIN32_IE >= 0x0500) +#define TreeView_GetItemState(w,i,m) (UINT)SNDMSG((w),TVM_GETITEMSTATE,(WPARAM)(i),(LPARAM)(m)) +#endif + +#ifdef UNICODE +typedef HDITEMW HDITEM; +typedef TOOLINFOW TOOLINFO,*PTOOLINFO,*LPTOOLINFO; +typedef TTHITTESTINFOW TTHITTESTINFO,*LPHITTESTINFO,*LPTTHITTESTINFO; +typedef TOOLTIPTEXTW TOOLTIPTEXT,*LPTOOLTIPTEXT; +typedef NMTTDISPINFOW NMTTDISPINFO, *LPNMTTDISPINFO; +typedef TV_ITEMW TV_ITEM,*LPTV_ITEM; +typedef TVITEMW TVITEM,*LPTVITEM; +#if (_WIN32_IE >= 0x0400) +typedef TVITEMEXW TVITEMEX,*LPTVITEMEX; +#endif +typedef TV_INSERTSTRUCTW TV_INSERTSTRUCT,*LPTV_INSERTSTRUCT; +typedef TVINSERTSTRUCTW TVINSERTSTRUCT,*LPTVINSERTSTRUCT; +typedef NM_TREEVIEWW NM_TREEVIEW,*LPNM_TREEVIEW; +typedef NMTREEVIEWW NMTREEVIEW,*LPNMTREEVIEW; +typedef NMHDDISPINFOW NMHDDISPINFO, *LPNMHDDISPINFO; +#define ACM_OPEN ACM_OPENW +#define COMBOBOXEXITEM COMBOBOXEXITEMW +#define PCOMBOBOXEXITEM PCOMBOBOXEXITEMW +#define PCCOMBOBOXEXITEM PCCOMBOBOXEXITEMW +#define CBEM_INSERTITEM CBEM_INSERTITEMW +#define CBEM_SETITEM CBEM_SETITEMW +#define CBEM_GETITEM CBEM_GETITEMW +#define CBEN_ENDEDIT CBEN_ENDEDITW +#define NMCBEENDEDIT NMCBEENDEDITW +#define LPNMCBEENDEDIT LPNMCBEENDEDITW +#define PNMCBEENDEDIT PNMCBEENDEDITW +#if _WIN32_IE >= 0x0400 +#define NMCOMBOBOXEX NMCOMBOBOXEXW +#define PNMCOMBOBOXEX PNMCOMBOBOXEXW +#define CBEN_GETDISPINFO CBEN_GETDISPINFOW +#define CBEN_DRAGBEGIN CBEN_DRAGBEGINW +#define NMCBEDRAGBEGIN NMCBEDRAGBEGINW +#define LPNMCBEDRAGBEGIN LPNMCBEDRAGBEGINW +#define PNMCBEDRAGBEGIN PNMCBEDRAGBEGINW +#endif /* _WIN32_IE >= 0x0400 */ +#define SB_GETTEXT SB_GETTEXTW +#define SB_SETTEXT SB_SETTEXTW +#define SB_GETTEXTLENGTH SB_GETTEXTLENGTHW +#define HDM_INSERTITEM HDM_INSERTITEMW +#define HDM_GETITEM HDM_GETITEMW +#define HDM_SETITEM HDM_SETITEMW +#define HDN_ITEMCHANGING HDN_ITEMCHANGINGW +#define HDN_ITEMCHANGED HDN_ITEMCHANGEDW +#define HDN_ITEMCLICK HDN_ITEMCLICKW +#define HDN_ITEMDBLCLICK HDN_ITEMDBLCLICKW +#define HDN_DIVIDERDBLCLICK HDN_DIVIDERDBLCLICKW +#define HDN_BEGINTRACK HDN_BEGINTRACKW +#define HDN_ENDTRACK HDN_ENDTRACKW +#define HDN_TRACK HDN_TRACKW +#if (_WIN32_IE >= 0x0300) +#define HDN_GETDISPINFO HDN_GETDISPINFOW +#endif +#define HD_NOTIFY HD_NOTIFYW +#define TBSAVEPARAMS TBSAVEPARAMSW +#define TB_GETBUTTONTEXT TB_GETBUTTONTEXTW +#define TB_SAVERESTORE TB_SAVERESTOREW +#define TB_ADDSTRING TB_ADDSTRINGW +#define TBN_GETBUTTONINFO TBN_GETBUTTONINFOW +#if _WIN32_IE >= 0x400 +#define TB_GETBUTTONINFO TB_GETBUTTONINFOW +#define TB_SETBUTTONINFO TB_SETBUTTONINFOW +#define TB_INSERTBUTTON TB_INSERTBUTTONW +#define TB_ADDBUTTONS TB_ADDBUTTONSW +#define TB_MAPACCELERATOR TB_MAPACCELERATORW +#define TBBUTTONINFO TBBUTTONINFOW +#define LPTBBUTTONINFO LPTBBUTTONINFOW +#define TBN_GETDISPINFO TBN_GETDISPINFOW +#define NMTBDISPINFO NMTBDISPINFOW +#define LPNMTBDISPINFO LPNMTBDISPINFOW +#endif +#define TBNOTIFY TBNOTIFYW +#define LPTBNOTIFY LPTBNOTIFYW +#define NMTOOLBAR NMTOOLBARW +#define LPNMTOOLBAR LPNMTOOLBARW +#define TTM_ADDTOOL TTM_ADDTOOLW +#define TTM_DELTOOL TTM_DELTOOLW +#define TTM_NEWTOOLRECT TTM_NEWTOOLRECTW +#define TTM_GETTOOLINFO TTM_GETTOOLINFOW +#define TTM_SETTOOLINFO TTM_SETTOOLINFOW +#define TTM_HITTEST TTM_HITTESTW +#define TTM_GETTEXT TTM_GETTEXTW +#define TTM_UPDATETIPTEXT TTM_UPDATETIPTEXTW +#define TTM_ENUMTOOLS TTM_ENUMTOOLSW +#define TTM_GETCURRENTTOOL TTM_GETCURRENTTOOLW +#define TTN_NEEDTEXT TTN_NEEDTEXTW +#define TTN_GETDISPINFO TTN_GETDISPINFOW +#define SB_GETTEXT SB_GETTEXTW +#define SB_SETTEXT SB_SETTEXTW +#define SB_GETTEXTLENGTH SB_GETTEXTLENGTHW +#define LV_ITEM LV_ITEMW +#define LVITEM LVITEMW +#define LPSTR_TEXTCALLBACK LPSTR_TEXTCALLBACKW +#if _WIN32_IE >= 0x0400 +#define LVBKIMAGE LVBKIMAGEW +#define LPLVBKIMAGE LPLVBKIMAGEW +#define LVM_SETBKIMAGE LVM_SETBKIMAGEW +#define LVM_GETBKIMAGE LVM_GETBKIMAGEW +#endif /* _WIN32_IE >= 0x400 */ +#define LVM_GETITEM LVM_GETITEMW +#define LVM_SETITEM LVM_SETITEMW +#define LVM_INSERTITEM LVM_INSERTITEMW +#define LV_FINDINFO LV_FINDINFOW +#define LVFINDINFO LVFINDINFOW +#define LPFINDINFO LPFINDINFOW +#define LVM_FINDITEM LVM_FINDITEMW +#define LVM_GETSTRINGWIDTH LVM_GETSTRINGWIDTHW +#define LVM_EDITLABEL LVM_EDITLABELW +#define LV_COLUMN LV_COLUMNW +#define LVCOLUMN LVCOLUMNW +#define LVM_GETCOLUMN LVM_GETCOLUMNW +#define LVM_SETCOLUMN LVM_SETCOLUMNW +#define LVM_INSERTCOLUMN LVM_INSERTCOLUMNW +#define LVM_GETITEMTEXT LVM_GETITEMTEXTW +#define LVM_SETITEMTEXT LVM_SETITEMTEXTW +#define LVM_GETISEARCHSTRING LVM_GETISEARCHSTRINGW +#define LVN_BEGINLABELEDIT LVN_BEGINLABELEDITW +#define LVN_ENDLABELEDIT LVN_ENDLABELEDITW +#define LVN_GETDISPINFO LVN_GETDISPINFOW +#define LVN_SETDISPINFO LVN_SETDISPINFOW +#define LVN_GETINFOTIP LVN_GETINFOTIPW +#define NMLVGETINFOTIP NMLVGETINFOTIPW +#define LPNMLVGETINFOTIP LPNMLVGETINFOTIPW +#define LV_DISPINFO LV_DISPINFOW +#define NMLVDISPINFO NMLVDISPINFOW +#define TVM_INSERTITEM TVM_INSERTITEMW +#define TVM_GETITEM TVM_GETITEMW +#define TVM_SETITEM TVM_SETITEMW +#define TVM_EDITLABEL TVM_EDITLABELW +#define TVM_GETISEARCHSTRING TVM_GETISEARCHSTRINGW +#define TV_DISPINFO NMTVDISPINFOW +#define NMTVDISPINFO NMTVDISPINFOW +#define LPNMTVDISPINFO LPNMTVDISPINFOW +#if (_WIN32_IE >= 0x0400) +#define NMTVGETINFOTIP NMTVGETINFOTIPW +#define LPNMTVGETINFOTIP LPNMTVGETINFOTIPW +#define TVN_GETINFOTIP TVN_GETINFOTIPW +#endif +#define TVN_SELCHANGING TVN_SELCHANGINGW +#define TVN_SELCHANGED TVN_SELCHANGEDW +#define TVN_GETDISPINFO TVN_GETDISPINFOW +#define TVN_SETDISPINFO TVN_SETDISPINFOW +#define TVN_ITEMEXPANDING TVN_ITEMEXPANDINGW +#define TVN_ITEMEXPANDED TVN_ITEMEXPANDEDW +#define TVN_BEGINDRAG TVN_BEGINDRAGW +#define TVN_BEGINRDRAG TVN_BEGINRDRAGW +#define TVN_DELETEITEM TVN_DELETEITEMW +#define TVN_BEGINLABELEDIT TVN_BEGINLABELEDITW +#define TVN_ENDLABELEDIT TVN_ENDLABELEDITW +#define TC_ITEMHEADER TC_ITEMHEADERW +#define TC_ITEM TC_ITEMW +#define TCITEM TCITEMW +#define LPTCITEM LPTCITEMW +#define TCM_GETITEM TCM_GETITEMW +#define TCM_SETITEM TCM_SETITEMW +#define TCM_INSERTITEM TCM_INSERTITEMW +#define CreateStatusWindow CreateStatusWindowW +#define DrawStatusText DrawStatusTextW +#define ImageList_LoadImage ImageList_LoadImageW +#define DTM_SETFORMAT DTM_SETFORMATW +#define DTN_USERSTRING DTN_USERSTRINGW +#define DTN_WMKEYDOWN DTN_WMKEYDOWNW +#define DTN_FORMAT DTN_FORMATW +#define DTN_FORMATQUERY DTN_FORMATQUERYW +typedef REBARBANDINFOW REBARBANDINFO,*LPREBARBANDINFO; +#define LPCREBARBANDINFO LPCREBARBANDINFOW +#define REBARBANDINFO_V3_SIZE REBARBANDINFOW_V3_SIZE +#define RB_INSERTBAND RB_INSERTBANDW +#define RB_SETBANDINFO RB_SETBANDINFOW +#else /* UNICODE */ +typedef HDITEMA HDITEM; +typedef TOOLINFOA TOOLINFO,*PTOOLINFO,*LPTOOLINFO; +typedef TTHITTESTINFOA TTHITTESTINFO,*LPHITTESTINFO,*LPTTHITTESTINFO; +typedef TOOLTIPTEXTA TOOLTIPTEXT,*LPTOOLTIPTEXT; +typedef NMTTDISPINFOA NMTTDISPINFO, *LPNMTTDISPINFO; +typedef TV_ITEMA TV_ITEM,*LPTV_ITEM; +typedef TVITEMA TVITEM,*LPTVITEM; +#if (_WIN32_IE >= 0x0400) +typedef TVITEMEXA TVITEMEX,*LPTVITEMEX; +#endif +typedef TV_INSERTSTRUCTA TV_INSERTSTRUCT,*LPTV_INSERTSTRUCT; +typedef TVINSERTSTRUCTA TVINSERTSTRUCT,*LPTVINSERTSTRUCT; +typedef NM_TREEVIEWA NM_TREEVIEW,*LPNM_TREEVIEW; +typedef NMTREEVIEWA NMTREEVIEW,*LPNMTREEVIEW; +typedef NMHDDISPINFOW NMHDDISPINFO, *LPNMHDDISPINFO; +#define ACM_OPEN ACM_OPENA +#define COMBOBOXEXITEM COMBOBOXEXITEMA +#define PCOMBOBOXEXITEM PCOMBOBOXEXITEMA +#define PCCOMBOBOXEXITEM PCCOMBOBOXEXITEMA +#define CBEM_INSERTITEM CBEM_INSERTITEMA +#define CBEM_SETITEM CBEM_SETITEMA +#define CBEM_GETITEM CBEM_GETITEMA +#define CBEN_ENDEDIT CBEN_ENDEDITA +#define NMCBEENDEDIT NMCBEENDEDITA +#define LPNMCBEENDEDIT LPNMCBEENDEDITA +#define PNMCBEENDEDIT PNMCBEENDEDITA +#if _WIN32_IE >= 0x0400 +#define TB_GETBUTTONINFO TB_GETBUTTONINFOA +#define TB_SETBUTTONINFO TB_SETBUTTONINFOA +#define TB_INSERTBUTTON TB_INSERTBUTTONA +#define TB_ADDBUTTONS TB_ADDBUTTONSA +#define TB_MAPACCELERATOR TB_MAPACCELERATORA +#define NMCOMBOBOXEX NMCOMBOBOXEXA +#define PNMCOMBOBOXEX PNMCOMBOBOXEXA +#define CBEN_DRAGBEGIN CBEN_DRAGBEGINA +#define CBEN_GETDISPINFO CBEN_GETDISPINFOA +#define NMCBEDRAGBEGIN NMCBEDRAGBEGINA +#define LPNMCBEDRAGBEGIN LPNMCBEDRAGBEGINA +#define PNMCBEDRAGBEGIN PNMCBEDRAGBEGINA +#define TBN_GETDISPINFO TBN_GETDISPINFOA +#define NMTBDISPINFO NMTBDISPINFOA +#define LPNMTBDISPINFO LPNMTBDISPINFOA +#endif /* _WIN32_IE >= 0x0400 */ +#define SB_GETTEXT SB_GETTEXTA +#define SB_SETTEXT SB_SETTEXTA +#define SB_GETTEXTLENGTH SB_GETTEXTLENGTHA +#define HDM_INSERTITEM HDM_INSERTITEMA +#define HDM_GETITEM HDM_GETITEMA +#define HDM_SETITEM HDM_SETITEMA +#define HDN_ITEMCHANGING HDN_ITEMCHANGINGA +#define HDN_ITEMCHANGED HDN_ITEMCHANGEDA +#define HDN_ITEMCLICK HDN_ITEMCLICKA +#define HDN_ITEMDBLCLICK HDN_ITEMDBLCLICKA +#define HDN_DIVIDERDBLCLICK HDN_DIVIDERDBLCLICKA +#define HDN_BEGINTRACK HDN_BEGINTRACKA +#define HDN_ENDTRACK HDN_ENDTRACKA +#define HDN_TRACK HDN_TRACKA +#if (_WIN32_IE >= 0x0300) +#define HDN_GETDISPINFO HDN_GETDISPINFOA +#endif +#define HD_NOTIFY HD_NOTIFYA +#define TBSAVEPARAMS TBSAVEPARAMSA +#define TB_GETBUTTONTEXT TB_GETBUTTONTEXTA +#define TB_SAVERESTORE TB_SAVERESTOREA +#define TB_ADDSTRING TB_ADDSTRINGA +#define TBN_GETBUTTONINFO TBN_GETBUTTONINFOA +#if _WIN32_IE >= 0x400 +#define TBBUTTONINFO TBBUTTONINFOA +#define LPTBBUTTONINFO LPTBBUTTONINFOA +#endif +#define TBNOTIFY TBNOTIFYA +#define LPTBNOTIFY LPTBNOTIFYA +#define NMTOOLBAR NMTOOLBARA +#define LPNMTOOLBAR LPNMTOOLBARA +#define TTM_ADDTOOL TTM_ADDTOOLA +#define TTM_DELTOOL TTM_DELTOOLA +#define TTM_NEWTOOLRECT TTM_NEWTOOLRECTA +#define TTM_GETTOOLINFO TTM_GETTOOLINFOA +#define TTM_SETTOOLINFO TTM_SETTOOLINFOA +#define TTM_HITTEST TTM_HITTESTA +#define TTM_GETTEXT TTM_GETTEXTA +#define TTM_UPDATETIPTEXT TTM_UPDATETIPTEXTA +#define TTM_ENUMTOOLS TTM_ENUMTOOLSA +#define TTM_GETCURRENTTOOL TTM_GETCURRENTTOOLA +#define TTN_NEEDTEXT TTN_NEEDTEXTA +#define TTN_GETDISPINFO TTN_GETDISPINFOA +#define SB_GETTEXT SB_GETTEXTA +#define SB_SETTEXT SB_SETTEXTA +#define SB_GETTEXTLENGTH SB_GETTEXTLENGTHA +#define LV_ITEM LV_ITEMA +#define LVITEM LVITEMA +#define LPSTR_TEXTCALLBACK LPSTR_TEXTCALLBACKA +#if _WIN32_IE >= 0x0400 +#define LVBKIMAGE LVBKIMAGEA +#define LPLVBKIMAGE LPLVBKIMAGEA +#define LVM_SETBKIMAGE LVM_SETBKIMAGEA +#define LVM_GETBKIMAGE LVM_GETBKIMAGEA +#endif /* _WIN32_IE >= 0x0400 */ +#define LVM_GETITEM LVM_GETITEMA +#define LVM_SETITEM LVM_SETITEMA +#define LVM_INSERTITEM LVM_INSERTITEMA +#define LV_FINDINFO LV_FINDINFOA +#define LVFINDINFO LVFINDINFOA +#define LPFINDINFO LPFINDINFOA +#define LVM_FINDITEM LVM_FINDITEMA +#define LVM_GETSTRINGWIDTH LVM_GETSTRINGWIDTHA +#define LVM_EDITLABEL LVM_EDITLABELA +#define LV_COLUMN LV_COLUMNA +#define LVCOLUMN LVCOLUMNA +#define LVM_GETCOLUMN LVM_GETCOLUMNA +#define LVM_SETCOLUMN LVM_SETCOLUMNA +#define LVM_INSERTCOLUMN LVM_INSERTCOLUMNA +#define LVM_GETITEMTEXT LVM_GETITEMTEXTA +#define LVM_SETITEMTEXT LVM_SETITEMTEXTA +#define LVM_GETISEARCHSTRING LVM_GETISEARCHSTRINGA +#define LVN_BEGINLABELEDIT LVN_BEGINLABELEDITA +#define LVN_ENDLABELEDIT LVN_ENDLABELEDITA +#define LVN_GETDISPINFO LVN_GETDISPINFOA +#define LVN_SETDISPINFO LVN_SETDISPINFOA +#define LVN_GETINFOTIP LVN_GETINFOTIPA +#define NMLVGETINFOTIP NMLVGETINFOTIPA +#define LPNMLVGETINFOTIP LPNMLVGETINFOTIPA +#define LV_DISPINFO LV_DISPINFOA +#define NMLVDISPINFO NMLVDISPINFOA +#define TVM_INSERTITEM TVM_INSERTITEMA +#define TVM_GETITEM TVM_GETITEMA +#define TVM_SETITEM TVM_SETITEMA +#define TVM_EDITLABEL TVM_EDITLABELA +#define TVM_GETISEARCHSTRING TVM_GETISEARCHSTRINGA +#define TV_DISPINFO NMTVDISPINFOA +#define NMTVDISPINFO NMTVDISPINFOA +#define LPNMTVDISPINFO LPNMTVDISPINFOA +#if (_WIN32_IE >= 0x0400) +#define NMTVGETINFOTIP NMTVGETINFOTIPA +#define LPNMTVGETINFOTIP LPNMTVGETINFOTIPA +#define TVN_GETINFOTIP TVN_GETINFOTIPA +#endif +#define TVN_SELCHANGING TVN_SELCHANGINGA +#define TVN_SELCHANGED TVN_SELCHANGEDA +#define TVN_GETDISPINFO TVN_GETDISPINFOA +#define TVN_SETDISPINFO TVN_SETDISPINFOA +#define TVN_ITEMEXPANDING TVN_ITEMEXPANDINGA +#define TVN_ITEMEXPANDED TVN_ITEMEXPANDEDA +#define TVN_BEGINDRAG TVN_BEGINDRAGA +#define TVN_BEGINRDRAG TVN_BEGINRDRAGA +#define TVN_DELETEITEM TVN_DELETEITEMA +#define TVN_BEGINLABELEDIT TVN_BEGINLABELEDITA +#define TVN_ENDLABELEDIT TVN_ENDLABELEDITA +#define TC_ITEMHEADER TC_ITEMHEADERA +#define TC_ITEM TC_ITEMA +#define TCITEM TCITEMA +#define LPTCITEM LPTCITEMA +#define TCM_GETITEM TCM_GETITEMA +#define TCM_SETITEM TCM_SETITEMA +#define TCM_INSERTITEM TCM_INSERTITEMA +#define CreateStatusWindow CreateStatusWindowA +#define DrawStatusText DrawStatusTextA +#define ImageList_LoadImage ImageList_LoadImageA +#define DTM_SETFORMAT DTM_SETFORMATA +#define DTN_USERSTRING DTN_USERSTRINGA +#define DTN_WMKEYDOWN DTN_WMKEYDOWNA +#define DTN_FORMAT DTN_FORMATA +#define DTN_FORMATQUERY DTN_FORMATQUERYA +typedef REBARBANDINFOA REBARBANDINFO,*LPREBARBANDINFO; +#define LPCREBARBANDINFO LPCREBARBANDINFOA +#define REBARBANDINFO_V3_SIZE REBARBANDINFOA_V3_SIZE +#define RB_INSERTBAND RB_INSERTBANDA +#define RB_SETBANDINFO RB_SETBANDINFOA +#endif +#endif /* RC_INVOKED */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/commdlg.h b/reactos/w32api/include/commdlg.h new file mode 100644 index 00000000000..afe2a0cb710 --- /dev/null +++ b/reactos/w32api/include/commdlg.h @@ -0,0 +1,583 @@ +#ifndef _COMMDLG_H +#define _COMMDLG_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#pragma pack(push,1) + +#define LBSELCHSTRINGA "commdlg_LBSelChangedNotify" +#define SHAREVISTRINGA "commdlg_ShareViolation" +#define FILEOKSTRINGA "commdlg_FileNameOK" +#define COLOROKSTRINGA "commdlg_ColorOK" +#define SETRGBSTRINGA "commdlg_SetRGBColor" +#define HELPMSGSTRINGA "commdlg_help" +#define FINDMSGSTRINGA "commdlg_FindReplace" +#define LBSELCHSTRINGW L"commdlg_LBSelChangedNotify" +#define SHAREVISTRINGW L"commdlg_ShareViolation" +#define FILEOKSTRINGW L"commdlg_FileNameOK" +#define COLOROKSTRINGW L"commdlg_ColorOK" +#define SETRGBSTRINGW L"commdlg_SetRGBColor" +#define HELPMSGSTRINGW L"commdlg_help" +#define FINDMSGSTRINGW L"commdlg_FindReplace" +#ifndef CDN_FIRST +#define CDN_FIRST ((UINT)-601) /* also in commctrl.h */ +#define CDN_LAST ((UINT)-699) +#endif +#define CDN_INITDONE CDN_FIRST +#define CDN_SELCHANGE (CDN_FIRST-1U) +#define CDN_FOLDERCHANGE (CDN_FIRST-2U) +#define CDN_SHAREVIOLATION (CDN_FIRST-3U) +#define CDN_HELP (CDN_FIRST-4U) +#define CDN_FILEOK (CDN_FIRST-5U) +#define CDN_TYPECHANGE (CDN_FIRST-6U) +#define CDM_FIRST (WM_USER+100) +#define CDM_LAST (WM_USER+200) +#define CDM_GETSPEC CDM_FIRST +#define CDM_GETFILEPATH (CDM_FIRST+1) +#define CDM_GETFOLDERPATH (CDM_FIRST+2) +#define CDM_GETFOLDERIDLIST (CDM_FIRST+3) +#define CDM_SETCONTROLTEXT (CDM_FIRST+4) +#define CDM_HIDECONTROL (CDM_FIRST+5) +#define CDM_SETDEFEXT (CDM_FIRST+6) +#define CC_RGBINIT 1 +#define CC_FULLOPEN 2 +#define CC_PREVENTFULLOPEN 4 +#define CC_SHOWHELP 8 +#define CC_ENABLEHOOK 16 +#define CC_ENABLETEMPLATE 32 +#define CC_ENABLETEMPLATEHANDLE 64 +#define CC_SOLIDCOLOR 128 +#define CC_ANYCOLOR 256 +#define CF_SCREENFONTS 1 +#define CF_PRINTERFONTS 2 +#define CF_BOTH 3 +#define CF_SHOWHELP 4 +#define CF_ENABLEHOOK 8 +#define CF_ENABLETEMPLATE 16 +#define CF_ENABLETEMPLATEHANDLE 32 +#define CF_INITTOLOGFONTSTRUCT 64 +#define CF_USESTYLE 128 +#define CF_EFFECTS 256 +#define CF_APPLY 512 +#define CF_ANSIONLY 1024 +#define CF_SCRIPTSONLY CF_ANSIONLY +#define CF_NOVECTORFONTS 2048 +#define CF_NOOEMFONTS 2048 +#define CF_NOSIMULATIONS 4096 +#define CF_LIMITSIZE 8192 +#define CF_FIXEDPITCHONLY 16384 +#define CF_WYSIWYG 32768 +#define CF_FORCEFONTEXIST 65536 +#define CF_SCALABLEONLY 131072 +#define CF_TTONLY 262144 +#define CF_NOFACESEL 524288 +#define CF_NOSTYLESEL 1048576 +#define CF_NOSIZESEL 2097152 +#define CF_SELECTSCRIPT 4194304 +#define CF_NOSCRIPTSEL 8388608 +#define CF_NOVERTFONTS 0x1000000 +#define SIMULATED_FONTTYPE 0x8000 +#define PRINTER_FONTTYPE 0x4000 +#define SCREEN_FONTTYPE 0x2000 +#define BOLD_FONTTYPE 0x100 +#define ITALIC_FONTTYPE 0x0200 +#define REGULAR_FONTTYPE 0x0400 +#define WM_CHOOSEFONT_GETLOGFONT (WM_USER+1) +#define WM_CHOOSEFONT_SETLOGFONT (WM_USER+101) +#define WM_CHOOSEFONT_SETFLAGS (WM_USER+102) +#define OFN_ALLOWMULTISELECT 512 +#define OFN_CREATEPROMPT 0x2000 +#define OFN_ENABLEHOOK 32 +#define OFN_ENABLESIZING 0x800000 +#define OFN_ENABLETEMPLATE 64 +#define OFN_ENABLETEMPLATEHANDLE 128 +#define OFN_EXPLORER 0x80000 +#define OFN_EXTENSIONDIFFERENT 0x400 +#define OFN_FILEMUSTEXIST 0x1000 +#define OFN_HIDEREADONLY 4 +#define OFN_LONGNAMES 0x200000 +#define OFN_NOCHANGEDIR 8 +#define OFN_NODEREFERENCELINKS 0x100000 +#define OFN_NOLONGNAMES 0x40000 +#define OFN_NONETWORKBUTTON 0x20000 +#define OFN_NOREADONLYRETURN 0x8000 +#define OFN_NOTESTFILECREATE 0x10000 +#define OFN_NOVALIDATE 256 +#define OFN_OVERWRITEPROMPT 2 +#define OFN_PATHMUSTEXIST 0x800 +#define OFN_READONLY 1 +#define OFN_SHAREAWARE 0x4000 +#define OFN_SHOWHELP 16 +#define OFN_SHAREFALLTHROUGH 2 +#define OFN_SHARENOWARN 1 +#define OFN_SHAREWARN 0 +#define OFN_NODEREFERENCELINKS 0x100000 +#define FR_DIALOGTERM 64 +#define FR_DOWN 1 +#define FR_ENABLEHOOK 256 +#define FR_ENABLETEMPLATE 512 +#define FR_ENABLETEMPLATEHANDLE 0x2000 +#define FR_FINDNEXT 8 +#define FR_HIDEUPDOWN 0x4000 +#define FR_HIDEMATCHCASE 0x8000 +#define FR_HIDEWHOLEWORD 0x10000 +#define FR_MATCHALEFHAMZA 0x80000000 +#define FR_MATCHCASE 4 +#define FR_MATCHDIAC 0x20000000 +#define FR_MATCHKASHIDA 0x40000000 +#define FR_NOMATCHCASE 0x800 +#define FR_NOUPDOWN 0x400 +#define FR_NOWHOLEWORD 4096 +#define FR_REPLACE 16 +#define FR_REPLACEALL 32 +#define FR_SHOWHELP 128 +#define FR_WHOLEWORD 2 +#define PD_ALLPAGES 0 +#define PD_SELECTION 1 +#define PD_PAGENUMS 2 +#define PD_NOSELECTION 4 +#define PD_NOPAGENUMS 8 +#define PD_COLLATE 16 +#define PD_PRINTTOFILE 32 +#define PD_PRINTSETUP 64 +#define PD_NOWARNING 128 +#define PD_RETURNDC 256 +#define PD_RETURNIC 512 +#define PD_RETURNDEFAULT 1024 +#define PD_SHOWHELP 2048 +#define PD_ENABLEPRINTHOOK 4096 +#define PD_ENABLESETUPHOOK 8192 +#define PD_ENABLEPRINTTEMPLATE 16384 +#define PD_ENABLESETUPTEMPLATE 32768 +#define PD_ENABLEPRINTTEMPLATEHANDLE 65536 +#define PD_ENABLESETUPTEMPLATEHANDLE 0x20000 +#define PD_USEDEVMODECOPIES 0x40000 +#define PD_USEDEVMODECOPIESANDCOLLATE 0x40000 +#define PD_DISABLEPRINTTOFILE 0x80000 +#define PD_HIDEPRINTTOFILE 0x100000 +#define PD_NONETWORKBUTTON 0x200000 +#define PSD_DEFAULTMINMARGINS 0 +#define PSD_INWININIINTLMEASURE 0 +#define PSD_MINMARGINS 1 +#define PSD_MARGINS 2 +#define PSD_INTHOUSANDTHSOFINCHES 4 +#define PSD_INHUNDREDTHSOFMILLIMETERS 8 +#define PSD_DISABLEMARGINS 16 +#define PSD_DISABLEPRINTER 32 +#define PSD_NOWARNING 128 +#define PSD_DISABLEORIENTATION 256 +#define PSD_DISABLEPAPER 512 +#define PSD_RETURNDEFAULT 1024 +#define PSD_SHOWHELP 2048 +#define PSD_ENABLEPAGESETUPHOOK 8192 +#define PSD_ENABLEPAGESETUPTEMPLATE 0x8000 +#define PSD_ENABLEPAGESETUPTEMPLATEHANDLE 0x20000 +#define PSD_ENABLEPAGEPAINTHOOK 0x40000 +#define PSD_DISABLEPAGEPAINTING 0x80000 +#define WM_PSD_PAGESETUPDLG WM_USER +#define WM_PSD_FULLPAGERECT (WM_USER+1) +#define WM_PSD_MINMARGINRECT (WM_USER+2) +#define WM_PSD_MARGINRECT (WM_USER+3) +#define WM_PSD_GREEKTEXTRECT (WM_USER+4) +#define WM_PSD_ENVSTAMPRECT (WM_USER+5) +#define WM_PSD_YAFULLPAGERECT (WM_USER+6) +#define CD_LBSELNOITEMS (-1) +#define CD_LBSELCHANGE 0 +#define CD_LBSELSUB 1 +#define CD_LBSELADD 2 +#define DN_DEFAULTPRN 1 + +#ifndef SNDMSG +#ifdef __cplusplus +#define SNDMSG ::SendMessage +#else +#define SNDMSG SendMessage +#endif +#endif /* ifndef SNDMSG */ + +#define CommDlg_OpenSave_GetSpec(d,s,m) ((int)SNDMSG((d),CDM_GETSPEC,(m),(LPARAM)(s))) +#define CommDlg_OpenSave_GetSpecA CommDlg_OpenSave_GetSpec +#define CommDlg_OpenSave_GetSpecW CommDlg_OpenSave_GetSpec +#define CommDlg_OpenSave_GetFilePath(d,s,m) ((int)SNDMSG((d),CDM_GETFILEPATH,(m),(LPARAM)(s))) +#define CommDlg_OpenSave_GetFilePathA CommDlg_OpenSave_GetFilePath +#define CommDlg_OpenSave_GetFilePathW CommDlg_OpenSave_GetFilePath +#define CommDlg_OpenSave_GetFolderPath(d,s,m) ((int)SNDMSG((d),CDM_GETFOLDERPATH,(m),(LPARAM)(LPSTR)(s))) +#define CommDlg_OpenSave_GetFolderPathA CommDlg_OpenSave_GetFolderPath +#define CommDlg_OpenSave_GetFolderPathW CommDlg_OpenSave_GetFolderPath +#define CommDlg_OpenSave_GetFolderIDList(d,i,m) ((int)SNDMSG((d),CDM_GETFOLDERIDLIST,(m),(LPARAM)(i))) +#define CommDlg_OpenSave_SetControlText(d,i,t) ((void)SNDMSG((d),CDM_SETCONTROLTEXT,(i),(LPARAM)(t))) +#define CommDlg_OpenSave_HideControl(d,i) ((void)SNDMSG((d),CDM_HIDECONTROL,(i),0)) +#define CommDlg_OpenSave_SetDefExt(d,e) ((void)SNDMSG((d),CDM_SETDEFEXT,0,(LPARAM)(e))) + +typedef UINT (APIENTRY *__CDHOOKPROC)(HWND,UINT,WPARAM,LPARAM); +typedef __CDHOOKPROC LPCCHOOKPROC; +typedef __CDHOOKPROC LPCFHOOKPROC; +typedef __CDHOOKPROC LPFRHOOKPROC; +typedef __CDHOOKPROC LPOFNHOOKPROC; +typedef __CDHOOKPROC LPPAGEPAINTHOOK; +typedef __CDHOOKPROC LPPAGESETUPHOOK; +typedef __CDHOOKPROC LPSETUPHOOKPROC; +typedef __CDHOOKPROC LPPRINTHOOKPROC; +typedef struct tagCHOOSECOLORA { + DWORD lStructSize; + HWND hwndOwner; + HWND hInstance; + COLORREF rgbResult; + COLORREF* lpCustColors; + DWORD Flags; + LPARAM lCustData; + LPCCHOOKPROC lpfnHook; + LPCSTR lpTemplateName; +} CHOOSECOLORA,*LPCHOOSECOLORA; +typedef struct tagCHOOSECOLORW { + DWORD lStructSize; + HWND hwndOwner; + HWND hInstance; + COLORREF rgbResult; + COLORREF* lpCustColors; + DWORD Flags; + LPARAM lCustData; + LPCCHOOKPROC lpfnHook; + LPCWSTR lpTemplateName; +} CHOOSECOLORW,*LPCHOOSECOLORW; +typedef struct tagCHOOSEFONTA { + DWORD lStructSize; + HWND hwndOwner; + HDC hDC; + LPLOGFONTA lpLogFont; + INT iPointSize; + DWORD Flags; + DWORD rgbColors; + LPARAM lCustData; + LPCFHOOKPROC lpfnHook; + LPCSTR lpTemplateName; + HINSTANCE hInstance; + LPSTR lpszStyle; + WORD nFontType; + WORD ___MISSING_ALIGNMENT__; + INT nSizeMin; + INT nSizeMax; +} CHOOSEFONTA,*LPCHOOSEFONTA; +typedef struct tagCHOOSEFONTW { + DWORD lStructSize; + HWND hwndOwner; + HDC hDC; + LPLOGFONTW lpLogFont; + INT iPointSize; + DWORD Flags; + DWORD rgbColors; + LPARAM lCustData; + LPCFHOOKPROC lpfnHook; + LPCWSTR lpTemplateName; + HINSTANCE hInstance; + LPWSTR lpszStyle; + WORD nFontType; + WORD ___MISSING_ALIGNMENT__; + INT nSizeMin; + INT nSizeMax; +} CHOOSEFONTW,*LPCHOOSEFONTW; +typedef struct tagDEVNAMES { + WORD wDriverOffset; + WORD wDeviceOffset; + WORD wOutputOffset; + WORD wDefault; +} DEVNAMES,*LPDEVNAMES; +typedef struct { + DWORD lStructSize; + HWND hwndOwner; + HINSTANCE hInstance; + DWORD Flags; + LPSTR lpstrFindWhat; + LPSTR lpstrReplaceWith; + WORD wFindWhatLen; + WORD wReplaceWithLen; + LPARAM lCustData; + LPFRHOOKPROC lpfnHook; + LPCSTR lpTemplateName; +} FINDREPLACEA,*LPFINDREPLACEA; +typedef struct { + DWORD lStructSize; + HWND hwndOwner; + HINSTANCE hInstance; + DWORD Flags; + LPWSTR lpstrFindWhat; + LPWSTR lpstrReplaceWith; + WORD wFindWhatLen; + WORD wReplaceWithLen; + LPARAM lCustData; + LPFRHOOKPROC lpfnHook; + LPCWSTR lpTemplateName; +} FINDREPLACEW,*LPFINDREPLACEW; +typedef struct tagOFNA { + DWORD lStructSize; + HWND hwndOwner; + HINSTANCE hInstance; + LPCSTR lpstrFilter; + LPSTR lpstrCustomFilter; + DWORD nMaxCustFilter; + DWORD nFilterIndex; + LPSTR lpstrFile; + DWORD nMaxFile; + LPSTR lpstrFileTitle; + DWORD nMaxFileTitle; + LPCSTR lpstrInitialDir; + LPCSTR lpstrTitle; + DWORD Flags; + WORD nFileOffset; + WORD nFileExtension; + LPCSTR lpstrDefExt; + DWORD lCustData; + LPOFNHOOKPROC lpfnHook; + LPCSTR lpTemplateName; +} OPENFILENAMEA,*LPOPENFILENAMEA; +typedef struct tagOFNW { + DWORD lStructSize; + HWND hwndOwner; + HINSTANCE hInstance; + LPCWSTR lpstrFilter; + LPWSTR lpstrCustomFilter; + DWORD nMaxCustFilter; + DWORD nFilterIndex; + LPWSTR lpstrFile; + DWORD nMaxFile; + LPWSTR lpstrFileTitle; + DWORD nMaxFileTitle; + LPCWSTR lpstrInitialDir; + LPCWSTR lpstrTitle; + DWORD Flags; + WORD nFileOffset; + WORD nFileExtension; + LPCWSTR lpstrDefExt; + DWORD lCustData; + LPOFNHOOKPROC lpfnHook; + LPCWSTR lpTemplateName; +} OPENFILENAMEW,*LPOPENFILENAMEW; +typedef struct _OFNOTIFYA { + NMHDR hdr; + LPOPENFILENAMEA lpOFN; + LPSTR pszFile; +} OFNOTIFYA,*LPOFNOTIFYA; +typedef struct _OFNOTIFYW { + NMHDR hdr; + LPOPENFILENAMEW lpOFN; + LPWSTR pszFile; +} OFNOTIFYW,*LPOFNOTIFYW; +typedef struct tagPSDA { + DWORD lStructSize; + HWND hwndOwner; + HGLOBAL hDevMode; + HGLOBAL hDevNames; + DWORD Flags; + POINT ptPaperSize; + RECT rtMinMargin; + RECT rtMargin; + HINSTANCE hInstance; + LPARAM lCustData; + LPPAGESETUPHOOK lpfnPageSetupHook; + LPPAGEPAINTHOOK lpfnPagePaintHook; + LPCSTR lpPageSetupTemplateName; + HGLOBAL hPageSetupTemplate; +} PAGESETUPDLGA,*LPPAGESETUPDLGA; +typedef struct tagPSDW { + DWORD lStructSize; + HWND hwndOwner; + HGLOBAL hDevMode; + HGLOBAL hDevNames; + DWORD Flags; + POINT ptPaperSize; + RECT rtMinMargin; + RECT rtMargin; + HINSTANCE hInstance; + LPARAM lCustData; + LPPAGESETUPHOOK lpfnPageSetupHook; + LPPAGEPAINTHOOK lpfnPagePaintHook; + LPCWSTR lpPageSetupTemplateName; + HGLOBAL hPageSetupTemplate; +} PAGESETUPDLGW,*LPPAGESETUPDLGW; +typedef struct tagPDA { + DWORD lStructSize; + HWND hwndOwner; + HANDLE hDevMode; + HANDLE hDevNames; + HDC hDC; + DWORD Flags; + WORD nFromPage; + WORD nToPage; + WORD nMinPage; + WORD nMaxPage; + WORD nCopies; + HINSTANCE hInstance; + DWORD lCustData; + LPPRINTHOOKPROC lpfnPrintHook; + LPSETUPHOOKPROC lpfnSetupHook; + LPCSTR lpPrintTemplateName; + LPCSTR lpSetupTemplateName; + HANDLE hPrintTemplate; + HANDLE hSetupTemplate; +} PRINTDLGA,*LPPRINTDLGA; +typedef struct tagPDW { + DWORD lStructSize; + HWND hwndOwner; + HANDLE hDevMode; + HANDLE hDevNames; + HDC hDC; + DWORD Flags; + WORD nFromPage; + WORD nToPage; + WORD nMinPage; + WORD nMaxPage; + WORD nCopies; + HINSTANCE hInstance; + DWORD lCustData; + LPPRINTHOOKPROC lpfnPrintHook; + LPSETUPHOOKPROC lpfnSetupHook; + LPCWSTR lpPrintTemplateName; + LPCWSTR lpSetupTemplateName; + HANDLE hPrintTemplate; + HANDLE hSetupTemplate; +} PRINTDLGW,*LPPRINTDLGW; +#if (WINVER >= 0x0500) && !defined (__OBJC__) +#include <unknwn.h> /* for LPUNKNOWN */ +#include <prsht.h> /* for HPROPSHEETPAGE */ +typedef struct tagPRINTPAGERANGE { + DWORD nFromPage; + DWORD nToPage; +} PRINTPAGERANGE, *LPPRINTPAGERANGE; +typedef struct tagPDEXA { + DWORD lStructSize; + HWND hwndOwner; + HGLOBAL hDevMode; + HGLOBAL hDevNames; + HDC hDC; + DWORD Flags; + DWORD Flags2; + DWORD ExclusionFlags; + DWORD nPageRanges; + DWORD nMaxPageRanges; + LPPRINTPAGERANGE lpPageRanges; + DWORD nMinPage; + DWORD nMaxPage; + DWORD nCopies; + HINSTANCE hInstance; + LPCSTR lpPrintTemplateName; + LPUNKNOWN lpCallback; + DWORD nPropertyPages; + HPROPSHEETPAGE *lphPropertyPages; + DWORD nStartPage; + DWORD dwResultAction; +} PRINTDLGEXA, *LPPRINTDLGEXA; +typedef struct tagPDEXW { + DWORD lStructSize; + HWND hwndOwner; + HGLOBAL hDevMode; + HGLOBAL hDevNames; + HDC hDC; + DWORD Flags; + DWORD Flags2; + DWORD ExclusionFlags; + DWORD nPageRanges; + DWORD nMaxPageRanges; + LPPRINTPAGERANGE lpPageRanges; + DWORD nMinPage; + DWORD nMaxPage; + DWORD nCopies; + HINSTANCE hInstance; + LPCWSTR lpPrintTemplateName; + LPUNKNOWN lpCallback; + DWORD nPropertyPages; + HPROPSHEETPAGE *lphPropertyPages; + DWORD nStartPage; + DWORD dwResultAction; +} PRINTDLGEXW, *LPPRINTDLGEXW; +#endif /* WINVER >= 0x0500 */ + +BOOL WINAPI ChooseColorA(LPCHOOSECOLORA); +BOOL WINAPI ChooseColorW(LPCHOOSECOLORW); +BOOL WINAPI ChooseFontA(LPCHOOSEFONTA); +BOOL WINAPI ChooseFontW(LPCHOOSEFONTW); +DWORD WINAPI CommDlgExtendedError(void); +HWND WINAPI FindTextA(LPFINDREPLACEA); +HWND WINAPI FindTextW(LPFINDREPLACEW); +short WINAPI GetFileTitleA(LPCSTR,LPSTR,WORD); +short WINAPI GetFileTitleW(LPCWSTR,LPWSTR,WORD); +BOOL WINAPI GetOpenFileNameA(LPOPENFILENAMEA); +BOOL WINAPI GetOpenFileNameW(LPOPENFILENAMEW); +BOOL WINAPI GetSaveFileNameA(LPOPENFILENAMEA); +BOOL WINAPI GetSaveFileNameW(LPOPENFILENAMEW); +BOOL WINAPI PageSetupDlgA(LPPAGESETUPDLGA); +BOOL WINAPI PageSetupDlgW(LPPAGESETUPDLGW); +BOOL WINAPI PrintDlgA(LPPRINTDLGA); +BOOL WINAPI PrintDlgW(LPPRINTDLGW); +HWND WINAPI ReplaceTextA(LPFINDREPLACEA); +HWND WINAPI ReplaceTextW(LPFINDREPLACEW); +#if (WINVER >= 0x0500) && !defined (__OBJC__) +HRESULT WINAPI PrintDlgExA(LPPRINTDLGEXA); +HRESULT WINAPI PrintDlgExW(LPPRINTDLGEXW); +#endif /* WINVER >= 0x0500 */ + +#ifdef UNICODE +#define LBSELCHSTRING LBSELCHSTRINGW +#define SHAREVISTRING SHAREVISTRINGW +#define FILEOKSTRING FILEOKSTRINGW +#define COLOROKSTRING COLOROKSTRINGW +#define SETRGBSTRING SETRGBSTRINGW +#define HELPMSGSTRING HELPMSGSTRINGW +#define FINDMSGSTRING FINDMSGSTRINGW +typedef CHOOSECOLORW CHOOSECOLOR,*LPCHOOSECOLOR; +typedef CHOOSEFONTW CHOOSEFONT,*LPCHOOSEFONT; +typedef FINDREPLACEW FINDREPLACE,*LPFINDREPLACE; +typedef OPENFILENAMEW OPENFILENAME,*LPOPENFILENAME; +typedef OFNOTIFYW OFNOTIFY,*LPOFNOTIFY; +typedef PAGESETUPDLGW PAGESETUPDLG,*LPPAGESETUPDLG; +typedef PRINTDLGW PRINTDLG,*LPPRINTDLG; +#define ChooseColor ChooseColorW +#define ChooseFont ChooseFontW +#define FindText FindTextW +#define GetFileTitle GetFileTitleW +#define GetOpenFileName GetOpenFileNameW +#define GetSaveFileName GetSaveFileNameW +#define PageSetupDlg PageSetupDlgW +#define PrintDlg PrintDlgW +#define ReplaceText ReplaceTextW +#if (WINVER >= 0x0500) && !defined (__OBJC__) +typedef PRINTDLGEXW PRINTDLGEX, *LPPRINTDLGEX; +#define PrintDlgEx PrintDlgExW +#endif /* WINVER >= 0x0500 */ +#else /* UNICODE */ +#define LBSELCHSTRING LBSELCHSTRINGA +#define SHAREVISTRING SHAREVISTRINGA +#define FILEOKSTRING FILEOKSTRINGA +#define COLOROKSTRING COLOROKSTRINGA +#define SETRGBSTRING SETRGBSTRINGA +#define HELPMSGSTRING HELPMSGSTRINGA +#define FINDMSGSTRING FINDMSGSTRINGA +typedef CHOOSECOLORA CHOOSECOLOR,*LPCHOOSECOLOR; +typedef CHOOSEFONTA CHOOSEFONT,*LPCHOOSEFONT; +typedef FINDREPLACEA FINDREPLACE,*LPFINDREPLACE; +typedef OPENFILENAMEA OPENFILENAME,*LPOPENFILENAME; +typedef OFNOTIFYA OFNOTIFY,*LPOFNOTIFY; +typedef PAGESETUPDLGA PAGESETUPDLG,*LPPAGESETUPDLG; +typedef PRINTDLGA PRINTDLG,*LPPRINTDLG; +#define ChooseColor ChooseColorA +#define ChooseFont ChooseFontA +#define FindText FindTextA +#define GetFileTitle GetFileTitleA +#define GetOpenFileName GetOpenFileNameA +#define GetSaveFileName GetSaveFileNameA +#define PageSetupDlg PageSetupDlgA +#define PrintDlg PrintDlgA +#define ReplaceText ReplaceTextA +#if (WINVER >= 0x0500) && !defined (__OBJC__) +typedef PRINTDLGEXA PRINTDLGEX, *LPPRINTDLGEX; +#define PrintDlgEx PrintDlgExA +#endif /* WINVER >= 0x0500 */ +#endif /* UNICODE */ +#pragma pack(pop) +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/cpl.h b/reactos/w32api/include/cpl.h new file mode 100644 index 00000000000..aaec59734e4 --- /dev/null +++ b/reactos/w32api/include/cpl.h @@ -0,0 +1,61 @@ +#ifndef _CPL_H +#define _CPL_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define WM_CPL_LAUNCH (WM_USER+1000) +#define WM_CPL_LAUNCHED (WM_USER+1001) +#define CPL_DYNAMIC_RES 0 +#define CPL_INIT 1 +#define CPL_GETCOUNT 2 +#define CPL_INQUIRE 3 +#define CPL_SELECT 4 +#define CPL_DBLCLK 5 +#define CPL_STOP 6 +#define CPL_EXIT 7 +#define CPL_NEWINQUIRE 8 +#define CPL_STARTWPARMSA 9 +#define CPL_STARTWPARMSW 10 +#define CPL_SETUP 200 +typedef LONG(APIENTRY *APPLET_PROC)(HWND,UINT,LONG,LONG); +typedef struct tagCPLINFO { + int idIcon; + int idName; + int idInfo; + LONG lData; +} CPLINFO,*LPCPLINFO; +typedef struct tagNEWCPLINFOA { + DWORD dwSize; + DWORD dwFlags; + DWORD dwHelpContext; + LONG lData; + HICON hIcon; + CHAR szName[32]; + CHAR szInfo[64]; + CHAR szHelpFile[128]; +} NEWCPLINFOA,*LPNEWCPLINFOA; +typedef struct tagNEWCPLINFOW { + DWORD dwSize; + DWORD dwFlags; + DWORD dwHelpContext; + LONG lData; + HICON hIcon; + WCHAR szName[32]; + WCHAR szInfo[64]; + WCHAR szHelpFile[128]; +} NEWCPLINFOW,*LPNEWCPLINFOW; +#ifdef UNICODE +#define CPL_STARTWPARMS CPL_STARTWPARMSW +typedef NEWCPLINFOW NEWCPLINFO,*LPNEWCPLINFO; +#else +#define CPL_STARTWPARMS CPL_STARTWPARMSA +typedef NEWCPLINFOA NEWCPLINFO,*LPNEWCPLINFO; +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/cplext.h b/reactos/w32api/include/cplext.h new file mode 100644 index 00000000000..34333b5664b --- /dev/null +++ b/reactos/w32api/include/cplext.h @@ -0,0 +1,12 @@ +#ifndef _CPLEXT_H +#define _CPLEXT_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#define CPLPAGE_MOUSE_BUTTONS 1 +#define CPLPAGE_MOUSE_PTRMOTION 2 +#define CPLPAGE_MOUSE_WHEEL 3 +#define CPLPAGE_KEYBOARD_SPEED 1 +#define CPLPAGE_DISPLAY_BACKGROUND 1 +#endif diff --git a/reactos/w32api/include/custcntl.h b/reactos/w32api/include/custcntl.h new file mode 100644 index 00000000000..8a9d5ff32b4 --- /dev/null +++ b/reactos/w32api/include/custcntl.h @@ -0,0 +1,102 @@ +#ifndef _CUSTCNTL_H +#define _CUSTCNTL_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define CCF_NOTEXT 1 +#define CCHCCCLASS 32 +#define CCHCCDESC 32 +#define CCHCCTEXT 256 + +typedef struct tagCCSTYLEA { + DWORD flStyle; + DWORD flExtStyle; + CHAR szText[CCHCCTEXT]; + LANGID lgid; + WORD wReserved1; +} CCSTYLEA,*LPCCSTYLEA; +typedef struct tagCCSTYLEW { + DWORD flStyle; + DWORD flExtStyle; + WCHAR szText[CCHCCTEXT]; + LANGID lgid; + WORD wReserved1; +} CCSTYLEW,*LPCCSTYLEW; +typedef struct tagCCSTYLEFLAGA { + DWORD flStyle; + DWORD flStyleMask; + LPSTR pszStyle; +} CCSTYLEFLAGA,*LPCCSTYLEFLAGA; +typedef struct tagCCSTYLEFLAGW { + DWORD flStyle; + DWORD flStyleMask; + LPWSTR pszStyle; +} CCSTYLEFLAGW,*LPCCSTYLEFLAGW; +typedef BOOL(CALLBACK* LPFNCCSTYLEA)(HWND,LPCCSTYLEA); +typedef INT(CALLBACK* LPFNCCSIZETOTEXTA)(DWORD,DWORD,HFONT,LPSTR); +typedef struct tagCCINFOA { + CHAR szClass[CCHCCCLASS]; + DWORD flOptions; + CHAR szDesc[CCHCCDESC]; + UINT cxDefault; + UINT cyDefault; + DWORD flStyleDefault; + DWORD flExtStyleDefault; + DWORD flCtrlTypeMask; + CHAR szTextDefault[CCHCCTEXT]; + INT cStyleFlags; + LPCCSTYLEFLAGA aStyleFlags; + LPFNCCSTYLEA lpfnStyle; + LPFNCCSIZETOTEXTA lpfnSizeToText; + DWORD dwReserved1; + DWORD dwReserved2; +} CCINFOA,*LPCCINFOA; +typedef UINT(CALLBACK* LPFNCCINFOA)(LPCCINFOA); +typedef BOOL(CALLBACK* LPFNCCSTYLEW)(HWND,LPCCSTYLEW); +typedef INT (CALLBACK* LPFNCCSIZETOTEXTW)(DWORD,DWORD,HFONT,LPWSTR); +typedef struct tagCCINFOW { + WCHAR szClass[CCHCCCLASS]; + DWORD flOptions; + WCHAR szDesc[CCHCCDESC]; + UINT cxDefault; + UINT cyDefault; + DWORD flStyleDefault; + DWORD flExtStyleDefault; + DWORD flCtrlTypeMask; + WCHAR szTextDefault[CCHCCTEXT]; + INT cStyleFlags; + LPCCSTYLEFLAGW aStyleFlags; + LPFNCCSTYLEW lpfnStyle; + LPFNCCSIZETOTEXTW lpfnSizeToText; + DWORD dwReserved1; + DWORD dwReserved2; +} CCINFOW,*LPCCINFOW; +typedef UINT(CALLBACK* LPFNCCINFOW)(LPCCINFOW); + +UINT CALLBACK CustomControlInfoA(LPCCINFOA acci); +UINT CALLBACK CustomControlInfoW(LPCCINFOW acci); + +#ifdef UNICODE +typedef CCSTYLEW CCSTYLE,*LPCCSTYLE; +typedef CCSTYLEFLAGW CCSTYLEFLAG,*LPCCSTYLEFLAG; +typedef CCINFOW CCINFO,*LPCCINFO; +#define LPFNCCSTYLE LPFNCCSTYLEW +#define LPFNCCSIZETOTEXT LPFNCCSIZETOTEXTW +#define LPFNCCINFO LPFNCCINFOW +#else +typedef CCSTYLEA CCSTYLE,*LPCCSTYLE; +typedef CCSTYLEFLAGA CCSTYLEFLAG,*LPCCSTYLEFLAG; +typedef CCINFOA CCINFO,*LPCCINFO; +#define LPFNCCSTYLE LPFNCCSTYLEA +#define LPFNCCSIZETOTEXT LPFNCCSIZETOTEXTA +#define LPFNCCINFO LPFNCCINFOA +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/dbt.h b/reactos/w32api/include/dbt.h new file mode 100644 index 00000000000..e804756a203 --- /dev/null +++ b/reactos/w32api/include/dbt.h @@ -0,0 +1,114 @@ +#ifndef _DBT_H +#define _DBT_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define DBT_NO_DISK_SPACE 0x47 +#define DBT_CONFIGMGPRIVATE 0x7FFF +#define DBT_DEVICEARRIVAL 0x8000 +#define DBT_DEVICEQUERYREMOVE 0x8001 +#define DBT_DEVICEQUERYREMOVEFAILED 0x8002 +#define DBT_DEVICEREMOVEPENDING 0x8003 +#define DBT_DEVICEREMOVECOMPLETE 0x8004 +#define DBT_DEVICETYPESPECIFIC 0x8005 +#define DBT_DEVTYP_OEM 0 +#define DBT_DEVTYP_DEVNODE 1 +#define DBT_DEVTYP_VOLUME 2 +#define DBT_DEVTYP_PORT 3 +#define DBT_DEVTYP_NET 4 +#define DBT_APPYBEGIN 0 +#define DBT_APPYEND 1 +#define DBT_DEVNODES_CHANGED 7 +#define DBT_QUERYCHANGECONFIG 0x17 +#define DBT_CONFIGCHANGED 0x18 +#define DBT_CONFIGCHANGECANCELED 0x19 +#define DBT_MONITORCHANGE 0x1B +#define DBT_SHELLLOGGEDON 32 +#define DBT_CONFIGMGAPI32 34 +#define DBT_VXDINITCOMPLETE 35 +#define DBT_VOLLOCKQUERYLOCK 0x8041 +#define DBT_VOLLOCKLOCKTAKEN 0x8042 +#define DBT_VOLLOCKLOCKFAILED 0x8043 +#define DBT_VOLLOCKQUERYUNLOCK 0x8044 +#define DBT_VOLLOCKLOCKRELEASED 0x8045 +#define DBT_VOLLOCKUNLOCKFAILED 0x8046 +#define DBT_USERDEFINED 0xFFFF +#define DBTF_MEDIA 1 +#define DBTF_NET 2 + +/* Also defined in winuser.h */ +#define BSM_ALLCOMPONENTS 0 +#define BSM_APPLICATIONS 8 +#define BSM_ALLDESKTOPS 16 +#define BSM_INSTALLABLEDRIVERS 4 +#define BSM_NETDRIVER 2 +#define BSM_VXDS 1 +#define BSF_FLUSHDISK 0x00000004 +#define BSF_FORCEIFHUNG 0x00000020 +#define BSF_IGNORECURRENTTASK 0x00000002 +#define BSF_NOHANG 0x00000008 +#define BSF_NOTIMEOUTIFNOTHUNG 0x00000040 +#define BSF_POSTMESSAGE 0x00000010 +#define BSF_QUERY 0x00000001 +#if (_WIN32_WINNT >= 0x0500) +#define BSF_ALLOWSFW 0x00000080 +#define BSF_SENDNOTIFYMESSAGE 0x00000100 +#endif /* (_WIN32_WINNT >= 0x0500) */ +#if (_WIN32_WINNT >= 0x0501) +#define BSF_LUID 0x00000400 +#define BSF_RETURNHDESK 0x00000200 +#endif /* (_WIN32_WINNT >= 0x0501) */ + +#define BSF_MSGSRV32ISOK_BIT 31 +#define BSF_MSGSRV32ISOK 0x80000000 + +typedef struct _DEV_BROADCAST_HDR { + DWORD dbch_size; + DWORD dbch_devicetype; + DWORD dbch_reserved; +} DEV_BROADCAST_HDR,*PDEV_BROADCAST_HDR; +typedef struct _DEV_BROADCAST_OEM { + DWORD dbco_size; + DWORD dbco_devicetype; + DWORD dbco_reserved; + DWORD dbco_identifier; + DWORD dbco_suppfunc; +} DEV_BROADCAST_OEM,*PDEV_BROADCAST_OEM; +typedef struct _DEV_BROADCAST_PORT_A { + DWORD dbcp_size; + DWORD dbcp_devicetype; + DWORD dbcp_reserved; + char dbcp_name[1]; +} DEV_BROADCAST_PORT_A, *PDEV_BROADCAST_PORT_A; +typedef struct _DEV_BROADCAST_PORT_W { + DWORD dbcp_size; + DWORD dbcp_devicetype; + DWORD dbcp_reserved; + wchar_t dbcp_name[1]; +} DEV_BROADCAST_PORT_W, *PDEV_BROADCAST_PORT_W; +typedef struct _DEV_BROADCAST_USERDEFINED { + struct _DEV_BROADCAST_HDR dbud_dbh; + char dbud_szName[1]; +} DEV_BROADCAST_USERDEFINED; +typedef struct _DEV_BROADCAST_VOLUME { + DWORD dbcv_size; + DWORD dbcv_devicetype; + DWORD dbcv_reserved; + DWORD dbcv_unitmask; + WORD dbcv_flags; +} DEV_BROADCAST_VOLUME,*PDEV_BROADCAST_VOLUME; + +#ifdef UNICODE +typedef DEV_BROADCAST_PORT_W DEV_BROADCAST_PORT, *PDEV_BROADCAST_PORT; +#else +typedef DEV_BROADCAST_PORT_A DEV_BROADCAST_PORT, *PDEV_BROADCAST_PORT; +#endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/dde.h b/reactos/w32api/include/dde.h new file mode 100644 index 00000000000..b13e9ce3982 --- /dev/null +++ b/reactos/w32api/include/dde.h @@ -0,0 +1,64 @@ +#ifndef _DDE_H +#define _DDE_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define WM_DDE_FIRST 0x03E0 +#define WM_DDE_INITIATE (WM_DDE_FIRST) +#define WM_DDE_TERMINATE (WM_DDE_FIRST+1) +#define WM_DDE_ADVISE (WM_DDE_FIRST+2) +#define WM_DDE_UNADVISE (WM_DDE_FIRST+3) +#define WM_DDE_ACK (WM_DDE_FIRST+4) +#define WM_DDE_DATA (WM_DDE_FIRST+5) +#define WM_DDE_REQUEST (WM_DDE_FIRST+6) +#define WM_DDE_POKE (WM_DDE_FIRST+7) +#define WM_DDE_EXECUTE (WM_DDE_FIRST+8) +#define WM_DDE_LAST (WM_DDE_FIRST+8) + +#ifndef RC_INVOKED +typedef struct { + unsigned short bAppReturnCode:8,reserved:6,fBusy:1,fAck:1; +} DDEACK; +typedef struct { + unsigned short reserved:14,fDeferUpd:1,fAckReq:1; + short cfFormat; +} DDEADVISE; +typedef struct { + unsigned short unused:12,fResponse:1,fRelease:1,reserved:1,fAckReq:1; + short cfFormat; + BYTE Value[1]; +} DDEDATA; +typedef struct { + unsigned short unused:13,fRelease:1,fReserved:2; + short cfFormat; + BYTE Value[1]; +} DDEPOKE; +typedef struct { + unsigned short unused:13, + fRelease:1, + fDeferUpd:1, + fAckReq:1; + short cfFormat; +} DDELN; + +typedef struct { + unsigned short unused:12,fAck:1,fRelease:1,fReserved:1,fAckReq:1; + short cfFormat; + BYTE rgb[1]; +} DDEUP; +BOOL WINAPI DdeSetQualityOfService(HWND,const SECURITY_QUALITY_OF_SERVICE*,PSECURITY_QUALITY_OF_SERVICE); +BOOL WINAPI ImpersonateDdeClientWindow(HWND,HWND); +LPARAM WINAPI PackDDElParam(UINT,UINT_PTR,UINT_PTR); +BOOL WINAPI UnpackDDElParam(UINT,LPARAM,PUINT_PTR,PUINT_PTR); +BOOL WINAPI FreeDDElParam(UINT,LPARAM); +LPARAM WINAPI ReuseDDElParam(LPARAM,UINT,UINT,UINT_PTR,UINT_PTR); +#endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/ddeml.h b/reactos/w32api/include/ddeml.h new file mode 100644 index 00000000000..6ae3bc12ea2 --- /dev/null +++ b/reactos/w32api/include/ddeml.h @@ -0,0 +1,314 @@ +#ifndef _DDEML_H +#define _DDEML_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define EXPENTRY CALLBACK +#define CP_WINANSI 1004 +#define CP_WINUNICODE 1200 +#define XTYPF_NOBLOCK 2 +#define XTYPF_NODATA 4 +#define XTYPF_ACKREQ 8 +#define XCLASS_MASK 0xFC00 +#define XCLASS_BOOL 0x1000 +#define XCLASS_DATA 0x2000 +#define XCLASS_FLAGS 0x4000 +#define XCLASS_NOTIFICATION 0x8000 +#define XST_NULL 0 +#define XST_INCOMPLETE 1 +#define XST_CONNECTED 2 +#define XST_INIT1 3 +#define XST_INIT2 4 +#define XST_REQSENT 5 +#define XST_DATARCVD 6 +#define XST_POKESENT 7 +#define XST_POKEACKRCVD 8 +#define XST_EXECSENT 9 +#define XST_EXECACKRCVD 10 +#define XST_ADVSENT 11 +#define XST_UNADVSENT 12 +#define XST_ADVACKRCVD 13 +#define XST_UNADVACKRCVD 14 +#define XST_ADVDATASENT 15 +#define XST_ADVDATAACKRCVD 16 +#define XTYP_ERROR (XCLASS_NOTIFICATION|XTYPF_NOBLOCK) +#define XTYP_ADVDATA (16|XCLASS_FLAGS) +#define XTYP_ADVREQ (32|XCLASS_DATA|XTYPF_NOBLOCK) +#define XTYP_ADVSTART (0x30|XCLASS_BOOL) +#define XTYP_ADVSTOP (0x0040|XCLASS_NOTIFICATION) +#define XTYP_EXECUTE (0x0050|XCLASS_FLAGS) +#define XTYP_CONNECT (0x0060|XCLASS_BOOL|XTYPF_NOBLOCK) +#define XTYP_CONNECT_CONFIRM (0x0070|XCLASS_NOTIFICATION|XTYPF_NOBLOCK) +#define XTYP_XACT_COMPLETE (0x0080|XCLASS_NOTIFICATION) +#define XTYP_POKE (0x0090|XCLASS_FLAGS) +#define XTYP_REGISTER (0x00A0|XCLASS_NOTIFICATION|XTYPF_NOBLOCK) +#define XTYP_REQUEST (0x00B0|XCLASS_DATA) +#define XTYP_DISCONNECT (0x00C0|XCLASS_NOTIFICATION|XTYPF_NOBLOCK) +#define XTYP_UNREGISTER (0x00D0|XCLASS_NOTIFICATION|XTYPF_NOBLOCK) +#define XTYP_WILDCONNECT (0x00E0|XCLASS_DATA|XTYPF_NOBLOCK) +#define XTYP_MASK 0xF0 +#define XTYP_SHIFT 4 +#define TIMEOUT_ASYNC 0xFFFFFFFF +#define QID_SYNC 0xFFFFFFFF +#define ST_CONNECTED 1 +#define ST_ADVISE 2 +#define ST_ISLOCAL 4 +#define ST_BLOCKED 8 +#define ST_CLIENT 16 +#define ST_TERMINATED 32 +#define ST_INLIST 64 +#define ST_BLOCKNEXT 128 +#define ST_ISSELF 256 +#define CADV_LATEACK 0xFFFF +#define DMLERR_NO_ERROR 0 +#define DMLERR_FIRST 0x4000 +#define DMLERR_ADVACKTIMEOUT 0x4000 +#define DMLERR_BUSY 0x4001 +#define DMLERR_DATAACKTIMEOUT 0x4002 +#define DMLERR_DLL_NOT_INITIALIZED 0x4003 +#define DMLERR_DLL_USAGE 0x4004 +#define DMLERR_EXECACKTIMEOUT 0x4005 +#define DMLERR_INVALIDPARAMETER 0x4006 +#define DMLERR_LOW_MEMORY 0x4007 +#define DMLERR_MEMORY_ERROR 0x4008 +#define DMLERR_NOTPROCESSED 0x4009 +#define DMLERR_NO_CONV_ESTABLISHED 0x400a +#define DMLERR_POKEACKTIMEOUT 0x400b +#define DMLERR_POSTMSG_FAILED 0x400c +#define DMLERR_REENTRANCY 0x400d +#define DMLERR_SERVER_DIED 0x400e +#define DMLERR_SYS_ERROR 0x400f +#define DMLERR_UNADVACKTIMEOUT 0x4010 +#define DMLERR_UNFOUND_QUEUE_ID 0x4011 +#define DMLERR_LAST 0x4011 +#define DDE_FACK 0x8000 +#define DDE_FBUSY 0x4000 +#define DDE_FDEFERUPD 0x4000 +#define DDE_FACKREQ 0x8000 +#define DDE_FRELEASE 0x2000 +#define DDE_FREQUESTED 0x1000 +#define DDE_FAPPSTATUS 0x00ff +#define DDE_FNOTPROCESSED 0 +#define DDE_FACKRESERVED (~(DDE_FACK|DDE_FBUSY|DDE_FAPPSTATUS)) +#define DDE_FADVRESERVED (~(DDE_FACKREQ|DDE_FDEFERUPD)) +#define DDE_FDATRESERVED (~(DDE_FACKREQ|DDE_FRELEASE|DDE_FREQUESTED)) +#define DDE_FPOKRESERVED (~DDE_FRELEASE) +#define MSGF_DDEMGR 0x8001 +#define CBR_BLOCK ((HDDEDATA)0xffffffff) +#define CBF_FAIL_SELFCONNECTIONS 0x1000 +#define CBF_FAIL_CONNECTIONS 0x2000 +#define CBF_FAIL_ADVISES 0x4000 +#define CBF_FAIL_EXECUTES 0x8000 +#define CBF_FAIL_POKES 0x10000 +#define CBF_FAIL_REQUESTS 0x20000 +#define CBF_FAIL_ALLSVRXACTIONS 0x3f000 +#define CBF_SKIP_CONNECT_CONFIRMS 0x40000 +#define CBF_SKIP_REGISTRATIONS 0x80000 +#define CBF_SKIP_UNREGISTRATIONS 0x100000 +#define CBF_SKIP_DISCONNECTS 0x200000 +#define CBF_SKIP_ALLNOTIFICATIONS 0x3c0000 +#define APPCMD_CLIENTONLY 0x10L +#define APPCMD_FILTERINITS 0x20L +#define APPCMD_MASK 0xFF0L +#define APPCLASS_STANDARD 0 +#define APPCLASS_MASK 0xFL +#define EC_ENABLEALL 0 +#define EC_ENABLEONE ST_BLOCKNEXT +#define EC_DISABLE ST_BLOCKED +#define EC_QUERYWAITING 2 +#define DNS_REGISTER 1 +#define DNS_UNREGISTER 2 +#define DNS_FILTERON 4 +#define DNS_FILTEROFF 8 +#define HDATA_APPOWNED 1 +#define MAX_MONITORS 4 +#define APPCLASS_MONITOR 1L +#define XTYP_MONITOR (XCLASS_NOTIFICATION|XTYPF_NOBLOCK|0xF0) +#define MF_HSZ_INFO 0x1000000 +#define MF_SENDMSGS 0x2000000 +#define MF_POSTMSGS 0x4000000 +#define MF_CALLBACKS 0x8000000 +#define MF_ERRORS 0x10000000 +#define MF_LINKS 0x20000000 +#define MF_CONV 0x40000000 +#define MF_MASK 0xFF000000 +#define MH_CREATE 1 +#define MH_KEEP 2 +#define MH_DELETE 3 +#define MH_CLEANUP 4 + +DECLARE_HANDLE(HCONVLIST); +DECLARE_HANDLE(HCONV); +DECLARE_HANDLE(HSZ); +DECLARE_HANDLE(HDDEDATA); +typedef HDDEDATA CALLBACK FNCALLBACK(UINT,UINT,HCONV,HSZ,HSZ,HDDEDATA,DWORD,DWORD); +typedef HDDEDATA(CALLBACK *PFNCALLBACK)(UINT,UINT,HCONV,HSZ,HSZ,HDDEDATA,DWORD,DWORD); +typedef struct tagHSZPAIR { + HSZ hszSvc; + HSZ hszTopic; +} HSZPAIR, *PHSZPAIR; +typedef struct tagCONVCONTEXT { + UINT cb; + UINT wFlags; + UINT wCountryID; + int iCodePage; + DWORD dwLangID; + DWORD dwSecurity; + SECURITY_QUALITY_OF_SERVICE qos; +} CONVCONTEXT,*PCONVCONTEXT; +typedef struct tagCONVINFO { + DWORD cb; + DWORD hUser; + HCONV hConvPartner; + HSZ hszSvcPartner; + HSZ hszServiceReq; + HSZ hszTopic; + HSZ hszItem; + UINT wFmt; + UINT wType; + UINT wStatus; + UINT wConvst; + UINT wLastError; + HCONVLIST hConvList; + CONVCONTEXT ConvCtxt; + HWND hwnd; + HWND hwndPartner; +} CONVINFO,*PCONVINFO; +typedef struct tagDDEML_MSG_HOOK_DATA { + UINT uiLo; + UINT uiHi; + DWORD cbData; + DWORD Data[8]; +} DDEML_MSG_HOOK_DATA; +typedef struct tagMONHSZSTRUCT { + UINT cb; + BOOL fsAction; + DWORD dwTime; + HSZ hsz; + HANDLE hTask; + TCHAR str[1]; +} MONHSZSTRUCT, *PMONHSZSTRUCT; +typedef struct tagMONLINKSTRUCT { + UINT cb; + DWORD dwTime; + HANDLE hTask; + BOOL fEstablished; + BOOL fNoData; + HSZ hszSvc; + HSZ hszTopic; + HSZ hszItem; + UINT wFmt; + BOOL fServer; + HCONV hConvServer; + HCONV hConvClient; +} MONLINKSTRUCT, *PMONLINKSTRUCT; +typedef struct tagMONCONVSTRUCT { + UINT cb; + BOOL fConnect; + DWORD dwTime; + HANDLE hTask; + HSZ hszSvc; + HSZ hszTopic; + HCONV hConvClient; + HCONV hConvServer; +} MONCONVSTRUCT, *PMONCONVSTRUCT; +typedef struct tagMONCBSTRUCT { + UINT cb; + DWORD dwTime; + HANDLE hTask; + DWORD dwRet; + UINT wType; + UINT wFmt; + HCONV hConv; + HSZ hsz1; + HSZ hsz2; + HDDEDATA hData; + ULONG_PTR dwData1; + ULONG_PTR dwData2; + CONVCONTEXT cc; + DWORD cbData; + DWORD Data[8]; +} MONCBSTRUCT, *PMONCBSTRUCT; +typedef struct tagMONERRSTRUCT { + UINT cb; + UINT wLastError; + DWORD dwTime; + HANDLE hTask; +} MONERRSTRUCT, *PMONERRSTRUCT; +typedef struct tagMONMSGSTRUCT { + UINT cb; + HWND hwndTo; + DWORD dwTime; + HANDLE hTask; + UINT wMsg; + WPARAM wParam; + LPARAM lParam; + DDEML_MSG_HOOK_DATA dmhd; +} MONMSGSTRUCT, *PMONMSGSTRUCT; + +BOOL WINAPI DdeAbandonTransaction(DWORD,HCONV,DWORD); +PBYTE WINAPI DdeAccessData(HDDEDATA,PDWORD); +HDDEDATA WINAPI DdeAddData(HDDEDATA,PBYTE,DWORD,DWORD); +HDDEDATA WINAPI DdeClientTransaction(PBYTE,DWORD,HCONV,HSZ,UINT,UINT,DWORD,PDWORD); +int WINAPI DdeCmpStringHandles(HSZ,HSZ); +HCONV WINAPI DdeConnect(DWORD,HSZ,HSZ,PCONVCONTEXT); +HCONVLIST WINAPI DdeConnectList(DWORD,HSZ,HSZ,HCONVLIST,PCONVCONTEXT); +HDDEDATA WINAPI DdeCreateDataHandle(DWORD,PBYTE,DWORD,DWORD,HSZ,UINT,UINT); +HSZ WINAPI DdeCreateStringHandleA(DWORD,LPSTR,int); +HSZ WINAPI DdeCreateStringHandleW(DWORD,LPWSTR,int); +BOOL WINAPI DdeDisconnect(HCONV); +BOOL WINAPI DdeDisconnectList(HCONVLIST); +BOOL WINAPI DdeEnableCallback(DWORD,HCONV,UINT); +BOOL WINAPI DdeFreeDataHandle(HDDEDATA); +BOOL WINAPI DdeFreeStringHandle(DWORD,HSZ); +DWORD WINAPI DdeGetData(HDDEDATA,PBYTE,DWORD,DWORD); +UINT WINAPI DdeGetLastError(DWORD); +BOOL WINAPI DdeImpersonateClient(HCONV); +UINT WINAPI DdeInitializeA(PDWORD,PFNCALLBACK,DWORD,DWORD); +UINT WINAPI DdeInitializeW(PDWORD,PFNCALLBACK,DWORD,DWORD); +BOOL WINAPI DdeKeepStringHandle(DWORD,HSZ); +HDDEDATA WINAPI DdeNameService(DWORD,HSZ,HSZ,UINT); +BOOL WINAPI DdePostAdvise(DWORD,HSZ,HSZ); +UINT WINAPI DdeQueryConvInfo(HCONV,DWORD,PCONVINFO); +HCONV WINAPI DdeQueryNextServer(HCONVLIST,HCONV); +DWORD WINAPI DdeQueryStringA(DWORD,HSZ,LPSTR,DWORD,int); +DWORD WINAPI DdeQueryStringW(DWORD,HSZ,LPWSTR,DWORD,int); +HCONV WINAPI DdeReconnect(HCONV); +BOOL WINAPI DdeSetUserHandle(HCONV,DWORD,DWORD); +BOOL WINAPI DdeUnaccessData(HDDEDATA); +BOOL WINAPI DdeUninitialize(DWORD); + +#ifdef UNICODE +#define SZDDESYS_TOPIC L"System" +#define SZDDESYS_ITEM_TOPICS L"Topics" +#define SZDDESYS_ITEM_SYSITEMS L"SysItems" +#define SZDDESYS_ITEM_RTNMSG L"ReturnMessage" +#define SZDDESYS_ITEM_STATUS L"Status" +#define SZDDESYS_ITEM_FORMATS L"Formats" +#define SZDDESYS_ITEM_HELP L"Help" +#define SZDDE_ITEM_ITEMLIST L"TopicItemList" +#define DdeCreateStringHandle DdeCreateStringHandleW +#define DdeInitialize DdeInitializeW +#define DdeQueryString DdeQueryStringW +#else +#define SZDDESYS_TOPIC "System" +#define SZDDESYS_ITEM_TOPICS "Topics" +#define SZDDESYS_ITEM_SYSITEMS "SysItems" +#define SZDDESYS_ITEM_RTNMSG "ReturnMessage" +#define SZDDESYS_ITEM_STATUS "Status" +#define SZDDESYS_ITEM_FORMATS "Formats" +#define SZDDESYS_ITEM_HELP "Help" +#define SZDDE_ITEM_ITEMLIST "TopicItemList" +#define DdeCreateStringHandle DdeCreateStringHandleA +#define DdeInitialize DdeInitializeA +#define DdeQueryString DdeQueryStringA +#endif +#ifdef __cplusplus +} +#endif +#endif /* _DDEML_H */ diff --git a/reactos/w32api/include/ddk/atm.h b/reactos/w32api/include/ddk/atm.h new file mode 100644 index 00000000000..bf95bd98ad5 --- /dev/null +++ b/reactos/w32api/include/ddk/atm.h @@ -0,0 +1,510 @@ +/* + * atm.h + * + * ATM support + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __ATM_H +#define __ATM_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +typedef ULONG ATM_ADDRESSTYPE; + +#define SAP_TYPE_NSAP 1 +#define SAP_TYPE_E164 2 + +#define ATM_MEDIA_SPECIFIC 1 + +#define CALLMGR_SPECIFIC_Q2931 1 + +#define ATM_NSAP 0 +#define ATM_E164 1 + +#define ATM_MAC_ADDRESS_LENGTH 6 +#define ATM_ADDRESS_LENGTH 20 + +typedef ULONG ATM_AAL_TYPE, *PATM_AAL_TYPE; + +#define AAL_TYPE_AAL0 1 +#define AAL_TYPE_AAL1 2 +#define AAL_TYPE_AAL34 4 +#define AAL_TYPE_AAL5 8 + +#define ATM_ADDR_BLANK_CHAR L' ' +#define ATM_ADDR_E164_START_CHAR L'+' +#define ATM_ADDR_PUNCTUATION_CHAR L'.' + +typedef enum { + IE_AALParameters, + IE_TrafficDescriptor, + IE_BroadbandBearerCapability, + IE_BHLI, + IE_BLLI, + IE_CalledPartyNumber, + IE_CalledPartySubaddress, + IE_CallingPartyNumber, + IE_CallingPartySubaddress, + IE_Cause, + IE_QOSClass, + IE_TransitNetworkSelection, + IE_BroadbandSendingComplete, + IE_LIJCallId, + IE_Raw +} Q2931_IE_TYPE; + +typedef struct _Q2931_IE { + Q2931_IE_TYPE IEType; + ULONG IELength; + UCHAR IE[1]; +} Q2931_IE, *PQ2931_IE; + +typedef struct _AAL1_PARAMETERS { + UCHAR Subtype; + UCHAR CBRRate; + USHORT Multiplier; + UCHAR SourceClockRecoveryMethod; + UCHAR ErrorCorrectionMethod; + USHORT StructuredDataTransferBlocksize; + UCHAR PartiallyFilledCellsMethod; +} AAL1_PARAMETERS, *PAAL1_PARAMETERS; + +typedef struct _AAL34_PARAMETERS { + USHORT ForwardMaxCPCSSDUSize; + USHORT BackwardMaxCPCSSDUSize; + USHORT LowestMID; + USHORT HighestMID; + UCHAR SSCSType; +} AAL34_PARAMETERS, *PAAL34_PARAMETERS; + +/* AAL5_PARAMETERS.Mode constants */ +#define AAL5_MODE_MESSAGE 0x01 +#define AAL5_MODE_STREAMING 0x02 + +/* AAL5_PARAMETERS.SSCSType constants */ +#define AAL5_SSCS_NULL 0x00 +#define AAL5_SSCS_SSCOP_ASSURED 0x01 +#define AAL5_SSCS_SSCOP_NON_ASSURED 0x02 +#define AAL5_SSCS_FRAME_RELAY 0x04 + +typedef struct _AAL5_PARAMETERS { + ULONG ForwardMaxCPCSSDUSize; + ULONG BackwardMaxCPCSSDUSize; + UCHAR Mode; + UCHAR SSCSType; +} AAL5_PARAMETERS, *PAAL5_PARAMETERS; + +typedef struct _AALUSER_PARAMETERS { + ULONG UserDefined; +} AALUSER_PARAMETERS, *PAALUSER_PARAMETERS; + +typedef struct _AAL_PARAMETERS_IE { + ATM_AAL_TYPE AALType; + union { + AAL1_PARAMETERS AAL1Parameters; + AAL34_PARAMETERS AAL34Parameters; + AAL5_PARAMETERS AAL5Parameters; + AALUSER_PARAMETERS AALUserParameters; + } AALSpecificParameters; +} AAL_PARAMETERS_IE, *PAAL_PARAMETERS_IE; + + +/* FIXME: Should the union be anonymous in C++ too? If so, + can't define named types _ATM_AAL5_INFO and _ATM_AAL0_INFO + within anonymous union for C++. */ +typedef struct _ATM_AAL_OOB_INFO +{ + ATM_AAL_TYPE AalType; +#ifndef __cplusplus + _ANONYMOUS_UNION +#endif + union { + struct _ATM_AAL5_INFO { + BOOLEAN CellLossPriority; + UCHAR UserToUserIndication; + UCHAR CommonPartIndicator; + } ATM_AAL5_INFO; + + struct _ATM_AAL0_INFO { + BOOLEAN CellLossPriority; + UCHAR PayLoadTypeIdentifier; + } ATM_AAL0_INFO; +#ifndef __cplusplus + } DUMMYUNIONNAME; +#else + } u; +#endif +} ATM_AAL_OOB_INFO, *PATM_AAL_OOB_INFO; + +typedef struct _ATM_ADDRESS { + ATM_ADDRESSTYPE AddressType; + ULONG NumberOfDigits; + UCHAR Address[ATM_ADDRESS_LENGTH]; +} ATM_ADDRESS, *PATM_ADDRESS; + +/* ATM_BHLI_IE.HighLayerInfoType constants */ +#define BHLI_ISO 0x00 +#define BHLI_UserSpecific 0x01 +#define BHLI_HighLayerProfile 0x02 +#define BHLI_VendorSpecificAppId 0x03 + +typedef struct _ATM_BHLI_IE { + ULONG HighLayerInfoType; + ULONG HighLayerInfoLength; + UCHAR HighLayerInfo[8]; +} ATM_BHLI_IE, *PATM_BHLI_IE; + +/* ATM_BLLI_IE.Layer2Protocol constants */ +#define BLLI_L2_ISO_1745 0x01 +#define BLLI_L2_Q921 0x02 +#define BLLI_L2_X25L 0x06 +#define BLLI_L2_X25M 0x07 +#define BLLI_L2_ELAPB 0x08 +#define BLLI_L2_HDLC_ARM 0x09 +#define BLLI_L2_HDLC_NRM 0x0A +#define BLLI_L2_HDLC_ABM 0x0B +#define BLLI_L2_LLC 0x0C +#define BLLI_L2_X75 0x0D +#define BLLI_L2_Q922 0x0E +#define BLLI_L2_USER_SPECIFIED 0x10 +#define BLLI_L2_ISO_7776 0x11 + +/* ATM_BLLI_IE.Layer3Protocol constants */ +#define BLLI_L3_X25 0x06 +#define BLLI_L3_ISO_8208 0x07 +#define BLLI_L3_X223 0x08 +#define BLLI_L3_SIO_8473 0x09 +#define BLLI_L3_T70 0x0A +#define BLLI_L3_ISO_TR9577 0x0B +#define BLLI_L3_USER_SPECIFIED 0x10 + +/* ATM_BLLI_IE.Layer3IPI constants */ +#define BLLI_L3_IPI_SNAP 0x80 +#define BLLI_L3_IPI_IP 0xCC + +typedef struct _ATM_BLLI_IE { + ULONG Layer2Protocol; + UCHAR Layer2Mode; + UCHAR Layer2WindowSize; + ULONG Layer2UserSpecifiedProtocol; + ULONG Layer3Protocol; + UCHAR Layer3Mode; + UCHAR Layer3DefaultPacketSize; + UCHAR Layer3PacketWindowSize; + ULONG Layer3UserSpecifiedProtocol; + ULONG Layer3IPI; + UCHAR SnapId[5]; +} ATM_BLLI_IE, *PATM_BLLI_IE; + +/* ATM_BROADBAND_BEARER_CAPABILITY_IE.BearerClass constants */ +#define BCOB_A 0x00 +#define BCOB_C 0x01 +#define BCOB_X 0x02 + +/* ATM_BROADBAND_BEARER_CAPABILITY_IE.TrafficType constants */ +#define TT_NOIND 0x00 +#define TT_CBR 0x04 +#define TT_VBR 0x08 + +/* ATM_BROADBAND_BEARER_CAPABILITY_IE.TimingRequirements constants */ +#define TR_NOIND 0x00 +#define TR_END_TO_END 0x01 +#define TR_NO_END_TO_END 0x02 + +/* ATM_BROADBAND_BEARER_CAPABILITY_IE.ClippingSusceptability constants */ +#define CLIP_NOT 0x00 +#define CLIP_SUS 0x20 + +/* ATM_BROADBAND_BEARER_CAPABILITY_IE.UserPlaneConnectionConfig constants */ +#define UP_P2P 0x00 +#define UP_P2MP 0x01 + +typedef struct _ATM_BROADBAND_BEARER_CAPABILITY_IE { + UCHAR BearerClass; + UCHAR TrafficType; + UCHAR TimingRequirements; + UCHAR ClippingSusceptability; + UCHAR UserPlaneConnectionConfig; +} ATM_BROADBAND_BEARER_CAPABILITY_IE, *PATM_BROADBAND_BEARER_CAPABILITY_IE; + +typedef struct _ATM_BROADBAND_SENDING_COMPLETE_IE { + UCHAR SendingComplete; +} ATM_BROADBAND_SENDING_COMPLETE_IE, *PATM_BROADBAND_SENDING_COMPLETE_IE; + +typedef struct _ATM_CALLING_PARTY_NUMBER_IE { + ATM_ADDRESS Number; + UCHAR PresentationIndication; + UCHAR ScreeningIndicator; +} ATM_CALLING_PARTY_NUMBER_IE, *PATM_CALLING_PARTY_NUMBER_IE; + +/* ATM_CAUSE_IE.Location constants */ +#define ATM_CAUSE_LOC_USER 0x00 +#define ATM_CAUSE_LOC_PRIVATE_LOCAL 0x01 +#define ATM_CAUSE_LOC_PUBLIC_LOCAL 0x02 +#define ATM_CAUSE_LOC_TRANSIT_NETWORK 0x03 +#define ATM_CAUSE_LOC_PUBLIC_REMOTE 0x04 +#define ATM_CAUSE_LOC_PRIVATE_REMOTE 0x05 +#define ATM_CAUSE_LOC_INTERNATIONAL_NETWORK 0x07 +#define ATM_CAUSE_LOC_BEYOND_INTERWORKING 0x0A + +/* ATM_CAUSE_IE.Cause constants */ +#define ATM_CAUSE_UNALLOCATED_NUMBER 0x01 +#define ATM_CAUSE_NO_ROUTE_TO_TRANSIT_NETWORK 0x02 +#define ATM_CAUSE_NO_ROUTE_TO_DESTINATION 0x03 +#define ATM_CAUSE_VPI_VCI_UNACCEPTABLE 0x0A +#define ATM_CAUSE_NORMAL_CALL_CLEARING 0x10 +#define ATM_CAUSE_USER_BUSY 0x11 +#define ATM_CAUSE_NO_USER_RESPONDING 0x12 +#define ATM_CAUSE_CALL_REJECTED 0x15 +#define ATM_CAUSE_NUMBER_CHANGED 0x16 +#define ATM_CAUSE_USER_REJECTS_CLIR 0x17 +#define ATM_CAUSE_DESTINATION_OUT_OF_ORDER 0x1B +#define ATM_CAUSE_INVALID_NUMBER_FORMAT 0x1C +#define ATM_CAUSE_STATUS_ENQUIRY_RESPONSE 0x1E +#define ATM_CAUSE_NORMAL_UNSPECIFIED 0x1F +#define ATM_CAUSE_VPI_VCI_UNAVAILABLE 0x23 +#define ATM_CAUSE_NETWORK_OUT_OF_ORDER 0x26 +#define ATM_CAUSE_TEMPORARY_FAILURE 0x29 +#define ATM_CAUSE_ACCESS_INFORMAION_DISCARDED 0x2B +#define ATM_CAUSE_NO_VPI_VCI_AVAILABLE 0x2D +#define ATM_CAUSE_RESOURCE_UNAVAILABLE 0x2F +#define ATM_CAUSE_QOS_UNAVAILABLE 0x31 +#define ATM_CAUSE_USER_CELL_RATE_UNAVAILABLE 0x33 +#define ATM_CAUSE_BEARER_CAPABILITY_UNAUTHORIZED 0x39 +#define ATM_CAUSE_BEARER_CAPABILITY_UNAVAILABLE 0x3A +#define ATM_CAUSE_OPTION_UNAVAILABLE 0x3F +#define ATM_CAUSE_BEARER_CAPABILITY_UNIMPLEMENTED 0x41 +#define ATM_CAUSE_UNSUPPORTED_TRAFFIC_PARAMETERS 0x49 +#define ATM_CAUSE_INVALID_CALL_REFERENCE 0x51 +#define ATM_CAUSE_CHANNEL_NONEXISTENT 0x52 +#define ATM_CAUSE_INCOMPATIBLE_DESTINATION 0x58 +#define ATM_CAUSE_INVALID_ENDPOINT_REFERENCE 0x59 +#define ATM_CAUSE_INVALID_TRANSIT_NETWORK_SELECTION 0x5B +#define ATM_CAUSE_TOO_MANY_PENDING_ADD_PARTY 0x5C +#define ATM_CAUSE_AAL_PARAMETERS_UNSUPPORTED 0x5D +#define ATM_CAUSE_MANDATORY_IE_MISSING 0x60 +#define ATM_CAUSE_UNIMPLEMENTED_MESSAGE_TYPE 0x61 +#define ATM_CAUSE_UNIMPLEMENTED_IE 0x63 +#define ATM_CAUSE_INVALID_IE_CONTENTS 0x64 +#define ATM_CAUSE_INVALID_STATE_FOR_MESSAGE 0x65 +#define ATM_CAUSE_RECOVERY_ON_TIMEOUT 0x66 +#define ATM_CAUSE_INCORRECT_MESSAGE_LENGTH 0x68 +#define ATM_CAUSE_PROTOCOL_ERROR 0x6F + +/* ATM_CAUSE_IE.Diagnostics constants */ +#define ATM_CAUSE_COND_UNKNOWN 0x00 +#define ATM_CAUSE_COND_PERMANENT 0x01 +#define ATM_CAUSE_COND_TRANSIENT 0x02 +#define ATM_CAUSE_REASON_USER 0x00 +#define ATM_CAUSE_REASON_IE_MISSING 0x04 +#define ATM_CAUSE_REASON_IE_INSUFFICIENT 0x08 +#define ATM_CAUSE_PU_PROVIDER 0x00 +#define ATM_CAUSE_PU_USER 0x08 +#define ATM_CAUSE_NA_NORMAL 0x00 +#define ATM_CAUSE_NA_ABNORMAL 0x04 + +typedef struct _ATM_CAUSE_IE { + UCHAR Location; + UCHAR Cause; + UCHAR DiagnosticsLength; + UCHAR Diagnostics[4]; +} ATM_CAUSE_IE, *PATM_CAUSE_IE; + + +typedef ULONG ATM_SERVICE_CATEGORY, *PATM_SERVICE_CATEGORY; + +/* ATM_FLOW_PARAMETERS.ServiceCategory constants */ +#define ATM_SERVICE_CATEGORY_CBR 1 +#define ATM_SERVICE_CATEGORY_VBR 2 +#define ATM_SERVICE_CATEGORY_UBR 4 +#define ATM_SERVICE_CATEGORY_ABR 8 + +/* ATM_FLOW_PARAMETERS.Reserved1 constants */ +#define ATM_FLOW_PARAMS_RSVD1_MPP 0x01 + +typedef struct _ATM_FLOW_PARAMETERS { + ATM_SERVICE_CATEGORY ServiceCategory; + ULONG AverageCellRate; + ULONG PeakCellRate; + ULONG MinimumCellRate; + ULONG InitialCellRate; + ULONG BurstLengthCells; + ULONG MaxSduSize; + ULONG TransientBufferExposure; + ULONG CumulativeRMFixedRTT; + UCHAR RateIncreaseFactor; + UCHAR RateDecreaseFactor; + USHORT ACRDecreaseTimeFactor; + UCHAR MaximumCellsPerForwardRMCell; + UCHAR MaximumForwardRMCellInterval; + UCHAR CutoffDecreaseFactor; + UCHAR Reserved1; + ULONG MissingRMCellCount; + ULONG Reserved2; + ULONG Reserved3; +} ATM_FLOW_PARAMETERS, *PATM_FLOW_PARAMETERS; + +typedef struct _ATM_VPIVCI { + ULONG Vpi; + ULONG Vci; +} ATM_VPIVCI, *PATM_VPIVCI; + +typedef struct _ATM_MEDIA_PARAMETERS { + ATM_VPIVCI ConnectionId; + ATM_AAL_TYPE AALType; + ULONG CellDelayVariationCLP0; + ULONG CellDelayVariationCLP1; + ULONG CellLossRatioCLP0; + ULONG CellLossRatioCLP1; + ULONG CellTransferDelayCLP0; + ULONG CellTransferDelayCLP1; + ULONG DefaultCLP; + ATM_FLOW_PARAMETERS Transmit; + ATM_FLOW_PARAMETERS Receive; +} ATM_MEDIA_PARAMETERS, *PATM_MEDIA_PARAMETERS; + +typedef struct _ATM_PVC_SAP { + ATM_BLLI_IE Blli; + ATM_BHLI_IE Bhli; +} ATM_PVC_SAP, *PATM_PVC_SAP; + +/* ATM_QOS_CLASS_IE constants */ +#define QOS_CLASS0 0x00 +#define QOS_CLASS1 0x01 +#define QOS_CLASS2 0x02 +#define QOS_CLASS3 0x03 +#define QOS_CLASS4 0x04 + +typedef struct _ATM_QOS_CLASS_IE { + UCHAR QOSClassForward; + UCHAR QOSClassBackward; +} ATM_QOS_CLASS_IE, *PATM_QOS_CLASS_IE; + +typedef struct _ATM_RAW_IE { + ULONG RawIELength; + ULONG RawIEType; + UCHAR RawIEValue[1]; +} ATM_RAW_IE, *PATM_RAW_IE; + +typedef struct _ATM_SAP { + ATM_BLLI_IE Blli; + ATM_BHLI_IE Bhli; + ULONG NumberOfAddresses; + UCHAR Addresses[1]; +} ATM_SAP, *PATM_SAP; + +typedef struct _ATM_TRAFFIC_DESCRIPTOR { + ULONG PeakCellRateCLP0; + ULONG PeakCellRateCLP01; + ULONG SustainableCellRateCLP0; + ULONG SustainableCellRateCLP01; + ULONG MaximumBurstSizeCLP0; + ULONG MaximumBurstSizeCLP01; + BOOLEAN BestEffort; + BOOLEAN Tagging; +} ATM_TRAFFIC_DESCRIPTOR, *PATM_TRAFFIC_DESCRIPTOR; + +typedef struct _ATM_TRAFFIC_DESCRIPTOR_IE { + ATM_TRAFFIC_DESCRIPTOR ForwardTD; + ATM_TRAFFIC_DESCRIPTOR BackwardTD; +} ATM_TRAFFIC_DESCRIPTOR_IE, *PATM_TRAFFIC_DESCRIPTOR_IE; + +/* ATM_TRANSIT_NETWORK_SELECTION_IE.TypeOfNetworkId constants */ +#define TNS_TYPE_NATIONAL 0x40 + +/* ATM_TRANSIT_NETWORK_SELECTION_IE.NetworkIdPlan constants */ +#define TNS_PLAN_CARRIER_ID_CODE 0x01 + +typedef struct _ATM_TRANSIT_NETWORK_SELECTION_IE { + UCHAR TypeOfNetworkId; + UCHAR NetworkIdPlan; + UCHAR NetworkIdLength; + UCHAR NetworkId[1]; +} ATM_TRANSIT_NETWORK_SELECTION_IE, *PATM_TRANSIT_NETWORK_SELECTION_IE; + +typedef struct _ATM_LIJ_CALLID_IE { + ULONG Identifier; +} ATM_LIJ_CALLID_IE, *PATM_LIJ_CALLID_IE; + +/* Q2931_ADD_PVC.Flags constants */ +#define CO_FLAG_SIGNALING_VC 0x00000001 +#define CO_FLAG_NO_DEST_SAP 0x00000002 + +typedef struct _Q2931_ADD_PVC { + ATM_ADDRESS CalledParty; + ATM_ADDRESS CallingParty; + ATM_VPIVCI ConnectionId; + ATM_AAL_TYPE AALType; + ATM_FLOW_PARAMETERS ForwardFP; + ATM_FLOW_PARAMETERS BackwardFP; + ULONG Flags; + ATM_PVC_SAP LocalSap; + ATM_PVC_SAP DestinationSap; + BOOLEAN LIJIdPresent; + ATM_LIJ_CALLID_IE LIJId; +} Q2931_ADD_PVC, *PQ2931_ADD_PVC; + +typedef struct _Q2931_DELETE_PVC { + ATM_VPIVCI ConnectionId; +} Q2931_DELETE_PVC, *PQ2931_DELETE_PVC; + +typedef ATM_ADDRESS ATM_CALLED_PARTY_NUMBER_IE; +typedef ATM_ADDRESS ATM_CALLED_PARTY_SUBADDRESS_IE; +typedef ATM_ADDRESS ATM_CALLING_PARTY_SUBADDRESS_IE; + +typedef struct _Q2931_CALLMGR_PARAMETERS { + ATM_ADDRESS CalledParty; + ATM_ADDRESS CallingParty; + ULONG InfoElementCount; + UCHAR InfoElements[1]; +} Q2931_CALLMGR_PARAMETERS, *PQ2931_CALLMGR_PARAMETERS; + +typedef struct _ATM_VC_RATES_SUPPORTED { + ULONG MinCellRate; + ULONG MaxCellRate; +} ATM_VC_RATES_SUPPORTED, *PATM_VC_RATES_SUPPORTED; + +typedef ULONG ATM_SERVICE_REGISTRY_TYPE; + +/* ATM_SERVICE_ADDRESS_LIST.ServiceRegistryType constants */ +#define ATM_SERVICE_REGISTRY_LECS 1 +#define ATM_SERVICE_REGISTRY_ANS 2 + +typedef struct _ATM_SERVICE_ADDRESS_LIST { + ATM_SERVICE_REGISTRY_TYPE ServiceRegistryType; + ULONG NumberOfAddressesAvailable; + ULONG NumberOfAddressesReturned; + ATM_ADDRESS Address[1]; +} ATM_SERVICE_ADDRESS_LIST, *PATM_SERVICE_ADDRESS_LIST; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __ATM_H */ diff --git a/reactos/w32api/include/ddk/batclass.h b/reactos/w32api/include/ddk/batclass.h new file mode 100644 index 00000000000..1beef49113f --- /dev/null +++ b/reactos/w32api/include/ddk/batclass.h @@ -0,0 +1,302 @@ +/* + * batclass.h + * + * Battery class driver interface + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __BATCLASS_H +#define __BATCLASS_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + +#if defined(_BATTERYCLASS_) + #define BCLASSAPI DECLSPEC_EXPORT +#else + #define BCLASSAPI DECLSPEC_IMPORT +#endif + + +/* Battery device GUIDs */ + +DEFINE_GUID(GUID_DEVICE_BATTERY, + 0x72631e54L, 0x78A4, 0x11d0, 0xbc, 0xf7, 0x00, 0xaa, 0x00, 0xb7, 0xb3, 0x2a); + +DEFINE_GUID(BATTERY_STATUS_WMI_GUID, + 0xfc4670d1, 0xebbf, 0x416e, 0x87, 0xce, 0x37, 0x4a, 0x4e, 0xbc, 0x11, 0x1a); + +DEFINE_GUID(BATTERY_RUNTIME_WMI_GUID, + 0x535a3767, 0x1ac2, 0x49bc, 0xa0, 0x77, 0x3f, 0x7a, 0x02, 0xe4, 0x0a, 0xec); + +DEFINE_GUID(BATTERY_TEMPERATURE_WMI_GUID, + 0x1a52a14d, 0xadce, 0x4a44, 0x9a, 0x3e, 0xc8, 0xd8, 0xf1, 0x5f, 0xf2, 0xc2); + +DEFINE_GUID(BATTERY_FULL_CHARGED_CAPACITY_WMI_GUID, + 0x40b40565, 0x96f7, 0x4435, 0x86, 0x94, 0x97, 0xe0, 0xe4, 0x39, 0x59, 0x05); + +DEFINE_GUID(BATTERY_CYCLE_COUNT_WMI_GUID, + 0xef98db24, 0x0014, 0x4c25, 0xa5, 0x0b, 0xc7, 0x24, 0xae, 0x5c, 0xd3, 0x71); + +DEFINE_GUID(BATTERY_STATIC_DATA_WMI_GUID, + 0x05e1e463, 0xe4e2, 0x4ea9, 0x80, 0xcb, 0x9b, 0xd4, 0xb3, 0xca, 0x06, 0x55); + +DEFINE_GUID(BATTERY_STATUS_CHANGE_WMI_GUID, + 0xcddfa0c3, 0x7c5b, 0x4e43, 0xa0, 0x34, 0x05, 0x9f, 0xa5, 0xb8, 0x43, 0x64); + +DEFINE_GUID(BATTERY_TAG_CHANGE_WMI_GUID, + 0x5e1f6e19, 0x8786, 0x4d23, 0x94, 0xfc, 0x9e, 0x74, 0x6b, 0xd5, 0xd8, 0x88); + + +/* BATTERY_INFORMATION.Capabilities constants */ +#define BATTERY_SET_CHARGE_SUPPORTED 0x00000001 +#define BATTERY_SET_DISCHARGE_SUPPORTED 0x00000002 +#define BATTERY_SET_RESUME_SUPPORTED 0x00000004 +#define BATTERY_IS_SHORT_TERM 0x20000000 +#define BATTERY_CAPACITY_RELATIVE 0x40000000 +#define BATTERY_SYSTEM_BATTERY 0x80000000 + +typedef struct _BATTERY_INFORMATION { + ULONG Capabilities; + UCHAR Technology; + UCHAR Reserved[3]; + UCHAR Chemistry[4]; + ULONG DesignedCapacity; + ULONG FullChargedCapacity; + ULONG DefaultAlert1; + ULONG DefaultAlert2; + ULONG CriticalBias; + ULONG CycleCount; +} BATTERY_INFORMATION, *PBATTERY_INFORMATION; + +typedef struct _BATTERY_MANUFACTURE_DATE { + UCHAR Day; + UCHAR Month; + USHORT Year; +} BATTERY_MANUFACTURE_DATE, *PBATTERY_MANUFACTURE_DATE; + +typedef struct _BATTERY_NOTIFY { + ULONG PowerState; + ULONG LowCapacity; + ULONG HighCapacity; +} BATTERY_NOTIFY, *PBATTERY_NOTIFY; + +/* BATTERY_STATUS.PowerState flags */ +#define BATTERY_POWER_ON_LINE 0x00000001 +#define BATTERY_DISCHARGING 0x00000002 +#define BATTERY_CHARGING 0x00000004 +#define BATTERY_CRITICAL 0x00000008 + +/* BATTERY_STATUS.Voltage constant */ +#define BATTERY_UNKNOWN_VOLTAGE 0xFFFFFFFF + +/* BATTERY_STATUS.Rate constant */ +#define BATTERY_UNKNOWN_RATE 0x80000000 + +typedef struct _BATTERY_STATUS { + ULONG PowerState; + ULONG Capacity; + ULONG Voltage; + LONG Rate; +} BATTERY_STATUS, *PBATTERY_STATUS; + +/* BATTERY_INFORMATION.Capacity constants */ +#define BATTERY_UNKNOWN_CAPACITY 0xFFFFFFFF + +typedef enum _BATTERY_QUERY_INFORMATION_LEVEL { + BatteryInformation = 0, + BatteryGranularityInformation, + BatteryTemperature, + BatteryEstimatedTime, + BatteryDeviceName, + BatteryManufactureDate, + BatteryManufactureName, + BatteryUniqueID, + BatterySerialNumber +} BATTERY_QUERY_INFORMATION_LEVEL; + +/* BatteryEstimatedTime constant */ +#define BATTERY_UNKNOWN_TIME 0x80000000 + +/* NTSTATUS possibly returned by BCLASS_QUERY_STATUS */ +#define BATTERY_TAG_INVALID 0 + +typedef struct _BATTERY_QUERY_INFORMATION { + ULONG BatteryTag; + BATTERY_QUERY_INFORMATION_LEVEL InformationLevel; + LONG AtRate; +} BATTERY_QUERY_INFORMATION, *PBATTERY_QUERY_INFORMATION; + +typedef enum _BATTERY_SET_INFORMATION_LEVEL { + BatteryCriticalBias = 0, + BatteryCharge, + BatteryDischarge +} BATTERY_SET_INFORMATION_LEVEL; + +#define MAX_BATTERY_STRING_SIZE 128 + +typedef struct _BATTERY_SET_INFORMATION { + ULONG BatteryTag; + BATTERY_SET_INFORMATION_LEVEL InformationLevel; + UCHAR Buffer[1]; +} BATTERY_SET_INFORMATION, *PBATTERY_SET_INFORMATION; + +typedef struct _BATTERY_WAIT_STATUS { + ULONG BatteryTag; + ULONG Timeout; + ULONG PowerState; + ULONG LowCapacity; + ULONG HighCapacity; +} BATTERY_WAIT_STATUS, *PBATTERY_WAIT_STATUS; + + +#define IOCTL_BATTERY_QUERY_TAG \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x10, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_BATTERY_QUERY_INFORMATION \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x11, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_BATTERY_SET_INFORMATION \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x12, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#define IOCTL_BATTERY_QUERY_STATUS \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x13, METHOD_BUFFERED, FILE_READ_ACCESS) + + +typedef NTSTATUS DDKAPI +(*BCLASS_DISABLE_STATUS_NOTIFY)( + IN PVOID Context); + +typedef NTSTATUS DDKAPI +(*BCLASS_QUERY_INFORMATION)( + IN PVOID Context, + IN ULONG BatteryTag, + IN BATTERY_QUERY_INFORMATION_LEVEL Level, + IN LONG AtRate OPTIONAL, + OUT PVOID Buffer, + IN ULONG BufferLength, + OUT PULONG ReturnedLength); + +typedef NTSTATUS DDKAPI +(*BCLASS_QUERY_STATUS)( + IN PVOID Context, + IN ULONG BatteryTag, + OUT PBATTERY_STATUS BatteryStatus); + +typedef NTSTATUS DDKAPI +(*BCLASS_QUERY_TAG)( + IN PVOID Context, + OUT PULONG BatteryTag); + +typedef NTSTATUS DDKAPI +(*BCLASS_SET_INFORMATION)( + IN PVOID Context, + IN ULONG BatteryTag, + IN BATTERY_SET_INFORMATION_LEVEL Level, + IN PVOID Buffer OPTIONAL); + +typedef NTSTATUS DDKAPI +(*BCLASS_SET_STATUS_NOTIFY)( + IN PVOID Context, + IN ULONG BatteryTag, + IN PBATTERY_NOTIFY BatteryNotify); + + +typedef struct _BATTERY_MINIPORT_INFO { + USHORT MajorVersion; + USHORT MinorVersion; + PVOID Context; + BCLASS_QUERY_TAG QueryTag; + BCLASS_QUERY_INFORMATION QueryInformation; + BCLASS_SET_INFORMATION SetInformation; + BCLASS_QUERY_STATUS QueryStatus; + BCLASS_SET_STATUS_NOTIFY SetStatusNotify; + BCLASS_DISABLE_STATUS_NOTIFY DisableStatusNotify; + PDEVICE_OBJECT Pdo; + PUNICODE_STRING DeviceName; +} BATTERY_MINIPORT_INFO, *PBATTERY_MINIPORT_INFO; + +/* BATTERY_MINIPORT_INFO.XxxVersion */ +#define BATTERY_CLASS_MAJOR_VERSION 0x0001 +#define BATTERY_CLASS_MINOR_VERSION 0x0000 + + +BCLASSAPI +NTSTATUS +DDKAPI +BatteryClassInitializeDevice( + IN PBATTERY_MINIPORT_INFO MiniportInfo, + IN PVOID *ClassData); + +BCLASSAPI +NTSTATUS +DDKAPI +BatteryClassIoctl( + IN PVOID ClassData, + IN PIRP Irp); + +BCLASSAPI +NTSTATUS +DDKAPI +BatteryClassQueryWmiDataBlock( + IN PVOID ClassData, + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN ULONG GuidIndex, + IN OUT PULONG InstanceLengthArray, + IN ULONG OutBufferSize, + OUT PUCHAR Buffer); + +BCLASSAPI +NTSTATUS +DDKAPI +BatteryClassStatusNotify( + IN PVOID ClassData); + +BCLASSAPI +NTSTATUS +DDKAPI +BatteryClassSystemControl( + IN PVOID ClassData, + IN PWMILIB_CONTEXT WmiLibContext, + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + OUT PSYSCTL_IRP_DISPOSITION Disposition); + +BCLASSAPI +NTSTATUS +DDKAPI +BatteryClassUnload( + IN PVOID ClassData); + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __BATCLASS_H */ diff --git a/reactos/w32api/include/ddk/cfg.h b/reactos/w32api/include/ddk/cfg.h new file mode 100644 index 00000000000..c2250247584 --- /dev/null +++ b/reactos/w32api/include/ddk/cfg.h @@ -0,0 +1,143 @@ +/* + * cfg.h + * + * PnP Configuration Manager shared definitions between user mode and kernel mode code + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __CFG_H +#define __CFG_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#define CM_PROB_NOT_CONFIGURED 0x00000001 +#define CM_PROB_DEVLOADER_FAILED 0x00000002 +#define CM_PROB_OUT_OF_MEMORY 0x00000003 +#define CM_PROB_ENTRY_IS_WRONG_TYPE 0x00000004 +#define CM_PROB_LACKED_ARBITRATOR 0x00000005 +#define CM_PROB_BOOT_CONFIG_CONFLICT 0x00000006 +#define CM_PROB_FAILED_FILTER 0x00000007 +#define CM_PROB_DEVLOADER_NOT_FOUND 0x00000008 +#define CM_PROB_INVALID_DATA 0x00000009 +#define CM_PROB_FAILED_START 0x0000000A +#define CM_PROB_LIAR 0x0000000B +#define CM_PROB_NORMAL_CONFLICT 0x0000000C +#define CM_PROB_NOT_VERIFIED 0x0000000D +#define CM_PROB_NEED_RESTART 0x0000000E +#define CM_PROB_REENUMERATION 0x0000000F +#define CM_PROB_PARTIAL_LOG_CONF 0x00000010 +#define CM_PROB_UNKNOWN_RESOURCE 0x00000011 +#define CM_PROB_REINSTALL 0x00000012 +#define CM_PROB_REGISTRY 0x00000013 +#define CM_PROB_VXDLDR 0x00000014 +#define CM_PROB_WILL_BE_REMOVED 0x00000015 +#define CM_PROB_DISABLED 0x00000016 +#define CM_PROB_DEVLOADER_NOT_READY 0x00000017 +#define CM_PROB_DEVICE_NOT_THERE 0x00000018 +#define CM_PROB_MOVED 0x00000019 +#define CM_PROB_TOO_EARLY 0x0000001A +#define CM_PROB_NO_VALID_LOG_CONF 0x0000001B +#define CM_PROB_FAILED_INSTALL 0x0000001C +#define CM_PROB_HARDWARE_DISABLED 0x0000001D +#define CM_PROB_CANT_SHARE_IRQ 0x0000001E +#define CM_PROB_FAILED_ADD 0x0000001F +#define CM_PROB_DISABLED_SERVICE 0x00000020 +#define CM_PROB_TRANSLATION_FAILED 0x00000021 +#define CM_PROB_NO_SOFTCONFIG 0x00000022 +#define CM_PROB_BIOS_TABLE 0x00000023 +#define CM_PROB_IRQ_TRANSLATION_FAILED 0x00000024 +#define CM_PROB_FAILED_DRIVER_ENTRY 0x00000025 +#define CM_PROB_DRIVER_FAILED_PRIOR_UNLOAD 0x00000026 +#define CM_PROB_DRIVER_FAILED_LOAD 0x00000027 +#define CM_PROB_DRIVER_SERVICE_KEY_INVALID 0x00000028 +#define CM_PROB_LEGACY_SERVICE_NO_DEVICES 0x00000029 +#define CM_PROB_DUPLICATE_DEVICE 0x0000002A +#define CM_PROB_FAILED_POST_START 0x0000002B +#define CM_PROB_HALTED 0x0000002C +#define CM_PROB_PHANTOM 0x0000002D +#define CM_PROB_SYSTEM_SHUTDOWN 0x0000002E +#define CM_PROB_HELD_FOR_EJECT 0x0000002F +#define CM_PROB_DRIVER_BLOCKED 0x00000030 +#define CM_PROB_REGISTRY_TOO_LARGE 0x00000031 + +#define LCPRI_FORCECONFIG 0x00000000 +#define LCPRI_BOOTCONFIG 0x00000001 +#define LCPRI_DESIRED 0x00002000 +#define LCPRI_NORMAL 0x00003000 +#define LCPRI_LASTBESTCONFIG 0x00003FFF +#define LCPRI_SUBOPTIMAL 0x00005000 +#define LCPRI_LASTSOFTCONFIG 0x00007FFF +#define LCPRI_RESTART 0x00008000 +#define LCPRI_REBOOT 0x00009000 +#define LCPRI_POWEROFF 0x0000A000 +#define LCPRI_HARDRECONFIG 0x0000C000 +#define LCPRI_HARDWIRED 0x0000E000 +#define LCPRI_IMPOSSIBLE 0x0000F000 +#define LCPRI_DISABLED 0x0000FFFF +#define MAX_LCPRI 0x0000FFFF + +#define DN_ROOT_ENUMERATED 0x00000001 /* Was enumerated by ROOT */ +#define DN_DRIVER_LOADED 0x00000002 /* Has Register_Device_Driver */ +#define DN_ENUM_LOADED 0x00000004 /* Has Register_Enumerator */ +#define DN_STARTED 0x00000008 /* Is currently configured */ +#define DN_MANUAL 0x00000010 /* Manually installed */ +#define DN_NEED_TO_ENUM 0x00000020 /* May need reenumeration */ +#define DN_NOT_FIRST_TIME 0x00000040 /* Has received a config */ +#define DN_HARDWARE_ENUM 0x00000080 /* Enum generates hardware ID */ +#define DN_LIAR 0x00000100 /* Lied about can reconfig once */ +#define DN_HAS_MARK 0x00000200 /* Not CM_Create_DevNode lately */ +#define DN_HAS_PROBLEM 0x00000400 /* Need device installer */ +#define DN_FILTERED 0x00000800 /* Is filtered */ +#define DN_MOVED 0x00001000 /* Has been moved */ +#define DN_DISABLEABLE 0x00002000 /* Can be rebalanced */ +#define DN_REMOVABLE 0x00004000 /* Can be removed */ +#define DN_PRIVATE_PROBLEM 0x00008000 /* Has a private problem */ +#define DN_MF_PARENT 0x00010000 /* Multi function parent */ +#define DN_MF_CHILD 0x00020000 /* Multi function child */ +#define DN_WILL_BE_REMOVED 0x00040000 /* Devnode is being removed */ + +typedef enum _PNP_VETO_TYPE { + PNP_VetoTypeUnknown, + PNP_VetoLegacyDevice, + PNP_VetoPendingClose, + PNP_VetoWindowsApp, + PNP_VetoWindowsService, + PNP_VetoOutstandingOpen, + PNP_VetoDevice, + PNP_VetoDriver, + PNP_VetoIllegalDeviceRequest, + PNP_VetoInsufficientPower, + PNP_VetoNonDisableable, + PNP_VetoLegacyDriver +} PNP_VETO_TYPE, *PPNP_VETO_TYPE; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __CFG_H */ diff --git a/reactos/w32api/include/ddk/cfgmgr32.h b/reactos/w32api/include/ddk/cfgmgr32.h new file mode 100644 index 00000000000..a048bb4922f --- /dev/null +++ b/reactos/w32api/include/ddk/cfgmgr32.h @@ -0,0 +1,1533 @@ +/* + * cfgmgr32.h + * + * PnP configuration manager + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __CFGMGR32_H +#define __CFGMGR32_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + +#if defined(_CFGMGR32_) +#define CMAPI DECLSPEC_EXPORT +#else +#define CMAPI DECLSPEC_IMPORT +#endif + +#include "cfg.h" + +#define CR_SUCCESS 0x00000000 +#define CR_DEFAULT 0x00000001 +#define CR_OUT_OF_MEMORY 0x00000002 +#define CR_INVALID_POINTER 0x00000003 +#define CR_INVALID_FLAG 0x00000004 +#define CR_INVALID_DEVNODE 0x00000005 +#define CR_INVALID_DEVINST CR_INVALID_DEVNODE +#define CR_INVALID_RES_DES 0x00000006 +#define CR_INVALID_LOG_CONF 0x00000007 +#define CR_INVALID_ARBITRATOR 0x00000008 +#define CR_INVALID_NODELIST 0x00000009 +#define CR_DEVNODE_HAS_REQS 0x0000000A +#define CR_DEVINST_HAS_REQS CR_DEVNODE_HAS_REQS +#define CR_INVALID_RESOURCEID 0x0000000B +#define CR_DLVXD_NOT_FOUND 0x0000000C +#define CR_NO_SUCH_DEVNODE 0x0000000D +#define CR_NO_SUCH_DEVINST CR_NO_SUCH_DEVNODE +#define CR_NO_MORE_LOG_CONF 0x0000000E +#define CR_NO_MORE_RES_DES 0x0000000F +#define CR_ALREADY_SUCH_DEVNODE 0x00000010 +#define CR_ALREADY_SUCH_DEVINST CR_ALREADY_SUCH_DEVNODE +#define CR_INVALID_RANGE_LIST 0x00000011 +#define CR_INVALID_RANGE 0x00000012 +#define CR_FAILURE 0x00000013 +#define CR_NO_SUCH_LOGICAL_DEV 0x00000014 +#define CR_CREATE_BLOCKED 0x00000015 +#define CR_NOT_SYSTEM_VM 0x00000016 +#define CR_REMOVE_VETOED 0x00000017 +#define CR_APM_VETOED 0x00000018 +#define CR_INVALID_LOAD_TYPE 0x00000019 +#define CR_BUFFER_SMALL 0x0000001A +#define CR_NO_ARBITRATOR 0x0000001B +#define CR_NO_REGISTRY_HANDLE 0x0000001C +#define CR_REGISTRY_ERROR 0x0000001D +#define CR_INVALID_DEVICE_ID 0x0000001E +#define CR_INVALID_DATA 0x0000001F +#define CR_INVALID_API 0x00000020 +#define CR_DEVLOADER_NOT_READY 0x00000021 +#define CR_NEED_RESTART 0x00000022 +#define CR_NO_MORE_HW_PROFILES 0x00000023 +#define CR_DEVICE_NOT_THERE 0x00000024 +#define CR_NO_SUCH_VALUE 0x00000025 +#define CR_WRONG_TYPE 0x00000026 +#define CR_INVALID_PRIORITY 0x00000027 +#define CR_NOT_DISABLEABLE 0x00000028 +#define CR_FREE_RESOURCES 0x00000029 +#define CR_QUERY_VETOED 0x0000002A +#define CR_CANT_SHARE_IRQ 0x0000002B +#define CR_NO_DEPENDENT 0x0000002C +#define CR_SAME_RESOURCES 0x0000002D +#define CR_NO_SUCH_REGISTRY_KEY 0x0000002E +#define CR_INVALID_MACHINENAME 0x0000002F +#define CR_REMOTE_COMM_FAILURE 0x00000030 +#define CR_MACHINE_UNAVAILABLE 0x00000031 +#define CR_NO_CM_SERVICES 0x00000032 +#define CR_ACCESS_DENIED 0x00000033 +#define CR_CALL_NOT_IMPLEMENTED 0x00000034 +#define CR_INVALID_PROPERTY 0x00000035 +#define CR_DEVICE_INTERFACE_ACTIVE 0x00000036 +#define CR_NO_SUCH_DEVICE_INTERFACE 0x00000037 +#define CR_INVALID_REFERENCE_STRING 0x00000038 +#define CR_INVALID_CONFLICT_LIST 0x00000039 +#define CR_INVALID_INDEX 0x0000003A +#define CR_INVALID_STRUCTURE_SIZE 0x0000003B + + +typedef DWORD RETURN_TYPE; +typedef RETURN_TYPE CONFIGRET; + +typedef HANDLE HMACHINE; +typedef HMACHINE *PHMACHINE; + +typedef DWORD_PTR RES_DES; +typedef RES_DES *PRES_DES; + +typedef DWORD_PTR RANGE_ELEMENT; +typedef RANGE_ELEMENT *PRANGE_ELEMENT; + +typedef ULONG_PTR CONFLICT_LIST; +typedef CONFLICT_LIST *PCONFLICT_LIST; + +typedef DWORD_PTR LOG_CONF; +typedef LOG_CONF *PLOG_CONF; + +typedef ULONG PRIORITY; +typedef PRIORITY *PPRIORITY; + +typedef DWORD_PTR RANGE_LIST; +typedef RANGE_LIST *PRANGE_LIST; + +typedef DWORD DEVNODE, DEVINST; +typedef DEVNODE *PDEVNODE, *PDEVINST; + +typedef CHAR *DEVNODEID_A, *DEVINSTID_A; +typedef WCHAR *DEVNODEID_W, *DEVINSTID_W; + +#ifdef UNICODE +typedef DEVNODEID_W DEVNODEID; +typedef DEVINSTID_W DEVINSTID; +#else +typedef DEVNODEID_A DEVNODEID; +typedef DEVINSTID_A DEVINSTID; +#endif + +typedef ULONG REGDISPOSITION; + +typedef ULONG RESOURCEID; +typedef RESOURCEID *PRESOURCEID; + +#define CM_RESDES_WIDTH_DEFAULT 0x00000000 +#define CM_RESDES_WIDTH_32 0x00000001 +#define CM_RESDES_WIDTH_64 0x00000002 +#define CM_RESDES_WIDTH_BITS 0x00000003 + + +#define MAX_CONFIG_VALUE 9999 +#define MAX_INSTANCE_VALUE 9999 + +#define MAX_DEVICE_ID_LEN 200 +#define MAX_DEVNODE_ID_LEN MAX_DEVICE_ID_LEN + +#define MAX_CLASS_NAME_LEN 32 +#define MAX_GUID_STRING_LEN 39 +#define MAX_PROFILE_LEN 80 + + +#define ResType_All 0x00000000 +#define ResType_None 0x00000000 +#define ResType_Mem 0x00000001 +#define ResType_IO 0x00000002 +#define ResType_DMA 0x00000003 +#define ResType_IRQ 0x00000004 +#define ResType_DoNotUse 0x00000005 +#define ResType_BusNumber 0x00000006 +#define ResType_MAX 0x00000006 +#define ResType_Ignored_Bit 0x00008000 +#define ResType_ClassSpecific 0x0000FFFF +#define ResType_Reserved 0x00008000 +#define ResType_DevicePrivate 0x00008001 +#define ResType_PcCardConfig 0x00008002 +#define ResType_MfCardConfig 0x00008003 + +#define CM_GETIDLIST_FILTER_NONE 0x00000000 +#define CM_GETIDLIST_FILTER_ENUMERATOR 0x00000001 +#define CM_GETIDLIST_FILTER_SERVICE 0x00000002 +#define CM_GETIDLIST_FILTER_EJECTRELATIONS 0x00000004 +#define CM_GETIDLIST_FILTER_REMOVALRELATIONS 0x00000008 +#define CM_GETIDLIST_FILTER_POWERRELATIONS 0x00000010 +#define CM_GETIDLIST_FILTER_BUSRELATIONS 0x00000020 +#define CM_GETIDLIST_DONOTGENERATE 0x10000040 +#define CM_GETIDLIST_FILTER_BITS 0x1000007F + +#define CM_GET_DEVICE_INTERFACE_LIST_PRESENT 0x00000000 +#define CM_GET_DEVICE_INTERFACE_LIST_ALL_DEVICES 0x00000001 +#define CM_GET_DEVICE_INTERFACE_LIST_BITS 0x00000001 + + +typedef struct BusNumber_Des_s { + DWORD BUSD_Count; + DWORD BUSD_Type; + DWORD BUSD_Flags; + ULONG BUSD_Alloc_Base; + ULONG BUSD_Alloc_End; +} BUSNUMBER_DES, *PBUSNUMBER_DES; + +typedef struct BusNumber_Range_s { + ULONG BUSR_Min; + ULONG BUSR_Max; + ULONG BUSR_nBusNumbers; + ULONG BUSR_Flags; +} BUSNUMBER_RANGE, *PBUSNUMBER_RANGE; + +#define BusNumberType_Range sizeof(BUSNUMBER_RANGE) + +typedef struct BusNumber_Resource_s { + BUSNUMBER_DES BusNumber_Header; + BUSNUMBER_RANGE BusNumber_Data[ANYSIZE_ARRAY]; +} BUSNUMBER_RESOURCE, *PBUSNUMBER_RESOURCE; + +typedef struct CS_Des_s { + DWORD CSD_SignatureLength; + DWORD CSD_LegacyDataOffset; + DWORD CSD_LegacyDataSize; + DWORD CSD_Flags; + GUID CSD_ClassGuid; + BYTE CSD_Signature[ANYSIZE_ARRAY]; +} CS_DES, *PCS_DES; + +typedef struct CS_Resource_s { + CS_DES CS_Header; +} CS_RESOURCE, *PCS_RESOURCE; + +typedef struct DevPrivate_Des_s { + DWORD PD_Count; + DWORD PD_Type; + DWORD PD_Data1; + DWORD PD_Data2; + DWORD PD_Data3; + DWORD PD_Flags; +} DEVPRIVATE_DES, *PDEVPRIVATE_DES; + +typedef struct DevPrivate_Range_s { + DWORD PR_Data1; + DWORD PR_Data2; + DWORD PR_Data3; +} DEVPRIVATE_RANGE, *PDEVPRIVATE_RANGE; + +#define PType_Range sizeof(DEVPRIVATE_RANGE) + +typedef struct DevPrivate_Resource_s { + DEVPRIVATE_DES PRV_Header; + DEVPRIVATE_RANGE PRV_Data[ANYSIZE_ARRAY]; +} DEVPRIVATE_RESOURCE, *PDEVPRIVATE_RESOURCE; + +/* DMA_DES.DD_Flags constants and masks */ +#define mDD_Width 0x3 +#define fDD_BYTE 0x0 +#define fDD_WORD 0x1 +#define fDD_DWORD 0x2 +#define fDD_BYTE_AND_WORD 0x3 + +#define mDD_BusMaster 0x4 +#define fDD_NoBusMaster 0x0 +#define fDD_BusMaster 0x4 + +#define mDD_Type 0x18 +#define fDD_TypeStandard 0x00 +#define fDD_TypeA 0x08 +#define fDD_TypeB 0x10 +#define fDD_TypeF 0x18 + +typedef struct DMA_Des_s { + DWORD DD_Count; + DWORD DD_Type; + DWORD DD_Flags; + ULONG DD_Alloc_Chan; +} DMA_DES, *PDMA_DES; + +typedef struct DMA_Range_s { + ULONG DR_Min; + ULONG DR_Max; + ULONG DR_Flags; +} DMA_RANGE, *PDMA_RANGE; + +#define DType_Range sizeof(DMA_RANGE) + +typedef struct DMA_Resource_s { + DMA_DES DMA_Header; + DMA_RANGE DMA_Data[ANYSIZE_ARRAY]; +} DMA_RESOURCE, *PDMA_RESOURCE; + +/* IO_DES.Type constants and masks */ +#define fIOD_PortType 0x1 +#define fIOD_Memory 0x0 +#define fIOD_IO 0x1 +#define fIOD_DECODE 0x00fc +#define fIOD_10_BIT_DECODE 0x0004 +#define fIOD_12_BIT_DECODE 0x0008 +#define fIOD_16_BIT_DECODE 0x0010 +#define fIOD_POSITIVE_DECODE 0x0020 +#define fIOD_PASSIVE_DECODE 0x0040 +#define fIOD_WINDOW_DECODE 0x0080 + +typedef struct IO_Des_s { + DWORD IOD_Count; + DWORD IOD_Type; + DWORDLONG IOD_Alloc_Base; + DWORDLONG IOD_Alloc_End; + DWORD IOD_DesFlags; +} IO_DES, *PIO_DES; + +/* IO_RANGE.IOR_Alias constants */ +#define IO_ALIAS_10_BIT_DECODE 0x00000004 +#define IO_ALIAS_12_BIT_DECODE 0x00000010 +#define IO_ALIAS_16_BIT_DECODE 0x00000000 +#define IO_ALIAS_POSITIVE_DECODE 0x000000FF + +typedef struct IO_Range_s { + DWORDLONG IOR_Align; + DWORD IOR_nPorts; + DWORDLONG IOR_Min; + DWORDLONG IOR_Max; + DWORD IOR_RangeFlags; + DWORDLONG IOR_Alias; +} IO_RANGE, *PIO_RANGE; + +#define IOType_Range sizeof(IO_RANGE) + +typedef struct IO_Resource_s { + IO_DES IO_Header; + IO_RANGE IO_Data[ANYSIZE_ARRAY]; +} IO_RESOURCE, *PIO_RESOURCE; + +/* IRQ_DES.IRQD_flags constants */ +#define mIRQD_Share 0x1 +#define fIRQD_Exclusive 0x0 +#define fIRQD_Share 0x1 + +#define fIRQD_Share_Bit 0 +#define fIRQD_Level_Bit 1 + +#define mIRQD_Edge_Level 0x2 +#define fIRQD_Level 0x0 +#define fIRQD_Edge 0x2 + +typedef struct IRQ_Des_32_s { + DWORD IRQD_Count; + DWORD IRQD_Type; + DWORD IRQD_Flags; + ULONG IRQD_Alloc_Num; + ULONG32 IRQD_Affinity; +} IRQ_DES_32, *PIRQ_DES_32; + +typedef struct IRQ_Des_64_s { + DWORD IRQD_Count; + DWORD IRQD_Type; + DWORD IRQD_Flags; + ULONG IRQD_Alloc_Num; + ULONG64 IRQD_Affinity; +} IRQ_DES_64, *PIRQ_DES_64; + +#ifdef _WIN64 +typedef IRQ_DES_64 IRQ_DES; +typedef PIRQ_DES_64 PIRQ_DES; +#else +typedef IRQ_DES_32 IRQ_DES; +typedef PIRQ_DES_32 PIRQ_DES; +#endif + +typedef struct IRQ_Range_s { + ULONG IRQR_Min; + ULONG IRQR_Max; + ULONG IRQR_Flags; +} IRQ_RANGE, *PIRQ_RANGE; + +#define IRQType_Range sizeof(IRQ_RANGE) + +typedef struct IRQ_Resource_s { + IRQ_DES IRQ_Header; + IRQ_RANGE IRQ_Data[ANYSIZE_ARRAY]; +} IRQ_RESOURCE, *PIRQ_RESOURCE; + +/* MEM_DES.MD_Flags constants */ +#define mMD_MemoryType 0x1 +#define fMD_MemoryType mMD_MemoryType +#define fMD_ROM 0x0 +#define fMD_RAM 0x1 + +#define mMD_32_24 0x2 +#define fMD_32_24 mMD_32_24 +#define fMD_24 0x0 +#define fMD_32 0x2 + +#define mMD_Prefetchable 0x4 +#define fMD_Prefetchable mMD_Prefetchable +#define fMD_Pref mMD_Prefetchable +#define fMD_PrefetchDisallowed 0x0 +#define fMD_PrefetchAllowed 0x4 + +#define mMD_Readable 0x8 +#define fMD_Readable mMD_Readable +#define fMD_ReadAllowed 0x0 +#define fMD_ReadDisallowed 0x8 + +#define mMD_CombinedWrite 0x10 +#define fMD_CombinedWrite mMD_CombinedWrite +#define fMD_CombinedWriteDisallowed 0x0 +#define fMD_CombinedWriteAllowed 0x10 + +#define mMD_Cacheable 0x20 +#define fMD_NonCacheable 0x0 +#define fMD_Cacheable 0x20 + +typedef struct Mem_Des_s { + DWORD MD_Count; + DWORD MD_Type; + DWORDLONG MD_Alloc_Base; + DWORDLONG MD_Alloc_End; + DWORD MD_Flags; + DWORD MD_Reserved; +} MEM_DES, *PMEM_DES; + +typedef struct Mem_Range_s { + DWORDLONG MR_Align; + ULONG MR_nBytes; + DWORDLONG MR_Min; + DWORDLONG MR_Max; + DWORD MR_Flags; + DWORD MR_Reserved; +} MEM_RANGE, *PMEM_RANGE; + +#define MType_Range sizeof(MEM_RANGE) + +typedef struct Mem_Resource_s { + MEM_DES MEM_Header; + MEM_RANGE MEM_Data[ANYSIZE_ARRAY]; +} MEM_RESOURCE, *PMEM_RESOURCE; + +/* MFCARD_DES.PMF_Flags constants */ +#define fPMF_AUDIO_ENABLE 0x8 +#define mPMF_AUDIO_ENABLE fPMF_AUDIO_ENABLE + +typedef struct MfCard_Des_s { + DWORD PMF_Count; + DWORD PMF_Type; + DWORD PMF_Flags; + BYTE PMF_ConfigOptions; + BYTE PMF_IoResourceIndex; + BYTE PMF_Reserved[2]; + DWORD PMF_ConfigRegisterBase; +} MFCARD_DES, *PMFCARD_DES; + +typedef struct MfCard_Resource_s { + MFCARD_DES MfCard_Header; +} MFCARD_RESOURCE, *PMFCARD_RESOURCE; + +/* PCCARD_DES.PCD_Flags constants */ + +typedef struct PcCard_Des_s { + DWORD PCD_Count; + DWORD PCD_Type; + DWORD PCD_Flags; + BYTE PCD_ConfigIndex; + BYTE PCD_Reserved[3]; + DWORD PCD_MemoryCardBase1; + DWORD PCD_MemoryCardBase2; +} PCCARD_DES, *PPCCARD_DES; + +#define mPCD_IO_8_16 0x1 +#define fPCD_IO_8 0x0 +#define fPCD_IO_16 0x1 +#define mPCD_MEM_8_16 0x2 +#define fPCD_MEM_8 0x0 +#define fPCD_MEM_16 0x2 +#define mPCD_MEM_A_C 0xC +#define fPCD_MEM1_A 0x4 +#define fPCD_MEM2_A 0x8 +#define fPCD_IO_ZW_8 0x10 +#define fPCD_IO_SRC_16 0x20 +#define fPCD_IO_WS_16 0x40 +#define mPCD_MEM_WS 0x300 +#define fPCD_MEM_WS_ONE 0x100 +#define fPCD_MEM_WS_TWO 0x200 +#define fPCD_MEM_WS_THREE 0x300 + +#define fPCD_MEM_A 0x4 + +#define fPCD_ATTRIBUTES_PER_WINDOW 0x8000 + +#define fPCD_IO1_16 0x00010000 +#define fPCD_IO1_ZW_8 0x00020000 +#define fPCD_IO1_SRC_16 0x00040000 +#define fPCD_IO1_WS_16 0x00080000 + +#define fPCD_IO2_16 0x00100000 +#define fPCD_IO2_ZW_8 0x00200000 +#define fPCD_IO2_SRC_16 0x00400000 +#define fPCD_IO2_WS_16 0x00800000 + +#define mPCD_MEM1_WS 0x03000000 +#define fPCD_MEM1_WS_ONE 0x01000000 +#define fPCD_MEM1_WS_TWO 0x02000000 +#define fPCD_MEM1_WS_THREE 0x03000000 +#define fPCD_MEM1_16 0x04000000 + +#define mPCD_MEM2_WS 0x30000000 +#define fPCD_MEM2_WS_ONE 0x10000000 +#define fPCD_MEM2_WS_TWO 0x20000000 +#define fPCD_MEM2_WS_THREE 0x30000000 +#define fPCD_MEM2_16 0x40000000 + +#define PCD_MAX_MEMORY 2 +#define PCD_MAX_IO 2 + +typedef struct PcCard_Resource_s { + PCCARD_DES PcCard_Header; +} PCCARD_RESOURCE, *PPCCARD_RESOURCE; + + +/* CONFLICT_DETAILS.CD.ulMask constants */ +#define CM_CDMASK_DEVINST 0x00000001 +#define CM_CDMASK_RESDES 0x00000002 +#define CM_CDMASK_FLAGS 0x00000004 +#define CM_CDMASK_DESCRIPTION 0x00000008 +#define CM_CDMASK_VALID 0x0000000F + +/* CONFLICT_DETAILS.CD.ulFlags constants */ +#define CM_CDFLAGS_DRIVER 0x00000001 +#define CM_CDFLAGS_ROOT_OWNED 0x00000002 +#define CM_CDFLAGS_RESERVED 0x00000004 + +typedef struct _CONFLICT_DETAILS_A { + ULONG CD_ulSize; + ULONG CD_ulMask; + DEVINST CD_dnDevInst; + RES_DES CD_rdResDes; + ULONG CD_ulFlags; + CHAR CD_szDescription[MAX_PATH]; +} CONFLICT_DETAILS_A , *PCONFLICT_DETAILS_A; + +typedef struct _CONFLICT_DETAILS_W { + ULONG CD_ulSize; + ULONG CD_ulMask; + DEVINST CD_dnDevInst; + RES_DES CD_rdResDes; + ULONG CD_ulFlags; + WCHAR CD_szDescription[MAX_PATH]; +} CONFLICT_DETAILS_W , *PCONFLICT_DETAILS_W; + +#ifdef UNICODE +typedef CONFLICT_DETAILS_W CONFLICT_DETAILS; +typedef PCONFLICT_DETAILS_W PCONFLICT_DETAILS; +#else +typedef CONFLICT_DETAILS_A CONFLICT_DETAILS; +typedef PCONFLICT_DETAILS_A PCONFLICT_DETAILS; +#endif + + + +/* CM_Add_Empty_Log_Conf.ulFlags constants */ +#define PRIORITY_EQUAL_FIRST 0x00000008 +#define PRIORITY_EQUAL_LAST 0x00000000 +#define PRIORITY_BIT 0x00000008 + +CMAPI +CONFIGRET +WINAPI +CM_Add_Empty_Log_Conf( + OUT PLOG_CONF plcLogConf, + IN DEVINST dnDevInst, + IN PRIORITY Priority, + IN ULONG ulFlags); + +CMAPI +CONFIGRET +WINAPI +CM_Add_Empty_Log_Conf_Ex( + OUT PLOG_CONF plcLogConf, + IN DEVINST dnDevInst, + IN PRIORITY Priority, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +/* CM_Add_ID.ulFlags constants */ +#define CM_ADD_ID_HARDWARE 0x00000000 +#define CM_ADD_ID_COMPATIBLE 0x00000001 +#define CM_ADD_ID_BITS 0x00000001 + +CMAPI +CONFIGRET +WINAPI +CM_Add_IDA( + IN DEVINST dnDevInst, + IN PSTR pszID, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Add_ID_ExA( + IN DEVINST dnDevInst, + IN PSTR pszID, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Add_ID_ExW( + IN DEVINST dnDevInst, + IN PWSTR pszID, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Add_IDW( + IN DEVINST dnDevInst, + IN PWSTR pszID, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +#ifdef UNICODE +#define CM_Add_ID CM_Add_IDW +#define CM_Add_ID_Ex CM_Add_ID_ExW +#else +#define CM_Add_ID CM_Add_IDA +#define CM_Add_ID_Ex CM_Add_ID_ExA +#endif /* UNICODE */ + +/* FIXME: Obsolete CM_Add_Range */ + +CMAPI +CONFIGRET +WINAPI +CM_Add_Res_Des( + OUT PRES_DES prdResDes, + IN LOG_CONF lcLogConf, + IN RESOURCEID ResourceID, + IN PCVOID ResourceData, + IN ULONG ResourceLen, + IN ULONG ulFlags); + +CMAPI +CONFIGRET +WINAPI +CM_Add_Res_Des_Ex( + OUT PRES_DES prdResDes, + IN LOG_CONF lcLogConf, + IN RESOURCEID ResourceID, + IN PCVOID ResourceData, + IN ULONG ResourceLen, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Connect_MachineA( + IN PCSTR UNCServerName, + OUT PHMACHINE phMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Connect_MachineW( + IN PCWSTR UNCServerName, + OUT PHMACHINE phMachine); + +#ifdef UNICODE +#define CM_Connect_Machine CM_Connect_MachineW +#else +#define CM_Connect_Machine CM_Connect_MachineA +#endif /* UNICODE */ + +/* FIXME: Obsolete CM_Create_DevNode */ +/* FIXME: Obsolete CM_Create_DevNodeEx */ +/* FIXME: Obsolete CM_Create_Range_List */ +/* FIXME: Obsolete CM_Delete_Class_Key */ +/* FIXME: Obsolete CM_Delete_Class_Key_Ex */ +/* FIXME: Obsolete CM_Delete_DevNode_Key */ +/* FIXME: Obsolete CM_Delete_DevNode_Key_Ex */ +/* FIXME: Obsolete CM_Delete_Range */ +/* FIXME: Obsolete CM_Detected_Resource_Conflict */ +/* FIXME: Obsolete CM_Detected_Resource_Conflict_Ex */ +/* FIXME: Obsolete CM_Disable_DevNode */ +/* FIXME: Obsolete CM_Disable_DevNodeEx */ + +CMAPI +CONFIGRET +WINAPI +CM_Disconnect_Machine( + IN HMACHINE hMachine); + +/* FIXME: Obsolete CM_Enable_DevNode */ +/* FIXME: Obsolete CM_Enable_DevNodeEx */ + +CMAPI +CONFIGRET +WINAPI +CM_Enumerate_Classes( + IN ULONG ulClassIndex, + OUT LPGUID ClassGuid, + IN ULONG ulFlags); + +CMAPI +CONFIGRET +WINAPI +CM_Enumerate_Classes_Ex( + IN ULONG ulClassIndex, + OUT LPGUID ClassGuid, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Enumerate_EnumeratorsA( + IN ULONG ulEnumIndex, + OUT PCHAR Buffer, + IN OUT PULONG pulLength, + IN ULONG ulFlags); + +CMAPI +CONFIGRET +WINAPI +CM_Enumerate_Enumerators_ExA( + IN ULONG ulEnumIndex, + OUT PCHAR Buffer, + IN OUT PULONG pulLength, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Enumerate_Enumerators_ExW( + IN ULONG ulEnumIndex, + OUT PWCHAR Buffer, + IN OUT PULONG pulLength, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Enumerate_EnumeratorsW( + IN ULONG ulEnumIndex, + OUT PWCHAR Buffer, + IN OUT PULONG pulLength, + IN ULONG ulFlags); + +#ifdef UNICODE +#define CM_Enumerate_Enumerators CM_Enumerate_EnumeratorsW +#define CM_Enumerate_Enumerators_Ex CM_Enumerate_Enumerators_ExW +#else +#define CM_Enumerate_Enumerators CM_Enumerate_EnumeratorsA +#define CM_Enumerate_Enumerators_Ex CM_Enumerate_Enumerators_ExW +#endif /* UNICODE */ + +/* FIXME: Obsolete CM_Find_Range */ +/* FIXME: Obsolete CM_First_Range */ + +CMAPI +CONFIGRET +WINAPI +CM_Free_Log_Conf( + IN LOG_CONF lcLogConfToBeFreed, + IN ULONG ulFlags); + +CMAPI +CONFIGRET +WINAPI +CM_Free_Log_Conf_Ex( + IN LOG_CONF lcLogConfToBeFreed, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Free_Log_Conf_Handle( + IN LOG_CONF lcLogConf); + +/* FIXME: Obsolete CM_Free_Range_List */ + +CMAPI +CONFIGRET +WINAPI +CM_Free_Res_Des( + OUT PRES_DES prdResDes, + IN RES_DES rdResDes, + IN ULONG ulFlags); + +CMAPI +CONFIGRET +WINAPI +CM_Free_Res_Des_Ex( + OUT PRES_DES prdResDes, + IN RES_DES rdResDes, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Free_Res_Des_Handle( + IN RES_DES rdResDes); + +CMAPI +CONFIGRET +WINAPI +CM_Free_Resource_Conflict_Handle( + IN CONFLICT_LIST clConflictList); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Child( + OUT PDEVINST pdnDevInst, + IN DEVINST dnDevInst, + IN ULONG ulFlags); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Child_Ex( + OUT PDEVINST pdnDevInst, + IN DEVINST dnDevInst, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +/* FIXME: Obsolete CM_Get_Class_Name */ +/* FIXME: Obsolete CM_Get_Class_Name_Ex */ +/* FIXME: Obsolete CM_Get_Class_Key_Name */ +/* FIXME: Obsolete CM_Get_Class_Key_Name_Ex */ +/* FIXME: Obsolete CM_Get_Class_Registry_Property */ + +CMAPI +CONFIGRET +WINAPI +CM_Get_Depth( + OUT PULONG pulDepth, + IN DEVINST dnDevInst, + IN ULONG ulFlags); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Depth_Ex( + OUT PULONG pulDepth, + IN DEVINST dnDevInst, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Device_IDA( + IN DEVINST dnDevInst, + OUT PCHAR Buffer, + IN ULONG BufferLen, + IN ULONG ulFlags); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Device_ID_ExA( + IN DEVINST dnDevInst, + OUT PCHAR Buffer, + IN ULONG BufferLen, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Device_ID_ExW( + IN DEVINST dnDevInst, + OUT PWCHAR Buffer, + IN ULONG BufferLen, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Device_IDW( + IN DEVINST dnDevInst, + OUT PWCHAR Buffer, + IN ULONG BufferLen, + IN ULONG ulFlags); + +#ifdef UNICODE +#define CM_Get_Device_ID CM_Get_Device_IDW +#define CM_Get_Device_ID_Ex CM_Get_Device_ID_ExW +#else +#define CM_Get_Device_ID CM_Get_Device_IDA +#define CM_Get_Device_ID_Ex CM_Get_Device_ID_ExW +#endif /* UNICODE */ + +CMAPI +CONFIGRET +WINAPI +CM_Get_Device_ID_ListA( + IN PCSTR pszFilter, OPTIONAL + OUT PCHAR Buffer, + IN ULONG BufferLen, + IN ULONG ulFlags); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Device_ID_List_ExA( + IN PCSTR pszFilter, OPTIONAL + OUT PCHAR Buffer, + IN ULONG BufferLen, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Device_ID_List_ExW( + IN PCWSTR pszFilter, OPTIONAL + OUT PWCHAR Buffer, + IN ULONG BufferLen, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Device_ID_ListW( + IN PCWSTR pszFilter, OPTIONAL + OUT PWCHAR Buffer, + IN ULONG BufferLen, + IN ULONG ulFlags); + +#ifdef UNICODE +#define CM_Get_Device_ID_List CM_Get_Device_ID_ListW +#define CM_Get_Device_ID_List_Ex CM_Get_Device_ID_List_ExW +#else +#define CM_Get_Device_ID_List CM_Get_Device_ID_ListA +#define CM_Get_Device_ID_List_Ex CM_Get_Device_ID_List_ExA +#endif /* UNICODE */ + +CMAPI +CONFIGRET +WINAPI +CM_Get_Device_ID_List_SizeA( + OUT PULONG pulLen, + IN PCSTR pszFilter, OPTIONAL + IN ULONG ulFlags); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Device_ID_List_Size_ExA( + OUT PULONG pulLen, + IN PCSTR pszFilter, OPTIONAL + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Device_ID_List_Size_ExW( + OUT PULONG pulLen, + IN PCWSTR pszFilter, OPTIONAL + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Device_ID_List_SizeW( + OUT PULONG pulLen, + IN PCWSTR pszFilter, OPTIONAL + IN ULONG ulFlags); + +#ifdef UNICODE +#define CM_Get_Device_ID_List_Size CM_Get_Device_ID_List_SizeW +#define CM_Get_Device_ID_List_Size_Ex CM_Get_Device_ID_List_Size_ExW +#else +#define CM_Get_Device_ID_List_Size CM_Get_Device_ID_List_SizeA +#define CM_Get_Device_ID_List_Size_Ex CM_Get_Device_ID_List_Size_ExA +#endif /* UNICODE */ + +CMAPI +CONFIGRET +WINAPI +CM_Get_Device_ID_Size( + OUT PULONG pulLen, + IN DEVINST dnDevInst, + IN ULONG ulFlags); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Device_ID_Size_Ex( + OUT PULONG pulLen, + IN DEVINST dnDevInst, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +/* FIXME: Obsolete CM_Get_Device_Interface_Alias */ +/* FIXME: Obsolete CM_Get_Device_Interface_Alias_Ex */ +/* FIXME: Obsolete CM_Get_Device_Interface_List */ +/* FIXME: Obsolete CM_Get_Device_Interface_List_Ex */ +/* FIXME: Obsolete CM_Get_Device_Interface_List_Size */ +/* FIXME: Obsolete CM_Get_Device_Interface_List_Size_Ex */ +/* FIXME: Obsolete CM_Get_DevNode_Custom_Property */ +/* FIXME: Obsolete CM_Get_DevNode_Custom_Property_Ex */ +/* FIXME: Obsolete CM_Get_DevNode_Registry_Property */ + +CMAPI +CONFIGRET +WINAPI +CM_Get_DevNode_Status( + OUT PULONG pulStatus, + OUT PULONG pulProblemNumber, + IN DEVINST dnDevInst, + IN ULONG ulFlags); + +CMAPI +CONFIGRET +WINAPI +CM_Get_DevNode_Status_Ex( + OUT PULONG pulStatus, + OUT PULONG pulProblemNumber, + IN DEVINST dnDevInst, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +#define CM_Get_DevInst_Status CM_Get_DevNode_Status +#define CM_Get_DevInst_Status_Ex CM_Get_DevNode_Status_Ex + +/* CM_Get_First_Log_Conf.ulFlags constants */ +#define BASIC_LOG_CONF 0x00000000 /* Specifies the req list. */ +#define FILTERED_LOG_CONF 0x00000001 /* Specifies the filtered req list. */ +#define ALLOC_LOG_CONF 0x00000002 /* Specifies the Alloc Element. */ +#define BOOT_LOG_CONF 0x00000003 /* Specifies the RM Alloc Element. */ +#define FORCED_LOG_CONF 0x00000004 /* Specifies the Forced Log Conf */ +#define OVERRIDE_LOG_CONF 0x00000005 /* Specifies the Override req list. */ +#define NUM_LOG_CONF 0x00000006 /* Number of Log Conf type */ +#define LOG_CONF_BITS 0x00000007 /* The bits of the log conf type. */ + +CMAPI +CONFIGRET +WINAPI +CM_Get_First_Log_Conf( + OUT PLOG_CONF plcLogConf, OPTIONAL + IN DEVINST dnDevInst, + IN ULONG ulFlags); + +CMAPI +CONFIGRET +WINAPI +CM_Get_First_Log_Conf_Ex( + OUT PLOG_CONF plcLogConf, OPTIONAL + IN DEVINST dnDevInst, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +/* FIXME: Obsolete CM_Get_Global_State */ +/* FIXME: Obsolete CM_Get_Global_State_Ex */ +/* FIXME: Obsolete CM_Get_Hardware_Profile_Info */ +/* FIXME: Obsolete CM_Get_Hardware_Profile_Info_Ex */ +/* FIXME: Obsolete CM_Get_HW_Prof_Flags */ +/* FIXME: Obsolete CM_Get_HW_Prof_Flags_Ex */ + +CMAPI +CONFIGRET +WINAPI +CM_Get_Log_Conf_Priority( + IN LOG_CONF lcLogConf, + OUT PPRIORITY pPriority, + IN ULONG ulFlags); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Log_Conf_Priority_Ex( + IN LOG_CONF lcLogConf, + OUT PPRIORITY pPriority, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Next_Log_Conf( + OUT PLOG_CONF plcLogConf, OPTIONAL + IN LOG_CONF lcLogConf, + IN ULONG ulFlags); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Next_Log_Conf_Ex( + OUT PLOG_CONF plcLogConf, OPTIONAL + IN LOG_CONF lcLogConf, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Next_Res_Des( + OUT PRES_DES prdResDes, + IN RES_DES rdResDes, + IN RESOURCEID ForResource, + OUT PRESOURCEID pResourceID, + IN ULONG ulFlags); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Next_Res_Des_Ex( + OUT PRES_DES prdResDes, + IN RES_DES rdResDes, + IN RESOURCEID ForResource, + OUT PRESOURCEID pResourceID, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Parent( + OUT PDEVINST pdnDevInst, + IN DEVINST dnDevInst, + IN ULONG ulFlags); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Parent_Ex( + OUT PDEVINST pdnDevInst, + IN DEVINST dnDevInst, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Res_Des_Data( + IN RES_DES rdResDes, + OUT PVOID Buffer, + IN ULONG BufferLen, + IN ULONG ulFlags); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Res_Des_Data_Ex( + IN RES_DES rdResDes, + OUT PVOID Buffer, + IN ULONG BufferLen, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Res_Des_Data_Size( + OUT PULONG pulSize, + IN RES_DES rdResDes, + IN ULONG ulFlags); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Res_Des_Data_Size_Ex( + OUT PULONG pulSize, + IN RES_DES rdResDes, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Resource_Conflict_Count( + IN CONFLICT_LIST clConflictList, + OUT PULONG pulCount); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Resource_Conflict_DetailsA( + IN CONFLICT_LIST clConflictList, + IN ULONG ulIndex, + IN OUT PCONFLICT_DETAILS_A pConflictDetails); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Resource_Conflict_DetailsW( + IN CONFLICT_LIST clConflictList, + IN ULONG ulIndex, + IN OUT PCONFLICT_DETAILS_W pConflictDetails); + +#ifdef UNICODE +#define CM_Get_Resource_Conflict_Details CM_Get_Resource_Conflict_DetailsW +#else +#define CM_Get_Resource_Conflict_Details CM_Get_Resource_Conflict_DetailsA +#endif /* UNICODE */ + +CMAPI +CONFIGRET +WINAPI +CM_Get_Sibling( + OUT PDEVINST pdnDevInst, + IN DEVINST DevInst, + IN ULONG ulFlags); + +CMAPI +CONFIGRET +WINAPI +CM_Get_Sibling_Ex( + OUT PDEVINST pdnDevInst, + IN DEVINST DevInst, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +WORD +WINAPI +CM_Get_Version( + VOID); + +CMAPI +WORD +WINAPI +CM_Get_Version_Ex( + IN HMACHINE hMachine); + +/* FIXME: Obsolete CM_Intersect_Range_List */ +/* FIXME: Obsolete CM_Invert_Range_List */ +/* FIXME: Obsolete CM_Is_Dock_Station_Present */ +/* FIXME: Obsolete CM_Is_Dock_Station_Present_Ex */ + +/* CM_Locate_DevNode.ulFlags constants */ +#define CM_LOCATE_DEVNODE_NORMAL 0x00000000 +#define CM_LOCATE_DEVNODE_PHANTOM 0x00000001 +#define CM_LOCATE_DEVNODE_CANCELREMOVE 0x00000002 +#define CM_LOCATE_DEVNODE_NOVALIDATION 0x00000004 +#define CM_LOCATE_DEVNODE_BITS 0x00000007 + +#define CM_LOCATE_DEVINST_NORMAL CM_LOCATE_DEVNODE_NORMAL +#define CM_LOCATE_DEVINST_PHANTOM CM_LOCATE_DEVNODE_PHANTOM +#define CM_LOCATE_DEVINST_CANCELREMOVE CM_LOCATE_DEVNODE_CANCELREMOVE +#define CM_LOCATE_DEVINST_NOVALIDATION CM_LOCATE_DEVNODE_NOVALIDATION +#define CM_LOCATE_DEVINST_BITS CM_LOCATE_DEVNODE_BITS + +CMAPI +CONFIGRET +WINAPI +CM_Locate_DevNodeA( + OUT PDEVINST pdnDevInst, + IN DEVINSTID_A pDeviceID, OPTIONAL + IN ULONG ulFlags); + +CMAPI +CONFIGRET +WINAPI +CM_Locate_DevNode_ExA( + OUT PDEVINST pdnDevInst, + IN DEVINSTID_A pDeviceID, OPTIONAL + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Locate_DevNode_ExW( + OUT PDEVINST pdnDevInst, + IN DEVINSTID_W pDeviceID, OPTIONAL + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Locate_DevNodeW( + OUT PDEVINST pdnDevInst, + IN DEVINSTID_W pDeviceID, OPTIONAL + IN ULONG ulFlags); + +#define CM_Locate_DevInstA CM_Locate_DevNodeA +#define CM_Locate_DevInstW CM_Locate_DevNodeW +#define CM_Locate_DevInst_ExA CM_Locate_DevNode_ExA +#define CM_Locate_DevInst_ExW CM_Locate_DevNode_ExW + +#ifdef UNICODE +#define CM_Locate_DevNode CM_Locate_DevNodeW +#define CM_Locate_DevInst CM_Locate_DevNodeW +#define CM_Locate_DevNode_Ex CM_Locate_DevNode_ExW +#define CM_Locate_DevInst_Ex CM_Locate_DevNode_ExW +#else +#define CM_Locate_DevNode CM_Locate_DevNodeA +#define CM_Locate_DevInst CM_Locate_DevNodeA +#define CM_Locate_DevNode_Ex CM_Locate_DevNode_ExA +#define CM_Locate_DevInst_Ex CM_Locate_DevNode_ExA +#endif /* UNICODE */ + +/* FIXME: Obsolete CM_Merge_Range_List */ + +CMAPI +CONFIGRET +WINAPI +CM_Modify_Res_Des( + OUT PRES_DES prdResDes, + IN RES_DES rdResDes, + IN RESOURCEID ResourceID, + IN PCVOID ResourceData, + IN ULONG ResourceLen, + IN ULONG ulFlags); + +CMAPI +CONFIGRET +WINAPI +CM_Modify_Res_Des_Ex( + OUT PRES_DES prdResDes, + IN RES_DES rdResDes, + IN RESOURCEID ResourceID, + IN PCVOID ResourceData, + IN ULONG ResourceLen, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +/* FIXME: Obsolete CM_Move_DevNode */ +/* FIXME: Obsolete CM_Move_DevNode_Ex */ +/* FIXME: Obsolete CM_Next_Range */ +/* FIXME: Obsolete CM_Open_Class_Key */ +/* FIXME: Obsolete CM_Open_Class_Key_Ex */ +/* FIXME: Obsolete CM_Open_DevNode_Key */ +/* FIXME: Obsolete CM_Open_DevNode_Key_Ex */ + +/* CM_Query_And_Remove_SubTree.ulFlags constants */ +#define CM_REMOVE_UI_OK 0x00000000 +#define CM_REMOVE_UI_NOT_OK 0x00000001 +#define CM_REMOVE_NO_RESTART 0x00000002 +#define CM_REMOVE_BITS 0x00000003 + +CMAPI +CONFIGRET +WINAPI +CM_Query_And_Remove_SubTreeA( + IN DEVINST dnAncestor, + OUT PPNP_VETO_TYPE pVetoType, + OUT LPSTR pszVetoName, + IN ULONG ulNameLength, + IN ULONG ulFlags); + +CMAPI +CONFIGRET +WINAPI +CM_Query_And_Remove_SubTreeW( + IN DEVINST dnAncestor, + OUT PPNP_VETO_TYPE pVetoType, + OUT LPWSTR pszVetoName, + IN ULONG ulNameLength, + IN ULONG ulFlags); + +CMAPI +CONFIGRET +WINAPI +CM_Query_And_Remove_SubTree_ExA( + IN DEVINST dnAncestor, + OUT PPNP_VETO_TYPE pVetoType, + OUT LPSTR pszVetoName, + IN ULONG ulNameLength, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Query_And_Remove_SubTree_ExW( + IN DEVINST dnAncestor, + OUT PPNP_VETO_TYPE pVetoType, + OUT LPWSTR pszVetoName, + IN ULONG ulNameLength, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +/* FIXME: Obsolete CM_Query_Arbitrator_Free_Data */ +/* FIXME: Obsolete CM_Query_Arbitrator_Free_Data_Ex */ +/* FIXME: Obsolete CM_Query_Arbitrator_Free_Size */ +/* FIXME: Obsolete CM_Query_Arbitrator_Free_Size_Ex */ +/* FIXME: Obsolete CM_Query_Arbitrator_Free_Size_Ex */ +/* FIXME: Obsolete CM_Query_Remove_SubTree */ +/* FIXME: Obsolete CM_Query_Remove_SubTree_Ex */ + +CMAPI +CONFIGRET +WINAPI +CM_Query_Resource_Conflict_List( + OUT PCONFLICT_LIST pclConflictList, + IN DEVINST dnDevInst, + IN RESOURCEID ResourceID, + IN PCVOID ResourceData, + IN ULONG ResourceLen, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +/* CM_Reenumerate_DevNode.ulFlags constants */ +#define CM_REENUMERATE_NORMAL 0x00000000 +#define CM_REENUMERATE_SYNCHRONOUS 0x00000001 +#define CM_REENUMERATE_RETRY_INSTALLATION 0x00000002 +#define CM_REENUMERATE_ASYNCHRONOUS 0x00000004 +#define CM_REENUMERATE_BITS 0x00000007 + +CMAPI +CONFIGRET +WINAPI +CM_Reenumerate_DevNode( + IN DEVINST dnDevInst, + IN ULONG ulFlags); + +CMAPI +CONFIGRET +WINAPI +CM_Reenumerate_DevNode_Ex( + IN DEVINST dnDevInst, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +#define CM_Reenumerate_DevInst CM_Reenumerate_DevNode +#define CM_Reenumerate_DevInst_Ex CM_Reenumerate_DevNode_Ex + +/* FIXME: Obsolete CM_Register_Device_Driver */ +/* FIXME: Obsolete CM_Register_Device_Driver_Ex */ +/* FIXME: Obsolete CM_Register_Device_Interface */ +/* FIXME: Obsolete CM_Register_Device_Interface_Ex */ +/* FIXME: Obsolete CM_Remove_SubTree */ +/* FIXME: Obsolete CM_Remove_SubTree_Ex */ + +CMAPI +CONFIGRET +WINAPI +CM_Request_Device_EjectA( + IN DEVINST dnDevInst, + OUT PPNP_VETO_TYPE pVetoType, + OUT LPSTR pszVetoName, + IN ULONG ulNameLength, + IN ULONG ulFlags); + +CMAPI +CONFIGRET +WINAPI +CM_Request_Device_Eject_ExW( + IN DEVINST dnDevInst, + OUT PPNP_VETO_TYPE pVetoType, + OUT LPWSTR pszVetoName, + IN ULONG ulNameLength, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Request_Device_Eject_ExA( + IN DEVINST dnDevInst, + OUT PPNP_VETO_TYPE pVetoType, + OUT LPSTR pszVetoName, + IN ULONG ulNameLength, + IN ULONG ulFlags, + IN HMACHINE hMachine); + +CMAPI +CONFIGRET +WINAPI +CM_Request_Device_EjectW( + IN DEVINST dnDevInst, + OUT PPNP_VETO_TYPE pVetoType, + OUT LPWSTR pszVetoName, + IN ULONG ulNameLength, + IN ULONG ulFlags); + +#ifdef UNICODE +#define CM_Request_Device_Eject CM_Request_Device_EjectW +#define CM_Request_Device_Eject_Ex CM_Request_Device_Eject_ExW +#else +#define CM_Request_Device_Eject CM_Request_Device_EjectA +#define CM_Request_Device_Eject_Ex CM_Request_Device_Eject_ExA +#endif /* UNICODE */ + +/* FIXME: Obsolete CM_Request_Eject_PC */ +/* FIXME: Obsolete CM_Request_Eject_PC_Ex */ +/* FIXME: Obsolete CM_Run_Detection */ +/* FIXME: Obsolete CM_Run_Detection_Ex */ +/* FIXME: Obsolete CM_Set_Class_Registry_Property */ +/* FIXME: Obsolete CM_Set_DevNode_Problem */ +/* FIXME: Obsolete CM_Set_DevNode_Problem_Ex */ +/* FIXME: Obsolete CM_Set_DevNode_Registry_Property */ +/* FIXME: Obsolete CM_Set_DevNode_Registry_Property_Ex */ +/* FIXME: Obsolete CM_Set_HW_Prof */ +/* FIXME: Obsolete CM_Set_HW_Prof_Ex */ +/* FIXME: Obsolete CM_Set_HW_Prof_Flags */ +/* FIXME: Obsolete CM_Set_HW_Prof_Flags_Ex */ +/* FIXME: Obsolete CM_Setup_DevNode */ +/* FIXME: Obsolete CM_Setup_DevNode_Ex */ +/* FIXME: Obsolete CM_Test_Range_Available */ +/* FIXME: Obsolete CM_Uninstall_DevNode */ +/* FIXME: Obsolete CM_Uninstall_DevNode_Ex */ +/* FIXME: Obsolete CM_Unregister_Device_Interface */ +/* FIXME: Obsolete CM_Unregister_Device_Interface_Ex */ + +#define CM_WaitNoPendingInstallEvents CMP_WaitNoPendingInstallEvents + +CMAPI +DWORD +WINAPI +CMP_WaitNoPendingInstallEvents( + IN DWORD dwTimeout); + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __CFGMGR32_H */ diff --git a/reactos/w32api/include/ddk/d4drvif.h b/reactos/w32api/include/ddk/d4drvif.h new file mode 100644 index 00000000000..fff128694bf --- /dev/null +++ b/reactos/w32api/include/ddk/d4drvif.h @@ -0,0 +1,108 @@ +/* + * d4drvif.h + * + * DOT4 driver IOCTL interface + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __D4DRVIF_H +#define __D4DRVIF_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" +#include "d4iface.h" + +#define FILE_DEVICE_DOT4 0x3a +#define IOCTL_DOT4_USER_BASE 2049 + +#define IOCTL_DOT4_ADD_ACTIVITY_BROADCAST \ + CTL_CODE(FILE_DEVICE_DOT4, IOCTL_DOT4_USER_BASE + 4, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_DOT4_CLOSE_CHANNEL \ + CTL_CODE(FILE_DEVICE_DOT4, IOCTL_DOT4_USER_BASE + 1, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_DOT4_CREATE_SOCKET \ + CTL_CODE(FILE_DEVICE_DOT4, IOCTL_DOT4_USER_BASE + 7, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) + +#define IOCTL_DOT4_DESTROY_SOCKET \ + CTL_CODE(FILE_DEVICE_DOT4, IOCTL_DOT4_USER_BASE + 9, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) + +#define IOCTL_DOT4_OPEN_CHANNEL \ + CTL_CODE(FILE_DEVICE_DOT4, IOCTL_DOT4_USER_BASE + 0, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) + +#define IOCTL_DOT4_READ \ + CTL_CODE(FILE_DEVICE_DOT4, IOCTL_DOT4_USER_BASE + 2, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) + +#define IOCTL_DOT4_REMOVE_ACTIVITY_BROADCAST \ + CTL_CODE(FILE_DEVICE_DOT4, IOCTL_DOT4_USER_BASE + 5, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_DOT4_WAIT_ACTIVITY_BROADCAST \ + CTL_CODE(FILE_DEVICE_DOT4, IOCTL_DOT4_USER_BASE + 6, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) + +#define IOCTL_DOT4_WAIT_FOR_CHANNEL \ + CTL_CODE(FILE_DEVICE_DOT4, IOCTL_DOT4_USER_BASE + 8, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) + +#define IOCTL_DOT4_WRITE \ + CTL_CODE(FILE_DEVICE_DOT4, IOCTL_DOT4_USER_BASE + 3, METHOD_IN_DIRECT, FILE_ANY_ACCESS) + + +#define MAX_SERVICE_LENGTH 40 + +typedef struct _DOT4_DC_CREATE_DATA { + unsigned char bPsid; + CHAR pServiceName[MAX_SERVICE_LENGTH + 1]; + unsigned char bType; + ULONG ulBufferSize; + USHORT usMaxHtoPPacketSize; + USHORT usMaxPtoHPacketSize; + unsigned char bHsid; +} DOT4_DC_CREATE_DATA, *PDOT4_DC_CREATE_DATA; + +typedef struct _DOT4_DC_DESTROY_DATA { + unsigned char bHsid; +} DOT4_DC_DESTROY_DATA, *PDOT4_DC_DESTROY_DATA; + +typedef struct _DOT4_DC_OPEN_DATA { + unsigned char bHsid; + unsigned char fAddActivity; + CHANNEL_HANDLE hChannelHandle; +} DOT4_DC_OPEN_DATA, *PDOT4_DC_OPEN_DATA; + +typedef struct _DOT4_DRIVER_CMD { + CHANNEL_HANDLE hChannelHandle; + ULONG ulSize; + ULONG ulOffset; + ULONG ulTimeout; +} DOT4_DRIVER_CMD, *PDOT4_DRIVER_CMD; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __D4DRVIF_H */ diff --git a/reactos/w32api/include/ddk/d4iface.h b/reactos/w32api/include/ddk/d4iface.h new file mode 100644 index 00000000000..3cd511656b1 --- /dev/null +++ b/reactos/w32api/include/ddk/d4iface.h @@ -0,0 +1,88 @@ +/* + * d4iface.h + * + * DOT4 interface + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __D4IFACE_H +#define __D4IFACE_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + +#define DOT4_MAX_CHANNELS 128 +#define NO_TIMEOUT 0 + +#define DOT4_CHANNEL 0 +#define HP_MESSAGE_PROCESSOR 1 +#define PRINTER_CHANNEL 2 +#define SCANNER_CHANNEL 4 +#define MIO_COMMAND_PROCESSOR 5 +#define ECHO_CHANNEL 6 +#define FAX_SEND_CHANNEL 7 +#define FAX_RECV_CHANNEL 8 +#define DIAGNOSTIC_CHANNEL 9 +#define HP_RESERVED 10 +#define IMAGE_DOWNLOAD 11 +#define HOST_DATASTORE_UPLOAD 12 +#define HOST_DATASTORE_DOWNLOAD 13 +#define CONFIG_UPLOAD 14 +#define CONFIG_DOWNLOAD 15 + +#define STREAM_TYPE_CHANNEL 1 +#define PACKET_TYPE_CHANNEL 2 + +/* DOT4_ACTIVITY.ulMessage flags */ +#define DOT4_STREAM_RECEIVED 0x100 +#define DOT4_STREAM_CREDITS 0x101 +#define DOT4_MESSAGE_RECEIVED 0x102 +#define DOT4_DISCONNECT 0x103 +#define DOT4_CHANNEL_CLOSED 0x105 + +typedef unsigned long CHANNEL_HANDLE, *PCHANNEL_HANDLE; + +typedef struct _DOT4_ACTIVITY { + ULONG ulMessage; + ULONG ulByteCount; + CHANNEL_HANDLE hChannel; +} DOT4_ACTIVITY, *PDOT4_ACTIVITY; + +typedef struct _DOT4_WMI_XFER_INFO { + ULONG ulStreamBytesWritten; + ULONG ulStreamBytesRead; + ULONG ulPacketBytesWritten; + ULONG ulPacketBytesRead; +} DOT4_WMI_XFER_INFO, *PDOT4_WMI_XFER_INFO; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __D4IFACE_H */ diff --git a/reactos/w32api/include/ddk/ddkmapi.h b/reactos/w32api/include/ddk/ddkmapi.h new file mode 100644 index 00000000000..feeff87639b --- /dev/null +++ b/reactos/w32api/include/ddk/ddkmapi.h @@ -0,0 +1,338 @@ +/* + * ddkmapi.h + * + * DirectDraw support for DxApi function + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __DDKMAPI_H +#define __DDKMAPI_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + +#if defined(_DXAPI_) + #define DXAPI DECLSPEC_EXPORT +#else + #define DXAPI DECLSPEC_IMPORT +#endif + +DXAPI +DWORD +FAR PASCAL +DxApi( + IN DWORD dwFunctionNum, + IN LPVOID lpvInBuffer, + IN DWORD cbInBuffer, + OUT LPVOID lpvOutBuffer, + OUT DWORD cbOutBuffer); + +typedef DWORD (FAR PASCAL *LPDXAPI)( + DWORD dwFunctionNum, + LPVOID lpvInBuffer, + DWORD cbInBuffer, + LPVOID lpvOutBuffer, + DWORD cbOutBuffer); + + +#define DXAPI_MAJORVERSION 1 +#define DXAPI_MINORVERSION 0 + +#define DD_FIRST_DXAPI 0x500 + +#define DD_DXAPI_GETVERSIONNUMBER (DD_FIRST_DXAPI) +#define DD_DXAPI_CLOSEHANDLE (DD_FIRST_DXAPI+1) +#define DD_DXAPI_OPENDIRECTDRAW (DD_FIRST_DXAPI+2) +#define DD_DXAPI_OPENSURFACE (DD_FIRST_DXAPI+3) +#define DD_DXAPI_OPENVIDEOPORT (DD_FIRST_DXAPI+4) +#define DD_DXAPI_GETKERNELCAPS (DD_FIRST_DXAPI+5) +#define DD_DXAPI_GET_VP_FIELD_NUMBER (DD_FIRST_DXAPI+6) +#define DD_DXAPI_SET_VP_FIELD_NUMBER (DD_FIRST_DXAPI+7) +#define DD_DXAPI_SET_VP_SKIP_FIELD (DD_FIRST_DXAPI+8) +#define DD_DXAPI_GET_SURFACE_STATE (DD_FIRST_DXAPI+9) +#define DD_DXAPI_SET_SURFACE_STATE (DD_FIRST_DXAPI+10) +#define DD_DXAPI_LOCK (DD_FIRST_DXAPI+11) +#define DD_DXAPI_FLIP_OVERLAY (DD_FIRST_DXAPI+12) +#define DD_DXAPI_FLIP_VP (DD_FIRST_DXAPI+13) +#define DD_DXAPI_GET_CURRENT_VP_AUTOFLIP_SURFACE (DD_FIRST_DXAPI+14) +#define DD_DXAPI_GET_LAST_VP_AUTOFLIP_SURFACE (DD_FIRST_DXAPI+15) +#define DD_DXAPI_REGISTER_CALLBACK (DD_FIRST_DXAPI+16) +#define DD_DXAPI_UNREGISTER_CALLBACK (DD_FIRST_DXAPI+17) +#define DD_DXAPI_GET_POLARITY (DD_FIRST_DXAPI+18) +#define DD_DXAPI_OPENVPCAPTUREDEVICE (DD_FIRST_DXAPI+19) +#define DD_DXAPI_ADDVPCAPTUREBUFFER (DD_FIRST_DXAPI+20) +#define DD_DXAPI_FLUSHVPCAPTUREBUFFERS (DD_FIRST_DXAPI+21) + + +typedef struct _DDCAPBUFFINFO { + DWORD dwFieldNumber; + DWORD bPolarity; + LARGE_INTEGER liTimeStamp; + DWORD ddRVal; +} DDCAPBUFFINFO, FAR * LPDDCAPBUFFINFO; + +/* DDADDVPCAPTUREBUFF.dwFlags constants */ +#define DDADDBUFF_SYSTEMMEMORY 0x0001 +#define DDADDBUFF_NONLOCALVIDMEM 0x0002 +#define DDADDBUFF_INVERT 0x0004 + +typedef struct _DDADDVPCAPTUREBUFF { + HANDLE hCapture; + DWORD dwFlags; + PMDL pMDL; + PKEVENT pKEvent; + LPDDCAPBUFFINFO lpBuffInfo; +} DDADDVPCAPTUREBUFF, FAR * LPDDADDVPCAPTUREBUFF; + +typedef struct _DDCLOSEHANDLE { + HANDLE hHandle; +} DDCLOSEHANDLE, FAR *LPDDCLOSEHANDLE; + +typedef struct _DDFLIPOVERLAY { + HANDLE hDirectDraw; + HANDLE hCurrentSurface; + HANDLE hTargetSurface; + DWORD dwFlags; +} DDFLIPOVERLAY, FAR *LPDDFLIPOVERLAY; + +typedef struct _DDFLIPVIDEOPORT { + HANDLE hDirectDraw; + HANDLE hVideoPort; + HANDLE hCurrentSurface; + HANDLE hTargetSurface; + DWORD dwFlags; +} DDFLIPVIDEOPORT, FAR *LPDDFLIPVIDEOPORT; + +typedef struct _DDGETAUTOFLIPIN { + HANDLE hDirectDraw; + HANDLE hVideoPort; +} DDGETAUTOFLIPIN, FAR *LPDDGETAUTOFLIPIN; + +typedef struct _DDGETAUTOFLIPOUT { + DWORD ddRVal; + HANDLE hVideoSurface; + HANDLE hVBISurface; + BOOL bPolarity; +} DDGETAUTOFLIPOUT, FAR *LPDDGETAUTOFLIPOUT; + +typedef struct _DDGETPOLARITYIN { + HANDLE hDirectDraw; + HANDLE hVideoPort; +} DDGETPOLARITYIN, FAR *LPDDGETPOLARITYIN; + +typedef struct _DDGETPOLARITYOUT { + DWORD ddRVal; + BOOL bPolarity; +} DDGETPOLARITYOUT, FAR *LPDDGETPOLARITYOUT; + +typedef struct _DDGETSURFACESTATEIN { + HANDLE hDirectDraw; + HANDLE hSurface; +} DDGETSURFACESTATEIN, FAR *LPDDGETSURFACESTATEIN; + +/* DDGETSURFACESTATEOUT.dwStateCaps/dwStateStatus constants */ +#define DDSTATE_BOB 0x0001 +#define DDSTATE_WEAVE 0x0002 +#define DDSTATE_EXPLICITLY_SET 0x0004 +#define DDSTATE_SOFTWARE_AUTOFLIP 0x0008 +#define DDSTATE_SKIPEVENFIELDS 0x0010 + +typedef struct _DDGETSURFACESTATEOUT { + DWORD ddRVal; + DWORD dwStateCaps; + DWORD dwStateStatus; +} DDGETSURFACESTATEOUT, FAR *LPDDGETSURFACESTATEOUT; + +typedef struct _DDGETFIELDNUMIN { + HANDLE hDirectDraw; + HANDLE hVideoPort; +} DDGETFIELDNUMIN, FAR *LPDDGETFIELDNUMIN; + +typedef struct _DDGETFIELDNUMOUT { + DWORD ddRVal; + DWORD dwFieldNum; +} DDGETFIELDNUMOUT, FAR *LPDDGETFIELDNUMOUT; + +typedef struct _DDGETKERNELCAPSOUT { + DWORD ddRVal; + DWORD dwCaps; + DWORD dwIRQCaps; +} DDGETKERNELCAPSOUT, FAR *LPDDGETKERNELCAPSOUT; + +typedef struct _DDGETVERSIONNUMBER { + DWORD ddRVal; + DWORD dwMajorVersion; + DWORD dwMinorVersion; +} DDGETVERSIONNUMBER, FAR *LPDDGETVERSIONNUMBER; + +typedef struct _DDLOCKIN { + HANDLE hDirectDraw; + HANDLE hSurface; +} DDLOCKIN, FAR *LPDDLOCKIN; + +typedef struct _DDLOCKOUT { + DWORD ddRVal; + DWORD dwSurfHeight; + DWORD dwSurfWidth; + LONG lSurfPitch; + PVOID lpSurface; + DWORD SurfaceCaps; + DWORD dwFormatFlags; + DWORD dwFormatFourCC; + DWORD dwFormatBitCount; + _ANONYMOUS_UNION union { + DWORD dwRBitMask; + DWORD dwYBitMask; + } DUMMYUNIONNAME; + _ANONYMOUS_UNION union { + DWORD dwGBitMask; + DWORD dwUBitMask; + } DUMMYUNIONNAME2; + _ANONYMOUS_UNION union { + DWORD dwBBitMask; + DWORD dwVBitMask; + } DUMMYUNIONNAME3; +} DDLOCKOUT, FAR *LPDDLOCKOUT; + +/* LPDD_NOTIFYCALLBACK.dwFlags constants */ +#define DDNOTIFY_DISPLAY_VSYNC 0x0001 +#define DDNOTIFY_VP_VSYNC 0x0002 +#define DDNOTIFY_VP_LINE 0x0004 +#define DDNOTIFY_PRERESCHANGE 0x0008 +#define DDNOTIFY_POSTRESCHANGE 0x0010 +#define DDNOTIFY_PREDOSBOX 0x0020 +#define DDNOTIFY_POSTDOSBOX 0x0040 +#define DDNOTIFY_CLOSEDIRECTDRAW 0x0080 +#define DDNOTIFY_CLOSESURFACE 0x0100 +#define DDNOTIFY_CLOSEVIDEOPORT 0x0200 +#define DDNOTIFY_CLOSECAPTURE 0x0400 + +typedef ULONG (FAR PASCAL *LPDD_NOTIFYCALLBACK)( + DWORD dwFlags, + PVOID pContext, + DWORD dwParam1, + DWORD dwParam2); + +typedef struct _DDOPENDIRECTDRAWIN { + ULONG_PTR dwDirectDrawHandle; + LPDD_NOTIFYCALLBACK pfnDirectDrawClose; + PVOID pContext; +} DDOPENDIRECTDRAWIN, FAR *LPDDOPENDIRECTDRAWIN; + +typedef struct _DDOPENDIRECTDRAWOUT { + DWORD ddRVal; + HANDLE hDirectDraw; +} DDOPENDIRECTDRAWOUT, FAR *LPDDOPENDIRECTDRAWOUT; + +typedef struct _DDOPENSURFACEIN { + HANDLE hDirectDraw; + ULONG_PTR dwSurfaceHandle; + LPDD_NOTIFYCALLBACK pfnSurfaceClose; + PVOID pContext; +} DDOPENSURFACEIN, FAR *LPDDOPENSURFACEIN; + +typedef struct _DDOPENSURFACEOUT { + DWORD ddRVal; + HANDLE hSurface; +} DDOPENSURFACEOUT, FAR *LPDDOPENSURFACEOUT; + +typedef struct _DDOPENVIDEOPORTIN { + HANDLE hDirectDraw; + ULONG dwVideoPortHandle; + LPDD_NOTIFYCALLBACK pfnVideoPortClose; + PVOID pContext; +} DDOPENVIDEOPORTIN, FAR *LPDDOPENVIDEOPORTIN; + +typedef struct _DDOPENVIDEOPORTOUT { + DWORD ddRVal; + HANDLE hVideoPort; +} DDOPENVIDEOPORTOUT, FAR *LPDDOPENVIDEOPORTOUT; + +/* DDOPENVPCAPTUREDEVICEIN.dwFlags constants */ +#define DDOPENCAPTURE_VIDEO 0x0001 +#define DDOPENCAPTURE_VBI 0x0002 + +typedef struct _DDOPENVPCAPTUREDEVICEIN { + HANDLE hDirectDraw; + HANDLE hVideoPort; + DWORD dwStartLine; + DWORD dwEndLine; + DWORD dwCaptureEveryNFields; + LPDD_NOTIFYCALLBACK pfnCaptureClose; + PVOID pContext; + DWORD dwFlags; +} DDOPENVPCAPTUREDEVICEIN, FAR * LPDDOPENVPCAPTUREDEVICEIN; + +typedef struct _DDOPENVPCAPTUREDEVICEOUT { + DWORD ddRVal; + HANDLE hCapture; +} DDOPENVPCAPTUREDEVICEOUT, FAR * LPDDOPENVPCAPTUREDEVICEOUT; + +/* DDREGISTERCALLBACK.dwEvents constants */ +#define DDEVENT_DISPLAY_VSYNC 0x0001 +#define DDEVENT_VP_VSYNC 0x0002 +#define DDEVENT_VP_LINE 0x0004 +#define DDEVENT_PRERESCHANGE 0x0008 +#define DDEVENT_POSTRESCHANGE 0x0010 +#define DDEVENT_PREDOSBOX 0x0020 +#define DDEVENT_POSTDOSBOX 0x0040 + +typedef struct _DDREGISTERCALLBACK { + HANDLE hDirectDraw; + ULONG dwEvents; + LPDD_NOTIFYCALLBACK pfnCallback; + ULONG_PTR dwParam1; + ULONG_PTR dwParam2; + PVOID pContext; +} DDREGISTERCALLBACK, FAR *LPDDREGISTERCALLBACK; + +typedef struct _DDSETSURFACETATE { + HANDLE hDirectDraw; + HANDLE hSurface; + DWORD dwState; + DWORD dwStartField; +} DDSETSURFACESTATE, FAR *LPDDSETSURFACESTATE; + +typedef struct _DDSETFIELDNUM { + HANDLE hDirectDraw; + HANDLE hVideoPort; + DWORD dwFieldNum; +} DDSETFIELDNUM, FAR *LPDDSETFIELDNUM; + +typedef struct _DDSETSKIPFIELD { + HANDLE hDirectDraw; + HANDLE hVideoPort; + DWORD dwStartField; +} DDSETSKIPFIELD, FAR *LPDDSETSKIPFIELD; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __DDKMAPI_H */ diff --git a/reactos/w32api/include/ddk/hidclass.h b/reactos/w32api/include/ddk/hidclass.h new file mode 100644 index 00000000000..8717fc5ef29 --- /dev/null +++ b/reactos/w32api/include/ddk/hidclass.h @@ -0,0 +1,151 @@ +/* + * hidclass.h + * + * HID class driver interface + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __HIDCLASS_H +#define __HIDCLASS_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" +#include "hidpi.h" + +#define HID_REVISION 0x00000001 + +DEFINE_GUID (GUID_DEVINTERFACE_HID, \ + 0x4D1E55B2L, 0xF16F, 0x11CF, 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30); +DEFINE_GUID (GUID_HID_INTERFACE_NOTIFY, \ + 0x2c4e2e88L, 0x25e6, 0x4c33, 0x88, 0x2f, 0x3d, 0x82, 0xe6, 0x07, 0x36, 0x81); +DEFINE_GUID (GUID_HID_INTERFACE_HIDPARSE, \ + 0xf5c315a5, 0x69ac, 0x4bc2, 0x92, 0x79, 0xd0, 0xb6, 0x45, 0x76, 0xf4, 0x4b); + +#define GUID_CLASS_INPUT GUID_DEVINTERFACE_HID + +#define GUID_CLASS_INPUT_STR "4D1E55B2-F16F-11CF-88CB-001111000030" + + +#define HID_CTL_CODE(id) \ + CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_NEITHER, FILE_ANY_ACCESS) +#define HID_BUFFER_CTL_CODE(id) \ + CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_BUFFERED, FILE_ANY_ACCESS) +#define HID_IN_CTL_CODE(id) \ + CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_IN_DIRECT, FILE_ANY_ACCESS) +#define HID_OUT_CTL_CODE(id) \ + CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_OUT_DIRECT, FILE_ANY_ACCESS) + + +#define IOCTL_GET_PHYSICAL_DESCRIPTOR HID_OUT_CTL_CODE(102) +#define IOCTL_HID_FLUSH_QUEUE HID_CTL_CODE(101) +#define IOCTL_HID_GET_COLLECTION_DESCRIPTOR HID_CTL_CODE(100) +#define IOCTL_HID_GET_COLLECTION_INFORMATION HID_BUFFER_CTL_CODE(106) +#define IOCTL_HID_GET_FEATURE HID_OUT_CTL_CODE(100) +#define IOCTL_HID_GET_HARDWARE_ID HID_OUT_CTL_CODE(103) +#define IOCTL_HID_GET_INDEXED_STRING HID_OUT_CTL_CODE(120) +#define IOCTL_HID_GET_INPUT_REPORT HID_OUT_CTL_CODE(104) +#define IOCTL_HID_GET_MANUFACTURER_STRING HID_OUT_CTL_CODE(110) +#define IOCTL_GET_NUM_DEVICE_INPUT_BUFFERS HID_BUFFER_CTL_CODE(104) +#define IOCTL_HID_GET_POLL_FREQUENCY_MSEC HID_BUFFER_CTL_CODE(102) +#define IOCTL_HID_GET_PRODUCT_STRING HID_OUT_CTL_CODE(111) +#define IOCTL_HID_GET_SERIALNUMBER_STRING HID_OUT_CTL_CODE(112) +#define IOCTL_HID_SET_FEATURE HID_IN_CTL_CODE(100) +#define IOCTL_SET_NUM_DEVICE_INPUT_BUFFERS HID_BUFFER_CTL_CODE(105) +#define IOCTL_HID_SET_OUTPUT_REPORT HID_IN_CTL_CODE(101) +#define IOCTL_HID_SET_POLL_FREQUENCY_MSEC HID_BUFFER_CTL_CODE(103) + +#define IOCTL_HID_GET_DRIVER_CONFIG HID_BUFFER_CTL_CODE(100) +#define IOCTL_HID_SET_DRIVER_CONFIG HID_BUFFER_CTL_CODE(101) +#define IOCTL_HID_GET_MS_GENRE_DESCRIPTOR HID_OUT_CTL_CODE(121) + + +enum DeviceObjectState { + DeviceObjectStarted = 0, + DeviceObjectStopped, + DeviceObjectRemoved +}; + +typedef VOID DDKAPI (*PHID_STATUS_CHANGE)( + PVOID Context, + enum DeviceObjectState State); + +typedef NTSTATUS DDKAPI (*PHIDP_GETCAPS)( + IN PHIDP_PREPARSED_DATA PreparsedData, + OUT PHIDP_CAPS Capabilities); + +typedef struct _HID_COLLECTION_INFORMATION { + ULONG DescriptorSize; + BOOLEAN Polled; + UCHAR Reserved1[1]; + USHORT VendorID; + USHORT ProductID; + USHORT VersionNumber; +} HID_COLLECTION_INFORMATION, *PHID_COLLECTION_INFORMATION; + +typedef struct _HID_DRIVER_CONFIG { + ULONG Size; + ULONG RingBufferSize; +} HID_DRIVER_CONFIG, *PHID_DRIVER_CONFIG; + +typedef struct _HID_INTERFACE_HIDPARSE { +#if 0 +/* FIXME: COM stuff */ +#ifdef __cplusplus + INTERFACE i; +#else + INTERFACE; +#endif +#endif + PHIDP_GETCAPS HidpGetCaps; +} HID_INTERFACE_HIDPARSE, *PHID_INTERFACE_HIDPARSE; + +typedef struct _HID_INTERFACE_NOTIFY_PNP { +#if 0 +/* FIXME: COM stuff */ +#ifdef __cplusplus + INTERFACE i; +#else + INTERFACE; +#endif +#endif + PHID_STATUS_CHANGE StatusChangeFn; + PVOID CallbackContext; +} HID_INTERFACE_NOTIFY_PNP, *PHID_INTERFACE_NOTIFY_PNP; + +typedef struct _HID_XFER_PACKET { + PUCHAR reportBuffer; + ULONG reportBufferLen; + UCHAR reportId; +} HID_XFER_PACKET, *PHID_XFER_PACKET; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __HIDCLASS_H */ diff --git a/reactos/w32api/include/ddk/hidpi.h b/reactos/w32api/include/ddk/hidpi.h new file mode 100644 index 00000000000..2f8ea573236 --- /dev/null +++ b/reactos/w32api/include/ddk/hidpi.h @@ -0,0 +1,608 @@ +/* + * hidpi.h + * + * Public Interface for HID parsing library. + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __HIDPI_H +#define __HIDPI_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" +#include "hidusage.h" + +#if defined(_HIDPI_) + #define HIDAPI DECLSPEC_EXPORT +#else + #define HIDAPI DECLSPEC_IMPORT +#endif + +typedef PUCHAR PHIDP_REPORT_DESCRIPTOR; +typedef struct _HIDP_PREPARSED_DATA * PHIDP_PREPARSED_DATA; + +typedef struct _HIDP_UNKNOWN_TOKEN { + UCHAR Token; + UCHAR Reserved[3]; + ULONG BitField; +} HIDP_UNKNOWN_TOKEN, *PHIDP_UNKNOWN_TOKEN; + +typedef enum _HIDP_KEYBOARD_DIRECTION { + HidP_Keyboard_Break, + HidP_Keyboard_Make +} HIDP_KEYBOARD_DIRECTION; + +typedef struct _HIDP_KEYBOARD_MODIFIER_STATE { + _ANONYMOUS_UNION union { + _ANONYMOUS_STRUCT struct { + ULONG LeftControl : 1; + ULONG LeftShift : 1; + ULONG LeftAlt : 1; + ULONG LeftGUI : 1; + ULONG RightControl : 1; + ULONG RightShift : 1; + ULONG RightAlt : 1; + ULONG RigthGUI : 1; + ULONG CapsLock : 1; + ULONG ScollLock : 1; + ULONG NumLock : 1; + ULONG Reserved : 21; + } DUMMYSTRUCTNAME; + ULONG ul; + } DUMMYUNIONNAME; +} HIDP_KEYBOARD_MODIFIER_STATE, *PHIDP_KEYBOARD_MODIFIER_STATE; + +typedef BOOLEAN (DDKAPI *PHIDP_INSERT_SCANCODES)( + IN PVOID Context, + IN PCHAR NewScanCodes, + IN ULONG Length); + +typedef struct _USAGE_AND_PAGE { + USAGE Usage; + USAGE UsagePage; +} USAGE_AND_PAGE, *PUSAGE_AND_PAGE; + +HIDAPI +NTSTATUS +DDKAPI +HidP_TranslateUsageAndPagesToI8042ScanCodes( + IN PUSAGE_AND_PAGE ChangedUsageList, + IN ULONG UsageListLength, + IN HIDP_KEYBOARD_DIRECTION KeyAction, + IN OUT PHIDP_KEYBOARD_MODIFIER_STATE ModifierState, + IN PHIDP_INSERT_SCANCODES InsertCodesProcedure, + IN PVOID InsertCodesContext); + +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); + +typedef struct _HIDP_BUTTON_CAPS { + USAGE UsagePage; + UCHAR ReportID; + BOOLEAN IsAlias; + USHORT BitField; + USHORT LinkCollection; + USAGE LinkUsage; + USAGE LinkUsagePage; + BOOLEAN IsRange; + BOOLEAN IsStringRange; + BOOLEAN IsDesignatorRange; + BOOLEAN IsAbsolute; + ULONG Reserved[10]; + _ANONYMOUS_UNION union { + struct { + USAGE UsageMin, UsageMax; + USHORT StringMin, StringMax; + USHORT DesignatorMin, DesignatorMax; + USHORT DataIndexMin, DataIndexMax; + } Range; + struct { + USAGE Usage, Reserved1; + USHORT StringIndex, Reserved2; + USHORT DesignatorIndex, Reserved3; + USHORT DataIndex, Reserved4; + } NotRange; + } DUMMYUNIONNAME; +} HIDP_BUTTON_CAPS, *PHIDP_BUTTON_CAPS; + +typedef struct _HIDP_CAPS { + USAGE Usage; + USAGE UsagePage; + USHORT InputReportByteLength; + USHORT OutputReportByteLength; + USHORT FeatureReportByteLength; + USHORT Reserved[17]; + USHORT NumberLinkCollectionNodes; + USHORT NumberInputButtonCaps; + USHORT NumberInputValueCaps; + USHORT NumberInputDataIndices; + USHORT NumberOutputButtonCaps; + USHORT NumberOutputValueCaps; + USHORT NumberOutputDataIndices; + USHORT NumberFeatureButtonCaps; + USHORT NumberFeatureValueCaps; + USHORT NumberFeatureDataIndices; +} HIDP_CAPS, *PHIDP_CAPS; + +typedef struct _HIDP_DATA { + USHORT DataIndex; + USHORT Reserved; + _ANONYMOUS_UNION union { + ULONG RawValue; + BOOLEAN On; + } DUMMYUNIONNAME; +} HIDP_DATA, *PHIDP_DATA; + +typedef struct _HIDP_EXTENDED_ATTRIBUTES { + UCHAR NumGlobalUnknowns; + UCHAR Reserved[3]; + PHIDP_UNKNOWN_TOKEN GlobalUnknowns; + ULONG Data[1]; +} HIDP_EXTENDED_ATTRIBUTES, *PHIDP_EXTENDED_ATTRIBUTES; + +#define HIDP_LINK_COLLECTION_ROOT ((USHORT) -1) +#define HIDP_LINK_COLLECTION_UNSPECIFIED ((USHORT) 0) + +typedef struct _HIDP_LINK_COLLECTION_NODE { + USAGE LinkUsage; + USAGE LinkUsagePage; + USHORT Parent; + USHORT NumberOfChildren; + USHORT NextSibling; + USHORT FirstChild; + ULONG CollectionType: 8; + ULONG IsAlias: 1; + ULONG Reserved: 23; + PVOID UserContext; +} HIDP_LINK_COLLECTION_NODE, *PHIDP_LINK_COLLECTION_NODE; + +typedef struct _HIDP_VALUE_CAPS { + USAGE UsagePage; + UCHAR ReportID; + BOOLEAN IsAlias; + USHORT BitField; + USHORT LinkCollection; + USAGE LinkUsage; + USAGE LinkUsagePage; + BOOLEAN IsRange; + BOOLEAN IsStringRange; + BOOLEAN IsDesignatorRange; + BOOLEAN IsAbsolute; + BOOLEAN HasNull; + UCHAR Reserved; + USHORT BitSize; + USHORT ReportCount; + USHORT Reserved2[5]; + ULONG UnitsExp; + ULONG Units; + LONG LogicalMin, LogicalMax; + LONG PhysicalMin, PhysicalMax; + _ANONYMOUS_UNION union { + struct { + USAGE UsageMin, UsageMax; + USHORT StringMin, StringMax; + USHORT DesignatorMin, DesignatorMax; + USHORT DataIndexMin, DataIndexMax; + } Range; + struct { + USAGE Usage, Reserved1; + USHORT StringIndex, Reserved2; + USHORT DesignatorIndex, Reserved3; + USHORT DataIndex, Reserved4; + } NotRange; + } DUMMYUNIONNAME; +} HIDP_VALUE_CAPS, *PHIDP_VALUE_CAPS; + +typedef enum _HIDP_REPORT_TYPE { + HidP_Input, + HidP_Output, + HidP_Feature +} HIDP_REPORT_TYPE; + +#define FACILITY_HID_ERROR_CODE 0x11 + +#define HIDP_ERROR_CODES(SEV, CODE) \ + ((NTSTATUS) (((SEV) << 28) | (FACILITY_HID_ERROR_CODE << 16) | (CODE))) + +#define HIDP_STATUS_SUCCESS (HIDP_ERROR_CODES(0x0, 0)) +#define HIDP_STATUS_NULL (HIDP_ERROR_CODES(0x8, 1)) +#define HIDP_STATUS_INVALID_PREPARSED_DATA (HIDP_ERROR_CODES(0xC, 1)) +#define HIDP_STATUS_INVALID_REPORT_TYPE (HIDP_ERROR_CODES(0xC, 2)) +#define HIDP_STATUS_INVALID_REPORT_LENGTH (HIDP_ERROR_CODES(0xC, 3)) +#define HIDP_STATUS_USAGE_NOT_FOUND (HIDP_ERROR_CODES(0xC, 4)) +#define HIDP_STATUS_VALUE_OUT_OF_RANGE (HIDP_ERROR_CODES(0xC, 5)) +#define HIDP_STATUS_BAD_LOG_PHY_VALUES (HIDP_ERROR_CODES(0xC, 6)) +#define HIDP_STATUS_BUFFER_TOO_SMALL (HIDP_ERROR_CODES(0xC, 7)) +#define HIDP_STATUS_INTERNAL_ERROR (HIDP_ERROR_CODES(0xC, 8)) +#define HIDP_STATUS_I8042_TRANS_UNKNOWN (HIDP_ERROR_CODES(0xC, 9)) +#define HIDP_STATUS_INCOMPATIBLE_REPORT_ID (HIDP_ERROR_CODES(0xC, 0xA)) +#define HIDP_STATUS_NOT_VALUE_ARRAY (HIDP_ERROR_CODES(0xC, 0xB)) +#define HIDP_STATUS_IS_VALUE_ARRAY (HIDP_ERROR_CODES(0xC, 0xC)) +#define HIDP_STATUS_DATA_INDEX_NOT_FOUND (HIDP_ERROR_CODES(0xC, 0xD)) +#define HIDP_STATUS_DATA_INDEX_OUT_OF_RANGE (HIDP_ERROR_CODES(0xC, 0xE)) +#define HIDP_STATUS_BUTTON_NOT_PRESSED (HIDP_ERROR_CODES(0xC, 0xF)) +#define HIDP_STATUS_REPORT_DOES_NOT_EXIST (HIDP_ERROR_CODES(0xC, 0x10)) +#define HIDP_STATUS_NOT_IMPLEMENTED (HIDP_ERROR_CODES(0xC, 0x20)) +#define HIDP_STATUS_I8242_TRANS_UNKNOWN HIDP_STATUS_I8042_TRANS_UNKNOWN + + + +/* + * NTSTATUS + * HidP_GetButtonCaps( + * IN HIDP_REPORT_TYPE ReportType, + * OUT PHIDP_BUTTON_CAPS ButtonCaps, + * IN OUT PULONG ButtonCapsLength, + * IN PHIDP_PREPARSED_DATA PreparsedData); + */ +#define HidP_GetButtonCaps(_Type_, _Caps_, _Len_, _Data_) \ + HidP_GetSpecificButtonCaps(_Type_, 0, 0, 0, _Caps_, _Len_, _Data_) + +/* + * NTSTATUS + * HidP_GetButtons( + * IN HIDP_REPORT_TYPE ReportType, + * IN USAGE UsagePage, + * IN USHORT LinkCollection, + * OUT USAGE *UsageList, + * IN OUT ULONG *UsageLength, + * IN PHIDP_PREPARSED_DATA PreparsedData, + * IN PCHAR Report, + * IN ULONG ReportLength); + */ +#define HidP_GetButtons(Rty, UPa, LCo, ULi, ULe, Ppd, Rep, RLe) \ + HidP_GetUsages(Rty, UPa, LCo, ULi, ULe, Ppd, Rep, RLe) + +#define HidP_GetButtonListLength(RTy, UPa, Ppd) \ + HidP_GetUsageListLength(Rty, UPa, Ppd) + + +/* + * NTSTATUS + * HidP_GetButtonsEx( + * 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); + */ +#define HidP_GetButtonsEx(RT, LC, BL, UL, PD, R, RL) \ + HidP_GetUsagesEx(RT, LC, BL, UL, PD, R, RL) + +HIDAPI +NTSTATUS +DDKAPI +HidP_GetCaps( + IN PHIDP_PREPARSED_DATA PreparsedData, + OUT PHIDP_CAPS Capabilities); + +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); + +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); + +HIDAPI +NTSTATUS +DDKAPI +HidP_GetLinkCollectionNodes( + OUT PHIDP_LINK_COLLECTION_NODE LinkCollectionNodes, + IN OUT PULONG LinkCollectionNodesLength, + IN PHIDP_PREPARSED_DATA PreparsedData); + +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); + +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); + +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); + +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); + +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); + +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); + +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); + +/* + * NTSTATUS + * HidP_GetValueCaps( + * IN HIDP_REPORT_TYPE ReportType, + * OUT PHIDP_VALUE_CAPS ValueCaps, + * IN OUT PULONG ValueCapsLength, + * IN PHIDP_PREPARSED_DATA PreparsedData); + */ +#define HidP_GetValueCaps(_Type_, _Caps_, _Len_, _Data_) \ + HidP_GetSpecificValueCaps (_Type_, 0, 0, 0, _Caps_, _Len_, _Data_) + +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); + +/* + * BOOLEAN + * HidP_IsSameUsageAndPage( + * USAGE_AND_PAGE u1, + * USAGE_AND_PAGE u2); + */ +#define HidP_IsSameUsageAndPage(u1, u2) ((* (PULONG) &u1) == (* (PULONG) &u2)) + +HIDAPI +ULONG +DDKAPI +HidP_MaxDataListLength( + IN HIDP_REPORT_TYPE ReportType, + IN PHIDP_PREPARSED_DATA PreparsedData); + +HIDAPI +ULONG +DDKAPI +HidP_MaxUsageListLength( + IN HIDP_REPORT_TYPE ReportType, + IN USAGE UsagePage OPTIONAL, + IN PHIDP_PREPARSED_DATA PreparsedData); + +/* + * NTSTATUS + * HidP_SetButtons( + * IN HIDP_REPORT_TYPE ReportType, + * IN USAGE UsagePage, + * IN USHORT LinkCollection, + * IN PUSAGE UsageList, + * IN OUT PULONG UsageLength, + * IN PHIDP_PREPARSED_DATA PreparsedData, + * IN OUT PCHAR Report, + * IN ULONG ReportLength); + */ +#define HidP_SetButtons(RT, UP, LC, UL1, UL2, PD, R, RL) \ + HidP_SetUsages(RT, UP, LC, UL1, UL2, PD, R, RL) + +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); + +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); + +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); + +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); + +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); + +/* + * NTSTATUS + * HidP_UnsetButtons( + * IN HIDP_REPORT_TYPE ReportType, + * IN USAGE UsagePage, + * IN USHORT LinkCollection, + * IN PUSAGE UsageList, + * IN OUT PULONG UsageLength, + * IN PHIDP_PREPARSED_DATA PreparsedData, + * IN OUT PCHAR Report, + * IN ULONG ReportLength); + */ +#define HidP_UnsetButtons(RT, UP, LC, UL1, UL2, PD, R, RL) \ + HidP_UnsetUsages(RT, UP, LC, UL1, UL2, PD, R, RL) + +HIDAPI +NTSTATUS +DDKAPI +HidP_UnsetUsages( + IN HIDP_REPORT_TYPE ReportType, + IN USAGE UsagePage, + IN USHORT LinkCollection, + IN PUSAGE UsageList, + IN OUT PULONG UsageLength, + IN PHIDP_PREPARSED_DATA PreparsedData, + IN OUT PCHAR Report, + IN ULONG ReportLength); + +HIDAPI +NTSTATUS +DDKAPI +HidP_UsageAndPageListDifference( + IN PUSAGE_AND_PAGE PreviousUsageList, + IN PUSAGE_AND_PAGE CurrentUsageList, + OUT PUSAGE_AND_PAGE BreakUsageList, + OUT PUSAGE_AND_PAGE MakeUsageList, + IN ULONG UsageListLength); + +HIDAPI +NTSTATUS +DDKAPI +HidP_UsageListDifference( + IN PUSAGE PreviousUsageList, + IN PUSAGE CurrentUsageList, + OUT PUSAGE BreakUsageList, + OUT PUSAGE MakeUsageList, + IN ULONG UsageListLength); + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __HIDPI_H */ diff --git a/reactos/w32api/include/ddk/hidusage.h b/reactos/w32api/include/ddk/hidusage.h new file mode 100644 index 00000000000..1f82af98d85 --- /dev/null +++ b/reactos/w32api/include/ddk/hidusage.h @@ -0,0 +1,210 @@ +/* + * hidusage.h + * + * HID usages + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __HIDUSAGE_H +#define __HIDUSAGE_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef USHORT USAGE, *PUSAGE; + +#define HID_USAGE_GENERIC_POINTER ((USAGE) 0x01) +#define HID_USAGE_GENERIC_MOUSE ((USAGE) 0x02) +#define HID_USAGE_GENERIC_JOYSTICK ((USAGE) 0x04) +#define HID_USAGE_GENERIC_GAMEPAD ((USAGE) 0x05) +#define HID_USAGE_GENERIC_KEYBOARD ((USAGE) 0x06) +#define HID_USAGE_GENERIC_KEYPAD ((USAGE) 0x07) +#define HID_USAGE_GENERIC_SYSTEM_CTL ((USAGE) 0x80) +#define HID_USAGE_GENERIC_X ((USAGE) 0x30) +#define HID_USAGE_GENERIC_Y ((USAGE) 0x31) +#define HID_USAGE_GENERIC_Z ((USAGE) 0x32) +#define HID_USAGE_GENERIC_RX ((USAGE) 0x33) +#define HID_USAGE_GENERIC_RY ((USAGE) 0x34) +#define HID_USAGE_GENERIC_RZ ((USAGE) 0x35) +#define HID_USAGE_GENERIC_SLIDER ((USAGE) 0x36) +#define HID_USAGE_GENERIC_DIAL ((USAGE) 0x37) +#define HID_USAGE_GENERIC_WHEEL ((USAGE) 0x38) +#define HID_USAGE_GENERIC_HATSWITCH ((USAGE) 0x39) +#define HID_USAGE_GENERIC_COUNTED_BUFFER ((USAGE) 0x3A) +#define HID_USAGE_GENERIC_BYTE_COUNT ((USAGE) 0x3B) +#define HID_USAGE_GENERIC_MOTION_WAKEUP ((USAGE) 0x3C) +#define HID_USAGE_GENERIC_VX ((USAGE) 0x40) +#define HID_USAGE_GENERIC_VY ((USAGE) 0x41) +#define HID_USAGE_GENERIC_VZ ((USAGE) 0x42) +#define HID_USAGE_GENERIC_VBRX ((USAGE) 0x43) +#define HID_USAGE_GENERIC_VBRY ((USAGE) 0x44) +#define HID_USAGE_GENERIC_VBRZ ((USAGE) 0x45) +#define HID_USAGE_GENERIC_VNO ((USAGE) 0x46) +#define HID_USAGE_GENERIC_SYSCTL_POWER ((USAGE) 0x81) +#define HID_USAGE_GENERIC_SYSCTL_SLEEP ((USAGE) 0x82) +#define HID_USAGE_GENERIC_SYSCTL_WAKE ((USAGE) 0x83) +#define HID_USAGE_GENERIC_SYSCTL_CONTEXT_MENU ((USAGE) 0x84) +#define HID_USAGE_GENERIC_SYSCTL_MAIN_MENU ((USAGE) 0x85) +#define HID_USAGE_GENERIC_SYSCTL_APP_MENU ((USAGE) 0x86) +#define HID_USAGE_GENERIC_SYSCTL_HELP_MENU ((USAGE) 0x87) +#define HID_USAGE_GENERIC_SYSCTL_MENU_EXIT ((USAGE) 0x88) +#define HID_USAGE_GENERIC_SYSCTL_MENU_SELECT ((USAGE) 0x89) +#define HID_USAGE_GENERIC_SYSCTL_MENU_RIGHT ((USAGE) 0x8A) +#define HID_USAGE_GENERIC_SYSCTL_MENU_LEFT ((USAGE) 0x8B) +#define HID_USAGE_GENERIC_SYSCTL_MENU_UP ((USAGE) 0x8C) +#define HID_USAGE_GENERIC_SYSCTL_MENU_DOWN ((USAGE) 0x8D) + +#define HID_USAGE_KEYBOARD_NOEVENT ((USAGE) 0x00) +#define HID_USAGE_KEYBOARD_ROLLOVER ((USAGE) 0x01) +#define HID_USAGE_KEYBOARD_POSTFAIL ((USAGE) 0x02) +#define HID_USAGE_KEYBOARD_UNDEFINED ((USAGE) 0x03) +#define HID_USAGE_KEYBOARD_aA ((USAGE) 0x04) +#define HID_USAGE_KEYBOARD_zZ ((USAGE) 0x1D) +#define HID_USAGE_KEYBOARD_ONE ((USAGE) 0x1E) +#define HID_USAGE_KEYBOARD_ZERO ((USAGE) 0x27) +#define HID_USAGE_KEYBOARD_LCTRL ((USAGE) 0xE0) +#define HID_USAGE_KEYBOARD_LSHFT ((USAGE) 0xE1) +#define HID_USAGE_KEYBOARD_LALT ((USAGE) 0xE2) +#define HID_USAGE_KEYBOARD_LGUI ((USAGE) 0xE3) +#define HID_USAGE_KEYBOARD_RCTRL ((USAGE) 0xE4) +#define HID_USAGE_KEYBOARD_RSHFT ((USAGE) 0xE5) +#define HID_USAGE_KEYBOARD_RALT ((USAGE) 0xE6) +#define HID_USAGE_KEYBOARD_RGUI ((USAGE) 0xE7) +#define HID_USAGE_KEYBOARD_SCROLL_LOCK ((USAGE) 0x47) +#define HID_USAGE_KEYBOARD_NUM_LOCK ((USAGE) 0x53) +#define HID_USAGE_KEYBOARD_CAPS_LOCK ((USAGE) 0x39) +#define HID_USAGE_KEYBOARD_F1 ((USAGE) 0x3A) +#define HID_USAGE_KEYBOARD_F12 ((USAGE) 0x45) +#define HID_USAGE_KEYBOARD_RETURN ((USAGE) 0x28) +#define HID_USAGE_KEYBOARD_ESCAPE ((USAGE) 0x29) +#define HID_USAGE_KEYBOARD_DELETE ((USAGE) 0x2A) +#define HID_USAGE_KEYBOARD_PRINT_SCREEN ((USAGE) 0x46) + +#define HID_USAGE_LED_NUM_LOCK ((USAGE) 0x01) +#define HID_USAGE_LED_CAPS_LOCK ((USAGE) 0x02) +#define HID_USAGE_LED_SCROLL_LOCK ((USAGE) 0x03) +#define HID_USAGE_LED_COMPOSE ((USAGE) 0x04) +#define HID_USAGE_LED_KANA ((USAGE) 0x05) +#define HID_USAGE_LED_POWER ((USAGE) 0x06) +#define HID_USAGE_LED_SHIFT ((USAGE) 0x07) +#define HID_USAGE_LED_DO_NOT_DISTURB ((USAGE) 0x08) +#define HID_USAGE_LED_MUTE ((USAGE) 0x09) +#define HID_USAGE_LED_TONE_ENABLE ((USAGE) 0x0A) +#define HID_USAGE_LED_HIGH_CUT_FILTER ((USAGE) 0x0B) +#define HID_USAGE_LED_LOW_CUT_FILTER ((USAGE) 0x0C) +#define HID_USAGE_LED_EQUALIZER_ENABLE ((USAGE) 0x0D) +#define HID_USAGE_LED_SOUND_FIELD_ON ((USAGE) 0x0E) +#define HID_USAGE_LED_SURROUND_FIELD_ON ((USAGE) 0x0F) +#define HID_USAGE_LED_REPEAT ((USAGE) 0x10) +#define HID_USAGE_LED_STEREO ((USAGE) 0x11) +#define HID_USAGE_LED_SAMPLING_RATE_DETECT ((USAGE) 0x12) +#define HID_USAGE_LED_SPINNING ((USAGE) 0x13) +#define HID_USAGE_LED_CAV ((USAGE) 0x14) +#define HID_USAGE_LED_CLV ((USAGE) 0x15) +#define HID_USAGE_LED_RECORDING_FORMAT_DET ((USAGE) 0x16) +#define HID_USAGE_LED_OFF_HOOK ((USAGE) 0x17) +#define HID_USAGE_LED_RING ((USAGE) 0x18) +#define HID_USAGE_LED_MESSAGE_WAITING ((USAGE) 0x19) +#define HID_USAGE_LED_DATA_MODE ((USAGE) 0x1A) +#define HID_USAGE_LED_BATTERY_OPERATION ((USAGE) 0x1B) +#define HID_USAGE_LED_BATTERY_OK ((USAGE) 0x1C) +#define HID_USAGE_LED_BATTERY_LOW ((USAGE) 0x1D) +#define HID_USAGE_LED_SPEAKER ((USAGE) 0x1E) +#define HID_USAGE_LED_HEAD_SET ((USAGE) 0x1F) +#define HID_USAGE_LED_HOLD ((USAGE) 0x20) +#define HID_USAGE_LED_MICROPHONE ((USAGE) 0x21) +#define HID_USAGE_LED_COVERAGE ((USAGE) 0x22) +#define HID_USAGE_LED_NIGHT_MODE ((USAGE) 0x23) +#define HID_USAGE_LED_SEND_CALLS ((USAGE) 0x24) +#define HID_USAGE_LED_CALL_PICKUP ((USAGE) 0x25) +#define HID_USAGE_LED_CONFERENCE ((USAGE) 0x26) +#define HID_USAGE_LED_STAND_BY ((USAGE) 0x27) +#define HID_USAGE_LED_CAMERA_ON ((USAGE) 0x28) +#define HID_USAGE_LED_CAMERA_OFF ((USAGE) 0x29) +#define HID_USAGE_LED_ON_LINE ((USAGE) 0x2A) +#define HID_USAGE_LED_OFF_LINE ((USAGE) 0x2B) +#define HID_USAGE_LED_BUSY ((USAGE) 0x2C) +#define HID_USAGE_LED_READY ((USAGE) 0x2D) +#define HID_USAGE_LED_PAPER_OUT ((USAGE) 0x2E) +#define HID_USAGE_LED_PAPER_JAM ((USAGE) 0x2F) +#define HID_USAGE_LED_REMOTE ((USAGE) 0x30) +#define HID_USAGE_LED_FORWARD ((USAGE) 0x31) +#define HID_USAGE_LED_REVERSE ((USAGE) 0x32) +#define HID_USAGE_LED_STOP ((USAGE) 0x33) +#define HID_USAGE_LED_REWIND ((USAGE) 0x34) +#define HID_USAGE_LED_FAST_FORWARD ((USAGE) 0x35) +#define HID_USAGE_LED_PLAY ((USAGE) 0x36) +#define HID_USAGE_LED_PAUSE ((USAGE) 0x37) +#define HID_USAGE_LED_RECORD ((USAGE) 0x38) +#define HID_USAGE_LED_ERROR ((USAGE) 0x39) +#define HID_USAGE_LED_SELECTED_INDICATOR ((USAGE) 0x3A) +#define HID_USAGE_LED_IN_USE_INDICATOR ((USAGE) 0x3B) +#define HID_USAGE_LED_MULTI_MODE_INDICATOR ((USAGE) 0x3C) +#define HID_USAGE_LED_INDICATOR_ON ((USAGE) 0x3D) +#define HID_USAGE_LED_INDICATOR_FLASH ((USAGE) 0x3E) +#define HID_USAGE_LED_INDICATOR_SLOW_BLINK ((USAGE) 0x3F) +#define HID_USAGE_LED_INDICATOR_FAST_BLINK ((USAGE) 0x40) +#define HID_USAGE_LED_INDICATOR_OFF ((USAGE) 0x41) +#define HID_USAGE_LED_FLASH_ON_TIME ((USAGE) 0x42) +#define HID_USAGE_LED_SLOW_BLINK_ON_TIME ((USAGE) 0x43) +#define HID_USAGE_LED_SLOW_BLINK_OFF_TIME ((USAGE) 0x44) +#define HID_USAGE_LED_FAST_BLINK_ON_TIME ((USAGE) 0x45) +#define HID_USAGE_LED_FAST_BLINK_OFF_TIME ((USAGE) 0x46) +#define HID_USAGE_LED_INDICATOR_COLOR ((USAGE) 0x47) +#define HID_USAGE_LED_RED ((USAGE) 0x48) +#define HID_USAGE_LED_GREEN ((USAGE) 0x49) +#define HID_USAGE_LED_AMBER ((USAGE) 0x4A) +#define HID_USAGE_LED_GENERIC_INDICATOR ((USAGE) 0x3B) + +#define HID_USAGE_PAGE_UNDEFINED ((USAGE) 0x00) +#define HID_USAGE_PAGE_GENERIC ((USAGE) 0x01) +#define HID_USAGE_PAGE_SIMULATION ((USAGE) 0x02) +#define HID_USAGE_PAGE_VR ((USAGE) 0x03) +#define HID_USAGE_PAGE_SPORT ((USAGE) 0x04) +#define HID_USAGE_PAGE_GAME ((USAGE) 0x05) +#define HID_USAGE_PAGE_KEYBOARD ((USAGE) 0x07) +#define HID_USAGE_PAGE_LED ((USAGE) 0x08) +#define HID_USAGE_PAGE_BUTTON ((USAGE) 0x09) +#define HID_USAGE_PAGE_ORDINAL ((USAGE) 0x0A) +#define HID_USAGE_PAGE_TELEPHONY ((USAGE) 0x0B) +#define HID_USAGE_PAGE_CONSUMER ((USAGE) 0x0C) +#define HID_USAGE_PAGE_DIGITIZER ((USAGE) 0x0D) +#define HID_USAGE_PAGE_UNICODE ((USAGE) 0x10) +#define HID_USAGE_PAGE_ALPHANUMERIC ((USAGE) 0x14) + +#define HID_USAGE_TELEPHONY_PHONE ((USAGE) 0x01) +#define HID_USAGE_TELEPHONY_ANSWERING_MACHINE ((USAGE) 0x02) +#define HID_USAGE_TELEPHONY_MESSAGE_CONTROLS ((USAGE) 0x03) +#define HID_USAGE_TELEPHONY_HANDSET ((USAGE) 0x04) +#define HID_USAGE_TELEPHONY_HEADSET ((USAGE) 0x05) +#define HID_USAGE_TELEPHONY_KEYPAD ((USAGE) 0x06) +#define HID_USAGE_TELEPHONY_PROGRAMMABLE_BUTTON ((USAGE) 0x07) + +#define HID_USAGE_SIMULATION_RUDDER ((USAGE) 0xBA) +#define HID_USAGE_SIMULATION_THROTTLE ((USAGE) 0xBB) + +#ifdef __cplusplus +} +#endif + +#endif /* __HIDUSAGE_H */ diff --git a/reactos/w32api/include/ddk/mcd.h b/reactos/w32api/include/ddk/mcd.h new file mode 100644 index 00000000000..c5e2380cf4e --- /dev/null +++ b/reactos/w32api/include/ddk/mcd.h @@ -0,0 +1,147 @@ +/* + * mcd.h + * + * Media changer driver interface + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __MCD_H +#define __MCD_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" +#include "srb.h" +#include "scsi.h" +#include "ntddchgr.h" + +#if defined(_MCD_) + #define CHANGERAPI DECLSPEC_EXPORT +#else + #define CHANGERAPI DECLSPEC_IMPORT +#endif + +#ifdef DebugPrint +#undef DebugPrint +#endif + +#ifdef DBG +#define DebugPrint(x) ChangerClassDebugPrint x +#else +#define DebugPrint(x) +#endif + +#define MAXIMUM_CHANGER_INQUIRY_DATA 252 + +CHANGERAPI +PVOID +DDKAPI +ChangerClassAllocatePool( + IN POOL_TYPE PoolType, + IN ULONG NumberOfBytes); + +VOID +ChangerClassDebugPrint( + ULONG DebugPrintLevel, + PCCHAR DebugMessage, + ...); + +CHANGERAPI +PVOID +DDKAPI +ChangerClassFreePool( + IN PVOID PoolToFree); + +CHANGERAPI +NTSTATUS +DDKAPI +ChangerClassSendSrbSynchronous( + IN PDEVICE_OBJECT DeviceObject, + IN PSCSI_REQUEST_BLOCK Srb, + IN PVOID Buffer, + IN ULONG BufferSize, + IN BOOLEAN WriteToDevice); + + +typedef NTSTATUS DDKAPI +(*CHANGER_INITIALIZE)( + IN PDEVICE_OBJECT DeviceObject); + +typedef ULONG DDKAPI +(*CHANGER_EXTENSION_SIZE)( + VOID); + +typedef VOID DDKAPI +(*CHANGER_ERROR_ROUTINE)( + PDEVICE_OBJECT DeviceObject, + PSCSI_REQUEST_BLOCK Srb, + NTSTATUS *Status, + BOOLEAN *Retry); + +typedef NTSTATUS DDKAPI +(*CHANGER_COMMAND_ROUTINE)( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp); + +typedef NTSTATUS DDKAPI +(*CHANGER_PERFORM_DIAGNOSTICS)( + IN PDEVICE_OBJECT DeviceObject, + OUT PWMI_CHANGER_PROBLEM_DEVICE_ERROR ChangerDeviceError); + +typedef struct _MCD_INIT_DATA { + ULONG InitDataSize; + CHANGER_EXTENSION_SIZE ChangerAdditionalExtensionSize; + CHANGER_INITIALIZE ChangerInitialize; + CHANGER_ERROR_ROUTINE ChangerError; + CHANGER_PERFORM_DIAGNOSTICS ChangerPerformDiagnostics; + CHANGER_COMMAND_ROUTINE ChangerGetParameters; + CHANGER_COMMAND_ROUTINE ChangerGetStatus; + CHANGER_COMMAND_ROUTINE ChangerGetProductData; + CHANGER_COMMAND_ROUTINE ChangerSetAccess; + CHANGER_COMMAND_ROUTINE ChangerGetElementStatus; + CHANGER_COMMAND_ROUTINE ChangerInitializeElementStatus; + CHANGER_COMMAND_ROUTINE ChangerSetPosition; + CHANGER_COMMAND_ROUTINE ChangerExchangeMedium; + CHANGER_COMMAND_ROUTINE ChangerMoveMedium; + CHANGER_COMMAND_ROUTINE ChangerReinitializeUnit; + CHANGER_COMMAND_ROUTINE ChangerQueryVolumeTags; +} MCD_INIT_DATA, *PMCD_INIT_DATA; + +CHANGERAPI +NTSTATUS +DDKAPI +ChangerClassInitialize( + IN PDRIVER_OBJECT DriverObject, + IN PUNICODE_STRING RegistryPath, + IN PMCD_INIT_DATA MCDInitData); + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __MCD_H */ diff --git a/reactos/w32api/include/ddk/miniport.h b/reactos/w32api/include/ddk/miniport.h new file mode 100644 index 00000000000..01bbd23a600 --- /dev/null +++ b/reactos/w32api/include/ddk/miniport.h @@ -0,0 +1,82 @@ +/* + * miniport.h + * + * Type definitions for miniport drivers + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __MINIPORT_H +#define __MINIPORT_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + + +#define EMULATOR_READ_ACCESS 0x01 +#define EMULATOR_WRITE_ACCESS 0x02 + +typedef enum _EMULATOR_PORT_ACCESS_TYPE { + Uchar, + Ushort, + Ulong +} EMULATOR_PORT_ACCESS_TYPE, *PEMULATOR_PORT_ACCESS_TYPE; + + +typedef struct _EMULATOR_ACCESS_ENTRY { + ULONG BasePort; + ULONG NumConsecutivePorts; + EMULATOR_PORT_ACCESS_TYPE AccessType; + UCHAR AccessMode; + UCHAR StringSupport; + PVOID Routine; +} EMULATOR_ACCESS_ENTRY, *PEMULATOR_ACCESS_ENTRY; + +#ifndef VIDEO_ACCESS_RANGE_DEFINED /* also in video.h */ +#define VIDEO_ACCESS_RANGE_DEFINED +typedef struct _VIDEO_ACCESS_RANGE { + PHYSICAL_ADDRESS RangeStart; + ULONG RangeLength; + UCHAR RangeInIoSpace; + UCHAR RangeVisible; + UCHAR RangeShareable; + UCHAR RangePassive; +} VIDEO_ACCESS_RANGE, *PVIDEO_ACCESS_RANGE; +#endif + +typedef VOID DDKAPI +(*PBANKED_SECTION_ROUTINE)( + IN ULONG ReadBank, + IN ULONG WriteBank, + IN PVOID Context); + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __MINIPORT_H */ diff --git a/reactos/w32api/include/ddk/minitape.h b/reactos/w32api/include/ddk/minitape.h new file mode 100644 index 00000000000..7540dea625c --- /dev/null +++ b/reactos/w32api/include/ddk/minitape.h @@ -0,0 +1,223 @@ +/* + * minitape.h + * + * Minitape driver interface + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __MINITAPE_H +#define __MINITAPE_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + +#define MEDIA_ERASEABLE 0x00000001 +#define MEDIA_WRITE_ONCE 0x00000002 +#define MEDIA_READ_ONLY 0x00000004 +#define MEDIA_READ_WRITE 0x00000008 +#define MEDIA_WRITE_PROTECTED 0x00000100 +#define MEDIA_CURRENTLY_MOUNTED 0x80000000 + +typedef enum _TAPE_STATUS { + TAPE_STATUS_SEND_SRB_AND_CALLBACK, + TAPE_STATUS_CALLBACK, + TAPE_STATUS_CHECK_TEST_UNIT_READY, + TAPE_STATUS_SUCCESS, + TAPE_STATUS_INSUFFICIENT_RESOURCES, + TAPE_STATUS_NOT_IMPLEMENTED, + TAPE_STATUS_INVALID_DEVICE_REQUEST, + TAPE_STATUS_INVALID_PARAMETER, + TAPE_STATUS_MEDIA_CHANGED, + TAPE_STATUS_BUS_RESET, + TAPE_STATUS_SETMARK_DETECTED, + TAPE_STATUS_FILEMARK_DETECTED, + TAPE_STATUS_BEGINNING_OF_MEDIA, + TAPE_STATUS_END_OF_MEDIA, + TAPE_STATUS_BUFFER_OVERFLOW, + TAPE_STATUS_NO_DATA_DETECTED, + TAPE_STATUS_EOM_OVERFLOW, + TAPE_STATUS_NO_MEDIA, + TAPE_STATUS_IO_DEVICE_ERROR, + TAPE_STATUS_UNRECOGNIZED_MEDIA, + TAPE_STATUS_DEVICE_NOT_READY, + TAPE_STATUS_MEDIA_WRITE_PROTECTED, + TAPE_STATUS_DEVICE_DATA_ERROR, + TAPE_STATUS_NO_SUCH_DEVICE, + TAPE_STATUS_INVALID_BLOCK_LENGTH, + TAPE_STATUS_IO_TIMEOUT, + TAPE_STATUS_DEVICE_NOT_CONNECTED, + TAPE_STATUS_DATA_OVERRUN, + TAPE_STATUS_DEVICE_BUSY, + TAPE_STATUS_REQUIRES_CLEANING, + TAPE_STATUS_CLEANER_CARTRIDGE_INSTALLED +} TAPE_STATUS, *PTAPE_STATUS; + +#define INQUIRYDATABUFFERSIZE 36 +#ifndef _INQUIRYDATA_DEFINED /* also in scsi.h */ +#define _INQUIRYDATA_DEFINED +typedef struct _INQUIRYDATA { + UCHAR DeviceType : 5; + UCHAR DeviceTypeQualifier : 3; + UCHAR DeviceTypeModifier : 7; + UCHAR RemovableMedia : 1; + union { + UCHAR Versions; + struct { + UCHAR ANSIVersion : 3; + UCHAR ECMAVersion : 3; + UCHAR ISOVersion : 2; + }; + }; + UCHAR ResponseDataFormat : 4; + UCHAR HiSupport : 1; + UCHAR NormACA : 1; + UCHAR TerminateTask : 1; + UCHAR AERC : 1; + UCHAR AdditionalLength; + UCHAR Reserved; + UCHAR Addr16 : 1; + UCHAR Addr32 : 1; + UCHAR AckReqQ: 1; + UCHAR MediumChanger : 1; + UCHAR MultiPort : 1; + UCHAR ReservedBit2 : 1; + UCHAR EnclosureServices : 1; + UCHAR ReservedBit3 : 1; + UCHAR SoftReset : 1; + UCHAR CommandQueue : 1; + UCHAR TransferDisable : 1; + UCHAR LinkedCommands : 1; + UCHAR Synchronous : 1; + UCHAR Wide16Bit : 1; + UCHAR Wide32Bit : 1; + UCHAR RelativeAddressing : 1; + UCHAR VendorId[8]; + UCHAR ProductId[16]; + UCHAR ProductRevisionLevel[4]; + UCHAR VendorSpecific[20]; + UCHAR Reserved3[40]; +} INQUIRYDATA, *PINQUIRYDATA; +#endif + +typedef struct _MODE_CAPABILITIES_PAGE { + UCHAR PageCode : 6; + UCHAR Reserved1 : 2; + UCHAR PageLength; + UCHAR Reserved2[2]; + UCHAR RO : 1; + UCHAR Reserved3 : 4; + UCHAR SPREV : 1; + UCHAR Reserved4 : 2; + UCHAR Reserved5 : 3; + UCHAR EFMT : 1; + UCHAR Reserved6 : 1; + UCHAR QFA : 1; + UCHAR Reserved7 : 2; + UCHAR LOCK : 1; + UCHAR LOCKED : 1; + UCHAR PREVENT : 1; + UCHAR UNLOAD : 1; + UCHAR Reserved8 : 2; + UCHAR ECC : 1; + UCHAR CMPRS : 1; + UCHAR Reserved9 : 1; + UCHAR BLK512 : 1; + UCHAR BLK1024 : 1; + UCHAR Reserved10 : 4; + UCHAR SLOWB : 1; + UCHAR MaximumSpeedSupported[2]; + UCHAR MaximumStoredDefectedListEntries[2]; + UCHAR ContinuousTransferLimit[2]; + UCHAR CurrentSpeedSelected[2]; + UCHAR BufferSize[2]; + UCHAR Reserved11[2]; +} MODE_CAPABILITIES_PAGE, *PMODE_CAPABILITIES_PAGE; + +typedef BOOLEAN DDKAPI +(*TAPE_VERIFY_INQUIRY_ROUTINE)( + IN PINQUIRYDATA InquiryData, + IN PMODE_CAPABILITIES_PAGE ModeCapabilitiesPage); + +typedef VOID DDKAPI +(*TAPE_EXTENSION_INIT_ROUTINE)( + IN PVOID MinitapeExtension, + IN PINQUIRYDATA InquiryData, + IN PMODE_CAPABILITIES_PAGE ModeCapabilitiesPage); + +typedef VOID DDKAPI +(*TAPE_ERROR_ROUTINE)( + IN PVOID MinitapeExtension, + IN PSCSI_REQUEST_BLOCK Srb, + IN OUT PTAPE_STATUS TapeStatus); + +typedef TAPE_STATUS DDKAPI +(*TAPE_PROCESS_COMMAND_ROUTINE)( + IN OUT PVOID MinitapeExtension, + IN OUT PVOID CommandExtension, + IN OUT PVOID CommandParameters, + IN OUT PSCSI_REQUEST_BLOCK Srb, + IN ULONG CallNumber, + IN TAPE_STATUS StatusOfLastCommand, + IN OUT PULONG RetryFlags); + +#define TAPE_RETRY_MASK 0x0000FFFF +#define IGNORE_ERRORS 0x00010000 +#define RETURN_ERRORS 0x00020000 + +typedef struct _TAPE_INIT_DATA { + TAPE_VERIFY_INQUIRY_ROUTINE VerifyInquiry; + BOOLEAN QueryModeCapabilitiesPage; + ULONG MinitapeExtensionSize; + TAPE_EXTENSION_INIT_ROUTINE ExtensionInit; + ULONG DefaultTimeOutValue; + TAPE_ERROR_ROUTINE TapeError; + ULONG CommandExtensionSize; + TAPE_PROCESS_COMMAND_ROUTINE CreatePartition; + TAPE_PROCESS_COMMAND_ROUTINE Erase; + TAPE_PROCESS_COMMAND_ROUTINE GetDriveParameters; + TAPE_PROCESS_COMMAND_ROUTINE GetMediaParameters; + TAPE_PROCESS_COMMAND_ROUTINE GetPosition; + TAPE_PROCESS_COMMAND_ROUTINE GetStatus; + TAPE_PROCESS_COMMAND_ROUTINE Prepare; + TAPE_PROCESS_COMMAND_ROUTINE SetDriveParameters; + TAPE_PROCESS_COMMAND_ROUTINE SetMediaParameters; + TAPE_PROCESS_COMMAND_ROUTINE SetPosition; + TAPE_PROCESS_COMMAND_ROUTINE WriteMarks; + TAPE_PROCESS_COMMAND_ROUTINE PreProcessReadWrite; /* optional */ +} TAPE_INIT_DATA, *PTAPE_INIT_DATA; + +typedef struct _TAPE_PHYS_POSITION { + ULONG SeekBlockAddress; + ULONG SpaceBlockCount; +} TAPE_PHYS_POSITION, PTAPE_PHYS_POSITION; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __MINITAPE_H */ diff --git a/reactos/w32api/include/ddk/mountdev.h b/reactos/w32api/include/ddk/mountdev.h new file mode 100644 index 00000000000..d22d9be7ef0 --- /dev/null +++ b/reactos/w32api/include/ddk/mountdev.h @@ -0,0 +1,84 @@ +/* + * mountdev.h + * + * Mount point manager/mounted devices interface. + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __MOUNTDEV_H +#define __MOUNTDEV_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" +#include "mountmgr.h" + + +#define IOCTL_MOUNTDEV_QUERY_DEVICE_NAME \ + CTL_CODE(MOUNTDEVCONTROLTYPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_MOUNTDEV_QUERY_UNIQUE_ID \ + CTL_CODE(MOUNTDEVCONTROLTYPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_MOUNTDEV_UNIQUE_ID_CHANGE_NOTIFY \ + CTL_CODE(MOUNTDEVCONTROLTYPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_MOUNTDEV_QUERY_SUGGESTED_LINK_NAME \ + CTL_CODE(MOUNTDEVCONTROLTYPE, 3, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_MOUNTDEV_LINK_CREATED \ + CTL_CODE(MOUNTDEVCONTROLTYPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_MOUNTDEV_LINK_DELETED \ + CTL_CODE(MOUNTDEVCONTROLTYPE, 5, METHOD_BUFFERED, FILE_ANY_ACCESS) + + +typedef struct _MOUNTDEV_SUGGESTED_LINK_NAME { + BOOLEAN UseOnlyIfThereAreNoOtherLinks; + USHORT NameLength; + WCHAR Name[1]; +} MOUNTDEV_SUGGESTED_LINK_NAME, *PMOUNTDEV_SUGGESTED_LINK_NAME; + +typedef struct _MOUNTDEV_UNIQUE_ID { + USHORT UniqueIdLength; + UCHAR UniqueId[1]; +} MOUNTDEV_UNIQUE_ID, *PMOUNTDEV_UNIQUE_ID; + +typedef struct _MOUNTDEV_UNIQUE_ID_CHANGE_NOTIFY_OUTPUT { + ULONG Size; + USHORT OldUniqueIdOffset; + USHORT OldUniqueIdLength; + USHORT NewUniqueIdOffset; + USHORT NewUniqueIdLength; +} MOUNTDEV_UNIQUE_ID_CHANGE_NOTIFY_OUTPUT; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __MOUNTDEV_H */ diff --git a/reactos/w32api/include/ddk/mountmgr.h b/reactos/w32api/include/ddk/mountmgr.h new file mode 100644 index 00000000000..ec5241c141a --- /dev/null +++ b/reactos/w32api/include/ddk/mountmgr.h @@ -0,0 +1,144 @@ +/* + * mountmgr.h + * + * Mount point manager interface. + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __MOUNTMGR_H +#define __MOUNTMGR_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + + +DEFINE_GUID(MOUNTDEV_MOUNTED_DEVICE_GUID, + 0x53f5630d, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); + +#define MOUNTMGRCONTROLTYPE ((ULONG)'m') +#define MOUNTDEVCONTROLTYPE ((ULONG)'M') + +#define MOUNTMGR_DEVICE_NAME L"\\Device\\MountPointManager" +#define MOUNTMGR_DOS_DEVICE_NAME L"\\\\.\\MountPointManager" + +#define IOCTL_MOUNTMGR_CREATE_POINT \ + CTL_CODE(MOUNTMGRCONTROLTYPE, 0, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_MOUNTMGR_QUERY_POINTS \ + CTL_CODE(MOUNTMGRCONTROLTYPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_MOUNTMGR_DELETE_POINTS \ + CTL_CODE(MOUNTMGRCONTROLTYPE, 1, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_MOUNTMGR_DELETE_POINTS_DBONLY \ + CTL_CODE(MOUNTMGRCONTROLTYPE, 3, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_MOUNTMGR_NEXT_DRIVE_LETTER \ + CTL_CODE(MOUNTMGRCONTROLTYPE, 4, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_MOUNTMGR_AUTO_DL_ASSIGNMENTS \ + CTL_CODE(MOUNTMGRCONTROLTYPE, 5, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_CREATED \ + CTL_CODE(MOUNTMGRCONTROLTYPE, 6, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_DELETED \ + CTL_CODE(MOUNTMGRCONTROLTYPE, 7, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_MOUNTMGR_CHANGE_NOTIFY \ + CTL_CODE(MOUNTMGRCONTROLTYPE, 8, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_MOUNTMGR_KEEP_LINKS_WHEN_OFFLINE \ + CTL_CODE(MOUNTMGRCONTROLTYPE, 9, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_MOUNTMGR_CHECK_UNPROCESSED_VOLUMES \ + CTL_CODE(MOUNTMGRCONTROLTYPE, 10, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_MOUNTMGR_VOLUME_ARRIVAL_NOTIFICATION \ + CTL_CODE(MOUNTMGRCONTROLTYPE, 11, METHOD_BUFFERED, FILE_READ_ACCESS) + + +typedef struct _MOUNTDEV_NAME { + USHORT NameLength; + WCHAR Name[1]; +} MOUNTDEV_NAME, *PMOUNTDEV_NAME; + +typedef struct _MOUNTMGR_CHANGE_NOTIFY_INFO { + ULONG EpicNumber; +} MOUNTMGR_CHANGE_NOTIFY_INFO, *PMOUNTMGR_CHANGE_NOTIFY_INFO; + +typedef struct _MOUNTMGR_CREATE_POINT_INPUT { + USHORT SymbolicLinkNameOffset; + USHORT SymbolicLinkNameLength; + USHORT DeviceNameOffset; + USHORT DeviceNameLength; +} MOUNTMGR_CREATE_POINT_INPUT, *PMOUNTMGR_CREATE_POINT_INPUT; + +typedef struct _MOUNTMGR_DRIVE_LETTER_INFORMATION { + BOOLEAN DriveLetterWasAssigned; + UCHAR CurrentDriveLetter; +} MOUNTMGR_DRIVE_LETTER_INFORMATION, *PMOUNTMGR_DRIVE_LETTER_INFORMATION; + +typedef struct _MOUNTMGR_DRIVE_LETTER_TARGET { + USHORT DeviceNameLength; + WCHAR DeviceName[1]; +} MOUNTMGR_DRIVE_LETTER_TARGET, *PMOUNTMGR_DRIVE_LETTER_TARGET; + +typedef struct _MOUNTMGR_MOUNT_POINT { + ULONG SymbolicLinkNameOffset; + USHORT SymbolicLinkNameLength; + ULONG UniqueIdOffset; + USHORT UniqueIdLength; + ULONG DeviceNameOffset; + USHORT DeviceNameLength; +} MOUNTMGR_MOUNT_POINT, *PMOUNTMGR_MOUNT_POINT; + +typedef struct _MOUNTMGR_MOUNT_POINTS { + ULONG Size; + ULONG NumberOfMountPoints; + MOUNTMGR_MOUNT_POINT MountPoints[1]; +} MOUNTMGR_MOUNT_POINTS, *PMOUNTMGR_MOUNT_POINTS; + +typedef struct _MOUNTMGR_TARGET_NAME { + USHORT DeviceNameLength; + WCHAR DeviceName[1]; +} MOUNTMGR_TARGET_NAME, *PMOUNTMGR_TARGET_NAME; + +typedef struct _MOUNTMGR_VOLUME_MOUNT_POINT { + USHORT SourceVolumeNameOffset; + USHORT SourceVolumeNameLength; + USHORT TargetVolumeNameOffset; + USHORT TargetVolumeNameLength; +} MOUNTMGR_VOLUME_MOUNT_POINT, *PMOUNTMGR_VOLUME_MOUNT_POINT; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __MOUNTMGR_H */ diff --git a/reactos/w32api/include/ddk/ndis.h b/reactos/w32api/include/ddk/ndis.h new file mode 100644 index 00000000000..216249df48e --- /dev/null +++ b/reactos/w32api/include/ddk/ndis.h @@ -0,0 +1,5189 @@ +/* + * ndis.h + * + * Network Device Interface Specification definitions + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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. + * + * DEFINES: i386 - Target platform is i386 + * _NDIS_ - Define only for NDIS library + * NDIS_MINIPORT_DRIVER - Define only for NDIS miniport drivers + * NDIS40 - Use NDIS 4.0 structures by default + * NDIS50 - Use NDIS 5.0 structures by default + * NDIS50_MINIPORT - Building NDIS 5.0 miniport driver + * NDIS51_MINIPORT - Building NDIS 5.1 miniport driver + */ +#ifndef __NDIS_H +#define __NDIS_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" +#include "ntddndis.h" +#include "netpnp.h" +#include "netevent.h" +#include <winsock2.h> + +#if defined(_NDIS_) + #define NDISAPI DECLSPEC_EXPORT +#else + #define NDISAPI DECLSPEC_IMPORT +#endif + +#if defined(NDIS50_MINIPORT) +#ifndef NDIS50 +#define NDIS50 +#endif +#endif /* NDIS50_MINIPORT */ + +#if defined(NDIS51_MINIPORT) +#ifndef NDIS51 +#define NDIS51 +#endif +#endif /* NDIS51_MINIPORT */ + +/* NDIS 3.0 is default */ +#if !defined(NDIS30) || !defined(NDIS40) || !defined(NDIS50) || !defined(NDIS51) +#define NDIS30 +#endif /* !NDIS30 || !NDIS40 || !NDIS50 || !NDIS51 */ + +#if 1 +/* FIXME: */ +typedef PVOID QUEUED_CLOSE; +#endif + +typedef ULONG NDIS_OID, *PNDIS_OID; + +typedef struct _X_FILTER FDDI_FILTER, *PFDDI_FILTER; +typedef struct _X_FILTER TR_FILTER, *PTR_FILTER; +typedef struct _X_FILTER NULL_FILTER, *PNULL_FILTER; + +typedef struct _REFERENCE { + KSPIN_LOCK SpinLock; + USHORT ReferenceCount; + BOOLEAN Closing; +} REFERENCE, * PREFERENCE; + + +/* NDIS base types */ + +typedef struct _NDIS_SPIN_LOCK { + KSPIN_LOCK SpinLock; + KIRQL OldIrql; +} NDIS_SPIN_LOCK, * PNDIS_SPIN_LOCK; + +typedef struct _NDIS_EVENT { + KEVENT Event; +} NDIS_EVENT, *PNDIS_EVENT; + +typedef PVOID NDIS_HANDLE, *PNDIS_HANDLE; +typedef int NDIS_STATUS, *PNDIS_STATUS; + +typedef ANSI_STRING NDIS_ANSI_STRING, *PNDIS_ANSI_STRING; +typedef UNICODE_STRING NDIS_STRING, *PNDIS_STRING; + +typedef MDL NDIS_BUFFER, *PNDIS_BUFFER; +typedef ULONG NDIS_ERROR_CODE, *PNDIS_ERROR_CODE; + + +/* NDIS_STATUS constants */ +#define NDIS_STATUS_SUCCESS ((NDIS_STATUS)STATUS_SUCCESS) +#define NDIS_STATUS_PENDING ((NDIS_STATUS)STATUS_PENDING) +#define NDIS_STATUS_NOT_RECOGNIZED ((NDIS_STATUS)0x00010001L) +#define NDIS_STATUS_NOT_COPIED ((NDIS_STATUS)0x00010002L) +#define NDIS_STATUS_NOT_ACCEPTED ((NDIS_STATUS)0x00010003L) +#define NDIS_STATUS_CALL_ACTIVE ((NDIS_STATUS)0x00010007L) +#define NDIS_STATUS_ONLINE ((NDIS_STATUS)0x40010003L) +#define NDIS_STATUS_RESET_START ((NDIS_STATUS)0x40010004L) +#define NDIS_STATUS_RESET_END ((NDIS_STATUS)0x40010005L) +#define NDIS_STATUS_RING_STATUS ((NDIS_STATUS)0x40010006L) +#define NDIS_STATUS_CLOSED ((NDIS_STATUS)0x40010007L) +#define NDIS_STATUS_WAN_LINE_UP ((NDIS_STATUS)0x40010008L) +#define NDIS_STATUS_WAN_LINE_DOWN ((NDIS_STATUS)0x40010009L) +#define NDIS_STATUS_WAN_FRAGMENT ((NDIS_STATUS)0x4001000AL) +#define NDIS_STATUS_MEDIA_CONNECT ((NDIS_STATUS)0x4001000BL) +#define NDIS_STATUS_MEDIA_DISCONNECT ((NDIS_STATUS)0x4001000CL) +#define NDIS_STATUS_HARDWARE_LINE_UP ((NDIS_STATUS)0x4001000DL) +#define NDIS_STATUS_HARDWARE_LINE_DOWN ((NDIS_STATUS)0x4001000EL) +#define NDIS_STATUS_INTERFACE_UP ((NDIS_STATUS)0x4001000FL) +#define NDIS_STATUS_INTERFACE_DOWN ((NDIS_STATUS)0x40010010L) +#define NDIS_STATUS_MEDIA_BUSY ((NDIS_STATUS)0x40010011L) +#define NDIS_STATUS_MEDIA_SPECIFIC_INDICATION ((NDIS_STATUS)0x40010012L) +#define NDIS_STATUS_WW_INDICATION NDIS_STATUS_MEDIA_SPECIFIC_INDICATION +#define NDIS_STATUS_LINK_SPEED_CHANGE ((NDIS_STATUS)0x40010013L) +#define NDIS_STATUS_WAN_GET_STATS ((NDIS_STATUS)0x40010014L) +#define NDIS_STATUS_WAN_CO_FRAGMENT ((NDIS_STATUS)0x40010015L) +#define NDIS_STATUS_WAN_CO_LINKPARAMS ((NDIS_STATUS)0x40010016L) + +#define NDIS_STATUS_NOT_RESETTABLE ((NDIS_STATUS)0x80010001L) +#define NDIS_STATUS_SOFT_ERRORS ((NDIS_STATUS)0x80010003L) +#define NDIS_STATUS_HARD_ERRORS ((NDIS_STATUS)0x80010004L) +#define NDIS_STATUS_BUFFER_OVERFLOW ((NDIS_STATUS)STATUS_BUFFER_OVERFLOW) + +#define NDIS_STATUS_FAILURE ((NDIS_STATUS)STATUS_UNSUCCESSFUL) +#define NDIS_STATUS_RESOURCES ((NDIS_STATUS)STATUS_INSUFFICIENT_RESOURCES) +#define NDIS_STATUS_CLOSING ((NDIS_STATUS)0xC0010002L) +#define NDIS_STATUS_BAD_VERSION ((NDIS_STATUS)0xC0010004L) +#define NDIS_STATUS_BAD_CHARACTERISTICS ((NDIS_STATUS)0xC0010005L) +#define NDIS_STATUS_ADAPTER_NOT_FOUND ((NDIS_STATUS)0xC0010006L) +#define NDIS_STATUS_OPEN_FAILED ((NDIS_STATUS)0xC0010007L) +#define NDIS_STATUS_DEVICE_FAILED ((NDIS_STATUS)0xC0010008L) +#define NDIS_STATUS_MULTICAST_FULL ((NDIS_STATUS)0xC0010009L) +#define NDIS_STATUS_MULTICAST_EXISTS ((NDIS_STATUS)0xC001000AL) +#define NDIS_STATUS_MULTICAST_NOT_FOUND ((NDIS_STATUS)0xC001000BL) +#define NDIS_STATUS_REQUEST_ABORTED ((NDIS_STATUS)0xC001000CL) +#define NDIS_STATUS_RESET_IN_PROGRESS ((NDIS_STATUS)0xC001000DL) +#define NDIS_STATUS_CLOSING_INDICATING ((NDIS_STATUS)0xC001000EL) +#define NDIS_STATUS_NOT_SUPPORTED ((NDIS_STATUS)STATUS_NOT_SUPPORTED) +#define NDIS_STATUS_INVALID_PACKET ((NDIS_STATUS)0xC001000FL) +#define NDIS_STATUS_OPEN_LIST_FULL ((NDIS_STATUS)0xC0010010L) +#define NDIS_STATUS_ADAPTER_NOT_READY ((NDIS_STATUS)0xC0010011L) +#define NDIS_STATUS_ADAPTER_NOT_OPEN ((NDIS_STATUS)0xC0010012L) +#define NDIS_STATUS_NOT_INDICATING ((NDIS_STATUS)0xC0010013L) +#define NDIS_STATUS_INVALID_LENGTH ((NDIS_STATUS)0xC0010014L) +#define NDIS_STATUS_INVALID_DATA ((NDIS_STATUS)0xC0010015L) +#define NDIS_STATUS_BUFFER_TOO_SHORT ((NDIS_STATUS)0xC0010016L) +#define NDIS_STATUS_INVALID_OID ((NDIS_STATUS)0xC0010017L) +#define NDIS_STATUS_ADAPTER_REMOVED ((NDIS_STATUS)0xC0010018L) +#define NDIS_STATUS_UNSUPPORTED_MEDIA ((NDIS_STATUS)0xC0010019L) +#define NDIS_STATUS_GROUP_ADDRESS_IN_USE ((NDIS_STATUS)0xC001001AL) +#define NDIS_STATUS_FILE_NOT_FOUND ((NDIS_STATUS)0xC001001BL) +#define NDIS_STATUS_ERROR_READING_FILE ((NDIS_STATUS)0xC001001CL) +#define NDIS_STATUS_ALREADY_MAPPED ((NDIS_STATUS)0xC001001DL) +#define NDIS_STATUS_RESOURCE_CONFLICT ((NDIS_STATUS)0xC001001EL) +#define NDIS_STATUS_NO_CABLE ((NDIS_STATUS)0xC001001FL) + +#define NDIS_STATUS_INVALID_SAP ((NDIS_STATUS)0xC0010020L) +#define NDIS_STATUS_SAP_IN_USE ((NDIS_STATUS)0xC0010021L) +#define NDIS_STATUS_INVALID_ADDRESS ((NDIS_STATUS)0xC0010022L) +#define NDIS_STATUS_VC_NOT_ACTIVATED ((NDIS_STATUS)0xC0010023L) +#define NDIS_STATUS_DEST_OUT_OF_ORDER ((NDIS_STATUS)0xC0010024L) +#define NDIS_STATUS_VC_NOT_AVAILABLE ((NDIS_STATUS)0xC0010025L) +#define NDIS_STATUS_CELLRATE_NOT_AVAILABLE ((NDIS_STATUS)0xC0010026L) +#define NDIS_STATUS_INCOMPATABLE_QOS ((NDIS_STATUS)0xC0010027L) +#define NDIS_STATUS_AAL_PARAMS_UNSUPPORTED ((NDIS_STATUS)0xC0010028L) +#define NDIS_STATUS_NO_ROUTE_TO_DESTINATION ((NDIS_STATUS)0xC0010029L) + +#define NDIS_STATUS_TOKEN_RING_OPEN_ERROR ((NDIS_STATUS)0xC0011000L) +#define NDIS_STATUS_INVALID_DEVICE_REQUEST ((NDIS_STATUS)STATUS_INVALID_DEVICE_REQUEST) +#define NDIS_STATUS_NETWORK_UNREACHABLE ((NDIS_STATUS)STATUS_NETWORK_UNREACHABLE) + + +/* NDIS error codes for error logging */ + +#define NDIS_ERROR_CODE_RESOURCE_CONFLICT EVENT_NDIS_RESOURCE_CONFLICT +#define NDIS_ERROR_CODE_OUT_OF_RESOURCES EVENT_NDIS_OUT_OF_RESOURCE +#define NDIS_ERROR_CODE_HARDWARE_FAILURE EVENT_NDIS_HARDWARE_FAILURE +#define NDIS_ERROR_CODE_ADAPTER_NOT_FOUND EVENT_NDIS_ADAPTER_NOT_FOUND +#define NDIS_ERROR_CODE_INTERRUPT_CONNECT EVENT_NDIS_INTERRUPT_CONNECT +#define NDIS_ERROR_CODE_DRIVER_FAILURE EVENT_NDIS_DRIVER_FAILURE +#define NDIS_ERROR_CODE_BAD_VERSION EVENT_NDIS_BAD_VERSION +#define NDIS_ERROR_CODE_TIMEOUT EVENT_NDIS_TIMEOUT +#define NDIS_ERROR_CODE_NETWORK_ADDRESS EVENT_NDIS_NETWORK_ADDRESS +#define NDIS_ERROR_CODE_UNSUPPORTED_CONFIGURATION EVENT_NDIS_UNSUPPORTED_CONFIGURATION +#define NDIS_ERROR_CODE_INVALID_VALUE_FROM_ADAPTER EVENT_NDIS_INVALID_VALUE_FROM_ADAPTER +#define NDIS_ERROR_CODE_MISSING_CONFIGURATION_PARAMETER EVENT_NDIS_MISSING_CONFIGURATION_PARAMETER +#define NDIS_ERROR_CODE_BAD_IO_BASE_ADDRESS EVENT_NDIS_BAD_IO_BASE_ADDRESS +#define NDIS_ERROR_CODE_RECEIVE_SPACE_SMALL EVENT_NDIS_RECEIVE_SPACE_SMALL +#define NDIS_ERROR_CODE_ADAPTER_DISABLED EVENT_NDIS_ADAPTER_DISABLED + + +/* Memory allocation flags. Used by Ndis[Allocate|Free]Memory */ +#define NDIS_MEMORY_CONTIGUOUS 0x00000001 +#define NDIS_MEMORY_NONCACHED 0x00000002 + +/* NIC attribute flags. Used by NdisMSetAttributes(Ex) */ +#define NDIS_ATTRIBUTE_IGNORE_PACKET_TIMEOUT 0x00000001 +#define NDIS_ATTRIBUTE_IGNORE_REQUEST_TIMEOUT 0x00000002 +#define NDIS_ATTRIBUTE_IGNORE_TOKEN_RING_ERRORS 0x00000004 +#define NDIS_ATTRIBUTE_BUS_MASTER 0x00000008 +#define NDIS_ATTRIBUTE_INTERMEDIATE_DRIVER 0x00000010 +#define NDIS_ATTRIBUTE_DESERIALIZE 0x00000020 +#define NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND 0x00000040 +#define NDIS_ATTRIBUTE_SURPRISE_REMOVE_OK 0x00000080 +#define NDIS_ATTRIBUTE_NOT_CO_NDIS 0x00000100 +#define NDIS_ATTRIBUTE_USES_SAFE_BUFFER_APIS 0x00000200 + + +/* Lock */ + +typedef union _NDIS_RW_LOCK_REFCOUNT { + UINT RefCount; + UCHAR cacheLine[16]; +} NDIS_RW_LOCK_REFCOUNT; + +typedef struct _NDIS_RW_LOCK { + union { + struct { + KSPIN_LOCK SpinLock; + PVOID Context; + } s; + UCHAR Reserved[16]; + } u; + + NDIS_RW_LOCK_REFCOUNT RefCount[MAXIMUM_PROCESSORS]; +} NDIS_RW_LOCK, *PNDIS_RW_LOCK; + +typedef struct _LOCK_STATE { + USHORT LockState; + KIRQL OldIrql; +} LOCK_STATE, *PLOCK_STATE; + + + +/* Timer */ + +typedef VOID DDKAPI +(*PNDIS_TIMER_FUNCTION)( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + +typedef struct _NDIS_TIMER { + KTIMER Timer; + KDPC Dpc; +} NDIS_TIMER, *PNDIS_TIMER; + + + +/* Hardware */ + +typedef CM_MCA_POS_DATA NDIS_MCA_POS_DATA, *PNDIS_MCA_POS_DATA; +typedef CM_EISA_SLOT_INFORMATION NDIS_EISA_SLOT_INFORMATION, *PNDIS_EISA_SLOT_INFORMATION; +typedef CM_EISA_FUNCTION_INFORMATION NDIS_EISA_FUNCTION_INFORMATION, *PNDIS_EISA_FUNCTION_INFORMATION; +typedef CM_PARTIAL_RESOURCE_LIST NDIS_RESOURCE_LIST, *PNDIS_RESOURCE_LIST; + +/* Hardware status codes (OID_GEN_HARDWARE_STATUS) */ +typedef enum _NDIS_HARDWARE_STATUS { + NdisHardwareStatusReady, + NdisHardwareStatusInitializing, + NdisHardwareStatusReset, + NdisHardwareStatusClosing, + NdisHardwareStatusNotReady +} NDIS_HARDWARE_STATUS, *PNDIS_HARDWARE_STATUS; + +/* OID_GEN_GET_TIME_CAPS */ +typedef struct _GEN_GET_TIME_CAPS { + ULONG Flags; + ULONG ClockPrecision; +} GEN_GET_TIME_CAPS, *PGEN_GET_TIME_CAPS; + +/* Flag bits */ +#define READABLE_LOCAL_CLOCK 0x00000001 +#define CLOCK_NETWORK_DERIVED 0x00000002 +#define CLOCK_PRECISION 0x00000004 +#define RECEIVE_TIME_INDICATION_CAPABLE 0x00000008 +#define TIMED_SEND_CAPABLE 0x00000010 +#define TIME_STAMP_CAPABLE 0x00000020 + +/* OID_GEN_GET_NETCARD_TIME */ +typedef struct _GEN_GET_NETCARD_TIME { + ULONGLONG ReadTime; +} GEN_GET_NETCARD_TIME, *PGEN_GET_NETCARD_TIME; + +/* NDIS driver medium (OID_GEN_MEDIA_SUPPORTED / OID_GEN_MEDIA_IN_USE) */ +typedef enum _NDIS_MEDIUM { + NdisMedium802_3, + NdisMedium802_5, + NdisMediumFddi, + NdisMediumWan, + NdisMediumLocalTalk, + NdisMediumDix, + NdisMediumArcnetRaw, + NdisMediumArcnet878_2, + NdisMediumAtm, + NdisMediumWirelessWan, + NdisMediumIrda, + NdisMediumBpc, + NdisMediumCoWan, + NdisMedium1394, + NdisMediumMax +} NDIS_MEDIUM, *PNDIS_MEDIUM; + +/* NDIS packet filter bits (OID_GEN_CURRENT_PACKET_FILTER) */ +#define NDIS_PACKET_TYPE_DIRECTED 0x00000001 +#define NDIS_PACKET_TYPE_MULTICAST 0x00000002 +#define NDIS_PACKET_TYPE_ALL_MULTICAST 0x00000004 +#define NDIS_PACKET_TYPE_BROADCAST 0x00000008 +#define NDIS_PACKET_TYPE_SOURCE_ROUTING 0x00000010 +#define NDIS_PACKET_TYPE_PROMISCUOUS 0x00000020 +#define NDIS_PACKET_TYPE_SMT 0x00000040 +#define NDIS_PACKET_TYPE_ALL_LOCAL 0x00000080 +#define NDIS_PACKET_TYPE_GROUP 0x00001000 +#define NDIS_PACKET_TYPE_ALL_FUNCTIONAL 0x00002000 +#define NDIS_PACKET_TYPE_FUNCTIONAL 0x00004000 +#define NDIS_PACKET_TYPE_MAC_FRAME 0x00008000 + +/* NDIS protocol option bits (OID_GEN_PROTOCOL_OPTIONS) */ +#define NDIS_PROT_OPTION_ESTIMATED_LENGTH 0x00000001 +#define NDIS_PROT_OPTION_NO_LOOPBACK 0x00000002 +#define NDIS_PROT_OPTION_NO_RSVD_ON_RCVPKT 0x00000004 + +/* NDIS MAC option bits (OID_GEN_MAC_OPTIONS) */ +#define NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA 0x00000001 +#define NDIS_MAC_OPTION_RECEIVE_SERIALIZED 0x00000002 +#define NDIS_MAC_OPTION_TRANSFERS_NOT_PEND 0x00000004 +#define NDIS_MAC_OPTION_NO_LOOPBACK 0x00000008 +#define NDIS_MAC_OPTION_FULL_DUPLEX 0x00000010 +#define NDIS_MAC_OPTION_EOTX_INDICATION 0x00000020 +#define NDIS_MAC_OPTION_8021P_PRIORITY 0x00000040 +#define NDIS_MAC_OPTION_RESERVED 0x80000000 + +/* State of the LAN media (OID_GEN_MEDIA_CONNECT_STATUS) */ +typedef enum _NDIS_MEDIA_STATE { + NdisMediaStateConnected, + NdisMediaStateDisconnected +} NDIS_MEDIA_STATE, *PNDIS_MEDIA_STATE; + +/* OID_GEN_SUPPORTED_GUIDS */ +typedef struct _NDIS_GUID { + GUID Guid; + union { + NDIS_OID Oid; + NDIS_STATUS Status; + } u; + ULONG Size; + ULONG Flags; +} NDIS_GUID, *PNDIS_GUID; + +#define NDIS_GUID_TO_OID 0x00000001 +#define NDIS_GUID_TO_STATUS 0x00000002 +#define NDIS_GUID_ANSI_STRING 0x00000004 +#define NDIS_GUID_UNICODE_STRING 0x00000008 +#define NDIS_GUID_ARRAY 0x00000010 + + +typedef struct _NDIS_PACKET_POOL { + NDIS_SPIN_LOCK SpinLock; + struct _NDIS_PACKET *FreeList; + UINT PacketLength; + UCHAR Buffer[1]; +} NDIS_PACKET_POOL, * PNDIS_PACKET_POOL; + +/* NDIS_PACKET_PRIVATE.Flags constants */ +#define fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO 0x40 +#define fPACKET_ALLOCATED_BY_NDIS 0x80 + +typedef struct _NDIS_PACKET_PRIVATE { + UINT PhysicalCount; + UINT TotalLength; + PNDIS_BUFFER Head; + PNDIS_BUFFER Tail; + PNDIS_PACKET_POOL Pool; + UINT Count; + ULONG Flags; + BOOLEAN ValidCounts; + UCHAR NdisPacketFlags; + USHORT NdisPacketOobOffset; +} NDIS_PACKET_PRIVATE, * PNDIS_PACKET_PRIVATE; + +typedef struct _NDIS_PACKET { + NDIS_PACKET_PRIVATE Private; + union { + struct { + UCHAR MiniportReserved[2 * sizeof(PVOID)]; + UCHAR WrapperReserved[2 * sizeof(PVOID)]; + } s1; + struct { + UCHAR MiniportReservedEx[3 * sizeof(PVOID)]; + UCHAR WrapperReservedEx[sizeof(PVOID)]; + } s2; + struct { + UCHAR MacReserved[4 * sizeof(PVOID)]; + } s3; + } u; + ULONG_PTR Reserved[2]; + UCHAR ProtocolReserved[1]; +} NDIS_PACKET, *PNDIS_PACKET, **PPNDIS_PACKET; + +typedef enum _NDIS_CLASS_ID { + NdisClass802_3Priority, + NdisClassWirelessWanMbxMailbox, + NdisClassIrdaPacketInfo, + NdisClassAtmAALInfo +} NDIS_CLASS_ID; + +typedef struct MediaSpecificInformation { + UINT NextEntryOffset; + NDIS_CLASS_ID ClassId; + UINT Size; + UCHAR ClassInformation[1]; +} MEDIA_SPECIFIC_INFORMATION; + +typedef struct _NDIS_PACKET_OOB_DATA { + _ANONYMOUS_UNION union { + ULONGLONG TimeToSend; + ULONGLONG TimeSent; + } DUMMYUNIONNAME; + ULONGLONG TimeReceived; + UINT HeaderSize; + UINT SizeMediaSpecificInfo; + PVOID MediaSpecificInformation; + NDIS_STATUS Status; +} NDIS_PACKET_OOB_DATA, *PNDIS_PACKET_OOB_DATA; + +typedef struct _NDIS_PM_PACKET_PATTERN { + ULONG Priority; + ULONG Reserved; + ULONG MaskSize; + ULONG PatternOffset; + ULONG PatternSize; + ULONG PatternFlags; +} NDIS_PM_PACKET_PATTERN, *PNDIS_PM_PACKET_PATTERN; + + +/* Request types used by NdisRequest */ +typedef enum _NDIS_REQUEST_TYPE { + NdisRequestQueryInformation, + NdisRequestSetInformation, + NdisRequestQueryStatistics, + NdisRequestOpen, + NdisRequestClose, + NdisRequestSend, + NdisRequestTransferData, + NdisRequestReset, + NdisRequestGeneric1, + NdisRequestGeneric2, + NdisRequestGeneric3, + NdisRequestGeneric4 +} NDIS_REQUEST_TYPE, *PNDIS_REQUEST_TYPE; + +typedef struct _NDIS_REQUEST { + UCHAR MacReserved[4 * sizeof(PVOID)]; + NDIS_REQUEST_TYPE RequestType; + union _DATA { + struct QUERY_INFORMATION { + NDIS_OID Oid; + PVOID InformationBuffer; + UINT InformationBufferLength; + UINT BytesWritten; + UINT BytesNeeded; + } QUERY_INFORMATION; + struct SET_INFORMATION { + NDIS_OID Oid; + PVOID InformationBuffer; + UINT InformationBufferLength; + UINT BytesRead; + UINT BytesNeeded; + } SET_INFORMATION; + } DATA; +#if (defined(NDIS50) || defined(NDIS51)) + UCHAR NdisReserved[9 * sizeof(PVOID)]; + union { + UCHAR CallMgrReserved[2 * sizeof(PVOID)]; + UCHAR ProtocolReserved[2 * sizeof(PVOID)]; + }; + UCHAR MiniportReserved[2 * sizeof(PVOID)]; +#endif +} NDIS_REQUEST, *PNDIS_REQUEST; + + + +/* Wide Area Networks definitions */ + +typedef struct _NDIS_WAN_PACKET { + LIST_ENTRY WanPacketQueue; + PUCHAR CurrentBuffer; + ULONG CurrentLength; + PUCHAR StartBuffer; + PUCHAR EndBuffer; + PVOID ProtocolReserved1; + PVOID ProtocolReserved2; + PVOID ProtocolReserved3; + PVOID ProtocolReserved4; + PVOID MacReserved1; + PVOID MacReserved2; + PVOID MacReserved3; + PVOID MacReserved4; +} NDIS_WAN_PACKET, *PNDIS_WAN_PACKET; + + + +/* DMA channel information */ + +typedef struct _NDIS_DMA_DESCRIPTION { + BOOLEAN DemandMode; + BOOLEAN AutoInitialize; + BOOLEAN DmaChannelSpecified; + DMA_WIDTH DmaWidth; + DMA_SPEED DmaSpeed; + ULONG DmaPort; + ULONG DmaChannel; +} NDIS_DMA_DESCRIPTION, *PNDIS_DMA_DESCRIPTION; + +typedef struct _NDIS_DMA_BLOCK { + PVOID MapRegisterBase; + KEVENT AllocationEvent; + PADAPTER_OBJECT SystemAdapterObject; + BOOLEAN InProgress; +} NDIS_DMA_BLOCK, *PNDIS_DMA_BLOCK; + + +/* Possible hardware architecture */ +typedef enum _NDIS_INTERFACE_TYPE { + NdisInterfaceInternal = Internal, + NdisInterfaceIsa = Isa, + NdisInterfaceEisa = Eisa, + NdisInterfaceMca = MicroChannel, + NdisInterfaceTurboChannel = TurboChannel, + NdisInterfacePci = PCIBus, + NdisInterfacePcMcia = PCMCIABus, + NdisInterfaceCBus = CBus, + NdisInterfaceMPIBus = MPIBus, + NdisInterfaceMPSABus = MPSABus, + NdisInterfaceProcessorInternal = ProcessorInternal, + NdisInterfaceInternalPowerBus = InternalPowerBus, + NdisInterfacePNPISABus = PNPISABus, + NdisInterfacePNPBus = PNPBus, + NdisMaximumInterfaceType +} NDIS_INTERFACE_TYPE, *PNDIS_INTERFACE_TYPE; + +#define NdisInterruptLevelSensitive LevelSensitive +#define NdisInterruptLatched Latched +typedef KINTERRUPT_MODE NDIS_INTERRUPT_MODE, *PNDIS_INTERRUPT_MODE; + + +typedef enum _NDIS_PARAMETER_TYPE { + NdisParameterInteger, + NdisParameterHexInteger, + NdisParameterString, + NdisParameterMultiString, + NdisParameterBinary +} NDIS_PARAMETER_TYPE, *PNDIS_PARAMETER_TYPE; + +typedef struct { + USHORT Length; + PVOID Buffer; +} BINARY_DATA; + +typedef struct _NDIS_CONFIGURATION_PARAMETER { + NDIS_PARAMETER_TYPE ParameterType; + union { + ULONG IntegerData; + NDIS_STRING StringData; + BINARY_DATA BinaryData; + } ParameterData; +} NDIS_CONFIGURATION_PARAMETER, *PNDIS_CONFIGURATION_PARAMETER; + + +typedef PHYSICAL_ADDRESS NDIS_PHYSICAL_ADDRESS, *PNDIS_PHYSICAL_ADDRESS; + +typedef struct _NDIS_PHYSICAL_ADDRESS_UNIT { + NDIS_PHYSICAL_ADDRESS PhysicalAddress; + UINT Length; +} NDIS_PHYSICAL_ADDRESS_UNIT, *PNDIS_PHYSICAL_ADDRESS_UNIT; + +typedef struct _NDIS_WAN_LINE_DOWN { + UCHAR RemoteAddress[6]; + UCHAR LocalAddress[6]; +} NDIS_WAN_LINE_DOWN, *PNDIS_WAN_LINE_DOWN; + +typedef struct _NDIS_WAN_LINE_UP { + ULONG LinkSpeed; + ULONG MaximumTotalSize; + NDIS_WAN_QUALITY Quality; + USHORT SendWindow; + UCHAR RemoteAddress[6]; + OUT UCHAR LocalAddress[6]; + ULONG ProtocolBufferLength; + PUCHAR ProtocolBuffer; + USHORT ProtocolType; + NDIS_STRING DeviceName; +} NDIS_WAN_LINE_UP, *PNDIS_WAN_LINE_UP; + + +typedef VOID DDKAPI +(*ADAPTER_SHUTDOWN_HANDLER)( + IN PVOID ShutdownContext); + + +typedef struct _OID_LIST OID_LIST, *POID_LIST; + +/* PnP state */ + +typedef enum _NDIS_PNP_DEVICE_STATE { + NdisPnPDeviceAdded, + NdisPnPDeviceStarted, + NdisPnPDeviceQueryStopped, + NdisPnPDeviceStopped, + NdisPnPDeviceQueryRemoved, + NdisPnPDeviceRemoved, + NdisPnPDeviceSurpriseRemoved +} NDIS_PNP_DEVICE_STATE; + +#define NDIS_DEVICE_NOT_STOPPABLE 0x00000001 +#define NDIS_DEVICE_NOT_REMOVEABLE 0x00000002 +#define NDIS_DEVICE_NOT_SUSPENDABLE 0x00000004 +#define NDIS_DEVICE_DISABLE_PM 0x00000008 +#define NDIS_DEVICE_DISABLE_WAKE_UP 0x00000010 +#define NDIS_DEVICE_DISABLE_WAKE_ON_RECONNECT 0x00000020 +#define NDIS_DEVICE_RESERVED 0x00000040 +#define NDIS_DEVICE_DISABLE_WAKE_ON_MAGIC_PACKET 0x00000080 +#define NDIS_DEVICE_DISABLE_WAKE_ON_PATTERN_MATCH 0x00000100 + + +/* OID_GEN_NETWORK_LAYER_ADDRESSES */ +typedef struct _NETWORK_ADDRESS { + USHORT AddressLength; + USHORT AddressType; + UCHAR Address[1]; +} NETWORK_ADDRESS, *PNETWORK_ADDRESS; + +typedef struct _NETWORK_ADDRESS_LIST { + LONG AddressCount; + USHORT AddressType; + NETWORK_ADDRESS Address[1]; +} NETWORK_ADDRESS_LIST, *PNETWORK_ADDRESS_LIST; + +/* Protocol types supported by NDIS */ +#define NDIS_PROTOCOL_ID_DEFAULT 0x00 +#define NDIS_PROTOCOL_ID_TCP_IP 0x02 +#define NDIS_PROTOCOL_ID_IPX 0x06 +#define NDIS_PROTOCOL_ID_NBF 0x07 +#define NDIS_PROTOCOL_ID_MAX 0x0F +#define NDIS_PROTOCOL_ID_MASK 0x0F + + +/* OID_GEN_TRANSPORT_HEADER_OFFSET */ +typedef struct _TRANSPORT_HEADER_OFFSET { + USHORT ProtocolType; + USHORT HeaderOffset; +} TRANSPORT_HEADER_OFFSET, *PTRANSPORT_HEADER_OFFSET; + + +/* OID_GEN_CO_LINK_SPEED / OID_GEN_CO_MINIMUM_LINK_SPEED */ +typedef struct _NDIS_CO_LINK_SPEED { + ULONG Outbound; + ULONG Inbound; +} NDIS_CO_LINK_SPEED, *PNDIS_CO_LINK_SPEED; + +typedef ULONG NDIS_AF, *PNDIS_AF; +#define CO_ADDRESS_FAMILY_Q2931 ((NDIS_AF)0x1) +#define CO_ADDRESS_FAMILY_PSCHED ((NDIS_AF)0x2) +#define CO_ADDRESS_FAMILY_L2TP ((NDIS_AF)0x3) +#define CO_ADDRESS_FAMILY_IRDA ((NDIS_AF)0x4) +#define CO_ADDRESS_FAMILY_1394 ((NDIS_AF)0x5) +#define CO_ADDRESS_FAMILY_PPP ((NDIS_AF)0x6) +#define CO_ADDRESS_FAMILY_TAPI ((NDIS_AF)0x800) +#define CO_ADDRESS_FAMILY_TAPI_PROXY ((NDIS_AF)0x801) + +#define CO_ADDRESS_FAMILY_PROXY 0x80000000 + +typedef struct { + NDIS_AF AddressFamily; + ULONG MajorVersion; + ULONG MinorVersion; +} CO_ADDRESS_FAMILY, *PCO_ADDRESS_FAMILY; + +typedef struct _CO_FLOW_PARAMETERS { + ULONG TokenRate; + ULONG TokenBucketSize; + ULONG PeakBandwidth; + ULONG Latency; + ULONG DelayVariation; + GUARANTEE LevelOfGuarantee; + ULONG CostOfCall; + ULONG NetworkAvailability; + ULONG MaxSduSize; +} CO_FLOW_PARAMETERS, *PCO_FLOW_PARAMETERS; + +typedef struct _CO_SPECIFIC_PARAMETERS { + ULONG ParamType; + ULONG Length; + UCHAR Parameters[1]; +} CO_SPECIFIC_PARAMETERS, *PCO_SPECIFIC_PARAMETERS; + +typedef struct _CO_CALL_MANAGER_PARAMETERS { + CO_FLOW_PARAMETERS Transmit; + CO_FLOW_PARAMETERS Receive; + CO_SPECIFIC_PARAMETERS CallMgrSpecific; +} CO_CALL_MANAGER_PARAMETERS, *PCO_CALL_MANAGER_PARAMETERS; + +/* CO_MEDIA_PARAMETERS.Flags constants */ +#define RECEIVE_TIME_INDICATION 0x00000001 +#define USE_TIME_STAMPS 0x00000002 +#define TRANSMIT_VC 0x00000004 +#define RECEIVE_VC 0x00000008 +#define INDICATE_ERRED_PACKETS 0x00000010 +#define INDICATE_END_OF_TX 0x00000020 +#define RESERVE_RESOURCES_VC 0x00000040 +#define ROUND_DOWN_FLOW 0x00000080 +#define ROUND_UP_FLOW 0x00000100 + +typedef struct _CO_MEDIA_PARAMETERS { + ULONG Flags; + ULONG ReceivePriority; + ULONG ReceiveSizeHint; + CO_SPECIFIC_PARAMETERS MediaSpecific; +} CO_MEDIA_PARAMETERS, *PCO_MEDIA_PARAMETERS; + +/* CO_CALL_PARAMETERS.Flags constants */ +#define PERMANENT_VC 0x00000001 +#define CALL_PARAMETERS_CHANGED 0x00000002 +#define QUERY_CALL_PARAMETERS 0x00000004 +#define BROADCAST_VC 0x00000008 +#define MULTIPOINT_VC 0x00000010 + +typedef struct _CO_CALL_PARAMETERS { + ULONG Flags; + PCO_CALL_MANAGER_PARAMETERS CallMgrParameters; + PCO_MEDIA_PARAMETERS MediaParameters; +} CO_CALL_PARAMETERS, *PCO_CALL_PARAMETERS; + +typedef struct _CO_SAP { + ULONG SapType; + ULONG SapLength; + UCHAR Sap[1]; +} CO_SAP, *PCO_SAP; + +typedef struct _NDIS_IPSEC_PACKET_INFO { + _ANONYMOUS_UNION union { + struct { + NDIS_HANDLE OffloadHandle; + NDIS_HANDLE NextOffloadHandle; + } Transmit; + struct { + ULONG SA_DELETE_REQ : 1; + ULONG CRYPTO_DONE : 1; + ULONG NEXT_CRYPTO_DONE : 1; + ULONG CryptoStatus; + } Receive; + } DUMMYUNIONNAME; +} NDIS_IPSEC_PACKET_INFO, *PNDIS_IPSEC_PACKET_INFO; + +/* NDIS_MAC_FRAGMENT.Errors constants */ +#define WAN_ERROR_CRC 0x00000001 +#define WAN_ERROR_FRAMING 0x00000002 +#define WAN_ERROR_HARDWAREOVERRUN 0x00000004 +#define WAN_ERROR_BUFFEROVERRUN 0x00000008 +#define WAN_ERROR_TIMEOUT 0x00000010 +#define WAN_ERROR_ALIGNMENT 0x00000020 + +typedef struct _NDIS_MAC_FRAGMENT { + NDIS_HANDLE NdisLinkContext; + ULONG Errors; +} NDIS_MAC_FRAGMENT, *PNDIS_MAC_FRAGMENT; + +typedef struct _NDIS_MAC_LINE_DOWN { + NDIS_HANDLE NdisLinkContext; +} NDIS_MAC_LINE_DOWN, *PNDIS_MAC_LINE_DOWN; + +typedef struct _NDIS_MAC_LINE_UP { + ULONG LinkSpeed; + NDIS_WAN_QUALITY Quality; + USHORT SendWindow; + NDIS_HANDLE ConnectionWrapperID; + NDIS_HANDLE NdisLinkHandle; + NDIS_HANDLE NdisLinkContext; +} NDIS_MAC_LINE_UP, *PNDIS_MAC_LINE_UP; + +typedef struct _NDIS_PACKET_8021Q_INFO { + _ANONYMOUS_UNION union { + struct { + UINT32 UserPriority : 3; + UINT32 CanonicalFormatId : 1; + UINT32 VlanId : 12; + UINT32 Reserved : 16; + } TagHeader; + PVOID Value; + } DUMMYUNIONNAME; +} NDIS_PACKET_8021Q_INFO, *PNDIS_PACKET_8021Q_INFO; + +typedef enum _NDIS_PER_PACKET_INFO { + TcpIpChecksumPacketInfo, + IpSecPacketInfo, + TcpLargeSendPacketInfo, + ClassificationHandlePacketInfo, + NdisReserved, + ScatterGatherListPacketInfo, + Ieee8021QInfo, + OriginalPacketInfo, + PacketCancelId, + MaxPerPacketInfo +} NDIS_PER_PACKET_INFO, *PNDIS_PER_PACKET_INFO; + +typedef struct _NDIS_PACKET_EXTENSION { + PVOID NdisPacketInfo[MaxPerPacketInfo]; +} NDIS_PACKET_EXTENSION, *PNDIS_PACKET_EXTENSION; + +/* + * PNDIS_PACKET + * NDIS_GET_ORIGINAL_PACKET( + * IN PNDIS_PACKET Packet); + */ +#define NDIS_GET_ORIGINAL_PACKET(Packet) \ + NDIS_PER_PACKET_INFO_FROM_PACKET(Packet, OriginalPacketInfo) + +/* + * PVOID + * NDIS_GET_PACKET_CANCEL_ID( + * IN PNDIS_PACKET Packet); + */ +#define NDIS_GET_PACKET_CANCEL_ID(Packet) \ + NDIS_PER_PACKET_INFO_FROM_PACKET(Packet, PacketCancelId) + +/* + * PNDIS_PACKET_EXTENSION + * NDIS_PACKET_EXTENSION_FROM_PACKET( + * IN PNDIS_PACKET Packet); + */ +#define NDIS_PACKET_EXTENSION_FROM_PACKET(Packet) \ + ((PNDIS_PACKET_EXTENSION)((PUCHAR)(Packet) \ + + (Packet)->Private.NdisPacketOobOffset + sizeof(NDIS_PACKET_OOB_DATA))) + +/* + * PVOID + * NDIS_PER_PACKET_INFO_FROM_PACKET( + * IN OUT PNDIS_PACKET Packet, + * IN NDIS_PER_PACKET_INFO InfoType); + */ +#define NDIS_PER_PACKET_INFO_FROM_PACKET(Packet, InfoType) \ + ((PNDIS_PACKET_EXTENSION)((PUCHAR)(Packet) + (Packet)->Private.NdisPacketOobOffset \ + + sizeof(NDIS_PACKET_OOB_DATA)))->NdisPacketInfo[(InfoType)] + +/* + * VOID + * NDIS_SET_ORIGINAL_PACKET( + * IN OUT PNDIS_PACKET Packet, + * IN PNDIS_PACKET OriginalPacket); + */ +#define NDIS_SET_ORIGINAL_PACKET(Packet, OriginalPacket) \ + NDIS_PER_PACKET_INFO_FROM_PACKET(Packet, OriginalPacketInfo) = (OriginalPacket) + +/* + * VOID + * NDIS_SET_PACKET_CANCEL_ID( + * IN PNDIS_PACKET Packet + * IN ULONG_PTR CancelId); + */ +#define NDIS_SET_PACKET_CANCEL_ID(Packet, CancelId) \ + NDIS_PER_PACKET_INFO_FROM_PACKET(Packet, PacketCancelId) = (CancelId) + +typedef enum _NDIS_TASK { + TcpIpChecksumNdisTask, + IpSecNdisTask, + TcpLargeSendNdisTask, + MaxNdisTask +} NDIS_TASK, *PNDIS_TASK; + +typedef struct _NDIS_TASK_IPSEC { + struct { + ULONG AH_ESP_COMBINED; + ULONG TRANSPORT_TUNNEL_COMBINED; + ULONG V4_OPTIONS; + ULONG RESERVED; + } Supported; + + struct { + ULONG MD5 : 1; + ULONG SHA_1 : 1; + ULONG Transport : 1; + ULONG Tunnel : 1; + ULONG Send : 1; + ULONG Receive : 1; + } V4AH; + + struct { + ULONG DES : 1; + ULONG RESERVED : 1; + ULONG TRIPLE_DES : 1; + ULONG NULL_ESP : 1; + ULONG Transport : 1; + ULONG Tunnel : 1; + ULONG Send : 1; + ULONG Receive : 1; + } V4ESP; +} NDIS_TASK_IPSEC, *PNDIS_TASK_IPSEC; + +typedef struct _NDIS_TASK_OFFLOAD { + ULONG Version; + ULONG Size; + NDIS_TASK Task; + ULONG OffsetNextTask; + ULONG TaskBufferLength; + UCHAR TaskBuffer[1]; +} NDIS_TASK_OFFLOAD, *PNDIS_TASK_OFFLOAD; + +/* NDIS_TASK_OFFLOAD_HEADER.Version constants */ +#define NDIS_TASK_OFFLOAD_VERSION 1 + +typedef enum _NDIS_ENCAPSULATION { + UNSPECIFIED_Encapsulation, + NULL_Encapsulation, + IEEE_802_3_Encapsulation, + IEEE_802_5_Encapsulation, + LLC_SNAP_ROUTED_Encapsulation, + LLC_SNAP_BRIDGED_Encapsulation +} NDIS_ENCAPSULATION; + +typedef struct _NDIS_ENCAPSULATION_FORMAT { + NDIS_ENCAPSULATION Encapsulation; + struct { + ULONG FixedHeaderSize : 1; + ULONG Reserved : 31; + } Flags; + ULONG EncapsulationHeaderSize; +} NDIS_ENCAPSULATION_FORMAT, *PNDIS_ENCAPSULATION_FORMAT; + +typedef struct _NDIS_TASK_TCP_IP_CHECKSUM { + struct { + ULONG IpOptionsSupported:1; + ULONG TcpOptionsSupported:1; + ULONG TcpChecksum:1; + ULONG UdpChecksum:1; + ULONG IpChecksum:1; + } V4Transmit; + + struct { + ULONG IpOptionsSupported : 1; + ULONG TcpOptionsSupported : 1; + ULONG TcpChecksum : 1; + ULONG UdpChecksum : 1; + ULONG IpChecksum : 1; + } V4Receive; + + struct { + ULONG IpOptionsSupported : 1; + ULONG TcpOptionsSupported : 1; + ULONG TcpChecksum : 1; + ULONG UdpChecksum : 1; + } V6Transmit; + + struct { + ULONG IpOptionsSupported : 1; + ULONG TcpOptionsSupported : 1; + ULONG TcpChecksum : 1; + ULONG UdpChecksum : 1; + } V6Receive; +} NDIS_TASK_TCP_IP_CHECKSUM, *PNDIS_TASK_TCP_IP_CHECKSUM; + +typedef struct _NDIS_TASK_TCP_LARGE_SEND { + ULONG Version; + ULONG MaxOffLoadSize; + ULONG MinSegmentCount; + BOOLEAN TcpOptions; + BOOLEAN IpOptions; +} NDIS_TASK_TCP_LARGE_SEND, *PNDIS_TASK_TCP_LARGE_SEND; + +typedef struct _NDIS_TCP_IP_CHECKSUM_PACKET_INFO { + _ANONYMOUS_UNION union { + struct { + ULONG NdisPacketChecksumV4 : 1; + ULONG NdisPacketChecksumV6 : 1; + ULONG NdisPacketTcpChecksum : 1; + ULONG NdisPacketUdpChecksum : 1; + ULONG NdisPacketIpChecksum : 1; + } Transmit; + + struct { + ULONG NdisPacketTcpChecksumFailed : 1; + ULONG NdisPacketUdpChecksumFailed : 1; + ULONG NdisPacketIpChecksumFailed : 1; + ULONG NdisPacketTcpChecksumSucceeded : 1; + ULONG NdisPacketUdpChecksumSucceeded : 1; + ULONG NdisPacketIpChecksumSucceeded : 1; + ULONG NdisPacketLoopback : 1; + } Receive; + ULONG Value; + } DUMMYUNIONNAME; +} NDIS_TCP_IP_CHECKSUM_PACKET_INFO, *PNDIS_TCP_IP_CHECKSUM_PACKET_INFO; + +typedef struct _NDIS_WAN_CO_FRAGMENT { + ULONG Errors; +} NDIS_WAN_CO_FRAGMENT, *PNDIS_WAN_CO_FRAGMENT; + +typedef struct _NDIS_WAN_FRAGMENT { + UCHAR RemoteAddress[6]; + UCHAR LocalAddress[6]; +} NDIS_WAN_FRAGMENT, *PNDIS_WAN_FRAGMENT; + +typedef struct _WAN_CO_LINKPARAMS { + ULONG TransmitSpeed; + ULONG ReceiveSpeed; + ULONG SendWindow; +} WAN_CO_LINKPARAMS, *PWAN_CO_LINKPARAMS; + + +/* Call Manager */ + +typedef VOID DDKAPI +(*CM_ACTIVATE_VC_COMPLETE_HANDLER)( + IN NDIS_STATUS Status, + IN NDIS_HANDLE CallMgrVcContext, + IN PCO_CALL_PARAMETERS CallParameters); + +typedef NDIS_STATUS DDKAPI +(*CM_ADD_PARTY_HANDLER)( + IN NDIS_HANDLE CallMgrVcContext, + IN OUT PCO_CALL_PARAMETERS CallParameters, + IN NDIS_HANDLE NdisPartyHandle, + OUT PNDIS_HANDLE CallMgrPartyContext); + +typedef NDIS_STATUS DDKAPI +(*CM_CLOSE_AF_HANDLER)( + IN NDIS_HANDLE CallMgrAfContext); + +typedef NDIS_STATUS DDKAPI +(*CM_CLOSE_CALL_HANDLER)( + IN NDIS_HANDLE CallMgrVcContext, + IN NDIS_HANDLE CallMgrPartyContext OPTIONAL, + IN PVOID CloseData OPTIONAL, + IN UINT Size OPTIONAL); + +typedef NDIS_STATUS DDKAPI +(*CM_DEREG_SAP_HANDLER)( + IN NDIS_HANDLE CallMgrSapContext); + +typedef VOID DDKAPI +(*CM_DEACTIVATE_VC_COMPLETE_HANDLER)( + IN NDIS_STATUS Status, + IN NDIS_HANDLE CallMgrVcContext); + +typedef NDIS_STATUS DDKAPI +(*CM_DROP_PARTY_HANDLER)( + IN NDIS_HANDLE CallMgrPartyContext, + IN PVOID CloseData OPTIONAL, + IN UINT Size OPTIONAL); + +typedef VOID DDKAPI +(*CM_INCOMING_CALL_COMPLETE_HANDLER)( + IN NDIS_STATUS Status, + IN NDIS_HANDLE CallMgrVcContext, + IN PCO_CALL_PARAMETERS CallParameters); + +typedef NDIS_STATUS DDKAPI +(*CM_MAKE_CALL_HANDLER)( + IN NDIS_HANDLE CallMgrVcContext, + IN OUT PCO_CALL_PARAMETERS CallParameters, + IN NDIS_HANDLE NdisPartyHandle OPTIONAL, + OUT PNDIS_HANDLE CallMgrPartyContext OPTIONAL); + +typedef NDIS_STATUS DDKAPI +(*CM_MODIFY_CALL_QOS_HANDLER)( + IN NDIS_HANDLE CallMgrVcContext, + IN PCO_CALL_PARAMETERS CallParameters); + +typedef NDIS_STATUS DDKAPI +(*CM_OPEN_AF_HANDLER)( + IN NDIS_HANDLE CallMgrBindingContext, + IN PCO_ADDRESS_FAMILY AddressFamily, + IN NDIS_HANDLE NdisAfHandle, + OUT PNDIS_HANDLE CallMgrAfContext); + +typedef NDIS_STATUS DDKAPI +(*CM_REG_SAP_HANDLER)( + IN NDIS_HANDLE CallMgrAfContext, + IN PCO_SAP Sap, + IN NDIS_HANDLE NdisSapHandle, + OUT PNDIS_HANDLE CallMgrSapContext); + +typedef NDIS_STATUS DDKAPI +(*CO_CREATE_VC_HANDLER)( + IN NDIS_HANDLE ProtocolAfContext, + IN NDIS_HANDLE NdisVcHandle, + OUT PNDIS_HANDLE ProtocolVcContext); + +typedef NDIS_STATUS DDKAPI +(*CO_DELETE_VC_HANDLER)( + IN NDIS_HANDLE ProtocolVcContext); + +typedef VOID DDKAPI +(*CO_REQUEST_COMPLETE_HANDLER)( + IN NDIS_STATUS Status, + IN NDIS_HANDLE ProtocolAfContext OPTIONAL, + IN NDIS_HANDLE ProtocolVcContext OPTIONAL, + IN NDIS_HANDLE ProtocolPartyContext OPTIONAL, + IN PNDIS_REQUEST NdisRequest); + +typedef NDIS_STATUS DDKAPI +(*CO_REQUEST_HANDLER)( + IN NDIS_HANDLE ProtocolAfContext, + IN NDIS_HANDLE ProtocolVcContext OPTIONAL, + IN NDIS_HANDLE ProtocolPartyContext OPTIONAL, + IN OUT PNDIS_REQUEST NdisRequest); + +typedef struct _NDIS_CALL_MANAGER_CHARACTERISTICS { + UCHAR MajorVersion; + UCHAR MinorVersion; + USHORT Filler; + UINT Reserved; + CO_CREATE_VC_HANDLER CmCreateVcHandler; + CO_DELETE_VC_HANDLER CmDeleteVcHandler; + CM_OPEN_AF_HANDLER CmOpenAfHandler; + CM_CLOSE_AF_HANDLER CmCloseAfHandler; + CM_REG_SAP_HANDLER CmRegisterSapHandler; + CM_DEREG_SAP_HANDLER CmDeregisterSapHandler; + CM_MAKE_CALL_HANDLER CmMakeCallHandler; + CM_CLOSE_CALL_HANDLER CmCloseCallHandler; + CM_INCOMING_CALL_COMPLETE_HANDLER CmIncomingCallCompleteHandler; + CM_ADD_PARTY_HANDLER CmAddPartyHandler; + CM_DROP_PARTY_HANDLER CmDropPartyHandler; + CM_ACTIVATE_VC_COMPLETE_HANDLER CmActivateVcCompleteHandler; + CM_DEACTIVATE_VC_COMPLETE_HANDLER CmDeactivateVcCompleteHandler; + CM_MODIFY_CALL_QOS_HANDLER CmModifyCallQoSHandler; + CO_REQUEST_HANDLER CmRequestHandler; + CO_REQUEST_COMPLETE_HANDLER CmRequestCompleteHandler; +} NDIS_CALL_MANAGER_CHARACTERISTICS, *PNDIS_CALL_MANAGER_CHARACTERISTICS; + + + +/* Call Manager clients */ + +typedef VOID (*CL_OPEN_AF_COMPLETE_HANDLER)( + IN NDIS_STATUS Status, + IN NDIS_HANDLE ProtocolAfContext, + IN NDIS_HANDLE NdisAfHandle); + +typedef VOID DDKAPI +(*CL_CLOSE_AF_COMPLETE_HANDLER)( + IN NDIS_STATUS Status, + IN NDIS_HANDLE ProtocolAfContext); + +typedef VOID DDKAPI +(*CL_REG_SAP_COMPLETE_HANDLER)( + IN NDIS_STATUS Status, + IN NDIS_HANDLE ProtocolSapContext, + IN PCO_SAP Sap, + IN NDIS_HANDLE NdisSapHandle); + +typedef VOID DDKAPI +(*CL_DEREG_SAP_COMPLETE_HANDLER)( + IN NDIS_STATUS Status, + IN NDIS_HANDLE ProtocolSapContext); + +typedef VOID DDKAPI +(*CL_MAKE_CALL_COMPLETE_HANDLER)( + IN NDIS_STATUS Status, + IN NDIS_HANDLE ProtocolVcContext, + IN NDIS_HANDLE NdisPartyHandle OPTIONAL, + IN PCO_CALL_PARAMETERS CallParameters); + +typedef VOID DDKAPI +(*CL_MODIFY_CALL_QOS_COMPLETE_HANDLER)( + IN NDIS_STATUS Status, + IN NDIS_HANDLE ProtocolVcContext, + IN PCO_CALL_PARAMETERS CallParameters); + +typedef VOID DDKAPI +(*CL_CLOSE_CALL_COMPLETE_HANDLER)( + IN NDIS_STATUS Status, + IN NDIS_HANDLE ProtocolVcContext, + IN NDIS_HANDLE ProtocolPartyContext OPTIONAL); + +typedef VOID DDKAPI +(*CL_ADD_PARTY_COMPLETE_HANDLER)( + IN NDIS_STATUS Status, + IN NDIS_HANDLE ProtocolPartyContext, + IN NDIS_HANDLE NdisPartyHandle, + IN PCO_CALL_PARAMETERS CallParameters); + +typedef VOID DDKAPI +(*CL_DROP_PARTY_COMPLETE_HANDLER)( + IN NDIS_STATUS Status, + IN NDIS_HANDLE ProtocolPartyContext); + +typedef NDIS_STATUS DDKAPI +(*CL_INCOMING_CALL_HANDLER)( + IN NDIS_HANDLE ProtocolSapContext, + IN NDIS_HANDLE ProtocolVcContext, + IN OUT PCO_CALL_PARAMETERS CallParameters); + +typedef VOID DDKAPI +(*CL_INCOMING_CALL_QOS_CHANGE_HANDLER)( + IN NDIS_HANDLE ProtocolVcContext, + IN PCO_CALL_PARAMETERS CallParameters); + +typedef VOID DDKAPI +(*CL_INCOMING_CLOSE_CALL_HANDLER)( + IN NDIS_STATUS CloseStatus, + IN NDIS_HANDLE ProtocolVcContext, + IN PVOID CloseData OPTIONAL, + IN UINT Size OPTIONAL); + +typedef VOID DDKAPI +(*CL_INCOMING_DROP_PARTY_HANDLER)( + IN NDIS_STATUS DropStatus, + IN NDIS_HANDLE ProtocolPartyContext, + IN PVOID CloseData OPTIONAL, + IN UINT Size OPTIONAL); + +typedef VOID DDKAPI +(*CL_CALL_CONNECTED_HANDLER)( + IN NDIS_HANDLE ProtocolVcContext); + + +typedef struct _NDIS_CLIENT_CHARACTERISTICS { + UCHAR MajorVersion; + UCHAR MinorVersion; + USHORT Filler; + UINT Reserved; + CO_CREATE_VC_HANDLER ClCreateVcHandler; + CO_DELETE_VC_HANDLER ClDeleteVcHandler; + CO_REQUEST_HANDLER ClRequestHandler; + CO_REQUEST_COMPLETE_HANDLER ClRequestCompleteHandler; + CL_OPEN_AF_COMPLETE_HANDLER ClOpenAfCompleteHandler; + CL_CLOSE_AF_COMPLETE_HANDLER ClCloseAfCompleteHandler; + CL_REG_SAP_COMPLETE_HANDLER ClRegisterSapCompleteHandler; + CL_DEREG_SAP_COMPLETE_HANDLER ClDeregisterSapCompleteHandler; + CL_MAKE_CALL_COMPLETE_HANDLER ClMakeCallCompleteHandler; + CL_MODIFY_CALL_QOS_COMPLETE_HANDLER ClModifyCallQoSCompleteHandler; + CL_CLOSE_CALL_COMPLETE_HANDLER ClCloseCallCompleteHandler; + CL_ADD_PARTY_COMPLETE_HANDLER ClAddPartyCompleteHandler; + CL_DROP_PARTY_COMPLETE_HANDLER ClDropPartyCompleteHandler; + CL_INCOMING_CALL_HANDLER ClIncomingCallHandler; + CL_INCOMING_CALL_QOS_CHANGE_HANDLER ClIncomingCallQoSChangeHandler; + CL_INCOMING_CLOSE_CALL_HANDLER ClIncomingCloseCallHandler; + CL_INCOMING_DROP_PARTY_HANDLER ClIncomingDropPartyHandler; + CL_CALL_CONNECTED_HANDLER ClCallConnectedHandler; +} NDIS_CLIENT_CHARACTERISTICS, *PNDIS_CLIENT_CHARACTERISTICS; + + +/* NDIS protocol structures */ + +/* Prototypes for NDIS 3.0 protocol characteristics */ + +typedef VOID DDKAPI +(*OPEN_ADAPTER_COMPLETE_HANDLER)( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS Status, + IN NDIS_STATUS OpenErrorStatus); + +typedef VOID DDKAPI +(*CLOSE_ADAPTER_COMPLETE_HANDLER)( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS Status); + +typedef VOID DDKAPI +(*RESET_COMPLETE_HANDLER)( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS Status); + +typedef VOID DDKAPI +(*REQUEST_COMPLETE_HANDLER)( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_REQUEST NdisRequest, + IN NDIS_STATUS Status); + +typedef VOID DDKAPI +(*STATUS_HANDLER)( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS GeneralStatus, + IN PVOID StatusBuffer, + IN UINT StatusBufferSize); + +typedef VOID DDKAPI +(*STATUS_COMPLETE_HANDLER)( + IN NDIS_HANDLE ProtocolBindingContext); + +typedef VOID DDKAPI +(*SEND_COMPLETE_HANDLER)( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_PACKET Packet, + IN NDIS_STATUS Status); + +typedef VOID DDKAPI +(*WAN_SEND_COMPLETE_HANDLER)( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_WAN_PACKET Packet, + IN NDIS_STATUS Status); + +typedef VOID DDKAPI +(*TRANSFER_DATA_COMPLETE_HANDLER)( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_PACKET Packet, + IN NDIS_STATUS Status, + IN UINT BytesTransferred); + +typedef VOID DDKAPI +(*WAN_TRANSFER_DATA_COMPLETE_HANDLER)( + VOID); + + +typedef NDIS_STATUS DDKAPI +(*RECEIVE_HANDLER)( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_HANDLE MacReceiveContext, + IN PVOID HeaderBuffer, + IN UINT HeaderBufferSize, + IN PVOID LookAheadBuffer, + IN UINT LookaheadBufferSize, + IN UINT PacketSize); + +typedef NDIS_STATUS DDKAPI +(*WAN_RECEIVE_HANDLER)( + IN NDIS_HANDLE NdisLinkHandle, + IN PUCHAR Packet, + IN ULONG PacketSize); + +typedef VOID DDKAPI +(*RECEIVE_COMPLETE_HANDLER)( + IN NDIS_HANDLE ProtocolBindingContext); + + +/* Protocol characteristics for NDIS 3.0 protocols */ + +#define NDIS30_PROTOCOL_CHARACTERISTICS_S \ + UCHAR MajorNdisVersion; \ + UCHAR MinorNdisVersion; \ + _ANONYMOUS_UNION union { \ + UINT Reserved; \ + UINT Flags; \ + } DUMMYUNIONNAME; \ + OPEN_ADAPTER_COMPLETE_HANDLER OpenAdapterCompleteHandler; \ + CLOSE_ADAPTER_COMPLETE_HANDLER CloseAdapterCompleteHandler; \ + _ANONYMOUS_UNION union { \ + SEND_COMPLETE_HANDLER SendCompleteHandler; \ + WAN_SEND_COMPLETE_HANDLER WanSendCompleteHandler; \ + } DUMMYUNIONNAME2; \ + _ANONYMOUS_UNION union { \ + TRANSFER_DATA_COMPLETE_HANDLER TransferDataCompleteHandler; \ + WAN_TRANSFER_DATA_COMPLETE_HANDLER WanTransferDataCompleteHandler; \ + } DUMMYUNIONNAME3; \ + RESET_COMPLETE_HANDLER ResetCompleteHandler; \ + REQUEST_COMPLETE_HANDLER RequestCompleteHandler; \ + _ANONYMOUS_UNION union { \ + RECEIVE_HANDLER ReceiveHandler; \ + WAN_RECEIVE_HANDLER WanReceiveHandler; \ + } DUMMYUNIONNAME4; \ + RECEIVE_COMPLETE_HANDLER ReceiveCompleteHandler; \ + STATUS_HANDLER StatusHandler; \ + STATUS_COMPLETE_HANDLER StatusCompleteHandler; \ + NDIS_STRING Name; + +typedef struct _NDIS30_PROTOCOL_CHARACTERISTICS { + NDIS30_PROTOCOL_CHARACTERISTICS_S +} NDIS30_PROTOCOL_CHARACTERISTICS, *PNDIS30_PROTOCOL_CHARACTERISTICS; + + +/* Prototypes for NDIS 4.0 protocol characteristics */ + +typedef INT DDKAPI +(*RECEIVE_PACKET_HANDLER)( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_PACKET Packet); + +typedef VOID DDKAPI +(*BIND_HANDLER)( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE BindContext, + IN PNDIS_STRING DeviceName, + IN PVOID SystemSpecific1, + IN PVOID SystemSpecific2); + +typedef VOID DDKAPI +(*UNBIND_HANDLER)( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_HANDLE UnbindContext); + +typedef NDIS_STATUS DDKAPI +(*PNP_EVENT_HANDLER)( + IN NDIS_HANDLE ProtocolBindingContext, + IN PNET_PNP_EVENT NetPnPEvent); + +typedef VOID DDKAPI +(*UNLOAD_PROTOCOL_HANDLER)( + VOID); + + +/* Protocol characteristics for NDIS 4.0 protocols */ + +#ifdef __cplusplus + +#define NDIS40_PROTOCOL_CHARACTERISTICS_S \ + NDIS30_PROTOCOL_CHARACTERISTICS Ndis30Chars; \ + RECEIVE_PACKET_HANDLER ReceivePacketHandler; \ + BIND_HANDLER BindAdapterHandler; \ + UNBIND_HANDLER UnbindAdapterHandler; \ + PNP_EVENT_HANDLER PnPEventHandler; \ + UNLOAD_PROTOCOL_HANDLER UnloadHandler; + +#else /* !__cplusplus */ + +#define NDIS40_PROTOCOL_CHARACTERISTICS_S \ + NDIS30_PROTOCOL_CHARACTERISTICS_S \ + RECEIVE_PACKET_HANDLER ReceivePacketHandler; \ + BIND_HANDLER BindAdapterHandler; \ + UNBIND_HANDLER UnbindAdapterHandler; \ + PNP_EVENT_HANDLER PnPEventHandler; \ + UNLOAD_PROTOCOL_HANDLER UnloadHandler; + +#endif /* __cplusplus */ + +typedef struct _NDIS40_PROTOCOL_CHARACTERISTICS { + NDIS40_PROTOCOL_CHARACTERISTICS_S +} NDIS40_PROTOCOL_CHARACTERISTICS, *PNDIS40_PROTOCOL_CHARACTERISTICS; + +/* Prototypes for NDIS 5.0 protocol characteristics */ + +typedef VOID DDKAPI +(*CO_SEND_COMPLETE_HANDLER)( + IN NDIS_STATUS Status, + IN NDIS_HANDLE ProtocolVcContext, + IN PNDIS_PACKET Packet); + +typedef VOID DDKAPI +(*CO_STATUS_HANDLER)( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_HANDLE ProtocolVcContext OPTIONAL, + IN NDIS_STATUS GeneralStatus, + IN PVOID StatusBuffer, + IN UINT StatusBufferSize); + +typedef UINT DDKAPI +(*CO_RECEIVE_PACKET_HANDLER)( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_HANDLE ProtocolVcContext, + IN PNDIS_PACKET Packet); + +typedef VOID DDKAPI +(*CO_AF_REGISTER_NOTIFY_HANDLER)( + IN NDIS_HANDLE ProtocolBindingContext, + IN PCO_ADDRESS_FAMILY AddressFamily); + +#ifdef __cplusplus \ + +#define NDIS50_PROTOCOL_CHARACTERISTICS_S \ + NDIS40_PROTOCOL_CHARACTERISTICS Ndis40Chars; \ + PVOID ReservedHandlers[4]; \ + CO_SEND_COMPLETE_HANDLER CoSendCompleteHandler; \ + CO_STATUS_HANDLER CoStatusHandler; \ + CO_RECEIVE_PACKET_HANDLER CoReceivePacketHandler; \ + CO_AF_REGISTER_NOTIFY_HANDLER CoAfRegisterNotifyHandler; + +#else /* !__cplusplus */ + +#define NDIS50_PROTOCOL_CHARACTERISTICS_S \ + NDIS40_PROTOCOL_CHARACTERISTICS_S \ + PVOID ReservedHandlers[4]; \ + CO_SEND_COMPLETE_HANDLER CoSendCompleteHandler; \ + CO_STATUS_HANDLER CoStatusHandler; \ + CO_RECEIVE_PACKET_HANDLER CoReceivePacketHandler; \ + CO_AF_REGISTER_NOTIFY_HANDLER CoAfRegisterNotifyHandler; + +#endif /* !__cplusplus */ + +typedef struct _NDIS50_PROTOCOL_CHARACTERISTICS { + NDIS50_PROTOCOL_CHARACTERISTICS_S +} NDIS50_PROTOCOL_CHARACTERISTICS, *PNDIS50_PROTOCOL_CHARACTERISTICS; + +#if defined(NDIS50) || defined(NDIS51) +typedef struct _NDIS_PROTOCOL_CHARACTERISTICS { + NDIS50_PROTOCOL_CHARACTERISTICS_S; +} NDIS_PROTOCOL_CHARACTERISTICS, *PNDIS_PROTOCOL_CHARACTERISTICS; +#elif defined(NDIS40) +typedef struct _NDIS_PROTOCOL_CHARACTERISTICS { + NDIS40_PROTOCOL_CHARACTERISTICS_S; +} NDIS_PROTOCOL_CHARACTERISTICS, *PNDIS_PROTOCOL_CHARACTERISTICS; +#elif defined(NDIS30) +typedef struct _NDIS_PROTOCOL_CHARACTERISTICS { + NDIS30_PROTOCOL_CHARACTERISTICS_S +} NDIS_PROTOCOL_CHARACTERISTICS, *PNDIS_PROTOCOL_CHARACTERISTICS; +#else +#error Define an NDIS version +#endif /* NDIS30 */ + + + +/* Buffer management routines */ + +NDISAPI +VOID +DDKAPI +NdisAllocateBuffer( + OUT PNDIS_STATUS Status, + OUT PNDIS_BUFFER *Buffer, + IN NDIS_HANDLE PoolHandle, + IN PVOID VirtualAddress, + IN UINT Length); + + +NDISAPI +VOID +DDKAPI +NdisAllocateBufferPool( + OUT PNDIS_STATUS Status, + OUT PNDIS_HANDLE PoolHandle, + IN UINT NumberOfDescriptors); + +NDISAPI +VOID +DDKAPI +NdisAllocatePacket( + OUT PNDIS_STATUS Status, + OUT PNDIS_PACKET *Packet, + IN NDIS_HANDLE PoolHandle); + +NDISAPI +VOID +DDKAPI +NdisAllocatePacketPool( + OUT PNDIS_STATUS Status, + OUT PNDIS_HANDLE PoolHandle, + IN UINT NumberOfDescriptors, + IN UINT ProtocolReservedLength); + +NDISAPI +VOID +DDKAPI +NdisCopyBuffer( + OUT PNDIS_STATUS Status, + OUT PNDIS_BUFFER *Buffer, + IN NDIS_HANDLE PoolHandle, + IN PVOID MemoryDescriptor, + IN UINT Offset, + IN UINT Length); + +NDISAPI +VOID +DDKAPI +NdisCopyFromPacketToPacket( + IN PNDIS_PACKET Destination, + IN UINT DestinationOffset, + IN UINT BytesToCopy, + IN PNDIS_PACKET Source, + IN UINT SourceOffset, + OUT PUINT BytesCopied); + +NDISAPI +VOID +DDKAPI +NdisDprAllocatePacket( + OUT PNDIS_STATUS Status, + OUT PNDIS_PACKET *Packet, + IN NDIS_HANDLE PoolHandle); + +NDISAPI +VOID +DDKAPI +NdisDprAllocatePacketNonInterlocked( + OUT PNDIS_STATUS Status, + OUT PNDIS_PACKET *Packet, + IN NDIS_HANDLE PoolHandle); + +NDISAPI +VOID +DDKAPI +NdisDprFreePacket( + IN PNDIS_PACKET Packet); + +NDISAPI +VOID +DDKAPI +NdisDprFreePacketNonInterlocked( + IN PNDIS_PACKET Packet); + +NDISAPI +VOID +DDKAPI +NdisFreeBufferPool( + IN NDIS_HANDLE PoolHandle); + +NDISAPI +VOID +DDKAPI +NdisFreePacket( + IN PNDIS_PACKET Packet); + +NDISAPI +VOID +DDKAPI +NdisFreePacketPool( + IN NDIS_HANDLE PoolHandle); + +NDISAPI +VOID +DDKAPI +NdisReturnPackets( + IN PNDIS_PACKET *PacketsToReturn, + IN UINT NumberOfPackets); + +NDISAPI +VOID +DDKAPI +NdisUnchainBufferAtBack( + IN OUT PNDIS_PACKET Packet, + OUT PNDIS_BUFFER *Buffer); + +NDISAPI +VOID +DDKAPI +NdisUnchainBufferAtFront( + IN OUT PNDIS_PACKET Packet, + OUT PNDIS_BUFFER *Buffer); + +NDISAPI +VOID +DDKAPI +NdisAdjustBufferLength( + IN PNDIS_BUFFER Buffer, + IN UINT Length); + +NDISAPI +ULONG +DDKAPI +NdisBufferLength( + IN PNDIS_BUFFER Buffer); + +NDISAPI +PVOID +DDKAPI +NdisBufferVirtualAddress( + IN PNDIS_BUFFER Buffer); + +NDISAPI +ULONG +DDKAPI +NDIS_BUFFER_TO_SPAN_PAGES( + IN PNDIS_BUFFER Buffer); + +NDISAPI +VOID +DDKAPI +NdisFreeBuffer( + IN PNDIS_BUFFER Buffer); + +NDISAPI +VOID +DDKAPI +NdisGetBufferPhysicalArraySize( + IN PNDIS_BUFFER Buffer, + OUT PUINT ArraySize); + +NDISAPI +VOID +DDKAPI +NdisGetFirstBufferFromPacket( + IN PNDIS_PACKET _Packet, + OUT PNDIS_BUFFER *_FirstBuffer, + OUT PVOID *_FirstBufferVA, + OUT PUINT _FirstBufferLength, + OUT PUINT _TotalBufferLength); + +NDISAPI +VOID +DDKAPI +NdisQueryBuffer( + IN PNDIS_BUFFER Buffer, + OUT PVOID *VirtualAddress OPTIONAL, + OUT PUINT Length); + +NDISAPI +VOID +DDKAPI +NdisQueryBufferOffset( + IN PNDIS_BUFFER Buffer, + OUT PUINT Offset, + OUT PUINT Length); + +NDISAPI +VOID +DDKAPI +NdisFreeBuffer( + IN PNDIS_BUFFER Buffer); + + +/* + * VOID + * NdisGetBufferPhysicalArraySize( + * IN PNDIS_BUFFER Buffer, + * OUT PUINT ArraySize); + */ +#define NdisGetBufferPhysicalArraySize(Buffer, \ + ArraySize) \ +{ \ + (*(ArraySize) = NDIS_BUFFER_TO_SPAN_PAGES(Buffer)) \ +} + + +/* + * VOID + * NdisGetFirstBufferFromPacket( + * IN PNDIS_PACKET _Packet, + * OUT PNDIS_BUFFER * _FirstBuffer, + * OUT PVOID * _FirstBufferVA, + * OUT PUINT _FirstBufferLength, + * OUT PUINT _TotalBufferLength) + */ +#define NdisGetFirstBufferFromPacket(_Packet, \ + _FirstBuffer, \ + _FirstBufferVA, \ + _FirstBufferLength, \ + _TotalBufferLength) \ +{ \ + PNDIS_BUFFER _Buffer; \ + \ + _Buffer = (_Packet)->Private.Head; \ + *(_FirstBuffer) = _Buffer; \ + if (_Buffer != NULL) \ + { \ + *(_FirstBufferVA) = MmGetSystemAddressForMdl(_Buffer); \ + *(_FirstBufferLength) = MmGetMdlByteCount(_Buffer); \ + _Buffer = _Buffer->Next; \ + *(_TotalBufferLength) = *(_FirstBufferLength); \ + while (_Buffer != NULL) { \ + *(_TotalBufferLength) += MmGetMdlByteCount(_Buffer); \ + _Buffer = _Buffer->Next; \ + } \ + } \ + else \ + { \ + *(_FirstBufferVA) = 0; \ + *(_FirstBufferLength) = 0; \ + *(_TotalBufferLength) = 0; \ + } \ +} + +/* + * VOID + * NdisQueryBuffer( + * IN PNDIS_BUFFER Buffer, + * OUT PVOID *VirtualAddress OPTIONAL, + * OUT PUINT Length) + */ +#define NdisQueryBuffer(Buffer, \ + VirtualAddress, \ + Length) \ +{ \ + if (VirtualAddress) \ + *((PVOID*)VirtualAddress) = MmGetSystemAddressForMdl(Buffer); \ + \ + *((PUINT)Length) = MmGetMdlByteCount(Buffer); \ +} + + +/* + * VOID + * NdisQueryBufferOffset( + * IN PNDIS_BUFFER Buffer, + * OUT PUINT Offset, + * OUT PUINT Length); + */ +#define NdisQueryBufferOffset(Buffer, \ + Offset, \ + Length) \ +{ \ + *((PUINT)Offset) = MmGetMdlByteOffset(Buffer); \ + *((PUINT)Length) = MmGetMdlByteCount(Buffer); \ +} + + +/* + * PVOID + * NDIS_BUFFER_LINKAGE( + * IN PNDIS_BUFFER Buffer); + */ +#define NDIS_BUFFER_LINKAGE(Buffer)(Buffer)->Next; + + +/* + * VOID + * NdisChainBufferAtBack( + * IN OUT PNDIS_PACKET Packet, + * IN OUT PNDIS_BUFFER Buffer) + */ +#define NdisChainBufferAtBack(Packet, \ + Buffer) \ +{ \ + PNDIS_BUFFER NdisBuffer = (Buffer); \ + \ + while (NdisBuffer->Next != NULL) \ + NdisBuffer = NdisBuffer->Next; \ + \ + NdisBuffer->Next = NULL; \ + \ + if ((Packet)->Private.Head != NULL) \ + (Packet)->Private.Tail->Next = (Buffer); \ + else \ + (Packet)->Private.Head = (Buffer); \ + \ + (Packet)->Private.Tail = NdisBuffer; \ + (Packet)->Private.ValidCounts = FALSE; \ +} + + +/* + * VOID + * NdisChainBufferAtFront( + * IN OUT PNDIS_PACKET Packet, + * IN OUT PNDIS_BUFFER Buffer) + */ +#define NdisChainBufferAtFront(Packet, \ + Buffer) \ +{ \ + PNDIS_BUFFER _NdisBuffer = (Buffer); \ + \ + while (_NdisBuffer->Next != NULL) \ + _NdisBuffer = _NdisBuffer->Next; \ + \ + if ((Packet)->Private.Head == NULL) \ + (Packet)->Private.Tail = _NdisBuffer; \ + \ + _NdisBuffer->Next = (Packet)->Private.Head; \ + (Packet)->Private.Head = (Buffer); \ + (Packet)->Private.ValidCounts = FALSE; \ +} + + +/* + * VOID + * NdisGetNextBuffer( + * IN PNDIS_BUFFER CurrentBuffer, + * OUT PNDIS_BUFFER * NextBuffer) + */ +#define NdisGetNextBuffer(CurrentBuffer, \ + NextBuffer) \ +{ \ + *(NextBuffer) = (CurrentBuffer)->Next; \ +} + + +/* + * UINT + * NdisGetPacketFlags( + * IN PNDIS_PACKET Packet); + */ +#define NdisGetPacketFlags(Packet)(Packet)->Private.Flags; + + +/* + * VOID + * NdisClearPacketFlags( + * IN PNDIS_PACKET Packet, + * IN UINT Flags); + */ +#define NdisClearPacketFlags(Packet, Flags) \ + (Packet)->Private.Flags &= ~(Flags) + + +/* + * VOID + * NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO( + * IN PNDIS_PACKET Packet, + * IN PPVOID pMediaSpecificInfo, + * IN PUINT pSizeMediaSpecificInfo); + */ +#define NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(_Packet, \ + _pMediaSpecificInfo, \ + _pSizeMediaSpecificInfo) \ +{ \ + if (!((_Packet)->Private.NdisPacketFlags & fPACKET_ALLOCATED_BY_NDIS) || \ + !((_Packet)->Private.NdisPacketFlags & fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO)) \ + { \ + *(_pMediaSpecificInfo) = NULL; \ + *(_pSizeMediaSpecificInfo) = 0; \ + } \ + else \ + { \ + *(_pMediaSpecificInfo) = ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->MediaSpecificInformation; \ + *(_pSizeMediaSpecificInfo) = ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->SizeMediaSpecificInfo; \ + } \ +} + + +/* + * ULONG + * NDIS_GET_PACKET_PROTOCOL_TYPE( + * IN PNDIS_PACKET Packet); + */ +#define NDIS_GET_PACKET_PROTOCOL_TYPE(_Packet) \ + ((_Packet)->Private.Flags & NDIS_PROTOCOL_ID_MASK) + +/* + * ULONG + * NDIS_GET_PACKET_HEADER_SIZE( + * IN PNDIS_PACKET Packet); + */ +#define NDIS_GET_PACKET_HEADER_SIZE(_Packet) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->HeaderSize + + +/* + * NDIS_STATUS + * NDIS_GET_PACKET_STATUS( + * IN PNDIS_PACKET Packet); + */ +#define NDIS_GET_PACKET_STATUS(_Packet) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->Status + + +/* + * ULONGLONG + * NDIS_GET_PACKET_TIME_RECEIVED( + * IN PNDIS_PACKET Packet); + */ +#define NDIS_GET_PACKET_TIME_RECEIVED(_Packet) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->TimeReceived + + +/* + * ULONGLONG + * NDIS_GET_PACKET_TIME_SENT( + * IN PNDIS_PACKET Packet); + */ +#define NDIS_GET_PACKET_TIME_SENT(_Packet) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->TimeSent + + +/* + * ULONGLONG + * NDIS_GET_PACKET_TIME_TO_SEND( + * IN PNDIS_PACKET Packet); + */ +#define NDIS_GET_PACKET_TIME_TO_SEND(_Packet) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->TimeToSend + + +/* + * PNDIS_PACKET_OOB_DATA + * NDIS_OOB_DATA_FROM_PACKET( + * IN PNDIS_PACKET Packet); + */ +#define NDIS_OOB_DATA_FROM_PACKET(_Packet) \ + (PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset) + + +/* + * VOID + * NdisQueryPacket( + * IN PNDIS_PACKET Packet, + * OUT PUINT PhysicalBufferCount OPTIONAL, + * OUT PUINT BufferCount OPTIONAL, + * OUT PNDIS_BUFFER *FirstBuffer OPTIONAL, + * OUT PUINT TotalPacketLength OPTIONAL); + */ +#define NdisQueryPacket(Packet, \ + PhysicalBufferCount, \ + BufferCount, \ + FirstBuffer, \ + TotalPacketLength) \ +{ \ + if (FirstBuffer) \ + *((PNDIS_BUFFER*)FirstBuffer) = (Packet)->Private.Head; \ + if ((TotalPacketLength) || (BufferCount) || (PhysicalBufferCount)) \ + { \ + if (!(Packet)->Private.ValidCounts) { \ + UINT _Offset; \ + UINT _PacketLength; \ + PNDIS_BUFFER _NdisBuffer; \ + UINT _PhysicalBufferCount = 0; \ + UINT _TotalPacketLength = 0; \ + UINT _Count = 0; \ + \ + for (_NdisBuffer = (Packet)->Private.Head; \ + _NdisBuffer != (PNDIS_BUFFER)NULL; \ + _NdisBuffer = _NdisBuffer->Next) \ + { \ + _PhysicalBufferCount += NDIS_BUFFER_TO_SPAN_PAGES(_NdisBuffer); \ + NdisQueryBufferOffset(_NdisBuffer, &_Offset, &_PacketLength); \ + _TotalPacketLength += _PacketLength; \ + _Count++; \ + } \ + (Packet)->Private.PhysicalCount = _PhysicalBufferCount; \ + (Packet)->Private.TotalLength = _TotalPacketLength; \ + (Packet)->Private.Count = _Count; \ + (Packet)->Private.ValidCounts = TRUE; \ + } \ + \ + if (PhysicalBufferCount) \ + *((PUINT)PhysicalBufferCount) = (Packet)->Private.PhysicalCount; \ + \ + if (BufferCount) \ + *((PUINT)BufferCount) = (Packet)->Private.Count; \ + \ + if (TotalPacketLength) \ + *((PUINT)TotalPacketLength) = (Packet)->Private.TotalLength; \ + } \ +} + + +/* + * VOID + * NdisRecalculatePacketCounts( + * IN OUT PNDIS_PACKET Packet); + */ +#define NdisRecalculatePacketCounts(Packet) \ +{ \ + PNDIS_BUFFER _Buffer = (Packet)->Private.Head; \ + if (_Buffer != NULL) \ + { \ + while (_Buffer->Next != NULL) \ + { \ + 確Buffer = _Buffer->Next; \ + } \ + (Packet)->Private.Tail = _Buffer; \ + } \ + (Packet)->Private.ValidCounts = FALSE; \ +} + + +/* + * VOID + * NdisReinitializePacket( + * IN OUT PNDIS_PACKET Packet); + */ +#define NdisReinitializePacketCounts(Packet) \ +{ \ + (Packet)->Private.Head = (PNDIS_BUFFER)NULL; \ + (Packet)->Private.ValidCounts = FALSE; \ +} + + +/* + * VOID + * NdisSetPacketFlags( + * IN PNDIS_PACKET Packet, + * IN UINT Flags); + */ +#define NdisSetPacketFlags(Packet, Flags) \ + (Packet)->Private.Flags |= (Flags); + + +/* + * VOID + * NDIS_SET_PACKET_HEADER_SIZE( + * IN PNDIS_PACKET Packet, + * IN UINT HdrSize); + */ +#define NDIS_SET_PACKET_HEADER_SIZE(_Packet, _HdrSize) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->HeaderSize = (_HdrSize) + + +/* + * VOID + * NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO( + * IN PNDIS_PACKET Packet, + * IN PVOID MediaSpecificInfo, + * IN UINT SizeMediaSpecificInfo); + */ +#define NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(_Packet, \ + _MediaSpecificInfo, \ + _SizeMediaSpecificInfo) \ +{ \ + if ((_Packet)->Private.NdisPacketFlags & fPACKET_ALLOCATED_BY_NDIS) \ + { \ + (_Packet)->Private.NdisPacketFlags |= fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO; \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->MediaSpecificInformation = \ + (_MediaSpecificInfo); \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->SizeMediaSpecificInfo = \ + (_SizeMediaSpecificInfo); \ + } \ +} + + +/* + * VOID + * NDIS_SET_PACKET_STATUS( + * IN PNDIS_PACKET Packet, + * IN NDIS_STATUS Status); + */ +#define NDIS_SET_PACKET_STATUS(_Packet, _Status) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->Status = (_Status) + + +/* + * VOID + * NDIS_SET_PACKET_TIME_RECEIVED( + * IN PNDIS_PACKET Packet, + * IN ULONGLONG TimeReceived); + */ +#define NDIS_SET_PACKET_TIME_RECEIVED(_Packet, _TimeReceived) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->TimeReceived = (_TimeReceived) + + +/* + * VOID + * NDIS_SET_PACKET_TIME_SENT( + * IN PNDIS_PACKET Packet, + * IN ULONGLONG TimeSent); + */ +#define NDIS_SET_PACKET_TIME_SENT(_Packet, _TimeSent) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->TimeSent = (_TimeSent) + + +/* + * VOID + * NDIS_SET_PACKET_TIME_TO_SEND( + * IN PNDIS_PACKET Packet, + * IN ULONGLONG TimeToSend); + */ +#define NDIS_SET_PACKET_TIME_TO_SEND(_Packet, _TimeToSend) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->TimeToSend = (_TimeToSend) + + +/* + * VOID + * NdisSetSendFlags( + * IN PNDIS_PACKET Packet, + * IN UINT Flags); + */ +#define NdisSetSendFlags(_Packet,_Flags)(_Packet)->Private.Flags = (_Flags) + + + +/* Memory management routines */ + +/* + * VOID + * NdisCreateLookaheadBufferFromSharedMemory( + * IN PVOID pSharedMemory, + * IN UINT LookaheadLength, + * OUT PVOID *pLookaheadBuffer) + */ +#define NdisCreateLookaheadBufferFromSharedMemory(_pSharedMemory, \ + _LookaheadLength, \ + _pLookaheadBuffer) \ + ((*(_pLookaheadBuffer)) = (_pSharedMemory)) + +/* + * VOID + * NdisDestroyLookaheadBufferFromSharedMemory( + * IN PVOID pLookaheadBuffer) + */ +#define NdisDestroyLookaheadBufferFromSharedMemory(_pLookaheadBuffer) + +#if defined(i386) + +/* + * VOID + * NdisMoveFromMappedMemory( + * OUT PVOID Destination, + * IN PVOID Source, + * IN ULONG Length); + */ +#define NdisMoveFromMappedMemory(Destination, Source, Length) \ + NdisMoveMappedMemory(Destination, Source, Length) + +/* + * VOID + * NdisMoveMappedMemory( + * OUT PVOID Destination, + * IN PVOID Source, + * IN ULONG Length); + */ +#define NdisMoveMappedMemory(Destination, Source, Length) \ + RtlCopyMemory(Destination, Source, Length) + +/* + * VOID + * NdisMoveToMappedMemory( + * OUT PVOID Destination, + * IN PVOID Source, + * IN ULONG Length); + */ +#define NdisMoveToMappedMemory(Destination, Source, Length) \ + NdisMoveMappedMemory(Destination, Source, Length) + +#endif /* i386 */ + +/* + * VOID + * NdisMUpdateSharedMemory( + * IN NDIS_HANDLE MiniportAdapterHandle, + * IN ULONG Length, + * IN PVOID VirtualAddress, + * IN NDIS_PHYSICAL_ADDRESS PhysicalAddress); + */ +#define NdisMUpdateSharedMemory(_H, _L, _V, _P) \ + NdisUpdateSharedMemory(_H, _L, _V, _P) + +NDISAPI +NDIS_STATUS +DDKAPI +NdisAllocateMemory( + OUT PVOID *VirtualAddress, + IN UINT Length, + IN UINT MemoryFlags, + IN NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress); + +NDISAPI +VOID +DDKAPI +NdisFreeMemory( + IN PVOID VirtualAddress, + IN UINT Length, + IN UINT MemoryFlags); + +NDISAPI +VOID +DDKAPI +NdisImmediateReadSharedMemory( + IN NDIS_HANDLE WrapperConfigurationContext, + IN ULONG SharedMemoryAddress, + OUT PUCHAR Buffer, + IN ULONG Length); + +NDISAPI +VOID +DDKAPI +NdisImmediateWriteSharedMemory( + IN NDIS_HANDLE WrapperConfigurationContext, + IN ULONG SharedMemoryAddress, + IN PUCHAR Buffer, + IN ULONG Length); + +NDISAPI +VOID +DDKAPI +NdisMAllocateSharedMemory( + IN NDIS_HANDLE MiniportAdapterHandle, + IN ULONG Length, + IN BOOLEAN Cached, + OUT PVOID *VirtualAddress, + OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisMAllocateSharedMemoryAsync( + IN NDIS_HANDLE MiniportAdapterHandle, + IN ULONG Length, + IN BOOLEAN Cached, + IN PVOID Context); + +#if defined(NDIS50) + +#define NdisUpdateSharedMemory(NdisAdapterHandle, \ + Length, \ + VirtualAddress, \ + PhysicalAddress) + +#else + +NDISAPI +VOID +DDKAPI +NdisUpdateSharedMemory( + IN NDIS_HANDLE NdisAdapterHandle, + IN ULONG Length, + IN PVOID VirtualAddress, + IN NDIS_PHYSICAL_ADDRESS PhysicalAddress); + +#endif /* defined(NDIS50) */ + +/* + * ULONG + * NdisGetPhysicalAddressHigh( + * IN NDIS_PHYSICAL_ADDRESS PhysicalAddress); + */ +#define NdisGetPhysicalAddressHigh(PhysicalAddress) \ + ((PhysicalAddress).HighPart) + +/* + * VOID + * NdisSetPhysicalAddressHigh( + * IN NDIS_PHYSICAL_ADDRESS PhysicalAddress, + * IN ULONG Value); + */ +#define NdisSetPhysicalAddressHigh(PhysicalAddress, Value) \ + ((PhysicalAddress).HighPart) = (Value) + +/* + * ULONG + * NdisGetPhysicalAddressLow( + * IN NDIS_PHYSICAL_ADDRESS PhysicalAddress); + */ +#define NdisGetPhysicalAddressLow(PhysicalAddress) \ + ((PhysicalAddress).LowPart) + + +/* + * VOID + * NdisSetPhysicalAddressLow( + * IN NDIS_PHYSICAL_ADDRESS PhysicalAddress, + * IN ULONG Value); + */ +#define NdisSetPhysicalAddressLow(PhysicalAddress, Value) \ + ((PhysicalAddress).LowPart) = (Value) + +/* + * VOID + * NDIS_PHYSICAL_ADDRESS_CONST( + * IN ULONG Low, + * IN LONG High); + */ +#define NDIS_PHYSICAL_ADDRESS_CONST(Low, High) \ + { {(ULONG)(Low), (LONG)(High)} } + +/* + * ULONG + * NdisEqualMemory( + * IN CONST VOID *Source1, + * IN CONST VOID *Source2, + * IN ULONG Length); + */ +#define NdisEqualMemory(Source1, Source2, Length) \ + RtlEqualMemory(Source1, Source2, Length) + +/* + * VOID + * NdisFillMemory( + * IN PVOID Destination, + * IN ULONG Length, + * IN UCHAR Fill); + */ +#define NdisFillMemory(Destination, Length, Fill) \ + RtlFillMemory(Destination, Length, Fill) + +/* + * VOID + * NdisZeroMappedMemory( + * IN PVOID Destination, + * IN ULONG Length); + */ +#define NdisZeroMappedMemory(Destination, Length) \ + RtlZeroMemory(Destination, Length) + +/* + * VOID + * NdisMoveMemory( + * OUT PVOID Destination, + * IN PVOID Source, + * IN ULONG Length); + */ +#define NdisMoveMemory(Destination, Source, Length) \ + RtlCopyMemory(Destination, Source, Length) + + +/* + * VOID + * NdisRetrieveUlong( + * IN PULONG DestinationAddress, + * IN PULONG SourceAddress); + */ +#define NdisRetrieveUlong(DestinationAddress, SourceAddress) \ + RtlRetrieveUlong(DestinationAddress, SourceAddress) + + +/* + * VOID + * NdisStoreUlong( + * IN PULONG DestinationAddress, + * IN ULONG Value); + */ +#define NdisStoreUlong(DestinationAddress, Value) \ + RtlStoreUlong(DestinationAddress, Value) + + +/* + * VOID + * NdisZeroMemory( + * IN PVOID Destination, + * IN ULONG Length) + */ +#define NdisZeroMemory(Destination, Length) \ + RtlZeroMemory(Destination, Length) + + + +/* Configuration routines */ + +NDISAPI +VOID +DDKAPI +NdisOpenConfiguration( + OUT PNDIS_STATUS Status, + OUT PNDIS_HANDLE ConfigurationHandle, + IN NDIS_HANDLE WrapperConfigurationContext); + +NDISAPI +VOID +DDKAPI +NdisReadNetworkAddress( + OUT PNDIS_STATUS Status, + OUT PVOID *NetworkAddress, + OUT PUINT NetworkAddressLength, + IN NDIS_HANDLE ConfigurationHandle); + +NDISAPI +VOID +DDKAPI +NdisReadEisaSlotInformation( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE WrapperConfigurationContext, + OUT PUINT SlotNumber, + OUT PNDIS_EISA_FUNCTION_INFORMATION EisaData); + +NDISAPI +VOID +DDKAPI +NdisReadEisaSlotInformationEx( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE WrapperConfigurationContext, + OUT PUINT SlotNumber, + OUT PNDIS_EISA_FUNCTION_INFORMATION *EisaData, + OUT PUINT NumberOfFunctions); + +NDISAPI +ULONG +DDKAPI +NdisReadPciSlotInformation( + IN NDIS_HANDLE NdisAdapterHandle, + IN ULONG SlotNumber, + IN ULONG Offset, + IN PVOID Buffer, + IN ULONG Length); + +NDISAPI +ULONG +DDKAPI +NdisWritePciSlotInformation( + IN NDIS_HANDLE NdisAdapterHandle, + IN ULONG SlotNumber, + IN ULONG Offset, + IN PVOID Buffer, + IN ULONG Length); + + + +/* String management routines */ + +NDISAPI +NDIS_STATUS +DDKAPI +NdisAnsiStringToUnicodeString( + IN OUT PNDIS_STRING DestinationString, + IN PNDIS_ANSI_STRING SourceString); + +/* + * BOOLEAN + * NdisEqualString( + * IN PNDIS_STRING String1, + * IN PNDIS_STRING String2, + * IN BOOLEAN CaseInsensitive); + */ +#define NdisEqualString(_String1, _String2, _CaseInsensitive) \ + RtlEqualUnicodeString(_String1, _String2, _CaseInsensitive) + +NDISAPI +VOID +DDKAPI +NdisInitAnsiString( + IN OUT PNDIS_ANSI_STRING DestinationString, + IN PCSTR SourceString); + +NDISAPI +VOID +DDKAPI +NdisInitUnicodeString( + IN OUT PNDIS_STRING DestinationString, + IN PCWSTR SourceString); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisUnicodeStringToAnsiString( + IN OUT PNDIS_ANSI_STRING DestinationString, + IN PNDIS_STRING SourceString); + +#define NdisFreeString(_s) NdisFreeMemory((_s).Buffer, (_s).MaximumLength, 0) +#define NdisPrintString(_s) DbgPrint("%ls", (_s).Buffer) + + +/* Spin lock reoutines */ + +/* + * VOID + * NdisAllocateSpinLock( + * IN PNDIS_SPIN_LOCK SpinLock); + */ +#define NdisAllocateSpinLock(_SpinLock) \ + KeInitializeSpinLock(&(_SpinLock)->SpinLock) + +/* + * VOID + * NdisFreeSpinLock( + * IN PNDIS_SPIN_LOCK SpinLock); + */ +#define NdisFreeSpinLock(_SpinLock) + +/* + * VOID + * NdisAcquireSpinLock( + * IN PNDIS_SPIN_LOCK SpinLock); + */ +#define NdisAcquireSpinLock(_SpinLock) \ + KeAcquireSpinLock(&(_SpinLock)->SpinLock, &(_SpinLock)->OldIrql) + +/* + * VOID + * NdisReleaseSpinLock( + * IN PNDIS_SPIN_LOCK SpinLock); + */ +#define NdisReleaseSpinLock(_SpinLock) \ + KeReleaseSpinLock(&(_SpinLock)->SpinLock, (_SpinLock)->OldIrql) + +/* + * VOID + * NdisDprAcquireSpinLock( + * IN PNDIS_SPIN_LOCK SpinLock); + */ +#define NdisDprAcquireSpinLock(_SpinLock) \ +{ \ + KeAcquireSpinLockAtDpcLevel(&(_SpinLock)->SpinLock); \ + (_SpinLock)->OldIrql = DISPATCH_LEVEL; \ +} + +/* + * VOID + * NdisDprReleaseSpinLock( + * IN PNDIS_SPIN_LOCK SpinLock); + */ +#define NdisDprReleaseSpinLock(_SpinLock) \ + KeReleaseSpinLockFromDpcLevel(&(_SpinLock)->SpinLock) + + + +/* I/O routines */ + +/* + * VOID + * NdisRawReadPortBufferUchar( + * IN ULONG Port, + * OUT PUCHAR Buffer, + * IN ULONG Length); + */ +#define NdisRawReadPortBufferUchar(Port, Buffer, Length) \ + READ_PORT_BUFFER_UCHAR((PUCHAR)(Port), (PUCHAR)(Buffer), (Length)) + +/* + * VOID + * NdisRawReadPortBufferUlong( + * IN ULONG Port, + * OUT PULONG Buffer, + * IN ULONG Length); + */ +#define NdisRawReadPortBufferUlong(Port, Buffer, Length) \ + READ_PORT_BUFFER_ULONG((PULONG)(Port), (PULONG)(Buffer), (Length)) + +/* + * VOID + * NdisRawReadPortBufferUshort( + * IN ULONG Port, + * OUT PUSHORT Buffer, + * IN ULONG Length); + */ +#define NdisRawReadPortBufferUshort(Port, Buffer, Length) \ + READ_PORT_BUFFER_USHORT((PUSHORT)(Port), (PUSHORT)(Buffer), (Length)) + + +/* + * VOID + * NdisRawReadPortUchar( + * IN ULONG Port, + * OUT PUCHAR Data); + */ +#define NdisRawReadPortUchar(Port, Data) \ + *(Data) = READ_PORT_UCHAR((PUCHAR)(Port)) + +/* + * VOID + * NdisRawReadPortUlong( + * IN ULONG Port, + * OUT PULONG Data); + */ +#define NdisRawReadPortUlong(Port, Data) \ + *(Data) = READ_PORT_ULONG((PULONG)(Port)) + +/* + * VOID + * NdisRawReadPortUshort( + * IN ULONG Port, + * OUT PUSHORT Data); + */ +#define NdisRawReadPortUshort(Port, Data) \ + *(Data) = READ_PORT_USHORT((PUSHORT)(Port)) + + +/* + * VOID + * NdisRawWritePortBufferUchar( + * IN ULONG Port, + * IN PUCHAR Buffer, + * IN ULONG Length); + */ +#define NdisRawWritePortBufferUchar(Port, Buffer, Length) \ + WRITE_PORT_BUFFER_UCHAR((PUCHAR)(Port), (PUCHAR)(Buffer), (Length)) + +/* + * VOID + * NdisRawWritePortBufferUlong( + * IN ULONG Port, + * IN PULONG Buffer, + * IN ULONG Length); + */ +#define NdisRawWritePortBufferUlong(Port, Buffer, Length) \ + WRITE_PORT_BUFFER_ULONG((PULONG)(Port), (PULONG)(Buffer), (Length)) + +/* + * VOID + * NdisRawWritePortBufferUshort( + * IN ULONG Port, + * IN PUSHORT Buffer, + * IN ULONG Length); + */ +#define NdisRawWritePortBufferUshort(Port, Buffer, Length) \ + WRITE_PORT_BUFFER_USHORT((PUSHORT)(Port), (PUSHORT)(Buffer), (Length)) + + +/* + * VOID + * NdisRawWritePortUchar( + * IN ULONG Port, + * IN UCHAR Data); + */ +#define NdisRawWritePortUchar(Port, Data) \ + WRITE_PORT_UCHAR((PUCHAR)(Port), (UCHAR)(Data)) + +/* + * VOID + * NdisRawWritePortUlong( + * IN ULONG Port, + * IN ULONG Data); + */ +#define NdisRawWritePortUlong(Port, Data) \ + WRITE_PORT_ULONG((PULONG)(Port), (ULONG)(Data)) + +/* + * VOID + * NdisRawWritePortUshort( + * IN ULONG Port, + * IN USHORT Data); + */ +#define NdisRawWritePortUshort(Port, Data) \ + WRITE_PORT_USHORT((PUSHORT)(Port), (USHORT)(Data)) + + +/* + * VOID + * NdisReadRegisterUchar( + * IN PUCHAR Register, + * OUT PUCHAR Data); + */ +#define NdisReadRegisterUchar(Register, Data) \ + *(Data) = *(Register) + +/* + * VOID + * NdisReadRegisterUlong( + * IN PULONG Register, + * OUT PULONG Data); + */ +#define NdisReadRegisterUlong(Register, Data) \ + *(Data) = *(Register) + +/* + * VOID + * NdisReadRegisterUshort( + * IN PUSHORT Register, + * OUT PUSHORT Data); + */ +#define NdisReadRegisterUshort(Register, Data) \ + *(Data) = *(Register) + +/* + * VOID + * NdisReadRegisterUchar( + * IN PUCHAR Register, + * IN UCHAR Data); + */ +#define NdisWriteRegisterUchar(Register, Data) \ + WRITE_REGISTER_UCHAR((Register), (Data)) + +/* + * VOID + * NdisReadRegisterUlong( + * IN PULONG Register, + * IN ULONG Data); + */ +#define NdisWriteRegisterUlong(Register, Data) \ + WRITE_REGISTER_ULONG((Register), (Data)) + +/* + * VOID + * NdisReadRegisterUshort( + * IN PUSHORT Register, + * IN USHORT Data); + */ +#define NdisWriteRegisterUshort(Register, Data) \ + WRITE_REGISTER_USHORT((Register), (Data)) + + +/* Linked lists */ + +/* + * VOID + * NdisInitializeListHead( + * IN PLIST_ENTRY ListHead); + */ +#define NdisInitializeListHead(_ListHead) \ + InitializeListHead(_ListHead) + +/* + * PLIST_ENTRY + * NdisInterlockedInsertHeadList( + * IN PLIST_ENTRY ListHead, + * IN PLIST_ENTRY ListEntry, + * IN PNDIS_SPIN_LOCK SpinLock); + */ +#define NdisInterlockedInsertHeadList(_ListHead, _ListEntry, _SpinLock) \ + ExInterlockedInsertHeadList(_ListHead, _ListEntry, &(_SpinLock)->SpinLock) + +/* + * PLIST_ENTRY + * NdisInterlockedInsertTailList( + * IN PLIST_ENTRY ListHead, + * IN PLIST_ENTRY ListEntry, + * IN PNDIS_SPIN_LOCK SpinLock); + */ +#define NdisInterlockedInsertTailList(_ListHead, _ListEntry, _SpinLock) \ + ExInterlockedInsertTailList(_ListHead, _ListEntry, &(_SpinLock)->SpinLock) + +/* + * PLIST_ENTRY + * NdisInterlockedRemoveHeadList( + * IN PLIST_ENTRY ListHead, + * IN PNDIS_SPIN_LOCK SpinLock); +*/ +#define NdisInterlockedRemoveHeadList(_ListHead, _SpinLock) \ + ExInterlockedRemoveHeadList(_ListHead, &(_SpinLock)->SpinLock) + +/* + * VOID + * NdisInitializeSListHead( + * IN PSLIST_HEADER SListHead); + */ +#define NdisInitializeSListHead(SListHead) ExInitializeSListHead(SListHead) + +/* + * USHORT NdisQueryDepthSList( + * IN PSLIST_HEADER SListHead); + */ +#define NdisQueryDepthSList(SListHead) ExQueryDepthSList(SListHead) + + + +/* Interlocked routines */ + +/* + * LONG + * NdisInterlockedDecrement( + * IN PLONG Addend); + */ +#define NdisInterlockedDecrement(Addend) InterlockedDecrement(Addend) + +/* + * LONG + * NdisInterlockedIncrement( + * IN PLONG Addend); + */ +#define NdisInterlockedIncrement(Addend) InterlockedIncrement(Addend) + +/* + * VOID + * NdisInterlockedAddUlong( + * IN PULONG Addend, + * IN ULONG Increment, + * IN PNDIS_SPIN_LOCK SpinLock); + */ +#define NdisInterlockedAddUlong(_Addend, _Increment, _SpinLock) \ + ExInterlockedAddUlong(_Addend, _Increment, &(_SpinLock)->SpinLock) + + + +/* Miscellaneous routines */ + +NDISAPI +VOID +DDKAPI +NdisCloseConfiguration( + IN NDIS_HANDLE ConfigurationHandle); + +NDISAPI +VOID +DDKAPI +NdisReadConfiguration( + OUT PNDIS_STATUS Status, + OUT PNDIS_CONFIGURATION_PARAMETER *ParameterValue, + IN NDIS_HANDLE ConfigurationHandle, + IN PNDIS_STRING Keyword, + IN NDIS_PARAMETER_TYPE ParameterType); + +NDISAPI +VOID +DDKAPI +NdisWriteConfiguration( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE WrapperConfigurationContext, + IN PNDIS_STRING Keyword, + IN PNDIS_CONFIGURATION_PARAMETER *ParameterValue); + +NDISAPI +VOID +DDKCDECLAPI +NdisWriteErrorLogEntry( + IN NDIS_HANDLE NdisAdapterHandle, + IN NDIS_ERROR_CODE ErrorCode, + IN ULONG NumberOfErrorValues, + IN ...); + +/* + * VOID + * NdisStallExecution( + * IN UINT MicrosecondsToStall) + */ +#define NdisStallExecution KeStallExecutionProcessor + +/* + * VOID + * NdisGetCurrentSystemTime( + * IN PLARGE_INTEGER pSystemTime); + */ +#define NdisGetCurrentSystemTime KeQuerySystemTime + +NDISAPI +VOID +DDKAPI +NdisGetCurrentProcessorCpuUsage( + OUT PULONG pCpuUsage); + + + +/* NDIS helper macros */ + +/* + * VOID + * NDIS_INIT_FUNCTION(FunctionName) + */ +#define NDIS_INIT_FUNCTION(FunctionName) \ + alloc_text(init, FunctionName) + +/* + * VOID + * NDIS_PAGABLE_FUNCTION(FunctionName) + */ +#define NDIS_PAGEABLE_FUNCTION(FunctionName) \ + alloc_text(page, FunctionName) + +#define NDIS_PAGABLE_FUNCTION NDIS_PAGEABLE_FUNCTION + + +/* NDIS 4.0 extensions */ + +NDISAPI +VOID +DDKAPI +NdisMFreeSharedMemory( + IN NDIS_HANDLE MiniportAdapterHandle, + IN ULONG Length, + IN BOOLEAN Cached, + IN PVOID VirtualAddress, + IN NDIS_PHYSICAL_ADDRESS PhysicalAddress); + +NDISAPI +VOID +DDKAPI +NdisMWanIndicateReceive( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_HANDLE NdisLinkContext, + IN PUCHAR PacketBuffer, + IN UINT PacketSize); + +NDISAPI +VOID +DDKAPI +NdisMWanIndicateReceiveComplete( + IN NDIS_HANDLE MiniportAdapterHandle); + +NDISAPI +VOID +DDKAPI +NdisMWanSendComplete( + IN NDIS_HANDLE MiniportAdapterHandle, + IN PNDIS_WAN_PACKET Packet, + IN NDIS_STATUS Status); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisPciAssignResources( + IN NDIS_HANDLE NdisMacHandle, + IN NDIS_HANDLE NdisWrapperHandle, + IN NDIS_HANDLE WrapperConfigurationContext, + IN ULONG SlotNumber, + OUT PNDIS_RESOURCE_LIST *AssignedResources); + + +/* NDIS 5.0 extensions */ + +NDISAPI +VOID +DDKAPI +NdisAcquireReadWriteLock( + IN PNDIS_RW_LOCK Lock, + IN BOOLEAN fWrite, + IN PLOCK_STATE LockState); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisAllocateMemoryWithTag( + OUT PVOID *VirtualAddress, + IN UINT Length, + IN ULONG Tag); + +NDISAPI +VOID +DDKAPI +NdisAllocatePacketPoolEx( + OUT PNDIS_STATUS Status, + OUT PNDIS_HANDLE PoolHandle, + IN UINT NumberOfDescriptors, + IN UINT NumberOfOverflowDescriptors, + IN UINT ProtocolReservedLength); + +NDISAPI +VOID +DDKAPI +NdisCompletePnPEvent( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisBindingHandle, + IN PNET_PNP_EVENT NetPnPEvent); + +NDISAPI +VOID +DDKAPI +NdisGetCurrentProcessorCounts( + OUT PULONG pIdleCount, + OUT PULONG pKernelAndUser, + OUT PULONG pIndex); + +NDISAPI +VOID +DDKAPI +NdisGetDriverHandle( + IN PNDIS_HANDLE NdisBindingHandle, + OUT PNDIS_HANDLE NdisDriverHandle); + +NDISAPI +PNDIS_PACKET +DDKAPI +NdisGetReceivedPacket( + IN PNDIS_HANDLE NdisBindingHandle, + IN PNDIS_HANDLE MacContext); + +NDISAPI +VOID +DDKAPI +NdisGetSystemUptime( + OUT PULONG pSystemUpTime); + +NDISAPI +VOID +DDKAPI +NdisInitializeReadWriteLock( + IN PNDIS_RW_LOCK Lock); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisMDeregisterDevice( + IN NDIS_HANDLE NdisDeviceHandle); + +NDISAPI +VOID +DDKAPI +NdisMGetDeviceProperty( + IN NDIS_HANDLE MiniportAdapterHandle, + IN OUT PDEVICE_OBJECT *PhysicalDeviceObject OPTIONAL, + IN OUT PDEVICE_OBJECT *FunctionalDeviceObject OPTIONAL, + IN OUT PDEVICE_OBJECT *NextDeviceObject OPTIONAL, + IN OUT PCM_RESOURCE_LIST *AllocatedResources OPTIONAL, + IN OUT PCM_RESOURCE_LIST *AllocatedResourcesTranslated OPTIONAL); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisMInitializeScatterGatherDma( + IN NDIS_HANDLE MiniportAdapterHandle, + IN BOOLEAN Dma64BitAddresses, + IN ULONG MaximumPhysicalMapping); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisMPromoteMiniport( + IN NDIS_HANDLE MiniportAdapterHandle); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisMQueryAdapterInstanceName( + OUT PNDIS_STRING AdapterInstanceName, + IN NDIS_HANDLE MiniportAdapterHandle); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisMRegisterDevice( + IN NDIS_HANDLE NdisWrapperHandle, + IN PNDIS_STRING DeviceName, + IN PNDIS_STRING SymbolicName, + IN PDRIVER_DISPATCH MajorFunctions[], + OUT PDEVICE_OBJECT *pDeviceObject, + OUT NDIS_HANDLE *NdisDeviceHandle); + +NDISAPI +VOID +DDKAPI +NdisMRegisterUnloadHandler( + IN NDIS_HANDLE NdisWrapperHandle, + IN PDRIVER_UNLOAD UnloadHandler); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisMRemoveMiniport( + IN NDIS_HANDLE MiniportAdapterHandle); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisMSetMiniportSecondary( + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_HANDLE PrimaryMiniportAdapterHandle); + +NDISAPI +VOID +DDKAPI +NdisOpenConfigurationKeyByIndex( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE ConfigurationHandle, + IN ULONG Index, + OUT PNDIS_STRING KeyName, + OUT PNDIS_HANDLE KeyHandle); + +NDISAPI +VOID +DDKAPI +NdisOpenConfigurationKeyByName( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE ConfigurationHandle, + IN PNDIS_STRING SubKeyName, + OUT PNDIS_HANDLE SubKeyHandle); + +NDISAPI +UINT +DDKAPI +NdisPacketPoolUsage( + IN NDIS_HANDLE PoolHandle); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisQueryAdapterInstanceName( + OUT PNDIS_STRING AdapterInstanceName, + IN NDIS_HANDLE NdisBindingHandle); + +NDISAPI +ULONG +DDKAPI +NdisReadPcmciaAttributeMemory( + IN NDIS_HANDLE NdisAdapterHandle, + IN ULONG Offset, + IN PVOID Buffer, + IN ULONG Length); + +NDISAPI +VOID +DDKAPI +NdisReleaseReadWriteLock( + IN PNDIS_RW_LOCK Lock, + IN PLOCK_STATE LockState); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisWriteEventLogEntry( + IN PVOID LogHandle, + IN NDIS_STATUS EventCode, + IN ULONG UniqueEventValue, + IN USHORT NumStrings, + IN PVOID StringsList OPTIONAL, + IN ULONG DataSize, + IN PVOID Data OPTIONAL); + +NDISAPI +ULONG +DDKAPI +NdisWritePcmciaAttributeMemory( + IN NDIS_HANDLE NdisAdapterHandle, + IN ULONG Offset, + IN PVOID Buffer, + IN ULONG Length); + + +/* Connectionless services */ + +NDISAPI +NDIS_STATUS +DDKAPI +NdisClAddParty( + IN NDIS_HANDLE NdisVcHandle, + IN NDIS_HANDLE ProtocolPartyContext, + IN OUT PCO_CALL_PARAMETERS CallParameters, + OUT PNDIS_HANDLE NdisPartyHandle); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisClCloseAddressFamily( + IN NDIS_HANDLE NdisAfHandle); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisClCloseCall( + IN NDIS_HANDLE NdisVcHandle, + IN NDIS_HANDLE NdisPartyHandle OPTIONAL, + IN PVOID Buffer OPTIONAL, + IN UINT Size); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisClDeregisterSap( + IN NDIS_HANDLE NdisSapHandle); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisClDropParty( + IN NDIS_HANDLE NdisPartyHandle, + IN PVOID Buffer OPTIONAL, + IN UINT Size); + +NDISAPI +VOID +DDKAPI +NdisClIncomingCallComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisVcHandle, + IN PCO_CALL_PARAMETERS CallParameters); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisClMakeCall( + IN NDIS_HANDLE NdisVcHandle, + IN OUT PCO_CALL_PARAMETERS CallParameters, + IN NDIS_HANDLE ProtocolPartyContext OPTIONAL, + OUT PNDIS_HANDLE NdisPartyHandle OPTIONAL); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisClModifyCallQoS( + IN NDIS_HANDLE NdisVcHandle, + IN PCO_CALL_PARAMETERS CallParameters); + + +NDISAPI +NDIS_STATUS +DDKAPI +NdisClOpenAddressFamily( + IN NDIS_HANDLE NdisBindingHandle, + IN PCO_ADDRESS_FAMILY AddressFamily, + IN NDIS_HANDLE ProtocolAfContext, + IN PNDIS_CLIENT_CHARACTERISTICS ClCharacteristics, + IN UINT SizeOfClCharacteristics, + OUT PNDIS_HANDLE NdisAfHandle); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisClRegisterSap( + IN NDIS_HANDLE NdisAfHandle, + IN NDIS_HANDLE ProtocolSapContext, + IN PCO_SAP Sap, + OUT PNDIS_HANDLE NdisSapHandle); + + +/* Call Manager services */ + +NDISAPI +NDIS_STATUS +DDKAPI +NdisCmActivateVc( + IN NDIS_HANDLE NdisVcHandle, + IN OUT PCO_CALL_PARAMETERS CallParameters); + +NDISAPI +VOID +DDKAPI +NdisCmAddPartyComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisPartyHandle, + IN NDIS_HANDLE CallMgrPartyContext OPTIONAL, + IN PCO_CALL_PARAMETERS CallParameters); + +NDISAPI +VOID +DDKAPI +NdisCmCloseAddressFamilyComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisAfHandle); + +NDISAPI +VOID +DDKAPI +NdisCmCloseCallComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisVcHandle, + IN NDIS_HANDLE NdisPartyHandle OPTIONAL); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisCmDeactivateVc( + IN NDIS_HANDLE NdisVcHandle); + +NDISAPI +VOID +DDKAPI +NdisCmDeregisterSapComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisSapHandle); + +NDISAPI +VOID +DDKAPI +NdisCmDispatchCallConnected( + IN NDIS_HANDLE NdisVcHandle); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisCmDispatchIncomingCall( + IN NDIS_HANDLE NdisSapHandle, + IN NDIS_HANDLE NdisVcHandle, + IN PCO_CALL_PARAMETERS CallParameters); + +NDISAPI +VOID +DDKAPI +NdisCmDispatchIncomingCallQoSChange( + IN NDIS_HANDLE NdisVcHandle, + IN PCO_CALL_PARAMETERS CallParameters); + +NDISAPI +VOID +DDKAPI +NdisCmDispatchIncomingCloseCall( + IN NDIS_STATUS CloseStatus, + IN NDIS_HANDLE NdisVcHandle, + IN PVOID Buffer OPTIONAL, + IN UINT Size); + +NDISAPI +VOID +DDKAPI +NdisCmDispatchIncomingDropParty( + IN NDIS_STATUS DropStatus, + IN NDIS_HANDLE NdisPartyHandle, + IN PVOID Buffer OPTIONAL, + IN UINT Size); + +NDISAPI +VOID +DDKAPI +NdisCmDropPartyComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisPartyHandle); + +NDISAPI +VOID +DDKAPI +NdisCmMakeCallComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisVcHandle, + IN NDIS_HANDLE NdisPartyHandle OPTIONAL, + IN NDIS_HANDLE CallMgrPartyContext OPTIONAL, + IN PCO_CALL_PARAMETERS CallParameters); + +NDISAPI +VOID +DDKAPI +NdisCmModifyCallQoSComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisVcHandle, + IN PCO_CALL_PARAMETERS CallParameters); + +NDISAPI +VOID +DDKAPI +NdisCmOpenAddressFamilyComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisAfHandle, + IN NDIS_HANDLE CallMgrAfContext); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisCmRegisterAddressFamily( + IN NDIS_HANDLE NdisBindingHandle, + IN PCO_ADDRESS_FAMILY AddressFamily, + IN PNDIS_CALL_MANAGER_CHARACTERISTICS CmCharacteristics, + IN UINT SizeOfCmCharacteristics); + +NDISAPI +VOID +DDKAPI +NdisCmRegisterSapComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisSapHandle, + IN NDIS_HANDLE CallMgrSapContext); + + +NDISAPI +NDIS_STATUS +DDKAPI +NdisMCmActivateVc( + IN NDIS_HANDLE NdisVcHandle, + IN PCO_CALL_PARAMETERS CallParameters); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisMCmCreateVc( + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_HANDLE NdisAfHandle, + IN NDIS_HANDLE MiniportVcContext, + OUT PNDIS_HANDLE NdisVcHandle); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisMCmDeactivateVc( + IN NDIS_HANDLE NdisVcHandle); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisMCmDeleteVc( + IN NDIS_HANDLE NdisVcHandle); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisMCmRegisterAddressFamily( + IN NDIS_HANDLE MiniportAdapterHandle, + IN PCO_ADDRESS_FAMILY AddressFamily, + IN PNDIS_CALL_MANAGER_CHARACTERISTICS CmCharacteristics, + IN UINT SizeOfCmCharacteristics); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisMCmRequest( + IN NDIS_HANDLE NdisAfHandle, + IN NDIS_HANDLE NdisVcHandle OPTIONAL, + IN NDIS_HANDLE NdisPartyHandle OPTIONAL, + IN OUT PNDIS_REQUEST NdisRequest); + + +/* Connection-oriented services */ + +NDISAPI +NDIS_STATUS +DDKAPI +NdisCoCreateVc( + IN NDIS_HANDLE NdisBindingHandle, + IN NDIS_HANDLE NdisAfHandle OPTIONAL, + IN NDIS_HANDLE ProtocolVcContext, + IN OUT PNDIS_HANDLE NdisVcHandle); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisCoDeleteVc( + IN NDIS_HANDLE NdisVcHandle); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisCoRequest( + IN NDIS_HANDLE NdisBindingHandle, + IN NDIS_HANDLE NdisAfHandle OPTIONAL, + IN NDIS_HANDLE NdisVcHandle OPTIONAL, + IN NDIS_HANDLE NdisPartyHandle OPTIONAL, + IN OUT PNDIS_REQUEST NdisRequest); + +NDISAPI +VOID +DDKAPI +NdisCoRequestComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisAfHandle, + IN NDIS_HANDLE NdisVcHandle OPTIONAL, + IN NDIS_HANDLE NdisPartyHandle OPTIONAL, + IN PNDIS_REQUEST NdisRequest); + +NDISAPI +VOID +DDKAPI +NdisCoSendPackets( + IN NDIS_HANDLE NdisVcHandle, + IN PPNDIS_PACKET PacketArray, + IN UINT NumberOfPackets); + +NDISAPI +VOID +DDKAPI +NdisMCoActivateVcComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisVcHandle, + IN PCO_CALL_PARAMETERS CallParameters); + +NDISAPI +VOID +DDKAPI +NdisMCoDeactivateVcComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisVcHandle); + +NDISAPI +VOID +DDKAPI +NdisMCoIndicateReceivePacket( + IN NDIS_HANDLE NdisVcHandle, + IN PPNDIS_PACKET PacketArray, + IN UINT NumberOfPackets); + +NDISAPI +VOID +DDKAPI +NdisMCoIndicateStatus( + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_HANDLE NdisVcHandle OPTIONAL, + IN NDIS_STATUS GeneralStatus, + IN PVOID StatusBuffer OPTIONAL, + IN ULONG StatusBufferSize); + +NDISAPI +VOID +DDKAPI +NdisMCoReceiveComplete( + IN NDIS_HANDLE MiniportAdapterHandle); + +NDISAPI +VOID +DDKAPI +NdisMCoRequestComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE MiniportAdapterHandle, + IN PNDIS_REQUEST Request); + +NDISAPI +VOID +DDKAPI +NdisMCoSendComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisVcHandle, + IN PNDIS_PACKET Packet); + + +/* NDIS 5.0 extensions for intermediate drivers */ + +NDISAPI +VOID +DDKAPI +NdisIMAssociateMiniport( + IN NDIS_HANDLE DriverHandle, + IN NDIS_HANDLE ProtocolHandle); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisIMCancelInitializeDeviceInstance( + IN NDIS_HANDLE DriverHandle, + IN PNDIS_STRING DeviceInstance); + +NDISAPI +VOID +DDKAPI +NdisIMCopySendCompletePerPacketInfo( + IN PNDIS_PACKET DstPacket, + IN PNDIS_PACKET SrcPacket); + +NDISAPI +VOID +DDKAPI +NdisIMCopySendPerPacketInfo( + IN PNDIS_PACKET DstPacket, + IN PNDIS_PACKET SrcPacket); + +NDISAPI +VOID +DDKAPI +NdisIMDeregisterLayeredMiniport( + IN NDIS_HANDLE DriverHandle); + +NDISAPI +NDIS_HANDLE +DDKAPI +NdisIMGetBindingContext( + IN NDIS_HANDLE NdisBindingHandle); + +NDISAPI +NDIS_HANDLE +DDKAPI +NdisIMGetDeviceContext( + IN NDIS_HANDLE MiniportAdapterHandle); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisIMInitializeDeviceInstanceEx( + IN NDIS_HANDLE DriverHandle, + IN PNDIS_STRING DriverInstance, + IN NDIS_HANDLE DeviceContext OPTIONAL); + +NDISAPI +PSINGLE_LIST_ENTRY +DDKAPI +NdisInterlockedPopEntrySList( + IN PSLIST_HEADER ListHead, + IN PKSPIN_LOCK Lock); + +NDISAPI +PSINGLE_LIST_ENTRY +DDKAPI +NdisInterlockedPushEntrySList( + IN PSLIST_HEADER ListHead, + IN PSINGLE_LIST_ENTRY ListEntry, + IN PKSPIN_LOCK Lock); + +NDISAPI +VOID +DDKAPI +NdisQueryBufferSafe( + IN PNDIS_BUFFER Buffer, + OUT PVOID *VirtualAddress OPTIONAL, + OUT PUINT Length, + IN UINT Priority); + + +/* Prototypes for NDIS_MINIPORT_CHARACTERISTICS */ + +typedef BOOLEAN DDKAPI +(*W_CHECK_FOR_HANG_HANDLER)( + IN NDIS_HANDLE MiniportAdapterContext); + +typedef VOID DDKAPI +(*W_DISABLE_INTERRUPT_HANDLER)( + IN NDIS_HANDLE MiniportAdapterContext); + +typedef VOID DDKAPI +(*W_ENABLE_INTERRUPT_HANDLER)( + IN NDIS_HANDLE MiniportAdapterContext); + +typedef VOID DDKAPI +(*W_HALT_HANDLER)( + IN NDIS_HANDLE MiniportAdapterContext); + +typedef VOID DDKAPI +(*W_HANDLE_INTERRUPT_HANDLER)( + IN NDIS_HANDLE MiniportAdapterContext); + +typedef NDIS_STATUS DDKAPI +(*W_INITIALIZE_HANDLER)( + OUT PNDIS_STATUS OpenErrorStatus, + OUT PUINT SelectedMediumIndex, + IN PNDIS_MEDIUM MediumArray, + IN UINT MediumArraySize, + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_HANDLE WrapperConfigurationContext); + +typedef VOID DDKAPI +(*W_ISR_HANDLER)( + OUT PBOOLEAN InterruptRecognized, + OUT PBOOLEAN QueueMiniportHandleInterrupt, + IN NDIS_HANDLE MiniportAdapterContext); + +typedef NDIS_STATUS DDKAPI +(*W_QUERY_INFORMATION_HANDLER)( + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_OID Oid, + IN PVOID InformationBuffer, + IN ULONG InformationBufferLength, + OUT PULONG BytesWritten, + OUT PULONG BytesNeeded); + +typedef NDIS_STATUS DDKAPI +(*W_RECONFIGURE_HANDLER)( + OUT PNDIS_STATUS OpenErrorStatus, + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_HANDLE WrapperConfigurationContext); + +typedef NDIS_STATUS DDKAPI +(*W_RESET_HANDLER)( + OUT PBOOLEAN AddressingReset, + IN NDIS_HANDLE MiniportAdapterContext); + +typedef NDIS_STATUS DDKAPI +(*W_SEND_HANDLER)( + IN NDIS_HANDLE MiniportAdapterContext, + IN PNDIS_PACKET Packet, + IN UINT Flags); + +typedef NDIS_STATUS DDKAPI +(*WM_SEND_HANDLER)( + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_HANDLE NdisLinkHandle, + IN PNDIS_WAN_PACKET Packet); + +typedef NDIS_STATUS DDKAPI +(*W_SET_INFORMATION_HANDLER)( + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_OID Oid, + IN PVOID InformationBuffer, + IN ULONG InformationBufferLength, + OUT PULONG BytesRead, + OUT PULONG BytesNeeded); + +typedef NDIS_STATUS DDKAPI +(*W_TRANSFER_DATA_HANDLER)( + OUT PNDIS_PACKET Packet, + OUT PUINT BytesTransferred, + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_HANDLE MiniportReceiveContext, + IN UINT ByteOffset, + IN UINT BytesToTransfer); + +typedef NDIS_STATUS DDKAPI +(*WM_TRANSFER_DATA_HANDLER)( + VOID); + + +/* NDIS structures available only to miniport drivers */ + +#define NDIS30_MINIPORT_CHARACTERISTICS_S \ + UCHAR MajorNdisVersion; \ + UCHAR MinorNdisVersion; \ + UINT Reserved; \ + W_CHECK_FOR_HANG_HANDLER CheckForHangHandler; \ + W_DISABLE_INTERRUPT_HANDLER DisableInterruptHandler; \ + W_ENABLE_INTERRUPT_HANDLER EnableInterruptHandler; \ + W_HALT_HANDLER HaltHandler; \ + W_HANDLE_INTERRUPT_HANDLER HandleInterruptHandler; \ + W_INITIALIZE_HANDLER InitializeHandler; \ + W_ISR_HANDLER ISRHandler; \ + W_QUERY_INFORMATION_HANDLER QueryInformationHandler; \ + W_RECONFIGURE_HANDLER ReconfigureHandler; \ + W_RESET_HANDLER ResetHandler; \ + _ANONYMOUS_UNION union { \ + W_SEND_HANDLER SendHandler; \ + WM_SEND_HANDLER WanSendHandler; \ + } _UNION_NAME(u1); \ + W_SET_INFORMATION_HANDLER SetInformationHandler; \ + _ANONYMOUS_UNION union { \ + W_TRANSFER_DATA_HANDLER TransferDataHandler; \ + WM_TRANSFER_DATA_HANDLER WanTransferDataHandler; \ + } _UNION_NAME(u2); + +typedef struct _NDIS30_MINIPORT_CHARACTERISTICS { + NDIS30_MINIPORT_CHARACTERISTICS_S +} NDIS30_MINIPORT_CHARACTERISTICS, *PSNDIS30_MINIPORT_CHARACTERISTICS; + + +/* Extensions for NDIS 4.0 miniports */ + +typedef VOID DDKAPI +(*W_SEND_PACKETS_HANDLER)( + IN NDIS_HANDLE MiniportAdapterContext, + IN PPNDIS_PACKET PacketArray, + IN UINT NumberOfPackets); + +typedef VOID DDKAPI +(*W_RETURN_PACKET_HANDLER)( + IN NDIS_HANDLE MiniportAdapterContext, + IN PNDIS_PACKET Packet); + +typedef VOID DDKAPI +(*W_ALLOCATE_COMPLETE_HANDLER)( + IN NDIS_HANDLE MiniportAdapterContext, + IN PVOID VirtualAddress, + IN PNDIS_PHYSICAL_ADDRESS PhysicalAddress, + IN ULONG Length, + IN PVOID Context); + +#ifdef __cplusplus + +#define NDIS40_MINIPORT_CHARACTERISTICS_S \ + NDIS30_MINIPORT_CHARACTERISTICS Ndis30Chars; \ + W_RETURN_PACKET_HANDLER ReturnPacketHandler; \ + W_SEND_PACKETS_HANDLER SendPacketsHandler; \ + W_ALLOCATE_COMPLETE_HANDLER AllocateCompleteHandler; + +#else /* !__cplusplus */ + +#define NDIS40_MINIPORT_CHARACTERISTICS_S \ + NDIS30_MINIPORT_CHARACTERISTICS_S \ + W_RETURN_PACKET_HANDLER ReturnPacketHandler; \ + W_SEND_PACKETS_HANDLER SendPacketsHandler; \ + W_ALLOCATE_COMPLETE_HANDLER AllocateCompleteHandler; + +#endif /* !__cplusplus */ + +typedef struct _NDIS40_MINIPORT_CHARACTERISTICS { + NDIS40_MINIPORT_CHARACTERISTICS_S +} NDIS40_MINIPORT_CHARACTERISTICS, *PNDIS40_MINIPORT_CHARACTERISTICS; + + +/* Extensions for NDIS 5.0 miniports */ + +typedef NDIS_STATUS DDKAPI +(*W_CO_CREATE_VC_HANDLER)( + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_HANDLE NdisVcHandle, + OUT PNDIS_HANDLE MiniportVcContext); + +typedef NDIS_STATUS DDKAPI +(*W_CO_DELETE_VC_HANDLER)( + IN NDIS_HANDLE MiniportVcContext); + +typedef NDIS_STATUS DDKAPI +(*W_CO_ACTIVATE_VC_HANDLER)( + IN NDIS_HANDLE MiniportVcContext, + IN OUT PCO_CALL_PARAMETERS CallParameters); + +typedef NDIS_STATUS DDKAPI +(*W_CO_DEACTIVATE_VC_HANDLER)( + IN NDIS_HANDLE MiniportVcContext); + +typedef VOID DDKAPI +(*W_CO_SEND_PACKETS_HANDLER)( + IN NDIS_HANDLE MiniportVcContext, + IN PPNDIS_PACKET PacketArray, + IN UINT NumberOfPackets); + +typedef NDIS_STATUS DDKAPI +(*W_CO_REQUEST_HANDLER)( + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_HANDLE MiniportVcContext OPTIONAL, + IN OUT PNDIS_REQUEST NdisRequest); + +#ifdef __cplusplus + +#define NDIS50_MINIPORT_CHARACTERISTICS_S \ + NDIS40_MINIPORT_CHARACTERISTICS Ndis40Chars; \ + W_CO_CREATE_VC_HANDLER CoCreateVcHandler; \ + W_CO_DELETE_VC_HANDLER CoDeleteVcHandler; \ + W_CO_ACTIVATE_VC_HANDLER CoActivateVcHandler; \ + W_CO_DEACTIVATE_VC_HANDLER CoDeactivateVcHandler; \ + W_CO_SEND_PACKETS_HANDLER CoSendPacketsHandler; \ + W_CO_REQUEST_HANDLER CoRequestHandler; + +#else /* !__cplusplus */ + +#define NDIS50_MINIPORT_CHARACTERISTICS_S \ + NDIS40_MINIPORT_CHARACTERISTICS_S \ + W_CO_CREATE_VC_HANDLER CoCreateVcHandler; \ + W_CO_DELETE_VC_HANDLER CoDeleteVcHandler; \ + W_CO_ACTIVATE_VC_HANDLER CoActivateVcHandler; \ + W_CO_DEACTIVATE_VC_HANDLER CoDeactivateVcHandler; \ + W_CO_SEND_PACKETS_HANDLER CoSendPacketsHandler; \ + W_CO_REQUEST_HANDLER CoRequestHandler; + +#endif /* !__cplusplus */ + +typedef struct _NDIS50_MINIPORT_CHARACTERISTICS { + NDIS50_MINIPORT_CHARACTERISTICS_S +} NDIS50_MINIPORT_CHARACTERISTICS, *PSNDIS50_MINIPORT_CHARACTERISTICS; + + +/* Extensions for NDIS 5.1 miniports */ + +typedef VOID DDKAPI +(*W_CANCEL_SEND_PACKETS_HANDLER)( + IN NDIS_HANDLE MiniportAdapterContext, + IN PVOID CancelId); + + +#if defined(NDIS51) +typedef struct _NDIS_MINIPORT_CHARACTERISTICS { + NDIS50_MINIPORT_CHARACTERISTICS_S +} NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS; +#elif defined(NDIS50) +typedef struct _NDIS_MINIPORT_CHARACTERISTICS { + NDIS50_MINIPORT_CHARACTERISTICS_S +} NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS; +#elif defined(NDIS40) +typedef struct _NDIS_MINIPORT_CHARACTERISTICS { + NDIS40_MINIPORT_CHARACTERISTICS_S +} NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS; +#elif defined(NDIS30) +typedef struct _NDIS_MINIPORT_CHARACTERISTICS { + NDIS30_MINIPORT_CHARACTERISTICS_S +} NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS; +#endif /* NDIS30 */ + + +typedef NDIS_STATUS DDKAPI +(*SEND_HANDLER)( + IN NDIS_HANDLE MacBindingHandle, + IN PNDIS_PACKET Packet); + +typedef NDIS_STATUS DDKAPI +(*TRANSFER_DATA_HANDLER)( + IN NDIS_HANDLE MacBindingHandle, + IN NDIS_HANDLE MacReceiveContext, + IN UINT ByteOffset, + IN UINT BytesToTransfer, + OUT PNDIS_PACKET Packet, + OUT PUINT BytesTransferred); + +typedef NDIS_STATUS DDKAPI +(*RESET_HANDLER)( + IN NDIS_HANDLE MacBindingHandle); + +typedef NDIS_STATUS DDKAPI +(*REQUEST_HANDLER)( + IN NDIS_HANDLE MacBindingHandle, + IN PNDIS_REQUEST NdisRequest); + + + +/* Structures available only to full MAC drivers */ + +typedef BOOLEAN DDKAPI +(*PNDIS_INTERRUPT_SERVICE)( + IN PVOID InterruptContext); + +typedef VOID DDKAPI +(*PNDIS_DEFERRED_PROCESSING)( + IN PVOID SystemSpecific1, + IN PVOID InterruptContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + + + +typedef struct _NDIS_MINIPORT_BLOCK NDIS_MINIPORT_BLOCK, *PNDIS_MINIPORT_BLOCK; +typedef struct _NDIS_PROTOCOL_BLOCK NDIS_PROTOCOL_BLOCK, *PNDIS_PROTOCOL_BLOCK; +typedef struct _NDIS_OPEN_BLOCK NDIS_OPEN_BLOCK, *PNDIS_OPEN_BLOCK; +typedef struct _NDIS_M_DRIVER_BLOCK NDIS_M_DRIVER_BLOCK, *PNDIS_M_DRIVER_BLOCK; +typedef struct _NDIS_AF_LIST NDIS_AF_LIST, *PNDIS_AF_LIST; + + +typedef struct _NDIS_MINIPORT_INTERRUPT { + PKINTERRUPT InterruptObject; + KSPIN_LOCK DpcCountLock; + PVOID MiniportIdField; + W_ISR_HANDLER MiniportIsr; + W_HANDLE_INTERRUPT_HANDLER MiniportDpc; + KDPC InterruptDpc; + PNDIS_MINIPORT_BLOCK Miniport; + UCHAR DpcCount; + BOOLEAN Filler1; + KEVENT DpcsCompletedEvent; + BOOLEAN SharedInterrupt; + BOOLEAN IsrRequested; +} NDIS_MINIPORT_INTERRUPT, *PNDIS_MINIPORT_INTERRUPT; + +typedef struct _NDIS_MINIPORT_TIMER { + KTIMER Timer; + KDPC Dpc; + PNDIS_TIMER_FUNCTION MiniportTimerFunction; + PVOID MiniportTimerContext; + PNDIS_MINIPORT_BLOCK Miniport; + struct _NDIS_MINIPORT_TIMER *NextDeferredTimer; +} NDIS_MINIPORT_TIMER, *PNDIS_MINIPORT_TIMER; + +typedef struct _NDIS_INTERRUPT { + PKINTERRUPT InterruptObject; + KSPIN_LOCK DpcCountLock; + PNDIS_INTERRUPT_SERVICE MacIsr; + PNDIS_DEFERRED_PROCESSING MacDpc; + KDPC InterruptDpc; + PVOID InterruptContext; + UCHAR DpcCount; + BOOLEAN Removing; + KEVENT DpcsCompletedEvent; +} NDIS_INTERRUPT, *PNDIS_INTERRUPT; + + +typedef struct _MAP_REGISTER_ENTRY { + PVOID MapRegister; + BOOLEAN WriteToDevice; +} MAP_REGISTER_ENTRY, *PMAP_REGISTER_ENTRY; + + +typedef enum _NDIS_WORK_ITEM_TYPE { + NdisWorkItemRequest, + NdisWorkItemSend, + NdisWorkItemReturnPackets, + NdisWorkItemResetRequested, + NdisWorkItemResetInProgress, + NdisWorkItemHalt, + NdisWorkItemSendLoopback, + NdisWorkItemMiniportCallback, + NdisMaxWorkItems +} NDIS_WORK_ITEM_TYPE, *PNDIS_WORK_ITEM_TYPE; + +#define NUMBER_OF_WORK_ITEM_TYPES NdisMaxWorkItems +#define NUMBER_OF_SINGLE_WORK_ITEMS 6 + +typedef struct _NDIS_MINIPORT_WORK_ITEM { + SINGLE_LIST_ENTRY Link; + NDIS_WORK_ITEM_TYPE WorkItemType; + PVOID WorkItemContext; +} NDIS_MINIPORT_WORK_ITEM, *PNDIS_MINIPORT_WORK_ITEM; + + +typedef struct _NDIS_BIND_PATHS { + UINT Number; + NDIS_STRING Paths[1]; +} NDIS_BIND_PATHS, *PNDIS_BIND_PATHS; + +#define DECLARE_UNKNOWN_STRUCT(BaseName) \ + typedef struct _##BaseName BaseName, *P##BaseName; + +#define DECLARE_UNKNOWN_PROTOTYPE(Name) \ + typedef VOID (*(Name))(VOID); + +#define ETH_LENGTH_OF_ADDRESS 6 + +DECLARE_UNKNOWN_STRUCT(ETH_BINDING_INFO) + +DECLARE_UNKNOWN_PROTOTYPE(ETH_ADDRESS_CHANGE) +DECLARE_UNKNOWN_PROTOTYPE(ETH_FILTER_CHANGE) +DECLARE_UNKNOWN_PROTOTYPE(ETH_DEFERRED_CLOSE) + +typedef struct _ETH_FILTER { + PNDIS_SPIN_LOCK Lock; + CHAR (*MCastAddressBuf)[ETH_LENGTH_OF_ADDRESS]; + struct _NDIS_MINIPORT_BLOCK *Miniport; + UINT CombinedPacketFilter; + PETH_BINDING_INFO OpenList; + ETH_ADDRESS_CHANGE AddressChangeAction; + ETH_FILTER_CHANGE FilterChangeAction; + ETH_DEFERRED_CLOSE CloseAction; + UINT MaxMulticastAddresses; + UINT NumAddresses; + UCHAR AdapterAddress[ETH_LENGTH_OF_ADDRESS]; + UINT OldCombinedPacketFilter; + CHAR (*OldMCastAddressBuf)[ETH_LENGTH_OF_ADDRESS]; + UINT OldNumAddresses; + PETH_BINDING_INFO DirectedList; + PETH_BINDING_INFO BMList; + PETH_BINDING_INFO MCastSet; +#if defined(_NDIS_) + UINT NumOpens; + PVOID BindListLock; +#endif +} ETH_FILTER, *PETH_FILTER; + +typedef VOID DDKAPI +(*ETH_RCV_COMPLETE_HANDLER)( + IN PETH_FILTER Filter); + +typedef VOID DDKAPI +(*ETH_RCV_INDICATE_HANDLER)( + IN PETH_FILTER Filter, + IN NDIS_HANDLE MacReceiveContext, + IN PCHAR Address, + IN PVOID HeaderBuffer, + IN UINT HeaderBufferSize, + IN PVOID LookaheadBuffer, + IN UINT LookaheadBufferSize, + IN UINT PacketSize); + +typedef VOID DDKAPI +(*FDDI_RCV_COMPLETE_HANDLER)( + IN PFDDI_FILTER Filter); + +typedef VOID DDKAPI +(*FDDI_RCV_INDICATE_HANDLER)( + IN PFDDI_FILTER Filter, + IN NDIS_HANDLE MacReceiveContext, + IN PCHAR Address, + IN UINT AddressLength, + IN PVOID HeaderBuffer, + IN UINT HeaderBufferSize, + IN PVOID LookaheadBuffer, + IN UINT LookaheadBufferSize, + IN UINT PacketSize); + +typedef VOID DDKAPI +(*FILTER_PACKET_INDICATION_HANDLER)( + IN NDIS_HANDLE Miniport, + IN PPNDIS_PACKET PacketArray, + IN UINT NumberOfPackets); + +typedef VOID DDKAPI +(*TR_RCV_COMPLETE_HANDLER)( + IN PTR_FILTER Filter); + +typedef VOID DDKAPI +(*TR_RCV_INDICATE_HANDLER)( + IN PTR_FILTER Filter, + IN NDIS_HANDLE MacReceiveContext, + IN PVOID HeaderBuffer, + IN UINT HeaderBufferSize, + IN PVOID LookaheadBuffer, + IN UINT LookaheadBufferSize, + IN UINT PacketSize); + +typedef VOID DDKAPI +(*WAN_RCV_COMPLETE_HANDLER)( + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_HANDLE NdisLinkContext); + +typedef VOID DDKAPI +(*WAN_RCV_HANDLER)( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_HANDLE NdisLinkContext, + IN PUCHAR Packet, + IN ULONG PacketSize); + +typedef VOID DDKFASTAPI +(*NDIS_M_DEQUEUE_WORK_ITEM)( + IN PNDIS_MINIPORT_BLOCK Miniport, + IN NDIS_WORK_ITEM_TYPE WorkItemType, + OUT PVOID *WorkItemContext); + +typedef NDIS_STATUS DDKFASTAPI +(*NDIS_M_QUEUE_NEW_WORK_ITEM)( + IN PNDIS_MINIPORT_BLOCK Miniport, + IN NDIS_WORK_ITEM_TYPE WorkItemType, + IN PVOID WorkItemContext); + +typedef NDIS_STATUS DDKFASTAPI +(*NDIS_M_QUEUE_WORK_ITEM)( + IN PNDIS_MINIPORT_BLOCK Miniport, + IN NDIS_WORK_ITEM_TYPE WorkItemType, + IN PVOID WorkItemContext); + +typedef VOID DDKAPI +(*NDIS_M_REQ_COMPLETE_HANDLER)( + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_STATUS Status); + +typedef VOID DDKAPI +(*NDIS_M_RESET_COMPLETE_HANDLER)( + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_STATUS Status, + IN BOOLEAN AddressingReset); + +typedef VOID DDKAPI +(*NDIS_M_SEND_COMPLETE_HANDLER)( + IN NDIS_HANDLE MiniportAdapterHandle, + IN PNDIS_PACKET Packet, + IN NDIS_STATUS Status); + +typedef VOID DDKAPI +(*NDIS_M_SEND_RESOURCES_HANDLER)( + IN NDIS_HANDLE MiniportAdapterHandle); + +typedef BOOLEAN DDKFASTAPI +(*NDIS_M_START_SENDS)( + IN PNDIS_MINIPORT_BLOCK Miniport); + +typedef VOID DDKAPI +(*NDIS_M_STATUS_HANDLER)( + IN NDIS_HANDLE MiniportHandle, + IN NDIS_STATUS GeneralStatus, + IN PVOID StatusBuffer, + IN UINT StatusBufferSize); + +typedef VOID DDKAPI +(*NDIS_M_STS_COMPLETE_HANDLER)( + IN NDIS_HANDLE MiniportAdapterHandle); + +typedef VOID DDKAPI +(*NDIS_M_TD_COMPLETE_HANDLER)( + IN NDIS_HANDLE MiniportAdapterHandle, + IN PNDIS_PACKET Packet, + IN NDIS_STATUS Status, + IN UINT BytesTransferred); + +typedef VOID (DDKAPI *NDIS_WM_SEND_COMPLETE_HANDLER)( + IN NDIS_HANDLE MiniportAdapterHandle, + IN PVOID Packet, + IN NDIS_STATUS Status); + + +#if ARCNET + +#define ARC_SEND_BUFFERS 8 +#define ARC_HEADER_SIZE 4 + +typedef struct _NDIS_ARC_BUF { + NDIS_HANDLE ArcnetBufferPool; + PUCHAR ArcnetLookaheadBuffer; + UINT NumFree; + ARC_BUFFER_LIST ArcnetBuffers[ARC_SEND_BUFFERS]; +} NDIS_ARC_BUF, *PNDIS_ARC_BUF; + +#endif /* ARCNET */ + +#define NDIS_MINIPORT_WORK_QUEUE_SIZE 10 + +typedef struct _NDIS_LOG { + PNDIS_MINIPORT_BLOCK Miniport; + KSPIN_LOCK LogLock; + PIRP Irp; + UINT TotalSize; + UINT CurrentSize; + UINT InPtr; + UINT OutPtr; + UCHAR LogBuf[1]; +} NDIS_LOG, *PNDIS_LOG; + +typedef struct _FILTERDBS { + _ANONYMOUS_UNION union { + PETH_FILTER EthDB; + PNULL_FILTER NullDB; + } DUMMYUNIONNAME; + PTR_FILTER TrDB; + PFDDI_FILTER FddiDB; +#if ARCNET + PARC_FILTER ArcDB; +#else /* !ARCNET */ + PVOID XXXDB; +#endif /* !ARCNET */ +} FILTERDBS, *PFILTERDBS; + + +struct _NDIS_MINIPORT_BLOCK { + PVOID Signature; + PNDIS_MINIPORT_BLOCK NextMiniport; + PNDIS_M_DRIVER_BLOCK DriverHandle; + NDIS_HANDLE MiniportAdapterContext; + UNICODE_STRING MiniportName; + PNDIS_BIND_PATHS BindPaths; + NDIS_HANDLE OpenQueue; + REFERENCE Ref; + NDIS_HANDLE DeviceContext; + UCHAR Padding1; + UCHAR LockAcquired; + UCHAR PmodeOpens; + UCHAR AssignedProcessor; + KSPIN_LOCK Lock; + PNDIS_REQUEST MediaRequest; + PNDIS_MINIPORT_INTERRUPT Interrupt; + ULONG Flags; + ULONG PnPFlags; + LIST_ENTRY PacketList; + PNDIS_PACKET FirstPendingPacket; + PNDIS_PACKET ReturnPacketsQueue; + ULONG RequestBuffer; + PVOID SetMCastBuffer; + PNDIS_MINIPORT_BLOCK PrimaryMiniport; + PVOID WrapperContext; + PVOID BusDataContext; + ULONG PnPCapabilities; + PCM_RESOURCE_LIST Resources; + NDIS_TIMER WakeUpDpcTimer; + UNICODE_STRING BaseName; + UNICODE_STRING SymbolicLinkName; + ULONG CheckForHangSeconds; + USHORT CFHangTicks; + USHORT CFHangCurrentTick; + NDIS_STATUS ResetStatus; + NDIS_HANDLE ResetOpen; + FILTERDBS FilterDbs; + FILTER_PACKET_INDICATION_HANDLER PacketIndicateHandler; + NDIS_M_SEND_COMPLETE_HANDLER SendCompleteHandler; + NDIS_M_SEND_RESOURCES_HANDLER SendResourcesHandler; + NDIS_M_RESET_COMPLETE_HANDLER ResetCompleteHandler; + NDIS_MEDIUM MediaType; + ULONG BusNumber; + NDIS_INTERFACE_TYPE BusType; + NDIS_INTERFACE_TYPE AdapterType; + PDEVICE_OBJECT DeviceObject; + PDEVICE_OBJECT PhysicalDeviceObject; + PDEVICE_OBJECT NextDeviceObject; + PMAP_REGISTER_ENTRY MapRegisters; + PNDIS_AF_LIST CallMgrAfList; + PVOID MiniportThread; + PVOID SetInfoBuf; + USHORT SetInfoBufLen; + USHORT MaxSendPackets; + NDIS_STATUS FakeStatus; + PVOID LockHandler; + PUNICODE_STRING pAdapterInstanceName; + PNDIS_MINIPORT_TIMER TimerQueue; + UINT MacOptions; + PNDIS_REQUEST PendingRequest; + UINT MaximumLongAddresses; + UINT MaximumShortAddresses; + UINT CurrentLookahead; + UINT MaximumLookahead; + W_HANDLE_INTERRUPT_HANDLER HandleInterruptHandler; + W_DISABLE_INTERRUPT_HANDLER DisableInterruptHandler; + W_ENABLE_INTERRUPT_HANDLER EnableInterruptHandler; + W_SEND_PACKETS_HANDLER SendPacketsHandler; + NDIS_M_START_SENDS DeferredSendHandler; + ETH_RCV_INDICATE_HANDLER EthRxIndicateHandler; + TR_RCV_INDICATE_HANDLER TrRxIndicateHandler; + FDDI_RCV_INDICATE_HANDLER FddiRxIndicateHandler; + ETH_RCV_COMPLETE_HANDLER EthRxCompleteHandler; + TR_RCV_COMPLETE_HANDLER TrRxCompleteHandler; + FDDI_RCV_COMPLETE_HANDLER FddiRxCompleteHandler; + NDIS_M_STATUS_HANDLER StatusHandler; + NDIS_M_STS_COMPLETE_HANDLER StatusCompleteHandler; + NDIS_M_TD_COMPLETE_HANDLER TDCompleteHandler; + NDIS_M_REQ_COMPLETE_HANDLER QueryCompleteHandler; + NDIS_M_REQ_COMPLETE_HANDLER SetCompleteHandler; + NDIS_WM_SEND_COMPLETE_HANDLER WanSendCompleteHandler; + WAN_RCV_HANDLER WanRcvHandler; + WAN_RCV_COMPLETE_HANDLER WanRcvCompleteHandler; +#if defined(_NDIS_) + PNDIS_MINIPORT_BLOCK NextGlobalMiniport; + SINGLE_LIST_ENTRY WorkQueue[NUMBER_OF_WORK_ITEM_TYPES]; + SINGLE_LIST_ENTRY SingleWorkItems[NUMBER_OF_SINGLE_WORK_ITEMS]; + UCHAR SendFlags; + UCHAR TrResetRing; + UCHAR ArcnetAddress; + UCHAR XState; + _ANONYMOUS_UNION union { +#if ARCNET + PNDIS_ARC_BUF ArcBuf; +#endif + PVOID BusInterface; + } DUMMYUNIONNAME; + PNDIS_LOG Log; + ULONG SlotNumber; + PCM_RESOURCE_LIST AllocatedResources; + PCM_RESOURCE_LIST AllocatedResourcesTranslated; + SINGLE_LIST_ENTRY PatternList; + NDIS_PNP_CAPABILITIES PMCapabilities; + DEVICE_CAPABILITIES DeviceCaps; + ULONG WakeUpEnable; + DEVICE_POWER_STATE CurrentDevicePowerState; + PIRP pIrpWaitWake; + SYSTEM_POWER_STATE WaitWakeSystemState; + LARGE_INTEGER VcIndex; + KSPIN_LOCK VcCountLock; + LIST_ENTRY WmiEnabledVcs; + PNDIS_GUID pNdisGuidMap; + PNDIS_GUID pCustomGuidMap; + USHORT VcCount; + USHORT cNdisGuidMap; + USHORT cCustomGuidMap; + USHORT CurrentMapRegister; + PKEVENT AllocationEvent; + USHORT BaseMapRegistersNeeded; + USHORT SGMapRegistersNeeded; + ULONG MaximumPhysicalMapping; + NDIS_TIMER MediaDisconnectTimer; + USHORT MediaDisconnectTimeOut; + USHORT InstanceNumber; + NDIS_EVENT OpenReadyEvent; + NDIS_PNP_DEVICE_STATE PnPDeviceState; + NDIS_PNP_DEVICE_STATE OldPnPDeviceState; + PGET_SET_DEVICE_DATA SetBusData; + PGET_SET_DEVICE_DATA GetBusData; + KDPC DeferredDpc; +#if 0 + /* FIXME: */ + NDIS_STATS NdisStats; +#else + ULONG NdisStats; +#endif + PNDIS_PACKET IndicatedPacket[MAXIMUM_PROCESSORS]; + PKEVENT RemoveReadyEvent; + PKEVENT AllOpensClosedEvent; + PKEVENT AllRequestsCompletedEvent; + ULONG InitTimeMs; + NDIS_MINIPORT_WORK_ITEM WorkItemBuffer[NUMBER_OF_SINGLE_WORK_ITEMS]; + PDMA_ADAPTER SystemAdapterObject; + ULONG DriverVerifyFlags; + POID_LIST OidList; + USHORT InternalResetCount; + USHORT MiniportResetCount; + USHORT MediaSenseConnectCount; + USHORT MediaSenseDisconnectCount; + PNDIS_PACKET *xPackets; + ULONG UserModeOpenReferences; + _ANONYMOUS_UNION union { + PVOID SavedSendHandler; + PVOID SavedWanSendHandler; + } DUMMYUNIONNAME2; + PVOID SavedSendPacketsHandler; + PVOID SavedCancelSendPacketsHandler; + W_SEND_PACKETS_HANDLER WSendPacketsHandler; + ULONG MiniportAttributes; + PDMA_ADAPTER SavedSystemAdapterObject; + USHORT NumOpens; + USHORT CFHangXTicks; + ULONG RequestCount; + ULONG IndicatedPacketsCount; + ULONG PhysicalMediumType; + PNDIS_REQUEST LastRequest; + LONG DmaAdapterRefCount; + PVOID FakeMac; + ULONG LockDbg; + ULONG LockDbgX; + PVOID LockThread; + ULONG InfoFlags; + KSPIN_LOCK TimerQueueLock; + PKEVENT ResetCompletedEvent; + PKEVENT QueuedBindingCompletedEvent; + PKEVENT DmaResourcesReleasedEvent; + FILTER_PACKET_INDICATION_HANDLER SavedPacketIndicateHandler; + ULONG RegisteredInterrupts; + PNPAGED_LOOKASIDE_LIST SGListLookasideList; + ULONG ScatterGatherListSize; +#endif /* _NDIS_ */ +}; + + +/* Handler prototypes for NDIS_OPEN_BLOCK */ + +typedef NDIS_STATUS (DDKAPI *WAN_SEND_HANDLER)( + IN NDIS_HANDLE MacBindingHandle, + IN NDIS_HANDLE LinkHandle, + IN PVOID Packet); + +/* NDIS 4.0 extension */ + +typedef VOID (DDKAPI *SEND_PACKETS_HANDLER)( + IN NDIS_HANDLE MiniportAdapterContext, + IN PPNDIS_PACKET PacketArray, + IN UINT NumberOfPackets); + + +typedef struct _NDIS_COMMON_OPEN_BLOCK { + PVOID MacHandle; + NDIS_HANDLE BindingHandle; + PNDIS_MINIPORT_BLOCK MiniportHandle; + PNDIS_PROTOCOL_BLOCK ProtocolHandle; + NDIS_HANDLE ProtocolBindingContext; + PNDIS_OPEN_BLOCK MiniportNextOpen; + PNDIS_OPEN_BLOCK ProtocolNextOpen; + NDIS_HANDLE MiniportAdapterContext; + BOOLEAN Reserved1; + BOOLEAN Reserved2; + BOOLEAN Reserved3; + BOOLEAN Reserved4; + PNDIS_STRING BindDeviceName; + KSPIN_LOCK Reserved5; + PNDIS_STRING RootDeviceName; + _ANONYMOUS_UNION union { + SEND_HANDLER SendHandler; + WAN_SEND_HANDLER WanSendHandler; + } DUMMYUNIONNAME; + TRANSFER_DATA_HANDLER TransferDataHandler; + SEND_COMPLETE_HANDLER SendCompleteHandler; + TRANSFER_DATA_COMPLETE_HANDLER TransferDataCompleteHandler; + RECEIVE_HANDLER ReceiveHandler; + RECEIVE_COMPLETE_HANDLER ReceiveCompleteHandler; + WAN_RECEIVE_HANDLER WanReceiveHandler; + REQUEST_COMPLETE_HANDLER RequestCompleteHandler; + RECEIVE_PACKET_HANDLER ReceivePacketHandler; + SEND_PACKETS_HANDLER SendPacketsHandler; + RESET_HANDLER ResetHandler; + REQUEST_HANDLER RequestHandler; + RESET_COMPLETE_HANDLER ResetCompleteHandler; + STATUS_HANDLER StatusHandler; + STATUS_COMPLETE_HANDLER StatusCompleteHandler; +#if defined(_NDIS_) + ULONG Flags; + ULONG References; + KSPIN_LOCK SpinLock; + NDIS_HANDLE FilterHandle; + ULONG ProtocolOptions; + USHORT CurrentLookahead; + USHORT ConnectDampTicks; + USHORT DisconnectDampTicks; + W_SEND_HANDLER WSendHandler; + W_TRANSFER_DATA_HANDLER WTransferDataHandler; + W_SEND_PACKETS_HANDLER WSendPacketsHandler; + W_CANCEL_SEND_PACKETS_HANDLER CancelSendPacketsHandler; + ULONG WakeUpEnable; + PKEVENT CloseCompleteEvent; + QUEUED_CLOSE QC; + ULONG AfReferences; + PNDIS_OPEN_BLOCK NextGlobalOpen; +#endif /* _NDIS_ */ +} NDIS_COMMON_OPEN_BLOCK; + +struct _NDIS_OPEN_BLOCK +{ + NDIS_COMMON_OPEN_BLOCK NdisCommonOpenBlock; +#if defined(_NDIS_) + struct _NDIS_OPEN_CO + { + struct _NDIS_CO_AF_BLOCK * NextAf; + W_CO_CREATE_VC_HANDLER MiniportCoCreateVcHandler; + W_CO_REQUEST_HANDLER MiniportCoRequestHandler; + CO_CREATE_VC_HANDLER CoCreateVcHandler; + CO_DELETE_VC_HANDLER CoDeleteVcHandler; + PVOID CmActivateVcCompleteHandler; + PVOID CmDeactivateVcCompleteHandler; + PVOID CoRequestCompleteHandler; + LIST_ENTRY ActiveVcHead; + LIST_ENTRY InactiveVcHead; + LONG PendingAfNotifications; + PKEVENT AfNotifyCompleteEvent; + }; +#endif /* _NDIS_ */ +}; + + + +/* Routines for NDIS miniport drivers */ + +NDISAPI +VOID +DDKAPI +NdisInitializeWrapper( + OUT PNDIS_HANDLE NdisWrapperHandle, + IN PVOID SystemSpecific1, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisMAllocateMapRegisters( + IN NDIS_HANDLE MiniportAdapterHandle, + IN UINT DmaChannel, + IN BOOLEAN Dma32BitAddresses, + IN ULONG PhysicalMapRegistersNeeded, + IN ULONG MaximumPhysicalMapping); + +/* + * VOID + * NdisMArcIndicateReceive( + * IN NDIS_HANDLE MiniportAdapterHandle, + * IN PUCHAR HeaderBuffer, + * IN PUCHAR DataBuffer, + * IN UINT Length); + */ +#define NdisMArcIndicateReceive(MiniportAdapterHandle, \ + HeaderBuffer, \ + DataBuffer, \ + Length) \ +{ \ + ArcFilterDprIndicateReceive( \ + (((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->FilterDbs.ArcDB), \ + (HeaderBuffer), \ + (DataBuffer), \ + (Length)); \ +} + +/* + * VOID + * NdisMArcIndicateReceiveComplete( + * IN NDIS_HANDLE MiniportAdapterHandle); + */ +#define NdisMArcIndicateReceiveComplete(MiniportAdapterHandle) \ +{ \ + if (((PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle)->EthDB) \ + { \ + NdisMEthIndicateReceiveComplete(_H); \ + } \ + \ + ArcFilterDprIndicateReceiveComplete( \ + ((PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle)->ArcDB); \ +} + +NDISAPI +VOID +DDKAPI +NdisMCloseLog( + IN NDIS_HANDLE LogHandle); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisMCreateLog( + IN NDIS_HANDLE MiniportAdapterHandle, + IN UINT Size, + OUT PNDIS_HANDLE LogHandle); + +NDISAPI +VOID +DDKAPI +NdisMDeregisterAdapterShutdownHandler( + IN NDIS_HANDLE MiniportHandle); + +NDISAPI +VOID +DDKAPI +NdisMDeregisterInterrupt( + IN PNDIS_MINIPORT_INTERRUPT Interrupt); + +NDISAPI +VOID +DDKAPI +NdisMDeregisterIoPortRange( + IN NDIS_HANDLE MiniportAdapterHandle, + IN UINT InitialPort, + IN UINT NumberOfPorts, + IN PVOID PortOffset); + +/* + * VOID + * NdisMEthIndicateReceive( + * IN NDIS_HANDLE MiniportAdapterHandle, + * IN NDIS_HANDLE MiniportReceiveContext, + * IN PVOID HeaderBuffer, + * IN UINT HeaderBufferSize, + * IN PVOID LookaheadBuffer, + * IN UINT LookaheadBufferSize, + * IN UINT PacketSize); + */ +#define NdisMEthIndicateReceive(MiniportAdapterHandle, \ + MiniportReceiveContext, \ + HeaderBuffer, \ + HeaderBufferSize, \ + LookaheadBuffer, \ + LookaheadBufferSize, \ + PacketSize) \ +{ \ + (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->EthRxIndicateHandler)( \ + (((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->FilterDbs.EthDB), \ + (MiniportReceiveContext), \ + (HeaderBuffer), \ + (HeaderBuffer), \ + (HeaderBufferSize), \ + (LookaheadBuffer), \ + (LookaheadBufferSize), \ + (PacketSize)); \ +} + +/* + * VOID + * NdisMEthIndicateReceiveComplete( + * IN NDIS_HANDLE MiniportAdapterHandle); + */ +#define NdisMEthIndicateReceiveComplete(MiniportAdapterHandle) \ +{ \ + (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->EthRxCompleteHandler)( \ + ((PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle)->FilterDbs.EthDB); \ +} + +/* + * VOID + * NdisMFddiIndicateReceive( + * IN NDIS_HANDLE MiniportAdapterHandle, + * IN NDIS_HANDLE MiniportReceiveContext, + * IN PVOID HeaderBuffer, + * IN UINT HeaderBufferSize, + * IN PVOID LookaheadBuffer, + * IN UINT LookaheadBufferSize, + * IN UINT PacketSize); + */ +#define NdisMFddiIndicateReceive(MiniportAdapterHandle, \ + MiniportReceiveContext, \ + HeaderBuffer, \ + HeaderBufferSize, \ + LookaheadBuffer, \ + LookaheadBufferSize, \ + PacketSize) \ +{ \ + (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->FddiRxIndicateHandler)( \ + (((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->FilterDbs.FddiDB), \ + (MiniportReceiveContext), \ + (PUCHAR)(HeaderBuffer) + 1, \ + (((*(PUCHAR*)(HeaderBuffer)) & 0x40) ? \ + FDDI_LENGTH_OF_LONG_ADDRESS : \ + FDDI_LENGTH_OF_SHORT_ADDRESS), \ + (HeaderBuffer), \ + (HeaderBufferSize), \ + (LookaheadBuffer), \ + (LookaheadBufferSize), \ + (PacketSize)); \ +} + + + +/* + * VOID + * NdisMFddiIndicateReceiveComplete( + * IN NDIS_HANDLE MiniportAdapterHandle); + */ +#define NdisMFddiIndicateReceiveComplete(MiniportAdapterHandle) \ +{ \ + (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->FddiRxCompleteHandler)( \ + ((PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle)->FilterDbs.FddiDB); \ +} + +NDISAPI +VOID +DDKAPI +NdisMFlushLog( + IN NDIS_HANDLE LogHandle); + +NDISAPI +VOID +DDKAPI +NdisMFreeMapRegisters( + IN NDIS_HANDLE MiniportAdapterHandle); + +/* + * VOID + * NdisMIndicateStatus( + * IN NDIS_HANDLE MiniportAdapterHandle, + * IN NDIS_STATUS GeneralStatus, + * IN PVOID StatusBuffer, + * IN UINT StatusBufferSize); + */ + +#define NdisMIndicateStatus(MiniportAdapterHandle, \ + GeneralStatus, StatusBuffer, StatusBufferSize) \ + (*((PNDIS_MINIPORT_BLOCK)(_M))->StatusHandler)( \ + MiniportAdapterHandle, GeneralStatus, StatusBuffer, StatusBufferSize) + +/* + * VOID + * NdisMIndicateStatusComplete( + * IN NDIS_HANDLE MiniportAdapterHandle); + */ +#define NdisMIndicateStatusComplete(MiniportAdapterHandle) \ + (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->StatusCompleteHandler)( \ + MiniportAdapterHandle) + +/* + * VOID + * NdisMInitializeWrapper( + * OUT PNDIS_HANDLE NdisWrapperHandle, + * IN PVOID SystemSpecific1, + * IN PVOID SystemSpecific2, + * IN PVOID SystemSpecific3); + */ +#define NdisMInitializeWrapper(NdisWrapperHandle, \ + SystemSpecific1, \ + SystemSpecific2, \ + SystemSpecific3) \ + NdisInitializeWrapper((NdisWrapperHandle), \ + (SystemSpecific1), \ + (SystemSpecific2), \ + (SystemSpecific3)) + +NDISAPI +NDIS_STATUS +DDKAPI +NdisMMapIoSpace( + OUT PVOID *VirtualAddress, + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_PHYSICAL_ADDRESS PhysicalAddress, + IN UINT Length); + +/* + * VOID + * NdisMQueryInformationComplete( + * IN NDIS_HANDLE MiniportAdapterHandle, + * IN NDIS_STATUS Status); + */ +#define NdisMQueryInformationComplete(MiniportAdapterHandle, Status) \ + (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->QueryCompleteHandler)(MiniportAdapterHandle, Status) + +NDISAPI +VOID +DDKAPI +NdisMRegisterAdapterShutdownHandler( + IN NDIS_HANDLE MiniportHandle, + IN PVOID ShutdownContext, + IN ADAPTER_SHUTDOWN_HANDLER ShutdownHandler); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisMRegisterInterrupt( + OUT PNDIS_MINIPORT_INTERRUPT Interrupt, + IN NDIS_HANDLE MiniportAdapterHandle, + IN UINT InterruptVector, + IN UINT InterruptLevel, + IN BOOLEAN RequestIsr, + IN BOOLEAN SharedInterrupt, + IN NDIS_INTERRUPT_MODE InterruptMode); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisMRegisterIoPortRange( + OUT PVOID *PortOffset, + IN NDIS_HANDLE MiniportAdapterHandle, + IN UINT InitialPort, + IN UINT NumberOfPorts); + +NDISAPI +NDIS_STATUS +DDKAPI +NdisMRegisterMiniport( + IN NDIS_HANDLE NdisWrapperHandle, + IN PNDIS_MINIPORT_CHARACTERISTICS MiniportCharacteristics, + IN UINT CharacteristicsLength); + + +#if !defined(_NDIS_) + +/* + * VOID + * NdisMResetComplete( + * IN NDIS_HANDLE MiniportAdapterHandle, + * IN NDIS_STATUS Status, + * IN BOOLEAN AddressingReset); + */ +#define NdisMResetComplete(MiniportAdapterHandle, \ + Status, \ + AddressingReset) \ +{ \ + (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->ResetCompleteHandler)( \ + MiniportAdapterHandle, Status, AddressingReset); \ +} + +/* + * VOID + * NdisMSendComplete( + * IN NDIS_HANDLE MiniportAdapterHandle, + * IN PNDIS_PACKET Packet, + * IN NDIS_STATUS Status); + */ +#define NdisMSendComplete(MiniportAdapterHandle, \ + Packet, \ + Status) \ +{ \ + (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->SendCompleteHandler)( \ + MiniportAdapterHandle, Packet, Status); \ +} + +/* + * VOID + * NdisMSendResourcesAvailable( + * IN NDIS_HANDLE MiniportAdapterHandle); + */ +#define NdisMSendResourcesAvailable(MiniportAdapterHandle) \ +{ \ + (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->SendResourcesHandler)( \ + MiniportAdapterHandle); \ +} + +/* + * VOID + * NdisMTransferDataComplete( + * IN NDIS_HANDLE MiniportAdapterHandle, + * IN PNDIS_PACKET Packet, + * IN NDIS_STATUS Status, + * IN UINT BytesTransferred); + */ +#define NdisMTransferDataComplete(MiniportAdapterHandle, \ + Packet, \ + Status, \ + BytesTransferred) \ +{ \ + (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->TDCompleteHandler)( \ + MiniportAdapterHandle, Packet, Status, BytesTransferred) \ +} + +#endif /* !_NDIS_ */ + + +/* + * VOID + * NdisMSetAttributes( + * IN NDIS_HANDLE MiniportAdapterHandle, + * IN NDIS_HANDLE MiniportAdapterContext, + * IN BOOLEAN BusMaster, + * IN NDIS_INTERFACE_TYPE AdapterType); + */ +#define NdisMSetAttributes(MiniportAdapterHandle, \ + MiniportAdapterContext, \ + BusMaster, \ + AdapterType) \ + NdisMSetAttributesEx(MiniportAdapterHandle, \ + MiniportAdapterContext, \ + 0, \ + (BusMaster) ? NDIS_ATTRIBUTE_BUS_MASTER : 0, \ + AdapterType) + +NDISAPI +VOID +DDKAPI +NdisMSetAttributesEx( + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_HANDLE MiniportAdapterContext, + IN UINT CheckForHangTimeInSeconds OPTIONAL, + IN ULONG AttributeFlags, + IN NDIS_INTERFACE_TYPE AdapterType); + +/* + * VOID + * NdisMSetInformationComplete( + * IN NDIS_HANDLE MiniportAdapterHandle, + * IN NDIS_STATUS Status); + */ +#define NdisMSetInformationComplete(MiniportAdapterHandle, \ + Status) \ + (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->SetCompleteHandler)( \ + MiniportAdapterHandle, Status) + +NDISAPI +VOID +DDKAPI +NdisMSleep( + IN ULONG MicrosecondsToSleep); + +NDISAPI +BOOLEAN +DDKAPI +NdisMSynchronizeWithInterrupt( + IN PNDIS_MINIPORT_INTERRUPT Interrupt, + IN PVOID SynchronizeFunction, + IN PVOID SynchronizeContext); + +/* + * VOID + * NdisMTrIndicateReceive( + * IN NDIS_HANDLE MiniportAdapterHandle, + * IN NDIS_HANDLE MiniportReceiveContext, + * IN PVOID HeaderBuffer, + * IN UINT HeaderBufferSize, + * IN PVOID LookaheadBuffer, + * IN UINT LookaheadBufferSize, + * IN UINT PacketSize); + */ +#define NdisMTrIndicateReceive(MiniportAdapterHandle, \ + MiniportReceiveContext, \ + HeaderBuffer, \ + HeaderBufferSize, \ + LookaheadBuffer, \ + LookaheadBufferSize, \ + PacketSize) \ +{ \ + (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->TrRxIndicateHandler)( \ + (((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->FilterDbs.TrDB), \ + (MiniportReceiveContext), \ + (HeaderBuffer), \ + (HeaderBuffer), \ + (HeaderBufferSize), \ + (LookaheadBuffer), \ + (LookaheadBufferSize), \ + (PacketSize)); \ +} + +/* + * VOID + * NdisMTrIndicateReceiveComplete( + * IN NDIS_HANDLE MiniportAdapterHandle); + */ +#define NdisMTrIndicateReceiveComplete(MiniportAdapterHandle) \ +{ \ + (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->TrRxCompleteHandler)( \ + ((PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle)->FilterDbs.TrDB); \ +} + +NDISAPI +NDIS_STATUS +DDKAPI +NdisMWriteLogData( + IN NDIS_HANDLE LogHandle, + IN PVOID LogBuffer, + IN UINT LogBufferSize); + +NDISAPI +VOID +DDKAPI +NdisMQueryAdapterResources( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE WrapperConfigurationContext, + OUT PNDIS_RESOURCE_LIST ResourceList, + IN OUT PUINT BufferSize); + +NDISAPI +VOID +DDKAPI +NdisTerminateWrapper( + IN NDIS_HANDLE NdisWrapperHandle, + IN PVOID SystemSpecific); + +NDISAPI +VOID +DDKAPI +NdisMUnmapIoSpace( + IN NDIS_HANDLE MiniportAdapterHandle, + IN PVOID VirtualAddress, + IN UINT Length); + + + +/* NDIS intermediate miniport structures */ + +typedef VOID (DDKAPI *W_MINIPORT_CALLBACK)( + IN NDIS_HANDLE MiniportAdapterContext, + IN PVOID CallbackContext); + + + +/* Routines for intermediate miniport drivers */ + +NDISAPI +NDIS_STATUS +DDKAPI +NdisIMDeInitializeDeviceInstance( + IN NDIS_HANDLE NdisMiniportHandle); + +/* + * NDIS_STATUS + * NdisIMInitializeDeviceInstance( + * IN NDIS_HANDLE DriverHandle, + * IN PNDIS_STRING DeviceInstance); + */ +#define NdisIMInitializeDeviceInstance(DriverHandle, DeviceInstance) \ + NdisIMInitializeDeviceInstanceEx(DriverHandle, DeviceInstance, NULL) + +NDISAPI +NDIS_STATUS +DDKAPI +NdisIMRegisterLayeredMiniport( + IN NDIS_HANDLE NdisWrapperHandle, + IN PNDIS_MINIPORT_CHARACTERISTICS MiniportCharacteristics, + IN UINT CharacteristicsLength, + OUT PNDIS_HANDLE DriverHandle); + + +/* Functions obsoleted by NDIS 5.0 */ + +NDISAPI +VOID +DDKAPI +NdisFreeDmaChannel( + IN PNDIS_HANDLE NdisDmaHandle); + +NDISAPI +VOID +DDKAPI +NdisSetupDmaTransfer( + OUT PNDIS_STATUS Status, + IN PNDIS_HANDLE NdisDmaHandle, + IN PNDIS_BUFFER Buffer, + IN ULONG Offset, + IN ULONG Length, + IN BOOLEAN WriteToDevice); + +NDISAPI +NTSTATUS +DDKAPI +NdisUpcaseUnicodeString( + OUT PUNICODE_STRING DestinationString, + IN PUNICODE_STRING SourceString); + + +/* Routines for NDIS protocol drivers */ + +NDISAPI +VOID +DDKAPI +NdisRequest( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE NdisBindingHandle, + IN PNDIS_REQUEST NdisRequest); + +NDISAPI +VOID +DDKAPI +NdisReset( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE NdisBindingHandle); + +NDISAPI +VOID +DDKAPI +NdisSend( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE NdisBindingHandle, + IN PNDIS_PACKET Packet); + +NDISAPI +VOID +DDKAPI +NdisSendPackets( + IN NDIS_HANDLE NdisBindingHandle, + IN PPNDIS_PACKET PacketArray, + IN UINT NumberOfPackets); + +NDISAPI +VOID +DDKAPI +NdisTransferData( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE NdisBindingHandle, + IN NDIS_HANDLE MacReceiveContext, + IN UINT ByteOffset, + IN UINT BytesToTransfer, + IN OUT PNDIS_PACKET Packet, + OUT PUINT BytesTransferred); + +NDISAPI +VOID +DDKAPI +NdisCloseAdapter( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE NdisBindingHandle); + +NDISAPI +VOID +DDKAPI +NdisCompleteBindAdapter( + IN NDIS_HANDLE BindAdapterContext, + IN NDIS_STATUS Status, + IN NDIS_STATUS OpenStatus); + +NDISAPI +VOID +DDKAPI +NdisCompleteUnbindAdapter( + IN NDIS_HANDLE UnbindAdapterContext, + IN NDIS_STATUS Status); + +NDISAPI +VOID +DDKAPI +NdisDeregisterProtocol( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE NdisProtocolHandle); + +NDISAPI +VOID +DDKAPI +NdisOpenAdapter( + OUT PNDIS_STATUS Status, + OUT PNDIS_STATUS OpenErrorStatus, + OUT PNDIS_HANDLE NdisBindingHandle, + OUT PUINT SelectedMediumIndex, + IN PNDIS_MEDIUM MediumArray, + IN UINT MediumArraySize, + IN NDIS_HANDLE NdisProtocolHandle, + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_STRING AdapterName, + IN UINT OpenOptions, + IN PSTRING AddressingInformation); + +NDISAPI +VOID +DDKAPI +NdisOpenProtocolConfiguration( + OUT PNDIS_STATUS Status, + OUT PNDIS_HANDLE ConfigurationHandle, + IN PNDIS_STRING ProtocolSection); + +NDISAPI +VOID +DDKAPI +NdisRegisterProtocol( + OUT PNDIS_STATUS Status, + OUT PNDIS_HANDLE NdisProtocolHandle, + IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics, + IN UINT CharacteristicsLength); + +/* Obsoleted in Windows XP */ + +/* Prototypes for NDIS_MAC_CHARACTERISTICS */ + +typedef NDIS_STATUS (*OPEN_ADAPTER_HANDLER)( + OUT PNDIS_STATUS OpenErrorStatus, + OUT NDIS_HANDLE *MacBindingHandle, + OUT PUINT SelectedMediumIndex, + IN PNDIS_MEDIUM MediumArray, + IN UINT MediumArraySize, + IN NDIS_HANDLE NdisBindingContext, + IN NDIS_HANDLE MacAdapterContext, + IN UINT OpenOptions, + IN PSTRING AddressingInformation OPTIONAL); + +typedef NDIS_STATUS (DDKAPI *CLOSE_ADAPTER_HANDLER)( + IN NDIS_HANDLE MacBindingHandle); + +typedef NDIS_STATUS (DDKAPI *WAN_TRANSFER_DATA_HANDLER)( + VOID); + +typedef NDIS_STATUS (DDKAPI *QUERY_GLOBAL_STATISTICS_HANDLER)( + IN NDIS_HANDLE MacAdapterContext, + IN PNDIS_REQUEST NdisRequest); + +typedef VOID (DDKAPI *UNLOAD_MAC_HANDLER)( + IN NDIS_HANDLE MacMacContext); + +typedef NDIS_STATUS (DDKAPI *ADD_ADAPTER_HANDLER)( + IN NDIS_HANDLE MacMacContext, + IN NDIS_HANDLE WrapperConfigurationContext, + IN PNDIS_STRING AdapterName); + +typedef VOID (*REMOVE_ADAPTER_HANDLER)( + IN NDIS_HANDLE MacAdapterContext); + +typedef struct _NDIS_MAC_CHARACTERISTICS { + UCHAR MajorNdisVersion; + UCHAR MinorNdisVersion; + UINT Reserved; + OPEN_ADAPTER_HANDLER OpenAdapterHandler; + CLOSE_ADAPTER_HANDLER CloseAdapterHandler; + SEND_HANDLER SendHandler; + TRANSFER_DATA_HANDLER TransferDataHandler; + RESET_HANDLER ResetHandler; + REQUEST_HANDLER RequestHandler; + QUERY_GLOBAL_STATISTICS_HANDLER QueryGlobalStatisticsHandler; + UNLOAD_MAC_HANDLER UnloadMacHandler; + ADD_ADAPTER_HANDLER AddAdapterHandler; + REMOVE_ADAPTER_HANDLER RemoveAdapterHandler; + NDIS_STRING Name; +} NDIS_MAC_CHARACTERISTICS, *PNDIS_MAC_CHARACTERISTICS; + +typedef NDIS_MAC_CHARACTERISTICS NDIS_WAN_MAC_CHARACTERISTICS; +typedef NDIS_WAN_MAC_CHARACTERISTICS *PNDIS_WAN_MAC_CHARACTERISTICS; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __NDIS_H */ + +/* EOF */ diff --git a/reactos/w32api/include/ddk/ndisguid.h b/reactos/w32api/include/ddk/ndisguid.h new file mode 100644 index 00000000000..27b8777bfb5 --- /dev/null +++ b/reactos/w32api/include/ddk/ndisguid.h @@ -0,0 +1,439 @@ +/* + * ndisguid.h + * + * GUIDs for NDIS drivers + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __NDISGUID_H +#define __NDISGUID_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +DEFINE_GUID(GUID_NDIS_LAN_CLASS, + 0xad498944, 0x762f, 0x11d0, 0x8d, 0xcb, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_ENUMERATE_ADAPTER, + 0x981f2d7f, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_ENUMERATE_VC, + 0x981f2d82, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_NOTIFY_ADAPTER_ARRIVAL, + 0x981f2d81, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_NOTIFY_ADAPTER_REMOVAL, + 0x981f2d80, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_NOTIFY_VC_ARRIVAL, + 0x182f9e0c, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_NOTIFY_VC_REMOVAL, + 0x981f2d79, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_NOTIFY_BIND, + 0x5413531c, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_NOTIFY_UNBIND, + 0x6e3ce1ec, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_WAKE_ON_MAGIC_PACKET_ONLY, + 0xa14f1c97, 0x8839, 0x4f8a, 0x99, 0x96, 0xa2, 0x89, 0x96, 0xeb, 0xbf, 0x1d); + + +DEFINE_GUID(GUID_NDIS_802_3_CURRENT_ADDRESS, + 0x44795700, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_802_3_MAC_OPTIONS, + 0x44795703, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_802_3_MAXIMUM_LIST_SIZE, + 0x44795702, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_802_3_MULTICAST_LIST, + 0x44795701, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_802_3_PERMANENT_ADDRESS, + 0x447956ff, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_802_3_RCV_ERROR_ALIGNMENT, + 0x44795704, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_802_3_XMIT_MORE_COLLISIONS, + 0x44795706, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_802_3_XMIT_ONE_COLLISION, + 0x44795705, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_802_5_CURRENT_ADDRESS, + 0x44795708, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_802_5_CURRENT_FUNCTIONAL, + 0x44795709, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_802_5_CURRENT_GROUP, + 0x4479570a, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_802_5_CURRENT_RING_STATE, + 0xacf14032, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_802_5_CURRENT_RING_STATUS, + 0x890a36ec, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_802_5_LAST_OPEN_STATUS, + 0x4479570b, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_802_5_PERMANENT_ADDRESS, + 0x44795707, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_802_5_LINE_ERRORS, + 0xacf14033, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_802_5_LOST_FRAMES, + 0xacf14034, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + + +DEFINE_GUID(GUID_NDIS_802_11_ADD_WEP, + 0x4307bff0, 0x2129, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03); + +DEFINE_GUID(GUID_NDIS_802_11_AUTHENTICATION_MODE, + 0x43920a24, 0x2129, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03); + +DEFINE_GUID(GUID_NDIS_802_11_BSSID, + 0x2504b6c2, 0x1fa5, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03); + +DEFINE_GUID(GUID_NDIS_802_11_BSSID_LIST, + 0x69526f9a, 0x2062, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03); + +DEFINE_GUID(GUID_NDIS_802_11_BASIC_RATES, + 0x4a198516, 0x2068, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03); + +DEFINE_GUID(GUID_NDIS_802_11_CONFIGURATION, + 0x4a4df982, 0x2068, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03); + +DEFINE_GUID(GUID_NDIS_802_11_DESIRED_RATES, + 0x452ee08e, 0x2536, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03); + +DEFINE_GUID(GUID_NDIS_802_11_DISASSOCIATE, + 0x43671f40, 0x2129, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03); + +DEFINE_GUID(GUID_NDIS_802_11_FRAGMENTATION_THRESHOLD, + 0x69aaa7c4, 0x2062, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03); + +DEFINE_GUID(GUID_NDIS_802_11_INFRASTRUCTURE_MODE, + 0x697d5a7e, 0x2062, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03); + +DEFINE_GUID(GUID_NDIS_802_11_NETWORK_TYPES_SUPPORTED, + 0x8531d6e6, 0x2041, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03); + +DEFINE_GUID(GUID_NDIS_802_11_NETWORK_TYPE_IN_USE, + 0x857e2326, 0x2041, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03); + +DEFINE_GUID(GUID_NDIS_802_11_NUMBER_OF_ANTENNAS, + 0x01779336, 0x2064, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03); + +DEFINE_GUID(GUID_NDIS_802_11_POWER_MODE, + 0x85be837c, 0x2041, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03); + +DEFINE_GUID(GUID_NDIS_802_11_RATES_SUPPORTED, + 0x49db8722, 0x2068, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03); + +DEFINE_GUID(GUID_NDIS_802_11_REMOVE_WEP, + 0x433c345c, 0x2129, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03); + +DEFINE_GUID(GUID_NDIS_802_11_PRIVACY_FILTER, + 0x6733c4e9, 0x4792, 0x11d4, 0x97, 0xf1, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03); + +DEFINE_GUID(GUID_NDIS_802_11_RSSI, + 0x1507db16, 0x2053, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03); + +DEFINE_GUID(GUID_NDIS_802_11_RSSI_TRIGGER, + 0x155689b8, 0x2053, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03); + +DEFINE_GUID(GUID_NDIS_802_11_RTS_THRESHOLD, + 0x0134d07e, 0x2064, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03); + +DEFINE_GUID(GUID_NDIS_802_11_RX_ANTENNA_SELECTED, + 0x01ac07a2, 0x2064, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03); + +DEFINE_GUID(GUID_NDIS_802_11_SSID, + 0x7d2a90ea, 0x2041, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03); + +DEFINE_GUID(GUID_NDIS_802_11_STATISTICS, + 0x42bb73b0, 0x2129, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03); + +DEFINE_GUID(GUID_NDIS_802_11_TX_POWER_LEVEL, + 0x11e6ba76, 0x2053, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03); + +DEFINE_GUID(GUID_NDIS_802_11_TX_ANTENNA_SELECTED, + 0x01dbb74a, 0x2064, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03); + + +DEFINE_GUID(GUID_NDIS_ATM_HW_CURRENT_ADDRESS, + 0x791ad1a1, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_ATM_MAX_AAL0_PACKET_SIZE, + 0x791ad1a5, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_ATM_MAX_AAL1_PACKET_SIZE, + 0x791ad1a6, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_ATM_MAX_AAL34_PACKET_SIZE, + 0x791ad1a7, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_ATM_MAX_AAL5_PACKET_SIZE, + 0x791ad191, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_ATM_MAX_ACTIVE_VCI_BITS, + 0x791ad1a3, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_ATM_MAX_ACTIVE_VCS, + 0x791ad1a2, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_ATM_MAX_ACTIVE_VPI_BITS, + 0x791ad1a4, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_ATM_SUPPORTED_AAL_TYPES, + 0x791ad1a0, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_ATM_SUPPORTED_SERVICE_CATEGORY, + 0x791ad19f, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_ATM_SUPPORTED_VC_RATES, + 0x791ad19e, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + + +DEFINE_GUID(GUID_NDIS_ATM_RCV_CELLS_DROPPED, + 0x0a21480c, 0xe35f, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_ATM_RCV_CELLS_OK, + 0x0a21480a, 0xe35f, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_ATM_XMIT_CELLS_OK, + 0x0a21480b, 0xe35f, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + + +DEFINE_GUID(GUID_NDIS_FDDI_LONG_CURRENT_ADDR, + 0xacf14036, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_FDDI_LONG_MAX_LIST_SIZE, + 0xacf14038, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_FDDI_LONG_MULTICAST_LIST, + 0xacf14037, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_FDDI_LONG_PERMANENT_ADDR, + 0xacf14035, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_FDDI_SHORT_CURRENT_ADDR, + 0xacf1403a, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_FDDI_SHORT_MAX_LIST_SIZE, + 0xacf1403c, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_FDDI_SHORT_MULTICAST_LIST, + 0xacf1403b, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_FDDI_SHORT_PERMANENT_ADDR, + 0xacf14039, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + + +DEFINE_GUID(GUID_NDIS_FDDI_ATTACHMENT_TYPE, + 0xacf1403d, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_FDDI_DOWNSTREAM_NODE_LONG, + 0xacf1403f, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_FDDI_FRAME_ERRORS, + 0xacf14040, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_FDDI_FRAMES_LOST, + 0xacf14041, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_FDDI_LCT_FAILURES, + 0xacf14043, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_FDDI_LCONNECTION_STATE, + 0xacf14045, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_FDDI_LEM_REJECTS, + 0xacf14044, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_FDDI_RING_MGT_STATE, + 0xacf14042, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_FDDI_UPSTREAM_NODE_LONG, + 0xacf1403e, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + + +DEFINE_GUID(GUID_NDIS_GEN_CURRENT_LOOKAHEAD, + 0x5ec10361, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_CURRENT_PACKET_FILTER, + 0x5ec10360, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_DRIVER_VERSION, + 0x5ec10362, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_HARDWARE_STATUS, + 0x5ec10354, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_MEDIA_IN_USE, + 0x5ec10356, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_MEDIA_SUPPORTED, + 0x5ec10355, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_LINK_SPEED, + 0x5ec10359, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_MAC_OPTIONS, + 0x5ec10365, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_MAXIMUM_LOOKAHEAD, + 0x5ec10357, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_MAXIMUM_FRAME_SIZE, + 0x5ec10358, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_MAXIMUM_SEND_PACKETS, + 0x5ec10367, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_MAXIMUM_TOTAL_SIZE, + 0x5ec10363, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_MEDIA_CONNECT_STATUS, + 0x5ec10366, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_RECEIVE_BLOCK_SIZE, + 0x5ec1035d, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_RECEIVE_BUFFER_SPACE, + 0x5ec1035b, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_TRANSMIT_BUFFER_SPACE, + 0x5ec1035a, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_TRANSMIT_BLOCK_SIZE, + 0x5ec1035c, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_VENDOR_DESCRIPTION, + 0x5ec1035f, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_VENDOR_DRIVER_VERSION, + 0x447956f9, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_VENDOR_ID, + 0x5ec1035e, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + + +DEFINE_GUID(GUID_NDIS_GEN_RCV_ERROR, + 0x447956fd, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_RCV_NO_BUFFER, + 0x447956fe, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_RCV_OK, + 0x447956fb, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_XMIT_ERROR, + 0x447956fc, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_XMIT_OK, + 0x447956fa, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + + +DEFINE_GUID(GUID_NDIS_GEN_CO_DRIVER_VERSION, + 0x791ad198, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_CO_HARDWARE_STATUS, + 0x791ad192, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_CO_LINK_SPEED, + 0x791ad195, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_CO_MAC_OPTIONS, + 0x791ad19a, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_CO_MEDIA_SUPPORTED, + 0x791ad193, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_CO_MEDIA_IN_USE, + 0x791ad194, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_CO_MEDIA_CONNECT_STATUS, + 0x791ad19b, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_CO_MINIMUM_LINK_SPEED, + 0x791ad19d, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_CO_VENDOR_DESCRIPTION, + 0x791ad197, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_CO_VENDOR_DRIVER_VERSION, + 0x791ad19c, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_CO_VENDOR_ID, + 0x791ad196, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + + +DEFINE_GUID(GUID_NDIS_GEN_CO_RCV_PDUS_ERROR, + 0x0a214808, 0xe35f, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_CO_RCV_PDUS_OK, + 0x0a214806, 0xe35f, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_CO_RCV_PDUS_NO_BUFFER, + 0x0a214809, 0xe35f, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_CO_XMIT_PDUS_ERROR, + 0x0a214807, 0xe35f, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_GEN_CO_XMIT_PDUS_OK, + 0x0a214805, 0xe35f, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + + +DEFINE_GUID(GUID_NDIS_STATUS_LINK_SPEED_CHANGE, + 0x981f2d85, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_STATUS_MEDIA_CONNECT, + 0x981f2d7d, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_STATUS_MEDIA_DISCONNECT, + 0x981f2d7e, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_STATUS_MEDIA_SPECIFIC_INDICATION, + 0x981f2d84, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_STATUS_RESET_END, + 0x981f2d77, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +DEFINE_GUID(GUID_NDIS_STATUS_RESET_START, + 0x981f2d76, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c); + +#ifdef __cplusplus +} +#endif + +#endif /* __NDISGUID_H */ diff --git a/reactos/w32api/include/ddk/ndistapi.h b/reactos/w32api/include/ddk/ndistapi.h new file mode 100644 index 00000000000..774f42af9f2 --- /dev/null +++ b/reactos/w32api/include/ddk/ndistapi.h @@ -0,0 +1,1312 @@ +/* + * ndistapi.h + * + * NDIS Telephony API + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __NDISTAPI_H +#define __NDISTAPI_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ndis.h" + +#ifndef NDIS_TAPI_CURRENT_VERSION +#define NDIS_TAPI_CURRENT_VERSION 0x00010003 +#endif + +typedef ULONG_PTR HTAPI_LINE; +typedef ULONG_PTR HDRV_LINE; +typedef ULONG_PTR HTAPI_CALL; +typedef ULONG_PTR HDRV_CALL; + +#define NDIS_STATUS_TAPI_ADDRESSBLOCKED ((NDIS_STATUS)0xC0012000L) +#define NDIS_STATUS_TAPI_BEARERMODEUNAVAIL ((NDIS_STATUS)0xC0012001L) +#define NDIS_STATUS_TAPI_CALLUNAVAIL ((NDIS_STATUS)0xC0012002L) +#define NDIS_STATUS_TAPI_DIALBILLING ((NDIS_STATUS)0xC0012003L) +#define NDIS_STATUS_TAPI_DIALDIALTONE ((NDIS_STATUS)0xC0012004L) +#define NDIS_STATUS_TAPI_DIALPROMPT ((NDIS_STATUS)0xC0012005L) +#define NDIS_STATUS_TAPI_DIALQUIET ((NDIS_STATUS)0xC0012006L) +#define NDIS_STATUS_TAPI_INCOMPATIBLEEXTVERSION ((NDIS_STATUS)0xC0012007L) +#define NDIS_STATUS_TAPI_INUSE ((NDIS_STATUS)0xC0012008L) +#define NDIS_STATUS_TAPI_INVALADDRESS ((NDIS_STATUS)0xC0012009L) +#define NDIS_STATUS_TAPI_INVALADDRESSID ((NDIS_STATUS)0xC001200AL) +#define NDIS_STATUS_TAPI_INVALADDRESSMODE ((NDIS_STATUS)0xC001200BL) +#define NDIS_STATUS_TAPI_INVALBEARERMODE ((NDIS_STATUS)0xC001200CL) +#define NDIS_STATUS_TAPI_INVALCALLHANDLE ((NDIS_STATUS)0xC001200DL) +#define NDIS_STATUS_TAPI_INVALCALLPARAMS ((NDIS_STATUS)0xC001200EL) +#define NDIS_STATUS_TAPI_INVALCALLSTATE ((NDIS_STATUS)0xC001200FL) +#define NDIS_STATUS_TAPI_INVALDEVICECLASS ((NDIS_STATUS)0xC0012010L) +#define NDIS_STATUS_TAPI_INVALLINEHANDLE ((NDIS_STATUS)0xC0012011L) +#define NDIS_STATUS_TAPI_INVALLINESTATE ((NDIS_STATUS)0xC0012012L) +#define NDIS_STATUS_TAPI_INVALMEDIAMODE ((NDIS_STATUS)0xC0012013L) +#define NDIS_STATUS_TAPI_INVALRATE ((NDIS_STATUS)0xC0012014L) +#define NDIS_STATUS_TAPI_NODRIVER ((NDIS_STATUS)0xC0012015L) +#define NDIS_STATUS_TAPI_OPERATIONUNAVAIL ((NDIS_STATUS)0xC0012016L) +#define NDIS_STATUS_TAPI_RATEUNAVAIL ((NDIS_STATUS)0xC0012017L) +#define NDIS_STATUS_TAPI_RESOURCEUNAVAIL ((NDIS_STATUS)0xC0012018L) +#define NDIS_STATUS_TAPI_STRUCTURETOOSMALL ((NDIS_STATUS)0xC0012019L) +#define NDIS_STATUS_TAPI_USERUSERINFOTOOBIG ((NDIS_STATUS)0xC001201AL) +#define NDIS_STATUS_TAPI_ALLOCATED ((NDIS_STATUS)0xC001201BL) +#define NDIS_STATUS_TAPI_INVALADDRESSSTATE ((NDIS_STATUS)0xC001201CL) +#define NDIS_STATUS_TAPI_INVALPARAM ((NDIS_STATUS)0xC001201DL) +#define NDIS_STATUS_TAPI_NODEVICE ((NDIS_STATUS)0xC001201EL) +#define NDIS_STATUS_TAPI_DISCONNECTMODE_NORMAL ((NDIS_STATUS)0xC0012020L) +#define NDIS_STATUS_TAPI_DISCONNECTMODE_UNKNOWN ((NDIS_STATUS)0xC0012021L) +#define NDIS_STATUS_TAPI_DISCONNECTMODE_REJECT ((NDIS_STATUS)0xC0012022L) +#define NDIS_STATUS_TAPI_DISCONNECTMODE_PICKUP ((NDIS_STATUS)0xC0012023L) +#define NDIS_STATUS_TAPI_DISCONNECTMODE_FORWARDED ((NDIS_STATUS)0xC0012024L) +#define NDIS_STATUS_TAPI_DISCONNECTMODE_BUSY ((NDIS_STATUS)0xC0012025L) +#define NDIS_STATUS_TAPI_DISCONNECTMODE_NOANSWER ((NDIS_STATUS)0xC0012026L) +#define NDIS_STATUS_TAPI_DISCONNECTMODE_BADADDRESS ((NDIS_STATUS)0xC0012027L) +#define NDIS_STATUS_TAPI_DISCONNECTMODE_UNREACHABLE ((NDIS_STATUS)0xC0012028L) +#define NDIS_STATUS_TAPI_DISCONNECTMODE_CONGESTION ((NDIS_STATUS)0xC0012029L) +#define NDIS_STATUS_TAPI_DISCONNECTMODE_INCOMPATIBLE ((NDIS_STATUS)0xC001202AL) +#define NDIS_STATUS_TAPI_DISCONNECTMODE_UNAVAIL ((NDIS_STATUS)0xC001202BL) +#define NDIS_STATUS_TAPI_RECV_DIGIT ((NDIS_STATUS)0x40010020L) + +#define LINE_ADDRESSSTATE 0L +#define LINE_CALLINFO 1L +#define LINE_CALLSTATE 2L +#define LINE_CLOSE 3L +#define LINE_DEVSPECIFIC 4L +#define LINE_DEVSPECIFICFEATURE 5L +#define LINE_GATHERDIGITS 6L +#define LINE_GENERATE 7L +#define LINE_LINEDEVSTATE 8L +#define LINE_MONITORDIGITS 9L +#define LINE_MONITORMEDIA 10L +#define LINE_MONITORTONE 11L +#define LINE_REPLY 12L +#define LINE_REQUEST 13L +#define LINE_CREATE 19L +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00020000) +#define LINE_AGENTSPECIFIC 21L +#define LINE_AGENTSTATUS 22L +#define LINE_APPNEWCALL 23L +#define LINE_PROXYREQUEST 24L +#define LINE_REMOVE 25L +#endif +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00020002) +#define LINE_AGENTSESSIONSTATUS 27L +#define LINE_QUEUESTATUS 28L +#define LINE_AGENTSTATUSEX 29L +#define LINE_GROUPSTATUS 30L +#define LINE_PROXYSTATUS 31L +#endif +#if (TAPI_CURRENT_VERSION >= 0x00030000) +#define LINE_APPNEWCALLHUB 32L +#define LINE_CALLHUBCLOSE 33L +#define LINE_DEVSPECIFICEX 34L +#endif + +#define TSPI_MESSAGE_BASE 500L +#define LINE_NEWCALL TSPI_MESSAGE_BASE +#define LINE_CALLDEVSPECIFIC (TSPI_MESSAGE_BASE + 1L) +#define STRINGFORMAT_ASCII 0x00000001 +#define STRINGFORMAT_DBCS 0x00000002 +#define STRINGFORMAT_UNICODE 0x00000003 +#define STRINGFORMAT_BINARY 0x00000004 + +#define LINEADDRCAPFLAGS_FWDNUMRINGS 0x00000001 +#define LINEADDRCAPFLAGS_PICKUPGROUPID 0x00000002 +#define LINEADDRCAPFLAGS_SECURE 0x00000004 +#define LINEADDRCAPFLAGS_BLOCKIDDEFAULT 0x00000008 +#define LINEADDRCAPFLAGS_BLOCKIDOVERRIDE 0x00000010 +#define LINEADDRCAPFLAGS_DIALED 0x00000020 +#define LINEADDRCAPFLAGS_ORIGOFFHOOK 0x00000040 +#define LINEADDRCAPFLAGS_DESTOFFHOOK 0x00000080 +#define LINEADDRCAPFLAGS_FWDCONSULT 0x00000100 +#define LINEADDRCAPFLAGS_SETUPCONFNULL 0x00000200 +#define LINEADDRCAPFLAGS_AUTORECONNECT 0x00000400 +#define LINEADDRCAPFLAGS_COMPLETIONID 0x00000800 +#define LINEADDRCAPFLAGS_TRANSFERHELD 0x00001000 +#define LINEADDRCAPFLAGS_TRANSFERMAKE 0x00002000 +#define LINEADDRCAPFLAGS_CONFERENCEHELD 0x00004000 +#define LINEADDRCAPFLAGS_CONFERENCEMAKE 0x00008000 +#define LINEADDRCAPFLAGS_PARTIALDIAL 0x00010000 +#define LINEADDRCAPFLAGS_FWDSTATUSVALID 0x00020000 +#define LINEADDRCAPFLAGS_FWDINTEXTADDR 0x00040000 +#define LINEADDRCAPFLAGS_FWDBUSYNAADDR 0x00080000 +#define LINEADDRCAPFLAGS_ACCEPTTOALERT 0x00100000 +#define LINEADDRCAPFLAGS_CONFDROP 0x00200000 +#define LINEADDRCAPFLAGS_PICKUPCALLWAIT 0x00400000 +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00020000) +#define LINEADDRCAPFLAGS_PREDICTIVEDIALER 0x00800000 +#define LINEADDRCAPFLAGS_QUEUE 0x01000000 +#define LINEADDRCAPFLAGS_ROUTEPOINT 0x02000000 +#define LINEADDRCAPFLAGS_HOLDMAKESNEW 0x04000000 +#define LINEADDRCAPFLAGS_NOINTERNALCALLS 0x08000000 +#define LINEADDRCAPFLAGS_NOEXTERNALCALLS 0x10000000 +#define LINEADDRCAPFLAGS_SETCALLINGID 0x20000000 +#endif +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00030000) +#define LINEADDRCAPFLAGS_ACDGROUP 0x40000000 +#define LINEADDRCAPFLAGS_NOPSTNADDRESSTRANSLATION \ + 0x80000000 +#endif + +#define LINEADDRESSMODE_ADDRESSID 0x00000001 +#define LINEADDRESSMODE_DIALABLEADDR 0x00000002 +#define LINEADDRESSSHARING_PRIVATE 0x00000001 +#define LINEADDRESSSHARING_BRIDGEDEXCL 0x00000002 +#define LINEADDRESSSHARING_BRIDGEDNEW 0x00000004 +#define LINEADDRESSSHARING_BRIDGEDSHARED 0x00000008 +#define LINEADDRESSSHARING_MONITORED 0x00000010 +#define LINEADDRESSSTATE_OTHER 0x00000001 +#define LINEADDRESSSTATE_DEVSPECIFIC 0x00000002 +#define LINEADDRESSSTATE_INUSEZERO 0x00000004 +#define LINEADDRESSSTATE_INUSEONE 0x00000008 +#define LINEADDRESSSTATE_INUSEMANY 0x00000010 +#define LINEADDRESSSTATE_NUMCALLS 0x00000020 +#define LINEADDRESSSTATE_FORWARD 0x00000040 +#define LINEADDRESSSTATE_TERMINALS 0x00000080 + +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00030000) +#define LINEADDRESSTYPE_PHONENUMBER 0x00000001 +#define LINEADDRESSTYPE_SDP 0x00000002 +#define LINEADDRESSTYPE_EMAILNAME 0x00000004 +#define LINEADDRESSTYPE_DOMAINNAME 0x00000008 +#define LINEADDRESSTYPE_IPADDRESS 0x00000010 +#endif + +#define LINEADDRFEATURE_FORWARD 0x00000001 +#define LINEADDRFEATURE_MAKECALL 0x00000002 +#define LINEADDRFEATURE_PICKUP 0x00000004 +#define LINEADDRFEATURE_SETMEDIACONTROL 0x00000008 +#define LINEADDRFEATURE_SETTERMINAL 0x00000010 +#define LINEADDRFEATURE_SETUPCONF 0x00000020 +#define LINEADDRFEATURE_UNCOMPLETECALL 0x00000040 +#define LINEADDRFEATURE_UNPARK 0x00000080 +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00020000) +#define LINEADDRFEATURE_PICKUPHELD 0x00000100 +#define LINEADDRFEATURE_PICKUPGROUP 0x00000200 +#define LINEADDRFEATURE_PICKUPDIRECT 0x00000400 +#define LINEADDRFEATURE_PICKUPWAITING 0x00000800 +#define LINEADDRFEATURE_FORWARDFWD 0x00001000 +#define LINEADDRFEATURE_FORWARDDND 0x00002000 +#endif + +#define LINEANSWERMODE_NONE 0x00000001 +#define LINEANSWERMODE_DROP 0x00000002 +#define LINEANSWERMODE_HOLD 0x00000004 + +#define LINEBEARERMODE_VOICE 0x00000001 +#define LINEBEARERMODE_SPEECH 0x00000002 +#define LINEBEARERMODE_MULTIUSE 0x00000004 +#define LINEBEARERMODE_DATA 0x00000008 +#define LINEBEARERMODE_ALTSPEECHDATA 0x00000010 +#define LINEBEARERMODE_NONCALLSIGNALING 0x00000020 +#define LINEBEARERMODE_PASSTHROUGH 0x00000040 +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00020000) +#define LINEBEARERMODE_RESTRICTEDDATA 0x00000080 +#endif + +#define LINEBUSYMODE_STATION 0x00000001 +#define LINEBUSYMODE_TRUNK 0x00000002 +#define LINEBUSYMODE_UNKNOWN 0x00000004 +#define LINEBUSYMODE_UNAVAIL 0x00000008 + +#define LINECALLCOMPLCOND_BUSY 0x00000001 +#define LINECALLCOMPLCOND_NOANSWER 0x00000002 + +#define LINECALLCOMPLMODE_CAMPON 0x00000001 +#define LINECALLCOMPLMODE_CALLBACK 0x00000002 +#define LINECALLCOMPLMODE_INTRUDE 0x00000004 +#define LINECALLCOMPLMODE_MESSAGE 0x00000008 + +#define LINECALLFEATURE_ACCEPT 0x00000001 +#define LINECALLFEATURE_ADDTOCONF 0x00000002 +#define LINECALLFEATURE_ANSWER 0x00000004 +#define LINECALLFEATURE_BLINDTRANSFER 0x00000008 +#define LINECALLFEATURE_COMPLETECALL 0x00000010 +#define LINECALLFEATURE_COMPLETETRANSF 0x00000020 +#define LINECALLFEATURE_DIAL 0x00000040 +#define LINECALLFEATURE_DROP 0x00000080 +#define LINECALLFEATURE_GATHERDIGITS 0x00000100 +#define LINECALLFEATURE_GENERATEDIGITS 0x00000200 +#define LINECALLFEATURE_GENERATETONE 0x00000400 +#define LINECALLFEATURE_HOLD 0x00000800 +#define LINECALLFEATURE_MONITORDIGITS 0x00001000 +#define LINECALLFEATURE_MONITORMEDIA 0x00002000 +#define LINECALLFEATURE_MONITORTONES 0x00004000 +#define LINECALLFEATURE_PARK 0x00008000 +#define LINECALLFEATURE_PREPAREADDCONF 0x00010000 +#define LINECALLFEATURE_REDIRECT 0x00020000 +#define LINECALLFEATURE_REMOVEFROMCONF 0x00040000 +#define LINECALLFEATURE_SECURECALL 0x00080000 +#define LINECALLFEATURE_SENDUSERUSER 0x00100000 +#define LINECALLFEATURE_SETCALLPARAMS 0x00200000 +#define LINECALLFEATURE_SETMEDIACONTROL 0x00400000 +#define LINECALLFEATURE_SETTERMINAL 0x00800000 +#define LINECALLFEATURE_SETUPCONF 0x01000000 +#define LINECALLFEATURE_SETUPTRANSFER 0x02000000 +#define LINECALLFEATURE_SWAPHOLD 0x04000000 +#define LINECALLFEATURE_UNHOLD 0x08000000 +#define LINECALLFEATURE_RELEASEUSERUSERINFO \ + 0x10000000 +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00020000) +#define LINECALLFEATURE_SETTREATMENT 0x20000000 +#define LINECALLFEATURE_SETQOS 0x40000000 +#define LINECALLFEATURE_SETCALLDATA 0x80000000 +#endif + +#define LINECALLINFOSTATE_OTHER 0x00000001 +#define LINECALLINFOSTATE_DEVSPECIFIC 0x00000002 +#define LINECALLINFOSTATE_BEARERMODE 0x00000004 +#define LINECALLINFOSTATE_RATE 0x00000008 +#define LINECALLINFOSTATE_MEDIAMODE 0x00000010 +#define LINECALLINFOSTATE_APPSPECIFIC 0x00000020 +#define LINECALLINFOSTATE_CALLID 0x00000040 +#define LINECALLINFOSTATE_RELATEDCALLID 0x00000080 +#define LINECALLINFOSTATE_ORIGIN 0x00000100 +#define LINECALLINFOSTATE_REASON 0x00000200 +#define LINECALLINFOSTATE_COMPLETIONID 0x00000400 +#define LINECALLINFOSTATE_NUMOWNERINCR 0x00000800 +#define LINECALLINFOSTATE_NUMOWNERDECR 0x00001000 +#define LINECALLINFOSTATE_NUMMONITORS 0x00002000 +#define LINECALLINFOSTATE_TRUNK 0x00004000 +#define LINECALLINFOSTATE_CALLERID 0x00008000 +#define LINECALLINFOSTATE_CALLEDID 0x00010000 +#define LINECALLINFOSTATE_CONNECTEDID 0x00020000 +#define LINECALLINFOSTATE_REDIRECTIONID 0x00040000 +#define LINECALLINFOSTATE_REDIRECTINGID 0x00080000 +#define LINECALLINFOSTATE_DISPLAY 0x00100000 +#define LINECALLINFOSTATE_USERUSERINFO 0x00200000 +#define LINECALLINFOSTATE_HIGHLEVELCOMP 0x00400000 +#define LINECALLINFOSTATE_LOWLEVELCOMP 0x00800000 +#define LINECALLINFOSTATE_CHARGINGINFO 0x01000000 +#define LINECALLINFOSTATE_TERMINAL 0x02000000 +#define LINECALLINFOSTATE_DIALPARAMS 0x04000000 +#define LINECALLINFOSTATE_MONITORMODES 0x08000000 +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00020000) +#define LINECALLINFOSTATE_TREATMENT 0x10000000 +#define LINECALLINFOSTATE_QOS 0x20000000 +#define LINECALLINFOSTATE_CALLDATA 0x40000000 +#endif + +#define LINECALLORIGIN_OUTBOUND 0x00000001 +#define LINECALLORIGIN_INTERNAL 0x00000002 +#define LINECALLORIGIN_EXTERNAL 0x00000004 +#define LINECALLORIGIN_UNKNOWN 0x00000010 +#define LINECALLORIGIN_UNAVAIL 0x00000020 +#define LINECALLORIGIN_CONFERENCE 0x00000040 +#define LINECALLORIGIN_INBOUND 0x00000080 + +#define LINECALLPARAMFLAGS_SECURE 0x00000001 +#define LINECALLPARAMFLAGS_IDLE 0x00000002 +#define LINECALLPARAMFLAGS_BLOCKID 0x00000004 +#define LINECALLPARAMFLAGS_ORIGOFFHOOK 0x00000008 +#define LINECALLPARAMFLAGS_DESTOFFHOOK 0x00000010 +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00020000) +#define LINECALLPARAMFLAGS_NOHOLDCONFERENCE \ + 0x00000020 +#define LINECALLPARAMFLAGS_PREDICTIVEDIAL 0x00000040 +#define LINECALLPARAMFLAGS_ONESTEPTRANSFER \ + 0x00000080 +#endif + +#define LINECALLPARTYID_BLOCKED 0x00000001 +#define LINECALLPARTYID_OUTOFAREA 0x00000002 +#define LINECALLPARTYID_NAME 0x00000004 +#define LINECALLPARTYID_ADDRESS 0x00000008 +#define LINECALLPARTYID_PARTIAL 0x00000010 +#define LINECALLPARTYID_UNKNOWN 0x00000020 +#define LINECALLPARTYID_UNAVAIL 0x00000040 + +#define LINECALLPRIVILEGE_NONE 0x00000001 +#define LINECALLPRIVILEGE_MONITOR 0x00000002 +#define LINECALLPRIVILEGE_OWNER 0x00000004 + +#define LINECALLREASON_DIRECT 0x00000001 +#define LINECALLREASON_FWDBUSY 0x00000002 +#define LINECALLREASON_FWDNOANSWER 0x00000004 +#define LINECALLREASON_FWDUNCOND 0x00000008 +#define LINECALLREASON_PICKUP 0x00000010 +#define LINECALLREASON_UNPARK 0x00000020 +#define LINECALLREASON_REDIRECT 0x00000040 +#define LINECALLREASON_CALLCOMPLETION 0x00000080 +#define LINECALLREASON_TRANSFER 0x00000100 +#define LINECALLREASON_REMINDER 0x00000200 +#define LINECALLREASON_UNKNOWN 0x00000400 +#define LINECALLREASON_UNAVAIL 0x00000800 +#define LINECALLREASON_INTRUDE 0x00001000 +#define LINECALLREASON_PARKED 0x00002000 +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00020000) +#define LINECALLREASON_CAMPEDON 0x00004000 +#define LINECALLREASON_ROUTEREQUEST 0x00008000 +#endif + +#define LINECALLSELECT_LINE 0x00000001 +#define LINECALLSELECT_ADDRESS 0x00000002 +#define LINECALLSELECT_CALL 0x00000004 +#if (NDIS_TAPI_CURRENT_VERSION > 0x00020000) +#define LINECALLSELECT_DEVICEID 0x00000008 +#endif +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00030000) +#define LINECALLSELECT_CALLID 0x00000010 +#endif + +#define LINECALLSTATE_IDLE 0x00000001 +#define LINECALLSTATE_OFFERING 0x00000002 +#define LINECALLSTATE_ACCEPTED 0x00000004 +#define LINECALLSTATE_DIALTONE 0x00000008 +#define LINECALLSTATE_DIALING 0x00000010 +#define LINECALLSTATE_RINGBACK 0x00000020 +#define LINECALLSTATE_BUSY 0x00000040 +#define LINECALLSTATE_SPECIALINFO 0x00000080 +#define LINECALLSTATE_CONNECTED 0x00000100 +#define LINECALLSTATE_PROCEEDING 0x00000200 +#define LINECALLSTATE_ONHOLD 0x00000400 +#define LINECALLSTATE_CONFERENCED 0x00000800 +#define LINECALLSTATE_ONHOLDPENDCONF 0x00001000 +#define LINECALLSTATE_ONHOLDPENDTRANSFER 0x00002000 +#define LINECALLSTATE_DISCONNECTED 0x00004000 +#define LINECALLSTATE_UNKNOWN 0x00008000 + +#define LINEDEVCAPFLAGS_CROSSADDRCONF 0x00000001 +#define LINEDEVCAPFLAGS_HIGHLEVCOMP 0x00000002 +#define LINEDEVCAPFLAGS_LOWLEVCOMP 0x00000004 +#define LINEDEVCAPFLAGS_MEDIACONTROL 0x00000008 +#define LINEDEVCAPFLAGS_MULTIPLEADDR 0x00000010 +#define LINEDEVCAPFLAGS_CLOSEDROP 0x00000020 +#define LINEDEVCAPFLAGS_DIALBILLING 0x00000040 +#define LINEDEVCAPFLAGS_DIALQUIET 0x00000080 +#define LINEDEVCAPFLAGS_DIALDIALTONE 0x00000100 +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00030000) +#define LINEDEVCAPFLAGS_MSP 0x00000200 +#define LINEDEVCAPFLAGS_CALLHUB 0x00000400 +#define LINEDEVCAPFLAGS_CALLHUBTRACKING 0x00000800 +#define LINEDEVCAPFLAGS_PRIVATEOBJECTS 0x00001000 +#endif + +#define LINEDEVSTATE_OTHER 0x00000001 +#define LINEDEVSTATE_RINGING 0x00000002 +#define LINEDEVSTATE_CONNECTED 0x00000004 +#define LINEDEVSTATE_DISCONNECTED 0x00000008 +#define LINEDEVSTATE_MSGWAITON 0x00000010 +#define LINEDEVSTATE_MSGWAITOFF 0x00000020 +#define LINEDEVSTATE_INSERVICE 0x00000040 +#define LINEDEVSTATE_OUTOFSERVICE 0x00000080 +#define LINEDEVSTATE_MAINTENANCE 0x00000100 +#define LINEDEVSTATE_OPEN 0x00000200 +#define LINEDEVSTATE_CLOSE 0x00000400 +#define LINEDEVSTATE_NUMCALLS 0x00000800 +#define LINEDEVSTATE_NUMCOMPLETIONS 0x00001000 +#define LINEDEVSTATE_TERMINALS 0x00002000 +#define LINEDEVSTATE_ROAMMODE 0x00004000 +#define LINEDEVSTATE_BATTERY 0x00008000 +#define LINEDEVSTATE_SIGNAL 0x00010000 +#define LINEDEVSTATE_DEVSPECIFIC 0x00020000 +#define LINEDEVSTATE_REINIT 0x00040000 +#define LINEDEVSTATE_LOCK 0x00080000 + +#define LINEDEVSTATUSFLAGS_CONNECTED 0x00000001 +#define LINEDEVSTATUSFLAGS_MSGWAIT 0x00000002 +#define LINEDEVSTATUSFLAGS_INSERVICE 0x00000004 +#define LINEDEVSTATUSFLAGS_LOCKED 0x00000008 + +#define LINEDIALTONEMODE_NORMAL 0x00000001 +#define LINEDIALTONEMODE_SPECIAL 0x00000002 +#define LINEDIALTONEMODE_INTERNAL 0x00000004 +#define LINEDIALTONEMODE_EXTERNAL 0x00000008 +#define LINEDIALTONEMODE_UNKNOWN 0x00000010 +#define LINEDIALTONEMODE_UNAVAIL 0x00000020 + +#define LINEDIGITMODE_PULSE 0x00000001 +#define LINEDIGITMODE_DTMF 0x00000002 +#define LINEDIGITMODE_DTMFEND 0x00000004 + +#define LINEDISCONNECTMODE_NORMAL 0x00000001 +#define LINEDISCONNECTMODE_UNKNOWN 0x00000002 +#define LINEDISCONNECTMODE_REJECT 0x00000004 +#define LINEDISCONNECTMODE_PICKUP 0x00000008 +#define LINEDISCONNECTMODE_FORWARDED 0x00000010 +#define LINEDISCONNECTMODE_BUSY 0x00000020 +#define LINEDISCONNECTMODE_NOANSWER 0x00000040 +#define LINEDISCONNECTMODE_BADADDRESS 0x00000080 +#define LINEDISCONNECTMODE_UNREACHABLE 0x00000100 +#define LINEDISCONNECTMODE_CONGESTION 0x00000200 +#define LINEDISCONNECTMODE_INCOMPATIBLE 0x00000400 +#define LINEDISCONNECTMODE_UNAVAIL 0x00000800 +#define LINEDISCONNECTMODE_NODIALTONE 0x00001000 +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00020000) +#define LINEDISCONNECTMODE_NUMBERCHANGED 0x00002000 +#define LINEDISCONNECTMODE_OUTOFORDER 0x00004000 +#define LINEDISCONNECTMODE_TEMPFAILURE 0x00008000 +#define LINEDISCONNECTMODE_QOSUNAVAIL 0x00010000 +#define LINEDISCONNECTMODE_BLOCKED 0x00020000 +#define LINEDISCONNECTMODE_DONOTDISTURB 0x00040000 +#define LINEDISCONNECTMODE_CANCELLED 0x00080000 +#endif + +#define LINEFEATURE_DEVSPECIFIC 0x00000001 +#define LINEFEATURE_DEVSPECIFICFEAT 0x00000002 +#define LINEFEATURE_FORWARD 0x00000004 +#define LINEFEATURE_MAKECALL 0x00000008 +#define LINEFEATURE_SETMEDIACONTROL 0x00000010 +#define LINEFEATURE_SETTERMINAL 0x00000020 +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00020000) +#define LINEFEATURE_SETDEVSTATUS 0x00000040 +#define LINEFEATURE_FORWARDFWD 0x00000080 +#define LINEFEATURE_FORWARDDND 0x00000100 +#endif + +#define LINEFORWARDMODE_UNCOND 0x00000001 +#define LINEFORWARDMODE_UNCONDINTERNAL 0x00000002 +#define LINEFORWARDMODE_UNCONDEXTERNAL 0x00000004 +#define LINEFORWARDMODE_UNCONDSPECIFIC 0x00000008 +#define LINEFORWARDMODE_BUSY 0x00000010 +#define LINEFORWARDMODE_BUSYINTERNAL 0x00000020 +#define LINEFORWARDMODE_BUSYEXTERNAL 0x00000040 +#define LINEFORWARDMODE_BUSYSPECIFIC 0x00000080 +#define LINEFORWARDMODE_NOANSW 0x00000100 +#define LINEFORWARDMODE_NOANSWINTERNAL 0x00000200 +#define LINEFORWARDMODE_NOANSWEXTERNAL 0x00000400 +#define LINEFORWARDMODE_NOANSWSPECIFIC 0x00000800 +#define LINEFORWARDMODE_BUSYNA 0x00001000 +#define LINEFORWARDMODE_BUSYNAINTERNAL 0x00002000 +#define LINEFORWARDMODE_BUSYNAEXTERNAL 0x00004000 +#define LINEFORWARDMODE_BUSYNASPECIFIC 0x00008000 + +#define LINEGATHERTERM_BUFFERFULL 0x00000001 +#define LINEGATHERTERM_TERMDIGIT 0x00000002 +#define LINEGATHERTERM_FIRSTTIMEOUT 0x00000004 +#define LINEGATHERTERM_INTERTIMEOUT 0x00000008 +#define LINEGATHERTERM_CANCEL 0x00000010 + +#define LINEGENERATETERM_DONE 0x00000001 +#define LINEGENERATETERM_CANCEL 0x00000002 + +#define LINEMEDIACONTROL_NONE 0x00000001 +#define LINEMEDIACONTROL_START 0x00000002 +#define LINEMEDIACONTROL_RESET 0x00000004 +#define LINEMEDIACONTROL_PAUSE 0x00000008 +#define LINEMEDIACONTROL_RESUME 0x00000010 +#define LINEMEDIACONTROL_RATEUP 0x00000020 +#define LINEMEDIACONTROL_RATEDOWN 0x00000040 +#define LINEMEDIACONTROL_RATENORMAL 0x00000080 +#define LINEMEDIACONTROL_VOLUMEUP 0x00000100 +#define LINEMEDIACONTROL_VOLUMEDOWN 0x00000200 +#define LINEMEDIACONTROL_VOLUMENORMAL 0x00000400 + +#define LINEMEDIAMODE_UNKNOWN 0x00000002 +#define LINEMEDIAMODE_INTERACTIVEVOICE 0x00000004 +#define LINEMEDIAMODE_AUTOMATEDVOICE 0x00000008 +#define LINEMEDIAMODE_DATAMODEM 0x00000010 +#define LINEMEDIAMODE_G3FAX 0x00000020 +#define LINEMEDIAMODE_TDD 0x00000040 +#define LINEMEDIAMODE_G4FAX 0x00000080 +#define LINEMEDIAMODE_DIGITALDATA 0x00000100 +#define LINEMEDIAMODE_TELETEX 0x00000200 +#define LINEMEDIAMODE_VIDEOTEX 0x00000400 +#define LINEMEDIAMODE_TELEX 0x00000800 +#define LINEMEDIAMODE_MIXED 0x00001000 +#define LINEMEDIAMODE_ADSI 0x00002000 + +#define LINEMEDIAMODE_VOICEVIEW 0x00004000 +#define LAST_LINEMEDIAMODE 0x00004000 +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00020001) +#define LINEMEDIAMODE_VIDEO 0x00008000 +#define LAST_LINEMEDIAMODE 0x00008000 +#endif + +#define LINEPARKMODE_DIRECTED 0x00000001 +#define LINEPARKMODE_NONDIRECTED 0x00000002 + +#define LINEREMOVEFROMCONF_NONE 0x00000001 +#define LINEREMOVEFROMCONF_LAST 0x00000002 +#define LINEREMOVEFROMCONF_ANY 0x00000003 + +#define LINEREQUESTMODE_MAKECALL 0x00000001 +#define LINEREQUESTMODE_MEDIACALL 0x00000002 +#define LINEREQUESTMODE_DROP 0x00000004 + +#define LAST_LINEREQUESTMODE LINEREQUESTMODE_MEDIACALL + +#define LINEROAMMODE_UNKNOWN 0x00000001 +#define LINEROAMMODE_UNAVAIL 0x00000002 +#define LINEROAMMODE_HOME 0x00000004 +#define LINEROAMMODE_ROAMA 0x00000008 +#define LINEROAMMODE_ROAMB 0x00000010 + +#define LINESPECIALINFO_NOCIRCUIT 0x00000001 +#define LINESPECIALINFO_CUSTIRREG 0x00000002 +#define LINESPECIALINFO_REORDER 0x00000004 +#define LINESPECIALINFO_UNKNOWN 0x00000008 +#define LINESPECIALINFO_UNAVAIL 0x00000010 + +#define LINETERMDEV_PHONE 0x00000001 +#define LINETERMDEV_HEADSET 0x00000002 +#define LINETERMDEV_SPEAKER 0x00000004 + +#define LINETERMMODE_BUTTONS 0x00000001 +#define LINETERMMODE_LAMPS 0x00000002 +#define LINETERMMODE_DISPLAY 0x00000004 +#define LINETERMMODE_RINGER 0x00000008 +#define LINETERMMODE_HOOKSWITCH 0x00000010 +#define LINETERMMODE_MEDIATOLINE 0x00000020 +#define LINETERMMODE_MEDIAFROMLINE 0x00000040 +#define LINETERMMODE_MEDIABIDIRECT 0x00000080 + +#define LINETERMSHARING_PRIVATE 0x00000001 +#define LINETERMSHARING_SHAREDEXCL 0x00000002 +#define LINETERMSHARING_SHAREDCONF 0x00000004 + +#define LINETONEMODE_CUSTOM 0x00000001 +#define LINETONEMODE_RINGBACK 0x00000002 +#define LINETONEMODE_BUSY 0x00000004 +#define LINETONEMODE_BEEP 0x00000008 +#define LINETONEMODE_BILLING 0x00000010 + +#define LINETRANSFERMODE_TRANSFER 0x00000001 +#define LINETRANSFERMODE_CONFERENCE 0x00000002 + +#define LINETOLLLISTOPTION_ADD 0x00000001 +#define LINETOLLLISTOPTION_REMOVE 0x00000002 + +#define LINETRANSLATEOPTION_CARDOVERRIDE 0x00000001 + +#define LINETRANSLATERESULT_CANONICAL 0x00000001 +#define LINETRANSLATERESULT_INTERNATIONAL 0x00000002 +#define LINETRANSLATERESULT_LONGDISTANCE 0x00000004 +#define LINETRANSLATERESULT_LOCAL 0x00000008 +#define LINETRANSLATERESULT_INTOLLLIST 0x00000010 +#define LINETRANSLATERESULT_NOTINTOLLLIST 0x00000020 +#define LINETRANSLATERESULT_DIALBILLING 0x00000040 +#define LINETRANSLATERESULT_DIALQUIET 0x00000080 +#define LINETRANSLATERESULT_DIALDIALTONE 0x00000100 +#define LINETRANSLATERESULT_DIALPROMPT 0x00000200 +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00020000) +#define LINETRANSLATERESULT_VOICEDETECT 0x00000400 +#endif + +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00030000) +#define LINETRANSLATERESULT_NOTRANSLATION 0x00000800 +#endif + + +typedef struct _NDIS_VAR_DATA_DESC { + USHORT Length; + USHORT MaximumLength; + LONG Offset; +} NDIS_VAR_DATA_DESC, *PNDIS_VAR_DATA_DESC; + +typedef struct _LINE_DIAL_PARAMS { + ULONG ulDialPause; + ULONG ulDialSpeed; + ULONG ulDigitDuration; + ULONG ulWaitForDialtone; +} LINE_DIAL_PARAMS, *PLINE_DIAL_PARAMS; + +typedef struct _LINE_ADDRESS_CAPS { + ULONG ulTotalSize; + ULONG ulNeededSize; + ULONG ulUsedSize; + ULONG ulLineDeviceID; + ULONG ulAddressSize; + ULONG ulAddressOffset; + ULONG ulDevSpecificSize; + ULONG ulDevSpecificOffset; + ULONG ulAddressSharing; + ULONG ulAddressStates; + ULONG ulCallInfoStates; + ULONG ulCallerIDFlags; + ULONG ulCalledIDFlags; + ULONG ulConnectedIDFlags; + ULONG ulRedirectionIDFlags; + ULONG ulRedirectingIDFlags; + ULONG ulCallStates; + ULONG ulDialToneModes; + ULONG ulBusyModes; + ULONG ulSpecialInfo; + ULONG ulDisconnectModes; + ULONG ulMaxNumActiveCalls; + ULONG ulMaxNumOnHoldCalls; + ULONG ulMaxNumOnHoldPendingCalls; + ULONG ulMaxNumConference; + ULONG ulMaxNumTransConf; + ULONG ulAddrCapFlags; + ULONG ulCallFeatures; + ULONG ulRemoveFromConfCaps; + ULONG ulRemoveFromConfState; + ULONG ulTransferModes; + ULONG ulParkModes; + ULONG ulForwardModes; + ULONG ulMaxForwardEntries; + ULONG ulMaxSpecificEntries; + ULONG ulMinFwdNumRings; + ULONG ulMaxFwdNumRings; + ULONG ulMaxCallCompletions; + ULONG ulCallCompletionConds; + ULONG ulCallCompletionModes; + ULONG ulNumCompletionMessages; + ULONG ulCompletionMsgTextEntrySize; + ULONG ulCompletionMsgTextSize; + ULONG ulCompletionMsgTextOffset; +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00010004) + ULONG ulAddressFeatures; +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00020000) + ULONG ulPredictiveAutoTransferStates; + ULONG ulNumCallTreatments; + ULONG ulCallTreatmentListSize; + ULONG ulCallTreatmentListOffset; + ULONG ulDeviceClassesSize; + ULONG ulDeviceClassesOffset; + ULONG ulMaxCallDataSize; + ULONG ulCallFeatures2; + ULONG ulMaxNoAnswerTimeout; + ULONG ulConnectedModes; + ULONG ulOfferingModes; + ULONG ulAvailableMediaModes; +#endif +#endif +} LINE_ADDRESS_CAPS, *PLINE_ADDRESS_CAPS; + +typedef struct _LINE_ADDRESS_STATUS { + ULONG ulTotalSize; + ULONG ulNeededSize; + ULONG ulUsedSize; + ULONG ulNumInUse; + ULONG ulNumActiveCalls; + ULONG ulNumOnHoldCalls; + ULONG ulNumOnHoldPendCalls; + ULONG ulAddressFeatures; + ULONG ulNumRingsNoAnswer; + ULONG ulForwardNumEntries; + ULONG ulForwardSize; + ULONG ulForwardOffset; + ULONG ulTerminalModesSize; + ULONG ulTerminalModesOffset; + ULONG ulDevSpecificSize; + ULONG ulDevSpecificOffset; +} LINE_ADDRESS_STATUS, *PLINE_ADDRESS_STATUS; + +typedef struct _LINE_CALL_INFO { + ULONG ulTotalSize; + ULONG ulNeededSize; + ULONG ulUsedSize; + ULONG hLine; + ULONG ulLineDeviceID; + ULONG ulAddressID; + ULONG ulBearerMode; + ULONG ulRate; + ULONG ulMediaMode; + ULONG ulAppSpecific; + ULONG ulCallID; + ULONG ulRelatedCallID; + ULONG ulCallParamFlags; + ULONG ulCallStates; + ULONG ulMonitorDigitModes; + ULONG ulMonitorMediaModes; + LINE_DIAL_PARAMS DialParams; + ULONG ulOrigin; + ULONG ulReason; + ULONG ulCompletionID; + ULONG ulNumOwners; + ULONG ulNumMonitors; + ULONG ulCountryCode; + ULONG ulTrunk; + ULONG ulCallerIDFlags; + ULONG ulCallerIDSize; + ULONG ulCallerIDOffset; + ULONG ulCallerIDNameSize; + ULONG ulCallerIDNameOffset; + ULONG ulCalledIDFlags; + ULONG ulCalledIDSize; + ULONG ulCalledIDOffset; + ULONG ulCalledIDNameSize; + ULONG ulCalledIDNameOffset; + ULONG ulConnectedIDFlags; + ULONG ulConnectedIDSize; + ULONG ulConnectedIDOffset; + ULONG ulConnectedIDNameSize; + ULONG ulConnectedIDNameOffset; + ULONG ulRedirectionIDFlags; + ULONG ulRedirectionIDSize; + ULONG ulRedirectionIDOffset; + ULONG ulRedirectionIDNameSize; + ULONG ulRedirectionIDNameOffset; + ULONG ulRedirectingIDFlags; + ULONG ulRedirectingIDSize; + ULONG ulRedirectingIDOffset; + ULONG ulRedirectingIDNameSize; + ULONG ulRedirectingIDNameOffset; + ULONG ulAppNameSize; + ULONG ulAppNameOffset; + ULONG ulDisplayableAddressSize; + ULONG ulDisplayableAddressOffset; + ULONG ulCalledPartySize; + ULONG ulCalledPartyOffset; + ULONG ulCommentSize; + ULONG ulCommentOffset; + ULONG ulDisplaySize; + ULONG ulDisplayOffset; + ULONG ulUserUserInfoSize; + ULONG ulUserUserInfoOffset; + ULONG ulHighLevelCompSize; + ULONG ulHighLevelCompOffset; + ULONG ulLowLevelCompSize; + ULONG ulLowLevelCompOffset; + ULONG ulChargingInfoSize; + ULONG ulChargingInfoOffset; + ULONG ulTerminalModesSize; + ULONG ulTerminalModesOffset; + ULONG ulDevSpecificSize; + ULONG ulDevSpecificOffset; +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00020000) + ULONG ulCallTreatment; + ULONG ulCallDataSize; + ULONG ulCallDataOffset; + ULONG ulSendingFlowspecSize; + ULONG ulSendingFlowspecOffset; + ULONG ulReceivingFlowspecSize; + ULONG ulReceivingFlowspecOffset; +#endif +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00030000) + ULONG ulCallerIDAddressType; + ULONG ulCalledIDAddressType; + ULONG ulConnectedIDAddressType; + ULONG ulRedirectionIDAddressType; + ULONG ulRedirectingIDAddressType; +#endif +} LINE_CALL_INFO, *PLINE_CALL_INFO; + +typedef struct _LINE_CALL_PARAMS { + ULONG ulTotalSize; + ULONG ulBearerMode; + ULONG ulMinRate; + ULONG ulMaxRate; + ULONG ulMediaMode; + ULONG ulCallParamFlags; + ULONG ulAddressMode; + ULONG ulAddressID; + LINE_DIAL_PARAMS DialParams; + ULONG ulOrigAddressSize; + ULONG ulOrigAddressOffset; + ULONG ulDisplayableAddressSize; + ULONG ulDisplayableAddressOffset; + ULONG ulCalledPartySize; + ULONG ulCalledPartyOffset; + ULONG ulCommentSize; + ULONG ulCommentOffset; + ULONG ulUserUserInfoSize; + ULONG ulUserUserInfoOffset; + ULONG ulHighLevelCompSize; + ULONG ulHighLevelCompOffset; + ULONG ulLowLevelCompSize; + ULONG ulLowLevelCompOffset; + ULONG ulDevSpecificSize; + ULONG ulDevSpecificOffset; +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00020000) + ULONG ulPredictiveAutoTransferStates; + ULONG ulTargetAddressSize; + ULONG ulTargetAddressOffset; + ULONG ulSendingFlowspecSize; + ULONG ulSendingFlowspecOffset; + ULONG ulReceivingFlowspecSize; + ULONG ulReceivingFlowspecOffset; + ULONG ulDeviceClassSize; + ULONG ulDeviceClassOffset; + ULONG ulDeviceConfigSize; + ULONG ulDeviceConfigOffset; + ULONG ulCallDataSize; + ULONG ulCallDataOffset; + ULONG ulNoAnswerTimeout; + ULONG ulCallingPartyIDSize; + ULONG ulCallingPartyIDOffset; +#endif +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00030000) + ULONG ulAddressType; +#endif +} LINE_CALL_PARAMS, *PLINE_CALL_PARAMS; + +typedef struct _LINE_CALL_STATUS { + ULONG ulTotalSize; + ULONG ulNeededSize; + ULONG ulUsedSize; + ULONG ulCallState; + ULONG ulCallStateMode; + ULONG ulCallPrivilege; + ULONG ulCallFeatures; + ULONG ulDevSpecificSize; + ULONG ulDevSpecificOffset; +} LINE_CALL_STATUS, *PLINE_CALL_STATUS; + +typedef struct _LINE_DEV_CAPS { + ULONG ulTotalSize; + ULONG ulNeededSize; + ULONG ulUsedSize; + ULONG ulProviderInfoSize; + ULONG ulProviderInfoOffset; + ULONG ulSwitchInfoSize; + ULONG ulSwitchInfoOffset; + ULONG ulPermanentLineID; + ULONG ulLineNameSize; + ULONG ulLineNameOffset; + ULONG ulStringFormat; + ULONG ulAddressModes; + ULONG ulNumAddresses; + ULONG ulBearerModes; + ULONG ulMaxRate; + ULONG ulMediaModes; + ULONG ulGenerateToneModes; + ULONG ulGenerateToneMaxNumFreq; + ULONG ulGenerateDigitModes; + ULONG ulMonitorToneMaxNumFreq; + ULONG ulMonitorToneMaxNumEntries; + ULONG ulMonitorDigitModes; + ULONG ulGatherDigitsMinTimeout; + ULONG ulGatherDigitsMaxTimeout; + ULONG ulMedCtlDigitMaxListSize; + ULONG ulMedCtlMediaMaxListSize; + ULONG ulMedCtlToneMaxListSize; + ULONG ulMedCtlCallStateMaxListSize; + ULONG ulDevCapFlags; + ULONG ulMaxNumActiveCalls; + ULONG ulAnswerMode; + ULONG ulRingModes; + ULONG ulLineStates; + ULONG ulUUIAcceptSize; + ULONG ulUUIAnswerSize; + ULONG ulUUIMakeCallSize; + ULONG ulUUIDropSize; + ULONG ulUUISendUserUserInfoSize; + ULONG ulUUICallInfoSize; + LINE_DIAL_PARAMS MinDialParams; + LINE_DIAL_PARAMS MaxDialParams; + LINE_DIAL_PARAMS DefaultDialParams; + ULONG ulNumTerminals; + ULONG ulTerminalCapsSize; + ULONG ulTerminalCapsOffset; + ULONG ulTerminalTextEntrySize; + ULONG ulTerminalTextSize; + ULONG ulTerminalTextOffset; + ULONG ulDevSpecificSize; + ULONG ulDevSpecificOffset; +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00010004) + ULONG ulLineFeatures; +#endif +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00020000) + ULONG ulSettableDevStatus; + ULONG ulDeviceClassesSize; + ULONG ulDeviceClassesOffset; +#endif +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00020002) + GUID PermanentLineGuid; +#endif +#if (NDIS_TAPI_CURRENT_VERSION >= 0x00030000) + ULONG ulAddressTypes; + GUID ProtocolGuid; + ULONG ulAvailableTracking; +#endif +} LINE_DEV_CAPS, *PLINE_DEV_CAPS; + +typedef struct _LINE_DEV_STATUS { + ULONG ulTotalSize; + ULONG ulNeededSize; + ULONG ulUsedSize; + ULONG ulNumOpens; + ULONG ulOpenMediaModes; + ULONG ulNumActiveCalls; + ULONG ulNumOnHoldCalls; + ULONG ulNumOnHoldPendCalls; + ULONG ulLineFeatures; + ULONG ulNumCallCompletions; + ULONG ulRingMode; + ULONG ulSignalLevel; + ULONG ulBatteryLevel; + ULONG ulRoamMode; + ULONG ulDevStatusFlags; + ULONG ulTerminalModesSize; + ULONG ulTerminalModesOffset; + ULONG ulDevSpecificSize; + ULONG ulDevSpecificOffset; +} LINE_DEV_STATUS, *PLINE_DEV_STATUS; + +typedef struct _LINE_EXTENSION_ID { + ULONG ulExtensionID0; + ULONG ulExtensionID1; + ULONG ulExtensionID2; + ULONG ulExtensionID3; +} LINE_EXTENSION_ID, *PLINE_EXTENSION_ID; + +typedef struct _VAR_STRING { + ULONG ulTotalSize; + ULONG ulNeededSize; + ULONG ulUsedSize; + ULONG ulStringFormat; + ULONG ulStringSize; + ULONG ulStringOffset; +} VAR_STRING, *PVAR_STRING; + +typedef struct _NDIS_TAPI_ANSWER { + IN ULONG ulRequestID; + IN HDRV_CALL hdCall; + IN ULONG ulUserUserInfoSize; + IN UCHAR UserUserInfo[1]; +} NDIS_TAPI_ANSWER, *PNDIS_TAPI_ANSWER; + +typedef struct _NDIS_TAPI_CLOSE { + IN ULONG ulRequestID; + IN HDRV_LINE hdLine; +} NDIS_TAPI_CLOSE, *PNDIS_TAPI_CLOSE; + +typedef struct _NDIS_TAPI_CLOSE_CALL { + IN ULONG ulRequestID; + IN HDRV_CALL hdCall; +} NDIS_TAPI_CLOSE_CALL, *PNDIS_TAPI_CLOSE_CALL; + +typedef struct _NDIS_TAPI_CONDITIONAL_MEDIA_DETECTION { + IN ULONG ulRequestID; + IN HDRV_LINE hdLine; + IN ULONG ulMediaModes; + IN LINE_CALL_PARAMS LineCallParams; +} NDIS_TAPI_CONDITIONAL_MEDIA_DETECTION, *PNDIS_TAPI_CONDITIONAL_MEDIA_DETECTION; + +typedef struct _NDIS_TAPI_DROP { + IN ULONG ulRequestID; + IN HDRV_CALL hdCall; + IN ULONG ulUserUserInfoSize; + IN UCHAR UserUserInfo[1]; +} NDIS_TAPI_DROP, *PNDIS_TAPI_DROP; + +typedef struct _NDIS_TAPI_PROVIDER_SHUTDOWN { + IN ULONG ulRequestID; +} NDIS_TAPI_PROVIDER_SHUTDOWN, *PNDIS_TAPI_PROVIDER_SHUTDOWN; + +typedef struct _NDIS_TAPI_SET_APP_SPECIFIC { + IN ULONG ulRequestID; + IN HDRV_CALL hdCall; + IN ULONG ulAppSpecific; +} NDIS_TAPI_SET_APP_SPECIFIC, *PNDIS_TAPI_SET_APP_SPECIFIC; + +typedef struct _NDIS_TAPI_SET_CALL_PARAMS { + IN ULONG ulRequestID; + IN HDRV_CALL hdCall; + IN ULONG ulBearerMode; + IN ULONG ulMinRate; + IN ULONG ulMaxRate; + IN BOOLEAN bSetLineDialParams; + IN LINE_DIAL_PARAMS LineDialParams; +} NDIS_TAPI_SET_CALL_PARAMS, *PNDIS_TAPI_SET_CALL_PARAMS; + +typedef struct _NDIS_TAPI_SET_DEFAULT_MEDIA_DETECTION { + IN ULONG ulRequestID; + IN HDRV_LINE hdLine; + IN ULONG ulMediaModes; +} NDIS_TAPI_SET_DEFAULT_MEDIA_DETECTION, *PNDIS_TAPI_SET_DEFAULT_MEDIA_DETECTION; + +typedef struct _NDIS_TAPI_SET_DEV_CONFIG { + IN ULONG ulRequestID; + IN ULONG ulDeviceID; + IN ULONG ulDeviceClassSize; + IN ULONG ulDeviceClassOffset; + IN ULONG ulDeviceConfigSize; + IN UCHAR DeviceConfig[1]; +} NDIS_TAPI_SET_DEV_CONFIG, *PNDIS_TAPI_SET_DEV_CONFIG; + +typedef struct _NDIS_TAPI_SET_MEDIA_MODE { + IN ULONG ulRequestID; + IN HDRV_CALL hdCall; + IN ULONG ulMediaMode; +} NDIS_TAPI_SET_MEDIA_MODE, *PNDIS_TAPI_SET_MEDIA_MODE; + +typedef struct _NDIS_TAPI_SET_STATUS_MESSAGES { + IN ULONG ulRequestID; + IN HDRV_LINE hdLine; + IN ULONG ulLineStates; + IN ULONG ulAddressStates; +} NDIS_TAPI_SET_STATUS_MESSAGES, *PNDIS_TAPI_SET_STATUS_MESSAGES; + +typedef struct _NDIS_TAPI_ACCEPT { + IN ULONG ulRequestID; + IN HDRV_CALL hdCall; + IN ULONG ulUserUserInfoSize; + IN UCHAR UserUserInfo[1]; +} NDIS_TAPI_ACCEPT, *PNDIS_TAPI_ACCEPT; + +typedef struct _NDIS_TAPI_DIAL { + IN ULONG ulRequestID; + IN HDRV_CALL hdCall; + IN ULONG ulDestAddressSize; + IN CHAR szDestAddress[1]; +} NDIS_TAPI_DIAL, *PNDIS_TAPI_DIAL; + +typedef struct _NDIS_TAPI_EVENT { + IN HTAPI_LINE htLine; + IN HTAPI_CALL htCall; + IN ULONG ulMsg; + IN ULONG ulParam1; + IN ULONG ulParam2; + IN ULONG ulParam3; +} NDIS_TAPI_EVENT, *PNDIS_TAPI_EVENT; + +typedef struct _NDIS_TAPI_OPEN { + IN ULONG ulRequestID; + IN ULONG ulDeviceID; + IN HTAPI_LINE htLine; + OUT HDRV_LINE hdLine; +} NDIS_TAPI_OPEN, *PNDIS_TAPI_OPEN; + +typedef struct _NDIS_TAPI_SECURE_CALL { + IN ULONG ulRequestID; + IN HDRV_CALL hdCall; +} NDIS_TAPI_SECURE_CALL, *PNDIS_TAPI_SECURE_CALL; + +typedef struct _NDIS_TAPI_SELECT_EXT_VERSION { + IN ULONG ulRequestID; + IN HDRV_LINE hdLine; + IN ULONG ulExtVersion; +} NDIS_TAPI_SELECT_EXT_VERSION, *PNDIS_TAPI_SELECT_EXT_VERSION; + +typedef struct _NDIS_TAPI_SEND_USER_USER_INFO { + IN ULONG ulRequestID; + IN HDRV_CALL hdCall; + IN ULONG ulUserUserInfoSize; + IN UCHAR UserUserInfo[1]; +} NDIS_TAPI_SEND_USER_USER_INFO, *PNDIS_TAPI_SEND_USER_USER_INFO; + + +typedef struct _NDIS_TAPI_CONFIG_DIALOG { + IN ULONG ulRequestID; + IN ULONG ulDeviceID; + IN ULONG ulDeviceClassSize; + IN ULONG ulDeviceClassOffset; + IN ULONG ulLibraryNameTotalSize; + OUT ULONG ulLibraryNameNeededSize; + OUT CHAR szLibraryName[1]; +} NDIS_TAPI_CONFIG_DIALOG, *PNDIS_TAPI_CONFIG_DIALOG; + +typedef struct _NDIS_TAPI_DEV_SPECIFIC { + IN ULONG ulRequestID; + IN HDRV_LINE hdLine; + IN ULONG ulAddressID; + IN HDRV_CALL hdCall; + IN OUT ULONG ulParamsSize; + IN OUT UCHAR Params[1]; +} NDIS_TAPI_DEV_SPECIFIC, *PNDIS_TAPI_DEV_SPECIFIC; + +typedef struct _NDIS_TAPI_GET_ADDRESS_CAPS { + IN ULONG ulRequestID; + IN ULONG ulDeviceID; + IN ULONG ulAddressID; + IN ULONG ulExtVersion; + OUT LINE_ADDRESS_CAPS LineAddressCaps; +} NDIS_TAPI_GET_ADDRESS_CAPS, *PNDIS_TAPI_GET_ADDRESS_CAPS; + +typedef struct _NDIS_TAPI_GET_ADDRESS_ID { + IN ULONG ulRequestID; + IN HDRV_LINE hdLine; + OUT ULONG ulAddressID; + IN ULONG ulAddressMode; + IN ULONG ulAddressSize; + IN CHAR szAddress[1]; +} NDIS_TAPI_GET_ADDRESS_ID, *PNDIS_TAPI_GET_ADDRESS_ID; + +typedef struct _NDIS_TAPI_GET_ADDRESS_STATUS { + IN ULONG ulRequestID; + IN HDRV_LINE hdLine; + IN ULONG ulAddressID; + OUT LINE_ADDRESS_STATUS LineAddressStatus; +} NDIS_TAPI_GET_ADDRESS_STATUS, *PNDIS_TAPI_GET_ADDRESS_STATUS; + +typedef struct _NDIS_TAPI_GET_CALL_ADDRESS_ID { + IN ULONG ulRequestID; + IN HDRV_CALL hdCall; + OUT ULONG ulAddressID; +} NDIS_TAPI_GET_CALL_ADDRESS_ID, *PNDIS_TAPI_GET_CALL_ADDRESS_ID; + +typedef struct _NDIS_TAPI_GET_CALL_INFO { + ULONG ulRequestID; + IN HDRV_CALL hdCall; + OUT LINE_CALL_INFO LineCallInfo; +} NDIS_TAPI_GET_CALL_INFO, *PNDIS_TAPI_GET_CALL_INFO; + +typedef struct _NDIS_TAPI_GET_CALL_STATUS { + IN ULONG ulRequestID; + IN HDRV_CALL hdCall; + OUT LINE_CALL_STATUS LineCallStatus; +} NDIS_TAPI_GET_CALL_STATUS, *PNDIS_TAPI_GET_CALL_STATUS; + +typedef struct _NDIS_TAPI_GET_DEV_CAPS { + IN ULONG ulRequestID; + IN ULONG ulDeviceID; + IN ULONG ulExtVersion; + OUT LINE_DEV_CAPS LineDevCaps; +} NDIS_TAPI_GET_DEV_CAPS, *PNDIS_TAPI_GET_DEV_CAPS; + +typedef struct _NDIS_TAPI_GET_DEV_CONFIG { + IN ULONG ulRequestID; + IN ULONG ulDeviceID; + IN ULONG ulDeviceClassSize; + IN ULONG ulDeviceClassOffset; + OUT VAR_STRING DeviceConfig; +} NDIS_TAPI_GET_DEV_CONFIG, *PNDIS_TAPI_GET_DEV_CONFIG; + +typedef struct _NDIS_TAPI_GET_EXTENSION_ID { + IN ULONG ulRequestID; + IN ULONG ulDeviceID; + OUT LINE_EXTENSION_ID LineExtensionID; +} NDIS_TAPI_GET_EXTENSION_ID, *PNDIS_TAPI_GET_EXTENSION_ID; + +typedef struct _NDIS_TAPI_GET_ID { + IN ULONG ulRequestID; + IN HDRV_LINE hdLine; + IN ULONG ulAddressID; + IN HDRV_CALL hdCall; + IN ULONG ulSelect; + IN ULONG ulDeviceClassSize; + IN ULONG ulDeviceClassOffset; + OUT VAR_STRING DeviceID; +} NDIS_TAPI_GET_ID, *PNDIS_TAPI_GET_ID; + +typedef struct _NDIS_TAPI_GET_LINE_DEV_STATUS { + IN ULONG ulRequestID; + IN HDRV_LINE hdLine; + OUT LINE_DEV_STATUS LineDevStatus; +} NDIS_TAPI_GET_LINE_DEV_STATUS, *PNDIS_TAPI_GET_LINE_DEV_STATUS; + +typedef struct _NDIS_TAPI_MAKE_CALL { + IN ULONG ulRequestID; + IN HDRV_LINE hdLine; + IN HTAPI_CALL htCall; + OUT HDRV_CALL hdCall; + IN ULONG ulDestAddressSize; + IN ULONG ulDestAddressOffset; + IN BOOLEAN bUseDefaultLineCallParams; + IN LINE_CALL_PARAMS LineCallParams; +} NDIS_TAPI_MAKE_CALL, *PNDIS_TAPI_MAKE_CALL; + +typedef struct _NDIS_TAPI_NEGOTIATE_EXT_VERSION { + IN ULONG ulRequestID; + IN ULONG ulDeviceID; + IN ULONG ulLowVersion; + IN ULONG ulHighVersion; + OUT ULONG ulExtVersion; +} NDIS_TAPI_NEGOTIATE_EXT_VERSION, *PNDIS_TAPI_NEGOTIATE_EXT_VERSION; + +typedef struct _NDIS_TAPI_PROVIDER_INITIALIZE { + IN ULONG ulRequestID; + IN ULONG ulDeviceIDBase; + OUT ULONG ulNumLineDevs; + OUT ULONG ulProviderID; +} NDIS_TAPI_PROVIDER_INITIALIZE, *PNDIS_TAPI_PROVIDER_INITIALIZE; + + +#define CO_TAPI_VERSION NDIS_TAPI_CURRENT_VERSION + +#define CO_TAPI_FLAG_OUTGOING_CALL 0x00000001 +#define CO_TAPI_FLAG_INCOMING_CALL 0x00000002 +#define CO_TAPI_FLAG_USE_DEFAULT_CALLPARAMS 0x00000004 + +#define AF_TAPI_SAP_TYPE 0x00008000 + +typedef struct _CO_TAPI_ADDRESS_CAPS { + IN ULONG ulLineID; + IN ULONG ulAddressID; + OUT ULONG ulFlags; + OUT LINE_ADDRESS_CAPS LineAddressCaps; +} CO_TAPI_ADDRESS_CAPS, *PCO_TAPI_ADDRESS_CAPS; + +/* CO_TAPI_CM_CAPS.ulFlags constants */ +#define CO_TAPI_FLAG_PER_LINE_CAPS 0x00000001 + +typedef struct _CO_TAPI_CM_CAPS { + OUT ULONG ulCoTapiVersion; + OUT ULONG ulNumLines; + OUT ULONG ulFlags; +} CO_TAPI_CM_CAPS, *PCO_TAPI_CM_CAPS; + +typedef struct _CO_TAPI_CALL_DIAGNOSTICS { + OUT ULONG ulOrigin; + OUT ULONG ulReason; + OUT NDIS_VAR_DATA_DESC DiagInfo; +} CO_TAPI_CALL_DIAGNOSTICS, *PCO_TAPI_CALL_DIAGNOSTICS; + + +/* CO_TAPI_LINE_CAPS.ulFlags constants */ +#define CO_TAPI_FLAG_PER_ADDRESS_CAPS 0x00000001 + +typedef struct _CO_TAPI_LINE_CAPS { + IN ULONG ulLineID; + OUT ULONG ulFlags; + OUT LINE_DEV_CAPS LineDevCaps; +} CO_TAPI_LINE_CAPS, *PCO_TAPI_LINE_CAPS; + +typedef struct _CO_TAPI_TRANSLATE_NDIS_CALLPARAMS { + IN ULONG ulFlags; + IN NDIS_VAR_DATA_DESC NdisCallParams; + OUT NDIS_VAR_DATA_DESC LineCallInfo; +} CO_TAPI_TRANSLATE_NDIS_CALLPARAMS, *PCO_TAPI_TRANSLATE_NDIS_CALLPARAMS; + +typedef struct _CO_TAPI_TRANSLATE_TAPI_CALLPARAMS { + IN ULONG ulLineID; + IN ULONG ulAddressID; + IN ULONG ulFlags; + IN NDIS_VAR_DATA_DESC DestAddress; + IN NDIS_VAR_DATA_DESC LineCallParams; + OUT NDIS_VAR_DATA_DESC NdisCallParams; +} CO_TAPI_TRANSLATE_TAPI_CALLPARAMS, *PCO_TAPI_TRANSLATE_TAPI_CALLPARAMS; + +/* CO_TAPI_TRANSLATE_SAP.ulLineID constants */ +#define CO_TAPI_LINE_ID_UNSPECIFIED 0xFFFFFFFF + +/* CO_TAPI_TRANSLATE_SAP.ulAddressID constants */ +#define CO_TAPI_ADDRESS_ID_UNSPECIFIED 0xFFFFFFFF + +typedef struct _CO_TAPI_TRANSLATE_SAP { + IN ULONG ulLineID; + IN ULONG ulAddressID; + IN ULONG ulMediaModes; + IN ULONG Reserved; + OUT ULONG NumberOfSaps; + OUT NDIS_VAR_DATA_DESC NdisSapParams[1]; +} CO_AF_TAPI_SAP, *PCO_AF_TAPI_SAP; + +typedef struct _CO_AF_TAPI_INCOMING_CALL_PARAMETERS { + IN ULONG ulLineID; + IN ULONG ulAddressID; + IN ULONG ulFlags; + IN NDIS_VAR_DATA_DESC LineCallInfo; +} CO_AF_TAPI_INCOMING_CALL_PARAMETERS, *PCO_AF_TAPI_INCOMING_CALL_PARAMETERS; + +typedef struct _CO_AF_TAPI_MAKE_CALL_PARAMETERS { + IN ULONG ulLineID; + IN ULONG ulAddressID; + IN ULONG ulFlags; + IN NDIS_VAR_DATA_DESC DestAddress; + IN NDIS_VAR_DATA_DESC LineCallParams; +} CO_AF_TAPI_MAKE_CALL_PARAMETERS, *PCO_AF_TAPI_MAKE_CALL_PARAMETERS; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __NDISTAPI_H */ diff --git a/reactos/w32api/include/ddk/ndiswan.h b/reactos/w32api/include/ddk/ndiswan.h new file mode 100644 index 00000000000..a3156d5a98c --- /dev/null +++ b/reactos/w32api/include/ddk/ndiswan.h @@ -0,0 +1,255 @@ +/* + * ndiswan.h + * + * Definitions for NDIS WAN miniport drivers + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __NDISWAN_H +#define __NDISWAN_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ndis.h" + +#define NDIS_USE_WAN_WRAPPER 0x00000001 + +#define NDIS_STATUS_TAPI_INDICATION ((NDIS_STATUS)0x40010080L) + +/* NDIS_WAN_INFO.FramingBits constants */ +#define RAS_FRAMING 0x00000001 +#define RAS_COMPRESSION 0x00000002 + +#define ARAP_V1_FRAMING 0x00000004 +#define ARAP_V2_FRAMING 0x00000008 +#define ARAP_FRAMING (ARAP_V1_FRAMING | ARAP_V2_FRAMING) + +#define PPP_MULTILINK_FRAMING 0x00000010 +#define PPP_SHORT_SEQUENCE_HDR_FORMAT 0x00000020 +#define PPP_MC_MULTILINK_FRAMING 0x00000040 + +#define PPP_FRAMING 0x00000100 +#define PPP_COMPRESS_ADDRESS_CONTROL 0x00000200 +#define PPP_COMPRESS_PROTOCOL_FIELD 0x00000400 +#define PPP_ACCM_SUPPORTED 0x00000800 + +#define SLIP_FRAMING 0x00001000 +#define SLIP_VJ_COMPRESSION 0x00002000 +#define SLIP_VJ_AUTODETECT 0x00004000 + +#define MEDIA_NRZ_ENCODING 0x00010000 +#define MEDIA_NRZI_ENCODING 0x00020000 +#define MEDIA_NLPID 0x00040000 + +#define RFC_1356_FRAMING 0x00100000 +#define RFC_1483_FRAMING 0x00200000 +#define RFC_1490_FRAMING 0x00400000 +#define LLC_ENCAPSULATION 0x00800000 + +#define SHIVA_FRAMING 0x01000000 +#define NBF_PRESERVE_MAC_ADDRESS 0x01000000 + +#define PASS_THROUGH_MODE 0x10000000 +#define RAW_PASS_THROUGH_MODE 0x20000000 + +#define TAPI_PROVIDER 0x80000000 + +typedef struct _NDIS_WAN_INFO { + OUT ULONG MaxFrameSize; + OUT ULONG MaxTransmit; + OUT ULONG HeaderPadding; + OUT ULONG TailPadding; + OUT ULONG Endpoints; + OUT UINT MemoryFlags; + OUT NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress; + OUT ULONG FramingBits; + OUT ULONG DesiredACCM; +} NDIS_WAN_INFO, *PNDIS_WAN_INFO; + +typedef struct _NDIS_WAN_GET_LINK_INFO { + IN NDIS_HANDLE NdisLinkHandle; + OUT ULONG MaxSendFrameSize; + OUT ULONG MaxRecvFrameSize; + OUT ULONG HeaderPadding; + OUT ULONG TailPadding; + OUT ULONG SendFramingBits; + OUT ULONG RecvFramingBits; + OUT ULONG SendCompressionBits; + OUT ULONG RecvCompressionBits; + OUT ULONG SendACCM; + OUT ULONG RecvACCM; +} NDIS_WAN_GET_LINK_INFO, *PNDIS_WAN_GET_LINK_INFO; + +typedef struct _NDIS_WAN_SET_LINK_INFO { + IN NDIS_HANDLE NdisLinkHandle; + IN ULONG MaxSendFrameSize; + IN ULONG MaxRecvFrameSize; + IN ULONG HeaderPadding; + IN ULONG TailPadding; + IN ULONG SendFramingBits; + IN ULONG RecvFramingBits; + IN ULONG SendCompressionBits; + IN ULONG RecvCompressionBits; + IN ULONG SendACCM; + IN ULONG RecvACCM; +} NDIS_WAN_SET_LINK_INFO, *PNDIS_WAN_SET_LINK_INFO; + +/* NDIS_WAN_COMPRESS_INFO.MSCompType constants */ +#define NDISWAN_COMPRESSION 0x00000001 +#define NDISWAN_ENCRYPTION 0x00000010 +#define NDISWAN_40_ENCRYPTION 0x00000020 +#define NDISWAN_128_ENCRYPTION 0x00000040 +#define NDISWAN_56_ENCRYPTION 0x00000080 +#define NDISWAN_HISTORY_LESS 0x01000000 + +/* NDIS_WAN_COMPRESS_INFO.CompType constants */ +#define COMPTYPE_OUI 0 +#define COMPTYPE_NT31RAS 254 +#define COMPTYPE_NONE 255 + +typedef struct _NDIS_WAN_COMPRESS_INFO { + UCHAR SessionKey[8]; + ULONG MSCompType; + UCHAR CompType; + USHORT CompLength; + _ANONYMOUS_UNION union { + struct { + UCHAR CompOUI[3]; + UCHAR CompSubType; + UCHAR CompValues[32]; + } Proprietary; + struct { + UCHAR CompValues[32]; + } Public; + } DUMMYUNIONNAME; +} NDIS_WAN_COMPRESS_INFO; + +typedef NDIS_WAN_COMPRESS_INFO *PNDIS_WAN_COMPRESS_INFO; + +typedef struct _NDIS_WAN_GET_COMP_INFO { + IN NDIS_HANDLE NdisLinkHandle; + OUT NDIS_WAN_COMPRESS_INFO SendCapabilities; + OUT NDIS_WAN_COMPRESS_INFO RecvCapabilities; +} NDIS_WAN_GET_COMP_INFO, *PNDIS_WAN_GET_COMP_INFO; + +typedef struct _NDIS_WAN_SET_COMP_INFO { + IN NDIS_HANDLE NdisLinkHandle; + IN NDIS_WAN_COMPRESS_INFO SendCapabilities; + IN NDIS_WAN_COMPRESS_INFO RecvCapabilities; +} NDIS_WAN_SET_COMP_INFO, *PNDIS_WAN_SET_COMP_INFO; + +typedef struct _NDIS_WAN_GET_STATS_INFO { + IN NDIS_HANDLE NdisLinkHandle; + OUT ULONG BytesSent; + OUT ULONG BytesRcvd; + OUT ULONG FramesSent; + OUT ULONG FramesRcvd; + OUT ULONG CRCErrors; + OUT ULONG TimeoutErrors; + OUT ULONG AlignmentErrors; + OUT ULONG SerialOverrunErrors; + OUT ULONG FramingErrors; + OUT ULONG BufferOverrunErrors; + OUT ULONG BytesTransmittedUncompressed; + OUT ULONG BytesReceivedUncompressed; + OUT ULONG BytesTransmittedCompressed; + OUT ULONG BytesReceivedCompressed; +} NDIS_WAN_GET_STATS_INFO, *PNDIS_WAN_GET_STATS_INFO; + +#define NdisMWanInitializeWrapper(NdisWrapperHandle, \ + SystemSpecific1, \ + SystemSpecific2, \ + SystemSpecific3) \ +{ \ + NdisMInitializeWrapper(NdisWrapperHandle, \ + SystemSpecific1, \ + SystemSpecific2, \ + SystemSpecific3); \ +} + +typedef struct _NDIS_WAN_CO_INFO { + OUT ULONG MaxFrameSize; + OUT ULONG MaxSendWindow; + OUT ULONG FramingBits; + OUT ULONG DesiredACCM; +} NDIS_WAN_CO_INFO, *PNDIS_WAN_CO_INFO; + +typedef struct _NDIS_WAN_CO_GET_LINK_INFO { + OUT ULONG MaxSendFrameSize; + OUT ULONG MaxRecvFrameSize; + OUT ULONG SendFramingBits; + OUT ULONG RecvFramingBits; + OUT ULONG SendCompressionBits; + OUT ULONG RecvCompressionBits; + OUT ULONG SendACCM; + OUT ULONG RecvACCM; +} NDIS_WAN_CO_GET_LINK_INFO, *PNDIS_WAN_CO_GET_LINK_INFO; + +typedef struct _NDIS_WAN_CO_SET_LINK_INFO { + IN ULONG MaxSendFrameSize; + IN ULONG MaxRecvFrameSize; + IN ULONG SendFramingBits; + IN ULONG RecvFramingBits; + IN ULONG SendCompressionBits; + IN ULONG RecvCompressionBits; + IN ULONG SendACCM; + IN ULONG RecvACCM; +} NDIS_WAN_CO_SET_LINK_INFO, *PNDIS_WAN_CO_SET_LINK_INFO; + +typedef struct _NDIS_WAN_CO_GET_COMP_INFO { + OUT NDIS_WAN_COMPRESS_INFO SendCapabilities; + OUT NDIS_WAN_COMPRESS_INFO RecvCapabilities; +} NDIS_WAN_CO_GET_COMP_INFO, *PNDIS_WAN_CO_GET_COMP_INFO; + +typedef struct _NDIS_WAN_CO_SET_COMP_INFO { + IN NDIS_WAN_COMPRESS_INFO SendCapabilities; + IN NDIS_WAN_COMPRESS_INFO RecvCapabilities; +} NDIS_WAN_CO_SET_COMP_INFO, *PNDIS_WAN_CO_SET_COMP_INFO; + +typedef struct _NDIS_WAN_CO_GET_STATS_INFO { + OUT ULONG BytesSent; + OUT ULONG BytesRcvd; + OUT ULONG FramesSent; + OUT ULONG FramesRcvd; + OUT ULONG CRCErrors; + OUT ULONG TimeoutErrors; + OUT ULONG AlignmentErrors; + OUT ULONG SerialOverrunErrors; + OUT ULONG FramingErrors; + OUT ULONG BufferOverrunErrors; + OUT ULONG BytesTransmittedUncompressed; + OUT ULONG BytesReceivedUncompressed; + OUT ULONG BytesTransmittedCompressed; + OUT ULONG BytesReceivedCompressed; +} NDIS_WAN_CO_GET_STATS_INFO, *PNDIS_WAN_CO_GET_STATS_INFO; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __NDISWAN_H */ diff --git a/reactos/w32api/include/ddk/netevent.h b/reactos/w32api/include/ddk/netevent.h new file mode 100644 index 00000000000..0cf66e03217 --- /dev/null +++ b/reactos/w32api/include/ddk/netevent.h @@ -0,0 +1,42 @@ +/* + * netevent.h + * + * Network events + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __NETEVENT_H +#define __NETEVENT_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#define EVENT_TRANSPORT_REGISTER_FAILED 0xC000232CL + +#define EVENT_TRANSPORT_ADAPTER_NOT_FOUND 0xC000232EL + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __NETEVENT_H */ diff --git a/reactos/w32api/include/ddk/netpnp.h b/reactos/w32api/include/ddk/netpnp.h new file mode 100644 index 00000000000..32f305d0323 --- /dev/null +++ b/reactos/w32api/include/ddk/netpnp.h @@ -0,0 +1,73 @@ +/* + * netpnp.h + * + * Network Plug and Play event support + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __NETPNP_H +#define __NETPNP_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +typedef enum _NET_PNP_EVENT_CODE { + NetEventSetPower, + NetEventQueryPower, + NetEventQueryRemoveDevice, + NetEventCancelRemoveDevice, + NetEventReconfigure, + NetEventBindList, + NetEventBindsComplete, + NetEventPnPCapabilities, + NetEventMaximum +} NET_PNP_EVENT_CODE, *PNET_PNP_EVENT_CODE; + +typedef struct _NET_PNP_EVENT { + NET_PNP_EVENT_CODE NetEvent; + PVOID Buffer; + ULONG BufferLength; + ULONG_PTR NdisReserved[4]; + ULONG_PTR TransportReserved[4]; + ULONG_PTR TdiReserved[4]; + ULONG_PTR TdiClientReserved[4]; +} NET_PNP_EVENT, *PNET_PNP_EVENT; + +typedef enum _NET_DEVICE_POWER_STATE { + NetDeviceStateUnspecified, + NetDeviceStateD0, + NetDeviceStateD1, + NetDeviceStateD2, + NetDeviceStateD3, + NetDeviceStateMaximum +} NET_DEVICE_POWER_STATE, *PNET_DEVICE_POWER_STATE; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __NETPNP_H */ diff --git a/reactos/w32api/include/ddk/newdev.h b/reactos/w32api/include/ddk/newdev.h new file mode 100644 index 00000000000..7f618ded045 --- /dev/null +++ b/reactos/w32api/include/ddk/newdev.h @@ -0,0 +1,70 @@ +/* + * newdev.h + * + * Driver installation DLL interface + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __NEWDEV_H +#define __NEWDEV_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +/* UpdateDriverForPlugAndPlayDevices.InstallFlags constants */ +#define INSTALLFLAG_FORCE 0x00000001 +#define INSTALLFLAG_READONLY 0x00000002 +#define INSTALLFLAG_NONINTERACTIVE 0x00000004 +#define INSTALLFLAG_BITS 0x00000007 + +BOOL WINAPI +UpdateDriverForPlugAndPlayDevicesA( + HWND hwndParent, + LPCSTR HardwareId, + LPCSTR FullInfPath, + DWORD InstallFlags, + PBOOL bRebootRequired OPTIONAL); + +BOOL WINAPI +UpdateDriverForPlugAndPlayDevicesW( + HWND hwndParent, + LPCWSTR HardwareId, + LPCWSTR FullInfPath, + DWORD InstallFlags, + PBOOL bRebootRequired OPTIONAL); + +#ifdef UNICODE +#define UpdateDriverForPlugAndPlayDevices UpdateDriverForPlugAndPlayDevicesW +#else +#define UpdateDriverForPlugAndPlayDevices UpdateDriverForPlugAndPlayDevicesA +#endif /* UNICODE */ + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __NEWDEV_H */ diff --git a/reactos/w32api/include/ddk/ntapi.h b/reactos/w32api/include/ddk/ntapi.h new file mode 100644 index 00000000000..a9a6b6e5ccb --- /dev/null +++ b/reactos/w32api/include/ddk/ntapi.h @@ -0,0 +1,2887 @@ +/* + * ntapi.h + * + * Windows NT Native API + * + * Most structures in this file is obtained from Windows NT/2000 Native API + * Reference by Gary Nebbett, ISBN 1578701996. + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __NTAPI_H +#define __NTAPI_H + +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include <stdarg.h> +#include <winbase.h> +#include "ntddk.h" +#include "ntpoapi.h" + +typedef struct _PEB *PPEB; + +/* FIXME: Unknown definitions */ +typedef PVOID POBJECT_TYPE_LIST; +typedef PVOID PEXECUTION_STATE; +typedef PVOID PLANGID; + + +/* System information and control */ + +typedef enum _SYSTEM_INFORMATION_CLASS { + SystemInformationClassMin = 0, + SystemBasicInformation = 0, + SystemProcessorInformation = 1, + SystemPerformanceInformation = 2, + SystemTimeOfDayInformation = 3, + SystemPathInformation = 4, + SystemNotImplemented1 = 4, + SystemProcessInformation = 5, + SystemProcessesAndThreadsInformation = 5, + SystemCallCountInfoInformation = 6, + SystemCallCounts = 6, + SystemDeviceInformation = 7, + SystemConfigurationInformation = 7, + SystemProcessorPerformanceInformation = 8, + SystemProcessorTimes = 8, + SystemFlagsInformation = 9, + SystemGlobalFlag = 9, + SystemCallTimeInformation = 10, + SystemNotImplemented2 = 10, + SystemModuleInformation = 11, + SystemLocksInformation = 12, + SystemLockInformation = 12, + SystemStackTraceInformation = 13, + SystemNotImplemented3 = 13, + SystemPagedPoolInformation = 14, + SystemNotImplemented4 = 14, + SystemNonPagedPoolInformation = 15, + SystemNotImplemented5 = 15, + SystemHandleInformation = 16, + SystemObjectInformation = 17, + SystemPageFileInformation = 18, + SystemPagefileInformation = 18, + SystemVdmInstemulInformation = 19, + SystemInstructionEmulationCounts = 19, + SystemVdmBopInformation = 20, + SystemInvalidInfoClass1 = 20, + SystemFileCacheInformation = 21, + SystemCacheInformation = 21, + SystemPoolTagInformation = 22, + SystemInterruptInformation = 23, + SystemProcessorStatistics = 23, + SystemDpcBehaviourInformation = 24, + SystemDpcInformation = 24, + SystemFullMemoryInformation = 25, + SystemNotImplemented6 = 25, + SystemLoadImage = 26, + SystemUnloadImage = 27, + SystemTimeAdjustmentInformation = 28, + SystemTimeAdjustment = 28, + SystemSummaryMemoryInformation = 29, + SystemNotImplemented7 = 29, + SystemNextEventIdInformation = 30, + SystemNotImplemented8 = 30, + SystemEventIdsInformation = 31, + SystemNotImplemented9 = 31, + SystemCrashDumpInformation = 32, + SystemExceptionInformation = 33, + SystemCrashDumpStateInformation = 34, + SystemKernelDebuggerInformation = 35, + SystemContextSwitchInformation = 36, + SystemRegistryQuotaInformation = 37, + SystemLoadAndCallImage = 38, + SystemPrioritySeparation = 39, + SystemPlugPlayBusInformation = 40, + SystemNotImplemented10 = 40, + SystemDockInformation = 41, + SystemNotImplemented11 = 41, + /* SystemPowerInformation = 42, Conflicts with POWER_INFORMATION_LEVEL 1 */ + SystemInvalidInfoClass2 = 42, + SystemProcessorSpeedInformation = 43, + SystemInvalidInfoClass3 = 43, + SystemCurrentTimeZoneInformation = 44, + SystemTimeZoneInformation = 44, + SystemLookasideInformation = 45, + SystemSetTimeSlipEvent = 46, + SystemCreateSession = 47, + SystemDeleteSession = 48, + SystemInvalidInfoClass4 = 49, + SystemRangeStartInformation = 50, + SystemVerifierInformation = 51, + SystemAddVerifier = 52, + SystemSessionProcessesInformation = 53, + SystemInformationClassMax +} SYSTEM_INFORMATION_CLASS; + +typedef struct _SYSTEM_BASIC_INFORMATION { + ULONG Unknown; + ULONG MaximumIncrement; + ULONG PhysicalPageSize; + ULONG NumberOfPhysicalPages; + ULONG LowestPhysicalPage; + ULONG HighestPhysicalPage; + ULONG AllocationGranularity; + ULONG LowestUserAddress; + ULONG HighestUserAddress; + ULONG ActiveProcessors; + UCHAR NumberProcessors; +} SYSTEM_BASIC_INFORMATION, *PSYSTEM_BASIC_INFORMATION; + +typedef struct _SYSTEM_PROCESSOR_INFORMATION { + USHORT ProcessorArchitecture; + USHORT ProcessorLevel; + USHORT ProcessorRevision; + USHORT Unknown; + ULONG FeatureBits; +} SYSTEM_PROCESSOR_INFORMATION, *PSYSTEM_PROCESSOR_INFORMATION; + +typedef struct _SYSTEM_PERFORMANCE_INFORMATION { + LARGE_INTEGER IdleTime; + LARGE_INTEGER ReadTransferCount; + LARGE_INTEGER WriteTransferCount; + LARGE_INTEGER OtherTransferCount; + ULONG ReadOperationCount; + ULONG WriteOperationCount; + ULONG OtherOperationCount; + ULONG AvailablePages; + ULONG TotalCommittedPages; + ULONG TotalCommitLimit; + ULONG PeakCommitment; + ULONG PageFaults; + ULONG WriteCopyFaults; + ULONG TransitionFaults; + ULONG CacheTransitionFaults; + ULONG DemandZeroFaults; + ULONG PagesRead; + ULONG PageReadIos; + ULONG CacheReads; + ULONG CacheIos; + ULONG PagefilePagesWritten; + ULONG PagefilePageWriteIos; + ULONG MappedFilePagesWritten; + ULONG MappedFilePageWriteIos; + ULONG PagedPoolUsage; + ULONG NonPagedPoolUsage; + ULONG PagedPoolAllocs; + ULONG PagedPoolFrees; + ULONG NonPagedPoolAllocs; + ULONG NonPagedPoolFrees; + ULONG TotalFreeSystemPtes; + ULONG SystemCodePage; + ULONG TotalSystemDriverPages; + ULONG TotalSystemCodePages; + ULONG SmallNonPagedLookasideListAllocateHits; + ULONG SmallPagedLookasideListAllocateHits; + ULONG Reserved3; + ULONG MmSystemCachePage; + ULONG PagedPoolPage; + ULONG SystemDriverPage; + ULONG FastReadNoWait; + ULONG FastReadWait; + ULONG FastReadResourceMiss; + ULONG FastReadNotPossible; + ULONG FastMdlReadNoWait; + ULONG FastMdlReadWait; + ULONG FastMdlReadResourceMiss; + ULONG FastMdlReadNotPossible; + ULONG MapDataNoWait; + ULONG MapDataWait; + ULONG MapDataNoWaitMiss; + ULONG MapDataWaitMiss; + ULONG PinMappedDataCount; + ULONG PinReadNoWait; + ULONG PinReadWait; + ULONG PinReadNoWaitMiss; + ULONG PinReadWaitMiss; + ULONG CopyReadNoWait; + ULONG CopyReadWait; + ULONG CopyReadNoWaitMiss; + ULONG CopyReadWaitMiss; + ULONG MdlReadNoWait; + ULONG MdlReadWait; + ULONG MdlReadNoWaitMiss; + ULONG MdlReadWaitMiss; + ULONG ReadAheadIos; + ULONG LazyWriteIos; + ULONG LazyWritePages; + ULONG DataFlushes; + ULONG DataPages; + ULONG ContextSwitches; + ULONG FirstLevelTbFills; + ULONG SecondLevelTbFills; + ULONG SystemCalls; +} SYSTEM_PERFORMANCE_INFORMATION, *PSYSTEM_PERFORMANCE_INFORMATION; + +typedef struct _SYSTEM_TIME_OF_DAY_INFORMATION { + LARGE_INTEGER BootTime; + LARGE_INTEGER CurrentTime; + LARGE_INTEGER TimeZoneBias; + ULONG CurrentTimeZoneId; +} SYSTEM_TIME_OF_DAY_INFORMATION, *PSYSTEM_TIME_OF_DAY_INFORMATION; + +typedef struct _VM_COUNTERS { + ULONG PeakVirtualSize; + ULONG VirtualSize; + ULONG PageFaultCount; + ULONG PeakWorkingSetSize; + ULONG WorkingSetSize; + ULONG QuotaPeakPagedPoolUsage; + ULONG QuotaPagedPoolUsage; + ULONG QuotaPeakNonPagedPoolUsage; + ULONG QuotaNonPagedPoolUsage; + ULONG PagefileUsage; + ULONG PeakPagefileUsage; +} VM_COUNTERS; + +typedef enum _THREAD_STATE { + StateInitialized, + StateReady, + StateRunning, + StateStandby, + StateTerminated, + StateWait, + StateTransition, + StateUnknown +} THREAD_STATE; + +typedef struct _SYSTEM_THREADS { + LARGE_INTEGER KernelTime; + LARGE_INTEGER UserTime; + LARGE_INTEGER CreateTime; + ULONG WaitTime; + PVOID StartAddress; + CLIENT_ID ClientId; + KPRIORITY Priority; + KPRIORITY BasePriority; + ULONG ContextSwitchCount; + THREAD_STATE State; + KWAIT_REASON WaitReason; +} SYSTEM_THREADS, *PSYSTEM_THREADS; + +typedef struct _SYSTEM_PROCESSES { + ULONG NextEntryDelta; + ULONG ThreadCount; + ULONG Reserved1[6]; + LARGE_INTEGER CreateTime; + LARGE_INTEGER UserTime; + LARGE_INTEGER KernelTime; + UNICODE_STRING ProcessName; + KPRIORITY BasePriority; + ULONG ProcessId; + ULONG InheritedFromProcessId; + ULONG HandleCount; + ULONG Reserved2[2]; + VM_COUNTERS VmCounters; + IO_COUNTERS IoCounters; + SYSTEM_THREADS Threads[1]; +} SYSTEM_PROCESSES, *PSYSTEM_PROCESSES; + +typedef struct _SYSTEM_CALLS_INFORMATION { + ULONG Size; + ULONG NumberOfDescriptorTables; + ULONG NumberOfRoutinesInTable[1]; + ULONG CallCounts[ANYSIZE_ARRAY]; +} SYSTEM_CALLS_INFORMATION, *PSYSTEM_CALLS_INFORMATION; + +typedef struct _SYSTEM_CONFIGURATION_INFORMATION { + ULONG DiskCount; + ULONG FloppyCount; + ULONG CdRomCount; + ULONG TapeCount; + ULONG SerialCount; + ULONG ParallelCount; +} SYSTEM_CONFIGURATION_INFORMATION, *PSYSTEM_CONFIGURATION_INFORMATION; + +typedef struct _SYSTEM_PROCESSOR_TIMES { + LARGE_INTEGER IdleTime; + LARGE_INTEGER KernelTime; + LARGE_INTEGER UserTime; + LARGE_INTEGER DpcTime; + LARGE_INTEGER InterruptTime; + ULONG InterruptCount; +} SYSTEM_PROCESSOR_TIMES, *PSYSTEM_PROCESSOR_TIMES; + +/* SYSTEM_GLOBAL_FLAG.GlobalFlag constants */ +#define FLG_STOP_ON_EXCEPTION 0x00000001 +#define FLG_SHOW_LDR_SNAPS 0x00000002 +#define FLG_DEBUG_INITIAL_COMMAND 0x00000004 +#define FLG_STOP_ON_HUNG_GUI 0x00000008 +#define FLG_HEAP_ENABLE_TAIL_CHECK 0x00000010 +#define FLG_HEAP_ENABLE_FREE_CHECK 0x00000020 +#define FLG_HEAP_VALIDATE_PARAMETERS 0x00000040 +#define FLG_HEAP_VALIDATE_ALL 0x00000080 +#define FLG_POOL_ENABLE_TAIL_CHECK 0x00000100 +#define FLG_POOL_ENABLE_FREE_CHECK 0x00000200 +#define FLG_POOL_ENABLE_TAGGING 0x00000400 +#define FLG_HEAP_ENABLE_TAGGING 0x00000800 +#define FLG_USER_STACK_TRACE_DB 0x00001000 +#define FLG_KERNEL_STACK_TRACE_DB 0x00002000 +#define FLG_MAINTAIN_OBJECT_TYPELIST 0x00004000 +#define FLG_HEAP_ENABLE_TAG_BY_DLL 0x00008000 +#define FLG_IGNORE_DEBUG_PRIV 0x00010000 +#define FLG_ENABLE_CSRDEBUG 0x00020000 +#define FLG_ENABLE_KDEBUG_SYMBOL_LOAD 0x00040000 +#define FLG_DISABLE_PAGE_KERNEL_STACKS 0x00080000 +#define FLG_HEAP_ENABLE_CALL_TRACING 0x00100000 +#define FLG_HEAP_DISABLE_COALESCING 0x00200000 +#define FLG_ENABLE_CLOSE_EXCEPTIONS 0x00400000 +#define FLG_ENABLE_EXCEPTION_LOGGING 0x00800000 +#define FLG_ENABLE_DBGPRINT_BUFFERING 0x08000000 + +typedef struct _SYSTEM_GLOBAL_FLAG { + ULONG GlobalFlag; +} SYSTEM_GLOBAL_FLAG, *PSYSTEM_GLOBAL_FLAG; + +typedef struct _SYSTEM_MODULE_INFORMATION_ENTRY { + ULONG Unknown1; + ULONG Unknown2; + PVOID Base; + ULONG Size; + ULONG Flags; + USHORT Index; + /* Length of module name not including the path, this + field contains valid value only for NTOSKRNL module */ + USHORT NameLength; + USHORT LoadCount; + USHORT PathLength; + CHAR ImageName[256]; +} SYSTEM_MODULE_INFORMATION_ENTRY, *PSYSTEM_MODULE_INFORMATION_ENTRY; + +typedef struct _SYSTEM_MODULE_INFORMATION { + ULONG Count; + SYSTEM_MODULE_INFORMATION_ENTRY Module[1]; +} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION; + +typedef struct _SYSTEM_LOCK_INFORMATION { + PVOID Address; + USHORT Type; + USHORT Reserved1; + ULONG ExclusiveOwnerThreadId; + ULONG ActiveCount; + ULONG ContentionCount; + ULONG Reserved2[2]; + ULONG NumberOfSharedWaiters; + ULONG NumberOfExclusiveWaiters; +} SYSTEM_LOCK_INFORMATION, *PSYSTEM_LOCK_INFORMATION; + +/*SYSTEM_HANDLE_INFORMATION.Flags cosntants */ +#define PROTECT_FROM_CLOSE 0x01 +#define INHERIT 0x02 + +typedef struct _SYSTEM_HANDLE_INFORMATION { + ULONG ProcessId; + UCHAR ObjectTypeNumber; + UCHAR Flags; + USHORT Handle; + PVOID Object; + ACCESS_MASK GrantedAccess; +} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION; + +typedef struct _SYSTEM_OBJECT_TYPE_INFORMATION { + ULONG NextEntryOffset; + ULONG ObjectCount; + ULONG HandleCount; + ULONG TypeNumber; + ULONG InvalidAttributes; + GENERIC_MAPPING GenericMapping; + ACCESS_MASK ValidAccessMask; + POOL_TYPE PoolType; + UCHAR Unknown; + UNICODE_STRING Name; +} SYSTEM_OBJECT_TYPE_INFORMATION, *PSYSTEM_OBJECT_TYPE_INFORMATION; + +/* SYSTEM_OBJECT_INFORMATION.Flags constants */ +#define FLG_SYSOBJINFO_SINGLE_HANDLE_ENTRY 0x40 +#define FLG_SYSOBJINFO_DEFAULT_SECURITY_QUOTA 0x20 +#define FLG_SYSOBJINFO_PERMANENT 0x10 +#define FLG_SYSOBJINFO_EXCLUSIVE 0x08 +#define FLG_SYSOBJINFO_CREATOR_INFO 0x04 +#define FLG_SYSOBJINFO_KERNEL_MODE 0x02 + +typedef struct _SYSTEM_OBJECT_INFORMATION { + ULONG NextEntryOffset; + PVOID Object; + ULONG CreatorProcessId; + USHORT Unknown; + USHORT Flags; + ULONG PointerCount; + ULONG HandleCount; + ULONG PagedPoolUsage; + ULONG NonPagedPoolUsage; + ULONG ExclusiveProcessId; + PSECURITY_DESCRIPTOR SecurityDescriptor; + UNICODE_STRING Name; +} SYSTEM_OBJECT_INFORMATION, *PSYSTEM_OBJECT_INFORMATION; + +typedef struct _SYSTEM_PAGEFILE_INFORMATION { + ULONG NextEntryOffset; + ULONG CurrentSize; + ULONG TotalUsed; + ULONG PeakUsed; + UNICODE_STRING FileName; +} SYSTEM_PAGEFILE_INFORMATION, *PSYSTEM_PAGEFILE_INFORMATION; + +typedef struct _SYSTEM_INSTRUCTION_EMULATION_INFORMATION { + ULONG SegmentNotPresent; + ULONG TwoByteOpcode; + ULONG ESprefix; + ULONG CSprefix; + ULONG SSprefix; + ULONG DSprefix; + ULONG FSPrefix; + ULONG GSprefix; + ULONG OPER32prefix; + ULONG ADDR32prefix; + ULONG INSB; + ULONG INSW; + ULONG OUTSB; + ULONG OUTSW; + ULONG PUSHFD; + ULONG POPFD; + ULONG INTnn; + ULONG INTO; + ULONG IRETD; + ULONG INBimm; + ULONG INWimm; + ULONG OUTBimm; + ULONG OUTWimm; + ULONG INB; + ULONG INW; + ULONG OUTB; + ULONG OUTW; + ULONG LOCKprefix; + ULONG REPNEprefix; + ULONG REPprefix; + ULONG HLT; + ULONG CLI; + ULONG STI; + ULONG GenericInvalidOpcode; +} SYSTEM_INSTRUCTION_EMULATION_INFORMATION, *PSYSTEM_INSTRUCTION_EMULATION_INFORMATION; + +typedef struct _SYSTEM_POOL_TAG_INFORMATION { + CHAR Tag[4]; + ULONG PagedPoolAllocs; + ULONG PagedPoolFrees; + ULONG PagedPoolUsage; + ULONG NonPagedPoolAllocs; + ULONG NonPagedPoolFrees; + ULONG NonPagedPoolUsage; +} SYSTEM_POOL_TAG_INFORMATION, *PSYSTEM_POOL_TAG_INFORMATION; + +typedef struct _SYSTEM_PROCESSOR_STATISTICS { + ULONG ContextSwitches; + ULONG DpcCount; + ULONG DpcRequestRate; + ULONG TimeIncrement; + ULONG DpcBypassCount; + ULONG ApcBypassCount; +} SYSTEM_PROCESSOR_STATISTICS, *PSYSTEM_PROCESSOR_STATISTICS; + +typedef struct _SYSTEM_DPC_INFORMATION { + ULONG Reserved; + ULONG MaximumDpcQueueDepth; + ULONG MinimumDpcRate; + ULONG AdjustDpcThreshold; + ULONG IdealDpcRate; +} SYSTEM_DPC_INFORMATION, *PSYSTEM_DPC_INFORMATION; + +typedef struct _SYSTEM_LOAD_IMAGE { + UNICODE_STRING ModuleName; + PVOID ModuleBase; + PVOID SectionPointer; + PVOID EntryPoint; + PVOID ExportDirectory; +} SYSTEM_LOAD_IMAGE, *PSYSTEM_LOAD_IMAGE; + +typedef struct _SYSTEM_UNLOAD_IMAGE { + PVOID ModuleBase; +} SYSTEM_UNLOAD_IMAGE, *PSYSTEM_UNLOAD_IMAGE; + +typedef struct _SYSTEM_QUERY_TIME_ADJUSTMENT { + ULONG TimeAdjustment; + ULONG MaximumIncrement; + BOOLEAN TimeSynchronization; +} SYSTEM_QUERY_TIME_ADJUSTMENT, *PSYSTEM_QUERY_TIME_ADJUSTMENT; + +typedef struct _SYSTEM_SET_TIME_ADJUSTMENT { + ULONG TimeAdjustment; + BOOLEAN TimeSynchronization; +} SYSTEM_SET_TIME_ADJUSTMENT, *PSYSTEM_SET_TIME_ADJUSTMENT; + +typedef struct _SYSTEM_CRASH_DUMP_INFORMATION { + HANDLE CrashDumpSectionHandle; + HANDLE Unknown; +} SYSTEM_CRASH_DUMP_INFORMATION, *PSYSTEM_CRASH_DUMP_INFORMATION; + +typedef struct _SYSTEM_EXCEPTION_INFORMATION { + ULONG AlignmentFixupCount; + ULONG ExceptionDispatchCount; + ULONG FloatingEmulationCount; + ULONG Reserved; +} SYSTEM_EXCEPTION_INFORMATION, *PSYSTEM_EXCEPTION_INFORMATION; + +typedef struct _SYSTEM_CRASH_DUMP_STATE_INFORMATION { + ULONG CrashDumpSectionExists; + ULONG Unknown; +} SYSTEM_CRASH_DUMP_STATE_INFORMATION, *PSYSTEM_CRASH_DUMP_STATE_INFORMATION; + +typedef struct _SYSTEM_KERNEL_DEBUGGER_INFORMATION { + BOOLEAN DebuggerEnabled; + BOOLEAN DebuggerNotPresent; +} SYSTEM_KERNEL_DEBUGGER_INFORMATION, *PSYSTEM_KERNEL_DEBUGGER_INFORMATION; + +typedef struct _SYSTEM_CONTEXT_SWITCH_INFORMATION { + ULONG ContextSwitches; + ULONG ContextSwitchCounters[11]; +} SYSTEM_CONTEXT_SWITCH_INFORMATION, *PSYSTEM_CONTEXT_SWITCH_INFORMATION; + +typedef struct _SYSTEM_REGISTRY_QUOTA_INFORMATION { + ULONG RegistryQuota; + ULONG RegistryQuotaInUse; + ULONG PagedPoolSize; +} SYSTEM_REGISTRY_QUOTA_INFORMATION, *PSYSTEM_REGISTRY_QUOTA_INFORMATION; + +typedef struct _SYSTEM_LOAD_AND_CALL_IMAGE { + UNICODE_STRING ModuleName; +} SYSTEM_LOAD_AND_CALL_IMAGE, *PSYSTEM_LOAD_AND_CALL_IMAGE; + +typedef struct _SYSTEM_PRIORITY_SEPARATION { + ULONG PrioritySeparation; +} SYSTEM_PRIORITY_SEPARATION, *PSYSTEM_PRIORITY_SEPARATION; + +typedef struct _SYSTEM_TIME_ZONE_INFORMATION { + LONG Bias; + WCHAR StandardName[32]; + LARGE_INTEGER StandardDate; + LONG StandardBias; + WCHAR DaylightName[32]; + LARGE_INTEGER DaylightDate; + LONG DaylightBias; +} SYSTEM_TIME_ZONE_INFORMATION, *PSYSTEM_TIME_ZONE_INFORMATION; + +typedef struct _SYSTEM_LOOKASIDE_INFORMATION { + USHORT Depth; + USHORT MaximumDepth; + ULONG TotalAllocates; + ULONG AllocateMisses; + ULONG TotalFrees; + ULONG FreeMisses; + POOL_TYPE Type; + ULONG Tag; + ULONG Size; +} SYSTEM_LOOKASIDE_INFORMATION, *PSYSTEM_LOOKASIDE_INFORMATION; + +typedef struct _SYSTEM_SET_TIME_SLIP_EVENT { + HANDLE TimeSlipEvent; +} SYSTEM_SET_TIME_SLIP_EVENT, *PSYSTEM_SET_TIME_SLIP_EVENT; + +typedef struct _SYSTEM_CREATE_SESSION { + ULONG SessionId; +} SYSTEM_CREATE_SESSION, *PSYSTEM_CREATE_SESSION; + +typedef struct _SYSTEM_DELETE_SESSION { + ULONG SessionId; +} SYSTEM_DELETE_SESSION, *PSYSTEM_DELETE_SESSION; + +typedef struct _SYSTEM_RANGE_START_INFORMATION { + PVOID SystemRangeStart; +} SYSTEM_RANGE_START_INFORMATION, *PSYSTEM_RANGE_START_INFORMATION; + +typedef struct _SYSTEM_SESSION_PROCESSES_INFORMATION { + ULONG SessionId; + ULONG BufferSize; + PVOID Buffer; +} SYSTEM_SESSION_PROCESSES_INFORMATION, *PSYSTEM_SESSION_PROCESSES_INFORMATION; + +typedef struct _SYSTEM_POOL_BLOCK { + BOOLEAN Allocated; + USHORT Unknown; + ULONG Size; + CHAR Tag[4]; +} SYSTEM_POOL_BLOCK, *PSYSTEM_POOL_BLOCK; + +typedef struct _SYSTEM_POOL_BLOCKS_INFORMATION { + ULONG PoolSize; + PVOID PoolBase; + USHORT Unknown; + ULONG NumberOfBlocks; + SYSTEM_POOL_BLOCK PoolBlocks[1]; +} SYSTEM_POOL_BLOCKS_INFORMATION, *PSYSTEM_POOL_BLOCKS_INFORMATION; + +typedef struct _SYSTEM_MEMORY_USAGE { + PVOID Name; + USHORT Valid; + USHORT Standby; + USHORT Modified; + USHORT PageTables; +} SYSTEM_MEMORY_USAGE, *PSYSTEM_MEMORY_USAGE; + +typedef struct _SYSTEM_MEMORY_USAGE_INFORMATION { + ULONG Reserved; + PVOID EndOfData; + SYSTEM_MEMORY_USAGE MemoryUsage[1]; +} SYSTEM_MEMORY_USAGE_INFORMATION, *PSYSTEM_MEMORY_USAGE_INFORMATION; + +NTOSAPI +NTSTATUS +NTAPI +NtQuerySystemInformation( + IN SYSTEM_INFORMATION_CLASS SystemInformationClass, + IN OUT PVOID SystemInformation, + IN ULONG SystemInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +ZwQuerySystemInformation( + IN SYSTEM_INFORMATION_CLASS SystemInformationClass, + IN OUT PVOID SystemInformation, + IN ULONG SystemInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +ZwSetSystemInformation( + IN SYSTEM_INFORMATION_CLASS SystemInformationClass, + IN OUT PVOID SystemInformation, + IN ULONG SystemInformationLength); + +NTOSAPI +NTSTATUS +NTAPI +ZwQuerySystemEnvironmentValue( + IN PUNICODE_STRING Name, + OUT PVOID Value, + IN ULONG ValueLength, + OUT PULONG ReturnLength OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +ZwSetSystemEnvironmentValue( + IN PUNICODE_STRING Name, + IN PUNICODE_STRING Value); + +typedef enum _SHUTDOWN_ACTION { + ShutdownNoReboot, + ShutdownReboot, + ShutdownPowerOff +} SHUTDOWN_ACTION; + +NTOSAPI +NTSTATUS +NTAPI +NtShutdownSystem( + IN SHUTDOWN_ACTION Action); + +typedef enum _DEBUG_CONTROL_CODE { + DebugGetTraceInformation = 1, + DebugSetInternalBreakpoint, + DebugSetSpecialCall, + DebugClearSpecialCalls, + DebugQuerySpecialCalls, + DebugDbgBreakPoint, + DebugMaximum +} DEBUG_CONTROL_CODE; + + +NTOSAPI +NTSTATUS +NTAPI +ZwSystemDebugControl( + IN DEBUG_CONTROL_CODE ControlCode, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength, + OUT PULONG ReturnLength OPTIONAL); + + + +/* Objects, Object directories, and symbolic links */ + +typedef enum _OBJECT_INFORMATION_CLASS { + ObjectBasicInformation, + ObjectNameInformation, + ObjectTypeInformation, + ObjectAllTypesInformation, + ObjectHandleInformation +} OBJECT_INFORMATION_CLASS; + +NTOSAPI +NTSTATUS +NTAPI +ZwQueryObject( + IN HANDLE ObjectHandle, + IN OBJECT_INFORMATION_CLASS ObjectInformationClass, + OUT PVOID ObjectInformation, + IN ULONG ObjectInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +ZwSetInformationObject( + IN HANDLE ObjectHandle, + IN OBJECT_INFORMATION_CLASS ObjectInformationClass, + IN PVOID ObjectInformation, + IN ULONG ObjectInformationLength); + +/* OBJECT_BASIC_INFORMATION.Attributes constants */ +/* also in winbase.h */ +#define HANDLE_FLAG_INHERIT 0x01 +#define HANDLE_FLAG_PROTECT_FROM_CLOSE 0x02 +/* end winbase.h */ +#define PERMANENT 0x10 +#define EXCLUSIVE 0x20 + +typedef struct _OBJECT_BASIC_INFORMATION { + ULONG Attributes; + ACCESS_MASK GrantedAccess; + ULONG HandleCount; + ULONG PointerCount; + ULONG PagedPoolUsage; + ULONG NonPagedPoolUsage; + ULONG Reserved[3]; + ULONG NameInformationLength; + ULONG TypeInformationLength; + ULONG SecurityDescriptorLength; + LARGE_INTEGER CreateTime; +} OBJECT_BASIC_INFORMATION, *POBJECT_BASIC_INFORMATION; +#if 0 +/* FIXME: Enable later */ +typedef struct _OBJECT_TYPE_INFORMATION { + UNICODE_STRING Name; + ULONG ObjectCount; + ULONG HandleCount; + ULONG Reserved1[4]; + ULONG PeakObjectCount; + ULONG PeakHandleCount; + ULONG Reserved2[4]; + ULONG InvalidAttributes; + GENERIC_MAPPING GenericMapping; + ULONG ValidAccess; + UCHAR Unknown; + BOOLEAN MaintainHandleDatabase; + POOL_TYPE PoolType; + ULONG PagedPoolUsage; + ULONG NonPagedPoolUsage; +} OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION; + +typedef struct _OBJECT_ALL_TYPES_INFORMATION { + ULONG NumberOfTypes; + OBJECT_TYPE_INFORMATION TypeInformation; +} OBJECT_ALL_TYPES_INFORMATION, *POBJECT_ALL_TYPES_INFORMATION; +#endif +typedef struct _OBJECT_HANDLE_ATTRIBUTE_INFORMATION { + BOOLEAN Inherit; + BOOLEAN ProtectFromClose; +} OBJECT_HANDLE_ATTRIBUTE_INFORMATION, *POBJECT_HANDLE_ATTRIBUTE_INFORMATION; + +NTOSAPI +NTSTATUS +NTAPI +NtDuplicateObject( + IN HANDLE SourceProcessHandle, + IN HANDLE SourceHandle, + IN HANDLE TargetProcessHandle, + OUT PHANDLE TargetHandle OPTIONAL, + IN ACCESS_MASK DesiredAccess, + IN ULONG Attributes, + IN ULONG Options); + +NTOSAPI +NTSTATUS +NTAPI +ZwDuplicateObject( + IN HANDLE SourceProcessHandle, + IN HANDLE SourceHandle, + IN HANDLE TargetProcessHandle, + OUT PHANDLE TargetHandle OPTIONAL, + IN ACCESS_MASK DesiredAccess, + IN ULONG Attributes, + IN ULONG Options); + +NTOSAPI +NTSTATUS +NTAPI +NtQuerySecurityObject( + IN HANDLE Handle, + IN SECURITY_INFORMATION SecurityInformation, + OUT PSECURITY_DESCRIPTOR SecurityDescriptor, + IN ULONG SecurityDescriptorLength, + OUT PULONG ReturnLength); + +NTOSAPI +NTSTATUS +NTAPI +ZwQuerySecurityObject( + IN HANDLE Handle, + IN SECURITY_INFORMATION SecurityInformation, + OUT PSECURITY_DESCRIPTOR SecurityDescriptor, + IN ULONG SecurityDescriptorLength, + OUT PULONG ReturnLength); + +NTOSAPI +NTSTATUS +NTAPI +NtSetSecurityObject( + IN HANDLE Handle, + IN SECURITY_INFORMATION SecurityInformation, + IN PSECURITY_DESCRIPTOR SecurityDescriptor); + +NTOSAPI +NTSTATUS +NTAPI +ZwSetSecurityObject( + IN HANDLE Handle, + IN SECURITY_INFORMATION SecurityInformation, + IN PSECURITY_DESCRIPTOR SecurityDescriptor); + +NTOSAPI +NTSTATUS +NTAPI +ZwOpenDirectoryObject( + OUT PHANDLE DirectoryHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes); + +NTOSAPI +NTSTATUS +NTAPI +ZwQueryDirectoryObject( + IN HANDLE DirectoryHandle, + OUT PVOID Buffer, + IN ULONG BufferLength, + IN BOOLEAN ReturnSingleEntry, + IN BOOLEAN RestartScan, + IN OUT PULONG Context, + OUT PULONG ReturnLength OPTIONAL); + +typedef struct _DIRECTORY_BASIC_INFORMATION { + UNICODE_STRING ObjectName; + UNICODE_STRING ObjectTypeName; +} DIRECTORY_BASIC_INFORMATION, *PDIRECTORY_BASIC_INFORMATION; + +NTOSAPI +NTSTATUS +NTAPI +ZwCreateSymbolicLinkObject( + OUT PHANDLE SymbolicLinkHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN PUNICODE_STRING TargetName); + + + + +/* Virtual memory */ + +typedef enum _MEMORY_INFORMATION_CLASS { +MemoryBasicInformation, +MemoryWorkingSetList, +MemorySectionName, +MemoryBasicVlmInformation +} MEMORY_INFORMATION_CLASS; + +NTOSAPI +NTSTATUS +NTAPI +NtAllocateVirtualMemory( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN ULONG ZeroBits, + IN OUT PULONG AllocationSize, + IN ULONG AllocationType, + IN ULONG Protect); + +NTOSAPI +NTSTATUS +NTAPI +ZwAllocateVirtualMemory( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN ULONG ZeroBits, + IN OUT PULONG AllocationSize, + IN ULONG AllocationType, + IN ULONG Protect); + +NTOSAPI +NTSTATUS +NTAPI +NtFreeVirtualMemory( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN OUT PULONG FreeSize, + IN ULONG FreeType); + +NTOSAPI +NTSTATUS +NTAPI +ZwFreeVirtualMemory( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN OUT PULONG FreeSize, + IN ULONG FreeType); + +NTOSAPI +NTSTATUS +NTAPI +ZwQueryVirtualMemory( + IN HANDLE ProcessHandle, + IN PVOID BaseAddress, + IN MEMORY_INFORMATION_CLASS MemoryInformationClass, + OUT PVOID MemoryInformation, + IN ULONG MemoryInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +/* MEMORY_WORKING_SET_LIST.WorkingSetList constants */ +#define WSLE_PAGE_READONLY 0x001 +#define WSLE_PAGE_EXECUTE 0x002 +#define WSLE_PAGE_READWRITE 0x004 +#define WSLE_PAGE_EXECUTE_READ 0x003 +#define WSLE_PAGE_WRITECOPY 0x005 +#define WSLE_PAGE_EXECUTE_READWRITE 0x006 +#define WSLE_PAGE_EXECUTE_WRITECOPY 0x007 +#define WSLE_PAGE_SHARE_COUNT_MASK 0x0E0 +#define WSLE_PAGE_SHAREABLE 0x100 + +typedef struct _MEMORY_WORKING_SET_LIST { + ULONG NumberOfPages; + ULONG WorkingSetList[1]; +} MEMORY_WORKING_SET_LIST, *PMEMORY_WORKING_SET_LIST; + +typedef struct _MEMORY_SECTION_NAME { + UNICODE_STRING SectionFileName; +} MEMORY_SECTION_NAME, *PMEMORY_SECTION_NAME; + +/* Zw[Lock|Unlock]VirtualMemory.LockType constants */ +#define LOCK_VM_IN_WSL 0x01 +#define LOCK_VM_IN_RAM 0x02 + +NTOSAPI +NTSTATUS +NTAPI +ZwLockVirtualMemory( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN OUT PULONG LockSize, + IN ULONG LockType); + +NTOSAPI +NTSTATUS +NTAPI +ZwUnlockVirtualMemory( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN OUT PULONG LockSize, + IN ULONG LockType); + +NTOSAPI +NTSTATUS +NTAPI +ZwReadVirtualMemory( + IN HANDLE ProcessHandle, + IN PVOID BaseAddress, + OUT PVOID Buffer, + IN ULONG BufferLength, + OUT PULONG ReturnLength OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +ZwWriteVirtualMemory( + IN HANDLE ProcessHandle, + IN PVOID BaseAddress, + IN PVOID Buffer, + IN ULONG BufferLength, + OUT PULONG ReturnLength OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +ZwProtectVirtualMemory( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN OUT PULONG ProtectSize, + IN ULONG NewProtect, + OUT PULONG OldProtect); + +NTOSAPI +NTSTATUS +NTAPI +ZwFlushVirtualMemory( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN OUT PULONG FlushSize, + OUT PIO_STATUS_BLOCK IoStatusBlock); + +NTOSAPI +NTSTATUS +NTAPI +ZwAllocateUserPhysicalPages( + IN HANDLE ProcessHandle, + IN PULONG NumberOfPages, + OUT PULONG PageFrameNumbers); + +NTOSAPI +NTSTATUS +NTAPI +ZwFreeUserPhysicalPages( + IN HANDLE ProcessHandle, + IN OUT PULONG NumberOfPages, + IN PULONG PageFrameNumbers); + +NTOSAPI +NTSTATUS +NTAPI +ZwMapUserPhysicalPages( + IN PVOID BaseAddress, + IN PULONG NumberOfPages, + IN PULONG PageFrameNumbers); + +NTOSAPI +NTSTATUS +NTAPI +ZwMapUserPhysicalPagesScatter( + IN PVOID *BaseAddresses, + IN PULONG NumberOfPages, + IN PULONG PageFrameNumbers); + +NTOSAPI +NTSTATUS +NTAPI +ZwGetWriteWatch( + IN HANDLE ProcessHandle, + IN ULONG Flags, + IN PVOID BaseAddress, + IN ULONG RegionSize, + OUT PULONG Buffer, + IN OUT PULONG BufferEntries, + OUT PULONG Granularity); + +NTOSAPI +NTSTATUS +NTAPI +ZwResetWriteWatch( + IN HANDLE ProcessHandle, + IN PVOID BaseAddress, + IN ULONG RegionSize); + + + + +/* Sections */ + +typedef enum _SECTION_INFORMATION_CLASS { + SectionBasicInformation, + SectionImageInformation +} SECTION_INFORMATION_CLASS; + +NTOSAPI +NTSTATUS +NTAPI +NtCreateSection( + OUT PHANDLE SectionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN PLARGE_INTEGER SectionSize OPTIONAL, + IN ULONG Protect, + IN ULONG Attributes, + IN HANDLE FileHandle); + +NTOSAPI +NTSTATUS +NTAPI +ZwCreateSection( + OUT PHANDLE SectionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN PLARGE_INTEGER SectionSize OPTIONAL, + IN ULONG Protect, + IN ULONG Attributes, + IN HANDLE FileHandle); + +NTOSAPI +NTSTATUS +NTAPI +ZwQuerySection( + IN HANDLE SectionHandle, + IN SECTION_INFORMATION_CLASS SectionInformationClass, + OUT PVOID SectionInformation, + IN ULONG SectionInformationLength, + OUT PULONG ResultLength OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +ZwExtendSection( + IN HANDLE SectionHandle, + IN PLARGE_INTEGER SectionSize); + +NTOSAPI +NTSTATUS +NTAPI +ZwAreMappedFilesTheSame( + IN PVOID Address1, + IN PVOID Address2); + + + + +/* Threads */ + +typedef struct _USER_STACK { + PVOID FixedStackBase; + PVOID FixedStackLimit; + PVOID ExpandableStackBase; + PVOID ExpandableStackLimit; + PVOID ExpandableStackBottom; +} USER_STACK, *PUSER_STACK; + +NTOSAPI +NTSTATUS +NTAPI +ZwCreateThread( + OUT PHANDLE ThreadHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN HANDLE ProcessHandle, + OUT PCLIENT_ID ClientId, + IN PCONTEXT ThreadContext, + IN PUSER_STACK UserStack, + IN BOOLEAN CreateSuspended); + +NTOSAPI +NTSTATUS +NTAPI +NtOpenThread( + OUT PHANDLE ThreadHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN PCLIENT_ID ClientId); + +NTOSAPI +NTSTATUS +NTAPI +ZwOpenThread( + OUT PHANDLE ThreadHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN PCLIENT_ID ClientId); + +NTOSAPI +NTSTATUS +NTAPI +ZwTerminateThread( + IN HANDLE ThreadHandle OPTIONAL, + IN NTSTATUS ExitStatus); + +NTOSAPI +NTSTATUS +NTAPI +NtQueryInformationThread( + IN HANDLE ThreadHandle, + IN THREADINFOCLASS ThreadInformationClass, + OUT PVOID ThreadInformation, + IN ULONG ThreadInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +ZwQueryInformationThread( + IN HANDLE ThreadHandle, + IN THREADINFOCLASS ThreadInformationClass, + OUT PVOID ThreadInformation, + IN ULONG ThreadInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +NtSetInformationThread( + IN HANDLE ThreadHandle, + IN THREADINFOCLASS ThreadInformationClass, + IN PVOID ThreadInformation, + IN ULONG ThreadInformationLength); + +typedef struct _THREAD_BASIC_INFORMATION { + NTSTATUS ExitStatus; + PNT_TIB TebBaseAddress; + CLIENT_ID ClientId; + KAFFINITY AffinityMask; + KPRIORITY Priority; + KPRIORITY BasePriority; +} THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION; + +typedef struct _KERNEL_USER_TIMES { + LARGE_INTEGER CreateTime; + LARGE_INTEGER ExitTime; + LARGE_INTEGER KernelTime; + LARGE_INTEGER UserTime; +} KERNEL_USER_TIMES, *PKERNEL_USER_TIMES; + +NTOSAPI +NTSTATUS +NTAPI +ZwSuspendThread( + IN HANDLE ThreadHandle, + OUT PULONG PreviousSuspendCount OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +ZwResumeThread( + IN HANDLE ThreadHandle, + OUT PULONG PreviousSuspendCount OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +ZwGetContextThread( + IN HANDLE ThreadHandle, + OUT PCONTEXT Context); + +NTOSAPI +NTSTATUS +NTAPI +ZwSetContextThread( + IN HANDLE ThreadHandle, + IN PCONTEXT Context); + +NTOSAPI +NTSTATUS +NTAPI +ZwQueueApcThread( + IN HANDLE ThreadHandle, + IN PKNORMAL_ROUTINE ApcRoutine, + IN PVOID ApcContext OPTIONAL, + IN PVOID Argument1 OPTIONAL, + IN PVOID Argument2 OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +ZwTestAlert( + VOID); + +NTOSAPI +NTSTATUS +NTAPI +ZwAlertThread( + IN HANDLE ThreadHandle); + +NTOSAPI +NTSTATUS +NTAPI +ZwAlertResumeThread( + IN HANDLE ThreadHandle, + OUT PULONG PreviousSuspendCount OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +ZwRegisterThreadTerminatePort( + IN HANDLE PortHandle); + +NTOSAPI +NTSTATUS +NTAPI +ZwImpersonateThread( + IN HANDLE ThreadHandle, + IN HANDLE TargetThreadHandle, + IN PSECURITY_QUALITY_OF_SERVICE SecurityQos); + +NTOSAPI +NTSTATUS +NTAPI +ZwImpersonateAnonymousToken( + IN HANDLE ThreadHandle); + + + + +/* Processes */ + +NTOSAPI +NTSTATUS +NTAPI +ZwCreateProcess( + OUT PHANDLE ProcessHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN HANDLE InheritFromProcessHandle, + IN BOOLEAN InheritHandles, + IN HANDLE SectionHandle OPTIONAL, + IN HANDLE DebugPort OPTIONAL, + IN HANDLE ExceptionPort OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +ZwCreateProcess( + OUT PHANDLE ProcessHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN HANDLE InheritFromProcessHandle, + IN BOOLEAN InheritHandles, + IN HANDLE SectionHandle OPTIONAL, + IN HANDLE DebugPort OPTIONAL, + IN HANDLE ExceptionPort OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +ZwTerminateProcess( + IN HANDLE ProcessHandle OPTIONAL, + IN NTSTATUS ExitStatus); + +NTOSAPI +NTSTATUS +NTAPI +ZwQueryInformationProcess( + IN HANDLE ProcessHandle, + IN PROCESSINFOCLASS ProcessInformationClass, + OUT PVOID ProcessInformation, + IN ULONG ProcessInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +NtSetInformationProcess( + IN HANDLE ProcessHandle, + IN PROCESSINFOCLASS ProcessInformationClass, + IN PVOID ProcessInformation, + IN ULONG ProcessInformationLength); + +NTOSAPI +NTSTATUS +NTAPI +ZwSetInformationProcess( + IN HANDLE ProcessHandle, + IN PROCESSINFOCLASS ProcessInformationClass, + IN PVOID ProcessInformation, + IN ULONG ProcessInformationLength); + +typedef struct _PROCESS_BASIC_INFORMATION { + NTSTATUS ExitStatus; + PPEB PebBaseAddress; + KAFFINITY AffinityMask; + KPRIORITY BasePriority; + ULONG UniqueProcessId; + ULONG InheritedFromUniqueProcessId; +} PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION; + +typedef struct _PROCESS_ACCESS_TOKEN { + HANDLE Token; + HANDLE Thread; +} PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN; + +/* DefaultHardErrorMode constants */ +/* also in winbase.h */ +#define SEM_FAILCRITICALERRORS 0x0001 +#define SEM_NOGPFAULTERRORBOX 0x0002 +#define SEM_NOALIGNMENTFAULTEXCEPT 0x0004 +#define SEM_NOOPENFILEERRORBOX 0x8000 +/* end winbase.h */ +typedef struct _POOLED_USAGE_AND_LIMITS { + ULONG PeakPagedPoolUsage; + ULONG PagedPoolUsage; + ULONG PagedPoolLimit; + ULONG PeakNonPagedPoolUsage; + ULONG NonPagedPoolUsage; + ULONG NonPagedPoolLimit; + ULONG PeakPagefileUsage; + ULONG PagefileUsage; + ULONG PagefileLimit; +} POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS; + +typedef struct _PROCESS_WS_WATCH_INFORMATION { + PVOID FaultingPc; + PVOID FaultingVa; +} PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION; + +/* PROCESS_PRIORITY_CLASS.PriorityClass constants */ +#define PC_IDLE 1 +#define PC_NORMAL 2 +#define PC_HIGH 3 +#define PC_REALTIME 4 +#define PC_BELOW_NORMAL 5 +#define PC_ABOVE_NORMAL 6 + +typedef struct _PROCESS_PRIORITY_CLASS { + BOOLEAN Foreground; + UCHAR PriorityClass; +} PROCESS_PRIORITY_CLASS, *PPROCESS_PRIORITY_CLASS; + +/* PROCESS_DEVICEMAP_INFORMATION.DriveType constants */ +#define DRIVE_UNKNOWN 0 +#define DRIVE_NO_ROOT_DIR 1 +#define DRIVE_REMOVABLE 2 +#define DRIVE_FIXED 3 +#define DRIVE_REMOTE 4 +#define DRIVE_CDROM 5 +#define DRIVE_RAMDISK 6 + +typedef struct _PROCESS_DEVICEMAP_INFORMATION { + _ANONYMOUS_UNION union { + struct { + HANDLE DirectoryHandle; + } Set; + struct { + ULONG DriveMap; + UCHAR DriveType[32]; + } Query; + } DUMMYUNIONNAME; +} PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION; + +typedef struct _PROCESS_SESSION_INFORMATION { + ULONG SessionId; +} PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION; + +typedef struct _RTL_USER_PROCESS_PARAMETERS { + ULONG AllocationSize; + ULONG Size; + ULONG Flags; + ULONG DebugFlags; + HANDLE hConsole; + ULONG ProcessGroup; + HANDLE hStdInput; + HANDLE hStdOutput; + HANDLE hStdError; + UNICODE_STRING CurrentDirectoryName; + HANDLE CurrentDirectoryHandle; + UNICODE_STRING DllPath; + UNICODE_STRING ImagePathName; + UNICODE_STRING CommandLine; + PWSTR Environment; + ULONG dwX; + ULONG dwY; + ULONG dwXSize; + ULONG dwYSize; + ULONG dwXCountChars; + ULONG dwYCountChars; + ULONG dwFillAttribute; + ULONG dwFlags; + ULONG wShowWindow; + UNICODE_STRING WindowTitle; + UNICODE_STRING DesktopInfo; + UNICODE_STRING ShellInfo; + UNICODE_STRING RuntimeInfo; +} RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS; + +NTSTATUS +NTAPI +RtlCreateProcessParameters( + OUT PRTL_USER_PROCESS_PARAMETERS *ProcessParameters, + IN PUNICODE_STRING ImageFile, + IN PUNICODE_STRING DllPath OPTIONAL, + IN PUNICODE_STRING CurrentDirectory OPTIONAL, + IN PUNICODE_STRING CommandLine OPTIONAL, + IN PWSTR Environment OPTIONAL, + IN PUNICODE_STRING WindowTitle OPTIONAL, + IN PUNICODE_STRING DesktopInfo OPTIONAL, + IN PUNICODE_STRING ShellInfo OPTIONAL, + IN PUNICODE_STRING RuntimeInfo OPTIONAL); + +NTSTATUS +NTAPI +RtlDestroyProcessParameters( + IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters); + +typedef struct _DEBUG_BUFFER { + HANDLE SectionHandle; + PVOID SectionBase; + PVOID RemoteSectionBase; + ULONG SectionBaseDelta; + HANDLE EventPairHandle; + ULONG Unknown[2]; + HANDLE RemoteThreadHandle; + ULONG InfoClassMask; + ULONG SizeOfInfo; + ULONG AllocatedSize; + ULONG SectionSize; + PVOID ModuleInformation; + PVOID BackTraceInformation; + PVOID HeapInformation; + PVOID LockInformation; + PVOID Reserved[8]; +} DEBUG_BUFFER, *PDEBUG_BUFFER; + +PDEBUG_BUFFER +NTAPI +RtlCreateQueryDebugBuffer( + IN ULONG Size, + IN BOOLEAN EventPair); + +/* RtlQueryProcessDebugInformation.DebugInfoClassMask constants */ +#define PDI_MODULES 0x01 +#define PDI_BACKTRACE 0x02 +#define PDI_HEAPS 0x04 +#define PDI_HEAP_TAGS 0x08 +#define PDI_HEAP_BLOCKS 0x10 +#define PDI_LOCKS 0x20 + +NTSTATUS +NTAPI +RtlQueryProcessDebugInformation( + IN ULONG ProcessId, + IN ULONG DebugInfoClassMask, + IN OUT PDEBUG_BUFFER DebugBuffer); + +NTSTATUS +NTAPI +RtlDestroyQueryDebugBuffer( + IN PDEBUG_BUFFER DebugBuffer); + +/* DEBUG_MODULE_INFORMATION.Flags constants */ +#define LDRP_STATIC_LINK 0x00000002 +#define LDRP_IMAGE_DLL 0x00000004 +#define LDRP_LOAD_IN_PROGRESS 0x00001000 +#define LDRP_UNLOAD_IN_PROGRESS 0x00002000 +#define LDRP_ENTRY_PROCESSED 0x00004000 +#define LDRP_ENTRY_INSERTED 0x00008000 +#define LDRP_CURRENT_LOAD 0x00010000 +#define LDRP_FAILED_BUILTIN_LOAD 0x00020000 +#define LDRP_DONT_CALL_FOR_THREADS 0x00040000 +#define LDRP_PROCESS_ATTACH_CALLED 0x00080000 +#define LDRP_DEBUG_SYMBOLS_LOADED 0x00100000 +#define LDRP_IMAGE_NOT_AT_BASE 0x00200000 +#define LDRP_WX86_IGNORE_MACHINETYPE 0x00400000 + +typedef struct _DEBUG_MODULE_INFORMATION { + ULONG Reserved[2]; + ULONG Base; + ULONG Size; + ULONG Flags; + USHORT Index; + USHORT Unknown; + USHORT LoadCount; + USHORT ModuleNameOffset; + CHAR ImageName[256]; +} DEBUG_MODULE_INFORMATION, *PDEBUG_MODULE_INFORMATION; + +typedef struct _DEBUG_HEAP_INFORMATION { + ULONG Base; + ULONG Flags; + USHORT Granularity; + USHORT Unknown; + ULONG Allocated; + ULONG Committed; + ULONG TagCount; + ULONG BlockCount; + ULONG Reserved[7]; + PVOID Tags; + PVOID Blocks; +} DEBUG_HEAP_INFORMATION, *PDEBUG_HEAP_INFORMATION; + +typedef struct _DEBUG_LOCK_INFORMATION { + PVOID Address; + USHORT Type; + USHORT CreatorBackTraceIndex; + ULONG OwnerThreadId; + ULONG ActiveCount; + ULONG ContentionCount; + ULONG EntryCount; + ULONG RecursionCount; + ULONG NumberOfSharedWaiters; + ULONG NumberOfExclusiveWaiters; +} DEBUG_LOCK_INFORMATION, *PDEBUG_LOCK_INFORMATION; + + + +/* Jobs */ + +NTOSAPI +NTSTATUS +NTAPI +ZwCreateJobObject( + OUT PHANDLE JobHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes); + +NTOSAPI +NTSTATUS +NTAPI +ZwOpenJobObject( + OUT PHANDLE JobHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes); + +NTOSAPI +NTSTATUS +NTAPI +ZwTerminateJobObject( + IN HANDLE JobHandle, + IN NTSTATUS ExitStatus); + +NTOSAPI +NTSTATUS +NTAPI +ZwAssignProcessToJobObject( + IN HANDLE JobHandle, + IN HANDLE ProcessHandle); + +NTOSAPI +NTSTATUS +NTAPI +ZwQueryInformationJobObject( + IN HANDLE JobHandle, + IN JOBOBJECTINFOCLASS JobInformationClass, + OUT PVOID JobInformation, + IN ULONG JobInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +ZwSetInformationJobObject( + IN HANDLE JobHandle, + IN JOBOBJECTINFOCLASS JobInformationClass, + IN PVOID JobInformation, + IN ULONG JobInformationLength); + + +/* Tokens */ + +NTOSAPI +NTSTATUS +NTAPI +ZwCreateToken( +OUT PHANDLE TokenHandle, +IN ACCESS_MASK DesiredAccess, +IN POBJECT_ATTRIBUTES ObjectAttributes, +IN TOKEN_TYPE Type, +IN PLUID AuthenticationId, +IN PLARGE_INTEGER ExpirationTime, +IN PTOKEN_USER User, +IN PTOKEN_GROUPS Groups, +IN PTOKEN_PRIVILEGES Privileges, +IN PTOKEN_OWNER Owner, +IN PTOKEN_PRIMARY_GROUP PrimaryGroup, +IN PTOKEN_DEFAULT_DACL DefaultDacl, +IN PTOKEN_SOURCE Source +); + +NTOSAPI +NTSTATUS +NTAPI +NtOpenProcessToken( + IN HANDLE ProcessHandle, + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE TokenHandle); + +NTOSAPI +NTSTATUS +NTAPI +ZwOpenProcessToken( + IN HANDLE ProcessHandle, + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE TokenHandle); + +NTOSAPI +NTSTATUS +NTAPI +NtOpenThreadToken( + IN HANDLE ThreadHandle, + IN ACCESS_MASK DesiredAccess, + IN BOOLEAN OpenAsSelf, + OUT PHANDLE TokenHandle); + +NTOSAPI +NTSTATUS +NTAPI +ZwOpenThreadToken( + IN HANDLE ThreadHandle, + IN ACCESS_MASK DesiredAccess, + IN BOOLEAN OpenAsSelf, + OUT PHANDLE TokenHandle); + +NTOSAPI +NTSTATUS +NTAPI +NtDuplicateToken( + IN HANDLE ExistingTokenHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN BOOLEAN EffectiveOnly, + IN TOKEN_TYPE TokenType, + OUT PHANDLE NewTokenHandle); + +NTOSAPI +NTSTATUS +NTAPI +ZwDuplicateToken( + IN HANDLE ExistingTokenHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN BOOLEAN EffectiveOnly, + IN TOKEN_TYPE TokenType, + OUT PHANDLE NewTokenHandle); + +NTOSAPI +NTSTATUS +NTAPI +ZwFilterToken( + IN HANDLE ExistingTokenHandle, + IN ULONG Flags, + IN PTOKEN_GROUPS SidsToDisable, + IN PTOKEN_PRIVILEGES PrivilegesToDelete, + IN PTOKEN_GROUPS SidsToRestricted, + OUT PHANDLE NewTokenHandle); + +NTOSAPI +NTSTATUS +NTAPI +NtAdjustPrivilegesToken( + IN HANDLE TokenHandle, + IN BOOLEAN DisableAllPrivileges, + IN PTOKEN_PRIVILEGES NewState, + IN ULONG BufferLength, + OUT PTOKEN_PRIVILEGES PreviousState OPTIONAL, + OUT PULONG ReturnLength); + +NTOSAPI +NTSTATUS +NTAPI +ZwAdjustPrivilegesToken( + IN HANDLE TokenHandle, + IN BOOLEAN DisableAllPrivileges, + IN PTOKEN_PRIVILEGES NewState, + IN ULONG BufferLength, + OUT PTOKEN_PRIVILEGES PreviousState OPTIONAL, + OUT PULONG ReturnLength); + +NTOSAPI +NTSTATUS +NTAPI +ZwAdjustGroupsToken( + IN HANDLE TokenHandle, + IN BOOLEAN ResetToDefault, + IN PTOKEN_GROUPS NewState, + IN ULONG BufferLength, + OUT PTOKEN_GROUPS PreviousState OPTIONAL, + OUT PULONG ReturnLength); + +NTOSAPI +NTSTATUS +NTAPI +NtQueryInformationToken( + IN HANDLE TokenHandle, + IN TOKEN_INFORMATION_CLASS TokenInformationClass, + OUT PVOID TokenInformation, + IN ULONG TokenInformationLength, + OUT PULONG ReturnLength); + +NTOSAPI +NTSTATUS +NTAPI +ZwQueryInformationToken( + IN HANDLE TokenHandle, + IN TOKEN_INFORMATION_CLASS TokenInformationClass, + OUT PVOID TokenInformation, + IN ULONG TokenInformationLength, + OUT PULONG ReturnLength); + +NTOSAPI +NTSTATUS +NTAPI +ZwSetInformationToken( + IN HANDLE TokenHandle, + IN TOKEN_INFORMATION_CLASS TokenInformationClass, + IN PVOID TokenInformation, + IN ULONG TokenInformationLength); + + + + +/* Time */ + +NTOSAPI +NTSTATUS +NTAPI +ZwQuerySystemTime( + OUT PLARGE_INTEGER CurrentTime); + +NTOSAPI +NTSTATUS +NTAPI +ZwSetSystemTime( + IN PLARGE_INTEGER NewTime, + OUT PLARGE_INTEGER OldTime OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +ZwQueryPerformanceCounter( + OUT PLARGE_INTEGER PerformanceCount, + OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +ZwQueryPerformanceCounter( + OUT PLARGE_INTEGER PerformanceCount, + OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +ZwQueryTimerResolution( + OUT PULONG CoarsestResolution, + OUT PULONG FinestResolution, + OUT PULONG ActualResolution); + +NTOSAPI +NTSTATUS +NTAPI +ZwDelayExecution( + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Interval); + +NTOSAPI +NTSTATUS +NTAPI +ZwYieldExecution( + VOID); + +NTOSAPI +ULONG +NTAPI +ZwGetTickCount( + VOID); + + + + +/* Execution profiling */ + +NTOSAPI +NTSTATUS +NTAPI +ZwCreateProfile( + OUT PHANDLE ProfileHandle, + IN HANDLE ProcessHandle, + IN PVOID Base, + IN ULONG Size, + IN ULONG BucketShift, + IN PULONG Buffer, + IN ULONG BufferLength, + IN KPROFILE_SOURCE Source, + IN ULONG ProcessorMask); + +NTOSAPI +NTSTATUS +NTAPI +ZwSetIntervalProfile( + IN ULONG Interval, + IN KPROFILE_SOURCE Source); + +NTOSAPI +NTSTATUS +NTAPI +ZwQueryIntervalProfile( + IN KPROFILE_SOURCE Source, + OUT PULONG Interval); + +NTOSAPI +NTSTATUS +NTAPI +ZwStartProfile( + IN HANDLE ProfileHandle); + +NTOSAPI +NTSTATUS +NTAPI +ZwStopProfile( + IN HANDLE ProfileHandle); + + + + +/* Local Procedure Call (LPC) */ + +typedef struct _LPC_MESSAGE { + USHORT DataSize; + USHORT MessageSize; + USHORT MessageType; + USHORT VirtualRangesOffset; + CLIENT_ID ClientId; + ULONG MessageId; + ULONG SectionSize; + UCHAR Data[ANYSIZE_ARRAY]; +} LPC_MESSAGE, *PLPC_MESSAGE; + +typedef enum _LPC_TYPE { + LPC_NEW_MESSAGE, + LPC_REQUEST, + LPC_REPLY, + LPC_DATAGRAM, + LPC_LOST_REPLY, + LPC_PORT_CLOSED, + LPC_CLIENT_DIED, + LPC_EXCEPTION, + LPC_DEBUG_EVENT, + LPC_ERROR_EVENT, + LPC_CONNECTION_REQUEST, + LPC_CONNECTION_REFUSED, + LPC_MAXIMUM +} LPC_TYPE; + +typedef struct _LPC_SECTION_WRITE { + ULONG Length; + HANDLE SectionHandle; + ULONG SectionOffset; + ULONG ViewSize; + PVOID ViewBase; + PVOID TargetViewBase; +} LPC_SECTION_WRITE, *PLPC_SECTION_WRITE; + +typedef struct _LPC_SECTION_READ { + ULONG Length; + ULONG ViewSize; + PVOID ViewBase; +} LPC_SECTION_READ, *PLPC_SECTION_READ; + +NTOSAPI +NTSTATUS +NTAPI +ZwCreatePort( + OUT PHANDLE PortHandle, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN ULONG MaxDataSize, + IN ULONG MaxMessageSize, + IN ULONG Reserved); + +NTOSAPI +NTSTATUS +NTAPI +ZwCreateWaitablePort( + OUT PHANDLE PortHandle, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN ULONG MaxDataSize, + IN ULONG MaxMessageSize, + IN ULONG Reserved); + +NTOSAPI +NTSTATUS +NTAPI +NtConnectPort( + OUT PHANDLE PortHandle, + IN PUNICODE_STRING PortName, + IN PSECURITY_QUALITY_OF_SERVICE SecurityQos, + IN OUT PLPC_SECTION_WRITE WriteSection OPTIONAL, + IN OUT PLPC_SECTION_READ ReadSection OPTIONAL, + OUT PULONG MaxMessageSize OPTIONAL, + IN OUT PVOID ConnectData OPTIONAL, + IN OUT PULONG ConnectDataLength OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +ZwConnectPort( + OUT PHANDLE PortHandle, + IN PUNICODE_STRING PortName, + IN PSECURITY_QUALITY_OF_SERVICE SecurityQos, + IN OUT PLPC_SECTION_WRITE WriteSection OPTIONAL, + IN OUT PLPC_SECTION_READ ReadSection OPTIONAL, + OUT PULONG MaxMessageSize OPTIONAL, + IN OUT PVOID ConnectData OPTIONAL, + IN OUT PULONG ConnectDataLength OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +ZwConnectPort( + OUT PHANDLE PortHandle, + IN PUNICODE_STRING PortName, + IN PSECURITY_QUALITY_OF_SERVICE SecurityQos, + IN OUT PLPC_SECTION_WRITE WriteSection OPTIONAL, + IN OUT PLPC_SECTION_READ ReadSection OPTIONAL, + OUT PULONG MaxMessageSize OPTIONAL, + IN OUT PVOID ConnectData OPTIONAL, + IN OUT PULONG ConnectDataLength OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +ZwListenPort( + IN HANDLE PortHandle, + OUT PLPC_MESSAGE Message); + +NTOSAPI +NTSTATUS +NTAPI +ZwAcceptConnectPort( + OUT PHANDLE PortHandle, + IN ULONG PortIdentifier, + IN PLPC_MESSAGE Message, + IN BOOLEAN Accept, + IN OUT PLPC_SECTION_WRITE WriteSection OPTIONAL, + IN OUT PLPC_SECTION_READ ReadSection OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +ZwCompleteConnectPort( + IN HANDLE PortHandle); + +NTOSAPI +NTSTATUS +NTAPI +NtRequestPort( + IN HANDLE PortHandle, + IN PLPC_MESSAGE RequestMessage); + +NTOSAPI +NTSTATUS +NTAPI +NtRequestWaitReplyPort( + IN HANDLE PortHandle, + IN PLPC_MESSAGE RequestMessage, + OUT PLPC_MESSAGE ReplyMessage); + +NTOSAPI +NTSTATUS +NTAPI +ZwRequestWaitReplyPort( + IN HANDLE PortHandle, + IN PLPC_MESSAGE RequestMessage, + OUT PLPC_MESSAGE ReplyMessage); + +NTOSAPI +NTSTATUS +NTAPI +ZwReplyPort( + IN HANDLE PortHandle, + IN PLPC_MESSAGE ReplyMessage); + +NTOSAPI +NTSTATUS +NTAPI +ZwReplyWaitReplyPort( + IN HANDLE PortHandle, + IN OUT PLPC_MESSAGE ReplyMessage); + +NTOSAPI +NTSTATUS +NTAPI +ZwReplyWaitReceivePort( + IN HANDLE PortHandle, + OUT PULONG PortIdentifier OPTIONAL, + IN PLPC_MESSAGE ReplyMessage OPTIONAL, + OUT PLPC_MESSAGE Message); + +NTOSAPI +NTSTATUS +NTAPI +ZwReplyWaitReceivePortEx( + IN HANDLE PortHandle, + OUT PULONG PortIdentifier OPTIONAL, + IN PLPC_MESSAGE ReplyMessage OPTIONAL, + OUT PLPC_MESSAGE Message, + IN PLARGE_INTEGER Timeout); + +NTOSAPI +NTSTATUS +NTAPI +ZwReadRequestData( + IN HANDLE PortHandle, + IN PLPC_MESSAGE Message, + IN ULONG Index, + OUT PVOID Buffer, + IN ULONG BufferLength, + OUT PULONG ReturnLength OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +ZwWriteRequestData( + IN HANDLE PortHandle, + IN PLPC_MESSAGE Message, + IN ULONG Index, + IN PVOID Buffer, + IN ULONG BufferLength, + OUT PULONG ReturnLength OPTIONAL); + +typedef enum _PORT_INFORMATION_CLASS { + PortBasicInformation +} PORT_INFORMATION_CLASS; + +NTOSAPI +NTSTATUS +NTAPI +ZwQueryInformationPort( + IN HANDLE PortHandle, + IN PORT_INFORMATION_CLASS PortInformationClass, + OUT PVOID PortInformation, + IN ULONG PortInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +ZwImpersonateClientOfPort( + IN HANDLE PortHandle, + IN PLPC_MESSAGE Message); + + + + +/* Files */ + +NTOSAPI +NTSTATUS +NTAPI +NtDeleteFile( + IN POBJECT_ATTRIBUTES ObjectAttributes); + +NTOSAPI +NTSTATUS +NTAPI +ZwDeleteFile( + IN POBJECT_ATTRIBUTES ObjectAttributes); + +NTOSAPI +NTSTATUS +NTAPI +ZwFlushBuffersFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock); + +NTOSAPI +NTSTATUS +NTAPI +ZwCancelIoFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock); + +NTOSAPI +NTSTATUS +NTAPI +ZwReadFileScatter( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PFILE_SEGMENT_ELEMENT Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset OPTIONAL, + IN PULONG Key OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +ZwWriteFileGather( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PFILE_SEGMENT_ELEMENT Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset OPTIONAL, + IN PULONG Key OPTIONAL); + + + + +/* Registry keys */ + +NTOSAPI +NTSTATUS +NTAPI +ZwSaveKey( + IN HANDLE KeyHandle, + IN HANDLE FileHandle); + +NTOSAPI +NTSTATUS +NTAPI +ZwSaveMergedKeys( + IN HANDLE KeyHandle1, + IN HANDLE KeyHandle2, + IN HANDLE FileHandle); + +NTOSAPI +NTSTATUS +NTAPI +ZwRestoreKey( + IN HANDLE KeyHandle, + IN HANDLE FileHandle, + IN ULONG Flags); + +NTOSAPI +NTSTATUS +NTAPI +ZwLoadKey( + IN POBJECT_ATTRIBUTES KeyObjectAttributes, + IN POBJECT_ATTRIBUTES FileObjectAttributes); + +NTOSAPI +NTSTATUS +NTAPI +ZwLoadKey2( + IN POBJECT_ATTRIBUTES KeyObjectAttributes, + IN POBJECT_ATTRIBUTES FileObjectAttributes, + IN ULONG Flags); + +NTOSAPI +NTSTATUS +NTAPI +ZwUnloadKey( + IN POBJECT_ATTRIBUTES KeyObjectAttributes); + +NTOSAPI +NTSTATUS +NTAPI +ZwQueryOpenSubKeys( + IN POBJECT_ATTRIBUTES KeyObjectAttributes, + OUT PULONG NumberOfKeys); + +NTOSAPI +NTSTATUS +NTAPI +ZwReplaceKey( + IN POBJECT_ATTRIBUTES NewFileObjectAttributes, + IN HANDLE KeyHandle, + IN POBJECT_ATTRIBUTES OldFileObjectAttributes); + +typedef enum _KEY_SET_INFORMATION_CLASS { + KeyLastWriteTimeInformation +} KEY_SET_INFORMATION_CLASS; + +NTOSAPI +NTSTATUS +NTAPI +ZwSetInformationKey( + IN HANDLE KeyHandle, + IN KEY_SET_INFORMATION_CLASS KeyInformationClass, + IN PVOID KeyInformation, + IN ULONG KeyInformationLength); + +typedef struct _KEY_LAST_WRITE_TIME_INFORMATION { + LARGE_INTEGER LastWriteTime; +} KEY_LAST_WRITE_TIME_INFORMATION, *PKEY_LAST_WRITE_TIME_INFORMATION; + +typedef struct _KEY_NAME_INFORMATION { + ULONG NameLength; + WCHAR Name[1]; +} KEY_NAME_INFORMATION, *PKEY_NAME_INFORMATION; + +NTOSAPI +NTSTATUS +NTAPI +ZwNotifyChangeKey( + IN HANDLE KeyHandle, + IN HANDLE EventHandle OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG NotifyFilter, + IN BOOLEAN WatchSubtree, + IN PVOID Buffer, + IN ULONG BufferLength, + IN BOOLEAN Asynchronous); + +/* ZwNotifyChangeMultipleKeys.Flags constants */ +#define REG_MONITOR_SINGLE_KEY 0x00 +#define REG_MONITOR_SECOND_KEY 0x01 + +NTOSAPI +NTSTATUS +NTAPI +ZwNotifyChangeMultipleKeys( + IN HANDLE KeyHandle, + IN ULONG Flags, + IN POBJECT_ATTRIBUTES KeyObjectAttributes, + IN HANDLE EventHandle OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG NotifyFilter, + IN BOOLEAN WatchSubtree, + IN PVOID Buffer, + IN ULONG BufferLength, + IN BOOLEAN Asynchronous); + +NTOSAPI +NTSTATUS +NTAPI +ZwQueryMultipleValueKey( + IN HANDLE KeyHandle, + IN OUT PKEY_VALUE_ENTRY ValueList, + IN ULONG NumberOfValues, + OUT PVOID Buffer, + IN OUT PULONG Length, + OUT PULONG ReturnLength); + +NTOSAPI +NTSTATUS +NTAPI +ZwInitializeRegistry( + IN BOOLEAN Setup); + + + + +/* Security and auditing */ + +NTOSAPI +NTSTATUS +NTAPI +ZwPrivilegeCheck( + IN HANDLE TokenHandle, + IN PPRIVILEGE_SET RequiredPrivileges, + OUT PBOOLEAN Result); + +NTOSAPI +NTSTATUS +NTAPI +ZwPrivilegeObjectAuditAlarm( + IN PUNICODE_STRING SubsystemName, + IN PVOID HandleId, + IN HANDLE TokenHandle, + IN ACCESS_MASK DesiredAccess, + IN PPRIVILEGE_SET Privileges, + IN BOOLEAN AccessGranted); + +NTOSAPI +NTSTATUS +NTAPI +ZwPrivilegeObjectAuditAlarm( + IN PUNICODE_STRING SubsystemName, + IN PVOID HandleId, + IN HANDLE TokenHandle, + IN ACCESS_MASK DesiredAccess, + IN PPRIVILEGE_SET Privileges, + IN BOOLEAN AccessGranted); + +NTOSAPI +NTSTATUS +NTAPI +ZwAccessCheck( + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN HANDLE TokenHandle, + IN ACCESS_MASK DesiredAccess, + IN PGENERIC_MAPPING GenericMapping, + IN PPRIVILEGE_SET PrivilegeSet, + IN PULONG PrivilegeSetLength, + OUT PACCESS_MASK GrantedAccess, + OUT PBOOLEAN AccessStatus); + +NTOSAPI +NTSTATUS +NTAPI +ZwAccessCheckAndAuditAlarm( + IN PUNICODE_STRING SubsystemName, + IN PVOID HandleId, + IN PUNICODE_STRING ObjectTypeName, + IN PUNICODE_STRING ObjectName, + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN ACCESS_MASK DesiredAccess, + IN PGENERIC_MAPPING GenericMapping, + IN BOOLEAN ObjectCreation, + OUT PACCESS_MASK GrantedAccess, + OUT PBOOLEAN AccessStatus, + OUT PBOOLEAN GenerateOnClose); + +NTOSAPI +NTSTATUS +NTAPI +ZwAccessCheckByType( + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PSID PrincipalSelfSid, + IN HANDLE TokenHandle, + IN ULONG DesiredAccess, + IN POBJECT_TYPE_LIST ObjectTypeList, + IN ULONG ObjectTypeListLength, + IN PGENERIC_MAPPING GenericMapping, + IN PPRIVILEGE_SET PrivilegeSet, + IN PULONG PrivilegeSetLength, + OUT PACCESS_MASK GrantedAccess, + OUT PULONG AccessStatus); + +typedef enum _AUDIT_EVENT_TYPE { + AuditEventObjectAccess, + AuditEventDirectoryServiceAccess +} AUDIT_EVENT_TYPE, *PAUDIT_EVENT_TYPE; + +NTOSAPI +NTSTATUS +NTAPI +ZwAccessCheckByTypeAndAuditAlarm( + IN PUNICODE_STRING SubsystemName, + IN PVOID HandleId, + IN PUNICODE_STRING ObjectTypeName, + IN PUNICODE_STRING ObjectName, + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PSID PrincipalSelfSid, + IN ACCESS_MASK DesiredAccess, + IN AUDIT_EVENT_TYPE AuditType, + IN ULONG Flags, + IN POBJECT_TYPE_LIST ObjectTypeList, + IN ULONG ObjectTypeListLength, + IN PGENERIC_MAPPING GenericMapping, + IN BOOLEAN ObjectCreation, + OUT PACCESS_MASK GrantedAccess, + OUT PULONG AccessStatus, + OUT PBOOLEAN GenerateOnClose); + +NTOSAPI +NTSTATUS +NTAPI +ZwAccessCheckByTypeResultList( + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PSID PrincipalSelfSid, + IN HANDLE TokenHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_TYPE_LIST ObjectTypeList, + IN ULONG ObjectTypeListLength, + IN PGENERIC_MAPPING GenericMapping, + IN PPRIVILEGE_SET PrivilegeSet, + IN PULONG PrivilegeSetLength, + OUT PACCESS_MASK GrantedAccessList, + OUT PULONG AccessStatusList); + +NTOSAPI +NTSTATUS +NTAPI +ZwAccessCheckByTypeResultListAndAuditAlarm( + IN PUNICODE_STRING SubsystemName, + IN PVOID HandleId, + IN PUNICODE_STRING ObjectTypeName, + IN PUNICODE_STRING ObjectName, + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PSID PrincipalSelfSid, + IN ACCESS_MASK DesiredAccess, + IN AUDIT_EVENT_TYPE AuditType, + IN ULONG Flags, + IN POBJECT_TYPE_LIST ObjectTypeList, + IN ULONG ObjectTypeListLength, + IN PGENERIC_MAPPING GenericMapping, + IN BOOLEAN ObjectCreation, + OUT PACCESS_MASK GrantedAccessList, + OUT PULONG AccessStatusList, + OUT PULONG GenerateOnClose); + +NTOSAPI +NTSTATUS +NTAPI +ZwAccessCheckByTypeResultListAndAuditAlarmByHandle( + IN PUNICODE_STRING SubsystemName, + IN PVOID HandleId, + IN HANDLE TokenHandle, + IN PUNICODE_STRING ObjectTypeName, + IN PUNICODE_STRING ObjectName, + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PSID PrincipalSelfSid, + IN ACCESS_MASK DesiredAccess, + IN AUDIT_EVENT_TYPE AuditType, + IN ULONG Flags, + IN POBJECT_TYPE_LIST ObjectTypeList, + IN ULONG ObjectTypeListLength, + IN PGENERIC_MAPPING GenericMapping, + IN BOOLEAN ObjectCreation, + OUT PACCESS_MASK GrantedAccessList, + OUT PULONG AccessStatusList, + OUT PULONG GenerateOnClose); + +NTOSAPI +NTSTATUS +NTAPI +ZwOpenObjectAuditAlarm( + IN PUNICODE_STRING SubsystemName, + IN PVOID *HandleId, + IN PUNICODE_STRING ObjectTypeName, + IN PUNICODE_STRING ObjectName, + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN HANDLE TokenHandle, + IN ACCESS_MASK DesiredAccess, + IN ACCESS_MASK GrantedAccess, + IN PPRIVILEGE_SET Privileges OPTIONAL, + IN BOOLEAN ObjectCreation, + IN BOOLEAN AccessGranted, + OUT PBOOLEAN GenerateOnClose); + +NTOSAPI +NTSTATUS +NTAPI +ZwCloseObjectAuditAlarm( + IN PUNICODE_STRING SubsystemName, + IN PVOID HandleId, + IN BOOLEAN GenerateOnClose); + +NTOSAPI +NTSTATUS +NTAPI +ZwDeleteObjectAuditAlarm( + IN PUNICODE_STRING SubsystemName, + IN PVOID HandleId, + IN BOOLEAN GenerateOnClose); + + + + +/* Plug and play and power management */ + +NTOSAPI +NTSTATUS +NTAPI +ZwRequestWakeupLatency( + IN LATENCY_TIME Latency); + +NTOSAPI +NTSTATUS +NTAPI +ZwRequestDeviceWakeup( + IN HANDLE DeviceHandle); + +NTOSAPI +NTSTATUS +NTAPI +ZwCancelDeviceWakeupRequest( + IN HANDLE DeviceHandle); + +NTOSAPI +BOOLEAN +NTAPI +ZwIsSystemResumeAutomatic( + VOID); + +NTOSAPI +NTSTATUS +NTAPI +ZwSetThreadExecutionState( + IN EXECUTION_STATE ExecutionState, + OUT PEXECUTION_STATE PreviousExecutionState); + +NTOSAPI +NTSTATUS +NTAPI +ZwGetDevicePowerState( + IN HANDLE DeviceHandle, + OUT PDEVICE_POWER_STATE DevicePowerState); + +NTOSAPI +NTSTATUS +NTAPI +ZwSetSystemPowerState( + IN POWER_ACTION SystemAction, + IN SYSTEM_POWER_STATE MinSystemState, + IN ULONG Flags); + +NTOSAPI +NTSTATUS +NTAPI +ZwInitiatePowerAction( + IN POWER_ACTION SystemAction, + IN SYSTEM_POWER_STATE MinSystemState, + IN ULONG Flags, + IN BOOLEAN Asynchronous); + +NTOSAPI +NTSTATUS +NTAPI +ZwPowerInformation( + IN POWER_INFORMATION_LEVEL PowerInformationLevel, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength); + +NTOSAPI +NTSTATUS +NTAPI +ZwPlugPlayControl( + IN ULONG ControlCode, + IN OUT PVOID Buffer, + IN ULONG BufferLength); + +NTOSAPI +NTSTATUS +NTAPI +ZwGetPlugPlayEvent( + IN ULONG Reserved1, + IN ULONG Reserved2, + OUT PVOID Buffer, + IN ULONG BufferLength); + + + + +/* Miscellany */ + +NTOSAPI +NTSTATUS +NTAPI +ZwRaiseException( + IN PEXCEPTION_RECORD ExceptionRecord, + IN PCONTEXT Context, + IN BOOLEAN SearchFrames); + +NTOSAPI +NTSTATUS +NTAPI +ZwContinue( + IN PCONTEXT Context, + IN BOOLEAN TestAlert); + +NTOSAPI +NTSTATUS +NTAPI +ZwW32Call( + IN ULONG RoutineIndex, + IN PVOID Argument, + IN ULONG ArgumentLength, + OUT PVOID *Result OPTIONAL, + OUT PULONG ResultLength OPTIONAL); + +NTOSAPI +NTSTATUS +NTAPI +ZwSetLowWaitHighThread( + VOID); + +NTOSAPI +NTSTATUS +NTAPI +ZwSetHighWaitLowThread( + VOID); + +NTOSAPI +NTSTATUS +NTAPI +ZwLoadDriver( + IN PUNICODE_STRING DriverServiceName); + +NTOSAPI +NTSTATUS +NTAPI +ZwUnloadDriver( + IN PUNICODE_STRING DriverServiceName); + +NTOSAPI +NTSTATUS +NTAPI +ZwFlushInstructionCache( + IN HANDLE ProcessHandle, + IN PVOID BaseAddress OPTIONAL, + IN ULONG FlushSize); + +NTOSAPI +NTSTATUS +NTAPI +ZwFlushWriteBuffer( + VOID); + +NTOSAPI +NTSTATUS +NTAPI +ZwQueryDefaultLocale( + IN BOOLEAN ThreadOrSystem, + OUT PLCID Locale); + +NTOSAPI +NTSTATUS +NTAPI +ZwSetDefaultLocale( + IN BOOLEAN ThreadOrSystem, + IN LCID Locale); + +NTOSAPI +NTSTATUS +NTAPI +ZwQueryDefaultUILanguage( + OUT PLANGID LanguageId); + +NTOSAPI +NTSTATUS +NTAPI +ZwSetDefaultUILanguage( + IN LANGID LanguageId); + +NTOSAPI +NTSTATUS +NTAPI +ZwQueryInstallUILanguage( + OUT PLANGID LanguageId); + +NTOSAPI +NTSTATUS +NTAPI +NtAllocateLocallyUniqueId( + OUT PLUID Luid); + +NTOSAPI +NTSTATUS +NTAPI +NtAllocateUuids( + OUT PLARGE_INTEGER UuidLastTimeAllocated, + OUT PULONG UuidDeltaTime, + OUT PULONG UuidSequenceNumber, + OUT PUCHAR UuidSeed); + +NTOSAPI +NTSTATUS +NTAPI +ZwSetUuidSeed( + IN PUCHAR UuidSeed); + +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; + +NTOSAPI +NTSTATUS +NTAPI +ZwRaiseHardError( + IN NTSTATUS Status, + IN ULONG NumberOfArguments, + IN ULONG StringArgumentsMask, + IN PULONG Arguments, + IN HARDERROR_RESPONSE_OPTION ResponseOption, + OUT PHARDERROR_RESPONSE Response); + +NTOSAPI +NTSTATUS +NTAPI +ZwSetDefaultHardErrorPort( + IN HANDLE PortHandle); + +NTOSAPI +NTSTATUS +NTAPI +ZwDisplayString( + IN PUNICODE_STRING String); + +NTOSAPI +NTSTATUS +NTAPI +ZwCreatePagingFile( + IN PUNICODE_STRING FileName, + IN PULARGE_INTEGER InitialSize, + IN PULARGE_INTEGER MaximumSize, + IN ULONG Reserved); + +typedef USHORT RTL_ATOM, *PRTL_ATOM; + +NTOSAPI +NTSTATUS +NTAPI +NtAddAtom( + IN PWSTR AtomName, + IN ULONG AtomNameLength, + OUT PRTL_ATOM Atom); + +NTOSAPI +NTSTATUS +NTAPI +NtFindAtom( + IN PWSTR AtomName, + IN ULONG AtomNameLength, + OUT PRTL_ATOM Atom); + +NTOSAPI +NTSTATUS +NTAPI +NtDeleteAtom( + IN RTL_ATOM Atom); + +typedef enum _ATOM_INFORMATION_CLASS { + AtomBasicInformation, + AtomListInformation +} ATOM_INFORMATION_CLASS; + +NTOSAPI +NTSTATUS +NTAPI +NtQueryInformationAtom( + IN RTL_ATOM Atom, + IN ATOM_INFORMATION_CLASS AtomInformationClass, + OUT PVOID AtomInformation, + IN ULONG AtomInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +typedef struct _ATOM_BASIC_INFORMATION { + USHORT ReferenceCount; + USHORT Pinned; + USHORT NameLength; + WCHAR Name[1]; +} ATOM_BASIC_INFORMATION, *PATOM_BASIC_INFORMATION; + +typedef struct _ATOM_LIST_INFORMATION { + ULONG NumberOfAtoms; + ATOM Atoms[1]; +} ATOM_LIST_INFORMATION, *PATOM_LIST_INFORMATION; + +NTOSAPI +NTSTATUS +NTAPI +ZwSetLdtEntries( + IN ULONG Selector1, + IN LDT_ENTRY LdtEntry1, + IN ULONG Selector2, + IN LDT_ENTRY LdtEntry2); + +NTOSAPI +NTSTATUS +NTAPI +NtVdmControl( + IN ULONG ControlCode, + IN PVOID ControlData); + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __NTAPI_H */ diff --git a/reactos/w32api/include/ddk/ntdd8042.h b/reactos/w32api/include/ddk/ntdd8042.h new file mode 100644 index 00000000000..7696c8e2734 --- /dev/null +++ b/reactos/w32api/include/ddk/ntdd8042.h @@ -0,0 +1,218 @@ +/* + * ntdd8042.h + * + * i8042 IOCTL interface. + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __NTDD8042_H +#define __NTDD8042_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" +#include "ntddkbd.h" +#include "ntddmou.h" + + +#define IOCTL_INTERNAL_I8042_CONTROLLER_WRITE_BUFFER \ + CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0FF2, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_I8042_HOOK_KEYBOARD \ + CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0FF0, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_I8042_KEYBOARD_START_INFORMATION \ + CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0FF3, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_I8042_KEYBOARD_WRITE_BUFFER \ + CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0FF1, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_I8042_HOOK_MOUSE \ + CTL_CODE(FILE_DEVICE_MOUSE, 0x0FF0, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_I8042_MOUSE_START_INFORMATION \ + CTL_CODE(FILE_DEVICE_MOUSE, 0x0FF3, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_I8042_MOUSE_WRITE_BUFFER \ + CTL_CODE(FILE_DEVICE_MOUSE, 0x0FF1, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define I8042_POWER_SYS_BUTTON 0x0001 +#define I8042_SLEEP_SYS_BUTTON 0x0002 +#define I8042_WAKE_SYS_BUTTON 0x0004 +#define I8042_SYS_BUTTONS (I8042_POWER_SYS_BUTTON | \ + I8042_SLEEP_SYS_BUTTON | \ + I8042_WAKE_SYS_BUTTON) + +typedef enum _TRANSMIT_STATE { + Idle = 0, + SendingBytes +} TRANSMIT_STATE; + +typedef struct _OUTPUT_PACKET { + PUCHAR Bytes; + ULONG CurrentByte; + ULONG ByteCount; + TRANSMIT_STATE State; +} OUTPUT_PACKET, *POUTPUT_PACKET; + +typedef enum _KEYBOARD_SCAN_STATE { + Normal, + GotE0, + GotE1 +} KEYBOARD_SCAN_STATE, *PKEYBOARD_SCAN_STATE; + +typedef enum _MOUSE_STATE { + MouseIdle, + XMovement, + YMovement, + ZMovement, + MouseExpectingACK, + MouseResetting +} MOUSE_STATE, *PMOUSE_STATE; + +typedef enum _MOUSE_RESET_SUBSTATE { + ExpectingReset, + ExpectingResetId, + ExpectingGetDeviceIdACK, + ExpectingGetDeviceIdValue, + ExpectingSetResolutionDefaultACK, + ExpectingSetResolutionDefaultValueACK, + ExpectingSetResolutionACK, + ExpectingSetResolutionValueACK, + ExpectingSetScaling1to1ACK, + ExpectingSetScaling1to1ACK2, + ExpectingSetScaling1to1ACK3, + ExpectingReadMouseStatusACK, + ExpectingReadMouseStatusByte1, + ExpectingReadMouseStatusByte2, + ExpectingReadMouseStatusByte3, + StartPnPIdDetection, + ExpectingLoopSetSamplingRateACK, + ExpectingLoopSetSamplingRateValueACK, + ExpectingPnpIdByte1, + ExpectingPnpIdByte2, + ExpectingPnpIdByte3, + ExpectingPnpIdByte4, + ExpectingPnpIdByte5, + ExpectingPnpIdByte6, + ExpectingPnpIdByte7, + EnableWheel, + Enable5Buttons, + ExpectingGetDeviceId2ACK, + ExpectingGetDeviceId2Value, + ExpectingSetSamplingRateACK, + ExpectingSetSamplingRateValueACK, + ExpectingEnableACK, + ExpectingFinalResolutionACK, + ExpectingFinalResolutionValueACK, + ExpectingGetDeviceIdDetectACK, + ExpectingGetDeviceIdDetectValue, + CustomHookStateMinimum = 100, + CustomHookStateMaximum = 999, + I8042ReservedMinimum = 1000 +} MOUSE_RESET_SUBSTATE, *PMOUSE_RESET_SUBSTATE; + +typedef struct _INTERNAL_I8042_START_INFORMATION { + ULONG Size; + PKINTERRUPT InterruptObject; + ULONG Reserved[8]; +} INTERNAL_I8042_START_INFORMATION, *PINTERNAL_I8042_START_INFORMATION; + +typedef VOID DDKAPI +(*PI8042_ISR_WRITE_PORT)( + IN PVOID Context, + IN UCHAR Value); + +typedef VOID DDKAPI +(*PI8042_QUEUE_PACKET)( + IN PVOID Context); + +typedef NTSTATUS DDKAPI +(*PI8042_SYNCH_READ_PORT) ( + IN PVOID Context, + OUT PUCHAR Value, + IN BOOLEAN WaitForACK); + +typedef NTSTATUS DDKAPI +(*PI8042_SYNCH_WRITE_PORT)( + IN PVOID Context, + IN UCHAR Value, + IN BOOLEAN WaitForACK); + + +typedef NTSTATUS DDKAPI +(*PI8042_KEYBOARD_INITIALIZATION_ROUTINE)( + IN PVOID InitializationContext, + IN PVOID SynchFuncContext, + IN PI8042_SYNCH_READ_PORT ReadPort, + IN PI8042_SYNCH_WRITE_PORT WritePort, + OUT PBOOLEAN TurnTranslationOn); + +typedef BOOLEAN DDKAPI +(*PI8042_KEYBOARD_ISR)( + PVOID IsrContext, + PKEYBOARD_INPUT_DATA CurrentInput, + POUTPUT_PACKET CurrentOutput, + UCHAR StatusByte, + PUCHAR Byte, + PBOOLEAN ContinueProcessing, + PKEYBOARD_SCAN_STATE ScanState); + +typedef struct _INTERNAL_I8042_HOOK_KEYBOARD { + OUT PVOID Context; + OUT PI8042_KEYBOARD_INITIALIZATION_ROUTINE InitializationRoutine; + OUT PI8042_KEYBOARD_ISR IsrRoutine; + IN PI8042_ISR_WRITE_PORT IsrWritePort; + IN PI8042_QUEUE_PACKET QueueKeyboardPacket; + IN PVOID CallContext; +} INTERNAL_I8042_HOOK_KEYBOARD, *PINTERNAL_I8042_HOOK_KEYBOARD; + +typedef BOOLEAN DDKAPI +(*PI8042_MOUSE_ISR)( + PVOID IsrContext, + PMOUSE_INPUT_DATA CurrentInput, + POUTPUT_PACKET CurrentOutput, + UCHAR StatusByte, + PUCHAR Byte, + PBOOLEAN ContinueProcessing, + PMOUSE_STATE MouseState, + PMOUSE_RESET_SUBSTATE ResetSubState); + +typedef struct _INTERNAL_I8042_HOOK_MOUSE { + OUT PVOID Context; + OUT PI8042_MOUSE_ISR IsrRoutine; + IN PI8042_ISR_WRITE_PORT IsrWritePort; + IN PI8042_QUEUE_PACKET QueueMousePacket; + IN PVOID CallContext; +} INTERNAL_I8042_HOOK_MOUSE, *PINTERNAL_I8042_HOOK_MOUSE; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __NTDD8042_H */ diff --git a/reactos/w32api/include/ddk/ntddbeep.h b/reactos/w32api/include/ddk/ntddbeep.h new file mode 100644 index 00000000000..b82b6274eaf --- /dev/null +++ b/reactos/w32api/include/ddk/ntddbeep.h @@ -0,0 +1,59 @@ +/* + * ntddbeep.h + * + * Beep device IOCTL interface + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __NTDDBEEP_H +#define __NTDDBEEP_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + + +#define DD_BEEP_DEVICE_NAME "\\Device\\Beep" +#define DD_BEEP_DEVICE_NAME_U L"\\Device\\Beep" + +#define IOCTL_BEEP_SET \ + CTL_CODE(FILE_DEVICE_BEEP, 0, METHOD_BUFFERED, FILE_ANY_ACCESS) + +typedef struct _BEEP_SET_PARAMETERS { + ULONG Frequency; + ULONG Duration; +} BEEP_SET_PARAMETERS, *PBEEP_SET_PARAMETERS; + +#define BEEP_FREQUENCY_MINIMUM 0x25 +#define BEEP_FREQUENCY_MAXIMUM 0x7FFF + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __NTDDBEEP_H */ diff --git a/reactos/w32api/include/ddk/ntddcdrm.h b/reactos/w32api/include/ddk/ntddcdrm.h new file mode 100644 index 00000000000..82bf815c2b4 --- /dev/null +++ b/reactos/w32api/include/ddk/ntddcdrm.h @@ -0,0 +1,352 @@ +/* + * ntddcdrm.h + * + * CDROM IOCTL interface. + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __NTDDCDRM_H +#define __NTDDCDRM_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" +#include "ntddstor.h" + + +#define IOCTL_CDROM_BASE FILE_DEVICE_CD_ROM + +#define IOCTL_CDROM_CHECK_VERIFY \ + CTL_CODE(IOCTL_CDROM_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_CDROM_FIND_NEW_DEVICES \ + CTL_CODE(IOCTL_CDROM_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_CDROM_GET_CONTROL \ + CTL_CODE(IOCTL_CDROM_BASE, 0x000D, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_CDROM_GET_DRIVE_GEOMETRY \ + CTL_CODE(IOCTL_CDROM_BASE, 0x0013, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_CDROM_GET_LAST_SESSION \ + CTL_CODE(IOCTL_CDROM_BASE, 0x000E, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_CDROM_GET_VOLUME \ + CTL_CODE(IOCTL_CDROM_BASE, 0x0005, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_CDROM_PAUSE_AUDIO \ + CTL_CODE(IOCTL_CDROM_BASE, 0x0003, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_CDROM_PLAY_AUDIO_MSF \ + CTL_CODE(IOCTL_CDROM_BASE, 0x0006, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_CDROM_RAW_READ \ + CTL_CODE(IOCTL_CDROM_BASE, 0x000F, METHOD_OUT_DIRECT, FILE_READ_ACCESS) + +#define IOCTL_CDROM_READ_Q_CHANNEL \ + CTL_CODE(IOCTL_CDROM_BASE, 0x000B, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_CDROM_READ_TOC \ + CTL_CODE(IOCTL_CDROM_BASE, 0x0000, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_CDROM_READ_TOC_EX \ + CTL_CODE(IOCTL_CDROM_BASE, 0x0015, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_CDROM_RESUME_AUDIO \ + CTL_CODE(IOCTL_CDROM_BASE, 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_CDROM_SEEK_AUDIO_MSF \ + CTL_CODE(IOCTL_CDROM_BASE, 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_CDROM_SET_VOLUME \ + CTL_CODE(IOCTL_CDROM_BASE, 0x000A, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_CDROM_SIMBAD \ + CTL_CODE(IOCTL_CDROM_BASE, 0x1003, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_CDROM_STOP_AUDIO \ + CTL_CODE(IOCTL_CDROM_BASE, 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS) + + +#define MAXIMUM_NUMBER_TRACKS 100 +#define MAXIMUM_CDROM_SIZE 804 +#define MINIMUM_CDROM_READ_TOC_EX_SIZE 2 + +typedef struct _TRACK_DATA { + UCHAR Reserved; + UCHAR Control : 4; + UCHAR Adr : 4; + UCHAR TrackNumber; + UCHAR Reserved1; + UCHAR Address[4]; +} TRACK_DATA, *PTRACK_DATA; + +/* CDROM_DISK_DATA.DiskData flags */ +#define CDROM_DISK_AUDIO_TRACK 0x00000001 +#define CDROM_DISK_DATA_TRACK 0x00000002 + +typedef struct _CDROM_DISK_DATA { + ULONG DiskData; +} CDROM_DISK_DATA, *PCDROM_DISK_DATA; + +typedef struct _CDROM_PLAY_AUDIO_MSF { + UCHAR StartingM; + UCHAR StartingS; + UCHAR StartingF; + UCHAR EndingM; + UCHAR EndingS; + UCHAR EndingF; +} CDROM_PLAY_AUDIO_MSF, *PCDROM_PLAY_AUDIO_MSF; + +/* CDROM_READ_TOC_EX.Format constants */ +#define CDROM_READ_TOC_EX_FORMAT_TOC 0x00 +#define CDROM_READ_TOC_EX_FORMAT_SESSION 0x01 +#define CDROM_READ_TOC_EX_FORMAT_FULL_TOC 0x02 +#define CDROM_READ_TOC_EX_FORMAT_PMA 0x03 +#define CDROM_READ_TOC_EX_FORMAT_ATIP 0x04 +#define CDROM_READ_TOC_EX_FORMAT_CDTEXT 0x05 + +typedef struct _CDROM_READ_TOC_EX { + UCHAR Format : 4; + UCHAR Reserved1 : 3; + UCHAR Msf : 1; + UCHAR SessionTrack; + UCHAR Reserved2; + UCHAR Reserved3; +} CDROM_READ_TOC_EX, *PCDROM_READ_TOC_EX; + +typedef struct _CDROM_SEEK_AUDIO_MSF { + UCHAR M; + UCHAR S; + UCHAR F; +} CDROM_SEEK_AUDIO_MSF, *PCDROM_SEEK_AUDIO_MSF; + +/* CDROM_SUB_Q_DATA_FORMAT.Format constants */ +#define IOCTL_CDROM_SUB_Q_CHANNEL 0x00 +#define IOCTL_CDROM_CURRENT_POSITION 0x01 +#define IOCTL_CDROM_MEDIA_CATALOG 0x02 +#define IOCTL_CDROM_TRACK_ISRC 0x03 + +typedef struct _CDROM_SUB_Q_DATA_FORMAT { + UCHAR Format; + UCHAR Track; +} CDROM_SUB_Q_DATA_FORMAT, *PCDROM_SUB_Q_DATA_FORMAT; + +typedef struct _CDROM_TOC { + UCHAR Length[2]; + UCHAR FirstTrack; + UCHAR LastTrack; + TRACK_DATA TrackData[MAXIMUM_NUMBER_TRACKS]; +} CDROM_TOC, *PCDROM_TOC; + +#define CDROM_TOC_SIZE sizeof(CDROM_TOC) + +typedef struct _CDROM_TOC_ATIP_DATA_BLOCK { + UCHAR CdrwReferenceSpeed : 3; + UCHAR Reserved3 : 1; + UCHAR WritePower : 3; + UCHAR True1 : 1; + UCHAR Reserved4 : 6; + UCHAR UnrestrictedUse : 1; + UCHAR Reserved5 : 1; + UCHAR A3Valid : 1; + UCHAR A2Valid : 1; + UCHAR A1Valid : 1; + UCHAR Reserved6 : 3; + UCHAR IsCdrw : 1; + UCHAR True2 : 1; + UCHAR Reserved7; + UCHAR LeadInMsf[3]; + UCHAR Reserved8; + UCHAR LeadOutMsf[3]; + UCHAR Reserved9; + UCHAR A1Values[3]; + UCHAR Reserved10; + UCHAR A2Values[3]; + UCHAR Reserved11; + UCHAR A3Values[3]; + UCHAR Reserved12; +} CDROM_TOC_ATIP_DATA_BLOCK, *PCDROM_TOC_ATIP_DATA_BLOCK; + +typedef struct _CDROM_TOC_ATIP_DATA { + UCHAR Length[2]; + UCHAR Reserved1; + UCHAR Reserved2; + CDROM_TOC_ATIP_DATA_BLOCK Descriptors[0]; +} CDROM_TOC_ATIP_DATA, *PCDROM_TOC_ATIP_DATA; + +/* CDROM_TOC_CD_TEXT_DATA_BLOCK.PackType constants */ +#define CDROM_CD_TEXT_PACK_ALBUM_NAME 0x80 +#define CDROM_CD_TEXT_PACK_PERFORMER 0x81 +#define CDROM_CD_TEXT_PACK_SONGWRITER 0x82 +#define CDROM_CD_TEXT_PACK_COMPOSER 0x83 +#define CDROM_CD_TEXT_PACK_ARRANGER 0x84 +#define CDROM_CD_TEXT_PACK_MESSAGES 0x85 +#define CDROM_CD_TEXT_PACK_DISC_ID 0x86 +#define CDROM_CD_TEXT_PACK_GENRE 0x87 +#define CDROM_CD_TEXT_PACK_TOC_INFO 0x88 +#define CDROM_CD_TEXT_PACK_TOC_INFO2 0x89 +#define CDROM_CD_TEXT_PACK_UPC_EAN 0x8e +#define CDROM_CD_TEXT_PACK_SIZE_INFO 0x8f + +typedef struct _CDROM_TOC_CD_TEXT_DATA_BLOCK { + UCHAR PackType; + UCHAR TrackNumber : 7; + UCHAR ExtensionFlag : 1; + UCHAR SequenceNumber; + UCHAR CharacterPosition : 4; + UCHAR BlockNumber : 3; + UCHAR Unicode : 1; + _ANONYMOUS_UNION union { + UCHAR Text[12]; + WCHAR WText[6]; + } DUMMYUNIONNAME; + UCHAR CRC[2]; +} CDROM_TOC_CD_TEXT_DATA_BLOCK, *PCDROM_TOC_CD_TEXT_DATA_BLOCK; + +typedef struct _CDROM_TOC_CD_TEXT_DATA { + UCHAR Length[2]; + UCHAR Reserved1; + UCHAR Reserved2; + CDROM_TOC_CD_TEXT_DATA_BLOCK Descriptors[0]; +} CDROM_TOC_CD_TEXT_DATA, *PCDROM_TOC_CD_TEXT_DATA; + +/* CDROM_TOC_FULL_TOC_DATA_BLOCK.Adr constants */ +#define ADR_NO_MODE_INFORMATION 0x0 +#define ADR_ENCODES_CURRENT_POSITION 0x1 +#define ADR_ENCODES_MEDIA_CATALOG 0x2 +#define ADR_ENCODES_ISRC 0x3 + +typedef struct _CDROM_TOC_FULL_TOC_DATA_BLOCK { + UCHAR SessionNumber; + UCHAR Control : 4; + UCHAR Adr : 4; + UCHAR Reserved1; + UCHAR Point; + UCHAR MsfExtra[3]; + UCHAR Zero; + UCHAR Msf[3]; +} CDROM_TOC_FULL_TOC_DATA_BLOCK, *PCDROM_TOC_FULL_TOC_DATA_BLOCK; + +typedef struct _CDROM_TOC_FULL_TOC_DATA { + UCHAR Length[2]; + UCHAR FirstCompleteSession; + UCHAR LastCompleteSession; + CDROM_TOC_FULL_TOC_DATA_BLOCK Descriptors[0]; +} CDROM_TOC_FULL_TOC_DATA, *PCDROM_TOC_FULL_TOC_DATA; + +typedef struct _CDROM_TOC_PMA_DATA { + UCHAR Length[2]; + UCHAR Reserved1; + UCHAR Reserved2; + CDROM_TOC_FULL_TOC_DATA_BLOCK Descriptors[0]; +} CDROM_TOC_PMA_DATA, *PCDROM_TOC_PMA_DATA; + +/* SUB_Q_HEADER.AudioStatus constants */ +#define AUDIO_STATUS_NOT_SUPPORTED 0x00 +#define AUDIO_STATUS_IN_PROGRESS 0x11 +#define AUDIO_STATUS_PAUSED 0x12 +#define AUDIO_STATUS_PLAY_COMPLETE 0x13 +#define AUDIO_STATUS_PLAY_ERROR 0x14 +#define AUDIO_STATUS_NO_STATUS 0x15 + +typedef struct _SUB_Q_HEADER { + UCHAR Reserved; + UCHAR AudioStatus; + UCHAR DataLength[2]; +} SUB_Q_HEADER, *PSUB_Q_HEADER; + +typedef struct _SUB_Q_MEDIA_CATALOG_NUMBER { + SUB_Q_HEADER Header; + UCHAR FormatCode; + UCHAR Reserved[3]; + UCHAR Reserved1 : 7; + UCHAR Mcval :1; + UCHAR MediaCatalog[15]; +} SUB_Q_MEDIA_CATALOG_NUMBER, *PSUB_Q_MEDIA_CATALOG_NUMBER; + +typedef struct _SUB_Q_TRACK_ISRC { + SUB_Q_HEADER Header; + UCHAR FormatCode; + UCHAR Reserved0; + UCHAR Track; + UCHAR Reserved1; + UCHAR Reserved2 : 7; + UCHAR Tcval : 1; + UCHAR TrackIsrc[15]; +} SUB_Q_TRACK_ISRC, *PSUB_Q_TRACK_ISRC; + +typedef struct _SUB_Q_CURRENT_POSITION { + SUB_Q_HEADER Header; + UCHAR FormatCode; + UCHAR Control : 4; + UCHAR ADR : 4; + UCHAR TrackNumber; + UCHAR IndexNumber; + UCHAR AbsoluteAddress[4]; + UCHAR TrackRelativeAddress[4]; +} SUB_Q_CURRENT_POSITION, *PSUB_Q_CURRENT_POSITION; + +typedef union _SUB_Q_CHANNEL_DATA { + SUB_Q_CURRENT_POSITION CurrentPosition; + SUB_Q_MEDIA_CATALOG_NUMBER MediaCatalog; + SUB_Q_TRACK_ISRC TrackIsrc; +} SUB_Q_CHANNEL_DATA, *PSUB_Q_CHANNEL_DATA; + +/* CDROM_AUDIO_CONTROL.LbaFormat constants */ +#define AUDIO_WITH_PREEMPHASIS 0x1 +#define DIGITAL_COPY_PERMITTED 0x2 +#define AUDIO_DATA_TRACK 0x4 +#define TWO_FOUR_CHANNEL_AUDIO 0x8 + +typedef struct _CDROM_AUDIO_CONTROL { + UCHAR LbaFormat; + USHORT LogicalBlocksPerSecond; +} CDROM_AUDIO_CONTROL, *PCDROM_AUDIO_CONTROL; + +typedef struct _VOLUME_CONTROL { + UCHAR PortVolume[4]; +} VOLUME_CONTROL, *PVOLUME_CONTROL; + +typedef enum _TRACK_MODE_TYPE { + YellowMode2, + XAForm2, + CDDA +} TRACK_MODE_TYPE, *PTRACK_MODE_TYPE; + +typedef struct __RAW_READ_INFO { + LARGE_INTEGER DiskOffset; + ULONG SectorCount; + TRACK_MODE_TYPE TrackMode; +} RAW_READ_INFO, *PRAW_READ_INFO; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __NTDDCDRM_H */ diff --git a/reactos/w32api/include/ddk/ntddcdvd.h b/reactos/w32api/include/ddk/ntddcdvd.h new file mode 100644 index 00000000000..48a106badcc --- /dev/null +++ b/reactos/w32api/include/ddk/ntddcdvd.h @@ -0,0 +1,214 @@ +/* + * ntddcdvd.h + * + * DVD IOCTL interface. + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __NTDDCDVD_H +#define __NTDDCDVD_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" +#include "ntddstor.h" + + +#define IOCTL_DVD_BASE FILE_DEVICE_DVD + +#define IOCTL_DVD_END_SESSION \ + CTL_CODE(IOCTL_DVD_BASE, 0x0403, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_DVD_GET_REGION \ + CTL_CODE(IOCTL_DVD_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_DVD_READ_KEY \ + CTL_CODE(IOCTL_DVD_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_DVD_READ_STRUCTURE \ + CTL_CODE(IOCTL_DVD_BASE, 0x0450, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_DVD_SEND_KEY \ + CTL_CODE(IOCTL_DVD_BASE, 0x0402, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_DVD_START_SESSION \ + CTL_CODE(IOCTL_DVD_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_DVD_SET_READ_AHEAD \ + CTL_CODE(IOCTL_DVD_BASE, 0x0404, METHOD_BUFFERED, FILE_READ_ACCESS) + + +typedef ULONG DVD_SESSION_ID, *PDVD_SESSION_ID; + +typedef struct _STORAGE_SET_READ_AHEAD { + LARGE_INTEGER TriggerAddress; + LARGE_INTEGER TargetAddress; +} STORAGE_SET_READ_AHEAD, *PSTORAGE_SET_READ_AHEAD; + +typedef enum DVD_STRUCTURE_FORMAT { + DvdPhysicalDescriptor, + DvdCopyrightDescriptor, + DvdDiskKeyDescriptor, + DvdBCADescriptor, + DvdManufacturerDescriptor, + DvdMaxDescriptor +} DVD_STRUCTURE_FORMAT, *PDVD_STRUCTURE_FORMAT; + +typedef struct DVD_READ_STRUCTURE { + LARGE_INTEGER BlockByteOffset; + DVD_STRUCTURE_FORMAT Format; + DVD_SESSION_ID SessionId; + UCHAR LayerNumber; +} DVD_READ_STRUCTURE, *PDVD_READ_STRUCTURE; + +typedef struct _DVD_DESCRIPTOR_HEADER { + USHORT Length; + UCHAR Reserved[2]; + UCHAR Data[0]; +} DVD_DESCRIPTOR_HEADER, *PDVD_DESCRIPTOR_HEADER; + +typedef struct _DVD_LAYER_DESCRIPTOR { + UCHAR BookVersion : 4; + UCHAR BookType : 4; + UCHAR MinimumRate : 4; + UCHAR DiskSize : 4; + UCHAR LayerType : 4; + UCHAR TrackPath : 1; + UCHAR NumberOfLayers : 2; + UCHAR Reserved1 : 1; + UCHAR TrackDensity : 4; + UCHAR LinearDensity : 4; + ULONG StartingDataSector; + ULONG EndDataSector; + ULONG EndLayerZeroSector; + UCHAR Reserved5 : 7; + UCHAR BCAFlag : 1; + UCHAR Reserved6; +} DVD_LAYER_DESCRIPTOR, *PDVD_LAYER_DESCRIPTOR; + +typedef struct _DVD_COPYRIGHT_DESCRIPTOR { + UCHAR CopyrightProtectionType; + UCHAR RegionManagementInformation; + USHORT Reserved; +} DVD_COPYRIGHT_DESCRIPTOR, *PDVD_COPYRIGHT_DESCRIPTOR; + +typedef struct _DVD_DISK_KEY_DESCRIPTOR { + UCHAR DiskKeyData[2048]; +} DVD_DISK_KEY_DESCRIPTOR, *PDVD_DISK_KEY_DESCRIPTOR; + +typedef enum _DVD_KEY_TYPE { + DvdChallengeKey = 0x01, + DvdBusKey1, + DvdBusKey2, + DvdTitleKey, + DvdAsf, + DvdSetRpcKey = 0x6, + DvdGetRpcKey = 0x8, + DvdDiskKey = 0x80, + DvdInvalidateAGID = 0x3f +} DVD_KEY_TYPE; + +typedef struct _DVD_COPY_PROTECT_KEY { + ULONG KeyLength; + DVD_SESSION_ID SessionId; + DVD_KEY_TYPE KeyType; + ULONG KeyFlags; + union { + HANDLE FileHandle; + LARGE_INTEGER TitleOffset; + } Parameters; + UCHAR KeyData[0]; +} DVD_COPY_PROTECT_KEY, *PDVD_COPY_PROTECT_KEY; + +#define DVD_CHALLENGE_KEY_LENGTH (12 + sizeof(DVD_COPY_PROTECT_KEY)) +#define DVD_BUS_KEY_LENGTH (8 + sizeof(DVD_COPY_PROTECT_KEY)) +#define DVD_TITLE_KEY_LENGTH (8 + sizeof(DVD_COPY_PROTECT_KEY)) +#define DVD_DISK_KEY_LENGTH (2048 + sizeof(DVD_COPY_PROTECT_KEY)) +#define DVD_RPC_KEY_LENGTH (sizeof(DVD_RPC_KEY) + sizeof(DVD_COPY_PROTECT_KEY)) +#define DVD_SET_RPC_KEY_LENGTH (sizeof(DVD_SET_RPC_KEY) + sizeof(DVD_COPY_PROTECT_KEY)) +#define DVD_ASF_LENGTH (sizeof(DVD_ASF) + sizeof(DVD_COPY_PROTECT_KEY)) + +#define DVD_END_ALL_SESSIONS ((DVD_SESSION_ID) 0xffffffff) + + +#define DVD_CGMS_RESERVED_MASK 0x00000078 + +#define DVD_CGMS_COPY_PROTECT_MASK 0x00000018 +#define DVD_CGMS_COPY_PERMITTED 0x00000000 +#define DVD_CGMS_COPY_ONCE 0x00000010 +#define DVD_CGMS_NO_COPY 0x00000018 + +#define DVD_COPYRIGHT_MASK 0x00000040 +#define DVD_NOT_COPYRIGHTED 0x00000000 +#define DVD_COPYRIGHTED 0x00000040 + +#define DVD_SECTOR_PROTECT_MASK 0x00000020 +#define DVD_SECTOR_NOT_PROTECTED 0x00000000 +#define DVD_SECTOR_PROTECTED 0x00000020 + + +typedef struct _DVD_BCA_DESCRIPTOR { + UCHAR BCAInformation[0]; +} DVD_BCA_DESCRIPTOR, *PDVD_BCA_DESCRIPTOR; + +typedef struct _DVD_MANUFACTURER_DESCRIPTOR { + UCHAR ManufacturingInformation[2048]; +} DVD_MANUFACTURER_DESCRIPTOR, *PDVD_MANUFACTURER_DESCRIPTOR; + +typedef struct _DVD_RPC_KEY { + UCHAR UserResetsAvailable : 3; + UCHAR ManufacturerResetsAvailable : 3; + UCHAR TypeCode : 2; + UCHAR RegionMask; + UCHAR RpcScheme; + UCHAR Reserved2[1]; +} DVD_RPC_KEY, *PDVD_RPC_KEY; + +typedef struct _DVD_SET_RPC_KEY { + UCHAR PreferredDriveRegionCode; + UCHAR Reserved[3]; +} DVD_SET_RPC_KEY, *PDVD_SET_RPC_KEY; + +typedef struct _DVD_ASF { + UCHAR Reserved0[3]; + UCHAR SuccessFlag : 1; + UCHAR Reserved1 : 7; +} DVD_ASF, *PDVD_ASF; + +typedef struct _DVD_REGION { + UCHAR CopySystem; + UCHAR RegionData; + UCHAR SystemRegion; + UCHAR ResetCount; +} DVD_REGION, *PDVD_REGION; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __NTDDCDVD_H */ diff --git a/reactos/w32api/include/ddk/ntddchgr.h b/reactos/w32api/include/ddk/ntddchgr.h new file mode 100644 index 00000000000..7cd6cfafdfc --- /dev/null +++ b/reactos/w32api/include/ddk/ntddchgr.h @@ -0,0 +1,358 @@ +/* + * ntddchgr.h + * + * Media changer IOCTL interface. + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __NTDDCHGR_H +#define __NTDDCHGR_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" +#include "ntddstor.h" + + +#define DD_CHANGER_DEVICE_NAME "\\Device\\Changer" +#define DD_CHANGER_DEVICE_NAME_U L"\\Device\\Changer" + +#define IOCTL_CHANGER_BASE FILE_DEVICE_CHANGER + +#define IOCTL_CHANGER_EXCHANGE_MEDIUM \ + CTL_CODE(IOCTL_CHANGER_BASE, 0x0008, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_CHANGER_GET_ELEMENT_STATUS \ + CTL_CODE(IOCTL_CHANGER_BASE, 0x0005, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_CHANGER_GET_PARAMETERS \ + CTL_CODE(IOCTL_CHANGER_BASE, 0x0000, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_CHANGER_GET_PRODUCT_DATA \ + CTL_CODE(IOCTL_CHANGER_BASE, 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_CHANGER_GET_STATUS \ + CTL_CODE(IOCTL_CHANGER_BASE, 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_CHANGER_INITIALIZE_ELEMENT_STATUS \ + CTL_CODE(IOCTL_CHANGER_BASE, 0x0006, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_CHANGER_MOVE_MEDIUM \ + CTL_CODE(IOCTL_CHANGER_BASE, 0x0009, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_CHANGER_QUERY_VOLUME_TAGS \ + CTL_CODE(IOCTL_CHANGER_BASE, 0x000B, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_CHANGER_REINITIALIZE_TRANSPORT \ + CTL_CODE(IOCTL_CHANGER_BASE, 0x000A, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_CHANGER_SET_ACCESS \ + CTL_CODE(IOCTL_CHANGER_BASE, 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_CHANGER_SET_POSITION \ + CTL_CODE(IOCTL_CHANGER_BASE, 0x0007, METHOD_BUFFERED, FILE_READ_ACCESS) + + +#define MAX_VOLUME_ID_SIZE 36 +#define MAX_VOLUME_TEMPLATE_SIZE 40 + +typedef enum _ELEMENT_TYPE { + AllElements, + ChangerTransport, + ChangerSlot, + ChangerIEPort, + ChangerDrive, + ChangerDoor, + ChangerKeypad, + ChangerMaxElement +} ELEMENT_TYPE, *PELEMENT_TYPE; + +typedef struct _CHANGER_ELEMENT { + ELEMENT_TYPE ElementType; + ULONG ElementAddress; +} CHANGER_ELEMENT, *PCHANGER_ELEMENT; + +typedef struct _CHANGER_ELEMENT_LIST { + CHANGER_ELEMENT Element; + ULONG NumberOfElements; +} CHANGER_ELEMENT_LIST, *PCHANGER_ELEMENT_LIST; + +typedef struct _CHANGER_INITIALIZE_ELEMENT_STATUS { + CHANGER_ELEMENT_LIST ElementList; + BOOLEAN BarCodeScan; +} CHANGER_INITIALIZE_ELEMENT_STATUS, *PCHANGER_INITIALIZE_ELEMENT_STATUS; + +typedef struct _CHANGER_READ_ELEMENT_STATUS { + CHANGER_ELEMENT_LIST ElementList; + BOOLEAN VolumeTagInfo; +} CHANGER_READ_ELEMENT_STATUS, *PCHANGER_READ_ELEMENT_STATUS; + + +typedef struct _CHANGER_SET_POSITION { + CHANGER_ELEMENT Transport; + CHANGER_ELEMENT Destination; + BOOLEAN Flip; +} CHANGER_SET_POSITION, *PCHANGER_SET_POSITION; + +typedef struct _CHANGER_EXCHANGE_MEDIUM { + CHANGER_ELEMENT Transport; + CHANGER_ELEMENT Source; + CHANGER_ELEMENT Destination1; + CHANGER_ELEMENT Destination2; + BOOLEAN Flip1; + BOOLEAN Flip2; +} CHANGER_EXCHANGE_MEDIUM, *PCHANGER_EXCHANGE_MEDIUM; + +typedef struct _CHANGER_MOVE_MEDIUM { + CHANGER_ELEMENT Transport; + CHANGER_ELEMENT Source; + CHANGER_ELEMENT Destination; + BOOLEAN Flip; +} CHANGER_MOVE_MEDIUM, *PCHANGER_MOVE_MEDIUM; + +#define VENDOR_ID_LENGTH 8 +#define PRODUCT_ID_LENGTH 16 +#define REVISION_LENGTH 4 +#define SERIAL_NUMBER_LENGTH 32 + +typedef struct _CHANGER_PRODUCT_DATA { + UCHAR VendorId[VENDOR_ID_LENGTH]; + UCHAR ProductId[PRODUCT_ID_LENGTH]; + UCHAR Revision[REVISION_LENGTH]; + UCHAR SerialNumber[SERIAL_NUMBER_LENGTH]; + UCHAR DeviceType; +} CHANGER_PRODUCT_DATA, *PCHANGER_PRODUCT_DATA; + +/* CHANGER_SET_ACCESS.Control constants */ +#define LOCK_ELEMENT 0 +#define UNLOCK_ELEMENT 1 +#define EXTEND_IEPORT 2 +#define RETRACT_IEPORT 3 + +typedef struct _CHANGER_SET_ACCESS { + CHANGER_ELEMENT Element; + ULONG Control; +} CHANGER_SET_ACCESS, *PCHANGER_SET_ACCESS; + + +typedef enum _CHANGER_DEVICE_PROBLEM_TYPE { + DeviceProblemNone, + DeviceProblemHardware, + DeviceProblemCHMError, + DeviceProblemDoorOpen, + DeviceProblemCalibrationError, + DeviceProblemTargetFailure, + DeviceProblemCHMMoveError, + DeviceProblemCHMZeroError, + DeviceProblemCartridgeInsertError, + DeviceProblemPositionError, + DeviceProblemSensorError, + DeviceProblemCartridgeEjectError, + DeviceProblemGripperError, + DeviceProblemDriveError +} CHANGER_DEVICE_PROBLEM_TYPE, *PCHANGER_DEVICE_PROBLEM_TYPE; + +/* CHANGER_ELEMENT_STATUS(_EX).Flags constants */ +#define ELEMENT_STATUS_FULL 0x00000001 +#define ELEMENT_STATUS_IMPEXP 0x00000002 +#define ELEMENT_STATUS_EXCEPT 0x00000004 +#define ELEMENT_STATUS_ACCESS 0x00000008 +#define ELEMENT_STATUS_EXENAB 0x00000010 +#define ELEMENT_STATUS_INENAB 0x00000020 +#define ELEMENT_STATUS_PRODUCT_DATA 0x00000040 +#define ELEMENT_STATUS_LUN_VALID 0x00001000 +#define ELEMENT_STATUS_ID_VALID 0x00002000 +#define ELEMENT_STATUS_NOT_BUS 0x00008000 +#define ELEMENT_STATUS_INVERT 0x00400000 +#define ELEMENT_STATUS_SVALID 0x00800000 +#define ELEMENT_STATUS_PVOLTAG 0x10000000 +#define ELEMENT_STATUS_AVOLTAG 0x20000000 + +/* CHANGER_ELEMENT_STATUS(_EX).ExceptionCode constants */ +#define ERROR_LABEL_UNREADABLE 0x00000001 +#define ERROR_LABEL_QUESTIONABLE 0x00000002 +#define ERROR_SLOT_NOT_PRESENT 0x00000004 +#define ERROR_DRIVE_NOT_INSTALLED 0x00000008 +#define ERROR_TRAY_MALFUNCTION 0x00000010 +#define ERROR_INIT_STATUS_NEEDED 0x00000011 +#define ERROR_UNHANDLED_ERROR 0xFFFFFFFF + +typedef struct _CHANGER_ELEMENT_STATUS { + CHANGER_ELEMENT Element; + CHANGER_ELEMENT SrcElementAddress; + ULONG Flags; + ULONG ExceptionCode; + UCHAR TargetId; + UCHAR Lun; + USHORT Reserved; + UCHAR PrimaryVolumeID[MAX_VOLUME_ID_SIZE]; + UCHAR AlternateVolumeID[MAX_VOLUME_ID_SIZE]; +} CHANGER_ELEMENT_STATUS, *PCHANGER_ELEMENT_STATUS; + +typedef struct _CHANGER_ELEMENT_STATUS_EX { + CHANGER_ELEMENT Element; + CHANGER_ELEMENT SrcElementAddress; + ULONG Flags; + ULONG ExceptionCode; + UCHAR TargetId; + UCHAR Lun; + USHORT Reserved; + UCHAR PrimaryVolumeID[MAX_VOLUME_ID_SIZE]; + UCHAR AlternateVolumeID[MAX_VOLUME_ID_SIZE]; + UCHAR VendorIdentification[VENDOR_ID_LENGTH]; + UCHAR ProductIdentification[PRODUCT_ID_LENGTH]; + UCHAR SerialNumber[SERIAL_NUMBER_LENGTH]; +} CHANGER_ELEMENT_STATUS_EX, *PCHANGER_ELEMENT_STATUS_EX; + +/* CHANGER_SEND_VOLUME_TAG_INFORMATION.ActionCode constants */ +#define SEARCH_ALL 0x0 +#define SEARCH_PRIMARY 0x1 +#define SEARCH_ALTERNATE 0x2 +#define SEARCH_ALL_NO_SEQ 0x4 +#define SEARCH_PRI_NO_SEQ 0x5 +#define SEARCH_ALT_NO_SEQ 0x6 +#define ASSERT_PRIMARY 0x8 +#define ASSERT_ALTERNATE 0x9 +#define REPLACE_PRIMARY 0xA +#define REPLACE_ALTERNATE 0xB +#define UNDEFINE_PRIMARY 0xC +#define UNDEFINE_ALTERNATE 0xD + +typedef struct _CHANGER_SEND_VOLUME_TAG_INFORMATION { + CHANGER_ELEMENT StartingElement; + ULONG ActionCode; + UCHAR VolumeIDTemplate[MAX_VOLUME_TEMPLATE_SIZE]; +} CHANGER_SEND_VOLUME_TAG_INFORMATION, *PCHANGER_SEND_VOLUME_TAG_INFORMATION; + +/* GET_CHANGER_PARAMETERS.Features0 constants */ +#define CHANGER_BAR_CODE_SCANNER_INSTALLED 0x00000001 +#define CHANGER_INIT_ELEM_STAT_WITH_RANGE 0x00000002 +#define CHANGER_CLOSE_IEPORT 0x00000004 +#define CHANGER_OPEN_IEPORT 0x00000008 +#define CHANGER_STATUS_NON_VOLATILE 0x00000010 +#define CHANGER_EXCHANGE_MEDIA 0x00000020 +#define CHANGER_CLEANER_SLOT 0x00000040 +#define CHANGER_LOCK_UNLOCK 0x00000080 +#define CHANGER_CARTRIDGE_MAGAZINE 0x00000100 +#define CHANGER_MEDIUM_FLIP 0x00000200 +#define CHANGER_POSITION_TO_ELEMENT 0x00000400 +#define CHANGER_REPORT_IEPORT_STATE 0x00000800 +#define CHANGER_STORAGE_DRIVE 0x00001000 +#define CHANGER_STORAGE_IEPORT 0x00002000 +#define CHANGER_STORAGE_SLOT 0x00004000 +#define CHANGER_STORAGE_TRANSPORT 0x00008000 +#define CHANGER_DRIVE_CLEANING_REQUIRED 0x00010000 +#define CHANGER_PREDISMOUNT_EJECT_REQUIRED 0x00020000 +#define CHANGER_CLEANER_ACCESS_NOT_VALID 0x00040000 +#define CHANGER_PREMOUNT_EJECT_REQUIRED 0x00080000 +#define CHANGER_VOLUME_IDENTIFICATION 0x00100000 +#define CHANGER_VOLUME_SEARCH 0x00200000 +#define CHANGER_VOLUME_ASSERT 0x00400000 +#define CHANGER_VOLUME_REPLACE 0x00800000 +#define CHANGER_VOLUME_UNDEFINE 0x01000000 +#define CHANGER_SERIAL_NUMBER_VALID 0x04000000 +#define CHANGER_DEVICE_REINITIALIZE_CAPABLE 0x08000000 +#define CHANGER_KEYPAD_ENABLE_DISABLE 0x10000000 +#define CHANGER_DRIVE_EMPTY_ON_DOOR_ACCESS 0x20000000 +#define CHANGER_RESERVED_BIT 0x80000000 + +/* GET_CHANGER_PARAMETERS.Features1 constants */ +#define CHANGER_PREDISMOUNT_ALIGN_TO_SLOT 0x80000001 +#define CHANGER_PREDISMOUNT_ALIGN_TO_DRIVE 0x80000002 +#define CHANGER_CLEANER_AUTODISMOUNT 0x80000004 +#define CHANGER_TRUE_EXCHANGE_CAPABLE 0x80000008 +#define CHANGER_SLOTS_USE_TRAYS 0x80000010 +#define CHANGER_RTN_MEDIA_TO_ORIGINAL_ADDR 0x80000020 +#define CHANGER_CLEANER_OPS_NOT_SUPPORTED 0x80000040 +#define CHANGER_IEPORT_USER_CONTROL_OPEN 0x80000080 +#define CHANGER_IEPORT_USER_CONTROL_CLOSE 0x80000100 +#define CHANGER_MOVE_EXTENDS_IEPORT 0x80000200 +#define CHANGER_MOVE_RETRACTS_IEPORT 0x80000400 + +/* GET_CHANGER_PARAMETERS.MoveFrom,ExchangeFrom,PositionCapabilities constants */ +#define CHANGER_TO_TRANSPORT 0x01 +#define CHANGER_TO_SLOT 0x02 +#define CHANGER_TO_IEPORT 0x04 +#define CHANGER_TO_DRIVE 0x08 + +/* GET_CHANGER_PARAMETERS.LockUnlockCapabilities constants */ +#define LOCK_UNLOCK_IEPORT 0x01 +#define LOCK_UNLOCK_DOOR 0x02 +#define LOCK_UNLOCK_KEYPAD 0x04 + +typedef struct _GET_CHANGER_PARAMETERS { + ULONG Size; + USHORT NumberTransportElements; + USHORT NumberStorageElements; + USHORT NumberCleanerSlots; + USHORT NumberIEElements; + USHORT NumberDataTransferElements; + USHORT NumberOfDoors; + USHORT FirstSlotNumber; + USHORT FirstDriveNumber; + USHORT FirstTransportNumber; + USHORT FirstIEPortNumber; + USHORT FirstCleanerSlotAddress; + USHORT MagazineSize; + ULONG DriveCleanTimeout; + ULONG Features0; + ULONG Features1; + UCHAR MoveFromTransport; + UCHAR MoveFromSlot; + UCHAR MoveFromIePort; + UCHAR MoveFromDrive; + UCHAR ExchangeFromTransport; + UCHAR ExchangeFromSlot; + UCHAR ExchangeFromIePort; + UCHAR ExchangeFromDrive; + UCHAR LockUnlockCapabilities; + UCHAR PositionCapabilities; + UCHAR Reserved1[2]; + ULONG Reserved2[2]; +} GET_CHANGER_PARAMETERS, * PGET_CHANGER_PARAMETERS; + +typedef struct READ_ELEMENT_ADDRESS_INFO { + ULONG NumberOfElements; + CHANGER_ELEMENT_STATUS ElementStatus[1]; +} READ_ELEMENT_ADDRESS_INFO, *PREAD_ELEMENT_ADDRESS_INFO; + +typedef struct _TAPE_WMI_OPERATIONS { + ULONG Method; + ULONG DataBufferSize; + PVOID DataBuffer; +} TAPE_WMI_OPERATIONS, *PTAPE_WMI_OPERATIONS; + +typedef struct _WMI_CHANGER_PROBLEM_DEVICE_ERROR { + ULONG ChangerProblemType; +} WMI_CHANGER_PROBLEM_DEVICE_ERROR, *PWMI_CHANGER_PROBLEM_DEVICE_ERROR; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __NTDDCHGR_H */ diff --git a/reactos/w32api/include/ddk/ntdddisk.h b/reactos/w32api/include/ddk/ntdddisk.h new file mode 100644 index 00000000000..205046928f9 --- /dev/null +++ b/reactos/w32api/include/ddk/ntdddisk.h @@ -0,0 +1,522 @@ +/* + * ntdddisk.h + * + * Disk IOCTL interface. + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __NTDDDISK_H +#define __NTDDDISK_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" +#include "ntddstor.h" + + +#define DD_DISK_DEVICE_NAME "\\Device\\UNKNOWN" +#define DD_DISK_DEVICE_NAME_U L"\\Device\\UNKNOWN" + +#define IOCTL_DISK_BASE FILE_DEVICE_DISK + +#define IOCTL_DISK_CHECK_VERIFY \ + CTL_CODE(IOCTL_DISK_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_DISK_CONTROLLER_NUMBER \ + CTL_CODE(IOCTL_DISK_BASE, 0x0011, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_DISK_CREATE_DISK \ + CTL_CODE(IOCTL_DISK_BASE, 0x0016, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_DISK_DELETE_DRIVE_LAYOUT \ + CTL_CODE(IOCTL_DISK_BASE, 0x0040, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_DISK_FIND_NEW_DEVICES \ + CTL_CODE(IOCTL_DISK_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_DISK_FORMAT_TRACKS \ + CTL_CODE(IOCTL_DISK_BASE, 0x0006, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_DISK_FORMAT_TRACKS_EX \ + CTL_CODE(IOCTL_DISK_BASE, 0x000b, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_DISK_GET_CACHE_INFORMATION \ + CTL_CODE(IOCTL_DISK_BASE, 0x0035, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_DISK_GET_DRIVE_GEOMETRY \ + CTL_CODE(IOCTL_DISK_BASE, 0x0000, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_DISK_GET_DRIVE_GEOMETRY_EX \ + CTL_CODE(IOCTL_DISK_BASE, 0x0028, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_DISK_GET_DRIVE_LAYOUT \ + CTL_CODE(IOCTL_DISK_BASE, 0x0003, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_DISK_GET_DRIVE_LAYOUT_EX \ + CTL_CODE(IOCTL_DISK_BASE, 0x0014, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_DISK_GET_MEDIA_TYPES \ + CTL_CODE(IOCTL_DISK_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_DISK_GET_LENGTH_INFO \ + CTL_CODE(IOCTL_DISK_BASE, 0x0017, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_DISK_GET_PARTITION_INFO \ + CTL_CODE(IOCTL_DISK_BASE, 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_DISK_GET_PARTITION_INFO_EX \ + CTL_CODE(IOCTL_DISK_BASE, 0x0012, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_DISK_GROW_PARTITION \ + CTL_CODE(IOCTL_DISK_BASE, 0x0034, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_DISK_INTERNAL_CLEAR_VERIFY \ + CTL_CODE(IOCTL_DISK_BASE, 0x0101, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_DISK_INTERNAL_SET_VERIFY \ + CTL_CODE(IOCTL_DISK_BASE, 0x0100, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_DISK_IS_WRITABLE \ + CTL_CODE(IOCTL_DISK_BASE, 0x0009, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_DISK_PERFORMANCE \ + CTL_CODE(IOCTL_DISK_BASE, 0x0008, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_DISK_PERFORMANCE_OFF \ + CTL_CODE(IOCTL_DISK_BASE, 0x0018, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_DISK_REASSIGN_BLOCKS \ + CTL_CODE(IOCTL_DISK_BASE, 0x0007, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_DISK_RESERVE \ + CTL_CODE(IOCTL_DISK_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_DISK_SET_CACHE_INFORMATION \ + CTL_CODE(IOCTL_DISK_BASE, 0x0036, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_DISK_SET_DRIVE_LAYOUT \ + CTL_CODE(IOCTL_DISK_BASE, 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_DISK_SET_DRIVE_LAYOUT_EX \ + CTL_CODE(IOCTL_DISK_BASE, 0x0015, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_DISK_SET_PARTITION_INFO \ + CTL_CODE(IOCTL_DISK_BASE, 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_DISK_SET_PARTITION_INFO_EX \ + CTL_CODE(IOCTL_DISK_BASE, 0x0013, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_DISK_UPDATE_DRIVE_SIZE \ + CTL_CODE(IOCTL_DISK_BASE, 0x0032, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_DISK_VERIFY \ + CTL_CODE(IOCTL_DISK_BASE, 0x0005, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define SMART_GET_VERSION \ + CTL_CODE(IOCTL_DISK_BASE, 0x0020, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define SMART_RCV_DRIVE_DATA \ + CTL_CODE(IOCTL_DISK_BASE, 0x0022, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define SMART_SEND_DRIVE_COMMAND \ + CTL_CODE(IOCTL_DISK_BASE, 0x0021, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + + +#define PARTITION_ENTRY_UNUSED 0x00 +#define PARTITION_FAT_12 0x01 +#define PARTITION_XENIX_1 0x02 +#define PARTITION_XENIX_2 0x03 +#define PARTITION_FAT_16 0x04 +#define PARTITION_EXTENDED 0x05 +#define PARTITION_HUGE 0x06 +#define PARTITION_IFS 0x07 +#define PARTITION_OS2BOOTMGR 0x0A +#define PARTITION_FAT32 0x0B +#define PARTITION_FAT32_XINT13 0x0C +#define PARTITION_XINT13 0x0E +#define PARTITION_XINT13_EXTENDED 0x0F +#define PARTITION_PREP 0x41 +#define PARTITION_LDM 0x42 +#define PARTITION_UNIX 0x63 +#define VALID_NTFT 0xC0 +#define PARTITION_NTFT 0x80 + +#define IsFTPartition( PartitionType ) \ + (((PartitionType) & PARTITION_NTFT) && \ + IsRecognizedPartition(PartitionType)) + +#define IsContainerPartition(PartitionType) \ + (((PartitionType) == PARTITION_EXTENDED) || \ + ((PartitionType) == PARTITION_XINT13_EXTENDED)) + +#define IsRecognizedPartition(PartitionType) ( \ + (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT_12)) || \ + (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_HUGE)) || \ + (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_IFS)) || \ + (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT32)) || \ + (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT32_XINT13)) || \ + (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_XINT13)) || \ + ((PartitionType) == PARTITION_FAT_12) || \ + ((PartitionType) == PARTITION_FAT_16) || \ + ((PartitionType) == PARTITION_HUGE) || \ + ((PartitionType) == PARTITION_IFS) || \ + ((PartitionType) == PARTITION_FAT32) || \ + ((PartitionType) == PARTITION_FAT32_XINT13) || \ + ((PartitionType) == PARTITION_XINT13)) + +#define WMI_DISK_GEOMETRY_GUID \ + {0x25007f51, 0x57c2, 0x11d1, {0xa5, 0x28, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0x10}} + +typedef USHORT BAD_TRACK_NUMBER; +typedef USHORT *PBAD_TRACK_NUMBER; + +typedef enum _MEDIA_TYPE { + Unknown, + F5_1Pt2_512, + F3_1Pt44_512, + F3_2Pt88_512, + F3_20Pt8_512, + F3_720_512, + F5_360_512, + F5_320_512, + F5_320_1024, + F5_180_512, + F5_160_512, + RemovableMedia, + FixedMedia, + F3_120M_512, + F3_640_512, + F5_640_512, + F5_720_512, + F3_1Pt2_512, + F3_1Pt23_1024, + F5_1Pt23_1024, + F3_128Mb_512, + F3_230Mb_512, + F8_256_128 +} MEDIA_TYPE, *PMEDIA_TYPE; + +typedef enum _DETECTION_TYPE { + DetectNone, + DetectInt13, + DetectExInt13 +} DETECTION_TYPE; + +typedef struct _DISK_CONTROLLER_NUMBER { + ULONG ControllerNumber; + ULONG DiskNumber; +} DISK_CONTROLLER_NUMBER, *PDISK_CONTROLLER_NUMBER; + +typedef struct _DISK_INT13_INFO { + USHORT DriveSelect; + ULONG MaxCylinders; + USHORT SectorsPerTrack; + USHORT MaxHeads; + USHORT NumberDrives; +} DISK_INT13_INFO, *PDISK_INT13_INFO; + +typedef struct _DISK_EX_INT13_INFO { + USHORT ExBufferSize; + USHORT ExFlags; + ULONG ExCylinders; + ULONG ExHeads; + ULONG ExSectorsPerTrack; + ULONG64 ExSectorsPerDrive; + USHORT ExSectorSize; + USHORT ExReserved; +} DISK_EX_INT13_INFO, *PDISK_EX_INT13_INFO; + +typedef struct _DISK_DETECTION_INFO { + ULONG SizeOfDetectInfo; + DETECTION_TYPE DetectionType; + _ANONYMOUS_UNION union { + _ANONYMOUS_STRUCT struct { + DISK_INT13_INFO Int13; + DISK_EX_INT13_INFO ExInt13; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; +} DISK_DETECTION_INFO, *PDISK_DETECTION_INFO; + +typedef struct _DISK_GEOMETRY { + LARGE_INTEGER Cylinders; + MEDIA_TYPE MediaType; + ULONG TracksPerCylinder; + ULONG SectorsPerTrack; + ULONG BytesPerSector; +} DISK_GEOMETRY, *PDISK_GEOMETRY; + +typedef struct _DISK_GEOMETRY_EX { + DISK_GEOMETRY Geometry; + LARGE_INTEGER DiskSize; + UCHAR Data[1]; +} DISK_GEOMETRY_EX, *PDISK_GEOMETRY_EX; + +#define DiskGeometryGetPartition(Geometry) \ + ((PDISK_PARTITION_INFO)((Geometry) + 1)) + +#define DiskGeometryGetDetect(Geometry)\ + ((PDISK_DETECTION_INFO)(((PBYTE)DiskGeometryGetPartition(Geometry) + \ + DiskGeometryGetPartition(Geometry)->SizeOfPartitionInfo))) + +typedef struct _PARTITION_INFORMATION { + LARGE_INTEGER StartingOffset; + LARGE_INTEGER PartitionLength; + DWORD HiddenSectors; + DWORD PartitionNumber; + BYTE PartitionType; + BOOLEAN BootIndicator; + BOOLEAN RecognizedPartition; + BOOLEAN RewritePartition; +} PARTITION_INFORMATION, *PPARTITION_INFORMATION; + +typedef struct _PARTITION_INFORMATION_GPT { + GUID PartitionType; + GUID PartitionId; + ULONG64 Attributes; + WCHAR Name [36]; +} PARTITION_INFORMATION_GPT, *PPARTITION_INFORMATION_GPT; + +typedef struct _DISK_PARTITION_INFO { + ULONG SizeOfPartitionInfo; + PARTITION_STYLE PartitionStyle; + _ANONYMOUS_UNION union { + struct { + ULONG Signature; + ULONG CheckSum; + } Mbr; + struct { + GUID DiskId; + } Gpt; + } DUMMYUNIONNAME; +} DISK_PARTITION_INFO, *PDISK_PARTITION_INFO; + +typedef struct _DISK_PERFORMANCE { + LARGE_INTEGER BytesRead; + LARGE_INTEGER BytesWritten; + LARGE_INTEGER ReadTime; + LARGE_INTEGER WriteTime; + LARGE_INTEGER IdleTime; + ULONG ReadCount; + ULONG WriteCount; + ULONG QueueDepth; + ULONG SplitCount; + LARGE_INTEGER QueryTime; + ULONG StorageDeviceNumber; + WCHAR StorageManagerName[8]; +} DISK_PERFORMANCE, *PDISK_PERFORMANCE; + +typedef struct _PARTITION_INFORMATION_EX { + PARTITION_STYLE PartitionStyle; + LARGE_INTEGER StartingOffset; + LARGE_INTEGER PartitionLength; + ULONG PartitionNumber; + BOOLEAN RewritePartition; + _ANONYMOUS_UNION union { + PARTITION_INFORMATION_MBR Mbr; + PARTITION_INFORMATION_GPT Gpt; + } DUMMYUNIONNAME; +} PARTITION_INFORMATION_EX, *PPARTITION_INFORMATION_EX; + +typedef struct _FORMAT_EX_PARAMETERS { + MEDIA_TYPE MediaType; + ULONG StartCylinderNumber; + ULONG EndCylinderNumber; + ULONG StartHeadNumber; + ULONG EndHeadNumber; + USHORT FormatGapLength; + USHORT SectorsPerTrack; + USHORT SectorNumber[1]; +} FORMAT_EX_PARAMETERS, *PFORMAT_EX_PARAMETERS; + +typedef struct _FORMAT_PARAMETERS { + MEDIA_TYPE MediaType; + ULONG StartCylinderNumber; + ULONG EndCylinderNumber; + ULONG StartHeadNumber; + ULONG EndHeadNumber; +} FORMAT_PARAMETERS, *PFORMAT_PARAMETERS; + +typedef struct _GET_LENGTH_INFORMATION { + LARGE_INTEGER Length; +} GET_LENGTH_INFORMATION, *PGET_LENGTH_INFORMATION; + +typedef struct _REASSIGN_BLOCKS { + WORD Reserved; + WORD Count; + DWORD BlockNumber[1]; +} REASSIGN_BLOCKS, *PREASSIGN_BLOCKS; + +typedef struct _SET_PARTITION_INFORMATION { + UCHAR PartitionType; +} SET_PARTITION_INFORMATION, *PSET_PARTITION_INFORMATION; + +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; + _ANONYMOUS_UNION union { + SET_PARTITION_INFORMATION_MBR Mbr; + SET_PARTITION_INFORMATION_GPT Gpt; + } DUMMYUNIONNAME; +} SET_PARTITION_INFORMATION_EX, *PSET_PARTITION_INFORMATION_EX; + +typedef struct _VERIFY_INFORMATION { + LARGE_INTEGER StartingOffset; + DWORD Length; +} VERIFY_INFORMATION, *PVERIFY_INFORMATION; + +typedef enum { + EqualPriority, + KeepPrefetchedData, + KeepReadData +} DISK_CACHE_RETENTION_PRIORITY; + +typedef struct _DISK_CACHE_INFORMATION { + BOOLEAN ParametersSavable; + BOOLEAN ReadCacheEnabled; + BOOLEAN WriteCacheEnabled; + DISK_CACHE_RETENTION_PRIORITY ReadRetentionPriority; + DISK_CACHE_RETENTION_PRIORITY WriteRetentionPriority; + USHORT DisablePrefetchTransferLength; + BOOLEAN PrefetchScalar; + _ANONYMOUS_UNION union { + struct { + USHORT Minimum; + USHORT Maximum; + USHORT MaximumBlocks; + } ScalarPrefetch; + struct { + USHORT Minimum; + USHORT Maximum; + } BlockPrefetch; + } DUMMYUNIONNAME; +} DISK_CACHE_INFORMATION, *PDISK_CACHE_INFORMATION; + +typedef struct _DISK_GROW_PARTITION { + ULONG PartitionNumber; + LARGE_INTEGER BytesToGrow; +} DISK_GROW_PARTITION, *PDISK_GROW_PARTITION; + +/* GETVERSIONINPARAMS.fCapabilities constants */ +#define CAP_ATA_ID_CMD 1 +#define CAP_ATAPI_ID_CMD 2 +#define CAP_SMART_CMD 4 + +typedef struct _GETVERSIONINPARAMS { + UCHAR bVersion; + UCHAR bRevision; + UCHAR bReserved; + UCHAR bIDEDeviceMap; + ULONG fCapabilities; + ULONG dwReserved[4]; +} GETVERSIONINPARAMS, *PGETVERSIONINPARAMS, *LPGETVERSIONINPARAMS; + +/* IDEREGS.bCommandReg constants */ +#define ATAPI_ID_CMD 0xA1 +#define ID_CMD 0xEC +#define SMART_CMD 0xB0 + +#define SMART_CYL_LOW 0x4F +#define SMART_CYL_HI 0xC2 + +typedef struct _IDEREGS { + UCHAR bFeaturesReg; + UCHAR bSectorCountReg; + UCHAR bSectorNumberReg; + UCHAR bCylLowReg; + UCHAR bCylHighReg; + UCHAR bDriveHeadReg; + UCHAR bCommandReg; + UCHAR bReserved; +} IDEREGS, *PIDEREGS, *LPIDEREGS; + +typedef struct _SENDCMDINPARAMS { + ULONG cBufferSize; + IDEREGS irDriveRegs; + UCHAR bDriveNumber; + UCHAR bReserved[3]; + ULONG dwReserved[4]; + UCHAR bBuffer[1]; +} SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS; + +/* DRIVERSTATUS.bDriverError constants */ +#define SMART_NO_ERROR 0 +#define SMART_IDE_ERROR 1 +#define SMART_INVALID_FLAG 2 +#define SMART_INVALID_COMMAND 3 +#define SMART_INVALID_BUFFER 4 +#define SMART_INVALID_DRIVE 5 +#define SMART_INVALID_IOCTL 6 +#define SMART_ERROR_NO_MEM 7 +#define SMART_INVALID_REGISTER 8 +#define SMART_NOT_SUPPORTED 9 +#define SMART_NO_IDE_DEVICE 10 + +#define SMART_OFFLINE_ROUTINE_OFFLINE 0 +#define SMART_SHORT_SELFTEST_OFFLINE 1 +#define SMART_EXTENDED_SELFTEST_OFFLINE 2 +#define SMART_ABORT_OFFLINE_SELFTEST 127 +#define SMART_SHORT_SELFTEST_CAPTIVE 129 +#define SMART_EXTENDED_SELFTEST_CAPTIVE 130 + +typedef struct _DRIVERSTATUS { + UCHAR bDriverError; + UCHAR bIDEError; + UCHAR bReserved[2]; + ULONG dwReserved[2]; +} DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS; + +#define READ_ATTRIBUTE_BUFFER_SIZE 512 +#define IDENTIFY_BUFFER_SIZE 512 +#define READ_THRESHOLD_BUFFER_SIZE 512 +#define SMART_LOG_SECTOR_SIZE 512 + +typedef struct _SENDCMDOUTPARAMS { + ULONG cBufferSize; + DRIVERSTATUS DriverStatus; + UCHAR bBuffer[1]; +} SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS; + +#define READ_ATTRIBUTES 0xD0 +#define READ_THRESHOLDS 0xD1 +#define ENABLE_DISABLE_AUTOSAVE 0xD2 +#define SAVE_ATTRIBUTE_VALUES 0xD3 +#define EXECUTE_OFFLINE_DIAGS 0xD4 +#define SMART_READ_LOG 0xD5 +#define SMART_WRITE_LOG 0xd6 +#define ENABLE_SMART 0xD8 +#define DISABLE_SMART 0xD9 +#define RETURN_SMART_STATUS 0xDA +#define ENABLE_DISABLE_AUTO_OFFLINE 0xDB + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __NTDDDISK_H */ diff --git a/reactos/w32api/include/ddk/ntddk.h b/reactos/w32api/include/ddk/ntddk.h new file mode 100644 index 00000000000..480ff0ccfac --- /dev/null +++ b/reactos/w32api/include/ddk/ntddk.h @@ -0,0 +1,90 @@ +/* + * ntddk.h + * + * Windows Device Driver Kit + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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. + * + * DEFINES: + * DBG - Debugging enabled/disabled (0/1) + * POOL_TAGGING - Enable pool tagging + * _X86_ - X86 environment + */ + +#ifndef __NTDDK_H +#define __NTDDK_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include <stdarg.h> +#include <windef.h> +#include <ntdef.h> +#include <basetyps.h> + +/* Base types, structures and definitions */ +typedef short CSHORT; +typedef CONST int CINT; +typedef CONST char *PCSZ; + +#ifndef STATIC +#define STATIC static +#endif + +#ifndef CALLBACK +#define CALLBACK +#endif + +#ifndef DECL_IMPORT +#define DECL_IMPORT __attribute__((dllimport)) +#endif + +#ifndef DECL_EXPORT +#define DECL_EXPORT __attribute__((dllexport)) +#endif + +/* Windows NT status codes */ +#include "ntstatus.h" + +/* Windows NT definitions exported to user mode */ +#include <winnt.h> + +/* Windows Device Driver Kit */ +#include "winddk.h" + +/* Definitions only in Windows XP */ +#include "winxp.h" + +/* Definitions only in Windows 2000 */ +#include "win2k.h" + +/* Definitions only in Windows NT 4 */ +#include "winnt4.h" + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __NTDDK_H */ diff --git a/reactos/w32api/include/ddk/ntddkbd.h b/reactos/w32api/include/ddk/ntddkbd.h new file mode 100644 index 00000000000..9a1a358a371 --- /dev/null +++ b/reactos/w32api/include/ddk/ntddkbd.h @@ -0,0 +1,140 @@ +/* + * ntddkbd.h + * + * Keyboard IOCTL interface + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __NTDDKBD_H +#define __NTDDKBD_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + + +#define DD_KEYBOARD_DEVICE_NAME "\\Device\\KeyboardClass" +#define DD_KEYBOARD_DEVICE_NAME_U L"\\Device\\KeyboardClass" + +#define IOCTL_KEYBOARD_QUERY_ATTRIBUTES \ + CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0000, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_KEYBOARD_QUERY_INDICATORS \ + CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0010, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_KEYBOARD_QUERY_INDICATOR_TRANSLATION \ + CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0020, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_KEYBOARD_QUERY_TYPEMATIC \ + CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0008, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_KEYBOARD_SET_TYPEMATIC \ + CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0001, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_KEYBOARD_SET_INDICATORS \ + CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0002, METHOD_BUFFERED, FILE_ANY_ACCESS) + + +DEFINE_GUID(GUID_DEVINTERFACE_KEYBOARD, \ + 0x884b96c3, 0x56ef, 0x11d1, 0xbc, 0x8c, 0x00, 0xa0, 0xc9, 0x14, 0x05, 0xdd); + +#define KEYBOARD_ERROR_VALUE_BASE 10000 + +/* KEYBOARD_INPUT_DATA.MakeCode constants */ +#define KEYBOARD_OVERRUN_MAKE_CODE 0xFF + +/* KEYBOARD_INPUT_DATA.Flags constants */ +#define KEY_MAKE 0 +#define KEY_BREAK 1 +#define KEY_E0 2 +#define KEY_E1 4 + +typedef struct _KEYBOARD_INPUT_DATA { + USHORT UnitId; + USHORT MakeCode; + USHORT Flags; + USHORT Reserved; + ULONG ExtraInformation; +} KEYBOARD_INPUT_DATA, *PKEYBOARD_INPUT_DATA; + + +typedef struct _KEYBOARD_TYPEMATIC_PARAMETERS { + USHORT UnitId; + USHORT Rate; + USHORT Delay; +} KEYBOARD_TYPEMATIC_PARAMETERS, *PKEYBOARD_TYPEMATIC_PARAMETERS; + +typedef struct _KEYBOARD_ID { + UCHAR Type; + UCHAR Subtype; +} KEYBOARD_ID, *PKEYBOARD_ID; + +#define ENHANCED_KEYBOARD(Id) ((Id).Type == 2 || (Id).Type == 4 || FAREAST_KEYBOARD(Id)) +#define FAREAST_KEYBOARD(Id) ((Id).Type == 7 || (Id).Type == 8) + +typedef struct _KEYBOARD_INDICATOR_PARAMETERS { + USHORT UnitId; + USHORT LedFlags; +} KEYBOARD_INDICATOR_PARAMETERS, *PKEYBOARD_INDICATOR_PARAMETERS; + +typedef struct _INDICATOR_LIST { + USHORT MakeCode; + USHORT IndicatorFlags; +} INDICATOR_LIST, *PINDICATOR_LIST; + +typedef struct _KEYBOARD_INDICATOR_TRANSLATION { + USHORT NumberOfIndicatorKeys; + INDICATOR_LIST IndicatorList[1]; +} KEYBOARD_INDICATOR_TRANSLATION, *PKEYBOARD_INDICATOR_TRANSLATION; + +typedef struct _KEYBOARD_ATTRIBUTES { + KEYBOARD_ID KeyboardIdentifier; + USHORT KeyboardMode; + USHORT NumberOfFunctionKeys; + USHORT NumberOfIndicators; + USHORT NumberOfKeysTotal; + ULONG InputDataQueueLength; + KEYBOARD_TYPEMATIC_PARAMETERS KeyRepeatMinimum; + KEYBOARD_TYPEMATIC_PARAMETERS KeyRepeatMaximum; +} KEYBOARD_ATTRIBUTES, *PKEYBOARD_ATTRIBUTES; + +typedef struct _KEYBOARD_UNIT_ID_PARAMETER { + USHORT UnitId; +} KEYBOARD_UNIT_ID_PARAMETER, *PKEYBOARD_UNIT_ID_PARAMETER; + +typedef struct _KEYBOARD_IME_STATUS { + USHORT UnitId; + ULONG ImeOpen; + ULONG ImeConvMode; +} KEYBOARD_IME_STATUS, *PKEYBOARD_IME_STATUS; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __NTDDKBD_H */ diff --git a/reactos/w32api/include/ddk/ntddmou.h b/reactos/w32api/include/ddk/ntddmou.h new file mode 100644 index 00000000000..457b9d96e9e --- /dev/null +++ b/reactos/w32api/include/ddk/ntddmou.h @@ -0,0 +1,120 @@ +/* + * ntddmou.h + * + * Mouse device IOCTL interface. + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __NTDDMOU_H +#define __NTDDMOU_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + + +#define DD_MOUSE_DEVICE_NAME "\\Device\\PointerClass" +#define DD_MOUSE_DEVICE_NAME_U L"\\Device\\PointerClass" + +#define IOCTL_MOUSE_QUERY_ATTRIBUTES \ + CTL_CODE(FILE_DEVICE_MOUSE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS) + +DEFINE_GUID(GUID_DEVINTERFACE_MOUSE, \ + 0x378de44c, 0x56ef, 0x11d1, 0xbc, 0x8c, 0x00, 0xa0, 0xc9, 0x14, 0x05, 0xdd); + +#define MOUSE_ERROR_VALUE_BASE 20000 + +/* MOUSE_INPUT_DATA.ButtonFlags constants */ +#define MOUSE_LEFT_BUTTON_DOWN 0x0001 +#define MOUSE_LEFT_BUTTON_UP 0x0002 +#define MOUSE_RIGHT_BUTTON_DOWN 0x0004 +#define MOUSE_RIGHT_BUTTON_UP 0x0008 +#define MOUSE_MIDDLE_BUTTON_DOWN 0x0010 +#define MOUSE_MIDDLE_BUTTON_UP 0x0020 +#define MOUSE_BUTTON_4_DOWN 0x0040 +#define MOUSE_BUTTON_4_UP 0x0080 +#define MOUSE_BUTTON_5_DOWN 0x0100 +#define MOUSE_BUTTON_5_UP 0x0200 +#define MOUSE_WHEEL 0x0400 + +#define MOUSE_BUTTON_1_DOWN MOUSE_LEFT_BUTTON_DOWN +#define MOUSE_BUTTON_1_UP MOUSE_LEFT_BUTTON_UP +#define MOUSE_BUTTON_2_DOWN MOUSE_RIGHT_BUTTON_DOWN +#define MOUSE_BUTTON_2_UP MOUSE_RIGHT_BUTTON_UP +#define MOUSE_BUTTON_3_DOWN MOUSE_MIDDLE_BUTTON_DOWN +#define MOUSE_BUTTON_3_UP MOUSE_MIDDLE_BUTTON_UP + +/* MOUSE_INPUT_DATA.Flags constants */ +#define MOUSE_MOVE_RELATIVE 0 +#define MOUSE_MOVE_ABSOLUTE 1 +#define MOUSE_VIRTUAL_DESKTOP 0x02 +#define MOUSE_ATTRIBUTES_CHANGED 0x04 + +typedef struct _MOUSE_INPUT_DATA { + USHORT UnitId; + USHORT Flags; + _ANONYMOUS_UNION union { + ULONG Buttons; + _ANONYMOUS_STRUCT struct { + USHORT ButtonFlags; + USHORT ButtonData; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; + ULONG RawButtons; + LONG LastX; + LONG LastY; + ULONG ExtraInformation; +} MOUSE_INPUT_DATA, *PMOUSE_INPUT_DATA; + +typedef struct _MOUSE_UNIT_ID_PARAMETER { + USHORT UnitId; +} MOUSE_UNIT_ID_PARAMETER, *PMOUSE_UNIT_ID_PARAMETER; + +/* MOUSE_ATTRIBUTES.MouseIdentifier constants */ +#define MOUSE_INPORT_HARDWARE 0x0001 +#define MOUSE_I8042_HARDWARE 0x0002 +#define MOUSE_SERIAL_HARDWARE 0x0004 +#define BALLPOINT_I8042_HARDWARE 0x0008 +#define BALLPOINT_SERIAL_HARDWARE 0x0010 +#define WHEELMOUSE_I8042_HARDWARE 0x0020 +#define WHEELMOUSE_SERIAL_HARDWARE 0x0040 +#define MOUSE_HID_HARDWARE 0x0080 +#define WHEELMOUSE_HID_HARDWARE 0x0100 + +typedef struct _MOUSE_ATTRIBUTES { + USHORT MouseIdentifier; + USHORT NumberOfButtons; + USHORT SampleRate; + ULONG InputDataQueueLength; +} MOUSE_ATTRIBUTES, *PMOUSE_ATTRIBUTES; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __NTDDMOU_H */ diff --git a/reactos/w32api/include/ddk/ntddndis.h b/reactos/w32api/include/ddk/ntddndis.h new file mode 100644 index 00000000000..06b2cd04540 --- /dev/null +++ b/reactos/w32api/include/ddk/ntddndis.h @@ -0,0 +1,188 @@ +/* + * ntddndis.h + * + * NDIS device driver interface + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __NTDDNDIS_H +#define __NTDDNDIS_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum _NDIS_WAN_QUALITY { + NdisWanRaw, + NdisWanErrorControl, + NdisWanReliable +} NDIS_WAN_QUALITY, *PNDIS_WAN_QUALITY; + +typedef enum _NDIS_DEVICE_POWER_STATE { + NdisDeviceStateUnspecified = 0, + NdisDeviceStateD0, + NdisDeviceStateD1, + NdisDeviceStateD2, + NdisDeviceStateD3, + NdisDeviceStateMaximum +} NDIS_DEVICE_POWER_STATE, *PNDIS_DEVICE_POWER_STATE; + +typedef struct _NDIS_PM_WAKE_UP_CAPABILITIES { + NDIS_DEVICE_POWER_STATE MinMagicPacketWakeUp; + NDIS_DEVICE_POWER_STATE MinPatternWakeUp; + NDIS_DEVICE_POWER_STATE MinLinkChangeWakeUp; +} NDIS_PM_WAKE_UP_CAPABILITIES, *PNDIS_PM_WAKE_UP_CAPABILITIES; + +/* NDIS_PNP_CAPABILITIES.Flags constants */ +#define NDIS_DEVICE_WAKE_UP_ENABLE 0x00000001 +#define NDIS_DEVICE_WAKE_ON_PATTERN_MATCH_ENABLE 0x00000002 +#define NDIS_DEVICE_WAKE_ON_MAGIC_PACKET_ENABLE 0x00000004 + +typedef struct _NDIS_PNP_CAPABILITIES { + ULONG Flags; + NDIS_PM_WAKE_UP_CAPABILITIES WakeUpCapabilities; +} NDIS_PNP_CAPABILITIES, *PNDIS_PNP_CAPABILITIES; + +/* Required Object IDs (OIDs) */ +#define OID_GEN_SUPPORTED_LIST 0x00010101 +#define OID_GEN_HARDWARE_STATUS 0x00010102 +#define OID_GEN_MEDIA_SUPPORTED 0x00010103 +#define OID_GEN_MEDIA_IN_USE 0x00010104 +#define OID_GEN_MAXIMUM_LOOKAHEAD 0x00010105 +#define OID_GEN_MAXIMUM_FRAME_SIZE 0x00010106 +#define OID_GEN_LINK_SPEED 0x00010107 +#define OID_GEN_TRANSMIT_BUFFER_SPACE 0x00010108 +#define OID_GEN_RECEIVE_BUFFER_SPACE 0x00010109 +#define OID_GEN_TRANSMIT_BLOCK_SIZE 0x0001010A +#define OID_GEN_RECEIVE_BLOCK_SIZE 0x0001010B +#define OID_GEN_VENDOR_ID 0x0001010C +#define OID_GEN_VENDOR_DESCRIPTION 0x0001010D +#define OID_GEN_CURRENT_PACKET_FILTER 0x0001010E +#define OID_GEN_CURRENT_LOOKAHEAD 0x0001010F +#define OID_GEN_DRIVER_VERSION 0x00010110 +#define OID_GEN_MAXIMUM_TOTAL_SIZE 0x00010111 +#define OID_GEN_PROTOCOL_OPTIONS 0x00010112 +#define OID_GEN_MAC_OPTIONS 0x00010113 +#define OID_GEN_MEDIA_CONNECT_STATUS 0x00010114 +#define OID_GEN_MAXIMUM_SEND_PACKETS 0x00010115 +#define OID_GEN_VENDOR_DRIVER_VERSION 0x00010116 +#define OID_GEN_SUPPORTED_GUIDS 0x00010117 +#define OID_GEN_NETWORK_LAYER_ADDRESSES 0x00010118 +#define OID_GEN_TRANSPORT_HEADER_OFFSET 0x00010119 +#define OID_GEN_MACHINE_NAME 0x0001021A +#define OID_GEN_RNDIS_CONFIG_PARAMETER 0x0001021B +#define OID_GEN_VLAN_ID 0x0001021C + +/* Optional OIDs */ +#define OID_GEN_MEDIA_CAPABILITIES 0x00010201 +#define OID_GEN_PHYSICAL_MEDIUM 0x00010202 + +/* Required statistics OIDs */ +#define OID_GEN_XMIT_OK 0x00020101 +#define OID_GEN_RCV_OK 0x00020102 +#define OID_GEN_XMIT_ERROR 0x00020103 +#define OID_GEN_RCV_ERROR 0x00020104 +#define OID_GEN_RCV_NO_BUFFER 0x00020105 + +/* Optional statistics OIDs */ +#define OID_GEN_DIRECTED_BYTES_XMIT 0x00020201 +#define OID_GEN_DIRECTED_FRAMES_XMIT 0x00020202 +#define OID_GEN_MULTICAST_BYTES_XMIT 0x00020203 +#define OID_GEN_MULTICAST_FRAMES_XMIT 0x00020204 +#define OID_GEN_BROADCAST_BYTES_XMIT 0x00020205 +#define OID_GEN_BROADCAST_FRAMES_XMIT 0x00020206 +#define OID_GEN_DIRECTED_BYTES_RCV 0x00020207 +#define OID_GEN_DIRECTED_FRAMES_RCV 0x00020208 +#define OID_GEN_MULTICAST_BYTES_RCV 0x00020209 +#define OID_GEN_MULTICAST_FRAMES_RCV 0x0002020A +#define OID_GEN_BROADCAST_BYTES_RCV 0x0002020B +#define OID_GEN_BROADCAST_FRAMES_RCV 0x0002020C +#define OID_GEN_RCV_CRC_ERROR 0x0002020D +#define OID_GEN_TRANSMIT_QUEUE_LENGTH 0x0002020E +#define OID_GEN_GET_TIME_CAPS 0x0002020F +#define OID_GEN_GET_NETCARD_TIME 0x00020210 +#define OID_GEN_NETCARD_LOAD 0x00020211 +#define OID_GEN_DEVICE_PROFILE 0x00020212 +#define OID_GEN_INIT_TIME_MS 0x00020213 +#define OID_GEN_RESET_COUNTS 0x00020214 +#define OID_GEN_MEDIA_SENSE_COUNTS 0x00020215 +#define OID_GEN_FRIENDLY_NAME 0x00020216 +#define OID_GEN_MINIPORT_INFO 0x00020217 +#define OID_GEN_RESET_VERIFY_PARAMETERS 0x00020218 + +/* IEEE 802.3 (Ethernet) OIDs */ +#define NDIS_802_3_MAC_OPTION_PRIORITY 0x00000001 + +#define OID_802_3_PERMANENT_ADDRESS 0x01010101 +#define OID_802_3_CURRENT_ADDRESS 0x01010102 +#define OID_802_3_MULTICAST_LIST 0x01010103 +#define OID_802_3_MAXIMUM_LIST_SIZE 0x01010104 +#define OID_802_3_MAC_OPTIONS 0x01010105 +#define OID_802_3_RCV_ERROR_ALIGNMENT 0x01020101 +#define OID_802_3_XMIT_ONE_COLLISION 0x01020102 +#define OID_802_3_XMIT_MORE_COLLISIONS 0x01020103 +#define OID_802_3_XMIT_DEFERRED 0x01020201 +#define OID_802_3_XMIT_MAX_COLLISIONS 0x01020202 +#define OID_802_3_RCV_OVERRUN 0x01020203 +#define OID_802_3_XMIT_UNDERRUN 0x01020204 +#define OID_802_3_XMIT_HEARTBEAT_FAILURE 0x01020205 +#define OID_802_3_XMIT_TIMES_CRS_LOST 0x01020206 +#define OID_802_3_XMIT_LATE_COLLISIONS 0x01020207 + +/* OID_GEN_MINIPORT_INFO constants */ +#define NDIS_MINIPORT_BUS_MASTER 0x00000001 +#define NDIS_MINIPORT_WDM_DRIVER 0x00000002 +#define NDIS_MINIPORT_SG_LIST 0x00000004 +#define NDIS_MINIPORT_SUPPORTS_MEDIA_QUERY 0x00000008 +#define NDIS_MINIPORT_INDICATES_PACKETS 0x00000010 +#define NDIS_MINIPORT_IGNORE_PACKET_QUEUE 0x00000020 +#define NDIS_MINIPORT_IGNORE_REQUEST_QUEUE 0x00000040 +#define NDIS_MINIPORT_IGNORE_TOKEN_RING_ERRORS 0x00000080 +#define NDIS_MINIPORT_INTERMEDIATE_DRIVER 0x00000100 +#define NDIS_MINIPORT_IS_NDIS_5 0x00000200 +#define NDIS_MINIPORT_IS_CO 0x00000400 +#define NDIS_MINIPORT_DESERIALIZE 0x00000800 +#define NDIS_MINIPORT_REQUIRES_MEDIA_POLLING 0x00001000 +#define NDIS_MINIPORT_SUPPORTS_MEDIA_SENSE 0x00002000 +#define NDIS_MINIPORT_NETBOOT_CARD 0x00004000 +#define NDIS_MINIPORT_PM_SUPPORTED 0x00008000 +#define NDIS_MINIPORT_SUPPORTS_MAC_ADDRESS_OVERWRITE 0x00010000 +#define NDIS_MINIPORT_USES_SAFE_BUFFER_APIS 0x00020000 +#define NDIS_MINIPORT_HIDDEN 0x00040000 +#define NDIS_MINIPORT_SWENUM 0x00080000 +#define NDIS_MINIPORT_SURPRISE_REMOVE_OK 0x00100000 +#define NDIS_MINIPORT_NO_HALT_ON_SUSPEND 0x00200000 +#define NDIS_MINIPORT_HARDWARE_DEVICE 0x00400000 +#define NDIS_MINIPORT_SUPPORTS_CANCEL_SEND_PACKETS 0x00800000 +#define NDIS_MINIPORT_64BITS_DMA 0x01000000 + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __NTDDNDIS_H */ diff --git a/reactos/w32api/include/ddk/ntddpar.h b/reactos/w32api/include/ddk/ntddpar.h new file mode 100644 index 00000000000..2f88c39c432 --- /dev/null +++ b/reactos/w32api/include/ddk/ntddpar.h @@ -0,0 +1,124 @@ +/* + * ntddpar.h + * + * Parallel port driver interface + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __NTDDPAR_H +#define __NTDDPAR_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + + +/* Parallel port device GUIDs */ + +DEFINE_GUID (GUID_DEVINTERFACE_PARALLEL, + 0x97F76EF0, 0xF883, 0x11D0, 0xAF, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x84, 0x5C); +DEFINE_GUID (GUID_DEVINTERFACE_PARCLASS, + 0x811FC6A5, 0xF728, 0x11D0, 0xA5, 0x37, 0x00, 0x00, 0xF8, 0x75, 0x3E, 0xD1); + +#define GUID_PARALLEL_DEVICE GUID_DEVINTERFACE_PARALLEL +#define GUID_PARCLASS_DEVICE GUID_DEVINTERFACE_PARCLASS + + +#define IOCTL_IEEE1284_GET_MODE \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 5, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_IEEE1284_NEGOTIATE \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 6, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_PAR_GET_DEFAULT_MODES \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 10, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_PAR_GET_DEVICE_CAPS \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 9, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_PAR_IS_PORT_FREE \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 21, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_PAR_QUERY_DEVICE_ID \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 3, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_PAR_QUERY_DEVICE_ID_SIZE \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 4, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_PAR_QUERY_INFORMATION \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 1, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_PAR_QUERY_LOCATION \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 22, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_PAR_QUERY_RAW_DEVICE_ID \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 12, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_PAR_SET_INFORMATION \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 2, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_PAR_SET_READ_ADDRESS \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 8, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_PAR_SET_WRITE_ADDRESS \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 7, METHOD_BUFFERED, FILE_ANY_ACCESS) + +typedef struct _PAR_DEVICE_ID_SIZE_INFORMATION { + ULONG DeviceIdSize; +} PAR_DEVICE_ID_SIZE_INFORMATION, *PPAR_DEVICE_ID_SIZE_INFORMATION; + +#define PARALLEL_INIT 0x01 +#define PARALLEL_AUTOFEED 0x02 +#define PARALLEL_PAPER_EMPTY 0x04 +#define PARALLEL_OFF_LINE 0x08 +#define PARALLEL_POWER_OFF 0x10 +#define PARALLEL_NOT_CONNECTED 0x20 +#define PARALLEL_BUSY 0x40 +#define PARALLEL_SELECTED 0x80 + +typedef struct _PAR_QUERY_INFORMATION { + UCHAR Status; +} PAR_QUERY_INFORMATION, *PPAR_QUERY_INFORMATION; + +typedef struct _PAR_SET_INFORMATION { + UCHAR Init; +} PAR_SET_INFORMATION, *PPAR_SET_INFORMATION; + +typedef struct _PARCLASS_NEGOTIATION_MASK { + USHORT usReadMask; + USHORT usWriteMask; +} PARCLASS_NEGOTIATION_MASK, *PPARCLASS_NEGOTIATION_MASK; + +#define NONE 0x0000 +#define CENTRONICS 0x0001 +#define IEEE_COMPATIBILITY 0x0002 +#define NIBBLE 0x0004 +#define CHANNEL_NIBBLE 0x0008 +#define BYTE_BIDIR 0x0010 +#define EPP_HW 0x0020 +#define EPP_SW 0x0040 +#define EPP_ANY 0x0060 +#define BOUNDED_ECP 0x0080 +#define ECP_HW_NOIRQ 0x0100 +#define ECP_HW_IRQ 0x0200 +#define ECP_SW 0x0400 +#define ECP_ANY 0x0780 + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __NTDDPAR_H */ diff --git a/reactos/w32api/include/ddk/ntddpcm.h b/reactos/w32api/include/ddk/ntddpcm.h new file mode 100644 index 00000000000..f16e33d3507 --- /dev/null +++ b/reactos/w32api/include/ddk/ntddpcm.h @@ -0,0 +1,170 @@ +/* + * ntddpcm.h + * + * PCMCIA IOCTL interface + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __NTDDPCM_H +#define __NTDDPCM_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + + +#define IOCTL_PCMCIA_BASE FILE_DEVICE_CONTROLLER + +#define DD_PCMCIA_DEVICE_NAME "\\\\.\\Pcmcia" +#define DD_PCMCIA_DEVICE_NAME_U L"\\\\.\\Pcmcia" + +#define IOCTL_GET_TUPLE_DATA \ + CTL_CODE(IOCTL_PCMCIA_BASE, 3000, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_SOCKET_INFORMATION \ + CTL_CODE(IOCTL_PCMCIA_BASE, 3004, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define DEVICE_IDENTIFIER_LENGTH 64 +#define DRIVER_NAME_LENGTH 32 +#define MANUFACTURER_NAME_LENGTH 64 + +#define PcmciaInvalidControllerType 0xffffffff + +typedef struct _TUPLE_REQUEST { + USHORT Socket; +} TUPLE_REQUEST, *PTUPLE_REQUEST; + +typedef enum _PCMCIA_CONTROLLER_CLASS { + PcmciaInvalidControllerClass = -1, + PcmciaIntelCompatible, + PcmciaCardBusCompatible, + PcmciaElcController, + PcmciaDatabook, + PcmciaPciPcmciaBridge, + PcmciaCirrusLogic, + PcmciaTI, + PcmciaTopic, + PcmciaRicoh, + PcmciaDatabookCB, + PcmciaOpti, + PcmciaTrid, + PcmciaO2Micro, + PcmciaNEC, + PcmciaNEC_98 +} PCMCIA_CONTROLLER_CLASS, *PPCMCIA_CONTROLLER_CLASS; + +typedef struct _PCMCIA_SOCKET_INFORMATION { + USHORT Socket; + USHORT TupleCrc; + UCHAR Manufacturer[MANUFACTURER_NAME_LENGTH]; + UCHAR Identifier[DEVICE_IDENTIFIER_LENGTH]; + UCHAR DriverName[DRIVER_NAME_LENGTH]; + UCHAR DeviceFunctionId; + UCHAR Reserved; + UCHAR CardInSocket; + UCHAR CardEnabled; + ULONG ControllerType; +} PCMCIA_SOCKET_INFORMATION, *PPCMCIA_SOCKET_INFORMATION; + +#define PcmciaClassFromControllerType(type) ((PCMCIA_CONTROLLER_CLASS)((type) & 0xff)) +#define PcmciaModelFromControllerType(type) (((type) >> 8) & 0x3ffff) +#define PcmciaRevisionFromControllerType(type) ((type) >> 26) + + +DEFINE_GUID(GUID_PCMCIA_INTERFACE_STANDARD, \ + 0xbed5dadfL, 0x38fb, 0x11d1, 0x94, 0x62, 0x00, 0xc0, 0x4f, 0xb9, 0x60, 0xee); + +typedef ULONG MEMORY_SPACE; + +typedef ULONG STDCALL +(*PPCMCIA_READ_WRITE_CONFIG)( + IN PVOID Context, + IN ULONG WhichSpace, + IN PUCHAR Buffer, + IN ULONG Offset, + IN ULONG Length); + +#define PCCARD_PCI_CONFIGURATION_SPACE 0 +#define PCCARD_ATTRIBUTE_MEMORY 1 +#define PCCARD_COMMON_MEMORY 2 +#define PCCARD_ATTRIBUTE_MEMORY_INDIRECT 3 +#define PCCARD_COMMON_MEMORY_INDIRECT 4 + +typedef struct _PCMCIA_BUS_INTERFACE_STANDARD { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PPCMCIA_READ_WRITE_CONFIG ReadConfig; + PPCMCIA_READ_WRITE_CONFIG WriteConfig; +} PCMCIA_BUS_INTERFACE_STANDARD, *PPCMCIA_BUS_INTERFACE_STANDARD; + +#define PCMCIA_MEMORY_8BIT_ACCESS 0 +#define PCMCIA_MEMORY_16BIT_ACCESS 1 + +typedef BOOLEAN STDCALL +(*PPCMCIA_MODIFY_MEMORY_WINDOW)( + IN PVOID Context, + IN ULONGLONG HostBase, + IN ULONGLONG CardBase, + IN BOOLEAN Enable, + IN ULONG WindowSize OPTIONAL, + IN UCHAR AccessSpeed OPTIONAL, + IN UCHAR BusWidth OPTIONAL, + IN BOOLEAN IsAttributeMemory OPTIONAL); + +#define PCMCIA_VPP_0V 0 +#define PCMCIA_VPP_12V 1 +#define PCMCIA_VPP_IS_VCC 2 + +typedef BOOLEAN STDCALL +(*PPCMCIA_SET_VPP)( + IN PVOID Context, + IN UCHAR VppLevel); + +typedef BOOLEAN STDCALL +(*PPCMCIA_IS_WRITE_PROTECTED)( + IN PVOID Context); + +typedef struct _PCMCIA_INTERFACE_STANDARD { + USHORT Size; + USHORT Version; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PVOID Context; + PPCMCIA_MODIFY_MEMORY_WINDOW ModifyMemoryWindow; + PPCMCIA_SET_VPP SetVpp; + PPCMCIA_IS_WRITE_PROTECTED IsWriteProtected; +} PCMCIA_INTERFACE_STANDARD, *PPCMCIA_INTERFACE_STANDARD; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __NTDDPCM_H */ diff --git a/reactos/w32api/include/ddk/ntddscsi.h b/reactos/w32api/include/ddk/ntddscsi.h new file mode 100644 index 00000000000..c580ae3c60a --- /dev/null +++ b/reactos/w32api/include/ddk/ntddscsi.h @@ -0,0 +1,176 @@ +/* + * ntddscsi.h + * + * SCSI port IOCTL interface. + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __NTDDSCSI_H +#define __NTDDSCSI_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + + +#define DD_SCSI_DEVICE_NAME "\\Device\\ScsiPort" +#define DD_SCSI_DEVICE_NAME_U L"\\Device\\ScsiPort" + +#define IOCTL_SCSI_BASE FILE_DEVICE_CONTROLLER + +#define IOCTL_SCSI_GET_INQUIRY_DATA \ + CTL_CODE(IOCTL_SCSI_BASE, 0x0403, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_SCSI_GET_CAPABILITIES \ + CTL_CODE(IOCTL_SCSI_BASE, 0x0404, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_SCSI_GET_ADDRESS \ + CTL_CODE(IOCTL_SCSI_BASE, 0x0406, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_SCSI_MINIPORT \ + CTL_CODE(IOCTL_SCSI_BASE, 0x0402, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_SCSI_PASS_THROUGH \ + CTL_CODE(IOCTL_SCSI_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_SCSI_PASS_THROUGH_DIRECT \ + CTL_CODE(IOCTL_SCSI_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_SCSI_RESCAN_BUS \ + CTL_CODE(IOCTL_SCSI_BASE, 0x0407, METHOD_BUFFERED, FILE_ANY_ACCESS) + + +DEFINE_GUID(ScsiRawInterfaceGuid, \ + 0x53f56309L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); + +DEFINE_GUID(WmiScsiAddressGuid, \ + 0x53f5630fL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); + +typedef struct _SCSI_PASS_THROUGH { + USHORT Length; + UCHAR ScsiStatus; + UCHAR PathId; + UCHAR TargetId; + UCHAR Lun; + UCHAR CdbLength; + UCHAR SenseInfoLength; + UCHAR DataIn; + ULONG DataTransferLength; + ULONG TimeOutValue; + ULONG_PTR DataBufferOffset; + ULONG SenseInfoOffset; + UCHAR Cdb[16]; +} SCSI_PASS_THROUGH, *PSCSI_PASS_THROUGH; + +typedef struct _SCSI_PASS_THROUGH_DIRECT { + USHORT Length; + UCHAR ScsiStatus; + UCHAR PathId; + UCHAR TargetId; + UCHAR Lun; + UCHAR CdbLength; + UCHAR SenseInfoLength; + UCHAR DataIn; + ULONG DataTransferLength; + ULONG TimeOutValue; + PVOID DataBuffer; + ULONG SenseInfoOffset; + 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 _SCSI_ADDRESS { + 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; +}SCSI_BUS_DATA, *PSCSI_BUS_DATA; + +typedef struct _SCSI_ADAPTER_BUS_INFO { + 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; +} 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]; +} SCSI_INQUIRY_DATA, *PSCSI_INQUIRY_DATA; + +#define SCSI_IOCTL_DATA_OUT 0 +#define SCSI_IOCTL_DATA_IN 1 +#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; +} DUMP_POINTERS, *PDUMP_POINTERS; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __NTDDSCSI_H */ diff --git a/reactos/w32api/include/ddk/ntddser.h b/reactos/w32api/include/ddk/ntddser.h new file mode 100644 index 00000000000..1a3fb1c092c --- /dev/null +++ b/reactos/w32api/include/ddk/ntddser.h @@ -0,0 +1,454 @@ +/* + * ntddser.h + * + * Serial port driver interface + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __NTDDSER_H +#define __NTDDSER_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + + +/* GUIDs */ + +DEFINE_GUID(GUID_DEVINTERFACE_COMPORT, + 0x86e0d1e0L, 0x8089, 0x11d0, 0x9c, 0xe4, 0x08, 0x00, 0x3e, 0x30, 0x1f, 0x73); + +DEFINE_GUID(GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR, + 0x4D36E978L, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); + +#define IOCTL_SERIAL_CLEAR_STATS \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 36, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_CLR_DTR \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 10, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_CLR_RTS \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 13, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_CONFIG_SIZE \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 32, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_GET_BAUD_RATE \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 20, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_GET_CHARS \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 22, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_GET_COMMSTATUS \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 27, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_GET_DTRRTS \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 30, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_GET_HANDFLOW \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 24, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_GET_LINE_CONTROL \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 21, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_GET_MODEM_CONTROL \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 37, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_GET_MODEMSTATUS \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 26, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_GET_PROPERTIES \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 29, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_GET_STATS \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 35, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_GET_TIMEOUTS \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 8, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_GET_WAIT_MASK \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 16, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_IMMEDIATE_CHAR \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 6, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_LSRMST_INSERT \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 31, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_PURGE \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 19, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_RESET_DEVICE \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 11, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_SET_BAUD_RATE \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 1, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_SET_BREAK_ON \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 4, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_SET_BREAK_OFF \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 5, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_SET_CHARS \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 23, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_SET_DTR \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 9, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_SET_FIFO_CONTROL \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 39, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_SET_HANDFLOW \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 25, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_SET_LINE_CONTROL \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 3, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_SET_MODEM_CONTROL \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 38, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_SET_QUEUE_SIZE \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 2, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_SET_RTS \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 12, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_SET_TIMEOUTS \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 7, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_SET_WAIT_MASK \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 17, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_SET_XOFF \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 14, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_SET_XON \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 15, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_WAIT_ON_MASK \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 18, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_XOFF_COUNTER \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 28, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_SERIAL_INTERNAL_BASIC_SETTINGS \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 3, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_INTERNAL_CANCEL_WAIT_WAKE \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 2, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_INTERNAL_DO_WAIT_WAKE \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 1, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERIAL_INTERNAL_RESTORE_SETTINGS \ + CTL_CODE (FILE_DEVICE_SERIAL_PORT, 4, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_SERENUM_PORT_DESC \ + CTL_CODE (FILE_DEVICE_SERENUM, 130, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SERENUM_GET_PORT_NAME \ + CTL_CODE (FILE_DEVICE_SERENUM, 131, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_SERENUM_REMOVE_SELF \ + CTL_CODE (FILE_DEVICE_SERENUM, 129, METHOD_NEITHER, FILE_ANY_ACCESS) + + +typedef struct _SERIAL_BAUD_RATE { + ULONG BaudRate; +} SERIAL_BAUD_RATE, *PSERIAL_BAUD_RATE; + +/* SERIAL_BAUD_RATE.BaudRate constants */ +#define SERIAL_BAUD_075 0x00000001 +#define SERIAL_BAUD_110 0x00000002 +#define SERIAL_BAUD_134_5 0x00000004 +#define SERIAL_BAUD_150 0x00000008 +#define SERIAL_BAUD_300 0x00000010 +#define SERIAL_BAUD_600 0x00000020 +#define SERIAL_BAUD_1200 0x00000040 +#define SERIAL_BAUD_1800 0x00000080 +#define SERIAL_BAUD_2400 0x00000100 +#define SERIAL_BAUD_4800 0x00000200 +#define SERIAL_BAUD_7200 0x00000400 +#define SERIAL_BAUD_9600 0x00000800 +#define SERIAL_BAUD_14400 0x00001000 +#define SERIAL_BAUD_19200 0x00002000 +#define SERIAL_BAUD_38400 0x00004000 +#define SERIAL_BAUD_56K 0x00008000 +#define SERIAL_BAUD_128K 0x00010000 +#define SERIAL_BAUD_115200 0x00020000 +#define SERIAL_BAUD_57600 0x00040000 +#define SERIAL_BAUD_USER 0x10000000 + +typedef struct _SERIAL_CHARS { + UCHAR EofChar; + UCHAR ErrorChar; + UCHAR BreakChar; + UCHAR EventChar; + UCHAR XonChar; + UCHAR XoffChar; +} SERIAL_CHARS, *PSERIAL_CHARS; + +typedef struct _SERIAL_STATUS { + ULONG Errors; + ULONG HoldReasons; + ULONG AmountInInQueue; + ULONG AmountInOutQueue; + BOOLEAN EofReceived; + BOOLEAN WaitForImmediate; +} SERIAL_STATUS, *PSERIAL_STATUS; + +typedef struct _SERIAL_HANDFLOW { + ULONG ControlHandShake; + ULONG FlowReplace; + LONG XonLimit; + LONG XoffLimit; +} SERIAL_HANDFLOW, *PSERIAL_HANDFLOW; + +#define SERIAL_DTR_MASK 0x00000003 +#define SERIAL_DTR_CONTROL 0x00000001 +#define SERIAL_DTR_HANDSHAKE 0x00000002 +#define SERIAL_CTS_HANDSHAKE 0x00000008 +#define SERIAL_DSR_HANDSHAKE 0x00000010 +#define SERIAL_DCD_HANDSHAKE 0x00000020 +#define SERIAL_OUT_HANDSHAKEMASK 0x00000038 +#define SERIAL_DSR_SENSITIVITY 0x00000040 +#define SERIAL_ERROR_ABORT 0x80000000 +#define SERIAL_CONTROL_INVALID 0x7fffff84 +#define SERIAL_AUTO_TRANSMIT 0x00000001 +#define SERIAL_AUTO_RECEIVE 0x00000002 +#define SERIAL_ERROR_CHAR 0x00000004 +#define SERIAL_NULL_STRIPPING 0x00000008 +#define SERIAL_BREAK_CHAR 0x00000010 +#define SERIAL_RTS_MASK 0x000000c0 +#define SERIAL_RTS_CONTROL 0x00000040 +#define SERIAL_RTS_HANDSHAKE 0x00000080 +#define SERIAL_TRANSMIT_TOGGLE 0x000000c0 +#define SERIAL_XOFF_CONTINUE 0x80000000 +#define SERIAL_FLOW_INVALID 0x7fffff20 + +typedef struct _SERIAL_LINE_CONTROL { + UCHAR StopBits; + UCHAR Parity; + UCHAR WordLength; +} SERIAL_LINE_CONTROL, *PSERIAL_LINE_CONTROL; + +/* SERIAL_LINE_CONTROL.StopBits constants */ +#define STOP_BIT_1 0x00 +#define STOP_BITS_1_5 0x01 +#define STOP_BITS_2 0x02 + +/* SERIAL_LINE_CONTROL.Parity constants */ +#define NO_PARITY 0x00 +#define ODD_PARITY 0x01 +#define EVEN_PARITY 0x02 +#define MARK_PARITY 0x03 +#define SPACE_PARITY 0x04 + +/* IOCTL_SERIAL_(GET_MODEM_CONTROL, SET_MODEM_CONTROL) flags */ +#define SERIAL_IOC_MCR_DTR 0x00000001 +#define SERIAL_IOC_MCR_RTS 0x00000002 +#define SERIAL_IOC_MCR_OUT1 0x00000004 +#define SERIAL_IOC_MCR_OUT2 0x00000008 +#define SERIAL_IOC_MCR_LOOP 0x00000010 + +typedef struct _SERIAL_COMMPROP { + USHORT PacketLength; + USHORT PacketVersion; + ULONG ServiceMask; + ULONG Reserved1; + ULONG MaxTxQueue; + ULONG MaxRxQueue; + ULONG MaxBaud; + ULONG ProvSubType; + ULONG ProvCapabilities; + ULONG SettableParams; + ULONG SettableBaud; + USHORT SettableData; + USHORT SettableStopParity; + ULONG CurrentTxQueue; + ULONG CurrentRxQueue; + ULONG ProvSpec1; + ULONG ProvSpec2; + WCHAR ProvChar[1]; +} SERIAL_COMMPROP, *PSERIAL_COMMPROP; + +/* SERIAL_COMMPROP.SettableParams flags */ +#define SERIAL_SP_PARITY 0x0001 +#define SERIAL_SP_BAUD 0x0002 +#define SERIAL_SP_DATABITS 0x0004 +#define SERIAL_SP_STOPBITS 0x0008 +#define SERIAL_SP_HANDSHAKING 0x0010 +#define SERIAL_SP_PARITY_CHECK 0x0020 +#define SERIAL_SP_CARRIER_DETECT 0x0040 + +/* SERIAL_COMMPROP.ProvCapabilities flags */ +#define SERIAL_PCF_DTRDSR 0x00000001 +#define SERIAL_PCF_RTSCTS 0x00000002 +#define SERIAL_PCF_CD 0x00000004 +#define SERIAL_PCF_PARITY_CHECK 0x00000008 +#define SERIAL_PCF_XONXOFF 0x00000010 +#define SERIAL_PCF_SETXCHAR 0x00000020 +#define SERIAL_PCF_TOTALTIMEOUTS 0x00000040 +#define SERIAL_PCF_INTTIMEOUTS 0x00000080 +#define SERIAL_PCF_SPECIALCHARS 0x00000100 +#define SERIAL_PCF_16BITMODE 0x00000200 + +/* SERIAL_COMMPROP.SettableData flags */ +#define SERIAL_DATABITS_5 0x0001 +#define SERIAL_DATABITS_6 0x0002 +#define SERIAL_DATABITS_7 0x0004 +#define SERIAL_DATABITS_8 0x0008 +#define SERIAL_DATABITS_16 0x0010 +#define SERIAL_DATABITS_16X 0x0020 + +/* SERIAL_COMMPROP.SettableStopParity flags */ +#define SERIAL_STOPBITS_10 0x0001 +#define SERIAL_STOPBITS_15 0x0002 +#define SERIAL_STOPBITS_20 0x0004 +#define SERIAL_PARITY_NONE 0x0100 +#define SERIAL_PARITY_ODD 0x0200 +#define SERIAL_PARITY_EVEN 0x0400 +#define SERIAL_PARITY_MARK 0x0800 +#define SERIAL_PARITY_SPACE 0x1000 + +typedef struct _SERIALPERF_STATS { + ULONG ReceivedCount; + ULONG TransmittedCount; + ULONG FrameErrorCount; + ULONG SerialOverrunErrorCount; + ULONG BufferOverrunErrorCount; + ULONG ParityErrorCount; +} SERIALPERF_STATS, *PSERIALPERF_STATS; + +typedef struct _SERIAL_TIMEOUTS { + ULONG ReadIntervalTimeout; + ULONG ReadTotalTimeoutMultiplier; + ULONG ReadTotalTimeoutConstant; + ULONG WriteTotalTimeoutMultiplier; + ULONG WriteTotalTimeoutConstant; +} SERIAL_TIMEOUTS, *PSERIAL_TIMEOUTS; + +/* IOCTL_SERIAL_(GET_WAIT_MASK, SET_WAIT_MASK, WAIT_ON_MASK) flags */ +#define SERIAL_EV_RXCHAR 0x0001 +#define SERIAL_EV_RXFLAG 0x0002 +#define SERIAL_EV_TXEMPTY 0x0004 +#define SERIAL_EV_CTS 0x0008 +#define SERIAL_EV_DSR 0x0010 +#define SERIAL_EV_RLSD 0x0020 +#define SERIAL_EV_BREAK 0x0040 +#define SERIAL_EV_ERR 0x0080 +#define SERIAL_EV_RING 0x0100 +#define SERIAL_EV_PERR 0x0200 +#define SERIAL_EV_RX80FULL 0x0400 +#define SERIAL_EV_EVENT1 0x0800 +#define SERIAL_EV_EVENT2 0x1000 + +/* IOCTL_SERIAL_LSRMST_INSERT constants */ +#define SERIAL_LSRMST_LSR_DATA 0x01 +#define SERIAL_LSRMST_LSR_NODATA 0x02 +#define SERIAL_LSRMST_MST 0x03 +#define SERIAL_LSRMST_ESCAPE 0x00 + +/* IOCTL_SERIAL_PURGE constants */ +#define SERIAL_PURGE_TXABORT 0x00000001 +#define SERIAL_PURGE_RXABORT 0x00000002 +#define SERIAL_PURGE_TXCLEAR 0x00000004 +#define SERIAL_PURGE_RXCLEAR 0x00000008 + +/* IOCTL_SERIAL_SET_FIFO_CONTROL constants */ +#define SERIAL_IOC_FCR_FIFO_ENABLE 0x00000001 +#define SERIAL_IOC_FCR_RCVR_RESET 0x00000002 +#define SERIAL_IOC_FCR_XMIT_RESET 0x00000004 +#define SERIAL_IOC_FCR_DMA_MODE 0x00000008 +#define SERIAL_IOC_FCR_RES1 0x00000010 +#define SERIAL_IOC_FCR_RES2 0x00000020 +#define SERIAL_IOC_FCR_RCVR_TRIGGER_LSB 0x00000040 +#define SERIAL_IOC_FCR_RCVR_TRIGGER_MSB 0x00000080 + +typedef struct _SERIAL_QUEUE_SIZE { + ULONG InSize; + ULONG OutSize; +} SERIAL_QUEUE_SIZE, *PSERIAL_QUEUE_SIZE; + +typedef struct _SERIAL_XOFF_COUNTER { + ULONG Timeout; + LONG Counter; + UCHAR XoffChar; +} SERIAL_XOFF_COUNTER, *PSERIAL_XOFF_COUNTER; + +typedef struct _SERIAL_BASIC_SETTINGS { + SERIAL_TIMEOUTS Timeouts; + SERIAL_HANDFLOW HandFlow; + ULONG RxFifo; + ULONG TxFifo; +} SERIAL_BASIC_SETTINGS, *PSERIAL_BASIC_SETTINGS; + +typedef struct _SERENUM_PORT_DESC { + ULONG Size; + PVOID PortHandle; + PHYSICAL_ADDRESS PortAddress; + USHORT Reserved[1]; +} SERENUM_PORT_DESC, *PSERENUM_PORT_DESC; + +typedef UCHAR STDCALL +(*PSERENUM_READPORT)( + PVOID SerPortAddress); + +typedef VOID STDCALL +(*PSERENUM_WRITEPORT)( + PVOID SerPortAddress, + UCHAR Value); + +typedef enum _SERENUM_PORTION { + SerenumFirstHalf, + SerenumSecondHalf, + SerenumWhole +} SERENUM_PORTION; + +typedef struct _SERENUM_PORT_PARAMETERS { + ULONG Size; + PSERENUM_READPORT ReadAccessor; + PSERENUM_WRITEPORT WriteAccessor; + PVOID SerPortAddress; + PVOID HardwareHandle; + SERENUM_PORTION Portion; + USHORT NumberAxis; + USHORT Reserved[3]; +} SERENUM_PORT_PARAMETERS, *PSERENUM_PORT_PARAMETERS; + +#define SERIAL_ERROR_BREAK 0x00000001 +#define SERIAL_ERROR_FRAMING 0x00000002 +#define SERIAL_ERROR_OVERRUN 0x00000004 +#define SERIAL_ERROR_QUEUEOVERRUN 0x00000008 +#define SERIAL_ERROR_PARITY 0x00000010 + +#define SERIAL_SP_UNSPECIFIED 0x00000000 +#define SERIAL_SP_RS232 0x00000001 +#define SERIAL_SP_PARALLEL 0x00000002 +#define SERIAL_SP_RS422 0x00000003 +#define SERIAL_SP_RS423 0x00000004 +#define SERIAL_SP_RS449 0x00000005 +#define SERIAL_SP_MODEM 0X00000006 +#define SERIAL_SP_FAX 0x00000021 +#define SERIAL_SP_SCANNER 0x00000022 +#define SERIAL_SP_BRIDGE 0x00000100 +#define SERIAL_SP_LAT 0x00000101 +#define SERIAL_SP_TELNET 0x00000102 +#define SERIAL_SP_X25 0x00000103 +#define SERIAL_SP_SERIALCOMM 0x00000001 + +#define SERIAL_TX_WAITING_FOR_CTS 0x00000001 +#define SERIAL_TX_WAITING_FOR_DSR 0x00000002 +#define SERIAL_TX_WAITING_FOR_DCD 0x00000004 +#define SERIAL_TX_WAITING_FOR_XON 0x00000008 +#define SERIAL_TX_WAITING_XOFF_SENT 0x00000010 +#define SERIAL_TX_WAITING_ON_BREAK 0x00000020 +#define SERIAL_RX_WAITING_FOR_DSR 0x00000040 + +#define SERIAL_DTR_STATE 0x00000001 +#define SERIAL_RTS_STATE 0x00000002 +#define SERIAL_CTS_STATE 0x00000010 +#define SERIAL_DSR_STATE 0x00000020 +#define SERIAL_RI_STATE 0x00000040 +#define SERIAL_DCD_STATE 0x00000080 + +typedef struct _SERIALCONFIG { + ULONG Size; + USHORT Version; + ULONG SubType; + ULONG ProvOffset; + ULONG ProviderSize; + WCHAR ProviderData[1]; +} SERIALCONFIG,*PSERIALCONFIG; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __NTDDSER_H */ diff --git a/reactos/w32api/include/ddk/ntddstor.h b/reactos/w32api/include/ddk/ntddstor.h new file mode 100644 index 00000000000..6875cd190cc --- /dev/null +++ b/reactos/w32api/include/ddk/ntddstor.h @@ -0,0 +1,338 @@ +/* + * ntddstor.h + * + * Storage class IOCTL interface. + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __NTDDSTOR_H +#define __NTDDSTOR_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + + +#define IOCTL_STORAGE_BASE FILE_DEVICE_MASS_STORAGE + +#define IOCTL_STORAGE_CHECK_VERIFY \ + CTL_CODE(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_STORAGE_CHECK_VERIFY2 \ + CTL_CODE(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_STORAGE_EJECT_MEDIA \ + CTL_CODE(IOCTL_STORAGE_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_STORAGE_EJECTION_CONTROL \ + CTL_CODE(IOCTL_STORAGE_BASE, 0x0250, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_STORAGE_FIND_NEW_DEVICES \ + CTL_CODE(IOCTL_STORAGE_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_STORAGE_GET_DEVICE_NUMBER \ + CTL_CODE(IOCTL_STORAGE_BASE, 0x0420, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER \ + CTL_CODE(IOCTL_STORAGE_BASE, 0x0304, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_STORAGE_GET_MEDIA_TYPES \ + CTL_CODE(IOCTL_STORAGE_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_STORAGE_GET_MEDIA_TYPES_EX \ + CTL_CODE(IOCTL_STORAGE_BASE, 0x0301, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_STORAGE_LOAD_MEDIA \ + CTL_CODE(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_STORAGE_LOAD_MEDIA2 \ + CTL_CODE(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_STORAGE_MCN_CONTROL \ + CTL_CODE(IOCTL_STORAGE_BASE, 0x0251, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_STORAGE_MEDIA_REMOVAL \ + CTL_CODE(IOCTL_STORAGE_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_STORAGE_PREDICT_FAILURE \ + CTL_CODE(IOCTL_STORAGE_BASE, 0x0440, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_STORAGE_QUERY_PROPERTY \ + CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_STORAGE_RELEASE \ + CTL_CODE(IOCTL_STORAGE_BASE, 0x0205, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_STORAGE_RESERVE \ + CTL_CODE(IOCTL_STORAGE_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_STORAGE_RESET_BUS \ + CTL_CODE(IOCTL_STORAGE_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_STORAGE_RESET_DEVICE \ + CTL_CODE(IOCTL_STORAGE_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + + +DEFINE_GUID(GUID_DEVINTERFACE_DISK, + 0x53f56307L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); + +DEFINE_GUID(GUID_DEVINTERFACE_CDROM, + 0x53f56308L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); + +DEFINE_GUID(GUID_DEVINTERFACE_PARTITION, + 0x53f5630aL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); + +DEFINE_GUID(GUID_DEVINTERFACE_TAPE, + 0x53f5630bL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); + +DEFINE_GUID(GUID_DEVINTERFACE_WRITEONCEDISK, + 0x53f5630cL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); + +DEFINE_GUID(GUID_DEVINTERFACE_VOLUME, + 0x53f5630dL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); + +DEFINE_GUID(GUID_DEVINTERFACE_MEDIUMCHANGER, + 0x53f56310L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); + +DEFINE_GUID(GUID_DEVINTERFACE_FLOPPY, + 0x53f56311L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); + +DEFINE_GUID(GUID_DEVINTERFACE_CDCHANGER, + 0x53f56312L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); + +DEFINE_GUID(GUID_DEVINTERFACE_STORAGEPORT, + 0x2accfe60L, 0xc130, 0x11d2, 0xb0, 0x82, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); + + +typedef enum _STORAGE_MEDIA_TYPE { + DDS_4mm = 0x20, + MiniQic, + Travan, + QIC, + MP_8mm, + AME_8mm, + AIT1_8mm, + DLT, + NCTP, + IBM_3480, + IBM_3490E, + IBM_Magstar_3590, + IBM_Magstar_MP, + STK_DATA_D3, + SONY_DTF, + DV_6mm, + DMI, + SONY_D2, + CLEANER_CARTRIDGE, + CD_ROM, + CD_R, + CD_RW, + DVD_ROM, + DVD_R, + DVD_RW, + MO_3_RW, + MO_5_WO, + MO_5_RW, + MO_5_LIMDOW, + PC_5_WO, + PC_5_RW, + PD_5_RW, + ABL_5_WO, + PINNACLE_APEX_5_RW, + SONY_12_WO, + PHILIPS_12_WO, + HITACHI_12_WO, + CYGNET_12_WO, + KODAK_14_WO, + MO_NFR_525, + NIKON_12_RW, + IOMEGA_ZIP, + IOMEGA_JAZ, + SYQUEST_EZ135, + SYQUEST_EZFLYER, + SYQUEST_SYJET, + AVATAR_F2, + MP2_8mm, + DST_S, + DST_M, + DST_L, + VXATape_1, + VXATape_2, + STK_9840, + LTO_Ultrium, + LTO_Accelis, + DVD_RAM, + AIT_8mm, + ADR_1, + ADR_2 +} STORAGE_MEDIA_TYPE, *PSTORAGE_MEDIA_TYPE; + +typedef enum _STORAGE_BUS_TYPE { + BusTypeUnknown = 0x00, + BusTypeScsi, + BusTypeAtapi, + BusTypeAta, + BusType1394, + BusTypeSsa, + BusTypeFibre, + BusTypeUsb, + BusTypeRAID, + BusTypeMaxReserved = 0x7F +} STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE; + +/* DEVICE_MEDIA_INFO.DeviceSpecific.DiskInfo.MediaCharacteristics constants */ +#define MEDIA_ERASEABLE 0x00000001 +#define MEDIA_WRITE_ONCE 0x00000002 +#define MEDIA_READ_ONLY 0x00000004 +#define MEDIA_READ_WRITE 0x00000008 +#define MEDIA_WRITE_PROTECTED 0x00000100 +#define MEDIA_CURRENTLY_MOUNTED 0x80000000 + +typedef struct _DEVICE_MEDIA_INFO { + union { + struct { + LARGE_INTEGER Cylinders; + STORAGE_MEDIA_TYPE MediaType; + ULONG TracksPerCylinder; + ULONG SectorsPerTrack; + ULONG BytesPerSector; + ULONG NumberMediaSides; + ULONG MediaCharacteristics; + } DiskInfo; + struct { + LARGE_INTEGER Cylinders; + STORAGE_MEDIA_TYPE MediaType; + ULONG TracksPerCylinder; + ULONG SectorsPerTrack; + ULONG BytesPerSector; + ULONG NumberMediaSides; + ULONG MediaCharacteristics; + } RemovableDiskInfo; + struct { + STORAGE_MEDIA_TYPE MediaType; + ULONG MediaCharacteristics; + ULONG CurrentBlockSize; + STORAGE_BUS_TYPE BusType; + union { + struct { + UCHAR MediumType; + UCHAR DensityCode; + } ScsiInformation; + } BusSpecificData; + } TapeInfo; + } DeviceSpecific; +} DEVICE_MEDIA_INFO, *PDEVICE_MEDIA_INFO; + +typedef struct _GET_MEDIA_TYPES { + ULONG DeviceType; + ULONG MediaInfoCount; + DEVICE_MEDIA_INFO MediaInfo[1]; +} GET_MEDIA_TYPES, *PGET_MEDIA_TYPES; + +typedef struct _STORAGE_ADAPTER_DESCRIPTOR { + ULONG Version; + ULONG Size; + ULONG MaximumTransferLength; + ULONG MaximumPhysicalPages; + ULONG AlignmentMask; + BOOLEAN AdapterUsesPio; + BOOLEAN AdapterScansDown; + BOOLEAN CommandQueueing; + BOOLEAN AcceleratedTransfer; + STORAGE_BUS_TYPE BusType; + USHORT BusMajorVersion; + USHORT BusMinorVersion; +} STORAGE_ADAPTER_DESCRIPTOR, *PSTORAGE_ADAPTER_DESCRIPTOR; + +typedef struct _STORAGE_BUS_RESET_REQUEST { + UCHAR PathId; +} STORAGE_BUS_RESET_REQUEST, *PSTORAGE_BUS_RESET_REQUEST; + +typedef struct _STORAGE_DESCRIPTOR_HEADER { + ULONG Version; + ULONG Size; +} STORAGE_DESCRIPTOR_HEADER, *PSTORAGE_DESCRIPTOR_HEADER; + +typedef struct _STORAGE_DEVICE_DESCRIPTOR { + ULONG Version; + ULONG Size; + UCHAR DeviceType; + UCHAR DeviceTypeModifier; + BOOLEAN RemovableMedia; + BOOLEAN CommandQueueing; + ULONG VendorIdOffset; + ULONG ProductIdOffset; + ULONG ProductRevisionOffset; + ULONG SerialNumberOffset; + STORAGE_BUS_TYPE BusType; + ULONG RawPropertiesLength; + UCHAR RawDeviceProperties[1]; +} STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR; + +typedef struct _STORAGE_DEVICE_ID_DESCRIPTOR { + ULONG Version; + ULONG Size; + ULONG NumberOfIdentifiers; + UCHAR Identifiers[1]; +} STORAGE_DEVICE_ID_DESCRIPTOR, *PSTORAGE_DEVICE_ID_DESCRIPTOR; + +typedef struct _STORAGE_DEVICE_NUMBER { + DEVICE_TYPE DeviceType; + ULONG DeviceNumber; + ULONG PartitionNumber; +} STORAGE_DEVICE_NUMBER, *PSTORAGE_DEVICE_NUMBER; + +typedef struct _STORAGE_PREDICT_FAILURE { + ULONG PredictFailure; + UCHAR VendorSpecific[512]; +} STORAGE_PREDICT_FAILURE, *PSTORAGE_PREDICT_FAILURE; + +typedef enum _STORAGE_PROPERTY_ID { + StorageDeviceProperty = 0, + StorageAdapterProperty, + StorageDeviceIdProperty +} STORAGE_PROPERTY_ID, *PSTORAGE_PROPERTY_ID; + +typedef enum _STORAGE_QUERY_TYPE { + PropertyStandardQuery = 0, + PropertyExistsQuery, + PropertyMaskQuery, + PropertyQueryMaxDefined +} STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE; + +typedef struct _STORAGE_PROPERTY_QUERY { + STORAGE_PROPERTY_ID PropertyId; + STORAGE_QUERY_TYPE QueryType; + UCHAR AdditionalParameters[1]; +} STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __NTDDSTOR_H */ diff --git a/reactos/w32api/include/ddk/ntddtape.h b/reactos/w32api/include/ddk/ntddtape.h new file mode 100644 index 00000000000..4cc88691f6a --- /dev/null +++ b/reactos/w32api/include/ddk/ntddtape.h @@ -0,0 +1,84 @@ +/* + * ntddtape.h + * + * Tape device IOCTL interface. + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __NTDDTAPE_H +#define __NTDDTAPE_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" +#include "ntddstor.h" + + +#define DD_TAPE_DEVICE_NAME "\\Device\\Tape" +#define DD_TAPE_DEVICE_NAME_U L"\\Device\\Tape" + +#define IOCTL_TAPE_BASE FILE_DEVICE_TAPE + +#define IOCTL_TAPE_CHECK_VERIFY CTL_CODE(IOCTL_TAPE_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_TAPE_CREATE_PARTITION CTL_CODE(IOCTL_TAPE_BASE, 0x000a, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_TAPE_ERASE CTL_CODE(IOCTL_TAPE_BASE, 0x0000, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_TAPE_FIND_NEW_DEVICES CTL_CODE(IOCTL_DISK_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS) +#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_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) +#define IOCTL_TAPE_SET_MEDIA_PARAMS CTL_CODE(IOCTL_TAPE_BASE, 0x0008, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_TAPE_SET_POSITION CTL_CODE(IOCTL_TAPE_BASE, 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_TAPE_WRITE_MARKS CTL_CODE(IOCTL_TAPE_BASE, 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + + +typedef enum _TAPE_DRIVE_PROBLEM_TYPE { + TapeDriveProblemNone, + TapeDriveReadWriteWarning, + TapeDriveReadWriteError, + TapeDriveReadWarning, + TapeDriveWriteWarning, + TapeDriveReadError, + TapeDriveWriteError, + TapeDriveHardwareError, + TapeDriveUnsupportedMedia, + TapeDriveScsiConnectionError, + TapeDriveTimetoClean, + TapeDriveCleanDriveNow, + TapeDriveMediaLifeExpired, + TapeDriveSnappedTape +} TAPE_DRIVE_PROBLEM_TYPE; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __NTDDTAPE_H */ diff --git a/reactos/w32api/include/ddk/ntddtdi.h b/reactos/w32api/include/ddk/ntddtdi.h new file mode 100644 index 00000000000..5ff5ad0643f --- /dev/null +++ b/reactos/w32api/include/ddk/ntddtdi.h @@ -0,0 +1,66 @@ +/* + * ntddtdi.h + * + * TDI IOCTL interface + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __NTDDTDI_H +#define __NTDDTDI_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + + +#define DD_TDI_DEVICE_NAME "\\Device\\UNKNOWN" +#define DD_TDI_DEVICE_NAME_U L"\\Device\\UNKNOWN" + +#define _TDI_CONTROL_CODE(Request, Method) \ + CTL_CODE(FILE_DEVICE_TRANSPORT, Request, Method, FILE_ANY_ACCESS) + +#define IOCTL_TDI_ACCEPT _TDI_CONTROL_CODE(0, METHOD_BUFFERED) +#define IOCTL_TDI_CONNECT _TDI_CONTROL_CODE(1, METHOD_BUFFERED) +#define IOCTL_TDI_DISCONNECT _TDI_CONTROL_CODE(2, METHOD_BUFFERED) +#define IOCTL_TDI_LISTEN _TDI_CONTROL_CODE(3, METHOD_BUFFERED) +#define IOCTL_TDI_QUERY_INFORMATION _TDI_CONTROL_CODE(4, METHOD_OUT_DIRECT) +#define IOCTL_TDI_RECEIVE _TDI_CONTROL_CODE(5, METHOD_OUT_DIRECT) +#define IOCTL_TDI_RECEIVE_DATAGRAM _TDI_CONTROL_CODE(6, METHOD_OUT_DIRECT) +#define IOCTL_TDI_SEND _TDI_CONTROL_CODE(7, METHOD_IN_DIRECT) +#define IOCTL_TDI_SEND_DATAGRAM _TDI_CONTROL_CODE(8, METHOD_IN_DIRECT) +#define IOCTL_TDI_SET_EVENT_HANDLER _TDI_CONTROL_CODE(9, METHOD_BUFFERED) +#define IOCTL_TDI_SET_INFORMATION _TDI_CONTROL_CODE(10, METHOD_IN_DIRECT) +#define IOCTL_TDI_ASSOCIATE_ADDRESS _TDI_CONTROL_CODE(11, METHOD_BUFFERED) +#define IOCTL_TDI_DISASSOCIATE_ADDRESS _TDI_CONTROL_CODE(12, METHOD_BUFFERED) +#define IOCTL_TDI_ACTION _TDI_CONTROL_CODE(13, METHOD_OUT_DIRECT) + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __NTDDTDI_H */ diff --git a/reactos/w32api/include/ddk/ntddvdeo.h b/reactos/w32api/include/ddk/ntddvdeo.h new file mode 100644 index 00000000000..e8afdbc2c7e --- /dev/null +++ b/reactos/w32api/include/ddk/ntddvdeo.h @@ -0,0 +1,444 @@ +/* + * ntddvdeo.h + * + * Definitions for video devices + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __NTDDVDEO_H +#define __NTDDVDEO_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + + +#define VIDEO_DEVICE_NAME "DISPLAY%d" +#define WVIDEO_DEVICE_NAME L"DISPLAY%d" + +#define DD_FULLSCREEN_VIDEO_DEVICE_NAME L"\\Device\\FSVideo" + +DEFINE_GUID(GUID_DEVINTERFACE_DISPLAY_ADAPTER, \ + 0x5b45201d, 0xf2f2, 0x4f3b, 0x85, 0xbb, 0x30, 0xff, 0x1f, 0x95, 0x35, 0x99); + + +#define IOCTL_VIDEO_DISABLE_CURSOR \ + CTL_CODE (FILE_DEVICE_VIDEO, 0x109, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_DISABLE_POINTER \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x10f, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_ENABLE_CURSOR \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x108, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_ENABLE_POINTER \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x10e, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_FREE_PUBLIC_ACCESS_RANGES \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x119, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_GET_BANK_SELECT_CODE \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x115, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_GET_CHILD_STATE \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x120, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_GET_POWER_MANAGEMENT \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x11c, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_HANDLE_VIDEOPARAMETERS \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x08, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_LOAD_AND_SET_FONT \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x105, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_MAP_VIDEO_MEMORY \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x116, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_QUERY_AVAIL_MODES \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x100, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_QUERY_COLOR_CAPABILITIES \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x11a, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_QUERY_CURRENT_MODE \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x102, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_QUERY_CURSOR_ATTR \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x10b, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_QUERY_CURSOR_POSITION \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x10d, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x101, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_QUERY_POINTER_ATTR \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x111, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x114, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_QUERY_POINTER_POSITION \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x113, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_QUERY_PUBLIC_ACCESS_RANGES \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x118, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_RESET_DEVICE \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x104, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_RESTORE_HARDWARE_STATE \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x81, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_SAVE_HARDWARE_STATE \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x80, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_SET_CHILD_STATE_CONFIGURATION \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x122, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_SET_COLOR_REGISTERS \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x107, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_SET_CURRENT_MODE \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x103, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_SET_CURSOR_ATTR \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x10a, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_SET_CURSOR_POSITION \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x10c, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_SET_PALETTE_REGISTERS \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x106, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_SET_POINTER_ATTR \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x110, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_SET_POINTER_POSITION \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x112, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_SET_POWER_MANAGEMENT \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x11b, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_SHARE_VIDEO_MEMORY \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x11d, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_SWITCH_DUALVIEW \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x123, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_UNMAP_VIDEO_MEMORY \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x117, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_UNSHARE_VIDEO_MEMORY \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x11e, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_VALIDATE_CHILD_STATE_CONFIGURATION \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x121, METHOD_BUFFERED, FILE_ANY_ACCESS) + + + +typedef struct _VIDEO_MEMORY { + PVOID RequestedVirtualAddress; +} VIDEO_MEMORY, *PVIDEO_MEMORY; + +typedef struct _VIDEO_MEMORY_INFORMATION { + PVOID VideoRamBase; + ULONG VideoRamLength; + PVOID FrameBufferBase; + ULONG FrameBufferLength; +} VIDEO_MEMORY_INFORMATION, *PVIDEO_MEMORY_INFORMATION; + +/* VIDEO_MODE.RequestedMode */ +#define VIDEO_MODE_MAP_MEM_LINEAR 0x40000000 +#define VIDEO_MODE_NO_ZERO_MEMORY 0x80000000 + +typedef struct _VIDEO_MODE { + ULONG RequestedMode; +} VIDEO_MODE, *PVIDEO_MODE; + +/* VIDEO_MODE_INFORMATION.AttributeFlags */ +#define VIDEO_MODE_COLOR 0x0001 +#define VIDEO_MODE_GRAPHICS 0x0002 +#define VIDEO_MODE_PALETTE_DRIVEN 0x0004 +#define VIDEO_MODE_MANAGED_PALETTE 0x0008 +#define VIDEO_MODE_INTERLACED 0x0010 +#define VIDEO_MODE_NO_OFF_SCREEN 0x0020 +#define VIDEO_MODE_NO_64_BIT_ACCESS 0x0040 +#define VIDEO_MODE_BANKED 0x0080 +#define VIDEO_MODE_LINEAR 0x0100 + +typedef struct _VIDEO_MODE_INFORMATION { + ULONG Length; + ULONG ModeIndex; + ULONG VisScreenWidth; + ULONG VisScreenHeight; + ULONG ScreenStride; + ULONG NumberOfPlanes; + ULONG BitsPerPlane; + ULONG Frequency; + ULONG XMillimeter; + ULONG YMillimeter; + ULONG NumberRedBits; + ULONG NumberGreenBits; + ULONG NumberBlueBits; + ULONG RedMask; + ULONG GreenMask; + ULONG BlueMask; + ULONG AttributeFlags; + ULONG VideoMemoryBitmapWidth; + ULONG VideoMemoryBitmapHeight; + ULONG DriverSpecificAttributeFlags; +} VIDEO_MODE_INFORMATION, *PVIDEO_MODE_INFORMATION; + +typedef struct _VIDEO_NUM_MODES { + ULONG NumModes; + ULONG ModeInformationLength; +} VIDEO_NUM_MODES, *PVIDEO_NUM_MODES; + +typedef enum _VIDEO_POWER_STATE { + VideoPowerUnspecified = 0, + VideoPowerOn = 1, + VideoPowerStandBy, + VideoPowerSuspend, + VideoPowerOff, + VideoPowerHibernate, + VideoPowerShutdown, + VideoPowerMaximum +} VIDEO_POWER_STATE, *PVIDEO_POWER_STATE; + +typedef struct _VIDEO_POWER_MANAGEMENT { + ULONG Length; + ULONG DPMSVersion; + ULONG PowerState; +} VIDEO_POWER_MANAGEMENT, *PVIDEO_POWER_MANAGEMENT; + +typedef struct _VIDEO_PUBLIC_ACCESS_RANGES { + ULONG InIoSpace; + ULONG MappedInIoSpace; + PVOID VirtualAddress; +} VIDEO_PUBLIC_ACCESS_RANGES, *PVIDEO_PUBLIC_ACCESS_RANGES; + +typedef struct _VIDEO_SHARE_MEMORY { + HANDLE ProcessHandle; + ULONG ViewOffset; + ULONG ViewSize; + PVOID RequestedVirtualAddress; +} VIDEO_SHARE_MEMORY, *PVIDEO_SHARE_MEMORY; + +typedef struct _VIDEO_SHARE_MEMORY_INFORMATION { + ULONG SharedViewOffset; + ULONG SharedViewSize; + PVOID VirtualAddress; +} VIDEO_SHARE_MEMORY_INFORMATION, *PVIDEO_SHARE_MEMORY_INFORMATION; + +/* VIDEO_BANK_SELECT.BankingFlags constants */ +#define PLANAR_HC 0x00000001 + +/* VIDEO_BANK_SELECT.BankingType and PlanarHCBankingType constants */ +typedef enum _VIDEO_BANK_TYPE { + VideoNotBanked = 0, + VideoBanked1RW, + VideoBanked1R1W, + VideoBanked2RW, + NumVideoBankTypes +} VIDEO_BANK_TYPE, *PVIDEO_BANK_TYPE; + +typedef struct _VIDEO_BANK_SELECT { + ULONG Length; + ULONG Size; + ULONG BankingFlags; + ULONG BankingType; + ULONG PlanarHCBankingType; + ULONG BitmapWidthInBytes; + ULONG BitmapSize; + ULONG Granularity; + ULONG PlanarHCGranularity; + ULONG CodeOffset; + ULONG PlanarHCBankCodeOffset; + ULONG PlanarHCEnableCodeOffset; + ULONG PlanarHCDisableCodeOffset; +} VIDEO_BANK_SELECT, *PVIDEO_BANK_SELECT; + +typedef struct _VIDEO_LOAD_FONT_INFORMATION { + USHORT WidthInPixels; + USHORT HeightInPixels; + ULONG FontSize; + UCHAR Font[1]; +} VIDEO_LOAD_FONT_INFORMATION, *PVIDEO_LOAD_FONT_INFORMATION; + +/* VIDEO_COLOR_CAPABILITIES.AttributeFlags constants */ +#define VIDEO_DEVICE_COLOR 0x00000001 +#define VIDEO_OPTIONAL_GAMMET_TABLE 0x00000002 + +typedef struct _VIDEO_COLOR_CAPABILITIES { + ULONG Length; + ULONG AttributeFlags; + LONG RedPhosphoreDecay; + LONG GreenPhosphoreDecay; + LONG BluePhosphoreDecay; + LONG WhiteChromaticity_x; + LONG WhiteChromaticity_y; + LONG WhiteChromaticity_Y; + LONG RedChromaticity_x; + LONG RedChromaticity_y; + LONG GreenChromaticity_x; + LONG GreenChromaticity_y; + LONG BlueChromaticity_x; + LONG BlueChromaticity_y; + LONG WhiteGamma; + LONG RedGamma; + LONG GreenGamma; + LONG BlueGamma; +} VIDEO_COLOR_CAPABILITIES, *PVIDEO_COLOR_CAPABILITIES; + +typedef struct _VIDEO_CURSOR_ATTRIBUTES { + USHORT Width; + USHORT Height; + SHORT Column; + SHORT Row; + UCHAR Rate; + UCHAR Enable; +} VIDEO_CURSOR_ATTRIBUTES, *PVIDEO_CURSOR_ATTRIBUTES; + +typedef struct _VIDEO_CURSOR_POSITION { + SHORT Column; + SHORT Row; +} VIDEO_CURSOR_POSITION, *PVIDEO_CURSOR_POSITION; + +typedef struct _VIDEO_POINTER_ATTRIBUTES { + ULONG Flags; + ULONG Width; + ULONG Height; + ULONG WidthInBytes; + ULONG Enable; + SHORT Column; + SHORT Row; + UCHAR Pixels[1]; +} VIDEO_POINTER_ATTRIBUTES, *PVIDEO_POINTER_ATTRIBUTES; + +/* VIDEO_POINTER_CAPABILITIES.Flags */ +#define VIDEO_MODE_ASYNC_POINTER 0x01 +#define VIDEO_MODE_MONO_POINTER 0x02 +#define VIDEO_MODE_COLOR_POINTER 0x04 +#define VIDEO_MODE_ANIMATE_START 0x08 +#define VIDEO_MODE_ANIMATE_UPDATE 0x10 + +typedef struct _VIDEO_POINTER_CAPABILITIES { + ULONG Flags; + ULONG MaxWidth; + ULONG MaxHeight; + ULONG HWPtrBitmapStart; + ULONG HWPtrBitmapEnd; +} VIDEO_POINTER_CAPABILITIES, *PVIDEO_POINTER_CAPABILITIES; + +typedef struct _VIDEO_POINTER_POSITION { + SHORT Column; + SHORT Row; +} VIDEO_POINTER_POSITION, *PVIDEO_POINTER_POSITION; + + +/* VIDEO_HARDWARE_STATE_HEADER.VGAStateFlags constants */ +#define VIDEO_STATE_NON_STANDARD_VGA 0x00000001 +#define VIDEO_STATE_UNEMULATED_VGA_STATE 0x00000002 +#define VIDEO_STATE_PACKED_CHAIN4_MODE 0x00000004 + +typedef struct _VIDEO_HARDWARE_STATE_HEADER { + ULONG Length; + UCHAR PortValue[0x30]; + ULONG AttribIndexDataState; + ULONG BasicSequencerOffset; + ULONG BasicCrtContOffset; + ULONG BasicGraphContOffset; + ULONG BasicAttribContOffset; + ULONG BasicDacOffset; + ULONG BasicLatchesOffset; + ULONG ExtendedSequencerOffset; + ULONG ExtendedCrtContOffset; + ULONG ExtendedGraphContOffset; + ULONG ExtendedAttribContOffset; + ULONG ExtendedDacOffset; + ULONG ExtendedValidatorStateOffset; + ULONG ExtendedMiscDataOffset; + ULONG PlaneLength; + ULONG Plane1Offset; + ULONG Plane2Offset; + ULONG Plane3Offset; + ULONG Plane4Offset; + ULONG VGAStateFlags; + ULONG DIBOffset; + ULONG DIBBitsPerPixel; + ULONG DIBXResolution; + ULONG DIBYResolution; + ULONG DIBXlatOffset; + ULONG DIBXlatLength; + ULONG VesaInfoOffset; + PVOID FrameBufferData; +} VIDEO_HARDWARE_STATE_HEADER, *PVIDEO_HARDWARE_STATE_HEADER; + +typedef struct _VIDEO_CLUTDATA { + UCHAR Red; + UCHAR Green; + UCHAR Blue; + UCHAR Unused; +} VIDEO_CLUTDATA, *PVIDEO_CLUTDATA; + +typedef struct { + USHORT NumEntries; + USHORT FirstEntry; + union { + VIDEO_CLUTDATA RgbArray; + ULONG RgbLong; + } LookupTable[1]; +} VIDEO_CLUT, *PVIDEO_CLUT; + +typedef struct _VIDEO_PALETTE_DATA { + USHORT NumEntries; + USHORT FirstEntry; + USHORT Colors[1]; +} VIDEO_PALETTE_DATA, *PVIDEO_PALETTE_DATA; + +typedef struct _VIDEO_HARDWARE_STATE { + PVIDEO_HARDWARE_STATE_HEADER StateHeader; + ULONG StateLength; +} VIDEO_HARDWARE_STATE, *PVIDEO_HARDWARE_STATE; + +#define VIDEO_CHILD_ACTIVE 0x00000001 +#define VIDEO_CHILD_DETACHED 0x00000002 +#define VIDEO_CHILD_NOPRUNE_FREQ 0x80000000 +#define VIDEO_CHILD_NOPRUNE_RESOLUTION 0x40000000 + +#define VIDEO_DUALVIEW_REMOVABLE 0x00000001 +#define VIDEO_DUALVIEW_PRIMARY 0x80000000 +#define VIDEO_DUALVIEW_SECONDARY 0x40000000 + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __NTDDVDEO_H */ diff --git a/reactos/w32api/include/ddk/ntddvol.h b/reactos/w32api/include/ddk/ntddvol.h new file mode 100644 index 00000000000..a5d9064be4a --- /dev/null +++ b/reactos/w32api/include/ddk/ntddvol.h @@ -0,0 +1,146 @@ +/* + * ntddvol.h + * + * Volume IOCTL interface. + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __NTDDVOL_H +#define __NTDDVOL_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + + +#define IOCTL_VOLUME_BASE ((ULONG) 'V') + +#define IOCTL_VOLUME_LOGICAL_TO_PHYSICAL \ + CTL_CODE(IOCTL_VOLUME_BASE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VOLUME_PHYSICAL_TO_LOGICAL \ + CTL_CODE(IOCTL_VOLUME_BASE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VOLUME_READ_PLEX \ + CTL_CODE(IOCTL_VOLUME_BASE, 11, METHOD_OUT_DIRECT, FILE_READ_ACCESS) + +#define IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS \ + CTL_CODE(IOCTL_VOLUME_BASE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VOLUME_IS_CLUSTERED \ + CTL_CODE(IOCTL_VOLUME_BASE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VOLUME_QUERY_VOLUME_NUMBER \ + CTL_CODE(IOCTL_VOLUME_BASE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VOLUME_IS_PARTITION \ + CTL_CODE(IOCTL_VOLUME_BASE, 10, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VOLUME_SET_GPT_ATTRIBUTES \ + CTL_CODE(IOCTL_VOLUME_BASE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VOLUME_GET_GPT_ATTRIBUTES \ + CTL_CODE(IOCTL_VOLUME_BASE, 14, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VOLUME_SUPPORTS_ONLINE_OFFLINE \ + CTL_CODE(IOCTL_VOLUME_BASE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VOLUME_ONLINE \ + CTL_CODE(IOCTL_VOLUME_BASE, 2, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_VOLUME_OFFLINE \ + CTL_CODE(IOCTL_VOLUME_BASE, 3, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_VOLUME_IS_OFFLINE \ + CTL_CODE(IOCTL_VOLUME_BASE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VOLUME_IS_IO_CAPABLE \ + CTL_CODE(IOCTL_VOLUME_BASE, 5, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VOLUME_QUERY_FAILOVER_SET \ + CTL_CODE(IOCTL_VOLUME_BASE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS) + + +typedef struct _VOLUME_LOGICAL_OFFSET { + LONGLONG LogicalOffset; +} VOLUME_LOGICAL_OFFSET, *PVOLUME_LOGICAL_OFFSET; + +typedef struct _VOLUME_PHYSICAL_OFFSET { + ULONG DiskNumber; + LONGLONG Offset; +} VOLUME_PHYSICAL_OFFSET, *PVOLUME_PHYSICAL_OFFSET; + +typedef struct _VOLUME_PHYSICAL_OFFSETS { + ULONG NumberOfPhysicalOffsets; + VOLUME_PHYSICAL_OFFSET PhysicalOffset[1]; +} VOLUME_PHYSICAL_OFFSETS, *PVOLUME_PHYSICAL_OFFSETS; + +typedef struct _VOLUME_READ_PLEX_INPUT { + LARGE_INTEGER ByteOffset; + ULONG Length; + ULONG PlexNumber; +} VOLUME_READ_PLEX_INPUT, *PVOLUME_READ_PLEX_INPUT; + +typedef struct _VOLUME_GET_GPT_ATTRIBUTES_INFORMATION { + ULONGLONG GptAttributes; +} VOLUME_GET_GPT_ATTRIBUTES_INFORMATION, *PVOLUME_GET_GPT_ATTRIBUTES_INFORMATION; + +typedef struct _VOLUME_SET_GPT_ATTRIBUTES_INFORMATION { + ULONGLONG GptAttributes; + BOOLEAN RevertOnClose; + BOOLEAN ApplyToAllConnectedVolumes; + USHORT Reserved1; + ULONG Reserved2; +} VOLUME_SET_GPT_ATTRIBUTES_INFORMATION, *PVOLUME_SET_GPT_ATTRIBUTES_INFORMATION; + +typedef struct _DISK_EXTENT { + ULONG DiskNumber; + LARGE_INTEGER StartingOffset; + LARGE_INTEGER ExtentLength; +} DISK_EXTENT, *PDISK_EXTENT; + +typedef struct _VOLUME_DISK_EXTENTS { + ULONG NumberOfDiskExtents; + DISK_EXTENT Extents[1]; +} VOLUME_DISK_EXTENTS, *PVOLUME_DISK_EXTENTS; + +typedef struct _VOLUME_NUMBER { + ULONG VolumeNumber; + WCHAR VolumeManagerName[8]; +} VOLUME_NUMBER, *PVOLUME_NUMBER; + +typedef struct _VOLUME_FAILOVER_SET { + ULONG NumberOfDisks; + ULONG DiskNumbers[1]; +} VOLUME_FAILOVER_SET, *PVOLUME_FAILOVER_SET; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __NTDDVOL_H */ diff --git a/reactos/w32api/include/ddk/ntifs.h b/reactos/w32api/include/ddk/ntifs.h new file mode 100644 index 00000000000..b09c1630615 --- /dev/null +++ b/reactos/w32api/include/ddk/ntifs.h @@ -0,0 +1,4691 @@ +/* + * ntifs.h + * + * Windows NT Filesystem Driver Developer Kit + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Bo Brant閚 <bosse@acc.umu.se> + * + * 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 _NTIFS_ +#define _NTIFS_ +#define _GNU_NTIFS_ + +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" +#include "ntapi.h" + +#define VER_PRODUCTBUILD 10000 + +#ifndef NTSYSAPI +#define NTSYSAPI +#endif + +#ifndef NTKERNELAPI +#define NTKERNELAPI STDCALL +#endif + +typedef struct _SE_EXPORTS *PSE_EXPORTS; + +extern PUCHAR *FsRtlLegalAnsiCharacterArray; +extern PSE_EXPORTS SeExports; +extern PACL SePublicDefaultDacl; +extern PACL SeSystemDefaultDacl; + +#define ANSI_DOS_STAR ('<') +#define ANSI_DOS_QM ('>') +#define ANSI_DOS_DOT ('"') + +#define DOS_STAR (L'<') +#define DOS_QM (L'>') +#define DOS_DOT (L'"') + +/* also in winnt.h */ +#define ACCESS_ALLOWED_ACE_TYPE (0x0) +#define ACCESS_DENIED_ACE_TYPE (0x1) +#define SYSTEM_AUDIT_ACE_TYPE (0x2) +#define SYSTEM_ALARM_ACE_TYPE (0x3) + +#define COMPRESSION_FORMAT_NONE (0x0000) +#define COMPRESSION_FORMAT_DEFAULT (0x0001) +#define COMPRESSION_FORMAT_LZNT1 (0x0002) +#define COMPRESSION_ENGINE_STANDARD (0x0000) +#define COMPRESSION_ENGINE_MAXIMUM (0x0100) +#define COMPRESSION_ENGINE_HIBER (0x0200) + +#define FILE_ACTION_ADDED 0x00000001 +#define FILE_ACTION_REMOVED 0x00000002 +#define FILE_ACTION_MODIFIED 0x00000003 +#define FILE_ACTION_RENAMED_OLD_NAME 0x00000004 +#define FILE_ACTION_RENAMED_NEW_NAME 0x00000005 +#define FILE_ACTION_ADDED_STREAM 0x00000006 +#define FILE_ACTION_REMOVED_STREAM 0x00000007 +#define FILE_ACTION_MODIFIED_STREAM 0x00000008 +#define FILE_ACTION_REMOVED_BY_DELETE 0x00000009 +#define FILE_ACTION_ID_NOT_TUNNELLED 0x0000000A +#define FILE_ACTION_TUNNELLED_ID_COLLISION 0x0000000B +/* end winnt.h */ + +#define FILE_EA_TYPE_BINARY 0xfffe +#define FILE_EA_TYPE_ASCII 0xfffd +#define FILE_EA_TYPE_BITMAP 0xfffb +#define FILE_EA_TYPE_METAFILE 0xfffa +#define FILE_EA_TYPE_ICON 0xfff9 +#define FILE_EA_TYPE_EA 0xffee +#define FILE_EA_TYPE_MVMT 0xffdf +#define FILE_EA_TYPE_MVST 0xffde +#define FILE_EA_TYPE_ASN1 0xffdd +#define FILE_EA_TYPE_FAMILY_IDS 0xff01 + +#define FILE_NEED_EA 0x00000080 + +/* also in winnt.h */ +#define FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001 +#define FILE_NOTIFY_CHANGE_DIR_NAME 0x00000002 +#define FILE_NOTIFY_CHANGE_NAME 0x00000003 +#define FILE_NOTIFY_CHANGE_ATTRIBUTES 0x00000004 +#define FILE_NOTIFY_CHANGE_SIZE 0x00000008 +#define FILE_NOTIFY_CHANGE_LAST_WRITE 0x00000010 +#define FILE_NOTIFY_CHANGE_LAST_ACCESS 0x00000020 +#define FILE_NOTIFY_CHANGE_CREATION 0x00000040 +#define FILE_NOTIFY_CHANGE_EA 0x00000080 +#define FILE_NOTIFY_CHANGE_SECURITY 0x00000100 +#define FILE_NOTIFY_CHANGE_STREAM_NAME 0x00000200 +#define FILE_NOTIFY_CHANGE_STREAM_SIZE 0x00000400 +#define FILE_NOTIFY_CHANGE_STREAM_WRITE 0x00000800 +#define FILE_NOTIFY_VALID_MASK 0x00000fff +/* end winnt.h */ + +#define FILE_OPLOCK_BROKEN_TO_LEVEL_2 0x00000007 +#define FILE_OPLOCK_BROKEN_TO_NONE 0x00000008 + +#define FILE_OPBATCH_BREAK_UNDERWAY 0x00000009 + +#define FILE_CASE_SENSITIVE_SEARCH 0x00000001 +#define FILE_CASE_PRESERVED_NAMES 0x00000002 +#define FILE_UNICODE_ON_DISK 0x00000004 +#define FILE_PERSISTENT_ACLS 0x00000008 +#define FILE_FILE_COMPRESSION 0x00000010 +#define FILE_VOLUME_QUOTAS 0x00000020 +#define FILE_SUPPORTS_SPARSE_FILES 0x00000040 +#define FILE_SUPPORTS_REPARSE_POINTS 0x00000080 +#define FILE_SUPPORTS_REMOTE_STORAGE 0x00000100 +#define FS_LFN_APIS 0x00004000 +#define FILE_VOLUME_IS_COMPRESSED 0x00008000 +#define FILE_SUPPORTS_OBJECT_IDS 0x00010000 +#define FILE_SUPPORTS_ENCRYPTION 0x00020000 +#define FILE_NAMED_STREAMS 0x00040000 + +#define FILE_PIPE_BYTE_STREAM_TYPE 0x00000000 +#define FILE_PIPE_MESSAGE_TYPE 0x00000001 + +#define FILE_PIPE_BYTE_STREAM_MODE 0x00000000 +#define FILE_PIPE_MESSAGE_MODE 0x00000001 + +#define FILE_PIPE_QUEUE_OPERATION 0x00000000 +#define FILE_PIPE_COMPLETE_OPERATION 0x00000001 + +#define FILE_PIPE_INBOUND 0x00000000 +#define FILE_PIPE_OUTBOUND 0x00000001 +#define FILE_PIPE_FULL_DUPLEX 0x00000002 + +#define FILE_PIPE_DISCONNECTED_STATE 0x00000001 +#define FILE_PIPE_LISTENING_STATE 0x00000002 +#define FILE_PIPE_CONNECTED_STATE 0x00000003 +#define FILE_PIPE_CLOSING_STATE 0x00000004 + +#define FILE_PIPE_CLIENT_END 0x00000000 +#define FILE_PIPE_SERVER_END 0x00000001 + +#define FILE_PIPE_READ_DATA 0x00000000 +#define FILE_PIPE_WRITE_SPACE 0x00000001 + +#define FILE_STORAGE_TYPE_SPECIFIED 0x00000041 /* FILE_DIRECTORY_FILE | FILE_NON_DIRECTORY_FILE */ +#define FILE_STORAGE_TYPE_DEFAULT (StorageTypeDefault << FILE_STORAGE_TYPE_SHIFT) +#define FILE_STORAGE_TYPE_DIRECTORY (StorageTypeDirectory << FILE_STORAGE_TYPE_SHIFT) +#define FILE_STORAGE_TYPE_FILE (StorageTypeFile << FILE_STORAGE_TYPE_SHIFT) +#define FILE_STORAGE_TYPE_DOCFILE (StorageTypeDocfile << FILE_STORAGE_TYPE_SHIFT) +#define FILE_STORAGE_TYPE_JUNCTION_POINT (StorageTypeJunctionPoint << FILE_STORAGE_TYPE_SHIFT) +#define FILE_STORAGE_TYPE_CATALOG (StorageTypeCatalog << FILE_STORAGE_TYPE_SHIFT) +#define FILE_STORAGE_TYPE_STRUCTURED_STORAGE (StorageTypeStructuredStorage << FILE_STORAGE_TYPE_SHIFT) +#define FILE_STORAGE_TYPE_EMBEDDING (StorageTypeEmbedding << FILE_STORAGE_TYPE_SHIFT) +#define FILE_STORAGE_TYPE_STREAM (StorageTypeStream << FILE_STORAGE_TYPE_SHIFT) +#define FILE_MINIMUM_STORAGE_TYPE FILE_STORAGE_TYPE_DEFAULT +#define FILE_MAXIMUM_STORAGE_TYPE FILE_STORAGE_TYPE_STREAM +#define FILE_STORAGE_TYPE_MASK 0x000f0000 +#define FILE_STORAGE_TYPE_SHIFT 16 + +#define FILE_VC_QUOTA_NONE 0x00000000 +#define FILE_VC_QUOTA_TRACK 0x00000001 +#define FILE_VC_QUOTA_ENFORCE 0x00000002 +#define FILE_VC_QUOTA_MASK 0x00000003 + +#define FILE_VC_QUOTAS_LOG_VIOLATIONS 0x00000004 +#define FILE_VC_CONTENT_INDEX_DISABLED 0x00000008 + +#define FILE_VC_LOG_QUOTA_THRESHOLD 0x00000010 +#define FILE_VC_LOG_QUOTA_LIMIT 0x00000020 +#define FILE_VC_LOG_VOLUME_THRESHOLD 0x00000040 +#define FILE_VC_LOG_VOLUME_LIMIT 0x00000080 + +#define FILE_VC_QUOTAS_INCOMPLETE 0x00000100 +#define FILE_VC_QUOTAS_REBUILDING 0x00000200 + +#define FILE_VC_VALID_MASK 0x000003ff + +#define FSRTL_FLAG_FILE_MODIFIED (0x01) +#define FSRTL_FLAG_FILE_LENGTH_CHANGED (0x02) +#define FSRTL_FLAG_LIMIT_MODIFIED_PAGES (0x04) +#define FSRTL_FLAG_ACQUIRE_MAIN_RSRC_EX (0x08) +#define FSRTL_FLAG_ACQUIRE_MAIN_RSRC_SH (0x10) +#define FSRTL_FLAG_USER_MAPPED_FILE (0x20) +#define FSRTL_FLAG_EOF_ADVANCE_ACTIVE (0x80) + +#define FSRTL_FLAG2_DO_MODIFIED_WRITE (0x01) + +#define FSRTL_FSP_TOP_LEVEL_IRP (0x01) +#define FSRTL_CACHE_TOP_LEVEL_IRP (0x02) +#define FSRTL_MOD_WRITE_TOP_LEVEL_IRP (0x03) +#define FSRTL_FAST_IO_TOP_LEVEL_IRP (0x04) +#define FSRTL_MAX_TOP_LEVEL_IRP_FLAG (0x04) + +#define FSRTL_VOLUME_DISMOUNT 1 +#define FSRTL_VOLUME_DISMOUNT_FAILED 2 +#define FSRTL_VOLUME_LOCK 3 +#define FSRTL_VOLUME_LOCK_FAILED 4 +#define FSRTL_VOLUME_UNLOCK 5 +#define FSRTL_VOLUME_MOUNT 6 + +#define FSRTL_WILD_CHARACTER 0x08 + +#ifdef _X86_ +#define HARDWARE_PTE HARDWARE_PTE_X86 +#define PHARDWARE_PTE PHARDWARE_PTE_X86 +#else +#define HARDWARE_PTE ULONG +#define PHARDWARE_PTE PULONG +#endif + +#define IO_CHECK_CREATE_PARAMETERS 0x0200 +#define IO_ATTACH_DEVICE 0x0400 + +#define IO_ATTACH_DEVICE_API 0x80000000 +/* also in winnt.h */ +#define IO_COMPLETION_QUERY_STATE 0x0001 +#define IO_COMPLETION_MODIFY_STATE 0x0002 +#define IO_COMPLETION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3) +/* end winnt.h */ +#define IO_FILE_OBJECT_NON_PAGED_POOL_CHARGE 64 +#define IO_FILE_OBJECT_PAGED_POOL_CHARGE 1024 + +#define IO_TYPE_APC 18 +#define IO_TYPE_DPC 19 +#define IO_TYPE_DEVICE_QUEUE 20 +#define IO_TYPE_EVENT_PAIR 21 +#define IO_TYPE_INTERRUPT 22 +#define IO_TYPE_PROFILE 23 + +#define IRP_BEING_VERIFIED 0x10 + +#define MAILSLOT_CLASS_FIRSTCLASS 1 +#define MAILSLOT_CLASS_SECONDCLASS 2 + +#define MAILSLOT_SIZE_AUTO 0 + +#define MAP_PROCESS 1L +#define MAP_SYSTEM 2L +#define MEM_DOS_LIM 0x40000000 +/* also in winnt.h */ +#define MEM_IMAGE SEC_IMAGE +/* end winnt.h */ +#define OB_TYPE_TYPE 1 +#define OB_TYPE_DIRECTORY 2 +#define OB_TYPE_SYMBOLIC_LINK 3 +#define OB_TYPE_TOKEN 4 +#define OB_TYPE_PROCESS 5 +#define OB_TYPE_THREAD 6 +#define OB_TYPE_EVENT 7 +#define OB_TYPE_EVENT_PAIR 8 +#define OB_TYPE_MUTANT 9 +#define OB_TYPE_SEMAPHORE 10 +#define OB_TYPE_TIMER 11 +#define OB_TYPE_PROFILE 12 +#define OB_TYPE_WINDOW_STATION 13 +#define OB_TYPE_DESKTOP 14 +#define OB_TYPE_SECTION 15 +#define OB_TYPE_KEY 16 +#define OB_TYPE_PORT 17 +#define OB_TYPE_ADAPTER 18 +#define OB_TYPE_CONTROLLER 19 +#define OB_TYPE_DEVICE 20 +#define OB_TYPE_DRIVER 21 +#define OB_TYPE_IO_COMPLETION 22 +#define OB_TYPE_FILE 23 + +#define PIN_WAIT (1) +#define PIN_EXCLUSIVE (2) +#define PIN_NO_READ (4) +#define PIN_IF_BCB (8) + +#define PORT_CONNECT 0x0001 +#define PORT_ALL_ACCESS (STANDARD_RIGHTS_ALL |\ + PORT_CONNECT) +/* also in winnt.h */ +#define SEC_BASED 0x00200000 +#define SEC_NO_CHANGE 0x00400000 +#define SEC_FILE 0x00800000 +#define SEC_IMAGE 0x01000000 +#define SEC_VLM 0x02000000 +#define SEC_RESERVE 0x04000000 +#define SEC_COMMIT 0x08000000 +#define SEC_NOCACHE 0x10000000 + +#define SECURITY_WORLD_SID_AUTHORITY {0,0,0,0,0,1} +#define SECURITY_WORLD_RID (0x00000000L) + +#define SID_REVISION 1 + +#define TOKEN_ASSIGN_PRIMARY (0x0001) +#define TOKEN_DUPLICATE (0x0002) +#define TOKEN_IMPERSONATE (0x0004) +#define TOKEN_QUERY (0x0008) +#define TOKEN_QUERY_SOURCE (0x0010) +#define TOKEN_ADJUST_PRIVILEGES (0x0020) +#define TOKEN_ADJUST_GROUPS (0x0040) +#define TOKEN_ADJUST_DEFAULT (0x0080) + +#define TOKEN_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\ + TOKEN_ASSIGN_PRIMARY |\ + TOKEN_DUPLICATE |\ + TOKEN_IMPERSONATE |\ + TOKEN_QUERY |\ + TOKEN_QUERY_SOURCE |\ + TOKEN_ADJUST_PRIVILEGES |\ + TOKEN_ADJUST_GROUPS |\ + TOKEN_ADJUST_DEFAULT) + +#define TOKEN_READ (STANDARD_RIGHTS_READ |\ + TOKEN_QUERY) + +#define TOKEN_WRITE (STANDARD_RIGHTS_WRITE |\ + TOKEN_ADJUST_PRIVILEGES |\ + TOKEN_ADJUST_GROUPS |\ + TOKEN_ADJUST_DEFAULT) + +#define TOKEN_EXECUTE (STANDARD_RIGHTS_EXECUTE) + +#define TOKEN_SOURCE_LENGTH 8 +/* end winnt.h */ + +#define TOKEN_HAS_TRAVERSE_PRIVILEGE 0x01 +#define TOKEN_HAS_BACKUP_PRIVILEGE 0x02 +#define TOKEN_HAS_RESTORE_PRIVILEGE 0x04 +#define TOKEN_HAS_ADMIN_GROUP 0x08 +#define TOKEN_IS_RESTRICTED 0x10 + +#define VACB_MAPPING_GRANULARITY (0x40000) +#define VACB_OFFSET_SHIFT (18) + +#define FSCTL_REQUEST_OPLOCK_LEVEL_1 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_REQUEST_OPLOCK_LEVEL_2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 1, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_REQUEST_BATCH_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 2, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_OPLOCK_BREAK_ACKNOWLEDGE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 3, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_OPBATCH_ACK_CLOSE_PENDING CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 4, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_OPLOCK_BREAK_NOTIFY CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 5, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_LOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 6, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_UNLOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 7, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_DISMOUNT_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 8, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define FSCTL_IS_VOLUME_MOUNTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 10, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_IS_PATHNAME_VALID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 11, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_MARK_VOLUME_DIRTY CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 12, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define FSCTL_QUERY_RETRIEVAL_POINTERS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 14, METHOD_NEITHER, FILE_ANY_ACCESS) +#define FSCTL_GET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 15, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_SET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 16, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA) + + +#define FSCTL_MARK_AS_SYSTEM_HIVE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 19, METHOD_NEITHER, FILE_ANY_ACCESS) +#define FSCTL_OPLOCK_BREAK_ACK_NO_2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 20, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_INVALIDATE_VOLUMES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 21, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_QUERY_FAT_BPB CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 22, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_REQUEST_FILTER_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 23, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_FILESYSTEM_GET_STATISTICS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 24, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#if (VER_PRODUCTBUILD >= 1381) + +#define FSCTL_GET_NTFS_VOLUME_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 25, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_GET_NTFS_FILE_RECORD CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 26, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_GET_VOLUME_BITMAP CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 27, METHOD_NEITHER, FILE_ANY_ACCESS) +#define FSCTL_GET_RETRIEVAL_POINTERS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 28, METHOD_NEITHER, FILE_ANY_ACCESS) +#define FSCTL_MOVE_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 29, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_IS_VOLUME_DIRTY CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 30, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_GET_HFS_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 31, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_ALLOW_EXTENDED_DASD_IO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 32, METHOD_NEITHER, FILE_ANY_ACCESS) + +#endif /* (VER_PRODUCTBUILD >= 1381) */ + +#if (VER_PRODUCTBUILD >= 2195) + +#define FSCTL_READ_PROPERTY_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 33, METHOD_NEITHER, FILE_ANY_ACCESS) +#define FSCTL_WRITE_PROPERTY_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 34, METHOD_NEITHER, FILE_ANY_ACCESS) +#define FSCTL_FIND_FILES_BY_SID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 35, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define FSCTL_DUMP_PROPERTY_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 37, METHOD_NEITHER, FILE_ANY_ACCESS) +#define FSCTL_SET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 38, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_GET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 39, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_DELETE_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 40, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_SET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 41, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_GET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 42, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_DELETE_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 43, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_ENUM_USN_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 44, METHOD_NEITHER, FILE_READ_DATA) +#define FSCTL_SECURITY_ID_CHECK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 45, METHOD_NEITHER, FILE_READ_DATA) +#define FSCTL_READ_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 46, METHOD_NEITHER, FILE_READ_DATA) +#define FSCTL_SET_OBJECT_ID_EXTENDED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 47, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_CREATE_OR_GET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 48, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_SET_SPARSE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 49, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_SET_ZERO_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 50, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_QUERY_ALLOCATED_RANGES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 51, METHOD_NEITHER, FILE_READ_DATA) +#define FSCTL_ENABLE_UPGRADE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 52, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_SET_ENCRYPTION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 53, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_ENCRYPTION_FSCTL_IO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 54, METHOD_NEITHER, FILE_ANY_ACCESS) +#define FSCTL_WRITE_RAW_ENCRYPTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 55, METHOD_NEITHER, FILE_ANY_ACCESS) +#define FSCTL_READ_RAW_ENCRYPTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 56, METHOD_NEITHER, FILE_ANY_ACCESS) +#define FSCTL_CREATE_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 57, METHOD_NEITHER, FILE_READ_DATA) +#define FSCTL_READ_FILE_USN_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 58, METHOD_NEITHER, FILE_READ_DATA) +#define FSCTL_WRITE_USN_CLOSE_RECORD CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 59, METHOD_NEITHER, FILE_READ_DATA) +#define FSCTL_EXTEND_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 60, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_QUERY_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 61, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_DELETE_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 62, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_MARK_HANDLE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 63, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_SIS_COPYFILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 64, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_SIS_LINK_FILES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 65, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA) +#define FSCTL_HSM_MSG CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 66, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA) +#define FSCTL_NSS_CONTROL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 67, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_HSM_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 68, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA) +#define FSCTL_RECALL_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 69, METHOD_NEITHER, FILE_ANY_ACCESS) +#define FSCTL_NSS_RCONTROL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 70, METHOD_BUFFERED, FILE_READ_DATA) +#define FSCTL_READ_FROM_PLEX CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 71, METHOD_OUT_DIRECT, FILE_READ_DATA) +#define FSCTL_FILE_PREFETCH CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 72, METHOD_BUFFERED, FILE_SPECIAL_ACCESS) + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +#define FSCTL_MAILSLOT_PEEK CTL_CODE(FILE_DEVICE_MAILSLOT, 0, METHOD_NEITHER, FILE_READ_DATA) + +#define FSCTL_NETWORK_SET_CONFIGURATION_INFO CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 102, METHOD_IN_DIRECT, FILE_ANY_ACCESS) +#define FSCTL_NETWORK_GET_CONFIGURATION_INFO CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 103, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) +#define FSCTL_NETWORK_GET_CONNECTION_INFO CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 104, METHOD_NEITHER, FILE_ANY_ACCESS) +#define FSCTL_NETWORK_ENUMERATE_CONNECTIONS CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 105, METHOD_NEITHER, FILE_ANY_ACCESS) +#define FSCTL_NETWORK_DELETE_CONNECTION CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 107, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_NETWORK_GET_STATISTICS CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 116, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_NETWORK_SET_DOMAIN_NAME CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 120, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_NETWORK_REMOTE_BOOT_INIT_SCRT CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 250, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define FSCTL_PIPE_ASSIGN_EVENT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_DISCONNECT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_LISTEN CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_PEEK CTL_CODE(FILE_DEVICE_NAMED_PIPE, 3, METHOD_BUFFERED, FILE_READ_DATA) +#define FSCTL_PIPE_QUERY_EVENT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_TRANSCEIVE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 5, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA) +#define FSCTL_PIPE_WAIT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_IMPERSONATE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_SET_CLIENT_PROCESS CTL_CODE(FILE_DEVICE_NAMED_PIPE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_QUERY_CLIENT_PROCESS CTL_CODE(FILE_DEVICE_NAMED_PIPE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_INTERNAL_READ CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2045, METHOD_BUFFERED, FILE_READ_DATA) +#define FSCTL_PIPE_INTERNAL_WRITE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2046, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_PIPE_INTERNAL_TRANSCEIVE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2047, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA) +#define FSCTL_PIPE_INTERNAL_READ_OVFLOW CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2048, METHOD_BUFFERED, FILE_READ_DATA) + +#define IOCTL_REDIR_QUERY_PATH CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 99, METHOD_NEITHER, FILE_ANY_ACCESS) + +typedef PVOID PEJOB; +typedef PVOID OPLOCK, *POPLOCK; +typedef PVOID PWOW64_PROCESS; + +typedef struct _CACHE_MANAGER_CALLBACKS *PCACHE_MANAGER_CALLBACKS; +typedef struct _EPROCESS_QUOTA_BLOCK *PEPROCESS_QUOTA_BLOCK; +typedef struct _FILE_GET_QUOTA_INFORMATION *PFILE_GET_QUOTA_INFORMATION; +typedef struct _HANDLE_TABLE *PHANDLE_TABLE; +typedef struct _KEVENT_PAIR *PKEVENT_PAIR; +typedef struct _KPROCESS *PKPROCESS; +typedef struct _KQUEUE *PKQUEUE; +typedef struct _KTRAP_FRAME *PKTRAP_FRAME; +typedef struct _MAILSLOT_CREATE_PARAMETERS *PMAILSLOT_CREATE_PARAMETERS; +typedef struct _MMWSL *PMMWSL; +typedef struct _NAMED_PIPE_CREATE_PARAMETERS *PNAMED_PIPE_CREATE_PARAMETERS; +typedef struct _OBJECT_DIRECTORY *POBJECT_DIRECTORY; +typedef struct _PAGEFAULT_HISTORY *PPAGEFAULT_HISTORY; +typedef struct _PS_IMPERSONATION_INFORMATION *PPS_IMPERSONATION_INFORMATION; +typedef struct _SECTION_OBJECT *PSECTION_OBJECT; +typedef struct _SHARED_CACHE_MAP *PSHARED_CACHE_MAP; +typedef struct _TERMINATION_PORT *PTERMINATION_PORT; +typedef struct _VACB *PVACB; +typedef struct _VAD_HEADER *PVAD_HEADER; + +typedef struct _NOTIFY_SYNC +{ + ULONG Unknown0; + ULONG Unknown1; + ULONG Unknown2; + USHORT Unknown3; + USHORT Unknown4; + ULONG Unknown5; + ULONG Unknown6; + ULONG Unknown7; + ULONG Unknown8; + ULONG Unknown9; + ULONG Unknown10; +} NOTIFY_SYNC, * PNOTIFY_SYNC; + +typedef enum _FAST_IO_POSSIBLE { + FastIoIsNotPossible, + FastIoIsPossible, + FastIoIsQuestionable +} FAST_IO_POSSIBLE; + +typedef enum _FILE_STORAGE_TYPE { + StorageTypeDefault = 1, + StorageTypeDirectory, + StorageTypeFile, + StorageTypeJunctionPoint, + StorageTypeCatalog, + StorageTypeStructuredStorage, + StorageTypeEmbedding, + StorageTypeStream +} FILE_STORAGE_TYPE; + +typedef enum _IO_COMPLETION_INFORMATION_CLASS { + IoCompletionBasicInformation +} IO_COMPLETION_INFORMATION_CLASS; + +typedef enum _OBJECT_INFO_CLASS { + ObjectBasicInfo, + ObjectNameInfo, + ObjectTypeInfo, + ObjectAllTypesInfo, + ObjectProtectionInfo +} OBJECT_INFO_CLASS; + +typedef struct _HARDWARE_PTE_X86 { + ULONG Valid : 1; + ULONG Write : 1; + ULONG Owner : 1; + ULONG WriteThrough : 1; + ULONG CacheDisable : 1; + ULONG Accessed : 1; + ULONG Dirty : 1; + ULONG LargePage : 1; + ULONG Global : 1; + ULONG CopyOnWrite : 1; + ULONG Prototype : 1; + ULONG reserved : 1; + ULONG PageFrameNumber : 20; +} HARDWARE_PTE_X86, *PHARDWARE_PTE_X86; + +typedef struct _KAPC_STATE { + LIST_ENTRY ApcListHead[2]; + PKPROCESS Process; + BOOLEAN KernelApcInProgress; + BOOLEAN KernelApcPending; + BOOLEAN UserApcPending; +} KAPC_STATE, *PKAPC_STATE; + +typedef struct _KGDTENTRY { + USHORT LimitLow; + USHORT BaseLow; + union { + struct { + UCHAR BaseMid; + UCHAR Flags1; + UCHAR Flags2; + UCHAR BaseHi; + } Bytes; + struct { + ULONG BaseMid : 8; + ULONG Type : 5; + ULONG Dpl : 2; + ULONG Pres : 1; + ULONG LimitHi : 4; + ULONG Sys : 1; + ULONG Reserved_0 : 1; + ULONG Default_Big : 1; + ULONG Granularity : 1; + ULONG BaseHi : 8; + } Bits; + } HighWord; +} KGDTENTRY, *PKGDTENTRY; + +typedef struct _KIDTENTRY { + USHORT Offset; + USHORT Selector; + USHORT Access; + USHORT ExtendedOffset; +} KIDTENTRY, *PKIDTENTRY; + +#if (VER_PRODUCTBUILD >= 2600) + +typedef struct _MMSUPPORT_FLAGS { + ULONG SessionSpace : 1; + ULONG BeingTrimmed : 1; + ULONG SessionLeader : 1; + ULONG TrimHard : 1; + ULONG WorkingSetHard : 1; + ULONG AddressSpaceBeingDeleted : 1; + ULONG Available : 10; + ULONG AllowWorkingSetAdjustment : 8; + ULONG MemoryPriority : 8; +} MMSUPPORT_FLAGS, *PMMSUPPORT_FLAGS; + +#else + +typedef struct _MMSUPPORT_FLAGS { + ULONG SessionSpace : 1; + ULONG BeingTrimmed : 1; + ULONG ProcessInSession : 1; + ULONG SessionLeader : 1; + ULONG TrimHard : 1; + ULONG WorkingSetHard : 1; + ULONG WriteWatch : 1; + ULONG Filler : 25; +} MMSUPPORT_FLAGS, *PMMSUPPORT_FLAGS; + +#endif + +#if (VER_PRODUCTBUILD >= 2600) + +typedef struct _MMSUPPORT { + LARGE_INTEGER LastTrimTime; + MMSUPPORT_FLAGS Flags; + ULONG PageFaultCount; + ULONG PeakWorkingSetSize; + ULONG WorkingSetSize; + ULONG MinimumWorkingSetSize; + ULONG MaximumWorkingSetSize; + PMMWSL VmWorkingSetList; + LIST_ENTRY WorkingSetExpansionLinks; + ULONG Claim; + ULONG NextEstimationSlot; + ULONG NextAgingSlot; + ULONG EstimatedAvailable; + ULONG GrowthSinceLastEstimate; +} MMSUPPORT, *PMMSUPPORT; + +#else + +typedef struct _MMSUPPORT { + LARGE_INTEGER LastTrimTime; + ULONG LastTrimFaultCount; + ULONG PageFaultCount; + ULONG PeakWorkingSetSize; + ULONG WorkingSetSize; + ULONG MinimumWorkingSetSize; + ULONG MaximumWorkingSetSize; + PMMWSL VmWorkingSetList; + LIST_ENTRY WorkingSetExpansionLinks; + BOOLEAN AllowWorkingSetAdjustment; + BOOLEAN AddressSpaceBeingDeleted; + UCHAR ForegroundSwitchCount; + UCHAR MemoryPriority; +#if (VER_PRODUCTBUILD >= 2195) + union { + ULONG LongFlags; + MMSUPPORT_FLAGS Flags; + } u; + ULONG Claim; + ULONG NextEstimationSlot; + ULONG NextAgingSlot; + ULONG EstimatedAvailable; + ULONG GrowthSinceLastEstimate; +#endif /* (VER_PRODUCTBUILD >= 2195) */ +} MMSUPPORT, *PMMSUPPORT; + +#endif + +typedef struct _SE_AUDIT_PROCESS_CREATION_INFO { + POBJECT_NAME_INFORMATION ImageFileName; +} SE_AUDIT_PROCESS_CREATION_INFO, *PSE_AUDIT_PROCESS_CREATION_INFO; + +typedef struct _BITMAP_RANGE { + LIST_ENTRY Links; + LARGE_INTEGER BasePage; + ULONG FirstDirtyPage; + ULONG LastDirtyPage; + ULONG DirtyPages; + PULONG Bitmap; +} BITMAP_RANGE, *PBITMAP_RANGE; + +typedef struct _CACHE_UNINITIALIZE_EVENT { + struct _CACHE_UNINITIALIZE_EVENT *Next; + KEVENT Event; +} CACHE_UNINITIALIZE_EVENT, *PCACHE_UNINITIALIZE_EVENT; + +typedef struct _CC_FILE_SIZES { + LARGE_INTEGER AllocationSize; + LARGE_INTEGER FileSize; + LARGE_INTEGER ValidDataLength; +} CC_FILE_SIZES, *PCC_FILE_SIZES; + +typedef struct _COMPRESSED_DATA_INFO { + USHORT CompressionFormatAndEngine; + UCHAR CompressionUnitShift; + UCHAR ChunkShift; + UCHAR ClusterShift; + UCHAR Reserved; + USHORT NumberOfChunks; + ULONG CompressedChunkSizes[ANYSIZE_ARRAY]; +} COMPRESSED_DATA_INFO, *PCOMPRESSED_DATA_INFO; + +typedef struct _DEVICE_MAP { + POBJECT_DIRECTORY DosDevicesDirectory; + POBJECT_DIRECTORY GlobalDosDevicesDirectory; + ULONG ReferenceCount; + ULONG DriveMap; + UCHAR DriveType[32]; +} DEVICE_MAP, *PDEVICE_MAP; + +#if (VER_PRODUCTBUILD >= 2600) + +typedef struct _EX_FAST_REF { + _ANONYMOUS_UNION union { + PVOID Object; + ULONG RefCnt : 3; + ULONG Value; + } DUMMYUNIONNAME; +} EX_FAST_REF, *PEX_FAST_REF; + +typedef struct _EX_PUSH_LOCK { + _ANONYMOUS_UNION union { + _ANONYMOUS_STRUCT struct { + ULONG Waiting : 1; + ULONG Exclusive : 1; + ULONG Shared : 30; + } DUMMYSTRUCTNAME; + ULONG Value; + PVOID Ptr; + } DUMMYUNIONNAME; +} EX_PUSH_LOCK, *PEX_PUSH_LOCK; + +typedef struct _EX_RUNDOWN_REF { + _ANONYMOUS_UNION union { + ULONG Count; + PVOID Ptr; + } DUMMYUNIONNAME; +} EX_RUNDOWN_REF, *PEX_RUNDOWN_REF; + +#endif + +typedef struct _EPROCESS_QUOTA_ENTRY { + ULONG Usage; + ULONG Limit; + ULONG Peak; + ULONG Return; +} EPROCESS_QUOTA_ENTRY, *PEPROCESS_QUOTA_ENTRY; + +typedef struct _EPROCESS_QUOTA_BLOCK { + EPROCESS_QUOTA_ENTRY QuotaEntry[3]; + LIST_ENTRY QuotaList; + ULONG ReferenceCount; + ULONG ProcessCount; +} EPROCESS_QUOTA_BLOCK, *PEPROCESS_QUOTA_BLOCK; + +/* + * When needing these parameters cast your PIO_STACK_LOCATION to + * PEXTENDED_IO_STACK_LOCATION + */ +#if !defined(_ALPHA_) +#include <pshpack4.h> +#endif +typedef struct _EXTENDED_IO_STACK_LOCATION { + + /* Included for padding */ + UCHAR MajorFunction; + UCHAR MinorFunction; + UCHAR Flags; + UCHAR Control; + + union { + + struct { + PIO_SECURITY_CONTEXT SecurityContext; + ULONG Options; + USHORT Reserved; + USHORT ShareAccess; + PMAILSLOT_CREATE_PARAMETERS Parameters; + } CreateMailslot; + + struct { + PIO_SECURITY_CONTEXT SecurityContext; + ULONG Options; + USHORT Reserved; + USHORT ShareAccess; + PNAMED_PIPE_CREATE_PARAMETERS Parameters; + } CreatePipe; + + struct { + ULONG OutputBufferLength; + ULONG InputBufferLength; + ULONG FsControlCode; + PVOID Type3InputBuffer; + } FileSystemControl; + + struct { + PLARGE_INTEGER Length; + ULONG Key; + LARGE_INTEGER ByteOffset; + } LockControl; + + struct { + ULONG Length; + ULONG CompletionFilter; + } NotifyDirectory; + + struct { + ULONG Length; + PUNICODE_STRING FileName; + FILE_INFORMATION_CLASS FileInformationClass; + ULONG FileIndex; + } QueryDirectory; + + struct { + ULONG Length; + PVOID EaList; + ULONG EaListLength; + ULONG EaIndex; + } QueryEa; + + struct { + ULONG Length; + PSID StartSid; + PFILE_GET_QUOTA_INFORMATION SidList; + ULONG SidListLength; + } QueryQuota; + + struct { + ULONG Length; + } SetEa; + + struct { + ULONG Length; + } SetQuota; + + struct { + ULONG Length; + FS_INFORMATION_CLASS FsInformationClass; + } SetVolume; + + } Parameters; + PDEVICE_OBJECT DeviceObject; + PFILE_OBJECT FileObject; + PIO_COMPLETION_ROUTINE CompletionRoutine; + PVOID Context; + +} EXTENDED_IO_STACK_LOCATION, *PEXTENDED_IO_STACK_LOCATION; +#if !defined(_ALPHA_) +#include <poppack.h> +#endif + +typedef struct _FILE_ACCESS_INFORMATION { + ACCESS_MASK AccessFlags; +} FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION; + +typedef struct _FILE_ALLOCATION_INFORMATION { + LARGE_INTEGER AllocationSize; +} FILE_ALLOCATION_INFORMATION, *PFILE_ALLOCATION_INFORMATION; + +typedef struct _FILE_BOTH_DIR_INFORMATION { + ULONG NextEntryOffset; + ULONG FileIndex; + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER EndOfFile; + LARGE_INTEGER AllocationSize; + ULONG FileAttributes; + ULONG FileNameLength; + ULONG EaSize; + CCHAR ShortNameLength; + WCHAR ShortName[12]; + WCHAR FileName[1]; +} FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION; + +typedef struct _FILE_COMPLETION_INFORMATION { + HANDLE Port; + ULONG Key; +} FILE_COMPLETION_INFORMATION, *PFILE_COMPLETION_INFORMATION; + +typedef struct _FILE_COMPRESSION_INFORMATION { + LARGE_INTEGER CompressedFileSize; + USHORT CompressionFormat; + UCHAR CompressionUnitShift; + UCHAR ChunkShift; + UCHAR ClusterShift; + UCHAR Reserved[3]; +} FILE_COMPRESSION_INFORMATION, *PFILE_COMPRESSION_INFORMATION; + +typedef struct _FILE_COPY_ON_WRITE_INFORMATION { + BOOLEAN ReplaceIfExists; + HANDLE RootDirectory; + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_COPY_ON_WRITE_INFORMATION, *PFILE_COPY_ON_WRITE_INFORMATION; + +typedef struct _FILE_DIRECTORY_INFORMATION { + ULONG NextEntryOffset; + ULONG FileIndex; + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER EndOfFile; + LARGE_INTEGER AllocationSize; + ULONG FileAttributes; + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION; + +typedef struct _FILE_FULL_DIRECTORY_INFORMATION { + ULONG NextEntryOffset; + ULONG FileIndex; + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER EndOfFile; + LARGE_INTEGER AllocationSize; + ULONG FileAttributes; + ULONG FileNameLength; + ULONG EaSize; + WCHAR FileName[0]; +} FILE_FULL_DIRECTORY_INFORMATION, *PFILE_FULL_DIRECTORY_INFORMATION; + +typedef struct _FILE_BOTH_DIRECTORY_INFORMATION { + ULONG NextEntryOffset; + ULONG FileIndex; + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER EndOfFile; + LARGE_INTEGER AllocationSize; + ULONG FileAttributes; + ULONG FileNameLength; + ULONG EaSize; + CHAR ShortNameLength; + WCHAR ShortName[12]; + WCHAR FileName[0]; +} FILE_BOTH_DIRECTORY_INFORMATION, *PFILE_BOTH_DIRECTORY_INFORMATION; + +typedef struct _FILE_EA_INFORMATION { + ULONG EaSize; +} FILE_EA_INFORMATION, *PFILE_EA_INFORMATION; + +typedef struct _FILE_FS_ATTRIBUTE_INFORMATION { + ULONG FileSystemAttributes; + ULONG MaximumComponentNameLength; + ULONG FileSystemNameLength; + WCHAR FileSystemName[1]; +} FILE_FS_ATTRIBUTE_INFORMATION, *PFILE_FS_ATTRIBUTE_INFORMATION; + +typedef struct _FILE_FS_CONTROL_INFORMATION { + LARGE_INTEGER FreeSpaceStartFiltering; + LARGE_INTEGER FreeSpaceThreshold; + LARGE_INTEGER FreeSpaceStopFiltering; + LARGE_INTEGER DefaultQuotaThreshold; + LARGE_INTEGER DefaultQuotaLimit; + ULONG FileSystemControlFlags; +} FILE_FS_CONTROL_INFORMATION, *PFILE_FS_CONTROL_INFORMATION; + +typedef struct _FILE_FS_FULL_SIZE_INFORMATION { + LARGE_INTEGER TotalAllocationUnits; + LARGE_INTEGER CallerAvailableAllocationUnits; + LARGE_INTEGER ActualAvailableAllocationUnits; + ULONG SectorsPerAllocationUnit; + ULONG BytesPerSector; +} FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION; + +typedef struct _FILE_FS_LABEL_INFORMATION { + ULONG VolumeLabelLength; + WCHAR VolumeLabel[1]; +} FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION; + +#if (VER_PRODUCTBUILD >= 2195) + +typedef struct _FILE_FS_OBJECT_ID_INFORMATION { + UCHAR ObjectId[16]; + UCHAR ExtendedInfo[48]; +} FILE_FS_OBJECT_ID_INFORMATION, *PFILE_FS_OBJECT_ID_INFORMATION; + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +typedef struct _FILE_FS_SIZE_INFORMATION { + LARGE_INTEGER TotalAllocationUnits; + LARGE_INTEGER AvailableAllocationUnits; + ULONG SectorsPerAllocationUnit; + ULONG BytesPerSector; +} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION; + +typedef struct _FILE_FS_VOLUME_INFORMATION { + LARGE_INTEGER VolumeCreationTime; + ULONG VolumeSerialNumber; + ULONG VolumeLabelLength; + BOOLEAN SupportsObjects; + WCHAR VolumeLabel[1]; +} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION; + +typedef struct _FILE_FULL_DIR_INFORMATION { + ULONG NextEntryOffset; + ULONG FileIndex; + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER EndOfFile; + LARGE_INTEGER AllocationSize; + ULONG FileAttributes; + ULONG FileNameLength; + ULONG EaSize; + WCHAR FileName[1]; +} FILE_FULL_DIR_INFORMATION, *PFILE_FULL_DIR_INFORMATION; + +typedef struct _FILE_GET_EA_INFORMATION { + ULONG NextEntryOffset; + UCHAR EaNameLength; + CHAR EaName[1]; +} FILE_GET_EA_INFORMATION, *PFILE_GET_EA_INFORMATION; + +typedef struct _FILE_GET_QUOTA_INFORMATION { + ULONG NextEntryOffset; + ULONG SidLength; + SID Sid; +} FILE_GET_QUOTA_INFORMATION, *PFILE_GET_QUOTA_INFORMATION; + +typedef struct _FILE_INTERNAL_INFORMATION { + LARGE_INTEGER IndexNumber; +} FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION; + +typedef struct _FILE_LINK_INFORMATION { + BOOLEAN ReplaceIfExists; + HANDLE RootDirectory; + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_LINK_INFORMATION, *PFILE_LINK_INFORMATION; + +typedef struct _FILE_LOCK_INFO { + LARGE_INTEGER StartingByte; + LARGE_INTEGER Length; + BOOLEAN ExclusiveLock; + ULONG Key; + PFILE_OBJECT FileObject; + PEPROCESS Process; + LARGE_INTEGER EndingByte; +} FILE_LOCK_INFO, *PFILE_LOCK_INFO; + +/* raw internal file lock struct returned from FsRtlGetNextFileLock */ +typedef struct _FILE_SHARED_LOCK_ENTRY { + PVOID Unknown1; + PVOID Unknown2; + FILE_LOCK_INFO FileLock; +} FILE_SHARED_LOCK_ENTRY, *PFILE_SHARED_LOCK_ENTRY; + +/* raw internal file lock struct returned from FsRtlGetNextFileLock */ +typedef struct _FILE_EXCLUSIVE_LOCK_ENTRY { + LIST_ENTRY ListEntry; + PVOID Unknown1; + PVOID Unknown2; + FILE_LOCK_INFO FileLock; +} FILE_EXCLUSIVE_LOCK_ENTRY, *PFILE_EXCLUSIVE_LOCK_ENTRY; + +typedef NTSTATUS (*PCOMPLETE_LOCK_IRP_ROUTINE) ( + IN PVOID Context, + IN PIRP Irp +); + +typedef VOID (NTAPI *PUNLOCK_ROUTINE) ( + IN PVOID Context, + IN PFILE_LOCK_INFO FileLockInfo +); + +typedef struct _FILE_LOCK { + PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine; + PUNLOCK_ROUTINE UnlockRoutine; + BOOLEAN FastIoIsQuestionable; + BOOLEAN Pad[3]; + PVOID LockInformation; + FILE_LOCK_INFO LastReturnedLockInfo; + PVOID LastReturnedLock; +} FILE_LOCK, *PFILE_LOCK; + +typedef struct _FILE_MAILSLOT_PEEK_BUFFER { + ULONG ReadDataAvailable; + ULONG NumberOfMessages; + ULONG MessageLength; +} FILE_MAILSLOT_PEEK_BUFFER, *PFILE_MAILSLOT_PEEK_BUFFER; + +typedef struct _FILE_MAILSLOT_QUERY_INFORMATION { + ULONG MaximumMessageSize; + ULONG MailslotQuota; + ULONG NextMessageSize; + ULONG MessagesAvailable; + LARGE_INTEGER ReadTimeout; +} FILE_MAILSLOT_QUERY_INFORMATION, *PFILE_MAILSLOT_QUERY_INFORMATION; + +typedef struct _FILE_MAILSLOT_SET_INFORMATION { + LARGE_INTEGER ReadTimeout; +} FILE_MAILSLOT_SET_INFORMATION, *PFILE_MAILSLOT_SET_INFORMATION; + +typedef struct _FILE_MODE_INFORMATION { + ULONG Mode; +} FILE_MODE_INFORMATION, *PFILE_MODE_INFORMATION; + +typedef struct _FILE_ALL_INFORMATION { + FILE_BASIC_INFORMATION BasicInformation; + FILE_STANDARD_INFORMATION StandardInformation; + FILE_INTERNAL_INFORMATION InternalInformation; + FILE_EA_INFORMATION EaInformation; + FILE_ACCESS_INFORMATION AccessInformation; + FILE_POSITION_INFORMATION PositionInformation; + FILE_MODE_INFORMATION ModeInformation; + FILE_ALIGNMENT_INFORMATION AlignmentInformation; + FILE_NAME_INFORMATION NameInformation; +} FILE_ALL_INFORMATION, *PFILE_ALL_INFORMATION; + +typedef struct _FILE_NAMES_INFORMATION { + ULONG NextEntryOffset; + ULONG FileIndex; + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION; + +typedef struct _FILE_OBJECTID_INFORMATION { + LONGLONG FileReference; + UCHAR ObjectId[16]; + _ANONYMOUS_UNION union { + struct { + UCHAR BirthVolumeId[16]; + UCHAR BirthObjectId[16]; + UCHAR DomainId[16]; + } ; + UCHAR ExtendedInfo[48]; + } DUMMYUNIONNAME; +} FILE_OBJECTID_INFORMATION, *PFILE_OBJECTID_INFORMATION; + +typedef struct _FILE_OLE_CLASSID_INFORMATION { + GUID ClassId; +} FILE_OLE_CLASSID_INFORMATION, *PFILE_OLE_CLASSID_INFORMATION; + +typedef struct _FILE_OLE_ALL_INFORMATION { + FILE_BASIC_INFORMATION BasicInformation; + FILE_STANDARD_INFORMATION StandardInformation; + FILE_INTERNAL_INFORMATION InternalInformation; + FILE_EA_INFORMATION EaInformation; + FILE_ACCESS_INFORMATION AccessInformation; + FILE_POSITION_INFORMATION PositionInformation; + FILE_MODE_INFORMATION ModeInformation; + FILE_ALIGNMENT_INFORMATION AlignmentInformation; + USN LastChangeUsn; + USN ReplicationUsn; + LARGE_INTEGER SecurityChangeTime; + FILE_OLE_CLASSID_INFORMATION OleClassIdInformation; + FILE_OBJECTID_INFORMATION ObjectIdInformation; + FILE_STORAGE_TYPE StorageType; + ULONG OleStateBits; + ULONG OleId; + ULONG NumberOfStreamReferences; + ULONG StreamIndex; + ULONG SecurityId; + BOOLEAN ContentIndexDisable; + BOOLEAN InheritContentIndexDisable; + FILE_NAME_INFORMATION NameInformation; +} FILE_OLE_ALL_INFORMATION, *PFILE_OLE_ALL_INFORMATION; + +typedef struct _FILE_OLE_DIR_INFORMATION { + ULONG NextEntryOffset; + ULONG FileIndex; + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER EndOfFile; + LARGE_INTEGER AllocationSize; + ULONG FileAttributes; + ULONG FileNameLength; + FILE_STORAGE_TYPE StorageType; + GUID OleClassId; + ULONG OleStateBits; + BOOLEAN ContentIndexDisable; + BOOLEAN InheritContentIndexDisable; + WCHAR FileName[1]; +} FILE_OLE_DIR_INFORMATION, *PFILE_OLE_DIR_INFORMATION; + +typedef struct _FILE_OLE_INFORMATION { + LARGE_INTEGER SecurityChangeTime; + FILE_OLE_CLASSID_INFORMATION OleClassIdInformation; + FILE_OBJECTID_INFORMATION ObjectIdInformation; + FILE_STORAGE_TYPE StorageType; + ULONG OleStateBits; + BOOLEAN ContentIndexDisable; + BOOLEAN InheritContentIndexDisable; +} FILE_OLE_INFORMATION, *PFILE_OLE_INFORMATION; + +typedef struct _FILE_OLE_STATE_BITS_INFORMATION { + ULONG StateBits; + ULONG StateBitsMask; +} FILE_OLE_STATE_BITS_INFORMATION, *PFILE_OLE_STATE_BITS_INFORMATION; + +typedef struct _FILE_PIPE_ASSIGN_EVENT_BUFFER { + HANDLE EventHandle; + ULONG KeyValue; +} FILE_PIPE_ASSIGN_EVENT_BUFFER, *PFILE_PIPE_ASSIGN_EVENT_BUFFER; + +typedef struct _FILE_PIPE_CLIENT_PROCESS_BUFFER { + PVOID ClientSession; + PVOID ClientProcess; +} FILE_PIPE_CLIENT_PROCESS_BUFFER, *PFILE_PIPE_CLIENT_PROCESS_BUFFER; + +typedef struct _FILE_PIPE_EVENT_BUFFER { + ULONG NamedPipeState; + ULONG EntryType; + ULONG ByteCount; + ULONG KeyValue; + ULONG NumberRequests; +} FILE_PIPE_EVENT_BUFFER, *PFILE_PIPE_EVENT_BUFFER; + +typedef struct _FILE_PIPE_INFORMATION { + ULONG ReadMode; + ULONG CompletionMode; +} FILE_PIPE_INFORMATION, *PFILE_PIPE_INFORMATION; + +typedef struct _FILE_PIPE_LOCAL_INFORMATION { + ULONG NamedPipeType; + ULONG NamedPipeConfiguration; + ULONG MaximumInstances; + ULONG CurrentInstances; + ULONG InboundQuota; + ULONG ReadDataAvailable; + ULONG OutboundQuota; + ULONG WriteQuotaAvailable; + ULONG NamedPipeState; + ULONG NamedPipeEnd; +} FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION; + +typedef struct _FILE_PIPE_REMOTE_INFORMATION { + LARGE_INTEGER CollectDataTime; + ULONG MaximumCollectionCount; +} FILE_PIPE_REMOTE_INFORMATION, *PFILE_PIPE_REMOTE_INFORMATION; + +typedef struct _FILE_PIPE_WAIT_FOR_BUFFER { + LARGE_INTEGER Timeout; + ULONG NameLength; + BOOLEAN TimeoutSpecified; + WCHAR Name[1]; +} FILE_PIPE_WAIT_FOR_BUFFER, *PFILE_PIPE_WAIT_FOR_BUFFER; + +typedef struct _FILE_QUOTA_INFORMATION { + ULONG NextEntryOffset; + ULONG SidLength; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER QuotaUsed; + LARGE_INTEGER QuotaThreshold; + LARGE_INTEGER QuotaLimit; + SID Sid; +} FILE_QUOTA_INFORMATION, *PFILE_QUOTA_INFORMATION; + +typedef struct _FILE_RENAME_INFORMATION { + BOOLEAN ReplaceIfExists; + HANDLE RootDirectory; + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION; + +typedef struct _FILE_STREAM_INFORMATION { + ULONG NextEntryOffset; + ULONG StreamNameLength; + LARGE_INTEGER StreamSize; + LARGE_INTEGER StreamAllocationSize; + WCHAR StreamName[1]; +} FILE_STREAM_INFORMATION, *PFILE_STREAM_INFORMATION; + +typedef struct _FILE_TRACKING_INFORMATION { + HANDLE DestinationFile; + ULONG ObjectInformationLength; + CHAR ObjectInformation[1]; +} FILE_TRACKING_INFORMATION, *PFILE_TRACKING_INFORMATION; + +typedef struct _FSRTL_COMMON_FCB_HEADER { + CSHORT NodeTypeCode; + CSHORT NodeByteSize; + UCHAR Flags; + UCHAR IsFastIoPossible; +#if (VER_PRODUCTBUILD >= 1381) + UCHAR Flags2; + UCHAR Reserved; +#endif /* (VER_PRODUCTBUILD >= 1381) */ + PERESOURCE Resource; + PERESOURCE PagingIoResource; + LARGE_INTEGER AllocationSize; + LARGE_INTEGER FileSize; + LARGE_INTEGER ValidDataLength; +} FSRTL_COMMON_FCB_HEADER, *PFSRTL_COMMON_FCB_HEADER; + +typedef struct _GENERATE_NAME_CONTEXT { + USHORT Checksum; + BOOLEAN CheckSumInserted; + UCHAR NameLength; + WCHAR NameBuffer[8]; + ULONG ExtensionLength; + WCHAR ExtensionBuffer[4]; + ULONG LastIndexValue; +} GENERATE_NAME_CONTEXT, *PGENERATE_NAME_CONTEXT; + +typedef struct _HANDLE_TABLE_ENTRY { + PVOID Object; + ULONG ObjectAttributes; + ULONG GrantedAccess; + USHORT GrantedAccessIndex; + USHORT CreatorBackTraceIndex; + ULONG NextFreeTableEntry; +} HANDLE_TABLE_ENTRY, *PHANDLE_TABLE_ENTRY; + +typedef struct _MAPPING_PAIR { + ULONGLONG Vcn; + ULONGLONG Lcn; +} MAPPING_PAIR, *PMAPPING_PAIR; + +typedef struct _GET_RETRIEVAL_DESCRIPTOR { + ULONG NumberOfPairs; + ULONGLONG StartVcn; + MAPPING_PAIR Pair[1]; +} GET_RETRIEVAL_DESCRIPTOR, *PGET_RETRIEVAL_DESCRIPTOR; + +typedef struct _IO_CLIENT_EXTENSION { + struct _IO_CLIENT_EXTENSION *NextExtension; + PVOID ClientIdentificationAddress; +} IO_CLIENT_EXTENSION, *PIO_CLIENT_EXTENSION; + +typedef struct _IO_COMPLETION_BASIC_INFORMATION { + LONG Depth; +} IO_COMPLETION_BASIC_INFORMATION, *PIO_COMPLETION_BASIC_INFORMATION; + +typedef struct _KEVENT_PAIR { + USHORT Type; + USHORT Size; + KEVENT Event1; + KEVENT Event2; +} KEVENT_PAIR, *PKEVENT_PAIR; + +typedef struct _KQUEUE { + DISPATCHER_HEADER Header; + LIST_ENTRY EntryListHead; + ULONG CurrentCount; + ULONG MaximumCount; + LIST_ENTRY ThreadListHead; +} KQUEUE, *PKQUEUE, *RESTRICTED_POINTER PRKQUEUE; + +typedef struct _MAILSLOT_CREATE_PARAMETERS { + ULONG MailslotQuota; + ULONG MaximumMessageSize; + LARGE_INTEGER ReadTimeout; + BOOLEAN TimeoutSpecified; +} MAILSLOT_CREATE_PARAMETERS, *PMAILSLOT_CREATE_PARAMETERS; + +typedef struct _MBCB { + CSHORT NodeTypeCode; + CSHORT NodeIsInZone; + ULONG PagesToWrite; + ULONG DirtyPages; + ULONG Reserved; + LIST_ENTRY BitmapRanges; + LONGLONG ResumeWritePage; + BITMAP_RANGE BitmapRange1; + BITMAP_RANGE BitmapRange2; + BITMAP_RANGE BitmapRange3; +} MBCB, *PMBCB; + +typedef struct _MOVEFILE_DESCRIPTOR { + HANDLE FileHandle; + ULONG Reserved; + LARGE_INTEGER StartVcn; + LARGE_INTEGER TargetLcn; + ULONG NumVcns; + ULONG Reserved1; +} MOVEFILE_DESCRIPTOR, *PMOVEFILE_DESCRIPTOR; + +typedef struct _NAMED_PIPE_CREATE_PARAMETERS { + ULONG NamedPipeType; + ULONG ReadMode; + ULONG CompletionMode; + ULONG MaximumInstances; + ULONG InboundQuota; + ULONG OutboundQuota; + LARGE_INTEGER DefaultTimeout; + BOOLEAN TimeoutSpecified; +} NAMED_PIPE_CREATE_PARAMETERS, *PNAMED_PIPE_CREATE_PARAMETERS; + +typedef struct _OBJECT_BASIC_INFO { + ULONG Attributes; + ACCESS_MASK GrantedAccess; + ULONG HandleCount; + ULONG ReferenceCount; + ULONG PagedPoolUsage; + ULONG NonPagedPoolUsage; + ULONG Reserved[3]; + ULONG NameInformationLength; + ULONG TypeInformationLength; + ULONG SecurityDescriptorLength; + LARGE_INTEGER CreateTime; +} OBJECT_BASIC_INFO, *POBJECT_BASIC_INFO; + +typedef struct _OBJECT_HANDLE_ATTRIBUTE_INFO { + BOOLEAN Inherit; + BOOLEAN ProtectFromClose; +} OBJECT_HANDLE_ATTRIBUTE_INFO, *POBJECT_HANDLE_ATTRIBUTE_INFO; + +typedef struct _OBJECT_NAME_INFO { + UNICODE_STRING ObjectName; + WCHAR ObjectNameBuffer[1]; +} OBJECT_NAME_INFO, *POBJECT_NAME_INFO; + +typedef struct _OBJECT_PROTECTION_INFO { + BOOLEAN Inherit; + BOOLEAN ProtectHandle; +} OBJECT_PROTECTION_INFO, *POBJECT_PROTECTION_INFO; + +typedef struct _OBJECT_TYPE_INFO { + UNICODE_STRING ObjectTypeName; + UCHAR Unknown[0x58]; + WCHAR ObjectTypeNameBuffer[1]; +} OBJECT_TYPE_INFO, *POBJECT_TYPE_INFO; + +typedef struct _OBJECT_ALL_TYPES_INFO { + ULONG NumberOfObjectTypes; + OBJECT_TYPE_INFO ObjectsTypeInfo[1]; +} OBJECT_ALL_TYPES_INFO, *POBJECT_ALL_TYPES_INFO; + +typedef struct _PAGEFAULT_HISTORY { + ULONG CurrentIndex; + ULONG MaxIndex; + KSPIN_LOCK SpinLock; + PVOID Reserved; + PROCESS_WS_WATCH_INFORMATION WatchInfo[1]; +} PAGEFAULT_HISTORY, *PPAGEFAULT_HISTORY; + +typedef struct _PATHNAME_BUFFER { + ULONG PathNameLength; + WCHAR Name[1]; +} PATHNAME_BUFFER, *PPATHNAME_BUFFER; + +#if (VER_PRODUCTBUILD >= 2600) + +typedef struct _PRIVATE_CACHE_MAP_FLAGS { + ULONG DontUse : 16; + ULONG ReadAheadActive : 1; + ULONG ReadAheadEnabled : 1; + ULONG Available : 14; +} PRIVATE_CACHE_MAP_FLAGS, *PPRIVATE_CACHE_MAP_FLAGS; + +typedef struct _PRIVATE_CACHE_MAP { + _ANONYMOUS_UNION union { + CSHORT NodeTypeCode; + PRIVATE_CACHE_MAP_FLAGS Flags; + ULONG UlongFlags; + } DUMMYUNIONNAME; + ULONG ReadAheadMask; + PFILE_OBJECT FileObject; + LARGE_INTEGER FileOffset1; + LARGE_INTEGER BeyondLastByte1; + LARGE_INTEGER FileOffset2; + LARGE_INTEGER BeyondLastByte2; + LARGE_INTEGER ReadAheadOffset[2]; + ULONG ReadAheadLength[2]; + KSPIN_LOCK ReadAheadSpinLock; + LIST_ENTRY PrivateLinks; +} PRIVATE_CACHE_MAP, *PPRIVATE_CACHE_MAP; + +#endif + +typedef struct _PS_IMPERSONATION_INFORMATION { + PACCESS_TOKEN Token; + BOOLEAN CopyOnOpen; + BOOLEAN EffectiveOnly; + SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; +} PS_IMPERSONATION_INFORMATION, *PPS_IMPERSONATION_INFORMATION; + +typedef struct _PUBLIC_BCB { + CSHORT NodeTypeCode; + CSHORT NodeByteSize; + ULONG MappedLength; + LARGE_INTEGER MappedFileOffset; +} PUBLIC_BCB, *PPUBLIC_BCB; + +typedef struct _QUERY_PATH_REQUEST { + ULONG PathNameLength; + PIO_SECURITY_CONTEXT SecurityContext; + WCHAR FilePathName[1]; +} QUERY_PATH_REQUEST, *PQUERY_PATH_REQUEST; + +typedef struct _QUERY_PATH_RESPONSE { + ULONG LengthAccepted; +} QUERY_PATH_RESPONSE, *PQUERY_PATH_RESPONSE; + +typedef struct _RETRIEVAL_POINTERS_BUFFER { + ULONG ExtentCount; + LARGE_INTEGER StartingVcn; + struct { + LARGE_INTEGER NextVcn; + LARGE_INTEGER Lcn; + } Extents[1]; +} RETRIEVAL_POINTERS_BUFFER, *PRETRIEVAL_POINTERS_BUFFER; + +typedef struct _RTL_SPLAY_LINKS { + struct _RTL_SPLAY_LINKS *Parent; + struct _RTL_SPLAY_LINKS *LeftChild; + struct _RTL_SPLAY_LINKS *RightChild; +} RTL_SPLAY_LINKS, *PRTL_SPLAY_LINKS; + +typedef struct _SE_EXPORTS { + + LUID SeCreateTokenPrivilege; + LUID SeAssignPrimaryTokenPrivilege; + LUID SeLockMemoryPrivilege; + LUID SeIncreaseQuotaPrivilege; + LUID SeUnsolicitedInputPrivilege; + LUID SeTcbPrivilege; + LUID SeSecurityPrivilege; + LUID SeTakeOwnershipPrivilege; + LUID SeLoadDriverPrivilege; + LUID SeCreatePagefilePrivilege; + LUID SeIncreaseBasePriorityPrivilege; + LUID SeSystemProfilePrivilege; + LUID SeSystemtimePrivilege; + LUID SeProfileSingleProcessPrivilege; + LUID SeCreatePermanentPrivilege; + LUID SeBackupPrivilege; + LUID SeRestorePrivilege; + LUID SeShutdownPrivilege; + LUID SeDebugPrivilege; + LUID SeAuditPrivilege; + LUID SeSystemEnvironmentPrivilege; + LUID SeChangeNotifyPrivilege; + LUID SeRemoteShutdownPrivilege; + + PSID SeNullSid; + PSID SeWorldSid; + PSID SeLocalSid; + PSID SeCreatorOwnerSid; + PSID SeCreatorGroupSid; + + PSID SeNtAuthoritySid; + PSID SeDialupSid; + PSID SeNetworkSid; + PSID SeBatchSid; + PSID SeInteractiveSid; + PSID SeLocalSystemSid; + PSID SeAliasAdminsSid; + PSID SeAliasUsersSid; + PSID SeAliasGuestsSid; + PSID SeAliasPowerUsersSid; + PSID SeAliasAccountOpsSid; + PSID SeAliasSystemOpsSid; + PSID SeAliasPrintOpsSid; + PSID SeAliasBackupOpsSid; + + PSID SeAuthenticatedUsersSid; + + PSID SeRestrictedSid; + PSID SeAnonymousLogonSid; + + LUID SeUndockPrivilege; + LUID SeSyncAgentPrivilege; + LUID SeEnableDelegationPrivilege; + +} SE_EXPORTS, *PSE_EXPORTS; + +typedef struct _SECTION_BASIC_INFORMATION { + PVOID BaseAddress; + ULONG Attributes; + LARGE_INTEGER Size; +} SECTION_BASIC_INFORMATION, *PSECTION_BASIC_INFORMATION; + +typedef struct _SECTION_IMAGE_INFORMATION { + PVOID EntryPoint; + ULONG Unknown1; + ULONG StackReserve; + ULONG StackCommit; + ULONG Subsystem; + USHORT MinorSubsystemVersion; + USHORT MajorSubsystemVersion; + ULONG Unknown2; + ULONG Characteristics; + USHORT ImageNumber; + BOOLEAN Executable; + UCHAR Unknown3; + ULONG Unknown4[3]; +} SECTION_IMAGE_INFORMATION, *PSECTION_IMAGE_INFORMATION; + +#if (VER_PRODUCTBUILD >= 2600) + +typedef struct _SHARED_CACHE_MAP { + CSHORT NodeTypeCode; + CSHORT NodeByteSize; + ULONG OpenCount; + LARGE_INTEGER FileSize; + LIST_ENTRY BcbList; + LARGE_INTEGER SectionSize; + LARGE_INTEGER ValidDataLength; + LARGE_INTEGER ValidDataGoal; + PVACB InitialVacbs[4]; + PVACB *Vacbs; + PFILE_OBJECT FileObject; + PVACB ActiveVacb; + PVOID NeedToZero; + ULONG ActivePage; + ULONG NeedToZeroPage; + KSPIN_LOCK ActiveVacbSpinLock; + ULONG VacbActiveCount; + ULONG DirtyPages; + LIST_ENTRY SharedCacheMapLinks; + ULONG Flags; + NTSTATUS Status; + PMBCB Mbcb; + PVOID Section; + PKEVENT CreateEvent; + PKEVENT WaitOnActiveCount; + ULONG PagesToWrite; + LONGLONG BeyondLastFlush; + PCACHE_MANAGER_CALLBACKS Callbacks; + PVOID LazyWriteContext; + LIST_ENTRY PrivateList; + PVOID LogHandle; + PVOID FlushToLsnRoutine; + ULONG DirtyPageThreshold; + ULONG LazyWritePassCount; + PCACHE_UNINITIALIZE_EVENT UninitializeEvent; + PVACB NeedToZeroVacb; + KSPIN_LOCK BcbSpinLock; + PVOID Reserved; + KEVENT Event; + EX_PUSH_LOCK VacbPushLock; + PRIVATE_CACHE_MAP PrivateCacheMap; +} SHARED_CACHE_MAP, *PSHARED_CACHE_MAP; + +#endif + +typedef struct _STARTING_VCN_INPUT_BUFFER { + LARGE_INTEGER StartingVcn; +} STARTING_VCN_INPUT_BUFFER, *PSTARTING_VCN_INPUT_BUFFER; + +typedef struct _SYSTEM_CACHE_INFORMATION { + ULONG CurrentSize; + ULONG PeakSize; + ULONG PageFaultCount; + ULONG MinimumWorkingSet; + ULONG MaximumWorkingSet; + ULONG Unused[4]; +} SYSTEM_CACHE_INFORMATION, *PSYSTEM_CACHE_INFORMATION; + +typedef struct _TERMINATION_PORT { + struct _TERMINATION_PORT* Next; + PVOID Port; +} TERMINATION_PORT, *PTERMINATION_PORT; + +typedef struct _SECURITY_CLIENT_CONTEXT { + SECURITY_QUALITY_OF_SERVICE SecurityQos; + PACCESS_TOKEN ClientToken; + BOOLEAN DirectlyAccessClientToken; + BOOLEAN DirectAccessEffectiveOnly; + BOOLEAN ServerIsRemote; + TOKEN_CONTROL ClientTokenControl; +} SECURITY_CLIENT_CONTEXT, *PSECURITY_CLIENT_CONTEXT; + +typedef struct _TUNNEL { + FAST_MUTEX Mutex; + PRTL_SPLAY_LINKS Cache; + LIST_ENTRY TimerQueue; + USHORT NumEntries; +} TUNNEL, *PTUNNEL; + +typedef struct _VACB { + PVOID BaseAddress; + PSHARED_CACHE_MAP SharedCacheMap; + union { + LARGE_INTEGER FileOffset; + USHORT ActiveCount; + } Overlay; + LIST_ENTRY LruList; +} VACB, *PVACB; + +typedef struct _VAD_HEADER { + PVOID StartVPN; + PVOID EndVPN; + PVAD_HEADER ParentLink; + PVAD_HEADER LeftLink; + PVAD_HEADER RightLink; + ULONG Flags; /* LSB = CommitCharge */ + PVOID ControlArea; + PVOID FirstProtoPte; + PVOID LastPTE; + ULONG Unknown; + LIST_ENTRY Secured; +} VAD_HEADER, *PVAD_HEADER; + +NTKERNELAPI +BOOLEAN +NTAPI +CcCanIWrite ( + IN PFILE_OBJECT FileObject, + IN ULONG BytesToWrite, + IN BOOLEAN Wait, + IN BOOLEAN Retrying +); + +NTKERNELAPI +BOOLEAN +NTAPI +CcCopyRead ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + OUT PVOID Buffer, + OUT PIO_STATUS_BLOCK IoStatus +); + +NTKERNELAPI +BOOLEAN +NTAPI +CcCopyWrite ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + IN PVOID Buffer +); + +#define CcCopyWriteWontFlush(FO, FOFF, LEN) ((LEN) <= 0x10000) + +typedef VOID (NTAPI *PCC_POST_DEFERRED_WRITE) ( + IN PVOID Context1, + IN PVOID Context2 +); + +NTKERNELAPI +VOID +NTAPI +CcDeferWrite ( + IN PFILE_OBJECT FileObject, + IN PCC_POST_DEFERRED_WRITE PostRoutine, + IN PVOID Context1, + IN PVOID Context2, + IN ULONG BytesToWrite, + IN BOOLEAN Retrying +); + +NTKERNELAPI +VOID +NTAPI +CcFastCopyRead ( + IN PFILE_OBJECT FileObject, + IN ULONG FileOffset, + IN ULONG Length, + IN ULONG PageCount, + OUT PVOID Buffer, + OUT PIO_STATUS_BLOCK IoStatus +); + +NTKERNELAPI +VOID +NTAPI +CcFastCopyWrite ( + IN PFILE_OBJECT FileObject, + IN ULONG FileOffset, + IN ULONG Length, + IN PVOID Buffer +); + +NTKERNELAPI +VOID +NTAPI +CcFlushCache ( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN PLARGE_INTEGER FileOffset OPTIONAL, + IN ULONG Length, + OUT PIO_STATUS_BLOCK IoStatus OPTIONAL +); + +typedef VOID (*PDIRTY_PAGE_ROUTINE) ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN PLARGE_INTEGER OldestLsn, + IN PLARGE_INTEGER NewestLsn, + IN PVOID Context1, + IN PVOID Context2 +); + +NTKERNELAPI +LARGE_INTEGER +NTAPI +CcGetDirtyPages ( + IN PVOID LogHandle, + IN PDIRTY_PAGE_ROUTINE DirtyPageRoutine, + IN PVOID Context1, + IN PVOID Context2 +); + +NTKERNELAPI +PFILE_OBJECT +NTAPI +CcGetFileObjectFromBcb ( + IN PVOID Bcb +); + +NTKERNELAPI +PFILE_OBJECT +NTAPI +CcGetFileObjectFromSectionPtrs ( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer +); + +#define CcGetFileSizePointer(FO) ( \ + ((PLARGE_INTEGER)((FO)->SectionObjectPointer->SharedCacheMap) + 1) \ +) + +#if (VER_PRODUCTBUILD >= 2195) + +NTKERNELAPI +LARGE_INTEGER +NTAPI +CcGetFlushedValidData ( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN BOOLEAN BcbListHeld +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTKERNELAPI +LARGE_INTEGER +CcGetLsnForFileObject ( + IN PFILE_OBJECT FileObject, + OUT PLARGE_INTEGER OldestLsn OPTIONAL +); + +typedef BOOLEAN (NTAPI *PACQUIRE_FOR_LAZY_WRITE) ( + IN PVOID Context, + IN BOOLEAN Wait +); + +typedef VOID (NTAPI *PRELEASE_FROM_LAZY_WRITE) ( + IN PVOID Context +); + +typedef BOOLEAN (NTAPI *PACQUIRE_FOR_READ_AHEAD) ( + IN PVOID Context, + IN BOOLEAN Wait +); + +typedef VOID (NTAPI *PRELEASE_FROM_READ_AHEAD) ( + IN PVOID Context +); + +typedef struct _CACHE_MANAGER_CALLBACKS { + PACQUIRE_FOR_LAZY_WRITE AcquireForLazyWrite; + PRELEASE_FROM_LAZY_WRITE ReleaseFromLazyWrite; + PACQUIRE_FOR_READ_AHEAD AcquireForReadAhead; + PRELEASE_FROM_READ_AHEAD ReleaseFromReadAhead; +} CACHE_MANAGER_CALLBACKS, *PCACHE_MANAGER_CALLBACKS; + +NTKERNELAPI +VOID +NTAPI +CcInitializeCacheMap ( + IN PFILE_OBJECT FileObject, + IN PCC_FILE_SIZES FileSizes, + IN BOOLEAN PinAccess, + IN PCACHE_MANAGER_CALLBACKS Callbacks, + IN PVOID LazyWriteContext +); + +#define CcIsFileCached(FO) ( \ + ((FO)->SectionObjectPointer != NULL) && \ + (((PSECTION_OBJECT_POINTERS)(FO)->SectionObjectPointer)->SharedCacheMap != NULL) \ +) + +NTKERNELAPI +BOOLEAN +NTAPI +CcIsThereDirtyData ( + IN PVPB Vpb +); + +NTKERNELAPI +BOOLEAN +NTAPI +CcMapData ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + OUT PVOID *Bcb, + OUT PVOID *Buffer +); + +NTKERNELAPI +VOID +NTAPI +CcMdlRead ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + OUT PMDL *MdlChain, + OUT PIO_STATUS_BLOCK IoStatus +); + +NTKERNELAPI +VOID +NTAPI +CcMdlReadComplete ( + IN PFILE_OBJECT FileObject, + IN PMDL MdlChain +); + +NTKERNELAPI +VOID +NTAPI +CcMdlWriteComplete ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN PMDL MdlChain +); + +NTKERNELAPI +BOOLEAN +NTAPI +CcPinMappedData ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, +#if (VER_PRODUCTBUILD >= 2195) + IN ULONG Flags, +#else + IN BOOLEAN Wait, +#endif + IN OUT PVOID *Bcb +); + +NTKERNELAPI +BOOLEAN +NTAPI +CcPinRead ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, +#if (VER_PRODUCTBUILD >= 2195) + IN ULONG Flags, +#else + IN BOOLEAN Wait, +#endif + OUT PVOID *Bcb, + OUT PVOID *Buffer +); + +NTKERNELAPI +VOID +NTAPI +CcPrepareMdlWrite ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + OUT PMDL *MdlChain, + OUT PIO_STATUS_BLOCK IoStatus +); + +NTKERNELAPI +BOOLEAN +NTAPI +CcPreparePinWrite ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Zero, +#if (VER_PRODUCTBUILD >= 2195) + IN ULONG Flags, +#else + IN BOOLEAN Wait, +#endif + OUT PVOID *Bcb, + OUT PVOID *Buffer +); + +NTKERNELAPI +BOOLEAN +NTAPI +CcPurgeCacheSection ( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN PLARGE_INTEGER FileOffset OPTIONAL, + IN ULONG Length, + IN BOOLEAN UninitializeCacheMaps +); + +#define CcReadAhead(FO, FOFF, LEN) ( \ + if ((LEN) >= 256) { \ + CcScheduleReadAhead((FO), (FOFF), (LEN)); \ + } \ +) + +#if (VER_PRODUCTBUILD >= 2195) + +NTKERNELAPI +PVOID +NTAPI +CcRemapBcb ( + IN PVOID Bcb +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTKERNELAPI +VOID +NTAPI +CcRepinBcb ( + IN PVOID Bcb +); + +NTKERNELAPI +VOID +NTAPI +CcScheduleReadAhead ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length +); + +NTKERNELAPI +VOID +NTAPI +CcSetAdditionalCacheAttributes ( + IN PFILE_OBJECT FileObject, + IN BOOLEAN DisableReadAhead, + IN BOOLEAN DisableWriteBehind +); + +NTKERNELAPI +VOID +NTAPI +CcSetBcbOwnerPointer ( + IN PVOID Bcb, + IN PVOID OwnerPointer +); + +NTKERNELAPI +VOID +NTAPI +CcSetDirtyPageThreshold ( + IN PFILE_OBJECT FileObject, + IN ULONG DirtyPageThreshold +); + +NTKERNELAPI +VOID +NTAPI +CcSetDirtyPinnedData ( + IN PVOID BcbVoid, + IN PLARGE_INTEGER Lsn OPTIONAL +); + +NTKERNELAPI +VOID +NTAPI +CcSetFileSizes ( + IN PFILE_OBJECT FileObject, + IN PCC_FILE_SIZES FileSizes +); + +typedef VOID (NTAPI *PFLUSH_TO_LSN) ( + IN PVOID LogHandle, + IN PLARGE_INTEGER Lsn +); + +NTKERNELAPI +VOID +NTAPI +CcSetLogHandleForFile ( + IN PFILE_OBJECT FileObject, + IN PVOID LogHandle, + IN PFLUSH_TO_LSN FlushToLsnRoutine +); + +NTKERNELAPI +VOID +NTAPI +CcSetReadAheadGranularity ( + IN PFILE_OBJECT FileObject, + IN ULONG Granularity /* default: PAGE_SIZE */ + /* allowed: 2^n * PAGE_SIZE */ +); + +NTKERNELAPI +BOOLEAN +NTAPI +CcUninitializeCacheMap ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER TruncateSize OPTIONAL, + IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL +); + +NTKERNELAPI +VOID +NTAPI +CcUnpinData ( + IN PVOID Bcb +); + +NTKERNELAPI +VOID +NTAPI +CcUnpinDataForThread ( + IN PVOID Bcb, + IN ERESOURCE_THREAD ResourceThreadId +); + +NTKERNELAPI +VOID +NTAPI +CcUnpinRepinnedBcb ( + IN PVOID Bcb, + IN BOOLEAN WriteThrough, + OUT PIO_STATUS_BLOCK IoStatus +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTKERNELAPI +NTSTATUS +NTAPI +CcWaitForCurrentLazyWriterActivity ( + VOID +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTKERNELAPI +BOOLEAN +NTAPI +CcZeroData ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER StartOffset, + IN PLARGE_INTEGER EndOffset, + IN BOOLEAN Wait +); + +NTKERNELAPI +VOID +NTAPI +ExDisableResourceBoostLite ( + IN PERESOURCE Resource +); + +NTKERNELAPI +ULONG +NTAPI +ExQueryPoolBlockSize ( + IN PVOID PoolBlock, + OUT PBOOLEAN QuotaCharged +); + +#define FlagOn(x, f) ((x) & (f)) + +NTKERNELAPI +VOID +NTAPI +FsRtlAddToTunnelCache ( + IN PTUNNEL Cache, + IN ULONGLONG DirectoryKey, + IN PUNICODE_STRING ShortName, + IN PUNICODE_STRING LongName, + IN BOOLEAN KeyByShortName, + IN ULONG DataLength, + IN PVOID Data +); + +#if (VER_PRODUCTBUILD >= 2195) + +PFILE_LOCK +NTAPI +FsRtlAllocateFileLock ( + IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine OPTIONAL, + IN PUNLOCK_ROUTINE UnlockRoutine OPTIONAL +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTKERNELAPI +PVOID +NTAPI +FsRtlAllocatePool ( + IN POOL_TYPE PoolType, + IN ULONG NumberOfBytes +); + +NTKERNELAPI +PVOID +NTAPI +FsRtlAllocatePoolWithQuota ( + IN POOL_TYPE PoolType, + IN ULONG NumberOfBytes +); + +NTKERNELAPI +PVOID +NTAPI +FsRtlAllocatePoolWithQuotaTag ( + IN POOL_TYPE PoolType, + IN ULONG NumberOfBytes, + IN ULONG Tag +); + +NTKERNELAPI +PVOID +NTAPI +FsRtlAllocatePoolWithTag ( + IN POOL_TYPE PoolType, + IN ULONG NumberOfBytes, + IN ULONG Tag +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlAreNamesEqual ( + IN PUNICODE_STRING Name1, + IN PUNICODE_STRING Name2, + IN BOOLEAN IgnoreCase, + IN PWCHAR UpcaseTable OPTIONAL +); + +#define FsRtlAreThereCurrentFileLocks(FL) ( \ + ((FL)->FastIoIsQuestionable) \ +) + +/* + FsRtlCheckLockForReadAccess: + + All this really does is pick out the lock parameters from the irp (io stack + location?), get IoGetRequestorProcess, and pass values on to + FsRtlFastCheckLockForRead. +*/ +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlCheckLockForReadAccess ( + IN PFILE_LOCK FileLock, + IN PIRP Irp +); + +/* + FsRtlCheckLockForWriteAccess: + + All this really does is pick out the lock parameters from the irp (io stack + location?), get IoGetRequestorProcess, and pass values on to + FsRtlFastCheckLockForWrite. +*/ +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlCheckLockForWriteAccess ( + IN PFILE_LOCK FileLock, + IN PIRP Irp +); + +typedef +VOID NTAPI +(*POPLOCK_WAIT_COMPLETE_ROUTINE) ( + IN PVOID Context, + IN PIRP Irp +); + +typedef +VOID NTAPI +(*POPLOCK_FS_PREPOST_IRP) ( + IN PVOID Context, + IN PIRP Irp +); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlCheckOplock ( + IN POPLOCK Oplock, + IN PIRP Irp, + IN PVOID Context, + IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, + IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlCopyRead ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + IN ULONG LockKey, + OUT PVOID Buffer, + OUT PIO_STATUS_BLOCK IoStatus, + IN PDEVICE_OBJECT DeviceObject +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlCopyWrite ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + IN ULONG LockKey, + IN PVOID Buffer, + OUT PIO_STATUS_BLOCK IoStatus, + IN PDEVICE_OBJECT DeviceObject +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlCurrentBatchOplock ( + IN POPLOCK Oplock +); + +NTKERNELAPI +VOID +NTAPI +FsRtlDeleteKeyFromTunnelCache ( + IN PTUNNEL Cache, + IN ULONGLONG DirectoryKey +); + +NTKERNELAPI +VOID +NTAPI +FsRtlDeleteTunnelCache ( + IN PTUNNEL Cache +); + +NTKERNELAPI +VOID +NTAPI +FsRtlDeregisterUncProvider ( + IN HANDLE Handle +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlDoesNameContainWildCards ( + IN PUNICODE_STRING Name +); + +#define FsRtlEnterFileSystem KeEnterCriticalRegion + +#define FsRtlExitFileSystem KeLeaveCriticalRegion + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlFastCheckLockForRead ( + IN PFILE_LOCK FileLock, + IN PLARGE_INTEGER FileOffset, + IN PLARGE_INTEGER Length, + IN ULONG Key, + IN PFILE_OBJECT FileObject, + IN PEPROCESS Process +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlFastCheckLockForWrite ( + IN PFILE_LOCK FileLock, + IN PLARGE_INTEGER FileOffset, + IN PLARGE_INTEGER Length, + IN ULONG Key, + IN PFILE_OBJECT FileObject, + IN PEPROCESS Process +); + +#define FsRtlFastLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) ( \ + FsRtlPrivateLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, NULL, A10, A11) \ +) + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlFastUnlockAll ( + IN PFILE_LOCK FileLock, + IN PFILE_OBJECT FileObject, + IN PEPROCESS Process, + IN PVOID Context OPTIONAL +); +/* ret: STATUS_RANGE_NOT_LOCKED */ + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlFastUnlockAllByKey ( + IN PFILE_LOCK FileLock, + IN PFILE_OBJECT FileObject, + IN PEPROCESS Process, + IN ULONG Key, + IN PVOID Context OPTIONAL +); +/* ret: STATUS_RANGE_NOT_LOCKED */ + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlFastUnlockSingle ( + IN PFILE_LOCK FileLock, + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN PLARGE_INTEGER Length, + IN PEPROCESS Process, + IN ULONG Key, + IN PVOID Context OPTIONAL, + IN BOOLEAN AlreadySynchronized +); +/* ret: STATUS_RANGE_NOT_LOCKED */ + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlFindInTunnelCache ( + IN PTUNNEL Cache, + IN ULONGLONG DirectoryKey, + IN PUNICODE_STRING Name, + OUT PUNICODE_STRING ShortName, + OUT PUNICODE_STRING LongName, + IN OUT PULONG DataLength, + OUT PVOID Data +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTKERNELAPI +VOID +NTAPI +FsRtlFreeFileLock ( + IN PFILE_LOCK FileLock +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlGetFileSize ( + IN PFILE_OBJECT FileObject, + IN OUT PLARGE_INTEGER FileSize +); + +/* + FsRtlGetNextFileLock: + + ret: NULL if no more locks + + Internals: + FsRtlGetNextFileLock uses FileLock->LastReturnedLockInfo and + FileLock->LastReturnedLock as storage. + LastReturnedLock is a pointer to the 'raw' lock inkl. double linked + list, and FsRtlGetNextFileLock needs this to get next lock on subsequent + calls with Restart = FALSE. +*/ +NTKERNELAPI +PFILE_LOCK_INFO +NTAPI +FsRtlGetNextFileLock ( + IN PFILE_LOCK FileLock, + IN BOOLEAN Restart +); + +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeFileLock ( + IN PFILE_LOCK FileLock, + IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine OPTIONAL, + IN PUNLOCK_ROUTINE UnlockRoutine OPTIONAL +); + +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeOplock ( + IN OUT POPLOCK Oplock +); + +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeTunnelCache ( + IN PTUNNEL Cache +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsNameInExpression ( + IN PUNICODE_STRING Expression, + IN PUNICODE_STRING Name, + IN BOOLEAN IgnoreCase, + IN PWCHAR UpcaseTable OPTIONAL +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsNtstatusExpected ( + IN NTSTATUS Ntstatus +); + +#define FsRtlIsUnicodeCharacterWild(C) ( \ + (((C) >= 0x40) ? \ + FALSE : \ + FlagOn((*FsRtlLegalAnsiCharacterArray)[(C)], FSRTL_WILD_CHARACTER )) \ +) + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlMdlReadComplete ( + IN PFILE_OBJECT FileObject, + IN PMDL MdlChain +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlMdlReadCompleteDev ( + IN PFILE_OBJECT FileObject, + IN PMDL MdlChain, + IN PDEVICE_OBJECT DeviceObject +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlMdlWriteComplete ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN PMDL MdlChain +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlMdlWriteCompleteDev ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN PMDL MdlChain, + IN PDEVICE_OBJECT DeviceObject +); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlNormalizeNtstatus ( + IN NTSTATUS Exception, + IN NTSTATUS GenericException +); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyChangeDirectory ( + IN PNOTIFY_SYNC NotifySync, + IN PVOID FsContext, + IN PSTRING FullDirectoryName, + IN PLIST_ENTRY NotifyList, + IN BOOLEAN WatchTree, + IN ULONG CompletionFilter, + IN PIRP NotifyIrp +); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyCleanup ( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PVOID FsContext +); + +typedef BOOLEAN (*PCHECK_FOR_TRAVERSE_ACCESS) ( + IN PVOID NotifyContext, + IN PVOID TargetContext, + IN PSECURITY_SUBJECT_CONTEXT SubjectContext +); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyFullChangeDirectory ( + 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 +); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyFullReportChange ( + 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 +); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyInitializeSync ( + IN PNOTIFY_SYNC NotifySync +); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyReportChange ( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PSTRING FullTargetName, + IN PUSHORT FileNamePartLength, + IN ULONG FilterMatch +); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyUninitializeSync ( + IN PNOTIFY_SYNC NotifySync +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlNotifyVolumeEvent ( + IN PFILE_OBJECT FileObject, + IN ULONG EventCode +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlOplockFsctrl ( + IN POPLOCK Oplock, + IN PIRP Irp, + IN ULONG OpenCount +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlOplockIsFastIoPossible ( + IN POPLOCK Oplock +); + +/* + FsRtlPrivateLock: + + ret: IoStatus->Status: STATUS_PENDING, STATUS_LOCK_NOT_GRANTED + + Internals: + -Calls IoCompleteRequest if Irp + -Uses exception handling / ExRaiseStatus with STATUS_INSUFFICIENT_RESOURCES +*/ +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlPrivateLock ( + IN PFILE_LOCK FileLock, + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN PLARGE_INTEGER Length, + IN PEPROCESS Process, + IN ULONG Key, + IN BOOLEAN FailImmediately, + IN BOOLEAN ExclusiveLock, + OUT PIO_STATUS_BLOCK IoStatus, + IN PIRP Irp OPTIONAL, + IN PVOID Context, + IN BOOLEAN AlreadySynchronized +); + +/* + FsRtlProcessFileLock: + + ret: + -STATUS_INVALID_DEVICE_REQUEST + -STATUS_RANGE_NOT_LOCKED from unlock routines. + -STATUS_PENDING, STATUS_LOCK_NOT_GRANTED from FsRtlPrivateLock + (redirected IoStatus->Status). + + Internals: + -switch ( Irp->CurrentStackLocation->MinorFunction ) + lock: return FsRtlPrivateLock; + unlocksingle: return FsRtlFastUnlockSingle; + unlockall: return FsRtlFastUnlockAll; + unlockallbykey: return FsRtlFastUnlockAllByKey; + default: IofCompleteRequest with STATUS_INVALID_DEVICE_REQUEST; + return STATUS_INVALID_DEVICE_REQUEST; + + -'AllwaysZero' is passed thru as 'AllwaysZero' to lock / unlock routines. + -'Irp' is passet thru as 'Irp' to FsRtlPrivateLock. +*/ +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlProcessFileLock ( + IN PFILE_LOCK FileLock, + IN PIRP Irp, + IN PVOID Context OPTIONAL +); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlRegisterUncProvider ( + IN OUT PHANDLE MupHandle, + IN PUNICODE_STRING RedirectorDeviceName, + IN BOOLEAN MailslotsSupported +); + +NTKERNELAPI +VOID +NTAPI +FsRtlUninitializeFileLock ( + IN PFILE_LOCK FileLock +); + +NTKERNELAPI +VOID +NTAPI +FsRtlUninitializeOplock ( + IN OUT POPLOCK Oplock +); + +NTSYSAPI +VOID +NTAPI +HalDisplayString ( + IN PCHAR String +); + +NTSYSAPI +VOID +NTAPI +HalQueryRealTimeClock ( + IN OUT PTIME_FIELDS TimeFields +); + +NTSYSAPI +VOID +NTAPI +HalSetRealTimeClock ( + IN PTIME_FIELDS TimeFields +); + +#define InitializeMessageHeader(m, l, t) { \ + (m)->Length = (USHORT)(l); \ + (m)->DataLength = (USHORT)(l - sizeof( LPC_MESSAGE )); \ + (m)->MessageType = (USHORT)(t); \ + (m)->DataInfoOffset = 0; \ +} + +NTKERNELAPI +VOID +NTAPI +IoAcquireVpbSpinLock ( + OUT PKIRQL Irql +); + +NTKERNELAPI +NTSTATUS +NTAPI +IoCheckDesiredAccess ( + IN OUT PACCESS_MASK DesiredAccess, + IN ACCESS_MASK GrantedAccess +); + +NTKERNELAPI +NTSTATUS +NTAPI +IoCheckEaBufferValidity ( + IN PFILE_FULL_EA_INFORMATION EaBuffer, + IN ULONG EaLength, + OUT PULONG ErrorOffset +); + +NTKERNELAPI +NTSTATUS +NTAPI +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 +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTKERNELAPI +NTSTATUS +NTAPI +IoCheckQuotaBufferValidity ( + IN PFILE_QUOTA_INFORMATION QuotaBuffer, + IN ULONG QuotaLength, + OUT PULONG ErrorOffset +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTKERNELAPI +PFILE_OBJECT +NTAPI +IoCreateStreamFileObject ( + IN PFILE_OBJECT FileObject OPTIONAL, + IN PDEVICE_OBJECT DeviceObject OPTIONAL +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTKERNELAPI +PFILE_OBJECT +NTAPI +IoCreateStreamFileObjectLite ( + IN PFILE_OBJECT FileObject OPTIONAL, + IN PDEVICE_OBJECT DeviceObject OPTIONAL +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTKERNELAPI +BOOLEAN +NTAPI +IoFastQueryNetworkAttributes ( + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN ACCESS_MASK DesiredAccess, + IN ULONG OpenOptions, + OUT PIO_STATUS_BLOCK IoStatus, + OUT PFILE_NETWORK_OPEN_INFORMATION Buffer +); + +NTKERNELAPI +PDEVICE_OBJECT +NTAPI +IoGetAttachedDevice ( + IN PDEVICE_OBJECT DeviceObject +); + +NTKERNELAPI +PDEVICE_OBJECT +NTAPI +IoGetBaseFileSystemDeviceObject ( + IN PFILE_OBJECT FileObject +); + +NTKERNELAPI +PEPROCESS +NTAPI +IoGetRequestorProcess ( + IN PIRP Irp +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTKERNELAPI +ULONG +NTAPI +IoGetRequestorProcessId ( + IN PIRP Irp +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTKERNELAPI +PIRP +NTAPI +IoGetTopLevelIrp ( + VOID +); + +#define IoIsFileOpenedExclusively(FileObject) ( \ + (BOOLEAN) !( \ + (FileObject)->SharedRead || \ + (FileObject)->SharedWrite || \ + (FileObject)->SharedDelete \ + ) \ +) + +NTKERNELAPI +BOOLEAN +NTAPI +IoIsOperationSynchronous ( + IN PIRP Irp +); + +NTKERNELAPI +BOOLEAN +NTAPI +IoIsSystemThread ( + IN PETHREAD Thread +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTKERNELAPI +BOOLEAN +NTAPI +IoIsValidNameGraftingBuffer ( + IN PIRP Irp, + IN PREPARSE_DATA_BUFFER ReparseBuffer +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTKERNELAPI +NTSTATUS +NTAPI +IoPageRead ( + IN PFILE_OBJECT FileObject, + IN PMDL Mdl, + IN PLARGE_INTEGER Offset, + IN PKEVENT Event, + OUT PIO_STATUS_BLOCK IoStatusBlock +); + +NTKERNELAPI +NTSTATUS +NTAPI +IoQueryFileInformation ( + IN PFILE_OBJECT FileObject, + IN FILE_INFORMATION_CLASS FileInformationClass, + IN ULONG Length, + OUT PVOID FileInformation, + OUT PULONG ReturnedLength +); + +NTKERNELAPI +NTSTATUS +NTAPI +IoQueryVolumeInformation ( + IN PFILE_OBJECT FileObject, + IN FS_INFORMATION_CLASS FsInformationClass, + IN ULONG Length, + OUT PVOID FsInformation, + OUT PULONG ReturnedLength +); + +NTKERNELAPI +VOID +NTAPI +IoRegisterFileSystem ( + IN OUT PDEVICE_OBJECT DeviceObject +); + +#if (VER_PRODUCTBUILD >= 1381) + +typedef VOID (NTAPI *PDRIVER_FS_NOTIFICATION) ( + IN PDEVICE_OBJECT DeviceObject, + IN BOOLEAN DriverActive +); + +NTKERNELAPI +NTSTATUS +NTAPI +IoRegisterFsRegistrationChange ( + IN PDRIVER_OBJECT DriverObject, + IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine +); + +#endif /* (VER_PRODUCTBUILD >= 1381) */ + +NTKERNELAPI +VOID +NTAPI +IoReleaseVpbSpinLock ( + IN KIRQL Irql +); + +NTKERNELAPI +VOID +NTAPI +IoSetDeviceToVerify ( + IN PETHREAD Thread, + IN PDEVICE_OBJECT DeviceObject +); + +NTKERNELAPI +NTSTATUS +NTAPI +IoSetInformation ( + IN PFILE_OBJECT FileObject, + IN FILE_INFORMATION_CLASS FileInformationClass, + IN ULONG Length, + IN PVOID FileInformation +); + +NTKERNELAPI +VOID +NTAPI +IoSetTopLevelIrp ( + IN PIRP Irp +); + +NTKERNELAPI +NTSTATUS +NTAPI +IoSynchronousPageWrite ( + IN PFILE_OBJECT FileObject, + IN PMDL Mdl, + IN PLARGE_INTEGER FileOffset, + IN PKEVENT Event, + OUT PIO_STATUS_BLOCK IoStatusBlock +); + +NTKERNELAPI +PEPROCESS +NTAPI +IoThreadToProcess ( + IN PETHREAD Thread +); + +NTKERNELAPI +VOID +NTAPI +IoUnregisterFileSystem ( + IN OUT PDEVICE_OBJECT DeviceObject +); + +#if (VER_PRODUCTBUILD >= 1381) + +NTKERNELAPI +NTSTATUS +NTAPI +IoUnregisterFsRegistrationChange ( + IN PDRIVER_OBJECT DriverObject, + IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine +); + +#endif /* (VER_PRODUCTBUILD >= 1381) */ + +NTKERNELAPI +NTSTATUS +NTAPI +IoVerifyVolume ( + IN PDEVICE_OBJECT DeviceObject, + IN BOOLEAN AllowRawMount +); + +NTKERNELAPI +VOID +NTAPI +KeAttachProcess ( + IN PEPROCESS Process +); + +NTKERNELAPI +VOID +NTAPI +KeDetachProcess ( + VOID +); + +NTKERNELAPI +VOID +NTAPI +KeInitializeQueue ( + IN PRKQUEUE Queue, + IN ULONG Count OPTIONAL +); + +NTKERNELAPI +LONG +NTAPI +KeInsertHeadQueue ( + IN PRKQUEUE Queue, + IN PLIST_ENTRY Entry +); + +NTKERNELAPI +LONG +NTAPI +KeInsertQueue ( + IN PRKQUEUE Queue, + IN PLIST_ENTRY Entry +); + +NTKERNELAPI +BOOLEAN +NTAPI +KeInsertQueueApc ( + IN PKAPC Apc, + IN PVOID SystemArgument1, + IN PVOID SystemArgument2, + IN KPRIORITY PriorityBoost +); + +NTKERNELAPI +LONG +NTAPI +KeReadStateQueue ( + IN PRKQUEUE Queue +); + +NTKERNELAPI +PLIST_ENTRY +NTAPI +KeRemoveQueue ( + IN PRKQUEUE Queue, + IN KPROCESSOR_MODE WaitMode, + IN PLARGE_INTEGER Timeout OPTIONAL +); + +NTKERNELAPI +PLIST_ENTRY +NTAPI +KeRundownQueue ( + IN PRKQUEUE Queue +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTKERNELAPI +VOID +NTAPI +KeStackAttachProcess ( + IN PKPROCESS Process, + OUT PKAPC_STATE ApcState +); + +NTKERNELAPI +VOID +NTAPI +KeUnstackDetachProcess ( + IN PKAPC_STATE ApcState +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTKERNELAPI +BOOLEAN +NTAPI +MmCanFileBeTruncated ( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN PLARGE_INTEGER NewFileSize +); + +NTKERNELAPI +BOOLEAN +NTAPI +MmFlushImageSection ( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN MMFLUSH_TYPE FlushType +); + +NTKERNELAPI +BOOLEAN +NTAPI +MmForceSectionClosed ( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN BOOLEAN DelayClose +); + +#if (VER_PRODUCTBUILD >= 1381) + +NTKERNELAPI +BOOLEAN +NTAPI +MmIsRecursiveIoFault ( + VOID +); + +#else + +#define MmIsRecursiveIoFault() ( \ + (PsGetCurrentThread()->DisablePageFaultClustering) | \ + (PsGetCurrentThread()->ForwardClusterOnly) \ +) + +#endif + +NTKERNELAPI +NTSTATUS +NTAPI +MmMapViewOfSection ( + IN PVOID SectionObject, + IN PEPROCESS Process, + IN OUT PVOID *BaseAddress, + IN ULONG ZeroBits, + IN ULONG CommitSize, + IN OUT PLARGE_INTEGER SectionOffset OPTIONAL, + IN OUT PULONG ViewSize, + IN SECTION_INHERIT InheritDisposition, + IN ULONG AllocationType, + IN ULONG Protect +); + +NTKERNELAPI +BOOLEAN +NTAPI +MmSetAddressRangeModified ( + IN PVOID Address, + IN ULONG Length +); + +NTKERNELAPI +NTSTATUS +NTAPI +ObCreateObject ( + IN KPROCESSOR_MODE ObjectAttributesAccessMode OPTIONAL, + IN POBJECT_TYPE ObjectType, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN KPROCESSOR_MODE AccessMode, + IN OUT PVOID ParseContext OPTIONAL, + IN ULONG ObjectSize, + IN ULONG PagedPoolCharge OPTIONAL, + IN ULONG NonPagedPoolCharge OPTIONAL, + OUT PVOID *Object +); + +NTKERNELAPI +ULONG +NTAPI +ObGetObjectPointerCount ( + IN PVOID Object +); + +NTKERNELAPI +NTSTATUS +NTAPI +ObInsertObject ( + IN PVOID Object, + IN PACCESS_STATE PassedAccessState OPTIONAL, + IN ACCESS_MASK DesiredAccess, + IN ULONG AdditionalReferences, + OUT PVOID *ReferencedObject OPTIONAL, + OUT PHANDLE Handle +); + +NTKERNELAPI +VOID +NTAPI +ObMakeTemporaryObject ( + IN PVOID Object +); + +NTKERNELAPI +NTSTATUS +NTAPI +ObOpenObjectByPointer ( + IN PVOID Object, + IN ULONG HandleAttributes, + IN PACCESS_STATE PassedAccessState OPTIONAL, + IN ACCESS_MASK DesiredAccess OPTIONAL, + IN POBJECT_TYPE ObjectType OPTIONAL, + IN KPROCESSOR_MODE AccessMode, + OUT PHANDLE Handle +); + +NTKERNELAPI +NTSTATUS +NTAPI +ObQueryNameString ( + IN PVOID Object, + OUT POBJECT_NAME_INFORMATION ObjectNameInfo, + IN ULONG Length, + OUT PULONG ReturnLength +); + +NTKERNELAPI +NTSTATUS +NTAPI +ObQueryObjectAuditingByHandle ( + IN HANDLE Handle, + OUT PBOOLEAN GenerateOnClose +); + +NTKERNELAPI +NTSTATUS +NTAPI +ObReferenceObjectByName ( + IN PUNICODE_STRING ObjectName, + IN ULONG Attributes, + IN PACCESS_STATE PassedAccessState OPTIONAL, + IN ACCESS_MASK DesiredAccess OPTIONAL, + IN POBJECT_TYPE ObjectType, + IN KPROCESSOR_MODE AccessMode, + IN OUT PVOID ParseContext OPTIONAL, + OUT PVOID *Object +); + +NTKERNELAPI +VOID +NTAPI +PsChargePoolQuota ( + IN PEPROCESS Process, + IN POOL_TYPE PoolType, + IN ULONG Amount +); + +#define PsDereferenceImpersonationToken(T) \ + {if (ARGUMENT_PRESENT(T)) { \ + (ObDereferenceObject((T))); \ + } else { \ + ; \ + } \ +} + +#define PsDereferencePrimaryToken(T) (ObDereferenceObject((T))) + +NTKERNELAPI +ULONGLONG +NTAPI +PsGetProcessExitTime ( + VOID +); + +NTKERNELAPI +BOOLEAN +NTAPI +PsIsThreadTerminating ( + IN PETHREAD Thread +); + +NTKERNELAPI +NTSTATUS +NTAPI +PsLookupProcessByProcessId ( + IN PVOID ProcessId, + OUT PEPROCESS *Process +); + +NTKERNELAPI +NTSTATUS +NTAPI +PsLookupProcessThreadByCid ( + IN PCLIENT_ID Cid, + OUT PEPROCESS *Process OPTIONAL, + OUT PETHREAD *Thread +); + +NTKERNELAPI +NTSTATUS +NTAPI +PsLookupThreadByThreadId ( + IN PVOID UniqueThreadId, + OUT PETHREAD *Thread +); + +NTKERNELAPI +PACCESS_TOKEN +NTAPI +PsReferenceImpersonationToken ( + IN PETHREAD Thread, + OUT PBOOLEAN CopyOnUse, + OUT PBOOLEAN EffectiveOnly, + OUT PSECURITY_IMPERSONATION_LEVEL Level +); + +NTKERNELAPI +HANDLE +NTAPI +PsReferencePrimaryToken ( + IN PEPROCESS Process +); + +NTKERNELAPI +VOID +NTAPI +PsReturnPoolQuota ( + IN PEPROCESS Process, + IN POOL_TYPE PoolType, + IN ULONG Amount +); + +NTKERNELAPI +VOID +NTAPI +PsRevertToSelf ( + VOID +); + +NTSYSAPI +NTSTATUS +NTAPI +RtlAbsoluteToSelfRelativeSD ( + IN PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor, + IN OUT PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor, + IN PULONG BufferLength +); + +NTSYSAPI +PVOID +NTAPI +RtlAllocateHeap ( + IN HANDLE HeapHandle, + IN ULONG Flags, + IN ULONG Size +); + +NTSYSAPI +NTSTATUS +NTAPI +RtlCompressBuffer ( + IN USHORT CompressionFormatAndEngine, + IN PUCHAR UncompressedBuffer, + IN ULONG UncompressedBufferSize, + OUT PUCHAR CompressedBuffer, + IN ULONG CompressedBufferSize, + IN ULONG UncompressedChunkSize, + OUT PULONG FinalCompressedSize, + IN PVOID WorkSpace +); + +NTSYSAPI +NTSTATUS +NTAPI +RtlCompressChunks ( + IN PUCHAR UncompressedBuffer, + IN ULONG UncompressedBufferSize, + OUT PUCHAR CompressedBuffer, + IN ULONG CompressedBufferSize, + IN OUT PCOMPRESSED_DATA_INFO CompressedDataInfo, + IN ULONG CompressedDataInfoLength, + IN PVOID WorkSpace +); + +NTSYSAPI +NTSTATUS +NTAPI +RtlConvertSidToUnicodeString ( + OUT PUNICODE_STRING DestinationString, + IN PSID Sid, + IN BOOLEAN AllocateDestinationString +); + +NTSYSAPI +NTSTATUS +NTAPI +RtlCopySid ( + IN ULONG Length, + IN PSID Destination, + IN PSID Source +); + +NTSYSAPI +NTSTATUS +NTAPI +RtlDecompressBuffer ( + IN USHORT CompressionFormat, + OUT PUCHAR UncompressedBuffer, + IN ULONG UncompressedBufferSize, + IN PUCHAR CompressedBuffer, + IN ULONG CompressedBufferSize, + OUT PULONG FinalUncompressedSize +); + +NTSYSAPI +NTSTATUS +NTAPI +RtlDecompressChunks ( + OUT PUCHAR UncompressedBuffer, + IN ULONG UncompressedBufferSize, + IN PUCHAR CompressedBuffer, + IN ULONG CompressedBufferSize, + IN PUCHAR CompressedTail, + IN ULONG CompressedTailSize, + IN PCOMPRESSED_DATA_INFO CompressedDataInfo +); + +NTSYSAPI +NTSTATUS +NTAPI +RtlDecompressFragment ( + IN USHORT CompressionFormat, + OUT PUCHAR UncompressedFragment, + IN ULONG UncompressedFragmentSize, + IN PUCHAR CompressedBuffer, + IN ULONG CompressedBufferSize, + IN ULONG FragmentOffset, + OUT PULONG FinalUncompressedSize, + IN PVOID WorkSpace +); + +NTSYSAPI +NTSTATUS +NTAPI +RtlDescribeChunk ( + IN USHORT CompressionFormat, + IN OUT PUCHAR *CompressedBuffer, + IN PUCHAR EndOfCompressedBufferPlus1, + OUT PUCHAR *ChunkBuffer, + OUT PULONG ChunkSize +); + +NTSYSAPI +BOOLEAN +NTAPI +RtlEqualSid ( + IN PSID Sid1, + IN PSID Sid2 +); + +NTSYSAPI +VOID +NTAPI +RtlFillMemoryUlong ( + IN PVOID Destination, + IN ULONG Length, + IN ULONG Fill +); + +NTSYSAPI +BOOLEAN +NTAPI +RtlFreeHeap ( + IN HANDLE HeapHandle, + IN ULONG Flags, + IN PVOID P +); + +NTSYSAPI +VOID +NTAPI +RtlGenerate8dot3Name ( + IN PUNICODE_STRING Name, + IN BOOLEAN AllowExtendedCharacters, + IN OUT PGENERATE_NAME_CONTEXT Context, + OUT PUNICODE_STRING Name8dot3 +); + +NTSYSAPI +NTSTATUS +NTAPI +RtlGetCompressionWorkSpaceSize ( + IN USHORT CompressionFormatAndEngine, + OUT PULONG CompressBufferWorkSpaceSize, + OUT PULONG CompressFragmentWorkSpaceSize +); + +NTSYSAPI +NTSTATUS +NTAPI +RtlGetDaclSecurityDescriptor ( + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + OUT PBOOLEAN DaclPresent, + OUT PACL *Dacl, + OUT PBOOLEAN DaclDefaulted +); + +NTSYSAPI +NTSTATUS +NTAPI +RtlGetGroupSecurityDescriptor ( + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + OUT PSID *Group, + OUT PBOOLEAN GroupDefaulted +); + +NTSYSAPI +NTSTATUS +NTAPI +RtlGetOwnerSecurityDescriptor ( + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + OUT PSID *Owner, + OUT PBOOLEAN OwnerDefaulted +); + +NTSYSAPI +NTSTATUS +NTAPI +RtlInitializeSid ( + IN OUT PSID Sid, + IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority, + IN UCHAR SubAuthorityCount +); + +NTSYSAPI +BOOLEAN +NTAPI +RtlIsNameLegalDOS8Dot3 ( + IN PUNICODE_STRING UnicodeName, + IN PANSI_STRING AnsiName, + PBOOLEAN Unknown +); + +NTSYSAPI +ULONG +NTAPI +RtlLengthRequiredSid ( + IN UCHAR SubAuthorityCount +); + +NTSYSAPI +ULONG +NTAPI +RtlLengthSid ( + IN PSID Sid +); + +NTSYSAPI +ULONG +NTAPI +RtlNtStatusToDosError ( + IN NTSTATUS Status +); + +NTSYSAPI +NTSTATUS +NTAPI +RtlReserveChunk ( + IN USHORT CompressionFormat, + IN OUT PUCHAR *CompressedBuffer, + IN PUCHAR EndOfCompressedBufferPlus1, + OUT PUCHAR *ChunkBuffer, + IN ULONG ChunkSize +); + +NTSYSAPI +VOID +NTAPI +RtlSecondsSince1970ToTime ( + IN ULONG SecondsSince1970, + OUT PLARGE_INTEGER Time +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTSYSAPI +NTSTATUS +NTAPI +RtlSelfRelativeToAbsoluteSD ( + IN PSECURITY_DESCRIPTOR SelfRelativeSD, + OUT PSECURITY_DESCRIPTOR AbsoluteSD, + IN PULONG AbsoluteSDSize, + IN PACL Dacl, + IN PULONG DaclSize, + IN PACL Sacl, + IN PULONG SaclSize, + IN PSID Owner, + IN PULONG OwnerSize, + IN PSID PrimaryGroup, + IN PULONG PrimaryGroupSize +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTSYSAPI +NTSTATUS +NTAPI +RtlSetGroupSecurityDescriptor ( + IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PSID Group, + IN BOOLEAN GroupDefaulted +); + +NTSYSAPI +NTSTATUS +NTAPI +RtlSetOwnerSecurityDescriptor ( + IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PSID Owner, + IN BOOLEAN OwnerDefaulted +); + +NTSYSAPI +NTSTATUS +NTAPI +RtlSetSaclSecurityDescriptor ( + IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, + IN BOOLEAN SaclPresent, + IN PACL Sacl, + IN BOOLEAN SaclDefaulted +); + +NTSYSAPI +PUCHAR +NTAPI +RtlSubAuthorityCountSid ( + IN PSID Sid +); + +NTSYSAPI +PULONG +NTAPI +RtlSubAuthoritySid ( + IN PSID Sid, + IN ULONG SubAuthority +); + +NTSYSAPI +BOOLEAN +NTAPI +RtlValidSid ( + IN PSID Sid +); + +NTKERNELAPI +NTSTATUS +NTAPI +SeAppendPrivileges ( + PACCESS_STATE AccessState, + PPRIVILEGE_SET Privileges +); + +NTKERNELAPI +BOOLEAN +NTAPI +SeAuditingFileEvents ( + IN BOOLEAN AccessGranted, + IN PSECURITY_DESCRIPTOR SecurityDescriptor +); + +NTKERNELAPI +BOOLEAN +NTAPI +SeAuditingFileOrGlobalEvents ( + IN BOOLEAN AccessGranted, + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PSECURITY_SUBJECT_CONTEXT SubjectContext +); + +NTKERNELAPI +VOID +NTAPI +SeCaptureSubjectContext ( + OUT PSECURITY_SUBJECT_CONTEXT SubjectContext +); + +NTKERNELAPI +NTSTATUS +NTAPI +SeCreateAccessState ( + OUT PACCESS_STATE AccessState, + IN PVOID AuxData, + IN ACCESS_MASK AccessMask, + IN PGENERIC_MAPPING Mapping +); + +NTKERNELAPI +NTSTATUS +NTAPI +SeCreateClientSecurity ( + IN PETHREAD Thread, + IN PSECURITY_QUALITY_OF_SERVICE QualityOfService, + IN BOOLEAN RemoteClient, + OUT PSECURITY_CLIENT_CONTEXT ClientContext +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTKERNELAPI +NTSTATUS +NTAPI +SeCreateClientSecurityFromSubjectContext ( + IN PSECURITY_SUBJECT_CONTEXT SubjectContext, + IN PSECURITY_QUALITY_OF_SERVICE QualityOfService, + IN BOOLEAN ServerIsRemote, + OUT PSECURITY_CLIENT_CONTEXT ClientContext +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +#define SeDeleteClientSecurity(C) { \ + if (SeTokenType((C)->ClientToken) == TokenPrimary) { \ + PsDereferencePrimaryToken( (C)->ClientToken ); \ + } else { \ + PsDereferenceImpersonationToken( (C)->ClientToken ); \ + } \ +} + +NTKERNELAPI +VOID +NTAPI +SeDeleteObjectAuditAlarm ( + IN PVOID Object, + IN HANDLE Handle +); + +#define SeEnableAccessToExports() SeExports = *(PSE_EXPORTS *)SeExports; + +NTKERNELAPI +VOID +NTAPI +SeFreePrivileges ( + IN PPRIVILEGE_SET Privileges +); + +NTKERNELAPI +VOID +NTAPI +SeImpersonateClient ( + IN PSECURITY_CLIENT_CONTEXT ClientContext, + IN PETHREAD ServerThread OPTIONAL +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTKERNELAPI +NTSTATUS +NTAPI +SeImpersonateClientEx ( + IN PSECURITY_CLIENT_CONTEXT ClientContext, + IN PETHREAD ServerThread OPTIONAL +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTKERNELAPI +VOID +NTAPI +SeLockSubjectContext ( + IN PSECURITY_SUBJECT_CONTEXT SubjectContext +); + +NTKERNELAPI +NTSTATUS +NTAPI +SeMarkLogonSessionForTerminationNotification ( + IN PLUID LogonId +); + +NTKERNELAPI +VOID +NTAPI +SeOpenObjectAuditAlarm ( + IN PUNICODE_STRING ObjectTypeName, + IN PVOID Object OPTIONAL, + IN PUNICODE_STRING AbsoluteObjectName OPTIONAL, + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PACCESS_STATE AccessState, + IN BOOLEAN ObjectCreated, + IN BOOLEAN AccessGranted, + IN KPROCESSOR_MODE AccessMode, + OUT PBOOLEAN GenerateOnClose +); + +NTKERNELAPI +VOID +NTAPI +SeOpenObjectForDeleteAuditAlarm ( + IN PUNICODE_STRING ObjectTypeName, + IN PVOID Object OPTIONAL, + IN PUNICODE_STRING AbsoluteObjectName OPTIONAL, + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PACCESS_STATE AccessState, + IN BOOLEAN ObjectCreated, + IN BOOLEAN AccessGranted, + IN KPROCESSOR_MODE AccessMode, + OUT PBOOLEAN GenerateOnClose +); + +NTKERNELAPI +BOOLEAN +NTAPI +SePrivilegeCheck ( + IN OUT PPRIVILEGE_SET RequiredPrivileges, + IN PSECURITY_SUBJECT_CONTEXT SubjectContext, + IN KPROCESSOR_MODE AccessMode +); + +NTKERNELAPI +NTSTATUS +NTAPI +SeQueryAuthenticationIdToken ( + IN PACCESS_TOKEN Token, + OUT PLUID LogonId +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTKERNELAPI +NTSTATUS +NTAPI +SeQueryInformationToken ( + IN PACCESS_TOKEN Token, + IN TOKEN_INFORMATION_CLASS TokenInformationClass, + OUT PVOID *TokenInformation +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTKERNELAPI +NTSTATUS +NTAPI +SeQuerySecurityDescriptorInfo ( + IN PSECURITY_INFORMATION SecurityInformation, + OUT PSECURITY_DESCRIPTOR SecurityDescriptor, + IN OUT PULONG Length, + IN PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTKERNELAPI +NTSTATUS +NTAPI +SeQuerySessionIdToken ( + IN PACCESS_TOKEN Token, + IN PULONG SessionId +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +#define SeQuerySubjectContextToken( SubjectContext ) \ + ( ARGUMENT_PRESENT( \ + ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->ClientToken \ + ) ? \ + ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->ClientToken : \ + ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->PrimaryToken ) + +typedef NTSTATUS (*PSE_LOGON_SESSION_TERMINATED_ROUTINE) ( + IN PLUID LogonId +); + +NTKERNELAPI +NTSTATUS +NTAPI +SeRegisterLogonSessionTerminatedRoutine ( + IN PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine +); + +NTKERNELAPI +VOID +NTAPI +SeReleaseSubjectContext ( + IN PSECURITY_SUBJECT_CONTEXT SubjectContext +); + +NTKERNELAPI +VOID +NTAPI +SeSetAccessStateGenericMapping ( + PACCESS_STATE AccessState, + PGENERIC_MAPPING GenericMapping +); + +NTKERNELAPI +NTSTATUS +NTAPI +SeSetSecurityDescriptorInfo ( + IN PVOID Object OPTIONAL, + IN PSECURITY_INFORMATION SecurityInformation, + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor, + IN POOL_TYPE PoolType, + IN PGENERIC_MAPPING GenericMapping +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTKERNELAPI +NTSTATUS +NTAPI +SeSetSecurityDescriptorInfoEx ( + IN PVOID Object OPTIONAL, + IN PSECURITY_INFORMATION SecurityInformation, + IN PSECURITY_DESCRIPTOR ModificationDescriptor, + IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor, + IN ULONG AutoInheritFlags, + IN POOL_TYPE PoolType, + IN PGENERIC_MAPPING GenericMapping +); + +NTKERNELAPI +BOOLEAN +NTAPI +SeTokenIsAdmin ( + IN PACCESS_TOKEN Token +); + +NTKERNELAPI +BOOLEAN +NTAPI +SeTokenIsRestricted ( + IN PACCESS_TOKEN Token +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTKERNELAPI +TOKEN_TYPE +NTAPI +SeTokenType ( + IN PACCESS_TOKEN Token +); + +NTKERNELAPI +VOID +NTAPI +SeUnlockSubjectContext ( + IN PSECURITY_SUBJECT_CONTEXT SubjectContext +); + +NTKERNELAPI +NTSTATUS +SeUnregisterLogonSessionTerminatedRoutine ( + IN PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTSYSAPI +NTSTATUS +NTAPI +ZwAdjustPrivilegesToken ( + IN HANDLE TokenHandle, + IN BOOLEAN DisableAllPrivileges, + IN PTOKEN_PRIVILEGES NewState, + IN ULONG BufferLength, + OUT PTOKEN_PRIVILEGES PreviousState OPTIONAL, + OUT PULONG ReturnLength +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTSYSAPI +NTSTATUS +NTAPI +ZwAlertThread ( + IN HANDLE ThreadHandle +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwAllocateVirtualMemory ( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN ULONG ZeroBits, + IN OUT PULONG RegionSize, + IN ULONG AllocationType, + IN ULONG Protect +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwAccessCheckAndAuditAlarm ( + IN PUNICODE_STRING SubsystemName, + IN PVOID HandleId, + IN PUNICODE_STRING ObjectTypeName, + IN PUNICODE_STRING ObjectName, + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN ACCESS_MASK DesiredAccess, + IN PGENERIC_MAPPING GenericMapping, + IN BOOLEAN ObjectCreation, + OUT PACCESS_MASK GrantedAccess, + OUT PBOOLEAN AccessStatus, + OUT PBOOLEAN GenerateOnClose +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTSYSAPI +NTSTATUS +NTAPI +ZwCancelIoFile ( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTSYSAPI +NTSTATUS +NTAPI +ZwClearEvent ( + IN HANDLE EventHandle +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwCloseObjectAuditAlarm ( + IN PUNICODE_STRING SubsystemName, + IN PVOID HandleId, + IN BOOLEAN GenerateOnClose +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwCreateSection ( + OUT PHANDLE SectionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN PLARGE_INTEGER MaximumSize OPTIONAL, + IN ULONG SectionPageProtection, + IN ULONG AllocationAttributes, + IN HANDLE FileHandle OPTIONAL +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwCreateSymbolicLinkObject ( + OUT PHANDLE SymbolicLinkHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN PUNICODE_STRING TargetName +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwDeleteFile ( + IN POBJECT_ATTRIBUTES ObjectAttributes +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwDeleteValueKey ( + IN HANDLE Handle, + IN PUNICODE_STRING Name +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwDeviceIoControlFile ( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG IoControlCode, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwDisplayString ( + IN PUNICODE_STRING String +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwDuplicateObject ( + IN HANDLE SourceProcessHandle, + IN HANDLE SourceHandle, + IN HANDLE TargetProcessHandle OPTIONAL, + OUT PHANDLE TargetHandle OPTIONAL, + IN ACCESS_MASK DesiredAccess, + IN ULONG HandleAttributes, + IN ULONG Options +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwDuplicateToken ( + IN HANDLE ExistingTokenHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN BOOLEAN EffectiveOnly, + IN TOKEN_TYPE TokenType, + OUT PHANDLE NewTokenHandle +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwFlushInstructionCache ( + IN HANDLE ProcessHandle, + IN PVOID BaseAddress OPTIONAL, + IN ULONG FlushSize +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTSYSAPI +NTSTATUS +NTAPI +ZwFlushVirtualMemory ( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN OUT PULONG FlushSize, + OUT PIO_STATUS_BLOCK IoStatusBlock +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTSYSAPI +NTSTATUS +NTAPI +ZwFreeVirtualMemory ( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN OUT PULONG RegionSize, + IN ULONG FreeType +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwFsControlFile ( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG FsControlCode, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTSYSAPI +NTSTATUS +NTAPI +ZwInitiatePowerAction ( + IN POWER_ACTION SystemAction, + IN SYSTEM_POWER_STATE MinSystemState, + IN ULONG Flags, + IN BOOLEAN Asynchronous +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTSYSAPI +NTSTATUS +NTAPI +ZwLoadDriver ( + /* "\\Registry\\Machine\\System\\CurrentControlSet\\Services\\<DriverName>" */ + IN PUNICODE_STRING RegistryPath +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwLoadKey ( + IN POBJECT_ATTRIBUTES KeyObjectAttributes, + IN POBJECT_ATTRIBUTES FileObjectAttributes +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwNotifyChangeKey ( + IN HANDLE KeyHandle, + IN HANDLE EventHandle OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG NotifyFilter, + IN BOOLEAN WatchSubtree, + IN PVOID Buffer, + IN ULONG BufferLength, + IN BOOLEAN Asynchronous +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenDirectoryObject ( + OUT PHANDLE DirectoryHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenEvent ( + OUT PHANDLE EventHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenProcess ( + OUT PHANDLE ProcessHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN PCLIENT_ID ClientId OPTIONAL +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenProcessToken ( + IN HANDLE ProcessHandle, + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE TokenHandle +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenThread ( + OUT PHANDLE ThreadHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN PCLIENT_ID ClientId +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenThreadToken ( + IN HANDLE ThreadHandle, + IN ACCESS_MASK DesiredAccess, + IN BOOLEAN OpenAsSelf, + OUT PHANDLE TokenHandle +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTSYSAPI +NTSTATUS +NTAPI +ZwPowerInformation ( + IN POWER_INFORMATION_LEVEL PowerInformationLevel, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTSYSAPI +NTSTATUS +NTAPI +ZwPulseEvent ( + IN HANDLE EventHandle, + OUT PULONG PreviousState OPTIONAL +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryDefaultLocale ( + IN BOOLEAN ThreadOrSystem, + OUT PLCID Locale +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryDirectoryFile ( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass, + IN BOOLEAN ReturnSingleEntry, + IN PUNICODE_STRING FileName OPTIONAL, + IN BOOLEAN RestartScan +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryDirectoryObject ( + IN HANDLE DirectoryHandle, + OUT PVOID Buffer, + IN ULONG Length, + IN BOOLEAN ReturnSingleEntry, + IN BOOLEAN RestartScan, + IN OUT PULONG Context, + OUT PULONG ReturnLength OPTIONAL +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryEaFile ( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN BOOLEAN ReturnSingleEntry, + IN PVOID EaList OPTIONAL, + IN ULONG EaListLength, + IN PULONG EaIndex OPTIONAL, + IN BOOLEAN RestartScan +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryInformationProcess ( + IN HANDLE ProcessHandle, + IN PROCESSINFOCLASS ProcessInformationClass, + OUT PVOID ProcessInformation, + IN ULONG ProcessInformationLength, + OUT PULONG ReturnLength OPTIONAL +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryInformationToken ( + IN HANDLE TokenHandle, + IN TOKEN_INFORMATION_CLASS TokenInformationClass, + OUT PVOID TokenInformation, + IN ULONG Length, + OUT PULONG ResultLength +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryObject ( + IN HANDLE ObjectHandle, + IN OBJECT_INFORMATION_CLASS ObjectInformationClass, + OUT PVOID ObjectInformation, + IN ULONG Length, + OUT PULONG ResultLength +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQuerySection ( + IN HANDLE SectionHandle, + IN SECTION_INFORMATION_CLASS SectionInformationClass, + OUT PVOID SectionInformation, + IN ULONG SectionInformationLength, + OUT PULONG ResultLength OPTIONAL +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQuerySecurityObject ( + IN HANDLE FileHandle, + IN SECURITY_INFORMATION SecurityInformation, + OUT PSECURITY_DESCRIPTOR SecurityDescriptor, + IN ULONG Length, + OUT PULONG ResultLength +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQuerySystemInformation ( + IN SYSTEM_INFORMATION_CLASS SystemInformationClass, + OUT PVOID SystemInformation, + IN ULONG Length, + OUT PULONG ReturnLength +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryVolumeInformationFile ( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FsInformation, + IN ULONG Length, + IN FS_INFORMATION_CLASS FsInformationClass +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwReplaceKey ( + IN POBJECT_ATTRIBUTES NewFileObjectAttributes, + IN HANDLE KeyHandle, + IN POBJECT_ATTRIBUTES OldFileObjectAttributes +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwResetEvent ( + IN HANDLE EventHandle, + OUT PULONG PreviousState OPTIONAL +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTSYSAPI +NTSTATUS +NTAPI +ZwRestoreKey ( + IN HANDLE KeyHandle, + IN HANDLE FileHandle, + IN ULONG Flags +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTSYSAPI +NTSTATUS +NTAPI +ZwSaveKey ( + IN HANDLE KeyHandle, + IN HANDLE FileHandle +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetDefaultLocale ( + IN BOOLEAN ThreadOrSystem, + IN LCID Locale +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetDefaultUILanguage ( + IN LANGID LanguageId +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetEaFile ( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetEvent ( + IN HANDLE EventHandle, + OUT PULONG PreviousState OPTIONAL +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetInformationObject ( + IN HANDLE ObjectHandle, + IN OBJECT_INFORMATION_CLASS ObjectInformationClass, + IN PVOID ObjectInformation, + IN ULONG ObjectInformationLength +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetInformationProcess ( + IN HANDLE ProcessHandle, + IN PROCESSINFOCLASS ProcessInformationClass, + IN PVOID ProcessInformation, + IN ULONG ProcessInformationLength +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetSecurityObject ( + IN HANDLE Handle, + IN SECURITY_INFORMATION SecurityInformation, + IN PSECURITY_DESCRIPTOR SecurityDescriptor +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetSystemInformation ( + IN SYSTEM_INFORMATION_CLASS SystemInformationClass, + IN PVOID SystemInformation, + IN ULONG Length +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetSystemTime ( + IN PLARGE_INTEGER NewTime, + OUT PLARGE_INTEGER OldTime OPTIONAL +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetVolumeInformationFile ( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID FsInformation, + IN ULONG Length, + IN FS_INFORMATION_CLASS FsInformationClass +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTSYSAPI +NTSTATUS +NTAPI +ZwTerminateProcess ( + IN HANDLE ProcessHandle OPTIONAL, + IN NTSTATUS ExitStatus +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwUnloadDriver ( + /* "\\Registry\\Machine\\System\\CurrentControlSet\\Services\\<DriverName>" */ + IN PUNICODE_STRING RegistryPath +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwUnloadKey ( + IN POBJECT_ATTRIBUTES KeyObjectAttributes +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwWaitForSingleObject ( + IN HANDLE Handle, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Timeout OPTIONAL +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwWaitForMultipleObjects ( + IN ULONG HandleCount, + IN PHANDLE Handles, + IN WAIT_TYPE WaitType, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Timeout OPTIONAL +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwYieldExecution ( + VOID +); + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* _NTIFS_ */ diff --git a/reactos/w32api/include/ddk/ntpoapi.h b/reactos/w32api/include/ddk/ntpoapi.h new file mode 100644 index 00000000000..d33de714037 --- /dev/null +++ b/reactos/w32api/include/ddk/ntpoapi.h @@ -0,0 +1,234 @@ +/* + * ntpoapi.h + * + * APIs for power management. + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __NTPOAPI_H +#define __NTPOAPI_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" +#include "batclass.h" + +#define POWER_PERF_SCALE 100 +#define PERF_LEVEL_TO_PERCENT(x) (((x) * 1000) / (POWER_PERF_SCALE * 10)) +#define PERCENT_TO_PERF_LEVEL(x) (((x) * POWER_PERF_SCALE * 10) / 1000) + +typedef struct _PROCESSOR_IDLE_TIMES { + ULONGLONG StartTime; + ULONGLONG EndTime; + ULONG IdleHandlerReserved[4]; +} PROCESSOR_IDLE_TIMES, *PPROCESSOR_IDLE_TIMES; + +typedef BOOLEAN DDKFASTAPI +(*PPROCESSOR_IDLE_HANDLER)( + IN OUT PPROCESSOR_IDLE_TIMES IdleTimes); + +typedef struct _PROCESSOR_IDLE_HANDLER_INFO { + ULONG HardwareLatency; + PPROCESSOR_IDLE_HANDLER Handler; +} PROCESSOR_IDLE_HANDLER_INFO, *PPROCESSOR_IDLE_HANDLER_INFO; + +typedef VOID DDKFASTAPI +(*PSET_PROCESSOR_THROTTLE)( + IN UCHAR Throttle); + +typedef NTSTATUS DDKFASTAPI +(*PSET_PROCESSOR_THROTTLE2)( + IN UCHAR Throttle); + +#define MAX_IDLE_HANDLERS 3 + +typedef struct _PROCESSOR_STATE_HANDLER { + UCHAR ThrottleScale; + BOOLEAN ThrottleOnIdle; + PSET_PROCESSOR_THROTTLE SetThrottle; + ULONG NumIdleHandlers; + PROCESSOR_IDLE_HANDLER_INFO IdleHandler[MAX_IDLE_HANDLERS]; +} PROCESSOR_STATE_HANDLER, *PPROCESSOR_STATE_HANDLER; + +typedef enum _POWER_STATE_HANDLER_TYPE { + PowerStateSleeping1, + PowerStateSleeping2, + PowerStateSleeping3, + PowerStateSleeping4, + PowerStateSleeping4Firmware, + PowerStateShutdownReset, + PowerStateShutdownOff, + PowerStateMaximum +} POWER_STATE_HANDLER_TYPE, *PPOWER_STATE_HANDLER_TYPE; + +typedef NTSTATUS DDKAPI +(*PENTER_STATE_SYSTEM_HANDLER)( + IN PVOID SystemContext); + +typedef NTSTATUS DDKAPI +(*PENTER_STATE_HANDLER)( + IN PVOID Context, + IN PENTER_STATE_SYSTEM_HANDLER SystemHandler OPTIONAL, + IN PVOID SystemContext, + IN LONG NumberProcessors, + IN VOLATILE PLONG Number); + +typedef struct _POWER_STATE_HANDLER { + POWER_STATE_HANDLER_TYPE Type; + BOOLEAN RtcWake; + UCHAR Spare[3]; + PENTER_STATE_HANDLER Handler; + PVOID Context; +} POWER_STATE_HANDLER, *PPOWER_STATE_HANDLER; + +typedef NTSTATUS STDCALL +(*PENTER_STATE_NOTIFY_HANDLER)( + IN POWER_STATE_HANDLER_TYPE State, + IN PVOID Context, + IN BOOLEAN Entering); + +typedef struct _POWER_STATE_NOTIFY_HANDLER { + PENTER_STATE_NOTIFY_HANDLER Handler; + PVOID Context; +} POWER_STATE_NOTIFY_HANDLER, *PPOWER_STATE_NOTIFY_HANDLER; + +NTOSAPI +NTSTATUS +DDKAPI +NtPowerInformation( + IN POWER_INFORMATION_LEVEL InformationLevel, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength); + +#define PROCESSOR_STATE_TYPE_PERFORMANCE 1 +#define PROCESSOR_STATE_TYPE_THROTTLE 2 + +typedef struct _PROCESSOR_PERF_LEVEL { + UCHAR PercentFrequency; + UCHAR Reserved; + USHORT Flags; +} PROCESSOR_PERF_LEVEL, *PPROCESSOR_PERF_LEVEL; + +typedef struct _PROCESSOR_PERF_STATE { + UCHAR PercentFrequency; + UCHAR MinCapacity; + USHORT Power; + UCHAR IncreaseLevel; + UCHAR DecreaseLevel; + USHORT Flags; + ULONG IncreaseTime; + ULONG DecreaseTime; + ULONG IncreaseCount; + ULONG DecreaseCount; + ULONGLONG PerformanceTime; +} PROCESSOR_PERF_STATE, *PPROCESSOR_PERF_STATE; + +typedef struct _PROCESSOR_STATE_HANDLER2 { + ULONG NumIdleHandlers; + PROCESSOR_IDLE_HANDLER_INFO IdleHandler[MAX_IDLE_HANDLERS]; + PSET_PROCESSOR_THROTTLE2 SetPerfLevel; + ULONG HardwareLatency; + UCHAR NumPerfStates; + PROCESSOR_PERF_LEVEL PerfLevel[1]; +} PROCESSOR_STATE_HANDLER2, *PPROCESSOR_STATE_HANDLER2; + + +NTOSAPI +NTSTATUS +DDKAPI +NtSetThreadExecutionState( + IN EXECUTION_STATE esFlags, + OUT EXECUTION_STATE *PreviousFlags); + +NTOSAPI +NTSTATUS +DDKAPI +NtRequestWakeupLatency( + IN LATENCY_TIME latency); + +NTOSAPI +NTSTATUS +DDKAPI +NtInitiatePowerAction( + IN POWER_ACTION SystemAction, + IN SYSTEM_POWER_STATE MinSystemState, + IN ULONG Flags, + IN BOOLEAN Asynchronous); + +NTOSAPI +NTSTATUS +DDKAPI +NtSetSystemPowerState( + IN POWER_ACTION SystemAction, + IN SYSTEM_POWER_STATE MinSystemState, + IN ULONG Flags); + +NTOSAPI +NTSTATUS +DDKAPI +NtGetDevicePowerState( + IN HANDLE Device, + OUT DEVICE_POWER_STATE *State); + +NTOSAPI +NTSTATUS +DDKAPI +NtCancelDeviceWakeupRequest( + IN HANDLE Device); + +NTOSAPI +BOOLEAN +DDKAPI +NtIsSystemResumeAutomatic( + VOID); + +NTOSAPI +NTSTATUS +DDKAPI +NtRequestDeviceWakeup( + IN HANDLE Device); + +#define WINLOGON_LOCK_ON_SLEEP 0x00000001 + +typedef struct _PROCESSOR_POWER_INFORMATION { + ULONG Number; + ULONG MaxMhz; + ULONG CurrentMhz; + ULONG MhzLimit; + ULONG MaxIdleState; + ULONG CurrentIdleState; +} PROCESSOR_POWER_INFORMATION, *PPROCESSOR_POWER_INFORMATION; + + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __NTPOAPI_H */ diff --git a/reactos/w32api/include/ddk/ntstatus.h b/reactos/w32api/include/ddk/ntstatus.h new file mode 100644 index 00000000000..d325d9f1144 --- /dev/null +++ b/reactos/w32api/include/ddk/ntstatus.h @@ -0,0 +1,1105 @@ +/* + * ntstatus.h + * + * Windows NT status codes + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 _NTSTATUS_H +#define _NTSTATUS_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(STATUS_SUCCESS) +#define STATUS_SUCCESS ((NTSTATUS)0x00000000L) +#endif /* !STATUS_SUCCESS */ +#define FACILITY_DEBUGGER 0x1 +#define FACILITY_RPC_RUNTIME 0x2 +#define FACILITY_RPC_STUBS 0x3 +#define FACILITY_IO_ERROR_CODE 0x4 +#define FACILITY_TERMINAL_SERVER 0xA +#define FACILITY_USB_ERROR_CODE 0x10 +#define FACILITY_HID_ERROR_CODE 0x11 +#define FACILITY_FIREWIRE_ERROR_CODE 0x12 +#define FACILITY_CLUSTER_ERROR_CODE 0x13 +#define FACILITY_ACPI_ERROR_CODE 0x14 +#define FACILITY_SXS_ERROR_CODE 0x15 +#define STATUS_SEVERITY_SUCCESS 0x0 +#define STATUS_SEVERITY_INFORMATIONAL 0x1 +#define STATUS_SEVERITY_WARNING 0x2 +#define STATUS_SEVERITY_ERROR 0x3 +#define STATUS_WAIT_0 ((NTSTATUS)0x00000000L) +#define STATUS_WAIT_1 ((NTSTATUS)0x00000001L) +#define STATUS_WAIT_2 ((NTSTATUS)0x00000002L) +#define STATUS_WAIT_3 ((NTSTATUS)0x00000003L) +#define STATUS_WAIT_63 ((NTSTATUS)0x0000003FL) +#define STATUS_ABANDONED ((NTSTATUS)0x00000080L) +#define STATUS_ABANDONED_WAIT_0 ((NTSTATUS)0x00000080L) +#define STATUS_ABANDONED_WAIT_63 ((NTSTATUS)0x000000BFL) +#define STATUS_USER_APC ((NTSTATUS)0x000000C0L) +#define STATUS_KERNEL_APC ((NTSTATUS)0x00000100L) +#define STATUS_ALERTED ((NTSTATUS)0x00000101L) +#define STATUS_TIMEOUT ((NTSTATUS)0x00000102L) +#define STATUS_PENDING ((NTSTATUS)0x00000103L) +#define STATUS_REPARSE ((NTSTATUS)0x00000104L) +#define STATUS_MORE_ENTRIES ((NTSTATUS)0x00000105L) +#define STATUS_NOT_ALL_ASSIGNED ((NTSTATUS)0x00000106L) +#define STATUS_SOME_NOT_MAPPED ((NTSTATUS)0x00000107L) +#define STATUS_OPLOCK_BREAK_IN_PROGRESS ((NTSTATUS)0x00000108L) +#define STATUS_VOLUME_MOUNTED ((NTSTATUS)0x00000109L) +#define STATUS_RXACT_COMMITTED ((NTSTATUS)0x0000010AL) +#define STATUS_NOTIFY_CLEANUP ((NTSTATUS)0x0000010BL) +#define STATUS_NOTIFY_ENUM_DIR ((NTSTATUS)0x0000010CL) +#define STATUS_NO_QUOTAS_FOR_ACCOUNT ((NTSTATUS)0x0000010DL) +#define STATUS_PRIMARY_TRANSPORT_CONNECT_FAILED ((NTSTATUS)0x0000010EL) +#define STATUS_PAGE_FAULT_TRANSITION ((NTSTATUS)0x00000110L) +#define STATUS_PAGE_FAULT_DEMAND_ZERO ((NTSTATUS)0x00000111L) +#define STATUS_PAGE_FAULT_COPY_ON_WRITE ((NTSTATUS)0x00000112L) +#define STATUS_PAGE_FAULT_GUARD_PAGE ((NTSTATUS)0x00000113L) +#define STATUS_PAGE_FAULT_PAGING_FILE ((NTSTATUS)0x00000114L) +#define STATUS_CACHE_PAGE_LOCKED ((NTSTATUS)0x00000115L) +#define STATUS_CRASH_DUMP ((NTSTATUS)0x00000116L) +#define STATUS_BUFFER_ALL_ZEROS ((NTSTATUS)0x00000117L) +#define STATUS_REPARSE_OBJECT ((NTSTATUS)0x00000118L) +#define STATUS_RESOURCE_REQUIREMENTS_CHANGED ((NTSTATUS)0x00000119L) +#define STATUS_TRANSLATION_COMPLETE ((NTSTATUS)0x00000120L) +#define STATUS_DS_MEMBERSHIP_EVALUATED_LOCALLY ((NTSTATUS)0x00000121L) +#define STATUS_NOTHING_TO_TERMINATE ((NTSTATUS)0x00000122L) +#define STATUS_PROCESS_NOT_IN_JOB ((NTSTATUS)0x00000123L) +#define STATUS_PROCESS_IN_JOB ((NTSTATUS)0x00000124L) +#define STATUS_OBJECT_NAME_EXISTS ((NTSTATUS)0x40000000L) +#define STATUS_THREAD_WAS_SUSPENDED ((NTSTATUS)0x40000001L) +#define STATUS_WORKING_SET_LIMIT_RANGE ((NTSTATUS)0x40000002L) +#define STATUS_IMAGE_NOT_AT_BASE ((NTSTATUS)0x40000003L) +#define STATUS_RXACT_STATE_CREATED ((NTSTATUS)0x40000004L) +#define STATUS_SEGMENT_NOTIFICATION ((NTSTATUS)0x40000005L) +#define STATUS_LOCAL_USER_SESSION_KEY ((NTSTATUS)0x40000006L) +#define STATUS_BAD_CURRENT_DIRECTORY ((NTSTATUS)0x40000007L) +#define STATUS_SERIAL_MORE_WRITES ((NTSTATUS)0x40000008L) +#define STATUS_REGISTRY_RECOVERED ((NTSTATUS)0x40000009L) +#define STATUS_FT_READ_RECOVERY_FROM_BACKUP ((NTSTATUS)0x4000000AL) +#define STATUS_FT_WRITE_RECOVERY ((NTSTATUS)0x4000000BL) +#define STATUS_SERIAL_COUNTER_TIMEOUT ((NTSTATUS)0x4000000CL) +#define STATUS_NULL_LM_PASSWORD ((NTSTATUS)0x4000000DL) +#define STATUS_IMAGE_MACHINE_TYPE_MISMATCH ((NTSTATUS)0x4000000EL) +#define STATUS_RECEIVE_PARTIAL ((NTSTATUS)0x4000000FL) +#define STATUS_RECEIVE_EXPEDITED ((NTSTATUS)0x40000010L) +#define STATUS_RECEIVE_PARTIAL_EXPEDITED ((NTSTATUS)0x40000011L) +#define STATUS_EVENT_DONE ((NTSTATUS)0x40000012L) +#define STATUS_EVENT_PENDING ((NTSTATUS)0x40000013L) +#define STATUS_CHECKING_FILE_SYSTEM ((NTSTATUS)0x40000014L) +#define STATUS_FATAL_APP_EXIT ((NTSTATUS)0x40000015L) +#define STATUS_PREDEFINED_HANDLE ((NTSTATUS)0x40000016L) +#define STATUS_WAS_UNLOCKED ((NTSTATUS)0x40000017L) +#define STATUS_SERVICE_NOTIFICATION ((NTSTATUS)0x40000018L) +#define STATUS_WAS_LOCKED ((NTSTATUS)0x40000019L) +#define STATUS_LOG_HARD_ERROR ((NTSTATUS)0x4000001AL) +#define STATUS_ALREADY_WIN32 ((NTSTATUS)0x4000001BL) +#define STATUS_WX86_UNSIMULATE ((NTSTATUS)0x4000001CL) +#define STATUS_WX86_CONTINUE ((NTSTATUS)0x4000001DL) +#define STATUS_WX86_SINGLE_STEP ((NTSTATUS)0x4000001EL) +#define STATUS_WX86_BREAKPOINT ((NTSTATUS)0x4000001FL) +#define STATUS_WX86_EXCEPTION_CONTINUE ((NTSTATUS)0x40000020L) +#define STATUS_WX86_EXCEPTION_LASTCHANCE ((NTSTATUS)0x40000021L) +#define STATUS_WX86_EXCEPTION_CHAIN ((NTSTATUS)0x40000022L) +#define STATUS_IMAGE_MACHINE_TYPE_MISMATCH_EXE ((NTSTATUS)0x40000023L) +#define STATUS_NO_YIELD_PERFORMED ((NTSTATUS)0x40000024L) +#define STATUS_TIMER_RESUME_IGNORED ((NTSTATUS)0x40000025L) +#define STATUS_ARBITRATION_UNHANDLED ((NTSTATUS)0x40000026L) +#define STATUS_CARDBUS_NOT_SUPPORTED ((NTSTATUS)0x40000027L) +#define STATUS_WX86_CREATEWX86TIB ((NTSTATUS)0x40000028L) +#define STATUS_MP_PROCESSOR_MISMATCH ((NTSTATUS)0x40000029L) +#define STATUS_HIBERNATED ((NTSTATUS)0x4000002AL) +#define STATUS_RESUME_HIBERNATION ((NTSTATUS)0x4000002BL) +#define STATUS_GUARD_PAGE_VIOLATION ((NTSTATUS)0x80000001L) +#define STATUS_DATATYPE_MISALIGNMENT ((NTSTATUS)0x80000002L) +#define STATUS_BREAKPOINT ((NTSTATUS)0x80000003L) +#define STATUS_SINGLE_STEP ((NTSTATUS)0x80000004L) +#define STATUS_BUFFER_OVERFLOW ((NTSTATUS)0x80000005L) +#define STATUS_NO_MORE_FILES ((NTSTATUS)0x80000006L) +#define STATUS_WAKE_SYSTEM_DEBUGGER ((NTSTATUS)0x80000007L) +#define STATUS_HANDLES_CLOSED ((NTSTATUS)0x8000000AL) +#define STATUS_NO_INHERITANCE ((NTSTATUS)0x8000000BL) +#define STATUS_GUID_SUBSTITUTION_MADE ((NTSTATUS)0x8000000CL) +#define STATUS_PARTIAL_COPY ((NTSTATUS)0x8000000DL) +#define STATUS_DEVICE_PAPER_EMPTY ((NTSTATUS)0x8000000EL) +#define STATUS_DEVICE_POWERED_OFF ((NTSTATUS)0x8000000FL) +#define STATUS_DEVICE_OFF_LINE ((NTSTATUS)0x80000010L) +#define STATUS_DEVICE_BUSY ((NTSTATUS)0x80000011L) +#define STATUS_NO_MORE_EAS ((NTSTATUS)0x80000012L) +#define STATUS_INVALID_EA_NAME ((NTSTATUS)0x80000013L) +#define STATUS_EA_LIST_INCONSISTENT ((NTSTATUS)0x80000014L) +#define STATUS_INVALID_EA_FLAG ((NTSTATUS)0x80000015L) +#define STATUS_VERIFY_REQUIRED ((NTSTATUS)0x80000016L) +#define STATUS_EXTRANEOUS_INFORMATION ((NTSTATUS)0x80000017L) +#define STATUS_RXACT_COMMIT_NECESSARY ((NTSTATUS)0x80000018L) +#define STATUS_NO_MORE_ENTRIES ((NTSTATUS)0x8000001AL) +#define STATUS_FILEMARK_DETECTED ((NTSTATUS)0x8000001BL) +#define STATUS_MEDIA_CHANGED ((NTSTATUS)0x8000001CL) +#define STATUS_BUS_RESET ((NTSTATUS)0x8000001DL) +#define STATUS_END_OF_MEDIA ((NTSTATUS)0x8000001EL) +#define STATUS_BEGINNING_OF_MEDIA ((NTSTATUS)0x8000001FL) +#define STATUS_MEDIA_CHECK ((NTSTATUS)0x80000020L) +#define STATUS_SETMARK_DETECTED ((NTSTATUS)0x80000021L) +#define STATUS_NO_DATA_DETECTED ((NTSTATUS)0x80000022L) +#define STATUS_REDIRECTOR_HAS_OPEN_HANDLES ((NTSTATUS)0x80000023L) +#define STATUS_SERVER_HAS_OPEN_HANDLES ((NTSTATUS)0x80000024L) +#define STATUS_ALREADY_DISCONNECTED ((NTSTATUS)0x80000025L) +#define STATUS_LONGJUMP ((NTSTATUS)0x80000026L) +#define STATUS_CLEANER_CARTRIDGE_INSTALLED ((NTSTATUS)0x80000027L) +#define STATUS_PLUGPLAY_QUERY_VETOED ((NTSTATUS)0x80000028L) +#define STATUS_UNWIND_CONSOLIDATE ((NTSTATUS)0x80000029L) +#define STATUS_CLUSTER_NODE_ALREADY_UP ((NTSTATUS)0x80130001L) +#define STATUS_CLUSTER_NODE_ALREADY_DOWN ((NTSTATUS)0x80130002L) +#define STATUS_CLUSTER_NETWORK_ALREADY_ONLINE ((NTSTATUS)0x80130003L) +#define STATUS_CLUSTER_NETWORK_ALREADY_OFFLINE ((NTSTATUS)0x80130004L) +#define STATUS_CLUSTER_NODE_ALREADY_MEMBER ((NTSTATUS)0x80130005L) +#define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L) +#define STATUS_NOT_IMPLEMENTED ((NTSTATUS)0xC0000002L) +#define STATUS_INVALID_INFO_CLASS ((NTSTATUS)0xC0000003L) +#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L) +#define STATUS_ACCESS_VIOLATION ((NTSTATUS)0xC0000005L) +#define STATUS_IN_PAGE_ERROR ((NTSTATUS)0xC0000006L) +#define STATUS_PAGEFILE_QUOTA ((NTSTATUS)0xC0000007L) +#define STATUS_INVALID_HANDLE ((NTSTATUS)0xC0000008L) +#define STATUS_BAD_INITIAL_STACK ((NTSTATUS)0xC0000009L) +#define STATUS_BAD_INITIAL_PC ((NTSTATUS)0xC000000AL) +#define STATUS_INVALID_CID ((NTSTATUS)0xC000000BL) +#define STATUS_TIMER_NOT_CANCELED ((NTSTATUS)0xC000000CL) +#define STATUS_INVALID_PARAMETER ((NTSTATUS)0xC000000DL) +#define STATUS_NO_SUCH_DEVICE ((NTSTATUS)0xC000000EL) +#define STATUS_NO_SUCH_FILE ((NTSTATUS)0xC000000FL) +#define STATUS_INVALID_DEVICE_REQUEST ((NTSTATUS)0xC0000010L) +#define STATUS_END_OF_FILE ((NTSTATUS)0xC0000011L) +#define STATUS_WRONG_VOLUME ((NTSTATUS)0xC0000012L) +#define STATUS_NO_MEDIA_IN_DEVICE ((NTSTATUS)0xC0000013L) +#define STATUS_UNRECOGNIZED_MEDIA ((NTSTATUS)0xC0000014L) +#define STATUS_NONEXISTENT_SECTOR ((NTSTATUS)0xC0000015L) +#define STATUS_MORE_PROCESSING_REQUIRED ((NTSTATUS)0xC0000016L) +#define STATUS_NO_MEMORY ((NTSTATUS)0xC0000017L) +#define STATUS_CONFLICTING_ADDRESSES ((NTSTATUS)0xC0000018L) +#define STATUS_NOT_MAPPED_VIEW ((NTSTATUS)0xC0000019L) +#define STATUS_UNABLE_TO_FREE_VM ((NTSTATUS)0xC000001AL) +#define STATUS_UNABLE_TO_DELETE_SECTION ((NTSTATUS)0xC000001BL) +#define STATUS_INVALID_SYSTEM_SERVICE ((NTSTATUS)0xC000001CL) +#define STATUS_ILLEGAL_INSTRUCTION ((NTSTATUS)0xC000001DL) +#define STATUS_INVALID_LOCK_SEQUENCE ((NTSTATUS)0xC000001EL) +#define STATUS_INVALID_VIEW_SIZE ((NTSTATUS)0xC000001FL) +#define STATUS_INVALID_FILE_FOR_SECTION ((NTSTATUS)0xC0000020L) +#define STATUS_ALREADY_COMMITTED ((NTSTATUS)0xC0000021L) +#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L) +#define STATUS_BUFFER_TOO_SMALL ((NTSTATUS)0xC0000023L) +#define STATUS_OBJECT_TYPE_MISMATCH ((NTSTATUS)0xC0000024L) +#define STATUS_NONCONTINUABLE_EXCEPTION ((NTSTATUS)0xC0000025L) +#define STATUS_INVALID_DISPOSITION ((NTSTATUS)0xC0000026L) +#define STATUS_UNWIND ((NTSTATUS)0xC0000027L) +#define STATUS_BAD_STACK ((NTSTATUS)0xC0000028L) +#define STATUS_INVALID_UNWIND_TARGET ((NTSTATUS)0xC0000029L) +#define STATUS_NOT_LOCKED ((NTSTATUS)0xC000002AL) +#define STATUS_PARITY_ERROR ((NTSTATUS)0xC000002BL) +#define STATUS_UNABLE_TO_DECOMMIT_VM ((NTSTATUS)0xC000002CL) +#define STATUS_NOT_COMMITTED ((NTSTATUS)0xC000002DL) +#define STATUS_INVALID_PORT_ATTRIBUTES ((NTSTATUS)0xC000002EL) +#define STATUS_PORT_MESSAGE_TOO_LONG ((NTSTATUS)0xC000002FL) +#define STATUS_INVALID_PARAMETER_MIX ((NTSTATUS)0xC0000030L) +#define STATUS_INVALID_QUOTA_LOWER ((NTSTATUS)0xC0000031L) +#define STATUS_DISK_CORRUPT_ERROR ((NTSTATUS)0xC0000032L) +#define STATUS_OBJECT_NAME_INVALID ((NTSTATUS)0xC0000033L) +#define STATUS_OBJECT_NAME_NOT_FOUND ((NTSTATUS)0xC0000034L) +#define STATUS_OBJECT_NAME_COLLISION ((NTSTATUS)0xC0000035L) +#define STATUS_PORT_DISCONNECTED ((NTSTATUS)0xC0000037L) +#define STATUS_DEVICE_ALREADY_ATTACHED ((NTSTATUS)0xC0000038L) +#define STATUS_OBJECT_PATH_INVALID ((NTSTATUS)0xC0000039L) +#define STATUS_OBJECT_PATH_NOT_FOUND ((NTSTATUS)0xC000003AL) +#define STATUS_OBJECT_PATH_SYNTAX_BAD ((NTSTATUS)0xC000003BL) +#define STATUS_DATA_OVERRUN ((NTSTATUS)0xC000003CL) +#define STATUS_DATA_LATE_ERROR ((NTSTATUS)0xC000003DL) +#define STATUS_DATA_ERROR ((NTSTATUS)0xC000003EL) +#define STATUS_CRC_ERROR ((NTSTATUS)0xC000003FL) +#define STATUS_SECTION_TOO_BIG ((NTSTATUS)0xC0000040L) +#define STATUS_PORT_CONNECTION_REFUSED ((NTSTATUS)0xC0000041L) +#define STATUS_INVALID_PORT_HANDLE ((NTSTATUS)0xC0000042L) +#define STATUS_SHARING_VIOLATION ((NTSTATUS)0xC0000043L) +#define STATUS_QUOTA_EXCEEDED ((NTSTATUS)0xC0000044L) +#define STATUS_INVALID_PAGE_PROTECTION ((NTSTATUS)0xC0000045L) +#define STATUS_MUTANT_NOT_OWNED ((NTSTATUS)0xC0000046L) +#define STATUS_SEMAPHORE_LIMIT_EXCEEDED ((NTSTATUS)0xC0000047L) +#define STATUS_PORT_ALREADY_SET ((NTSTATUS)0xC0000048L) +#define STATUS_SECTION_NOT_IMAGE ((NTSTATUS)0xC0000049L) +#define STATUS_SUSPEND_COUNT_EXCEEDED ((NTSTATUS)0xC000004AL) +#define STATUS_THREAD_IS_TERMINATING ((NTSTATUS)0xC000004BL) +#define STATUS_BAD_WORKING_SET_LIMIT ((NTSTATUS)0xC000004CL) +#define STATUS_INCOMPATIBLE_FILE_MAP ((NTSTATUS)0xC000004DL) +#define STATUS_SECTION_PROTECTION ((NTSTATUS)0xC000004EL) +#define STATUS_EAS_NOT_SUPPORTED ((NTSTATUS)0xC000004FL) +#define STATUS_EA_TOO_LARGE ((NTSTATUS)0xC0000050L) +#define STATUS_NONEXISTENT_EA_ENTRY ((NTSTATUS)0xC0000051L) +#define STATUS_NO_EAS_ON_FILE ((NTSTATUS)0xC0000052L) +#define STATUS_EA_CORRUPT_ERROR ((NTSTATUS)0xC0000053L) +#define STATUS_FILE_LOCK_CONFLICT ((NTSTATUS)0xC0000054L) +#define STATUS_LOCK_NOT_GRANTED ((NTSTATUS)0xC0000055L) +#define STATUS_DELETE_PENDING ((NTSTATUS)0xC0000056L) +#define STATUS_CTL_FILE_NOT_SUPPORTED ((NTSTATUS)0xC0000057L) +#define STATUS_UNKNOWN_REVISION ((NTSTATUS)0xC0000058L) +#define STATUS_REVISION_MISMATCH ((NTSTATUS)0xC0000059L) +#define STATUS_INVALID_OWNER ((NTSTATUS)0xC000005AL) +#define STATUS_INVALID_PRIMARY_GROUP ((NTSTATUS)0xC000005BL) +#define STATUS_NO_IMPERSONATION_TOKEN ((NTSTATUS)0xC000005CL) +#define STATUS_CANT_DISABLE_MANDATORY ((NTSTATUS)0xC000005DL) +#define STATUS_NO_LOGON_SERVERS ((NTSTATUS)0xC000005EL) +#define STATUS_NO_SUCH_LOGON_SESSION ((NTSTATUS)0xC000005FL) +#define STATUS_NO_SUCH_PRIVILEGE ((NTSTATUS)0xC0000060L) +#define STATUS_PRIVILEGE_NOT_HELD ((NTSTATUS)0xC0000061L) +#define STATUS_INVALID_ACCOUNT_NAME ((NTSTATUS)0xC0000062L) +#define STATUS_USER_EXISTS ((NTSTATUS)0xC0000063L) +#define STATUS_NO_SUCH_USER ((NTSTATUS)0xC0000064L) +#define STATUS_GROUP_EXISTS ((NTSTATUS)0xC0000065L) +#define STATUS_NO_SUCH_GROUP ((NTSTATUS)0xC0000066L) +#define STATUS_MEMBER_IN_GROUP ((NTSTATUS)0xC0000067L) +#define STATUS_MEMBER_NOT_IN_GROUP ((NTSTATUS)0xC0000068L) +#define STATUS_LAST_ADMIN ((NTSTATUS)0xC0000069L) +#define STATUS_WRONG_PASSWORD ((NTSTATUS)0xC000006AL) +#define STATUS_ILL_FORMED_PASSWORD ((NTSTATUS)0xC000006BL) +#define STATUS_PASSWORD_RESTRICTION ((NTSTATUS)0xC000006CL) +#define STATUS_LOGON_FAILURE ((NTSTATUS)0xC000006DL) +#define STATUS_ACCOUNT_RESTRICTION ((NTSTATUS)0xC000006EL) +#define STATUS_INVALID_LOGON_HOURS ((NTSTATUS)0xC000006FL) +#define STATUS_INVALID_WORKSTATION ((NTSTATUS)0xC0000070L) +#define STATUS_PASSWORD_EXPIRED ((NTSTATUS)0xC0000071L) +#define STATUS_ACCOUNT_DISABLED ((NTSTATUS)0xC0000072L) +#define STATUS_NONE_MAPPED ((NTSTATUS)0xC0000073L) +#define STATUS_TOO_MANY_LUIDS_REQUESTED ((NTSTATUS)0xC0000074L) +#define STATUS_LUIDS_EXHAUSTED ((NTSTATUS)0xC0000075L) +#define STATUS_INVALID_SUB_AUTHORITY ((NTSTATUS)0xC0000076L) +#define STATUS_INVALID_ACL ((NTSTATUS)0xC0000077L) +#define STATUS_INVALID_SID ((NTSTATUS)0xC0000078L) +#define STATUS_INVALID_SECURITY_DESCR ((NTSTATUS)0xC0000079L) +#define STATUS_PROCEDURE_NOT_FOUND ((NTSTATUS)0xC000007AL) +#define STATUS_INVALID_IMAGE_FORMAT ((NTSTATUS)0xC000007BL) +#define STATUS_NO_TOKEN ((NTSTATUS)0xC000007CL) +#define STATUS_BAD_INHERITANCE_ACL ((NTSTATUS)0xC000007DL) +#define STATUS_RANGE_NOT_LOCKED ((NTSTATUS)0xC000007EL) +#define STATUS_DISK_FULL ((NTSTATUS)0xC000007FL) +#define STATUS_SERVER_DISABLED ((NTSTATUS)0xC0000080L) +#define STATUS_SERVER_NOT_DISABLED ((NTSTATUS)0xC0000081L) +#define STATUS_TOO_MANY_GUIDS_REQUESTED ((NTSTATUS)0xC0000082L) +#define STATUS_GUIDS_EXHAUSTED ((NTSTATUS)0xC0000083L) +#define STATUS_INVALID_ID_AUTHORITY ((NTSTATUS)0xC0000084L) +#define STATUS_AGENTS_EXHAUSTED ((NTSTATUS)0xC0000085L) +#define STATUS_INVALID_VOLUME_LABEL ((NTSTATUS)0xC0000086L) +#define STATUS_SECTION_NOT_EXTENDED ((NTSTATUS)0xC0000087L) +#define STATUS_NOT_MAPPED_DATA ((NTSTATUS)0xC0000088L) +#define STATUS_RESOURCE_DATA_NOT_FOUND ((NTSTATUS)0xC0000089L) +#define STATUS_RESOURCE_TYPE_NOT_FOUND ((NTSTATUS)0xC000008AL) +#define STATUS_RESOURCE_NAME_NOT_FOUND ((NTSTATUS)0xC000008BL) +#define STATUS_ARRAY_BOUNDS_EXCEEDED ((NTSTATUS)0xC000008CL) +#define STATUS_FLOAT_DENORMAL_OPERAND ((NTSTATUS)0xC000008DL) +#define STATUS_FLOAT_DIVIDE_BY_ZERO ((NTSTATUS)0xC000008EL) +#define STATUS_FLOAT_INEXACT_RESULT ((NTSTATUS)0xC000008FL) +#define STATUS_FLOAT_INVALID_OPERATION ((NTSTATUS)0xC0000090L) +#define STATUS_FLOAT_OVERFLOW ((NTSTATUS)0xC0000091L) +#define STATUS_FLOAT_STACK_CHECK ((NTSTATUS)0xC0000092L) +#define STATUS_FLOAT_UNDERFLOW ((NTSTATUS)0xC0000093L) +#define STATUS_INTEGER_DIVIDE_BY_ZERO ((NTSTATUS)0xC0000094L) +#define STATUS_INTEGER_OVERFLOW ((NTSTATUS)0xC0000095L) +#define STATUS_PRIVILEGED_INSTRUCTION ((NTSTATUS)0xC0000096L) +#define STATUS_TOO_MANY_PAGING_FILES ((NTSTATUS)0xC0000097L) +#define STATUS_FILE_INVALID ((NTSTATUS)0xC0000098L) +#define STATUS_ALLOTTED_SPACE_EXCEEDED ((NTSTATUS)0xC0000099L) +#define STATUS_INSUFFICIENT_RESOURCES ((NTSTATUS)0xC000009AL) +#define STATUS_DFS_EXIT_PATH_FOUND ((NTSTATUS)0xC000009BL) +#define STATUS_DEVICE_DATA_ERROR ((NTSTATUS)0xC000009CL) +#define STATUS_DEVICE_NOT_CONNECTED ((NTSTATUS)0xC000009DL) +#define STATUS_DEVICE_POWER_FAILURE ((NTSTATUS)0xC000009EL) +#define STATUS_FREE_VM_NOT_AT_BASE ((NTSTATUS)0xC000009FL) +#define STATUS_MEMORY_NOT_ALLOCATED ((NTSTATUS)0xC00000A0L) +#define STATUS_WORKING_SET_QUOTA ((NTSTATUS)0xC00000A1L) +#define STATUS_MEDIA_WRITE_PROTECTED ((NTSTATUS)0xC00000A2L) +#define STATUS_DEVICE_NOT_READY ((NTSTATUS)0xC00000A3L) +#define STATUS_INVALID_GROUP_ATTRIBUTES ((NTSTATUS)0xC00000A4L) +#define STATUS_BAD_IMPERSONATION_LEVEL ((NTSTATUS)0xC00000A5L) +#define STATUS_CANT_OPEN_ANONYMOUS ((NTSTATUS)0xC00000A6L) +#define STATUS_BAD_VALIDATION_CLASS ((NTSTATUS)0xC00000A7L) +#define STATUS_BAD_TOKEN_TYPE ((NTSTATUS)0xC00000A8L) +#define STATUS_BAD_MASTER_BOOT_RECORD ((NTSTATUS)0xC00000A9L) +#define STATUS_INSTRUCTION_MISALIGNMENT ((NTSTATUS)0xC00000AAL) +#define STATUS_INSTANCE_NOT_AVAILABLE ((NTSTATUS)0xC00000ABL) +#define STATUS_PIPE_NOT_AVAILABLE ((NTSTATUS)0xC00000ACL) +#define STATUS_INVALID_PIPE_STATE ((NTSTATUS)0xC00000ADL) +#define STATUS_PIPE_BUSY ((NTSTATUS)0xC00000AEL) +#define STATUS_ILLEGAL_FUNCTION ((NTSTATUS)0xC00000AFL) +#define STATUS_PIPE_DISCONNECTED ((NTSTATUS)0xC00000B0L) +#define STATUS_PIPE_CLOSING ((NTSTATUS)0xC00000B1L) +#define STATUS_PIPE_CONNECTED ((NTSTATUS)0xC00000B2L) +#define STATUS_PIPE_LISTENING ((NTSTATUS)0xC00000B3L) +#define STATUS_INVALID_READ_MODE ((NTSTATUS)0xC00000B4L) +#define STATUS_IO_TIMEOUT ((NTSTATUS)0xC00000B5L) +#define STATUS_FILE_FORCED_CLOSED ((NTSTATUS)0xC00000B6L) +#define STATUS_PROFILING_NOT_STARTED ((NTSTATUS)0xC00000B7L) +#define STATUS_PROFILING_NOT_STOPPED ((NTSTATUS)0xC00000B8L) +#define STATUS_COULD_NOT_INTERPRET ((NTSTATUS)0xC00000B9L) +#define STATUS_FILE_IS_A_DIRECTORY ((NTSTATUS)0xC00000BAL) +#define STATUS_NOT_SUPPORTED ((NTSTATUS)0xC00000BBL) +#define STATUS_REMOTE_NOT_LISTENING ((NTSTATUS)0xC00000BCL) +#define STATUS_DUPLICATE_NAME ((NTSTATUS)0xC00000BDL) +#define STATUS_BAD_NETWORK_PATH ((NTSTATUS)0xC00000BEL) +#define STATUS_NETWORK_BUSY ((NTSTATUS)0xC00000BFL) +#define STATUS_DEVICE_DOES_NOT_EXIST ((NTSTATUS)0xC00000C0L) +#define STATUS_TOO_MANY_COMMANDS ((NTSTATUS)0xC00000C1L) +#define STATUS_ADAPTER_HARDWARE_ERROR ((NTSTATUS)0xC00000C2L) +#define STATUS_INVALID_NETWORK_RESPONSE ((NTSTATUS)0xC00000C3L) +#define STATUS_UNEXPECTED_NETWORK_ERROR ((NTSTATUS)0xC00000C4L) +#define STATUS_BAD_REMOTE_ADAPTER ((NTSTATUS)0xC00000C5L) +#define STATUS_PRINT_QUEUE_FULL ((NTSTATUS)0xC00000C6L) +#define STATUS_NO_SPOOL_SPACE ((NTSTATUS)0xC00000C7L) +#define STATUS_PRINT_CANCELLED ((NTSTATUS)0xC00000C8L) +#define STATUS_NETWORK_NAME_DELETED ((NTSTATUS)0xC00000C9L) +#define STATUS_NETWORK_ACCESS_DENIED ((NTSTATUS)0xC00000CAL) +#define STATUS_BAD_DEVICE_TYPE ((NTSTATUS)0xC00000CBL) +#define STATUS_BAD_NETWORK_NAME ((NTSTATUS)0xC00000CCL) +#define STATUS_TOO_MANY_NAMES ((NTSTATUS)0xC00000CDL) +#define STATUS_TOO_MANY_SESSIONS ((NTSTATUS)0xC00000CEL) +#define STATUS_SHARING_PAUSED ((NTSTATUS)0xC00000CFL) +#define STATUS_REQUEST_NOT_ACCEPTED ((NTSTATUS)0xC00000D0L) +#define STATUS_REDIRECTOR_PAUSED ((NTSTATUS)0xC00000D1L) +#define STATUS_NET_WRITE_FAULT ((NTSTATUS)0xC00000D2L) +#define STATUS_PROFILING_AT_LIMIT ((NTSTATUS)0xC00000D3L) +#define STATUS_NOT_SAME_DEVICE ((NTSTATUS)0xC00000D4L) +#define STATUS_FILE_RENAMED ((NTSTATUS)0xC00000D5L) +#define STATUS_VIRTUAL_CIRCUIT_CLOSED ((NTSTATUS)0xC00000D6L) +#define STATUS_NO_SECURITY_ON_OBJECT ((NTSTATUS)0xC00000D7L) +#define STATUS_CANT_WAIT ((NTSTATUS)0xC00000D8L) +#define STATUS_PIPE_EMPTY ((NTSTATUS)0xC00000D9L) +#define STATUS_CANT_ACCESS_DOMAIN_INFO ((NTSTATUS)0xC00000DAL) +#define STATUS_CANT_TERMINATE_SELF ((NTSTATUS)0xC00000DBL) +#define STATUS_INVALID_SERVER_STATE ((NTSTATUS)0xC00000DCL) +#define STATUS_INVALID_DOMAIN_STATE ((NTSTATUS)0xC00000DDL) +#define STATUS_INVALID_DOMAIN_ROLE ((NTSTATUS)0xC00000DEL) +#define STATUS_NO_SUCH_DOMAIN ((NTSTATUS)0xC00000DFL) +#define STATUS_DOMAIN_EXISTS ((NTSTATUS)0xC00000E0L) +#define STATUS_DOMAIN_LIMIT_EXCEEDED ((NTSTATUS)0xC00000E1L) +#define STATUS_OPLOCK_NOT_GRANTED ((NTSTATUS)0xC00000E2L) +#define STATUS_INVALID_OPLOCK_PROTOCOL ((NTSTATUS)0xC00000E3L) +#define STATUS_INTERNAL_DB_CORRUPTION ((NTSTATUS)0xC00000E4L) +#define STATUS_INTERNAL_ERROR ((NTSTATUS)0xC00000E5L) +#define STATUS_GENERIC_NOT_MAPPED ((NTSTATUS)0xC00000E6L) +#define STATUS_BAD_DESCRIPTOR_FORMAT ((NTSTATUS)0xC00000E7L) +#define STATUS_INVALID_USER_BUFFER ((NTSTATUS)0xC00000E8L) +#define STATUS_UNEXPECTED_IO_ERROR ((NTSTATUS)0xC00000E9L) +#define STATUS_UNEXPECTED_MM_CREATE_ERR ((NTSTATUS)0xC00000EAL) +#define STATUS_UNEXPECTED_MM_MAP_ERROR ((NTSTATUS)0xC00000EBL) +#define STATUS_UNEXPECTED_MM_EXTEND_ERR ((NTSTATUS)0xC00000ECL) +#define STATUS_NOT_LOGON_PROCESS ((NTSTATUS)0xC00000EDL) +#define STATUS_LOGON_SESSION_EXISTS ((NTSTATUS)0xC00000EEL) +#define STATUS_INVALID_PARAMETER_1 ((NTSTATUS)0xC00000EFL) +#define STATUS_INVALID_PARAMETER_2 ((NTSTATUS)0xC00000F0L) +#define STATUS_INVALID_PARAMETER_3 ((NTSTATUS)0xC00000F1L) +#define STATUS_INVALID_PARAMETER_4 ((NTSTATUS)0xC00000F2L) +#define STATUS_INVALID_PARAMETER_5 ((NTSTATUS)0xC00000F3L) +#define STATUS_INVALID_PARAMETER_6 ((NTSTATUS)0xC00000F4L) +#define STATUS_INVALID_PARAMETER_7 ((NTSTATUS)0xC00000F5L) +#define STATUS_INVALID_PARAMETER_8 ((NTSTATUS)0xC00000F6L) +#define STATUS_INVALID_PARAMETER_9 ((NTSTATUS)0xC00000F7L) +#define STATUS_INVALID_PARAMETER_10 ((NTSTATUS)0xC00000F8L) +#define STATUS_INVALID_PARAMETER_11 ((NTSTATUS)0xC00000F9L) +#define STATUS_INVALID_PARAMETER_12 ((NTSTATUS)0xC00000FAL) +#define STATUS_REDIRECTOR_NOT_STARTED ((NTSTATUS)0xC00000FBL) +#define STATUS_REDIRECTOR_STARTED ((NTSTATUS)0xC00000FCL) +#define STATUS_STACK_OVERFLOW ((NTSTATUS)0xC00000FDL) +#define STATUS_NO_SUCH_PACKAGE ((NTSTATUS)0xC00000FEL) +#define STATUS_BAD_FUNCTION_TABLE ((NTSTATUS)0xC00000FFL) +#define STATUS_VARIABLE_NOT_FOUND ((NTSTATUS)0xC0000100L) +#define STATUS_DIRECTORY_NOT_EMPTY ((NTSTATUS)0xC0000101L) +#define STATUS_FILE_CORRUPT_ERROR ((NTSTATUS)0xC0000102L) +#define STATUS_NOT_A_DIRECTORY ((NTSTATUS)0xC0000103L) +#define STATUS_BAD_LOGON_SESSION_STATE ((NTSTATUS)0xC0000104L) +#define STATUS_LOGON_SESSION_COLLISION ((NTSTATUS)0xC0000105L) +#define STATUS_NAME_TOO_LONG ((NTSTATUS)0xC0000106L) +#define STATUS_FILES_OPEN ((NTSTATUS)0xC0000107L) +#define STATUS_CONNECTION_IN_USE ((NTSTATUS)0xC0000108L) +#define STATUS_MESSAGE_NOT_FOUND ((NTSTATUS)0xC0000109L) +#define STATUS_PROCESS_IS_TERMINATING ((NTSTATUS)0xC000010AL) +#define STATUS_INVALID_LOGON_TYPE ((NTSTATUS)0xC000010BL) +#define STATUS_NO_GUID_TRANSLATION ((NTSTATUS)0xC000010CL) +#define STATUS_CANNOT_IMPERSONATE ((NTSTATUS)0xC000010DL) +#define STATUS_IMAGE_ALREADY_LOADED ((NTSTATUS)0xC000010EL) +#define STATUS_ABIOS_NOT_PRESENT ((NTSTATUS)0xC000010FL) +#define STATUS_ABIOS_LID_NOT_EXIST ((NTSTATUS)0xC0000110L) +#define STATUS_ABIOS_LID_ALREADY_OWNED ((NTSTATUS)0xC0000111L) +#define STATUS_ABIOS_NOT_LID_OWNER ((NTSTATUS)0xC0000112L) +#define STATUS_ABIOS_INVALID_COMMAND ((NTSTATUS)0xC0000113L) +#define STATUS_ABIOS_INVALID_LID ((NTSTATUS)0xC0000114L) +#define STATUS_ABIOS_SELECTOR_NOT_AVAILABLE ((NTSTATUS)0xC0000115L) +#define STATUS_ABIOS_INVALID_SELECTOR ((NTSTATUS)0xC0000116L) +#define STATUS_NO_LDT ((NTSTATUS)0xC0000117L) +#define STATUS_INVALID_LDT_SIZE ((NTSTATUS)0xC0000118L) +#define STATUS_INVALID_LDT_OFFSET ((NTSTATUS)0xC0000119L) +#define STATUS_INVALID_LDT_DESCRIPTOR ((NTSTATUS)0xC000011AL) +#define STATUS_INVALID_IMAGE_NE_FORMAT ((NTSTATUS)0xC000011BL) +#define STATUS_RXACT_INVALID_STATE ((NTSTATUS)0xC000011CL) +#define STATUS_RXACT_COMMIT_FAILURE ((NTSTATUS)0xC000011DL) +#define STATUS_MAPPED_FILE_SIZE_ZERO ((NTSTATUS)0xC000011EL) +#define STATUS_TOO_MANY_OPENED_FILES ((NTSTATUS)0xC000011FL) +#define STATUS_CANCELLED ((NTSTATUS)0xC0000120L) +#define STATUS_CANNOT_DELETE ((NTSTATUS)0xC0000121L) +#define STATUS_INVALID_COMPUTER_NAME ((NTSTATUS)0xC0000122L) +#define STATUS_FILE_DELETED ((NTSTATUS)0xC0000123L) +#define STATUS_SPECIAL_ACCOUNT ((NTSTATUS)0xC0000124L) +#define STATUS_SPECIAL_GROUP ((NTSTATUS)0xC0000125L) +#define STATUS_SPECIAL_USER ((NTSTATUS)0xC0000126L) +#define STATUS_MEMBERS_PRIMARY_GROUP ((NTSTATUS)0xC0000127L) +#define STATUS_FILE_CLOSED ((NTSTATUS)0xC0000128L) +#define STATUS_TOO_MANY_THREADS ((NTSTATUS)0xC0000129L) +#define STATUS_THREAD_NOT_IN_PROCESS ((NTSTATUS)0xC000012AL) +#define STATUS_TOKEN_ALREADY_IN_USE ((NTSTATUS)0xC000012BL) +#define STATUS_PAGEFILE_QUOTA_EXCEEDED ((NTSTATUS)0xC000012CL) +#define STATUS_COMMITMENT_LIMIT ((NTSTATUS)0xC000012DL) +#define STATUS_INVALID_IMAGE_LE_FORMAT ((NTSTATUS)0xC000012EL) +#define STATUS_INVALID_IMAGE_NOT_MZ ((NTSTATUS)0xC000012FL) +#define STATUS_INVALID_IMAGE_PROTECT ((NTSTATUS)0xC0000130L) +#define STATUS_INVALID_IMAGE_WIN_16 ((NTSTATUS)0xC0000131L) +#define STATUS_LOGON_SERVER_CONFLICT ((NTSTATUS)0xC0000132L) +#define STATUS_TIME_DIFFERENCE_AT_DC ((NTSTATUS)0xC0000133L) +#define STATUS_SYNCHRONIZATION_REQUIRED ((NTSTATUS)0xC0000134L) +#define STATUS_DLL_NOT_FOUND ((NTSTATUS)0xC0000135L) +#define STATUS_OPEN_FAILED ((NTSTATUS)0xC0000136L) +#define STATUS_IO_PRIVILEGE_FAILED ((NTSTATUS)0xC0000137L) +#define STATUS_ORDINAL_NOT_FOUND ((NTSTATUS)0xC0000138L) +#define STATUS_ENTRYPOINT_NOT_FOUND ((NTSTATUS)0xC0000139L) +#define STATUS_CONTROL_C_EXIT ((NTSTATUS)0xC000013AL) +#define STATUS_LOCAL_DISCONNECT ((NTSTATUS)0xC000013BL) +#define STATUS_REMOTE_DISCONNECT ((NTSTATUS)0xC000013CL) +#define STATUS_REMOTE_RESOURCES ((NTSTATUS)0xC000013DL) +#define STATUS_LINK_FAILED ((NTSTATUS)0xC000013EL) +#define STATUS_LINK_TIMEOUT ((NTSTATUS)0xC000013FL) +#define STATUS_INVALID_CONNECTION ((NTSTATUS)0xC0000140L) +#define STATUS_INVALID_ADDRESS ((NTSTATUS)0xC0000141L) +#define STATUS_DLL_INIT_FAILED ((NTSTATUS)0xC0000142L) +#define STATUS_MISSING_SYSTEMFILE ((NTSTATUS)0xC0000143L) +#define STATUS_UNHANDLED_EXCEPTION ((NTSTATUS)0xC0000144L) +#define STATUS_APP_INIT_FAILURE ((NTSTATUS)0xC0000145L) +#define STATUS_PAGEFILE_CREATE_FAILED ((NTSTATUS)0xC0000146L) +#define STATUS_NO_PAGEFILE ((NTSTATUS)0xC0000147L) +#define STATUS_INVALID_LEVEL ((NTSTATUS)0xC0000148L) +#define STATUS_WRONG_PASSWORD_CORE ((NTSTATUS)0xC0000149L) +#define STATUS_ILLEGAL_FLOAT_CONTEXT ((NTSTATUS)0xC000014AL) +#define STATUS_PIPE_BROKEN ((NTSTATUS)0xC000014BL) +#define STATUS_REGISTRY_CORRUPT ((NTSTATUS)0xC000014CL) +#define STATUS_REGISTRY_IO_FAILED ((NTSTATUS)0xC000014DL) +#define STATUS_NO_EVENT_PAIR ((NTSTATUS)0xC000014EL) +#define STATUS_UNRECOGNIZED_VOLUME ((NTSTATUS)0xC000014FL) +#define STATUS_SERIAL_NO_DEVICE_INITED ((NTSTATUS)0xC0000150L) +#define STATUS_NO_SUCH_ALIAS ((NTSTATUS)0xC0000151L) +#define STATUS_MEMBER_NOT_IN_ALIAS ((NTSTATUS)0xC0000152L) +#define STATUS_MEMBER_IN_ALIAS ((NTSTATUS)0xC0000153L) +#define STATUS_ALIAS_EXISTS ((NTSTATUS)0xC0000154L) +#define STATUS_LOGON_NOT_GRANTED ((NTSTATUS)0xC0000155L) +#define STATUS_TOO_MANY_SECRETS ((NTSTATUS)0xC0000156L) +#define STATUS_SECRET_TOO_LONG ((NTSTATUS)0xC0000157L) +#define STATUS_INTERNAL_DB_ERROR ((NTSTATUS)0xC0000158L) +#define STATUS_FULLSCREEN_MODE ((NTSTATUS)0xC0000159L) +#define STATUS_TOO_MANY_CONTEXT_IDS ((NTSTATUS)0xC000015AL) +#define STATUS_LOGON_TYPE_NOT_GRANTED ((NTSTATUS)0xC000015BL) +#define STATUS_NOT_REGISTRY_FILE ((NTSTATUS)0xC000015CL) +#define STATUS_NT_CROSS_ENCRYPTION_REQUIRED ((NTSTATUS)0xC000015DL) +#define STATUS_DOMAIN_CTRLR_CONFIG_ERROR ((NTSTATUS)0xC000015EL) +#define STATUS_FT_MISSING_MEMBER ((NTSTATUS)0xC000015FL) +#define STATUS_ILL_FORMED_SERVICE_ENTRY ((NTSTATUS)0xC0000160L) +#define STATUS_ILLEGAL_CHARACTER ((NTSTATUS)0xC0000161L) +#define STATUS_UNMAPPABLE_CHARACTER ((NTSTATUS)0xC0000162L) +#define STATUS_UNDEFINED_CHARACTER ((NTSTATUS)0xC0000163L) +#define STATUS_FLOPPY_VOLUME ((NTSTATUS)0xC0000164L) +#define STATUS_FLOPPY_ID_MARK_NOT_FOUND ((NTSTATUS)0xC0000165L) +#define STATUS_FLOPPY_WRONG_CYLINDER ((NTSTATUS)0xC0000166L) +#define STATUS_FLOPPY_UNKNOWN_ERROR ((NTSTATUS)0xC0000167L) +#define STATUS_FLOPPY_BAD_REGISTERS ((NTSTATUS)0xC0000168L) +#define STATUS_DISK_RECALIBRATE_FAILED ((NTSTATUS)0xC0000169L) +#define STATUS_DISK_OPERATION_FAILED ((NTSTATUS)0xC000016AL) +#define STATUS_DISK_RESET_FAILED ((NTSTATUS)0xC000016BL) +#define STATUS_SHARED_IRQ_BUSY ((NTSTATUS)0xC000016CL) +#define STATUS_FT_ORPHANING ((NTSTATUS)0xC000016DL) +#define STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT ((NTSTATUS)0xC000016EL) +#define STATUS_PARTITION_FAILURE ((NTSTATUS)0xC0000172L) +#define STATUS_INVALID_BLOCK_LENGTH ((NTSTATUS)0xC0000173L) +#define STATUS_DEVICE_NOT_PARTITIONED ((NTSTATUS)0xC0000174L) +#define STATUS_UNABLE_TO_LOCK_MEDIA ((NTSTATUS)0xC0000175L) +#define STATUS_UNABLE_TO_UNLOAD_MEDIA ((NTSTATUS)0xC0000176L) +#define STATUS_EOM_OVERFLOW ((NTSTATUS)0xC0000177L) +#define STATUS_NO_MEDIA ((NTSTATUS)0xC0000178L) +#define STATUS_NO_SUCH_MEMBER ((NTSTATUS)0xC000017AL) +#define STATUS_INVALID_MEMBER ((NTSTATUS)0xC000017BL) +#define STATUS_KEY_DELETED ((NTSTATUS)0xC000017CL) +#define STATUS_NO_LOG_SPACE ((NTSTATUS)0xC000017DL) +#define STATUS_TOO_MANY_SIDS ((NTSTATUS)0xC000017EL) +#define STATUS_LM_CROSS_ENCRYPTION_REQUIRED ((NTSTATUS)0xC000017FL) +#define STATUS_KEY_HAS_CHILDREN ((NTSTATUS)0xC0000180L) +#define STATUS_CHILD_MUST_BE_VOLATILE ((NTSTATUS)0xC0000181L) +#define STATUS_DEVICE_CONFIGURATION_ERROR ((NTSTATUS)0xC0000182L) +#define STATUS_DRIVER_INTERNAL_ERROR ((NTSTATUS)0xC0000183L) +#define STATUS_INVALID_DEVICE_STATE ((NTSTATUS)0xC0000184L) +#define STATUS_IO_DEVICE_ERROR ((NTSTATUS)0xC0000185L) +#define STATUS_DEVICE_PROTOCOL_ERROR ((NTSTATUS)0xC0000186L) +#define STATUS_BACKUP_CONTROLLER ((NTSTATUS)0xC0000187L) +#define STATUS_LOG_FILE_FULL ((NTSTATUS)0xC0000188L) +#define STATUS_TOO_LATE ((NTSTATUS)0xC0000189L) +#define STATUS_NO_TRUST_LSA_SECRET ((NTSTATUS)0xC000018AL) +#define STATUS_NO_TRUST_SAM_ACCOUNT ((NTSTATUS)0xC000018BL) +#define STATUS_TRUSTED_DOMAIN_FAILURE ((NTSTATUS)0xC000018CL) +#define STATUS_TRUSTED_RELATIONSHIP_FAILURE ((NTSTATUS)0xC000018DL) +#define STATUS_EVENTLOG_FILE_CORRUPT ((NTSTATUS)0xC000018EL) +#define STATUS_EVENTLOG_CANT_START ((NTSTATUS)0xC000018FL) +#define STATUS_TRUST_FAILURE ((NTSTATUS)0xC0000190L) +#define STATUS_MUTANT_LIMIT_EXCEEDED ((NTSTATUS)0xC0000191L) +#define STATUS_NETLOGON_NOT_STARTED ((NTSTATUS)0xC0000192L) +#define STATUS_ACCOUNT_EXPIRED ((NTSTATUS)0xC0000193L) +#define STATUS_POSSIBLE_DEADLOCK ((NTSTATUS)0xC0000194L) +#define STATUS_NETWORK_CREDENTIAL_CONFLICT ((NTSTATUS)0xC0000195L) +#define STATUS_REMOTE_SESSION_LIMIT ((NTSTATUS)0xC0000196L) +#define STATUS_EVENTLOG_FILE_CHANGED ((NTSTATUS)0xC0000197L) +#define STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT ((NTSTATUS)0xC0000198L) +#define STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT ((NTSTATUS)0xC0000199L) +#define STATUS_NOLOGON_SERVER_TRUST_ACCOUNT ((NTSTATUS)0xC000019AL) +#define STATUS_DOMAIN_TRUST_INCONSISTENT ((NTSTATUS)0xC000019BL) +#define STATUS_FS_DRIVER_REQUIRED ((NTSTATUS)0xC000019CL) +#define STATUS_NO_USER_SESSION_KEY ((NTSTATUS)0xC0000202L) +#define STATUS_USER_SESSION_DELETED ((NTSTATUS)0xC0000203L) +#define STATUS_RESOURCE_LANG_NOT_FOUND ((NTSTATUS)0xC0000204L) +#define STATUS_INSUFF_SERVER_RESOURCES ((NTSTATUS)0xC0000205L) +#define STATUS_INVALID_BUFFER_SIZE ((NTSTATUS)0xC0000206L) +#define STATUS_INVALID_ADDRESS_COMPONENT ((NTSTATUS)0xC0000207L) +#define STATUS_INVALID_ADDRESS_WILDCARD ((NTSTATUS)0xC0000208L) +#define STATUS_TOO_MANY_ADDRESSES ((NTSTATUS)0xC0000209L) +#define STATUS_ADDRESS_ALREADY_EXISTS ((NTSTATUS)0xC000020AL) +#define STATUS_ADDRESS_CLOSED ((NTSTATUS)0xC000020BL) +#define STATUS_CONNECTION_DISCONNECTED ((NTSTATUS)0xC000020CL) +#define STATUS_CONNECTION_RESET ((NTSTATUS)0xC000020DL) +#define STATUS_TOO_MANY_NODES ((NTSTATUS)0xC000020EL) +#define STATUS_TRANSACTION_ABORTED ((NTSTATUS)0xC000020FL) +#define STATUS_TRANSACTION_TIMED_OUT ((NTSTATUS)0xC0000210L) +#define STATUS_TRANSACTION_NO_RELEASE ((NTSTATUS)0xC0000211L) +#define STATUS_TRANSACTION_NO_MATCH ((NTSTATUS)0xC0000212L) +#define STATUS_TRANSACTION_RESPONDED ((NTSTATUS)0xC0000213L) +#define STATUS_TRANSACTION_INVALID_ID ((NTSTATUS)0xC0000214L) +#define STATUS_TRANSACTION_INVALID_TYPE ((NTSTATUS)0xC0000215L) +#define STATUS_NOT_SERVER_SESSION ((NTSTATUS)0xC0000216L) +#define STATUS_NOT_CLIENT_SESSION ((NTSTATUS)0xC0000217L) +#define STATUS_CANNOT_LOAD_REGISTRY_FILE ((NTSTATUS)0xC0000218L) +#define STATUS_DEBUG_ATTACH_FAILED ((NTSTATUS)0xC0000219L) +#define STATUS_SYSTEM_PROCESS_TERMINATED ((NTSTATUS)0xC000021AL) +#define STATUS_DATA_NOT_ACCEPTED ((NTSTATUS)0xC000021BL) +#define STATUS_NO_BROWSER_SERVERS_FOUND ((NTSTATUS)0xC000021CL) +#define STATUS_VDM_HARD_ERROR ((NTSTATUS)0xC000021DL) +#define STATUS_DRIVER_CANCEL_TIMEOUT ((NTSTATUS)0xC000021EL) +#define STATUS_REPLY_MESSAGE_MISMATCH ((NTSTATUS)0xC000021FL) +#define STATUS_MAPPED_ALIGNMENT ((NTSTATUS)0xC0000220L) +#define STATUS_IMAGE_CHECKSUM_MISMATCH ((NTSTATUS)0xC0000221L) +#define STATUS_LOST_WRITEBEHIND_DATA ((NTSTATUS)0xC0000222L) +#define STATUS_CLIENT_SERVER_PARAMETERS_INVALID ((NTSTATUS)0xC0000223L) +#define STATUS_PASSWORD_MUST_CHANGE ((NTSTATUS)0xC0000224L) +#define STATUS_NOT_FOUND ((NTSTATUS)0xC0000225L) +#define STATUS_NOT_TINY_STREAM ((NTSTATUS)0xC0000226L) +#define STATUS_RECOVERY_FAILURE ((NTSTATUS)0xC0000227L) +#define STATUS_STACK_OVERFLOW_READ ((NTSTATUS)0xC0000228L) +#define STATUS_FAIL_CHECK ((NTSTATUS)0xC0000229L) +#define STATUS_DUPLICATE_OBJECTID ((NTSTATUS)0xC000022AL) +#define STATUS_OBJECTID_EXISTS ((NTSTATUS)0xC000022BL) +#define STATUS_CONVERT_TO_LARGE ((NTSTATUS)0xC000022CL) +#define STATUS_RETRY ((NTSTATUS)0xC000022DL) +#define STATUS_FOUND_OUT_OF_SCOPE ((NTSTATUS)0xC000022EL) +#define STATUS_ALLOCATE_BUCKET ((NTSTATUS)0xC000022FL) +#define STATUS_PROPSET_NOT_FOUND ((NTSTATUS)0xC0000230L) +#define STATUS_MARSHALL_OVERFLOW ((NTSTATUS)0xC0000231L) +#define STATUS_INVALID_VARIANT ((NTSTATUS)0xC0000232L) +#define STATUS_DOMAIN_CONTROLLER_NOT_FOUND ((NTSTATUS)0xC0000233L) +#define STATUS_ACCOUNT_LOCKED_OUT ((NTSTATUS)0xC0000234L) +#define STATUS_HANDLE_NOT_CLOSABLE ((NTSTATUS)0xC0000235L) +#define STATUS_CONNECTION_REFUSED ((NTSTATUS)0xC0000236L) +#define STATUS_GRACEFUL_DISCONNECT ((NTSTATUS)0xC0000237L) +#define STATUS_ADDRESS_ALREADY_ASSOCIATED ((NTSTATUS)0xC0000238L) +#define STATUS_ADDRESS_NOT_ASSOCIATED ((NTSTATUS)0xC0000239L) +#define STATUS_CONNECTION_INVALID ((NTSTATUS)0xC000023AL) +#define STATUS_CONNECTION_ACTIVE ((NTSTATUS)0xC000023BL) +#define STATUS_NETWORK_UNREACHABLE ((NTSTATUS)0xC000023CL) +#define STATUS_HOST_UNREACHABLE ((NTSTATUS)0xC000023DL) +#define STATUS_PROTOCOL_UNREACHABLE ((NTSTATUS)0xC000023EL) +#define STATUS_PORT_UNREACHABLE ((NTSTATUS)0xC000023FL) +#define STATUS_REQUEST_ABORTED ((NTSTATUS)0xC0000240L) +#define STATUS_CONNECTION_ABORTED ((NTSTATUS)0xC0000241L) +#define STATUS_BAD_COMPRESSION_BUFFER ((NTSTATUS)0xC0000242L) +#define STATUS_USER_MAPPED_FILE ((NTSTATUS)0xC0000243L) +#define STATUS_AUDIT_FAILED ((NTSTATUS)0xC0000244L) +#define STATUS_TIMER_RESOLUTION_NOT_SET ((NTSTATUS)0xC0000245L) +#define STATUS_CONNECTION_COUNT_LIMIT ((NTSTATUS)0xC0000246L) +#define STATUS_LOGIN_TIME_RESTRICTION ((NTSTATUS)0xC0000247L) +#define STATUS_LOGIN_WKSTA_RESTRICTION ((NTSTATUS)0xC0000248L) +#define STATUS_IMAGE_MP_UP_MISMATCH ((NTSTATUS)0xC0000249L) +#define STATUS_INSUFFICIENT_LOGON_INFO ((NTSTATUS)0xC0000250L) +#define STATUS_BAD_DLL_ENTRYPOINT ((NTSTATUS)0xC0000251L) +#define STATUS_BAD_SERVICE_ENTRYPOINT ((NTSTATUS)0xC0000252L) +#define STATUS_LPC_REPLY_LOST ((NTSTATUS)0xC0000253L) +#define STATUS_IP_ADDRESS_CONFLICT1 ((NTSTATUS)0xC0000254L) +#define STATUS_IP_ADDRESS_CONFLICT2 ((NTSTATUS)0xC0000255L) +#define STATUS_REGISTRY_QUOTA_LIMIT ((NTSTATUS)0xC0000256L) +#define STATUS_PATH_NOT_COVERED ((NTSTATUS)0xC0000257L) +#define STATUS_NO_CALLBACK_ACTIVE ((NTSTATUS)0xC0000258L) +#define STATUS_LICENSE_QUOTA_EXCEEDED ((NTSTATUS)0xC0000259L) +#define STATUS_PWD_TOO_SHORT ((NTSTATUS)0xC000025AL) +#define STATUS_PWD_TOO_RECENT ((NTSTATUS)0xC000025BL) +#define STATUS_PWD_HISTORY_CONFLICT ((NTSTATUS)0xC000025CL) +#define STATUS_PLUGPLAY_NO_DEVICE ((NTSTATUS)0xC000025EL) +#define STATUS_UNSUPPORTED_COMPRESSION ((NTSTATUS)0xC000025FL) +#define STATUS_INVALID_HW_PROFILE ((NTSTATUS)0xC0000260L) +#define STATUS_INVALID_PLUGPLAY_DEVICE_PATH ((NTSTATUS)0xC0000261L) +#define STATUS_DRIVER_ORDINAL_NOT_FOUND ((NTSTATUS)0xC0000262L) +#define STATUS_DRIVER_ENTRYPOINT_NOT_FOUND ((NTSTATUS)0xC0000263L) +#define STATUS_RESOURCE_NOT_OWNED ((NTSTATUS)0xC0000264L) +#define STATUS_TOO_MANY_LINKS ((NTSTATUS)0xC0000265L) +#define STATUS_QUOTA_LIST_INCONSISTENT ((NTSTATUS)0xC0000266L) +#define STATUS_FILE_IS_OFFLINE ((NTSTATUS)0xC0000267L) +#define STATUS_EVALUATION_EXPIRATION ((NTSTATUS)0xC0000268L) +#define STATUS_ILLEGAL_DLL_RELOCATION ((NTSTATUS)0xC0000269L) +#define STATUS_LICENSE_VIOLATION ((NTSTATUS)0xC000026AL) +#define STATUS_DLL_INIT_FAILED_LOGOFF ((NTSTATUS)0xC000026BL) +#define STATUS_DRIVER_UNABLE_TO_LOAD ((NTSTATUS)0xC000026CL) +#define STATUS_DFS_UNAVAILABLE ((NTSTATUS)0xC000026DL) +#define STATUS_VOLUME_DISMOUNTED ((NTSTATUS)0xC000026EL) +#define STATUS_WX86_INTERNAL_ERROR ((NTSTATUS)0xC000026FL) +#define STATUS_WX86_FLOAT_STACK_CHECK ((NTSTATUS)0xC0000270L) +#define STATUS_VALIDATE_CONTINUE ((NTSTATUS)0xC0000271L) +#define STATUS_NO_MATCH ((NTSTATUS)0xC0000272L) +#define STATUS_NO_MORE_MATCHES ((NTSTATUS)0xC0000273L) +#define STATUS_NOT_A_REPARSE_POINT ((NTSTATUS)0xC0000275L) +#define STATUS_IO_REPARSE_TAG_INVALID ((NTSTATUS)0xC0000276L) +#define STATUS_IO_REPARSE_TAG_MISMATCH ((NTSTATUS)0xC0000277L) +#define STATUS_IO_REPARSE_DATA_INVALID ((NTSTATUS)0xC0000278L) +#define STATUS_IO_REPARSE_TAG_NOT_HANDLED ((NTSTATUS)0xC0000279L) +#define STATUS_REPARSE_POINT_NOT_RESOLVED ((NTSTATUS)0xC0000280L) +#define STATUS_DIRECTORY_IS_A_REPARSE_POINT ((NTSTATUS)0xC0000281L) +#define STATUS_RANGE_LIST_CONFLICT ((NTSTATUS)0xC0000282L) +#define STATUS_SOURCE_ELEMENT_EMPTY ((NTSTATUS)0xC0000283L) +#define STATUS_DESTINATION_ELEMENT_FULL ((NTSTATUS)0xC0000284L) +#define STATUS_ILLEGAL_ELEMENT_ADDRESS ((NTSTATUS)0xC0000285L) +#define STATUS_MAGAZINE_NOT_PRESENT ((NTSTATUS)0xC0000286L) +#define STATUS_REINITIALIZATION_NEEDED ((NTSTATUS)0xC0000287L) +#define STATUS_DEVICE_REQUIRES_CLEANING ((NTSTATUS)0x80000288L) +#define STATUS_DEVICE_DOOR_OPEN ((NTSTATUS)0x80000289L) +#define STATUS_ENCRYPTION_FAILED ((NTSTATUS)0xC000028AL) +#define STATUS_DECRYPTION_FAILED ((NTSTATUS)0xC000028BL) +#define STATUS_RANGE_NOT_FOUND ((NTSTATUS)0xC000028CL) +#define STATUS_NO_RECOVERY_POLICY ((NTSTATUS)0xC000028DL) +#define STATUS_NO_EFS ((NTSTATUS)0xC000028EL) +#define STATUS_WRONG_EFS ((NTSTATUS)0xC000028FL) +#define STATUS_NO_USER_KEYS ((NTSTATUS)0xC0000290L) +#define STATUS_FILE_NOT_ENCRYPTED ((NTSTATUS)0xC0000291L) +#define STATUS_NOT_EXPORT_FORMAT ((NTSTATUS)0xC0000292L) +#define STATUS_FILE_ENCRYPTED ((NTSTATUS)0xC0000293L) +#define STATUS_WAKE_SYSTEM ((NTSTATUS)0x40000294L) +#define STATUS_WMI_GUID_NOT_FOUND ((NTSTATUS)0xC0000295L) +#define STATUS_WMI_INSTANCE_NOT_FOUND ((NTSTATUS)0xC0000296L) +#define STATUS_WMI_ITEMID_NOT_FOUND ((NTSTATUS)0xC0000297L) +#define STATUS_WMI_TRY_AGAIN ((NTSTATUS)0xC0000298L) +#define STATUS_SHARED_POLICY ((NTSTATUS)0xC0000299L) +#define STATUS_POLICY_OBJECT_NOT_FOUND ((NTSTATUS)0xC000029AL) +#define STATUS_POLICY_ONLY_IN_DS ((NTSTATUS)0xC000029BL) +#define STATUS_VOLUME_NOT_UPGRADED ((NTSTATUS)0xC000029CL) +#define STATUS_REMOTE_STORAGE_NOT_ACTIVE ((NTSTATUS)0xC000029DL) +#define STATUS_REMOTE_STORAGE_MEDIA_ERROR ((NTSTATUS)0xC000029EL) +#define STATUS_NO_TRACKING_SERVICE ((NTSTATUS)0xC000029FL) +#define STATUS_SERVER_SID_MISMATCH ((NTSTATUS)0xC00002A0L) +#define STATUS_DS_NO_ATTRIBUTE_OR_VALUE ((NTSTATUS)0xC00002A1L) +#define STATUS_DS_INVALID_ATTRIBUTE_SYNTAX ((NTSTATUS)0xC00002A2L) +#define STATUS_DS_ATTRIBUTE_TYPE_UNDEFINED ((NTSTATUS)0xC00002A3L) +#define STATUS_DS_ATTRIBUTE_OR_VALUE_EXISTS ((NTSTATUS)0xC00002A4L) +#define STATUS_DS_BUSY ((NTSTATUS)0xC00002A5L) +#define STATUS_DS_UNAVAILABLE ((NTSTATUS)0xC00002A6L) +#define STATUS_DS_NO_RIDS_ALLOCATED ((NTSTATUS)0xC00002A7L) +#define STATUS_DS_NO_MORE_RIDS ((NTSTATUS)0xC00002A8L) +#define STATUS_DS_INCORRECT_ROLE_OWNER ((NTSTATUS)0xC00002A9L) +#define STATUS_DS_RIDMGR_INIT_ERROR ((NTSTATUS)0xC00002AAL) +#define STATUS_DS_OBJ_CLASS_VIOLATION ((NTSTATUS)0xC00002ABL) +#define STATUS_DS_CANT_ON_NON_LEAF ((NTSTATUS)0xC00002ACL) +#define STATUS_DS_CANT_ON_RDN ((NTSTATUS)0xC00002ADL) +#define STATUS_DS_CANT_MOD_OBJ_CLASS ((NTSTATUS)0xC00002AEL) +#define STATUS_DS_CROSS_DOM_MOVE_FAILED ((NTSTATUS)0xC00002AFL) +#define STATUS_DS_GC_NOT_AVAILABLE ((NTSTATUS)0xC00002B0L) +#define STATUS_DIRECTORY_SERVICE_REQUIRED ((NTSTATUS)0xC00002B1L) +#define STATUS_REPARSE_ATTRIBUTE_CONFLICT ((NTSTATUS)0xC00002B2L) +#define STATUS_CANT_ENABLE_DENY_ONLY ((NTSTATUS)0xC00002B3L) +#define STATUS_FLOAT_MULTIPLE_FAULTS ((NTSTATUS)0xC00002B4L) +#define STATUS_FLOAT_MULTIPLE_TRAPS ((NTSTATUS)0xC00002B5L) +#define STATUS_DEVICE_REMOVED ((NTSTATUS)0xC00002B6L) +#define STATUS_JOURNAL_DELETE_IN_PROGRESS ((NTSTATUS)0xC00002B7L) +#define STATUS_JOURNAL_NOT_ACTIVE ((NTSTATUS)0xC00002B8L) +#define STATUS_NOINTERFACE ((NTSTATUS)0xC00002B9L) +#define STATUS_DS_ADMIN_LIMIT_EXCEEDED ((NTSTATUS)0xC00002C1L) +#define STATUS_DRIVER_FAILED_SLEEP ((NTSTATUS)0xC00002C2L) +#define STATUS_MUTUAL_AUTHENTICATION_FAILED ((NTSTATUS)0xC00002C3L) +#define STATUS_CORRUPT_SYSTEM_FILE ((NTSTATUS)0xC00002C4L) +#define STATUS_DATATYPE_MISALIGNMENT_ERROR ((NTSTATUS)0xC00002C5L) +#define STATUS_WMI_READ_ONLY ((NTSTATUS)0xC00002C6L) +#define STATUS_WMI_SET_FAILURE ((NTSTATUS)0xC00002C7L) +#define STATUS_COMMITMENT_MINIMUM ((NTSTATUS)0xC00002C8L) +#define STATUS_REG_NAT_CONSUMPTION ((NTSTATUS)0xC00002C9L) +#define STATUS_TRANSPORT_FULL ((NTSTATUS)0xC00002CAL) +#define STATUS_DS_SAM_INIT_FAILURE ((NTSTATUS)0xC00002CBL) +#define STATUS_ONLY_IF_CONNECTED ((NTSTATUS)0xC00002CCL) +#define STATUS_DS_SENSITIVE_GROUP_VIOLATION ((NTSTATUS)0xC00002CDL) +#define STATUS_PNP_RESTART_ENUMERATION ((NTSTATUS)0xC00002CEL) +#define STATUS_JOURNAL_ENTRY_DELETED ((NTSTATUS)0xC00002CFL) +#define STATUS_DS_CANT_MOD_PRIMARYGROUPID ((NTSTATUS)0xC00002D0L) +#define STATUS_SYSTEM_IMAGE_BAD_SIGNATURE ((NTSTATUS)0xC00002D1L) +#define STATUS_PNP_REBOOT_REQUIRED ((NTSTATUS)0xC00002D2L) +#define STATUS_POWER_STATE_INVALID ((NTSTATUS)0xC00002D3L) +#define STATUS_DS_INVALID_GROUP_TYPE ((NTSTATUS)0xC00002D4L) +#define STATUS_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN ((NTSTATUS)0xC00002D5L) +#define STATUS_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN ((NTSTATUS)0xC00002D6L) +#define STATUS_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER ((NTSTATUS)0xC00002D7L) +#define STATUS_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER ((NTSTATUS)0xC00002D8L) +#define STATUS_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER ((NTSTATUS)0xC00002D9L) +#define STATUS_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER ((NTSTATUS)0xC00002DAL) +#define STATUS_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER ((NTSTATUS)0xC00002DBL) +#define STATUS_DS_HAVE_PRIMARY_MEMBERS ((NTSTATUS)0xC00002DCL) +#define STATUS_WMI_NOT_SUPPORTED ((NTSTATUS)0xC00002DDL) +#define STATUS_INSUFFICIENT_POWER ((NTSTATUS)0xC00002DEL) +#define STATUS_SAM_NEED_BOOTKEY_PASSWORD ((NTSTATUS)0xC00002DFL) +#define STATUS_SAM_NEED_BOOTKEY_FLOPPY ((NTSTATUS)0xC00002E0L) +#define STATUS_DS_CANT_START ((NTSTATUS)0xC00002E1L) +#define STATUS_DS_INIT_FAILURE ((NTSTATUS)0xC00002E2L) +#define STATUS_SAM_INIT_FAILURE ((NTSTATUS)0xC00002E3L) +#define STATUS_DS_GC_REQUIRED ((NTSTATUS)0xC00002E4L) +#define STATUS_DS_LOCAL_MEMBER_OF_LOCAL_ONLY ((NTSTATUS)0xC00002E5L) +#define STATUS_DS_NO_FPO_IN_UNIVERSAL_GROUPS ((NTSTATUS)0xC00002E6L) +#define STATUS_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED ((NTSTATUS)0xC00002E7L) +#define STATUS_MULTIPLE_FAULT_VIOLATION ((NTSTATUS)0xC00002E8L) +#define STATUS_CURRENT_DOMAIN_NOT_ALLOWED ((NTSTATUS)0xC00002E9L) +#define STATUS_CANNOT_MAKE ((NTSTATUS)0xC00002EAL) +#define STATUS_SYSTEM_SHUTDOWN ((NTSTATUS)0xC00002EBL) +#define STATUS_DS_INIT_FAILURE_CONSOLE ((NTSTATUS)0xC00002ECL) +#define STATUS_DS_SAM_INIT_FAILURE_CONSOLE ((NTSTATUS)0xC00002EDL) +#define STATUS_UNFINISHED_CONTEXT_DELETED ((NTSTATUS)0xC00002EEL) +#define STATUS_NO_TGT_REPLY ((NTSTATUS)0xC00002EFL) +#define STATUS_OBJECTID_NOT_FOUND ((NTSTATUS)0xC00002F0L) +#define STATUS_NO_IP_ADDRESSES ((NTSTATUS)0xC00002F1L) +#define STATUS_WRONG_CREDENTIAL_HANDLE ((NTSTATUS)0xC00002F2L) +#define STATUS_CRYPTO_SYSTEM_INVALID ((NTSTATUS)0xC00002F3L) +#define STATUS_MAX_REFERRALS_EXCEEDED ((NTSTATUS)0xC00002F4L) +#define STATUS_MUST_BE_KDC ((NTSTATUS)0xC00002F5L) +#define STATUS_STRONG_CRYPTO_NOT_SUPPORTED ((NTSTATUS)0xC00002F6L) +#define STATUS_TOO_MANY_PRINCIPALS ((NTSTATUS)0xC00002F7L) +#define STATUS_NO_PA_DATA ((NTSTATUS)0xC00002F8L) +#define STATUS_PKINIT_NAME_MISMATCH ((NTSTATUS)0xC00002F9L) +#define STATUS_SMARTCARD_LOGON_REQUIRED ((NTSTATUS)0xC00002FAL) +#define STATUS_KDC_INVALID_REQUEST ((NTSTATUS)0xC00002FBL) +#define STATUS_KDC_UNABLE_TO_REFER ((NTSTATUS)0xC00002FCL) +#define STATUS_KDC_UNKNOWN_ETYPE ((NTSTATUS)0xC00002FDL) +#define STATUS_SHUTDOWN_IN_PROGRESS ((NTSTATUS)0xC00002FEL) +#define STATUS_SERVER_SHUTDOWN_IN_PROGRESS ((NTSTATUS)0xC00002FFL) +#define STATUS_NOT_SUPPORTED_ON_SBS ((NTSTATUS)0xC0000300L) +#define STATUS_WMI_GUID_DISCONNECTED ((NTSTATUS)0xC0000301L) +#define STATUS_WMI_ALREADY_DISABLED ((NTSTATUS)0xC0000302L) +#define STATUS_WMI_ALREADY_ENABLED ((NTSTATUS)0xC0000303L) +#define STATUS_MFT_TOO_FRAGMENTED ((NTSTATUS)0xC0000304L) +#define STATUS_COPY_PROTECTION_FAILURE ((NTSTATUS)0xC0000305L) +#define STATUS_CSS_AUTHENTICATION_FAILURE ((NTSTATUS)0xC0000306L) +#define STATUS_CSS_KEY_NOT_PRESENT ((NTSTATUS)0xC0000307L) +#define STATUS_CSS_KEY_NOT_ESTABLISHED ((NTSTATUS)0xC0000308L) +#define STATUS_CSS_SCRAMBLED_SECTOR ((NTSTATUS)0xC0000309L) +#define STATUS_CSS_REGION_MISMATCH ((NTSTATUS)0xC000030AL) +#define STATUS_CSS_RESETS_EXHAUSTED ((NTSTATUS)0xC000030BL) +#define STATUS_PKINIT_FAILURE ((NTSTATUS)0xC0000320L) +#define STATUS_SMARTCARD_SUBSYSTEM_FAILURE ((NTSTATUS)0xC0000321L) +#define STATUS_NO_KERB_KEY ((NTSTATUS)0xC0000322L) +#define STATUS_HOST_DOWN ((NTSTATUS)0xC0000350L) +#define STATUS_UNSUPPORTED_PREAUTH ((NTSTATUS)0xC0000351L) +#define STATUS_EFS_ALG_BLOB_TOO_BIG ((NTSTATUS)0xC0000352L) +#define STATUS_PORT_NOT_SET ((NTSTATUS)0xC0000353L) +#define STATUS_DEBUGGER_INACTIVE ((NTSTATUS)0xC0000354L) +#define STATUS_DS_VERSION_CHECK_FAILURE ((NTSTATUS)0xC0000355L) +#define STATUS_AUDITING_DISABLED ((NTSTATUS)0xC0000356L) +#define STATUS_PRENT4_MACHINE_ACCOUNT ((NTSTATUS)0xC0000357L) +#define STATUS_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER ((NTSTATUS)0xC0000358L) +#define STATUS_INVALID_IMAGE_WIN_32 ((NTSTATUS)0xC0000359L) +#define STATUS_INVALID_IMAGE_WIN_64 ((NTSTATUS)0xC000035AL) +#define STATUS_BAD_BINDINGS ((NTSTATUS)0xC000035BL) +#define STATUS_NETWORK_SESSION_EXPIRED ((NTSTATUS)0xC000035CL) +#define STATUS_APPHELP_BLOCK ((NTSTATUS)0xC000035DL) +#define STATUS_ALL_SIDS_FILTERED ((NTSTATUS)0xC000035EL) +#define STATUS_NOT_SAFE_MODE_DRIVER ((NTSTATUS)0xC000035FL) +#define STATUS_ACCESS_DISABLED_BY_POLICY_DEFAULT ((NTSTATUS)0xC0000361L) +#define STATUS_ACCESS_DISABLED_BY_POLICY_PATH ((NTSTATUS)0xC0000362L) +#define STATUS_ACCESS_DISABLED_BY_POLICY_PUBLISHER ((NTSTATUS)0xC0000363L) +#define STATUS_ACCESS_DISABLED_BY_POLICY_OTHER ((NTSTATUS)0xC0000364L) +#define STATUS_FAILED_DRIVER_ENTRY ((NTSTATUS)0xC0000365L) +#define STATUS_DEVICE_ENUMERATION_ERROR ((NTSTATUS)0xC0000366L) +#define STATUS_WAIT_FOR_OPLOCK ((NTSTATUS)0x00000367L) +#define STATUS_MOUNT_POINT_NOT_RESOLVED ((NTSTATUS)0xC0000368L) +#define STATUS_INVALID_DEVICE_OBJECT_PARAMETER ((NTSTATUS)0xC0000369L) +#define STATUS_MCA_OCCURED ((NTSTATUS)0xC000036AL) +#define STATUS_DRIVER_BLOCKED_CRITICAL ((NTSTATUS)0xC000036BL) +#define STATUS_DRIVER_BLOCKED ((NTSTATUS)0xC000036CL) +#define STATUS_DRIVER_DATABASE_ERROR ((NTSTATUS)0xC000036DL) +#define STATUS_SYSTEM_HIVE_TOO_LARGE ((NTSTATUS)0xC000036EL) +#define STATUS_INVALID_IMPORT_OF_NON_DLL ((NTSTATUS)0xC000036FL) +#define STATUS_DS_SHUTTING_DOWN ((NTSTATUS)0x40000370L) +#define STATUS_SMARTCARD_WRONG_PIN ((NTSTATUS)0xC0000380L) +#define STATUS_SMARTCARD_CARD_BLOCKED ((NTSTATUS)0xC0000381L) +#define STATUS_SMARTCARD_CARD_NOT_AUTHENTICATED ((NTSTATUS)0xC0000382L) +#define STATUS_SMARTCARD_NO_CARD ((NTSTATUS)0xC0000383L) +#define STATUS_SMARTCARD_NO_KEY_CONTAINER ((NTSTATUS)0xC0000384L) +#define STATUS_SMARTCARD_NO_CERTIFICATE ((NTSTATUS)0xC0000385L) +#define STATUS_SMARTCARD_NO_KEYSET ((NTSTATUS)0xC0000386L) +#define STATUS_SMARTCARD_IO_ERROR ((NTSTATUS)0xC0000387L) +#define STATUS_DOWNGRADE_DETECTED ((NTSTATUS)0xC0000388L) +#define STATUS_SMARTCARD_CERT_REVOKED ((NTSTATUS)0xC0000389L) +#define STATUS_ISSUING_CA_UNTRUSTED ((NTSTATUS)0xC000038AL) +#define STATUS_REVOCATION_OFFLINE_C ((NTSTATUS)0xC000038BL) +#define STATUS_PKINIT_CLIENT_FAILURE ((NTSTATUS)0xC000038CL) +#define STATUS_SMARTCARD_CERT_EXPIRED ((NTSTATUS)0xC000038DL) +#define STATUS_DRIVER_FAILED_PRIOR_UNLOAD ((NTSTATUS)0xC000038EL) +#define STATUS_WOW_ASSERTION ((NTSTATUS)0xC0009898L) +#define RPC_NT_INVALID_STRING_BINDING ((NTSTATUS)0xC0020001L) +#define RPC_NT_WRONG_KIND_OF_BINDING ((NTSTATUS)0xC0020002L) +#define RPC_NT_INVALID_BINDING ((NTSTATUS)0xC0020003L) +#define RPC_NT_PROTSEQ_NOT_SUPPORTED ((NTSTATUS)0xC0020004L) +#define RPC_NT_INVALID_RPC_PROTSEQ ((NTSTATUS)0xC0020005L) +#define RPC_NT_INVALID_STRING_UUID ((NTSTATUS)0xC0020006L) +#define RPC_NT_INVALID_ENDPOINT_FORMAT ((NTSTATUS)0xC0020007L) +#define RPC_NT_INVALID_NET_ADDR ((NTSTATUS)0xC0020008L) +#define RPC_NT_NO_ENDPOINT_FOUND ((NTSTATUS)0xC0020009L) +#define RPC_NT_INVALID_TIMEOUT ((NTSTATUS)0xC002000AL) +#define RPC_NT_OBJECT_NOT_FOUND ((NTSTATUS)0xC002000BL) +#define RPC_NT_ALREADY_REGISTERED ((NTSTATUS)0xC002000CL) +#define RPC_NT_TYPE_ALREADY_REGISTERED ((NTSTATUS)0xC002000DL) +#define RPC_NT_ALREADY_LISTENING ((NTSTATUS)0xC002000EL) +#define RPC_NT_NO_PROTSEQS_REGISTERED ((NTSTATUS)0xC002000FL) +#define RPC_NT_NOT_LISTENING ((NTSTATUS)0xC0020010L) +#define RPC_NT_UNKNOWN_MGR_TYPE ((NTSTATUS)0xC0020011L) +#define RPC_NT_UNKNOWN_IF ((NTSTATUS)0xC0020012L) +#define RPC_NT_NO_BINDINGS ((NTSTATUS)0xC0020013L) +#define RPC_NT_NO_PROTSEQS ((NTSTATUS)0xC0020014L) +#define RPC_NT_CANT_CREATE_ENDPOINT ((NTSTATUS)0xC0020015L) +#define RPC_NT_OUT_OF_RESOURCES ((NTSTATUS)0xC0020016L) +#define RPC_NT_SERVER_UNAVAILABLE ((NTSTATUS)0xC0020017L) +#define RPC_NT_SERVER_TOO_BUSY ((NTSTATUS)0xC0020018L) +#define RPC_NT_INVALID_NETWORK_OPTIONS ((NTSTATUS)0xC0020019L) +#define RPC_NT_NO_CALL_ACTIVE ((NTSTATUS)0xC002001AL) +#define RPC_NT_CALL_FAILED ((NTSTATUS)0xC002001BL) +#define RPC_NT_CALL_FAILED_DNE ((NTSTATUS)0xC002001CL) +#define RPC_NT_PROTOCOL_ERROR ((NTSTATUS)0xC002001DL) +#define RPC_NT_UNSUPPORTED_TRANS_SYN ((NTSTATUS)0xC002001FL) +#define RPC_NT_UNSUPPORTED_TYPE ((NTSTATUS)0xC0020021L) +#define RPC_NT_INVALID_TAG ((NTSTATUS)0xC0020022L) +#define RPC_NT_INVALID_BOUND ((NTSTATUS)0xC0020023L) +#define RPC_NT_NO_ENTRY_NAME ((NTSTATUS)0xC0020024L) +#define RPC_NT_INVALID_NAME_SYNTAX ((NTSTATUS)0xC0020025L) +#define RPC_NT_UNSUPPORTED_NAME_SYNTAX ((NTSTATUS)0xC0020026L) +#define RPC_NT_UUID_NO_ADDRESS ((NTSTATUS)0xC0020028L) +#define RPC_NT_DUPLICATE_ENDPOINT ((NTSTATUS)0xC0020029L) +#define RPC_NT_UNKNOWN_AUTHN_TYPE ((NTSTATUS)0xC002002AL) +#define RPC_NT_MAX_CALLS_TOO_SMALL ((NTSTATUS)0xC002002BL) +#define RPC_NT_STRING_TOO_LONG ((NTSTATUS)0xC002002CL) +#define RPC_NT_PROTSEQ_NOT_FOUND ((NTSTATUS)0xC002002DL) +#define RPC_NT_PROCNUM_OUT_OF_RANGE ((NTSTATUS)0xC002002EL) +#define RPC_NT_BINDING_HAS_NO_AUTH ((NTSTATUS)0xC002002FL) +#define RPC_NT_UNKNOWN_AUTHN_SERVICE ((NTSTATUS)0xC0020030L) +#define RPC_NT_UNKNOWN_AUTHN_LEVEL ((NTSTATUS)0xC0020031L) +#define RPC_NT_INVALID_AUTH_IDENTITY ((NTSTATUS)0xC0020032L) +#define RPC_NT_UNKNOWN_AUTHZ_SERVICE ((NTSTATUS)0xC0020033L) +#define EPT_NT_INVALID_ENTRY ((NTSTATUS)0xC0020034L) +#define EPT_NT_CANT_PERFORM_OP ((NTSTATUS)0xC0020035L) +#define EPT_NT_NOT_REGISTERED ((NTSTATUS)0xC0020036L) +#define RPC_NT_NOTHING_TO_EXPORT ((NTSTATUS)0xC0020037L) +#define RPC_NT_INCOMPLETE_NAME ((NTSTATUS)0xC0020038L) +#define RPC_NT_INVALID_VERS_OPTION ((NTSTATUS)0xC0020039L) +#define RPC_NT_NO_MORE_MEMBERS ((NTSTATUS)0xC002003AL) +#define RPC_NT_NOT_ALL_OBJS_UNEXPORTED ((NTSTATUS)0xC002003BL) +#define RPC_NT_INTERFACE_NOT_FOUND ((NTSTATUS)0xC002003CL) +#define RPC_NT_ENTRY_ALREADY_EXISTS ((NTSTATUS)0xC002003DL) +#define RPC_NT_ENTRY_NOT_FOUND ((NTSTATUS)0xC002003EL) +#define RPC_NT_NAME_SERVICE_UNAVAILABLE ((NTSTATUS)0xC002003FL) +#define RPC_NT_INVALID_NAF_ID ((NTSTATUS)0xC0020040L) +#define RPC_NT_CANNOT_SUPPORT ((NTSTATUS)0xC0020041L) +#define RPC_NT_NO_CONTEXT_AVAILABLE ((NTSTATUS)0xC0020042L) +#define RPC_NT_INTERNAL_ERROR ((NTSTATUS)0xC0020043L) +#define RPC_NT_ZERO_DIVIDE ((NTSTATUS)0xC0020044L) +#define RPC_NT_ADDRESS_ERROR ((NTSTATUS)0xC0020045L) +#define RPC_NT_FP_DIV_ZERO ((NTSTATUS)0xC0020046L) +#define RPC_NT_FP_UNDERFLOW ((NTSTATUS)0xC0020047L) +#define RPC_NT_FP_OVERFLOW ((NTSTATUS)0xC0020048L) +#define RPC_NT_NO_MORE_ENTRIES ((NTSTATUS)0xC0030001L) +#define RPC_NT_SS_CHAR_TRANS_OPEN_FAIL ((NTSTATUS)0xC0030002L) +#define RPC_NT_SS_CHAR_TRANS_SHORT_FILE ((NTSTATUS)0xC0030003L) +#define RPC_NT_SS_IN_NULL_CONTEXT ((NTSTATUS)0xC0030004L) +#define RPC_NT_SS_CONTEXT_MISMATCH ((NTSTATUS)0xC0030005L) +#define RPC_NT_SS_CONTEXT_DAMAGED ((NTSTATUS)0xC0030006L) +#define RPC_NT_SS_HANDLES_MISMATCH ((NTSTATUS)0xC0030007L) +#define RPC_NT_SS_CANNOT_GET_CALL_HANDLE ((NTSTATUS)0xC0030008L) +#define RPC_NT_NULL_REF_POINTER ((NTSTATUS)0xC0030009L) +#define RPC_NT_ENUM_VALUE_OUT_OF_RANGE ((NTSTATUS)0xC003000AL) +#define RPC_NT_BYTE_COUNT_TOO_SMALL ((NTSTATUS)0xC003000BL) +#define RPC_NT_BAD_STUB_DATA ((NTSTATUS)0xC003000CL) +#define RPC_NT_CALL_IN_PROGRESS ((NTSTATUS)0xC0020049L) +#define RPC_NT_NO_MORE_BINDINGS ((NTSTATUS)0xC002004AL) +#define RPC_NT_GROUP_MEMBER_NOT_FOUND ((NTSTATUS)0xC002004BL) +#define EPT_NT_CANT_CREATE ((NTSTATUS)0xC002004CL) +#define RPC_NT_INVALID_OBJECT ((NTSTATUS)0xC002004DL) +#define RPC_NT_NO_INTERFACES ((NTSTATUS)0xC002004FL) +#define RPC_NT_CALL_CANCELLED ((NTSTATUS)0xC0020050L) +#define RPC_NT_BINDING_INCOMPLETE ((NTSTATUS)0xC0020051L) +#define RPC_NT_COMM_FAILURE ((NTSTATUS)0xC0020052L) +#define RPC_NT_UNSUPPORTED_AUTHN_LEVEL ((NTSTATUS)0xC0020053L) +#define RPC_NT_NO_PRINC_NAME ((NTSTATUS)0xC0020054L) +#define RPC_NT_NOT_RPC_ERROR ((NTSTATUS)0xC0020055L) +#define RPC_NT_UUID_LOCAL_ONLY ((NTSTATUS)0x40020056L) +#define RPC_NT_SEC_PKG_ERROR ((NTSTATUS)0xC0020057L) +#define RPC_NT_NOT_CANCELLED ((NTSTATUS)0xC0020058L) +#define RPC_NT_INVALID_ES_ACTION ((NTSTATUS)0xC0030059L) +#define RPC_NT_WRONG_ES_VERSION ((NTSTATUS)0xC003005AL) +#define RPC_NT_WRONG_STUB_VERSION ((NTSTATUS)0xC003005BL) +#define RPC_NT_INVALID_PIPE_OBJECT ((NTSTATUS)0xC003005CL) +#define RPC_NT_INVALID_PIPE_OPERATION ((NTSTATUS)0xC003005DL) +#define RPC_NT_WRONG_PIPE_VERSION ((NTSTATUS)0xC003005EL) +#define RPC_NT_PIPE_CLOSED ((NTSTATUS)0xC003005FL) +#define RPC_NT_PIPE_DISCIPLINE_ERROR ((NTSTATUS)0xC0030060L) +#define RPC_NT_PIPE_EMPTY ((NTSTATUS)0xC0030061L) +#define RPC_NT_INVALID_ASYNC_HANDLE ((NTSTATUS)0xC0020062L) +#define RPC_NT_INVALID_ASYNC_CALL ((NTSTATUS)0xC0020063L) +#define RPC_NT_SEND_INCOMPLETE ((NTSTATUS)0x400200AFL) +#define STATUS_ACPI_INVALID_OPCODE ((NTSTATUS)0xC0140001L) +#define STATUS_ACPI_STACK_OVERFLOW ((NTSTATUS)0xC0140002L) +#define STATUS_ACPI_ASSERT_FAILED ((NTSTATUS)0xC0140003L) +#define STATUS_ACPI_INVALID_INDEX ((NTSTATUS)0xC0140004L) +#define STATUS_ACPI_INVALID_ARGUMENT ((NTSTATUS)0xC0140005L) +#define STATUS_ACPI_FATAL ((NTSTATUS)0xC0140006L) +#define STATUS_ACPI_INVALID_SUPERNAME ((NTSTATUS)0xC0140007L) +#define STATUS_ACPI_INVALID_ARGTYPE ((NTSTATUS)0xC0140008L) +#define STATUS_ACPI_INVALID_OBJTYPE ((NTSTATUS)0xC0140009L) +#define STATUS_ACPI_INVALID_TARGETTYPE ((NTSTATUS)0xC014000AL) +#define STATUS_ACPI_INCORRECT_ARGUMENT_COUNT ((NTSTATUS)0xC014000BL) +#define STATUS_ACPI_ADDRESS_NOT_MAPPED ((NTSTATUS)0xC014000CL) +#define STATUS_ACPI_INVALID_EVENTTYPE ((NTSTATUS)0xC014000DL) +#define STATUS_ACPI_HANDLER_COLLISION ((NTSTATUS)0xC014000EL) +#define STATUS_ACPI_INVALID_DATA ((NTSTATUS)0xC014000FL) +#define STATUS_ACPI_INVALID_REGION ((NTSTATUS)0xC0140010L) +#define STATUS_ACPI_INVALID_ACCESS_SIZE ((NTSTATUS)0xC0140011L) +#define STATUS_ACPI_ACQUIRE_GLOBAL_LOCK ((NTSTATUS)0xC0140012L) +#define STATUS_ACPI_ALREADY_INITIALIZED ((NTSTATUS)0xC0140013L) +#define STATUS_ACPI_NOT_INITIALIZED ((NTSTATUS)0xC0140014L) +#define STATUS_ACPI_INVALID_MUTEX_LEVEL ((NTSTATUS)0xC0140015L) +#define STATUS_ACPI_MUTEX_NOT_OWNED ((NTSTATUS)0xC0140016L) +#define STATUS_ACPI_MUTEX_NOT_OWNER ((NTSTATUS)0xC0140017L) +#define STATUS_ACPI_RS_ACCESS ((NTSTATUS)0xC0140018L) +#define STATUS_ACPI_INVALID_TABLE ((NTSTATUS)0xC0140019L) +#define STATUS_ACPI_REG_HANDLER_FAILED ((NTSTATUS)0xC0140020L) +#define STATUS_ACPI_POWER_REQUEST_FAILED ((NTSTATUS)0xC0140021L) +#define STATUS_CTX_WINSTATION_NAME_INVALID ((NTSTATUS)0xC00A0001L) +#define STATUS_CTX_INVALID_PD ((NTSTATUS)0xC00A0002L) +#define STATUS_CTX_PD_NOT_FOUND ((NTSTATUS)0xC00A0003L) +#define STATUS_CTX_CDM_CONNECT ((NTSTATUS)0x400A0004L) +#define STATUS_CTX_CDM_DISCONNECT ((NTSTATUS)0x400A0005L) +#define STATUS_CTX_CLOSE_PENDING ((NTSTATUS)0xC00A0006L) +#define STATUS_CTX_NO_OUTBUF ((NTSTATUS)0xC00A0007L) +#define STATUS_CTX_MODEM_INF_NOT_FOUND ((NTSTATUS)0xC00A0008L) +#define STATUS_CTX_INVALID_MODEMNAME ((NTSTATUS)0xC00A0009L) +#define STATUS_CTX_RESPONSE_ERROR ((NTSTATUS)0xC00A000AL) +#define STATUS_CTX_MODEM_RESPONSE_TIMEOUT ((NTSTATUS)0xC00A000BL) +#define STATUS_CTX_MODEM_RESPONSE_NO_CARRIER ((NTSTATUS)0xC00A000CL) +#define STATUS_CTX_MODEM_RESPONSE_NO_DIALTONE ((NTSTATUS)0xC00A000DL) +#define STATUS_CTX_MODEM_RESPONSE_BUSY ((NTSTATUS)0xC00A000EL) +#define STATUS_CTX_MODEM_RESPONSE_VOICE ((NTSTATUS)0xC00A000FL) +#define STATUS_CTX_TD_ERROR ((NTSTATUS)0xC00A0010L) +#define STATUS_CTX_LICENSE_CLIENT_INVALID ((NTSTATUS)0xC00A0012L) +#define STATUS_CTX_LICENSE_NOT_AVAILABLE ((NTSTATUS)0xC00A0013L) +#define STATUS_CTX_LICENSE_EXPIRED ((NTSTATUS)0xC00A0014L) +#define STATUS_CTX_WINSTATION_NOT_FOUND ((NTSTATUS)0xC00A0015L) +#define STATUS_CTX_WINSTATION_NAME_COLLISION ((NTSTATUS)0xC00A0016L) +#define STATUS_CTX_WINSTATION_BUSY ((NTSTATUS)0xC00A0017L) +#define STATUS_CTX_BAD_VIDEO_MODE ((NTSTATUS)0xC00A0018L) +#define STATUS_CTX_GRAPHICS_INVALID ((NTSTATUS)0xC00A0022L) +#define STATUS_CTX_NOT_CONSOLE ((NTSTATUS)0xC00A0024L) +#define STATUS_CTX_CLIENT_QUERY_TIMEOUT ((NTSTATUS)0xC00A0026L) +#define STATUS_CTX_CONSOLE_DISCONNECT ((NTSTATUS)0xC00A0027L) +#define STATUS_CTX_CONSOLE_CONNECT ((NTSTATUS)0xC00A0028L) +#define STATUS_CTX_SHADOW_DENIED ((NTSTATUS)0xC00A002AL) +#define STATUS_CTX_WINSTATION_ACCESS_DENIED ((NTSTATUS)0xC00A002BL) +#define STATUS_CTX_INVALID_WD ((NTSTATUS)0xC00A002EL) +#define STATUS_CTX_WD_NOT_FOUND ((NTSTATUS)0xC00A002FL) +#define STATUS_CTX_SHADOW_INVALID ((NTSTATUS)0xC00A0030L) +#define STATUS_CTX_SHADOW_DISABLED ((NTSTATUS)0xC00A0031L) +#define STATUS_RDP_PROTOCOL_ERROR ((NTSTATUS)0xC00A0032L) +#define STATUS_CTX_CLIENT_LICENSE_NOT_SET ((NTSTATUS)0xC00A0033L) +#define STATUS_CTX_CLIENT_LICENSE_IN_USE ((NTSTATUS)0xC00A0034L) +#define STATUS_CTX_SHADOW_ENDED_BY_MODE_CHANGE ((NTSTATUS)0xC00A0035L) +#define STATUS_CTX_SHADOW_NOT_RUNNING ((NTSTATUS)0xC00A0036L) +#define STATUS_PNP_BAD_MPS_TABLE ((NTSTATUS)0xC0040035L) +#define STATUS_PNP_TRANSLATION_FAILED ((NTSTATUS)0xC0040036L) +#define STATUS_PNP_IRQ_TRANSLATION_FAILED ((NTSTATUS)0xC0040037L) +#define STATUS_SXS_SECTION_NOT_FOUND ((NTSTATUS)0xC0150001L) +#define STATUS_SXS_CANT_GEN_ACTCTX ((NTSTATUS)0xC0150002L) +#define STATUS_SXS_INVALID_ACTCTXDATA_FORMAT ((NTSTATUS)0xC0150003L) +#define STATUS_SXS_ASSEMBLY_NOT_FOUND ((NTSTATUS)0xC0150004L) +#define STATUS_SXS_MANIFEST_FORMAT_ERROR ((NTSTATUS)0xC0150005L) +#define STATUS_SXS_MANIFEST_PARSE_ERROR ((NTSTATUS)0xC0150006L) +#define STATUS_SXS_ACTIVATION_CONTEXT_DISABLED ((NTSTATUS)0xC0150007L) +#define STATUS_SXS_KEY_NOT_FOUND ((NTSTATUS)0xC0150008L) +#define STATUS_SXS_VERSION_CONFLICT ((NTSTATUS)0xC0150009L) +#define STATUS_SXS_WRONG_SECTION_TYPE ((NTSTATUS)0xC015000AL) +#define STATUS_SXS_THREAD_QUERIES_DISABLED ((NTSTATUS)0xC015000BL) +#define STATUS_SXS_ASSEMBLY_MISSING ((NTSTATUS)0xC015000CL) +#define STATUS_SXS_RELEASE_ACTIVATION_CONTEXT ((NTSTATUS)0x4015000DL) +#define STATUS_SXS_PROCESS_DEFAULT_ALREADY_SET ((NTSTATUS)0xC015000EL) +#define STATUS_SXS_EARLY_DEACTIVATION ((NTSTATUS)0xC015000FL) +#define STATUS_SXS_INVALID_DEACTIVATION ((NTSTATUS)0xC0150010L) +#define STATUS_SXS_MULTIPLE_DEACTIVATION ((NTSTATUS)0xC0150011L) +#define STATUS_SXS_SYSTEM_DEFAULT_ACTIVATION_CONTEXT_EMPTY ((NTSTATUS)0xC0150012L) +#define STATUS_SXS_PROCESS_TERMINATION_REQUESTED ((NTSTATUS)0xC0150013L) +#define STATUS_CLUSTER_INVALID_NODE ((NTSTATUS)0xC0130001L) +#define STATUS_CLUSTER_NODE_EXISTS ((NTSTATUS)0xC0130002L) +#define STATUS_CLUSTER_JOIN_IN_PROGRESS ((NTSTATUS)0xC0130003L) +#define STATUS_CLUSTER_NODE_NOT_FOUND ((NTSTATUS)0xC0130004L) +#define STATUS_CLUSTER_LOCAL_NODE_NOT_FOUND ((NTSTATUS)0xC0130005L) +#define STATUS_CLUSTER_NETWORK_EXISTS ((NTSTATUS)0xC0130006L) +#define STATUS_CLUSTER_NETWORK_NOT_FOUND ((NTSTATUS)0xC0130007L) +#define STATUS_CLUSTER_NETINTERFACE_EXISTS ((NTSTATUS)0xC0130008L) +#define STATUS_CLUSTER_NETINTERFACE_NOT_FOUND ((NTSTATUS)0xC0130009L) +#define STATUS_CLUSTER_INVALID_REQUEST ((NTSTATUS)0xC013000AL) +#define STATUS_CLUSTER_INVALID_NETWORK_PROVIDER ((NTSTATUS)0xC013000BL) +#define STATUS_CLUSTER_NODE_DOWN ((NTSTATUS)0xC013000CL) +#define STATUS_CLUSTER_NODE_UNREACHABLE ((NTSTATUS)0xC013000DL) +#define STATUS_CLUSTER_NODE_NOT_MEMBER ((NTSTATUS)0xC013000EL) +#define STATUS_CLUSTER_JOIN_NOT_IN_PROGRESS ((NTSTATUS)0xC013000FL) +#define STATUS_CLUSTER_INVALID_NETWORK ((NTSTATUS)0xC0130010L) +#define STATUS_CLUSTER_NO_NET_ADAPTERS ((NTSTATUS)0xC0130011L) +#define STATUS_CLUSTER_NODE_UP ((NTSTATUS)0xC0130012L) +#define STATUS_CLUSTER_NODE_PAUSED ((NTSTATUS)0xC0130013L) +#define STATUS_CLUSTER_NODE_NOT_PAUSED ((NTSTATUS)0xC0130014L) +#define STATUS_CLUSTER_NO_SECURITY_CONTEXT ((NTSTATUS)0xC0130015L) +#define STATUS_CLUSTER_NETWORK_NOT_INTERNAL ((NTSTATUS)0xC0130016L) +#define STATUS_CLUSTER_POISONED ((NTSTATUS)0xC0130017L) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/reactos/w32api/include/ddk/parallel.h b/reactos/w32api/include/ddk/parallel.h new file mode 100644 index 00000000000..1c7d72f1084 --- /dev/null +++ b/reactos/w32api/include/ddk/parallel.h @@ -0,0 +1,282 @@ +/* + * parallel.h + * + * ParPort driver interface + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __PARALLEL_H +#define __PARALLEL_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" +#include "ntddpar.h" + + +#define DD_PARALLEL_PORT_BASE_NAME "ParallelPort" +#define DD_PARALLEL_PORT_BASE_NAME_U L"ParallelPort" + +#define IOCTL_INTERNAL_DESELECT_DEVICE \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 24, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_INTERNAL_GET_MORE_PARALLEL_PORT_INFO \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 17, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_INTERNAL_GET_PARALLEL_PNP_INFO \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 21, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_INTERNAL_GET_PARALLEL_PORT_INFO \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 12, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_INTERNAL_INIT_1284_3_BUS \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 22, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_INTERNAL_PARALLEL_CLEAR_CHIP_MODE \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 20, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_INTERNAL_PARALLEL_CONNECT_INTERRUPT \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 13, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_INTERNAL_PARALLEL_DISCONNECT_INTERRUPT \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 14, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_INTERNAL_PARALLEL_PORT_ALLOCATE \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 11, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_INTERNAL_PARALLEL_PORT_FREE \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 40, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_INTERNAL_PARALLEL_SET_CHIP_MODE \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 19, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_INTERNAL_RELEASE_PARALLEL_PORT_INFO \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 15, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_INTERNAL_SELECT_DEVICE \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 23, METHOD_BUFFERED, FILE_ANY_ACCESS) + + +typedef struct _PARALLEL_1284_COMMAND { + UCHAR ID; + UCHAR Port; + ULONG CommandFlags; +} PARALLEL_1284_COMMAND, *PPARALLEL_1284_COMMAND; + +/* PARALLEL_1284_COMMAND.CommandFlags */ +#define PAR_END_OF_CHAIN_DEVICE 0x00000001 +#define PAR_HAVE_PORT_KEEP_PORT 0x00000002 + +typedef struct _MORE_PARALLEL_PORT_INFORMATION { + INTERFACE_TYPE InterfaceType; + ULONG BusNumber; + ULONG InterruptLevel; + ULONG InterruptVector; + KAFFINITY InterruptAffinity; + KINTERRUPT_MODE InterruptMode; +} MORE_PARALLEL_PORT_INFORMATION, *PMORE_PARALLEL_PORT_INFORMATION; + +typedef NTSTATUS DDKAPI +(*PPARALLEL_SET_CHIP_MODE)( + IN PVOID SetChipContext, + IN UCHAR ChipMode); + +typedef NTSTATUS DDKAPI +(*PPARALLEL_CLEAR_CHIP_MODE)( + IN PVOID ClearChipContext, + IN UCHAR ChipMode); + +typedef NTSTATUS DDKAPI +(*PPARCHIP_CLEAR_CHIP_MODE)( + IN PVOID ClearChipContext, + IN UCHAR ChipMode); + +typedef NTSTATUS DDKAPI +(*PPARALLEL_TRY_SELECT_ROUTINE)( + IN PVOID TrySelectContext, + IN PVOID TrySelectCommand); + +typedef NTSTATUS DDKAPI +(*PPARALLEL_DESELECT_ROUTINE)( + IN PVOID DeselectContext, + IN PVOID DeselectCommand); + +/* PARALLEL_PNP_INFORMATION.HardwareCapabilities */ +#define PPT_NO_HARDWARE_PRESENT 0x00000000 +#define PPT_ECP_PRESENT 0x00000001 +#define PPT_EPP_PRESENT 0x00000002 +#define PPT_EPP_32_PRESENT 0x00000004 +#define PPT_BYTE_PRESENT 0x00000008 +#define PPT_BIDI_PRESENT 0x00000008 +#define PPT_1284_3_PRESENT 0x00000010 + +typedef struct _PARALLEL_PNP_INFORMATION { + PHYSICAL_ADDRESS OriginalEcpController; + PUCHAR EcpController; + ULONG SpanOfEcpController; + ULONG PortNumber; + ULONG HardwareCapabilities; + PPARALLEL_SET_CHIP_MODE TrySetChipMode; + PPARALLEL_CLEAR_CHIP_MODE ClearChipMode; + ULONG FifoDepth; + ULONG FifoWidth; + PHYSICAL_ADDRESS EppControllerPhysicalAddress; + ULONG SpanOfEppController; + ULONG Ieee1284_3DeviceCount; + PPARALLEL_TRY_SELECT_ROUTINE TrySelectDevice; + PPARALLEL_DESELECT_ROUTINE DeselectDevice; + PVOID Context; + ULONG CurrentMode; + PWSTR PortName; +} PARALLEL_PNP_INFORMATION, *PPARALLEL_PNP_INFORMATION; + +typedef BOOLEAN DDKAPI +(*PPARALLEL_TRY_ALLOCATE_ROUTINE)( + IN PVOID TryAllocateContext); + +typedef VOID DDKAPI +(*PPARALLEL_FREE_ROUTINE)( + IN PVOID FreeContext); + +typedef ULONG DDKAPI +(*PPARALLEL_QUERY_WAITERS_ROUTINE)( + IN PVOID QueryAllocsContext); + +typedef struct _PARALLEL_PORT_INFORMATION { + PHYSICAL_ADDRESS OriginalController; + PUCHAR Controller; + ULONG SpanOfController; + PPARALLEL_TRY_ALLOCATE_ROUTINE TryAllocatePort; + PPARALLEL_FREE_ROUTINE FreePort; + PPARALLEL_QUERY_WAITERS_ROUTINE QueryNumWaiters; + PVOID Context; +} PARALLEL_PORT_INFORMATION, *PPARALLEL_PORT_INFORMATION; + +/* PARALLEL_CHIP_MODE.ModeFlags */ +#define INITIAL_MODE 0x00 +#define PARCHIP_ECR_ARBITRATOR 0x01 + +typedef struct _PARALLEL_CHIP_MODE { + UCHAR ModeFlags; + BOOLEAN success; +} PARALLEL_CHIP_MODE, *PPARALLEL_CHIP_MODE; + +typedef VOID DDKAPI +(*PPARALLEL_DEFERRED_ROUTINE)( + IN PVOID DeferredContext); + +typedef struct _PARALLEL_INTERRUPT_SERVICE_ROUTINE { + PKSERVICE_ROUTINE InterruptServiceRoutine; + PVOID InterruptServiceContext; + PPARALLEL_DEFERRED_ROUTINE DeferredPortCheckRoutine; + PVOID DeferredPortCheckContext; +} PARALLEL_INTERRUPT_SERVICE_ROUTINE, *PPARALLEL_INTERRUPT_SERVICE_ROUTINE; + + +#define IOCTL_INTERNAL_DISCONNECT_IDLE \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 32, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_INTERNAL_LOCK_PORT \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 37, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_INTERNAL_LOCK_PORT_NO_SELECT \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 52, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_INTERNAL_PARCLASS_CONNECT \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 30, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_INTERNAL_PARCLASS_DISCONNECT \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 31, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_INTERNAL_UNLOCK_PORT \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 38, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_INTERNAL_UNLOCK_PORT_NO_DESELECT \ + CTL_CODE (FILE_DEVICE_PARALLEL_PORT, 53, METHOD_BUFFERED, FILE_ANY_ACCESS) + +typedef USHORT DDKAPI +(*PDETERMINE_IEEE_MODES)( + IN PVOID Context); + +typedef enum _PARALLEL_SAFETY { + SAFE_MODE, + UNSAFE_MODE +} PARALLEL_SAFETY; + +typedef NTSTATUS DDKAPI +(*PNEGOTIATE_IEEE_MODE)( + IN PVOID Context, + IN USHORT ModeMaskFwd, + IN USHORT ModeMaskRev, + IN PARALLEL_SAFETY ModeSafety, + IN BOOLEAN IsForward); + +typedef NTSTATUS DDKAPI +(*PTERMINATE_IEEE_MODE)( + IN PVOID Context); + +typedef NTSTATUS DDKAPI +(*PPARALLEL_IEEE_FWD_TO_REV)( + IN PVOID Context); + +typedef NTSTATUS DDKAPI +(*PPARALLEL_IEEE_REV_TO_FWD)( + IN PVOID Context); + +typedef NTSTATUS DDKAPI +(*PPARALLEL_READ)( + IN PVOID Context, + OUT PVOID Buffer, + IN ULONG NumBytesToRead, + OUT PULONG NumBytesRead, + IN UCHAR Channel); + +typedef NTSTATUS DDKAPI +(*PPARALLEL_WRITE)( + IN PVOID Context, + OUT PVOID Buffer, + IN ULONG NumBytesToWrite, + OUT PULONG NumBytesWritten, + IN UCHAR Channel); + +typedef NTSTATUS DDKAPI +(*PPARALLEL_TRYSELECT_DEVICE)( + IN PVOID Context, + IN PARALLEL_1284_COMMAND Command); + +typedef NTSTATUS DDKAPI +(*PPARALLEL_DESELECT_DEVICE)( + IN PVOID Context, + IN PARALLEL_1284_COMMAND Command); + +typedef struct _PARCLASS_INFORMATION { + PUCHAR Controller; + PUCHAR EcrController; + ULONG SpanOfController; + PDETERMINE_IEEE_MODES DetermineIeeeModes; + PNEGOTIATE_IEEE_MODE NegotiateIeeeMode; + PTERMINATE_IEEE_MODE TerminateIeeeMode; + PPARALLEL_IEEE_FWD_TO_REV IeeeFwdToRevMode; + PPARALLEL_IEEE_REV_TO_FWD IeeeRevToFwdMode; + PPARALLEL_READ ParallelRead; + PPARALLEL_WRITE ParallelWrite; + PVOID ParclassContext; + ULONG HardwareCapabilities; + ULONG FifoDepth; + ULONG FifoWidth; + PPARALLEL_TRYSELECT_DEVICE ParallelTryselect; + PPARALLEL_DESELECT_DEVICE ParallelDeSelect; +} PARCLASS_INFORMATION, *PPARCLASS_INFORMATION; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __PARALLEL_H */ diff --git a/reactos/w32api/include/ddk/pfhook.h b/reactos/w32api/include/ddk/pfhook.h new file mode 100644 index 00000000000..571b63ef66b --- /dev/null +++ b/reactos/w32api/include/ddk/pfhook.h @@ -0,0 +1,81 @@ +/* + * pfhook.h + * + * Packet filter API + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __PFHOOK_H +#define __PFHOOK_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + + +#define DD_IPFLTRDRVR_DEVICE_NAME L"\\Device\\IPFILTERDRIVER" + +#define INVALID_PF_IF_INDEX 0xffffffff +#define ZERO_PF_IP_ADDR 0 + +typedef ULONG IPAddr; + +typedef enum _PF_FORWARD_ACTION { + PF_FORWARD = 0, + PF_DROP = 1, + PF_PASS = 2, + PF_ICMP_ON_DROP = 3 +} PF_FORWARD_ACTION; + +typedef PF_FORWARD_ACTION STDCALL +(*PacketFilterExtensionPtr)( + IN unsigned char *PacketHeader, + IN unsigned char *Packet, + IN unsigned int PacketLength, + IN unsigned int RecvInterfaceIndex, + IN unsigned int SendInterfaceIndex, + IN IPAddr RecvLinkNextHop, + IN IPAddr SendLinkNextHop); + +typedef struct _PF_SET_EXTENSION_HOOK_INFO { + PacketFilterExtensionPtr ExtensionPointer; +} PF_SET_EXTENSION_HOOK_INFO, *PPF_SET_EXTENSION_HOOK_INFO; + +#define FSCTL_IPFLTRDRVR_BASE FILE_DEVICE_NETWORK + +#define _IPFLTRDRVR_CTL_CODE(function, method, access) \ + CTL_CODE(FSCTL_IPFLTRDRVR_BASE, function, method, access) + +#define IOCTL_PF_SET_EXTENSION_POINTER \ + _IPFLTRDRVR_CTL_CODE(22, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __PFHOOK_H */ diff --git a/reactos/w32api/include/ddk/poclass.h b/reactos/w32api/include/ddk/poclass.h new file mode 100644 index 00000000000..8de537884e7 --- /dev/null +++ b/reactos/w32api/include/ddk/poclass.h @@ -0,0 +1,123 @@ +/* + * poclass.h + * + * Power policy driver interface + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __POCLASS_H +#define __POCLASS_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" +#include "batclass.h" + + +DEFINE_GUID(GUID_CLASS_INPUT, + 0x4D1E55B2L, 0xF16F, 0x11CF, 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30); + +DEFINE_GUID(GUID_DEVICE_LID, + 0x4AFA3D52L, 0x74A7, 0x11d0, 0xbe, 0x5e, 0x00, 0xA0, 0xC9, 0x06, 0x28, 0x57); + +DEFINE_GUID(GUID_DEVICE_MEMORY, + 0x3fd0f03dL, 0x92e0, 0x45fb, 0xb7, 0x5c, 0x5e, 0xd8, 0xff, 0xb0, 0x10, 0x21); + +DEFINE_GUID(GUID_DEVICE_MESSAGE_INDICATOR, + 0XCD48A365L, 0xfa94, 0x4ce2, 0xa2, 0x32, 0xa1, 0xb7, 0x64, 0xe5, 0xd8, 0xb4); + +DEFINE_GUID(GUID_DEVICE_PROCESSOR, + 0x97fadb10L, 0x4e33, 0x40ae, 0x35, 0x9c, 0x8b, 0xef, 0x02, 0x9d, 0xbd, 0xd0); + +DEFINE_GUID(GUID_DEVICE_SYS_BUTTON, + 0x4AFA3D53L, 0x74A7, 0x11d0, 0xbe, 0x5e, 0x00, 0xA0, 0xC9, 0x06, 0x28, 0x57); + +DEFINE_GUID(GUID_DEVICE_THERMAL_ZONE, + 0x4AFA3D51L, 0x74A7, 0x11d0, 0xbe, 0x5e, 0x00, 0xA0, 0xC9, 0x06, 0x28, 0x57); + + +#define IOCTL_GET_PROCESSOR_OBJ_INFO \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x60, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_GET_SYS_BUTTON_CAPS \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x50, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_GET_SYS_BUTTON_EVENT \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x51, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_SET_SYS_MESSAGE_INDICATOR \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x70, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#define IOCTL_NOTIFY_SWITCH_EVENT \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x40, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_THERMAL_QUERY_INFORMATION \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x20, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_THERMAL_SET_COOLING_POLICY \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x21, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#define IOCTL_QUERY_LID \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x30, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_RUN_ACTIVE_COOLING_METHOD \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x22, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#define SYS_BUTTON_POWER 0x00000001 +#define SYS_BUTTON_SLEEP 0x00000002 +#define SYS_BUTTON_LID 0x00000004 +#define SYS_BUTTON_WAKE 0x80000000 + +#define MAX_ACTIVE_COOLING_LEVELS 10 +#define ACTIVE_COOLING 0 +#define PASSIVE_COOLING 1 + +typedef struct _THERMAL_INFORMATION { + ULONG ThermalStamp; + ULONG ThermalConstant1; + ULONG ThermalConstant2; + KAFFINITY Processors; + ULONG SamplingPeriod; + ULONG CurrentTemperature; + ULONG PassiveTripPoint; + ULONG CriticalTripPoint; + UCHAR ActiveTripPointCount; + ULONG ActiveTripPoint[MAX_ACTIVE_COOLING_LEVELS]; +} THERMAL_INFORMATION, *PTHERMAL_INFORMATION; + +typedef struct _PROCESSOR_OBJECT_INFO { + ULONG PhysicalID; + ULONG PBlkAddress; + UCHAR PBlkLength; +} PROCESSOR_OBJECT_INFO, *PPROCESSOR_OBJECT_INFO; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __POCLASS_H */ diff --git a/reactos/w32api/include/ddk/scsi.h b/reactos/w32api/include/ddk/scsi.h new file mode 100644 index 00000000000..727ba6c3e4a --- /dev/null +++ b/reactos/w32api/include/ddk/scsi.h @@ -0,0 +1,1698 @@ +/* + * scsi.h + * + * SCSI port and class interface. + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __SCSI_H +#define __SCSI_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + +typedef union _CDB { + struct _CDB6GENERIC { + UCHAR OperationCode; + UCHAR Immediate : 1; + UCHAR CommandUniqueBits : 4; + UCHAR LogicalUnitNumber : 3; + UCHAR CommandUniqueBytes[3]; + UCHAR Link : 1; + UCHAR Flag : 1; + UCHAR Reserved : 4; + UCHAR VendorUnique : 2; + } CDB6GENERIC, *PCDB6GENERIC; + + struct _CDB6READWRITE { + UCHAR OperationCode; + UCHAR LogicalBlockMsb1 : 5; + UCHAR LogicalUnitNumber : 3; + UCHAR LogicalBlockMsb0; + UCHAR LogicalBlockLsb; + UCHAR TransferBlocks; + UCHAR Control; + } CDB6READWRITE, *PCDB6READWRITE; + + struct _CDB6INQUIRY { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR LogicalUnitNumber : 3; + UCHAR PageCode; + UCHAR IReserved; + UCHAR AllocationLength; + UCHAR Control; + } CDB6INQUIRY, *PCDB6INQUIRY; + + struct _CDB6INQUIRY3 { + UCHAR OperationCode; + UCHAR EnableVitalProductData : 1; + UCHAR CommandSupportData : 1; + UCHAR Reserved1 : 6; + UCHAR PageCode; + UCHAR Reserved2; + UCHAR AllocationLength; + UCHAR Control; + } CDB6INQUIRY3, *PCDB6INQUIRY3; + + struct _CDB6VERIFY { + UCHAR OperationCode; + UCHAR Fixed : 1; + UCHAR ByteCompare : 1; + UCHAR Immediate : 1; + UCHAR Reserved : 2; + UCHAR LogicalUnitNumber : 3; + UCHAR VerificationLength[3]; + UCHAR Control; + } CDB6VERIFY, *PCDB6VERIFY; + + struct _CDB6FORMAT { + UCHAR OperationCode; + UCHAR FormatControl : 5; + UCHAR LogicalUnitNumber : 3; + UCHAR FReserved1; + UCHAR InterleaveMsb; + UCHAR InterleaveLsb; + UCHAR FReserved2; + } CDB6FORMAT, *PCDB6FORMAT; + + struct _CDB10 { + UCHAR OperationCode; + UCHAR RelativeAddress : 1; + UCHAR Reserved1 : 2; + UCHAR ForceUnitAccess : 1; + UCHAR DisablePageOut : 1; + UCHAR LogicalUnitNumber : 3; + UCHAR LogicalBlockByte0; + UCHAR LogicalBlockByte1; + UCHAR LogicalBlockByte2; + UCHAR LogicalBlockByte3; + UCHAR Reserved2; + UCHAR TransferBlocksMsb; + UCHAR TransferBlocksLsb; + UCHAR Control; + } CDB10, *PCDB10; + + struct _CDB12 { + UCHAR OperationCode; + UCHAR RelativeAddress : 1; + UCHAR Reserved1 : 2; + UCHAR ForceUnitAccess : 1; + UCHAR DisablePageOut : 1; + UCHAR LogicalUnitNumber : 3; + UCHAR LogicalBlock[4]; + UCHAR TransferLength[4]; + UCHAR Reserved2; + UCHAR Control; + } CDB12, *PCDB12; + + struct _PAUSE_RESUME { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR LogicalUnitNumber : 3; + UCHAR Reserved2[6]; + UCHAR Action; + UCHAR Control; + } PAUSE_RESUME, *PPAUSE_RESUME; + + struct _READ_TOC { + UCHAR OperationCode; + UCHAR Reserved0 : 1; + UCHAR Msf : 1; + UCHAR Reserved1 : 3; + UCHAR LogicalUnitNumber : 3; + UCHAR Format2 : 4; + UCHAR Reserved2 : 4; + UCHAR Reserved3[3]; + UCHAR StartingTrack; + UCHAR AllocationLength[2]; + UCHAR Control : 6; + UCHAR Format : 2; + } READ_TOC, *PREAD_TOC; + + struct _READ_DISK_INFORMATION { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR Lun : 3; + UCHAR Reserved2[5]; + UCHAR AllocationLength[2]; + UCHAR Control; + } READ_DISK_INFORMATION, *PREAD_DISK_INFORMATION; + + struct _READ_TRACK_INFORMATION { + UCHAR OperationCode; + UCHAR Track : 1; + UCHAR Reserved1 : 3; + UCHAR Reserved2 : 1; + UCHAR Lun : 3; + UCHAR BlockAddress[4]; + UCHAR Reserved3; + UCHAR AllocationLength[2]; + UCHAR Control; + } READ_TRACK_INFORMATION, *PREAD_TRACK_INFORMATION; + + struct _RESERVE_TRACK_RZONE { + UCHAR OperationCode; + UCHAR Reserved1[4]; + UCHAR ReservationSize[4]; + UCHAR Control; + } RESERVE_TRACK_RZONE, *PRESERVE_TRACK_RZONE; + + struct _SEND_OPC_INFORMATION { + UCHAR OperationCode; + UCHAR DoOpc : 1; + UCHAR Reserved : 7; + UCHAR Reserved1[5]; + UCHAR ParameterListLength[2]; + UCHAR Reserved2; + } SEND_OPC_INFORMATION, *PSEND_OPC_INFORMATION; + + struct _CLOSE_TRACK { + UCHAR OperationCode; + UCHAR Immediate : 1; + UCHAR Reserved1 : 7; + UCHAR Track : 1; + UCHAR Session : 1; + UCHAR Reserved2 : 6; + UCHAR Reserved3; + UCHAR TrackNumber[2]; + UCHAR Reserved4[3]; + UCHAR Control; + } CLOSE_TRACK, *PCLOSE_TRACK; + + struct _SEND_CUE_SHEET { + UCHAR OperationCode; + UCHAR Reserved[5]; + UCHAR CueSheetSize[3]; + UCHAR Control; + } SEND_CUE_SHEET, *PSEND_CUE_SHEET; + + struct _READ_HEADER { + UCHAR OperationCode; + UCHAR Reserved1 : 1; + UCHAR Msf : 1; + UCHAR Reserved2 : 3; + UCHAR Lun : 3; + UCHAR LogicalBlockAddress[4]; + UCHAR Reserved3; + UCHAR AllocationLength[2]; + UCHAR Control; + } READ_HEADER, *PREAD_HEADER; + + struct _PLAY_AUDIO { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR LogicalUnitNumber : 3; + UCHAR StartingBlockAddress[4]; + UCHAR Reserved2; + UCHAR PlayLength[2]; + UCHAR Control; + } PLAY_AUDIO, *PPLAY_AUDIO; + + struct _PLAY_AUDIO_MSF { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR LogicalUnitNumber : 3; + UCHAR Reserved2; + UCHAR StartingM; + UCHAR StartingS; + UCHAR StartingF; + UCHAR EndingM; + UCHAR EndingS; + UCHAR EndingF; + UCHAR Control; + } PLAY_AUDIO_MSF, *PPLAY_AUDIO_MSF; + +/* FIXME: Should the union be anonymous in C++ too? If so, + can't define named types _LBA and _MSF within anonymous union + for C++. */ + struct _PLAY_CD { + UCHAR OperationCode; + UCHAR Reserved1 : 1; + UCHAR CMSF : 1; + UCHAR ExpectedSectorType : 3; + UCHAR Lun : 3; +#ifndef __cplusplus + _ANONYMOUS_UNION +#endif + union { + struct _LBA { + UCHAR StartingBlockAddress[4]; + UCHAR PlayLength[4]; + } LBA; + + struct _MSF { + UCHAR Reserved1; + UCHAR StartingM; + UCHAR StartingS; + UCHAR StartingF; + UCHAR EndingM; + UCHAR EndingS; + UCHAR EndingF; + UCHAR Reserved2; + } MSF; + #ifndef __cplusplus + }DUMMYUNIONNAME; + #else + }u; + #endif + + UCHAR Audio : 1; + UCHAR Composite : 1; + UCHAR Port1 : 1; + UCHAR Port2 : 1; + UCHAR Reserved2 : 3; + UCHAR Speed : 1; + UCHAR Control; + } PLAY_CD, *PPLAY_CD; + + struct _SCAN_CD { + UCHAR OperationCode; + UCHAR RelativeAddress : 1; + UCHAR Reserved1 : 3; + UCHAR Direct : 1; + UCHAR Lun : 3; + UCHAR StartingAddress[4]; + UCHAR Reserved2[3]; + UCHAR Reserved3 : 6; + UCHAR Type : 2; + UCHAR Reserved4; + UCHAR Control; + } SCAN_CD, *PSCAN_CD; + + struct _STOP_PLAY_SCAN { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR Lun : 3; + UCHAR Reserved2[7]; + UCHAR Control; + } STOP_PLAY_SCAN, *PSTOP_PLAY_SCAN; + + struct _SUBCHANNEL { + UCHAR OperationCode; + UCHAR Reserved0 : 1; + UCHAR Msf : 1; + UCHAR Reserved1 : 3; + UCHAR LogicalUnitNumber : 3; + UCHAR Reserved2 : 6; + UCHAR SubQ : 1; + UCHAR Reserved3 : 1; + UCHAR Format; + UCHAR Reserved4[2]; + UCHAR TrackNumber; + UCHAR AllocationLength[2]; + UCHAR Control; + } SUBCHANNEL, *PSUBCHANNEL; + + struct _READ_CD { + UCHAR OperationCode; + UCHAR RelativeAddress : 1; + UCHAR Reserved0 : 1; + UCHAR ExpectedSectorType : 3; + UCHAR Lun : 3; + UCHAR StartingLBA[4]; + UCHAR TransferBlocks[3]; + UCHAR Reserved2 : 1; + UCHAR ErrorFlags : 2; + UCHAR IncludeEDC : 1; + UCHAR IncludeUserData : 1; + UCHAR HeaderCode : 2; + UCHAR IncludeSyncData : 1; + UCHAR SubChannelSelection : 3; + UCHAR Reserved3 : 5; + UCHAR Control; + } READ_CD, *PREAD_CD; + + struct _READ_CD_MSF { + UCHAR OperationCode; + UCHAR RelativeAddress : 1; + UCHAR Reserved1 : 1; + UCHAR ExpectedSectorType : 3; + UCHAR Lun : 3; + UCHAR Reserved2; + UCHAR StartingM; + UCHAR StartingS; + UCHAR StartingF; + UCHAR EndingM; + UCHAR EndingS; + UCHAR EndingF; + UCHAR Reserved3; + UCHAR Reserved4 : 1; + UCHAR ErrorFlags : 2; + UCHAR IncludeEDC : 1; + UCHAR IncludeUserData : 1; + UCHAR HeaderCode : 2; + UCHAR IncludeSyncData : 1; + UCHAR SubChannelSelection : 3; + UCHAR Reserved5 : 5; + UCHAR Control; + } READ_CD_MSF, *PREAD_CD_MSF; + + struct _PLXTR_READ_CDDA { + UCHAR OperationCode; + UCHAR Reserved0 : 5; + UCHAR LogicalUnitNumber : 3; + UCHAR LogicalBlockByte0; + UCHAR LogicalBlockByte1; + UCHAR LogicalBlockByte2; + UCHAR LogicalBlockByte3; + UCHAR TransferBlockByte0; + UCHAR TransferBlockByte1; + UCHAR TransferBlockByte2; + UCHAR TransferBlockByte3; + UCHAR SubCode; + UCHAR Control; + } PLXTR_READ_CDDA, *PPLXTR_READ_CDDA; + + struct _NEC_READ_CDDA { + UCHAR OperationCode; + UCHAR Reserved0; + UCHAR LogicalBlockByte0; + UCHAR LogicalBlockByte1; + UCHAR LogicalBlockByte2; + UCHAR LogicalBlockByte3; + UCHAR Reserved1; + UCHAR TransferBlockByte0; + UCHAR TransferBlockByte1; + UCHAR Control; + } NEC_READ_CDDA, *PNEC_READ_CDDA; + + struct _MODE_SENSE { + UCHAR OperationCode; + UCHAR Reserved1 : 3; + UCHAR Dbd : 1; + UCHAR Reserved2 : 1; + UCHAR LogicalUnitNumber : 3; + UCHAR PageCode : 6; + UCHAR Pc : 2; + UCHAR Reserved3; + UCHAR AllocationLength; + UCHAR Control; + } MODE_SENSE, *PMODE_SENSE; + + struct _MODE_SENSE10 { + UCHAR OperationCode; + UCHAR Reserved1 : 3; + UCHAR Dbd : 1; + UCHAR Reserved2 : 1; + UCHAR LogicalUnitNumber : 3; + UCHAR PageCode : 6; + UCHAR Pc : 2; + UCHAR Reserved3[4]; + UCHAR AllocationLength[2]; + UCHAR Control; + } MODE_SENSE10, *PMODE_SENSE10; + + struct _MODE_SELECT { + UCHAR OperationCode; + UCHAR SPBit : 1; + UCHAR Reserved1 : 3; + UCHAR PFBit : 1; + UCHAR LogicalUnitNumber : 3; + UCHAR Reserved2[2]; + UCHAR ParameterListLength; + UCHAR Control; + } MODE_SELECT, *PMODE_SELECT; + + struct _MODE_SELECT10 { + UCHAR OperationCode; + UCHAR SPBit : 1; + UCHAR Reserved1 : 3; + UCHAR PFBit : 1; + UCHAR LogicalUnitNumber : 3; + UCHAR Reserved2[5]; + UCHAR ParameterListLength[2]; + UCHAR Control; + } MODE_SELECT10, *PMODE_SELECT10; + + struct _LOCATE { + UCHAR OperationCode; + UCHAR Immediate : 1; + UCHAR CPBit : 1; + UCHAR BTBit : 1; + UCHAR Reserved1 : 2; + UCHAR LogicalUnitNumber : 3; + UCHAR Reserved3; + UCHAR LogicalBlockAddress[4]; + UCHAR Reserved4; + UCHAR Partition; + UCHAR Control; + } LOCATE, *PLOCATE; + + struct _LOGSENSE { + UCHAR OperationCode; + UCHAR SPBit : 1; + UCHAR PPCBit : 1; + UCHAR Reserved1 : 3; + UCHAR LogicalUnitNumber : 3; + UCHAR PageCode : 6; + UCHAR PCBit : 2; + UCHAR Reserved2; + UCHAR Reserved3; + UCHAR ParameterPointer[2]; + UCHAR AllocationLength[2]; + UCHAR Control; + } LOGSENSE, *PLOGSENSE; + + struct _LOGSELECT { + UCHAR OperationCode; + UCHAR SPBit : 1; + UCHAR PCRBit : 1; + UCHAR Reserved1 : 3; + UCHAR LogicalUnitNumber : 3; + UCHAR Reserved : 6; + UCHAR PCBit : 2; + UCHAR Reserved2[4]; + UCHAR ParameterListLength[2]; + UCHAR Control; + } LOGSELECT, *PLOGSELECT; + + struct _PRINT { + UCHAR OperationCode; + UCHAR Reserved : 5; + UCHAR LogicalUnitNumber : 3; + UCHAR TransferLength[3]; + UCHAR Control; + } PRINT, *PPRINT; + + struct _SEEK { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR LogicalUnitNumber : 3; + UCHAR LogicalBlockAddress[4]; + UCHAR Reserved2[3]; + UCHAR Control; + } SEEK, *PSEEK; + + struct _ERASE { + UCHAR OperationCode; + UCHAR Long : 1; + UCHAR Immediate : 1; + UCHAR Reserved1 : 3; + UCHAR LogicalUnitNumber : 3; + UCHAR Reserved2[3]; + UCHAR Control; + } ERASE, *PERASE; + + struct _START_STOP { + UCHAR OperationCode; + UCHAR Immediate: 1; + UCHAR Reserved1 : 4; + UCHAR LogicalUnitNumber : 3; + UCHAR Reserved2[2]; + UCHAR Start : 1; + UCHAR LoadEject : 1; + UCHAR Reserved3 : 6; + UCHAR Control; + } START_STOP, *PSTART_STOP; + + struct _MEDIA_REMOVAL { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR LogicalUnitNumber : 3; + UCHAR Reserved2[2]; + + UCHAR Prevent : 1; + UCHAR Persistant : 1; + UCHAR Reserved3 : 6; + + UCHAR Control; + } MEDIA_REMOVAL, *PMEDIA_REMOVAL; + + struct _SEEK_BLOCK { + UCHAR OperationCode; + UCHAR Immediate : 1; + UCHAR Reserved1 : 7; + UCHAR BlockAddress[3]; + UCHAR Link : 1; + UCHAR Flag : 1; + UCHAR Reserved2 : 4; + UCHAR VendorUnique : 2; + } SEEK_BLOCK, *PSEEK_BLOCK; + + struct _REQUEST_BLOCK_ADDRESS { + UCHAR OperationCode; + UCHAR Reserved1[3]; + UCHAR AllocationLength; + UCHAR Link : 1; + UCHAR Flag : 1; + UCHAR Reserved2 : 4; + UCHAR VendorUnique : 2; + } REQUEST_BLOCK_ADDRESS, *PREQUEST_BLOCK_ADDRESS; + + struct _PARTITION { + UCHAR OperationCode; + UCHAR Immediate : 1; + UCHAR Sel: 1; + UCHAR PartitionSelect : 6; + UCHAR Reserved1[3]; + UCHAR Control; + } PARTITION, *PPARTITION; + + struct _WRITE_TAPE_MARKS { + UCHAR OperationCode; + UCHAR Immediate : 1; + UCHAR WriteSetMarks: 1; + UCHAR Reserved : 3; + UCHAR LogicalUnitNumber : 3; + UCHAR TransferLength[3]; + UCHAR Control; + } WRITE_TAPE_MARKS, *PWRITE_TAPE_MARKS; + + struct _SPACE_TAPE_MARKS { + UCHAR OperationCode; + UCHAR Code : 3; + UCHAR Reserved : 2; + UCHAR LogicalUnitNumber : 3; + UCHAR NumMarksMSB ; + UCHAR NumMarks; + UCHAR NumMarksLSB; + union { + UCHAR value; + struct { + UCHAR Link : 1; + UCHAR Flag : 1; + UCHAR Reserved : 4; + UCHAR VendorUnique : 2; + } Fields; + } Byte6; + } SPACE_TAPE_MARKS, *PSPACE_TAPE_MARKS; + + struct _READ_POSITION { + UCHAR Operation; + UCHAR BlockType : 1; + UCHAR Reserved1 : 4; + UCHAR Lun : 3; + UCHAR Reserved2[7]; + UCHAR Control; + } READ_POSITION, *PREAD_POSITION; + + struct _CDB6READWRITETAPE { + UCHAR OperationCode; + UCHAR VendorSpecific : 5; + UCHAR Reserved : 3; + UCHAR TransferLenMSB; + UCHAR TransferLen; + UCHAR TransferLenLSB; + UCHAR Link : 1; + UCHAR Flag : 1; + UCHAR Reserved1 : 4; + UCHAR VendorUnique : 2; + } CDB6READWRITETAPE, *PCDB6READWRITETAPE; + + struct _INIT_ELEMENT_STATUS { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR LogicalUnitNubmer : 3; + UCHAR Reserved2[3]; + UCHAR Reserved3 : 7; + UCHAR NoBarCode : 1; + } INIT_ELEMENT_STATUS, *PINIT_ELEMENT_STATUS; + + struct _INITIALIZE_ELEMENT_RANGE { + UCHAR OperationCode; + UCHAR Range : 1; + UCHAR Reserved1 : 4; + UCHAR LogicalUnitNubmer : 3; + UCHAR FirstElementAddress[2]; + UCHAR Reserved2[2]; + UCHAR NumberOfElements[2]; + UCHAR Reserved3; + UCHAR Reserved4 : 7; + UCHAR NoBarCode : 1; + } INITIALIZE_ELEMENT_RANGE, *PINITIALIZE_ELEMENT_RANGE; + + struct _POSITION_TO_ELEMENT { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR LogicalUnitNumber : 3; + UCHAR TransportElementAddress[2]; + UCHAR DestinationElementAddress[2]; + UCHAR Reserved2[2]; + UCHAR Flip : 1; + UCHAR Reserved3 : 7; + UCHAR Control; + } POSITION_TO_ELEMENT, *PPOSITION_TO_ELEMENT; + + struct _MOVE_MEDIUM { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR LogicalUnitNumber : 3; + UCHAR TransportElementAddress[2]; + UCHAR SourceElementAddress[2]; + UCHAR DestinationElementAddress[2]; + UCHAR Reserved2[2]; + UCHAR Flip : 1; + UCHAR Reserved3 : 7; + UCHAR Control; + } MOVE_MEDIUM, *PMOVE_MEDIUM; + + struct _EXCHANGE_MEDIUM { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR LogicalUnitNumber : 3; + UCHAR TransportElementAddress[2]; + UCHAR SourceElementAddress[2]; + UCHAR Destination1ElementAddress[2]; + UCHAR Destination2ElementAddress[2]; + UCHAR Flip1 : 1; + UCHAR Flip2 : 1; + UCHAR Reserved3 : 6; + UCHAR Control; + } EXCHANGE_MEDIUM, *PEXCHANGE_MEDIUM; + + struct _READ_ELEMENT_STATUS { + UCHAR OperationCode; + UCHAR ElementType : 4; + UCHAR VolTag : 1; + UCHAR LogicalUnitNumber : 3; + UCHAR StartingElementAddress[2]; + UCHAR NumberOfElements[2]; + UCHAR Reserved1; + UCHAR AllocationLength[3]; + UCHAR Reserved2; + UCHAR Control; + } READ_ELEMENT_STATUS, *PREAD_ELEMENT_STATUS; + + struct _SEND_VOLUME_TAG { + UCHAR OperationCode; + UCHAR ElementType : 4; + UCHAR Reserved1 : 1; + UCHAR LogicalUnitNumber : 3; + UCHAR StartingElementAddress[2]; + UCHAR Reserved2; + UCHAR ActionCode : 5; + UCHAR Reserved3 : 3; + UCHAR Reserved4[2]; + UCHAR ParameterListLength[2]; + UCHAR Reserved5; + UCHAR Control; + } SEND_VOLUME_TAG, *PSEND_VOLUME_TAG; + + struct _REQUEST_VOLUME_ELEMENT_ADDRESS { + UCHAR OperationCode; + UCHAR ElementType : 4; + UCHAR VolTag : 1; + UCHAR LogicalUnitNumber : 3; + UCHAR StartingElementAddress[2]; + UCHAR NumberElements[2]; + UCHAR Reserved1; + UCHAR AllocationLength[3]; + UCHAR Reserved2; + UCHAR Control; + } REQUEST_VOLUME_ELEMENT_ADDRESS, *PREQUEST_VOLUME_ELEMENT_ADDRESS; + + struct _LOAD_UNLOAD { + UCHAR OperationCode; + UCHAR Immediate : 1; + UCHAR Reserved1 : 4; + UCHAR Lun : 3; + UCHAR Reserved2[2]; + UCHAR Start : 1; + UCHAR LoadEject : 1; + UCHAR Reserved3: 6; + UCHAR Reserved4[3]; + UCHAR Slot; + UCHAR Reserved5[3]; + } LOAD_UNLOAD, *PLOAD_UNLOAD; + + struct _MECH_STATUS { + UCHAR OperationCode; + UCHAR Reserved : 5; + UCHAR Lun : 3; + UCHAR Reserved1[6]; + UCHAR AllocationLength[2]; + UCHAR Reserved2[1]; + UCHAR Control; + } MECH_STATUS, *PMECH_STATUS; + + struct _SYNCHRONIZE_CACHE10 { + + UCHAR OperationCode; + + UCHAR RelAddr : 1; + UCHAR Immediate : 1; + UCHAR Reserved : 3; + UCHAR Lun : 3; + + UCHAR LogicalBlockAddress[4]; + UCHAR Reserved2; + UCHAR BlockCount[2]; + UCHAR Control; + } SYNCHRONIZE_CACHE10, *PSYNCHRONIZE_CACHE10; + + struct _GET_EVENT_STATUS_NOTIFICATION { + UCHAR OperationCode; + + UCHAR Immediate : 1; + UCHAR Reserved : 4; + UCHAR Lun : 3; + + UCHAR Reserved2[2]; + UCHAR NotificationClassRequest; + UCHAR Reserved3[2]; + UCHAR EventListLength[2]; + + UCHAR Control; + } GET_EVENT_STATUS_NOTIFICATION, *PGET_EVENT_STATUS_NOTIFICATION; + + struct _READ_DVD_STRUCTURE { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR Lun : 3; + UCHAR RMDBlockNumber[4]; + UCHAR LayerNumber; + UCHAR Format; + UCHAR AllocationLength[2]; + UCHAR Reserved3 : 6; + UCHAR AGID : 2; + UCHAR Control; + } READ_DVD_STRUCTURE, *PREAD_DVD_STRUCTURE; + + struct _SEND_DVD_STRUCTURE { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR Lun : 3; + UCHAR Reserved2[5]; + UCHAR Format; + UCHAR ParameterListLength[2]; + UCHAR Reserved3; + UCHAR Control; + } SEND_DVD_STRUCTURE, *PSEND_DVD_STRUCTURE; + + struct _SEND_KEY { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR Lun : 3; + UCHAR Reserved2[6]; + UCHAR ParameterListLength[2]; + UCHAR KeyFormat : 6; + UCHAR AGID : 2; + UCHAR Control; + } SEND_KEY, *PSEND_KEY; + + struct _REPORT_KEY { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR Lun : 3; + UCHAR LogicalBlockAddress[4]; + UCHAR Reserved2[2]; + UCHAR AllocationLength[2]; + UCHAR KeyFormat : 6; + UCHAR AGID : 2; + UCHAR Control; + } REPORT_KEY, *PREPORT_KEY; + + struct _SET_READ_AHEAD { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR Lun : 3; + UCHAR TriggerLBA[4]; + UCHAR ReadAheadLBA[4]; + UCHAR Reserved2; + UCHAR Control; + } SET_READ_AHEAD, *PSET_READ_AHEAD; + + struct _READ_FORMATTED_CAPACITIES { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR Lun : 3; + UCHAR Reserved2[5]; + UCHAR AllocationLength[2]; + UCHAR Control; + } READ_FORMATTED_CAPACITIES, *PREAD_FORMATTED_CAPACITIES; + + struct _REPORT_LUNS { + UCHAR OperationCode; + UCHAR Reserved1[5]; + UCHAR AllocationLength[4]; + UCHAR Reserved2[1]; + UCHAR Control; + } REPORT_LUNS, *PREPORT_LUNS; + + struct _PERSISTENT_RESERVE_IN { + UCHAR OperationCode; + UCHAR ServiceAction : 5; + UCHAR Reserved1 : 3; + UCHAR Reserved2[5]; + UCHAR AllocationLength[2]; + UCHAR Control; + } PERSISTENT_RESERVE_IN, *PPERSISTENT_RESERVE_IN; + + struct _PERSISTENT_RESERVE_OUT { + UCHAR OperationCode; + UCHAR ServiceAction : 5; + UCHAR Reserved1 : 3; + UCHAR Type : 4; + UCHAR Scope : 4; + UCHAR Reserved2[4]; + UCHAR ParameterListLength[2]; + UCHAR Control; + } PERSISTENT_RESERVE_OUT, *PPERSISTENT_RESERVE_OUT; + + struct _GET_CONFIGURATION { + UCHAR OperationCode; + UCHAR RequestType : 1; + UCHAR Reserved1 : 7; + UCHAR StartingFeature[2]; + UCHAR Reserved2[3]; + UCHAR AllocationLength[2]; + UCHAR Control; + } GET_CONFIGURATION, *PGET_CONFIGURATION; + + struct _SET_CD_SPEED { + UCHAR OperationCode; + UCHAR Reserved1; + UCHAR ReadSpeed[2]; + UCHAR WriteSpeed[2]; + UCHAR Reserved2[5]; + UCHAR Control; + } SET_CD_SPEED, *PSET_CD_SPEED; + + ULONG AsUlong[4]; + UCHAR AsByte[16]; +} CDB, *PCDB; + +#ifndef _INQUIRYDATA_DEFINED /* also in minitape.h */ +#define _INQUIRYDATA_DEFINED + +#define INQUIRYDATABUFFERSIZE 36 + +typedef struct _INQUIRYDATA { + UCHAR DeviceType : 5; + UCHAR DeviceTypeQualifier : 3; + UCHAR DeviceTypeModifier : 7; + UCHAR RemovableMedia : 1; + _ANONYMOUS_UNION union { + UCHAR Versions; + _ANONYMOUS_STRUCT struct { + UCHAR ANSIVersion : 3; + UCHAR ECMAVersion : 3; + UCHAR ISOVersion : 2; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; + UCHAR ResponseDataFormat : 4; + UCHAR HiSupport : 1; + UCHAR NormACA : 1; + UCHAR TerminateTask : 1; + UCHAR AERC : 1; + UCHAR AdditionalLength; + UCHAR Reserved; + UCHAR Addr16 : 1; + UCHAR Addr32 : 1; + UCHAR AckReqQ: 1; + UCHAR MediumChanger : 1; + UCHAR MultiPort : 1; + UCHAR ReservedBit2 : 1; + UCHAR EnclosureServices : 1; + UCHAR ReservedBit3 : 1; + UCHAR SoftReset : 1; + UCHAR CommandQueue : 1; + UCHAR TransferDisable : 1; + UCHAR LinkedCommands : 1; + UCHAR Synchronous : 1; + UCHAR Wide16Bit : 1; + UCHAR Wide32Bit : 1; + UCHAR RelativeAddressing : 1; + UCHAR VendorId[8]; + UCHAR ProductId[16]; + UCHAR ProductRevisionLevel[4]; + UCHAR VendorSpecific[20]; + UCHAR Reserved3[40]; +} INQUIRYDATA, *PINQUIRYDATA; +#endif + +/* INQUIRYDATA.DeviceType constants */ +#define DIRECT_ACCESS_DEVICE 0x00 +#define SEQUENTIAL_ACCESS_DEVICE 0x01 +#define PRINTER_DEVICE 0x02 +#define PROCESSOR_DEVICE 0x03 +#define WRITE_ONCE_READ_MULTIPLE_DEVICE 0x04 +#define READ_ONLY_DIRECT_ACCESS_DEVICE 0x05 +#define SCANNER_DEVICE 0x06 +#define OPTICAL_DEVICE 0x07 +#define MEDIUM_CHANGER 0x08 +#define COMMUNICATION_DEVICE 0x09 +#define LOGICAL_UNIT_NOT_PRESENT_DEVICE 0x7F +#define DEVICE_QUALIFIER_NOT_SUPPORTED 0x03 + +/* INQUIRYDATA.DeviceTypeQualifier constants */ +#define DEVICE_CONNECTED 0x00 + +#define SCSISTAT_GOOD 0x00 +#define SCSISTAT_CHECK_CONDITION 0x02 +#define SCSISTAT_CONDITION_MET 0x04 +#define SCSISTAT_BUSY 0x08 +#define SCSISTAT_INTERMEDIATE 0x10 +#define SCSISTAT_INTERMEDIATE_COND_MET 0x14 +#define SCSISTAT_RESERVATION_CONFLICT 0x18 +#define SCSISTAT_COMMAND_TERMINATED 0x22 +#define SCSISTAT_QUEUE_FULL 0x28 + +/* Mode Sense/Select page constants */ +#define MODE_PAGE_ERROR_RECOVERY 0x01 +#define MODE_PAGE_DISCONNECT 0x02 +#define MODE_PAGE_FORMAT_DEVICE 0x03 +#define MODE_PAGE_RIGID_GEOMETRY 0x04 +#define MODE_PAGE_FLEXIBILE 0x05 +#define MODE_PAGE_WRITE_PARAMETERS 0x05 +#define MODE_PAGE_VERIFY_ERROR 0x07 +#define MODE_PAGE_CACHING 0x08 +#define MODE_PAGE_PERIPHERAL 0x09 +#define MODE_PAGE_CONTROL 0x0A +#define MODE_PAGE_MEDIUM_TYPES 0x0B +#define MODE_PAGE_NOTCH_PARTITION 0x0C +#define MODE_PAGE_CD_AUDIO_CONTROL 0x0E +#define MODE_PAGE_DATA_COMPRESS 0x0F +#define MODE_PAGE_DEVICE_CONFIG 0x10 +#define MODE_PAGE_MEDIUM_PARTITION 0x11 +#define MODE_PAGE_CDVD_FEATURE_SET 0x18 +#define MODE_PAGE_POWER_CONDITION 0x1A +#define MODE_PAGE_FAULT_REPORTING 0x1C +#define MODE_PAGE_CDVD_INACTIVITY 0x1D +#define MODE_PAGE_ELEMENT_ADDRESS 0x1D +#define MODE_PAGE_TRANSPORT_GEOMETRY 0x1E +#define MODE_PAGE_DEVICE_CAPABILITIES 0x1F +#define MODE_PAGE_CAPABILITIES 0x2A +#define MODE_SENSE_RETURN_ALL 0x3f +#define MODE_SENSE_CURRENT_VALUES 0x00 +#define MODE_SENSE_CHANGEABLE_VALUES 0x40 +#define MODE_SENSE_DEFAULT_VAULES 0x80 +#define MODE_SENSE_SAVED_VALUES 0xc0 + +/* SCSI CDB operation codes */ +#define SCSIOP_TEST_UNIT_READY 0x00 +#define SCSIOP_REZERO_UNIT 0x01 +#define SCSIOP_REWIND 0x01 +#define SCSIOP_REQUEST_BLOCK_ADDR 0x02 +#define SCSIOP_REQUEST_SENSE 0x03 +#define SCSIOP_FORMAT_UNIT 0x04 +#define SCSIOP_READ_BLOCK_LIMITS 0x05 +#define SCSIOP_REASSIGN_BLOCKS 0x07 +#define SCSIOP_INIT_ELEMENT_STATUS 0x07 +#define SCSIOP_READ6 0x08 +#define SCSIOP_RECEIVE 0x08 +#define SCSIOP_WRITE6 0x0A +#define SCSIOP_PRINT 0x0A +#define SCSIOP_SEND 0x0A +#define SCSIOP_SEEK6 0x0B +#define SCSIOP_TRACK_SELECT 0x0B +#define SCSIOP_SLEW_PRINT 0x0B +#define SCSIOP_SEEK_BLOCK 0x0C +#define SCSIOP_PARTITION 0x0D +#define SCSIOP_READ_REVERSE 0x0F +#define SCSIOP_WRITE_FILEMARKS 0x10 +#define SCSIOP_FLUSH_BUFFER 0x10 +#define SCSIOP_SPACE 0x11 +#define SCSIOP_INQUIRY 0x12 +#define SCSIOP_VERIFY6 0x13 +#define SCSIOP_RECOVER_BUF_DATA 0x14 +#define SCSIOP_MODE_SELECT 0x15 +#define SCSIOP_RESERVE_UNIT 0x16 +#define SCSIOP_RELEASE_UNIT 0x17 +#define SCSIOP_COPY 0x18 +#define SCSIOP_ERASE 0x19 +#define SCSIOP_MODE_SENSE 0x1A +#define SCSIOP_START_STOP_UNIT 0x1B +#define SCSIOP_STOP_PRINT 0x1B +#define SCSIOP_LOAD_UNLOAD 0x1B +#define SCSIOP_RECEIVE_DIAGNOSTIC 0x1C +#define SCSIOP_SEND_DIAGNOSTIC 0x1D +#define SCSIOP_MEDIUM_REMOVAL 0x1E + +#define SCSIOP_READ_FORMATTED_CAPACITY 0x23 +#define SCSIOP_READ_CAPACITY 0x25 +#define SCSIOP_READ 0x28 +#define SCSIOP_WRITE 0x2A +#define SCSIOP_SEEK 0x2B +#define SCSIOP_LOCATE 0x2B +#define SCSIOP_POSITION_TO_ELEMENT 0x2B +#define SCSIOP_WRITE_VERIFY 0x2E +#define SCSIOP_VERIFY 0x2F +#define SCSIOP_SEARCH_DATA_HIGH 0x30 +#define SCSIOP_SEARCH_DATA_EQUAL 0x31 +#define SCSIOP_SEARCH_DATA_LOW 0x32 +#define SCSIOP_SET_LIMITS 0x33 +#define SCSIOP_READ_POSITION 0x34 +#define SCSIOP_SYNCHRONIZE_CACHE 0x35 +#define SCSIOP_COMPARE 0x39 +#define SCSIOP_COPY_COMPARE 0x3A +#define SCSIOP_WRITE_DATA_BUFF 0x3B +#define SCSIOP_READ_DATA_BUFF 0x3C +#define SCSIOP_CHANGE_DEFINITION 0x40 +#define SCSIOP_READ_SUB_CHANNEL 0x42 +#define SCSIOP_READ_TOC 0x43 +#define SCSIOP_READ_HEADER 0x44 +#define SCSIOP_PLAY_AUDIO 0x45 +#define SCSIOP_GET_CONFIGURATION 0x46 +#define SCSIOP_PLAY_AUDIO_MSF 0x47 +#define SCSIOP_PLAY_TRACK_INDEX 0x48 +#define SCSIOP_PLAY_TRACK_RELATIVE 0x49 +#define SCSIOP_GET_EVENT_STATUS 0x4A +#define SCSIOP_PAUSE_RESUME 0x4B +#define SCSIOP_LOG_SELECT 0x4C +#define SCSIOP_LOG_SENSE 0x4D +#define SCSIOP_STOP_PLAY_SCAN 0x4E +#define SCSIOP_READ_DISK_INFORMATION 0x51 +#define SCSIOP_READ_TRACK_INFORMATION 0x52 +#define SCSIOP_RESERVE_TRACK_RZONE 0x53 +#define SCSIOP_SEND_OPC_INFORMATION 0x54 +#define SCSIOP_MODE_SELECT10 0x55 +#define SCSIOP_MODE_SENSE10 0x5A +#define SCSIOP_CLOSE_TRACK_SESSION 0x5B +#define SCSIOP_READ_BUFFER_CAPACITY 0x5C +#define SCSIOP_SEND_CUE_SHEET 0x5D +#define SCSIOP_PERSISTENT_RESERVE_IN 0x5E +#define SCSIOP_PERSISTENT_RESERVE_OUT 0x5F + +#define SCSIOP_REPORT_LUNS 0xA0 +#define SCSIOP_BLANK 0xA1 +#define SCSIOP_SEND_KEY 0xA3 +#define SCSIOP_REPORT_KEY 0xA4 +#define SCSIOP_MOVE_MEDIUM 0xA5 +#define SCSIOP_LOAD_UNLOAD_SLOT 0xA6 +#define SCSIOP_EXCHANGE_MEDIUM 0xA6 +#define SCSIOP_SET_READ_AHEAD 0xA7 +#define SCSIOP_READ_DVD_STRUCTURE 0xAD +#define SCSIOP_REQUEST_VOL_ELEMENT 0xB5 +#define SCSIOP_SEND_VOLUME_TAG 0xB6 +#define SCSIOP_READ_ELEMENT_STATUS 0xB8 +#define SCSIOP_READ_CD_MSF 0xB9 +#define SCSIOP_SCAN_CD 0xBA +#define SCSIOP_SET_CD_SPEED 0xBB +#define SCSIOP_PLAY_CD 0xBC +#define SCSIOP_MECHANISM_STATUS 0xBD +#define SCSIOP_READ_CD 0xBE +#define SCSIOP_SEND_DVD_STRUCTURE 0xBF +#define SCSIOP_INIT_ELEMENT_RANGE 0xE7 + +#define SCSIOP_DENON_EJECT_DISC 0xE6 +#define SCSIOP_DENON_STOP_AUDIO 0xE7 +#define SCSIOP_DENON_PLAY_AUDIO 0xE8 +#define SCSIOP_DENON_READ_TOC 0xE9 +#define SCSIOP_DENON_READ_SUBCODE 0xEB + +#define SCSIMESS_MODIFY_DATA_POINTER 0x00 +#define SCSIMESS_SYNCHRONOUS_DATA_REQ 0x01 +#define SCSIMESS_WIDE_DATA_REQUEST 0x03 + +#define SCSIMESS_MODIFY_DATA_LENGTH 5 +#define SCSIMESS_SYNCH_DATA_LENGTH 3 +#define SCSIMESS_WIDE_DATA_LENGTH 2 + +#define SCSIMESS_ABORT 0x06 +#define SCSIMESS_ABORT_WITH_TAG 0x0D +#define SCSIMESS_BUS_DEVICE_RESET 0x0C +#define SCSIMESS_CLEAR_QUEUE 0x0E +#define SCSIMESS_COMMAND_COMPLETE 0x00 +#define SCSIMESS_DISCONNECT 0x04 +#define SCSIMESS_EXTENDED_MESSAGE 0x01 +#define SCSIMESS_IDENTIFY 0x80 +#define SCSIMESS_IDENTIFY_WITH_DISCON 0xC0 +#define SCSIMESS_IGNORE_WIDE_RESIDUE 0x23 +#define SCSIMESS_INITIATE_RECOVERY 0x0F +#define SCSIMESS_INIT_DETECTED_ERROR 0x05 +#define SCSIMESS_LINK_CMD_COMP 0x0A +#define SCSIMESS_LINK_CMD_COMP_W_FLAG 0x0B +#define SCSIMESS_MESS_PARITY_ERROR 0x09 +#define SCSIMESS_MESSAGE_REJECT 0x07 +#define SCSIMESS_NO_OPERATION 0x08 +#define SCSIMESS_HEAD_OF_QUEUE_TAG 0x21 +#define SCSIMESS_ORDERED_QUEUE_TAG 0x22 +#define SCSIMESS_SIMPLE_QUEUE_TAG 0x20 +#define SCSIMESS_RELEASE_RECOVERY 0x10 +#define SCSIMESS_RESTORE_POINTERS 0x03 +#define SCSIMESS_SAVE_DATA_POINTER 0x02 +#define SCSIMESS_TERMINATE_IO_PROCESS 0x11 + +#define CDB_FORCE_MEDIA_ACCESS 0x08 + +#define CDB_RETURN_ON_COMPLETION 0 +#define CDB_RETURN_IMMEDIATE 1 + +#define CDB_INQUIRY_EVPD 0x01 + +#define LUN0_FORMAT_SAVING_DEFECT_LIST 0 +#define USE_DEFAULTMSB 0 +#define USE_DEFAULTLSB 0 + +#define START_UNIT_CODE 0x01 +#define STOP_UNIT_CODE 0x00 + +typedef struct _SENSE_DATA { + UCHAR ErrorCode : 7; + UCHAR Valid : 1; + UCHAR SegmentNumber; + UCHAR SenseKey : 4; + UCHAR Reserved : 1; + UCHAR IncorrectLength : 1; + UCHAR EndOfMedia : 1; + UCHAR FileMark : 1; + UCHAR Information[4]; + UCHAR AdditionalSenseLength; + UCHAR CommandSpecificInformation[4]; + UCHAR AdditionalSenseCode; + UCHAR AdditionalSenseCodeQualifier; + UCHAR FieldReplaceableUnitCode; + UCHAR SenseKeySpecific[3]; +} SENSE_DATA, *PSENSE_DATA; + +#define SENSE_BUFFER_SIZE 18 + +/* Sense codes */ +#define SCSI_SENSE_NO_SENSE 0x00 +#define SCSI_SENSE_RECOVERED_ERROR 0x01 +#define SCSI_SENSE_NOT_READY 0x02 +#define SCSI_SENSE_MEDIUM_ERROR 0x03 +#define SCSI_SENSE_HARDWARE_ERROR 0x04 +#define SCSI_SENSE_ILLEGAL_REQUEST 0x05 +#define SCSI_SENSE_UNIT_ATTENTION 0x06 +#define SCSI_SENSE_DATA_PROTECT 0x07 +#define SCSI_SENSE_BLANK_CHECK 0x08 +#define SCSI_SENSE_UNIQUE 0x09 +#define SCSI_SENSE_COPY_ABORTED 0x0A +#define SCSI_SENSE_ABORTED_COMMAND 0x0B +#define SCSI_SENSE_EQUAL 0x0C +#define SCSI_SENSE_VOL_OVERFLOW 0x0D +#define SCSI_SENSE_MISCOMPARE 0x0E +#define SCSI_SENSE_RESERVED 0x0F + +/* Additional tape bit */ +#define SCSI_ILLEGAL_LENGTH 0x20 +#define SCSI_EOM 0x40 +#define SCSI_FILE_MARK 0x80 + +/* Additional Sense codes */ +#define SCSI_ADSENSE_NO_SENSE 0x00 +#define SCSI_ADSENSE_NO_SEEK_COMPLETE 0x02 +#define SCSI_ADSENSE_LUN_NOT_READY 0x04 +#define SCSI_ADSENSE_WRITE_ERROR 0x0C +#define SCSI_ADSENSE_TRACK_ERROR 0x14 +#define SCSI_ADSENSE_SEEK_ERROR 0x15 +#define SCSI_ADSENSE_REC_DATA_NOECC 0x17 +#define SCSI_ADSENSE_REC_DATA_ECC 0x18 +#define SCSI_ADSENSE_ILLEGAL_COMMAND 0x20 +#define SCSI_ADSENSE_ILLEGAL_BLOCK 0x21 +#define SCSI_ADSENSE_INVALID_CDB 0x24 +#define SCSI_ADSENSE_INVALID_LUN 0x25 +#define SCSI_ADSENSE_WRITE_PROTECT 0x27 +#define SCSI_ADSENSE_MEDIUM_CHANGED 0x28 +#define SCSI_ADSENSE_BUS_RESET 0x29 +#define SCSI_ADSENSE_INSUFFICIENT_TIME_FOR_OPERATION 0x2E +#define SCSI_ADSENSE_INVALID_MEDIA 0x30 +#define SCSI_ADSENSE_NO_MEDIA_IN_DEVICE 0x3a +#define SCSI_ADSENSE_POSITION_ERROR 0x3b +#define SCSI_ADSENSE_OPERATOR_REQUEST 0x5a +#define SCSI_ADSENSE_FAILURE_PREDICTION_THRESHOLD_EXCEEDED 0x5d +#define SCSI_ADSENSE_ILLEGAL_MODE_FOR_THIS_TRACK 0x64 +#define SCSI_ADSENSE_COPY_PROTECTION_FAILURE 0x6f +#define SCSI_ADSENSE_POWER_CALIBRATION_ERROR 0x73 +#define SCSI_ADSENSE_VENDOR_UNIQUE 0x80 +#define SCSI_ADSENSE_MUSIC_AREA 0xA0 +#define SCSI_ADSENSE_DATA_AREA 0xA1 +#define SCSI_ADSENSE_VOLUME_OVERFLOW 0xA7 + +#define SCSI_SENSEQ_CAUSE_NOT_REPORTABLE 0x00 +#define SCSI_SENSEQ_BECOMING_READY 0x01 +#define SCSI_SENSEQ_INIT_COMMAND_REQUIRED 0x02 +#define SCSI_SENSEQ_MANUAL_INTERVENTION_REQUIRED 0x03 +#define SCSI_SENSEQ_FORMAT_IN_PROGRESS 0x04 +#define SCSI_SENSEQ_REBUILD_IN_PROGRESS 0x05 +#define SCSI_SENSEQ_RECALCULATION_IN_PROGRESS 0x06 +#define SCSI_SENSEQ_OPERATION_IN_PROGRESS 0x07 +#define SCSI_SENSEQ_LONG_WRITE_IN_PROGRESS 0x08 +#define SCSI_SENSEQ_LOSS_OF_STREAMING 0x09 +#define SCSI_SENSEQ_PADDING_BLOCKS_ADDED 0x0A + + +#define FILE_DEVICE_SCSI 0x0000001b + +#define IOCTL_SCSI_EXECUTE_IN ((FILE_DEVICE_SCSI << 16) + 0x0011) +#define IOCTL_SCSI_EXECUTE_OUT ((FILE_DEVICE_SCSI << 16) + 0x0012) +#define IOCTL_SCSI_EXECUTE_NONE ((FILE_DEVICE_SCSI << 16) + 0x0013) + +/* SMART support in ATAPI */ +#define IOCTL_SCSI_MINIPORT_SMART_VERSION ((FILE_DEVICE_SCSI << 16) + 0x0500) +#define IOCTL_SCSI_MINIPORT_IDENTIFY ((FILE_DEVICE_SCSI << 16) + 0x0501) +#define IOCTL_SCSI_MINIPORT_READ_SMART_ATTRIBS ((FILE_DEVICE_SCSI << 16) + 0x0502) +#define IOCTL_SCSI_MINIPORT_READ_SMART_THRESHOLDS ((FILE_DEVICE_SCSI << 16) + 0x0503) +#define IOCTL_SCSI_MINIPORT_ENABLE_SMART ((FILE_DEVICE_SCSI << 16) + 0x0504) +#define IOCTL_SCSI_MINIPORT_DISABLE_SMART ((FILE_DEVICE_SCSI << 16) + 0x0505) +#define IOCTL_SCSI_MINIPORT_RETURN_STATUS ((FILE_DEVICE_SCSI << 16) + 0x0506) +#define IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTOSAVE ((FILE_DEVICE_SCSI << 16) + 0x0507) +#define IOCTL_SCSI_MINIPORT_SAVE_ATTRIBUTE_VALUES ((FILE_DEVICE_SCSI << 16) + 0x0508) +#define IOCTL_SCSI_MINIPORT_EXECUTE_OFFLINE_DIAGS ((FILE_DEVICE_SCSI << 16) + 0x0509) +#define IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTO_OFFLINE ((FILE_DEVICE_SCSI << 16) + 0x050a) +#define IOCTL_SCSI_MINIPORT_READ_SMART_LOG ((FILE_DEVICE_SCSI << 16) + 0x050b) +#define IOCTL_SCSI_MINIPORT_WRITE_SMART_LOG ((FILE_DEVICE_SCSI << 16) + 0x050c) + +/* CLUSTER support */ +#define IOCTL_SCSI_MINIPORT_NOT_QUORUM_CAPABLE ((FILE_DEVICE_SCSI << 16) + 0x0520) +#define IOCTL_SCSI_MINIPORT_NOT_CLUSTER_CAPABLE ((FILE_DEVICE_SCSI << 16) + 0x0521) + +/* Read Capacity Data. Returned in Big Endian format */ +typedef struct _READ_CAPACITY_DATA { + ULONG LogicalBlockAddress; + ULONG BytesPerBlock; +} READ_CAPACITY_DATA, *PREAD_CAPACITY_DATA; + +/* Read Block Limits Data. Returned in Big Endian format */ +typedef struct _READ_BLOCK_LIMITS { + UCHAR Reserved; + UCHAR BlockMaximumSize[3]; + UCHAR BlockMinimumSize[2]; +} READ_BLOCK_LIMITS_DATA, *PREAD_BLOCK_LIMITS_DATA; + + +typedef struct _MODE_PARAMETER_HEADER { + UCHAR ModeDataLength; + UCHAR MediumType; + UCHAR DeviceSpecificParameter; + UCHAR BlockDescriptorLength; +}MODE_PARAMETER_HEADER, *PMODE_PARAMETER_HEADER; + +typedef struct _MODE_PARAMETER_HEADER10 { + UCHAR ModeDataLength[2]; + UCHAR MediumType; + UCHAR DeviceSpecificParameter; + UCHAR Reserved[2]; + UCHAR BlockDescriptorLength[2]; +} MODE_PARAMETER_HEADER10, *PMODE_PARAMETER_HEADER10; + +#define MODE_FD_SINGLE_SIDE 0x01 +#define MODE_FD_DOUBLE_SIDE 0x02 +#define MODE_FD_MAXIMUM_TYPE 0x1E +#define MODE_DSP_FUA_SUPPORTED 0x10 +#define MODE_DSP_WRITE_PROTECT 0x80 + +typedef struct _MODE_PARAMETER_BLOCK { + UCHAR DensityCode; + UCHAR NumberOfBlocks[3]; + UCHAR Reserved; + UCHAR BlockLength[3]; +} MODE_PARAMETER_BLOCK, *PMODE_PARAMETER_BLOCK; + +typedef struct _MODE_DISCONNECT_PAGE { + UCHAR PageCode : 6; + UCHAR Reserved : 1; + UCHAR PageSavable : 1; + UCHAR PageLength; + UCHAR BufferFullRatio; + UCHAR BufferEmptyRatio; + UCHAR BusInactivityLimit[2]; + UCHAR BusDisconnectTime[2]; + UCHAR BusConnectTime[2]; + UCHAR MaximumBurstSize[2]; + UCHAR DataTransferDisconnect : 2; + UCHAR Reserved2[3]; +}MODE_DISCONNECT_PAGE, *PMODE_DISCONNECT_PAGE; + +typedef struct _MODE_CACHING_PAGE { + UCHAR PageCode : 6; + UCHAR Reserved : 1; + UCHAR PageSavable : 1; + UCHAR PageLength; + UCHAR ReadDisableCache : 1; + UCHAR MultiplicationFactor : 1; + UCHAR WriteCacheEnable : 1; + UCHAR Reserved2 : 5; + UCHAR WriteRetensionPriority : 4; + UCHAR ReadRetensionPriority : 4; + UCHAR DisablePrefetchTransfer[2]; + UCHAR MinimumPrefetch[2]; + UCHAR MaximumPrefetch[2]; + UCHAR MaximumPrefetchCeiling[2]; +}MODE_CACHING_PAGE, *PMODE_CACHING_PAGE; + +typedef struct _MODE_CDROM_WRITE_PARAMETERS_PAGE { + UCHAR PageLength; + UCHAR WriteType : 4; + UCHAR TestWrite : 1; + UCHAR LinkSizeValid : 1; + UCHAR BufferUnderrunFreeEnabled : 1; + UCHAR Reserved2 : 1; + UCHAR TrackMode : 4; + UCHAR Copy : 1; + UCHAR FixedPacket : 1; + UCHAR MultiSession : 2; + UCHAR DataBlockType : 4; + UCHAR Reserved3 : 4; + UCHAR LinkSize; + UCHAR Reserved4; + UCHAR HostApplicationCode : 6; + UCHAR Reserved5 : 2; + UCHAR SessionFormat; + UCHAR Reserved6; + UCHAR PacketSize[4]; + UCHAR AudioPauseLength[2]; + UCHAR Reserved7 : 7; + UCHAR MediaCatalogNumberValid : 1; + UCHAR MediaCatalogNumber[13]; + UCHAR MediaCatalogNumberZero; + UCHAR MediaCatalogNumberAFrame; + UCHAR Reserved8 : 7; + UCHAR ISRCValid : 1; + UCHAR ISRCCountry[2]; + UCHAR ISRCOwner[3]; + UCHAR ISRCRecordingYear[2]; + UCHAR ISRCSerialNumber[5]; + UCHAR ISRCZero; + UCHAR ISRCAFrame; + UCHAR ISRCReserved; + UCHAR SubHeaderData[4]; +} MODE_CDROM_WRITE_PARAMETERS_PAGE, *PMODE_CDROM_WRITE_PARAMETERS_PAGE; + +typedef struct _MODE_FLEXIBLE_DISK_PAGE { + UCHAR PageCode : 6; + UCHAR Reserved : 1; + UCHAR PageSavable : 1; + UCHAR PageLength; + UCHAR TransferRate[2]; + UCHAR NumberOfHeads; + UCHAR SectorsPerTrack; + UCHAR BytesPerSector[2]; + UCHAR NumberOfCylinders[2]; + UCHAR StartWritePrecom[2]; + UCHAR StartReducedCurrent[2]; + UCHAR StepRate[2]; + UCHAR StepPluseWidth; + UCHAR HeadSettleDelay[2]; + UCHAR MotorOnDelay; + UCHAR MotorOffDelay; + UCHAR Reserved2 : 5; + UCHAR MotorOnAsserted : 1; + UCHAR StartSectorNumber : 1; + UCHAR TrueReadySignal : 1; + UCHAR StepPlusePerCyclynder : 4; + UCHAR Reserved3 : 4; + UCHAR WriteCompenstation; + UCHAR HeadLoadDelay; + UCHAR HeadUnloadDelay; + UCHAR Pin2Usage : 4; + UCHAR Pin34Usage : 4; + UCHAR Pin1Usage : 4; + UCHAR Pin4Usage : 4; + UCHAR MediumRotationRate[2]; + UCHAR Reserved4[2]; +} MODE_FLEXIBLE_DISK_PAGE, *PMODE_FLEXIBLE_DISK_PAGE; + +typedef struct _MODE_FORMAT_PAGE { + UCHAR PageCode : 6; + UCHAR Reserved : 1; + UCHAR PageSavable : 1; + UCHAR PageLength; + UCHAR TracksPerZone[2]; + UCHAR AlternateSectorsPerZone[2]; + UCHAR AlternateTracksPerZone[2]; + UCHAR AlternateTracksPerLogicalUnit[2]; + UCHAR SectorsPerTrack[2]; + UCHAR BytesPerPhysicalSector[2]; + UCHAR Interleave[2]; + UCHAR TrackSkewFactor[2]; + UCHAR CylinderSkewFactor[2]; + UCHAR Reserved2 : 4; + UCHAR SurfaceFirst : 1; + UCHAR RemovableMedia : 1; + UCHAR HardSectorFormating : 1; + UCHAR SoftSectorFormating : 1; + UCHAR Reserved3[3]; +} MODE_FORMAT_PAGE, *PMODE_FORMAT_PAGE; + +typedef struct _MODE_RIGID_GEOMETRY_PAGE { + UCHAR PageCode : 6; + UCHAR Reserved : 1; + UCHAR PageSavable : 1; + UCHAR PageLength; + UCHAR NumberOfCylinders[3]; + UCHAR NumberOfHeads; + UCHAR StartWritePrecom[3]; + UCHAR StartReducedCurrent[3]; + UCHAR DriveStepRate[2]; + UCHAR LandZoneCyclinder[3]; + UCHAR RotationalPositionLock : 2; + UCHAR Reserved2 : 6; + UCHAR RotationOffset; + UCHAR Reserved3; + UCHAR RoataionRate[2]; + UCHAR Reserved4[2]; +} MODE_RIGID_GEOMETRY_PAGE, *PMODE_RIGID_GEOMETRY_PAGE; + +typedef struct _MODE_READ_WRITE_RECOVERY_PAGE { + UCHAR PageCode : 6; + UCHAR Reserved1 : 1; + UCHAR PSBit : 1; + UCHAR PageLength; + UCHAR DCRBit : 1; + UCHAR DTEBit : 1; + UCHAR PERBit : 1; + UCHAR EERBit : 1; + UCHAR RCBit : 1; + UCHAR TBBit : 1; + UCHAR ARRE : 1; + UCHAR AWRE : 1; + UCHAR ReadRetryCount; + UCHAR Reserved4[4]; + UCHAR WriteRetryCount; + UCHAR Reserved5[3]; +} MODE_READ_WRITE_RECOVERY_PAGE, *PMODE_READ_WRITE_RECOVERY_PAGE; + +typedef struct _MODE_READ_RECOVERY_PAGE { + UCHAR PageCode : 6; + UCHAR Reserved1 : 1; + UCHAR PSBit : 1; + UCHAR PageLength; + UCHAR DCRBit : 1; + UCHAR DTEBit : 1; + UCHAR PERBit : 1; + UCHAR Reserved2 : 1; + UCHAR RCBit : 1; + UCHAR TBBit : 1; + UCHAR Reserved3 : 2; + UCHAR ReadRetryCount; + UCHAR Reserved4[4]; +} MODE_READ_RECOVERY_PAGE, *PMODE_READ_RECOVERY_PAGE; + +typedef struct _MODE_INFO_EXCEPTIONS { + UCHAR PageCode : 6; + UCHAR Reserved1 : 1; + UCHAR PSBit : 1; + UCHAR PageLength; + _ANONYMOUS_UNION union { + UCHAR Flags; + _ANONYMOUS_STRUCT struct { + UCHAR LogErr : 1; + UCHAR Reserved2 : 1; + UCHAR Test : 1; + UCHAR Dexcpt : 1; + UCHAR Reserved3 : 3; + UCHAR Perf : 1; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; + UCHAR ReportMethod : 4; + UCHAR Reserved4 : 4; + UCHAR IntervalTimer[4]; + UCHAR ReportCount[4]; +} MODE_INFO_EXCEPTIONS, *PMODE_INFO_EXCEPTIONS; + +/* CDROM audio control */ +#define CDB_AUDIO_PAUSE 0x00 +#define CDB_AUDIO_RESUME 0x01 +#define CDB_DEVICE_START 0x11 +#define CDB_DEVICE_STOP 0x10 +#define CDB_EJECT_MEDIA 0x10 +#define CDB_LOAD_MEDIA 0x01 +#define CDB_SUBCHANNEL_HEADER 0x00 +#define CDB_SUBCHANNEL_BLOCK 0x01 + +#define CDROM_AUDIO_CONTROL_PAGE 0x0E +#define MODE_SELECT_IMMEDIATE 0x04 +#define MODE_SELECT_PFBIT 0x10 + +#define CDB_USE_MSF 0x01 + +typedef struct _PORT_OUTPUT { + UCHAR ChannelSelection; + UCHAR Volume; +} PORT_OUTPUT, *PPORT_OUTPUT; + +typedef struct _AUDIO_OUTPUT { + UCHAR CodePage; + UCHAR ParameterLength; + UCHAR Immediate; + UCHAR Reserved[2]; + UCHAR LbaFormat; + UCHAR LogicalBlocksPerSecond[2]; + PORT_OUTPUT PortOutput[4]; +} AUDIO_OUTPUT, *PAUDIO_OUTPUT; + +/* Multisession CDROMs */ +#define GET_LAST_SESSION 0x01 +#define GET_SESSION_DATA 0x02; + +/* Atapi 2.5 changers */ +typedef struct _MECHANICAL_STATUS_INFORMATION_HEADER { + UCHAR CurrentSlot : 5; + UCHAR ChangerState : 2; + UCHAR Fault : 1; + UCHAR Reserved : 5; + UCHAR MechanismState : 3; + UCHAR CurrentLogicalBlockAddress[3]; + UCHAR NumberAvailableSlots; + UCHAR SlotTableLength[2]; +} MECHANICAL_STATUS_INFORMATION_HEADER, *PMECHANICAL_STATUS_INFORMATION_HEADER; + +typedef struct _SLOT_TABLE_INFORMATION { + UCHAR DiscChanged : 1; + UCHAR Reserved : 6; + UCHAR DiscPresent : 1; + UCHAR Reserved2[3]; +} SLOT_TABLE_INFORMATION, *PSLOT_TABLE_INFORMATION; + +typedef struct _MECHANICAL_STATUS { + MECHANICAL_STATUS_INFORMATION_HEADER MechanicalStatusHeader; + SLOT_TABLE_INFORMATION SlotTableInfo[1]; +} MECHANICAL_STATUS, *PMECHANICAL_STATUS; + + +/* Tape definitions */ +typedef struct _TAPE_POSITION_DATA { + UCHAR Reserved1 : 2; + UCHAR BlockPositionUnsupported : 1; + UCHAR Reserved2 : 3; + UCHAR EndOfPartition : 1; + UCHAR BeginningOfPartition : 1; + UCHAR PartitionNumber; + USHORT Reserved3; + UCHAR FirstBlock[4]; + UCHAR LastBlock[4]; + UCHAR Reserved4; + UCHAR NumberOfBlocks[3]; + UCHAR NumberOfBytes[4]; +} TAPE_POSITION_DATA, *PTAPE_POSITION_DATA; + +/* This structure is used to convert little endian ULONGs + to SCSI CDB big endians values. */ +typedef union _EIGHT_BYTE { + _ANONYMOUS_STRUCT struct { + UCHAR Byte0; + UCHAR Byte1; + UCHAR Byte2; + UCHAR Byte3; + UCHAR Byte4; + UCHAR Byte5; + UCHAR Byte6; + UCHAR Byte7; + } DUMMYSTRUCTNAME; + ULONGLONG AsULongLong; +} EIGHT_BYTE, *PEIGHT_BYTE; + +typedef union _FOUR_BYTE { + _ANONYMOUS_STRUCT struct { + UCHAR Byte0; + UCHAR Byte1; + UCHAR Byte2; + UCHAR Byte3; + } DUMMYSTRUCTNAME; + ULONG AsULong; +} FOUR_BYTE, *PFOUR_BYTE; + +typedef union _TWO_BYTE { + _ANONYMOUS_STRUCT struct { + UCHAR Byte0; + UCHAR Byte1; + } DUMMYSTRUCTNAME; + USHORT AsUShort; +} TWO_BYTE, *PTWO_BYTE; + +/* Byte reversing macro for converting between + big- and little-endian formats */ +#define REVERSE_BYTES_QUAD(Destination, Source) { \ + PEIGHT_BYTE _val1 = (PEIGHT_BYTE)(Destination); \ + PEIGHT_BYTE _val2 = (PEIGHT_BYTE)(Source); \ + _val1->Byte7 = _val2->Byte0; \ + _val1->Byte6 = _val2->Byte1; \ + _val1->Byte5 = _val2->Byte2; \ + _val1->Byte4 = _val2->Byte3; \ + _val1->Byte3 = _val2->Byte4; \ + _val1->Byte2 = _val2->Byte5; \ + _val1->Byte1 = _val2->Byte6; \ + _val1->Byte0 = _val2->Byte7; \ +} + +#define REVERSE_BYTES(Destination, Source) { \ + PFOUR_BYTE _val1 = (PFOUR_BYTE)(Destination); \ + PFOUR_BYTE _val2 = (PFOUR_BYTE)(Source); \ + _val1->Byte3 = _val2->Byte0; \ + _val1->Byte2 = _val2->Byte1; \ + _val1->Byte1 = _val2->Byte2; \ + _val1->Byte0 = _val2->Byte3; \ +} + +#define REVERSE_BYTES_SHORT(Destination, Source) { \ + PTWO_BYTE _val1 = (PTWO_BYTE)(Destination); \ + PTWO_BYTE _val2 = (PTWO_BYTE)(Source); \ + _val1->Byte1 = _val2->Byte0; \ + _val1->Byte0 = _val2->Byte1; \ +} + +#define REVERSE_SHORT(Short) { \ + UCHAR _val; \ + PTWO_BYTE _val2 = (PTWO_BYTE)(Short); \ + _val = _val2->Byte0; \ + _val2->Byte0 = _val2->Byte1; \ + _val2->Byte1 = _val; \ +} + +#define REVERSE_LONG(Long) { \ + UCHAR _val; \ + PFOUR_BYTE _val2 = (PFOUR_BYTE)(Long); \ + _val = _val2->Byte3; \ + _val2->Byte3 = _val2->Byte0; \ + _val2->Byte0 = _val; \ + _val = _val2->Byte2; \ + _val2->Byte2 = _val2->Byte1; \ + _val2->Byte1 = _val; \ +} + +#define WHICH_BIT(Data, Bit) { \ + UCHAR _val; \ + for (_val = 0; _val < 32; _val++) { \ + if (((Data) >> _val) == 1) { \ + break; \ + } \ + } \ + assert(_val != 32); \ + (Bit) = _val; \ +} + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __SCSI_H */ diff --git a/reactos/w32api/include/ddk/scsiscan.h b/reactos/w32api/include/ddk/scsiscan.h new file mode 100644 index 00000000000..8d32ad34209 --- /dev/null +++ b/reactos/w32api/include/ddk/scsiscan.h @@ -0,0 +1,135 @@ +/* + * scsiscan.h + * + * SCSI scanner driver interface + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __SCSISCAN_H +#define __SCSISCAN_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + + +#define IOCTL_SCSISCAN_CMD \ + CTL_CODE(FILE_DEVICE_SCANNER, SCSISCAN_CMD_CODE, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) + +#define IOCTL_SCSISCAN_LOCKDEVICE \ + CTL_CODE(FILE_DEVICE_SCANNER, SCSISCAN_LOCKDEVICE, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) + +#define IOCTL_SCSISCAN_SET_TIMEOUT \ + CTL_CODE(FILE_DEVICE_SCANNER, SCSISCAN_SET_TIMEOUT, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_SCSISCAN_GET_INFO \ + CTL_CODE(FILE_DEVICE_SCANNER, SCSISCAN_GET_INFO, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) + +#define IOCTL_SCSISCAN_UNLOCKDEVICE \ + CTL_CODE(FILE_DEVICE_SCANNER, SCSISCAN_UNLOCKDEVICE, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) + + +/* SCSISCAN_CMD.SrbFlags constants */ +#define SRB_FLAGS_DISABLE_SYNCH_TRANSFER 0x00000008 +#define SRB_FLAGS_DISABLE_AUTOSENSE 0x00000020 +#define SRB_FLAGS_DATA_IN 0x00000040 +#define SRB_FLAGS_DATA_OUT 0x00000080 +#define SRB_FLAGS_NO_DATA_TRANSFER 0x00000000 + +/* SCSISCAN_CMD.pSrbStatus constants */ +#define SRB_STATUS_PENDING 0x00 +#define SRB_STATUS_SUCCESS 0x01 +#define SRB_STATUS_ABORTED 0x02 +#define SRB_STATUS_ABORT_FAILED 0x03 +#define SRB_STATUS_ERROR 0x04 +#define SRB_STATUS_BUSY 0x05 +#define SRB_STATUS_INVALID_REQUEST 0x06 +#define SRB_STATUS_INVALID_PATH_ID 0x07 +#define SRB_STATUS_NO_DEVICE 0x08 +#define SRB_STATUS_TIMEOUT 0x09 +#define SRB_STATUS_SELECTION_TIMEOUT 0x0A +#define SRB_STATUS_COMMAND_TIMEOUT 0x0B +#define SRB_STATUS_MESSAGE_REJECTED 0x0D +#define SRB_STATUS_BUS_RESET 0x0E +#define SRB_STATUS_PARITY_ERROR 0x0F +#define SRB_STATUS_REQUEST_SENSE_FAILED 0x10 +#define SRB_STATUS_NO_HBA 0x11 +#define SRB_STATUS_DATA_OVERRUN 0x12 +#define SRB_STATUS_UNEXPECTED_BUS_FREE 0x13 +#define SRB_STATUS_PHASE_SEQUENCE_FAILURE 0x14 +#define SRB_STATUS_BAD_SRB_BLOCK_LENGTH 0x15 +#define SRB_STATUS_REQUEST_FLUSHED 0x16 +#define SRB_STATUS_INVALID_LUN 0x20 +#define SRB_STATUS_INVALID_TARGET_ID 0x21 +#define SRB_STATUS_BAD_FUNCTION 0x22 +#define SRB_STATUS_ERROR_RECOVERY 0x23 +#define SRB_STATUS_QUEUE_FROZEN 0x40 +#define SRB_STATUS_AUTOSENSE_VALID 0x80 + +#define SRB_STATUS(Status) (Status & ~(SRB_STATUS_AUTOSENSE_VALID | SRB_STATUS_QUEUE_FROZEN)) + +typedef struct _SCSISCAN_CMD { + ULONG Reserved1; + ULONG Size; + ULONG SrbFlags; + UCHAR CdbLength; + UCHAR SenseLength; + UCHAR Reserved2; + UCHAR Reserved3; + ULONG TransferLength; + UCHAR Cdb[16]; + PUCHAR pSrbStatus; + PUCHAR pSenseBuffer; +} SCSISCAN_CMD, *PSCSISCAN_CMD; + +#define MAX_STRING 128 + +/* SCSISCAN_INFO.Flags constants */ +#define SCSISCAN_RESERVED 0x000 +#define SCSISCAN_CMD_CODE 0x004 +#define SCSISCAN_LOCKDEVICE 0x005 +#define SCSISCAN_UNLOCKDEVICE 0x006 +#define SCSISCAN_SET_TIMEOUT 0x007 +#define SCSISCAN_GET_INFO 0x008 + +typedef struct _SCSISCAN_INFO { + ULONG Size; + ULONG Flags; + UCHAR PortNumber; + UCHAR PathId; + UCHAR TargetId; + UCHAR Lun; + UCHAR AdapterName[MAX_STRING]; + ULONG Reserved; +} SCSISCAN_INFO, *PSCSISCAN_INFO; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __SCSISCAN_H */ diff --git a/reactos/w32api/include/ddk/scsiwmi.h b/reactos/w32api/include/ddk/scsiwmi.h new file mode 100644 index 00000000000..684271593fe --- /dev/null +++ b/reactos/w32api/include/ddk/scsiwmi.h @@ -0,0 +1,215 @@ +/* + * scsiwmi.h + * + * SCSI WMILIB interface. + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __SCSIWMI_H +#define __SCSIWMI_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" +#include "srb.h" + + +typedef struct _SCSIWMI_REQUEST_CONTEXT { + PVOID UserContext; + ULONG BufferSize; + PUCHAR Buffer; + UCHAR MinorFunction; + UCHAR ReturnStatus; + ULONG ReturnSize; +} SCSIWMI_REQUEST_CONTEXT, *PSCSIWMI_REQUEST_CONTEXT; + +#ifdef _GUID_DEFINED +# warning _GUID_DEFINED is deprecated, use GUID_DEFINED instead +#endif + +#if ! (defined _GUID_DEFINED || defined GUID_DEFINED) +#define GUID_DEFINED +typedef struct _GUID { + unsigned long Data1; + unsigned short Data2; + unsigned short Data3; + unsigned char Data4[ 8 ]; +} GUID; +#endif + +#ifndef _LPCGUID_DEFINED +#define _LPCGUID_DEFINED +typedef const GUID *LPCGUID; +#endif + +typedef struct _SCSIWMIGUIDREGINFO { + LPCGUID Guid; + ULONG InstanceCount; + ULONG Flags; +} SCSIWMIGUIDREGINFO, *PSCSIWMIGUIDREGINFO; + +typedef UCHAR DDKAPI +(*PSCSIWMI_QUERY_REGINFO)( + IN PVOID DeviceContext, + IN PSCSIWMI_REQUEST_CONTEXT RequestContext, + OUT PWCHAR *MofResourceName); + +typedef BOOLEAN DDKAPI +(*PSCSIWMI_QUERY_DATABLOCK)( + IN PVOID Context, + IN PSCSIWMI_REQUEST_CONTEXT DispatchContext, + IN ULONG GuidIndex, + IN ULONG InstanceIndex, + IN ULONG InstanceCount, + IN OUT PULONG InstanceLengthArray, + IN ULONG BufferAvail, + OUT PUCHAR Buffer); + +typedef BOOLEAN DDKAPI +(*PSCSIWMI_SET_DATABLOCK)( + IN PVOID DeviceContext, + IN PSCSIWMI_REQUEST_CONTEXT RequestContext, + IN ULONG GuidIndex, + IN ULONG InstanceIndex, + IN ULONG BufferSize, + IN PUCHAR Buffer); + +typedef BOOLEAN DDKAPI +(*PSCSIWMI_SET_DATAITEM)( + IN PVOID DeviceContext, + IN PSCSIWMI_REQUEST_CONTEXT RequestContext, + IN ULONG GuidIndex, + IN ULONG InstanceIndex, + IN ULONG DataItemId, + IN ULONG BufferSize, + IN PUCHAR Buffer); + +typedef BOOLEAN DDKAPI +(*PSCSIWMI_EXECUTE_METHOD)( + IN PVOID DeviceContext, + IN PSCSIWMI_REQUEST_CONTEXT RequestContext, + IN ULONG GuidIndex, + IN ULONG InstanceIndex, + IN ULONG MethodId, + IN ULONG InBufferSize, + IN ULONG OutBufferSize, + IN OUT PUCHAR Buffer); + +typedef enum _SCSIWMI_ENABLE_DISABLE_CONTROL { + ScsiWmiEventControl, + ScsiWmiDataBlockControl +} SCSIWMI_ENABLE_DISABLE_CONTROL; + +typedef BOOLEAN DDKAPI +(*PSCSIWMI_FUNCTION_CONTROL)( + IN PVOID DeviceContext, + IN PSCSIWMI_REQUEST_CONTEXT RequestContext, + IN ULONG GuidIndex, + IN SCSIWMI_ENABLE_DISABLE_CONTROL Function, + IN BOOLEAN Enable); + +typedef struct _SCSIWMILIB_CONTEXT { + ULONG GuidCount; + PSCSIWMIGUIDREGINFO GuidList; + PSCSIWMI_QUERY_REGINFO QueryWmiRegInfo; + PSCSIWMI_QUERY_DATABLOCK QueryWmiDataBlock; + PSCSIWMI_SET_DATABLOCK SetWmiDataBlock; + PSCSIWMI_SET_DATAITEM SetWmiDataItem; + PSCSIWMI_EXECUTE_METHOD ExecuteWmiMethod; + PSCSIWMI_FUNCTION_CONTROL WmiFunctionControl; +} SCSI_WMILIB_CONTEXT, *PSCSI_WMILIB_CONTEXT; + +SCSIPORTAPI +BOOLEAN +DDKAPI +ScsiPortWmiDispatchFunction( + IN PSCSI_WMILIB_CONTEXT WmiLibInfo, + IN UCHAR MinorFunction, + IN PVOID DeviceContext, + IN PSCSIWMI_REQUEST_CONTEXT RequestContext, + IN PVOID DataPath, + IN ULONG BufferSize, + IN PVOID Buffer); + +#define ScsiPortWmiFireAdapterEvent( \ + HwDeviceExtension, \ + Guid, \ + InstanceIndex, \ + EventDataSize, \ + EventData) \ + ScsiPortWmiFireLogicalUnitEvent( \ + HwDeviceExtension, \ + 0xff, \ + 0, \ + 0, \ + Guid, \ + InstanceIndex, \ + EventDataSize, \ + EventData) + +/* + * ULONG + * ScsiPortWmiGetReturnSize( + * PSCSIWMI_REQUEST_CONTEXT RequestContext); + */ +#define ScsiPortWmiGetReturnSize(RequestContext) \ + ((RequestContext)->ReturnSize) + +/* UCHAR + * ScsiPortWmiGetReturnStatus( + * PSCSIWMI_REQUEST_CONTEXT RequestContext); + */ +#define ScsiPortWmiGetReturnStatus(RequestContext) \ + ((RequestContext)->ReturnStatus) + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortWmiPostProcess( + IN PSCSIWMI_REQUEST_CONTEXT RequestContext, + IN UCHAR SrbStatus, + IN ULONG BufferUsed); + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortWmiFireLogicalUnitEvent( + IN PVOID HwDeviceExtension, + IN UCHAR PathId, + IN UCHAR TargetId, + IN UCHAR Lun, + IN LPGUID Guid, + IN ULONG InstanceIndex, + IN ULONG EventDataSize, + IN PVOID EventData); + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __SCSIWMI_H */ diff --git a/reactos/w32api/include/ddk/smbus.h b/reactos/w32api/include/ddk/smbus.h new file mode 100644 index 00000000000..5444d374d66 --- /dev/null +++ b/reactos/w32api/include/ddk/smbus.h @@ -0,0 +1,194 @@ +/* + * smbus.h + * + * System Management Bus driver interface + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __SMBUS_H +#define __SMBUS_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#if !defined(SMBCLASS) + #define SMBCLASSAPI DECLSPEC_IMPORT +#else + #define SMBCLASSAPI DECLSPEC_EXPORT +#endif + +#define SMB_BUS_REQUEST \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define SMB_DEREGISTER_ALARM_NOTIFY \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 2, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define SMB_REGISTER_ALARM_NOTIFY \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 1, METHOD_NEITHER, FILE_ANY_ACCESS) + + +struct _SMB_CLASS; + +#define SMB_MAX_DATA_SIZE 32 + +/* SMB_REQUEST.Status constants */ +#define SMB_STATUS_OK 0x00 +#define SMB_UNKNOWN_FAILURE 0x07 +#define SMB_ADDRESS_NOT_ACKNOWLEDGED 0x10 +#define SMB_DEVICE_ERROR 0x11 +#define SMB_COMMAND_ACCESS_DENIED 0x12 +#define SMB_UNKNOWN_ERROR 0x13 +#define SMB_DEVICE_ACCESS_DENIED 0x17 +#define SMB_TIMEOUT 0x18 +#define SMB_UNSUPPORTED_PROTOCOL 0x19 +#define SMB_BUS_BUSY 0x1A + +/* SMB_REQUEST.Protocol constants */ +#define SMB_WRITE_QUICK 0x00 +#define SMB_READ_QUICK 0x01 +#define SMB_SEND_BYTE 0x02 +#define SMB_RECEIVE_BYTE 0x03 +#define SMB_WRITE_BYTE 0x04 +#define SMB_READ_BYTE 0x05 +#define SMB_WRITE_WORD 0x06 +#define SMB_READ_WORD 0x07 +#define SMB_WRITE_BLOCK 0x08 +#define SMB_READ_BLOCK 0x09 +#define SMB_PROCESS_CALL 0x0A +#define SMB_MAXIMUM_PROTOCOL 0x0A + +typedef struct _SMB_REQUEST { + UCHAR Status; + UCHAR Protocol; + UCHAR Address; + UCHAR Command; + UCHAR BlockLength; + UCHAR Data[SMB_MAX_DATA_SIZE]; +} SMB_REQUEST, *PSMB_REQUEST; + +typedef VOID STDCALL +(*SMB_ALARM_NOTIFY)( + PVOID Context, + UCHAR Address, + USHORT Data); + +typedef struct _SMB_REGISTER_ALARM { + UCHAR MinAddress; + UCHAR MaxAddress; + SMB_ALARM_NOTIFY NotifyFunction; + PVOID NotifyContext; +} SMB_REGISTER_ALARM, *PSMB_REGISTER_ALARM; + +/* SMB_CLASS.XxxVersion constants */ +#define SMB_CLASS_MAJOR_VERSION 0x0001 +#define SMB_CLASS_MINOR_VERSION 0x0000 + +typedef NTSTATUS DDKAPI +(*SMB_RESET_DEVICE)( + IN struct _SMB_CLASS *SmbClass, + IN PVOID SmbMiniport); + +typedef VOID DDKAPI +(*SMB_START_IO)( + IN struct _SMB_CLASS *SmbClass, + IN PVOID SmbMiniport); + +typedef NTSTATUS DDKAPI +(*SMB_STOP_DEVICE)( + IN struct _SMB_CLASS *SmbClass, + IN PVOID SmbMiniport); + +typedef struct _SMB_CLASS { + USHORT MajorVersion; + USHORT MinorVersion; + PVOID Miniport; + PDEVICE_OBJECT DeviceObject; + PDEVICE_OBJECT PDO; + PDEVICE_OBJECT LowerDeviceObject; + PIRP CurrentIrp; + PSMB_REQUEST CurrentSmb; + SMB_RESET_DEVICE ResetDevice; + SMB_START_IO StartIo; + SMB_STOP_DEVICE StopDevice; +} SMB_CLASS, *PSMB_CLASS; + +SMBCLASSAPI +VOID +DDKAPI +SmbClassAlarm( + IN PSMB_CLASS SmbClass, + IN UCHAR Address, + IN USHORT Data); + +SMBCLASSAPI +VOID +DDKAPI +SmbClassCompleteRequest( + IN PSMB_CLASS SmbClass); + +typedef NTSTATUS DDKAPI +(*PSMB_INITIALIZE_MINIPORT)( + IN PSMB_CLASS SmbClass, + IN PVOID MiniportExtension, + IN PVOID MiniportContext); + +SMBCLASSAPI +NTSTATUS +DDKAPI +SmbClassCreateFdo( + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT PDO, + IN ULONG MiniportExtensionSize, + IN PSMB_INITIALIZE_MINIPORT MiniportInitialize, + IN PVOID MiniportContext, + OUT PDEVICE_OBJECT *FDO); + +SMBCLASSAPI +NTSTATUS +DDKAPI +SmbClassInitializeDevice( + IN ULONG MajorVersion, + IN ULONG MinorVersion, + IN PDRIVER_OBJECT DriverObject); + +SMBCLASSAPI +VOID +DDKAPI +SmbClassLockDevice( + IN PSMB_CLASS SmbClass); + +SMBCLASSAPI +VOID +DDKAPI +SmbClassUnlockDevice( + IN PSMB_CLASS SmbClass); + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __SMBUS_H */ diff --git a/reactos/w32api/include/ddk/srb.h b/reactos/w32api/include/ddk/srb.h new file mode 100644 index 00000000000..93563f283b3 --- /dev/null +++ b/reactos/w32api/include/ddk/srb.h @@ -0,0 +1,757 @@ +/* + * scsi.h + * + * Interface between SCSI miniport drivers and the SCSI port driver. + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __SRB_H +#define __SRB_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + +#if defined(_SCSIPORT_) + #define SCSIPORTAPI DECLSPEC_EXPORT +#else + #define SCSIPORTAPI DECLSPEC_IMPORT +#endif + +#ifdef DBG +#define DebugPrint(x) ScsiDebugPrint x +#else +#define DebugPrint(x) +#endif + +typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS, *PSCSI_PHYSICAL_ADDRESS; + +#define SP_UNINITIALIZED_VALUE ((ULONG) ~0) +#define SP_UNTAGGED ((UCHAR) ~0) + +#define SRB_SIMPLE_TAG_REQUEST 0x20 +#define SRB_HEAD_OF_QUEUE_TAG_REQUEST 0x21 +#define SRB_ORDERED_QUEUE_TAG_REQUEST 0x22 + +#define SRB_STATUS_QUEUE_FROZEN 0x40 +#define SRB_STATUS_AUTOSENSE_VALID 0x80 + +#define SRB_STATUS(Status) \ + (Status & ~(SRB_STATUS_AUTOSENSE_VALID | SRB_STATUS_QUEUE_FROZEN)) + +#define MAXIMUM_CDB_SIZE 12 + +#ifdef DBG +#define SCSI_PORT_SIGNATURE 0x54524f50 +#endif + + +#define SCSI_MAXIMUM_LOGICAL_UNITS 8 +#define SCSI_MAXIMUM_TARGETS_PER_BUS 128 +#define SCSI_MAXIMUM_LUNS_PER_TARGET 255 +#define SCSI_MAXIMUM_BUSES 8 +#define SCSI_MINIMUM_PHYSICAL_BREAKS 16 +#define SCSI_MAXIMUM_PHYSICAL_BREAKS 255 +#define SCSI_MAXIMUM_TARGETS 8 + +#define SRB_FUNCTION_WMI 0x17 + +#define SRB_WMI_FLAGS_ADAPTER_REQUEST 0x0001 + +#define SP_BUS_PARITY_ERROR 0x0001 +#define SP_UNEXPECTED_DISCONNECT 0x0002 +#define SP_INVALID_RESELECTION 0x0003 +#define SP_BUS_TIME_OUT 0x0004 +#define SP_PROTOCOL_ERROR 0x0005 +#define SP_INTERNAL_ADAPTER_ERROR 0x0006 +#define SP_REQUEST_TIMEOUT 0x0007 +#define SP_IRQ_NOT_RESPONDING 0x0008 +#define SP_BAD_FW_WARNING 0x0009 +#define SP_BAD_FW_ERROR 0x000a +#define SP_LOST_WMI_MINIPORT_REQUEST 0x000b + +/* SCSI_REQUEST_BLOCK.Function constants */ +#define SRB_FUNCTION_EXECUTE_SCSI 0x00 +#define SRB_FUNCTION_CLAIM_DEVICE 0x01 +#define SRB_FUNCTION_IO_CONTROL 0x02 +#define SRB_FUNCTION_RECEIVE_EVENT 0x03 +#define SRB_FUNCTION_RELEASE_QUEUE 0x04 +#define SRB_FUNCTION_ATTACH_DEVICE 0x05 +#define SRB_FUNCTION_RELEASE_DEVICE 0x06 +#define SRB_FUNCTION_SHUTDOWN 0x07 +#define SRB_FUNCTION_FLUSH 0x08 +#define SRB_FUNCTION_ABORT_COMMAND 0x10 +#define SRB_FUNCTION_RELEASE_RECOVERY 0x11 +#define SRB_FUNCTION_RESET_BUS 0x12 +#define SRB_FUNCTION_RESET_DEVICE 0x13 +#define SRB_FUNCTION_TERMINATE_IO 0x14 +#define SRB_FUNCTION_FLUSH_QUEUE 0x15 +#define SRB_FUNCTION_REMOVE_DEVICE 0x16 +#define SRB_FUNCTION_WMI 0x17 +#define SRB_FUNCTION_LOCK_QUEUE 0x18 +#define SRB_FUNCTION_UNLOCK_QUEUE 0x19 +#define SRB_FUNCTION_RESET_LOGICAL_UNIT 0x20 + +/* SCSI_REQUEST_BLOCK.SrbStatus constants */ +#define SRB_STATUS_PENDING 0x00 +#define SRB_STATUS_SUCCESS 0x01 +#define SRB_STATUS_ABORTED 0x02 +#define SRB_STATUS_ABORT_FAILED 0x03 +#define SRB_STATUS_ERROR 0x04 +#define SRB_STATUS_BUSY 0x05 +#define SRB_STATUS_INVALID_REQUEST 0x06 +#define SRB_STATUS_INVALID_PATH_ID 0x07 +#define SRB_STATUS_NO_DEVICE 0x08 +#define SRB_STATUS_TIMEOUT 0x09 +#define SRB_STATUS_SELECTION_TIMEOUT 0x0A +#define SRB_STATUS_COMMAND_TIMEOUT 0x0B +#define SRB_STATUS_MESSAGE_REJECTED 0x0D +#define SRB_STATUS_BUS_RESET 0x0E +#define SRB_STATUS_PARITY_ERROR 0x0F +#define SRB_STATUS_REQUEST_SENSE_FAILED 0x10 +#define SRB_STATUS_NO_HBA 0x11 +#define SRB_STATUS_DATA_OVERRUN 0x12 +#define SRB_STATUS_UNEXPECTED_BUS_FREE 0x13 +#define SRB_STATUS_PHASE_SEQUENCE_FAILURE 0x14 +#define SRB_STATUS_BAD_SRB_BLOCK_LENGTH 0x15 +#define SRB_STATUS_REQUEST_FLUSHED 0x16 +#define SRB_STATUS_INVALID_LUN 0x20 +#define SRB_STATUS_INVALID_TARGET_ID 0x21 +#define SRB_STATUS_BAD_FUNCTION 0x22 +#define SRB_STATUS_ERROR_RECOVERY 0x23 +#define SRB_STATUS_NOT_POWERED 0x24 +#define SRB_STATUS_INTERNAL_ERROR 0x30 + +/* SCSI_REQUEST_BLOCK.SrbFlags constants */ +#define SRB_FLAGS_QUEUE_ACTION_ENABLE 0x00000002 +#define SRB_FLAGS_DISABLE_DISCONNECT 0x00000004 +#define SRB_FLAGS_DISABLE_SYNCH_TRANSFER 0x00000008 +#define SRB_FLAGS_BYPASS_FROZEN_QUEUE 0x00000010 +#define SRB_FLAGS_DISABLE_AUTOSENSE 0x00000020 +#define SRB_FLAGS_DATA_IN 0x00000040 +#define SRB_FLAGS_DATA_OUT 0x00000080 +#define SRB_FLAGS_NO_DATA_TRANSFER 0x00000000 +#define SRB_FLAGS_UNSPECIFIED_DIRECTION (SRB_FLAGS_DATA_IN | SRB_FLAGS_DATA_OUT) +#define SRB_FLAGS_NO_QUEUE_FREEZE 0x00000100 +#define SRB_FLAGS_ADAPTER_CACHE_ENABLE 0x00000200 +#define SRB_FLAGS_FREE_SENSE_BUFFER 0x00000400 +#define SRB_FLAGS_IS_ACTIVE 0x00010000 +#define SRB_FLAGS_ALLOCATED_FROM_ZONE 0x00020000 +#define SRB_FLAGS_SGLIST_FROM_POOL 0x00040000 +#define SRB_FLAGS_BYPASS_LOCKED_QUEUE 0x00080000 +#define SRB_FLAGS_NO_KEEP_AWAKE 0x00100000 +#define SRB_FLAGS_PORT_DRIVER_ALLOCSENSE 0x00200000 +#define SRB_FLAGS_PORT_DRIVER_SENSEHASPORT 0x00400000 +#define SRB_FLAGS_DONT_START_NEXT_PACKET 0x00800000 +#define SRB_FLAGS_PORT_DRIVER_RESERVED 0x0F000000 +#define SRB_FLAGS_CLASS_DRIVER_RESERVED 0xF0000000 + +typedef struct _SCSI_REQUEST_BLOCK { + USHORT Length; + UCHAR Function; + UCHAR SrbStatus; + UCHAR ScsiStatus; + UCHAR PathId; + UCHAR TargetId; + UCHAR Lun; + UCHAR QueueTag; + UCHAR QueueAction; + UCHAR CdbLength; + UCHAR SenseInfoBufferLength; + ULONG SrbFlags; + ULONG DataTransferLength; + ULONG TimeOutValue; + PVOID DataBuffer; + PVOID SenseInfoBuffer; + struct _SCSI_REQUEST_BLOCK *NextSrb; + PVOID OriginalRequest; + PVOID SrbExtension; + _ANONYMOUS_UNION union { + ULONG InternalStatus; + ULONG QueueSortKey; + } DUMMYUNIONNAME; +#if defined(_WIN64) + ULONG Reserved; +#endif + UCHAR Cdb[16]; +} SCSI_REQUEST_BLOCK, *PSCSI_REQUEST_BLOCK; + +#define SCSI_REQUEST_BLOCK_SIZE sizeof(SCSI_REQUEST_BLOCK) + +typedef struct _ACCESS_RANGE { + SCSI_PHYSICAL_ADDRESS RangeStart; + ULONG RangeLength; + BOOLEAN RangeInMemory; +} ACCESS_RANGE, *PACCESS_RANGE; + +/* PORT_CONFIGURATION_INFORMATION.Dma64BitAddresses constants */ +#define SCSI_DMA64_MINIPORT_SUPPORTED 0x01 +#define SCSI_DMA64_SYSTEM_SUPPORTED 0x80 + +typedef struct _PORT_CONFIGURATION_INFORMATION { + ULONG Length; + ULONG SystemIoBusNumber; + INTERFACE_TYPE AdapterInterfaceType; + ULONG BusInterruptLevel; + ULONG BusInterruptVector; + KINTERRUPT_MODE InterruptMode; + ULONG MaximumTransferLength; + ULONG NumberOfPhysicalBreaks; + ULONG DmaChannel; + ULONG DmaPort; + DMA_WIDTH DmaWidth; + DMA_SPEED DmaSpeed; + ULONG AlignmentMask; + ULONG NumberOfAccessRanges; + ACCESS_RANGE (*AccessRanges)[]; + PVOID Reserved; + UCHAR NumberOfBuses; + UCHAR InitiatorBusId[8]; + BOOLEAN ScatterGather; + BOOLEAN Master; + BOOLEAN CachesData; + BOOLEAN AdapterScansDown; + BOOLEAN AtdiskPrimaryClaimed; + BOOLEAN AtdiskSecondaryClaimed; + BOOLEAN Dma32BitAddresses; + BOOLEAN DemandMode; + BOOLEAN MapBuffers; + BOOLEAN NeedPhysicalAddresses; + BOOLEAN TaggedQueueing; + BOOLEAN AutoRequestSense; + BOOLEAN MultipleRequestPerLu; + BOOLEAN ReceiveEvent; + BOOLEAN RealModeInitialized; + BOOLEAN BufferAccessScsiPortControlled; + UCHAR MaximumNumberOfTargets; + UCHAR ReservedUchars[2]; + ULONG SlotNumber; + ULONG BusInterruptLevel2; + ULONG BusInterruptVector2; + KINTERRUPT_MODE InterruptMode2; + ULONG DmaChannel2; + ULONG DmaPort2; + DMA_WIDTH DmaWidth2; + DMA_SPEED DmaSpeed2; + ULONG DeviceExtensionSize; + ULONG SpecificLuExtensionSize; + ULONG SrbExtensionSize; + UCHAR Dma64BitAddresses; + BOOLEAN ResetTargetSupported; + UCHAR MaximumNumberOfLogicalUnits; + BOOLEAN WmiDataProvider; +} PORT_CONFIGURATION_INFORMATION, *PPORT_CONFIGURATION_INFORMATION; + +#define CONFIG_INFO_VERSION_2 sizeof(PORT_CONFIGURATION_INFORMATION) + +typedef enum _SCSI_NOTIFICATION_TYPE { + RequestComplete, + NextRequest, + NextLuRequest, + ResetDetected, + CallDisableInterrupts, + CallEnableInterrupts, + RequestTimerCall, + BusChangeDetected, + WMIEvent, + WMIReregister +} SCSI_NOTIFICATION_TYPE, *PSCSI_NOTIFICATION_TYPE; + +#ifdef __GNUC__ +__extension__ /* enums limited to range of integer */ +#endif +typedef enum _SCSI_ADAPTER_CONTROL_TYPE { + ScsiQuerySupportedControlTypes = 0, + ScsiStopAdapter, + ScsiRestartAdapter, + ScsiSetBootConfig, + ScsiSetRunningConfig, + ScsiAdapterControlMax, + MakeAdapterControlTypeSizeOfUlong = 0xffffffff +} SCSI_ADAPTER_CONTROL_TYPE, *PSCSI_ADAPTER_CONTROL_TYPE; + +typedef enum _SCSI_ADAPTER_CONTROL_STATUS { + ScsiAdapterControlSuccess = 0, + ScsiAdapterControlUnsuccessful +} SCSI_ADAPTER_CONTROL_STATUS, *PSCSI_ADAPTER_CONTROL_STATUS; + +typedef struct _SCSI_SUPPORTED_CONTROL_TYPE_LIST { + ULONG MaxControlType; + BOOLEAN SupportedTypeList[0]; +} SCSI_SUPPORTED_CONTROL_TYPE_LIST, *PSCSI_SUPPORTED_CONTROL_TYPE_LIST; + +typedef SCSI_ADAPTER_CONTROL_STATUS DDKAPI +(*PHW_ADAPTER_CONTROL)( + IN PVOID DeviceExtension, + IN SCSI_ADAPTER_CONTROL_TYPE ControlType, + IN PVOID Parameters); + +typedef BOOLEAN DDKAPI +(*PHW_ADAPTER_STATE)( + IN PVOID DeviceExtension, + IN PVOID Context, + IN BOOLEAN SaveState); + +#define SP_RETURN_NOT_FOUND 0 +#define SP_RETURN_FOUND 1 +#define SP_RETURN_ERROR 2 +#define SP_RETURN_BAD_CONFIG 3 + +typedef ULONG DDKAPI +(*PHW_FIND_ADAPTER)( + IN PVOID DeviceExtension, + IN PVOID HwContext, + IN PVOID BusInformation, + IN PCHAR ArgumentString, + IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo, + OUT PBOOLEAN Again); + +typedef BOOLEAN DDKAPI +(*PHW_INITIALIZE)( + IN PVOID DeviceExtension); + +typedef BOOLEAN DDKAPI +(*PHW_INTERRUPT)( + IN PVOID DeviceExtension); + +typedef BOOLEAN DDKAPI +(*PHW_RESET_BUS)( + IN PVOID DeviceExtension, + IN ULONG PathId); + +typedef VOID DDKAPI +(*PHW_DMA_STARTED)( + IN PVOID DeviceExtension); + +typedef BOOLEAN DDKAPI +(*PHW_STARTIO)( + IN PVOID DeviceExtension, + IN PSCSI_REQUEST_BLOCK Srb); + +typedef VOID DDKAPI +(*PHW_TIMER)( + IN PVOID DeviceExtension); + +typedef struct _HW_INITIALIZATION_DATA { + ULONG HwInitializationDataSize; + INTERFACE_TYPE AdapterInterfaceType; + PHW_INITIALIZE HwInitialize; + PHW_STARTIO HwStartIo; + PHW_INTERRUPT HwInterrupt; + PHW_FIND_ADAPTER HwFindAdapter; + PHW_RESET_BUS HwResetBus; + PHW_DMA_STARTED HwDmaStarted; + PHW_ADAPTER_STATE HwAdapterState; + ULONG DeviceExtensionSize; + ULONG SpecificLuExtensionSize; + ULONG SrbExtensionSize; + ULONG NumberOfAccessRanges; + PVOID Reserved; + BOOLEAN MapBuffers; + BOOLEAN NeedPhysicalAddresses; + BOOLEAN TaggedQueueing; + BOOLEAN AutoRequestSense; + BOOLEAN MultipleRequestPerLu; + BOOLEAN ReceiveEvent; + USHORT VendorIdLength; + PVOID VendorId; + USHORT ReservedUshort; + USHORT DeviceIdLength; + PVOID DeviceId; + PHW_ADAPTER_CONTROL HwAdapterControl; +} HW_INITIALIZATION_DATA, *PHW_INITIALIZATION_DATA; + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortCompleteRequest( + IN PVOID HwDeviceExtension, + IN UCHAR PathId, + IN UCHAR TargetId, + IN UCHAR Lun, + IN UCHAR SrbStatus); + +/* + * ULONG + * ScsiPortConvertPhysicalAddressToUlong( + * IN SCSI_PHYSICAL_ADDRESS Address); + */ +#define ScsiPortConvertPhysicalAddressToUlong(Address) ((Address).LowPart) + +SCSIPORTAPI +SCSI_PHYSICAL_ADDRESS +DDKAPI +ScsiPortConvertUlongToPhysicalAddress( + IN ULONG UlongAddress); + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortFlushDma( + IN PVOID DeviceExtension); + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortFreeDeviceBase( + IN PVOID HwDeviceExtension, + IN PVOID MappedAddress); + +SCSIPORTAPI +ULONG +DDKAPI +ScsiPortGetBusData( + IN PVOID DeviceExtension, + IN ULONG BusDataType, + IN ULONG SystemIoBusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Length); + +SCSIPORTAPI +PVOID +DDKAPI +ScsiPortGetDeviceBase( + IN PVOID HwDeviceExtension, + IN INTERFACE_TYPE BusType, + IN ULONG SystemIoBusNumber, + IN SCSI_PHYSICAL_ADDRESS IoAddress, + IN ULONG NumberOfBytes, + IN BOOLEAN InIoSpace); + +SCSIPORTAPI +PVOID +DDKAPI +ScsiPortGetLogicalUnit( + IN PVOID HwDeviceExtension, + IN UCHAR PathId, + IN UCHAR TargetId, + IN UCHAR Lun); + +SCSIPORTAPI +SCSI_PHYSICAL_ADDRESS +DDKAPI +ScsiPortGetPhysicalAddress( + IN PVOID HwDeviceExtension, + IN PSCSI_REQUEST_BLOCK Srb OPTIONAL, + IN PVOID VirtualAddress, + OUT ULONG *Length); + +SCSIPORTAPI +PSCSI_REQUEST_BLOCK +DDKAPI +ScsiPortGetSrb( + IN PVOID DeviceExtension, + IN UCHAR PathId, + IN UCHAR TargetId, + IN UCHAR Lun, + IN LONG QueueTag); + +SCSIPORTAPI +PVOID +DDKAPI +ScsiPortGetUncachedExtension( + IN PVOID HwDeviceExtension, + IN PPORT_CONFIGURATION_INFORMATION ConfigInfo, + IN ULONG NumberOfBytes); + +SCSIPORTAPI +PVOID +DDKAPI +ScsiPortGetVirtualAddress( + IN PVOID HwDeviceExtension, + IN SCSI_PHYSICAL_ADDRESS PhysicalAddress); + +SCSIPORTAPI +ULONG +DDKAPI +ScsiPortInitialize( + IN PVOID Argument1, + IN PVOID Argument2, + IN struct _HW_INITIALIZATION_DATA *HwInitializationData, + IN PVOID HwContext OPTIONAL); + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortIoMapTransfer( + IN PVOID HwDeviceExtension, + IN PSCSI_REQUEST_BLOCK Srb, + IN ULONG LogicalAddress, + IN ULONG Length); + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortLogError( + IN PVOID HwDeviceExtension, + IN PSCSI_REQUEST_BLOCK Srb OPTIONAL, + IN UCHAR PathId, + IN UCHAR TargetId, + IN UCHAR Lun, + IN ULONG ErrorCode, + IN ULONG UniqueId); + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortMoveMemory( + IN PVOID WriteBuffer, + IN PVOID ReadBuffer, + IN ULONG Length); + +SCSIPORTAPI +VOID +DDKCDECLAPI +ScsiPortNotification( + IN SCSI_NOTIFICATION_TYPE NotificationType, + IN PVOID HwDeviceExtension, + IN ...); + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortQuerySystemTime( + OUT PLARGE_INTEGER CurrentTime); + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortReadPortBufferUchar( + IN PUCHAR Port, + IN PUCHAR Buffer, + IN ULONG Count); + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortReadPortBufferUlong( + IN PULONG Port, + IN PULONG Buffer, + IN ULONG Count); + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortReadPortBufferUshort( + IN PUSHORT Port, + IN PUSHORT Buffer, + IN ULONG Count); + +SCSIPORTAPI +UCHAR +DDKAPI +ScsiPortReadPortUchar( + IN PUCHAR Port); + +SCSIPORTAPI +ULONG +DDKAPI +ScsiPortReadPortUlong( + IN PULONG Port); + +SCSIPORTAPI +USHORT +DDKAPI +ScsiPortReadPortUshort( + IN PUSHORT Port); + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortReadRegisterBufferUchar( + IN PUCHAR Register, + IN PUCHAR Buffer, + IN ULONG Count); + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortReadRegisterBufferUlong( + IN PULONG Register, + IN PULONG Buffer, + IN ULONG Count); + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortReadRegisterBufferUshort( + IN PUSHORT Register, + IN PUSHORT Buffer, + IN ULONG Count); + +SCSIPORTAPI +UCHAR +DDKAPI +ScsiPortReadRegisterUchar( + IN PUCHAR Register); + +SCSIPORTAPI +ULONG +DDKAPI +ScsiPortReadRegisterUlong( + IN PULONG Register); + +SCSIPORTAPI +USHORT +DDKAPI +ScsiPortReadRegisterUshort( + IN PUSHORT Register); + +SCSIPORTAPI +ULONG +DDKAPI +ScsiPortSetBusDataByOffset( + IN PVOID DeviceExtension, + IN ULONG BusDataType, + IN ULONG SystemIoBusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortStallExecution( + IN ULONG Delay); + +SCSIPORTAPI +BOOLEAN +DDKAPI +ScsiPortValidateRange( + IN PVOID HwDeviceExtension, + IN INTERFACE_TYPE BusType, + IN ULONG SystemIoBusNumber, + IN SCSI_PHYSICAL_ADDRESS IoAddress, + IN ULONG NumberOfBytes, + IN BOOLEAN InIoSpace); + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortWritePortBufferUchar( + IN PUCHAR Port, + IN PUCHAR Buffer, + IN ULONG Count); + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortWritePortBufferUlong( + IN PULONG Port, + IN PULONG Buffer, + IN ULONG Count); + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortWritePortBufferUshort( + IN PUSHORT Port, + IN PUSHORT Buffer, + IN ULONG Count); + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortWritePortUchar( + IN PUCHAR Port, + IN UCHAR Value); + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortWritePortUlong( + IN PULONG Port, + IN ULONG Value); + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortWritePortUshort( + IN PUSHORT Port, + IN USHORT Value); + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortWriteRegisterBufferUchar( + IN PUCHAR Register, + IN PUCHAR Buffer, + IN ULONG Count); + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortWriteRegisterBufferUlong( + IN PULONG Register, + IN PULONG Buffer, + IN ULONG Count); + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortWriteRegisterBufferUshort( + IN PUSHORT Register, + IN PUSHORT Buffer, + IN ULONG Count); + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortWriteRegisterUchar( + IN PUCHAR Register, + IN ULONG Value); + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortWriteRegisterUlong( + IN PULONG Register, + IN ULONG Value); + +SCSIPORTAPI +VOID +DDKAPI +ScsiPortWriteRegisterUshort( + IN PUSHORT Register, + IN USHORT Value); + +SCSIPORTAPI +VOID +DDKCDECLAPI +ScsiDebugPrint( + IN ULONG DebugPrintLevel, + IN PCCHAR DebugMessage, + IN ...); + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __SRB_H */ diff --git a/reactos/w32api/include/ddk/storport.h b/reactos/w32api/include/ddk/storport.h new file mode 100644 index 00000000000..a97fc7a4e1e --- /dev/null +++ b/reactos/w32api/include/ddk/storport.h @@ -0,0 +1,426 @@ +/* + * storport.h + * + * StorPort interface + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __STORPORT_H +#define __STORPORT_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" +#include "srb.h" + +#if defined(_STORPORT_) + #define STORPORTAPI DECLSPEC_EXPORT +#else + #define STORPORTAPI DECLSPEC_IMPORT +#endif + + +typedef PHYSICAL_ADDRESS STOR_PHYSICAL_ADDRESS; + +typedef struct _STOR_SCATTER_GATHER_ELEMENT { + STOR_PHYSICAL_ADDRESS PhysicalAddress; + ULONG Length; + ULONG_PTR Reserved; +} STOR_SCATTER_GATHER_ELEMENT, *PSTOR_SCATTER_GATHER_ELEMENT; + +typedef struct _STOR_SCATTER_GATHER_LIST { + ULONG NumberOfElements; + ULONG_PTR Reserved; + STOR_SCATTER_GATHER_ELEMENT List[0]; +} STOR_SCATTER_GATHER_LIST, *PSTOR_SCATTER_GATHER_LIST; + +typedef struct _SCSI_WMI_REQUEST_BLOCK { + USHORT Length; + UCHAR Function; + UCHAR SrbStatus; + UCHAR WMISubFunction; + UCHAR PathId; + UCHAR TargetId; + UCHAR Lun; + UCHAR Reserved1; + UCHAR WMIFlags; + UCHAR Reserved2[2]; + ULONG SrbFlags; + ULONG DataTransferLength; + ULONG TimeOutValue; + PVOID DataBuffer; + PVOID DataPath; + PVOID Reserved3; + PVOID OriginalRequest; + PVOID SrbExtension; + ULONG Reserved4; + UCHAR Reserved5[16]; +} SCSI_WMI_REQUEST_BLOCK, *PSCSI_WMI_REQUEST_BLOCK; + + +STORPORTAPI +ULONG +DDKAPI +StorPortInitialize( + IN PVOID Argument1, + IN PVOID Argument2, + IN PHW_INITIALIZATION_DATA HwInitializationData, + IN PVOID Unused); + +STORPORTAPI +VOID +DDKAPI +StorPortFreeDeviceBase( + IN PVOID HwDeviceExtension, + IN PVOID MappedAddress); + +STORPORTAPI +ULONG +DDKAPI +StorPortGetBusData( + IN PVOID DeviceExtension, + IN ULONG BusDataType, + IN ULONG SystemIoBusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Length); + +STORPORTAPI +ULONG +DDKAPI +StorPortSetBusDataByOffset( + IN PVOID DeviceExtension, + IN ULONG BusDataType, + IN ULONG SystemIoBusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +STORPORTAPI +PVOID +DDKAPI +StorPortGetDeviceBase( + IN PVOID HwDeviceExtension, + IN INTERFACE_TYPE BusType, + IN ULONG SystemIoBusNumber, + IN SCSI_PHYSICAL_ADDRESS IoAddress, + IN ULONG NumberOfBytes, + IN BOOLEAN InIoSpace); + +STORPORTAPI +PVOID +DDKAPI +StorPortGetLogicalUnit( + IN PVOID HwDeviceExtension, + IN UCHAR PathId, + IN UCHAR TargetId, + IN UCHAR Lun); + +STORPORTAPI +PSCSI_REQUEST_BLOCK +DDKAPI +StorPortGetSrb( + IN PVOID DeviceExtension, + IN UCHAR PathId, + IN UCHAR TargetId, + IN UCHAR Lun, + IN LONG QueueTag); + +STORPORTAPI +STOR_PHYSICAL_ADDRESS +DDKAPI +StorPortGetPhysicalAddress( + IN PVOID HwDeviceExtension, + IN PSCSI_REQUEST_BLOCK Srb, + IN PVOID VirtualAddress, + OUT ULONG *Length); + +STORPORTAPI +PVOID +DDKAPI +StorPortGetVirtualAddress( + IN PVOID HwDeviceExtension, + IN STOR_PHYSICAL_ADDRESS PhysicalAddress); + +STORPORTAPI +PVOID +DDKAPI +StorPortGetUncachedExtension( + IN PVOID HwDeviceExtension, + IN PPORT_CONFIGURATION_INFORMATION ConfigInfo, + IN ULONG NumberOfBytes); + +STORPORTAPI +VOID +DDKCDECLAPI +StorPortNotification( + IN SCSI_NOTIFICATION_TYPE NotificationType, + IN PVOID HwDeviceExtension, + IN ...); + +STORPORTAPI +VOID +DDKAPI +StorPortLogError( + IN PVOID HwDeviceExtension, + IN PSCSI_REQUEST_BLOCK Srb OPTIONAL, + IN UCHAR PathId, + IN UCHAR TargetId, + IN UCHAR Lun, + IN ULONG ErrorCode, + IN ULONG UniqueId); + +STORPORTAPI +VOID +DDKAPI +StorPortCompleteRequest( + IN PVOID HwDeviceExtension, + IN UCHAR PathId, + IN UCHAR TargetId, + IN UCHAR Lun, + IN UCHAR SrbStatus); + +STORPORTAPI +VOID +DDKAPI +StorPortMoveMemory( + IN PVOID WriteBuffer, + IN PVOID ReadBuffer, + IN ULONG Length); + +STORPORTAPI +VOID +DDKAPI +StorPortStallExecution( + IN ULONG Delay); + +STORPORTAPI +STOR_PHYSICAL_ADDRESS +DDKAPI +StorPortConvertUlong64ToPhysicalAddress( + IN ULONG64 UlongAddress); + +STORPORTAPI +ULONG64 +DDKAPI +StorPortConvertPhysicalAddressToUlong64( + IN STOR_PHYSICAL_ADDRESS Address); + +STORPORTAPI +BOOLEAN +DDKAPI +StorPortValidateRange( + IN PVOID HwDeviceExtension, + IN INTERFACE_TYPE BusType, + IN ULONG SystemIoBusNumber, + IN STOR_PHYSICAL_ADDRESS IoAddress, + IN ULONG NumberOfBytes, + IN BOOLEAN InIoSpace); + +STORPORTAPI +VOID +DDKCDECLAPI +StorPortDebugPrint( + IN ULONG DebugPrintLevel, + IN PCCHAR DebugMessage, + IN ...); + +STORPORTAPI +UCHAR +DDKAPI +StorPortReadPortUchar( + IN PUCHAR Port); + +STORPORTAPI +ULONG +DDKAPI +StorPortReadPortUlong( + IN PULONG Port); + +STORPORTAPI +USHORT +DDKAPI +StorPortReadPortUshort( + IN PUSHORT Port); + +STORPORTAPI +UCHAR +DDKAPI +StorPortReadRegisterUchar( + IN PUCHAR Register); + +STORPORTAPI +ULONG +DDKAPI +StorPortReadRegisterUlong( + IN PULONG Register); + +STORPORTAPI +USHORT +DDKAPI +StorPortReadRegisterUshort( + IN PUSHORT Register); + +STORPORTAPI +VOID +DDKAPI +StorPortWritePortUchar( + IN PUCHAR Port, + IN UCHAR Value); + +STORPORTAPI +VOID +DDKAPI +StorPortWritePortUlong( + IN PULONG Port, + IN ULONG Value); + +STORPORTAPI +VOID +DDKAPI +StorPortWritePortUshort( + IN PUSHORT Port, + IN USHORT Value); + +STORPORTAPI +VOID +DDKAPI +StorPortWriteRegisterUchar( + IN PUCHAR Port, + IN UCHAR Value); + +STORPORTAPI +VOID +DDKAPI +StorPortWriteRegisterUlong( + IN PULONG Port, + IN ULONG Value); + +STORPORTAPI +VOID +DDKAPI +StorPortWriteRegisterUshort( + IN PUSHORT Port, + IN USHORT Value); + +STORPORTAPI +BOOLEAN +DDKAPI +StorPortPauseDevice( + IN PVOID HwDeviceExtension, + IN UCHAR PathId, + IN UCHAR TargetId, + IN UCHAR Lun, + IN ULONG TimeOut); + +STORPORTAPI +BOOLEAN +DDKAPI +StorPortResumeDevice( + IN PVOID HwDeviceExtension, + IN UCHAR PathId, + IN UCHAR TargetId, + IN UCHAR Lun); + +STORPORTAPI +BOOLEAN +DDKAPI +StorPortPause( + IN PVOID HwDeviceExtension, + IN ULONG TimeOut); + +STORPORTAPI +BOOLEAN +DDKAPI +StorPortResume( + IN PVOID HwDeviceExtension); + +STORPORTAPI +BOOLEAN +DDKAPI +StorPortDeviceBusy( + IN PVOID HwDeviceExtension, + IN UCHAR PathId, + IN UCHAR TargetId, + IN UCHAR Lun, + IN ULONG RequestsToComplete); + +STORPORTAPI +BOOLEAN +DDKAPI +StorPortDeviceReady( + IN PVOID HwDeviceExtension, + IN UCHAR PathId, + IN UCHAR TargetId, + IN UCHAR Lun); + +STORPORTAPI +BOOLEAN +DDKAPI +StorPortBusy( + IN PVOID HwDeviceExtension, + IN ULONG RequestsToComplete); + +STORPORTAPI +BOOLEAN +DDKAPI +StorPortReady( + IN PVOID HwDeviceExtension); + +STORPORTAPI +PSTOR_SCATTER_GATHER_LIST +DDKAPI +StorPortGetScatterGatherList( + IN PVOID DeviceExtension, + IN PSCSI_REQUEST_BLOCK Srb); + +typedef BOOLEAN DDKAPI +(*PSTOR_SYNCHRONIZED_ACCESS)( + IN PVOID HwDeviceExtension, + IN PVOID Context); + +STORPORTAPI +VOID +DDKAPI +StorPortSynchronizeAccess( + IN PVOID HwDeviceExtension, + IN PSTOR_SYNCHRONIZED_ACCESS SynchronizedAccessRoutine, + IN PVOID Context); + +#ifdef DBG +#define DebugPrint(x) StorPortDebugPrint x +#else +#define DebugPrint(x) +#endif + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __STORPORT_H */ diff --git a/reactos/w32api/include/ddk/tdi.h b/reactos/w32api/include/ddk/tdi.h new file mode 100644 index 00000000000..46d01a29941 --- /dev/null +++ b/reactos/w32api/include/ddk/tdi.h @@ -0,0 +1,597 @@ +/* + * tdi.h + * + * TDI user mode definitions + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __TDI_H +#define __TDI_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" +#include "ntddtdi.h" +#include "tdistat.h" +#include "netpnp.h" + + +/* Basic types */ + +typedef LONG TDI_STATUS; +typedef PVOID CONNECTION_CONTEXT; + +typedef struct _TDI_CONNECTION_INFORMATION { + LONG UserDataLength; + PVOID UserData; + LONG OptionsLength; + PVOID Options; + LONG RemoteAddressLength; + PVOID RemoteAddress; +} TDI_CONNECTION_INFORMATION, *PTDI_CONNECTION_INFORMATION; + +typedef struct _TDI_REQUEST { + union { + HANDLE AddressHandle; + CONNECTION_CONTEXT ConnectionContext; + HANDLE ControlChannel; + } Handle; + PVOID RequestNotifyObject; + PVOID RequestContext; + TDI_STATUS TdiStatus; +} TDI_REQUEST, *PTDI_REQUEST; + +typedef struct _TDI_REQUEST_STATUS { + TDI_STATUS Status; + PVOID RequestContext; + ULONG BytesTransferred; +} TDI_REQUEST_STATUS, *PTDI_REQUEST_STATUS; + +typedef struct _TA_ADDRESS { + USHORT AddressLength; + USHORT AddressType; + UCHAR Address[1]; +} TA_ADDRESS, *PTA_ADDRESS; + +#define TDI_ADDRESS_TYPE_UNSPEC 0 +#define TDI_ADDRESS_TYPE_UNIX 1 +#define TDI_ADDRESS_TYPE_IP 2 +#define TDI_ADDRESS_TYPE_IMPLINK 3 +#define TDI_ADDRESS_TYPE_PUP 4 +#define TDI_ADDRESS_TYPE_CHAOS 5 +#define TDI_ADDRESS_TYPE_NS 6 +#define TDI_ADDRESS_TYPE_IPX 6 +#define TDI_ADDRESS_TYPE_NBS 7 +#define TDI_ADDRESS_TYPE_ECMA 8 +#define TDI_ADDRESS_TYPE_DATAKIT 9 +#define TDI_ADDRESS_TYPE_CCITT 10 +#define TDI_ADDRESS_TYPE_SNA 11 +#define TDI_ADDRESS_TYPE_DECnet 12 +#define TDI_ADDRESS_TYPE_DLI 13 +#define TDI_ADDRESS_TYPE_LAT 14 +#define TDI_ADDRESS_TYPE_HYLINK 15 +#define TDI_ADDRESS_TYPE_APPLETALK 16 +#define TDI_ADDRESS_TYPE_NETBIOS 17 +#define TDI_ADDRESS_TYPE_8022 18 +#define TDI_ADDRESS_TYPE_OSI_TSAP 19 +#define TDI_ADDRESS_TYPE_NETONE 20 +#define TDI_ADDRESS_TYPE_VNS 21 +#define TDI_ADDRESS_TYPE_NETBIOS_EX 22 +#define TDI_ADDRESS_TYPE_IP6 23 +#define TDI_ADDRESS_TYPE_NETBIOS_UNICODE_EX 24 + +#define TdiTransportAddress "TransportAddress" +#define TdiConnectionContext "ConnectionContext" +#define TDI_TRANSPORT_ADDRESS_LENGTH (sizeof(TdiTransportAddress) - 1) +#define TDI_CONNECTION_CONTEXT_LENGTH (sizeof(TdiConnectionContext) - 1) + +typedef struct _TRANSPORT_ADDRESS { + LONG TAAddressCount; + TA_ADDRESS Address[1]; +} TRANSPORT_ADDRESS, *PTRANSPORT_ADDRESS; + +typedef struct _TDI_ADDRESS_INFO { + ULONG ActivityCount; + TRANSPORT_ADDRESS Address; +} TDI_ADDRESS_INFO, *PTDI_ADDRESS_INFO; + +typedef struct _TDI_ACTION_HEADER { + ULONG TransportId; + USHORT ActionCode; + USHORT Reserved; +} TDI_ACTION_HEADER, *PTDI_ACTION_HEADER; + +typedef struct _TDI_ADDRESS_8022 { + UCHAR MACAddress[6]; +} TDI_ADDRESS_8022, *PTDI_ADDRESS_8022; + +#define TDI_ADDRESS_LENGTH_8022 sizeof(TDI_ADDRESS_8022); + +typedef struct _TDI_ADDRESS_APPLETALK { + USHORT Network; + UCHAR Node; + UCHAR Socket; +} TDI_ADDRESS_APPLETALK, *PTDI_ADDRESS_APPLETALK; + +#define TDI_ADDRESS_LENGTH_APPLETALK sizeof(TDI_ADDRESS_APPLETALK) + +typedef struct _TDI_ADDRESS_IP { + USHORT sin_port; + ULONG in_addr; + UCHAR sin_zero[8]; +} TDI_ADDRESS_IP, *PTDI_ADDRESS_IP; + +#define TDI_ADDRESS_LENGTH_IP sizeof(TDI_ADDRESS_IP) + +typedef struct _TDI_ADDRESS_IPX { + ULONG NetworkAddress; + UCHAR NodeAddress[6]; + USHORT Socket; +} TDI_ADDRESS_IPX, *PTDI_ADDRESS_IPX; + +#define TDI_ADDRESS_LENGTH_IPX sizeof(TDI_ADDRESS_IPX) + +/* TDI_ADDRESS_NETBIOS.NetbiosNameType constants */ +#define TDI_ADDRESS_NETBIOS_TYPE_UNIQUE 0x0000 +#define TDI_ADDRESS_NETBIOS_TYPE_GROUP 0x0001 +#define TDI_ADDRESS_NETBIOS_TYPE_QUICK_UNIQUE 0x0002 +#define TDI_ADDRESS_NETBIOS_TYPE_QUICK_GROUP 0x0003 + +typedef struct _TDI_ADDRESS_NETBIOS { + USHORT NetbiosNameType; + UCHAR NetbiosName[16]; +} TDI_ADDRESS_NETBIOS, *PTDI_ADDRESS_NETBIOS; + +#define TDI_ADDRESS_LENGTH_NETBIOS sizeof(TDI_ADDRESS_NETBIOS) + +typedef struct _TDI_ADDRESS_NETBIOS_EX { + UCHAR EndpointName[16]; + TDI_ADDRESS_NETBIOS NetbiosAddress; +} TDI_ADDRESS_NETBIOS_EX, *PTDI_ADDRESS_NETBIOS_EX; + +#define TDI_ADDRESS_LENGTH_NETBIOS_EX sizeof(TDI_ADDRESS_NETBIOS_EX) + +/* TDI_ADDRESS_NETONE.NetoneNameType constants */ +#define TDI_ADDRESS_NETONE_TYPE_UNIQUE 0x0000 +#define TDI_ADDRESS_NETONE_TYPE_ROTORED 0x0001 + +typedef struct _TDI_ADDRESS_NETONE { + USHORT NetoneNameType; + UCHAR NetoneName[20]; +} TDI_ADDRESS_NETONE, *PTDI_ADDRESS_NETONE; + +#define TDI_ADDRESS_LENGTH_NETONE sizeof(TDI_ADDRESS_NETONE) + +typedef struct _TDI_ADDRESS_NS +{ + ULONG NetworkAddress; + UCHAR NodeAddress[6]; + USHORT Socket; +} TDI_ADDRESS_NS, *PTDI_ADDRESS_NS; + +#define TDI_ADDRESS_LENGTH_NS sizeof(TDI_ADDRESS_NS) + +#define ISO_MAX_ADDR_LENGTH 64 + +/* TDI_ADDRESS_OSI_TSAP.tp_addr_type constants */ +#define ISO_HIERARCHICAL 0 +#define ISO_NON_HIERARCHICAL 1 + +typedef struct _TDI_ADDRESS_OSI_TSAP { + USHORT tp_addr_type; + USHORT tp_taddr_len; + USHORT tp_tsel_len; + UCHAR tp_addr[ISO_MAX_ADDR_LENGTH]; +} TDI_ADDRESS_OSI_TSAP, *PTDI_ADDRESS_OSI_TSAP; + +#define TDI_ADDRESS_LENGTH_OSI_TSAP sizeof(TDI_ADDRESS_OSI_TSAP) + +typedef struct _TDI_ADDRESS_VNS { + UCHAR net_address[4]; + UCHAR subnet_addr[2]; + UCHAR port[2]; + UCHAR hops; + UCHAR filler[5]; +} TDI_ADDRESS_VNS, *PTDI_ADDRESS_VNS; + +#define TDI_ADDRESS_LENGTH_VNS sizeof(TDI_ADDRESS_VNS) + +typedef struct _TDI_ADDRESS_IP6 { + USHORT sin6_port; + ULONG sin6_flowinfo; + USHORT sin6_addr[8]; + ULONG sin6_scope_id; +} TDI_ADDRESS_IP6, *PTDI_ADDRESS_IP6; + +#define TDI_ADDRESS_LENGTH_IP6 sizeof(TDI_ADDRESS_IP6) + +enum eNameBufferType { + NBT_READONLY = 0, + NBT_WRITEONLY, + NBT_READWRITE, + NBT_WRITTEN +}; + +typedef struct _TDI_ADDRESS_NETBIOS_UNICODE_EX { + USHORT NetbiosNameType; + enum eNameBufferType NameBufferType; + UNICODE_STRING EndpointName; + UNICODE_STRING RemoteName; + WCHAR EndpointBuffer[17]; + WCHAR RemoteNameBuffer[1]; +} TDI_ADDRESS_NETBIOS_UNICODE_EX, *PTDI_ADDRESS_NETBIOS_UNICODE_EX; + + +typedef struct _TDI_CONNECT_REQUEST { + TDI_REQUEST Request; + PTDI_CONNECTION_INFORMATION RequestConnectionInformation; + PTDI_CONNECTION_INFORMATION ReturnConnectionInformation; + LARGE_INTEGER Timeout; +} TDI_REQUEST_CONNECT, *PTDI_REQUEST_CONNECT; + +typedef struct _TDI_REQUEST_ACCEPT { + TDI_REQUEST Request; + PTDI_CONNECTION_INFORMATION RequestConnectionInformation; + PTDI_CONNECTION_INFORMATION ReturnConnectionInformation; +} TDI_REQUEST_ACCEPT, *PTDI_REQUEST_ACCEPT; + +typedef struct _TDI_REQUEST_LISTEN { + TDI_REQUEST Request; + PTDI_CONNECTION_INFORMATION RequestConnectionInformation; + PTDI_CONNECTION_INFORMATION ReturnConnectionInformation; + USHORT ListenFlags; +} TDI_REQUEST_LISTEN, *PTDI_REQUEST_LISTEN; + +typedef struct _TDI_DISCONNECT_REQUEST { + TDI_REQUEST Request; + LARGE_INTEGER Timeout; +} TDI_REQUEST_DISCONNECT, *PTDI_REQUEST_DISCONNECT; + +typedef struct _TDI_REQUEST_SEND { + TDI_REQUEST Request; + USHORT SendFlags; +} TDI_REQUEST_SEND, *PTDI_REQUEST_SEND; + +typedef struct _TDI_REQUEST_RECEIVE { + TDI_REQUEST Request; + USHORT ReceiveFlags; +} TDI_REQUEST_RECEIVE, *PTDI_REQUEST_RECEIVE; + +typedef struct _TDI_REQUEST_SEND_DATAGRAM { + TDI_REQUEST Request; + PTDI_CONNECTION_INFORMATION SendDatagramInformation; +} TDI_REQUEST_SEND_DATAGRAM, *PTDI_REQUEST_SEND_DATAGRAM; + +typedef struct _TDI_REQUEST_RECEIVE_DATAGRAM { + TDI_REQUEST Request; + PTDI_CONNECTION_INFORMATION ReceiveDatagramInformation; + PTDI_CONNECTION_INFORMATION ReturnInformation; + USHORT ReceiveFlags; +} TDI_REQUEST_RECEIVE_DATAGRAM, *PTDI_REQUEST_RECEIVE_DATAGRAM; + +typedef struct _TDI_REQUEST_SET_EVENT { + TDI_REQUEST Request; + LONG EventType; + PVOID EventHandler; + PVOID EventContext; +} TDI_REQUEST_SET_EVENT_HANDLER, *PTDI_REQUEST_SET_EVENT_HANDLER; + +#define TDI_RECEIVE_BROADCAST 0x00000004 +#define TDI_RECEIVE_MULTICAST 0x00000008 +#define TDI_RECEIVE_PARTIAL 0x00000010 +#define TDI_RECEIVE_NORMAL 0x00000020 +#define TDI_RECEIVE_EXPEDITED 0x00000040 +#define TDI_RECEIVE_PEEK 0x00000080 +#define TDI_RECEIVE_NO_RESPONSE_EXP 0x00000100 +#define TDI_RECEIVE_COPY_LOOKAHEAD 0x00000200 +#define TDI_RECEIVE_ENTIRE_MESSAGE 0x00000400 +#define TDI_RECEIVE_AT_DISPATCH_LEVEL 0x00000800 +#define TDI_RECEIVE_CONTROL_INFO 0x00001000 + +/* Listen flags */ +#define TDI_QUERY_ACCEPT 0x00000001 + +/* Options used for both SendOptions and ReceiveIndicators */ +#define TDI_SEND_EXPEDITED 0x0020 +#define TDI_SEND_PARTIAL 0x0040 +#define TDI_SEND_NO_RESPONSE_EXPECTED 0x0080 +#define TDI_SEND_NON_BLOCKING 0x0100 +#define TDI_SEND_AND_DISCONNECT 0x0200 + +/* Disconnect Flags */ +#define TDI_DISCONNECT_WAIT 0x0001 +#define TDI_DISCONNECT_ABORT 0x0002 +#define TDI_DISCONNECT_RELEASE 0x0004 + +/* TdiRequest structure for TdiQueryInformation request */ +typedef struct _TDI_REQUEST_QUERY_INFORMATION { + TDI_REQUEST Request; + ULONG QueryType; + PTDI_CONNECTION_INFORMATION RequestConnectionInformation; +} TDI_REQUEST_QUERY_INFORMATION, *PTDI_REQUEST_QUERY_INFORMATION; + +/* TdiRequest structure for TdiSetInformation request */ +typedef struct _TDI_REQUEST_SET_INFORMATION { + TDI_REQUEST Request; + ULONG SetType; + PTDI_CONNECTION_INFORMATION RequestConnectionInformation; +} TDI_REQUEST_SET_INFORMATION, *PTDI_REQUEST_SET_INFORMATION; + +typedef TDI_REQUEST_SET_INFORMATION TDI_REQ_SET_INFORMATION, *PTDI_REQ_SET_INFORMATION; + +typedef union _TDI_REQUEST_TYPE { + TDI_REQUEST_ACCEPT TdiAccept; + TDI_REQUEST_CONNECT TdiConnect; + TDI_REQUEST_DISCONNECT TdiDisconnect; + TDI_REQUEST_LISTEN TdiListen; + TDI_REQUEST_QUERY_INFORMATION TdiQueryInformation; + TDI_REQUEST_RECEIVE TdiReceive; + TDI_REQUEST_RECEIVE_DATAGRAM TdiReceiveDatagram; + TDI_REQUEST_SEND TdiSend; + TDI_REQUEST_SEND_DATAGRAM TdiSendDatagram; + TDI_REQUEST_SET_EVENT_HANDLER TdiSetEventHandler; + TDI_REQUEST_SET_INFORMATION TdiSetInformation; +} TDI_REQUEST_TYPE, *PTDI_REQUEST_TYPE; + + +/* Query information types */ + +/* Generic query info types that must be supported by all transports */ +#define TDI_QUERY_BROADCAST_ADDRESS 0x00000001 +#define TDI_QUERY_PROVIDER_INFO 0x00000002 +#define TDI_QUERY_ADDRESS_INFO 0x00000003 +#define TDI_QUERY_CONNECTION_INFO 0x00000004 +#define TDI_QUERY_PROVIDER_STATISTICS 0x00000005 +#define TDI_QUERY_DATAGRAM_INFO 0x00000006 +#define TDI_QUERY_DATA_LINK_ADDRESS 0x00000007 +#define TDI_QUERY_NETWORK_ADDRESS 0x00000008 +#define TDI_QUERY_MAX_DATAGRAM_INFO 0x00000009 + +/* Netbios specific query information types */ +#define TDI_QUERY_ADAPTER_STATUS 0x00000100 +#define TDI_QUERY_SESSION_STATUS 0x00000200 +#define TDI_QUERY_FIND_NAME 0x00000300 + +typedef struct _TA_APPLETALK_ADDR { + LONG TAAddressCount; + struct _AddrAtalk { + USHORT AddressLength; + USHORT AddressType; + TDI_ADDRESS_APPLETALK Address[1]; + } Address[1]; +} TA_APPLETALK_ADDRESS, *PTA_APPLETALK_ADDRESS; + +typedef struct _TA_ADDRESS_IP { + LONG TAAddressCount; + struct _AddrIp { + USHORT AddressLength; + USHORT AddressType; + TDI_ADDRESS_IP Address[1]; + } Address[1]; +} TA_ADDRESS_IP, *PTA_ADDRESS_IP; + +typedef struct _TA_ADDRESS_IPX { + LONG TAAddressCount; + struct _AddrIpx { + USHORT AddressLength; + USHORT AddressType; + TDI_ADDRESS_IPX Address[1]; + } Address[1]; +} TA_IPX_ADDRESS, *PTA_IPX_ADDRESS; + +typedef struct _TA_NETBIOS_ADDRESS { + LONG TAAddressCount; + struct _Addr{ + USHORT AddressLength; + USHORT AddressType; + TDI_ADDRESS_NETBIOS Address[1]; + } Address[1]; +} TA_NETBIOS_ADDRESS, *PTA_NETBIOS_ADDRESS; + +typedef struct _TA_ADDRESS_NS { + LONG TAAddressCount; + struct _AddrNs { + USHORT AddressLength; + USHORT AddressType; + TDI_ADDRESS_NS Address[1]; + } Address[1]; +} TA_NS_ADDRESS, *PTA_NS_ADDRESS; + +typedef struct _TA_ADDRESS_VNS { + LONG TAAddressCount; + struct _AddrVns { + USHORT AddressLength; + USHORT AddressType; + TDI_ADDRESS_VNS Address[1]; + } Address[1]; +} TA_VNS_ADDRESS, *PTA_VNS_ADDRESS; + +typedef struct _TA_ADDRESS_IP6 { + LONG TAAddressCount; + struct _AddrIp6 { + USHORT AddressLength; + USHORT AddressType; + TDI_ADDRESS_IP6 Address[1]; + } Address [1]; +} TA_IP6_ADDRESS, *PTA_IP6_ADDRESS; + +typedef struct _TA_ADDRESS_NETBIOS_UNICODE_EX { + LONG TAAddressCount; + struct _AddrNetbiosWCharEx { + USHORT AddressLength; + USHORT AddressType; + TDI_ADDRESS_NETBIOS_UNICODE_EX Address[1]; + } Address [1]; +} TA_NETBIOS_UNICODE_EX_ADDRESS, *PTA_NETBIOS_UNICODE_EX_ADDRESS; + + +/* Structures used for TdiQueryInformation and TdiSetInformation */ + +typedef struct _TDI_ENDPOINT_INFO { + ULONG State; + ULONG Event; + ULONG TransmittedTsdus; + ULONG ReceivedTsdus; + ULONG TransmissionErrors; + ULONG ReceiveErrors; + ULONG MinimumLookaheadData; + ULONG MaximumLookaheadData; + ULONG PriorityLevel; + ULONG SecurityLevel; + ULONG SecurityCompartment; +} TDI_ENDPOINT_INFO, *PTDI_ENDPOINT_INFO; + +typedef struct _TDI_CONNECTION_INFO { + ULONG State; + ULONG Event; + ULONG TransmittedTsdus; + ULONG ReceivedTsdus; + ULONG TransmissionErrors; + ULONG ReceiveErrors; + LARGE_INTEGER Throughput; + LARGE_INTEGER Delay; + ULONG SendBufferSize; + ULONG ReceiveBufferSize; + BOOLEAN Unreliable; +} TDI_CONNECTION_INFO, *PTDI_CONNECTION_INFO; + +typedef struct _TDI_DATAGRAM_INFO { + ULONG MaximumDatagramBytes; + ULONG MaximumDatagramCount; +} TDI_DATAGRAM_INFO, *PTDI_DATAGRAM_INFO; + +typedef struct _TDI_MAX_DATAGRAM_INFO { + ULONG MaxDatagramSize; +} TDI_MAX_DATAGRAM_INFO, *PTDI_MAX_DATAGRAM_INFO; + +typedef struct _TDI_PROVIDER_INFO { + ULONG Version; + ULONG MaxSendSize; + ULONG MaxConnectionUserData; + ULONG MaxDatagramSize; + ULONG ServiceFlags; + ULONG MinimumLookaheadData; + ULONG MaximumLookaheadData; + ULONG NumberOfResources; + LARGE_INTEGER StartTime; +} TDI_PROVIDER_INFO, *PTDI_PROVIDER_INFO; + +#define TDI_SERVICE_CONNECTION_MODE 0x00000001 +#define TDI_SERVICE_ORDERLY_RELEASE 0x00000002 +#define TDI_SERVICE_CONNECTIONLESS_MODE 0x00000004 +#define TDI_SERVICE_ERROR_FREE_DELIVERY 0x00000008 +#define TDI_SERVICE_SECURITY_LEVEL 0x00000010 +#define TDI_SERVICE_BROADCAST_SUPPORTED 0x00000020 +#define TDI_SERVICE_MULTICAST_SUPPORTED 0x00000040 +#define TDI_SERVICE_DELAYED_ACCEPTANCE 0x00000080 +#define TDI_SERVICE_EXPEDITED_DATA 0x00000100 +#define TDI_SERVICE_INTERNAL_BUFFERING 0x00000200 +#define TDI_SERVICE_ROUTE_DIRECTED 0x00000400 +#define TDI_SERVICE_NO_ZERO_LENGTH 0x00000800 +#define TDI_SERVICE_POINT_TO_POINT 0x00001000 +#define TDI_SERVICE_MESSAGE_MODE 0x00002000 +#define TDI_SERVICE_HALF_DUPLEX 0x00004000 +#define TDI_SERVICE_DGRAM_CONNECTION 0x00008000 +#define TDI_SERVICE_FORCE_ACCESS_CHECK 0x00010000 +#define TDI_SERVICE_SEND_AND_DISCONNECT 0x00020000 +#define TDI_SERVICE_DIRECT_ACCEPT 0x00040000 +#define TDI_SERVICE_ACCEPT_LOCAL_ADDR 0x00080000 + +typedef struct _TDI_PROVIDER_RESOURCE_STATS { + ULONG ResourceId; + ULONG MaximumResourceUsed; + ULONG AverageResourceUsed; + ULONG ResourceExhausted; +} TDI_PROVIDER_RESOURCE_STATS, *PTDI_PROVIDER_RESOURCE_STATS; + +typedef struct _TDI_PROVIDER_STATISTICS { + ULONG Version; + ULONG OpenConnections; + ULONG ConnectionsAfterNoRetry; + ULONG ConnectionsAfterRetry; + ULONG LocalDisconnects; + ULONG RemoteDisconnects; + ULONG LinkFailures; + ULONG AdapterFailures; + ULONG SessionTimeouts; + ULONG CancelledConnections; + ULONG RemoteResourceFailures; + ULONG LocalResourceFailures; + ULONG NotFoundFailures; + ULONG NoListenFailures; + ULONG DatagramsSent; + LARGE_INTEGER DatagramBytesSent; + ULONG DatagramsReceived; + LARGE_INTEGER DatagramBytesReceived; + ULONG PacketsSent; + ULONG PacketsReceived; + ULONG DataFramesSent; + LARGE_INTEGER DataFrameBytesSent; + ULONG DataFramesReceived; + LARGE_INTEGER DataFrameBytesReceived; + ULONG DataFramesResent; + LARGE_INTEGER DataFrameBytesResent; + ULONG DataFramesRejected; + LARGE_INTEGER DataFrameBytesRejected; + ULONG ResponseTimerExpirations; + ULONG AckTimerExpirations; + ULONG MaximumSendWindow; + ULONG AverageSendWindow; + ULONG PiggybackAckQueued; + ULONG PiggybackAckTimeouts; + LARGE_INTEGER WastedPacketSpace; + ULONG WastedSpacePackets; + ULONG NumberOfResources; + TDI_PROVIDER_RESOURCE_STATS ResourceStats[1]; +} TDI_PROVIDER_STATISTICS, *PTDI_PROVIDER_STATISTICS; + +#define TDI_EVENT_CONNECT 0 +#define TDI_EVENT_DISCONNECT 1 +#define TDI_EVENT_ERROR 2 +#define TDI_EVENT_RECEIVE 3 +#define TDI_EVENT_RECEIVE_DATAGRAM 4 +#define TDI_EVENT_RECEIVE_EXPEDITED 5 +#define TDI_EVENT_SEND_POSSIBLE 6 + +typedef struct _TDI_REQUEST_ASSOCIATE { + TDI_REQUEST Request; + HANDLE AddressHandle; +} TDI_REQUEST_ASSOCIATE_ADDRESS, *PTDI_REQUEST_ASSOCIATE_ADDRESS; + +#define NDIS_PACKET_POOL_TAG_FOR_NWLNKIPX 'iPDN' +#define NDIS_PACKET_POOL_TAG_FOR_NWLNKSPX 'sPDN' +#define NDIS_PACKET_POOL_TAG_FOR_NWLNKNB 'nPDN' +#define NDIS_PACKET_POOL_TAG_FOR_TCPIP 'tPDN' +#define NDIS_PACKET_POOL_TAG_FOR_NBF 'bPDN' +#define NDIS_PACKET_POOL_TAG_FOR_APPLETALK 'aPDN' + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __TDI_H */ diff --git a/reactos/w32api/include/ddk/tdiinfo.h b/reactos/w32api/include/ddk/tdiinfo.h new file mode 100644 index 00000000000..a6248c880a7 --- /dev/null +++ b/reactos/w32api/include/ddk/tdiinfo.h @@ -0,0 +1,115 @@ +/* + * tdiinfo.h + * + * TDI set and query information interface + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __TDIINFO_H +#define __TDIINFO_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + + +typedef struct TDIEntityID { + ULONG tei_entity; + ULONG tei_instance; +} TDIEntityID; + +#define MAX_TDI_ENTITIES 4096 +#define INVALID_ENTITY_INSTANCE -1 +#define GENERIC_ENTITY 0 +#define ENTITY_LIST_ID 0 +#define ENTITY_TYPE_ID 1 + +#define AT_ENTITY 0x280 +#define CL_NL_ENTITY 0x301 +#define CL_TL_ENTITY 0x401 +#define CO_NL_ENTITY 0x300 +#define CO_TL_ENTITY 0x400 +#define ER_ENTITY 0x380 +#define IF_ENTITY 0x200 + +#define AT_ARP 0x280 +#define AT_NULL 0x282 +#define CL_TL_NBF 0x401 +#define CL_TL_UDP 0x403 +#define CL_NL_IPX 0x301 +#define CL_NL_IP 0x303 +#define CO_TL_NBF 0x400 +#define CO_TL_SPX 0x402 +#define CO_TL_TCP 0x404 +#define CO_TL_SPP 0x406 +#define ER_ICMP 0x380 +#define IF_GENERIC 0x200 +#define IF_MIB 0x202 + +/* TDIObjectID.toi_class constants */ +#define INFO_CLASS_GENERIC 0x100 +#define INFO_CLASS_PROTOCOL 0x200 +#define INFO_CLASS_IMPLEMENTATION 0x300 + +/* TDIObjectID.toi_type constants */ +#define INFO_TYPE_PROVIDER 0x100 +#define INFO_TYPE_ADDRESS_OBJECT 0x200 +#define INFO_TYPE_CONNECTION 0x300 + +typedef struct _TDIObjectID { + TDIEntityID toi_entity; + ULONG toi_class; + ULONG toi_type; + ULONG toi_id; +} TDIObjectID; + +#define CONTEXT_SIZE 16 + +typedef struct _TCP_REQUEST_QUERY_INFORMATION_EX { + TDIObjectID ID; + ULONG_PTR Context[CONTEXT_SIZE / sizeof(ULONG_PTR)]; +} TCP_REQUEST_QUERY_INFORMATION_EX, *PTCP_REQUEST_QUERY_INFORMATION_EX; + +#if defined(_WIN64) +typedef struct _TCP_REQUEST_QUERY_INFORMATION_EX32 { + TDIObjectID ID; + ULONG32 Context[CONTEXT_SIZE / sizeof(ULONG32)]; +} TCP_REQUEST_QUERY_INFORMATION_EX32, *PTCP_REQUEST_QUERY_INFORMATION_EX32; +#endif /* _WIN64 */ + +typedef struct _TCP_REQUEST_SET_INFORMATION_EX { + TDIObjectID ID; + UINT BufferSize; + UCHAR Buffer[1]; +} TCP_REQUEST_SET_INFORMATION_EX, *PTCP_REQUEST_SET_INFORMATION_EX; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __TDIINFO_H */ diff --git a/reactos/w32api/include/ddk/tdikrnl.h b/reactos/w32api/include/ddk/tdikrnl.h new file mode 100644 index 00000000000..7e684702afc --- /dev/null +++ b/reactos/w32api/include/ddk/tdikrnl.h @@ -0,0 +1,1166 @@ +/* + * tdikrnl.h + * + * TDI kernel mode definitions + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __TDIKRNL_H +#define __TDIKRNL_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" +#include "tdi.h" + +#if defined(_TDI_) + #define TDIKRNLAPI DECLSPEC_EXPORT +#else + #define TDIKRNLAPI DECLSPEC_IMPORT +#endif + + +typedef struct _TDI_REQUEST_KERNEL { + ULONG RequestFlags; + PTDI_CONNECTION_INFORMATION RequestConnectionInformation; + PTDI_CONNECTION_INFORMATION ReturnConnectionInformation; + PVOID RequestSpecific; +} TDI_REQUEST_KERNEL, *PTDI_REQUEST_KERNEL; + +/* Request codes */ +#define TDI_ASSOCIATE_ADDRESS 0x01 +#define TDI_DISASSOCIATE_ADDRESS 0x02 +#define TDI_CONNECT 0x03 +#define TDI_LISTEN 0x04 +#define TDI_ACCEPT 0x05 +#define TDI_DISCONNECT 0x06 +#define TDI_SEND 0x07 +#define TDI_RECEIVE 0x08 +#define TDI_SEND_DATAGRAM 0x09 +#define TDI_RECEIVE_DATAGRAM 0x0A +#define TDI_SET_EVENT_HANDLER 0x0B +#define TDI_QUERY_INFORMATION 0x0C +#define TDI_SET_INFORMATION 0x0D +#define TDI_ACTION 0x0E + +#define TDI_DIRECT_SEND 0x27 +#define TDI_DIRECT_SEND_DATAGRAM 0x29 + +#define TDI_TRANSPORT_ADDRESS_FILE 1 +#define TDI_CONNECTION_FILE 2 +#define TDI_CONTROL_CHANNEL_FILE 3 + +/* Internal TDI IOCTLS */ +#define IOCTL_TDI_QUERY_DIRECT_SEND_HANDLER _TDI_CONTROL_CODE(0x80, METHOD_NEITHER) +#define IOCTL_TDI_QUERY_DIRECT_SENDDG_HANDLER _TDI_CONTROL_CODE(0x81, METHOD_NEITHER) + +/* TdiAssociateAddress */ +typedef struct _TDI_REQUEST_KERNEL_ASSOCIATE { + HANDLE AddressHandle; +} TDI_REQUEST_KERNEL_ASSOCIATE, *PTDI_REQUEST_KERNEL_ASSOCIATE; + +/* TdiDisassociateAddress */ +typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_DISASSOCIATE, + *PTDI_REQUEST_KERNEL_DISASSOCIATE; + +/* TdiAccept */ +typedef struct _TDI_REQUEST_KERNEL_ACCEPT { + PTDI_CONNECTION_INFORMATION RequestConnectionInformation; + PTDI_CONNECTION_INFORMATION ReturnConnectionInformation; +} TDI_REQUEST_KERNEL_ACCEPT, *PTDI_REQUEST_KERNEL_ACCEPT; + +/* TdiConnect */ +typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_CONNECT, + *PTDI_REQUEST_KERNEL_CONNECT; + +/* TdiDisconnect */ +typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_DISCONNECT, + *PTDI_REQUEST_KERNEL_DISCONNECT; + +/* TdiListen */ +typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_LISTEN, + *PTDI_REQUEST_KERNEL_LISTEN; + +/* TdiReceive */ +typedef struct _TDI_REQUEST_KERNEL_RECEIVE { + ULONG ReceiveLength; + ULONG ReceiveFlags; +} TDI_REQUEST_KERNEL_RECEIVE, *PTDI_REQUEST_KERNEL_RECEIVE; + +/* TdiReceiveDatagram */ +typedef struct _TDI_REQUEST_KERNEL_RECEIVEDG { + ULONG ReceiveLength; + PTDI_CONNECTION_INFORMATION ReceiveDatagramInformation; + PTDI_CONNECTION_INFORMATION ReturnDatagramInformation; + ULONG ReceiveFlags; +} TDI_REQUEST_KERNEL_RECEIVEDG, *PTDI_REQUEST_KERNEL_RECEIVEDG; + +/* TdiSend */ +typedef struct _TDI_REQUEST_KERNEL_SEND { + ULONG SendLength; + ULONG SendFlags; +} TDI_REQUEST_KERNEL_SEND, *PTDI_REQUEST_KERNEL_SEND; + +/* TdiSendDatagram */ +typedef struct _TDI_REQUEST_KERNEL_SENDDG { + ULONG SendLength; + PTDI_CONNECTION_INFORMATION SendDatagramInformation; +} TDI_REQUEST_KERNEL_SENDDG, *PTDI_REQUEST_KERNEL_SENDDG; + +/* TdiSetEventHandler */ +typedef struct _TDI_REQUEST_KERNEL_SET_EVENT { + LONG EventType; + PVOID EventHandler; + PVOID EventContext; +} TDI_REQUEST_KERNEL_SET_EVENT, *PTDI_REQUEST_KERNEL_SET_EVENT; + +/* TdiQueryInformation */ +typedef struct _TDI_REQUEST_KERNEL_QUERY_INFO { + LONG QueryType; + PTDI_CONNECTION_INFORMATION RequestConnectionInformation; +} TDI_REQUEST_KERNEL_QUERY_INFORMATION, *PTDI_REQUEST_KERNEL_QUERY_INFORMATION; + +/* TdiSetInformation */ +typedef struct _TDI_REQUEST_KERNEL_SET_INFO { + LONG SetType; + PTDI_CONNECTION_INFORMATION RequestConnectionInformation; +} TDI_REQUEST_KERNEL_SET_INFORMATION, *PTDI_REQUEST_KERNEL_SET_INFORMATION; + + +/* Event types */ +#define TDI_EVENT_CONNECT 0 +#define TDI_EVENT_DISCONNECT 1 +#define TDI_EVENT_ERROR 2 +#define TDI_EVENT_RECEIVE 3 +#define TDI_EVENT_RECEIVE_DATAGRAM 4 +#define TDI_EVENT_RECEIVE_EXPEDITED 5 +#define TDI_EVENT_SEND_POSSIBLE 6 +#define TDI_EVENT_CHAINED_RECEIVE 7 +#define TDI_EVENT_CHAINED_RECEIVE_DATAGRAM 8 +#define TDI_EVENT_CHAINED_RECEIVE_EXPEDITED 9 +#define TDI_EVENT_ERROR_EX 10 + +typedef NTSTATUS DDKAPI +(*PTDI_IND_CONNECT)( + IN PVOID TdiEventContext, + IN LONG RemoteAddressLength, + IN PVOID RemoteAddress, + IN LONG UserDataLength, + IN PVOID UserData, + IN LONG OptionsLength, + IN PVOID Options, + OUT CONNECTION_CONTEXT *ConnectionContext, + OUT PIRP *AcceptIrp); + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiDefaultConnectHandler( + IN PVOID TdiEventContext, + IN LONG RemoteAddressLength, + IN PVOID RemoteAddress, + IN LONG UserDataLength, + IN PVOID UserData, + IN LONG OptionsLength, + IN PVOID Options, + OUT CONNECTION_CONTEXT *ConnectionContext, + OUT PIRP *AcceptIrp); + +typedef NTSTATUS DDKAPI +(*PTDI_IND_DISCONNECT)( + IN PVOID TdiEventContext, + IN CONNECTION_CONTEXT ConnectionContext, + IN LONG DisconnectDataLength, + IN PVOID DisconnectData, + IN LONG DisconnectInformationLength, + IN PVOID DisconnectInformation, + IN ULONG DisconnectFlags); + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiDefaultDisconnectHandler( + IN PVOID TdiEventContext, + IN CONNECTION_CONTEXT ConnectionContext, + IN LONG DisconnectDataLength, + IN PVOID DisconnectData, + IN LONG DisconnectInformationLength, + IN PVOID DisconnectInformation, + IN ULONG DisconnectFlags); + +typedef NTSTATUS DDKAPI +(*PTDI_IND_ERROR)( + IN PVOID TdiEventContext, + IN NTSTATUS Status); + +typedef NTSTATUS DDKAPI +(*PTDI_IND_ERROR_EX)( + IN PVOID TdiEventContext, + IN NTSTATUS Status, + IN PVOID Buffer); + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiDefaultErrorHandler( + IN PVOID TdiEventContext, + IN NTSTATUS Status); + +typedef NTSTATUS DDKAPI +(*PTDI_IND_RECEIVE)( + IN PVOID TdiEventContext, + IN CONNECTION_CONTEXT ConnectionContext, + IN ULONG ReceiveFlags, + IN ULONG BytesIndicated, + IN ULONG BytesAvailable, + OUT ULONG *BytesTaken, + IN PVOID Tsdu, + OUT PIRP *IoRequestPacket); + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiDefaultReceiveHandler( + IN PVOID TdiEventContext, + IN CONNECTION_CONTEXT ConnectionContext, + IN ULONG ReceiveFlags, + IN ULONG BytesIndicated, + IN ULONG BytesAvailable, + OUT ULONG *BytesTaken, + IN PVOID Tsdu, + OUT PIRP *IoRequestPacket); + +typedef NTSTATUS DDKAPI +(*PTDI_IND_RECEIVE_DATAGRAM)( + IN PVOID TdiEventContext, + IN LONG SourceAddressLength, + IN PVOID SourceAddress, + IN LONG OptionsLength, + IN PVOID Options, + IN ULONG ReceiveDatagramFlags, + IN ULONG BytesIndicated, + IN ULONG BytesAvailable, + OUT ULONG *BytesTaken, + IN PVOID Tsdu, + OUT PIRP *IoRequestPacket); + +TDIKRNLAPI +NTSTATUS DDKAPI +TdiDefaultRcvDatagramHandler( + IN PVOID TdiEventContext, + IN LONG SourceAddressLength, + IN PVOID SourceAddress, + IN LONG OptionsLength, + IN PVOID Options, + IN ULONG ReceiveDatagramFlags, + IN ULONG BytesIndicated, + IN ULONG BytesAvailable, + OUT ULONG *BytesTaken, + IN PVOID Tsdu, + OUT PIRP *IoRequestPacket); + +typedef NTSTATUS DDKAPI +(*PTDI_IND_RECEIVE_EXPEDITED)( + IN PVOID TdiEventContext, + IN CONNECTION_CONTEXT ConnectionContext, + IN ULONG ReceiveFlags, + IN ULONG BytesIndicated, + IN ULONG BytesAvailable, + OUT ULONG *BytesTaken, + IN PVOID Tsdu, + OUT PIRP *IoRequestPacket); + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiDefaultRcvExpeditedHandler( + IN PVOID TdiEventContext, + IN CONNECTION_CONTEXT ConnectionContext, + IN ULONG ReceiveFlags, + IN ULONG BytesIndicated, + IN ULONG BytesAvailable, + OUT ULONG *BytesTaken, + IN PVOID Tsdu, + OUT PIRP *IoRequestPacket); + +typedef NTSTATUS DDKAPI +(*PTDI_IND_CHAINED_RECEIVE)( + IN PVOID TdiEventContext, + IN CONNECTION_CONTEXT ConnectionContext, + IN ULONG ReceiveFlags, + IN ULONG ReceiveLength, + IN ULONG StartingOffset, + IN PMDL Tsdu, + IN PVOID TsduDescriptor); + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiDefaultChainedReceiveHandler( + IN PVOID TdiEventContext, + IN CONNECTION_CONTEXT ConnectionContext, + IN ULONG ReceiveFlags, + IN ULONG ReceiveLength, + IN ULONG StartingOffset, + IN PMDL Tsdu, + IN PVOID TsduDescriptor); + +typedef NTSTATUS DDKAPI +(*PTDI_IND_CHAINED_RECEIVE_DATAGRAM)( + IN PVOID TdiEventContext, + IN LONG SourceAddressLength, + IN PVOID SourceAddress, + IN LONG OptionsLength, + IN PVOID Options, + IN ULONG ReceiveDatagramFlags, + IN ULONG ReceiveDatagramLength, + IN ULONG StartingOffset, + IN PMDL Tsdu, + IN PVOID TsduDescriptor); + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiDefaultChainedRcvDatagramHandler( + IN PVOID TdiEventContext, + IN LONG SourceAddressLength, + IN PVOID SourceAddress, + IN LONG OptionsLength, + IN PVOID Options, + IN ULONG ReceiveDatagramFlags, + IN ULONG ReceiveDatagramLength, + IN ULONG StartingOffset, + IN PMDL Tsdu, + IN PVOID TsduDescriptor); + +typedef NTSTATUS DDKAPI +(*PTDI_IND_CHAINED_RECEIVE_EXPEDITED)( + IN PVOID TdiEventContext, + IN CONNECTION_CONTEXT ConnectionContext, + IN ULONG ReceiveFlags, + IN ULONG ReceiveLength, + IN ULONG StartingOffset, + IN PMDL Tsdu, + IN PVOID TsduDescriptor); + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiDefaultChainedRcvExpeditedHandler( + IN PVOID TdiEventContext, + IN CONNECTION_CONTEXT ConnectionContext, + IN ULONG ReceiveFlags, + IN ULONG ReceiveLength, + IN ULONG StartingOffset, + IN PMDL Tsdu, + IN PVOID TsduDescriptor); + +typedef NTSTATUS DDKAPI +(*PTDI_IND_SEND_POSSIBLE)( + IN PVOID TdiEventContext, + IN PVOID ConnectionContext, + IN ULONG BytesAvailable); + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiDefaultSendPossibleHandler( + IN PVOID TdiEventContext, + IN PVOID ConnectionContext, + IN ULONG BytesAvailable); + + + +/* Macros and functions to build IRPs */ + +#define TdiBuildBaseIrp( \ + bIrp, bDevObj, bFileObj, bCompRoutine, bContxt, bIrpSp, bMinor) \ +{ \ + bIrpSp->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; \ + bIrpSp->MinorFunction = (bMinor); \ + bIrpSp->DeviceObject = (bDevObj); \ + bIrpSp->FileObject = (bFileObj); \ + if (bCompRoutine) \ + IoSetCompletionRoutine(bIrp, bCompRoutine, bContxt, TRUE, TRUE, TRUE) \ + else \ + IoSetCompletionRoutine(bIrp, NULL, NULL, FALSE, FALSE, FALSE); \ +} + +/* + * VOID + * TdiBuildAccept( + * IN PIRP Irp, + * IN PDEVICE_OBJECT DevObj, + * IN PFILE_OBJECT FileObj, + * IN PVOID CompRoutine, + * IN PVOID Contxt, + * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo, + * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo); + */ +#define TdiBuildAccept( \ + Irp, DevObj, FileObj, CompRoutine, Contxt, \ + RequestConnectionInfo, ReturnConnectionInfo) \ +{ \ + PTDI_REQUEST_KERNEL_ACCEPT _Request; \ + PIO_STACK_LOCATION _IrpSp; \ + \ + _IrpSp = IoGetNextIrpStackLocation(Irp); \ + \ + TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ + Contxt, _IrpSp, TDI_ACCEPT); \ + \ + _Request = (PTDI_REQUEST_KERNEL_ACCEPT)&_IrpSp->Parameters; \ + _Request->RequestConnectionInformation = (RequestConnectionInfo); \ + _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \ +} + +/* + * VOID + * TdiBuildAction( + * IN PIRP Irp, + * IN PDEVICE_OBJECT DevObj, + * IN PFILE_OBJECT FileObj, + * IN PVOID CompRoutine, + * IN PVOID Contxt, + * IN PMDL MdlAddr); + */ +#define TdiBuildAction( \ + Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr) \ +{ \ + PIO_STACK_LOCATION _IrpSp; \ + \ + _IrpSp = IoGetNextIrpStackLocation(Irp); \ + \ + TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ + Contxt, _IrpSp, TDI_ACTION); \ + \ + (Irp)->MdlAddress = (MdlAddr); \ +} + +/* + * VOID + * TdiBuildAssociateAddress( + * IN PIRP Irp, + * IN PDEVICE_OBJECT DevObj, + * IN PFILE_OBJECT FileObj, + * IN PVOID CompRoutine, + * IN PVOID Contxt, + * IN HANDLE AddrHandle); + */ +#define TdiBuildAssociateAddress( \ + Irp, DevObj, FileObj, CompRoutine, Contxt, AddrHandle) \ +{ \ + PTDI_REQUEST_KERNEL_ASSOCIATE _Request; \ + PIO_STACK_LOCATION _IrpSp; \ + \ + _IrpSp = IoGetNextIrpStackLocation(Irp); \ + \ + TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ + Contxt, _IrpSp, TDI_ASSOCIATE_ADDRESS); \ + \ + _Request = (PTDI_REQUEST_KERNEL_ASSOCIATE)&_IrpSp->Parameters; \ + _Request->AddressHandle = (HANDLE)(AddrHandle); \ +} + +/* + * VOID + * TdiBuildConnect( + * IN PIRP Irp, + * IN PDEVICE_OBJECT DevObj, + * IN PFILE_OBJECT FileObj, + * IN PVOID CompRoutine, + * IN PVOID Contxt, + * IN PLARGE_INTEGER Time, + * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo, + * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo); + */ +#define TdiBuildConnect( \ + Irp, DevObj, FileObj, CompRoutine, Contxt, \ + Time, RequestConnectionInfo, ReturnConnectionInfo) \ +{ \ + PTDI_REQUEST_KERNEL _Request; \ + PIO_STACK_LOCATION _IrpSp; \ + \ + _IrpSp = IoGetNextIrpStackLocation(Irp); \ + \ + TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ + Contxt, _IrpSp, TDI_CONNECT); \ + \ + _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters; \ + _Request->RequestConnectionInformation = (RequestConnectionInfo); \ + _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \ + _Request->RequestSpecific = (PVOID)(Time); \ +} + +/* + * VOID + * TdiBuildDisassociateAddress( + * IN PIRP Irp, + * IN PDEVICE_OBJECT DevObj, + * IN PFILE_OBJECT FileObj, + * IN PVOID CompRoutine, + * IN PVOID Contxt); + */ +#define TdiBuildDisassociateAddress( \ + Irp, DevObj, FileObj, CompRoutine, Contxt) \ +{ \ + PIO_STACK_LOCATION _IrpSp; \ + \ + _IrpSp = IoGetNextIrpStackLocation(Irp); \ + \ + TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ + Contxt, _IrpSp, TDI_DISASSOCIATE_ADDRESS); \ +} + +/* + * VOID + * TdiBuildDisconnect( + * IN PIRP Irp, + * IN PDEVICE_OBJECT DevObj, + * IN PFILE_OBJECT FileObj, + * IN PVOID CompRoutine, + * IN PVOID Contxt, + * IN PLARGE_INTEGER Time, + * IN PULONG Flags, + * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo, + * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo); + */ +#define TdiBuildDisconnect( \ + Irp, DevObj, FileObj, CompRoutine, Contxt, Time, \ + Flags, RequestConnectionInfo, ReturnConnectionInfo) \ +{ \ + PTDI_REQUEST_KERNEL _Request; \ + PIO_STACK_LOCATION _IrpSp; \ + \ + _IrpSp = IoGetNextIrpStackLocation(Irp); \ + \ + TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ + Contxt, _IrpSp, TDI_DISCONNECT); \ + \ + _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters; \ + _Request->RequestConnectionInformation = (RequestConnectionInfo); \ + _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \ + _Request->RequestSpecific = (PVOID)(Time); \ + _Request->RequestFlags = (Flags); \ +} + +/* + * PIRP + * TdiBuildInternalDeviceControlIrp( + * IN CCHAR IrpSubFunction, + * IN PDEVICE_OBJECT DeviceObject, + * IN PFILE_OBJECT FileObject, + * IN PKEVENT Event, + * IN PIO_STATUS_BLOCK IoStatusBlock); + */ +#define TdiBuildInternalDeviceControlIrp( \ + IrpSubFunction, DeviceObject, \ + FileObject, Event, IoStatusBlock) \ + IoBuildDeviceIoControlRequest( \ + 0x00000003, DeviceObject, \ + NULL, 0, NULL, 0, \ + TRUE, Event, IoStatusBlock) + +/* + * VOID + * TdiBuildListen( + * IN PIRP Irp, + * IN PDEVICE_OBJECT DevObj, + * IN PFILE_OBJECT FileObj, + * IN PVOID CompRoutine, + * IN PVOID Contxt, + * IN ULONG Flags, + * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo, + * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo); + */ +#define TdiBuildListen( \ + Irp, DevObj, FileObj, CompRoutine, Contxt, \ + Flags, RequestConnectionInfo, ReturnConnectionInfo) \ +{ \ + PTDI_REQUEST_KERNEL _Request; \ + PIO_STACK_LOCATION _IrpSp; \ + \ + _IrpSp = IoGetNextIrpStackLocation(Irp); \ + \ + TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ + Contxt, _IrpSp, TDI_LISTEN); \ + \ + _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters; \ + _Request->RequestConnectionInformation = (RequestConnectionInfo); \ + _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \ + _Request->RequestFlags = (Flags); \ +} + +TDIKRNLAPI +VOID +DDKAPI +TdiBuildNetbiosAddress( + IN PUCHAR NetbiosName, + IN BOOLEAN IsGroupName, + IN OUT PTA_NETBIOS_ADDRESS NetworkName); + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiBuildNetbiosAddressEa( + IN PUCHAR Buffer, + IN BOOLEAN IsGroupName, + IN PUCHAR NetbiosName); + +/* + * VOID + * TdiBuildQueryInformation( + * IN PIRP Irp, + * IN PDEVICE_OBJECT DevObj, + * IN PFILE_OBJECT FileObj, + * IN PVOID CompRoutine, + * IN PVOID Contxt, + * IN UINT QType, + * IN PMDL MdlAddr); + */ +#define TdiBuildQueryInformation( \ + Irp, DevObj, FileObj, CompRoutine, Contxt, QType, MdlAddr) \ +{ \ + PTDI_REQUEST_KERNEL_QUERY_INFORMATION _Request; \ + PIO_STACK_LOCATION _IrpSp; \ + \ + _IrpSp = IoGetNextIrpStackLocation(Irp); \ + \ + TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ + Contxt, _IrpSp, TDI_QUERY_INFORMATION); \ + \ + _Request = (PTDI_REQUEST_KERNEL_QUERY_INFORMATION)&_IrpSp->Parameters; \ + _Request->RequestConnectionInformation = NULL; \ + _Request->QueryType = (ULONG)(QType); \ + (Irp)->MdlAddress = (MdlAddr); \ +} + +/* + * VOID + * TdiBuildReceive( + * IN PIRP Irp, + * IN PDEVICE_OBJECT DevObj, + * IN PFILE_OBJECT FileObj, + * IN PVOID CompRoutine, + * IN PVOID Contxt, + * IN PMDL MdlAddr, + * IN ULONG InFlags, + * IN ULONG ReceiveLen); + */ +#define TdiBuildReceive( \ + Irp, DevObj, FileObj, CompRoutine, Contxt, \ + MdlAddr, InFlags, ReceiveLen) \ +{ \ + PTDI_REQUEST_KERNEL_RECEIVE _Request; \ + PIO_STACK_LOCATION _IrpSp; \ + \ + _IrpSp = IoGetNextIrpStackLocation(Irp); \ + \ + TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ + Contxt, _IrpSp, TDI_RECEIVE); \ + \ + _Request = (PTDI_REQUEST_KERNEL_RECEIVE)&_IrpSp->Parameters; \ + _Request->ReceiveFlags = (InFlags); \ + _Request->ReceiveLength = (ReceiveLen); \ + (Irp)->MdlAddress = (MdlAddr); \ +} + +/* + * VOID + * TdiBuildReceiveDatagram( + * IN PIRP Irp, + * IN PDEVICE_OBJECT DevObj, + * IN PFILE_OBJECT FileObj, + * IN PVOID CompRoutine, + * IN PVOID Contxt, + * IN PMDL MdlAddr, + * IN ULONG ReceiveLen, + * IN PTDI_CONNECTION_INFORMATION ReceiveDatagramInfo, + * OUT PTDI_CONNECTION_INFORMATION ReturnInfo, + * ULONG InFlags); + */ +#define TdiBuildReceiveDatagram( \ + Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr, \ + ReceiveLen, ReceiveDatagramInfo, ReturnInfo, InFlags) \ +{ \ + PTDI_REQUEST_KERNEL_RECEIVEDG _Request; \ + PIO_STACK_LOCATION _IrpSp; \ + \ + _IrpSp = IoGetNextIrpStackLocation(Irp); \ + \ + TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ + Contxt, _IrpSp, TDI_RECEIVE_DATAGRAM); \ + \ + _Request = (PTDI_REQUEST_KERNEL_RECEIVEDG)&_IrpSp->Parameters; \ + _Request->ReceiveDatagramInformation = (ReceiveDatagramInfo); \ + _Request->ReturnDatagramInformation = (ReturnInfo); \ + _Request->ReceiveLength = (ReceiveLen); \ + _Request->ReceiveFlags = (InFlags); \ + (Irp)->MdlAddress = (MdlAddr); \ +} + +/* + * VOID + * TdiBuildSend( + * IN PIRP Irp, + * IN PDEVICE_OBJECT DevObj, + * IN PFILE_OBJECT FileObj, + * IN PVOID CompRoutine, + * IN PVOID Contxt, + * IN PMDL MdlAddr, + * IN ULONG InFlags, + * IN ULONG SendLen); + */ +#define TdiBuildSend( \ + Irp, DevObj, FileObj, CompRoutine, Contxt, \ + MdlAddr, InFlags, SendLen) \ +{ \ + PTDI_REQUEST_KERNEL_SEND _Request; \ + PIO_STACK_LOCATION _IrpSp; \ + \ + _IrpSp = IoGetNextIrpStackLocation(Irp); \ + \ + TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ + Contxt, _IrpSp, TDI_SEND); \ + \ + _Request = (PTDI_REQUEST_KERNEL_SEND)&_IrpSp->Parameters; \ + _Request->SendFlags = (InFlags); \ + _Request->SendLength = (SendLen); \ + (Irp)->MdlAddress = (MdlAddr); \ +} + +/* + * VOID + * TdiBuildSendDatagram( + * IN PIRP Irp, + * IN PDEVICE_OBJECT DevObj, + * IN PFILE_OBJECT FileObj, + * IN PVOID CompRoutine, + * IN PVOID Contxt, + * IN PMDL MdlAddr, + * IN ULONG SendLen, + * IN PTDI_CONNECTION_INFORMATION SendDatagramInfo); + */ +#define TdiBuildSendDatagram( \ + Irp, DevObj, FileObj, CompRoutine, Contxt, \ + MdlAddr, SendLen, SendDatagramInfo) \ +{ \ + PTDI_REQUEST_KERNEL_SENDDG _Request; \ + PIO_STACK_LOCATION _IrpSp; \ + \ + _IrpSp = IoGetNextIrpStackLocation(Irp); \ + \ + TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ + Contxt, _IrpSp, TDI_SEND_DATAGRAM); \ + \ + _Request = (PTDI_REQUEST_KERNEL_SENDDG)&_IrpSp->Parameters; \ + _Request->SendDatagramInformation = (SendDatagramInfo); \ + _Request->SendLength = (SendLen); \ + (Irp)->MdlAddress = (MdlAddr); \ +} + +/* + * VOID + * TdiBuildSetEventHandler( + * IN PIRP Irp, + * IN PDEVICE_OBJECT DevObj, + * IN PFILE_OBJECT FileObj, + * IN PVOID CompRoutine, + * IN PVOID Contxt, + * IN INT InEventType, + * IN PVOID InEventHandler, + * IN PVOID InEventContext); + */ +#define TdiBuildSetEventHandler( \ + Irp, DevObj, FileObj, CompRoutine, Contxt, \ + InEventType, InEventHandler, InEventContext) \ +{ \ + PTDI_REQUEST_KERNEL_SET_EVENT _Request; \ + PIO_STACK_LOCATION _IrpSp; \ + \ + _IrpSp = IoGetNextIrpStackLocation(Irp); \ + \ + TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ + Contxt, _IrpSp, TDI_SET_EVENT_HANDLER); \ + \ + _Request = (PTDI_REQUEST_KERNEL_SET_EVENT)&_IrpSp->Parameters; \ + _Request->EventType = (InEventType); \ + _Request->EventHandler = (PVOID)(InEventHandler); \ + _Request->EventContext = (PVOID)(InEventContext); \ +} + +/* + * VOID + * TdiBuildSetInformation( + * IN PIRP Irp, + * IN PDEVICE_OBJECT DevObj, + * IN PFILE_OBJECT FileObj, + * IN PVOID CompRoutine, + * IN PVOID Contxt, + * IN UINT SType, + * IN PMDL MdlAddr); + */ +#define TdiBuildSetInformation( \ + Irp, DevObj, FileObj, CompRoutine, Contxt, SType, MdlAddr) \ +{ \ + PTDI_REQUEST_KERNEL_SET_INFORMATION _Request; \ + PIO_STACK_LOCATION _IrpSp; \ + \ + _IrpSp = IoGetNextIrpStackLocation(Irp); \ + \ + TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ + Contxt, _IrpSp, TDI_SET_INFORMATION); \ + \ + _Request = (PTDI_REQUEST_KERNEL_SET_INFORMATION)&_IrpSp->Parameters; \ + _Request->RequestConnectionInformation = NULL; \ + _Request->SetType = (ULONG)(SType); \ + (Irp)->MdlAddress = (MdlAddr); \ +} + +/* TDI20_CLIENT_INTERFACE_INFO.TdiVersion constants */ +#define TDI_CURRENT_MAJOR_VERSION 2 +#define TDI_CURRENT_MINOR_VERSION 0 + +#define TDI_CURRENT_VERSION ((TDI_CURRENT_MINOR_VERSION) << 8 \ + | (TDI_CURRENT_MAJOR_VERSION)) + +#define TDI_VERSION_ONE 0x0001 + +typedef enum _TDI_PNP_OPCODE { + TDI_PNP_OP_MIN, + TDI_PNP_OP_ADD, + TDI_PNP_OP_DEL, + TDI_PNP_OP_UPDATE, + TDI_PNP_OP_PROVIDERREADY, + TDI_PNP_OP_NETREADY, + TDI_PNP_OP_ADD_IGNORE_BINDING, + TDI_PNP_OP_DELETE_IGNORE_BINDING, + TDI_PNP_OP_MAX +} TDI_PNP_OPCODE; + +/* TDI_PNP_CONTEXT.ContextType */ +#define TDI_PNP_CONTEXT_TYPE_IF_NAME 0x1 +#define TDI_PNP_CONTEXT_TYPE_IF_ADDR 0x2 +#define TDI_PNP_CONTEXT_TYPE_PDO 0x3 +#define TDI_PNP_CONTEXT_TYPE_FIRST_OR_LAST_IF 0x4 + +typedef struct _TDI_PNP_CONTEXT { + USHORT ContextSize; + USHORT ContextType; + UCHAR ContextData[1]; +} TDI_PNP_CONTEXT, *PTDI_PNP_CONTEXT; + +typedef VOID DDKAPI +(*TDI_ADD_ADDRESS_HANDLER)( + IN PTA_ADDRESS Address); + +typedef VOID DDKAPI +(*TDI_ADD_ADDRESS_HANDLER_V2)( + IN PTA_ADDRESS Address, + IN PUNICODE_STRING DeviceName, + IN PTDI_PNP_CONTEXT Context); + +typedef VOID DDKAPI +(*TDI_BINDING_HANDLER)( + IN TDI_PNP_OPCODE PnPOpcode, + IN PUNICODE_STRING DeviceName, + IN PWSTR MultiSZBindList); + +typedef VOID DDKAPI +(*TDI_BIND_HANDLER)( + IN PUNICODE_STRING DeviceName); + +typedef VOID DDKAPI +(*TDI_DEL_ADDRESS_HANDLER)( + IN PTA_ADDRESS Address); + +typedef VOID DDKAPI +(*TDI_DEL_ADDRESS_HANDLER_V2)( + IN PTA_ADDRESS Address, + IN PUNICODE_STRING DeviceName, + IN PTDI_PNP_CONTEXT Context); + +typedef NTSTATUS DDKAPI +(*TDI_PNP_POWER_HANDLER)( + IN PUNICODE_STRING DeviceName, + IN PNET_PNP_EVENT PowerEvent, + IN PTDI_PNP_CONTEXT Context1, + IN PTDI_PNP_CONTEXT Context2); + +typedef VOID DDKAPI +(*TDI_UNBIND_HANDLER)( + IN PUNICODE_STRING DeviceName); + +typedef VOID DDKAPI +(*ProviderPnPPowerComplete)( + IN PNET_PNP_EVENT NetEvent, + IN NTSTATUS ProviderStatus); + +typedef struct _TDI20_CLIENT_INTERFACE_INFO { + _ANONYMOUS_UNION union { + _ANONYMOUS_STRUCT struct { + UCHAR MajorTdiVersion; + UCHAR MinorTdiVersion; + } DUMMYSTRUCTNAME; + USHORT TdiVersion; + } DUMMYUNIONNAME; + USHORT Unused; + PUNICODE_STRING ClientName; + TDI_PNP_POWER_HANDLER PnPPowerHandler; + _ANONYMOUS_UNION union { + TDI_BINDING_HANDLER BindingHandler; + _ANONYMOUS_STRUCT struct { + TDI_BIND_HANDLER BindHandler; + TDI_UNBIND_HANDLER UnBindHandler; + } DUMMYSTRUCTNAME; + }DUMMYUNIONNAME2; + _ANONYMOUS_UNION union { + _ANONYMOUS_STRUCT struct { + TDI_ADD_ADDRESS_HANDLER_V2 AddAddressHandlerV2; + TDI_DEL_ADDRESS_HANDLER_V2 DelAddressHandlerV2; + } DUMMYSTRUCTNAME; + _ANONYMOUS_STRUCT struct { + TDI_ADD_ADDRESS_HANDLER AddAddressHandler; + TDI_DEL_ADDRESS_HANDLER DelAddressHandler; + } DUMMYSTRUCTNAME2; + } DUMMYUNIONNAME3; +} TDI20_CLIENT_INTERFACE_INFO, *PTDI20_CLIENT_INTERFACE_INFO; + +typedef TDI20_CLIENT_INTERFACE_INFO TDI_CLIENT_INTERFACE_INFO; +typedef TDI_CLIENT_INTERFACE_INFO *PTDI_CLIENT_INTERFACE_INFO; + + +/* TDI functions */ + +/* + * VOID + * TdiCompleteRequest( + * IN PIRP Irp, + * IN NTSTATUS Status); + */ +#define TdiCompleteRequest(Irp, Status) \ +{ \ + (Irp)->IoStatus.Status = (Status); \ + IoCompleteRequest((Irp), IO_NETWORK_INCREMENT); \ +} + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiCopyBufferToMdl( + IN PVOID SourceBuffer, + IN ULONG SourceOffset, + IN ULONG SourceBytesToCopy, + IN PMDL DestinationMdlChain, + IN ULONG DestinationOffset, + IN PULONG BytesCopied); + +/* + * VOID + * TdiCopyLookaheadData( + * IN PVOID Destination, + * IN PVOID Source, + * IN ULONG Length, + * IN ULONG ReceiveFlags); + */ +#define TdiCopyLookaheadData(Destination, Source, Length, ReceiveFlags) \ + RtlCopyMemory(Destination, Source, Length) + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiCopyMdlChainToMdlChain ( + IN PMDL SourceMdlChain, + IN ULONG SourceOffset, + IN PMDL DestinationMdlChain, + IN ULONG DestinationOffset, + OUT PULONG BytesCopied); + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiCopyMdlToBuffer( + IN PMDL SourceMdlChain, + IN ULONG SourceOffset, + IN PVOID DestinationBuffer, + IN ULONG DestinationOffset, + IN ULONG DestinationBufferSize, + OUT PULONG BytesCopied); + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiDeregisterAddressChangeHandler( + IN HANDLE BindingHandle); + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiDeregisterDeviceObject( + IN HANDLE DevRegistrationHandle); + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiDeregisterNetAddress( + IN HANDLE AddrRegistrationHandle); + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiDeregisterPnPHandlers( + IN HANDLE BindingHandle); + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiDeregisterProvider( + IN HANDLE ProviderHandle); + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiEnumerateAddresses( + IN HANDLE BindingHandle); + +TDIKRNLAPI +VOID +DDKAPI +TdiInitialize( + VOID); + +TDIKRNLAPI +VOID +DDKAPI +TdiMapBuffer( + IN PMDL MdlChain); + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiMapUserRequest( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PIO_STACK_LOCATION IrpSp); + +TDIKRNLAPI +BOOLEAN +DDKAPI +TdiMatchPdoWithChainedReceiveContext( + IN PVOID TsduDescriptor, + IN PVOID PDO); + +TDIKRNLAPI +VOID +DDKAPI +TdiPnPPowerComplete( + IN HANDLE BindingHandle, + IN PNET_PNP_EVENT PowerEvent, + IN NTSTATUS Status); + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiPnPPowerRequest( + IN PUNICODE_STRING DeviceName, + IN PNET_PNP_EVENT PowerEvent, + IN PTDI_PNP_CONTEXT Context1, + IN PTDI_PNP_CONTEXT Context2, + IN ProviderPnPPowerComplete ProtocolCompletionHandler); + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiProviderReady( + IN HANDLE ProviderHandle); + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiRegisterAddressChangeHandler( + IN TDI_ADD_ADDRESS_HANDLER AddHandler, + IN TDI_DEL_ADDRESS_HANDLER DeleteHandler, + OUT HANDLE *BindingHandle); + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiRegisterDeviceObject( + IN PUNICODE_STRING DeviceName, + OUT HANDLE *DevRegistrationHandle); + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiRegisterNetAddress( + IN PTA_ADDRESS Address, + IN PUNICODE_STRING DeviceName, + IN PTDI_PNP_CONTEXT Context, + OUT HANDLE *AddrRegistrationHandle); + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiRegisterNotificationHandler( + IN TDI_BIND_HANDLER BindHandler, + IN TDI_UNBIND_HANDLER UnbindHandler, + OUT HANDLE *BindingHandle); + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiRegisterPnPHandlers( + IN PTDI_CLIENT_INTERFACE_INFO ClientInterfaceInfo, + IN ULONG InterfaceInfoSize, + OUT HANDLE *BindingHandle); + +TDIKRNLAPI +NTSTATUS +DDKAPI +TdiRegisterProvider( + IN PUNICODE_STRING ProviderName, + OUT HANDLE *ProviderHandle); + +TDIKRNLAPI +VOID +DDKAPI +TdiReturnChainedReceives( + IN PVOID *TsduDescriptors, + IN ULONG NumberOfTsdus); + +TDIKRNLAPI +VOID +DDKAPI +TdiUnmapBuffer( + IN PMDL MdlChain); + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __TDIKRNL_H */ diff --git a/reactos/w32api/include/ddk/tdistat.h b/reactos/w32api/include/ddk/tdistat.h new file mode 100644 index 00000000000..f0588d2579a --- /dev/null +++ b/reactos/w32api/include/ddk/tdistat.h @@ -0,0 +1,83 @@ +/* + * tdistat.h + * + * TDI status codes + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __TDISTAT_H +#define __TDISTAT_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define TDI_SUCCESS STATUS_SUCCESS +#define TDI_NO_RESOURCES STATUS_INSUFFICIENT_RESOURCES +#define TDI_ADDR_IN_USE STATUS_ADDRESS_ALREADY_EXISTS +#define TDI_BAD_ADDR STATUS_INVALID_ADDRESS_COMPONENT +#define TDI_NO_FREE_ADDR STATUS_TOO_MANY_ADDRESSES +#define TDI_ADDR_INVALID STATUS_INVALID_ADDRESS +#define TDI_ADDR_DELETED STATUS_ADDRESS_CLOSED +#define TDI_BUFFER_OVERFLOW STATUS_BUFFER_OVERFLOW +#define TDI_BAD_EVENT_TYPE STATUS_INVALID_PARAMETER +#define TDI_BAD_OPTION STATUS_INVALID_PARAMETER +#define TDI_CONN_REFUSED STATUS_CONNECTION_REFUSED +#define TDI_INVALID_CONNECTION STATUS_CONNECTION_INVALID +#define TDI_ALREADY_ASSOCIATED STATUS_ADDRESS_ALREADY_ASSOCIATED +#define TDI_NOT_ASSOCIATED STATUS_ADDRESS_NOT_ASSOCIATED +#define TDI_CONNECTION_ACTIVE STATUS_CONNECTION_ACTIVE +#define TDI_CONNECTION_ABORTED STATUS_CONNECTION_ABORTED +#define TDI_CONNECTION_RESET STATUS_CONNECTION_RESET +#define TDI_TIMED_OUT STATUS_IO_TIMEOUT +#define TDI_GRACEFUL_DISC STATUS_GRACEFUL_DISCONNECT +#define TDI_NOT_ACCEPTED STATUS_DATA_NOT_ACCEPTED +#define TDI_MORE_PROCESSING STATUS_MORE_PROCESSING_REQUIRED +#define TDI_INVALID_STATE STATUS_INVALID_DEVICE_STATE +#define TDI_INVALID_PARAMETER STATUS_INVALID_PARAMETER +#define TDI_DEST_NET_UNREACH STATUS_NETWORK_UNREACHABLE +#define TDI_DEST_HOST_UNREACH STATUS_HOST_UNREACHABLE +#define TDI_DEST_UNREACHABLE TDI_DEST_HOST_UNREACH +#define TDI_DEST_PROT_UNREACH STATUS_PROTOCOL_UNREACHABLE +#define TDI_DEST_PORT_UNREACH STATUS_PORT_UNREACHABLE +#define TDI_INVALID_QUERY STATUS_INVALID_DEVICE_REQUEST +#define TDI_REQ_ABORTED STATUS_REQUEST_ABORTED +#define TDI_BUFFER_TOO_SMALL STATUS_BUFFER_TOO_SMALL +#define TDI_CANCELLED STATUS_CANCELLED +#define TDI_BUFFER_TOO_BIG STATUS_INVALID_BUFFER_SIZE +#define TDI_INVALID_REQUEST STATUS_INVALID_DEVICE_REQUEST +#define TDI_PENDING STATUS_PENDING +#define TDI_ITEM_NOT_FOUND STATUS_OBJECT_NAME_NOT_FOUND + +#define TDI_STATUS_BAD_VERSION 0xC0010004L +#define TDI_STATUS_BAD_CHARACTERISTICS 0xC0010005L + +#define TDI_OPTION_EOL 0 + +#define TDI_ADDRESS_OPTION_REUSE 1 +#define TDI_ADDRESS_OPTION_DHCP 2 + +#ifdef __cplusplus +} +#endif + +#endif /* __TDISTAT_H */ diff --git a/reactos/w32api/include/ddk/tvout.h b/reactos/w32api/include/ddk/tvout.h new file mode 100644 index 00000000000..740022a27bf --- /dev/null +++ b/reactos/w32api/include/ddk/tvout.h @@ -0,0 +1,121 @@ +/* + * tvout.h + * + * Definitions for TV-out support + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __TVOUT_H +#define __TVOUT_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + + +/* VIDEOPARAMETERS.dwCommand constants */ +#define VP_COMMAND_GET 0x00000001 +#define VP_COMMAND_SET 0x00000002 + +/* VIDEOPARAMETERS.dwFlags constants */ +#define VP_FLAGS_TV_MODE 0x00000001 +#define VP_FLAGS_TV_STANDARD 0x00000002 +#define VP_FLAGS_FLICKER 0x00000004 +#define VP_FLAGS_OVERSCAN 0x00000008 +#define VP_FLAGS_MAX_UNSCALED 0x00000010 +#define VP_FLAGS_POSITION 0x00000020 +#define VP_FLAGS_BRIGHTNESS 0x00000040 +#define VP_FLAGS_CONTRAST 0x00000080 +#define VP_FLAGS_COPYPROTECT 0x00000100 + +/* VIDEOPARAMETERS.dwMode constants */ +#define VP_MODE_WIN_GRAPHICS 0x00000001 +#define VP_MODE_TV_PLAYBACK 0x00000002 + +/* VIDEOPARAMETERS.dwTVStandard/dwAvailableTVStandard constants */ +#define VP_TV_STANDARD_NTSC_M 0x00000001 +#define VP_TV_STANDARD_NTSC_M_J 0x00000002 +#define VP_TV_STANDARD_PAL_B 0x00000004 +#define VP_TV_STANDARD_PAL_D 0x00000008 +#define VP_TV_STANDARD_PAL_H 0x00000010 +#define VP_TV_STANDARD_PAL_I 0x00000020 +#define VP_TV_STANDARD_PAL_M 0x00000040 +#define VP_TV_STANDARD_PAL_N 0x00000080 +#define VP_TV_STANDARD_SECAM_B 0x00000100 +#define VP_TV_STANDARD_SECAM_D 0x00000200 +#define VP_TV_STANDARD_SECAM_G 0x00000400 +#define VP_TV_STANDARD_SECAM_H 0x00000800 +#define VP_TV_STANDARD_SECAM_K 0x00001000 +#define VP_TV_STANDARD_SECAM_K1 0x00002000 +#define VP_TV_STANDARD_SECAM_L 0x00004000 +#define VP_TV_STANDARD_WIN_VGA 0x00008000 +#define VP_TV_STANDARD_NTSC_433 0x00010000 +#define VP_TV_STANDARD_PAL_G 0x00020000 +#define VP_TV_STANDARD_PAL_60 0x00040000 +#define VP_TV_STANDARD_SECAM_L1 0x00080000 + +/* VIDEOPARAMETERS.dwMode constants */ +#define VP_CP_TYPE_APS_TRIGGER 0x00000001 +#define VP_CP_TYPE_MACROVISION 0x00000002 + +/* VIDEOPARAMETERS.dwCPCommand constants */ +#define VP_CP_CMD_ACTIVATE 0x00000001 +#define VP_CP_CMD_DEACTIVATE 0x00000002 +#define VP_CP_CMD_CHANGE 0x00000004 + +typedef struct _VIDEOPARAMETERS { + GUID Guid; + DWORD dwOffset; + DWORD dwCommand; + DWORD dwFlags; + DWORD dwMode; + DWORD dwTVStandard; + DWORD dwAvailableModes; + DWORD dwAvailableTVStandard; + DWORD dwFlickerFilter; + DWORD dwOverScanX; + DWORD dwOverScanY; + DWORD dwMaxUnscaledX; + DWORD dwMaxUnscaledY; + DWORD dwPositionX; + DWORD dwPositionY; + DWORD dwBrightness; + DWORD dwContrast; + DWORD dwCPType; + DWORD dwCPCommand; + DWORD dwCPStandard; + DWORD dwCPKey; + BYTE bCP_APSTriggerBits; + BYTE bOEMCopyProtection[256]; +} VIDEOPARAMETERS, *PVIDEOPARAMETERS, FAR *LPVIDEOPARAMETERS; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __TVOUT_H */ diff --git a/reactos/w32api/include/ddk/upssvc.h b/reactos/w32api/include/ddk/upssvc.h new file mode 100644 index 00000000000..4e6f62e2d73 --- /dev/null +++ b/reactos/w32api/include/ddk/upssvc.h @@ -0,0 +1,98 @@ +/* + * upssvc.h + * + * UPS service interface + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __UPSSVC_H +#define __UPSSVC_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + +#if defined(_APCUPS_) + #define UPSAPI DECLSPEC_EXPORT +#else + #define UPSAPI DECLSPEC_IMPORT +#endif + + +#define UPS_ONLINE 1 +#define UPS_ONBATTERY 2 +#define UPS_LOWBATTERY 4 +#define UPS_NOCOMM 8 +#define UPS_CRITICAL 16 + +UPSAPI +VOID +DDKAPI +UPSCancelWait(VOID); + +UPSAPI +DWORD +DDKAPI +UPSGetState(VOID); + +#define UPS_INITUNKNOWNERROR 0 +#define UPS_INITOK 1 +#define UPS_INITNOSUCHDRIVER 2 +#define UPS_INITBADINTERFACE 3 +#define UPS_INITREGISTRYERROR 4 +#define UPS_INITCOMMOPENERROR 5 +#define UPS_INITCOMMSETUPERROR 6 + +UPSAPI +DWORD +DDKAPI +UPSInit(VOID); + +UPSAPI +VOID +DDKAPI +UPSStop(VOID); + +UPSAPI +VOID +DDKAPI +UPSTurnOff( + IN DWORD aTurnOffDelay); + +UPSAPI +VOID +DDKAPI +UPSWaitForStateChange( + IN DWORD aCurrentState, + IN DWORD anInterval); + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __UPSSVC_H */ diff --git a/reactos/w32api/include/ddk/usb.h b/reactos/w32api/include/ddk/usb.h new file mode 100644 index 00000000000..f3439352b9f --- /dev/null +++ b/reactos/w32api/include/ddk/usb.h @@ -0,0 +1,475 @@ +/* + * usb.h + * + * USB support. + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __USB_H +#define __USB_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __USBDI_H +#error usbdi.h cannot be included with usb.h +#else + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" +#include "usb100.h" + +typedef LONG USBD_STATUS; +typedef PVOID USBD_PIPE_HANDLE; +typedef PVOID USBD_CONFIGURATION_HANDLE; +typedef PVOID USBD_INTERFACE_HANDLE; + +#define USBD_STATUS_SUCCESS ((USBD_STATUS)0x00000000L) +#define USBD_STATUS_PENDING ((USBD_STATUS)0x40000000L) +#define USBD_STATUS_CRC ((USBD_STATUS)0xC0000001L) +#define USBD_STATUS_BTSTUFF ((USBD_STATUS)0xC0000002L) +#define USBD_STATUS_DATA_TOGGLE_MISMATCH ((USBD_STATUS)0xC0000003L) +#define USBD_STATUS_STALL_PID ((USBD_STATUS)0xC0000004L) +#define USBD_STATUS_DEV_NOT_RESPONDING ((USBD_STATUS)0xC0000005L) +#define USBD_STATUS_PID_CHECK_FAILURE ((USBD_STATUS)0xC0000006L) +#define USBD_STATUS_UNEXPECTED_PID ((USBD_STATUS)0xC0000007L) +#define USBD_STATUS_DATA_OVERRUN ((USBD_STATUS)0xC0000008L) +#define USBD_STATUS_DATA_UNDERRUN ((USBD_STATUS)0xC0000009L) +#define USBD_STATUS_RESERVED1 ((USBD_STATUS)0xC000000AL) +#define USBD_STATUS_RESERVED2 ((USBD_STATUS)0xC000000BL) +#define USBD_STATUS_BUFFER_OVERRUN ((USBD_STATUS)0xC000000CL) +#define USBD_STATUS_BUFFER_UNDERRUN ((USBD_STATUS)0xC000000DL) +#define USBD_STATUS_NOT_ACCESSED ((USBD_STATUS)0xC000000FL) +#define USBD_STATUS_FIFO ((USBD_STATUS)0xC0000010L) +#define USBD_STATUS_XACT_ERROR ((USBD_STATUS)0xC0000011L) +#define USBD_STATUS_BABBLE_DETECTED ((USBD_STATUS)0xC0000012L) +#define USBD_STATUS_DATA_BUFFER_ERROR ((USBD_STATUS)0xC0000013L) +#define USBD_STATUS_ENDPOINT_HALTED ((USBD_STATUS)0xC0000030L) +#define USBD_STATUS_INVALID_URB_FUNCTION ((USBD_STATUS)0x80000200L) +#define USBD_STATUS_INVALID_PARAMETER ((USBD_STATUS)0x80000300L) +#define USBD_STATUS_ERROR_BUSY ((USBD_STATUS)0x80000400L) +#define USBD_STATUS_INVALID_PIPE_HANDLE ((USBD_STATUS)0x80000600L) +#define USBD_STATUS_NO_BANDWIDTH ((USBD_STATUS)0x80000700L) +#define USBD_STATUS_INTERNAL_HC_ERROR ((USBD_STATUS)0x80000800L) +#define USBD_STATUS_ERROR_SHORT_TRANSFER ((USBD_STATUS)0x80000900L) +#define USBD_STATUS_BAD_START_FRAME ((USBD_STATUS)0xC0000A00L) +#define USBD_STATUS_ISOCH_REQUEST_FAILED ((USBD_STATUS)0xC0000B00L) +#define USBD_STATUS_FRAME_CONTROL_OWNED ((USBD_STATUS)0xC0000C00L) +#define USBD_STATUS_FRAME_CONTROL_NOT_OWNED \ + ((USBD_STATUS)0xC0000D00L) +#define USBD_STATUS_NOT_SUPPORTED ((USBD_STATUS)0xC0000E00L) +#define USBD_STATUS_INAVLID_CONFIGURATION_DESCRIPTOR \ + ((USBD_STATUS)0xC0000F00L) +#define USBD_STATUS_INSUFFICIENT_RESOURCES \ + ((USBD_STATUS)0xC0001000L) +#define USBD_STATUS_SET_CONFIG_FAILED ((USBD_STATUS)0xC0002000L) +#define USBD_STATUS_BUFFER_TOO_SMALL ((USBD_STATUS)0xC0003000L) +#define USBD_STATUS_INTERFACE_NOT_FOUND ((USBD_STATUS)0xC0004000L) +#define USBD_STATUS_INAVLID_PIPE_FLAGS ((USBD_STATUS)0xC0005000L) +#define USBD_STATUS_TIMEOUT ((USBD_STATUS)0xC0006000L) +#define USBD_STATUS_DEVICE_GONE ((USBD_STATUS)0xC0007000L) +#define USBD_STATUS_STATUS_NOT_MAPPED ((USBD_STATUS)0xC0008000L) +#define USBD_STATUS_CANCELED ((USBD_STATUS)0xC0010000L) +#define USBD_STATUS_ISO_NOT_ACCESSED_BY_HW \ + ((USBD_STATUS)0xC0020000L) +#define USBD_STATUS_ISO_TD_ERROR ((USBD_STATUS)0xC0030000L) +#define USBD_STATUS_ISO_NA_LATE_USBPORT ((USBD_STATUS)0xC0040000L) +#define USBD_STATUS_ISO_NOT_ACCESSED_LATE ((USBD_STATUS)0xC0050000L) + +#define USBD_SUCCESS(Status) ((USBD_STATUS)(Status) >= 0) +#define USBD_PENDING(Status) ((ULONG)(Status) >> 30 == 1) +#define USBD_ERROR(Status) ((USBD_STATUS)(Status) < 0) + +/* URB TransferFlags constants */ +#define USBD_TRANSFER_DIRECTION(x) ((x) & USBD_TRANSFER_DIRECTION_IN) +#define USBD_TRANSFER_DIRECTION_OUT 0 +#define USBD_TRANSFER_DIRECTION_BIT 0 +#define USBD_TRANSFER_DIRECTION_IN (1 << USBD_TRANSFER_DIRECTION_BIT) +#define USBD_SHORT_TRANSFER_OK_BIT 1 +#define USBD_SHORT_TRANSFER_OK (1 << USBD_SHORT_TRANSFER_OK_BIT) +#define USBD_START_ISO_TRANSFER_ASAP_BIT 2 +#define USBD_START_ISO_TRANSFER_ASAP (1 << USBD_START_ISO_TRANSFER_ASAP_BIT) +#define USBD_DEFAULT_PIPE_TRANSFER_BIT 3 +#define USBD_DEFAULT_PIPE_TRANSFER (1 << USBD_DEFAULT_PIPE_TRANSFER_BIT) + +#define USBD_TRANSFER_DIRECTION_FLAG(flags) ((flags) & USBD_TRANSFER_DIRECTION) + +#define VALID_TRANSFER_FLAGS_MASK \ + (USBD_SHORT_TRANSFER_OK | \ + USBD_TRANSFER_DIRECTION | \ + USBD_START_ISO_TRANSFER_ASAP | \ + USBD_DEFAULT_PIPE_TRANSFER) + +#define USB_DEFAULT_DEVICE_ADDRESS 0 +#define USB_DEFAULT_ENDPOINT_ADDRESS 0 +#define USB_DEFAULT_MAX_PACKET 64 +#define USBD_ISO_START_FRAME_RANGE 1024 +#define USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE 0xFFFFFFFF + +typedef enum _USB_CONTROLLER_FLAVOR { + USB_HcGeneric = 0, + OHCI_Generic = 100, + OHCI_Hydra, + OHCI_NEC, + UHCI_Generic = 200, + UHCI_Piix4, + UHCI_Piix3, + UHCI_Ich2_1, + UHCI_Ich2_2, + UHCI_Ich1, + UHCI_VIA = 250, + EHCI_Generic = 1000, + EHCI_NEC = 2000, + EHCI_Lucent = 3000 +} USB_CONTROLLER_FLAVOR; + +struct _URB_HEADER { + USHORT Length; + USHORT Function; + USBD_STATUS Status; + PVOID UsbdDeviceHandle; + ULONG UsbdFlags; +}; + +typedef struct _USBD_VERSION_INFORMATION { + ULONG USBDI_Version; + ULONG Supported_USB_Version; +} USBD_VERSION_INFORMATION, *PUSBD_VERSION_INFORMATION; + +struct _URB_HCD_AREA { + PVOID Reserved8[8]; +}; + +struct _URB_BULK_OR_INTERRUPT_TRANSFER { + struct _URB_HEADER Hdr; + USBD_PIPE_HANDLE PipeHandle; + ULONG TransferFlags; + ULONG TransferBufferLength; + PVOID TransferBuffer; + PMDL TransferBufferMDL; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; +}; + +struct _URB_CONTROL_DESCRIPTOR_REQUEST { + struct _URB_HEADER Hdr; + PVOID Reserved; + ULONG Reserved0; + ULONG TransferBufferLength; + PVOID TransferBuffer; + PMDL TransferBufferMDL; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; + USHORT Reserved1; + UCHAR Index; + UCHAR DescriptorType; + USHORT LanguageId; + USHORT Reserved2; +}; + +struct _URB_CONTROL_FEATURE_REQUEST { + struct _URB_HEADER Hdr; + PVOID Reserved; + ULONG Reserved2; + ULONG Reserved3; + PVOID Reserved4; + PMDL Reserved5; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; + USHORT Reserved0; + USHORT FeatureSelector; + USHORT Index; + USHORT Reserved1; +}; + +struct _URB_CONTROL_GET_CONFIGURATION_REQUEST { + struct _URB_HEADER Hdr; + PVOID Reserved; + ULONG Reserved0; + ULONG TransferBufferLength; + PVOID TransferBuffer; + PMDL TransferBufferMDL; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; + UCHAR Reserved1[8]; +}; + +struct _URB_CONTROL_GET_INTERFACE_REQUEST { + struct _URB_HEADER Hdr; + PVOID Reserved; + ULONG Reserved0; + ULONG TransferBufferLength; + PVOID TransferBuffer; + PMDL TransferBufferMDL; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; + UCHAR Reserved1[4]; + USHORT Interface; + USHORT Reserved2; +}; + +struct _URB_CONTROL_GET_STATUS_REQUEST { + struct _URB_HEADER Hdr; + PVOID Reserved; + ULONG Reserved0; + ULONG TransferBufferLength; + PVOID TransferBuffer; + PMDL TransferBufferMDL; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; + UCHAR Reserved1[4]; + USHORT Index; + USHORT Reserved2; +}; + +struct _URB_CONTROL_TRANSFER { + struct _URB_HEADER Hdr; + USBD_PIPE_HANDLE PipeHandle; + ULONG TransferFlags; + ULONG TransferBufferLength; + PVOID TransferBuffer; + PMDL TransferBufferMDL; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; + UCHAR SetupPacket[8]; +}; + +struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST { + struct _URB_HEADER Hdr; + PVOID Reserved; + ULONG TransferFlags; + ULONG TransferBufferLength; + PVOID TransferBuffer; + PMDL TransferBufferMDL; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; + UCHAR RequestTypeReservedBits; + UCHAR Request; + USHORT Value; + USHORT Index; + USHORT Reserved1; +}; + +struct _URB_FRAME_LENGTH_CONTROL { + struct _URB_HEADER Hdr; +}; + +struct _URB_GET_CURRENT_FRAME_NUMBER { + struct _URB_HEADER Hdr; + ULONG FrameNumber; +}; + +struct _URB_GET_FRAME_LENGTH { + struct _URB_HEADER Hdr; + ULONG FrameLength; + ULONG FrameNumber; +}; + +typedef struct _USBD_ISO_PACKET_DESCRIPTOR { + ULONG Offset; + ULONG Length; + USBD_STATUS Status; +} USBD_ISO_PACKET_DESCRIPTOR, *PUSBD_ISO_PACKET_DESCRIPTOR; + +struct _URB_ISOCH_TRANSFER { + struct _URB_HEADER Hdr; + USBD_PIPE_HANDLE PipeHandle; + ULONG TransferFlags; + ULONG TransferBufferLength; + PVOID TransferBuffer; + PMDL TransferBufferMDL; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; + ULONG StartFrame; + ULONG NumberOfPackets; + ULONG ErrorCount; + USBD_ISO_PACKET_DESCRIPTOR IsoPacket[1]; +}; + +typedef enum _USBD_PIPE_TYPE { + UsbdPipeTypeControl, + UsbdPipeTypeIsochronous, + UsbdPipeTypeBulk, + UsbdPipeTypeInterrupt +} USBD_PIPE_TYPE; + +typedef struct _USBD_PIPE_INFORMATION { + USHORT MaximumPacketSize; + UCHAR EndpointAddress; + UCHAR Interval; + USBD_PIPE_TYPE PipeType; + USBD_PIPE_HANDLE PipeHandle; + ULONG MaximumTransferSize; + ULONG PipeFlags; +} USBD_PIPE_INFORMATION, *PUSBD_PIPE_INFORMATION ; + +#define USBD_PIPE_DIRECTION_IN(pipeInformation) \ + ((pipeInformation)->EndpointAddress & USB_ENDPOINT_DIRECTION_MASK) + +typedef struct _USBD_INTERFACE_INFORMATION { + USHORT Length; + UCHAR InterfaceNumber; + UCHAR AlternateSetting; + UCHAR Class; + UCHAR SubClass; + UCHAR Protocol; + UCHAR Reserved; + USBD_INTERFACE_HANDLE InterfaceHandle; + ULONG NumberOfPipes; + USBD_PIPE_INFORMATION Pipes[1]; +} USBD_INTERFACE_INFORMATION, *PUSBD_INTERFACE_INFORMATION; + +struct _URB_SELECT_INTERFACE { + struct _URB_HEADER Hdr; + USBD_CONFIGURATION_HANDLE ConfigurationHandle; + USBD_INTERFACE_INFORMATION Interface; +}; + +struct _URB_SELECT_CONFIGURATION { + struct _URB_HEADER Hdr; + PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor; + USBD_CONFIGURATION_HANDLE ConfigurationHandle; + USBD_INTERFACE_INFORMATION Interface; +}; + +struct _URB_PIPE_REQUEST { + struct _URB_HEADER Hdr; + USBD_PIPE_HANDLE PipeHandle; + ULONG Reserved; +}; + +struct _URB_SET_FRAME_LENGTH { + struct _URB_HEADER Hdr; + LONG FrameLengthDelta; +}; + +typedef struct _URB { + _ANONYMOUS_UNION union { + struct _URB_HEADER UrbHeader; + struct _URB_SELECT_INTERFACE UrbSelectInterface; + struct _URB_SELECT_CONFIGURATION UrbSelectConfiguration; + struct _URB_PIPE_REQUEST UrbPipeRequest; + struct _URB_FRAME_LENGTH_CONTROL UrbFrameLengthControl; + struct _URB_GET_FRAME_LENGTH UrbGetFrameLength; + struct _URB_SET_FRAME_LENGTH UrbSetFrameLength; + struct _URB_GET_CURRENT_FRAME_NUMBER UrbGetCurrentFrameNumber; + struct _URB_CONTROL_TRANSFER UrbControlTransfer; + struct _URB_BULK_OR_INTERRUPT_TRANSFER UrbBulkOrInterruptTransfer; + struct _URB_ISOCH_TRANSFER UrbIsochronousTransfer; + struct _URB_CONTROL_DESCRIPTOR_REQUEST UrbControlDescriptorRequest; + struct _URB_CONTROL_GET_STATUS_REQUEST UrbControlGetStatusRequest; + struct _URB_CONTROL_FEATURE_REQUEST UrbControlFeatureRequest; + struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST UrbControlVendorClassRequest; + struct _URB_CONTROL_GET_INTERFACE_REQUEST UrbControlGetInterfaceRequest; + struct _URB_CONTROL_GET_CONFIGURATION_REQUEST UrbControlGetConfigurationRequest; + } DUMMYUNIONNAME; +} URB, *PURB; + +#define URB_FROM_IRP(Irp) ((IoGetCurrentIrpStackLocation(Irp))->Parameters.Others.Argument1) + +#define URB_FUNCTION_SELECT_CONFIGURATION 0x0000 +#define URB_FUNCTION_SELECT_INTERFACE 0x0001 +#define URB_FUNCTION_ABORT_PIPE 0x0002 +#define URB_FUNCTION_TAKE_FRAME_LENGTH_CONTROL 0x0003 +#define URB_FUNCTION_RELEASE_FRAME_LENGTH_CONTROL 0x0004 +#define URB_FUNCTION_GET_FRAME_LENGTH 0x0005 +#define URB_FUNCTION_SET_FRAME_LENGTH 0x0006 +#define URB_FUNCTION_GET_CURRENT_FRAME_NUMBER 0x0007 +#define URB_FUNCTION_CONTROL_TRANSFER 0x0008 +#define URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER 0x0009 +#define URB_FUNCTION_ISOCH_TRANSFER 0x000A +#define URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE 0x000B +#define URB_FUNCTION_SET_DESCRIPTOR_TO_DEVICE 0x000C +#define URB_FUNCTION_SET_FEATURE_TO_DEVICE 0x000D +#define URB_FUNCTION_SET_FEATURE_TO_INTERFACE 0x000E +#define URB_FUNCTION_SET_FEATURE_TO_ENDPOINT 0x000F +#define URB_FUNCTION_CLEAR_FEATURE_TO_DEVICE 0x0010 +#define URB_FUNCTION_CLEAR_FEATURE_TO_INTERFACE 0x0011 +#define URB_FUNCTION_CLEAR_FEATURE_TO_ENDPOINT 0x0012 +#define URB_FUNCTION_GET_STATUS_FROM_DEVICE 0x0013 +#define URB_FUNCTION_GET_STATUS_FROM_INTERFACE 0x0014 +#define URB_FUNCTION_GET_STATUS_FROM_ENDPOINT 0x0015 +#define URB_FUNCTION_RESERVED_0X0016 0x0016 +#define URB_FUNCTION_VENDOR_DEVICE 0x0017 +#define URB_FUNCTION_VENDOR_INTERFACE 0x0018 +#define URB_FUNCTION_VENDOR_ENDPOINT 0x0019 +#define URB_FUNCTION_CLASS_DEVICE 0x001A +#define URB_FUNCTION_CLASS_INTERFACE 0x001B +#define URB_FUNCTION_CLASS_ENDPOINT 0x001C +#define URB_FUNCTION_RESERVE_0X001D 0x001D +#define URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL 0x001E +#define URB_FUNCTION_CLASS_OTHER 0x001F +#define URB_FUNCTION_VENDOR_OTHER 0x0020 +#define URB_FUNCTION_GET_STATUS_FROM_OTHER 0x0021 +#define URB_FUNCTION_CLEAR_FEATURE_TO_OTHER 0x0022 +#define URB_FUNCTION_SET_FEATURE_TO_OTHER 0x0023 +#define URB_FUNCTION_GET_DESCRIPTOR_FROM_ENDPOINT 0x0024 +#define URB_FUNCTION_SET_DESCRIPTOR_TO_ENDPOINT 0x0025 +#define URB_FUNCTION_GET_CONFIGURATION 0x0026 +#define URB_FUNCTION_GET_INTERFACE 0x0027 +#define URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE 0x0028 +#define URB_FUNCTION_SET_DESCRIPTOR_TO_INTERFACE 0x0029 +#define URB_FUNCTION_GET_MS_FEATURE_DESCRIPTOR 0x002A +#define URB_FUNCTION_RESERVE_0X002B 0x002B +#define URB_FUNCTION_RESERVE_0X002C 0x002C +#define URB_FUNCTION_RESERVE_0X002D 0x002D +#define URB_FUNCTION_RESERVE_0X002E 0x002E +#define URB_FUNCTION_RESERVE_0X002F 0x002F +#define URB_FUNCTION_SYNC_RESET_PIPE 0x0030 +#define URB_FUNCTION_SYNC_CLEAR_STALL 0x0031 + +#define USBD_PF_CHANGE_MAX_PACKET 0x00000001 +#define USBD_PF_SHORT_PACKET_OPT 0x00000002 +#define USBD_PF_ENABLE_RT_THREAD_ACCESS 0x00000004 +#define USBD_PF_MAP_ADD_TRANSFERS 0x00000008 + +#define USBD_PF_VALID_MASK (USBD_PF_CHANGE_MAX_PACKET | \ + USBD_PF_SHORT_PACKET_OPT | \ + USBD_PF_ENABLE_RT_THREAD_ACCESS | \ + USBD_PF_MAP_ADD_TRANSFERS) + +#define OS_STRING_DESCRIPTOR_INDEX 0xEE + +#define MS_GENRE_DESCRIPTOR_INDEX 0x0001 +#define MS_POWER_DESCRIPTOR_INDEX 0x0002 + +#define MS_OS_STRING_SIGNATURE L"MSFT100" + +typedef struct _OS_STRING { + UCHAR bLength; + UCHAR bDescriptorType; + WCHAR MicrosoftString[7]; + UCHAR bVendorCode; + UCHAR bPad; +} OS_STRING, *POS_STRING; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* defined __USBDI_H */ + +#endif /* __USB_H */ diff --git a/reactos/w32api/include/ddk/usb100.h b/reactos/w32api/include/ddk/usb100.h new file mode 100644 index 00000000000..df28f1712ed --- /dev/null +++ b/reactos/w32api/include/ddk/usb100.h @@ -0,0 +1,233 @@ +/* + * usb100.h + * + * USB 1.0 support + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __USB100_H +#define __USB100_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + + +#define MAXIMUM_USB_STRING_LENGTH 255 + +#define USB_DEVICE_CLASS_RESERVED 0x00 +#define USB_DEVICE_CLASS_AUDIO 0x01 +#define USB_DEVICE_CLASS_COMMUNICATIONS 0x02 +#define USB_DEVICE_CLASS_HUMAN_INTERFACE 0x03 +#define USB_DEVICE_CLASS_MONITOR 0x04 +#define USB_DEVICE_CLASS_PHYSICAL_INTERFACE 0x05 +#define USB_DEVICE_CLASS_POWER 0x06 +#define USB_DEVICE_CLASS_PRINTER 0x07 +#define USB_DEVICE_CLASS_STORAGE 0x08 +#define USB_DEVICE_CLASS_HUB 0x09 +#define USB_DEVICE_CLASS_VENDOR_SPECIFIC 0xFF + +#define USB_RESERVED_DESCRIPTOR_TYPE 0x06 +#define USB_CONFIG_POWER_DESCRIPTOR_TYPE 0x07 +#define USB_INTERFACE_POWER_DESCRIPTOR_TYPE 0x08 + +#define USB_REQUEST_GET_STATUS 0x00 +#define USB_REQUEST_CLEAR_FEATURE 0x01 +#define USB_REQUEST_SET_FEATURE 0x03 +#define USB_REQUEST_SET_ADDRESS 0x05 +#define USB_REQUEST_GET_DESCRIPTOR 0x06 +#define USB_REQUEST_SET_DESCRIPTOR 0x07 +#define USB_REQUEST_GET_CONFIGURATION 0x08 +#define USB_REQUEST_SET_CONFIGURATION 0x09 +#define USB_REQUEST_GET_INTERFACE 0x0A +#define USB_REQUEST_SET_INTERFACE 0x0B +#define USB_REQUEST_SYNC_FRAME 0x0C + +#define USB_GETSTATUS_SELF_POWERED 0x01 +#define USB_GETSTATUS_REMOTE_WAKEUP_ENABLED 0x02 + +#define BMREQUEST_HOST_TO_DEVICE 0 +#define BMREQUEST_DEVICE_TO_HOST 1 + +#define BMREQUEST_STANDARD 0 +#define BMREQUEST_CLASS 1 +#define BMREQUEST_VENDOR 2 + +#define BMREQUEST_TO_DEVICE 0 +#define BMREQUEST_TO_INTERFACE 1 +#define BMREQUEST_TO_ENDPOINT 2 +#define BMREQUEST_TO_OTHER 3 + +/* USB_COMMON_DESCRIPTOR.bDescriptorType constants */ +#define USB_DEVICE_DESCRIPTOR_TYPE 0x01 +#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02 +#define USB_STRING_DESCRIPTOR_TYPE 0x03 +#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04 +#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05 + +typedef struct _USB_COMMON_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; +} USB_COMMON_DESCRIPTOR, *PUSB_COMMON_DESCRIPTOR; + +#define USB_DESCRIPTOR_MAKE_TYPE_AND_INDEX(d, i) ((USHORT)((USHORT)d << 8 | i)) + +/* USB_CONFIGURATION_DESCRIPTOR.bmAttributes constants */ +#define USB_CONFIG_POWERED_MASK 0xc0 +#define USB_CONFIG_BUS_POWERED 0x80 +#define USB_CONFIG_SELF_POWERED 0x40 +#define USB_CONFIG_REMOTE_WAKEUP 0x20 + +typedef struct _USB_CONFIGURATION_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + USHORT wTotalLength; + UCHAR bNumInterfaces; + UCHAR iConfiguration; + UCHAR bmAttributes; + UCHAR MaxPower; +} USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR; + +typedef struct _USB_DEVICE_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + USHORT bcdUSB; + UCHAR bDeviceClass; + UCHAR bDeviceSubClass; + UCHAR bDeviceProtocol; + UCHAR bMaxPacketSize0; + USHORT idVendor; + USHORT idProduct; + USHORT bcdDevice; + UCHAR iManufacturer; + UCHAR iProduct; + UCHAR iSerialNumber; + UCHAR bNumConfigurations; +} USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR; + +#define USB_ENDPOINT_DIRECTION_MASK 0x80 + +#define USB_ENDPOINT_DIRECTION_OUT(x) (!((x) & USB_ENDPOINT_DIRECTION_MASK)) +#define USB_ENDPOINT_DIRECTION_IN(x) ((x) & USB_ENDPOINT_DIRECTION_MASK) + +/* USB_ENDPOINT_DESCRIPTOR.bmAttributes constants */ +#define USB_ENDPOINT_TYPE_MASK 0x03 +#define USB_ENDPOINT_TYPE_CONTROL 0x00 +#define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01 +#define USB_ENDPOINT_TYPE_BULK 0x02 +#define USB_ENDPOINT_TYPE_INTERRUPT 0x03 + +typedef struct _USB_ENDPOINT_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + UCHAR bEndpointAddress; + UCHAR bmAttributes; + USHORT wMaxPacketSize; + UCHAR bInterval; +} USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR; + +#define USB_FEATURE_ENDPOINT_STALL 0x0000 +#define USB_FEATURE_REMOTE_WAKEUP 0x0001 + +typedef struct _USB_INTERFACE_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + UCHAR bInterfaceNumber; + UCHAR bAlternateSetting; + UCHAR bNumEndpoints; + UCHAR bInterfaceClass; + UCHAR bInterfaceSubClass; + UCHAR bInterfaceProtocol; + UCHAR iInterface; +} USB_INTERFACE_DESCRIPTOR, *PUSB_INTERFACE_DESCRIPTOR; + +typedef struct _USB_STRING_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + WCHAR bString[1]; +} USB_STRING_DESCRIPTOR, *PUSB_STRING_DESCRIPTOR; + +typedef struct _USB_HUB_DESCRIPTOR { + UCHAR bDescriptorLength; + UCHAR bDescriptorType; + UCHAR bNumberOfPorts; + USHORT wHubCharacteristics; + UCHAR bPowerOnToPowerGood; + UCHAR bHubControlCurrent; + UCHAR bRemoveAndPowerMask[64]; +} USB_HUB_DESCRIPTOR, *PUSB_HUB_DESCRIPTOR; + +#define USB_SUPPORT_D0_COMMAND 0x01 +#define USB_SUPPORT_D1_COMMAND 0x02 +#define USB_SUPPORT_D2_COMMAND 0x04 +#define USB_SUPPORT_D3_COMMAND 0x08 + +#define USB_SUPPORT_D1_WAKEUP 0x10 +#define USB_SUPPORT_D2_WAKEUP 0x20 + +typedef struct _USB_CONFIGURATION_POWER_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + UCHAR SelfPowerConsumedD0[3]; + UCHAR bPowerSummaryId; + UCHAR bBusPowerSavingD1; + UCHAR bSelfPowerSavingD1; + UCHAR bBusPowerSavingD2; + UCHAR bSelfPowerSavingD2; + UCHAR bBusPowerSavingD3; + UCHAR bSelfPowerSavingD3; + USHORT TransitionTimeFromD1; + USHORT TransitionTimeFromD2; + USHORT TransitionTimeFromD3; +} USB_CONFIGURATION_POWER_DESCRIPTOR, *PUSB_CONFIGURATION_POWER_DESCRIPTOR; + +#define USB_FEATURE_INTERFACE_POWER_D0 0x0002 +#define USB_FEATURE_INTERFACE_POWER_D1 0x0003 +#define USB_FEATURE_INTERFACE_POWER_D2 0x0004 +#define USB_FEATURE_INTERFACE_POWER_D3 0x0005 + +typedef struct _USB_INTERFACE_POWER_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + UCHAR bmCapabilitiesFlags; + UCHAR bBusPowerSavingD1; + UCHAR bSelfPowerSavingD1; + UCHAR bBusPowerSavingD2; + UCHAR bSelfPowerSavingD2; + UCHAR bBusPowerSavingD3; + UCHAR bSelfPowerSavingD3; + USHORT TransitionTimeFromD1; + USHORT TransitionTimeFromD2; + USHORT TransitionTimeFromD3; +} USB_INTERFACE_POWER_DESCRIPTOR, *PUSB_INTERFACE_POWER_DESCRIPTOR; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __USB100_H */ diff --git a/reactos/w32api/include/ddk/usbcamdi.h b/reactos/w32api/include/ddk/usbcamdi.h new file mode 100644 index 00000000000..5d96435d86a --- /dev/null +++ b/reactos/w32api/include/ddk/usbcamdi.h @@ -0,0 +1,404 @@ +/* + * usbcamdi.h + * + * USB Camera driver interface. + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __USBCAMDI_H +#define __USBCAMDI_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#if !defined(__USB_H) && !defined(__USBDI_H) +#error include usb.h or usbdi.h before usbcamdi.h +#else + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + +#if defined(_BATTERYCLASS_) + #define USBCAMAPI DECLSPEC_EXPORT +#else + #define USBCAMAPI DECLSPEC_IMPORT +#endif + + +/* FIXME: Unknown definition */ +typedef PVOID PHW_STREAM_REQUEST_BLOCK; + +DEFINE_GUID(GUID_USBCAMD_INTERFACE, + 0x2bcb75c0, 0xb27f, 0x11d1, 0xba, 0x41, 0x0, 0xa0, 0xc9, 0xd, 0x2b, 0x5); + +#define USBCAMD_PROCESSPACKETEX_DropFrame 0x0002 +#define USBCAMD_PROCESSPACKETEX_NextFrameIsStill 0x0004 +#define USBCAMD_PROCESSPACKETEX_CurrentFrameIsStill 0x0008 + +#define USBCAMD_DATA_PIPE 0x0001 +#define USBCAMD_MULTIPLEX_PIPE 0x0002 +#define USBCAMD_SYNC_PIPE 0x0004 +#define USBCAMD_DONT_CARE_PIPE 0x0008 + +#define USBCAMD_VIDEO_STREAM 0x1 +#define USBCAMD_STILL_STREAM 0x2 +#define USBCAMD_VIDEO_STILL_STREAM (USBCAMD_VIDEO_STREAM | USBCAMD_STILL_STREAM) + +#define USBCAMD_STOP_STREAM 0x00000001 +#define USBCAMD_START_STREAM 0x00000000 + +typedef struct _pipe_config_descriptor { + CHAR StreamAssociation; + UCHAR PipeConfigFlags; +} USBCAMD_Pipe_Config_Descriptor, *PUSBCAMD_Pipe_Config_Descriptor; + +typedef enum { + USBCAMD_CamControlFlag_NoVideoRawProcessing = 1, + USBCAMD_CamControlFlag_NoStillRawProcessing = 2, + USBCAMD_CamControlFlag_AssociatedFormat = 4, + USBCAMD_CamControlFlag_EnableDeviceEvents = 8 +} USBCAMD_CamControlFlags; + +typedef NTSTATUS DDKAPI +(*PCAM_ALLOCATE_BW_ROUTINE)( + PDEVICE_OBJECT BusDeviceObject, + PVOID DeviceContext, + PULONG RawFrameLength, + PVOID Format); + +typedef NTSTATUS DDKAPI +(*PCAM_ALLOCATE_BW_ROUTINE_EX)( + PDEVICE_OBJECT BusDeviceObject, + PVOID DeviceContext, + PULONG RawFrameLength, + PVOID Format, + ULONG StreamNumber); + +typedef NTSTATUS DDKAPI +(*PCAM_CONFIGURE_ROUTINE)( + PDEVICE_OBJECT BusDeviceObject, + PVOID DeviceContext, + PUSBD_INTERFACE_INFORMATION Interface, + PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, + PLONG DataPipeIndex, + PLONG SyncPipeIndex); + +typedef NTSTATUS DDKAPI +(*PCAM_CONFIGURE_ROUTINE_EX)( + PDEVICE_OBJECT BusDeviceObject, + PVOID DeviceContext, + PUSBD_INTERFACE_INFORMATION Interface, + PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, + ULONG PipeConfigListSize, + PUSBCAMD_Pipe_Config_Descriptor PipeConfig, + PUSB_DEVICE_DESCRIPTOR DeviceDescriptor); + +typedef NTSTATUS DDKAPI +(*PCAM_FREE_BW_ROUTINE)( + PDEVICE_OBJECT BusDeviceObject, + PVOID DeviceContext); + +typedef NTSTATUS DDKAPI +(*PCAM_FREE_BW_ROUTINE_EX)( + PDEVICE_OBJECT BusDeviceObject, + PVOID DeviceContext, + ULONG StreamNumber); + +typedef NTSTATUS DDKAPI +(*PCAM_INITIALIZE_ROUTINE)( + PDEVICE_OBJECT BusDeviceObject, + PVOID DeviceContext); + +typedef VOID DDKAPI +(*PCAM_NEW_FRAME_ROUTINE)( + PVOID DeviceContext, + PVOID FrameContext); + +typedef VOID DDKAPI +(*PCAM_NEW_FRAME_ROUTINE_EX)( + PVOID DeviceContext, + PVOID FrameContext, + ULONG StreamNumber, + PULONG FrameLength); + +typedef NTSTATUS DDKAPI +(*PCAM_PROCESS_RAW_FRAME_ROUTINE)( + PDEVICE_OBJECT BusDeviceObject, + PVOID DeviceContext, + PVOID FrameContext, + PVOID FrameBuffer, + ULONG FrameLength, + PVOID RawFrameBuffer, + ULONG RawFrameLength, + ULONG NumberOfPackets, + PULONG BytesReturned); + +typedef NTSTATUS DDKAPI +(*PCAM_PROCESS_RAW_FRAME_ROUTINE_EX)( + PDEVICE_OBJECT BusDeviceObject, + PVOID DeviceContext, + PVOID FrameContext, + PVOID FrameBuffer, + ULONG FrameLength, + PVOID RawFrameBuffer, + ULONG RawFrameLength, + ULONG NumberOfPackets, + PULONG BytesReturned, + ULONG ActualRawFrameLength, + ULONG StreamNumber); + +typedef ULONG DDKAPI +(*PCAM_PROCESS_PACKET_ROUTINE)( + PDEVICE_OBJECT BusDeviceObject, + PVOID DeviceContext, + PVOID CurrentFrameContext, + PUSBD_ISO_PACKET_DESCRIPTOR SyncPacket, + PVOID SyncBuffer, + PUSBD_ISO_PACKET_DESCRIPTOR DataPacket, + PVOID DataBuffer, + PBOOLEAN FrameComplete, + PBOOLEAN NextFrameIsStill); + +typedef ULONG DDKAPI +(*PCAM_PROCESS_PACKET_ROUTINE_EX)( + PDEVICE_OBJECT BusDeviceObject, + PVOID DeviceContext, + PVOID CurrentFrameContext, + PUSBD_ISO_PACKET_DESCRIPTOR SyncPacket, + PVOID SyncBuffer, + PUSBD_ISO_PACKET_DESCRIPTOR DataPacket, + PVOID DataBuffer, + PBOOLEAN FrameComplete, + PULONG PacketFlag, + PULONG ValidDataOffset); + +typedef NTSTATUS DDKAPI +(*PCAM_STATE_ROUTINE)( + PDEVICE_OBJECT BusDeviceObject, + PVOID DeviceContext); + +typedef NTSTATUS DDKAPI +(*PCAM_START_CAPTURE_ROUTINE)( + PDEVICE_OBJECT BusDeviceObject, + PVOID DeviceContext); + +typedef NTSTATUS DDKAPI +(*PCAM_START_CAPTURE_ROUTINE_EX)( + PDEVICE_OBJECT BusDeviceObject, + PVOID DeviceContext, + ULONG StreamNumber); + +typedef NTSTATUS DDKAPI +(*PCAM_STOP_CAPTURE_ROUTINE)( + PDEVICE_OBJECT BusDeviceObject, + PVOID DeviceContext); + +typedef NTSTATUS DDKAPI +(*PCAM_STOP_CAPTURE_ROUTINE_EX)( + PDEVICE_OBJECT BusDeviceObject, + PVOID DeviceContext, + ULONG StreamNumber); + +typedef struct _USBCAMD_DEVICE_DATA { + ULONG Sig; + PCAM_INITIALIZE_ROUTINE CamInitialize; + PCAM_INITIALIZE_ROUTINE CamUnInitialize; + PCAM_PROCESS_PACKET_ROUTINE CamProcessUSBPacket; + PCAM_NEW_FRAME_ROUTINE CamNewVideoFrame; + PCAM_PROCESS_RAW_FRAME_ROUTINE CamProcessRawVideoFrame; + PCAM_START_CAPTURE_ROUTINE CamStartCapture; + PCAM_STOP_CAPTURE_ROUTINE CamStopCapture; + PCAM_CONFIGURE_ROUTINE CamConfigure; + PCAM_STATE_ROUTINE CamSaveState; + PCAM_STATE_ROUTINE CamRestoreState; + PCAM_ALLOCATE_BW_ROUTINE CamAllocateBandwidth; + PCAM_FREE_BW_ROUTINE CamFreeBandwidth; +} USBCAMD_DEVICE_DATA, *PUSBCAMD_DEVICE_DATA; + +typedef struct _USBCAMD_DEVICE_DATA2 { + ULONG Sig; + PCAM_INITIALIZE_ROUTINE CamInitialize; + PCAM_INITIALIZE_ROUTINE CamUnInitialize; + PCAM_PROCESS_PACKET_ROUTINE_EX CamProcessUSBPacketEx; + PCAM_NEW_FRAME_ROUTINE_EX CamNewVideoFrameEx; + PCAM_PROCESS_RAW_FRAME_ROUTINE_EX CamProcessRawVideoFrameEx; + PCAM_START_CAPTURE_ROUTINE_EX CamStartCaptureEx; + PCAM_STOP_CAPTURE_ROUTINE_EX CamStopCaptureEx; + PCAM_CONFIGURE_ROUTINE_EX CamConfigureEx; + PCAM_STATE_ROUTINE CamSaveState; + PCAM_STATE_ROUTINE CamRestoreState; + PCAM_ALLOCATE_BW_ROUTINE_EX CamAllocateBandwidthEx; + PCAM_FREE_BW_ROUTINE_EX CamFreeBandwidthEx; +} USBCAMD_DEVICE_DATA2, *PUSBCAMD_DEVICE_DATA2; + +USBCAMAPI +ULONG +DDKAPI +USBCAMD_InitializeNewInterface( + IN PVOID DeviceContext, + IN PVOID DeviceData, + IN ULONG Version, + IN ULONG CamControlFlag); + +typedef VOID DDKAPI +(*PCOMMAND_COMPLETE_FUNCTION)( + PVOID DeviceContext, + PVOID CommandContext, + NTSTATUS NtStatus); + +typedef NTSTATUS DDKAPI +(*PFNUSBCAMD_BulkReadWrite)( + IN PVOID DeviceContext, + IN USHORT PipeIndex, + IN PVOID Buffer, + IN ULONG BufferLength, + IN PCOMMAND_COMPLETE_FUNCTION CommandComplete, + IN PVOID CommandContext); + +typedef NTSTATUS DDKAPI +(*PFNUSBCAMD_SetIsoPipeState)( + IN PVOID DeviceContext, + IN ULONG PipeStateFlags); + +typedef NTSTATUS DDKAPI +(*PFNUSBCAMD_CancelBulkReadWrite)( + IN PVOID DeviceContext, + IN ULONG PipeIndex); + +typedef NTSTATUS DDKAPI +(*PFNUSBCAMD_SetVideoFormat)( + IN PVOID DeviceContext, + IN PHW_STREAM_REQUEST_BLOCK pSrb); + +typedef NTSTATUS DDKAPI +(*PFNUSBCAMD_WaitOnDeviceEvent)( + IN PVOID DeviceContext, + IN ULONG PipeIndex, + IN PVOID Buffer, + IN ULONG BufferLength, + IN PCOMMAND_COMPLETE_FUNCTION EventComplete, + IN PVOID EventContext, + IN BOOLEAN LoopBack); + +USBCAMAPI +PVOID +DDKAPI +USBCAMD_AdapterReceivePacket( + IN PHW_STREAM_REQUEST_BLOCK Srb, + IN PUSBCAMD_DEVICE_DATA DeviceData, + IN PDEVICE_OBJECT *DeviceObject, + IN BOOLEAN NeedsCompletion); + +USBCAMAPI +NTSTATUS +DDKAPI +USBCAMD_ControlVendorCommand( + IN PVOID DeviceContext, + IN UCHAR Request, + IN USHORT Value, + IN USHORT Index, + IN PVOID Buffer, + IN OUT PULONG BufferLength, + IN BOOLEAN GetData, + IN PCOMMAND_COMPLETE_FUNCTION CommandComplete, + IN PVOID CommandContext); + +typedef VOID DDKAPI +(*PADAPTER_RECEIVE_PACKET_ROUTINE)( + IN PHW_STREAM_REQUEST_BLOCK Srb); + +USBCAMAPI +ULONG +DDKAPI +USBCAMD_DriverEntry( + PVOID Context1, + PVOID Context2, + ULONG DeviceContextSize, + ULONG FrameContextSize, + PADAPTER_RECEIVE_PACKET_ROUTINE ReceivePacket); + +USBCAMAPI +NTSTATUS +DDKAPI +USBCAMD_GetRegistryKeyValue( + IN HANDLE Handle, + IN PWCHAR KeyNameString, + IN ULONG KeyNameStringLength, + IN PVOID Data, + IN ULONG DataLength); + +USBCAMAPI +NTSTATUS +DDKAPI +USBCAMD_SelectAlternateInterface( + IN PVOID DeviceContext, + IN OUT PUSBD_INTERFACE_INFORMATION RequestInterface); + +#define USBCAMD_VERSION_200 0x200 + +typedef struct _USBCAMD_INTERFACE { + INTERFACE Interface; + PFNUSBCAMD_WaitOnDeviceEvent USBCAMD_WaitOnDeviceEvent; + PFNUSBCAMD_BulkReadWrite USBCAMD_BulkReadWrite; + PFNUSBCAMD_SetVideoFormat USBCAMD_SetVideoFormat; + PFNUSBCAMD_SetIsoPipeState USBCAMD_SetIsoPipeState; + PFNUSBCAMD_CancelBulkReadWrite USBCAMD_CancelBulkReadWrite; +} USBCAMD_INTERFACE, *PUSBCAMD_INTERFACE; + +typedef VOID DDKAPI +(*PSTREAM_RECEIVE_PACKET)( + IN PVOID Srb, + IN PVOID DeviceContext, + IN PBOOLEAN Completed); + +#if defined(DEBUG_LOG) + +USBCAMAPI +VOID +DDKAPI +USBCAMD_Debug_LogEntry( + IN CHAR *Name, + IN ULONG Info1, + IN ULONG Info2, + IN ULONG Info3); + +#define ILOGENTRY(sig, info1, info2, info3) \ + USBCAMD_Debug_LogEntry(sig, (ULONG)info1, (ULONG)info2, (ULONG)info3) + +#else + +#define ILOGENTRY(sig, info1, info2, info3) + +#endif /* DEBUG_LOG */ + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(__USB_H) && !defined(__USBDI_H) */ + + +#endif /* __USBCAMDI_H */ diff --git a/reactos/w32api/include/ddk/usbdi.h b/reactos/w32api/include/ddk/usbdi.h new file mode 100644 index 00000000000..7caca07a765 --- /dev/null +++ b/reactos/w32api/include/ddk/usbdi.h @@ -0,0 +1,412 @@ +/* + * usbdi.h + * + * USBD and USB device driver definitions + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __USBDI_H +#define __USBDI_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __USB_H +#error usb.h cannot be included with usbdi.h +#else + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" +#include "usbioctl.h" + + +#define USBDI_VERSION 0x300 + +#define USB_DEFAULT_DEVICE_ADDRESS 0 +#define USB_DEFAULT_ENDPOINT_ADDRESS 0 +#define USB_DEFAULT_MAX_PACKET 64 + +#define URB_FROM_IRP(Irp) ((IoGetCurrentIrpStackLocation(Irp))->Parameters.Others.Argument1) + +#define URB_FUNCTION_SELECT_CONFIGURATION 0x0000 +#define URB_FUNCTION_SELECT_INTERFACE 0x0001 +#define URB_FUNCTION_ABORT_PIPE 0x0002 +#define URB_FUNCTION_TAKE_FRAME_LENGTH_CONTROL 0x0003 +#define URB_FUNCTION_RELEASE_FRAME_LENGTH_CONTROL 0x0004 +#define URB_FUNCTION_GET_FRAME_LENGTH 0x0005 +#define URB_FUNCTION_SET_FRAME_LENGTH 0x0006 +#define URB_FUNCTION_GET_CURRENT_FRAME_NUMBER 0x0007 +#define URB_FUNCTION_CONTROL_TRANSFER 0x0008 +#define URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER 0x0009 +#define URB_FUNCTION_ISOCH_TRANSFER 0x000A +#define URB_FUNCTION_RESET_PIPE 0x001E +#define URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE 0x000B +#define URB_FUNCTION_GET_DESCRIPTOR_FROM_ENDPOINT 0x0024 +#define URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE 0x0028 +#define URB_FUNCTION_SET_DESCRIPTOR_TO_DEVICE 0x000C +#define URB_FUNCTION_SET_DESCRIPTOR_TO_ENDPOINT 0x0025 +#define URB_FUNCTION_SET_DESCRIPTOR_TO_INTERFACE 0x0029 +#define URB_FUNCTION_SET_FEATURE_TO_DEVICE 0x000D +#define URB_FUNCTION_SET_FEATURE_TO_INTERFACE 0x000E +#define URB_FUNCTION_SET_FEATURE_TO_ENDPOINT 0x000F +#define URB_FUNCTION_SET_FEATURE_TO_OTHER 0x0023 +#define URB_FUNCTION_CLEAR_FEATURE_TO_DEVICE 0x0010 +#define URB_FUNCTION_CLEAR_FEATURE_TO_INTERFACE 0x0011 +#define URB_FUNCTION_CLEAR_FEATURE_TO_ENDPOINT 0x0012 +#define URB_FUNCTION_CLEAR_FEATURE_TO_OTHER 0x0022 +#define URB_FUNCTION_GET_STATUS_FROM_DEVICE 0x0013 +#define URB_FUNCTION_GET_STATUS_FROM_INTERFACE 0x0014 +#define URB_FUNCTION_GET_STATUS_FROM_ENDPOINT 0x0015 +#define URB_FUNCTION_GET_STATUS_FROM_OTHER 0x0021 +#define URB_FUNCTION_RESERVED0 0x0016 +#define URB_FUNCTION_VENDOR_DEVICE 0x0017 +#define URB_FUNCTION_VENDOR_INTERFACE 0x0018 +#define URB_FUNCTION_VENDOR_ENDPOINT 0x0019 +#define URB_FUNCTION_VENDOR_OTHER 0x0020 +#define URB_FUNCTION_CLASS_DEVICE 0x001A +#define URB_FUNCTION_CLASS_INTERFACE 0x001B +#define URB_FUNCTION_CLASS_ENDPOINT 0x001C +#define URB_FUNCTION_CLASS_OTHER 0x001F +#define URB_FUNCTION_RESERVED 0x001D +#define URB_FUNCTION_GET_CONFIGURATION 0x0026 +#define URB_FUNCTION_GET_INTERFACE 0x0027 +#define URB_FUNCTION_LAST 0x0029 + +typedef LONG USBD_STATUS; +typedef PVOID USBD_PIPE_HANDLE; +typedef PVOID USBD_CONFIGURATION_HANDLE; +typedef PVOID USBD_INTERFACE_HANDLE; + +#define USBD_ERROR(Status) ((USBD_STATUS)(Status) < 0) +#define USBD_HALTED(Status) ((ULONG)(Status) >> 30 == 3) +#define USBD_PENDING(Status) ((ULONG)(Status) >> 30 == 1) +#define USBD_STATUS(Status) ((ULONG)(Status) & 0x0FFFFFFFL) +#define USBD_SUCCESS(Status) ((USBD_STATUS)(Status) >= 0) + +#define USBD_STATUS_SUCCESS ((USBD_STATUS)0x00000000L) +#define USBD_STATUS_PENDING ((USBD_STATUS)0x40000000L) +#define USBD_STATUS_HALTED ((USBD_STATUS)0xC0000000L) +#define USBD_STATUS_ERROR ((USBD_STATUS)0x80000000L) +#define USBD_STATUS_NO_MEMORY ((USBD_STATUS)0x80000100L) +#define USBD_STATUS_INVALID_URB_FUNCTION ((USBD_STATUS)0x80000200L) +#define USBD_STATUS_INVALID_PARAMETER ((USBD_STATUS)0x80000300L) +#define USBD_STATUS_ERROR_BUSY ((USBD_STATUS)0x80000400L) +#define USBD_STATUS_REQUEST_FAILED ((USBD_STATUS)0x80000500L) +#define USBD_STATUS_INVALID_PIPE_HANDLE ((USBD_STATUS)0x80000600L) +#define USBD_STATUS_NO_BANDWIDTH ((USBD_STATUS)0x80000700L) +#define USBD_STATUS_INTERNAL_HC_ERROR ((USBD_STATUS)0x80000800L) +#define USBD_STATUS_ERROR_SHORT_TRANSFER ((USBD_STATUS)0x80000900L) +#define USBD_STATUS_CRC ((USBD_STATUS)0xC0000001L) +#define USBD_STATUS_BTSTUFF ((USBD_STATUS)0xC0000002L) +#define USBD_STATUS_DATA_TOGGLE_MISMATCH ((USBD_STATUS)0xC0000003L) +#define USBD_STATUS_STALL_PID ((USBD_STATUS)0xC0000004L) +#define USBD_STATUS_DEV_NOT_RESPONDING ((USBD_STATUS)0xC0000005L) +#define USBD_STATUS_PID_CHECK_FAILURE ((USBD_STATUS)0xC0000006L) +#define USBD_STATUS_UNEXPECTED_PID ((USBD_STATUS)0xC0000007L) +#define USBD_STATUS_DATA_OVERRUN ((USBD_STATUS)0xC0000008L) +#define USBD_STATUS_DATA_UNDERRUN ((USBD_STATUS)0xC0000009L) +#define USBD_STATUS_RESERVED1 ((USBD_STATUS)0xC000000AL) +#define USBD_STATUS_RESERVED2 ((USBD_STATUS)0xC000000BL) +#define USBD_STATUS_BUFFER_OVERRUN ((USBD_STATUS)0xC000000CL) +#define USBD_STATUS_BUFFER_UNDERRUN ((USBD_STATUS)0xC000000DL) +#define USBD_STATUS_NOT_ACCESSED ((USBD_STATUS)0xC000000FL) +#define USBD_STATUS_FIFO ((USBD_STATUS)0xC0000010L) +#define USBD_STATUS_ENDPOINT_HALTED ((USBD_STATUS)0xC0000030L) +#define USBD_STATUS_BAD_START_FRAME ((USBD_STATUS)0xC0000A00L) +#define USBD_STATUS_ISOCH_REQUEST_FAILED ((USBD_STATUS)0xC0000B00L) +#define USBD_STATUS_FRAME_CONTROL_OWNED ((USBD_STATUS)0xC0000C00L) +#define USBD_STATUS_FRAME_CONTROL_NOT_OWNED \ + ((USBD_STATUS)0xC0000D00L) +#define USBD_STATUS_INAVLID_CONFIGURATION_DESCRIPTOR \ + ((USBD_STATUS)0xC0000F00L) +#define USBD_STATUS_CANCELING ((USBD_STATUS)0x00020000L) + +#define USBD_PIPE_DIRECTION_IN(pipeInformation) \ + ((pipeInformation)->EndpointAddress & USB_ENDPOINT_DIRECTION_MASK) + +struct _URB_HEADER { + USHORT Length; + USHORT Function; + USBD_STATUS Status; + PVOID UsbdDeviceHandle; + ULONG UsbdFlags; +}; + +struct _URB_HCD_AREA { + PVOID HcdEndpoint; + PIRP HcdIrp; + LIST_ENTRY HcdListEntry; + LIST_ENTRY HcdListEntry2; + PVOID HcdCurrentIoFlushPointer; + PVOID HcdExtension; +}; + +struct _URB_BULK_OR_INTERRUPT_TRANSFER { + struct _URB_HEADER Hdr; + USBD_PIPE_HANDLE PipeHandle; + ULONG TransferFlags; + ULONG TransferBufferLength; + PVOID TransferBuffer; + PMDL TransferBufferMDL; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; +}; + +struct _URB_CONTROL_DESCRIPTOR_REQUEST { + struct _URB_HEADER Hdr; + PVOID Reserved; + ULONG Reserved0; + ULONG TransferBufferLength; + PVOID TransferBuffer; + PMDL TransferBufferMDL; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; + USHORT Reserved1; + UCHAR Index; + UCHAR DescriptorType; + USHORT LanguageId; + USHORT Reserved2; +}; + +struct _URB_CONTROL_FEATURE_REQUEST { + struct _URB_HEADER Hdr; + PVOID Reserved; + ULONG Reserved2; + ULONG Reserved3; + PVOID Reserved4; + PMDL Reserved5; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; + USHORT Reserved0; + USHORT FeatureSelector; + USHORT Index; + USHORT Reserved1; +}; + +struct _URB_CONTROL_GET_CONFIGURATION_REQUEST { + struct _URB_HEADER Hdr; + PVOID Reserved; + ULONG Reserved0; + ULONG TransferBufferLength; + PVOID TransferBuffer; + PMDL TransferBufferMDL; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; + UCHAR Reserved1[8]; +}; + +struct _URB_CONTROL_GET_INTERFACE_REQUEST { + struct _URB_HEADER Hdr; + PVOID Reserved; + ULONG Reserved0; + ULONG TransferBufferLength; + PVOID TransferBuffer; + PMDL TransferBufferMDL; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; + UCHAR Reserved1[4]; + USHORT Interface; + USHORT Reserved2; +}; + +struct _URB_CONTROL_GET_STATUS_REQUEST { + struct _URB_HEADER Hdr; + PVOID Reserved; + ULONG Reserved0; + ULONG TransferBufferLength; + PVOID TransferBuffer; + PMDL TransferBufferMDL; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; + UCHAR Reserved1[4]; + USHORT Index; + USHORT Reserved2; +}; + +struct _URB_CONTROL_TRANSFER { + struct _URB_HEADER Hdr; + USBD_PIPE_HANDLE PipeHandle; + ULONG TransferFlags; + ULONG TransferBufferLength; + PVOID TransferBuffer; + PMDL TransferBufferMDL; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; + UCHAR SetupPacket[8]; +}; + +struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST { + struct _URB_HEADER Hdr; + PVOID Reserved; + ULONG TransferFlags; + ULONG TransferBufferLength; + PVOID TransferBuffer; + PMDL TransferBufferMDL; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; + UCHAR RequestTypeReservedBits; + UCHAR Request; + USHORT Value; + USHORT Index; + USHORT Reserved1; +}; + +struct _URB_FRAME_LENGTH_CONTROL { + struct _URB_HEADER Hdr; +}; + +struct _URB_GET_CURRENT_FRAME_NUMBER { + struct _URB_HEADER Hdr; + ULONG FrameNumber; +}; + +struct _URB_GET_FRAME_LENGTH { + struct _URB_HEADER Hdr; + ULONG FrameLength; + ULONG FrameNumber; +}; + +typedef struct _USBD_ISO_PACKET_DESCRIPTOR { + ULONG Offset; + ULONG Length; + USBD_STATUS Status; +} USBD_ISO_PACKET_DESCRIPTOR, *PUSBD_ISO_PACKET_DESCRIPTOR; + +struct _URB_ISOCH_TRANSFER { + struct _URB_HEADER Hdr; + USBD_PIPE_HANDLE PipeHandle; + ULONG TransferFlags; + ULONG TransferBufferLength; + PVOID TransferBuffer; + PMDL TransferBufferMDL; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; + ULONG StartFrame; + ULONG NumberOfPackets; + ULONG ErrorCount; + USBD_ISO_PACKET_DESCRIPTOR IsoPacket[1]; +}; + +struct _URB_PIPE_REQUEST { + struct _URB_HEADER Hdr; + USBD_PIPE_HANDLE PipeHandle; + ULONG Reserved; +}; + +struct _URB_SET_FRAME_LENGTH { + struct _URB_HEADER Hdr; + LONG FrameLengthDelta; +}; + +typedef struct _USBD_DEVICE_INFORMATION { + ULONG OffsetNext; + PVOID UsbdDeviceHandle; + USB_DEVICE_DESCRIPTOR DeviceDescriptor; +} USBD_DEVICE_INFORMATION, *PUSBD_DEVICE_INFORMATION; + +typedef enum _USBD_PIPE_TYPE { + UsbdPipeTypeControl, + UsbdPipeTypeIsochronous, + UsbdPipeTypeBulk, + UsbdPipeTypeInterrupt +} USBD_PIPE_TYPE; + +/* USBD_PIPE_INFORMATION.PipeFlags constants */ +#define USBD_PF_CHANGE_MAX_PACKET 0x00000001 +#define USBD_PF_DOUBLE_BUFFER 0x00000002 +#define USBD_PF_ENABLE_RT_THREAD_ACCESS 0x00000004 +#define USBD_PF_MAP_ADD_TRANSFERS 0x00000008 + +typedef struct _USBD_PIPE_INFORMATION { + USHORT MaximumPacketSize; + UCHAR EndpointAddress; + UCHAR Interval; + USBD_PIPE_TYPE PipeType; + USBD_PIPE_HANDLE PipeHandle; + ULONG MaximumTransferSize; + ULONG PipeFlags; +} USBD_PIPE_INFORMATION, *PUSBD_PIPE_INFORMATION; + +typedef struct _USBD_INTERFACE_INFORMATION { + USHORT Length; + UCHAR InterfaceNumber; + UCHAR AlternateSetting; + UCHAR Class; + UCHAR SubClass; + UCHAR Protocol; + UCHAR Reserved; + USBD_INTERFACE_HANDLE InterfaceHandle; + ULONG NumberOfPipes; + USBD_PIPE_INFORMATION Pipes[1]; +} USBD_INTERFACE_INFORMATION, *PUSBD_INTERFACE_INFORMATION; + +struct _URB_SELECT_CONFIGURATION { + struct _URB_HEADER Hdr; + PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor; + USBD_CONFIGURATION_HANDLE ConfigurationHandle; + USBD_INTERFACE_INFORMATION Interface; +}; + +struct _URB_SELECT_INTERFACE { + struct _URB_HEADER Hdr; + USBD_CONFIGURATION_HANDLE ConfigurationHandle; + USBD_INTERFACE_INFORMATION Interface; +}; + +typedef struct _USBD_VERSION_INFORMATION { + ULONG USBDI_Version; + ULONG Supported_USB_Version; +} USBD_VERSION_INFORMATION, *PUSBD_VERSION_INFORMATION; + +typedef struct _URB { + union { + struct _URB_HEADER UrbHeader; + struct _URB_SELECT_INTERFACE UrbSelectInterface; + struct _URB_SELECT_CONFIGURATION UrbSelectConfiguration; + struct _URB_PIPE_REQUEST UrbPipeRequest; + struct _URB_FRAME_LENGTH_CONTROL UrbFrameLengthControl; + struct _URB_GET_FRAME_LENGTH UrbGetFrameLength; + struct _URB_SET_FRAME_LENGTH UrbSetFrameLength; + struct _URB_GET_CURRENT_FRAME_NUMBER UrbGetCurrentFrameNumber; + struct _URB_CONTROL_TRANSFER UrbControlTransfer; + struct _URB_BULK_OR_INTERRUPT_TRANSFER UrbBulkOrInterruptTransfer; + struct _URB_ISOCH_TRANSFER UrbIsochronousTransfer; + struct _URB_CONTROL_DESCRIPTOR_REQUEST UrbControlDescriptorRequest; + struct _URB_CONTROL_GET_STATUS_REQUEST UrbControlGetStatusRequest; + struct _URB_CONTROL_FEATURE_REQUEST UrbControlFeatureRequest; + struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST UrbControlVendorClassRequest; + struct _URB_CONTROL_GET_INTERFACE_REQUEST UrbControlGetInterfaceRequest; + struct _URB_CONTROL_GET_CONFIGURATION_REQUEST UrbControlGetConfigurationRequest; + }; +} URB, *PURB; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* defined __USB_H */ + +#endif /* __USBDI_H */ diff --git a/reactos/w32api/include/ddk/usbioctl.h b/reactos/w32api/include/ddk/usbioctl.h new file mode 100644 index 00000000000..f0ab90aa0e2 --- /dev/null +++ b/reactos/w32api/include/ddk/usbioctl.h @@ -0,0 +1,353 @@ +/* + * usbioctl.h + * + * USB IOCTL interface. + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __USBIOCTL_H +#define __USBIOCTL_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" +#include "usb100.h" +#include "usbiodef.h" + +#define USBD_PORT_ENABLED 1 +#define USBD_PORT_CONNECTED 2 + +#define IOCTL_INTERNAL_USB_CYCLE_PORT \ + CTL_CODE(FILE_DEVICE_USB, USB_CYCLE_PORT, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_ENABLE_PORT \ + CTL_CODE(FILE_DEVICE_USB, USB_ENABLE_PORT, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_GET_BUS_INFO \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_BUS_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_GET_BUSGUID_INFO \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_BUSGUID_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_CONTROLLER_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_DEVICE_HANDLE, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_GET_HUB_COUNT \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_COUNT, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_GET_HUB_NAME \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_PARENT_HUB_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_GET_PORT_STATUS \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_PORT_STATUS, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_RESET_PORT \ + CTL_CODE(FILE_DEVICE_USB, USB_RESET_PORT, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_ROOTHUB_PDO, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION \ + CTL_CODE(FILE_DEVICE_USB, USB_IDLE_NOTIFICATION, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_SUBMIT_URB \ + CTL_CODE(FILE_DEVICE_USB, USB_SUBMIT_URB, METHOD_NEITHER, FILE_ANY_ACCESS) + + +#define IOCTL_USB_DIAG_IGNORE_HUBS_ON \ + CTL_CODE(FILE_DEVICE_USB, USB_DIAG_IGNORE_HUBS_ON, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_DIAG_IGNORE_HUBS_OFF \ + CTL_CODE(FILE_DEVICE_USB, USB_DIAG_IGNORE_HUBS_OFF, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_DIAGNOSTIC_MODE_OFF \ + CTL_CODE(FILE_DEVICE_USB, HCD_DIAGNOSTIC_MODE_OFF, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_DIAGNOSTIC_MODE_ON \ + CTL_CODE(FILE_DEVICE_USB, HCD_DIAGNOSTIC_MODE_ON, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_HUB_CAPABILITIES \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_ROOT_HUB_NAME \ + CTL_CODE(FILE_DEVICE_USB, HCD_GET_ROOT_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_GET_HCD_DRIVERKEY_NAME \ + CTL_CODE(FILE_DEVICE_USB, HCD_GET_DRIVERKEY_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_NODE_INFORMATION \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_NODE_CONNECTION_ATTRIBUTES \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_ATTRIBUTES, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_NODE_CONNECTION_NAME \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_DRIVERKEY_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_HCD_DISABLE_PORT \ + CTL_CODE(FILE_DEVICE_USB, HCD_DISABLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_HCD_ENABLE_PORT \ + CTL_CODE(FILE_DEVICE_USB, HCD_ENABLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_HCD_GET_STATS_1 \ + CTL_CODE(FILE_DEVICE_USB, HCD_GET_STATS_1, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_HCD_GET_STATS_2 \ + CTL_CODE(FILE_DEVICE_USB, HCD_GET_STATS_2, METHOD_BUFFERED, FILE_ANY_ACCESS) + + +typedef struct _USB_HUB_CAPABILITIES { + ULONG HubIs2xCapable : 1; +} USB_HUB_CAPABILITIES, *PUSB_HUB_CAPABILITIES; + +typedef enum _USB_CONNECTION_STATUS { + NoDeviceConnected, + DeviceConnected, + DeviceFailedEnumeration, + DeviceGeneralFailure, + DeviceCausedOvercurrent, + DeviceNotEnoughPower, + DeviceNotEnoughBandwidth, + DeviceHubNestedTooDeeply, + DeviceInLegacyHub +} USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS; + +typedef struct _USB_DESCRIPTOR_REQUEST { + ULONG ConnectionIndex; + struct { + UCHAR bmRequest; + UCHAR bRequest; + USHORT wValue; + USHORT wIndex; + USHORT wLength; + } SetupPacket; + UCHAR Data[0]; +} USB_DESCRIPTOR_REQUEST, *PUSB_DESCRIPTOR_REQUEST; + +typedef struct _USB_HCD_DRIVERKEY_NAME { + ULONG ActualLength; + WCHAR DriverKeyName[1]; +} USB_HCD_DRIVERKEY_NAME, *PUSB_HCD_DRIVERKEY_NAME; + +typedef struct _HCD_ISO_STAT_COUNTERS { + USHORT LateUrbs; + USHORT DoubleBufferedPackets; + USHORT TransfersCF_5ms; + USHORT TransfersCF_2ms; + USHORT TransfersCF_1ms; + USHORT MaxInterruptLatency; + USHORT BadStartFrame; + USHORT StaleUrbs; + USHORT IsoPacketNotAccesed; + USHORT IsoPacketHWError; + USHORT SmallestUrbPacketCount; + USHORT LargestUrbPacketCount; + USHORT IsoCRC_Error; + USHORT IsoOVERRUN_Error; + USHORT IsoINTERNAL_Error; + USHORT IsoUNKNOWN_Error; + ULONG IsoBytesTransferred; + USHORT LateMissedCount; + USHORT HWIsoMissedCount; + ULONG Reserved7[8]; +} HCD_ISO_STAT_COUNTERS, *PHCD_ISO_STAT_COUNTERS; + +typedef struct _HCD_STAT_COUNTERS { + ULONG BytesTransferred; + USHORT IsoMissedCount; + USHORT DataOverrunErrorCount; + USHORT CrcErrorCount; + USHORT ScheduleOverrunCount; + USHORT TimeoutErrorCount; + USHORT InternalHcErrorCount; + USHORT BufferOverrunErrorCount; + USHORT SWErrorCount; + USHORT StallPidCount; + USHORT PortDisableCount; +} HCD_STAT_COUNTERS, *PHCD_STAT_COUNTERS; + +typedef struct _HCD_STAT_INFORMATION_1 { + ULONG Reserved1; + ULONG Reserved2; + ULONG ResetCounters; + LARGE_INTEGER TimeRead; + HCD_STAT_COUNTERS Counters; +} HCD_STAT_INFORMATION_1, *PHCD_STAT_INFORMATION_1; + +typedef struct _HCD_STAT_INFORMATION_2 { + ULONG Reserved1; + ULONG Reserved2; + ULONG ResetCounters; + LARGE_INTEGER TimeRead; + LONG LockedMemoryUsed; + HCD_STAT_COUNTERS Counters; + HCD_ISO_STAT_COUNTERS IsoCounters; +} HCD_STAT_INFORMATION_2, *PHCD_STAT_INFORMATION_2; + +typedef struct _USB_HUB_INFORMATION { + USB_HUB_DESCRIPTOR HubDescriptor; + BOOLEAN HubIsBusPowered; +} USB_HUB_INFORMATION, *PUSB_HUB_INFORMATION; + +typedef struct _USB_HUB_NAME { + ULONG ActualLength; + WCHAR HubName[1]; +} USB_HUB_NAME, *PUSB_HUB_NAME; + +typedef enum _USB_HUB_NODE { + UsbHub, + UsbMIParent +} USB_HUB_NODE; + +typedef VOID STDCALL +(*USB_IDLE_CALLBACK)( + PVOID Context); + +typedef struct _USB_IDLE_CALLBACK_INFO { + USB_IDLE_CALLBACK IdleCallback; + PVOID IdleContext; +} USB_IDLE_CALLBACK_INFO, *PUSB_IDLE_CALLBACK_INFO; + +typedef struct _USB_NODE_CONNECTION_ATTRIBUTES { + ULONG ConnectionIndex; + USB_CONNECTION_STATUS ConnectionStatus; + ULONG PortAttributes; +} USB_NODE_CONNECTION_ATTRIBUTES, *PUSB_NODE_CONNECTION_ATTRIBUTES; + +typedef struct _USB_NODE_CONNECTION_DRIVERKEY_NAME { + ULONG ConnectionIndex; + ULONG ActualLength; + WCHAR DriverKeyName[1]; +} USB_NODE_CONNECTION_DRIVERKEY_NAME, *PUSB_NODE_CONNECTION_DRIVERKEY_NAME; + +typedef struct _USB_PIPE_INFO { + USB_ENDPOINT_DESCRIPTOR EndpointDescriptor; + ULONG ScheduleOffset; +} USB_PIPE_INFO, *PUSB_PIPE_INFO; + +typedef struct _USB_NODE_CONNECTION_INFORMATION { + ULONG ConnectionIndex; + USB_DEVICE_DESCRIPTOR DeviceDescriptor; + UCHAR CurrentConfigurationValue; + BOOLEAN LowSpeed; + BOOLEAN DeviceIsHub; + USHORT DeviceAddress; + ULONG NumberOfOpenPipes; + USB_CONNECTION_STATUS ConnectionStatus; + USB_PIPE_INFO PipeList[0]; +} USB_NODE_CONNECTION_INFORMATION, *PUSB_NODE_CONNECTION_INFORMATION; + +typedef struct _USB_NODE_CONNECTION_NAME { + ULONG ConnectionIndex; + ULONG ActualLength; + WCHAR NodeName[1]; +} USB_NODE_CONNECTION_NAME, *PUSB_NODE_CONNECTION_NAME; + +typedef struct _USB_MI_PARENT_INFORMATION { + ULONG NumberOfInterfaces; +} USB_MI_PARENT_INFORMATION, *PUSB_MI_PARENT_INFORMATION; + +typedef struct _USB_NODE_INFORMATION { + USB_HUB_NODE NodeType; + union { + USB_HUB_INFORMATION HubInformation; + USB_MI_PARENT_INFORMATION MiParentInformation; + } u; +} USB_NODE_INFORMATION, *PUSB_NODE_INFORMATION; + +#define WMI_USB_DRIVER_INFORMATION 0 +#define WMI_USB_DRIVER_NOTIFICATION 1 +#define WMI_USB_POWER_DEVICE_ENABLE 2 + +typedef enum _USB_NOTIFICATION_TYPE { + EnumerationFailure = 0, + InsufficentBandwidth, + InsufficentPower, + OverCurrent, + ResetOvercurrent, + AcquireBusInfo, + AcquireHubName, + AcquireControllerName, + HubOvercurrent, + HubPowerChange, + HubNestedTooDeeply, + ModernDeviceInLegacyHub +} USB_NOTIFICATION_TYPE; + +typedef struct _USB_ACQUIRE_INFO { + USB_NOTIFICATION_TYPE NotificationType; + ULONG TotalSize; + WCHAR Buffer[1]; +} USB_ACQUIRE_INFO, *PUSB_ACQUIRE_INFO; + +typedef struct _USB_NOTIFICATION { + USB_NOTIFICATION_TYPE NotificationType; +} USB_NOTIFICATION, *PUSB_NOTIFICATION; + +typedef struct _USB_BUS_NOTIFICATION { + USB_NOTIFICATION_TYPE NotificationType; + ULONG TotalBandwidth; + ULONG ConsumedBandwidth; + ULONG ControllerNameLength; +} USB_BUS_NOTIFICATION, *PUSB_BUS_NOTIFICATION; + +typedef struct _USB_CONNECTION_NOTIFICATION { + USB_NOTIFICATION_TYPE NotificationType; + ULONG ConnectionNumber; + ULONG RequestedBandwidth; + ULONG EnumerationFailReason; + ULONG PowerRequested; + ULONG HubNameLength; +} USB_CONNECTION_NOTIFICATION, *PUSB_CONNECTION_NOTIFICATION; + +typedef struct _USB_ROOT_HUB_NAME { + ULONG ActualLength; + WCHAR RootHubName[1]; +} USB_ROOT_HUB_NAME, *PUSB_ROOT_HUB_NAME; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __USBIOCTL_H */ diff --git a/reactos/w32api/include/ddk/usbiodef.h b/reactos/w32api/include/ddk/usbiodef.h new file mode 100644 index 00000000000..4a801e39381 --- /dev/null +++ b/reactos/w32api/include/ddk/usbiodef.h @@ -0,0 +1,111 @@ +/* + * usbiodef.h + * + * USB IOCTL definitions + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __USBIODEF_H +#define __USBIODEF_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + + +DEFINE_GUID(GUID_DEVINTERFACE_USB_HUB, \ + 0xf18a0e88, 0xc30c, 0x11d0, 0x88, 0x15, 0x00, 0xa0, 0xc9, 0x06, 0xbe, 0xd8); + +DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE, + 0xA5DCBF10L, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED); + +DEFINE_GUID(GUID_DEVINTERFACE_USB_HOST_CONTROLLER, + 0x3abf6f2d, 0x71c4, 0x462a, 0x8a, 0x92, 0x1e, 0x68, 0x61, 0xe6, 0xaf, 0x27); + +DEFINE_GUID(GUID_USB_WMI_STD_DATA, + 0x4E623B20L, 0xCB14, 0x11D1, 0xB3, 0x31, 0x00, 0xA0, 0xC9, 0x59, 0xBB, 0xD2); + +DEFINE_GUID(GUID_USB_WMI_STD_NOTIFICATION, + 0x4E623B20L, 0xCB14, 0x11D1, 0xB3, 0x31, 0x00, 0xA0, 0xC9, 0x59, 0xBB, 0xD2); + +#define GUID_CLASS_USBHUB GUID_DEVINTERFACE_USB_HUB +#define GUID_CLASS_USB_DEVICE GUID_DEVINTERFACE_USB_DEVICE +#define GUID_CLASS_USB_HOST_CONTROLLER GUID_DEVINTERFACE_USB_HOST_CONTROLLER + +#define USB_SUBMIT_URB 0 +#define USB_RESET_PORT 1 +#define USB_GET_ROOTHUB_PDO 3 +#define USB_GET_PORT_STATUS 4 +#define USB_ENABLE_PORT 5 +#define USB_GET_HUB_COUNT 6 +#define USB_CYCLE_PORT 7 +#define USB_GET_HUB_NAME 8 +#define USB_IDLE_NOTIFICATION 9 +#define USB_GET_BUS_INFO 264 +#define USB_GET_CONTROLLER_NAME 265 +#define USB_GET_BUSGUID_INFO 266 +#define USB_GET_PARENT_HUB_INFO 267 +#define USB_GET_DEVICE_HANDLE 268 + +#define HCD_GET_STATS_1 255 +#define HCD_DIAGNOSTIC_MODE_ON 256 +#define HCD_DIAGNOSTIC_MODE_OFF 257 +#define HCD_GET_ROOT_HUB_NAME 258 +#define HCD_GET_DRIVERKEY_NAME 265 +#define HCD_GET_STATS_2 266 +#define HCD_DISABLE_PORT 268 +#define HCD_ENABLE_PORT 269 +#define HCD_USER_REQUEST 270 + +#define USB_GET_NODE_INFORMATION 258 +#define USB_GET_NODE_CONNECTION_INFORMATION 259 +#define USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION 260 +#define USB_GET_NODE_CONNECTION_NAME 261 +#define USB_DIAG_IGNORE_HUBS_ON 262 +#define USB_DIAG_IGNORE_HUBS_OFF 263 +#define USB_GET_NODE_CONNECTION_DRIVERKEY_NAME 264 +#define USB_GET_HUB_CAPABILITIES 271 +#define USB_GET_NODE_CONNECTION_ATTRIBUTES 272 + +#define FILE_DEVICE_USB FILE_DEVICE_UNKNOWN + +#define USB_CTL(id) CTL_CODE(FILE_DEVICE_USB, \ + (id), \ + METHOD_BUFFERED, \ + FILE_ANY_ACCESS) + +#define USB_KERNEL_CTL(id) CTL_CODE(FILE_DEVICE_USB, \ + (id), \ + METHOD_NEITHER, \ + FILE_ANY_ACCESS) + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __USBIODEF_H */ diff --git a/reactos/w32api/include/ddk/usbscan.h b/reactos/w32api/include/ddk/usbscan.h new file mode 100644 index 00000000000..938c7066a5d --- /dev/null +++ b/reactos/w32api/include/ddk/usbscan.h @@ -0,0 +1,163 @@ +/* + * usbscan.h + * + * USB scanner definitions + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __USBSCAN_H +#define __USBSCAN_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + + +#define FILE_DEVICE_USB_SCAN 0x8000 +#define IOCTL_INDEX 0x0800 + +#define IOCTL_CANCEL_IO \ + CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 1, METHOD_BUFFERED,FILE_ANY_ACCESS) + +#define IOCTL_GET_VERSION \ + CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 0, METHOD_BUFFERED,FILE_ANY_ACCESS) + +#define IOCTL_GET_CHANNEL_ALIGN_RQST \ + CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 5, METHOD_BUFFERED,FILE_ANY_ACCESS) + +#define IOCTL_GET_DEVICE_DESCRIPTOR \ + CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 6, METHOD_BUFFERED,FILE_ANY_ACCESS) + +#define IOCTL_GET_PIPE_CONFIGURATION \ + CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 10,METHOD_BUFFERED,FILE_ANY_ACCESS) + +#define IOCTL_GET_USB_DESCRIPTOR \ + CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 8, METHOD_BUFFERED,FILE_ANY_ACCESS) + +#define IOCTL_READ_REGISTERS \ + CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 3, METHOD_BUFFERED,FILE_ANY_ACCESS) + +#define IOCTL_RESET_PIPE \ + CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 7, METHOD_BUFFERED,FILE_ANY_ACCESS) + +#define IOCTL_SEND_USB_REQUEST \ + CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 9, METHOD_BUFFERED,FILE_ANY_ACCESS) + +#define IOCTL_SET_TIMEOUT \ + CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 11,METHOD_BUFFERED,FILE_ANY_ACCESS) + +#define IOCTL_WAIT_ON_DEVICE_EVENT \ + CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 2, METHOD_BUFFERED,FILE_ANY_ACCESS) + +#define IOCTL_WRITE_REGISTERS \ + CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 4, METHOD_BUFFERED, FILE_ANY_ACCESS) + + +#define MAX_NUM_PIPES 8 + +#define BULKIN_FLAG 0x80 + +typedef struct _CHANNEL_INFO { + OUT ULONG EventChannelSize; + OUT ULONG uReadDataAlignment; + OUT ULONG uWriteDataAlignment; +}CHANNEL_INFO, *PCHANNEL_INFO; + +typedef struct _DEVICE_DESCRIPTOR { + OUT USHORT usVendorId; + OUT USHORT usProductId; + OUT USHORT usBcdDevice; + OUT USHORT usLanguageId; +} DEVICE_DESCRIPTOR, *PDEVICE_DESCRIPTOR; + +typedef struct _DRV_VERSION { + OUT ULONG major; + OUT ULONG minor; + OUT ULONG internal; +} DRV_VERSION, *PDRV_VERSION; + +typedef struct _IO_BLOCK { + IN ULONG uOffset; + IN ULONG uLength; + IN OUT PUCHAR pbyData; + IN ULONG uIndex; +} IO_BLOCK, *PIO_BLOCK; + +typedef struct _IO_BLOCK_EX { + IN ULONG uOffset; + IN ULONG uLength; + IN OUT PUCHAR pbyData; + IN ULONG uIndex; + IN UCHAR bRequest; + IN UCHAR bmRequestType; + IN UCHAR fTransferDirectionIn; +} IO_BLOCK_EX, *PIO_BLOCK_EX; + +typedef struct _USBSCAN_GET_DESCRIPTOR { + IN UCHAR DescriptorType; + IN UCHAR Index; + IN USHORT LanguageId; +} USBSCAN_GET_DESCRIPTOR, *PUSBSCAN_GET_DESCRIPTOR; + +typedef enum _RAW_PIPE_TYPE { + USBSCAN_PIPE_CONTROL, + USBSCAN_PIPE_ISOCHRONOUS, + USBSCAN_PIPE_BULK, + USBSCAN_PIPE_INTERRUPT +} RAW_PIPE_TYPE; + +typedef struct _USBSCAN_PIPE_INFORMATION { + USHORT MaximumPacketSize; + UCHAR EndpointAddress; + UCHAR Interval; + RAW_PIPE_TYPE PipeType; +} USBSCAN_PIPE_INFORMATION, *PUSBSCAN_PIPE_INFORMATION; + +typedef struct _USBSCAN_PIPE_CONFIGURATION { + OUT ULONG NumberOfPipes; + OUT USBSCAN_PIPE_INFORMATION PipeInfo[MAX_NUM_PIPES]; +} USBSCAN_PIPE_CONFIGURATION, *PUSBSCAN_PIPE_CONFIGURATION; + +typedef struct _USBSCAN_TIMEOUT { + IN ULONG TimeoutRead; + IN ULONG TimeoutWrite; + IN ULONG TimeoutEvent; +} USBSCAN_TIMEOUT, *PUSBSCAN_TIMEOUT; + +typedef enum _PIPE_TYPE { + EVENT_PIPE, + READ_DATA_PIPE, + WRITE_DATA_PIPE, + ALL_PIPE +} PIPE_TYPE; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __USBSCAN_H */ diff --git a/reactos/w32api/include/ddk/usbuser.h b/reactos/w32api/include/ddk/usbuser.h new file mode 100644 index 00000000000..feacddac379 --- /dev/null +++ b/reactos/w32api/include/ddk/usbuser.h @@ -0,0 +1,329 @@ +/* + * usbuser.h + * + * USB user mode IOCTL interface + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __USBUSER_H +#define __USBUSER_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" +#include "usb.h" +#include "usbiodef.h" + + +#define USBUSER_VERSION 0x0004 + +#define IOCTL_USB_USER_REQUEST USB_CTL(HCD_USER_REQUEST) + +#ifndef IOCTL_USB_DIAGNOSTIC_MODE_ON +#define IOCTL_USB_DIAGNOSTIC_MODE_ON USB_CTL(HCD_DIAGNOSTIC_MODE_ON) +#endif +#ifndef IOCTL_USB_DIAGNOSTIC_MODE_OFF +#define IOCTL_USB_DIAGNOSTIC_MODE_OFF USB_CTL(HCD_DIAGNOSTIC_MODE_OFF) +#endif + +#ifndef IOCTL_USB_GET_ROOT_HUB_NAME +#define IOCTL_USB_GET_ROOT_HUB_NAME USB_CTL(HCD_GET_ROOT_HUB_NAME) +#endif +#ifndef IOCTL_GET_HCD_DRIVERKEY_NAME +#define IOCTL_GET_HCD_DRIVERKEY_NAME USB_CTL(HCD_GET_DRIVERKEY_NAME) +#endif + +typedef enum _USB_USER_ERROR_CODE { + UsbUserSuccess = 0, + UsbUserNotSupported, + UsbUserInvalidRequestCode, + UsbUserFeatureDisabled, + UsbUserInvalidHeaderParameter, + UsbUserInvalidParameter, + UsbUserMiniportError, + UsbUserBufferTooSmall, + UsbUserErrorNotMapped, + UsbUserDeviceNotStarted, + UsbUserNoDeviceConnected +} USB_USER_ERROR_CODE; + +#define USBUSER_GET_CONTROLLER_INFO_0 0x00000001 +#define USBUSER_GET_CONTROLLER_DRIVER_KEY 0x00000002 +#define USBUSER_PASS_THRU 0x00000003 +#define USBUSER_GET_POWER_STATE_MAP 0x00000004 +#define USBUSER_GET_BANDWIDTH_INFORMATION 0x00000005 +#define USBUSER_GET_BUS_STATISTICS_0 0x00000006 +#define USBUSER_GET_ROOTHUB_SYMBOLIC_NAME 0x00000007 +#define USBUSER_GET_USB_DRIVER_VERSION 0x00000008 +#define USBUSER_GET_USB2_HW_VERSION 0x00000009 +#define USBUSER_OP_SEND_ONE_PACKET 0x10000001 +#define USBUSER_OP_RAW_RESET_PORT 0x20000001 +#define USBUSER_OP_OPEN_RAW_DEVICE 0x20000002 +#define USBUSER_OP_CLOSE_RAW_DEVICE 0x20000003 +#define USBUSER_OP_SEND_RAW_COMMAND 0x20000004 +#define USBUSER_INVALID_REQUEST 0xFFFFFFF0 +#define USBUSER_OP_MASK_DEVONLY_API 0x10000000 +#define USBUSER_OP_MASK_HCTEST_API 0x20000000 + +#define USB_PACKETFLAG_LOW_SPEED 0x00000001 +#define USB_PACKETFLAG_FULL_SPEED 0x00000002 +#define USB_PACKETFLAG_HIGH_SPEED 0x00000004 +#define USB_PACKETFLAG_ASYNC_IN 0x00000008 +#define USB_PACKETFLAG_ASYNC_OUT 0x00000010 +#define USB_PACKETFLAG_ISO_IN 0x00000020 +#define USB_PACKETFLAG_ISO_OUT 0x00000040 +#define USB_PACKETFLAG_SETUP 0x00000080 +#define USB_PACKETFLAG_TOGGLE0 0x00000100 +#define USB_PACKETFLAG_TOGGLE1 0x00000200 + +typedef struct _PACKET_PARAMETERS { + UCHAR DeviceAddress; + UCHAR EndpointAddress; + USHORT MaximumPacketSize; + ULONG Timeout; + ULONG Flags; + ULONG DataLength; + USHORT HubDeviceAddress; + USHORT PortTTNumber; + UCHAR ErrorCount; + UCHAR Pad[3]; + USBD_STATUS UsbdStatusCode; + UCHAR Data[4]; +} PACKET_PARAMETERS, *PPACKET_PARAMETERS; + +typedef struct _RAW_RESET_PORT_PARAMETERS { + USHORT PortNumber; + USHORT PortStatus; +} RAW_RESET_PORT_PARAMETERS, *PRAW_RESET_PORT_PARAMETERS; + +typedef struct _USB_BANDWIDTH_INFO { + ULONG DeviceCount; + ULONG TotalBusBandwidth; + ULONG Total32secBandwidth; + ULONG AllocedBulkAndControl; + ULONG AllocedIso; + ULONG AllocedInterrupt_1ms; + ULONG AllocedInterrupt_2ms; + ULONG AllocedInterrupt_4ms; + ULONG AllocedInterrupt_8ms; + ULONG AllocedInterrupt_16ms; + ULONG AllocedInterrupt_32ms; +} USB_BANDWIDTH_INFO, *PUSB_BANDWIDTH_INFO; + +typedef struct _USBUSER_REQUEST_HEADER { + ULONG UsbUserRequest; + USB_USER_ERROR_CODE UsbUserStatusCode; + ULONG RequestBufferLength; + ULONG ActualBufferLength; +} USBUSER_REQUEST_HEADER, *PUSBUSER_REQUEST_HEADER; + +typedef struct _USBUSER_BANDWIDTH_INFO_REQUEST { + USBUSER_REQUEST_HEADER Header; + USB_BANDWIDTH_INFO BandwidthInformation; +} USBUSER_BANDWIDTH_INFO_REQUEST, *PUSBUSER_BANDWIDTH_INFO_REQUEST; + +typedef struct _USB_BUS_STATISTICS_0 { + ULONG DeviceCount; + LARGE_INTEGER CurrentSystemTime; + ULONG CurrentUsbFrame; + ULONG BulkBytes; + ULONG IsoBytes; + ULONG InterruptBytes; + ULONG ControlDataBytes; + ULONG PciInterruptCount; + ULONG HardResetCount; + ULONG WorkerSignalCount; + ULONG CommonBufferBytes; + ULONG WorkerIdleTimeMs; + BOOLEAN RootHubEnabled; + UCHAR RootHubDevicePowerState; + UCHAR Unused; + UCHAR NameIndex; +} USB_BUS_STATISTICS_0, *PUSB_BUS_STATISTICS_0; + +typedef struct _USBUSER_BUS_STATISTICS_0_REQUEST { + USBUSER_REQUEST_HEADER Header; + USB_BUS_STATISTICS_0 BusStatistics0; +} USBUSER_BUS_STATISTICS_0_REQUEST, *PUSBUSER_BUS_STATISTICS_0_REQUEST; + +/* USB_CONTROLLER_INFO_0.HcFeatureFlags constants */ +#define USB_HC_FEATURE_FLAG_PORT_POWER_SWITCHING 0x00000001 +#define USB_HC_FEATURE_FLAG_SEL_SUSPEND 0x00000002 +#define USB_HC_FEATURE_LEGACY_BIOS 0x00000004 + +typedef struct _USB_CLOSE_RAW_DEVICE_PARAMETERS { + ULONG xxx; +} USB_CLOSE_RAW_DEVICE_PARAMETERS , *PUSB_CLOSE_RAW_DEVICE_PARAMETERS; + +typedef struct _USBUSER_CLOSE_RAW_DEVICE { + USBUSER_REQUEST_HEADER Header; + USB_CLOSE_RAW_DEVICE_PARAMETERS Parameters; +} USBUSER_CLOSE_RAW_DEVICE, *PUSBUSER_CLOSE_RAW_DEVICE; + +typedef struct _USB_CONTROLLER_INFO_0 { + ULONG PciVendorId; + ULONG PciDeviceId; + ULONG PciRevision; + ULONG NumberOfRootPorts; + USB_CONTROLLER_FLAVOR ControllerFlavor; + ULONG HcFeatureFlags; +} USB_CONTROLLER_INFO_0 , *PUSB_CONTROLLER_INFO_0; + +typedef struct _USBUSER_CONTROLLER_INFO_0 { + USBUSER_REQUEST_HEADER Header; + USB_CONTROLLER_INFO_0 Info0; +} USBUSER_CONTROLLER_INFO_0, *PUSBUSER_CONTROLLER_INFO_0; + +typedef struct _USB_DRIVER_VERSION_PARAMETERS { + ULONG DriverTrackingCode; + ULONG USBDI_Version; + ULONG USBUSER_Version; + BOOLEAN CheckedPortDriver; + BOOLEAN CheckedMiniportDriver; + USHORT USB_Version; +} USB_DRIVER_VERSION_PARAMETERS , *PUSB_DRIVER_VERSION_PARAMETERS; + +typedef struct _USBUSER_GET_DRIVER_VERSION { + USBUSER_REQUEST_HEADER Header; + USB_DRIVER_VERSION_PARAMETERS Parameters; +} USBUSER_GET_DRIVER_VERSION, *PUSBUSER_GET_DRIVER_VERSION; + +typedef struct _USB_OPEN_RAW_DEVICE_PARAMETERS { + USHORT PortStatus; + USHORT MaxPacketEp0; +} USB_OPEN_RAW_DEVICE_PARAMETERS , *PUSB_OPEN_RAW_DEVICE_PARAMETERS; + +typedef struct _USBUSER_OPEN_RAW_DEVICE { + USBUSER_REQUEST_HEADER Header; + USB_OPEN_RAW_DEVICE_PARAMETERS Parameters; +} USBUSER_OPEN_RAW_DEVICE, *PUSBUSER_OPEN_RAW_DEVICE; + +typedef enum _WDMUSB_POWER_STATE { + WdmUsbPowerNotMapped = 0, + WdmUsbPowerSystemUnspecified = 100, + WdmUsbPowerSystemWorking, + WdmUsbPowerSystemSleeping1, + WdmUsbPowerSystemSleeping2, + WdmUsbPowerSystemSleeping3, + WdmUsbPowerSystemHibernate, + WdmUsbPowerSystemShutdown, + WdmUsbPowerDeviceUnspecified = 200, + WdmUsbPowerDeviceD0, + WdmUsbPowerDeviceD1, + WdmUsbPowerDeviceD2, + WdmUsbPowerDeviceD3 +} WDMUSB_POWER_STATE; + +typedef struct _USB_POWER_INFO { + WDMUSB_POWER_STATE SystemState; + WDMUSB_POWER_STATE HcDevicePowerState; + WDMUSB_POWER_STATE HcDeviceWake; + WDMUSB_POWER_STATE HcSystemWake; + WDMUSB_POWER_STATE RhDevicePowerState; + WDMUSB_POWER_STATE RhDeviceWake; + WDMUSB_POWER_STATE RhSystemWake; + WDMUSB_POWER_STATE LastSystemSleepState; + BOOLEAN CanWakeup; + BOOLEAN IsPowered; +} USB_POWER_INFO, *PUSB_POWER_INFO; + +typedef struct _USBUSER_POWER_INFO_REQUEST { + USBUSER_REQUEST_HEADER Header; + USB_POWER_INFO PowerInformation; +} USBUSER_POWER_INFO_REQUEST, *PUSBUSER_POWER_INFO_REQUEST; + +typedef struct _USB_UNICODE_NAME { + ULONG Length; + WCHAR String[1]; +} USB_UNICODE_NAME, *PUSB_UNICODE_NAME; + +typedef struct _USBUSER_CONTROLLER_UNICODE_NAME { + USBUSER_REQUEST_HEADER Header; + USB_UNICODE_NAME UnicodeName; +} USBUSER_CONTROLLER_UNICODE_NAME, *PUSBUSER_CONTROLLER_UNICODE_NAME; + +typedef struct _USB_PASS_THRU_PARAMETERS { + GUID FunctionGUID; + ULONG ParameterLength; + UCHAR Parameters[4]; +} USB_PASS_THRU_PARAMETERS, *PUSB_PASS_THRU_PARAMETERS; + +typedef struct _USBUSER_PASS_THRU_REQUEST { + USBUSER_REQUEST_HEADER Header; + USB_PASS_THRU_PARAMETERS PassThru; +} USBUSER_PASS_THRU_REQUEST, *PUSBUSER_PASS_THRU_REQUEST; + +typedef struct _USBUSER_RAW_RESET_ROOT_PORT { + USBUSER_REQUEST_HEADER Header; + RAW_RESET_PORT_PARAMETERS Parameters; +} USBUSER_RAW_RESET_ROOT_PORT, *PUSBUSER_RAW_RESET_ROOT_PORT; + +typedef struct _USBUSER_SEND_ONE_PACKET { + USBUSER_REQUEST_HEADER Header; + PACKET_PARAMETERS PacketParameters; +} USBUSER_SEND_ONE_PACKET, *PUSBUSER_SEND_ONE_PACKET; + +typedef struct _USB_SEND_RAW_COMMAND_PARAMETERS { + UCHAR Usb_bmRequest; + UCHAR Usb_bRequest; + USHORT Usb_wVlaue; + USHORT Usb_wIndex; + USHORT Usb_wLength; + USHORT DeviceAddress; + USHORT MaximumPacketSize; + ULONG Timeout; + ULONG DataLength; + USBD_STATUS UsbdStatusCode; + UCHAR Data[4]; +} USB_SEND_RAW_COMMAND_PARAMETERS, *PUSB_SEND_RAW_COMMAND_PARAMETERS; + +typedef struct _USBUSER_SEND_RAW_COMMAND { + USBUSER_REQUEST_HEADER Header; + USB_SEND_RAW_COMMAND_PARAMETERS Parameters; +} USBUSER_SEND_RAW_COMMAND, *PUSBUSER_SEND_RAW_COMMAND; + +/* USB_USB2HW_VERSION_PARAMETERS.Usb2HwRevision constants */ +#define USB2HW_UNKNOWN 0x00 +#define USB2HW_A0 0xA0 +#define USB2HW_A1 0xA1 +#define USB2HW_B0 0xB0 + +typedef struct _USB_USB2HW_VERSION_PARAMETERS { + UCHAR Usb2HwRevision; +} USB_USB2HW_VERSION_PARAMETERS, *PUSB_USB2HW_VERSION_PARAMETERS; + +typedef struct _USBUSER_GET_USB2HW_VERSION { + USBUSER_REQUEST_HEADER Header; + USB_USB2HW_VERSION_PARAMETERS Parameters; +} USBUSER_GET_USB2HW_VERSION, *PUSBUSER_GET_USB2HW_VERSION; + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __USBUSER_H */ diff --git a/reactos/w32api/include/ddk/video.h b/reactos/w32api/include/ddk/video.h new file mode 100644 index 00000000000..fd63f7dff44 --- /dev/null +++ b/reactos/w32api/include/ddk/video.h @@ -0,0 +1,1570 @@ +/* + * video.h + * + * Video port and miniport driver interface + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __VIDEO_H +#define __VIDEO_H + + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __WINDDI_H +#error winddi.h cannot be included with video.h +#else + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" + +#if defined(_VIDEOPORT_) + #define VPAPI DECLSPEC_EXPORT +#else + #define VPAPI DECLSPEC_IMPORT +#endif + +#include "videoagp.h" +#include "ntddvdeo.h" + + +typedef LONG VP_STATUS; +typedef VP_STATUS *PVP_STATUS; +typedef struct __DMA_PARAMETERS * PDMA; +typedef struct _VIDEO_PORT_EVENT *PEVENT; +typedef struct _VIDEO_PORT_SPIN_LOCK *PSPIN_LOCK; +typedef struct __VP_DMA_ADAPTER *PVP_DMA_ADAPTER; + +#define DISPLAY_ADAPTER_HW_ID 0xFFFFFFFF + +#define EVENT_TYPE_MASK 1 +#define SYNCHRONIZATION_EVENT 0 +#define NOTIFICATION_EVENT 1 + +#define INITIAL_EVENT_STATE_MASK 2 +#define INITIAL_EVENT_NOT_SIGNALED 0 +#define INITIAL_EVENT_SIGNALED 2 + +typedef enum VIDEO_DEBUG_LEVEL { + Error = 0, + Warn, + Trace, + Info +} VIDEO_DEBUG_LEVEL, *PVIDEO_DEBUG_LEVEL; + +typedef enum { + VideoPortUnlockAfterDma = 1, + VideoPortKeepPagesLocked, + VideoPortDmaInitOnly +} DMA_FLAGS; + +typedef enum _HW_DMA_RETURN { + DmaAsyncReturn, + DmaSyncReturn +} HW_DMA_RETURN, *PHW_DMA_RETURN; + +typedef HW_DMA_RETURN +(*PVIDEO_HW_START_DMA)( + PVOID HwDeviceExtension, + PDMA pDma); + + +#ifdef DBG + +#define PAGED_CODE() \ + if (VideoPortGetCurrentIrql() > 1 /* APC_LEVEL */) \ + { \ + VideoPortDebugPrint(Error, "Video: Pageable code called at IRQL %d\n", VideoPortGetCurrentIrql() ); \ + assert(FALSE); \ + } + +#else + +#define PAGED_CODE() + +#endif + +typedef struct _VIDEO_HARDWARE_CONFIGURATION_DATA { + INTERFACE_TYPE InterfaceType; + ULONG BusNumber; + USHORT Version; + USHORT Revision; + USHORT Irql; + USHORT Vector; + ULONG ControlBase; + ULONG ControlSize; + ULONG CursorBase; + ULONG CursorSize; + ULONG FrameBase; + ULONG FrameSize; +} VIDEO_HARDWARE_CONFIGURATION_DATA, *PVIDEO_HARDWARE_CONFIGURATION_DATA; + +#define SIZE_OF_NT4_VIDEO_PORT_CONFIG_INFO 0x42 +#define SIZE_OF_NT4_VIDEO_HW_INITIALIZATION_DATA 0x28 +#define SIZE_OF_W2K_VIDEO_HW_INITIALIZATION_DATA 0x50 + +typedef enum _VIDEO_DEVICE_DATA_TYPE { + VpMachineData = 0, + VpCmosData, + VpBusData, + VpControllerData, + VpMonitorData +} VIDEO_DEVICE_DATA_TYPE, *PVIDEO_DEVICE_DATA_TYPE; + + + +/* Video miniport driver functions */ + +typedef struct _VP_SCATTER_GATHER_ELEMENT { + PHYSICAL_ADDRESS Address; + ULONG Length; + ULONG_PTR Reserved; +} VP_SCATTER_GATHER_ELEMENT, *PVP_SCATTER_GATHER_ELEMENT; + +typedef struct _VP_SCATTER_GATHER_LIST { + ULONG NumberOfElements; + ULONG_PTR Reserved; + VP_SCATTER_GATHER_ELEMENT Elements[0]; +} VP_SCATTER_GATHER_LIST, *PVP_SCATTER_GATHER_LIST; + +typedef VOID DDKAPI +(*PEXECUTE_DMA)( + IN PVOID HwDeviceExtension, + IN PVP_DMA_ADAPTER VpDmaAdapter, + IN PVP_SCATTER_GATHER_LIST SGList, + IN PVOID Context); + +typedef PVOID DDKAPI +(*PVIDEO_PORT_GET_PROC_ADDRESS)( + IN PVOID HwDeviceExtension, + IN PUCHAR FunctionName); + +typedef struct _VIDEO_PORT_CONFIG_INFO { + ULONG Length; + ULONG SystemIoBusNumber; + INTERFACE_TYPE AdapterInterfaceType; + ULONG BusInterruptLevel; + ULONG BusInterruptVector; + KINTERRUPT_MODE InterruptMode; + ULONG NumEmulatorAccessEntries; + PEMULATOR_ACCESS_ENTRY EmulatorAccessEntries; + ULONG_PTR EmulatorAccessEntriesContext; + PHYSICAL_ADDRESS VdmPhysicalVideoMemoryAddress; + ULONG VdmPhysicalVideoMemoryLength; + ULONG HardwareStateSize; + ULONG DmaChannel; + ULONG DmaPort; + UCHAR DmaShareable; + UCHAR InterruptShareable; + BOOLEAN Master; + DMA_WIDTH DmaWidth; + DMA_SPEED DmaSpeed; + BOOLEAN bMapBuffers; + BOOLEAN NeedPhysicalAddresses; + BOOLEAN DemandMode; + ULONG MaximumTransferLength; + ULONG NumberOfPhysicalBreaks; + BOOLEAN ScatterGather; + ULONG MaximumScatterGatherChunkSize; + PVIDEO_PORT_GET_PROC_ADDRESS VideoPortGetProcAddress; + PWSTR DriverRegistryPath; + ULONGLONG SystemMemorySize; +} VIDEO_PORT_CONFIG_INFO, *PVIDEO_PORT_CONFIG_INFO; + +typedef VP_STATUS DDKAPI +(*PVIDEO_HW_FIND_ADAPTER)( + IN PVOID HwDeviceExtension, + IN PVOID HwContext, + IN PWSTR ArgumentString, + IN OUT PVIDEO_PORT_CONFIG_INFO ConfigInfo, + OUT PUCHAR Again); + +typedef VP_STATUS DDKAPI +(*PVIDEO_HW_POWER_GET)( + IN PVOID HwDeviceExtension, + IN ULONG HwId, + IN OUT PVIDEO_POWER_MANAGEMENT VideoPowerControl); + +/* PVIDEO_HW_GET_CHILD_DESCRIPTOR return values */ +#define VIDEO_ENUM_MORE_DEVICES ERROR_CONTINUE +#define VIDEO_ENUM_NO_MORE_DEVICES ERROR_NO_MORE_DEVICES +#define VIDEO_ENUM_INVALID_DEVICE ERROR_INVALID_NAME + +/* PVIDEO_HW_GET_CHILD_DESCRIPTOR.ChildEnumInfo constants */ +typedef struct _VIDEO_CHILD_ENUM_INFO { + ULONG Size; + ULONG ChildDescriptorSize; + ULONG ChildIndex; + ULONG ACPIHwId; + PVOID ChildHwDeviceExtension; +} VIDEO_CHILD_ENUM_INFO, *PVIDEO_CHILD_ENUM_INFO; + +/* PVIDEO_HW_GET_CHILD_DESCRIPTOR.VideoChildType constants */ +typedef enum _VIDEO_CHILD_TYPE { + Monitor = 1, + NonPrimaryChip, + VideoChip, + Other +} VIDEO_CHILD_TYPE, *PVIDEO_CHILD_TYPE; + +typedef VP_STATUS DDKAPI +(*PVIDEO_HW_GET_CHILD_DESCRIPTOR)( + IN PVOID HwDeviceExtension, + IN PVIDEO_CHILD_ENUM_INFO ChildEnumInfo, + OUT PVIDEO_CHILD_TYPE VideoChildType, + OUT PUCHAR pChildDescriptor, + OUT PULONG UId, + OUT PULONG pUnused); + +typedef BOOLEAN DDKAPI +(*PVIDEO_HW_INITIALIZE)( + IN PVOID HwDeviceExtension); + +typedef BOOLEAN DDKAPI +(*PVIDEO_HW_INTERRUPT)( + IN PVOID HwDeviceExtension); + +/* VIDEO_ACCESS_RANGE.RangePassive */ +#define VIDEO_RANGE_PASSIVE_DECODE 1 +#define VIDEO_RANGE_10_BIT_DECODE 2 + +#ifndef VIDEO_ACCESS_RANGE_DEFINED /* also in miniport.h */ +#define VIDEO_ACCESS_RANGE_DEFINED +typedef struct _VIDEO_ACCESS_RANGE { + PHYSICAL_ADDRESS RangeStart; + ULONG RangeLength; + UCHAR RangeInIoSpace; + UCHAR RangeVisible; + UCHAR RangeShareable; + UCHAR RangePassive; +} VIDEO_ACCESS_RANGE, *PVIDEO_ACCESS_RANGE; +#endif + +typedef VOID DDKAPI +(*PVIDEO_HW_LEGACYRESOURCES)( + IN ULONG VendorId, + IN ULONG DeviceId, + IN OUT PVIDEO_ACCESS_RANGE *LegacyResourceList, + IN OUT PULONG LegacyResourceCount); + +typedef VP_STATUS DDKAPI +(*PMINIPORT_QUERY_DEVICE_ROUTINE)( + IN PVOID HwDeviceExtension, + IN PVOID Context, + IN VIDEO_DEVICE_DATA_TYPE DeviceDataType, + IN PVOID Identifier, + IN ULONG IdentifierLength, + IN PVOID ConfigurationData, + IN ULONG ConfigurationDataLength, + IN OUT PVOID ComponentInformation, + IN ULONG ComponentInformationLength); + +typedef struct _QUERY_INTERFACE { + CONST GUID *InterfaceType; + USHORT Size; + USHORT Version; + PINTERFACE Interface; + PVOID InterfaceSpecificData; +} QUERY_INTERFACE, *PQUERY_INTERFACE; + +typedef VP_STATUS DDKAPI +(*PVIDEO_HW_QUERY_INTERFACE)( + IN PVOID HwDeviceExtension, + IN OUT PQUERY_INTERFACE QueryInterface); + +typedef VP_STATUS DDKAPI +(*PMINIPORT_GET_REGISTRY_ROUTINE)( + IN PVOID HwDeviceExtension, + IN PVOID Context, + IN OUT PWSTR ValueName, + IN OUT PVOID ValueData, + IN ULONG ValueLength); + +typedef BOOLEAN DDKAPI +(*PVIDEO_HW_RESET_HW)( + IN PVOID HwDeviceExtension, + IN ULONG Columns, + IN ULONG Rows); + +typedef VP_STATUS DDKAPI +(*PVIDEO_HW_POWER_SET)( + IN PVOID HwDeviceExtension, + IN ULONG HwId, + IN PVIDEO_POWER_MANAGEMENT VideoPowerControl); + +typedef struct _STATUS_BLOCK { + _ANONYMOUS_UNION union { + VP_STATUS Status; + PVOID Pointer; + } DUMMYUNIONNAME; + ULONG_PTR Information; +} STATUS_BLOCK, *PSTATUS_BLOCK; + +typedef struct _VIDEO_REQUEST_PACKET { + ULONG IoControlCode; + PSTATUS_BLOCK StatusBlock; + PVOID InputBuffer; + ULONG InputBufferLength; + PVOID OutputBuffer; + ULONG OutputBufferLength; +} VIDEO_REQUEST_PACKET, *PVIDEO_REQUEST_PACKET; + +typedef BOOLEAN DDKAPI +(*PVIDEO_HW_START_IO)( + IN PVOID HwDeviceExtension, + IN PVIDEO_REQUEST_PACKET RequestPacket); + +typedef BOOLEAN DDKAPI +(*PMINIPORT_SYNCHRONIZE_ROUTINE)( + IN PVOID Context); + +typedef VOID DDKAPI +(*PVIDEO_HW_TIMER)( + IN PVOID HwDeviceExtension); + +typedef VOID DDKAPI +(*PMINIPORT_DPC_ROUTINE)( + IN PVOID HwDeviceExtension, + IN PVOID Context); + +typedef VP_STATUS DDKAPI +(*PDRIVER_IO_PORT_UCHAR)( + IN ULONG_PTR Context, + IN ULONG Port, + IN UCHAR AccessMode, + IN PUCHAR Data); + +typedef VP_STATUS DDKAPI +(*PDRIVER_IO_PORT_UCHAR_STRING)( + IN ULONG_PTR Context, + IN ULONG Port, + IN UCHAR AccessMode, + IN PUCHAR Data, + IN ULONG DataLength); + +typedef VP_STATUS DDKAPI +(*PDRIVER_IO_PORT_ULONG)( + IN ULONG_PTR Context, + IN ULONG Port, + IN UCHAR AccessMode, + IN PULONG Data); + +typedef VP_STATUS DDKAPI +(*PDRIVER_IO_PORT_ULONG_STRING)( + IN ULONG_PTR Context, + IN ULONG Port, + IN UCHAR AccessMode, + IN PULONG Data, + IN ULONG DataLength); + +typedef VP_STATUS DDKAPI +(*PDRIVER_IO_PORT_USHORT)( + IN ULONG_PTR Context, + IN ULONG Port, + IN UCHAR AccessMode, + IN PUSHORT Data); + +typedef VP_STATUS DDKAPI +(*PDRIVER_IO_PORT_USHORT_STRING)( + IN ULONG_PTR Context, + IN ULONG Port, + IN UCHAR AccessMode, + IN PUSHORT Data, + IN ULONG DataLength); + + + +typedef struct _INT10_BIOS_ARGUMENTS { + ULONG Eax; + ULONG Ebx; + ULONG Ecx; + ULONG Edx; + ULONG Esi; + ULONG Edi; + ULONG Ebp; + USHORT SegDs; + USHORT SegEs; +} INT10_BIOS_ARGUMENTS, *PINT10_BIOS_ARGUMENTS; + +typedef struct _VIDEO_CHILD_STATE { + ULONG Id; + ULONG State; +} VIDEO_CHILD_STATE, *PVIDEO_CHILD_STATE; + +typedef struct _VIDEO_CHILD_STATE_CONFIGURATION { + ULONG Count; + VIDEO_CHILD_STATE ChildStateArray[ANYSIZE_ARRAY]; +} VIDEO_CHILD_STATE_CONFIGURATION, *PVIDEO_CHILD_STATE_CONFIGURATION; + +typedef struct _VIDEO_HW_INITIALIZATION_DATA { + ULONG HwInitDataSize; + INTERFACE_TYPE AdapterInterfaceType; + PVIDEO_HW_FIND_ADAPTER HwFindAdapter; + PVIDEO_HW_INITIALIZE HwInitialize; + PVIDEO_HW_INTERRUPT HwInterrupt; + PVIDEO_HW_START_IO HwStartIO; + ULONG HwDeviceExtensionSize; + ULONG StartingDeviceNumber; + PVIDEO_HW_RESET_HW HwResetHw; + PVIDEO_HW_TIMER HwTimer; + PVIDEO_HW_START_DMA HwStartDma; + PVIDEO_HW_POWER_SET HwSetPowerState; + PVIDEO_HW_POWER_GET HwGetPowerState; + PVIDEO_HW_GET_CHILD_DESCRIPTOR HwGetVideoChildDescriptor; + PVIDEO_HW_QUERY_INTERFACE HwQueryInterface; + ULONG HwChildDeviceExtensionSize; + PVIDEO_ACCESS_RANGE HwLegacyResourceList; + ULONG HwLegacyResourceCount; + PVIDEO_HW_LEGACYRESOURCES HwGetLegacyResources; + BOOLEAN AllowEarlyEnumeration; + ULONG Reserved; +} VIDEO_HW_INITIALIZATION_DATA, *PVIDEO_HW_INITIALIZATION_DATA; + +/* VIDEO_PORT_AGP_INTERFACE.Version contants */ +#define VIDEO_PORT_AGP_INTERFACE_VERSION_1 1 + +typedef struct _VIDEO_PORT_AGP_INTERFACE { + SHORT Size; + SHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PAGP_RESERVE_PHYSICAL AgpReservePhysical; + PAGP_RELEASE_PHYSICAL AgpReleasePhysical; + PAGP_COMMIT_PHYSICAL AgpCommitPhysical; + PAGP_FREE_PHYSICAL AgpFreePhysical; + PAGP_RESERVE_VIRTUAL AgpReserveVirtual; + PAGP_RELEASE_VIRTUAL AgpReleaseVirtual; + PAGP_COMMIT_VIRTUAL AgpCommitVirtual; + PAGP_FREE_VIRTUAL AgpFreeVirtual; + ULONGLONG AgpAllocationLimit; +} VIDEO_PORT_AGP_INTERFACE, *PVIDEO_PORT_AGP_INTERFACE; + +/* VIDEO_PORT_AGP_INTERFACE_2.Version constants */ +#define VIDEO_PORT_AGP_INTERFACE_VERSION_2 2 + +typedef struct _VIDEO_PORT_AGP_INTERFACE_2 { + IN USHORT Size; + IN USHORT Version; + OUT PVOID Context; + OUT PINTERFACE_REFERENCE InterfaceReference; + OUT PINTERFACE_DEREFERENCE InterfaceDereference; + OUT PAGP_RESERVE_PHYSICAL AgpReservePhysical; + OUT PAGP_RELEASE_PHYSICAL AgpReleasePhysical; + OUT PAGP_COMMIT_PHYSICAL AgpCommitPhysical; + OUT PAGP_FREE_PHYSICAL AgpFreePhysical; + OUT PAGP_RESERVE_VIRTUAL AgpReserveVirtual; + OUT PAGP_RELEASE_VIRTUAL AgpReleaseVirtual; + OUT PAGP_COMMIT_VIRTUAL AgpCommitVirtual; + OUT PAGP_FREE_VIRTUAL AgpFreeVirtual; + OUT ULONGLONG AgpAllocationLimit; + OUT PAGP_SET_RATE AgpSetRate; +} VIDEO_PORT_AGP_INTERFACE_2, *PVIDEO_PORT_AGP_INTERFACE_2; + +#define VIDEO_PORT_I2C_INTERFACE_VERSION_1 1 + +typedef VOID DDKAPI +(*PVIDEO_WRITE_CLOCK_LINE)( + PVOID HwDeviceExtension, + UCHAR Data); + +typedef VOID DDKAPI +(*PVIDEO_WRITE_DATA_LINE)( + PVOID HwDeviceExtension, + UCHAR Data); + +typedef BOOLEAN DDKAPI +(*PVIDEO_READ_CLOCK_LINE)( + PVOID HwDeviceExtension); + +typedef BOOLEAN DDKAPI +(*PVIDEO_READ_DATA_LINE)( + PVOID HwDeviceExtension); + +typedef struct _I2C_CALLBACKS +{ + IN PVIDEO_WRITE_CLOCK_LINE WriteClockLine; + IN PVIDEO_WRITE_DATA_LINE WriteDataLine; + IN PVIDEO_READ_CLOCK_LINE ReadClockLine; + IN PVIDEO_READ_DATA_LINE ReadDataLine; +} I2C_CALLBACKS, *PI2C_CALLBACKS; + +typedef BOOLEAN DDKAPI +(*PI2C_START)( + IN PVOID HwDeviceExtension, + IN PI2C_CALLBACKS I2CCallbacks); + +typedef BOOLEAN DDKAPI +(*PI2C_STOP)( + IN PVOID HwDeviceExtension, + IN PI2C_CALLBACKS I2CCallbacks); + +typedef BOOLEAN DDKAPI +(*PI2C_WRITE)( + IN PVOID HwDeviceExtension, + IN PI2C_CALLBACKS I2CCallbacks, + IN PUCHAR Buffer, + IN ULONG Length); + +typedef BOOLEAN DDKAPI +(*PI2C_READ)( + IN PVOID HwDeviceExtension, + IN PI2C_CALLBACKS I2CCallbacks, + OUT PUCHAR Buffer, + IN ULONG Length); + +typedef struct _VIDEO_PORT_I2C_INTERFACE { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PI2C_START I2CStart; + PI2C_STOP I2CStop; + PI2C_WRITE I2CWrite; + PI2C_READ I2CRead; +} VIDEO_PORT_I2C_INTERFACE, *PVIDEO_PORT_I2C_INTERFACE; + +/* VIDEO_PORT_INT10_INTERFACE.Version constants */ +#define VIDEO_PORT_INT10_INTERFACE_VERSION_1 1 + +typedef VP_STATUS DDKAPI +(*PINT10_ALLOCATE_BUFFER)( + IN PVOID Context, + OUT PUSHORT Seg, + OUT PUSHORT Off, + IN OUT PULONG Length); + +typedef VP_STATUS DDKAPI +(*PINT10_CALL_BIOS)( + IN PVOID Context, + IN OUT PINT10_BIOS_ARGUMENTS BiosArguments); + +typedef VP_STATUS DDKAPI +(*PINT10_FREE_BUFFER)( + IN PVOID Context, + IN USHORT Seg, + IN USHORT Off); + +typedef VP_STATUS DDKAPI +(*PINT10_READ_MEMORY)( + IN PVOID Context, + IN USHORT Seg, + IN USHORT Off, + OUT PVOID Buffer, + IN ULONG Length); + +typedef VP_STATUS DDKAPI +(*PINT10_WRITE_MEMORY)( + IN PVOID Context, + IN USHORT Seg, + IN USHORT Off, + IN PVOID Buffer, + IN ULONG Length); + +typedef struct _VIDEO_PORT_INT10_INTERFACE { + IN USHORT Size; + IN USHORT Version; + OUT PVOID Context; + OUT PINTERFACE_REFERENCE InterfaceReference; + OUT PINTERFACE_DEREFERENCE InterfaceDereference; + OUT PINT10_ALLOCATE_BUFFER Int10AllocateBuffer; + OUT PINT10_FREE_BUFFER Int10FreeBuffer; + OUT PINT10_READ_MEMORY Int10ReadMemory; + OUT PINT10_WRITE_MEMORY Int10WriteMemory; + OUT PINT10_CALL_BIOS Int10CallBios; +} VIDEO_PORT_INT10_INTERFACE, *PVIDEO_PORT_INT10_INTERFACE; + +/* Flags for VideoPortGetDeviceBase and VideoPortMapMemory */ +#define VIDEO_MEMORY_SPACE_MEMORY 0x00 +#define VIDEO_MEMORY_SPACE_IO 0x01 +#define VIDEO_MEMORY_SPACE_USER_MODE 0x02 +#define VIDEO_MEMORY_SPACE_DENSE 0x04 +#define VIDEO_MEMORY_SPACE_P6CACHE 0x08 + +typedef struct _VIDEO_X86_BIOS_ARGUMENTS { + ULONG Eax; + ULONG Ebx; + ULONG Ecx; + ULONG Edx; + ULONG Esi; + ULONG Edi; + ULONG Ebp; +} VIDEO_X86_BIOS_ARGUMENTS, *PVIDEO_X86_BIOS_ARGUMENTS; + +typedef struct _VP_DEVICE_DESCRIPTION { + BOOLEAN ScatterGather; + BOOLEAN Dma32BitAddresses; + BOOLEAN Dma64BitAddresses; + ULONG MaximumLength; +} VP_DEVICE_DESCRIPTION, *PVP_DEVICE_DESCRIPTION; + +typedef struct _VPOSVERSIONINFO { + IN ULONG Size; + OUT ULONG MajorVersion; + OUT ULONG MinorVersion; + OUT ULONG BuildNumber; + OUT USHORT ServicePackMajor; + OUT USHORT ServicePackMinor; +} VPOSVERSIONINFO, *PVPOSVERSIONINFO; + + + +/* Video port functions for miniports */ + +VPAPI +VOID +DDKAPI +VideoDebugPrint( + IN ULONG DebugPrintLevel, + IN PCHAR DebugMessage, + IN ...); + +VPAPI +VOID +DDKAPI +VideoPortAcquireDeviceLock( + IN PVOID HwDeviceExtension); + +VPAPI +VOID +DDKAPI +VideoPortAcquireSpinLock( + IN PVOID HwDeviceExtension, + IN PSPIN_LOCK SpinLock, + OUT PUCHAR OldIrql); + +VPAPI +VOID +DDKAPI +VideoPortAcquireSpinLockAtDpcLevel( + IN PVOID HwDeviceExtension, + IN PSPIN_LOCK SpinLock); + +VPAPI +VP_STATUS +DDKAPI +VideoPortAllocateBuffer( + IN PVOID HwDeviceExtension, + IN ULONG Size, + OUT PVOID *Buffer); + +VPAPI +PVOID +DDKAPI +VideoPortAllocateCommonBuffer( + IN PVOID HwDeviceExtension, + IN PVP_DMA_ADAPTER VpDmaAdapter, + IN ULONG DesiredLength, + OUT PPHYSICAL_ADDRESS LogicalAddress, + IN BOOLEAN CacheEnabled, + PVOID Reserved); + +VPAPI +PVOID +DDKAPI +VideoPortAllocateContiguousMemory( + IN PVOID HwDeviceExtension, + IN ULONG NumberOfBytes, + IN PHYSICAL_ADDRESS HighestAcceptableAddress); + +/* VideoPortAllocatePool.PoolType constants */ +typedef enum _VP_POOL_TYPE { + VpNonPagedPool = 0, + VpPagedPool, + VpNonPagedPoolCacheAligned = 4, + VpPagedPoolCacheAligned +} VP_POOL_TYPE, *PVP_POOL_TYPE; + +VPAPI +PVOID +DDKAPI +VideoPortAllocatePool( + IN PVOID HwDeviceExtension, + IN VP_POOL_TYPE PoolType, + IN SIZE_T NumberOfBytes, + IN ULONG Tag); + +VPAPI +PDMA +DDKAPI +VideoPortAssociateEventsWithDmaHandle( + IN PVOID HwDeviceExtension, + IN OUT PVIDEO_REQUEST_PACKET pVrp, + IN PVOID MappedUserEvent, + IN PVOID DisplayDriverEvent); + +/* VideoPortCheckForDeviceExistence.Flags constants */ +#define CDE_USE_SUBSYSTEM_IDS 0x00000001 +#define CDE_USE_REVISION 0x00000002 + +VPAPI +BOOLEAN +DDKAPI +VideoPortCheckForDeviceExistence( + IN PVOID HwDeviceExtension, + IN USHORT VendorId, + IN USHORT DeviceId, + IN UCHAR RevisionId, + IN USHORT SubVendorId, + IN USHORT SubSystemId, + IN ULONG Flags); + +VPAPI +VOID +DDKAPI +VideoPortClearEvent( + IN PVOID HwDeviceExtension, + IN PEVENT pEvent); + +VPAPI +ULONG +DDKAPI +VideoPortCompareMemory( + IN PVOID Source1, + IN PVOID Source2, + IN ULONG Length); + +VPAPI +VP_STATUS +DDKAPI +VideoPortCompleteDma( + IN PVOID HwDeviceExtension, + IN PVP_DMA_ADAPTER VpDmaAdapter, + IN PVP_SCATTER_GATHER_LIST VpScatterGather, + IN BOOLEAN WriteToDevice); + +VPAPI +VP_STATUS +DDKAPI +VideoPortCreateEvent( + IN PVOID HwDeviceExtension, + IN ULONG EventFlag, + IN PVOID Unused, + OUT PEVENT *ppEvent); + +VPAPI +VP_STATUS +DDKAPI +VideoPortCreateSecondaryDisplay( + IN PVOID HwDeviceExtension, + IN OUT PVOID *SecondaryDeviceExtension, + IN ULONG ulFlag); + +VPAPI +VP_STATUS +DDKAPI +VideoPortCreateSpinLock( + IN PVOID HwDeviceExtension, + OUT PSPIN_LOCK *SpinLock); + +typedef struct _DDC_CONTROL { + IN ULONG Size; + IN I2C_CALLBACKS I2CCallbacks; + IN UCHAR EdidSegment; +} DDC_CONTROL, *PDDC_CONTROL; + +VPAPI +BOOLEAN +DDKAPI +VideoPortDDCMonitorHelper( + IN PVOID HwDeviceExtension, + IN PVOID DDCControl, + IN OUT PUCHAR EdidBuffer, + IN ULONG EdidBufferSize); + +VPAPI +VOID +DDKCDECLAPI +VideoPortDebugPrint( + IN VIDEO_DEBUG_LEVEL DebugPrintLevel, + IN PCHAR DebugMessage, + IN ...); + +VPAPI +VP_STATUS +DDKAPI +VideoPortDeleteEvent( + IN PVOID HwDeviceExtension, + IN PEVENT pEvent); + +VPAPI +VP_STATUS +DDKAPI +VideoPortDeleteSpinLock( + IN PVOID HwDeviceExtension, + IN PSPIN_LOCK SpinLock); + +VPAPI +VP_STATUS +DDKAPI +VideoPortDisableInterrupt( + IN PVOID HwDeviceExtension); + +VPAPI +PDMA +DDKAPI +VideoPortDoDma( + IN PVOID HwDeviceExtension, + IN PDMA pDma, + IN DMA_FLAGS DmaFlags); + +VPAPI +VP_STATUS +DDKAPI +VideoPortEnableInterrupt( + IN PVOID HwDeviceExtension); + +VPAPI +VP_STATUS +DDKAPI +VideoPortEnumerateChildren( + IN PVOID HwDeviceExtension, + IN PVOID Reserved); + +VPAPI +VOID +DDKAPI +VideoPortFreeCommonBuffer( + IN PVOID HwDeviceExtension, + IN ULONG Length, + IN PVOID VirtualAddress, + IN PHYSICAL_ADDRESS LogicalAddress, + IN BOOLEAN CacheEnabled); + +VPAPI +VOID +DDKAPI +VideoPortFreeDeviceBase( + IN PVOID HwDeviceExtension, + IN PVOID MappedAddress); + +VPAPI +VOID +DDKAPI +VideoPortFreePool( + IN PVOID HwDeviceExtension, + IN PVOID Ptr); + +VPAPI +VP_STATUS +DDKAPI +VideoPortGetAccessRanges( + IN PVOID HwDeviceExtension, + IN ULONG NumRequestedResources, + IN PIO_RESOURCE_DESCRIPTOR RequestedResources OPTIONAL, + IN ULONG NumAccessRanges, + OUT PVIDEO_ACCESS_RANGE AccessRanges, + IN PVOID VendorId, + IN PVOID DeviceId, + OUT PULONG Slot); + +VPAPI +PVOID +DDKAPI +VideoPortGetAssociatedDeviceExtension( + IN PVOID DeviceObject); + +VPAPI +ULONG +DDKAPI +VideoPortGetAssociatedDeviceID( + IN PVOID DeviceObject); + +VPAPI +ULONG +DDKAPI +VideoPortGetBusData( + IN PVOID HwDeviceExtension, + IN BUS_DATA_TYPE BusDataType, + IN ULONG SlotNumber, + IN OUT PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +VPAPI +ULONG +DDKAPI +VideoPortGetBytesUsed( + IN PVOID HwDeviceExtension, + IN PDMA pDma); + +VPAPI +PVOID +DDKAPI +VideoPortGetCommonBuffer( + IN PVOID HwDeviceExtension, + IN ULONG DesiredLength, + IN ULONG Alignment, + OUT PPHYSICAL_ADDRESS LogicalAddress, + OUT PULONG pActualLength, + IN BOOLEAN CacheEnabled); + +VPAPI +UCHAR +DDKAPI +VideoPortGetCurrentIrql( + VOID); + +VPAPI +PVOID +DDKAPI +VideoPortGetDeviceBase( + IN PVOID HwDeviceExtension, + IN PHYSICAL_ADDRESS IoAddress, + IN ULONG NumberOfUchars, + IN UCHAR InIoSpace); + +VPAPI +VP_STATUS +DDKAPI +VideoPortGetDeviceData( + IN PVOID HwDeviceExtension, + IN VIDEO_DEVICE_DATA_TYPE DeviceDataType, + IN PMINIPORT_QUERY_DEVICE_ROUTINE CallbackRoutine, + IN PVOID Context); + +VPAPI +PVP_DMA_ADAPTER +DDKAPI +VideoPortGetDmaAdapter( + IN PVOID HwDeviceExtension, + IN PVP_DEVICE_DESCRIPTION VpDeviceDescription); + +VPAPI +PVOID +DDKAPI +VideoPortGetDmaContext( + IN PVOID HwDeviceExtension, + IN PDMA pDma); + +VPAPI +PVOID +DDKAPI +VideoPortGetMdl( + IN PVOID HwDeviceExtension, + IN PDMA pDma); + +VPAPI +VP_STATUS +DDKAPI +VideoPortGetRegistryParameters( + IN PVOID HwDeviceExtension, + IN PWSTR ParameterName, + IN UCHAR IsParameterFileName, + IN PMINIPORT_GET_REGISTRY_ROUTINE CallbackRoutine, + IN PVOID Context); + +VPAPI +PVOID +DDKAPI +VideoPortGetRomImage( + IN PVOID HwDeviceExtension, + IN PVOID Unused1, + IN ULONG Unused2, + IN ULONG Length); + +VPAPI +VP_STATUS +DDKAPI +VideoPortGetVersion( + IN PVOID HwDeviceExtension, + IN OUT PVPOSVERSIONINFO pVpOsVersionInfo); + +VPAPI +VP_STATUS +DDKAPI +VideoPortGetVgaStatus( + IN PVOID HwDeviceExtension, + OUT PULONG VgaStatus); + +VPAPI +ULONG +DDKAPI +VideoPortInitialize( + IN PVOID Argument1, + IN PVOID Argument2, + IN PVIDEO_HW_INITIALIZATION_DATA HwInitializationData, + IN PVOID HwContext); + +VPAPI +VP_STATUS +DDKAPI +VideoPortInt10( + IN PVOID HwDeviceExtension, + IN PVIDEO_X86_BIOS_ARGUMENTS BiosArguments); + +VPAPI +LONG +DDKFASTAPI +VideoPortInterlockedDecrement( + IN PLONG Addend); + +VPAPI +LONG +DDKFASTAPI +VideoPortInterlockedExchange( + IN OUT PLONG Target, + IN LONG Value); + +VPAPI +LONG +DDKFASTAPI +VideoPortInterlockedIncrement( + IN PLONG Addend); + +typedef enum _VP_LOCK_OPERATION { + VpReadAccess = 0, + VpWriteAccess, + VpModifyAccess +} VP_LOCK_OPERATION; + +VPAPI +PVOID +DDKAPI +VideoPortLockBuffer( + IN PVOID HwDeviceExtension, + IN PVOID BaseAddress, + IN ULONG Length, + IN VP_LOCK_OPERATION Operation); + +VPAPI +BOOLEAN +DDKAPI +VideoPortLockPages( + IN PVOID HwDeviceExtension, + IN OUT PVIDEO_REQUEST_PACKET pVrp, + IN OUT PEVENT pUEvent, + IN PEVENT pDisplayEvent, + IN DMA_FLAGS DmaFlags); + +VPAPI +VOID +DDKAPI +VideoPortLogError( + IN PVOID HwDeviceExtension, + IN PVIDEO_REQUEST_PACKET Vrp OPTIONAL, + IN VP_STATUS ErrorCode, + IN ULONG UniqueId); + +VPAPI +VP_STATUS +DDKAPI +VideoPortMapBankedMemory( + IN PVOID HwDeviceExtension, + IN PHYSICAL_ADDRESS PhysicalAddress, + IN OUT PULONG Length, + PULONG InIoSpace, + PVOID *VirtualAddress, + ULONG BankLength, + UCHAR ReadWriteBank, + PBANKED_SECTION_ROUTINE BankRoutine, + PVOID Context); + +VPAPI +PDMA +DDKAPI +VideoPortMapDmaMemory( + IN PVOID HwDeviceExtension, + IN PVIDEO_REQUEST_PACKET pVrp, + IN PHYSICAL_ADDRESS BoardAddress, + IN PULONG Length, + IN PULONG InIoSpace, + IN PVOID MappedUserEvent, + IN PVOID DisplayDriverEvent, + IN OUT PVOID *VirtualAddress); + +VPAPI +VP_STATUS +DDKAPI +VideoPortMapMemory( + IN PVOID HwDeviceExtension, + IN PHYSICAL_ADDRESS PhysicalAddress, + IN OUT PULONG Length, + IN PULONG InIoSpace, + IN OUT PVOID *VirtualAddress); + +VPAPI +VOID +DDKAPI +VideoPortMoveMemory( + IN PVOID Destination, + IN PVOID Source, + IN ULONG Length); + +VPAPI +VOID +DDKAPI +VideoPortPutDmaAdapter( + IN PVOID HwDeviceExtension, + IN PVP_DMA_ADAPTER VpDmaAdapter); + +VPAPI +LONGLONG +DDKAPI +VideoPortQueryPerformanceCounter( + IN PVOID HwDeviceExtension, + OUT PLONGLONG PerformanceFrequency OPTIONAL); + +/* VideoPortQueryServices.ServicesType constants */ +typedef enum _VIDEO_PORT_SERVICES { + VideoPortServicesAGP = 1, + VideoPortServicesI2C, + VideoPortServicesHeadless, + VideoPortServicesInt10 +} VIDEO_PORT_SERVICES; + +VPAPI +VP_STATUS +DDKAPI +VideoPortQueryServices( + IN PVOID HwDeviceExtension, + IN VIDEO_PORT_SERVICES ServicesType, + IN OUT PINTERFACE Interface); + +VPAPI +VOID +DDKAPI +VideoPortQuerySystemTime( + OUT PLARGE_INTEGER CurrentTime); + +VPAPI +BOOLEAN +DDKAPI +VideoPortQueueDpc( + IN PVOID HwDeviceExtension, + IN PMINIPORT_DPC_ROUTINE CallbackRoutine, + IN PVOID Context); + +VPAPI +VOID +DDKAPI +VideoPortReadPortBufferUchar( + IN PUCHAR Port, + OUT PUCHAR Buffer, + IN ULONG Count); + +VPAPI +VOID +DDKAPI +VideoPortReadPortBufferUlong( + IN PULONG Port, + OUT PULONG Buffer, + IN ULONG Count); + +VPAPI +VOID +DDKAPI +VideoPortReadPortBufferUshort( + IN PUSHORT Port, + OUT PUSHORT Buffer, + IN ULONG Count); + +VPAPI +UCHAR +DDKAPI +VideoPortReadPortUchar( + IN PUCHAR Port); + +VPAPI +ULONG +DDKAPI +VideoPortReadPortUlong( + IN PULONG Port); + +VPAPI +USHORT +DDKAPI +VideoPortReadPortUshort( + IN PUSHORT Port); + +VPAPI +VOID +DDKAPI +VideoPortReadRegisterBufferUchar( + IN PUCHAR Register, + OUT PUCHAR Buffer, + IN ULONG Count); + +VPAPI +VOID +DDKAPI +VideoPortReadRegisterBufferUlong( + IN PULONG Register, + OUT PULONG Buffer, + IN ULONG Count); + +VPAPI +VOID +DDKAPI +VideoPortReadRegisterBufferUshort( + IN PUSHORT Register, + OUT PUSHORT Buffer, + IN ULONG Count); + +VPAPI +UCHAR +DDKAPI +VideoPortReadRegisterUchar( + IN PUCHAR Register); + +VPAPI +ULONG +DDKAPI +VideoPortReadRegisterUlong( + IN PULONG Register); + +VPAPI +USHORT +DDKAPI +VideoPortReadRegisterUshort( + IN PUSHORT Register); + +VPAPI +LONG +DDKAPI +VideoPortReadStateEvent( + IN PVOID HwDeviceExtension, + IN PEVENT pEvent); + +VPAPI +VOID +DDKAPI +VideoPortReleaseBuffer( + IN PVOID HwDeviceExtension, + IN PVOID Buffer); + +VPAPI +VOID +DDKAPI +VideoPortReleaseCommonBuffer( + IN PVOID HwDeviceExtension, + IN PVP_DMA_ADAPTER VpDmaAdapter, + IN ULONG Length, + IN PHYSICAL_ADDRESS LogicalAddress, + IN PVOID VirtualAddress, + IN BOOLEAN CacheEnabled); + +VPAPI +VOID +DDKAPI +VideoPortReleaseDeviceLock( + IN PVOID HwDeviceExtension); + +VPAPI +VOID +DDKAPI +VideoPortReleaseSpinLock( + IN PVOID HwDeviceExtension, + IN PSPIN_LOCK SpinLock, + IN UCHAR NewIrql); + +VPAPI +VOID +DDKAPI +VideoPortReleaseSpinLockFromDpcLevel( + IN PVOID HwDeviceExtension, + IN PSPIN_LOCK SpinLock); + +VPAPI +BOOLEAN +DDKAPI +VideoPortScanRom( + PVOID HwDeviceExtension, + PUCHAR RomBase, + ULONG RomLength, + PUCHAR String); + +VPAPI +ULONG +DDKAPI +VideoPortSetBusData( + IN PVOID HwDeviceExtension, + IN BUS_DATA_TYPE BusDataType, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +VPAPI +VOID +DDKAPI +VideoPortSetBytesUsed( + IN PVOID HwDeviceExtension, + IN OUT PDMA pDma, + IN ULONG BytesUsed); + +VPAPI +VOID +DDKAPI +VideoPortSetDmaContext( + IN PVOID HwDeviceExtension, + OUT PDMA pDma, + IN PVOID InstanceContext); + +VPAPI +LONG +DDKAPI +VideoPortSetEvent( + IN PVOID HwDeviceExtension, + IN PEVENT pEvent); + +VPAPI +VP_STATUS +DDKAPI +VideoPortSetRegistryParameters( + IN PVOID HwDeviceExtension, + IN PWSTR ValueName, + IN PVOID ValueData, + IN ULONG ValueLength); + +VPAPI +VP_STATUS +DDKAPI +VideoPortSetTrappedEmulatorPorts( + IN PVOID HwDeviceExtension, + IN ULONG NumAccessRanges, + IN PVIDEO_ACCESS_RANGE AccessRange); + +VPAPI +BOOLEAN +DDKAPI +VideoPortSignalDmaComplete( + IN PVOID HwDeviceExtension, + IN PVOID pDmaHandle); + +VPAPI +VOID +DDKAPI +VideoPortStallExecution( + IN ULONG Microseconds); + +VPAPI +VP_STATUS +DDKAPI +VideoPortStartDma( + IN PVOID HwDeviceExtension, + IN PVP_DMA_ADAPTER VpDmaAdapter, + IN PVOID Mdl, + IN ULONG Offset, + IN OUT PULONG pLength, + IN PEXECUTE_DMA ExecuteDmaRoutine, + IN PVOID Context, + IN BOOLEAN WriteToDevice); + +VPAPI +VOID +DDKAPI +VideoPortStartTimer( + IN PVOID HwDeviceExtension); + +VPAPI +VOID +DDKAPI +VideoPortStopTimer( + IN PVOID HwDeviceExtension); + +/* VideoPortSynchronizeExecution.Priority constants */ +typedef enum VIDEO_SYNCHRONIZE_PRIORITY { + VpLowPriority = 0, + VpMediumPriority, + VpHighPriority +} VIDEO_SYNCHRONIZE_PRIORITY, *PVIDEO_SYNCHRONIZE_PRIORITY; + +VPAPI +BOOLEAN +DDKAPI +VideoPortSynchronizeExecution( + IN PVOID HwDeviceExtension, + IN VIDEO_SYNCHRONIZE_PRIORITY Priority, + IN PMINIPORT_SYNCHRONIZE_ROUTINE SynchronizeRoutine, + IN PVOID Context); + +VPAPI +VOID +DDKAPI +VideoPortUnLockBuffer( + IN PVOID HwDeviceExtension, + IN PVOID Mdl); + +VPAPI +BOOLEAN +DDKAPI +VideoPortUnlockPages( + IN PVOID hwDeviceExtension, + IN OUT PDMA pDma); + +VPAPI +BOOLEAN +DDKAPI +VideoPortUnmapDmaMemory( + IN PVOID HwDeviceExtension, + IN PVOID VirtualAddress, + IN HANDLE ProcessHandle, + IN PDMA BoardMemoryHandle); + +VPAPI +VP_STATUS +DDKAPI +VideoPortUnmapMemory( + IN PVOID HwDeviceExtension, + IN OUT PVOID VirtualAddress, + IN HANDLE ProcessHandle); + +VPAPI +VP_STATUS +DDKAPI +VideoPortVerifyAccessRanges( + IN PVOID HwDeviceExtension, + IN ULONG NumAccessRanges, + IN PVIDEO_ACCESS_RANGE AccessRanges); + +VPAPI +VP_STATUS +DDKAPI +VideoPortWaitForSingleObject( + IN PVOID HwDeviceExtension, + IN PVOID Object, + IN PLARGE_INTEGER Timeout OPTIONAL); + +VPAPI +VOID +DDKAPI +VideoPortWritePortBufferUchar( + IN PUCHAR Port, + IN PUCHAR Buffer, + IN ULONG Count); + +VPAPI +VOID +DDKAPI +VideoPortWritePortBufferUlong( + IN PULONG Port, + IN PULONG Buffer, + IN ULONG Count); + +VPAPI +VOID +DDKAPI +VideoPortWritePortBufferUshort( + IN PUSHORT Port, + IN PUSHORT Buffer, + IN ULONG Count); + +VPAPI +VOID +DDKAPI +VideoPortWritePortUchar( + IN PUCHAR Port, + IN UCHAR Value); + +VPAPI +VOID +DDKAPI +VideoPortWritePortUlong( + IN PULONG Port, + IN ULONG Value); + +VPAPI +VOID +DDKAPI +VideoPortWritePortUshort( + IN PUSHORT Port, + IN USHORT Value); + +VPAPI +VOID +DDKAPI +VideoPortWriteRegisterBufferUchar( + IN PUCHAR Register, + IN PUCHAR Buffer, + IN ULONG Count); + +VPAPI +VOID +DDKAPI +VideoPortWriteRegisterBufferUlong( + IN PULONG Register, + IN PULONG Buffer, + IN ULONG Count); + +VPAPI +VOID +DDKAPI +VideoPortWriteRegisterBufferUshort( + IN PUSHORT Register, + IN PUSHORT Buffer, + IN ULONG Count); + +VPAPI +VOID +DDKAPI +VideoPortWriteRegisterUchar( + IN PUCHAR Register, + IN UCHAR Value); + +VPAPI +VOID +DDKAPI +VideoPortWriteRegisterUlong( + IN PULONG Register, + IN ULONG Value); + +VPAPI +VOID +DDKAPI +VideoPortWriteRegisterUshort( + IN PUSHORT Register, + IN USHORT Value); + +VPAPI +VOID +DDKAPI +VideoPortZeroDeviceMemory( + IN PVOID Destination, + IN ULONG Length); + +VPAPI +VOID +DDKAPI +VideoPortZeroMemory( + IN PVOID Destination, + IN ULONG Length); + +#ifdef DBG +#define VideoDebugPrint(x) VideoPortDebugPrint x +#else +#define VideoDebugPrint(x) +#endif + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* defined __WINDDI_H */ + +#endif /* __VIDEO_H */ diff --git a/reactos/w32api/include/ddk/videoagp.h b/reactos/w32api/include/ddk/videoagp.h new file mode 100644 index 00000000000..89886f809da --- /dev/null +++ b/reactos/w32api/include/ddk/videoagp.h @@ -0,0 +1,133 @@ +/* + * videoagp.h + * + * Video miniport AGP interface + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __VIDEOAGP_H +#define __VIDEOAGP_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include "ntddk.h" +#include "video.h" + + +#define VIDEO_AGP_RATE_1X 0x00000001 +#define VIDEO_AGP_RATE_2X 0x00000002 +#define VIDEO_AGP_RATE_4X 0x00000004 +#define VIDEO_AGP_RATE_8X 0x00000008 + +typedef enum _VIDEO_PORT_CACHE_TYPE { + VpNonCached = 0, + VpWriteCombined, + VpCached +} VIDEO_PORT_CACHE_TYPE; + +typedef BOOLEAN DDKAPI +(*PAGP_COMMIT_PHYSICAL)( + IN PVOID HwDeviceExtension, + IN PVOID PhysicalReserveContext, + IN ULONG Pages, + IN ULONG Offset); + +typedef PVOID DDKAPI +(*PAGP_COMMIT_VIRTUAL)( + IN PVOID HwDeviceExtension, + IN PVOID VirtualReserveContext, + IN ULONG Pages, + IN ULONG Offset); + +typedef VOID DDKAPI +(*PAGP_FREE_PHYSICAL)( + IN PVOID HwDeviceExtension, + IN PVOID PhysicalReserveContext, + IN ULONG Pages, + IN ULONG Offset); + +typedef VOID DDKAPI +(*PAGP_FREE_VIRTUAL)( + IN PVOID HwDeviceExtension, + IN PVOID VirtualReserveContext, + IN ULONG Pages, + IN ULONG Offset); + +typedef VOID DDKAPI +(*PAGP_RELEASE_PHYSICAL)( + IN PVOID HwDeviceExtension, + IN PVOID PhysicalReserveContext); + +typedef VOID DDKAPI +(*PAGP_RELEASE_VIRTUAL)( + IN PVOID HwDeviceExtension, + IN PVOID VirtualReserveContext); + +typedef PHYSICAL_ADDRESS DDKAPI +(*PAGP_RESERVE_PHYSICAL)( + IN PVOID HwDeviceExtension, + IN ULONG Pages, + IN VIDEO_PORT_CACHE_TYPE Caching, + OUT PVOID *PhysicalReserveContext); + +typedef PVOID DDKAPI +(*PAGP_RESERVE_VIRTUAL)( + IN PVOID HwDeviceExtension, + IN HANDLE ProcessHandle, + IN PVOID PhysicalReserveContext, + OUT PVOID *VirtualReserveContext); + +typedef BOOLEAN DDKAPI +(*PAGP_SET_RATE)( + IN PVOID HwDeviceExtension, + IN ULONG AgpRate); + +typedef struct _VIDEO_PORT_AGP_SERVICES { + PAGP_RESERVE_PHYSICAL AgpReservePhysical; + PAGP_RELEASE_PHYSICAL AgpReleasePhysical; + PAGP_COMMIT_PHYSICAL AgpCommitPhysical; + PAGP_FREE_PHYSICAL AgpFreePhysical; + PAGP_RESERVE_VIRTUAL AgpReserveVirtual; + PAGP_RELEASE_VIRTUAL AgpReleaseVirtual; + PAGP_COMMIT_VIRTUAL AgpCommitVirtual; + PAGP_FREE_VIRTUAL AgpFreeVirtual; + ULONGLONG AllocationLimit; +} VIDEO_PORT_AGP_SERVICES, *PVIDEO_PORT_AGP_SERVICES; + +VPAPI +BOOLEAN +DDKAPI +VideoPortGetAgpServices( + IN PVOID HwDeviceExtension, + IN PVIDEO_PORT_AGP_SERVICES AgpServices); + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __VIDEOAGP_H */ diff --git a/reactos/w32api/include/ddk/win2k.h b/reactos/w32api/include/ddk/win2k.h new file mode 100644 index 00000000000..deba29b9e0e --- /dev/null +++ b/reactos/w32api/include/ddk/win2k.h @@ -0,0 +1,106 @@ +/* + * win2k.h + * + * Definitions only used in Windows 2000 and earlier versions + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __WIN2K_H +#define __WIN2K_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ntddk.h" + +#pragma pack(push,4) + +typedef enum _BUS_DATA_TYPE { + ConfigurationSpaceUndefined = -1, + Cmos, + EisaConfiguration, + Pos, + CbusConfiguration, + PCIConfiguration, + VMEConfiguration, + NuBusConfiguration, + PCMCIAConfiguration, + MPIConfiguration, + MPSAConfiguration, + PNPISAConfiguration, + SgiInternalConfiguration, + MaximumBusDataType +} BUS_DATA_TYPE, *PBUS_DATA_TYPE; + +NTOSAPI +VOID +DDKAPI +ExReleaseResourceForThreadLite( + IN PERESOURCE Resource, + IN ERESOURCE_THREAD ResourceThreadId); + +NTOSAPI +NTSTATUS +DDKAPI +IoReadPartitionTable( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN BOOLEAN ReturnRecognizedPartitions, + OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer); + +NTOSAPI +NTSTATUS +DDKAPI +IoSetPartitionInformation( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONG PartitionNumber, + IN ULONG PartitionType); + +NTOSAPI +NTSTATUS +DDKAPI +IoWritePartitionTable( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONG SectorsPerTrack, + IN ULONG NumberOfHeads, + IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer); + +/* + * PVOID MmGetSystemAddressForMdl( + * IN PMDL Mdl); + */ +#define MmGetSystemAddressForMdl(Mdl) \ + (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \ + MDL_SOURCE_IS_NONPAGED_POOL)) ? \ + ((Mdl)->MappedSystemVa) : \ + (MmMapLockedPages((Mdl), KernelMode))) + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __WIN2K_H */ diff --git a/reactos/w32api/include/ddk/winddi.h b/reactos/w32api/include/ddk/winddi.h new file mode 100644 index 00000000000..5659e6f8966 --- /dev/null +++ b/reactos/w32api/include/ddk/winddi.h @@ -0,0 +1,4146 @@ +/* + * winddi.h + * + * GDI device driver interface + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __WINDDI_H +#define __WINDDI_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __VIDEO_H +#error video.h cannot be included with winddi.h +#else + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ntddk.h" +#include <wingdi.h> + +#if 1 +/* FIXME: Some DirectDraw structures not added yet */ +typedef ULONG_PTR FLATPTR; +typedef PVOID LPVIDMEM; +typedef PVOID LPVMEMHEAP; +typedef PVOID PGLYPHOS; +typedef struct _DD_SURFACECALLBACKS { +} DD_SURFACECALLBACKS, *PDD_SURFACECALLBACKS; +typedef struct _DD_PALETTECALLBACKS { +} DD_PALETTECALLBACKS, *PDD_PALETTECALLBACKS; +typedef struct _DD_CALLBACKS { +} DD_CALLBACKS, *PDD_CALLBACKS; +typedef struct _DD_HALINFO { +} DD_HALINFO, *PDD_HALINFO; +typedef struct _DDSCAPS { +} DDSCAPS, *PDDSCAPS; +typedef struct _DDSCAPSEX { +} DDSCAPSEX, *PDDSCAPSEX; +typedef struct _VIDEOMEMORY { +} VIDEOMEMORY, *LPVIDEOMEMORY; +typedef struct _DD_DIRECTDRAW_GLOBAL { +} DD_DIRECTDRAW_GLOBAL, *LPDD_DIRECTDRAW_GLOBAL; +typedef struct _DD_SURFACE_LOCAL { +} DD_SURFACE_LOCAL, *PDD_SURFACE_LOCAL, *LPDD_SURFACE_LOCAL; +#endif + +#if defined(_WIN32K_) +#define WIN32KAPI DECL_EXPORT +#else +#define WIN32KAPI DECL_IMPORT +#endif + +#define DDI_DRIVER_VERSION_NT4 0x00020000 +#define DDI_DRIVER_VERSION_SP3 0x00020003 +#define DDI_DRIVER_VERSION_NT5 0x00030000 +#define DDI_DRIVER_VERSION_NT5_01 0x00030100 + +#define GDI_DRIVER_VERSION 0x4000 + +#ifdef _X86_ + +typedef DWORD FLOATL; + +#else /* !_X86_ */ + +typedef FLOAT FLOATL; + +#endif + +typedef SHORT FWORD; +typedef LONG LDECI4; +typedef ULONG IDENT; + +typedef ULONG_PTR HFF; +typedef ULONG_PTR HFC; + +typedef LONG PTRDIFF; +typedef PTRDIFF *PPTRDIFF; +typedef LONG FIX; +typedef FIX *PFIX; +typedef ULONG ROP4; +typedef ULONG MIX; +typedef ULONG HGLYPH; +typedef HGLYPH *PHGLYPH; + +typedef LONG_PTR (DDKAPI *PFN)(); + +DECLARE_HANDLE(HBM); +DECLARE_HANDLE(HDEV); +DECLARE_HANDLE(HSURF); +DECLARE_HANDLE(DHSURF); +DECLARE_HANDLE(DHPDEV); +DECLARE_HANDLE(HDRVOBJ); + + +#define GDI_DRIVER_VERSION 0x4000 + +typedef struct _ENG_EVENT *PEVENT; + +#define OPENGL_CMD 4352 +#define OPENGL_GETINFO 4353 +#define WNDOBJ_SETUP 4354 + +#define FD_ERROR 0xFFFFFFFF +#define DDI_ERROR 0xFFFFFFFF + +#define HFF_INVALID ((HFF) 0) +#define HFC_INVALID ((HFC) 0) +#define HGLYPH_INVALID ((HGLYPH) -1) + +#define FP_ALTERNATEMODE 1 +#define FP_WINDINGMODE 2 + +#define DN_ACCELERATION_LEVEL 1 +#define DN_DEVICE_ORIGIN 2 +#define DN_SLEEP_MODE 3 +#define DN_DRAWING_BEGIN 4 + +#define DCR_SOLID 0 +#define DCR_DRIVER 1 +#define DCR_HALFTONE 2 + +#define GX_IDENTITY 0 +#define GX_OFFSET 1 +#define GX_SCALE 2 +#define GX_GENERAL 3 + +typedef struct _POINTE { + FLOATL x; + FLOATL y; +} POINTE, *PPOINTE; + +typedef union _FLOAT_LONG { + FLOATL e; + LONG l; +} FLOAT_LONG, *PFLOAT_LONG; + +typedef struct _POINTFIX { + FIX x; + FIX y; +} POINTFIX, *PPOINTFIX; + +typedef struct _RECTFX { + FIX xLeft; + FIX yTop; + FIX xRight; + FIX yBottom; +} RECTFX, *PRECTFX; + +typedef struct _POINTQF { + LARGE_INTEGER x; + LARGE_INTEGER y; +} POINTQF, *PPOINTQF; + + +typedef struct _BLENDOBJ { + BLENDFUNCTION BlendFunction; +} BLENDOBJ,*PBLENDOBJ; + +/* BRUSHOBJ.flColorType */ +#define BR_DEVICE_ICM 0x01 +#define BR_HOST_ICM 0x02 +#define BR_CMYKCOLOR 0x04 +#define BR_ORIGCOLOR 0x08 + +typedef struct _BRUSHOBJ { + ULONG iSolidColor; + PVOID pvRbrush; + FLONG flColorType; +} BRUSHOBJ; + +typedef struct _CIECHROMA { + LDECI4 x; + LDECI4 y; + LDECI4 Y; +} CIECHROMA; + +typedef struct _RUN { + LONG iStart; + LONG iStop; +} RUN, *PRUN; + +typedef struct _CLIPLINE { + POINTFIX ptfxA; + POINTFIX ptfxB; + LONG lStyleState; + ULONG c; + RUN arun[1]; +} CLIPLINE, *PCLIPLINE; + +/* CLIPOBJ.iDComplexity constants */ +#define DC_TRIVIAL 0 +#define DC_RECT 1 +#define DC_COMPLEX 3 + +/* CLIPOBJ.iFComplexity constants */ +#define FC_RECT 1 +#define FC_RECT4 2 +#define FC_COMPLEX 3 + +/* CLIPOBJ.iMode constants */ +#define TC_RECTANGLES 0 +#define TC_PATHOBJ 2 + +/* CLIPOBJ.fjOptions constants */ +#define OC_BANK_CLIP 1 + +typedef struct _CLIPOBJ { + ULONG iUniq; + RECTL rclBounds; + BYTE iDComplexity; + BYTE iFComplexity; + BYTE iMode; + BYTE fjOptions; +} CLIPOBJ; + +typedef struct _COLORINFO { + CIECHROMA Red; + CIECHROMA Green; + CIECHROMA Blue; + CIECHROMA Cyan; + CIECHROMA Magenta; + CIECHROMA Yellow; + CIECHROMA AlignmentWhite; + LDECI4 RedGamma; + LDECI4 GreenGamma; + LDECI4 BlueGamma; + LDECI4 MagentaInCyanDye; + LDECI4 YellowInCyanDye; + LDECI4 CyanInMagentaDye; + LDECI4 YellowInMagentaDye; + LDECI4 CyanInYellowDye; + LDECI4 MagentaInYellowDye; +} COLORINFO, *PCOLORINFO; + +/* DEVHTADJDATA.DeviceFlags constants */ +#define DEVHTADJF_COLOR_DEVICE 0x00000001 +#define DEVHTADJF_ADDITIVE_DEVICE 0x00000002 + +typedef struct _DEVHTINFO { + DWORD HTFlags; + DWORD HTPatternSize; + DWORD DevPelsDPI; + COLORINFO ColorInfo; +} DEVHTINFO, *PDEVHTINFO; + +typedef struct _DEVHTADJDATA { + DWORD DeviceFlags; + DWORD DeviceXDPI; + DWORD DeviceYDPI; + PDEVHTINFO pDefHTInfo; + PDEVHTINFO pAdjHTInfo; +} DEVHTADJDATA, *PDEVHTADJDATA; + +/* DEVINFO.flGraphicsCaps flags */ +#define GCAPS_BEZIERS 0x00000001 +#define GCAPS_GEOMETRICWIDE 0x00000002 +#define GCAPS_ALTERNATEFILL 0x00000004 +#define GCAPS_WINDINGFILL 0x00000008 +#define GCAPS_HALFTONE 0x00000010 +#define GCAPS_COLOR_DITHER 0x00000020 +#define GCAPS_HORIZSTRIKE 0x00000040 +#define GCAPS_VERTSTRIKE 0x00000080 +#define GCAPS_OPAQUERECT 0x00000100 +#define GCAPS_VECTORFONT 0x00000200 +#define GCAPS_MONO_DITHER 0x00000400 +#define GCAPS_ASYNCCHANGE 0x00000800 +#define GCAPS_ASYNCMOVE 0x00001000 +#define GCAPS_DONTJOURNAL 0x00002000 +#define GCAPS_DIRECTDRAW 0x00004000 +#define GCAPS_ARBRUSHOPAQUE 0x00008000 +#define GCAPS_PANNING 0x00010000 +#define GCAPS_HIGHRESTEXT 0x00040000 +#define GCAPS_PALMANAGED 0x00080000 +#define GCAPS_DITHERONREALIZE 0x00200000 +#define GCAPS_NO64BITMEMACCESS 0x00400000 +#define GCAPS_FORCEDITHER 0x00800000 +#define GCAPS_GRAY16 0x01000000 +#define GCAPS_ICM 0x02000000 +#define GCAPS_CMYKCOLOR 0x04000000 +#define GCAPS_LAYERED 0x08000000 +#define GCAPS_ARBRUSHTEXT 0x10000000 +#define GCAPS_SCREENPRECISION 0x20000000 +#define GCAPS_FONT_RASTERIZER 0x40000000 +#define GCAPS_NUP 0x80000000 + +/* DEVINFO.iDitherFormat constants */ +#define BMF_1BPP 1L +#define BMF_4BPP 2L +#define BMF_8BPP 3L +#define BMF_16BPP 4L +#define BMF_24BPP 5L +#define BMF_32BPP 6L +#define BMF_4RLE 7L +#define BMF_8RLE 8L +#define BMF_JPEG 9L +#define BMF_PNG 10L + +/* DEVINFO.flGraphicsCaps2 flags */ +#define GCAPS2_JPEGSRC 0x00000001 +#define GCAPS2_xxxx 0x00000002 +#define GCAPS2_PNGSRC 0x00000008 +#define GCAPS2_CHANGEGAMMARAMP 0x00000010 +#define GCAPS2_ALPHACURSOR 0x00000020 +#define GCAPS2_SYNCFLUSH 0x00000040 +#define GCAPS2_SYNCTIMER 0x00000080 +#define GCAPS2_ICD_MULTIMON 0x00000100 +#define GCAPS2_MOUSETRAILS 0x00000200 +#define GCAPS2_RESERVED1 0x00000400 + +typedef struct _DEVINFO { + FLONG flGraphicsCaps; + LOGFONTW lfDefaultFont; + LOGFONTW lfAnsiVarFont; + LOGFONTW lfAnsiFixFont; + ULONG cFonts; + ULONG iDitherFormat; + USHORT cxDither; + USHORT cyDither; + HPALETTE hpalDefault; + FLONG flGraphicsCaps2; +} DEVINFO, *PDEVINFO; + +typedef struct _DRIVEROBJ *PDRIVEROBJ; + +typedef BOOL DDKAPI CALLBACK +(*FREEOBJPROC)( + IN PDRIVEROBJ pDriverObj); + +typedef struct _DRIVEROBJ { + PVOID pvObj; + FREEOBJPROC pFreeProc; + HDEV hdev; + DHPDEV dhpdev; +} DRIVEROBJ; + +/* DRVFN.iFunc constants */ +#define INDEX_DrvEnablePDEV 0L +#define INDEX_DrvCompletePDEV 1L +#define INDEX_DrvDisablePDEV 2L +#define INDEX_DrvEnableSurface 3L +#define INDEX_DrvDisableSurface 4L +#define INDEX_DrvAssertMode 5L +#define INDEX_DrvOffset 6L +#define INDEX_DrvResetPDEV 7L +#define INDEX_DrvDisableDriver 8L +#define INDEX_DrvCreateDeviceBitmap 10L +#define INDEX_DrvDeleteDeviceBitmap 11L +#define INDEX_DrvRealizeBrush 12L +#define INDEX_DrvDitherColor 13L +#define INDEX_DrvStrokePath 14L +#define INDEX_DrvFillPath 15L +#define INDEX_DrvStrokeAndFillPath 16L +#define INDEX_DrvPaint 17L +#define INDEX_DrvBitBlt 18L +#define INDEX_DrvCopyBits 19L +#define INDEX_DrvStretchBlt 20L +#define INDEX_DrvSetPalette 22L +#define INDEX_DrvTextOut 23L +#define INDEX_DrvEscape 24L +#define INDEX_DrvDrawEscape 25L +#define INDEX_DrvQueryFont 26L +#define INDEX_DrvQueryFontTree 27L +#define INDEX_DrvQueryFontData 28L +#define INDEX_DrvSetPointerShape 29L +#define INDEX_DrvMovePointer 30L +#define INDEX_DrvLineTo 31L +#define INDEX_DrvSendPage 32L +#define INDEX_DrvStartPage 33L +#define INDEX_DrvEndDoc 34L +#define INDEX_DrvStartDoc 35L +#define INDEX_DrvGetGlyphMode 37L +#define INDEX_DrvSynchronize 38L +#define INDEX_DrvSaveScreenBits 40L +#define INDEX_DrvGetModes 41L +#define INDEX_DrvFree 42L +#define INDEX_DrvDestroyFont 43L +#define INDEX_DrvQueryFontCaps 44L +#define INDEX_DrvLoadFontFile 45L +#define INDEX_DrvUnloadFontFile 46L +#define INDEX_DrvFontManagement 47L +#define INDEX_DrvQueryTrueTypeTable 48L +#define INDEX_DrvQueryTrueTypeOutline 49L +#define INDEX_DrvGetTrueTypeFile 50L +#define INDEX_DrvQueryFontFile 51L +#define INDEX_DrvMovePanning 52L +#define INDEX_DrvQueryAdvanceWidths 53L +#define INDEX_DrvSetPixelFormat 54L +#define INDEX_DrvDescribePixelFormat 55L +#define INDEX_DrvSwapBuffers 56L +#define INDEX_DrvStartBanding 57L +#define INDEX_DrvNextBand 58L +#define INDEX_DrvGetDirectDrawInfo 59L +#define INDEX_DrvEnableDirectDraw 60L +#define INDEX_DrvDisableDirectDraw 61L +#define INDEX_DrvQuerySpoolType 62L +#define INDEX_DrvIcmCreateColorTransform 64L +#define INDEX_DrvIcmDeleteColorTransform 65L +#define INDEX_DrvIcmCheckBitmapBits 66L +#define INDEX_DrvIcmSetDeviceGammaRamp 67L +#define INDEX_DrvGradientFill 68L +#define INDEX_DrvStretchBltROP 69L +#define INDEX_DrvPlgBlt 70L +#define INDEX_DrvAlphaBlend 71L +#define INDEX_DrvSynthesizeFont 72L +#define INDEX_DrvGetSynthesizedFontFiles 73L +#define INDEX_DrvTransparentBlt 74L +#define INDEX_DrvQueryPerBandInfo 75L +#define INDEX_DrvQueryDeviceSupport 76L +#define INDEX_DrvReserved1 77L +#define INDEX_DrvReserved2 78L +#define INDEX_DrvReserved3 79L +#define INDEX_DrvReserved4 80L +#define INDEX_DrvReserved5 81L +#define INDEX_DrvReserved6 82L +#define INDEX_DrvReserved7 83L +#define INDEX_DrvReserved8 84L +#define INDEX_DrvDeriveSurface 85L +#define INDEX_DrvQueryGlyphAttrs 86L +#define INDEX_DrvNotify 87L +#define INDEX_DrvSynchronizeSurface 88L +#define INDEX_DrvResetDevice 89L +#define INDEX_DrvReserved9 90L +#define INDEX_DrvReserved10 91L +#define INDEX_DrvReserved11 92L +#define INDEX_LAST 93L + +typedef struct _DRVFN { + ULONG iFunc; + PFN pfn; +} DRVFN, *PDRVFN; + +/* DRVENABLEDATA.iDriverVersion constants */ +#define DDI_DRIVER_VERSION_NT4 0x00020000 +#define DDI_DRIVER_VERSION_SP3 0x00020003 +#define DDI_DRIVER_VERSION_NT5 0x00030000 +#define DDI_DRIVER_VERSION_NT5_01 0x00030100 + +typedef struct _DRVENABLEDATA { + ULONG iDriverVersion; + ULONG c; + DRVFN *pdrvfn; +} DRVENABLEDATA, *PDRVENABLEDATA; + +DECLARE_HANDLE(HSEMAPHORE); + +typedef struct _ENGSAFESEMAPHORE { + HSEMAPHORE hsem; + LONG lCount; +} ENGSAFESEMAPHORE; + +typedef struct _ENG_TIME_FIELDS { + USHORT usYear; + USHORT usMonth; + USHORT usDay; + USHORT usHour; + USHORT usMinute; + USHORT usSecond; + USHORT usMilliseconds; + USHORT usWeekday; +} ENG_TIME_FIELDS, *PENG_TIME_FIELDS; + +typedef struct _ENUMRECTS { + ULONG c; + RECTL arcl[1]; +} ENUMRECTS; + +typedef struct _FD_XFORM { + FLOATL eXX; + FLOATL eXY; + FLOATL eYX; + FLOATL eYY; +} FD_XFORM, *PFD_XFORM; + +/* FD_DEVICEMETRICS.flRealizedType constants */ +#define FDM_TYPE_BM_SIDE_CONST 0x00000001 +#define FDM_TYPE_MAXEXT_EQUAL_BM_SIDE 0x00000002 +#define FDM_TYPE_CHAR_INC_EQUAL_BM_BASE 0x00000004 +#define FDM_TYPE_ZERO_BEARINGS 0x00000008 +#define FDM_TYPE_CONST_BEARINGS 0x00000010 + +typedef struct _FD_DEVICEMETRICS { + FLONG flRealizedType; + POINTE pteBase; + POINTE pteSide; + LONG lD; + FIX fxMaxAscender; + FIX fxMaxDescender; + POINTL ptlUnderline1; + POINTL ptlStrikeout; + POINTL ptlULThickness; + POINTL ptlSOThickness; + ULONG cxMax; + ULONG cyMax; + ULONG cjGlyphMax; + FD_XFORM fdxQuantized; + LONG lNonLinearExtLeading; + LONG lNonLinearIntLeading; + LONG lNonLinearMaxCharWidth; + LONG lNonLinearAvgCharWidth; + LONG lMinA; + LONG lMinC; + LONG lMinD; + LONG alReserved[1]; +} FD_DEVICEMETRICS, *PFD_DEVICEMETRICS; + +/* FD_GLYPHATTR.iMode constants */ +#define FO_ATTR_MODE_ROTATE 1 + +typedef struct _FD_GLYPHATTR { + ULONG cjThis; + ULONG cGlyphs; + ULONG iMode; + BYTE aGlyphAttr[1]; +} FD_GLYPHATTR, *PFD_GLYPHATTR; + +/* FD_GLYPHSET.flAccel */ +#define GS_UNICODE_HANDLES 0x00000001 +#define GS_8BIT_HANDLES 0x00000002 +#define GS_16BIT_HANDLES 0x00000004 + +typedef struct _WCRUN { + WCHAR wcLow; + USHORT cGlyphs; + HGLYPH *phg; +} WCRUN, *PWCRUN; + +typedef struct _FD_GLYPHSET { + ULONG cjThis; + FLONG flAccel; + ULONG cGlyphsSupported; + ULONG cRuns; + WCRUN awcrun[1]; +} FD_GLYPHSET, *PFD_GLYPHSET; + +typedef struct _FD_KERNINGPAIR { + WCHAR wcFirst; + WCHAR wcSecond; + FWORD fwdKern; +} FD_KERNINGPAIR; + +typedef struct _FLOATOBJ +{ + ULONG ul1; + ULONG ul2; +} FLOATOBJ, *PFLOATOBJ; + +typedef struct _FLOATOBJ_XFORM { + FLOATOBJ eM11; + FLOATOBJ eM12; + FLOATOBJ eM21; + FLOATOBJ eM22; + FLOATOBJ eDx; + FLOATOBJ eDy; +} FLOATOBJ_XFORM, *PFLOATOBJ_XFORM, FAR *LPFLOATOBJ_XFORM; + +/* FONTDIFF.fsSelection */ +#define FM_SEL_ITALIC 0x0001 +#define FM_SEL_UNDERSCORE 0x0002 +#define FM_SEL_NEGATIVE 0x0004 +#define FM_SEL_OUTLINED 0x0008 +#define FM_SEL_STRIKEOUT 0x0010 +#define FM_SEL_BOLD 0x0020 +#define FM_SEL_REGULAR 0x0040 + +typedef struct _FONTDIFF { + BYTE jReserved1; + BYTE jReserved2; + BYTE jReserved3; + BYTE bWeight; + USHORT usWinWeight; + FSHORT fsSelection; + FWORD fwdAveCharWidth; + FWORD fwdMaxCharInc; + POINTL ptlCaret; +} FONTDIFF; + +typedef struct _FONTSIM { + PTRDIFF dpBold; + PTRDIFF dpItalic; + PTRDIFF dpBoldItalic; +} FONTSIM; + +/* FONTINFO.flCaps constants */ +#define FO_DEVICE_FONT 1L +#define FO_OUTLINE_CAPABLE 2L + +typedef struct _FONTINFO { + ULONG cjThis; + FLONG flCaps; + ULONG cGlyphsSupported; + ULONG cjMaxGlyph1; + ULONG cjMaxGlyph4; + ULONG cjMaxGlyph8; + ULONG cjMaxGlyph32; +} FONTINFO, *PFONTINFO; + +/* FONTOBJ.flFontType constants */ +#define FO_TYPE_RASTER RASTER_FONTTYPE +#define FO_TYPE_DEVICE DEVICE_FONTTYPE +#define FO_TYPE_TRUETYPE TRUETYPE_FONTTYPE +#define FO_TYPE_OPENTYPE OPENTYPE_FONTTYPE + +#define FO_SIM_BOLD 0x00002000 +#define FO_SIM_ITALIC 0x00004000 +#define FO_EM_HEIGHT 0x00008000 +#define FO_GRAY16 0x00010000 +#define FO_NOGRAY16 0x00020000 +#define FO_NOHINTS 0x00040000 +#define FO_NO_CHOICE 0x00080000 +#define FO_CFF 0x00100000 +#define FO_POSTSCRIPT 0x00200000 +#define FO_MULTIPLEMASTER 0x00400000 +#define FO_VERT_FACE 0x00800000 +#define FO_DBCS_FONT 0X01000000 +#define FO_NOCLEARTYPE 0x02000000 +#define FO_CLEARTYPE_X 0x10000000 +#define FO_CLEARTYPE_Y 0x20000000 + +typedef struct _FONTOBJ { + ULONG iUniq; + ULONG iFace; + ULONG cxMax; + FLONG flFontType; + ULONG_PTR iTTUniq; + ULONG_PTR iFile; + SIZE sizLogResPpi; + ULONG ulStyleSize; + PVOID pvConsumer; + PVOID pvProducer; +} FONTOBJ; + +typedef struct _GAMMARAMP { + WORD Red[256]; + WORD Green[256]; + WORD Blue[256]; +} GAMMARAMP, *PGAMMARAMP; + +/* GDIINFO.ulPrimaryOrder constants */ +#define PRIMARY_ORDER_ABC 0 +#define PRIMARY_ORDER_ACB 1 +#define PRIMARY_ORDER_BAC 2 +#define PRIMARY_ORDER_BCA 3 +#define PRIMARY_ORDER_CBA 4 +#define PRIMARY_ORDER_CAB 5 + +/* GDIINFO.ulHTPatternSize constants */ +#define HT_PATSIZE_2x2 0 +#define HT_PATSIZE_2x2_M 1 +#define HT_PATSIZE_4x4 2 +#define HT_PATSIZE_4x4_M 3 +#define HT_PATSIZE_6x6 4 +#define HT_PATSIZE_6x6_M 5 +#define HT_PATSIZE_8x8 6 +#define HT_PATSIZE_8x8_M 7 +#define HT_PATSIZE_10x10 8 +#define HT_PATSIZE_10x10_M 9 +#define HT_PATSIZE_12x12 10 +#define HT_PATSIZE_12x12_M 11 +#define HT_PATSIZE_14x14 12 +#define HT_PATSIZE_14x14_M 13 +#define HT_PATSIZE_16x16 14 +#define HT_PATSIZE_16x16_M 15 +#define HT_PATSIZE_SUPERCELL 16 +#define HT_PATSIZE_SUPERCELL_M 17 +#define HT_PATSIZE_USER 18 +#define HT_PATSIZE_MAX_INDEX HT_PATSIZE_USER +#define HT_PATSIZE_DEFAULT HT_PATSIZE_SUPERCELL_M +#define HT_USERPAT_CX_MIN 4 +#define HT_USERPAT_CX_MAX 256 +#define HT_USERPAT_CY_MIN 4 +#define HT_USERPAT_CY_MAX 256 + +/* GDIINFO.ulHTOutputFormat constants */ +#define HT_FORMAT_1BPP 0 +#define HT_FORMAT_4BPP 2 +#define HT_FORMAT_4BPP_IRGB 3 +#define HT_FORMAT_8BPP 4 +#define HT_FORMAT_16BPP 5 +#define HT_FORMAT_24BPP 6 +#define HT_FORMAT_32BPP 7 + +/* GDIINFO.flHTFlags */ +#define HT_FLAG_SQUARE_DEVICE_PEL 0x00000001 +#define HT_FLAG_HAS_BLACK_DYE 0x00000002 +#define HT_FLAG_ADDITIVE_PRIMS 0x00000004 +#define HT_FLAG_USE_8BPP_BITMASK 0x00000008 +#define HT_FLAG_INK_HIGH_ABSORPTION 0x00000010 +#define HT_FLAG_INK_ABSORPTION_INDICES 0x00000060 +#define HT_FLAG_DO_DEVCLR_XFORM 0x00000080 +#define HT_FLAG_OUTPUT_CMY 0x00000100 +#define HT_FLAG_PRINT_DRAFT_MODE 0x00000200 +#define HT_FLAG_INVERT_8BPP_BITMASK_IDX 0x00000400 +#define HT_FLAG_8BPP_CMY332_MASK 0xFF000000 + +#define MAKE_CMYMASK_BYTE(c,m,y) ((BYTE)(((BYTE)(c) & 0x07) << 5) \ + |(BYTE)(((BYTE)(m) & 0x07) << 2) \ + |(BYTE)((BYTE)(y) & 0x03)) + +#define MAKE_CMY332_MASK(c,m,y) ((DWORD)(((DWORD)(c) & 0x07) << 29)\ + |(DWORD)(((DWORD)(m) & 0x07) << 26)\ + |(DWORD)(((DWORD)(y) & 0x03) << 24)) + +/* GDIINFO.flHTFlags constants */ +#define HT_FLAG_INK_ABSORPTION_IDX0 0x00000000 +#define HT_FLAG_INK_ABSORPTION_IDX1 0x00000020 +#define HT_FLAG_INK_ABSORPTION_IDX2 0x00000040 +#define HT_FLAG_INK_ABSORPTION_IDX3 0x00000060 + +#define HT_FLAG_HIGHEST_INK_ABSORPTION (HT_FLAG_INK_HIGH_ABSORPTION \ + |HT_FLAG_INK_ABSORPTION_IDX3) +#define HT_FLAG_HIGHER_INK_ABSORPTION (HT_FLAG_INK_HIGH_ABSORPTION \ + |HT_FLAG_INK_ABSORPTION_IDX2) +#define HT_FLAG_HIGH_INK_ABSORPTION (HT_FLAG_INK_HIGH_ABSORPTION \ + |HT_FLAG_INK_ABSORPTION_IDX1) +#define HT_FLAG_NORMAL_INK_ABSORPTION HT_FLAG_INK_ABSORPTION_IDX0 +#define HT_FLAG_LOW_INK_ABSORPTION HT_FLAG_INK_ABSORPTION_IDX1 +#define HT_FLAG_LOWER_INK_ABSORPTION HT_FLAG_INK_ABSORPTION_IDX2 +#define HT_FLAG_LOWEST_INK_ABSORPTION HT_FLAG_INK_ABSORPTION_IDX3 + +#define HT_BITMASKPALRGB (DWORD)'0BGR' +#define HT_SET_BITMASKPAL2RGB(pPal) (*((LPDWORD)(pPal)) = HT_BITMASKPALRGB) +#define HT_IS_BITMASKPALRGB(pPal) (*((LPDWORD)(pPal)) == (DWORD)0) + +/* GDIINFO.ulPhysicalPixelCharacteristics constants */ +#define PPC_DEFAULT 0x0 +#define PPC_UNDEFINED 0x1 +#define PPC_RGB_ORDER_VERTICAL_STRIPES 0x2 +#define PPC_BGR_ORDER_VERTICAL_STRIPES 0x3 +#define PPC_RGB_ORDER_HORIZONTAL_STRIPES 0x4 +#define PPC_BGR_ORDER_HORIZONTAL_STRIPES 0x5 + +#define PPG_DEFAULT 0 +#define PPG_SRGB 1 + +typedef struct _GDIINFO { + ULONG ulVersion; + ULONG ulTechnology; + ULONG ulHorzSize; + ULONG ulVertSize; + ULONG ulHorzRes; + ULONG ulVertRes; + ULONG cBitsPixel; + ULONG cPlanes; + ULONG ulNumColors; + ULONG flRaster; + ULONG ulLogPixelsX; + ULONG ulLogPixelsY; + ULONG flTextCaps; + ULONG ulDACRed; + ULONG ulDACGreen; + ULONG ulDACBlue; + ULONG ulAspectX; + ULONG ulAspectY; + ULONG ulAspectXY; + LONG xStyleStep; + LONG yStyleStep; + LONG denStyleStep; + POINTL ptlPhysOffset; + SIZEL szlPhysSize; + ULONG ulNumPalReg; + COLORINFO ciDevice; + ULONG ulDevicePelsDPI; + ULONG ulPrimaryOrder; + ULONG ulHTPatternSize; + ULONG ulHTOutputFormat; + ULONG flHTFlags; + ULONG ulVRefresh; + ULONG ulBltAlignment; + ULONG ulPanningHorzRes; + ULONG ulPanningVertRes; + ULONG xPanningAlignment; + ULONG yPanningAlignment; + ULONG cxHTPat; + ULONG cyHTPat; + LPBYTE pHTPatA; + LPBYTE pHTPatB; + LPBYTE pHTPatC; + ULONG flShadeBlend; + ULONG ulPhysicalPixelCharacteristics; + ULONG ulPhysicalPixelGamma; +} GDIINFO, *PGDIINFO; + +/* PATHDATA.flags constants */ +#define PD_BEGINSUBPATH 0x00000001 +#define PD_ENDSUBPATH 0x00000002 +#define PD_RESETSTYLE 0x00000004 +#define PD_CLOSEFIGURE 0x00000008 +#define PD_BEZIERS 0x00000010 +#define PD_ALL (PD_BEGINSUBPATH \ + |PD_ENDSUBPATH \ + |PD_RESETSTYLE \ + |PD_CLOSEFIGURE \ + PD_BEZIERS) + +typedef struct _PATHDATA { + FLONG flags; + ULONG count; + POINTFIX pptfx; +} PATHDATA, *PPATHDATA; + +/* PATHOBJ.fl constants */ +#define PO_BEZIERS 0x00000001 +#define PO_ELLIPSE 0x00000002 +#define PO_ALL_INTEGERS 0x00000004 +#define PO_ENUM_AS_INTEGERS 0x00000008 + +typedef struct _PATHOBJ { + FLONG fl; + ULONG cCurves; +} PATHOBJ; + +typedef struct _GLYPHBITS { + POINTL ptlOrigin; + SIZEL sizlBitmap; + BYTE aj[1]; +} GLYPHBITS; + +typedef union _GLYPHDEF { + GLYPHBITS *pgb; + PATHOBJ *ppo; +} GLYPHDEF; + +typedef struct _GLYPHPOS { + HGLYPH hg; + GLYPHDEF *pgdf; + POINTL *ptl; +} GLYPHPOS, *PGLYPHPOS; + +typedef struct _GLYPHDATA { + GLYPHDEF gdf; + HGLYPH hg; + FIX fxD; + FIX fxA; + FIX fxAB; + FIX fxInkTop; + FIX fxInkBottom; + RECTL rclInk; + POINTQF ptqD; +} GLYPHDATA; + +typedef struct _IFIEXTRA { + ULONG ulIdentifier; + PTRDIFF dpFontSig; + ULONG cig; + PTRDIFF dpDesignVector; + PTRDIFF dpAxesInfoW; + ULONG aulReserved[1]; +} IFIEXTRA, *PIFIEXTRA; + +/* IFIMETRICS constants */ + +#define FM_VERSION_NUMBER 0x0 + +/* IFIMETRICS.fsType constants */ +#define FM_TYPE_LICENSED 0x2 +#define FM_READONLY_EMBED 0x4 +#define FM_EDITABLE_EMBED 0x8 +#define FM_NO_EMBEDDING FM_TYPE_LICENSED + +/* IFIMETRICS.flInfo constants */ +#define FM_INFO_TECH_TRUETYPE 0x00000001 +#define FM_INFO_TECH_BITMAP 0x00000002 +#define FM_INFO_TECH_STROKE 0x00000004 +#define FM_INFO_TECH_OUTLINE_NOT_TRUETYPE 0x00000008 +#define FM_INFO_ARB_XFORMS 0x00000010 +#define FM_INFO_1BPP 0x00000020 +#define FM_INFO_4BPP 0x00000040 +#define FM_INFO_8BPP 0x00000080 +#define FM_INFO_16BPP 0x00000100 +#define FM_INFO_24BPP 0x00000200 +#define FM_INFO_32BPP 0x00000400 +#define FM_INFO_INTEGER_WIDTH 0x00000800 +#define FM_INFO_CONSTANT_WIDTH 0x00001000 +#define FM_INFO_NOT_CONTIGUOUS 0x00002000 +#define FM_INFO_TECH_MM 0x00004000 +#define FM_INFO_RETURNS_OUTLINES 0x00008000 +#define FM_INFO_RETURNS_STROKES 0x00010000 +#define FM_INFO_RETURNS_BITMAPS 0x00020000 +#define FM_INFO_DSIG 0x00040000 +#define FM_INFO_RIGHT_HANDED 0x00080000 +#define FM_INFO_INTEGRAL_SCALING 0x00100000 +#define FM_INFO_90DEGREE_ROTATIONS 0x00200000 +#define FM_INFO_OPTICALLY_FIXED_PITCH 0x00400000 +#define FM_INFO_DO_NOT_ENUMERATE 0x00800000 +#define FM_INFO_ISOTROPIC_SCALING_ONLY 0x01000000 +#define FM_INFO_ANISOTROPIC_SCALING_ONLY 0x02000000 +#define FM_INFO_TECH_CFF 0x04000000 +#define FM_INFO_FAMILY_EQUIV 0x08000000 +#define FM_INFO_DBCS_FIXED_PITCH 0x10000000 +#define FM_INFO_NONNEGATIVE_AC 0x20000000 +#define FM_INFO_IGNORE_TC_RA_ABLE 0x40000000 +#define FM_INFO_TECH_TYPE1 0x80000000 + +#define MAXCHARSETS 16 + +/* IFIMETRICS.ulPanoseCulture constants */ +#define FM_PANOSE_CULTURE_LATIN 0x0 + +typedef struct _IFIMETRICS { + ULONG cjThis; + ULONG cjIfiExtra; + PTRDIFF dpwszFamilyName; + PTRDIFF dpwszStyleName; + PTRDIFF dpwszFaceName; + PTRDIFF dpwszUniqueName; + PTRDIFF dpFontSim; + LONG lEmbedId; + LONG lItalicAngle; + LONG lCharBias; + PTRDIFF dpCharSets; + BYTE jWinCharSet; + BYTE jWinPitchAndFamily; + USHORT usWinWeight; + ULONG flInfo; + USHORT fsSelection; + USHORT fsType; + FWORD fwdUnitsPerEm; + FWORD fwdLowestPPEm; + FWORD fwdWinAscender; + FWORD fwdWinDescender; + FWORD fwdMacAscender; + FWORD fwdMacDescender; + FWORD fwdMacLineGap; + FWORD fwdTypoAscender; + FWORD fwdTypoDescender; + FWORD fwdTypoLineGap; + FWORD fwdAveCharWidth; + FWORD fwdMaxCharInc; + FWORD fwdCapHeight; + FWORD fwdXHeight; + FWORD fwdSubscriptXSize; + FWORD fwdSubscriptYSize; + FWORD fwdSubscriptXOffset; + FWORD fwdSubscriptYOffset; + FWORD fwdSuperscriptXSize; + FWORD fwdSuperscriptYSize; + FWORD fwdSuperscriptXOffset; + FWORD fwdSuperscriptYOffset; + FWORD fwdUnderscoreSize; + FWORD fwdUnderscorePosition; + FWORD fwdStrikeoutSize; + FWORD fwdStrikeoutPosition; + BYTE chFirstChar; + BYTE chLastChar; + BYTE chDefaultChar; + BYTE chBreakChar; + WCHAR wcFirstChar; + WCHAR wcLastChar; + WCHAR wcDefaultChar; + WCHAR wcBreakChar; + POINTL ptlBaseline; + POINTL ptlAspect; + POINTL ptlCaret; + RECTL rclFontBox; + BYTE achVendId[4]; + ULONG cKerningPairs; + ULONG ulPanoseCulture; + PANOSE panose; +#if defined(_WIN64) + PVOID Align; +#endif +} IFIMETRICS, *PIFIMETRICS; + +/* LINEATTRS.fl */ +#define LA_GEOMETRIC 0x00000001 +#define LA_ALTERNATE 0x00000002 +#define LA_STARTGAP 0x00000004 +#define LA_STYLED 0x00000008 + +/* LINEATTRS.iJoin */ +#define JOIN_ROUND 0L +#define JOIN_BEVEL 1L +#define JOIN_MITER 2L + +/* LINEATTRS.iEndCap */ +#define ENDCAP_ROUND 0L +#define ENDCAP_SQUARE 1L +#define ENDCAP_BUTT 2L + +typedef struct _LINEATTRS { + FLONG fl; + ULONG iJoin; + ULONG iEndCap; + FLOAT_LONG elWidth; + FLOATL eMiterLimit; + ULONG cstyle; + PFLOAT_LONG pstyle; + FLOAT_LONG elStyleState; +} LINEATTRS, *PLINEATTRS; + +typedef struct _PALOBJ { + ULONG ulReserved; +} PALOBJ; + +typedef struct _PERBANDINFO { + BOOL bRepeatThisBand; + SIZEL szlBand; + ULONG ulHorzRes; + ULONG ulVertRes; +} PERBANDINFO, *PPERBANDINFO; + +/* STROBJ.flAccel constants */ +#define SO_FLAG_DEFAULT_PLACEMENT 0x00000001 +#define SO_HORIZONTAL 0x00000002 +#define SO_VERTICAL 0x00000004 +#define SO_REVERSED 0x00000008 +#define SO_ZERO_BEARINGS 0x00000010 +#define SO_CHAR_INC_EQUAL_BM_BASE 0x00000020 +#define SO_MAXEXT_EQUAL_BM_SIDE 0x00000040 +#define SO_DO_NOT_SUBSTITUTE_DEVICE_FONT 0x00000080 +#define SO_GLYPHINDEX_TEXTOUT 0x00000100 +#define SO_ESC_NOT_ORIENT 0x00000200 +#define SO_DXDY 0x00000400 +#define SO_CHARACTER_EXTRA 0x00000800 +#define SO_BREAK_EXTRA 0x00001000 + +typedef struct _STROBJ { + ULONG cGlyphs; + FLONG flAccel; + ULONG ulCharInc; + RECTL rclBkGround; + GLYPHPOS *pgp; + LPWSTR pwszOrg; +} STROBJ; + +typedef struct _SURFACEALIGNMENT { + union { + struct { + DWORD dwStartAlignment; + DWORD dwPitchAlignment; + DWORD dwReserved1; + DWORD dwReserved2; + } Linear; + struct { + DWORD dwXAlignment; + DWORD dwYAlignment; + DWORD dwReserved1; + DWORD dwReserved2; + } Rectangular; + }; +} SURFACEALIGNMENT, *LPSURFACEALIGNMENT; + +/* SURFOBJ.iType constants */ +#define STYPE_BITMAP 0L +#define STYPE_DEVICE 1L +#define STYPE_DEVBITMAP 3L + +/* SURFOBJ.fjBitmap constants */ +#define BMF_TOPDOWN 0x0001 +#define BMF_NOZEROINIT 0x0002 +#define BMF_DONTCACHE 0x0004 +#define BMF_USERMEM 0x0008 +#define BMF_KMSECTION 0x0010 +#define BMF_NOTSYSMEM 0x0020 +#define BMF_WINDOW_BLT 0x0040 +#define BMF_UMPDMEM 0x0080 +#define BMF_RESERVED 0xFF00 + +typedef struct _SURFOBJ { + DHSURF dhsurf; + HSURF hsurf; + DHPDEV dhpdev; + HDEV hdev; + SIZEL sizlBitmap; + ULONG cjBits; + PVOID pvBits; + PVOID pvScan0; + LONG lDelta; + ULONG iUniq; + ULONG iBitmapFormat; + USHORT iType; + USHORT fjBitmap; +} SURFOBJ; + +typedef struct _TYPE1_FONT { + HANDLE hPFM; + HANDLE hPFB; + ULONG ulIdentifier; +} TYPE1_FONT; + +typedef struct _WNDOBJ { + CLIPOBJ coClient; + PVOID pvConsumer; + RECTL rclClient; + SURFOBJ *psoOwner; +} WNDOBJ, *PWNDOBJ; + +typedef struct _XFORML { + FLOATL eM11; + FLOATL eM12; + FLOATL eM21; + FLOATL eM22; + FLOATL eDx; + FLOATL eDy; +} XFORML, *PXFORML; + +typedef struct _XFORMOBJ { + ULONG ulReserved; +} XFORMOBJ; + +/* XLATEOBJ.flXlate constants */ +#define XO_TRIVIAL 0x00000001 +#define XO_TABLE 0x00000002 +#define XO_TO_MONO 0x00000004 +#define XO_FROM_CMYK 0x00000008 +#define XO_DEVICE_ICM 0x00000010 +#define XO_HOST_ICM 0x00000020 + +typedef struct _XLATEOBJ { + ULONG iUniq; + FLONG flXlate; + USHORT iSrcType; + USHORT iDstType; + ULONG cEntries; + ULONG *pulXlate; +} XLATEOBJ; + +typedef VOID DDKAPI (CALLBACK *WNDOBJCHANGEPROC)( + IN WNDOBJ *pwo, + IN FLONG fl); + + +WIN32KAPI +HANDLE +DDKAPI +BRUSHOBJ_hGetColorTransform( + IN BRUSHOBJ *pbo); + +WIN32KAPI +PVOID +DDKAPI +BRUSHOBJ_pvAllocRbrush( + IN BRUSHOBJ *pbo, + IN ULONG cj); + +WIN32KAPI +PVOID +DDKAPI +BRUSHOBJ_pvGetRbrush( + IN BRUSHOBJ *pbo); + +WIN32KAPI +ULONG +DDKAPI +BRUSHOBJ_ulGetBrushColor( + IN BRUSHOBJ *pbo); + +WIN32KAPI +BOOL +DDKAPI +CLIPOBJ_bEnum( + IN CLIPOBJ *pco, + IN ULONG cj, + OUT ULONG *pv); + +/* CLIPOBJ_cEnumStart.iType constants */ +#define CT_RECTANGLES 0L + +/* CLIPOBJ_cEnumStart.iDirection constants */ +#define CD_RIGHTDOWN 0x00000000 +#define CD_LEFTDOWN 0x00000001 +#define CD_LEFTWARDS 0x00000001 +#define CD_RIGHTUP 0x00000002 +#define CD_UPWARDS 0x00000002 +#define CD_LEFTUP 0x00000003 +#define CD_ANY 0x00000004 + +WIN32KAPI +ULONG +DDKAPI +CLIPOBJ_cEnumStart( + IN CLIPOBJ *pco, + IN BOOL bAll, + IN ULONG iType, + IN ULONG iDirection, + IN ULONG cLimit); + +WIN32KAPI +PATHOBJ* +DDKAPI +CLIPOBJ_ppoGetPath( + IN CLIPOBJ *pco); + +WIN32KAPI +VOID +DDKAPI +EngAcquireSemaphore( + IN HSEMAPHORE hsem); + +#define FL_ZERO_MEMORY 0x00000001 +#define FL_NONPAGED_MEMORY 0x00000002 + +WIN32KAPI +PVOID +DDKAPI +EngAllocMem( + IN ULONG Flags, + IN ULONG MemSize, + IN ULONG Tag); + +WIN32KAPI +PVOID +DDKAPI +EngAllocPrivateUserMem( + IN PDD_SURFACE_LOCAL psl, + IN SIZE_T cj, + IN ULONG tag); + +WIN32KAPI +PVOID +DDKAPI +EngAllocUserMem( + IN SIZE_T cj, + IN ULONG tag); + +WIN32KAPI +BOOL +DDKAPI +EngAlphaBlend( + IN SURFOBJ *psoDest, + IN SURFOBJ *psoSrc, + IN CLIPOBJ *pco, + IN XLATEOBJ *pxlo, + IN RECTL *prclDest, + IN RECTL *prclSrc, + IN BLENDOBJ *pBlendObj); + +/* EngAssociateSurface.flHooks constants */ +#define HOOK_BITBLT 0x00000001 +#define HOOK_STRETCHBLT 0x00000002 +#define HOOK_PLGBLT 0x00000004 +#define HOOK_TEXTOUT 0x00000008 +#define HOOK_PAINT 0x00000010 +#define HOOK_STROKEPATH 0x00000020 +#define HOOK_FILLPATH 0x00000040 +#define HOOK_STROKEANDFILLPATH 0x00000080 +#define HOOK_LINETO 0x00000100 +#define HOOK_COPYBITS 0x00000400 +#define HOOK_MOVEPANNING 0x00000800 +#define HOOK_SYNCHRONIZE 0x00001000 +#define HOOK_STRETCHBLTROP 0x00002000 +#define HOOK_SYNCHRONIZEACCESS 0x00004000 +#define HOOK_TRANSPARENTBLT 0x00008000 +#define HOOK_ALPHABLEND 0x00010000 +#define HOOK_GRADIENTFILL 0x00020000 +#define HOOK_FLAGS 0x0003b5ff + +WIN32KAPI +BOOL +DDKAPI +EngAssociateSurface( + IN HSURF hsurf, + IN HDEV hdev, + IN FLONG flHooks); + +WIN32KAPI +BOOL +DDKAPI +EngBitBlt( + IN SURFOBJ *psoTrg, + IN SURFOBJ *psoSrc, + IN SURFOBJ *psoMask, + IN CLIPOBJ *pco, + IN XLATEOBJ *pxlo, + IN RECTL *prclTrg, + IN POINTL *pptlSrc, + IN POINTL *pptlMask, + IN BRUSHOBJ *pbo, + IN POINTL *pptlBrush, + IN ROP4 rop4); + +WIN32KAPI +BOOL +DDKAPI +EngCheckAbort( + IN SURFOBJ *pso); + +WIN32KAPI +VOID +DDKAPI +EngClearEvent( + IN PEVENT pEvent); + +WIN32KAPI +FD_GLYPHSET* +DDKAPI +EngComputeGlyphSet( + IN INT nCodePage, + IN INT nFirstChar, + IN INT cChars); + +/* EngControlSprites.fl constants */ +#define ECS_TEARDOWN 0x00000001 +#define ECS_REDRAW 0x00000002 + +WIN32KAPI +BOOL +DDKAPI +EngControlSprites( + IN WNDOBJ *pwo, + IN FLONG fl); + +WIN32KAPI +BOOL +DDKAPI +EngCopyBits( + OUT SURFOBJ *psoDest, + IN SURFOBJ *psoSrc, + IN CLIPOBJ *pco, + IN XLATEOBJ *pxlo, + IN RECTL *prclDest, + IN POINTL *pptlSrc); + +WIN32KAPI +HBITMAP +DDKAPI +EngCreateBitmap( + IN SIZEL sizl, + IN LONG lWidth, + IN ULONG iFormat, + IN FLONG fl, + IN PVOID pvBits); + +WIN32KAPI +CLIPOBJ* +DDKAPI +EngCreateClip( + VOID); + +WIN32KAPI +HBITMAP +DDKAPI +EngCreateDeviceBitmap( + IN DHSURF dhsurf, + IN SIZEL sizl, + IN ULONG iFormatCompat); + +WIN32KAPI +HSURF +DDKAPI +EngCreateDeviceSurface( + DHSURF dhsurf, + SIZEL sizl, + ULONG iFormatCompat); + +#if 0 +WIN32KAPI +HDRVOBJ +DDKAPI +EngCreateDriverObj( + PVOID pvObj, + FREEOBJPROC pFreeObjProc, + HDEV hdev); +#endif + +WIN32KAPI +BOOL +DDKAPI +EngCreateEvent( + OUT PEVENT *ppEvent); + +/* EngCreatePalette.iMode constants */ +#define PAL_INDEXED 0x00000001 +#define PAL_BITFIELDS 0x00000002 +#define PAL_RGB 0x00000004 +#define PAL_BGR 0x00000008 +#define PAL_CMYK 0x00000010 + +WIN32KAPI +HPALETTE +DDKAPI +EngCreatePalette( + IN ULONG iMode, + IN ULONG cColors, + IN ULONG *pulColors, + IN FLONG flRed, + IN FLONG flGreen, + IN FLONG flBlue); + +WIN32KAPI +PATHOBJ* +DDKAPI +EngCreatePath( + VOID); + +WIN32KAPI +HSEMAPHORE +DDKAPI +EngCreateSemaphore( + VOID); + +/* EngCreateWnd.fl constants */ +#define WO_RGN_CLIENT_DELTA 0x00000001 +#define WO_RGN_CLIENT 0x00000002 +#define WO_RGN_SURFACE_DELTA 0x00000004 +#define WO_RGN_SURFACE 0x00000008 +#define WO_RGN_UPDATE_ALL 0x00000010 +#define WO_RGN_WINDOW 0x00000020 +#define WO_DRAW_NOTIFY 0x00000040 +#define WO_SPRITE_NOTIFY 0x00000080 +#define WO_RGN_DESKTOP_COORD 0x00000100 + +WIN32KAPI +WNDOBJ* +DDKAPI +EngCreateWnd( + SURFOBJ *pso, + HWND hwnd, + WNDOBJCHANGEPROC pfn, + FLONG fl, + int iPixelFormat); + +WIN32KAPI +VOID +DDKAPI +EngDebugBreak( + VOID); + +WIN32KAPI +VOID +DDKAPI +EngDebugPrint( + IN PCHAR StandardPrefix, + IN PCHAR DebugMessage, + IN va_list ap); + +WIN32KAPI +VOID +DDKAPI +EngDeleteClip( + IN CLIPOBJ *pco); + +WIN32KAPI +BOOL +DDKAPI +EngDeleteDriverObj( + IN HDRVOBJ hdo, + IN BOOL bCallBack, + IN BOOL bLocked); + +WIN32KAPI +BOOL +DDKAPI +EngDeleteEvent( + IN PEVENT pEvent); + +WIN32KAPI +BOOL +DDKAPI +EngDeleteFile( + IN LPWSTR pwszFileName); + +WIN32KAPI +BOOL +DDKAPI +EngDeletePalette( + IN HPALETTE hpal); + +WIN32KAPI +VOID +DDKAPI +EngDeletePath( + IN PATHOBJ *ppo); + +WIN32KAPI +VOID +DDKAPI +EngDeleteSafeSemaphore( + IN OUT ENGSAFESEMAPHORE *pssem); + +WIN32KAPI +VOID +DDKAPI +EngDeleteSemaphore( + IN OUT HSEMAPHORE hsem); + +WIN32KAPI +BOOL +DDKAPI +EngDeleteSurface( + IN HSURF hsurf); + +WIN32KAPI +VOID +DDKAPI +EngDeleteWnd( + IN WNDOBJ *pwo); + +WIN32KAPI +DWORD +DDKAPI +EngDeviceIoControl( + IN HANDLE hDevice, + IN DWORD dwIoControlCode, + IN LPVOID lpInBuffer, + IN DWORD nInBufferSize, + IN OUT LPVOID lpOutBuffer, + IN DWORD nOutBufferSize, + OUT LPDWORD lpBytesReturned); + +WIN32KAPI +ULONG +DDKAPI +EngDitherColor( + IN HDEV hdev, + IN ULONG iMode, + IN ULONG rgb, + OUT ULONG *pul); + +WIN32KAPI +BOOL +DDKAPI +EngEnumForms( + IN HANDLE hPrinter, + IN DWORD Level, + OUT LPBYTE pForm, + IN DWORD cbBuf, + OUT LPDWORD pcbNeeded, + OUT LPDWORD pcReturned); + +WIN32KAPI +BOOL +DDKAPI +EngEraseSurface( + IN SURFOBJ *pso, + IN RECTL *prcl, + IN ULONG iColor); + +WIN32KAPI +BOOL +DDKAPI +EngFillPath( + IN SURFOBJ *pso, + IN PATHOBJ *ppo, + IN CLIPOBJ *pco, + IN BRUSHOBJ *pbo, + IN POINTL *pptlBrushOrg, + IN MIX mix, + IN FLONG flOptions); + +WIN32KAPI +PVOID +DDKAPI +EngFindImageProcAddress( + IN HANDLE hModule, + IN LPSTR lpProcName); + +WIN32KAPI +PVOID +DDKAPI +EngFindResource( + IN HANDLE h, + IN int iName, + IN int iType, + OUT PULONG pulSize); + +WIN32KAPI +PVOID +DDKAPI +EngFntCacheAlloc( + IN ULONG FastCheckSum, + IN ULONG ulSize); + +/* EngFntCacheFault.iFaultMode constants */ +#define ENG_FNT_CACHE_READ_FAULT 0x00000001 +#define ENG_FNT_CACHE_WRITE_FAULT 0x00000002 + +WIN32KAPI +VOID +DDKAPI +EngFntCacheFault( + IN ULONG ulFastCheckSum, + IN ULONG iFaultMode); + +WIN32KAPI +PVOID +DDKAPI +EngFntCacheLookUp( + IN ULONG FastCheckSum, + OUT ULONG *pulSize); + +WIN32KAPI +VOID +DDKAPI +EngFreeMem( + IN PVOID Mem); + +WIN32KAPI +VOID +DDKAPI +EngFreeModule( + IN HANDLE h); + +WIN32KAPI +VOID +DDKAPI +EngFreePrivateUserMem( + IN PDD_SURFACE_LOCAL psl, + IN PVOID pv); + +WIN32KAPI +VOID +DDKAPI +EngFreeUserMem( + IN PVOID pv); + +WIN32KAPI +VOID +DDKAPI +EngGetCurrentCodePage( + OUT PUSHORT OemCodePage, + OUT PUSHORT AnsiCodePage); + +WIN32KAPI +HANDLE +DDKAPI +EngGetCurrentProcessId( + VOID); + +WIN32KAPI +HANDLE +DDKAPI +EngGetCurrentThreadId( + VOID); + +WIN32KAPI +LPWSTR +DDKAPI +EngGetDriverName( + IN HDEV hdev); + +WIN32KAPI +BOOL +DDKAPI +EngGetFileChangeTime( + IN HANDLE h, + OUT LARGE_INTEGER *pChangeTime); + +WIN32KAPI +BOOL +DDKAPI +EngGetFilePath( + IN HANDLE h, + OUT WCHAR (*pDest)[MAX_PATH+1]); + +WIN32KAPI +BOOL +DDKAPI +EngGetForm( + IN HANDLE hPrinter, + IN LPWSTR pFormName, + IN DWORD Level, + OUT LPBYTE pForm, + IN DWORD cbBuf, + OUT LPDWORD pcbNeeded); + +WIN32KAPI +ULONG +DDKAPI +EngGetLastError( + VOID); + +WIN32KAPI +BOOL +DDKAPI +EngGetPrinter( + IN HANDLE hPrinter, + IN DWORD dwLevel, + OUT LPBYTE pPrinter, + IN DWORD cbBuf, + OUT LPDWORD pcbNeeded); + +WIN32KAPI +DWORD +DDKAPI +EngGetPrinterData( + IN HANDLE hPrinter, + IN LPWSTR pValueName, + OUT LPDWORD pType, + OUT LPBYTE pData, + IN DWORD nSize, + OUT LPDWORD pcbNeeded); + +WIN32KAPI +LPWSTR +DDKAPI +EngGetPrinterDataFileName( + IN HDEV hdev); + +WIN32KAPI +BOOL +DDKAPI +EngGetPrinterDriver( + IN HANDLE hPrinter, + IN LPWSTR pEnvironment, + IN DWORD dwLevel, + OUT BYTE *lpbDrvInfo, + IN DWORD cbBuf, + OUT DWORD *pcbNeeded); + +WIN32KAPI +HANDLE +DDKAPI +EngGetProcessHandle( + VOID); + +WIN32KAPI +BOOL +DDKAPI +EngGetType1FontList( + IN HDEV hdev, + OUT TYPE1_FONT *pType1Buffer, + IN ULONG cjType1Buffer, + OUT PULONG pulLocalFonts, + OUT PULONG pulRemoteFonts, + OUT LARGE_INTEGER *pLastModified); + +WIN32KAPI +BOOL +DDKAPI +EngGradientFill( + IN SURFOBJ *psoDest, + IN CLIPOBJ *pco, + IN XLATEOBJ *pxlo, + IN TRIVERTEX *pVertex, + IN ULONG nVertex, + IN PVOID pMesh, + IN ULONG nMesh, + IN RECTL *prclExtents, + IN POINTL *pptlDitherOrg, + IN ULONG ulMode); + +/* EngHangNotification return values */ +#define EHN_RESTORED 0x00000000 +#define EHN_ERROR 0x00000001 + +WIN32KAPI +ULONG +DDKAPI +EngHangNotification( + IN HDEV hDev, + IN PVOID Reserved); + +WIN32KAPI +BOOL +DDKAPI +EngInitializeSafeSemaphore( + OUT ENGSAFESEMAPHORE *pssem); + +WIN32KAPI +BOOL +DDKAPI +EngIsSemaphoreOwned( + IN HSEMAPHORE hsem); + +WIN32KAPI +BOOL +DDKAPI +EngIsSemaphoreOwnedByCurrentThread( + IN HSEMAPHORE hsem); + +WIN32KAPI +BOOL +DDKAPI +EngLineTo( + SURFOBJ *pso, + CLIPOBJ *pco, + BRUSHOBJ *pbo, + LONG x1, + LONG y1, + LONG x2, + LONG y2, + RECTL *prclBounds, + MIX mix); + +WIN32KAPI +HANDLE +DDKAPI +EngLoadImage( + IN LPWSTR pwszDriver); + +WIN32KAPI +HANDLE +DDKAPI +EngLoadModule( + IN LPWSTR pwsz); + +WIN32KAPI +HANDLE +DDKAPI +EngLoadModuleForWrite( + IN LPWSTR pwsz, + IN ULONG cjSizeOfModule); + +WIN32KAPI +PDD_SURFACE_LOCAL +DDKAPI +EngLockDirectDrawSurface( + IN HANDLE hSurface); + +WIN32KAPI +DRIVEROBJ* +DDKAPI +EngLockDriverObj( + IN HDRVOBJ hdo); + +WIN32KAPI +SURFOBJ* +DDKAPI +EngLockSurface( + IN HSURF hsurf); + +WIN32KAPI +BOOL +DDKAPI +EngLpkInstalled( + VOID); + +WIN32KAPI +PEVENT +DDKAPI +EngMapEvent( + IN HDEV hDev, + IN HANDLE hUserObject, + IN PVOID Reserved1, + IN PVOID Reserved2, + IN PVOID Reserved3); + +WIN32KAPI +PVOID +DDKAPI +EngMapFile( + IN LPWSTR pwsz, + IN ULONG cjSize, + OUT ULONG_PTR *piFile); + +WIN32KAPI +BOOL +DDKAPI +EngMapFontFile( + ULONG_PTR iFile, + PULONG *ppjBuf, + ULONG *pcjBuf); + +WIN32KAPI +BOOL +DDKAPI +EngMapFontFileFD( + IN ULONG_PTR iFile, + OUT PULONG *ppjBuf, + OUT ULONG *pcjBuf); + +WIN32KAPI +PVOID +DDKAPI +EngMapModule( + IN HANDLE h, + OUT PULONG pSize); + +WIN32KAPI +BOOL +DDKAPI +EngMarkBandingSurface( + IN HSURF hsurf); + +/* EngModifySurface.flSurface constants */ +#define MS_NOTSYSTEMMEMORY 0x00000001 +#define MS_SHAREDACCESS 0x00000002 + +WIN32KAPI +BOOL +DDKAPI +EngModifySurface( + IN HSURF hsurf, + IN HDEV hdev, + IN FLONG flHooks, + IN FLONG flSurface, + IN DHSURF dhsurf, + IN VOID *pvScan0, + IN LONG lDelta, + IN VOID *pvReserved); + +WIN32KAPI +VOID +DDKAPI +EngMovePointer( + IN SURFOBJ *pso, + IN LONG x, + IN LONG y, + IN RECTL *prcl); + +WIN32KAPI +int +DDKAPI +EngMulDiv( + IN int a, + IN int b, + IN int c); + +WIN32KAPI +VOID +DDKAPI +EngMultiByteToUnicodeN( + OUT LPWSTR UnicodeString, + IN ULONG MaxBytesInUnicodeString, + OUT PULONG BytesInUnicodeString, + IN PCHAR MultiByteString, + IN ULONG BytesInMultiByteString); + +WIN32KAPI +INT +DDKAPI +EngMultiByteToWideChar( + IN UINT CodePage, + OUT LPWSTR WideCharString, + IN INT BytesInWideCharString, + IN LPSTR MultiByteString, + IN INT BytesInMultiByteString); + +WIN32KAPI +BOOL +DDKAPI +EngPaint( + IN SURFOBJ *pso, + IN CLIPOBJ *pco, + IN BRUSHOBJ *pbo, + IN POINTL *pptlBrushOrg, + IN MIX mix); + +WIN32KAPI +BOOL +DDKAPI +EngPlgBlt( + IN SURFOBJ *psoTrg, + IN SURFOBJ *psoSrc, + IN SURFOBJ *psoMsk, + IN CLIPOBJ *pco, + IN XLATEOBJ *pxlo, + IN COLORADJUSTMENT *pca, + IN POINTL *pptlBrushOrg, + IN POINTFIX *pptfx, + IN RECTL *prcl, + IN POINTL *pptl, + IN ULONG iMode); + +WIN32KAPI +VOID +DDKAPI +EngProbeForRead( + IN PVOID Address, + IN ULONG Length, + IN ULONG Alignment); + +WIN32KAPI +VOID +DDKAPI +EngProbeForReadAndWrite( + IN PVOID Address, + IN ULONG Length, + IN ULONG Alignment); + +typedef enum _ENG_DEVICE_ATTRIBUTE { + QDA_RESERVED = 0, + QDA_ACCELERATION_LEVEL +} ENG_DEVICE_ATTRIBUTE; + +WIN32KAPI +BOOL +DDKAPI +EngQueryDeviceAttribute( + IN HDEV hdev, + IN ENG_DEVICE_ATTRIBUTE devAttr, + IN VOID *pvIn, + IN ULONG ulInSize, + OUT VOID *pvOut, + OUT ULONG ulOutSize); + +WIN32KAPI +LARGE_INTEGER +DDKAPI +EngQueryFileTimeStamp( + IN LPWSTR pwsz); + +WIN32KAPI +VOID +DDKAPI +EngQueryLocalTime( + OUT PENG_TIME_FIELDS ptf); + +WIN32KAPI +ULONG +DDKAPI +EngQueryPalette( + IN HPALETTE hPal, + OUT ULONG *piMode, + IN ULONG cColors, + OUT ULONG *pulColors); + +WIN32KAPI +VOID +DDKAPI +EngQueryPerformanceCounter( + OUT LONGLONG *pPerformanceCount); + +WIN32KAPI +VOID +DDKAPI +EngQueryPerformanceFrequency( + OUT LONGLONG *pFrequency); + +typedef enum _ENG_SYSTEM_ATTRIBUTE { + EngProcessorFeature = 1, + EngNumberOfProcessors, + EngOptimumAvailableUserMemory, + EngOptimumAvailableSystemMemory, +} ENG_SYSTEM_ATTRIBUTE; + +#define QSA_MMX 0x00000100 +#define QSA_SSE 0x00002000 +#define QSA_3DNOW 0x00004000 + +WIN32KAPI +BOOL +DDKAPI +EngQuerySystemAttribute( + IN ENG_SYSTEM_ATTRIBUTE CapNum, + OUT PDWORD pCapability); + +WIN32KAPI +LONG +DDKAPI +EngReadStateEvent( + IN PEVENT pEvent); + +WIN32KAPI +VOID +DDKAPI +EngReleaseSemaphore( + IN HSEMAPHORE hsem); + +WIN32KAPI +BOOL +DDKAPI +EngRestoreFloatingPointState( + IN VOID *pBuffer); + +WIN32KAPI +ULONG +DDKAPI +EngSaveFloatingPointState( + OUT VOID *pBuffer, + IN ULONG cjBufferSize); + +WIN32KAPI +HANDLE +DDKAPI +EngSecureMem( + IN PVOID Address, + IN ULONG Length); + +WIN32KAPI +LONG +DDKAPI +EngSetEvent( + IN PEVENT pEvent); + +WIN32KAPI +VOID +DDKAPI +EngSetLastError( + IN ULONG iError); + +WIN32KAPI +ULONG +DDKAPI +EngSetPointerShape( + IN SURFOBJ *pso, + IN SURFOBJ *psoMask, + IN SURFOBJ *psoColor, + IN XLATEOBJ *pxlo, + IN LONG xHot, + IN LONG yHot, + IN LONG x, + IN LONG y, + IN RECTL *prcl, + IN FLONG fl); + +WIN32KAPI +BOOL +DDKAPI +EngSetPointerTag( + IN HDEV hdev, + IN SURFOBJ *psoMask, + IN SURFOBJ *psoColor, + IN XLATEOBJ *pxlo, + IN FLONG fl); + +WIN32KAPI +DWORD +DDKAPI +EngSetPrinterData( + IN HANDLE hPrinter, + IN LPWSTR pType, + IN DWORD dwType, + IN LPBYTE lpbPrinterData, + IN DWORD cjPrinterData); + +typedef int DDKCDECLAPI (*SORTCOMP)(const void *pv1, const void *pv2); + +WIN32KAPI +VOID +DDKAPI +EngSort( + IN OUT PBYTE pjBuf, + IN ULONG c, + IN ULONG cjElem, + IN SORTCOMP pfnComp); + +WIN32KAPI +BOOL +DDKAPI +EngStretchBlt( + IN SURFOBJ *psoDest, + IN SURFOBJ *psoSrc, + IN SURFOBJ *psoMask, + IN CLIPOBJ *pco, + IN XLATEOBJ *pxlo, + IN COLORADJUSTMENT *pca, + IN POINTL pptlHTOrg, + IN RECTL *prclDest, + IN RECTL *prclSrc, + IN POINTL *pptlMask, + IN ULONG iMode); + +WIN32KAPI +BOOL +DDKAPI +EngStretchBltROP( + IN SURFOBJ *psoDest, + IN SURFOBJ *psoSrc, + IN SURFOBJ *psoMask, + IN CLIPOBJ *pco, + IN XLATEOBJ *pxlo, + IN COLORADJUSTMENT *pca, + IN POINTL *pptlHTOrg, + IN RECTL *prclDest, + IN RECTL *prclSrc, + IN POINTL *pptlMask, + IN ULONG iMode, + IN BRUSHOBJ *pbo, + IN DWORD rop4); + +WIN32KAPI +BOOL +DDKAPI +EngStrokeAndFillPath( + IN SURFOBJ *pso, + IN PATHOBJ *ppo, + IN CLIPOBJ *pco, + IN XFORMOBJ *pxo, + IN BRUSHOBJ *pboStroke, + IN LINEATTRS *plineattrs, + IN BRUSHOBJ *pboFill, + IN POINTL *pptlBrushOrg, + IN MIX mixFill, + IN FLONG flOptions); + +WIN32KAPI +BOOL +DDKAPI +EngStrokePath( + IN SURFOBJ *pso, + IN PATHOBJ *ppo, + IN CLIPOBJ *pco, + IN XFORMOBJ *pxo, + IN BRUSHOBJ *pbo, + IN POINTL *pptlBrushOrg, + IN LINEATTRS *plineattrs, + IN MIX mix); + +WIN32KAPI +BOOL +DDKAPI +EngTextOut( + IN SURFOBJ *pso, + IN STROBJ *pstro, + IN FONTOBJ *pfo, + IN CLIPOBJ *pco, + IN RECTL *prclExtra, + IN RECTL *prclOpaque, + IN BRUSHOBJ *pboFore, + IN BRUSHOBJ *pboOpaque, + IN POINTL pptlOrg, + IN MIX mix); + +WIN32KAPI +BOOL +DDKAPI +EngTransparentBlt( + IN SURFOBJ *psoDst, + IN SURFOBJ *psoSrc, + IN CLIPOBJ *pco, + IN XLATEOBJ *pxlo, + IN RECTL *prclDst, + IN RECTL *prclSrc, + IN ULONG iTransColor, + IN ULONG ulReserved); + +WIN32KAPI +VOID +DDKAPI +EngUnicodeToMultiByteN( + OUT PCHAR MultiByteString, + IN ULONG MaxBytesInMultiByteString, + OUT PULONG BytesInMultiByteString, + IN PWSTR UnicodeString, + IN ULONG BytesInUnicodeString); + +WIN32KAPI +VOID +DDKAPI +EngUnloadImage( + IN HANDLE hModule); + +WIN32KAPI +BOOL +DDKAPI +EngUnlockDirectDrawSurface( + IN PDD_SURFACE_LOCAL pSurface); + +WIN32KAPI +BOOL +DDKAPI +EngUnlockDriverObj( + IN HDRVOBJ hdo); + +WIN32KAPI +VOID +DDKAPI +EngUnlockSurface( + IN SURFOBJ *pso); + +WIN32KAPI +BOOL +DDKAPI +EngUnmapEvent( + IN PEVENT pEvent); + +WIN32KAPI +BOOL +DDKAPI +EngUnmapFile( + IN ULONG_PTR iFile); + +WIN32KAPI +VOID +DDKAPI +EngUnmapFontFile( + ULONG_PTR iFile); + +WIN32KAPI +VOID +DDKAPI +EngUnmapFontFileFD( + IN ULONG_PTR iFile); + +WIN32KAPI +VOID +DDKAPI +EngUnsecureMem( + IN HANDLE hSecure); + +WIN32KAPI +BOOL +DDKAPI +EngWaitForSingleObject( + IN PEVENT pEvent, + IN PLARGE_INTEGER pTimeOut); + +WIN32KAPI +INT +DDKAPI +EngWideCharToMultiByte( + IN UINT CodePage, + IN LPWSTR WideCharString, + IN INT BytesInWideCharString, + OUT LPSTR MultiByteString, + IN INT BytesInMultiByteString); + +WIN32KAPI +BOOL +DDKAPI +EngWritePrinter( + IN HANDLE hPrinter, + IN LPVOID pBuf, + IN DWORD cbBuf, + OUT LPDWORD pcWritten); + +WIN32KAPI +VOID +DDKAPI +FLOATOBJ_Add( + IN OUT PFLOATOBJ pf, + IN PFLOATOBJ pf1); + +WIN32KAPI +VOID +DDKAPI +FLOATOBJ_AddFloat( + IN OUT PFLOATOBJ pf, + IN FLOATL f); + +WIN32KAPI +VOID +DDKAPI +FLOATOBJ_AddLong( + IN OUT PFLOATOBJ pf, + IN LONG l); + +WIN32KAPI +VOID +DDKAPI +FLOATOBJ_Div( + IN OUT PFLOATOBJ pf, + IN PFLOATOBJ pf1); + +WIN32KAPI +VOID +DDKAPI +FLOATOBJ_DivFloat( + IN OUT PFLOATOBJ pf, + IN FLOATL f); + +WIN32KAPI +VOID +DDKAPI +FLOATOBJ_DivLong( + IN OUT PFLOATOBJ pf, + IN LONG l); + +WIN32KAPI +BOOL +DDKAPI +FLOATOBJ_Equal( + IN PFLOATOBJ pf, + IN PFLOATOBJ pf1); + +WIN32KAPI +BOOL +DDKAPI +FLOATOBJ_EqualLong( + IN PFLOATOBJ pf, + IN LONG l); + +WIN32KAPI +LONG +DDKAPI +FLOATOBJ_GetFloat( + IN PFLOATOBJ pf); + +WIN32KAPI +LONG +DDKAPI +FLOATOBJ_GetLong( + IN PFLOATOBJ pf); + +WIN32KAPI +BOOL +DDKAPI +FLOATOBJ_GreaterThan( + IN PFLOATOBJ pf, + IN PFLOATOBJ pf1); + +WIN32KAPI +BOOL +DDKAPI +FLOATOBJ_GreaterThanLong( + IN PFLOATOBJ pf, + IN LONG l); + +WIN32KAPI +BOOL +DDKAPI +FLOATOBJ_LessThan( + IN PFLOATOBJ pf, + IN PFLOATOBJ pf1); + +WIN32KAPI +BOOL +DDKAPI +FLOATOBJ_LessThanLong( + IN PFLOATOBJ pf, + IN LONG l); + +WIN32KAPI +VOID +DDKAPI +FLOATOBJ_Mul( + IN OUT PFLOATOBJ pf, + IN PFLOATOBJ pf1); + +WIN32KAPI +VOID +DDKAPI +FLOATOBJ_MulFloat( + IN OUT PFLOATOBJ pf, + IN FLOATL f); + +WIN32KAPI +VOID +DDKAPI +FLOATOBJ_MulLong( + IN OUT PFLOATOBJ pf, + IN LONG l); + +WIN32KAPI +VOID +DDKAPI +FLOATOBJ_Neg( + IN OUT PFLOATOBJ pf); + +WIN32KAPI +VOID +DDKAPI +FLOATOBJ_SetFloat( + OUT PFLOATOBJ pf, + IN FLOATL f); + +WIN32KAPI +VOID +DDKAPI +FLOATOBJ_SetLong( + OUT PFLOATOBJ pf, + IN LONG l); + +WIN32KAPI +VOID +DDKAPI +FLOATOBJ_Sub( + IN OUT PFLOATOBJ pf, + IN PFLOATOBJ pf1); + +WIN32KAPI +VOID +DDKAPI +FLOATOBJ_SubFloat( + IN OUT PFLOATOBJ pf, + IN FLOATL f); + +WIN32KAPI +VOID +DDKAPI +FLOATOBJ_SubLong( + IN OUT PFLOATOBJ pf, + IN LONG l); + +WIN32KAPI +ULONG +DDKAPI +FONTOBJ_cGetAllGlyphHandles( + IN FONTOBJ *pfo, + OUT HGLYPH *phg); + +WIN32KAPI +ULONG +DDKAPI +FONTOBJ_cGetGlyphs( + IN FONTOBJ *pfo, + IN ULONG iMode, + IN ULONG cGlyph, + IN HGLYPH *phg, + OUT PVOID **ppvGlyph); + +WIN32KAPI +FD_GLYPHSET* +DDKAPI +FONTOBJ_pfdg( + IN FONTOBJ *pfo); + +WIN32KAPI +IFIMETRICS* +DDKAPI +FONTOBJ_pifi( + IN FONTOBJ *pfo); + +WIN32KAPI +PBYTE +DDKAPI +FONTOBJ_pjOpenTypeTablePointer( + IN FONTOBJ *pfo, + IN ULONG ulTag, + OUT ULONG *pcjTable); + +WIN32KAPI +PFD_GLYPHATTR +DDKAPI +FONTOBJ_pQueryGlyphAttrs( + IN FONTOBJ *pfo, + IN ULONG iMode); + +WIN32KAPI +PVOID +DDKAPI +FONTOBJ_pvTrueTypeFontFile( + IN FONTOBJ *pfo, + OUT ULONG *pcjFile); + +WIN32KAPI +LPWSTR +DDKAPI +FONTOBJ_pwszFontFilePaths( + IN FONTOBJ *pfo, + OUT ULONG *pcwc); + +WIN32KAPI +XFORMOBJ* +DDKAPI +FONTOBJ_pxoGetXform( + IN FONTOBJ *pfo); + +WIN32KAPI +VOID +DDKAPI +FONTOBJ_vGetInfo( + IN FONTOBJ *pfo, + IN ULONG cjSize, + OUT FONTINFO *pfi); + +WIN32KAPI +FLATPTR +DDKAPI +HeapVidMemAllocAligned( + IN LPVIDMEM lpVidMem, + IN DWORD dwWidth, + IN DWORD dwHeight, + IN LPSURFACEALIGNMENT lpAlignment, + OUT LPLONG lpNewPitch); + +WIN32KAPI +LONG +DDKAPI +HT_ComputeRGBGammaTable( + IN USHORT GammaTableEntries, + IN USHORT GammaTableType, + IN USHORT RedGamma, + IN USHORT GreenGamma, + IN USHORT BlueGamma, + OUT LPBYTE pGammaTable); + +WIN32KAPI +LONG +DDKAPI +HT_Get8BPPFormatPalette( + OUT LPPALETTEENTRY pPaletteEntry, + IN USHORT RedGamma, + IN USHORT GreenGamma, + IN USHORT BlueGamma); + +WIN32KAPI +LONG +DDKAPI +HT_Get8BPPMaskPalette( + IN OUT LPPALETTEENTRY pPaletteEntry, + IN BOOL Use8BPPMaskPal, + IN BYTE CMYMask, + IN USHORT RedGamma, + IN USHORT GreenGamma, + IN USHORT BlueGamma); + +WIN32KAPI +LONG +DDKAPI +HTUI_DeviceColorAdjustment( + IN LPSTR pDeviceName, + OUT PDEVHTADJDATA pDevHTAdjData); + +WIN32KAPI +ULONG +DDKAPI +PALOBJ_cGetColors( + IN PALOBJ *ppalo, + IN ULONG iStart, + IN ULONG cColors, + OUT ULONG *pulColors); + +WIN32KAPI +BOOL +DDKAPI +PATHOBJ_bCloseFigure( + IN PATHOBJ *ppo); + +WIN32KAPI +BOOL +DDKAPI +PATHOBJ_bEnum( + IN PATHOBJ *ppo, + OUT PATHDATA *ppd); + +WIN32KAPI +BOOL +DDKAPI +PATHOBJ_bEnumClipLines( + IN PATHOBJ *ppo, + IN ULONG cb, + OUT CLIPLINE *pcl); + +WIN32KAPI +BOOL +DDKAPI +PATHOBJ_bMoveTo( + IN PATHOBJ *ppo, + IN POINTFIX ptfx); + +WIN32KAPI +BOOL +DDKAPI +PATHOBJ_bPolyBezierTo( + IN PATHOBJ *ppo, + IN POINTFIX *pptfx, + IN ULONG cptfx); + +WIN32KAPI +BOOL +DDKAPI +PATHOBJ_bPolyLineTo( + IN PATHOBJ *ppo, + IN POINTFIX *pptfx, + IN ULONG cptfx); + +WIN32KAPI +VOID +DDKAPI +PATHOBJ_vEnumStart( + IN PATHOBJ *ppo); + +WIN32KAPI +VOID +DDKAPI +PATHOBJ_vEnumStartClipLines( + IN PATHOBJ *ppo, + IN CLIPOBJ *pco, + IN SURFOBJ *pso, + IN LINEATTRS *pla); + +WIN32KAPI +VOID +DDKAPI +PATHOBJ_vGetBounds( + IN PATHOBJ *ppo, + OUT PRECTFX prectfx); + +WIN32KAPI +BOOL +DDKAPI +STROBJ_bEnum( + IN STROBJ *pstro, + OUT ULONG *pc, + OUT PGLYPHPOS *ppgpos); + +WIN32KAPI +BOOL +DDKAPI +STROBJ_bEnumPositionsOnly( + IN STROBJ *pstro, + OUT ULONG *pc, + OUT PGLYPHOS **ppgpos); + +WIN32KAPI +BOOL +DDKAPI +STROBJ_bGetAdvanceWidths( + IN STROBJ *pso, + IN ULONG iFirst, + IN ULONG c, + OUT POINTQF *pptqD); + +WIN32KAPI +DWORD +DDKAPI +STROBJ_dwGetCodePage( + IN STROBJ *pstro); + +WIN32KAPI +FIX +DDKAPI +STROBJ_fxBreakExtra( + IN STROBJ *pstro); + +WIN32KAPI +FIX +DDKAPI +STROBJ_fxCharacterExtra( + IN STROBJ *pstro); + +WIN32KAPI +VOID +DDKAPI +STROBJ_vEnumStart( + IN STROBJ *pstro); + +WIN32KAPI +VOID +DDKAPI +VidMemFree( + IN LPVMEMHEAP pvmh, + IN FLATPTR ptr); + +WIN32KAPI +BOOL +DDKAPI +WNDOBJ_bEnum( + IN WNDOBJ *pwo, + IN ULONG cj, + OUT ULONG *pul); + +WIN32KAPI +ULONG +DDKAPI +WNDOBJ_cEnumStart( + IN WNDOBJ *pwo, + IN ULONG iType, + IN ULONG iDirection, + IN ULONG cLimit); + +WIN32KAPI +VOID +DDKAPI +WNDOBJ_vSetConsumer( + IN WNDOBJ *pwo, + IN PVOID pvConsumer); + +/* XFORMOBJ_bApplyXform.iMode constants */ +#define XF_LTOL 0L +#define XF_INV_LTOL 1L +#define XF_LTOFX 2L +#define XF_INV_FXTOL 3L + +WIN32KAPI +BOOL +DDKAPI +XFORMOBJ_bApplyXform( + IN XFORMOBJ *pxo, + IN ULONG iMode, + IN ULONG cPoints, + IN PVOID pvIn, + OUT PVOID pvOut); + +WIN32KAPI +ULONG +DDKAPI +XFORMOBJ_iGetFloatObjXform( + IN XFORMOBJ *pxo, + OUT FLOATOBJ_XFORM *pxfo); + +WIN32KAPI +ULONG +DDKAPI +XFORMOBJ_iGetXform( + IN XFORMOBJ *pxo, + OUT XFORML *pxform); + +/* XLATEOBJ_cGetPalette.iPal constants */ +#define XO_SRCPALETTE 1 +#define XO_DESTPALETTE 2 +#define XO_DESTDCPALETTE 3 +#define XO_SRCBITFIELDS 4 +#define XO_DESTBITFIELDS 5 + +WIN32KAPI +ULONG +DDKAPI +XLATEOBJ_cGetPalette( + IN XLATEOBJ *pxlo, + IN ULONG iPal, + IN ULONG cPal, + OUT ULONG *pPal); + +WIN32KAPI +HANDLE +DDKAPI +XLATEOBJ_hGetColorTransform( + IN XLATEOBJ *pxlo); + +WIN32KAPI +ULONG +DDKAPI +XLATEOBJ_iXlate( + IN XLATEOBJ *pxlo, + IN ULONG iColor); + +WIN32KAPI +ULONG* +DDKAPI +XLATEOBJ_piVector( + IN XLATEOBJ *pxlo); + + + +/* Graphics Driver Functions */ + +BOOL +DDKAPI +DrvAlphaBlend( + IN SURFOBJ *psoDest, + IN SURFOBJ *psoSrc, + IN CLIPOBJ *pco, + IN XLATEOBJ *pxlo, + IN RECTL *prclDest, + IN RECTL *prclSrc, + IN BLENDOBJ *pBlendObj); + +BOOL +DDKAPI +DrvAssertMode( + IN DHPDEV dhpdev, + IN BOOL bEnable); + +BOOL +DDKAPI +DrvBitBlt( + IN SURFOBJ *psoTrg, + IN SURFOBJ *psoSrc, + IN SURFOBJ *psoMask, + IN CLIPOBJ *pco, + IN XLATEOBJ *pxlo, + IN RECTL *prclTrg, + IN POINTL *pptlSrc, + IN POINTL *pptlMask, + IN BRUSHOBJ *pbo, + IN POINTL *pptlBrush, + IN ROP4 rop4); + +VOID +DDKAPI +DrvCompletePDEV( + IN DHPDEV dhpdev, + IN HDEV hdev); + +BOOL +DDKAPI +DrvCopyBits( + IN SURFOBJ *psoDest, + IN SURFOBJ *psoSrc, + IN CLIPOBJ *pco, + IN XLATEOBJ *pxlo, + IN RECTL *prclDest, + IN POINTL *pptlSrc); + +HBITMAP +DDKAPI +DrvCreateDeviceBitmap( + IN DHPDEV dhpdev, + IN SIZEL sizl, + IN ULONG iFormat); + +VOID +DDKAPI +DrvDeleteDeviceBitmap( + IN DHSURF dhsurf); + +HBITMAP +DDKAPI +DrvDeriveSurface( + DD_DIRECTDRAW_GLOBAL *pDirectDraw, + DD_SURFACE_LOCAL *pSurface); + +LONG +DDKAPI +DrvDescribePixelFormat( + IN DHPDEV dhpdev, + IN LONG iPixelFormat, + IN ULONG cjpfd, + OUT PIXELFORMATDESCRIPTOR *ppfd); + +VOID +DDKAPI +DrvDestroyFont( + IN FONTOBJ *pfo); + +VOID +DDKAPI +DrvDisableDriver( + VOID); + +VOID +DDKAPI +DrvDisablePDEV( + IN DHPDEV dhpdev); + +VOID +DDKAPI +DrvDisableSurface( + IN DHPDEV dhpdev); + +#define DM_DEFAULT 0x00000001 +#define DM_MONOCHROME 0x00000002 + +ULONG +DDKAPI +DrvDitherColor( + IN DHPDEV dhpdev, + IN ULONG iMode, + IN ULONG rgb, + OUT ULONG *pul); + +ULONG +DDKAPI +DrvDrawEscape( + IN SURFOBJ *pso, + IN ULONG iEsc, + IN CLIPOBJ *pco, + IN RECTL *prcl, + IN ULONG cjIn, + IN PVOID pvIn); + +BOOL +DDKAPI +DrvEnableDriver( + IN ULONG iEngineVersion, + IN ULONG cj, + OUT DRVENABLEDATA *pded); + +DHPDEV +DDKAPI +DrvEnablePDEV( + IN DEVMODEW *pdm, + IN LPWSTR pwszLogAddress, + IN ULONG cPat, + OUT HSURF *phsurfPatterns, + IN ULONG cjCaps, + OUT ULONG *pdevcaps, + IN ULONG cjDevInfo, + OUT DEVINFO *pdi, + IN HDEV hdev, + IN LPWSTR pwszDeviceName, + IN HANDLE hDriver); + +HSURF +DDKAPI +DrvEnableSurface( + IN DHPDEV dhpdev); + +/* DrvEndDoc.fl constants */ +#define ED_ABORTDOC 0x00000001 + +BOOL +DDKAPI +DrvEndDoc( + IN SURFOBJ *pso, + IN FLONG fl); + +ULONG +DDKAPI +DrvEscape( + IN SURFOBJ *pso, + IN ULONG iEsc, + IN ULONG cjIn, + IN PVOID pvIn, + IN ULONG cjOut, + OUT PVOID pvOut); + +BOOL +DDKAPI +DrvFillPath( + IN SURFOBJ *pso, + IN PATHOBJ *ppo, + IN CLIPOBJ *pco, + IN BRUSHOBJ *pbo, + IN POINTL *pptlBrushOrg, + IN MIX mix, + IN FLONG flOptions); + +ULONG +DDKAPI +DrvFontManagement( + IN SURFOBJ *pso, + IN FONTOBJ *pfo, + IN ULONG iMode, + IN ULONG cjIn, + IN PVOID pvIn, + IN ULONG cjOut, + OUT PVOID pvOut); + +VOID +DDKAPI +DrvFree( + IN PVOID pv, + IN ULONG_PTR id); + +/* DrvGetGlyphMode return values */ +#define FO_HGLYPHS 0L +#define FO_GLYPHBITS 1L +#define FO_PATHOBJ 2L + +ULONG +DDKAPI +DrvGetGlyphMode( + IN DHPDEV dhpdev, + IN FONTOBJ *pfo); + +ULONG +DDKAPI +DrvGetModes( + IN HANDLE hDriver, + IN ULONG cjSize, + OUT DEVMODEW *pdm); + +PVOID +DDKAPI +DrvGetTrueTypeFile( + IN ULONG_PTR iFile, + IN ULONG *pcj); + +BOOL +DDKAPI +DrvGradientFill( + IN SURFOBJ *psoDest, + IN CLIPOBJ *pco, + IN XLATEOBJ *pxlo, + IN TRIVERTEX *pVertex, + IN ULONG nVertex, + IN PVOID pMesh, + IN ULONG nMesh, + IN RECTL *prclExtents, + IN POINTL *pptlDitherOrg, + IN ULONG ulMode); + +BOOL +DDKAPI +DrvIcmCheckBitmapBits( + IN DHPDEV dhpdev, + IN HANDLE hColorTransform, + IN SURFOBJ *pso, + OUT PBYTE paResults); + +HANDLE +DDKAPI +DrvIcmCreateColorTransform( + IN DHPDEV dhpdev, + IN LPLOGCOLORSPACEW pLogColorSpace, + IN PVOID pvSourceProfile, + IN ULONG cjSourceProfile, + IN PVOID pvDestProfile, + IN ULONG cjDestProfile, + IN PVOID pvTargetProfile, + IN ULONG cjTargetProfile, + IN DWORD dwReserved); + +BOOL +DDKAPI +DrvIcmDeleteColorTransform( + IN DHPDEV dhpdev, + IN HANDLE hcmXform); + +/* DrvIcmSetDeviceGammaRamp.iFormat constants */ +#define IGRF_RGB_256BYTES 0x00000000 +#define IGRF_RGB_256WORDS 0x00000001 + +BOOL +DDKAPI +DrvIcmSetDeviceGammaRamp( + IN DHPDEV dhpdev, + IN ULONG iFormat, + IN LPVOID lpRamp); + +BOOL +DDKAPI +DrvLineTo( + SURFOBJ *pso, + CLIPOBJ *pco, + BRUSHOBJ *pbo, + LONG x1, + LONG y1, + LONG x2, + LONG y2, + RECTL *prclBounds, + MIX mix); + +ULONG_PTR +DDKAPI +DrvLoadFontFile( + ULONG cFiles, + ULONG_PTR *piFile, + PVOID *ppvView, + ULONG *pcjView, + DESIGNVECTOR *pdv, + ULONG ulLangID, + ULONG ulFastCheckSum); + +VOID +DDKAPI +DrvMovePointer( + IN SURFOBJ *pso, + IN LONG x, + IN LONG y, + IN RECTL *prcl); + +BOOL +DDKAPI +DrvNextBand( + IN SURFOBJ *pso, + IN POINTL *pptl); + +VOID +DDKAPI +DrvNotify( + IN SURFOBJ *pso, + IN ULONG iType, + IN PVOID pvData); + +BOOL +DDKAPI +DrvOffset( + IN SURFOBJ *pso, + IN LONG x, + IN LONG y, + IN FLONG flReserved); + +BOOL +DDKAPI +DrvPaint( + IN SURFOBJ *pso, + IN CLIPOBJ *pco, + IN BRUSHOBJ *pbo, + IN POINTL *pptlBrushOrg, + IN MIX mix); + +BOOL +DDKAPI +DrvPlgBlt( + IN SURFOBJ *psoTrg, + IN SURFOBJ *psoSrc, + IN SURFOBJ *psoMsk, + IN CLIPOBJ *pco, + IN XLATEOBJ *pxlo, + IN COLORADJUSTMENT *pca, + IN POINTL *pptlBrushOrg, + IN POINTFIX *pptfx, + IN RECTL *prcl, + IN POINTL *pptl, + IN ULONG iMode); + +/* DrvQueryAdvanceWidths.iMode constants */ +#define QAW_GETWIDTHS 0 +#define QAW_GETEASYWIDTHS 1 + +BOOL +DDKAPI +DrvQueryAdvanceWidths( + IN DHPDEV dhpdev, + IN FONTOBJ *pfo, + IN ULONG iMode, + IN HGLYPH *phg, + OUT PVOID pvWidths, + IN ULONG cGlyphs); + +/* DrvQueryDeviceSupport.iType constants */ +#define QDS_CHECKJPEGFORMAT 0x00000000 +#define QDS_CHECKPNGFORMAT 0x00000001 + +BOOL +DDKAPI +DrvQueryDeviceSupport( + SURFOBJ *pso, + XLATEOBJ *pxlo, + XFORMOBJ *pxo, + ULONG iType, + ULONG cjIn, + PVOID pvIn, + ULONG cjOut, + PVOID pvOut); + +/* DrvQueryDriverInfo.dwMode constants */ +#define DRVQUERY_USERMODE 0x00000001 + +BOOL +DDKAPI +DrvQueryDriverInfo( + DWORD dwMode, + PVOID pBuffer, + DWORD cbBuf, + PDWORD pcbNeeded); + +PIFIMETRICS +DDKAPI +DrvQueryFont( + IN DHPDEV dhpdev, + IN ULONG_PTR iFile, + IN ULONG iFace, + IN ULONG_PTR *pid); + +/* DrvQueryFontCaps.pulCaps constants */ +#define QC_OUTLINES 0x00000001 +#define QC_1BIT 0x00000002 +#define QC_4BIT 0x00000004 + +#define QC_FONTDRIVERCAPS (QC_OUTLINES | QC_1BIT | QC_4BIT) + +LONG +DDKAPI +DrvQueryFontCaps( + IN ULONG culCaps, + OUT ULONG *pulCaps); + +/* DrvQueryFontData.iMode constants */ +#define QFD_GLYPHANDBITMAP 1L +#define QFD_GLYPHANDOUTLINE 2L +#define QFD_MAXEXTENTS 3L +#define QFD_TT_GLYPHANDBITMAP 4L +#define QFD_TT_GRAY1_BITMAP 5L +#define QFD_TT_GRAY2_BITMAP 6L +#define QFD_TT_GRAY4_BITMAP 8L +#define QFD_TT_GRAY8_BITMAP 9L + +#define QFD_TT_MONO_BITMAP QFD_TT_GRAY1_BITMAP + +LONG +DDKAPI +DrvQueryFontData( + IN DHPDEV dhpdev, + IN FONTOBJ *pfo, + IN ULONG iMode, + IN HGLYPH hg, + IN OUT GLYPHDATA *pgd, + IN OUT PVOID pv, + IN ULONG cjSize); + +/* DrvQueryFontFile.ulMode constants */ +#define QFF_DESCRIPTION 0x00000001 +#define QFF_NUMFACES 0x00000002 + +LONG +DDKAPI +DrvQueryFontFile( + IN ULONG_PTR iFile, + IN ULONG ulMode, + IN ULONG cjBuf, + IN ULONG *pulBuf); + +/* DrvQueryFontTree.iMode constants */ +#define QFT_UNICODE 0L +#define QFT_LIGATURES 1L +#define QFT_KERNPAIRS 2L +#define QFT_GLYPHSET 3L + +PVOID +DDKAPI +DrvQueryFontTree( + IN DHPDEV dhpdev, + IN ULONG_PTR iFile, + IN ULONG iFace, + IN ULONG iMode, + IN ULONG_PTR *pid); + +PFD_GLYPHATTR +DDKAPI +DrvQueryGlyphAttrs( + IN FONTOBJ *pfo, + IN ULONG iMode); + +ULONG +DDKAPI +DrvQueryPerBandInfo( + IN SURFOBJ *pso, + IN OUT PERBANDINFO *pbi); + +/* DrvQueryTrueTypeOutline.bMetricsOnly constants */ +#define TTO_METRICS_ONLY 0x00000001 +#define TTO_QUBICS 0x00000002 +#define TTO_UNHINTED 0x00000004 + +LONG +DDKAPI +DrvQueryTrueTypeOutline( + IN DHPDEV dhpdev, + IN FONTOBJ *pfo, + IN HGLYPH hglyph, + IN BOOL bMetricsOnly, + IN GLYPHDATA *pgldt, + IN ULONG cjBuf, + OUT TTPOLYGONHEADER *ppoly); + +LONG +DDKAPI +DrvQueryTrueTypeTable( + IN ULONG_PTR iFile, + IN ULONG ulFont, + IN ULONG ulTag, + IN PTRDIFF dpStart, + IN ULONG cjBuf, + OUT BYTE *pjBuf, + OUT PBYTE *ppjTable, + OUT ULONG *pcjTable); + +/* DrvRealizeBrush.iHatch constants */ +#define RB_DITHERCOLOR 0x80000000L + +#define HS_DDI_MAX 6 + +BOOL +DDKAPI +DrvRealizeBrush( + IN BRUSHOBJ *pbo, + IN SURFOBJ *psoTarget, + IN SURFOBJ *psoPattern, + IN SURFOBJ *psoMask, + IN XLATEOBJ *pxlo, + IN ULONG iHatch); + +/* DrvResetDevice return values */ +#define DRD_SUCCESS 0 +#define DRD_ERROR 1 + +ULONG +DDKAPI +DrvResetDevice( + IN DHPDEV dhpdev, + IN PVOID Reserved); + +BOOL +DDKAPI +DrvResetPDEV( + DHPDEV dhpdevOld, + DHPDEV dhpdevNew); + +/* DrvSaveScreenBits.iMode constants */ +#define SS_SAVE 0x00000000 +#define SS_RESTORE 0x00000001 +#define SS_FREE 0x00000002 + +ULONG_PTR +DDKAPI +DrvSaveScreenBits( + IN SURFOBJ *pso, + IN ULONG iMode, + IN ULONG_PTR ident, + IN RECTL *prcl); + +BOOL +DDKAPI +DrvSendPage( + IN SURFOBJ *pso); + +BOOL +DDKAPI +DrvSetPalette( + IN DHPDEV dhpdev, + IN PALOBJ *ppalo, + IN FLONG fl, + IN ULONG iStart, + IN ULONG cColors); + +BOOL +DDKAPI +DrvSetPixelFormat( + IN SURFOBJ *pso, + IN LONG iPixelFormat, + IN HWND hwnd); + +/* DrvSetPointerShape return values */ +#define SPS_ERROR 0x00000000 +#define SPS_DECLINE 0x00000001 +#define SPS_ACCEPT_NOEXCLUDE 0x00000002 +#define SPS_ACCEPT_EXCLUDE 0x00000003 +#define SPS_ACCEPT_SYNCHRONOUS 0x00000004 + +/* DrvSetPointerShape.fl constants */ +#define SPS_CHANGE 0x00000001L +#define SPS_ASYNCCHANGE 0x00000002L +#define SPS_ANIMATESTART 0x00000004L +#define SPS_ANIMATEUPDATE 0x00000008L +#define SPS_ALPHA 0x00000010L +#define SPS_LENGTHMASK 0x00000F00L +#define SPS_FREQMASK 0x000FF000L + +ULONG +DDKAPI +DrvSetPointerShape( + IN SURFOBJ *pso, + IN SURFOBJ *psoMask, + IN SURFOBJ *psoColor, + IN XLATEOBJ *pxlo, + IN LONG xHot, + IN LONG yHot, + IN LONG x, + IN LONG y, + IN RECTL *prcl, + IN FLONG fl); + +BOOL +DDKAPI +DrvStartBanding( + IN SURFOBJ *pso, + IN POINTL *pptl); + +BOOL +DDKAPI +DrvStartDoc( + IN SURFOBJ *pso, + IN LPWSTR pwszDocName, + IN DWORD dwJobId); + +BOOL +DDKAPI +DrvStartPage( + IN SURFOBJ *pso); + +BOOL +DDKAPI +DrvStretchBlt( + IN SURFOBJ *psoDest, + IN SURFOBJ *psoSrc, + IN SURFOBJ *psoMask, + IN CLIPOBJ *pco, + IN XLATEOBJ *pxlo, + IN COLORADJUSTMENT *pca, + IN POINTL *pptlHTOrg, + IN RECTL *prclDest, + IN RECTL *prclSrc, + IN POINTL *pptlMask, + IN ULONG iMode); + +BOOL +DDKAPI +DrvStretchBltROP( + IN SURFOBJ *psoDest, + IN SURFOBJ *psoSrc, + IN SURFOBJ *psoMask, + IN CLIPOBJ *pco, + IN XLATEOBJ *pxlo, + IN COLORADJUSTMENT *pca, + IN POINTL *pptlHTOrg, + IN RECTL *prclDest, + IN RECTL *prclSrc, + IN POINTL *pptlMask, + IN ULONG iMode, + IN BRUSHOBJ *pbo, + IN DWORD rop4); + +BOOL +DDKAPI +DrvStrokeAndFillPath( + IN SURFOBJ *pso, + IN PATHOBJ *ppo, + IN CLIPOBJ *pco, + IN XFORMOBJ *pxo, + IN BRUSHOBJ *pboStroke, + IN LINEATTRS *plineattrs, + IN BRUSHOBJ *pboFill, + IN POINTL *pptlBrushOrg, + IN MIX mixFill, + IN FLONG flOptions); + +BOOL +DDKAPI +DrvStrokePath( + IN SURFOBJ *pso, + IN PATHOBJ *ppo, + IN CLIPOBJ *pco, + IN XFORMOBJ *pxo, + IN BRUSHOBJ *pbo, + IN POINTL *pptlBrushOrg, + IN LINEATTRS *plineattrs, + IN MIX mix); + +BOOL +DDKAPI +DrvSwapBuffers( + IN SURFOBJ *pso, + IN WNDOBJ *pwo); + +VOID +DDKAPI +DrvSynchronize( + IN DHPDEV dhpdev, + IN RECTL *prcl); + +/* DrvSynchronizeSurface.fl constants */ +#define DSS_TIMER_EVENT 0x00000001 +#define DSS_FLUSH_EVENT 0x00000002 + +VOID +DDKAPI +DrvSynchronizeSurface( + IN SURFOBJ *pso, + IN RECTL *prcl, + IN FLONG fl); + +BOOL +DDKAPI +DrvTextOut( + IN SURFOBJ *pso, + IN STROBJ *pstro, + IN FONTOBJ *pfo, + IN CLIPOBJ *pco, + IN RECTL *prclExtra, + IN RECTL *prclOpaque, + IN BRUSHOBJ *pboFore, + IN BRUSHOBJ *pboOpaque, + IN POINTL *pptlOrg, + IN MIX mix); + +BOOL +DDKAPI +DrvTransparentBlt( + IN SURFOBJ *psoDst, + IN SURFOBJ *psoSrc, + IN CLIPOBJ *pco, + IN XLATEOBJ *pxlo, + IN RECTL *prclDst, + IN RECTL *prclSrc, + IN ULONG iTransColor, + IN ULONG ulReserved); + +BOOL +DDKAPI +DrvUnloadFontFile( + IN ULONG_PTR iFile); + +/* WNDOBJCHANGEPROC.fl constants */ +#define WOC_RGN_CLIENT_DELTA 0x00000001 +#define WOC_RGN_CLIENT 0x00000002 +#define WOC_RGN_SURFACE_DELTA 0x00000004 +#define WOC_RGN_SURFACE 0x00000008 +#define WOC_CHANGED 0x00000010 +#define WOC_DELETE 0x00000020 +#define WOC_DRAWN 0x00000040 +#define WOC_SPRITE_OVERLAP 0x00000080 +#define WOC_SPRITE_NO_OVERLAP 0x00000100 + +typedef VOID DDKAPI +(CALLBACK * WNDOBJCHANGEPROC)( + WNDOBJ *pwo, + FLONG fl); + + +typedef BOOL DDKAPI +(*PFN_DrvAlphaBlend)( + IN SURFOBJ *psoDest, + IN SURFOBJ *psoSrc, + IN CLIPOBJ *pco, + IN XLATEOBJ *pxlo, + IN RECTL *prclDest, + IN RECTL *prclSrc, + IN BLENDOBJ *pBlendObj); + +typedef BOOL DDKAPI +(*PFN_DrvAssertMode)( + IN DHPDEV dhpdev, + IN BOOL bEnable); + +typedef BOOL DDKAPI +(*PFN_DrvBitBlt)( + IN SURFOBJ *psoTrg, + IN SURFOBJ *psoSrc, + IN SURFOBJ *psoMask, + IN CLIPOBJ *pco, + IN XLATEOBJ *pxlo, + IN RECTL *prclTrg, + IN POINTL *pptlSrc, + IN POINTL *pptlMask, + IN BRUSHOBJ *pbo, + IN POINTL *pptlBrush, + IN ROP4 rop4); + +typedef VOID DDKAPI +(*PFN_DrvCompletePDEV)( + IN DHPDEV dhpdev, + IN HDEV hdev); + +typedef BOOL DDKAPI +(*PFN_DrvCopyBits)( + IN SURFOBJ *psoDest, + IN SURFOBJ *psoSrc, + IN CLIPOBJ *pco, + IN XLATEOBJ *pxlo, + IN RECTL *prclDest, + IN POINTL *pptlSrc); + +typedef HBITMAP DDKAPI +(*PFN_DrvCreateDeviceBitmap)( + IN DHPDEV dhpdev, + IN SIZEL sizl, + IN ULONG iFormat); + +typedef VOID DDKAPI +(*PFN_DrvDeleteDeviceBitmap)( + IN DHSURF dhsurf); + +typedef HBITMAP DDKAPI +(*PFN_DrvDeriveSurface)( + DD_DIRECTDRAW_GLOBAL *pDirectDraw, + DD_SURFACE_LOCAL *pSurface); + +typedef LONG DDKAPI +(*PFN_DrvDescribePixelFormat)( + IN DHPDEV dhpdev, + IN LONG iPixelFormat, + IN ULONG cjpfd, + OUT PIXELFORMATDESCRIPTOR *ppfd); + +typedef VOID DDKAPI +(*PFN_DrvDestroyFont)( + IN FONTOBJ *pfo); + +typedef VOID DDKAPI +(*PFN_DrvDisableDriver)( + VOID); + +typedef VOID DDKAPI +(*PFN_DrvDisablePDEV)( + IN DHPDEV dhpdev); + +typedef VOID DDKAPI +(*PFN_DrvDisableSurface)( + IN DHPDEV dhpdev); + +typedef ULONG DDKAPI +(*PFN_DrvDitherColor)( + IN DHPDEV dhpdev, + IN ULONG iMode, + IN ULONG rgb, + OUT ULONG *pul); + +typedef ULONG DDKAPI +(*PFN_DrvDrawEscape)( + IN SURFOBJ *pso, + IN ULONG iEsc, + IN CLIPOBJ *pco, + IN RECTL *prcl, + IN ULONG cjIn, + IN PVOID pvIn); + +typedef BOOL DDKAPI +(*PFN_DrvEnableDriver)( + IN ULONG iEngineVersion, + IN ULONG cj, + OUT DRVENABLEDATA *pded); +#if 0 +typedef DHPDEV DDKAPI +(*PFN_DrvEnablePDEV)( + IN DEVMODEW *pdm, + IN LPWSTR pwszLogAddress, + IN ULONG cPat, + OUT HSURF *phsurfPatterns, + IN ULONG cjCaps, + OUT ULONG *pdevcaps, + IN ULONG cjDevInfo, + OUT DEVINFO *pdi, + IN HDEV hdev, + IN LPWSTR pwszDeviceName, + IN HANDLE hDriver); +#endif +typedef HSURF DDKAPI +(*PFN_DrvEnableSurface)( + IN DHPDEV dhpdev); + +typedef BOOL DDKAPI +(*PFN_DrvEndDoc)( + IN SURFOBJ *pso, + IN FLONG fl); + +typedef ULONG DDKAPI +(*PFN_DrvEscape)( + IN SURFOBJ *pso, + IN ULONG iEsc, + IN ULONG cjIn, + IN PVOID pvIn, + IN ULONG cjOut, + OUT PVOID pvOut); + +typedef BOOL DDKAPI +(*PFN_DrvFillPath)( + IN SURFOBJ *pso, + IN PATHOBJ *ppo, + IN CLIPOBJ *pco, + IN BRUSHOBJ *pbo, + IN POINTL *pptlBrushOrg, + IN MIX mix, + IN FLONG flOptions); + +typedef ULONG DDKAPI +(*PFN_DrvFontManagement)( + IN SURFOBJ *pso, + IN FONTOBJ *pfo, + IN ULONG iMode, + IN ULONG cjIn, + IN PVOID pvIn, + IN ULONG cjOut, + OUT PVOID pvOut); + +typedef VOID DDKAPI +(*PFN_DrvFree)( + IN PVOID pv, + IN ULONG_PTR id); + +typedef ULONG DDKAPI +(*PFN_DrvGetGlyphMode)( + IN DHPDEV dhpdev, + IN FONTOBJ *pfo); + +typedef ULONG DDKAPI +(*PFN_DrvGetModes)( + IN HANDLE hDriver, + IN ULONG cjSize, + OUT DEVMODEW *pdm); + +typedef PVOID DDKAPI +(*PFN_DrvGetTrueTypeFile)( + IN ULONG_PTR iFile, + IN ULONG *pcj); + +typedef BOOL DDKAPI +(*PFN_DrvGradientFill)( + IN SURFOBJ *psoDest, + IN CLIPOBJ *pco, + IN XLATEOBJ *pxlo, + IN TRIVERTEX *pVertex, + IN ULONG nVertex, + IN PVOID pMesh, + IN ULONG nMesh, + IN RECTL *prclExtents, + IN POINTL *pptlDitherOrg, + IN ULONG ulMode); + +typedef BOOL DDKAPI +(*PFN_DrvIcmCheckBitmapBits)( + IN DHPDEV dhpdev, + IN HANDLE hColorTransform, + IN SURFOBJ *pso, + OUT PBYTE paResults); + +typedef HANDLE DDKAPI +(*PFN_DrvIcmCreateColorTransform)( + IN DHPDEV dhpdev, + IN LPLOGCOLORSPACEW pLogColorSpace, + IN PVOID pvSourceProfile, + IN ULONG cjSourceProfile, + IN PVOID pvDestProfile, + IN ULONG cjDestProfile, + IN PVOID pvTargetProfile, + IN ULONG cjTargetProfile, + IN DWORD dwReserved); + +typedef BOOL DDKAPI +(*PFN_DrvIcmDeleteColorTransform)( + IN DHPDEV dhpdev, + IN HANDLE hcmXform); + +typedef BOOL DDKAPI +(*PFN_DrvIcmSetDeviceGammaRamp)( + IN DHPDEV dhpdev, + IN ULONG iFormat, + IN LPVOID lpRamp); + +typedef BOOL DDKAPI +(*PFN_DrvLineTo)( + SURFOBJ *pso, + CLIPOBJ *pco, + BRUSHOBJ *pbo, + LONG x1, + LONG y1, + LONG x2, + LONG y2, + RECTL *prclBounds, + MIX mix); + +typedef ULONG_PTR DDKAPI +(*PFN_DrvLoadFontFile)( + ULONG cFiles, + ULONG_PTR *piFile, + PVOID *ppvView, + ULONG *pcjView, + DESIGNVECTOR *pdv, + ULONG ulLangID, + ULONG ulFastCheckSum); + +typedef VOID DDKAPI +(*PFN_DrvMovePointer)( + IN SURFOBJ *pso, + IN LONG x, + IN LONG y, + IN RECTL *prcl); + +typedef BOOL DDKAPI +(*PFN_DrvNextBand)( + IN SURFOBJ *pso, + IN POINTL *pptl); + +typedef VOID DDKAPI +(*PFN_DrvNotify)( + IN SURFOBJ *pso, + IN ULONG iType, + IN PVOID pvData); + +typedef BOOL DDKAPI +(*PFN_DrvOffset)( + IN SURFOBJ *pso, + IN LONG x, + IN LONG y, + IN FLONG flReserved); + +typedef BOOL DDKAPI +(*PFN_DrvPaint)( + IN SURFOBJ *pso, + IN CLIPOBJ *pco, + IN BRUSHOBJ *pbo, + IN POINTL *pptlBrushOrg, + IN MIX mix); + +typedef BOOL DDKAPI +(*PFN_DrvPlgBlt)( + IN SURFOBJ *psoTrg, + IN SURFOBJ *psoSrc, + IN SURFOBJ *psoMsk, + IN CLIPOBJ *pco, + IN XLATEOBJ *pxlo, + IN COLORADJUSTMENT *pca, + IN POINTL *pptlBrushOrg, + IN POINTFIX *pptfx, + IN RECTL *prcl, + IN POINTL *pptl, + IN ULONG iMode); + +typedef BOOL DDKAPI +(*PFN_DrvQueryAdvanceWidths)( + IN DHPDEV dhpdev, + IN FONTOBJ *pfo, + IN ULONG iMode, + IN HGLYPH *phg, + OUT PVOID pvWidths, + IN ULONG cGlyphs); + +typedef BOOL DDKAPI +(*PFN_DrvQueryDeviceSupport)( + SURFOBJ *pso, + XLATEOBJ *pxlo, + XFORMOBJ *pxo, + ULONG iType, + ULONG cjIn, + PVOID pvIn, + ULONG cjOut, + PVOID pvOut); + +typedef BOOL DDKAPI +(*PFN_DrvQueryDriverInfo)( + DWORD dwMode, + PVOID pBuffer, + DWORD cbBuf, + PDWORD pcbNeeded); + +typedef PIFIMETRICS DDKAPI +(*PFN_DrvQueryFont)( + IN DHPDEV dhpdev, + IN ULONG_PTR iFile, + IN ULONG iFace, + IN ULONG_PTR *pid); + +typedef LONG DDKAPI +(*PFN_DrvQueryFontCaps)( + IN ULONG culCaps, + OUT ULONG *pulCaps); + +typedef LONG DDKAPI +(*PFN_DrvQueryFontData)( + IN DHPDEV dhpdev, + IN FONTOBJ *pfo, + IN ULONG iMode, + IN HGLYPH hg, + IN OUT GLYPHDATA *pgd, + IN OUT PVOID pv, + IN ULONG cjSize); + +typedef LONG DDKAPI +(*PFN_DrvQueryFontFile)( + IN ULONG_PTR iFile, + IN ULONG ulMode, + IN ULONG cjBuf, + IN ULONG *pulBuf); + +typedef PVOID DDKAPI +(*PFN_DrvQueryFontTree)( + IN DHPDEV dhpdev, + IN ULONG_PTR iFile, + IN ULONG iFace, + IN ULONG iMode, + IN ULONG_PTR *pid); + +typedef PFD_GLYPHATTR DDKAPI +(*PFN_DrvQueryGlyphAttrs)( + IN FONTOBJ *pfo, + IN ULONG iMode); + +typedef ULONG DDKAPI +(*PFN_DrvQueryPerBandInfo)( + IN SURFOBJ *pso, + IN OUT PERBANDINFO *pbi); + +typedef LONG DDKAPI +(*PFN_DrvQueryTrueTypeOutline)( + IN DHPDEV dhpdev, + IN FONTOBJ *pfo, + IN HGLYPH hglyph, + IN BOOL bMetricsOnly, + IN GLYPHDATA *pgldt, + IN ULONG cjBuf, + OUT TTPOLYGONHEADER *ppoly); + +typedef LONG DDKAPI +(*PFN_DrvQueryTrueTypeTable)( + IN ULONG_PTR iFile, + IN ULONG ulFont, + IN ULONG ulTag, + IN PTRDIFF dpStart, + IN ULONG cjBuf, + OUT BYTE *pjBuf, + OUT PBYTE *ppjTable, + OUT ULONG *pcjTable); + +typedef BOOL DDKAPI +(*PFN_DrvRealizeBrush)( + IN BRUSHOBJ *pbo, + IN SURFOBJ *psoTarget, + IN SURFOBJ *psoPattern, + IN SURFOBJ *psoMask, + IN XLATEOBJ *pxlo, + IN ULONG iHatch); + +typedef ULONG DDKAPI +(*PFN_DrvResetDevice)( + IN DHPDEV dhpdev, + IN PVOID Reserved); + +typedef BOOL DDKAPI +(*PFN_DrvResetPDEV)( + DHPDEV dhpdevOld, + DHPDEV dhpdevNew); + +typedef ULONG_PTR DDKAPI +(*PFN_DrvSaveScreenBits)( + IN SURFOBJ *pso, + IN ULONG iMode, + IN ULONG_PTR ident, + IN RECTL *prcl); + +typedef BOOL DDKAPI +(*PFN_DrvSendPage)( + IN SURFOBJ *pso); + +typedef BOOL DDKAPI +(*PFN_DrvSetPalette)( + IN DHPDEV dhpdev, + IN PALOBJ *ppalo, + IN FLONG fl, + IN ULONG iStart, + IN ULONG cColors); + +typedef BOOL DDKAPI +(*PFN_DrvSetPixelFormat)( + IN SURFOBJ *pso, + IN LONG iPixelFormat, + IN HWND hwnd); + +typedef ULONG DDKAPI +(*PFN_DrvSetPointerShape)( + IN SURFOBJ *pso, + IN SURFOBJ *psoMask, + IN SURFOBJ *psoColor, + IN XLATEOBJ *pxlo, + IN LONG xHot, + IN LONG yHot, + IN LONG x, + IN LONG y, + IN RECTL *prcl, + IN FLONG fl); + +typedef BOOL DDKAPI +(*PFN_DrvStartBanding)( + IN SURFOBJ *pso, + IN POINTL *pptl); + +typedef BOOL DDKAPI +(*PFN_DrvStartDoc)( + IN SURFOBJ *pso, + IN LPWSTR pwszDocName, + IN DWORD dwJobId); + +typedef BOOL DDKAPI +(*PFN_DrvStartPage)( + IN SURFOBJ *pso); + +typedef BOOL DDKAPI +(*PFN_DrvStretchBlt)( + IN SURFOBJ *psoDest, + IN SURFOBJ *psoSrc, + IN SURFOBJ *psoMask, + IN CLIPOBJ *pco, + IN XLATEOBJ *pxlo, + IN COLORADJUSTMENT *pca, + IN POINTL *pptlHTOrg, + IN RECTL *prclDest, + IN RECTL *prclSrc, + IN POINTL *pptlMask, + IN ULONG iMode); + +typedef BOOL DDKAPI +(*PFN_DrvStretchBltROP)( + IN SURFOBJ *psoDest, + IN SURFOBJ *psoSrc, + IN SURFOBJ *psoMask, + IN CLIPOBJ *pco, + IN XLATEOBJ *pxlo, + IN COLORADJUSTMENT *pca, + IN POINTL *pptlHTOrg, + IN RECTL *prclDest, + IN RECTL *prclSrc, + IN POINTL *pptlMask, + IN ULONG iMode, + IN BRUSHOBJ *pbo, + IN DWORD rop4); + +typedef BOOL DDKAPI +(*PFN_DrvStrokeAndFillPath)( + IN SURFOBJ *pso, + IN PATHOBJ *ppo, + IN CLIPOBJ *pco, + IN XFORMOBJ *pxo, + IN BRUSHOBJ *pboStroke, + IN LINEATTRS *plineattrs, + IN BRUSHOBJ *pboFill, + IN POINTL *pptlBrushOrg, + IN MIX mixFill, + IN FLONG flOptions); + +typedef BOOL DDKAPI +(*PFN_DrvStrokePath)( + IN SURFOBJ *pso, + IN PATHOBJ *ppo, + IN CLIPOBJ *pco, + IN XFORMOBJ *pxo, + IN BRUSHOBJ *pbo, + IN POINTL *pptlBrushOrg, + IN LINEATTRS *plineattrs, + IN MIX mix); + +typedef BOOL DDKAPI +(*PFN_DrvSwapBuffers)( + IN SURFOBJ *pso, + IN WNDOBJ *pwo); + +typedef VOID DDKAPI +(*PFN_DrvSynchronize)( + IN DHPDEV dhpdev, + IN RECTL *prcl); + +typedef VOID DDKAPI +(*PFN_DrvSynchronizeSurface)( + IN SURFOBJ *pso, + IN RECTL *prcl, + IN FLONG fl); + +typedef BOOL DDKAPI +(*PFN_DrvTextOut)( + IN SURFOBJ *pso, + IN STROBJ *pstro, + IN FONTOBJ *pfo, + IN CLIPOBJ *pco, + IN RECTL *prclExtra, + IN RECTL *prclOpaque, + IN BRUSHOBJ *pboFore, + IN BRUSHOBJ *pboOpaque, + IN POINTL *pptlOrg, + IN MIX mix); + +typedef BOOL DDKAPI +(*PFN_DrvTransparentBlt)( + IN SURFOBJ *psoDst, + IN SURFOBJ *psoSrc, + IN CLIPOBJ *pco, + IN XLATEOBJ *pxlo, + IN RECTL *prclDst, + IN RECTL *prclSrc, + IN ULONG iTransColor, + IN ULONG ulReserved); + +typedef BOOL DDKAPI +(*PFN_DrvUnloadFontFile)( + IN ULONG_PTR iFile); + + +WIN32KAPI +VOID +DDKAPI +DrvDisableDirectDraw( + IN DHPDEV dhpdev); + +WIN32KAPI +BOOL +DDKAPI +DrvEnableDirectDraw( + IN DHPDEV dhpdev, + OUT DD_CALLBACKS *pCallBacks, + OUT DD_SURFACECALLBACKS *pSurfaceCallBacks, + OUT DD_PALETTECALLBACKS *pPaletteCallBacks); + +WIN32KAPI +BOOL +DDKAPI +DrvGetDirectDrawInfo( + IN DHPDEV dhpdev, + OUT DD_HALINFO *pHalInfo, + OUT DWORD *pdwNumHeaps, + OUT VIDEOMEMORY *pvmList, + OUT DWORD *pdwNumFourCCCodes, + OUT DWORD *pdwFourCC); + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* defined __VIDEO_H */ + +#endif /* __WINDDI_H */ diff --git a/reactos/w32api/include/ddk/winddk.h b/reactos/w32api/include/ddk/winddk.h new file mode 100644 index 00000000000..b90fe12e818 --- /dev/null +++ b/reactos/w32api/include/ddk/winddk.h @@ -0,0 +1,9103 @@ +/* + * winddk.h + * + * Windows Device Driver Kit + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __WINDDK_H +#define __WINDDK_H + +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +/* +** Definitions specific to this Device Driver Kit +*/ +#define DDKAPI __attribute__((stdcall)) +#define DDKFASTAPI __attribute__((fastcall)) +#define DDKCDECLAPI __attribute__((cdecl)) + +#if defined(_NTOSKRNL_) +#ifndef NTOSAPI +#define NTOSAPI DECL_EXPORT +#endif +#define DECLARE_INTERNAL_OBJECT(x) typedef struct _##x; typedef struct _##x *P##x; +#define DECLARE_INTERNAL_OBJECT2(x,y) typedef struct _##x; typedef struct _##x *P##y; +#else +#ifndef NTOSAPI +#define NTOSAPI DECL_IMPORT +#endif +#define DECLARE_INTERNAL_OBJECT(x) struct _##x; typedef struct _##x *P##x; +#define DECLARE_INTERNAL_OBJECT2(x,y) struct _##x; typedef struct _##x *P##y; +#endif + +/* Pseudo modifiers for parameters */ +#define IN +#define OUT +#define OPTIONAL +#define UNALLIGNED + +#define CONST const +#define VOLATILE volatile + +#define RESTRICTED_POINTER +#define POINTER_ALIGNMENT + +#ifdef NONAMELESSUNION +# define _DDK_DUMMYUNION_MEMBER(name) DUMMYUNIONNAME.name +# define _DDK_DUMMYUNION_N_MEMBER(n, name) DUMMYUNIONNAME##n.name +#else +# define _DDK_DUMMYUNION_MEMBER(name) name +# define _DDK_DUMMYUNION_N_MEMBER(n, name) name +#endif + +/* +** Forward declarations +*/ + +struct _IRP; +struct _MDL; +struct _KAPC; +struct _KDPC; +struct _KPCR; +struct _KPRCB; +struct _KTSS; +struct _FILE_OBJECT; +struct _DMA_ADAPTER; +struct _DEVICE_OBJECT; +struct _DRIVER_OBJECT; +struct _SECTION_OBJECT; +struct _IO_STATUS_BLOCK; +struct _DEVICE_DESCRIPTION; +struct _SCATTER_GATHER_LIST; + +DECLARE_INTERNAL_OBJECT(ADAPTER_OBJECT) +DECLARE_INTERNAL_OBJECT(DMA_ADAPTER) +DECLARE_INTERNAL_OBJECT(IO_STATUS_BLOCK) +DECLARE_INTERNAL_OBJECT(SECTION_OBJECT) + +#if 1 +/* FIXME: Unknown definitions */ +struct _SET_PARTITION_INFORMATION_EX; +typedef ULONG WAIT_TYPE; +typedef HANDLE TRACEHANDLE; +typedef PVOID PWMILIB_CONTEXT; +typedef PVOID PSYSCTL_IRP_DISPOSITION; +typedef ULONG LOGICAL; +#endif + +/* +** Routines specific to this DDK +*/ + +#define TAG(_a, _b, _c, _d) (ULONG) \ + (((_a) << 0) + ((_b) << 8) + ((_c) << 16) + ((_d) << 24)) + +static __inline struct _KPCR * KeGetCurrentKPCR( + VOID) +{ + ULONG Value; + + __asm__ __volatile__ ("movl %%fs:0x18, %0\n\t" + : "=r" (Value) + : /* no inputs */ + ); + return (struct _KPCR *) Value; +} + +/* +** Simple structures +*/ + +typedef LONG KPRIORITY; +typedef UCHAR KIRQL, *PKIRQL; +typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK; +typedef ULONG KAFFINITY, *PKAFFINITY; +typedef CCHAR KPROCESSOR_MODE; + +typedef enum _MODE { + KernelMode, + UserMode, + MaximumMode +} MODE; + + +/* Structures not exposed to drivers */ +typedef struct _IO_TIMER *PIO_TIMER; +typedef struct _EPROCESS *PEPROCESS; +typedef struct _ETHREAD *PETHREAD; +typedef struct _KINTERRUPT *PKINTERRUPT; +typedef struct _OBJECT_TYPE *POBJECT_TYPE; +typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD; +typedef struct _COMPRESSED_DATA_INFO *PCOMPRESSED_DATA_INFO; +typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE; +typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE; +typedef struct _DRIVE_LAYOUT_INFORMATION *PDRIVE_LAYOUT_INFORMATION; +typedef struct _DRIVE_LAYOUT_INFORMATION_EX *PDRIVE_LAYOUT_INFORMATION_EX; + +/* Constants */ +#define MAXIMUM_PROCESSORS 32 + +#define MAXIMUM_WAIT_OBJECTS 64 + +#define METHOD_BUFFERED 0 +#define METHOD_IN_DIRECT 1 +#define METHOD_OUT_DIRECT 2 +#define METHOD_NEITHER 3 + +#define LOW_PRIORITY 0 +#define LOW_REALTIME_PRIORITY 16 +#define HIGH_PRIORITY 31 +#define MAXIMUM_PRIORITY 32 + +#define FILE_SUPERSEDED 0x00000000 +#define FILE_OPENED 0x00000001 +#define FILE_CREATED 0x00000002 +#define FILE_OVERWRITTEN 0x00000003 +#define FILE_EXISTS 0x00000004 +#define FILE_DOES_NOT_EXIST 0x00000005 + +/* also in winnt.h */ +#define FILE_LIST_DIRECTORY 0x00000001 +#define FILE_READ_DATA 0x00000001 +#define FILE_ADD_FILE 0x00000002 +#define FILE_WRITE_DATA 0x00000002 +#define FILE_ADD_SUBDIRECTORY 0x00000004 +#define FILE_APPEND_DATA 0x00000004 +#define FILE_CREATE_PIPE_INSTANCE 0x00000004 +#define FILE_READ_EA 0x00000008 +#define FILE_WRITE_EA 0x00000010 +#define FILE_EXECUTE 0x00000020 +#define FILE_TRAVERSE 0x00000020 +#define FILE_DELETE_CHILD 0x00000040 +#define FILE_READ_ATTRIBUTES 0x00000080 +#define FILE_WRITE_ATTRIBUTES 0x00000100 + +#define FILE_SHARE_READ 0x00000001 +#define FILE_SHARE_WRITE 0x00000002 +#define FILE_SHARE_DELETE 0x00000004 +#define FILE_SHARE_VALID_FLAGS 0x00000007 + +#define FILE_ATTRIBUTE_READONLY 0x00000001 +#define FILE_ATTRIBUTE_HIDDEN 0x00000002 +#define FILE_ATTRIBUTE_SYSTEM 0x00000004 +#define FILE_ATTRIBUTE_DIRECTORY 0x00000010 +#define FILE_ATTRIBUTE_ARCHIVE 0x00000020 +#define FILE_ATTRIBUTE_DEVICE 0x00000040 +#define FILE_ATTRIBUTE_NORMAL 0x00000080 +#define FILE_ATTRIBUTE_TEMPORARY 0x00000100 +#define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200 +#define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400 +#define FILE_ATTRIBUTE_COMPRESSED 0x00000800 +#define FILE_ATTRIBUTE_OFFLINE 0x00001000 +#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000 +#define FILE_ATTRIBUTE_ENCRYPTED 0x00004000 + +#define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7 +#define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7 + +#define FILE_COPY_STRUCTURED_STORAGE 0x00000041 +#define FILE_STRUCTURED_STORAGE 0x00000441 + +#define FILE_VALID_OPTION_FLAGS 0x00ffffff +#define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032 +#define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032 +#define FILE_VALID_SET_FLAGS 0x00000036 + +#define FILE_SUPERSEDE 0x00000000 +#define FILE_OPEN 0x00000001 +#define FILE_CREATE 0x00000002 +#define FILE_OPEN_IF 0x00000003 +#define FILE_OVERWRITE 0x00000004 +#define FILE_OVERWRITE_IF 0x00000005 +#define FILE_MAXIMUM_DISPOSITION 0x00000005 + +#define FILE_DIRECTORY_FILE 0x00000001 +#define FILE_WRITE_THROUGH 0x00000002 +#define FILE_SEQUENTIAL_ONLY 0x00000004 +#define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008 +#define FILE_SYNCHRONOUS_IO_ALERT 0x00000010 +#define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020 +#define FILE_NON_DIRECTORY_FILE 0x00000040 +#define FILE_CREATE_TREE_CONNECTION 0x00000080 +#define FILE_COMPLETE_IF_OPLOCKED 0x00000100 +#define FILE_NO_EA_KNOWLEDGE 0x00000200 +#define FILE_OPEN_FOR_RECOVERY 0x00000400 +#define FILE_RANDOM_ACCESS 0x00000800 +#define FILE_DELETE_ON_CLOSE 0x00001000 +#define FILE_OPEN_BY_FILE_ID 0x00002000 +#define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000 +#define FILE_NO_COMPRESSION 0x00008000 +#define FILE_RESERVE_OPFILTER 0x00100000 +#define FILE_OPEN_REPARSE_POINT 0x00200000 +#define FILE_OPEN_NO_RECALL 0x00400000 +#define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000 + +#define FILE_ANY_ACCESS 0x00000000 +#define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS +#define FILE_READ_ACCESS 0x00000001 +#define FILE_WRITE_ACCESS 0x00000002 + +#define FILE_ALL_ACCESS \ + (STANDARD_RIGHTS_REQUIRED | \ + SYNCHRONIZE | \ + 0x1FF) + +#define FILE_GENERIC_EXECUTE \ + (STANDARD_RIGHTS_EXECUTE | \ + FILE_READ_ATTRIBUTES | \ + FILE_EXECUTE | \ + SYNCHRONIZE) + +#define FILE_GENERIC_READ \ + (STANDARD_RIGHTS_READ | \ + FILE_READ_DATA | \ + FILE_READ_ATTRIBUTES | \ + FILE_READ_EA | \ + SYNCHRONIZE) + +#define FILE_GENERIC_WRITE \ + (STANDARD_RIGHTS_WRITE | \ + FILE_WRITE_DATA | \ + FILE_WRITE_ATTRIBUTES | \ + FILE_WRITE_EA | \ + FILE_APPEND_DATA | \ + SYNCHRONIZE) +/* end winnt.h */ + +#define DIRECTORY_QUERY (0x0001) +#define DIRECTORY_TRAVERSE (0x0002) +#define DIRECTORY_CREATE_OBJECT (0x0004) +#define DIRECTORY_CREATE_SUBDIRECTORY (0x0008) +#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF) + +/* Exported object types */ +extern NTOSAPI POBJECT_TYPE ExDesktopObjectType; +extern NTOSAPI POBJECT_TYPE ExEventObjectType; +extern NTOSAPI POBJECT_TYPE ExSemaphoreObjectType; +extern NTOSAPI POBJECT_TYPE ExWindowStationObjectType; +extern NTOSAPI POBJECT_TYPE IoAdapterObjectType; +extern NTOSAPI ULONG IoDeviceHandlerObjectSize; +extern NTOSAPI POBJECT_TYPE IoDeviceHandlerObjectType; +extern NTOSAPI POBJECT_TYPE IoDeviceObjectType; +extern NTOSAPI POBJECT_TYPE IoDriverObjectType; +extern NTOSAPI POBJECT_TYPE IoFileObjectType; +extern NTOSAPI POBJECT_TYPE LpcPortObjectType; +extern NTOSAPI POBJECT_TYPE MmSectionObjectType; +extern NTOSAPI POBJECT_TYPE SeTokenObjectType; + +extern NTOSAPI CCHAR KeNumberProcessors; +extern NTOSAPI PHAL_DISPATCH_TABLE HalDispatchTable; +extern NTOSAPI PHAL_PRIVATE_DISPATCH_TABLE HalPrivateDispatchTable; + + +/* +** IRP function codes +*/ + +#define IRP_MJ_CREATE 0x00 +#define IRP_MJ_CREATE_NAMED_PIPE 0x01 +#define IRP_MJ_CLOSE 0x02 +#define IRP_MJ_READ 0x03 +#define IRP_MJ_WRITE 0x04 +#define IRP_MJ_QUERY_INFORMATION 0x05 +#define IRP_MJ_SET_INFORMATION 0x06 +#define IRP_MJ_QUERY_EA 0x07 +#define IRP_MJ_SET_EA 0x08 +#define IRP_MJ_FLUSH_BUFFERS 0x09 +#define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a +#define IRP_MJ_SET_VOLUME_INFORMATION 0x0b +#define IRP_MJ_DIRECTORY_CONTROL 0x0c +#define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d +#define IRP_MJ_DEVICE_CONTROL 0x0e +#define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f +#define IRP_MJ_SCSI 0x0f +#define IRP_MJ_SHUTDOWN 0x10 +#define IRP_MJ_LOCK_CONTROL 0x11 +#define IRP_MJ_CLEANUP 0x12 +#define IRP_MJ_CREATE_MAILSLOT 0x13 +#define IRP_MJ_QUERY_SECURITY 0x14 +#define IRP_MJ_SET_SECURITY 0x15 +#define IRP_MJ_POWER 0x16 +#define IRP_MJ_SYSTEM_CONTROL 0x17 +#define IRP_MJ_DEVICE_CHANGE 0x18 +#define IRP_MJ_QUERY_QUOTA 0x19 +#define IRP_MJ_SET_QUOTA 0x1a +#define IRP_MJ_PNP 0x1b +#define IRP_MJ_PNP_POWER 0x1b +#define IRP_MJ_MAXIMUM_FUNCTION 0x1b + +#define IRP_MN_QUERY_DIRECTORY 0x01 +#define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02 + +#define IRP_MN_USER_FS_REQUEST 0x00 +#define IRP_MN_MOUNT_VOLUME 0x01 +#define IRP_MN_VERIFY_VOLUME 0x02 +#define IRP_MN_LOAD_FILE_SYSTEM 0x03 +#define IRP_MN_TRACK_LINK 0x04 +#define IRP_MN_KERNEL_CALL 0x04 + +#define IRP_MN_LOCK 0x01 +#define IRP_MN_UNLOCK_SINGLE 0x02 +#define IRP_MN_UNLOCK_ALL 0x03 +#define IRP_MN_UNLOCK_ALL_BY_KEY 0x04 + +#define IRP_MN_NORMAL 0x00 +#define IRP_MN_DPC 0x01 +#define IRP_MN_MDL 0x02 +#define IRP_MN_COMPLETE 0x04 +#define IRP_MN_COMPRESSED 0x08 + +#define IRP_MN_MDL_DPC (IRP_MN_MDL | IRP_MN_DPC) +#define IRP_MN_COMPLETE_MDL (IRP_MN_COMPLETE | IRP_MN_MDL) +#define IRP_MN_COMPLETE_MDL_DPC (IRP_MN_COMPLETE_MDL | IRP_MN_DPC) + +#define IRP_MN_SCSI_CLASS 0x01 + +#define IRP_MN_START_DEVICE 0x00 +#define IRP_MN_QUERY_REMOVE_DEVICE 0x01 +#define IRP_MN_REMOVE_DEVICE 0x02 +#define IRP_MN_CANCEL_REMOVE_DEVICE 0x03 +#define IRP_MN_STOP_DEVICE 0x04 +#define IRP_MN_QUERY_STOP_DEVICE 0x05 +#define IRP_MN_CANCEL_STOP_DEVICE 0x06 + +#define IRP_MN_QUERY_DEVICE_RELATIONS 0x07 +#define IRP_MN_QUERY_INTERFACE 0x08 +#define IRP_MN_QUERY_CAPABILITIES 0x09 +#define IRP_MN_QUERY_RESOURCES 0x0A +#define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B +#define IRP_MN_QUERY_DEVICE_TEXT 0x0C +#define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D + +#define IRP_MN_READ_CONFIG 0x0F +#define IRP_MN_WRITE_CONFIG 0x10 +#define IRP_MN_EJECT 0x11 +#define IRP_MN_SET_LOCK 0x12 +#define IRP_MN_QUERY_ID 0x13 +#define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14 +#define IRP_MN_QUERY_BUS_INFORMATION 0x15 +#define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16 +#define IRP_MN_SURPRISE_REMOVAL 0x17 +#define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18 + +#define IRP_MN_WAIT_WAKE 0x00 +#define IRP_MN_POWER_SEQUENCE 0x01 +#define IRP_MN_SET_POWER 0x02 +#define IRP_MN_QUERY_POWER 0x03 + +#define IRP_MN_QUERY_ALL_DATA 0x00 +#define IRP_MN_QUERY_SINGLE_INSTANCE 0x01 +#define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02 +#define IRP_MN_CHANGE_SINGLE_ITEM 0x03 +#define IRP_MN_ENABLE_EVENTS 0x04 +#define IRP_MN_DISABLE_EVENTS 0x05 +#define IRP_MN_ENABLE_COLLECTION 0x06 +#define IRP_MN_DISABLE_COLLECTION 0x07 +#define IRP_MN_REGINFO 0x08 +#define IRP_MN_EXECUTE_METHOD 0x09 + +#define IRP_MN_REGINFO_EX 0x0b + +typedef enum _IO_ALLOCATION_ACTION { + KeepObject = 1, + DeallocateObject, + DeallocateObjectKeepRegisters +} IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION; + +typedef IO_ALLOCATION_ACTION DDKAPI +(*PDRIVER_CONTROL)( + IN struct _DEVICE_OBJECT *DeviceObject, + IN struct _IRP *Irp, + IN PVOID MapRegisterBase, + IN PVOID Context); + +typedef VOID DDKAPI +(*PDRIVER_LIST_CONTROL)( + IN struct _DEVICE_OBJECT *DeviceObject, + IN struct _IRP *Irp, + IN struct _SCATTER_GATHER_LIST *ScatterGather, + IN PVOID Context); + +typedef NTSTATUS DDKAPI +(*PDRIVER_ADD_DEVICE)( + IN struct _DRIVER_OBJECT *DriverObject, + IN struct _DEVICE_OBJECT *PhysicalDeviceObject); + +typedef NTSTATUS DDKAPI +(*PIO_COMPLETION_ROUTINE)( + IN struct _DEVICE_OBJECT *DeviceObject, + IN struct _IRP *Irp, + IN PVOID Context); + +typedef VOID DDKAPI +(*PDRIVER_CANCEL)( + IN struct _DEVICE_OBJECT *DeviceObject, + IN struct _IRP *Irp); + +typedef VOID DDKAPI +(*PKDEFERRED_ROUTINE)( + IN struct _KDPC *Dpc, + IN PVOID DeferredContext, + IN PVOID SystemArgument1, + IN PVOID SystemArgument2); + +typedef NTSTATUS DDKAPI +(*PDRIVER_DISPATCH)( + IN struct _DEVICE_OBJECT *DeviceObject, + IN struct _IRP *Irp); + +typedef VOID DDKAPI +(*PIO_DPC_ROUTINE)( + IN struct _KDPC *Dpc, + IN struct _DEVICE_OBJECT *DeviceObject, + IN struct _IRP *Irp, + IN PVOID Context); + +typedef NTSTATUS DDKAPI +(*PMM_DLL_INITIALIZE)( + IN PUNICODE_STRING RegistryPath); + +typedef NTSTATUS DDKAPI +(*PMM_DLL_UNLOAD)( + VOID); + +typedef NTSTATUS DDKAPI +(*PDRIVER_ENTRY)( + IN struct _DRIVER_OBJECT *DriverObject, + IN PUNICODE_STRING RegistryPath); + +typedef NTSTATUS DDKAPI +(*PDRIVER_INITIALIZE)( + IN struct _DRIVER_OBJECT *DriverObject, + IN PUNICODE_STRING RegistryPath); + +typedef BOOLEAN DDKAPI +(*PKSERVICE_ROUTINE)( + IN struct _KINTERRUPT *Interrupt, + IN PVOID ServiceContext); + +typedef VOID DDKAPI +(*PIO_TIMER_ROUTINE)( + IN struct _DEVICE_OBJECT *DeviceObject, + IN PVOID Context); + +typedef VOID DDKAPI +(*PDRIVER_REINITIALIZE)( + IN struct _DRIVER_OBJECT *DriverObject, + IN PVOID Context, + IN ULONG Count); + +typedef NTSTATUS DDKAPI +(*PDRIVER_STARTIO)( + IN struct _DEVICE_OBJECT *DeviceObject, + IN struct _IRP *Irp); + +typedef BOOLEAN DDKAPI +(*PKSYNCHRONIZE_ROUTINE)( + IN PVOID SynchronizeContext); + +typedef VOID DDKAPI +(*PDRIVER_UNLOAD)( + IN struct _DRIVER_OBJECT *DriverObject); + + + +/* +** Plug and Play structures +*/ + +typedef VOID DDKAPI +(*PINTERFACE_REFERENCE)( + PVOID Context); + +typedef VOID DDKAPI +(*PINTERFACE_DEREFERENCE)( + PVOID Context); + +typedef BOOLEAN DDKAPI +(*PTRANSLATE_BUS_ADDRESS)( + IN PVOID Context, + IN PHYSICAL_ADDRESS BusAddress, + IN ULONG Length, + IN OUT PULONG AddressSpace, + OUT PPHYSICAL_ADDRESS TranslatedAddress); + +typedef struct _DMA_ADAPTER* DDKAPI +(*PGET_DMA_ADAPTER)( + IN PVOID Context, + IN struct _DEVICE_DESCRIPTION *DeviceDescriptor, + OUT PULONG NumberOfMapRegisters); + +typedef ULONG DDKAPI +(*PGET_SET_DEVICE_DATA)( + IN PVOID Context, + IN ULONG DataType, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +typedef union _POWER_STATE { + SYSTEM_POWER_STATE SystemState; + DEVICE_POWER_STATE DeviceState; +} POWER_STATE, *PPOWER_STATE; + +typedef enum _POWER_STATE_TYPE { + SystemPowerState, + DevicePowerState +} POWER_STATE_TYPE, *PPOWER_STATE_TYPE; + +typedef struct _BUS_INTERFACE_STANDARD { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PTRANSLATE_BUS_ADDRESS TranslateBusAddress; + PGET_DMA_ADAPTER GetDmaAdapter; + PGET_SET_DEVICE_DATA SetBusData; + PGET_SET_DEVICE_DATA GetBusData; +} BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD; + +typedef struct _DEVICE_CAPABILITIES { + USHORT Size; + USHORT Version; + ULONG DeviceD1 : 1; + ULONG DeviceD2 : 1; + ULONG LockSupported : 1; + ULONG EjectSupported : 1; + ULONG Removable : 1; + ULONG DockDevice : 1; + ULONG UniqueID : 1; + ULONG SilentInstall : 1; + ULONG RawDeviceOK : 1; + ULONG SurpriseRemovalOK : 1; + ULONG WakeFromD0 : 1; + ULONG WakeFromD1 : 1; + ULONG WakeFromD2 : 1; + ULONG WakeFromD3 : 1; + ULONG HardwareDisabled : 1; + ULONG NonDynamic : 1; + ULONG WarmEjectSupported : 1; + ULONG NoDisplayInUI : 1; + ULONG Reserved : 14; + ULONG Address; + ULONG UINumber; + DEVICE_POWER_STATE DeviceState[PowerSystemMaximum]; + SYSTEM_POWER_STATE SystemWake; + DEVICE_POWER_STATE DeviceWake; + ULONG D1Latency; + ULONG D2Latency; + ULONG D3Latency; +} DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES; + +typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION { + USHORT Version; + USHORT Size; + GUID Event; + GUID InterfaceClassGuid; + PUNICODE_STRING SymbolicLinkName; +} DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION; + +typedef struct _HWPROFILE_CHANGE_NOTIFICATION { + USHORT Version; + USHORT Size; + GUID Event; +} HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION; + +#undef INTERFACE + +typedef struct _INTERFACE { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; +} INTERFACE, *PINTERFACE; + +typedef struct _PLUGPLAY_NOTIFICATION_HEADER { + USHORT Version; + USHORT Size; + GUID Event; +} PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER; + +typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE; + +/* PNP_DEVICE_STATE */ + +#define PNP_DEVICE_DISABLED 0x00000001 +#define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002 +#define PNP_DEVICE_FAILED 0x00000004 +#define PNP_DEVICE_REMOVED 0x00000008 +#define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010 +#define PNP_DEVICE_NOT_DISABLEABLE 0x00000020 + +typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION { + USHORT Version; + USHORT Size; + GUID Event; + struct _FILE_OBJECT *FileObject; + LONG NameBufferOffset; + UCHAR CustomDataBuffer[1]; +} TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION; + +typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION { + USHORT Version; + USHORT Size; + GUID Event; + struct _FILE_OBJECT *FileObject; +} TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION; + +typedef enum _BUS_QUERY_ID_TYPE { + BusQueryDeviceID, + BusQueryHardwareIDs, + BusQueryCompatibleIDs, + BusQueryInstanceID, + BusQueryDeviceSerialNumber +} BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE; + +typedef enum _DEVICE_TEXT_TYPE { + DeviceTextDescription, + DeviceTextLocationInformation +} DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE; + +typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE { + DeviceUsageTypeUndefined, + DeviceUsageTypePaging, + DeviceUsageTypeHibernation, + DeviceUsageTypeDumpFile +} DEVICE_USAGE_NOTIFICATION_TYPE; + +typedef struct _POWER_SEQUENCE { + ULONG SequenceD1; + ULONG SequenceD2; + ULONG SequenceD3; +} POWER_SEQUENCE, *PPOWER_SEQUENCE; + +typedef enum { + DevicePropertyDeviceDescription, + DevicePropertyHardwareID, + DevicePropertyCompatibleIDs, + DevicePropertyBootConfiguration, + DevicePropertyBootConfigurationTranslated, + DevicePropertyClassName, + DevicePropertyClassGuid, + DevicePropertyDriverKeyName, + DevicePropertyManufacturer, + DevicePropertyFriendlyName, + DevicePropertyLocationInformation, + DevicePropertyPhysicalDeviceObjectName, + DevicePropertyBusTypeGuid, + DevicePropertyLegacyBusType, + DevicePropertyBusNumber, + DevicePropertyEnumeratorName, + DevicePropertyAddress, + DevicePropertyUINumber, + DevicePropertyInstallState, + DevicePropertyRemovalPolicy +} DEVICE_REGISTRY_PROPERTY; + +typedef enum _IO_NOTIFICATION_EVENT_CATEGORY { + EventCategoryReserved, + EventCategoryHardwareProfileChange, + EventCategoryDeviceInterfaceChange, + EventCategoryTargetDeviceChange +} IO_NOTIFICATION_EVENT_CATEGORY; + +#define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001 + +typedef NTSTATUS DDKAPI +(*PDRIVER_NOTIFICATION_CALLBACK_ROUTINE)( + IN PVOID NotificationStructure, + IN PVOID Context); + +typedef VOID DDKAPI +(*PDEVICE_CHANGE_COMPLETE_CALLBACK)( + IN PVOID Context); + + + +/* +** System structures +*/ + +#define SYMBOLIC_LINK_QUERY 0x0001 +#define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) + +/* also in winnt,h */ +#define DUPLICATE_CLOSE_SOURCE 0x00000001 +#define DUPLICATE_SAME_ACCESS 0x00000002 +#define DUPLICATE_SAME_ATTRIBUTES 0x00000004 +/* end winnt.h */ + +typedef struct _OBJECT_NAME_INFORMATION { + UNICODE_STRING Name; +} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION; + +typedef VOID DDKAPI +(*PIO_APC_ROUTINE)( + IN PVOID ApcContext, + IN PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG Reserved); + +typedef struct _IO_STATUS_BLOCK { + _ANONYMOUS_UNION union { + NTSTATUS Status; + PVOID Pointer; + } DUMMYUNIONNAME; + ULONG_PTR Information; +} IO_STATUS_BLOCK; + +typedef VOID DDKAPI +(*PKNORMAL_ROUTINE)( + IN PVOID NormalContext, + IN PVOID SystemArgument1, + IN PVOID SystemArgument2); + +typedef VOID DDKAPI +(*PKKERNEL_ROUTINE)( + IN struct _KAPC *Apc, + IN OUT PKNORMAL_ROUTINE *NormalRoutine, + IN OUT PVOID *NormalContext, + IN OUT PVOID *SystemArgument1, + IN OUT PVOID *SystemArgument2); + +typedef VOID DDKAPI +(*PKRUNDOWN_ROUTINE)( + IN struct _KAPC *Apc); + +typedef BOOLEAN DDKAPI +(*PKTRANSFER_ROUTINE)( + VOID); + +typedef struct _KAPC { + CSHORT Type; + CSHORT Size; + ULONG Spare0; + struct _KTHREAD *Thread; + LIST_ENTRY ApcListEntry; + PKKERNEL_ROUTINE KernelRoutine; + PKRUNDOWN_ROUTINE RundownRoutine; + PKNORMAL_ROUTINE NormalRoutine; + PVOID NormalContext; + PVOID SystemArgument1; + PVOID SystemArgument2; + CCHAR ApcStateIndex; + KPROCESSOR_MODE ApcMode; + BOOLEAN Inserted; +} KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC; + +typedef struct _KDEVICE_QUEUE { + CSHORT Type; + CSHORT Size; + LIST_ENTRY DeviceListHead; + KSPIN_LOCK Lock; + BOOLEAN Busy; +} KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE; + +typedef struct _KDEVICE_QUEUE_ENTRY { + LIST_ENTRY DeviceListEntry; + ULONG SortKey; + BOOLEAN Inserted; +} KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY, +*RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY; + +#define LOCK_QUEUE_WAIT 1 +#define LOCK_QUEUE_OWNER 2 + +typedef enum _KSPIN_LOCK_QUEUE_NUMBER { + LockQueueDispatcherLock, + LockQueueContextSwapLock, + LockQueuePfnLock, + LockQueueSystemSpaceLock, + LockQueueVacbLock, + LockQueueMasterLock, + LockQueueNonPagedPoolLock, + LockQueueIoCancelLock, + LockQueueWorkQueueLock, + LockQueueIoVpbLock, + LockQueueIoDatabaseLock, + LockQueueIoCompletionLock, + LockQueueNtfsStructLock, + LockQueueAfdWorkQueueLock, + LockQueueBcbLock, + LockQueueMaximumLock +} KSPIN_LOCK_QUEUE_NUMBER, *PKSPIN_LOCK_QUEUE_NUMBER; + +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 _KDPC { + CSHORT Type; + UCHAR Number; + UCHAR Importance; + LIST_ENTRY DpcListEntry; + PKDEFERRED_ROUTINE DeferredRoutine; + PVOID DeferredContext; + PVOID SystemArgument1; + PVOID SystemArgument2; + PULONG_PTR Lock; +} KDPC, *PKDPC, *RESTRICTED_POINTER PRKDPC; + +typedef struct _WAIT_CONTEXT_BLOCK { + KDEVICE_QUEUE_ENTRY WaitQueueEntry; + struct _DRIVER_CONTROL *DeviceRoutine; + PVOID DeviceContext; + ULONG NumberOfMapRegisters; + PVOID DeviceObject; + PVOID CurrentIrp; + PKDPC BufferChainingDpc; +} WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK; + +typedef struct _DISPATCHER_HEADER { + UCHAR Type; + UCHAR Absolute; + UCHAR Size; + UCHAR Inserted; + LONG SignalState; + LIST_ENTRY WaitListHead; +} DISPATCHER_HEADER, *PDISPATCHER_HEADER; + +typedef struct _KEVENT { + DISPATCHER_HEADER Header; +} KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT; + +typedef struct _KSEMAPHORE { + DISPATCHER_HEADER Header; + LONG Limit; +} KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE; + +typedef struct _FAST_MUTEX { + LONG Count; + struct _KTHREAD *Owner; + ULONG Contention; + KEVENT Event; + ULONG OldIrql; +} FAST_MUTEX, *PFAST_MUTEX; + +typedef struct _KTIMER { + DISPATCHER_HEADER Header; + ULARGE_INTEGER DueTime; + LIST_ENTRY TimerListEntry; + struct _KDPC *Dpc; + LONG Period; +} KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER; + +typedef struct _KMUTANT { + DISPATCHER_HEADER Header; + LIST_ENTRY MutantListEntry; + struct _KTHREAD *RESTRICTED_POINTER OwnerThread; + BOOLEAN Abandoned; + UCHAR ApcDisable; +} KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT, KMUTEX, *PKMUTEX, *RESTRICTED_POINTER PRKMUTEX; + +typedef enum _TIMER_TYPE { + NotificationTimer, + SynchronizationTimer +} TIMER_TYPE; + +#define EVENT_INCREMENT 1 +#define IO_NO_INCREMENT 0 +#define IO_CD_ROM_INCREMENT 1 +#define IO_DISK_INCREMENT 1 +#define IO_KEYBOARD_INCREMENT 6 +#define IO_MAILSLOT_INCREMENT 2 +#define IO_MOUSE_INCREMENT 6 +#define IO_NAMED_PIPE_INCREMENT 2 +#define IO_NETWORK_INCREMENT 2 +#define IO_PARALLEL_INCREMENT 1 +#define IO_SERIAL_INCREMENT 2 +#define IO_SOUND_INCREMENT 8 +#define IO_VIDEO_INCREMENT 1 +#define SEMAPHORE_INCREMENT 1 + +typedef struct _IRP { + CSHORT Type; + USHORT Size; + struct _MDL *MdlAddress; + ULONG Flags; + union { + struct _IRP *MasterIrp; + LONG IrpCount; + PVOID SystemBuffer; + } AssociatedIrp; + LIST_ENTRY ThreadListEntry; + IO_STATUS_BLOCK IoStatus; + KPROCESSOR_MODE RequestorMode; + BOOLEAN PendingReturned; + CHAR StackCount; + CHAR CurrentLocation; + BOOLEAN Cancel; + KIRQL CancelIrql; + CCHAR ApcEnvironment; + UCHAR AllocationFlags; + PIO_STATUS_BLOCK UserIosb; + PKEVENT UserEvent; + union { + struct { + PIO_APC_ROUTINE UserApcRoutine; + PVOID UserApcContext; + } AsynchronousParameters; + LARGE_INTEGER AllocationSize; + } Overlay; + PDRIVER_CANCEL CancelRoutine; + PVOID UserBuffer; + union { + struct { + _ANONYMOUS_UNION union { + KDEVICE_QUEUE_ENTRY DeviceQueueEntry; + _ANONYMOUS_STRUCT struct { + PVOID DriverContext[4]; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; + PETHREAD Thread; + PCHAR AuxiliaryBuffer; + _ANONYMOUS_STRUCT struct { + LIST_ENTRY ListEntry; + _ANONYMOUS_UNION union { + struct _IO_STACK_LOCATION *CurrentStackLocation; + ULONG PacketType; + } DUMMYUNIONNAME; + } DUMMYSTRUCTNAME; + struct _FILE_OBJECT *OriginalFileObject; + } Overlay; + KAPC Apc; + PVOID CompletionKey; + } Tail; +} IRP; +typedef struct _IRP *PIRP; + +/* IRP.Flags */ + +#define SL_FORCE_ACCESS_CHECK 0x01 +#define SL_OPEN_PAGING_FILE 0x02 +#define SL_OPEN_TARGET_DIRECTORY 0x04 +#define SL_CASE_SENSITIVE 0x80 + +#define SL_KEY_SPECIFIED 0x01 +#define SL_OVERRIDE_VERIFY_VOLUME 0x02 +#define SL_WRITE_THROUGH 0x04 +#define SL_FT_SEQUENTIAL_WRITE 0x08 + +#define SL_FAIL_IMMEDIATELY 0x01 +#define SL_EXCLUSIVE_LOCK 0x02 + +#define SL_RESTART_SCAN 0x01 +#define SL_RETURN_SINGLE_ENTRY 0x02 +#define SL_INDEX_SPECIFIED 0x04 + +#define SL_WATCH_TREE 0x01 + +#define SL_ALLOW_RAW_MOUNT 0x01 + +#define CTL_CODE(DeviceType, Function, Method, Access)( \ + ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) + +#define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16) + +enum +{ + IRP_NOCACHE = 0x1, + IRP_PAGING_IO = 0x2, + IRP_MOUNT_COMPLETION = 0x2, + IRP_SYNCHRONOUS_API = 0x4, + IRP_ASSOCIATED_IRP = 0x8, + IRP_BUFFERED_IO = 0x10, + IRP_DEALLOCATE_BUFFER = 0x20, + IRP_INPUT_OPERATION = 0x40, + IRP_SYNCHRONOUS_PAGING_IO = 0x40, + IRP_CREATE_OPERATION = 0x80, + IRP_READ_OPERATION = 0x100, + IRP_WRITE_OPERATION = 0x200, + IRP_CLOSE_OPERATION = 0x400, + IRP_DEFER_IO_COMPLETION = 0x800, + IRP_OB_QUERY_NAME = 0x1000, + IRP_HOLD_DEVICE_QUEUE = 0x2000, + IRP_RETRY_IO_COMPLETION = 0x4000 +}; + + +typedef struct _DRIVE_LAYOUT_INFORMATION_MBR { + ULONG Signature; +} DRIVE_LAYOUT_INFORMATION_MBR, *PDRIVE_LAYOUT_INFORMATION_MBR; + +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 _PARTITION_INFORMATION_MBR { + UCHAR PartitionType; + BOOLEAN BootIndicator; + BOOLEAN RecognizedPartition; + ULONG HiddenSectors; +} PARTITION_INFORMATION_MBR, *PPARTITION_INFORMATION_MBR; + + +typedef struct _BOOTDISK_INFORMATION { + LONGLONG BootPartitionOffset; + LONGLONG SystemPartitionOffset; + ULONG BootDeviceSignature; + ULONG SystemDeviceSignature; +} BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION; + +typedef struct _BOOTDISK_INFORMATION_EX { + LONGLONG BootPartitionOffset; + LONGLONG SystemPartitionOffset; + ULONG BootDeviceSignature; + ULONG SystemDeviceSignature; + GUID BootDeviceGuid; + GUID SystemDeviceGuid; + BOOLEAN BootDeviceIsGpt; + BOOLEAN SystemDeviceIsGpt; +} BOOTDISK_INFORMATION_EX, *PBOOTDISK_INFORMATION_EX; + +typedef struct _EISA_MEMORY_TYPE { + UCHAR ReadWrite : 1; + UCHAR Cached : 1; + UCHAR Reserved0 : 1; + UCHAR Type : 2; + UCHAR Shared : 1; + UCHAR Reserved1 : 1; + UCHAR MoreEntries : 1; +} EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE; + +typedef struct _EISA_MEMORY_CONFIGURATION { + EISA_MEMORY_TYPE ConfigurationByte; + UCHAR DataSize; + USHORT AddressLowWord; + UCHAR AddressHighByte; + USHORT MemorySize; +} EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION; + +typedef struct _EISA_IRQ_DESCRIPTOR { + UCHAR Interrupt : 4; + UCHAR Reserved : 1; + UCHAR LevelTriggered : 1; + UCHAR Shared : 1; + UCHAR MoreEntries : 1; +} EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR; + +typedef struct _EISA_IRQ_CONFIGURATION { + EISA_IRQ_DESCRIPTOR ConfigurationByte; + UCHAR Reserved; +} EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION; + +typedef struct _DMA_CONFIGURATION_BYTE0 { + UCHAR Channel : 3; + UCHAR Reserved : 3; + UCHAR Shared : 1; + UCHAR MoreEntries : 1; +} DMA_CONFIGURATION_BYTE0; + +typedef struct _DMA_CONFIGURATION_BYTE1 { + UCHAR Reserved0 : 2; + UCHAR TransferSize : 2; + UCHAR Timing : 2; + UCHAR Reserved1 : 2; +} DMA_CONFIGURATION_BYTE1; + +typedef struct _EISA_DMA_CONFIGURATION { + DMA_CONFIGURATION_BYTE0 ConfigurationByte0; + DMA_CONFIGURATION_BYTE1 ConfigurationByte1; +} EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION; + +typedef struct _EISA_PORT_DESCRIPTOR { + UCHAR NumberPorts : 5; + UCHAR Reserved : 1; + UCHAR Shared : 1; + UCHAR MoreEntries : 1; +} EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR; + +typedef struct _EISA_PORT_CONFIGURATION { + EISA_PORT_DESCRIPTOR Configuration; + USHORT PortAddress; +} EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION; + +typedef struct _CM_EISA_FUNCTION_INFORMATION { + ULONG CompressedId; + UCHAR IdSlotFlags1; + UCHAR IdSlotFlags2; + UCHAR MinorRevision; + UCHAR MajorRevision; + UCHAR Selections[26]; + UCHAR FunctionFlags; + UCHAR TypeString[80]; + EISA_MEMORY_CONFIGURATION EisaMemory[9]; + EISA_IRQ_CONFIGURATION EisaIrq[7]; + EISA_DMA_CONFIGURATION EisaDma[4]; + EISA_PORT_CONFIGURATION EisaPort[20]; + UCHAR InitializationData[60]; +} CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION; + +/* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */ + +#define EISA_FUNCTION_ENABLED 0x80 +#define EISA_FREE_FORM_DATA 0x40 +#define EISA_HAS_PORT_INIT_ENTRY 0x20 +#define EISA_HAS_PORT_RANGE 0x10 +#define EISA_HAS_DMA_ENTRY 0x08 +#define EISA_HAS_IRQ_ENTRY 0x04 +#define EISA_HAS_MEMORY_ENTRY 0x02 +#define EISA_HAS_TYPE_ENTRY 0x01 +#define EISA_HAS_INFORMATION \ + (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \ + + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY) + +typedef struct _CM_EISA_SLOT_INFORMATION { + UCHAR ReturnCode; + UCHAR ReturnFlags; + UCHAR MajorRevision; + UCHAR MinorRevision; + USHORT Checksum; + UCHAR NumberFunctions; + UCHAR FunctionInformation; + ULONG CompressedId; +} CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION; + +/* CM_EISA_SLOT_INFORMATION.ReturnCode */ + +#define EISA_INVALID_SLOT 0x80 +#define EISA_INVALID_FUNCTION 0x81 +#define EISA_INVALID_CONFIGURATION 0x82 +#define EISA_EMPTY_SLOT 0x83 +#define EISA_INVALID_BIOS_CALL 0x86 + +typedef struct _CM_FLOPPY_DEVICE_DATA { + USHORT Version; + USHORT Revision; + CHAR Size[8]; + ULONG MaxDensity; + ULONG MountDensity; + UCHAR StepRateHeadUnloadTime; + UCHAR HeadLoadTime; + UCHAR MotorOffTime; + UCHAR SectorLengthCode; + UCHAR SectorPerTrack; + UCHAR ReadWriteGapLength; + UCHAR DataTransferLength; + UCHAR FormatGapLength; + UCHAR FormatFillCharacter; + UCHAR HeadSettleTime; + UCHAR MotorSettleTime; + UCHAR MaximumTrackValue; + UCHAR DataTransferRate; +} CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA; + +typedef enum _INTERFACE_TYPE { + InterfaceTypeUndefined = -1, + Internal, + Isa, + Eisa, + MicroChannel, + TurboChannel, + PCIBus, + VMEBus, + NuBus, + PCMCIABus, + CBus, + MPIBus, + MPSABus, + ProcessorInternal, + InternalPowerBus, + PNPISABus, + PNPBus, + MaximumInterfaceType +} INTERFACE_TYPE, *PINTERFACE_TYPE; + +typedef struct _PNP_BUS_INFORMATION { + GUID BusTypeGuid; + INTERFACE_TYPE LegacyBusType; + ULONG BusNumber; +} PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION; + +typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR { + UCHAR Type; + UCHAR ShareDisposition; + USHORT Flags; + union { + struct { + PHYSICAL_ADDRESS Start; + ULONG Length; + } Generic; + struct { + PHYSICAL_ADDRESS Start; + ULONG Length; + } Port; + struct { + ULONG Level; + ULONG Vector; + ULONG Affinity; + } Interrupt; + struct { + PHYSICAL_ADDRESS Start; + ULONG Length; + } Memory; + struct { + ULONG Channel; + ULONG Port; + ULONG Reserved1; + } Dma; + struct { + ULONG Data[3]; + } DevicePrivate; + struct { + ULONG Start; + ULONG Length; + ULONG Reserved; + } BusNumber; + struct { + ULONG DataSize; + ULONG Reserved1; + ULONG Reserved2; + } DeviceSpecificData; + } u; +} CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR; + +/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */ + +#define CmResourceTypeNull 0 +#define CmResourceTypePort 1 +#define CmResourceTypeInterrupt 2 +#define CmResourceTypeMemory 3 +#define CmResourceTypeDma 4 +#define CmResourceTypeDeviceSpecific 5 +#define CmResourceTypeBusNumber 6 +#define CmResourceTypeMaximum 7 +#define CmResourceTypeNonArbitrated 128 +#define CmResourceTypeConfigData 128 +#define CmResourceTypeDevicePrivate 129 +#define CmResourceTypePcCardConfig 130 +#define CmResourceTypeMfCardConfig 131 + +/* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */ + +typedef enum _CM_SHARE_DISPOSITION { + CmResourceShareUndetermined, + CmResourceShareDeviceExclusive, + CmResourceShareDriverExclusive, + CmResourceShareShared +} CM_SHARE_DISPOSITION; + +/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */ + +#define CM_RESOURCE_PORT_MEMORY 0x0000 +#define CM_RESOURCE_PORT_IO 0x0001 +#define CM_RESOURCE_PORT_10_BIT_DECODE 0x0004 +#define CM_RESOURCE_PORT_12_BIT_DECODE 0x0008 +#define CM_RESOURCE_PORT_16_BIT_DECODE 0x0010 +#define CM_RESOURCE_PORT_POSITIVE_DECODE 0x0020 +#define CM_RESOURCE_PORT_PASSIVE_DECODE 0x0040 +#define CM_RESOURCE_PORT_WINDOW_DECODE 0x0080 + +/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */ + +#define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000 +#define CM_RESOURCE_INTERRUPT_LATCHED 0x0001 + +/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */ + +#define CM_RESOURCE_MEMORY_READ_WRITE 0x0000 +#define CM_RESOURCE_MEMORY_READ_ONLY 0x0001 +#define CM_RESOURCE_MEMORY_WRITE_ONLY 0x0002 +#define CM_RESOURCE_MEMORY_PREFETCHABLE 0x0004 +#define CM_RESOURCE_MEMORY_COMBINEDWRITE 0x0008 +#define CM_RESOURCE_MEMORY_24 0x0010 +#define CM_RESOURCE_MEMORY_CACHEABLE 0x0020 + +/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */ + +#define CM_RESOURCE_DMA_8 0x0000 +#define CM_RESOURCE_DMA_16 0x0001 +#define CM_RESOURCE_DMA_32 0x0002 +#define CM_RESOURCE_DMA_8_AND_16 0x0004 +#define CM_RESOURCE_DMA_BUS_MASTER 0x0008 +#define CM_RESOURCE_DMA_TYPE_A 0x0010 +#define CM_RESOURCE_DMA_TYPE_B 0x0020 +#define CM_RESOURCE_DMA_TYPE_F 0x0040 + +typedef struct _CM_PARTIAL_RESOURCE_LIST { + USHORT Version; + USHORT Revision; + ULONG Count; + CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1]; +} CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST; + +typedef struct _CM_FULL_RESOURCE_DESCRIPTOR { + INTERFACE_TYPE InterfaceType; + ULONG BusNumber; + CM_PARTIAL_RESOURCE_LIST PartialResourceList; +} CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR; + +typedef struct _CM_RESOURCE_LIST { + ULONG Count; + CM_FULL_RESOURCE_DESCRIPTOR List[1]; +} CM_RESOURCE_LIST, *PCM_RESOURCE_LIST; + +typedef struct _CM_INT13_DRIVE_PARAMETER { + USHORT DriveSelect; + ULONG MaxCylinders; + USHORT SectorsPerTrack; + USHORT MaxHeads; + USHORT NumberDrives; +} CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER; + +typedef struct _CM_KEYBOARD_DEVICE_DATA { + USHORT Version; + USHORT Revision; + UCHAR Type; + UCHAR Subtype; + USHORT KeyboardFlags; +} CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA; + +#define KEYBOARD_INSERT_ON 0x80 +#define KEYBOARD_CAPS_LOCK_ON 0x40 +#define KEYBOARD_NUM_LOCK_ON 0x20 +#define KEYBOARD_SCROLL_LOCK_ON 0x10 +#define KEYBOARD_ALT_KEY_DOWN 0x08 +#define KEYBOARD_CTRL_KEY_DOWN 0x04 +#define KEYBOARD_LEFT_SHIFT_DOWN 0x02 +#define KEYBOARD_RIGHT_SHIFT_DOWN 0x01 + +typedef struct _CM_MCA_POS_DATA { + USHORT AdapterId; + UCHAR PosData1; + UCHAR PosData2; + UCHAR PosData3; + UCHAR PosData4; +} CM_MCA_POS_DATA, *PCM_MCA_POS_DATA; + +typedef struct CM_Power_Data_s { + ULONG PD_Size; + DEVICE_POWER_STATE PD_MostRecentPowerState; + ULONG PD_Capabilities; + ULONG PD_D1Latency; + ULONG PD_D2Latency; + ULONG PD_D3Latency; + DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum]; +} CM_POWER_DATA, *PCM_POWER_DATA; + +#define PDCAP_D0_SUPPORTED 0x00000001 +#define PDCAP_D1_SUPPORTED 0x00000002 +#define PDCAP_D2_SUPPORTED 0x00000004 +#define PDCAP_D3_SUPPORTED 0x00000008 +#define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010 +#define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020 +#define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040 +#define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080 +#define PDCAP_WARM_EJECT_SUPPORTED 0x00000100 + +typedef struct _CM_SCSI_DEVICE_DATA { + USHORT Version; + USHORT Revision; + UCHAR HostIdentifier; +} CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA; + +typedef struct _CM_SERIAL_DEVICE_DATA { + USHORT Version; + USHORT Revision; + ULONG BaudClock; +} CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA; + +/* IO_RESOURCE_DESCRIPTOR.Option */ + +#define IO_RESOURCE_PREFERRED 0x01 +#define IO_RESOURCE_DEFAULT 0x02 +#define IO_RESOURCE_ALTERNATIVE 0x08 + +typedef struct _IO_RESOURCE_DESCRIPTOR { + UCHAR Option; + UCHAR Type; + UCHAR ShareDisposition; + UCHAR Spare1; + USHORT Flags; + USHORT Spare2; + union { + struct { + ULONG Length; + ULONG Alignment; + PHYSICAL_ADDRESS MinimumAddress; + PHYSICAL_ADDRESS MaximumAddress; + } Port; + struct { + ULONG Length; + ULONG Alignment; + PHYSICAL_ADDRESS MinimumAddress; + PHYSICAL_ADDRESS MaximumAddress; + } Memory; + struct { + ULONG MinimumVector; + ULONG MaximumVector; + } Interrupt; + struct { + ULONG MinimumChannel; + ULONG MaximumChannel; + } Dma; + struct { + ULONG Length; + ULONG Alignment; + PHYSICAL_ADDRESS MinimumAddress; + PHYSICAL_ADDRESS MaximumAddress; + } Generic; + struct { + ULONG Data[3]; + } DevicePrivate; + struct { + ULONG Length; + ULONG MinBusNumber; + ULONG MaxBusNumber; + ULONG Reserved; + } BusNumber; + struct { + ULONG Priority; + ULONG Reserved1; + ULONG Reserved2; + } ConfigData; + } u; +} IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR; + +typedef struct _IO_RESOURCE_LIST { + USHORT Version; + USHORT Revision; + ULONG Count; + IO_RESOURCE_DESCRIPTOR Descriptors[1]; +} IO_RESOURCE_LIST, *PIO_RESOURCE_LIST; + +typedef struct _IO_RESOURCE_REQUIREMENTS_LIST { + ULONG ListSize; + INTERFACE_TYPE InterfaceType; + ULONG BusNumber; + ULONG SlotNumber; + ULONG Reserved[3]; + ULONG AlternativeLists; + IO_RESOURCE_LIST List[1]; +} IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST; + +typedef struct _CONTROLLER_OBJECT { + CSHORT Type; + CSHORT Size; + PVOID ControllerExtension; + KDEVICE_QUEUE DeviceWaitQueue; + ULONG Spare1; + LARGE_INTEGER Spare2; +} CONTROLLER_OBJECT, *PCONTROLLER_OBJECT; + +typedef enum _DMA_WIDTH { + Width8Bits, + Width16Bits, + Width32Bits, + MaximumDmaWidth +} DMA_WIDTH, *PDMA_WIDTH; + +typedef enum _DMA_SPEED { + Compatible, + TypeA, + TypeB, + TypeC, + TypeF, + MaximumDmaSpeed +} DMA_SPEED, *PDMA_SPEED; + +/* DEVICE_DESCRIPTION.Version */ + +#define DEVICE_DESCRIPTION_VERSION 0x0000 +#define DEVICE_DESCRIPTION_VERSION1 0x0001 +#define DEVICE_DESCRIPTION_VERSION2 0x0002 + +typedef struct _DEVICE_DESCRIPTION { + ULONG Version; + BOOLEAN Master; + BOOLEAN ScatterGather; + BOOLEAN DemandMode; + BOOLEAN AutoInitialize; + BOOLEAN Dma32BitAddresses; + BOOLEAN IgnoreCount; + BOOLEAN Reserved1; + BOOLEAN Dma64BitAddresses; + ULONG BusNumber; + ULONG DmaChannel; + INTERFACE_TYPE InterfaceType; + DMA_WIDTH DmaWidth; + DMA_SPEED DmaSpeed; + ULONG MaximumLength; + ULONG DmaPort; +} DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION; + +/* VPB.Flags */ +#define VPB_MOUNTED 0x0001 +#define VPB_LOCKED 0x0002 +#define VPB_PERSISTENT 0x0004 +#define VPB_REMOVE_PENDING 0x0008 +#define VPB_RAW_MOUNT 0x0010 + +#define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR)) + +typedef struct _VPB { + CSHORT Type; + CSHORT Size; + USHORT Flags; + USHORT VolumeLabelLength; + struct _DEVICE_OBJECT *DeviceObject; + struct _DEVICE_OBJECT *RealDevice; + ULONG SerialNumber; + ULONG ReferenceCount; + WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)]; +} VPB, *PVPB; + +/* DEVICE_OBJECT.Flags */ + +#define DO_VERIFY_VOLUME 0x00000002 +#define DO_BUFFERED_IO 0x00000004 +#define DO_EXCLUSIVE 0x00000008 +#define DO_DIRECT_IO 0x00000010 +#define DO_MAP_IO_BUFFER 0x00000020 +#define DO_DEVICE_HAS_NAME 0x00000040 +#define DO_DEVICE_INITIALIZING 0x00000080 +#define DO_SYSTEM_BOOT_PARTITION 0x00000100 +#define DO_LONG_TERM_REQUESTS 0x00000200 +#define DO_NEVER_LAST_DEVICE 0x00000400 +#define DO_SHUTDOWN_REGISTERED 0x00000800 +#define DO_BUS_ENUMERATED_DEVICE 0x00001000 +#define DO_POWER_PAGABLE 0x00002000 +#define DO_POWER_INRUSH 0x00004000 +#define DO_LOW_PRIORITY_FILESYSTEM 0x00010000 + +/* DEVICE_OBJECT.Characteristics */ + +#define FILE_REMOVABLE_MEDIA 0x00000001 +#define FILE_READ_ONLY_DEVICE 0x00000002 +#define FILE_FLOPPY_DISKETTE 0x00000004 +#define FILE_WRITE_ONCE_MEDIA 0x00000008 +#define FILE_REMOTE_DEVICE 0x00000010 +#define FILE_DEVICE_IS_MOUNTED 0x00000020 +#define FILE_VIRTUAL_VOLUME 0x00000040 +#define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080 +#define FILE_DEVICE_SECURE_OPEN 0x00000100 + +/* DEVICE_OBJECT.AlignmentRequirement */ + +#define FILE_BYTE_ALIGNMENT 0x00000000 +#define FILE_WORD_ALIGNMENT 0x00000001 +#define FILE_LONG_ALIGNMENT 0x00000003 +#define FILE_QUAD_ALIGNMENT 0x00000007 +#define FILE_OCTA_ALIGNMENT 0x0000000f +#define FILE_32_BYTE_ALIGNMENT 0x0000001f +#define FILE_64_BYTE_ALIGNMENT 0x0000003f +#define FILE_128_BYTE_ALIGNMENT 0x0000007f +#define FILE_256_BYTE_ALIGNMENT 0x000000ff +#define FILE_512_BYTE_ALIGNMENT 0x000001ff + +/* DEVICE_OBJECT.DeviceType */ + +#define DEVICE_TYPE ULONG + +#define FILE_DEVICE_BEEP 0x00000001 +#define FILE_DEVICE_CD_ROM 0x00000002 +#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 +#define FILE_DEVICE_CONTROLLER 0x00000004 +#define FILE_DEVICE_DATALINK 0x00000005 +#define FILE_DEVICE_DFS 0x00000006 +#define FILE_DEVICE_DISK 0x00000007 +#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008 +#define FILE_DEVICE_FILE_SYSTEM 0x00000009 +#define FILE_DEVICE_INPORT_PORT 0x0000000a +#define FILE_DEVICE_KEYBOARD 0x0000000b +#define FILE_DEVICE_MAILSLOT 0x0000000c +#define FILE_DEVICE_MIDI_IN 0x0000000d +#define FILE_DEVICE_MIDI_OUT 0x0000000e +#define FILE_DEVICE_MOUSE 0x0000000f +#define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010 +#define FILE_DEVICE_NAMED_PIPE 0x00000011 +#define FILE_DEVICE_NETWORK 0x00000012 +#define FILE_DEVICE_NETWORK_BROWSER 0x00000013 +#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014 +#define FILE_DEVICE_NULL 0x00000015 +#define FILE_DEVICE_PARALLEL_PORT 0x00000016 +#define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017 +#define FILE_DEVICE_PRINTER 0x00000018 +#define FILE_DEVICE_SCANNER 0x00000019 +#define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a +#define FILE_DEVICE_SERIAL_PORT 0x0000001b +#define FILE_DEVICE_SCREEN 0x0000001c +#define FILE_DEVICE_SOUND 0x0000001d +#define FILE_DEVICE_STREAMS 0x0000001e +#define FILE_DEVICE_TAPE 0x0000001f +#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020 +#define FILE_DEVICE_TRANSPORT 0x00000021 +#define FILE_DEVICE_UNKNOWN 0x00000022 +#define FILE_DEVICE_VIDEO 0x00000023 +#define FILE_DEVICE_VIRTUAL_DISK 0x00000024 +#define FILE_DEVICE_WAVE_IN 0x00000025 +#define FILE_DEVICE_WAVE_OUT 0x00000026 +#define FILE_DEVICE_8042_PORT 0x00000027 +#define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028 +#define FILE_DEVICE_BATTERY 0x00000029 +#define FILE_DEVICE_BUS_EXTENDER 0x0000002a +#define FILE_DEVICE_MODEM 0x0000002b +#define FILE_DEVICE_VDM 0x0000002c +#define FILE_DEVICE_MASS_STORAGE 0x0000002d +#define FILE_DEVICE_SMB 0x0000002e +#define FILE_DEVICE_KS 0x0000002f +#define FILE_DEVICE_CHANGER 0x00000030 +#define FILE_DEVICE_SMARTCARD 0x00000031 +#define FILE_DEVICE_ACPI 0x00000032 +#define FILE_DEVICE_DVD 0x00000033 +#define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034 +#define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035 +#define FILE_DEVICE_DFS_VOLUME 0x00000036 +#define FILE_DEVICE_SERENUM 0x00000037 +#define FILE_DEVICE_TERMSRV 0x00000038 +#define FILE_DEVICE_KSEC 0x00000039 +#define FILE_DEVICE_FIPS 0x0000003a + +typedef struct _DEVICE_OBJECT { + CSHORT Type; + USHORT Size; + LONG ReferenceCount; + struct _DRIVER_OBJECT *DriverObject; + struct _DEVICE_OBJECT *NextDevice; + struct _DEVICE_OBJECT *AttachedDevice; + struct _IRP *CurrentIrp; + PIO_TIMER Timer; + ULONG Flags; + ULONG Characteristics; + PVPB Vpb; + PVOID DeviceExtension; + DEVICE_TYPE DeviceType; + CCHAR StackSize; + union { + LIST_ENTRY ListEntry; + WAIT_CONTEXT_BLOCK Wcb; + } Queue; + ULONG AlignmentRequirement; + KDEVICE_QUEUE DeviceQueue; + KDPC Dpc; + ULONG ActiveThreadCount; + PSECURITY_DESCRIPTOR SecurityDescriptor; + KEVENT DeviceLock; + USHORT SectorSize; + USHORT Spare1; + struct _DEVOBJ_EXTENSION *DeviceObjectExtension; + PVOID Reserved; +} DEVICE_OBJECT; +typedef struct _DEVICE_OBJECT *PDEVICE_OBJECT; + +typedef enum _DEVICE_RELATION_TYPE { + BusRelations, + EjectionRelations, + PowerRelations, + RemovalRelations, + TargetDeviceRelation, + SingleBusRelations +} DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE; + +typedef struct _DEVICE_RELATIONS { + ULONG Count; + PDEVICE_OBJECT Objects[1]; +} DEVICE_RELATIONS, *PDEVICE_RELATIONS; + +typedef struct _SCATTER_GATHER_ELEMENT { + PHYSICAL_ADDRESS Address; + ULONG Length; + ULONG_PTR Reserved; +} SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT; + +typedef struct _SCATTER_GATHER_LIST { + ULONG NumberOfElements; + ULONG_PTR Reserved; + SCATTER_GATHER_ELEMENT Elements[0]; +} SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST; + +typedef struct _MDL { + struct _MDL *Next; + CSHORT Size; + CSHORT MdlFlags; + struct _EPROCESS *Process; + PVOID MappedSystemVa; + PVOID StartVa; + ULONG ByteCount; + ULONG ByteOffset; +} MDL, *PMDL; + +#define MDL_MAPPED_TO_SYSTEM_VA 0x0001 +#define MDL_PAGES_LOCKED 0x0002 +#define MDL_SOURCE_IS_NONPAGED_POOL 0x0004 +#define MDL_ALLOCATED_FIXED_SIZE 0x0008 +#define MDL_PARTIAL 0x0010 +#define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020 +#define MDL_IO_PAGE_READ 0x0040 +#define MDL_WRITE_OPERATION 0x0080 +#define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100 +#define MDL_FREE_EXTRA_PTES 0x0200 +#define MDL_IO_SPACE 0x0800 +#define MDL_NETWORK_HEADER 0x1000 +#define MDL_MAPPING_CAN_FAIL 0x2000 +#define MDL_ALLOCATED_MUST_SUCCEED 0x4000 + +#define MDL_MAPPING_FLAGS ( \ + MDL_MAPPED_TO_SYSTEM_VA | \ + MDL_PAGES_LOCKED | \ + MDL_SOURCE_IS_NONPAGED_POOL | \ + MDL_PARTIAL_HAS_BEEN_MAPPED | \ + MDL_PARENT_MAPPED_SYSTEM_VA | \ + MDL_SYSTEM_VA | \ + MDL_IO_SPACE) + +typedef VOID DDKAPI +(*PPUT_DMA_ADAPTER)( + IN PDMA_ADAPTER DmaAdapter); + +typedef PVOID DDKAPI +(*PALLOCATE_COMMON_BUFFER)( + IN PDMA_ADAPTER DmaAdapter, + IN ULONG Length, + OUT PPHYSICAL_ADDRESS LogicalAddress, + IN BOOLEAN CacheEnabled); + +typedef VOID DDKAPI +(*PFREE_COMMON_BUFFER)( + IN PDMA_ADAPTER DmaAdapter, + IN ULONG Length, + IN PHYSICAL_ADDRESS LogicalAddress, + IN PVOID VirtualAddress, + IN BOOLEAN CacheEnabled); + +typedef NTSTATUS DDKAPI +(*PALLOCATE_ADAPTER_CHANNEL)( + IN PDMA_ADAPTER DmaAdapter, + IN PDEVICE_OBJECT DeviceObject, + IN ULONG NumberOfMapRegisters, + IN PDRIVER_CONTROL ExecutionRoutine, + IN PVOID Context); + +typedef BOOLEAN DDKAPI +(*PFLUSH_ADAPTER_BUFFERS)( + IN PDMA_ADAPTER DmaAdapter, + IN PMDL Mdl, + IN PVOID MapRegisterBase, + IN PVOID CurrentVa, + IN ULONG Length, + IN BOOLEAN WriteToDevice); + +typedef VOID DDKAPI +(*PFREE_ADAPTER_CHANNEL)( + IN PDMA_ADAPTER DmaAdapter); + +typedef VOID DDKAPI +(*PFREE_MAP_REGISTERS)( + IN PDMA_ADAPTER DmaAdapter, + PVOID MapRegisterBase, + ULONG NumberOfMapRegisters); + +typedef PHYSICAL_ADDRESS DDKAPI +(*PMAP_TRANSFER)( + IN PDMA_ADAPTER DmaAdapter, + IN PMDL Mdl, + IN PVOID MapRegisterBase, + IN PVOID CurrentVa, + IN OUT PULONG Length, + IN BOOLEAN WriteToDevice); + +typedef ULONG DDKAPI +(*PGET_DMA_ALIGNMENT)( + IN PDMA_ADAPTER DmaAdapter); + +typedef ULONG DDKAPI +(*PREAD_DMA_COUNTER)( + IN PDMA_ADAPTER DmaAdapter); + +typedef NTSTATUS DDKAPI +(*PGET_SCATTER_GATHER_LIST)( + IN PDMA_ADAPTER DmaAdapter, + IN PDEVICE_OBJECT DeviceObject, + IN PMDL Mdl, + IN PVOID CurrentVa, + IN ULONG Length, + IN PDRIVER_LIST_CONTROL ExecutionRoutine, + IN PVOID Context, + IN BOOLEAN WriteToDevice); + +typedef VOID DDKAPI +(*PPUT_SCATTER_GATHER_LIST)( + IN PDMA_ADAPTER DmaAdapter, + IN PSCATTER_GATHER_LIST ScatterGather, + IN BOOLEAN WriteToDevice); + +typedef NTSTATUS DDKAPI +(*PCALCULATE_SCATTER_GATHER_LIST_SIZE)( + IN PDMA_ADAPTER DmaAdapter, + IN PMDL Mdl OPTIONAL, + IN PVOID CurrentVa, + IN ULONG Length, + OUT PULONG ScatterGatherListSize, + OUT PULONG pNumberOfMapRegisters OPTIONAL); + +typedef NTSTATUS DDKAPI +(*PBUILD_SCATTER_GATHER_LIST)( + IN PDMA_ADAPTER DmaAdapter, + IN PDEVICE_OBJECT DeviceObject, + IN PMDL Mdl, + IN PVOID CurrentVa, + IN ULONG Length, + IN PDRIVER_LIST_CONTROL ExecutionRoutine, + IN PVOID Context, + IN BOOLEAN WriteToDevice, + IN PVOID ScatterGatherBuffer, + IN ULONG ScatterGatherLength); + +typedef NTSTATUS DDKAPI +(*PBUILD_MDL_FROM_SCATTER_GATHER_LIST)( + IN PDMA_ADAPTER DmaAdapter, + IN PSCATTER_GATHER_LIST ScatterGather, + IN PMDL OriginalMdl, + OUT PMDL *TargetMdl); + +typedef struct _DMA_OPERATIONS { + ULONG Size; + PPUT_DMA_ADAPTER PutDmaAdapter; + PALLOCATE_COMMON_BUFFER AllocateCommonBuffer; + PFREE_COMMON_BUFFER FreeCommonBuffer; + PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel; + PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers; + PFREE_ADAPTER_CHANNEL FreeAdapterChannel; + PFREE_MAP_REGISTERS FreeMapRegisters; + PMAP_TRANSFER MapTransfer; + PGET_DMA_ALIGNMENT GetDmaAlignment; + PREAD_DMA_COUNTER ReadDmaCounter; + PGET_SCATTER_GATHER_LIST GetScatterGatherList; + PPUT_SCATTER_GATHER_LIST PutScatterGatherList; + PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList; + PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList; + PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList; +} DMA_OPERATIONS, *PDMA_OPERATIONS; + +typedef struct _DMA_ADAPTER { + USHORT Version; + USHORT Size; + PDMA_OPERATIONS DmaOperations; +} DMA_ADAPTER; + +typedef enum _FILE_INFORMATION_CLASS { + FileDirectoryInformation = 1, + FileFullDirectoryInformation, + FileBothDirectoryInformation, + FileBasicInformation, + FileStandardInformation, + FileInternalInformation, + FileEaInformation, + FileAccessInformation, + FileNameInformation, + FileRenameInformation, + FileLinkInformation, + FileNamesInformation, + FileDispositionInformation, + FilePositionInformation, + FileFullEaInformation, + FileModeInformation, + FileAlignmentInformation, + FileAllInformation, + FileAllocationInformation, + FileEndOfFileInformation, + FileAlternateNameInformation, + FileStreamInformation, + FilePipeInformation, + FilePipeLocalInformation, + FilePipeRemoteInformation, + FileMailslotQueryInformation, + FileMailslotSetInformation, + FileCompressionInformation, + FileObjectIdInformation, + FileCompletionInformation, + FileMoveClusterInformation, + FileQuotaInformation, + FileReparsePointInformation, + FileNetworkOpenInformation, + FileAttributeTagInformation, + FileTrackingInformation, + FileIdBothDirectoryInformation, + FileIdFullDirectoryInformation, + FileValidDataLengthInformation, + FileShortNameInformation, + FileMaximumInformation +} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS; + +typedef struct _FILE_POSITION_INFORMATION { + LARGE_INTEGER CurrentByteOffset; +} FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION; + +typedef struct _FILE_ALIGNMENT_INFORMATION { + ULONG AlignmentRequirement; +} FILE_ALIGNMENT_INFORMATION; + +typedef struct _FILE_NAME_INFORMATION { + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION; + +typedef struct FILE_BASIC_INFORMATION { + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + ULONG FileAttributes; +} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION; + +typedef struct _FILE_STANDARD_INFORMATION { + LARGE_INTEGER AllocationSize; + LARGE_INTEGER EndOfFile; + ULONG NumberOfLinks; + BOOLEAN DeletePending; + BOOLEAN Directory; +} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION; + +typedef struct _FILE_NETWORK_OPEN_INFORMATION { + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER AllocationSize; + LARGE_INTEGER EndOfFile; + ULONG FileAttributes; +} FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION; + +typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION { + ULONG FileAttributes; + ULONG ReparseTag; +} FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION; + +typedef struct _FILE_DISPOSITION_INFORMATION { + BOOLEAN DoDeleteFile; +} FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION; + +typedef struct _FILE_END_OF_FILE_INFORMATION { + LARGE_INTEGER EndOfFile; +} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION; + +typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION { + LARGE_INTEGER ValidDataLength; +} FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION; + +typedef enum _FSINFOCLASS { + FileFsVolumeInformation = 1, + FileFsLabelInformation, + FileFsSizeInformation, + FileFsDeviceInformation, + FileFsAttributeInformation, + FileFsControlInformation, + FileFsFullSizeInformation, + FileFsObjectIdInformation, + FileFsDriverPathInformation, + FileFsMaximumInformation +} FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS; + +typedef struct _FILE_FS_DEVICE_INFORMATION { + DEVICE_TYPE DeviceType; + ULONG Characteristics; +} FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION; + +typedef struct _FILE_FULL_EA_INFORMATION { + ULONG NextEntryOffset; + UCHAR Flags; + UCHAR EaNameLength; + USHORT EaValueLength; + CHAR EaName[1]; +} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION; + +typedef ULONG_PTR ERESOURCE_THREAD; +typedef ERESOURCE_THREAD *PERESOURCE_THREAD; + +typedef struct _OWNER_ENTRY { + ERESOURCE_THREAD OwnerThread; + _ANONYMOUS_UNION union { + LONG OwnerCount; + ULONG TableSize; + } DUMMYUNIONNAME; +} OWNER_ENTRY, *POWNER_ENTRY; + +/* ERESOURCE.Flag */ + +#define ResourceNeverExclusive 0x0010 +#define ResourceReleaseByOtherThread 0x0020 +#define ResourceOwnedExclusive 0x0080 + +#define RESOURCE_HASH_TABLE_SIZE 64 + +typedef struct _ERESOURCE { + LIST_ENTRY SystemResourcesList; + POWNER_ENTRY OwnerTable; + SHORT ActiveCount; + USHORT Flag; + PKSEMAPHORE SharedWaiters; + PKEVENT ExclusiveWaiters; + OWNER_ENTRY OwnerThreads[2]; + ULONG ContentionCount; + USHORT NumberOfSharedWaiters; + USHORT NumberOfExclusiveWaiters; + _ANONYMOUS_UNION union { + PVOID Address; + ULONG_PTR CreatorBackTraceIndex; + } DUMMYUNIONNAME; + KSPIN_LOCK SpinLock; +} ERESOURCE, *PERESOURCE; + +/* NOTE: PVOID for methods to avoid 'assignment from incompatible pointer type' warning */ +typedef struct _DRIVER_EXTENSION { + struct _DRIVER_OBJECT *DriverObject; + PVOID AddDevice; + ULONG Count; + UNICODE_STRING ServiceKeyName; +} DRIVER_EXTENSION, *PDRIVER_EXTENSION; + +typedef BOOLEAN DDKAPI +(*PFAST_IO_CHECK_IF_POSSIBLE)( + IN struct _FILE_OBJECT *FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + IN ULONG LockKey, + IN BOOLEAN CheckForReadOperation, + OUT PIO_STATUS_BLOCK IoStatus, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN DDKAPI +(*PFAST_IO_READ)( + IN struct _FILE_OBJECT *FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + IN ULONG LockKey, + OUT PVOID Buffer, + OUT PIO_STATUS_BLOCK IoStatus, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN DDKAPI +(*PFAST_IO_WRITE)( + IN struct _FILE_OBJECT *FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + IN ULONG LockKey, + IN PVOID Buffer, + OUT PIO_STATUS_BLOCK IoStatus, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN DDKAPI +(*PFAST_IO_QUERY_BASIC_INFO)( + IN struct _FILE_OBJECT *FileObject, + IN BOOLEAN Wait, + OUT PFILE_BASIC_INFORMATION Buffer, + OUT PIO_STATUS_BLOCK IoStatus, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN DDKAPI +(*PFAST_IO_QUERY_STANDARD_INFO)( + IN struct _FILE_OBJECT *FileObject, + IN BOOLEAN Wait, + OUT PFILE_STANDARD_INFORMATION Buffer, + OUT PIO_STATUS_BLOCK IoStatus, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN DDKAPI +(*PFAST_IO_LOCK)( + IN struct _FILE_OBJECT *FileObject, + IN PLARGE_INTEGER FileOffset, + IN PLARGE_INTEGER Length, + PEPROCESS ProcessId, + ULONG Key, + BOOLEAN FailImmediately, + BOOLEAN ExclusiveLock, + OUT PIO_STATUS_BLOCK IoStatus, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN DDKAPI +(*PFAST_IO_UNLOCK_SINGLE)( + IN struct _FILE_OBJECT *FileObject, + IN PLARGE_INTEGER FileOffset, + IN PLARGE_INTEGER Length, + PEPROCESS ProcessId, + ULONG Key, + OUT PIO_STATUS_BLOCK IoStatus, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN DDKAPI +(*PFAST_IO_UNLOCK_ALL)( + IN struct _FILE_OBJECT *FileObject, + PEPROCESS ProcessId, + OUT PIO_STATUS_BLOCK IoStatus, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN DDKAPI +(*PFAST_IO_UNLOCK_ALL_BY_KEY)( + IN struct _FILE_OBJECT *FileObject, + PVOID ProcessId, + ULONG Key, + OUT PIO_STATUS_BLOCK IoStatus, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN DDKAPI +(*PFAST_IO_DEVICE_CONTROL)( + IN struct _FILE_OBJECT *FileObject, + IN BOOLEAN Wait, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength, + IN ULONG IoControlCode, + OUT PIO_STATUS_BLOCK IoStatus, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef VOID DDKAPI +(*PFAST_IO_ACQUIRE_FILE)( + IN struct _FILE_OBJECT *FileObject); + +typedef VOID DDKAPI +(*PFAST_IO_RELEASE_FILE)( + IN struct _FILE_OBJECT *FileObject); + +typedef VOID DDKAPI +(*PFAST_IO_DETACH_DEVICE)( + IN struct _DEVICE_OBJECT *SourceDevice, + IN struct _DEVICE_OBJECT *TargetDevice); + +typedef BOOLEAN DDKAPI +(*PFAST_IO_QUERY_NETWORK_OPEN_INFO)( + IN struct _FILE_OBJECT *FileObject, + IN BOOLEAN Wait, + OUT struct _FILE_NETWORK_OPEN_INFORMATION *Buffer, + OUT struct _IO_STATUS_BLOCK *IoStatus, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef NTSTATUS DDKAPI +(*PFAST_IO_ACQUIRE_FOR_MOD_WRITE)( + IN struct _FILE_OBJECT *FileObject, + IN PLARGE_INTEGER EndingOffset, + OUT struct _ERESOURCE **ResourceToRelease, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN DDKAPI +(*PFAST_IO_MDL_READ)( + IN struct _FILE_OBJECT *FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN ULONG LockKey, + OUT PMDL *MdlChain, + OUT PIO_STATUS_BLOCK IoStatus, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN DDKAPI +(*PFAST_IO_MDL_READ_COMPLETE)( + IN struct _FILE_OBJECT *FileObject, + IN PMDL MdlChain, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN DDKAPI +(*PFAST_IO_PREPARE_MDL_WRITE)( + IN struct _FILE_OBJECT *FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN ULONG LockKey, + OUT PMDL *MdlChain, + OUT PIO_STATUS_BLOCK IoStatus, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN DDKAPI +(*PFAST_IO_MDL_WRITE_COMPLETE)( + IN struct _FILE_OBJECT *FileObject, + IN PLARGE_INTEGER FileOffset, + IN PMDL MdlChain, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN DDKAPI +(*PFAST_IO_READ_COMPRESSED)( + IN struct _FILE_OBJECT *FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN ULONG LockKey, + OUT PVOID Buffer, + OUT PMDL *MdlChain, + OUT PIO_STATUS_BLOCK IoStatus, + OUT struct _COMPRESSED_DATA_INFO *CompressedDataInfo, + IN ULONG CompressedDataInfoLength, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN DDKAPI +(*PFAST_IO_WRITE_COMPRESSED)( + IN struct _FILE_OBJECT *FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN ULONG LockKey, + IN PVOID Buffer, + OUT PMDL *MdlChain, + OUT PIO_STATUS_BLOCK IoStatus, + IN struct _COMPRESSED_DATA_INFO *CompressedDataInfo, + IN ULONG CompressedDataInfoLength, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN DDKAPI +(*PFAST_IO_MDL_READ_COMPLETE_COMPRESSED)( + IN struct _FILE_OBJECT *FileObject, + IN PMDL MdlChain, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN DDKAPI +(*PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)( + IN struct _FILE_OBJECT *FileObject, + IN PLARGE_INTEGER FileOffset, + IN PMDL MdlChain, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN DDKAPI +(*PFAST_IO_QUERY_OPEN)( + IN struct _IRP *Irp, + OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef NTSTATUS DDKAPI +(*PFAST_IO_RELEASE_FOR_MOD_WRITE)( + IN struct _FILE_OBJECT *FileObject, + IN struct _ERESOURCE *ResourceToRelease, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef NTSTATUS DDKAPI +(*PFAST_IO_ACQUIRE_FOR_CCFLUSH)( + IN struct _FILE_OBJECT *FileObject, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef NTSTATUS DDKAPI +(*PFAST_IO_RELEASE_FOR_CCFLUSH) ( + IN struct _FILE_OBJECT *FileObject, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef struct _FAST_IO_DISPATCH { + ULONG SizeOfFastIoDispatch; + PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible; + PFAST_IO_READ FastIoRead; + PFAST_IO_WRITE FastIoWrite; + PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo; + PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo; + PFAST_IO_LOCK FastIoLock; + PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle; + PFAST_IO_UNLOCK_ALL FastIoUnlockAll; + PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey; + PFAST_IO_DEVICE_CONTROL FastIoDeviceControl; + PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection; + PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection; + PFAST_IO_DETACH_DEVICE FastIoDetachDevice; + PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo; + PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite; + PFAST_IO_MDL_READ MdlRead; + PFAST_IO_MDL_READ_COMPLETE MdlReadComplete; + PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite; + PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete; + PFAST_IO_READ_COMPRESSED FastIoReadCompressed; + PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed; + PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed; + PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed; + PFAST_IO_QUERY_OPEN FastIoQueryOpen; + PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite; + PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush; + PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush; +} FAST_IO_DISPATCH, *PFAST_IO_DISPATCH; + +/* NOTE: PVOID for methods to avoid 'assignment from incompatible pointer type' warning */ +typedef struct _DRIVER_OBJECT { + CSHORT Type; + CSHORT Size; + PDEVICE_OBJECT DeviceObject; + ULONG Flags; + PVOID DriverStart; + ULONG DriverSize; + PVOID DriverSection; + PDRIVER_EXTENSION DriverExtension; + UNICODE_STRING DriverName; + PUNICODE_STRING HardwareDatabase; + PVOID FastIoDispatch; + PVOID DriverInit; + PVOID DriverStartIo; + PVOID DriverUnload; + PVOID MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1]; +} DRIVER_OBJECT; +typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT; + +typedef struct _SECTION_OBJECT_POINTERS { + PVOID DataSectionObject; + PVOID SharedCacheMap; + PVOID ImageSectionObject; +} SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS; + +typedef struct _IO_COMPLETION_CONTEXT { + PVOID Port; + PVOID Key; +} IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT; + +/* FILE_OBJECT.Flags */ + +#define FO_FILE_OPEN 0x00000001 +#define FO_SYNCHRONOUS_IO 0x00000002 +#define FO_ALERTABLE_IO 0x00000004 +#define FO_NO_INTERMEDIATE_BUFFERING 0x00000008 +#define FO_WRITE_THROUGH 0x00000010 +#define FO_SEQUENTIAL_ONLY 0x00000020 +#define FO_CACHE_SUPPORTED 0x00000040 +#define FO_NAMED_PIPE 0x00000080 +#define FO_STREAM_FILE 0x00000100 +#define FO_MAILSLOT 0x00000200 +#define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400 +#define FO_DIRECT_DEVICE_OPEN 0x00000800 +#define FO_FILE_MODIFIED 0x00001000 +#define FO_FILE_SIZE_CHANGED 0x00002000 +#define FO_CLEANUP_COMPLETE 0x00004000 +#define FO_TEMPORARY_FILE 0x00008000 +#define FO_DELETE_ON_CLOSE 0x00010000 +#define FO_OPENED_CASE_SENSITIVE 0x00020000 +#define FO_HANDLE_CREATED 0x00040000 +#define FO_FILE_FAST_IO_READ 0x00080000 +#define FO_RANDOM_ACCESS 0x00100000 +#define FO_FILE_OPEN_CANCELLED 0x00200000 +#define FO_VOLUME_OPEN 0x00400000 +#define FO_FILE_OBJECT_HAS_EXTENSION 0x00800000 +#define FO_REMOTE_ORIGIN 0x01000000 + +typedef struct _FILE_OBJECT { + CSHORT Type; + CSHORT Size; + PDEVICE_OBJECT DeviceObject; + PVPB Vpb; + PVOID FsContext; + PVOID FsContext2; + PSECTION_OBJECT_POINTERS SectionObjectPointer; + PVOID PrivateCacheMap; + NTSTATUS FinalStatus; + struct _FILE_OBJECT *RelatedFileObject; + BOOLEAN LockOperation; + BOOLEAN DeletePending; + BOOLEAN ReadAccess; + BOOLEAN WriteAccess; + BOOLEAN DeleteAccess; + BOOLEAN SharedRead; + BOOLEAN SharedWrite; + BOOLEAN SharedDelete; + ULONG Flags; + UNICODE_STRING FileName; + LARGE_INTEGER CurrentByteOffset; + ULONG Waiters; + ULONG Busy; + PVOID LastLock; + KEVENT Lock; + KEVENT Event; + PIO_COMPLETION_CONTEXT CompletionContext; +} FILE_OBJECT; +typedef struct _FILE_OBJECT *PFILE_OBJECT; + +typedef enum _SECURITY_OPERATION_CODE { + SetSecurityDescriptor, + QuerySecurityDescriptor, + DeleteSecurityDescriptor, + AssignSecurityDescriptor +} SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE; + +#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_SUBJECT_CONTEXT { + PACCESS_TOKEN ClientToken; + SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; + PACCESS_TOKEN PrimaryToken; + PVOID ProcessAuditId; +} SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT; + +typedef struct _ACCESS_STATE { + LUID OperationID; + BOOLEAN SecurityEvaluated; + BOOLEAN GenerateAudit; + BOOLEAN GenerateOnClose; + BOOLEAN PrivilegesAllocated; + ULONG Flags; + ACCESS_MASK RemainingDesiredAccess; + ACCESS_MASK PreviouslyGrantedAccess; + ACCESS_MASK OriginalDesiredAccess; + SECURITY_SUBJECT_CONTEXT SubjectSecurityContext; + PSECURITY_DESCRIPTOR SecurityDescriptor; + PVOID AuxData; + union { + INITIAL_PRIVILEGE_SET InitialPrivilegeSet; + PRIVILEGE_SET PrivilegeSet; + } Privileges; + + BOOLEAN AuditPrivileges; + UNICODE_STRING ObjectName; + UNICODE_STRING ObjectTypeName; +} ACCESS_STATE, *PACCESS_STATE; + +typedef struct _IO_SECURITY_CONTEXT { + PSECURITY_QUALITY_OF_SERVICE SecurityQos; + PACCESS_STATE AccessState; + ACCESS_MASK DesiredAccess; + ULONG FullCreateOptions; +} IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT; + +struct _IO_CSQ; + +typedef struct _IO_CSQ_IRP_CONTEXT { + ULONG Type; + struct _IRP *Irp; + struct _IO_CSQ *Csq; +} IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT; + +typedef VOID DDKAPI +(*PIO_CSQ_INSERT_IRP)( + IN struct _IO_CSQ *Csq, + IN PIRP Irp); + +typedef VOID DDKAPI +(*PIO_CSQ_REMOVE_IRP)( + IN struct _IO_CSQ *Csq, + IN PIRP Irp); + +typedef PIRP DDKAPI +(*PIO_CSQ_PEEK_NEXT_IRP)( + IN struct _IO_CSQ *Csq, + IN PIRP Irp, + IN PVOID PeekContext); + +typedef VOID DDKAPI +(*PIO_CSQ_ACQUIRE_LOCK)( + IN struct _IO_CSQ *Csq, + OUT PKIRQL Irql); + +typedef VOID DDKAPI +(*PIO_CSQ_RELEASE_LOCK)( + IN struct _IO_CSQ *Csq, + IN KIRQL Irql); + +typedef VOID DDKAPI +(*PIO_CSQ_COMPLETE_CANCELED_IRP)( + IN struct _IO_CSQ *Csq, + IN PIRP Irp); + +typedef struct _IO_CSQ { + ULONG Type; + PIO_CSQ_INSERT_IRP CsqInsertIrp; + PIO_CSQ_REMOVE_IRP CsqRemoveIrp; + PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp; + PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock; + PIO_CSQ_RELEASE_LOCK CsqReleaseLock; + PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp; + PVOID ReservePointer; +} IO_CSQ, *PIO_CSQ; + +typedef struct _IO_STACK_LOCATION { + UCHAR MajorFunction; + UCHAR MinorFunction; + UCHAR Flags; + UCHAR Control; + union { + struct { + PIO_SECURITY_CONTEXT SecurityContext; + ULONG Options; + USHORT POINTER_ALIGNMENT FileAttributes; + USHORT ShareAccess; + ULONG POINTER_ALIGNMENT EaLength; + } Create; + struct { + ULONG Length; + ULONG POINTER_ALIGNMENT Key; + LARGE_INTEGER ByteOffset; + } Read; + struct { + ULONG Length; + ULONG POINTER_ALIGNMENT Key; + LARGE_INTEGER ByteOffset; + } Write; + struct { + ULONG Length; + FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass; + } QueryFile; + struct { + ULONG Length; + FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass; + PFILE_OBJECT FileObject; + _ANONYMOUS_UNION union { + _ANONYMOUS_STRUCT struct { + BOOLEAN ReplaceIfExists; + BOOLEAN AdvanceOnly; + } DUMMYSTRUCTNAME; + ULONG ClusterCount; + HANDLE DeleteHandle; + } DUMMYUNIONNAME; + } SetFile; + struct { + ULONG Length; + FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass; + } QueryVolume; + struct { + ULONG OutputBufferLength; + ULONG POINTER_ALIGNMENT InputBufferLength; + ULONG POINTER_ALIGNMENT IoControlCode; + PVOID Type3InputBuffer; + } DeviceIoControl; + struct { + SECURITY_INFORMATION SecurityInformation; + ULONG POINTER_ALIGNMENT Length; + } QuerySecurity; + struct { + SECURITY_INFORMATION SecurityInformation; + PSECURITY_DESCRIPTOR SecurityDescriptor; + } SetSecurity; + struct { + PVPB Vpb; + PDEVICE_OBJECT DeviceObject; + } MountVolume; + struct { + PVPB Vpb; + PDEVICE_OBJECT DeviceObject; + } VerifyVolume; + struct { + struct _SCSI_REQUEST_BLOCK *Srb; + } Scsi; + struct { + DEVICE_RELATION_TYPE Type; + } QueryDeviceRelations; + struct { + CONST GUID *InterfaceType; + USHORT Size; + USHORT Version; + PINTERFACE Interface; + PVOID InterfaceSpecificData; + } QueryInterface; + struct { + PDEVICE_CAPABILITIES Capabilities; + } DeviceCapabilities; + struct { + PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList; + } FilterResourceRequirements; + struct { + ULONG WhichSpace; + PVOID Buffer; + ULONG Offset; + ULONG POINTER_ALIGNMENT Length; + } ReadWriteConfig; + struct { + BOOLEAN Lock; + } SetLock; + struct { + BUS_QUERY_ID_TYPE IdType; + } QueryId; + struct { + DEVICE_TEXT_TYPE DeviceTextType; + LCID POINTER_ALIGNMENT LocaleId; + } QueryDeviceText; + struct { + BOOLEAN InPath; + BOOLEAN Reserved[3]; + DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type; + } UsageNotification; + struct { + SYSTEM_POWER_STATE PowerState; + } WaitWake; + struct { + PPOWER_SEQUENCE PowerSequence; + } PowerSequence; + struct { + ULONG SystemContext; + POWER_STATE_TYPE POINTER_ALIGNMENT Type; + POWER_STATE POINTER_ALIGNMENT State; + POWER_ACTION POINTER_ALIGNMENT ShutdownType; + } Power; + struct { + PCM_RESOURCE_LIST AllocatedResources; + PCM_RESOURCE_LIST AllocatedResourcesTranslated; + } StartDevice; + struct { + ULONG_PTR ProviderId; + PVOID DataPath; + ULONG BufferSize; + PVOID Buffer; + } WMI; + struct { + PVOID Argument1; + PVOID Argument2; + PVOID Argument3; + PVOID Argument4; + } Others; + } Parameters; + PDEVICE_OBJECT DeviceObject; + PFILE_OBJECT FileObject; + PIO_COMPLETION_ROUTINE CompletionRoutine; + PVOID Context; +} IO_STACK_LOCATION, *PIO_STACK_LOCATION; + +/* IO_STACK_LOCATION.Control */ + +#define SL_PENDING_RETURNED 0x01 +#define SL_INVOKE_ON_CANCEL 0x20 +#define SL_INVOKE_ON_SUCCESS 0x40 +#define SL_INVOKE_ON_ERROR 0x80 + +typedef enum _KEY_INFORMATION_CLASS { + KeyBasicInformation, + KeyNodeInformation, + KeyFullInformation, + KeyNameInformation, + KeyCachedInformation, + KeyFlagsInformation +} KEY_INFORMATION_CLASS; + +typedef struct _KEY_BASIC_INFORMATION { + LARGE_INTEGER LastWriteTime; + ULONG TitleIndex; + ULONG NameLength; + WCHAR Name[1]; +} KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION; + +typedef struct _KEY_FULL_INFORMATION { + LARGE_INTEGER LastWriteTime; + ULONG TitleIndex; + ULONG ClassOffset; + ULONG ClassLength; + ULONG SubKeys; + ULONG MaxNameLen; + ULONG MaxClassLen; + ULONG Values; + ULONG MaxValueNameLen; + ULONG MaxValueDataLen; + WCHAR Class[1]; +} KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION; + +typedef struct _KEY_NODE_INFORMATION { + LARGE_INTEGER LastWriteTime; + ULONG TitleIndex; + ULONG ClassOffset; + ULONG ClassLength; + ULONG NameLength; + WCHAR Name[1]; +} KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION; + +typedef struct _KEY_VALUE_BASIC_INFORMATION { + ULONG TitleIndex; + ULONG Type; + ULONG NameLength; + WCHAR Name[1]; +} KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION; + +typedef struct _KEY_VALUE_FULL_INFORMATION { + ULONG TitleIndex; + ULONG Type; + ULONG DataOffset; + ULONG DataLength; + ULONG NameLength; + WCHAR Name[1]; +} KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION; + +typedef struct _KEY_VALUE_PARTIAL_INFORMATION { + ULONG TitleIndex; + ULONG Type; + ULONG DataLength; + UCHAR Data[1]; +} KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION; + +typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 { + ULONG Type; + ULONG DataLength; + UCHAR Data[1]; +} KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64; + +typedef struct _KEY_VALUE_ENTRY { + PUNICODE_STRING ValueName; + ULONG DataLength; + ULONG DataOffset; + ULONG Type; +} KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY; + +typedef enum _KEY_VALUE_INFORMATION_CLASS { + KeyValueBasicInformation, + KeyValueFullInformation, + KeyValuePartialInformation, + KeyValueFullInformationAlign64, + KeyValuePartialInformationAlign64 +} KEY_VALUE_INFORMATION_CLASS; + +/* KEY_VALUE_Xxx.Type */ + +#define REG_NONE 0 +#define REG_SZ 1 +#define REG_EXPAND_SZ 2 +#define REG_BINARY 3 +#define REG_DWORD 4 +#define REG_DWORD_LITTLE_ENDIAN 4 +#define REG_DWORD_BIG_ENDIAN 5 +#define REG_LINK 6 +#define REG_MULTI_SZ 7 +#define REG_RESOURCE_LIST 8 +#define REG_FULL_RESOURCE_DESCRIPTOR 9 +#define REG_RESOURCE_REQUIREMENTS_LIST 10 +#define REG_QWORD 11 +#define REG_QWORD_LITTLE_ENDIAN 11 + +#define PCI_TYPE0_ADDRESSES 6 +#define PCI_TYPE1_ADDRESSES 2 +#define PCI_TYPE2_ADDRESSES 5 + +typedef struct _PCI_COMMON_CONFIG { + USHORT VendorID; + USHORT DeviceID; + USHORT Command; + USHORT Status; + UCHAR RevisionID; + UCHAR ProgIf; + UCHAR SubClass; + UCHAR BaseClass; + UCHAR CacheLineSize; + UCHAR LatencyTimer; + UCHAR HeaderType; + UCHAR BIST; + union { + struct _PCI_HEADER_TYPE_0 { + ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; + ULONG CIS; + USHORT SubVendorID; + USHORT SubSystemID; + ULONG ROMBaseAddress; + UCHAR CapabilitiesPtr; + UCHAR Reserved1[3]; + ULONG Reserved2; + UCHAR InterruptLine; + UCHAR InterruptPin; + UCHAR MinimumGrant; + UCHAR MaximumLatency; + } type0; + struct _PCI_HEADER_TYPE_1 { + ULONG BaseAddresses[PCI_TYPE1_ADDRESSES]; + UCHAR PrimaryBus; + UCHAR SecondaryBus; + UCHAR SubordinateBus; + UCHAR SecondaryLatency; + UCHAR IOBase; + UCHAR IOLimit; + USHORT SecondaryStatus; + USHORT MemoryBase; + USHORT MemoryLimit; + USHORT PrefetchBase; + USHORT PrefetchLimit; + ULONG PrefetchBaseUpper32; + ULONG PrefetchLimitUpper32; + USHORT IOBaseUpper16; + USHORT IOLimitUpper16; + UCHAR CapabilitiesPtr; + UCHAR Reserved1[3]; + ULONG ROMBaseAddress; + UCHAR InterruptLine; + UCHAR InterruptPin; + USHORT BridgeControl; + } type1; + struct _PCI_HEADER_TYPE_2 { + ULONG SocketRegistersBaseAddress; + UCHAR CapabilitiesPtr; + UCHAR Reserved; + USHORT SecondaryStatus; + UCHAR PrimaryBus; + UCHAR SecondaryBus; + UCHAR SubordinateBus; + UCHAR SecondaryLatency; + struct { + ULONG Base; + ULONG Limit; + } Range[PCI_TYPE2_ADDRESSES - 1]; + UCHAR InterruptLine; + UCHAR InterruptPin; + USHORT BridgeControl; + } type2; + } u; + UCHAR DeviceSpecific[192]; +} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG; + +/* PCI_COMMON_CONFIG.Command */ + +#define PCI_ENABLE_IO_SPACE 0x0001 +#define PCI_ENABLE_MEMORY_SPACE 0x0002 +#define PCI_ENABLE_BUS_MASTER 0x0004 +#define PCI_ENABLE_SPECIAL_CYCLES 0x0008 +#define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010 +#define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020 +#define PCI_ENABLE_PARITY 0x0040 +#define PCI_ENABLE_WAIT_CYCLE 0x0080 +#define PCI_ENABLE_SERR 0x0100 +#define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200 + +/* PCI_COMMON_CONFIG.Status */ + +#define PCI_STATUS_CAPABILITIES_LIST 0x0010 +#define PCI_STATUS_66MHZ_CAPABLE 0x0020 +#define PCI_STATUS_UDF_SUPPORTED 0x0040 +#define PCI_STATUS_FAST_BACK_TO_BACK 0x0080 +#define PCI_STATUS_DATA_PARITY_DETECTED 0x0100 +#define PCI_STATUS_DEVSEL 0x0600 +#define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800 +#define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000 +#define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000 +#define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000 +#define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000 + +/* PCI_COMMON_CONFIG.HeaderType */ + +#define PCI_MULTIFUNCTION 0x80 +#define PCI_DEVICE_TYPE 0x00 +#define PCI_BRIDGE_TYPE 0x01 +#define PCI_CARDBUS_BRIDGE_TYPE 0x02 + +#define PCI_CONFIGURATION_TYPE(PciData) \ + (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION) + +#define PCI_MULTIFUNCTION_DEVICE(PciData) \ + ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0) + +typedef struct _PCI_SLOT_NUMBER { + union { + struct { + ULONG DeviceNumber : 5; + ULONG FunctionNumber : 3; + ULONG Reserved : 24; + } bits; + ULONG AsULONG; + } u; +} PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER; + +typedef enum _POOL_TYPE { + NonPagedPool, + PagedPool, + NonPagedPoolMustSucceed, + DontUseThisType, + NonPagedPoolCacheAligned, + PagedPoolCacheAligned, + NonPagedPoolCacheAlignedMustS, + MaxPoolType, + NonPagedPoolSession = 32, + PagedPoolSession, + NonPagedPoolMustSucceedSession, + DontUseThisTypeSession, + NonPagedPoolCacheAlignedSession, + PagedPoolCacheAlignedSession, + NonPagedPoolCacheAlignedMustSSession +} POOL_TYPE; + +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; + +/* PRIVILEGE_SET.Control */ + +#define PRIVILEGE_SET_ALL_NECESSARY 1 + +typedef struct _RTL_OSVERSIONINFOW { + ULONG dwOSVersionInfoSize; + ULONG dwMajorVersion; + ULONG dwMinorVersion; + ULONG dwBuildNumber; + ULONG dwPlatformId; + WCHAR szCSDVersion[128]; +} RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW; + +typedef struct _RTL_OSVERSIONINFOEXW { + ULONG dwOSVersionInfoSize; + ULONG dwMajorVersion; + ULONG dwMinorVersion; + ULONG dwBuildNumber; + ULONG dwPlatformId; + WCHAR szCSDVersion[128]; + USHORT wServicePackMajor; + USHORT wServicePackMinor; + USHORT wSuiteMask; + UCHAR wProductType; + UCHAR wReserved; +} RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW; + +NTOSAPI +ULONGLONG +DDKAPI +VerSetConditionMask( + IN ULONGLONG ConditionMask, + IN ULONG TypeMask, + IN UCHAR Condition); + +#define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \ + ((ConditionMask) = VerSetConditionMask((ConditionMask), \ + (TypeBitMask), (ComparisonType))) + +/* RtlVerifyVersionInfo() TypeMask */ + +#define VER_MINORVERSION 0x0000001 +#define VER_MAJORVERSION 0x0000002 +#define VER_BUILDNUMBER 0x0000004 +#define VER_PLATFORMID 0x0000008 +#define VER_SERVICEPACKMINOR 0x0000010 +#define VER_SERVICEPACKMAJOR 0x0000020 +#define VER_SUITENAME 0x0000040 +#define VER_PRODUCT_TYPE 0x0000080 + +/* RtlVerifyVersionInfo() ComparisonType */ + +#define VER_EQUAL 1 +#define VER_GREATER 2 +#define VER_GREATER_EQUAL 3 +#define VER_LESS 4 +#define VER_LESS_EQUAL 5 +#define VER_AND 6 +#define VER_OR 7 + +#define VER_CONDITION_MASK 7 +#define VER_NUM_BITS_PER_CONDITION_MASK 3 + +typedef struct _RTL_BITMAP { + ULONG SizeOfBitMap; + PULONG Buffer; +} RTL_BITMAP, *PRTL_BITMAP; + +typedef struct _RTL_BITMAP_RUN { + ULONG StartingIndex; + ULONG NumberOfBits; +} RTL_BITMAP_RUN, *PRTL_BITMAP_RUN; + +typedef NTSTATUS DDKAPI +(*PRTL_QUERY_REGISTRY_ROUTINE)( + IN PWSTR ValueName, + IN ULONG ValueType, + IN PVOID ValueData, + IN ULONG ValueLength, + IN PVOID Context, + IN PVOID EntryContext); + +#define RTL_REGISTRY_ABSOLUTE 0 +#define RTL_REGISTRY_SERVICES 1 +#define RTL_REGISTRY_CONTROL 2 +#define RTL_REGISTRY_WINDOWS_NT 3 +#define RTL_REGISTRY_DEVICEMAP 4 +#define RTL_REGISTRY_USER 5 + +/* RTL_QUERY_REGISTRY_TABLE.Flags */ +#define RTL_QUERY_REGISTRY_SUBKEY 0x00000001 +#define RTL_QUERY_REGISTRY_TOPKEY 0x00000002 +#define RTL_QUERY_REGISTRY_REQUIRED 0x00000004 +#define RTL_QUERY_REGISTRY_NOVALUE 0x00000008 +#define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010 +#define RTL_QUERY_REGISTRY_DIRECT 0x00000020 +#define RTL_QUERY_REGISTRY_DELETE 0x00000040 + +typedef struct _RTL_QUERY_REGISTRY_TABLE { + PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine; + ULONG Flags; + PWSTR Name; + PVOID EntryContext; + ULONG DefaultType; + PVOID DefaultData; + ULONG DefaultLength; +} RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE; + +typedef struct _TIME_FIELDS { + CSHORT Year; + CSHORT Month; + CSHORT Day; + CSHORT Hour; + CSHORT Minute; + CSHORT Second; + CSHORT Milliseconds; + CSHORT Weekday; +} TIME_FIELDS, *PTIME_FIELDS; + +typedef PVOID DDKAPI +(*PALLOCATE_FUNCTION)( + IN POOL_TYPE PoolType, + IN SIZE_T NumberOfBytes, + IN ULONG Tag); + +typedef VOID DDKAPI +(*PFREE_FUNCTION)( + IN PVOID Buffer); + +#define GENERAL_LOOKASIDE_S \ + SLIST_HEADER ListHead; \ + USHORT Depth; \ + USHORT MaximumDepth; \ + ULONG TotalAllocates; \ + _ANONYMOUS_UNION union { \ + ULONG AllocateMisses; \ + ULONG AllocateHits; \ + } DUMMYUNIONNAME; \ + ULONG TotalFrees; \ + _ANONYMOUS_UNION union { \ + ULONG FreeMisses; \ + ULONG FreeHits; \ + } DUMMYUNIONNAME2; \ + POOL_TYPE Type; \ + ULONG Tag; \ + ULONG Size; \ + PALLOCATE_FUNCTION Allocate; \ + PFREE_FUNCTION Free; \ + LIST_ENTRY ListEntry; \ + ULONG LastTotalAllocates; \ + _ANONYMOUS_UNION union { \ + ULONG LastAllocateMisses; \ + ULONG LastAllocateHits; \ + } DUMMYUNIONNAME3; \ + ULONG Future[2]; + +typedef struct _GENERAL_LOOKASIDE { + GENERAL_LOOKASIDE_S +} GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE; + +typedef struct _NPAGED_LOOKASIDE_LIST { + GENERAL_LOOKASIDE_S + KSPIN_LOCK Obsoleted; +} NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST; + +typedef struct _PAGED_LOOKASIDE_LIST { + GENERAL_LOOKASIDE_S + FAST_MUTEX Obsoleted; +} PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST; + +typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT; + +typedef VOID DDKAPI (*PCALLBACK_FUNCTION)( + IN PVOID CallbackContext, + IN PVOID Argument1, + IN PVOID Argument2); + +typedef enum _EVENT_TYPE { + NotificationEvent, + SynchronizationEvent +} EVENT_TYPE; + +typedef enum _KWAIT_REASON { + Executive, + FreePage, + PageIn, + PoolAllocation, + DelayExecution, + Suspended, + UserRequest, + WrExecutive, + WrFreePage, + WrPageIn, + WrPoolAllocation, + WrDelayExecution, + WrSuspended, + WrUserRequest, + WrEventPair, + WrQueue, + WrLpcReceive, + WrLpcReply, + WrVirtualMemory, + WrPageOut, + WrRendezvous, + Spare2, + Spare3, + Spare4, + Spare5, + Spare6, + WrKernel, + MaximumWaitReason +} KWAIT_REASON; + +typedef struct _KWAIT_BLOCK { + LIST_ENTRY WaitListEntry; + struct _KTHREAD * RESTRICTED_POINTER Thread; + PVOID Object; + struct _KWAIT_BLOCK * RESTRICTED_POINTER NextWaitBlock; + USHORT WaitKey; + USHORT WaitType; +} KWAIT_BLOCK, *PKWAIT_BLOCK, *RESTRICTED_POINTER PRKWAIT_BLOCK; + +typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK; + +typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK { + BOOLEAN Removed; + BOOLEAN Reserved[3]; + LONG IoCount; + KEVENT RemoveEvent; +} IO_REMOVE_LOCK_COMMON_BLOCK; + +typedef struct _IO_REMOVE_LOCK_DBG_BLOCK { + LONG Signature; + LONG HighWatermark; + LONGLONG MaxLockedTicks; + LONG AllocateTag; + LIST_ENTRY LockList; + KSPIN_LOCK Spin; + LONG LowMemoryCount; + ULONG Reserved1[4]; + PVOID Reserved2; + PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks; +} IO_REMOVE_LOCK_DBG_BLOCK; + +typedef struct _IO_REMOVE_LOCK { + IO_REMOVE_LOCK_COMMON_BLOCK Common; +#ifdef DBG + IO_REMOVE_LOCK_DBG_BLOCK Dbg; +#endif +} IO_REMOVE_LOCK, *PIO_REMOVE_LOCK; + +typedef struct _IO_WORKITEM *PIO_WORKITEM; + +typedef VOID DDKAPI +(*PIO_WORKITEM_ROUTINE)( + IN PDEVICE_OBJECT DeviceObject, + IN PVOID Context); + +typedef struct _SHARE_ACCESS { + ULONG OpenCount; + ULONG Readers; + ULONG Writers; + ULONG Deleters; + ULONG SharedRead; + ULONG SharedWrite; + ULONG SharedDelete; +} SHARE_ACCESS, *PSHARE_ACCESS; + +typedef enum _KINTERRUPT_MODE { + LevelSensitive, + Latched +} KINTERRUPT_MODE; + +typedef VOID DDKAPI +(*PKINTERRUPT_ROUTINE)( + VOID); + +typedef enum _KPROFILE_SOURCE { + ProfileTime, + ProfileAlignmentFixup, + ProfileTotalIssues, + ProfilePipelineDry, + ProfileLoadInstructions, + ProfilePipelineFrozen, + ProfileBranchInstructions, + ProfileTotalNonissues, + ProfileDcacheMisses, + ProfileIcacheMisses, + ProfileCacheMisses, + ProfileBranchMispredictions, + ProfileStoreInstructions, + ProfileFpInstructions, + ProfileIntegerInstructions, + Profile2Issue, + Profile3Issue, + Profile4Issue, + ProfileSpecialInstructions, + ProfileTotalCycles, + ProfileIcacheIssues, + ProfileDcacheAccesses, + ProfileMemoryBarrierCycles, + ProfileLoadLinkedIssues, + ProfileMaximum +} KPROFILE_SOURCE; + +typedef enum _CREATE_FILE_TYPE { + CreateFileTypeNone, + CreateFileTypeNamedPipe, + CreateFileTypeMailslot +} CREATE_FILE_TYPE; + +typedef struct _CONFIGURATION_INFORMATION { + ULONG DiskCount; + ULONG FloppyCount; + ULONG CdRomCount; + ULONG TapeCount; + ULONG ScsiPortCount; + ULONG SerialCount; + ULONG ParallelCount; + BOOLEAN AtDiskPrimaryAddressClaimed; + BOOLEAN AtDiskSecondaryAddressClaimed; + ULONG Version; + ULONG MediumChangerCount; +} CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION; + +typedef enum _CONFIGURATION_TYPE { + ArcSystem, + CentralProcessor, + FloatingPointProcessor, + PrimaryIcache, + PrimaryDcache, + SecondaryIcache, + SecondaryDcache, + SecondaryCache, + EisaAdapter, + TcAdapter, + ScsiAdapter, + DtiAdapter, + MultiFunctionAdapter, + DiskController, + TapeController, + CdromController, + WormController, + SerialController, + NetworkController, + DisplayController, + ParallelController, + PointerController, + KeyboardController, + AudioController, + OtherController, + DiskPeripheral, + FloppyDiskPeripheral, + TapePeripheral, + ModemPeripheral, + MonitorPeripheral, + PrinterPeripheral, + PointerPeripheral, + KeyboardPeripheral, + TerminalPeripheral, + OtherPeripheral, + LinePeripheral, + NetworkPeripheral, + SystemMemory, + DockingInformation, + RealModeIrqRoutingTable, + MaximumType +} CONFIGURATION_TYPE, *PCONFIGURATION_TYPE; + +typedef NTSTATUS (*PIO_QUERY_DEVICE_ROUTINE)( + IN PVOID Context, + IN PUNICODE_STRING PathName, + IN INTERFACE_TYPE BusType, + IN ULONG BusNumber, + IN PKEY_VALUE_FULL_INFORMATION *BusInformation, + IN CONFIGURATION_TYPE ControllerType, + IN ULONG ControllerNumber, + IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation, + IN CONFIGURATION_TYPE PeripheralType, + IN ULONG PeripheralNumber, + IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation); + +typedef enum _WORK_QUEUE_TYPE { + CriticalWorkQueue, + DelayedWorkQueue, + HyperCriticalWorkQueue, + MaximumWorkQueue +} WORK_QUEUE_TYPE; + +typedef VOID DDKAPI +(*PWORKER_THREAD_ROUTINE)( + IN PVOID Parameter); + +typedef struct _WORK_QUEUE_ITEM { + LIST_ENTRY List; + PWORKER_THREAD_ROUTINE WorkerRoutine; + PVOID Parameter; +} WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM; + +typedef enum _KBUGCHECK_BUFFER_DUMP_STATE { + BufferEmpty, + BufferInserted, + BufferStarted, + BufferFinished, + BufferIncomplete +} KBUGCHECK_BUFFER_DUMP_STATE; + +typedef VOID DDKAPI +(*PKBUGCHECK_CALLBACK_ROUTINE)( + IN PVOID Buffer, + IN ULONG Length); + +typedef struct _KBUGCHECK_CALLBACK_RECORD { + LIST_ENTRY Entry; + PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine; + PVOID Buffer; + ULONG Length; + PUCHAR Component; + ULONG_PTR Checksum; + UCHAR State; +} KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD; + +/* + * VOID + * KeInitializeCallbackRecord( + * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord) + */ +#define KeInitializeCallbackRecord(CallbackRecord) \ + CallbackRecord->State = BufferEmpty; + +typedef enum _KDPC_IMPORTANCE { + LowImportance, + MediumImportance, + HighImportance +} KDPC_IMPORTANCE; + +typedef enum _MEMORY_CACHING_TYPE_ORIG { + MmFrameBufferCached = 2 +} MEMORY_CACHING_TYPE_ORIG; + +typedef enum _MEMORY_CACHING_TYPE { + MmNonCached = FALSE, + MmCached = TRUE, + MmWriteCombined = MmFrameBufferCached, + MmHardwareCoherentCached, + MmNonCachedUnordered, + MmUSWCCached, + MmMaximumCacheType +} MEMORY_CACHING_TYPE; + +typedef enum _MM_PAGE_PRIORITY { + LowPagePriority, + NormalPagePriority = 16, + HighPagePriority = 32 +} MM_PAGE_PRIORITY; + +typedef enum _LOCK_OPERATION { + IoReadAccess, + IoWriteAccess, + IoModifyAccess +} LOCK_OPERATION; + +typedef enum _MM_SYSTEM_SIZE { + MmSmallSystem, + MmMediumSystem, + MmLargeSystem +} MM_SYSTEM_SIZE; + +typedef struct _OBJECT_HANDLE_INFORMATION { + ULONG HandleAttributes; + ACCESS_MASK GrantedAccess; +} OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION; + +typedef struct _CLIENT_ID { + HANDLE UniqueProcess; + HANDLE UniqueThread; +} CLIENT_ID, *PCLIENT_ID; + +typedef VOID DDKAPI +(*PKSTART_ROUTINE)( + IN PVOID StartContext); + +typedef VOID DDKAPI +(*PCREATE_PROCESS_NOTIFY_ROUTINE)( + IN HANDLE ParentId, + IN HANDLE ProcessId, + IN BOOLEAN Create); + +typedef VOID DDKAPI +(*PCREATE_THREAD_NOTIFY_ROUTINE)( + IN HANDLE ProcessId, + IN HANDLE ThreadId, + IN BOOLEAN Create); + +typedef struct _IMAGE_INFO { + _ANONYMOUS_UNION union { + ULONG Properties; + _ANONYMOUS_STRUCT struct { + ULONG ImageAddressingMode : 8; + ULONG SystemModeImage : 1; + ULONG ImageMappedToAllPids : 1; + ULONG Reserved : 22; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; + PVOID ImageBase; + ULONG ImageSelector; + SIZE_T ImageSize; + ULONG ImageSectionNumber; +} IMAGE_INFO, *PIMAGE_INFO; + +#define IMAGE_ADDRESSING_MODE_32BIT 3 + +typedef VOID DDKAPI +(*PLOAD_IMAGE_NOTIFY_ROUTINE)( + IN PUNICODE_STRING FullImageName, + IN HANDLE ProcessId, + IN PIMAGE_INFO ImageInfo); + +typedef enum _PROCESSINFOCLASS { + ProcessBasicInformation, + ProcessQuotaLimits, + ProcessIoCounters, + ProcessVmCounters, + ProcessTimes, + ProcessBasePriority, + ProcessRaisePriority, + ProcessDebugPort, + ProcessExceptionPort, + ProcessAccessToken, + ProcessLdtInformation, + ProcessLdtSize, + ProcessDefaultHardErrorMode, + ProcessIoPortHandlers, + ProcessPooledUsageAndLimits, + ProcessWorkingSetWatch, + ProcessUserModeIOPL, + ProcessEnableAlignmentFaultFixup, + ProcessPriorityClass, + ProcessWx86Information, + ProcessHandleCount, + ProcessAffinityMask, + ProcessPriorityBoost, + ProcessDeviceMap, + ProcessSessionInformation, + ProcessForegroundInformation, + ProcessWow64Information, + ProcessImageFileName, + ProcessLUIDDeviceMapsEnabled, + ProcessBreakOnTermination, + ProcessDebugObjectHandle, + ProcessDebugFlags, + ProcessHandleTracing, + MaxProcessInfoClass +} PROCESSINFOCLASS; + +typedef enum _THREADINFOCLASS { + ThreadBasicInformation, + ThreadTimes, + ThreadPriority, + ThreadBasePriority, + ThreadAffinityMask, + ThreadImpersonationToken, + ThreadDescriptorTableEntry, + ThreadEnableAlignmentFaultFixup, + ThreadEventPair_Reusable, + ThreadQuerySetWin32StartAddress, + ThreadZeroTlsCell, + ThreadPerformanceCount, + ThreadAmILastThread, + ThreadIdealProcessor, + ThreadPriorityBoost, + ThreadSetTlsArrayAddress, + ThreadIsIoPending, + ThreadHideFromDebugger, + ThreadBreakOnTermination, + MaxThreadInfoClass +} THREADINFOCLASS; + +#define ES_SYSTEM_REQUIRED 0x00000001 +#define ES_DISPLAY_REQUIRED 0x00000002 +#define ES_USER_PRESENT 0x00000004 +#define ES_CONTINUOUS 0x80000000 + +typedef ULONG EXECUTION_STATE; + +typedef VOID DDKAPI +(*PREQUEST_POWER_COMPLETE)( + IN PDEVICE_OBJECT DeviceObject, + IN UCHAR MinorFunction, + IN POWER_STATE PowerState, + IN PVOID Context, + IN PIO_STATUS_BLOCK IoStatus); + +typedef enum _TRACE_INFORMATION_CLASS { + TraceIdClass, + TraceHandleClass, + TraceEnableFlagsClass, + TraceEnableLevelClass, + GlobalLoggerHandleClass, + EventLoggerHandleClass, + AllLoggerHandlesClass, + TraceHandleByNameClass +} TRACE_INFORMATION_CLASS; + +typedef NTSTATUS DDKAPI +(*PEX_CALLBACK_FUNCTION)( + IN PVOID CallbackContext, + IN PVOID Argument1, + IN PVOID Argument2); + + + +/* +** Storage structures +*/ +typedef enum _PARTITION_STYLE { + PARTITION_STYLE_MBR, + PARTITION_STYLE_GPT +} PARTITION_STYLE; + +typedef struct _CREATE_DISK_MBR { + ULONG Signature; +} CREATE_DISK_MBR, *PCREATE_DISK_MBR; + +typedef struct _CREATE_DISK_GPT { + GUID DiskId; + ULONG MaxPartitionCount; +} CREATE_DISK_GPT, *PCREATE_DISK_GPT; + +typedef struct _CREATE_DISK { + PARTITION_STYLE PartitionStyle; + _ANONYMOUS_UNION union { + CREATE_DISK_MBR Mbr; + CREATE_DISK_GPT Gpt; + } DUMMYUNIONNAME; +} CREATE_DISK, *PCREATE_DISK; + +typedef struct _DISK_SIGNATURE { + ULONG PartitionStyle; + _ANONYMOUS_UNION union { + struct { + ULONG Signature; + ULONG CheckSum; + } Mbr; + struct { + GUID DiskId; + } Gpt; + } DUMMYUNIONNAME; +} DISK_SIGNATURE, *PDISK_SIGNATURE; + +typedef VOID DDKFASTAPI +(*PTIME_UPDATE_NOTIFY_ROUTINE)( + IN HANDLE ThreadId, + IN KPROCESSOR_MODE Mode); + +#define DBG_STATUS_CONTROL_C 1 +#define DBG_STATUS_SYSRQ 2 +#define DBG_STATUS_BUGCHECK_FIRST 3 +#define DBG_STATUS_BUGCHECK_SECOND 4 +#define DBG_STATUS_FATAL 5 +#define DBG_STATUS_DEBUG_CONTROL 6 +#define DBG_STATUS_WORKER 7 + +typedef struct _PHYSICAL_MEMORY_RANGE { + PHYSICAL_ADDRESS BaseAddress; + LARGE_INTEGER NumberOfBytes; +} PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE; + +typedef ULONG_PTR +(*PDRIVER_VERIFIER_THUNK_ROUTINE)( + IN PVOID Context); + +typedef struct _DRIVER_VERIFIER_THUNK_PAIRS { + PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine; + PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine; +} DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS; + +#define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001 +#define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002 +#define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004 +#define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008 +#define DRIVER_VERIFIER_IO_CHECKING 0x0010 + +#define RTL_RANGE_LIST_ADD_IF_CONFLICT 0x00000001 +#define RTL_RANGE_LIST_ADD_SHARED 0x00000002 + +#define RTL_RANGE_LIST_SHARED_OK 0x00000001 +#define RTL_RANGE_LIST_NULL_CONFLICT_OK 0x00000002 + +#define RTL_RANGE_LIST_SHARED_OK 0x00000001 +#define RTL_RANGE_LIST_NULL_CONFLICT_OK 0x00000002 + +#define RTL_RANGE_LIST_MERGE_IF_CONFLICT RTL_RANGE_LIST_ADD_IF_CONFLICT + +typedef struct _RTL_RANGE { + ULONGLONG Start; + ULONGLONG End; + PVOID UserData; + PVOID Owner; + UCHAR Attributes; + UCHAR Flags; +} RTL_RANGE, *PRTL_RANGE; + +#define RTL_RANGE_SHARED 0x01 +#define RTL_RANGE_CONFLICT 0x02 + +typedef struct _RTL_RANGE_LIST { + LIST_ENTRY ListHead; + ULONG Flags; + ULONG Count; + ULONG Stamp; +} RTL_RANGE_LIST, *PRTL_RANGE_LIST; + +typedef struct _RANGE_LIST_ITERATOR { + PLIST_ENTRY RangeListHead; + PLIST_ENTRY MergedHead; + PVOID Current; + ULONG Stamp; +} RTL_RANGE_LIST_ITERATOR, *PRTL_RANGE_LIST_ITERATOR; + +typedef BOOLEAN +(*PRTL_CONFLICT_RANGE_CALLBACK)( + IN PVOID Context, + IN PRTL_RANGE Range); + +#define HASH_STRING_ALGORITHM_DEFAULT 0 +#define HASH_STRING_ALGORITHM_X65599 1 +#define HASH_STRING_ALGORITHM_INVALID 0xffffffff + +typedef enum _SUITE_TYPE { + SmallBusiness, + Enterprise, + BackOffice, + CommunicationServer, + TerminalServer, + SmallBusinessRestricted, + EmbeddedNT, + DataCenter, + SingleUserTS, + Personal, + Blade, + MaxSuiteType +} SUITE_TYPE; + +typedef VOID DDKAPI +(*PTIMER_APC_ROUTINE)( + IN PVOID TimerContext, + IN ULONG TimerLowValue, + IN LONG TimerHighValue); + + + +/* +** WMI structures +*/ + +typedef VOID DDKAPI +(*WMI_NOTIFICATION_CALLBACK)( + PVOID Wnode, + PVOID Context); + + +/* +** Architecture specific structures +*/ + +#ifdef _X86_ + +typedef ULONG PFN_NUMBER, *PPFN_NUMBER; + +#define PASSIVE_LEVEL 0 +#define LOW_LEVEL 0 +#define APC_LEVEL 1 +#define DISPATCH_LEVEL 2 +#define PROFILE_LEVEL 27 +#define CLOCK1_LEVEL 28 +#define CLOCK2_LEVEL 28 +#define IPI_LEVEL 29 +#define POWER_LEVEL 30 +#define HIGH_LEVEL 31 + +typedef struct _KPCR_TIB { + PVOID ExceptionList; /* 00 */ + PVOID StackBase; /* 04 */ + PVOID StackLimit; /* 08 */ + PVOID SubSystemTib; /* 0C */ + _ANONYMOUS_UNION union { + PVOID FiberData; /* 10 */ + DWORD Version; /* 10 */ + } DUMMYUNIONNAME; + PVOID ArbitraryUserPointer; /* 14 */ +} KPCR_TIB, *PKPCR_TIB; /* 18 */ + +#define PCR_MINOR_VERSION 1 +#define PCR_MAJOR_VERSION 1 + +typedef struct _KPCR { + KPCR_TIB Tib; /* 00 */ + struct _KPCR *Self; /* 18 */ + struct _KPRCB *PCRCB; /* 1C */ + KIRQL Irql; /* 20 */ + ULONG IRR; /* 24 */ + ULONG IrrActive; /* 28 */ + ULONG IDR; /* 2C */ + PVOID KdVersionBlock; /* 30 */ + PUSHORT IDT; /* 34 */ + PUSHORT GDT; /* 38 */ + struct _KTSS *TSS; /* 3C */ + USHORT MajorVersion; /* 40 */ + USHORT MinorVersion; /* 42 */ + KAFFINITY SetMember; /* 44 */ + ULONG StallScaleFactor; /* 48 */ + UCHAR DebugActive; /* 4C */ + UCHAR ProcessorNumber; /* 4D */ + UCHAR Reserved[2]; /* 4E */ +} KPCR, *PKPCR; /* 50 */ + +typedef struct _KFLOATING_SAVE { + ULONG ControlWord; + ULONG StatusWord; + ULONG ErrorOffset; + ULONG ErrorSelector; + ULONG DataOffset; + ULONG DataSelector; + ULONG Cr0NpxState; + ULONG Spare1; +} KFLOATING_SAVE, *PKFLOATING_SAVE; + +#define PAGE_SIZE 0x1000 +#define PAGE_SHIFT 12L + +extern NTOSAPI PVOID *MmHighestUserAddress; +extern NTOSAPI PVOID *MmSystemRangeStart; +extern NTOSAPI ULONG *MmUserProbeAddress; + +#define MM_HIGHEST_USER_ADDRESS *MmHighestUserAddress +#define MM_SYSTEM_RANGE_START *MmSystemRangeStart +#define MM_USER_PROBE_ADDRESS *MmUserProbeAddress +#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000 +#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000 + +#define KI_USER_SHARED_DATA 0xffdf0000 +#define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA) + +#define EFLAG_SIGN 0x8000 +#define EFLAG_ZERO 0x4000 +#define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO) + +#define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT) +#define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT) +#define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT) + +typedef enum _INTERLOCKED_RESULT { + ResultNegative = RESULT_NEGATIVE, + ResultZero = RESULT_ZERO, + ResultPositive = RESULT_POSITIVE +} INTERLOCKED_RESULT; + +NTOSAPI +KIRQL +DDKAPI +KeGetCurrentIrql( + VOID); + +/* + * ULONG + * KeGetCurrentProcessorNumber( + * VOID) + */ +#define KeGetCurrentProcessorNumber() \ + ((ULONG)KeGetCurrentKPCR()->ProcessorNumber) + +#if !defined(__INTERLOCKED_DECLARED) +#define __INTERLOCKED_DECLARED + +NTOSAPI +LONG +DDKFASTAPI +InterlockedIncrement( + IN PLONG VOLATILE Addend); + +NTOSAPI +LONG +DDKFASTAPI +InterlockedDecrement( + IN PLONG VOLATILE Addend); + +NTOSAPI +LONG +DDKFASTAPI +InterlockedCompareExchange( + IN OUT PLONG VOLATILE Destination, + IN LONG Exchange, + IN LONG Comparand); + +NTOSAPI +LONG +DDKFASTAPI +InterlockedExchange( + IN OUT PLONG VOLATILE Target, + IN LONG Value); + +NTOSAPI +LONG +DDKFASTAPI +InterlockedExchangeAdd( + IN OUT PLONG VOLATILE Addend, + IN LONG Value); + +/* + * PVOID + * InterlockedExchangePointer( + * IN OUT PVOID VOLATILE *Target, + * IN PVOID Value) + */ +#define InterlockedExchangePointer(Target, Value) \ + ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value)) + +/* + * PVOID + * InterlockedCompareExchangePointer( + * IN OUT PVOID *Destination, + * IN PVOID Exchange, + * IN PVOID Comparand) + */ +#define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \ + ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand)) + +#endif /* !__INTERLOCKED_DECLARED */ + +NTOSAPI +VOID +DDKFASTAPI +KefAcquireSpinLockAtDpcLevel( + IN PKSPIN_LOCK SpinLock); + +NTOSAPI +VOID +DDKFASTAPI +KefReleaseSpinLockFromDpcLevel( + IN PKSPIN_LOCK SpinLock); + +#define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock) +#define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock) + +#define RtlCopyMemoryNonTemporal RtlCopyMemory + +#define KeGetDcacheFillSize() 1L + +#endif /* _X86_ */ + + + +/* +** Utillity functions +*/ + +#define ARGUMENT_PRESENT(ArgumentPointer) \ + ((BOOLEAN) ((PVOID)ArgumentPointer != (PVOID)NULL)) + +/* + * ULONG + * BYTE_OFFSET( + * IN PVOID Va) + */ +#define BYTE_OFFSET(Va) \ + ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1))) + +/* + * ULONG + * BYTES_TO_PAGES( + * IN ULONG Size) + */ +#define BYTES_TO_PAGES(Size) \ + ((ULONG) ((ULONG_PTR) (Size) >> PAGE_SHIFT) + (((ULONG) (Size) & (PAGE_SIZE - 1)) != 0)) + +/* + * PCHAR + * CONTAINING_RECORD( + * IN PCHAR Address, + * IN TYPE Type, + * IN PCHAR Field); + */ +#ifndef CONTAINING_RECORD +#define CONTAINING_RECORD(Address, Type, Field) \ + ((Type *) (((ULONG_PTR) Address) - FIELD_OFFSET(Type, Field))) +#endif + +/* LONG + * FIELD_OFFSET( + * IN TYPE Type, + * IN PCHAR Field); + */ +#ifndef FIELD_OFFSET +#define FIELD_OFFSET(Type, Field) \ + ((LONG) (&(((Type *) 0)->Field))) +#endif + +/* + * PVOID + * PAGE_ALIGN( + * IN PVOID Va) + */ +#define PAGE_ALIGN(Va) \ + ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1))) + +/* + * ULONG_PTR + * ROUND_TO_PAGES( + * IN ULONG_PTR Size) + */ +#define ROUND_TO_PAGES(Size) \ + ((ULONG_PTR) (((ULONG_PTR) Size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))) + +NTOSAPI +VOID +DDKAPI +RtlAssert( + IN PVOID FailedAssertion, + IN PVOID FileName, + IN ULONG LineNumber, + IN PCHAR Message); + +#ifdef DBG + +#define ASSERT(exp) \ + ((!(exp)) ? \ + (RtlAssert( #exp, __FILE__, __LINE__, NULL ), FALSE) : TRUE) + +#define ASSERTMSG(msg, exp) \ + ((!(exp)) ? \ + (RtlAssert( #exp, __FILE__, __LINE__, msg ), FALSE) : TRUE) + +#define RTL_SOFT_ASSERT(exp) \ + ((!(_exp)) ? \ + (DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE) : TRUE) + +#define RTL_SOFT_ASSERTMSG(msg, exp) \ + ((!(exp)) ? \ + (DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE) : TRUE) + +#define RTL_VERIFY(exp) ASSERT(exp) +#define RTL_VERIFYMSG(msg, exp) ASSERT(msg, exp) + +#define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp) +#define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp) + +#else /* !DBG */ + +#define ASSERT(exp) ((VOID) 0) +#define ASSERTMSG(msg, exp) ((VOID) 0) + +#define RTL_SOFT_ASSERT(exp) ((VOID) 0) +#define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0) + +#define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE) +#define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE) + +#define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE) +#define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE) + +#endif /* DBG */ + +#define assert ASSERT + + +/* +** Driver support routines +*/ + +/** Runtime library routines **/ + +/* + * VOID + * InitializeListHead( + * IN PLIST_ENTRY ListHead) + */ +#define InitializeListHead(_ListHead) \ +{ \ + (_ListHead)->Flink = (_ListHead); \ + (_ListHead)->Blink = (_ListHead); \ +} + +/* + * VOID + * InsertHeadList( + * IN PLIST_ENTRY ListHead, + * IN PLIST_ENTRY Entry) + */ +#define InsertHeadList(_ListHead, \ + _Entry) \ +{ \ + PLIST_ENTRY _OldFlink; \ + _OldFlink = (_ListHead)->Flink; \ + (_Entry)->Flink = _OldFlink; \ + (_Entry)->Blink = (_ListHead); \ + _OldFlink->Blink = (_Entry); \ + (_ListHead)->Flink = (_Entry); \ +} + +/* + * VOID + * InsertTailList( + * IN PLIST_ENTRY ListHead, + * IN PLIST_ENTRY Entry) + */ +#define InsertTailList(_ListHead, \ + _Entry) \ +{ \ + PLIST_ENTRY _OldBlink; \ + _OldBlink = (_ListHead)->Blink; \ + (_Entry)->Flink = (_ListHead); \ + (_Entry)->Blink = _OldBlink; \ + _OldBlink->Flink = (_Entry); \ + (_ListHead)->Blink = (_Entry); \ +} + +/* + * BOOLEAN + * IsListEmpty( + * IN PLIST_ENTRY ListHead) + */ +#define IsListEmpty(_ListHead) \ + ((_ListHead)->Flink == (_ListHead)) + +static __inline PSINGLE_LIST_ENTRY +PopEntryList( + IN PSINGLE_LIST_ENTRY ListHead) +{ + PSINGLE_LIST_ENTRY Entry; + + Entry = ListHead->Next; + if (Entry != NULL) + { + ListHead->Next = Entry->Next; + } + return Entry; +} + +/* + * VOID + * PushEntryList( + * IN PSINGLE_LIST_ENTRY ListHead, + * IN PSINGLE_LIST_ENTRY Entry) + */ +#define PushEntryList(_ListHead, \ + _Entry) \ +{ \ + (_Entry)->Next = (_ListHead)->Next; \ + (_ListHead)->Next = (_Entry); \ +} + +/* + * VOID + * RemoveEntryList( + * IN PLIST_ENTRY Entry) + */ +#define RemoveEntryList(_Entry) \ +{ \ + PLIST_ENTRY _OldFlink; \ + PLIST_ENTRY _OldBlink; \ + _OldFlink = (_Entry)->Flink; \ + _OldBlink = (_Entry)->Blink; \ + _OldFlink->Blink = _OldBlink; \ + _OldBlink->Flink = _OldFlink; \ + (_Entry)->Flink = NULL; \ + (_Entry)->Blink = NULL; \ +} + +static __inline PLIST_ENTRY +RemoveHeadList( + IN PLIST_ENTRY ListHead) +{ + PLIST_ENTRY OldFlink; + PLIST_ENTRY OldBlink; + PLIST_ENTRY Entry; + + Entry = ListHead->Flink; + OldFlink = ListHead->Flink->Flink; + OldBlink = ListHead->Flink->Blink; + OldFlink->Blink = OldBlink; + OldBlink->Flink = OldFlink; + + if (Entry != ListHead) + { + Entry->Flink = NULL; + Entry->Blink = NULL; + } + + return Entry; +} + +static __inline PLIST_ENTRY +RemoveTailList( + IN PLIST_ENTRY ListHead) +{ + PLIST_ENTRY OldFlink; + PLIST_ENTRY OldBlink; + PLIST_ENTRY Entry; + + Entry = ListHead->Blink; + OldFlink = ListHead->Blink->Flink; + OldBlink = ListHead->Blink->Blink; + OldFlink->Blink = OldBlink; + OldBlink->Flink = OldFlink; + + if (Entry != ListHead) + { + Entry->Flink = NULL; + Entry->Blink = NULL; + } + + return Entry; +} + +NTOSAPI +PSLIST_ENTRY +DDKFASTAPI +InterlockedPopEntrySList( + IN PSLIST_HEADER ListHead); + +NTOSAPI +PSLIST_ENTRY +DDKFASTAPI +InterlockedPushEntrySList( + IN PSLIST_HEADER ListHead, + IN PSLIST_ENTRY ListEntry); + +/* + * USHORT + * QueryDepthSList( + * IN PSLIST_HEADER SListHead) + */ +#define QueryDepthSList(_SListHead) \ + ((USHORT) ((_SListHead)->Alignment & 0xffff)) + +#define InterlockedFlushSList(ListHead) ExInterlockedFlushSList(ListHead) + +NTOSAPI +ULONG +DDKAPI +RtlAnsiStringToUnicodeSize( + IN PANSI_STRING AnsiString); + +NTOSAPI +NTSTATUS +DDKAPI +RtlAddRange( + IN OUT PRTL_RANGE_LIST RangeList, + IN ULONGLONG Start, + IN ULONGLONG End, + IN UCHAR Attributes, + IN ULONG Flags, + IN PVOID UserData OPTIONAL, + IN PVOID Owner OPTIONAL); + +NTOSAPI +NTSTATUS +DDKAPI +RtlAnsiStringToUnicodeString( + IN OUT PUNICODE_STRING DestinationString, + IN PANSI_STRING SourceString, + IN BOOLEAN AllocateDestinationString); + +NTOSAPI +NTSTATUS +DDKAPI +RtlAppendUnicodeStringToString( + IN OUT PUNICODE_STRING Destination, + IN PUNICODE_STRING Source); + +NTOSAPI +NTSTATUS +DDKAPI +RtlAppendUnicodeToString( + IN OUT PUNICODE_STRING Destination, + IN PCWSTR Source); + +NTOSAPI +BOOLEAN +DDKAPI +RtlAreBitsClear( + IN PRTL_BITMAP BitMapHeader, + IN ULONG StartingIndex, + IN ULONG Length); + +NTOSAPI +BOOLEAN +DDKAPI +RtlAreBitsSet( + IN PRTL_BITMAP BitMapHeader, + IN ULONG StartingIndex, + IN ULONG Length); + +NTOSAPI +NTSTATUS +DDKAPI +RtlCharToInteger( + IN PCSZ String, + IN ULONG Base OPTIONAL, + IN OUT PULONG Value); + +NTOSAPI +ULONG +DDKAPI +RtlCheckBit( + IN PRTL_BITMAP BitMapHeader, + IN ULONG BitPosition); + +NTOSAPI +NTSTATUS +DDKAPI +RtlCheckRegistryKey( + IN ULONG RelativeTo, + IN PWSTR Path); + +NTOSAPI +VOID +DDKAPI +RtlClearAllBits( + IN PRTL_BITMAP BitMapHeader); + +NTOSAPI +VOID +DDKAPI +RtlClearBit( + PRTL_BITMAP BitMapHeader, + ULONG BitNumber); + +NTOSAPI +VOID +DDKAPI +RtlClearBits( + IN PRTL_BITMAP BitMapHeader, + IN ULONG StartingIndex, + IN ULONG NumberToClear); + +NTOSAPI +SIZE_T +DDKAPI +RtlCompareMemory( + IN CONST VOID *Source1, + IN CONST VOID *Source2, + IN SIZE_T Length); + +NTOSAPI +LONG +DDKAPI +RtlCompareString( + IN PSTRING String1, + IN PSTRING String2, + BOOLEAN CaseInSensitive); + +NTOSAPI +LONG +DDKAPI +RtlCompareUnicodeString( + IN PUNICODE_STRING String1, + IN PUNICODE_STRING String2, + IN BOOLEAN CaseInSensitive); + +NTOSAPI +LARGE_INTEGER +DDKAPI +RtlConvertLongToLargeInteger( + IN LONG SignedInteger); + +NTOSAPI +LUID +DDKAPI +RtlConvertLongToLuid( + IN LONG Long); + +NTOSAPI +LARGE_INTEGER +DDKAPI +RtlConvertUlongToLargeInteger( + IN ULONG UnsignedInteger); + +NTOSAPI +LUID +DDKAPI +RtlConvertUlongToLuid( + ULONG Ulong); + +/* + * VOID + * RtlCopyMemory( + * IN VOID UNALIGNED *Destination, + * IN CONST VOID UNALIGNED *Source, + * IN SIZE_T Length) + */ +#ifndef RtlCopyMemory +#define RtlCopyMemory(Destination, Source, Length) \ + memcpy(Destination, Source, Length); +#endif + +#ifndef RtlCopyBytes +#define RtlCopyBytes RtlCopyMemory +#endif + +NTOSAPI +VOID +DDKAPI +RtlCopyMemory32( + IN VOID UNALIGNED *Destination, + IN CONST VOID UNALIGNED *Source, + IN ULONG Length); + +NTOSAPI +NTSTATUS +DDKAPI +RtlCopyRangeList( + OUT PRTL_RANGE_LIST CopyRangeList, + IN PRTL_RANGE_LIST RangeList); + +NTOSAPI +VOID +DDKAPI +RtlCopyString( + IN OUT PSTRING DestinationString, + IN PSTRING SourceString OPTIONAL); + +NTOSAPI +VOID +DDKAPI +RtlCopyUnicodeString( + IN OUT PUNICODE_STRING DestinationString, + IN PUNICODE_STRING SourceString); + +NTOSAPI +NTSTATUS +DDKAPI +RtlCreateRegistryKey( + IN ULONG RelativeTo, + IN PWSTR Path); + +NTOSAPI +NTSTATUS +DDKAPI +RtlCreateSecurityDescriptor( + IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, + IN ULONG Revision); + +NTOSAPI +NTSTATUS +DDKAPI +RtlDeleteOwnersRanges( + IN OUT PRTL_RANGE_LIST RangeList, + IN PVOID Owner); + +NTOSAPI +NTSTATUS +DDKAPI +RtlDeleteRange( + IN OUT PRTL_RANGE_LIST RangeList, + IN ULONGLONG Start, + IN ULONGLONG End, + IN PVOID Owner); + +NTOSAPI +NTSTATUS +DDKAPI +RtlDeleteRegistryValue( + IN ULONG RelativeTo, + IN PCWSTR Path, + IN PCWSTR ValueName); + +/* + * BOOLEAN + * RtlEqualLuid( + * IN LUID Luid1, + * IN LUID Luid2) + */ +#define RtlEqualLuid(_Luid1, \ + _Luid2) \ + ((Luid1.LowPart == Luid2.LowPart) && (Luid1.HighPart == Luid2.HighPart)) + +/* + * ULONG + * RtlEqualMemory( + * IN VOID UNALIGNED *Destination, + * IN CONST VOID UNALIGNED *Source, + * IN SIZE_T Length) + */ +#define RtlEqualMemory(Destination, Source, Length) (!memcmp(Destination, Source, Length)) + +NTOSAPI +BOOLEAN +DDKAPI +RtlEqualString( + IN PSTRING String1, + IN PSTRING String2, + IN BOOLEAN CaseInSensitive); + +NTOSAPI +BOOLEAN +DDKAPI +RtlEqualUnicodeString( + IN CONST UNICODE_STRING *String1, + IN CONST UNICODE_STRING *String2, + IN BOOLEAN CaseInSensitive); + +/* + * VOID + * RtlFillMemory( + * IN VOID UNALIGNED *Destination, + * IN SIZE_T Length, + * IN UCHAR Fill) + */ +#ifndef RtlFillMemory +#define RtlFillMemory(Destination, Length, Fill) \ + memset(Destination, Fill, Length) +#endif + +#ifndef RtlFillBytes +#define RtlFillBytes RtlFillMemory +#endif + +NTOSAPI +ULONG +DDKAPI +RtlFindClearBits( + IN PRTL_BITMAP BitMapHeader, + IN ULONG NumberToFind, + IN ULONG HintIndex); + +NTOSAPI +ULONG +DDKAPI +RtlFindClearBitsAndSet( + IN PRTL_BITMAP BitMapHeader, + IN ULONG NumberToFind, + IN ULONG HintIndex); + +NTOSAPI +ULONG +DDKAPI +RtlFindClearRuns( + IN PRTL_BITMAP BitMapHeader, + OUT PRTL_BITMAP_RUN RunArray, + IN ULONG SizeOfRunArray, + IN BOOLEAN LocateLongestRuns); + +NTOSAPI +ULONG +DDKAPI +RtlFindFirstRunClear( + IN PRTL_BITMAP BitMapHeader, + OUT PULONG StartingIndex); + +NTOSAPI +ULONG +DDKAPI +RtlFindLastBackwardRunClear( + IN PRTL_BITMAP BitMapHeader, + IN ULONG FromIndex, + OUT PULONG StartingRunIndex); + +NTOSAPI +CCHAR +DDKAPI +RtlFindLeastSignificantBit( + IN ULONGLONG Set); + +NTOSAPI +ULONG +DDKAPI +RtlFindLongestRunClear( + IN PRTL_BITMAP BitMapHeader, + OUT PULONG StartingIndex); + +NTOSAPI +CCHAR +DDKAPI +RtlFindMostSignificantBit( + IN ULONGLONG Set); + +NTOSAPI +ULONG +DDKAPI +RtlFindNextForwardRunClear( + IN PRTL_BITMAP BitMapHeader, + IN ULONG FromIndex, + OUT PULONG StartingRunIndex); + +NTOSAPI +NTSTATUS +DDKAPI +RtlFindRange( + IN PRTL_RANGE_LIST RangeList, + IN ULONGLONG Minimum, + IN ULONGLONG Maximum, + IN ULONG Length, + IN ULONG Alignment, + IN ULONG Flags, + IN UCHAR AttributeAvailableMask, + IN PVOID Context OPTIONAL, + IN PRTL_CONFLICT_RANGE_CALLBACK Callback OPTIONAL, + OUT PULONGLONG Start); + +NTOSAPI +ULONG +DDKAPI +RtlFindSetBits( + IN PRTL_BITMAP BitMapHeader, + IN ULONG NumberToFind, + IN ULONG HintIndex); + +NTOSAPI +ULONG +DDKAPI +RtlFindSetBitsAndClear( + IN PRTL_BITMAP BitMapHeader, + IN ULONG NumberToFind, + IN ULONG HintIndex); + +NTOSAPI +VOID +DDKAPI +RtlFreeAnsiString( + IN PANSI_STRING AnsiString); + +NTOSAPI +VOID +DDKAPI +RtlFreeRangeList( + IN PRTL_RANGE_LIST RangeList); + +NTOSAPI +VOID +DDKAPI +RtlFreeUnicodeString( + IN PUNICODE_STRING UnicodeString); + +NTOSAPI +VOID +DDKAPI +RtlGetCallersAddress( + OUT PVOID *CallersAddress, + OUT PVOID *CallersCaller); + +NTOSAPI +NTSTATUS +DDKAPI +RtlGetVersion( + IN OUT PRTL_OSVERSIONINFOW lpVersionInformation); + +NTOSAPI +NTSTATUS +DDKAPI +RtlGetFirstRange( + IN PRTL_RANGE_LIST RangeList, + OUT PRTL_RANGE_LIST_ITERATOR Iterator, + OUT PRTL_RANGE *Range); + +NTOSAPI +NTSTATUS +DDKAPI +RtlGetNextRange( + IN OUT PRTL_RANGE_LIST_ITERATOR Iterator, + OUT PRTL_RANGE *Range, + IN BOOLEAN MoveForwards); + +#define FOR_ALL_RANGES(RangeList, Iterator, Current) \ + for (RtlGetFirstRange((RangeList), (Iterator), &(Current)); \ + (Current) != NULL; \ + RtlGetNextRange((Iterator), &(Current), TRUE)) + +#define FOR_ALL_RANGES_BACKWARDS(RangeList, Iterator, Current) \ + for (RtlGetLastRange((RangeList), (Iterator), &(Current)); \ + (Current) != NULL; \ + RtlGetNextRange((Iterator), &(Current), FALSE)) + +NTOSAPI +NTSTATUS +DDKAPI +RtlGUIDFromString( + IN PUNICODE_STRING GuidString, + OUT GUID *Guid); + +NTOSAPI +NTSTATUS +DDKAPI +RtlHashUnicodeString( + IN CONST UNICODE_STRING *String, + IN BOOLEAN CaseInSensitive, + IN ULONG HashAlgorithm, + OUT PULONG HashValue); + +NTOSAPI +VOID +DDKAPI +RtlInitAnsiString( + IN OUT PANSI_STRING DestinationString, + IN PCSZ SourceString); + +NTOSAPI +VOID +DDKAPI +RtlInitializeBitMap( + IN PRTL_BITMAP BitMapHeader, + IN PULONG BitMapBuffer, + IN ULONG SizeOfBitMap); + +NTOSAPI +VOID +DDKAPI +RtlInitializeRangeList( + IN OUT PRTL_RANGE_LIST RangeList); + +NTOSAPI +VOID +DDKAPI +RtlInitString( + IN OUT PSTRING DestinationString, + IN PCSZ SourceString); + +NTOSAPI +VOID +DDKAPI +RtlInitUnicodeString( + IN OUT PUNICODE_STRING DestinationString, + IN PCWSTR SourceString); + +NTOSAPI +NTSTATUS +DDKAPI +RtlInt64ToUnicodeString( + IN ULONGLONG Value, + IN ULONG Base OPTIONAL, + IN OUT PUNICODE_STRING String); + +NTOSAPI +NTSTATUS +DDKAPI +RtlIntegerToUnicodeString( + IN ULONG Value, + IN ULONG Base OPTIONAL, + IN OUT PUNICODE_STRING String); + +NTOSAPI +NTSTATUS +DDKAPI +RtlIntPtrToUnicodeString( + PLONG Value, + ULONG Base OPTIONAL, + PUNICODE_STRING String); + +NTOSAPI +NTSTATUS +DDKAPI +RtlInvertRangeList( + OUT PRTL_RANGE_LIST InvertedRangeList, + IN PRTL_RANGE_LIST RangeList); + +NTOSAPI +NTSTATUS +DDKAPI +RtlIsRangeAvailable( + IN PRTL_RANGE_LIST RangeList, + IN ULONGLONG Start, + IN ULONGLONG End, + IN ULONG Flags, + IN UCHAR AttributeAvailableMask, + IN PVOID Context OPTIONAL, + IN PRTL_CONFLICT_RANGE_CALLBACK Callback OPTIONAL, + OUT PBOOLEAN Available); + +/* + * BOOLEAN + * RtlIsZeroLuid( + * IN PLUID L1) + */ +#define RtlIsZeroLuid(_L1) \ + ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart))) + +NTOSAPI +ULONG +DDKAPI +RtlLengthSecurityDescriptor( + IN PSECURITY_DESCRIPTOR SecurityDescriptor); + +NTOSAPI +VOID +DDKAPI +RtlMapGenericMask( + IN OUT PACCESS_MASK AccessMask, + IN PGENERIC_MAPPING GenericMapping); + +NTOSAPI +NTSTATUS +DDKAPI +RtlMergeRangeLists( + OUT PRTL_RANGE_LIST MergedRangeList, + IN PRTL_RANGE_LIST RangeList1, + IN PRTL_RANGE_LIST RangeList2, + IN ULONG Flags); + +/* + * VOID + * RtlMoveMemory( + * IN VOID UNALIGNED *Destination, + * IN CONST VOID UNALIGNED *Source, + * IN SIZE_T Length) + */ +#define RtlMoveMemory memmove + +NTOSAPI +ULONG +DDKAPI +RtlNumberOfClearBits( + IN PRTL_BITMAP BitMapHeader); + +NTOSAPI +ULONG +DDKAPI +RtlNumberOfSetBits( + IN PRTL_BITMAP BitMapHeader); + +NTOSAPI +VOID +DDKFASTAPI +RtlPrefetchMemoryNonTemporal( + IN PVOID Source, + IN SIZE_T Length); + +NTOSAPI +BOOLEAN +DDKAPI +RtlPrefixUnicodeString( + IN PUNICODE_STRING String1, + IN PUNICODE_STRING String2, + IN BOOLEAN CaseInSensitive); + +NTOSAPI +NTSTATUS +DDKAPI +RtlQueryRegistryValues( + IN ULONG RelativeTo, + IN PCWSTR Path, + IN PRTL_QUERY_REGISTRY_TABLE QueryTable, + IN PVOID Context, + IN PVOID Environment OPTIONAL); + +NTOSAPI +VOID +DDKAPI +RtlRetrieveUlong( + IN OUT PULONG DestinationAddress, + IN PULONG SourceAddress); + +NTOSAPI +VOID +DDKAPI +RtlRetrieveUshort( + IN OUT PUSHORT DestinationAddress, + IN PUSHORT SourceAddress); + +NTOSAPI +VOID +DDKAPI +RtlSetAllBits( + IN PRTL_BITMAP BitMapHeader); + +NTOSAPI +VOID +DDKAPI +RtlSetBit( + PRTL_BITMAP BitMapHeader, + ULONG BitNumber); + +NTOSAPI +VOID +DDKAPI +RtlSetBits( + IN PRTL_BITMAP BitMapHeader, + IN ULONG StartingIndex, + IN ULONG NumberToSet); + +NTOSAPI +NTSTATUS +DDKAPI +RtlSetDaclSecurityDescriptor( + IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, + IN BOOLEAN DaclPresent, + IN PACL Dacl OPTIONAL, + IN BOOLEAN DaclDefaulted OPTIONAL); + +NTOSAPI +VOID +DDKAPI +RtlStoreUlong( + IN PULONG Address, + IN ULONG Value); + +NTOSAPI +VOID +DDKAPI +RtlStoreUlonglong( + IN OUT PULONGLONG Address, + ULONGLONG Value); + +NTOSAPI +VOID +DDKAPI +RtlStoreUlongPtr( + IN OUT PULONG_PTR Address, + IN ULONG_PTR Value); + +NTOSAPI +VOID +DDKAPI +RtlStoreUshort( + IN PUSHORT Address, + IN USHORT Value); + +NTOSAPI +NTSTATUS +DDKAPI +RtlStringFromGUID( + IN REFGUID Guid, + OUT PUNICODE_STRING GuidString); + +NTOSAPI +BOOLEAN +DDKAPI +RtlTestBit( + IN PRTL_BITMAP BitMapHeader, + IN ULONG BitNumber); + +NTOSAPI +BOOLEAN +DDKAPI +RtlTimeFieldsToTime( + IN PTIME_FIELDS TimeFields, + IN PLARGE_INTEGER Time); + +NTOSAPI +VOID +DDKAPI +RtlTimeToTimeFields( + IN PLARGE_INTEGER Time, + IN PTIME_FIELDS TimeFields); + +NTOSAPI +ULONG +DDKFASTAPI +RtlUlongByteSwap( + IN ULONG Source); + +NTOSAPI +ULONGLONG +DDKFASTAPI +RtlUlonglongByteSwap( + IN ULONGLONG Source); + +NTOSAPI +ULONG +DDKAPI +RtlUnicodeStringToAnsiSize( + IN PUNICODE_STRING UnicodeString); + +NTOSAPI +NTSTATUS +DDKAPI +RtlUnicodeStringToAnsiString( + IN OUT PANSI_STRING DestinationString, + IN PUNICODE_STRING SourceString, + IN BOOLEAN AllocateDestinationString); + +NTOSAPI +NTSTATUS +DDKAPI +RtlUnicodeStringToInteger( + IN PUNICODE_STRING String, + IN ULONG Base OPTIONAL, + OUT PULONG Value); + +NTOSAPI +WCHAR +DDKAPI +RtlUpcaseUnicodeChar( + IN WCHAR SourceCharacter); + +NTOSAPI +NTSTATUS +DDKAPI +RtlUpcaseUnicodeString( + IN OUT PUNICODE_STRING DestinationString OPTIONAL, + IN PCUNICODE_STRING SourceString, + IN BOOLEAN AllocateDestinationString); + +NTOSAPI +CHAR +DDKAPI +RtlUpperChar( + IN CHAR Character); + +NTOSAPI +VOID +DDKAPI +RtlUpperString( + IN OUT PSTRING DestinationString, + IN PSTRING SourceString); + +NTOSAPI +USHORT +DDKFASTAPI +RtlUshortByteSwap( + IN USHORT Source); + +NTOSAPI +BOOLEAN +DDKAPI +RtlValidRelativeSecurityDescriptor( + IN PSECURITY_DESCRIPTOR SecurityDescriptorInput, + IN ULONG SecurityDescriptorLength, + IN SECURITY_INFORMATION RequiredInformation); + +NTOSAPI +BOOLEAN +DDKAPI +RtlValidSecurityDescriptor( + IN PSECURITY_DESCRIPTOR SecurityDescriptor); + +NTOSAPI +NTSTATUS +DDKAPI +RtlVerifyVersionInfo( + IN PRTL_OSVERSIONINFOEXW VersionInfo, + IN ULONG TypeMask, + IN ULONGLONG ConditionMask); + +NTOSAPI +NTSTATUS +DDKAPI +RtlVolumeDeviceToDosName( + IN PVOID VolumeDeviceObject, + OUT PUNICODE_STRING DosName); + +NTOSAPI +ULONG +DDKAPI +RtlWalkFrameChain( + OUT PVOID *Callers, + IN ULONG Count, + IN ULONG Flags); + +NTOSAPI +NTSTATUS +DDKAPI +RtlWriteRegistryValue( + IN ULONG RelativeTo, + IN PCWSTR Path, + IN PCWSTR ValueName, + IN ULONG ValueType, + IN PVOID ValueData, + IN ULONG ValueLength); + +NTOSAPI +ULONG +DDKAPI +RtlxUnicodeStringToAnsiSize( + IN PUNICODE_STRING UnicodeString); + +/* + * VOID + * RtlZeroMemory( + * IN VOID UNALIGNED *Destination, + * IN SIZE_T Length) + */ +#ifndef RtlZeroMemory +#define RtlZeroMemory(Destination, Length) \ + memset(Destination, 0, Length) +#endif + +#ifndef RtlZeroBytes +#define RtlZeroBytes RtlZeroMemory +#endif + + +/** Executive support routines **/ + +NTOSAPI +VOID +DDKFASTAPI +ExAcquireFastMutex( + IN PFAST_MUTEX FastMutex); + +NTOSAPI +VOID +DDKFASTAPI +ExAcquireFastMutexUnsafe( + IN PFAST_MUTEX FastMutex); + +NTOSAPI +BOOLEAN +DDKAPI +ExAcquireResourceExclusiveLite( + IN PERESOURCE Resource, + IN BOOLEAN Wait); + +NTOSAPI +BOOLEAN +DDKAPI +ExAcquireResourceSharedLite( + IN PERESOURCE Resource, + IN BOOLEAN Wait); + +NTOSAPI +BOOLEAN +DDKAPI +ExAcquireSharedStarveExclusive( + IN PERESOURCE Resource, + IN BOOLEAN Wait); + +NTOSAPI +BOOLEAN +DDKAPI +ExAcquireSharedWaitForExclusive( + IN PERESOURCE Resource, + IN BOOLEAN Wait); + +static __inline PVOID +ExAllocateFromNPagedLookasideList( + IN PNPAGED_LOOKASIDE_LIST Lookaside) +{ + PVOID Entry; + + Lookaside->TotalAllocates++; + Entry = InterlockedPopEntrySList(&Lookaside->ListHead); + if (Entry == NULL) { + Lookaside->_DDK_DUMMYUNION_MEMBER(AllocateMisses)++; + Entry = (Lookaside->Allocate)(Lookaside->Type, Lookaside->Size, Lookaside->Tag); + } + return Entry; +} + +static __inline PVOID +ExAllocateFromPagedLookasideList( + IN PPAGED_LOOKASIDE_LIST Lookaside) +{ + PVOID Entry; + + Lookaside->TotalAllocates++; + Entry = InterlockedPopEntrySList(&Lookaside->ListHead); + if (Entry == NULL) { + Lookaside->_DDK_DUMMYUNION_MEMBER(AllocateMisses)++; + Entry = (Lookaside->Allocate)(Lookaside->Type, + Lookaside->Size, Lookaside->Tag); + } + return Entry; +} + +NTOSAPI +PVOID +DDKAPI +ExAllocatePoolWithQuotaTag( + IN POOL_TYPE PoolType, + IN SIZE_T NumberOfBytes, + IN ULONG Tag); + +NTOSAPI +PVOID +DDKAPI +ExAllocatePoolWithTag( + IN POOL_TYPE PoolType, + IN SIZE_T NumberOfBytes, + IN ULONG Tag); + +#ifdef POOL_TAGGING + +#define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD') +#define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD') + +#else /* !POOL_TAGGING */ + +NTOSAPI +PVOID +DDKAPI +ExAllocatePool( + IN POOL_TYPE PoolType, + IN SIZE_T NumberOfBytes); + +NTOSAPI +PVOID +DDKAPI +ExAllocatePoolWithQuota( + IN POOL_TYPE PoolType, + IN SIZE_T NumberOfBytes); + +#endif /* POOL_TAGGING */ + +NTOSAPI +PVOID +DDKAPI +ExAllocatePoolWithTagPriority( + IN POOL_TYPE PoolType, + IN SIZE_T NumberOfBytes, + IN ULONG Tag, + IN EX_POOL_PRIORITY Priority); + +NTOSAPI +VOID +DDKAPI +ExConvertExclusiveToSharedLite( + IN PERESOURCE Resource); + +NTOSAPI +NTSTATUS +DDKAPI +ExCreateCallback( + OUT PCALLBACK_OBJECT *CallbackObject, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN BOOLEAN Create, + IN BOOLEAN AllowMultipleCallbacks); + +NTOSAPI +VOID +DDKAPI +ExDeleteNPagedLookasideList( + IN PNPAGED_LOOKASIDE_LIST Lookaside); + +NTOSAPI +VOID +DDKAPI +ExDeletePagedLookasideList( + IN PPAGED_LOOKASIDE_LIST Lookaside); + +NTOSAPI +NTSTATUS +DDKAPI +ExDeleteResourceLite( + IN PERESOURCE Resource); + +NTOSAPI +VOID +DDKAPI +ExFreePool( + IN PVOID P); + +#define PROTECTED_POOL 0x80000000 + +#ifdef POOL_TAGGING +#define ExFreePool(P) ExFreePoolWithTag(P, 0) +#endif + +NTOSAPI +VOID +DDKAPI +ExFreePoolWithTag( + IN PVOID P, + IN ULONG Tag); + +#define ExQueryDepthSList(ListHead) QueryDepthSList(ListHead) + +static __inline VOID +ExFreeToNPagedLookasideList( + IN PNPAGED_LOOKASIDE_LIST Lookaside, + IN PVOID Entry) +{ + Lookaside->TotalFrees++; + if (ExQueryDepthSList(&Lookaside->ListHead) >= Lookaside->Depth) { + Lookaside->_DDK_DUMMYUNION_N_MEMBER(2,FreeMisses)++; + (Lookaside->Free)(Entry); + } else { + InterlockedPushEntrySList(&Lookaside->ListHead, + (PSLIST_ENTRY)Entry); + } +} + +static __inline VOID +ExFreeToPagedLookasideList( + IN PPAGED_LOOKASIDE_LIST Lookaside, + IN PVOID Entry) +{ + Lookaside->TotalFrees++; + if (ExQueryDepthSList(&Lookaside->ListHead) >= Lookaside->Depth) { + Lookaside->_DDK_DUMMYUNION_N_MEMBER(2,FreeMisses)++; + (Lookaside->Free)(Entry); + } else { + InterlockedPushEntrySList(&Lookaside->ListHead, (PSLIST_ENTRY)Entry); + } +} + +/* + * ERESOURCE_THREAD + * ExGetCurrentResourceThread( + * VOID); + */ +#define ExGetCurrentResourceThread() ((ERESOURCE_THREAD) PsGetCurrentThread()) + +NTOSAPI +ULONG +DDKAPI +ExGetExclusiveWaiterCount( + IN PERESOURCE Resource); + +NTOSAPI +KPROCESSOR_MODE +DDKAPI +ExGetPreviousMode( + VOID); + +NTOSAPI +ULONG +DDKAPI +ExGetSharedWaiterCount( + IN PERESOURCE Resource); + +NTOSAPI +VOID +DDKAPI +KeInitializeEvent( + IN PRKEVENT Event, + IN EVENT_TYPE Type, + IN BOOLEAN State); + +/* + * VOID DDKAPI + * ExInitializeFastMutex( + * IN PFAST_MUTEX FastMutex) + */ +#define ExInitializeFastMutex(_FastMutex) \ +{ \ + (_FastMutex)->Count = 1; \ + (_FastMutex)->Owner = NULL; \ + (_FastMutex)->Contention = 0; \ + KeInitializeEvent(&(_FastMutex)->Event, SynchronizationEvent, FALSE); \ +} + +NTOSAPI +VOID +DDKAPI +ExInitializeNPagedLookasideList( + IN PNPAGED_LOOKASIDE_LIST Lookaside, + IN PALLOCATE_FUNCTION Allocate OPTIONAL, + IN PFREE_FUNCTION Free OPTIONAL, + IN ULONG Flags, + IN SIZE_T Size, + IN ULONG Tag, + IN USHORT Depth); + +NTOSAPI +VOID +DDKAPI +ExInitializePagedLookasideList( + IN PPAGED_LOOKASIDE_LIST Lookaside, + IN PALLOCATE_FUNCTION Allocate OPTIONAL, + IN PFREE_FUNCTION Free OPTIONAL, + IN ULONG Flags, + IN SIZE_T Size, + IN ULONG Tag, + IN USHORT Depth); + +NTOSAPI +NTSTATUS +DDKAPI +ExInitializeResourceLite( + IN PERESOURCE Resource); + +/* + * VOID + * InitializeSListHead( + * IN PSLIST_HEADER SListHead) + */ +#define InitializeSListHead(_SListHead) \ + (_SListHead)->Alignment = 0 + +#define ExInitializeSListHead InitializeSListHead + +NTOSAPI +LARGE_INTEGER +DDKAPI +ExInterlockedAddLargeInteger( + IN PLARGE_INTEGER Addend, + IN LARGE_INTEGER Increment, + IN PKSPIN_LOCK Lock); + +NTOSAPI +VOID +DDKFASTAPI +ExInterlockedAddLargeStatistic( + IN PLARGE_INTEGER Addend, + IN ULONG Increment); + +NTOSAPI +ULONG +DDKFASTAPI +ExInterlockedAddUlong( + IN PULONG Addend, + IN ULONG Increment, + PKSPIN_LOCK Lock); + +NTOSAPI +LONGLONG +DDKFASTAPI +ExInterlockedCompareExchange64( + IN OUT PLONGLONG Destination, + IN PLONGLONG Exchange, + IN PLONGLONG Comparand, + IN PKSPIN_LOCK Lock); + +NTOSAPI +PSINGLE_LIST_ENTRY +DDKFASTAPI +ExInterlockedFlushSList( + IN PSLIST_HEADER ListHead); + +NTOSAPI +PLIST_ENTRY +DDKFASTAPI +ExInterlockedInsertHeadList( + IN PLIST_ENTRY ListHead, + IN PLIST_ENTRY ListEntry, + IN PKSPIN_LOCK Lock); + +NTOSAPI +PLIST_ENTRY +DDKFASTAPI +ExInterlockedInsertTailList( + IN PLIST_ENTRY ListHead, + IN PLIST_ENTRY ListEntry, + IN PKSPIN_LOCK Lock); + +NTOSAPI +PSINGLE_LIST_ENTRY +DDKFASTAPI +ExInterlockedPopEntryList( + IN PSINGLE_LIST_ENTRY ListHead, + IN PKSPIN_LOCK Lock); + +/* + * PSINGLE_LIST_ENTRY + * ExInterlockedPopEntrySList( + * IN PSLIST_HEADER ListHead, + * IN PKSPIN_LOCK Lock) + */ +#define ExInterlockedPopEntrySList(_ListHead, \ + _Lock) \ + InterlockedPopEntrySList(_ListHead) + +NTOSAPI +PSINGLE_LIST_ENTRY +DDKFASTAPI +ExInterlockedPushEntryList( + IN PSINGLE_LIST_ENTRY ListHead, + IN PSINGLE_LIST_ENTRY ListEntry, + IN PKSPIN_LOCK Lock); + +/* + * PSINGLE_LIST_ENTRY FASTCALL + * ExInterlockedPushEntrySList( + * IN PSLIST_HEADER ListHead, + * IN PSINGLE_LIST_ENTRY ListEntry, + * IN PKSPIN_LOCK Lock) + */ +#define ExInterlockedPushEntrySList(_ListHead, \ + _ListEntry, \ + _Lock) \ + InterlockedPushEntrySList(_ListHead, _ListEntry) + +NTOSAPI +PLIST_ENTRY +DDKFASTAPI +ExInterlockedRemoveHeadList( + IN PLIST_ENTRY ListHead, + IN PKSPIN_LOCK Lock); + +NTOSAPI +BOOLEAN +DDKAPI +ExIsProcessorFeaturePresent( + IN ULONG ProcessorFeature); + +NTOSAPI +BOOLEAN +DDKAPI +ExIsResourceAcquiredExclusiveLite( + IN PERESOURCE Resource); + +NTOSAPI +USHORT +DDKAPI +ExIsResourceAcquiredLite( + IN PERESOURCE Resource); + +NTOSAPI +USHORT +DDKAPI +ExIsResourceAcquiredSharedLite( + IN PERESOURCE Resource); + +NTOSAPI +VOID +DDKAPI +ExLocalTimeToSystemTime( + IN PLARGE_INTEGER LocalTime, + OUT PLARGE_INTEGER SystemTime); + +NTOSAPI +VOID +DDKAPI +ExNotifyCallback( + IN PCALLBACK_OBJECT CallbackObject, + IN PVOID Argument1, + IN PVOID Argument2); + +NTOSAPI +VOID +DDKAPI +ExRaiseAccessViolation( + VOID); + +NTOSAPI +VOID +DDKAPI +ExRaiseDatatypeMisalignment( + VOID); + +NTOSAPI +VOID +DDKAPI +ExRaiseStatus( + IN NTSTATUS Status); + +NTOSAPI +PVOID +DDKAPI +ExRegisterCallback( + IN PCALLBACK_OBJECT CallbackObject, + IN PCALLBACK_FUNCTION CallbackFunction, + IN PVOID CallbackContext); + +NTOSAPI +VOID +DDKAPI +ExReinitializeResourceLite( + IN PERESOURCE Resource); + +NTOSAPI +VOID +DDKFASTAPI +ExReleaseFastMutex( + IN PFAST_MUTEX FastMutex); + +NTOSAPI +VOID +DDKFASTAPI +ExReleaseFastMutexUnsafe( + IN PFAST_MUTEX FastMutex); + +NTOSAPI +VOID +DDKAPI +ExReleaseResourceForThreadLite( + IN PERESOURCE Resource, + IN ERESOURCE_THREAD ResourceThreadId); + +NTOSAPI +VOID +DDKFASTAPI +ExReleaseResourceLite( + IN PERESOURCE Resource); + +NTOSAPI +VOID +DDKAPI +ExSetResourceOwnerPointer( + IN PERESOURCE Resource, + IN PVOID OwnerPointer); + +NTOSAPI +ULONG +DDKAPI +ExSetTimerResolution( + IN ULONG DesiredTime, + IN BOOLEAN SetResolution); + +NTOSAPI +VOID +DDKAPI +ExSystemTimeToLocalTime( + IN PLARGE_INTEGER SystemTime, + OUT PLARGE_INTEGER LocalTime); + +NTOSAPI +BOOLEAN +DDKFASTAPI +ExTryToAcquireFastMutex( + IN PFAST_MUTEX FastMutex); + +NTOSAPI +BOOLEAN +DDKAPI +ExTryToAcquireResourceExclusiveLite( + IN PERESOURCE Resource); + +NTOSAPI +VOID +DDKAPI +ExUnregisterCallback( + IN PVOID CbRegistration); + +NTOSAPI +NTSTATUS +DDKAPI +ExUuidCreate( + OUT UUID *Uuid); + +NTOSAPI +BOOLEAN +DDKAPI +ExVerifySuite( + IN SUITE_TYPE SuiteType); + +#ifdef DBG + +#define PAGED_CODE() { \ + if (KeGetCurrentIrql() > APC_LEVEL) { \ + KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \ + assert(FALSE); \ + } \ +} + +#else + +#define PAGED_CODE() + +#endif + +NTOSAPI +VOID +DDKAPI +ProbeForRead( + IN CONST VOID *Address, + IN ULONG Length, + IN ULONG Alignment); + +NTOSAPI +VOID +DDKAPI +ProbeForWrite( + IN CONST VOID *Address, + IN ULONG Length, + IN ULONG Alignment); + + + +/** Configuration manager routines **/ + +NTOSAPI +NTSTATUS +DDKAPI +CmRegisterCallback( + IN PEX_CALLBACK_FUNCTION Function, + IN PVOID Context, + IN OUT PLARGE_INTEGER Cookie); + +NTOSAPI +NTSTATUS +DDKAPI +CmUnRegisterCallback( + IN LARGE_INTEGER Cookie); + + + +/** Filesystem runtime library routines **/ + +NTOSAPI +BOOLEAN +DDKAPI +FsRtlIsTotalDeviceFailure( + IN NTSTATUS Status); + + + +/** Hardware abstraction layer routines **/ + +NTOSAPI +VOID +DDKFASTAPI +HalExamineMBR( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONG MBRTypeIdentifier, + OUT PVOID Buffer); + +NTOSAPI +VOID +DDKAPI +READ_PORT_BUFFER_UCHAR( + IN PUCHAR Port, + IN PUCHAR Buffer, + IN ULONG Count); + +NTOSAPI +VOID +DDKAPI +READ_PORT_BUFFER_ULONG( + IN PULONG Port, + IN PULONG Buffer, + IN ULONG Count); + +NTOSAPI +VOID +DDKAPI +READ_PORT_BUFFER_USHORT( + IN PUSHORT Port, + IN PUSHORT Buffer, + IN ULONG Count); + +NTOSAPI +UCHAR +DDKAPI +READ_PORT_UCHAR( + IN PUCHAR Port); + +NTOSAPI +ULONG +DDKAPI +READ_PORT_ULONG( + IN PULONG Port); + +NTOSAPI +USHORT +DDKAPI +READ_PORT_USHORT( + IN PUSHORT Port); + +NTOSAPI +VOID +DDKAPI +READ_REGISTER_BUFFER_UCHAR( + IN PUCHAR Register, + IN PUCHAR Buffer, + IN ULONG Count); + +NTOSAPI +VOID +DDKAPI +READ_REGISTER_BUFFER_ULONG( + IN PULONG Register, + IN PULONG Buffer, + IN ULONG Count); + +NTOSAPI +VOID +DDKAPI +READ_REGISTER_BUFFER_USHORT( + IN PUSHORT Register, + IN PUSHORT Buffer, + IN ULONG Count); + +NTOSAPI +UCHAR +DDKAPI +READ_REGISTER_UCHAR( + IN PUCHAR Register); + +NTOSAPI +ULONG +DDKAPI +READ_REGISTER_ULONG( + IN PULONG Register); + +NTOSAPI +USHORT +DDKAPI +READ_REGISTER_USHORT( + IN PUSHORT Register); + +NTOSAPI +VOID +DDKAPI +WRITE_PORT_BUFFER_UCHAR( + IN PUCHAR Port, + IN PUCHAR Buffer, + IN ULONG Count); + +NTOSAPI +VOID +DDKAPI +WRITE_PORT_BUFFER_ULONG( + IN PULONG Port, + IN PULONG Buffer, + IN ULONG Count); + +NTOSAPI +VOID +DDKAPI +WRITE_PORT_BUFFER_USHORT( + IN PUSHORT Port, + IN PUSHORT Buffer, + IN ULONG Count); + +NTOSAPI +VOID +DDKAPI +WRITE_PORT_UCHAR( + IN PUCHAR Port, + IN UCHAR Value); + +NTOSAPI +VOID +DDKAPI +WRITE_PORT_ULONG( + IN PULONG Port, + IN ULONG Value); + +NTOSAPI +VOID +DDKAPI +WRITE_PORT_USHORT( + IN PUSHORT Port, + IN USHORT Value); + +NTOSAPI +VOID +DDKAPI +WRITE_REGISTER_BUFFER_UCHAR( + IN PUCHAR Register, + IN PUCHAR Buffer, + IN ULONG Count); + +NTOSAPI +VOID +DDKAPI +WRITE_REGISTER_BUFFER_ULONG( + IN PULONG Register, + IN PULONG Buffer, + IN ULONG Count); + +NTOSAPI +VOID +DDKAPI +WRITE_REGISTER_BUFFER_USHORT( + IN PUSHORT Register, + IN PUSHORT Buffer, + IN ULONG Count); + +NTOSAPI +VOID +DDKAPI +WRITE_REGISTER_UCHAR( + IN PUCHAR Register, + IN UCHAR Value); + +NTOSAPI +VOID +DDKAPI +WRITE_REGISTER_ULONG( + IN PULONG Register, + IN ULONG Value); + +NTOSAPI +VOID +DDKAPI +WRITE_REGISTER_USHORT( + IN PUSHORT Register, + IN USHORT Value); + + + +/** I/O manager routines **/ + +NTOSAPI +VOID +DDKAPI +IoAcquireCancelSpinLock( + OUT PKIRQL Irql); + +NTOSAPI +NTSTATUS +DDKAPI +IoAcquireRemoveLockEx( + IN PIO_REMOVE_LOCK RemoveLock, + IN OPTIONAL PVOID Tag OPTIONAL, + IN PCSTR File, + IN ULONG Line, + IN ULONG RemlockSize); + +/* + * NTSTATUS + * IoAcquireRemoveLock( + * IN PIO_REMOVE_LOCK RemoveLock, + * IN OPTIONAL PVOID Tag) + */ +#define IoAcquireRemoveLock(_RemoveLock, \ + _Tag) \ + IoAcquireRemoveLockEx(_RemoveLock, _Tag, __FILE__, __LINE__, sizeof(IO_REMOVE_LOCK)) + +/* + * VOID + * IoAdjustPagingPathCount( + * IN PLONG Count, + * IN BOOLEAN Increment) + */ +#define IoAdjustPagingPathCount(_Count, \ + _Increment) \ +{ \ + if (_Increment) \ + { \ + InterlockedIncrement(_Count); \ + } \ + else \ + { \ + InterlockedDecrement(_Count); \ + } \ +} + +NTOSAPI +VOID +DDKAPI +IoAllocateController( + IN PCONTROLLER_OBJECT ControllerObject, + IN PDEVICE_OBJECT DeviceObject, + IN PDRIVER_CONTROL ExecutionRoutine, + IN PVOID Context); + +NTOSAPI +NTSTATUS +DDKAPI +IoAllocateDriverObjectExtension( + IN PDRIVER_OBJECT DriverObject, + IN PVOID ClientIdentificationAddress, + IN ULONG DriverObjectExtensionSize, + OUT PVOID *DriverObjectExtension); + +typedef struct _IO_ERROR_LOG_PACKET { + UCHAR MajorFunctionCode; + UCHAR RetryCount; + USHORT DumpDataSize; + USHORT NumberOfStrings; + USHORT StringOffset; + USHORT EventCategory; + NTSTATUS ErrorCode; + ULONG UniqueErrorValue; + NTSTATUS FinalStatus; + ULONG SequenceNumber; + ULONG IoControlCode; + LARGE_INTEGER DeviceOffset; + ULONG DumpData[1]; +} IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET; + +NTOSAPI +PVOID +DDKAPI +IoAllocateErrorLogEntry( + IN PVOID IoObject, + IN UCHAR EntrySize); + +NTOSAPI +PIRP +DDKAPI +IoAllocateIrp( + IN CCHAR StackSize, + IN BOOLEAN ChargeQuota); + +NTOSAPI +PMDL +DDKAPI +IoAllocateMdl( + IN PVOID VirtualAddress, + IN ULONG Length, + IN BOOLEAN SecondaryBuffer, + IN BOOLEAN ChargeQuota, + IN OUT PIRP Irp OPTIONAL); + +NTOSAPI +PIO_WORKITEM +DDKAPI +IoAllocateWorkItem( + IN PDEVICE_OBJECT DeviceObject); + +/* + * VOID IoAssignArcName( + * IN PUNICODE_STRING ArcName, + * IN PUNICODE_STRING DeviceName); + */ +#define IoAssignArcName(_ArcName, _DeviceName) ( \ + IoCreateSymbolicLink((_ArcName), (_DeviceName))) + +NTOSAPI +NTSTATUS +DDKAPI +IoAttachDevice( + IN PDEVICE_OBJECT SourceDevice, + IN PUNICODE_STRING TargetDevice, + OUT PDEVICE_OBJECT *AttachedDevice); + +NTOSAPI +PDEVICE_OBJECT +DDKAPI +IoAttachDeviceToDeviceStack( + IN PDEVICE_OBJECT SourceDevice, + IN PDEVICE_OBJECT TargetDevice); + +NTOSAPI +PIRP +DDKAPI +IoBuildAsynchronousFsdRequest( + IN ULONG MajorFunction, + IN PDEVICE_OBJECT DeviceObject, + IN OUT PVOID Buffer OPTIONAL, + IN ULONG Length OPTIONAL, + IN PLARGE_INTEGER StartingOffset OPTIONAL, + IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL); + +NTOSAPI +PIRP +DDKAPI +IoBuildDeviceIoControlRequest( + IN ULONG IoControlCode, + IN PDEVICE_OBJECT DeviceObject, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength, + IN BOOLEAN InternalDeviceIoControl, + IN PKEVENT Event, + OUT PIO_STATUS_BLOCK IoStatusBlock); + +NTOSAPI +VOID +DDKAPI +IoBuildPartialMdl( + IN PMDL SourceMdl, + IN OUT PMDL TargetMdl, + IN PVOID VirtualAddress, + IN ULONG Length); + +NTOSAPI +PIRP +DDKAPI +IoBuildSynchronousFsdRequest( + IN ULONG MajorFunction, + IN PDEVICE_OBJECT DeviceObject, + IN OUT PVOID Buffer OPTIONAL, + IN ULONG Length OPTIONAL, + IN PLARGE_INTEGER StartingOffset OPTIONAL, + IN PKEVENT Event, + OUT PIO_STATUS_BLOCK IoStatusBlock); + +NTOSAPI +NTSTATUS +DDKFASTAPI +IofCallDriver( + IN PDEVICE_OBJECT DeviceObject, + IN OUT PIRP Irp); + +/* + * NTSTATUS + * IoCallDriver( + * IN PDEVICE_OBJECT DeviceObject, + * IN OUT PIRP Irp) + */ +#define IoCallDriver IofCallDriver + +NTOSAPI +VOID +DDKAPI +IoCancelFileOpen( + IN PDEVICE_OBJECT DeviceObject, + IN PFILE_OBJECT FileObject); + +NTOSAPI +BOOLEAN +DDKAPI +IoCancelIrp( + IN PIRP Irp); + +NTOSAPI +NTSTATUS +DDKAPI +IoCheckShareAccess( + IN ACCESS_MASK DesiredAccess, + IN ULONG DesiredShareAccess, + IN OUT PFILE_OBJECT FileObject, + IN OUT PSHARE_ACCESS ShareAccess, + IN BOOLEAN Update); + +NTOSAPI +VOID +DDKFASTAPI +IofCompleteRequest( + IN PIRP Irp, + IN CCHAR PriorityBoost); + +/* + * VOID + * IoCompleteRequest( + * IN PIRP Irp, + * IN CCHAR PriorityBoost) + */ +#define IoCompleteRequest IofCompleteRequest + +NTOSAPI +NTSTATUS +DDKAPI +IoConnectInterrupt( + OUT PKINTERRUPT *InterruptObject, + IN PKSERVICE_ROUTINE ServiceRoutine, + IN PVOID ServiceContext, + IN PKSPIN_LOCK SpinLock OPTIONAL, + IN ULONG Vector, + IN KIRQL Irql, + IN KIRQL SynchronizeIrql, + IN KINTERRUPT_MODE InterruptMode, + IN BOOLEAN ShareVector, + IN KAFFINITY ProcessorEnableMask, + IN BOOLEAN FloatingSave); + +/* + * PIO_STACK_LOCATION + * IoGetCurrentIrpStackLocation( + * IN PIRP Irp) + */ +#define IoGetCurrentIrpStackLocation(_Irp) \ + ((_Irp)->Tail.Overlay.CurrentStackLocation) + +/* + * PIO_STACK_LOCATION + * IoGetNextIrpStackLocation( + * IN PIRP Irp) + */ +#define IoGetNextIrpStackLocation(_Irp) \ + ((_Irp)->Tail.Overlay.CurrentStackLocation - 1) + +/* + * VOID + * IoCopyCurrentIrpStackLocationToNext( + * IN PIRP Irp) + */ +#define IoCopyCurrentIrpStackLocationToNext(_Irp) \ +{ \ + PIO_STACK_LOCATION _IrpSp; \ + PIO_STACK_LOCATION _NextIrpSp; \ + _IrpSp = IoGetCurrentIrpStackLocation(_Irp); \ + _NextIrpSp = IoGetNextIrpStackLocation(_Irp); \ + RtlCopyMemory(_NextIrpSp, _IrpSp, \ + FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \ + _NextIrpSp->Control = 0; \ +} + +NTOSAPI +PCONTROLLER_OBJECT +DDKAPI +IoCreateController( + IN ULONG Size); + +NTOSAPI +NTSTATUS +DDKAPI +IoCreateDevice( + IN PDRIVER_OBJECT DriverObject, + IN ULONG DeviceExtensionSize, + IN PUNICODE_STRING DeviceName OPTIONAL, + IN DEVICE_TYPE DeviceType, + IN ULONG DeviceCharacteristics, + IN BOOLEAN Exclusive, + OUT PDEVICE_OBJECT *DeviceObject); + +NTOSAPI +NTSTATUS +DDKAPI +IoCreateDisk( + IN PDEVICE_OBJECT DeviceObject, + IN PCREATE_DISK Disk); + +NTOSAPI +NTSTATUS +DDKAPI +IoCreateFile( + 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); + +NTOSAPI +PKEVENT +DDKAPI +IoCreateNotificationEvent( + IN PUNICODE_STRING EventName, + OUT PHANDLE EventHandle); + +NTOSAPI +NTSTATUS +DDKAPI +IoCreateSymbolicLink( + IN PUNICODE_STRING SymbolicLinkName, + IN PUNICODE_STRING DeviceName); + +NTOSAPI +PKEVENT +DDKAPI +IoCreateSynchronizationEvent( + IN PUNICODE_STRING EventName, + OUT PHANDLE EventHandle); + +NTOSAPI +NTSTATUS +DDKAPI +IoCreateUnprotectedSymbolicLink( + IN PUNICODE_STRING SymbolicLinkName, + IN PUNICODE_STRING DeviceName); + +NTOSAPI +VOID +DDKAPI +IoCsqInitialize( + PIO_CSQ Csq, + IN PIO_CSQ_INSERT_IRP CsqInsertIrp, + IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp, + IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp, + IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock, + IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock, + IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp); + +NTOSAPI +VOID +DDKAPI +IoCsqInsertIrp( + IN PIO_CSQ Csq, + IN PIRP Irp, + IN PIO_CSQ_IRP_CONTEXT Context); + +NTOSAPI +PIRP +DDKAPI +IoCsqRemoveIrp( + IN PIO_CSQ Csq, + IN PIO_CSQ_IRP_CONTEXT Context); + +NTOSAPI +PIRP +DDKAPI +IoCsqRemoveNextIrp( + IN PIO_CSQ Csq, + IN PVOID PeekContext); + +NTOSAPI +VOID +DDKAPI +IoDeleteController( + IN PCONTROLLER_OBJECT ControllerObject); + +NTOSAPI +VOID +DDKAPI +IoDeleteDevice( + IN PDEVICE_OBJECT DeviceObject); + +NTOSAPI +NTSTATUS +DDKAPI +IoDeleteSymbolicLink( + IN PUNICODE_STRING SymbolicLinkName); + +/* + * VOID + * IoDeassignArcName( + * IN PUNICODE_STRING ArcName) + */ +#define IoDeassignArcName IoDeleteSymbolicLink + +NTOSAPI +VOID +DDKAPI +IoDetachDevice( + IN OUT PDEVICE_OBJECT TargetDevice); + +NTOSAPI +VOID +DDKAPI +IoDisconnectInterrupt( + IN PKINTERRUPT InterruptObject); + +NTOSAPI +BOOLEAN +DDKAPI +IoForwardIrpSynchronously( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp); + +#define IoForwardAndCatchIrp IoForwardIrpSynchronously + +NTOSAPI +VOID +DDKAPI +IoFreeController( + IN PCONTROLLER_OBJECT ControllerObject); + +NTOSAPI +VOID +DDKAPI +IoFreeErrorLogEntry( + PVOID ElEntry); + +NTOSAPI +VOID +DDKAPI +IoFreeIrp( + IN PIRP Irp); + +NTOSAPI +VOID +DDKAPI +IoFreeMdl( + IN PMDL Mdl); + +NTOSAPI +VOID +DDKAPI +IoFreeWorkItem( + IN PIO_WORKITEM pIOWorkItem); + +NTOSAPI +PDEVICE_OBJECT +DDKAPI +IoGetAttachedDevice( + IN PDEVICE_OBJECT DeviceObject); + +NTOSAPI +PDEVICE_OBJECT +DDKAPI +IoGetAttachedDeviceReference( + IN PDEVICE_OBJECT DeviceObject); + +NTOSAPI +NTSTATUS +DDKAPI +IoGetBootDiskInformation( + IN OUT PBOOTDISK_INFORMATION BootDiskInformation, + IN ULONG Size); + +NTOSAPI +PCONFIGURATION_INFORMATION +DDKAPI +IoGetConfigurationInformation( + VOID); + +NTOSAPI +PEPROCESS +DDKAPI +IoGetCurrentProcess( + VOID); + +NTOSAPI +NTSTATUS +DDKAPI +IoGetDeviceInterfaceAlias( + IN PUNICODE_STRING SymbolicLinkName, + IN CONST GUID *AliasInterfaceClassGuid, + OUT PUNICODE_STRING AliasSymbolicLinkName); + +NTOSAPI +NTSTATUS +DDKAPI +IoGetDeviceInterfaces( + IN CONST GUID *InterfaceClassGuid, + IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL, + IN ULONG Flags, + OUT PWSTR *SymbolicLinkList); + +NTOSAPI +NTSTATUS +DDKAPI +IoGetDeviceObjectPointer( + IN PUNICODE_STRING ObjectName, + IN ACCESS_MASK DesiredAccess, + OUT PFILE_OBJECT *FileObject, + OUT PDEVICE_OBJECT *DeviceObject); + +NTOSAPI +NTSTATUS +DDKAPI +IoGetDeviceProperty( + IN PDEVICE_OBJECT DeviceObject, + IN DEVICE_REGISTRY_PROPERTY DeviceProperty, + IN ULONG BufferLength, + OUT PVOID PropertyBuffer, + OUT PULONG ResultLength); + +NTOSAPI +PDEVICE_OBJECT +DDKAPI +IoGetDeviceToVerify( + IN PETHREAD Thread); + +NTOSAPI +PDMA_ADAPTER +DDKAPI +IoGetDmaAdapter( + IN PDEVICE_OBJECT PhysicalDeviceObject, + IN PDEVICE_DESCRIPTION DeviceDescription, + IN OUT PULONG NumberOfMapRegisters); + +NTOSAPI +PVOID +DDKAPI +IoGetDriverObjectExtension( + IN PDRIVER_OBJECT DriverObject, + IN PVOID ClientIdentificationAddress); + +NTOSAPI +PGENERIC_MAPPING +DDKAPI +IoGetFileObjectGenericMapping( + VOID); + +/* + * ULONG + * IoGetFunctionCodeFromCtlCode( + * IN ULONG ControlCode) + */ +#define IoGetFunctionCodeFromCtlCode(_ControlCode) \ + (((_ControlCode) >> 2) & 0x00000FFF) + +NTOSAPI +PVOID +DDKAPI +IoGetInitialStack( + VOID); + +NTOSAPI +PDEVICE_OBJECT +DDKAPI +IoGetRelatedDeviceObject( + IN PFILE_OBJECT FileObject); + +NTOSAPI +ULONG +DDKAPI +IoGetRemainingStackSize( + VOID); + +NTOSAPI +VOID +DDKAPI +IoGetStackLimits( + OUT PULONG_PTR LowLimit, + OUT PULONG_PTR HighLimit); + +NTOSAPI +VOID +DDKAPI +KeInitializeDpc( + IN PRKDPC Dpc, + IN PKDEFERRED_ROUTINE DeferredRoutine, + IN PVOID DeferredContext); + +/* + * VOID + * IoInitializeDpcRequest( + * IN PDEVICE_OBJECT DeviceObject, + * IN PIO_DPC_ROUTINE DpcRoutine) + */ +#define IoInitializeDpcRequest(_DeviceObject, \ + _DpcRoutine) \ + KeInitializeDpc(&(_DeviceObject)->Dpc, \ + (PKDEFERRED_ROUTINE) (_DpcRoutine), \ + _DeviceObject) + +NTOSAPI +VOID +DDKAPI +IoInitializeIrp( + IN OUT PIRP Irp, + IN USHORT PacketSize, + IN CCHAR StackSize); + +NTOSAPI +VOID +DDKAPI +IoInitializeRemoveLockEx( + IN PIO_REMOVE_LOCK Lock, + IN ULONG AllocateTag, + IN ULONG MaxLockedMinutes, + IN ULONG HighWatermark, + IN ULONG RemlockSize); + +/* VOID + * IoInitializeRemoveLock( + * IN PIO_REMOVE_LOCK Lock, + * IN ULONG AllocateTag, + * IN ULONG MaxLockedMinutes, + * IN ULONG HighWatermark) + */ +#define IoInitializeRemoveLock( \ + Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \ + IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \ + HighWatermark, sizeof(IO_REMOVE_LOCK)) + +NTOSAPI +NTSTATUS +DDKAPI +IoInitializeTimer( + IN PDEVICE_OBJECT DeviceObject, + IN PIO_TIMER_ROUTINE TimerRoutine, + IN PVOID Context); + +NTOSAPI +VOID +DDKAPI +IoInvalidateDeviceRelations( + IN PDEVICE_OBJECT DeviceObject, + IN DEVICE_RELATION_TYPE Type); + +NTOSAPI +VOID +DDKAPI +IoInvalidateDeviceState( + IN PDEVICE_OBJECT PhysicalDeviceObject); + +NTOSAPI +BOOLEAN +DDKAPI +IoIs32bitProcess( + IN PIRP Irp OPTIONAL); + +/* + * BOOLEAN + * IoIsErrorUserInduced( + * IN NTSTATUS Status); + */ +#define IoIsErrorUserInduced(Status) \ + ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \ + ((Status) == STATUS_IO_TIMEOUT) || \ + ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \ + ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \ + ((Status) == STATUS_VERIFY_REQUIRED) || \ + ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \ + ((Status) == STATUS_WRONG_VOLUME))) + +NTOSAPI +BOOLEAN +DDKAPI +IoIsWdmVersionAvailable( + IN UCHAR MajorVersion, + IN UCHAR MinorVersion); + +NTOSAPI +PIRP +DDKAPI +IoMakeAssociatedIrp( + IN PIRP Irp, + IN CCHAR StackSize); + +/* + * VOID + * IoMarkIrpPending( + * IN OUT PIRP Irp) + */ +#define IoMarkIrpPending(_Irp) \ + (IoGetCurrentIrpStackLocation(_Irp)->Control |= SL_PENDING_RETURNED) + +NTOSAPI +NTSTATUS +DDKAPI +IoOpenDeviceInterfaceRegistryKey( + IN PUNICODE_STRING SymbolicLinkName, + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE DeviceInterfaceKey); + +NTOSAPI +NTSTATUS +DDKAPI +IoOpenDeviceRegistryKey( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG DevInstKeyType, + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE DevInstRegKey); + +NTOSAPI +NTSTATUS +DDKAPI +IoQueryDeviceDescription( + IN PINTERFACE_TYPE BusType OPTIONAL, + IN PULONG BusNumber OPTIONAL, + IN PCONFIGURATION_TYPE ControllerType OPTIONAL, + IN PULONG ControllerNumber OPTIONAL, + IN PCONFIGURATION_TYPE PeripheralType OPTIONAL, + IN PULONG PeripheralNumber OPTIONAL, + IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine, + IN PVOID Context); + +NTOSAPI +VOID +DDKAPI +IoQueueWorkItem( + IN PIO_WORKITEM pIOWorkItem, + IN PIO_WORKITEM_ROUTINE Routine, + IN WORK_QUEUE_TYPE QueueType, + IN PVOID Context); + +NTOSAPI +VOID +DDKAPI +IoRaiseHardError( + IN PIRP Irp, + IN PVPB Vpb OPTIONAL, + IN PDEVICE_OBJECT RealDeviceObject); + +NTOSAPI +BOOLEAN +DDKAPI +IoRaiseInformationalHardError( + IN NTSTATUS ErrorStatus, + IN PUNICODE_STRING String OPTIONAL, + IN PKTHREAD Thread OPTIONAL); + +NTOSAPI +NTSTATUS +DDKAPI +IoReadDiskSignature( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG BytesPerSector, + OUT PDISK_SIGNATURE Signature); + +NTOSAPI +NTSTATUS +DDKAPI +IoReadPartitionTableEx( + IN PDEVICE_OBJECT DeviceObject, + IN struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer); + +NTOSAPI +VOID +DDKAPI +IoRegisterBootDriverReinitialization( + IN PDRIVER_OBJECT DriverObject, + IN PDRIVER_REINITIALIZE DriverReinitializationRoutine, + IN PVOID Context); + +NTOSAPI +VOID +DDKAPI +IoRegisterBootDriverReinitialization( + IN PDRIVER_OBJECT DriverObject, + IN PDRIVER_REINITIALIZE DriverReinitializationRoutine, + IN PVOID Context); + +NTOSAPI +NTSTATUS +DDKAPI +IoRegisterDeviceInterface( + IN PDEVICE_OBJECT PhysicalDeviceObject, + IN CONST GUID *InterfaceClassGuid, + IN PUNICODE_STRING ReferenceString OPTIONAL, + OUT PUNICODE_STRING SymbolicLinkName); + +NTOSAPI +VOID +DDKAPI +IoRegisterDriverReinitialization( + IN PDRIVER_OBJECT DriverObject, + IN PDRIVER_REINITIALIZE DriverReinitializationRoutine, + IN PVOID Context); + +NTOSAPI +NTSTATUS +DDKAPI +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); + +NTOSAPI +NTSTATUS +DDKAPI +IoRegisterShutdownNotification( + IN PDEVICE_OBJECT DeviceObject); + +NTOSAPI +VOID +DDKAPI +IoReleaseCancelSpinLock( + IN KIRQL Irql); + +NTOSAPI +VOID +DDKAPI +IoReleaseRemoveLockAndWaitEx( + IN PIO_REMOVE_LOCK RemoveLock, + IN PVOID Tag, + IN ULONG RemlockSize); + +NTOSAPI +VOID +DDKAPI +IoReleaseRemoveLockEx( + IN PIO_REMOVE_LOCK RemoveLock, + IN PVOID Tag, + IN ULONG RemlockSize); + +/* + * VOID + * IoReleaseRemoveLockAndWait( + * IN PIO_REMOVE_LOCK RemoveLock, + * IN PVOID Tag) + */ +#define IoReleaseRemoveLockAndWait(_RemoveLock, \ + _Tag) \ + IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK)) + +NTOSAPI +VOID +DDKAPI +IoRemoveShareAccess( + IN PFILE_OBJECT FileObject, + IN OUT PSHARE_ACCESS ShareAccess); + +NTOSAPI +NTSTATUS +DDKAPI +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); + +NTOSAPI +NTSTATUS +DDKAPI +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); + +NTOSAPI +NTSTATUS +DDKAPI +IoReportResourceUsage( + IN PUNICODE_STRING DriverClassName OPTIONAL, + IN PDRIVER_OBJECT DriverObject, + IN PCM_RESOURCE_LIST DriverList OPTIONAL, + IN ULONG DriverListSize OPTIONAL, + IN PDEVICE_OBJECT DeviceObject, + IN PCM_RESOURCE_LIST DeviceList OPTIONAL, + IN ULONG DeviceListSize OPTIONAL, + IN BOOLEAN OverrideConflict, + OUT PBOOLEAN ConflictDetected); + +NTOSAPI +NTSTATUS +DDKAPI +IoReportTargetDeviceChange( + IN PDEVICE_OBJECT PhysicalDeviceObject, + IN PVOID NotificationStructure); + +NTOSAPI +NTSTATUS +DDKAPI +IoReportTargetDeviceChangeAsynchronous( + IN PDEVICE_OBJECT PhysicalDeviceObject, + IN PVOID NotificationStructure, + IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL, + IN PVOID Context OPTIONAL); + +NTOSAPI +VOID +DDKAPI +IoRequestDeviceEject( + IN PDEVICE_OBJECT PhysicalDeviceObject); + +/* + * VOID + * IoRequestDpc( + * IN PDEVICE_OBJECT DeviceObject, + * IN PIRP Irp, + * IN PVOID Context); + */ +#define IoRequestDpc(DeviceObject, Irp, Context)( \ + KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context))) + +NTOSAPI +VOID +DDKAPI +IoReuseIrp( + IN OUT PIRP Irp, + IN NTSTATUS Status); + +/* + * PDRIVER_CANCEL + * IoSetCancelRoutine( + * IN PIRP Irp, + * IN PDRIVER_CANCEL CancelRoutine) + */ +#define IoSetCancelRoutine(_Irp, \ + _CancelRoutine) \ + ((PDRIVER_CANCEL) InterlockedExchangePointer( \ + (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (_CancelRoutine))) + +/* + * VOID + * IoSetCompletionRoutine( + * IN PIRP Irp, + * IN PIO_COMPLETION_ROUTINE CompletionRoutine, + * IN PVOID Context, + * IN BOOLEAN InvokeOnSuccess, + * IN BOOLEAN InvokeOnError, + * IN BOOLEAN InvokeOnCancel) + */ +#define IoSetCompletionRoutine(_Irp, \ + _CompletionRoutine, \ + _Context, \ + _InvokeOnSuccess, \ + _InvokeOnError, \ + _InvokeOnCancel) \ +{ \ + PIO_STACK_LOCATION _IrpSp; \ + assert(_InvokeOnSuccess || _InvokeOnError || _InvokeOnCancel ? \ + _CompletionRoutine != NULL : TRUE); \ + _IrpSp = IoGetNextIrpStackLocation(_Irp); \ + _IrpSp->CompletionRoutine = (PIO_COMPLETION_ROUTINE)(_CompletionRoutine); \ + _IrpSp->Context = (_Context); \ + _IrpSp->Control = 0; \ + if (_InvokeOnSuccess) _IrpSp->Control = SL_INVOKE_ON_SUCCESS; \ + if (_InvokeOnError) _IrpSp->Control |= SL_INVOKE_ON_ERROR; \ + if (_InvokeOnCancel) _IrpSp->Control |= SL_INVOKE_ON_CANCEL; \ +} + +NTOSAPI +VOID +DDKAPI +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); + +NTOSAPI +NTSTATUS +DDKAPI +IoSetDeviceInterfaceState( + IN PUNICODE_STRING SymbolicLinkName, + IN BOOLEAN Enable); + +NTOSAPI +VOID +DDKAPI +IoSetHardErrorOrVerifyDevice( + IN PIRP Irp, + IN PDEVICE_OBJECT DeviceObject); + +/* + * VOID + * IoSetNextIrpStackLocation( + * IN OUT PIRP Irp) + */ +#define IoSetNextIrpStackLocation(_Irp) \ +{ \ + (_Irp)->CurrentLocation--; \ + (_Irp)->Tail.Overlay.CurrentStackLocation--; \ +} + +NTOSAPI +NTSTATUS +DDKAPI +IoSetPartitionInformationEx( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG PartitionNumber, + IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo); + +NTOSAPI +VOID +DDKAPI +IoSetShareAccess( + IN ACCESS_MASK DesiredAccess, + IN ULONG DesiredShareAccess, + IN OUT PFILE_OBJECT FileObject, + OUT PSHARE_ACCESS ShareAccess); + +NTOSAPI +VOID +DDKAPI +IoSetStartIoAttributes( + IN PDEVICE_OBJECT DeviceObject, + IN BOOLEAN DeferredStartIo, + IN BOOLEAN NonCancelable); + +NTOSAPI +NTSTATUS +DDKAPI +IoSetSystemPartition( + IN PUNICODE_STRING VolumeNameString); + +NTOSAPI +BOOLEAN +DDKAPI +IoSetThreadHardErrorMode( + IN BOOLEAN EnableHardErrors); + +/* + * USHORT + * IoSizeOfIrp( + * IN CCHAR StackSize) + */ +#define IoSizeOfIrp(_StackSize) \ + ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION))))) + +/* + * VOID + * IoSkipCurrentIrpStackLocation( + * IN PIRP Irp) + */ +#define IoSkipCurrentIrpStackLocation(_Irp) \ +{ \ + (_Irp)->CurrentLocation++; \ + (_Irp)->Tail.Overlay.CurrentStackLocation++; \ +} + +NTOSAPI +VOID +DDKAPI +IoStartNextPacket( + IN PDEVICE_OBJECT DeviceObject, + IN BOOLEAN Cancelable); + +NTOSAPI +VOID +DDKAPI +IoStartNextPacketByKey( + IN PDEVICE_OBJECT DeviceObject, + IN BOOLEAN Cancelable, + IN ULONG Key); + +NTOSAPI +VOID +DDKAPI +IoStartPacket( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PULONG Key OPTIONAL, + IN PDRIVER_CANCEL CancelFunction OPTIONAL); + +NTOSAPI +VOID +DDKAPI +IoStartTimer( + IN PDEVICE_OBJECT DeviceObject); + +NTOSAPI +VOID +DDKAPI +IoStopTimer( + IN PDEVICE_OBJECT DeviceObject); + +NTOSAPI +NTSTATUS +DDKAPI +IoUnregisterPlugPlayNotification( + IN PVOID NotificationEntry); + +NTOSAPI +VOID +DDKAPI +IoUnregisterShutdownNotification( + IN PDEVICE_OBJECT DeviceObject); + +NTOSAPI +VOID +DDKAPI +IoUpdateShareAccess( + IN PFILE_OBJECT FileObject, + IN OUT PSHARE_ACCESS ShareAccess); + +NTOSAPI +NTSTATUS +DDKAPI +IoVerifyPartitionTable( + IN PDEVICE_OBJECT DeviceObject, + IN BOOLEAN FixErrors); + +NTOSAPI +NTSTATUS +DDKAPI +IoVolumeDeviceToDosName( + IN PVOID VolumeDeviceObject, + OUT PUNICODE_STRING DosName); + +NTOSAPI +NTSTATUS +DDKAPI +IoWMIAllocateInstanceIds( + IN GUID *Guid, + IN ULONG InstanceCount, + OUT ULONG *FirstInstanceId); + +NTOSAPI +ULONG +DDKAPI +IoWMIDeviceObjectToProviderId( + IN PDEVICE_OBJECT DeviceObject); + +NTOSAPI +NTSTATUS +DDKAPI +IoWMIDeviceObjectToInstanceName( + IN PVOID DataBlockObject, + IN PDEVICE_OBJECT DeviceObject, + OUT PUNICODE_STRING InstanceName); + +NTOSAPI +NTSTATUS +DDKAPI +IoWMIExecuteMethod( + IN PVOID DataBlockObject, + IN PUNICODE_STRING InstanceName, + IN ULONG MethodId, + IN ULONG InBufferSize, + IN OUT PULONG OutBufferSize, + IN OUT PUCHAR InOutBuffer); + +NTOSAPI +NTSTATUS +DDKAPI +IoWMIHandleToInstanceName( + IN PVOID DataBlockObject, + IN HANDLE FileHandle, + OUT PUNICODE_STRING InstanceName); + +NTOSAPI +NTSTATUS +DDKAPI +IoWMIOpenBlock( + IN GUID *DataBlockGuid, + IN ULONG DesiredAccess, + OUT PVOID *DataBlockObject); + +NTOSAPI +NTSTATUS +DDKAPI +IoWMIQueryAllData( + IN PVOID DataBlockObject, + IN OUT ULONG *InOutBufferSize, + OUT PVOID OutBuffer); + +NTOSAPI +NTSTATUS +DDKAPI +IoWMIQueryAllDataMultiple( + IN PVOID *DataBlockObjectList, + IN ULONG ObjectCount, + IN OUT ULONG *InOutBufferSize, + OUT PVOID OutBuffer); + +NTOSAPI +NTSTATUS +DDKAPI +IoWMIQuerySingleInstance( + IN PVOID DataBlockObject, + IN PUNICODE_STRING InstanceName, + IN OUT ULONG *InOutBufferSize, + OUT PVOID OutBuffer); + +NTOSAPI +NTSTATUS +DDKAPI +IoWMIQuerySingleInstanceMultiple( + IN PVOID *DataBlockObjectList, + IN PUNICODE_STRING InstanceNames, + IN ULONG ObjectCount, + IN OUT ULONG *InOutBufferSize, + OUT PVOID OutBuffer); + +NTOSAPI +NTSTATUS +DDKAPI +IoWMIRegistrationControl( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG Action); + +NTOSAPI +NTSTATUS +DDKAPI +IoWMISetNotificationCallback( + IN PVOID Object, + IN WMI_NOTIFICATION_CALLBACK Callback, + IN PVOID Context); + +NTOSAPI +NTSTATUS +DDKAPI +IoWMISetSingleInstance( + IN PVOID DataBlockObject, + IN PUNICODE_STRING InstanceName, + IN ULONG Version, + IN ULONG ValueBufferSize, + IN PVOID ValueBuffer); + +NTOSAPI +NTSTATUS +DDKAPI +IoWMISetSingleItem( + IN PVOID DataBlockObject, + IN PUNICODE_STRING InstanceName, + IN ULONG DataItemId, + IN ULONG Version, + IN ULONG ValueBufferSize, + IN PVOID ValueBuffer); + +NTOSAPI +NTSTATUS +DDKAPI +IoWMISuggestInstanceName( + IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL, + IN PUNICODE_STRING SymbolicLinkName OPTIONAL, + IN BOOLEAN CombineNames, + OUT PUNICODE_STRING SuggestedInstanceName); + +NTOSAPI +NTSTATUS +DDKAPI +IoWMIWriteEvent( + IN PVOID WnodeEventItem); + +NTOSAPI +VOID +DDKAPI +IoWriteErrorLogEntry( + IN PVOID ElEntry); + +NTOSAPI +NTSTATUS +DDKAPI +IoWritePartitionTableEx( + IN PDEVICE_OBJECT DeviceObject, + IN struct _DRIVE_LAYOUT_INFORMATION_EX *PartitionBuffer); + + + +/** Kernel routines **/ + +NTOSAPI +VOID +DDKFASTAPI +KeAcquireInStackQueuedSpinLock( + IN PKSPIN_LOCK SpinLock, + IN PKLOCK_QUEUE_HANDLE LockHandle); + +NTOSAPI +VOID +DDKFASTAPI +KeAcquireInStackQueuedSpinLockAtDpcLevel( + IN PKSPIN_LOCK SpinLock, + IN PKLOCK_QUEUE_HANDLE LockHandle); + +NTOSAPI +KIRQL +DDKAPI +KeAcquireInterruptSpinLock( + IN PKINTERRUPT Interrupt); + +NTOSAPI +VOID +DDKAPI +KeAcquireSpinLock( + IN PKSPIN_LOCK SpinLock, + OUT PKIRQL OldIrql); + +/* System Service Dispatch Table */ +typedef struct _SSDT { + ULONG SysCallPtr; +} SSDT, *PSSDT; + +/* System Service Parameters Table */ +typedef struct _SSPT { + ULONG ParamBytes; +} SSPT, *PSSPT; + +typedef struct _SSDT_ENTRY { + PSSDT SSDT; + PULONG ServiceCounterTable; + ULONG NumberOfServices; + PSSPT SSPT; +} SSDT_ENTRY, *PSSDT_ENTRY; + +NTOSAPI +BOOLEAN +DDKAPI +KeAddSystemServiceTable( + IN PSSDT SSDT, + IN PULONG ServiceCounterTable, + IN ULONG NumberOfServices, + IN PSSPT SSPT, + IN ULONG TableIndex); + +NTOSAPI +BOOLEAN +DDKAPI +KeAreApcsDisabled( + VOID); + +NTOSAPI +VOID +DDKAPI +KeAttachProcess( + IN PEPROCESS Process); + +NTOSAPI +VOID +DDKAPI +KeBugCheck( + IN ULONG BugCheckCode); + +NTOSAPI +VOID +DDKAPI +KeBugCheckEx( + IN ULONG BugCheckCode, + IN ULONG_PTR BugCheckParameter1, + IN ULONG_PTR BugCheckParameter2, + IN ULONG_PTR BugCheckParameter3, + IN ULONG_PTR BugCheckParameter4); + +NTOSAPI +BOOLEAN +DDKAPI +KeCancelTimer( + IN PKTIMER Timer); + +NTOSAPI +VOID +DDKAPI +KeClearEvent( + IN PRKEVENT Event); + +NTOSAPI +NTSTATUS +DDKAPI +KeDelayExecutionThread( + IN KPROCESSOR_MODE WaitMode, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Interval); + +NTOSAPI +BOOLEAN +DDKAPI +KeDeregisterBugCheckCallback( + IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord); + +NTOSAPI +VOID +DDKAPI +KeDetachProcess( + VOID); + +NTOSAPI +VOID +DDKAPI +KeEnterCriticalRegion( + VOID); + +/* + * VOID + * KeFlushIoBuffers( + * IN PMDL Mdl, + * IN BOOLEAN ReadOperation, + * IN BOOLEAN DmaOperation) + */ +#define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation) + +NTOSAPI +PRKTHREAD +DDKAPI +KeGetCurrentThread( + VOID); + +NTOSAPI +KPROCESSOR_MODE +DDKAPI +KeGetPreviousMode( + VOID); + +NTOSAPI +ULONG +DDKAPI +KeGetRecommendedSharedDataAlignment( + VOID); + +NTOSAPI +VOID +DDKAPI +KeInitializeApc( + IN PKAPC Apc, + IN PKTHREAD Thread, + IN UCHAR StateIndex, + IN PKKERNEL_ROUTINE KernelRoutine, + IN PKRUNDOWN_ROUTINE RundownRoutine, + IN PKNORMAL_ROUTINE NormalRoutine, + IN UCHAR Mode, + IN PVOID Context); + +NTOSAPI +VOID +DDKAPI +KeInitializeDeviceQueue( + IN PKDEVICE_QUEUE DeviceQueue); + +NTOSAPI +VOID +DDKAPI +KeInitializeMutex( + IN PRKMUTEX Mutex, + IN ULONG Level); + +NTOSAPI +VOID +DDKAPI +KeInitializeSemaphore( + IN PRKSEMAPHORE Semaphore, + IN LONG Count, + IN LONG Limit); + +NTOSAPI +VOID +DDKAPI +KeInitializeSpinLock( + IN PKSPIN_LOCK SpinLock); + +NTOSAPI +VOID +DDKAPI +KeInitializeTimer( + IN PKTIMER Timer); + +NTOSAPI +VOID +DDKAPI +KeInitializeTimerEx( + IN PKTIMER Timer, + IN TIMER_TYPE Type); + +NTOSAPI +BOOLEAN +DDKAPI +KeInsertByKeyDeviceQueue( + IN PKDEVICE_QUEUE DeviceQueue, + IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry, + IN ULONG SortKey); + +NTOSAPI +BOOLEAN +DDKAPI +KeInsertDeviceQueue( + IN PKDEVICE_QUEUE DeviceQueue, + IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry); + +NTOSAPI +BOOLEAN +DDKAPI +KeInsertQueueDpc( + IN PRKDPC Dpc, + IN PVOID SystemArgument1, + IN PVOID SystemArgument2); + +NTOSAPI +VOID +DDKAPI +KeLeaveCriticalRegion( + VOID); + +NTOSAPI +VOID +DDKAPI +KeLowerIrql( + IN KIRQL NewIrql); + +NTOSAPI +NTSTATUS +DDKAPI +KePulseEvent( + IN PRKEVENT Event, + IN KPRIORITY Increment, + IN BOOLEAN Wait); + +NTOSAPI +ULONGLONG +DDKAPI +KeQueryInterruptTime( + VOID); + +NTOSAPI +LARGE_INTEGER +DDKAPI +KeQueryPerformanceCounter( + OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL); + +NTOSAPI +KPRIORITY +DDKAPI +KeQueryPriorityThread( + IN PRKTHREAD Thread); + +NTOSAPI +VOID +DDKAPI +KeQuerySystemTime( + OUT PLARGE_INTEGER CurrentTime); + +NTOSAPI +VOID +DDKAPI +KeQueryTickCount( + OUT PLARGE_INTEGER TickCount); + +NTOSAPI +ULONG +DDKAPI +KeQueryTimeIncrement( + VOID); + +NTOSAPI +VOID +DDKAPI +KeRaiseIrql( + IN KIRQL NewIrql, + OUT PKIRQL OldIrql); + +NTOSAPI +KIRQL +DDKAPI +KeRaiseIrqlToDpcLevel( + VOID); + +NTOSAPI +LONG +DDKAPI +KeReadStateEvent( + IN PRKEVENT Event); + +NTOSAPI +LONG +DDKAPI +KeReadStateMutex( + IN PRKMUTEX Mutex); + +NTOSAPI +LONG +DDKAPI +KeReadStateSemaphore( + IN PRKSEMAPHORE Semaphore); + +NTOSAPI +BOOLEAN +DDKAPI +KeReadStateTimer( + IN PKTIMER Timer); + +NTOSAPI +BOOLEAN +DDKAPI +KeRegisterBugCheckCallback( + IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord, + IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine, + IN PVOID Buffer, + IN ULONG Length, + IN PUCHAR Component); + +NTOSAPI +VOID +DDKFASTAPI +KeReleaseInStackQueuedSpinLock( + IN PKLOCK_QUEUE_HANDLE LockHandle); + +NTOSAPI +VOID +DDKFASTAPI +KeReleaseInStackQueuedSpinLockFromDpcLevel( + IN PKLOCK_QUEUE_HANDLE LockHandle); + +NTOSAPI +VOID +DDKAPI +KeReleaseInterruptSpinLock( + IN PKINTERRUPT Interrupt, + IN KIRQL OldIrql); + +NTOSAPI +LONG +DDKAPI +KeReleaseMutex( + IN PRKMUTEX Mutex, + IN BOOLEAN Wait); + +NTOSAPI +LONG +DDKAPI +KeReleaseSemaphore( + IN PRKSEMAPHORE Semaphore, + IN KPRIORITY Increment, + IN LONG Adjustment, + IN BOOLEAN Wait); + +NTOSAPI +VOID +DDKAPI +KeReleaseSpinLock( + IN PKSPIN_LOCK SpinLock, + IN KIRQL NewIrql); + +NTOSAPI +PKDEVICE_QUEUE_ENTRY +DDKAPI +KeRemoveByKeyDeviceQueue( + IN PKDEVICE_QUEUE DeviceQueue, + IN ULONG SortKey); + +NTOSAPI +PKDEVICE_QUEUE_ENTRY +DDKAPI +KeRemoveDeviceQueue( + IN PKDEVICE_QUEUE DeviceQueue); + +NTOSAPI +BOOLEAN +DDKAPI +KeRemoveEntryDeviceQueue( + IN PKDEVICE_QUEUE DeviceQueue, + IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry); + +NTOSAPI +BOOLEAN +DDKAPI +KeRemoveQueueDpc( + IN PRKDPC Dpc); + +NTOSAPI +LONG +DDKAPI +KeResetEvent( + IN PRKEVENT Event); + +NTOSAPI +NTSTATUS +DDKAPI +KeRestoreFloatingPointState( + IN PKFLOATING_SAVE FloatSave); + +NTOSAPI +NTSTATUS +DDKAPI +KeSaveFloatingPointState( + OUT PKFLOATING_SAVE FloatSave); + +NTOSAPI +LONG +DDKAPI +KeSetBasePriorityThread( + IN PRKTHREAD Thread, + IN LONG Increment); + +NTOSAPI +LONG +DDKAPI +KeSetEvent( + IN PRKEVENT Event, + IN KPRIORITY Increment, + IN BOOLEAN Wait); + +NTOSAPI +VOID +DDKAPI +KeSetImportanceDpc( + IN PRKDPC Dpc, + IN KDPC_IMPORTANCE Importance); + +NTOSAPI +KPRIORITY +DDKAPI +KeSetPriorityThread( + IN PKTHREAD Thread, + IN KPRIORITY Priority); + +NTOSAPI +VOID +DDKAPI +KeSetTargetProcessorDpc( + IN PRKDPC Dpc, + IN CCHAR Number); + +NTOSAPI +BOOLEAN +DDKAPI +KeSetTimer( + IN PKTIMER Timer, + IN LARGE_INTEGER DueTime, + IN PKDPC Dpc OPTIONAL); + +NTOSAPI +BOOLEAN +DDKAPI +KeSetTimerEx( + IN PKTIMER Timer, + IN LARGE_INTEGER DueTime, + IN LONG Period OPTIONAL, + IN PKDPC Dpc OPTIONAL); + +NTOSAPI +VOID +DDKFASTAPI +KeSetTimeUpdateNotifyRoutine( + IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine); + +NTOSAPI +VOID +DDKAPI +KeStallExecutionProcessor( + IN ULONG MicroSeconds); + +NTOSAPI +BOOLEAN +DDKAPI +KeSynchronizeExecution( + IN PKINTERRUPT Interrupt, + IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine, + IN PVOID SynchronizeContext); + +NTOSAPI +NTSTATUS +DDKAPI +KeWaitForMultipleObjects( + IN ULONG Count, + IN PVOID Object[], + IN WAIT_TYPE WaitType, + IN KWAIT_REASON WaitReason, + IN KPROCESSOR_MODE WaitMode, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Timeout OPTIONAL, + IN PKWAIT_BLOCK WaitBlockArray OPTIONAL); + +NTOSAPI +NTSTATUS +DDKAPI +KeWaitForMutexObject( + IN PRKMUTEX Mutex, + IN KWAIT_REASON WaitReason, + IN KPROCESSOR_MODE WaitMode, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Timeout OPTIONAL); + +NTOSAPI +NTSTATUS +DDKAPI +KeWaitForSingleObject( + IN PVOID Object, + IN KWAIT_REASON WaitReason, + IN KPROCESSOR_MODE WaitMode, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Timeout OPTIONAL); + + + +/** Memory manager routines **/ + +NTOSAPI +NTSTATUS +DDKAPI +MmAdvanceMdl( + IN PMDL Mdl, + IN ULONG NumberOfBytes); + +NTOSAPI +PVOID +DDKAPI +MmAllocateContiguousMemory( + IN ULONG NumberOfBytes, + IN PHYSICAL_ADDRESS HighestAcceptableAddress); + +NTOSAPI +PVOID +DDKAPI +MmAllocateContiguousMemorySpecifyCache( + IN SIZE_T NumberOfBytes, + IN PHYSICAL_ADDRESS LowestAcceptableAddress, + IN PHYSICAL_ADDRESS HighestAcceptableAddress, + IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL, + IN MEMORY_CACHING_TYPE CacheType); + +NTOSAPI +PVOID +DDKAPI +MmAllocateMappingAddress( + IN SIZE_T NumberOfBytes, + IN ULONG PoolTag); + +NTOSAPI +PVOID +DDKAPI +MmAllocateNonCachedMemory( + IN ULONG NumberOfBytes); + +NTOSAPI +PMDL +DDKAPI +MmAllocatePagesForMdl( + IN PHYSICAL_ADDRESS LowAddress, + IN PHYSICAL_ADDRESS HighAddress, + IN PHYSICAL_ADDRESS SkipBytes, + IN SIZE_T TotalBytes); + +NTOSAPI +VOID +DDKAPI +MmBuildMdlForNonPagedPool( + IN OUT PMDL MemoryDescriptorList); + +NTOSAPI +NTSTATUS +DDKAPI +MmCreateSection( + OUT PSECTION_OBJECT *SectionObject, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN PLARGE_INTEGER MaximumSize, + IN ULONG SectionPageProtection, + IN ULONG AllocationAttributes, + IN HANDLE FileHandle OPTIONAL, + IN PFILE_OBJECT File OPTIONAL); + +typedef enum _MMFLUSH_TYPE { + MmFlushForDelete, + MmFlushForWrite +} MMFLUSH_TYPE; + +NTOSAPI +BOOLEAN +DDKAPI +MmFlushImageSection( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN MMFLUSH_TYPE FlushType); + +NTOSAPI +VOID +DDKAPI +MmFreeContiguousMemory( + IN PVOID BaseAddress); + +NTOSAPI +VOID +DDKAPI +MmFreeContiguousMemorySpecifyCache( + IN PVOID BaseAddress, + IN SIZE_T NumberOfBytes, + IN MEMORY_CACHING_TYPE CacheType); + +NTOSAPI +VOID +DDKAPI +MmFreeMappingAddress( + IN PVOID BaseAddress, + IN ULONG PoolTag); + +NTOSAPI +VOID +DDKAPI +MmFreeNonCachedMemory( + IN PVOID BaseAddress, + IN SIZE_T NumberOfBytes); + +NTOSAPI +VOID +DDKAPI +MmFreePagesFromMdl( + IN PMDL MemoryDescriptorList); + +/* + * ULONG + * MmGetMdlByteCount( + * IN PMDL Mdl) + */ +#define MmGetMdlByteCount(_Mdl) \ + ((_Mdl)->ByteCount) + +/* + * ULONG + * MmGetMdlByteOffset( + * IN PMDL Mdl) + */ +#define MmGetMdlByteOffset(_Mdl) \ + ((_Mdl)->ByteOffset) + +/* + * PPFN_NUMBER + * MmGetMdlPfnArray( + * IN PMDL Mdl) + */ +#define MmGetMdlPfnArray(_Mdl) \ + ((PPFN_NUMBER) ((_Mdl) + 1)) + +/* + * PVOID + * MmGetMdlVirtualAddress( + * IN PMDL Mdl) + */ +#define MmGetMdlVirtualAddress(_Mdl) \ + ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset)) + +NTOSAPI +PHYSICAL_ADDRESS +DDKAPI +MmGetPhysicalAddress( + IN PVOID BaseAddress); + +NTOSAPI +PPHYSICAL_MEMORY_RANGE +DDKAPI +MmGetPhysicalMemoryRanges( + VOID); + +NTOSAPI +PVOID +DDKAPI +MmGetVirtualForPhysical( + IN PHYSICAL_ADDRESS PhysicalAddress); + +NTOSAPI +PVOID +DDKAPI +MmMapLockedPagesSpecifyCache( + IN PMDL MemoryDescriptorList, + IN KPROCESSOR_MODE AccessMode, + IN MEMORY_CACHING_TYPE CacheType, + IN PVOID BaseAddress, + IN ULONG BugCheckOnFailure, + IN MM_PAGE_PRIORITY Priority); + +NTOSAPI +PVOID +DDKAPI +MmMapLockedPagesWithReservedMapping( + IN PVOID MappingAddress, + IN ULONG PoolTag, + IN PMDL MemoryDescriptorList, + IN MEMORY_CACHING_TYPE CacheType); + +NTOSAPI +NTSTATUS +DDKAPI +MmMapUserAddressesToPage( + IN PVOID BaseAddress, + IN SIZE_T NumberOfBytes, + IN PVOID PageAddress); + +NTOSAPI +PVOID +DDKAPI +MmMapVideoDisplay( + IN PHYSICAL_ADDRESS PhysicalAddress, + IN SIZE_T NumberOfBytes, + IN MEMORY_CACHING_TYPE CacheType); + +NTOSAPI +NTSTATUS +DDKAPI +MmMapViewInSessionSpace( + IN PVOID Section, + OUT PVOID *MappedBase, + IN OUT PSIZE_T ViewSize); + +NTOSAPI +NTSTATUS +DDKAPI +MmMapViewInSystemSpace( + IN PVOID Section, + OUT PVOID *MappedBase, + IN PSIZE_T ViewSize); + +NTOSAPI +NTSTATUS +DDKAPI +MmMarkPhysicalMemoryAsBad( + IN PPHYSICAL_ADDRESS StartAddress, + IN OUT PLARGE_INTEGER NumberOfBytes); + +NTOSAPI +NTSTATUS +DDKAPI +MmMarkPhysicalMemoryAsGood( + IN PPHYSICAL_ADDRESS StartAddress, + IN OUT PLARGE_INTEGER NumberOfBytes); + +/* + * PVOID + * MmGetSystemAddressForMdlSafe( + * IN PMDL Mdl, + * IN MM_PAGE_PRIORITY Priority) + */ +#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \ + ((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \ + | MDL_SOURCE_IS_NONPAGED_POOL)) ? \ + (_Mdl)->MappedSystemVa : \ + (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \ + KernelMode, MmCached, NULL, FALSE, _Priority) + +NTOSAPI +PVOID +DDKAPI +MmGetSystemRoutineAddress( + IN PUNICODE_STRING SystemRoutineName); + +/* + * ULONG + * ADDRESS_AND_SIZE_TO_SPAN_PAGES( + * IN PVOID Va, + * IN ULONG Size) + */ +#define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \ + _Size) \ + ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \ + + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT)) + +/* + * VOID + * MmInitializeMdl( + * IN PMDL MemoryDescriptorList, + * IN PVOID BaseVa, + * IN SIZE_T Length) + */ +#define MmInitializeMdl(_MemoryDescriptorList, \ + _BaseVa, \ + _Length) \ +{ \ + (_MemoryDescriptorList)->Next = (PMDL) NULL; \ + (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \ + (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \ + (_MemoryDescriptorList)->MdlFlags = 0; \ + (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \ + (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \ + (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \ +} + +NTOSAPI +BOOLEAN +DDKAPI +MmIsAddressValid( + IN PVOID VirtualAddress); + +NTOSAPI +LOGICAL +DDKAPI +MmIsDriverVerifying( + IN PDRIVER_OBJECT DriverObject); + +NTOSAPI +BOOLEAN +DDKAPI +MmIsThisAnNtAsSystem( + VOID); + +NTOSAPI +NTSTATUS +DDKAPI +MmIsVerifierEnabled( + OUT PULONG VerifierFlags); + +NTOSAPI +PVOID +DDKAPI +MmLockPagableDataSection( + IN PVOID AddressWithinSection); + +NTOSAPI +PVOID +DDKAPI +MmLockPagableImageSection( + IN PVOID AddressWithinSection); + +/* + * PVOID + * MmLockPagableCodeSection( + * IN PVOID AddressWithinSection) + */ +#define MmLockPagableCodeSection MmLockPagableDataSection + +NTOSAPI +VOID +DDKAPI +MmLockPagableSectionByHandle( + IN PVOID ImageSectionHandle); + +NTOSAPI +PVOID +DDKAPI +MmMapIoSpace( + IN PHYSICAL_ADDRESS PhysicalAddress, + IN ULONG NumberOfBytes, + IN MEMORY_CACHING_TYPE CacheEnable); + +NTOSAPI +PVOID +DDKAPI +MmMapLockedPages( + IN PMDL MemoryDescriptorList, + IN KPROCESSOR_MODE AccessMode); + +NTOSAPI +VOID +DDKAPI +MmPageEntireDriver( + IN PVOID AddressWithinSection); + +NTOSAPI +VOID +DDKAPI +MmProbeAndLockProcessPages( + IN OUT PMDL MemoryDescriptorList, + IN PEPROCESS Process, + IN KPROCESSOR_MODE AccessMode, + IN LOCK_OPERATION Operation); + +NTOSAPI +NTSTATUS +DDKAPI +MmProtectMdlSystemAddress( + IN PMDL MemoryDescriptorList, + IN ULONG NewProtect); + +NTOSAPI +VOID +DDKAPI +MmUnmapLockedPages( + IN PVOID BaseAddress, + IN PMDL MemoryDescriptorList); + +NTOSAPI +NTSTATUS +DDKAPI +MmUnmapViewInSessionSpace( + IN PVOID MappedBase); + +NTOSAPI +NTSTATUS +DDKAPI +MmUnmapViewInSystemSpace( + IN PVOID MappedBase); + +NTOSAPI +VOID +DDKAPI +MmUnsecureVirtualMemory( + IN HANDLE SecureHandle); + +/* + * VOID + * MmPrepareMdlForReuse( + * IN PMDL Mdl) + */ +#define MmPrepareMdlForReuse(_Mdl) \ +{ \ + if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \ + assert(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \ + MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \ + } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \ + assert(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \ + } \ +} + +NTOSAPI +VOID +DDKAPI +MmProbeAndLockPages( + IN OUT PMDL MemoryDescriptorList, + IN KPROCESSOR_MODE AccessMode, + IN LOCK_OPERATION Operation); + +NTOSAPI +MM_SYSTEM_SIZE +DDKAPI +MmQuerySystemSize( + VOID); + +NTOSAPI +NTSTATUS +DDKAPI +MmRemovePhysicalMemory( + IN PPHYSICAL_ADDRESS StartAddress, + IN OUT PLARGE_INTEGER NumberOfBytes); + +NTOSAPI +VOID +DDKAPI +MmResetDriverPaging( + IN PVOID AddressWithinSection); + +NTOSAPI +HANDLE +DDKAPI +MmSecureVirtualMemory( + IN PVOID Address, + IN SIZE_T Size, + IN ULONG ProbeMode); + +NTOSAPI +ULONG +DDKAPI +MmSizeOfMdl( + IN PVOID Base, + IN SIZE_T Length); + +NTOSAPI +VOID +DDKAPI +MmUnlockPagableImageSection( + IN PVOID ImageSectionHandle); + +NTOSAPI +VOID +DDKAPI +MmUnlockPages( + IN PMDL MemoryDescriptorList); + +NTOSAPI +VOID +DDKAPI +MmUnmapIoSpace( + IN PVOID BaseAddress, + IN SIZE_T NumberOfBytes); + +NTOSAPI +VOID +DDKAPI +MmUnmapReservedMapping( + IN PVOID BaseAddress, + IN ULONG PoolTag, + IN PMDL MemoryDescriptorList); + +NTOSAPI +VOID +DDKAPI +MmUnmapVideoDisplay( + IN PVOID BaseAddress, + IN SIZE_T NumberOfBytes); + + + +/** Object manager routines **/ + +NTOSAPI +NTSTATUS +DDKAPI +ObAssignSecurity( + IN PACCESS_STATE AccessState, + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PVOID Object, + IN POBJECT_TYPE Type); + +NTOSAPI +VOID +DDKAPI +ObDereferenceSecurityDescriptor( + PSECURITY_DESCRIPTOR SecurityDescriptor, + ULONG Count); + +NTOSAPI +VOID +DDKFASTAPI +ObfDereferenceObject( + IN PVOID Object); + +/* + * VOID + * ObDereferenceObject( + * IN PVOID Object) + */ +#define ObDereferenceObject ObfDereferenceObject + +NTOSAPI +NTSTATUS +DDKAPI +ObGetObjectSecurity( + IN PVOID Object, + OUT PSECURITY_DESCRIPTOR *SecurityDescriptor, + OUT PBOOLEAN MemoryAllocated); + +NTOSAPI +NTSTATUS +DDKAPI +ObInsertObject( + IN PVOID Object, + IN PACCESS_STATE PassedAccessState OPTIONAL, + IN ACCESS_MASK DesiredAccess, + IN ULONG AdditionalReferences, + OUT PVOID* ReferencedObject OPTIONAL, + OUT PHANDLE Handle); + +NTOSAPI +VOID +DDKFASTAPI +ObfReferenceObject( + IN PVOID Object); + +NTOSAPI +NTSTATUS +DDKAPI +ObLogSecurityDescriptor( + IN PSECURITY_DESCRIPTOR InputSecurityDescriptor, + OUT PSECURITY_DESCRIPTOR *OutputSecurityDescriptor, + IN ULONG RefBias); +/* + * VOID + * ObReferenceObject( + * IN PVOID Object) + */ +#define ObReferenceObject ObfReferenceObject + +NTOSAPI +VOID +DDKAPI +ObMakeTemporaryObject( + IN PVOID Object); + +NTOSAPI +NTSTATUS +DDKAPI +ObOpenObjectByName( + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN POBJECT_TYPE ObjectType, + IN OUT PVOID ParseContext OPTIONAL, + IN KPROCESSOR_MODE AccessMode, + IN ACCESS_MASK DesiredAccess, + IN PACCESS_STATE PassedAccessState, + OUT PHANDLE Handle); + +NTOSAPI +NTSTATUS +DDKAPI +ObOpenObjectByPointer( + IN PVOID Object, + IN ULONG HandleAttributes, + IN PACCESS_STATE PassedAccessState OPTIONAL, + IN ACCESS_MASK DesiredAccess OPTIONAL, + IN POBJECT_TYPE ObjectType OPTIONAL, + IN KPROCESSOR_MODE AccessMode, + OUT PHANDLE Handle); + +NTOSAPI +NTSTATUS +DDKAPI +ObQueryObjectAuditingByHandle( + IN HANDLE Handle, + OUT PBOOLEAN GenerateOnClose); + +NTOSAPI +NTSTATUS +DDKAPI +ObReferenceObjectByHandle( + IN HANDLE Handle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_TYPE ObjectType OPTIONAL, + IN KPROCESSOR_MODE AccessMode, + OUT PVOID *Object, + OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL); + +NTOSAPI +NTSTATUS +DDKAPI +ObReferenceObjectByName( + IN PUNICODE_STRING ObjectPath, + IN ULONG Attributes, + IN PACCESS_STATE PassedAccessState OPTIONAL, + IN ACCESS_MASK DesiredAccess OPTIONAL, + IN POBJECT_TYPE ObjectType, + IN KPROCESSOR_MODE AccessMode, + IN OUT PVOID ParseContext OPTIONAL, + OUT PVOID *Object); + +NTOSAPI +NTSTATUS +DDKAPI +ObReferenceObjectByPointer( + IN PVOID Object, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_TYPE ObjectType, + IN KPROCESSOR_MODE AccessMode); + +NTOSAPI +VOID +DDKAPI +ObReferenceSecurityDescriptor( + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN ULONG Count); + +NTOSAPI +VOID +DDKAPI +ObReleaseObjectSecurity( + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN BOOLEAN MemoryAllocated); + + + +/** Process manager routines **/ + +NTOSAPI +NTSTATUS +DDKAPI +PsCreateSystemProcess( + IN PHANDLE ProcessHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes); + +NTOSAPI +NTSTATUS +DDKAPI +PsCreateSystemThread( + OUT PHANDLE ThreadHandle, + IN ULONG DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN HANDLE ProcessHandle OPTIONAL, + OUT PCLIENT_ID ClientId OPTIONAL, + IN PKSTART_ROUTINE StartRoutine, + IN PVOID StartContext); + +/* + * PEPROCESS + * PsGetCurrentProcess(VOID) + */ +#define PsGetCurrentProcess IoGetCurrentProcess + +NTOSAPI +HANDLE +DDKAPI +PsGetCurrentProcessId( + VOID); + +/* + * PETHREAD + * PsGetCurrentThread(VOID) + */ +#define PsGetCurrentThread() \ + ((PETHREAD) KeGetCurrentThread()) + +NTOSAPI +HANDLE +DDKAPI +PsGetCurrentThreadId( + VOID); + +NTOSAPI +BOOLEAN +DDKAPI +PsGetVersion( + PULONG MajorVersion OPTIONAL, + PULONG MinorVersion OPTIONAL, + PULONG BuildNumber OPTIONAL, + PUNICODE_STRING CSDVersion OPTIONAL); + +NTOSAPI +NTSTATUS +DDKAPI +PsRemoveCreateThreadNotifyRoutine( + IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine); + +NTOSAPI +NTSTATUS +DDKAPI +PsRemoveLoadImageNotifyRoutine( + IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine); + +NTOSAPI +NTSTATUS +DDKAPI +PsSetCreateProcessNotifyRoutine( + IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine, + IN BOOLEAN Remove); + +NTOSAPI +NTSTATUS +DDKAPI +PsSetCreateThreadNotifyRoutine( + IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine); + +NTOSAPI +NTSTATUS +DDKAPI +PsSetLoadImageNotifyRoutine( + IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine); + +NTOSAPI +NTSTATUS +DDKAPI +PsTerminateSystemThread( + IN NTSTATUS ExitStatus); + + + +/** Security reference monitor routines **/ + +NTOSAPI +BOOLEAN +DDKAPI +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 OPTIONAL, + IN PGENERIC_MAPPING GenericMapping, + IN KPROCESSOR_MODE AccessMode, + OUT PACCESS_MASK GrantedAccess, + OUT PNTSTATUS AccessStatus); + +NTOSAPI +NTSTATUS +DDKAPI +SeAssignSecurity( + IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL, + IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL, + OUT PSECURITY_DESCRIPTOR *NewDescriptor, + IN BOOLEAN IsDirectoryObject, + IN PSECURITY_SUBJECT_CONTEXT SubjectContext, + IN PGENERIC_MAPPING GenericMapping, + IN POOL_TYPE PoolType); + +NTOSAPI +NTSTATUS +DDKAPI +SeAssignSecurityEx( + IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL, + IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL, + OUT PSECURITY_DESCRIPTOR *NewDescriptor, + IN GUID *ObjectType OPTIONAL, + IN BOOLEAN IsDirectoryObject, + IN ULONG AutoInheritFlags, + IN PSECURITY_SUBJECT_CONTEXT SubjectContext, + IN PGENERIC_MAPPING GenericMapping, + IN POOL_TYPE PoolType); + +NTOSAPI +NTSTATUS +DDKAPI +SeDeassignSecurity( + IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor); + +NTOSAPI +BOOLEAN +DDKAPI +SeSinglePrivilegeCheck( + LUID PrivilegeValue, + KPROCESSOR_MODE PreviousMode); + +NTOSAPI +BOOLEAN +DDKAPI +SeValidSecurityDescriptor( + IN ULONG Length, + IN PSECURITY_DESCRIPTOR SecurityDescriptor); + + + +/** NtXxx routines **/ + +NTOSAPI +NTSTATUS +DDKAPI +NtOpenProcess( + OUT PHANDLE ProcessHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN PCLIENT_ID ClientId OPTIONAL); + +NTOSAPI +NTSTATUS +DDKAPI +NtQueryInformationProcess( + IN HANDLE ProcessHandle, + IN PROCESSINFOCLASS ProcessInformationClass, + OUT PVOID ProcessInformation, + IN ULONG ProcessInformationLength, + OUT PULONG ReturnLength OPTIONAL); + + + +/** NtXxx and ZwXxx routines **/ + +NTOSAPI +NTSTATUS +DDKAPI +ZwCancelTimer( + IN HANDLE TimerHandle, + OUT PBOOLEAN CurrentState OPTIONAL); + +NTOSAPI +NTSTATUS +DDKAPI +NtClose( + IN HANDLE Handle); + +NTOSAPI +NTSTATUS +DDKAPI +ZwClose( + IN HANDLE Handle); + +NTOSAPI +NTSTATUS +DDKAPI +ZwCreateDirectoryObject( + OUT PHANDLE DirectoryHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes); + +NTOSAPI +NTSTATUS +DDKAPI +NtCreateEvent( + OUT PHANDLE EventHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN BOOLEAN ManualReset, + IN BOOLEAN InitialState); + +NTOSAPI +NTSTATUS +DDKAPI +ZwCreateEvent( + OUT PHANDLE EventHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN BOOLEAN ManualReset, + IN BOOLEAN InitialState); + +NTOSAPI +NTSTATUS +DDKAPI +ZwCreateFile( + 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 CreateDisposition, + IN ULONG CreateOptions, + IN PVOID EaBuffer OPTIONAL, + IN ULONG EaLength); + +NTOSAPI +NTSTATUS +DDKAPI +ZwCreateKey( + OUT PHANDLE KeyHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN ULONG TitleIndex, + IN PUNICODE_STRING Class OPTIONAL, + IN ULONG CreateOptions, + OUT PULONG Disposition OPTIONAL); + +NTOSAPI +NTSTATUS +DDKAPI +ZwCreateTimer( + OUT PHANDLE TimerHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN TIMER_TYPE TimerType); + +NTOSAPI +NTSTATUS +DDKAPI +ZwDeleteKey( + IN HANDLE KeyHandle); + +NTOSAPI +NTSTATUS +DDKAPI +ZwDeleteValueKey( + IN HANDLE KeyHandle, + IN PUNICODE_STRING ValueName); + +NTOSAPI +NTSTATUS +DDKAPI +NtDeviceIoControlFile( + IN HANDLE DeviceHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL, + IN PVOID UserApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG IoControlCode, + IN PVOID InputBuffer, + IN ULONG InputBufferSize, + OUT PVOID OutputBuffer, + IN ULONG OutputBufferSize); + +NTOSAPI +NTSTATUS +DDKAPI +ZwDeviceIoControlFile( + IN HANDLE DeviceHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL, + IN PVOID UserApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG IoControlCode, + IN PVOID InputBuffer, + IN ULONG InputBufferSize, + OUT PVOID OutputBuffer, + IN ULONG OutputBufferSize); + +NTOSAPI +NTSTATUS +DDKAPI +ZwEnumerateKey( + IN HANDLE KeyHandle, + IN ULONG Index, + IN KEY_INFORMATION_CLASS KeyInformationClass, + OUT PVOID KeyInformation, + IN ULONG Length, + OUT PULONG ResultLength); + +NTOSAPI +NTSTATUS +DDKAPI +ZwEnumerateValueKey( + IN HANDLE KeyHandle, + IN ULONG Index, + IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, + OUT PVOID KeyValueInformation, + IN ULONG Length, + OUT PULONG ResultLength); + +NTOSAPI +NTSTATUS +DDKAPI +ZwFlushKey( + IN HANDLE KeyHandle); + +NTOSAPI +NTSTATUS +DDKAPI +ZwMakeTemporaryObject( + IN HANDLE Handle); + +NTOSAPI +NTSTATUS +DDKAPI +NtMapViewOfSection( + IN HANDLE SectionHandle, + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN ULONG ZeroBits, + IN ULONG CommitSize, + IN OUT PLARGE_INTEGER SectionOffset OPTIONAL, + IN OUT PSIZE_T ViewSize, + IN SECTION_INHERIT InheritDisposition, + IN ULONG AllocationType, + IN ULONG Protect); + +NTOSAPI +NTSTATUS +DDKAPI +ZwMapViewOfSection( + IN HANDLE SectionHandle, + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN ULONG ZeroBits, + IN ULONG CommitSize, + IN OUT PLARGE_INTEGER SectionOffset OPTIONAL, + IN OUT PSIZE_T ViewSize, + IN SECTION_INHERIT InheritDisposition, + IN ULONG AllocationType, + IN ULONG Protect); + +NTOSAPI +NTSTATUS +DDKAPI +NtOpenFile( + OUT PHANDLE FileHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG ShareAccess, + IN ULONG OpenOptions); + +NTOSAPI +NTSTATUS +DDKAPI +ZwOpenFile( + OUT PHANDLE FileHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG ShareAccess, + IN ULONG OpenOptions); + +NTOSAPI +NTSTATUS +DDKAPI +ZwOpenKey( + OUT PHANDLE KeyHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes); + +NTOSAPI +NTSTATUS +DDKAPI +ZwOpenSection( + OUT PHANDLE SectionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes); + +NTOSAPI +NTSTATUS +DDKAPI +ZwOpenSymbolicLinkObject( + OUT PHANDLE LinkHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes); + +NTOSAPI +NTSTATUS +DDKAPI +ZwOpenTimer( + OUT PHANDLE TimerHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes); + +NTOSAPI +NTSTATUS +DDKAPI +ZwQueryInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass); + +NTOSAPI +NTSTATUS +DDKAPI +ZwQueryKey( + IN HANDLE KeyHandle, + IN KEY_INFORMATION_CLASS KeyInformationClass, + OUT PVOID KeyInformation, + IN ULONG Length, + OUT PULONG ResultLength); + +NTOSAPI +NTSTATUS +DDKAPI +ZwQuerySymbolicLinkObject( + IN HANDLE LinkHandle, + IN OUT PUNICODE_STRING LinkTarget, + OUT PULONG ReturnedLength OPTIONAL); + +NTOSAPI +NTSTATUS +DDKAPI +ZwQueryValueKey( + IN HANDLE KeyHandle, + IN PUNICODE_STRING ValueName, + IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, + OUT PVOID KeyValueInformation, + IN ULONG Length, + OUT PULONG ResultLength); + +NTOSAPI +NTSTATUS +DDKAPI +NtReadFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset OPTIONAL, + IN PULONG Key OPTIONAL); + +NTOSAPI +NTSTATUS +DDKAPI +ZwReadFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset OPTIONAL, + IN PULONG Key OPTIONAL); + +NTOSAPI +NTSTATUS +DDKAPI +NtSetEvent( + IN HANDLE EventHandle, + IN PULONG NumberOfThreadsReleased); + +NTOSAPI +NTSTATUS +DDKAPI +ZwSetEvent( + IN HANDLE EventHandle, + IN PULONG NumberOfThreadsReleased); + +NTOSAPI +NTSTATUS +DDKAPI +ZwSetInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass); + +NTOSAPI +NTSTATUS +DDKAPI +ZwSetInformationThread( + IN HANDLE ThreadHandle, + IN THREADINFOCLASS ThreadInformationClass, + IN PVOID ThreadInformation, + IN ULONG ThreadInformationLength); + +NTOSAPI +NTSTATUS +DDKAPI +ZwSetTimer( + IN HANDLE TimerHandle, + IN PLARGE_INTEGER DueTime, + IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL, + IN PVOID TimerContext OPTIONAL, + IN BOOLEAN WakeTimer, + IN LONG Period OPTIONAL, + OUT PBOOLEAN PreviousState OPTIONAL); + +NTOSAPI +NTSTATUS +DDKAPI +ZwSetValueKey( + IN HANDLE KeyHandle, + IN PUNICODE_STRING ValueName, + IN ULONG TitleIndex OPTIONAL, + IN ULONG Type, + IN PVOID Data, + IN ULONG DataSize); + +/* [Nt|Zw]MapViewOfSection.InheritDisposition constants */ +#define AT_EXTENDABLE_FILE 0x00002000 +#define SEC_NO_CHANGE 0x00400000 +#define AT_RESERVED 0x20000000 +#define AT_ROUND_TO_PAGE 0x40000000 + +NTOSAPI +NTSTATUS +DDKAPI +NtUnmapViewOfSection( + IN HANDLE ProcessHandle, + IN PVOID BaseAddress); + +NTOSAPI +NTSTATUS +DDKAPI +ZwUnmapViewOfSection( + IN HANDLE ProcessHandle, + IN PVOID BaseAddress); + +NTOSAPI +NTSTATUS +DDKAPI +NtWaitForSingleObject( + IN HANDLE Object, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Time); + +NTOSAPI +NTSTATUS +DDKAPI +ZwWaitForSingleObject( + IN HANDLE Object, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Time); + +NTOSAPI +NTSTATUS +DDKAPI +NtWriteFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset OPTIONAL, + IN PULONG Key OPTIONAL); + +NTOSAPI +NTSTATUS +DDKAPI +ZwWriteFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset OPTIONAL, + IN PULONG Key OPTIONAL); + + + +/** Power management support routines **/ + +NTOSAPI +NTSTATUS +DDKAPI +PoCallDriver( + IN PDEVICE_OBJECT DeviceObject, + IN OUT PIRP Irp); + +NTOSAPI +PULONG +DDKAPI +PoRegisterDeviceForIdleDetection( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG ConservationIdleTime, + IN ULONG PerformanceIdleTime, + IN DEVICE_POWER_STATE State); + +NTOSAPI +PVOID +DDKAPI +PoRegisterSystemState( + IN PVOID StateHandle, + IN EXECUTION_STATE Flags); + +NTOSAPI +NTSTATUS +DDKAPI +PoRequestPowerIrp( + IN PDEVICE_OBJECT DeviceObject, + IN UCHAR MinorFunction, + IN POWER_STATE PowerState, + IN PREQUEST_POWER_COMPLETE CompletionFunction, + IN PVOID Context, + OUT PIRP *Irp OPTIONAL); + +NTOSAPI +NTSTATUS +DDKAPI +PoRequestShutdownEvent( + OUT PVOID *Event); + +NTOSAPI +VOID +DDKAPI +PoSetDeviceBusy( + PULONG IdlePointer); + +NTOSAPI +POWER_STATE +DDKAPI +PoSetPowerState( + IN PDEVICE_OBJECT DeviceObject, + IN POWER_STATE_TYPE Type, + IN POWER_STATE State); + +NTOSAPI +VOID +DDKAPI +PoSetSystemState( + IN EXECUTION_STATE Flags); + +NTOSAPI +VOID +DDKAPI +PoStartNextPowerIrp( + IN PIRP Irp); + +NTOSAPI +VOID +DDKAPI +PoUnregisterSystemState( + IN PVOID StateHandle); + + + +/** WMI library support routines **/ + +NTOSAPI +NTSTATUS +DDKAPI +WmiCompleteRequest( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN NTSTATUS Status, + IN ULONG BufferUsed, + IN CCHAR PriorityBoost); + +NTOSAPI +NTSTATUS +DDKAPI +WmiFireEvent( + IN PDEVICE_OBJECT DeviceObject, + IN LPGUID Guid, + IN ULONG InstanceIndex, + IN ULONG EventDataSize, + IN PVOID EventData); + +NTOSAPI +NTSTATUS +DDKAPI +WmiQueryTraceInformation( + IN TRACE_INFORMATION_CLASS TraceInformationClass, + OUT PVOID TraceInformation, + IN ULONG TraceInformationLength, + OUT PULONG RequiredLength OPTIONAL, + IN PVOID Buffer OPTIONAL); + +NTOSAPI +NTSTATUS +DDKAPI +WmiSystemControl( + IN PWMILIB_CONTEXT WmiLibInfo, + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + OUT PSYSCTL_IRP_DISPOSITION IrpDisposition); + +NTOSAPI +NTSTATUS +DDKCDECLAPI +WmiTraceMessage( + IN TRACEHANDLE LoggerHandle, + IN ULONG MessageFlags, + IN LPGUID MessageGuid, + IN USHORT MessageNumber, + IN ...); + +#if 0 +/* FIXME: Get va_list from where? */ +NTOSAPI +NTSTATUS +DDKCDECLAPI +WmiTraceMessageVa( + IN TRACEHANDLE LoggerHandle, + IN ULONG MessageFlags, + IN LPGUID MessageGuid, + IN USHORT MessageNumber, + IN va_list MessageArgList); +#endif + + +/** Kernel debugger routines **/ + +NTOSAPI +VOID +DDKAPI +KdDisableDebugger( + VOID); + +NTOSAPI +VOID +DDKAPI +KdEnableDebugger( + VOID); + +NTOSAPI +VOID +DDKAPI +DbgBreakPoint( + VOID); + +NTOSAPI +VOID +DDKAPI +DbgBreakPointWithStatus( + IN ULONG Status); + +NTOSAPI +ULONG +DDKCDECLAPI +DbgPrint( + IN PCH Format, + IN ...); + +NTOSAPI +ULONG +DDKCDECLAPI +DbgPrintEx( + IN ULONG ComponentId, + IN ULONG Level, + IN PCH Format, + IN ...); + +NTOSAPI +ULONG +DDKCDECLAPI +DbgPrintReturnControlC( + IN PCH Format, + IN ...); + +NTOSAPI +NTSTATUS +DDKAPI +DbgQueryDebugFilterState( + IN ULONG ComponentId, + IN ULONG Level); + +NTOSAPI +NTSTATUS +DDKAPI +DbgSetDebugFilterState( + IN ULONG ComponentId, + IN ULONG Level, + IN BOOLEAN State); + +#ifdef DBG + +#define KdPrint(_x_) DbgPrint _x_ +#define KdPrintEx(_x_) DbgPrintEx _x_ +#define KdBreakPoint() DbgBreakPoint() +#define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s) + +#else /* !DBG */ + +#define KdPrint(_x_) +#define KdPrintEx(_x_) +#define KdBreakPoint() +#define KdBreakPointWithStatus(s) + +#endif /* !DBG */ + +extern NTOSAPI PBOOLEAN KdDebuggerNotPresent; +extern NTOSAPI PBOOLEAN KdDebuggerEnabled; +#define KD_DEBUGGER_ENABLED *KdDebuggerEnabled +#define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __WINDDK_H */ diff --git a/reactos/w32api/include/ddk/winnt4.h b/reactos/w32api/include/ddk/winnt4.h new file mode 100644 index 00000000000..0c73231cb32 --- /dev/null +++ b/reactos/w32api/include/ddk/winnt4.h @@ -0,0 +1,608 @@ +/* + * winnt4.h + * + * Definitions only used in Windows NT 4.0 and earlier versions + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __WINNT4_H +#define __WINNT4_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +typedef struct _ZONE_SEGMENT_HEADER { + SINGLE_LIST_ENTRY SegmentList; + PVOID Reserved; +} ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER; + +typedef struct _ZONE_HEADER { + SINGLE_LIST_ENTRY FreeList; + SINGLE_LIST_ENTRY SegmentList; + ULONG BlockSize; + ULONG TotalSegmentSize; +} ZONE_HEADER, *PZONE_HEADER; + +static __inline PVOID +ExAllocateFromZone( + IN PZONE_HEADER Zone) +{ + if (Zone->FreeList.Next) + Zone->FreeList.Next = Zone->FreeList.Next->Next; + return (PVOID) Zone->FreeList.Next; +} + +NTOSAPI +NTSTATUS +DDKAPI +ExExtendZone( + IN PZONE_HEADER Zone, + IN PVOID Segment, + IN ULONG SegmentSize); + +static __inline PVOID +ExFreeToZone( + IN PZONE_HEADER Zone, + IN PVOID Block) +{ + ((PSINGLE_LIST_ENTRY) Block)->Next = Zone->FreeList.Next; + Zone->FreeList.Next = ((PSINGLE_LIST_ENTRY) Block); + return ((PSINGLE_LIST_ENTRY) Block)->Next; +} + +NTOSAPI +NTSTATUS +DDKAPI +ExInitializeZone( + IN PZONE_HEADER Zone, + IN ULONG BlockSize, + IN PVOID InitialSegment, + IN ULONG InitialSegmentSize); + +/* + * PVOID + * ExInterlockedAllocateFromZone( + * IN PZONE_HEADER Zone, + * IN PKSPIN_LOCK Lock) + */ +#define ExInterlockedAllocateFromZone(Zone, \ + Lock) \ + ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock)) + +NTOSAPI +NTSTATUS +DDKAPI +ExInterlockedExtendZone( + IN PZONE_HEADER Zone, + IN PVOID Segment, + IN ULONG SegmentSize, + IN PKSPIN_LOCK Lock); + +NTOSAPI +PVOID +DDKAPI +ExInterlockedFreeToZone( + IN PZONE_HEADER Zone, + IN PVOID Block, + IN PKSPIN_LOCK Lock); + +/* + * VOID + * ExInitializeWorkItem( + * IN PWORK_QUEUE_ITEM Item, + * IN PWORKER_THREAD_ROUTINE Routine, + * IN PVOID Context) + */ +#define ExInitializeWorkItem(Item, \ + Routine, \ + Context) \ +{ \ + (Item)->WorkerRoutine = Routine; \ + (Item)->Parameter = Context; \ + (Item)->List.Flink = NULL; \ +} + +/* + * BOOLEAN + * ExIsFullZone( + * IN PZONE_HEADER Zone) + */ +#define ExIsFullZone(Zone) \ + ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL) + +NTOSAPI +VOID +DDKAPI +ExQueueWorkItem( + IN PWORK_QUEUE_ITEM WorkItem, + IN WORK_QUEUE_TYPE QueueType); + +NTOSAPI +BOOLEAN +DDKAPI +ExIsObjectInFirstZoneSegment( + IN PZONE_HEADER Zone, + IN PVOID Object); + +NTOSAPI +VOID +DDKAPI +ExReleaseResource( + IN PERESOURCE Resource); + +#define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite +#define ExAcquireResourceShared ExAcquireResourceSharedLite +#define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite +#define ExDeleteResource ExDeleteResourceLite +#define ExInitializeResource ExInitializeResourceLite +#define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite +#define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite +#define ExIsResourceAcquired ExIsResourceAcquiredSharedLite +#define ExReleaseResourceForThread ExReleaseResourceForThreadLite + +NTOSAPI +INTERLOCKED_RESULT +DDKAPI +ExInterlockedDecrementLong( + IN PLONG Addend, + IN PKSPIN_LOCK Lock); + +NTOSAPI +ULONG +DDKAPI +ExInterlockedExchangeUlong( + IN PULONG Target, + IN ULONG Value, + IN PKSPIN_LOCK Lock); + +NTOSAPI +INTERLOCKED_RESULT +DDKAPI +ExInterlockedIncrementLong( + IN PLONG Addend, + IN PKSPIN_LOCK Lock); + +NTOSAPI +PVOID +DDKAPI +HalAllocateCommonBuffer( + IN PADAPTER_OBJECT AdapterObject, + IN ULONG Length, + OUT PPHYSICAL_ADDRESS LogicalAddress, + IN BOOLEAN CacheEnabled); + +NTOSAPI +NTSTATUS +DDKAPI +HalAssignSlotResources( + IN PUNICODE_STRING RegistryPath, + IN PUNICODE_STRING DriverClassName, + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT DeviceObject, + IN INTERFACE_TYPE BusType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN OUT PCM_RESOURCE_LIST *AllocatedResources); + +NTOSAPI +VOID +DDKAPI +HalFreeCommonBuffer( + IN PADAPTER_OBJECT AdapterObject, + IN ULONG Length, + IN PHYSICAL_ADDRESS LogicalAddress, + IN PVOID VirtualAddress, + IN BOOLEAN CacheEnabled); + +NTOSAPI +PADAPTER_OBJECT +DDKAPI +HalGetAdapter( + IN PDEVICE_DESCRIPTION DeviceDescription, + IN OUT PULONG NumberOfMapRegisters); + +NTOSAPI +ULONG +DDKAPI +HalGetBusData( + IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Length); + +NTOSAPI +ULONG +DDKAPI +HalGetBusDataByOffset( + IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +NTOSAPI +ULONG +DDKAPI +HalGetDmaAlignmentRequirement( + VOID); + +NTOSAPI +ULONG +DDKAPI +HalGetInterruptVector( + IN INTERFACE_TYPE InterfaceType, + IN ULONG BusNumber, + IN ULONG BusInterruptLevel, + IN ULONG BusInterruptVector, + OUT PKIRQL Irql, + OUT PKAFFINITY Affinity); + +NTOSAPI +ULONG +DDKAPI +HalReadDmaCounter( + IN PADAPTER_OBJECT AdapterObject); + +NTOSAPI +ULONG +DDKAPI +HalSetBusData( + IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Length); + +NTOSAPI +ULONG +DDKAPI +HalSetBusDataByOffset( + IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +NTOSAPI +BOOLEAN +DDKAPI +HalTranslateBusAddress( + IN INTERFACE_TYPE InterfaceType, + IN ULONG BusNumber, + IN PHYSICAL_ADDRESS BusAddress, + IN OUT PULONG AddressSpace, + OUT PPHYSICAL_ADDRESS TranslatedAddress); + +NTOSAPI +NTSTATUS +DDKAPI +IoAllocateAdapterChannel( + IN PADAPTER_OBJECT AdapterObject, + IN PDEVICE_OBJECT DeviceObject, + IN ULONG NumberOfMapRegisters, + IN PDRIVER_CONTROL ExecutionRoutine, + IN PVOID Context); + +NTOSAPI +NTSTATUS +DDKAPI +IoAssignResources( + IN PUNICODE_STRING RegistryPath, + IN PUNICODE_STRING DriverClassName OPTIONAL, + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT DeviceObject OPTIONAL, + IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources, + IN OUT PCM_RESOURCE_LIST *AllocatedResources); + +NTOSAPI +NTSTATUS +DDKAPI +IoAttachDeviceByPointer( + IN PDEVICE_OBJECT SourceDevice, + IN PDEVICE_OBJECT TargetDevice); + +NTOSAPI +BOOLEAN +DDKAPI +IoFlushAdapterBuffers( + IN PADAPTER_OBJECT AdapterObject, + IN PMDL Mdl, + IN PVOID MapRegisterBase, + IN PVOID CurrentVa, + IN ULONG Length, + IN BOOLEAN WriteToDevice); + +NTOSAPI +VOID +DDKAPI +IoFreeAdapterChannel( + IN PADAPTER_OBJECT AdapterObject); + +NTOSAPI +VOID +DDKAPI +IoFreeMapRegisters( + IN PADAPTER_OBJECT AdapterObject, + IN PVOID MapRegisterBase, + IN ULONG NumberOfMapRegisters); + +NTOSAPI +PHYSICAL_ADDRESS +DDKAPI +IoMapTransfer( + IN PADAPTER_OBJECT AdapterObject, + IN PMDL Mdl, + IN PVOID MapRegisterBase, + IN PVOID CurrentVa, + IN OUT PULONG Length, + IN BOOLEAN WriteToDevice); + +NTOSAPI +PMDL +DDKAPI +MmCreateMdl( + IN PMDL MemoryDescriptorList OPTIONAL, + IN PVOID Base, + IN SIZE_T Length); + +NTOSAPI +BOOLEAN +DDKAPI +MmIsNonPagedSystemAddressValid( + IN PVOID VirtualAddress); + +NTOSAPI +LARGE_INTEGER +DDKAPI +RtlEnlargedIntegerMultiply( + IN LONG Multiplicand, + IN LONG Multiplier); + +NTOSAPI +ULONG +DDKAPI +RtlEnlargedUnsignedDivide( + IN ULARGE_INTEGER Dividend, + IN ULONG Divisor, + IN OUT PULONG Remainder); + +NTOSAPI +LARGE_INTEGER +DDKAPI +RtlEnlargedUnsignedMultiply( + IN ULONG Multiplicand, + IN ULONG Multiplier); + +NTOSAPI +LARGE_INTEGER +DDKAPI +RtlExtendedIntegerMultiply( + IN LARGE_INTEGER Multiplicand, + IN LONG Multiplier); + +NTOSAPI +LARGE_INTEGER +DDKAPI +RtlExtendedLargeIntegerDivide( + IN LARGE_INTEGER Dividend, + IN ULONG Divisor, + IN OUT PULONG Remainder); + +NTOSAPI +LARGE_INTEGER +DDKAPI +RtlExtendedMagicDivide( + IN LARGE_INTEGER Dividend, + IN LARGE_INTEGER MagicDivisor, + IN CCHAR ShiftCount); + +NTOSAPI +LARGE_INTEGER +DDKAPI +RtlLargeIntegerAdd( + IN LARGE_INTEGER Addend1, + IN LARGE_INTEGER Addend2); + +NTOSAPI +VOID +DDKAPI +RtlLargeIntegerAnd( + IN OUT LARGE_INTEGER Result, + IN LARGE_INTEGER Source, + IN LARGE_INTEGER Mask); + +NTOSAPI +LARGE_INTEGER +DDKAPI +RtlLargeIntegerArithmeticShift( + IN LARGE_INTEGER LargeInteger, + IN CCHAR ShiftCount); + +NTOSAPI +LARGE_INTEGER +DDKAPI +RtlLargeIntegerDivide( + IN LARGE_INTEGER Dividend, + IN LARGE_INTEGER Divisor, + IN OUT PLARGE_INTEGER Remainder); + +NTOSAPI +BOOLEAN +DDKAPI +RtlLargeIntegerEqualTo( + IN LARGE_INTEGER Operand1, + IN LARGE_INTEGER Operand2); + +NTOSAPI +BOOLEAN +DDKAPI +RtlLargeIntegerEqualToZero( + IN LARGE_INTEGER Operand); + +NTOSAPI +BOOLEAN +DDKAPI +RtlLargeIntegerGreaterOrEqualToZero( + IN LARGE_INTEGER Operand); + +NTOSAPI +BOOLEAN +DDKAPI +RtlLargeIntegerGreaterThan( + IN LARGE_INTEGER Operand1, + IN LARGE_INTEGER Operand2); + +NTOSAPI +BOOLEAN +DDKAPI +RtlLargeIntegerGreaterThanOrEqualTo( + IN LARGE_INTEGER Operand1, + IN LARGE_INTEGER Operand2); + +NTOSAPI +BOOLEAN +DDKAPI +RtlLargeIntegerGreaterThanZero( + IN LARGE_INTEGER Operand); + +NTOSAPI +BOOLEAN +DDKAPI +RtlLargeIntegerLessOrEqualToZero( + IN LARGE_INTEGER Operand); + +NTOSAPI +BOOLEAN +DDKAPI +RtlLargeIntegerLessThan( + IN LARGE_INTEGER Operand1, + IN LARGE_INTEGER Operand2); + +NTOSAPI +BOOLEAN +DDKAPI +RtlLargeIntegerLessThanOrEqualTo( + IN LARGE_INTEGER Operand1, + IN LARGE_INTEGER Operand2); + +NTOSAPI +BOOLEAN +DDKAPI +RtlLargeIntegerLessThanZero( + IN LARGE_INTEGER Operand); + +NTOSAPI +LARGE_INTEGER +DDKAPI +RtlLargeIntegerNegate( + IN LARGE_INTEGER Subtrahend); + +NTOSAPI +BOOLEAN +DDKAPI +RtlLargeIntegerNotEqualTo( + IN LARGE_INTEGER Operand1, + IN LARGE_INTEGER Operand2); + +NTOSAPI +BOOLEAN +DDKAPI +RtlLargeIntegerNotEqualToZero( + IN LARGE_INTEGER Operand); + +NTOSAPI +LARGE_INTEGER +DDKAPI +RtlLargeIntegerShiftLeft( + IN LARGE_INTEGER LargeInteger, + IN CCHAR ShiftCount); + +NTOSAPI +LARGE_INTEGER +DDKAPI +RtlLargeIntegerShiftRight( + IN LARGE_INTEGER LargeInteger, + IN CCHAR ShiftCount); + +NTOSAPI +LARGE_INTEGER +DDKAPI +RtlLargeIntegerSubtract( + IN LARGE_INTEGER Minuend, + IN LARGE_INTEGER Subtrahend); + + +/* + * ULONG + * COMPUTE_PAGES_SPANNED( + * IN PVOID Va, + * IN ULONG Size) + */ +#define COMPUTE_PAGES_SPANNED(Va, \ + Size) \ + (ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va, Size)) + + +/* +** Architecture specific structures +*/ + +#ifdef _X86_ + +NTOSAPI +INTERLOCKED_RESULT +DDKFASTAPI +Exfi386InterlockedIncrementLong( + IN PLONG Addend); + +NTOSAPI +INTERLOCKED_RESULT +DDKFASTAPI +Exfi386InterlockedDecrementLong( + IN PLONG Addend); + +NTOSAPI +ULONG +DDKFASTAPI +Exfi386InterlockedExchangeUlong( + IN PULONG Target, + IN ULONG Value); + +#define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend) +#define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend) +#define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value) + +#endif /* _X86_ */ + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __WINNT4_H */ diff --git a/reactos/w32api/include/ddk/winxp.h b/reactos/w32api/include/ddk/winxp.h new file mode 100644 index 00000000000..28e34a89ce4 --- /dev/null +++ b/reactos/w32api/include/ddk/winxp.h @@ -0,0 +1,38 @@ +/* + * winxp.h + * + * Definitions only used in Windows XP and earlier versions + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __WINXP_H +#define __WINXP_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __WINXP_H */ diff --git a/reactos/w32api/include/ddk/ws2san.h b/reactos/w32api/include/ddk/ws2san.h new file mode 100644 index 00000000000..29a21181d8d --- /dev/null +++ b/reactos/w32api/include/ddk/ws2san.h @@ -0,0 +1,252 @@ +/* + * ws2san.h + * + * WinSock Direct (SAN) support + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __WS2SAN_H +#define __WS2SAN_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma pack(push,4) + +#include <winsock2.h> +#include "ntddk.h" + + +#define WSPAPI STDCALL + +/* FIXME: Unknown definitions */ +typedef PVOID LPWSPDATA; +typedef PDWORD LPWSATHREADID; +typedef PVOID LPWSPPROC_TABLE; +typedef struct _WSPUPCALLTABLEEX WSPUPCALLTABLEEX; +typedef WSPUPCALLTABLEEX *LPWSPUPCALLTABLEEX; + +#define SO_MAX_RDMA_SIZE 0x700D +#define SO_RDMA_THRESHOLD_SIZE 0x700E + +#define WSAID_REGISTERMEMORY \ + {0xC0B422F5, 0xF58C, 0x11d1, {0xAD, 0x6C, 0x00, 0xC0, 0x4F, 0xA3, 0x4A, 0x2D}} + +#define WSAID_DEREGISTERMEMORY \ + {0xC0B422F6, 0xF58C, 0x11d1, {0xAD, 0x6C, 0x00, 0xC0, 0x4F, 0xA3, 0x4A, 0x2D}} + +#define WSAID_REGISTERRDMAMEMORY \ + {0xC0B422F7, 0xF58C, 0x11d1, {0xAD, 0x6C, 0x00, 0xC0, 0x4F, 0xA3, 0x4A, 0x2D}} + +#define WSAID_DEREGISTERRDMAMEMORY \ + {0xC0B422F8, 0xF58C, 0x11d1, {0xAD, 0x6C, 0x00, 0xC0, 0x4F, 0xA3, 0x4A, 0x2D}} + +#define WSAID_RDMAWRITE \ + {0xC0B422F9, 0xF58C, 0x11d1, {0xAD, 0x6C, 0x00, 0xC0, 0x4F, 0xA3, 0x4A, 0x2D}} + +#define WSAID_RDMAREAD \ + {0xC0B422FA, 0xF58C, 0x11d1, {0xAD, 0x6C, 0x00, 0xC0, 0x4F, 0xA3, 0x4A, 0x2D}} + +#define WSAID_MEMORYREGISTRATIONCACHECALLBACK \ + {0xE5DA4AF8, 0xD824, 0x48CD, {0xA7, 0x99, 0x63, 0x37, 0xA9, 0x8E, 0xD2, 0xAF}} + +typedef struct _WSABUFEX { + u_long len; + char FAR *buf; + HANDLE handle; +} WSABUFEX, FAR * LPWSABUFEX; + +#if 0 +typedef struct _WSPUPCALLTABLEEX { + LPWPUCLOSEEVENT lpWPUCloseEvent; + LPWPUCLOSESOCKETHANDLE lpWPUCloseSocketHandle; + LPWPUCREATEEVENT lpWPUCreateEvent; + LPWPUCREATESOCKETHANDLE lpWPUCreateSocketHandle; + LPWPUFDISSET lpWPUFDIsSet; + LPWPUGETPROVIDERPATH lpWPUGetProviderPath; + LPWPUMODIFYIFSHANDLE lpWPUModifyIFSHandle; + LPWPUPOSTMESSAGE lpWPUPostMessage; + LPWPUQUERYBLOCKINGCALLBACK lpWPUQueryBlockingCallback; + LPWPUQUERYSOCKETHANDLECONTEXT lpWPUQuerySocketHandleContext; + LPWPUQUEUEAPC lpWPUQueueApc; + LPWPURESETEVENT lpWPUResetEvent; + LPWPUSETEVENT lpWPUSetEvent; + LPWPUOPENCURRENTTHREAD lpWPUOpenCurrentThread; + LPWPUCLOSETHREAD lpWPUCloseThread; + LPWPUCOMPLETEOVERLAPPEDREQUEST lpWPUCompleteOverlappedRequest; +} WSPUPCALLTABLEEX, FAR * LPWSPUPCALLTABLEEX; +#endif + +int WSPAPI +WSPStartupEx( + IN WORD wVersionRequested, + OUT LPWSPDATA lpWSPData, + IN LPWSAPROTOCOL_INFOW lpProtocolInfo, + IN LPWSPUPCALLTABLEEX lpUpcallTable, + OUT LPWSPPROC_TABLE lpProcTable); + +typedef int WSPAPI +(*LPWSPSTARTUPEX)( + IN WORD wVersionRequested, + OUT LPWSPDATA lpWSPData, + IN LPWSAPROTOCOL_INFOW lpProtocolInfo, + IN LPWSPUPCALLTABLEEX lpUpcallTable, + OUT LPWSPPROC_TABLE lpProcTable); + +#define MEM_READ 1 +#define MEM_WRITE 2 +#define MEM_READWRITE 3 + +int WSPAPI +WSPDeregisterMemory( + IN SOCKET s, + IN HANDLE Handle, + OUT LPINT lpErrno); + +typedef int WSPAPI +(*LPFN_WSPDEREGISTERMEMORY)( + IN SOCKET s, + IN HANDLE Handle, + OUT LPINT lpErrno); + +int WSPAPI +WSPDeregisterRdmaMemory( + IN SOCKET s, + IN LPVOID lpRdmaBufferDescriptor, + IN DWORD dwDescriptorLength, + OUT LPINT lpErrno); + +typedef int WSPAPI +(*LPFN_WSPDEREGISTERRDMAMEMORY)( + IN SOCKET s, + IN LPVOID lpRdmaBufferDescriptor, + IN DWORD dwDescriptorLength, + OUT LPINT lpErrno); + +int WSPAPI +WSPMemoryRegistrationCacheCallback( + IN PVOID lpvAddress, + IN SIZE_T Size, + OUT LPINT lpErrno); + +typedef int WSPAPI +(*LPFN_WSPMEMORYREGISTRATIONCACHECALLBACK)( + IN PVOID lpvAddress, + IN SIZE_T Size, + OUT LPINT lpErrno); + +int WSPAPI +WSPRdmaRead( + IN SOCKET s, + IN LPWSABUFEX lpBuffers, + IN DWORD dwBufferCount, + IN LPVOID lpTargetBufferDescriptor, + IN DWORD dwTargetDescriptorLength, + IN DWORD dwTargetBufferOffset, + OUT LPDWORD lpdwNumberOfBytesRead, + IN DWORD dwFlags, + IN LPWSAOVERLAPPED lpOverlapped, + IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, + IN LPWSATHREADID lpThreadId, + OUT LPINT lpErrno); + +typedef int WSPAPI +(*LPFN_WSPRDMAREAD)( + IN SOCKET s, + IN LPWSABUFEX lpBuffers, + IN DWORD dwBufferCount, + IN LPVOID lpTargetBufferDescriptor, + IN DWORD dwTargetDescriptorLength, + IN DWORD dwTargetBufferOffset, + OUT LPDWORD lpdwNumberOfBytesRead, + IN DWORD dwFlags, + IN LPWSAOVERLAPPED lpOverlapped, + IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, + IN LPWSATHREADID lpThreadId, + OUT LPINT lpErrno); + +int WSPAPI +WSPRdmaWrite( + IN SOCKET s, + IN LPWSABUFEX lpBuffers, + IN DWORD dwBufferCount, + IN LPVOID lpTargetBufferDescriptor, + IN DWORD dwTargetDescriptorLength, + IN DWORD dwTargetBufferOffset, + OUT LPDWORD lpdwNumberOfBytesWritten, + IN DWORD dwFlags, + IN LPWSAOVERLAPPED lpOverlapped, + IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, + IN LPWSATHREADID lpThreadId, + OUT LPINT lpErrno); + +typedef int WSPAPI +(*LPFN_WSPRDMAWRITE)( + IN SOCKET s, + IN LPWSABUFEX lpBuffers, + IN DWORD dwBufferCount, + IN LPVOID lpTargetBufferDescriptor, + IN DWORD dwTargetDescriptorLength, + IN DWORD dwTargetBufferOffset, + OUT LPDWORD lpdwNumberOfBytesWritten, + IN DWORD dwFlags, + IN LPWSAOVERLAPPED lpOverlapped, + IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, + IN LPWSATHREADID lpThreadId, + OUT LPINT lpErrno); + +HANDLE WSPAPI +WSPRegisterMemory( + IN SOCKET s, + IN PVOID lpBuffer, + IN DWORD dwBufferLength, + IN DWORD dwFlags, + OUT LPINT lpErrno); + +int WSPAPI +WSPRegisterRdmaMemory( + IN SOCKET s, + IN PVOID lpBuffer, + IN DWORD dwBufferLength, + IN DWORD dwFlags, + OUT LPVOID lpRdmaBufferDescriptor, + IN OUT LPDWORD lpdwDescriptorLength, + OUT LPINT lpErrno); + +typedef int WSPAPI +(*LPFN_WSPREGISTERRDMAMEMORY)( + IN SOCKET s, + IN PVOID lpBuffer, + IN DWORD dwBufferLength, + IN DWORD dwFlags, + OUT LPVOID lpRdmaBufferDescriptor, + IN OUT LPDWORD lpdwDescriptorLength, + OUT LPINT lpErrno); + +#pragma pack(pop) + +#ifdef __cplusplus +} +#endif + +#endif /* __WS2SAN_H */ diff --git a/reactos/w32api/include/ddk/xfilter.h b/reactos/w32api/include/ddk/xfilter.h new file mode 100644 index 00000000000..3940b44f2cf --- /dev/null +++ b/reactos/w32api/include/ddk/xfilter.h @@ -0,0 +1,239 @@ +/* + * xfilter.h + * + * Address filtering for NDIS MACs + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> + * + * 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 __XFILTER_H +#define __XFILTER_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ntddk.h" + + +#define ETH_LENGTH_OF_ADDRESS 6 + +#define ETH_IS_BROADCAST(Address) \ + ((((PUCHAR)(Address))[0] == ((UCHAR)0xff)) && (((PUCHAR)(Address))[1] == ((UCHAR)0xff))) + +#define ETH_IS_MULTICAST(Address) \ + (BOOLEAN)(((PUCHAR)(Address))[0] & ((UCHAR)0x01)) + +#define ETH_COMPARE_NETWORK_ADDRESSES(_A, _B, _Result) \ +{ \ + if (*(ULONG UNALIGNED *)&(_A)[2] > *(ULONG UNALIGNED *)&(_B)[2]) \ + { \ + *(_Result) = 1; \ + } \ + else if (*(ULONG UNALIGNED *)&(_A)[2] < *(ULONG UNALIGNED *)&(_B)[2]) \ + { \ + *(_Result) = (UINT)-1; \ + } \ + else if (*(USHORT UNALIGNED *)(_A) > *(USHORT UNALIGNED *)(_B)) \ + { \ + *(_Result) = 1; \ + } \ + else if (*(USHORT UNALIGNED *)(_A) < *(USHORT UNALIGNED *)(_B)) \ + { \ + *(_Result) = (UINT)-1; \ + } \ + else \ + { \ + *(_Result) = 0; \ + } \ +} + +#define ETH_COMPARE_NETWORK_ADDRESSES_EQ(_A,_B, _Result) \ +{ \ + if ((*(ULONG UNALIGNED *)&(_A)[2] == *(ULONG UNALIGNED *)&(_B)[2]) && \ + (*(USHORT UNALIGNED *)(_A) == *(USHORT UNALIGNED *)(_B))) \ + { \ + *(_Result) = 0; \ + } \ + else \ + { \ + *(_Result) = 1; \ + } \ +} + +#define ETH_COPY_NETWORK_ADDRESS(_D, _S) \ +{ \ + *((ULONG UNALIGNED *)(_D)) = *((ULONG UNALIGNED *)(_S)); \ + *((USHORT UNALIGNED *)((UCHAR *)(_D) + 4)) = *((USHORT UNALIGNED *)((UCHAR *)(_S) + 4)); \ +} + +#define FDDI_LENGTH_OF_LONG_ADDRESS 6 +#define FDDI_LENGTH_OF_SHORT_ADDRESS 2 + +#define FDDI_IS_BROADCAST(Address, AddressLength, Result) \ + *Result = ((*(PUCHAR)(Address) == (UCHAR)0xFF) && \ + (*((PUCHAR)(Address) + 1) == (UCHAR)0xFF)) + +#define FDDI_IS_MULTICAST(Address, AddressLength, Result) \ + *Result = (BOOLEAN)(*(UCHAR *)(Address) & (UCHAR)0x01) + +#define FDDI_IS_SMT(FcByte, Result) \ +{ \ + *Result = ((FcByte & ((UCHAR)0xf0)) == 0x40); \ +} + + +#define FDDI_COMPARE_NETWORK_ADDRESSES(_A, _B, _Length, _Result) \ +{ \ + if (*(USHORT UNALIGNED *)(_A) > *(USHORT UNALIGNED *)(_B)) \ + { \ + *(_Result) = 1; \ + } \ + else if (*(USHORT UNALIGNED *)(_A) < *(USHORT UNALIGNED *)(_B)) \ + { \ + *(_Result) = (UINT)-1; \ + } \ + else if (_Length == 2) \ + { \ + *(_Result) = 0; \ + } \ + else if (*(ULONG UNALIGNED *)((PUCHAR)(_A) + 2) > *(ULONG UNALIGNED *)((PUCHAR)(_B) + 2)) \ + { \ + *(_Result) = 1; \ + } \ + else if (*(ULONG UNALIGNED *)((PUCHAR)(_A) + 2) < *(ULONG UNALIGNED *)((PUCHAR)(_B) + 2)) \ + { \ + *(_Result) = (UINT)-1; \ + } \ + else \ + { \ + *(_Result) = 0; \ + } \ +} + +#define FDDI_COMPARE_NETWORK_ADDRESSES_EQ(_A, _B, _Length, _Result) \ +{ \ + if ((*(USHORT UNALIGNED *)(_A) == *(USHORT UNALIGNED *)(_B)) && \ + (((_Length) == 2) || \ + (*(ULONG UNALIGNED *)((PUCHAR)(_A) + 2) == *(ULONG UNALIGNED *)((PUCHAR)(_B) + 2)))) \ + { \ + *(_Result) = 0; \ + } \ + else \ + { \ + *(_Result) = 1; \ + } \ +} + +#define FDDI_COPY_NETWORK_ADDRESS(D, S, AddressLength) \ +{ \ + PCHAR _D = (D); \ + PCHAR _S = (S); \ + UINT _C = (AddressLength); \ + for ( ; _C > 0 ; _D++, _S++, _C--) \ + { \ + *_D = *_S; \ + } \ +} + +#define TR_LENGTH_OF_FUNCTIONAL 4 +#define TR_LENGTH_OF_ADDRESS 6 + +typedef ULONG TR_FUNCTIONAL_ADDRESS; +typedef ULONG TR_GROUP_ADDRESS; + +#define TR_IS_NOT_DIRECTED(_Address, _Result) \ +{ \ + *(_Result) = (BOOLEAN)((_Address)[0] & 0x80); \ +} + +#define TR_IS_FUNCTIONAL(_Address, _Result) \ +{ \ + *(_Result) = (BOOLEAN)(((_Address)[0] & 0x80) && !((_Address)[2] & 0x80)); \ +} + +#define TR_IS_GROUP(_Address, _Result) \ +{ \ + *(_Result) = (BOOLEAN)((_Address)[0] & (_Address)[2] & 0x80); \ +} + +#define TR_IS_SOURCE_ROUTING(_Address, _Result) \ +{ \ + *(_Result) = (BOOLEAN)((_Address)[0] & 0x80); \ +} + +#define TR_IS_MAC_FRAME(_PacketHeader) ((((PUCHAR)_PacketHeader)[1] & 0xFC) == 0) + +#define TR_IS_BROADCAST(_Address, _Result) \ +{ \ + *(_Result) = (BOOLEAN)(((*(UNALIGNED USHORT *)&(_Address)[0] == 0xFFFF) || \ + (*(UNALIGNED USHORT *)&(_Address)[0] == 0x00C0)) && \ + (*(UNALIGNED ULONG *)&(_Address)[2] == 0xFFFFFFFF)); \ +} + +#define TR_COMPARE_NETWORK_ADDRESSES(_A, _B, _Result) \ +{ \ + if (*(ULONG UNALIGNED *)&(_A)[2] > *(ULONG UNALIGNED *)&(_B)[2]) \ + { \ + *(_Result) = 1; \ + } \ + else if (*(ULONG UNALIGNED *)&(_A)[2] < *(ULONG UNALIGNED *)&(_B)[2]) \ + { \ + *(_Result) = (UINT)-1; \ + } \ + else if (*(USHORT UNALIGNED *)(_A) > *(USHORT UNALIGNED *)(_B)) \ + { \ + *(_Result) = 1; \ + } \ + else if (*(USHORT UNALIGNED *)(_A) < *(USHORT UNALIGNED *)(_B)) \ + { \ + *(_Result) = (UINT)-1; \ + } \ + else \ + { \ + *(_Result) = 0; \ + } \ +} + +#define TR_COPY_NETWORK_ADDRESS(_D, _S) \ +{ \ + *((ULONG UNALIGNED *)(_D)) = *((ULONG UNALIGNED *)(_S)); \ + *((USHORT UNALIGNED *)((UCHAR *)(_D)+4)) = *((USHORT UNALIGNED *)((UCHAR *)(_S) + 4)); \ +} + +#define TR_COMPARE_NETWORK_ADDRESSES_EQ(_A, _B, _Result) \ +{ \ + if ((*(ULONG UNALIGNED *)&(_A)[2] == *(ULONG UNALIGNED *)&(_B)[2]) && \ + (*(USHORT UNALIGNED *)&(_A)[0] == *(USHORT UNALIGNED *)&(_B)[0])) \ + { \ + *(_Result) = 0; \ + } \ + else \ + { \ + *(_Result) = 1; \ + } \ +} + +#ifdef __cplusplus +} +#endif + +#endif /* __XFILTER_H */ diff --git a/reactos/w32api/include/dhcpcsdk.h b/reactos/w32api/include/dhcpcsdk.h new file mode 100644 index 00000000000..1d27df766ad --- /dev/null +++ b/reactos/w32api/include/dhcpcsdk.h @@ -0,0 +1,42 @@ +#ifndef _DHCPCDSK_H +#define _DHCPCDSK_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if (_WIN32_WINNT >= 0x0500) +#define DHCPCAPI_REGISTER_HANDLE_EVENT 0x00000001 +#define DHCPCAPI_REQUEST_PERSISTENT 0x00000001 +#define DHCPCAPI_REQUEST_SYNCHRONOUS 0x00000002 +typedef struct _DHCPAPI_CLASSID { + ULONG Flags; + LPBYTE Data; + ULONG nBytesData; +} DHCPCAPI_CLASSID,*PDHCPCAPI_CLASSID,*LPDHCPCAPI_CLASSID; +typedef struct _DHCPAPI_PARAMS { + ULONG Flags; + ULONG OptionId; + BOOL IsVendor; + LPBYTE Data; + DWORD nBytesData; +} DHCPAPI_PARAMS,*PDHCPAPI_PARAMS,*LPDHCPAPI_PARAMS; +typedef struct _DHCPAPI_PARAMS_ARRAY { + ULONG nParams; + LPDHCPAPI_PARAMS Params; +} DHCPCAPI_PARAMS_ARRAY,*PDHCPCAPI_PARAMS_ARRAY,*LPDHCPCAPI_PARAMS_ARRAY; +VOID WINAPI DhcpCApiCleanup(void); +DWORD WINAPI DhcpCApiInitialize(LPDWORD); +DWORD WINAPI DhcpDeRegisterParamChange(DWORD,LPVOID,LPVOID); +DWORD WINAPI DhcpRegisterParamChange(DWORD,LPVOID,PWSTR,LPDHCPCAPI_CLASSID,DHCPCAPI_PARAMS_ARRAY,LPVOID); +DWORD WINAPI DhcpRemoveDNSRegistrations(void); +DWORD WINAPI DhcpUndoRequestParams(DWORD,LPVOID,LPWSTR,LPWSTR); +#endif /* (_WIN32_WINNT >= 0x0500) */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/dlgs.h b/reactos/w32api/include/dlgs.h new file mode 100644 index 00000000000..82525ab5cc2 --- /dev/null +++ b/reactos/w32api/include/dlgs.h @@ -0,0 +1,186 @@ +#ifndef _DLGS_H +#define _DLGS_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define FILEOPENORD 1536 +#define MULTIFILEOPENORD 1537 +#define PRINTDLGORD 1538 +#define PRNSETUPDLGORD 1539 +#define FINDDLGORD 1540 +#define REPLACEDLGORD 1541 +#define FONTDLGORD 1542 +#define FORMATDLGORD31 1543 +#define FORMATDLGORD30 1544 +#define PAGESETUPDLGORD 1546 +#define ctlFirst 0x400 +#define ctlLast 0x4ff +#define chx1 0x410 +#define chx2 0x411 +#define chx3 0x412 +#define chx4 0x413 +#define chx5 0x414 +#define chx6 0x415 +#define chx7 0x416 +#define chx8 0x417 +#define chx9 0x418 +#define chx10 0x419 +#define chx11 0x41a +#define chx12 0x41b +#define chx13 0x41c +#define chx14 0x41d +#define chx15 0x41e +#define chx16 0x41f +#define cmb1 0x470 +#define cmb2 0x471 +#define cmb3 0x472 +#define cmb4 0x473 +#define cmb5 0x474 +#define cmb6 0x475 +#define cmb7 0x476 +#define cmb8 0x477 +#define cmb9 0x478 +#define cmb10 0x479 +#define cmb11 0x47a +#define cmb12 0x47b +#define cmb13 0x47c +#define cmb14 0x47d +#define cmb15 0x47e +#define cmb16 0x47f +#define edt1 0x480 +#define edt2 0x481 +#define edt3 0x482 +#define edt4 0x483 +#define edt5 0x484 +#define edt6 0x485 +#define edt7 0x486 +#define edt8 0x487 +#define edt9 0x488 +#define edt10 0x489 +#define edt11 0x48a +#define edt12 0x48b +#define edt13 0x48c +#define edt14 0x48d +#define edt15 0x48e +#define edt16 0x48f +#define frm1 0x434 +#define frm2 0x435 +#define frm3 0x436 +#define frm4 0x437 +#define grp1 0x430 +#define grp2 0x431 +#define grp3 0x432 +#define grp4 0x433 +#define ico1 0x43c +#define ico2 0x43d +#define ico3 0x43e +#define ico4 0x43f +#define lst1 0x460 +#define lst2 0x461 +#define lst3 0x462 +#define lst4 0x463 +#define lst5 0x464 +#define lst6 0x465 +#define lst7 0x466 +#define lst8 0x467 +#define lst9 0x468 +#define lst10 0x469 +#define lst11 0x46a +#define lst12 0x46b +#define lst13 0x46c +#define lst14 0x46d +#define lst15 0x46e +#define lst16 0x46f +#define psh1 0x400 +#define psh2 0x401 +#define psh3 0x402 +#define psh4 0x403 +#define psh5 0x404 +#define psh6 0x405 +#define psh7 0x406 +#define psh8 0x407 +#define psh9 0x408 +#define psh10 0x409 +#define psh11 0x40a +#define psh12 0x40b +#define psh13 0x40c +#define psh14 0x40d +#define psh15 0x40e +#define pshHelp 0x40e +#define psh16 0x40f +#define rad1 0x420 +#define rad2 0x421 +#define rad3 0x422 +#define rad4 0x423 +#define rad5 0x424 +#define rad6 0x425 +#define rad7 0x426 +#define rad8 0x427 +#define rad9 0x428 +#define rad10 0x429 +#define rad11 0x42a +#define rad12 0x42b +#define rad13 0x42c +#define rad14 0x42d +#define rad15 0x42e +#define rad16 0x42f +#define rct1 0x438 +#define rct2 0x439 +#define rct3 0x43a +#define rct4 0x43b +#define scr1 0x490 +#define scr2 0x491 +#define scr3 0x492 +#define scr4 0x493 +#define scr5 0x494 +#define scr6 0x495 +#define scr7 0x496 +#define scr8 0x497 +#define stc1 0x440 +#define stc2 0x441 +#define stc3 0x442 +#define stc4 0x443 +#define stc5 0x444 +#define stc6 0x445 +#define stc7 0x446 +#define stc8 0x447 +#define stc9 0x448 +#define stc10 0x449 +#define stc11 0x44a +#define stc12 0x44b +#define stc13 0x44c +#define stc14 0x44d +#define stc15 0x44e +#define stc16 0x44f +#define stc17 0x450 +#define stc18 0x451 +#define stc19 0x452 +#define stc20 0x453 +#define stc21 0x454 +#define stc22 0x455 +#define stc23 0x456 +#define stc24 0x457 +#define stc25 0x458 +#define stc26 0x459 +#define stc27 0x45a +#define stc28 0x45b +#define stc29 0x45c +#define stc30 0x45d +#define stc31 0x45e +#define stc32 0x45f +#ifndef RC_INVOKED +typedef struct tagCRGB { + BYTE bRed; + BYTE bGreen; + BYTE bBlue; + BYTE bExtra; +} CRGB; +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/docobj.h b/reactos/w32api/include/docobj.h new file mode 100644 index 00000000000..27055dd845e --- /dev/null +++ b/reactos/w32api/include/docobj.h @@ -0,0 +1,148 @@ +#ifndef _DOCOBJ_H +#define _DOCOBJ_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define OLECMDERR_E_UNKNOWNGROUP (-2147221244) +#define OLECMDERR_E_DISABLED (-2147221247) +#define OLECMDERR_E_NOHELP (-2147221246) +#define OLECMDERR_E_CANCELED (-2147221245) +#define OLECMDERR_E_NOTSUPPORTED (-2147221248) + +typedef enum { + OLECMDID_OPEN = 1, + OLECMDID_NEW = 2, + OLECMDID_SAVE = 3, + OLECMDID_SAVEAS = 4, + OLECMDID_SAVECOPYAS = 5, + OLECMDID_PRINT = 6, + OLECMDID_PRINTPREVIEW = 7, + OLECMDID_PAGESETUP = 8, + OLECMDID_SPELL = 9, + OLECMDID_PROPERTIES = 10, + OLECMDID_CUT = 11, + OLECMDID_COPY = 12, + OLECMDID_PASTE = 13, + OLECMDID_PASTESPECIAL = 14, + OLECMDID_UNDO = 15, + OLECMDID_REDO = 16, + OLECMDID_SELECTALL = 17, + OLECMDID_CLEARSELECTION = 18, + OLECMDID_ZOOM = 19, + OLECMDID_GETZOOMRANGE = 20, + OLECMDID_UPDATECOMMANDS = 21, + OLECMDID_REFRESH = 22, + OLECMDID_STOP = 23, + OLECMDID_HIDETOOLBARS = 24, + OLECMDID_SETPROGRESSMAX = 25, + OLECMDID_SETPROGRESSPOS = 26, + OLECMDID_SETPROGRESSTEXT = 27, + OLECMDID_SETTITLE = 28, + OLECMDID_SETDOWNLOADSTATE = 29, + OLECMDID_STOPDOWNLOAD = 30 +} OLECMDID; +typedef enum { + OLECMDF_SUPPORTED = 1, + OLECMDF_ENABLED = 2, + OLECMDF_LATCHED = 4, + OLECMDF_NINCHED = 8 +} OLECMDF; +typedef enum { + OLECMDEXECOPT_DODEFAULT = 0, + OLECMDEXECOPT_PROMPTUSER = 1, + OLECMDEXECOPT_DONTPROMPTUSER = 2, + OLECMDEXECOPT_SHOWHELP = 3 +} OLECMDEXECOPT; + +typedef struct _tagOLECMDTEXT { + DWORD cmdtextf; + ULONG cwActual; + ULONG cwBuf; + wchar_t rgwz[1]; +} OLECMDTEXT; +typedef struct _tagOLECMD { + ULONG cmdID; + DWORD cmdf; +} OLECMD; + +typedef interface IOleInPlaceSite *LPOLEINPLACESITE; +typedef interface IEnumOleDocumentViews *LPENUMOLEDOCUMENTVIEWS; + +EXTERN_C const IID IID_IContinueCallback; +EXTERN_C const IID IID_IEnumOleDocumentViews; +EXTERN_C const IID IID_IPrint; + +EXTERN_C const IID IID_IOleDocumentView; +#undef INTERFACE +#define INTERFACE IOleDocumentView +DECLARE_INTERFACE_(IOleDocumentView,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + STDMETHOD(SetInPlaceSite)(THIS_ LPOLEINPLACESITE) PURE; + STDMETHOD(GetInPlaceSite)(THIS_ LPOLEINPLACESITE*) PURE; + STDMETHOD(GetDocument)(THIS_ IUnknown*) PURE; + STDMETHOD(SetRect)(THIS_ LPRECT) PURE; + STDMETHOD(GetRect)(THIS_ LPRECT) PURE; + STDMETHOD(SetRectComplex)(THIS_ LPRECT,LPRECT,LPRECT,LPRECT) PURE; + STDMETHOD(Show)(THIS_ BOOL) PURE; + STDMETHOD(UIActivate)(THIS_ BOOL) PURE; + STDMETHOD(Open)(THIS) PURE; + STDMETHOD(Close)(THIS_ DWORD) PURE; + STDMETHOD(SaveViewState)(THIS_ IStream*) PURE; + STDMETHOD(ApplyViewState)(THIS_ IStream*) PURE; + STDMETHOD(Clone)(THIS_ LPOLEINPLACESITE,IOleDocumentView**) PURE; +}; + +DECLARE_ENUMERATOR_(IEnumOleDocumentViews,IOleDocumentView); + +EXTERN_C const IID IID_IOleDocument; +#undef INTERFACE +#define INTERFACE IOleDocument +DECLARE_INTERFACE_(IOleDocument,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + STDMETHOD(CreateView)(THIS_ LPOLEINPLACESITE,IStream*,DWORD,IOleDocumentView**) PURE; + STDMETHOD(GetDocMiscStatus)(THIS_ DWORD*) PURE; + STDMETHOD(EnumViews)(THIS_ LPENUMOLEDOCUMENTVIEWS*,IOleDocumentView**) PURE; +}; + +EXTERN_C const IID IID_IOleCommandTarget; +#undef INTERFACE +#define INTERFACE IOleCommandTarget +DECLARE_INTERFACE_(IOleCommandTarget,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + STDMETHOD(QueryStatus)(THIS_ const GUID*,ULONG,OLECMD*,OLECMDTEXT*) PURE; + STDMETHOD(Exec)(THIS_ const GUID*,DWORD,DWORD,VARIANTARG*,VARIANTARG*) PURE; +}; + +EXTERN_C const IID IID_IOleDocumentSite; +#undef INTERFACE +#define INTERFACE IOleDocumentSite +DECLARE_INTERFACE_(IOleDocumentSite,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + STDMETHOD(ActivateMe)(THIS_ IOleDocumentView*) PURE; +}; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/errorrep.h b/reactos/w32api/include/errorrep.h new file mode 100644 index 00000000000..1361855e3dd --- /dev/null +++ b/reactos/w32api/include/errorrep.h @@ -0,0 +1,40 @@ +#ifndef _ERRORREP_H +#define _ERRORREP_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if (_WIN32_WINNT >= 0x0501) +typedef enum { + frrvErr = 3, + frrvErrNoDW = 4, + frrvErrTimeout = 5, + frrvLaunchDebugger = 6, + frrvOk = 0, + frrvOkHeadless = 7, + frrvOkManifest = 1, + frrvOkQueued = 2 +} EFaultRepRetVal; +BOOL WINAPI AddERExcludedApplicationA(LPCSTR); +BOOL WINAPI AddERExcludedApplicationW(LPCWSTR); +EFaultRepRetVal WINAPI ReportFault(LPEXCEPTION_POINTERS,DWORD); +#endif + +#ifdef UNICODE +#if (_WIN32_WINNT >= 0x0501) +#define AddERExcludedApplication AddERExcludedApplicationW +#endif +#else +#if (_WIN32_WINNT >= 0x0501) +#define AddERExcludedApplication AddERExcludedApplicationA +#endif +#endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/exdisp.h b/reactos/w32api/include/exdisp.h new file mode 100644 index 00000000000..9e747df1119 --- /dev/null +++ b/reactos/w32api/include/exdisp.h @@ -0,0 +1,257 @@ +#ifndef _EXDISP_H +#define _EXDISP_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif +#ifdef __cplusplus +extern "C" { +#endif +#include <oaidl.h> +#include <ocidl.h> +#include <docobj.h> + +EXTERN_C const CLSID CLSID_WebBrowser; +EXTERN_C const IID DIID_DWebBrowserEvents; + +typedef enum { + navOpenInNewWindow = 0x1, + navNoHistory = 0x2, + navNoReadFromCache = 0x4, + navNoWriteTocache = 0x8, + navAllowAutosearch = 0x10, + navBrowserBar = 0x20, + navHyperLink = 0x40 +} BrowserNavConstants; + +EXTERN_C const IID IID_IWebBrowser; +#undef INTERFACE +#define INTERFACE IWebBrowser +DECLARE_INTERFACE_(IWebBrowser,IDispatch) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetTypeInfoCount)(THIS_ UINT*) PURE; + STDMETHOD(GetTypeInfo)(THIS_ UINT,LCID,LPTYPEINFO*) PURE; + STDMETHOD(GetIDsOfNames)(THIS_ REFIID,LPOLESTR*,UINT,LCID,DISPID*) PURE; + STDMETHOD(Invoke)(THIS_ DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*) PURE; + + STDMETHOD(GoBack)(THIS) PURE; + STDMETHOD(GoForward)(THIS) PURE; + STDMETHOD(GoHome)(THIS) PURE; + STDMETHOD(GoSearch)(THIS) PURE; + STDMETHOD(Navigate)(THIS_ BSTR,VARIANT*,VARIANT*,VARIANT*,VARIANT*) PURE; + STDMETHOD(Refresh)(THIS) PURE; + STDMETHOD(Refresh2)(THIS_ VARIANT*) PURE; + STDMETHOD(Stop)(THIS) PURE; + STDMETHOD(get_Application)(THIS_ IDispatch**) PURE; + STDMETHOD(get_Parent)(THIS_ IDispatch**) PURE; + STDMETHOD(get_Container)(THIS_ IDispatch**) PURE; + STDMETHOD(get_Document)(THIS_ IDispatch**) PURE; + STDMETHOD(get_TopLevelContainer)(THIS_ VARIANT_BOOL*) PURE; + STDMETHOD(get_Type)(THIS_ BSTR*) PURE; + STDMETHOD(get_Left)(THIS_ long*) PURE; + STDMETHOD(put_Left)(THIS_ long) PURE; + STDMETHOD(get_Top)(THIS_ long*) PURE; + STDMETHOD(put_Top)(THIS_ long) PURE; + STDMETHOD(get_Width)(THIS_ long*) PURE; + STDMETHOD(put_Width)(THIS_ long) PURE; + STDMETHOD(get_Height)(THIS_ long*) PURE; + STDMETHOD(put_Height)(THIS_ long) PURE; + STDMETHOD(get_LocationName)(THIS_ BSTR*) PURE; + STDMETHOD(get_LocationURL)(THIS_ BSTR*) PURE; + STDMETHOD(get_Busy)(THIS_ VARIANT_BOOL*) PURE; +}; + +EXTERN_C const IID IID_IWebBrowserApp; +#undef INTERFACE +#define INTERFACE IWebBrowserApp +DECLARE_INTERFACE_(IWebBrowserApp,IWebBrowser) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetTypeInfoCount)(THIS_ UINT*) PURE; + STDMETHOD(GetTypeInfo)(THIS_ UINT,LCID,LPTYPEINFO*) PURE; + STDMETHOD(GetIDsOfNames)(THIS_ REFIID,LPOLESTR*,UINT,LCID,DISPID*) PURE; + STDMETHOD(Invoke)(THIS_ DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*) PURE; + + STDMETHOD(GoBack)(THIS) PURE; + STDMETHOD(GoForward)(THIS) PURE; + STDMETHOD(GoHome)(THIS) PURE; + STDMETHOD(GoSearch)(THIS) PURE; + STDMETHOD(Navigate)(THIS_ BSTR,VARIANT*,VARIANT*,VARIANT*,VARIANT*) PURE; + STDMETHOD(Refresh)(THIS) PURE; + STDMETHOD(Refresh2)(THIS_ VARIANT*) PURE; + STDMETHOD(Stop)(THIS) PURE; + STDMETHOD(get_Application)(THIS_ IDispatch**) PURE; + STDMETHOD(get_Parent)(THIS_ IDispatch**) PURE; + STDMETHOD(get_Container)(THIS_ IDispatch**) PURE; + STDMETHOD(get_Document)(THIS_ IDispatch**) PURE; + STDMETHOD(get_TopLevelContainer)(THIS_ VARIANT_BOOL*) PURE; + STDMETHOD(get_Type)(THIS_ BSTR*) PURE; + STDMETHOD(get_Left)(THIS_ long*) PURE; + STDMETHOD(put_Left)(THIS_ long) PURE; + STDMETHOD(get_Top)(THIS_ long*) PURE; + STDMETHOD(put_Top)(THIS_ long) PURE; + STDMETHOD(get_Width)(THIS_ long*) PURE; + STDMETHOD(put_Width)(THIS_ long) PURE; + STDMETHOD(get_Height)(THIS_ long*) PURE; + STDMETHOD(put_Height)(THIS_ long) PURE; + STDMETHOD(get_LocationName)(THIS_ BSTR*) PURE; + STDMETHOD(get_LocationURL)(THIS_ BSTR*) PURE; + STDMETHOD(get_Busy)(THIS_ VARIANT_BOOL*) PURE; + + STDMETHOD(Quit)(THIS) PURE; + STDMETHOD(ClientToWindow)(THIS_ int*,int*) PURE; + STDMETHOD(PutProperty)(THIS_ BSTR,VARIANT) PURE; + STDMETHOD(GetProperty)(THIS_ BSTR,VARIANT*) PURE; + STDMETHOD(get_Name)(THIS_ BSTR*) PURE; + STDMETHOD(get_HWND)(THIS_ long*) PURE; + STDMETHOD(get_FullName)(THIS_ BSTR*) PURE; + STDMETHOD(get_Path)(THIS_ BSTR*) PURE; + STDMETHOD(get_Visible)(THIS_ VARIANT_BOOL*) PURE; + STDMETHOD(put_Visible)(THIS_ VARIANT_BOOL) PURE; + STDMETHOD(get_StatusBar)(THIS_ VARIANT_BOOL*) PURE; + STDMETHOD(put_StatusBar)(THIS_ VARIANT_BOOL) PURE; + STDMETHOD(get_StatusText)(THIS_ BSTR*) PURE; + STDMETHOD(put_StatusText)(THIS_ BSTR) PURE; + STDMETHOD(get_ToolBar)(THIS_ int*) PURE; + STDMETHOD(put_ToolBar)(THIS_ int) PURE; + STDMETHOD(get_MenuBar)(THIS_ VARIANT_BOOL*) PURE; + STDMETHOD(put_MenuBar)(THIS_ VARIANT_BOOL) PURE; + STDMETHOD(get_FullScreen)(THIS_ VARIANT_BOOL*) PURE; + STDMETHOD(put_FullScreen)(THIS_ VARIANT_BOOL) PURE; +}; + +EXTERN_C const IID IID_IWebBrowser2; +#undef INTERFACE +#define INTERFACE IWebBrowser2 +DECLARE_INTERFACE_(IWebBrowser2,IWebBrowserApp) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetTypeInfoCount)(THIS_ UINT*) PURE; + STDMETHOD(GetTypeInfo)(THIS_ UINT,LCID,LPTYPEINFO*) PURE; + STDMETHOD(GetIDsOfNames)(THIS_ REFIID,LPOLESTR*,UINT,LCID,DISPID*) PURE; + STDMETHOD(Invoke)(THIS_ DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*) PURE; + + STDMETHOD(GoBack)(THIS) PURE; + STDMETHOD(GoForward)(THIS) PURE; + STDMETHOD(GoHome)(THIS) PURE; + STDMETHOD(GoSearch)(THIS) PURE; + STDMETHOD(Navigate)(THIS_ BSTR,VARIANT*,VARIANT*,VARIANT*,VARIANT*) PURE; + STDMETHOD(Refresh)(THIS) PURE; + STDMETHOD(Refresh2)(THIS_ VARIANT*) PURE; + STDMETHOD(Stop)(THIS) PURE; + STDMETHOD(get_Application)(THIS_ IDispatch**) PURE; + STDMETHOD(get_Parent)(THIS_ IDispatch**) PURE; + STDMETHOD(get_Container)(THIS_ IDispatch**) PURE; + STDMETHOD(get_Document)(THIS_ IDispatch**) PURE; + STDMETHOD(get_TopLevelContainer)(THIS_ VARIANT_BOOL*) PURE; + STDMETHOD(get_Type)(THIS_ BSTR*) PURE; + STDMETHOD(get_Left)(THIS_ long*) PURE; + STDMETHOD(put_Left)(THIS_ long) PURE; + STDMETHOD(get_Top)(THIS_ long*) PURE; + STDMETHOD(put_Top)(THIS_ long) PURE; + STDMETHOD(get_Width)(THIS_ long*) PURE; + STDMETHOD(put_Width)(THIS_ long) PURE; + STDMETHOD(get_Height)(THIS_ long*) PURE; + STDMETHOD(put_Height)(THIS_ long) PURE; + STDMETHOD(get_LocationName)(THIS_ BSTR*) PURE; + STDMETHOD(get_LocationURL)(THIS_ BSTR*) PURE; + STDMETHOD(get_Busy)(THIS_ VARIANT_BOOL*) PURE; + + STDMETHOD(Quit)(THIS) PURE; + STDMETHOD(ClientToWindow)(THIS_ int*,int*) PURE; + STDMETHOD(PutProperty)(THIS_ BSTR,VARIANT) PURE; + STDMETHOD(GetProperty)(THIS_ BSTR,VARIANT*) PURE; + STDMETHOD(get_Name)(THIS_ BSTR*) PURE; + STDMETHOD(get_HWND)(THIS_ long*) PURE; + STDMETHOD(get_FullName)(THIS_ BSTR*) PURE; + STDMETHOD(get_Path)(THIS_ BSTR*) PURE; + STDMETHOD(get_Visible)(THIS_ VARIANT_BOOL*) PURE; + STDMETHOD(put_Visible)(THIS_ VARIANT_BOOL) PURE; + STDMETHOD(get_StatusBar)(THIS_ VARIANT_BOOL*) PURE; + STDMETHOD(put_StatusBar)(THIS_ VARIANT_BOOL) PURE; + STDMETHOD(get_StatusText)(THIS_ BSTR*) PURE; + STDMETHOD(put_StatusText)(THIS_ BSTR) PURE; + STDMETHOD(get_ToolBar)(THIS_ int*) PURE; + STDMETHOD(put_ToolBar)(THIS_ int) PURE; + STDMETHOD(get_MenuBar)(THIS_ VARIANT_BOOL*) PURE; + STDMETHOD(put_MenuBar)(THIS_ VARIANT_BOOL) PURE; + STDMETHOD(get_FullScreen)(THIS_ VARIANT_BOOL*) PURE; + STDMETHOD(put_FullScreen)(THIS_ VARIANT_BOOL) PURE; + + STDMETHOD(Navigate2)(THIS_ VARIANT*,VARIANT*,VARIANT*,VARIANT*,VARIANT*) PURE; + STDMETHOD(QueryStatusWB)(THIS_ OLECMDID,OLECMDF*) PURE; + STDMETHOD(ExecWB)(THIS_ OLECMDID,OLECMDEXECOPT,VARIANT*,VARIANT*) PURE; + STDMETHOD(ShowBrowserBar)(THIS_ VARIANT*,VARIANT*,VARIANT*) PURE; + STDMETHOD(get_ReadyState)(THIS_ READYSTATE*) PURE; + STDMETHOD(get_Offline)(THIS_ VARIANT_BOOL*) PURE; + STDMETHOD(put_Offline)(THIS_ VARIANT_BOOL) PURE; + STDMETHOD(get_Silent)(THIS_ VARIANT_BOOL*) PURE; + STDMETHOD(put_Silent)(THIS_ VARIANT_BOOL) PURE; + STDMETHOD(get_RegistaerAsBrowser)(THIS_ VARIANT_BOOL*) PURE; + STDMETHOD(put_RegisterAsBrowser)(THIS_ VARIANT_BOOL) PURE; + STDMETHOD(get_RegistaerAsDropTarget)(THIS_ VARIANT_BOOL*) PURE; + STDMETHOD(put_RegisterAsDropTarget)(THIS_ VARIANT_BOOL) PURE; + STDMETHOD(get_TheaterMode)(THIS_ VARIANT_BOOL*) PURE; + STDMETHOD(put_TheaterMode)(THIS_ VARIANT_BOOL) PURE; + STDMETHOD(get_AddressBar)(THIS_ VARIANT_BOOL*) PURE; + STDMETHOD(put_AddressBar)(THIS_ VARIANT_BOOL) PURE; + STDMETHOD(get_Resizable)(THIS_ VARIANT_BOOL*) PURE; + STDMETHOD(put_Resizable)(THIS_ VARIANT_BOOL) PURE; +}; + +#define STDDISP(m) STDMETHOD_(void,m) + +EXTERN_C const IID DIID_DWebBrowserEvents2; +#undef INTERFACE +#define INTERFACE DWebBrowserEvents2 +DECLARE_INTERFACE_(DWebBrowserEvents2,IDispatch) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetTypeInfoCount)(THIS_ UINT*) PURE; + STDMETHOD(GetTypeInfo)(THIS_ UINT,LCID,LPTYPEINFO*) PURE; + STDMETHOD(GetIDsOfNames)(THIS_ REFIID,LPOLESTR*,UINT,LCID,DISPID*) PURE; + STDMETHOD(Invoke)(THIS_ DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*) PURE; + + STDDISP(StatusTextChange)(THIS_ BSTR) PURE; + STDDISP(ProgressChange)(THIS_ long,long) PURE; + STDDISP(CommandStateChange)(THIS_ long,VARIANT_BOOL) PURE; + STDDISP(DownloadBegin)(THIS) PURE; + STDDISP(DownloadComplete)(THIS) PURE; + STDDISP(TitleChange)(THIS_ BSTR) PURE; + STDDISP(PropertyChange)(THIS_ BSTR) PURE; + STDDISP(BeforeNavigate2)(THIS_ IDispatch*,VARIANT*,VARIANT*,VARIANT*,VARIANT*,VARIANT*,VARIANT_BOOL*) PURE; + STDDISP(NewWindow2)(THIS_ IDispatch**,VARIANT_BOOL*) PURE; + STDDISP(NavigateComplete)(THIS_ IDispatch*,VARIANT*) PURE; + STDDISP(DocumentComplete)(THIS_ IDispatch*,VARIANT*) PURE; + STDDISP(OnQuit)(THIS) PURE; + STDDISP(OnVisible)(THIS_ VARIANT_BOOL) PURE; + STDDISP(OnToolBar)(THIS_ VARIANT_BOOL) PURE; + STDDISP(OnMenuBar)(THIS_ VARIANT_BOOL) PURE; + STDDISP(OnStatusBar)(THIS_ VARIANT_BOOL) PURE; + STDDISP(OnFullScreen)(THIS_ VARIANT_BOOL) PURE; + STDDISP(OnTheaterMode)(THIS_ VARIANT_BOOL) PURE; + STDDISP(WindowSetResizable)(THIS_ VARIANT_BOOL) PURE; + STDDISP(WindowSetLeft)(THIS_ long) PURE; + STDDISP(WindowSetTop)(THIS_ long) PURE; + STDDISP(WindowSetWidth)(THIS_ long) PURE; + STDDISP(WindowSetHeight)(THIS_ long) PURE; + STDDISP(WindowClosing)(THIS_ VARIANT_BOOL,VARIANT_BOOL*) PURE; + STDDISP(ClientToHostWindow)(THIS_ long*,long*) PURE; + STDDISP(SetSecureLockIcon)(THIS_ long) PURE; + STDDISP(FileDownload)(THIS_ VARIANT_BOOL*) PURE; +}; + +#undef STDDISP + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/exdispid.h b/reactos/w32api/include/exdispid.h new file mode 100644 index 00000000000..da2b0a4f01a --- /dev/null +++ b/reactos/w32api/include/exdispid.h @@ -0,0 +1,14 @@ +#ifndef _EXDISPID_H +#define _EXDISPID_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#define DISPID_BEFORENAVIGATE2 250 +#define DISPID_NEWWINDOW2 251 +#define DISPID_PROGRESSCHANGE 108 +#define DISPID_DOCUMENTCOMPLETE 259 +#define DISPID_STATUSTEXTCHANGE 102 +#define DISPID_TITLECHANGE 113 + +#endif diff --git a/reactos/w32api/include/httpext.h b/reactos/w32api/include/httpext.h new file mode 100644 index 00000000000..ddff9471f6d --- /dev/null +++ b/reactos/w32api/include/httpext.h @@ -0,0 +1,90 @@ +/* + httpext.h - Header for ISAPI extensions. + + This file is part of a free library for the Win32 API. + + 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. +*/ + +#ifndef _HTTPEXT_H +#define _HTTPEXT_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#include <windows.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#define HSE_VERSION_MAJOR 2 +#define HSE_VERSION_MINOR 0 +#define HSE_LOG_BUFFER_LEN 80 +#define HSE_MAX_EXT_DLL_NAME_LEN 256 +#define HSE_STATUS_SUCCESS 1 +#define HSE_STATUS_SUCCESS_AND_KEEP_CONN 2 +#define HSE_STATUS_PENDING 3 +#define HSE_STATUS_ERROR 4 +#define HSE_REQ_BASE 0 +#define HSE_REQ_SEND_URL_REDIRECT_RESP 1 +#define HSE_REQ_SEND_URL 2 +#define HSE_REQ_SEND_RESPONSE_HEADER 3 +#define HSE_REQ_DONE_WITH_SESSION 4 +#define HSE_REQ_END_RESERVED 1000 +#define HSE_TERM_ADVISORY_UNLOAD 0x00000001 +#define HSE_TERM_MUST_UNLOAD 0x00000002 +#define HSE_IO_SYNC 0x00000001 +#define HSE_IO_ASYNC 0x00000002 +#define HSE_IO_DISCONNECT_AFTER_SEND 0x00000004 +#define HSE_IO_SEND_HEADERS 0x00000008 +typedef LPVOID HCONN; +typedef struct _HSE_VERSION_INFO { + DWORD dwExtensionVersion; + CHAR lpszExtensionDesc[HSE_MAX_EXT_DLL_NAME_LEN]; +} HSE_VERSION_INFO, *LPHSE_VERSION_INFO; +typedef struct _EXTENSION_CONTROL_BLOCK { + DWORD cbSize; + DWORD dwVersion; + HCONN ConnID; + DWORD dwHttpStatusCode; + CHAR lpszLogData[HSE_LOG_BUFFER_LEN]; + LPSTR lpszMethod; + LPSTR lpszQueryString; + LPSTR lpszPathInfo; + LPSTR lpszPathTranslated; + DWORD cbTotalBytes; + DWORD cbAvailable; + LPBYTE lpbData; + LPSTR lpszContentType; + BOOL (PASCAL *GetServerVariable)(HCONN,LPSTR,LPVOID,LPDWORD); + BOOL (PASCAL *WriteClient)(HCONN,LPVOID,LPDWORD,DWORD); + BOOL (PASCAL *ReadClient)(HCONN,LPVOID,LPDWORD); + BOOL (PASCAL *ServerSupportFunction)(HCONN,DWORD,LPVOID,LPDWORD,LPDWORD); +} EXTENSION_CONTROL_BLOCK, *LPEXTENSION_CONTROL_BLOCK; +typedef BOOL (PASCAL *PFN_GETEXTENSIONVERSION)(HSE_VERSION_INFO*); +typedef DWORD (PASCAL *PFN_HTTPEXTENSIONPROC)(EXTENSION_CONTROL_BLOCK*); +typedef BOOL (PASCAL *PFN_TERMINATEEXTENSION)(DWORD); +typedef VOID (PASCAL *PFN_HSE_IO_COMPLETION)(EXTENSION_CONTROL_BLOCK*,PVOID,DWORD,DWORD); +typedef struct _HSE_TF_INFO { + PFN_HSE_IO_COMPLETION pfnHseIO; + PVOID pContext; + HANDLE hFile; + LPCSTR pszStatusCode; + DWORD BytesToWrite; + DWORD Offset; + PVOID pHead; + DWORD HeadLength; + PVOID pTail; + DWORD TailLength; + DWORD dwFlags; +} HSE_TF_INFO, *LPHSE_TF_INFO; +BOOL PASCAL GetExtensionVersion(HSE_VERSION_INFO*); +DWORD PASCAL HttpExtensionProc(EXTENSION_CONTROL_BLOCK*); +BOOL PASCAL TerminateExtension(DWORD); +#ifdef __cplusplus +} +#endif +#endif /* _HTTPEXT_H */ diff --git a/reactos/w32api/include/idispids.h b/reactos/w32api/include/idispids.h new file mode 100644 index 00000000000..66585b4d0e7 --- /dev/null +++ b/reactos/w32api/include/idispids.h @@ -0,0 +1,10 @@ +#ifndef _IDISPIDS_H +#define _IDISPIDS_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#define DISPID_AMBIENT_OFFLINEIFNOTCONNECTED (-5501) +#define DISPID_AMBIENT_SILENT (-5502) + +#endif diff --git a/reactos/w32api/include/imagehlp.h b/reactos/w32api/include/imagehlp.h new file mode 100644 index 00000000000..1f94533c10e --- /dev/null +++ b/reactos/w32api/include/imagehlp.h @@ -0,0 +1,329 @@ +/* + imagehlp.h - Include file for IMAGEHLP.DLL APIs + + Written by Mumit Khan <khan@nanotech.wisc.edu> + + This file is part of a free library for the Win32 API. + + NOTE: This strictly does not belong in the Win32 API since it's + really part of Platform SDK. However,GDB needs it and we might + as well provide it here. + + 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. + +*/ + +#ifndef _IMAGEHLP_H +#define _IMAGEHLP_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define API_VERSION_NUMBER 7 +#define BIND_NO_BOUND_IMPORTS 0x00000001 +#define BIND_NO_UPDATE 0x00000002 +#define BIND_ALL_IMAGES 0x00000004 +#define BIND_CACHE_IMPORT_DLLS 0x00000008 +#define CBA_DEFERRED_SYMBOL_LOAD_START 1 +#define CBA_DEFERRED_SYMBOL_LOAD_COMPLETE 2 +#define CBA_DEFERRED_SYMBOL_LOAD_FAILURE 3 +#define CBA_SYMBOLS_UNLOADED 4 +#define CBA_DUPLICATE_SYMBOL 5 +#define CERT_PE_IMAGE_DIGEST_DEBUG_INFO 1 +#define CERT_PE_IMAGE_DIGEST_RESOURCES 2 +#define CERT_PE_IMAGE_DIGEST_ALL_IMPORT_INFO 4 +#define CERT_PE_IMAGE_DIGEST_NON_PE_INFO 8 +#define CERT_SECTION_TYPE_ANY 255 +#define CHECKSUM_SUCCESS 0 +#define CHECKSUM_OPEN_FAILURE 1 +#define CHECKSUM_MAP_FAILURE 2 +#define CHECKSUM_MAPVIEW_FAILURE 3 +#define CHECKSUM_UNICODE_FAILURE 4 +#define IMAGE_SEPARATION 65536 +#define SPLITSYM_REMOVE_PRIVATE 1 +#define SPLITSYM_EXTRACT_ALL 2 +#define SPLITSYM_SYMBOLPATH_IS_SRC 4 +#define SYMF_OMAP_GENERATED 1 +#define SYMF_OMAP_MODIFIED 2 +#define SYMOPT_CASE_INSENSITIVE 1 +#define SYMOPT_UNDNAME 2 +#define SYMOPT_DEFERRED_LOADS 4 +#define SYMOPT_NO_CPP 8 +#define SYMOPT_LOAD_LINES 16 +#define SYMOPT_OMAP_FIND_NEAREST 32 +#define UNDNAME_COMPLETE 0 +#define UNDNAME_NO_LEADING_UNDERSCORES 1 +#define UNDNAME_NO_MS_KEYWORDS 2 +#define UNDNAME_NO_FUNCTION_RETURNS 4 +#define UNDNAME_NO_ALLOCATION_MODEL 8 +#define UNDNAME_NO_ALLOCATION_LANGUAGE 16 +#define UNDNAME_NO_MS_THISTYPE 32 +#define UNDNAME_NO_CV_THISTYPE 64 +#define UNDNAME_NO_THISTYPE 96 +#define UNDNAME_NO_ACCESS_SPECIFIERS 128 +#define UNDNAME_NO_THROW_SIGNATURES 256 +#define UNDNAME_NO_MEMBER_TYPE 512 +#define UNDNAME_NO_RETURN_UDT_MODEL 1024 +#define UNDNAME_32_BIT_DECODE 2048 +#define UNDNAME_NAME_ONLY 4096 +#define UNDNAME_NO_ARGUMENTS 8192 +#define UNDNAME_NO_SPECIAL_SYMS 16384 + +#define _IMAGEHLPAPI DECLSPEC_IMPORT WINAPI + +#ifndef RC_INVOKED + +typedef enum _IMAGEHLP_STATUS_REASON { + BindOutOfMemory, + BindRvaToVaFailed, + BindNoRoomInImage, + BindImportModuleFailed, + BindImportProcedureFailed, + BindImportModule, + BindImportProcedure, + BindForwarder, + BindForwarderNOT, + BindImageModified, + BindExpandFileHeaders, + BindImageComplete, + BindMismatchedSymbols, + BindSymbolsNotUpdated +} IMAGEHLP_STATUS_REASON; +typedef BOOL(STDCALL*PIMAGEHLP_STATUS_ROUTINE)(IMAGEHLP_STATUS_REASON,LPSTR,LPSTR,ULONG,ULONG); +typedef struct _LOADED_IMAGE { + LPSTR ModuleName; + HANDLE hFile; + PUCHAR MappedAddress; + PIMAGE_NT_HEADERS FileHeader; + PIMAGE_SECTION_HEADER LastRvaSection; + ULONG NumberOfSections; + PIMAGE_SECTION_HEADER Sections; + ULONG Characteristics; + BOOLEAN fSystemImage; + BOOLEAN fDOSImage; + LIST_ENTRY Links; + ULONG SizeOfImage; +} LOADED_IMAGE,*PLOADED_IMAGE; +typedef struct _IMAGE_DEBUG_INFORMATION { + LIST_ENTRY List; + DWORD Size; + PVOID MappedBase; + USHORT Machine; + USHORT Characteristics; + DWORD CheckSum; + DWORD ImageBase; + DWORD SizeOfImage; + DWORD NumberOfSections; + PIMAGE_SECTION_HEADER Sections; + DWORD ExportedNamesSize; + LPSTR ExportedNames; + DWORD NumberOfFunctionTableEntries; + PIMAGE_FUNCTION_ENTRY FunctionTableEntries; + DWORD LowestFunctionStartingAddress; + DWORD HighestFunctionEndingAddress; + DWORD NumberOfFpoTableEntries; + PFPO_DATA FpoTableEntries; + DWORD SizeOfCoffSymbols; + PIMAGE_COFF_SYMBOLS_HEADER CoffSymbols; + DWORD SizeOfCodeViewSymbols; + PVOID CodeViewSymbols; + LPSTR ImageFilePath; + LPSTR ImageFileName; + LPSTR DebugFilePath; + DWORD TimeDateStamp; + BOOL RomImage; + PIMAGE_DEBUG_DIRECTORY DebugDirectory; + DWORD NumberOfDebugDirectories; + DWORD Reserved[3]; +} IMAGE_DEBUG_INFORMATION,*PIMAGE_DEBUG_INFORMATION; +typedef enum { + AddrMode1616, + AddrMode1632, + AddrModeReal, + AddrModeFlat +} ADDRESS_MODE; +typedef struct _tagADDRESS { + DWORD Offset; + WORD Segment; + ADDRESS_MODE Mode; +} ADDRESS,*LPADDRESS; +typedef struct _KDHELP { + DWORD Thread; + DWORD ThCallbackStack; + DWORD NextCallback; + DWORD FramePointer; + DWORD KiCallUserMode; + DWORD KeUserCallbackDispatcher; + DWORD SystemRangeStart; +} KDHELP,*PKDHELP; +typedef struct _tagSTACKFRAME { + ADDRESS AddrPC; + ADDRESS AddrReturn; + ADDRESS AddrFrame; + ADDRESS AddrStack; + LPVOID FuncTableEntry; + DWORD Params[4]; + BOOL Far; + BOOL Virtual; + DWORD Reserved[3]; + KDHELP KdHelp; +} STACKFRAME,*LPSTACKFRAME; +typedef BOOL(STDCALL*PREAD_PROCESS_MEMORY_ROUTINE)(HANDLE ,LPCVOID,LPVOID,DWORD,LPDWORD); +typedef LPVOID(STDCALL*PFUNCTION_TABLE_ACCESS_ROUTINE)(HANDLE,DWORD); +typedef DWORD(STDCALL*PGET_MODULE_BASE_ROUTINE)(HANDLE,DWORD); +typedef DWORD(STDCALL*PTRANSLATE_ADDRESS_ROUTINE)(HANDLE,HANDLE,LPADDRESS); +typedef struct API_VERSION { + USHORT MajorVersion; + USHORT MinorVersion; + USHORT Revision; + USHORT Reserved; +} API_VERSION,*LPAPI_VERSION; +typedef BOOL(CALLBACK*PSYM_ENUMMODULES_CALLBACK)(LPSTR,ULONG,PVOID); +typedef BOOL(CALLBACK*PSYM_ENUMSYMBOLS_CALLBACK)(LPSTR,ULONG,ULONG,PVOID); +typedef BOOL(CALLBACK*PENUMLOADED_MODULES_CALLBACK)(LPSTR,ULONG,ULONG,PVOID); +typedef BOOL(CALLBACK*PSYMBOL_REGISTERED_CALLBACK)(HANDLE,ULONG,PVOID,PVOID); +typedef enum { + SymNone, + SymCoff, + SymCv, + SymPdb, + SymExport, + SymDeferred, + SymSym +} SYM_TYPE; +typedef struct _IMAGEHLP_SYMBOL { + DWORD SizeOfStruct; + DWORD Address; + DWORD Size; + DWORD Flags; + DWORD MaxNameLength; + CHAR Name[1]; +} IMAGEHLP_SYMBOL,*PIMAGEHLP_SYMBOL; +typedef struct _IMAGEHLP_MODULE { + DWORD SizeOfStruct; + DWORD BaseOfImage; + DWORD ImageSize; + DWORD TimeDateStamp; + DWORD CheckSum; + DWORD NumSyms; + SYM_TYPE SymType; + CHAR ModuleName[32]; + CHAR ImageName[256]; + CHAR LoadedImageName[256]; +} IMAGEHLP_MODULE,*PIMAGEHLP_MODULE; +typedef struct _IMAGEHLP_LINE { + DWORD SizeOfStruct; + DWORD Key; + DWORD LineNumber; + PCHAR FileName; + DWORD Address; +} IMAGEHLP_LINE,*PIMAGEHLP_LINE; +typedef struct _IMAGEHLP_DEFERRED_SYMBOL_LOAD { + DWORD SizeOfStruct; + DWORD BaseOfImage; + DWORD CheckSum; + DWORD TimeDateStamp; + CHAR FileName[MAX_PATH]; + BOOLEAN Reparse; +} IMAGEHLP_DEFERRED_SYMBOL_LOAD,*PIMAGEHLP_DEFERRED_SYMBOL_LOAD; +typedef struct _IMAGEHLP_DUPLICATE_SYMBOL { + DWORD SizeOfStruct; + DWORD NumberOfDups; + PIMAGEHLP_SYMBOL Symbol; + ULONG SelectedSymbol; +} IMAGEHLP_DUPLICATE_SYMBOL,*PIMAGEHLP_DUPLICATE_SYMBOL; +typedef PVOID DIGEST_HANDLE; +typedef BOOL(WINAPI*DIGEST_FUNCTION)(DIGEST_HANDLE refdata,PBYTE pData,DWORD dwLength); + +PIMAGE_NT_HEADERS _IMAGEHLPAPI CheckSumMappedFile(LPVOID,DWORD,LPDWORD,LPDWORD); +DWORD _IMAGEHLPAPI MapFileAndCheckSumA(LPSTR,LPDWORD,LPDWORD); +DWORD _IMAGEHLPAPI MapFileAndCheckSumW(PWSTR,LPDWORD,LPDWORD); +BOOL _IMAGEHLPAPI TouchFileTimes(HANDLE,LPSYSTEMTIME); +BOOL _IMAGEHLPAPI SplitSymbols(LPSTR,LPSTR,LPSTR,DWORD); +HANDLE _IMAGEHLPAPI FindDebugInfoFile(LPSTR,LPSTR,LPSTR); +HANDLE _IMAGEHLPAPI FindExecutableImage(LPSTR,LPSTR,LPSTR); +BOOL _IMAGEHLPAPI UpdateDebugInfoFile(LPSTR,LPSTR,LPSTR,PIMAGE_NT_HEADERS); +BOOL _IMAGEHLPAPI UpdateDebugInfoFileEx(LPSTR,LPSTR,LPSTR,PIMAGE_NT_HEADERS,DWORD); +BOOL _IMAGEHLPAPI BindImage(IN LPSTR,IN LPSTR,IN LPSTR); +BOOL _IMAGEHLPAPI BindImageEx(IN DWORD,IN LPSTR,IN LPSTR,IN LPSTR,IN PIMAGEHLP_STATUS_ROUTINE); +BOOL _IMAGEHLPAPI ReBaseImage(IN LPSTR,IN LPSTR,IN BOOL, IN BOOL,IN BOOL, IN ULONG, OUT ULONG*, OUT ULONG*, OUT ULONG*, IN OUT ULONG*, IN ULONG); + +PLOADED_IMAGE _IMAGEHLPAPI ImageLoad(LPSTR,LPSTR); +BOOL _IMAGEHLPAPI ImageUnload(PLOADED_IMAGE); +PIMAGE_NT_HEADERS _IMAGEHLPAPI ImageNtHeader(IN PVOID); +PVOID _IMAGEHLPAPI ImageDirectoryEntryToData(IN PVOID,IN BOOLEAN,IN USHORT,OUT PULONG); +PIMAGE_SECTION_HEADER _IMAGEHLPAPI ImageRvaToSection(IN PIMAGE_NT_HEADERS,IN PVOID,IN ULONG); +PVOID _IMAGEHLPAPI ImageRvaToVa(IN PIMAGE_NT_HEADERS,IN PVOID,IN ULONG,IN OUT PIMAGE_SECTION_HEADER*); +BOOL _IMAGEHLPAPI MapAndLoad(LPSTR,LPSTR,PLOADED_IMAGE,BOOL,BOOL); +BOOL _IMAGEHLPAPI GetImageConfigInformation(PLOADED_IMAGE,PIMAGE_LOAD_CONFIG_DIRECTORY); +DWORD _IMAGEHLPAPI GetImageUnusedHeaderBytes(PLOADED_IMAGE,LPDWORD); +BOOL _IMAGEHLPAPI SetImageConfigInformation(PLOADED_IMAGE,PIMAGE_LOAD_CONFIG_DIRECTORY); +BOOL _IMAGEHLPAPI UnMapAndLoad(PLOADED_IMAGE); +PIMAGE_DEBUG_INFORMATION _IMAGEHLPAPI MapDebugInformation(HANDLE,LPSTR,LPSTR,DWORD); +BOOL _IMAGEHLPAPI UnmapDebugInformation(PIMAGE_DEBUG_INFORMATION); +HANDLE _IMAGEHLPAPI FindExecutableImage(LPSTR,LPSTR,LPSTR); +BOOL _IMAGEHLPAPI SearchTreeForFile(LPSTR,LPSTR,LPSTR); +BOOL _IMAGEHLPAPI MakeSureDirectoryPathExists(LPCSTR); +DWORD _IMAGEHLPAPI WINAPI UnDecorateSymbolName(LPCSTR,LPSTR,DWORD, DWORD); +BOOL +_IMAGEHLPAPI +StackWalk(DWORD,HANDLE,HANDLE,LPSTACKFRAME,LPVOID,PREAD_PROCESS_MEMORY_ROUTINE,PFUNCTION_TABLE_ACCESS_ROUTINE,PGET_MODULE_BASE_ROUTINE,PTRANSLATE_ADDRESS_ROUTINE); +LPAPI_VERSION _IMAGEHLPAPI ImagehlpApiVersion(VOID); +LPAPI_VERSION _IMAGEHLPAPI ImagehlpApiVersionEx(LPAPI_VERSION); +DWORD _IMAGEHLPAPI GetTimestampForLoadedLibrary(HMODULE); +BOOL _IMAGEHLPAPI RemovePrivateCvSymbolic(PCHAR,PCHAR*,ULONG*); +VOID _IMAGEHLPAPI RemoveRelocations(PCHAR); +DWORD _IMAGEHLPAPI SymSetOptions(IN DWORD); +DWORD _IMAGEHLPAPI SymGetOptions(VOID); +BOOL _IMAGEHLPAPI SymCleanup(IN HANDLE); +BOOL _IMAGEHLPAPI SymEnumerateModules(IN HANDLE,IN PSYM_ENUMMODULES_CALLBACK,IN PVOID); +BOOL _IMAGEHLPAPI SymEnumerateSymbols(IN HANDLE,IN DWORD,IN PSYM_ENUMSYMBOLS_CALLBACK,IN PVOID); +BOOL _IMAGEHLPAPI EnumerateLoadedModules(IN HANDLE,IN PENUMLOADED_MODULES_CALLBACK,IN PVOID); +LPVOID _IMAGEHLPAPI SymFunctionTableAccess(HANDLE,DWORD); +BOOL _IMAGEHLPAPI SymGetModuleInfo(IN HANDLE,IN DWORD,OUT PIMAGEHLP_MODULE); +DWORD _IMAGEHLPAPI SymGetModuleBase(IN HANDLE,IN DWORD); +BOOL _IMAGEHLPAPI SymGetSymFromAddr(IN HANDLE,IN DWORD,OUT PDWORD,OUT PIMAGEHLP_SYMBOL); +BOOL _IMAGEHLPAPI SymGetSymFromName(IN HANDLE,IN LPSTR,OUT PIMAGEHLP_SYMBOL); +BOOL _IMAGEHLPAPI SymGetSymNext(IN HANDLE,IN OUT PIMAGEHLP_SYMBOL); +BOOL _IMAGEHLPAPI SymGetSymPrev(IN HANDLE,IN OUT PIMAGEHLP_SYMBOL); +BOOL _IMAGEHLPAPI SymGetLineFromAddr(IN HANDLE,IN DWORD,OUT PDWORD,OUT PIMAGEHLP_LINE); +BOOL _IMAGEHLPAPI SymGetLineFromName(IN HANDLE,IN LPSTR,IN LPSTR,IN DWORD,OUT PLONG,IN OUT PIMAGEHLP_LINE); +BOOL _IMAGEHLPAPI SymGetLineNext(IN HANDLE,IN OUT PIMAGEHLP_LINE); +BOOL _IMAGEHLPAPI SymGetLinePrev(IN HANDLE,IN OUT PIMAGEHLP_LINE); +BOOL _IMAGEHLPAPI SymMatchFileName(IN LPSTR,IN LPSTR,OUT LPSTR*,OUT LPSTR*); +BOOL _IMAGEHLPAPI SymInitialize(IN HANDLE,IN LPSTR,IN BOOL); +BOOL _IMAGEHLPAPI SymGetSearchPath(IN HANDLE,OUT LPSTR,IN DWORD); +BOOL _IMAGEHLPAPI SymSetSearchPath(IN HANDLE,IN LPSTR); +BOOL _IMAGEHLPAPI SymLoadModule(IN HANDLE,IN HANDLE,IN PSTR,IN PSTR,IN DWORD,IN DWORD); +BOOL _IMAGEHLPAPI SymUnloadModule(IN HANDLE,IN DWORD); +BOOL _IMAGEHLPAPI SymUnDName(IN PIMAGEHLP_SYMBOL,OUT LPSTR,IN DWORD); +BOOL _IMAGEHLPAPI SymRegisterCallback(IN HANDLE,IN PSYMBOL_REGISTERED_CALLBACK,IN PVOID); +BOOL _IMAGEHLPAPI ImageGetDigestStream(IN HANDLE,IN DWORD,IN DIGEST_FUNCTION,IN DIGEST_HANDLE); +BOOL _IMAGEHLPAPI ImageAddCertificate(IN HANDLE,IN LPWIN_CERTIFICATE,OUT PDWORD); +BOOL _IMAGEHLPAPI ImageRemoveCertificate(IN HANDLE,IN DWORD); +BOOL _IMAGEHLPAPI ImageEnumerateCertificates(IN HANDLE,IN WORD,OUT PDWORD,IN OUT PDWORD OPTIONAL,IN OUT DWORD OPTIONAL); +BOOL _IMAGEHLPAPI ImageGetCertificateData(IN HANDLE,IN DWORD,OUT LPWIN_CERTIFICATE,IN OUT PDWORD); +BOOL _IMAGEHLPAPI ImageGetCertificateHeader(IN HANDLE,IN DWORD,IN OUT LPWIN_CERTIFICATE); +BOOL _IMAGEHLPAPI CopyPdb(CHAR const*,CHAR const*,BOOL); +BOOL _IMAGEHLPAPI RemovePrivateCvSymbolicEx(PCHAR,ULONG,PCHAR*,ULONG*); + +#endif /* RC_INVOKED */ + +#ifdef UNICODE +#define MapFileAndCheckSum MapFileAndCheckSumW +#else +#define MapFileAndCheckSum MapFileAndCheckSumA +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _IMAGEHLP_H */ + diff --git a/reactos/w32api/include/imm.h b/reactos/w32api/include/imm.h new file mode 100644 index 00000000000..6ae9cab43ca --- /dev/null +++ b/reactos/w32api/include/imm.h @@ -0,0 +1,430 @@ +#ifndef _IMM_H +#define _IMM_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define WM_CONVERTREQUESTEX 0x108 +#define WM_IME_STARTCOMPOSITION 0x10D +#define WM_IME_ENDCOMPOSITION 0x10E +#define WM_IME_COMPOSITION 0x10F +#define WM_IME_KEYLAST 0x10F +#define WM_IME_SETCONTEXT 0x281 +#define WM_IME_NOTIFY 0x282 +#define WM_IME_CONTROL 0x283 +#define WM_IME_COMPOSITIONFULL 0x284 +#define WM_IME_SELECT 0x285 +#define WM_IME_CHAR 0x286 +#define WM_IME_KEYDOWN 0x290 +#define WM_IME_KEYUP 0x291 +#define IMC_GETCANDIDATEPOS 7 +#define IMC_SETCANDIDATEPOS 8 +#define IMC_GETCOMPOSITIONFONT 9 +#define IMC_SETCOMPOSITIONFONT 10 +#define IMC_GETCOMPOSITIONWINDOW 11 +#define IMC_SETCOMPOSITIONWINDOW 12 +#define IMC_GETSTATUSWINDOWPOS 15 +#define IMC_SETSTATUSWINDOWPOS 16 +#define IMC_CLOSESTATUSWINDOW 0x21 +#define IMC_OPENSTATUSWINDOW 0x22 +#define IMN_CLOSESTATUSWINDOW 1 +#define IMN_OPENSTATUSWINDOW 2 +#define IMN_CHANGECANDIDATE 3 +#define IMN_CLOSECANDIDATE 4 +#define IMN_OPENCANDIDATE 5 +#define IMN_SETCONVERSIONMODE 6 +#define IMN_SETSENTENCEMODE 7 +#define IMN_SETOPENSTATUS 8 +#define IMN_SETCANDIDATEPOS 9 +#define IMN_SETCOMPOSITIONFONT 10 +#define IMN_SETCOMPOSITIONWINDOW 11 +#define IMN_SETSTATUSWINDOWPOS 12 +#define IMN_GUIDELINE 13 +#define IMN_PRIVATE 14 +#define NI_OPENCANDIDATE 16 +#define NI_CLOSECANDIDATE 17 +#define NI_SELECTCANDIDATESTR 18 +#define NI_CHANGECANDIDATELIST 19 +#define NI_FINALIZECONVERSIONRESULT 20 +#define NI_COMPOSITIONSTR 21 +#define NI_SETCANDIDATE_PAGESTART 22 +#define NI_SETCANDIDATE_PAGESIZE 23 +#define NI_IMEMENUSELECTED 24 +#define ISC_SHOWUICANDIDATEWINDOW 1 +#define ISC_SHOWUICOMPOSITIONWINDOW 0x80000000 +#define ISC_SHOWUIGUIDELINE 0x40000000 +#define ISC_SHOWUIALLCANDIDATEWINDOW 15 +#define ISC_SHOWUIALL 0xC000000F +#define CPS_COMPLETE 1 +#define CPS_CONVERT 2 +#define CPS_REVERT 3 +#define CPS_CANCEL 4 +#define IME_CHOTKEY_IME_NONIME_TOGGLE 16 +#define IME_CHOTKEY_SHAPE_TOGGLE 17 +#define IME_CHOTKEY_SYMBOL_TOGGLE 18 +#define IME_JHOTKEY_CLOSE_OPEN 0x30 +#define IME_KHOTKEY_SHAPE_TOGGLE 0x50 +#define IME_KHOTKEY_HANJACONVERT 0x51 +#define IME_KHOTKEY_ENGLISH 0x52 +#define IME_THOTKEY_IME_NONIME_TOGGLE 0x70 +#define IME_THOTKEY_SHAPE_TOGGLE 0x71 +#define IME_THOTKEY_SYMBOL_TOGGLE 0x72 +#define IME_HOTKEY_DSWITCH_FIRST 256 +#define IME_HOTKEY_DSWITCH_LAST 0x11F +#define IME_ITHOTKEY_RESEND_RESULTSTR 512 +#define IME_ITHOTKEY_PREVIOUS_COMPOSITION 513 +#define IME_ITHOTKEY_UISTYLE_TOGGLE 514 +#define GCS_COMPREADSTR 1 +#define GCS_COMPREADATTR 2 +#define GCS_COMPREADCLAUSE 4 +#define GCS_COMPSTR 8 +#define GCS_COMPATTR 16 +#define GCS_COMPCLAUSE 32 +#define GCS_CURSORPOS 128 +#define GCS_DELTASTART 256 +#define GCS_RESULTREADSTR 512 +#define GCS_RESULTREADCLAUSE 1024 +#define GCS_RESULTSTR 2048 +#define GCS_RESULTCLAUSE 4096 +#define CS_INSERTCHAR 0x2000 +#define CS_NOMOVECARET 0x4000 +#define IMEVER_0310 0x3000A +#define IMEVER_0400 0x40000 +#define IME_PROP_AT_CARET 0x10000 +#define IME_PROP_SPECIAL_UI 0x20000 +#define IME_PROP_CANDLIST_START_FROM_1 0x40000 +#define IME_PROP_UNICODE 0x80000 +#define UI_CAP_2700 1 +#define UI_CAP_ROT90 2 +#define UI_CAP_ROTANY 4 +#define SCS_CAP_COMPSTR 1 +#define SCS_CAP_MAKEREAD 2 +#define SELECT_CAP_CONVERSION 1 +#define SELECT_CAP_SENTENCE 2 +#define GGL_LEVEL 1 +#define GGL_INDEX 2 +#define GGL_STRING 3 +#define GGL_PRIVATE 4 +#define GL_LEVEL_NOGUIDELINE 0 +#define GL_LEVEL_FATAL 1 +#define GL_LEVEL_ERROR 2 +#define GL_LEVEL_WARNING 3 +#define GL_LEVEL_INFORMATION 4 +#define GL_ID_UNKNOWN 0 +#define GL_ID_NOMODULE 1 +#define GL_ID_NODICTIONARY 16 +#define GL_ID_CANNOTSAVE 17 +#define GL_ID_NOCONVERT 32 +#define GL_ID_TYPINGERROR 33 +#define GL_ID_TOOMANYSTROKE 34 +#define GL_ID_READINGCONFLICT 35 +#define GL_ID_INPUTREADING 36 +#define GL_ID_INPUTRADICAL 37 +#define GL_ID_INPUTCODE 38 +#define GL_ID_INPUTSYMBOL 39 +#define GL_ID_CHOOSECANDIDATE 40 +#define GL_ID_REVERSECONVERSION 41 +#define GL_ID_PRIVATE_FIRST 0x8000 +#define GL_ID_PRIVATE_LAST 0xFFFF +#define IGP_GETIMEVERSION (DWORD)(-4) +#define IGP_PROPERTY 4 +#define IGP_CONVERSION 8 +#define IGP_SENTENCE 12 +#define IGP_UI 16 +#define IGP_SETCOMPSTR 0x14 +#define IGP_SELECT 0x18 +#define SCS_SETSTR (GCS_COMPREADSTR|GCS_COMPSTR) +#define SCS_CHANGEATTR (GCS_COMPREADATTR|GCS_COMPATTR) +#define SCS_CHANGECLAUSE (GCS_COMPREADCLAUSE|GCS_COMPCLAUSE) +#define ATTR_INPUT 0 +#define ATTR_TARGET_CONVERTED 1 +#define ATTR_CONVERTED 2 +#define ATTR_TARGET_NOTCONVERTED 3 +#define ATTR_INPUT_ERROR 4 +#define ATTR_FIXEDCONVERTED 5 +#define CFS_DEFAULT 0 +#define CFS_RECT 1 +#define CFS_POINT 2 +#define CFS_SCREEN 4 +#define CFS_FORCE_POSITION 32 +#define CFS_CANDIDATEPOS 64 +#define CFS_EXCLUDE 128 +#define GCL_CONVERSION 1 +#define GCL_REVERSECONVERSION 2 +#define GCL_REVERSE_LENGTH 3 +#define IME_CMODE_ALPHANUMERIC 0 +#define IME_CMODE_NATIVE 1 +#define IME_CMODE_CHINESE IME_CMODE_NATIVE +#define IME_CMODE_HANGEUL IME_CMODE_NATIVE +#define IME_CMODE_HANGUL IME_CMODE_NATIVE +#define IME_CMODE_JAPANESE IME_CMODE_NATIVE +#define IME_CMODE_KATAKANA 2 +#define IME_CMODE_LANGUAGE 3 +#define IME_CMODE_FULLSHAPE 8 +#define IME_CMODE_ROMAN 16 +#define IME_CMODE_CHARCODE 32 +#define IME_CMODE_HANJACONVERT 64 +#define IME_CMODE_SOFTKBD 128 +#define IME_CMODE_NOCONVERSION 256 +#define IME_CMODE_EUDC 512 +#define IME_CMODE_SYMBOL 1024 +#define IME_CMODE_FIXED 2048 +#define IME_SMODE_NONE 0 +#define IME_SMODE_PLAURALCLAUSE 1 +#define IME_SMODE_SINGLECONVERT 2 +#define IME_SMODE_AUTOMATIC 4 +#define IME_SMODE_PHRASEPREDICT 8 +#define IME_CAND_UNKNOWN 0 +#define IME_CAND_READ 1 +#define IME_CAND_CODE 2 +#define IME_CAND_MEANING 3 +#define IME_CAND_RADICAL 4 +#define IME_CAND_STROKE 5 +#define IMM_ERROR_NODATA (-1) +#define IMM_ERROR_GENERAL (-2) +#define IME_CONFIG_GENERAL 1 +#define IME_CONFIG_REGISTERWORD 2 +#define IME_CONFIG_SELECTDICTIONARY 3 +#define IME_ESC_QUERY_SUPPORT 3 +#define IME_ESC_RESERVED_FIRST 4 +#define IME_ESC_RESERVED_LAST 0x7FF +#define IME_ESC_PRIVATE_FIRST 0x800 +#define IME_ESC_PRIVATE_LAST 0xFFF +#define IME_ESC_SEQUENCE_TO_INTERNAL 0x1001 +#define IME_ESC_GET_EUDC_DICTIONARY 0x1003 +#define IME_ESC_SET_EUDC_DICTIONARY 0x1004 +#define IME_ESC_MAX_KEY 0x1005 +#define IME_ESC_IME_NAME 0x1006 +#define IME_ESC_SYNC_HOTKEY 0x1007 +#define IME_ESC_HANJA_MODE 0x1008 +#define IME_ESC_AUTOMATA 0x1009 +#define IME_REGWORD_STYLE_EUDC 1 +#define IME_REGWORD_STYLE_USER_FIRST 0x80000000 +#define IME_REGWORD_STYLE_USER_LAST 0xFFFFFFFF +#define SOFTKEYBOARD_TYPE_T1 1 +#define SOFTKEYBOARD_TYPE_C1 2 +#define IMEMENUITEM_STRING_SIZE 80 +#define MOD_ALT 1 +#define MOD_CONTROL 2 +#define MOD_SHIFT 4 +#define MOD_WIN 8 +#define MOD_IGNORE_ALL_MODIFIER 1024 +#define MOD_ON_KEYUP 2048 +#define MOD_RIGHT 16384 +#define MOD_LEFT 32768 +#define IACE_CHILDREN 1 +#define IACE_DEFAULT 16 +#define IACE_IGNORENOCONTEXT 32 +#define IGIMIF_RIGHTMENU 1 +#define IGIMII_CMODE 1 +#define IGIMII_SMODE 2 +#define IGIMII_CONFIGURE 4 +#define IGIMII_TOOLS 8 +#define IGIMII_HELP 16 +#define IGIMII_OTHER 32 +#define IGIMII_INPUTTOOLS 64 +#define IMFT_RADIOCHECK 1 +#define IMFT_SEPARATOR 2 +#define IMFT_SUBMENU 4 +#define IMFS_GRAYED MFS_GRAYED +#define IMFS_DISABLED MFS_DISABLED +#define IMFS_CHECKED MFS_CHECKED +#define IMFS_HILITE MFS_HILITE +#define IMFS_ENABLED MFS_ENABLED +#define IMFS_UNCHECKED MFS_UNCHECKED +#define IMFS_UNHILITE MFS_UNHILITE +#define IMFS_DEFAULT MFS_DEFAULT +#ifndef VK_PROCESSKEY +#define VK_PROCESSKEY 0x0E5 +#endif +#define STYLE_DESCRIPTION_SIZE 32 +typedef DWORD HIMC; +typedef DWORD HIMCC; +typedef HKL *LPHKL; +typedef struct tagCOMPOSITIONFORM { + DWORD dwStyle; + POINT ptCurrentPos; + RECT rcArea; +} COMPOSITIONFORM,*PCOMPOSITIONFORM,*LPCOMPOSITIONFORM; +typedef struct tagCANDIDATEFORM { + DWORD dwIndex; + DWORD dwStyle; + POINT ptCurrentPos; + RECT rcArea; +} CANDIDATEFORM,*PCANDIDATEFORM,*LPCANDIDATEFORM; +typedef struct tagCANDIDATELIST { + DWORD dwSize; + DWORD dwStyle; + DWORD dwCount; + DWORD dwSelection; + DWORD dwPageStart; + DWORD dwPageSize; + DWORD dwOffset[1]; +} CANDIDATELIST,*PCANDIDATELIST,*LPCANDIDATELIST; +typedef struct tagREGISTERWORDA { + LPSTR lpReading; + LPSTR lpWord; +} REGISTERWORDA,*PREGISTERWORDA,*LPREGISTERWORDA; +typedef struct tagREGISTERWORDW { + LPWSTR lpReading; + LPWSTR lpWord; +} REGISTERWORDW,*PREGISTERWORDW,*LPREGISTERWORDW; +typedef struct tagSTYLEBUFA { + DWORD dwStyle; + CHAR szDescription[STYLE_DESCRIPTION_SIZE]; +} STYLEBUFA,*PSTYLEBUFA,*LPSTYLEBUFA; +typedef struct tagSTYLEBUFW { + DWORD dwStyle; + WCHAR szDescription[STYLE_DESCRIPTION_SIZE]; +} STYLEBUFW,*PSTYLEBUFW,*LPSTYLEBUFW; +typedef struct tagIMEMENUITEMINFOA { + UINT cbSize; + UINT fType; + UINT fState; + UINT wID; + HBITMAP hbmpChecked; + HBITMAP hbmpUnchecked; + DWORD dwItemData; + CHAR szString[IMEMENUITEM_STRING_SIZE]; + HBITMAP hbmpItem; +} IMEMENUITEMINFOA,*PIMEMENUITEMINFOA,*LPIMEMENUITEMINFOA; +typedef struct tagIMEMENUITEMINFOW { + UINT cbSize; + UINT fType; + UINT fState; + UINT wID; + HBITMAP hbmpChecked; + HBITMAP hbmpUnchecked; + DWORD dwItemData; + WCHAR szString[IMEMENUITEM_STRING_SIZE]; + HBITMAP hbmpItem; +} IMEMENUITEMINFOW,*PIMEMENUITEMINFOW,*LPIMEMENUITEMINFOW; +typedef int (CALLBACK *REGISTERWORDENUMPROCA)(LPCSTR, DWORD, LPCSTR, LPVOID); +typedef int (CALLBACK *REGISTERWORDENUMPROCW)(LPCWSTR, DWORD, LPCWSTR, LPVOID); +#ifdef UNICODE +#define REGISTERWORDENUMPROC REGISTERWORDENUMPROCW +typedef REGISTERWORDW REGISTERWORD,*PREGISTERWORD,*LPREGISTERWORD; +typedef STYLEBUFW STYLEBUF,*PSTYLEBUF,*LPSTYLEBUF; +typedef IMEMENUITEMINFOW IMEMENUITEMINFO,*PIMEMENUITEMINFO,*LPIMEMENUITEMINFO; +#else +#define REGISTERWORDENUMPROC REGISTERWORDENUMPROCA +typedef REGISTERWORDA REGISTERWORD,*PREGISTERWORD,*LPREGISTERWORD; +typedef STYLEBUFA STYLEBUF,*PSTYLEBUF,*LPSTYLEBUF; +typedef IMEMENUITEMINFOA IMEMENUITEMINFO,*PIMEMENUITEMINFO,*LPIMEMENUITEMINFO; +#endif +HKL WINAPI ImmInstallIMEA(LPCSTR,LPCSTR); +HKL WINAPI ImmInstallIMEW(LPCWSTR,LPCWSTR); +HWND WINAPI ImmGetDefaultIMEWnd(HWND); +UINT WINAPI ImmGetDescriptionA(HKL,LPSTR,UINT); +UINT WINAPI ImmGetDescriptionW(HKL,LPWSTR,UINT); +UINT WINAPI ImmGetIMEFileNameA(HKL,LPSTR,UINT); +UINT WINAPI ImmGetIMEFileNameW(HKL,LPWSTR,UINT); +DWORD WINAPI ImmGetProperty(HKL,DWORD); +BOOL WINAPI ImmIsIME(HKL); +BOOL WINAPI ImmSimulateHotKey(HWND,DWORD); +HIMC WINAPI ImmCreateContext(void); +BOOL WINAPI ImmDestroyContext(HIMC); +HIMC WINAPI ImmGetContext(HWND); +BOOL WINAPI ImmReleaseContext(HWND,HIMC); +HIMC WINAPI ImmAssociateContext(HWND,HIMC); +LONG WINAPI ImmGetCompositionStringA(HIMC,DWORD,PVOID,DWORD); +LONG WINAPI ImmGetCompositionStringW(HIMC,DWORD,PVOID,DWORD); +BOOL WINAPI ImmSetCompositionStringA(HIMC,DWORD,PCVOID,DWORD,PCVOID,DWORD); +BOOL WINAPI ImmSetCompositionStringW(HIMC,DWORD,PCVOID,DWORD,PCVOID,DWORD); +DWORD WINAPI ImmGetCandidateListCountA(HIMC,PDWORD); +DWORD WINAPI ImmGetCandidateListCountW(HIMC,PDWORD); +DWORD WINAPI ImmGetCandidateListA(HIMC,DWORD,PCANDIDATELIST,DWORD); +DWORD WINAPI ImmGetCandidateListW(HIMC,DWORD,PCANDIDATELIST,DWORD); +DWORD WINAPI ImmGetGuideLineA(HIMC,DWORD,LPSTR,DWORD); +DWORD WINAPI ImmGetGuideLineW(HIMC,DWORD,LPWSTR,DWORD); +BOOL WINAPI ImmGetConversionStatus(HIMC,LPDWORD,PDWORD); +BOOL WINAPI ImmSetConversionStatus(HIMC,DWORD,DWORD); +BOOL WINAPI ImmGetOpenStatus(HIMC); +BOOL WINAPI ImmSetOpenStatus(HIMC,BOOL); +#ifndef NOGDI +BOOL WINAPI ImmGetCompositionFontA(HIMC,LPLOGFONTA); +BOOL WINAPI ImmGetCompositionFontW(HIMC,LPLOGFONTW); +BOOL WINAPI ImmSetCompositionFontA(HIMC,LPLOGFONTA); +BOOL WINAPI ImmSetCompositionFontW(HIMC,LPLOGFONTW); +#endif +BOOL WINAPI ImmConfigureIMEA(HKL,HWND,DWORD,PVOID); +BOOL WINAPI ImmConfigureIMEW(HKL,HWND,DWORD,PVOID); +LRESULT WINAPI ImmEscapeA(HKL,HIMC,UINT,PVOID); +LRESULT WINAPI ImmEscapeW(HKL,HIMC,UINT,PVOID); +DWORD WINAPI ImmGetConversionListA(HKL,HIMC,LPCSTR,PCANDIDATELIST,DWORD,UINT); +DWORD WINAPI ImmGetConversionListW(HKL,HIMC,LPCWSTR,PCANDIDATELIST,DWORD,UINT); +BOOL WINAPI ImmNotifyIME(HIMC,DWORD,DWORD,DWORD); +BOOL WINAPI ImmGetStatusWindowPos(HIMC,LPPOINT); +BOOL WINAPI ImmSetStatusWindowPos(HIMC,LPPOINT); +BOOL WINAPI ImmGetCompositionWindow(HIMC,PCOMPOSITIONFORM); +BOOL WINAPI ImmSetCompositionWindow(HIMC,PCOMPOSITIONFORM); +BOOL WINAPI ImmGetCandidateWindow(HIMC,DWORD,PCANDIDATEFORM); +BOOL WINAPI ImmSetCandidateWindow(HIMC,PCANDIDATEFORM); +BOOL WINAPI ImmIsUIMessageA(HWND,UINT,WPARAM,LPARAM); +BOOL WINAPI ImmIsUIMessageW(HWND,UINT,WPARAM,LPARAM); +UINT WINAPI ImmGetVirtualKey(HWND); +BOOL WINAPI ImmRegisterWordA(HKL,LPCSTR,DWORD,LPCSTR); +BOOL WINAPI ImmRegisterWordW(HKL,LPCWSTR,DWORD,LPCWSTR); +BOOL WINAPI ImmUnregisterWordA(HKL,LPCSTR,DWORD,LPCSTR); +BOOL WINAPI ImmUnregisterWordW(HKL,LPCWSTR,DWORD,LPCWSTR); +UINT WINAPI ImmGetRegisterWordStyleA(HKL,UINT,PSTYLEBUFA); +UINT WINAPI ImmGetRegisterWordStyleW(HKL,UINT,PSTYLEBUFW); +UINT WINAPI ImmEnumRegisterWordA(HKL,REGISTERWORDENUMPROCA,LPCSTR,DWORD,LPCSTR,PVOID); +UINT WINAPI ImmEnumRegisterWordW(HKL,REGISTERWORDENUMPROCW,LPCWSTR,DWORD,LPCWSTR,PVOID); +BOOL WINAPI EnableEUDC(BOOL); +BOOL WINAPI ImmDisableIME(DWORD); +DWORD WINAPI ImmGetImeMenuItemsA(HIMC,DWORD,DWORD,LPIMEMENUITEMINFOA,LPIMEMENUITEMINFOA,DWORD); +DWORD WINAPI ImmGetImeMenuItemsW(HIMC,DWORD,DWORD,LPIMEMENUITEMINFOW,LPIMEMENUITEMINFOW,DWORD); + +#ifdef UNICODE +#define ImmEnumRegisterWord ImmEnumRegisterWordW +#define ImmGetRegisterWordStyle ImmGetRegisterWordStyleW +#define ImmUnregisterWord ImmUnregisterWordW +#define ImmRegisterWord ImmRegisterWordW +#define ImmInstallIME ImmInstallIMEW +#define ImmIsUIMessage ImmIsUIMessageW +#define ImmGetConversionList ImmGetConversionListW +#define ImmEscape ImmEscapeW +#define ImmConfigureIME ImmConfigureIMEW +#ifndef NOGDI +#define ImmSetCompositionFont ImmSetCompositionFontW +#define ImmGetCompositionFont ImmGetCompositionFontW +#endif +#define ImmGetGuideLine ImmGetGuideLineW +#define ImmGetCandidateList ImmGetCandidateListW +#define ImmGetCandidateListCount ImmGetCandidateListCountW +#define ImmSetCompositionString ImmSetCompositionStringW +#define ImmGetCompositionString ImmGetCompositionStringW +#define ImmGetDescription ImmGetDescriptionW +#define ImmGetIMEFileName ImmGetIMEFileNameW +#define ImmGetImeMenuItems ImmGetImeMenuItemsW +#else +#define ImmEnumRegisterWord ImmEnumRegisterWordA +#define ImmGetRegisterWordStyle ImmGetRegisterWordStyleA +#define ImmUnregisterWord ImmUnregisterWordA +#define ImmRegisterWord ImmRegisterWordA +#define ImmInstallIME ImmInstallIMEA +#define ImmIsUIMessage ImmIsUIMessageA +#define ImmGetConversionList ImmGetConversionListA +#define ImmEscape ImmEscapeA +#define ImmConfigureIME ImmConfigureIMEA +#ifndef NOGDI +#define ImmSetCompositionFont ImmSetCompositionFontA +#define ImmGetCompositionFont ImmGetCompositionFontA +#endif +#define ImmGetGuideLine ImmGetGuideLineA +#define ImmGetCandidateList ImmGetCandidateListA +#define ImmGetCandidateListCount ImmGetCandidateListCountA +#define ImmSetCompositionString ImmSetCompositionStringA +#define ImmGetCompositionString ImmGetCompositionStringA +#define ImmGetDescription ImmGetDescriptionA +#define ImmGetIMEFileName ImmGetIMEFileNameA +#define ImmGetImeMenuItems ImmGetImeMenuItemsW +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/initguid.h b/reactos/w32api/include/initguid.h new file mode 100644 index 00000000000..b024c7075f8 --- /dev/null +++ b/reactos/w32api/include/initguid.h @@ -0,0 +1,12 @@ +#ifndef _INITGUID_H +#define _INITGUID_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifndef DEFINE_GUID +#include <basetyps.h> +#endif +#undef DEFINE_GUID +#define DEFINE_GUID(n,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) GUID_EXT const GUID n GUID_SECT = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}} +#endif diff --git a/reactos/w32api/include/intshcut.h b/reactos/w32api/include/intshcut.h new file mode 100644 index 00000000000..e4c87cd1073 --- /dev/null +++ b/reactos/w32api/include/intshcut.h @@ -0,0 +1,82 @@ +#ifndef _INTSHCUT_H +#define _INTSHCUT_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#include <isguids.h> +#ifdef __cplusplus +extern "C" { +#endif +#define INTSHCUTAPI DECLSPEC_IMPORT +#define E_FLAGS MAKE_SCODE(SEVERITY_ERROR,FACILITY_ITF,0x1000) +#define IS_E_EXEC_FAILED MAKE_SCODE(SEVERITY_ERROR,FACILITY_ITF,0x2002) +#define URL_E_INVALID_SYNTAX MAKE_SCODE(SEVERITY_ERROR,FACILITY_ITF,0x1001) +#define URL_E_UNREGISTERED_PROTOCOL MAKE_SCODE(SEVERITY_ERROR,FACILITY_ITF,0x1002) +typedef enum iurl_seturl_flags { + IURL_SETURL_FL_GUESS_PROTOCOL=1, + IURL_SETURL_FL_USE_DEFAULT_PROTOCOL, + ALL_IURL_SETURL_FLAGS=(IURL_SETURL_FL_GUESS_PROTOCOL|IURL_SETURL_FL_USE_DEFAULT_PROTOCOL) +} IURL_SETURL_FLAGS; +typedef enum iurl_invokecommand_flags { + IURL_INVOKECOMMAND_FL_ALLOW_UI=1, + IURL_INVOKECOMMAND_FL_USE_DEFAULT_VERB, + ALL_IURL_INVOKECOMMAND_FLAGS=(IURL_INVOKECOMMAND_FL_ALLOW_UI|IURL_INVOKECOMMAND_FL_USE_DEFAULT_VERB) +} IURL_INVOKECOMMAND_FLAGS; +typedef enum translateurl_in_flags { + TRANSLATEURL_FL_GUESS_PROTOCOL=1, + TRANSLATEURL_FL_USE_DEFAULT_PROTOCOL, + ALL_TRANSLATEURL_FLAGS=(TRANSLATEURL_FL_GUESS_PROTOCOL|TRANSLATEURL_FL_USE_DEFAULT_PROTOCOL) +} TRANSLATEURL_IN_FLAGS; +typedef enum urlassociationdialog_in_flags { + URLASSOCDLG_FL_USE_DEFAULT_NAME=1, + URLASSOCDLG_FL_REGISTER_ASSOC, + ALL_URLASSOCDLG_FLAGS=(URLASSOCDLG_FL_USE_DEFAULT_NAME|URLASSOCDLG_FL_REGISTER_ASSOC) +} URLASSOCIATIONDIALOG_IN_FLAGS; +typedef enum mimeassociationdialog_in_flags { + MIMEASSOCDLG_FL_REGISTER_ASSOC=1, + ALL_MIMEASSOCDLG_FLAGS=MIMEASSOCDLG_FL_REGISTER_ASSOC +} MIMEASSOCIATIONDIALOG_IN_FLAGS; +typedef struct urlinvokecommandinfo { + DWORD dwcbSize; + DWORD dwFlags; + HWND hwndParent; + PCSTR pcszVerb; +} URLINVOKECOMMANDINFO,*PURLINVOKECOMMANDINFO; +typedef const URLINVOKECOMMANDINFO CURLINVOKECOMMANDINFO; +typedef const URLINVOKECOMMANDINFO *PCURLINVOKECOMMANDINFO; +#undef INTERFACE +#define INTERFACE IUniformResourceLocator +DECLARE_INTERFACE_(IUniformResourceLocator,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(SetURL)(THIS_ PCSTR,DWORD) PURE; + STDMETHOD(GetURL)(THIS_ PSTR*) PURE; + STDMETHOD(InvokeCommand)(THIS_ PURLINVOKECOMMANDINFO) PURE; +}; +typedef IUniformResourceLocator *PIUniformResourceLocator; +typedef const IUniformResourceLocator CIUniformResourceLocator; +typedef const IUniformResourceLocator *PCIUniformResourceLocator; + +BOOL WINAPI InetIsOffline(DWORD); +HRESULT WINAPI MIMEAssociationDialogA(HWND,DWORD,PCSTR,PCSTR,PSTR,UINT); +HRESULT WINAPI MIMEAssociationDialogW(HWND,DWORD,PCWSTR,PCWSTR,PWSTR,UINT); +HRESULT WINAPI TranslateURLA(PCSTR,DWORD,PSTR*); +HRESULT WINAPI TranslateURLW(PCWSTR,DWORD,PWSTR*); +HRESULT WINAPI URLAssociationDialogA(HWND,DWORD,PCSTR,PCSTR,PSTR,UINT); +HRESULT WINAPI URLAssociationDialogW(HWND,DWORD,PCWSTR,PCWSTR,PWSTR,UINT); +#ifdef UNICODE +#define TranslateURL TranslateURLW +#define MIMEAssociationDialog MIMEAssociationDialogW +#define URLAssociationDialog URLAssociationDialogW +#else +#define TranslateURL TranslateURLA +#define MIMEAssociationDialog MIMEAssociationDialogA +#define URLAssociationDialog URLAssociationDialogA +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/ipexport.h b/reactos/w32api/include/ipexport.h new file mode 100644 index 00000000000..3fbf4eec97a --- /dev/null +++ b/reactos/w32api/include/ipexport.h @@ -0,0 +1,88 @@ +#ifndef _IPEXPORT_H +#define _IPEXPORT_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#ifndef ANY_SIZE +#define ANY_SIZE 1 +#endif +#define MAX_ADAPTER_NAME 128 +/* IP STATUS flags */ +#define IP_STATUS_BASE 11000 +#define IP_SUCCESS 0 +#define IP_BUF_TOO_SMALL (IP_STATUS_BASE + 1) +#define IP_DEST_NET_UNREACHABLE (IP_STATUS_BASE + 2) +#define IP_DEST_HOST_UNREACHABLE (IP_STATUS_BASE + 3) +#define IP_DEST_PROT_UNREACHABLE (IP_STATUS_BASE + 4) +#define IP_DEST_PORT_UNREACHABLE (IP_STATUS_BASE + 5) +#define IP_NO_RESOURCES (IP_STATUS_BASE + 6) +#define IP_BAD_OPTION (IP_STATUS_BASE + 7) +#define IP_HW_ERROR (IP_STATUS_BASE + 8) +#define IP_PACKET_TOO_BIG (IP_STATUS_BASE + 9) +#define IP_REQ_TIMED_OUT (IP_STATUS_BASE + 10) +#define IP_BAD_REQ (IP_STATUS_BASE + 11) +#define IP_BAD_ROUTE (IP_STATUS_BASE + 12) +#define IP_TTL_EXPIRED_TRANSIT (IP_STATUS_BASE + 13) +#define IP_TTL_EXPIRED_REASSEM (IP_STATUS_BASE + 14) +#define IP_PARAM_PROBLEM (IP_STATUS_BASE + 15) +#define IP_SOURCE_QUENCH (IP_STATUS_BASE + 16) +#define IP_OPTION_TOO_BIG (IP_STATUS_BASE + 17) +#define IP_BAD_DESTINATION (IP_STATUS_BASE + 18) +#define IP_ADDR_DELETED (IP_STATUS_BASE + 19) +#define IP_SPEC_MTU_CHANGE (IP_STATUS_BASE + 20) +#define IP_MTU_CHANGE (IP_STATUS_BASE + 21) +#define IP_UNLOAD (IP_STATUS_BASE + 22) +#define IP_GENERAL_FAILURE (IP_STATUS_BASE + 50) +#define MAX_IP_STATUS IP_GENERAL_FAILURE +#define IP_PENDING (IP_STATUS_BASE + 255) +/* IP header Flags values */ +#define IP_FLAG_DF 0x2 +/* IP Option types */ +#define IP_OPT_EOL 0 +#define IP_OPT_NOP 1 +#define IP_OPT_SECURITY 0x82 +#define IP_OPT_LSRR 0x83 +#define IP_OPT_SSRR 0x89 +#define IP_OPT_RR 0x7 +#define IP_OPT_TS 0x44 +#define IP_OPT_SID 0x88 +#define IP_OPT_ROUTER_ALERT 0x94 +#define MAX_OPT_SIZE 40 + +typedef unsigned long IPAddr, IPMask, IP_STATUS; +typedef struct ip_option_information { + unsigned char Ttl; + unsigned char Tos; + unsigned char Flags; + unsigned char OptionsSize; + unsigned char* OptionsData; +}IP_OPTION_INFORMATION, *PIP_OPTION_INFORMATION; +typedef struct icmp_echo_reply { + IPAddr Address; + unsigned long Status; + unsigned long RoundTripTime; + unsigned short DataSize; + unsigned short Reserved; + void* Data; + struct ip_option_information Options; +} ICMP_ECHO_REPLY, *PICMP_ECHO_REPLY; +typedef struct { + ULONG Index; + WCHAR Name[MAX_ADAPTER_NAME]; +} IP_ADAPTER_INDEX_MAP, *PIP_ADAPTER_INDEX_MAP; +typedef struct { + LONG NumAdapters; + IP_ADAPTER_INDEX_MAP Adapter[ANY_SIZE]; +} IP_INTERFACE_INFO, *PIP_INTERFACE_INFO; +typedef struct _IP_UNIDIRECTIONAL_ADAPTER_ADDRESS { + ULONG NumAdapters; + IPAddr Address[1]; +} IP_UNIDIRECTIONAL_ADAPTER_ADDRESS, *PIP_UNIDIRECTIONAL_ADAPTER_ADDRESS; +#ifdef __cplusplus +} +#endif +#endif /* _IPEXPORT_H */ diff --git a/reactos/w32api/include/iphlpapi.h b/reactos/w32api/include/iphlpapi.h new file mode 100644 index 00000000000..214c53ef718 --- /dev/null +++ b/reactos/w32api/include/iphlpapi.h @@ -0,0 +1,60 @@ +#ifndef _IPHLPAPI_H +#define _IPHLPAPI_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#include <iprtrmib.h> +#include <ipexport.h> +#include <iptypes.h> +#ifdef __cplusplus +extern "C" { +#endif +DWORD WINAPI AddIPAddress(IPAddr,IPMask,DWORD,PULONG,PULONG); +DWORD WINAPI CreateIpForwardEntry(PMIB_IPFORWARDROW); +DWORD WINAPI CreateIpNetEntry(PMIB_IPNETROW); +DWORD WINAPI CreateProxyArpEntry(DWORD,DWORD,DWORD); +DWORD WINAPI DeleteIPAddress(ULONG); +DWORD WINAPI DeleteIpForwardEntry(PMIB_IPFORWARDROW); +DWORD WINAPI DeleteIpNetEntry(PMIB_IPNETROW); +DWORD WINAPI DeleteProxyArpEntry(DWORD,DWORD,DWORD); +DWORD WINAPI EnableRouter(HANDLE*,OVERLAPPED*); +DWORD WINAPI FlushIpNetTable(DWORD); +DWORD WINAPI GetAdapterIndex(LPWSTR,PULONG); +DWORD WINAPI GetAdaptersInfo(PIP_ADAPTER_INFO,PULONG); +DWORD WINAPI GetBestInterface(IPAddr,PDWORD); +DWORD WINAPI GetBestRoute(DWORD,DWORD,PMIB_IPFORWARDROW); +DWORD WINAPI GetFriendlyIfIndex(DWORD); +DWORD WINAPI GetIcmpStatistics(PMIB_ICMP); +DWORD WINAPI GetIfEntry(PMIB_IFROW); +DWORD WINAPI GetIfTable(PMIB_IFTABLE,PULONG,BOOL); +DWORD WINAPI GetInterfaceInfo(PIP_INTERFACE_INFO,PULONG); +DWORD WINAPI GetIpAddrTable(PMIB_IPADDRTABLE,PULONG,BOOL); +DWORD WINAPI GetIpForwardTable(PMIB_IPFORWARDTABLE,PULONG,BOOL); +DWORD WINAPI GetIpNetTable(PMIB_IPNETTABLE,PULONG,BOOL); +DWORD WINAPI GetIpStatistics(PMIB_IPSTATS); +DWORD WINAPI GetNetworkParams(PFIXED_INFO,PULONG); +DWORD WINAPI GetNumberOfInterfaces(PDWORD); +DWORD WINAPI GetPerAdapterInfo(ULONG,PIP_PER_ADAPTER_INFO, PULONG); +BOOL WINAPI GetRTTAndHopCount(IPAddr,PULONG,ULONG,PULONG); +DWORD WINAPI GetTcpStatistics(PMIB_TCPSTATS); +DWORD WINAPI GetTcpTable(PMIB_TCPTABLE,PDWORD,BOOL); +DWORD WINAPI GetUniDirectionalAdapterInfo(PIP_UNIDIRECTIONAL_ADAPTER_ADDRESS,PULONG); +DWORD WINAPI GetUdpStatistics(PMIB_UDPSTATS); +DWORD WINAPI GetUdpTable(PMIB_UDPTABLE,PDWORD,BOOL); +DWORD WINAPI IpReleaseAddress(PIP_ADAPTER_INDEX_MAP); +DWORD WINAPI IpRenewAddress(PIP_ADAPTER_INDEX_MAP); +DWORD WINAPI NotifyAddrChange(PHANDLE,LPOVERLAPPED); +DWORD WINAPI NotifyRouteChange(PHANDLE,LPOVERLAPPED); +DWORD WINAPI SendARP(IPAddr,IPAddr,PULONG,PULONG); +DWORD WINAPI SetIfEntry(PMIB_IFROW); +DWORD WINAPI SetIpForwardEntry(PMIB_IPFORWARDROW); +DWORD WINAPI SetIpNetEntry(PMIB_IPNETROW); +DWORD WINAPI SetIpStatistics(PMIB_IPSTATS); +DWORD WINAPI SetIpTTL(UINT); +DWORD WINAPI SetTcpEntry(PMIB_TCPROW); +DWORD WINAPI UnenableRouter(OVERLAPPED*, LPDWORD); +#ifdef __cplusplus +} +#endif +#endif /* _IPHLPAPI_H */ diff --git a/reactos/w32api/include/ipifcons.h b/reactos/w32api/include/ipifcons.h new file mode 100644 index 00000000000..eecf532641e --- /dev/null +++ b/reactos/w32api/include/ipifcons.h @@ -0,0 +1,23 @@ +#ifndef _IPIFCONS_H +#define _IPIFCONS_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#define MIB_IF_ADMIN_STATUS_UP 1 +#define MIB_IF_ADMIN_STATUS_DOWN 2 +#define MIB_IF_ADMIN_STATUS_TESTING 3 +#define MIB_IF_OPER_STATUS_NON_OPERATIONAL 0 +#define MIB_IF_OPER_STATUS_UNREACHABLE 1 +#define MIB_IF_OPER_STATUS_DISCONNECTED 2 +#define MIB_IF_OPER_STATUS_CONNECTING 3 +#define MIB_IF_OPER_STATUS_CONNECTED 4 +#define MIB_IF_OPER_STATUS_OPERATIONAL 5 +#define MIB_IF_TYPE_OTHER 1 +#define MIB_IF_TYPE_ETHERNET 6 +#define MIB_IF_TYPE_TOKENRING 9 +#define MIB_IF_TYPE_FDDI 15 +#define MIB_IF_TYPE_PPP 23 +#define MIB_IF_TYPE_LOOPBACK 24 +#define MIB_IF_TYPE_SLIP 28 +#endif /* _IPIFCONS_H */ diff --git a/reactos/w32api/include/iprtrmib.h b/reactos/w32api/include/iprtrmib.h new file mode 100644 index 00000000000..f897ecbfaa8 --- /dev/null +++ b/reactos/w32api/include/iprtrmib.h @@ -0,0 +1,209 @@ +#ifndef _IPRTRMIB_H +#define _IPRTRMIB_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#include <ipifcons.h> +#ifdef __cplusplus +extern "C" { +#endif +#ifndef ANY_SIZE +#define ANY_SIZE 1 +#endif +#define MAXLEN_PHYSADDR 8 +#define MAXLEN_IFDESCR 256 +#ifndef MAX_INTERFACE_NAME_LEN +#define MAX_INTERFACE_NAME_LEN 256 +#endif +#define MIB_IPNET_TYPE_OTHER 1 +#define MIB_IPNET_TYPE_INVALID 2 +#define MIB_IPNET_TYPE_DYNAMIC 3 +#define MIB_IPNET_TYPE_STATIC 4 +#define MIB_TCP_RTO_OTHER 1 +#define MIB_TCP_RTO_CONSTANT 2 +#define MIB_TCP_RTO_RSRE 3 +#define MIB_TCP_RTO_VANJ 4 +#define MIB_TCP_STATE_CLOSED 1 +#define MIB_TCP_STATE_LISTEN 2 +#define MIB_TCP_STATE_SYN_SENT 3 +#define MIB_TCP_STATE_SYN_RCVD 4 +#define MIB_TCP_STATE_ESTAB 5 +#define MIB_TCP_STATE_FIN_WAIT1 6 +#define MIB_TCP_STATE_FIN_WAIT2 7 +#define MIB_TCP_STATE_CLOSE_WAIT 8 +#define MIB_TCP_STATE_CLOSING 9 +#define MIB_TCP_STATE_LAST_ACK 10 +#define MIB_TCP_STATE_TIME_WAIT 11 +#define MIB_TCP_STATE_DELETE_TCB 12 +#define MIB_USE_CURRENT_TTL ((DWORD)-1) +#define MIB_USE_CURRENT_FORWARDING ((DWORD)-1) +#define MIB_TCP_MAXCONN_DYNAMIC ((DWORD)-1) +typedef struct { + DWORD dwAddr; + DWORD dwIndex; + DWORD dwMask; + DWORD dwBCastAddr; + DWORD dwReasmSize; + unsigned short unused1; + unsigned short unused2; +} MIB_IPADDRROW, *PMIB_IPADDRROW; +typedef struct { + DWORD dwNumEntries; + MIB_IPADDRROW table[ANY_SIZE]; +} MIB_IPADDRTABLE, *PMIB_IPADDRTABLE; +typedef struct { + DWORD dwForwardDest; + DWORD dwForwardMask; + DWORD dwForwardPolicy; + DWORD dwForwardNextHop; + DWORD dwForwardIfIndex; + DWORD dwForwardType; + DWORD dwForwardProto; + DWORD dwForwardAge; + DWORD dwForwardNextHopAS; + DWORD dwForwardMetric1; + DWORD dwForwardMetric2; + DWORD dwForwardMetric3; + DWORD dwForwardMetric4; + DWORD dwForwardMetric5; +} MIB_IPFORWARDROW, *PMIB_IPFORWARDROW; +typedef struct { + DWORD dwNumEntries; + MIB_IPFORWARDROW table[ANY_SIZE]; +} MIB_IPFORWARDTABLE, *PMIB_IPFORWARDTABLE; +typedef struct { + DWORD dwIndex; + DWORD dwPhysAddrLen; + BYTE bPhysAddr[MAXLEN_PHYSADDR]; + DWORD dwAddr; + DWORD dwType; +} MIB_IPNETROW, *PMIB_IPNETROW; +typedef struct { + DWORD dwNumEntries; + MIB_IPNETROW table[ANY_SIZE]; +} MIB_IPNETTABLE, *PMIB_IPNETTABLE; +typedef struct { + DWORD dwMsgs; + DWORD dwErrors; + DWORD dwDestUnreachs; + DWORD dwTimeExcds; + DWORD dwParmProbs; + DWORD dwSrcQuenchs; + DWORD dwRedirects; + DWORD dwEchos; + DWORD dwEchoReps; + DWORD dwTimestamps; + DWORD dwTimestampReps; + DWORD dwAddrMasks; + DWORD dwAddrMaskReps; +} MIBICMPSTATS, *PMIBICMPSTATS; +typedef struct { + MIBICMPSTATS icmpInStats; + MIBICMPSTATS icmpOutStats; +} MIBICMPINFO, *PMIBICMPINFO; +typedef struct { + MIBICMPINFO stats; +} MIB_ICMP, *PMIB_ICMP; +typedef struct { + WCHAR wszName[MAX_INTERFACE_NAME_LEN]; + DWORD dwIndex; + DWORD dwType; + DWORD dwMtu; + DWORD dwSpeed; + DWORD dwPhysAddrLen; + BYTE bPhysAddr[MAXLEN_PHYSADDR]; + DWORD dwAdminStatus; + DWORD dwOperStatus; + DWORD dwLastChange; + DWORD dwInOctets; + DWORD dwInUcastPkts; + DWORD dwInNUcastPkts; + DWORD dwInDiscards; + DWORD dwInErrors; + DWORD dwInUnknownProtos; + DWORD dwOutOctets; + DWORD dwOutUcastPkts; + DWORD dwOutNUcastPkts; + DWORD dwOutDiscards; + DWORD dwOutErrors; + DWORD dwOutQLen; + DWORD dwDescrLen; + BYTE bDescr[MAXLEN_IFDESCR]; +} MIB_IFROW, *PMIB_IFROW; +typedef struct { + DWORD dwNumEntries; + MIB_IFROW table[ANY_SIZE]; +} MIB_IFTABLE, *PMIB_IFTABLE; +typedef struct { + DWORD dwForwarding; + DWORD dwDefaultTTL; + DWORD dwInReceives; + DWORD dwInHdrErrors; + DWORD dwInAddrErrors; + DWORD dwForwDatagrams; + DWORD dwInUnknownProtos; + DWORD dwInDiscards; + DWORD dwInDelivers; + DWORD dwOutRequests; + DWORD dwRoutingDiscards; + DWORD dwOutDiscards; + DWORD dwOutNoRoutes; + DWORD dwReasmTimeout; + DWORD dwReasmReqds; + DWORD dwReasmOks; + DWORD dwReasmFails; + DWORD dwFragOks; + DWORD dwFragFails; + DWORD dwFragCreates; + DWORD dwNumIf; + DWORD dwNumAddr; + DWORD dwNumRoutes; +} MIB_IPSTATS, *PMIB_IPSTATS; +typedef struct { + DWORD dwRtoAlgorithm; + DWORD dwRtoMin; + DWORD dwRtoMax; + DWORD dwMaxConn; + DWORD dwActiveOpens; + DWORD dwPassiveOpens; + DWORD dwAttemptFails; + DWORD dwEstabResets; + DWORD dwCurrEstab; + DWORD dwInSegs; + DWORD dwOutSegs; + DWORD dwRetransSegs; + DWORD dwInErrs; + DWORD dwOutRsts; + DWORD dwNumConns; +} MIB_TCPSTATS, *PMIB_TCPSTATS; +typedef struct { + DWORD dwState; + DWORD dwLocalAddr; + DWORD dwLocalPort; + DWORD dwRemoteAddr; + DWORD dwRemotePort; +} MIB_TCPROW, *PMIB_TCPROW; +typedef struct { + DWORD dwNumEntries; + MIB_TCPROW table[ANY_SIZE]; +} MIB_TCPTABLE, *PMIB_TCPTABLE; +typedef struct { + DWORD dwInDatagrams; + DWORD dwNoPorts; + DWORD dwInErrors; + DWORD dwOutDatagrams; + DWORD dwNumAddrs; +} MIB_UDPSTATS, *PMIB_UDPSTATS; +typedef struct { + DWORD dwLocalAddr; + DWORD dwLocalPort; +} MIB_UDPROW, *PMIB_UDPROW; +typedef struct { + DWORD dwNumEntries; + MIB_UDPROW table[ANY_SIZE]; +} MIB_UDPTABLE, *PMIB_UDPTABLE; +#ifdef __cplusplus +} +#endif +#endif /* _IPRTRMIB_H */ diff --git a/reactos/w32api/include/iptypes.h b/reactos/w32api/include/iptypes.h new file mode 100644 index 00000000000..6ddded00a8f --- /dev/null +++ b/reactos/w32api/include/iptypes.h @@ -0,0 +1,78 @@ +#ifndef _IPTYPES_H +#define _IPTYPES_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#include <sys/types.h> +#ifdef __cplusplus +extern "C" { +#endif +#define DEFAULT_MINIMUM_ENTITIES 32 +#define MAX_ADAPTER_ADDRESS_LENGTH 8 +#define MAX_ADAPTER_DESCRIPTION_LENGTH 128 +#define MAX_ADAPTER_NAME_LENGTH 256 +#define MAX_DOMAIN_NAME_LEN 128 +#define MAX_HOSTNAME_LEN 128 +#define MAX_SCOPE_ID_LEN 256 +#define BROADCAST_NODETYPE 1 +#define PEER_TO_PEER_NODETYPE 2 +#define MIXED_NODETYPE 4 +#define HYBRID_NODETYPE 8 +#define IF_OTHER_ADAPTERTYPE 0 +#define IF_ETHERNET_ADAPTERTYPE 1 +#define IF_TOKEN_RING_ADAPTERTYPE 2 +#define IF_FDDI_ADAPTERTYPE 3 +#define IF_PPP_ADAPTERTYPE 4 +#define IF_LOOPBACK_ADAPTERTYPE 5 +typedef struct { + char String[16]; +} IP_ADDRESS_STRING, *PIP_ADDRESS_STRING, IP_MASK_STRING, *PIP_MASK_STRING; +typedef struct _IP_ADDR_STRING { + struct _IP_ADDR_STRING* Next; + IP_ADDRESS_STRING IpAddress; + IP_MASK_STRING IpMask; + DWORD Context; +} IP_ADDR_STRING, *PIP_ADDR_STRING; +typedef struct _IP_ADAPTER_INFO { + struct _IP_ADAPTER_INFO* Next; + DWORD ComboIndex; + char AdapterName[MAX_ADAPTER_NAME_LENGTH+4]; + char Description[MAX_ADAPTER_DESCRIPTION_LENGTH+4]; + UINT AddressLength; + BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH]; + DWORD Index; + UINT Type; + UINT DhcpEnabled; + PIP_ADDR_STRING CurrentIpAddress; + IP_ADDR_STRING IpAddressList; + IP_ADDR_STRING GatewayList; + IP_ADDR_STRING DhcpServer; + BOOL HaveWins; + IP_ADDR_STRING PrimaryWinsServer; + IP_ADDR_STRING SecondaryWinsServer; + time_t LeaseObtained; + time_t LeaseExpires; +} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO; +typedef struct _IP_PER_ADAPTER_INFO { + UINT AutoconfigEnabled; + UINT AutoconfigActive; + PIP_ADDR_STRING CurrentDnsServer; + IP_ADDR_STRING DnsServerList; +} IP_PER_ADAPTER_INFO, *PIP_PER_ADAPTER_INFO; +typedef struct _FIXED_INFO { + char HostName[MAX_HOSTNAME_LEN+4] ; + char DomainName[MAX_DOMAIN_NAME_LEN+4]; + PIP_ADDR_STRING CurrentDnsServer; + IP_ADDR_STRING DnsServerList; + UINT NodeType; + char ScopeId[MAX_SCOPE_ID_LEN+4]; + UINT EnableRouting; + UINT EnableProxy; + UINT EnableDns; +} FIXED_INFO, *PFIXED_INFO; + +#ifdef __cplusplus +} +#endif +#endif /* _IPTYPES_H */ diff --git a/reactos/w32api/include/isguids.h b/reactos/w32api/include/isguids.h new file mode 100644 index 00000000000..d5655d262fa --- /dev/null +++ b/reactos/w32api/include/isguids.h @@ -0,0 +1,15 @@ +#ifndef _ISGUID_H +#define _ISGUID_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +extern const GUID CLSID_InternetShortcut; +extern const GUID IID_IUniformResourceLocator; +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/largeint.h b/reactos/w32api/include/largeint.h new file mode 100644 index 00000000000..b2222a97fc5 --- /dev/null +++ b/reactos/w32api/include/largeint.h @@ -0,0 +1,112 @@ +/* + largeint.h + + Header for 64 bit integer arithmetics library + + */ +#ifndef _LARGEINT_H +#define _LARGEINT_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#include <windows.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _HAVE_INT64 +#define _toi (__int64) +#define _toui (unsigned __int64) +#else +#error "64 bit integers not supported" +#endif + +/* + We don't let the compiler see the prototypes if we are compiling the + library because if it does it will choke on conflicting types in the + prototypes. +*/ + +#if defined(LARGEINT_PROTOS) || defined(__COMPILING_LARGEINT) + +#ifndef __COMPILING_LARGEINT +/* addition/subtraction */ +LARGE_INTEGER WINAPI LargeIntegerAdd (LARGE_INTEGER, LARGE_INTEGER); +LARGE_INTEGER WINAPI LargeIntegerSubtract (LARGE_INTEGER, LARGE_INTEGER); + +/* bit operations */ +LARGE_INTEGER WINAPI LargeIntegerArithmeticShift (LARGE_INTEGER, int); +LARGE_INTEGER WINAPI LargeIntegerShiftLeft (LARGE_INTEGER, int); +LARGE_INTEGER WINAPI LargeIntegerShiftRight (LARGE_INTEGER, int); +LARGE_INTEGER WINAPI LargeIntegerNegate (LARGE_INTEGER); + +/* conversion */ +LARGE_INTEGER WINAPI ConvertLongToLargeInteger (LONG); +LARGE_INTEGER WINAPI ConvertUlongToLargeInteger (ULONG); + +/* multiplication */ +LARGE_INTEGER WINAPI EnlargedIntegerMultiply (LONG, LONG); +LARGE_INTEGER WINAPI EnlargedUnsignedMultiply (ULONG, ULONG); +LARGE_INTEGER WINAPI ExtendedIntegerMultiply (LARGE_INTEGER, LONG); +/* FIXME: is this not part of largeint? */ +LARGE_INTEGER WINAPI LargeIntegerMultiply (LARGE_INTEGER, LARGE_INTEGER); +#endif /* __COMPILING_LARGEINT */ + +#else + +#define LargeIntegerAdd(a,b) (LARGE_INTEGER)(_toi(a) + _toi(b)) +#define LargeIntegerSubtract(a,b) (LARGE_INTEGER)(_toi(a) - _toi(b)) +#define LargeIntegerRightShift(i,n) (LARGE_INTEGER)(_toi(i) >> (n)) +#define LargeIntegerArithmeticShift LargeIntegerRightShift +#define LargeIntegerLeftShift(i,n) (LARGE_INTEGER)(_toi(i) << (n)) +#define LargeIntegerNegate(i) (LARGE_INTEGER)(- _toi(i)) +#define EnlargedIntegerMultiply(a,b) (LARGE_INTEGER)(_toi(a) * _toi(b)) +#define EnlargedUnsignedMultiply(a,b) (LARGE_INTEGER)(_toui(a) * _toui(b)) +#define ExtendedIntegerMultiply(a,b) (LARGE_INTEGER)(_toi(a) * _toi(b)) +/* FIXME: should this exist */ +#define LargeIntegerMultiply(a,b) (LARGE_INTEGER)(_toi(a) * _toi(b)) +#define ConvertLongToLargeInteger(l) (LARGE_INTEGER)(_toi(l)) +#define ConvertUlongToLargeInteger(ul) (LARGE_INTEGER)(_toui(ul)) + +#endif /* LARGEINT_PROTOS || __COMPILING_LARGEINT */ + +#ifndef __COMPILING_LARGEINT +/* division; no macros of these because of multiple expansion */ +LARGE_INTEGER WINAPI LargeIntegerDivide (LARGE_INTEGER, LARGE_INTEGER, PLARGE_INTEGER); +ULONG WINAPI EnlargedUnsignedDivide (ULARGE_INTEGER, ULONG, PULONG); +LARGE_INTEGER WINAPI ExtendedLargeIntegerDivide (LARGE_INTEGER, ULONG, PULONG); +LARGE_INTEGER WINAPI ExtendedMagicDivide (LARGE_INTEGER, LARGE_INTEGER, int); +#endif /* __COMPILING_LARGEINT */ + +#define LargeIntegerAnd(dest, src, m) \ +{ \ + dest._STRUCT_NAME(u.)LowPart = s._STRUCT_NAME(u.)LowPart & m._STRUCT_NAME(u.)LowPart; \ + dest._STRUCT_NAME(u.)HighPart = s._STRUCT_NAME(u.)HighPart & m._STRUCT_NAME(u.)HighPart; \ +} + +/* comparision */ +#define LargeIntegerGreaterThan(a,b) (_toi(a) > _toi(b)) +#define LargeIntegerGreaterThanOrEqual(a,b) (_toi(a) >= _toi(b)) +#define LargeIntegerEqualTo(a,b) (_toi(a) == _toi(b)) +#define LargeIntegerNotEqualTo(a,b) (_toi(a) != _toi(b)) +#define LargeIntegerLessThan(a,b) (_toi(a) < _toi(b)) +#define LargeIntegerLessThanOrEqualTo(a,b) (_toi(a) <= _toi(b)) +#define LargeIntegerGreaterThanZero(a) (_toi(a) > 0) +#define LargeIntegerGreaterOrEqualToZero(a) ((a)._STRUCT_NAME(u.)HighPart > 0) +#define LargeIntegerEqualToZero(a) !((a)._STRUCT_NAME(u.)LowPart | (a)._STRUCT_NAME(u.)HighPart) +#define LargeIntegerNotEqualToZero(a) ((a)._STRUCT_NAME(u.)LowPart | (a)._STRUCT_NAME(u.)HighPart) +#define LargeIntegerLessThanZero(a) ((a)._STRUCT_NAME(u.)HighPart < 0) +#define LargeIntegerLessOrEqualToZero(a) (_toi(a) <= 0) + +#ifndef __COMPILING_LARGEINT +#undef _toi +#undef _toui +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _LARGEINT_H */ diff --git a/reactos/w32api/include/lm.h b/reactos/w32api/include/lm.h new file mode 100644 index 00000000000..db1779db6fc --- /dev/null +++ b/reactos/w32api/include/lm.h @@ -0,0 +1,27 @@ +#ifndef _LM_H +#define _LM_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#include <lmcons.h> +#include <lmaccess.h> +#include <lmalert.h> +#include <lmat.h> +#include <lmaudit.h> +#include <lmchdev.h> +#include <lmconfig.h> +#include <lmerr.h> +#include <lmmsg.h> +#include <lmshare.h> +#include <lmapibuf.h> +#include <lmremutl.h> +#include <lmrepl.h> +#include <lmuse.h> +#include <lmerrlog.h> +#include <lmsvc.h> +#include <lmwksta.h> +#include <lmserver.h> +#include <lmstats.h> + +#endif diff --git a/reactos/w32api/include/lmaccess.h b/reactos/w32api/include/lmaccess.h new file mode 100644 index 00000000000..044a7a6074a --- /dev/null +++ b/reactos/w32api/include/lmaccess.h @@ -0,0 +1,610 @@ +#ifndef _LMACCESS_H +#define _LMACCESS_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#include <lmcons.h> +#define GROUP_SPECIALGRP_USERS L"USERS" +#define GROUP_SPECIALGRP_ADMINS L"ADMINS" +#define GROUP_SPECIALGRP_GUESTS L"GUESTS" +#define GROUP_SPECIALGRP_LOCAL L"LOCAL" +#define ACCESS_LETTERS "RWCXDAP " +#define NETLOGON_CONTROL_QUERY 1 +#define NETLOGON_CONTROL_REPLICATE 2 +#define NETLOGON_CONTROL_SYNCHRONIZE 3 +#define NETLOGON_CONTROL_PDC_REPLICATE 4 +#define NETLOGON_CONTROL_REDISCOVER 5 +#define NETLOGON_CONTROL_TC_QUERY 6 +#define NETLOGON_CONTROL_BACKUP_CHANGE_LOG 65532 +#define NETLOGON_CONTROL_TRUNCATE_LOG 65533 +#define NETLOGON_CONTROL_SET_DBFLAG 65534 +#define NETLOGON_CONTROL_BREAKPOINT 65535 +#define UF_SCRIPT 1 +#define UF_ACCOUNTDISABLE 2 +#define UF_HOMEDIR_REQUIRED 8 +#define UF_LOCKOUT 16 +#define UF_PASSWD_NOTREQD 32 +#define UF_PASSWD_CANT_CHANGE 64 +#define UF_TEMP_DUPLICATE_ACCOUNT 256 +#define UF_NORMAL_ACCOUNT 512 +#define UF_INTERDOMAIN_TRUST_ACCOUNT 2048 +#define UF_WORKSTATION_TRUST_ACCOUNT 4096 +#define UF_SERVER_TRUST_ACCOUNT 8192 +#define UF_MNS_LOGON_ACCOUNT 131072 +#define UF_MACHINE_ACCOUNT_MASK (UF_INTERDOMAIN_TRUST_ACCOUNT|UF_WORKSTATION_TRUST_ACCOUNT|UF_SERVER_TRUST_ACCOUNT) +#define UF_ACCOUNT_TYPE_MASK (UF_TEMP_DUPLICATE_ACCOUNT|UF_NORMAL_ACCOUNT|UF_INTERDOMAIN_TRUST_ACCOUNT|UF_WORKSTATION_TRUST_ACCOUNT|UF_SERVER_TRUST_ACCOUNT) +#define UF_DONT_EXPIRE_PASSWD 65536 +#define UF_SETTABLE_BITS (UF_SCRIPT|UF_ACCOUNTDISABLE|UF_LOCKOUT|UF_HOMEDIR_REQUIRED|UF_PASSWD_NOTREQD|UF_PASSWD_CANT_CHANGE|UF_ACCOUNT_TYPE_MASK|UF_DONT_EXPIRE_PASSWD) +#define FILTER_TEMP_DUPLICATE_ACCOUNT 1 +#define FILTER_NORMAL_ACCOUNT 2 +#define FILTER_INTERDOMAIN_TRUST_ACCOUNT 8 +#define FILTER_WORKSTATION_TRUST_ACCOUNT 16 +#define FILTER_SERVER_TRUST_ACCOUNT 32 +#define LG_INCLUDE_INDIRECT 1 +#define AF_OP_PRINT 1 +#define AF_OP_COMM 2 +#define AF_OP_SERVER 4 +#define AF_OP_ACCOUNTS 8 +#define AF_SETTABLE_BITS (AF_OP_PRINT|AF_OP_COMM|AF_OP_SERVER|AF_OP_ACCOUNTS) +#define UAS_ROLE_STANDALONE 0 +#define UAS_ROLE_MEMBER 1 +#define UAS_ROLE_BACKUP 2 +#define UAS_ROLE_PRIMARY 3 +#define USER_NAME_PARMNUM 1 +#define USER_PASSWORD_PARMNUM 3 +#define USER_PASSWORD_AGE_PARMNUM 4 +#define USER_PRIV_PARMNUM 5 +#define USER_HOME_DIR_PARMNUM 6 +#define USER_COMMENT_PARMNUM 7 +#define USER_FLAGS_PARMNUM 8 +#define USER_SCRIPT_PATH_PARMNUM 9 +#define USER_AUTH_FLAGS_PARMNUM 10 +#define USER_FULL_NAME_PARMNUM 11 +#define USER_USR_COMMENT_PARMNUM 12 +#define USER_PARMS_PARMNUM 13 +#define USER_WORKSTATIONS_PARMNUM 14 +#define USER_LAST_LOGON_PARMNUM 15 +#define USER_LAST_LOGOFF_PARMNUM 16 +#define USER_ACCT_EXPIRES_PARMNUM 17 +#define USER_MAX_STORAGE_PARMNUM 18 +#define USER_UNITS_PER_WEEK_PARMNUM 19 +#define USER_LOGON_HOURS_PARMNUM 20 +#define USER_PAD_PW_COUNT_PARMNUM 21 +#define USER_NUM_LOGONS_PARMNUM 22 +#define USER_LOGON_SERVER_PARMNUM 23 +#define USER_COUNTRY_CODE_PARMNUM 24 +#define USER_CODE_PAGE_PARMNUM 25 +#define USER_PRIMARY_GROUP_PARMNUM 51 +#define USER_PROFILE 52 +#define USER_PROFILE_PARMNUM 52 +#define USER_HOME_DIR_DRIVE_PARMNUM 53 +#define USER_NAME_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_NAME_PARMNUM) +#define USER_PASSWORD_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_PASSWORD_PARMNUM) +#define USER_PASSWORD_AGE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_PASSWORD_AGE_PARMNUM) +#define USER_PRIV_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_PRIV_PARMNUM) +#define USER_HOME_DIR_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_HOME_DIR_PARMNUM) +#define USER_COMMENT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_COMMENT_PARMNUM) +#define USER_FLAGS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_FLAGS_PARMNUM) +#define USER_SCRIPT_PATH_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_SCRIPT_PATH_PARMNUM) +#define USER_AUTH_FLAGS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_AUTH_FLAGS_PARMNUM) +#define USER_FULL_NAME_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_FULL_NAME_PARMNUM) +#define USER_USR_COMMENT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_USR_COMMENT_PARMNUM) +#define USER_PARMS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_PARMS_PARMNUM) +#define USER_WORKSTATIONS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_WORKSTATIONS_PARMNUM) +#define USER_LAST_LOGON_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_LAST_LOGON_PARMNUM) +#define USER_LAST_LOGOFF_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_LAST_LOGOFF_PARMNUM) +#define USER_ACCT_EXPIRES_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_ACCT_EXPIRES_PARMNUM) +#define USER_MAX_STORAGE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_MAX_STORAGE_PARMNUM) +#define USER_UNITS_PER_WEEK_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_UNITS_PER_WEEK_PARMNUM) +#define USER_LOGON_HOURS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_LOGON_HOURS_PARMNUM) +#define USER_PAD_PW_COUNT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_PAD_PW_COUNT_PARMNUM) +#define USER_NUM_LOGONS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_NUM_LOGONS_PARMNUM) +#define USER_LOGON_SERVER_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_LOGON_SERVER_PARMNUM) +#define USER_COUNTRY_CODE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_COUNTRY_CODE_PARMNUM) +#define USER_CODE_PAGE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_CODE_PAGE_PARMNUM) +#define USER_PRIMARY_GROUP_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_PRIMARY_GROUP_PARMNUM) +#define USER_POSIX_ID_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_POSIX_ID_PARMNUM) +#define USER_HOME_DIR_DRIVE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+USER_HOME_DIR_DRIVE_PARMNUM) +#define NULL_USERSETINFO_PASSWD " " +#define TIMEQ_FOREVER ((ULONG)-1) +#define USER_MAXSTORAGE_UNLIMITED ((ULONG)-1) +#define USER_NO_LOGOFF ((ULONG)-1L) +#define UNITS_PER_DAY 24 +#define UNITS_PER_WEEK 168 +#define USER_PRIV_MASK 3 +#define USER_PRIV_GUEST 0 +#define USER_PRIV_USER 1 +#define USER_PRIV_ADMIN 2 +#define MAX_PASSWD_LEN PWLEN +#define DEF_MIN_PWLEN 6 +#define DEF_PWUNIQUENESS 5 +#define DEF_MAX_PWHIST 8 +#define DEF_MAX_PWAGE TIMEQ_FOREVER +#define DEF_MIN_PWAGE 0 +#define DEF_FORCE_LOGOFF (ULONG)0xffffffff +#define DEF_MAX_BADPW 0 +#define ONE_DAY 86400 +#define VALIDATED_LOGON 0 +#define PASSWORD_EXPIRED 2 +#define NON_VALIDATED_LOGON 3 +#define VALID_LOGOFF 1 +#define MODALS_MIN_PASSWD_LEN_PARMNUM 1 +#define MODALS_MAX_PASSWD_AGE_PARMNUM 2 +#define MODALS_MIN_PASSWD_AGE_PARMNUM 3 +#define MODALS_FORCE_LOGOFF_PARMNUM 4 +#define MODALS_PASSWD_HIST_LEN_PARMNUM 5 +#define MODALS_ROLE_PARMNUM 6 +#define MODALS_PRIMARY_PARMNUM 7 +#define MODALS_DOMAIN_NAME_PARMNUM 8 +#define MODALS_DOMAIN_ID_PARMNUM 9 +#define MODALS_LOCKOUT_DURATION_PARMNUM 10 +#define MODALS_LOCKOUT_OBSERVATION_WINDOW_PARMNUM 11 +#define MODALS_LOCKOUT_THRESHOLD_PARMNUM 12 +#define MODALS_MIN_PASSWD_LEN_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+MODALS_MIN_PASSWD_LEN_PARMNUM) +#define MODALS_MAX_PASSWD_AGE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+MODALS_MAX_PASSWD_AGE_PARMNUM) +#define MODALS_MIN_PASSWD_AGE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+MODALS_MIN_PASSWD_AGE_PARMNUM) +#define MODALS_FORCE_LOGOFF_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+MODALS_FORCE_LOGOFF_PARMNUM) +#define MODALS_PASSWD_HIST_LEN_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+MODALS_PASSWD_HIST_LEN_PARMNUM) +#define MODALS_ROLE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+MODALS_ROLE_PARMNUM) +#define MODALS_PRIMARY_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+MODALS_PRIMARY_PARMNUM) +#define MODALS_DOMAIN_NAME_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+MODALS_DOMAIN_NAME_PARMNUM) +#define MODALS_DOMAIN_ID_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+MODALS_DOMAIN_ID_PARMNUM) +#define GROUPIDMASK 0x8000 +#define GROUP_ALL_PARMNUM 0 +#define GROUP_NAME_PARMNUM 1 +#define GROUP_COMMENT_PARMNUM 2 +#define GROUP_ATTRIBUTES_PARMNUM 3 +#define GROUP_ALL_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+GROUP_ALL_PARMNUM) +#define GROUP_NAME_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+GROUP_NAME_PARMNUM) +#define GROUP_COMMENT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+GROUP_COMMENT_PARMNUM) +#define GROUP_ATTRIBUTES_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+GROUP_ATTRIBUTES_PARMNUM) +#define GROUP_POSIX_ID_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+GROUP_POSIX_ID_PARMNUM) +#define LOCALGROUP_NAME_PARMNUM 1 +#define LOCALGROUP_COMMENT_PARMNUM 2 +#define MAXPERMENTRIES 64 +#define ACCESS_NONE 0 +#define ACCESS_ALL (ACCESS_READ|ACCESS_WRITE|ACCESS_CREATE|ACCESS_EXEC|ACCESS_DELETE|ACCESS_ATRIB|ACCESS_PERM) +#define ACCESS_READ 1 +#define ACCESS_WRITE 2 +#define ACCESS_CREATE 4 +#define ACCESS_EXEC 8 +#define ACCESS_DELETE 16 +#define ACCESS_ATRIB 32 +#define ACCESS_PERM 64 +#define ACCESS_GROUP 0x8000 +#define ACCESS_AUDIT 1 +#define ACCESS_SUCCESS_OPEN 16 +#define ACCESS_SUCCESS_WRITE 32 +#define ACCESS_SUCCESS_DELETE 64 +#define ACCESS_SUCCESS_ACL 128 +#define ACCESS_SUCCESS_MASK 240 +#define ACCESS_FAIL_OPEN 256 +#define ACCESS_FAIL_WRITE 512 +#define ACCESS_FAIL_DELETE 1024 +#define ACCESS_FAIL_ACL 2048 +#define ACCESS_FAIL_MASK 3840 +#define ACCESS_FAIL_SHIFT 4 +#define ACCESS_RESOURCE_NAME_PARMNUM 1 +#define ACCESS_ATTR_PARMNUM 2 +#define ACCESS_COUNT_PARMNUM 3 +#define ACCESS_ACCESS_LIST_PARMNUM 4 +#define ACCESS_RESOURCE_NAME_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+ACCESS_RESOURCE_NAME_PARMNUM) +#define ACCESS_ATTR_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+ACCESS_ATTR_PARMNUM) +#define ACCESS_COUNT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+ACCESS_COUNT_PARMNUM) +#define ACCESS_ACCESS_LIST_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+ACCESS_ACCESS_LIST_PARMNUM) +#define NETLOGON_REPLICATION_NEEDED 1 +#define NETLOGON_REPLICATION_IN_PROGRESS 2 +#define NETLOGON_FULL_SYNC_REPLICATION 4 +#define NETLOGON_REDO_NEEDED 8 + +typedef struct _USER_INFO_0 { LPWSTR usri0_name; }USER_INFO_0,*PUSER_INFO_0,*LPUSER_INFO_0; +typedef struct _USER_INFO_1 { + LPWSTR usri1_name; + LPWSTR usri1_password; + DWORD usri1_password_age; + DWORD usri1_priv; + LPWSTR usri1_home_dir; + LPWSTR usri1_comment; + DWORD usri1_flags; + LPWSTR usri1_script_path; +}USER_INFO_1,*PUSER_INFO_1,*LPUSER_INFO_1; +typedef struct _USER_INFO_2 { + LPWSTR usri2_name; + LPWSTR usri2_password; + DWORD usri2_password_age; + DWORD usri2_priv; + LPWSTR usri2_home_dir; + LPWSTR usri2_comment; + DWORD usri2_flags; + LPWSTR usri2_script_path; + DWORD usri2_auth_flags; + LPWSTR usri2_full_name; + LPWSTR usri2_usr_comment; + LPWSTR usri2_parms; + LPWSTR usri2_workstations; + DWORD usri2_last_logon; + DWORD usri2_last_logoff; + DWORD usri2_acct_expires; + DWORD usri2_max_storage; + DWORD usri2_units_per_week; + PBYTE usri2_logon_hours; + DWORD usri2_bad_pw_count; + DWORD usri2_num_logons; + LPWSTR usri2_logon_server; + DWORD usri2_country_code; + DWORD usri2_code_page; +}USER_INFO_2,*PUSER_INFO_2,*LPUSER_INFO_2; +typedef struct _USER_INFO_3 { + LPWSTR usri3_name; + LPWSTR usri3_password; + DWORD usri3_password_age; + DWORD usri3_priv; + LPWSTR usri3_home_dir; + LPWSTR usri3_comment; + DWORD usri3_flags; + LPWSTR usri3_script_path; + DWORD usri3_auth_flags; + LPWSTR usri3_full_name; + LPWSTR usri3_usr_comment; + LPWSTR usri3_parms; + LPWSTR usri3_workstations; + DWORD usri3_last_logon; + DWORD usri3_last_logoff; + DWORD usri3_acct_expires; + DWORD usri3_max_storage; + DWORD usri3_units_per_week; + PBYTE usri3_logon_hours; + DWORD usri3_bad_pw_count; + DWORD usri3_num_logons; + LPWSTR usri3_logon_server; + DWORD usri3_country_code; + DWORD usri3_code_page; + DWORD usri3_user_id; + DWORD usri3_primary_group_id; + LPWSTR usri3_profile; + LPWSTR usri3_home_dir_drive; + DWORD usri3_password_expired; +}USER_INFO_3,*PUSER_INFO_3,*LPUSER_INFO_3; +typedef struct _USER_INFO_10 { + LPWSTR usri10_name; + LPWSTR usri10_comment; + LPWSTR usri10_usr_comment; + LPWSTR usri10_full_name; +}USER_INFO_10,*PUSER_INFO_10,*LPUSER_INFO_10; +typedef struct _USER_INFO_11 { + LPWSTR usri11_name; + LPWSTR usri11_comment; + LPWSTR usri11_usr_comment; + LPWSTR usri11_full_name; + DWORD usri11_priv; + DWORD usri11_auth_flags; + DWORD usri11_password_age; + LPWSTR usri11_home_dir; + LPWSTR usri11_parms; + DWORD usri11_last_logon; + DWORD usri11_last_logoff; + DWORD usri11_bad_pw_count; + DWORD usri11_num_logons; + LPWSTR usri11_logon_server; + DWORD usri11_country_code; + LPWSTR usri11_workstations; + DWORD usri11_max_storage; + DWORD usri11_units_per_week; + PBYTE usri11_logon_hours; + DWORD usri11_code_page; +}USER_INFO_11,*PUSER_INFO_11,*LPUSER_INFO_11; +typedef struct _USER_INFO_20 { + LPWSTR usri20_name; + LPWSTR usri20_full_name; + LPWSTR usri20_comment; + DWORD usri20_flags; + DWORD usri20_user_id; +}USER_INFO_20,*PUSER_INFO_20,*LPUSER_INFO_20; +typedef struct _USER_INFO_21 { + BYTE usri21_password[ENCRYPTED_PWLEN]; +}USER_INFO_21,*PUSER_INFO_21,*LPUSER_INFO_21; +typedef struct _USER_INFO_22 { + LPWSTR usri22_name; + BYTE usri22_password[ENCRYPTED_PWLEN]; + DWORD usri22_password_age; + DWORD usri22_priv; + LPWSTR usri22_home_dir; + LPWSTR usri22_comment; + DWORD usri22_flags; + LPWSTR usri22_script_path; + DWORD usri22_auth_flags; + LPWSTR usri22_full_name; + LPWSTR usri22_usr_comment; + LPWSTR usri22_parms; + LPWSTR usri22_workstations; + DWORD usri22_last_logon; + DWORD usri22_last_logoff; + DWORD usri22_acct_expires; + DWORD usri22_max_storage; + DWORD usri22_units_per_week; + PBYTE usri22_logon_hours; + DWORD usri22_bad_pw_count; + DWORD usri22_num_logons; + LPWSTR usri22_logon_server; + DWORD usri22_country_code; + DWORD usri22_code_page; + }USER_INFO_22,*PUSER_INFO_22,*LPUSER_INFO_22; +typedef struct _USER_INFO_1003 { + LPWSTR usri1003_password; +} USER_INFO_1003,*PUSER_INFO_1003,*LPUSER_INFO_1003; +typedef struct _USER_INFO_1005 { + DWORD usri1005_priv; +} USER_INFO_1005,*PUSER_INFO_1005,*LPUSER_INFO_1005; +typedef struct _USER_INFO_1006 { + LPWSTR usri1006_home_dir; +} USER_INFO_1006,*PUSER_INFO_1006,*LPUSER_INFO_1006; +typedef struct _USER_INFO_1007 { + LPWSTR usri1007_comment; +} USER_INFO_1007,*PUSER_INFO_1007,*LPUSER_INFO_1007; +typedef struct _USER_INFO_1008 { + DWORD usri1008_flags; +} USER_INFO_1008,*PUSER_INFO_1008,*LPUSER_INFO_1008; +typedef struct _USER_INFO_1009 { + LPWSTR usri1009_script_path; +} USER_INFO_1009,*PUSER_INFO_1009,*LPUSER_INFO_1009; +typedef struct _USER_INFO_1010 { + DWORD usri1010_auth_flags; +} USER_INFO_1010,*PUSER_INFO_1010,*LPUSER_INFO_1010; +typedef struct _USER_INFO_1011 { + LPWSTR usri1011_full_name; +} USER_INFO_1011,*PUSER_INFO_1011,*LPUSER_INFO_1011; +typedef struct _USER_INFO_1012 { + LPWSTR usri1012_usr_comment; +} USER_INFO_1012,*PUSER_INFO_1012,*LPUSER_INFO_1012; +typedef struct _USER_INFO_1013 { + LPWSTR usri1013_parms; +} USER_INFO_1013,*PUSER_INFO_1013,*LPUSER_INFO_1013; +typedef struct _USER_INFO_1014 { + LPWSTR usri1014_workstations; +} USER_INFO_1014,*PUSER_INFO_1014,*LPUSER_INFO_1014; +typedef struct _USER_INFO_1017 { + DWORD usri1017_acct_expires; +} USER_INFO_1017,*PUSER_INFO_1017,*LPUSER_INFO_1017; +typedef struct _USER_INFO_1018 { + DWORD usri1018_max_storage; +} USER_INFO_1018,*PUSER_INFO_1018,*LPUSER_INFO_1018; +typedef struct _USER_INFO_1020 { + DWORD usri1020_units_per_week; + PBYTE usri1020_logon_hours; +} USER_INFO_1020,*PUSER_INFO_1020,*LPUSER_INFO_1020; +typedef struct _USER_INFO_1023 { + LPWSTR usri1023_logon_server; +} USER_INFO_1023,*PUSER_INFO_1023,*LPUSER_INFO_1023; +typedef struct _USER_INFO_1024 { + DWORD usri1024_country_code; +} USER_INFO_1024,*PUSER_INFO_1024,*LPUSER_INFO_1024; +typedef struct _USER_INFO_1025 { + DWORD usri1025_code_page; +} USER_INFO_1025,*PUSER_INFO_1025,*LPUSER_INFO_1025; +typedef struct _USER_INFO_1051 { + DWORD usri1051_primary_group_id; +} USER_INFO_1051,*PUSER_INFO_1051,*LPUSER_INFO_1051; +typedef struct _USER_INFO_1052 { + LPWSTR usri1052_profile; +} USER_INFO_1052,*PUSER_INFO_1052,*LPUSER_INFO_1052; +typedef struct _USER_INFO_1053 { + LPWSTR usri1053_home_dir_drive; +} USER_INFO_1053,*PUSER_INFO_1053,*LPUSER_INFO_1053; +typedef struct _USER_MODALS_INFO_0 { + DWORD usrmod0_min_passwd_len; + DWORD usrmod0_max_passwd_age; + DWORD usrmod0_min_passwd_age; + DWORD usrmod0_force_logoff; + DWORD usrmod0_password_hist_len; +}USER_MODALS_INFO_0,*PUSER_MODALS_INFO_0,*LPUSER_MODALS_INFO_0; +typedef struct _USER_MODALS_INFO_1 { + DWORD usrmod1_role; + LPWSTR usrmod1_primary; +}USER_MODALS_INFO_1,*PUSER_MODALS_INFO_1,*LPUSER_MODALS_INFO_1; +typedef struct _USER_MODALS_INFO_2 { + LPWSTR usrmod2_domain_name; + PSID usrmod2_domain_id; +}USER_MODALS_INFO_2,*PUSER_MODALS_INFO_2,*LPUSER_MODALS_INFO_2; +typedef struct _USER_MODALS_INFO_3 { + DWORD usrmod3_lockout_duration; + DWORD usrmod3_lockout_observation_window; + DWORD usrmod3_lockout_threshold; +}USER_MODALS_INFO_3,*PUSER_MODALS_INFO_3,*LPUSER_MODALS_INFO_3; +typedef struct _USER_MODALS_INFO_1001 { + DWORD usrmod1001_min_passwd_len; +} USER_MODALS_INFO_1001,*PUSER_MODALS_INFO_1001,*LPUSER_MODALS_INFO_1001; +typedef struct _USER_MODALS_INFO_1002 { + DWORD usrmod1002_max_passwd_age; +} USER_MODALS_INFO_1002,*PUSER_MODALS_INFO_1002,*LPUSER_MODALS_INFO_1002; +typedef struct _USER_MODALS_INFO_1003 { + DWORD usrmod1003_min_passwd_age; +} USER_MODALS_INFO_1003,*PUSER_MODALS_INFO_1003,*LPUSER_MODALS_INFO_1003; +typedef struct _USER_MODALS_INFO_1004 { + DWORD usrmod1004_force_logoff; +} USER_MODALS_INFO_1004,*PUSER_MODALS_INFO_1004,*LPUSER_MODALS_INFO_1004; +typedef struct _USER_MODALS_INFO_1005 { + DWORD usrmod1005_password_hist_len; +} USER_MODALS_INFO_1005,*PUSER_MODALS_INFO_1005,*LPUSER_MODALS_INFO_1005; +typedef struct _USER_MODALS_INFO_1006 { + DWORD usrmod1006_role; +} USER_MODALS_INFO_1006,*PUSER_MODALS_INFO_1006,*LPUSER_MODALS_INFO_1006; +typedef struct _USER_MODALS_INFO_1007 { + LPWSTR usrmod1007_primary; +} USER_MODALS_INFO_1007,*PUSER_MODALS_INFO_1007,*LPUSER_MODALS_INFO_1007; +typedef struct _GROUP_INFO_0 { + LPWSTR grpi0_name; +}GROUP_INFO_0,*PGROUP_INFO_0,*LPGROUP_INFO_0; +typedef struct _GROUP_INFO_1 { + LPWSTR grpi1_name; + LPWSTR grpi1_comment; +}GROUP_INFO_1,*PGROUP_INFO_1,*LPGROUP_INFO_1; +typedef struct _GROUP_INFO_2 { + LPWSTR grpi2_name; + LPWSTR grpi2_comment; + DWORD grpi2_group_id; + DWORD grpi2_attributes; +}GROUP_INFO_2,*PGROUP_INFO_2; +typedef struct _GROUP_INFO_1002 { + LPWSTR grpi1002_comment; +} GROUP_INFO_1002,*PGROUP_INFO_1002,*LPGROUP_INFO_1002; +typedef struct _GROUP_INFO_1005 { + DWORD grpi1005_attributes; +} GROUP_INFO_1005,*PGROUP_INFO_1005,*LPGROUP_INFO_1005; +typedef struct _GROUP_USERS_INFO_0 { + LPWSTR grui0_name; +} GROUP_USERS_INFO_0,*PGROUP_USERS_INFO_0,*LPGROUP_USERS_INFO_0; +typedef struct _GROUP_USERS_INFO_1 { + LPWSTR grui1_name; + DWORD grui1_attributes; +} GROUP_USERS_INFO_1,*PGROUP_USERS_INFO_1,*LPGROUP_USERS_INFO_1; +typedef struct _LOCALGROUP_INFO_0 { + LPWSTR lgrpi0_name; +}LOCALGROUP_INFO_0,*PLOCALGROUP_INFO_0,*LPLOCALGROUP_INFO_0; +typedef struct _LOCALGROUP_INFO_1 { + LPWSTR lgrpi1_name; + LPWSTR lgrpi1_comment; +}LOCALGROUP_INFO_1,*PLOCALGROUP_INFO_1,*LPLOCALGROUP_INFO_1; +typedef struct _LOCALGROUP_INFO_1002 { + LPWSTR lgrpi1002_comment; +}LOCALGROUP_INFO_1002,*PLOCALGROUP_INFO_1002,*LPLOCALGROUP_INFO_1002; +typedef struct _LOCALGROUP_MEMBERS_INFO_0 { + PSID lgrmi0_sid; +} LOCALGROUP_MEMBERS_INFO_0,*PLOCALGROUP_MEMBERS_INFO_0,*LPLOCALGROUP_MEMBERS_INFO_0; +typedef struct _LOCALGROUP_MEMBERS_INFO_1 { + PSID lgrmi1_sid; + SID_NAME_USE lgrmi1_sidusage; + LPWSTR lgrmi1_name; +} LOCALGROUP_MEMBERS_INFO_1,*PLOCALGROUP_MEMBERS_INFO_1,*LPLOCALGROUP_MEMBERS_INFO_1; +typedef struct _LOCALGROUP_MEMBERS_INFO_2 { + PSID lgrmi2_sid; + SID_NAME_USE lgrmi2_sidusage; + LPWSTR lgrmi2_domainandname; +} LOCALGROUP_MEMBERS_INFO_2,*PLOCALGROUP_MEMBERS_INFO_2,*LPLOCALGROUP_MEMBERS_INFO_2; +typedef struct _LOCALGROUP_MEMBERS_INFO_3 { + LPWSTR lgrmi3_domainandname; +} LOCALGROUP_MEMBERS_INFO_3,*PLOCALGROUP_MEMBERS_INFO_3, +*LPLOCALGROUP_MEMBERS_INFO_3; +typedef struct _LOCALGROUP_USERS_INFO_0 { + LPWSTR lgrui0_name; +} LOCALGROUP_USERS_INFO_0,*PLOCALGROUP_USERS_INFO_0,*LPLOCALGROUP_USERS_INFO_0; +typedef struct _NET_DISPLAY_USER { + LPWSTR usri1_name; + LPWSTR usri1_comment; + DWORD usri1_flags; + LPWSTR usri1_full_name; + DWORD usri1_user_id; + DWORD usri1_next_index; +} NET_DISPLAY_USER,*PNET_DISPLAY_USER; +typedef struct _NET_DISPLAY_MACHINE { + LPWSTR usri2_name; + LPWSTR usri2_comment; + DWORD usri2_flags; + DWORD usri2_user_id; + DWORD usri2_next_index; +} NET_DISPLAY_MACHINE,*PNET_DISPLAY_MACHINE; +typedef struct _NET_DISPLAY_GROUP { + LPWSTR grpi3_name; + LPWSTR grpi3_comment; + DWORD grpi3_group_id; + DWORD grpi3_attributes; + DWORD grpi3_next_index; +} NET_DISPLAY_GROUP,*PNET_DISPLAY_GROUP; +typedef struct _ACCESS_INFO_0 { + LPTSTR acc0_resource_name; +}ACCESS_INFO_0,*PACCESS_INFO_0,*LPACCESS_INFO_0; +typedef struct _ACCESS_INFO_1 { + LPTSTR acc1_resource_name; + DWORD acc1_attr; + DWORD acc1_count; +}ACCESS_INFO_1,*PACCESS_INFO_1,*LPACCESS_INFO_1; +typedef struct _ACCESS_INFO_1002 { + DWORD acc1002_attr; +} ACCESS_INFO_1002,*PACCESS_INFO_1002,*LPACCESS_INFO_1002; +typedef struct _ACCESS_LIST { + LPTSTR acl_ugname; + DWORD acl_access; +}ACCESS_LIST,*PACCESS_LIST,*LPACCESS_LIST; +typedef struct _NETLOGON_INFO_1 { + DWORD netlog1_flags; + NET_API_STATUS netlog1_pdc_connection_status; +} NETLOGON_INFO_1,*PNETLOGON_INFO_1; +typedef struct _NETLOGON_INFO_2 { + DWORD netlog2_flags; + NET_API_STATUS netlog2_pdc_connection_status; + LPWSTR netlog2_trusted_dc_name; + NET_API_STATUS netlog2_tc_connection_status; +} NETLOGON_INFO_2,*PNETLOGON_INFO_2; +typedef struct _NETLOGON_INFO_3 { + DWORD netlog3_flags; + DWORD netlog3_logon_attempts; + DWORD netlog3_reserved1; + DWORD netlog3_reserved2; + DWORD netlog3_reserved3; + DWORD netlog3_reserved4; + DWORD netlog3_reserved5; +} NETLOGON_INFO_3,*PNETLOGON_INFO_3; + +#if 0 +/* MS has these defined, but the RxNetAccessXX functions aren't documented nor do + they exist in any headers */ +#define NetAccessAdd RxNetAccessAdd +#define NetAccessEnum RxNetAccessEnum +#define NetAccessGetInfo RxNetAccessGetInfo +#define NetAccessSetInfo RxNetAccessSetInfo +#define NetAccessDel RxNetAccessDel +#define NetAccessGetUserPerms RxNetAccessGetUserPerms +/* These are obsolete */ +NET_API_STATUS WINAPI NetAccessAdd(LPCWSTR,DWORD,PBYTE,PDWORD); +NET_API_STATUS WINAPI NetAccessEnum(LPCWSTR,LPCWSTR,DWORD,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); +NET_API_STATUS WINAPI NetAccessGetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE*); +NET_API_STATUS WINAPI NetAccessSetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE,PDWORD); +NET_API_STATUS WINAPI NetAccessDel(LPCWSTR,LPCWSTR); +NET_API_STATUS WINAPI NetAccessGetUserPerms(LPCWSTR,LPCWSTR,LPCWSTR,PDWORD); +#endif + +NET_API_STATUS WINAPI NetUserAdd(LPCWSTR,DWORD,PBYTE,PDWORD); +NET_API_STATUS WINAPI NetUserEnum(LPCWSTR,DWORD,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); +NET_API_STATUS WINAPI NetUserGetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE*); +NET_API_STATUS WINAPI NetUserSetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE,PDWORD); +NET_API_STATUS WINAPI NetUserDel(LPCWSTR,LPCWSTR); +NET_API_STATUS WINAPI NetUserGetGroups(LPCWSTR,LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD); +NET_API_STATUS WINAPI NetUserSetGroups(LPCWSTR,LPCWSTR,DWORD,PBYTE,DWORD); +NET_API_STATUS WINAPI NetUserGetLocalGroups(LPCWSTR,LPCWSTR,DWORD,DWORD,PBYTE*,DWORD,PDWORD,PDWORD); +NET_API_STATUS WINAPI NetUserModalsGet(LPCWSTR,DWORD,PBYTE*); +NET_API_STATUS WINAPI NetUserModalsSet(LPCWSTR,DWORD,PBYTE,PDWORD); +NET_API_STATUS WINAPI NetUserChangePassword(LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR); +NET_API_STATUS WINAPI NetGroupAdd(LPCWSTR,DWORD,PBYTE,PDWORD); +NET_API_STATUS WINAPI NetGroupAddUser(LPCWSTR,LPCWSTR,LPCWSTR); +NET_API_STATUS WINAPI NetGroupEnum(LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); +NET_API_STATUS WINAPI NetGroupGetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE*); +NET_API_STATUS WINAPI NetGroupSetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE,PDWORD); +NET_API_STATUS WINAPI NetGroupDel(LPCWSTR,LPCWSTR); +NET_API_STATUS WINAPI NetGroupDelUser(LPCWSTR,LPCWSTR,LPCWSTR); +NET_API_STATUS WINAPI NetGroupGetUsers(LPCWSTR,LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); +NET_API_STATUS WINAPI NetGroupSetUsers(LPCWSTR,LPCWSTR,DWORD,PBYTE,DWORD); +NET_API_STATUS WINAPI NetLocalGroupAdd(LPCWSTR,DWORD,PBYTE,PDWORD); +NET_API_STATUS WINAPI NetLocalGroupAddMember(LPCWSTR,LPCWSTR,PSID); +NET_API_STATUS WINAPI NetLocalGroupEnum(LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); +NET_API_STATUS WINAPI NetLocalGroupGetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE*); +NET_API_STATUS WINAPI NetLocalGroupSetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE,PDWORD); +NET_API_STATUS WINAPI NetLocalGroupDel(LPCWSTR,LPCWSTR); +NET_API_STATUS WINAPI NetLocalGroupDelMember(LPCWSTR,LPCWSTR,PSID); +NET_API_STATUS WINAPI NetLocalGroupGetMembers(LPCWSTR,LPCWSTR,DWORD,PBYTE*,DWORD, +PDWORD,PDWORD,PDWORD); +NET_API_STATUS WINAPI NetLocalGroupSetMembers(LPCWSTR,LPCWSTR,DWORD,PBYTE,DWORD); +NET_API_STATUS WINAPI NetLocalGroupAddMembers(LPCWSTR,LPCWSTR,DWORD,PBYTE,DWORD); +NET_API_STATUS WINAPI NetLocalGroupDelMembers(LPCWSTR,LPCWSTR,DWORD,PBYTE,DWORD); +NET_API_STATUS WINAPI NetQueryDisplayInformation(LPCWSTR,DWORD,DWORD,DWORD,DWORD,PDWORD,PVOID*); +NET_API_STATUS WINAPI NetGetDisplayInformationIndex(LPCWSTR,DWORD,LPCWSTR,PDWORD); +NET_API_STATUS WINAPI NetGetDCName(LPCWSTR,LPCWSTR,PBYTE*); +NET_API_STATUS WINAPI NetGetAnyDCName(LPCWSTR,LPCWSTR,PBYTE*); +NET_API_STATUS WINAPI I_NetLogonControl(LPCWSTR,DWORD,DWORD,PBYTE*); +NET_API_STATUS WINAPI I_NetLogonControl2(LPCWSTR,DWORD,DWORD,PBYTE,PBYTE*); +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/lmalert.h b/reactos/w32api/include/lmalert.h new file mode 100644 index 00000000000..4f59edc8b34 --- /dev/null +++ b/reactos/w32api/include/lmalert.h @@ -0,0 +1,60 @@ +#ifndef _LMALERT_H +#define _LMALERT_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#define ALERTER_MAILSLOT TEXT("\\\\.\\MAILSLOT\\Alerter") +#define ALERT_PRINT_EVENT TEXT("PRINTING") +#define ALERT_MESSAGE_EVENT TEXT("MESSAGE") +#define ALERT_ERRORLOG_EVENT TEXT("ERRORLOG") +#define ALERT_ADMIN_EVENT TEXT("ADMIN") +#define ALERT_USER_EVENT TEXT("USER") +#define ALERT_OTHER_INFO(x) ((PBYTE)(x)+sizeof(STD_ALERT)) +#define ALERT_VAR_DATA(p) ((PBYTE)(p)+sizeof(*p)) +#define PRJOB_QSTATUS 3 +#define PRJOB_DEVSTATUS 508 +#define PRJOB_COMPLETE 4 +#define PRJOB_INTERV 8 +#define PRJOB_ 16 +#define PRJOB_DESTOFFLINE 32 +#define PRJOB_DESTPAUSED 64 +#define PRJOB_NOTIFY 128 +#define PRJOB_DESTNOPAPER 256 +#define PRJOB_DELETED 32768 +#define PRJOB_QS_QUEUED 0 +#define PRJOB_QS_PAUSED 1 +#define PRJOB_QS_SPOOLING 2 +#define PRJOB_QS_PRINTING 3 +#ifdef __cplusplus +extern "C" { +#endif +typedef struct _ADMIN_OTHER_INFO { + DWORD alrtad_errcode; + DWORD alrtad_numstrings; +}ADMIN_OTHER_INFO,*PADMIN_OTHER_INFO,*LPADMIN_OTHER_INFO; +typedef struct _STD_ALERT { + DWORD alrt_timestamp; + TCHAR alrt_eventname[EVLEN+1]; + TCHAR alrt_servicename[SNLEN+1]; +}STD_ALERT,*PSTD_ALERT,*LPSTD_ALERT; +typedef struct _ERRLOG_OTHER_INFO { + DWORD alrter_errcode; + DWORD alrter_offset; +}ERRLOG_OTHER_INFO,*PERRLOG_OTHER_INFO,*LPERRLOG_OTHER_INFO; +typedef struct _PRINT_OTHER_INFO { + DWORD alrtpr_jobid; + DWORD alrtpr_status; + DWORD alrtpr_submitted; + DWORD alrtpr_size; +}PRINT_OTHER_INFO,*PPRINT_OTHER_INFO,*LPPRINT_OTHER_INFO; +typedef struct _USER_OTHER_INFO { + DWORD alrtus_errcode; + DWORD alrtus_numstrings; +}USER_OTHER_INFO,*PUSER_OTHER_INFO,*LPUSER_OTHER_INFO; +NET_API_STATUS WINAPI NetAlertRaise(LPCWSTR,PVOID,DWORD); +NET_API_STATUS WINAPI NetAlertRaiseEx(LPCWSTR,PVOID,DWORD,LPCWSTR); +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/lmapibuf.h b/reactos/w32api/include/lmapibuf.h new file mode 100644 index 00000000000..54de811068c --- /dev/null +++ b/reactos/w32api/include/lmapibuf.h @@ -0,0 +1,18 @@ +#ifndef _LMAPIBUF_H +#define _LMAPIBUF_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +NET_API_STATUS WINAPI NetApiBufferAllocate(DWORD,PVOID*); +NET_API_STATUS WINAPI NetApiBufferFree(PVOID); +NET_API_STATUS WINAPI NetApiBufferReallocate(PVOID,DWORD,PVOID*); +NET_API_STATUS WINAPI NetApiBufferSize(PVOID,PDWORD); +NET_API_STATUS WINAPI NetapipBufferAllocate(DWORD,PVOID*); +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/lmat.h b/reactos/w32api/include/lmat.h new file mode 100644 index 00000000000..95999a8028c --- /dev/null +++ b/reactos/w32api/include/lmat.h @@ -0,0 +1,39 @@ +#ifndef _LMAT_H +#define _LMAT_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define JOB_RUN_PERIODICALLY 1 +#define JOB_EXEC_ERROR 2 +#define JOB_RUNS_TODAY 4 +#define JOB_ADD_CURRENT_DATE 8 +#define JOB_NONINTERACTIVE 16 +#define JOB_INPUT_FLAGS (JOB_RUN_PERIODICALLY|JOB_ADD_CURRENT_DATE|JOB_NONINTERACTIVE) +#define JOB_OUTPUT_FLAGS (JOB_RUN_PERIODICALLY|JOB_EXEC_ERROR|JOB_RUNS_TODAY|JOB_NONINTERACTIVE) +typedef struct _AT_ENUM { + DWORD JobId; + DWORD JobTime; + DWORD DaysOfMonth; + UCHAR DaysOfWeek; + UCHAR Flags; + LPWSTR Command; +} AT_ENUM,*PAT_ENUM,*LPAT_ENUM; +typedef struct _AT_INFO { + DWORD JobTime; + DWORD DaysOfMonth; + UCHAR DaysOfWeek; + UCHAR Flags; + LPWSTR Command; +} AT_INFO,*PAT_INFO,*LPAT_INFO; +NET_API_STATUS WINAPI NetScheduleJobAdd(LPWSTR,PBYTE,LPDWORD); +NET_API_STATUS WINAPI NetScheduleJobDel(LPWSTR,DWORD,DWORD); +NET_API_STATUS WINAPI NetScheduleJobEnum(LPWSTR,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); +NET_API_STATUS WINAPI NetScheduleJobGetInfo(LPWSTR,DWORD,PBYTE*); +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/lmaudit.h b/reactos/w32api/include/lmaudit.h new file mode 100644 index 00000000000..4a97baaa52e --- /dev/null +++ b/reactos/w32api/include/lmaudit.h @@ -0,0 +1,250 @@ +#ifndef _LMAUDIT_H +#define _LMAUDIT_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define REVISED_AUDIT_ENTRY_STRUCT +#define LOGFLAGS_FORWARD 0 +#define LOGFLAGS_BACKWARD 1 +#define LOGFLAGS_SEEK 2 +#define ACTION_LOCKOUT 0 +#define ACTION_ADMINUNLOCK 1 +#define AE_GUEST 0 +#define AE_USER 1 +#define AE_ADMIN 2 +#define AE_NORMAL 0 +#define AE_USERLIMIT 0 +#define AE_GENERAL 0 +#define AE_ERROR 1 +#define AE_SESSDIS 1 +#define AE_BADPW 1 +#define AE_AUTODIS 2 +#define AE_UNSHARE 2 +#define AE_ADMINPRIVREQD 2 +#define AE_ADMINDIS 3 +#define AE_NOACCESSPERM 3 +#define AE_ACCRESTRICT 4 +#define AE_NORMAL_CLOSE 0 +#define AE_SES_CLOSE 1 +#define AE_ADMIN_CLOSE 2 +#define AE_LIM_UNKNOWN 0 +#define AE_LIM_LOGONHOURS 1 +#define AE_LIM_EXPIRED 2 +#define AE_LIM_INVAL_WKSTA 3 +#define AE_LIM_DISABLED 4 +#define AE_LIM_DELETED 5 +#define AE_MOD 0 +#define AE_DELETE 1 +#define AE_ADD 2 +#define AE_UAS_USER 0 +#define AE_UAS_GROUP 1 +#define AE_UAS_MODALS 2 +#define SVAUD_SERVICE 1 +#define SVAUD_GOODSESSLOGON 6 +#define SVAUD_BADSESSLOGON 24 +#define SVAUD_SESSLOGON (SVAUD_GOODSESSLOGON|SVAUD_BADSESSLOGON) +#define SVAUD_GOODNETLOGON 96 +#define SVAUD_BADNETLOGON 384 +#define SVAUD_NETLOGON (SVAUD_GOODNETLOGON|SVAUD_BADNETLOGON) +#define SVAUD_LOGON (SVAUD_NETLOGON|SVAUD_SESSLOGON) +#define SVAUD_GOODUSE 0x600 +#define SVAUD_BADUSE 0x1800 +#define SVAUD_USE (SVAUD_GOODUSE|SVAUD_BADUSE) +#define SVAUD_USERLIST 8192 +#define SVAUD_PERMISSIONS 16384 +#define SVAUD_RESOURCE 32768 +#define SVAUD_LOGONLIM 65536 +#define AA_AUDIT_ALL 1 +#define AA_A_OWNER 4 +#define AA_CLOSE 8 +#define AA_S_OPEN 16 +#define AA_S_WRITE 32 +#define AA_S_CREATE 32 +#define AA_S_DELETE 64 +#define AA_S_ACL 128 +#define AA_S_ALL 253 +#define AA_F_OPEN 256 +#define AA_F_WRITE 512 +#define AA_F_CREATE 512 +#define AA_F_DELETE 1024 +#define AA_F_ACL 2048 +#define AA_F_ALL (AA_F_OPEN|AA_F_WRITE|AA_F_DELETE|AA_F_ACL) +#define AA_A_OPEN 2048 +#define AA_A_WRITE 4096 +#define AA_A_CREATE 8192 +#define AA_A_DELETE 16384 +#define AA_A_ACL 32768 +#define AA_A_ALL (AA_F_OPEN|AA_F_WRITE|AA_F_DELETE|AA_F_ACL) +typedef struct _AUDIT_ENTRY { + DWORD ae_len; + DWORD ae_reserved; + DWORD ae_time; + DWORD ae_type; + DWORD ae_data_offset; + DWORD ae_data_size; +} AUDIT_ENTRY,*PAUDIT_ENTRY,*LPAUDIT_ENTRY; +typedef struct _HLOG { + DWORD time; + DWORD last_flags; + DWORD offset; + DWORD rec_offset; +} HLOG,*PHLOG,*LPHLOG; +typedef struct _AE_SRVSTATUS { + DWORD ae_sv_status; +} AE_SRVSTATUS,*PAE_SRVSTATUS,*LPAE_SRVSTATUS; +typedef struct _AE_SESSLOGON { + DWORD ae_so_compname; + DWORD ae_so_username; + DWORD ae_so_privilege; +} AE_SESSLOGON,*PAE_SESSLOGON,*LPAE_SESSLOGON; +typedef struct _AE_SESSLOGOFF { + DWORD ae_sf_compname; + DWORD ae_sf_username; + DWORD ae_sf_reason; +} AE_SESSLOGOFF,*PAE_SESSLOGOFF,*LPAE_SESSLOGOFF; +typedef struct _AE_SESSPWERR { + DWORD ae_sp_compname; + DWORD ae_sp_username; +} AE_SESSPWERR,*PAE_SESSPWERR,*LPAE_SESSPWERR; +typedef struct _AE_CONNSTART { + DWORD ae_ct_compname; + DWORD ae_ct_username; + DWORD ae_ct_netname; + DWORD ae_ct_connid; +} AE_CONNSTART,*PAE_CONNSTART,*LPAE_CONNSTART; +typedef struct _AE_CONNSTOP { + DWORD ae_cp_compname; + DWORD ae_cp_username; + DWORD ae_cp_netname; + DWORD ae_cp_connid; + DWORD ae_cp_reason; +} AE_CONNSTOP,*PAE_CONNSTOP,*LPAE_CONNSTOP; +typedef struct _AE_CONNREJ { + DWORD ae_cr_compname; + DWORD ae_cr_username; + DWORD ae_cr_netname; + DWORD ae_cr_reason; +} AE_CONNREJ,*PAE_CONNREJ,*LPAE_CONNREJ; +typedef struct _AE_RESACCESS { + DWORD ae_ra_compname; + DWORD ae_ra_username; + DWORD ae_ra_resname; + DWORD ae_ra_operation; + DWORD ae_ra_returncode; + DWORD ae_ra_restype; + DWORD ae_ra_fileid; +} AE_RESACCESS,*PAE_RESACCESS,*LPAE_RESACCESS; +typedef struct _AE_RESACCESSREJ { + DWORD ae_rr_compname; + DWORD ae_rr_username; + DWORD ae_rr_resname; + DWORD ae_rr_operation; +} AE_RESACCESSREJ,*PAE_RESACCESSREJ,*LPAE_RESACCESSREJ; +typedef struct _AE_CLOSEFILE { + DWORD ae_cf_compname; + DWORD ae_cf_username; + DWORD ae_cf_resname; + DWORD ae_cf_fileid; + DWORD ae_cf_duration; + DWORD ae_cf_reason; +} AE_CLOSEFILE,*PAE_CLOSEFILE,*LPAE_CLOSEFILE; +typedef struct _AE_SERVICESTAT { + DWORD ae_ss_compname; + DWORD ae_ss_username; + DWORD ae_ss_svcname; + DWORD ae_ss_status; + DWORD ae_ss_code; + DWORD ae_ss_text; + DWORD ae_ss_returnval; +} AE_SERVICESTAT,*PAE_SERVICESTAT,*LPAE_SERVICESTAT; +typedef struct _AE_ACLMOD { + DWORD ae_am_compname; + DWORD ae_am_username; + DWORD ae_am_resname; + DWORD ae_am_action; + DWORD ae_am_datalen; +} AE_ACLMOD,*PAE_ACLMOD,*LPAE_ACLMOD; +typedef struct _AE_UASMOD { + DWORD ae_um_compname; + DWORD ae_um_username; + DWORD ae_um_resname; + DWORD ae_um_rectype; + DWORD ae_um_action; + DWORD ae_um_datalen; +} AE_UASMOD,*PAE_UASMOD,*LPAE_UASMOD; +typedef struct _AE_NETLOGON { + DWORD ae_no_compname; + DWORD ae_no_username; + DWORD ae_no_privilege; + DWORD ae_no_authflags; +} AE_NETLOGON,*PAE_NETLOGON,*LPAE_NETLOGON; +typedef struct _AE_NETLOGOFF { + DWORD ae_nf_compname; + DWORD ae_nf_username; + DWORD ae_nf_reserved1; + DWORD ae_nf_reserved2; +} AE_NETLOGOFF,*PAE_NETLOGOFF,*LPAE_NETLOGOFF; +typedef struct _AE_ACCLIM { + DWORD ae_al_compname; + DWORD ae_al_username; + DWORD ae_al_resname; + DWORD ae_al_limit; +} AE_ACCLIM,*PAE_ACCLIM,*LPAE_ACCLIM; +typedef struct _AE_LOCKOUT { + DWORD ae_lk_compname; + DWORD ae_lk_username; + DWORD ae_lk_action; + DWORD ae_lk_bad_pw_count; +} AE_LOCKOUT,*PAE_LOCKOUT,*LPAE_LOCKOUT; +typedef struct _AE_GENERIC { + DWORD ae_ge_msgfile; + DWORD ae_ge_msgnum; + DWORD ae_ge_params; + DWORD ae_ge_param1; + DWORD ae_ge_param2; + DWORD ae_ge_param3; + DWORD ae_ge_param4; + DWORD ae_ge_param5; + DWORD ae_ge_param6; + DWORD ae_ge_param7; + DWORD ae_ge_param8; + DWORD ae_ge_param9; +} AE_GENERIC,*PAE_GENERIC,*LPAE_GENERIC; +NET_API_STATUS WINAPI NetAuditClear(LPCWSTR,LPCWSTR,LPCWSTR); +NET_API_STATUS WINAPI NetAuditRead(LPTSTR,LPTSTR,LPHLOG,DWORD,PDWORD,DWORD,DWORD,PBYTE*,DWORD,PDWORD,PDWORD); +NET_API_STATUS WINAPI NetAuditWrite(DWORD,PBYTE,DWORD,LPTSTR,PBYTE); + +/* These conflict with struct typedefs, why? */ +#define AE_SRVSTATUS 0 +#define AE_SESSLOGON 1 +#define AE_SESSLOGOFF 2 +#define AE_SESSPWERR 3 +#define AE_CONNSTART 4 +#define AE_CONNSTOP 5 +#define AE_CONNREJ 6 +#define AE_RESACCESS 7 +#define AE_RESACCESSREJ 8 +#define AE_CLOSEFILE 9 +#define AE_SERVICESTAT 11 +#define AE_ACLMOD 12 +#define AE_UASMOD 13 +#define AE_NETLOGON 14 +#define AE_NETLOGOFF 15 +#define AE_NETLOGDENIED 16 +#define AE_ACCLIMITEXCD 17 +#define AE_RESACCESS2 18 +#define AE_ACLMODFAIL 19 +#define AE_LOCKOUT 20 +#define AE_GENERIC_TYPE 21 +#define AE_SRVSTART 0 +#define AE_SRVPAUSED 1 +#define AE_SRVCONT 2 +#define AE_SRVSTOP 3 +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/lmbrowsr.h b/reactos/w32api/include/lmbrowsr.h new file mode 100644 index 00000000000..4aee4646cd9 --- /dev/null +++ b/reactos/w32api/include/lmbrowsr.h @@ -0,0 +1,74 @@ +#ifndef _LMBROWSR_H +#define _LMBROWSR_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define BROWSER_ROLE_PDC 1 +#define BROWSER_ROLE_BDC 2 +typedef struct _BROWSER_STATISTICS { + LARGE_INTEGER StatisticsStartTime; + LARGE_INTEGER NumberOfServerAnnouncements; + LARGE_INTEGER NumberOfDomainAnnouncements; + ULONG NumberOfElectionPackets; + ULONG NumberOfMailslotWrites; + ULONG NumberOfGetBrowserServerListRequests; + ULONG NumberOfServerEnumerations; + ULONG NumberOfDomainEnumerations; + ULONG NumberOfOtherEnumerations; + ULONG NumberOfMissedServerAnnouncements; + ULONG NumberOfMissedMailslotDatagrams; + ULONG NumberOfMissedGetBrowserServerListRequests; + ULONG NumberOfFailedServerAnnounceAllocations; + ULONG NumberOfFailedMailslotAllocations; + ULONG NumberOfFailedMailslotReceives; + ULONG NumberOfFailedMailslotWrites; + ULONG NumberOfFailedMailslotOpens; + ULONG NumberOfDuplicateMasterAnnouncements; +LARGE_INTEGER NumberOfIllegalDatagrams; +} BROWSER_STATISTICS,*PBROWSER_STATISTICS,*LPBROWSER_STATISTICS; +typedef struct _BROWSER_STATISTICS_100 { + LARGE_INTEGER StartTime; + LARGE_INTEGER NumberOfServerAnnouncements; + LARGE_INTEGER NumberOfDomainAnnouncements; + ULONG NumberOfElectionPackets; + ULONG NumberOfMailslotWrites; + ULONG NumberOfGetBrowserServerListRequests; + LARGE_INTEGER NumberOfIllegalDatagrams; +} BROWSER_STATISTICS_100,*PBROWSER_STATISTICS_100; +typedef struct _BROWSER_STATISTICS_101 { + LARGE_INTEGER StartTime; + LARGE_INTEGER NumberOfServerAnnouncements; + LARGE_INTEGER NumberOfDomainAnnouncements; + ULONG NumberOfElectionPackets; + ULONG NumberOfMailslotWrites; + ULONG NumberOfGetBrowserServerListRequests; + LARGE_INTEGER NumberOfIllegalDatagrams; + ULONG NumberOfMissedServerAnnouncements; + ULONG NumberOfMissedMailslotDatagrams; + ULONG NumberOfMissedGetBrowserServerListRequests; + ULONG NumberOfFailedServerAnnounceAllocations; + ULONG NumberOfFailedMailslotAllocations; + ULONG NumberOfFailedMailslotReceives; + ULONG NumberOfFailedMailslotWrites; + ULONG NumberOfFailedMailslotOpens; + ULONG NumberOfDuplicateMasterAnnouncements; +} BROWSER_STATISTICS_101,*PBROWSER_STATISTICS_101; + +NET_API_STATUS WINAPI I_BrowserServerEnum(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,DWORD,LPCWSTR,PDWORD); +NET_API_STATUS WINAPI I_BrowserServerEnumEx(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,DWORD,LPCWSTR,LPCWSTR); +NET_API_STATUS I_BrowserQueryEmulatedDomains(LPWSTR,PBYTE*,PDWORD); +NET_API_STATUS I_BrowserQueryOtherDomains(LPCWSTR,PBYTE*,PDWORD,PDWORD); +NET_API_STATUS I_BrowserResetNetlogonState(LPCWSTR); +NET_API_STATUS I_BrowserSetNetlogonState(LPWSTR,LPWSTR,LPWSTR,DWORD); +NET_API_STATUS I_BrowserQueryStatistics(LPCWSTR,LPBROWSER_STATISTICS*); +NET_API_STATUS I_BrowserResetStatistics(LPCWSTR); +WORD I_BrowserServerEnumForXactsrv(LPCWSTR,LPCWSTR,ULONG,USHORT,PVOID,WORD,DWORD,PDWORD,PDWORD,DWORD,LPCWSTR,LPCWSTR,PWORD); +NET_API_STATUS I_BrowserDebugTrace(PWCHAR,PCHAR); +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/lmchdev.h b/reactos/w32api/include/lmchdev.h new file mode 100644 index 00000000000..3a4096881e8 --- /dev/null +++ b/reactos/w32api/include/lmchdev.h @@ -0,0 +1,61 @@ +#ifndef _LMCHDEV_H +#define _LMCHDEV_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define CHARDEVQ_NO_REQUESTS (-1) +#define CHARDEV_CLOSE 0 +#define CHARDEVQ_MAX_PRIORITY 1 +#define CHARDEVQ_DEV_PARMNUM 1 +#define HANDLE_INFO_LEVEL_1 1 +#define HANDLE_CHARTIME_PARMNUM 1 +#define HANDLE_CHARCOUNT_PARMNUM 2 +#define CHARDEV_STAT_OPENED 2 +#define CHARDEVQ_PRIORITY_PARMNUM 2 +#define CHARDEVQ_DEVS_PARMNUM 3 +#define CHARDEV_STAT_ERROR 4 +#define CHARDEVQ_NUMUSERS_PARMNUM 4 +#define CHARDEVQ_NUMAHEAD_PARMNUM 5 +#define CHARDEVQ_DEF_PRIORITY 5 +#define CHARDEVQ_PRIORITY_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+CHARDEVQ_PRIORITY_PARMNUM) +#define CHARDEVQ_DEVS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+CHARDEVQ_DEVS_PARMNUM) +#define CHARDEVQ_MIN_PRIORITY 9 +typedef struct _CHARDEV_INFO_0 { LPWSTR ch0_dev; } CHARDEV_INFO_0,*PCHARDEV_INFO_0,*LPCHARDEV_INFO_0; +typedef struct _CHARDEV_INFO_1 { + LPWSTR ch1_dev; + DWORD ch1_status; + LPWSTR ch1_username; + DWORD ch1_time; +} CHARDEV_INFO_1,*PCHARDEV_INFO_1,*LPCHARDEV_INFO_1; +typedef struct _CHARDEVQ_INFO_0 { LPWSTR cq0_dev; } CHARDEVQ_INFO_0,*PCHARDEVQ_INFO_0,*LPCHARDEVQ_INFO_0; +typedef struct _CHARDEVQ_INFO_1 { + LPWSTR cq1_dev; + DWORD cq1_priority; + LPWSTR cq1_devs; + DWORD cq1_numusers; + DWORD cq1_numahead; +} CHARDEVQ_INFO_1,*PCHARDEVQ_INFO_1,*LPCHARDEVQ_INFO_1; +typedef struct _CHARDEVQ_INFO_1002 { DWORD cq1002_priority; } CHARDEVQ_INFO_1002,*PCHARDEVQ_INFO_1002,*LPCHARDEVQ_INFO_1002; +typedef struct _CHARDEVQ_INFO_1003 { LPWSTR cq1003_devs; } CHARDEVQ_INFO_1003,*PCHARDEVQ_INFO_1003,*LPCHARDEVQ_INFO_1003; +typedef struct _HANDLE_INFO_1 { + DWORD hdli1_chartime; + DWORD hdli1_charcount; +}HANDLE_INFO_1,*PHANDLE_INFO_1,*LPHANDLE_INFO_1; +NET_API_STATUS WINAPI NetCharDevEnum(LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); +NET_API_STATUS WINAPI NetCharDevGetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE*); +NET_API_STATUS WINAPI NetCharDevControl(LPCWSTR,LPCWSTR,DWORD); +NET_API_STATUS WINAPI NetCharDevQEnum(LPCWSTR,LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); +NET_API_STATUS WINAPI NetCharDevQGetInfo(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,PBYTE*); +NET_API_STATUS WINAPI NetCharDevQSetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE,PDWORD); +NET_API_STATUS WINAPI NetCharDevQPurge(LPCWSTR,LPCWSTR); +NET_API_STATUS WINAPI NetCharDevQPurgeSelf(LPCWSTR,LPCWSTR,LPCWSTR); +NET_API_STATUS WINAPI NetHandleGetInfo(HANDLE,DWORD,PBYTE*); +NET_API_STATUS WINAPI NetHandleSetInfo(HANDLE,DWORD,PBYTE,DWORD,PDWORD); +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/lmconfig.h b/reactos/w32api/include/lmconfig.h new file mode 100644 index 00000000000..b75c6ab9cb3 --- /dev/null +++ b/reactos/w32api/include/lmconfig.h @@ -0,0 +1,21 @@ +#ifndef _LMCONFIG_H +#define _LMCONFIG_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define REVISED_CONFIG_APIS +typedef struct _CONFIG_INFO_0 { + LPWSTR cfgi0_key; + LPWSTR cfgi0_data; +} CONFIG_INFO_0,*PCONFIG_INFO_0,*LPCONFIG_INFO_0; +NET_API_STATUS WINAPI NetConfigGet(LPCWSTR,LPCWSTR,LPCWSTR,PBYTE*); +NET_API_STATUS WINAPI NetConfigGetAll(LPCWSTR,LPCWSTR,PBYTE*); +NET_API_STATUS WINAPI NetConfigSet(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,DWORD,PBYTE,DWORD); +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/lmcons.h b/reactos/w32api/include/lmcons.h new file mode 100644 index 00000000000..27566b3654f --- /dev/null +++ b/reactos/w32api/include/lmcons.h @@ -0,0 +1,75 @@ +#ifndef _LMCONS_H +#define _LMCONS_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#define MESSAGE_FILENAME TEXT("NETMSG") +#define OS2MSG_FILENAME TEXT("BASE") +#define HELP_MSG_FILENAME TEXT("NETH") +#define NET_API_FUNCTION __stdcall +#define NET_API_STATUS DWORD +#define API_RET_TYPE NET_API_STATUS +#define MIN_LANMAN_MESSAGE_ID NERR_BASE +#define MAX_LANMAN_MESSAGE_ID 5799 +#ifndef CNLEN /* also in nddeapi.h */ +#define CNLEN 15 +#define UNCLEN (CNLEN + 2) +#endif +#define DNLEN 15 +#define LM20_CNLEN 15 +#define LM20_DNLEN 15 +#define LM20_SNLEN 15 +#define LM20_STXTLEN 63 +#define LM20_UNCLEN (LM20_CNLEN+2) +#define LM20_NNLEN 12 +#define LM20_RMLEN (LM20_UNCLEN+1+LM20_NNLEN) +#define NNLEN 80 +#define RMLEN (UNCLEN+1+NNLEN) +#define SNLEN 80 +#define STXTLEN 256 +#define PATHLEN 256 +#define LM20_PATHLEN 256 +#define DEVLEN 80 +#define LM20_DEVLEN 8 +#define EVLEN 16 +#define UNLEN 256 +#define LM20_UNLEN 20 +#define GNLEN UNLEN +#define LM20_GNLEN LM20_UNLEN +#define PWLEN 256 +#define LM20_PWLEN 14 +#define SHPWLEN 8 +#define CLTYPE_LEN 12 +#define MAXCOMMENTSZ 256 +#define LM20_MAXCOMMENTSZ 48 +#define QNLEN NNLEN +#define LM20_QNLEN LM20_NNLEN +#define ALERTSZ 128 +#define MAXDEVENTRIES (sizeof(int)*8) +#define NETBIOS_NAME_LEN 16 +#define MAX_PREFERRED_LENGTH ((DWORD)-1) +#define CRYPT_KEY_LEN 7 +#define CRYPT_TXT_LEN 8 +#define ENCRYPTED_PWLEN 16 +#define SESSION_PWLEN 24 +#define SESSION_CRYPT_KLEN 21 +#define PARMNUM_ALL 0 +#define PARM_ERROR_UNKNOWN ((DWORD)-1) +#define PARM_ERROR_NONE 0 +#define PARMNUM_BASE_INFOLEVEL 1000 +#define PLATFORM_ID_DOS 300 +#define PLATFORM_ID_OS2 400 +#define PLATFORM_ID_NT 500 +#define PLATFORM_ID_OSF 600 +#define PLATFORM_ID_VMS 700 +/* new typedef in W2K */ +#if defined( _WIN32_WINNT ) || defined( WINNT ) || defined( FORCE_UNICODE ) +#define LMSTR LPWSTR +#define LMCSTR LPCWSTR +#else +#define LMSTR LPSTR +#define LMCSTR LPCSTR +#endif + +#endif diff --git a/reactos/w32api/include/lmerr.h b/reactos/w32api/include/lmerr.h new file mode 100644 index 00000000000..58b1484920c --- /dev/null +++ b/reactos/w32api/include/lmerr.h @@ -0,0 +1,306 @@ +#ifndef _LMERR_H +#define _LMERR_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#include <winerror.h> +#define NERR_Success 0 +#define NERR_BASE 2100 +#define NERR_NetNotStarted (NERR_BASE+2) +#define NERR_UnknownServer (NERR_BASE+3) +#define NERR_ShareMem (NERR_BASE+4) +#define NERR_NoNetworkResource (NERR_BASE+5) +#define NERR_RemoteOnly (NERR_BASE+6) +#define NERR_DevNotRedirected (NERR_BASE+7) +#define NERR_ServerNotStarted (NERR_BASE+14) +#define NERR_ItemNotFound (NERR_BASE+15) +#define NERR_UnknownDevDir (NERR_BASE+16) +#define NERR_RedirectedPath (NERR_BASE+17) +#define NERR_DuplicateShare (NERR_BASE+18) +#define NERR_NoRoom (NERR_BASE+19) +#define NERR_TooManyItems (NERR_BASE+21) +#define NERR_InvalidMaxUsers (NERR_BASE+22) +#define NERR_BufTooSmall (NERR_BASE+23) +#define NERR_RemoteErr (NERR_BASE+27) +#define NERR_LanmanIniError (NERR_BASE+31) +#define NERR_NetworkError (NERR_BASE+36) +#define NERR_WkstaInconsistentState (NERR_BASE+37) +#define NERR_WkstaNotStarted (NERR_BASE+38) +#define NERR_BrowserNotStarted (NERR_BASE+39) +#define NERR_InternalError (NERR_BASE+40) +#define NERR_BadTransactConfig (NERR_BASE+41) +#define NERR_InvalidAPI (NERR_BASE+42) +#define NERR_BadEventName (NERR_BASE+43) +#define NERR_DupNameReboot (NERR_BASE+44) +#define NERR_CfgCompNotFound (NERR_BASE+46) +#define NERR_CfgParamNotFound (NERR_BASE+47) +#define NERR_LineTooLong (NERR_BASE+49) +#define NERR_QNotFound (NERR_BASE+50) +#define NERR_JobNotFound (NERR_BASE+51) +#define NERR_DestNotFound (NERR_BASE+52) +#define NERR_DestExists (NERR_BASE+53) +#define NERR_QExists (NERR_BASE+54) +#define NERR_QNoRoom (NERR_BASE+55) +#define NERR_JobNoRoom (NERR_BASE+56) +#define NERR_DestNoRoom (NERR_BASE+57) +#define NERR_DestIdle (NERR_BASE+58) +#define NERR_DestInvalidOp (NERR_BASE+59) +#define NERR_ProcNoRespond (NERR_BASE+60) +#define NERR_SpoolerNotLoaded (NERR_BASE+61) +#define NERR_DestInvalidState (NERR_BASE+62) +#define NERR_QInvalidState (NERR_BASE+63) +#define NERR_JobInvalidState (NERR_BASE+64) +#define NERR_SpoolNoMemory (NERR_BASE+65) +#define NERR_DriverNotFound (NERR_BASE+66) +#define NERR_DataTypeInvalid (NERR_BASE+67) +#define NERR_ProcNotFound (NERR_BASE+68) +#define NERR_ServiceTableLocked (NERR_BASE+80) +#define NERR_ServiceTableFull (NERR_BASE+81) +#define NERR_ServiceInstalled (NERR_BASE+82) +#define NERR_ServiceEntryLocked (NERR_BASE+83) +#define NERR_ServiceNotInstalled (NERR_BASE+84) +#define NERR_BadServiceName (NERR_BASE+85) +#define NERR_ServiceCtlTimeout (NERR_BASE+86) +#define NERR_ServiceCtlBusy (NERR_BASE+87) +#define NERR_BadServiceProgName (NERR_BASE+88) +#define NERR_ServiceNotCtrl (NERR_BASE+89) +#define NERR_ServiceKillProc (NERR_BASE+90) +#define NERR_ServiceCtlNotValid (NERR_BASE+91) +#define NERR_NotInDispatchTbl (NERR_BASE+92) +#define NERR_BadControlRecv (NERR_BASE+93) +#define NERR_ServiceNotStarting (NERR_BASE+94) +#define NERR_AlreadyLoggedOn (NERR_BASE+100) +#define NERR_NotLoggedOn (NERR_BASE+101) +#define NERR_BadUsername (NERR_BASE+102) +#define NERR_BadPassword (NERR_BASE+103) +#define NERR_UnableToAddName_W (NERR_BASE+104) +#define NERR_UnableToAddName_F (NERR_BASE+105) +#define NERR_UnableToDelName_W (NERR_BASE+106) +#define NERR_UnableToDelName_F (NERR_BASE+107) +#define NERR_LogonsPaused (NERR_BASE+109) +#define NERR_LogonServerConflict (NERR_BASE+110) +#define NERR_LogonNoUserPath (NERR_BASE+111) +#define NERR_LogonScriptError (NERR_BASE+112) +#define NERR_StandaloneLogon (NERR_BASE+114) +#define NERR_LogonServerNotFound (NERR_BASE+115) +#define NERR_LogonDomainExists (NERR_BASE+116) +#define NERR_NonValidatedLogon (NERR_BASE+117) +#define NERR_ACFNotFound (NERR_BASE+119) +#define NERR_GroupNotFound (NERR_BASE+120) +#define NERR_UserNotFound (NERR_BASE+121) +#define NERR_ResourceNotFound (NERR_BASE+122) +#define NERR_GroupExists (NERR_BASE+123) +#define NERR_UserExists (NERR_BASE+124) +#define NERR_ResourceExists (NERR_BASE+125) +#define NERR_NotPrimary (NERR_BASE+126) +#define NERR_ACFNotLoaded (NERR_BASE+127) +#define NERR_ACFNoRoom (NERR_BASE+128) +#define NERR_ACFFileIOFail (NERR_BASE+129) +#define NERR_ACFTooManyLists (NERR_BASE+130) +#define NERR_UserLogon (NERR_BASE+131) +#define NERR_ACFNoParent (NERR_BASE+132) +#define NERR_CanNotGrowSegment (NERR_BASE+133) +#define NERR_SpeGroupOp (NERR_BASE+134) +#define NERR_NotInCache (NERR_BASE+135) +#define NERR_UserInGroup (NERR_BASE+136) +#define NERR_UserNotInGroup (NERR_BASE+137) +#define NERR_AccountUndefined (NERR_BASE+138) +#define NERR_AccountExpired (NERR_BASE+139) +#define NERR_InvalidWorkstation (NERR_BASE+140) +#define NERR_InvalidLogonHours (NERR_BASE+141) +#define NERR_PasswordExpired (NERR_BASE+142) +#define NERR_PasswordCantChange (NERR_BASE+143) +#define NERR_PasswordHistConflict (NERR_BASE+144) +#define NERR_PasswordTooShort (NERR_BASE+145) +#define NERR_PasswordTooRecent (NERR_BASE+146) +#define NERR_InvalidDatabase (NERR_BASE+147) +#define NERR_DatabaseUpToDate (NERR_BASE+148) +#define NERR_SyncRequired (NERR_BASE+149) +#define NERR_UseNotFound (NERR_BASE+150) +#define NERR_BadAsgType (NERR_BASE+151) +#define NERR_DeviceIsShared (NERR_BASE+152) +#define NERR_NoComputerName (NERR_BASE+170) +#define NERR_MsgAlreadyStarted (NERR_BASE+171) +#define NERR_MsgInitFailed (NERR_BASE+172) +#define NERR_NameNotFound (NERR_BASE+173) +#define NERR_AlreadyForwarded (NERR_BASE+174) +#define NERR_AddForwarded (NERR_BASE+175) +#define NERR_AlreadyExists (NERR_BASE+176) +#define NERR_TooManyNames (NERR_BASE+177) +#define NERR_DelComputerName (NERR_BASE+178) +#define NERR_LocalForward (NERR_BASE+179) +#define NERR_GrpMsgProcessor (NERR_BASE+180) +#define NERR_PausedRemote (NERR_BASE+181) +#define NERR_BadReceive (NERR_BASE+182) +#define NERR_NameInUse (NERR_BASE+183) +#define NERR_MsgNotStarted (NERR_BASE+184) +#define NERR_NotLocalName (NERR_BASE+185) +#define NERR_NoForwardName (NERR_BASE+186) +#define NERR_RemoteFull (NERR_BASE+187) +#define NERR_NameNotForwarded (NERR_BASE+188) +#define NERR_TruncatedBroadcast (NERR_BASE+189) +#define NERR_InvalidDevice (NERR_BASE+194) +#define NERR_WriteFault (NERR_BASE+195) +#define NERR_DuplicateName (NERR_BASE+197) +#define NERR_DeleteLater (NERR_BASE+198) +#define NERR_IncompleteDel (NERR_BASE+199) +#define NERR_MultipleNets (NERR_BASE+200) +#define NERR_NetNameNotFound (NERR_BASE+210) +#define NERR_DeviceNotShared (NERR_BASE+211) +#define NERR_ClientNameNotFound (NERR_BASE+212) +#define NERR_FileIdNotFound (NERR_BASE+214) +#define NERR_ExecFailure (NERR_BASE+215) +#define NERR_TmpFile (NERR_BASE+216) +#define NERR_TooMuchData (NERR_BASE+217) +#define NERR_DeviceShareConflict (NERR_BASE+218) +#define NERR_BrowserTableIncomplete (NERR_BASE+219) +#define NERR_NotLocalDomain (NERR_BASE+220) +#define NERR_DevInvalidOpCode (NERR_BASE+231) +#define NERR_DevNotFound (NERR_BASE+232) +#define NERR_DevNotOpen (NERR_BASE+233) +#define NERR_BadQueueDevString (NERR_BASE+234) +#define NERR_BadQueuePriority (NERR_BASE+235) +#define NERR_NoCommDevs (NERR_BASE+237) +#define NERR_QueueNotFound (NERR_BASE+238) +#define NERR_BadDevString (NERR_BASE+240) +#define NERR_BadDev (NERR_BASE+241) +#define NERR_InUseBySpooler (NERR_BASE+242) +#define NERR_CommDevInUse (NERR_BASE+243) +#define NERR_InvalidComputer (NERR_BASE+251) +#define NERR_MaxLenExceeded (NERR_BASE+254) +#define NERR_BadComponent (NERR_BASE+256) +#define NERR_CantType (NERR_BASE+257) +#define NERR_TooManyEntries (NERR_BASE+262) +#define NERR_ProfileFileTooBig (NERR_BASE+270) +#define NERR_ProfileOffset (NERR_BASE+271) +#define NERR_ProfileCleanup (NERR_BASE+272) +#define NERR_ProfileUnknownCmd (NERR_BASE+273) +#define NERR_ProfileLoadErr (NERR_BASE+274) +#define NERR_ProfileSaveErr (NERR_BASE+275) +#define NERR_LogOverflow (NERR_BASE+277) +#define NERR_LogFileChanged (NERR_BASE+278) +#define NERR_LogFileCorrupt (NERR_BASE+279) +#define NERR_SourceIsDir (NERR_BASE+280) +#define NERR_BadSource (NERR_BASE+281) +#define NERR_BadDest (NERR_BASE+282) +#define NERR_DifferentServers (NERR_BASE+283) +#define NERR_RunSrvPaused (NERR_BASE+285) +#define NERR_ErrCommRunSrv (NERR_BASE+289) +#define NERR_ErrorExecingGhost (NERR_BASE+291) +#define NERR_ShareNotFound (NERR_BASE+292) +#define NERR_InvalidLana (NERR_BASE+300) +#define NERR_OpenFiles (NERR_BASE+301) +#define NERR_ActiveConns (NERR_BASE+302) +#define NERR_BadPasswordCore (NERR_BASE+303) +#define NERR_DevInUse (NERR_BASE+304) +#define NERR_LocalDrive (NERR_BASE+305) +#define NERR_AlertExists (NERR_BASE+330) +#define NERR_TooManyAlerts (NERR_BASE+331) +#define NERR_NoSuchAlert (NERR_BASE+332) +#define NERR_BadRecipient (NERR_BASE+333) +#define NERR_AcctLimitExceeded (NERR_BASE+334) +#define NERR_InvalidLogSeek (NERR_BASE+340) +#define NERR_BadUasConfig (NERR_BASE+350) +#define NERR_InvalidUASOp (NERR_BASE+351) +#define NERR_LastAdmin (NERR_BASE+352) +#define NERR_DCNotFound (NERR_BASE+353) +#define NERR_LogonTrackingError (NERR_BASE+354) +#define NERR_NetlogonNotStarted (NERR_BASE+355) +#define NERR_CanNotGrowUASFile (NERR_BASE+356) +#define NERR_TimeDiffAtDC (NERR_BASE+357) +#define NERR_PasswordMismatch (NERR_BASE+358) +#define NERR_NoSuchServer (NERR_BASE+360) +#define NERR_NoSuchSession (NERR_BASE+361) +#define NERR_NoSuchConnection (NERR_BASE+362) +#define NERR_TooManyServers (NERR_BASE+363) +#define NERR_TooManySessions (NERR_BASE+364) +#define NERR_TooManyConnections (NERR_BASE+365) +#define NERR_TooManyFiles (NERR_BASE+366) +#define NERR_NoAlternateServers (NERR_BASE+367) +#define NERR_TryDownLevel (NERR_BASE+370) +#define NERR_UPSDriverNotStarted (NERR_BASE+380) +#define NERR_UPSInvalidConfig (NERR_BASE+381) +#define NERR_UPSInvalidCommPort (NERR_BASE+382) +#define NERR_UPSSignalAsserted (NERR_BASE+383) +#define NERR_UPSShutdownFailed (NERR_BASE+384) +#define NERR_BadDosRetCode (NERR_BASE+400) +#define NERR_ProgNeedsExtraMem (NERR_BASE+401) +#define NERR_BadDosFunction (NERR_BASE+402) +#define NERR_RemoteBootFailed (NERR_BASE+403) +#define NERR_BadFileCheckSum (NERR_BASE+404) +#define NERR_NoRplBootSystem (NERR_BASE+405) +#define NERR_RplLoadrNetBiosErr (NERR_BASE+406) +#define NERR_RplLoadrDiskErr (NERR_BASE+407) +#define NERR_ImageParamErr (NERR_BASE+408) +#define NERR_TooManyImageParams (NERR_BASE+409) +#define NERR_NonDosFloppyUsed (NERR_BASE+410) +#define NERR_RplBootRestart (NERR_BASE+411) +#define NERR_RplSrvrCallFailed (NERR_BASE+412) +#define NERR_CantConnectRplSrvr (NERR_BASE+413) +#define NERR_CantOpenImageFile (NERR_BASE+414) +#define NERR_CallingRplSrvr (NERR_BASE+415) +#define NERR_StartingRplBoot (NERR_BASE+416) +#define NERR_RplBootServiceTerm (NERR_BASE+417) +#define NERR_RplBootStartFailed (NERR_BASE+418) +#define NERR_RPL_CONNECTED (NERR_BASE+419) +#define NERR_BrowserConfiguredToNotRun (NERR_BASE+450) +#define NERR_RplNoAdaptersStarted (NERR_BASE+510) +#define NERR_RplBadRegistry (NERR_BASE+511) +#define NERR_RplBadDatabase (NERR_BASE+512) +#define NERR_RplRplfilesShare (NERR_BASE+513) +#define NERR_RplNotRplServer (NERR_BASE+514) +#define NERR_RplCannotEnum (NERR_BASE+515) +#define NERR_RplWkstaInfoCorrupted (NERR_BASE+516) +#define NERR_RplWkstaNotFound (NERR_BASE+517) +#define NERR_RplWkstaNameUnavailable (NERR_BASE+518) +#define NERR_RplProfileInfoCorrupted (NERR_BASE+519) +#define NERR_RplProfileNotFound (NERR_BASE+520) +#define NERR_RplProfileNameUnavailable (NERR_BASE+521) +#define NERR_RplProfileNotEmpty (NERR_BASE+522) +#define NERR_RplConfigInfoCorrupted (NERR_BASE+523) +#define NERR_RplConfigNotFound (NERR_BASE+524) +#define NERR_RplAdapterInfoCorrupted (NERR_BASE+525) +#define NERR_RplInternal (NERR_BASE+526) +#define NERR_RplVendorInfoCorrupted (NERR_BASE+527) +#define NERR_RplBootInfoCorrupted (NERR_BASE+528) +#define NERR_RplWkstaNeedsUserAcct (NERR_BASE+529) +#define NERR_RplNeedsRPLUSERAcct (NERR_BASE+530) +#define NERR_RplBootNotFound (NERR_BASE+531) +#define NERR_RplIncompatibleProfile (NERR_BASE+532) +#define NERR_RplAdapterNameUnavailable (NERR_BASE+533) +#define NERR_RplConfigNotEmpty (NERR_BASE+534) +#define NERR_RplBootInUse (NERR_BASE+535) +#define NERR_RplBackupDatabase (NERR_BASE+536) +#define NERR_RplAdapterNotFound (NERR_BASE+537) +#define NERR_RplVendorNotFound (NERR_BASE+538) +#define NERR_RplVendorNameUnavailable (NERR_BASE+539) +#define NERR_RplBootNameUnavailable (NERR_BASE+540) +#define NERR_RplConfigNameUnavailable (NERR_BASE+541) +#define NERR_DfsInternalCorruption (NERR_BASE+560) +#define NERR_DfsVolumeDataCorrupt (NERR_BASE+561) +#define NERR_DfsNoSuchVolume (NERR_BASE+562) +#define NERR_DfsVolumeAlreadyExists (NERR_BASE+563) +#define NERR_DfsAlreadyShared (NERR_BASE+564) +#define NERR_DfsNoSuchShare (NERR_BASE+565) +#define NERR_DfsNotALeafVolume (NERR_BASE+566) +#define NERR_DfsLeafVolume (NERR_BASE+567) +#define NERR_DfsVolumeHasMultipleServers (NERR_BASE+568) +#define NERR_DfsCantCreateJunctionPoint (NERR_BASE+569) +#define NERR_DfsServerNotDfsAware (NERR_BASE+570) +#define NERR_DfsBadRenamePath (NERR_BASE+571) +#define NERR_DfsVolumeIsOffline (NERR_BASE+572) +#define NERR_DfsNoSuchServer (NERR_BASE+573) +#define NERR_DfsCyclicalName (NERR_BASE+574) +#define NERR_DfsNotSupportedInServerDfs (NERR_BASE+575) +#define NERR_DfsDuplicateService (NERR_BASE+576) +#define NERR_DfsCantRemoveLastServerShare (NERR_BASE+577) +#define NERR_DfsVolumeIsInterDfs (NERR_BASE+578) +#define NERR_DfsInconsistent (NERR_BASE+579) +#define NERR_DfsServerUpgraded (NERR_BASE+580) +#define NERR_DfsDataIsIdentical (NERR_BASE+581) +#define NERR_DfsCantRemoveDfsRoot (NERR_BASE+582) +#define NERR_DfsChildOrParentInDfs (NERR_BASE+583) +#define NERR_DfsInternalError (NERR_BASE+590) +#define MAX_NERR (NERR_BASE+899) +#endif diff --git a/reactos/w32api/include/lmerrlog.h b/reactos/w32api/include/lmerrlog.h new file mode 100644 index 00000000000..2f4160369fd --- /dev/null +++ b/reactos/w32api/include/lmerrlog.h @@ -0,0 +1,211 @@ +#ifndef _LMERRLOG_H +#define _LMERRLOG_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define ERRLOG_BASE 3100 +#define ERRLOG2_BASE 5700 +#define LOGFLAGS_FORWARD 0 +#define LOGFLAGS_BACKWARD 1 +#define LOGFLAGS_SEEK 2 +#define NELOG_Internal_Error ERRLOG_BASE +#define NELOG_Resource_Shortage (ERRLOG_BASE+1) +#define NELOG_Unable_To_Lock_Segment (ERRLOG_BASE+2) +#define NELOG_Unable_To_Unlock_Segment (ERRLOG_BASE+3) +#define NELOG_Uninstall_Service (ERRLOG_BASE+4) +#define NELOG_Init_Exec_Fail (ERRLOG_BASE+5) +#define NELOG_Ncb_Error (ERRLOG_BASE+6) +#define NELOG_Net_Not_Started (ERRLOG_BASE+7) +#define NELOG_Ioctl_Error (ERRLOG_BASE+8) +#define NELOG_System_Semaphore (ERRLOG_BASE+9) +#define NELOG_Init_OpenCreate_Err (ERRLOG_BASE+10) +#define NELOG_NetBios (ERRLOG_BASE+11) +#define NELOG_SMB_Illegal (ERRLOG_BASE+12) +#define NELOG_Service_Fail (ERRLOG_BASE+13) +#define NELOG_Entries_Lost (ERRLOG_BASE+14) +#define NELOG_Init_Seg_Overflow (ERRLOG_BASE+20) +#define NELOG_Srv_No_Mem_Grow (ERRLOG_BASE+21) +#define NELOG_Access_File_Bad (ERRLOG_BASE+22) +#define NELOG_Srvnet_Not_Started (ERRLOG_BASE+23) +#define NELOG_Init_Chardev_Err (ERRLOG_BASE+24) +#define NELOG_Remote_API (ERRLOG_BASE+25) +#define NELOG_Ncb_TooManyErr (ERRLOG_BASE+26) +#define NELOG_Mailslot_err (ERRLOG_BASE+27) +#define NELOG_ReleaseMem_Alert (ERRLOG_BASE+28) +#define NELOG_AT_cannot_write (ERRLOG_BASE+29) +#define NELOG_Cant_Make_Msg_File (ERRLOG_BASE+30) +#define NELOG_Exec_Netservr_NoMem (ERRLOG_BASE+31) +#define NELOG_Server_Lock_Failure (ERRLOG_BASE+32) +#define NELOG_Msg_Shutdown (ERRLOG_BASE+40) +#define NELOG_Msg_Sem_Shutdown (ERRLOG_BASE+41) +#define NELOG_Msg_Log_Err (ERRLOG_BASE+50) +#define NELOG_VIO_POPUP_ERR (ERRLOG_BASE+51) +#define NELOG_Msg_Unexpected_SMB_Type (ERRLOG_BASE+52) +#define NELOG_Wksta_Infoseg (ERRLOG_BASE+60) +#define NELOG_Wksta_Compname (ERRLOG_BASE+61) +#define NELOG_Wksta_BiosThreadFailure (ERRLOG_BASE+62) +#define NELOG_Wksta_IniSeg (ERRLOG_BASE+63) +#define NELOG_Wksta_HostTab_Full (ERRLOG_BASE+64) +#define NELOG_Wksta_Bad_Mailslot_SMB (ERRLOG_BASE+65) +#define NELOG_Wksta_UASInit (ERRLOG_BASE+66) +#define NELOG_Wksta_SSIRelogon (ERRLOG_BASE+67) +#define NELOG_Build_Name (ERRLOG_BASE+70) +#define NELOG_Name_Expansion (ERRLOG_BASE+71) +#define NELOG_Message_Send (ERRLOG_BASE+72) +#define NELOG_Mail_Slt_Err (ERRLOG_BASE+73) +#define NELOG_AT_cannot_read (ERRLOG_BASE+74) +#define NELOG_AT_sched_err (ERRLOG_BASE+75) +#define NELOG_AT_schedule_file_created (ERRLOG_BASE+76) +#define NELOG_Srvnet_NB_Open (ERRLOG_BASE+77) +#define NELOG_AT_Exec_Err (ERRLOG_BASE+78) +#define NELOG_Lazy_Write_Err (ERRLOG_BASE+80) +#define NELOG_HotFix (ERRLOG_BASE+81) +#define NELOG_HardErr_From_Server (ERRLOG_BASE+82) +#define NELOG_LocalSecFail1 (ERRLOG_BASE+83) +#define NELOG_LocalSecFail2 (ERRLOG_BASE+84) +#define NELOG_LocalSecFail3 (ERRLOG_BASE+85) +#define NELOG_LocalSecGeneralFail (ERRLOG_BASE+86) +#define NELOG_NetWkSta_Internal_Error (ERRLOG_BASE+90) +#define NELOG_NetWkSta_No_Resource (ERRLOG_BASE+91) +#define NELOG_NetWkSta_SMB_Err (ERRLOG_BASE+92) +#define NELOG_NetWkSta_VC_Err (ERRLOG_BASE+93) +#define NELOG_NetWkSta_Stuck_VC_Err (ERRLOG_BASE+94) +#define NELOG_NetWkSta_NCB_Err (ERRLOG_BASE+95) +#define NELOG_NetWkSta_Write_Behind_Err (ERRLOG_BASE+96) +#define NELOG_NetWkSta_Reset_Err (ERRLOG_BASE+97) +#define NELOG_NetWkSta_Too_Many (ERRLOG_BASE+98) +#define NELOG_Srv_Thread_Failure (ERRLOG_BASE+104) +#define NELOG_Srv_Close_Failure (ERRLOG_BASE+105) +#define NELOG_ReplUserCurDir (ERRLOG_BASE+106) +#define NELOG_ReplCannotMasterDir (ERRLOG_BASE+107) +#define NELOG_ReplUpdateError (ERRLOG_BASE+108) +#define NELOG_ReplLostMaster (ERRLOG_BASE+109) +#define NELOG_NetlogonAuthDCFail (ERRLOG_BASE+110) +#define NELOG_ReplLogonFailed (ERRLOG_BASE+111) +#define NELOG_ReplNetErr (ERRLOG_BASE+112) +#define NELOG_ReplMaxFiles (ERRLOG_BASE+113) +#define NELOG_ReplMaxTreeDepth (ERRLOG_BASE+114) +#define NELOG_ReplBadMsg (ERRLOG_BASE+115) +#define NELOG_ReplSysErr (ERRLOG_BASE+116) +#define NELOG_ReplUserLoged (ERRLOG_BASE+117) +#define NELOG_ReplBadImport (ERRLOG_BASE+118) +#define NELOG_ReplBadExport (ERRLOG_BASE+119) +#define NELOG_ReplSignalFileErr (ERRLOG_BASE+120) +#define NELOG_DiskFT (ERRLOG_BASE+121) +#define NELOG_ReplAccessDenied (ERRLOG_BASE+122) +#define NELOG_NetlogonFailedPrimary (ERRLOG_BASE+123) +#define NELOG_NetlogonPasswdSetFailed (ERRLOG_BASE+124) +#define NELOG_NetlogonTrackingError (ERRLOG_BASE+125) +#define NELOG_NetlogonSyncError (ERRLOG_BASE+126) +#define NELOG_UPS_PowerOut (ERRLOG_BASE+130) +#define NELOG_UPS_Shutdown (ERRLOG_BASE+131) +#define NELOG_UPS_CmdFileError (ERRLOG_BASE+132) +#define NELOG_UPS_CannotOpenDriver (ERRLOG_BASE+133) +#define NELOG_UPS_PowerBack (ERRLOG_BASE+134) +#define NELOG_UPS_CmdFileConfig (ERRLOG_BASE+135) +#define NELOG_UPS_CmdFileExec (ERRLOG_BASE+136) +#define NELOG_Missing_Parameter (ERRLOG_BASE+150) +#define NELOG_Invalid_Config_Line (ERRLOG_BASE+151) +#define NELOG_Invalid_Config_File (ERRLOG_BASE+152) +#define NELOG_File_Changed (ERRLOG_BASE+153) +#define NELOG_Files_Dont_Fit (ERRLOG_BASE+154) +#define NELOG_Wrong_DLL_Version (ERRLOG_BASE+155) +#define NELOG_Error_in_DLL (ERRLOG_BASE+156) +#define NELOG_System_Error (ERRLOG_BASE+157) +#define NELOG_FT_ErrLog_Too_Large (ERRLOG_BASE+158) +#define NELOG_FT_Update_In_Progress (ERRLOG_BASE+159) +#define NELOG_OEM_Code (ERRLOG_BASE+199) +#define NELOG_NetlogonSSIInitError ERRLOG2_BASE +#define NELOG_NetlogonFailedToUpdateTrustList (ERRLOG2_BASE+1) +#define NELOG_NetlogonFailedToAddRpcInterface (ERRLOG2_BASE+2) +#define NELOG_NetlogonFailedToReadMailslot (ERRLOG2_BASE+3) +#define NELOG_NetlogonFailedToRegisterSC (ERRLOG2_BASE+4) +#define NELOG_NetlogonChangeLogCorrupt (ERRLOG2_BASE+5) +#define NELOG_NetlogonFailedToCreateShare (ERRLOG2_BASE+6) +#define NELOG_NetlogonDownLevelLogonFailed (ERRLOG2_BASE+7) +#define NELOG_NetlogonDownLevelLogoffFailed (ERRLOG2_BASE+8) +#define NELOG_NetlogonNTLogonFailed (ERRLOG2_BASE+9) +#define NELOG_NetlogonNTLogoffFailed (ERRLOG2_BASE+10) +#define NELOG_NetlogonPartialSyncCallSuccess (ERRLOG2_BASE+11) +#define NELOG_NetlogonPartialSyncCallFailed (ERRLOG2_BASE+12) +#define NELOG_NetlogonFullSyncCallSuccess (ERRLOG2_BASE+13) +#define NELOG_NetlogonFullSyncCallFailed (ERRLOG2_BASE+14) +#define NELOG_NetlogonPartialSyncSuccess (ERRLOG2_BASE+15) +#define NELOG_NetlogonPartialSyncFailed (ERRLOG2_BASE+16) +#define NELOG_NetlogonFullSyncSuccess (ERRLOG2_BASE+17) +#define NELOG_NetlogonFullSyncFailed (ERRLOG2_BASE+18) +#define NELOG_NetlogonAuthNoDomainController (ERRLOG2_BASE+19) +#define NELOG_NetlogonAuthNoTrustLsaSecret (ERRLOG2_BASE+20) +#define NELOG_NetlogonAuthNoTrustSamAccount (ERRLOG2_BASE+21) +#define NELOG_NetlogonServerAuthFailed (ERRLOG2_BASE+22) +#define NELOG_NetlogonServerAuthNoTrustSamAccount (ERRLOG2_BASE+23) +#define NELOG_FailedToRegisterSC (ERRLOG2_BASE+24) +#define NELOG_FailedToSetServiceStatus (ERRLOG2_BASE+25) +#define NELOG_FailedToGetComputerName (ERRLOG2_BASE+26) +#define NELOG_DriverNotLoaded (ERRLOG2_BASE+27) +#define NELOG_NoTranportLoaded (ERRLOG2_BASE+28) +#define NELOG_NetlogonFailedDomainDelta (ERRLOG2_BASE+29) +#define NELOG_NetlogonFailedGlobalGroupDelta (ERRLOG2_BASE+30) +#define NELOG_NetlogonFailedLocalGroupDelta (ERRLOG2_BASE+31) +#define NELOG_NetlogonFailedUserDelta (ERRLOG2_BASE+32) +#define NELOG_NetlogonFailedPolicyDelta (ERRLOG2_BASE+33) +#define NELOG_NetlogonFailedTrustedDomainDelta (ERRLOG2_BASE+34) +#define NELOG_NetlogonFailedAccountDelta (ERRLOG2_BASE+35) +#define NELOG_NetlogonFailedSecretDelta (ERRLOG2_BASE+36) +#define NELOG_NetlogonSystemError (ERRLOG2_BASE+37) +#define NELOG_NetlogonDuplicateMachineAccounts (ERRLOG2_BASE+38) +#define NELOG_NetlogonTooManyGlobalGroups (ERRLOG2_BASE+39) +#define NELOG_NetlogonBrowserDriver (ERRLOG2_BASE+40) +#define NELOG_NetlogonAddNameFailure (ERRLOG2_BASE+41) +#define NELOG_RplMessages (ERRLOG2_BASE+42) +#define NELOG_RplXnsBoot (ERRLOG2_BASE+43) +#define NELOG_RplSystem (ERRLOG2_BASE+44) +#define NELOG_RplWkstaTimeout (ERRLOG2_BASE+45) +#define NELOG_RplWkstaFileOpen (ERRLOG2_BASE+46) +#define NELOG_RplWkstaFileRead (ERRLOG2_BASE+47) +#define NELOG_RplWkstaMemory (ERRLOG2_BASE+48) +#define NELOG_RplWkstaFileChecksum (ERRLOG2_BASE+49) +#define NELOG_RplWkstaFileLineCount (ERRLOG2_BASE+50) +#define NELOG_RplWkstaBbcFile (ERRLOG2_BASE+51) +#define NELOG_RplWkstaFileSize (ERRLOG2_BASE+52) +#define NELOG_RplWkstaInternal (ERRLOG2_BASE+53) +#define NELOG_RplWkstaWrongVersion (ERRLOG2_BASE+54) +#define NELOG_RplWkstaNetwork (ERRLOG2_BASE+55) +#define NELOG_RplAdapterResource (ERRLOG2_BASE+56) +#define NELOG_RplFileCopy (ERRLOG2_BASE+57) +#define NELOG_RplFileDelete (ERRLOG2_BASE+58) +#define NELOG_RplFilePerms (ERRLOG2_BASE+59) +#define NELOG_RplCheckConfigs (ERRLOG2_BASE+60) +#define NELOG_RplCreateProfiles (ERRLOG2_BASE+61) +#define NELOG_RplRegistry (ERRLOG2_BASE+62) +#define NELOG_RplReplaceRPLDISK (ERRLOG2_BASE+63) +#define NELOG_RplCheckSecurity (ERRLOG2_BASE+64) +#define NELOG_RplBackupDatabase (ERRLOG2_BASE+65) +#define NELOG_RplInitDatabase (ERRLOG2_BASE+66) +#define NELOG_RplRestoreDatabaseFailure (ERRLOG2_BASE+67) +#define NELOG_RplRestoreDatabaseSuccess (ERRLOG2_BASE+68) +#define NELOG_RplInitRestoredDatabase (ERRLOG2_BASE+69) +#define NELOG_NetlogonSessionTypeWrong (ERRLOG2_BASE+70) +#define REVISED_ERROR_LOG_STRUCT +typedef struct _ERROR_LOG { + DWORD el_len; + DWORD el_reserved; + DWORD el_time; + DWORD el_error; + LPWSTR el_name; + LPWSTR el_text; + LPBYTE el_data; + DWORD el_data_size; + DWORD el_nstrings; +} ERROR_LOG,*PERROR_LOG,*LPERROR_LOG; +NET_API_STATUS WINAPI NetErrorLogClear(LPCWSTR,LPCWSTR,LPBYTE); +NET_API_STATUS WINAPI NetErrorLogRead(LPCWSTR,LPWSTR,LPHLOG,DWORD,LPDWORD,DWORD,DWORD,LPBYTE*,DWORD,LPDWORD,LPDWORD); +NET_API_STATUS WINAPI NetErrorLogWrite(LPBYTE,DWORD,LPCWSTR,LPBYTE,DWORD,LPBYTE,DWORD,LPBYTE); +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/lmmsg.h b/reactos/w32api/include/lmmsg.h new file mode 100644 index 00000000000..9a4ea643471 --- /dev/null +++ b/reactos/w32api/include/lmmsg.h @@ -0,0 +1,27 @@ +#ifndef _LMMSG_H +#define _LMMSG_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define MSGNAME_NOT_FORWARDED 0 +#define MSGNAME_FORWARDED_TO 4 +#define MSGNAME_FORWARDED_FROM 16 +typedef struct _MSG_INFO_0 { LPWSTR msgi0_name; }MSG_INFO_0,*PMSG_INFO_0,*LPMSG_INFO_0; +typedef struct _MSG_INFO_1 { + LPWSTR msgi1_name; + DWORD msgi1_forward_flag; + LPWSTR msgi1_forward; +}MSG_INFO_1,*PMSG_INFO_1,*LPMSG_INFO_1; +NET_API_STATUS WINAPI NetMessageBufferSend(LPCWSTR,LPCWSTR,LPCWSTR,PBYTE,DWORD); +NET_API_STATUS WINAPI NetMessageNameAdd(LPCWSTR,LPCWSTR); +NET_API_STATUS WINAPI NetMessageNameDel(LPCWSTR,LPCWSTR); +NET_API_STATUS WINAPI NetMessageNameEnum(LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); +NET_API_STATUS WINAPI NetMessageNameGetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE*); +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/lmremutl.h b/reactos/w32api/include/lmremutl.h new file mode 100644 index 00000000000..0609240af52 --- /dev/null +++ b/reactos/w32api/include/lmremutl.h @@ -0,0 +1,45 @@ +#ifndef _LMREMUTL_H +#define _LMREMUTL_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define SUPPORTS_REMOTE_ADMIN_PROTOCOL 2 +#define SUPPORTS_RPC 4 +#define SUPPORTS_SAM_PROTOCOL 8 +#define SUPPORTS_UNICODE 16 +#define SUPPORTS_LOCAL 32 +#define SUPPORTS_ANY 0xFFFFFFFF +#define NO_PERMISSION_REQUIRED 1 +#define ALLOCATE_RESPONSE 2 +#define USE_SPECIFIC_TRANSPORT 0x80000000 +#ifndef DESC_CHAR_UNICODE +typedef CHAR DESC_CHAR; +#else +typedef WCHAR DESC_CHAR; +#endif +typedef DESC_CHAR *LPDESC; +typedef struct _TIME_OF_DAY_INFO { + DWORD tod_elapsedt; + DWORD tod_msecs; + DWORD tod_hours; + DWORD tod_mins; + DWORD tod_secs; + DWORD tod_hunds; + LONG tod_timezone; + DWORD tod_tinterval; + DWORD tod_day; + DWORD tod_month; + DWORD tod_year; + DWORD tod_weekday; +} TIME_OF_DAY_INFO,*PTIME_OF_DAY_INFO,*LPTIME_OF_DAY_INFO; +NET_API_STATUS WINAPI NetRemoteTOD(LPCWSTR,PBYTE*); +NET_API_STATUS WINAPI NetRemoteComputerSupports(LPCWSTR,DWORD,PDWORD); +NET_API_STATUS RxRemoteApi(DWORD,LPCWSTR,LPDESC,LPDESC,LPDESC,LPDESC,LPDESC,LPDESC,LPDESC,DWORD,... ); +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/lmrepl.h b/reactos/w32api/include/lmrepl.h new file mode 100644 index 00000000000..0cef98ce93f --- /dev/null +++ b/reactos/w32api/include/lmrepl.h @@ -0,0 +1,94 @@ +#ifndef _LMREPL_H +#define _LMREPL_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define REPL_ROLE_EXPORT 1 +#define REPL_ROLE_IMPORT 2 +#define REPL_ROLE_BOTH 3 +#define REPL_INTERVAL_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+0) +#define REPL_PULSE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+1) +#define REPL_GUARDTIME_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+2) +#define REPL_RANDOM_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+3) +#define REPL_UNLOCK_NOFORCE 0 +#define REPL_UNLOCK_FORCE 1 +#define REPL_STATE_OK 0 +#define REPL_STATE_NO_MASTER 1 +#define REPL_STATE_NO_SYNC 2 +#define REPL_STATE_NEVER_REPLICATED 3 +#define REPL_INTEGRITY_FILE 1 +#define REPL_INTEGRITY_TREE 2 +#define REPL_EXTENT_FILE 1 +#define REPL_EXTENT_TREE 2 +#define REPL_EXPORT_INTEGRITY_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+0) +#define REPL_EXPORT_EXTENT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+1) +typedef struct _REPL_INFO_0 { + DWORD rp0_role; + LPWSTR rp0_exportpath; + LPWSTR rp0_exportlist; + LPWSTR rp0_importpath; + LPWSTR rp0_importlist; + LPWSTR rp0_logonusername; + DWORD rp0_interval; + DWORD rp0_pulse; + DWORD rp0_guardtime; + DWORD rp0_random; +} REPL_INFO_0,*PREPL_INFO_0,*LPREPL_INFO_0; +typedef struct _REPL_INFO_1000 { DWORD rp1000_interval; } REPL_INFO_1000,*PREPL_INFO_1000,*LPREPL_INFO_1000; +typedef struct _REPL_INFO_1001 { DWORD rp1001_pulse; } REPL_INFO_1001,*PREPL_INFO_1001,*LPREPL_INFO_1001; +typedef struct _REPL_INFO_1002 { DWORD rp1002_guardtime; } REPL_INFO_1002,*PREPL_INFO_1002,*LPREPL_INFO_1002; +typedef struct _REPL_INFO_1003 { DWORD rp1003_random; } REPL_INFO_1003,*PREPL_INFO_1003,*LPREPL_INFO_1003; + +NET_API_STATUS WINAPI NetReplGetInfo(LPCWSTR,DWORD,PBYTE*); +NET_API_STATUS WINAPI NetReplSetInfo(LPCWSTR,DWORD,PBYTE,PDWORD); +typedef struct _REPL_EDIR_INFO_0 { + LPWSTR rped0_dirname; +} REPL_EDIR_INFO_0,*PREPL_EDIR_INFO_0,*LPREPL_EDIR_INFO_0; +typedef struct _REPL_EDIR_INFO_1 { + LPWSTR rped1_dirname; + DWORD rped1_integrity; + DWORD rped1_extent; +} REPL_EDIR_INFO_1,*PREPL_EDIR_INFO_1,*LPREPL_EDIR_INFO_1; +typedef struct _REPL_EDIR_INFO_2 { + LPWSTR rped2_dirname; + DWORD rped2_integrity; + DWORD rped2_extent; + DWORD rped2_lockcount; + DWORD rped2_locktime; +} REPL_EDIR_INFO_2,*PREPL_EDIR_INFO_2,*LPREPL_EDIR_INFO_2; +typedef struct _REPL_EDIR_INFO_1000 { + DWORD rped1000_integrity; +} REPL_EDIR_INFO_1000,*PREPL_EDIR_INFO_1000,*LPREPL_EDIR_INFO_1000; +typedef struct _REPL_EDIR_INFO_1001 { + DWORD rped1001_extent; +} REPL_EDIR_INFO_1001,*PREPL_EDIR_INFO_1001,*LPREPL_EDIR_INFO_1001; +typedef struct _REPL_IDIR_INFO_0 { LPWSTR rpid0_dirname; } REPL_IDIR_INFO_0,*PREPL_IDIR_INFO_0,*LPREPL_IDIR_INFO_0; +typedef struct _REPL_IDIR_INFO_1 { + LPWSTR rpid1_dirname; + DWORD rpid1_state; + LPWSTR rpid1_mastername; + DWORD rpid1_last_update_time; + DWORD rpid1_lockcount; + DWORD rpid1_locktime; +} REPL_IDIR_INFO_1,*PREPL_IDIR_INFO_1,*LPREPL_IDIR_INFO_1; +NET_API_STATUS WINAPI NetReplExportDirAdd(LPCWSTR,DWORD,PBYTE,PDWORD); +NET_API_STATUS WINAPI NetReplExportDirDel(LPCWSTR,LPCWSTR); +NET_API_STATUS WINAPI NetReplExportDirEnum(LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); +NET_API_STATUS WINAPI NetReplExportDirGetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE*); +NET_API_STATUS WINAPI NetReplExportDirSetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE,PDWORD); +NET_API_STATUS WINAPI NetReplExportDirLock(LPCWSTR,LPCWSTR); +NET_API_STATUS WINAPI NetReplExportDirUnlock(LPCWSTR,LPCWSTR,DWORD); +NET_API_STATUS WINAPI NetReplImportDirAdd(LPCWSTR,DWORD,PBYTE,PDWORD); +NET_API_STATUS WINAPI NetReplImportDirDel(LPCWSTR,LPCWSTR); +NET_API_STATUS WINAPI NetReplImportDirEnum(LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); +NET_API_STATUS WINAPI NetReplImportDirGetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE*); +NET_API_STATUS WINAPI NetReplImportDirLock(LPCWSTR,LPCWSTR); +NET_API_STATUS WINAPI NetReplImportDirUnlock(LPCWSTR,LPCWSTR,DWORD); +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/lmserver.h b/reactos/w32api/include/lmserver.h new file mode 100644 index 00000000000..71197143028 --- /dev/null +++ b/reactos/w32api/include/lmserver.h @@ -0,0 +1,606 @@ +#ifndef _LMSERVER_H +#define _LMSERVER_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#include <winsvc.h> +#include <lmcons.h> +typedef struct _SERVER_INFO_100 { +DWORD sv100_platform_id; +LPWSTR sv100_name; +} SERVER_INFO_100,*PSERVER_INFO_100,*LPSERVER_INFO_100; +typedef struct _SERVER_INFO_101 { +DWORD sv101_platform_id; +LPWSTR sv101_name; +DWORD sv101_version_major; +DWORD sv101_version_minor; +DWORD sv101_type; +LPWSTR sv101_comment; +} SERVER_INFO_101,*PSERVER_INFO_101,*LPSERVER_INFO_101; +typedef struct _SERVER_INFO_102 { +DWORD sv102_platform_id; +LPWSTR sv102_name; +DWORD sv102_version_major; +DWORD sv102_version_minor; +DWORD sv102_type; +LPWSTR sv102_comment; +DWORD sv102_users; +LONG sv102_disc; +BOOL sv102_hidden; +DWORD sv102_announce; +DWORD sv102_anndelta; +DWORD sv102_licenses; +LPWSTR sv102_userpath; +} SERVER_INFO_102,*PSERVER_INFO_102,*LPSERVER_INFO_102; +typedef struct _SERVER_INFO_402 { +DWORD sv402_ulist_mtime; +DWORD sv402_glist_mtime; +DWORD sv402_alist_mtime; +LPWSTR sv402_alerts; +DWORD sv402_security; +DWORD sv402_numadmin; +DWORD sv402_lanmask; +LPWSTR sv402_guestacct; +DWORD sv402_chdevs; +DWORD sv402_chdevq; +DWORD sv402_chdevjobs; +DWORD sv402_connections; +DWORD sv402_shares; +DWORD sv402_openfiles; +DWORD sv402_sessopens; +DWORD sv402_sessvcs; +DWORD sv402_sessreqs; +DWORD sv402_opensearch; +DWORD sv402_activelocks; +DWORD sv402_numreqbuf; +DWORD sv402_sizreqbuf; +DWORD sv402_numbigbuf; +DWORD sv402_numfiletasks; +DWORD sv402_alertsched; +DWORD sv402_erroralert; +DWORD sv402_logonalert; +DWORD sv402_accessalert; +DWORD sv402_diskalert; +DWORD sv402_netioalert; +DWORD sv402_maxauditsz; +LPWSTR sv402_srvheuristics; +} SERVER_INFO_402,*PSERVER_INFO_402,*LPSERVER_INFO_402; +typedef struct _SERVER_INFO_403 { +DWORD sv403_ulist_mtime; +DWORD sv403_glist_mtime; +DWORD sv403_alist_mtime; +LPWSTR sv403_alerts; +DWORD sv403_security; +DWORD sv403_numadmin; +DWORD sv403_lanmask; +LPWSTR sv403_guestacct; +DWORD sv403_chdevs; +DWORD sv403_chdevq; +DWORD sv403_chdevjobs; +DWORD sv403_connections; +DWORD sv403_shares; +DWORD sv403_openfiles; +DWORD sv403_sessopens; +DWORD sv403_sessvcs; +DWORD sv403_sessreqs; +DWORD sv403_opensearch; +DWORD sv403_activelocks; +DWORD sv403_numreqbuf; +DWORD sv403_sizreqbuf; +DWORD sv403_numbigbuf; +DWORD sv403_numfiletasks; +DWORD sv403_alertsched; +DWORD sv403_erroralert; +DWORD sv403_logonalert; +DWORD sv403_accessalert; +DWORD sv403_diskalert; +DWORD sv403_netioalert; +DWORD sv403_maxauditsz; +LPWSTR sv403_srvheuristics; +DWORD sv403_auditedevents; +DWORD sv403_autoprofile; +LPWSTR sv403_autopath; +} SERVER_INFO_403,*PSERVER_INFO_403,*LPSERVER_INFO_403; +typedef struct _SERVER_INFO_502 { +DWORD sv502_sessopens; +DWORD sv502_sessvcs; +DWORD sv502_opensearch; +DWORD sv502_sizreqbuf; +DWORD sv502_initworkitems; +DWORD sv502_maxworkitems; +DWORD sv502_rawworkitems; +DWORD sv502_irpstacksize; +DWORD sv502_maxrawbuflen; +DWORD sv502_sessusers; +DWORD sv502_sessconns; +DWORD sv502_maxpagedmemoryusage; +DWORD sv502_maxnonpagedmemoryusage; +BOOL sv502_enablesoftcompat; +BOOL sv502_enableforcedlogoff; +BOOL sv502_timesource; +BOOL sv502_acceptdownlevelapis; +BOOL sv502_lmannounce; +} SERVER_INFO_502,*PSERVER_INFO_502,*LPSERVER_INFO_502; +typedef struct _SERVER_INFO_503 { +DWORD sv503_sessopens; +DWORD sv503_sessvcs; +DWORD sv503_opensearch; +DWORD sv503_sizreqbuf; +DWORD sv503_initworkitems; +DWORD sv503_maxworkitems; +DWORD sv503_rawworkitems; +DWORD sv503_irpstacksize; +DWORD sv503_maxrawbuflen; +DWORD sv503_sessusers; +DWORD sv503_sessconns; +DWORD sv503_maxpagedmemoryusage; +DWORD sv503_maxnonpagedmemoryusage; +BOOL sv503_enablesoftcompat; +BOOL sv503_enableforcedlogoff; +BOOL sv503_timesource; +BOOL sv503_acceptdownlevelapis; +BOOL sv503_lmannounce; +LPWSTR sv503_domain; +DWORD sv503_maxcopyreadlen; +DWORD sv503_maxcopywritelen; +DWORD sv503_minkeepsearch; +DWORD sv503_maxkeepsearch; +DWORD sv503_minkeepcomplsearch; +DWORD sv503_maxkeepcomplsearch; +DWORD sv503_threadcountadd; +DWORD sv503_numblockthreads; +DWORD sv503_scavtimeout; +DWORD sv503_minrcvqueue; +DWORD sv503_minfreeworkitems; +DWORD sv503_xactmemsize; +DWORD sv503_threadpriority; +DWORD sv503_maxmpxct; +DWORD sv503_oplockbreakwait; +DWORD sv503_oplockbreakresponsewait; +BOOL sv503_enableoplocks; +BOOL sv503_enableoplockforceclose; +BOOL sv503_enablefcbopens; +BOOL sv503_enableraw; +BOOL sv503_enablesharednetdrives; +DWORD sv503_minfreeconnections; +DWORD sv503_maxfreeconnections; +} SERVER_INFO_503,*PSERVER_INFO_503,*LPSERVER_INFO_503; +typedef struct _SERVER_INFO_599 { +DWORD sv599_sessopens; +DWORD sv599_sessvcs; +DWORD sv599_opensearch; +DWORD sv599_sizreqbuf; +DWORD sv599_initworkitems; +DWORD sv599_maxworkitems; +DWORD sv599_rawworkitems; +DWORD sv599_irpstacksize; +DWORD sv599_maxrawbuflen; +DWORD sv599_sessusers; +DWORD sv599_sessconns; +DWORD sv599_maxpagedmemoryusage; +DWORD sv599_maxnonpagedmemoryusage; +BOOL sv599_enablesoftcompat; +BOOL sv599_enableforcedlogoff; +BOOL sv599_timesource; +BOOL sv599_acceptdownlevelapis; +BOOL sv599_lmannounce; +LPWSTR sv599_domain; +DWORD sv599_maxcopyreadlen; +DWORD sv599_maxcopywritelen; +DWORD sv599_minkeepsearch; +DWORD sv599_maxkeepsearch; +DWORD sv599_minkeepcomplsearch; +DWORD sv599_maxkeepcomplsearch; +DWORD sv599_threadcountadd; +DWORD sv599_numblockthreads; +DWORD sv599_scavtimeout; +DWORD sv599_minrcvqueue; +DWORD sv599_minfreeworkitems; +DWORD sv599_xactmemsize; +DWORD sv599_threadpriority; +DWORD sv599_maxmpxct; +DWORD sv599_oplockbreakwait; +DWORD sv599_oplockbreakresponsewait; +BOOL sv599_enableoplocks; +BOOL sv599_enableoplockforceclose; +BOOL sv599_enablefcbopens; +BOOL sv599_enableraw; +BOOL sv599_enablesharednetdrives; +DWORD sv599_minfreeconnections; +DWORD sv599_maxfreeconnections; +DWORD sv599_initsesstable; +DWORD sv599_initconntable; +DWORD sv599_initfiletable; +DWORD sv599_initsearchtable; +DWORD sv599_alertschedule; +DWORD sv599_errorthreshold; +DWORD sv599_networkerrorthreshold; +DWORD sv599_diskspacethreshold; +DWORD sv599_reserved; +DWORD sv599_maxlinkdelay; +DWORD sv599_minlinkthroughput; +DWORD sv599_linkinfovalidtime; +DWORD sv599_scavqosinfoupdatetime; +DWORD sv599_maxworkitemidletime; +} SERVER_INFO_599,*PSERVER_INFO_599,*LPSERVER_INFO_599; +typedef struct _SERVER_INFO_598 { +DWORD sv598_maxrawworkitems; +DWORD sv598_maxthreadsperqueue; +DWORD sv598_producttype; +DWORD sv598_serversize; +DWORD sv598_connectionlessautodisc; +DWORD sv598_sharingviolationretries; +DWORD sv598_sharingviolationdelay; +DWORD sv598_maxglobalopensearch; +DWORD sv598_removeduplicatesearches; +DWORD sv598_lockviolationoffset; +DWORD sv598_lockviolationdelay; +DWORD sv598_mdlreadswitchover; +DWORD sv598_cachedopenlimit; +DWORD sv598_otherqueueaffinity; +BOOL sv598_restrictnullsessaccess; +BOOL sv598_enablewfw311directipx; +DWORD sv598_queuesamplesecs; +DWORD sv598_balancecount; +DWORD sv598_preferredaffinity; +DWORD sv598_maxfreerfcbs; +DWORD sv598_maxfreemfcbs; +DWORD sv598_maxfreelfcbs; +DWORD sv598_maxfreepagedpoolchunks; +DWORD sv598_minpagedpoolchunksize; +DWORD sv598_maxpagedpoolchunksize; +BOOL sv598_sendsfrompreferredprocessor; +} SERVER_INFO_598,*PSERVER_INFO_598,*LPSERVER_INFO_598; +typedef struct _SERVER_INFO_1005 {LPWSTR sv1005_comment; } SERVER_INFO_1005,*PSERVER_INFO_1005,*LPSERVER_INFO_1005; +typedef struct _SERVER_INFO_1107 { DWORD sv1107_users; } SERVER_INFO_1107,*PSERVER_INFO_1107,*LPSERVER_INFO_1107; +typedef struct _SERVER_INFO_1010 { LONG sv1010_disc; } SERVER_INFO_1010,*PSERVER_INFO_1010,*LPSERVER_INFO_1010; +typedef struct _SERVER_INFO_1016 { BOOL sv1016_hidden; } SERVER_INFO_1016,*PSERVER_INFO_1016,*LPSERVER_INFO_1016; +typedef struct _SERVER_INFO_1017 { DWORD sv1017_announce; } SERVER_INFO_1017,*PSERVER_INFO_1017,*LPSERVER_INFO_1017; +typedef struct _SERVER_INFO_1018 { DWORD sv1018_anndelta; } SERVER_INFO_1018,*PSERVER_INFO_1018,*LPSERVER_INFO_1018; +typedef struct _SERVER_INFO_1501 { DWORD sv1501_sessopens; } SERVER_INFO_1501,*PSERVER_INFO_1501,*LPSERVER_INFO_1501; +typedef struct _SERVER_INFO_1502 { DWORD sv1502_sessvcs; } SERVER_INFO_1502,*PSERVER_INFO_1502,*LPSERVER_INFO_1502; +typedef struct _SERVER_INFO_1503 { DWORD sv1503_opensearch; } SERVER_INFO_1503,*PSERVER_INFO_1503,*LPSERVER_INFO_1503; +typedef struct _SERVER_INFO_1506 { DWORD sv1506_maxworkitems; } SERVER_INFO_1506,*PSERVER_INFO_1506,*LPSERVER_INFO_1506; +typedef struct _SERVER_INFO_1509 { DWORD sv1509_maxrawbuflen; } SERVER_INFO_1509,*PSERVER_INFO_1509,*LPSERVER_INFO_1509; +typedef struct _SERVER_INFO_1510 { DWORD sv1510_sessusers; } SERVER_INFO_1510,*PSERVER_INFO_1510,*LPSERVER_INFO_1510; +typedef struct _SERVER_INFO_1511 { DWORD sv1511_sessconns; } SERVER_INFO_1511,*PSERVER_INFO_1511,*LPSERVER_INFO_1511; +typedef struct _SERVER_INFO_1512 { DWORD sv1512_maxnonpagedmemoryusage; } SERVER_INFO_1512,*PSERVER_INFO_1512,*LPSERVER_INFO_1512; +typedef struct _SERVER_INFO_1513 { DWORD sv1513_maxpagedmemoryusage; } SERVER_INFO_1513,*PSERVER_INFO_1513,*LPSERVER_INFO_1513; +typedef struct _SERVER_INFO_1514 { BOOL sv1514_enablesoftcompat; } SERVER_INFO_1514,*PSERVER_INFO_1514,*LPSERVER_INFO_1514; +typedef struct _SERVER_INFO_1515 { BOOL sv1515_enableforcedlogoff; } SERVER_INFO_1515,*PSERVER_INFO_1515,*LPSERVER_INFO_1515; +typedef struct _SERVER_INFO_1516 { BOOL sv1516_timesource; } SERVER_INFO_1516,*PSERVER_INFO_1516,*LPSERVER_INFO_1516; +typedef struct _SERVER_INFO_1518 { BOOL sv1518_lmannounce; } SERVER_INFO_1518,*PSERVER_INFO_1518,*LPSERVER_INFO_1518; +typedef struct _SERVER_INFO_1520 { DWORD sv1520_maxcopyreadlen; } SERVER_INFO_1520,*PSERVER_INFO_1520,*LPSERVER_INFO_1520; +typedef struct _SERVER_INFO_1521 { DWORD sv1521_maxcopywritelen; } SERVER_INFO_1521,*PSERVER_INFO_1521,*LPSERVER_INFO_1521; +typedef struct _SERVER_INFO_1522 { DWORD sv1522_minkeepsearch; } SERVER_INFO_1522,*PSERVER_INFO_1522,*LPSERVER_INFO_1522; +typedef struct _SERVER_INFO_1523 { DWORD sv1523_maxkeepsearch; } SERVER_INFO_1523,*PSERVER_INFO_1523,*LPSERVER_INFO_1523; +typedef struct _SERVER_INFO_1524 { DWORD sv1524_minkeepcomplsearch; } SERVER_INFO_1524,*PSERVER_INFO_1524,*LPSERVER_INFO_1524; +typedef struct _SERVER_INFO_1525 { DWORD sv1525_maxkeepcomplsearch; } SERVER_INFO_1525,*PSERVER_INFO_1525,*LPSERVER_INFO_1525; +typedef struct _SERVER_INFO_1528 { DWORD sv1528_scavtimeout; } SERVER_INFO_1528,*PSERVER_INFO_1528,*LPSERVER_INFO_1528; +typedef struct _SERVER_INFO_1529 { DWORD sv1529_minrcvqueue; } SERVER_INFO_1529,*PSERVER_INFO_1529,*LPSERVER_INFO_1529; +typedef struct _SERVER_INFO_1530 { DWORD sv1530_minfreeworkitems; } SERVER_INFO_1530,*PSERVER_INFO_1530,*LPSERVER_INFO_1530; +typedef struct _SERVER_INFO_1533 { DWORD sv1533_maxmpxct; } SERVER_INFO_1533,*PSERVER_INFO_1533,*LPSERVER_INFO_1533; +typedef struct _SERVER_INFO_1534 { DWORD sv1534_oplockbreakwait; } SERVER_INFO_1534,*PSERVER_INFO_1534,*LPSERVER_INFO_1534; +typedef struct _SERVER_INFO_1535 { DWORD sv1535_oplockbreakresponsewait; } SERVER_INFO_1535,*PSERVER_INFO_1535,*LPSERVER_INFO_1535; +typedef struct _SERVER_INFO_1536 { BOOL sv1536_enableoplocks; } SERVER_INFO_1536,*PSERVER_INFO_1536,*LPSERVER_INFO_1536; +typedef struct _SERVER_INFO_1537 { BOOL sv1537_enableoplockforceclose; } SERVER_INFO_1537,*PSERVER_INFO_1537,*LPSERVER_INFO_1537; +typedef struct _SERVER_INFO_1538 { BOOL sv1538_enablefcbopens; } SERVER_INFO_1538,*PSERVER_INFO_1538,*LPSERVER_INFO_1538; +typedef struct _SERVER_INFO_1539 { BOOL sv1539_enableraw; } SERVER_INFO_1539,*PSERVER_INFO_1539,*LPSERVER_INFO_1539; +typedef struct _SERVER_INFO_1540 { BOOL sv1540_enablesharednetdrives; } SERVER_INFO_1540,*PSERVER_INFO_1540,*LPSERVER_INFO_1540; +typedef struct _SERVER_INFO_1541 { BOOL sv1541_minfreeconnections; } SERVER_INFO_1541,*PSERVER_INFO_1541,*LPSERVER_INFO_1541; +typedef struct _SERVER_INFO_1542 { BOOL sv1542_maxfreeconnections; } SERVER_INFO_1542,*PSERVER_INFO_1542,*LPSERVER_INFO_1542; +typedef struct _SERVER_INFO_1543 { DWORD sv1543_initsesstable; } SERVER_INFO_1543,*PSERVER_INFO_1543,*LPSERVER_INFO_1543; +typedef struct _SERVER_INFO_1544 { DWORD sv1544_initconntable; } SERVER_INFO_1544,*PSERVER_INFO_1544,*LPSERVER_INFO_1544; +typedef struct _SERVER_INFO_1545 { DWORD sv1545_initfiletable; } SERVER_INFO_1545,*PSERVER_INFO_1545,*LPSERVER_INFO_1545; +typedef struct _SERVER_INFO_1546 { DWORD sv1546_initsearchtable; } SERVER_INFO_1546,*PSERVER_INFO_1546,*LPSERVER_INFO_1546; +typedef struct _SERVER_INFO_1547 { DWORD sv1547_alertschedule; } SERVER_INFO_1547,*PSERVER_INFO_1547,*LPSERVER_INFO_1547; +typedef struct _SERVER_INFO_1548 { DWORD sv1548_errorthreshold; } SERVER_INFO_1548,*PSERVER_INFO_1548,*LPSERVER_INFO_1548; +typedef struct _SERVER_INFO_1549 { DWORD sv1549_networkerrorthreshold; } SERVER_INFO_1549,*PSERVER_INFO_1549,*LPSERVER_INFO_1549; +typedef struct _SERVER_INFO_1550 { DWORD sv1550_diskspacethreshold; } SERVER_INFO_1550,*PSERVER_INFO_1550,*LPSERVER_INFO_1550; +typedef struct _SERVER_INFO_1552 { DWORD sv1552_maxlinkdelay; } SERVER_INFO_1552,*PSERVER_INFO_1552,*LPSERVER_INFO_1552; +typedef struct _SERVER_INFO_1553 { DWORD sv1553_minlinkthroughput; } SERVER_INFO_1553,*PSERVER_INFO_1553,*LPSERVER_INFO_1553; +typedef struct _SERVER_INFO_1554 { DWORD sv1554_linkinfovalidtime; } SERVER_INFO_1554,*PSERVER_INFO_1554,*LPSERVER_INFO_1554; +typedef struct _SERVER_INFO_1555 { DWORD sv1555_scavqosinfoupdatetime; } SERVER_INFO_1555,*PSERVER_INFO_1555,*LPSERVER_INFO_1555; +typedef struct _SERVER_INFO_1556 { DWORD sv1556_maxworkitemidletime; } SERVER_INFO_1556,*PSERVER_INFO_1556,*LPSERVER_INFO_1556; +typedef struct _SERVER_INFO_1557 { DWORD sv1557_maxrawworkitems; } SERVER_INFO_1557,*PSERVER_INFO_1557,*LPSERVER_INFO_1557; +typedef struct _SERVER_INFO_1560 { DWORD sv1560_producttype; } SERVER_INFO_1560,*PSERVER_INFO_1560,*LPSERVER_INFO_1560; +typedef struct _SERVER_INFO_1561 { DWORD sv1561_serversize; } SERVER_INFO_1561,*PSERVER_INFO_1561,*LPSERVER_INFO_1561; +typedef struct _SERVER_INFO_1562 { DWORD sv1562_connectionlessautodisc; } SERVER_INFO_1562,*PSERVER_INFO_1562,*LPSERVER_INFO_1562; +typedef struct _SERVER_INFO_1563 { DWORD sv1563_sharingviolationretries; } SERVER_INFO_1563,*PSERVER_INFO_1563,*LPSERVER_INFO_1563; +typedef struct _SERVER_INFO_1564 { DWORD sv1564_sharingviolationdelay; } SERVER_INFO_1564,*PSERVER_INFO_1564,*LPSERVER_INFO_1564; +typedef struct _SERVER_INFO_1565 { DWORD sv1565_maxglobalopensearch; } SERVER_INFO_1565,*PSERVER_INFO_1565,*LPSERVER_INFO_1565; +typedef struct _SERVER_INFO_1566 { BOOL sv1566_removeduplicatesearches; } SERVER_INFO_1566,*PSERVER_INFO_1566,*LPSERVER_INFO_1566; +typedef struct _SERVER_INFO_1567 { DWORD sv1567_lockviolationretries; } SERVER_INFO_1567,*PSERVER_INFO_1567,*LPSERVER_INFO_1567; +typedef struct _SERVER_INFO_1568 { DWORD sv1568_lockviolationoffset; } SERVER_INFO_1568,*PSERVER_INFO_1568,*LPSERVER_INFO_1568; +typedef struct _SERVER_INFO_1569 { DWORD sv1569_lockviolationdelay; } SERVER_INFO_1569,*PSERVER_INFO_1569,*LPSERVER_INFO_1569; +typedef struct _SERVER_INFO_1570 { DWORD sv1570_mdlreadswitchover; } SERVER_INFO_1570,*PSERVER_INFO_1570,*LPSERVER_INFO_1570; +typedef struct _SERVER_INFO_1571 { DWORD sv1571_cachedopenlimit; } SERVER_INFO_1571,*PSERVER_INFO_1571,*LPSERVER_INFO_1571; +typedef struct _SERVER_INFO_1572 { DWORD sv1572_criticalthreads; } SERVER_INFO_1572,*PSERVER_INFO_1572,*LPSERVER_INFO_1572; +typedef struct _SERVER_INFO_1573 { DWORD sv1573_restrictnullsessaccess; } SERVER_INFO_1573,*PSERVER_INFO_1573,*LPSERVER_INFO_1573; +typedef struct _SERVER_INFO_1574 { DWORD sv1574_enablewfw311directipx;} SERVER_INFO_1574,*PSERVER_INFO_1574,*LPSERVER_INFO_1574; +typedef struct _SERVER_INFO_1575 { DWORD sv1575_otherqueueaffinity; } SERVER_INFO_1575,*PSERVER_INFO_1575,*LPSERVER_INFO_1575; +typedef struct _SERVER_INFO_1576 { DWORD sv1576_queuesamplesecs; } SERVER_INFO_1576,*PSERVER_INFO_1576,*LPSERVER_INFO_1576; +typedef struct _SERVER_INFO_1577 { DWORD sv1577_balancecount; } SERVER_INFO_1577,*PSERVER_INFO_1577,*LPSERVER_INFO_1577; +typedef struct _SERVER_INFO_1578 { DWORD sv1578_preferredaffinity; } SERVER_INFO_1578,*PSERVER_INFO_1578,*LPSERVER_INFO_1578; +typedef struct _SERVER_INFO_1579 { DWORD sv1579_maxfreerfcbs; } SERVER_INFO_1579,*PSERVER_INFO_1579,*LPSERVER_INFO_1579; +typedef struct _SERVER_INFO_1580 { DWORD sv1580_maxfreemfcbs; } SERVER_INFO_1580,*PSERVER_INFO_1580,*LPSERVER_INFO_1580; +typedef struct _SERVER_INFO_1581 { DWORD sv1581_maxfreemlcbs; } SERVER_INFO_1581,*PSERVER_INFO_1581,*LPSERVER_INFO_1581; +typedef struct _SERVER_INFO_1582 { DWORD sv1582_maxfreepagedpoolchunks; } SERVER_INFO_1582,*PSERVER_INFO_1582,*LPSERVER_INFO_1582; +typedef struct _SERVER_INFO_1583 { DWORD sv1583_minpagedpoolchunksize; } SERVER_INFO_1583,*PSERVER_INFO_1583,*LPSERVER_INFO_1583; +typedef struct _SERVER_INFO_1584 { DWORD sv1584_maxpagedpoolchunksize; } SERVER_INFO_1584,*PSERVER_INFO_1584,*LPSERVER_INFO_1584; +typedef struct _SERVER_INFO_1585 { BOOL sv1585_sendsfrompreferredprocessor; } SERVER_INFO_1585,*PSERVER_INFO_1585,*LPSERVER_INFO_1585; +typedef struct _SERVER_INFO_1586 { BOOL sv1586_maxthreadsperqueue; } SERVER_INFO_1586,*PSERVER_INFO_1586,*LPSERVER_INFO_1586; +typedef struct _SERVER_TRANSPORT_INFO_0 { +DWORD svti0_numberofvcs; +LPWSTR svti0_transportname; +PBYTE svti0_transportaddress; +DWORD svti0_transportaddresslength; +LPWSTR svti0_networkaddress; +} SERVER_TRANSPORT_INFO_0,*PSERVER_TRANSPORT_INFO_0,*LPSERVER_TRANSPORT_INFO_0; + +NET_API_STATUS WINAPI NetServerEnum(LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,DWORD,LPCWSTR,PDWORD); +NET_API_STATUS WINAPI NetServerEnumEx(LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,DWORD,LPCWSTR,LPCWSTR); +NET_API_STATUS WINAPI NetServerGetInfo(LPWSTR,DWORD,PBYTE*); +NET_API_STATUS WINAPI NetServerSetInfo(LPWSTR,DWORD,PBYTE,PDWORD); +NET_API_STATUS NetServerSetInfoCommandLine(WORD,LPWSTR*); +NET_API_STATUS WINAPI NetServerDiskEnum(LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); +NET_API_STATUS WINAPI NetServerComputerNameAdd(LPWSTR,LPWSTR,LPWSTR); +NET_API_STATUS WINAPI NetServerComputerNameDel(LPWSTR,LPWSTR); +NET_API_STATUS WINAPI NetServerTransportAdd(LPWSTR,DWORD,PBYTE); +NET_API_STATUS WINAPI NetServerTransportAddEx(LPWSTR,DWORD,PBYTE); +NET_API_STATUS WINAPI NetServerTransportDel(LPWSTR,DWORD,PBYTE); +NET_API_STATUS WINAPI NetServerTransportEnum(LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); +BOOL SetServiceBits(SERVICE_STATUS_HANDLE,DWORD,BOOL,BOOL); + +#define SVI1_NUM_ELEMENTS 5 +#define SVI2_NUM_ELEMENTS 40 +#define SVI3_NUM_ELEMENTS 44 +#define SV_MAX_CMD_LEN PATHLEN +#define SW_AUTOPROF_LOAD_MASK 1 +#define SW_AUTOPROF_SAVE_MASK 2 +#define SV_MAX_SRV_HEUR_LEN 32 +#define SV_USERS_PER_LICENSE 5 +#define SV_PLATFORM_ID_OS2 400 +#define SV_PLATFORM_ID_NT 500 +#define MAJOR_VERSION_MASK 15 +#define SV_TYPE_WORKSTATION 1 +#define SV_TYPE_SERVER 2 +#define SV_TYPE_SQLSERVER 4 +#define SV_TYPE_DOMAIN_CTRL 8 +#define SV_TYPE_DOMAIN_BAKCTRL 16 +#define SV_TYPE_TIME_SOURCE 32 +#define SV_TYPE_AFP 64 +#define SV_TYPE_NOVELL 128 +#define SV_TYPE_DOMAIN_MEMBER 256 +#define SV_TYPE_PRINTQ_SERVER 512 +#define SV_TYPE_DIALIN_SERVER 1024 +#define SV_TYPE_XENIX_SERVER 2048 +#define SV_TYPE_SERVER_UNIX SV_TYPE_XENIX_SERVER +#define SV_TYPE_NT 4096 +#define SV_TYPE_WFW 8192 +#define SV_TYPE_SERVER_MFPN 16384 +#define SV_TYPE_SERVER_NT 32768 +#define SV_TYPE_POTENTIAL_BROWSER 65536 +#define SV_TYPE_BACKUP_BROWSER 0x20000 +#define SV_TYPE_MASTER_BROWSER 0x40000 +#define SV_TYPE_DOMAIN_MASTER 0x80000 +#define SV_TYPE_SERVER_OSF 0x100000 +#define SV_TYPE_SERVER_VMS 0x200000 +#define SV_TYPE_WINDOWS 0x400000 +#define SV_TYPE_ALTERNATE_XPORT 0x20000000 +#define SV_TYPE_LOCAL_LIST_ONLY 0x40000000 +#define SV_TYPE_DOMAIN_ENUM 0x80000000 +#define SV_TYPE_ALL 0xFFFFFFFF +#define SV_NODISC (-1) +#define SV_USERSECURITY 1 +#define SV_SHARESECURITY 0 +#define SV_HIDDEN 1 +#define SV_VISIBLE 0 +#define SV_PLATFORM_ID_PARMNUM 101 +#define SV_NAME_PARMNUM 102 +#define SV_VERSION_MAJOR_PARMNUM 103 +#define SV_VERSION_MINOR_PARMNUM 104 +#define SV_TYPE_PARMNUM 105 +#define SV_COMMENT_PARMNUM 5 +#define SV_USERS_PARMNUM 107 +#define SV_DISC_PARMNUM 10 +#define SV_HIDDEN_PARMNUM 16 +#define SV_ANNOUNCE_PARMNUM 17 +#define SV_ANNDELTA_PARMNUM 18 +#define SV_USERPATH_PARMNUM 112 +#define SV_ULIST_MTIME_PARMNUM 401 +#define SV_GLIST_MTIME_PARMNUM 402 +#define SV_ALIST_MTIME_PARMNUM 403 +#define SV_ALERTS_PARMNUM 11 +#define SV_SECURITY_PARMNUM 405 +#define SV_NUMADMIN_PARMNUM 406 +#define SV_LANMASK_PARMNUM 407 +#define SV_GUESTACC_PARMNUM 408 +#define SV_CHDEVQ_PARMNUM 410 +#define SV_CHDEVJOBS_PARMNUM 411 +#define SV_CONNECTIONS_PARMNUM 412 +#define SV_SHARES_PARMNUM 413 +#define SV_OPENFILES_PARMNUM 414 +#define SV_SESSREQS_PARMNUM 417 +#define SV_ACTIVELOCKS_PARMNUM 419 +#define SV_NUMREQBUF_PARMNUM 420 +#define SV_NUMBIGBUF_PARMNUM 422 +#define SV_NUMFILETASKS_PARMNUM 423 +#define SV_ALERTSCHED_PARMNUM 37 +#define SV_ERRORALERT_PARMNUM 38 +#define SV_LOGONALERT_PARMNUM 39 +#define SV_ACCESSALERT_PARMNUM 40 +#define SV_DISKALERT_PARMNUM 41 +#define SV_NETIOALERT_PARMNUM 42 +#define SV_MAXAUDITSZ_PARMNUM 43 +#define SV_SRVHEURISTICS_PARMNUM 431 +#define SV_SESSOPENS_PARMNUM 501 +#define SV_SESSVCS_PARMNUM 502 +#define SV_OPENSEARCH_PARMNUM 503 +#define SV_SIZREQBUF_PARMNUM 504 +#define SV_INITWORKITEMS_PARMNUM 505 +#define SV_MAXWORKITEMS_PARMNUM 506 +#define SV_RAWWORKITEMS_PARMNUM 507 +#define SV_IRPSTACKSIZE_PARMNUM 508 +#define SV_MAXRAWBUFLEN_PARMNUM 509 +#define SV_SESSUSERS_PARMNUM 510 +#define SV_SESSCONNS_PARMNUM 511 +#define SV_MAXNONPAGEDMEMORYUSAGE_PARMNUM 512 +#define SV_MAXPAGEDMEMORYUSAGE_PARMNUM 513 +#define SV_ENABLESOFTCOMPAT_PARMNUM 514 +#define SV_ENABLEFORCEDLOGOFF_PARMNUM 515 +#define SV_TIMESOURCE_PARMNUM 516 +#define SV_ACCEPTDOWNLEVELAPIS_PARMNUM 517 +#define SV_LMANNOUNCE_PARMNUM 518 +#define SV_DOMAIN_PARMNUM 519 +#define SV_MAXCOPYREADLEN_PARMNUM 520 +#define SV_MAXCOPYWRITELEN_PARMNUM 521 +#define SV_MINKEEPSEARCH_PARMNUM 522 +#define SV_MAXKEEPSEARCH_PARMNUM 523 +#define SV_MINKEEPCOMPLSEARCH_PARMNUM 524 +#define SV_MAXKEEPCOMPLSEARCH_PARMNUM 525 +#define SV_THREADCOUNTADD_PARMNUM 526 +#define SV_NUMBLOCKTHREADS_PARMNUM 527 +#define SV_SCAVTIMEOUT_PARMNUM 528 +#define SV_MINRCVQUEUE_PARMNUM 529 +#define SV_MINFREEWORKITEMS_PARMNUM 530 +#define SV_XACTMEMSIZE_PARMNUM 531 +#define SV_THREADPRIORITY_PARMNUM 532 +#define SV_MAXMPXCT_PARMNUM 533 +#define SV_OPLOCKBREAKWAIT_PARMNUM 534 +#define SV_OPLOCKBREAKRESPONSEWAIT_PARMNUM 535 +#define SV_ENABLEOPLOCKS_PARMNUM 536 +#define SV_ENABLEOPLOCKFORCECLOSE_PARMNUM 537 +#define SV_ENABLEFCBOPENS_PARMNUM 538 +#define SV_ENABLERAW_PARMNUM 539 +#define SV_ENABLESHAREDNETDRIVES_PARMNUM 540 +#define SV_MINFREECONNECTIONS_PARMNUM 541 +#define SV_MAXFREECONNECTIONS_PARMNUM 542 +#define SV_INITSESSTABLE_PARMNUM 543 +#define SV_INITCONNTABLE_PARMNUM 544 +#define SV_INITFILETABLE_PARMNUM 545 +#define SV_INITSEARCHTABLE_PARMNUM 546 +#define SV_ALERTSCHEDULE_PARMNUM 547 +#define SV_ERRORTHRESHOLD_PARMNUM 548 +#define SV_NETWORKERRORTHRESHOLD_PARMNUM 549 +#define SV_DISKSPACETHRESHOLD_PARMNUM 550 +#define SV_MAXLINKDELAY_PARMNUM 552 +#define SV_MINLINKTHROUGHPUT_PARMNUM 553 +#define SV_LINKINFOVALIDTIME_PARMNUM 554 +#define SV_SCAVQOSINFOUPDATETIME_PARMNUM 555 +#define SV_MAXWORKITEMIDLETIME_PARMNUM 556 +#define SV_MAXRAWWORKITEMS_PARMNUM 557 +#define SV_PRODUCTTYPE_PARMNUM 560 +#define SV_SERVERSIZE_PARMNUM 561 +#define SV_CONNECTIONLESSAUTODISC_PARMNUM 562 +#define SV_SHARINGVIOLATIONRETRIES_PARMNUM 563 +#define SV_SHARINGVIOLATIONDELAY_PARMNUM 564 +#define SV_MAXGLOBALOPENSEARCH_PARMNUM 565 +#define SV_REMOVEDUPLICATESEARCHES_PARMNUM 566 +#define SV_LOCKVIOLATIONRETRIES_PARMNUM 567 +#define SV_LOCKVIOLATIONOFFSET_PARMNUM 568 +#define SV_LOCKVIOLATIONDELAY_PARMNUM 569 +#define SV_MDLREADSWITCHOVER_PARMNUM 570 +#define SV_CACHEDOPENLIMIT_PARMNUM 571 +#define SV_CRITICALTHREADS_PARMNUM 572 +#define SV_RESTRICTNULLSESSACCESS_PARMNUM 573 +#define SV_ENABLEWFW311DIRECTIPX_PARMNUM 574 +#define SV_OTHERQUEUEAFFINITY_PARMNUM 575 +#define SV_QUEUESAMPLESECS_PARMNUM 576 +#define SV_BALANCECOUNT_PARMNUM 577 +#define SV_PREFERREDAFFINITY_PARMNUM 578 +#define SV_MAXFREERFCBS_PARMNUM 579 +#define SV_MAXFREEMFCBS_PARMNUM 580 +#define SV_MAXFREELFCBS_PARMNUM 581 +#define SV_MAXFREEPAGEDPOOLCHUNKS_PARMNUM 582 +#define SV_MINPAGEDPOOLCHUNKSIZE_PARMNUM 583 +#define SV_MAXPAGEDPOOLCHUNKSIZE_PARMNUM 584 +#define SV_SENDSFROMPREFERREDPROCESSOR_PARMNUM 585 +#define SV_MAXTHREADSPERQUEUE_PARMNUM 586 +#define SV_COMMENT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_COMMENT_PARMNUM) +#define SV_USERS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_USERS_PARMNUM) +#define SV_DISC_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_DISC_PARMNUM) +#define SV_HIDDEN_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_HIDDEN_PARMNUM) +#define SV_ANNOUNCE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_ANNOUNCE_PARMNUM) +#define SV_ANNDELTA_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_ANNDELTA_PARMNUM) +#define SV_SESSOPENS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_SESSOPENS_PARMNUM) +#define SV_SESSVCS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_SESSVCS_PARMNUM) +#define SV_OPENSEARCH_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_OPENSEARCH_PARMNUM) +#define SV_MAXWORKITEMS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXWORKITEMS_PARMNUM) +#define SV_MAXRAWBUFLEN_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXRAWBUFLEN_PARMNUM) +#define SV_SESSUSERS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_SESSUSERS_PARMNUM) +#define SV_SESSCONNS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_SESSCONNS_PARMNUM) +#define SV_MAXNONPAGEDMEMORYUSAGE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXNONPAGEDMEMORYUSAGE_PARMNUM) +#define SV_MAXPAGEDMEMORYUSAGE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXPAGEDMEMORYUSAGE_PARMNUM) +#define SV_ENABLESOFTCOMPAT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_ENABLESOFTCOMPAT_PARMNUM) +#define SV_ENABLEFORCEDLOGOFF_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_ENABLEFORCEDLOGOFF_PARMNUM) +#define SV_TIMESOURCE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_TIMESOURCE_PARMNUM) +#define SV_LMANNOUNCE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_LMANNOUNCE_PARMNUM) +#define SV_MAXCOPYREADLEN_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXCOPYREADLEN_PARMNUM) +#define SV_MAXCOPYWRITELEN_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXCOPYWRITELEN_PARMNUM) +#define SV_MINKEEPSEARCH_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MINKEEPSEARCH_PARMNUM) +#define SV_MAXKEEPSEARCH_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXKEEPSEARCH_PARMNUM) +#define SV_MINKEEPCOMPLSEARCH_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MINKEEPCOMPLSEARCH_PARMNUM) +#define SV_MAXKEEPCOMPLSEARCH_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXKEEPCOMPLSEARCH_PARMNUM) +#define SV_SCAVTIMEOUT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_SCAVTIMEOUT_PARMNUM) +#define SV_MINRCVQUEUE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MINRCVQUEUE_PARMNUM) +#define SV_MINFREEWORKITEMS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MINFREEWORKITEMS_PARMNUM) +#define SV_MAXMPXCT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXMPXCT_PARMNUM) +#define SV_OPLOCKBREAKWAIT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_OPLOCKBREAKWAIT_PARMNUM) +#define SV_OPLOCKBREAKRESPONSEWAIT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_OPLOCKBREAKRESPONSEWAIT_PARMNUM) +#define SV_ENABLEOPLOCKS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_ENABLEOPLOCKS_PARMNUM) +#define SV_ENABLEOPLOCKFORCECLOSE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_ENABLEOPLOCKFORCECLOSE_PARMNUM) +#define SV_ENABLEFCBOPENS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_ENABLEFCBOPENS_PARMNUM) +#define SV_ENABLERAW_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_ENABLERAW_PARMNUM) +#define SV_ENABLESHAREDNETDRIVES_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_ENABLESHAREDNETDRIVES_PARMNUM) +#define SV_MINFREECONNECTIONS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MINFREECONNECTIONS_PARMNUM) +#define SV_MAXFREECONNECTIONS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXFREECONNECTIONS_PARMNUM) +#define SV_INITSESSTABLE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_INITSESSTABLE_PARMNUM) +#define SV_INITCONNTABLE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_INITCONNTABLE_PARMNUM) +#define SV_INITFILETABLE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_INITFILETABLE_PARMNUM) +#define SV_INITSEARCHTABLE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_INITSEARCHTABLE_PARMNUM) +#define SV_ALERTSCHEDULE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_ALERTSCHEDULE_PARMNUM) +#define SV_ERRORTHRESHOLD_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_ERRORTHRESHOLD_PARMNUM) +#define SV_NETWORKERRORTHRESHOLD_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_NETWORKERRORTHRESHOLD_PARMNUM) +#define SV_DISKSPACETHRESHOLD_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_DISKSPACETHRESHOLD_PARMNUM) +#define SV_MAXLINKDELAY_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXLINKDELAY_PARMNUM) +#define SV_MINLINKTHROUGHPUT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MINLINKTHROUGHPUT_PARMNUM) +#define SV_LINKINFOVALIDTIME_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_LINKINFOVALIDTIME_PARMNUM) +#define SV_SCAVQOSINFOUPDATETIME_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_SCAVQOSINFOUPDATETIME_PARMNUM) +#define SV_MAXWORKITEMIDLETIME_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXWORKITEMIDLETIME_PARMNUM) +#define SV_MAXRAWWORKITEMS_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXRAWWORKITEMS_PARMNUM) +#define SV_PRODUCTTYPE_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_PRODUCTTYPE_PARMNUM) +#define SV_SERVERSIZE_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_SERVERSIZE_PARMNUM) +#define SV_CONNECTIONLESSAUTODISC_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_CONNECTIONLESSAUTODISC_PARMNUM) +#define SV_SHARINGVIOLATIONRETRIES_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_SHARINGVIOLATIONRETRIES_PARMNUM) +#define SV_SHARINGVIOLATIONDELAY_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_SHARINGVIOLATIONDELAY_PARMNUM) +#define SV_MAXGLOBALOPENSEARCH_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXGLOBALOPENSEARCH_PARMNUM) +#define SV_REMOVEDUPLICATESEARCHES_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_REMOVEDUPLICATESEARCHES_PARMNUM) +#define SV_LOCKVIOLATIONRETRIES_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_LOCKVIOLATIONRETRIES_PARMNUM) +#define SV_LOCKVIOLATIONOFFSET_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_LOCKVIOLATIONOFFSET_PARMNUM) +#define SV_LOCKVIOLATIONDELAY_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_LOCKVIOLATIONDELAY_PARMNUM) +#define SV_MDLREADSWITCHOVER_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_MDLREADSWITCHOVER_PARMNUM) +#define SV_CACHEDOPENLIMIT_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_CACHEDOPENLIMIT_PARMNUM) +#define SV_CRITICALTHREADS_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_CRITICALTHREADS_PARMNUM) +#define SV_RESTRICTNULLSESSACCESS_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_RESTRICTNULLSESSACCESS_PARMNUM) +#define SV_ENABLEWFW311DIRECTIPX_INFOLOEVEL (PARMNUM_BASE_INFOLEVEL+SV_ENABLEWFW311DIRECTIPX_PARMNUM) +#define SV_OTHERQUEUEAFFINITY_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_OTHERQUEUEAFFINITY_PARMNUM) +#define SV_QUEUESAMPLESECS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_QUEUESAMPLESECS_PARMNUM) +#define SV_BALANCECOUNT_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_BALANCECOUNT_PARMNUM) +#define SV_PREFERREDAFFINITY_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_PREFERREDAFFINITY_PARMNUM) +#define SV_MAXFREERFCBS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXFREERFCBS_PARMNUM) +#define SV_MAXFREEMFCBS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXFREEMFCBS_PARMNUM) +#define SV_MAXFREELFCBS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXFREELFCBS_PARMNUM) +#define SV_MAXFREEPAGEDPOOLCHUNKS_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXFREEPAGEDPOOLCHUNKS_PARMNUM) +#define SV_MINPAGEDPOOLCHUNKSIZE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MINPAGEDPOOLCHUNKSIZE_PARMNUM) +#define SV_MAXPAGEDPOOLCHUNKSIZE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXPAGEDPOOLCHUNKSIZE_PARMNUM) +#define SV_SENDSFROMPREFERREDPROCESSOR_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_SENDSFROMPREFERREDPROCESSOR_PARMNUM) +#define SV_MAXTHREADSPERQUEUE_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SV_MAXTHREADSPERQUEUE_PARMNUM) +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/lmshare.h b/reactos/w32api/include/lmshare.h new file mode 100644 index 00000000000..07fe9270bd5 --- /dev/null +++ b/reactos/w32api/include/lmshare.h @@ -0,0 +1,147 @@ +#ifndef _LMSHARE_H +#define _LMSHARE_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#include <lmcons.h> +#define SHARE_NETNAME_PARMNUM 1 +#define SHARE_TYPE_PARMNUM 3 +#define SHARE_REMARK_PARMNUM 4 +#define SHARE_PERMISSIONS_PARMNUM 5 +#define SHARE_MAX_USES_PARMNUM 6 +#define SHARE_CURRENT_USES_PARMNUM 7 +#define SHARE_PATH_PARMNUM 8 +#define SHARE_PASSWD_PARMNUM 9 +#define SHARE_FILE_SD_PARMNUM 501 +#define SHARE_REMARK_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SHARE_REMARK_PARMNUM) +#define SHARE_MAX_USES_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SHARE_MAX_USES_PARMNUM) +#define SHARE_FILE_SD_INFOLEVEL (PARMNUM_BASE_INFOLEVEL+SHARE_FILE_SD_PARMNUM) +#define SHI1_NUM_ELEMENTS 4 +#define SHI2_NUM_ELEMENTS 10 +#define STYPE_DISKTREE 0 +#define STYPE_PRINTQ 1 +#define STYPE_DEVICE 2 +#define STYPE_IPC 3 +#define STYPE_DFS 100 +#define STYPE_SPECIAL 0x80000000 +#define SHI_USES_UNLIMITED (DWORD)(-1) +#define SESS_GUEST 1 +#define SESS_NOENCRYPTION 2 +#define SESI1_NUM_ELEMENTS 8 +#define SESI2_NUM_ELEMENTS 9 +#define PERM_FILE_READ 1 +#define PERM_FILE_WRITE 2 +#define PERM_FILE_CREATE 4 +typedef struct _FILE_INFO_2 { DWORD fi2_id;} FILE_INFO_2,*PFILE_INFO_2,*LPFILE_INFO_2; +typedef struct _FILE_INFO_3 { + DWORD fi3_id; + DWORD fi3_permissions; + DWORD fi3_num_locks; + LPTSTR fi3_pathname; + LPTSTR fi3_username; +} FILE_INFO_3,*PFILE_INFO_3,*LPFILE_INFO_3; +typedef struct _SHARE_INFO_0 { LPTSTR shi0_netname; } SHARE_INFO_0,*PSHARE_INFO_0,*LPSHARE_INFO_0; +typedef struct _SHARE_INFO_1 { + LPTSTR shi1_netname; + DWORD shi1_type; + LPTSTR shi1_remark; +} SHARE_INFO_1,*PSHARE_INFO_1,*LPSHARE_INFO_1; +typedef struct _SHARE_INFO_2 { + LPTSTR shi2_netname; + DWORD shi2_type; + LPTSTR shi2_remark; + DWORD shi2_permissions; + DWORD shi2_max_uses; + DWORD shi2_current_uses; + LPTSTR shi2_path; + LPTSTR shi2_passwd; +} SHARE_INFO_2,*PSHARE_INFO_2,*LPSHARE_INFO_2; +typedef struct _SHARE_INFO_502 { + LPTSTR shi502_netname; + DWORD shi502_type; + LPTSTR shi502_remark; + DWORD shi502_permissions; + DWORD shi502_max_uses; + DWORD shi502_current_uses; + LPTSTR shi502_path; + LPTSTR shi502_passwd; + DWORD shi502_reserved; + PSECURITY_DESCRIPTOR shi502_security_descriptor; +} SHARE_INFO_502,*PSHARE_INFO_502,*LPSHARE_INFO_502; +typedef struct _SHARE_INFO_1004 { + LPTSTR shi1004_remark; +} SHARE_INFO_1004,*PSHARE_INFO_1004,*LPSHARE_INFO_1004; +typedef struct _SHARE_INFO_1006 { + DWORD shi1006_max_uses; +} SHARE_INFO_1006,*PSHARE_INFO_1006,*LPSHARE_INFO_1006; +typedef struct _SHARE_INFO_1501 { + DWORD shi1501_reserved; + PSECURITY_DESCRIPTOR shi1501_security_descriptor; +} SHARE_INFO_1501,*PSHARE_INFO_1501,*LPSHARE_INFO_1501; +typedef struct _SESSION_INFO_0 { LPWSTR sesi0_cname; } SESSION_INFO_0,*PSESSION_INFO_0,*LPSESSION_INFO_0; +typedef struct _SESSION_INFO_1 { + LPTSTR sesi1_cname; + LPTSTR sesi1_username; + DWORD sesi1_num_opens; + DWORD sesi1_time; + DWORD sesi1_idle_time; + DWORD sesi1_user_flags; +} SESSION_INFO_1,*PSESSION_INFO_1,*LPSESSION_INFO_1; +typedef struct _SESSION_INFO_2 { + LPTSTR sesi2_cname; + LPTSTR sesi2_username; + DWORD sesi2_num_opens; + DWORD sesi2_time; + DWORD sesi2_idle_time; + DWORD sesi2_user_flags; + LPWSTR sesi2_cltype_name; +} SESSION_INFO_2,*PSESSION_INFO_2,*LPSESSION_INFO_2; +typedef struct _SESSION_INFO_10 { + LPWSTR sesi10_cname; + LPWSTR sesi10_username; + DWORD sesi10_time; + DWORD sesi10_idle_time; +} SESSION_INFO_10,*PSESSION_INFO_10,*LPSESSION_INFO_10; +typedef struct _SESSION_INFO_502 { + LPWSTR sesi502_cname; + LPWSTR sesi502_username; + DWORD sesi502_num_opens; + DWORD sesi502_time; + DWORD sesi502_idle_time; + DWORD sesi502_user_flags; + LPWSTR sesi502_cltype_name; + LPWSTR sesi502_transport; +} SESSION_INFO_502,*PSESSION_INFO_502,*LPSESSION_INFO_502; +typedef struct _CONNECTION_INFO_0 { DWORD coni0_id; } CONNECTION_INFO_0,*PCONNECTION_INFO_0,*LPCONNECTION_INFO_0; +typedef struct _CONNECTION_INFO_1 { + DWORD coni1_id; + DWORD coni1_type; + DWORD coni1_num_opens; + DWORD coni1_num_users; + DWORD coni1_time; + LPWSTR coni1_username; + LPWSTR coni1_netname; +} CONNECTION_INFO_1,*PCONNECTION_INFO_1,*LPCONNECTION_INFO_1; +NET_API_STATUS WINAPI NetShareAdd(LPWSTR,DWORD,PBYTE,PDWORD); +NET_API_STATUS WINAPI NetShareEnum(LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); +NET_API_STATUS WINAPI NetShareEnumSticky(LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD resume_handle); +NET_API_STATUS WINAPI NetShareGetInfo(LPWSTR,LPWSTR,DWORD,PBYTE*); +NET_API_STATUS WINAPI NetShareSetInfo(LPWSTR,LPWSTR,DWORD,PBYTE,PDWORD); +NET_API_STATUS WINAPI NetShareDel(LPWSTR,LPWSTR,DWORD); +NET_API_STATUS WINAPI NetShareDelSticky(LPWSTR,LPWSTR,DWORD); +NET_API_STATUS WINAPI NetShareCheck(LPWSTR,LPWSTR,PDWORD); +NET_API_STATUS WINAPI NetSessionEnum(LPWSTR,LPWSTR,LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); +NET_API_STATUS WINAPI NetSessionDel(LPWSTR,LPWSTR,LPWSTR); +NET_API_STATUS WINAPI NetSessionGetInfo(LPWSTR,LPWSTR,LPWSTR,DWORD,PBYTE*); +NET_API_STATUS WINAPI NetConnectionEnum(LPWSTR,LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); +NET_API_STATUS WINAPI NetFileClose(LPWSTR,DWORD); +NET_API_STATUS WINAPI NetFileEnum(LPWSTR,LPWSTR,LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); +NET_API_STATUS WINAPI NetFileGetInfo(LPWSTR,DWORD,DWORD,PBYTE*); +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/lmsname.h b/reactos/w32api/include/lmsname.h new file mode 100644 index 00000000000..a840cb21fda --- /dev/null +++ b/reactos/w32api/include/lmsname.h @@ -0,0 +1,58 @@ +#ifndef _LMSNAME_H +#define _LMSNAME_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#define SERVICE_WORKSTATION TEXT("LanmanWorkstation") +#define SERVICE_LM20_WORKSTATION TEXT("WORKSTATION") +#define WORKSTATION_DISPLAY_NAME TEXT("Workstation") +#define SERVICE_SERVER TEXT("LanmanServer") +#define SERVICE_LM20_SERVER TEXT("SERVER") +#define SERVER_DISPLAY_NAME TEXT("Server") +#define SERVICE_BROWSER TEXT("BROWSER") +#define SERVICE_LM20_BROWSER SERVICE_BROWSER +#define SERVICE_MESSENGER TEXT("MESSENGER") +#define SERVICE_LM20_MESSENGER SERVICE_MESSENGER +#define SERVICE_NETRUN TEXT("NETRUN") +#define SERVICE_LM20_NETRUN SERVICE_NETRUN +#define SERVICE_SPOOLER TEXT("SPOOLER") +#define SERVICE_LM20_SPOOLER SERVICE_SPOOLER +#define SERVICE_ALERTER TEXT("ALERTER") +#define SERVICE_LM20_ALERTER SERVICE_ALERTER +#define SERVICE_NETLOGON TEXT("NETLOGON") +#define SERVICE_LM20_NETLOGON SERVICE_NETLOGON +#define SERVICE_NETPOPUP TEXT("NETPOPUP") +#define SERVICE_LM20_NETPOPUP SERVICE_NETPOPUP +#define SERVICE_SQLSERVER TEXT("SQLSERVER") +#define SERVICE_LM20_SQLSERVER SERVICE_SQLSERVER +#define SERVICE_REPL TEXT("REPLICATOR") +#define SERVICE_LM20_REPL SERVICE_REPL +#define SERVICE_RIPL TEXT("REMOTEBOOT") +#define SERVICE_LM20_RIPL SERVICE_RIPL +#define SERVICE_TIMESOURCE TEXT("TIMESOURCE") +#define SERVICE_LM20_TIMESOURCE SERVICE_TIMESOURCE +#define SERVICE_AFP TEXT("AFP") +#define SERVICE_LM20_AFP SERVICE_AFP +#define SERVICE_UPS TEXT("UPS") +#define SERVICE_LM20_UPS SERVICE_UPS +#define SERVICE_XACTSRV TEXT("XACTSRV") +#define SERVICE_LM20_XACTSRV SERVICE_XACTSRV +#define SERVICE_TCPIP TEXT("TCPIP") +#define SERVICE_LM20_TCPIP SERVICE_TCPIP +#define SERVICE_NBT TEXT("NBT") +#define SERVICE_LM20_NBT SERVICE_NBT +#define SERVICE_LMHOSTS TEXT("LMHOSTS") +#define SERVICE_LM20_LMHOSTS SERVICE_LMHOSTS +#define SERVICE_TELNET TEXT("Telnet") +#define SERVICE_LM20_TELNET SERVICE_TELNET +#define SERVICE_SCHEDULE TEXT("Schedule") +#define SERVICE_LM20_SCHEDULE SERVICE_SCHEDULE +#define SERVICE_NTLMSSP TEXT("NtLmSsp") +#define SERVICE_DHCP TEXT("DHCP") +#define SERVICE_LM20_DHCP SERVICE_DHCP +#define SERVICE_NWSAP TEXT("NwSapAgent") +#define SERVICE_LM20_NWSAP SERVICE_NWSAP +#define NWSAP_DISPLAY_NAME TEXT("NW Sap Agent") +#define SERVICE_NWCS TEXT("NWCWorkstation") +#endif diff --git a/reactos/w32api/include/lmstats.h b/reactos/w32api/include/lmstats.h new file mode 100644 index 00000000000..2a4a2c2e366 --- /dev/null +++ b/reactos/w32api/include/lmstats.h @@ -0,0 +1,114 @@ +#ifndef _LMSTATS_H +#define _LMSTATS_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define STATSOPT_CLR 1 +#define STATS_NO_VALUE ((ULONG)-1) +#define STATS_OVERFLOW ((ULONG)-2) +typedef struct _STAT_SERVER_0 { + DWORD sts0_start; + DWORD sts0_fopens; + DWORD sts0_devopens; + DWORD sts0_jobsqueued; + DWORD sts0_sopens; + DWORD sts0_stimedout; + DWORD sts0_serrorout; + DWORD sts0_pwerrors; + DWORD sts0_permerrors; + DWORD sts0_syserrors; + DWORD sts0_bytessent_low; + DWORD sts0_bytessent_high; + DWORD sts0_bytesrcvd_low; + DWORD sts0_bytesrcvd_high; + DWORD sts0_avresponse; + DWORD sts0_reqbufneed; + DWORD sts0_bigbufneed; +} STAT_SERVER_0,*PSTAT_SERVER_0,*LPSTAT_SERVER_0; +#ifdef LM20_WORKSTATION_STATISTICS +typedef struct _STAT_WORKSTATION_0 { + DWORD stw0_start; + DWORD stw0_numNCB_r; + DWORD stw0_numNCB_s; + DWORD stw0_numNCB_a; + DWORD stw0_fiNCB_r; + DWORD stw0_fiNCB_s; + DWORD stw0_fiNCB_a; + DWORD stw0_fcNCB_r; + DWORD stw0_fcNCB_s; + DWORD stw0_fcNCB_a; + DWORD stw0_sesstart; + DWORD stw0_sessfailcon; + DWORD stw0_sessbroke; + DWORD stw0_uses; + DWORD stw0_usefail; + DWORD stw0_autorec; + DWORD stw0_bytessent_r_lo; + DWORD stw0_bytessent_r_hi; + DWORD stw0_bytesrcvd_r_lo; + DWORD stw0_bytesrcvd_r_hi; + DWORD stw0_bytessent_s_lo; + DWORD stw0_bytessent_s_hi; + DWORD stw0_bytesrcvd_s_lo; + DWORD stw0_bytesrcvd_s_hi; + DWORD stw0_bytessent_a_lo; + DWORD stw0_bytessent_a_hi; + DWORD stw0_bytesrcvd_a_lo; + DWORD stw0_bytesrcvd_a_hi; + DWORD stw0_reqbufneed; + DWORD stw0_bigbufneed; +} STAT_WORKSTATION_0,*PSTAT_WORKSTATION_0,*LPSTAT_WORKSTATION_0; +#else +typedef struct _STAT_WORKSTATION_0 { + LARGE_INTEGER StatisticsStartTime; + LARGE_INTEGER BytesReceived; + LARGE_INTEGER SmbsReceived; + LARGE_INTEGER PagingReadBytesRequested; + LARGE_INTEGER NonPagingReadBytesRequested; + LARGE_INTEGER CacheReadBytesRequested; + LARGE_INTEGER NetworkReadBytesRequested; + LARGE_INTEGER BytesTransmitted; + LARGE_INTEGER SmbsTransmitted; + LARGE_INTEGER PagingWriteBytesRequested; + LARGE_INTEGER NonPagingWriteBytesRequested; + LARGE_INTEGER CacheWriteBytesRequested; + LARGE_INTEGER NetworkWriteBytesRequested; + DWORD InitiallyFailedOperations; + DWORD FailedCompletionOperations; + DWORD ReadOperations; + DWORD RandomReadOperations; + DWORD ReadSmbs; + DWORD LargeReadSmbs; + DWORD SmallReadSmbs; + DWORD WriteOperations; + DWORD RandomWriteOperations; + DWORD WriteSmbs; + DWORD LargeWriteSmbs; + DWORD SmallWriteSmbs; + DWORD RawReadsDenied; + DWORD RawWritesDenied; + DWORD NetworkErrors; + DWORD Sessions; + DWORD FailedSessions; + DWORD Reconnects; + DWORD CoreConnects; + DWORD Lanman20Connects; + DWORD Lanman21Connects; + DWORD LanmanNtConnects; + DWORD ServerDisconnects; + DWORD HungSessions; + DWORD UseCount; + DWORD FailedUseCount; + DWORD CurrentCommands; +} STAT_WORKSTATION_0,*PSTAT_WORKSTATION_0,*LPSTAT_WORKSTATION_0; +#endif + +NET_API_STATUS WINAPI NetStatisticsGet(LPWSTR,LPWSTR,DWORD,DWORD,PBYTE*); +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/lmsvc.h b/reactos/w32api/include/lmsvc.h new file mode 100644 index 00000000000..bb19ee058f8 --- /dev/null +++ b/reactos/w32api/include/lmsvc.h @@ -0,0 +1,134 @@ +#ifndef _LMSVC_H +#define _LMSVC_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#include <lmsname.h> +#define SERVICE_DOS_ENCRYPTION TEXT("ENCRYPT") +#define SERVICE_UNINSTALLED 0 +#define SERVICE_INSTALL_PENDING 1 +#define SERVICE_UNINSTALL_PENDING 2 +#define SERVICE_INSTALLED 3 +#define SERVICE_INSTALL_STATE 3 +#define SERVICE_PAUSE_STATE 18 +#define LM20_SERVICE_ACTIVE 0 +#define LM20_SERVICE_CONTINUE_PENDING 4 +#define LM20_SERVICE_PAUSE_PENDING 8 +#define LM20_SERVICE_PAUSED 18 +#define SERVICE_NOT_UNINSTALLABLE 0 +#define SERVICE_UNINSTALLABLE 16 +#define SERVICE_NOT_PAUSABLE 0 +#define SERVICE_PAUSABLE 32 +#define SERVICE_REDIR_PAUSED 0x700 +#define SERVICE_REDIR_DISK_PAUSED 256 +#define SERVICE_REDIR_PRINT_PAUSED 512 +#define SERVICE_REDIR_COMM_PAUSED 1024 +#define SERVICE_CTRL_INTERROGATE 0 +#define SERVICE_CTRL_PAUSE 1 +#define SERVICE_CTRL_CONTINUE 2 +#define SERVICE_CTRL_UNINSTALL 3 +#define SERVICE_CTRL_REDIR_DISK 1 +#define SERVICE_CTRL_REDIR_PRINT 2 +#define SERVICE_CTRL_REDIR_COMM 4 +#define SERVICE_IP_NO_HINT 0 +#define SERVICE_CCP_NO_HINT 0 +#define SERVICE_IP_QUERY_HINT 0x10000 +#define SERVICE_CCP_QUERY_HINT 0x10000 +#define SERVICE_IP_CHKPT_NUM 255 +#define SERVICE_CCP_CHKPT_NUM 255 +#define SERVICE_IP_WAIT_TIME 0xFF00 +#define SERVICE_CCP_WAIT_TIME 0xFF00 +#define SERVICE_IP_WAITTIME_SHIFT 8 +#define SERVICE_NTIP_WAITTIME_SHIFT 12 +#define UPPER_HINT_MASK 0xFF00 +#define LOWER_HINT_MASK 255 +#define UPPER_GET_HINT_MASK 0xFF00000 +#define LOWER_GET_HINT_MASK 0xFF00 +#define SERVICE_NT_MAXTIME 0xFFFF +#define SERVICE_RESRV_MASK 0x1FFFF +#define SERVICE_MAXTIME 255 +#define SERVICE_BASE 3050 +#define SERVICE_UIC_NORMAL 0 +#define SERVICE_UIC_BADPARMVAL (SERVICE_BASE+1) +#define SERVICE_UIC_MISSPARM (SERVICE_BASE+2) +#define SERVICE_UIC_UNKPARM (SERVICE_BASE+3) +#define SERVICE_UIC_RESOURCE (SERVICE_BASE+4) +#define SERVICE_UIC_CONFIG (SERVICE_BASE+5) +#define SERVICE_UIC_SYSTEM (SERVICE_BASE+6) +#define SERVICE_UIC_INTERNAL (SERVICE_BASE+7) +#define SERVICE_UIC_AMBIGPARM (SERVICE_BASE+8) +#define SERVICE_UIC_DUPPARM (SERVICE_BASE+9) +#define SERVICE_UIC_KILL (SERVICE_BASE+10) +#define SERVICE_UIC_EXEC (SERVICE_BASE+11) +#define SERVICE_UIC_SUBSERV (SERVICE_BASE+12) +#define SERVICE_UIC_CONFLPARM (SERVICE_BASE+13) +#define SERVICE_UIC_FILE (SERVICE_BASE+14) +#define SERVICE_UIC_M_NULL 0 +#define SERVICE_UIC_M_MEMORY (SERVICE_BASE+20) +#define SERVICE_UIC_M_DISK (SERVICE_BASE+21) +#define SERVICE_UIC_M_THREADS (SERVICE_BASE+22) +#define SERVICE_UIC_M_PROCESSES (SERVICE_BASE+23) +#define SERVICE_UIC_M_SECURITY (SERVICE_BASE+24) +#define SERVICE_UIC_M_LANROOT (SERVICE_BASE+25) +#define SERVICE_UIC_M_REDIR (SERVICE_BASE+26) +#define SERVICE_UIC_M_SERVER (SERVICE_BASE+27) +#define SERVICE_UIC_M_SEC_FILE_ERR (SERVICE_BASE+28) +#define SERVICE_UIC_M_FILES (SERVICE_BASE+29) +#define SERVICE_UIC_M_LOGS (SERVICE_BASE+30) +#define SERVICE_UIC_M_LANGROUP (SERVICE_BASE+31) +#define SERVICE_UIC_M_MSGNAME (SERVICE_BASE+32) +#define SERVICE_UIC_M_ANNOUNCE (SERVICE_BASE+33) +#define SERVICE_UIC_M_UAS (SERVICE_BASE+34) +#define SERVICE_UIC_M_SERVER_SEC_ERR (SERVICE_BASE+35) +#define SERVICE_UIC_M_WKSTA (SERVICE_BASE+37) +#define SERVICE_UIC_M_ERRLOG (SERVICE_BASE+38) +#define SERVICE_UIC_M_FILE_UW (SERVICE_BASE+39) +#define SERVICE_UIC_M_ADDPAK (SERVICE_BASE+40) +#define SERVICE_UIC_M_LAZY (SERVICE_BASE+41) +#define SERVICE_UIC_M_UAS_MACHINE_ACCT (SERVICE_BASE+42) +#define SERVICE_UIC_M_UAS_SERVERS_NMEMB (SERVICE_BASE+43) +#define SERVICE_UIC_M_UAS_SERVERS_NOGRP (SERVICE_BASE+44) +#define SERVICE_UIC_M_UAS_INVALID_ROLE (SERVICE_BASE+45) +#define SERVICE_UIC_M_NETLOGON_NO_DC (SERVICE_BASE+46) +#define SERVICE_UIC_M_NETLOGON_DC_CFLCT (SERVICE_BASE+47) +#define SERVICE_UIC_M_NETLOGON_AUTH (SERVICE_BASE+48) +#define SERVICE_UIC_M_UAS_PROLOG (SERVICE_BASE+49) +#define SERVICE2_BASE 5600 +#define SERVICE_UIC_M_NETLOGON_MPATH (SERVICE2_BASE+0) +#define SERVICE_UIC_M_LSA_MACHINE_ACCT (SERVICE2_BASE+1) +#define SERVICE_UIC_M_DATABASE_ERROR (SERVICE2_BASE+2) + +typedef struct _SERVICE_INFO_0 { LPWSTR svci0_name;} SERVICE_INFO_0,*PSERVICE_INFO_0,* LPSERVICE_INFO_0; +typedef struct _SERVICE_INFO_1 { + LPWSTR svci1_name; + DWORD svci1_status; + DWORD svci1_code; + DWORD svci1_pid; +} SERVICE_INFO_1,*PSERVICE_INFO_1,* LPSERVICE_INFO_1; +typedef struct _SERVICE_INFO_2 { + LPWSTR svci2_name; + DWORD svci2_status; + DWORD svci2_code; + DWORD svci2_pid; + LPWSTR svci2_text; + DWORD svci2_specific_error; + LPWSTR svci2_display_name; +} SERVICE_INFO_2,*PSERVICE_INFO_2,* LPSERVICE_INFO_2; + +NET_API_STATUS WINAPI NetServiceControl(LPCWSTR,LPCWSTR,DWORD,DWORD,PBYTE*); +NET_API_STATUS WINAPI NetServiceEnum(LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); +NET_API_STATUS WINAPI NetServiceGetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE*); +NET_API_STATUS WINAPI NetServiceInstall(LPCWSTR,LPCWSTR,DWORD,LPCWSTR*,PBYTE*); +#define SERVICE_IP_CODE(t,n) ((long)SERVICE_IP_QUERY_HINT|(long)(n|(t<<SERVICE_IP_WAITTIME_SHIFT))) +#define SERVICE_CCP_CODE(t,n) ((long)SERVICE_CCP_QUERY_HINT|(long)(n|(t<<SERVICE_IP_WAITTIME_SHIFT))) +#define SERVICE_UIC_CODE(c,m) ((long)(((long)c<<16)|(long)(USHORT)m)) +#define SERVICE_NT_CCP_CODE(t,n) (((long)SERVICE_CCP_QUERY_HINT)|((long)(n))|(((t)&LOWER_HINT_MASK)<<SERVICE_IP_WAITTIME_SHIFT)|(((t)&UPPER_HINT_MASK)<<SERVICE_NTIP_WAITTIME_SHIFT)) +#define SERVICE_NT_WAIT_GET(c) ((((c)&UPPER_GET_HINT_MASK)>>SERVICE_NTIP_WAITTIME_SHIFT)|(((c)&LOWER_GET_HINT_MASK)>>SERVICE_IP_WAITTIME_SHIFT)) +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/lmuse.h b/reactos/w32api/include/lmuse.h new file mode 100644 index 00000000000..a63a71f3c8c --- /dev/null +++ b/reactos/w32api/include/lmuse.h @@ -0,0 +1,60 @@ +#ifndef _LMUSE_H +#define _LMUSE_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#include <lmuseflg.h> +#define USE_LOCAL_PARMNUM 1 +#define USE_REMOTE_PARMNUM 2 +#define USE_PASSWORD_PARMNUM 3 +#define USE_ASGTYPE_PARMNUM 4 +#define USE_USERNAME_PARMNUM 5 +#define USE_DOMAINNAME_PARMNUM 6 +#define USE_OK 0 +#define USE_PAUSED 1 +#define USE_SESSLOST 2 +#define USE_DISCONN 2 +#define USE_NETERR 3 +#define USE_CONN 4 +#define USE_RECONN 5 +#define USE_WILDCARD ((DWORD)-1) +#define USE_DISKDEV 0 +#define USE_SPOOLDEV 1 +#define USE_CHARDEV 2 +#define USE_IPC 3 +typedef struct _USE_INFO_0 { + LPWSTR ui0_local; + LPWSTR ui0_remote; +}USE_INFO_0,*PUSE_INFO_0,*LPUSE_INFO_0; +typedef struct _USE_INFO_1 { + LPWSTR ui1_local; + LPWSTR ui1_remote; + LPWSTR ui1_password; + DWORD ui1_status; + DWORD ui1_asg_type; + DWORD ui1_refcount; + DWORD ui1_usecount; +}USE_INFO_1,*PUSE_INFO_1,*LPUSE_INFO_1; +typedef struct _USE_INFO_2 { + LPWSTR ui2_local; + LPWSTR ui2_remote; + LPWSTR ui2_password; + DWORD ui2_status; + DWORD ui2_asg_type; + DWORD ui2_refcount; + DWORD ui2_usecount; + LPWSTR ui2_username; + LPWSTR ui2_domainname; +}USE_INFO_2,*PUSE_INFO_2,*LPUSE_INFO_2; +NET_API_STATUS WINAPI NetUseAdd(LPWSTR,DWORD,PBYTE,PDWORD); +NET_API_STATUS WINAPI NetUseDel(LPWSTR,LPWSTR,DWORD); +NET_API_STATUS WINAPI NetUseEnum(LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); +NET_API_STATUS WINAPI NetUseGetInfo(LPWSTR,LPWSTR,DWORD,PBYTE*); +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/lmuseflg.h b/reactos/w32api/include/lmuseflg.h new file mode 100644 index 00000000000..34162e4e556 --- /dev/null +++ b/reactos/w32api/include/lmuseflg.h @@ -0,0 +1,10 @@ +#ifndef _LMUSEFLG_H +#define _LMUSEFLG_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#define USE_NOFORCE 0 +#define USE_FORCE 1 +#define USE_LOTS_OF_FORCE 2 +#endif diff --git a/reactos/w32api/include/lmwksta.h b/reactos/w32api/include/lmwksta.h new file mode 100644 index 00000000000..a8c6ccbcd5e --- /dev/null +++ b/reactos/w32api/include/lmwksta.h @@ -0,0 +1,233 @@ +#ifndef _LMWKSTA_H +#define _LMWKSTA_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#include <lmuseflg.h> +#define WKSTA_PLATFORM_ID_PARMNUM 100 +#define WKSTA_COMPUTERNAME_PARMNUM 1 +#define WKSTA_LANGROUP_PARMNUM 2 +#define WKSTA_VER_MAJOR_PARMNUM 4 +#define WKSTA_VER_MINOR_PARMNUM 5 +#define WKSTA_LOGGED_ON_USERS_PARMNUM 6 +#define WKSTA_LANROOT_PARMNUM 7 +#define WKSTA_LOGON_DOMAIN_PARMNUM 8 +#define WKSTA_LOGON_SERVER_PARMNUM 9 +#define WKSTA_CHARWAIT_PARMNUM 10 +#define WKSTA_CHARTIME_PARMNUM 11 +#define WKSTA_CHARCOUNT_PARMNUM 12 +#define WKSTA_KEEPCONN_PARMNUM 13 +#define WKSTA_KEEPSEARCH_PARMNUM 14 +#define WKSTA_MAXCMDS_PARMNUM 15 +#define WKSTA_NUMWORKBUF_PARMNUM 16 +#define WKSTA_MAXWRKCACHE_PARMNUM 17 +#define WKSTA_SESSTIMEOUT_PARMNUM 18 +#define WKSTA_SIZERROR_PARMNUM 19 +#define WKSTA_NUMALERTS_PARMNUM 20 +#define WKSTA_NUMSERVICES_PARMNUM 21 +#define WKSTA_NUMCHARBUF_PARMNUM 22 +#define WKSTA_SIZCHARBUF_PARMNUM 23 +#define WKSTA_ERRLOGSZ_PARMNUM 27 +#define WKSTA_PRINTBUFTIME_PARMNUM 28 +#define WKSTA_SIZWORKBUF_PARMNUM 29 +#define WKSTA_MAILSLOTS_PARMNUM 30 +#define WKSTA_NUMDGRAMBUF_PARMNUM 31 +#define WKSTA_WRKHEURISTICS_PARMNUM 32 +#define WKSTA_MAXTHREADS_PARMNUM 33 +#define WKSTA_LOCKQUOTA_PARMNUM 41 +#define WKSTA_LOCKINCREMENT_PARMNUM 42 +#define WKSTA_LOCKMAXIMUM_PARMNUM 43 +#define WKSTA_PIPEINCREMENT_PARMNUM 44 +#define WKSTA_PIPEMAXIMUM_PARMNUM 45 +#define WKSTA_DORMANTFILELIMIT_PARMNUM 46 +#define WKSTA_CACHEFILETIMEOUT_PARMNUM 47 +#define WKSTA_USEOPPORTUNISTICLOCKING_PARMNUM 48 +#define WKSTA_USEUNLOCKBEHIND_PARMNUM 49 +#define WKSTA_USECLOSEBEHIND_PARMNUM 50 +#define WKSTA_BUFFERNAMEDPIPES_PARMNUM 51 +#define WKSTA_USELOCKANDREADANDUNLOCK_PARMNUM 52 +#define WKSTA_UTILIZENTCACHING_PARMNUM 53 +#define WKSTA_USERAWREAD_PARMNUM 54 +#define WKSTA_USERAWWRITE_PARMNUM 55 +#define WKSTA_USEWRITERAWWITHDATA_PARMNUM 56 +#define WKSTA_USEENCRYPTION_PARMNUM 57 +#define WKSTA_BUFFILESWITHDENYWRITE_PARMNUM 58 +#define WKSTA_BUFFERREADONLYFILES_PARMNUM 59 +#define WKSTA_FORCECORECREATEMODE_PARMNUM 60 +#define WKSTA_USE512BYTESMAXTRANSFER_PARMNUM 61 +#define WKSTA_READAHEADTHRUPUT_PARMNUM 62 +#define WKSTA_OTH_DOMAINS_PARMNUM 101 +#define TRANSPORT_QUALITYOFSERVICE_PARMNUM 201 +#define TRANSPORT_NAME_PARMNUM 202 + +typedef struct _WKSTA_INFO_100 { + DWORD wki100_platform_id; + LPWSTR wki100_computername; + LPWSTR wki100_langroup; + DWORD wki100_ver_major; + DWORD wki100_ver_minor; +}WKSTA_INFO_100,*PWKSTA_INFO_100,*LPWKSTA_INFO_100; +typedef struct _WKSTA_INFO_101 { + DWORD wki101_platform_id; + LPWSTR wki101_computername; + LPWSTR wki101_langroup; + DWORD wki101_ver_major; + DWORD wki101_ver_minor; + LPWSTR wki101_lanroot; +}WKSTA_INFO_101,*PWKSTA_INFO_101,*LPWKSTA_INFO_101; +typedef struct _WKSTA_INFO_102 { + DWORD wki102_platform_id; + LPWSTR wki102_computername; + LPWSTR wki102_langroup; + DWORD wki102_ver_major; + DWORD wki102_ver_minor; + LPWSTR wki102_lanroot; + DWORD wki102_logged_on_users; +}WKSTA_INFO_102,*PWKSTA_INFO_102,*LPWKSTA_INFO_102; +typedef struct _WKSTA_INFO_302{ + DWORD wki302_char_wait; + DWORD wki302_collection_time; + DWORD wki302_maximum_collection_count; + DWORD wki302_keep_conn; + DWORD wki302_keep_search; + DWORD wki302_max_cmds; + DWORD wki302_num_work_buf; + DWORD wki302_siz_work_buf; + DWORD wki302_max_wrk_cache; + DWORD wki302_sess_timeout; + DWORD wki302_siz_error; + DWORD wki302_num_alerts; + DWORD wki302_num_services; + DWORD wki302_errlog_sz; + DWORD wki302_print_buf_time; + DWORD wki302_num_char_buf; + DWORD wki302_siz_char_buf; + LPWSTR wki302_wrk_heuristics; + DWORD wki302_mailslots; + DWORD wki302_num_dgram_buf; +}WKSTA_INFO_302,*PWKSTA_INFO_302,*LPWKSTA_INFO_302; +typedef struct _WKSTA_INFO_402{ + DWORD wki402_char_wait; + DWORD wki402_collection_time; + DWORD wki402_maximum_collection_count; + DWORD wki402_keep_conn; + DWORD wki402_keep_search; + DWORD wki402_max_cmds; + DWORD wki402_num_work_buf; + DWORD wki402_siz_work_buf; + DWORD wki402_max_wrk_cache; + DWORD wki402_sess_timeout; + DWORD wki402_siz_error; + DWORD wki402_num_alerts; + DWORD wki402_num_services; + DWORD wki402_errlog_sz; + DWORD wki402_print_buf_time; + DWORD wki402_num_char_buf; + DWORD wki402_siz_char_buf; + LPWSTR wki402_wrk_heuristics; + DWORD wki402_mailslots; + DWORD wki402_num_dgram_buf; + DWORD wki402_max_threads; +}WKSTA_INFO_402,*PWKSTA_INFO_402,*LPWKSTA_INFO_402; +typedef struct _WKSTA_INFO_502{ + DWORD wki502_char_wait; + DWORD wki502_collection_time; + DWORD wki502_maximum_collection_count; + DWORD wki502_keep_conn; + DWORD wki502_max_cmds; + DWORD wki502_sess_timeout; + DWORD wki502_siz_char_buf; + DWORD wki502_max_threads; + DWORD wki502_lock_quota; + DWORD wki502_lock_increment; + DWORD wki502_lock_maximum; + DWORD wki502_pipe_increment; + DWORD wki502_pipe_maximum; + DWORD wki502_cache_file_timeout; + DWORD wki502_dormant_file_limit; + DWORD wki502_read_ahead_throughput; + DWORD wki502_num_mailslot_buffers; + DWORD wki502_num_srv_announce_buffers; + DWORD wki502_max_illegal_datagram_events; + DWORD wki502_illegal_datagram_event_reset_frequency; + BOOL wki502_log_election_packets; + BOOL wki502_use_opportunistic_locking; + BOOL wki502_use_unlock_behind; + BOOL wki502_use_close_behind; + BOOL wki502_buf_named_pipes; + BOOL wki502_use_lock_read_unlock; + BOOL wki502_utilize_nt_caching; + BOOL wki502_use_raw_read; + BOOL wki502_use_raw_write; + BOOL wki502_use_write_raw_data; + BOOL wki502_use_encryption; + BOOL wki502_buf_files_deny_write; + BOOL wki502_buf_read_only_files; + BOOL wki502_force_core_create_mode; + BOOL wki502_use_512_byte_max_transfer; +}WKSTA_INFO_502,*PWKSTA_INFO_502,*LPWKSTA_INFO_502; +typedef struct _WKSTA_INFO_1010 { DWORD wki1010_char_wait;} WKSTA_INFO_1010,*PWKSTA_INFO_1010,*LPWKSTA_INFO_1010; +typedef struct _WKSTA_INFO_1011 { DWORD wki1011_collection_time;} WKSTA_INFO_1011,*PWKSTA_INFO_1011,*LPWKSTA_INFO_1011; +typedef struct _WKSTA_INFO_1012 { DWORD wki1012_maximum_collection_count;} WKSTA_INFO_1012,*PWKSTA_INFO_1012,*LPWKSTA_INFO_1012; +typedef struct _WKSTA_INFO_1027 { DWORD wki1027_errlog_sz;} WKSTA_INFO_1027,*PWKSTA_INFO_1027,*LPWKSTA_INFO_1027; +typedef struct _WKSTA_INFO_1028 { DWORD wki1028_print_buf_time;} WKSTA_INFO_1028,*PWKSTA_INFO_1028,*LPWKSTA_INFO_1028; +typedef struct _WKSTA_INFO_1032 { DWORD wki1032_wrk_heuristics;} WKSTA_INFO_1032,*PWKSTA_INFO_1032,*LPWKSTA_INFO_1032; +typedef struct _WKSTA_INFO_1013 { DWORD wki1013_keep_conn;} WKSTA_INFO_1013,*PWKSTA_INFO_1013,*LPWKSTA_INFO_1013; +typedef struct _WKSTA_INFO_1018 { DWORD wki1018_sess_timeout;} WKSTA_INFO_1018,*PWKSTA_INFO_1018,*LPWKSTA_INFO_1018; +typedef struct _WKSTA_INFO_1023 { DWORD wki1023_siz_char_buf;} WKSTA_INFO_1023,*PWKSTA_INFO_1023,*LPWKSTA_INFO_1023; +typedef struct _WKSTA_INFO_1033 { DWORD wki1033_max_threads;} WKSTA_INFO_1033,*PWKSTA_INFO_1033,*LPWKSTA_INFO_1033; +typedef struct _WKSTA_INFO_1041 { DWORD wki1041_lock_quota;} WKSTA_INFO_1041,*PWKSTA_INFO_1041,*LPWKSTA_INFO_1041; +typedef struct _WKSTA_INFO_1042 { DWORD wki1042_lock_increment;} WKSTA_INFO_1042,*PWKSTA_INFO_1042,*LPWKSTA_INFO_1042; +typedef struct _WKSTA_INFO_1043 { DWORD wki1043_lock_maximum;} WKSTA_INFO_1043,*PWKSTA_INFO_1043,*LPWKSTA_INFO_1043; +typedef struct _WKSTA_INFO_1044 { DWORD wki1044_pipe_increment;} WKSTA_INFO_1044,*PWKSTA_INFO_1044,*LPWKSTA_INFO_1044; +typedef struct _WKSTA_INFO_1045 { DWORD wki1045_pipe_maximum;} WKSTA_INFO_1045,*PWKSTA_INFO_1045,*LPWKSTA_INFO_1045; +typedef struct _WKSTA_INFO_1046 { DWORD wki1046_dormant_file_limit;} WKSTA_INFO_1046,*PWKSTA_INFO_1046,*LPWKSTA_INFO_1046; +typedef struct _WKSTA_INFO_1047 { DWORD wki1047_cache_file_timeout;} WKSTA_INFO_1047,*PWKSTA_INFO_1047,*LPWKSTA_INFO_1047; +typedef struct _WKSTA_INFO_1048 { BOOL wki1048_use_opportunistic_locking;} WKSTA_INFO_1048,*PWKSTA_INFO_1048,*LPWKSTA_INFO_1048; +typedef struct _WKSTA_INFO_1049 { BOOL wki1049_use_unlock_behind;} WKSTA_INFO_1049,*PWKSTA_INFO_1049,*LPWKSTA_INFO_1049; +typedef struct _WKSTA_INFO_1050 { BOOL wki1050_use_close_behind;} WKSTA_INFO_1050,*PWKSTA_INFO_1050,*LPWKSTA_INFO_1050; +typedef struct _WKSTA_INFO_1051 { BOOL wki1051_buf_named_pipes;} WKSTA_INFO_1051,*PWKSTA_INFO_1051,*LPWKSTA_INFO_1051; +typedef struct _WKSTA_INFO_1052 { BOOL wki1052_use_lock_read_unlock;} WKSTA_INFO_1052,*PWKSTA_INFO_1052,*LPWKSTA_INFO_1052; +typedef struct _WKSTA_INFO_1053 { BOOL wki1053_utilize_nt_caching;} WKSTA_INFO_1053,*PWKSTA_INFO_1053,*LPWKSTA_INFO_1053; +typedef struct _WKSTA_INFO_1054 { BOOL wki1054_use_raw_read;} WKSTA_INFO_1054,*PWKSTA_INFO_1054,*LPWKSTA_INFO_1054; +typedef struct _WKSTA_INFO_1055 { BOOL wki1055_use_raw_write;} WKSTA_INFO_1055,*PWKSTA_INFO_1055,*LPWKSTA_INFO_1055; +typedef struct _WKSTA_INFO_1056 { BOOL wki1056_use_write_raw_data;} WKSTA_INFO_1056,*PWKSTA_INFO_1056,*LPWKSTA_INFO_1056; +typedef struct _WKSTA_INFO_1057 { BOOL wki1057_use_encryption;} WKSTA_INFO_1057,*PWKSTA_INFO_1057,*LPWKSTA_INFO_1057; +typedef struct _WKSTA_INFO_1058 { BOOL wki1058_buf_files_deny_write;} WKSTA_INFO_1058,*PWKSTA_INFO_1058,*LPWKSTA_INFO_1058; +typedef struct _WKSTA_INFO_1059 { BOOL wki1059_buf_read_only_files;} WKSTA_INFO_1059,*PWKSTA_INFO_1059,*LPWKSTA_INFO_1059; +typedef struct _WKSTA_INFO_1060 { BOOL wki1060_force_core_create_mode;} WKSTA_INFO_1060,*PWKSTA_INFO_1060,*LPWKSTA_INFO_1060; +typedef struct _WKSTA_INFO_1061 { BOOL wki1061_use_512_byte_max_transfer;} WKSTA_INFO_1061,*PWKSTA_INFO_1061,*LPWKSTA_INFO_1061; +typedef struct _WKSTA_INFO_1062 { DWORD wki1062_read_ahead_throughput;} WKSTA_INFO_1062,*PWKSTA_INFO_1062,*LPWKSTA_INFO_1062; +typedef struct _WKSTA_USER_INFO_0 { LPWSTR wkui0_username;}WKSTA_USER_INFO_0,*PWKSTA_USER_INFO_0,*LPWKSTA_USER_INFO_0; +typedef struct _WKSTA_USER_INFO_1 { + LPWSTR wkui1_username; + LPWSTR wkui1_logon_domain; + LPWSTR wkui1_oth_domains; + LPWSTR wkui1_logon_server; +}WKSTA_USER_INFO_1,*PWKSTA_USER_INFO_1,*LPWKSTA_USER_INFO_1; +typedef struct _WKSTA_USER_INFO_1101 { LPWSTR wkui1101_oth_domains;} WKSTA_USER_INFO_1101,*PWKSTA_USER_INFO_1101,*LPWKSTA_USER_INFO_1101; +typedef struct _WKSTA_TRANSPORT_INFO_0 { + DWORD wkti0_quality_of_service; + DWORD wkti0_number_of_vcs; + LPWSTR wkti0_transport_name; + LPWSTR wkti0_transport_address; + BOOL wkti0_wan_ish; +}WKSTA_TRANSPORT_INFO_0,*PWKSTA_TRANSPORT_INFO_0,*LPWKSTA_TRANSPORT_INFO_0; + +NET_API_STATUS WINAPI NetWkstaGetInfo(LPWSTR,DWORD,PBYTE*); +NET_API_STATUS WINAPI NetWkstaSetInfo(LPWSTR,DWORD,PBYTE,PDWORD); +NET_API_STATUS WINAPI NetWkstaUserGetInfo(LPWSTR,DWORD,PBYTE*); +NET_API_STATUS WINAPI NetWkstaUserSetInfo(LPWSTR,DWORD,PBYTE,PDWORD); +NET_API_STATUS WINAPI NetWkstaUserEnum(LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); +NET_API_STATUS WINAPI NetWkstaTransportAdd(LPWSTR,DWORD,PBYTE,PDWORD); +NET_API_STATUS WINAPI NetWkstaTransportDel(LPWSTR,LPWSTR,DWORD); +NET_API_STATUS WINAPI NetWkstaTransportEnum(LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/lzexpand.h b/reactos/w32api/include/lzexpand.h new file mode 100644 index 00000000000..68d4807a85f --- /dev/null +++ b/reactos/w32api/include/lzexpand.h @@ -0,0 +1,40 @@ +#ifndef _LZEXPAND_H +#define _LZEXPAND_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define LZERROR_BADINHANDLE (-1) +#define LZERROR_BADOUTHANDLE (-2) +#define LZERROR_READ (-3) +#define LZERROR_WRITE (-4) +#define LZERROR_GLOBALLOC (-5) +#define LZERROR_GLOBLOCK (-6) +#define LZERROR_BADVALUE (-7) +#define LZERROR_UNKNOWNALG (-8) +LONG WINAPI CopyLZFile(INT,INT); +INT WINAPI GetExpandedNameA(LPSTR,LPSTR); +INT WINAPI GetExpandedNameW(LPWSTR,LPWSTR); +VOID APIENTRY LZClose(INT); +LONG APIENTRY LZCopy(INT,INT); +VOID WINAPI LZDone(VOID); +INT WINAPI LZInit(INT); +INT WINAPI LZOpenFileA(LPSTR,LPOFSTRUCT,WORD); +INT WINAPI LZOpenFileW(LPWSTR,LPOFSTRUCT,WORD); +INT WINAPI LZRead(INT,LPSTR,INT); +LONG WINAPI LZSeek(INT,LONG,INT); +INT WINAPI LZStart(VOID); +#ifdef UNICODE +#define GetExpandedName GetExpandedNameW +#define LZOpenFile LZOpenFileW +#else +#define GetExpandedName GetExpandedNameA +#define LZOpenFile LZOpenFileA +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/mapi.h b/reactos/w32api/include/mapi.h new file mode 100644 index 00000000000..8474f892379 --- /dev/null +++ b/reactos/w32api/include/mapi.h @@ -0,0 +1,163 @@ +#ifndef _MAPI_H +#define _MAPI_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define SUCCESS_SUCCESS 0 +#define MAPI_USER_ABORT 1 +#define MAPI_E_USER_ABORT 1 +#define MAPI_E_FAILURE 2 +#define MAPI_E_LOGIN_FAILURE 3 +#define MAPI_E_LOGON_FAILURE 3 +#define MAPI_E_DISK_FULL 4 +#define MAPI_E_INSUFFICIENT_MEMORY 5 +#define MAPI_E_ACCESS_DENIED 6 +#define MAPI_E_BLK_TOO_SMALL 6 +#define MAPI_E_TOO_MANY_SESSIONS 8 +#define MAPI_E_TOO_MANY_FILES 9 +#define MAPI_E_TOO_MANY_RECIPIENTS 10 +#define MAPI_E_ATTACHMENT_NOT_FOUND 11 +#define MAPI_E_ATTACHMENT_OPEN_FAILURE 12 +#define MAPI_E_ATTACHMENT_WRITE_FAILURE 13 +#define MAPI_E_UNKNOWN_RECIPIENT 14 +#define MAPI_E_BAD_RECIPTYPE 15 +#define MAPI_E_NO_MESSAGES 16 +#define MAPI_E_INVALID_MESSAGE 17 +#define MAPI_E_TEXT_TOO_LARGE 18 +#define MAPI_E_INVALID_SESSION 19 +#define MAPI_E_TYPE_NOT_SUPPORTED 20 +#define MAPI_E_AMBIGUOUS_RECIPIENT 21 +#define MAPI_E_AMBIGUOUS_RECIP 21 +#define MAPI_E_MESSAGE_IN_USE 22 +#define MAPI_E_NETWORK_FAILURE 23 +#define MAPI_E_INVALID_EDITFIELDS 24 +#define MAPI_E_INVALID_RECIPS 25 +#define MAPI_E_NOT_SUPPORTED 26 + +#define MAPI_ORIG 0 +#define MAPI_TO 1 +#define MAPI_CC 2 +#define MAPI_BCC 3 + +#define MAPI_LOGON_UI 0x0001 +#define MAPI_NEW_SESSION 0x0002 +#define MAPI_FORCE_DOWNLOAD 0x1000 +#define MAPI_LOGOFF_SHARED 0x0001 +#define MAPI_LOGOFF_UI 0x0002 +#define MAPI_DIALOG 0x0008 +#define MAPI_UNREAD_ONLY 0x0020 +#define MAPI_LONG_MSGID 0x4000 +#define MAPI_GUARANTEE_FIFO 0x0100 +#define MAPI_ENVELOPE_ONLY 0x0040 +#define MAPI_PEEK 0x0080 +#define MAPI_BODY_AS_FILE 0x0200 +#define MAPI_SUPPRESS_ATTACH 0x0800 +#define MAPI_AB_NOMODIFY 0x0400 +#define MAPI_OLE 0x0001 +#define MAPI_OLE_STATIC 0x0002 +#define MAPI_UNREAD 0x0001 +#define MAPI_RECEIPT_REQUESTED 0x0002 +#define MAPI_SENT 0x0004 + +#ifndef RC_INVOKED +typedef unsigned long FLAGS; +typedef unsigned long LHANDLE; +typedef unsigned long FAR *LPLHANDLE, FAR *LPULONG; + +typedef struct { + ULONG ulReserved; + ULONG ulRecipClass; + LPSTR lpszName; + LPSTR lpszAddress; + ULONG ulEIDSize; + LPVOID lpEntryID; +} MapiRecipDesc, *lpMapiRecipDesc; +typedef struct { + ULONG ulReserved; + ULONG flFlags; + ULONG nPosition; + LPSTR lpszPathName; + LPSTR lpszFileName; + LPVOID lpFileType; +} MapiFileDesc, *lpMapiFileDesc; +typedef struct { + ULONG ulReserved; + ULONG cbTag; + LPBYTE lpTag; + ULONG cbEncoding; + LPBYTE lpEncoding; +} MapiFileTagExt, *lpMapiFileTagExt; +typedef struct { + ULONG ulReserved; + LPSTR lpszSubject; + LPSTR lpszNoteText; + LPSTR lpszMessageType; + LPSTR lpszDateReceived; + LPSTR lpszConversationID; + FLAGS flFlags; + lpMapiRecipDesc lpOriginator; + ULONG nRecipCount; + lpMapiRecipDesc lpRecips; + ULONG nFileCount; + lpMapiFileDesc lpFiles; +} MapiMessage, *lpMapiMessage; + +ULONG PASCAL MAPILogon (ULONG,LPSTR,LPSTR,FLAGS,ULONG,LPLHANDLE); +ULONG PASCAL MAPISendMail (LHANDLE,ULONG,lpMapiMessage,FLAGS,ULONG); +ULONG PASCAL MAPISendDocuments (ULONG,LPSTR,LPSTR,LPSTR,ULONG); +ULONG PASCAL MAPIReadMail (LHANDLE,ULONG,LPSTR,FLAGS,ULONG, + lpMapiMessage*); +ULONG PASCAL MAPIFindNext (LHANDLE,ULONG,LPSTR,LPSTR,FLAGS,ULONG,LPSTR); +ULONG PASCAL MAPIResolveName (LHANDLE,ULONG,LPSTR,FLAGS,ULONG, + lpMapiRecipDesc*); +ULONG PASCAL MAPIAddress (LHANDLE,ULONG,LPSTR,ULONG,LPSTR,ULONG, + lpMapiRecipDesc,FLAGS,ULONG,LPULONG, + lpMapiRecipDesc*); +ULONG PASCAL MAPIFreeBuffer (LPVOID); +ULONG PASCAL MAPIDetails (LHANDLE,ULONG,lpMapiRecipDesc,FLAGS,ULONG); +ULONG PASCAL MAPISaveMail (LHANDLE,ULONG,lpMapiMessage lpszMessage, + FLAGS,ULONG,LPSTR); +ULONG PASCAL MAPIDeleteMail (LHANDLE lpSession,ULONG,LPSTR,FLAGS,ULONG); +ULONG PASCAL MAPILogoff (LHANDLE,ULONG,FLAGS,ULONG); +/* Netscape extensions. */ +ULONG PASCAL MAPIGetNetscapeVersion (void); +ULONG PASCAL MAPI_NSCP_SynchronizeClient (LHANDLE,ULONG); + +/* Handles for use with GetProcAddress */ +typedef ULONG (PASCAL * LPMAPILOGON) (ULONG,LPSTR,LPSTR,FLAGS,ULONG, + LPLHANDLE); +typedef ULONG (PASCAL * LPMAPISENDMAIL) (LHANDLE,ULONG,lpMapiMessage, + FLAGS,ULONG); +typedef ULONG (PASCAL * LPMAPISENDDOCUMENTS) (ULONG,LPSTR,LPSTR, + LPSTR,ULONG); +typedef ULONG (PASCAL * LPMAPIREADMAIL) (LHANDLE,ULONG,LPSTR,FLAGS, + ULONG,lpMapiMessage*); +typedef ULONG (PASCAL * LPMAPIFINDNEXT) (LHANDLE,ULONG,LPSTR,LPSTR, + FLAGS,ULONG,LPSTR); +typedef ULONG (PASCAL * LPMAPIRESOLVENAME) (LHANDLE,ULONG,LPSTR,FLAGS, + ULONG,lpMapiRecipDesc*); +typedef ULONG (PASCAL * LPMAPIADDRESS) (LHANDLE,ULONG,LPSTR,ULONG,LPSTR, + ULONG,lpMapiRecipDesc,FLAGS,ULONG, + LPULONG,lpMapiRecipDesc*); +typedef ULONG (PASCAL * LPMAPIFREEBUFFER) (LPVOID lpv); +typedef ULONG (PASCAL * LPMAPIDETAILS) (LHANDLE,ULONG,lpMapiRecipDesc, + FLAGS,ULONG); +typedef ULONG (PASCAL * LPMAPISAVEMAIL) (LHANDLE,ULONG,lpMapiMessage, + FLAGS,ULONG,LPSTR); +typedef ULONG (PASCAL * LPMAPIDELETEMAIL) (LHANDLE lpSession,ULONG, + LPSTR, FLAGS,ULONG); +typedef ULONG (PASCAL * LPMAPILOGOFF)(LHANDLE,ULONG,FLAGS,ULONG); + +#endif /* RC_INVOKED */ + +#ifdef __cplusplus +} +#endif + +#endif /* Not _MAPI_H */ + diff --git a/reactos/w32api/include/mciavi.h b/reactos/w32api/include/mciavi.h new file mode 100644 index 00000000000..8535a7f0993 --- /dev/null +++ b/reactos/w32api/include/mciavi.h @@ -0,0 +1,25 @@ +#ifndef _MCIAVI_H +#define _MCIAVI_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#define MCI_MCIAVI_PLAY_WINDOW 0x1000000 +#define MCI_MCIAVI_PLAY_FULLSCREEN 0x2000000 +#define MCI_MCIAVI_PLAY_FULLBY2 0x4000000 +#define MCI_AVI_STATUS_FRAMES_SKIPPED 0x8001 +#define MCI_AVI_STATUS_LAST_PLAY_SPEED 0x8002 +#define MCI_AVI_STATUS_AUDIO_BREAKS 0x8003 +#define MCI_AVI_SETVIDEO_DRAW_PROCEDURE 0x8000 +#define MCI_AVI_SETVIDEO_PALETTE_COLOR 0x8100 +#define MCI_AVI_SETVIDEO_PALETTE_HALFTONE 0x0000FFFF +#define MCIERR_AVI_OLDAVIFORMAT (MCIERR_CUSTOM_DRIVER_BASE+100) +#define MCIERR_AVI_NOTINTERLEAVED (MCIERR_CUSTOM_DRIVER_BASE+101) +#define MCIERR_AVI_NODISPDIB (MCIERR_CUSTOM_DRIVER_BASE+102) +#define MCIERR_AVI_CANTPLAYFULLSCREEN (MCIERR_CUSTOM_DRIVER_BASE+103) +#define MCIERR_AVI_TOOBIGFORVGA (MCIERR_CUSTOM_DRIVER_BASE+104) +#define MCIERR_AVI_NOCOMPRESSOR (MCIERR_CUSTOM_DRIVER_BASE+105) +#define MCIERR_AVI_DISPLAYERROR (MCIERR_CUSTOM_DRIVER_BASE+106) +#define MCIERR_AVI_AUDIOERROR (MCIERR_CUSTOM_DRIVER_BASE+107) +#define MCIERR_AVI_BADPALETTE (MCIERR_CUSTOM_DRIVER_BASE+108) +#endif diff --git a/reactos/w32api/include/mcx.h b/reactos/w32api/include/mcx.h new file mode 100644 index 00000000000..c7173b77b6f --- /dev/null +++ b/reactos/w32api/include/mcx.h @@ -0,0 +1,77 @@ +#ifndef _MCX_H +#define _MCX_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define DIALOPTION_BILLING 64 +#define DIALOPTION_QUIET 128 +#define DIALOPTION_DIALTONE 256 +#define MDMVOLFLAG_LOW 1 +#define MDMVOLFLAG_MEDIUM 2 +#define MDMVOLFLAG_HIGH 4 +#define MDMVOL_LOW 0 +#define MDMVOL_MEDIUM 1 +#define MDMVOL_HIGH 2 +#define MDMSPKRFLAG_OFF 1 +#define MDMSPKRFLAG_DIAL 2 +#define MDMSPKRFLAG_ON 4 +#define MDMSPKRFLAG_CALLSETUP 8 +#define MDMSPKR_OFF 0 +#define MDMSPKR_DIAL 1 +#define MDMSPKR_ON 2 +#define MDMSPKR_CALLSETUP 3 +#define MDM_COMPRESSION 1 +#define MDM_ERROR_CONTROL 2 +#define MDM_FORCED_EC 4 +#define MDM_CELLULAR 8 +#define MDM_FLOWCONTROL_HARD 16 +#define MDM_FLOWCONTROL_SOFT 32 +#define MDM_CCITT_OVERRIDE 64 +#define MDM_SPEED_ADJUST 128 +#define MDM_TONE_DIAL 256 +#define MDM_BLIND_DIAL 512 +#define MDM_V23_OVERRIDE 1024 +typedef struct _MODEMDEVCAPS { + DWORD dwActualSize; + DWORD dwRequiredSize; + DWORD dwDevSpecificOffset; + DWORD dwDevSpecificSize; + DWORD dwModemProviderVersion; + DWORD dwModemManufacturerOffset; + DWORD dwModemManufacturerSize; + DWORD dwModemModelOffset; + DWORD dwModemModelSize; + DWORD dwModemVersionOffset; + DWORD dwModemVersionSize; + DWORD dwDialOptions; + DWORD dwCallSetupFailTimer; + DWORD dwInactivityTimeout; + DWORD dwSpeakerVolume; + DWORD dwSpeakerMode; + DWORD dwModemOptions; + DWORD dwMaxDTERate; + DWORD dwMaxDCERate; + BYTE abVariablePortion[1]; +} MODEMDEVCAPS,*PMODEMDEVCAPS,*LPMODEMDEVCAPS; +typedef struct _MODEMSETTINGS { + DWORD dwActualSize; + DWORD dwRequiredSize; + DWORD dwDevSpecificOffset; + DWORD dwDevSpecificSize; + DWORD dwCallSetupFailTimer; + DWORD dwInactivityTimeout; + DWORD dwSpeakerVolume; + DWORD dwSpeakerMode; + DWORD dwPreferredModemOptions; + DWORD dwNegotiatedModemOptions; + DWORD dwNegotiatedDCERate; + BYTE abVariablePortion[1]; +} MODEMSETTINGS,*PMODEMSETTINGS,*LPMODEMSETTINGS; +#ifdef __cplusplus +} +#endif +#endif /* _MCX_H */ diff --git a/reactos/w32api/include/mgmtapi.h b/reactos/w32api/include/mgmtapi.h new file mode 100644 index 00000000000..89e68e3e21e --- /dev/null +++ b/reactos/w32api/include/mgmtapi.h @@ -0,0 +1,58 @@ +/* + mgmtapi.h - Header file for the SNMP Management API + + Written by Filip Navara <xnavara@volny.cz> + + References (2003-08-25): + http://msdn.microsoft.com/library/en-us/snmp/snmp/snmp_reference.asp + + 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. +*/ + +#ifndef _MGMTAPI_H +#define _MGMTAPI_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifndef _SNMP_H +#include <snmp.h> +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define SNMP_MGMTAPI_TIMEOUT 40 +#define SNMP_MGMTAPI_SELECT_FDERRORS 41 +#define SNMP_MGMTAPI_TRAP_ERRORS 42 +#define SNMP_MGMTAPI_TRAP_DUPINIT 43 +#define SNMP_MGMTAPI_NOTRAPS 44 +#define SNMP_MGMTAPI_AGAIN 45 +#define SNMP_MGMTAPI_INVALID_CTL 46 +#define SNMP_MGMTAPI_INVALID_SESSION 47 +#define SNMP_MGMTAPI_INVALID_BUFFER 48 +#define MGMCTL_SETAGENTPORT 1 + +#ifndef RC_INVOKED + +typedef PVOID LPSNMP_MGR_SESSION; + +BOOL WINSNMPAPI SnmpMgrClose(LPSNMP_MGR_SESSION); +BOOL WINSNMPAPI SnmpMgrCtl(LPSNMP_MGR_SESSION,DWORD,LPVOID,DWORD,LPVOID,DWORD,LPDWORD); +BOOL WINSNMPAPI SnmpMgrGetTrap(AsnObjectIdentifier*,AsnNetworkAddress*,AsnInteger*,AsnInteger*,AsnTimeticks*,SnmpVarBindList*); +BOOL WINSNMPAPI SnmpMgrGetTrapEx(AsnObjectIdentifier*,AsnNetworkAddress*,AsnNetworkAddress*,AsnInteger*,AsnInteger*,AsnOctetString*,AsnTimeticks*,SnmpVarBindList*); +BOOL WINSNMPAPI SnmpMgrOidToStr(AsnObjectIdentifier*,LPSTR*); +LPSNMP_MGR_SESSION WINSNMPAPI SnmpMgrOpen(LPSTR,LPSTR,INT,INT); +INT WINSNMPAPI SnmpMgrRequest(LPSNMP_MGR_SESSION,BYTE,SnmpVarBindList*,AsnInteger*,AsnInteger*); +BOOL WINSNMPAPI SnmpMgrStrToOid(LPSTR,AsnObjectIdentifier*); +BOOL WINSNMPAPI SnmpMgrTrapListen(HANDLE*); + +#endif /* RC_INVOKED */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/mmsystem.h b/reactos/w32api/include/mmsystem.h new file mode 100644 index 00000000000..95da48c0b6f --- /dev/null +++ b/reactos/w32api/include/mmsystem.h @@ -0,0 +1,1941 @@ + +#ifndef _MMSYSTEM_H +#define _MMSYSTEM_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif +#pragma pack(push,1) +#ifdef __cplusplus +extern "C" { +#endif +#define WINMMAPI DECLSPEC_IMPORT +#define _loadds +#define _huge +#define MAXPNAMELEN 32 +#define MAXERRORLENGTH 256 +#define MAX_JOYSTICKOEMVXDNAME 260 +#define _MMRESULT_ +#define TIME_MS 1 +#define TIME_SAMPLES 2 +#define TIME_BYTES 4 +#define TIME_SMPTE 8 +#define TIME_MIDI 16 +#define TIME_TICKS 32 +#define MAKEFOURCC(c0,c1,c2,c3) ((DWORD)(BYTE)(c0)|((DWORD)(BYTE)(c1)<<8)|((DWORD)(BYTE)(c2)<<16)|((DWORD)(BYTE)(c3)<<24)) +#ifndef mmioFOURCC +#define mmioFOURCC(c0,c1,c2,c3) MAKEFOURCC(c0,c1,c2,c3) +#endif +#define MM_JOY1MOVE 0x3A0 +#define MM_JOY2MOVE 0x3A1 +#define MM_JOY1ZMOVE 0x3A2 +#define MM_JOY2ZMOVE 0x3A3 +#define MM_JOY1BUTTONDOWN 0x3B5 +#define MM_JOY2BUTTONDOWN 0x3B6 +#define MM_JOY1BUTTONUP 0x3B7 +#define MM_JOY2BUTTONUP 0x3B8 +#define MM_MCINOTIFY 0x3B9 +#define MM_WOM_OPEN 0x3BB +#define MM_WOM_CLOSE 0x3BC +#define MM_WOM_DONE 0x3BD +#define MM_WIM_OPEN 0x3BE +#define MM_WIM_CLOSE 0x3BF +#define MM_WIM_DATA 0x3C0 +#define MM_MIM_OPEN 0x3C1 +#define MM_MIM_CLOSE 0x3C2 +#define MM_MIM_DATA 0x3C3 +#define MM_MIM_LONGDATA 0x3C4 +#define MM_MIM_ERROR 0x3C5 +#define MM_MIM_LONGERROR 0x3C6 +#define MM_MOM_OPEN 0x3C7 +#define MM_MOM_CLOSE 0x3C8 +#define MM_MOM_DONE 0x3C9 +#define MM_DRVM_OPEN 0x3D0 +#define MM_DRVM_CLOSE 0x3D1 +#define MM_DRVM_DATA 0x3D2 +#define MM_DRVM_ERROR 0x3D3 +#define MM_STREAM_OPEN 0x3D4 +#define MM_STREAM_CLOSE 0x3D5 +#define MM_STREAM_DONE 0x3D6 +#define MM_STREAM_ERROR 0x3D7 +#define MM_MOM_POSITIONCB 0x3CA +#define MM_MCISIGNAL 0x3CB +#define MM_MIM_MOREDATA 0x3CC +#define MM_MIXM_LINE_CHANGE 0x3D0 +#define MM_MIXM_CONTROL_CHANGE 0x3D1 +#define MMSYSERR_BASE 0 +#define WAVERR_BASE 32 +#define MIDIERR_BASE 64 +#define TIMERR_BASE 96 +#define JOYERR_BASE 160 +#define MCIERR_BASE 256 +#define MIXERR_BASE 1024 +#define MCI_STRING_OFFSET 512 +#define MCI_VD_OFFSET 1024 +#define MCI_CD_OFFSET 1088 +#define MCI_WAVE_OFFSET 1152 +#define MCI_SEQ_OFFSET 1216 +#define MMSYSERR_NOERROR 0 +#define MMSYSERR_ERROR (MMSYSERR_BASE+1) +#define MMSYSERR_BADDEVICEID (MMSYSERR_BASE+2) +#define MMSYSERR_NOTENABLED (MMSYSERR_BASE+3) +#define MMSYSERR_ALLOCATED (MMSYSERR_BASE+4) +#define MMSYSERR_INVALHANDLE (MMSYSERR_BASE+5) +#define MMSYSERR_NODRIVER (MMSYSERR_BASE+6) +#define MMSYSERR_NOMEM (MMSYSERR_BASE+7) +#define MMSYSERR_NOTSUPPORTED (MMSYSERR_BASE+8) +#define MMSYSERR_BADERRNUM (MMSYSERR_BASE+9) +#define MMSYSERR_INVALFLAG (MMSYSERR_BASE+10) +#define MMSYSERR_INVALPARAM (MMSYSERR_BASE+11) +#define MMSYSERR_HANDLEBUSY (MMSYSERR_BASE+12) +#define MMSYSERR_INVALIDALIAS (MMSYSERR_BASE+13) +#define MMSYSERR_BADDB (MMSYSERR_BASE+14) +#define MMSYSERR_KEYNOTFOUND (MMSYSERR_BASE+15) +#define MMSYSERR_READERROR (MMSYSERR_BASE+16) +#define MMSYSERR_WRITEERROR (MMSYSERR_BASE+17) +#define MMSYSERR_DELETEERROR (MMSYSERR_BASE+18) +#define MMSYSERR_VALNOTFOUND (MMSYSERR_BASE+19) +#define MMSYSERR_NODRIVERCB (MMSYSERR_BASE+20) +#define MMSYSERR_LASTERROR (MMSYSERR_BASE+20) +#define DRV_LOAD 1 +#define DRV_ENABLE 2 +#define DRV_OPEN 3 +#define DRV_CLOSE 4 +#define DRV_DISABLE 5 +#define DRV_FREE 6 +#define DRV_CONFIGURE 7 +#define DRV_QUERYCONFIGURE 8 +#define DRV_INSTALL 9 +#define DRV_REMOVE 10 +#define DRV_EXITSESSION 11 +#define DRV_POWER 15 +#define DRV_RESERVED 0x800 +#define DRV_USER 0x4000 +#define DRVCNF_CANCEL 0 +#define DRVCNF_OK 1 +#define DRVCNF_RESTART 2 +#define DRV_CANCEL DRVCNF_CANCEL +#define DRV_OK DRVCNF_OK +#define DRV_RESTART DRVCNF_RESTART +#define DRV_MCI_FIRST DRV_RESERVED +#define DRV_MCI_LAST (DRV_RESERVED+0xFFF) +#define CALLBACK_TYPEMASK 0x70000 +#define CALLBACK_NULL 0 +#define CALLBACK_WINDOW 0x10000 +#define CALLBACK_TASK 0x20000 +#define CALLBACK_FUNCTION 0x30000 +#define CALLBACK_THREAD CALLBACK_TASK +#define CALLBACK_EVENT 0x50000 +#define SND_SYNC 0 +#define SND_ASYNC 1 +#define SND_NODEFAULT 2 +#define SND_MEMORY 4 +#define SND_LOOP 8 +#define SND_NOSTOP 16 +#define SND_NOWAIT 0x2000 +#define SND_ALIAS 0x10000 +#define SND_ALIAS_ID 0x110000 +#define SND_FILENAME 0x20000 +#define SND_RESOURCE 0x40004 +#define SND_PURGE 0x40 +#define SND_APPLICATION 0x80 +#define SND_ALIAS_START 0 +#define sndAlias(c0,c1) (SND_ALIAS_START+(DWORD)(BYTE)(c0)|((DWORD)(BYTE)(c1)<<8)) +#define SND_ALIAS_SYSTEMASTERISK sndAlias('S','*') +#define SND_ALIAS_SYSTEMQUESTION sndAlias('S','?') +#define SND_ALIAS_SYSTEMHAND sndAlias('S','H') +#define SND_ALIAS_SYSTEMEXIT sndAlias('S','E') +#define SND_ALIAS_SYSTEMSTART sndAlias('S','S') +#define SND_ALIAS_SYSTEMWELCOME sndAlias('S','W') +#define SND_ALIAS_SYSTEMEXCLAMATION sndAlias('S','!') +#define SND_ALIAS_SYSTEMDEFAULT sndAlias('S','D') +#define WAVERR_BADFORMAT (WAVERR_BASE + 0) +#define WAVERR_STILLPLAYING (WAVERR_BASE + 1) +#define WAVERR_UNPREPARED (WAVERR_BASE + 2) +#define WAVERR_SYNC (WAVERR_BASE + 3) +#define WAVERR_LASTERROR (WAVERR_BASE + 3) +#define WOM_OPEN MM_WOM_OPEN +#define WOM_CLOSE MM_WOM_CLOSE +#define WOM_DONE MM_WOM_DONE +#define WIM_OPEN MM_WIM_OPEN +#define WIM_CLOSE MM_WIM_CLOSE +#define WIM_DATA MM_WIM_DATA +#define WAVE_MAPPER ((UINT)-1) +#define WAVE_FORMAT_QUERY 1 +#define WAVE_ALLOWSYNC 2 +#define WAVE_MAPPED 4 +#define WAVE_FORMAT_DIRECT 8 +#define WAVE_FORMAT_DIRECT_QUERY (WAVE_FORMAT_QUERY|WAVE_FORMAT_DIRECT) +#define WHDR_DONE 1 +#define WHDR_PREPARED 2 +#define WHDR_BEGINLOOP 4 +#define WHDR_ENDLOOP 8 +#define WHDR_INQUEUE 16 +#define WAVECAPS_PITCH 1 +#define WAVECAPS_PLAYBACKRATE 2 +#define WAVECAPS_VOLUME 4 +#define WAVECAPS_LRVOLUME 8 +#define WAVECAPS_SYNC 16 +#define WAVECAPS_SAMPLEACCURATE 32 +#define WAVECAPS_DIRECTSOUND 64 +#define WAVE_INVALIDFORMAT 0 +#define WAVE_FORMAT_1M08 1 +#define WAVE_FORMAT_1S08 2 +#define WAVE_FORMAT_1M16 4 +#define WAVE_FORMAT_1S16 8 +#define WAVE_FORMAT_2M08 16 +#define WAVE_FORMAT_2S08 32 +#define WAVE_FORMAT_2M16 64 +#define WAVE_FORMAT_2S16 128 +#define WAVE_FORMAT_4M08 256 +#define WAVE_FORMAT_4S08 512 +#define WAVE_FORMAT_4M16 1024 +#define WAVE_FORMAT_4S16 2048 +#define WAVE_FORMAT_PCM 1 +#define MIDIERR_UNPREPARED MIDIERR_BASE +#define MIDIERR_STILLPLAYING (MIDIERR_BASE+1) +#define MIDIERR_NOMAP (MIDIERR_BASE+2) +#define MIDIERR_NOTREADY (MIDIERR_BASE+3) +#define MIDIERR_NODEVICE (MIDIERR_BASE+4) +#define MIDIERR_INVALIDSETUP (MIDIERR_BASE+5) +#define MIDIERR_BADOPENMODE (MIDIERR_BASE+6) +#define MIDIERR_DONT_CONTINUE (MIDIERR_BASE+7) +#define MIDIERR_LASTERROR (MIDIERR_BASE+7) +#define MIDIPATCHSIZE 128 +#define MIM_OPEN MM_MIM_OPEN +#define MIM_CLOSE MM_MIM_CLOSE +#define MIM_DATA MM_MIM_DATA +#define MIM_LONGDATA MM_MIM_LONGDATA +#define MIM_ERROR MM_MIM_ERROR +#define MIM_LONGERROR MM_MIM_LONGERROR +#define MOM_OPEN MM_MOM_OPEN +#define MOM_CLOSE MM_MOM_CLOSE +#define MOM_DONE MM_MOM_DONE +#define MIM_MOREDATA MM_MIM_MOREDATA +#define MOM_POSITIONCB MM_MOM_POSITIONCB +#define MIDIMAPPER ((UINT)-1) +#define MIDI_MAPPER ((UINT)-1) +#define MIDI_IO_STATUS 32 +#define MIDI_CACHE_ALL 1 +#define MIDI_CACHE_BESTFIT 2 +#define MIDI_CACHE_QUERY 3 +#define MIDI_UNCACHE 4 +#define MOD_MIDIPORT 1 +#define MOD_SYNTH 2 +#define MOD_SQSYNTH 3 +#define MOD_FMSYNTH 4 +#define MOD_MAPPER 5 +#define MIDICAPS_VOLUME 1 +#define MIDICAPS_LRVOLUME 2 +#define MIDICAPS_CACHE 4 +#define MIDICAPS_STREAM 8 +#define MHDR_DONE 1 +#define MHDR_PREPARED 2 +#define MHDR_INQUEUE 4 +#define MHDR_ISSTRM 8 +#define MEVT_F_SHORT 0 +#define MEVT_F_LONG 0x80000000 +#define MEVT_F_CALLBACK 0x40000000 +#define MEVT_EVENTTYPE(x) ((BYTE)(((x)>>24)&0xFF)) +#define MEVT_EVENTPARM(x) ((DWORD)((x)&0xFFFFFFL)) +#define MEVT_SHORTMSG 0 +#define MEVT_TEMPO 1 +#define MEVT_NOP 2 +#define MEVT_LONGMSG ((BYTE)0x80) +#define MEVT_COMMENT ((BYTE)0x82) +#define MEVT_VERSION ((BYTE)0x84) +#define MIDISTRM_ERROR (-2) +#define MIDIPROP_SET 0x80000000 +#define MIDIPROP_GET 0x40000000 +#define MIDIPROP_TIMEDIV 1 +#define MIDIPROP_TEMPO 2 +#define AUX_MAPPER ((UINT)-1) +#define AUXCAPS_CDAUDIO 1 +#define AUXCAPS_AUXIN 2 +#define AUXCAPS_VOLUME 1 +#define AUXCAPS_LRVOLUME 2 +#define MIXER_SHORT_NAME_CHARS 16 +#define MIXER_LONG_NAME_CHARS 64 +#define MIXERR_INVALLINE MIXERR_BASE +#define MIXERR_INVALCONTROL (MIXERR_BASE+1) +#define MIXERR_INVALVALUE (MIXERR_BASE+2) +#define MIXERR_LASTERROR (MIXERR_BASE+2) +#define MIXER_OBJECTF_HANDLE 0x80000000 +#define MIXER_OBJECTF_MIXER 0 +#define MIXER_OBJECTF_HMIXER (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIXER) +#define MIXER_OBJECTF_WAVEOUT 0x10000000 +#define MIXER_OBJECTF_HWAVEOUT (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_WAVEOUT) +#define MIXER_OBJECTF_WAVEIN 0x20000000 +#define MIXER_OBJECTF_HWAVEIN (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_WAVEIN) +#define MIXER_OBJECTF_MIDIOUT 0x30000000 +#define MIXER_OBJECTF_HMIDIOUT (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIDIOUT) +#define MIXER_OBJECTF_MIDIIN 0x40000000 +#define MIXER_OBJECTF_HMIDIIN (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIDIIN) +#define MIXER_OBJECTF_AUX 0x50000000 +#define MIXERLINE_LINEF_ACTIVE 1 +#define MIXERLINE_LINEF_DISCONNECTED 0x8000 +#define MIXERLINE_LINEF_SOURCE 0x80000000 +#define MIXERLINE_COMPONENTTYPE_DST_FIRST 0 +#define MIXERLINE_COMPONENTTYPE_DST_UNDEFINED MIXERLINE_COMPONENTTYPE_DST_FIRST +#define MIXERLINE_COMPONENTTYPE_DST_DIGITAL (MIXERLINE_COMPONENTTYPE_DST_FIRST+1) +#define MIXERLINE_COMPONENTTYPE_DST_LINE (MIXERLINE_COMPONENTTYPE_DST_FIRST+2) +#define MIXERLINE_COMPONENTTYPE_DST_MONITOR (MIXERLINE_COMPONENTTYPE_DST_FIRST+3) +#define MIXERLINE_COMPONENTTYPE_DST_SPEAKERS (MIXERLINE_COMPONENTTYPE_DST_FIRST+4) +#define MIXERLINE_COMPONENTTYPE_DST_HEADPHONES (MIXERLINE_COMPONENTTYPE_DST_FIRST+5) +#define MIXERLINE_COMPONENTTYPE_DST_TELEPHONE (MIXERLINE_COMPONENTTYPE_DST_FIRST+6) +#define MIXERLINE_COMPONENTTYPE_DST_WAVEIN (MIXERLINE_COMPONENTTYPE_DST_FIRST+7) +#define MIXERLINE_COMPONENTTYPE_DST_VOICEIN (MIXERLINE_COMPONENTTYPE_DST_FIRST+8) +#define MIXERLINE_COMPONENTTYPE_DST_LAST (MIXERLINE_COMPONENTTYPE_DST_FIRST+8) +#define MIXERLINE_COMPONENTTYPE_SRC_FIRST 0x1000 +#define MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED MIXERLINE_COMPONENTTYPE_SRC_FIRST +#define MIXERLINE_COMPONENTTYPE_SRC_DIGITAL (MIXERLINE_COMPONENTTYPE_SRC_FIRST+1) +#define MIXERLINE_COMPONENTTYPE_SRC_LINE (MIXERLINE_COMPONENTTYPE_SRC_FIRST+2) +#define MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE (MIXERLINE_COMPONENTTYPE_SRC_FIRST+3) +#define MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER (MIXERLINE_COMPONENTTYPE_SRC_FIRST+4) +#define MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC (MIXERLINE_COMPONENTTYPE_SRC_FIRST+5) +#define MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE (MIXERLINE_COMPONENTTYPE_SRC_FIRST+6) +#define MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER (MIXERLINE_COMPONENTTYPE_SRC_FIRST+7) +#define MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT (MIXERLINE_COMPONENTTYPE_SRC_FIRST+8) +#define MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY (MIXERLINE_COMPONENTTYPE_SRC_FIRST+9) +#define MIXERLINE_COMPONENTTYPE_SRC_ANALOG (MIXERLINE_COMPONENTTYPE_SRC_FIRST+10) +#define MIXERLINE_COMPONENTTYPE_SRC_LAST (MIXERLINE_COMPONENTTYPE_SRC_FIRST+10) +#define MIXERLINE_TARGETTYPE_UNDEFINED 0 +#define MIXERLINE_TARGETTYPE_WAVEOUT 1 +#define MIXERLINE_TARGETTYPE_WAVEIN 2 +#define MIXERLINE_TARGETTYPE_MIDIOUT 3 +#define MIXERLINE_TARGETTYPE_MIDIIN 4 +#define MIXERLINE_TARGETTYPE_AUX 5 +#define MIXER_GETLINEINFOF_DESTINATION 0 +#define MIXER_GETLINEINFOF_SOURCE 1 +#define MIXER_GETLINEINFOF_LINEID 2 +#define MIXER_GETLINEINFOF_COMPONENTTYPE 3 +#define MIXER_GETLINEINFOF_TARGETTYPE 4 +#define MIXER_GETLINEINFOF_QUERYMASK 15 +#define MIXERCONTROL_CONTROLF_UNIFORM 1 +#define MIXERCONTROL_CONTROLF_MULTIPLE 2 +#define MIXERCONTROL_CONTROLF_DISABLED 0x80000000 +#define MIXERCONTROL_CT_CLASS_MASK 0xF0000000 +#define MIXERCONTROL_CT_CLASS_CUSTOM 0 +#define MIXERCONTROL_CT_CLASS_METER 0x10000000 +#define MIXERCONTROL_CT_CLASS_SWITCH 0x20000000 +#define MIXERCONTROL_CT_CLASS_NUMBER 0x30000000 +#define MIXERCONTROL_CT_CLASS_SLIDER 0x40000000 +#define MIXERCONTROL_CT_CLASS_FADER 0x50000000 +#define MIXERCONTROL_CT_CLASS_TIME 0x60000000 +#define MIXERCONTROL_CT_CLASS_LIST 0x70000000 +#define MIXERCONTROL_CT_SUBCLASS_MASK 0xF000000 +#define MIXERCONTROL_CT_SC_SWITCH_BOOLEAN 0 +#define MIXERCONTROL_CT_SC_SWITCH_BUTTON 0x1000000 +#define MIXERCONTROL_CT_SC_METER_POLLED 0 +#define MIXERCONTROL_CT_SC_TIME_MICROSECS 0 +#define MIXERCONTROL_CT_SC_TIME_MILLISECS 0x1000000 +#define MIXERCONTROL_CT_SC_LIST_SINGLE 0 +#define MIXERCONTROL_CT_SC_LIST_MULTIPLE 0x1000000 +#define MIXERCONTROL_CT_UNITS_MASK 0xFF0000 +#define MIXERCONTROL_CT_UNITS_CUSTOM 0 +#define MIXERCONTROL_CT_UNITS_BOOLEAN 0x10000 +#define MIXERCONTROL_CT_UNITS_SIGNED 0x20000 +#define MIXERCONTROL_CT_UNITS_UNSIGNED 0x30000 +#define MIXERCONTROL_CT_UNITS_DECIBELS 0x40000 +#define MIXERCONTROL_CT_UNITS_PERCENT 0x50000 +#define MIXERCONTROL_CONTROLTYPE_CUSTOM (MIXERCONTROL_CT_CLASS_CUSTOM|MIXERCONTROL_CT_UNITS_CUSTOM) +#define MIXERCONTROL_CONTROLTYPE_BOOLEANMETER (MIXERCONTROL_CT_CLASS_METER|MIXERCONTROL_CT_SC_METER_POLLED|MIXERCONTROL_CT_UNITS_BOOLEAN) +#define MIXERCONTROL_CONTROLTYPE_SIGNEDMETER (MIXERCONTROL_CT_CLASS_METER|MIXERCONTROL_CT_SC_METER_POLLED|MIXERCONTROL_CT_UNITS_SIGNED) +#define MIXERCONTROL_CONTROLTYPE_PEAKMETER (MIXERCONTROL_CONTROLTYPE_SIGNEDMETER+1) +#define MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER (MIXERCONTROL_CT_CLASS_METER|MIXERCONTROL_CT_SC_METER_POLLED|MIXERCONTROL_CT_UNITS_UNSIGNED) +#define MIXERCONTROL_CONTROLTYPE_BOOLEAN (MIXERCONTROL_CT_CLASS_SWITCH|MIXERCONTROL_CT_SC_SWITCH_BOOLEAN|MIXERCONTROL_CT_UNITS_BOOLEAN) +#define MIXERCONTROL_CONTROLTYPE_ONOFF (MIXERCONTROL_CONTROLTYPE_BOOLEAN+1) +#define MIXERCONTROL_CONTROLTYPE_MUTE (MIXERCONTROL_CONTROLTYPE_BOOLEAN+2) +#define MIXERCONTROL_CONTROLTYPE_MONO (MIXERCONTROL_CONTROLTYPE_BOOLEAN+3) +#define MIXERCONTROL_CONTROLTYPE_LOUDNESS (MIXERCONTROL_CONTROLTYPE_BOOLEAN+4) +#define MIXERCONTROL_CONTROLTYPE_STEREOENH (MIXERCONTROL_CONTROLTYPE_BOOLEAN+5) +#define MIXERCONTROL_CONTROLTYPE_BUTTON (MIXERCONTROL_CT_CLASS_SWITCH|MIXERCONTROL_CT_SC_SWITCH_BUTTON|MIXERCONTROL_CT_UNITS_BOOLEAN) +#define MIXERCONTROL_CONTROLTYPE_DECIBELS (MIXERCONTROL_CT_CLASS_NUMBER|MIXERCONTROL_CT_UNITS_DECIBELS) +#define MIXERCONTROL_CONTROLTYPE_SIGNED (MIXERCONTROL_CT_CLASS_NUMBER|MIXERCONTROL_CT_UNITS_SIGNED) +#define MIXERCONTROL_CONTROLTYPE_UNSIGNED (MIXERCONTROL_CT_CLASS_NUMBER|MIXERCONTROL_CT_UNITS_UNSIGNED) +#define MIXERCONTROL_CONTROLTYPE_PERCENT (MIXERCONTROL_CT_CLASS_NUMBER|MIXERCONTROL_CT_UNITS_PERCENT) +#define MIXERCONTROL_CONTROLTYPE_SLIDER (MIXERCONTROL_CT_CLASS_SLIDER|MIXERCONTROL_CT_UNITS_SIGNED) +#define MIXERCONTROL_CONTROLTYPE_PAN (MIXERCONTROL_CONTROLTYPE_SLIDER+1) +#define MIXERCONTROL_CONTROLTYPE_QSOUNDPAN (MIXERCONTROL_CONTROLTYPE_SLIDER+2) +#define MIXERCONTROL_CONTROLTYPE_FADER (MIXERCONTROL_CT_CLASS_FADER|MIXERCONTROL_CT_UNITS_UNSIGNED) +#define MIXERCONTROL_CONTROLTYPE_VOLUME (MIXERCONTROL_CONTROLTYPE_FADER+1) +#define MIXERCONTROL_CONTROLTYPE_BASS (MIXERCONTROL_CONTROLTYPE_FADER+2) +#define MIXERCONTROL_CONTROLTYPE_TREBLE (MIXERCONTROL_CONTROLTYPE_FADER+3) +#define MIXERCONTROL_CONTROLTYPE_EQUALIZER (MIXERCONTROL_CONTROLTYPE_FADER+4) +#define MIXERCONTROL_CONTROLTYPE_SINGLESELECT (MIXERCONTROL_CT_CLASS_LIST|MIXERCONTROL_CT_SC_LIST_SINGLE|MIXERCONTROL_CT_UNITS_BOOLEAN) +#define MIXERCONTROL_CONTROLTYPE_MUX (MIXERCONTROL_CONTROLTYPE_SINGLESELECT+1) +#define MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT (MIXERCONTROL_CT_CLASS_LIST|MIXERCONTROL_CT_SC_LIST_MULTIPLE|MIXERCONTROL_CT_UNITS_BOOLEAN) +#define MIXERCONTROL_CONTROLTYPE_MIXER (MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT+1) +#define MIXERCONTROL_CONTROLTYPE_MICROTIME (MIXERCONTROL_CT_CLASS_TIME|MIXERCONTROL_CT_SC_TIME_MICROSECS|MIXERCONTROL_CT_UNITS_UNSIGNED) +#define MIXERCONTROL_CONTROLTYPE_MILLITIME (MIXERCONTROL_CT_CLASS_TIME|MIXERCONTROL_CT_SC_TIME_MILLISECS|MIXERCONTROL_CT_UNITS_UNSIGNED) +#define MIXER_GETLINECONTROLSF_ALL 0 +#define MIXER_GETLINECONTROLSF_ONEBYID 1 +#define MIXER_GETLINECONTROLSF_ONEBYTYPE 2 +#define MIXER_GETLINECONTROLSF_QUERYMASK 15 +#define MIXER_GETCONTROLDETAILSF_VALUE 0 +#define MIXER_GETCONTROLDETAILSF_LISTTEXT 1 +#define MIXER_GETCONTROLDETAILSF_QUERYMASK 15 +#define MIXER_SETCONTROLDETAILSF_VALUE 0 +#define MIXER_SETCONTROLDETAILSF_CUSTOM 1 +#define MIXER_SETCONTROLDETAILSF_QUERYMASK 15 +#define TIMERR_NOERROR 0 +#define TIMERR_NOCANDO (TIMERR_BASE+1) +#define TIMERR_STRUCT (TIMERR_BASE+33) +#define TIME_ONESHOT 0 +#define TIME_PERIODIC 1 +#define TIME_CALLBACK_FUNCTION 0 +#define TIME_CALLBACK_EVENT_SET 16 +#define TIME_CALLBACK_EVENT_PULSE 32 +#if (WINVER >= 0x0501) +#define TIME_KILL_SYNCHRONOUS 0x0100 +#endif +#define JOYERR_NOERROR (0) +#define JOYERR_PARMS (JOYERR_BASE+5) +#define JOYERR_NOCANDO (JOYERR_BASE+6) +#define JOYERR_UNPLUGGED (JOYERR_BASE+7) +#define JOY_BUTTON1 1 +#define JOY_BUTTON2 2 +#define JOY_BUTTON3 4 +#define JOY_BUTTON4 8 +#define JOY_BUTTON1CHG 256 +#define JOY_BUTTON2CHG 512 +#define JOY_BUTTON3CHG 1024 +#define JOY_BUTTON4CHG 2048 +#define JOY_BUTTON5 257 +#define JOY_BUTTON6 513 +#define JOY_BUTTON7 1025 +#define JOY_BUTTON8 2049 +#define JOY_BUTTON9 256 +#define JOY_BUTTON10 512 +#define JOY_BUTTON11 1024 +#define JOY_BUTTON12 2048 +#define JOY_BUTTON13 4096 +#define JOY_BUTTON14 8192 +#define JOY_BUTTON15 16384 +#define JOY_BUTTON16 32768 +#define JOY_BUTTON17 65536 +#define JOY_BUTTON18 0x20000 +#define JOY_BUTTON19 0x40000 +#define JOY_BUTTON20 0x80000 +#define JOY_BUTTON21 0x100000 +#define JOY_BUTTON22 0x200000 +#define JOY_BUTTON23 0x400000 +#define JOY_BUTTON24 0x800000 +#define JOY_BUTTON25 0x1000000 +#define JOY_BUTTON26 0x2000000 +#define JOY_BUTTON27 0x4000000 +#define JOY_BUTTON28 0x8000000 +#define JOY_BUTTON29 0x10000000 +#define JOY_BUTTON30 0x20000000 +#define JOY_BUTTON31 0x40000000 +#define JOY_BUTTON32 0x80000000 +#define JOY_POVCENTERED ((WORD)-1) +#define JOY_POVFORWARD 0 +#define JOY_POVRIGHT 9000 +#define JOY_POVBACKWARD 18000 +#define JOY_POVLEFT 27000 +#define JOY_RETURNX 1 +#define JOY_RETURNY 2 +#define JOY_RETURNZ 4l +#define JOY_RETURNR 8 +#define JOY_RETURNU 16 +#define JOY_RETURNV 32 +#define JOY_RETURNPOV 64 +#define JOY_RETURNBUTTONS 128 +#define JOY_RETURNRAWDATA 256 +#define JOY_RETURNPOVCTS 512 +#define JOY_RETURNCENTERED 1024 +#define JOY_USEDEADZONE 2048 +#define JOY_RETURNALL (JOY_RETURNX|JOY_RETURNY|JOY_RETURNZ|JOY_RETURNR|JOY_RETURNU|JOY_RETURNV|JOY_RETURNPOV|JOY_RETURNBUTTONS) +#define JOY_CAL_READALWAYS 0x10000 +#define JOY_CAL_READXYONLY 0x20000 +#define JOY_CAL_READ3 0x40000 +#define JOY_CAL_READ4 0x80000 +#define JOY_CAL_READXONLY 0x100000 +#define JOY_CAL_READYONLY 0x200000 +#define JOY_CAL_READ5 0x400000 +#define JOY_CAL_READ6 0x800000 +#define JOY_CAL_READZONLY 0x1000000 +#define JOY_CAL_READRONLY 0x2000000 +#define JOY_CAL_READUONLY 0x4000000 +#define JOY_CAL_READVONLY 0x8000000 +#define JOYSTICKID1 0 +#define JOYSTICKID2 1 +#define JOYCAPS_HASZ 1 +#define JOYCAPS_HASR 2 +#define JOYCAPS_HASU 4 +#define JOYCAPS_HASV 8 +#define JOYCAPS_HASPOV 16 +#define JOYCAPS_POV4DIR 32 +#define JOYCAPS_POVCTS 64 +#define MMIOERR_BASE 256 +#define MMIOERR_FILENOTFOUND (MMIOERR_BASE+1) +#define MMIOERR_OUTOFMEMORY (MMIOERR_BASE+2) +#define MMIOERR_CANNOTOPEN (MMIOERR_BASE+3) +#define MMIOERR_CANNOTCLOSE (MMIOERR_BASE+4) +#define MMIOERR_CANNOTREAD (MMIOERR_BASE+5) +#define MMIOERR_CANNOTWRITE (MMIOERR_BASE+6) +#define MMIOERR_CANNOTSEEK (MMIOERR_BASE+7) +#define MMIOERR_CANNOTEXPAND (MMIOERR_BASE+8) +#define MMIOERR_CHUNKNOTFOUND (MMIOERR_BASE+9) +#define MMIOERR_UNBUFFERED (MMIOERR_BASE+10) +#define MMIOERR_PATHNOTFOUND (MMIOERR_BASE+11) +#define MMIOERR_ACCESSDENIED (MMIOERR_BASE+12) +#define MMIOERR_SHARINGVIOLATION (MMIOERR_BASE+13) +#define MMIOERR_NETWORKERROR (MMIOERR_BASE+14) +#define MMIOERR_TOOMANYOPENFILES (MMIOERR_BASE+15) +#define MMIOERR_INVALIDFILE (MMIOERR_BASE+16) +#define CFSEPCHAR '+' +#define MMIO_RWMODE 3 +#define MMIO_SHAREMODE 0x70 +#define MMIO_CREATE 0x1000 +#define MMIO_PARSE 256 +#define MMIO_DELETE 512 +#define MMIO_EXIST 0x4000 +#define MMIO_ALLOCBUF 0x10000 +#define MMIO_GETTEMP 0x20000 +#define MMIO_DIRTY 0x10000000 +#define MMIO_READ 0 +#define MMIO_WRITE 1 +#define MMIO_READWRITE 2 +#define MMIO_COMPAT 0 +#define MMIO_EXCLUSIVE 16 +#define MMIO_DENYWRITE 32 +#define MMIO_DENYREAD 0x30 +#define MMIO_DENYNONE 64 +#define MMIO_FHOPEN 16 +#define MMIO_EMPTYBUF 16 +#define MMIO_TOUPPER 16 +#define MMIO_INSTALLPROC 0x10000 +#define MMIO_GLOBALPROC 0x10000000 +#define MMIO_REMOVEPROC 0x20000 +#define MMIO_UNICODEPROC 0x1000000 +#define MMIO_FINDPROC 0x40000 +#define MMIO_FINDCHUNK 16 +#define MMIO_FINDRIFF 32 +#define MMIO_FINDLIST 64 +#define MMIO_CREATERIFF 32 +#define MMIO_CREATELIST 64 +#define MMIOM_READ MMIO_READ +#define MMIOM_WRITE MMIO_WRITE +#define MMIOM_SEEK 2 +#define MMIOM_OPEN 3 +#define MMIOM_CLOSE 4 +#define MMIOM_WRITEFLUSH 5 +#define MMIOM_RENAME 6 +#define MMIOM_USER 0x8000 +#define FOURCC_RIFF mmioFOURCC('R', 'I', 'F', 'F') +#define FOURCC_LIST mmioFOURCC('L', 'I', 'S', 'T') +#define FOURCC_DOS mmioFOURCC('D', 'O', 'S', ' ') +#define FOURCC_MEM mmioFOURCC('M', 'E', 'M', ' ') +#define MMIO_DEFAULTBUFFER 8192 +#define MCIERR_INVALID_DEVICE_ID (MCIERR_BASE+1) +#define MCIERR_UNRECOGNIZED_KEYWORD (MCIERR_BASE+3) +#define MCIERR_UNRECOGNIZED_COMMAND (MCIERR_BASE+5) +#define MCIERR_HARDWARE (MCIERR_BASE+6) +#define MCIERR_INVALID_DEVICE_NAME (MCIERR_BASE+7) +#define MCIERR_OUT_OF_MEMORY (MCIERR_BASE+8) +#define MCIERR_DEVICE_OPEN (MCIERR_BASE+9) +#define MCIERR_CANNOT_LOAD_DRIVER (MCIERR_BASE+10) +#define MCIERR_MISSING_COMMAND_STRING (MCIERR_BASE+11) +#define MCIERR_PARAM_OVERFLOW (MCIERR_BASE+12) +#define MCIERR_MISSING_STRING_ARGUMENT (MCIERR_BASE+13) +#define MCIERR_BAD_INTEGER (MCIERR_BASE+14) +#define MCIERR_PARSER_INTERNAL (MCIERR_BASE+15) +#define MCIERR_DRIVER_INTERNAL (MCIERR_BASE+16) +#define MCIERR_MISSING_PARAMETER (MCIERR_BASE+17) +#define MCIERR_UNSUPPORTED_FUNCTION (MCIERR_BASE+18) +#define MCIERR_FILE_NOT_FOUND (MCIERR_BASE+19) +#define MCIERR_DEVICE_NOT_READY (MCIERR_BASE+20) +#define MCIERR_INTERNAL (MCIERR_BASE+21) +#define MCIERR_DRIVER (MCIERR_BASE+22) +#define MCIERR_CANNOT_USE_ALL (MCIERR_BASE+23) +#define MCIERR_MULTIPLE (MCIERR_BASE+24) +#define MCIERR_EXTENSION_NOT_FOUND (MCIERR_BASE+25) +#define MCIERR_OUTOFRANGE (MCIERR_BASE+26) +#define MCIERR_FLAGS_NOT_COMPATIBLE (MCIERR_BASE+28) +#define MCIERR_FILE_NOT_SAVED (MCIERR_BASE+30) +#define MCIERR_DEVICE_TYPE_REQUIRED (MCIERR_BASE+31) +#define MCIERR_DEVICE_LOCKED (MCIERR_BASE+32) +#define MCIERR_DUPLICATE_ALIAS (MCIERR_BASE+33) +#define MCIERR_BAD_CONSTANT (MCIERR_BASE+34) +#define MCIERR_MUST_USE_SHAREABLE (MCIERR_BASE+35) +#define MCIERR_MISSING_DEVICE_NAME (MCIERR_BASE+36) +#define MCIERR_BAD_TIME_FORMAT (MCIERR_BASE+37) +#define MCIERR_NO_CLOSING_QUOTE (MCIERR_BASE+38) +#define MCIERR_DUPLICATE_FLAGS (MCIERR_BASE+39) +#define MCIERR_INVALID_FILE (MCIERR_BASE+40) +#define MCIERR_NULL_PARAMETER_BLOCK (MCIERR_BASE+41) +#define MCIERR_UNNAMED_RESOURCE (MCIERR_BASE+42) +#define MCIERR_NEW_REQUIRES_ALIAS (MCIERR_BASE+43) +#define MCIERR_NOTIFY_ON_AUTO_OPEN (MCIERR_BASE+44) +#define MCIERR_NO_ELEMENT_ALLOWED (MCIERR_BASE+45) +#define MCIERR_NONAPPLICABLE_FUNCTION (MCIERR_BASE+46) +#define MCIERR_ILLEGAL_FOR_AUTO_OPEN (MCIERR_BASE+47) +#define MCIERR_FILENAME_REQUIRED (MCIERR_BASE+48) +#define MCIERR_EXTRA_CHARACTERS (MCIERR_BASE+49) +#define MCIERR_DEVICE_NOT_INSTALLED (MCIERR_BASE+50) +#define MCIERR_GET_CD (MCIERR_BASE+51) +#define MCIERR_SET_CD (MCIERR_BASE+52) +#define MCIERR_SET_DRIVE (MCIERR_BASE+53) +#define MCIERR_DEVICE_LENGTH (MCIERR_BASE+54) +#define MCIERR_DEVICE_ORD_LENGTH (MCIERR_BASE+55) +#define MCIERR_NO_INTEGER (MCIERR_BASE+56) +#define MCIERR_WAVE_OUTPUTSINUSE (MCIERR_BASE+64) +#define MCIERR_WAVE_SETOUTPUTINUSE (MCIERR_BASE+65) +#define MCIERR_WAVE_INPUTSINUSE (MCIERR_BASE+66) +#define MCIERR_WAVE_SETINPUTINUSE (MCIERR_BASE+67) +#define MCIERR_WAVE_OUTPUTUNSPECIFIED (MCIERR_BASE+68) +#define MCIERR_WAVE_INPUTUNSPECIFIED (MCIERR_BASE+69) +#define MCIERR_WAVE_OUTPUTSUNSUITABLE (MCIERR_BASE+70) +#define MCIERR_WAVE_SETOUTPUTUNSUITABLE (MCIERR_BASE+71) +#define MCIERR_WAVE_INPUTSUNSUITABLE (MCIERR_BASE+72) +#define MCIERR_WAVE_SETINPUTUNSUITABLE (MCIERR_BASE+73) +#define MCIERR_SEQ_DIV_INCOMPATIBLE (MCIERR_BASE+80) +#define MCIERR_SEQ_PORT_INUSE (MCIERR_BASE+81) +#define MCIERR_SEQ_PORT_NONEXISTENT (MCIERR_BASE+82) +#define MCIERR_SEQ_PORT_MAPNODEVICE (MCIERR_BASE+83) +#define MCIERR_SEQ_PORT_MISCERROR (MCIERR_BASE+84) +#define MCIERR_SEQ_TIMER (MCIERR_BASE+85) +#define MCIERR_SEQ_PORTUNSPECIFIED (MCIERR_BASE+86) +#define MCIERR_SEQ_NOMIDIPRESENT (MCIERR_BASE+87) +#define MCIERR_NO_WINDOW (MCIERR_BASE+90) +#define MCIERR_CREATEWINDOW (MCIERR_BASE+91) +#define MCIERR_FILE_READ (MCIERR_BASE+92) +#define MCIERR_FILE_WRITE (MCIERR_BASE+93) +#define MCIERR_NO_IDENTITY (MCIERR_BASE+94) +#define MCIERR_CUSTOM_DRIVER_BASE (MCIERR_BASE+256) +#define MCI_FIRST DRV_MCI_FIRST +#define MCI_OPEN 0x803 +#define MCI_CLOSE 0x804 +#define MCI_ESCAPE 0x805 +#define MCI_PLAY 0x806 +#define MCI_SEEK 0x807 +#define MCI_STOP 0x808 +#define MCI_PAUSE 0x809 +#define MCI_INFO 0x80A +#define MCI_GETDEVCAPS 0x80B +#define MCI_SPIN 0x80C +#define MCI_SET 0x80D +#define MCI_STEP 0x80E +#define MCI_RECORD 0x80F +#define MCI_SYSINFO 0x810 +#define MCI_BREAK 0x811 +#define MCI_SAVE 0x813 +#define MCI_STATUS 0x814 +#define MCI_CUE 0x830 +#define MCI_REALIZE 0x840 +#define MCI_WINDOW 0x841 +#define MCI_PUT 0x842 +#define MCI_WHERE 0x843 +#define MCI_FREEZE 0x844 +#define MCI_UNFREEZE 0x845 +#define MCI_LOAD 0x850 +#define MCI_CUT 0x851 +#define MCI_COPY 0x852 +#define MCI_PASTE 0x853 +#define MCI_UPDATE 0x854 +#define MCI_RESUME 0x855 +#define MCI_DELETE 0x856 +#define MCI_USER_MESSAGES (DRV_MCI_FIRST+0x400) +#define MCI_LAST 0xFFF +#define MCI_ALL_DEVICE_ID ((MCIDEVICEID)-1) +#define MCI_DEVTYPE_VCR 513 +#define MCI_DEVTYPE_VIDEODISC 514 +#define MCI_DEVTYPE_OVERLAY 515 +#define MCI_DEVTYPE_CD_AUDIO 516 +#define MCI_DEVTYPE_DAT 517 +#define MCI_DEVTYPE_SCANNER 518 +#define MCI_DEVTYPE_ANIMATION 519 +#define MCI_DEVTYPE_DIGITAL_VIDEO 520 +#define MCI_DEVTYPE_OTHER 521 +#define MCI_DEVTYPE_WAVEFORM_AUDIO 522 +#define MCI_DEVTYPE_SEQUENCER 523 +#define MCI_DEVTYPE_FIRST MCI_DEVTYPE_VCR +#define MCI_DEVTYPE_LAST MCI_DEVTYPE_SEQUENCER +#define MCI_DEVTYPE_FIRST_USER 0x1000 +#define MCI_MODE_NOT_READY (MCI_STRING_OFFSET+12) +#define MCI_MODE_STOP (MCI_STRING_OFFSET+13) +#define MCI_MODE_PLAY (MCI_STRING_OFFSET+14) +#define MCI_MODE_RECORD (MCI_STRING_OFFSET+15) +#define MCI_MODE_SEEK (MCI_STRING_OFFSET+16) +#define MCI_MODE_PAUSE (MCI_STRING_OFFSET+17) +#define MCI_MODE_OPEN (MCI_STRING_OFFSET+18) +#define MCI_FORMAT_MILLISECONDS 0 +#define MCI_FORMAT_HMS 1 +#define MCI_FORMAT_MSF 2 +#define MCI_FORMAT_FRAMES 3 +#define MCI_FORMAT_SMPTE_24 4 +#define MCI_FORMAT_SMPTE_25 5 +#define MCI_FORMAT_SMPTE_30 6 +#define MCI_FORMAT_SMPTE_30DROP 7 +#define MCI_FORMAT_BYTES 8 +#define MCI_FORMAT_SAMPLES 9 +#define MCI_FORMAT_TMSF 10 +#define MCI_MSF_MINUTE(t) ((BYTE)(t)) +#define MCI_MSF_SECOND(t) ((BYTE)(((WORD)(t))>>8)) +#define MCI_MSF_FRAME(t) ((BYTE)((t)>>16)) +#define MCI_MAKE_MSF(m,s,f) ((DWORD)(((BYTE)(m)|((WORD)(s)<<8))|(((DWORD)(BYTE)(f))<<16))) +#define MCI_TMSF_TRACK(t) ((BYTE)(t)) +#define MCI_TMSF_MINUTE(t) ((BYTE)(((WORD)(t))>>8)) +#define MCI_TMSF_SECOND(t) ((BYTE)((t)>>16)) +#define MCI_TMSF_FRAME(t) ((BYTE)((t)>>24)) +#define MCI_MAKE_TMSF(t,m,s,f) ((DWORD)(((BYTE)(t)|((WORD)(m)<<8))|(((DWORD)(BYTE)(s)|((WORD)(f)<<8))<<16))) +#define MCI_HMS_HOUR(t) ((BYTE)(t)) +#define MCI_HMS_MINUTE(t) ((BYTE)(((WORD)(t))>>8)) +#define MCI_HMS_SECOND(t) ((BYTE)((t)>>16)) +#define MCI_MAKE_HMS(h,m,s) ((DWORD)(((BYTE)(h)|((WORD)(m)<<8))|(((DWORD)(BYTE)(s))<<16))) +#define MCI_NOTIFY_SUCCESSFUL 1 +#define MCI_NOTIFY_SUPERSEDED 2 +#define MCI_NOTIFY_ABORTED 4 +#define MCI_NOTIFY_FAILURE 8 +#define MCI_NOTIFY 1 +#define MCI_WAIT 2 +#define MCI_FROM 4 +#define MCI_TO 8 +#define MCI_TRACK 16 +#define MCI_OPEN_SHAREABLE 256 +#define MCI_OPEN_ELEMENT 512 +#define MCI_OPEN_ALIAS 1024 +#define MCI_OPEN_ELEMENT_ID 2048 +#define MCI_OPEN_TYPE_ID 0x1000 +#define MCI_OPEN_TYPE 0x2000 +#define MCI_SEEK_TO_START 256 +#define MCI_SEEK_TO_END 512 +#define MCI_STATUS_ITEM 256 +#define MCI_STATUS_START 512 +#define MCI_STATUS_LENGTH 1 +#define MCI_STATUS_POSITION 2 +#define MCI_STATUS_NUMBER_OF_TRACKS 3 +#define MCI_STATUS_MODE 4 +#define MCI_STATUS_MEDIA_PRESENT 5 +#define MCI_STATUS_TIME_FORMAT 6 +#define MCI_STATUS_READY 7 +#define MCI_STATUS_CURRENT_TRACK 8 +#define MCI_INFO_PRODUCT 256 +#define MCI_INFO_FILE 512 +#define MCI_INFO_MEDIA_UPC 1024 +#define MCI_INFO_MEDIA_IDENTITY 2048 +#define MCI_INFO_NAME 0x1000 +#define MCI_INFO_COPYRIGHT 0x2000 +#define MCI_GETDEVCAPS_ITEM 256 +#define MCI_GETDEVCAPS_CAN_RECORD 1 +#define MCI_GETDEVCAPS_HAS_AUDIO 2 +#define MCI_GETDEVCAPS_HAS_VIDEO 3 +#define MCI_GETDEVCAPS_DEVICE_TYPE 4 +#define MCI_GETDEVCAPS_USES_FILES 5 +#define MCI_GETDEVCAPS_COMPOUND_DEVICE 6 +#define MCI_GETDEVCAPS_CAN_EJECT 7 +#define MCI_GETDEVCAPS_CAN_PLAY 8 +#define MCI_GETDEVCAPS_CAN_SAVE 9 +#define MCI_SYSINFO_QUANTITY 256 +#define MCI_SYSINFO_OPEN 512 +#define MCI_SYSINFO_NAME 1024 +#define MCI_SYSINFO_INSTALLNAME 2048 +#define MCI_SET_DOOR_OPEN 256 +#define MCI_SET_DOOR_CLOSED 512 +#define MCI_SET_TIME_FORMAT 1024 +#define MCI_SET_AUDIO 2048 +#define MCI_SET_VIDEO 0x1000 +#define MCI_SET_ON 0x2000 +#define MCI_SET_OFF 0x4000 +#define MCI_SET_AUDIO_ALL 0 +#define MCI_SET_AUDIO_LEFT 1 +#define MCI_SET_AUDIO_RIGHT 2 +#define MCI_BREAK_KEY 256 +#define MCI_BREAK_HWND 512 +#define MCI_BREAK_OFF 1024 +#define MCI_RECORD_INSERT 256 +#define MCI_RECORD_OVERWRITE 512 +#define MCI_SAVE_FILE 256 +#define MCI_LOAD_FILE 256 +#define MCI_VD_MODE_PARK (MCI_VD_OFFSET+1) +#define MCI_VD_MEDIA_CLV (MCI_VD_OFFSET+2) +#define MCI_VD_MEDIA_CAV (MCI_VD_OFFSET+3) +#define MCI_VD_MEDIA_OTHER (MCI_VD_OFFSET+4) +#define MCI_VD_FORMAT_TRACK 0x4001 +#define MCI_VD_PLAY_REVERSE 0x10000 +#define MCI_VD_PLAY_FAST 0x20000 +#define MCI_VD_PLAY_SPEED 0x40000 +#define MCI_VD_PLAY_SCAN 0x80000 +#define MCI_VD_PLAY_SLOW 0x100000 +#define MCI_VD_SEEK_REVERSE 0x10000 +#define MCI_VD_STATUS_SPEED 0x4002 +#define MCI_VD_STATUS_FORWARD 0x4003 +#define MCI_VD_STATUS_MEDIA_TYPE 0x4004 +#define MCI_VD_STATUS_SIDE 0x4005 +#define MCI_VD_STATUS_DISC_SIZE 0x4006 +#define MCI_VD_GETDEVCAPS_CLV 0x10000 +#define MCI_VD_GETDEVCAPS_CAV 0x20000 +#define MCI_VD_SPIN_UP 0x10000 +#define MCI_VD_SPIN_DOWN 0x20000 +#define MCI_VD_GETDEVCAPS_CAN_REVERSE 0x4002 +#define MCI_VD_GETDEVCAPS_FAST_RATE 0x4003 +#define MCI_VD_GETDEVCAPS_SLOW_RATE 0x4004 +#define MCI_VD_GETDEVCAPS_NORMAL_RATE 0x4005 +#define MCI_VD_STEP_FRAMES 0x10000 +#define MCI_VD_STEP_REVERSE 0x20000 +#define MCI_VD_ESCAPE_STRING 256 +#define MCI_CDA_STATUS_TYPE_TRACK 0x4001 +#define MCI_CDA_TRACK_AUDIO MCI_CD_OFFSET +#define MCI_CDA_TRACK_OTHER (MCI_CD_OFFSET+1) +#define MCI_WAVE_PCM MCI_WAVE_OFFSET +#define MCI_WAVE_MAPPER (MCI_WAVE_OFFSET+1) +#define MCI_WAVE_OPEN_BUFFER 0x10000 +#define MCI_WAVE_SET_FORMATTAG 0x10000 +#define MCI_WAVE_SET_CHANNELS 0x20000 +#define MCI_WAVE_SET_SAMPLESPERSEC 0x40000 +#define MCI_WAVE_SET_AVGBYTESPERSEC 0x80000 +#define MCI_WAVE_SET_BLOCKALIGN 0x100000 +#define MCI_WAVE_SET_BITSPERSAMPLE 0x200000 +#define MCI_WAVE_INPUT 0x400000 +#define MCI_WAVE_OUTPUT 0x800000 +#define MCI_WAVE_STATUS_FORMATTAG 0x4001 +#define MCI_WAVE_STATUS_CHANNELS 0x4002 +#define MCI_WAVE_STATUS_SAMPLESPERSEC 0x4003 +#define MCI_WAVE_STATUS_AVGBYTESPERSEC 0x4004 +#define MCI_WAVE_STATUS_BLOCKALIGN 0x4005 +#define MCI_WAVE_STATUS_BITSPERSAMPLE 0x4006 +#define MCI_WAVE_STATUS_LEVEL 0x4007 +#define MCI_WAVE_SET_ANYINPUT 0x4000000 +#define MCI_WAVE_SET_ANYOUTPUT 0x8000000 +#define MCI_WAVE_GETDEVCAPS_INPUTS 0x4001 +#define MCI_WAVE_GETDEVCAPS_OUTPUTS 0x4002 +#define MCI_SEQ_DIV_PPQN MCI_SEQ_OFFSET +#define MCI_SEQ_DIV_SMPTE_24 (MCI_SEQ_OFFSET+1) +#define MCI_SEQ_DIV_SMPTE_25 (MCI_SEQ_OFFSET+2) +#define MCI_SEQ_DIV_SMPTE_30DROP (MCI_SEQ_OFFSET+3) +#define MCI_SEQ_DIV_SMPTE_30 (MCI_SEQ_OFFSET+4) +#define MCI_SEQ_FORMAT_SONGPTR 0x4001 +#define MCI_SEQ_FILE 0x4002 +#define MCI_SEQ_MIDI 0x4003 +#define MCI_SEQ_SMPTE 0x4004 +#define MCI_SEQ_NONE 65533 +#define MCI_SEQ_MAPPER 65535 +#define MCI_SEQ_STATUS_TEMPO 0x4002 +#define MCI_SEQ_STATUS_PORT 0x4003 +#define MCI_SEQ_STATUS_SLAVE 0x4007 +#define MCI_SEQ_STATUS_MASTER 0x4008 +#define MCI_SEQ_STATUS_OFFSET 0x4009 +#define MCI_SEQ_STATUS_DIVTYPE 0x400A +#define MCI_SEQ_STATUS_NAME 0x400B +#define MCI_SEQ_STATUS_COPYRIGHT 0x400C +#define MCI_SEQ_SET_TEMPO 0x10000 +#define MCI_SEQ_SET_PORT 0x20000 +#define MCI_SEQ_SET_SLAVE 0x40000 +#define MCI_SEQ_SET_MASTER 0x80000 +#define MCI_SEQ_SET_OFFSET 0x1000000 +#define MCI_ANIM_OPEN_WS 0x10000 +#define MCI_ANIM_OPEN_PARENT 0x20000 +#define MCI_ANIM_OPEN_NOSTATIC 0x40000 +#define MCI_ANIM_PLAY_SPEED 0x10000 +#define MCI_ANIM_PLAY_REVERSE 0x20000 +#define MCI_ANIM_PLAY_FAST 0x40000 +#define MCI_ANIM_PLAY_SLOW 0x80000 +#define MCI_ANIM_PLAY_SCAN 0x100000 +#define MCI_ANIM_STEP_REVERSE 0x10000 +#define MCI_ANIM_STEP_FRAMES 0x20000 +#define MCI_ANIM_STATUS_SPEED 0x4001 +#define MCI_ANIM_STATUS_FORWARD 0x4002 +#define MCI_ANIM_STATUS_HWND 0x4003 +#define MCI_ANIM_STATUS_HPAL 0x4004 +#define MCI_ANIM_STATUS_STRETCH 0x4005 +#define MCI_ANIM_INFO_TEXT 0x10000 +#define MCI_ANIM_GETDEVCAPS_CAN_REVERSE 0x4001 +#define MCI_ANIM_GETDEVCAPS_FAST_RATE 0x4002 +#define MCI_ANIM_GETDEVCAPS_SLOW_RATE 0x4003 +#define MCI_ANIM_GETDEVCAPS_NORMAL_RATE 0x4004 +#define MCI_ANIM_GETDEVCAPS_PALETTES 0x4006 +#define MCI_ANIM_GETDEVCAPS_CAN_STRETCH 0x4007 +#define MCI_ANIM_GETDEVCAPS_MAX_WINDOWS 0x4008 +#define MCI_ANIM_REALIZE_NORM 0x10000 +#define MCI_ANIM_REALIZE_BKGD 0x20000 +#define MCI_ANIM_WINDOW_HWND 0x10000 +#define MCI_ANIM_WINDOW_STATE 0x40000 +#define MCI_ANIM_WINDOW_TEXT 0x80000 +#define MCI_ANIM_WINDOW_ENABLE_STRETCH 0x100000 +#define MCI_ANIM_WINDOW_DISABLE_STRETCH 0x200000 +#define MCI_ANIM_WINDOW_DEFAULT 0xL +#define MCI_ANIM_RECT 0x10000 +#define MCI_ANIM_PUT_SOURCE 0x20000 +#define MCI_ANIM_PUT_DESTINATION 0x40000 +#define MCI_ANIM_WHERE_SOURCE 0x20000 +#define MCI_ANIM_WHERE_DESTINATION 0x40000 +#define MCI_ANIM_UPDATE_HDC 0x20000 +#define MCI_OVLY_OPEN_WS 0x10000 +#define MCI_OVLY_OPEN_PARENT 0x20000 +#define MCI_OVLY_STATUS_HWND 0x4001 +#define MCI_OVLY_STATUS_STRETCH 0x4002 +#define MCI_OVLY_INFO_TEXT 0x10000 +#define MCI_OVLY_GETDEVCAPS_CAN_STRETCH 0x4001 +#define MCI_OVLY_GETDEVCAPS_CAN_FREEZE 0x4002 +#define MCI_OVLY_GETDEVCAPS_MAX_WINDOWS 0x4003 +#define MCI_OVLY_WINDOW_HWND 0x10000 +#define MCI_OVLY_WINDOW_STATE 0x40000 +#define MCI_OVLY_WINDOW_TEXT 0x80000 +#define MCI_OVLY_WINDOW_ENABLE_STRETCH 0x100000 +#define MCI_OVLY_WINDOW_DISABLE_STRETCH 0x200000 +#define MCI_OVLY_WINDOW_DEFAULT 0xL +#define MCI_OVLY_RECT 0x10000 +#define MCI_OVLY_PUT_SOURCE 0x20000 +#define MCI_OVLY_PUT_DESTINATION 0x40000 +#define MCI_OVLY_PUT_FRAME 0x80000 +#define MCI_OVLY_PUT_VIDEO 0x100000 +#define MCI_OVLY_WHERE_SOURCE 0x20000 +#define MCI_OVLY_WHERE_DESTINATION 0x40000 +#define MCI_OVLY_WHERE_FRAME 0x80000 +#define MCI_OVLY_WHERE_VIDEO 0x100000 +#define NEWTRANSPARENT 3 +#define QUERYROPSUPPORT 40 +#define SELECTDIB 41 +#define DIBINDEX(n) MAKELONG((n),0x10FF) +#define SC_SCREENSAVE 0xF140 +#define CAPS1 94 +#define C1_TRANSPARENT 1 +#ifndef SEEK_SET +#define SEEK_SET 0 +#endif +#ifndef SEEK_CUR +#define SEEK_CUR 1 +#endif +#ifndef SEEK_END +#define SEEK_END 2 +#endif + +typedef DWORD MCIERROR; +typedef UINT MCIDEVICEID; +typedef UINT(CALLBACK *YIELDPROC)(MCIDEVICEID,DWORD); +typedef UINT MMVERSION; +typedef UINT MMRESULT; +typedef struct mmtime_tag { + UINT wType; + union { + DWORD ms; + DWORD sample; + DWORD cb; + DWORD ticks; + struct { + BYTE hour; + BYTE min; + BYTE sec; + BYTE frame; + BYTE fps; + BYTE dummy; + BYTE pad[2]; + } smpte; + struct { + DWORD songptrpos; + } midi; + } u; +} MMTIME,*PMMTIME,*LPMMTIME; +DECLARE_HANDLE(HDRVR); +typedef struct tagDRVCONFIGINFO { + DWORD dwDCISize; + LPCWSTR lpszDCISectionName; + LPCWSTR lpszDCIAliasName; +} DRVCONFIGINFO,*PDRVCONFIGINFO,*LPDRVCONFIGINFO; +typedef struct DRVCONFIGINFOEX { + DWORD dwDCISize; + LPCWSTR lpszDCISectionName; + LPCWSTR lpszDCIAliasName; + DWORD dnDevNode; +} DRVCONFIGINFOEX,*PDRVCONFIGINFOEX,*LPDRVCONFIGINFOEX; +typedef LRESULT(CALLBACK* DRIVERPROC)(DWORD,HDRVR,UINT,LPARAM,LPARAM); +typedef void (CALLBACK DRVCALLBACK)(HDRVR,UINT,DWORD,DWORD,DWORD); +typedef DRVCALLBACK *LPDRVCALLBACK; +typedef DRVCALLBACK *PDRVCALLBACK; +DECLARE_HANDLE(HWAVE); +DECLARE_HANDLE(HWAVEIN); +DECLARE_HANDLE(HWAVEOUT); +typedef HWAVEIN *LPHWAVEIN; +typedef HWAVEOUT *LPHWAVEOUT; +typedef DRVCALLBACK WAVECALLBACK; +typedef WAVECALLBACK *LPWAVECALLBACK; +typedef struct wavehdr_tag { + LPSTR lpData; + DWORD dwBufferLength; + DWORD dwBytesRecorded; + DWORD dwUser; + DWORD dwFlags; + DWORD dwLoops; + struct wavehdr_tag *lpNext; + DWORD reserved; +} WAVEHDR,*PWAVEHDR,*LPWAVEHDR; +typedef struct tagWAVEOUTCAPSA { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + CHAR szPname[MAXPNAMELEN]; + DWORD dwFormats; + WORD wChannels; + WORD wReserved1; + DWORD dwSupport; +} WAVEOUTCAPSA,*PWAVEOUTCAPSA,*LPWAVEOUTCAPSA; +typedef struct tagWAVEOUTCAPSW { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + WCHAR szPname[MAXPNAMELEN]; + DWORD dwFormats; + WORD wChannels; + WORD wReserved1; + DWORD dwSupport; +} WAVEOUTCAPSW,*PWAVEOUTCAPSW,*LPWAVEOUTCAPSW; +typedef struct tagWAVEINCAPSA { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + CHAR szPname[MAXPNAMELEN]; + DWORD dwFormats; + WORD wChannels; + WORD wReserved1; +} WAVEINCAPSA,*PWAVEINCAPSA,*LPWAVEINCAPSA; +typedef struct tagWAVEINCAPSW { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + WCHAR szPname[MAXPNAMELEN]; + DWORD dwFormats; + WORD wChannels; + WORD wReserved1; +} WAVEINCAPSW,*PWAVEINCAPSW,*LPWAVEINCAPSW; +typedef struct waveformat_tag { + WORD wFormatTag; + WORD nChannels; + DWORD nSamplesPerSec; + DWORD nAvgBytesPerSec; + WORD nBlockAlign; +} WAVEFORMAT,*PWAVEFORMAT,*LPWAVEFORMAT; +typedef struct pcmwaveformat_tag { + WAVEFORMAT wf; + WORD wBitsPerSample; +} PCMWAVEFORMAT, *PPCMWAVEFORMAT,*LPPCMWAVEFORMAT; +#ifndef _WAVEFORMATEX_ +#define _WAVEFORMATEX_ +typedef struct tWAVEFORMATEX { + WORD wFormatTag; + WORD nChannels; + DWORD nSamplesPerSec; + DWORD nAvgBytesPerSec; + WORD nBlockAlign; + WORD wBitsPerSample; + WORD cbSize; +} WAVEFORMATEX,*PWAVEFORMATEX,*LPWAVEFORMATEX; +typedef const WAVEFORMATEX *LPCWAVEFORMATEX; +#endif +DECLARE_HANDLE(HMIDI); +DECLARE_HANDLE(HMIDIIN); +DECLARE_HANDLE(HMIDIOUT); +DECLARE_HANDLE(HMIDISTRM); +typedef HMIDI *LPHMIDI; +typedef HMIDIIN *LPHMIDIIN; +typedef HMIDIOUT *LPHMIDIOUT; +typedef HMIDISTRM *LPHMIDISTRM; +typedef DRVCALLBACK MIDICALLBACK; +typedef MIDICALLBACK *LPMIDICALLBACK; +typedef WORD PATCHARRAY[MIDIPATCHSIZE]; +typedef WORD *LPPATCHARRAY; +typedef WORD KEYARRAY[MIDIPATCHSIZE]; +typedef WORD *LPKEYARRAY; +typedef struct tagMIDIOUTCAPSA { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + CHAR szPname[MAXPNAMELEN]; + WORD wTechnology; + WORD wVoices; + WORD wNotes; + WORD wChannelMask; + DWORD dwSupport; +} MIDIOUTCAPSA,*PMIDIOUTCAPSA,*LPMIDIOUTCAPSA; +typedef struct tagMIDIOUTCAPSW { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + WCHAR szPname[MAXPNAMELEN]; + WORD wTechnology; + WORD wVoices; + WORD wNotes; + WORD wChannelMask; + DWORD dwSupport; +} MIDIOUTCAPSW,*PMIDIOUTCAPSW,*LPMIDIOUTCAPSW; +typedef struct tagMIDIINCAPSA { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + CHAR szPname[MAXPNAMELEN]; + DWORD dwSupport; +} MIDIINCAPSA,*PMIDIINCAPSA,*LPMIDIINCAPSA; +typedef struct tagMIDIINCAPSW { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + WCHAR szPname[MAXPNAMELEN]; + DWORD dwSupport; +} MIDIINCAPSW,*PMIDIINCAPSW,*NPMIDIINCAPSW,*LPMIDIINCAPSW; +typedef struct midihdr_tag { + LPSTR lpData; + DWORD dwBufferLength; + DWORD dwBytesRecorded; + DWORD dwUser; + DWORD dwFlags; + struct midihdr_tag *lpNext; + DWORD reserved; + DWORD dwOffset; + DWORD dwReserved[8]; +} MIDIHDR,*PMIDIHDR,*LPMIDIHDR; +typedef struct midievent_tag { + DWORD dwDeltaTime; + DWORD dwStreamID; + DWORD dwEvent; + DWORD dwParms[1]; +} MIDIEVENT; +typedef struct midistrmbuffver_tag { + DWORD dwVersion; + DWORD dwMid; + DWORD dwOEMVersion; +} MIDISTRMBUFFVER; +typedef struct midiproptimediv_tag { + DWORD cbStruct; + DWORD dwTimeDiv; +} MIDIPROPTIMEDIV,*LPMIDIPROPTIMEDIV; +typedef struct midiproptempo_tag { + DWORD cbStruct; + DWORD dwTempo; +} MIDIPROPTEMPO,*LPMIDIPROPTEMPO; +typedef struct tagAUXCAPSA { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + CHAR szPname[MAXPNAMELEN]; + WORD wTechnology; + WORD wReserved1; + DWORD dwSupport; +} AUXCAPSA,*PAUXCAPSA,*LPAUXCAPSA; +typedef struct tagAUXCAPSW { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + WCHAR szPname[MAXPNAMELEN]; + WORD wTechnology; + WORD wReserved1; + DWORD dwSupport; +} AUXCAPSW,*PAUXCAPSW,*LPAUXCAPSW; +DECLARE_HANDLE(HMIXEROBJ); +typedef HMIXEROBJ *LPHMIXEROBJ; +DECLARE_HANDLE(HMIXER); +typedef HMIXER *LPHMIXER; +typedef struct tagMIXERCAPSA { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + CHAR szPname[MAXPNAMELEN]; + DWORD fdwSupport; + DWORD cDestinations; +} MIXERCAPSA,*PMIXERCAPSA,*LPMIXERCAPSA; +typedef struct tagMIXERCAPSW { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + WCHAR szPname[MAXPNAMELEN]; + DWORD fdwSupport; + DWORD cDestinations; +} MIXERCAPSW,*PMIXERCAPSW,*LPMIXERCAPSW; +typedef struct tagMIXERLINEA { + DWORD cbStruct; + DWORD dwDestination; + DWORD dwSource; + DWORD dwLineID; + DWORD fdwLine; + DWORD dwUser; + DWORD dwComponentType; + DWORD cChannels; + DWORD cConnections; + DWORD cControls; + CHAR szShortName[MIXER_SHORT_NAME_CHARS]; + CHAR szName[MIXER_LONG_NAME_CHARS]; + struct { + DWORD dwType; + DWORD dwDeviceID; + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + CHAR szPname[MAXPNAMELEN]; + } Target; +} MIXERLINEA,*PMIXERLINEA,*LPMIXERLINEA; +typedef struct tagMIXERLINEW { + DWORD cbStruct; + DWORD dwDestination; + DWORD dwSource; + DWORD dwLineID; + DWORD fdwLine; + DWORD dwUser; + DWORD dwComponentType; + DWORD cChannels; + DWORD cConnections; + DWORD cControls; + WCHAR szShortName[MIXER_SHORT_NAME_CHARS]; + WCHAR szName[MIXER_LONG_NAME_CHARS]; + struct { + DWORD dwType; + DWORD dwDeviceID; + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + WCHAR szPname[MAXPNAMELEN]; + } Target; +} MIXERLINEW,*PMIXERLINEW,*LPMIXERLINEW; +typedef struct tagMIXERCONTROLA { + DWORD cbStruct; + DWORD dwControlID; + DWORD dwControlType; + DWORD fdwControl; + DWORD cMultipleItems; + CHAR szShortName[MIXER_SHORT_NAME_CHARS]; + CHAR szName[MIXER_LONG_NAME_CHARS]; + union { + _ANONYMOUS_STRUCT struct { + LONG lMinimum; + LONG lMaximum; + }_STRUCT_NAME(s); + _ANONYMOUS_STRUCT struct { + DWORD dwMinimum; + DWORD dwMaximum; + }_STRUCT_NAME(s1); + DWORD dwReserved[6]; + } Bounds; + union { + DWORD cSteps; + DWORD cbCustomData; + DWORD dwReserved[6]; + } Metrics; +} MIXERCONTROLA,*PMIXERCONTROLA,*LPMIXERCONTROLA; +typedef struct tagMIXERCONTROLW { + DWORD cbStruct; + DWORD dwControlID; + DWORD dwControlType; + DWORD fdwControl; + DWORD cMultipleItems; + WCHAR szShortName[MIXER_SHORT_NAME_CHARS]; + WCHAR szName[MIXER_LONG_NAME_CHARS]; + union { + _ANONYMOUS_STRUCT struct { + LONG lMinimum; + LONG lMaximum; + }_STRUCT_NAME(s); + _ANONYMOUS_STRUCT struct { + DWORD dwMinimum; + DWORD dwMaximum; + }_STRUCT_NAME(s1); + DWORD dwReserved[6]; + } Bounds; + union { + DWORD cSteps; + DWORD cbCustomData; + DWORD dwReserved[6]; + } Metrics; +} MIXERCONTROLW,*PMIXERCONTROLW,*LPMIXERCONTROLW; +typedef struct tagMIXERLINECONTROLSA { + DWORD cbStruct; + DWORD dwLineID; + _ANONYMOUS_UNION union { + DWORD dwControlID; + DWORD dwControlType; + } DUMMYUNIONNAME; + DWORD cControls; + DWORD cbmxctrl; + LPMIXERCONTROLA pamxctrl; +} MIXERLINECONTROLSA,*PMIXERLINECONTROLSA,*LPMIXERLINECONTROLSA; +typedef struct tagMIXERLINECONTROLSW { + DWORD cbStruct; + DWORD dwLineID; + _ANONYMOUS_UNION union { + DWORD dwControlID; + DWORD dwControlType; + } DUMMYUNIONNAME; + DWORD cControls; + DWORD cbmxctrl; + LPMIXERCONTROLW pamxctrl; +} MIXERLINECONTROLSW,*PMIXERLINECONTROLSW,*LPMIXERLINECONTROLSW; +typedef struct tMIXERCONTROLDETAILS { + DWORD cbStruct; + DWORD dwControlID; + DWORD cChannels; + _ANONYMOUS_UNION union { + HWND hwndOwner; + DWORD cMultipleItems; + } DUMMYUNIONNAME; + DWORD cbDetails; + PVOID paDetails; +} MIXERCONTROLDETAILS,*PMIXERCONTROLDETAILS,*LPMIXERCONTROLDETAILS; +typedef struct tagMIXERCONTROLDETAILS_LISTTEXTA { + DWORD dwParam1; + DWORD dwParam2; + CHAR szName[MIXER_LONG_NAME_CHARS]; +} MIXERCONTROLDETAILS_LISTTEXTA,*PMIXERCONTROLDETAILS_LISTTEXTA,*LPMIXERCONTROLDETAILS_LISTTEXTA; +typedef struct tagMIXERCONTROLDETAILS_LISTTEXTW { + DWORD dwParam1; + DWORD dwParam2; + WCHAR szName[MIXER_LONG_NAME_CHARS]; +} MIXERCONTROLDETAILS_LISTTEXTW,*PMIXERCONTROLDETAILS_LISTTEXTW,*LPMIXERCONTROLDETAILS_LISTTEXTW; +typedef struct tMIXERCONTROLDETAILS_BOOLEAN { + LONG fValue; +} MIXERCONTROLDETAILS_BOOLEAN,*PMIXERCONTROLDETAILS_BOOLEAN,*LPMIXERCONTROLDETAILS_BOOLEAN; +typedef struct tMIXERCONTROLDETAILS_SIGNED { + LONG lValue; +} MIXERCONTROLDETAILS_SIGNED,*PMIXERCONTROLDETAILS_SIGNED,*LPMIXERCONTROLDETAILS_SIGNED; +typedef struct tMIXERCONTROLDETAILS_UNSIGNED { + DWORD dwValue; +} MIXERCONTROLDETAILS_UNSIGNED,*PMIXERCONTROLDETAILS_UNSIGNED,*LPMIXERCONTROLDETAILS_UNSIGNED; +typedef void(CALLBACK TIMECALLBACK)(UINT,UINT,DWORD,DWORD,DWORD); +typedef TIMECALLBACK *LPTIMECALLBACK; +typedef struct timecaps_tag { + UINT wPeriodMin; + UINT wPeriodMax; +} TIMECAPS,*PTIMECAPS,*LPTIMECAPS; +typedef struct tagJOYCAPSA { + WORD wMid; + WORD wPid; + CHAR szPname[MAXPNAMELEN]; + UINT wXmin; + UINT wXmax; + UINT wYmin; + UINT wYmax; + UINT wZmin; + UINT wZmax; + UINT wNumButtons; + UINT wPeriodMin; + UINT wPeriodMax; + UINT wRmin; + UINT wRmax; + UINT wUmin; + UINT wUmax; + UINT wVmin; + UINT wVmax; + UINT wCaps; + UINT wMaxAxes; + UINT wNumAxes; + UINT wMaxButtons; + CHAR szRegKey[MAXPNAMELEN]; + CHAR szOEMVxD[MAX_JOYSTICKOEMVXDNAME]; +} JOYCAPSA,*PJOYCAPSA,*LPJOYCAPSA; +typedef struct tagJOYCAPSW { + WORD wMid; + WORD wPid; + WCHAR szPname[MAXPNAMELEN]; + UINT wXmin; + UINT wXmax; + UINT wYmin; + UINT wYmax; + UINT wZmin; + UINT wZmax; + UINT wNumButtons; + UINT wPeriodMin; + UINT wPeriodMax; + UINT wRmin; + UINT wRmax; + UINT wUmin; + UINT wUmax; + UINT wVmin; + UINT wVmax; + UINT wCaps; + UINT wMaxAxes; + UINT wNumAxes; + UINT wMaxButtons; + WCHAR szRegKey[MAXPNAMELEN]; + WCHAR szOEMVxD[MAX_JOYSTICKOEMVXDNAME]; +} JOYCAPSW,*PJOYCAPSW,*LPJOYCAPSW; +typedef struct joyinfo_tag { + UINT wXpos; + UINT wYpos; + UINT wZpos; + UINT wButtons; +} JOYINFO,*PJOYINFO,*LPJOYINFO; +typedef struct joyinfoex_tag { + DWORD dwSize; + DWORD dwFlags; + DWORD dwXpos; + DWORD dwYpos; + DWORD dwZpos; + DWORD dwRpos; + DWORD dwUpos; + DWORD dwVpos; + DWORD dwButtons; + DWORD dwButtonNumber; + DWORD dwPOV; + DWORD dwReserved1; + DWORD dwReserved2; +} JOYINFOEX,*PJOYINFOEX,*LPJOYINFOEX; +typedef DWORD FOURCC; +typedef char *HPSTR; +DECLARE_HANDLE(HMMIO); +typedef LRESULT (CALLBACK MMIOPROC)(LPSTR,UINT,LPARAM,LPARAM); +typedef MMIOPROC *LPMMIOPROC; +typedef struct _MMIOINFO { + DWORD dwFlags; + FOURCC fccIOProc; + LPMMIOPROC pIOProc; + UINT wErrorRet; + HTASK htask; + LONG cchBuffer; + HPSTR pchBuffer; + HPSTR pchNext; + HPSTR pchEndRead; + HPSTR pchEndWrite; + LONG lBufOffset; + LONG lDiskOffset; + DWORD adwInfo[3]; + DWORD dwReserved1; + DWORD dwReserved2; + HMMIO hmmio; +} MMIOINFO,*PMMIOINFO,*LPMMIOINFO; +typedef const MMIOINFO *LPCMMIOINFO; +typedef struct _MMCKINFO { + FOURCC ckid; + DWORD cksize; + FOURCC fccType; + DWORD dwDataOffset; + DWORD dwFlags; +} MMCKINFO,*PMMCKINFO,*LPMMCKINFO; +typedef const MMCKINFO *LPCMMCKINFO; +typedef struct tagMCI_GENERIC_PARMS { + DWORD dwCallback; +} MCI_GENERIC_PARMS,*PMCI_GENERIC_PARMS,*LPMCI_GENERIC_PARMS; +typedef struct tagMCI_OPEN_PARMSA { + DWORD dwCallback; + MCIDEVICEID wDeviceID; + LPCSTR lpstrDeviceType; + LPCSTR lpstrElementName; + LPCSTR lpstrAlias; +} MCI_OPEN_PARMSA,*PMCI_OPEN_PARMSA,*LPMCI_OPEN_PARMSA; +typedef struct tagMCI_OPEN_PARMSW { + DWORD dwCallback; + MCIDEVICEID wDeviceID; + LPCWSTR lpstrDeviceType; + LPCWSTR lpstrElementName; + LPCWSTR lpstrAlias; +} MCI_OPEN_PARMSW,*PMCI_OPEN_PARMSW,*LPMCI_OPEN_PARMSW; +typedef struct tagMCI_PLAY_PARMS { + DWORD dwCallback; + DWORD dwFrom; + DWORD dwTo; +} MCI_PLAY_PARMS,*PMCI_PLAY_PARMS,*LPMCI_PLAY_PARMS; +typedef struct tagMCI_SEEK_PARMS { + DWORD dwCallback; + DWORD dwTo; +} MCI_SEEK_PARMS, *PMCI_SEEK_PARMS,*LPMCI_SEEK_PARMS; +typedef struct tagMCI_STATUS_PARMS { + DWORD dwCallback; + DWORD dwReturn; + DWORD dwItem; + DWORD dwTrack; +} MCI_STATUS_PARMS,*PMCI_STATUS_PARMS,*LPMCI_STATUS_PARMS; +typedef struct tagMCI_INFO_PARMSA { + DWORD dwCallback; + LPSTR lpstrReturn; + DWORD dwRetSize; +} MCI_INFO_PARMSA,*LPMCI_INFO_PARMSA; +typedef struct tagMCI_INFO_PARMSW { + DWORD dwCallback; + LPWSTR lpstrReturn; + DWORD dwRetSize; +} MCI_INFO_PARMSW,*LPMCI_INFO_PARMSW; +typedef struct tagMCI_GETDEVCAPS_PARMS { + DWORD dwCallback; + DWORD dwReturn; + DWORD dwItem; +} MCI_GETDEVCAPS_PARMS,*PMCI_GETDEVCAPS_PARMS,*LPMCI_GETDEVCAPS_PARMS; +typedef struct tagMCI_SYSINFO_PARMSA { + DWORD dwCallback; + LPSTR lpstrReturn; + DWORD dwRetSize; + DWORD dwNumber; + UINT wDeviceType; +} MCI_SYSINFO_PARMSA,*PMCI_SYSINFO_PARMSA,*LPMCI_SYSINFO_PARMSA; +typedef struct tagMCI_SYSINFO_PARMSW { + DWORD dwCallback; + LPWSTR lpstrReturn; + DWORD dwRetSize; + DWORD dwNumber; + UINT wDeviceType; +} MCI_SYSINFO_PARMSW,*PMCI_SYSINFO_PARMSW,*LPMCI_SYSINFO_PARMSW; +typedef struct tagMCI_SET_PARMS { + DWORD dwCallback; + DWORD dwTimeFormat; + DWORD dwAudio; +} MCI_SET_PARMS,*PMCI_SET_PARMS,*LPMCI_SET_PARMS; +typedef struct tagMCI_BREAK_PARMS { + DWORD dwCallback; + int nVirtKey; + HWND hwndBreak; +} MCI_BREAK_PARMS,*PMCI_BREAK_PARMS,*LPMCI_BREAK_PARMS; +typedef struct tagMCI_SAVE_PARMSA { + DWORD dwCallback; + LPCSTR lpfilename; +} MCI_SAVE_PARMSA,*PMCI_SAVE_PARMSA,*LPMCI_SAVE_PARMSA; +typedef struct tagMCI_SAVE_PARMSW { + DWORD dwCallback; + LPCWSTR lpfilename; +} MCI_SAVE_PARMSW,*PMCI_SAVE_PARMSW,*LPMCI_SAVE_PARMSW; +typedef struct tagMCI_LOAD_PARMSA { + DWORD dwCallback; + LPCSTR lpfilename; +} MCI_LOAD_PARMSA,*PMCI_LOAD_PARMSA,*LPMCI_LOAD_PARMSA; +typedef struct tagMCI_LOAD_PARMSW { + DWORD dwCallback; + LPCWSTR lpfilename; +} MCI_LOAD_PARMSW,*PMCI_LOAD_PARMSW,*LPMCI_LOAD_PARMSW; +typedef struct tagMCI_RECORD_PARMS { + DWORD dwCallback; + DWORD dwFrom; + DWORD dwTo; +} MCI_RECORD_PARMS,*LPMCI_RECORD_PARMS; +typedef struct tagMCI_VD_PLAY_PARMS { + DWORD dwCallback; + DWORD dwFrom; + DWORD dwTo; + DWORD dwSpeed; +} MCI_VD_PLAY_PARMS,*PMCI_VD_PLAY_PARMS,*LPMCI_VD_PLAY_PARMS; +typedef struct tagMCI_VD_STEP_PARMS { + DWORD dwCallback; + DWORD dwFrames; +} MCI_VD_STEP_PARMS,*PMCI_VD_STEP_PARMS,*LPMCI_VD_STEP_PARMS; +typedef struct tagMCI_VD_ESCAPE_PARMSA { + DWORD dwCallback; + LPCSTR lpstrCommand; +} MCI_VD_ESCAPE_PARMSA,*PMCI_VD_ESCAPE_PARMSA,*LPMCI_VD_ESCAPE_PARMSA; +typedef struct tagMCI_VD_ESCAPE_PARMSW { + DWORD dwCallback; + LPCWSTR lpstrCommand; +} MCI_VD_ESCAPE_PARMSW,*PMCI_VD_ESCAPE_PARMSW,*LPMCI_VD_ESCAPE_PARMSW; +typedef struct tagMCI_WAVE_OPEN_PARMSA { + DWORD dwCallback; + MCIDEVICEID wDeviceID; + LPCSTR lpstrDeviceType; + LPCSTR lpstrElementName; + LPCSTR lpstrAlias; + DWORD dwBufferSeconds; +} MCI_WAVE_OPEN_PARMSA,*PMCI_WAVE_OPEN_PARMSA,*LPMCI_WAVE_OPEN_PARMSA; +typedef struct tagMCI_WAVE_OPEN_PARMSW { + DWORD dwCallback; + MCIDEVICEID wDeviceID; + LPCWSTR lpstrDeviceType; + LPCWSTR lpstrElementName; + LPCWSTR lpstrAlias; + DWORD dwBufferSeconds; +} MCI_WAVE_OPEN_PARMSW,*PMCI_WAVE_OPEN_PARMSW,*LPMCI_WAVE_OPEN_PARMSW; +typedef struct tagMCI_WAVE_DELETE_PARMS { + DWORD dwCallback; + DWORD dwFrom; + DWORD dwTo; +} MCI_WAVE_DELETE_PARMS, *PMCI_WAVE_DELETE_PARMS,*LPMCI_WAVE_DELETE_PARMS; +typedef struct tagMCI_WAVE_SET_PARMS { + DWORD dwCallback; + DWORD dwTimeFormat; + DWORD dwAudio; + UINT wInput; + UINT wOutput; + WORD wFormatTag; + WORD wReserved2; + WORD nChannels; + WORD wReserved3; + DWORD nSamplesPerSec; + DWORD nAvgBytesPerSec; + WORD nBlockAlign; + WORD wReserved4; + WORD wBitsPerSample; + WORD wReserved5; +} MCI_WAVE_SET_PARMS,*PMCI_WAVE_SET_PARMS,*LPMCI_WAVE_SET_PARMS; + +LRESULT WINAPI CloseDriver(HDRVR,LONG,LONG); +HDRVR WINAPI OpenDriver(LPCWSTR,LPCWSTR,LONG); +LRESULT WINAPI SendDriverMessage(HDRVR,UINT,LONG,LONG); +HMODULE WINAPI DrvGetModuleHandle(HDRVR); +HMODULE WINAPI GetDriverModuleHandle(HDRVR); +LRESULT WINAPI DefDriverProc(DWORD,HDRVR,UINT,LPARAM,LPARAM); +UINT WINAPI mmsystemGetVersion(void); +#define OutputDebugStr OutputDebugString +BOOL WINAPI sndPlaySoundA(LPCSTR,UINT); +BOOL WINAPI sndPlaySoundW(LPCWSTR,UINT); +BOOL WINAPI PlaySoundA(LPCSTR,HMODULE,DWORD); +BOOL WINAPI PlaySoundW(LPCWSTR,HMODULE,DWORD); +UINT WINAPI waveOutGetNumDevs(void); +MMRESULT WINAPI waveOutGetDevCapsA(UINT,LPWAVEOUTCAPSA,UINT); +MMRESULT WINAPI waveOutGetDevCapsW(UINT,LPWAVEOUTCAPSW,UINT); +MMRESULT WINAPI waveOutGetVolume(HWAVEOUT,PDWORD); +MMRESULT WINAPI waveOutSetVolume(HWAVEOUT,DWORD); +MMRESULT WINAPI waveOutGetErrorTextA(MMRESULT,LPSTR,UINT); +MMRESULT WINAPI waveOutGetErrorTextW(MMRESULT,LPWSTR,UINT); +MMRESULT WINAPI waveOutOpen(LPHWAVEOUT,UINT,LPCWAVEFORMATEX,DWORD,DWORD,DWORD); +MMRESULT WINAPI waveOutClose(HWAVEOUT); +MMRESULT WINAPI waveOutPrepareHeader(HWAVEOUT,LPWAVEHDR,UINT); +MMRESULT WINAPI waveOutUnprepareHeader(HWAVEOUT,LPWAVEHDR,UINT); +MMRESULT WINAPI waveOutWrite(HWAVEOUT,LPWAVEHDR,UINT); +MMRESULT WINAPI waveOutPause(HWAVEOUT); +MMRESULT WINAPI waveOutRestart(HWAVEOUT); +MMRESULT WINAPI waveOutReset(HWAVEOUT); +MMRESULT WINAPI waveOutBreakLoop(HWAVEOUT); +MMRESULT WINAPI waveOutGetPosition(HWAVEOUT,LPMMTIME,UINT); +MMRESULT WINAPI waveOutGetPitch(HWAVEOUT,PDWORD); +MMRESULT WINAPI waveOutSetPitch(HWAVEOUT,DWORD); +MMRESULT WINAPI waveOutGetPlaybackRate(HWAVEOUT,PDWORD); +MMRESULT WINAPI waveOutSetPlaybackRate(HWAVEOUT,DWORD); +MMRESULT WINAPI waveOutGetID(HWAVEOUT,LPUINT); +MMRESULT WINAPI waveOutMessage(HWAVEOUT,UINT,DWORD,DWORD); +UINT WINAPI waveInGetNumDevs(void); +MMRESULT WINAPI waveInGetDevCapsA(UINT,LPWAVEINCAPSA,UINT); +MMRESULT WINAPI waveInGetDevCapsW(UINT,LPWAVEINCAPSW,UINT); +MMRESULT WINAPI waveInGetErrorTextA(MMRESULT,LPSTR,UINT); +MMRESULT WINAPI waveInGetErrorTextW(MMRESULT,LPWSTR,UINT); +MMRESULT WINAPI waveInOpen(LPHWAVEIN,UINT,LPCWAVEFORMATEX,DWORD,DWORD,DWORD); +MMRESULT WINAPI waveInClose(HWAVEIN); +MMRESULT WINAPI waveInPrepareHeader(HWAVEIN,LPWAVEHDR,UINT); +MMRESULT WINAPI waveInUnprepareHeader(HWAVEIN,LPWAVEHDR,UINT); +MMRESULT WINAPI waveInAddBuffer(HWAVEIN,LPWAVEHDR,UINT); +MMRESULT WINAPI waveInStart(HWAVEIN); +MMRESULT WINAPI waveInStop(HWAVEIN); +MMRESULT WINAPI waveInReset(HWAVEIN); +MMRESULT WINAPI waveInGetPosition(HWAVEIN,LPMMTIME,UINT); +MMRESULT WINAPI waveInGetID(HWAVEIN,LPUINT); +MMRESULT WINAPI waveInMessage(HWAVEIN,UINT,DWORD,DWORD); +UINT WINAPI midiOutGetNumDevs(void); +MMRESULT WINAPI midiStreamOpen(LPHMIDISTRM,LPUINT,DWORD,DWORD,DWORD,DWORD); +MMRESULT WINAPI midiStreamClose(HMIDISTRM); +MMRESULT WINAPI midiStreamProperty(HMIDISTRM,LPBYTE,DWORD); +MMRESULT WINAPI midiStreamPosition(HMIDISTRM,LPMMTIME,UINT); +MMRESULT WINAPI midiStreamOut(HMIDISTRM,LPMIDIHDR,UINT); +MMRESULT WINAPI midiStreamPause(HMIDISTRM); +MMRESULT WINAPI midiStreamRestart(HMIDISTRM); +MMRESULT WINAPI midiStreamStop(HMIDISTRM); +MMRESULT WINAPI midiConnect(HMIDI,HMIDIOUT,PVOID); +MMRESULT WINAPI midiDisconnect(HMIDI,HMIDIOUT,PVOID); +MMRESULT WINAPI midiOutGetDevCapsA(UINT,LPMIDIOUTCAPSA,UINT); +MMRESULT WINAPI midiOutGetDevCapsW(UINT,LPMIDIOUTCAPSW,UINT); +MMRESULT WINAPI midiOutGetVolume(HMIDIOUT,PDWORD); +MMRESULT WINAPI midiOutSetVolume(HMIDIOUT,DWORD); +MMRESULT WINAPI midiOutGetErrorTextA(MMRESULT,LPSTR,UINT); +MMRESULT WINAPI midiOutGetErrorTextW(MMRESULT,LPWSTR,UINT); +MMRESULT WINAPI midiOutOpen(LPHMIDIOUT,UINT,DWORD,DWORD,DWORD); +MMRESULT WINAPI midiOutClose(HMIDIOUT); +MMRESULT WINAPI midiOutPrepareHeader(HMIDIOUT,LPMIDIHDR,UINT); +MMRESULT WINAPI midiOutUnprepareHeader(HMIDIOUT,LPMIDIHDR,UINT); +MMRESULT WINAPI midiOutShortMsg(HMIDIOUT,DWORD); +MMRESULT WINAPI midiOutLongMsg(HMIDIOUT,LPMIDIHDR,UINT); +MMRESULT WINAPI midiOutReset(HMIDIOUT); +MMRESULT WINAPI midiOutCachePatches(HMIDIOUT,UINT,LPWORD,UINT); +MMRESULT WINAPI midiOutCacheDrumPatches(HMIDIOUT,UINT,LPWORD,UINT); +MMRESULT WINAPI midiOutGetID(HMIDIOUT,LPUINT); +MMRESULT WINAPI midiOutMessage(HMIDIOUT,UINT,DWORD,DWORD); +UINT WINAPI midiInGetNumDevs(void); +MMRESULT WINAPI midiInGetDevCapsA(UINT,LPMIDIINCAPSA,UINT); +MMRESULT WINAPI midiInGetDevCapsW(UINT,LPMIDIINCAPSW,UINT); +MMRESULT WINAPI midiInGetErrorTextA(MMRESULT,LPSTR,UINT); +MMRESULT WINAPI midiInGetErrorTextW(MMRESULT,LPWSTR,UINT); +MMRESULT WINAPI midiInOpen(LPHMIDIIN,UINT,DWORD,DWORD,DWORD); +MMRESULT WINAPI midiInClose(HMIDIIN); +MMRESULT WINAPI midiInPrepareHeader(HMIDIIN,LPMIDIHDR,UINT); +MMRESULT WINAPI midiInUnprepareHeader(HMIDIIN,LPMIDIHDR,UINT); +MMRESULT WINAPI midiInAddBuffer(HMIDIIN,LPMIDIHDR,UINT); +MMRESULT WINAPI midiInStart(HMIDIIN); +MMRESULT WINAPI midiInStop(HMIDIIN); +MMRESULT WINAPI midiInReset(HMIDIIN); +MMRESULT WINAPI midiInGetID(HMIDIIN,LPUINT); +MMRESULT WINAPI midiInMessage(HMIDIIN,UINT,DWORD,DWORD); +UINT WINAPI auxGetNumDevs(void); +MMRESULT WINAPI auxGetDevCapsA(UINT,LPAUXCAPSA,UINT); +MMRESULT WINAPI auxGetDevCapsW(UINT,LPAUXCAPSW,UINT); +MMRESULT WINAPI auxSetVolume(UINT,DWORD); +MMRESULT WINAPI auxGetVolume(UINT,PDWORD); +MMRESULT WINAPI auxOutMessage(UINT,UINT,DWORD,DWORD); +UINT WINAPI mixerGetNumDevs(void); +MMRESULT WINAPI mixerGetDevCapsA(UINT,LPMIXERCAPSA,UINT); +MMRESULT WINAPI mixerGetDevCapsW(UINT,LPMIXERCAPSW,UINT); +MMRESULT WINAPI mixerOpen(LPHMIXER,UINT,DWORD,DWORD,DWORD); +MMRESULT WINAPI mixerClose(HMIXER); +DWORD WINAPI mixerMessage(HMIXER,UINT,DWORD,DWORD); +MMRESULT WINAPI mixerGetLineInfoA(HMIXEROBJ,LPMIXERLINEA,DWORD); +MMRESULT WINAPI mixerGetLineInfoW(HMIXEROBJ,LPMIXERLINEW,DWORD); +MMRESULT WINAPI mixerGetID(HMIXEROBJ,PUINT,DWORD); +MMRESULT WINAPI mixerGetLineControlsA(HMIXEROBJ,LPMIXERLINECONTROLSA,DWORD); +MMRESULT WINAPI mixerGetLineControlsW(HMIXEROBJ,LPMIXERLINECONTROLSW,DWORD); +MMRESULT WINAPI mixerGetControlDetailsA(HMIXEROBJ,LPMIXERCONTROLDETAILS,DWORD); +MMRESULT WINAPI mixerGetControlDetailsW(HMIXEROBJ,LPMIXERCONTROLDETAILS,DWORD); +MMRESULT WINAPI mixerSetControlDetails(HMIXEROBJ,LPMIXERCONTROLDETAILS,DWORD); +MMRESULT WINAPI timeGetSystemTime(LPMMTIME,UINT); +DWORD WINAPI timeGetTime(void); +MMRESULT WINAPI timeSetEvent(UINT,UINT,LPTIMECALLBACK,DWORD,UINT); +MMRESULT WINAPI timeKillEvent(UINT); +MMRESULT WINAPI timeGetDevCaps(LPTIMECAPS,UINT); +MMRESULT WINAPI timeBeginPeriod(UINT); +MMRESULT WINAPI timeEndPeriod(UINT); +UINT WINAPI joyGetNumDevs(void); +MMRESULT WINAPI joyGetDevCapsA(UINT,LPJOYCAPSA,UINT); +MMRESULT WINAPI joyGetDevCapsW(UINT,LPJOYCAPSW,UINT); +MMRESULT WINAPI joyGetPos(UINT,LPJOYINFO); +MMRESULT WINAPI joyGetPosEx(UINT,LPJOYINFOEX); +MMRESULT WINAPI joyGetThreshold(UINT,LPUINT); +MMRESULT WINAPI joyReleaseCapture(UINT); +MMRESULT WINAPI joySetCapture(HWND,UINT,UINT,BOOL); +MMRESULT WINAPI joySetThreshold(UINT,UINT); +FOURCC WINAPI mmioStringToFOURCCA(LPCSTR,UINT); +FOURCC WINAPI mmioStringToFOURCCW(LPCWSTR,UINT); +LPMMIOPROC WINAPI mmioInstallIOProcA(FOURCC,LPMMIOPROC,DWORD); +LPMMIOPROC WINAPI mmioInstallIOProcW(FOURCC,LPMMIOPROC,DWORD); +HMMIO WINAPI mmioOpenA(LPSTR,LPMMIOINFO,DWORD); +HMMIO WINAPI mmioOpenW(LPWSTR,LPMMIOINFO,DWORD); +MMRESULT WINAPI mmioRenameA(LPCSTR,LPCSTR,LPCMMIOINFO,DWORD); +MMRESULT WINAPI mmioRenameW(LPCWSTR,LPCWSTR,LPCMMIOINFO,DWORD); +MMRESULT WINAPI mmioClose(HMMIO,UINT); +LONG WINAPI mmioRead(HMMIO,HPSTR,LONG); +LONG WINAPI mmioWrite(HMMIO,LPCSTR,LONG); +LONG WINAPI mmioSeek(HMMIO,LONG,int); +MMRESULT WINAPI mmioGetInfo(HMMIO,LPMMIOINFO,UINT); +MMRESULT WINAPI mmioSetInfo(HMMIO,LPCMMIOINFO,UINT); +MMRESULT WINAPI mmioSetBuffer(HMMIO,LPSTR,LONG,UINT); +MMRESULT WINAPI mmioFlush(HMMIO,UINT); +MMRESULT WINAPI mmioAdvance(HMMIO,LPMMIOINFO,UINT); +LRESULT WINAPI mmioSendMessage(HMMIO,UINT,LPARAM,LPARAM); +MMRESULT WINAPI mmioDescend(HMMIO,LPMMCKINFO,const MMCKINFO*,UINT); +MMRESULT WINAPI mmioAscend(HMMIO,LPMMCKINFO,UINT); +MMRESULT WINAPI mmioCreateChunk(HMMIO,LPMMCKINFO,UINT); +MCIERROR WINAPI mciSendCommandA(MCIDEVICEID,UINT,DWORD,DWORD); +MCIERROR WINAPI mciSendCommandW(MCIDEVICEID,UINT,DWORD,DWORD); +MCIERROR WINAPI mciSendStringA(LPCSTR,LPSTR,UINT,HWND); +MCIERROR WINAPI mciSendStringW(LPCWSTR,LPWSTR,UINT,HWND); +MCIDEVICEID WINAPI mciGetDeviceIDA(LPCSTR); +MCIDEVICEID WINAPI mciGetDeviceIDW(LPCWSTR); +MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDA(DWORD,LPCSTR); +MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDW(DWORD,LPCWSTR); +BOOL WINAPI mciGetErrorStringA(MCIERROR,LPSTR,UINT); +BOOL WINAPI mciGetErrorStringW(MCIERROR,LPWSTR,UINT); +BOOL WINAPI mciSetYieldProc(MCIDEVICEID,YIELDPROC,DWORD); +HTASK WINAPI mciGetCreatorTask(MCIDEVICEID); +YIELDPROC WINAPI mciGetYieldProc(MCIDEVICEID,PDWORD); + +typedef struct tagMCI_SEQ_SET_PARMS { + DWORD dwCallback; + DWORD dwTimeFormat; + DWORD dwAudio; + DWORD dwTempo; + DWORD dwPort; + DWORD dwSlave; + DWORD dwMaster; + DWORD dwOffset; +} MCI_SEQ_SET_PARMS,*PMCI_SEQ_SET_PARMS,*LPMCI_SEQ_SET_PARMS; +typedef struct tagMCI_ANIM_OPEN_PARMSA { + DWORD dwCallback; + MCIDEVICEID wDeviceID; + LPCSTR lpstrDeviceType; + LPCSTR lpstrElementName; + LPCSTR lpstrAlias; + DWORD dwStyle; + HWND hWndParent; +} MCI_ANIM_OPEN_PARMSA,*PMCI_ANIM_OPEN_PARMSA,*LPMCI_ANIM_OPEN_PARMSA; +typedef struct tagMCI_ANIM_OPEN_PARMSW { + DWORD dwCallback; + MCIDEVICEID wDeviceID; + LPCWSTR lpstrDeviceType; + LPCWSTR lpstrElementName; + LPCWSTR lpstrAlias; + DWORD dwStyle; + HWND hWndParent; +} MCI_ANIM_OPEN_PARMSW,*PMCI_ANIM_OPEN_PARMSW,*LPMCI_ANIM_OPEN_PARMSW; +typedef struct tagMCI_ANIM_PLAY_PARMS { + DWORD dwCallback; + DWORD dwFrom; + DWORD dwTo; + DWORD dwSpeed; +} MCI_ANIM_PLAY_PARMS,*PMCI_ANIM_PLAY_PARMS,*LPMCI_ANIM_PLAY_PARMS; +typedef struct tagMCI_ANIM_STEP_PARMS { + DWORD dwCallback; + DWORD dwFrames; +} MCI_ANIM_STEP_PARMS,*PMCI_ANIM_STEP_PARMS,*LPMCI_ANIM_STEP_PARMS; +typedef struct tagMCI_ANIM_WINDOW_PARMSA { + DWORD dwCallback; + HWND hWnd; + UINT nCmdShow; + LPCSTR lpstrText; +} MCI_ANIM_WINDOW_PARMSA,*PMCI_ANIM_WINDOW_PARMSA,*LPMCI_ANIM_WINDOW_PARMSA; +typedef struct tagMCI_ANIM_WINDOW_PARMSW { + DWORD dwCallback; + HWND hWnd; + UINT nCmdShow; + LPCWSTR lpstrText; +} MCI_ANIM_WINDOW_PARMSW,*PMCI_ANIM_WINDOW_PARMSW,*LPMCI_ANIM_WINDOW_PARMSW; +typedef struct tagMCI_ANIM_RECT_PARMS { + DWORD dwCallback; +#ifdef MCI_USE_OFFEXT + POINT ptOffset; + POINT ptExtent; +#else + RECT rc; +#endif +} MCI_ANIM_RECT_PARMS,*PMCI_ANIM_RECT_PARMS,*LPMCI_ANIM_RECT_PARMS; +typedef struct tagMCI_ANIM_UPDATE_PARMS { + DWORD dwCallback; + RECT rc; + HDC hDC; +} MCI_ANIM_UPDATE_PARMS,*PMCI_ANIM_UPDATE_PARMS,*LPMCI_ANIM_UPDATE_PARMS; +typedef struct tagMCI_OVLY_OPEN_PARMSA { + DWORD dwCallback; + MCIDEVICEID wDeviceID; + LPCSTR lpstrDeviceType; + LPCSTR lpstrElementName; + LPCSTR lpstrAlias; + DWORD dwStyle; + HWND hWndParent; +} MCI_OVLY_OPEN_PARMSA,*PMCI_OVLY_OPEN_PARMSA,*LPMCI_OVLY_OPEN_PARMSA; +typedef struct tagMCI_OVLY_OPEN_PARMSW { + DWORD dwCallback; + MCIDEVICEID wDeviceID; + LPCWSTR lpstrDeviceType; + LPCWSTR lpstrElementName; + LPCWSTR lpstrAlias; + DWORD dwStyle; + HWND hWndParent; +} MCI_OVLY_OPEN_PARMSW,*PMCI_OVLY_OPEN_PARMSW,*LPMCI_OVLY_OPEN_PARMSW; +typedef struct tagMCI_OVLY_WINDOW_PARMSA { + DWORD dwCallback; + HWND hWnd; + UINT nCmdShow; + LPCSTR lpstrText; +} MCI_OVLY_WINDOW_PARMSA,*PMCI_OVLY_WINDOW_PARMSA,*LPMCI_OVLY_WINDOW_PARMSA; +typedef struct tagMCI_OVLY_WINDOW_PARMSW { + DWORD dwCallback; + HWND hWnd; + UINT nCmdShow; + LPCWSTR lpstrText; +} MCI_OVLY_WINDOW_PARMSW,*PMCI_OVLY_WINDOW_PARMSW,*LPMCI_OVLY_WINDOW_PARMSW; +typedef struct tagMCI_OVLY_RECT_PARMS { + DWORD dwCallback; +#ifdef MCI_USE_OFFEXT + POINT ptOffset; + POINT ptExtent; +#else + RECT rc; +#endif +} MCI_OVLY_RECT_PARMS,*PMCI_OVLY_RECT_PARMS,*LPMCI_OVLY_RECT_PARMS; +typedef struct tagMCI_OVLY_SAVE_PARMSA { + DWORD dwCallback; + LPCSTR lpfilename; + RECT rc; +} MCI_OVLY_SAVE_PARMSA,*PMCI_OVLY_SAVE_PARMSA,*LPMCI_OVLY_SAVE_PARMSA; +typedef struct tagMCI_OVLY_SAVE_PARMSW { + DWORD dwCallback; + LPCWSTR lpfilename; + RECT rc; +} MCI_OVLY_SAVE_PARMSW,*PMCI_OVLY_SAVE_PARMSW,*LPMCI_OVLY_SAVE_PARMSW; +typedef struct tagMCI_OVLY_LOAD_PARMSA { + DWORD dwCallback; + LPCSTR lpfilename; + RECT rc; +} MCI_OVLY_LOAD_PARMSA,*PMCI_OVLY_LOAD_PARMSA,*LPMCI_OVLY_LOAD_PARMSA; +typedef struct tagMCI_OVLY_LOAD_PARMSW { + DWORD dwCallback; + LPCWSTR lpfilename; + RECT rc; +} MCI_OVLY_LOAD_PARMSW,*PMCI_OVLY_LOAD_PARMSW,*LPMCI_OVLY_LOAD_PARMSW; + +#ifdef UNICODE +typedef WAVEOUTCAPSW WAVEOUTCAPS,*PWAVEOUTCAPS,*LPWAVEOUTCAPS; +typedef WAVEINCAPSW WAVEINCAPS,*PWAVEINCAPS,*LPWAVEINCAPS; +typedef MIDIOUTCAPSW MIDIOUTCAPS,*PMIDIOUTCAPS,*LPMIDIOUTCAPS; +typedef MIDIINCAPSW MIDIINCAPS,*PMIDIINCAPS,*LPMIDIINCAPS; +typedef AUXCAPSW AUXCAPS,*PAUXCAPS,*LPAUXCAPS; +typedef MIXERCAPSW MIXERCAPS,*PMIXERCAPS,*LPMIXERCAPS; +typedef MIXERLINEW MIXERLINE,*PMIXERLINE,*LPMIXERLINE; +typedef MIXERCONTROLA MIXERCONTROL,*PMIXERCONTROL,*LPMIXERCONTROL; +typedef MIXERLINECONTROLSW MIXERLINECONTROLS,*PMIXERLINECONTROLS,*LPMIXERLINECONTROLS; +typedef MIXERCONTROLDETAILS_LISTTEXTW MIXERCONTROLDETAILS_LISTTEXT,*PMIXERCONTROLDETAILS_LISTTEXT,*LPMIXERCONTROLDETAILS_LISTTEXT; +typedef JOYCAPSW JOYCAPS,*PJOYCAPS,*LPJOYCAPS; +typedef MCI_OPEN_PARMSW MCI_OPEN_PARMS,*PMCI_OPEN_PARMS,*LPMCI_OPEN_PARMS; +typedef MCI_INFO_PARMSW MCI_INFO_PARMS,*LPMCI_INFO_PARMS; +typedef MCI_SYSINFO_PARMSW MCI_SYSINFO_PARMS,*PMCI_SYSINFO_PARMS,*LPMCI_SYSINFO_PARMS; +typedef MCI_SAVE_PARMSW MCI_SAVE_PARMS,*PMCI_SAVE_PARMS,*LPMCI_SAVE_PARMS; +typedef MCI_LOAD_PARMSW MCI_LOAD_PARMS,*PMCI_LOAD_PARMS,*LPMCI_LOAD_PARMS; +typedef MCI_VD_ESCAPE_PARMSW MCI_VD_ESCAPE_PARMS,*PMCI_VD_ESCAPE_PARMS,*LPMCI_VD_ESCAPE_PARMS; +typedef MCI_WAVE_OPEN_PARMSW MCI_WAVE_OPEN_PARMS,*PMCI_WAVE_OPEN_PARMS,*LPMCI_WAVE_OPEN_PARMS; +typedef MCI_ANIM_OPEN_PARMSW MCI_ANIM_OPEN_PARMS,*PMCI_ANIM_OPEN_PARMS,*LPMCI_ANIM_OPEN_PARMS; +typedef MCI_ANIM_WINDOW_PARMSW MCI_ANIM_WINDOW_PARMS,*PMCI_ANIM_WINDOW_PARMS,*LPMCI_ANIM_WINDOW_PARMS; +typedef MCI_OVLY_OPEN_PARMSW MCI_OVLY_OPEN_PARMS,*PMCI_OVLY_OPEN_PARMS,*LPMCI_OVLY_OPEN_PARMS; +typedef MCI_OVLY_WINDOW_PARMSW MCI_OVLY_WINDOW_PARMS,*PMCI_OVLY_WINDOW_PARMS,*LPMCI_OVLY_WINDOW_PARMS; +typedef MCI_OVLY_SAVE_PARMSW MCI_OVLY_SAVE_PARMS,*PMCI_OVLY_SAVE_PARMS,*LPMCI_OVLY_SAVE_PARMS; +#define sndPlaySound sndPlaySoundW +#define PlaySound PlaySoundW +#define waveOutGetDevCaps waveOutGetDevCapsW +#define waveOutGetErrorText waveOutGetErrorTextW +#define waveInGetDevCaps waveInGetDevCapsW +#define waveInGetErrorText waveInGetErrorTextW +#define midiOutGetDevCaps midiOutGetDevCapsW +#define midiOutGetErrorText midiOutGetErrorTextW +#define midiInGetDevCaps midiInGetDevCapsW +#define midiInGetErrorText midiInGetErrorTextW +#define auxGetDevCaps auxGetDevCapsW +#define mixerGetDevCaps mixerGetDevCapsW +#define mixerGetLineInfo mixerGetLineInfoW +#define mixerGetLineControls mixerGetLineControlsW +#define mixerGetControlDetails mixerGetControlDetailsW +#define joyGetDevCaps joyGetDevCapsW +#define mmioInstallIOProc mmioInstallIOProcW +#define mmioStringToFOURCC mmioStringToFOURCCW +#define mmioOpen mmioOpenW +#define mmioRename mmioRenameW +#define mciSendCommand mciSendCommandW +#define mciSendString mciSendStringW +#define mciGetDeviceID mciGetDeviceIDW +#define mciGetDeviceIDFromElementID mciGetDeviceIDFromElementIDW +#define mciGetErrorString mciGetErrorStringW +#else +typedef WAVEOUTCAPSA WAVEOUTCAPS,*PWAVEOUTCAPS,*LPWAVEOUTCAPS; +typedef WAVEINCAPSA WAVEINCAPS,*PWAVEINCAPS,*LPWAVEINCAPS; +typedef MIDIOUTCAPSA MIDIOUTCAPS,*PMIDIOUTCAPS,*LPMIDIOUTCAPS; +typedef MIDIINCAPSA MIDIINCAPS,*PMIDIINCAPS,*LPMIDIINCAPS; +typedef AUXCAPSA AUXCAPS,*PAUXCAPS,*LPAUXCAPS; +typedef MIXERCAPSA MIXERCAPS,*PMIXERCAPS,*LPMIXERCAPS; +typedef MIXERLINEA MIXERLINE,*PMIXERLINE,*LPMIXERLINE; +typedef MIXERCONTROLA MIXERCONTROL,*PMIXERCONTROL,*LPMIXERCONTROL; +typedef MIXERLINECONTROLSA MIXERLINECONTROLS,*PMIXERLINECONTROLS,*LPMIXERLINECONTROLS; +typedef MIXERCONTROLDETAILS_LISTTEXTA MIXERCONTROLDETAILS_LISTTEXT,*PMIXERCONTROLDETAILS_LISTTEXT,*LPMIXERCONTROLDETAILS_LISTTEXT; +typedef JOYCAPSA JOYCAPS,*PJOYCAPS,*LPJOYCAPS; +typedef MCI_OPEN_PARMSA MCI_OPEN_PARMS,*PMCI_OPEN_PARMS,*LPMCI_OPEN_PARMS; +typedef MCI_INFO_PARMSA MCI_INFO_PARMS,*LPMCI_INFO_PARMS; +typedef MCI_SYSINFO_PARMSA MCI_SYSINFO_PARMS,*PMCI_SYSINFO_PARMS,*LPMCI_SYSINFO_PARMS; +typedef MCI_SAVE_PARMSA MCI_SAVE_PARMS,*PMCI_SAVE_PARMS,*LPMCI_SAVE_PARMS; +typedef MCI_LOAD_PARMSA MCI_LOAD_PARMS,*PMCI_LOAD_PARMS,*LPMCI_LOAD_PARMS; +typedef MCI_VD_ESCAPE_PARMSA MCI_VD_ESCAPE_PARMS,*PMCI_VD_ESCAPE_PARMS,*LPMCI_VD_ESCAPE_PARMS; +typedef MCI_WAVE_OPEN_PARMSA MCI_WAVE_OPEN_PARMS,*PMCI_WAVE_OPEN_PARMS,*LPMCI_WAVE_OPEN_PARMS; +typedef MCI_ANIM_OPEN_PARMSA MCI_ANIM_OPEN_PARMS,*PMCI_ANIM_OPEN_PARMS,*LPMCI_ANIM_OPEN_PARMS; +typedef MCI_ANIM_WINDOW_PARMSA MCI_ANIM_WINDOW_PARMS,*PMCI_ANIM_WINDOW_PARMS,*LPMCI_ANIM_WINDOW_PARMS; +typedef MCI_OVLY_OPEN_PARMSA MCI_OVLY_OPEN_PARMS,*PMCI_OVLY_OPEN_PARMS,*LPMCI_OVLY_OPEN_PARMS; +typedef MCI_OVLY_WINDOW_PARMSA MCI_OVLY_WINDOW_PARMS,*PMCI_OVLY_WINDOW_PARMS,*LPMCI_OVLY_WINDOW_PARMS; +typedef MCI_OVLY_SAVE_PARMSA MCI_OVLY_SAVE_PARMS,*PMCI_OVLY_SAVE_PARMS,*LPMCI_OVLY_SAVE_PARMS; +#define sndPlaySound sndPlaySoundA +#define PlaySound PlaySoundA +#define waveOutGetDevCaps waveOutGetDevCapsA +#define waveOutGetErrorText waveOutGetErrorTextA +#define waveInGetDevCaps waveInGetDevCapsA +#define waveInGetErrorText waveInGetErrorTextA +#define midiOutGetDevCaps midiOutGetDevCapsA +#define midiOutGetErrorText midiOutGetErrorTextA +#define midiInGetDevCaps midiInGetDevCapsA +#define midiInGetErrorText midiInGetErrorTextA +#define auxGetDevCaps auxGetDevCapsA +#define mixerGetDevCaps mixerGetDevCapsA +#define mixerGetLineInfo mixerGetLineInfoA +#define mixerGetLineControls mixerGetLineControlsA +#define mixerGetControlDetails mixerGetControlDetailsA +#define joyGetDevCaps joyGetDevCapsA +#define mmioInstallIOProc mmioInstallIOProcA +#define mmioStringToFOURCC mmioStringToFOURCCA +#define mmioOpen mmioOpenA +#define mmioRename mmioRenameA +#define mciSendCommand mciSendCommandA +#define mciSendString mciSendStringA +#define mciGetDeviceID mciGetDeviceIDA +#define mciGetDeviceIDFromElementID mciGetDeviceIDFromElementIDA +#define mciGetErrorString mciGetErrorStringA +#endif +#ifdef __cplusplus +} +#endif +#pragma pack(pop) +#endif diff --git a/reactos/w32api/include/mshtml.h b/reactos/w32api/include/mshtml.h new file mode 100644 index 00000000000..40115e9517a --- /dev/null +++ b/reactos/w32api/include/mshtml.h @@ -0,0 +1,454 @@ +#ifndef _MSHTML_H +#define _MSHTML_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef interface IHTMLElementCollection *LPHTMLELEMENTCOLLECTION; +typedef interface IHTMLElement *LPHTMLELEMENT; +typedef interface IHTMLSelectionObject *LPHTMLSELECTIONOBJECT; +typedef interface IHTMLFramesCollection *LPHTMLFRAMESCOLLECTION; +typedef interface IHTMLLocation *LPHTMLLOCATION; +typedef interface IHTMLWindow2 *LPHTMLWINDOW2; +typedef interface IHTMLStyleSheetsCollection *LPHTMLSTYLESHEETSCOLLECTION; +typedef interface IHTMLStyleSheet *LPHTMLSTYLESHEET; +typedef interface IHTMLStyle *LPHTMLSTYLE; +typedef interface IHTMLFiltersCollection *LPHTMLFILTERSCOLLECTION; +typedef interface IHTMLLinkElement *LPHTMLLINKELEMENT; +typedef interface IHTMLImgElement *LPHTMLIMGELEMENT; + +EXTERN_C const IID IID_IHTMLLinkElement; +#undef INTERFACE +#define INTERFACE IHTMLLinkElement +DECLARE_INTERFACE_(IHTMLLinkElement,IDispatch) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetTypeInfoCount)(THIS_ UINT*) PURE; + STDMETHOD(GetTypeInfo)(THIS_ UINT,LCID,LPTYPEINFO*) PURE; + STDMETHOD(GetIDsOfNames)(THIS_ REFIID,LPOLESTR*,UINT,LCID,DISPID*) PURE; + STDMETHOD(Invoke)(THIS_ DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*) PURE; + + STDMETHOD(put_href)(THIS_ BSTR) PURE; + STDMETHOD(get_href)(THIS_ BSTR*) PURE; + STDMETHOD(put_rel)(THIS_ BSTR) PURE; + STDMETHOD(get_rel)(THIS_ BSTR*) PURE; + STDMETHOD(put_rev)(THIS_ BSTR) PURE; + STDMETHOD(get_rev)(THIS_ BSTR*) PURE; + STDMETHOD(put_type)(THIS_ BSTR) PURE; + STDMETHOD(get_type)(THIS_ BSTR*) PURE; + STDMETHOD(get_readyState)(THIS_ BSTR*) PURE; + STDMETHOD(put_onreadystatechange)(THIS_ VARIANT) PURE; + STDMETHOD(get_onreadystatechange)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onload)(THIS_ VARIANT) PURE; + STDMETHOD(get_onload)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onerror)(THIS_ VARIANT) PURE; + STDMETHOD(get_onerror)(THIS_ VARIANT*) PURE; + STDMETHOD(get_styleSheet)(THIS_ LPHTMLSTYLESHEET*) PURE; + STDMETHOD(put_disabled)(THIS_ VARIANT_BOOL) PURE; + STDMETHOD(get_disabled)(THIS_ VARIANT_BOOL*) PURE; + STDMETHOD(put_media)(THIS_ BSTR) PURE; + STDMETHOD(get_media)(THIS_ BSTR*) PURE; +}; + +EXTERN_C const IID IID_IHTMLImgElement; +#undef INTERFACE +#define INTERFACE IHTMLImgElement +DECLARE_INTERFACE_(IHTMLImgElement,IDispatch) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetTypeInfoCount)(THIS_ UINT*) PURE; + STDMETHOD(GetTypeInfo)(THIS_ UINT,LCID,LPTYPEINFO*) PURE; + STDMETHOD(GetIDsOfNames)(THIS_ REFIID,LPOLESTR*,UINT,LCID,DISPID*) PURE; + STDMETHOD(Invoke)(THIS_ DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*) PURE; + + STDMETHOD(put_isMap)(THIS_ VARIANT_BOOL) PURE; + STDMETHOD(get_isMap)(THIS_ VARIANT_BOOL*) PURE; + STDMETHOD(put_useMap)(THIS_ BSTR) PURE; + STDMETHOD(get_useMap)(THIS_ BSTR*) PURE; + STDMETHOD(get_mimeType)(THIS_ BSTR*) PURE; + STDMETHOD(get_fileSize)(THIS_ BSTR*) PURE; + STDMETHOD(get_fileCreatedDate)(THIS_ BSTR*) PURE; + STDMETHOD(get_fileModifiedDate)(THIS_ BSTR*) PURE; + STDMETHOD(get_fileUpdatedDate)(THIS_ BSTR*) PURE; + STDMETHOD(get_protocol)(THIS_ BSTR*) PURE; + STDMETHOD(get_href)(THIS_ BSTR*) PURE; + STDMETHOD(get_nameProp)(THIS_ BSTR*) PURE; + STDMETHOD(put_border)(THIS_ VARIANT) PURE; + STDMETHOD(get_border)(THIS_ VARIANT*) PURE; + STDMETHOD(put_vspace)(THIS_ long) PURE; + STDMETHOD(get_vspace)(THIS_ long*) PURE; + STDMETHOD(put_hspace)(THIS_ long) PURE; + STDMETHOD(get_hspace)(THIS_ long*) PURE; + STDMETHOD(put_alt)(THIS_ BSTR) PURE; + STDMETHOD(get_alt)(THIS_ BSTR*) PURE; + STDMETHOD(put_src)(THIS_ BSTR) PURE; + STDMETHOD(get_src)(THIS_ BSTR*) PURE; + STDMETHOD(put_lowsrc)(THIS_ BSTR) PURE; + STDMETHOD(get_lowsrc)(THIS_ BSTR*) PURE; + STDMETHOD(put_vrml)(THIS_ BSTR) PURE; + STDMETHOD(get_vrml)(THIS_ BSTR*) PURE; + STDMETHOD(put_dynsrc)(THIS_ BSTR) PURE; + STDMETHOD(get_dynsrc)(THIS_ BSTR*) PURE; + STDMETHOD(get_readyState)(THIS_ BSTR*) PURE; + STDMETHOD(get_complete)(THIS_ VARIANT_BOOL*) PURE; + STDMETHOD(put_loop)(THIS_ VARIANT) PURE; + STDMETHOD(get_loop)(THIS_ VARIANT*) PURE; + STDMETHOD(put_align)(THIS_ BSTR) PURE; + STDMETHOD(get_align)(THIS_ BSTR*) PURE; + STDMETHOD(put_onload)(THIS_ VARIANT) PURE; + STDMETHOD(get_onload)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onerror)(THIS_ VARIANT) PURE; + STDMETHOD(get_onerror)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onabort)(THIS_ VARIANT) PURE; + STDMETHOD(get_onabort)(THIS_ VARIANT*) PURE; + STDMETHOD(put_name)(THIS_ BSTR) PURE; + STDMETHOD(get_name)(THIS_ BSTR*) PURE; + STDMETHOD(put_width)(THIS_ long) PURE; + STDMETHOD(get_width)(THIS_ long*) PURE; + STDMETHOD(put_height)(THIS_ long) PURE; + STDMETHOD(get_height)(THIS_ long*) PURE; + STDMETHOD(put_start)(THIS_ BSTR) PURE; + STDMETHOD(get_start)(THIS_ BSTR*) PURE; +}; + +EXTERN_C const IID IID_IHTMLElementCollection; +#undef INTERFACE +#define INTERFACE IHTMLElementCollection +DECLARE_INTERFACE_(IHTMLElementCollection,IDispatch) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetTypeInfoCount)(THIS_ UINT*) PURE; + STDMETHOD(GetTypeInfo)(THIS_ UINT,LCID,LPTYPEINFO*) PURE; + STDMETHOD(GetIDsOfNames)(THIS_ REFIID,LPOLESTR*,UINT,LCID,DISPID*) PURE; + STDMETHOD(Invoke)(THIS_ DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*) PURE; + + STDMETHOD(toString)(THIS_ BSTR*) PURE; + STDMETHOD(put_length)(THIS_ long) PURE; + STDMETHOD(get_length)(THIS_ long*) PURE; + STDMETHOD(get__newEnum)(THIS_ IUnknown**) PURE; + STDMETHOD(item)(THIS_ VARIANT,VARIANT,IDispatch**) PURE; + STDMETHOD(tags)(THIS_ VARIANT,IDispatch**) PURE; +}; + + +EXTERN_C const IID IID_IHTMLDocument; +#undef INTERFACE +#define INTERFACE IHTMLDocument +DECLARE_INTERFACE_(IHTMLDocument,IDispatch) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetTypeInfoCount)(THIS_ UINT*) PURE; + STDMETHOD(GetTypeInfo)(THIS_ UINT,LCID,LPTYPEINFO*) PURE; + STDMETHOD(GetIDsOfNames)(THIS_ REFIID,LPOLESTR*,UINT,LCID,DISPID*) PURE; + STDMETHOD(Invoke)(THIS_ DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*) PURE; + + STDMETHOD(get_Script)(THIS_ IDispatch**) PURE; +}; + +EXTERN_C const IID IID_IHTMLDocument2; +#undef INTERFACE +#define INTERFACE IHTMLDocument2 +DECLARE_INTERFACE_(IHTMLDocument2,IHTMLDocument) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetTypeInfoCount)(THIS_ UINT*) PURE; + STDMETHOD(GetTypeInfo)(THIS_ UINT,LCID,LPTYPEINFO*) PURE; + STDMETHOD(GetIDsOfNames)(THIS_ REFIID,LPOLESTR*,UINT,LCID,DISPID*) PURE; + STDMETHOD(Invoke)(THIS_ DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*) PURE; + + STDMETHOD(get_Script)(THIS_ IDispatch**) PURE; + + STDMETHOD(get_all)(THIS_ LPHTMLELEMENTCOLLECTION*) PURE; + STDMETHOD(get_body)(THIS_ LPHTMLELEMENT*) PURE; + STDMETHOD(get_activeElement)(THIS_ LPHTMLELEMENT*) PURE; + STDMETHOD(get_images)(THIS_ LPHTMLELEMENTCOLLECTION*) PURE; + STDMETHOD(get_applets)(THIS_ LPHTMLELEMENTCOLLECTION*) PURE; + STDMETHOD(get_links)(THIS_ LPHTMLELEMENTCOLLECTION*) PURE; + STDMETHOD(get_forms)(THIS_ LPHTMLELEMENTCOLLECTION*) PURE; + STDMETHOD(get_anchors)(THIS_ LPHTMLELEMENTCOLLECTION*) PURE; + STDMETHOD(put_title)(THIS_ BSTR) PURE; + STDMETHOD(get_title)(THIS_ BSTR*) PURE; + STDMETHOD(get_scripts)(THIS_ LPHTMLELEMENTCOLLECTION*) PURE; + STDMETHOD(put_designMode)(THIS_ BSTR) PURE; + STDMETHOD(get_designMode)(THIS_ BSTR*) PURE; + STDMETHOD(get_selection)(LPHTMLSELECTIONOBJECT*) PURE; + STDMETHOD(get_readyState)(THIS_ BSTR*) PURE; + STDMETHOD(get_frames)(THIS_ LPHTMLFRAMESCOLLECTION*) PURE; + STDMETHOD(get_embeds)(THIS_ LPHTMLELEMENTCOLLECTION*) PURE; + STDMETHOD(get_plugins)(THIS_ LPHTMLELEMENTCOLLECTION*) PURE; + STDMETHOD(put_alinkColor)(THIS_ VARIANT) PURE; + STDMETHOD(get_alinkColor)(THIS_ VARIANT*) PURE; + STDMETHOD(put_bgColor)(THIS_ VARIANT) PURE; + STDMETHOD(get_bgColor)(THIS_ VARIANT*) PURE; + STDMETHOD(put_fgColor)(THIS_ VARIANT) PURE; + STDMETHOD(get_fgColor)(THIS_ VARIANT*) PURE; + STDMETHOD(put_linkColor)(THIS_ VARIANT) PURE; + STDMETHOD(get_linkColor)(THIS_ VARIANT*) PURE; + STDMETHOD(put_vlinkColor)(THIS_ VARIANT) PURE; + STDMETHOD(get_vlinkColor)(THIS_ VARIANT*) PURE; + STDMETHOD(get_referrer)(THIS_ BSTR*) PURE; + STDMETHOD(get_location)(THIS_ LPHTMLLOCATION*) PURE; + STDMETHOD(get_lastModified)(THIS_ BSTR*) PURE; + STDMETHOD(put_url)(THIS_ BSTR) PURE; + STDMETHOD(get_url)(THIS_ BSTR*) PURE; + STDMETHOD(put_domain)(THIS_ BSTR) PURE; + STDMETHOD(get_domain)(THIS_ BSTR*) PURE; + STDMETHOD(put_cookie)(THIS_ BSTR) PURE; + STDMETHOD(get_cookie)(THIS_ BSTR*) PURE; + STDMETHOD(put_expands)(THIS_ VARIANT_BOOL) PURE; + STDMETHOD(get_expands)(THIS_ VARIANT_BOOL*) PURE; + STDMETHOD(put_charset)(THIS_ BSTR) PURE; + STDMETHOD(get_charset)(THIS_ BSTR*) PURE; + STDMETHOD(put_defaultCharset)(THIS_ BSTR) PURE; + STDMETHOD(get_defaultCharset)(THIS_ BSTR*) PURE; + STDMETHOD(get_mimeType)(THIS_ BSTR*) PURE; + STDMETHOD(get_fileSize)(THIS_ BSTR*) PURE; + STDMETHOD(get_fileCreatedDate)(THIS_ BSTR*) PURE; + STDMETHOD(get_fileModifiedDate)(THIS_ BSTR*) PURE; + STDMETHOD(get_fileUpdatedDate)(THIS_ BSTR*) PURE; + STDMETHOD(get_security)(THIS_ BSTR*) PURE; + STDMETHOD(get_protocol)(THIS_ BSTR*) PURE; + STDMETHOD(get_nameProp)(THIS_ BSTR*) PURE; + STDMETHOD(write)(THIS_ SAFEARRAY*) PURE; + STDMETHOD(writeln)(THIS_ SAFEARRAY*) PURE; + STDMETHOD(open)(THIS_ BSTR,VARIANT,VARIANT,VARIANT,IDispatch**) PURE; + STDMETHOD(close)(THIS) PURE; + STDMETHOD(clear)(THIS) PURE; + STDMETHOD(queryCommandSupported)(THIS_ BSTR,VARIANT_BOOL*) PURE; + STDMETHOD(queryCommandEnabled)(THIS_ BSTR,VARIANT_BOOL*) PURE; + STDMETHOD(queryCommandState)(THIS_ BSTR,VARIANT_BOOL*) PURE; + STDMETHOD(queryCommandIndeterm)(THIS_ BSTR,VARIANT_BOOL*) PURE; + STDMETHOD(queryCommandText)(THIS_ BSTR,BSTR*) PURE; + STDMETHOD(queryCommandValue)(THIS_ BSTR,VARIANT*) PURE; + STDMETHOD(execCommand)(THIS_ BSTR,VARIANT_BOOL,VARIANT,VARIANT_BOOL*) PURE; + STDMETHOD(execCommandShowHelp)(THIS_ BSTR,VARIANT_BOOL*) PURE; + STDMETHOD(createElement)(THIS_ BSTR,LPHTMLELEMENT*) PURE; + STDMETHOD(put_onhelp)(THIS_ VARIANT) PURE; + STDMETHOD(get_onhelp)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onclick)(THIS_ VARIANT) PURE; + STDMETHOD(get_onclick)(THIS_ VARIANT*) PURE; + STDMETHOD(put_ondblclick)(THIS_ VARIANT) PURE; + STDMETHOD(get_ondblclick)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onkeyup)(THIS_ VARIANT) PURE; + STDMETHOD(get_onkeyup)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onkeydown)(THIS_ VARIANT) PURE; + STDMETHOD(get_onkeydown)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onkeypress)(THIS_ VARIANT) PURE; + STDMETHOD(get_onkeypress)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onmouseup)(THIS_ VARIANT) PURE; + STDMETHOD(get_onmouseup)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onmousedown)(THIS_ VARIANT) PURE; + STDMETHOD(get_onmousedown)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onmousemove)(THIS_ VARIANT) PURE; + STDMETHOD(get_onmousemove)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onmouseout)(THIS_ VARIANT) PURE; + STDMETHOD(get_onmouseout)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onmouseover)(THIS_ VARIANT) PURE; + STDMETHOD(get_onmouseover)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onreadystatechange)(THIS_ VARIANT) PURE; + STDMETHOD(get_onreadystatechange)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onafterupdate)(THIS_ VARIANT) PURE; + STDMETHOD(get_onafterupdate)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onrowexit)(THIS_ VARIANT) PURE; + STDMETHOD(get_onrowexit)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onrowenter)(THIS_ VARIANT) PURE; + STDMETHOD(get_onrowenter)(THIS_ VARIANT*) PURE; + STDMETHOD(put_ondragstart)(THIS_ VARIANT) PURE; + STDMETHOD(get_ondragstart)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onselectstart)(THIS_ VARIANT) PURE; + STDMETHOD(get_onselectstart)(THIS_ VARIANT*) PURE; + STDMETHOD(elementFromPoint)(THIS_ long,long,LPHTMLELEMENT*) PURE; + STDMETHOD(get_parentWindow)(THIS_ LPHTMLWINDOW2*) PURE; + STDMETHOD(get_styleSheets)(THIS_ LPHTMLSTYLESHEETSCOLLECTION*) PURE; + STDMETHOD(put_onbeforeupdate)(THIS_ VARIANT) PURE; + STDMETHOD(get_onbeforeupdate)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onerrorupdate)(THIS_ VARIANT) PURE; + STDMETHOD(get_onerrorupdate)(THIS_ VARIANT*) PURE; + STDMETHOD(toString)(THIS_ BSTR*) PURE; + STDMETHOD(createStyleSheet)(THIS_ BSTR,long,LPHTMLSTYLESHEET*) PURE; +}; + +EXTERN_C const IID IID_IHTMLSelectionObject; +#undef INTERFACE +#define INTERFACE IHTMLSelectionObject +DECLARE_INTERFACE_(IHTMLSelectionObject,IDispatch) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetTypeInfoCount)(THIS_ UINT*) PURE; + STDMETHOD(GetTypeInfo)(THIS_ UINT,LCID,LPTYPEINFO*) PURE; + STDMETHOD(GetIDsOfNames)(THIS_ REFIID,LPOLESTR*,UINT,LCID,DISPID*) PURE; + STDMETHOD(Invoke)(THIS_ DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*) PURE; + + STDMETHOD(createRange)(THIS_ IDispatch**) PURE; + STDMETHOD(empty)(THIS) PURE; + STDMETHOD(clear)(THIS) PURE; + STDMETHOD(type)(THIS_ BSTR*) PURE; +}; + +EXTERN_C const IID IID_IHTMLTxtRange; +#undef INTERFACE +#define INTERFACE IHTMLTxtRange +DECLARE_INTERFACE_(IHTMLTxtRange,IDispatch) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetTypeInfoCount)(THIS_ UINT*) PURE; + STDMETHOD(GetTypeInfo)(THIS_ UINT,LCID,LPTYPEINFO*) PURE; + STDMETHOD(GetIDsOfNames)(THIS_ REFIID,LPOLESTR*,UINT,LCID,DISPID*) PURE; + STDMETHOD(Invoke)(THIS_ DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*) PURE; + + STDMETHOD(get_htmlText)(THIS_ BSTR*) PURE; + STDMETHOD(put_text)(THIS_ BSTR) PURE; + STDMETHOD(get_text)(THIS_ BSTR*) PURE; + STDMETHOD(parentElement)(THIS_ LPHTMLELEMENT*) PURE; + STDMETHOD(duplicate)(THIS_ IHTMLTxtRange**) PURE; + STDMETHOD(inRange)(THIS_ IHTMLTxtRange*,VARIANT_BOOL*) PURE; + STDMETHOD(isEqual)(THIS_ IHTMLTxtRange*,VARIANT_BOOL*) PURE; + STDMETHOD(scrollIntoView)(THIS_ VARIANT_BOOL) PURE; + STDMETHOD(collapse)(THIS_ VARIANT_BOOL) PURE; + STDMETHOD(expand)(THIS_ BSTR,VARIANT_BOOL*) PURE; + STDMETHOD(move)(THIS_ BSTR,long,long*) PURE; + STDMETHOD(moveStart)(THIS_ BSTR,long,long*) PURE; + STDMETHOD(moveEnd)(THIS_ BSTR,long,long*) PURE; + STDMETHOD(select)(THIS) PURE; + STDMETHOD(pasteHTML)(THIS_ BSTR) PURE; + STDMETHOD(moveToElementText)(THIS_ LPHTMLELEMENT) PURE; + STDMETHOD(setEndPoint)(THIS_ BSTR,IHTMLTxtRange*) PURE; + STDMETHOD(compareEndPoints)(THIS_ BSTR,IHTMLTxtRange*,long*) PURE; + STDMETHOD(findText)(THIS_ BSTR,long,long,VARIANT_BOOL*) PURE; + STDMETHOD(moveToPoint)(THIS_ long,long) PURE; + STDMETHOD(getBookmark)(THIS_ BSTR*) PURE; + STDMETHOD(moveToBookbark)(THIS_ BSTR,VARIANT_BOOL*) PURE; + STDMETHOD(queryCommandSupported)(THIS_ BSTR,VARIANT_BOOL*) PURE; + STDMETHOD(queryCommandEnabled)(THIS_ BSTR,VARIANT_BOOL*) PURE; + STDMETHOD(queryCommandState)(THIS_ BSTR,VARIANT_BOOL*) PURE; + STDMETHOD(queryCommandIndeterm)(THIS_ BSTR,VARIANT_BOOL*) PURE; + STDMETHOD(queryCommandText)(THIS_ BSTR,BSTR*) PURE; + STDMETHOD(queryCommandValue)(THIS_ BSTR,VARIANT*) PURE; + STDMETHOD(execCommand)(THIS_ BSTR,VARIANT_BOOL,VARIANT,VARIANT_BOOL*) PURE; + STDMETHOD(execCommandShowHelp)(THIS_ BSTR,VARIANT_BOOL*) PURE; +}; + +EXTERN_C const IID IID_IHTMLElement; +#undef INTERFACE +#define INTERFACE IHTMLElement +DECLARE_INTERFACE_(IHTMLElement,IDispatch) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetTypeInfoCount)(THIS_ UINT*) PURE; + STDMETHOD(GetTypeInfo)(THIS_ UINT,LCID,LPTYPEINFO*) PURE; + STDMETHOD(GetIDsOfNames)(THIS_ REFIID,LPOLESTR*,UINT,LCID,DISPID*) PURE; + STDMETHOD(Invoke)(THIS_ DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*) PURE; + + STDMETHOD(setAttribute)(THIS_ BSTR,VARIANT,long) PURE; + STDMETHOD(getAttribute)(THIS_ BSTR,long,VARIANT*) PURE; + STDMETHOD(removeAttribute)(THIS_ BSTR,long,VARIANT_BOOL*) PURE; + STDMETHOD(put_className)(THIS_ BSTR) PURE; + STDMETHOD(get_className)(THIS_ BSTR*) PURE; + STDMETHOD(put_id)(THIS_ BSTR) PURE; + STDMETHOD(get_id)(THIS_ BSTR*) PURE; + STDMETHOD(get_tagName)(THIS_ BSTR*) PURE; + STDMETHOD(get_parentElement)(THIS_ LPHTMLELEMENT*) PURE; + STDMETHOD(get_style)(THIS_ LPHTMLSTYLE*) PURE; + STDMETHOD(put_onhelp)(THIS_ VARIANT) PURE; + STDMETHOD(get_onhelp)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onclick)(THIS_ VARIANT) PURE; + STDMETHOD(get_onclick)(THIS_ VARIANT*) PURE; + STDMETHOD(put_ondblclick)(THIS_ VARIANT) PURE; + STDMETHOD(get_ondblclick)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onkeydown)(THIS_ VARIANT) PURE; + STDMETHOD(get_onkeydown)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onkeyup)(THIS_ VARIANT) PURE; + STDMETHOD(get_onkeyup)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onkeypress)(THIS_ VARIANT) PURE; + STDMETHOD(get_onkeypress)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onmouseout)(THIS_ VARIANT) PURE; + STDMETHOD(get_onmouseout)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onmouseover)(THIS_ VARIANT) PURE; + STDMETHOD(get_onmouseover)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onmousemove)(THIS_ VARIANT) PURE; + STDMETHOD(get_onmousemove)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onmousedown)(THIS_ VARIANT) PURE; + STDMETHOD(get_onmousedown)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onmouseup)(THIS_ VARIANT) PURE; + STDMETHOD(get_onmouseup)(THIS_ VARIANT*) PURE; + STDMETHOD(get_document)(THIS_ IDispatch**) PURE; + STDMETHOD(put_title)(THIS_ BSTR) PURE; + STDMETHOD(get_title)(THIS_ BSTR*) PURE; + STDMETHOD(put_language)(THIS_ BSTR) PURE; + STDMETHOD(get_language)(THIS_ BSTR*) PURE; + STDMETHOD(put_onselectstart)(THIS_ VARIANT) PURE; + STDMETHOD(get_onselectstart)(THIS_ VARIANT*) PURE; + STDMETHOD(scrollIntoView)(THIS_ VARIANT) PURE; + STDMETHOD(contains)(THIS_ LPHTMLELEMENT,VARIANT_BOOL*) PURE; + STDMETHOD(get_source3Index)(THIS_ long*) PURE; + STDMETHOD(get_recordNumber)(THIS_ VARIANT*) PURE; + STDMETHOD(put_lang)(THIS_ BSTR) PURE; + STDMETHOD(get_lang)(THIS_ BSTR*) PURE; + STDMETHOD(get_offsetLeft)(THIS_ long*) PURE; + STDMETHOD(get_offsetTop)(THIS_ long*) PURE; + STDMETHOD(get_offsetWidth)(THIS_ long*) PURE; + STDMETHOD(get_offsetHeight)(THIS_ long*) PURE; + STDMETHOD(get_offsetParent)(THIS_ LPHTMLELEMENT*) PURE; + STDMETHOD(put_innerHTML)(THIS_ BSTR) PURE; + STDMETHOD(get_innerHTML)(THIS_ BSTR*) PURE; + STDMETHOD(put_innerText)(THIS_ BSTR) PURE; + STDMETHOD(get_innerText)(THIS_ BSTR*) PURE; + STDMETHOD(put_outerHTML)(THIS_ BSTR) PURE; + STDMETHOD(get_outerHTML)(THIS_ BSTR*) PURE; + STDMETHOD(put_outerText)(THIS_ BSTR) PURE; + STDMETHOD(get_outerText)(THIS_ BSTR*) PURE; + STDMETHOD(insertAdjacentHTML)(THIS_ BSTR,BSTR) PURE; + STDMETHOD(insertAdjacentText)(THIS_ BSTR,BSTR) PURE; + STDMETHOD(get_parentTextEdit)(THIS_ LPHTMLELEMENT*) PURE; + STDMETHOD(isTextEdit)(THIS_ VARIANT_BOOL*) PURE; + STDMETHOD(click)(THIS) PURE; + STDMETHOD(get_filters)(THIS_ LPHTMLFILTERSCOLLECTION*) PURE; + STDMETHOD(put_ondragstart)(THIS_ VARIANT) PURE; + STDMETHOD(get_ondragstart)(THIS_ VARIANT*) PURE; + STDMETHOD(toString)(THIS_ BSTR*) PURE; + STDMETHOD(put_onbeforeupdate)(THIS_ VARIANT) PURE; + STDMETHOD(get_onbeforeupdate)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onafterupdate)(THIS_ VARIANT) PURE; + STDMETHOD(get_onafterupdate)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onerrorupdate)(THIS_ VARIANT) PURE; + STDMETHOD(get_onerrorupdate)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onrowexit)(THIS_ VARIANT) PURE; + STDMETHOD(get_onrowexit)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onrowenter)(THIS_ VARIANT) PURE; + STDMETHOD(get_onrowenter)(THIS_ VARIANT*) PURE; + STDMETHOD(put_ondatasetchanged)(THIS_ VARIANT) PURE; + STDMETHOD(get_ondatasetchanged)(THIS_ VARIANT*) PURE; + STDMETHOD(put_ondataavailable)(THIS_ VARIANT) PURE; + STDMETHOD(get_ondataavailable)(THIS_ VARIANT*) PURE; + STDMETHOD(put_ondatasetcomplete)(THIS_ VARIANT) PURE; + STDMETHOD(get_ondatasetcomplete)(THIS_ VARIANT*) PURE; + STDMETHOD(put_onfilterchange)(THIS_ VARIANT) PURE; + STDMETHOD(get_onfilterchange)(THIS_ VARIANT*) PURE; + STDMETHOD(get_children)(THIS_ IDispatch**) PURE; + STDMETHOD(get_all)(THIS_ IDispatch**) PURE; +}; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/mswsock.h b/reactos/w32api/include/mswsock.h new file mode 100644 index 00000000000..0cea0b84003 --- /dev/null +++ b/reactos/w32api/include/mswsock.h @@ -0,0 +1,113 @@ +/* + * mswsock.h + * MS-specific extensions to Windows Sockets, exported from mswsock.dll. + * These functions are N/A on Windows9x. + * + * This file is part of a free library for the Win32 API. + * 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. + */ + +#ifndef _MSWSOCK_H +#define _MSWSOCK_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif +#ifdef __cplusplus +extern "C" { +#endif + +#define SO_CONNDATA 0x7000 +#define SO_CONNOPT 0x7001 +#define SO_DISCDATA 0x7002 +#define SO_DISCOPT 0x7003 +#define SO_CONNDATALEN 0x7004 +#define SO_CONNOPTLEN 0x7005 +#define SO_DISCDATALEN 0x7006 +#define SO_DISCOPTLEN 0x7007 +#define SO_OPENTYPE 0x7008 +#define SO_SYNCHRONOUS_ALERT 0x10 +#define SO_SYNCHRONOUS_NONALERT 0x20 +#define SO_MAXDG 0x7009 +#define SO_MAXPATHDG 0x700A +#define SO_UPDATE_ACCEPT_CONTEXT 0x700B +#define SO_CONNECT_TIME 0x700C +#define TCP_BSDURGENT 0x7000 + +#define TF_DISCONNECT 1 +#define TF_REUSE_SOCKET 2 +#define TF_WRITE_BEHIND 4 +#define TF_USE_DEFAULT_WORKER 0 +#define TF_USE_SYSTEM_THREAD 16 +#define TF_USE_KERNEL_APC 32 + +typedef struct _TRANSMIT_FILE_BUFFERS { + PVOID Head; + DWORD HeadLength; + PVOID Tail; + DWORD TailLength; +} TRANSMIT_FILE_BUFFERS, *PTRANSMIT_FILE_BUFFERS, *LPTRANSMIT_FILE_BUFFERS; + +int PASCAL WSARecvEx(SOCKET,char*,int,int*); +BOOL PASCAL TransmitFile(SOCKET,HANDLE,DWORD,DWORD,LPOVERLAPPED,LPTRANSMIT_FILE_BUFFERS,DWORD); +BOOL PASCAL AcceptEx(SOCKET,SOCKET,PVOID,DWORD,DWORD,DWORD,LPDWORD,LPOVERLAPPED); +VOID PASCAL GetAcceptExSockaddrs(PVOID,DWORD,DWORD,DWORD,struct sockaddr**, LPINT, struct sockaddr**, LPINT); + +#ifdef _WINSOCK2_H /* These require the winsock2 interface. */ + +#define TP_ELEMENT_FILE 1 +#define TP_ELEMENT_MEMORY 2 +#define TP_ELEMENT_EOP 4 + +typedef struct _TRANSMIT_PACKETS_ELEMENT { + ULONG dwElFlags; + ULONG cLength; + _ANONYMOUS_UNION + union { + struct { + LARGE_INTEGER nFileOffset; + HANDLE hFile; + }; + PVOID pBuffer; + }; +} TRANSMIT_PACKETS_ELEMENT; + +typedef struct _WSAMSG { + LPSOCKADDR name; + INT namelen; + LPWSABUF lpBuffers; + DWORD dwBufferCount; + WSABUF Control; + DWORD dwFlags; +} WSAMSG, *PWSAMSG, *LPWSAMSG; + + +/* According to MSDN docs, the WSAMSG.Control buffer starts with a + cmsghdr header of the following form. See also RFC 2292. */ + +typedef struct wsacmsghdr { + UINT cmsg_len; + INT cmsg_level; + INT cmsg_type; + /* followed by UCHAR cmsg_data[]; */ +} WSACMSGHDR; + +/* TODO: Standard Posix.1g macros as per RFC 2292, with WSA_uglification. */ +#if 0 +#define WSA_CMSG_FIRSTHDR(mhdr) +#define WSA_CMSG_NXTHDR(mhdr, cmsg) +#define WSA_CMSG_SPACE(length) +#define WSA_CMSG_LEN(length) +#endif + +BOOL PASCAL DisconnectEx(SOCKET,LPOVERLAPPED,DWORD,DWORD); +int PASCAL WSARecvMsg(SOCKET,LPWSAMSG,LPDWORD,LPWSAOVERLAPPED,LPWSAOVERLAPPED_COMPLETION_ROUTINE); + +#endif /* _WINSOCK2_H */ + +#ifdef __cplusplus +} +#endif +#endif /* _MSWSOCK_H */ + diff --git a/reactos/w32api/include/nb30.h b/reactos/w32api/include/nb30.h new file mode 100644 index 00000000000..c0ef0e53b92 --- /dev/null +++ b/reactos/w32api/include/nb30.h @@ -0,0 +1,186 @@ +#ifndef _NB30_H +#define _NB30_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define NCBNAMSZ 16 +#define MAX_LANA 254 +#define NAME_FLAGS_MASK 0x87 +#define GROUP_NAME 0x80 +#define UNIQUE_NAME 0x00 +#define REGISTERING 0x00 +#define REGISTERED 0x04 +#define DEREGISTERED 0x05 +#define DUPLICATE 0x06 +#define DUPLICATE_DEREG 0x07 +#define LISTEN_OUTSTANDING 0x01 +#define CALL_PENDING 0x02 +#define SESSION_ESTABLISHED 0x03 +#define HANGUP_PENDING 0x04 +#define HANGUP_COMPLETE 0x05 +#define SESSION_ABORTED 0x06 +#define ALL_TRANSPORTS "M\0\0\0" +#define MS_NBF "MNBF" +#define NCBCALL 0x10 +#define NCBLISTEN 0x11 +#define NCBHANGUP 0x12 +#define NCBSEND 0x14 +#define NCBRECV 0x15 +#define NCBRECVANY 0x16 +#define NCBCHAINSEND 0x17 +#define NCBDGSEND 0x20 +#define NCBDGRECV 0x21 +#define NCBDGSENDBC 0x22 +#define NCBDGRECVBC 0x23 +#define NCBADDNAME 0x30 +#define NCBDELNAME 0x31 +#define NCBRESET 0x32 +#define NCBASTAT 0x33 +#define NCBSSTAT 0x34 +#define NCBCANCEL 0x35 +#define NCBADDGRNAME 0x36 +#define NCBENUM 0x37 +#define NCBUNLINK 0x70 +#define NCBSENDNA 0x71 +#define NCBCHAINSENDNA 0x72 +#define NCBLANSTALERT 0x73 +#define NCBACTION 0x77 +#define NCBFINDNAME 0x78 +#define NCBTRACE 0x79 +#define ASYNCH 0x80 +#define NRC_GOODRET 0x00 +#define NRC_BUFLEN 0x01 +#define NRC_ILLCMD 0x03 +#define NRC_CMDTMO 0x05 +#define NRC_INCOMP 0x06 +#define NRC_BADDR 0x07 +#define NRC_SNUMOUT 0x08 +#define NRC_NORES 0x09 +#define NRC_SCLOSED 0x0a +#define NRC_CMDCAN 0x0b +#define NRC_DUPNAME 0x0d +#define NRC_NAMTFUL 0x0e +#define NRC_ACTSES 0x0f +#define NRC_LOCTFUL 0x11 +#define NRC_REMTFUL 0x12 +#define NRC_ILLNN 0x13 +#define NRC_NOCALL 0x14 +#define NRC_NOWILD 0x15 +#define NRC_INUSE 0x16 +#define NRC_NAMERR 0x17 +#define NRC_SABORT 0x18 +#define NRC_NAMCONF 0x19 +#define NRC_IFBUSY 0x21 +#define NRC_TOOMANY 0x22 +#define NRC_BRIDGE 0x23 +#define NRC_CANOCCR 0x24 +#define NRC_CANCEL 0x26 +#define NRC_DUPENV 0x30 +#define NRC_ENVNOTDEF 0x34 +#define NRC_OSRESNOTAV 0x35 +#define NRC_MAXAPPS 0x36 +#define NRC_NOSAPS 0x37 +#define NRC_NORESOURCES 0x38 +#define NRC_INVADDRESS 0x39 +#define NRC_INVDDID 0x3B +#define NRC_LOCKFAIL 0x3C +#define NRC_OPENERR 0x3f +#define NRC_SYSTEM 0x40 +#define NRC_PENDING 0xff +#define NCB_POST void CALLBACK +typedef struct _ACTION_HEADER { + ULONG transport_id; + USHORT action_code; + USHORT reserved; +} ACTION_HEADER,*PACTION_HEADER; +typedef struct _ADAPTER_STATUS { + UCHAR adapter_address[6]; + UCHAR rev_major; + UCHAR reserved0; + UCHAR adapter_type; + UCHAR rev_minor; + WORD duration; + WORD frmr_recv; + WORD frmr_xmit; + WORD iframe_recv_err; + WORD xmit_aborts; + DWORD xmit_success; + DWORD recv_success; + WORD iframe_xmit_err; + WORD recv_buff_unavail; + WORD t1_timeouts; + WORD ti_timeouts; + DWORD reserved1; + WORD free_ncbs; + WORD max_cfg_ncbs; + WORD max_ncbs; + WORD xmit_buf_unavail; + WORD max_dgram_size; + WORD pending_sess; + WORD max_cfg_sess; + WORD max_sess; + WORD max_sess_pkt_size; + WORD name_count; +} ADAPTER_STATUS,*PADAPTER_STATUS; +typedef struct _FIND_NAME_BUFFER { + UCHAR length; + UCHAR access_control; + UCHAR frame_control; + UCHAR destination_addr[6]; + UCHAR source_addr[6]; + UCHAR routing_info[18]; +} FIND_NAME_BUFFER,*PFIND_NAME_BUFFER; +typedef struct _FIND_NAME_HEADER { + WORD node_count; + UCHAR reserved; + UCHAR unique_group; +} FIND_NAME_HEADER,*PFIND_NAME_HEADER; +typedef struct _LANA_ENUM { + UCHAR length; + UCHAR lana[MAX_LANA+1]; +} LANA_ENUM,*PLANA_ENUM; +typedef struct _NAME_BUFFER { + UCHAR name[NCBNAMSZ]; + UCHAR name_num; + UCHAR name_flags; +} NAME_BUFFER,*PNAME_BUFFER; +typedef struct _NCB { + UCHAR ncb_command; + UCHAR ncb_retcode; + UCHAR ncb_lsn; + UCHAR ncb_num; + PUCHAR ncb_buffer; + WORD ncb_length; + UCHAR ncb_callname[NCBNAMSZ]; + UCHAR ncb_name[NCBNAMSZ]; + UCHAR ncb_rto; + UCHAR ncb_sto; + void (CALLBACK *ncb_post)(struct _NCB*); + UCHAR ncb_lana_num; + UCHAR ncb_cmd_cplt; + UCHAR ncb_reserve[10]; + HANDLE ncb_event; +} NCB,*PNCB; +typedef struct _SESSION_BUFFER { + UCHAR lsn; + UCHAR state; + UCHAR local_name[NCBNAMSZ]; + UCHAR remote_name[NCBNAMSZ]; + UCHAR rcvs_outstanding; + UCHAR sends_outstanding; +} SESSION_BUFFER,*PSESSION_BUFFER; +typedef struct _SESSION_HEADER { + UCHAR sess_name; + UCHAR num_sess; + UCHAR rcv_dg_outstanding; + UCHAR rcv_any_outstanding; +} SESSION_HEADER,*PSESSION_HEADER; +UCHAR WINAPI Netbios(PNCB); +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/nddeapi.h b/reactos/w32api/include/nddeapi.h new file mode 100644 index 00000000000..a6ea207e087 --- /dev/null +++ b/reactos/w32api/include/nddeapi.h @@ -0,0 +1,133 @@ +#ifndef _NDDEAPI_H +#define _NDDEAPI_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#ifndef CNLEN /* also in lmcons.h */ +#define CNLEN 15 +#define UNCLEN (CNLEN + 2) +#endif +#define SEP_CHAR ',' +#define BAR_CHAR "|" +#define SEP_WCHAR L',' +#define BAR_WCHAR L"|" +#define NDDE_NO_ERROR 0 +#define NDDE_ACCESS_DENIED 1 +#define NDDE_BUF_TOO_SMALL 2 +#define NDDE_ERROR_MORE_DATA 3 +#define NDDE_INVALID_SERVER 4 +#define NDDE_INVALID_SHARE 5 +#define NDDE_INVALID_PARAMETER 6 +#define NDDE_INVALID_LEVEL 7 +#define NDDE_INVALID_PASSWORD 8 +#define NDDE_INVALID_ITEMNAME 9 +#define NDDE_INVALID_TOPIC 10 +#define NDDE_INTERNAL_ERROR 11 +#define NDDE_OUT_OF_MEMORY 12 +#define NDDE_INVALID_APPNAME 13 +#define NDDE_NOT_IMPLEMENTED 14 +#define NDDE_SHARE_ALREADY_EXIST 15 +#define NDDE_SHARE_NOT_EXIST 16 +#define NDDE_INVALID_FILENAME 17 +#define NDDE_NOT_RUNNING 18 +#define NDDE_INVALID_WINDOW 19 +#define NDDE_INVALID_SESSION 20 +#define NDDE_INVALID_ITEM_LIST 21 +#define NDDE_SHARE_DATA_CORRUPTED 22 +#define NDDE_REGISTRY_ERROR 23 +#define NDDE_CANT_ACCESS_SERVER 24 +#define NDDE_INVALID_SPECIAL_COMMAND 25 +#define NDDE_INVALID_SECURITY_DESC 26 +#define NDDE_TRUST_SHARE_FAIL 27 +#define MAX_NDDESHARENAME 256 +#define MAX_DOMAINNAME 15 +#define MAX_USERNAME 15 +#define MAX_APPNAME 255 +#define MAX_TOPICNAME 255 +#define MAX_ITEMNAME 255 +#define NDDEF_NOPASSWORDPROMPT 0x0001 +#define NDDEF_NOCACHELOOKUP 0x0002 +#define NDDEF_STRIP_NDDE 0x0004 +#define SHARE_TYPE_OLD 0x01 +#define SHARE_TYPE_NEW 0x02 +#define SHARE_TYPE_STATIC 0x04 +#define NDDE_TRUST_SHARE_START 0x80000000L +#define NDDE_TRUST_SHARE_INIT 0x40000000L +#define NDDE_TRUST_SHARE_DEL 0x20000000L +#define NDDE_TRUST_CMD_SHOW 0x10000000L +#define NDDE_CMD_SHOW_MASK 0x0000FFFFL +struct NDdeShareInfo_tag { + LONG lRevision; + LPTSTR lpszShareName; + LONG lShareType; + LPTSTR lpszAppTopicList; + LONG fSharedFlag; + LONG fService; + LONG fStartAppFlag; + LONG nCmdShow; + LONG qModifyId[2]; + LONG cNumItems; + LPTSTR lpszItemList; +} NDDESHAREINFO,*PNDDESHAREINFO; + +UINT WINAPI NDdeGetErrorStringA(UINT,LPSTR,DWORD); +UINT WINAPI NDdeGetErrorStringW(UINT,LPWSTR,DWORD); +UINT WINAPI NDdeGetShareSecurityA(LPSTR,LPSTR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR,DWORD,PDWORD); +UINT WINAPI NDdeGetShareSecurityW(LPWSTR,LPWSTR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR,DWORD,PDWORD); +UINT WINAPI NDdeGetTrustedShareA(LPSTR,LPSTR,PDWORD,PDWORD,PDWORD); +UINT WINAPI NDdeGetTrustedShareW(LPWSTR,LPWSTR,PDWORD,PDWORD,PDWORD); +BOOL WINAPI NDdeIsValidShareNameA(LPSTR); +BOOL WINAPI NDdeIsValidShareNameW(LPWSTR); +BOOL WINAPI NDdeIsValidAppTopicListA(LPSTR); +BOOL WINAPI NDdeIsValidAppTopicListW(LPWSTR); +UINT WINAPI NDdeSetShareSecurityA(LPSTR,LPSTR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR); +UINT WINAPI NDdeSetShareSecurityW(LPWSTR,LPWSTR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR); +UINT WINAPI NDdeSetTrustedShareA(LPSTR,LPSTR,DWORD); +UINT WINAPI NDdeSetTrustedShareW(LPWSTR,LPWSTR,DWORD); +UINT WINAPI NDdeShareAddA(LPSTR,UINT,PSECURITY_DESCRIPTOR,PBYTE,DWORD); +UINT WINAPI NDdeShareAddW(LPWSTR,UINT,PSECURITY_DESCRIPTOR,PBYTE,DWORD); +UINT WINAPI NDdeShareDelA(LPSTR,LPSTR,UINT); +UINT WINAPI NDdeShareDelW(LPWSTR,LPWSTR,UINT); +UINT WINAPI NDdeShareEnumA(LPSTR,UINT,PBYTE,DWORD,PDWORD,PDWORD); +UINT WINAPI NDdeShareEnumW(LPWSTR,UINT,PBYTE,DWORD,PDWORD,PDWORD); +UINT WINAPI NDdeShareGetInfoA(LPSTR,LPSTR,UINT,PBYTE,DWORD,PDWORD,PWORD); +UINT WINAPI NDdeShareGetInfoW(LPWSTR,LPWSTR,UINT,PBYTE,DWORD,PDWORD,PWORD); +UINT WINAPI NDdeShareSetInfoA(LPSTR,LPSTR,UINT,PBYTE,DWORD,WORD); +UINT WINAPI NDdeShareSetInfoW(LPWSTR,LPWSTR,UINT,PBYTE,DWORD,WORD); +UINT WINAPI NDdeTrustedShareEnumA(LPSTR,UINT,PBYTE,DWORD,PDWORD,PDWORD); +UINT WINAPI NDdeTrustedShareEnumW(LPWSTR,UINT,PBYTE,DWORD,PDWORD,PDWORD); +#ifdef UNICODE +#define NDdeShareAdd NDdeShareAddW +#define NDdeShareDel NDdeShareDelW +#define NDdeSetShareSecurity NDdeSetShareSecurityW +#define NDdeGetShareSecurity NDdeGetShareSecurityW +#define NDdeShareEnum NDdeShareEnumW +#define NDdeShareGetInfo NDdeShareGetInfoW +#define NDdeShareSetInfo NDdeShareSetInfoW +#define NDdeGetErrorString NDdeGetErrorStringW +#define NDdeSetTrustedShare NDdeSetTrustedShareW +#define NDdeGetTrustedShare NDdeGetTrustedShareW +#define NDdeTrustedShareEnum NDdeTrustedShareEnumW +#else +#define NDdeShareAdd NDdeShareAddA +#define NDdeShareDel NDdeShareDelA +#define NDdeSetShareSecurity NDdeSetShareSecurityA +#define NDdeGetShareSecurity NDdeGetShareSecurityA +#define NDdeShareEnum NDdeShareEnumA +#define NDdeShareGetInfo NDdeShareGetInfoA +#define NDdeShareSetInfo NDdeShareSetInfoA +#define NDdeGetErrorString NDdeGetErrorStringA +#define NDdeIsValidShareName NDdeIsValidShareNameA +#define NDdeIsValidAppTopicList NDdeIsValidAppTopicListA +#define NDdeSetTrustedShare NDdeSetTrustedShareA +#define NDdeGetTrustedShare NDdeGetTrustedShareA +#define NDdeTrustedShareEnum NDdeTrustedShareEnumA +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/nspapi.h b/reactos/w32api/include/nspapi.h new file mode 100644 index 00000000000..463b1390255 --- /dev/null +++ b/reactos/w32api/include/nspapi.h @@ -0,0 +1,126 @@ +#ifndef _NSPAPI_H +#define _NSPAPI_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define NS_ALL 0 + +#define NS_SAP 1 +#define NS_NDS 2 +#define NS_PEER_BROWSE 3 + +#define NS_TCPIP_LOCAL 10 +#define NS_TCPIP_HOSTS 11 +#define NS_DNS 12 +#define NS_NETBT 13 +#define NS_WINS 14 + +#define NS_NBP 20 + +#define NS_MS 30 +#define NS_STDA 31 +#define NS_NTDS 32 + +#define NS_X500 40 +#define NS_NIS 41 +#define NS_NISPLUS 42 + +#define NS_WRQ 50 + +#define SERVICE_REGISTER 1 +#define SERVICE_DEREGISTER 2 +#define SERVICE_FLUSH 3 +#define SERVICE_FLAG_HARD 0x00000002 + +#ifndef RC_INVOKED + +#if defined (_WINSOCK_H) || defined (_WINSOCK2_H) /* needed for LPSOCKADDR */ +#ifndef __CSADDR_T_DEFINED /* also in winsock2.h, but not in winsock.h */ +#define __CSADDR_T_DEFINED +typedef struct _SOCKET_ADDRESS { + LPSOCKADDR lpSockaddr; + INT iSockaddrLength; +} SOCKET_ADDRESS,*PSOCKET_ADDRESS,*LPSOCKET_ADDRESS; +typedef struct _CSADDR_INFO { + SOCKET_ADDRESS LocalAddr; + SOCKET_ADDRESS RemoteAddr; + INT iSocketType; + INT iProtocol; +} CSADDR_INFO,*PCSADDR_INFO,*LPCSADDR_INFO; +#endif +#endif + +#ifndef __BLOB_T_DEFINED /* also in wtypes.h and winsock2.h */ +#define __BLOB_T_DEFINED +typedef struct _BLOB { + ULONG cbSize; + BYTE *pBlobData; +} BLOB,*PBLOB,*LPBLOB; +#endif + +typedef struct _SERVICE_ADDRESS { + DWORD dwAddressType; + DWORD dwAddressFlags; + DWORD dwAddressLength; + DWORD dwPrincipalLength; + BYTE *lpAddress; + BYTE *lpPrincipal; +} SERVICE_ADDRESS; +typedef struct _SERVICE_ADDRESSES { + DWORD dwAddressCount; + SERVICE_ADDRESS Addresses[1]; +} SERVICE_ADDRESSES, *PSERVICE_ADDRESSES, *LPSERVICE_ADDRESSES; +typedef struct _SERVICE_INFOA { + LPGUID lpServiceType; + LPSTR lpServiceName; + LPSTR lpComment; + LPSTR lpLocale; + DWORD dwDisplayHint; + DWORD dwVersion; + DWORD dwTime; + LPSTR lpMachineName; + LPSERVICE_ADDRESSES lpServiceAddress; + BLOB ServiceSpecificInfo; +} SERVICE_INFOA, *LPSERVICE_INFOA; +typedef struct _SERVICE_INFOW { + LPGUID lpServiceType; + LPWSTR lpServiceName; + LPWSTR lpComment; + LPWSTR lpLocale; + DWORD dwDisplayHint; + DWORD dwVersion; + DWORD dwTime; + LPWSTR lpMachineName; + LPSERVICE_ADDRESSES lpServiceAddress; + BLOB ServiceSpecificInfo; +} SERVICE_INFOW, *LPSERVICE_INFOW; + +typedef void *LPSERVICE_ASYNC_INFO; +INT WINAPI SetServiceA(DWORD,DWORD,DWORD,LPSERVICE_INFOA,LPSERVICE_ASYNC_INFO,LPDWORD); +INT WINAPI SetServiceW(DWORD,DWORD,DWORD,LPSERVICE_INFOW,LPSERVICE_ASYNC_INFO,LPDWORD); +INT WINAPI GetAddressByNameA(DWORD,LPGUID,LPSTR,LPINT,DWORD,LPSERVICE_ASYNC_INFO,LPVOID,LPDWORD,LPSTR,LPDWORD); +INT WINAPI GetAddressByNameW(DWORD,LPGUID,LPWSTR,LPINT,DWORD,LPSERVICE_ASYNC_INFO,LPVOID,LPDWORD,LPWSTR,LPDWORD); + +#ifdef UNICODE +typedef SERVICE_INFOW SERVICE_INFO, *LPSERVICE_INFO; +#define _SERVICE_INFO SERVICE_INFOW +#define SetService SetServiceW +#define GetAddressByName GetAddressByNameW +#else +typedef SERVICE_INFOA SERVICE_INFO, *LPSERVICE_INFO; +#define _SERVICE_INFO SERVICE_INFOA +#define SetService SetServiceA +#define GetAddressByName GetAddressByNameA +#endif + +#endif /* RC_INVOKED */ + +#ifdef __cplusplus +} +#endif +#endif /* _NSPAPI_H */ diff --git a/reactos/w32api/include/ntdef.h b/reactos/w32api/include/ntdef.h new file mode 100644 index 00000000000..83f4fa35643 --- /dev/null +++ b/reactos/w32api/include/ntdef.h @@ -0,0 +1,60 @@ +#ifndef _NTDEF_H +#define _NTDEF_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#define NTAPI __stdcall +#define OBJ_INHERIT 2L +#define OBJ_PERMANENT 16L +#define OBJ_EXCLUSIVE 32L +#define OBJ_CASE_INSENSITIVE 64L +#define OBJ_OPENIF 128L +#define OBJ_OPENLINK 256L +#define OBJ_VALID_ATTRIBUTES 498L +#define InitializeObjectAttributes(p,n,a,r,s) { \ + (p)->Length = sizeof(OBJECT_ATTRIBUTES); \ + (p)->RootDirectory = (r); \ + (p)->Attributes = (a); \ + (p)->ObjectName = (n); \ + (p)->SecurityDescriptor = (s); \ + (p)->SecurityQualityOfService = NULL; \ +} +#ifndef NT_SUCCESS +#define NT_SUCCESS(x) ((x)>=0) +#define STATUS_SUCCESS ((NTSTATUS)0) +#endif +#if !defined(_NTSECAPI_H) && !defined(_SUBAUTH_H) +typedef LONG NTSTATUS, *PNTSTATUS; +typedef struct _UNICODE_STRING { + USHORT Length; + USHORT MaximumLength; + PWSTR Buffer; +} UNICODE_STRING, *PUNICODE_STRING; +typedef const UNICODE_STRING* PCUNICODE_STRING; +typedef struct _STRING { + USHORT Length; + USHORT MaximumLength; + PCHAR Buffer; +} STRING, *PSTRING; +#endif +typedef STRING ANSI_STRING; +typedef PSTRING PANSI_STRING; +typedef STRING OEM_STRING; +typedef PSTRING POEM_STRING; +typedef LARGE_INTEGER PHYSICAL_ADDRESS, *PPHYSICAL_ADDRESS; +typedef enum _SECTION_INHERIT { + ViewShare = 1, + ViewUnmap = 2 +} SECTION_INHERIT; +#if !defined(_NTSECAPI_H) +typedef struct _OBJECT_ATTRIBUTES { + ULONG Length; + HANDLE RootDirectory; + PUNICODE_STRING ObjectName; + ULONG Attributes; + PVOID SecurityDescriptor; + PVOID SecurityQualityOfService; +} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES; +#endif +#endif /* _NTDEF_H */ diff --git a/reactos/w32api/include/ntdll.h b/reactos/w32api/include/ntdll.h new file mode 100644 index 00000000000..b666613996b --- /dev/null +++ b/reactos/w32api/include/ntdll.h @@ -0,0 +1,15 @@ +#ifndef _NTDLL_H +#define _NTDLL_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +typedef enum _SHUTDOWN_ACTION { + ShutdownNoReboot, + ShutdownReboot, + ShutdownPowerOff + } SHUTDOWN_ACTION; + +DWORD WINAPI NtShutdownSystem (SHUTDOWN_ACTION Action); + +#endif /* _NTDLL_H */ diff --git a/reactos/w32api/include/ntldap.h b/reactos/w32api/include/ntldap.h new file mode 100644 index 00000000000..29236a047ca --- /dev/null +++ b/reactos/w32api/include/ntldap.h @@ -0,0 +1,60 @@ +/* + ntldap.h - Header file for the Windows LDAP API Extensions + + Written by Filip Navara <xnavara@volny.cz> + + References: + Lightweight Directory Access Protocol Reference + http://msdn.microsoft.com/library/en-us/netdir/ldap/ldap_reference.asp + + 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. +*/ + +#ifndef _NTLDAP_H +#define _NTLDAP_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#define LDAP_SERVER_ASQ_OID "1.2.840.113556.1.4.1504" +#define LDAP_SERVER_ASQ_OID_W L"1.2.840.113556.1.4.1504" +#define LDAP_SERVER_DIRSYNC_OID "1.2.840.113556.1.4.841" +#define LDAP_SERVER_DIRSYNC_OID_W L"1.2.840.113556.1.4.841" +#define LDAP_SERVER_SD_FLAGS_OID "1.2.840.113556.1.4.801" +#define LDAP_SERVER_SD_FLAGS_OID_W L"1.2.840.113556.1.4.801" +#define LDAP_SERVER_FAST_BIND_OID "1.2.840.113556.1.4.1781" +#define LDAP_SERVER_FAST_BIND_OID_W L"1.2.840.113556.1.4.1781" +#define LDAP_MATCHING_RULE_BIT_OR "1.2.840.113556.1.4.804" +#define LDAP_MATCHING_RULE_BIT_OR_W L"1.2.840.113556.1.4.804" +#define LDAP_MATCHING_RULE_BIT_AND "1.2.840.113556.1.4.803" +#define LDAP_MATCHING_RULE_BIT_AND_W L"1.2.840.113556.1.4.803" +#define LDAP_SERVER_EXTENDED_DN_OID "1.2.840.113556.1.4.529" +#define LDAP_SERVER_EXTENDED_DN_OID_W L"1.2.840.113556.1.4.529" +#define LDAP_SERVER_LAZY_COMMIT_OID "1.2.840.113556.1.4.619" +#define LDAP_SERVER_LAZY_COMMIT_OID_W L"1.2.840.113556.1.4.619" +#define LDAP_SERVER_TREE_DELETE_OID "1.2.840.113556.1.4.805" +#define LDAP_SERVER_TREE_DELETE_OID_W L"1.2.840.113556.1.4.805" +#define LDAP_SERVER_VERIFY_NAME_OID "1.2.840.113556.1.4.1338" +#define LDAP_SERVER_VERIFY_NAME_OID_W L"1.2.840.113556.1.4.1338" +#define LDAP_SERVER_SHOW_DELETED_OID "1.2.840.113556.1.4.417" +#define LDAP_SERVER_SHOW_DELETED_OID_W L"1.2.840.113556.1.4.417" +#define LDAP_SERVER_NOTIFICATION_OID "1.2.840.113556.1.4.528" +#define LDAP_SERVER_NOTIFICATION_OID_W L"1.2.840.113556.1.4.528" +#define LDAP_SERVER_DOMAIN_SCOPE_OID "1.2.840.113556.1.4.1339" +#define LDAP_SERVER_DOMAIN_SCOPE_OID_W L"1.2.840.113556.1.4.1339" +#define LDAP_CAP_ACTIVE_DIRECTORY_OID "1.2.840.113556.1.4.800" +#define LDAP_CAP_ACTIVE_DIRECTORY_OID_W L"1.2.840.113556.1.4.800" +#define LDAP_SERVER_SEARCH_OPTIONS_OID "1.2.840.113556.1.4.1340" +#define LDAP_SERVER_SEARCH_OPTIONS_OID_W L"1.2.840.113556.1.4.1340" +#define LDAP_CAP_ACTIVE_DIRECTORY_V51_OID "1.2.840.113556.1.4.1670" +#define LDAP_CAP_ACTIVE_DIRECTORY_V51_OID_W L"1.2.840.113556.1.4.1670" +#define LDAP_SERVER_PERMISSIVE_MODIFY_OID "1.2.840.113556.1.4.1413" +#define LDAP_SERVER_PERMISSIVE_MODIFY_OID_W L"1.2.840.113556.1.4.1413" +#define LDAP_SERVER_CROSSDOM_MOVE_TARGET_OID "1.2.840.113556.1.4.521" +#define LDAP_SERVER_CROSSDOM_MOVE_TARGET_OID_W L"1.2.840.113556.1.4.521" +#define SERVER_SEARCH_FLAG_DOMAIN_SCOPE 1 +#define SERVER_SEARCH_FLAG_PHANTOM_ROOT 2 + +#endif /* _NTLDAP_H */ diff --git a/reactos/w32api/include/ntsecapi.h b/reactos/w32api/include/ntsecapi.h new file mode 100644 index 00000000000..559087292c9 --- /dev/null +++ b/reactos/w32api/include/ntsecapi.h @@ -0,0 +1,612 @@ +#ifndef _NTSECAPI_H +#define _NTSECAPI_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define KERB_WRAP_NO_ENCRYPT 0x80000001 +#define LOGON_GUEST 1 +#define LOGON_NOENCRYPTION 2 +#define LOGON_CACHED_ACCOUNT 4 +#define LOGON_USED_LM_PASSWORD 8 +#define LOGON_EXTRA_SIDS 32 +#define LOGON_SUBAUTH_SESSION_KEY 64 +#define LOGON_SERVER_TRUST_ACCOUNT 128 +#define LOGON_NTLMV2_ENABLED 256 +#define LOGON_RESOURCE_GROUPS 512 +#define LOGON_PROFILE_PATH_RETURNED 1024 +#define LOGON_GRACE_LOGON 16777216 +#define LSA_MODE_PASSWORD_PROTECTED 1 +#define LSA_MODE_INDIVIDUAL_ACCOUNTS 2 +#define LSA_MODE_MANDATORY_ACCESS 3 +#define LSA_MODE_LOG_FULL 4 +#define LSA_SUCCESS(x) ((LONG)(x)>=0) +#define MICROSOFT_KERBEROS_NAME_A "Kerberos" +#define MICROSOFT_KERBEROS_NAME_W L"Kerberos" +#define MSV1_0_ALLOW_SERVER_TRUST_ACCOUNT 32 +#define MSV1_0_ALLOW_WORKSTATION_TRUST_ACCOUNT 2048 +#define MSV1_0_CHALLENGE_LENGTH 8 +#define MSV1_0_CLEARTEXT_PASSWORD_ALLOWED 2 +#define MSV1_0_CRED_LM_PRESENT 1 +#define MSV1_0_CRED_NT_PRESENT 2 +#define MSV1_0_CRED_VERSION 0 +#define MSV1_0_DONT_TRY_GUEST_ACCOUNT 16 +#define MSV1_0_LANMAN_SESSION_KEY_LENGTH 8 +#define MSV1_0_MAX_NTLM3_LIFE 1800 +#define MSV1_0_MAX_AVL_SIZE 64000 +#define MSV1_0_MNS_LOGON 16777216 +#define MSV1_0_NTLM3_RESPONSE_LENGTH 16 +#define MSV1_0_NTLM3_OWF_LENGTH 16 +#define MSV1_0_NTLM3_INPUT_LENGTH (sizeof(MSV1_0_NTLM3_RESPONSE)-MSV1_0_NTLM3_RESPONSE_LENGTH) +#define MSV1_0_OWF_PASSWORD_LENGTH 16 +#define MSV1_0_PACKAGE_NAME "MICROSOFT_AUTHENTICATION_PACKAGE_V1_0" +#define MSV1_0_PACKAGE_NAMEW L"MICROSOFT_AUTHENTICATION_PACKAGE_V1_0" +#define MSV1_0_PACKAGE_NAMEW_LENGTH sizeof(MSV1_0_PACKAGE_NAMEW)-sizeof(WCHAR) +#define MSV1_0_RETURN_USER_PARAMETERS 8 +#define MSV1_0_RETURN_PASSWORD_EXPIRY 64 +#define MSV1_0_RETURN_PROFILE_PATH 512 +#define MSV1_0_SUBAUTHENTICATION_DLL_EX 1048576 +#define MSV1_0_SUBAUTHENTICATION_DLL 0xff000000 +#define MSV1_0_SUBAUTHENTICATION_DLL_SHIFT 24 +#define MSV1_0_SUBAUTHENTICATION_DLL_RAS 2 +#define MSV1_0_SUBAUTHENTICATION_DLL_IIS 132 +#define MSV1_0_SUBAUTHENTICATION_FLAGS 0xff000000 +#define MSV1_0_SUBAUTHENTICATION_KEY "System\\CurrentControlSet\\Control\\Lsa\\MSV1_0" +#define MSV1_0_SUBAUTHENTICATION_VALUE "Auth" +#define MSV1_0_TRY_GUEST_ACCOUNT_ONLY 256 +#define MSV1_0_TRY_SPECIFIED_DOMAIN_ONLY 1024 +#define MSV1_0_UPDATE_LOGON_STATISTICS 4 +#define MSV1_0_USE_CLIENT_CHALLENGE 128 +#define MSV1_0_USER_SESSION_KEY_LENGTH 16 +#define POLICY_VIEW_LOCAL_INFORMATION 1 +#define POLICY_VIEW_AUDIT_INFORMATION 2 +#define POLICY_GET_PRIVATE_INFORMATION 4 +#define POLICY_TRUST_ADMIN 8 +#define POLICY_CREATE_ACCOUNT 16 +#define POLICY_CREATE_SECRET 32 +#define POLICY_CREATE_PRIVILEGE 64 +#define POLICY_SET_DEFAULT_QUOTA_LIMITS 128 +#define POLICY_SET_AUDIT_REQUIREMENTS 256 +#define POLICY_AUDIT_LOG_ADMIN 512 +#define POLICY_SERVER_ADMIN 1024 +#define POLICY_LOOKUP_NAMES 2048 +#define POLICY_READ (STANDARD_RIGHTS_READ|6) +#define POLICY_WRITE (STANDARD_RIGHTS_WRITE|2040) +#define POLICY_EXECUTE (STANDARD_RIGHTS_EXECUTE|2049) +#define POLICY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|4095) +#define POLICY_AUDIT_EVENT_UNCHANGED 0 +#define POLICY_AUDIT_EVENT_SUCCESS 1 +#define POLICY_AUDIT_EVENT_FAILURE 2 +#define POLICY_AUDIT_EVENT_NONE 4 +#define POLICY_AUDIT_EVENT_MASK 7 +#define POLICY_LOCATION_LOCAL 1 +#define POLICY_LOCATION_DS 2 +#define POLICY_MACHINE_POLICY_LOCAL 0 +#define POLICY_MACHINE_POLICY_DEFAULTED 1 +#define POLICY_MACHINE_POLICY_EXPLICIT 2 +#define POLICY_MACHINE_POLICY_UNKNOWN 0xFFFFFFFF +#define POLICY_QOS_SCHANEL_REQUIRED 1 +#define POLICY_QOS_OUTBOUND_INTEGRITY 2 +#define POLICY_QOS_OUTBOUND_CONFIDENTIALITY 4 +#define POLICY_QOS_INBOUND_INTEGREITY 8 +#define POLICY_QOS_INBOUND_CONFIDENTIALITY 16 +#define POLICY_QOS_ALLOW_LOCAL_ROOT_CERT_STORE 32 +#define POLICY_QOS_RAS_SERVER_ALLOWED 64 +#define POLICY_QOS_DHCP_SERVER_ALLOWD 128 +#define POLICY_KERBEROS_FORWARDABLE 1 +#define POLICY_KERBEROS_PROXYABLE 2 +#define POLICY_KERBEROS_RENEWABLE 4 +#define POLICY_KERBEROS_POSTDATEABLE 8 +#define SAM_PASSWORD_CHANGE_NOTIFY_ROUTINE "PasswordChangeNotify" +#define SAM_INIT_NOTIFICATION_ROUTINE "InitializeChangeNotify" +#define SAM_PASSWORD_FILTER_ROUTINE "PasswordFilter" +#define SE_INTERACTIVE_LOGON_NAME TEXT("SeInteractiveLogonRight") +#define SE_NETWORK_LOGON_NAME TEXT("SeNetworkLogonRight") +#define SE_BATCH_LOGON_NAME TEXT("SeBatchLogonRight") +#define SE_SERVICE_LOGON_NAME TEXT("SeServiceLogonRight") +#define TRUST_ATTRIBUTE_NON_TRANSITIVE 1 +#define TRUST_ATTRIBUTE_UPLEVEL_ONLY 2 +#define TRUST_ATTRIBUTE_TREE_PARENT 4194304 +#define TRUST_ATTRIBUTES_VALID -16580609 +#define TRUST_AUTH_TYPE_NONE 0 +#define TRUST_AUTH_TYPE_NT4OWF 1 +#define TRUST_AUTH_TYPE_CLEAR 2 +#define TRUST_DIRECTION_DISABLED 0 +#define TRUST_DIRECTION_INBOUND 1 +#define TRUST_DIRECTION_OUTBOUND 2 +#define TRUST_DIRECTION_BIDIRECTIONAL 3 +#define TRUST_TYPE_DOWNLEVEL 1 +#define TRUST_TYPE_UPLEVEL 2 +#define TRUST_TYPE_MIT 3 +#define TRUST_TYPE_DCE 4 +#if !defined(_NTDEF_H) && !defined(_SUBAUTH_H) +typedef LONG NTSTATUS, *PNTSTATUS; +typedef struct _UNICODE_STRING { + USHORT Length; + USHORT MaximumLength; + PWSTR Buffer; +} UNICODE_STRING, *PUNICODE_STRING; +typedef const UNICODE_STRING* PCUNICODE_STRING; +typedef struct _STRING { + USHORT Length; + USHORT MaximumLength; + PCHAR Buffer; +} STRING, *PSTRING; +#endif +typedef UNICODE_STRING LSA_UNICODE_STRING, *PLSA_UNICODE_STRING; +typedef STRING LSA_STRING, *PLSA_STRING; +typedef enum _MSV1_0_LOGON_SUBMIT_TYPE { + MsV1_0InteractiveLogon = 2, + MsV1_0Lm20Logon, + MsV1_0NetworkLogon, + MsV1_0SubAuthLogon, + MsV1_0WorkstationUnlockLogon = 7 +} MSV1_0_LOGON_SUBMIT_TYPE, *PMSV1_0_LOGON_SUBMIT_TYPE; +typedef enum _MSV1_0_PROFILE_BUFFER_TYPE { + MsV1_0InteractiveProfile = 2, + MsV1_0Lm20LogonProfile, + MsV1_0SmartCardProfile +} MSV1_0_PROFILE_BUFFER_TYPE, *PMSV1_0_PROFILE_BUFFER_TYPE; +typedef enum { + MsvAvEOL, + MsvAvNbComputerName, + MsvAvNbDomainName, + MsvAvDnsComputerName, + MsvAvDnsDomainName +} MSV1_0_AVID; +typedef enum _MSV1_0_PROTOCOL_MESSAGE_TYPE { + MsV1_0Lm20ChallengeRequest = 0, + MsV1_0Lm20GetChallengeResponse, + MsV1_0EnumerateUsers, + MsV1_0GetUserInfo, + MsV1_0ReLogonUsers, + MsV1_0ChangePassword, + MsV1_0ChangeCachedPassword, + MsV1_0GenericPassthrough, + MsV1_0CacheLogon, + MsV1_0SubAuth, + MsV1_0DeriveCredential, + MsV1_0CacheLookup +} MSV1_0_PROTOCOL_MESSAGE_TYPE, *PMSV1_0_PROTOCOL_MESSAGE_TYPE; +typedef enum _POLICY_LSA_SERVER_ROLE { + PolicyServerRoleBackup = 2, + PolicyServerRolePrimary +} POLICY_LSA_SERVER_ROLE, *PPOLICY_LSA_SERVER_ROLE; +typedef enum _POLICY_SERVER_ENABLE_STATE { + PolicyServerEnabled = 2, + PolicyServerDisabled +} POLICY_SERVER_ENABLE_STATE, *PPOLICY_SERVER_ENABLE_STATE; +typedef enum _POLICY_INFORMATION_CLASS { + PolicyAuditLogInformation = 1, + PolicyAuditEventsInformation, + PolicyPrimaryDomainInformation, + PolicyPdAccountInformation, + PolicyAccountDomainInformation, + PolicyLsaServerRoleInformation, + PolicyReplicaSourceInformation, + PolicyDefaultQuotaInformation, + PolicyModificationInformation, + PolicyAuditFullSetInformation, + PolicyAuditFullQueryInformation, + PolicyDnsDomainInformation, + PolicyEfsInformation +} POLICY_INFORMATION_CLASS, *PPOLICY_INFORMATION_CLASS; +typedef enum _POLICY_AUDIT_EVENT_TYPE { + AuditCategorySystem, + AuditCategoryLogon, + AuditCategoryObjectAccess, + AuditCategoryPrivilegeUse, + AuditCategoryDetailedTracking, + AuditCategoryPolicyChange, + AuditCategoryAccountManagement, + AuditCategoryDirectoryServiceAccess, + AuditCategoryAccountLogon +} POLICY_AUDIT_EVENT_TYPE, *PPOLICY_AUDIT_EVENT_TYPE; +typedef enum _POLICY_LOCAL_INFORMATION_CLASS { + PolicyLocalAuditEventsInformation = 1, + PolicyLocalPdAccountInformation, + PolicyLocalAccountDomainInformation, + PolicyLocalLsaServerRoleInformation, + PolicyLocalReplicaSourceInformation, + PolicyLocalModificationInformation, + PolicyLocalAuditFullSetInformation, + PolicyLocalAuditFullQueryInformation, + PolicyLocalDnsDomainInformation, + PolicyLocalIPSecReferenceInformation, + PolicyLocalMachinePasswordInformation, + PolicyLocalQualityOfServiceInformation, + PolicyLocalPolicyLocationInformation +} POLICY_LOCAL_INFORMATION_CLASS, *PPOLICY_LOCAL_INFORMATION_CLASS; +typedef enum _POLICY_DOMAIN_INFORMATION_CLASS { + PolicyDomainIPSecReferenceInformation = 1, + PolicyDomainQualityOfServiceInformation, + PolicyDomainEfsInformation, + PolicyDomainPublicKeyInformation, + PolicyDomainPasswordPolicyInformation, + PolicyDomainLockoutInformation, + PolicyDomainKerberosTicketInformation +} POLICY_DOMAIN_INFORMATION_CLASS, *PPOLICY_DOMAIN_INFORMATION_CLASS; +typedef enum _SECURITY_LOGON_TYPE { + Interactive = 2, + Network, + Batch, + Service, + Proxy, + Unlock +} SECURITY_LOGON_TYPE, *PSECURITY_LOGON_TYPE; +typedef enum _TRUSTED_INFORMATION_CLASS { + TrustedDomainNameInformation = 1, + TrustedControllersInformation, + TrustedPosixOffsetInformation, + TrustedPasswordInformation, + TrustedDomainInformationBasic, + TrustedDomainInformationEx, + TrustedDomainAuthInformation, + TrustedDomainFullInformation +} TRUSTED_INFORMATION_CLASS, *PTRUSTED_INFORMATION_CLASS; +typedef struct _DOMAIN_PASSWORD_INFORMATION { + USHORT MinPasswordLength; + USHORT PasswordHistoryLength; + ULONG PasswordProperties; + LARGE_INTEGER MaxPasswordAge; + LARGE_INTEGER MinPasswordAge; +} DOMAIN_PASSWORD_INFORMATION, *PDOMAIN_PASSWORD_INFORMATION; +typedef ULONG LSA_ENUMERATION_HANDLE, *PLSA_ENUMERATION_HANDLE; +typedef struct _LSA_ENUMERATION_INFORMATION { + PSID Sid; +} LSA_ENUMERATION_INFORMATION, *PLSA_ENUMERATION_INFORMATION; +typedef ULONG LSA_OPERATIONAL_MODE, *PLSA_OPERATIONAL_MODE; +#if !defined(_NTDEF_H) +typedef struct _LSA_OBJECT_ATTRIBUTES { + ULONG Length; + HANDLE RootDirectory; + PLSA_UNICODE_STRING ObjectName; + ULONG Attributes; + PVOID SecurityDescriptor; + PVOID SecurityQualityOfService; +} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES; +#endif +typedef OBJECT_ATTRIBUTES LSA_OBJECT_ATTRIBUTES, *PLSA_OBJECT_ATTRIBUTES; +typedef struct _LSA_TRUST_INFORMATION { + LSA_UNICODE_STRING Name; + PSID Sid; +} LSA_TRUST_INFORMATION, *PLSA_TRUST_INFORMATION; +typedef struct _LSA_REFERENCED_DOMAIN_LIST { + ULONG Entries; + PLSA_TRUST_INFORMATION Domains; +} LSA_REFERENCED_DOMAIN_LIST, *PLSA_REFERENCED_DOMAIN_LIST; +typedef struct _LSA_TRANSLATED_SID { + SID_NAME_USE Use; + ULONG RelativeId; + LONG DomainIndex; +} LSA_TRANSLATED_SID, *PLSA_TRANSLATED_SID; +typedef struct _LSA_TRANSLATED_NAME { + SID_NAME_USE Use; + LSA_UNICODE_STRING Name; + LONG DomainIndex; +} LSA_TRANSLATED_NAME, *PLSA_TRANSLATED_NAME; +typedef struct _MSV1_0_INTERACTIVE_LOGON { + MSV1_0_LOGON_SUBMIT_TYPE MessageType; + UNICODE_STRING LogonDomainName; + UNICODE_STRING UserName; + UNICODE_STRING Password; +} MSV1_0_INTERACTIVE_LOGON, *PMSV1_0_INTERACTIVE_LOGON; +typedef struct _MSV1_0_INTERACTIVE_PROFILE { + MSV1_0_PROFILE_BUFFER_TYPE MessageType; + USHORT LogonCount; + USHORT BadPasswordCount; + LARGE_INTEGER LogonTime; + LARGE_INTEGER LogoffTime; + LARGE_INTEGER KickOffTime; + LARGE_INTEGER PasswordLastSet; + LARGE_INTEGER PasswordCanChange; + LARGE_INTEGER PasswordMustChange; + UNICODE_STRING LogonScript; + UNICODE_STRING HomeDirectory; + UNICODE_STRING FullName; + UNICODE_STRING ProfilePath; + UNICODE_STRING HomeDirectoryDrive; + UNICODE_STRING LogonServer; + ULONG UserFlags; +} MSV1_0_INTERACTIVE_PROFILE, *PMSV1_0_INTERACTIVE_PROFILE; +typedef struct _MSV1_0_LM20_LOGON { + MSV1_0_LOGON_SUBMIT_TYPE MessageType; + UNICODE_STRING LogonDomainName; + UNICODE_STRING UserName; + UNICODE_STRING Workstation; + UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH]; + STRING CaseSensitiveChallengeResponse; + STRING CaseInsensitiveChallengeResponse; + ULONG ParameterControl; +} MSV1_0_LM20_LOGON, * PMSV1_0_LM20_LOGON; +typedef struct _MSV1_0_SUBAUTH_LOGON{ /* W2K only */ + MSV1_0_LOGON_SUBMIT_TYPE MessageType; + UNICODE_STRING LogonDomainName; + UNICODE_STRING UserName; + UNICODE_STRING Workstation; + UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH]; + STRING AuthenticationInfo1; + STRING AuthenticationInfo2; + ULONG ParameterControl; + ULONG SubAuthPackageId; +} MSV1_0_SUBAUTH_LOGON, * PMSV1_0_SUBAUTH_LOGON; +typedef struct _MSV1_0_LM20_LOGON_PROFILE { + MSV1_0_PROFILE_BUFFER_TYPE MessageType; + LARGE_INTEGER KickOffTime; + LARGE_INTEGER LogoffTime; + ULONG UserFlags; + UCHAR UserSessionKey[MSV1_0_USER_SESSION_KEY_LENGTH]; + UNICODE_STRING LogonDomainName; + UCHAR LanmanSessionKey[MSV1_0_LANMAN_SESSION_KEY_LENGTH]; + UNICODE_STRING LogonServer; + UNICODE_STRING UserParameters; +} MSV1_0_LM20_LOGON_PROFILE, * PMSV1_0_LM20_LOGON_PROFILE; +typedef struct _MSV1_0_SUPPLEMENTAL_CREDENTIAL { + ULONG Version; + ULONG Flags; + UCHAR LmPassword[MSV1_0_OWF_PASSWORD_LENGTH]; + UCHAR NtPassword[MSV1_0_OWF_PASSWORD_LENGTH]; +} MSV1_0_SUPPLEMENTAL_CREDENTIAL, *PMSV1_0_SUPPLEMENTAL_CREDENTIAL; +typedef struct _MSV1_0_NTLM3_RESPONSE { + UCHAR Response[MSV1_0_NTLM3_RESPONSE_LENGTH]; + UCHAR RespType; + UCHAR HiRespType; + USHORT Flags; + ULONG MsgWord; + ULONGLONG TimeStamp; + UCHAR ChallengeFromClient[MSV1_0_CHALLENGE_LENGTH]; + ULONG AvPairsOff; + UCHAR Buffer[1]; +} MSV1_0_NTLM3_RESPONSE, *PMSV1_0_NTLM3_RESPONSE; +typedef struct _MSV1_0_AV_PAIR { + USHORT AvId; + USHORT AvLen; +} MSV1_0_AV_PAIR, *PMSV1_0_AV_PAIR; +typedef struct _MSV1_0_CHANGEPASSWORD_REQUEST { + MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType; + UNICODE_STRING DomainName; + UNICODE_STRING AccountName; + UNICODE_STRING OldPassword; + UNICODE_STRING NewPassword; + BOOLEAN Impersonating; +} MSV1_0_CHANGEPASSWORD_REQUEST, *PMSV1_0_CHANGEPASSWORD_REQUEST; +typedef struct _MSV1_0_CHANGEPASSWORD_RESPONSE { + MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType; + BOOLEAN PasswordInfoValid; + DOMAIN_PASSWORD_INFORMATION DomainPasswordInfo; +} MSV1_0_CHANGEPASSWORD_RESPONSE, *PMSV1_0_CHANGEPASSWORD_RESPONSE; +typedef struct _MSV1_0_SUBAUTH_REQUEST{ + MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType; + ULONG SubAuthPackageId; + ULONG SubAuthInfoLength; + PUCHAR SubAuthSubmitBuffer; +} MSV1_0_SUBAUTH_REQUEST, *PMSV1_0_SUBAUTH_REQUEST; +typedef struct _MSV1_0_SUBAUTH_RESPONSE{ + MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType; + ULONG SubAuthInfoLength; + PUCHAR SubAuthReturnBuffer; +} MSV1_0_SUBAUTH_RESPONSE, *PMSV1_0_SUBAUTH_RESPONSE; +#define MSV1_0_DERIVECRED_TYPE_SHA1 0 +typedef struct _MSV1_0_DERIVECRED_REQUEST { + MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType; + LUID LogonId; + ULONG DeriveCredType; + ULONG DeriveCredInfoLength; + UCHAR DeriveCredSubmitBuffer[1]; +} MSV1_0_DERIVECRED_REQUEST, *PMSV1_0_DERIVECRED_REQUEST; +typedef struct _MSV1_0_DERIVECRED_RESPONSE { + MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType; + ULONG DeriveCredInfoLength; + UCHAR DeriveCredReturnBuffer[1]; +} MSV1_0_DERIVECRED_RESPONSE, *PMSV1_0_DERIVECRED_RESPONSE; +typedef ULONG POLICY_AUDIT_EVENT_OPTIONS, *PPOLICY_AUDIT_EVENT_OPTIONS; +typedef struct _POLICY_PRIVILEGE_DEFINITION { + LSA_UNICODE_STRING Name; + LUID LocalValue; +} POLICY_PRIVILEGE_DEFINITION, *PPOLICY_PRIVILEGE_DEFINITION; +typedef struct _POLICY_AUDIT_LOG_INFO { + ULONG AuditLogPercentFull; + ULONG MaximumLogSize; + LARGE_INTEGER AuditRetentionPeriod; + BOOLEAN AuditLogFullShutdownInProgress; + LARGE_INTEGER TimeToShutdown; + ULONG NextAuditRecordId; +} POLICY_AUDIT_LOG_INFO, *PPOLICY_AUDIT_LOG_INFO; +typedef struct _POLICY_AUDIT_EVENTS_INFO { + BOOLEAN AuditingMode; + PPOLICY_AUDIT_EVENT_OPTIONS EventAuditingOptions; + ULONG MaximumAuditEventCount; +} POLICY_AUDIT_EVENTS_INFO, *PPOLICY_AUDIT_EVENTS_INFO; +typedef struct _POLICY_ACCOUNT_DOMAIN_INFO { + LSA_UNICODE_STRING DomainName; + PSID DomainSid; +} POLICY_ACCOUNT_DOMAIN_INFO, *PPOLICY_ACCOUNT_DOMAIN_INFO; +typedef struct _POLICY_PRIMARY_DOMAIN_INFO { + LSA_UNICODE_STRING Name; + PSID Sid; +} POLICY_PRIMARY_DOMAIN_INFO, *PPOLICY_PRIMARY_DOMAIN_INFO; +typedef struct _POLICY_DNS_DOMAIN_INFO { + LSA_UNICODE_STRING Name; + LSA_UNICODE_STRING DnsDomainName; + LSA_UNICODE_STRING DnsTreeName; + GUID DomainGuid; + PSID Sid; +} POLICY_DNS_DOMAIN_INFO, *PPOLICY_DNS_DOMAIN_INFO; +typedef struct _POLICY_PD_ACCOUNT_INFO { + LSA_UNICODE_STRING Name; +} POLICY_PD_ACCOUNT_INFO, *PPOLICY_PD_ACCOUNT_INFO; +typedef struct _POLICY_LSA_SERVER_ROLE_INFO { + POLICY_LSA_SERVER_ROLE LsaServerRole; +} POLICY_LSA_SERVER_ROLE_INFO, *PPOLICY_LSA_SERVER_ROLE_INFO; +typedef struct _POLICY_REPLICA_SOURCE_INFO { + LSA_UNICODE_STRING ReplicaSource; + LSA_UNICODE_STRING ReplicaAccountName; +} POLICY_REPLICA_SOURCE_INFO, *PPOLICY_REPLICA_SOURCE_INFO; +typedef struct _POLICY_DEFAULT_QUOTA_INFO { + QUOTA_LIMITS QuotaLimits; +} POLICY_DEFAULT_QUOTA_INFO, *PPOLICY_DEFAULT_QUOTA_INFO; +typedef struct _POLICY_MODIFICATION_INFO { + LARGE_INTEGER ModifiedId; + LARGE_INTEGER DatabaseCreationTime; +} POLICY_MODIFICATION_INFO, *PPOLICY_MODIFICATION_INFO; +typedef struct _POLICY_AUDIT_FULL_SET_INFO { + BOOLEAN ShutDownOnFull; +} POLICY_AUDIT_FULL_SET_INFO, *PPOLICY_AUDIT_FULL_SET_INFO; +typedef struct _POLICY_AUDIT_FULL_QUERY_INFO { + BOOLEAN ShutDownOnFull; + BOOLEAN LogIsFull; +} POLICY_AUDIT_FULL_QUERY_INFO, *PPOLICY_AUDIT_FULL_QUERY_INFO; +typedef struct _POLICY_EFS_INFO { + ULONG InfoLength; + PUCHAR EfsBlob; +} POLICY_EFS_INFO, *PPOLICY_EFS_INFO; +typedef struct _POLICY_LOCAL_IPSEC_REFERENCE_INFO { + LSA_UNICODE_STRING ObjectPath; +} POLICY_LOCAL_IPSEC_REFERENCE_INFO, *PPOLICY_LOCAL_IPSEC_REFERENCE_INFO; +typedef struct _POLICY_LOCAL_MACHINE_PASSWORD_INFO { + LARGE_INTEGER PasswordChangeInterval; +} POLICY_LOCAL_MACHINE_PASSWORD_INFO, *PPOLICY_LOCAL_MACHINE_PASSWORD_INFO; +typedef struct _POLICY_LOCAL_POLICY_LOCATION_INFO { + ULONG PolicyLocation; +} POLICY_LOCAL_POLICY_LOCATION_INFO, *PPOLICY_LOCAL_POLICY_LOCATION_INFO; +typedef struct _POLICY_LOCAL_QUALITY_OF_SERVICE_INFO { + ULONG QualityOfService; +} POLICY_LOCAL_QUALITY_OF_SERVICE_INFO, *PPOLICY_LOCAL_QUALITY_OF_SERVICE_INFO; +typedef struct _POLICY_LOCAL_QUALITY_OF_SERVICE_INFO POLICY_DOMAIN_QUALITY_OF_SERVICE_INFO; +typedef struct _POLICY_LOCAL_QUALITY_OF_SERVICE_INFO *PPOLICY_DOMAIN_QUALITY_OF_SERVICE_INFO; +typedef struct _POLICY_DOMAIN_PUBLIC_KEY_INFO { + ULONG InfoLength; + PUCHAR PublicKeyInfo; +} POLICY_DOMAIN_PUBLIC_KEY_INFO, *PPOLICY_DOMAIN_PUBLIC_KEY_INFO; +typedef struct _POLICY_DOMAIN_LOCKOUT_INFO { + LARGE_INTEGER LockoutDuration; + LARGE_INTEGER LockoutObservationWindow; + USHORT LockoutThreshold; +} POLICY_DOMAIN_LOCKOUT_INFO, *PPOLICY_DOMAIN_LOCKOUT_INFO; +typedef struct _POLICY_DOMAIN_PASSWORD_INFO { + USHORT MinPasswordLength; + USHORT PasswordHistoryLength; + ULONG PasswordProperties; + LARGE_INTEGER MaxPasswordAge; + LARGE_INTEGER MinPasswordAge; +} POLICY_DOMAIN_PASSWORD_INFO, *PPOLICY_DOMAIN_PASSWORD_INFO; +typedef struct _POLICY_DOMAIN_KERBEROS_TICKET_INFO { + ULONG AuthenticationOptions; + LARGE_INTEGER MinTicketAge; + LARGE_INTEGER MaxTicketAge; + LARGE_INTEGER MaxRenewAge; + LARGE_INTEGER ProxyLifetime; + LARGE_INTEGER ForceLogoff; +} POLICY_DOMAIN_KERBEROS_TICKET_INFO, *PPOLICY_DOMAIN_KERBEROS_TICKET_INFO; +typedef PVOID LSA_HANDLE, *PLSA_HANDLE; +typedef struct _TRUSTED_DOMAIN_NAME_INFO { + LSA_UNICODE_STRING Name; +} TRUSTED_DOMAIN_NAME_INFO, *PTRUSTED_DOMAIN_NAME_INFO; +typedef struct _TRUSTED_CONTROLLERS_INFO { + ULONG Entries; + PLSA_UNICODE_STRING Names; +} TRUSTED_CONTROLLERS_INFO, *PTRUSTED_CONTROLLERS_INFO; +typedef struct _TRUSTED_POSIX_OFFSET_INFO { + ULONG Offset; +} TRUSTED_POSIX_OFFSET_INFO, *PTRUSTED_POSIX_OFFSET_INFO; +typedef struct _TRUSTED_PASSWORD_INFO { + LSA_UNICODE_STRING Password; + LSA_UNICODE_STRING OldPassword; +} TRUSTED_PASSWORD_INFO, *PTRUSTED_PASSWORD_INFO; +typedef LSA_TRUST_INFORMATION TRUSTED_DOMAIN_INFORMATION_BASIC; +typedef PLSA_TRUST_INFORMATION *PTRUSTED_DOMAIN_INFORMATION_BASIC; +typedef struct _TRUSTED_DOMAIN_INFORMATION_EX { + LSA_UNICODE_STRING Name; + LSA_UNICODE_STRING FlatName; + PSID Sid; + ULONG TrustDirection; + ULONG TrustType; + ULONG TrustAttributes; +} TRUSTED_DOMAIN_INFORMATION_EX, *PTRUSTED_DOMAIN_INFORMATION_EX; +typedef struct _LSA_AUTH_INFORMATION { + LARGE_INTEGER LastUpdateTime; + ULONG AuthType; + ULONG AuthInfoLength; + PUCHAR AuthInfo; +} LSA_AUTH_INFORMATION, *PLSA_AUTH_INFORMATION; +typedef struct _TRUSTED_DOMAIN_AUTH_INFORMATION { + ULONG IncomingAuthInfos; + PLSA_AUTH_INFORMATION IncomingAuthenticationInformation; + PLSA_AUTH_INFORMATION IncomingPreviousAuthenticationInformation; + ULONG OutgoingAuthInfos; + PLSA_AUTH_INFORMATION OutgoingAuthenticationInformation; + PLSA_AUTH_INFORMATION OutgoingPreviousAuthenticationInformation; +} TRUSTED_DOMAIN_AUTH_INFORMATION, *PTRUSTED_DOMAIN_AUTH_INFORMATION; +typedef struct _TRUSTED_DOMAIN_FULL_INFORMATION { + TRUSTED_DOMAIN_INFORMATION_EX Information; + TRUSTED_POSIX_OFFSET_INFO PosixOffset; + TRUSTED_DOMAIN_AUTH_INFORMATION AuthInformation; +} TRUSTED_DOMAIN_FULL_INFORMATION, *PTRUSTED_DOMAIN_FULL_INFORMATION; +NTSTATUS NTAPI LsaAddAccountRights(LSA_HANDLE,PSID,PLSA_UNICODE_STRING,ULONG); +NTSTATUS NTAPI LsaCallAuthenticationPackage(HANDLE,ULONG,PVOID,ULONG,PVOID*, + PULONG,PNTSTATUS); +NTSTATUS NTAPI LsaClose(LSA_HANDLE); +NTSTATUS NTAPI LsaConnectUntrusted(PHANDLE); +NTSTATUS NTAPI LsaCreateTrustedDomainEx(LSA_HANDLE, + PTRUSTED_DOMAIN_INFORMATION_EX, + PTRUSTED_DOMAIN_AUTH_INFORMATION,ACCESS_MASK, + PLSA_HANDLE); +NTSTATUS NTAPI LsaDeleteTrustedDomain(LSA_HANDLE,PSID); +NTSTATUS NTAPI LsaDeregisterLogonProcess(HANDLE); +NTSTATUS NTAPI LsaEnumerateAccountRights(LSA_HANDLE,PSID,PLSA_UNICODE_STRING*,PULONG); +NTSTATUS NTAPI LsaEnumerateAccountsWithUserRight(LSA_HANDLE,PLSA_UNICODE_STRING, + PVOID*,PULONG); +NTSTATUS NTAPI LsaEnumerateTrustedDomains(LSA_HANDLE,PLSA_ENUMERATION_HANDLE, + PVOID*,ULONG,PULONG); +NTSTATUS NTAPI LsaEnumerateTrustedDomainsEx(LSA_HANDLE,PLSA_ENUMERATION_HANDLE, + TRUSTED_INFORMATION_CLASS,PVOID*,ULONG,PULONG); +NTSTATUS NTAPI LsaFreeMemory(PVOID); +NTSTATUS NTAPI LsaFreeReturnBuffer(PVOID); +NTSTATUS NTAPI LsaLogonUser(HANDLE,PLSA_STRING,SECURITY_LOGON_TYPE,ULONG,PVOID, + ULONG,PTOKEN_GROUPS,PTOKEN_SOURCE,PVOID*,PULONG, + PLUID,PHANDLE,PQUOTA_LIMITS,PNTSTATUS); +NTSTATUS NTAPI LsaLookupAuthenticationPackage(HANDLE,PLSA_STRING,PULONG); +NTSTATUS NTAPI LsaLookupNames(LSA_HANDLE,ULONG,PLSA_UNICODE_STRING, + PLSA_REFERENCED_DOMAIN_LIST*,PLSA_TRANSLATED_SID*); +NTSTATUS NTAPI LsaLookupSids(LSA_HANDLE,ULONG,PSID*, + PLSA_REFERENCED_DOMAIN_LIST*,PLSA_TRANSLATED_NAME*); +ULONG NTAPI LsaNtStatusToWinError(NTSTATUS); +NTSTATUS NTAPI LsaOpenPolicy(PLSA_UNICODE_STRING,PLSA_OBJECT_ATTRIBUTES, + ACCESS_MASK,PLSA_HANDLE); +NTSTATUS NTAPI LsaQueryDomainInformationPolicy(LSA_HANDLE, + POLICY_DOMAIN_INFORMATION_CLASS,PVOID*); +NTSTATUS NTAPI LsaQueryInformationPolicy(LSA_HANDLE,POLICY_INFORMATION_CLASS,PVOID*); +NTSTATUS NTAPI LsaQueryLocalInformationPolicy(LSA_HANDLE, + POLICY_LOCAL_INFORMATION_CLASS,PVOID*); +NTSTATUS NTAPI LsaQueryTrustedDomainInfo(LSA_HANDLE,PSID, + TRUSTED_INFORMATION_CLASS,PVOID*); +NTSTATUS NTAPI LsaQueryTrustedDomainInfoByName(LSA_HANDLE,PLSA_UNICODE_STRING, + TRUSTED_INFORMATION_CLASS,PVOID*); +NTSTATUS NTAPI LsaRegisterLogonProcess(PLSA_STRING,PHANDLE,PLSA_OPERATIONAL_MODE); +NTSTATUS NTAPI LsaRemoveAccountRights(LSA_HANDLE,PSID,BOOLEAN, + PLSA_UNICODE_STRING,ULONG); +NTSTATUS NTAPI LsaRetrievePrivateData(LSA_HANDLE,PLSA_UNICODE_STRING, + PLSA_UNICODE_STRING*); +NTSTATUS NTAPI LsaSetDomainInformationPolicy(LSA_HANDLE, + POLICY_DOMAIN_INFORMATION_CLASS,PVOID); +NTSTATUS NTAPI LsaSetInformationPolicy(LSA_HANDLE,POLICY_INFORMATION_CLASS, PVOID); +NTSTATUS NTAPI LsaSetLocalInformationPolicy(LSA_HANDLE, + POLICY_LOCAL_INFORMATION_CLASS,PVOID); +NTSTATUS NTAPI LsaSetTrustedDomainInformation(LSA_HANDLE,PSID, + TRUSTED_INFORMATION_CLASS,PVOID); +NTSTATUS NTAPI LsaSetTrustedDomainInfoByName(LSA_HANDLE,PLSA_UNICODE_STRING, + TRUSTED_INFORMATION_CLASS,PVOID); +NTSTATUS NTAPI LsaStorePrivateData(LSA_HANDLE,PLSA_UNICODE_STRING, + PLSA_UNICODE_STRING); +typedef NTSTATUS (*PSAM_PASSWORD_NOTIFICATION_ROUTINE)(PUNICODE_STRING, + ULONG,PUNICODE_STRING); +typedef BOOLEAN (*PSAM_INIT_NOTIFICATION_ROUTINE)(void); +typedef BOOLEAN (*PSAM_PASSWORD_FILTER_ROUTINE)(PUNICODE_STRING,PUNICODE_STRING, + PUNICODE_STRING,BOOLEAN); +#ifdef __cplusplus +} +#endif +#endif /* _NTSECAPI_H */ diff --git a/reactos/w32api/include/ntsecpkg.h b/reactos/w32api/include/ntsecpkg.h new file mode 100644 index 00000000000..1b6076a8620 --- /dev/null +++ b/reactos/w32api/include/ntsecpkg.h @@ -0,0 +1,44 @@ +#ifndef _NTSECPKG_H +#define _NTSECPKG_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#define ISC_REQ_DELEGATE 1 +#define ISC_REQ_MUTUAL_AUTH 2 +#define ISC_REQ_REPLAY_DETECT 4 +#define ISC_REQ_SEQUENCE_DETECT 8 +#define ISC_REQ_CONFIDENTIALITY 16 +#define ISC_REQ_USE_SESSION_KEY 32 +#define ISC_REQ_PROMPT_FOR_CREDS 64 +#define ISC_REQ_USE_SUPPLIED_CREDS 128 +#define ISC_REQ_ALLOCATE_MEMORY 256 +#define ISC_REQ_USE_DCE_STYLE 512 +#define ISC_REQ_DATAGRAM 1024 +#define ISC_REQ_CONNECTION 2048 +#define ISC_REQ_EXTENDED_ERROR 16384 +#define ISC_REQ_STREAM 32768 +#define ISC_REQ_INTEGRITY 65536 +#define ISC_REQ_MANUAL_CRED_VALIDATION 524288 +#define ISC_REQ_HTTP 268435456 + +#define ISC_RET_EXTENDED_ERROR 16384 + +#define ASC_REQ_DELEGATE 1 +#define ASC_REQ_MUTUAL_AUTH 2 +#define ASC_REQ_REPLAY_DETECT 4 +#define ASC_REQ_SEQUENCE_DETECT 8 +#define ASC_REQ_CONFIDENTIALITY 16 +#define ASC_REQ_USE_SESSION_KEY 32 +#define ASC_REQ_ALLOCATE_MEMORY 256 +#define ASC_REQ_USE_DCE_STYLE 512 +#define ASC_REQ_DATAGRAM 1024 +#define ASC_REQ_CONNECTION 2048 +#define ASC_REQ_EXTENDED_ERROR 32768 +#define ASC_REQ_STREAM 65536 +#define ASC_REQ_INTEGRITY 131072 + +#define SECURITY_NATIVE_DREP 16 +#define SECURITY_NETWORK_DREP 0 + +#endif /* _NTSECPKG_H */ diff --git a/reactos/w32api/include/oaidl.h b/reactos/w32api/include/oaidl.h new file mode 100644 index 00000000000..06c4116ab52 --- /dev/null +++ b/reactos/w32api/include/oaidl.h @@ -0,0 +1,705 @@ +#ifndef _OAIDL_H +#define _OAIDL_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#ifdef NONAMELESSUNION +#define __VARIANT_NAME_1 n1 +#define __VARIANT_NAME_2 n2 +#define __VARIANT_NAME_3 n3 +#define __VARIANT_NAME_4 n4 +#else +#define __tagVARIANT +#define __VARIANT_NAME_1 +#define __VARIANT_NAME_2 +#define __VARIANT_NAME_3 +#define __VARIANT_NAME_4 +#endif +#define DISPID_UNKNOWN (-1) +#define DISPID_VALUE (0) +#define DISPID_PROPERTYPUT (-3) +#define DISPID_NEWENUM (-4) +#define DISPID_EVALUATE (-5) +#define DISPID_CONSTRUCTOR (-6) +#define DISPID_DESTRUCTOR (-7) +#define DISPID_COLLECT (-8) +#define FADF_AUTO (1) +#define FADF_STATIC (2) +#define FADF_EMBEDDED (4) +#define FADF_FIXEDSIZE (16) +#define FADF_BSTR (256) +#define FADF_UNKNOWN (512) +#define FADF_DISPATCH (1024) +#define FADF_VARIANT (2048) +#define FADF_RESERVED (0xf0e8) +#define PARAMFLAG_NONE (0) +#define PARAMFLAG_FIN (1) +#define PARAMFLAG_FOUT (2) +#define PARAMFLAG_FLCID (4) +#define PARAMFLAG_FRETVAL (8) +#define PARAMFLAG_FOPT (16) +#define PARAMFLAG_FHASDEFAULT (32) +#define IDLFLAG_NONE PARAMFLAG_NONE +#define IDLFLAG_FIN PARAMFLAG_FIN +#define IDLFLAG_FOUT PARAMFLAG_FOUT +#define IDLFLAG_FLCID PARAMFLAG_FLCID +#define IDLFLAG_FRETVAL PARAMFLAG_FRETVAL +#define IMPLTYPEFLAG_FDEFAULT 1 +#define IMPLTYPEFLAG_FSOURCE 2 +#define IMPLTYPEFLAG_FRESTRICTED 4 +#define IMPLTYPEFLAG_FDEFAULTVTABLE 8 + +typedef interface ITypeLib *LPTYPELIB; +typedef interface ITypeLib2 *LPTYPELIB2; +typedef interface ICreateTypeInfo *LPCREATETYPEINFO; +typedef interface ICreateTypeInfo2 *LPCREATETYPEINFO2; +typedef interface ICreateTypeLib *LPCREATETYPELIB; +typedef interface ICreateTypeLib2 *LPCREATETYPELIB2; +typedef interface ITypeComp *LPTYPECOMP; +typedef interface ITypeInfo *LPTYPEINFO; +typedef interface ITypeInfo2 *LPTYPEINFO2; +typedef interface IErrorInfo *LPERRORINFO; +typedef interface IDispatch *LPDISPATCH; +typedef interface IEnumVARIANT *LPENUMVARIANT; +typedef interface ICreateErrorInfo *LPCREATEERRORINFO; +typedef interface ISupportErrorInfo *LPSUPPORTERRORINFO; +typedef interface IRecordInfo *LPRECORDINFO; + +extern const IID IID_ITypeLib; +extern const IID IID_ITypeLib2; +extern const IID IID_ICreateTypeInfo; +extern const IID IID_ICreateTypeInfo2; +extern const IID IID_ICreateTypeLib; +extern const IID IID_ICreateTypeLib2; +extern const IID IID_ITypeInfo; +extern const IID IID_ITypeInfo2; +extern const IID IID_IErrorInfo; +extern const IID IID_IDispatch; +extern const IID IID_IEnumVARIANT; +extern const IID IID_ICreateErrorInfo; +extern const IID IID_ISupportErrorInfo; +extern const IID IID_IRecordInfo; +extern const IID IID_ITypeMarshal; + +typedef enum tagSYSKIND { + SYS_WIN16,SYS_WIN32,SYS_MAC +} SYSKIND; +typedef enum tagLIBFLAGS { + LIBFLAG_FRESTRICTED=1,LIBFLAG_FCONTROL=2,LIBFLAG_FHIDDEN=4, + LIBFLAG_FHASDISKIMAGE=8 +} LIBFLAGS; +typedef struct tagTLIBATTR { + GUID guid; + LCID lcid; + SYSKIND syskind; + WORD wMajorVerNum; + WORD wMinorVerNum; + WORD wLibFlags; +} TLIBATTR,*LPTLIBATTR; +typedef CY CURRENCY; +typedef struct tagSAFEARRAYBOUND { + ULONG cElements; + LONG lLbound; +}SAFEARRAYBOUND,*LPSAFEARRAYBOUND; +typedef struct _wireSAFEARR_BSTR +{ + ULONG Size; + wireBSTR *aBstr; +}SAFEARR_BSTR; +typedef struct _wireSAFEARR_UNKNOWN { + ULONG Size; + IUnknown **apUnknown; +}SAFEARR_UNKNOWN; +typedef struct _wireSAFEARR_DISPATCH { + ULONG Size; + LPDISPATCH *apDispatch; +}SAFEARR_DISPATCH; +typedef struct _wireSAFEARR_VARIANT { + ULONG Size; + struct _wireVARIANT *aVariant; +}SAFEARR_VARIANT; +typedef enum tagSF_TYPE { + SF_ERROR=VT_ERROR, + SF_I1=VT_I1, + SF_I2=VT_I2, + SF_I4=VT_I4, + SF_I8=VT_I8, + SF_BSTR=VT_BSTR, + SF_UNKNOWN=VT_UNKNOWN, + SF_DISPATCH=VT_DISPATCH, + SF_VARIANT=VT_VARIANT +}SF_TYPE; +typedef struct _wireBRECORD { + ULONG fFlags; + ULONG clSize; + LPRECORDINFO* pRecInfo; + byte* pRecord; +} *wireBRECORD; +typedef struct _wireSAFEARR_BRECORD { + ULONG Size; + wireBRECORD* aRecord; + } SAFEARR_BRECORD; +typedef struct _wireSAFEARR_HAVEIID { + ULONG Size; + IUnknown** apUnknown; + IID iid; + } SAFEARR_HAVEIID; +typedef struct _wireSAFEARRAY_UNION { + ULONG sfType; + union { + SAFEARR_BSTR BstrStr; + SAFEARR_UNKNOWN UnknownStr; + SAFEARR_DISPATCH DispatchStr; + SAFEARR_VARIANT VariantStr; + SAFEARR_BRECORD RecordStr; + SAFEARR_HAVEIID HaveIidStr; + BYTE_SIZEDARR ByteStr; + WORD_SIZEDARR WordStr; + DWORD_SIZEDARR LongStr; + HYPER_SIZEDARR HyperStr; + }u; +}SAFEARRAYUNION; +typedef struct _wireSAFEARRAY { + USHORT cDims; + USHORT fFeatures; + ULONG cbElements; + ULONG cLocks; + SAFEARRAYUNION uArrayStructs; + SAFEARRAYBOUND rgsabound[1]; +}*wireSAFEARRAY; +typedef wireSAFEARRAY *wirePSAFEARRAY; +typedef struct tagSAFEARRAY { + USHORT cDims; + USHORT fFeatures; + ULONG cbElements; + ULONG cLocks; + PVOID pvData; + SAFEARRAYBOUND rgsabound[1]; +}SAFEARRAY,*LPSAFEARRAY; +#if defined (__GNUC__) && !defined (NONAMELESSUNION) +__extension__ /* no named members */ +#endif +typedef struct tagVARIANT { + _ANONYMOUS_UNION union { + struct __tagVARIANT { + VARTYPE vt; + WORD wReserved1; + WORD wReserved2; + WORD wReserved3; + _ANONYMOUS_UNION union { + long lVal; + unsigned char bVal; + short iVal; + float fltVal; + double dblVal; + VARIANT_BOOL boolVal; + SCODE scode; + CY cyVal; + DATE date; + BSTR bstrVal; + IUnknown *punkVal; + LPDISPATCH pdispVal; + SAFEARRAY *parray; + unsigned char *pbVal; + short *piVal; + long *plVal; + float *pfltVal; + double *pdblVal; + VARIANT_BOOL *pboolVal; + _VARIANT_BOOL *pbool; + SCODE *pscode; + CY *pcyVal; + DATE *pdate; + BSTR *pbstrVal; + IUnknown **ppunkVal; + LPDISPATCH *ppdispVal; + SAFEARRAY **pparray; + struct tagVARIANT *pvarVal; + void *byref; + CHAR cVal; + USHORT uiVal; + ULONG ulVal; + INT intVal; + UINT uintVal; + DECIMAL *pdecVal; + CHAR *pcVal; + USHORT *puiVal; + ULONG *pulVal; + INT *pintVal; + UINT *puintVal; + _ANONYMOUS_STRUCT struct { + PVOID pvRecord; + struct IRecordInfo *pRecInfo; + } __VARIANT_NAME_4; + } __VARIANT_NAME_3; + } __VARIANT_NAME_2; + DECIMAL decVal; + } __VARIANT_NAME_1; +} VARIANT,*LPVARIANT; +typedef VARIANT VARIANTARG; +typedef VARIANT *LPVARIANTARG; +typedef struct _wireVARIANT { + DWORD clSize; + DWORD rpcReserved; + USHORT vt; + USHORT wReserved1; + USHORT wReserved2; + USHORT wReserved3; + _ANONYMOUS_UNION union { + LONG lVal; + BYTE bVal; + SHORT iVal; + FLOAT fltVal; + DOUBLE dblVal; + VARIANT_BOOL boolVal; + SCODE scode; + CY cyVal; + DATE date; + wireBSTR bstrVal; + IUnknown *punkVal; + LPDISPATCH pdispVal; + wirePSAFEARRAY parray; + wireBRECORD brecVal; + BYTE *pbVal; + SHORT *piVal; + LONG *plVal; + FLOAT *pfltVal; + DOUBLE *pdblVal; + VARIANT_BOOL *pboolVal; + SCODE *pscode; + CY *pcyVal; + DATE *pdate; + wireBSTR *pbstrVal; + IUnknown **ppunkVal; + LPDISPATCH *ppdispVal; + wirePSAFEARRAY *pparray; + struct _wireVARIANT *pvarVal; + CHAR cVal; + USHORT uiVal; + ULONG ulVal; + INT intVal; + UINT uintVal; + DECIMAL decVal; + DECIMAL *pdecVal; + CHAR *pcVal; + USHORT *puiVal; + ULONG *pulVal; + INT *pintVal; + UINT *puintVal; + } DUMMYUNIONNAME; +} *wireVARIANT; +typedef LONG DISPID; +typedef DISPID MEMBERID; +typedef DWORD HREFTYPE; +typedef enum tagTYPEKIND { + TKIND_ENUM,TKIND_RECORD,TKIND_MODULE,TKIND_INTERFACE,TKIND_DISPATCH, + TKIND_COCLASS,TKIND_ALIAS,TKIND_UNION,TKIND_MAX +}TYPEKIND; +typedef struct tagTYPEDESC { + _ANONYMOUS_UNION union { + struct tagTYPEDESC *lptdesc; + struct tagARRAYDESC *lpadesc; + HREFTYPE hreftype; + } DUMMYUNIONNAME; + VARTYPE vt; +}TYPEDESC; +typedef struct tagARRAYDESC { + TYPEDESC tdescElem; + USHORT cDims; + SAFEARRAYBOUND rgbounds[1]; +}ARRAYDESC; +typedef struct tagPARAMDESCEX { + ULONG cBytes; + VARIANTARG varDefaultValue; +}PARAMDESCEX,*LPPARAMDESCEX; +typedef struct tagPARAMDESC { + LPPARAMDESCEX pparamdescex; + USHORT wParamFlags; +}PARAMDESC,*LPPARAMDESC; +typedef struct tagIDLDESC { + ULONG dwReserved; + USHORT wIDLFlags; +}IDLDESC,*LPIDLDESC; +typedef struct tagELEMDESC { + TYPEDESC tdesc; + _ANONYMOUS_UNION union { + IDLDESC idldesc; + PARAMDESC paramdesc; + } DUMMYUNIONNAME; +} ELEMDESC,*LPELEMDESC; +typedef struct tagTYPEATTR { + GUID guid; + LCID lcid; + DWORD dwReserved; + MEMBERID memidConstructor; + MEMBERID memidDestructor; + LPOLESTR lpstrSchema; + ULONG cbSizeInstance; + TYPEKIND typekind; + WORD cFuncs; + WORD cVars; + WORD cImplTypes; + WORD cbSizeVft; + WORD cbAlignment; + WORD wTypeFlags; + WORD wMajorVerNum; + WORD wMinorVerNum; + TYPEDESC tdescAlias; + IDLDESC idldescType; +}TYPEATTR,*LPTYPEATTR; +typedef struct tagDISPPARAMS { + VARIANTARG *rgvarg; + DISPID *rgdispidNamedArgs; + UINT cArgs; + UINT cNamedArgs; +}DISPPARAMS; +typedef struct tagEXCEPINFO { + WORD wCode; + WORD wReserved; + BSTR bstrSource; + BSTR bstrDescription; + BSTR bstrHelpFile; + DWORD dwHelpContext; + PVOID pvReserved; + HRESULT(__stdcall * pfnDeferredFillIn)(struct tagEXCEPINFO*); + SCODE scode; +} EXCEPINFO,*LPEXCEPINFO; +typedef enum tagCALLCONV { + CC_FASTCALL,CC_CDECL,CC_MSCPASCAL,CC_PASCAL=CC_MSCPASCAL, + CC_MACPASCAL,CC_STDCALL,CC_FPFASTCALL,CC_SYSCALL,CC_MPWCDECL, + CC_MPWPASCAL,CC_MAX=CC_MPWPASCAL +}CALLCONV; +typedef enum tagFUNCKIND { + FUNC_VIRTUAL,FUNC_PUREVIRTUAL,FUNC_NONVIRTUAL, + FUNC_STATIC,FUNC_DISPATCH +}FUNCKIND; +typedef enum tagINVOKEKIND { + INVOKE_FUNC=1,INVOKE_PROPERTYGET,INVOKE_PROPERTYPUT=4, + INVOKE_PROPERTYPUTREF=8 +}INVOKEKIND; +typedef struct tagFUNCDESC { + MEMBERID memid; + SCODE *lprgscode; + ELEMDESC *lprgelemdescParam; + FUNCKIND funckind; + INVOKEKIND invkind; + CALLCONV callconv; + SHORT cParams; + SHORT cParamsOpt; + SHORT oVft; + SHORT cScodes; + ELEMDESC elemdescFunc; + WORD wFuncFlags; +}FUNCDESC,*LPFUNCDESC; +typedef enum tagVARKIND { + VAR_PERINSTANCE,VAR_STATIC,VAR_CONST,VAR_DISPATCH +} VARKIND; +typedef struct tagVARDESC { + MEMBERID memid; + LPOLESTR lpstrSchema; + _ANONYMOUS_UNION union { + ULONG oInst; + VARIANT *lpvarValue; + } DUMMYUNIONNAME; + ELEMDESC elemdescVar; + WORD wVarFlags; + VARKIND varkind; +} VARDESC,*LPVARDESC; +typedef enum tagTYPEFLAGS { + TYPEFLAG_FAPPOBJECT=1,TYPEFLAG_FCANCREATE=2,TYPEFLAG_FLICENSED=4, + TYPEFLAG_FPREDECLID=8,TYPEFLAG_FHIDDEN=16,TYPEFLAG_FCONTROL=32, + TYPEFLAG_FDUAL=64,TYPEFLAG_FNONEXTENSIBLE=128, + TYPEFLAG_FOLEAUTOMATION=256,TYPEFLAG_FRESTRICTED=512, + TYPEFLAG_FAGGREGATABLE=1024,TYPEFLAG_FREPLACEABLE=2048, + TYPEFLAG_FDISPATCHABLE=4096,TYPEFLAG_FREVERSEBIND=8192 +} TYPEFLAGS; +typedef enum tagFUNCFLAGS { + FUNCFLAG_FRESTRICTED=1,FUNCFLAG_FSOURCE=2,FUNCFLAG_FBINDABLE=4, + FUNCFLAG_FREQUESTEDIT=8,FUNCFLAG_FDISPLAYBIND=16,FUNCFLAG_FDEFAULTBIND=32, + FUNCFLAG_FHIDDEN=64,FUNCFLAG_FUSESGETLASTERROR=128,FUNCFLAG_FDEFAULTCOLLELEM=256, + FUNCFLAG_FUIDEFAULT=512,FUNCFLAG_FNONBROWSABLE=1024,FUNCFLAG_FREPLACEABLE=2048, + FUNCFLAG_FIMMEDIATEBIND=4096 +} FUNCFLAGS; +typedef enum tagVARFLAGS { + VARFLAG_FREADONLY=1,VARFLAG_FSOURCE=2,VARFLAG_FBINDABLE=4,VARFLAG_FREQUESTEDIT=8, + VARFLAG_FDISPLAYBIND=16,VARFLAG_FDEFAULTBIND=32,VARFLAG_FHIDDEN=64,VARFLAG_FRESTRICTED=128, + VARFLAG_FDEFAULTCOLLELEM=256,VARFLAG_FUIDEFAULT=512,VARFLAG_FNONBROWSABLE=1024, + VARFLAG_FREPLACEABLE=2048,VARFLAG_FIMMEDIATEBIND=4096 +} VARFLAGS; +typedef struct tagCLEANLOCALSTORAGE { + IUnknown *pInterface; + PVOID pStorage; + DWORD flags; +} CLEANLOCALSTORAGE; +typedef struct tagCUSTDATAITEM { + GUID guid; + VARIANTARG varValue; +} CUSTDATAITEM,*LPCUSTDATAITEM; +typedef struct tagCUSTDATA { + DWORD cCustData; + LPCUSTDATAITEM prgCustData; +} CUSTDATA,*LPCUSTDATA; + +typedef enum tagDESCKIND { + DESCKIND_NONE=0,DESCKIND_FUNCDESC=DESCKIND_NONE+1, + DESCKIND_VARDESC=DESCKIND_FUNCDESC+1,DESCKIND_TYPECOMP=DESCKIND_VARDESC+1, + DESCKIND_IMPLICITAPPOBJ=DESCKIND_TYPECOMP+1, + DESCKIND_MAX=DESCKIND_IMPLICITAPPOBJ+1 +} DESCKIND; + +typedef union tagBINDPTR { + LPFUNCDESC lpfuncdesc; + LPVARDESC lpvardesc; + LPTYPECOMP lptcomp; +} BINDPTR,*LPBINDPTR; + +#undef INTERFACE +#define INTERFACE IDispatch +DECLARE_INTERFACE_(IDispatch,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetTypeInfoCount)(THIS_ UINT*) PURE; + STDMETHOD(GetTypeInfo)(THIS_ UINT,LCID,LPTYPEINFO*) PURE; + STDMETHOD(GetIDsOfNames)(THIS_ REFIID,LPOLESTR*,UINT,LCID,DISPID*) PURE; + STDMETHOD(Invoke)(THIS_ DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*) PURE; +}; + +#undef INTERFACE +#define INTERFACE IEnumVARIANT +DECLARE_INTERFACE_(IEnumVARIANT,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Next)(THIS_ ULONG,VARIANT*,ULONG*) PURE; + STDMETHOD(Skip)(THIS_ ULONG) PURE; + STDMETHOD(Reset)(THIS) PURE; + STDMETHOD(Clone)(THIS_ IEnumVARIANT**) PURE; +}; + +#undef INTERFACE +#define INTERFACE ITypeComp +DECLARE_INTERFACE_(ITypeComp,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Bind)(THIS_ LPOLESTR,ULONG,WORD,LPTYPEINFO*,DESCKIND*,LPBINDPTR) PURE; + STDMETHOD(BindType)(THIS_ LPOLESTR,ULONG,LPTYPEINFO*,LPTYPECOMP*) PURE; +}; + +#undef INTERFACE +#define INTERFACE ITypeInfo +DECLARE_INTERFACE_(ITypeInfo,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetTypeAttr)(THIS_ LPTYPEATTR*) PURE; + STDMETHOD(GetTypeComp)(THIS_ LPTYPECOMP*) PURE; + STDMETHOD(GetFuncDesc)(THIS_ UINT,LPFUNCDESC*) PURE; + STDMETHOD(GetVarDesc)(THIS_ UINT,LPVARDESC*) PURE; + STDMETHOD(GetNames)(THIS_ MEMBERID,BSTR*,UINT,UINT*) PURE; + STDMETHOD(GetRefTypeOfImplType)(THIS_ UINT,HREFTYPE*) PURE; + STDMETHOD(GetImplTypeFlags)(THIS_ UINT,INT*) PURE; + STDMETHOD(GetIDsOfNames)(THIS_ LPOLESTR*,UINT,MEMBERID*) PURE; + STDMETHOD(Invoke)(THIS_ PVOID,MEMBERID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*) PURE; + STDMETHOD(GetDocumentation)(THIS_ MEMBERID,BSTR*,BSTR*,DWORD*,BSTR*) PURE; + STDMETHOD(GetDllEntry)(THIS_ MEMBERID,INVOKEKIND,BSTR*,BSTR*,WORD*) PURE; + STDMETHOD(GetRefTypeInfo)(THIS_ HREFTYPE,LPTYPEINFO*) PURE; + STDMETHOD(AddressOfMember)(THIS_ MEMBERID,INVOKEKIND,PVOID*) PURE; + STDMETHOD(CreateInstance)(THIS_ LPUNKNOWN,REFIID,PVOID*) PURE; + STDMETHOD(GetMops)(THIS_ MEMBERID,BSTR*) PURE; + STDMETHOD(GetContainingTypeLib)(THIS_ LPTYPELIB*,UINT*) PURE; + STDMETHOD_(void,ReleaseTypeAttr)(THIS_ LPTYPEATTR) PURE; + STDMETHOD_(void,ReleaseFuncDesc)(THIS_ LPFUNCDESC) PURE; + STDMETHOD_(void,ReleaseVarDesc)(THIS_ LPVARDESC) PURE; +}; + +#undef INTERFACE +#define INTERFACE ITypeInfo2 +DECLARE_INTERFACE_(ITypeInfo2,ITypeInfo) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetTypeAttr)(THIS_ LPTYPEATTR*) PURE; + STDMETHOD(GetTypeComp)(THIS_ LPTYPECOMP*) PURE; + STDMETHOD(GetFuncDesc)(THIS_ UINT,LPFUNCDESC*) PURE; + STDMETHOD(GetVarDesc)(THIS_ UINT,LPVARDESC*) PURE; + STDMETHOD(GetNames)(THIS_ MEMBERID,BSTR*,UINT,UINT*) PURE; + STDMETHOD(GetRefTypeOfImplType)(THIS_ UINT,HREFTYPE*) PURE; + STDMETHOD(GetImplTypeFlags)(THIS_ UINT,INT*) PURE; + STDMETHOD(GetIDsOfNames)(THIS_ LPOLESTR*,UINT,MEMBERID*) PURE; + STDMETHOD(Invoke)(THIS_ PVOID,MEMBERID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*) PURE; + STDMETHOD(GetDocumentation)(THIS_ MEMBERID,BSTR*,BSTR*,DWORD*,BSTR*) PURE; + STDMETHOD(GetDllEntry)(THIS_ MEMBERID,INVOKEKIND,BSTR*,BSTR*,WORD*) PURE; + STDMETHOD(GetRefTypeInfo)(THIS_ HREFTYPE,LPTYPEINFO*) PURE; + STDMETHOD(AddressOfMember)(THIS_ MEMBERID,INVOKEKIND,PVOID*) PURE; + STDMETHOD(CreateInstance)(THIS_ LPUNKNOWN,REFIID,PVOID*) PURE; + STDMETHOD(GetMops)(THIS_ MEMBERID,BSTR*) PURE; + STDMETHOD(GetContainingTypeLib)(THIS_ LPTYPELIB*,UINT*) PURE; + STDMETHOD_(void,ReleaseTypeAttr)(THIS_ LPTYPEATTR) PURE; + STDMETHOD_(void,ReleaseFuncDesc)(THIS_ LPFUNCDESC) PURE; + STDMETHOD_(void,ReleaseVarDesc)(THIS_ LPVARDESC) PURE; + STDMETHOD(GetTypeKind)(THIS_ TYPEKIND*) PURE; + STDMETHOD(GetTypeFlags)(THIS_ ULONG*) PURE; + STDMETHOD(GetFuncIndexOfMemId)(THIS_ MEMBERID,INVOKEKIND,UINT*) PURE; + STDMETHOD(GetVarIndexOfMemId)(THIS_ MEMBERID,UINT*) PURE; + STDMETHOD(GetCustData)(THIS_ REFGUID,VARIANT*) PURE; + STDMETHOD(GetFuncCustData)(THIS_ UINT,REFGUID,VARIANT*) PURE; + STDMETHOD(GetParamCustData)(THIS_ UINT,UINT,REFGUID,VARIANT*) PURE; + STDMETHOD(GetVarCustData)(THIS_ UINT,REFGUID,VARIANT*) PURE; + STDMETHOD(GetImplTypeCustData)(THIS_ UINT,REFGUID,VARIANT*) PURE; + STDMETHOD(GetDocumentation2)(THIS_ MEMBERID,LCID,BSTR*,DWORD*,BSTR*) PURE; + STDMETHOD(GetAllCustData)(THIS_ CUSTDATA*) PURE; + STDMETHOD(GetAllFuncCustData)(THIS_ UINT,CUSTDATA*) PURE; + STDMETHOD(GetAllParamCustData)(THIS_ UINT,UINT,CUSTDATA*) PURE; + STDMETHOD(GetAllVarCustData)(THIS_ UINT,CUSTDATA*) PURE; + STDMETHOD(GetAllImplTypeCustData)(THIS_ UINT,CUSTDATA*) PURE; +}; + +#undef INTERFACE +#define INTERFACE ITypeLib +DECLARE_INTERFACE_(ITypeLib,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD_(UINT,GetTypeInfoCount)(THIS) PURE; + STDMETHOD(GetTypeInfo)(THIS_ UINT,ITypeInfo**) PURE; + STDMETHOD(GetTypeInfoType)(THIS_ UINT,TYPEKIND*) PURE; + STDMETHOD(GetTypeInfoOfGuid)(THIS_ REFGUID,ITypeInfo**) PURE; + STDMETHOD(GetLibAttr)(THIS_ TLIBATTR**) PURE; + STDMETHOD(GetTypeComp)(THIS_ ITypeComp*) PURE; + STDMETHOD(GetDocumentation)(THIS_ INT,BSTR*,BSTR*,DWORD*,BSTR*) PURE; + STDMETHOD(IsName)(THIS_ LPOLESTR,ULONG,BOOL*) PURE; + STDMETHOD(FindName)(THIS_ LPOLESTR,ULONG,ITypeInfo**,MEMBERID*,USHORT*) PURE; + STDMETHOD_(void,ReleaseTLibAttr)(THIS_ TLIBATTR*) PURE; +}; + +#undef INTERFACE +#define INTERFACE ITypeLib2 +DECLARE_INTERFACE_(ITypeLib2,ITypeLib) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD_(UINT,GetTypeInfoCount)(THIS) PURE; + STDMETHOD(GetTypeInfo)(THIS_ UINT,ITypeInfo**) PURE; + STDMETHOD(GetTypeInfoType)(THIS_ UINT,TYPEKIND*) PURE; + STDMETHOD(GetTypeInfoOfGuid)(THIS_ REFGUID,ITypeInfo**) PURE; + STDMETHOD(GetLibAttr)(THIS_ TLIBATTR**) PURE; + STDMETHOD(GetTypeComp)(THIS_ ITypeComp*) PURE; + STDMETHOD(GetDocumentation)(THIS_ INT,BSTR*,BSTR*,DWORD*,BSTR*) PURE; + STDMETHOD(IsName)(THIS_ LPOLESTR,ULONG,BOOL*) PURE; + STDMETHOD(FindName)(THIS_ LPOLESTR,ULONG,ITypeInfo**,MEMBERID*,USHORT*) PURE; + STDMETHOD_(void,ReleaseTLibAttr)(THIS_ TLIBATTR*) PURE; + STDMETHOD(GetCustData)(THIS_ REFGUID,VARIANT*) PURE; + STDMETHOD(GetLibStatistics)(THIS_ ULONG*,ULONG*) PURE; + STDMETHOD(GetDocumentation2)(THIS_ INT,LCID,BSTR*,DWORD*,BSTR*) PURE; + STDMETHOD(GetAllCustData)(THIS_ CUSTDATA*) PURE; +}; + +EXTERN_C const IID IID_IErrorInfo; +#undef INTERFACE +#define INTERFACE IErrorInfo +DECLARE_INTERFACE_(IErrorInfo, IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetGUID)(THIS_ GUID*) PURE; + STDMETHOD(GetSource)(THIS_ BSTR*) PURE; + STDMETHOD(GetDescription)(THIS_ BSTR*) PURE; + STDMETHOD(GetHelpFile)(THIS_ BSTR*) PURE; + STDMETHOD(GetHelpContext)(THIS_ DWORD*) PURE; +}; + +#ifdef COBJMACROS +#define IErrorInfo_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IErrorInfo_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IErrorInfo_Release(T) (T)->lpVtbl->Release(T) +#define IErrorInfo_GetGUID(T,a) (T)->lpVtbl->GetGUID(T,a) +#define IErrorInfo_GetSource(T,a) (T)->lpVtbl->GetSource(T,a) +#define IErrorInfo_GetDescription(T,a) (T)->lpVtbl->GetDescription(T,a) +#define IErrorInfo_GetHelpFile(T,a) (T)->lpVtbl->GetHelpFile(T,a) +#define IErrorInfo_GetHelpContext(T,a) (T)->lpVtbl->GetHelpContext(T,a) +#endif + +EXTERN_C const IID IID_ICreateErrorInfo; +#undef INTERFACE +#define INTERFACE ICreateErrorInfo +DECLARE_INTERFACE_(ICreateErrorInfo, IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*)PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(SetGUID)(THIS_ REFGUID) PURE; + STDMETHOD(SetSource)(THIS_ LPOLESTR) PURE; + STDMETHOD(SetDescription)(THIS_ LPOLESTR) PURE; + STDMETHOD(SetHelpFile)(THIS_ LPOLESTR) PURE; + STDMETHOD(SetHelpContext)(THIS_ DWORD) PURE; +}; + +EXTERN_C const IID IID_ISupportErrorInfo; +#undef INTERFACE +#define INTERFACE ISupportErrorInfo +DECLARE_INTERFACE_(ISupportErrorInfo, IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(InterfaceSupportsErrorInfo)(THIS_ REFIID) PURE; +}; + +EXTERN_C const IID IID_IRecordInfo; +#undef INTERFACE +#define INTERFACE IRecordInfo +DECLARE_INTERFACE_(IRecordInfo, IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(RecordInit)(THIS_ PVOID) PURE; + STDMETHOD(RecordClear)(THIS_ PVOID) PURE; + STDMETHOD(RecordCopy)(THIS_ PVOID, PVOID) PURE; + STDMETHOD(GetGuid)(THIS_ GUID*) PURE; + STDMETHOD(GetName)(THIS_ BSTR*) PURE; + STDMETHOD(GetSize)(THIS_ ULONG*) PURE; + STDMETHOD(GetTypeInfo)(THIS_ ITypeInfo**) PURE; + STDMETHOD(GetField)(THIS_ PVOID,LPCOLESTR,VARIANT*) PURE; + STDMETHOD(GetFieldNoCopy)(THIS_ PVOID,LPCOLESTR,VARIANT*,PVOID*) PURE; + STDMETHOD(PutField )(THIS_ ULONG,PVOID,LPCOLESTR, VARIANT*) PURE; + STDMETHOD(PutFieldNoCopy)(THIS_ ULONG,PVOID,LPCOLESTR,VARIANT*) PURE; + STDMETHOD(GetFieldNames)(THIS_ ULONG*,BSTR*) PURE; + STDMETHOD_(BOOL,IsMatchingType)(THIS_ THIS) PURE; + STDMETHOD_(PVOID,RecordCreate)(THIS) PURE; + STDMETHOD(RecordCreateCopy)(THIS_ PVOID,PVOID*) PURE; + STDMETHOD(RecordDestroy )(THIS_ PVOID) PURE; +}; + +EXTERN_C const IID IID_ITypeMarshal; +#undef INTERFACE +#define INTERFACE ITypeMarshal +DECLARE_INTERFACE_(ITypeMarshal, IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Size)(THIS_ PVOID,DWORD,PVOID,ULONG*) PURE; + STDMETHOD(Marshal)(THIS_ PVOID,DWORD,PVOID,ULONG,BYTE*,ULONG*) PURE; + STDMETHOD(Unmarshal)(THIS_ PVOID,DWORD,ULONG,BYTE*,ULONG*) PURE; + STDMETHOD(Free)(THIS_ PVOID) PURE; +}; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/objbase.h b/reactos/w32api/include/objbase.h new file mode 100644 index 00000000000..144d52dae2b --- /dev/null +++ b/reactos/w32api/include/objbase.h @@ -0,0 +1,188 @@ +/* Include here to prevent circular dependencies if windows.h + not already included */ +#include <rpc.h> +#include <rpcndr.h> + +#ifndef _OBJBASE_H +#define _OBJBASE_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#include <stdlib.h> +#pragma pack(push,8) +#include <basetyps.h> + +#define WINOLEAPI STDAPI +#define WINOLEAPI_(type) STDAPI_(type) +#define FARSTRUCT +#define HUGEP +#define LISet32(li,v) ((li).HighPart=(v)<0?-1:0,(li).LowPart=(v)) +#define ULISet32(li,v) ((li).HighPart=0,(li).LowPart=(v)) +#define CLSCTX_ALL (CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER|CLSCTX_LOCAL_SERVER) +#define CLSCTX_INPROC (CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER) +#define CLSCTX_SERVER (CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER|CLSCTX_REMOTE_SERVER) +#define MARSHALINTERFACE_MIN 500 +#define CWCSTORAGENAME 32 +#define STGM_DIRECT 0 +#define STGM_TRANSACTED 0x10000L +#define STGM_SIMPLE 0x8000000L +#define STGM_READ 0 +#define STGM_WRITE 1 +#define STGM_READWRITE 2 +#define STGM_SHARE_DENY_NONE 0x40 +#define STGM_SHARE_DENY_READ 0x30 +#define STGM_SHARE_DENY_WRITE 0x20 +#define STGM_SHARE_EXCLUSIVE 0x10 +#define STGM_PRIORITY 0x40000L +#define STGM_DELETEONRELEASE 0x4000000 +#define STGM_NOSCRATCH 0x100000 +#define STGM_CREATE 0x1000 +#define STGM_CONVERT 0x20000 +#define STGM_NOSNAPSHOT 0x200000 +#define STGM_FAILIFTHERE 0 +#define CWCSTORAGENAME 32 +#define ASYNC_MODE_COMPATIBILITY 1 +#define ASYNC_MODE_DEFAULT 0 +#define STGTY_REPEAT 256 +#define STG_TOEND 0xFFFFFFFF +#define STG_LAYOUT_SEQUENTIAL 0 +#define STG_LAYOUT_INTERLEAVED 1 +#define COM_RIGHTS_EXECUTE 1 +#define COM_RIGHTS_SAFE_FOR_SCRIPTING 2 +typedef enum tagREGCLS { + REGCLS_SINGLEUSE = 0, + REGCLS_MULTIPLEUSE = 1, + REGCLS_MULTI_SEPARATE = 2 +} REGCLS; +#include <wtypes.h> +#include <unknwn.h> +#include <objidl.h> + +#ifdef __cplusplus +inline BOOL IsEqualGUID(REFGUID rguid1, REFGUID rguid2) + { return !memcmp(&rguid1, &rguid2, sizeof(GUID)); } +inline BOOL operator==(const GUID& guidOne, const GUID& guidOther) + { return !memcmp(&guidOne,&guidOther,sizeof(GUID)); } +inline BOOL operator!=(const GUID& g1, const GUID& g2) + { return !(g1 == g2); } +#else +#define IsEqualGUID(rguid1, rguid2) (!memcmp(rguid1, rguid2, sizeof(GUID))) +#endif +#define IsEqualIID(id1,id2) IsEqualGUID(id1,id2) +#define IsEqualCLSID(id1,id2) IsEqualGUID(id1,id2) +#include <cguid.h> + +typedef enum tagCOINIT { + COINIT_APARTMENTTHREADED = 0x2, + COINIT_MULTITHREADED = 0x0, + COINIT_DISABLE_OLE1DDE = 0x4, + COINIT_SPEED_OVER_MEMORY = 0x8 +} COINIT; +typedef enum tagSTDMSHLFLAGS { + SMEXF_SERVER = 0x01, + SMEXF_HANDLER = 0x02 +} STDMSHLFLAGS; + +WINOLEAPI_(DWORD) CoBuildVersion(void); +WINOLEAPI CoInitialize(PVOID); +WINOLEAPI CoInitializeEx(LPVOID,DWORD); +WINOLEAPI_(void) CoUninitialize(void); +WINOLEAPI CoGetMalloc(DWORD,LPMALLOC*); +WINOLEAPI_(DWORD) CoGetCurrentProcess(void); +WINOLEAPI CoRegisterMallocSpy(LPMALLOCSPY); +WINOLEAPI CoRevokeMallocSpy(void); +WINOLEAPI CoCreateStandardMalloc(DWORD,IMalloc**); +#ifdef DBG +WINOLEAPI_(ULONG) DebugCoGetRpcFault(void); +WINOLEAPI_(void) DebugCoSetRpcFault(ULONG); +#endif +WINOLEAPI CoGetClassObject(REFCLSID,DWORD,COSERVERINFO*,REFIID,PVOID*); +WINOLEAPI CoRegisterClassObject(REFCLSID,LPUNKNOWN,DWORD,DWORD,PDWORD); +WINOLEAPI CoRevokeClassObject(DWORD); +WINOLEAPI CoGetMarshalSizeMax(ULONG*,REFIID,LPUNKNOWN,DWORD,PVOID,DWORD); +WINOLEAPI CoMarshalInterface(LPSTREAM,REFIID,LPUNKNOWN,DWORD,PVOID,DWORD); +WINOLEAPI CoUnmarshalInterface(LPSTREAM,REFIID,PVOID*); +WINOLEAPI CoMarshalHresult(LPSTREAM,HRESULT); +WINOLEAPI CoUnmarshalHresult(LPSTREAM,HRESULT*); +WINOLEAPI CoReleaseMarshalData(LPSTREAM); +WINOLEAPI CoDisconnectObject(LPUNKNOWN,DWORD); +WINOLEAPI CoLockObjectExternal(LPUNKNOWN,BOOL,BOOL); +WINOLEAPI CoGetStandardMarshal(REFIID,LPUNKNOWN,DWORD,PVOID,DWORD,LPMARSHAL*); +WINOLEAPI CoGetStdMarshalEx(LPUNKNOWN,DWORD,LPUNKNOWN*); +WINOLEAPI_(BOOL) CoIsHandlerConnected(LPUNKNOWN); +WINOLEAPI_(BOOL) CoHasStrongExternalConnections(LPUNKNOWN); +WINOLEAPI CoMarshalInterThreadInterfaceInStream(REFIID,LPUNKNOWN,LPSTREAM*); +WINOLEAPI CoGetInterfaceAndReleaseStream(LPSTREAM,REFIID,PVOID*); +WINOLEAPI CoCreateFreeThreadedMarshaler(LPUNKNOWN,LPUNKNOWN*); +WINOLEAPI_(HINSTANCE) CoLoadLibrary(LPOLESTR,BOOL); +WINOLEAPI_(void) CoFreeLibrary(HINSTANCE); +WINOLEAPI_(void) CoFreeAllLibraries(void); +WINOLEAPI_(void) CoFreeUnusedLibraries(void); +WINOLEAPI CoCreateInstance(REFCLSID,LPUNKNOWN,DWORD,REFIID,PVOID*); +WINOLEAPI CoCreateInstanceEx(REFCLSID,IUnknown*,DWORD,COSERVERINFO*,DWORD,MULTI_QI*); +WINOLEAPI StringFromCLSID(REFCLSID,LPOLESTR*); +WINOLEAPI CLSIDFromString(LPOLESTR,LPCLSID); +WINOLEAPI StringFromIID(REFIID,LPOLESTR*); +WINOLEAPI IIDFromString(LPOLESTR,LPIID); +WINOLEAPI_(BOOL) CoIsOle1Class(REFCLSID); +WINOLEAPI ProgIDFromCLSID(REFCLSID,LPOLESTR*); +WINOLEAPI CLSIDFromProgID(LPCOLESTR,LPCLSID); +WINOLEAPI_(int) StringFromGUID2(REFGUID,LPOLESTR,int); +WINOLEAPI CoCreateGuid(GUID*); +WINOLEAPI_(BOOL) CoFileTimeToDosDateTime(FILETIME*,LPWORD,LPWORD); +WINOLEAPI_(BOOL) CoDosDateTimeToFileTime(WORD,WORD,FILETIME*); +WINOLEAPI CoFileTimeNow(FILETIME*); +WINOLEAPI CoRegisterMessageFilter(LPMESSAGEFILTER,LPMESSAGEFILTER*); +WINOLEAPI CoGetTreatAsClass(REFCLSID,LPCLSID); +WINOLEAPI CoTreatAsClass(REFCLSID,REFCLSID); +typedef HRESULT (STDAPICALLTYPE *LPFNGETCLASSOBJECT)(REFCLSID,REFIID,PVOID*); +typedef HRESULT (STDAPICALLTYPE *LPFNCANUNLOADNOW)(void); +STDAPI DllGetClassObject(REFCLSID,REFIID,PVOID*); +STDAPI DllCanUnloadNow(void); +WINOLEAPI_(PVOID) CoTaskMemAlloc(ULONG); +WINOLEAPI_(PVOID) CoTaskMemRealloc(PVOID,ULONG); +WINOLEAPI_(void) CoTaskMemFree(PVOID); +WINOLEAPI CreateDataAdviseHolder(LPDATAADVISEHOLDER*); +WINOLEAPI CreateDataCache(LPUNKNOWN,REFCLSID,REFIID,PVOID*); +WINOLEAPI StgCreateDocfile(const OLECHAR*,DWORD,DWORD,IStorage**); +WINOLEAPI StgCreateDocfileOnILockBytes(ILockBytes*,DWORD,DWORD,IStorage**); +WINOLEAPI StgOpenStorage(const OLECHAR*,IStorage*,DWORD,SNB,DWORD,IStorage**); +WINOLEAPI StgOpenStorageOnILockBytes(ILockBytes*,IStorage*,DWORD,SNB,DWORD,IStorage**); +WINOLEAPI StgIsStorageFile(const OLECHAR*); +WINOLEAPI StgIsStorageILockBytes(ILockBytes*); +WINOLEAPI StgSetTimes(OLECHAR const*,FILETIME const*,FILETIME const*,FILETIME const*); +WINOLEAPI BindMoniker(LPMONIKER,DWORD,REFIID,PVOID*); +WINOLEAPI CoGetObject(LPCWSTR,BIND_OPTS*,REFIID,void**); +WINOLEAPI MkParseDisplayName(LPBC,LPCOLESTR,ULONG*,LPMONIKER*); +WINOLEAPI MonikerRelativePathTo(LPMONIKER,LPMONIKER,LPMONIKER*,BOOL); +WINOLEAPI MonikerCommonPrefixWith(LPMONIKER,LPMONIKER,LPMONIKER*); +WINOLEAPI CreateBindCtx(DWORD,LPBC*); +WINOLEAPI CreateGenericComposite(LPMONIKER,LPMONIKER,LPMONIKER*); +WINOLEAPI GetClassFile (LPCOLESTR,CLSID*); +WINOLEAPI CreateFileMoniker(LPCOLESTR,LPMONIKER*); +WINOLEAPI CreateItemMoniker(LPCOLESTR,LPCOLESTR,LPMONIKER*); +WINOLEAPI CreateAntiMoniker(LPMONIKER*); +WINOLEAPI CreatePointerMoniker(LPUNKNOWN,LPMONIKER*); +WINOLEAPI GetRunningObjectTable(DWORD,LPRUNNINGOBJECTTABLE*); +WINOLEAPI CoInitializeSecurity(PSECURITY_DESCRIPTOR,LONG,SOLE_AUTHENTICATION_SERVICE*, void*,DWORD,DWORD,void*,DWORD,void*); +WINOLEAPI CoGetCallContext(REFIID,void**); +WINOLEAPI CoQueryProxyBlanket(IUnknown*, DWORD*,DWORD*,OLECHAR**,DWORD*,DWORD*,RPC_AUTH_IDENTITY_HANDLE*,DWORD*); +WINOLEAPI CoSetProxyBlanket(IUnknown*,DWORD,DWORD,OLECHAR*,DWORD,DWORD,RPC_AUTH_IDENTITY_HANDLE, DWORD); +WINOLEAPI CoCopyProxy(IUnknown*,IUnknown**); +WINOLEAPI CoQueryClientBlanket(DWORD*,DWORD*,OLECHAR**, DWORD*,DWORD*,RPC_AUTHZ_HANDLE*,DWORD*); +WINOLEAPI CoImpersonateClient(void); +WINOLEAPI CoRevertToSelf(void); +WINOLEAPI CoQueryAuthenticationServices(DWORD*, SOLE_AUTHENTICATION_SERVICE**); +WINOLEAPI CoSwitchCallContext(IUnknown*,IUnknown**); +WINOLEAPI CoGetInstanceFromFile(COSERVERINFO*, CLSID*,IUnknown*,DWORD,DWORD,OLECHAR*,DWORD,MULTI_QI*); +WINOLEAPI CoGetInstanceFromIStorage(COSERVERINFO*,CLSID*, IUnknown*,DWORD,struct IStorage*, DWORD,MULTI_QI*); +WINOLEAPI_(ULONG) CoAddRefServerProcess(void); +WINOLEAPI_(ULONG) CoReleaseServerProcess(void); +WINOLEAPI CoResumeClassObjects(void); +WINOLEAPI CoSuspendClassObjects(void); +WINOLEAPI CoGetPSClsid(REFIID,CLSID*); +WINOLEAPI CoRegisterPSClsid(REFIID,REFCLSID); + +#pragma pack(pop) +#endif diff --git a/reactos/w32api/include/objfwd.h b/reactos/w32api/include/objfwd.h new file mode 100644 index 00000000000..8fede73aa89 --- /dev/null +++ b/reactos/w32api/include/objfwd.h @@ -0,0 +1,57 @@ +#ifndef _OBJFWD_H +#define _OBJFWD_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#include <basetyps.h> + +#ifdef __cplusplus +extern "C" { +#endif +typedef interface IMoniker *LPMONIKER; +typedef interface IStream *LPSTREAM; +typedef interface IMarshal *LPMARSHAL; +typedef interface IMalloc *LPMALLOC; +typedef interface IMallocSpy *LPMALLOCSPY; +typedef interface IMessageFilter *LPMESSAGEFILTER; +typedef interface IPersist *LPPERSIST; +typedef interface IPersistStream *LPPERSISTSTREAM; +typedef interface IRunningObjectTable *LPRUNNINGOBJECTTABLE; +typedef interface IBindCtx *LPBINDCTX,*LPBC; +typedef interface IAdviseSink *LPADVISESINK; +typedef interface IAdviseSink2 *LPADVISESINK2; +typedef interface IDataObject *LPDATAOBJECT; +typedef interface IDataAdviseHolder *LPDATAADVISEHOLDER; +typedef interface IEnumMoniker *LPENUMMONIKER; +typedef interface IEnumFORMATETC *LPENUMFORMATETC; +typedef interface IEnumSTATDATA *LPENUMSTATDATA; +typedef interface IEnumSTATSTG *LPENUMSTATSTG; +typedef interface IEnumSTATPROPSTG LPENUMSTATPROPSTG; +typedef interface IEnumString *LPENUMSTRING; +typedef interface IEnumUnknown *LPENUMUNKNOWN; +typedef interface IStorage *LPSTORAGE; +typedef interface IPersistStorage *LPPERSISTSTORAGE; +typedef interface ILockBytes *LPLOCKBYTES; +typedef interface IStdMarshalInfo *LPSTDMARSHALINFO; +typedef interface IExternalConnection *LPEXTERNALCONNECTION; +typedef interface IRunnableObject *LPRUNNABLEOBJECT; +typedef interface IROTData *LPROTDATA; +typedef interface IPersistFile *LPPERSISTFILE; +typedef interface IRootStorage *LPROOTSTORAGE; +typedef interface IRpcChannelBuffer *LPRPCCHANNELBUFFER; +typedef interface IRpcProxyBuffer *LPRPCPROXYBUFFER; +typedef interface IRpcStubBuffer *LPRPCSTUBBUFFER; +typedef interface IPropertyStorage *LPPROPERTYSTORAGE; +typedef interface IEnumSTATPROPSETSTG *LPENUMSTATPROPSETSTG; +typedef interface IPropertySetStorage *LPPROPERTYSETSTORAGE; +typedef interface IClientSecurity *LPCLIENTSECURITY; +typedef interface IServerSecurity *LPSERVERSECURITY; +typedef interface IClassActivator *LPCLASSACTIVATOR; +typedef interface IFillLockBytes *LPFILLLOCKBYTES; +typedef interface IProgressNotify *LPPROGRESSNOTIFY; +typedef interface ILayoutStorage *LPLAYOUTSTORAGE; +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/objidl.h b/reactos/w32api/include/objidl.h new file mode 100644 index 00000000000..5dd99fdbb8b --- /dev/null +++ b/reactos/w32api/include/objidl.h @@ -0,0 +1,1734 @@ +#ifndef _OBJIDL_H +#define _OBJIDL_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#include <objfwd.h> + +typedef struct tagSTATSTG { + LPOLESTR pwcsName; + DWORD type; + ULARGE_INTEGER cbSize; + FILETIME mtime; + FILETIME ctime; + FILETIME atime; + DWORD grfMode; + DWORD grfLocksSupported; + CLSID clsid; + DWORD grfStateBits; + DWORD reserved; +} STATSTG; +typedef enum tagSTGTY { + STGTY_STORAGE=1, + STGTY_STREAM, + STGTY_LOCKBYTES, + STGTY_PROPERTY +} STGTY; +typedef enum tagSTREAM_SEEK { + STREAM_SEEK_SET, + STREAM_SEEK_CUR, + STREAM_SEEK_END +} STREAM_SEEK; +typedef struct tagINTERFACEINFO { + LPUNKNOWN pUnk; + IID iid; + WORD wMethod; +} INTERFACEINFO,*LPINTERFACEINFO; +typedef enum tagCALLTYPE { + CALLTYPE_TOPLEVEL=1, + CALLTYPE_NESTED, + CALLTYPE_ASYNC, + CALLTYPE_TOPLEVEL_CALLPENDING, + CALLTYPE_ASYNC_CALLPENDING +} CALLTYPE; +typedef enum tagPENDINGTYPE { + PENDINGTYPE_TOPLEVEL=1, + PENDINGTYPE_NESTED +} PENDINGTYPE; +typedef enum tagPENDINGMSG { + PENDINGMSG_CANCELCALL=0, + PENDINGMSG_WAITNOPROCESS, + PENDINGMSG_WAITDEFPROCESS +} PENDINGMSG; +typedef OLECHAR **SNB; +typedef enum tagDATADIR { + DATADIR_GET=1, + DATADIR_SET +} DATADIR; +typedef WORD CLIPFORMAT,*LPCLIPFORMAT; +typedef struct tagDVTARGETDEVICE { + DWORD tdSize; + WORD tdDriverNameOffset; + WORD tdDeviceNameOffset; + WORD tdPortNameOffset; + WORD tdExtDevmodeOffset; + BYTE tdData[1]; +} DVTARGETDEVICE; +typedef struct tagFORMATETC { + CLIPFORMAT cfFormat; + DVTARGETDEVICE*ptd; + DWORD dwAspect; + LONG lindex; + DWORD tymed; +} FORMATETC,*LPFORMATETC; +typedef struct tagRemSTGMEDIUM { + DWORD tymed; + DWORD dwHandleType; + ULONG pData; + unsigned long pUnkForRelease; + unsigned long cbData; + BYTE data[1]; +} RemSTGMEDIUM; +typedef struct tagHLITEM { + ULONG uHLID; + LPWSTR pwzFriendlyName; +} HLITEM; +typedef struct tagSTATDATA { + FORMATETC formatetc; + DWORD grfAdvf; + struct IAdviseSink *pAdvSink; + DWORD dwConnection; +} STATDATA; +typedef struct tagSTATPROPSETSTG { + FMTID fmtid; + CLSID clsid; + DWORD grfFlags; + FILETIME mtime; + FILETIME ctime; + FILETIME atime; +} STATPROPSETSTG; +typedef enum tagEXTCONN { + EXTCONN_STRONG=1, + EXTCONN_WEAK=2, + EXTCONN_CALLABLE=4 +} EXTCONN; +typedef struct tagMULTI_QI { + const IID *pIID; + IUnknown *pItf; + HRESULT hr; +} MULTI_QI; +typedef struct _AUTH_IDENTITY { + USHORT *User; + ULONG UserLength; + USHORT *Domain; + ULONG DomainLength; + USHORT *Password; + ULONG PasswordLength; + ULONG Flags; +} AUTH_IDENTITY; +typedef struct _COAUTHINFO{ + DWORD dwAuthnSvc; + DWORD dwAuthzSvc; + LPWSTR pwszServerPrincName; + DWORD dwAuthnLevel; + DWORD dwImpersonationLevel; + AUTH_IDENTITY *pAuthIdentityData; + DWORD dwCapabilities; +} COAUTHINFO; +typedef struct _COSERVERINFO { + DWORD dwReserved1; + LPWSTR pwszName; + COAUTHINFO *pAuthInfo; + DWORD dwReserved2; +} COSERVERINFO; +typedef struct tagBIND_OPTS { + DWORD cbStruct; + DWORD grfFlags; + DWORD grfMode; + DWORD dwTickCountDeadline; +} BIND_OPTS,*LPBIND_OPTS; +typedef struct tagBIND_OPTS2 { + DWORD cbStruct; + DWORD grfFlags; + DWORD grfMode; + DWORD dwTickCountDeadline; + DWORD dwTrackFlags; + DWORD dwClassContext; + LCID locale; + COSERVERINFO *pServerInfo; +} BIND_OPTS2,*LPBIND_OPTS2; +typedef enum tagBIND_FLAGS { + BIND_MAYBOTHERUSER=1, + BIND_JUSTTESTEXISTENCE +} BIND_FLAGS; +typedef struct tagSTGMEDIUM { + DWORD tymed; + _ANONYMOUS_UNION union { + HBITMAP hBitmap; + PVOID hMetaFilePict; + HENHMETAFILE hEnhMetaFile; + HGLOBAL hGlobal; + LPWSTR lpszFileName; + LPSTREAM pstm; + LPSTORAGE pstg; + } DUMMYUNIONNAME; + LPUNKNOWN pUnkForRelease; +} STGMEDIUM,*LPSTGMEDIUM; +typedef enum tagLOCKTYPE { + LOCK_WRITE=1, + LOCK_EXCLUSIVE=2, + LOCK_ONLYONCE=4 +} LOCKTYPE; +typedef unsigned long RPCOLEDATAREP; +typedef struct tagRPCOLEMESSAGE { + PVOID reserved1; + RPCOLEDATAREP dataRepresentation; + PVOID Buffer; + ULONG cbBuffer; + ULONG iMethod; + PVOID reserved2[5]; + ULONG rpcFlags; +} RPCOLEMESSAGE; +typedef enum tagMKSYS { + MKSYS_NONE, + MKSYS_GENERICCOMPOSITE, + MKSYS_FILEMONIKER, + MKSYS_ANTIMONIKER, + MKSYS_ITEMMONIKER, + MKSYS_POINTERMONIKER +} MKSYS; +typedef enum tagMKREDUCE { + MKRREDUCE_ALL, + MKRREDUCE_ONE=196608, + MKRREDUCE_TOUSER=131072, + MKRREDUCE_THROUGHUSER=65536 +} MKRREDUCE; +typedef struct tagRemSNB { + unsigned long ulCntStr; + unsigned long ulCntChar; + OLECHAR rgString[1]; +} RemSNB; +typedef enum tagADVF { + ADVF_NODATA=1,ADVF_PRIMEFIRST=2,ADVF_ONLYONCE=4,ADVF_DATAONSTOP=64, + ADVFCACHE_NOHANDLER=8,ADVFCACHE_FORCEBUILTIN=16,ADVFCACHE_ONSAVE=32 +} ADVF; +typedef enum tagTYMED { + TYMED_HGLOBAL=1,TYMED_FILE=2,TYMED_ISTREAM=4,TYMED_ISTORAGE=8, + TYMED_GDI=16,TYMED_MFPICT=32,TYMED_ENHMF=64,TYMED_NULL=0 +} TYMED; +typedef enum tagSERVERCALL { + SERVERCALL_ISHANDLED,SERVERCALL_REJECTED,SERVERCALL_RETRYLATER +} SERVERCALL; +typedef struct tagCAUB { + ULONG cElems; + unsigned char *pElems; +}CAUB; +typedef struct tagCAI { + ULONG cElems; + short *pElems; +}CAI; +typedef struct tagCAUI { + ULONG cElems; + USHORT *pElems; +}CAUI; +typedef struct tagCAL { + ULONG cElems; + long *pElems; +}CAL; +typedef struct tagCAUL { + ULONG cElems; + ULONG *pElems; +}CAUL; +typedef struct tagCAFLT { + ULONG cElems; + float *pElems; +}CAFLT; +typedef struct tagCADBL { + ULONG cElems; + double *pElems; +}CADBL; +typedef struct tagCACY { + ULONG cElems; + CY *pElems; +}CACY; +typedef struct tagCADATE { + ULONG cElems; + DATE *pElems; +}CADATE; +typedef struct tagCABSTR { + ULONG cElems; + BSTR *pElems; +}CABSTR; +typedef struct tagCABSTRBLOB { + ULONG cElems; + BSTRBLOB *pElems; +}CABSTRBLOB; +typedef struct tagCABOOL { + ULONG cElems; + VARIANT_BOOL *pElems; +}CABOOL; +typedef struct tagCASCODE { + ULONG cElems; + SCODE *pElems; +}CASCODE; +typedef struct tagCAH { + ULONG cElems; + LARGE_INTEGER *pElems; +}CAH; +typedef struct tagCAUH { + ULONG cElems; + ULARGE_INTEGER *pElems; +}CAUH; +typedef struct tagCALPSTR { + ULONG cElems; + LPSTR *pElems; +}CALPSTR; +typedef struct tagCALPWSTR { + ULONG cElems; + LPWSTR *pElems; +}CALPWSTR; +typedef struct tagCAFILETIME { + ULONG cElems; + FILETIME *pElems; +}CAFILETIME; +typedef struct tagCACLIPDATA { + ULONG cElems; + CLIPDATA *pElems; +}CACLIPDATA; +typedef struct tagCACLSID { + ULONG cElems; + CLSID *pElems; +}CACLSID; +typedef struct tagPROPVARIANT *LPPROPVARIANT; +typedef struct tagCAPROPVARIANT { + ULONG cElems; + LPPROPVARIANT pElems; +}CAPROPVARIANT; +typedef struct tagPROPVARIANT { + VARTYPE vt; + WORD wReserved1; + WORD wReserved2; + WORD wReserved3; + _ANONYMOUS_UNION union { + CHAR cVal; + UCHAR bVal; + short iVal; + USHORT uiVal; + VARIANT_BOOL boolVal; +#if 0 +/* bool is a standard type in C++, and a standard macro expanding + to the _Bool type in C99 (see stdbool.h) */ + _VARIANT_BOOL bool; +#endif + long lVal; + ULONG ulVal; + float fltVal; + SCODE scode; + LARGE_INTEGER hVal; + ULARGE_INTEGER uhVal; + double dblVal; + CY cyVal; + DATE date; + FILETIME filetime; + CLSID *puuid; + BLOB blob; + CLIPDATA *pclipdata; + LPSTREAM pStream; + LPSTORAGE pStorage; + BSTR bstrVal; + BSTRBLOB bstrblobVal; + LPSTR pszVal; + LPWSTR pwszVal; + CAUB caub; + CAI cai; + CAUI caui; + CABOOL cabool; + CAL cal; + CAUL caul; + CAFLT caflt; + CASCODE cascode; + CAH cah; + CAUH cauh; + CADBL cadbl; + CACY cacy; + CADATE cadate; + CAFILETIME cafiletime; + CACLSID cauuid; + CACLIPDATA caclipdata; + CABSTR cabstr; + CABSTRBLOB cabstrblob; + CALPSTR calpstr; + CALPWSTR calpwstr; + CAPROPVARIANT capropvar; + } DUMMYUNIONNAME; +} PROPVARIANT; +typedef struct tagPROPSPEC { + ULONG ulKind; + _ANONYMOUS_UNION union { + PROPID propid; + LPOLESTR lpwstr; + } DUMMYUNIONNAME; +}PROPSPEC; +typedef struct tagSTATPROPSTG { + LPOLESTR lpwstrName; + PROPID propid; + VARTYPE vt; +} STATPROPSTG; +typedef enum PROPSETFLAG { + PROPSETFLAG_DEFAULT,PROPSETFLAG_NONSIMPLE,PROPSETFLAG_ANSI, + PROPSETFLAG_UNBUFFERED=4 +} PROPSETFLAG; +typedef struct tagSTORAGELAYOUT { + DWORD LayoutType; + OLECHAR* pwcsElementName; + LARGE_INTEGER cOffset; + LARGE_INTEGER cBytes; +} STORAGELAYOUT; +typedef struct tagSOLE_AUTHENTICATION_SERVICE { + DWORD dwAuthnSvc; + DWORD dwAuthzSvc; + OLECHAR *pPrincipalName; + HRESULT hr; +} SOLE_AUTHENTICATION_SERVICE; +#define COLE_DEFAULT_PRINCIPAL ( ( OLECHAR* )-1 ) +typedef enum tagEOLE_AUTHENTICATION_CAPABILITIES { + EOAC_NONE = 0, + EOAC_MUTUAL_AUTH = 0x1, + EOAC_STATIC_CLOAKING = 0x20, + EOAC_DYNAMIC_CLOAKING = 0x40, + EOAC_ANY_AUTHORITY = 0x80, + EOAC_MAKE_FULLSIC = 0x100, + EOAC_DEFAULT = 0x800, + EOAC_SECURE_REFS = 0x2, + EOAC_ACCESS_CONTROL = 0x4, + EOAC_APPID = 0x8, + EOAC_DYNAMIC = 0x10, + EOAC_REQUIRE_FULLSIC = 0x200, + EOAC_AUTO_IMPERSONATE = 0x400, + EOAC_NO_CUSTOM_MARSHAL = 0x2000, + EOAC_DISABLE_AAA = 0x1000 +} EOLE_AUTHENTICATION_CAPABILITIES; +typedef struct tagSOLE_AUTHENTICATION_INFO { + DWORD dwAuthnSvc; + DWORD dwAuthzSvc; + void* pAuthInfo; +} SOLE_AUTHENTICATION_INFO; +#define COLE_DEFAULT_AUTHINFO ( ( void* )-1 ) +typedef struct tagSOLE_AUTHENTICATION_LIST { + DWORD cAuthInfo; + SOLE_AUTHENTICATION_INFO* aAuthInfo; +} SOLE_AUTHENTICATION_LIST; + +EXTERN_C const FMTID FMTID_SummaryInformation; +EXTERN_C const FMTID FMTID_DocSummaryInformation; +EXTERN_C const FMTID FMTID_UserDefinedProperties; + +DECLARE_ENUMERATOR(FORMATETC); +DECLARE_ENUMERATOR(HLITEM); +DECLARE_ENUMERATOR(STATDATA); +DECLARE_ENUMERATOR(STATPROPSETSTG); +DECLARE_ENUMERATOR(STATPROPSTG); +DECLARE_ENUMERATOR(STATSTG); +DECLARE_ENUMERATOR_(IEnumString,LPOLESTR); +DECLARE_ENUMERATOR_(IEnumMoniker,interface IMoniker*); +DECLARE_ENUMERATOR_(IEnumUnknown,IUnknown*); + +EXTERN_C const IID IID_ISequentialStream; +#undef INTERFACE +#define INTERFACE ISequentialStream +DECLARE_INTERFACE_(ISequentialStream,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Read)(THIS_ void*,ULONG,ULONG*) PURE; + STDMETHOD(Write)(THIS_ void const*,ULONG,ULONG*) PURE; +}; + +EXTERN_C const IID IID_IStream; +#undef INTERFACE +#define INTERFACE IStream +DECLARE_INTERFACE_(IStream,ISequentialStream) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Read)(THIS_ void*,ULONG,ULONG*) PURE; + STDMETHOD(Write)(THIS_ void const*,ULONG,ULONG*) PURE; + STDMETHOD(Seek)(THIS_ LARGE_INTEGER,DWORD,ULARGE_INTEGER*) PURE; + STDMETHOD(SetSize)(THIS_ ULARGE_INTEGER) PURE; + STDMETHOD(CopyTo)(THIS_ IStream*,ULARGE_INTEGER,ULARGE_INTEGER*,ULARGE_INTEGER*) PURE; + STDMETHOD(Commit)(THIS_ DWORD) PURE; + STDMETHOD(Revert)(THIS) PURE; + STDMETHOD(LockRegion)(THIS_ ULARGE_INTEGER,ULARGE_INTEGER,DWORD) PURE; + STDMETHOD(UnlockRegion)(THIS_ ULARGE_INTEGER,ULARGE_INTEGER,DWORD) PURE; + STDMETHOD(Stat)(THIS_ STATSTG*,DWORD) PURE; + STDMETHOD(Clone)(THIS_ LPSTREAM*) PURE; +}; + +EXTERN_C const IID IID_IMarshal; +#undef INTERFACE +#define INTERFACE IMarshal +DECLARE_INTERFACE_(IMarshal,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetUnmarshalClass) (THIS_ REFIID,PVOID,DWORD,PVOID,DWORD,CLSID*) PURE; + STDMETHOD(GetMarshalSizeMax) (THIS_ REFIID,PVOID,DWORD,PVOID,PDWORD,ULONG*) PURE; + STDMETHOD(MarshalInterface) (THIS_ IStream*,REFIID,PVOID,DWORD,PVOID,DWORD) PURE; + STDMETHOD(UnmarshalInterface) (THIS_ IStream*,REFIID,void**) PURE; + STDMETHOD(ReleaseMarshalData) (THIS_ IStream*) PURE; + STDMETHOD(DisconnectObject) (THIS_ DWORD) PURE; +}; + +EXTERN_C const IID IID_IStdMarshalInfo; +#undef INTERFACE +#define INTERFACE IStdMarshalInfo +DECLARE_INTERFACE_(IStdMarshalInfo,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetClassForHandler)(THIS_ DWORD,PVOID,CLSID*) PURE; +}; + +EXTERN_C const IID IID_IMalloc; +#undef INTERFACE +#define INTERFACE IMalloc +DECLARE_INTERFACE_(IMalloc,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD_(void*,Alloc)(THIS_ ULONG) PURE; + STDMETHOD_(void*,Realloc)(THIS_ void*,ULONG) PURE; + STDMETHOD_(void,Free)(THIS_ void*) PURE; + STDMETHOD_(ULONG,GetSize)(THIS_ void*) PURE; + STDMETHOD_(int,DidAlloc)(THIS_ void*) PURE; + STDMETHOD_(void,HeapMinimize)(THIS) PURE; +}; + +EXTERN_C const IID IID_IMallocSpy; +#undef INTERFACE +#define INTERFACE IMallocSpy +DECLARE_INTERFACE_(IMallocSpy,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD_(ULONG,PreAlloc)(THIS_ ULONG) PURE; + STDMETHOD_(void*,PostAlloc)(THIS_ void*) PURE; + STDMETHOD_(void*,PreFree)(THIS_ void*,BOOL) PURE; + STDMETHOD_(void,PostFree)(THIS_ BOOL) PURE; + STDMETHOD_(ULONG,PreRealloc)(THIS_ void*,ULONG,void**,BOOL) PURE; + STDMETHOD_(void*,PostRealloc)(THIS_ void*,BOOL) PURE; + STDMETHOD_(void*,PreGetSize)(THIS_ void*,BOOL) PURE; + STDMETHOD_(ULONG,PostGetSize)(THIS_ ULONG,BOOL) PURE; + STDMETHOD_(void*,PreDidAlloc)(THIS_ void*,BOOL) PURE; + STDMETHOD_(int,PostDidAlloc)(THIS_ void*,BOOL,int) PURE; + STDMETHOD_(void,PreHeapMinimize)(THIS) PURE; + STDMETHOD_(void,PostHeapMinimize)(THIS) PURE; +}; + +EXTERN_C const IID IID_IMessageFilter; +#undef INTERFACE +#define INTERFACE IMessageFilter +DECLARE_INTERFACE_(IMessageFilter,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD_(DWORD,HandleInComingCall)(THIS_ DWORD,HTASK,DWORD,LPINTERFACEINFO) PURE; + STDMETHOD_(DWORD,RetryRejectedCall)(THIS_ HTASK,DWORD,DWORD) PURE; + STDMETHOD_(DWORD,MessagePending)(THIS_ HTASK,DWORD,DWORD) PURE; +}; + +EXTERN_C const IID IID_IPersist; +#undef INTERFACE +#define INTERFACE IPersist +DECLARE_INTERFACE_(IPersist,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetClassID)(THIS_ CLSID*) PURE; +}; + +EXTERN_C const IID IID_IPersistStream; +#undef INTERFACE +#define INTERFACE IPersistStream +DECLARE_INTERFACE_(IPersistStream,IPersist) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetClassID)(THIS_ LPCLSID) PURE; + STDMETHOD(IsDirty)(THIS) PURE; + STDMETHOD(Load)(THIS_ IStream*) PURE; + STDMETHOD(Save)(THIS_ IStream*,BOOL) PURE; + STDMETHOD(GetSizeMax)(THIS_ PULARGE_INTEGER) PURE; +}; + +EXTERN_C const IID IID_IRunningObjectTable; +#undef INTERFACE +#define INTERFACE IRunningObjectTable +DECLARE_INTERFACE_(IRunningObjectTable,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Register)(THIS_ DWORD,LPUNKNOWN,LPMONIKER,PDWORD) PURE; + STDMETHOD(Revoke)(THIS_ DWORD) PURE; + STDMETHOD(IsRunning)(THIS_ LPMONIKER) PURE; + STDMETHOD(GetObject)(THIS_ LPMONIKER,LPUNKNOWN*) PURE; + STDMETHOD(NoteChangeTime)(THIS_ DWORD,LPFILETIME) PURE; + STDMETHOD(GetTimeOfLastChange)(THIS_ LPMONIKER,LPFILETIME) PURE; + STDMETHOD(EnumRunning)(THIS_ IEnumMoniker**) PURE; +}; + +EXTERN_C const IID IID_IBindCtx; +#undef INTERFACE +#define INTERFACE IBindCtx +DECLARE_INTERFACE_(IBindCtx,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(RegisterObjectBound)(THIS_ LPUNKNOWN) PURE; + STDMETHOD(RevokeObjectBound)(THIS_ LPUNKNOWN) PURE; + STDMETHOD(ReleaseBoundObjects)(THIS) PURE; + STDMETHOD(SetBindOptions)(THIS_ LPBIND_OPTS) PURE; + STDMETHOD(GetBindOptions)(THIS_ LPBIND_OPTS) PURE; + STDMETHOD(GetRunningObjectTable)(THIS_ IRunningObjectTable**) PURE; + STDMETHOD(RegisterObjectParam)(THIS_ LPOLESTR,IUnknown*) PURE; + STDMETHOD(GetObjectParam)(THIS_ LPOLESTR,IUnknown**) PURE; + STDMETHOD(EnumObjectParam)(THIS_ IEnumString**) PURE; + STDMETHOD(RevokeObjectParam)(THIS_ LPOLESTR) PURE; +}; + +EXTERN_C const IID IID_IMoniker; +#undef INTERFACE +#define INTERFACE IMoniker +DECLARE_INTERFACE_(IMoniker,IPersistStream) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetClassID)(THIS_ LPCLSID) PURE; + STDMETHOD(IsDirty)(THIS) PURE; + STDMETHOD(Load)(THIS_ IStream*) PURE; + STDMETHOD(Save)(THIS_ IStream*,BOOL) PURE; + STDMETHOD(GetSizeMax)(THIS_ PULARGE_INTEGER) PURE; + STDMETHOD(BindToObject)(THIS_ IBindCtx*,IMoniker*,REFIID,PVOID*) PURE; + STDMETHOD(BindToStorage)(THIS_ IBindCtx*,IMoniker*,REFIID,PVOID*) PURE; + STDMETHOD(Reduce)(THIS_ IBindCtx*,DWORD,IMoniker**,IMoniker**) PURE; + STDMETHOD(ComposeWith)(THIS_ IMoniker*,BOOL,IMoniker**) PURE; + STDMETHOD(Enum)(THIS_ BOOL,IEnumMoniker**) PURE; + STDMETHOD(IsEqual)(THIS_ IMoniker*) PURE; + STDMETHOD(Hash)(THIS_ PDWORD) PURE; + STDMETHOD(IsRunning)(THIS_ IBindCtx*,IMoniker*,IMoniker*) PURE; + STDMETHOD(GetTimeOfLastChange)(THIS_ IBindCtx*,IMoniker*,LPFILETIME) PURE; + STDMETHOD(Inverse)(THIS_ IMoniker**) PURE; + STDMETHOD(CommonPrefixWith)(THIS_ IMoniker*,IMoniker**) PURE; + STDMETHOD(RelativePathTo)(THIS_ IMoniker*,IMoniker**) PURE; + STDMETHOD(GetDisplayName)(THIS_ IBindCtx*,IMoniker*,LPOLESTR*) PURE; + STDMETHOD(ParseDisplayName)(THIS_ IBindCtx*,IMoniker*,LPOLESTR,ULONG*,IMoniker**) PURE; + STDMETHOD(IsSystemMoniker)(THIS_ PDWORD) PURE; +}; + +EXTERN_C const IID IID_IPersistStorage; +#undef INTERFACE +#define INTERFACE IPersistStorage +DECLARE_INTERFACE_(IPersistStorage,IPersist) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetClassID)(THIS_ CLSID*) PURE; + STDMETHOD(IsDirty)(THIS) PURE; + STDMETHOD(InitNew)(THIS_ LPSTORAGE) PURE; + STDMETHOD(Load)(THIS_ LPSTORAGE) PURE; + STDMETHOD(Save)(THIS_ LPSTORAGE,BOOL) PURE; + STDMETHOD(SaveCompleted)(THIS_ LPSTORAGE) PURE; + STDMETHOD(HandsOffStorage)(THIS) PURE; +}; + +EXTERN_C const IID IID_IPersistFile; +#undef INTERFACE +#define INTERFACE IPersistFile +DECLARE_INTERFACE_(IPersistFile,IPersist) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetClassID)(THIS_ CLSID*) PURE; + STDMETHOD(IsDirty)(THIS) PURE; + STDMETHOD(Load)(THIS_ LPCOLESTR,DWORD) PURE; + STDMETHOD(Save)(THIS_ LPCOLESTR,BOOL) PURE; + STDMETHOD(SaveCompleted)(THIS_ LPCOLESTR) PURE; + STDMETHOD(GetCurFile)(THIS_ LPOLESTR*) PURE; +}; + +EXTERN_C const IID IID_IAdviseSink; +#undef INTERFACE +#define INTERFACE IAdviseSink +DECLARE_INTERFACE_(IAdviseSink,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD_(void,OnDataChange)(THIS_ FORMATETC*,STGMEDIUM*) PURE; + STDMETHOD_(void,OnViewChange)(THIS_ DWORD,LONG) PURE; + STDMETHOD_(void,OnRename)(THIS_ IMoniker*) PURE; + STDMETHOD_(void,OnSave)(THIS) PURE; + STDMETHOD_(void,OnClose)(THIS) PURE; +}; + +EXTERN_C const IID IID_IAdviseSink2; +#undef INTERFACE +#define INTERFACE IAdviseSink2 +DECLARE_INTERFACE_(IAdviseSink2,IAdviseSink) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD_(void,OnDataChange)(THIS_ FORMATETC*,STGMEDIUM*) PURE; + STDMETHOD_(void,OnViewChange)(THIS_ DWORD,LONG) PURE; + STDMETHOD_(void,OnRename)(THIS_ IMoniker*) PURE; + STDMETHOD_(void,OnSave)(THIS) PURE; + STDMETHOD_(void,OnClose)(THIS) PURE; + STDMETHOD_(void,OnLinkSrcChange)(THIS_ IMoniker*); +}; + +EXTERN_C const IID IID_IDataObject; +#undef INTERFACE +#define INTERFACE IDataObject +DECLARE_INTERFACE_(IDataObject,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetData)(THIS_ FORMATETC*,STGMEDIUM*) PURE; + STDMETHOD(GetDataHere)(THIS_ FORMATETC*,STGMEDIUM*) PURE; + STDMETHOD(QueryGetData)(THIS_ FORMATETC*) PURE; + STDMETHOD(GetCanonicalFormatEtc)(THIS_ FORMATETC*,FORMATETC*) PURE; + STDMETHOD(SetData)(THIS_ FORMATETC*,STGMEDIUM*,BOOL) PURE; + STDMETHOD(EnumFormatEtc)(THIS_ DWORD,IEnumFORMATETC**) PURE; + STDMETHOD(DAdvise)(THIS_ FORMATETC*,DWORD,IAdviseSink*,PDWORD) PURE; + STDMETHOD(DUnadvise)(THIS_ DWORD) PURE; + STDMETHOD(EnumDAdvise)(THIS_ IEnumSTATDATA**) PURE; +}; + +EXTERN_C const IID IID_IDataAdviseHolder; +#undef INTERFACE +#define INTERFACE IDataAdviseHolder +DECLARE_INTERFACE_(IDataAdviseHolder,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Advise)(THIS_ IDataObject*,FORMATETC*,DWORD,IAdviseSink*,PDWORD) PURE; + STDMETHOD(Unadvise)(THIS_ DWORD) PURE; + STDMETHOD(EnumAdvise)(THIS_ IEnumSTATDATA**) PURE; + STDMETHOD(SendOnDataChange)(THIS_ IDataObject*,DWORD,DWORD) PURE; +}; + +EXTERN_C const IID IID_IStorage; +#undef INTERFACE +#define INTERFACE IStorage +DECLARE_INTERFACE_(IStorage,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(CreateStream)(THIS_ LPCWSTR,DWORD,DWORD,DWORD,IStream**) PURE; + STDMETHOD(OpenStream)(THIS_ LPCWSTR,PVOID,DWORD,DWORD,IStream**) PURE; + STDMETHOD(CreateStorage)(THIS_ LPCWSTR,DWORD,DWORD,DWORD,IStorage**) PURE; + STDMETHOD(OpenStorage)(THIS_ LPCWSTR,IStorage*,DWORD,SNB,DWORD,IStorage**) PURE; + STDMETHOD(CopyTo)(THIS_ DWORD,IID const*,SNB,IStorage*) PURE; + STDMETHOD(MoveElementTo)(THIS_ LPCWSTR,IStorage*,LPCWSTR,DWORD) PURE; + STDMETHOD(Commit)(THIS_ DWORD) PURE; + STDMETHOD(Revert)(THIS) PURE; + STDMETHOD(EnumElements)(THIS_ DWORD,PVOID,DWORD,IEnumSTATSTG**) PURE; + STDMETHOD(DestroyElement)(THIS_ LPCWSTR) PURE; + STDMETHOD(RenameElement)(THIS_ LPCWSTR,LPCWSTR) PURE; + STDMETHOD(SetElementTimes)(THIS_ LPCWSTR,FILETIME const*,FILETIME const*,FILETIME const*) PURE; + STDMETHOD(SetClass)(THIS_ REFCLSID) PURE; + STDMETHOD(SetStateBits)(THIS_ DWORD,DWORD) PURE; + STDMETHOD(Stat)(THIS_ STATSTG*,DWORD) PURE; +}; + +EXTERN_C const IID IID_IRootStorage; +#undef INTERFACE +#define INTERFACE IRootStorage +DECLARE_INTERFACE_(IRootStorage,IPersist) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(SwitchToFile)(THIS_ LPOLESTR) PURE; +}; + +EXTERN_C const IID IID_IRpcChannelBuffer; +#undef INTERFACE +#define INTERFACE IRpcChannelBuffer +DECLARE_INTERFACE_(IRpcChannelBuffer,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetBuffer)(THIS_ RPCOLEMESSAGE*,REFIID) PURE; + STDMETHOD(SendReceive)(THIS_ RPCOLEMESSAGE*,PULONG) PURE; + STDMETHOD(FreeBuffer)(THIS_ RPCOLEMESSAGE*) PURE; + STDMETHOD(GetDestCtx)(THIS_ PDWORD,PVOID*) PURE; + STDMETHOD(IsConnected)(THIS) PURE; +}; + +EXTERN_C const IID IID_IRpcProxyBuffer; +#undef INTERFACE +#define INTERFACE IRpcProxyBuffer +DECLARE_INTERFACE_(IRpcProxyBuffer,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Connect)(THIS_ IRpcChannelBuffer*) PURE; + STDMETHOD_(void,Disconnect)(THIS) PURE; + +}; + +EXTERN_C const IID IID_IRpcStubBuffer; +#undef INTERFACE +#define INTERFACE IRpcStubBuffer +DECLARE_INTERFACE_(IRpcStubBuffer,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Connect)(THIS_ LPUNKNOWN) PURE; + STDMETHOD_(void,Disconnect)(THIS) PURE; + STDMETHOD(Invoke)(THIS_ RPCOLEMESSAGE*,LPRPCSTUBBUFFER) PURE; + STDMETHOD_(LPRPCSTUBBUFFER,IsIIDSupported)(THIS_ REFIID) PURE; + STDMETHOD_(ULONG,CountRefs)(THIS) PURE; + STDMETHOD(DebugServerQueryInterface)(THIS_ PVOID*) PURE; + STDMETHOD(DebugServerRelease)(THIS_ PVOID) PURE; +}; + +EXTERN_C const IID IID_IPSFactoryBuffer; +#undef INTERFACE +#define INTERFACE IPSFactoryBuffer +DECLARE_INTERFACE_(IPSFactoryBuffer,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(CreateProxy)(THIS_ LPUNKNOWN,REFIID,LPRPCPROXYBUFFER*,PVOID*) PURE; + STDMETHOD(CreateStub)(THIS_ REFIID,LPUNKNOWN,LPRPCSTUBBUFFER*) PURE; +}; +typedef interface IPSFactoryBuffer *LPPSFACTORYBUFFER; + +EXTERN_C const IID IID_ILockBytes; +#undef INTERFACE +#define INTERFACE ILockBytes +DECLARE_INTERFACE_(ILockBytes,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(ReadAt)(THIS_ ULARGE_INTEGER,PVOID,ULONG,ULONG*) PURE; + STDMETHOD(WriteAt)(THIS_ ULARGE_INTEGER,PCVOID,ULONG,ULONG*) PURE; + STDMETHOD(Flush)(THIS) PURE; + STDMETHOD(SetSize)(THIS_ ULARGE_INTEGER) PURE; + STDMETHOD(LockRegion)(THIS_ ULARGE_INTEGER,ULARGE_INTEGER,DWORD) PURE; + STDMETHOD(UnlockRegion)(THIS_ ULARGE_INTEGER,ULARGE_INTEGER,DWORD) PURE; + STDMETHOD(Stat)(THIS_ STATSTG*,DWORD) PURE; +}; + +EXTERN_C const IID IID_IExternalConnection; +#undef INTERFACE +#define INTERFACE IExternalConnection +DECLARE_INTERFACE_(IExternalConnection,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(AddConnection)(THIS_ DWORD,DWORD) PURE; + STDMETHOD(ReleaseConnection)(THIS_ DWORD,DWORD,BOOL) PURE; +}; + +EXTERN_C const IID IID_IRunnableObject; +#undef INTERFACE +#define INTERFACE IRunnableObject +DECLARE_INTERFACE_(IRunnableObject,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetRunningClass)(THIS_ LPCLSID) PURE; + STDMETHOD(Run)(THIS_ LPBC) PURE; + STDMETHOD_(BOOL,IsRunning)(THIS) PURE; + STDMETHOD(LockRunning)(THIS_ BOOL,BOOL) PURE; + STDMETHOD(SetContainedObject)(THIS_ BOOL) PURE; +}; + +EXTERN_C const IID IID_IROTData; +#undef INTERFACE +#define INTERFACE IROTData +DECLARE_INTERFACE_(IROTData,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetComparisonData)(THIS_ PVOID,ULONG,PULONG) PURE; +}; + +EXTERN_C const IID IID_IChannelHook; +#undef INTERFACE +#define INTERFACE IChannelHook +DECLARE_INTERFACE_(IChannelHook,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD_(void,ClientGetSize)(THIS_ REFGUID,REFIID,PULONG) PURE; + STDMETHOD_(void,ClientFillBuffer)(THIS_ REFGUID,REFIID,PULONG,PVOID) PURE; + STDMETHOD_(void,ClientNotify)(THIS_ REFGUID,REFIID,ULONG,PVOID,DWORD,HRESULT) PURE; + STDMETHOD_(void,ServerNotify)(THIS_ REFGUID,REFIID,ULONG,PVOID,DWORD) PURE; + STDMETHOD_(void,ServerGetSize)(THIS_ REFGUID,REFIID,HRESULT,PULONG) PURE; + STDMETHOD_(void,ServerFillBuffer)(THIS_ REFGUID,REFIID,PULONG,PVOID,HRESULT) PURE; +}; + +EXTERN_C const IID IID_IPropertyStorage; +#undef INTERFACE +#define INTERFACE IPropertyStorage +DECLARE_INTERFACE_(IPropertyStorage,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(ReadMultiple)(THIS_ ULONG,PROPSPEC const*,PROPVARIANT*) PURE; + STDMETHOD(WriteMultiple)(THIS_ ULONG,PROPSPEC const*,PROPVARIANT*,PROPID) PURE; + STDMETHOD(DeleteMultiple)(THIS_ ULONG,PROPSPEC const*) PURE; + STDMETHOD(ReadPropertyNames)(THIS_ ULONG,PROPID const*,LPWSTR*) PURE; + STDMETHOD(WritePropertyNames)(THIS_ ULONG,PROPID const*,LPWSTR const*) PURE; + STDMETHOD(DeletePropertyNames)(THIS_ ULONG,PROPID const*) PURE; + STDMETHOD(SetClass)(THIS_ REFCLSID) PURE; + STDMETHOD(Commit)(THIS_ DWORD) PURE; + STDMETHOD(Revert)(THIS) PURE; + STDMETHOD(Enum)(THIS_ IEnumSTATPROPSTG**) PURE; + STDMETHOD(Stat)(THIS_ STATPROPSTG*) PURE; + STDMETHOD(SetTimes)(THIS_ FILETIME const*,FILETIME const*,FILETIME const*) PURE; +}; + +EXTERN_C const IID IID_IPropertySetStorage; +#undef INTERFACE +#define INTERFACE IPropertySetStorage +DECLARE_INTERFACE_(IPropertySetStorage,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Create)(THIS_ REFFMTID,CLSID*,DWORD,DWORD,LPPROPERTYSTORAGE*) PURE; + STDMETHOD(Open)(THIS_ REFFMTID,DWORD,LPPROPERTYSTORAGE*) PURE; + STDMETHOD(Delete)(THIS_ REFFMTID) PURE; + STDMETHOD(Enum)(THIS_ IEnumSTATPROPSETSTG**) PURE; +}; + +EXTERN_C const IID IID_IClientSecurity; +#undef INTERFACE +#define INTERFACE IClientSecurity +DECLARE_INTERFACE_(IClientSecurity,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(QueryBlanket)(THIS_ PVOID,PDWORD,PDWORD,OLECHAR**,PDWORD,PDWORD,RPC_AUTH_IDENTITY_HANDLE**,PDWORD*) PURE; + STDMETHOD(SetBlanket)(THIS_ PVOID,DWORD,DWORD,LPWSTR,DWORD,DWORD,RPC_AUTH_IDENTITY_HANDLE*,DWORD) PURE; + STDMETHOD(CopyProxy)(THIS_ LPUNKNOWN,LPUNKNOWN*) PURE; +}; + +EXTERN_C const IID IID_IServerSecurity; +#undef INTERFACE +#define INTERFACE IServerSecurity +DECLARE_INTERFACE_(IServerSecurity,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(QueryBlanket)(THIS_ PDWORD,PDWORD,OLECHAR**,PDWORD,PDWORD,RPC_AUTHZ_HANDLE*,PDWORD*) PURE; + STDMETHOD(ImpersonateClient)(THIS) PURE; + STDMETHOD(RevertToSelf)(THIS) PURE; + STDMETHOD(IsImpersonating)(THIS) PURE; +}; + +EXTERN_C const IID IID_IClassActivator; +#undef INTERFACE +#define INTERFACE IClassActivator +DECLARE_INTERFACE_(IClassActivator,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetClassObject)(THIS_ REFCLSID,DWORD,LCID,REFIID,PVOID*) PURE; +}; + +EXTERN_C const IID IID_IFillLockBytes; +#undef INTERFACE +#define INTERFACE IFillLockBytes +DECLARE_INTERFACE_(IFillLockBytes,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(FillAppend)(THIS_ void const*,ULONG,PULONG) PURE; + STDMETHOD(FillAt)(THIS_ ULARGE_INTEGER,void const*,ULONG,PULONG) PURE; + STDMETHOD(SetFillSize)(THIS_ ULARGE_INTEGER) PURE; + STDMETHOD(Terminate)(THIS_ BOOL) PURE; +}; + +EXTERN_C const IID IID_IProgressNotify; +#undef INTERFACE +#define INTERFACE IProgressNotify +DECLARE_INTERFACE_(IProgressNotify,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(OnProgress)(THIS_ DWORD,DWORD,BOOL,BOOL) PURE; +}; + +EXTERN_C const IID IID_ILayoutStorage; +#undef INTERFACE +#define INTERFACE ILayoutStorage +DECLARE_INTERFACE_(ILayoutStorage,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(LayoutScript)(THIS_ STORAGELAYOUT*,DWORD,DWORD) PURE; + STDMETHOD(BeginMonitor)(THIS) PURE; + STDMETHOD(EndMonitor)(THIS) PURE; + STDMETHOD(ReLayoutDocfile)(THIS_ OLECHAR*) PURE; +}; + +EXTERN_C const IID IID_IGlobalInterfaceTable; +#undef INTERFACE +#define INTERFACE IGlobalInterfaceTable +DECLARE_INTERFACE_(IGlobalInterfaceTable,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(RegisterInterfaceInGlobal)(THIS_ IUnknown*,REFIID,DWORD*) PURE; + STDMETHOD(RevokeInterfaceFromGlobal)(THIS_ DWORD) PURE; + STDMETHOD(GetInterfaceFromGlobal)(THIS_ DWORD,REFIID,void**) PURE; +}; + +#ifdef COBJMACROS +#define IGlobalInterfaceTable_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IGlobalInterfaceTable_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IGlobalInterfaceTable_Release(T) (T)->lpVtbl->Release(T) +#define IGlobalInterfaceTable_RegisterInterfaceInGlobal(T,a,b,c) (T)->lpVtbl->RegisterInterfaceInGlobal(T,a,b,c) +#define IGlobalInterfaceTable_RevokeInterfaceFromGlobal(T,a) (T)->lpVtbl->RevokeInterfaceFromGlobal(T,a) +#define IGlobalInterfaceTable_GetInterfaceFromGlobal(T,a,b,c) (T)->lpVtbl->GetInterfaceFromGlobal(T,a,b,c) +#endif + +HRESULT STDMETHODCALLTYPE IMarshal_GetUnmarshalClass_Proxy(IMarshal*,REFIID,void*,DWORD,void*,DWORD,CLSID*); +void STDMETHODCALLTYPE IMarshal_GetUnmarshalClass_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IMarshal_GetMarshalSizeMax_Proxy(IMarshal*,REFIID,void*,DWORD,void*,DWORD,DWORD*); +void STDMETHODCALLTYPE IMarshal_GetMarshalSizeMax_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IMarshal_MarshalInterface_Proxy(IMarshal*,IStream*,REFIID,void*,DWORD,void*,DWORD); +void STDMETHODCALLTYPE IMarshal_MarshalInterface_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IMarshal_UnmarshalInterface_Proxy(IMarshal*,IStream*,REFIID,void**); +void STDMETHODCALLTYPE IMarshal_UnmarshalInterface_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IMarshal_ReleaseMarshalData_Proxy(IMarshal*,IStream*); +void STDMETHODCALLTYPE IMarshal_ReleaseMarshalData_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IMarshal_DisconnectObject_Proxy(IMarshal*,DWORD); +void STDMETHODCALLTYPE IMarshal_DisconnectObject_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +void* STDMETHODCALLTYPE IMalloc_Alloc_Proxy(IMalloc*,ULONG); +void STDMETHODCALLTYPE IMalloc_Alloc_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +void* STDMETHODCALLTYPE IMalloc_Realloc_Proxy(IMalloc*,void*,ULONG); +void STDMETHODCALLTYPE IMalloc_Realloc_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +void STDMETHODCALLTYPE IMalloc_Free_Proxy(IMalloc*,void*); +void STDMETHODCALLTYPE IMalloc_Free_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +ULONG STDMETHODCALLTYPE IMalloc_GetSize_Proxy(IMalloc*,void*); +void STDMETHODCALLTYPE IMalloc_GetSize_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +int STDMETHODCALLTYPE IMalloc_DidAlloc_Proxy(IMalloc*,void*); +void STDMETHODCALLTYPE IMalloc_DidAlloc_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +void STDMETHODCALLTYPE IMalloc_HeapMinimize_Proxy(IMalloc*); +void STDMETHODCALLTYPE IMalloc_HeapMinimize_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +ULONG STDMETHODCALLTYPE IMallocSpy_PreAlloc_Proxy(IMallocSpy*,ULONG cbRequest); +void STDMETHODCALLTYPE IMallocSpy_PreAlloc_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +void* STDMETHODCALLTYPE IMallocSpy_PostAlloc_Proxy(IMallocSpy*,void*); +void STDMETHODCALLTYPE IMallocSpy_PostAlloc_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +void* STDMETHODCALLTYPE IMallocSpy_PreFree_Proxy(IMallocSpy*,void*,BOOL); +void STDMETHODCALLTYPE IMallocSpy_PreFree_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +void STDMETHODCALLTYPE IMallocSpy_PostFree_Proxy(IMallocSpy*,BOOL); +void STDMETHODCALLTYPE IMallocSpy_PostFree_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +ULONG STDMETHODCALLTYPE IMallocSpy_PreRealloc_Proxy(IMallocSpy*,void*,ULONG,void**,BOOL); +void STDMETHODCALLTYPE IMallocSpy_PreRealloc_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +void* STDMETHODCALLTYPE IMallocSpy_PostRealloc_Proxy(IMallocSpy*,void*,BOOL); +void STDMETHODCALLTYPE IMallocSpy_PostRealloc_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +void* STDMETHODCALLTYPE IMallocSpy_PreGetSize_Proxy(IMallocSpy*,void*,BOOL); +void STDMETHODCALLTYPE IMallocSpy_PreGetSize_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +ULONG STDMETHODCALLTYPE IMallocSpy_PostGetSize_Proxy(IMallocSpy*,ULONG,BOOL); +void STDMETHODCALLTYPE IMallocSpy_PostGetSize_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +void* STDMETHODCALLTYPE IMallocSpy_PreDidAlloc_Proxy(IMallocSpy*,void*,BOOL); +void STDMETHODCALLTYPE IMallocSpy_PreDidAlloc_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +int STDMETHODCALLTYPE IMallocSpy_PostDidAlloc_Proxy(IMallocSpy*,void*,BOOL,int); +void STDMETHODCALLTYPE IMallocSpy_PostDidAlloc_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +void STDMETHODCALLTYPE IMallocSpy_PreHeapMinimize_Proxy(IMallocSpy* ); +void STDMETHODCALLTYPE IMallocSpy_PreHeapMinimize_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +void STDMETHODCALLTYPE IMallocSpy_PostHeapMinimize_Proxy(IMallocSpy*); +void STDMETHODCALLTYPE IMallocSpy_PostHeapMinimize_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IStdMarshalInfo_GetClassForHandler_Proxy(IStdMarshalInfo*,DWORD,void*,CLSID*); +void STDMETHODCALLTYPE IStdMarshalInfo_GetClassForHandler_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +DWORD STDMETHODCALLTYPE IExternalConnection_AddConnection_Proxy(IExternalConnection*,DWORD,DWORD); +void STDMETHODCALLTYPE IExternalConnection_AddConnection_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +DWORD STDMETHODCALLTYPE IExternalConnection_ReleaseConnection_Proxy(IExternalConnection*,DWORD,DWORD,BOOL); +void STDMETHODCALLTYPE IExternalConnection_ReleaseConnection_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IEnumUnknown_RemoteNext_Proxy(IEnumUnknown*,ULONG,IUnknown**,ULONG*); +void STDMETHODCALLTYPE IEnumUnknown_RemoteNext_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IEnumUnknown_Skip_Proxy(IEnumUnknown*,ULONG); +void STDMETHODCALLTYPE IEnumUnknown_Skip_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IEnumUnknown_Reset_Proxy(IEnumUnknown* ); +void STDMETHODCALLTYPE IEnumUnknown_Reset_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IEnumUnknown_Clone_Proxy(IEnumUnknown*,IEnumUnknown**); +void STDMETHODCALLTYPE IEnumUnknown_Clone_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IBindCtx_RegisterObjectBound_Proxy(IBindCtx*,IUnknown*punk); +void STDMETHODCALLTYPE IBindCtx_RegisterObjectBound_Stub(IRpcStubBuffer*,IRpcChannelBuffer*_pRpcChannelBuffer,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IBindCtx_RevokeObjectBound_Proxy(IBindCtx*,IUnknown*punk); +void STDMETHODCALLTYPE IBindCtx_RevokeObjectBound_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IBindCtx_ReleaseBoundObjects_Proxy(IBindCtx*); +void STDMETHODCALLTYPE IBindCtx_ReleaseBoundObjects_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IBindCtx_SetBindOptions_Proxy(IBindCtx*,BIND_OPTS*); +void STDMETHODCALLTYPE IBindCtx_SetBindOptions_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IBindCtx_GetBindOptions_Proxy(IBindCtx*,BIND_OPTS*pbindopts); +void STDMETHODCALLTYPE IBindCtx_GetBindOptions_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IBindCtx_GetRunningObjectTable_Proxy(IBindCtx*,IRunningObjectTable**); +void STDMETHODCALLTYPE IBindCtx_GetRunningObjectTable_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IBindCtx_RegisterObjectParam_Proxy(IBindCtx*,LPCSTR,IUnknown*); +void STDMETHODCALLTYPE IBindCtx_RegisterObjectParam_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IBindCtx_GetObjectParam_Proxy(IBindCtx*,LPCSTR,IUnknown**); +void STDMETHODCALLTYPE IBindCtx_GetObjectParam_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IBindCtx_EnumObjectParam_Proxy(IBindCtx*,IEnumString**); +void STDMETHODCALLTYPE IBindCtx_EnumObjectParam_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IBindCtx_RevokeObjectParam_Proxy(IBindCtx*,LPCSTR); +void STDMETHODCALLTYPE IBindCtx_RevokeObjectParam_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IEnumMoniker_RemoteNext_Proxy(IEnumMoniker*,ULONG,IMoniker**,ULONG*); +void STDMETHODCALLTYPE IEnumMoniker_RemoteNext_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IEnumMoniker_Skip_Proxy(IEnumMoniker*,ULONG); +void STDMETHODCALLTYPE IEnumMoniker_Skip_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IEnumMoniker_Reset_Proxy(IEnumMoniker*); +void STDMETHODCALLTYPE IEnumMoniker_Reset_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IEnumMoniker_Clone_Proxy(IEnumMoniker*,IEnumMoniker**); +void STDMETHODCALLTYPE IEnumMoniker_Clone_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IRunnableObject_GetRunningClass_Proxy(IRunnableObject*,LPCLSID); +void STDMETHODCALLTYPE IRunnableObject_GetRunningClass_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IRunnableObject_Run_Proxy(IRunnableObject*,LPBINDCTX); +void STDMETHODCALLTYPE IRunnableObject_Run_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +BOOL STDMETHODCALLTYPE IRunnableObject_IsRunning_Proxy(IRunnableObject*); +void STDMETHODCALLTYPE IRunnableObject_IsRunning_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IRunnableObject_LockRunning_Proxy(IRunnableObject*,BOOL,BOOL); +void STDMETHODCALLTYPE IRunnableObject_LockRunning_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IRunnableObject_SetContainedObject_Proxy(IRunnableObject*,BOOL); +void STDMETHODCALLTYPE IRunnableObject_SetContainedObject_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IRunningObjectTable_Register_Proxy(IRunningObjectTable*,DWORD,IUnknown*,IMoniker*,DWORD*); +void STDMETHODCALLTYPE IRunningObjectTable_Register_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IRunningObjectTable_Revoke_Proxy(IRunningObjectTable*,DWORD); +void STDMETHODCALLTYPE IRunningObjectTable_Revoke_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IRunningObjectTable_IsRunning_Proxy(IRunningObjectTable*,IMoniker*); +void STDMETHODCALLTYPE IRunningObjectTable_IsRunning_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IRunningObjectTable_GetObject_Proxy(IRunningObjectTable*,IMoniker*,IUnknown**); +void STDMETHODCALLTYPE IRunningObjectTable_GetObject_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IRunningObjectTable_NoteChangeTime_Proxy(IRunningObjectTable*,DWORD,FILETIME*); +void STDMETHODCALLTYPE IRunningObjectTable_NoteChangeTime_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IRunningObjectTable_GetTimeOfLastChange_Proxy(IRunningObjectTable*,IMoniker*,FILETIME*); +void STDMETHODCALLTYPE IRunningObjectTable_GetTimeOfLastChange_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IRunningObjectTable_EnumRunning_Proxy(IRunningObjectTable*,IEnumMoniker**); +void STDMETHODCALLTYPE IRunningObjectTable_EnumRunning_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IPersist_GetClassID_Proxy(IPersist*,CLSID*); +void STDMETHODCALLTYPE IPersist_GetClassID_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IPersistStream_IsDirty_Proxy(IPersistStream*); +void STDMETHODCALLTYPE IPersistStream_IsDirty_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IPersistStream_Load_Proxy(IPersistStream*,IStream*); +void STDMETHODCALLTYPE IPersistStream_Load_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IPersistStream_Save_Proxy(IPersistStream*,IStream*,BOOL); +void STDMETHODCALLTYPE IPersistStream_Save_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IPersistStream_GetSizeMax_Proxy(IPersistStream*,ULARGE_INTEGER*); +void STDMETHODCALLTYPE IPersistStream_GetSizeMax_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IMoniker_RemoteBindToObject_Proxy(IMoniker*,IBindCtx*,IMoniker*,REFIID,IUnknown**); +void STDMETHODCALLTYPE IMoniker_RemoteBindToObject_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IMoniker_RemoteBindToStorage_Proxy(IMoniker*,IBindCtx*,IMoniker*,REFIID,IUnknown**); +void STDMETHODCALLTYPE IMoniker_RemoteBindToStorage_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IMoniker_Reduce_Proxy(IMoniker*,IBindCtx*,DWORD,IMoniker**,IMoniker**); +void STDMETHODCALLTYPE IMoniker_Reduce_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IMoniker_ComposeWith_Proxy(IMoniker*,IMoniker*,BOOL,IMoniker**); +void STDMETHODCALLTYPE IMoniker_ComposeWith_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IMoniker_Enum_Proxy(IMoniker*,BOOL,IEnumMoniker**); +void STDMETHODCALLTYPE IMoniker_Enum_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IMoniker_IsEqual_Proxy(IMoniker*,IMoniker*); +void STDMETHODCALLTYPE IMoniker_IsEqual_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IMoniker_Hash_Proxy(IMoniker*,DWORD*); +void STDMETHODCALLTYPE IMoniker_Hash_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IMoniker_IsRunning_Proxy(IMoniker*,IBindCtx*,IMoniker*,IMoniker*); +void STDMETHODCALLTYPE IMoniker_IsRunning_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IMoniker_GetTimeOfLastChange_Proxy(IMoniker*,IBindCtx*,IMoniker*,FILETIME*); +void STDMETHODCALLTYPE IMoniker_GetTimeOfLastChange_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IMoniker_Inverse_Proxy(IMoniker*,IMoniker**); +void STDMETHODCALLTYPE IMoniker_Inverse_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IMoniker_CommonPrefixWith_Proxy(IMoniker*,IMoniker*,IMoniker**); +void STDMETHODCALLTYPE IMoniker_CommonPrefixWith_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IMoniker_RelativePathTo_Proxy(IMoniker*,IMoniker*,IMoniker**); +void STDMETHODCALLTYPE IMoniker_RelativePathTo_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IMoniker_GetDisplayName_Proxy(IMoniker*,IBindCtx*,IMoniker*,LPCSTR*); +void STDMETHODCALLTYPE IMoniker_GetDisplayName_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IMoniker_ParseDisplayName_Proxy(IMoniker*,IBindCtx*,IMoniker*,LPCSTR,ULONG*,IMoniker**); +void STDMETHODCALLTYPE IMoniker_ParseDisplayName_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IMoniker_IsSystemMoniker_Proxy(IMoniker*,DWORD*); +void STDMETHODCALLTYPE IMoniker_IsSystemMoniker_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IROTData_GetComparisonData_Proxy(IROTData*,BYTE*,ULONG cbMax,ULONG*); +void STDMETHODCALLTYPE IROTData_GetComparisonData_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IEnumString_RemoteNext_Proxy(IEnumString*,ULONG,LPCSTR*rgelt,ULONG*); +void STDMETHODCALLTYPE IEnumString_RemoteNext_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IEnumString_Skip_Proxy(IEnumString*,ULONG); +void STDMETHODCALLTYPE IEnumString_Skip_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IEnumString_Reset_Proxy(IEnumString*); +void STDMETHODCALLTYPE IEnumString_Reset_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IEnumString_Clone_Proxy(IEnumString*,IEnumString**); +void STDMETHODCALLTYPE IEnumString_Clone_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IStream_RemoteRead_Proxy(IStream*,BYTE*,ULONG,ULONG*); +void STDMETHODCALLTYPE IStream_RemoteRead_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IStream_RemoteWrite_Proxy(IStream*,BYTE*pv,ULONG,ULONG*); +void STDMETHODCALLTYPE IStream_RemoteWrite_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IStream_RemoteSeek_Proxy(IStream*,LARGE_INTEGER,DWORD,ULARGE_INTEGER*); +void STDMETHODCALLTYPE IStream_RemoteSeek_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IStream_SetSize_Proxy(IStream*,ULARGE_INTEGER); +void STDMETHODCALLTYPE IStream_SetSize_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IStream_RemoteCopyTo_Proxy(IStream*,IStream*,ULARGE_INTEGER,ULARGE_INTEGER*,ULARGE_INTEGER*); +void STDMETHODCALLTYPE IStream_RemoteCopyTo_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IStream_Commit_Proxy(IStream*,DWORD); +void STDMETHODCALLTYPE IStream_Commit_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IStream_Revert_Proxy(IStream*); +void STDMETHODCALLTYPE IStream_Revert_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IStream_LockRegion_Proxy(IStream*,ULARGE_INTEGER,ULARGE_INTEGER,DWORD); +void STDMETHODCALLTYPE IStream_LockRegion_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IStream_UnlockRegion_Proxy(IStream*,ULARGE_INTEGER,ULARGE_INTEGER,DWORD); +void STDMETHODCALLTYPE IStream_UnlockRegion_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IStream_Stat_Proxy(IStream*,STATSTG*,DWORD); +void STDMETHODCALLTYPE IStream_Stat_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IStream_Clone_Proxy(IStream*,IStream**); +void STDMETHODCALLTYPE IStream_Clone_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IEnumSTATSTG_RemoteNext_Proxy(IEnumSTATSTG*,ULONG,STATSTG*,ULONG*); +void STDMETHODCALLTYPE IEnumSTATSTG_RemoteNext_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IEnumSTATSTG_Skip_Proxy(IEnumSTATSTG*,ULONG celt); +void STDMETHODCALLTYPE IEnumSTATSTG_Skip_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IEnumSTATSTG_Reset_Proxy(IEnumSTATSTG*); +void STDMETHODCALLTYPE IEnumSTATSTG_Reset_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IEnumSTATSTG_Clone_Proxy(IEnumSTATSTG*,IEnumSTATSTG**); +void STDMETHODCALLTYPE IEnumSTATSTG_Clone_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IStorage_CreateStream_Proxy(IStorage*,OLECHAR*,DWORD,DWORD,DWORD,IStream**); +void STDMETHODCALLTYPE IStorage_CreateStream_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IStorage_RemoteOpenStream_Proxy(IStorage*,const OLECHAR*,unsigned long,BYTE*,DWORD,DWORD,IStream**); +void STDMETHODCALLTYPE IStorage_RemoteOpenStream_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IStorage_CreateStorage_Proxy(IStorage*,OLECHAR*,DWORD,DWORD,DWORD,IStorage**); +void STDMETHODCALLTYPE IStorage_CreateStorage_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IStorage_OpenStorage_Proxy(IStorage*,OLECHAR*,IStorage*,DWORD,SNB,DWORD,IStorage**); +void STDMETHODCALLTYPE IStorage_OpenStorage_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IStorage_CopyTo_Proxy(IStorage*,DWORD,const IID*,SNB,IStorage*); +void STDMETHODCALLTYPE IStorage_CopyTo_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IStorage_MoveElementTo_Proxy(IStorage*,const OLECHAR*,IStorage*,const OLECHAR*,DWORD); +void STDMETHODCALLTYPE IStorage_MoveElementTo_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IStorage_Commit_Proxy(IStorage*,DWORD); +void STDMETHODCALLTYPE IStorage_Commit_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IStorage_Revert_Proxy(IStorage*); +void STDMETHODCALLTYPE IStorage_Revert_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IStorage_RemoteEnumElements_Proxy(IStorage*,DWORD,unsigned long,BYTE*,DWORD,IEnumSTATSTG**); +void STDMETHODCALLTYPE IStorage_RemoteEnumElements_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IStorage_DestroyElement_Proxy(IStorage*,OLECHAR*); +void STDMETHODCALLTYPE IStorage_DestroyElement_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IStorage_RenameElement_Proxy(IStorage*,const OLECHAR*,const OLECHAR*); +void STDMETHODCALLTYPE IStorage_RenameElement_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IStorage_SetElementTimes_Proxy(IStorage*,const OLECHAR*,const FILETIME*,const FILETIME*,const FILETIME*); +void STDMETHODCALLTYPE IStorage_SetElementTimes_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IStorage_SetClass_Proxy(IStorage*,REFCLSID); +void STDMETHODCALLTYPE IStorage_SetClass_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IStorage_SetStateBits_Proxy(IStorage*,DWORD,DWORD); +void STDMETHODCALLTYPE IStorage_SetStateBits_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IStorage_Stat_Proxy(IStorage*,STATSTG*,DWORD); +void STDMETHODCALLTYPE IStorage_Stat_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IPersistFile_IsDirty_Proxy(IPersistFile*); +void STDMETHODCALLTYPE IPersistFile_IsDirty_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IPersistFile_Load_Proxy(IPersistFile*,LPCOLESTR,DWORD); +void STDMETHODCALLTYPE IPersistFile_Load_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IPersistFile_Save_Proxy(IPersistFile*,LPCOLESTR pszFileName,BOOL); +void STDMETHODCALLTYPE IPersistFile_Save_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IPersistFile_SaveCompleted_Proxy(IPersistFile*,LPCOLESTR); +void STDMETHODCALLTYPE IPersistFile_SaveCompleted_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IPersistFile_GetCurFile_Proxy(IPersistFile*,LPCSTR*); +void STDMETHODCALLTYPE IPersistFile_GetCurFile_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IPersistStorage_IsDirty_Proxy(IPersistStorage*); +void STDMETHODCALLTYPE IPersistStorage_IsDirty_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IPersistStorage_InitNew_Proxy(IPersistStorage*,IStorage*); +void STDMETHODCALLTYPE IPersistStorage_InitNew_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IPersistStorage_Load_Proxy(IPersistStorage*,IStorage*); +void STDMETHODCALLTYPE IPersistStorage_Load_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IPersistStorage_Save_Proxy(IPersistStorage*,IStorage*,BOOL); +void STDMETHODCALLTYPE IPersistStorage_Save_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IPersistStorage_SaveCompleted_Proxy(IPersistStorage*,IStorage*); +void STDMETHODCALLTYPE IPersistStorage_SaveCompleted_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IPersistStorage_HandsOffStorage_Proxy(IPersistStorage*); +void STDMETHODCALLTYPE IPersistStorage_HandsOffStorage_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE ILockBytes_RemoteReadAt_Proxy(ILockBytes*,ULARGE_INTEGER,BYTE*,ULONG,ULONG*); +void STDMETHODCALLTYPE ILockBytes_RemoteReadAt_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE ILockBytes_RemoteWriteAt_Proxy(ILockBytes*,ULARGE_INTEGER,BYTE*pv,ULONG,ULONG*); +void STDMETHODCALLTYPE ILockBytes_RemoteWriteAt_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE ILockBytes_Flush_Proxy(ILockBytes*); +void STDMETHODCALLTYPE ILockBytes_Flush_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE ILockBytes_SetSize_Proxy(ILockBytes*,ULARGE_INTEGER); +void STDMETHODCALLTYPE ILockBytes_SetSize_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE ILockBytes_LockRegion_Proxy(ILockBytes*,ULARGE_INTEGER,ULARGE_INTEGER,DWORD); +void STDMETHODCALLTYPE ILockBytes_LockRegion_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE ILockBytes_UnlockRegion_Proxy(ILockBytes*,ULARGE_INTEGER,ULARGE_INTEGER,DWORD); +void STDMETHODCALLTYPE ILockBytes_UnlockRegion_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE ILockBytes_Stat_Proxy(ILockBytes*,STATSTG*,DWORD); +void STDMETHODCALLTYPE ILockBytes_Stat_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IEnumFORMATETC_RemoteNext_Proxy(IEnumFORMATETC*,ULONG,FORMATETC*,ULONG*); +void STDMETHODCALLTYPE IEnumFORMATETC_RemoteNext_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IEnumFORMATETC_Skip_Proxy(IEnumFORMATETC*,ULONG); +void STDMETHODCALLTYPE IEnumFORMATETC_Skip_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IEnumFORMATETC_Reset_Proxy(IEnumFORMATETC*); +void STDMETHODCALLTYPE IEnumFORMATETC_Reset_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IEnumFORMATETC_Clone_Proxy(IEnumFORMATETC*,IEnumFORMATETC**); +void STDMETHODCALLTYPE IEnumFORMATETC_Clone_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IEnumFORMATETC_Next_Proxy(IEnumFORMATETC*,ULONG,FORMATETC*,ULONG*); +HRESULT STDMETHODCALLTYPE IEnumFORMATETC_Next_Stub(IEnumFORMATETC*,ULONG,FORMATETC*,ULONG*); +HRESULT STDMETHODCALLTYPE IEnumSTATDATA_RemoteNext_Proxy(IEnumSTATDATA*,ULONG,STATDATA*,ULONG*); +void STDMETHODCALLTYPE IEnumSTATDATA_RemoteNext_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IEnumSTATDATA_Skip_Proxy(IEnumSTATDATA*,ULONG); +void STDMETHODCALLTYPE IEnumSTATDATA_Skip_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IEnumSTATDATA_Reset_Proxy(IEnumSTATDATA*); +void STDMETHODCALLTYPE IEnumSTATDATA_Reset_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IEnumSTATDATA_Clone_Proxy(IEnumSTATDATA*,IEnumSTATDATA**); +void STDMETHODCALLTYPE IEnumSTATDATA_Clone_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IEnumSTATDATA_Next_Proxy(IEnumSTATDATA*,ULONG,STATDATA*,ULONG*); +HRESULT STDMETHODCALLTYPE IEnumSTATDATA_Next_Stub(IEnumSTATDATA*,ULONG,STATDATA*,ULONG*); +HRESULT STDMETHODCALLTYPE IRootStorage_SwitchToFile_Proxy(IRootStorage*,LPCSTR); +void STDMETHODCALLTYPE IRootStorage_SwitchToFile_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +void STDMETHODCALLTYPE IAdviseSink_RemoteOnDataChange_Proxy(IAdviseSink*,FORMATETC*,RemSTGMEDIUM*); +void STDMETHODCALLTYPE IAdviseSink_RemoteOnDataChange_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +void STDMETHODCALLTYPE IAdviseSink_RemoteOnViewChange_Proxy(IAdviseSink*,DWORD,LONG); +void STDMETHODCALLTYPE IAdviseSink_RemoteOnViewChange_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +void STDMETHODCALLTYPE IAdviseSink_RemoteOnRename_Proxy(IAdviseSink*,IMoniker*); +void STDMETHODCALLTYPE IAdviseSink_RemoteOnRename_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +void STDMETHODCALLTYPE IAdviseSink_RemoteOnSave_Proxy(IAdviseSink*); +void STDMETHODCALLTYPE IAdviseSink_RemoteOnSave_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IAdviseSink_RemoteOnClose_Proxy(IAdviseSink*); +void STDMETHODCALLTYPE IAdviseSink_RemoteOnClose_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +void STDMETHODCALLTYPE IAdviseSink_OnDataChange_Proxy(IAdviseSink*,FORMATETC*,STGMEDIUM*); +void STDMETHODCALLTYPE IAdviseSink_OnDataChange_Stub(IAdviseSink*,FORMATETC*,RemSTGMEDIUM*); +void STDMETHODCALLTYPE IAdviseSink_OnViewChange_Proxy(IAdviseSink*,DWORD,LONG); +void STDMETHODCALLTYPE IAdviseSink_OnViewChange_Stub(IAdviseSink*,DWORD,LONG); +void STDMETHODCALLTYPE IAdviseSink_OnRename_Proxy(IAdviseSink*,IMoniker*); +void STDMETHODCALLTYPE IAdviseSink_OnRename_Stub(IAdviseSink*,IMoniker*); +void STDMETHODCALLTYPE IAdviseSink_OnSave_Proxy(IAdviseSink*); +void STDMETHODCALLTYPE IAdviseSink_OnSave_Stub(IAdviseSink*); +void STDMETHODCALLTYPE IAdviseSink_OnClose_Proxy(IAdviseSink*); +HRESULT STDMETHODCALLTYPE IAdviseSink_OnClose_Stub(IAdviseSink*); +void STDMETHODCALLTYPE IAdviseSink2_RemoteOnLinkSrcChange_Proxy(IAdviseSink2*,IMoniker*); +void STDMETHODCALLTYPE IAdviseSink2_RemoteOnLinkSrcChange_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +void STDMETHODCALLTYPE IAdviseSink2_OnLinkSrcChange_Proxy(IAdviseSink2*,IMoniker*); +void STDMETHODCALLTYPE IAdviseSink2_OnLinkSrcChange_Stub(IAdviseSink2*,IMoniker*); +HRESULT STDMETHODCALLTYPE IDataObject_RemoteGetData_Proxy(IDataObject*,FORMATETC*,RemSTGMEDIUM**); +void STDMETHODCALLTYPE IDataObject_RemoteGetData_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IDataObject_RemoteGetDataHere_Proxy(IDataObject*,FORMATETC*,RemSTGMEDIUM**); +void STDMETHODCALLTYPE IDataObject_RemoteGetDataHere_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IDataObject_QueryGetData_Proxy(IDataObject*,FORMATETC*); +void STDMETHODCALLTYPE IDataObject_QueryGetData_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IDataObject_GetCanonicalFormatEtc_Proxy(IDataObject*,FORMATETC*,FORMATETC*); +void STDMETHODCALLTYPE IDataObject_GetCanonicalFormatEtc_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IDataObject_RemoteSetData_Proxy(IDataObject*,FORMATETC*,RemSTGMEDIUM*,BOOL); +void STDMETHODCALLTYPE IDataObject_RemoteSetData_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IDataObject_EnumFormatEtc_Proxy(IDataObject*,DWORD,IEnumFORMATETC**); +void STDMETHODCALLTYPE IDataObject_EnumFormatEtc_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IDataObject_DAdvise_Proxy(IDataObject*,FORMATETC*,DWORD,IAdviseSink*,DWORD*); +void STDMETHODCALLTYPE IDataObject_DAdvise_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IDataObject_DUnadvise_Proxy(IDataObject*,DWORD); +void STDMETHODCALLTYPE IDataObject_DUnadvise_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IDataObject_EnumDAdvise_Proxy(IDataObject*,IEnumSTATDATA**); +void STDMETHODCALLTYPE IDataObject_EnumDAdvise_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IDataObject_GetData_Proxy(IDataObject*,FORMATETC*,STGMEDIUM*); +HRESULT STDMETHODCALLTYPE IDataObject_GetData_Stub(IDataObject*,FORMATETC*,RemSTGMEDIUM**); +HRESULT STDMETHODCALLTYPE IDataObject_GetDataHere_Proxy(IDataObject*,FORMATETC*,STGMEDIUM*); +HRESULT STDMETHODCALLTYPE IDataObject_GetDataHere_Stub(IDataObject*,FORMATETC*,RemSTGMEDIUM**); +HRESULT STDMETHODCALLTYPE IDataObject_SetData_Proxy(IDataObject*,FORMATETC*,STGMEDIUM*,BOOL); +HRESULT STDMETHODCALLTYPE IDataObject_SetData_Stub(IDataObject*,FORMATETC*,RemSTGMEDIUM*,BOOL); +HRESULT STDMETHODCALLTYPE IDataAdviseHolder_Advise_Proxy(IDataAdviseHolder*,IDataObject*,FORMATETC*,DWORD,IAdviseSink*,DWORD*); +void STDMETHODCALLTYPE IDataAdviseHolder_Advise_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IDataAdviseHolder_Unadvise_Proxy(IDataAdviseHolder*,DWORD); +void STDMETHODCALLTYPE IDataAdviseHolder_Unadvise_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IDataAdviseHolder_EnumAdvise_Proxy(IDataAdviseHolder*,IEnumSTATDATA**); +void STDMETHODCALLTYPE IDataAdviseHolder_EnumAdvise_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IDataAdviseHolder_SendOnDataChange_Proxy(IDataAdviseHolder*,IDataObject*,DWORD,DWORD); +void STDMETHODCALLTYPE IDataAdviseHolder_SendOnDataChange_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +DWORD STDMETHODCALLTYPE IMessageFilter_HandleInComingCall_Proxy(IMessageFilter*,DWORD,HTASK,DWORD,LPINTERFACEINFO); +void STDMETHODCALLTYPE IMessageFilter_HandleInComingCall_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +DWORD STDMETHODCALLTYPE IMessageFilter_RetryRejectedCall_Proxy(IMessageFilter*,HTASK,DWORD,DWORD); +void STDMETHODCALLTYPE IMessageFilter_RetryRejectedCall_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +DWORD STDMETHODCALLTYPE IMessageFilter_MessagePending_Proxy(IMessageFilter*,HTASK,DWORD,DWORD); +void STDMETHODCALLTYPE IMessageFilter_MessagePending_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IRpcChannelBuffer_GetBuffer_Proxy(IRpcChannelBuffer*,RPCOLEMESSAGE*,REFIID); +void STDMETHODCALLTYPE IRpcChannelBuffer_GetBuffer_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IRpcChannelBuffer_SendReceive_Proxy(IRpcChannelBuffer*,RPCOLEMESSAGE*,ULONG*); +void STDMETHODCALLTYPE IRpcChannelBuffer_SendReceive_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IRpcChannelBuffer_FreeBuffer_Proxy(IRpcChannelBuffer*,RPCOLEMESSAGE*); +void STDMETHODCALLTYPE IRpcChannelBuffer_FreeBuffer_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IRpcChannelBuffer_GetDestCtx_Proxy(IRpcChannelBuffer*,DWORD*,void**); +void STDMETHODCALLTYPE IRpcChannelBuffer_GetDestCtx_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IRpcChannelBuffer_IsConnected_Proxy(IRpcChannelBuffer*); +void STDMETHODCALLTYPE IRpcChannelBuffer_IsConnected_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IRpcProxyBuffer_Connect_Proxy(IRpcProxyBuffer*,IRpcChannelBuffer*pRpcChannelBuffer); +void STDMETHODCALLTYPE IRpcProxyBuffer_Connect_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +void STDMETHODCALLTYPE IRpcProxyBuffer_Disconnect_Proxy(IRpcProxyBuffer*); +void STDMETHODCALLTYPE IRpcProxyBuffer_Disconnect_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IRpcStubBuffer_Connect_Proxy(IRpcStubBuffer*,IUnknown*); +void STDMETHODCALLTYPE IRpcStubBuffer_Connect_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +void STDMETHODCALLTYPE IRpcStubBuffer_Disconnect_Proxy(IRpcStubBuffer*); +void STDMETHODCALLTYPE IRpcStubBuffer_Disconnect_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IRpcStubBuffer_Invoke_Proxy(IRpcStubBuffer*,RPCOLEMESSAGE*,IRpcChannelBuffer*); +void STDMETHODCALLTYPE IRpcStubBuffer_Invoke_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +IRpcStubBuffer*STDMETHODCALLTYPE IRpcStubBuffer_IsIIDSupported_Proxy(IRpcStubBuffer*,REFIID); +void STDMETHODCALLTYPE IRpcStubBuffer_IsIIDSupported_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +ULONG STDMETHODCALLTYPE IRpcStubBuffer_CountRefs_Proxy(IRpcStubBuffer*); +void STDMETHODCALLTYPE IRpcStubBuffer_CountRefs_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IRpcStubBuffer_DebugServerQueryInterface_Proxy(IRpcStubBuffer*,void**); +void STDMETHODCALLTYPE IRpcStubBuffer_DebugServerQueryInterface_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +void STDMETHODCALLTYPE IRpcStubBuffer_DebugServerRelease_Proxy(IRpcStubBuffer*,void*); +void STDMETHODCALLTYPE IRpcStubBuffer_DebugServerRelease_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IPSFactoryBuffer_CreateProxy_Proxy(IPSFactoryBuffer*,IUnknown*,REFIID,IRpcProxyBuffer**,void**); +void STDMETHODCALLTYPE IPSFactoryBuffer_CreateProxy_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IPSFactoryBuffer_CreateStub_Proxy(IPSFactoryBuffer*,REFIID,IUnknown*,IRpcStubBuffer**); +void STDMETHODCALLTYPE IPSFactoryBuffer_CreateStub_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); +void STDMETHODCALLTYPE SNB_to_xmit(SNB*,RemSNB**); +void STDMETHODCALLTYPE SNB_from_xmit(RemSNB*,SNB*); +void STDMETHODCALLTYPE SNB_free_inst(SNB*); +void STDMETHODCALLTYPE SNB_free_xmit(RemSNB*); +HRESULT STDMETHODCALLTYPE IEnumUnknown_Next_Proxy(IEnumUnknown*,ULONG,IUnknown**,ULONG*); +HRESULT STDMETHODCALLTYPE IEnumUnknown_Next_Stub(IEnumUnknown*,ULONG,IUnknown**,ULONG*); +HRESULT STDMETHODCALLTYPE IEnumMoniker_Next_Proxy(IEnumMoniker*,ULONG,IMoniker**,ULONG*); +HRESULT STDMETHODCALLTYPE IEnumMoniker_Next_Stub(IEnumMoniker*,ULONG,IMoniker**,ULONG*); +HRESULT STDMETHODCALLTYPE IMoniker_BindToObject_Proxy(IMoniker*,IBindCtx*,IMoniker*,REFIID,void**); +HRESULT STDMETHODCALLTYPE IMoniker_BindToObject_Stub(IMoniker*,IBindCtx*,IMoniker*,REFIID,IUnknown**); +HRESULT STDMETHODCALLTYPE IMoniker_BindToStorage_Proxy(IMoniker*,IBindCtx*,IMoniker*,REFIID,void**); +HRESULT STDMETHODCALLTYPE IMoniker_BindToStorage_Stub(IMoniker*,IBindCtx*,IMoniker*,REFIID,IUnknown**); +HRESULT STDMETHODCALLTYPE IEnumString_Next_Proxy(IEnumString*,ULONG,LPCSTR*,ULONG*); +HRESULT STDMETHODCALLTYPE IEnumString_Next_Stub(IEnumString*,ULONG,LPCSTR*,ULONG*); +HRESULT STDMETHODCALLTYPE IStream_Read_Proxy(IStream*,void*,ULONG,ULONG*); +HRESULT STDMETHODCALLTYPE IStream_Read_Stub(IStream*,BYTE*,ULONG,ULONG*); +HRESULT STDMETHODCALLTYPE IStream_Write_Proxy(IStream*,void*,ULONG,ULONG*); +HRESULT STDMETHODCALLTYPE IStream_Write_Stub(IStream*,BYTE*,ULONG,ULONG*); +HRESULT STDMETHODCALLTYPE IStream_Seek_Proxy(IStream*,LARGE_INTEGER,DWORD,ULARGE_INTEGER*); +HRESULT STDMETHODCALLTYPE IStream_Seek_Stub(IStream*,LARGE_INTEGER,DWORD,ULARGE_INTEGER*); +HRESULT STDMETHODCALLTYPE IStream_CopyTo_Proxy(IStream*,IStream*,ULARGE_INTEGER,ULARGE_INTEGER*,ULARGE_INTEGER*); +HRESULT STDMETHODCALLTYPE IStream_CopyTo_Stub(IStream*,IStream*,ULARGE_INTEGER,ULARGE_INTEGER*,ULARGE_INTEGER*); +HRESULT STDMETHODCALLTYPE IEnumSTATSTG_Next_Proxy(IEnumSTATSTG*,ULONG,STATSTG*,ULONG*); +HRESULT STDMETHODCALLTYPE IEnumSTATSTG_Next_Stub(IEnumSTATSTG*,ULONG,STATSTG*,ULONG*); +HRESULT STDMETHODCALLTYPE IStorage_OpenStream_Proxy(IStorage*,OLECHAR*,void*,DWORD,DWORD,IStream**); +HRESULT STDMETHODCALLTYPE IStorage_OpenStream_Stub(IStorage*,OLECHAR*,unsigned long,BYTE*,DWORD,DWORD,IStream** ); +HRESULT STDMETHODCALLTYPE IStorage_EnumElements_Proxy(IStorage*,DWORD,void*,DWORD,IEnumSTATSTG**); +HRESULT STDMETHODCALLTYPE IStorage_EnumElements_Stub(IStorage*,DWORD,unsigned long,BYTE*,DWORD,IEnumSTATSTG**); +HRESULT STDMETHODCALLTYPE ILockBytes_ReadAt_Proxy(ILockBytes*,ULARGE_INTEGER,void*,ULONG,ULONG*); +HRESULT STDMETHODCALLTYPE ILockBytes_ReadAt_Stub(ILockBytes*,ULARGE_INTEGER,BYTE*,ULONG,ULONG*); +HRESULT STDMETHODCALLTYPE ILockBytes_WriteAt_Proxy(ILockBytes*,ULARGE_INTEGER,const void*,ULONG,ULONG*); +HRESULT STDMETHODCALLTYPE ILockBytes_WriteAt_Stub(ILockBytes*,ULARGE_INTEGER,BYTE*,ULONG,ULONG*); + +#if (!defined (__cplusplus) || defined (CINTERFACE)) \ + && defined (COBJMACROS) +#define IMarshal_QueryInterface(T,r,p) (T)->lpVtbl->QueryInterface(T,r,p) +#define IMarshal_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IMarshal_Release(This) (This)->lpVtbl->Release(This) +#define IMarshal_GetUnmarshalClass(T,r,pv,dw,pvD,m,pC) (T)->lpVtbl->GetUnmarshalClass(T,r,pv,dw,pvD,m,pC) +#define IMarshal_GetMarshalSizeMax(T,r,pv,dw,pD,m,p) (T)->lpVtbl->GetMarshalSizeMax(T,r,pv,dw,pD,m,p) +#define IMarshal_MarshalInterface(T,p,r,pv,dw,pvD,m) (T)->lpVtbl->MarshalInterface(T,p,r,pv,dw,pv,m) +#define IMarshal_UnmarshalInterface(T,p,r,pp) (T)->lpVtbl->UnmarshalInterface(T,p,r,pp) +#define IMarshal_ReleaseMarshalData(T,p) (T)->lpVtbl->ReleaseMarshalData(T,p) +#define IMarshal_DisconnectObject(T,d) (T)->lpVtbl->DisconnectObject(T,d) +#define IMalloc_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define IMalloc_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IMalloc_Release(This) (This)->lpVtbl->Release(This) +#define IMalloc_Alloc(This,cb) (This)->lpVtbl->Alloc(This,cb) +#define IMalloc_Realloc(This,pv,cb) (This)->lpVtbl->Realloc(This,pv,cb) +#define IMalloc_Free(This,pv) (This)->lpVtbl->Free(This,pv) +#define IMalloc_GetSize(This,pv) (This)->lpVtbl->GetSize(This,pv) +#define IMalloc_DidAlloc(This,pv) (This)->lpVtbl->DidAlloc(This,pv) +#define IMalloc_HeapMinimize(This) (This)->lpVtbl->HeapMinimize(This) +#define IMallocSpy_QueryInterface(T,r,p) (T)->lpVtbl->QueryInterface(T,r,p) +#define IMallocSpy_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IMallocSpy_Release(This) (This)->lpVtbl->Release(This) +#define IMallocSpy_PreAlloc(T,c) (T)->lpVtbl->PreAlloc(T,c) +#define IMallocSpy_PostAlloc(This,p) (This)->lpVtbl->PostAlloc(This,p) +#define IMallocSpy_PreFree(This,p,f) (This)->lpVtbl->PreFree(This,p,f) +#define IMallocSpy_PostFree(This,fSpyed) (This)->lpVtbl->PostFree(This,fSpyed) +#define IMallocSpy_PreRealloc(T,p,c,pp,f) (T)->lpVtbl->PreRealloc(T,p,c,pp,f) +#define IMallocSpy_PostRealloc(T,p,f) (T)->lpVtbl->PostRealloc(T,p,f) +#define IMallocSpy_PreGetSize(This,p,f) (This)->lpVtbl->PreGetSize(This,p,f) +#define IMallocSpy_PostGetSize(This,cbActual,fSpyed) (This)->lpVtbl->PostGetSize(This,cbActual,fSpyed) +#define IMallocSpy_PreDidAlloc(This,pRequest,fSpyed) (This)->lpVtbl->PreDidAlloc(This,pRequest,fSpyed) +#define IMallocSpy_PostDidAlloc(This,pRequest,fSpyed,fActual) (This)->lpVtbl->PostDidAlloc(This,pRequest,fSpyed,fActual) +#define IMallocSpy_PreHeapMinimize(T) (T)->lpVtbl->PreHeapMinimize(T) +#define IMallocSpy_PostHeapMinimize(T) (T)->lpVtbl->PostHeapMinimize(T) +#define IStdMarshalInfo_QueryInterface(T,r,p) (This)->lpVtbl->QueryInterface(T,r,p) +#define IStdMarshalInfo_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IStdMarshalInfo_Release(This) (This)->lpVtbl->Release(This) +#define IStdMarshalInfo_GetClassForHandler(This,D,p,C) (This)->lpVtbl->GetClassForHandler(This,D,p,C) +#define IExternalConnection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define IExternalConnection_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IExternalConnection_Release(This) (This)->lpVtbl->Release(This) +#define IExternalConnection_AddConnection(T,e,r) (T)->lpVtbl->AddConnection(T,e,r) +#define IExternalConnection_ReleaseConnection(This,e,r,f) (This)->lpVtbl->ReleaseConnection(This,e,r,f) +#define IEnumUnknown_QueryInterface(T,r,p) (This)->lpVtbl->QueryInterface(T,r,p) +#define IEnumUnknown_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IEnumUnknown_Release(This) (This)->lpVtbl->Release(This) +#define IEnumUnknown_Next(This,celt,rgelt,p) (This)->lpVtbl->Next(This,celt,rgelt,p) +#define IEnumUnknown_Skip(This,celt) (This)->lpVtbl->Skip(This,celt) +#define IEnumUnknown_Reset(This) (This)->lpVtbl->Reset(This) +#define IEnumUnknown_Clone(This,ppenum) (This)->lpVtbl->Clone(This,ppenum) +#define IBindCtx_QueryInterface(T,r,p) (T)->lpVtbl->QueryInterface(T,r,p) +#define IBindCtx_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IBindCtx_Release(This) (This)->lpVtbl->Release(This) +#define IBindCtx_RegisterObjectBound(T,p) (T)->lpVtbl->RegisterObjectBound(T,p) +#define IBindCtx_RevokeObjectBound(T,p) (T)->lpVtbl->RevokeObjectBound(T,p) +#define IBindCtx_ReleaseBoundObjects(T) (T)->lpVtbl->ReleaseBoundObjects(T) +#define IBindCtx_SetBindOptions(T,p) (T)->lpVtbl->SetBindOptions(T,p) +#define IBindCtx_GetBindOptions(This,pbindopts) (This)->lpVtbl->GetBindOptions(This,pbindopts) +#define IBindCtx_GetRunningObjectTable(This,pprot) (This)->lpVtbl->GetRunningObjectTable(This,pprot) +#define IBindCtx_RegisterObjectParam(This,pszKey,punk) (This)->lpVtbl->RegisterObjectParam(This,pszKey,punk) +#define IBindCtx_GetObjectParam(This,pszKey,ppunk) (This)->lpVtbl->GetObjectParam(This,pszKey,ppunk) +#define IBindCtx_EnumObjectParam(This,ppenum) (This)->lpVtbl->EnumObjectParam(This,ppenum) +#define IBindCtx_RevokeObjectParam(This,pszKey) (This)->lpVtbl->RevokeObjectParam(This,pszKey) +#define IEnumMoniker_QueryInterface(T,r,p) (T)->lpVtbl->QueryInterface(T,r,p) +#define IEnumMoniker_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IEnumMoniker_Release(This) (This)->lpVtbl->Release(This) +#define IEnumMoniker_Next(This,celt,rgelt,pceltFetched) (This)->lpVtbl->Next(This,celt,rgelt,pceltFetched) +#define IEnumMoniker_Skip(This,celt) (This)->lpVtbl->Skip(This,celt) +#define IEnumMoniker_Reset(This) (This)->lpVtbl->Reset(This) +#define IEnumMoniker_Clone(This,ppenum) (This)->lpVtbl->Clone(This,ppenum) +#define IRunnableObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define IRunnableObject_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IRunnableObject_Release(This) (This)->lpVtbl->Release(This) +#define IRunnableObject_GetRunningClass(This,lpClsid) (This)->lpVtbl->GetRunningClass(This,lpClsid) +#define IRunnableObject_Run(This,pbc) (This)->lpVtbl->Run(This,pbc) +#define IRunnableObject_IsRunning(This) (This)->lpVtbl->IsRunning(This) +#define IRunnableObject_LockRunning(This,fLock,fLastUnlockCloses) (This)->lpVtbl->LockRunning(This,fLock,fLastUnlockCloses) +#define IRunnableObject_SetContainedObject(This,fContained) (This)->lpVtbl->SetContainedObject(This,fContained) +#define IRunningObjectTable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define IRunningObjectTable_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IRunningObjectTable_Release(This) (This)->lpVtbl->Release(This) +#define IRunningObjectTable_Register(This,grfFlags,punkObject,pmkObjectName,pdwRegister) (This)->lpVtbl->Register(This,grfFlags,punkObject,pmkObjectName,pdwRegister) +#define IRunningObjectTable_Revoke(This,dwRegister) (This)->lpVtbl->Revoke(This,dwRegister) +#define IRunningObjectTable_IsRunning(This,pmkObjectName) (This)->lpVtbl->IsRunning(This,pmkObjectName) +#define IRunningObjectTable_GetObject(This,pmkObjectName,ppunkObject) (This)->lpVtbl->GetObject(This,pmkObjectName,ppunkObject) +#define IRunningObjectTable_NoteChangeTime(This,dwRegister,pfiletime) (This)->lpVtbl->NoteChangeTime(This,dwRegister,pfiletime) +#define IRunningObjectTable_GetTimeOfLastChange(This,pmkObjectName,pfiletime) (This)->lpVtbl->GetTimeOfLastChange(This,pmkObjectName,pfiletime) +#define IRunningObjectTable_EnumRunning(This,ppenumMoniker) (This)->lpVtbl->EnumRunning(This,ppenumMoniker) +#define IPersist_QueryInterface(T,r,p) (T)->lpVtbl->QueryInterface(T,r,p) +#define IPersist_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IPersist_Release(This) (This)->lpVtbl->Release(This) +#define IPersist_GetClassID(This,pClassID) (This)->lpVtbl->GetClassID(This,pClassID) +#define IPersistStream_QueryInterface(T,r,p) (T)->lpVtbl->QueryInterface(T,r,p) +#define IPersistStream_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IPersistStream_Release(This) (This)->lpVtbl->Release(This) +#define IPersistStream_GetClassID(T,p) (T)->lpVtbl->GetClassID(T,p) +#define IPersistStream_IsDirty(This) (This)->lpVtbl->IsDirty(This) +#define IPersistStream_Load(This,pStm) (This)->lpVtbl->Load(This,pStm) +#define IPersistStream_Save(T,p,f) (T)->lpVtbl->Save(T,p,f) +#define IPersistStream_GetSizeMax(T,p) (T)->lpVtbl->GetSizeMax(T,p) +#define IMoniker_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define IMoniker_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IMoniker_Release(This) (This)->lpVtbl->Release(This) +#define IMoniker_GetClassID(This,pClassID) (This)->lpVtbl->GetClassID(This,pClassID) +#define IMoniker_IsDirty(This) (This)->lpVtbl->IsDirty(This) +#define IMoniker_Load(This,pStm) (This)->lpVtbl->Load(This,pStm) +#define IMoniker_Save(This,pStm,fClearDirty) (This)->lpVtbl->Save(This,pStm,fClearDirty) +#define IMoniker_GetSizeMax(This,pcbSize) (This)->lpVtbl->GetSizeMax(This,pcbSize) +#define IMoniker_BindToObject(T,p,pm,r,pp) (T)->lpVtbl->BindToObject(T,p,pm,r,pp) +#define IMoniker_BindToStorage(This,pbc,pmkToLeft,riid,ppvObj) (This)->lpVtbl->BindToStorage(This,pbc,pmkToLeft,riid,ppvObj) +#define IMoniker_Reduce(This,pbc,dwReduceHowFar,ppmkToLeft,ppmkReduced) (This)->lpVtbl->Reduce(This,pbc,dwReduceHowFar,ppmkToLeft,ppmkReduced) +#define IMoniker_ComposeWith(This,pmkRight,fOnlyIfNotGeneric,ppmkComposite) (This)->lpVtbl->ComposeWith(This,pmkRight,fOnlyIfNotGeneric,ppmkComposite) +#define IMoniker_Enum(T,f,pp) (T)->lpVtbl->Enum(T,f,pp) +#define IMoniker_IsEqual(This,p) (This)->lpVtbl->IsEqual(This,p) +#define IMoniker_Hash(This,pdwHash) (This)->lpVtbl->Hash(This,pdwHash) +#define IMoniker_IsRunning(T,pbc,Left,N) (T)->lpVtbl->IsRunning(T,pbc,Left,N) +#define IMoniker_GetTimeOfLastChange(This,pbc,pmkToLeft,pFileTime) (This)->lpVtbl->GetTimeOfLastChange(This,pbc,pmkToLeft,pFileTime) +#define IMoniker_Inverse(This,ppmk) (This)->lpVtbl->Inverse(This,ppmk) +#define IMoniker_CommonPrefixWith(This,pmkOther,ppmkPrefix) (This)->lpVtbl->CommonPrefixWith(This,pmkOther,ppmkPrefix) +#define IMoniker_RelativePathTo(This,pmkOther,ppmkRelPath) (This)->lpVtbl->RelativePathTo(This,pmkOther,ppmkRelPath) +#define IMoniker_GetDisplayName(This,pbc,pmkToLeft,ppszDisplayName) (This)->lpVtbl->GetDisplayName(This,pbc,pmkToLeft,ppszDisplayName) +#define IMoniker_ParseDisplayName(This,pbc,pmkToLeft,pszDisplayName,pchEaten,ppmkOut) (This)->lpVtbl->ParseDisplayName(This,pbc,pmkToLeft,pszDisplayName,pchEaten,ppmkOut) +#define IMoniker_IsSystemMoniker(This,pdwMksys) (This)->lpVtbl->IsSystemMoniker(This,pdwMksys) +#define IROTData_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define IROTData_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IROTData_Release(This) (This)->lpVtbl->Release(This) +#define IROTData_GetComparisonData(This,pbData,cbMax,pcbData) (This)->lpVtbl->GetComparisonData(This,pbData,cbMax,pcbData) +#define IEnumString_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define IEnumString_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IEnumString_Release(This) (This)->lpVtbl->Release(This) +#define IEnumString_Next(This,celt,rgelt,pceltFetched) (This)->lpVtbl->Next(This,celt,rgelt,pceltFetched) +#define IEnumString_Skip(This,celt) (This)->lpVtbl->Skip(This,celt) +#define IEnumString_Reset(This) (This)->lpVtbl->Reset(This) +#define IEnumString_Clone(This,ppenum) (This)->lpVtbl->Clone(This,ppenum) +#define IStream_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define IStream_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IStream_Release(This) (This)->lpVtbl->Release(This) +#define IStream_Read(This,pv,cb,pcbRead) (This)->lpVtbl->Read(This,pv,cb,pcbRead) +#define IStream_Write(This,pv,cb,pcbWritten) (This)->lpVtbl->Write(This,pv,cb,pcbWritten) +#define IStream_Seek(This,dlibMove,dwOrigin,plibNewPosition) (This)->lpVtbl->Seek(This,dlibMove,dwOrigin,plibNewPosition) +#define IStream_SetSize(This,libNewSize) (This)->lpVtbl->SetSize(This,libNewSize) +#define IStream_CopyTo(This,pstm,cb,pcbRead,pcbWritten) (This)->lpVtbl->CopyTo(This,pstm,cb,pcbRead,pcbWritten) +#define IStream_Commit(This,grfCommitFlags) (This)->lpVtbl->Commit(This,grfCommitFlags) +#define IStream_Revert(This) (This)->lpVtbl->Revert(This) +#define IStream_LockRegion(This,libOffset,cb,dwLockType) (This)->lpVtbl->LockRegion(This,libOffset,cb,dwLockType) +#define IStream_UnlockRegion(This,libOffset,cb,dwLockType) (This)->lpVtbl->UnlockRegion(This,libOffset,cb,dwLockType) +#define IStream_Stat(This,pstatstg,grfStatFlag) (This)->lpVtbl->Stat(This,pstatstg,grfStatFlag) +#define IStream_Clone(This,ppstm) (This)->lpVtbl->Clone(This,ppstm) +#define IEnumSTATSTG_QueryInterface(T,r,p) (T)->lpVtbl->QueryInterface(T,r,p) +#define IEnumSTATSTG_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IEnumSTATSTG_Release(This) (This)->lpVtbl->Release(This) +#define IEnumSTATSTG_Next(T,c,r,p) (T)->lpVtbl->Next(T,c,r,p) +#define IEnumSTATSTG_Skip(This,celt) (This)->lpVtbl->Skip(This,celt) +#define IEnumSTATSTG_Reset(This) (This)->lpVtbl->Reset(This) +#define IEnumSTATSTG_Clone(This,ppenum) (This)->lpVtbl->Clone(This,ppenum) +#define IStorage_QueryInterface(T,r,p) (T)->lpVtbl->QueryInterface(T,r,p) +#define IStorage_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IStorage_Release(This) (This)->lpVtbl->Release(This) +#define IStorage_CreateStream(T,p,g,r1,r2,pp) (T)->lpVtbl->CreateStream(T,p,g,r1,r2,pp) +#define IStorage_OpenStream(T,p,r1,g,r2,pp) (T)->lpVtbl->OpenStream(T,p,r1,g,r2,pp) +#define IStorage_CreateStorage(T,p,g,d,r2,pp) (T)->lpVtbl->CreateStorage(T,p,g,d,r2,pp) +#define IStorage_OpenStorage(This,pwcsName,pstgPriority,grfMode,snbExclude,reserved,ppstg) (This)->lpVtbl->OpenStorage(This,pwcsName,pstgPriority,grfMode,snbExclude,reserved,ppstg) +#define IStorage_CopyTo(This,ciidExclude,rgiidExclude,snbExclude,pstgDest) (This)->lpVtbl->CopyTo(This,ciidExclude,rgiidExclude,snbExclude,pstgDest) +#define IStorage_MoveElementTo(This,pwcsName,pstgDest,pwcsNewName,grfFlags) (This)->lpVtbl->MoveElementTo(This,pwcsName,pstgDest,pwcsNewName,grfFlags) +#define IStorage_Commit(This,g) (This)->lpVtbl->Commit(This,g) +#define IStorage_Revert(This) (This)->lpVtbl->Revert(This) +#define IStorage_EnumElements(This,reserved1,reserved2,reserved3,ppenum) (This)->lpVtbl->EnumElements(This,reserved1,reserved2,reserved3,ppenum) +#define IStorage_DestroyElement(This,pwcsName) (This)->lpVtbl->DestroyElement(This,pwcsName) +#define IStorage_RenameElement(This,pwcsOldName,pwcsNewName) (This)->lpVtbl->RenameElement(This,pwcsOldName,pwcsNewName) +#define IStorage_SetElementTimes(This,pwcsName,pctime,patime,pmtime) (This)->lpVtbl->SetElementTimes(This,pwcsName,pctime,patime,pmtime) +#define IStorage_SetClass(This,clsid) (This)->lpVtbl->SetClass(This,clsid) +#define IStorage_SetStateBits(This,grfStateBits,grfMask) (This)->lpVtbl->SetStateBits(This,grfStateBits,grfMask) +#define IStorage_Stat(This,p,g) (This)->lpVtbl->Stat(This,p,g) +#define IPersistFile_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define IPersistFile_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IPersistFile_Release(This) (This)->lpVtbl->Release(This) +#define IPersistFile_GetClassID(This,pClassID) (This)->lpVtbl->GetClassID(This,pClassID) +#define IPersistFile_IsDirty(This) (This)->lpVtbl->IsDirty(This) +#define IPersistFile_Load(This,pszFileName,dwMode) (This)->lpVtbl->Load(This,pszFileName,dwMode) +#define IPersistFile_Save(This,pszFileName,fRemember) (This)->lpVtbl->Save(This,pszFileName,fRemember) +#define IPersistFile_SaveCompleted(This,pszFileName) (This)->lpVtbl->SaveCompleted(This,pszFileName) +#define IPersistFile_GetCurFile(This,ppszFileName) (This)->lpVtbl->GetCurFile(This,ppszFileName) +#define IPersistStorage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define IPersistStorage_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IPersistStorage_Release(This) (This)->lpVtbl->Release(This) +#define IPersistStorage_GetClassID(This,pClassID) (This)->lpVtbl->GetClassID(This,pClassID) +#define IPersistStorage_IsDirty(This) (This)->lpVtbl->IsDirty(This) +#define IPersistStorage_InitNew(This,pStg) (This)->lpVtbl->InitNew(This,pStg) +#define IPersistStorage_Load(This,pStg) (This)->lpVtbl->Load(This,pStg) +#define IPersistStorage_Save(This,pStgSave,fSameAsLoad) (This)->lpVtbl->Save(This,pStgSave,fSameAsLoad) +#define IPersistStorage_SaveCompleted(This,pStgNew) (This)->lpVtbl->SaveCompleted(This,pStgNew) +#define IPersistStorage_HandsOffStorage(This) (This)->lpVtbl->HandsOffStorage(This) +#define ILockBytes_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define ILockBytes_AddRef(This) (This)->lpVtbl->AddRef(This) +#define ILockBytes_Release(This) (This)->lpVtbl->Release(This) +#define ILockBytes_ReadAt(This,ulOffset,pv,cb,pcbRead) (This)->lpVtbl->ReadAt(This,ulOffset,pv,cb,pcbRead) +#define ILockBytes_WriteAt(This,ulOffset,pv,cb,pcbWritten) (This)->lpVtbl->WriteAt(This,ulOffset,pv,cb,pcbWritten) +#define ILockBytes_Flush(This) (This)->lpVtbl->Flush(This) +#define ILockBytes_SetSize(This,cb) (This)->lpVtbl->SetSize(This,cb) +#define ILockBytes_LockRegion(This,libOffset,cb,dwLockType) (This)->lpVtbl->LockRegion(This,libOffset,cb,dwLockType) +#define ILockBytes_UnlockRegion(This,libOffset,cb,dwLockType) (This)->lpVtbl->UnlockRegion(This,libOffset,cb,dwLockType) +#define ILockBytes_Stat(This,pstatstg,grfStatFlag) (This)->lpVtbl->Stat(This,pstatstg,grfStatFlag) +#define IEnumFORMATETC_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define IEnumFORMATETC_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IEnumFORMATETC_Release(This) (This)->lpVtbl->Release(This) +#define IEnumFORMATETC_Next(This,celt,rgelt,pceltFetched) (This)->lpVtbl->Next(This,celt,rgelt,pceltFetched) +#define IEnumFORMATETC_Skip(This,celt) (This)->lpVtbl->Skip(This,celt) +#define IEnumFORMATETC_Reset(This) (This)->lpVtbl->Reset(This) +#define IEnumFORMATETC_Clone(This,ppenum) (This)->lpVtbl->Clone(This,ppenum) +#define IEnumSTATDATA_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define IEnumSTATDATA_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IEnumSTATDATA_Release(This) (This)->lpVtbl->Release(This) +#define IEnumSTATDATA_Next(This,celt,rgelt,pceltFetched) (This)->lpVtbl->Next(This,celt,rgelt,pceltFetched) +#define IEnumSTATDATA_Skip(This,celt) (This)->lpVtbl->Skip(This,celt) +#define IEnumSTATDATA_Reset(This) (This)->lpVtbl->Reset(This) +#define IEnumSTATDATA_Clone(This,ppenum) (This)->lpVtbl->Clone(This,ppenum) +#define IRootStorage_QueryInterface(T,r,O) (T)->lpVtbl->QueryInterface(T,r,O) +#define IRootStorage_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IRootStorage_Release(This) (This)->lpVtbl->Release(This) +#define IRootStorage_SwitchToFile(This,pszFile) (This)->lpVtbl->SwitchToFile(This,pszFile) +#define IAdviseSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define IAdviseSink_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IAdviseSink_Release(This) (This)->lpVtbl->Release(This) +#define IAdviseSink_OnDataChange(This,pFormatetc,pStgmed) (This)->lpVtbl->OnDataChange(This,pFormatetc,pStgmed) +#define IAdviseSink_OnViewChange(This,dwAspect,lindex) (This)->lpVtbl->OnViewChange(This,dwAspect,lindex) +#define IAdviseSink_OnRename(This,pmk) (This)->lpVtbl->OnRename(This,pmk) +#define IAdviseSink_OnSave(This) (This)->lpVtbl->OnSave(This) +#define IAdviseSink_OnClose(This) (This)->lpVtbl->OnClose(This) +#define IAdviseSink2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define IAdviseSink2_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IAdviseSink2_Release(This) (This)->lpVtbl->Release(This) +#define IAdviseSink2_OnDataChange(This,pFormatetc,pStgmed) (This)->lpVtbl->OnDataChange(This,pFormatetc,pStgmed) +#define IAdviseSink2_OnViewChange(This,dwAspect,lindex) (This)->lpVtbl->OnViewChange(This,dwAspect,lindex) +#define IAdviseSink2_OnRename(This,pmk) (This)->lpVtbl->OnRename(This,pmk) +#define IAdviseSink2_OnSave(This) (This)->lpVtbl->OnSave(This) +#define IAdviseSink2_OnClose(This) (This)->lpVtbl->OnClose(This) +#define IAdviseSink2_OnLinkSrcChange(This,pmk) (This)->lpVtbl->OnLinkSrcChange(This,pmk) +#define IDataObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define IDataObject_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IDataObject_Release(This) (This)->lpVtbl->Release(This) +#define IDataObject_GetData(This,pformatetcIn,pmedium) (This)->lpVtbl->GetData(This,pformatetcIn,pmedium) +#define IDataObject_GetDataHere(This,pformatetc,pmedium) (This)->lpVtbl->GetDataHere(This,pformatetc,pmedium) +#define IDataObject_QueryGetData(This,pformatetc) (This)->lpVtbl->QueryGetData(This,pformatetc) +#define IDataObject_GetCanonicalFormatEtc(This,pformatectIn,pformatetcOut) (This)->lpVtbl->GetCanonicalFormatEtc(This,pformatectIn,pformatetcOut) +#define IDataObject_SetData(This,pformatetc,pmedium,fRelease) (This)->lpVtbl->SetData(This,pformatetc,pmedium,fRelease) +#define IDataObject_EnumFormatEtc(This,dwDirection,ppenumFormatEtc) (This)->lpVtbl->EnumFormatEtc(This,dwDirection,ppenumFormatEtc) +#define IDataObject_DAdvise(This,pformatetc,advf,pAdvSink,pdwConnection) (This)->lpVtbl->DAdvise(This,pformatetc,advf,pAdvSink,pdwConnection) +#define IDataObject_DUnadvise(This,dwConnection) (This)->lpVtbl->DUnadvise(This,dwConnection) +#define IDataObject_EnumDAdvise(This,ppenumAdvise) (This)->lpVtbl->EnumDAdvise(This,ppenumAdvise) +#define IDataAdviseHolder_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define IDataAdviseHolder_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IDataAdviseHolder_Release(This) (This)->lpVtbl->Release(This) +#define IDataAdviseHolder_Advise(This,pDataObject,pFetc,advf,pAdvise,pdwConnection) (This)->lpVtbl->Advise(This,pDataObject,pFetc,advf,pAdvise,pdwConnection) +#define IDataAdviseHolder_Unadvise(This,dwConnection) (This)->lpVtbl->Unadvise(This,dwConnection) +#define IDataAdviseHolder_EnumAdvise(This,ppenumAdvise) (This)->lpVtbl->EnumAdvise(This,ppenumAdvise) +#define IDataAdviseHolder_SendOnDataChange(This,pDataObject,dwReserved,advf) (This)->lpVtbl->SendOnDataChange(This,pDataObject,dwReserved,advf) +#define IMessageFilter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define IMessageFilter_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IMessageFilter_Release(This) (This)->lpVtbl->Release(This) +#define IMessageFilter_HandleInComingCall(T,d,h,dw,lp) (T)->lpVtbl->HandleInComingCall(T,d,h,dw,lp) +#define IMessageFilter_RetryRejectedCall(s,C,T,R) (s)->lpVtbl->RetryRejectedCall(s,C,T,R) +#define IMessageFilter_MessagePending(s,C,T,P) (s)->lpVtbl->MessagePending(This,C,T,P) +#define IRpcChannelBuffer_QueryInterface(T,r,p) (T)->lpVtbl->QueryInterface(T,r,p) +#define IRpcChannelBuffer_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IRpcChannelBuffer_Release(This) (This)->lpVtbl->Release(This) +#define IRpcChannelBuffer_GetBuffer(This,pMessage,riid) (This)->lpVtbl->GetBuffer(This,pMessage,riid) +#define IRpcChannelBuffer_SendReceive(T,p,pS) (T)->lpVtbl->SendReceive(T,p,pS) +#define IRpcChannelBuffer_FreeBuffer(T,p) (T)->lpVtbl->FreeBuffer(T,p) +#define IRpcChannelBuffer_GetDestCtx(This,pdwDestContext,ppvDestContext) (This)->lpVtbl->GetDestCtx(This,pdwDestContext,ppvDestContext) +#define IRpcChannelBuffer_IsConnected(This) (This)->lpVtbl->IsConnected(This) +#define IRpcProxyBuffer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define IRpcProxyBuffer_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IRpcProxyBuffer_Release(This) (This)->lpVtbl->Release(This) +#define IRpcProxyBuffer_Connect(This,pRpcChannelBuffer) (This)->lpVtbl->Connect(This,pRpcChannelBuffer) +#define IRpcProxyBuffer_Disconnect(This) (This)->lpVtbl->Disconnect(This) +#define IRpcStubBuffer_QueryInterface(T,r,pp) (T)->lpVtbl->QueryInterface(T,r,pp) +#define IRpcStubBuffer_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IRpcStubBuffer_Release(This) (This)->lpVtbl->Release(This) +#define IRpcStubBuffer_Connect(This,p) (This)->lpVtbl->Connect(This,p) +#define IRpcStubBuffer_Disconnect(This) (This)->lpVtbl->Disconnect(This) +#define IRpcStubBuffer_Invoke(T,_prpcmsg,_p) (T)->lpVtbl->Invoke(T,_prpcmsg,_p) +#define IRpcStubBuffer_IsIIDSupported(T,d) (T)->lpVtbl->IsIIDSupported(T,d) +#define IRpcStubBuffer_CountRefs(This) (This)->lpVtbl->CountRefs(This) +#define IRpcStubBuffer_DebugServerQueryInterface(T,p) (T)->lpVtbl->DebugServerQueryInterface(T,p) +#define IRpcStubBuffer_DebugServerRelease(T,p) (T)->lpVtbl->DebugServerRelease(T,p) +#define IPSFactoryBuffer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define IPSFactoryBuffer_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IPSFactoryBuffer_Release(This) (This)->lpVtbl->Release(This) +#define IPSFactoryBuffer_CreateProxy(T,U,r,P,p) (T)->lpVtbl->CreateProxy(T,U,r,P,p) +#define IPSFactoryBuffer_CreateStub(T,r,U,p) (T)->lpVtbl->CreateStub(T,r,U,p) +#define IClassActivator_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IClassActivator_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IClassActivator_Release(T) (T)->lpVtbl->Release(T) +#define IClassActivator_GetClassObject(T,a,b,c,d,e) (T)->lpVtbl->GetClassObject(T,a,b,c,d,e) +#endif /* COBJMACROS */ + +#endif diff --git a/reactos/w32api/include/ocidl.h b/reactos/w32api/include/ocidl.h new file mode 100644 index 00000000000..3dbfac2965b --- /dev/null +++ b/reactos/w32api/include/ocidl.h @@ -0,0 +1,817 @@ +#ifndef _OCIDL_H +#define _OCIDL_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#include <ole2.h> + +typedef interface IErrorLog *LPERRORLOG; +typedef interface IPropertyBag *LPPROPERTYBAG; +typedef interface IPropertyBag2 *LPPROPERTYBAG2; +typedef interface IEnumConnections *LPENUMCONNECTIONS; +typedef interface IConnectionPoint *LPCONNECTIONPOINT; +typedef interface IEnumConnectionPoints *LPENUMCONNECTIONPOINTS; +typedef interface IPropertyPageSite *LPPROPERTYPAGESITE; +typedef interface IFont *LPFONT; +typedef interface IFontDisp *LPFONTDISP; +typedef interface IOleUndoManager *LPOLEUNDOMANAGER; + +#ifndef OLE2ANSI +typedef TEXTMETRICW TEXTMETRICOLE; +#else +typedef TEXTMETRIC TEXTMETRICOLE; +#endif +typedef TEXTMETRICOLE *LPTEXTMETRICOLE; +typedef DWORD OLE_COLOR; +typedef UINT OLE_HANDLE; +typedef long OLE_XPOS_HIMETRIC; +typedef long OLE_YPOS_HIMETRIC; +typedef long OLE_XSIZE_HIMETRIC; +typedef long OLE_YSIZE_HIMETRIC; + +typedef enum tagREADYSTATE { + READYSTATE_UNINITIALIZED = 0, + READYSTATE_LOADING = 1, + READYSTATE_LOADED = 2, + READYSTATE_INTERACTIVE = 3, + READYSTATE_COMPLETE = 4 +} READYSTATE; +typedef enum tagPROPBAG2_TYPE { + PROPBAG2_TYPE_UNDEFINED = 0, + PROPBAG2_TYPE_DATA = 1, + PROPBAG2_TYPE_URL = 2, + PROPBAG2_TYPE_OBJECT = 3, + PROPBAG2_TYPE_STREAM = 4, + PROPBAG2_TYPE_STORAGE = 5, + PROPBAG2_TYPE_MONIKER = 6 +} PROPBAG2_TYPE; +typedef struct tagPROPBAG2 +{ + DWORD dwType; + VARTYPE vt; + CLIPFORMAT cfType; + DWORD dwHint; + LPOLESTR pstrName; + CLSID clsid; +} PROPBAG2; +enum tagQACONTAINERFLAGS +{ + QACONTAINER_SHOWHATCHING = 1, + QACONTAINER_SHOWGRABHANDLES = 2, + QACONTAINER_USERMODE = 4, + QACONTAINER_DISPLAYASDEFAULT = 8, + QACONTAINER_UIDEAD = 16, + QACONTAINER_AUTOCLIP = 32, + QACONTAINER_MESSAGEREFLECT = 64, + QACONTAINER_SUPPORTSMNEMONICS = 128 +} QACONTAINERFLAGS; +typedef struct tagQACONTAINER +{ + ULONG cbSize; + interface IOleClientSite *pClientSite; + interface IAdviseSinkEx *pAdviseSink; + interface IPropertyNotifySink *pPropertyNotifySink; + IUnknown *pUnkEventSink; + DWORD dwAmbientFlags; + OLE_COLOR colorFore; + OLE_COLOR colorBack; + interface IFont *pFont; + interface IOleUndoManager *pUndoMgr; + DWORD dwAppearance; + LONG lcid; + HPALETTE hpal; + interface IBindHost *pBindHost; + interface IOleControlSite *pOleControlSite; + interface IServiceProvider *pServiceProvider; +} QACONTAINER; +typedef struct tagQACONTROL +{ + ULONG cbSize; + DWORD dwMiscStatus; + DWORD dwViewStatus; + DWORD dwEventCookie; + DWORD dwPropNotifyCookie; + DWORD dwPointerActivationPolicy; +} QACONTROL; +typedef struct tagPOINTF { + float x; + float y; +} POINTF,*LPPOINTF; +typedef struct tagCONTROLINFO { + ULONG cb; + HACCEL hAccel; + USHORT cAccel; + DWORD dwFlags; +} CONTROLINFO,*LPCONTROLINFO; +typedef struct tagCONNECTDATA { + LPUNKNOWN pUnk; + DWORD dwCookie; +} CONNECTDATA,*LPCONNECTDATA; +typedef struct tagLICINFO { + long cbLicInfo; + BOOL fRuntimeKeyAvail; + BOOL fLicVerified; +} LICINFO,*LPLICINFO; +typedef struct tagCAUUID { + ULONG cElems; + GUID *pElems; +} CAUUID,*LPCAUUID; +typedef struct tagCALPOLESTR { + ULONG cElems; + LPOLESTR *pElems; +} CALPOLESTR,*LPCALPOLESTR; +typedef struct tagCADWORD { + ULONG cElems; + DWORD *pElems; +} CADWORD,*LPCADWORD; +typedef struct tagPROPPAGEINFO { + ULONG cb; + LPOLESTR pszTitle; + SIZE size; + LPOLESTR pszDocString; + LPOLESTR pszHelpFile; + DWORD dwHelpContext; +} PROPPAGEINFO,*LPPROPPAGEINFO; + +EXTERN_C const IID IID_IOleControl; +#undef INTERFACE +#define INTERFACE IOleControl +DECLARE_INTERFACE_(IOleControl,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetControlInfo)(THIS_ LPCONTROLINFO) PURE; + STDMETHOD(OnMnemonic)(THIS_ LPMSG) PURE; + STDMETHOD(OnAmbientPropertyChange)(THIS_ DISPID) PURE; + STDMETHOD(FreezeEvents)(THIS_ BOOL) PURE; +}; + +EXTERN_C const IID IID_IOleControlSite; +#undef INTERFACE +#define INTERFACE IOleControlSite +DECLARE_INTERFACE_(IOleControlSite,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(OnControlInfoChanged)(THIS) PURE; + STDMETHOD(LockInPlaceActive)(THIS_ BOOL) PURE; + STDMETHOD(GetExtendedControl)(THIS_ LPDISPATCH*) PURE; + STDMETHOD(TransformCoords)(THIS_ POINTL*,POINTF*,DWORD) PURE; + STDMETHOD(TranslateAccelerator)(THIS_ LPMSG,DWORD) PURE; + STDMETHOD(OnFocus)(THIS_ BOOL) PURE; + STDMETHOD(ShowPropertyFrame)(THIS) PURE; +}; + +#ifdef COBJMACROS +#define IOleControlSite_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IOleControlSite_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IOleControlSite_Release(T) (T)->lpVtbl->Release(T) +#define IOleControlSite_OnControlInfoChanged(T) (T)->lpVtbl->OnControlInfoChanged(T) +#define IOleControlSite_LockInPlaceActive(T,a) (T)->lpVtbl->LockInPlaceActive(T,a) +#define IOleControlSite_GetExtendedControl(T,a) (T)->lpVtbl->GetExtendedControl(T,a) +#define IOleControlSite_TransformCoords(T,a,b,c) (T)->lpVtbl->TransformCoords(T,a,b,c) +#define IOleControlSite_TranslateAccelerator(T,a,b) (T)->lpVtbl->TranslateAccelerator(T,a,b) +#define IOleControlSite_OnFocus(T,a) (T)->lpVtbl->OnFocus(T,a) +#define IOleControlSite_ShowPropertyFrame(T) (T)->lpVtbl->ShowPropertyFrame(T) +#endif + +EXTERN_C const IID IID_ISimpleFrameSite; +#undef INTERFACE +#define INTERFACE ISimpleFrameSite +DECLARE_INTERFACE_(ISimpleFrameSite,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(PreMessageFilter)(THIS_ HWND,UINT,WPARAM,LPARAM,LRESULT*,PDWORD) PURE; + STDMETHOD(PostMessageFilter)(THIS_ HWND,UINT,WPARAM,LPARAM,LRESULT*,DWORD) PURE; +}; + +EXTERN_C const IID IID_IErrorLog; +#undef INTERFACE +#define INTERFACE IErrorLog +DECLARE_INTERFACE_(IErrorLog,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(AddError)(THIS_ LPCOLESTR,LPEXCEPINFO) PURE; +}; + +EXTERN_C const IID IID_IPropertyBag; +#undef INTERFACE +#define INTERFACE IPropertyBag +DECLARE_INTERFACE_(IPropertyBag,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Read)(THIS_ LPCOLESTR,LPVARIANT,LPERRORLOG) PURE; + STDMETHOD(Write)(THIS_ LPCOLESTR,LPVARIANT) PURE; +}; + +EXTERN_C const IID IID_IPropertyBag2; +#undef INTERFACE +#define INTERFACE IPropertyBag2 +DECLARE_INTERFACE_(IPropertyBag2,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Read)(THIS_ ULONG,PROPBAG2*,LPERRORLOG,VARIANT*,HRESULT*) PURE; + STDMETHOD(Write)(THIS_ ULONG,PROPBAG2*,VARIANT*) PURE; + STDMETHOD(CountProperties)(THIS_ ULONG*) PURE; + STDMETHOD(GetPropertyInfo)(THIS_ ULONG,ULONG,PROPBAG2*,ULONG*) PURE; + STDMETHOD(LoadObject)(THIS_ LPCOLESTR,DWORD,IUnknown*,LPERRORLOG) PURE; +}; + +EXTERN_C const IID IID_IPersistPropertyBag; +#undef INTERFACE +#define INTERFACE IPersistPropertyBag +DECLARE_INTERFACE_(IPersistPropertyBag,IPersist) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetClassID)(THIS_ LPCLSID) PURE; + STDMETHOD(InitNew)(THIS) PURE; + STDMETHOD(Load)(THIS_ LPPROPERTYBAG,LPERRORLOG) PURE; + STDMETHOD(Save)(THIS_ LPPROPERTYBAG,BOOL,BOOL) PURE; +}; + +#ifdef COBJMACROS +#define IPersistPropertyBag_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IPersistPropertyBag_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IPersistPropertyBag_Release(T) (T)->lpVtbl->Release(T) +#define IPersistPropertyBag_GetClassID(T,a) (T)->lpVtbl->GetClassID(T,a) +#define IPersistPropertyBag_InitNew(T) (T)->lpVtbl->InitNew(T) +#define IPersistPropertyBag_Load(T,a,b) (T)->lpVtbl->Load(T,a,b) +#define IPersistPropertyBag_Save(T,a,b,c) (T)->lpVtbl->Save(T,a,b,c) +#endif + +EXTERN_C const IID IID_IPersistPropertyBag2; +#undef INTERFACE +#define INTERFACE IPersistPropertyBag2 +DECLARE_INTERFACE_(IPersistPropertyBag2,IPersist) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetClassID)(THIS_ LPCLSID) PURE; + STDMETHOD(InitNew)(THIS) PURE; + STDMETHOD(Load)(THIS_ LPPROPERTYBAG2,LPERRORLOG) PURE; + STDMETHOD(Save)(THIS_ LPPROPERTYBAG2,BOOL,BOOL) PURE; + STDMETHOD(IsDirty)(THIS) PURE; +}; + +#ifdef COBJMACROS +#define IPersistPropertyBag2_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IPersistPropertyBag2_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IPersistPropertyBag2_Release(T) (T)->lpVtbl->Release(T) +#define IPersistPropertyBag2_GetClassID(T,a) (T)->lpVtbl->GetClassID(T,a) +#define IPersistPropertyBag2_InitNew(T) (T)->lpVtbl->InitNew(T) +#define IPersistPropertyBag2_Load(T,a,b) (T)->lpVtbl->Load(T,a,b) +#define IPersistPropertyBag2_Save(T,a,b,c) (T)->lpVtbl->Save(T,a,b,c) +#define IPersistPropertyBag2_IsDirty(T) (T)->lpVtbl->IsDirty(T) +#endif + +EXTERN_C const IID IID_IPersistStreamInit; +#undef INTERFACE +#define INTERFACE IPersistStreamInit +DECLARE_INTERFACE_(IPersistStreamInit,IPersist) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetClassID)(THIS_ LPCLSID) PURE; + STDMETHOD(IsDirty)(THIS) PURE; + STDMETHOD(Load)(THIS_ LPSTREAM) PURE; + STDMETHOD(Save)(THIS_ LPSTREAM,BOOL) PURE; + STDMETHOD(GetSizeMax)(THIS_ PULARGE_INTEGER) PURE; + STDMETHOD(InitNew)(THIS) PURE; +}; + +EXTERN_C const IID IID_IPersistMemory; +#undef INTERFACE +#define INTERFACE IPersistMemory +DECLARE_INTERFACE_(IPersistMemory,IPersist) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetClassID)(THIS_ LPCLSID) PURE; + STDMETHOD(IsDirty)(THIS) PURE; + STDMETHOD(Load)(THIS_ PVOID,ULONG) PURE; + STDMETHOD(Save)(THIS_ PVOID,BOOL,ULONG) PURE; + STDMETHOD(GetSizeMax)(THIS_ PULONG) PURE; + STDMETHOD(InitNew)(THIS) PURE; +}; + +EXTERN_C const IID IID_IPropertyNotifySink; +#undef INTERFACE +#define INTERFACE IPropertyNotifySink +DECLARE_INTERFACE_(IPropertyNotifySink,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(OnChanged)(THIS_ DISPID) PURE; + STDMETHOD(OnRequestEdit)(THIS_ DISPID) PURE; +}; + +#ifdef COBJMACROS +#define IPropertyNotifySink_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IPropertyNotifySink_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IPropertyNotifySink_Release(T) (T)->lpVtbl->Release(T) +#define IPropertyNotifySink_OnChanged(T,a) (T)->lpVtbl->OnChanged(T,a) +#define IPropertyNotifySink_OnRequestEdit(T,a) (T)->lpVtbl->OnRequestEdit(T,a) +#endif + +EXTERN_C const IID IID_IProvideClassInfo; +#undef INTERFACE +#define INTERFACE IProvideClassInfo +DECLARE_INTERFACE_(IProvideClassInfo,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetClassInfo)(THIS_ LPTYPEINFO*) PURE; +}; + +EXTERN_C const IID IID_IProvideClassInfo2; +#undef INTERFACE +#define INTERFACE IProvideClassInfo2 +DECLARE_INTERFACE_(IProvideClassInfo2,IProvideClassInfo) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetClassInfo)(THIS_ LPTYPEINFO*) PURE; + STDMETHOD(GetGUID)(THIS_ DWORD,GUID*) PURE; +}; + +EXTERN_C const IID IID_IConnectionPointContainer; +#undef INTERFACE +#define INTERFACE IConnectionPointContainer +DECLARE_INTERFACE_(IConnectionPointContainer,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(EnumConnectionPoints)(THIS_ LPENUMCONNECTIONPOINTS*) PURE; + STDMETHOD(FindConnectionPoint)(THIS_ REFIID,LPCONNECTIONPOINT*) PURE; +}; + +#ifdef COBJMACROS +#define IConnectionPointContainer_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IConnectionPointContainer_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IConnectionPointContainer_Release(T) (T)->lpVtbl->Release(T) +#define IConnectionPointContainer_EnumConnectionPoints(T,a) (T)->lpVtbl->EnumConnectionPoints(T,a) +#define IConnectionPointContainer_FindConnectionPoint(T,a,b) (T)->lpVtbl->FindConnectionPoint(T,a,b) +#endif + +EXTERN_C const IID IID_IEnumConnectionPoints; +#undef INTERFACE +#define INTERFACE IEnumConnectionPoints +DECLARE_INTERFACE_(IEnumConnectionPoints,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Next)(THIS_ ULONG,LPCONNECTIONPOINT*,ULONG*) PURE; + STDMETHOD(Skip)(THIS_ ULONG) PURE; + STDMETHOD(Reset)(THIS) PURE; + STDMETHOD(Clone)(THIS_ LPENUMCONNECTIONPOINTS*) PURE; +}; + +EXTERN_C const IID IID_IConnectionPoint; +#undef INTERFACE +#define INTERFACE IConnectionPoint +DECLARE_INTERFACE_(IConnectionPoint,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetConnectionInterface)(THIS_ IID*) PURE; + STDMETHOD(GetConnectionPointContainer)(THIS_ IConnectionPointContainer**) PURE; + STDMETHOD(Advise)(THIS_ LPUNKNOWN,PDWORD) PURE; + STDMETHOD(Unadvise)(THIS_ DWORD) PURE; + STDMETHOD(EnumConnections)(THIS_ LPENUMCONNECTIONS*) PURE; +}; + +#ifdef COBJMACROS +#define IConnectionPoint_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IConnectionPoint_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IConnectionPoint_Release(T) (T)->lpVtbl->Release(T) +#define IConnectionPoint_GetConnectionInterface(T,a) (T)->lpVtbl->GetConnectionInterface(T,a) +#define IConnectionPoint_GetConnectionPointContainer(T,a) (T)->lpVtbl->GetConnectionPointContainer(T,a) +#define IConnectionPoint_Advise(T,a,b) (T)->lpVtbl->Advise(T,a,b) +#define IConnectionPoint_Unadvise(T,a) (T)->lpVtbl->Unadvise(T,a) +#define IConnectionPoint_EnumConnections(T,a) (T)->lpVtbl->EnumConnections(T,a) +#endif + +EXTERN_C const IID IID_IEnumConnections; +#undef INTERFACE +#define INTERFACE IEnumConnections +DECLARE_INTERFACE_(IEnumConnections,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Next)(THIS_ ULONG,LPCONNECTDATA,PULONG) PURE; + STDMETHOD(Skip)(THIS_ ULONG) PURE; + STDMETHOD(Reset)(THIS) PURE; + STDMETHOD(Clone)(THIS_ LPENUMCONNECTIONS*) PURE; +}; + +#ifdef COBJMACROS +#define IEnumConnections_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IEnumConnections_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IEnumConnections_Release(T) (T)->lpVtbl->Release(T) +#define IEnumConnections_Next(T,a,b,c) (T)->lpVtbl->Next(T,a,b,c) +#define IEnumConnections_Skip(T,a) (T)->lpVtbl->Skip(T,a) +#define IEnumConnections_Reset(T) (T)->lpVtbl->Reset(T) +#define IEnumConnections_Clone(T,a) (T)->lpVtbl->Clone(T,a) +#endif + +EXTERN_C const IID IID_IClassFactory2; +#undef INTERFACE +#define INTERFACE IClassFactory2 +DECLARE_INTERFACE_(IClassFactory2,IClassFactory) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(CreateInstance)(THIS_ LPUNKNOWN,REFIID,PVOID*) PURE; + STDMETHOD(LockServer)(THIS_ BOOL) PURE; + STDMETHOD(GetLicInfo)(THIS_ LPLICINFO) PURE; + STDMETHOD(RequestLicKey)(THIS_ DWORD,BSTR*) PURE; + STDMETHOD(CreateInstanceLic)(THIS_ LPUNKNOWN,LPUNKNOWN,REFIID,BSTR,PVOID*) PURE; +}; + +EXTERN_C const IID IID_ISpecifyPropertyPages; +#undef INTERFACE +#define INTERFACE ISpecifyPropertyPages +DECLARE_INTERFACE_(ISpecifyPropertyPages,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetPages)(THIS_ CAUUID*) PURE; +}; + +EXTERN_C const IID IID_IPerPropertyBrowsing; +#undef INTERFACE +#define INTERFACE IPerPropertyBrowsing +DECLARE_INTERFACE_(IPerPropertyBrowsing,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetDisplayString)(THIS_ DISPID,BSTR*) PURE; + STDMETHOD(MapPropertyToPage)(THIS_ DISPID,LPCLSID) PURE; + STDMETHOD(GetPredefinedStrings)(THIS_ DISPID,CALPOLESTR*,CADWORD*) PURE; + STDMETHOD(GetPredefinedValue)(THIS_ DISPID,DWORD,VARIANT*) PURE; +}; + +EXTERN_C const IID IID_IPropertyPageSite; +#undef INTERFACE +#define INTERFACE IPropertyPageSite +DECLARE_INTERFACE_(IPropertyPageSite,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(OnStatusChange)(THIS_ DWORD) PURE; + STDMETHOD(GetLocaleID)(THIS_ LCID*) PURE; + STDMETHOD(GetPageContainer)(THIS_ LPUNKNOWN*) PURE; + STDMETHOD(TranslateAccelerator)(THIS_ LPMSG) PURE; +}; + +EXTERN_C const IID IID_IPropertyPage; +#undef INTERFACE +#define INTERFACE IPropertyPage +DECLARE_INTERFACE_(IPropertyPage,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(SetPageSite)(THIS_ LPPROPERTYPAGESITE) PURE; + STDMETHOD(Activate)(THIS_ HWND,LPCRECT,BOOL) PURE; + STDMETHOD(Deactivate)(THIS) PURE; + STDMETHOD(GetPageInfo)(THIS_ LPPROPPAGEINFO) PURE; + STDMETHOD(SetObjects)(THIS_ ULONG,LPUNKNOWN*) PURE; + STDMETHOD(Show)(THIS_ UINT) PURE; + STDMETHOD(Move)(THIS_ LPCRECT) PURE; + STDMETHOD(IsPageDirty)(THIS) PURE; + STDMETHOD(Apply)(THIS) PURE; + STDMETHOD(Help)(THIS_ LPCOLESTR) PURE; + STDMETHOD(TranslateAccelerator)(THIS_ LPMSG) PURE; +}; + +EXTERN_C const IID IID_IPropertyPage2; +#undef INTERFACE +#define INTERFACE IPropertyPage2 +DECLARE_INTERFACE_(IPropertyPage2,IPropertyPage) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(SetPageSite)(THIS_ LPPROPERTYPAGESITE) PURE; + STDMETHOD(Activate)(THIS_ HWND,LPCRECT,BOOL) PURE; + STDMETHOD(Deactivate)(THIS) PURE; + STDMETHOD(GetPageInfo)(THIS_ LPPROPPAGEINFO) PURE; + STDMETHOD(SetObjects)(THIS_ ULONG,LPUNKNOWN*) PURE; + STDMETHOD(Show)(THIS_ UINT) PURE; + STDMETHOD(Move)(THIS_ LPCRECT) PURE; + STDMETHOD(IsPageDirty)(THIS) PURE; + STDMETHOD(Apply)(THIS) PURE; + STDMETHOD(Help)(THIS_ LPCOLESTR) PURE; + STDMETHOD(TranslateAccelerator)(THIS_ LPMSG) PURE; + STDMETHOD(EditProperty)(THIS_ DISPID) PURE; +}; + +EXTERN_C const IID IID_IFont; +#undef INTERFACE +#define INTERFACE IFont +DECLARE_INTERFACE_(IFont,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(get_Name)(THIS_ BSTR*) PURE; + STDMETHOD(put_Name)(THIS_ BSTR) PURE; + STDMETHOD(get_Size)(THIS_ CY*) PURE; + STDMETHOD(put_Size)(THIS_ CY) PURE; + STDMETHOD(get_Bold)(THIS_ BOOL*) PURE; + STDMETHOD(put_Bold)(THIS_ BOOL) PURE; + STDMETHOD(get_Italic)(THIS_ BOOL*) PURE; + STDMETHOD(put_Italic)(THIS_ BOOL) PURE; + STDMETHOD(get_Underline)(THIS_ BOOL*) PURE; + STDMETHOD(put_Underline)(THIS_ BOOL) PURE; + STDMETHOD(get_Strikethrough)(THIS_ BOOL*) PURE; + STDMETHOD(put_Strikethrough)(THIS_ BOOL) PURE; + STDMETHOD(get_Weight)(THIS_ short*) PURE; + STDMETHOD(put_Weight)(THIS_ short) PURE; + STDMETHOD(get_Charset)(THIS_ short*) PURE; + STDMETHOD(put_Charset)(THIS_ short) PURE; + STDMETHOD(get_hFont)(THIS_ HFONT*) PURE; + STDMETHOD(Clone)(THIS_ IFont**) PURE; + STDMETHOD(IsEqual)(THIS_ IFont*) PURE; + STDMETHOD(SetRatio)(THIS_ long,long) PURE; + STDMETHOD(QueryTextMetrics)(THIS_ LPTEXTMETRICOLE) PURE; + STDMETHOD(AddRefHfont)(THIS_ HFONT) PURE; + STDMETHOD(ReleaseHfont)(THIS_ HFONT) PURE; + STDMETHOD(SetHdc)(THIS_ HDC) PURE; +}; + +EXTERN_C const IID IID_IFontDisp; +#undef INTERFACE +#define INTERFACE IFontDisp +DECLARE_INTERFACE_(IFontDisp,IDispatch) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetTypeInfoCount)(THIS_ UINT*) PURE; + STDMETHOD(GetTypeInfo)(THIS_ UINT,LCID,LPTYPEINFO*) PURE; + STDMETHOD(GetIDsOfNames)(THIS_ REFIID,LPOLESTR*,UINT,LCID,DISPID*) PURE; + STDMETHOD(Invoke)(THIS_ DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*) PURE; +}; + +EXTERN_C const IID IID_IPicture; +#undef INTERFACE +#define INTERFACE IPicture +DECLARE_INTERFACE_(IPicture,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(get_Handle)(THIS_ OLE_HANDLE*) PURE; + STDMETHOD(get_hPal)(THIS_ OLE_HANDLE*) PURE; + STDMETHOD(get_Type)(THIS_ short*) PURE; + STDMETHOD(get_Width)(THIS_ OLE_XSIZE_HIMETRIC*) PURE; + STDMETHOD(get_Height)(THIS_ OLE_YSIZE_HIMETRIC*) PURE; + STDMETHOD(Render)(THIS_ HDC,long,long,long,long,OLE_XPOS_HIMETRIC,OLE_YPOS_HIMETRIC,OLE_XSIZE_HIMETRIC,OLE_YSIZE_HIMETRIC,LPCRECT) PURE; + STDMETHOD(set_hPal)(THIS_ OLE_HANDLE) PURE; + STDMETHOD(get_CurDC)(THIS_ HDC*) PURE; + STDMETHOD(SelectPicture)(THIS_ HDC,HDC*,OLE_HANDLE*) PURE; + STDMETHOD(get_KeepOriginalFormat)(THIS_ BOOL*) PURE; + STDMETHOD(put_KeepOriginalFormat)(THIS_ BOOL) PURE; + STDMETHOD(PictureChanged)(THIS) PURE; + STDMETHOD(SaveAsFile)(THIS_ LPSTREAM,BOOL,LONG*) PURE; + STDMETHOD(get_Attributes)(THIS_ PDWORD) PURE; +}; + +EXTERN_C const IID IID_IPictureDisp; +#undef INTERFACE +#define INTERFACE IPictureDisp +DECLARE_INTERFACE_(IPictureDisp,IDispatch) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetTypeInfoCount)(THIS_ UINT*) PURE; + STDMETHOD(GetTypeInfo)(THIS_ UINT,LCID,LPTYPEINFO*) PURE; + STDMETHOD(GetIDsOfNames)(THIS_ REFIID,LPOLESTR*,UINT,LCID,DISPID*) PURE; + STDMETHOD(Invoke)(THIS_ DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*) PURE; +}; + +EXTERN_C const IID IID_IOleInPlaceSiteEx; +#undef INTERFACE +#define INTERFACE IOleInPlaceSiteEx +DECLARE_INTERFACE_(IOleInPlaceSiteEx,IOleInPlaceSite) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetWindow)(THIS_ HWND*) PURE; + STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL) PURE; + STDMETHOD(CanInPlaceActivate)(THIS) PURE; + STDMETHOD(OnInPlaceActivate)(THIS) PURE; + STDMETHOD(OnUIActivate)(THIS) PURE; + STDMETHOD(GetWindowContext)(THIS_ IOleInPlaceFrame**,IOleInPlaceUIWindow**,LPRECT,LPRECT,LPOLEINPLACEFRAMEINFO) PURE; + STDMETHOD(Scroll)(THIS_ SIZE) PURE; + STDMETHOD(OnUIDeactivate)(THIS_ BOOL) PURE; + STDMETHOD(OnInPlaceDeactivate)(THIS) PURE; + STDMETHOD(DiscardUndoState)(THIS) PURE; + STDMETHOD(DeactivateAndUndo)(THIS) PURE; + STDMETHOD(OnPosRectChange)(THIS_ LPCRECT) PURE; + STDMETHOD(OnInPlaceActivateEx)(THIS_ BOOL*,DWORD) PURE; + STDMETHOD(OnInPlaceDeactivateEx)(THIS_ BOOL) PURE; + STDMETHOD(RequestUIActivate)(THIS) PURE; +}; + +EXTERN_C const IID IID_IObjectWithSite; +#undef INTERFACE +#define INTERFACE IObjectWithSite +DECLARE_INTERFACE_(IObjectWithSite,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(SetSite)(THIS_ IUnknown*) PURE; + STDMETHOD(GetSite)(THIS_ REFIID, void**) PURE; +}; + +EXTERN_C const IID IID_IOleInPlaceSiteWindowless; +#undef INTERFACE +#define INTERFACE IOleInPlaceSiteWindowless +DECLARE_INTERFACE_(IOleInPlaceSiteWindowless,IOleInPlaceSiteEx) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetWindow)(THIS_ HWND*) PURE; + STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL) PURE; + STDMETHOD(CanInPlaceActivate)(THIS) PURE; + STDMETHOD(OnInPlaceActivate)(THIS) PURE; + STDMETHOD(OnUIActivate)(THIS) PURE; + STDMETHOD(GetWindowContext)(THIS_ IOleInPlaceFrame**,IOleInPlaceUIWindow**,LPRECT,LPRECT,LPOLEINPLACEFRAMEINFO) PURE; + STDMETHOD(Scroll)(THIS_ SIZE) PURE; + STDMETHOD(OnUIDeactivate)(THIS_ BOOL) PURE; + STDMETHOD(OnInPlaceDeactivate)(THIS) PURE; + STDMETHOD(DiscardUndoState)(THIS) PURE; + STDMETHOD(DeactivateAndUndo)(THIS) PURE; + STDMETHOD(OnPosRectChange)(THIS_ LPCRECT) PURE; + + STDMETHOD(OnInPlaceActivateEx)(THIS_ BOOL*,DWORD) PURE; + STDMETHOD(OnInPlaceDeactivateEx)(THIS_ BOOL) PURE; + STDMETHOD(RequestUIActivate)(THIS) PURE; + + STDMETHOD(CanWindowlessActivate)(THIS) PURE; + STDMETHOD(GetCapture)(THIS) PURE; + STDMETHOD(SetCapture)(THIS_ BOOL) PURE; + STDMETHOD(GetFocus)(THIS) PURE; + STDMETHOD(SetFocus)(THIS_ BOOL) PURE; + STDMETHOD(GetDC)(THIS_ LPCRECT,DWORD,HDC*) PURE; + STDMETHOD(ReleaseDC)(THIS_ HDC) PURE; + STDMETHOD(InvalidateRect)(THIS_ LPCRECT,BOOL) PURE; + STDMETHOD(InvalidateRgn)(THIS_ HRGN,BOOL) PURE; + STDMETHOD(ScrollRect)(THIS_ INT,INT,LPCRECT,LPCRECT) PURE; + STDMETHOD(AdjustRect)(THIS_ LPCRECT) PURE; + STDMETHOD(OnDefWindowMessage)(THIS_ UINT,WPARAM,LPARAM,LRESULT*) PURE; +}; + +EXTERN_C const IID IID_IAdviseSinkEx; +#undef INTERFACE +#define INTERFACE IAdviseSinkEx +DECLARE_INTERFACE_(IAdviseSinkEx,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD_(void,OnDataChange)(THIS_ FORMATETC*,STGMEDIUM*) PURE; + STDMETHOD_(void,OnViewChange)(THIS_ DWORD,LONG) PURE; + STDMETHOD_(void,OnRename)(THIS_ IMoniker*) PURE; + STDMETHOD_(void,OnSave)(THIS) PURE; + STDMETHOD_(void,OnClose)(THIS) PURE; + STDMETHOD(OnViewStatusChange)(THIS_ DWORD) PURE; +}; + +EXTERN_C const IID IID_IPointerInactive; +#undef INTERFACE +#define INTERFACE IPointerInactive +DECLARE_INTERFACE_(IPointerInactive,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetActivationPolicy)(THIS_ DWORD*) PURE; + STDMETHOD(OnInactiveMouseMove)(THIS_ LPCRECT,LONG,LONG,DWORD) PURE; + STDMETHOD(OnInactiveSetCursor)(THIS_ LPCRECT,LONG,LONG,DWORD,BOOL) PURE; +}; + +EXTERN_C const IID IID_IOleUndoUnit; +#undef INTERFACE +#define INTERFACE IOleUndoUnit +DECLARE_INTERFACE_(IOleUndoUnit,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Do)(THIS_ LPOLEUNDOMANAGER) PURE; + STDMETHOD(GetDescription)(THIS_ BSTR*) PURE; + STDMETHOD(GetUnitType)(THIS_ CLSID*,LONG*) PURE; + STDMETHOD(OnNextAdd)(THIS) PURE; +}; + +EXTERN_C const IID IID_IOleParentUndoUnit; +#undef INTERFACE +#define INTERFACE IOleParentUndoUnit +DECLARE_INTERFACE_(IOleParentUndoUnit,IOleUndoUnit) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Do)(THIS_ LPOLEUNDOMANAGER) PURE; + STDMETHOD(GetDescription)(THIS_ BSTR*) PURE; + STDMETHOD(GetUnitType)(THIS_ CLSID*,LONG*) PURE; + STDMETHOD(OnNextAdd)(THIS) PURE; + STDMETHOD(Open)(THIS_ IOleParentUndoUnit*) PURE; + STDMETHOD(Close)(THIS_ IOleParentUndoUnit*,BOOL) PURE; + STDMETHOD(Add)(THIS_ IOleUndoUnit*) PURE; + STDMETHOD(FindUnit)(THIS_ IOleUndoUnit*) PURE; + STDMETHOD(GetParentState)(THIS_ DWORD*) PURE; +}; + +EXTERN_C const IID IID_IEnumOleUndoUnits; +#undef INTERFACE +#define INTERFACE IEnumOleUndoUnits +DECLARE_INTERFACE_(IEnumOleUndoUnits,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Next)(THIS_ ULONG,IOleUndoUnit**,ULONG*) PURE; + STDMETHOD(Skip)(THIS_ ULONG) PURE; + STDMETHOD(Reset)(THIS) PURE; + STDMETHOD(Clone)(THIS_ IEnumOleUndoUnits**) PURE; +}; + +EXTERN_C const IID IID_IOleUndoManager; +#undef INTERFACE +#define INTERFACE IOleUndoManager +DECLARE_INTERFACE_(IOleUndoManager,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Open)(THIS_ IOleParentUndoUnit*) PURE; + STDMETHOD(Close)(THIS_ IOleParentUndoUnit*,BOOL) PURE; + STDMETHOD(Add)(THIS_ IOleUndoUnit*) PURE; + STDMETHOD(GetOpenParentState)(THIS_ DWORD*) PURE; + STDMETHOD(DiscardFrom)(THIS_ IOleUndoUnit*) PURE; + STDMETHOD(UndoTo)(THIS_ IOleUndoUnit*) PURE; + STDMETHOD(RedoTo)(THIS_ IOleUndoUnit*) PURE; + STDMETHOD(EnumUndoable)(THIS_ IEnumOleUndoUnits**) PURE; + STDMETHOD(EnumRedoable)(THIS_ IEnumOleUndoUnits**) PURE; + STDMETHOD(GetLastUndoDescription)(THIS_ BSTR*) PURE; + STDMETHOD(GetLastRedoDescription)(THIS_ BSTR*) PURE; + STDMETHOD(Enable)(THIS_ BOOL) PURE; +}; + +EXTERN_C const IID IID_IQuickActivate; +#undef INTERFACE +#define INTERFACE IQuickActivate +DECLARE_INTERFACE_(IQuickActivate,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(QuickActivate)(THIS_ QACONTAINER*,QACONTROL*) PURE; + STDMETHOD(SetContentExtent)(THIS_ LPSIZEL) PURE; + STDMETHOD(GetContentExtent)(THIS_ LPSIZEL) PURE; +}; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/odbcinst.h b/reactos/w32api/include/odbcinst.h new file mode 100644 index 00000000000..b90464f272a --- /dev/null +++ b/reactos/w32api/include/odbcinst.h @@ -0,0 +1,148 @@ +#ifndef _ODBCINST_H +#define _ODBCINST_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif +#include <sql.h> +#ifdef __cplusplus +extern "C" { +#endif +#ifndef ODBCVER +#define ODBCVER 0x0351 +#endif +#define INSTAPI __stdcall +#define ODBC_ADD_DSN 1 +#define ODBC_CONFIG_DSN 2 +#define ODBC_REMOVE_DSN 3 +#if (ODBCVER >= 0x0250) +#define ODBC_ADD_SYS_DSN 4 +#define ODBC_CONFIG_SYS_DSN 5 +#define ODBC_REMOVE_SYS_DSN 6 +#define ODBC_INSTALL_INQUIRY 1 +#define ODBC_INSTALL_COMPLETE 2 +#define ODBC_INSTALL_DRIVER 1 +#define ODBC_REMOVE_DRIVER 2 +#define ODBC_CONFIG_DRIVER 3 +#define ODBC_CONFIG_DRIVER_MAX 100 +#endif /* (ODBCVER >= 0x0250) */ +#if (ODBCVER >= 0x0300) +#define ODBC_REMOVE_DEFAULT_DSN 7 +#define ODBC_BOTH_DSN 0 +#define ODBC_USER_DSN 1 +#define ODBC_SYSTEM_DSN 2 +#define ODBC_ERROR_GENERAL_ERR 1 +#define ODBC_ERROR_INVALID_BUFF_LEN 2 +#define ODBC_ERROR_INVALID_HWND 3 +#define ODBC_ERROR_INVALID_STR 4 +#define ODBC_ERROR_INVALID_REQUEST_TYPE 5 +#define ODBC_ERROR_COMPONENT_NOT_FOUND 6 +#define ODBC_ERROR_INVALID_NAME 7 +#define ODBC_ERROR_INVALID_KEYWORD_VALUE 8 +#define ODBC_ERROR_INVALID_DSN 9 +#define ODBC_ERROR_INVALID_INF 10 +#define ODBC_ERROR_REQUEST_FAILED 11 +#define ODBC_ERROR_INVALID_PATH 12 +#define ODBC_ERROR_LOAD_LIB_FAILED 13 +#define ODBC_ERROR_INVALID_PARAM_SEQUENCE 14 +#define ODBC_ERROR_INVALID_LOG_FILE 15 +#define ODBC_ERROR_USER_CANCELED 16 +#define ODBC_ERROR_USAGE_UPDATE_FAILED 17 +#define ODBC_ERROR_CREATE_DSN_FAILED 18 +#define ODBC_ERROR_WRITING_SYSINFO_FAILED 19 +#define ODBC_ERROR_REMOVE_DSN_FAILED 20 +#define ODBC_ERROR_OUT_OF_MEM 21 +#define ODBC_ERROR_OUTPUT_STRING_TRUNCATED 22 +#endif /* ODBCVER >= 0x0300 */ + +#ifndef RC_INVOKED +BOOL INSTAPI ConfigDSN(HWND,WORD,LPCSTR,LPCSTR); +BOOL INSTAPI ConfigDSNW(HWND,WORD,LPCWSTR,LPCWSTR); +BOOL INSTAPI ConfigTranslator(HWND,DWORD*); +BOOL INSTAPI SQLConfigDataSource(HWND,WORD,LPCSTR,LPCSTR); +BOOL INSTAPI SQLConfigDataSourceW(HWND,WORD,LPCWSTR,LPCWSTR); +BOOL INSTAPI SQLCreateDataSource(HWND,LPCSTR); +BOOL INSTAPI SQLCreateDataSourceW(HWND,LPCWSTR); +BOOL INSTAPI SQLGetAvailableDrivers(LPCSTR,LPSTR,WORD,WORD*); +BOOL INSTAPI SQLGetAvailableDriversW(LPCWSTR,LPWSTR,WORD,WORD*); +BOOL INSTAPI SQLGetInstalledDrivers(LPSTR,WORD,WORD*); +BOOL INSTAPI SQLGetInstalledDriversW(LPWSTR,WORD,WORD*); +int INSTAPI SQLGetPrivateProfileString(LPCSTR,LPCSTR,LPCSTR,LPSTR,int,LPCSTR); +int INSTAPI SQLGetPrivateProfileStringW(LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,int,LPCWSTR); +BOOL INSTAPI SQLGetTranslator(HWND,LPSTR,WORD,WORD*,LPSTR,WORD,WORD*,DWORD*); +BOOL INSTAPI SQLGetTranslatorW(HWND,LPWSTR,WORD,WORD*,LPWSTR,WORD,WORD*,DWORD*); +BOOL INSTAPI SQLInstallDriver(LPCSTR,LPCSTR,LPSTR,WORD,WORD*); +BOOL INSTAPI SQLInstallDriverManager(LPSTR,WORD,WORD*); +BOOL INSTAPI SQLInstallDriverManagerW(LPWSTR,WORD,WORD*); +BOOL INSTAPI SQLInstallDriverW(LPCWSTR,LPCWSTR,LPWSTR,WORD,WORD*); +BOOL INSTAPI SQLInstallODBC(HWND,LPCSTR,LPCSTR,LPCSTR); +BOOL INSTAPI SQLInstallODBCW(HWND,LPCWSTR,LPCWSTR,LPCWSTR); +BOOL INSTAPI SQLManageDataSources(HWND); +BOOL INSTAPI SQLRemoveDefaultDataSource(void); +BOOL INSTAPI SQLRemoveDSNFromIni(LPCSTR); +BOOL INSTAPI SQLRemoveDSNFromIniW(LPCWSTR); +BOOL INSTAPI SQLValidDSN(LPCSTR); +BOOL INSTAPI SQLValidDSNW(LPCWSTR); +BOOL INSTAPI SQLWriteDSNToIni(LPCSTR,LPCSTR); +BOOL INSTAPI SQLWriteDSNToIniW(LPCWSTR,LPCWSTR); +BOOL INSTAPI SQLWritePrivateProfileString(LPCSTR,LPCSTR,LPCSTR,LPCSTR); +BOOL INSTAPI SQLWritePrivateProfileStringW(LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR); +#if(ODBCVER >= 0x0250) +BOOL INSTAPI ConfigDriver(HWND,WORD,LPCSTR,LPCSTR,LPSTR,WORD,WORD*); +BOOL INSTAPI ConfigDriverW(HWND,WORD,LPCWSTR,LPCWSTR,LPWSTR,WORD,WORD*); +BOOL INSTAPI SQLConfigDriver(HWND,WORD,LPCSTR,LPCSTR,LPSTR,WORD,WORD*); +BOOL INSTAPI SQLConfigDriverW(HWND,WORD,LPCWSTR,LPCWSTR,LPWSTR,WORD,WORD*); +BOOL INSTAPI SQLInstallTranslator(LPCSTR,LPCSTR,LPCSTR,LPSTR,WORD,WORD*,WORD,LPDWORD); +BOOL INSTAPI SQLInstallTranslatorW(LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,WORD,WORD*,WORD,LPDWORD); +BOOL INSTAPI SQLRemoveDriver(LPCSTR,BOOL,LPDWORD); +BOOL INSTAPI SQLRemoveDriverManager(LPDWORD); +BOOL INSTAPI SQLRemoveDriverW(LPCWSTR,BOOL,LPDWORD); +BOOL INSTAPI SQLRemoveTranslator(LPCSTR,LPDWORD); +BOOL INSTAPI SQLRemoveTranslatorW(LPCWSTR,LPDWORD); +#endif /* ODBCVER >= 0x0250 */ +#if (ODBCVER >= 0x0300) +BOOL INSTAPI SQLGetConfigMode(UWORD*); +BOOL INSTAPI SQLInstallDriverEx(LPCSTR,LPCSTR,LPSTR,WORD,WORD*,WORD,LPDWORD); +BOOL INSTAPI SQLInstallDriverExW(LPCWSTR,LPCWSTR,LPWSTR,WORD,WORD*,WORD,LPDWORD); +SQLRETURN INSTAPI SQLInstallerError(WORD,DWORD*,LPSTR,WORD,WORD*); +SQLRETURN INSTAPI SQLInstallerErrorW(WORD,DWORD*,LPWSTR,WORD,WORD*); +BOOL INSTAPI SQLInstallTranslatorEx(LPCSTR,LPCSTR,LPSTR,WORD,WORD*,WORD,LPDWORD); +BOOL INSTAPI SQLInstallTranslatorExW(LPCWSTR,LPCWSTR,LPWSTR,WORD,WORD*,WORD,LPDWORD); +SQLRETURN INSTAPI SQLPostInstallerError(DWORD,LPCSTR); +SQLRETURN INSTAPI SQLPostInstallerErrorW(DWORD,LPCWSTR); +BOOL INSTAPI SQLReadFileDSN(LPCSTR,LPCSTR,LPCSTR,LPSTR,WORD,WORD*); +BOOL INSTAPI SQLReadFileDSNW(LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,WORD,WORD*); +BOOL INSTAPI SQLSetConfigMode(UWORD); +BOOL INSTAPI SQLWriteFileDSN(LPCSTR,LPCSTR,LPCSTR,LPCSTR); +BOOL INSTAPI SQLWriteFileDSNW(LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR); +#endif /* ODBCVER >= 0x0300 */ + +#if defined (UNICODE) && !defined (SQL_NOUNICODEMAP) +#define SQLConfigDataSource SQLConfigDataSourceW +#define SQLConfigDriver SQLConfigDriverW +#define SQLCreateDataSource SQLCreateDataSourceW +#define SQLGetAvailableDrivers SQLGetAvailableDriversW +#define SQLGetInstalledDrivers SQLGetInstalledDriversW +#define SQLGetPrivateProfileString SQLGetPrivateProfileStringW +#define SQLGetTranslator SQLGetTranslatorW +#define SQLInstallDriver SQLInstallDriverW +#define SQLInstallDriverEx SQLInstallDriverExW +#define SQLInstallDriverManager SQLInstallDriverManagerW +#define SQLInstallerError SQLInstallerErrorW +#define SQLInstallODBC SQLInstallODBCW +#define SQLInstallTranslator SQLInstallTranslatorW +#define SQLInstallTranslatorEx SQLInstallTranslatorExW +#define SQLPostInstallerError SQLPostInstallerErrorW +#define SQLReadFileDSN SQLReadFileDSNW +#define SQLRemoveDriver SQLRemoveDriverW +#define SQLRemoveDSNFromIni SQLRemoveDSNFromIniW +#define SQLRemoveTranslator SQLRemoveTranslatorW +#define SQLValidDSN SQLValidDSNW +#define SQLWriteDSNToIni SQLWriteDSNToIniW +#define SQLWriteFileDSN SQLWriteFileDSNW +#define SQLWritePrivateProfileString SQLWritePrivateProfileStringW +#endif /* UNICODE && !SQL_NOUNICODEMAP */ +#endif /* RC_INVOKED */ +#ifdef __cplusplus +} +#endif +#endif /* _ODBCINST_H */ diff --git a/reactos/w32api/include/ole.h b/reactos/w32api/include/ole.h new file mode 100644 index 00000000000..d2dd2020a92 --- /dev/null +++ b/reactos/w32api/include/ole.h @@ -0,0 +1,308 @@ +#ifndef _OLE_H +#define _OLE_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#ifdef STRICT +#define OLE_LPCSTR LPCSTR +#define OLE_CONST const +#else +#define OLE_LPCSTR LPSTR +#define OLE_CONST +#endif +#define LRESULT LONG +#define HGLOBAL HANDLE +#define OT_LINK 1L +#define OT_EMBEDDED 2L +#define OT_STATIC 3L +#define OLEVERB_PRIMARY 0 +#define OF_SET 1 +#define OF_GET 2 +#define OF_HANDLER 4 + +typedef struct _OLETARGETDEVICE { + USHORT otdDeviceNameOffset; + USHORT otdDriverNameOffset; + USHORT otdPortNameOffset; + USHORT otdExtDevmodeOffset; + USHORT otdExtDevmodeSize; + USHORT otdEnvironmentOffset; + USHORT otdEnvironmentSize; + BYTE otdData[1]; +} OLETARGETDEVICE; +typedef OLETARGETDEVICE *LPOLETARGETDEVICE; +typedef enum { +OLE_OK, +OLE_WAIT_FOR_RELEASE, +OLE_BUSY, +OLE_ERROR_PROTECT_ONLY, +OLE_ERROR_MEMORY, +OLE_ERROR_STREAM, +OLE_ERROR_STATIC, +OLE_ERROR_BLANK, +OLE_ERROR_DRAW, +OLE_ERROR_METAFILE, +OLE_ERROR_ABORT, +OLE_ERROR_CLIPBOARD, +OLE_ERROR_FORMAT, +OLE_ERROR_OBJECT, +OLE_ERROR_OPTION, +OLE_ERROR_PROTOCOL, +OLE_ERROR_ADDRESS, +OLE_ERROR_NOT_EQUAL, +OLE_ERROR_HANDLE, +OLE_ERROR_GENERIC, +OLE_ERROR_CLASS, +OLE_ERROR_SYNTAX, +OLE_ERROR_DATATYPE, +OLE_ERROR_PALETTE, +OLE_ERROR_NOT_LINK, +OLE_ERROR_NOT_EMPTY, +OLE_ERROR_SIZE, +OLE_ERROR_DRIVE, +OLE_ERROR_NETWORK, +OLE_ERROR_NAME, +OLE_ERROR_TEMPLATE, +OLE_ERROR_NEW, +OLE_ERROR_EDIT, +OLE_ERROR_OPEN, +OLE_ERROR_NOT_OPEN, +OLE_ERROR_LAUNCH, +OLE_ERROR_COMM, +OLE_ERROR_TERMINATE, +OLE_ERROR_COMMAND, +OLE_ERROR_SHOW, +OLE_ERROR_DOVERB, +OLE_ERROR_ADVISE_NATIVE, +OLE_ERROR_ADVISE_PICT, +OLE_ERROR_ADVISE_RENAME, +OLE_ERROR_POKE_NATIVE, +OLE_ERROR_REQUEST_NATIVE, +OLE_ERROR_REQUEST_PICT, +OLE_ERROR_SERVER_BLOCKED, +OLE_ERROR_REGISTRATION, +OLE_ERROR_ALREADY_REGISTERED, +OLE_ERROR_TASK, +OLE_ERROR_OUTOFDATE, +OLE_ERROR_CANT_UPDATE_CLIENT, +OLE_ERROR_UPDATE, +OLE_ERROR_SETDATA_FORMAT, +OLE_ERROR_STATIC_FROM_OTHER_OS, +OLE_ERROR_FILE_VER, +OLE_WARN_DELETE_DATA = 1000 +} OLESTATUS; +typedef enum { + OLE_CHANGED, + OLE_SAVED, + OLE_CLOSED, + OLE_RENAMED, + OLE_QUERY_PAINT, + OLE_RELEASE, + OLE_QUERY_RETRY +} OLE_NOTIFICATION; +typedef enum { + OLE_NONE, + OLE_DELETE, + OLE_LNKPASTE, + OLE_EMBPASTE, + OLE_SHOW, + OLE_RUN, + OLE_ACTIVATE, + OLE_UPDATE, + OLE_CLOSE, + OLE_RECONNECT, + OLE_SETUPDATEOPTIONS, + OLE_SERVERUNLAUNCH, + OLE_LOADFROMSTREAM, + OLE_SETDATA, + OLE_REQUESTDATA, + OLE_OTHER, + OLE_CREATE, + OLE_CREATEFROMTEMPLATE, + OLE_CREATELINKFROMFILE, + OLE_COPYFROMLNK, + OLE_CREATEFROMFILE, + OLE_CREATEINVISIBLE +} OLE_RELEASE_METHOD; +typedef enum { + olerender_none, + olerender_draw, + olerender_format + } OLEOPT_RENDER; +typedef WORD OLECLIPFORMAT; +typedef enum { + oleupdate_always, + oleupdate_onsave, +#ifdef OLE_INTERNAL + oleupdate_oncall, + oleupdate_onclose +#else + oleupdate_oncall +#endif +} OLEOPT_UPDATE; +typedef HANDLE HOBJECT; +typedef LONG LHSERVER; +typedef LONG LHCLIENTDOC; +typedef LONG LHSERVERDOC; +typedef struct _OLEOBJECT *LPOLEOBJECT; +typedef struct _OLESTREAM *LPOLESTREAM; +typedef struct _OLECLIENT *LPOLECLIENT; +typedef struct _OLEOBJECTVTBL { + void *(CALLBACK* QueryProtocol)(LPOLEOBJECT,OLE_LPCSTR); + OLESTATUS (CALLBACK* Release)(LPOLEOBJECT); + OLESTATUS (CALLBACK* Show)(LPOLEOBJECT,BOOL); + OLESTATUS (CALLBACK* DoVerb)(LPOLEOBJECT,UINT,BOOL,BOOL); + OLESTATUS (CALLBACK* GetData)(LPOLEOBJECT,OLECLIPFORMAT,HANDLE*); + OLESTATUS (CALLBACK* SetData)(LPOLEOBJECT,OLECLIPFORMAT,HANDLE); + OLESTATUS (CALLBACK* SetTargetDevice)(LPOLEOBJECT,HGLOBAL); + OLESTATUS (CALLBACK* SetBounds)(LPOLEOBJECT,OLE_CONST RECT*); + OLECLIPFORMAT (CALLBACK* EnumFormats)(LPOLEOBJECT,OLECLIPFORMAT); + OLESTATUS (CALLBACK* SetColorScheme)(LPOLEOBJECT,OLE_CONST LOGPALETTE*); +#ifndef SERVERONLY + OLESTATUS (CALLBACK* Delete)(LPOLEOBJECT); + OLESTATUS (CALLBACK* SetHostNames)(LPOLEOBJECT,OLE_LPCSTR,OLE_LPCSTR); + OLESTATUS (CALLBACK* SaveToStream)(LPOLEOBJECT,LPOLESTREAM); + OLESTATUS (CALLBACK* Clone)(LPOLEOBJECT,LPOLECLIENT,LHCLIENTDOC,OLE_LPCSTR,LPOLEOBJECT*); + OLESTATUS (CALLBACK* CopyFromLink)(LPOLEOBJECT,LPOLECLIENT,LHCLIENTDOC,OLE_LPCSTR,LPOLEOBJECT*); + OLESTATUS (CALLBACK* Equal)(LPOLEOBJECT,LPOLEOBJECT); + OLESTATUS (CALLBACK* CopyToClipboard)(LPOLEOBJECT); + OLESTATUS (CALLBACK* Draw)(LPOLEOBJECT,HDC,OLE_CONST RECT*,OLE_CONST RECT*,HDC); + OLESTATUS (CALLBACK* Activate)(LPOLEOBJECT,UINT,BOOL,BOOL,HWND,OLE_CONST RECT*); + OLESTATUS (CALLBACK* Execute)(LPOLEOBJECT,HGLOBAL,UINT); + OLESTATUS (CALLBACK* Close)(LPOLEOBJECT); + OLESTATUS (CALLBACK* Update)(LPOLEOBJECT); + OLESTATUS (CALLBACK* Reconnect)(LPOLEOBJECT); + OLESTATUS (CALLBACK* ObjectConvert)(LPOLEOBJECT,OLE_LPCSTR,LPOLECLIENT,LHCLIENTDOC,OLE_LPCSTR,LPOLEOBJECT*); + OLESTATUS (CALLBACK* GetLinkUpdateOptions)(LPOLEOBJECT,OLEOPT_UPDATE*); + OLESTATUS (CALLBACK* SetLinkUpdateOptions)(LPOLEOBJECT,OLEOPT_UPDATE); + OLESTATUS (CALLBACK* Rename)(LPOLEOBJECT,OLE_LPCSTR); + OLESTATUS (CALLBACK* QueryName)(LPOLEOBJECT,LPSTR,UINT*); + OLESTATUS (CALLBACK* QueryType)(LPOLEOBJECT,LONG*); + OLESTATUS (CALLBACK* QueryBounds)(LPOLEOBJECT,RECT*); + OLESTATUS (CALLBACK* QuerySize)(LPOLEOBJECT,DWORD*); + OLESTATUS (CALLBACK* QueryOpen)(LPOLEOBJECT); + OLESTATUS (CALLBACK* QueryOutOfDate)(LPOLEOBJECT); + OLESTATUS (CALLBACK* QueryReleaseStatus)(LPOLEOBJECT); + OLESTATUS (CALLBACK* QueryReleaseError)(LPOLEOBJECT); + OLE_RELEASE_METHOD (CALLBACK* QueryReleaseMethod)(LPOLEOBJECT); + OLESTATUS (CALLBACK* RequestData)(LPOLEOBJECT,OLECLIPFORMAT); + OLESTATUS (CALLBACK* ObjectLong)(LPOLEOBJECT,UINT,LONG*); + OLESTATUS (CALLBACK* ChangeData)(LPOLEOBJECT,HANDLE,LPOLECLIENT,BOOL); +#endif +} OLEOBJECTVTBL; +typedef OLEOBJECTVTBL*LPOLEOBJECTVTBL; +#ifndef OLE_INTERNAL +typedef struct _OLEOBJECT { LPOLEOBJECTVTBL lpvtbl; } OLEOBJECT; +#endif +typedef struct _OLECLIENTVTBL { int (CALLBACK* CallBack)(LPOLECLIENT,OLE_NOTIFICATION,LPOLEOBJECT); } OLECLIENTVTBL; +typedef OLECLIENTVTBL *LPOLECLIENTVTBL; +typedef struct _OLECLIENT { LPOLECLIENTVTBL lpvtbl; } OLECLIENT; +typedef struct _OLESTREAMVTBL { + DWORD (CALLBACK* Get)(LPOLESTREAM,void*,DWORD); + DWORD (CALLBACK* Put)(LPOLESTREAM,OLE_CONST void*,DWORD); +} OLESTREAMVTBL; +typedef OLESTREAMVTBL *LPOLESTREAMVTBL; +typedef struct _OLESTREAM { LPOLESTREAMVTBL lpstbl; } OLESTREAM; +typedef enum { + OLE_SERVER_MULTI, + OLE_SERVER_SINGLE +} OLE_SERVER_USE; +typedef struct _OLESERVER *LPOLESERVER; +typedef struct _OLESERVERDOC *LPOLESERVERDOC; +typedef struct _OLESERVERVTBL { + OLESTATUS (CALLBACK* Open)(LPOLESERVER,LHSERVERDOC,OLE_LPCSTR,LPOLESERVERDOC*); + OLESTATUS (CALLBACK* Create)(LPOLESERVER,LHSERVERDOC,OLE_LPCSTR,OLE_LPCSTR,LPOLESERVERDOC*); + OLESTATUS (CALLBACK* CreateFromTemplate)(LPOLESERVER,LHSERVERDOC,OLE_LPCSTR,OLE_LPCSTR,OLE_LPCSTR,LPOLESERVERDOC*); + OLESTATUS (CALLBACK* Edit)(LPOLESERVER,LHSERVERDOC,OLE_LPCSTR,OLE_LPCSTR,LPOLESERVERDOC*); + OLESTATUS (CALLBACK* Exit)(LPOLESERVER); + OLESTATUS (CALLBACK* Release)(LPOLESERVER); + OLESTATUS (CALLBACK* Execute)(LPOLESERVER,HGLOBAL); +} OLESERVERVTBL; +typedef OLESERVERVTBL *LPOLESERVERVTBL; +typedef struct _OLESERVER { LPOLESERVERVTBL lpvtbl; } OLESERVER; +typedef struct _OLESERVERDOCVTBL { + OLESTATUS (CALLBACK* Save)(LPOLESERVERDOC); + OLESTATUS (CALLBACK* Close)(LPOLESERVERDOC); + OLESTATUS (CALLBACK* SetHostNames)(LPOLESERVERDOC,OLE_LPCSTR,OLE_LPCSTR); + OLESTATUS (CALLBACK* SetDocDimensions)(LPOLESERVERDOC,OLE_CONST RECT*); + OLESTATUS (CALLBACK* GetObject)(LPOLESERVERDOC,OLE_LPCSTR,LPOLEOBJECT*,LPOLECLIENT); + OLESTATUS (CALLBACK* Release)(LPOLESERVERDOC); + OLESTATUS (CALLBACK* SetColorScheme)(LPOLESERVERDOC,OLE_CONST LOGPALETTE*); + OLESTATUS (CALLBACK* Execute)(LPOLESERVERDOC,HGLOBAL); +} OLESERVERDOCVTBL; +typedef OLESERVERDOCVTBL *LPOLESERVERDOCVTBL; +typedef struct _OLESERVERDOC { LPOLESERVERDOCVTBL lpvtbl; } OLESERVERDOC; +OLESTATUS WINAPI OleDelete(LPOLEOBJECT); +OLESTATUS WINAPI OleRelease(LPOLEOBJECT); +OLESTATUS WINAPI OleSaveToStream(LPOLEOBJECT,LPOLESTREAM); +OLESTATUS WINAPI OleEqual(LPOLEOBJECT,LPOLEOBJECT ); +OLESTATUS WINAPI OleCopyToClipboard(LPOLEOBJECT); +OLESTATUS WINAPI OleSetHostNames(LPOLEOBJECT,LPCSTR,LPCSTR); +OLESTATUS WINAPI OleSetTargetDevice(LPOLEOBJECT,HGLOBAL); +OLESTATUS WINAPI OleSetBounds(LPOLEOBJECT,LPCRECT); +OLESTATUS WINAPI OleSetColorScheme(LPOLEOBJECT,const LOGPALETTE*); +OLESTATUS WINAPI OleQueryBounds(LPOLEOBJECT,RECT*); +OLESTATUS WINAPI OleQuerySize(LPOLEOBJECT,DWORD*); +OLESTATUS WINAPI OleDraw(LPOLEOBJECT,HDC,LPCRECT,LPCRECT,HDC); +OLESTATUS WINAPI OleQueryOpen(LPOLEOBJECT); +OLESTATUS WINAPI OleActivate(LPOLEOBJECT,UINT,BOOL,BOOL,HWND,LPCRECT); +OLESTATUS WINAPI OleExecute(LPOLEOBJECT,HGLOBAL,UINT); +OLESTATUS WINAPI OleClose(LPOLEOBJECT); +OLESTATUS WINAPI OleUpdate(LPOLEOBJECT); +OLESTATUS WINAPI OleReconnect(LPOLEOBJECT); +OLESTATUS WINAPI OleGetLinkUpdateOptions(LPOLEOBJECT,OLEOPT_UPDATE*); +OLESTATUS WINAPI OleSetLinkUpdateOptions(LPOLEOBJECT,OLEOPT_UPDATE); +WINAPI void *OleQueryProtocol(LPOLEOBJECT,LPCSTR); +OLESTATUS WINAPI OleQueryReleaseStatus(LPOLEOBJECT); +OLESTATUS WINAPI OleQueryReleaseError(LPOLEOBJECT); +OLE_RELEASE_METHOD WINAPI OleQueryReleaseMethod(LPOLEOBJECT); +OLESTATUS WINAPI OleQueryType(LPOLEOBJECT,LONG*); +DWORD WINAPI OleQueryClientVersion(void); +DWORD WINAPI OleQueryServerVersion(void); +OLECLIPFORMAT WINAPI OleEnumFormats(LPOLEOBJECT,OLECLIPFORMAT); +OLESTATUS WINAPI OleGetData(LPOLEOBJECT,OLECLIPFORMAT,HANDLE*); +OLESTATUS WINAPI OleSetData(LPOLEOBJECT,OLECLIPFORMAT,HANDLE); +OLESTATUS WINAPI OleQueryOutOfDate(LPOLEOBJECT); +OLESTATUS WINAPI OleRequestData(LPOLEOBJECT,OLECLIPFORMAT); +OLESTATUS WINAPI OleQueryLinkFromClip(LPCSTR,OLEOPT_RENDER,OLECLIPFORMAT); +OLESTATUS WINAPI OleQueryCreateFromClip(LPCSTR,OLEOPT_RENDER,OLECLIPFORMAT); +OLESTATUS WINAPI OleCreateFromClip(LPCSTR,LPOLECLIENT,LHCLIENTDOC,LPCSTR,LPOLEOBJECT*,OLEOPT_RENDER,OLECLIPFORMAT); +OLESTATUS WINAPI OleCreateLinkFromClip(LPCSTR,LPOLECLIENT,LHCLIENTDOC,LPCSTR,LPOLEOBJECT*,OLEOPT_RENDER,OLECLIPFORMAT); +OLESTATUS WINAPI OleCreateFromFile(LPCSTR,LPOLECLIENT,LPCSTR,LPCSTR,LHCLIENTDOC,LPCSTR,LPOLEOBJECT*,OLEOPT_RENDER,OLECLIPFORMAT); +OLESTATUS WINAPI OleCreateLinkFromFile(LPCSTR,LPOLECLIENT,LPCSTR,LPCSTR,LPCSTR,LHCLIENTDOC,LPCSTR,LPOLEOBJECT*,OLEOPT_RENDER,OLECLIPFORMAT); +OLESTATUS WINAPI OleLoadFromStream(LPOLESTREAM,LPCSTR,LPOLECLIENT,LHCLIENTDOC,LPCSTR,LPOLEOBJECT*); +OLESTATUS WINAPI OleCreate(LPCSTR,LPOLECLIENT,LPCSTR,LHCLIENTDOC,LPCSTR,LPOLEOBJECT*,OLEOPT_RENDER,OLECLIPFORMAT); +OLESTATUS WINAPI OleCreateInvisible(LPCSTR,LPOLECLIENT,LPCSTR,LHCLIENTDOC,LPCSTR,LPOLEOBJECT*,OLEOPT_RENDER,OLECLIPFORMAT,BOOL); +OLESTATUS WINAPI OleCreateFromTemplate(LPCSTR,LPOLECLIENT,LPCSTR,LHCLIENTDOC,LPCSTR,LPOLEOBJECT*,OLEOPT_RENDER,OLECLIPFORMAT); +OLESTATUS WINAPI OleClone(LPOLEOBJECT,LPOLECLIENT,LHCLIENTDOC,LPCSTR,LPOLEOBJECT*); +OLESTATUS WINAPI OleCopyFromLink(LPOLEOBJECT,LPCSTR,LPOLECLIENT,LHCLIENTDOC,LPCSTR,LPOLEOBJECT*); +OLESTATUS WINAPI OleObjectConvert(LPOLEOBJECT,LPCSTR,LPOLECLIENT,LHCLIENTDOC,LPCSTR,LPOLEOBJECT*); +OLESTATUS WINAPI OleRename(LPOLEOBJECT,LPCSTR); +OLESTATUS WINAPI OleQueryName(LPOLEOBJECT,LPSTR,UINT*); +OLESTATUS WINAPI OleRevokeObject(LPOLECLIENT); +BOOL WINAPI OleIsDcMeta(HDC); +OLESTATUS WINAPI OleRegisterClientDoc(LPCSTR,LPCSTR,LONG,LHCLIENTDOC*); +OLESTATUS WINAPI OleRevokeClientDoc(LHCLIENTDOC); +OLESTATUS WINAPI OleRenameClientDoc(LHCLIENTDOC,LPCSTR); +OLESTATUS WINAPI OleRevertClientDoc(LHCLIENTDOC); +OLESTATUS WINAPI OleSavedClientDoc(LHCLIENTDOC); +OLESTATUS WINAPI OleEnumObjects(LHCLIENTDOC,LPOLEOBJECT*); +OLESTATUS WINAPI OleRegisterServer(LPCSTR,LPOLESERVER,LHSERVER*,HINSTANCE,OLE_SERVER_USE); +OLESTATUS WINAPI OleRevokeServer(LHSERVER); +OLESTATUS WINAPI OleBlockServer(LHSERVER); +OLESTATUS WINAPI OleUnblockServer(LHSERVER,BOOL*); +OLESTATUS WINAPI OleLockServer(LPOLEOBJECT,LHSERVER*); +OLESTATUS WINAPI OleUnlockServer(LHSERVER); +OLESTATUS WINAPI OleRegisterServerDoc(LHSERVER,LPCSTR,LPOLESERVERDOC,LHSERVERDOC*); +OLESTATUS WINAPI OleRevokeServerDoc(LHSERVERDOC); +OLESTATUS WINAPI OleRenameServerDoc(LHSERVERDOC,LPCSTR); +OLESTATUS WINAPI OleRevertServerDoc(LHSERVERDOC); +OLESTATUS WINAPI OleSavedServerDoc(LHSERVERDOC); +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/ole2.h b/reactos/w32api/include/ole2.h new file mode 100644 index 00000000000..c80a9a958e5 --- /dev/null +++ b/reactos/w32api/include/ole2.h @@ -0,0 +1,110 @@ +#ifndef _OLE2_H +#define _OLE2_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#pragma pack(push,8) +#include <winerror.h> +#include <objbase.h> +#include <olectlid.h> +#include <oleauto.h> + +#ifdef __cplusplus +extern "C" { +#endif +#define E_DRAW VIEW_E_DRAW +#define DATA_E_FORMATETC DV_E_FORMATETC +#define OLEIVERB_PRIMARY (0L) +#define OLEIVERB_SHOW (-1L) +#define OLEIVERB_OPEN (-2L) +#define OLEIVERB_HIDE (-3L) +#define OLEIVERB_UIACTIVATE (-4L) +#define OLEIVERB_INPLACEACTIVATE (-5L) +#define OLEIVERB_DISCARDUNDOSTATE (-6L) +#define EMBDHLP_INPROC_HANDLER 0x0000L +#define EMBDHLP_INPROC_SERVER 0x0001L +#define EMBDHLP_CREATENOW 0x00000000L +#define EMBDHLP_DELAYCREATE 0x00010000L +#include <oleidl.h> + +typedef struct _OLESTREAMVTBL *LPOLESTREAMVTBL; +typedef struct _OLESTREAM { + LPOLESTREAMVTBL lpstbl; +} OLESTREAM,*LPOLESTREAM; +typedef struct _OLESTREAMVTBL { + DWORD (CALLBACK* Get)(LPOLESTREAM,void*,DWORD); + DWORD (CALLBACK* Put)(LPOLESTREAM,const void*,DWORD); +} OLESTREAMVTBL; + +WINOLEAPI CreateDataAdviseHolder(LPDATAADVISEHOLDER*); +WINOLEAPI_(DWORD) OleBuildVersion(void); +WINOLEAPI ReadClassStg(LPSTORAGE,CLSID*); +WINOLEAPI WriteClassStg(LPSTORAGE,REFCLSID); +WINOLEAPI ReadClassStm(LPSTREAM,CLSID*); +WINOLEAPI WriteClassStm(LPSTREAM,REFCLSID); +WINOLEAPI WriteFmtUserTypeStg(LPSTORAGE,CLIPFORMAT,LPOLESTR); +WINOLEAPI ReadFmtUserTypeStg(LPSTORAGE,CLIPFORMAT*,LPOLESTR*); +WINOLEAPI OleInitialize(PVOID); +WINOLEAPI_(void) OleUninitialize(void); +WINOLEAPI OleQueryLinkFromData(LPDATAOBJECT); +WINOLEAPI OleQueryCreateFromData(LPDATAOBJECT); +WINOLEAPI OleCreate(REFCLSID,REFIID,DWORD,LPFORMATETC,LPOLECLIENTSITE,LPSTORAGE,PVOID*); +WINOLEAPI OleCreateFromData(LPDATAOBJECT,REFIID,DWORD,LPFORMATETC,LPOLECLIENTSITE,LPSTORAGE,PVOID*); +WINOLEAPI OleCreateLinkFromData(LPDATAOBJECT,REFIID,DWORD,LPFORMATETC,LPOLECLIENTSITE,LPSTORAGE,PVOID*); +WINOLEAPI OleCreateStaticFromData(LPDATAOBJECT,REFIID,DWORD,LPFORMATETC,LPOLECLIENTSITE,LPSTORAGE,PVOID*); +WINOLEAPI OleCreateLink(LPMONIKER,REFIID,DWORD,LPFORMATETC,LPOLECLIENTSITE,LPSTORAGE,PVOID*); +WINOLEAPI OleCreateLinkToFile(LPCOLESTR,REFIID,DWORD,LPFORMATETC,LPOLECLIENTSITE,LPSTORAGE,PVOID*); +WINOLEAPI OleCreateFromFile(REFCLSID,LPCOLESTR,REFIID,DWORD,LPFORMATETC,LPOLECLIENTSITE,LPSTORAGE,PVOID*); +WINOLEAPI OleLoad(LPSTORAGE,REFIID,LPOLECLIENTSITE,PVOID*); +WINOLEAPI OleSave(LPPERSISTSTORAGE,LPSTORAGE,BOOL); +WINOLEAPI OleLoadFromStream(LPSTREAM,REFIID,PVOID*); +WINOLEAPI OleSaveToStream(LPPERSISTSTREAM,LPSTREAM); +WINOLEAPI OleSetContainedObject(LPUNKNOWN,BOOL); +WINOLEAPI OleNoteObjectVisible(LPUNKNOWN,BOOL); +WINOLEAPI RegisterDragDrop(HWND,LPDROPTARGET); +WINOLEAPI RevokeDragDrop(HWND); +WINOLEAPI DoDragDrop(LPDATAOBJECT,LPDROPSOURCE,DWORD,PDWORD); +WINOLEAPI OleSetClipboard(LPDATAOBJECT); +WINOLEAPI OleGetClipboard(LPDATAOBJECT*); +WINOLEAPI OleFlushClipboard(void); +WINOLEAPI OleIsCurrentClipboard(LPDATAOBJECT); +WINOLEAPI_(HOLEMENU) OleCreateMenuDescriptor(HMENU,LPOLEMENUGROUPWIDTHS); +WINOLEAPI OleSetMenuDescriptor(HOLEMENU,HWND,HWND,LPOLEINPLACEFRAME,LPOLEINPLACEACTIVEOBJECT); +WINOLEAPI OleDestroyMenuDescriptor(HOLEMENU); +WINOLEAPI OleTranslateAccelerator(LPOLEINPLACEFRAME,LPOLEINPLACEFRAMEINFO,LPMSG); +WINOLEAPI_(HANDLE) OleDuplicateData(HANDLE,CLIPFORMAT,UINT); +WINOLEAPI OleDraw(LPUNKNOWN,DWORD,HDC,LPCRECT); +WINOLEAPI OleRun(LPUNKNOWN); +WINOLEAPI_(BOOL) OleIsRunning(LPOLEOBJECT); +WINOLEAPI OleLockRunning(LPUNKNOWN,BOOL,BOOL); +WINOLEAPI_(void) ReleaseStgMedium(LPSTGMEDIUM); +WINOLEAPI CreateOleAdviseHolder(LPOLEADVISEHOLDER*); +WINOLEAPI OleCreateDefaultHandler(REFCLSID,LPUNKNOWN,REFIID,PVOID*); +WINOLEAPI OleCreateEmbeddingHelper(REFCLSID,LPUNKNOWN,DWORD,LPCLASSFACTORY,REFIID,PVOID*); +WINOLEAPI_(BOOL) IsAccelerator(HACCEL,int,LPMSG,WORD*); +WINOLEAPI_(HGLOBAL) OleGetIconOfFile(LPOLESTR,BOOL); +WINOLEAPI_(HGLOBAL) OleGetIconOfClass(REFCLSID,LPOLESTR,BOOL); +WINOLEAPI_(HGLOBAL) OleMetafilePictFromIconAndLabel(HICON,LPOLESTR,LPOLESTR,UINT); +WINOLEAPI OleRegGetUserType(REFCLSID,DWORD,LPOLESTR*); +WINOLEAPI OleRegGetMiscStatus(REFCLSID,DWORD,DWORD*); +WINOLEAPI OleRegEnumFormatEtc (REFCLSID,DWORD,LPENUMFORMATETC*); +WINOLEAPI OleRegEnumVerbs (REFCLSID,LPENUMOLEVERB*); +WINOLEAPI OleConvertOLESTREAMToIStorage(LPOLESTREAM,LPSTORAGE,const DVTARGETDEVICE*); +WINOLEAPI OleConvertIStorageToOLESTREAM(LPSTORAGE,LPOLESTREAM); +WINOLEAPI GetHGlobalFromILockBytes(LPLOCKBYTES,HGLOBAL*); +WINOLEAPI CreateILockBytesOnHGlobal(HGLOBAL,BOOL,LPLOCKBYTES*); +WINOLEAPI GetHGlobalFromStream(LPSTREAM,HGLOBAL*); +WINOLEAPI CreateStreamOnHGlobal(HGLOBAL,BOOL,LPSTREAM*); +WINOLEAPI OleDoAutoConvert(LPSTORAGE,LPCLSID); +WINOLEAPI OleGetAutoConvert(REFCLSID,LPCLSID); +WINOLEAPI OleSetAutoConvert(REFCLSID,REFCLSID); +WINOLEAPI GetConvertStg(LPSTORAGE); +WINOLEAPI SetConvertStg(LPSTORAGE,BOOL); +WINOLEAPI OleConvertIStorageToOLESTREAMEx(LPSTORAGE,CLIPFORMAT,LONG,LONG,DWORD,LPSTGMEDIUM,LPOLESTREAM); +WINOLEAPI OleConvertOLESTREAMToIStorageEx(LPOLESTREAM,LPSTORAGE,CLIPFORMAT*,LONG*,LONG*,DWORD*,LPSTGMEDIUM); +#ifdef __cplusplus +} +#endif +#pragma pack(pop) +#endif diff --git a/reactos/w32api/include/ole2ver.h b/reactos/w32api/include/ole2ver.h new file mode 100644 index 00000000000..667003a8253 --- /dev/null +++ b/reactos/w32api/include/ole2ver.h @@ -0,0 +1,8 @@ +#ifndef _OLE2VER_H +#define _OLE2VER_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif +#define rmm 23 +#define rup 639 +#endif diff --git a/reactos/w32api/include/oleacc.h b/reactos/w32api/include/oleacc.h new file mode 100644 index 00000000000..e78949820f8 --- /dev/null +++ b/reactos/w32api/include/oleacc.h @@ -0,0 +1,219 @@ +#ifndef _OLEACC_H +#define _OLEACC_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define DISPID_ACC_PARENT (-5000) +#define DISPID_ACC_CHILDCOUNT (-5001) +#define DISPID_ACC_CHILD (-5002) + +#define DISPID_ACC_NAME (-5003) +#define DISPID_ACC_VALUE (-5004) +#define DISPID_ACC_DESCRIPTION (-5005) +#define DISPID_ACC_ROLE (-5006) +#define DISPID_ACC_STATE (-5007) +#define DISPID_ACC_HELP (-5008) +#define DISPID_ACC_HELPTOPIC (-5009) +#define DISPID_ACC_KEYBOARDSHORTCUT (-5010) +#define DISPID_ACC_FOCUS (-5011) +#define DISPID_ACC_SELECTION (-5012) +#define DISPID_ACC_DEFAULTACTION (-5013) + +#define DISPID_ACC_SELECT (-5014) +#define DISPID_ACC_LOCATION (-5015) +#define DISPID_ACC_NAVIGATE (-5016) +#define DISPID_ACC_HITTEST (-5017) +#define DISPID_ACC_DODEFAULTACTION (-5018) + +#define NAVDIR_DOWN 2 +#define NAVDIR_FIRSTCHILD 7 +#define NAVDIR_LASTCHILD 8 +#define NAVDIR_LEFT 3 +#define NAVDIR_NEXT 5 +#define NAVDIR_PREVIOUS 6 +#define NAVDIR_RIGHT 4 +#define NAVDIR_UP 1 + +#define ROLE_SYSTEM_ALERT 8 +#define ROLE_SYSTEM_ANIMATION 54 +#define ROLE_SYSTEM_APPLICATION 14 +#define ROLE_SYSTEM_BORDER 19 +#define ROLE_SYSTEM_BUTTONDROPDOWN 56 +#define ROLE_SYSTEM_BUTTONDROPDOWNGRID 58 +#define ROLE_SYSTEM_BUTTONMENU 57 +#define ROLE_SYSTEM_CARET 7 +#define ROLE_SYSTEM_CELL 29 +#define ROLE_SYSTEM_CHARACTER 32 +#define ROLE_SYSTEM_CHART 17 +#define ROLE_SYSTEM_CHECKBUTTON 44 +#define ROLE_SYSTEM_CLIENT 10 +#define ROLE_SYSTEM_CLOCK 61 +#define ROLE_SYSTEM_COLUMN 27 +#define ROLE_SYSTEM_COLUMNHEADER 25 +#define ROLE_SYSTEM_COMBOBOX 46 +#define ROLE_SYSTEM_CURSOR 6 +#define ROLE_SYSTEM_DIAGRAM 53 +#define ROLE_SYSTEM_DIAL 49 +#define ROLE_SYSTEM_DIALOG 18 +#define ROLE_SYSTEM_DOCUMENT 15 +#define ROLE_SYSTEM_DROPLIST 47 +#define ROLE_SYSTEM_EQUATION 55 +#define ROLE_SYSTEM_GRAPHIC 40 +#define ROLE_SYSTEM_GRIP 4 +#define ROLE_SYSTEM_GROUPING 20 +#define ROLE_SYSTEM_HELPBALLOON 31 +#define ROLE_SYSTEM_HOTKEYFIELD 50 +#define ROLE_SYSTEM_INDICATOR 39 +#define ROLE_SYSTEM_LINK 30 +#define ROLE_SYSTEM_LIST 33 +#define ROLE_SYSTEM_LISTITEM 34 +#define ROLE_SYSTEM_MENUBAR 2 +#define ROLE_SYSTEM_MENUITEM 12 +#define ROLE_SYSTEM_MENUPOPUP 11 +#define ROLE_SYSTEM_OUTLINE 35 +#define ROLE_SYSTEM_OUTLINEITEM 36 +#define ROLE_SYSTEM_PAGETAB 37 +#define ROLE_SYSTEM_PAGETABLIST 60 +#define ROLE_SYSTEM_PANE 16 +#define ROLE_SYSTEM_PROGRESSBAR 48 +#define ROLE_SYSTEM_PROPERTYPAGE 38 +#define ROLE_SYSTEM_PUSHBUTTON 43 +#define ROLE_SYSTEM_RADIOBUTTON 45 +#define ROLE_SYSTEM_ROW 28 +#define ROLE_SYSTEM_ROWHEADER 26 +#define ROLE_SYSTEM_SCROLLBAR 3 +#define ROLE_SYSTEM_SEPARATOR 21 +#define ROLE_SYSTEM_SLIDER 51 +#define ROLE_SYSTEM_SOUND 5 +#define ROLE_SYSTEM_SPINBUTTON 52 +#define ROLE_SYSTEM_STATICTEXT 41 +#define ROLE_SYSTEM_STATUSBAR 23 +#define ROLE_SYSTEM_TABLE 24 +#define ROLE_SYSTEM_TEXT 42 +#define ROLE_SYSTEM_TITLEBAR 1 +#define ROLE_SYSTEM_TOOLBAR 22 +#define ROLE_SYSTEM_TOOLTIP 13 +#define ROLE_SYSTEM_WHITESPACE 59 +#define ROLE_SYSTEM_WINDOW 9 + +#define STATE_SYSTEM_UNAVAILABLE 0x00000001 +#define STATE_SYSTEM_SELECTED 0x00000002 +#define STATE_SYSTEM_FOCUSED 0x00000004 +#define STATE_SYSTEM_PRESSED 0x00000008 +#define STATE_SYSTEM_CHECKED 0x00000010 +#define STATE_SYSTEM_MIXED 0x00000020 +#define STATE_SYSTEM_READONLY 0x00000040 +#define STATE_SYSTEM_HOTTRACKED 0x00000080 +#define STATE_SYSTEM_DEFAULT 0x00000100 +#define STATE_SYSTEM_EXPANDED 0x00000200 +#define STATE_SYSTEM_COLLAPSED 0x00000400 +#define STATE_SYSTEM_BUSY 0x00000800 +#define STATE_SYSTEM_FLOATING 0x00001000 +#define STATE_SYSTEM_MARQUEED 0x00002000 +#define STATE_SYSTEM_ANIMATED 0x00004000 +#define STATE_SYSTEM_INVISIBLE 0x00008000 +#define STATE_SYSTEM_OFFSCREEN 0x00010000 +#define STATE_SYSTEM_SIZEABLE 0x00020000 +#define STATE_SYSTEM_MOVEABLE 0x00040000 +#define STATE_SYSTEM_SELFVOICING 0x00080000 +#define STATE_SYSTEM_FOCUSABLE 0x00100000 +#define STATE_SYSTEM_SELECTABLE 0x00200000 +#define STATE_SYSTEM_LINKED 0x00400000 +#define STATE_SYSTEM_TRAVERSED 0x00800000 +#define STATE_SYSTEM_MULTISELECTABLE 0x01000000 +#define STATE_SYSTEM_EXTSELECTABLE 0x02000000 +#define STATE_SYSTEM_ALERT_LOW 0x04000000 +#define STATE_SYSTEM_ALERT_MEDIUM 0x08000000 +#define STATE_SYSTEM_ALERT_HIGH 0x10000000 +#define STATE_SYSTEM_VALID 0x1fffffff + +typedef enum tagSELFLAG +{ + SELFLAG_NONE = 0, + SELFLAG_TAKEFOCUS = 1, + SELFLAG_TAKESELECTION = 2, + SELFLAG_EXTENDSELECTION = 4, + SELFLAG_ADDSELECTION = 8, + SELFLAG_REMOVESELECTION = 16 +} SELFLAG; + +#define SELFLAG_VALID 0x0000001F + +/* DEFINE_GUID(LIBID_Accessibility, 0x1ea4dbf0, 0x3c3b,0x11cf, 0x81, 0x0c, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); */ +/* DEFINE_GUID(IID_IAccessible, 0x618736e0, 0x3c3d,0x11cf, 0x81, 0x0c, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); */ +EXTERN_C const IID LIBID_Accessibility; +EXTERN_C const IID IID_IAccessible; + +#undef INTERFACE +#define INTERFACE IAccessible +DECLARE_INTERFACE_(IAccessible, IDispatch) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetTypeInfoCount)(THIS_ UINT*) PURE; + STDMETHOD(GetTypeInfo)(THIS_ UINT,LCID,LPTYPEINFO*) PURE; + STDMETHOD(GetIDsOfNames)(THIS_ REFIID,LPOLESTR*,UINT,LCID,DISPID*) PURE; + STDMETHOD(Invoke)(THIS_ DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*) PURE; + + STDMETHOD(get_accParent)(THIS_ IDispatch**) PURE; + STDMETHOD(get_accChildCount)(THIS_ long*) PURE; + STDMETHOD(get_accChild)(THIS_ VARIANT, IDispatch **) PURE; + STDMETHOD(get_accName)(THIS_ VARIANT, BSTR*) PURE; + STDMETHOD(get_accValue)(THIS_ VARIANT, BSTR*) PURE; + STDMETHOD(get_accDescription)(THIS_ VARIANT, BSTR*) PURE; + STDMETHOD(get_accRole)(THIS_ VARIANT, VARIANT*) PURE; + STDMETHOD(get_accState)(THIS_ VARIANT, VARIANT*) PURE; + STDMETHOD(get_accHelp)(THIS_ VARIANT, BSTR*) PURE; + STDMETHOD(get_accHelpTopic)(THIS_ BSTR*, VARIANT, long*) PURE; + STDMETHOD(get_accKeyboardShortcut)(THIS_ VARIANT, BSTR*) PURE; + STDMETHOD(get_accFocus)(THIS_ VARIANT*) PURE; + STDMETHOD(get_accSelection)(THIS_ VARIANT*) PURE; + STDMETHOD(get_accDefaultAction)(THIS_ VARIANT, BSTR*) PURE; + + STDMETHOD(accSelect)(THIS_ long, VARIANT) PURE; + STDMETHOD(accLocation)(THIS_ long*, long*, long*, long*, VARIANT) PURE; + STDMETHOD(accNavigate)(THIS_ long, VARIANT, VARIANT*) PURE; + STDMETHOD(accHitTest)(THIS_ long, long, VARIANT*) PURE; + STDMETHOD(accDoDefaultAction)(THIS_ VARIANT) PURE; + + STDMETHOD(put_accName)(THIS_ VARIANT, BSTR) PURE; + STDMETHOD(put_accValue)(THIS_ VARIANT, BSTR) PURE; +}; +typedef IAccessible* LPACCESSIBLE; + +STDAPI AccessibleChildren(IAccessible*,LONG,LONG,VARIANT*,LONG*); +STDAPI AccessibleObjectFromEvent(HWND,DWORD,DWORD,IAccessible*,VARIANT*); +STDAPI AccessibleObjectFromPoint(POINT,IAccessible**,VARIANT*); +STDAPI AccessibleObjectFromWindow(HWND,DWORD,REFIID,void**); +STDAPI CreateStdAccessibleObject(HWND,LONG,REFIID,void**); +STDAPI CreateStdAccessibleProxyA(HWND,LPCSTR,LONG,REFIID,void**); +STDAPI CreateStdAccessibleProxyW(HWND,LPCWSTR,LONG,REFIID,void**); +void WINAPI GetOleaccVersionInfo(DWORD*,DWORD*); +UINT WINAPI GetRoleTextA(DWORD,LPSTR,UINT); +UINT WINAPI GetRoleTextW(DWORD,LPWSTR,UINT); +UINT WINAPI GetStateTextA(DWORD,LPSTR,UINT); +UINT WINAPI GetStateTextW(DWORD,LPWSTR,UINT); +LRESULT WINAPI LresultFromObject(REFIID,WPARAM,LPUNKNOWN); +STDAPI ObjectFromLresult(LRESULT,REFIID,WPARAM,void**); +STDAPI WindowFromAccessibleObject(IAccessible*,HWND*); + +#ifdef UNICODE +#define CreateStdAccessibleProxy CreateStdAccessibleProxyW +#define GetRoleText GetRoleTextW +#define GetStateText GetStateTextW +#else +#define CreateStdAccessibleProxy CreateStdAccessibleProxyA +#define GetRoleText GetRoleTextA +#define GetStateText GetStateTextA +#endif + +#ifdef __cplusplus +} +#endif +#endif /* _OLEACC_H */ diff --git a/reactos/w32api/include/oleauto.h b/reactos/w32api/include/oleauto.h new file mode 100644 index 00000000000..d28067c7af1 --- /dev/null +++ b/reactos/w32api/include/oleauto.h @@ -0,0 +1,261 @@ +#ifndef _OLEAUTO_H +#define _OLEAUTO_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#pragma pack(push,8) +#define WINOLEAUTAPI STDAPI +#define WINOLEAUTAPI_(type) STDAPI_(type) +#define STDOLE_MAJORVERNUM 1 +#define STDOLE_MINORVERNUM 0 +#define STDOLE_LCID 0 +#define VARIANT_NOVALUEPROP 0x01 +#define VARIANT_ALPHABOOL 0x02 +#define VARIANT_NOUSEOVERRIDE 0x04 +#define VARIANT_LOCALBOOL 0x08 +#define VAR_TIMEVALUEONLY 0x0001 +#define VAR_DATEVALUEONLY 0x0002 +#define MEMBERID_NIL DISPID_UNKNOWN +#define ID_DEFAULTINST (-2) +#define DISPATCH_METHOD 1 +#define DISPATCH_PROPERTYGET 2 +#define DISPATCH_PROPERTYPUT 4 +#define DISPATCH_PROPERTYPUTREF 8 +#define LHashValOfName(l,n) LHashValOfNameSys(SYS_WIN32,l,n) +#define WHashValOfLHashVal(h) ((unsigned short)(0x0000ffff&(h))) +#define IsHashValCompatible(h1,h2) ((BOOL)((0x00ff0000&(h1))==(0x00ff0000&(h2)))) +#define ACTIVEOBJECT_STRONG 0 +#define ACTIVEOBJECT_WEAK 1 +#ifdef NONAMELESSUNION +#define V_UNION(X,Y) ((X)->n1.n2.n3.Y) +#define V_VT(X) ((X)->n1.n2.vt) +#else +#define V_UNION(X,Y) ((X)->Y) +#define V_VT(X) ((X)->vt) +#endif +#define V_BOOL(X) V_UNION(X,boolVal) +#define V_ISBYREF(X) (V_VT(X)&VT_BYREF) +#define V_ISARRAY(X) (V_VT(X)&VT_ARRAY) +#define V_ISVECTOR(X) (V_VT(X)&VT_VECTOR) +#define V_NONE(X) V_I2(X) +#define V_UI1(X) V_UNION(X,bVal) +#define V_UI1REF(X) V_UNION(X,pbVal) +#define V_I2(X) V_UNION(X,iVal) +#define V_I2REF(X) V_UNION(X,piVal) +#define V_I4(X) V_UNION(X,lVal) +#define V_I4REF(X) V_UNION(X,plVal) +#define V_I8(X) V_UNION(X,hVal) +#define V_I8REF(X) V_UNION(X,phVal) +#define V_R4(X) V_UNION(X,fltVal) +#define V_R4REF(X) V_UNION(X,pfltVal) +#define V_R8(X) V_UNION(X,dblVal) +#define V_R8REF(X) V_UNION(X,pdblVal) +#define V_CY(X) V_UNION(X,cyVal) +#define V_CYREF(X) V_UNION(X,pcyVal) +#define V_DATE(X) V_UNION(X,date) +#define V_DATEREF(X) V_UNION(X,pdate) +#define V_BSTR(X) V_UNION(X,bstrVal) +#define V_BSTRREF(X) V_UNION(X,pbstrVal) +#define V_DISPATCH(X) V_UNION(X,pdispVal) +#define V_DISPATCHREF(X) V_UNION(X,ppdispVal) +#define V_ERROR(X) V_UNION(X,scode) +#define V_ERRORREF(X) V_UNION(X,pscode) +#define V_BOOLREF(X) V_UNION(X,pboolVal) +#define V_UNKNOWN(X) V_UNION(X,punkVal) +#define V_UNKNOWNREF(X) V_UNION(X,ppunkVal) +#define V_VARIANTREF(X) V_UNION(X,pvarVal) +#define V_LPSTR(X) V_UNION(X,pszVal) +#define V_LPSTRREF(X) V_UNION(X,ppszVal) +#define V_LPWSTR(X) V_UNION(X,pwszVal) +#define V_LPWSTRREF(X) V_UNION(X,ppwszVal) +#define V_FILETIME(X) V_UNION(X,filetime) +#define V_FILETIMEREF(X) V_UNION(X,pfiletime) +#define V_BLOB(X) V_UNION(X,blob) +#define V_UUID(X) V_UNION(X,puuid) +#define V_CLSID(X) V_UNION(X,puuid) +#define V_ARRAY(X) V_UNION(X,parray) +#define V_ARRAYREF(X) V_UNION(X,pparray) +#define V_BYREF(X) V_UNION(X,byref) +#define V_DECIMAL(X) V_UNION(X,decVal) +#define V_DECIMALREF(X) V_UNION(X,pdecVal) +#define V_I1(X) V_UNION(X,cVal) + +#include <oaidl.h> + +typedef enum tagREGKIND { + REGKIND_DEFAULT, + REGKIND_REGISTER, + REGKIND_NONE +} REGKIND; +typedef struct tagPARAMDATA { + OLECHAR *szName; + VARTYPE vt; +} PARAMDATA,*LPPARAMDATA; +typedef struct tagMETHODDATA { + OLECHAR *szName; + PARAMDATA *ppdata; + DISPID dispid; + UINT iMeth; + CALLCONV cc; + UINT cArgs; + WORD wFlags; + VARTYPE vtReturn; +} METHODDATA,*LPMETHODDATA; +typedef struct tagINTERFACEDATA { + METHODDATA *pmethdata; + UINT cMembers; +} INTERFACEDATA,*LPINTERFACEDATA; + +WINOLEAUTAPI_(BSTR) SysAllocString(const OLECHAR*); +WINOLEAUTAPI_(int) SysReAllocString(BSTR*,const OLECHAR*); +WINOLEAUTAPI_(BSTR) SysAllocStringLen(const OLECHAR*,unsigned int); +WINOLEAUTAPI_(int) SysReAllocStringLen(BSTR*,const OLECHAR*,unsigned int); +WINOLEAUTAPI_(void) SysFreeString(BSTR); +WINOLEAUTAPI_(unsigned int) SysStringLen(BSTR); +WINOLEAUTAPI_(unsigned int) SysStringByteLen(BSTR); +WINOLEAUTAPI_(BSTR) SysAllocStringByteLen(const char*,unsigned int); +WINOLEAUTAPI_(int) DosDateTimeToVariantTime(unsigned short,unsigned short,double*); +WINOLEAUTAPI_(int) VariantTimeToDosDateTime(double,unsigned short*,unsigned short*); +WINOLEAUTAPI_(int) VariantTimeToSystemTime(double,LPSYSTEMTIME); +WINOLEAUTAPI_(int) SystemTimeToVariantTime(LPSYSTEMTIME, double*); +WINOLEAUTAPI SafeArrayAllocDescriptor(unsigned int,SAFEARRAY**); +WINOLEAUTAPI SafeArrayAllocData(SAFEARRAY*); +WINOLEAUTAPI_(SAFEARRAY*) SafeArrayCreate(VARTYPE,unsigned int,SAFEARRAYBOUND*); +WINOLEAUTAPI SafeArrayDestroyDescriptor(SAFEARRAY*); +WINOLEAUTAPI SafeArrayDestroyData(SAFEARRAY*); +WINOLEAUTAPI SafeArrayDestroy(SAFEARRAY*); +WINOLEAUTAPI SafeArrayRedim(SAFEARRAY*,SAFEARRAYBOUND*); +WINOLEAUTAPI_(unsigned int) SafeArrayGetDim(SAFEARRAY*); +WINOLEAUTAPI_(unsigned int) SafeArrayGetElemsize(SAFEARRAY*); +WINOLEAUTAPI SafeArrayGetUBound(SAFEARRAY*,unsigned int,long*); +WINOLEAUTAPI SafeArrayGetLBound(SAFEARRAY*,unsigned int,long*); +WINOLEAUTAPI SafeArrayLock(SAFEARRAY*); +WINOLEAUTAPI SafeArrayUnlock(SAFEARRAY*); +WINOLEAUTAPI SafeArrayAccessData(SAFEARRAY*,void**); +WINOLEAUTAPI SafeArrayUnaccessData(SAFEARRAY*); +WINOLEAUTAPI SafeArrayGetElement(SAFEARRAY*,long*,void*); +WINOLEAUTAPI SafeArrayPutElement(SAFEARRAY*,long*,void*); +WINOLEAUTAPI SafeArrayCopy(SAFEARRAY*,SAFEARRAY**); +WINOLEAUTAPI SafeArrayPtrOfIndex(SAFEARRAY*,long*,void**); +WINOLEAUTAPI_(SAFEARRAY*) SafeArrayCreateVector(VARTYPE,LONG,UINT); +WINOLEAUTAPI_(void) VariantInit(VARIANTARG*); +WINOLEAUTAPI VariantClear(VARIANTARG*); +WINOLEAUTAPI VariantCopy(VARIANTARG*,VARIANTARG*); +WINOLEAUTAPI VariantCopyInd(VARIANT*,VARIANTARG*); +WINOLEAUTAPI VariantChangeType(VARIANTARG*,VARIANTARG*,unsigned short,VARTYPE); +WINOLEAUTAPI VariantChangeTypeEx(VARIANTARG*,VARIANTARG*,LCID,unsigned short,VARTYPE); +WINOLEAUTAPI VarUI1FromI2(short,unsigned char*); +WINOLEAUTAPI VarUI1FromI4(long,unsigned char*); +WINOLEAUTAPI VarUI1FromR4(float,unsigned char*); +WINOLEAUTAPI VarUI1FromR8(double,unsigned char*); +WINOLEAUTAPI VarUI1FromCy(CY,unsigned char*); +WINOLEAUTAPI VarUI1FromDate(DATE,unsigned char*); +WINOLEAUTAPI VarUI1FromStr(OLECHAR*,LCID,unsigned long,unsigned char*); +WINOLEAUTAPI VarUI1FromDisp(LPDISPATCH*,LCID,unsigned char*); +WINOLEAUTAPI VarUI1FromBool(VARIANT_BOOL,unsigned char*); +WINOLEAUTAPI VarI2FromUI1(unsigned char,short*); +WINOLEAUTAPI VarI2FromI4(long,short*); +WINOLEAUTAPI VarI2FromR4(float,short*); +WINOLEAUTAPI VarI2FromR8(double,short*); +WINOLEAUTAPI VarI2FromCy(CY cyIn,short*); +WINOLEAUTAPI VarI2FromDate(DATE,short*); +WINOLEAUTAPI VarI2FromStr(OLECHAR*,LCID,unsigned long,short*); +WINOLEAUTAPI VarI2FromDisp(LPDISPATCH*,LCID,short*); +WINOLEAUTAPI VarI2FromBool(VARIANT_BOOL,short*); +WINOLEAUTAPI VarI4FromUI1(unsigned char,long*); +WINOLEAUTAPI VarI4FromI2(short,long*); +WINOLEAUTAPI VarI4FromR4(float,long*); +WINOLEAUTAPI VarI4FromR8(double,long*); +WINOLEAUTAPI VarI4FromCy(CY,long*); +WINOLEAUTAPI VarI4FromDate(DATE,long*); +WINOLEAUTAPI VarI4FromStr(OLECHAR*,LCID,unsigned long,long*); +WINOLEAUTAPI VarI4FromDisp(LPDISPATCH*,LCID,long*); +WINOLEAUTAPI VarI4FromBool(VARIANT_BOOL,long*); +WINOLEAUTAPI VarR4FromUI1(unsigned char,float*); +WINOLEAUTAPI VarR4FromI2(short,float*); +WINOLEAUTAPI VarR4FromI4(long,float*); +WINOLEAUTAPI VarR4FromR8(double,float*); +WINOLEAUTAPI VarR4FromCy(CY,float*); +WINOLEAUTAPI VarR4FromDate(DATE,float*); +WINOLEAUTAPI VarR4FromStr(OLECHAR*,LCID,unsigned long,float*); +WINOLEAUTAPI VarR4FromDisp(LPDISPATCH*,LCID,float*); +WINOLEAUTAPI VarR4FromBool(VARIANT_BOOL,float*); +WINOLEAUTAPI VarR8FromUI1(unsigned char,double*); +WINOLEAUTAPI VarR8FromI2(short,double*); +WINOLEAUTAPI VarR8FromI4(long,double*); +WINOLEAUTAPI VarR8FromR4(float,double*); +WINOLEAUTAPI VarR8FromCy(CY,double*); +WINOLEAUTAPI VarR8FromDate(DATE,double*); +WINOLEAUTAPI VarR8FromStr(OLECHAR*,LCID,unsigned long,double*); +WINOLEAUTAPI VarR8FromDisp(LPDISPATCH*,LCID,double*); +WINOLEAUTAPI VarR8FromBool(VARIANT_BOOL,double*); +WINOLEAUTAPI VarR8FromDec(DECIMAL*,double*); +WINOLEAUTAPI VarDateFromUI1(unsigned char,DATE*); +WINOLEAUTAPI VarDateFromI2(short,DATE*); +WINOLEAUTAPI VarDateFromI4(long,DATE*); +WINOLEAUTAPI VarDateFromR4(float,DATE*); +WINOLEAUTAPI VarDateFromR8(double,DATE*); +WINOLEAUTAPI VarDateFromCy(CY,DATE*); +WINOLEAUTAPI VarDateFromStr(OLECHAR*,LCID,unsigned long,DATE*); +WINOLEAUTAPI VarDateFromDisp(LPDISPATCH*,LCID,DATE*); +WINOLEAUTAPI VarDateFromBool(VARIANT_BOOL,DATE*); +WINOLEAUTAPI VarCyFromUI1(unsigned char,CY*); +WINOLEAUTAPI VarCyFromI2(short,CY*); +WINOLEAUTAPI VarCyFromI4(long,CY*); +WINOLEAUTAPI VarCyFromR4(float,CY*); +WINOLEAUTAPI VarCyFromR8(double,CY*); +WINOLEAUTAPI VarCyFromDate(DATE,CY*); +WINOLEAUTAPI VarCyFromStr(OLECHAR*,LCID,unsigned long,CY*); +WINOLEAUTAPI VarCyFromDisp(LPDISPATCH*,LCID,CY*); +WINOLEAUTAPI VarCyFromBool(VARIANT_BOOL,CY*); +WINOLEAUTAPI VarBstrFromUI1(unsigned char,LCID,unsigned long,BSTR*); +WINOLEAUTAPI VarBstrFromI2(short,LCID,unsigned long,BSTR*); +WINOLEAUTAPI VarBstrFromI4(long,LCID,unsigned long,BSTR*); +WINOLEAUTAPI VarBstrFromR4(float,LCID,unsigned long,BSTR*); +WINOLEAUTAPI VarBstrFromR8(double,LCID,unsigned long,BSTR*); +WINOLEAUTAPI VarBstrFromCy(CY,LCID,unsigned long,BSTR*); +WINOLEAUTAPI VarBstrFromDate(DATE,LCID,unsigned long,BSTR*); +WINOLEAUTAPI VarBstrFromDisp(LPDISPATCH*,LCID,unsigned long,BSTR*); +WINOLEAUTAPI VarBstrFromBool(VARIANT_BOOL,LCID,unsigned long,BSTR*); +WINOLEAUTAPI VarBoolFromUI1(unsigned char,VARIANT_BOOL*); +WINOLEAUTAPI VarBoolFromI2(short,VARIANT_BOOL*); +WINOLEAUTAPI VarBoolFromI4(long,VARIANT_BOOL*); +WINOLEAUTAPI VarBoolFromR4(float,VARIANT_BOOL*); +WINOLEAUTAPI VarBoolFromR8(double,VARIANT_BOOL*); +WINOLEAUTAPI VarBoolFromDate(DATE,VARIANT_BOOL*); +WINOLEAUTAPI VarBoolFromCy(CY,VARIANT_BOOL*); +WINOLEAUTAPI VarBoolFromStr(OLECHAR*,LCID,unsigned long,VARIANT_BOOL*); +WINOLEAUTAPI VarBoolFromDisp(LPDISPATCH*,LCID,VARIANT_BOOL*); +WINOLEAUTAPI VarDecFromR8(double,DECIMAL*); +WINOLEAUTAPI_(ULONG) LHashValOfNameSysA(SYSKIND,LCID,const char*); +WINOLEAUTAPI_(ULONG) LHashValOfNameSys(SYSKIND,LCID,const OLECHAR*); +WINOLEAUTAPI LoadTypeLib(const OLECHAR*,LPTYPELIB*); +WINOLEAUTAPI LoadTypeLibEx(LPCOLESTR,REGKIND,LPTYPELIB*); +WINOLEAUTAPI LoadRegTypeLib(REFGUID,WORD,WORD,LCID,LPTYPELIB*); +WINOLEAUTAPI QueryPathOfRegTypeLib(REFGUID,unsigned short,unsigned short,LCID,LPBSTR); +WINOLEAUTAPI RegisterTypeLib(LPTYPELIB,OLECHAR*,OLECHAR*); +WINOLEAUTAPI UnRegisterTypeLib(REFGUID,WORD,WORD,LCID,SYSKIND); +WINOLEAUTAPI CreateTypeLib(SYSKIND,const OLECHAR*,LPCREATETYPELIB*); +WINOLEAUTAPI DispGetParam(DISPPARAMS*,UINT,VARTYPE,VARIANT*,UINT*); +WINOLEAUTAPI DispGetIDsOfNames(LPTYPEINFO,OLECHAR**,UINT,DISPID*); +WINOLEAUTAPI DispInvoke(void*,LPTYPEINFO,DISPID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*); +WINOLEAUTAPI CreateDispTypeInfo(INTERFACEDATA*,LCID,LPTYPEINFO*); +WINOLEAUTAPI CreateStdDispatch(IUnknown*,void*,LPTYPEINFO,IUnknown**); +WINOLEAUTAPI RegisterActiveObject(IUnknown*,REFCLSID,DWORD,DWORD*); +WINOLEAUTAPI RevokeActiveObject(DWORD,void*); +WINOLEAUTAPI GetActiveObject(REFCLSID,void*,IUnknown**); +WINOLEAUTAPI SetErrorInfo(unsigned long,LPERRORINFO); +WINOLEAUTAPI GetErrorInfo(unsigned long,LPERRORINFO*); +WINOLEAUTAPI CreateErrorInfo(LPCREATEERRORINFO*); +WINOLEAUTAPI_(unsigned long) OaBuildVersion(void); +WINOLEAUTAPI VectorFromBstr (BSTR, SAFEARRAY **); +WINOLEAUTAPI BstrFromVector (SAFEARRAY *, BSTR *); + +WINOLEAUTAPI VarAdd(LPVARIANT, LPVARIANT, LPVARIANT); +WINOLEAUTAPI VarSub(LPVARIANT, LPVARIANT, LPVARIANT); +WINOLEAUTAPI VarMul(LPVARIANT, LPVARIANT, LPVARIANT); +WINOLEAUTAPI VarDiv(LPVARIANT, LPVARIANT, LPVARIANT); +#pragma pack(pop) + +#endif diff --git a/reactos/w32api/include/olectl.h b/reactos/w32api/include/olectl.h new file mode 100644 index 00000000000..f0b86bc321f --- /dev/null +++ b/reactos/w32api/include/olectl.h @@ -0,0 +1,323 @@ +#ifndef _OLECTL_H +#define _OLECTL_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#include <ocidl.h> +#include <olectlid.h> + +#define STD_CTL_SCODE(n) MAKE_SCODE(SEVERITY_ERROR,FACILITY_CONTROL,n) +#define CTL_E_ILLEGALFUNCTIONCALL STD_CTL_SCODE(5) +#define CTL_E_OVERFLOW STD_CTL_SCODE(6) +#define CTL_E_OUTOFMEMORY STD_CTL_SCODE(7) +#define CTL_E_DIVISIONBYZERO STD_CTL_SCODE(11) +#define CTL_E_OUTOFSTRINGSPACE STD_CTL_SCODE(14) +#define CTL_E_OUTOFSTACKSPACE STD_CTL_SCODE(28) +#define CTL_E_BADFILENAMEORNUMBER STD_CTL_SCODE(52) +#define CTL_E_FILENOTFOUND STD_CTL_SCODE(53) +#define CTL_E_BADFILEMODE STD_CTL_SCODE(54) +#define CTL_E_FILEALREADYOPEN STD_CTL_SCODE(55) +#define CTL_E_DEVICEIOERROR STD_CTL_SCODE(57) +#define CTL_E_FILEALREADYEXISTS STD_CTL_SCODE(58) +#define CTL_E_BADRECORDLENGTH STD_CTL_SCODE(59) +#define CTL_E_DISKFULL STD_CTL_SCODE(61) +#define CTL_E_BADRECORDNUMBER STD_CTL_SCODE(63) +#define CTL_E_BADFILENAME STD_CTL_SCODE(64) +#define CTL_E_TOOMANYFILES STD_CTL_SCODE(67) +#define CTL_E_DEVICEUNAVAILABLE STD_CTL_SCODE(68) +#define CTL_E_PERMISSIONDENIED STD_CTL_SCODE(70) +#define CTL_E_DISKNOTREADY STD_CTL_SCODE(71) +#define CTL_E_PATHFILEACCESSERROR STD_CTL_SCODE(75) +#define CTL_E_PATHNOTFOUND STD_CTL_SCODE(76) +#define CTL_E_INVALIDPATTERNSTRING STD_CTL_SCODE(93) +#define CTL_E_INVALIDUSEOFNULL STD_CTL_SCODE(94) +#define CTL_E_INVALIDFILEFORMAT STD_CTL_SCODE(321) +#define CTL_E_INVALIDPROPERTYVALUE STD_CTL_SCODE(380) +#define CTL_E_INVALIDPROPERTYARRAYINDEX STD_CTL_SCODE(381) +#define CTL_E_SETNOTSUPPORTEDATRUNTIME STD_CTL_SCODE(382) +#define CTL_E_SETNOTSUPPORTED STD_CTL_SCODE(383) +#define CTL_E_NEEDPROPERTYARRAYINDEX STD_CTL_SCODE(385) +#define CTL_E_SETNOTPERMITTED STD_CTL_SCODE(387) +#define CTL_E_GETNOTSUPPORTEDATRUNTIME STD_CTL_SCODE(393) +#define CTL_E_GETNOTSUPPORTED STD_CTL_SCODE(394) +#define CTL_E_PROPERTYNOTFOUND STD_CTL_SCODE(422) +#define CTL_E_INVALIDCLIPBOARDFORMAT STD_CTL_SCODE(460) +#define CTL_E_INVALIDPICTURE STD_CTL_SCODE(481) +#define CTL_E_PRINTERERROR STD_CTL_SCODE(482) +#define CTL_E_CANTSAVEFILETOTEMP STD_CTL_SCODE(735) +#define CTL_E_SEARCHTEXTNOTFOUND STD_CTL_SCODE(744) +#define CTL_E_REPLACEMENTSTOOLONG STD_CTL_SCODE(746) +#define CUSTOM_CTL_SCODE(n) MAKE_SCODE(SEVERITY_ERROR,FACILITY_CONTROL,n) +#define CTL_E_CUSTOM_FIRST CUSTOM_CTL_SCODE(600) +#define CLASS_E_NOTLICENSED (CLASSFACTORY_E_FIRST+2) +#define CONNECT_E_FIRST MAKE_SCODE(SEVERITY_ERROR,FACILITY_ITF,0x200) +#define CONNECT_E_LAST MAKE_SCODE(SEVERITY_ERROR,FACILITY_ITF,0x20F) +#define CONNECT_S_FIRST MAKE_SCODE(SEVERITY_SUCCESS,FACILITY_ITF,0x200) +#define CONNECT_S_LAST MAKE_SCODE(SEVERITY_SUCCESS,FACILITY_ITF,0x20F) +#define CONNECT_E_NOCONNECTION (CONNECT_E_FIRST+0) +#define CONNECT_E_ADVISELIMIT (CONNECT_E_FIRST+1) +#define CONNECT_E_CANNOTCONNECT (CONNECT_E_FIRST+2) +#define CONNECT_E_OVERRIDDEN (CONNECT_E_FIRST+3) +#define SELFREG_E_FIRST MAKE_SCODE(SEVERITY_ERROR,FACILITY_ITF,0x200) +#define SELFREG_E_LAST MAKE_SCODE(SEVERITY_ERROR,FACILITY_ITF,0x20F) +#define SELFREG_S_FIRST MAKE_SCODE(SEVERITY_SUCCESS,FACILITY_ITF,0x200) +#define SELFREG_S_LAST MAKE_SCODE(SEVERITY_SUCCESS,FACILITY_ITF,0x20F) +#define SELFREG_E_TYPELIB (SELFREG_E_FIRST+0) +#define SELFREG_E_CLASS (SELFREG_E_FIRST+1) +#define PERPROP_E_FIRST MAKE_SCODE(SEVERITY_ERROR,FACILITY_ITF,0x200) +#define PERPROP_E_LAST MAKE_SCODE(SEVERITY_ERROR,FACILITY_ITF,0x20F) +#define PERPROP_S_FIRST MAKE_SCODE(SEVERITY_SUCCESS,FACILITY_ITF,0x200) +#define PERPROP_S_LAST MAKE_SCODE(SEVERITY_SUCCESS,FACILITY_ITF,0x20F) +#define PERPROP_E_NOPAGEAVAILABLE PERPROP_E_FIRST +#define OLEMISC_RECOMPOSEONRESIZE 0x1 +#define OLEMISC_ONLYICONIC 0x2 +#define OLEMISC_INSERTNOTREPLACE 0x4 +#define OLEMISC_STATIC 0x8 +#define OLEMISC_CANTLINKINSIDE 0x10 +#define OLEMISC_CANLINKBYOLE1 0x20 +#define OLEMISC_ISLINKOBJECT 0x40 +#define OLEMISC_INSIDEOUT 0x80 +#define OLEMISC_ACTIVATEWHENVISIBLE 0x100 +#define OLEMISC_RENDERINGISDEVICEINDEPENDENT 0x200 +#define OLEMISC_INVISIBLEATRUNTIME 0x400 +#define OLEMISC_ALWAYSRUN 0x800 +#define OLEMISC_ACTSLIKEBUTTON 0x1000 +#define OLEMISC_ACTSLIKELABEL 0x2000 +#define OLEMISC_NOUIACTIVATE 0x4000 +#define OLEMISC_ALIGNABLE 0x8000 +#define OLEMISC_SIMPLEFRAME 0x10000 +#define OLEMISC_SETCLIENTSITEFIRST 0x20000 +#define OLEMISC_IMEMODE 0x40000 +#define OLEMISC_IGNOREACTIVATEWHENVISIBLE 0x80000 +#define OLEMISC_WANTSTOMENUMERGE 0x100000 +#define OLEMISC_SUPPORTSMULTILEVELUNDO 0x200000 +#define OLEIVERB_PROPERTIES (-7) +#define VT_STREAMED_PROPSET 73 +#define VT_STORED_PROPSET 74 +#define VT_BLOB_PROPSET 75 +#define VT_VERBOSE_ENUM 76 +#define VT_COLOR VT_I4 +#define VT_XPOS_PIXELS VT_I4 +#define VT_YPOS_PIXELS VT_I4 +#define VT_XSIZE_PIXELS VT_I4 +#define VT_YSIZE_PIXELS VT_I4 +#define VT_XPOS_HIMETRIC VT_I4 +#define VT_YPOS_HIMETRIC VT_I4 +#define VT_XSIZE_HIMETRIC VT_I4 +#define VT_YSIZE_HIMETRIC VT_I4 +#define VT_TRISTATE VT_I2 +#define VT_OPTEXCLUSIVE VT_BOOL +#define VT_FONT VT_DISPATCH +#define VT_PICTURE VT_DISPATCH +#define VT_HANDLE VT_I4 +#define OCM__BASE (WM_USER+0x1c00) +#define OCM_COMMAND (OCM__BASE+WM_COMMAND) +#define OCM_CTLCOLORBTN (OCM__BASE+WM_CTLCOLORBTN) +#define OCM_CTLCOLOREDIT (OCM__BASE+WM_CTLCOLOREDIT) +#define OCM_CTLCOLORDLG (OCM__BASE+WM_CTLCOLORDLG) +#define OCM_CTLCOLORLISTBOX (OCM__BASE+WM_CTLCOLORLISTBOX) +#define OCM_CTLCOLORMSGBOX (OCM__BASE+WM_CTLCOLORMSGBOX) +#define OCM_CTLCOLORSCROLLBAR (OCM__BASE+WM_CTLCOLORSCROLLBAR) +#define OCM_CTLCOLORSTATIC (OCM__BASE+WM_CTLCOLORSTATIC) +#define OCM_DRAWITEM (OCM__BASE+WM_DRAWITEM) +#define OCM_MEASUREITEM (OCM__BASE+WM_MEASUREITEM) +#define OCM_DELETEITEM (OCM__BASE+WM_DELETEITEM) +#define OCM_VKEYTOITEM (OCM__BASE+WM_VKEYTOITEM) +#define OCM_CHARTOITEM (OCM__BASE+WM_CHARTOITEM) +#define OCM_COMPAREITEM (OCM__BASE+WM_COMPAREITEM) +#define OCM_HSCROLL (OCM__BASE+WM_HSCROLL) +#define OCM_VSCROLL (OCM__BASE+WM_VSCROLL) +#define OCM_PARENTNOTIFY (OCM__BASE+WM_PARENTNOTIFY) +#define OCM_NOTIFY (OCM__BASE+WM_NOTIFY) +#define CTRLINFO_EATS_RETURN 1 +#define CTRLINFO_EATS_ESCAPE 2 +#define XFORMCOORDS_POSITION 1 +#define XFORMCOORDS_SIZE 2 +#define XFORMCOORDS_HIMETRICTOCONTAINER 4 +#define XFORMCOORDS_CONTAINERTOHIMETRIC 8 +#define GUIDKIND_DEFAULT_SOURCE_DISP_IID 1 +#define PROPPAGESTATUS_DIRTY 1 +#define PROPPAGESTATUS_VALIDATE 2 +#define FONTSIZE(n) {n##0000,0} +#define PICTURE_SCALABLE 1 +#define PICTURE_TRANSPARENT 2 +#define PICTYPE_UNINITIALIZED (-1) +#define PICTYPE_NONE 0 +#define PICTYPE_BITMAP 1 +#define PICTYPE_METAFILE 2 +#define PICTYPE_ICON 3 +#define PICTYPE_ENHMETAFILE 4 +#define DISPID_AUTOSIZE (-500) +#define DISPID_BACKCOLOR (-501) +#define DISPID_BACKSTYLE (-502) +#define DISPID_BORDERCOLOR (-503) +#define DISPID_BORDERSTYLE (-504) +#define DISPID_BORDERWIDTH (-505) +#define DISPID_DRAWMODE (-507) +#define DISPID_DRAWSTYLE (-508) +#define DISPID_DRAWWIDTH (-509) +#define DISPID_FILLCOLOR (-510) +#define DISPID_FILLSTYLE (-511) +#define DISPID_FONT (-512) +#define DISPID_FORECOLOR (-513) +#define DISPID_ENABLED (-514) +#define DISPID_HWND (-515) +#define DISPID_TABSTOP (-516) +#define DISPID_TEXT (-517) +#define DISPID_CAPTION (-518) +#define DISPID_BORDERVISIBLE (-519) +#define DISPID_APPEARANCE (-520) +#define DISPID_MOUSEPOINTER (-521) +#define DISPID_MOUSEICON (-522) +#define DISPID_PICTURE (-523) +#define DISPID_VALID (-524) +#define DISPID_REFRESH (-550) +#define DISPID_DOCLICK (-551) +#define DISPID_ABOUTBOX (-552) +#define DISPID_CLICK (-600) +#define DISPID_DBLCLICK (-601) +#define DISPID_KEYDOWN (-602) +#define DISPID_KEYPRESS (-603) +#define DISPID_KEYUP (-604) +#define DISPID_MOUSEDOWN (-605) +#define DISPID_MOUSEMOVE (-606) +#define DISPID_MOUSEUP (-607) +#define DISPID_ERROREVENT (-608) +#define DISPID_AMBIENT_BACKCOLOR (-701) +#define DISPID_AMBIENT_DISPLAYNAME (-702) +#define DISPID_AMBIENT_FONT (-703) +#define DISPID_AMBIENT_FORECOLOR (-704) +#define DISPID_AMBIENT_LOCALEID (-705) +#define DISPID_AMBIENT_MESSAGEREFLECT (-706) +#define DISPID_AMBIENT_SCALEUNITS (-707) +#define DISPID_AMBIENT_TEXTALIGN (-708) +#define DISPID_AMBIENT_USERMODE (-709) +#define DISPID_AMBIENT_UIDEAD (-710) +#define DISPID_AMBIENT_SHOWGRABHANDLES (-711) +#define DISPID_AMBIENT_SHOWHATCHING (-712) +#define DISPID_AMBIENT_DISPLAYASDEFAULT (-713) +#define DISPID_AMBIENT_SUPPORTSMNEMONICS (-714) +#define DISPID_AMBIENT_AUTOCLIP (-715) +#define DISPID_AMBIENT_APPEARANCE (-716) +#define DISPID_AMBIENT_CODEPAGE (-725) +#define DISPID_AMBIENT_PALETTE (-726) +#define DISPID_AMBIENT_CHARSET (-727) +#define DISPID_AMBIENT_RIGHTTOLEFT (-732) +#define DISPID_AMBIENT_TOPTOBOTTOM (-733) + +#define DISPID_FONT_NAME 0 +#define DISPID_FONT_SIZE 2 +#define DISPID_FONT_BOLD 3 +#define DISPID_FONT_ITALIC 4 +#define DISPID_FONT_UNDER 5 +#define DISPID_FONT_STRIKE 6 +#define DISPID_FONT_WEIGHT 7 +#define DISPID_FONT_CHARSET 8 +#define DISPID_PICT_HANDLE 0 +#define DISPID_PICT_HPAL 2 +#define DISPID_PICT_TYPE 3 +#define DISPID_PICT_WIDTH 4 +#define DISPID_PICT_HEIGHT 5 +#define DISPID_PICT_RENDER 6 + +typedef interface IOleControl *LPOLECONTROL; +typedef interface IOleControlSite *LPOLECONTROLSITE; +typedef interface ISimpleFrameSite *LPSIMPLEFRAMESITE; +typedef interface IPersistPropertyBag *LPPERSISTPROPERTYBAG; +typedef interface IPersistStreamInit *LPPERSISTSTREAMINIT; +typedef interface IPersistMemory *LPPERSISTMEMORY; +typedef interface IPropertyNotifySink* LPPROPERTYNOTIFYSINK; +typedef interface IProvideClassInfo *LPPROVIDECLASSINFO; +typedef interface IProvideClassInfo2 *LPPROVIDECLASSINFO2; +typedef interface IConnectionPointContainer *LPCONNECTIONPOINTCONTAINER; +typedef interface IClassFactory2 *LPCLASSFACTORY2; +typedef interface ISpecifyPropertyPages *LPSPECIFYPROPERTYPAGES; +typedef interface IPerPropertyBrowsing *LPPERPROPERTYBROWSING; +typedef interface IPropertyPage *LPPROPERTYPAGE; +typedef interface IPropertyPage2 *LPPROPERTYPAGE2; + +typedef interface IPicture *LPPICTURE; +typedef interface IPictureDisp *LPPICTUREDISP; +typedef long OLE_XPOS_PIXELS; +typedef long OLE_YPOS_PIXELS; +typedef long OLE_XSIZE_PIXELS; +typedef long OLE_YSIZE_PIXELS; +typedef float OLE_XPOS_CONTAINER; +typedef float OLE_YPOS_CONTAINER; +typedef float OLE_XSIZE_CONTAINER; + +typedef VARIANT_BOOL OLE_OPTEXCLUSIVE; +typedef VARIANT_BOOL OLE_CANCELBOOL; +typedef VARIANT_BOOL OLE_ENABLEDEFAULTBOOL; + +#pragma pack(push,8) +typedef enum { triUnchecked,triChecked1,triGray } OLE_TRISTATE; +typedef struct tagOCPFIPARAMS { + ULONG cbStructSize; + HWND hWndOwner; + int x; + int y; + LPCOLESTR lpszCaption; + ULONG cObjects; + LPUNKNOWN *lplpUnk; + ULONG cPages; + CLSID *lpPages; + LCID lcid; + DISPID dispidInitialProperty; +} OCPFIPARAMS,*LPOCPFIPARAMS; +typedef struct tagFONTDESC { + UINT cbSizeofstruct; + LPOLESTR lpstrName; + CY cySize; + SHORT sWeight; + SHORT sCharset; + BOOL fItalic; + BOOL fUnderline; + BOOL fStrikethrough; +} FONTDESC,*LPFONTDESC; +typedef struct tagPICTDESC { + UINT cbSizeofstruct; + UINT picType; + _ANONYMOUS_UNION union { + struct { + HBITMAP hbitmap; + HPALETTE hpal; + } bmp; + struct { + HMETAFILE hmeta; + int xExt; + int yExt; + } wmf; + struct { + HICON hicon; + } icon; + struct { + HENHMETAFILE hemf; + } emf; + } DUMMYUNIONNAME; +} PICTDESC,*LPPICTDESC; +#pragma pack(pop) + +STDAPI DllRegisterServer(void); +STDAPI DllUnregisterServer(void); +STDAPI OleCreateFontIndirect(LPFONTDESC,REFIID,PVOID*); +STDAPI OleCreatePictureIndirect(LPPICTDESC,REFIID,BOOL,PVOID*); +STDAPI OleCreatePropertyFrame(HWND,UINT,UINT,LPCOLESTR,ULONG,LPUNKNOWN*,ULONG,LPCLSID,LCID,DWORD,PVOID); +STDAPI OleCreatePropertyFrameIndirect(LPOCPFIPARAMS); +STDAPI_(HCURSOR) OleIconToCursor(HINSTANCE,HICON); +STDAPI OleLoadPicture(LPSTREAM,LONG,BOOL,REFIID,PVOID*); +STDAPI OleLoadPictureEx(LPSTREAM,LONG,BOOL,REFIID,DWORD,DWORD,DWORD,LPVOID*); +STDAPI OleLoadPicturePath(LPOLESTR,LPUNKNOWN,DWORD,OLE_COLOR,REFIID,LPVOID*); +STDAPI OleLoadPictureFile(VARIANT,LPDISPATCH*); +STDAPI OleLoadPictureFileEx(VARIANT,DWORD,DWORD,DWORD,LPDISPATCH*); +STDAPI OleSavePictureFile(LPDISPATCH,BSTR); +STDAPI OleTranslateColor(OLE_COLOR,HPALETTE,COLORREF*); +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/olectlid.h b/reactos/w32api/include/olectlid.h new file mode 100644 index 00000000000..73e935cca08 --- /dev/null +++ b/reactos/w32api/include/olectlid.h @@ -0,0 +1,114 @@ +#ifndef _OLECTLID_H +#define _OLECTLID_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +extern const GUID IID_IDispatch; +extern const GUID IID_IPropertyNotifySink; +extern const GUID IID_IClassFactory2; +extern const GUID IID_IProvideClassInfo; +extern const GUID IID_IProvideClassInfo2; +extern const GUID IID_IConnectionPointContainer; +extern const GUID IID_IEnumConnectionPoints; +extern const GUID IID_IConnectionPoint; +extern const GUID IID_IEnumConnections; +extern const GUID IID_IOleControl; +extern const GUID IID_IOleControlSite; +extern const GUID IID_ISimpleFrameSite; +extern const GUID IID_IPersistStreamInit; +extern const GUID IID_IPersistMemory; +extern const GUID IID_IPersistPropertyBag; +extern const GUID IID_IPropertyBag; +extern const GUID IID_IErrorLog; +extern const GUID IID_IPropertyFrame; +extern const GUID IID_ISpecifyPropertyPages; +extern const GUID IID_IPerPropertyBrowsing; +extern const GUID IID_IPropertyPageSite; +extern const GUID IID_IPropertyPage; +extern const GUID IID_IPropertyPage2; +extern const GUID CLSID_CFontPropPage; +extern const GUID CLSID_CColorPropPage; +extern const GUID CLSID_CPicturePropPage; +extern const GUID CLSID_PersistPropset; +extern const GUID CLSID_ConvertVBX; +extern const GUID CLSID_StdFont; +extern const GUID CLSID_StdPicture; +extern const GUID IID_IFont; +extern const GUID IID_IFontDisp; +extern const GUID IID_IPicture; +extern const GUID IID_IPictureDisp; +extern const GUID GUID_HIMETRIC; +extern const GUID GUID_COLOR; +extern const GUID GUID_XPOSPIXEL; +extern const GUID GUID_YPOSPIXEL; +extern const GUID GUID_XSIZEPIXEL; +extern const GUID GUID_YSIZEPIXEL; +extern const GUID GUID_XPOS; +extern const GUID GUID_YPOS; +extern const GUID GUID_XSIZE; +extern const GUID GUID_YSIZE; +extern const GUID GUID_TRISTATE; +extern const GUID GUID_OPTIONVALUEEXCLUSIVE; +extern const GUID GUID_CHECKVALUEEXCLUSIVE; +extern const GUID GUID_FONTNAME; +extern const GUID GUID_FONTSIZE; +extern const GUID GUID_FONTBOLD; +extern const GUID GUID_FONTITALIC; +extern const GUID GUID_FONTUNDERSCORE; +extern const GUID GUID_FONTSTRIKETHROUGH; +extern const GUID GUID_HANDLE; +extern const GUID IID_IEnumUnknown; +extern const GUID IID_IEnumString; +extern const GUID IID_IEnumMoniker; +extern const GUID IID_IEnumFORMATETC; +extern const GUID IID_IEnumOLEVERB; +extern const GUID IID_IEnumSTATDATA; +extern const GUID IID_IEnumSTATSTG; +extern const GUID IID_IEnumGeneric; +extern const GUID IID_IEnumHolder; +extern const GUID IID_IEnumCallback; +extern const GUID IID_IPersistStream; +extern const GUID IID_IPersistStorage; +extern const GUID IID_IPersistFile; +extern const GUID IID_IPersist; +extern const GUID IID_IViewObject; +extern const GUID IID_IDataObject; +extern const GUID IID_IAdviseSink; +extern const GUID IID_IDataAdviseHolder; +extern const GUID IID_IOleAdviseHolder; +extern const GUID IID_IOleObject; +extern const GUID IID_IOleInPlaceObject; +extern const GUID IID_IOleWindow; +extern const GUID IID_IOleInPlaceUIWindow; +extern const GUID IID_IOleInPlaceFrame; +extern const GUID IID_IOleInPlaceActiveObject; +extern const GUID IID_IOleClientSite; +extern const GUID IID_IOleInPlaceSite; +extern const GUID IID_IParseDisplayName; +extern const GUID IID_IOleContainer; +extern const GUID IID_IOleItemContainer; +extern const GUID IID_IOleLink; +extern const GUID IID_IOleCache; +extern const GUID IID_IOleManager; +extern const GUID IID_IOlePresObj; +extern const GUID IID_IDropSource; +extern const GUID IID_IDropTarget; +extern const GUID IID_IDebug; +extern const GUID IID_IDebugStream; +extern const GUID IID_IAdviseSink2; +extern const GUID IID_IRunnableObject; +extern const GUID IID_IViewObject2; +extern const GUID IID_IOleCache2; +extern const GUID IID_IOleCacheControl; +extern const GUID CLSID_Picture_Metafile; +extern const GUID CLSID_Picture_Dib; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/oledlg.h b/reactos/w32api/include/oledlg.h new file mode 100644 index 00000000000..11dd88b9f1e --- /dev/null +++ b/reactos/w32api/include/oledlg.h @@ -0,0 +1,935 @@ +#ifndef _OLEDLG_H +#define _OLEDLG_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#include <windows.h> +#include <shellapi.h> +#include <commdlg.h> +#include <ole2.h> +#include <string.h> +/* #include <tchar.h> */ +#include <dlgs.h> +#include <prsht.h> +#define PS_MAXLINKTYPES 8 +#define OLESTDDELIM TEXT("\\") +#define SZOLEUI_MSG_HELP TEXT("OLEUI_MSG_HELP") +#define SZOLEUI_MSG_ENDDIALOG TEXT("OLEUI_MSG_ENDDIALOG") +#define SZOLEUI_MSG_BROWSE TEXT("OLEUI_MSG_BROWSE") +#define SZOLEUI_MSG_CHANGEICON TEXT("OLEUI_MSG_CHANGEICON") +#define SZOLEUI_MSG_CLOSEBUSYDIALOG TEXT("OLEUI_MSG_CLOSEBUSYDIALOG") +#define SZOLEUI_MSG_CONVERT TEXT("OLEUI_MSG_CONVERT") +#define SZOLEUI_MSG_CHANGESOURCE TEXT("OLEUI_MSG_CHANGESOURCE") +#define SZOLEUI_MSG_ADDCONTROL TEXT("OLEUI_MSG_ADDCONTROL") +#define SZOLEUI_MSG_BROWSE_OFN TEXT("OLEUI_MSG_BROWSE_OFN") +#define PROP_HWND_CHGICONDLG TEXT("HWND_CIDLG") +#define IDC_OLEUIHELP 99 +#define IDC_IO_CREATENEW 2100 +#define IDC_IO_CREATEFROMFILE 2101 +#define IDC_IO_LINKFILE 2102 +#define IDC_IO_OBJECTTYPELIST 2103 +#define IDC_IO_DISPLAYASICON 2104 +#define IDC_IO_CHANGEICON 2105 +#define IDC_IO_FILE 2106 +#define IDC_IO_FILEDISPLAY 2107 +#define IDC_IO_RESULTIMAGE 2108 +#define IDC_IO_RESULTTEXT 2109 +#define IDC_IO_ICONDISPLAY 2110 +#define IDC_IO_OBJECTTYPETEXT 2111 +#define IDC_IO_FILETEXT 2112 +#define IDC_IO_FILETYPE 2113 +#define IDC_IO_INSERTCONTROL 2114 +#define IDC_IO_ADDCONTROL 2115 +#define IDC_IO_CONTROLTYPELIST 2116 +#define IDC_PS_PASTE 500 +#define IDC_PS_PASTELINK 501 +#define IDC_PS_SOURCETEXT 502 +#define IDC_PS_PASTELIST 503 +#define IDC_PS_PASTELINKLIST 504 +#define IDC_PS_DISPLAYLIST 505 +#define IDC_PS_DISPLAYASICON 506 +#define IDC_PS_ICONDISPLAY 507 +#define IDC_PS_CHANGEICON 508 +#define IDC_PS_RESULTIMAGE 509 +#define IDC_PS_RESULTTEXT 510 +#define IDC_CI_GROUP 120 +#define IDC_CI_CURRENT 121 +#define IDC_CI_CURRENTICON 122 +#define IDC_CI_DEFAULT 123 +#define IDC_CI_DEFAULTICON 124 +#define IDC_CI_FROMFILE 125 +#define IDC_CI_FROMFILEEDIT 126 +#define IDC_CI_ICONLIST 127 +#define IDC_CI_LABEL 128 +#define IDC_CI_LABELEDIT 129 +#define IDC_CI_BROWSE 130 +#define IDC_CI_ICONDISPLAY 131 +#define IDC_CV_OBJECTTYPE 150 +#define IDC_CV_DISPLAYASICON 152 +#define IDC_CV_CHANGEICON 153 +#define IDC_CV_ACTIVATELIST 154 +#define IDC_CV_CONVERTTO 155 +#define IDC_CV_ACTIVATEAS 156 +#define IDC_CV_RESULTTEXT 157 +#define IDC_CV_CONVERTLIST 158 +#define IDC_CV_ICONDISPLAY 165 +#define IDC_EL_CHANGESOURCE 201 +#define IDC_EL_AUTOMATIC 202 +#define IDC_EL_CANCELLINK 209 +#define IDC_EL_UPDATENOW 210 +#define IDC_EL_OPENSOURCE 211 +#define IDC_EL_MANUAL 212 +#define IDC_EL_LINKSOURCE 216 +#define IDC_EL_LINKTYPE 217 +#define IDC_EL_LINKSLISTBOX 206 +#define IDC_EL_COL1 220 +#define IDC_EL_COL2 221 +#define IDC_EL_COL3 222 +#define IDC_BZ_RETRY 600 +#define IDC_BZ_ICON 601 +#define IDC_BZ_MESSAGE1 602 +#define IDC_BZ_SWITCHTO 604 +#define IDC_UL_METER 1029 +#define IDC_UL_STOP 1030 +#define IDC_UL_PERCENT 1031 +#define IDC_UL_PROGRESS 1032 +#define IDC_PU_LINKS 900 +#define IDC_PU_TEXT 901 +#define IDC_PU_CONVERT 902 +#define IDC_PU_ICON 908 +#define IDC_GP_OBJECTNAME 1009 +#define IDC_GP_OBJECTTYPE 1010 +#define IDC_GP_OBJECTSIZE 1011 +#define IDC_GP_CONVERT 1013 +#define IDC_GP_OBJECTICON 1014 +#define IDC_GP_OBJECTLOCATION 1022 +#define IDC_VP_PERCENT 1000 +#define IDC_VP_CHANGEICON 1001 +#define IDC_VP_EDITABLE 1002 +#define IDC_VP_ASICON 1003 +#define IDC_VP_RELATIVE 1005 +#define IDC_VP_SPIN 1006 +#define IDC_VP_SCALETXT 1034 +#define IDC_VP_ICONDISPLAY 1021 +#define IDC_VP_RESULTIMAGE 1033 +#define IDC_LP_OPENSOURCE 1006 +#define IDC_LP_UPDATENOW 1007 +#define IDC_LP_BREAKLINK 1008 +#define IDC_LP_LINKSOURCE 1012 +#define IDC_LP_CHANGESOURCE 1015 +#define IDC_LP_AUTOMATIC 1016 +#define IDC_LP_MANUAL 1017 +#define IDC_LP_DATE 1018 +#define IDC_LP_TIME 1019 +#define IDD_INSERTOBJECT 1000 +#define IDD_CHANGEICON 1001 +#define IDD_CONVERT 1002 +#define IDD_PASTESPECIAL 1003 +#define IDD_EDITLINKS 1004 +#define IDD_BUSY 1006 +#define IDD_UPDATELINKS 1007 +#define IDD_CHANGESOURCE 1009 +#define IDD_INSERTFILEBROWSE 1010 +#define IDD_CHANGEICONBROWSE 1011 +#define IDD_CONVERTONLY 1012 +#define IDD_CHANGESOURCE4 1013 +#define IDD_GNRLPROPS 1100 +#define IDD_VIEWPROPS 1101 +#define IDD_LINKPROPS 1102 +#define IDD_CANNOTUPDATELINK 1008 +#define IDD_LINKSOURCEUNAVAILABLE 1020 +#define IDD_SERVERNOTFOUND 1023 +#define IDD_OUTOFMEMORY 1024 +#define IDD_SERVERNOTREGW 1021 +#define IDD_LINKTYPECHANGEDW 1022 +#define IDD_SERVERNOTREGA 1025 +#define IDD_LINKTYPECHANGEDA 1026 +#define ID_BROWSE_CHANGEICON 1 +#define ID_BROWSE_INSERTFILE 2 +#define ID_BROWSE_ADDCONTROL 3 +#define ID_BROWSE_CHANGESOURCE 4 +#define OLEUI_FALSE 0 +#define OLEUI_SUCCESS 1 +#define OLEUI_OK 1 +#define OLEUI_CANCEL 2 +#define OLEUI_ERR_STANDARDMIN 100 +#define OLEUI_ERR_STRUCTURENULL 101 +#define OLEUI_ERR_STRUCTUREINVALID 102 +#define OLEUI_ERR_CBSTRUCTINCORRECT 103 +#define OLEUI_ERR_HWNDOWNERINVALID 104 +#define OLEUI_ERR_LPSZCAPTIONINVALID 105 +#define OLEUI_ERR_LPFNHOOKINVALID 106 +#define OLEUI_ERR_HINSTANCEINVALID 107 +#define OLEUI_ERR_LPSZTEMPLATEINVALID 108 +#define OLEUI_ERR_HRESOURCEINVALID 109 +#define OLEUI_ERR_FINDTEMPLATEFAILURE 110 +#define OLEUI_ERR_LOADTEMPLATEFAILURE 111 +#define OLEUI_ERR_DIALOGFAILURE 112 +#define OLEUI_ERR_LOCALMEMALLOC 113 +#define OLEUI_ERR_GLOBALMEMALLOC 114 +#define OLEUI_ERR_LOADSTRING 115 +#define OLEUI_ERR_OLEMEMALLOC 116 +#define OLEUI_ERR_STANDARDMAX 116 +#define OPF_OBJECTISLINK 1 +#define OPF_NOFILLDEFAULT 2 +#define OPF_SHOWHELP 4 +#define OPF_DISABLECONVERT 8 +#define OLEUI_OPERR_SUBPROPNULL OLEUI_ERR_STANDARDMAX +#define OLEUI_OPERR_SUBPROPINVALID (OLEUI_ERR_STANDARDMAX+1) +#define OLEUI_OPERR_PROPSHEETNULL (OLEUI_ERR_STANDARDMAX+2) +#define OLEUI_OPERR_PROPSHEETINVALID (OLEUI_ERR_STANDARDMAX+3) +#define OLEUI_OPERR_SUPPROP (OLEUI_ERR_STANDARDMAX+4) +#define OLEUI_OPERR_PROPSINVALID (OLEUI_ERR_STANDARDMAX+5) +#define OLEUI_OPERR_PAGESINCORRECT (OLEUI_ERR_STANDARDMAX+6) +#define OLEUI_OPERR_INVALIDPAGES (OLEUI_ERR_STANDARDMAX+7) +#define OLEUI_OPERR_NOTSUPPORTED (OLEUI_ERR_STANDARDMAX+8) +#define OLEUI_OPERR_DLGPROCNOTNULL (OLEUI_ERR_STANDARDMAX+9) +#define OLEUI_OPERR_LPARAMNOTZERO (OLEUI_ERR_STANDARDMAX+10) +#define OLEUI_GPERR_STRINGINVALID (OLEUI_ERR_STANDARDMAX+11) +#define OLEUI_GPERR_CLASSIDINVALID (OLEUI_ERR_STANDARDMAX+12) +#define OLEUI_GPERR_LPCLSIDEXCLUDEINVALID (OLEUI_ERR_STANDARDMAX+13) +#define OLEUI_GPERR_CBFORMATINVALID (OLEUI_ERR_STANDARDMAX+14) +#define OLEUI_VPERR_METAPICTINVALID (OLEUI_ERR_STANDARDMAX+15) +#define OLEUI_VPERR_DVASPECTINVALID (OLEUI_ERR_STANDARDMAX+16) +#define OLEUI_LPERR_LINKCNTRNULL (OLEUI_ERR_STANDARDMAX+17) +#define OLEUI_LPERR_LINKCNTRINVALID (OLEUI_ERR_STANDARDMAX+18) +#define OLEUI_OPERR_PROPERTYSHEET (OLEUI_ERR_STANDARDMAX+19) +#define OLEUI_OPERR_OBJINFOINVALID (OLEUI_ERR_STANDARDMAX+20) +#define OLEUI_OPERR_LINKINFOINVALID (OLEUI_ERR_STANDARDMAX+21) +#define OLEUI_QUERY_GETCLASSID 65280 +#define OLEUI_QUERY_LINKBROKEN 65281 +#define IOF_SHOWHELP 1 +#define IOF_SELECTCREATENEW 2 +#define IOF_SELECTCREATEFROMFILE 4 +#define IOF_CHECKLINK 8 +#define IOF_CHECKDISPLAYASICON 16 +#define IOF_CREATENEWOBJECT 32 +#define IOF_CREATEFILEOBJECT 64 +#define IOF_CREATELINKOBJECT 128 +#define IOF_DISABLELINK 256 +#define IOF_VERIFYSERVERSEXIST 512 +#define IOF_DISABLEDISPLAYASICON 1024 +#define IOF_HIDECHANGEICON 2048 +#define IOF_SHOWINSERTCONTROL 4096 +#define IOF_SELECTCREATECONTROL 8192 +#define OLEUI_IOERR_LPSZFILEINVALID OLEUI_ERR_STANDARDMAX +#define OLEUI_IOERR_LPSZLABELINVALID (OLEUI_ERR_STANDARDMAX+1) +#define OLEUI_IOERR_HICONINVALID (OLEUI_ERR_STANDARDMAX+2) +#define OLEUI_IOERR_LPFORMATETCINVALID (OLEUI_ERR_STANDARDMAX+3) +#define OLEUI_IOERR_PPVOBJINVALID (OLEUI_ERR_STANDARDMAX+4) +#define OLEUI_IOERR_LPIOLECLIENTSITEINVALID (OLEUI_ERR_STANDARDMAX+5) +#define OLEUI_IOERR_LPISTORAGEINVALID (OLEUI_ERR_STANDARDMAX+6) +#define OLEUI_IOERR_SCODEHASERROR (OLEUI_ERR_STANDARDMAX+7) +#define OLEUI_IOERR_LPCLSIDEXCLUDEINVALID (OLEUI_ERR_STANDARDMAX+8) +#define OLEUI_IOERR_CCHFILEINVALID (OLEUI_ERR_STANDARDMAX+9) +#define PSF_SHOWHELP 1 +#define PSF_SELECTPASTE 2 +#define PSF_SELECTPASTELINK 4 +#define PSF_CHECKDISPLAYASICON 8 +#define PSF_DISABLEDISPLAYASICON 16 +#define PSF_HIDECHANGEICON 32 +#define PSF_STAYONCLIPBOARDCHANGE 64 +#define PSF_NOREFRESHDATAOBJECT 128 +#define OLEUI_IOERR_SRCDATAOBJECTINVALID OLEUI_ERR_STANDARDMAX +#define OLEUI_IOERR_ARRPASTEENTRIESINVALID (OLEUI_ERR_STANDARDMAX+1) +#define OLEUI_IOERR_ARRLINKTYPESINVALID (OLEUI_ERR_STANDARDMAX+2) +#define OLEUI_PSERR_CLIPBOARDCHANGED (OLEUI_ERR_STANDARDMAX+3) +#define OLEUI_PSERR_GETCLIPBOARDFAILED (OLEUI_ERR_STANDARDMAX+4) +#define OLEUI_ELERR_LINKCNTRNULL OLEUI_ERR_STANDARDMAX +#define OLEUI_ELERR_LINKCNTRINVALID (OLEUI_ERR_STANDARDMAX+1) +#define ELF_SHOWHELP 1 +#define ELF_DISABLEUPDATENOW 2 +#define ELF_DISABLEOPENSOURCE 4 +#define ELF_DISABLECHANGESOURCE 8 +#define ELF_DISABLECANCELLINK 16 +#define CIF_SHOWHELP 1 +#define CIF_SELECTCURRENT 2 +#define CIF_SELECTDEFAULT 4 +#define CIF_SELECTFROMFILE 8 +#define CIF_USEICONEXE 16 +#define OLEUI_CIERR_MUSTHAVECLSID OLEUI_ERR_STANDARDMAX +#define OLEUI_CIERR_MUSTHAVECURRENTMETAFILE (OLEUI_ERR_STANDARDMAX+1) +#define OLEUI_CIERR_SZICONEXEINVALID (OLEUI_ERR_STANDARDMAX+2) +#define CF_SHOWHELPBUTTON 1 +#define CF_SETCONVERTDEFAULT 2 +#define CF_SETACTIVATEDEFAULT 4 +#define CF_SELECTCONVERTTO 8 +#define CF_SELECTACTIVATEAS 16 +#define CF_DISABLEDISPLAYASICON 32 +#define CF_DISABLEACTIVATEAS 64 +#define CF_HIDECHANGEICON 128 +#define CF_CONVERTONLY 256 +#define OLEUI_CTERR_CLASSIDINVALID (OLEUI_ERR_STANDARDMAX+1) +#define OLEUI_CTERR_DVASPECTINVALID (OLEUI_ERR_STANDARDMAX+2) +#define OLEUI_CTERR_CBFORMATINVALID (OLEUI_ERR_STANDARDMAX+3) +#define OLEUI_CTERR_HMETAPICTINVALID (OLEUI_ERR_STANDARDMAX+4) +#define OLEUI_CTERR_STRINGINVALID (OLEUI_ERR_STANDARDMAX+5) +#define BZ_DISABLECANCELBUTTON 1 +#define BZ_DISABLESWITCHTOBUTTON 2 +#define BZ_DISABLERETRYBUTTON 4 +#define BZ_NOTRESPONDINGDIALOG 8 +#define OLEUI_BZERR_HTASKINVALID OLEUI_ERR_STANDARDMAX +#define OLEUI_BZ_SWITCHTOSELECTED (OLEUI_ERR_STANDARDMAX+1) +#define OLEUI_BZ_RETRYSELECTED (OLEUI_ERR_STANDARDMAX+2) +#define OLEUI_BZ_CALLUNBLOCKED (OLEUI_ERR_STANDARDMAX+3) +#define CSF_SHOWHELP 1 +#define CSF_VALIDSOURCE 2 +#define CSF_ONLYGETSOURCE 4 +#define CSF_EXPLORER 8 +#define OLEUI_CSERR_LINKCNTRNULL OLEUI_ERR_STANDARDMAX +#define OLEUI_CSERR_LINKCNTRINVALID (OLEUI_ERR_STANDARDMAX+1) +#define OLEUI_CSERR_FROMNOTNULL (OLEUI_ERR_STANDARDMAX+2) +#define OLEUI_CSERR_TONOTNULL (OLEUI_ERR_STANDARDMAX+3) +#define OLEUI_CSERR_SOURCENULL (OLEUI_ERR_STANDARDMAX+4) +#define OLEUI_CSERR_SOURCEINVALID (OLEUI_ERR_STANDARDMAX+5) +#define OLEUI_CSERR_SOURCEPARSERROR (OLEUI_ERR_STANDARDMAX+6) +#define OLEUI_CSERR_SOURCEPARSEERROR (OLEUI_ERR_STANDARDMAX+7) +#define VPF_SELECTRELATIVE 1 +#define VPF_DISABLERELATIVE 2 +#define VPF_DISABLESCALE 4 + +#ifndef RC_INVOKED +#pragma pack(push, 8) +typedef UINT (CALLBACK *LPFNOLEUIHOOK)(HWND, UINT, WPARAM, LPARAM); +typedef struct tagOLEUIINSERTOBJECTW { + DWORD cbStruct; + DWORD dwFlags; + HWND hWndOwner; + LPCWSTR lpszCaption; + LPFNOLEUIHOOK lpfnHook; + LPARAM lCustData; + HINSTANCE hInstance; + LPCWSTR lpszTemplate; + HRSRC hResource; + CLSID clsid; + LPWSTR lpszFile; + UINT cchFile; + UINT cClsidExclude; + LPCLSID lpClsidExclude; + IID iid; + DWORD oleRender; + LPFORMATETC lpFormatEtc; + LPOLECLIENTSITE lpIOleClientSite; + LPSTORAGE lpIStorage; + PVOID *ppvObj; + SCODE sc; + HGLOBAL hMetaPict; +} OLEUIINSERTOBJECTW,*POLEUIINSERTOBJECTW,*LPOLEUIINSERTOBJECTW; +typedef struct tagOLEUIINSERTOBJECTA { + DWORD cbStruct; + DWORD dwFlags; + HWND hWndOwner; + LPCSTR lpszCaption; + LPFNOLEUIHOOK lpfnHook; + LPARAM lCustData; + HINSTANCE hInstance; + LPCSTR lpszTemplate; + HRSRC hResource; + CLSID clsid; + LPSTR lpszFile; + UINT cchFile; + UINT cClsidExclude; + LPCLSID lpClsidExclude; + IID iid; + DWORD oleRender; + LPFORMATETC lpFormatEtc; + LPOLECLIENTSITE lpIOleClientSite; + LPSTORAGE lpIStorage; + PVOID *ppvObj; + SCODE sc; + HGLOBAL hMetaPict; +} OLEUIINSERTOBJECTA,*POLEUIINSERTOBJECTA,*LPOLEUIINSERTOBJECTA; +STDAPI_(UINT) OleUIInsertObjectW(LPOLEUIINSERTOBJECTW); +STDAPI_(UINT) OleUIInsertObjectA(LPOLEUIINSERTOBJECTA); +typedef enum tagOLEUIPASTEFLAG { + OLEUIPASTE_PASTEONLY, + OLEUIPASTE_LINKTYPE1, + OLEUIPASTE_LINKTYPE2, + OLEUIPASTE_LINKTYPE3=4, + OLEUIPASTE_LINKTYPE4=8, + OLEUIPASTE_LINKTYPE5=16, + OLEUIPASTE_LINKTYPE6=32, + OLEUIPASTE_LINKTYPE7=64, + OLEUIPASTE_LINKTYPE8=128, + OLEUIPASTE_PASTE=512, + OLEUIPASTE_LINKANYTYPE=1024, + OLEUIPASTE_ENABLEICON=2048 +} OLEUIPASTEFLAG; +typedef struct tagOLEUIPASTEENTRYW { + FORMATETC fmtetc; + LPCWSTR lpstrFormatName; + LPCWSTR lpstrResultText; + DWORD dwFlags; + DWORD dwScratchSpace; +} OLEUIPASTEENTRYW,*POLEUIPASTEENTRYW,*LPOLEUIPASTEENTRYW; +typedef struct tagOLEUIPASTEENTRYA { + FORMATETC fmtetc; + LPCSTR lpstrFormatName; + LPCSTR lpstrResultText; + DWORD dwFlags; + DWORD dwScratchSpace; +} OLEUIPASTEENTRYA,*POLEUIPASTEENTRYA,*LPOLEUIPASTEENTRYA; +typedef struct tagOLEUIPASTESPECIALW { + DWORD cbStruct; + DWORD dwFlags; + HWND hWndOwner; + LPCWSTR lpszCaption; + LPFNOLEUIHOOK lpfnHook; + LPARAM lCustData; + HINSTANCE hInstance; + LPCWSTR lpszTemplate; + HRSRC hResource; + LPDATAOBJECT lpSrcDataObj; + LPOLEUIPASTEENTRYW arrPasteEntries; + int cPasteEntries; + UINT *arrLinkTypes; + int cLinkTypes; + UINT cClsidExclude; + LPCLSID lpClsidExclude; + int nSelectedIndex; + BOOL fLink; + HGLOBAL hMetaPict; + SIZEL sizel; +} OLEUIPASTESPECIALW,*POLEUIPASTESPECIALW,*LPOLEUIPASTESPECIALW; +typedef struct tagOLEUIPASTESPECIALA { + DWORD cbStruct; + DWORD dwFlags; + HWND hWndOwner; + LPCSTR lpszCaption; + LPFNOLEUIHOOK lpfnHook; + LPARAM lCustData; + HINSTANCE hInstance; + LPCSTR lpszTemplate; + HRSRC hResource; + LPDATAOBJECT lpSrcDataObj; + LPOLEUIPASTEENTRYA arrPasteEntries; + int cPasteEntries; + UINT *arrLinkTypes; + int cLinkTypes; + UINT cClsidExclude; + LPCLSID lpClsidExclude; + int nSelectedIndex; + BOOL fLink; + HGLOBAL hMetaPict; + SIZEL sizel; +} OLEUIPASTESPECIALA,*POLEUIPASTESPECIALA,*LPOLEUIPASTESPECIALA; +#undef INTERFACE +#define INTERFACE IOleUILinkContainerW +DECLARE_INTERFACE_(IOleUILinkContainerW, IUnknown) +{ + STDMETHOD(QueryInterface) (THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + STDMETHOD_(DWORD,GetNextLink) (THIS_ DWORD dwLink) PURE; + STDMETHOD(SetLinkUpdateOptions) (THIS_ DWORD,DWORD) PURE; + STDMETHOD(GetLinkUpdateOptions) (THIS_ DWORD,PDWORD) PURE; + STDMETHOD(SetLinkSource) (THIS_ DWORD, LPWSTR,ULONG,PULONG,BOOL) PURE; + STDMETHOD(GetLinkSource) (THIS_ DWORD,LPWSTR*,PULONG,LPWSTR*,LPWSTR*,BOOL*,BOOL*) PURE; + STDMETHOD(OpenLinkSource) (THIS_ DWORD) PURE; + STDMETHOD(UpdateLink) (THIS_ DWORD,BOOL,BOOL) PURE; + STDMETHOD(CancelLink) (THIS_ DWORD) PURE; +}; +typedef IOleUILinkContainerW *LPOLEUILINKCONTAINERW; +#undef INTERFACE +#define INTERFACE IOleUILinkContainerA +DECLARE_INTERFACE_(IOleUILinkContainerA, IUnknown) +{ + STDMETHOD(QueryInterface) (THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + STDMETHOD_(DWORD,GetNextLink) (THIS_ DWORD) PURE; + STDMETHOD(SetLinkUpdateOptions) (THIS_ DWORD,DWORD) PURE; + STDMETHOD(GetLinkUpdateOptions) (THIS_ DWORD,PDWORD) PURE; + STDMETHOD(SetLinkSource) (THIS_ DWORD, LPSTR,ULONG,PULONG,BOOL) PURE; + STDMETHOD(GetLinkSource) (THIS_ DWORD,LPSTR*,PULONG,LPSTR*,LPSTR*,BOOL*,BOOL*) PURE; + STDMETHOD(OpenLinkSource) (THIS_ DWORD) PURE; + STDMETHOD(UpdateLink) (THIS_ DWORD,BOOL,BOOL) PURE; + STDMETHOD(CancelLink) (THIS_ DWORD) PURE; +}; +typedef IOleUILinkContainerA *LPOLEUILINKCONTAINERA; +typedef struct tagOLEUIEDITLINKSW { + DWORD cbStruct; + DWORD dwFlags; + HWND hWndOwner; + LPCWSTR lpszCaption; + LPFNOLEUIHOOK lpfnHook; + LPARAM lCustData; + HINSTANCE hInstance; + LPCWSTR lpszTemplate; + HRSRC hResource; + LPOLEUILINKCONTAINERW lpOleUILinkContainer; +} OLEUIEDITLINKSW,*POLEUIEDITLINKSW,*LPOLEUIEDITLINKSW; +typedef struct tagOLEUIEDITLINKSA { + DWORD cbStruct; + DWORD dwFlags; + HWND hWndOwner; + LPCSTR lpszCaption; + LPFNOLEUIHOOK lpfnHook; + LPARAM lCustData; + HINSTANCE hInstance; + LPCSTR lpszTemplate; + HRSRC hResource; + LPOLEUILINKCONTAINERA lpOleUILinkContainer; +} OLEUIEDITLINKSA,*POLEUIEDITLINKSA,*LPOLEUIEDITLINKSA; +typedef struct tagOLEUICHANGEICONW { + DWORD cbStruct; + DWORD dwFlags; + HWND hWndOwner; + LPCWSTR lpszCaption; + LPFNOLEUIHOOK lpfnHook; + LPARAM lCustData; + HINSTANCE hInstance; + LPCWSTR lpszTemplate; + HRSRC hResource; + HGLOBAL hMetaPict; + CLSID clsid; + WCHAR szIconExe[MAX_PATH]; + int cchIconExe; +} OLEUICHANGEICONW,*POLEUICHANGEICONW,*LPOLEUICHANGEICONW; +typedef struct tagOLEUICHANGEICONA { + DWORD cbStruct; + DWORD dwFlags; + HWND hWndOwner; + LPCSTR lpszCaption; + LPFNOLEUIHOOK lpfnHook; + LPARAM lCustData; + HINSTANCE hInstance; + LPCSTR lpszTemplate; + HRSRC hResource; + HGLOBAL hMetaPict; + CLSID clsid; + CHAR szIconExe[MAX_PATH]; + int cchIconExe; +} OLEUICHANGEICONA,*POLEUICHANGEICONA,*LPOLEUICHANGEICONA; +typedef struct tagOLEUICONVERTW { + DWORD cbStruct; + DWORD dwFlags; + HWND hWndOwner; + LPCWSTR lpszCaption; + LPFNOLEUIHOOK lpfnHook; + LPARAM lCustData; + HINSTANCE hInstance; + LPCWSTR lpszTemplate; + HRSRC hResource; + CLSID clsid; + CLSID clsidConvertDefault; + CLSID clsidActivateDefault; + CLSID clsidNew; + DWORD dvAspect; + WORD wFormat; + BOOL fIsLinkedObject; + HGLOBAL hMetaPict; + LPWSTR lpszUserType; + BOOL fObjectsIconChanged; + LPWSTR lpszDefLabel; + UINT cClsidExclude; + LPCLSID lpClsidExclude; +} OLEUICONVERTW,*POLEUICONVERTW,*LPOLEUICONVERTW; +typedef struct tagOLEUICONVERTA { + DWORD cbStruct; + DWORD dwFlags; + HWND hWndOwner; + LPCSTR lpszCaption; + LPFNOLEUIHOOK lpfnHook; + LPARAM lCustData; + HINSTANCE hInstance; + LPCSTR lpszTemplate; + HRSRC hResource; + CLSID clsid; + CLSID clsidConvertDefault; + CLSID clsidActivateDefault; + CLSID clsidNew; + DWORD dvAspect; + WORD wFormat; + BOOL fIsLinkedObject; + HGLOBAL hMetaPict; + LPSTR lpszUserType; + BOOL fObjectsIconChanged; + LPSTR lpszDefLabel; + UINT cClsidExclude; + LPCLSID lpClsidExclude; +} OLEUICONVERTA,*POLEUICONVERTA,*LPOLEUICONVERTA; +typedef struct tagOLEUIBUSYW { + DWORD cbStruct; + DWORD dwFlags; + HWND hWndOwner; + LPCWSTR lpszCaption; + LPFNOLEUIHOOK lpfnHook; + LPARAM lCustData; + HINSTANCE hInstance; + LPCWSTR lpszTemplate; + HRSRC hResource; + HTASK hTask; + HWND *lphWndDialog; +} OLEUIBUSYW,*POLEUIBUSYW,*LPOLEUIBUSYW; +typedef struct tagOLEUIBUSYA { + DWORD cbStruct; + DWORD dwFlags; + HWND hWndOwner; + LPCSTR lpszCaption; + LPFNOLEUIHOOK lpfnHook; + LPARAM lCustData; + HINSTANCE hInstance; + LPCSTR lpszTemplate; + HRSRC hResource; + HTASK hTask; + HWND *lphWndDialog; +} OLEUIBUSYA,*POLEUIBUSYA,*LPOLEUIBUSYA; +typedef struct tagOLEUICHANGESOURCEW { + DWORD cbStruct; + DWORD dwFlags; + HWND hWndOwner; + LPCWSTR lpszCaption; + LPFNOLEUIHOOK lpfnHook; + LPARAM lCustData; + HINSTANCE hInstance; + LPCWSTR lpszTemplate; + HRSRC hResource; + OPENFILENAMEW* lpOFN; + DWORD dwReserved1[4]; + LPOLEUILINKCONTAINERW lpOleUILinkContainer; + DWORD dwLink; + LPWSTR lpszDisplayName; + ULONG nFileLength; + LPWSTR lpszFrom; + LPWSTR lpszTo; +} OLEUICHANGESOURCEW,*POLEUICHANGESOURCEW,*LPOLEUICHANGESOURCEW; +typedef struct tagOLEUICHANGESOURCEA { + DWORD cbStruct; + DWORD dwFlags; + HWND hWndOwner; + LPCSTR lpszCaption; + LPFNOLEUIHOOK lpfnHook; + LPARAM lCustData; + HINSTANCE hInstance; + LPCSTR lpszTemplate; + HRSRC hResource; + OPENFILENAMEA *lpOFN; + DWORD dwReserved1[4]; + LPOLEUILINKCONTAINERA lpOleUILinkContainer; + DWORD dwLink; + LPSTR lpszDisplayName; + ULONG nFileLength; + LPSTR lpszFrom; + LPSTR lpszTo; +} OLEUICHANGESOURCEA,*POLEUICHANGESOURCEA,*LPOLEUICHANGESOURCEA; +#undef INTERFACE +#define INTERFACE IOleUIObjInfoW +DECLARE_INTERFACE_(IOleUIObjInfoW, IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetObjectInfo)(THIS_ DWORD,PDWORD,LPWSTR*,LPWSTR*,LPWSTR*,LPWSTR*) PURE; + STDMETHOD(GetConvertInfo)(THIS_ DWORD,CLSID*,PWORD,CLSID*,LPCLSID*,UINT*) PURE; + STDMETHOD(ConvertObject)(THIS_ DWORD,REFCLSID) PURE; + STDMETHOD(GetViewInfo)(THIS_ DWORD,HGLOBAL*,PDWORD,int*) PURE; + STDMETHOD(SetViewInfo)(THIS_ DWORD,HGLOBAL,DWORD,int,BOOL) PURE; +}; +typedef IOleUIObjInfoW *LPOLEUIOBJINFOW; +#undef INTERFACE +#define INTERFACE IOleUIObjInfoA +DECLARE_INTERFACE_(IOleUIObjInfoA, IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetObjectInfo)(THIS_ DWORD,PDWORD,LPSTR*,LPSTR*,LPSTR*,LPSTR*) PURE; + STDMETHOD(GetConvertInfo)(THIS_ DWORD,CLSID*,PWORD,CLSID*,LPCLSID*,UINT*) PURE; + STDMETHOD(ConvertObject)(THIS_ DWORD,REFCLSID) PURE; + STDMETHOD(GetViewInfo)(THIS_ DWORD,HGLOBAL*,PDWORD,int*) PURE; + STDMETHOD(SetViewInfo)(THIS_ DWORD,HGLOBAL,DWORD,int,BOOL) PURE; +}; +typedef IOleUIObjInfoA *LPOLEUIOBJINFOA; +#undef INTERFACE +#define INTERFACE IOleUILinkInfoW +DECLARE_INTERFACE_(IOleUILinkInfoW, IOleUILinkContainerW) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD_(DWORD,GetNextLink)(THIS_ DWORD) PURE; + STDMETHOD(SetLinkUpdateOptions)(THIS_ DWORD,DWORD) PURE; + STDMETHOD(GetLinkUpdateOptions)(THIS_ DWORD,DWORD*) PURE; + STDMETHOD(SetLinkSource)(THIS_ DWORD,LPWSTR,ULONG,PULONG,BOOL) PURE; + STDMETHOD(GetLinkSource)(THIS_ DWORD,LPWSTR*,PULONG,LPWSTR*,LPWSTR*,BOOL*,BOOL*) PURE; + STDMETHOD(OpenLinkSource)(THIS_ DWORD) PURE; + STDMETHOD(UpdateLink)(THIS_ DWORD,BOOL,BOOL) PURE; + STDMETHOD(CancelLink)(THIS_ DWORD) PURE; + STDMETHOD(GetLastUpdate)(THIS_ DWORD,FILETIME*) PURE; +}; +typedef IOleUILinkInfoW *LPOLEUILINKINFOW; +#undef INTERFACE +#define INTERFACE IOleUILinkInfoA +DECLARE_INTERFACE_(IOleUILinkInfoA, IOleUILinkContainerA) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD_(DWORD,GetNextLink)(THIS_ DWORD) PURE; + STDMETHOD(SetLinkUpdateOptions)(THIS_ DWORD,DWORD) PURE; + STDMETHOD(GetLinkUpdateOptions)(THIS_ DWORD,DWORD*) PURE; + STDMETHOD(SetLinkSource)(THIS_ DWORD,LPSTR,ULONG,PULONG,BOOL) PURE; + STDMETHOD(GetLinkSource)(THIS_ DWORD,LPSTR*,PULONG,LPSTR*,LPSTR*,BOOL*,BOOL*) PURE; + STDMETHOD(OpenLinkSource)(THIS_ DWORD) PURE; + STDMETHOD(UpdateLink)(THIS_ DWORD,BOOL,BOOL) PURE; + STDMETHOD(CancelLink)(THIS_ DWORD) PURE; + STDMETHOD(GetLastUpdate)(THIS_ DWORD,FILETIME*) PURE; +}; +typedef IOleUILinkInfoA* LPOLEUILINKINFOA; +struct tagOLEUIOBJECTPROPSW; +struct tagOLEUIOBJECTPROPSA; +typedef struct tagOLEUIGNRLPROPSW { + DWORD cbStruct; + DWORD dwFlags; + DWORD dwReserved1[2]; + LPFNOLEUIHOOK lpfnHook; + LPARAM lCustData; + DWORD dwReserved2[3]; + struct tagOLEUIOBJECTPROPSW* lpOP; +} OLEUIGNRLPROPSW,*POLEUIGNRLPROPSW,*LPOLEUIGNRLPROPSW; +typedef struct tagOLEUIGNRLPROPSA { + DWORD cbStruct; + DWORD dwFlags; + DWORD dwReserved1[2]; + LPFNOLEUIHOOK lpfnHook; + LPARAM lCustData; + DWORD dwReserved2[3]; + struct tagOLEUIOBJECTPROPSA* lpOP; +} OLEUIGNRLPROPSA,*POLEUIGNRLPROPSA,*LPOLEUIGNRLPROPSA; +typedef struct tagOLEUIVIEWPROPSW { + DWORD cbStruct; + DWORD dwFlags; + DWORD dwReserved1[2]; + LPFNOLEUIHOOK lpfnHook; + LPARAM lCustData; + DWORD dwReserved2[3]; + struct tagOLEUIOBJECTPROPSW* lpOP; + int nScaleMin; + int nScaleMax; +} OLEUIVIEWPROPSW,*POLEUIVIEWPROPSW,*LPOLEUIVIEWPROPSW; +typedef struct tagOLEUIVIEWPROPSA { + DWORD cbStruct; + DWORD dwFlags; + DWORD dwReserved1[2]; + LPFNOLEUIHOOK lpfnHook; + LPARAM lCustData; + DWORD dwReserved2[3]; + struct tagOLEUIOBJECTPROPSA *lpOP; + int nScaleMin; + int nScaleMax; +} OLEUIVIEWPROPSA,*POLEUIVIEWPROPSA,*LPOLEUIVIEWPROPSA; +typedef struct tagOLEUILINKPROPSW { + DWORD cbStruct; + DWORD dwFlags; + DWORD dwReserved1[2]; + LPFNOLEUIHOOK lpfnHook; + LPARAM lCustData; + DWORD dwReserved2[3]; + struct tagOLEUIOBJECTPROPSW *lpOP; +} OLEUILINKPROPSW, *POLEUILINKPROPSW,* LPOLEUILINKPROPSW; +typedef struct tagOLEUILINKPROPSA { + DWORD cbStruct; + DWORD dwFlags; + DWORD dwReserved1[2]; + LPFNOLEUIHOOK lpfnHook; + LPARAM lCustData; + DWORD dwReserved2[3]; + struct tagOLEUIOBJECTPROPSA* lpOP; +} OLEUILINKPROPSA,*POLEUILINKPROPSA,*LPOLEUILINKPROPSA; +typedef struct tagOLEUIOBJECTPROPSW { + DWORD cbStruct; + DWORD dwFlags; + LPPROPSHEETHEADERW lpPS; + DWORD dwObject; + LPOLEUIOBJINFOW lpObjInfo; + DWORD dwLink; + LPOLEUILINKINFOW lpLinkInfo; + LPOLEUIGNRLPROPSW lpGP; + LPOLEUIVIEWPROPSW lpVP; + LPOLEUILINKPROPSW lpLP; +} OLEUIOBJECTPROPSW,*POLEUIOBJECTPROPSW,*LPOLEUIOBJECTPROPSW; +typedef struct tagOLEUIOBJECTPROPSA { + DWORD cbStruct; + DWORD dwFlags; + LPPROPSHEETHEADERA lpPS; + DWORD dwObject; + LPOLEUIOBJINFOA lpObjInfo; + DWORD dwLink; + LPOLEUILINKINFOA lpLinkInfo; + LPOLEUIGNRLPROPSA lpGP; + LPOLEUIVIEWPROPSA lpVP; + LPOLEUILINKPROPSA lpLP; +} OLEUIOBJECTPROPSA,*POLEUIOBJECTPROPSA,*LPOLEUIOBJECTPROPSA; + +STDAPI_(BOOL) OleUIAddVerbMenuW(LPOLEOBJECT,LPCWSTR,HMENU,UINT,UINT,UINT,BOOL,UINT,HMENU*); +STDAPI_(BOOL) OleUIAddVerbMenuA(LPOLEOBJECT,LPCSTR,HMENU,UINT,UINT,UINT,BOOL,UINT,HMENU*); +STDAPI_(UINT) OleUIBusyW(LPOLEUIBUSYW); +STDAPI_(UINT) OleUIBusyA(LPOLEUIBUSYA); +STDAPI_(BOOL) OleUICanConvertOrActivateAs(REFCLSID,BOOL,WORD); +STDAPI_(UINT) OleUIChangeIconW(LPOLEUICHANGEICONW); +STDAPI_(UINT) OleUIChangeIconA(LPOLEUICHANGEICONA); +STDAPI_(UINT) OleUIChangeSourceW(LPOLEUICHANGESOURCEW); +STDAPI_(UINT) OleUIChangeSourceA(LPOLEUICHANGESOURCEA); +STDAPI_(UINT) OleUIConvertW(LPOLEUICONVERTW); +STDAPI_(UINT) OleUIConvertA(LPOLEUICONVERTA); +STDAPI_(UINT) OleUIEditLinksW(LPOLEUIEDITLINKSW); +STDAPI_(UINT) OleUIEditLinksA(LPOLEUIEDITLINKSA); +STDAPI_(UINT) OleUIObjectPropertiesW(LPOLEUIOBJECTPROPSW); +STDAPI_(UINT) OleUIObjectPropertiesA(LPOLEUIOBJECTPROPSA); +STDAPI_(UINT) OleUIPasteSpecialW(LPOLEUIPASTESPECIALW); +STDAPI_(UINT) OleUIPasteSpecialA(LPOLEUIPASTESPECIALA); +int OleUIPromptUserW(int,HWND,...); +int OleUIPromptUserA(int,HWND,...); +STDAPI_(BOOL) OleUIUpdateLinksW(LPOLEUILINKCONTAINERW,HWND,LPWSTR,int); +STDAPI_(BOOL) OleUIUpdateLinksA(LPOLEUILINKCONTAINERA,HWND,LPSTR,int); + +#ifdef UNICODE +#define IDD_SERVERNOTREG IDD_SERVERNOTREGW +#define IDD_LINKTYPECHANGED IDD_LINKTYPECHANGEDW +#define OleUIUpdateLinks OleUIUpdateLinksW +#define OleUIAddVerbMenu OleUIAddVerbMenuW +#define tagOLEUIOBJECTPROPS tagOLEUIOBJECTPROPSW +#define OLEUIOBJECTPROPS OLEUIOBJECTPROPSW +#define POLEUIOBJECTPROPS POLEUIOBJECTPROPSW +#define LPOLEUIOBJECTPROPS LPOLEUIOBJECTPROPSW +#define OleUIObjectProperties OleUIObjectPropertiesW +#define tagOLEUIINSERTOBJECT tagOLEUIINSERTOBJECTW +#define OLEUIINSERTOBJECT OLEUIINSERTOBJECTW +#define POLEUIINSERTOBJECT POLEUIINSERTOBJECTW +#define LPOLEUIINSERTOBJECT LPOLEUIINSERTOBJECTW +#define OleUIInsertObject OleUIInsertObjectW +#define OleUIPromptUser OleUIPromptUserW +#define tagOLEUIPASTEENTRY tagOLEUIPASTEENTRYW +#define OLEUIPASTEENTRY OLEUIPASTEENTRYW +#define POLEUIPASTEENTRY POLEUIPASTEENTRYW +#define LPOLEUIPASTEENTRY LPOLEUIPASTEENTRYW +#define tagOLEUIPASTESPECIAL tagOLEUIPASTESPECIALW +#define OLEUIPASTESPECIAL OLEUIPASTESPECIALW +#define POLEUIPASTESPECIAL POLEUIPASTESPECIALW +#define LPOLEUIPASTESPECIAL LPOLEUIPASTESPECIALW +#define OleUIPasteSpecial OleUIPasteSpecialW +#define IOleUILinkContainer IOleUILinkContainerW +#define LPOLEUILINKCONTAINER LPOLEUILINKCONTAINERW +#define tagOLEUIEDITLINKS tagOLEUIEDITLINKSW +#define OLEUIEDITLINKS OLEUIEDITLINKSW +#define POLEUIEDITLINKS POLEUIEDITLINKSW +#define LPOLEUIEDITLINKS LPOLEUIEDITLINKSW +#define OleUIEditLinks OleUIEditLinksW +#define tagOLEUICHANGEICON tagOLEUICHANGEICONW +#define OLEUICHANGEICON OLEUICHANGEICONW +#define POLEUICHANGEICON POLEUICHANGEICONW +#define LPOLEUICHANGEICON LPOLEUICHANGEICONW +#define OleUIChangeIcon OleUIChangeIconW +#define tagOLEUICONVERT tagOLEUICONVERTW +#define OLEUICONVERT OLEUICONVERTW +#define POLEUICONVERT POLEUICONVERTW +#define LPOLEUICONVERT LPOLEUICONVERTW +#define OleUIConvert OleUIConvertW +#define tagOLEUIBUSY tagOLEUIBUSYW +#define OLEUIBUSY OLEUIBUSYW +#define POLEUIBUSY POLEUIBUSYW +#define LPOLEUIBUSY LPOLEUIBUSYW +#define OleUIBusy OleUIBusyW +#define tagOLEUICHANGESOURCE tagOLEUICHANGESOURCEW +#define OLEUICHANGESOURCE OLEUICHANGESOURCEW +#define POLEUICHANGESOURCE POLEUICHANGESOURCEW +#define LPOLEUICHANGESOURCE LPOLEUICHANGESOURCEW +#define OleUIChangeSource OleUIChangeSourceW +#define IOleUIObjInfo IOleUIObjInfoW +#define LPOLEUIOBJINFO LPOLEUIOBJINFOW +#define IOleUILinkInfo IOleUILinkInfoW +#define IOleUILinkInfoVtbl IOleUILinkInfoWVtbl +#define LPOLEUILINKINFO LPOLEUILINKINFOW +#define tagOLEUIGNRLPROPS tagOLEUIGNRLPROPSW +#define OLEUIGNRLPROPS OLEUIGNRLPROPSW +#define POLEUIGNRLPROPS POLEUIGNRLPROPSW +#define LPOLEUIGNRLPROPS LPOLEUIGNRLPROPSW +#define tagOLEUIVIEWPROPS tagOLEUIVIEWPROPSW +#define OLEUIVIEWPROPS OLEUIVIEWPROPSW +#define POLEUIVIEWPROPS POLEUIVIEWPROPSW +#define LPOLEUIVIEWPROPS LPOLEUIVIEWPROPSW +#define tagOLEUILINKPROPS tagOLEUILINKPROPSW +#define OLEUILINKPROPS OLEUILINKPROPSW +#define POLEUILINKPROPS POLEUILINKPROPSW +#define LPOLEUILINKPROPS LPOLEUILINKPROPSW +#else +#define IDD_SERVERNOTREG IDD_SERVERNOTREGA +#define IDD_LINKTYPECHANGED IDD_LINKTYPECHANGEDA +#define OleUIUpdateLinks OleUIUpdateLinksA +#define OleUIAddVerbMenu OleUIAddVerbMenuA +#define tagOLEUIOBJECTPROPS tagOLEUIOBJECTPROPSA +#define OLEUIOBJECTPROPS OLEUIOBJECTPROPSA +#define POLEUIOBJECTPROPS POLEUIOBJECTPROPSA +#define LPOLEUIOBJECTPROPS LPOLEUIOBJECTPROPSA +#define OleUIObjectProperties OleUIObjectPropertiesA +#define tagOLEUIINSERTOBJECT tagOLEUIINSERTOBJECTA +#define OLEUIINSERTOBJECT OLEUIINSERTOBJECTA +#define POLEUIINSERTOBJECT POLEUIINSERTOBJECTA +#define LPOLEUIINSERTOBJECT LPOLEUIINSERTOBJECTA +#define OleUIInsertObject OleUIInsertObjectA +#define OleUIPromptUser OleUIPromptUserA +#define tagOLEUIPASTEENTRY tagOLEUIPASTEENTRYA +#define OLEUIPASTEENTRY OLEUIPASTEENTRYA +#define POLEUIPASTEENTRY POLEUIPASTEENTRYA +#define LPOLEUIPASTEENTRY LPOLEUIPASTEENTRYA +#define tagOLEUIPASTESPECIAL tagOLEUIPASTESPECIALA +#define OLEUIPASTESPECIAL OLEUIPASTESPECIALA +#define POLEUIPASTESPECIAL POLEUIPASTESPECIALA +#define LPOLEUIPASTESPECIAL LPOLEUIPASTESPECIALA +#define OleUIPasteSpecial OleUIPasteSpecialA +#define IOleUILinkContainer IOleUILinkContainerA +#define LPOLEUILINKCONTAINER LPOLEUILINKCONTAINERA +#define tagOLEUIEDITLINKS tagOLEUIEDITLINKSA +#define OLEUIEDITLINKS OLEUIEDITLINKSA +#define POLEUIEDITLINKS POLEUIEDITLINKSA +#define LPOLEUIEDITLINKS LPOLEUIEDITLINKSA +#define OleUIEditLinks OleUIEditLinksA +#define tagOLEUICHANGEICON tagOLEUICHANGEICONA +#define OLEUICHANGEICON OLEUICHANGEICONA +#define POLEUICHANGEICON POLEUICHANGEICONA +#define LPOLEUICHANGEICON LPOLEUICHANGEICONA +#define OleUIChangeIcon OleUIChangeIconA +#define tagOLEUICONVERT tagOLEUICONVERTA +#define OLEUICONVERT OLEUICONVERTA +#define POLEUICONVERT POLEUICONVERTA +#define LPOLEUICONVERT LPOLEUICONVERTA +#define OleUIConvert OleUIConvertA +#define tagOLEUIBUSY tagOLEUIBUSYA +#define OLEUIBUSY OLEUIBUSYA +#define POLEUIBUSY POLEUIBUSYA +#define LPOLEUIBUSY LPOLEUIBUSYA +#define OleUIBusy OleUIBusyA +#define tagOLEUICHANGESOURCE tagOLEUICHANGESOURCEA +#define OLEUICHANGESOURCE OLEUICHANGESOURCEA +#define POLEUICHANGESOURCE POLEUICHANGESOURCEA +#define LPOLEUICHANGESOURCE LPOLEUICHANGESOURCEA +#define OleUIChangeSource OleUIChangeSourceA +#define IOleUIObjInfo IOleUIObjInfoA +#define LPOLEUIOBJINFO LPOLEUIOBJINFOA +#define IOleUILinkInfo IOleUILinkInfoA +#define IOleUILinkInfoVtbl IOleUILinkInfoAVtbl +#define LPOLEUILINKINFO LPOLEUILINKINFOA +#define tagOLEUIGNRLPROPS tagOLEUIGNRLPROPSA +#define OLEUIGNRLPROPS OLEUIGNRLPROPSA +#define POLEUIGNRLPROPS POLEUIGNRLPROPSA +#define LPOLEUIGNRLPROPS LPOLEUIGNRLPROPSA +#define tagOLEUIVIEWPROPS tagOLEUIVIEWPROPSA +#define OLEUIVIEWPROPS OLEUIVIEWPROPSA +#define POLEUIVIEWPROPS POLEUIVIEWPROPSA +#define LPOLEUIVIEWPROPS LPOLEUIVIEWPROPSA +#define tagOLEUILINKPROPS tagOLEUILINKPROPSA +#define OLEUILINKPROPS OLEUILINKPROPSA +#define POLEUILINKPROPS POLEUILINKPROPSA +#define LPOLEUILINKPROPS LPOLEUILINKPROPSA +#endif +#pragma pack(pop) +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/oleidl.h b/reactos/w32api/include/oleidl.h new file mode 100644 index 00000000000..0043c878fe8 --- /dev/null +++ b/reactos/w32api/include/oleidl.h @@ -0,0 +1,575 @@ +#ifndef _OLEIDL_H +#define _OLEIDL_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#include <objfwd.h> + +#define MK_ALT 32 + +typedef interface IParseDisplayName *LPPARSEDISPLAYNAME; +typedef interface IOleContainer *LPOLECONTAINER; +typedef interface IOleClientSite *LPOLECLIENTSITE; +typedef interface IOleObject *LPOLEOBJECT; +typedef interface IDropTarget *LPDROPTARGET; +typedef interface IDropSource *LPDROPSOURCE; +typedef interface IEnumOleUndoUnits *LPENUMOLEUNDOUNITS; +typedef interface IEnumOLEVERB *LPENUMOLEVERB; +typedef interface IOleWindow *LPOLEWINDOW; +typedef interface IOleInPlaceUIWindow *LPOLEINPLACEUIWINDOW; +typedef interface IOleInPlaceActiveObject *LPOLEINPLACEACTIVEOBJECT; +typedef interface IOleInPlaceFrame *LPOLEINPLACEFRAME; +typedef interface IOleAdviseHolder *LPOLEADVISEHOLDER; +typedef interface IViewObject *LPVIEWOBJECT; +typedef interface IViewObject2 *LPVIEWOBJECT2; +typedef interface IOleCache *LPOLECACHE; +typedef interface IOleCache2 *LPOLECACHE2; +typedef interface IOleCacheControl *LPOLECACHECONTROL; + +typedef enum tagBINDSPEED +{ + BINDSPEED_INDEFINITE=1, + BINDSPEED_MODERATE, + BINDSPEED_IMMEDIATE +} BINDSPEED; +typedef enum tagOLEWHICHMK { + OLEWHICHMK_CONTAINER=1, + OLEWHICHMK_OBJREL, + OLEWHICHMK_OBJFULL +} OLEWHICHMK; +typedef enum tagOLEGETMONIKER { + OLEGETMONIKER_ONLYIFTHERE=1, + OLEGETMONIKER_FORCEASSIGN, + OLEGETMONIKER_UNASSIGN, + OLEGETMONIKER_TEMPFORUSER +} OLEGETMONIKER; +typedef enum tagUSERCLASSTYPE { + USERCLASSTYPE_FULL=1, + USERCLASSTYPE_SHORT, + USERCLASSTYPE_APPNAME +} USERCLASSTYPE; + +#ifdef __GNUC__ +__extension__ /* IS0 C says enums limited to range of int */ +#endif +typedef enum tagDROPEFFECT { + DROPEFFECT_NONE=0, + DROPEFFECT_COPY=1, + DROPEFFECT_MOVE=2, + DROPEFFECT_LINK=4, + DROPEFFECT_SCROLL=0x80000000 +} DROPEFFECT; +typedef struct tagOleMenuGroupWidths { + LONG width[6]; +} OLEMENUGROUPWIDTHS,*LPOLEMENUGROUPWIDTHS; +typedef HGLOBAL HOLEMENU; +typedef enum tagOLECLOSE { + OLECLOSE_SAVEIFDIRTY, + OLECLOSE_NOSAVE, + OLECLOSE_PROMPTSAVE +} OLECLOSE; +typedef struct tagOLEVERB { + LONG lVerb; + LPWSTR lpszVerbName; + DWORD fuFlags; + DWORD grfAttribs; +} OLEVERB,*LPOLEVERB; +typedef RECT BORDERWIDTHS; +typedef LPRECT LPBORDERWIDTHS; +typedef LPCRECT LPCBORDERWIDTHS; +typedef struct tagOIFI { + UINT cb; + BOOL fMDIApp; + HWND hwndFrame; + HACCEL haccel; + UINT cAccelEntries; +}OLEINPLACEFRAMEINFO,*LPOLEINPLACEFRAMEINFO; + +DECLARE_ENUMERATOR(OLEVERB); +typedef IEnumOLEVERB IEnumOleVerb; + +EXTERN_C const IID IID_IParseDisplayName; +#undef INTERFACE +#define INTERFACE IParseDisplayName +DECLARE_INTERFACE_(IParseDisplayName,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(ParseDisplayName)(THIS_ IBindCtx*,LPOLESTR,ULONG*,IMoniker**) PURE; +}; + +#ifdef COBJMACROS +#define IParseDisplayName_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IParseDisplayName_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IParseDisplayName_Release(T) (T)->lpVtbl->Release(T) +#define IParseDisplayName_ParseDisplayName(T,a,b,c,d) (T)->lpVtbl->ParseDisplayName(T,a,b,c,d) +#endif + +EXTERN_C const IID IID_IOleContainer; +#undef INTERFACE +#define INTERFACE IOleContainer +DECLARE_INTERFACE_(IOleContainer,IParseDisplayName) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(ParseDisplayName)(THIS_ IBindCtx*,LPOLESTR,ULONG*,IMoniker**) PURE; + STDMETHOD(EnumObjects)(THIS_ DWORD,IEnumUnknown**) PURE; + STDMETHOD(LockContainer)(THIS_ BOOL) PURE; +}; + +EXTERN_C const IID IID_IOleItemContainer; +#undef INTERFACE +#define INTERFACE IOleItemContainer +DECLARE_INTERFACE_(IOleItemContainer,IOleContainer) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(ParseDisplayName)(THIS_ IBindCtx*,LPOLESTR,ULONG*,IMoniker**) PURE; + STDMETHOD(EnumObjects)(THIS_ DWORD,IEnumUnknown**) PURE; + STDMETHOD(LockContainer)(THIS_ BOOL) PURE; + STDMETHOD(GetObject)(THIS_ LPOLESTR,DWORD,IBindCtx*,REFIID,void**) PURE; + STDMETHOD(GetObjectStorage)(THIS_ LPOLESTR,IBindCtx*,REFIID,void**) PURE; + STDMETHOD(IsRunning)(THIS_ LPOLESTR) PURE; +}; + +#ifdef COBJMACROS +#define IOleItemContainer_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IOleItemContainer_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IOleItemContainer_Release(T) (T)->lpVtbl->Release(T) +#define IOleItemContainer_ParseDisplayName(T,a,b,c,d) (T)->lpVtbl->ParseDisplayName(T,a,b,c,d) +#define IOleItemContainer_EnumObjects(T,a,b) (T)->lpVtbl->EnumObjects(T,a,b) +#define IOleItemContainer_LockContainer(T,a) (T)->lpVtbl->LockContainer(T,a) +#define IOleItemContainer_GetObject(T,a,b,c,d,e) (T)->lpVtbl->GetObject(T,a,b,c,d,e) +#define IOleItemContainer_GetObjectStorage(T,a,b,c,d) (T)->lpVtbl->GetObjectStorage(T,a,b,c,d) +#define IOleItemContainer_IsRunning(T,a) (T)->lpVtbl->IsRunning(T,a) +#endif + +EXTERN_C const IID IID_IOleClientSite; +#undef INTERFACE +#define INTERFACE IOleClientSite +DECLARE_INTERFACE_(IOleClientSite,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(SaveObject)(THIS) PURE; + STDMETHOD(GetMoniker)(THIS_ DWORD,DWORD,LPMONIKER*) PURE; + STDMETHOD(GetContainer)(THIS_ LPOLECONTAINER*) PURE; + STDMETHOD(ShowObject)(THIS) PURE; + STDMETHOD(OnShowWindow)(THIS_ BOOL) PURE; + STDMETHOD(RequestNewObjectLayout)(THIS) PURE; +}; + +#ifdef COBJMACROS +#define IOleClientSite_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IOleClientSite_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IOleClientSite_Release(T) (T)->lpVtbl->Release(T) +#define IOleClientSite_SaveObject(T) (T)->lpVtbl->SaveObject(T) +#define IOleClientSite_GetMoniker(T,a,b,c) (T)->lpVtbl->GetMoniker(T,a,b,c) +#define IOleClientSite_GetContainer(T,a) (T)->lpVtbl->GetContainer(T,a) +#define IOleClientSite_ShowObject(T) (T)->lpVtbl->ShowObject(T) +#define IOleClientSite_OnShowWindow(T,a) (T)->lpVtbl->OnShowWindow(T,a) +#define IOleClientSite_RequestNewObjectLayout(T) (T)->lpVtbl->RequestNewObjectLayout(T) +#endif + +EXTERN_C const IID IID_IOleObject; +#undef INTERFACE +#define INTERFACE IOleObject +DECLARE_INTERFACE_(IOleObject,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(SetClientSite)(THIS_ LPOLECLIENTSITE) PURE; + STDMETHOD(GetClientSite)(THIS_ LPOLECLIENTSITE*) PURE; + STDMETHOD(SetHostNames)(THIS_ LPCOLESTR,LPCOLESTR) PURE; + STDMETHOD(Close)(THIS_ DWORD) PURE; + STDMETHOD(SetMoniker)(THIS_ DWORD,LPMONIKER) PURE; + STDMETHOD(GetMoniker)(THIS_ DWORD,DWORD,LPMONIKER*) PURE; + STDMETHOD(InitFromData)(THIS_ LPDATAOBJECT,BOOL,DWORD) PURE; + STDMETHOD(GetClipboardData)(THIS_ DWORD,LPDATAOBJECT*) PURE; + STDMETHOD(DoVerb)(THIS_ LONG,LPMSG,LPOLECLIENTSITE,LONG,HWND,LPCRECT) PURE; + STDMETHOD(EnumVerbs)(THIS_ LPENUMOLEVERB*) PURE; + STDMETHOD(Update)(THIS) PURE; + STDMETHOD(IsUpToDate)(THIS) PURE; + STDMETHOD(GetUserClassID)(THIS_ LPCLSID) PURE; + STDMETHOD(GetUserType)(THIS_ DWORD,LPOLESTR*) PURE; + STDMETHOD(SetExtent)(THIS_ DWORD,SIZEL*) PURE; + STDMETHOD(GetExtent)(THIS_ DWORD,SIZEL*) PURE; + STDMETHOD(Advise)(THIS_ LPADVISESINK,PDWORD) PURE; + STDMETHOD(Unadvise)(THIS_ DWORD) PURE; + STDMETHOD(EnumAdvise)(THIS_ LPENUMSTATDATA*) PURE; + STDMETHOD(GetMiscStatus)(THIS_ DWORD,PDWORD) PURE; + STDMETHOD(SetColorScheme)(THIS_ LPLOGPALETTE) PURE; +}; + +#ifdef COBJMACROS +#define IOleObject_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IOleObject_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IOleObject_Release(T) (T)->lpVtbl->Release(T) +#define IOleObject_SetClientSite(T,a) (T)->lpVtbl->SetClientSite(T,a) +#define IOleObject_GetClientSite(T,a) (T)->lpVtbl->GetClientSite(T,a) +#define IOleObject_SetHostNames(T,a,b) (T)->lpVtbl->SetHostNames(T,a,b) +#define IOleObject_Close(T,a) (T)->lpVtbl->Close(T,a) +#define IOleObject_SetMoniker(T,a,b) (T)->lpVtbl->SetMoniker(T,a,b) +#define IOleObject_GetMoniker(T,a,b,c) (T)->lpVtbl->GetMoniker(T,a,b,c) +#define IOleObject_InitFromData(T,a,b,c) (T)->lpVtbl->InitFromData(T,a,b,c) +#define IOleObject_GetClipboardData(T,a,b) (T)->lpVtbl->GetClipboardData(T,a,b) +#define IOleObject_DoVerb(T,a,b,c,d,e,f) (T)->lpVtbl->DoVerb(T,a,b,c,d,e,f) +#define IOleObject_EnumVerbs(T,a) (T)->lpVtbl->EnumVerbs(T,a) +#define IOleObject_Update(T) (T)->lpVtbl->Update(T) +#define IOleObject_IsUpToDate(T) (T)->lpVtbl->IsUpToDate(T) +#define IOleObject_GetUserClassID(T,a) (T)->lpVtbl->GetUserClassID(T,a) +#define IOleObject_GetUserType(T,a,b) (T)->lpVtbl->GetUserType(T,a,b) +#define IOleObject_SetExtent(T,a,b) (T)->lpVtbl->SetExtent(T,a,b) +#define IOleObject_GetExtent(T,a,b) (T)->lpVtbl->GetExtent(T,a,b) +#define IOleObject_Advise(T,a,b) (T)->lpVtbl->Advise(T,a,b) +#define IOleObject_Unadvise(T,a) (T)->lpVtbl->Unadvise(T,a) +#define IOleObject_EnumAdvise(T,a) (T)->lpVtbl->EnumAdvise(T,a) +#define IOleObject_GetMiscStatus(T,a,b) (T)->lpVtbl->GetMiscStatus(T,a,b) +#define IOleObject_SetColorScheme(T,a) (T)->lpVtbl->SetColorScheme(T,a) +#endif + +EXTERN_C const IID IID_IOleWindow; +#undef INTERFACE +#define INTERFACE IOleWindow +DECLARE_INTERFACE_(IOleWindow,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetWindow)(THIS_ HWND*) PURE; + STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL) PURE; +}; + +#ifdef COBJMACROS +#define IOleWindow_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IOleWindow_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IOleWindow_Release(T) (T)->lpVtbl->Release(T) +#define IOleWindow_GetWindow(T,a) (T)->lpVtbl->GetWindow(T,a) +#define IOleWindow_ContextSensitiveHelp(T,a) (T)->lpVtbl->ContextSensitiveHelp(T,a) +#endif + +EXTERN_C const IID IID_IOleInPlaceUIWindow; +#undef INTERFACE +#define INTERFACE IOleInPlaceUIWindow +DECLARE_INTERFACE_(IOleInPlaceUIWindow,IOleWindow) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetWindow)(THIS_ HWND*) PURE; + STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL) PURE; + STDMETHOD(GetBorder)(THIS_ LPRECT) PURE; + STDMETHOD(RequestBorderSpace)(THIS_ LPCBORDERWIDTHS) PURE; + STDMETHOD(SetBorderSpace)(THIS_ LPCBORDERWIDTHS) PURE; + STDMETHOD(SetActiveObject)(THIS_ LPOLEINPLACEACTIVEOBJECT,LPCOLESTR) PURE; +}; + +EXTERN_C const IID IID_IOleInPlaceObject; +#undef INTERFACE +#define INTERFACE IOleInPlaceObject +DECLARE_INTERFACE_(IOleInPlaceObject,IOleWindow) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetWindow)(THIS_ HWND*) PURE; + STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL) PURE; + STDMETHOD(InPlaceDeactivate)(THIS) PURE; + STDMETHOD(UIDeactivate)(THIS) PURE; + STDMETHOD(SetObjectRects)(THIS_ LPCRECT,LPCRECT) PURE; + STDMETHOD(ReactivateAndUndo)(THIS) PURE; +}; + +EXTERN_C const IID IID_IOleInPlaceActiveObject; +#undef INTERFACE +#define INTERFACE IOleInPlaceActiveObject +DECLARE_INTERFACE_(IOleInPlaceActiveObject,IOleWindow) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetWindow)(THIS_ HWND*) PURE; + STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL) PURE; + STDMETHOD(TranslateAccelerator)(THIS_ LPMSG) PURE; + STDMETHOD(OnFrameWindowActivate)(THIS_ BOOL) PURE; + STDMETHOD(OnDocWindowActivate)(THIS_ BOOL) PURE; + STDMETHOD(ResizeBorder)(THIS_ LPCRECT,LPOLEINPLACEUIWINDOW,BOOL) PURE; + STDMETHOD(EnableModeless)(THIS_ BOOL) PURE; +}; + +EXTERN_C const IID IID_IOleInPlaceFrame; +#undef INTERFACE +#define INTERFACE IOleInPlaceFrame +DECLARE_INTERFACE_(IOleInPlaceFrame,IOleInPlaceUIWindow) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetWindow)(THIS_ HWND*) PURE; + STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL) PURE; + STDMETHOD(GetBorder)(THIS_ LPRECT) PURE; + STDMETHOD(RequestBorderSpace)(THIS_ LPCBORDERWIDTHS) PURE; + STDMETHOD(SetBorderSpace)(THIS_ LPCBORDERWIDTHS) PURE; + STDMETHOD(SetActiveObject)(THIS_ LPOLEINPLACEACTIVEOBJECT,LPCOLESTR) PURE; + STDMETHOD(InsertMenus)(THIS_ HMENU,LPOLEMENUGROUPWIDTHS) PURE; + STDMETHOD(SetMenu)(THIS_ HMENU,HOLEMENU,HWND) PURE; + STDMETHOD(RemoveMenus)(THIS_ HMENU) PURE; + STDMETHOD(SetStatusText)(THIS_ LPCOLESTR) PURE; + STDMETHOD(EnableModeless)(THIS_ BOOL) PURE; + STDMETHOD(TranslateAccelerator)(THIS_ LPMSG,WORD) PURE; +}; + +#ifdef COBJMACROS +#define IOleInPlaceFrame_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IOleInPlaceFrame_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IOleInPlaceFrame_Release(T) (T)->lpVtbl->Release(T) +#define IOleInPlaceFrame_GetWindow(T,a) (T)->lpVtbl->GetWindow(T,a) +#define IOleInPlaceFrame_ContextSensitiveHelp(T,a) (T)->lpVtbl->ContextSensitiveHelp(T,a) +#define IOleInPlaceFrame_GetBorder(T,a) (T)->lpVtbl->GetBorder(T,a) +#define IOleInPlaceFrame_RequestBorderSpace(T,a) (T)->lpVtbl->RequestBorderSpace(T,a) +#define IOleInPlaceFrame_SetBorderSpace(T,a) (T)->lpVtbl->SetBorderSpace(T,a) +#define IOleInPlaceFrame_SetActiveObject(T,a,b) (T)->lpVtbl->SetActiveObject(T,a,b) +#define IOleInPlaceFrame_InsertMenus(T,a,b) (T)->lpVtbl->InsertMenus(T,a,b) +#define IOleInPlaceFrame_SetMenu(T,a,b,c) (T)->lpVtbl->SetMenu(T,a,b,c) +#define IOleInPlaceFrame_RemoveMenus(T,a) (T)->lpVtbl->RemoveMenus(T,a) +#define IOleInPlaceFrame_SetStatusText(T,a) (T)->lpVtbl->SetStatusText(T,a) +#define IOleInPlaceFrame_EnableModeless(T,a) (T)->lpVtbl->EnableModeless(T,a) +#define IOleInPlaceFrame_TranslateAccelerator(T,a,b) (T)->lpVtbl->TranslateAccelerator(T,a,b) +#endif + +EXTERN_C const IID IID_IOleInPlaceSite; +#undef INTERFACE +#define INTERFACE IOleInPlaceSite +DECLARE_INTERFACE_(IOleInPlaceSite,IOleWindow) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetWindow)(THIS_ HWND*) PURE; + STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL) PURE; + STDMETHOD(CanInPlaceActivate)(THIS) PURE; + STDMETHOD(OnInPlaceActivate)(THIS) PURE; + STDMETHOD(OnUIActivate)(THIS) PURE; + STDMETHOD(GetWindowContext)(THIS_ IOleInPlaceFrame**,IOleInPlaceUIWindow**,LPRECT,LPRECT,LPOLEINPLACEFRAMEINFO) PURE; + STDMETHOD(Scroll)(THIS_ SIZE) PURE; + STDMETHOD(OnUIDeactivate)(THIS_ BOOL) PURE; + STDMETHOD(OnInPlaceDeactivate)(THIS) PURE; + STDMETHOD(DiscardUndoState)(THIS) PURE; + STDMETHOD(DeactivateAndUndo)(THIS) PURE; + STDMETHOD(OnPosRectChange)(THIS_ LPCRECT) PURE; +}; + +EXTERN_C const IID IID_IOleAdviseHolder; +#undef INTERFACE +#define INTERFACE IOleAdviseHolder +DECLARE_INTERFACE_(IOleAdviseHolder,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Advise)(THIS_ LPADVISESINK,PDWORD) PURE; + STDMETHOD(Unadvise)(THIS_ DWORD) PURE; + STDMETHOD(EnumAdvise)(THIS_ LPENUMSTATDATA*) PURE; + STDMETHOD(SendOnRename)(THIS_ LPMONIKER) PURE; + STDMETHOD(SendOnSave)(THIS) PURE; + STDMETHOD(SendOnClose)(THIS) PURE; +}; + +#ifdef COBJMACROS +#define IOleAdviseHolder_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IOleAdviseHolder_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IOleAdviseHolder_Release(T) (T)->lpVtbl->Release(T) +#define IOleAdviseHolder_Advise(T,a,b) (T)->lpVtbl->Advise(T,a,b) +#define IOleAdviseHolder_Unadvise(T,a) (T)->lpVtbl->Unadvise(T,a) +#define IOleAdviseHolder_EnumAdvise(T,a) (T)->lpVtbl->EnumAdvise(T,a) +#define IOleAdviseHolder_SendOnRename(T,a) (T)->lpVtbl->SendOnRename(T,a) +#define IOleAdviseHolder_SendOnSave(T) (T)->lpVtbl->SendOnSave(T) +#define IOleAdviseHolder_SendOnClose(T) (T)->lpVtbl->SendOnClose(T) +#endif + +EXTERN_C const IID IID_IDropSource; +#undef INTERFACE +#define INTERFACE IDropSource +DECLARE_INTERFACE_(IDropSource,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(QueryContinueDrag)(THIS_ BOOL,DWORD) PURE; + STDMETHOD(GiveFeedback)(THIS_ DWORD) PURE; +}; + +#ifdef COBJMACROS +#define IDropSource_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IDropSource_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IDropSource_Release(T) (T)->lpVtbl->Release(T) +#define IDropSource_QueryContinueDrag(T,a,b) (T)->lpVtbl->QueryContinueDrag(T,a,b) +#define IDropSource_GiveFeedback(T,a) (T)->lpVtbl->GiveFeedback(T,a) +#endif + +EXTERN_C const IID IID_IDropTarget; +#undef INTERFACE +#define INTERFACE IDropTarget +DECLARE_INTERFACE_(IDropTarget,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(DragEnter)(THIS_ LPDATAOBJECT,DWORD,POINTL,PDWORD) PURE; + STDMETHOD(DragOver)(THIS_ DWORD,POINTL,PDWORD) PURE; + STDMETHOD(DragLeave)(THIS) PURE; + STDMETHOD(Drop)(THIS_ LPDATAOBJECT,DWORD,POINTL,PDWORD) PURE; +}; + +#ifdef COBJMACROS +#define IDropTarget_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IDropTarget_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IDropTarget_Release(T) (T)->lpVtbl->Release(T) +#define IDropTarget_DragEnter(T,a,b,c,d) (T)->lpVtbl->DragEnter(T,a,b,c,d) +#define IDropTarget_DragOver(T,a,b,c) (T)->lpVtbl->DragOver(T,a,b,c) +#define IDropTarget_DragLeave(T) (T)->lpVtbl->DragLeave(T) +#define IDropTarget_Drop(T,a,b,c,d) (T)->lpVtbl->Drop(T,a,b,c,d) +#endif + +typedef BOOL(CALLBACK *__IView_pfncont)(DWORD); +EXTERN_C const IID IID_IViewObject; +#undef INTERFACE +#define INTERFACE IViewObject +DECLARE_INTERFACE_(IViewObject,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Draw)(THIS_ DWORD,LONG,PVOID,DVTARGETDEVICE*,HDC,HDC,LPCRECTL,LPCRECTL,__IView_pfncont pfnContinue,DWORD) PURE; + STDMETHOD(GetColorSet)(THIS_ DWORD,LONG,PVOID,DVTARGETDEVICE*,HDC,LPLOGPALETTE*) PURE; + STDMETHOD(Freeze)(THIS_ DWORD,LONG,PVOID,PDWORD) PURE; + STDMETHOD(Unfreeze)(THIS_ DWORD) PURE; + STDMETHOD(SetAdvise)(THIS_ DWORD,DWORD,IAdviseSink*) PURE; + STDMETHOD(GetAdvise)(THIS_ PDWORD,PDWORD,IAdviseSink**) PURE; +}; + +#ifdef COBJMACROS +#define IViewObject_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IViewObject_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IViewObject_Release(T) (T)->lpVtbl->Release(T) +#define IViewObject_Draw(T,a,b,c,d,e,f,g,h,i,j) (T)->lpVtbl->Draw(T,a,b,c,d,e,f,g,h,i,j) +#define IViewObject_GetColorSet(T,a,b,c,d,e,f) (T)->lpVtbl->GetColorSet(T,a,b,c,d,e,f) +#define IViewObject_Freeze(T,a,b,c,d) (T)->lpVtbl->Freeze(T,a,b,c,d) +#define IViewObject_Unfreeze(T,a) (T)->lpVtbl->Unfreeze(T,a) +#define IViewObject_SetAdvise(T,a,b,c) (T)->lpVtbl->SetAdvise(T,a,b,c) +#define IViewObject_GetAdvise(T,a,b,c) (T)->lpVtbl->GetAdvise(T,a,b,c) +#endif + +EXTERN_C const IID IID_IViewObject2; +#undef INTERFACE +#define INTERFACE IViewObject2 +DECLARE_INTERFACE_(IViewObject2,IViewObject) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Draw)(THIS_ DWORD,LONG,PVOID,DVTARGETDEVICE*,HDC,HDC,LPCRECTL,LPCRECTL,__IView_pfncont pfnContinue,DWORD) PURE; + STDMETHOD(GetColorSet)(THIS_ DWORD,LONG,PVOID,DVTARGETDEVICE*,HDC,LPLOGPALETTE*) PURE; + STDMETHOD(Freeze)(THIS_ DWORD,LONG,PVOID,PDWORD) PURE; + STDMETHOD(Unfreeze)(THIS_ DWORD) PURE; + STDMETHOD(SetAdvise)(THIS_ DWORD,DWORD,IAdviseSink*) PURE; + STDMETHOD(GetAdvise)(THIS_ PDWORD,PDWORD,IAdviseSink**) PURE; + STDMETHOD(GetExtent)(THIS_ DWORD,LONG,DVTARGETDEVICE*,LPSIZEL) PURE; +}; + +#ifdef COBJMACROS +#define IViewObject2_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IViewObject2_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IViewObject2_Release(T) (T)->lpVtbl->Release(T) +#define IViewObject2_Draw(T,a,b,c,d,e,f,g,h,i,j) (T)->lpVtbl->Draw(T,a,b,c,d,e,f,g,h,i,j) +#define IViewObject2_GetColorSet(T,a,b,c,d,e,f) (T)->lpVtbl->GetColorSet(T,a,b,c,d,e,f) +#define IViewObject2_Freeze(T,a,b,c,d) (T)->lpVtbl->Freeze(T,a,b,c,d) +#define IViewObject2_Unfreeze(T,a) (T)->lpVtbl->Unfreeze(T,a) +#define IViewObject2_SetAdvise(T,a,b,c) (T)->lpVtbl->SetAdvise(T,a,b,c) +#define IViewObject2_GetAdvise(T,a,b,c) (T)->lpVtbl->GetAdvise(T,a,b,c) +#define IViewObject2_GetExtent(T,a,b,c,d) (T)->lpVtbl->GetExtent(T,a,b,c,d) +#endif + +EXTERN_C const IID IID_IOleCache; +#undef INTERFACE +#define INTERFACE IOleCache +DECLARE_INTERFACE_(IOleCache,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Cache)(THIS_ FORMATETC*,DWORD,DWORD*) PURE; + STDMETHOD(Uncache)(THIS_ DWORD) PURE; + STDMETHOD(EnumCache)(THIS_ IEnumSTATDATA**); + STDMETHOD(InitCache)(THIS_ LPDATAOBJECT); + STDMETHOD(SetData)(THIS_ FORMATETC*,STGMEDIUM*,BOOL); +}; + +#ifdef COBJMACROS +#define IOleCache_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IOleCache_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IOleCache_Release(T) (T)->lpVtbl->Release(T) +#define IOleCache_Cache(T,a,b,c) (T)->lpVtbl->Cache(T,a,b,c) +#define IOleCache_Uncache(T,a) (T)->lpVtbl->Uncache(T,a) +#define IOleCache_EnumCache(T,a) (T)->lpVtbl->EnumCache(T,a) +#define IOleCache_InitCache(T,a) (T)->lpVtbl->InitCache(T,a) +#define IOleCache_SetData(T,a,b,c) (T)->lpVtbl->SetData(T,a,b,c) +#endif + +EXTERN_C const IID IID_IOleCache2; +#undef INTERFACE +#define INTERFACE IOleCache2 +DECLARE_INTERFACE_(IOleCache2,IOleCache) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Cache)(THIS_ FORMATETC*,DWORD,DWORD*) PURE; + STDMETHOD(Uncache)(THIS_ DWORD) PURE; + STDMETHOD(EnumCache)(THIS_ IEnumSTATDATA**) PURE; + STDMETHOD(InitCache)(THIS_ LPDATAOBJECT) PURE; + STDMETHOD(SetData)(THIS_ FORMATETC*,STGMEDIUM*,BOOL) PURE; + STDMETHOD(UpdateCache)(THIS_ LPDATAOBJECT,DWORD,LPVOID) PURE; + STDMETHOD(DiscardCache)(THIS_ DWORD) PURE; +}; + +#ifdef COBJMACROS +#define IOleCache2_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IOleCache2_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IOleCache2_Release(T) (T)->lpVtbl->Release(T) +#define IOleCache2_Cache(T,a,b,c) (T)->lpVtbl->Cache(T,a,b,c) +#define IOleCache2_Uncache(T,a) (T)->lpVtbl->Uncache(T,a) +#define IOleCache2_EnumCache(T,a) (T)->lpVtbl->EnumCache(T,a) +#define IOleCache2_InitCache(T,a) (T)->lpVtbl->InitCache(T,a) +#define IOleCache2_SetData(T,a,b,c) (T)->lpVtbl->SetData(T,a,b,c) +#define IOleCache2_UpdateCache(T,a,b,c) (T)->lpVtbl->UpdateCache(T,a,b,c) +#define IOleCache2_DiscardCache(T,a) (T)->lpVtbl->DiscardCache(T,a) +#endif + +EXTERN_C const IID IID_IOleCacheControl; +#undef INTERFACE +#define INTERFACE IOleCacheControl +DECLARE_INTERFACE_(IOleCacheControl,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(OnRun)(THIS_ LPDATAOBJECT) PURE; + STDMETHOD(OnStop)(THIS) PURE; +}; + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/reactos/w32api/include/pbt.h b/reactos/w32api/include/pbt.h new file mode 100644 index 00000000000..2001e1b2916 --- /dev/null +++ b/reactos/w32api/include/pbt.h @@ -0,0 +1,20 @@ +#ifndef _PBT_H +#define _PBT_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#define PBT_APMQUERYSUSPEND 0 +#define PBT_APMQUERYSTANDBY 1 +#define PBT_APMQUERYSUSPENDFAILED 2 +#define PBT_APMQUERYSTANDBYFAILED 3 +#define PBT_APMSUSPEND 4 +#define PBT_APMSTANDBY 5 +#define PBT_APMRESUMECRITICAL 6 +#define PBT_APMRESUMESUSPEND 7 +#define PBT_APMRESUMESTANDBY 8 +#define PBTF_APMRESUMEFROMFAILURE 1 +#define PBT_APMBATTERYLOW 9 +#define PBT_APMPOWERSTATUSCHANGE 10 +#define PBT_APMOEMEVENT 11 +#endif diff --git a/reactos/w32api/include/poppack.h b/reactos/w32api/include/poppack.h new file mode 100644 index 00000000000..bb04d4524b2 --- /dev/null +++ b/reactos/w32api/include/poppack.h @@ -0,0 +1,3 @@ +#ifndef RC_INVOKED +#pragma pack(pop) +#endif diff --git a/reactos/w32api/include/powrprof.h b/reactos/w32api/include/powrprof.h new file mode 100644 index 00000000000..dc7d1f356f8 --- /dev/null +++ b/reactos/w32api/include/powrprof.h @@ -0,0 +1,120 @@ +#ifndef _POWRPROF_H +#define _POWRPROF_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define EnableMultiBatteryDisplay 2 +#define EnablePasswordLogon 4 +#define EnableSysTrayBatteryMeter 1 +#define EnableWakeOnRing 8 +#define EnableVideoDimDisplay 16 +#define NEWSCHEME (UINT)-1 + +#ifndef RC_INVOKED +#include <ntdef.h> /* for NTSTATUS */ +typedef struct _GLOBAL_MACHINE_POWER_POLICY{ + ULONG Revision; + SYSTEM_POWER_STATE LidOpenWakeAc; + SYSTEM_POWER_STATE LidOpenWakeDc; + ULONG BroadcastCapacityResolution; +} GLOBAL_MACHINE_POWER_POLICY, *PGLOBAL_MACHINE_POWER_POLICY; +typedef struct _GLOBAL_USER_POWER_POLICY{ + ULONG Revision; + POWER_ACTION_POLICY PowerButtonAc; + POWER_ACTION_POLICY PowerButtonDc; + POWER_ACTION_POLICY SleepButtonAc; + POWER_ACTION_POLICY SleepButtonDc; + POWER_ACTION_POLICY LidCloseAc; + POWER_ACTION_POLICY LidCloseDc; + SYSTEM_POWER_LEVEL DischargePolicy[NUM_DISCHARGE_POLICIES]; + ULONG GlobalFlags; +} GLOBAL_USER_POWER_POLICY, *PGLOBAL_USER_POWER_POLICY; +typedef struct _GLOBAL_POWER_POLICY{ + GLOBAL_USER_POWER_POLICY user; + GLOBAL_MACHINE_POWER_POLICY mach; +} GLOBAL_POWER_POLICY, *PGLOBAL_POWER_POLICY; +typedef struct _MACHINE_POWER_POLICY{ + ULONG Revision; + SYSTEM_POWER_STATE MinSleepAc; + SYSTEM_POWER_STATE MinSleepDc; + SYSTEM_POWER_STATE ReducedLatencySleepAc; + SYSTEM_POWER_STATE ReducedLatencySleepDc; + ULONG DozeTimeoutAc; + ULONG DozeTimeoutDc; + ULONG DozeS4TimeoutAc; + ULONG DozeS4TimeoutDc; + UCHAR MinThrottleAc; + UCHAR MinThrottleDc; + UCHAR pad1[2]; + POWER_ACTION_POLICY OverThrottledAc; + POWER_ACTION_POLICY OverThrottledDc; +} MACHINE_POWER_POLICY, *PMACHINE_POWER_POLICY; +typedef struct _MACHINE_PROCESSOR_POWER_POLICY { + ULONG Revision; + PROCESSOR_POWER_POLICY ProcessorPolicyAc; + PROCESSOR_POWER_POLICY ProcessorPolicyDc; +} MACHINE_PROCESSOR_POWER_POLICY, *PMACHINE_PROCESSOR_POWER_POLICY; +typedef struct _USER_POWER_POLICY{ + ULONG Revision; + POWER_ACTION_POLICY IdleAc; + POWER_ACTION_POLICY IdleDc; + ULONG IdleTimeoutAc; + ULONG IdleTimeoutDc; + UCHAR IdleSensitivityAc; + UCHAR IdleSensitivityDc; + UCHAR ThrottlePolicyAc; + UCHAR ThrottlePolicyDc; + SYSTEM_POWER_STATE MaxSleepAc; + SYSTEM_POWER_STATE MaxSleepDc; + ULONG Reserved[2]; + ULONG VideoTimeoutAc; + ULONG VideoTimeoutDc; + ULONG SpindownTimeoutAc; + ULONG SpindownTimeoutDc; + BOOLEAN OptimizeForPowerAc; + BOOLEAN OptimizeForPowerDc; + UCHAR FanThrottleToleranceAc; + UCHAR FanThrottleToleranceDc; + UCHAR ForcedThrottleAc; + UCHAR ForcedThrottleDc; +} USER_POWER_POLICY, *PUSER_POWER_POLICY; +typedef struct _POWER_POLICY{ + USER_POWER_POLICY user; + MACHINE_POWER_POLICY mach; +} POWER_POLICY, *PPOWER_POLICY; +typedef BOOLEAN (CALLBACK* PWRSCHEMESENUMPROC)(UINT, DWORD, LPTSTR, DWORD, LPTSTR, PPOWER_POLICY, LPARAM); +typedef BOOLEAN (CALLBACK* PFNNTINITIATEPWRACTION)(POWER_ACTION, SYSTEM_POWER_STATE, ULONG, BOOLEAN); +NTSTATUS WINAPI CallNtPowerInformation(POWER_INFORMATION_LEVEL, PVOID, ULONG, PVOID, ULONG); +BOOLEAN WINAPI CanUserWritePwrScheme(VOID); +BOOLEAN WINAPI DeletePwrScheme(UINT); +BOOLEAN WINAPI EnumPwrSchemes(PWRSCHEMESENUMPROC, LPARAM); +BOOLEAN WINAPI GetActivePwrScheme(PUINT); +BOOLEAN WINAPI GetCurrentPowerPolicies(PGLOBAL_POWER_POLICY, PPOWER_POLICY); +BOOLEAN WINAPI GetPwrCapabilities(PSYSTEM_POWER_CAPABILITIES); +BOOLEAN WINAPI GetPwrDiskSpindownRange(PUINT, PUINT); +BOOLEAN WINAPI IsAdminOverrideActive(PADMINISTRATOR_POWER_POLICY); +BOOLEAN WINAPI IsPwrHibernateAllowed(VOID); +BOOLEAN WINAPI IsPwrShutdownAllowed(VOID); +BOOLEAN WINAPI IsPwrSuspendAllowed(VOID); +BOOLEAN WINAPI ReadGlobalPwrPolicy(PGLOBAL_POWER_POLICY); +BOOLEAN WINAPI ReadProcessorPwrScheme(UINT, PMACHINE_PROCESSOR_POWER_POLICY); +BOOLEAN WINAPI ReadPwrScheme(UINT, PPOWER_POLICY); +BOOLEAN WINAPI SetActivePwrScheme(UINT, PGLOBAL_POWER_POLICY, PPOWER_POLICY); +BOOLEAN WINAPI SetSuspendState(BOOLEAN, BOOLEAN, BOOLEAN); +BOOLEAN WINAPI WriteGlobalPwrPolicy(PGLOBAL_POWER_POLICY); +BOOLEAN WINAPI WriteProcessorPwrScheme(UINT, PMACHINE_PROCESSOR_POWER_POLICY); +BOOLEAN WINAPI ValidatePowerPolicies(PGLOBAL_POWER_POLICY, PPOWER_POLICY); +BOOLEAN WINAPI WritePwrScheme(PUINT, LPTSTR, LPTSTR, PPOWER_POLICY); + +#endif /* RC_INVOKED */ + +#ifdef __cplusplus +} +#endif + +#endif /* _POWRPROF_H */ diff --git a/reactos/w32api/include/prsht.h b/reactos/w32api/include/prsht.h new file mode 100644 index 00000000000..299834b68e0 --- /dev/null +++ b/reactos/w32api/include/prsht.h @@ -0,0 +1,304 @@ +#ifndef _PRSHT_H +#define _PRSHT_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define MAXPROPPAGES 100 +#define PSP_DEFAULT 0 +#define PSP_DLGINDIRECT 1 +#define PSP_USEHICON 2 +#define PSP_USEICONID 4 +#define PSP_USETITLE 8 +#define PSP_RTLREADING 16 +#define PSP_HASHELP 32 +#define PSP_USEREFPARENT 64 +#define PSP_USECALLBACK 128 +#define PSP_PREMATURE 1024 +#if (_WIN32_IE >= 0x0400) +#define PSP_HIDEHEADER 2048 +#define PSP_USEHEADERTITLE 4096 +#define PSP_USEHEADERSUBTITLE 8192 +#endif +#define PSPCB_RELEASE 1 +#define PSPCB_CREATE 2 +#define PSH_DEFAULT 0 +#define PSH_PROPTITLE 1 +#define PSH_USEHICON 2 +#define PSH_USEICONID 4 +#define PSH_PROPSHEETPAGE 8 +#define PSH_WIZARDHASFINISH 16 +#define PSH_WIZARD 32 +#define PSH_USEPSTARTPAGE 64 +#define PSH_NOAPPLYNOW 128 +#define PSH_USECALLBACK 256 +#define PSH_HASHELP 512 +#define PSH_MODELESS 1024 +#define PSH_RTLREADING 2048 +#define PSH_WIZARDCONTEXTHELP 4096 +#if (_WIN32_IE >= 0x0400) +#define PSH_WATERMARK 32768 +#define PSH_USEHBMWATERMARK 65536 +#define PSH_USEHPLWATERMARK 131072 +#define PSH_STRETCHWATERMARK 262144 +#define PSH_HEADER 524288 +#define PSH_USEHBMHEADER 1048576 +#define PSH_USEPAGELANG 2097152 +#if (_WIN32_IE < 0x0500) +#define PSH_WIZARD97 0x00002000 +#else +#define PSH_WIZARD97 0x01000000 +#endif +#endif /* _WIN32_IE >= 0x0400 */ +#if (_WIN32_IE >= 0x0500) +#define PSH_WIZARD_LITE 0x400000 +#define PSH_NOCONTEXTHELP 0x2000000 +#endif +#define PSCB_INITIALIZED 1 +#define PSCB_PRECREATE 2 +#define PSM_GETTABCONTROL 1140 +#define PSM_GETCURRENTPAGEHWND 1142 +#define PSM_ISDIALOGMESSAGE 1141 +#define PSM_PRESSBUTTON 1137 +#define PSM_SETCURSELID 1138 +#define PSM_SETFINISHTEXTW 1145 +#define PSM_SETFINISHTEXTA 1139 +#define PSN_FIRST (-200) +#define PSN_LAST (-299) +#define PSN_APPLY (-202) +#define PSN_HELP (-205) +#define PSN_KILLACTIVE (-201) +#define PSN_QUERYCANCEL (-209) +#define PSN_RESET (-203) +#define PSN_SETACTIVE (-200) +#define PSN_WIZBACK (-206) +#define PSN_WIZFINISH (-208) +#define PSN_WIZNEXT (-207) +#define PSNRET_NOERROR 0 +#define PSNRET_INVALID 1 +#define PSNRET_INVALID_NOCHANGEPAGE 2 +#define ID_PSRESTARTWINDOWS 2 +#define ID_PSREBOOTSYSTEM 3 +#define WIZ_CXDLG 276 +#define WIZ_CYDLG 140 +#define WIZ_CXBMP 80 +#define WIZ_BODYX 92 +#define WIZ_BODYCX 184 +#define PROP_SM_CXDLG 212 +#define PROP_SM_CYDLG 188 +#define PROP_MED_CXDLG 227 +#define PROP_MED_CYDLG 215 +#define PROP_LG_CXDLG 252 +#define PROP_LG_CYDLG 218 +#define PSBTN_MAX 6 +#define PSBTN_BACK 0 +#define PSBTN_NEXT 1 +#define PSBTN_FINISH 2 +#define PSBTN_OK 3 +#define PSBTN_APPLYNOW 4 +#define PSBTN_CANCEL 5 +#define PSBTN_HELP 6 +#define PSWIZB_BACK 1 +#define PSWIZB_NEXT 2 +#define PSWIZB_FINISH 4 +#define PSWIZB_DISABLEDFINISH 8 +#define PSM_SETWIZBUTTONS (WM_USER+112) +#define PSM_APPLY (WM_USER+110) +#define PSM_UNCHANGED (WM_USER+109) +#define PSM_QUERYSIBLINGS (WM_USER+108) +#define PSM_CANCELTOCLOSE (WM_USER+107) +#define PSM_REBOOTSYSTEM (WM_USER+106) +#define PSM_RESTARTWINDOWS (WM_USER+105) +#define PSM_CHANGED (WM_USER+104) +#define PSM_ADDPAGE (WM_USER+103) +#define PSM_REMOVEPAGE (WM_USER+102) +#define PSM_SETCURSEL (WM_USER+101) +#define PSM_SETTITLEA (WM_USER+111) +#define PSM_SETTITLEW (WM_USER+120) + +#ifndef RC_INVOKED + +#pragma pack(push,8) +typedef struct _PROPSHEETPAGEA { + DWORD dwSize; + DWORD dwFlags; + HINSTANCE hInstance; + _ANONYMOUS_UNION union { + LPCSTR pszTemplate; + LPCDLGTEMPLATE pResource; + } DUMMYUNIONNAME; + _ANONYMOUS_UNION union { + HICON hIcon; + LPCSTR pszIcon; + } DUMMYUNIONNAME2; + LPCSTR pszTitle; + DLGPROC pfnDlgProc; + LPARAM lParam; + UINT(CALLBACK *pfnCallback)(HWND,UINT,struct _PROPSHEETPAGEA*); + UINT *pcRefParent; +#if (_WIN32_IE >= 0x0400) + LPCSTR pszHeaderTitle; + LPCSTR pszHeaderSubTitle; +#endif +} PROPSHEETPAGEA,*LPPROPSHEETPAGEA; +typedef const PROPSHEETPAGEA *LPCPROPSHEETPAGEA; +typedef struct _PROPSHEETPAGEW { + DWORD dwSize; + DWORD dwFlags; + HINSTANCE hInstance; + _ANONYMOUS_UNION union { + LPCWSTR pszTemplate; + LPCDLGTEMPLATE pResource; + } DUMMYUNIONNAME; + _ANONYMOUS_UNION union { + HICON hIcon; + LPCWSTR pszIcon; + } DUMMYUNIONNAME2; + LPCWSTR pszTitle; + DLGPROC pfnDlgProc; + LPARAM lParam; + UINT(CALLBACK *pfnCallback)(HWND,UINT,struct _PROPSHEETPAGEW*); + UINT *pcRefParent; +#if (_WIN32_IE >= 0x0400) + LPCWSTR pszHeaderTitle; + LPCWSTR pszHeaderSubTitle; +#endif +} PROPSHEETPAGEW,*LPPROPSHEETPAGEW; +typedef const PROPSHEETPAGEW *LPCPROPSHEETPAGEW; +typedef UINT(CALLBACK *LPFNPSPCALLBACKA)(HWND,UINT,LPPROPSHEETPAGEA); +typedef UINT(CALLBACK *LPFNPSPCALLBACKW)(HWND,UINT,LPPROPSHEETPAGEW); +typedef int(CALLBACK *PFNPROPSHEETCALLBACK)(HWND,UINT,LPARAM); +DECLARE_HANDLE(HPROPSHEETPAGE); +typedef struct _PROPSHEETHEADERA { + DWORD dwSize; + DWORD dwFlags; + HWND hwndParent; + HINSTANCE hInstance; + _ANONYMOUS_UNION union { + HICON hIcon; + LPCSTR pszIcon; + }DUMMYUNIONNAME; + LPCSTR pszCaption; + UINT nPages; + _ANONYMOUS_UNION union { + UINT nStartPage; + LPCSTR pStartPage; + }DUMMYUNIONNAME2; + _ANONYMOUS_UNION union { + LPCPROPSHEETPAGEA ppsp; + HPROPSHEETPAGE *phpage; + }DUMMYUNIONNAME3; + PFNPROPSHEETCALLBACK pfnCallback; +#if (_WIN32_IE >= 0x0400) + _ANONYMOUS_UNION union { + HBITMAP hbmWatermark; + LPCSTR pszbmWatermark; + } DUMMYUNIONNAME4; + HPALETTE hplWatermark; + _ANONYMOUS_UNION union { + HBITMAP hbmHeader; + LPCSTR pszbmHeader; + } DUMMYUNIONNAME5; +#endif +} PROPSHEETHEADERA,*LPPROPSHEETHEADERA; +typedef const PROPSHEETHEADERA *LPCPROPSHEETHEADERA; +typedef struct _PROPSHEETHEADERW { + DWORD dwSize; + DWORD dwFlags; + HWND hwndParent; + HINSTANCE hInstance; + _ANONYMOUS_UNION union { + HICON hIcon; + LPCWSTR pszIcon; + }DUMMYUNIONNAME; + LPCWSTR pszCaption; + UINT nPages; + _ANONYMOUS_UNION union { + UINT nStartPage; + LPCWSTR pStartPage; + }DUMMYUNIONNAME2; + _ANONYMOUS_UNION union { + LPCPROPSHEETPAGEW ppsp; + HPROPSHEETPAGE *phpage; + }DUMMYUNIONNAME3; + PFNPROPSHEETCALLBACK pfnCallback; +#if (_WIN32_IE >= 0x0400) + _ANONYMOUS_UNION union { + HBITMAP hbmWatermark; + LPCWSTR pszbmWatermark; + } DUMMYUNIONNAME4; + HPALETTE hplWatermark; + _ANONYMOUS_UNION union { + HBITMAP hbmHeader; + LPCWSTR pszbmHeader; + } DUMMYUNIONNAME5; +#endif +} PROPSHEETHEADERW,*LPPROPSHEETHEADERW; +typedef const PROPSHEETHEADERW *LPCPROPSHEETHEADERW; +typedef BOOL(CALLBACK *LPFNADDPROPSHEETPAGE)(HPROPSHEETPAGE,LPARAM); +typedef BOOL(CALLBACK *LPFNADDPROPSHEETPAGES)(LPVOID,LPFNADDPROPSHEETPAGE,LPARAM); +typedef struct _PSHNOTIFY { + NMHDR hdr; + LPARAM lParam; +} PSHNOTIFY,*LPPSHNOTIFY; + +#pragma pack(pop) + +HPROPSHEETPAGE WINAPI CreatePropertySheetPageA(LPCPROPSHEETPAGEA); +HPROPSHEETPAGE WINAPI CreatePropertySheetPageW(LPCPROPSHEETPAGEW); +BOOL WINAPI DestroyPropertySheetPage(HPROPSHEETPAGE); +int WINAPI PropertySheetA(LPCPROPSHEETHEADERA); +int WINAPI PropertySheetW(LPCPROPSHEETHEADERW); +#define PropSheet_AddPage(d,p) SendMessage(d,PSM_ADDPAGE,0,(LPARAM)p) +#define PropSheet_Apply(d) SendMessage(d,PSM_APPLY,0,0) +#define PropSheet_CancelToClose(d) SendMessage(d,PSM_CANCELTOCLOSE,0,0) +#define PropSheet_Changed(d,w) SendMessage(d,PSM_CHANGED,(WPARAM)w,0) +#define PropSheet_GetCurrentPageHwnd(d) (HWND)SendMessage(d,PSM_GETCURRENTPAGEHWND,0,0) +#define PropSheet_GetTabControl(d) (HWND)SendMessage(d,PSM_GETTABCONTROL,0,0) +#define PropSheet_IsDialogMessage(d,m) (BOOL)SendMessage(d,PSM_ISDIALOGMESSAGE,0,(LPARAM)m) +#define PropSheet_PressButton(d,i) SendMessage(d,PSM_PRESSBUTTON,i,0) +#define PropSheet_QuerySiblings(d,w,l) SendMessage(d,PSM_QUERYSIBLINGS,w,l) +#define PropSheet_RebootSystem(d) SendMessage(d,PSM_REBOOTSYSTEM,0,0) +#define PropSheet_RemovePage(d,i,p) SendMessage(d,PSM_REMOVEPAGE,i,(LPARAM)p) +#define PropSheet_RestartWindows(d) SendMessage(d,PSM_RESTARTWINDOWS,0,0) +#define PropSheet_SetCurSel(d,p,i) SendMessage(d,PSM_SETCURSEL,i,(LPARAM)p) +#define PropSheet_SetCurSelByID(d,i) SendMessage(d,PSM_SETCURSELID,0,i) +#define PropSheet_SetFinishText(d,s) SendMessage(d,PSM_SETFINISHTEXT,0,(LPARAM)s) +#define PropSheet_SetTitle(d,w,s) SendMessage(d,PSM_SETTITLE,w,(LPARAM)s) +#define PropSheet_SetWizButtons(d,f) PostMessage(d,PSM_SETWIZBUTTONS,0,(LPARAM)f) +#define PropSheet_UnChanged(d,w) SendMessage(d,PSM_UNCHANGED,(WPARAM)w,0) +#endif + +#ifdef UNICODE +#define LPFNPSPCALLBACK LPFNPSPCALLBACKW +#define PROPSHEETPAGE PROPSHEETPAGEW +#define LPPROPSHEETPAGE LPPROPSHEETPAGEW +#define LPCPROPSHEETPAGE LPCPROPSHEETPAGEW +#define PROPSHEETHEADER PROPSHEETHEADERW +#define LPPROPSHEETHEADER LPPROPSHEETHEADERW +#define LPCPROPSHEETHEADER LPCPROPSHEETHEADERW +#define PSM_SETTITLE PSM_SETTITLEW +#define PSM_SETFINISHTEXT PSM_SETFINISHTEXTW +#define CreatePropertySheetPage CreatePropertySheetPageW +#define PropertySheet PropertySheetW +#else +#define LPFNPSPCALLBACK LPFNPSPCALLBACKA +#define PROPSHEETPAGE PROPSHEETPAGEA +#define LPPROPSHEETPAGE LPPROPSHEETPAGEA +#define LPCPROPSHEETPAGE LPCPROPSHEETPAGEA +#define PROPSHEETHEADER PROPSHEETHEADERA +#define LPPROPSHEETHEADER LPPROPSHEETHEADERA +#define LPCPROPSHEETHEADER LPCPROPSHEETHEADERA +#define PSM_SETTITLE PSM_SETTITLEA +#define PSM_SETFINISHTEXT PSM_SETFINISHTEXTA +#define CreatePropertySheetPage CreatePropertySheetPageA +#define PropertySheet PropertySheetA +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/psapi.h b/reactos/w32api/include/psapi.h new file mode 100644 index 00000000000..af72931ef70 --- /dev/null +++ b/reactos/w32api/include/psapi.h @@ -0,0 +1,95 @@ +/* + psapi.h - Include file for PSAPI.DLL APIs + + Written by Mumit Khan <khan@nanotech.wisc.edu> + + This file is part of a free library for the Win32 API. + + NOTE: This strictly does not belong in the Win32 API since it's + really part of Platform SDK. However,GDB needs it and we might + as well provide it here. + + 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. + +*/ +#ifndef _PSAPI_H +#define _PSAPI_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef RC_INVOKED + +typedef struct _MODULEINFO { + LPVOID lpBaseOfDll; + DWORD SizeOfImage; + LPVOID EntryPoint; +} MODULEINFO,*LPMODULEINFO; + +typedef struct _PSAPI_WS_WATCH_INFORMATION { + LPVOID FaultingPc; + LPVOID FaultingVa; +} PSAPI_WS_WATCH_INFORMATION,*PPSAPI_WS_WATCH_INFORMATION; + +typedef struct _PROCESS_MEMORY_COUNTERS { + DWORD cb; + DWORD PageFaultCount; + DWORD PeakWorkingSetSize; + DWORD WorkingSetSize; + DWORD QuotaPeakPagedPoolUsage; + DWORD QuotaPagedPoolUsage; + DWORD QuotaPeakNonPagedPoolUsage; + DWORD QuotaNonPagedPoolUsage; + DWORD PagefileUsage; + DWORD PeakPagefileUsage; +} PROCESS_MEMORY_COUNTERS,*PPROCESS_MEMORY_COUNTERS; + +/* Grouped by application,not in alphabetical order. */ +BOOL WINAPI EnumProcesses(DWORD *,DWORD,DWORD *); +BOOL WINAPI EnumProcessModules(HANDLE,HMODULE *,DWORD,LPDWORD); +DWORD WINAPI GetModuleBaseNameA(HANDLE,HMODULE,LPSTR,DWORD); +DWORD WINAPI GetModuleBaseNameW(HANDLE,HMODULE,LPWSTR,DWORD); +DWORD WINAPI GetModuleFileNameExA(HANDLE,HMODULE,LPSTR,DWORD); +DWORD WINAPI GetModuleFileNameExW(HANDLE,HMODULE,LPWSTR,DWORD); +BOOL WINAPI GetModuleInformation(HANDLE,HMODULE,LPMODULEINFO,DWORD); +BOOL WINAPI EmptyWorkingSet(HANDLE); +BOOL WINAPI QueryWorkingSet(HANDLE,PVOID,DWORD); +BOOL WINAPI InitializeProcessForWsWatch(HANDLE); +BOOL WINAPI GetWsChanges(HANDLE,PPSAPI_WS_WATCH_INFORMATION,DWORD); +DWORD WINAPI GetMappedFileNameW(HANDLE,LPVOID,LPWSTR,DWORD); +DWORD WINAPI GetMappedFileNameA(HANDLE,LPVOID,LPSTR,DWORD); +BOOL WINAPI EnumDeviceDrivers(LPVOID *,DWORD,LPDWORD); +DWORD WINAPI GetDeviceDriverBaseNameA(LPVOID,LPSTR,DWORD); +DWORD WINAPI GetDeviceDriverBaseNameW(LPVOID,LPWSTR,DWORD); +DWORD WINAPI GetDeviceDriverFileNameA(LPVOID,LPSTR,DWORD); +DWORD WINAPI GetDeviceDriverFileNameW(LPVOID,LPWSTR,DWORD); +BOOL WINAPI GetProcessMemoryInfo(HANDLE,PPROCESS_MEMORY_COUNTERS,DWORD); + +#endif /* not RC_INVOKED */ + +#ifdef UNICODE +#define GetModuleBaseName GetModuleBaseNameW +#define GetModuleFileNameEx GetModuleFileNameExW +#define GetMappedFilenameEx GetMappedFilenameExW +#define GetDeviceDriverBaseName GetDeviceDriverBaseNameW +#define GetDeviceDriverFileName GetDeviceDriverFileNameW +#else +#define GetModuleBaseName GetModuleBaseNameA +#define GetModuleFileNameEx GetModuleFileNameExA +#define GetMappedFilenameEx GetMappedFilenameExA +#define GetDeviceDriverBaseName GetDeviceDriverBaseNameA +#define GetDeviceDriverFileName GetDeviceDriverFileNameA +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _PSAPI_H */ + diff --git a/reactos/w32api/include/pshpack1.h b/reactos/w32api/include/pshpack1.h new file mode 100644 index 00000000000..3cbcf238bb2 --- /dev/null +++ b/reactos/w32api/include/pshpack1.h @@ -0,0 +1,3 @@ +#ifndef RC_INVOKED +#pragma pack(push,1) +#endif diff --git a/reactos/w32api/include/pshpack2.h b/reactos/w32api/include/pshpack2.h new file mode 100644 index 00000000000..4d88e004e16 --- /dev/null +++ b/reactos/w32api/include/pshpack2.h @@ -0,0 +1,3 @@ +#ifndef RC_INVOKED +#pragma pack(push,2) +#endif diff --git a/reactos/w32api/include/pshpack4.h b/reactos/w32api/include/pshpack4.h new file mode 100644 index 00000000000..c1c3cf95913 --- /dev/null +++ b/reactos/w32api/include/pshpack4.h @@ -0,0 +1,3 @@ +#ifndef RC_INVOKED +#pragma pack(push,4) +#endif diff --git a/reactos/w32api/include/pshpack8.h b/reactos/w32api/include/pshpack8.h new file mode 100644 index 00000000000..f0c4539b94e --- /dev/null +++ b/reactos/w32api/include/pshpack8.h @@ -0,0 +1,3 @@ +#ifndef RC_INVOKED +#pragma pack(push,8) +#endif diff --git a/reactos/w32api/include/rapi.h b/reactos/w32api/include/rapi.h new file mode 100644 index 00000000000..4cf6515b488 --- /dev/null +++ b/reactos/w32api/include/rapi.h @@ -0,0 +1,54 @@ +/* rapi.h - main header file for the RAPI API + + NOTE: This strictly does not belong in the Win32 API since it's + really part of Platform SDK. + +*/ + +#ifndef _RAPI_H +#define _RAPI_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +typedef struct IRAPIStream +{ + struct IRAPIStreamVtbl * lpVtbl; +} IRAPIStream; + +typedef struct IRAPIStreamVtbl IRAPIStreamVtbl; + +typedef enum tagRAPISTREAMFLAG +{ + STREAM_TIMEOUT_READ +} RAPISTREAMFLAG; + +struct IRAPIStreamVtbl +{ + HRESULT (__stdcall * SetRapiStat)( IRAPIStream *, RAPISTREAMFLAG, DWORD); + HRESULT (__stdcall * GetRapiStat)( IRAPIStream *, RAPISTREAMFLAG, DWORD *); +}; + +typedef HRESULT (STDAPICALLTYPE RAPIEXT)(DWORD, BYTE, DWORD, BYTE, IRAPIStream *); + +typedef struct _RAPIINIT +{ + DWORD cbSize; + HANDLE heRapiInit; + HRESULT hrRapiInit; +} RAPIINIT; + +STDAPI CeRapiInit (void); +STDAPI CeRapiInitEx (RAPIINIT*); +STDAPI_(BOOL) CeCreateProcess (LPCWSTR, LPCWSTR, LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES, + BOOL, DWORD, LPVOID, LPWSTR, LPSTARTUPINFO, LPPROCESS_INFORMATION); +STDAPI CeRapiUninit (void); + +STDAPI_(BOOL) CeWriteFile (HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED); +STDAPI_(HANDLE) CeCreateFile (LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE); +STDAPI_(BOOL) CeCreateDirectory (LPCWSTR, LPSECURITY_ATTRIBUTES); +STDAPI_(DWORD) CeGetLastError (void); +STDAPI_(BOOL) CeGetFileTime (HANDLE, LPFILETIME, LPFILETIME, LPFILETIME); +STDAPI_(BOOL) CeCloseHandle (HANDLE); + +#endif /* _RAPI_H */ diff --git a/reactos/w32api/include/ras.h b/reactos/w32api/include/ras.h new file mode 100644 index 00000000000..2799be3b703 --- /dev/null +++ b/reactos/w32api/include/ras.h @@ -0,0 +1,966 @@ +#ifndef _RAS_H +#define _RAS_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifndef _LMCONS_H +#include <lmcons.h> +#endif + +/* TODO +include <basetsd.h> from winnt.h so that this typedef is not necessary +*/ +#ifndef _BASETSD_H +typedef unsigned long ULONG_PTR, *PULONG_PTR; +#endif + +#include <pshpack4.h> + +#define RAS_MaxDeviceType 16 +#define RAS_MaxPhoneNumber 128 +#define RAS_MaxIpAddress 15 +#define RAS_MaxIpxAddress 21 +#define RAS_MaxEntryName 256 +#define RAS_MaxDeviceName 128 +#define RAS_MaxCallbackNumber RAS_MaxPhoneNumber +#define RAS_MaxAreaCode 10 +#define RAS_MaxPadType 32 +#define RAS_MaxX25Address 200 +#define RAS_MaxFacilities 200 +#define RAS_MaxUserData 200 +#define RAS_MaxReplyMessage 1024 +#define RDEOPT_UsePrefixSuffix 0x00000001 +#define RDEOPT_PausedStates 0x00000002 +#define RDEOPT_IgnoreModemSpeaker 0x00000004 +#define RDEOPT_SetModemSpeaker 0x00000008 +#define RDEOPT_IgnoreSoftwareCompression 0x00000010 +#define RDEOPT_SetSoftwareCompression 0x00000020 +#define RDEOPT_DisableConnectedUI 0x00000040 +#define RDEOPT_DisableReconnectUI 0x00000080 +#define RDEOPT_DisableReconnect 0x00000100 +#define RDEOPT_NoUser 0x00000200 +#define RDEOPT_PauseOnScript 0x00000400 +#define RDEOPT_Router 0x00000800 +#define REN_User 0x00000000 +#define REN_AllUsers 0x00000001 +#define VS_Default 0 +#define VS_PptpOnly 1 +#define VS_PptpFirst 2 +#define VS_L2tpOnly 3 +#define VS_L2tpFirst 4 +#define RASDIALEVENT "RasDialEvent" +#define WM_RASDIALEVENT 0xCCCD +#define RASEO_UseCountryAndAreaCodes 0x00000001 +#define RASEO_SpecificIpAddr 0x00000002 +#define RASEO_SpecificNameServers 0x00000004 +#define RASEO_IpHeaderCompression 0x00000008 +#define RASEO_RemoteDefaultGateway 0x00000010 +#define RASEO_DisableLcpExtensions 0x00000020 +#define RASEO_TerminalBeforeDial 0x00000040 +#define RASEO_TerminalAfterDial 0x00000080 +#define RASEO_ModemLights 0x00000100 +#define RASEO_SwCompression 0x00000200 +#define RASEO_RequireEncryptedPw 0x00000400 +#define RASEO_RequireMsEncryptedPw 0x00000800 +#define RASEO_RequireDataEncryption 0x00001000 +#define RASEO_NetworkLogon 0x00002000 +#define RASEO_UseLogonCredentials 0x00004000 +#define RASEO_PromoteAlternates 0x00008000 +#define RASNP_NetBEUI 0x00000001 +#define RASNP_Ipx 0x00000002 +#define RASNP_Ip 0x00000004 +#define RASFP_Ppp 0x00000001 +#define RASFP_Slip 0x00000002 +#define RASFP_Ras 0x00000004 +#define RASDT_Modem TEXT("modem") +#define RASDT_Isdn TEXT("isdn") +#define RASDT_X25 TEXT("x25") +#define RASDT_Vpn TEXT("vpn") +#define RASDT_Pad TEXT("pad") +#define RASDT_Generic TEXT("GENERIC") +#define RASDT_Serial TEXT("SERIAL") +#define RASDT_FrameRelay TEXT("FRAMERELAY") +#define RASDT_Atm TEXT("ATM") +#define RASDT_Sonet TEXT("SONET") +#define RASDT_SW56 TEXT("SW56") +#define RASDT_Irda TEXT("IRDA") +#define RASDT_Parallel TEXT("PARALLEL") +#define RASET_Phone 1 +#define RASET_Vpn 2 +#define RASET_Direct 3 +#define RASET_Internet 4 +#if (WINVER >= 0x401) +#define RASEO_SecureLocalFiles 0x00010000 +#define RASCN_Connection 0x00000001 +#define RASCN_Disconnection 0x00000002 +#define RASCN_BandwidthAdded 0x00000004 +#define RASCN_BandwidthRemoved 0x00000008 +#define RASEDM_DialAll 1 +#define RASEDM_DialAsNeeded 2 +#define RASIDS_Disabled 0xffffffff +#define RASIDS_UseGlobalValue 0 +#define RASADFLG_PositionDlg 0x00000001 +#define RASCM_UserName 0x00000001 +#define RASCM_Password 0x00000002 +#define RASCM_Domain 0x00000004 +#define RASADP_DisableConnectionQuery 0 +#define RASADP_LoginSessionDisable 1 +#define RASADP_SavedAddressesLimit 2 +#define RASADP_FailedConnectionTimeout 3 +#define RASADP_ConnectionQueryTimeout 4 +#endif /* (WINVER >= 0x401) */ +#if (WINVER >= 0x500) +#define RDEOPT_CustomDial 0x00001000 +#define RASLCPAP_PAP 0xC023 +#define RASLCPAP_SPAP 0xC027 +#define RASLCPAP_CHAP 0xC223 +#define RASLCPAP_EAP 0xC227 +#define RASLCPAD_CHAP_MD5 0x05 +#define RASLCPAD_CHAP_MS 0x80 +#define RASLCPAD_CHAP_MSV2 0x81 +#define RASLCPO_PFC 0x00000001 +#define RASLCPO_ACFC 0x00000002 +#define RASLCPO_SSHF 0x00000004 +#define RASLCPO_DES_56 0x00000008 +#define RASLCPO_3_DES 0x00000010 +#define RASCCPCA_MPPC 0x00000006 +#define RASCCPCA_STAC 0x00000005 +#define RASCCPO_Compression 0x00000001 +#define RASCCPO_HistoryLess 0x00000002 +#define RASCCPO_Encryption56bit 0x00000010 +#define RASCCPO_Encryption40bit 0x00000020 +#define RASCCPO_Encryption128bit 0x00000040 +#define RASEO_RequireEAP 0x00020000 +#define RASEO_RequirePAP 0x00040000 +#define RASEO_RequireSPAP 0x00080000 +#define RASEO_Custom 0x00100000 +#define RASEO_PreviewPhoneNumber 0x00200000 +#define RASEO_SharedPhoneNumbers 0x00800000 +#define RASEO_PreviewUserPw 0x01000000 +#define RASEO_PreviewDomain 0x02000000 +#define RASEO_ShowDialingProgress 0x04000000 +#define RASEO_RequireCHAP 0x08000000 +#define RASEO_RequireMsCHAP 0x10000000 +#define RASEO_RequireMsCHAP2 0x20000000 +#define RASEO_RequireW95MSCHAP 0x40000000 +#define RASEO_CustomScript 0x80000000 +#define RASIPO_VJ 0x00000001 +#define RCD_SingleUser 0 +#define RCD_AllUsers 0x00000001 +#define RCD_Eap 0x00000002 +#define RASEAPF_NonInteractive 0x00000002 +#define RASEAPF_Logon 0x00000004 +#define RASEAPF_Preview 0x00000008 +#define ET_40Bit 1 +#define ET_128Bit 2 +#define ET_None 0 +#define ET_Require 1 +#define ET_RequireMax 2 +#define ET_Optional 3 +#endif /* (WINVER >= 0x500) */ + +#define RASCS_PAUSED 0x1000 +#define RASCS_DONE 0x2000 +typedef enum tagRASCONNSTATE { + RASCS_OpenPort = 0, + RASCS_PortOpened, + RASCS_ConnectDevice, + RASCS_DeviceConnected, + RASCS_AllDevicesConnected, + RASCS_Authenticate, + RASCS_AuthNotify, + RASCS_AuthRetry, + RASCS_AuthCallback, + RASCS_AuthChangePassword, + RASCS_AuthProject, + RASCS_AuthLinkSpeed, + RASCS_AuthAck, + RASCS_ReAuthenticate, + RASCS_Authenticated, + RASCS_PrepareForCallback, + RASCS_WaitForModemReset, + RASCS_WaitForCallback, + RASCS_Projected, + RASCS_StartAuthentication, + RASCS_CallbackComplete, + RASCS_LogonNetwork, + RASCS_SubEntryConnected, + RASCS_SubEntryDisconnected, + RASCS_Interactive = RASCS_PAUSED, + RASCS_RetryAuthentication, + RASCS_CallbackSetByCaller, + RASCS_PasswordExpired, +#if (WINVER >= 0x500) + RASCS_InvokeEapUI, +#endif + RASCS_Connected = RASCS_DONE, + RASCS_Disconnected +} RASCONNSTATE, *LPRASCONNSTATE; + +typedef enum tagRASPROJECTION { + RASP_Amb = 0x10000, + RASP_PppNbf = 0x803F, + RASP_PppIpx = 0x802B, + RASP_PppIp = 0x8021, +#if (WINVER >= 0x500) + RASP_PppCcp = 0x80FD, +#endif + RASP_PppLcp = 0xC021, + RASP_Slip = 0x20000 +} RASPROJECTION, *LPRASPROJECTION; + +DECLARE_HANDLE (HRASCONN); +typedef HRASCONN* LPHRASCONN; + +typedef struct tagRASCONNW { + DWORD dwSize; + HRASCONN hrasconn; + WCHAR szEntryName[RAS_MaxEntryName + 1]; +#if (WINVER >= 0x400) + WCHAR szDeviceType[RAS_MaxDeviceType + 1]; + WCHAR szDeviceName[RAS_MaxDeviceName + 1]; +#endif +#if (WINVER >= 0x401) + WCHAR szPhonebook[MAX_PATH]; + DWORD dwSubEntry; +#endif +#if (WINVER >= 0x500) + GUID guidEntry; +#endif +#if (WINVER >= 0x501) + DWORD dwSessionId; + DWORD dwFlags; + LUID luid; +#endif +} RASCONNW, *LPRASCONNW; + +typedef struct tagRASCONNA { + DWORD dwSize; + HRASCONN hrasconn; + CHAR szEntryName[RAS_MaxEntryName + 1]; +#if (WINVER >= 0x400) + CHAR szDeviceType[RAS_MaxDeviceType + 1]; + CHAR szDeviceName[RAS_MaxDeviceName + 1]; +#endif +#if (WINVER >= 0x401) + CHAR szPhonebook[MAX_PATH]; + DWORD dwSubEntry; +#endif +#if (WINVER >= 0x500) + GUID guidEntry; +#endif +#if (WINVER >= 0x501) + DWORD dwSessionId; + DWORD dwFlags; + LUID luid; +#endif +} RASCONNA, *LPRASCONNA; + +typedef struct tagRASCONNSTATUSW { + DWORD dwSize; + RASCONNSTATE rasconnstate; + DWORD dwError; + WCHAR szDeviceType[RAS_MaxDeviceType + 1]; + WCHAR szDeviceName[RAS_MaxDeviceName + 1]; +#if (WINVER >= 0x401) + WCHAR szPhoneNumber[RAS_MaxPhoneNumber + 1]; +#endif +} RASCONNSTATUSW, *LPRASCONNSTATUSW; + +typedef struct tagRASCONNSTATUSA { + DWORD dwSize; + RASCONNSTATE rasconnstate; + DWORD dwError; + CHAR szDeviceType[RAS_MaxDeviceType + 1]; + CHAR szDeviceName[RAS_MaxDeviceName + 1]; +#if (WINVER >= 0x401) + CHAR szPhoneNumber[RAS_MaxPhoneNumber + 1]; +#endif +} RASCONNSTATUSA, *LPRASCONNSTATUSA; + +typedef struct tagRASDIALPARAMSW { + DWORD dwSize; + WCHAR szEntryName[RAS_MaxEntryName + 1]; + WCHAR szPhoneNumber[RAS_MaxPhoneNumber + 1]; + WCHAR szCallbackNumber[RAS_MaxCallbackNumber + 1]; + WCHAR szUserName[UNLEN + 1]; + WCHAR szPassword[PWLEN + 1]; + WCHAR szDomain[DNLEN + 1]; +#if (WINVER >= 0x401) + DWORD dwSubEntry; + ULONG_PTR dwCallbackId; +#endif +} RASDIALPARAMSW, *LPRASDIALPARAMSW; + +typedef struct tagRASDIALPARAMSA { + DWORD dwSize; + CHAR szEntryName[RAS_MaxEntryName + 1]; + CHAR szPhoneNumber[RAS_MaxPhoneNumber + 1]; + CHAR szCallbackNumber[RAS_MaxCallbackNumber + 1]; + CHAR szUserName[UNLEN + 1]; + CHAR szPassword[PWLEN + 1]; + CHAR szDomain[DNLEN + 1]; +#if (WINVER >= 0x401) + DWORD dwSubEntry; + ULONG_PTR dwCallbackId; +#endif +} RASDIALPARAMSA, *LPRASDIALPARAMSA; + +#if (WINVER >= 0x500) +typedef struct tagRASEAPINFO { + DWORD dwSizeofEapInfo; + BYTE *pbEapInfo; +} RASEAPINFO; +#endif + +typedef struct tagRASDIALEXTENSIONS { + DWORD dwSize; + DWORD dwfOptions; + HWND hwndParent; + ULONG_PTR reserved; +#if (WINVER >= 0x500) + ULONG_PTR reserved1; + RASEAPINFO RasEapInfo; +#endif +} RASDIALEXTENSIONS, *LPRASDIALEXTENSIONS; + +typedef struct tagRASENTRYNAMEW { + DWORD dwSize; + WCHAR szEntryName[RAS_MaxEntryName + 1]; +#if (WINVER >= 0x500) + DWORD dwFlags; + WCHAR szPhonebookPath[MAX_PATH + 1]; +#endif +} RASENTRYNAMEW, *LPRASENTRYNAMEW; + +typedef struct tagRASENTRYNAMEA { + DWORD dwSize; + CHAR szEntryName[RAS_MaxEntryName + 1]; +#if (WINVER >= 0x500) + DWORD dwFlags; + CHAR szPhonebookPath[MAX_PATH + 1]; +#endif +} RASENTRYNAMEA, *LPRASENTRYNAMEA; + +typedef struct tagRASAMBW { + DWORD dwSize; + DWORD dwError; + WCHAR szNetBiosError[NETBIOS_NAME_LEN + 1]; + BYTE bLana; +} RASAMBW, *LPRASAMBW; + +typedef struct tagRASAMBA { + DWORD dwSize; + DWORD dwError; + CHAR szNetBiosError[NETBIOS_NAME_LEN + 1]; + BYTE bLana; +} RASAMBA, *LPRASAMBA; + +typedef struct tagRASPPPNBFW { + DWORD dwSize; + DWORD dwError; + DWORD dwNetBiosError; + WCHAR szNetBiosError[NETBIOS_NAME_LEN + 1]; + WCHAR szWorkstationName[NETBIOS_NAME_LEN + 1]; + BYTE bLana; +} RASPPPNBFW, *LPRASPPPNBFW; + +typedef struct tagRASPPPNBFA { + DWORD dwSize; + DWORD dwError; + DWORD dwNetBiosError; + CHAR szNetBiosError[NETBIOS_NAME_LEN + 1]; + CHAR szWorkstationName[NETBIOS_NAME_LEN + 1]; + BYTE bLana; +} RASPPPNBFA, *LPRASPPPNBFA; + +typedef struct tagRASIPXW { + DWORD dwSize; + DWORD dwError; + WCHAR szIpxAddress[RAS_MaxIpxAddress + 1]; +} RASPPPIPXW, *LPRASPPPIPXW; + +typedef struct tagRASIPXA { + DWORD dwSize; + DWORD dwError; + CHAR szIpxAddress[RAS_MaxIpxAddress + 1]; +} RASPPPIPXA, *LPRASPPPIPXA; + +typedef struct tagRASPPPIPW { + DWORD dwSize; + DWORD dwError; + WCHAR szIpAddress[RAS_MaxIpAddress + 1]; +#ifndef WINNT35COMPATIBLE + WCHAR szServerIpAddress[RAS_MaxIpAddress + 1]; +#endif +#if (WINVER >= 0x500) + DWORD dwOptions; + DWORD dwServerOptions; +#endif +} RASPPPIPW, *LPRASPPPIPW; + +typedef struct tagRASPPPIPA { + DWORD dwSize; + DWORD dwError; + CHAR szIpAddress[RAS_MaxIpAddress + 1]; +#ifndef WINNT35COMPATIBLE + CHAR szServerIpAddress[RAS_MaxIpAddress + 1]; +#endif +#if (WINVER >= 0x500) + DWORD dwOptions; + DWORD dwServerOptions; +#endif +} RASPPPIPA, *LPRASPPPIPA; + +typedef struct tagRASPPPLCPW { + DWORD dwSize; + BOOL fBundled; +#if (WINVER >= 0x500) + DWORD dwError; + DWORD dwAuthenticationProtocol; + DWORD dwAuthenticationData; + DWORD dwEapTypeId; + DWORD dwServerAuthenticationProtocol; + DWORD dwServerAuthenticationData; + DWORD dwServerEapTypeId; + BOOL fMultilink; + DWORD dwTerminateReason; + DWORD dwServerTerminateReason; + WCHAR szReplyMessage[RAS_MaxReplyMessage]; + DWORD dwOptions; + DWORD dwServerOptions; +#endif +} RASPPPLCPW, *LPRASPPPLCPW; + +typedef struct tagRASPPPLCPA { + DWORD dwSize; + BOOL fBundled; +#if (WINVER >= 0x500) + DWORD dwError; + DWORD dwAuthenticationProtocol; + DWORD dwAuthenticationData; + DWORD dwEapTypeId; + DWORD dwServerAuthenticationProtocol; + DWORD dwServerAuthenticationData; + DWORD dwServerEapTypeId; + BOOL fMultilink; + DWORD dwTerminateReason; + DWORD dwServerTerminateReason; + CHAR szReplyMessage[RAS_MaxReplyMessage]; + DWORD dwOptions; + DWORD dwServerOptions; +#endif +} RASPPPLCPA, *LPRASPPPLCPA; + +typedef struct tagRASSLIPW { + DWORD dwSize; + DWORD dwError; + WCHAR szIpAddress[RAS_MaxIpAddress + 1]; +} RASSLIPW, *LPRASSLIPW; + + +typedef struct tagRASSLIPA { + DWORD dwSize; + DWORD dwError; + CHAR szIpAddress[RAS_MaxIpAddress + 1]; +} RASSLIPA, *LPRASSLIPA; + +typedef struct tagRASDEVINFOW { + DWORD dwSize; + WCHAR szDeviceType[RAS_MaxDeviceType + 1]; + WCHAR szDeviceName[RAS_MaxDeviceName + 1]; +} RASDEVINFOW, *LPRASDEVINFOW; + +typedef struct tagRASDEVINFOA { + DWORD dwSize; + CHAR szDeviceType[RAS_MaxDeviceType + 1]; + CHAR szDeviceName[RAS_MaxDeviceName + 1]; +} RASDEVINFOA, *LPRASDEVINFOA; + +typedef struct tagRASCTRYINFO { + DWORD dwSize; + DWORD dwCountryID; + DWORD dwNextCountryID; + DWORD dwCountryCode; + DWORD dwCountryNameOffset; +} RASCTRYINFO, *LPRASCTRYINFO; + +typedef RASCTRYINFO RASCTRYINFOW, *LPRASCTRYINFOW; +typedef RASCTRYINFO RASCTRYINFOA, *LPRASCTRYINFOA; + +typedef struct tagRASIPADDR { + BYTE a; + BYTE b; + BYTE c; + BYTE d; +} RASIPADDR; + +typedef struct tagRASENTRYW { + DWORD dwSize; + DWORD dwfOptions; + DWORD dwCountryID; + DWORD dwCountryCode; + WCHAR szAreaCode[RAS_MaxAreaCode + 1]; + WCHAR szLocalPhoneNumber[RAS_MaxPhoneNumber + 1]; + DWORD dwAlternateOffset; + RASIPADDR ipaddr; + RASIPADDR ipaddrDns; + RASIPADDR ipaddrDnsAlt; + RASIPADDR ipaddrWins; + RASIPADDR ipaddrWinsAlt; + DWORD dwFrameSize; + DWORD dwfNetProtocols; + DWORD dwFramingProtocol; + WCHAR szScript[MAX_PATH]; + WCHAR szAutodialDll[MAX_PATH]; + WCHAR szAutodialFunc[MAX_PATH]; + WCHAR szDeviceType[RAS_MaxDeviceType + 1]; + WCHAR szDeviceName[RAS_MaxDeviceName + 1]; + WCHAR szX25PadType[RAS_MaxPadType + 1]; + WCHAR szX25Address[RAS_MaxX25Address + 1]; + WCHAR szX25Facilities[RAS_MaxFacilities + 1]; + WCHAR szX25UserData[RAS_MaxUserData + 1]; + DWORD dwChannels; + DWORD dwReserved1; + DWORD dwReserved2; +#if (WINVER >= 0x401) + DWORD dwSubEntries; + DWORD dwDialMode; + DWORD dwDialExtraPercent; + DWORD dwDialExtraSampleSeconds; + DWORD dwHangUpExtraPercent; + DWORD dwHangUpExtraSampleSeconds; + DWORD dwIdleDisconnectSeconds; +#endif +#if (WINVER >= 0x500) + DWORD dwType; + DWORD dwEncryptionType; + DWORD dwCustomAuthKey; + GUID guidId; + WCHAR szCustomDialDll[MAX_PATH]; + DWORD dwVpnStrategy; +#endif +} RASENTRYW, *LPRASENTRYW; + +typedef struct tagRASENTRYA { + DWORD dwSize; + DWORD dwfOptions; + DWORD dwCountryID; + DWORD dwCountryCode; + CHAR szAreaCode[RAS_MaxAreaCode + 1]; + CHAR szLocalPhoneNumber[RAS_MaxPhoneNumber + 1]; + DWORD dwAlternateOffset; + RASIPADDR ipaddr; + RASIPADDR ipaddrDns; + RASIPADDR ipaddrDnsAlt; + RASIPADDR ipaddrWins; + RASIPADDR ipaddrWinsAlt; + DWORD dwFrameSize; + DWORD dwfNetProtocols; + DWORD dwFramingProtocol; + CHAR szScript[MAX_PATH]; + CHAR szAutodialDll[MAX_PATH]; + CHAR szAutodialFunc[MAX_PATH]; + CHAR szDeviceType[RAS_MaxDeviceType + 1]; + CHAR szDeviceName[RAS_MaxDeviceName + 1]; + CHAR szX25PadType[RAS_MaxPadType + 1]; + CHAR szX25Address[RAS_MaxX25Address + 1]; + CHAR szX25Facilities[RAS_MaxFacilities + 1]; + CHAR szX25UserData[RAS_MaxUserData + 1]; + DWORD dwChannels; + DWORD dwReserved1; + DWORD dwReserved2; +#if (WINVER >= 0x401) + DWORD dwSubEntries; + DWORD dwDialMode; + DWORD dwDialExtraPercent; + DWORD dwDialExtraSampleSeconds; + DWORD dwHangUpExtraPercent; + DWORD dwHangUpExtraSampleSeconds; + DWORD dwIdleDisconnectSeconds; +#endif +#if (WINVER >= 0x500) + DWORD dwType; + DWORD dwEncryptionType; + DWORD dwCustomAuthKey; + GUID guidId; + CHAR szCustomDialDll[MAX_PATH]; + DWORD dwVpnStrategy; +#endif +} RASENTRYA, *LPRASENTRYA; + + +#if (WINVER >= 0x401) +typedef struct tagRASADPARAMS { + DWORD dwSize; + HWND hwndOwner; + DWORD dwFlags; + LONG xDlg; + LONG yDlg; +} RASADPARAMS, *LPRASADPARAMS; + +typedef struct tagRASSUBENTRYW { + DWORD dwSize; + DWORD dwfFlags; + WCHAR szDeviceType[RAS_MaxDeviceType + 1]; + WCHAR szDeviceName[RAS_MaxDeviceName + 1]; + WCHAR szLocalPhoneNumber[RAS_MaxPhoneNumber + 1]; + DWORD dwAlternateOffset; +} RASSUBENTRYW, *LPRASSUBENTRYW; + +typedef struct tagRASSUBENTRYA { + DWORD dwSize; + DWORD dwfFlags; + CHAR szDeviceType[RAS_MaxDeviceType + 1]; + CHAR szDeviceName[RAS_MaxDeviceName + 1]; + CHAR szLocalPhoneNumber[RAS_MaxPhoneNumber + 1]; + DWORD dwAlternateOffset; +} RASSUBENTRYA, *LPRASSUBENTRYA; + +typedef struct tagRASCREDENTIALSW { + DWORD dwSize; + DWORD dwMask; + WCHAR szUserName[UNLEN + 1]; + WCHAR szPassword[PWLEN + 1]; + WCHAR szDomain[DNLEN + 1]; +} RASCREDENTIALSW, *LPRASCREDENTIALSW; + +typedef struct tagRASCREDENTIALSA { + DWORD dwSize; + DWORD dwMask; + CHAR szUserName[UNLEN + 1]; + CHAR szPassword[PWLEN + 1]; + CHAR szDomain[DNLEN + 1]; +} RASCREDENTIALSA, *LPRASCREDENTIALSA; + +typedef struct tagRASAUTODIALENTRYW { + DWORD dwSize; + DWORD dwFlags; + DWORD dwDialingLocation; + WCHAR szEntry[RAS_MaxEntryName + 1]; +} RASAUTODIALENTRYW, *LPRASAUTODIALENTRYW; + +typedef struct tagRASAUTODIALENTRYA { + DWORD dwSize; + DWORD dwFlags; + DWORD dwDialingLocation; + CHAR szEntry[RAS_MaxEntryName + 1]; +} RASAUTODIALENTRYA, *LPRASAUTODIALENTRYA; +#endif /* (WINVER >= 0x401) */ + +#if (WINVER >= 0x500) +typedef struct tagRASPPPCCP { + DWORD dwSize; + DWORD dwError; + DWORD dwCompressionAlgorithm; + DWORD dwOptions; + DWORD dwServerCompressionAlgorithm; + DWORD dwServerOptions; +} RASPPPCCP, *LPRASPPPCCP; + +typedef struct tagRASEAPUSERIDENTITYW { + WCHAR szUserName[UNLEN + 1]; + DWORD dwSizeofEapInfo; + BYTE pbEapInfo[1]; +} RASEAPUSERIDENTITYW, *LPRASEAPUSERIDENTITYW; + +typedef struct tagRASEAPUSERIDENTITYA { + CHAR szUserName[UNLEN + 1]; + DWORD dwSizeofEapInfo; + BYTE pbEapInfo[1]; +} RASEAPUSERIDENTITYA, *LPRASEAPUSERIDENTITYA; + +typedef struct tagRAS_STATS { + DWORD dwSize; + DWORD dwBytesXmited; + DWORD dwBytesRcved; + DWORD dwFramesXmited; + DWORD dwFramesRcved; + DWORD dwCrcErr; + DWORD dwTimeoutErr; + DWORD dwAlignmentErr; + DWORD dwHardwareOverrunErr; + DWORD dwFramingErr; + DWORD dwBufferOverrunErr; + DWORD dwCompressionRatioIn; + DWORD dwCompressionRatioOut; + DWORD dwBps; + DWORD dwConnectDuration; +} RAS_STATS, *PRAS_STATS; +#endif /* (WINVER >= 0x500) */ + + +/* UNICODE typedefs for structures*/ +#ifdef UNICODE +typedef RASCONNW RASCONN, *LPRASCONN; +typedef RASENTRYW RASENTRY, *LPRASENTRY; +typedef RASCONNSTATUSW RASCONNSTATUS, *LPRASCONNSTATUS; +typedef RASDIALPARAMSW RASDIALPARAMS, *LPRASDIALPARAMS; +typedef RASAMBW RASAMB, *LPRASAM; +typedef RASPPPNBFW RASPPPNBF, *LPRASPPPNBF; +typedef RASPPPIPXW RASPPPIPX, *LPRASPPPIPX; +typedef RASPPPIPW RASPPPIP, *LPRASPPPIP; +typedef RASPPPLCPW RASPPPLCP, *LPRASPPPLCP; +typedef RASSLIPW RASSLIP, *LPRASSLIP; +typedef RASDEVINFOW RASDEVINFO, *LPRASDEVINFO; +typedef RASENTRYNAMEW RASENTRYNAME, *LPRASENTRYNAME; + +#if (WINVER >= 0x401) +typedef RASSUBENTRYW RASSUBENTRY, *LPRASSUBENTRY; +typedef RASCREDENTIALSW RASCREDENTIALS, *LPRASCREDENTIALS; +typedef RASAUTODIALENTRYW RASAUTODIALENTRY, *LPRASAUTODIALENTRY; +#endif /* (WINVER >= 0x401) */ + +#if (WINVER >= 0x500) +typedef RASEAPUSERIDENTITYW RASEAPUSERIDENTITY, *LPRASEAPUSERIDENTITY; +#endif /* (WINVER >= 0x500) */ + +#else /* ! defined UNICODE */ +typedef RASCONNA RASCONN, *LPRASCONN; +typedef RASENTRYA RASENTRY, *LPRASENTRY; +typedef RASCONNSTATUSA RASCONNSTATUS, *LPRASCONNSTATUS; +typedef RASDIALPARAMSA RASDIALPARAMS, *LPRASDIALPARAMS; +typedef RASAMBA RASAMB, *LPRASAM; +typedef RASPPPNBFA RASPPPNBF, *LPRASPPPNBF; +typedef RASPPPIPXA RASPPPIPX, *LPRASPPPIPX; +typedef RASPPPIPA RASPPPIP, *LPRASPPPIP; +typedef RASPPPLCPA RASPPPLCP, *LPRASPPPLCP; +typedef RASSLIPA RASSLIP, *LPRASSLIP; +typedef RASDEVINFOA RASDEVINFO, *LPRASDEVINFO; +typedef RASENTRYNAMEA RASENTRYNAME, *LPRASENTRYNAME; + +#if (WINVER >= 0x401) +typedef RASSUBENTRYA RASSUBENTRY, *LPRASSUBENTRY; +typedef RASCREDENTIALSA RASCREDENTIALS, *LPRASCREDENTIALS; +typedef RASAUTODIALENTRYA RASAUTODIALENTRY, *LPRASAUTODIALENTRY; +#endif /*(WINVER >= 0x401)*/ +#if (WINVER >= 0x500) +typedef RASEAPUSERIDENTITYA RASEAPUSERIDENTITY, *LPRASEAPUSERIDENTITY; +#endif /* (WINVER >= 0x500) */ +#endif /* ! UNICODE */ + +/* Callback prototypes */ +typedef BOOL (WINAPI * ORASADFUNC) (HWND, LPSTR, DWORD, LPDWORD); /* deprecated */ +typedef VOID (WINAPI * RASDIALFUNC) (UINT, RASCONNSTATE, DWORD); +typedef VOID (WINAPI * RASDIALFUNC1) (HRASCONN, UINT, RASCONNSTATE, DWORD, + DWORD); +typedef DWORD (WINAPI * RASDIALFUNC2) (ULONG_PTR, DWORD, HRASCONN, UINT, + RASCONNSTATE, DWORD, DWORD); + +/* External functions */ +DWORD APIENTRY RasDialA (LPRASDIALEXTENSIONS, LPCSTR, LPRASDIALPARAMSA, + DWORD, LPVOID, LPHRASCONN); +DWORD APIENTRY RasDialW (LPRASDIALEXTENSIONS, LPCWSTR, LPRASDIALPARAMSW, + DWORD, LPVOID, LPHRASCONN); +DWORD APIENTRY RasEnumConnectionsA (LPRASCONNA, LPDWORD, LPDWORD); +DWORD APIENTRY RasEnumConnectionsW (LPRASCONNW, LPDWORD, LPDWORD); +DWORD APIENTRY RasEnumEntriesA (LPCSTR, LPCSTR, LPRASENTRYNAMEA, LPDWORD, + LPDWORD); +DWORD APIENTRY RasEnumEntriesW (LPCWSTR, LPCWSTR, LPRASENTRYNAMEW, LPDWORD, + LPDWORD); +DWORD APIENTRY RasGetConnectStatusA (HRASCONN, LPRASCONNSTATUSA); +DWORD APIENTRY RasGetConnectStatusW (HRASCONN, LPRASCONNSTATUSW); +DWORD APIENTRY RasGetErrorStringA (UINT, LPSTR, DWORD); +DWORD APIENTRY RasGetErrorStringW (UINT, LPWSTR, DWORD); +DWORD APIENTRY RasHangUpA (HRASCONN); +DWORD APIENTRY RasHangUpW (HRASCONN); +DWORD APIENTRY RasGetProjectionInfoA (HRASCONN, RASPROJECTION, LPVOID, + LPDWORD); +DWORD APIENTRY RasGetProjectionInfoW (HRASCONN, RASPROJECTION, LPVOID, + LPDWORD); +DWORD APIENTRY RasCreatePhonebookEntryA (HWND, LPCSTR); +DWORD APIENTRY RasCreatePhonebookEntryW (HWND, LPCWSTR); +DWORD APIENTRY RasEditPhonebookEntryA (HWND, LPCSTR, LPCSTR); +DWORD APIENTRY RasEditPhonebookEntryW (HWND, LPCWSTR, LPCWSTR); +DWORD APIENTRY RasSetEntryDialParamsA (LPCSTR, LPRASDIALPARAMSA, BOOL); +DWORD APIENTRY RasSetEntryDialParamsW (LPCWSTR, LPRASDIALPARAMSW, BOOL); +DWORD APIENTRY RasGetEntryDialParamsA (LPCSTR, LPRASDIALPARAMSA, LPBOOL); +DWORD APIENTRY RasGetEntryDialParamsW (LPCWSTR, LPRASDIALPARAMSW, LPBOOL); +DWORD APIENTRY RasEnumDevicesA (LPRASDEVINFOA, LPDWORD, LPDWORD); +DWORD APIENTRY RasEnumDevicesW (LPRASDEVINFOW, LPDWORD, LPDWORD); +DWORD APIENTRY RasGetCountryInfoA (LPRASCTRYINFOA, LPDWORD); +DWORD APIENTRY RasGetCountryInfoW (LPRASCTRYINFOW, LPDWORD); +DWORD APIENTRY RasGetEntryPropertiesA (LPCSTR, LPCSTR, LPRASENTRYA, LPDWORD, + LPBYTE, LPDWORD); +DWORD APIENTRY RasGetEntryPropertiesW (LPCWSTR, LPCWSTR, LPRASENTRYW, + LPDWORD, LPBYTE, LPDWORD); +DWORD APIENTRY RasSetEntryPropertiesA (LPCSTR, LPCSTR, LPRASENTRYA, DWORD, + LPBYTE, DWORD); +DWORD APIENTRY RasSetEntryPropertiesW (LPCWSTR, LPCWSTR, LPRASENTRYW, DWORD, + LPBYTE, DWORD); +DWORD APIENTRY RasRenameEntryA (LPCSTR, LPCSTR, LPCSTR); +DWORD APIENTRY RasRenameEntryW (LPCWSTR, LPCWSTR, LPCWSTR); +DWORD APIENTRY RasDeleteEntryA (LPCSTR, LPCSTR); +DWORD APIENTRY RasDeleteEntryW (LPCWSTR, LPCWSTR); +DWORD APIENTRY RasValidateEntryNameA (LPCSTR, LPCSTR); +DWORD APIENTRY RasValidateEntryNameW (LPCWSTR, LPCWSTR); + +#if (WINVER >= 0x401) +typedef BOOL (WINAPI * RASADFUNCA) (LPSTR, LPSTR, LPRASADPARAMS, LPDWORD); +typedef BOOL (WINAPI * RASADFUNCW) (LPWSTR, LPWSTR, LPRASADPARAMS, LPDWORD); + +DWORD APIENTRY RasGetSubEntryHandleA (HRASCONN, DWORD, LPHRASCONN); +DWORD APIENTRY RasGetSubEntryHandleW (HRASCONN, DWORD, LPHRASCONN); +DWORD APIENTRY RasGetCredentialsA (LPCSTR, LPCSTR, LPRASCREDENTIALSA); +DWORD APIENTRY RasGetCredentialsW (LPCWSTR, LPCWSTR, LPRASCREDENTIALSW); +DWORD APIENTRY RasSetCredentialsA (LPCSTR, LPCSTR, LPRASCREDENTIALSA, BOOL); +DWORD APIENTRY RasSetCredentialsW (LPCWSTR, LPCWSTR, LPRASCREDENTIALSW, BOOL); +DWORD APIENTRY RasConnectionNotificationA (HRASCONN, HANDLE, DWORD); +DWORD APIENTRY RasConnectionNotificationW (HRASCONN, HANDLE, DWORD); +DWORD APIENTRY RasGetSubEntryPropertiesA (LPCSTR, LPCSTR, DWORD, + LPRASSUBENTRYA, LPDWORD, LPBYTE, LPDWORD); +DWORD APIENTRY RasGetSubEntryPropertiesW (LPCWSTR, LPCWSTR, DWORD, + LPRASSUBENTRYW, LPDWORD, LPBYTE, LPDWORD); +DWORD APIENTRY RasSetSubEntryPropertiesA (LPCSTR, LPCSTR, DWORD, + LPRASSUBENTRYA, DWORD, LPBYTE, DWORD); +DWORD APIENTRY RasSetSubEntryPropertiesW (LPCWSTR, LPCWSTR, DWORD, + LPRASSUBENTRYW, DWORD, LPBYTE, DWORD); +DWORD APIENTRY RasGetAutodialAddressA (LPCSTR, LPDWORD, LPRASAUTODIALENTRYA, + LPDWORD, LPDWORD); +DWORD APIENTRY RasGetAutodialAddressW (LPCWSTR, LPDWORD, + LPRASAUTODIALENTRYW, LPDWORD, LPDWORD); +DWORD APIENTRY RasSetAutodialAddressA (LPCSTR, DWORD, LPRASAUTODIALENTRYA, + DWORD, DWORD); +DWORD APIENTRY RasSetAutodialAddressW (LPCWSTR, DWORD, LPRASAUTODIALENTRYW, + DWORD, DWORD); +DWORD APIENTRY RasEnumAutodialAddressesA (LPSTR *, LPDWORD, LPDWORD); +DWORD APIENTRY RasEnumAutodialAddressesW (LPWSTR *, LPDWORD, LPDWORD); +DWORD APIENTRY RasGetAutodialEnableA (DWORD, LPBOOL); +DWORD APIENTRY RasGetAutodialEnableW (DWORD, LPBOOL); +DWORD APIENTRY RasSetAutodialEnableA (DWORD, BOOL); +DWORD APIENTRY RasSetAutodialEnableW (DWORD, BOOL); +DWORD APIENTRY RasGetAutodialParamA (DWORD, LPVOID, LPDWORD); +DWORD APIENTRY RasGetAutodialParamW (DWORD, LPVOID, LPDWORD); +DWORD APIENTRY RasSetAutodialParamA (DWORD, LPVOID, DWORD); +DWORD APIENTRY RasSetAutodialParamW (DWORD, LPVOID, DWORD); +#endif + +#if (WINVER >= 0x500) +typedef DWORD (WINAPI * RasCustomHangUpFn) (HRASCONN); +typedef DWORD (WINAPI * RasCustomDeleteEntryNotifyFn) (LPCTSTR, LPCTSTR, DWORD); +typedef DWORD (WINAPI * RasCustomDialFn) (HINSTANCE, LPRASDIALEXTENSIONS, + LPCTSTR, LPRASDIALPARAMS, DWORD, LPVOID, LPHRASCONN, DWORD); + +DWORD APIENTRY RasInvokeEapUI (HRASCONN, DWORD, LPRASDIALEXTENSIONS, HWND); +DWORD APIENTRY RasGetLinkStatistics (HRASCONN, DWORD, RAS_STATS*); +DWORD APIENTRY RasGetConnectionStatistics (HRASCONN, RAS_STATS*); +DWORD APIENTRY RasClearLinkStatistics (HRASCONN, DWORD); +DWORD APIENTRY RasClearConnectionStatistics (HRASCONN); +DWORD APIENTRY RasGetEapUserDataA (HANDLE, LPCSTR, LPCSTR, BYTE*, DWORD*); +DWORD APIENTRY RasGetEapUserDataW (HANDLE, LPCWSTR, LPCWSTR, BYTE*, DWORD*); +DWORD APIENTRY RasSetEapUserDataA (HANDLE, LPCSTR, LPCSTR, BYTE*, DWORD); +DWORD APIENTRY RasSetEapUserDataW (HANDLE, LPCWSTR, LPCWSTR, BYTE*, DWORD); +DWORD APIENTRY RasGetCustomAuthDataA (LPCSTR, LPCSTR, BYTE*, DWORD*); +DWORD APIENTRY RasGetCustomAuthDataW (LPCWSTR, LPCWSTR, BYTE*, DWORD*); +DWORD APIENTRY RasSetCustomAuthDataA (LPCSTR, LPCSTR, BYTE*, DWORD); +DWORD APIENTRY RasSetCustomAuthDataW (LPCWSTR, LPCWSTR, BYTE*, DWORD); +DWORD APIENTRY RasGetEapUserIdentityW (LPCWSTR, LPCWSTR, DWORD, HWND, LPRASEAPUSERIDENTITYW*); +DWORD APIENTRY RasGetEapUserIdentityA (LPCSTR, LPCSTR, DWORD, HWND, LPRASEAPUSERIDENTITYA*); +VOID APIENTRY RasFreeEapUserIdentityW (LPRASEAPUSERIDENTITYW); +VOID APIENTRY RasFreeEapUserIdentityA (LPRASEAPUSERIDENTITYA); +#endif /* (WINVER >= 0x500) */ + + +/* UNICODE defines for functions */ +#ifdef UNICODE +#define RasDial RasDialW +#define RasEnumConnections RasEnumConnectionsW +#define RasEnumEntries RasEnumEntriesW +#define RasGetConnectStatus RasGetConnectStatusW +#define RasGetErrorString RasGetErrorStringW +#define RasHangUp RasHangUpW +#define RasGetProjectionInfo RasGetProjectionInfoW +#define RasCreatePhonebookEntry RasCreatePhonebookEntryW +#define RasEditPhonebookEntry RasEditPhonebookEntryW +#define RasSetEntryDialParams RasSetEntryDialParamsW +#define RasGetEntryDialParams RasGetEntryDialParamsW +#define RasEnumDevices RasEnumDevicesW +#define RasGetCountryInfo RasGetCountryInfoW +#define RasGetEntryProperties RasGetEntryPropertiesW +#define RasSetEntryProperties RasSetEntryPropertiesW +#define RasRenameEntry RasRenameEntryW +#define RasDeleteEntry RasDeleteEntryW +#define RasValidateEntryName RasValidateEntryNameW +#if (WINVER >= 0x401) +#define RASADFUNC RASADFUNCW +#define RasGetSubEntryHandle RasGetSubEntryHandleW +#define RasConnectionNotification RasConnectionNotificationW +#define RasGetSubEntryProperties RasGetSubEntryPropertiesW +#define RasSetSubEntryProperties RasSetSubEntryPropertiesW +#define RasGetCredentials RasGetCredentialsW +#define RasSetCredentials RasSetCredentialsW +#define RasGetAutodialAddress RasGetAutodialAddressW +#define RasSetAutodialAddress RasSetAutodialAddressW +#define RasEnumAutodialAddresses RasEnumAutodialAddressesW +#define RasGetAutodialEnable RasGetAutodialEnableW +#define RasSetAutodialEnable RasSetAutodialEnableW +#define RasGetAutodialParam RasGetAutodialParamW +#define RasSetAutodialParam RasSetAutodialParamW +#endif /* (WINVER >= 0x401) */ +#if (WINVER >= 0x500) +#define RasGetEapUserData RasGetEapUserDataW +#define RasSetEapUserData RasSetEapUserDataW +#define RasGetCustomAuthData RasGetCustomAuthDataW +#define RasSetCustomAuthData RasSetCustomAuthDataW +#define RasGetEapUserIdentity RasGetEapUserIdentityW +#define RasFreeEapUserIdentity RasFreeEapUserIdentityW +#endif /* (WINVER >= 0x500) */ + +#else /* ! defined UNICODE */ +#define RasDial RasDialA +#define RasEnumConnections RasEnumConnectionsA +#define RasEnumEntries RasEnumEntriesA +#define RasGetConnectStatus RasGetConnectStatusA +#define RasGetErrorString RasGetErrorStringA +#define RasHangUp RasHangUpA +#define RasGetProjectionInfo RasGetProjectionInfoA +#define RasCreatePhonebookEntry RasCreatePhonebookEntryA +#define RasEditPhonebookEntry RasEditPhonebookEntryA +#define RasSetEntryDialParams RasSetEntryDialParamsA +#define RasGetEntryDialParams RasGetEntryDialParamsA +#define RasEnumDevices RasEnumDevicesA +#define RasGetCountryInfo RasGetCountryInfoA +#define RasGetEntryProperties RasGetEntryPropertiesA +#define RasSetEntryProperties RasSetEntryPropertiesA +#define RasRenameEntry RasRenameEntryA +#define RasDeleteEntry RasDeleteEntryA +#define RasValidateEntryName RasValidateEntryNameA + +#if (WINVER >= 0x401) +#define RASADFUNC RASADFUNCA +#define RasGetSubEntryHandle RasGetSubEntryHandleA +#define RasConnectionNotification RasConnectionNotificationA +#define RasGetSubEntryProperties RasGetSubEntryPropertiesA +#define RasSetSubEntryProperties RasSetSubEntryPropertiesA +#define RasGetCredentials RasGetCredentialsA +#define RasSetCredentials RasSetCredentialsA +#define RasGetAutodialAddress RasGetAutodialAddressA +#define RasSetAutodialAddress RasSetAutodialAddressA +#define RasEnumAutodialAddressesRasEnumAutodialAddressesA +#define RasGetAutodialEnable RasGetAutodialEnableA +#define RasSetAutodialEnable RasSetAutodialEnableA +#define RasGetAutodialParam RasGetAutodialParamA +#define RasSetAutodialParam RasSetAutodialParamA +#endif /*(WINVER >= 0x401)*/ + +#if (WINVER >= 0x500) +#define RasGetEapUserData RasGetEapUserDataA +#define RasSetEapUserData RasSetEapUserDataA +#define RasGetCustomAuthData RasGetCustomAuthDataA +#define RasSetCustomAuthData RasSetCustomAuthDataA +#define RasGetEapUserIdentity RasGetEapUserIdentityA +#define RasFreeEapUserIdentity RasFreeEapUserIdentityA +#endif /* (WINVER >= 0x500) */ +#endif /* ! UNICODE */ + +#ifdef __cplusplus +} +#endif +#include <poppack.h> +#endif /* _RAS_H */ diff --git a/reactos/w32api/include/rasdlg.h b/reactos/w32api/include/rasdlg.h new file mode 100644 index 00000000000..b0f4c141703 --- /dev/null +++ b/reactos/w32api/include/rasdlg.h @@ -0,0 +1,148 @@ +#ifndef _RASDLG_H_ +#define _RASDLG_H_ +#ifdef __cplusplus +extern "C" { +#endif + +#include <ras.h> + +#define RASPBDEVENT_AddEntry 1 +#define RASPBDEVENT_EditEntry 2 +#define RASPBDEVENT_RemoveEntry 3 +#define RASPBDEVENT_DialEntry 4 +#define RASPBDEVENT_EditGlobals 5 +#define RASPBDEVENT_NoUser 6 +#define RASPBDEVENT_NoUserEdit 7 + +#define RASPBDFLAG_PositionDlg 1 +#define RASPBDFLAG_ForceCloseOnDial 2 +#define RASPBDFLAG_NoUser 16 + +#define RASEDFLAG_PositionDlg 1 +#define RASEDFLAG_NewEntry 2 +#define RASEDFLAG_CloneEntry 4 + +#define RASDDFLAG_PositionDlg 1 + +#ifndef RC_INVOKED +#include <pshpack4.h> + +typedef struct tagRASENTRYDLGA +{ + DWORD dwSize; + HWND hwndOwner; + DWORD dwFlags; + LONG xDlg; + LONG yDlg; + CHAR szEntry[RAS_MaxEntryName + 1]; + DWORD dwError; + ULONG_PTR reserved; + ULONG_PTR reserved2; +} RASENTRYDLGA, *LPRASENTRYDLGA; +typedef struct tagRASENTRYDLGW +{ + DWORD dwSize; + HWND hwndOwner; + DWORD dwFlags; + LONG xDlg; + LONG yDlg; + WCHAR szEntry[RAS_MaxEntryName + 1]; + DWORD dwError; + ULONG_PTR reserved; + ULONG_PTR reserved2; +} RASENTRYDLGW, *LPRASENTRYDLGW; + +typedef struct tagRASDIALDLG +{ + DWORD dwSize; + HWND hwndOwner; + DWORD dwFlags; + LONG xDlg; + LONG yDlg; + DWORD dwSubEntry; + DWORD dwError; + ULONG_PTR reserved; + ULONG_PTR reserved2; +} RASDIALDLG, *LPRASDIALDLG; + +/* Application-defined callback functions */ +typedef VOID (WINAPI* RASPBDLGFUNCW)(DWORD, DWORD, LPWSTR, LPVOID); +typedef VOID (WINAPI* RASPBDLGFUNCA)(DWORD, DWORD, LPSTR, LPVOID); + +typedef struct tagRASPBDLGA +{ + DWORD dwSize; + HWND hwndOwner; + DWORD dwFlags; + LONG xDlg; + LONG yDlg; + ULONG_PTR dwCallbackId; + RASPBDLGFUNCA pCallback; + DWORD dwError; + ULONG_PTR reserved; + ULONG_PTR reserved2; +} RASPBDLGA, *LPRASPBDLGA; +typedef struct tagRASPBDLGW +{ + DWORD dwSize; + HWND hwndOwner; + DWORD dwFlags; + LONG xDlg; + LONG yDlg; + ULONG_PTR dwCallbackId; + RASPBDLGFUNCW pCallback; + DWORD dwError; + ULONG_PTR reserved; + ULONG_PTR reserved2; +} RASPBDLGW, *LPRASPBDLGW; + +typedef struct tagRASNOUSERA +{ + DWORD dwSize; + DWORD dwFlags; + DWORD dwTimeoutMs; + CHAR szUserName[UNLEN + 1]; + CHAR szPassword[PWLEN + 1]; + CHAR szDomain[DNLEN + 1]; +} RASNOUSERA, *LPRASNOUSERA; +typedef struct tagRASNOUSERW +{ + DWORD dwSize; + DWORD dwFlags; + DWORD dwTimeoutMs; + WCHAR szUserName[UNLEN + 1]; + WCHAR szPassword[PWLEN + 1]; + WCHAR szDomain[DNLEN + 1]; +} RASNOUSERW, *LPRASNOUSERW ; + +#include <poppack.h> + +BOOL APIENTRY RasDialDlgA(LPSTR,LPSTR,LPSTR,LPRASDIALDLG); +BOOL APIENTRY RasDialDlgW(LPWSTR,LPWSTR,LPWSTR,LPRASDIALDLG); +BOOL APIENTRY RasEntryDlgA(LPSTR,LPSTR,LPRASENTRYDLGA); +BOOL APIENTRY RasEntryDlgW(LPWSTR,LPWSTR,LPRASENTRYDLGW); +BOOL APIENTRY RasPhonebookDlgA(LPSTR,LPSTR,LPRASPBDLGA); +BOOL APIENTRY RasPhonebookDlgW(LPWSTR,LPWSTR,LPRASPBDLGW); + +#ifdef UNICODE +typedef RASENTRYDLGW RASENTRYDLG, *LPRASENTRYDLG; +typedef RASPBDLGW RASPBDLG, *LPRASPBDLG; +typedef RASNOUSERW RASNOUSER, *LPRASNOUSER; +#define RasDialDlg RasDialDlgW +#define RasEntryDlg RasEntryDlgW +#define RasPhonebookDlg RasPhonebookDlgW +#else +typedef RASENTRYDLGA RASENTRYDLG, *LPRASENTRYDLG; +typedef RASPBDLGA RASPBDLG, *LPRASPBDLG; +typedef RASNOUSERA RASNOUSER, *LPRASNOUSER; +#define RasDialDlg RasDialDlgA +#define RasEntryDlg RasEntryDlgA +#define RasPhonebookDlg RasPhonebookDlgA +#endif /* UNICODE */ + +#endif /* RC_INVOKED */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/raserror.h b/reactos/w32api/include/raserror.h new file mode 100644 index 00000000000..97498b05967 --- /dev/null +++ b/reactos/w32api/include/raserror.h @@ -0,0 +1,210 @@ +#ifndef _RASERROR_H +#define _RASERROR_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#define RASBASE 600 +#define SUCCESS 0 +#define PENDING (RASBASE+0) +#define ERROR_INVALID_PORT_HANDLE (RASBASE+1) +#define ERROR_PORT_ALREADY_OPEN (RASBASE+2) +#define ERROR_BUFFER_TOO_SMALL (RASBASE+3) +#define ERROR_WRONG_INFO_SPECIFIED (RASBASE+4) +#define ERROR_CANNOT_SET_PORT_INFO (RASBASE+5) +#define ERROR_PORT_NOT_CONNECTED (RASBASE+6) +#define ERROR_EVENT_INVALID (RASBASE+7) +#define ERROR_DEVICE_DOES_NOT_EXIST (RASBASE+8) +#define ERROR_DEVICETYPE_DOES_NOT_EXIST (RASBASE+9) +#define ERROR_BUFFER_INVALID (RASBASE+10) +#define ERROR_ROUTE_NOT_AVAILABLE (RASBASE+11) +#define ERROR_ROUTE_NOT_ALLOCATED (RASBASE+12) +#define ERROR_INVALID_COMPRESSION_SPECIFIED (RASBASE+13) +#define ERROR_OUT_OF_BUFFERS (RASBASE+14) +#define ERROR_PORT_NOT_FOUND (RASBASE+15) +#define ERROR_ASYNC_REQUEST_PENDING (RASBASE+16) +#define ERROR_ALREADY_DISCONNECTING (RASBASE+17) +#define ERROR_PORT_NOT_OPEN (RASBASE+18) +#define ERROR_PORT_DISCONNECTED (RASBASE+19) +#define ERROR_NO_ENDPOINTS (RASBASE+20) +#define ERROR_CANNOT_OPEN_PHONEBOOK (RASBASE+21) +#define ERROR_CANNOT_LOAD_PHONEBOOK (RASBASE+22) +#define ERROR_CANNOT_FIND_PHONEBOOK_ENTRY (RASBASE+23) +#define ERROR_CANNOT_WRITE_PHONEBOOK (RASBASE+24) +#define ERROR_CORRUPT_PHONEBOOK (RASBASE+25) +#define ERROR_CANNOT_LOAD_STRING (RASBASE+26) +#define ERROR_KEY_NOT_FOUND (RASBASE+27) +#define ERROR_DISCONNECTION (RASBASE+28) +#define ERROR_REMOTE_DISCONNECTION (RASBASE+29) +#define ERROR_HARDWARE_FAILURE (RASBASE+30) +#define ERROR_USER_DISCONNECTION (RASBASE+31) +#define ERROR_INVALID_SIZE (RASBASE+32) +#define ERROR_PORT_NOT_AVAILABLE (RASBASE+33) +#define ERROR_CANNOT_PROJECT_CLIENT (RASBASE+34) +#define ERROR_UNKNOWN (RASBASE+35) +#define ERROR_WRONG_DEVICE_ATTACHED (RASBASE+36) +#define ERROR_BAD_STRING (RASBASE+37) +#define ERROR_REQUEST_TIMEOUT (RASBASE+38) +#define ERROR_CANNOT_GET_LANA (RASBASE+39) +#define ERROR_NETBIOS_ERROR (RASBASE+40) +#define ERROR_SERVER_OUT_OF_RESOURCES (RASBASE+41) +#define ERROR_NAME_EXISTS_ON_NET (RASBASE+42) +#define ERROR_SERVER_GENERAL_NET_FAILURE (RASBASE+43) +#define WARNING_MSG_ALIAS_NOT_ADDED (RASBASE+44) +#define ERROR_AUTH_INTERNAL (RASBASE+45) +#define ERROR_RESTRICTED_LOGON_HOURS (RASBASE+46) +#define ERROR_ACCT_DISABLED (RASBASE+47) +#define ERROR_PASSWD_EXPIRED (RASBASE+48) +#define ERROR_NO_DIALIN_PERMISSION (RASBASE+49) +#define ERROR_SERVER_NOT_RESPONDING (RASBASE+50) +#define ERROR_FROM_DEVICE (RASBASE+51) +#define ERROR_UNRECOGNIZED_RESPONSE (RASBASE+52) +#define ERROR_MACRO_NOT_FOUND (RASBASE+53) +#define ERROR_MACRO_NOT_DEFINED (RASBASE+54) +#define ERROR_MESSAGE_MACRO_NOT_FOUND (RASBASE+55) +#define ERROR_DEFAULTOFF_MACRO_NOT_FOUND (RASBASE+56) +#define ERROR_FILE_COULD_NOT_BE_OPENED (RASBASE+57) +#define ERROR_DEVICENAME_TOO_LONG (RASBASE+58) +#define ERROR_DEVICENAME_NOT_FOUND (RASBASE+59) +#define ERROR_NO_RESPONSES (RASBASE+60) +#define ERROR_NO_COMMAND_FOUND (RASBASE+61) +#define ERROR_WRONG_KEY_SPECIFIED (RASBASE+62) +#define ERROR_UNKNOWN_DEVICE_TYPE (RASBASE+63) +#define ERROR_ALLOCATING_MEMORY (RASBASE+64) +#define ERROR_PORT_NOT_CONFIGURED (RASBASE+65) +#define ERROR_DEVICE_NOT_READY (RASBASE+66) +#define ERROR_READING_INI_FILE (RASBASE+67) +#define ERROR_NO_CONNECTION (RASBASE+68) +#define ERROR_BAD_USAGE_IN_INI_FILE (RASBASE+69) +#define ERROR_READING_SECTIONNAME (RASBASE+70) +#define ERROR_READING_DEVICETYPE (RASBASE+71) +#define ERROR_READING_DEVICENAME (RASBASE+72) +#define ERROR_READING_USAGE (RASBASE+73) +#define ERROR_READING_MAXCONNECTBPS (RASBASE+74) +#define ERROR_READING_MAXCARRIERBPS (RASBASE+75) +#define ERROR_LINE_BUSY (RASBASE+76) +#define ERROR_VOICE_ANSWER (RASBASE+77) +#define ERROR_NO_ANSWER (RASBASE+78) +#define ERROR_NO_CARRIER (RASBASE+79) +#define ERROR_NO_DIALTONE (RASBASE+80) +#define ERROR_IN_COMMAND (RASBASE+81) +#define ERROR_WRITING_SECTIONNAME (RASBASE+82) +#define ERROR_WRITING_DEVICETYPE (RASBASE+83) +#define ERROR_WRITING_DEVICENAME (RASBASE+84) +#define ERROR_WRITING_MAXCONNECTBPS (RASBASE+85) +#define ERROR_WRITING_MAXCARRIERBPS (RASBASE+86) +#define ERROR_WRITING_USAGE (RASBASE+87) +#define ERROR_WRITING_DEFAULTOFF (RASBASE+88) +#define ERROR_READING_DEFAULTOFF (RASBASE+89) +#define ERROR_EMPTY_INI_FILE (RASBASE+90) +#define ERROR_AUTHENTICATION_FAILURE (RASBASE+91) +#define ERROR_PORT_OR_DEVICE (RASBASE+92) +#define ERROR_NOT_BINARY_MACRO (RASBASE+93) +#define ERROR_DCB_NOT_FOUND (RASBASE+94) +#define ERROR_STATE_MACHINES_NOT_STARTED (RASBASE+95) +#define ERROR_STATE_MACHINES_ALREADY_STARTED (RASBASE+96) +#define ERROR_PARTIAL_RESPONSE_LOOPING (RASBASE+97) +#define ERROR_UNKNOWN_RESPONSE_KEY (RASBASE+98) +#define ERROR_RECV_BUF_FULL (RASBASE+99) +#define ERROR_CMD_TOO_LONG (RASBASE+100) +#define ERROR_UNSUPPORTED_BPS (RASBASE+101) +#define ERROR_UNEXPECTED_RESPONSE (RASBASE+102) +#define ERROR_INTERACTIVE_MODE (RASBASE+103) +#define ERROR_BAD_CALLBACK_NUMBER (RASBASE+104) +#define ERROR_INVALID_AUTH_STATE (RASBASE+105) +#define ERROR_WRITING_INITBPS (RASBASE+106) +#define ERROR_X25_DIAGNOSTIC (RASBASE+107) +#define ERROR_ACCT_EXPIRED (RASBASE+108) +#define ERROR_CHANGING_PASSWORD (RASBASE+109) +#define ERROR_OVERRUN (RASBASE+110) +#define ERROR_RASMAN_CANNOT_INITIALIZE (RASBASE+111) +#define ERROR_BIPLEX_PORT_NOT_AVAILABLE (RASBASE+112) +#define ERROR_NO_ACTIVE_ISDN_LINES (RASBASE+113) +#define ERROR_NO_ISDN_CHANNELS_AVAILABLE (RASBASE+114) +#define ERROR_TOO_MANY_LINE_ERRORS (RASBASE+115) +#define ERROR_IP_CONFIGURATION (RASBASE+116) +#define ERROR_NO_IP_ADDRESSES (RASBASE+117) +#define ERROR_PPP_TIMEOUT (RASBASE+118) +#define ERROR_PPP_REMOTE_TERMINATED (RASBASE+119) +#define ERROR_PPP_NO_PROTOCOLS_CONFIGURED (RASBASE+120) +#define ERROR_PPP_NO_RESPONSE (RASBASE+121) +#define ERROR_PPP_INVALID_PACKET (RASBASE+122) +#define ERROR_PHONE_NUMBER_TOO_LONG (RASBASE+123) +#define ERROR_IPXCP_NO_DIALOUT_CONFIGURED (RASBASE+124) +#define ERROR_IPXCP_NO_DIALIN_CONFIGURED (RASBASE+125) +#define ERROR_IPXCP_DIALOUT_ALREADY_ACTIVE (RASBASE+126) +#define ERROR_ACCESSING_TCPCFGDLL (RASBASE+127) +#define ERROR_NO_IP_RAS_ADAPTER (RASBASE+128) +#define ERROR_SLIP_REQUIRES_IP (RASBASE+129) +#define ERROR_PROJECTION_NOT_COMPLETE (RASBASE+130) +#define ERROR_PROTOCOL_NOT_CONFIGURED (RASBASE+131) +#define ERROR_PPP_NOT_CONVERGING (RASBASE+132) +#define ERROR_PPP_CP_REJECTED (RASBASE+133) +#define ERROR_PPP_LCP_TERMINATED (RASBASE+134) +#define ERROR_PPP_REQUIRED_ADDRESS_REJECTED (RASBASE+135) +#define ERROR_PPP_NCP_TERMINATED (RASBASE+136) +#define ERROR_PPP_LOOPBACK_DETECTED (RASBASE+137) +#define ERROR_PPP_NO_ADDRESS_ASSIGNED (RASBASE+138) +#define ERROR_CANNOT_USE_LOGON_CREDENTIALS (RASBASE+139) +#define ERROR_TAPI_CONFIGURATION (RASBASE+140) +#define ERROR_NO_LOCAL_ENCRYPTION (RASBASE+141) +#define ERROR_NO_REMOTE_ENCRYPTION (RASBASE+142) +#define ERROR_REMOTE_REQUIRES_ENCRYPTION (RASBASE+143) +#define ERROR_IPXCP_NET_NUMBER_CONFLICT (RASBASE+144) +#define ERROR_INVALID_SMM (RASBASE+145) +#define ERROR_SMM_UNINITIALIZED (RASBASE+146) +#define ERROR_NO_MAC_FOR_PORT (RASBASE+147) +#define ERROR_SMM_TIMEOUT (RASBASE+148) +#define ERROR_BAD_PHONE_NUMBER (RASBASE+149) +#define ERROR_WRONG_MODULE (RASBASE+150) +#define ERROR_INVALID_CALLBACK_NUMBER (RASBASE+151) + +#define ERROR_SCRIPT_SYNTAX (RASBASE+152) +#define ERROR_HANGUP_FAILED (RASBASE+153) +#define ERROR_BUNDLE_NOT_FOUND (RASBASE+154) +#define ERROR_CANNOT_DO_CUSTOMDIAL (RASBASE+155) +#define ERROR_DIAL_ALREADY_IN_PROGRESS (RASBASE+156) +#define ERROR_RASAUTO_CANNOT_INITIALIZE (RASBASE+157) +#define ERROR_CONNECTION_ALREADY_SHARED (RASBASE+158) +#define ERROR_SHARING_CHANGE_FAILED (RASBASE+159) +#define ERROR_SHARING_ROUTER_INSTALL (RASBASE+160) +#define ERROR_SHARE_CONNECTION_FAILED (RASBASE+161) +#define ERROR_SHARING_PRIVATE_INSTALL (RASBASE+162) +#define ERROR_CANNOT_SHARE_CONNECTION (RASBASE+163) +#define ERROR_NO_SMART_CARD_READER (RASBASE+164) +#define ERROR_SHARING_ADDRESS_EXISTS (RASBASE+165) +#define ERROR_NO_CERTIFICATE (RASBASE+166) +#define ERROR_SHARING_MULTIPLE_ADDRESSES (RASBASE+167) +#define ERROR_FAILED_TO_ENCRYPT (RASBASE+168) +#define ERROR_BAD_ADDRESS_SPECIFIED (RASBASE+169) +#define ERROR_CONNECTION_REJECT (RASBASE+170) +#define ERROR_CONGESTION (RASBASE+171) +#define ERROR_INCOMPATIBLE (RASBASE+172) +#define ERROR_NUMBERCHANGED (RASBASE+173) +#define ERROR_TEMPFAILURE (RASBASE+174) +#define ERROR_BLOCKED (RASBASE+175) +#define ERROR_DONOTDISTURB (RASBASE+176) +#define ERROR_OUTOFORDER (RASBASE+177) +#define ERROR_UNABLE_TO_AUTHENTICATE_SERVER (RASBASE+178) +#define ERROR_SMART_CARD_REQUIRED (RASBASE+179) +#define ERROR_INVALID_FUNCTION_FOR_ENTRY (RASBASE+180) +#define ERROR_CERT_FOR_ENCRYPTION_NOT_FOUND (RASBASE+181) +#define ERROR_SHARING_RRAS_CONFLICT (RASBASE+182) +#define ERROR_SHARING_NO_PRIVATE_LAN (RASBASE+183) +#define ERROR_NO_DIFF_USER_AT_LOGON (RASBASE+184) +#define ERROR_NO_REG_CERT_AT_LOGON (RASBASE+185) +#define ERROR_OAKLEY_NO_CERT (RASBASE+186) +#define ERROR_OAKLEY_AUTH_FAIL (RASBASE+187) +#define ERROR_OAKLEY_ATTRIB_FAIL (RASBASE+188) +#define ERROR_OAKLEY_GENERAL_PROCESSING (RASBASE+189) +#define ERROR_OAKLEY_NO_PEER_CERT (RASBASE+190) +#define ERROR_OAKLEY_NO_POLICY (RASBASE+191) +#define ERROR_OAKLEY_TIMED_OUT (RASBASE+192) +#define ERROR_OAKLEY_ERROR (RASBASE+193) +#define ERROR_UNKNOWN_FRAMED_PROTOCOL (RASBASE+194) +#define ERROR_WRONG_TUNNEL_TYPE (RASBASE+195) +#define ERROR_UNKNOWN_SERVICE_TYPE (RASBASE+196) +#define ERROR_CONNECTING_DEVICE_NOT_FOUND (RASBASE+197) +#define ERROR_NO_EAPTLS_CERTIFICATE (RASBASE+198) +#define RASBASEEND (RASBASE+198) +#endif /* _RASERROR_H */ diff --git a/reactos/w32api/include/rassapi.h b/reactos/w32api/include/rassapi.h new file mode 100644 index 00000000000..9ba4afb41eb --- /dev/null +++ b/reactos/w32api/include/rassapi.h @@ -0,0 +1,182 @@ +#ifndef _RASSAPI_H +#define _RASSAPI_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#ifndef UNLEN +#include <lmcons.h> +#endif +#define RASSAPI_MAX_PHONENUMBER_SIZE 128 +#define RASSAPI_MAX_MEDIA_NAME 16 +#define RASSAPI_MAX_PORT_NAME 16 +#define RASSAPI_MAX_DEVICE_NAME 128 +#define RASSAPI_MAX_DEVICETYPE_NAME 16 +#define RASSAPI_MAX_PARAM_KEY_SIZE 32 +#define RASPRIV_NoCallback 0x01 +#define RASPRIV_AdminSetCallback 0x02 +#define RASPRIV_CallerSetCallback 0x04 +#define RASPRIV_DialinPrivilege 0x08 +#define RASPRIV_CallbackType (RASPRIV_AdminSetCallback \ + | RASPRIV_CallerSetCallback \ + | RASPRIV_NoCallback) +#define RAS_MODEM_OPERATIONAL 1 +#define RAS_MODEM_NOT_RESPONDING 2 +#define RAS_MODEM_HARDWARE_FAILURE 3 +#define RAS_MODEM_INCORRECT_RESPONSE 4 +#define RAS_MODEM_UNKNOWN 5 +#define RAS_PORT_NON_OPERATIONAL 1 +#define RAS_PORT_DISCONNECTED 2 +#define RAS_PORT_CALLING_BACK 3 +#define RAS_PORT_LISTENING 4 +#define RAS_PORT_AUTHENTICATING 5 +#define RAS_PORT_AUTHENTICATED 6 +#define RAS_PORT_INITIALIZING 7 +#define MEDIA_UNKNOWN 0 +#define MEDIA_SERIAL 1 +#define MEDIA_RAS10_SERIAL 2 +#define MEDIA_X25 3 +#define MEDIA_ISDN 4 +#define USER_AUTHENTICATED 0x0001 +#define MESSENGER_PRESENT 0x0002 +#define PPP_CLIENT 0x0004 +#define GATEWAY_ACTIVE 0x0008 +#define REMOTE_LISTEN 0x0010 +#define PORT_MULTILINKED 0x0020 +#define RAS_IPADDRESSLEN 15 +#define RAS_IPXADDRESSLEN 22 +#define RAS_ATADDRESSLEN 32 +#define RASDOWNLEVEL 10 +#define RASADMIN_35 35 +#define RASADMIN_CURRENT 40 + +typedef ULONG IPADDR; +typedef enum _RAS_PARAMS_FORMAT { + ParamNumber = 0, + ParamString = 1 +} RAS_PARAMS_FORMAT; +typedef union RAS_PARAMS_VALUE { + DWORD Number; + struct { + DWORD Length; + PCHAR Data; + } String; +} RAS_PARAMS_VALUE; +typedef struct RAS_PARAMETERS { + CHAR P_Key [RASSAPI_MAX_PARAM_KEY_SIZE]; + RAS_PARAMS_FORMAT P_Type; + BYTE P_Attributes; + RAS_PARAMS_VALUE P_Value; +} RAS_PARAMETERS; +typedef struct _RAS_USER_0 { + BYTE bfPrivilege; + WCHAR szPhoneNumber[RASSAPI_MAX_PHONENUMBER_SIZE + 1]; +} RAS_USER_0, *PRAS_USER_0; +typedef struct _RAS_PORT_0 { + WCHAR wszPortName[RASSAPI_MAX_PORT_NAME]; + WCHAR wszDeviceType[RASSAPI_MAX_DEVICETYPE_NAME]; + WCHAR wszDeviceName[RASSAPI_MAX_DEVICE_NAME]; + WCHAR wszMediaName[RASSAPI_MAX_MEDIA_NAME]; + DWORD reserved; + DWORD Flags; + WCHAR wszUserName[UNLEN + 1]; + WCHAR wszComputer[NETBIOS_NAME_LEN]; + DWORD dwStartSessionTime; /* seconds from 1/1/1970 */ + WCHAR wszLogonDomain[DNLEN + 1]; + BOOL fAdvancedServer; +} RAS_PORT_0, *PRAS_PORT_0; +typedef struct _RAS_PPP_NBFCP_RESULT { + DWORD dwError; + DWORD dwNetBiosError; + CHAR szName[ NETBIOS_NAME_LEN + 1 ]; + WCHAR wszWksta[ NETBIOS_NAME_LEN + 1 ]; +} RAS_PPP_NBFCP_RESULT; +typedef struct _RAS_PPP_IPCP_RESULT{ + DWORD dwError; + WCHAR wszAddress[ RAS_IPADDRESSLEN + 1 ]; +} RAS_PPP_IPCP_RESULT; +typedef struct _RAS_PPP_IPXCP_RESULT { + DWORD dwError; + WCHAR wszAddress[ RAS_IPXADDRESSLEN + 1 ]; +} RAS_PPP_IPXCP_RESULT; +typedef struct _RAS_PPP_ATCP_RESULT { + DWORD dwError; + WCHAR wszAddress[ RAS_ATADDRESSLEN + 1 ]; +} RAS_PPP_ATCP_RESULT; +typedef struct _RAS_PPP_PROJECTION_RESULT { + RAS_PPP_NBFCP_RESULT nbf; + RAS_PPP_IPCP_RESULT ip; + RAS_PPP_IPXCP_RESULT ipx; + RAS_PPP_ATCP_RESULT at; +} RAS_PPP_PROJECTION_RESULT; +typedef struct _RAS_PORT_1{ + RAS_PORT_0 rasport0; + DWORD LineCondition; + DWORD HardwareCondition; + DWORD LineSpeed; + WORD NumStatistics; + WORD NumMediaParms; + DWORD SizeMediaParms; + RAS_PPP_PROJECTION_RESULT ProjResult; +} RAS_PORT_1, *PRAS_PORT_1; +typedef struct _RAS_PORT_STATISTICS { + DWORD dwBytesXmited; + DWORD dwBytesRcved; + DWORD dwFramesXmited; + DWORD dwFramesRcved; + DWORD dwCrcErr; + DWORD dwTimeoutErr; + DWORD dwAlignmentErr; + DWORD dwHardwareOverrunErr; + DWORD dwFramingErr; + DWORD dwBufferOverrunErr; + DWORD dwBytesXmitedUncompressed; + DWORD dwBytesRcvedUncompressed; + DWORD dwBytesXmitedCompressed; + DWORD dwBytesRcvedCompressed; + DWORD dwPortBytesXmited; + DWORD dwPortBytesRcved; + DWORD dwPortFramesXmited; + DWORD dwPortFramesRcved; + DWORD dwPortCrcErr; + DWORD dwPortTimeoutErr; + DWORD dwPortAlignmentErr; + DWORD dwPortHardwareOverrunErr; + DWORD dwPortFramingErr; + DWORD dwPortBufferOverrunErr; + DWORD dwPortBytesXmitedUncompressed; + DWORD dwPortBytesRcvedUncompressed; + DWORD dwPortBytesXmitedCompressed; + DWORD dwPortBytesRcvedCompressed; +} RAS_PORT_STATISTICS, *PRAS_PORT_STATISTICS; +typedef struct _RAS_SERVER_0 { + WORD TotalPorts; + WORD PortsInUse; + DWORD RasVersion; +} RAS_SERVER_0, *PRAS_SERVER_0; + +DWORD APIENTRY RasAdminServerGetInfo( const WCHAR*, PRAS_SERVER_0 ); +DWORD APIENTRY RasAdminGetUserAccountServer( const WCHAR*, const WCHAR*, LPWSTR ); +DWORD APIENTRY RasAdminUserGetInfo( const WCHAR*, const WCHAR*, PRAS_USER_0 ); +DWORD APIENTRY RasAdminUserSetInfo( const WCHAR*, const WCHAR*, const PRAS_USER_0 ); +DWORD APIENTRY RasAdminPortEnum( const WCHAR*, PRAS_PORT_0*, WORD*); +DWORD APIENTRY RasAdminPortGetInfo( const WCHAR*, const WCHAR*, RAS_PORT_1*, RAS_PORT_STATISTICS*, RAS_PARAMETERS** ); +DWORD APIENTRY RasAdminPortClearStatistics( const WCHAR*, const WCHAR* ); +DWORD APIENTRY RasAdminPortDisconnect( const WCHAR*, const WCHAR* ); +DWORD APIENTRY RasAdminFreeBuffer(PVOID); +DWORD APIENTRY RasAdminGetErrorString( UINT, WCHAR*, DWORD ); +BOOL APIENTRY RasAdminAcceptNewConnection( RAS_PORT_1*, RAS_PORT_STATISTICS*, RAS_PARAMETERS* ); +VOID APIENTRY RasAdminConnectionHangupNotification ( RAS_PORT_1*, RAS_PORT_STATISTICS*, RAS_PARAMETERS* ); +DWORD APIENTRY RasAdminGetIpAddressForUser ( WCHAR*, WCHAR*, IPADDR*, BOOL*); +VOID APIENTRY RasAdminReleaseIpAddress ( WCHAR*, WCHAR*,IPADDR* ); +DWORD APIENTRY RasAdminGetUserParms( WCHAR*, PRAS_USER_0 ); +DWORD APIENTRY RasAdminSetUserParms( WCHAR*, DWORD, PRAS_USER_0 ); + +#ifdef __cplusplus +} +#endif + +#endif /* _RASSAPI_H */ diff --git a/reactos/w32api/include/regstr.h b/reactos/w32api/include/regstr.h new file mode 100644 index 00000000000..ccf80ea40c4 --- /dev/null +++ b/reactos/w32api/include/regstr.h @@ -0,0 +1,769 @@ +#ifndef _REGSTR_H +#define _REGSTR_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define REGSTR_KEY_CLASS TEXT("Class") +#define REGSTR_KEY_CONFIG TEXT("Config") +#define REGSTR_KEY_ENUM TEXT("Enum") +#define REGSTR_KEY_ROOTENUM TEXT("Root") +#define REGSTR_KEY_BIOSENUM TEXT("BIOS") +#define REGSTR_KEY_PCMCIAENUM TEXT("PCMCIA") +#define REGSTR_KEY_PCIENUM TEXT("PCI") +#define REGSTR_KEY_LOGCONFIG TEXT("LogConfig") +#define REGSTR_KEY_SYSTEMBOARD TEXT("*PNP0C01") +#define REGSTR_KEY_APM TEXT("*PNP0C05") +#define REGSTR_KEY_INIUPDATE TEXT("IniUpdate") +#define REG_KEY_INSTDEV TEXT("Installed") +#define REGSTR_KEY_DOSOPTCDROM TEXT("CD-ROM") +#define REGSTR_KEY_DOSOPTMOUSE TEXT("MOUSE") +#define REGSTR_DEFAULT_INSTANCE TEXT("0000") +#define REGSTR_PATH_MOTHERBOARD REGSTR_KEY_SYSTEMBOARD TEXT("\\" REGSTR_DEFAULT_INSTANCE +#define REGSTR_PATH_SETUP TEXT("Software\\Microsoft\\Windows\\CurrentVersion") +#define REGSTR_PATH_PIFCONVERT TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\PIFConvert") +#define REGSTR_PATH_MSDOSOPTS TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\MS-DOSOptions") +#define REGSTR_PATH_MSDOSEMU TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\MS-DOS Emulation") +#define REGSTR_PATH_NEWDOSBOX TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\MS-DOS Emulation\\AppCompat") +#define REGSTR_PATH_RUNONCE TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce") +#define REGSTR_PATH_RUN TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Run") +#define REGSTR_PATH_RUNSERVICESONCE TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\RunServicesOnce") +#define REGSTR_PATH_RUNSERVICES TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\RunServices") +#ifndef REGSTR_PATH_EXPLORER /* also in shlobj.h */ +#define REGSTR_PATH_EXPLORER TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer") +#endif +#define REGSTR_PATH_DETECT TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Detect") +#define REGSTR_PATH_APPPATHS TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\App Paths") +#define REGSTR_PATH_UNINSTALL TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall") +#define REGSTR_PATH_REALMODENET TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Network\\Real Mode Net") +#define REGSTR_PATH_NETEQUIV TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Network\\Equivalent") +#define REGSTR_PATH_CVNETWORK TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Network") +#define REGSTR_PATH_IDCONFIGDB TEXT("System\\CurrentControlSet\\Control\\IDConfigDB") +#define REGSTR_PATH_CLASS TEXT("System\\CurrentControlSet\\Services\\Class") +#define REGSTR_PATH_DISPLAYSETTINGS TEXT("Display\\Settings") +#define REGSTR_PATH_FONTS TEXT("Display\\Fonts") +#define REGSTR_PATH_ENUM TEXT("Enum") +#define REGSTR_PATH_ROOT TEXT("Enum\\Root") +#define REGSTR_PATH_SERVICES TEXT("System\\CurrentControlSet\\Services") +#define REGSTR_PATH_VXD TEXT("System\\CurrentControlSet\\Services\\VxD") +#define REGSTR_PATH_IOS TEXT("System\\CurrentControlSet\\Services\\VxD\\IOS") +#define REGSTR_PATH_VMM TEXT("System\\CurrentControlSet\\Services\\VxD\\VMM") +#define REGSTR_PATH_VPOWERD TEXT("System\\CurrentControlSet\\Services\\VxD\\VPOWERD") +#define REGSTR_PATH_VNETSUP TEXT("System\\CurrentControlSet\\Services\\VxD\\VNETSUP") +#define REGSTR_PATH_NWREDIR TEXT("System\\CurrentControlSet\\Services\\VxD\\NWREDIR") +#define REGSTR_PATH_NCPSERVER TEXT("System\\CurrentControlSet\\Services\\NcpServer\\Parameters") +#define REGSTR_PATH_IOARB TEXT("System\\CurrentControlSet\\Services\\Arbitrators\\IOArb") +#define REGSTR_PATH_ADDRARB TEXT("System\\CurrentControlSet\\Services\\Arbitrators\\AddrArb") +#define REGSTR_PATH_DMAARB TEXT("System\\CurrentControlSet\\Services\\Arbitrators\\DMAArb") +#define REGSTR_PATH_IRQARB TEXT("System\\CurrentControlSet\\Services\\Arbitrators\\IRQArb") +#define REGSTR_PATH_CODEPAGE TEXT("System\\CurrentControlSet\\Control\\Nls\\Codepage") +#define REGSTR_PATH_FILESYSTEM TEXT("System\\CurrentControlSet\\Control\\FileSystem") +#define REGSTR_PATH_FILESYSTEM_NOVOLTRACK TEXT("System\\CurrentControlSet\\Control\\FileSystem\\NoVolTrack") +#define REGSTR_PATH_CDFS TEXT("System\\CurrentControlSet\\Control\\FileSystem\\CDFS") +#define REGSTR_PATH_WINBOOT TEXT("System\\CurrentControlSet\\Control\\WinBoot") +#define REGSTR_PATH_INSTALLEDFILES TEXT("System\\CurrentControlSet\\Control\\InstalledFiles") +#define REGSTR_PATH_VMM32FILES TEXT("System\\CurrentControlSet\\Control\\VMM32Files") +#define REGSTR_MAX_VALUE_LENGTH 256 +#define REGSTR_VAL_BITSPERPIXEL TEXT("BitsPerPixel") +#define REGSTR_VAL_RESOLUTION TEXT("Resolution") +#define REGSTR_VAL_DPILOGICALX TEXT("DPILogicalX") +#define REGSTR_VAL_DPILOGICALY TEXT("DPILogicalY") +#define REGSTR_VAL_DPIPHYSICALX TEXT("DPIPhysicalX") +#define REGSTR_VAL_DPIPHYSICALY TEXT("DPIPhysicalY") +#define REGSTR_VAL_REFRESHRATE TEXT("RefreshRate") +#define REGSTR_VAL_DISPLAYFLAGS TEXT("DisplayFlags") +#define REGSTR_PATH_CONTROLPANEL TEXT("Control Panel") +#define REGSTR_PATH_CONTROLSFOLDER TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Controls Folder") +#define REGSTR_VAL_DOSCP TEXT("OEMCP") +#define REGSTR_VAL_WINCP TEXT("ACP") +#define REGSTR_PATH_DYNA_ENUM TEXT("Config Manager\\Enum") +#define REGSTR_VAL_HARDWARE_KEY TEXT("HardWareKey") +#define REGSTR_VAL_ALLOCATION TEXT("Allocation") +#define REGSTR_VAL_PROBLEM TEXT("Problem") +#define REGSTR_VAL_STATUS TEXT("Status") +#define REGSTR_VAL_DONTUSEMEM TEXT("DontAllocLastMem") +#define REGSTR_VAL_SYSTEMROOT TEXT("SystemRoot") +#define REGSTR_VAL_BOOTCOUNT TEXT("BootCount") +#define REGSTR_VAL_REALNETSTART TEXT("RealNetStart") +#define REGSTR_VAL_MEDIA TEXT("MediaPath") +#define REGSTR_VAL_CONFIG TEXT("ConfigPath") +#define REGSTR_VAL_DEVICEPATH TEXT("DevicePath") +#define REGSTR_VAL_SRCPATH TEXT("SourcePath") +#define REGSTR_VAL_OLDWINDIR TEXT("OldWinDir") +#define REGSTR_VAL_SETUPFLAGS TEXT("SetupFlags") +#define REGSTR_VAL_REGOWNER TEXT("RegisteredOwner") +#define REGSTR_VAL_REGORGANIZATION TEXT("RegisteredOrganization") +#define REGSTR_VAL_LICENSINGINFO TEXT("LicensingInfo") +#define REGSTR_VAL_OLDMSDOSVER TEXT("OldMSDOSVer") +#define REGSTR_VAL_FIRSTINSTALLDATETIME TEXT("FirstInstallDateTime") +#define REGSTR_VAL_INSTALLTYPE TEXT("InstallType") +#define REGSTR_VAL_WRAPPER TEXT("Wrapper") +#define IT_COMPACT 0 +#define IT_TYPICAL 1 +#define IT_PORTABLE 2 +#define IT_CUSTOM 3 +#define REGSTR_KEY_SETUP TEXT("\\Setup") +#define REGSTR_VAL_BOOTDIR TEXT("BootDir") +#define REGSTR_VAL_WINBOOTDIR TEXT("WinbootDir") +#define REGSTR_VAL_WINDIR TEXT("WinDir") +#define REGSTR_VAL_APPINSTPATH TEXT("AppInstallPath") +#define REGSTR_PATH_EBD REGSTR_PATH_SETUP REGSTR_KEY_SETUP TEXT("\\EBD") +#define REGSTR_KEY_EBDFILESLOCAL TEXT("EBDFilesLocale") +#define REGSTR_KEY_EBDFILESKEYBOARD TEXT("EBDFilesKeyboard") +#define REGSTR_KEY_EBDAUTOEXECBATLOCAL TEXT("EBDAutoexecBatLocale") +#define REGSTR_KEY_EBDAUTOEXECBATKEYBOARD TEXT("EBDAutoexecBatKeyboard") +#define REGSTR_KEY_EBDCONFIGSYSLOCAL TEXT("EBDConfigSysLocale") +#define REGSTR_KEY_EBDCONFIGSYSKEYBOARD TEXT("EBDConfigSysKeyboard") +#define REGSTR_VAL_MSDOSMODE TEXT("MSDOSMode") +#define REGSTR_VAL_MSDOSMODEDISCARD TEXT("Discard") +#define REGSTR_VAL_DOSOPTGLOBALFLAGS TEXT("GlobalFlags") +#define DOSOPTGF_DEFCLEAN 1 +#define REGSTR_VAL_DOSOPTFLAGS TEXT("Flags") +#define REGSTR_VAL_OPTORDER TEXT("Order") +#define REGSTR_VAL_CONFIGSYS TEXT("Config.Sys") +#define REGSTR_VAL_AUTOEXEC TEXT("Autoexec.Bat") +#define REGSTR_VAL_STDDOSOPTION TEXT("StdOption") +#define REGSTR_VAL_DOSOPTTIP TEXT("TipText") +#define DOSOPTF_DEFAULT 1 +#define DOSOPTF_SUPPORTED 2 +#define DOSOPTF_ALWAYSUSE 4 +#define DOSOPTF_USESPMODE 8 +#define DOSOPTF_PROVIDESUMB 16 +#define DOSOPTF_NEEDSETUP 32 +#define DOSOPTF_INDOSSTART 64 +#define DOSOPTF_MULTIPLE 128 +#define SUF_FIRSTTIME 1 +#define SUF_EXPRESS 2 +#define SUF_BATCHINF 4 +#define SUF_CLEAN 8 +#define SUF_INSETUP 16 +#define SUF_NETSETUP 32 +#define SUF_NETHDBOOT 64 +#define SUF_NETRPLBOOT 128 +#define SUF_SBSCOPYOK 256 +#define REGSTR_VAL_DOSPAGER TEXT("DOSPager") +#define REGSTR_VAL_VXDGROUPS TEXT("VXDGroups") +#define REGSTR_VAL_VPOWERDFLAGS TEXT("Flags") +#define VPDF_DISABLEPWRMGMT 1 +#define VPDF_FORCEAPM10MODE 2 +#define VPDF_SKIPINTELSLCHECK 4 +#define VPDF_DISABLEPWRSTATUSPOLL 8 +#define REGSTR_VAL_WORKGROUP TEXT("Workgroup") +#define REGSTR_VAL_DIRECTHOST TEXT("DirectHost") +#define REGSTR_VAL_FILESHARING TEXT("FileSharing") +#define REGSTR_VAL_PRINTSHARING TEXT("PrintSharing") +#define REGSTR_VAL_FIRSTNETDRIVE TEXT("FirstNetworkDrive") +#define REGSTR_VAL_MAXCONNECTIONS TEXT("MaxConnections") +#define REGSTR_VAL_APISUPPORT TEXT("APISupport") +#define REGSTR_VAL_MAXRETRY TEXT("MaxRetry") +#define REGSTR_VAL_MINRETRY TEXT("MinRetry") +#define REGSTR_VAL_SUPPORTLFN TEXT("SupportLFN") +#define REGSTR_VAL_SUPPORTBURST TEXT("SupportBurst") +#define REGSTR_VAL_SUPPORTTUNNELLING TEXT("SupportTunnelling") +#define REGSTR_VAL_FULLTRACE TEXT("FullTrace") +#define REGSTR_VAL_READCACHING TEXT("ReadCaching") +#define REGSTR_VAL_SHOWDOTS TEXT("ShowDots") +#define REGSTR_VAL_GAPTIME TEXT("GapTime") +#define REGSTR_VAL_SEARCHMODE TEXT("SearchMode") +#define REGSTR_VAL_SHELLVERSION TEXT("ShellVersion") +#define REGSTR_VAL_MAXLIP TEXT("MaxLIP") +#define REGSTR_VAL_PRESERVECASE TEXT("PreserveCase") +#define REGSTR_VAL_OPTIMIZESFN TEXT("OptimizeSFN") +#define REGSTR_VAL_NCP_BROWSEMASTER TEXT("BrowseMaster") +#define REGSTR_VAL_NCP_USEPEERBROWSING TEXT("Use_PeerBrowsing") +#define REGSTR_VAL_NCP_USESAP TEXT("Use_Sap") +#define REGSTR_VAL_WIN31FILESYSTEM TEXT("Win31FileSystem") +#define REGSTR_VAL_PRESERVELONGNAMES TEXT("PreserveLongNames") +#define REGSTR_VAL_DRIVEWRITEBEHIND TEXT("DriveWriteBehind") +#define REGSTR_VAL_ASYNCFILECOMMIT TEXT("AsyncFileCommit") +#define REGSTR_VAL_PATHCACHECOUNT TEXT("PathCache") +#define REGSTR_VAL_NAMECACHECOUNT TEXT("NameCache") +#define REGSTR_VAL_CONTIGFILEALLOC TEXT("ContigFileAllocSize") +#define REGSTR_VAL_VOLIDLETIMEOUT TEXT("VolumeIdleTimeout") +#define REGSTR_VAL_BUFFIDLETIMEOUT TEXT("BufferIdleTimeout") +#define REGSTR_VAL_BUFFAGETIMEOUT TEXT("BufferAgeTimeout") +#define REGSTR_VAL_NAMENUMERICTAIL TEXT("NameNumericTail") +#define REGSTR_VAL_READAHEADTHRESHOLD TEXT("ReadAheadThreshold") +#define REGSTR_VAL_DOUBLEBUFFER TEXT("DoubleBuffer") +#define REGSTR_VAL_SOFTCOMPATMODE TEXT("SoftCompatMode") +#define REGSTR_VAL_DRIVESPINDOWN TEXT("DriveSpinDown") +#define REGSTR_VAL_FORCEPMIO TEXT("ForcePMIO") +#define REGSTR_VAL_FORCERMIO TEXT("ForceRMIO") +#define REGSTR_VAL_LASTBOOTPMDRVS TEXT("LastBootPMDrvs") +#define REGSTR_VAL_VIRTUALHDIRQ TEXT("VirtualHDIRQ") +#define REGSTR_VAL_SRVNAMECACHECOUNT TEXT("ServerNameCacheMax") +#define REGSTR_VAL_SRVNAMECACHE TEXT("ServerNameCache") +#define REGSTR_VAL_SRVNAMECACHENETPROV TEXT("ServerNameCacheNumNets") +#define REGSTR_VAL_AUTOMOUNT TEXT("AutoMountDrives") +#define REGSTR_VAL_COMPRESSIONMETHOD TEXT("CompressionAlgorithm") +#define REGSTR_VAL_COMPRESSIONTHRESHOLD TEXT("CompressionThreshold") +#define REGSTR_VAL_CDCACHESIZE TEXT("CacheSize") +#define REGSTR_VAL_CDPREFETCH TEXT("Prefetch") +#define REGSTR_VAL_CDPREFETCHTAIL TEXT("PrefetchTail") +#define REGSTR_VAL_CDRAWCACHE TEXT("RawCache") +#define REGSTR_VAL_CDEXTERRORS TEXT("ExtendedErrors") +#define REGSTR_VAL_CDSVDSENSE TEXT("SVDSense") +#define REGSTR_VAL_CDSHOWVERSIONS TEXT("ShowVersions") +#define REGSTR_VAL_CDCOMPATNAMES TEXT("MSCDEXCompatNames") +#define REGSTR_VAL_CDNOREADAHEAD TEXT("NoReadAhead") +#define REGSTR_VAL_SCSI TEXT("SCSI\\") +#define REGSTR_VAL_ESDI TEXT("ESDI\\") +#define REGSTR_VAL_FLOP TEXT("FLOP\\") +#define REGSTR_VAL_DISK TEXT("GenDisk") +#define REGSTR_VAL_CDROM TEXT("GenCD") +#define REGSTR_VAL_TAPE TEXT("TAPE") +#define REGSTR_VAL_SCANNER TEXT("SCANNER") +#define REGSTR_VAL_FLOPPY TEXT("FLOPPY") +#define REGSTR_VAL_SCSITID TEXT("SCSITargetID") +#define REGSTR_VAL_SCSILUN TEXT("SCSILUN") +#define REGSTR_VAL_REVLEVEL TEXT("RevisionLevel") +#define REGSTR_VAL_PRODUCTID TEXT("ProductId") +#define REGSTR_VAL_PRODUCTTYPE TEXT("ProductType") +#define REGSTR_VAL_DEVTYPE TEXT("DeviceType") +#define REGSTR_VAL_REMOVABLE TEXT("Removable") +#define REGSTR_VAL_CURDRVLET TEXT("CurrentDriveLetterAssignment") +#define REGSTR_VAL_USRDRVLET TEXT("UserDriveLetterAssignment") +#define REGSTR_VAL_SYNCDATAXFER TEXT("SyncDataXfer") +#define REGSTR_VAL_AUTOINSNOTE TEXT("AutoInsertNotification") +#define REGSTR_VAL_DISCONNECT TEXT("Disconnect") +#define REGSTR_VAL_INT13 TEXT("Int13") +#define REGSTR_VAL_PMODE_INT13 TEXT("PModeInt13") +#define REGSTR_VAL_USERSETTINGS TEXT("AdapterSettings") +#define REGSTR_VAL_NOIDE TEXT("NoIDE") +#define REGSTR_VAL_DISKCLASSNAME TEXT("DiskDrive") +#define REGSTR_VAL_CDROMCLASSNAME TEXT("CDROM") +#define REGSTR_VAL_FORCELOAD TEXT("ForceLoadPD") +#define REGSTR_VAL_FORCEFIFO TEXT("ForceFIFO") +#define REGSTR_VAL_FORCECL TEXT("ForceChangeLine") +#define REGSTR_VAL_NOUSECLASS TEXT("NoUseClass") +#define REGSTR_VAL_NOINSTALLCLASS TEXT("NoInstallClass") +#define REGSTR_VAL_NODISPLAYCLASS TEXT("NoDisplayClass") +#define REGSTR_VAL_SILENTINSTALL TEXT("SilentInstall") +#define REGSTR_KEY_PCMCIA_CLASS TEXT("PCMCIA") +#define REGSTR_KEY_SCSI_CLASS TEXT("SCSIAdapter") +#define REGSTR_KEY_PORTS_CLASS TEXT("ports") +#define REGSTR_KEY_MEDIA_CLASS TEXT("MEDIA") +#define REGSTR_KEY_DISPLAY_CLASS TEXT("Display") +#define REGSTR_KEY_KEYBOARD_CLASS TEXT("Keyboard") +#define REGSTR_KEY_MOUSE_CLASS TEXT("Mouse") +#define REGSTR_KEY_MONITOR_CLASS TEXT("Monitor") +#define REGSTR_VAL_PCMCIA_OPT TEXT("Options") +#define PCMCIA_OPT_HAVE_SOCKET 1 +#define PCMCIA_OPT_AUTOMEM 4 +#define PCMCIA_OPT_NO_SOUND 8 +#define PCMCIA_OPT_NO_AUDIO 16 +#define PCMCIA_OPT_NO_APMREMOVE 32 +#define REGSTR_VAL_PCMCIA_MEM TEXT("Memory") +#define PCMCIA_DEF_MEMBEGIN 0xC0000 +#define PCMCIA_DEF_MEMEND 0xFFFFFF +#define PCMCIA_DEF_MEMLEN 0x1000 +#define REGSTR_VAL_PCMCIA_ALLOC TEXT("AllocMemWin") +#define REGSTR_VAL_PCMCIA_ATAD TEXT("ATADelay") +#define REGSTR_VAL_PCMCIA_SIZ TEXT("MinRegionSize") +#define PCMCIA_DEF_MIN_REGION 0x10000 +#define REGSTR_VAL_P1284MDL TEXT("Model") +#define REGSTR_VAL_P1284MFG TEXT("Manufacturer") +#define REGSTR_VAL_ISAPNP TEXT("ISAPNP") +#define REGSTR_VAL_ISAPNP_RDP_OVERRIDE TEXT("RDPOverRide") +#define REGSTR_VAL_PCI TEXT("PCI") +#define REGSTR_PCI_OPTIONS TEXT("Options") +#define REGSTR_PCI_DUAL_IDE TEXT("PCIDualIDE") +#define PCI_OPTIONS_USE_BIOS 1 +#define PCI_OPTIONS_USE_IRQ_STEERING 2 +#define PCI_FLAG_NO_VIDEO_IRQ 1 +#define PCI_FLAG_PCMCIA_WANT_IRQ 2 +#define PCI_FLAG_DUAL_IDE 4 +#define PCI_FLAG_NO_ENUM_AT_ALL 8 +#define PCI_FLAG_ENUM_NO_RESOURCE 16 +#define PCI_FLAG_NEED_DWORD_ACCESS 32 +#define PCI_FLAG_SINGLE_FUNCTION 64 +#define PCI_FLAG_ALWAYS_ENABLED 128 +#define PCI_FLAG_IS_IDE 256 +#define PCI_FLAG_IS_VIDEO 512 +#define PCI_FLAG_FAIL_START 1024 +#define REGSTR_KEY_CRASHES TEXT("Crashes") +#define REGSTR_KEY_DANGERS TEXT("Dangers") +#define REGSTR_KEY_DETMODVARS TEXT("DetModVars") +#define REGSTR_KEY_NDISINFO TEXT("NDISInfo") +#define REGSTR_VAL_PROTINIPATH TEXT("ProtIniPath") +#define REGSTR_VAL_RESOURCES TEXT("Resources") +#define REGSTR_VAL_CRASHFUNCS TEXT("CrashFuncs") +#define REGSTR_VAL_CLASS TEXT("Class") +#define REGSTR_VAL_DEVDESC TEXT("DeviceDesc") +#define REGSTR_VAL_BOOTCONFIG TEXT("BootConfig") +#define REGSTR_VAL_DETFUNC TEXT("DetFunc") +#define REGSTR_VAL_DETFLAGS TEXT("DetFlags") +#define REGSTR_VAL_COMPATIBLEIDS TEXT("CompatibleIDs") +#define REGSTR_VAL_DETCONFIG TEXT("DetConfig") +#define REGSTR_VAL_VERIFYKEY TEXT("VerifyKey") +#define REGSTR_VAL_COMINFO TEXT("ComInfo") +#define REGSTR_VAL_INFNAME TEXT("InfName") +#define REGSTR_VAL_CARDSPECIFIC TEXT("CardSpecific") +#define REGSTR_VAL_NETOSTYPE TEXT("NetOSType") +#define REGSTR_DATA_NETOS_NDIS TEXT("NDIS") +#define REGSTR_DATA_NETOS_ODI TEXT("ODI") +#define REGSTR_DATA_NETOS_IPX TEXT("IPX") +#define REGSTR_VAL_MFG TEXT("Mfg") +#define REGSTR_VAL_SCAN_ONLY_FIRST TEXT("ScanOnlyFirstDrive") +#define REGSTR_VAL_SHARE_IRQ TEXT("ForceIRQSharing") +#define REGSTR_VAL_NONSTANDARD_ATAPI TEXT("NonStandardATAPI") +#define REGSTR_VAL_IDE_FORCE_SERIALIZE TEXT("ForceSerialization") +#define REGSTR_VAL_MAX_HCID_LEN 1024 +#define REGSTR_VAL_HWREV TEXT("HWRevision") +#define REGSTR_VAL_ENABLEINTS TEXT("EnableInts") +#define REGDF_NOTDETIO 1 +#define REGDF_NOTDETMEM 2 +#define REGDF_NOTDETIRQ 4 +#define REGDF_NOTDETDMA 8 +#define REGDF_NOTDETALL (REGDF_NOTDETIO | REGDF_NOTDETMEM | REGDF_NOTDETIRQ | REGDF_NOTDETDMA) +#define REGDF_NEEDFULLCONFIG 16 +#define REGDF_GENFORCEDCONFIG 32 +#define REGDF_NODETCONFIG 0x8000 +#define REGDF_CONFLICTIO 0x10000 +#define REGDF_CONFLICTMEM 0x20000 +#define REGDF_CONFLICTIRQ 0x40000 +#define REGDF_CONFLICTDMA 0x80000 +#define REGDF_CONFLICTALL (REGDF_CONFLICTIO | REGDF_CONFLICTMEM | REGDF_CONFLICTIRQ | REGDF_CONFLICTDMA) +#define REGDF_MAPIRQ2TO9 0x100000 +#define REGDF_NOTVERIFIED 0x80000000 +#define REGSTR_VAL_APMBIOSVER TEXT("APMBiosVer") +#define REGSTR_VAL_APMFLAGS TEXT("APMFlags") +#define REGSTR_VAL_SLSUPPORT TEXT("SLSupport") +#define REGSTR_VAL_MACHINETYPE TEXT("MachineType") +#define REGSTR_VAL_SETUPMACHINETYPE TEXT("SetupMachineType") +#define REGSTR_MACHTYPE_UNKNOWN TEXT("Unknown") +#define REGSTR_MACHTYPE_IBMPC TEXT("IBM PC") +#define REGSTR_MACHTYPE_IBMPCJR TEXT("IBM PCjr") +#define REGSTR_MACHTYPE_IBMPCCONV TEXT("IBM PC Convertible") +#define REGSTR_MACHTYPE_IBMPCXT TEXT("IBM PC/XT") +#define REGSTR_MACHTYPE_IBMPCXT_286 TEXT("IBM PC/XT 286") +#define REGSTR_MACHTYPE_IBMPCAT TEXT("IBM PC/AT") +#define REGSTR_MACHTYPE_IBMPS2_25 TEXT("IBM PS/2-25") +#define REGSTR_MACHTYPE_IBMPS2_30_286 TEXT("IBM PS/2-30 286") +#define REGSTR_MACHTYPE_IBMPS2_30 TEXT("IBM PS/2-30") +#define REGSTR_MACHTYPE_IBMPS2_50 TEXT("IBM PS/2-50") +#define REGSTR_MACHTYPE_IBMPS2_50Z TEXT("IBM PS/2-50Z") +#define REGSTR_MACHTYPE_IBMPS2_55SX TEXT("IBM PS/2-55SX") +#define REGSTR_MACHTYPE_IBMPS2_60 TEXT("IBM PS/2-60") +#define REGSTR_MACHTYPE_IBMPS2_65SX TEXT("IBM PS/2-65SX") +#define REGSTR_MACHTYPE_IBMPS2_70 TEXT("IBM PS/2-70") +#define REGSTR_MACHTYPE_IBMPS2_P70 TEXT("IBM PS/2-P70") +#define REGSTR_MACHTYPE_IBMPS2_70_80 TEXT("IBM PS/2-70/80") +#define REGSTR_MACHTYPE_IBMPS2_80 TEXT("IBM PS/2-80") +#define REGSTR_MACHTYPE_IBMPS2_90 TEXT("IBM PS/2-90") +#define REGSTR_MACHTYPE_IBMPS1 TEXT("IBM PS/1") +#define REGSTR_MACHTYPE_PHOENIX_PCAT TEXT("Phoenix PC/AT Compatible") +#define REGSTR_MACHTYPE_HP_VECTRA TEXT("HP Vectra") +#define REGSTR_MACHTYPE_ATT_PC TEXT("AT&T PC") +#define REGSTR_MACHTYPE_ZENITH_PC TEXT("Zenith PC") +#define REGSTR_VAL_APMMENUSUSPEND TEXT("APMMenuSuspend") +#define APMMENUSUSPEND_DISABLED 0 +#define APMMENUSUSPEND_ENABLED 1 +#define APMMENUSUSPEND_UNDOCKED 2 +#define APMMENUSUSPEND_NOCHANGE 128 +#define REGSTR_VAL_BUSTYPE TEXT("BusType") +#define REGSTR_VAL_CPU TEXT("CPU") +#define REGSTR_VAL_NDP TEXT("NDP") +#define REGSTR_VAL_PNPBIOSVER TEXT("PnPBIOSVer") +#define REGSTR_VAL_PNPSTRUCOFFSET TEXT("PnPStrucOffset") +#define REGSTR_VAL_PCIBIOSVER TEXT("PCIBIOSVer") +#define REGSTR_VAL_HWMECHANISM TEXT("HWMechanism") +#define REGSTR_VAL_LASTPCIBUSNUM TEXT("LastPCIBusNum") +#define REGSTR_VAL_CONVMEM TEXT("ConvMem") +#define REGSTR_VAL_EXTMEM TEXT("ExtMem") +#define REGSTR_VAL_COMPUTERNAME TEXT("ComputerName") +#define REGSTR_VAL_BIOSNAME TEXT("BIOSName") +#define REGSTR_VAL_BIOSVERSION TEXT("BIOSVersion") +#define REGSTR_VAL_BIOSDATE TEXT("BIOSDate") +#define REGSTR_VAL_MODEL TEXT("Model") +#define REGSTR_VAL_SUBMODEL TEXT("Submodel") +#define REGSTR_VAL_REVISION TEXT("Revision") +#define REGSTR_VAL_FIFODEPTH TEXT("FIFODepth") +#define REGSTR_VAL_RDINTTHRESHOLD TEXT("RDIntThreshold") +#define REGSTR_VAL_WRINTTHRESHOLD TEXT("WRIntThreshold") +#define REGSTR_VAL_PRIORITY TEXT("Priority") +#define REGSTR_VAL_DRIVER TEXT("Driver") +#define REGSTR_VAL_FUNCDESC TEXT("FunctionDesc") +#define REGSTR_VAL_FORCEDCONFIG TEXT("ForcedConfig") +#define REGSTR_VAL_CONFIGFLAGS TEXT("ConfigFlags") +#define REGSTR_VAL_CSCONFIGFLAGS TEXT("CSConfigFlags") +#define CONFIGFLAG_DISABLED 1 +#define CONFIGFLAG_REMOVED 2 +#define CONFIGFLAG_MANUAL_INSTALL 4 +#define CONFIGFLAG_IGNORE_BOOT_LC 8 +#define CONFIGFLAG_NET_BOOT 16 +#define CONFIGFLAG_REINSTALL 32 +#define CONFIGFLAG_FAILEDINSTALL 64 +#define CONFIGFLAG_CANTSTOPACHILD 128 +#define CONFIGFLAG_OKREMOVEROM 256 +#define CONFIGFLAG_NOREMOVEEXIT 512 +#define CSCONFIGFLAG_BITS 7 +#define CSCONFIGFLAG_DISABLED 1 +#define CSCONFIGFLAG_DO_NOT_CREATE 2 +#define CSCONFIGFLAG_DO_NOT_START 4 +#define DMSTATEFLAG_APPLYTOALL 1 +#define REGSTR_VAL_ROOT_DEVNODE TEXT("HTREE\\ROOT\\0") +#define REGSTR_VAL_RESERVED_DEVNODE TEXT("HTREE\\RESERVED\\0") +#define REGSTR_PATH_READDATAPORT REGSTR_KEY_ISAENUM TEXT("\\ReadDataPort\\0") +#define REGSTR_PATH_MULTI_FUNCTION TEXT("MF") +#define REGSTR_VAL_RESOURCE_MAP TEXT("ResourceMap") +#define REGSTR_PATH_CHILD_PREFIX TEXT("Child") +#define NUM_RESOURCE_MAP 256 +#define REGSTR_VAL_MF_FLAGS TEXT("MFFlags") +#define MF_FLAGS_EVEN_IF_NO_RESOURCE 1 +#define MF_FLAGS_NO_CREATE_IF_NO_RESOURCE 2 +#define MF_FLAGS_FILL_IN_UNKNOWN_RESOURCE 4 +#define MF_FLAGS_CREATE_BUT_NO_SHOW_DISABLED 8 +#define EISAFLAG_NO_IO_MERGE 1 +#define EISAFLAG_SLOT_IO_FIRST 2 +#define EISA_NO_MAX_FUNCTION 0xFF +#define NUM_EISA_RANGES 4 +#define REGSTR_VAL_DRVDESC TEXT("DriverDesc") +#define REGSTR_VAL_DEVLOADER TEXT("DevLoader") +#define REGSTR_VAL_STATICVXD TEXT("StaticVxD") +#define REGSTR_VAL_PROPERTIES TEXT("Properties") +#define REGSTR_VAL_MANUFACTURER TEXT("Manufacturer") +#define REGSTR_VAL_EXISTS TEXT("Exists") +#define REGSTR_VAL_CMENUMFLAGS TEXT("CMEnumFlags") +#define REGSTR_VAL_CMDRIVFLAGS TEXT("CMDrivFlags") +#define REGSTR_VAL_ENUMERATOR TEXT("Enumerator") +#define REGSTR_VAL_DEVICEDRIVER TEXT("DeviceDriver") +#define REGSTR_VAL_PORTNAME TEXT("PortName") +#define REGSTR_VAL_INFPATH TEXT("InfPath") +#define REGSTR_VAL_INFSECTION TEXT("InfSection") +#define REGSTR_VAL_POLLING TEXT("Polling") +#define REGSTR_VAL_DONTLOADIFCONFLICT TEXT("DontLoadIfConflict") +#define REGSTR_VAL_PORTSUBCLASS TEXT("PortSubClass") +#define REGSTR_VAL_NETCLEAN TEXT("NetClean") +#define REGSTR_VAL_IDE_NO_SERIALIZE TEXT("IDENoSerialize") +#define REGSTR_VAL_NOCMOSORFDPT TEXT("NoCMOSorFDPT") +#define REGSTR_VAL_COMVERIFYBASE TEXT("COMVerifyBase") +#define REGSTR_KEY_OVERRIDE TEXT("Override") +#define REGSTR_VAL_CONFIGMG TEXT("CONFIGMG") +#define REGSTR_VAL_SYSDM TEXT("SysDM") +#define REGSTR_VAL_SYSDMFUNC TEXT("SysDMFunc") +#define REGSTR_VAL_PRIVATE TEXT("Private") +#define REGSTR_VAL_PRIVATEFUNC TEXT("PrivateFunc") +#define REGSTR_VAL_DETECT TEXT("Detect") +#define REGSTR_VAL_DETECTFUNC TEXT("DetectFunc") +#define REGSTR_VAL_ASKFORCONFIG TEXT("AskForConfig") +#define REGSTR_VAL_ASKFORCONFIGFUNC TEXT("AskForConfigFunc") +#define REGSTR_VAL_WAITFORUNDOCK TEXT("WaitForUndock") +#define REGSTR_VAL_WAITFORUNDOCKFUNC TEXT("WaitForUndockFunc") +#define REGSTR_VAL_REMOVEROMOKAY TEXT("RemoveRomOkay") +#define REGSTR_VAL_REMOVEROMOKAYFUNC TEXT("RemoveRomOkayFunc") +#define REGSTR_VAL_CURCONFIG TEXT("CurrentConfig") +#define REGSTR_VAL_FRIENDLYNAME TEXT("FriendlyName") +#define REGSTR_VAL_CURRENTCONFIG TEXT("CurrentConfig") +#define REGSTR_VAL_MAP TEXT("Map") +#define REGSTR_VAL_ID TEXT("CurrentID") +#define REGSTR_VAL_DOCKED TEXT("CurrentDockedState") +#define REGSTR_VAL_CHECKSUM TEXT("CurrentChecksum") +#define REGSTR_VAL_HWDETECT TEXT("HardwareDetect") +#define REGSTR_VAL_INHIBITRESULTS TEXT("InhibitResults") +#define REGSTR_VAL_PROFILEFLAGS TEXT("ProfileFlags") +#define REGSTR_KEY_PCMCIA TEXT("PCMCIA\\") +#define REGSTR_KEY_PCUNKNOWN TEXT("UNKNOWN_MANUFACTURER") +#define REGSTR_VAL_PCSSDRIVER TEXT("Driver") +#define REGSTR_KEY_PCMTD TEXT("MTD-") +#define REGSTR_VAL_PCMTDRIVER TEXT("MTD") +#define REGSTR_VAL_HARDWAREID TEXT("HardwareID") +#define REGSTR_VAL_INSTALLER TEXT("Installer") +#define REGSTR_VAL_INSICON TEXT("Icon") +#define REGSTR_VAL_ENUMPROPPAGES TEXT("EnumPropPages") +#define REGSTR_VAL_BASICPROPERTIES TEXT("BasicProperties") +#define REGSTR_VAL_PRIVATEPROBLEM TEXT("PrivateProblem") +#define REGSTR_KEY_CURRENT TEXT("Current") +#define REGSTR_KEY_DEFAULT TEXT("Default") +#define REGSTR_KEY_MODES TEXT("Modes") +#define REGSTR_VAL_MODE TEXT("Mode") +#define REGSTR_VAL_BPP TEXT("BPP") +#define REGSTR_VAL_HRES TEXT("HRes") +#define REGSTR_VAL_VRES TEXT("VRes") +#define REGSTR_VAL_FONTSIZE TEXT("FontSize") +#define REGSTR_VAL_DRV TEXT("drv") +#define REGSTR_VAL_GRB TEXT("grb") +#define REGSTR_VAL_VDD TEXT("vdd") +#define REGSTR_VAL_VER TEXT("Ver") +#define REGSTR_VAL_MAXRES TEXT("MaxResolution") +#define REGSTR_VAL_DPMS TEXT("DPMS") +#define REGSTR_VAL_RESUMERESET TEXT("ResumeReset") +#define REGSTR_VAL_DESCRIPTION TEXT("Description") +#define REGSTR_KEY_SYSTEM TEXT("System") +#define REGSTR_KEY_USER TEXT("User") +#define REGSTR_VAL_DPI TEXT("dpi") +#define REGSTR_VAL_PCICOPTIONS TEXT("PCICOptions") +#ifndef NEC_98 +#define PCIC_DEFAULT_IRQMASK 0x4EB8 +#else +#define PCIC_DEFAULT_IRQMASK 0x1468 +#endif +#define PCIC_DEFAULT_NUMSOCKETS 0 +#define REGSTR_VAL_PCICIRQMAP TEXT("PCICIRQMap") +#define REGSTR_PATH_APPEARANCE TEXT("Control Panel\\Appearance") +#define REGSTR_PATH_LOOKSCHEMES TEXT("Control Panel\\Appearance\\Schemes") +#define REGSTR_VAL_CUSTOMCOLORS TEXT("CustomColors") +#define REGSTR_PATH_SCREENSAVE TEXT("Control Panel\\Desktop") +#define REGSTR_VALUE_USESCRPASSWORD TEXT("ScreenSaveUsePassword") +#define REGSTR_VALUE_SCRPASSWORD TEXT("ScreenSave_Data") +#define REGSTR_VALUE_LOWPOWERTIMEOUT TEXT("ScreenSaveLowPowerTimeout") +#define REGSTR_VALUE_POWEROFFTIMEOUT TEXT("ScreenSavePowerOffTimeout") +#define REGSTR_VALUE_LOWPOWERACTIVE TEXT("ScreenSaveLowPowerActive") +#define REGSTR_VALUE_POWEROFFACTIVE TEXT("ScreenSavePowerOffActive") +#define REGSTR_PATH_WINDOWSAPPLETS TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Applets") +#define REGSTR_PATH_SYSTRAY TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\SysTray") +#define REGSTR_VAL_SYSTRAYSVCS TEXT("Services") +#define REGSTR_VAL_SYSTRAYBATFLAGS TEXT("PowerFlags") +#define REGSTR_VAL_SYSTRAYPCCARDFLAGS TEXT("PCMCIAFlags") +#define REGSTR_PATH_NETWORK_USERSETTINGS TEXT("Network") +#define REGSTR_KEY_NETWORK_PERSISTENT TEXT("\\Persistent") +#define REGSTR_KEY_NETWORK_RECENT TEXT("\\Recent") +#define REGSTR_VAL_REMOTE_PATH TEXT("RemotePath") +#define REGSTR_VAL_USER_NAME TEXT("UserName") +#define REGSTR_VAL_PROVIDER_NAME TEXT("ProviderName") +#define REGSTR_VAL_CONNECTION_TYPE TEXT("ConnectionType") +#define REGSTR_VAL_UPGRADE TEXT("Upgrade") +#define REGSTR_KEY_LOGON TEXT("\\Logon") +#define REGSTR_VAL_MUSTBEVALIDATED TEXT("MustBeValidated") +#define REGSTR_VAL_RUNLOGINSCRIPT TEXT("ProcessLoginScript") +#define REGSTR_KEY_NETWORKPROVIDER TEXT("\\NetworkProvider") +#define REGSTR_PATH_NW32NETPROVIDER REGSTR_PATH_SERVICES TEXT("\\NWNP32" REGSTR_KEY_NETWORKPROVIDER +#define REGSTR_PATH_MS32NETPROVIDER REGSTR_PATH_SERVICES TEXT("\\MSNP32" REGSTR_KEY_NETWORKPROVIDER +#define REGSTR_VAL_AUTHENT_AGENT TEXT("AuthenticatingAgent") +#define REGSTR_VAL_PREFREDIR TEXT("PreferredRedir") +#define REGSTR_VAL_AUTOSTART TEXT("AutoStart") +#define REGSTR_VAL_AUTOLOGON TEXT("AutoLogon") +#define REGSTR_VAL_NETCARD TEXT("Netcard") +#define REGSTR_VAL_TRANSPORT TEXT("Transport") +#define REGSTR_VAL_DYNAMIC TEXT("Dynamic") +#define REGSTR_VAL_TRANSITION TEXT("Transition") +#define REGSTR_VAL_STATICDRIVE TEXT("StaticDrive") +#define REGSTR_VAL_LOADHI TEXT("LoadHi") +#define REGSTR_VAL_LOADRMDRIVERS TEXT("LoadRMDrivers") +#define REGSTR_VAL_SETUPN TEXT("SetupN") +#define REGSTR_VAL_SETUPNPATH TEXT("SetupNPath") +#define REGSTR_VAL_WRKGRP_FORCEMAPPING TEXT("WrkgrpForceMapping") +#define REGSTR_VAL_WRKGRP_REQUIRED TEXT("WrkgrpRequired") +#define REGSTR_PATH_CURRENT_CONTROL_SET TEXT("System\\CurrentControlSet\\Control") +#define REGSTR_VAL_CURRENT_USER TEXT("Current User") +#define REGSTR_PATH_PWDPROVIDER TEXT("System\\CurrentControlSet\\Control\\PwdProvider") +#define REGSTR_VAL_PWDPROVIDER_PATH TEXT("ProviderPath") +#define REGSTR_VAL_PWDPROVIDER_DESC TEXT("Description") +#define REGSTR_VAL_PWDPROVIDER_CHANGEPWD TEXT("ChangePassword") +#define REGSTR_VAL_PWDPROVIDER_CHANGEPWDHWND TEXT("ChangePasswordHwnd") +#define REGSTR_VAL_PWDPROVIDER_GETPWDSTATUS TEXT("GetPasswordStatus") +#define REGSTR_VAL_PWDPROVIDER_ISNP TEXT("NetworkProvider") +#define REGSTR_VAL_PWDPROVIDER_CHANGEORDER TEXT("ChangeOrder") +#define REGSTR_PATH_POLICIES TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Policies") +#define REGSTR_PATH_UPDATE TEXT("System\\CurrentControlSet\\Control\\Update") +#define REGSTR_VALUE_ENABLE TEXT("Enable") +#define REGSTR_VALUE_VERBOSE TEXT("Verbose") +#define REGSTR_VALUE_NETPATH TEXT("NetworkPath") +#define REGSTR_VALUE_DEFAULTLOC TEXT("UseDefaultNetLocation") +#define REGSTR_KEY_NETWORK TEXT("Network") +#define REGSTR_KEY_SYSTEM TEXT("System") +#define REGSTR_KEY_PRINTERS TEXT("Printers") +#define REGSTR_KEY_WINOLDAPP TEXT("WinOldApp") +#define REGSTR_VAL_NOFILESHARING TEXT("NoFileSharing") +#define REGSTR_VAL_NOPRINTSHARING TEXT("NoPrintSharing") +#define REGSTR_VAL_NOFILESHARINGCTRL TEXT("NoFileSharingControl") +#define REGSTR_VAL_NOPRINTSHARINGCTRL TEXT("NoPrintSharingControl") +#define REGSTR_VAL_HIDESHAREPWDS TEXT("HideSharePwds") +#define REGSTR_VAL_DISABLEPWDCACHING TEXT("DisablePwdCaching") +#define REGSTR_VAL_ALPHANUMPWDS TEXT("AlphanumPwds") +#define REGSTR_VAL_NETSETUP_DISABLE TEXT("NoNetSetup") +#define REGSTR_VAL_NETSETUP_NOCONFIGPAGE TEXT("NoNetSetupConfigPage") +#define REGSTR_VAL_NETSETUP_NOIDPAGE TEXT("NoNetSetupIDPage") +#define REGSTR_VAL_NETSETUP_NOSECURITYPAGE TEXT("NoNetSetupSecurityPage") +#define REGSTR_VAL_SYSTEMCPL_NOVIRTMEMPAGE TEXT("NoVirtMemPage") +#define REGSTR_VAL_SYSTEMCPL_NODEVMGRPAGE TEXT("NoDevMgrPage") +#define REGSTR_VAL_SYSTEMCPL_NOCONFIGPAGE TEXT("NoConfigPage") +#define REGSTR_VAL_SYSTEMCPL_NOFILESYSPAGE TEXT("NoFileSysPage") +#define REGSTR_VAL_DISPCPL_NODISPCPL TEXT("NoDispCPL") +#define REGSTR_VAL_DISPCPL_NOBACKGROUNDPAGE TEXT("NoDispBackgroundPage") +#define REGSTR_VAL_DISPCPL_NOSCRSAVPAGE TEXT("NoDispScrSavPage") +#define REGSTR_VAL_DISPCPL_NOAPPEARANCEPAGE TEXT("NoDispAppearancePage") +#define REGSTR_VAL_DISPCPL_NOSETTINGSPAGE TEXT("NoDispSettingsPage") +#define REGSTR_VAL_SECCPL_NOSECCPL TEXT("NoSecCPL") +#define REGSTR_VAL_SECCPL_NOPWDPAGE TEXT("NoPwdPage") +#define REGSTR_VAL_SECCPL_NOADMINPAGE TEXT("NoAdminPage") +#define REGSTR_VAL_SECCPL_NOPROFILEPAGE TEXT("NoProfilePage") +#define REGSTR_VAL_PRINTERS_HIDETABS TEXT("NoPrinterTabs") +#define REGSTR_VAL_PRINTERS_NODELETE TEXT("NoDeletePrinter") +#define REGSTR_VAL_PRINTERS_NOADD TEXT("NoAddPrinter") +#define REGSTR_VAL_WINOLDAPP_DISABLED TEXT("Disabled") +#define REGSTR_VAL_WINOLDAPP_NOREALMODE TEXT("NoRealMode") +#define REGSTR_VAL_NOENTIRENETWORK TEXT("NoEntireNetwork") +#define REGSTR_VAL_NOWORKGROUPCONTENTS TEXT("NoWorkgroupContents") +#define REGSTR_VAL_MINPWDLEN TEXT("MinPwdLen") +#define REGSTR_VAL_PWDEXPIRATION TEXT("PwdExpiration") +#define REGSTR_VAL_WIN31PROVIDER TEXT("Win31Provider") +#define REGSTR_VAL_DISABLEREGTOOLS TEXT("DisableRegistryTools") +#define REGSTR_PATH_WINLOGON TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Winlogon") +#define REGSTR_VAL_LEGALNOTICECAPTION TEXT("LegalNoticeCaption") +#define REGSTR_VAL_LEGALNOTICETEXT TEXT("LegalNoticeText") +#define REGSTR_VAL_RESTRICTRUN TEXT("RestrictRun") +#define REGSTR_KEY_POL_USERS TEXT("Users") +#define REGSTR_KEY_POL_COMPUTERS TEXT("Computers") +#define REGSTR_KEY_POL_USERGROUPS TEXT("UserGroups") +#define REGSTR_KEY_POL_DEFAULT TEXT(".default") +#define REGSTR_KEY_POL_USERGROUPDATA TEXT("GroupData\\UserGroups\\Priority") +#define REGSTR_PATH_TIMEZONE TEXT("System\\CurrentControlSet\\Control\\TimeZoneInformation") +#define REGSTR_VAL_TZBIAS TEXT("Bias") +#define REGSTR_VAL_TZDLTBIAS TEXT("DaylightBias") +#define REGSTR_VAL_TZSTDBIAS TEXT("StandardBias") +#define REGSTR_VAL_TZACTBIAS TEXT("ActiveTimeBias") +#define REGSTR_VAL_TZDLTFLAG TEXT("DaylightFlag") +#define REGSTR_VAL_TZSTDSTART TEXT("StandardStart") +#define REGSTR_VAL_TZDLTSTART TEXT("DaylightStart") +#define REGSTR_VAL_TZDLTNAME TEXT("DaylightName") +#define REGSTR_VAL_TZSTDNAME TEXT("StandardName") +#define REGSTR_VAL_TZNOCHANGESTART TEXT("NoChangeStart") +#define REGSTR_VAL_TZNOCHANGEEND TEXT("NoChangeEnd") +#define REGSTR_VAL_TZNOAUTOTIME TEXT("DisableAutoDaylightTimeSet") +#define REGSTR_PATH_FLOATINGPOINTPROCESSOR TEXT("HARDWARE\\DESCRIPTION\\System\\FloatingPointProcessor") +#define REGSTR_PATH_FLOATINGPOINTPROCESSOR0 TEXT("HARDWARE\\DESCRIPTION\\System\\FloatingPointProcessor\\0") +#define REGSTR_PATH_COMPUTRNAME TEXT("System\\CurrentControlSet\\Control\\ComputerName\\ComputerName") +#define REGSTR_VAL_COMPUTRNAME TEXT("ComputerName") +#define REGSTR_PATH_SHUTDOWN TEXT("System\\CurrentControlSet\\Control\\Shutdown") +#define REGSTR_VAL_FORCEREBOOT TEXT("ForceReboot") +#define REGSTR_VAL_SETUPPROGRAMRAN TEXT("SetupProgramRan") +#define REGSTR_VAL_DOES_POLLING TEXT("PollingSupportNeeded") +#define REGSTR_PATH_KNOWNDLLS TEXT("System\\CurrentControlSet\\Control\\SessionManager\\KnownDLLs") +#define REGSTR_PATH_KNOWN16DLLS TEXT("System\\CurrentControlSet\\Control\\SessionManager\\Known16DLLs") +#define REGSTR_PATH_CHECKVERDLLS TEXT("System\\CurrentControlSet\\Control\\SessionManager\\CheckVerDLLs") +#define REGSTR_PATH_WARNVERDLLS TEXT("System\\CurrentControlSet\\Control\\SessionManager\\WarnVerDLLs") +#define REGSTR_PATH_HACKINIFILE TEXT("System\\CurrentControlSet\\Control\\SessionManager\\HackIniFiles") +#define REGSTR_PATH_CHECKBADAPPS TEXT("System\\CurrentControlSet\\Control\\SessionManager\\CheckBadApps") +#define REGSTR_PATH_APPPATCH TEXT("System\\CurrentControlSet\\Control\\SessionManager\\AppPatches") +#define REGSTR_PATH_KNOWNVXDS TEXT("System\\CurrentControlSet\\Control\\SessionManager\\KnownVxDs") +#define REGSTR_VAL_UNINSTALLER_DISPLAYNAME TEXT("DisplayName") +#define REGSTR_VAL_UNINSTALLER_COMMANDLINE TEXT("UninstallString") +#define REGSTR_PATH_DESKTOP REGSTR_PATH_SCREENSAVE +#define REGSTR_PATH_MOUSE TEXT("Control Panel\\Mouse") +#define REGSTR_PATH_KEYBOARD TEXT("Control Panel\\Keyboard") +#define REGSTR_PATH_COLORS TEXT("Control Panel\\Colors") +#define REGSTR_PATH_SOUND TEXT("Control Panel\\Sound") +#define REGSTR_PATH_METRICS TEXT("Control Panel\\Desktop\\WindowMetrics") +#define REGSTR_PATH_ICONS TEXT("Control Panel\\Icons") +#define REGSTR_PATH_CURSORS TEXT("Control Panel\\Cursors") +#define REGSTR_PATH_CHECKDISK TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Check Drive") +#define REGSTR_PATH_CHECKDISKSET TEXT("Settings") +#define REGSTR_PATH_CHECKDISKUDRVS TEXT("NoUnknownDDErrDrvs") +#define REGSTR_PATH_FAULT TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Fault") +#define REGSTR_VAL_FAULT_LOGFILE TEXT("LogFile") +#define REGSTR_PATH_AEDEBUG TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug") +#define REGSTR_VAL_AEDEBUG_DEBUGGER TEXT("Debugger") +#define REGSTR_VAL_AEDEBUG_AUTO TEXT("Auto") +#define REGSTR_PATH_GRPCONV TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\GrpConv") +#define REGSTR_VAL_REGITEMDELETEMESSAGE TEXT("Removal Message") +#define REGSTR_PATH_LASTCHECK TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\LastCheck") +#define REGSTR_PATH_LASTOPTIMIZE TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\LastOptimize") +#define REGSTR_PATH_LASTBACKUP TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\LastBackup") +#define REGSTR_PATH_CHKLASTCHECK TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Check Drive\\LastCheck") +#define REGSTR_PATH_CHKLASTSURFAN TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Check Drive\\LastSurfaceAnalysis") +#define DTRESULTOK 0 +#define DTRESULTFIX 1 +#define DTRESULTPROB 2 +#define DTRESULTPART 3 +#define REGSTR_KEY_SHARES TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Network\\LanMan") +#define REGSTR_VAL_SHARES_FLAGS TEXT("Flags") +#define REGSTR_VAL_SHARES_TYPE TEXT("Type") +#define REGSTR_VAL_SHARES_PATH TEXT("Path") +#define REGSTR_VAL_SHARES_REMARK TEXT("Remark") +#define REGSTR_VAL_SHARES_RW_PASS TEXT("Parm1") +#define REGSTR_VAL_SHARES_RO_PASS TEXT("Parm2") +#define REGSTR_PATH_PRINT TEXT("System\\CurrentControlSet\\Control\\Print") +#define REGSTR_PATH_PRINTERS TEXT("System\\CurrentControlSet\\Control\\Print\\Printers") +#define REGSTR_PATH_PROVIDERS TEXT("System\\CurrentControlSet\\Control\\Print\\Providers") +#define REGSTR_PATH_MONITORS TEXT("System\\CurrentControlSet\\Control\\Print\\Monitors") +#define REGSTR_PATH_ENVIRONMENTS TEXT("System\\CurrentControlSet\\Control\\Print\\Environments") +#define REGSTR_VAL_START_ON_BOOT TEXT("StartOnBoot") +#define REGSTR_VAL_PRINTERS_MASK TEXT("PrintersMask") +#define REGSTR_VAL_DOS_SPOOL_MASK TEXT("DOSSpoolMask") +#define REGSTR_KEY_CURRENT_ENV TEXT("\\Windows 4.0") +#define REGSTR_KEY_DRIVERS TEXT("\\Drivers") +#define REGSTR_KEY_PRINT_PROC TEXT("\\Print Processors") +#define REGSTR_PATH_EVENTLABELS TEXT("AppEvents\\EventLabels") +#define REGSTR_PATH_SCHEMES TEXT("AppEvents\\Schemes") +#define REGSTR_PATH_APPS REGSTR_PATH_SCHEMES TEXT("\\Apps") +#define REGSTR_PATH_APPS_DEFAULT REGSTR_PATH_SCHEMES TEXT("\\Apps\\.Default") +#define REGSTR_PATH_NAMES REGSTR_PATH_SCHEMES TEXT("\\Names") +#define REGSTR_PATH_MULTIMEDIA REGSTR_PATH_SETUP TEXT("\\Multimedia") +#define REGSTR_PATH_MULTIMEDIA_AUDIO TEXT("Software\\Microsoft\\Multimedia\\Audio") +#define REGSTR_PATH_MEDIARESOURCES REGSTR_PATH_CURRENT_CONTROL_SET TEXT("\\MediaResources") +#define REGSTR_PATH_MEDIAPROPERTIES REGSTR_PATH_CURRENT_CONTROL_SET TEXT("\\MediaProperties") +#define REGSTR_PATH_PRIVATEPROPERTIES REGSTR_PATH_MEDIAPROPERTIES TEXT("\\PrivateProperties") +#define REGSTR_PATH_PUBLICPROPERTIES REGSTR_PATH_MEDIAPROPERTIES TEXT("\\PublicProperties") +#define REGSTR_PATH_JOYOEM REGSTR_PATH_PRIVATEPROPERTIES TEXT("\\Joystick\\OEM") +#define REGSTR_PATH_JOYCONFIG REGSTR_PATH_MEDIARESOURCES TEXT("\\Joystick") +#define REGSTR_KEY_JOYCURR TEXT("CurrentJoystickSettings") +#define REGSTR_KEY_JOYSETTINGS TEXT("JoystickSettings") +#define REGSTR_VAL_JOYUSERVALUES TEXT("JoystickUserValues") +#define REGSTR_VAL_JOYCALLOUT TEXT("JoystickCallout") +#define REGSTR_VAL_JOYNCONFIG TEXT("Joystick%dConfiguration") +#define REGSTR_VAL_JOYNOEMNAME TEXT("Joystick%dOEMName") +#define REGSTR_VAL_JOYNOEMCALLOUT TEXT("Joystick%dOEMCallout") +#define REGSTR_VAL_JOYOEMCALLOUT TEXT("OEMCallout") +#define REGSTR_VAL_JOYOEMNAME TEXT("OEMName") +#define REGSTR_VAL_JOYOEMDATA TEXT("OEMData") +#define REGSTR_VAL_JOYOEMXYLABEL TEXT("OEMXYLabel") +#define REGSTR_VAL_JOYOEMZLABEL TEXT("OEMZLabel") +#define REGSTR_VAL_JOYOEMRLABEL TEXT("OEMRLabel") +#define REGSTR_VAL_JOYOEMPOVLABEL TEXT("OEMPOVLabel") +#define REGSTR_VAL_JOYOEMULABEL TEXT("OEMULabel") +#define REGSTR_VAL_JOYOEMVLABEL TEXT("OEMVLabel") +#define REGSTR_VAL_JOYOEMTESTMOVEDESC TEXT("OEMTestMoveDesc") +#define REGSTR_VAL_JOYOEMTESTBUTTONDESC TEXT("OEMTestButtonDesc") +#define REGSTR_VAL_JOYOEMTESTMOVECAP TEXT("OEMTestMoveCap") +#define REGSTR_VAL_JOYOEMTESTBUTTONCAP TEXT("OEMTestButtonCap") +#define REGSTR_VAL_JOYOEMTESTWINCAP TEXT("OEMTestWinCap") +#define REGSTR_VAL_JOYOEMCALCAP TEXT("OEMCalCap") +#define REGSTR_VAL_JOYOEMCALWINCAP TEXT("OEMCalWinCap") +#define REGSTR_VAL_JOYOEMCAL1 TEXT("OEMCal1") +#define REGSTR_VAL_JOYOEMCAL2 TEXT("OEMCal2") +#define REGSTR_VAL_JOYOEMCAL3 TEXT("OEMCal3") +#define REGSTR_VAL_JOYOEMCAL4 TEXT("OEMCal4") +#define REGSTR_VAL_JOYOEMCAL5 TEXT("OEMCal5") +#define REGSTR_VAL_JOYOEMCAL6 TEXT("OEMCal6") +#define REGSTR_VAL_JOYOEMCAL7 TEXT("OEMCal7") +#define REGSTR_VAL_JOYOEMCAL8 TEXT("OEMCal8") +#define REGSTR_VAL_JOYOEMCAL9 TEXT("OEMCal9") +#define REGSTR_VAL_JOYOEMCAL10 TEXT("OEMCal10") +#define REGSTR_VAL_JOYOEMCAL11 TEXT("OEMCal11") +#define REGSTR_VAL_JOYOEMCAL12 TEXT("OEMCal12") +#ifndef NEC_98 +#define REGSTR_KEY_ISAENUM TEXT("ISAPnP") +#define REGSTR_KEY_EISAENUM TEXT("EISA") +#define REGSTR_VAL_EISA_RANGES TEXT("EISARanges") +#define REGSTR_VAL_EISA_FUNCTIONS TEXT("EISAFunctions") +#define REGSTR_VAL_EISA_FUNCTIONS_MASK TEXT("EISAFunctionsMask") +#define REGSTR_VAL_EISA_FLAGS TEXT("EISAFlags") +#define REGSTR_VAL_EISA_SIMULATE_INT15 TEXT("EISASimulateInt15") +#else +#define REGSTR_KEY_ISAENUM TEXT("C98PnP") +#define REGSTR_KEY_EISAENUM TEXT("NESA") +#define REGSTR_VAL_EISA_RANGES TEXT("NESARanges") +#define REGSTR_VAL_EISA_FUNCTIONS TEXT("NESAFunctions") +#define REGSTR_VAL_EISA_FUNCTIONS_MASK TEXT("NESAFunctionsMask") +#define REGSTR_VAL_EISA_FLAGS TEXT("NESAFlags") +#define REGSTR_VAL_EISA_SIMULATE_INT15 TEXT("NESASimulateInt15") +#endif +typedef struct _DSKTLSYSTEMTIME { + WORD wYear; + WORD wMonth; + WORD wDayOfWeek; + WORD wDay; + WORD wHour; + WORD wMinute; + WORD wSecond; + WORD wMilliseconds; + WORD wResult; +} DSKTLSYSTEMTIME,*PDSKTLSYSTEMTIME,*LPDSKTLSYSTEMTIME; +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/richedit.h b/reactos/w32api/include/richedit.h new file mode 100644 index 00000000000..580b51191d9 --- /dev/null +++ b/reactos/w32api/include/richedit.h @@ -0,0 +1,513 @@ +#ifndef _RICHEDIT_H +#define _RICHEDIT_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#pragma pack(push,4) + +#ifdef UNICODE +#define RICHEDIT_CLASS L"RichEdit20W" +#else +#define RICHEDIT_CLASS "RichEdit20A" +#endif +#define RICHEDIT_CLASS10A "RICHEDIT" +#define CF_RTF TEXT("Rich Text Format") +#define CF_RTFNOOBJS TEXT("Rich Text Format Without Objects") +#define CF_RETEXTOBJ TEXT("RichEdit Text and Objects") +#define CFM_BOLD 1 +#define CFM_ITALIC 2 +#define CFM_UNDERLINE 4 +#define CFM_STRIKEOUT 8 +#define CFM_PROTECTED 16 +#define CFM_LINK 32 +#define CFM_SIZE 0x80000000 +#define CFM_COLOR 0x40000000 +#define CFM_FACE 0x20000000 +#define CFM_OFFSET 0x10000000 +#define CFM_CHARSET 0x08000000 +#define CFM_SUBSCRIPT 0x00030000 +#define CFM_SUPERSCRIPT 0x00030000 +#define CFM_EFFECTS (CFM_BOLD | CFM_ITALIC | CFM_UNDERLINE | CFM_COLOR | CFM_STRIKEOUT | CFE_PROTECTED | CFM_LINK) +#define CFE_BOLD 1 +#define CFE_ITALIC 2 +#define CFE_UNDERLINE 4 +#define CFE_STRIKEOUT 8 +#define CFE_PROTECTED 16 +#define CFE_AUTOCOLOR 0x40000000 +#define CFE_SUBSCRIPT 0x00010000 +#define CFE_SUPERSCRIPT 0x00020000 +#define IMF_FORCENONE 1 +#define IMF_FORCEENABLE 2 +#define IMF_FORCEDISABLE 4 +#define IMF_CLOSESTATUSWINDOW 8 +#define IMF_VERTICAL 32 +#define IMF_FORCEACTIVE 64 +#define IMF_FORCEINACTIVE 128 +#define IMF_FORCEREMEMBER 256 +#define SEL_EMPTY 0 +#define SEL_TEXT 1 +#define SEL_OBJECT 2 +#define SEL_MULTICHAR 4 +#define SEL_MULTIOBJECT 8 +#define MAX_TAB_STOPS 32 +#define PFM_ALIGNMENT 8 +#define PFM_NUMBERING 32 +#define PFM_OFFSET 4 +#define PFM_OFFSETINDENT 0x80000000 +#define PFM_RIGHTINDENT 2 +#define PFM_STARTINDENT 1 +#define PFM_TABSTOPS 16 +#define PFM_BORDER 2048 +#define PFM_LINESPACING 256 +#define PFM_NUMBERINGSTART 32768 +#define PFM_NUMBERINGSTYLE 8192 +#define PFM_NUMBERINGTAB 16384 +#define PFM_SHADING 4096 +#define PFM_SPACEAFTER 128 +#define PFM_SPACEBEFORE 64 +#define PFM_STYLE 1024 +#define PFM_DONOTHYPHEN 4194304 +#define PFM_KEEP 131072 +#define PFM_KEEPNEXT 262144 +#define PFM_NOLINENUMBER 1048576 +#define PFM_NOWIDOWCONTROL 2097152 +#define PFM_PAGEBREAKBEFORE 524288 +#define PFM_RTLPARA 65536 +#define PFM_SIDEBYSIDE 8388608 +#define PFM_TABLE 1073741824 +#define PFN_BULLET 1 +#define PFE_DONOTHYPHEN 64 +#define PFE_KEEP 2 +#define PFE_KEEPNEXT 4 +#define PFE_NOLINENUMBER 16 +#define PFE_NOWIDOWCONTROL 32 +#define PFE_PAGEBREAKBEFORE 8 +#define PFE_RTLPARA 1 +#define PFE_SIDEBYSIDE 128 +#define PFE_TABLE 16384 +#define PFA_LEFT 1 +#define PFA_RIGHT 2 +#define PFA_CENTER 3 +#define PFA_JUSTIFY 4 +#define PFA_FULL_INTERWORD 4 +#define SF_TEXT 1 +#define SF_RTF 2 +#define SF_RTFNOOBJS 3 +#define SF_TEXTIZED 4 +#define SF_UNICODE 16 +#define SF_USECODEPAGE 32 +#define SF_NCRFORNONASCII 64 +#define SF_RTFVAL 0x0700 +#define SFF_PWD 0x0800 +#define SFF_KEEPDOCINFO 0x1000 +#define SFF_PERSISTVIEWSCALE 0x2000 +#define SFF_PLAINRTF 0x4000 +#define SFF_SELECTION 0x8000 +#define WB_CLASSIFY 3 +#define WB_MOVEWORDLEFT 4 +#define WB_MOVEWORDRIGHT 5 +#define WB_LEFTBREAK 6 +#define WB_RIGHTBREAK 7 +#define WB_MOVEWORDPREV 4 +#define WB_MOVEWORDNEXT 5 +#define WB_PREVBREAK 6 +#define WB_NEXTBREAK 7 +#define WBF_WORDWRAP 16 +#define WBF_WORDBREAK 32 +#define WBF_OVERFLOW 64 +#define WBF_LEVEL1 128 +#define WBF_LEVEL2 256 +#define WBF_CUSTOM 512 +#define ES_DISABLENOSCROLL 8192 +#define ES_EX_NOCALLOLEINIT 16777216 +#define ES_NOIME 524288 +#define ES_NOOLEDRAGDROP 8 +#define ES_SAVESEL 32768 +#define ES_SELECTIONBAR 16777216 +#define ES_SELFIME 262144 +#define ES_SUNKEN 16384 +#define ES_VERTICAL 4194304 +#define EM_CANPASTE (WM_USER+50) +#define EM_DISPLAYBAND (WM_USER+51) +#define EM_EXGETSEL (WM_USER+52) +#define EM_EXLIMITTEXT (WM_USER+53) +#define EM_EXLINEFROMCHAR (WM_USER+54) +#define EM_EXSETSEL (WM_USER+55) +#define EM_FINDTEXT (WM_USER+56) +#define EM_FORMATRANGE (WM_USER+57) +#define EM_GETCHARFORMAT (WM_USER+58) +#define EM_GETEVENTMASK (WM_USER+59) +#define EM_GETOLEINTERFACE (WM_USER+60) +#define EM_GETPARAFORMAT (WM_USER+61) +#define EM_GETSELTEXT (WM_USER+62) +#define EM_HIDESELECTION (WM_USER+63) +#define EM_PASTESPECIAL (WM_USER+64) +#define EM_REQUESTRESIZE (WM_USER+65) +#define EM_SELECTIONTYPE (WM_USER+66) +#define EM_SETBKGNDCOLOR (WM_USER+67) +#define EM_SETCHARFORMAT (WM_USER+68) +#define EM_SETEVENTMASK (WM_USER+69) +#define EM_SETOLECALLBACK (WM_USER+70) +#define EM_SETPARAFORMAT (WM_USER+71) +#define EM_SETTARGETDEVICE (WM_USER+72) +#define EM_STREAMIN (WM_USER+73) +#define EM_STREAMOUT (WM_USER+74) +#define EM_GETTEXTRANGE (WM_USER+75) +#define EM_FINDWORDBREAK (WM_USER+76) +#define EM_SETOPTIONS (WM_USER+77) +#define EM_GETOPTIONS (WM_USER+78) +#define EM_FINDTEXTEX (WM_USER+79) +#define EM_GETWORDBREAKPROCEX (WM_USER+80) +#define EM_SETWORDBREAKPROCEX (WM_USER+81) +/* RichEdit 2.0 messages */ +#define EM_SETUNDOLIMIT (WM_USER+82) +#define EM_REDO (WM_USER+84) +#define EM_CANREDO (WM_USER+85) +#define EM_GETUNDONAME (WM_USER+86) +#define EM_GETREDONAME (WM_USER+87) +#define EM_STOPGROUPTYPING (WM_USER+88) +#define EM_SETTEXTMODE (WM_USER+89) +#define EM_GETTEXTMODE (WM_USER+90) +#define EM_AUTOURLDETECT (WM_USER+91) +#define EM_GETAUTOURLDETECT (WM_USER + 92) +#define EM_SETPALETTE (WM_USER + 93) +#define EM_GETTEXTEX (WM_USER+94) +#define EM_GETTEXTLENGTHEX (WM_USER+95) +#define EM_SHOWSCROLLBAR (WM_USER+96) +#define EM_SETTEXTEX (WM_USER + 97) +#define EM_SETPUNCTUATION (WM_USER + 100) +#define EM_GETPUNCTUATION (WM_USER + 101) +#define EM_SETWORDWRAPMODE (WM_USER + 102) +#define EM_GETWORDWRAPMODE (WM_USER + 103) +#define EM_SETIMECOLOR (WM_USER + 104) +#define EM_GETIMECOLOR (WM_USER + 105) +#define EM_SETIMEOPTIONS (WM_USER + 106) +#define EM_GETIMEOPTIONS (WM_USER + 107) +#define EM_SETLANGOPTIONS (WM_USER+120) +#define EM_GETLANGOPTIONS (WM_USER+121) +#define EM_GETIMECOMPMODE (WM_USER+122) +#define EM_FINDTEXTW (WM_USER + 123) +#define EM_FINDTEXTEXW (WM_USER + 124) +#define EM_RECONVERSION (WM_USER + 125) +#define EM_SETBIDIOPTIONS (WM_USER + 200) +#define EM_GETBIDIOPTIONS (WM_USER + 201) +#define EM_SETTYPOGRAPHYOPTIONS (WM_USER+202) +#define EM_GETTYPOGRAPHYOPTIONS (WM_USER+203) +#define EM_SETEDITSTYLE (WM_USER + 204) +#define EM_GETEDITSTYLE (WM_USER + 205) +#define EM_GETSCROLLPOS (WM_USER+221) +#define EM_SETSCROLLPOS (WM_USER+222) +#define EM_SETFONTSIZE (WM_USER+223) +#define EM_GETZOOM (WM_USER+224) +#define EM_SETZOOM (WM_USER+225) + +#define EN_CORRECTTEXT 1797 +#define EN_DROPFILES 1795 +#define EN_IMECHANGE 1799 +#define EN_LINK 1803 +#define EN_MSGFILTER 1792 +#define EN_OLEOPFAILED 1801 +#define EN_PROTECTED 1796 +#define EN_REQUESTRESIZE 1793 +#define EN_SAVECLIPBOARD 1800 +#define EN_SELCHANGE 1794 +#define EN_STOPNOUNDO 1798 +#define ENM_NONE 0 +#define ENM_CHANGE 1 +#define ENM_CORRECTTEXT 4194304 +#define ENM_DRAGDROPDONE 16 +#define ENM_DROPFILES 1048576 +#define ENM_IMECHANGE 8388608 +#define ENM_KEYEVENTS 65536 +#define ENM_LANGCHANGE 16777216 +#define ENM_LINK 67108864 +#define ENM_MOUSEEVENTS 131072 +#define ENM_OBJECTPOSITIONS 33554432 +#define ENM_PROTECTED 2097152 +#define ENM_REQUESTRESIZE 262144 +#define ENM_SCROLL 4 +#define ENM_SCROLLEVENTS 8 +#define ENM_SELCHANGE 524288 +#define ENM_UPDATE 2 +#define ECO_AUTOWORDSELECTION 1 +#define ECO_AUTOVSCROLL 64 +#define ECO_AUTOHSCROLL 128 +#define ECO_NOHIDESEL 256 +#define ECO_READONLY 2048 +#define ECO_WANTRETURN 4096 +#define ECO_SAVESEL 0x8000 +#define ECO_SELECTIONBAR 0x1000000 +#define ECO_VERTICAL 0x400000 +#define ECOOP_SET 1 +#define ECOOP_OR 2 +#define ECOOP_AND 3 +#define ECOOP_XOR 4 +#define SCF_DEFAULT 0 +#define SCF_SELECTION 1 +#define SCF_WORD 2 +#define SCF_ALL 4 +#define SCF_USEUIRULES 8 +#define TM_PLAINTEXT 1 +#define TM_RICHTEXT 2 +#define TM_SINGLELEVELUNDO 4 +#define TM_MULTILEVELUNDO 8 +#define TM_SINGLECODEPAGE 16 +#define TM_MULTICODEPAGE 32 +#define GT_DEFAULT 0 +#define GT_USECRLF 1 +#define yHeightCharPtsMost 1638 +#define lDefaultTab 720 + +typedef struct _charformat { + UINT cbSize; + DWORD dwMask; + DWORD dwEffects; + LONG yHeight; + LONG yOffset; + COLORREF crTextColor; + BYTE bCharSet; + BYTE bPitchAndFamily; + char szFaceName[LF_FACESIZE]; +} CHARFORMATA; +typedef struct _charformatw { + UINT cbSize; + DWORD dwMask; + DWORD dwEffects; + LONG yHeight; + LONG yOffset; + COLORREF crTextColor; + BYTE bCharSet; + BYTE bPitchAndFamily; + WCHAR szFaceName[LF_FACESIZE]; +} CHARFORMATW; +typedef struct _charformat2a { + UINT cbSize; + DWORD dwMask; + DWORD dwEffects; + LONG yHeight; + LONG yOffset; + COLORREF crTextColor; + BYTE bCharSet; + BYTE bPitchAndFamily; + char szFaceName[LF_FACESIZE]; + WORD wWeight; + SHORT sSpacing; + COLORREF crBackColor; + LCID lcid; + DWORD dwReserved; + SHORT sStyle; + WORD wKerning; + BYTE bUnderlineType; + BYTE bAnimation; + BYTE bRevAuthor; +} CHARFORMAT2A; +typedef struct _charformat2w { + UINT cbSize; + DWORD dwMask; + DWORD dwEffects; + LONG yHeight; + LONG yOffset; + COLORREF crTextColor; + BYTE bCharSet; + BYTE bPitchAndFamily; + WCHAR szFaceName[LF_FACESIZE]; + WORD wWeight; + SHORT sSpacing; + COLORREF crBackColor; + LCID lcid; + DWORD dwReserved; + SHORT sStyle; + WORD wKerning; + BYTE bUnderlineType; + BYTE bAnimation; + BYTE bRevAuthor; +} CHARFORMAT2W; +typedef struct _charrange { + LONG cpMin; + LONG cpMax; +} CHARRANGE; +typedef struct _compcolor { + COLORREF crText; + COLORREF crBackground; + DWORD dwEffects; +} COMPCOLOR; +typedef DWORD(CALLBACK *EDITSTREAMCALLBACK)(DWORD,PBYTE,LONG,LONG*); +typedef struct _editstream { + DWORD dwCookie; + DWORD dwError; + EDITSTREAMCALLBACK pfnCallback; +} EDITSTREAM; +typedef struct _encorrecttext { + NMHDR nmhdr; + CHARRANGE chrg; + WORD seltyp; +} ENCORRECTTEXT; +typedef struct _endropfiles { + NMHDR nmhdr; + HANDLE hDrop; + LONG cp; + BOOL fProtected; +} ENDROPFILES; +typedef struct _enlink { + NMHDR nmhdr; + UINT msg; + WPARAM wParam; + LPARAM lParam; + CHARRANGE chrg; +} ENLINK; +typedef struct { + NMHDR nmhdr; + LONG iob; + LONG lOper; + HRESULT hr; +} ENOLEOPFAILED; +typedef struct _enprotected { + NMHDR nmhdr; + UINT msg; + WPARAM wParam; + LPARAM lParam; + CHARRANGE chrg; +} ENPROTECTED,*LPENPROTECTED; +typedef struct _ensaveclipboard { + NMHDR nmhdr; + LONG cObjectCount; + LONG cch; +} ENSAVECLIPBOARD; +typedef struct _findtextA { + CHARRANGE chrg; + LPSTR lpstrText; +} FINDTEXTA; +typedef struct _findtextW { + CHARRANGE chrg; + LPWSTR lpstrText; +} FINDTEXTW; +typedef struct _findtextexA { + CHARRANGE chrg; + LPSTR lpstrText; + CHARRANGE chrgText; +} FINDTEXTEXA; +typedef struct _findtextexW { + CHARRANGE chrg; + LPWSTR lpstrText; + CHARRANGE chrgText; +} FINDTEXTEXW; +typedef struct _formatrange { + HDC hdc; + HDC hdcTarget; + RECT rc; + RECT rcPage; + CHARRANGE chrg; +} FORMATRANGE; +typedef struct _msgfilter { + NMHDR nmhdr; + UINT msg; + WPARAM wParam; + LPARAM lParam; +} MSGFILTER; +typedef struct _paraformat { + UINT cbSize; + DWORD dwMask; + WORD wNumbering; + WORD wReserved; + LONG dxStartIndent; + LONG dxRightIndent; + LONG dxOffset; + WORD wAlignment; + SHORT cTabCount; + LONG rgxTabs[MAX_TAB_STOPS]; +} PARAFORMAT; +typedef struct _paraformat2 { + UINT cbSize; + DWORD dwMask; + WORD wNumbering; + WORD wEffects; + LONG dxStartIndent; + LONG dxRightIndent; + LONG dxOffset; + WORD wAlignment; + SHORT cTabCount; + LONG rgxTabs[MAX_TAB_STOPS]; + LONG dySpaceBefore; + LONG dySpaceAfter; + LONG dyLineSpacing; + SHORT sStype; + BYTE bLineSpacingRule; + BYTE bOutlineLevel; + WORD wShadingWeight; + WORD wShadingStyle; + WORD wNumberingStart; + WORD wNumberingStyle; + WORD wNumberingTab; + WORD wBorderSpace; + WORD wBorderWidth; + WORD wBorders; +} PARAFORMAT2; +typedef struct _selchange { + NMHDR nmhdr; + CHARRANGE chrg; + WORD seltyp; +} SELCHANGE; +typedef struct _textrange { + CHARRANGE chrg; + LPSTR lpstrText; +} TEXTRANGEA; +typedef struct _textrangew { + CHARRANGE chrg; + LPWSTR lpstrText; +} TEXTRANGEW; +typedef struct _reqresize { + NMHDR nmhdr; + RECT rc; +} REQRESIZE; +typedef struct _repastespecial { + DWORD dwAspect; + DWORD dwParam; +} REPASTESPECIAL; +typedef struct _punctuation { + UINT iSize; + LPSTR szPunctuation; +} PUNCTUATION; +typedef struct _gettextex { + DWORD cb; + DWORD flags; + UINT codepage; + LPCSTR lpDefaultChar; + LPBOOL lpUsedDefaultChar; +} GETTEXTEX; +typedef LONG (*EDITWORDBREAKPROCEX)(char*,LONG,BYTE,INT); +/* Defines for EM_SETTYPOGRAPHYOPTIONS */ +#define TO_ADVANCEDTYPOGRAPHY 1 +#define TO_SIMPLELINEBREAK 2 +/* Defines for GETTEXTLENGTHEX */ +#define GTL_DEFAULT 0 +#define GTL_USECRLF 1 +#define GTL_PRECISE 2 +#define GTL_CLOSE 4 +#define GTL_NUMCHARS 8 +#define GTL_NUMBYTES 16 +typedef struct _gettextlengthex { + DWORD flags; + UINT codepage; +} GETTEXTLENGTHEX; +#ifdef UNICODE +typedef CHARFORMATW CHARFORMAT; +typedef CHARFORMAT2W CHARFORMAT2; +typedef FINDTEXTW FINDTEXT; +typedef FINDTEXTEXW FINDTEXTEX; +typedef TEXTRANGEW TEXTRANGE; +#else +typedef CHARFORMATA CHARFORMAT; +typedef CHARFORMAT2A CHARFORMAT2; +typedef FINDTEXTA FINDTEXT; +typedef FINDTEXTEXA FINDTEXTEX; +typedef TEXTRANGEA TEXTRANGE; +#endif +#pragma pack(pop) +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/richole.h b/reactos/w32api/include/richole.h new file mode 100644 index 00000000000..da2e336f867 --- /dev/null +++ b/reactos/w32api/include/richole.h @@ -0,0 +1,107 @@ +#ifndef _RICHOLE_H +#define _RICHOLE_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#pragma pack(push,4) +#define REO_GETOBJ_NO_INTERFACES 0 +#define REO_GETOBJ_POLEOBJ 1 +#define REO_GETOBJ_PSTG 2 +#define REO_GETOBJ_POLESITE 4 +#define REO_GETOBJ_ALL_INTERFACES 7 +#define REO_CP_SELECTION ((ULONG)-1) +#define REO_IOB_SELECTION ((ULONG)-1) +#define REO_IOB_USE_CP ((ULONG)-2) +#define REO_NULL 0 +#define REO_READWRITEMASK 0x3FL +#define REO_DONTNEEDPALETTE 32 +#define REO_BLANK 16 +#define REO_DYNAMICSIZE 8 +#define REO_INVERTEDSELECT 4 +#define REO_BELOWBASELINE 2 +#define REO_RESIZABLE 1 +#define REO_LINK 0x80000000 +#define REO_STATIC 0x40000000 +#define REO_SELECTED 0x08000000 +#define REO_OPEN 0x4000000 +#define REO_INPLACEACTIVE 0x2000000 +#define REO_HILITED 0x1000000 +#define REO_LINKAVAILABLE 0x800000 +#define REO_GETMETAFILE 0x400000 +#define RECO_PASTE 0 +#define RECO_DROP 1 +#define RECO_COPY 2 +#define RECO_CUT 3 +#define RECO_DRAG 4 + +extern const GUID IID_IRichEditOle; +extern const GUID IID_IRichEditOleCallback; +#ifndef INITGUID +typedef struct _reobject { + DWORD cbStruct; + LONG cp; + CLSID clsid; + LPOLEOBJECT poleobj; + LPSTORAGE pstg; + LPOLECLIENTSITE polesite; + SIZEL sizel; + DWORD dvaspect; + DWORD dwFlags; + DWORD dwUser; +} REOBJECT; + +#undef INTERFACE +#define INTERFACE IRichEditOle +DECLARE_INTERFACE_(IRichEditOle, IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetClientSite)(THIS_ LPOLECLIENTSITE*) PURE; + STDMETHOD_(LONG,GetObjectCount)(THIS) PURE; + STDMETHOD_(LONG,GetLinkCount)(THIS) PURE; + STDMETHOD(GetObject)(THIS_ LONG, REOBJECT*,DWORD) PURE; + STDMETHOD(InsertObject)(THIS_ REOBJECT*) PURE; + STDMETHOD(ConvertObject)(THIS_ LONG,REFCLSID,LPCSTR) PURE; + STDMETHOD(ActivateAs)(THIS_ REFCLSID,REFCLSID) PURE; + STDMETHOD(SetHostNames)(THIS_ LPCSTR,LPCSTR) PURE; + STDMETHOD(SetLinkAvailable)(THIS_ LONG,BOOL) PURE; + STDMETHOD(SetDvaspect)(THIS_ LONG,DWORD) PURE; + STDMETHOD(HandsOffStorage)(THIS_ LONG) PURE; + STDMETHOD(SaveCompleted)(THIS_ LONG,LPSTORAGE) PURE; + STDMETHOD(InPlaceDeactivate)(THIS) PURE; + STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL) PURE; + STDMETHOD(GetClipboardData)(THIS_ CHARRANGE*,DWORD,LPDATAOBJECT*) PURE; + STDMETHOD(ImportDataObject)(THIS_ LPDATAOBJECT,CLIPFORMAT,HGLOBAL) PURE; +}; +typedef IRichEditOle *LPRICHEDITOLE; + +#undef INTERFACE +#define INTERFACE IRichEditOleCallback +DECLARE_INTERFACE_(IRichEditOleCallback, IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetNewStorage)(THIS_ LPSTORAGE*) PURE; + STDMETHOD(GetInPlaceContext)(THIS_ LPOLEINPLACEFRAME*,LPOLEINPLACEUIWINDOW*,LPOLEINPLACEFRAMEINFO) PURE; + STDMETHOD(ShowContainerUI)(THIS_ BOOL) PURE; + STDMETHOD(QueryInsertObject)(THIS_ LPCLSID,LPSTORAGE,LONG) PURE; + STDMETHOD(DeleteObject)(THIS_ LPOLEOBJECT) PURE; + STDMETHOD(QueryAcceptData) (THIS_ LPDATAOBJECT,CLIPFORMAT*,DWORD,BOOL,HGLOBAL) PURE; + STDMETHOD(ContextSensitiveHelp) (THIS_ BOOL) PURE; + STDMETHOD(GetClipboardData) (THIS_ CHARRANGE*,DWORD,LPDATAOBJECT*) PURE; + STDMETHOD(GetDragDropEffect) (THIS_ BOOL,DWORD,PDWORD) PURE; + STDMETHOD(GetContextMenu) (THIS_ WORD,LPOLEOBJECT,CHARRANGE*,HMENU*) PURE; +}; +typedef IRichEditOleCallback FAR * LPRICHEDITOLECALLBACK; +#endif +#pragma pack(pop) +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/rpc.h b/reactos/w32api/include/rpc.h new file mode 100644 index 00000000000..0e3df5eaf1e --- /dev/null +++ b/reactos/w32api/include/rpc.h @@ -0,0 +1,59 @@ +#ifndef RPC_NO_WINDOWS_H +#include <windows.h> +#endif + +#ifndef _RPC_H +#define _RPC_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define __RPC_WIN32__ +#ifndef _WIN95 +#define __RPC_NT__ +#define RPC_UNICODE_SUPPORTED +#endif + +#ifndef __MIDL_USER_DEFINED +#define midl_user_allocate MIDL_user_allocate +#define midl_user_free MIDL_user_free +#define __MIDL_USER_DEFINED +#endif +#define RPC_UNICODE_SUPPORTED +#define __RPC_FAR +#define __RPC_API __stdcall +#define __RPC_USER __stdcall +#define __RPC_STUB __stdcall +#define RPC_ENTRY __stdcall +typedef void *I_RPC_HANDLE; +typedef long RPC_STATUS; + +#include <rpcdce.h> +#include <rpcnsi.h> +#include <rpcnterr.h> + +#include <winerror.h> + +/* SEH is not supported */ +#if 0 +#include <excpt.h> +#define RpcTryExcept __try { +#define RpcExcept(x) } __except (x) { +#define RpcEndExcept } +#define RpcTryFinally __try { +#define RpcFinally } __finally { +#define RpcEndFinally } +#define RpcExceptionCode() GetExceptionCode() +#define RpcAbnormalTermination() AbnormalTermination() +#endif /* 0 */ + +RPC_STATUS RPC_ENTRY RpcImpersonateClient(RPC_BINDING_HANDLE); +RPC_STATUS RPC_ENTRY RpcRevertToSelf(void); +long RPC_ENTRY I_RpcMapWin32Status(RPC_STATUS); +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/rpcdce.h b/reactos/w32api/include/rpcdce.h new file mode 100644 index 00000000000..f2adce40fed --- /dev/null +++ b/reactos/w32api/include/rpcdce.h @@ -0,0 +1,392 @@ +#ifndef _RPCDCE_H +#define _RPCDCE_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#include <basetyps.h> + +#define IN +#define OUT +#ifndef OPTIONAL +#define OPTIONAL +#endif +#define uuid_t UUID +#define rpc_binding_handle_t RPC_BINDING_HANDLE +#define rpc_binding_vector_t RPC_BINDING_VECTOR +#define uuid_vector_t UUID_VECTOR +#define RPC_C_BINDING_INFINITE_TIMEOUT 10 +#define RPC_C_BINDING_MIN_TIMEOUT 0 +#define RPC_C_BINDING_DEFAULT_TIMEOUT 5 +#define RPC_C_BINDING_MAX_TIMEOUT 9 +#define RPC_C_CANCEL_INFINITE_TIMEOUT (-1) +#define RPC_C_LISTEN_MAX_CALLS_DEFAULT 1234 +#define RPC_C_PROTSEQ_MAX_REQS_DEFAULT 10 +#define RPC_C_BIND_TO_ALL_NICS 1 +#define RPC_C_USE_INTERNET_PORT 1 +#define RPC_C_USE_INTRANET_PORT 2 +#define RPC_MGR_EPV void +#define RPC_C_STATS_CALLS_IN 0 +#define RPC_C_STATS_CALLS_OUT 1 +#define RPC_C_STATS_PKTS_IN 2 +#define RPC_C_STATS_PKTS_OUT 3 +#define RPC_IF_AUTOLISTEN 0x0001 +#define RPC_IF_OLE 2 +#define RPC_C_MGMT_INQ_IF_IDS 0 +#define RPC_C_MGMT_INQ_PRINC_NAME 1 +#define RPC_C_MGMT_INQ_STATS 2 +#define RPC_C_MGMT_IS_SERVER_LISTEN 3 +#define RPC_C_MGMT_STOP_SERVER_LISTEN 4 +#define RPC_C_EP_ALL_ELTS 0 +#define RPC_C_EP_MATCH_BY_IF 1 +#define RPC_C_EP_MATCH_BY_OBJ 2 +#define RPC_C_EP_MATCH_BY_BOTH 3 +#define RPC_C_VERS_ALL 1 +#define RPC_C_VERS_COMPATIBLE 2 +#define RPC_C_VERS_EXACT 3 +#define RPC_C_VERS_MAJOR_ONLY 4 +#define RPC_C_VERS_UPTO 5 +#define DCE_C_ERROR_STRING_LEN 256 +#define RPC_C_PARM_MAX_PACKET_LENGTH 1 +#define RPC_C_PARM_BUFFER_LENGTH 2 +#define RPC_C_AUTHN_LEVEL_DEFAULT 0 +#define RPC_C_AUTHN_LEVEL_NONE 1 +#define RPC_C_AUTHN_LEVEL_CONNECT 2 +#define RPC_C_AUTHN_LEVEL_CALL 3 +#define RPC_C_AUTHN_LEVEL_PKT 4 +#define RPC_C_AUTHN_LEVEL_PKT_INTEGRITY 5 +#define RPC_C_AUTHN_LEVEL_PKT_PRIVACY 6 +#define RPC_C_IMP_LEVEL_ANONYMOUS 1 +#define RPC_C_IMP_LEVEL_IDENTIFY 2 +#define RPC_C_IMP_LEVEL_IMPERSONATE 3 +#define RPC_C_IMP_LEVEL_DELEGATE 4 +#define RPC_C_QOS_IDENTITY_STATIC 0 +#define RPC_C_QOS_IDENTITY_DYNAMIC 1 +#define RPC_C_QOS_CAPABILITIES_DEFAULT 0 +#define RPC_C_QOS_CAPABILITIES_MUTUAL_AUTH 1 +#define RPC_C_PROTECT_LEVEL_DEFAULT(RPC_C_AUTHN_LEVEL_DEFAULT) +#define RPC_C_PROTECT_LEVEL_NONE(RPC_C_AUTHN_LEVEL_NONE) +#define RPC_C_PROTECT_LEVEL_CONNECT(RPC_C_AUTHN_LEVEL_CONNECT) +#define RPC_C_PROTECT_LEVEL_CALL(RPC_C_AUTHN_LEVEL_CALL) +#define RPC_C_PROTECT_LEVEL_PKT(RPC_C_AUTHN_LEVEL_PKT) +#define RPC_C_PROTECT_LEVEL_PKT_INTEGRITY(RPC_C_AUTHN_LEVEL_PKT_INTEGRITY) +#define RPC_C_PROTECT_LEVEL_PKT_PRIVACY(RPC_C_AUTHN_LEVEL_PKT_PRIVACY) +#define RPC_C_AUTHN_NONE 0 +#define RPC_C_AUTHN_DCE_PRIVATE 1 +#define RPC_C_AUTHN_DCE_PUBLIC 2 +#define RPC_C_AUTHN_DEC_PUBLIC 4 +#define RPC_C_AUTHN_WINNT 10 +#define RPC_C_AUTHN_DEFAULT 0xFFFFFFFF +#define RPC_C_SECURITY_QOS_VERSION L +#define SEC_WINNT_AUTH_IDENTITY_ANSI 0x1 +#define SEC_WINNT_AUTH_IDENTITY_UNICODE 0x2 +#define RPC_C_AUTHZ_NONE 0 +#define RPC_C_AUTHZ_NAME 1 +#define RPC_C_AUTHZ_DCE 2 +#define RPC_C_AUTHZ_DEFAULT 0xFFFFFFFF + +typedef I_RPC_HANDLE RPC_BINDING_HANDLE; +typedef RPC_BINDING_HANDLE handle_t; +typedef struct _RPC_BINDING_VECTOR { + unsigned long Count; + RPC_BINDING_HANDLE BindingH[1]; +} RPC_BINDING_VECTOR; +typedef struct _UUID_VECTOR { + unsigned long Count; + UUID *Uuid[1]; +} UUID_VECTOR; +typedef void *RPC_IF_HANDLE; +typedef struct _RPC_IF_ID { + UUID Uuid; + unsigned short VersMajor; + unsigned short VersMinor; +} RPC_IF_ID; +typedef struct _RPC_POLICY { + unsigned int Length ; + unsigned long EndpointFlags ; + unsigned long NICFlags ; +} RPC_POLICY,*PRPC_POLICY ; +typedef void __RPC_USER RPC_OBJECT_INQ_FN(UUID*,UUID*,RPC_STATUS*); +typedef RPC_STATUS RPC_IF_CALLBACK_FN(RPC_IF_HANDLE,void*); +typedef struct { + unsigned int Count; + unsigned long Stats[1]; +} RPC_STATS_VECTOR; +typedef struct { + unsigned long Count; + RPC_IF_ID*IfId[1]; +} RPC_IF_ID_VECTOR; +typedef void *RPC_AUTH_IDENTITY_HANDLE; +typedef void *RPC_AUTHZ_HANDLE; +typedef struct _RPC_SECURITY_QOS { + unsigned long Version; + unsigned long Capabilities; + unsigned long IdentityTracking; + unsigned long ImpersonationType; +} RPC_SECURITY_QOS,*PRPC_SECURITY_QOS; +typedef struct _SEC_WINNT_AUTH_IDENTITY_W { + unsigned short *User; + unsigned long UserLength; + unsigned short *Domain; + unsigned long DomainLength; + unsigned short *Password; + unsigned long PasswordLength; + unsigned long Flags; +} SEC_WINNT_AUTH_IDENTITY_W,*PSEC_WINNT_AUTH_IDENTITY_W; +typedef struct _SEC_WINNT_AUTH_IDENTITY_A { + unsigned char *User; + unsigned long UserLength; + unsigned char *Domain; + unsigned long DomainLength; + unsigned char *Password; + unsigned long PasswordLength; + unsigned long Flags; +} SEC_WINNT_AUTH_IDENTITY_A,*PSEC_WINNT_AUTH_IDENTITY_A; +typedef struct { + unsigned char *UserName; + unsigned char *ComputerName; + unsigned short Privilege; + unsigned long AuthFlags; +} RPC_CLIENT_INFORMATION1,* PRPC_CLIENT_INFORMATION1; +typedef I_RPC_HANDLE *RPC_EP_INQ_HANDLE; +typedef int(__RPC_API *RPC_MGMT_AUTHORIZATION_FN)(RPC_BINDING_HANDLE,unsigned long,RPC_STATUS*); + +#ifdef RPC_UNICODE_SUPPORTED +typedef struct _RPC_PROTSEQ_VECTORA { + unsigned int Count; + unsigned char*Protseq[1]; +} RPC_PROTSEQ_VECTORA; +typedef struct _RPC_PROTSEQ_VECTORW { + unsigned int Count; + unsigned short*Protseq[1]; +} RPC_PROTSEQ_VECTORW; +RPC_STATUS RPC_ENTRY RpcBindingFromStringBindingA(unsigned char *,RPC_BINDING_HANDLE *); +RPC_STATUS RPC_ENTRY RpcBindingFromStringBindingW(unsigned short *,RPC_BINDING_HANDLE *); +RPC_STATUS RPC_ENTRY RpcBindingToStringBindingA(RPC_BINDING_HANDLE,unsigned char**); +RPC_STATUS RPC_ENTRY RpcBindingToStringBindingW(RPC_BINDING_HANDLE,unsigned short**); +RPC_STATUS RPC_ENTRY RpcStringBindingComposeA(unsigned char *,unsigned char *,unsigned char *,unsigned char *,unsigned char *,unsigned char **); +RPC_STATUS RPC_ENTRY RpcStringBindingComposeW(unsigned short *,unsigned short *,unsigned short *,unsigned short *,unsigned short *,unsigned short **); +RPC_STATUS RPC_ENTRY RpcStringBindingParseA(unsigned char *,unsigned char **,unsigned char **,unsigned char **,unsigned char **,unsigned char **); +RPC_STATUS RPC_ENTRY RpcStringBindingParseW(unsigned short *,unsigned short **,unsigned short **,unsigned short **,unsigned short **,unsigned short **); +RPC_STATUS RPC_ENTRY RpcStringFreeA(unsigned char**); +RPC_STATUS RPC_ENTRY RpcStringFreeW(unsigned short**); +RPC_STATUS RPC_ENTRY RpcNetworkIsProtseqValidA(unsigned char*); +RPC_STATUS RPC_ENTRY RpcNetworkIsProtseqValidW(unsigned short*); +RPC_STATUS RPC_ENTRY RpcNetworkInqProtseqsA(RPC_PROTSEQ_VECTORA**); +RPC_STATUS RPC_ENTRY RpcNetworkInqProtseqsW(RPC_PROTSEQ_VECTORW**); +RPC_STATUS RPC_ENTRY RpcProtseqVectorFreeA(RPC_PROTSEQ_VECTORA**); +RPC_STATUS RPC_ENTRY RpcProtseqVectorFreeW(RPC_PROTSEQ_VECTORW**); +RPC_STATUS RPC_ENTRY RpcServerUseProtseqA(unsigned char*,unsigned int,void*); +RPC_STATUS RPC_ENTRY RpcServerUseProtseqW(unsigned short*,unsigned int,void*); +RPC_STATUS RPC_ENTRY RpcServerUseProtseqExA(unsigned char*,unsigned int MaxCalls,void*,PRPC_POLICY); +RPC_STATUS RPC_ENTRY RpcServerUseProtseqExW(unsigned short*,unsigned int,void*,PRPC_POLICY); +RPC_STATUS RPC_ENTRY RpcServerUseProtseqEpA(unsigned char*,unsigned int,unsigned char*,void*); +RPC_STATUS RPC_ENTRY RpcServerUseProtseqEpExA(unsigned char*,unsigned int,unsigned char*,void*,PRPC_POLICY); +RPC_STATUS RPC_ENTRY RpcServerUseProtseqEpW(unsigned short*,unsigned int,unsigned short*,void*); +RPC_STATUS RPC_ENTRY RpcServerUseProtseqEpExW(unsigned short*,unsigned int,unsigned short*,void*,PRPC_POLICY); +RPC_STATUS RPC_ENTRY RpcServerUseProtseqIfA(unsigned char*,unsigned int,RPC_IF_HANDLE,void*); +RPC_STATUS RPC_ENTRY RpcServerUseProtseqIfExA(unsigned char*,unsigned int,RPC_IF_HANDLE,void*,PRPC_POLICY); +RPC_STATUS RPC_ENTRY RpcServerUseProtseqIfW(unsigned short*,unsigned int,RPC_IF_HANDLE,void*); +RPC_STATUS RPC_ENTRY RpcServerUseProtseqIfExW(unsigned short*,unsigned int,RPC_IF_HANDLE,void*,PRPC_POLICY); +RPC_STATUS RPC_ENTRY RpcMgmtInqServerPrincNameA(RPC_BINDING_HANDLE,unsigned long,unsigned char**); +RPC_STATUS RPC_ENTRY RpcMgmtInqServerPrincNameW(RPC_BINDING_HANDLE,unsigned long,unsigned short**); +RPC_STATUS RPC_ENTRY RpcServerInqDefaultPrincNameA(unsigned long,unsigned char**); +RPC_STATUS RPC_ENTRY RpcServerInqDefaultPrincNameW(unsigned long,unsigned short**); +RPC_STATUS RPC_ENTRY RpcNsBindingInqEntryNameA(RPC_BINDING_HANDLE,unsigned long,unsigned char**); +RPC_STATUS RPC_ENTRY RpcNsBindingInqEntryNameW(RPC_BINDING_HANDLE,unsigned long,unsigned short**); +RPC_STATUS RPC_ENTRY RpcBindingInqAuthClientA(RPC_BINDING_HANDLE,RPC_AUTHZ_HANDLE *,unsigned char**,unsigned long*,unsigned long*,unsigned long*); +RPC_STATUS RPC_ENTRY RpcBindingInqAuthClientW(RPC_BINDING_HANDLE,RPC_AUTHZ_HANDLE *,unsigned short**,unsigned long*,unsigned long*,unsigned long*); +RPC_STATUS RPC_ENTRY RpcBindingInqAuthInfoA(RPC_BINDING_HANDLE,unsigned char**,unsigned long*,unsigned long*,RPC_AUTH_IDENTITY_HANDLE*,unsigned long*); +RPC_STATUS RPC_ENTRY RpcBindingInqAuthInfoW(RPC_BINDING_HANDLE,unsigned short**,unsigned long*,unsigned long*,RPC_AUTH_IDENTITY_HANDLE*,unsigned long*); +RPC_STATUS RPC_ENTRY RpcBindingSetAuthInfoA(RPC_BINDING_HANDLE,unsigned char*,unsigned long,unsigned long,RPC_AUTH_IDENTITY_HANDLE,unsigned long); +RPC_STATUS RPC_ENTRY RpcBindingSetAuthInfoExA(RPC_BINDING_HANDLE,unsigned char*,unsigned long,unsigned long,RPC_AUTH_IDENTITY_HANDLE,unsigned long,RPC_SECURITY_QOS*); +RPC_STATUS RPC_ENTRY RpcBindingSetAuthInfoW(RPC_BINDING_HANDLE,unsigned short*,unsigned long,unsigned long,RPC_AUTH_IDENTITY_HANDLE,unsigned long); +RPC_STATUS RPC_ENTRY RpcBindingSetAuthInfoExW(RPC_BINDING_HANDLE,unsigned short*,unsigned long,unsigned long,RPC_AUTH_IDENTITY_HANDLE,unsigned long,RPC_SECURITY_QOS*); +RPC_STATUS RPC_ENTRY RpcBindingInqAuthInfoExA(RPC_BINDING_HANDLE,unsigned char**,unsigned long*,unsigned long*,RPC_AUTH_IDENTITY_HANDLE*,unsigned long*,unsigned long,RPC_SECURITY_QOS*); +RPC_STATUS RPC_ENTRY RpcBindingInqAuthInfoExW(RPC_BINDING_HANDLE,unsigned short ** , unsigned long *, unsigned long *, RPC_AUTH_IDENTITY_HANDLE *, unsigned long *, unsigned long , RPC_SECURITY_QOS *); +typedef void(__RPC_USER *RPC_AUTH_KEY_RETRIEVAL_FN)(void*,unsigned short*,unsigned long,void**,RPC_STATUS*); +RPC_STATUS RPC_ENTRY RpcServerRegisterAuthInfoA(unsigned char*,unsigned long,RPC_AUTH_KEY_RETRIEVAL_FN,void*); +RPC_STATUS RPC_ENTRY RpcServerRegisterAuthInfoW(unsigned short*,unsigned long,RPC_AUTH_KEY_RETRIEVAL_FN,void*); +RPC_STATUS RPC_ENTRY UuidToStringA(UUID*,unsigned char**); +RPC_STATUS RPC_ENTRY UuidFromStringA(unsigned char*,UUID*); +RPC_STATUS RPC_ENTRY UuidToStringW(UUID*,unsigned short**); +RPC_STATUS RPC_ENTRY UuidFromStringW(unsigned short*,UUID*); +RPC_STATUS RPC_ENTRY RpcEpRegisterNoReplaceA(RPC_IF_HANDLE,RPC_BINDING_VECTOR*,UUID_VECTOR*,unsigned char*); +RPC_STATUS RPC_ENTRY RpcEpRegisterNoReplaceW(RPC_IF_HANDLE,RPC_BINDING_VECTOR*, UUID_VECTOR*,unsigned short*); +RPC_STATUS RPC_ENTRY RpcEpRegisterA(RPC_IF_HANDLE,RPC_BINDING_VECTOR*,UUID_VECTOR*,unsigned char*); +RPC_STATUS RPC_ENTRY RpcEpRegisterW(RPC_IF_HANDLE,RPC_BINDING_VECTOR*,UUID_VECTOR*,unsigned short*); +RPC_STATUS RPC_ENTRY DceErrorInqTextA(RPC_STATUS,unsigned char*); +RPC_STATUS RPC_ENTRY DceErrorInqTextW(RPC_STATUS,unsigned short*); +RPC_STATUS RPC_ENTRY RpcMgmtEpEltInqNextA(RPC_EP_INQ_HANDLE,RPC_IF_ID*,RPC_BINDING_HANDLE*,UUID*,unsigned char**); +RPC_STATUS RPC_ENTRY RpcMgmtEpEltInqNextW(RPC_EP_INQ_HANDLE,RPC_IF_ID*,RPC_BINDING_HANDLE*,UUID*,unsigned short**); +#ifdef UNICODE +#define RPC_PROTSEQ_VECTOR RPC_PROTSEQ_VECTORW +#define SEC_WINNT_AUTH_IDENTITY SEC_WINNT_AUTH_IDENTITY_W +#define PSEC_WINNT_AUTH_IDENTITY PSEC_WINNT_AUTH_IDENTITY_W +#define _SEC_WINNT_AUTH_IDENTITY _SEC_WINNT_AUTH_IDENTITY_W +#define RpcMgmtEpEltInqNext RpcMgmtEpEltInqNextW +#define RpcBindingFromStringBinding RpcBindingFromStringBindingW +#define RpcBindingToStringBinding RpcBindingToStringBindingW +#define RpcStringBindingCompose RpcStringBindingComposeW +#define RpcStringBindingParse RpcStringBindingParseW +#define RpcStringFree RpcStringFreeW +#define RpcNetworkIsProtseqValid RpcNetworkIsProtseqValidW +#define RpcNetworkInqProtseqs RpcNetworkInqProtseqsW +#define RpcProtseqVectorFree RpcProtseqVectorFreeW +#define RpcServerUseProtseq RpcServerUseProtseqW +#define RpcServerUseProtseqEx RpcServerUseProtseqExW +#define RpcServerUseProtseqEp RpcServerUseProtseqEpW +#define RpcServerUseProtseqEpEx RpcServerUseProtseqEpExW +#define RpcServerUseProtseqIf RpcServerUseProtseqIfW +#define RpcServerUseProtseqIfEx RpcServerUseProtseqIfExW +#define RpcMgmtInqServerPrincName RpcMgmtInqServerPrincNameW +#define RpcServerInqDefaultPrincName RpcServerInqDefaultPrincNameW +#define RpcNsBindingInqEntryName RpcNsBindingInqEntryNameW +#define RpcBindingInqAuthClient RpcBindingInqAuthClientW +#define RpcBindingInqAuthInfo RpcBindingInqAuthInfoW +#define RpcBindingSetAuthInfo RpcBindingSetAuthInfoW +#define RpcServerRegisterAuthInfo RpcServerRegisterAuthInfoW +#define RpcBindingInqAuthInfoEx RpcBindingInqAuthInfoExW +#define RpcBindingSetAuthInfoEx RpcBindingSetAuthInfoExW +#define UuidFromString UuidFromStringW +#define UuidToString UuidToStringW +#define RpcEpRegisterNoReplace RpcEpRegisterNoReplaceW +#define RpcEpRegister RpcEpRegisterW +#define DceErrorInqText DceErrorInqTextW +#else /* UNICODE */ +#define RPC_PROTSEQ_VECTOR RPC_PROTSEQ_VECTORA +#define SEC_WINNT_AUTH_IDENTITY SEC_WINNT_AUTH_IDENTITY_A +#define PSEC_WINNT_AUTH_IDENTITY PSEC_WINNT_AUTH_IDENTITY_A +#define _SEC_WINNT_AUTH_IDENTITY _SEC_WINNT_AUTH_IDENTITY_A +#define RpcMgmtEpEltInqNext RpcMgmtEpEltInqNextA +#define RpcBindingFromStringBinding RpcBindingFromStringBindingA +#define RpcBindingToStringBinding RpcBindingToStringBindingA +#define RpcStringBindingCompose RpcStringBindingComposeA +#define RpcStringBindingParse RpcStringBindingParseA +#define RpcStringFree RpcStringFreeA +#define RpcNetworkIsProtseqValid RpcNetworkIsProtseqValidA +#define RpcNetworkInqProtseqs RpcNetworkInqProtseqsA +#define RpcProtseqVectorFree RpcProtseqVectorFreeA +#define RpcServerUseProtseq RpcServerUseProtseqA +#define RpcServerUseProtseqEx RpcServerUseProtseqExA +#define RpcServerUseProtseqEp RpcServerUseProtseqEpA +#define RpcServerUseProtseqEpEx RpcServerUseProtseqEpExA +#define RpcServerUseProtseqIf RpcServerUseProtseqIfA +#define RpcServerUseProtseqIfEx RpcServerUseProtseqIfExA +#define RpcMgmtInqServerPrincName RpcMgmtInqServerPrincNameA +#define RpcServerInqDefaultPrincName RpcServerInqDefaultPrincNameA +#define RpcNsBindingInqEntryName RpcNsBindingInqEntryNameA +#define RpcBindingInqAuthClient RpcBindingInqAuthClientA +#define RpcBindingInqAuthInfo RpcBindingInqAuthInfoA +#define RpcBindingSetAuthInfo RpcBindingSetAuthInfoA +#define RpcServerRegisterAuthInfo RpcServerRegisterAuthInfoA +#define RpcBindingInqAuthInfoEx RpcBindingInqAuthInfoExA +#define RpcBindingSetAuthInfoEx RpcBindingSetAuthInfoExA +#define UuidFromString UuidFromStringA +#define UuidToString UuidToStringA +#define RpcEpRegisterNoReplace RpcEpRegisterNoReplaceA +#define RpcEpRegister RpcEpRegisterA +#define DceErrorInqText DceErrorInqTextA +#endif /* UNICODE */ +#else /* RPC_UNICODE_SUPPORTED */ +typedef struct _RPC_PROTSEQ_VECTOR { + unsigned int Count; + unsigned char* Protseq[1]; +} RPC_PROTSEQ_VECTOR; +RPC_STATUS RPC_ENTRY RpcBindingFromStringBinding(unsigned char *,RPC_BINDING_HANDLE *); +RPC_STATUS RPC_ENTRY RpcBindingToStringBinding(RPC_BINDING_HANDLE,unsigned char **); +RPC_STATUS RPC_ENTRY RpcStringBindingCompose(unsigned char *,unsigned char *,unsigned char *,unsigned char *,unsigned char *,unsigned char **); +RPC_STATUS RPC_ENTRY RpcStringBindingParse(unsigned char *,unsigned char **,unsigned char **,unsigned char **,unsigned char **,unsigned char **); +RPC_STATUS RPC_ENTRY RpcStringFree(unsigned char**); +RPC_STATUS RPC_ENTRY RpcNetworkIsProtseqValid(unsigned char*); +RPC_STATUS RPC_ENTRY RpcNetworkInqProtseqs(RPC_PROTSEQ_VECTOR **); +RPC_STATUS RPC_ENTRY RpcServerInqBindings(RPC_BINDING_VECTOR **); +RPC_STATUS RPC_ENTRY RpcServerUseProtseq(unsigned char*,unsigned int,void*); +RPC_STATUS RPC_ENTRY RpcServerUseProtseqEx(unsigned char*,unsigned int,void*,PRPC_POLICY); +RPC_STATUS RPC_ENTRY RpcServerUseProtseqEp(unsigned char*,unsigned int,unsigned char*,void*); +RPC_STATUS RPC_ENTRY RpcServerUseProtseqEpEx(unsigned char*,unsigned int,unsigned char*,void*,PRPC_POLICY); +RPC_STATUS RPC_ENTRY RpcServerUseProtseqIf(unsigned char*,unsigned int,RPC_IF_HANDLE,void*); +RPC_STATUS RPC_ENTRY RpcServerUseProtseqIfEx(unsigned char*,unsigned int,RPC_IF_HANDLE,void*,PRPC_POLICY); +RPC_STATUS RPC_ENTRY RpcMgmtInqServerPrincName(RPC_BINDING_HANDLE,unsigned long,unsigned char**); +RPC_STATUS RPC_ENTRY RpcServerInqDefaultPrincName(unsigned long,unsigned char**); +RPC_STATUS RPC_ENTRY RpcNsBindingInqEntryName(RPC_BINDING_HANDLE,unsigned long,unsigned char**); +RPC_STATUS RPC_ENTRY RpcBindingInqAuthClient(RPC_BINDING_HANDLE,RPC_AUTHZ_HANDLE*,unsigned char**,unsigned long*,unsigned long*,unsigned long*); +RPC_STATUS RPC_ENTRY RpcBindingInqAuthInfo(RPC_BINDING_HANDLE,unsigned char **,unsigned long *,unsigned long *,RPC_AUTH_IDENTITY_HANDLE *,unsigned long *); +RPC_STATUS RPC_ENTRY RpcBindingSetAuthInfo(RPC_BINDING_HANDLE,unsigned char *,unsigned long,unsigned long,RPC_AUTH_IDENTITY_HANDLE,unsigned long); +typedef void(__RPC_USER *RPC_AUTH_KEY_RETRIEVAL_FN)(void*,unsigned char*,unsigned long,void**,RPC_STATUS*); +RPC_STATUS RPC_ENTRY RpcServerRegisterAuthInfo(unsigned char*,unsigned long,RPC_AUTH_KEY_RETRIEVAL_FN,void*); +RPC_STATUS RPC_ENTRY UuidToString(UUID*,unsigned char**); +RPC_STATUS RPC_ENTRY UuidFromString(unsigned char*,UUID*); +RPC_STATUS RPC_ENTRY RpcEpRegisterNoReplace(RPC_IF_HANDLE,RPC_BINDING_VECTOR*,UUID_VECTOR*,unsigned char*); +RPC_STATUS RPC_ENTRY RpcEpRegister(RPC_IF_HANDLE,RPC_BINDING_VECTOR*,UUID_VECTOR*,unsigned char*); +RPC_STATUS RPC_ENTRY DceErrorInqText(RPC_STATUS,unsigned char*); +RPC_STATUS RPC_ENTRY RpcMgmtEpEltInqNext(RPC_EP_INQ_HANDLE,RPC_IF_ID *,RPC_BINDING_HANDLE *,unsigned char **); +#endif /* RPC_UNICODE_SUPPORTED */ + +RPC_STATUS RPC_ENTRY RpcBindingCopy(RPC_BINDING_HANDLE,RPC_BINDING_HANDLE*); +RPC_STATUS RPC_ENTRY RpcBindingFree(RPC_BINDING_HANDLE*); +RPC_STATUS RPC_ENTRY RpcBindingInqObject(RPC_BINDING_HANDLE,UUID *); +RPC_STATUS RPC_ENTRY RpcBindingReset(RPC_BINDING_HANDLE); +RPC_STATUS RPC_ENTRY RpcBindingSetObject(RPC_BINDING_HANDLE,UUID *); +RPC_STATUS RPC_ENTRY RpcMgmtInqDefaultProtectLevel(unsigned long,unsigned long *); +RPC_STATUS RPC_ENTRY RpcBindingVectorFree(RPC_BINDING_VECTOR **); +RPC_STATUS RPC_ENTRY RpcIfInqId(RPC_IF_HANDLE,RPC_IF_ID *); +RPC_STATUS RPC_ENTRY RpcMgmtInqComTimeout(RPC_BINDING_HANDLE,unsigned int*); +RPC_STATUS RPC_ENTRY RpcMgmtSetComTimeout(RPC_BINDING_HANDLE,unsigned int); +RPC_STATUS RPC_ENTRY RpcMgmtSetCancelTimeout(long Timeout); +RPC_STATUS RPC_ENTRY RpcObjectInqType(UUID *,UUID *); +RPC_STATUS RPC_ENTRY RpcObjectSetInqFn(RPC_OBJECT_INQ_FN *); +RPC_STATUS RPC_ENTRY RpcObjectSetType(UUID *,UUID *); +RPC_STATUS RPC_ENTRY RpcProtseqVectorFree(RPC_PROTSEQ_VECTOR **); +RPC_STATUS RPC_ENTRY RpcServerInqIf(RPC_IF_HANDLE,UUID*,RPC_MGR_EPV**); +RPC_STATUS RPC_ENTRY RpcServerListen(unsigned int,unsigned int,unsigned int); +RPC_STATUS RPC_ENTRY RpcServerRegisterIf(RPC_IF_HANDLE,UUID*,RPC_MGR_EPV*); +RPC_STATUS RPC_ENTRY RpcServerRegisterIfEx(RPC_IF_HANDLE,UUID*,RPC_MGR_EPV*,unsigned int,unsigned int,RPC_IF_CALLBACK_FN*); +RPC_STATUS RPC_ENTRY RpcServerUnregisterIf(RPC_IF_HANDLE,UUID*,unsigned int); +RPC_STATUS RPC_ENTRY RpcServerUseAllProtseqs(unsigned int,void*); +RPC_STATUS RPC_ENTRY RpcServerUseAllProtseqsEx(unsigned int,void*,PRPC_POLICY); +RPC_STATUS RPC_ENTRY RpcServerUseAllProtseqsIf(unsigned int,RPC_IF_HANDLE,void*); +RPC_STATUS RPC_ENTRY RpcServerUseAllProtseqsIfEx(unsigned int,RPC_IF_HANDLE,void*,PRPC_POLICY); +RPC_STATUS RPC_ENTRY RpcMgmtStatsVectorFree(RPC_STATS_VECTOR**); +RPC_STATUS RPC_ENTRY RpcMgmtInqStats(RPC_BINDING_HANDLE,RPC_STATS_VECTOR**); +RPC_STATUS RPC_ENTRY RpcMgmtIsServerListening(RPC_BINDING_HANDLE); +RPC_STATUS RPC_ENTRY RpcMgmtStopServerListening(RPC_BINDING_HANDLE); +RPC_STATUS RPC_ENTRY RpcMgmtWaitServerListen(void); +RPC_STATUS RPC_ENTRY RpcMgmtSetServerStackSize(unsigned long); +void RPC_ENTRY RpcSsDontSerializeContext(void); +RPC_STATUS RPC_ENTRY RpcMgmtEnableIdleCleanup(void); +RPC_STATUS RPC_ENTRY RpcMgmtInqIfIds(RPC_BINDING_HANDLE,RPC_IF_ID_VECTOR**); +RPC_STATUS RPC_ENTRY RpcIfIdVectorFree(RPC_IF_ID_VECTOR**); +RPC_STATUS RPC_ENTRY RpcEpResolveBinding(RPC_BINDING_HANDLE,RPC_IF_HANDLE); +RPC_STATUS RPC_ENTRY RpcBindingServerFromClient(RPC_BINDING_HANDLE,RPC_BINDING_HANDLE*); +DECLSPEC_NORETURN void RPC_ENTRY RpcRaiseException(RPC_STATUS); +RPC_STATUS RPC_ENTRY RpcTestCancel(void); +RPC_STATUS RPC_ENTRY RpcCancelThread(void*); +RPC_STATUS RPC_ENTRY UuidCreate(UUID*); +signed int RPC_ENTRY UuidCompare(UUID*,UUID*, RPC_STATUS*); +RPC_STATUS RPC_ENTRY UuidCreateNil(UUID*); +int RPC_ENTRY UuidEqual(UUID*,UUID*, RPC_STATUS*); +unsigned short RPC_ENTRY UuidHash(UUID*,RPC_STATUS*); +int RPC_ENTRY UuidIsNil(UUID*,RPC_STATUS*); +RPC_STATUS RPC_ENTRY RpcEpUnregister(RPC_IF_HANDLE,RPC_BINDING_VECTOR*,UUID_VECTOR*); +RPC_STATUS RPC_ENTRY RpcMgmtEpEltInqBegin(RPC_BINDING_HANDLE,unsigned long,RPC_IF_ID*,unsigned long,UUID*,RPC_EP_INQ_HANDLE*); +RPC_STATUS RPC_ENTRY RpcMgmtEpEltInqDone(RPC_EP_INQ_HANDLE*); +RPC_STATUS RPC_ENTRY RpcMgmtEpUnregister(RPC_BINDING_HANDLE,RPC_IF_ID*,RPC_BINDING_HANDLE,UUID*); +RPC_STATUS RPC_ENTRY RpcMgmtSetAuthorizationFn(RPC_MGMT_AUTHORIZATION_FN); +RPC_STATUS RPC_ENTRY RpcMgmtInqParameter(unsigned int,unsigned long*); +RPC_STATUS RPC_ENTRY RpcMgmtSetParameter(unsigned int,unsigned long); +RPC_STATUS RPC_ENTRY RpcMgmtBindingInqParameter(RPC_BINDING_HANDLE,unsigned int,unsigned long*); +RPC_STATUS RPC_ENTRY RpcMgmtBindingSetParameter(RPC_BINDING_HANDLE,unsigned int,unsigned long); + +#if _WIN32_WINNT >= 0x0500 +RPC_STATUS RPC_ENTRY UuidCreateSequential(UUID*); +#endif + +#include <rpcdcep.h> +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/rpcdce2.h b/reactos/w32api/include/rpcdce2.h new file mode 100644 index 00000000000..4d065f18965 --- /dev/null +++ b/reactos/w32api/include/rpcdce2.h @@ -0,0 +1,56 @@ +#ifndef _RPCDCE2_H +#define _RPCDCE2_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#include <rpcdce.h> + +#define RPC_C_EP_ALL_ELTS 0 +#define RPC_C_EP_MATCH_BY_IF 1 +#define RPC_C_EP_MATCH_BY_OBJ 2 +#define RPC_C_EP_MATCH_BY_BOTH 3 +#define RPC_C_VERS_ALL 1 +#define RPC_C_VERS_COMPATIBLE 2 +#define RPC_C_VERS_EXACT 3 +#define RPC_C_VERS_MAJOR_ONLY 4 +#define RPC_C_VERS_UPTO 5 +#define DCE_C_ERROR_STRING_LEN 256 +#define RPC_C_MGMT_INQ_IF_IDS 0 +#define RPC_C_MGMT_INQ_PRINC_NAME 1 +#define RPC_C_MGMT_INQ_STATS 2 +#define RPC_C_MGMT_IS_SERVER_LISTEN 3 +#define RPC_C_MGMT_STOP_SERVER_LISTEN 4 + +int RPC_ENTRY UuidCompare(UUID*,UUID*,RPC_STATUS*); +RPC_STATUS RPC_ENTRY UuidCreateNil(UUID*); +int RPC_ENTRY UuidEqual(UUID*,UUID*,RPC_STATUS*); +unsigned short RPC_ENTRY UuidHash(UUID*,RPC_STATUS*); +int RPC_ENTRY UuidIsNil(UUID*,RPC_STATUS*); +#ifdef RPC_UNICODE_SUPPORTED +RPC_STATUS RPC_ENTRY DceErrorInqTextA(RPC_STATUS,unsigned char*); +RPC_STATUS RPC_ENTRY DceErrorInqTextW(RPC_STATUS,unsigned short*); +RPC_STATUS RPC_ENTRY RpcMgmtEpEltInqNextA(RPC_EP_INQ_HANDLE,RPC_IF_ID*,RPC_BINDING_HANDLE*,UUID*,unsigned char**); +RPC_STATUS RPC_ENTRY RpcMgmtEpEltInqNextW(RPC_EP_INQ_HANDLE,RPC_IF_ID*,RPC_BINDING_HANDLE*,UUID*,unsigned short**); +#ifdef UNICODE +#define RpcMgmtEpEltInqNext RpcMgmtEpEltInqNextW +#define DceErrorInqText DceErrorInqTextW +#else +#define RpcMgmtEpEltInqNext RpcMgmtEpEltInqNextA +#define DceErrorInqText DceErrorInqTextA +#endif /* UNICODE */ +#else /* RPC_UNICODE_SUPPORTED */ +RPC_STATUS RPC_ENTRY DceErrorInqText(RPC_STATUS,unsigned char*); +RPC_STATUS RPC_ENTRY RpcMgmtEpEltInqNext(RPC_EP_INQ_HANDLE,RPC_IF_ID*,RPC_BINDING_HANDLE*,UUID*,unsigned char**); +#endif +RPC_STATUS RPC_ENTRY RpcMgmtEpEltInqBegin(RPC_BINDING_HANDLE,unsigned long,RPC_IF_ID*,unsigned long,UUID*,RPC_EP_INQ_HANDLE*); +RPC_STATUS RPC_ENTRY RpcMgmtEpEltInqDone(RPC_EP_INQ_HANDLE*); +RPC_STATUS RPC_ENTRY RpcMgmtEpUnregister(RPC_BINDING_HANDLE,RPC_IF_ID*,RPC_BINDING_HANDLE,UUID*); +RPC_STATUS RPC_ENTRY RpcMgmtSetAuthorizationFn(RPC_MGMT_AUTHORIZATION_FN); +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/rpcdcep.h b/reactos/w32api/include/rpcdcep.h new file mode 100644 index 00000000000..c45bc46905e --- /dev/null +++ b/reactos/w32api/include/rpcdcep.h @@ -0,0 +1,128 @@ +#ifndef _RPCDCEP_H +#define _RPCDCEP_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define RPC_NCA_FLAGS_DEFAULT 0 +#define RPC_NCA_FLAGS_IDEMPOTENT 1 +#define RPC_NCA_FLAGS_BROADCAST 2 +#define RPC_NCA_FLAGS_MAYBE 4 +#define RPCFLG_ASYNCHRONOUS 0x40000000 +#define RPCFLG_INPUT_SYNCHRONOUS 0x20000000 +#define RPC_FLAGS_VALID_BIT 0x8000 +#define TRANSPORT_TYPE_CN 1 +#define TRANSPORT_TYPE_DG 2 +#define TRANSPORT_TYPE_LPC 4 +#define TRANSPORT_TYPE_WMSG 8 + +typedef struct _RPC_VERSION { + unsigned short MajorVersion; + unsigned short MinorVersion; +} RPC_VERSION; +typedef struct _RPC_SYNTAX_IDENTIFIER { + GUID SyntaxGUID; + RPC_VERSION SyntaxVersion; +} RPC_SYNTAX_IDENTIFIER, *PRPC_SYNTAX_IDENTIFIER; +typedef struct _RPC_MESSAGE { + HANDLE Handle; + unsigned long DataRepresentation; + void *Buffer; + unsigned int BufferLength; + unsigned int ProcNum; + PRPC_SYNTAX_IDENTIFIER TransferSyntax; + void *RpcInterfaceInformation; + void *ReservedForRuntime; + void *ManagerEpv; + void *ImportContext; + unsigned long RpcFlags; +} RPC_MESSAGE,*PRPC_MESSAGE; +typedef long __stdcall RPC_FORWARD_FUNCTION(GUID*,RPC_VERSION*,GUID*,unsigned char*,void**); +typedef void(__stdcall *RPC_DISPATCH_FUNCTION) ( PRPC_MESSAGE Message); +typedef struct { + unsigned int DispatchTableCount; + RPC_DISPATCH_FUNCTION *DispatchTable; + int Reserved; +} RPC_DISPATCH_TABLE,*PRPC_DISPATCH_TABLE; +typedef struct _RPC_PROTSEQ_ENDPOINT { + unsigned char *RpcProtocolSequence; + unsigned char *Endpoint; +} RPC_PROTSEQ_ENDPOINT,*PRPC_PROTSEQ_ENDPOINT; +typedef struct _RPC_SERVER_INTERFACE { + unsigned int Length; + RPC_SYNTAX_IDENTIFIER InterfaceId; + RPC_SYNTAX_IDENTIFIER TransferSyntax; + PRPC_DISPATCH_TABLE DispatchTable; + unsigned int RpcProtseqEndpointCount; + PRPC_PROTSEQ_ENDPOINT RpcProtseqEndpoint; + void *DefaultManagerEpv; + void const *InterpreterInfo; +} RPC_SERVER_INTERFACE,*PRPC_SERVER_INTERFACE; +typedef struct _RPC_CLIENT_INTERFACE { + unsigned int Length; + RPC_SYNTAX_IDENTIFIER InterfaceId; + RPC_SYNTAX_IDENTIFIER TransferSyntax; + PRPC_DISPATCH_TABLE DispatchTable; + unsigned int RpcProtseqEndpointCount; + PRPC_PROTSEQ_ENDPOINT RpcProtseqEndpoint; + unsigned long Reserved; + void const *InterpreterInfo; +} RPC_CLIENT_INTERFACE,*PRPC_CLIENT_INTERFACE; +typedef void *I_RPC_MUTEX; +typedef struct _RPC_TRANSFER_SYNTAX { + GUID Uuid; + unsigned short VersMajor; + unsigned short VersMinor; +} RPC_TRANSFER_SYNTAX; +typedef long(__stdcall *RPC_BLOCKING_FUNCTION)(void*,void*); + +long __stdcall I_RpcGetBuffer(RPC_MESSAGE*); +long __stdcall I_RpcSendReceive(RPC_MESSAGE*); +long __stdcall I_RpcFreeBuffer(RPC_MESSAGE*); +void __stdcall I_RpcRequestMutex(I_RPC_MUTEX*); +void __stdcall I_RpcClearMutex(I_RPC_MUTEX); +void __stdcall I_RpcDeleteMutex(I_RPC_MUTEX); +DECLARE_STDCALL_P(void *) I_RpcAllocate(unsigned int); +void __stdcall I_RpcFree(void*); +void __stdcall I_RpcPauseExecution(unsigned long); +typedef void(__stdcall *PRPC_RUNDOWN) (void*); +long __stdcall I_RpcMonitorAssociation(HANDLE,PRPC_RUNDOWN,void*); +long __stdcall I_RpcStopMonitorAssociation(HANDLE); +HANDLE __stdcall I_RpcGetCurrentCallHandle(void); +long __stdcall I_RpcGetAssociationContext(void**); +long __stdcall I_RpcSetAssociationContext(void*); +#ifdef __RPC_NT__ +long __stdcall I_RpcNsBindingSetEntryName(HANDLE,unsigned long,unsigned short*); +long __stdcall I_RpcBindingInqDynamicEndpoint(HANDLE, unsigned short**); +#else +long __stdcall I_RpcNsBindingSetEntryName(HANDLE,unsigned long,unsigned char*); +long __stdcall I_RpcBindingInqDynamicEndpoint(HANDLE,unsigned char**); +#endif +long __stdcall I_RpcBindingInqTransportType(HANDLE,unsigned int*); +long __stdcall I_RpcIfInqTransferSyntaxes(HANDLE,RPC_TRANSFER_SYNTAX*,unsigned int,unsigned int*); +long __stdcall I_UuidCreate(GUID*); +long __stdcall I_RpcBindingCopy(HANDLE,HANDLE*); +long __stdcall I_RpcBindingIsClientLocal(HANDLE,unsigned int*); +void __stdcall I_RpcSsDontSerializeContext(void); +long __stdcall I_RpcServerRegisterForwardFunction(RPC_FORWARD_FUNCTION*); +long __stdcall I_RpcConnectionInqSockBuffSize(unsigned long*,unsigned long*); +long __stdcall I_RpcConnectionSetSockBuffSize(unsigned long,unsigned long); +long __stdcall I_RpcBindingSetAsync(HANDLE,RPC_BLOCKING_FUNCTION); +long __stdcall I_RpcAsyncSendReceive(RPC_MESSAGE*,void*); +long __stdcall I_RpcGetThreadWindowHandle(void**); +long __stdcall I_RpcServerThreadPauseListening(void); +long __stdcall I_RpcServerThreadContinueListening(void); +long __stdcall I_RpcServerUnregisterEndpointA(unsigned char*,unsigned char*); +long __stdcall I_RpcServerUnregisterEndpointW(unsigned short*,unsigned short*); +#ifdef UNICODE +#define I_RpcServerUnregisterEndpoint I_RpcServerUnregisterEndpointW +#else +#define I_RpcServerUnregisterEndpoint I_RpcServerUnregisterEndpointA +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/rpcndr.h b/reactos/w32api/include/rpcndr.h new file mode 100644 index 00000000000..8b728bbb5f5 --- /dev/null +++ b/reactos/w32api/include/rpcndr.h @@ -0,0 +1,473 @@ +#ifndef __RPCNDR_H__ +#define __RPCNDR_H__ +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifndef __RPCNDR_H_VERSION__ +#define __RPCNDR_H_VERSION__ ( 450 ) +#endif /* __RPCNDR_H_VERSION__ */ +#include <rpcnsip.h> +#ifdef __cplusplus +extern "C" { +#endif +#include <objfwd.h> +#define DECLSPEC_UUID(x) +#define MIDL_INTERFACE(x) struct +#define NDR_CHAR_REP_MASK (unsigned long)0xFL +#define NDR_INT_REP_MASK (unsigned long)0xF0L +#define NDR_FLOAT_REP_MASK (unsigned long)0xFF00L +#define NDR_LITTLE_ENDIAN (unsigned long)0x10L +#define NDR_BIG_ENDIAN (unsigned long)0 +#define NDR_IEEE_FLOAT (unsigned long)0 +#define NDR_VAX_FLOAT (unsigned long)0x100L +#define NDR_ASCII_CHAR (unsigned long)0 +#define NDR_EBCDIC_CHAR (unsigned long)1 +#define NDR_LOCAL_DATA_REPRESENTATION (unsigned long)0x10L +#define NDR_LOCAL_ENDIAN NDR_LITTLE_ENDIAN +#define __RPC_CALLEE __stdcall +#ifndef __MIDL_USER_DEFINED +#define midl_user_allocate MIDL_user_allocate +#define midl_user_free MIDL_user_free +#define __MIDL_USER_DEFINED +#endif +#define RPC_VAR_ENTRY __cdecl +#ifdef _M_IX86 +#define __MIDL_DECLSPEC_DLLIMPORT __declspec(dllimport) +#define __MIDL_DECLSPEC_DLLEXPORT __declspec(dllexport) +#else +#define __MIDL_DECLSPEC_DLLIMPORT +#define __MIDL_DECLSPEC_DLLEXPORT +#endif +#if defined(_HAVE_INT64) || (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 64) +#define hyper __int64 +#define MIDL_uhyper unsigned __int64 +#else +#define hyper double +#define MIDL_uhyper double +#endif +#define small char +typedef unsigned char byte; +#define NDRSContextValue(hContext) (&(hContext)->userContext) +#define cbNDRContext 20 +#define byte_from_ndr(source, target) { *(target) = *(*(char**)&(source)->Buffer)++; } +#define byte_array_from_ndr(Source, LowerIndex, UpperIndex, Target) { NDRcopy ((((char *)(Target))+(LowerIndex)), (Source)->Buffer, (unsigned int)((UpperIndex)-(LowerIndex))); *(unsigned long *)&(Source)->Buffer += ((UpperIndex)-(LowerIndex)); } +#define boolean_from_ndr(source, target) { *(target) = *(*(char**)&(source)->Buffer)++; } +#define boolean_array_from_ndr(Source, LowerIndex, UpperIndex, Target) { NDRcopy ((((char *)(Target))+(LowerIndex)), (Source)->Buffer, (unsigned int)((UpperIndex)-(LowerIndex))); *(unsigned long *)&(Source)->Buffer += ((UpperIndex)-(LowerIndex)); } +#define small_from_ndr(source, target) { *(target) = *(*(char**)&(source)->Buffer)++; } +#define small_from_ndr_temp(source, target, format) { *(target) = *(*(char**)(source))++; } +#define small_array_from_ndr(Source, LowerIndex, UpperIndex, Target) { NDRcopy ((((char *)(Target))+(LowerIndex)), (Source)->Buffer, (unsigned int)((UpperIndex)-(LowerIndex))); *(unsigned long *)&(Source)->Buffer += ((UpperIndex)-(LowerIndex)); } +#define MIDL_ascii_strlen(string) strlen(string) +#define MIDL_ascii_strcpy(target,source) strcpy(target,source) +#define MIDL_memset(s,c,n) memset(s,c,n) +#define _midl_ma1( p, cast ) *(*( cast **)&p)++ +#define _midl_ma2( p, cast ) *(*( cast **)&p)++ +#define _midl_ma4( p, cast ) *(*( cast **)&p)++ +#define _midl_ma8( p, cast ) *(*( cast **)&p)++ +#define _midl_unma1( p, cast ) *(( cast *)p)++ +#define _midl_unma2( p, cast ) *(( cast *)p)++ +#define _midl_unma3( p, cast ) *(( cast *)p)++ +#define _midl_unma4( p, cast ) *(( cast *)p)++ +#define _midl_fa2( p ) (p = (RPC_BUFPTR )((unsigned long)(p+1) & 0xfffffffe)) +#define _midl_fa4( p ) (p = (RPC_BUFPTR )((unsigned long)(p+3) & 0xfffffffc)) +#define _midl_fa8( p ) (p = (RPC_BUFPTR )((unsigned long)(p+7) & 0xfffffff8)) +#define _midl_addp( p, n ) (p += n) +#define _midl_marsh_lhs( p, cast ) *(*( cast **)&p)++ +#define _midl_marsh_up( mp, p ) *(*(unsigned long **)&mp)++ = (unsigned long)p +#define _midl_advmp( mp ) *(*(unsigned long **)&mp)++ +#define _midl_unmarsh_up( p ) (*(*(unsigned long **)&p)++) +#define NdrMarshConfStringHdr( p, s, l ) (_midl_ma4( p, unsigned long) = s, _midl_ma4( p, unsigned long) = 0, _midl_ma4( p, unsigned long) = l) +#define NdrUnMarshConfStringHdr(p, s, l) ((s=_midl_unma4(p,unsigned long), (_midl_addp(p,4)), (l=_midl_unma4(p,unsigned long)) +#define NdrMarshCCtxtHdl(pc,p) (NDRCContextMarshall( (NDR_CCONTEXT)pc, p ),p+20) +#define NdrUnMarshCCtxtHdl(pc,p,h,drep) (NDRCContextUnmarshall((NDR_CONTEXT)pc,h,p,drep), p+20) +#define NdrUnMarshSCtxtHdl(pc, p,drep) (pc = NdrSContextUnMarshall(p,drep )) +#define NdrMarshSCtxtHdl(pc,p,rd) (NdrSContextMarshall((NDR_SCONTEXT)pc,p, (NDR_RUNDOWN)rd) +#define NdrFieldOffset(s,f) (long)(& (((s *)0)->f)) +#define NdrFieldPad(s,f,p,t) (NdrFieldOffset(s,f) - NdrFieldOffset(s,p) - sizeof(t)) +#define NdrFcShort(s) (unsigned char)(s & 0xff), (unsigned char)(s >> 8) +#define NdrFcLong(s) (unsigned char)(s & 0xff), (unsigned char)((s & 0x0000ff00) >> 8), (unsigned char)((s & 0x00ff0000) >> 16), (unsigned char)(s >> 24) +#ifdef CONST_VTABLE +#define CONST_VTBL const +#else +#define CONST_VTBL +#endif +typedef void *NDR_CCONTEXT; +typedef struct { + void *pad[2]; + void *userContext; +} *NDR_SCONTEXT; +typedef void (__RPC_USER *NDR_RUNDOWN)(void*); +typedef struct _SCONTEXT_QUEUE { + unsigned long NumberOfObjects; + NDR_SCONTEXT *ArrayOfObjects; +} SCONTEXT_QUEUE,*PSCONTEXT_QUEUE; +struct _MIDL_STUB_MESSAGE; +struct _MIDL_STUB_DESC; +struct _FULL_PTR_XLAT_TABLES; +typedef unsigned char *RPC_BUFPTR; +typedef unsigned long RPC_LENGTH; +typedef void(__RPC_USER *EXPR_EVAL)(struct _MIDL_STUB_MESSAGE*); +typedef const unsigned char *PFORMAT_STRING; +typedef struct { + long Dimension; + unsigned long *BufferConformanceMark; + unsigned long *BufferVarianceMark; + unsigned long *MaxCountArray; + unsigned long *OffsetArray; + unsigned long *ActualCountArray; +} ARRAY_INFO,*PARRAY_INFO; + +RPC_BINDING_HANDLE RPC_ENTRY NDRCContextBinding(NDR_CCONTEXT); +void RPC_ENTRY NDRCContextMarshall(NDR_CCONTEXT,void*); +void RPC_ENTRY NDRCContextUnmarshall(NDR_CCONTEXT*,RPC_BINDING_HANDLE,void*,unsigned long); +void RPC_ENTRY NDRSContextMarshall(NDR_SCONTEXT,void*,NDR_RUNDOWN); +NDR_SCONTEXT RPC_ENTRY NDRSContextUnmarshall(void*pBuff,unsigned long); +void RPC_ENTRY RpcSsDestroyClientContext(void**); +void RPC_ENTRY NDRcopy(void*,void*,unsigned int); +unsigned int RPC_ENTRY MIDL_wchar_strlen(wchar_t*); +void RPC_ENTRY MIDL_wchar_strcpy(void*,wchar_t*); +void RPC_ENTRY char_from_ndr(PRPC_MESSAGE,unsigned char*); +void RPC_ENTRY char_array_from_ndr(PRPC_MESSAGE,unsigned long,unsigned long,unsigned char*); +void RPC_ENTRY short_from_ndr(PRPC_MESSAGE,unsigned short*); +void RPC_ENTRY short_array_from_ndr(PRPC_MESSAGE,unsigned long,unsigned long,unsigned short*); +void RPC_ENTRY short_from_ndr_temp(unsigned char**,unsigned short*,unsigned long); +void RPC_ENTRY long_from_ndr(PRPC_MESSAGE,unsigned long*); +void RPC_ENTRY long_array_from_ndr(PRPC_MESSAGE,unsigned long,unsigned long,unsigned long*); +void RPC_ENTRY long_from_ndr_temp(unsigned char**,unsigned long*,unsigned long); +void RPC_ENTRY enum_from_ndr(PRPC_MESSAGE,unsigned int*); +void RPC_ENTRY float_from_ndr(PRPC_MESSAGE,void*); +void RPC_ENTRY float_array_from_ndr(PRPC_MESSAGE,unsigned long,unsigned long,void*); +void RPC_ENTRY double_from_ndr(PRPC_MESSAGE,void*); +void RPC_ENTRY double_array_from_ndr(PRPC_MESSAGE,unsigned long,unsigned long,void*); +void RPC_ENTRY hyper_from_ndr(PRPC_MESSAGE,hyper*); +void RPC_ENTRY hyper_array_from_ndr(PRPC_MESSAGE,unsigned long,unsigned long,hyper*); +void RPC_ENTRY hyper_from_ndr_temp(unsigned char**,hyper*,unsigned long); +void RPC_ENTRY data_from_ndr(PRPC_MESSAGE,void*,char*,unsigned char); +void RPC_ENTRY data_into_ndr(void*,PRPC_MESSAGE,char*,unsigned char); +void RPC_ENTRY tree_into_ndr(void*,PRPC_MESSAGE,char*,unsigned char); +void RPC_ENTRY data_size_ndr(void*,PRPC_MESSAGE,char*,unsigned char); +void RPC_ENTRY tree_size_ndr(void*,PRPC_MESSAGE,char*,unsigned char); +void RPC_ENTRY tree_peek_ndr(PRPC_MESSAGE,unsigned char**,char*,unsigned char); +void *RPC_ENTRY midl_allocate(int); + +#pragma pack(push,4) +typedef struct _MIDL_STUB_MESSAGE { + PRPC_MESSAGE RpcMsg; + unsigned char *Buffer; + unsigned char *BufferStart; + unsigned char *BufferEnd; + unsigned char *BufferMark; + unsigned long BufferLength; + unsigned long MemorySize; + unsigned char *Memory; + int IsClient; + int ReuseBuffer; + unsigned char *AllocAllNodesMemory; + unsigned char *AllocAllNodesMemoryEnd; + int IgnoreEmbeddedPointers; + unsigned char *PointerBufferMark; + unsigned char fBufferValid; + unsigned char Unused; + unsigned long MaxCount; + unsigned long Offset; + unsigned long ActualCount; + void*(__RPC_API *pfnAllocate)(unsigned int); + void(__RPC_API *pfnFree)(void*); + unsigned char *StackTop; + unsigned char *pPresentedType; + unsigned char *pTransmitType; + handle_t SavedHandle; + const struct _MIDL_STUB_DESC *StubDesc; + struct _FULL_PTR_XLAT_TABLES *FullPtrXlatTables; + unsigned long FullPtrRefId; + int fCheckBounds; + int fInDontFree :1; + int fDontCallFreeInst :1; + int fInOnlyParam :1; + int fHasReturn :1; + unsigned long dwDestContext; + void*pvDestContext; + NDR_SCONTEXT *SavedContextHandles; + long ParamNumber; + struct IRpcChannelBuffer *pRpcChannelBuffer; + PARRAY_INFO pArrayInfo; + unsigned long *SizePtrCountArray; + unsigned long *SizePtrOffsetArray; + unsigned long *SizePtrLengthArray; + void*pArgQueue; + unsigned long dwStubPhase; + unsigned long Reserved[5]; +} MIDL_STUB_MESSAGE,*PMIDL_STUB_MESSAGE; +#pragma pack(pop) +typedef void*(__RPC_API *GENERIC_BINDING_ROUTINE)(void*); +typedef void (__RPC_API *GENERIC_UNBIND_ROUTINE)(void*,unsigned char*); +typedef struct _GENERIC_BINDING_ROUTINE_PAIR { + GENERIC_BINDING_ROUTINE pfnBind; + GENERIC_UNBIND_ROUTINE pfnUnbind; +} GENERIC_BINDING_ROUTINE_PAIR,*PGENERIC_BINDING_ROUTINE_PAIR; +typedef struct __GENERIC_BINDING_INFO { + void *pObj; + unsigned int Size; + GENERIC_BINDING_ROUTINE pfnBind; + GENERIC_UNBIND_ROUTINE pfnUnbind; +} GENERIC_BINDING_INFO,*PGENERIC_BINDING_INFO; +typedef void(__RPC_USER *XMIT_HELPER_ROUTINE)(PMIDL_STUB_MESSAGE); +typedef struct _XMIT_ROUTINE_QUINTUPLE { + XMIT_HELPER_ROUTINE pfnTranslateToXmit; + XMIT_HELPER_ROUTINE pfnTranslateFromXmit; + XMIT_HELPER_ROUTINE pfnFreeXmit; + XMIT_HELPER_ROUTINE pfnFreeInst; +} XMIT_ROUTINE_QUINTUPLE,*PXMIT_ROUTINE_QUINTUPLE; +typedef struct _MALLOC_FREE_STRUCT { +void*(__RPC_USER *pfnAllocate)(unsigned int); +void(__RPC_USER *pfnFree)(void*); +} MALLOC_FREE_STRUCT; +typedef struct _COMM_FAULT_OFFSETS { + short CommOffset; + short FaultOffset; +} COMM_FAULT_OFFSETS; +typedef struct _MIDL_STUB_DESC { + void*RpcInterfaceInformation; + void*(__RPC_API *pfnAllocate)(unsigned int); + void(__RPC_API *pfnFree)(void*); + union { + handle_t *pAutoHandle; + handle_t *pPrimitiveHandle; + PGENERIC_BINDING_INFO pGenericBindingInfo; + } IMPLICIT_HANDLE_INFO; + const NDR_RUNDOWN *apfnNdrRundownRoutines; + const GENERIC_BINDING_ROUTINE_PAIR *aGenericBindingRoutinePairs; + const EXPR_EVAL *apfnExprEval; + const XMIT_ROUTINE_QUINTUPLE *aXmitQuintuple; + const unsigned char *pFormatTypes; + int fCheckBounds; + unsigned long Version; + MALLOC_FREE_STRUCT *pMallocFreeStruct; + long MIDLVersion; + const COMM_FAULT_OFFSETS *CommFaultOffsets; +} MIDL_STUB_DESC; +typedef const MIDL_STUB_DESC *PMIDL_STUB_DESC; +typedef void*PMIDL_XMIT_TYPE; +typedef struct _MIDL_FORMAT_STRING { + short Pad; + unsigned char Format[1]; +} MIDL_FORMAT_STRING; +typedef void(__RPC_API *STUB_THUNK)(PMIDL_STUB_MESSAGE); +typedef long(__RPC_API *SERVER_ROUTINE)(void); +typedef struct _MIDL_SERVER_INFO_ { + PMIDL_STUB_DESC pStubDesc; + const SERVER_ROUTINE *DispatchTable; + PFORMAT_STRING ProcString; + const unsigned short *FmtStringOffset; + const STUB_THUNK *ThunkTable; +} MIDL_SERVER_INFO,*PMIDL_SERVER_INFO; +typedef struct _MIDL_STUBLESS_PROXY_INFO { + PMIDL_STUB_DESC pStubDesc; + PFORMAT_STRING ProcFormatString; + const unsigned short *FormatStringOffset; +} MIDL_STUBLESS_PROXY_INFO; +typedef MIDL_STUBLESS_PROXY_INFO *PMIDL_STUBLESS_PROXY_INFO; +typedef union _CLIENT_CALL_RETURN { + void *Pointer; + long Simple; +} CLIENT_CALL_RETURN; +typedef enum { XLAT_SERVER = 1,XLAT_CLIENT } XLAT_SIDE; +typedef struct _FULL_PTR_TO_REFID_ELEMENT { + struct _FULL_PTR_TO_REFID_ELEMENT *Next; + void*Pointer; + unsigned long RefId; + unsigned char State; +} FULL_PTR_TO_REFID_ELEMENT,*PFULL_PTR_TO_REFID_ELEMENT; +typedef struct _FULL_PTR_XLAT_TABLES { + struct { + void **XlatTable; + unsigned char *StateTable; + unsigned long NumberOfEntries; + } RefIdToPointer; + struct { + PFULL_PTR_TO_REFID_ELEMENT *XlatTable; + unsigned long NumberOfBuckets; + unsigned long HashMask; + } PointerToRefId; + unsigned long NextRefId; + XLAT_SIDE XlatSide; +} FULL_PTR_XLAT_TABLES,*PFULL_PTR_XLAT_TABLES; +void RPC_ENTRY NdrSimpleTypeMarshall(PMIDL_STUB_MESSAGE,unsigned char*,unsigned char); +unsigned char *RPC_ENTRY NdrPointerMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING pFormat); +unsigned char *RPC_ENTRY NdrSimpleStructMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +unsigned char *RPC_ENTRY NdrConformantStructMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +unsigned char *RPC_ENTRY NdrConformantVaryingStructMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +unsigned char *RPC_ENTRY NdrHardStructMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +unsigned char *RPC_ENTRY NdrComplexStructMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +unsigned char *RPC_ENTRY NdrFixedArrayMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +unsigned char *RPC_ENTRY NdrConformantArrayMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +unsigned char *RPC_ENTRY NdrConformantVaryingArrayMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +unsigned char *RPC_ENTRY NdrVaryingArrayMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +unsigned char *RPC_ENTRY NdrComplexArrayMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +unsigned char *RPC_ENTRY NdrNonConformantStringMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +unsigned char *RPC_ENTRY NdrConformantStringMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +unsigned char *RPC_ENTRY NdrEncapsulatedUnionMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +unsigned char *RPC_ENTRY NdrNonEncapsulatedUnionMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +unsigned char *RPC_ENTRY NdrByteCountPointerMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +unsigned char *RPC_ENTRY NdrXmitOrRepAsMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +unsigned char *RPC_ENTRY NdrInterfacePointerMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrClientContextMarshall(PMIDL_STUB_MESSAGE,NDR_CCONTEXT,int); +void RPC_ENTRY NdrServerContextMarshall(PMIDL_STUB_MESSAGE,NDR_SCONTEXT,NDR_RUNDOWN); +void RPC_ENTRY NdrSimpleTypeUnmarshall(PMIDL_STUB_MESSAGE,unsigned char*,unsigned char); +unsigned char *RPC_ENTRY NdrPointerUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char); +unsigned char *RPC_ENTRY NdrSimpleStructUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char); +unsigned char *RPC_ENTRY NdrConformantStructUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char); +unsigned char *RPC_ENTRY NdrConformantVaryingStructUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char); +unsigned char *RPC_ENTRY NdrHardStructUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char); +unsigned char *RPC_ENTRY NdrComplexStructUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char); +unsigned char *RPC_ENTRY NdrFixedArrayUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char); +unsigned char *RPC_ENTRY NdrConformantArrayUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char); +unsigned char *RPC_ENTRY NdrConformantVaryingArrayUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char); +unsigned char *RPC_ENTRY NdrVaryingArrayUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char); +unsigned char *RPC_ENTRY NdrComplexArrayUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char); +unsigned char *RPC_ENTRY NdrNonConformantStringUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char); +unsigned char *RPC_ENTRY NdrConformantStringUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char); +unsigned char *RPC_ENTRY NdrEncapsulatedUnionUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char); +unsigned char *RPC_ENTRY NdrNonEncapsulatedUnionUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char); +unsigned char *RPC_ENTRY NdrByteCountPointerUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char); +unsigned char *RPC_ENTRY NdrXmitOrRepAsUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char); +unsigned char *RPC_ENTRY NdrInterfacePointerUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char); +void RPC_ENTRY NdrClientContextUnmarshall(PMIDL_STUB_MESSAGE,NDR_CCONTEXT*,RPC_BINDING_HANDLE); +NDR_SCONTEXT RPC_ENTRY NdrServerContextUnmarshall(PMIDL_STUB_MESSAGE); +void RPC_ENTRY NdrPointerBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrSimpleStructBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrConformantStructBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrConformantVaryingStructBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrHardStructBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrComplexStructBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrFixedArrayBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrConformantArrayBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrConformantVaryingArrayBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrVaryingArrayBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrComplexArrayBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrConformantStringBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrNonConformantStringBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrEncapsulatedUnionBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrNonEncapsulatedUnionBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrByteCountPointerBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrXmitOrRepAsBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrInterfacePointerBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrContextHandleSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +unsigned long RPC_ENTRY NdrPointerMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING); +unsigned long RPC_ENTRY NdrSimpleStructMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING); +unsigned long RPC_ENTRY NdrConformantStructMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING); +unsigned long RPC_ENTRY NdrConformantVaryingStructMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING); +unsigned long RPC_ENTRY NdrHardStructMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING); +unsigned long RPC_ENTRY NdrComplexStructMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING); +unsigned long RPC_ENTRY NdrFixedArrayMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING); +unsigned long RPC_ENTRY NdrConformantArrayMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING); +unsigned long RPC_ENTRY NdrConformantVaryingArrayMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING); +unsigned long RPC_ENTRY NdrVaryingArrayMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING); +unsigned long RPC_ENTRY NdrComplexArrayMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING); +unsigned long RPC_ENTRY NdrConformantStringMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING); +unsigned long RPC_ENTRY NdrNonConformantStringMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING); +unsigned long RPC_ENTRY NdrEncapsulatedUnionMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING); +unsigned long RPC_ENTRY NdrNonEncapsulatedUnionMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING); +unsigned long RPC_ENTRY NdrXmitOrRepAsMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING); +unsigned long RPC_ENTRY NdrInterfacePointerMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING); +void RPC_ENTRY NdrPointerFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrSimpleStructFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrConformantStructFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrConformantVaryingStructFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrHardStructFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrComplexStructFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrFixedArrayFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrConformantArrayFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrConformantVaryingArrayFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrVaryingArrayFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrComplexArrayFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrEncapsulatedUnionFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrNonEncapsulatedUnionFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrByteCountPointerFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrXmitOrRepAsFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrInterfacePointerFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +void RPC_ENTRY NdrConvert(PMIDL_STUB_MESSAGE,PFORMAT_STRING); +void RPC_ENTRY NdrClientInitializeNew(PRPC_MESSAGE,PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC,unsigned int); +unsigned char *RPC_ENTRY NdrServerInitializeNew(PRPC_MESSAGE,PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC); +void RPC_ENTRY NdrClientInitialize(PRPC_MESSAGE,PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC,unsigned int); +unsigned char *RPC_ENTRY NdrServerInitialize(PRPC_MESSAGE,PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC); +unsigned char *RPC_ENTRY NdrServerInitializeUnmarshall(PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC,PRPC_MESSAGE); +void RPC_ENTRY NdrServerInitializeMarshall(PRPC_MESSAGE,PMIDL_STUB_MESSAGE); +unsigned char *RPC_ENTRY NdrGetBuffer(PMIDL_STUB_MESSAGE,unsigned long,RPC_BINDING_HANDLE); +unsigned char *RPC_ENTRY NdrNsGetBuffer(PMIDL_STUB_MESSAGE,unsigned long,RPC_BINDING_HANDLE); +unsigned char *RPC_ENTRY NdrSendReceive(PMIDL_STUB_MESSAGE,unsigned char*); +unsigned char *RPC_ENTRY NdrNsSendReceive(PMIDL_STUB_MESSAGE,unsigned char*,RPC_BINDING_HANDLE*); +void RPC_ENTRY NdrFreeBuffer(PMIDL_STUB_MESSAGE); +CLIENT_CALL_RETURN RPC_VAR_ENTRY NdrClientCall(PMIDL_STUB_DESC,PFORMAT_STRING,...); +typedef enum { + STUB_UNMARSHAL, + STUB_CALL_SERVER, + STUB_MARSHAL, + STUB_CALL_SERVER_NO_HRESULT +} STUB_PHASE; +typedef enum { + PROXY_CALCSIZE, + PROXY_GETBUFFER, + PROXY_MARSHAL, + PROXY_SENDRECEIVE, + PROXY_UNMARSHAL +} PROXY_PHASE; +long RPC_ENTRY NdrStubCall(struct IRpcStubBuffer*,struct IRpcChannelBuffer*,PRPC_MESSAGE,unsigned long*); +void RPC_ENTRY NdrServerCall(PRPC_MESSAGE); +int RPC_ENTRY NdrServerUnmarshall(struct IRpcChannelBuffer*,PRPC_MESSAGE,PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC,PFORMAT_STRING,void*); +void RPC_ENTRY NdrServerMarshall(struct IRpcStubBuffer*,struct IRpcChannelBuffer*,PMIDL_STUB_MESSAGE,PFORMAT_STRING); +RPC_STATUS RPC_ENTRY NdrMapCommAndFaultStatus(PMIDL_STUB_MESSAGE,unsigned long*,unsigned long*,RPC_STATUS); +int RPC_ENTRY NdrSH_UPDecision(PMIDL_STUB_MESSAGE,unsigned char**,RPC_BUFPTR); +int RPC_ENTRY NdrSH_TLUPDecision(PMIDL_STUB_MESSAGE,unsigned char**); +int RPC_ENTRY NdrSH_TLUPDecisionBuffer(PMIDL_STUB_MESSAGE,unsigned char**); +int RPC_ENTRY NdrSH_IfAlloc(PMIDL_STUB_MESSAGE,unsigned char**,unsigned long); +int RPC_ENTRY NdrSH_IfAllocRef(PMIDL_STUB_MESSAGE,unsigned char**,unsigned long); +int RPC_ENTRY NdrSH_IfAllocSet(PMIDL_STUB_MESSAGE,unsigned char**,unsigned long); +RPC_BUFPTR RPC_ENTRY NdrSH_IfCopy(PMIDL_STUB_MESSAGE,unsigned char**,unsigned long); +RPC_BUFPTR RPC_ENTRY NdrSH_IfAllocCopy(PMIDL_STUB_MESSAGE,unsigned char**,unsigned long); +unsigned long RPC_ENTRY NdrSH_Copy(unsigned char*,unsigned char*,unsigned long); +void RPC_ENTRY NdrSH_IfFree(PMIDL_STUB_MESSAGE,unsigned char*); +RPC_BUFPTR RPC_ENTRY NdrSH_StringMarshall(PMIDL_STUB_MESSAGE,unsigned char*,unsigned long,int); +RPC_BUFPTR RPC_ENTRY NdrSH_StringUnMarshall(PMIDL_STUB_MESSAGE,unsigned char**,int); +typedef void *RPC_SS_THREAD_HANDLE; +typedef void* __RPC_API RPC_CLIENT_ALLOC(unsigned int); +typedef void __RPC_API RPC_CLIENT_FREE(void*); +void*RPC_ENTRY RpcSsAllocate(unsigned int); +void RPC_ENTRY RpcSsDisableAllocate(void); +void RPC_ENTRY RpcSsEnableAllocate(void); +void RPC_ENTRY RpcSsFree(void*); +RPC_SS_THREAD_HANDLE RPC_ENTRY RpcSsGetThreadHandle(void); +void RPC_ENTRY RpcSsSetClientAllocFree(RPC_CLIENT_ALLOC*,RPC_CLIENT_FREE*); +void RPC_ENTRY RpcSsSetThreadHandle(RPC_SS_THREAD_HANDLE); +void RPC_ENTRY RpcSsSwapClientAllocFree(RPC_CLIENT_ALLOC*,RPC_CLIENT_FREE*,RPC_CLIENT_ALLOC**,RPC_CLIENT_FREE**); +void*RPC_ENTRY RpcSmAllocate(unsigned int,RPC_STATUS*); +RPC_STATUS RPC_ENTRY RpcSmClientFree(void*); +RPC_STATUS RPC_ENTRY RpcSmDestroyClientContext(void**); +RPC_STATUS RPC_ENTRY RpcSmDisableAllocate(void); +RPC_STATUS RPC_ENTRY RpcSmEnableAllocate(void); +RPC_STATUS RPC_ENTRY RpcSmFree(void*); +RPC_SS_THREAD_HANDLE RPC_ENTRY RpcSmGetThreadHandle(RPC_STATUS*); +RPC_STATUS RPC_ENTRY RpcSmSetClientAllocFree(RPC_CLIENT_ALLOC*,RPC_CLIENT_FREE*); +RPC_STATUS RPC_ENTRY RpcSmSetThreadHandle(RPC_SS_THREAD_HANDLE); +RPC_STATUS RPC_ENTRY RpcSmSwapClientAllocFree(RPC_CLIENT_ALLOC*,RPC_CLIENT_FREE*,RPC_CLIENT_ALLOC**,RPC_CLIENT_FREE**); +void RPC_ENTRY NdrRpcSsEnableAllocate(PMIDL_STUB_MESSAGE); +void RPC_ENTRY NdrRpcSsDisableAllocate(PMIDL_STUB_MESSAGE); +void RPC_ENTRY NdrRpcSmSetClientToOsf(PMIDL_STUB_MESSAGE); +void*RPC_ENTRY NdrRpcSmClientAllocate(unsigned int); +void RPC_ENTRY NdrRpcSmClientFree(void*); +void*RPC_ENTRY NdrRpcSsDefaultAllocate(unsigned int); +void RPC_ENTRY NdrRpcSsDefaultFree(void*); +PFULL_PTR_XLAT_TABLES RPC_ENTRY NdrFullPointerXlatInit(unsigned long,XLAT_SIDE); +void RPC_ENTRY NdrFullPointerXlatFree(PFULL_PTR_XLAT_TABLES); +int RPC_ENTRY NdrFullPointerQueryPointer(PFULL_PTR_XLAT_TABLES,void*,unsigned char,unsigned long*); +int RPC_ENTRY NdrFullPointerQueryRefId(PFULL_PTR_XLAT_TABLES,unsigned long,unsigned char,void**); +void RPC_ENTRY NdrFullPointerInsertRefId(PFULL_PTR_XLAT_TABLES,unsigned long,void*); +int RPC_ENTRY NdrFullPointerFree(PFULL_PTR_XLAT_TABLES,void*); +void*RPC_ENTRY NdrAllocate(PMIDL_STUB_MESSAGE,unsigned int); +void RPC_ENTRY NdrClearOutParameters(PMIDL_STUB_MESSAGE,PFORMAT_STRING,void*); +void*RPC_ENTRY NdrOleAllocate(unsigned int); +void RPC_ENTRY NdrOleFree(void*); +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/rpcnsi.h b/reactos/w32api/include/rpcnsi.h new file mode 100644 index 00000000000..079d7b2a271 --- /dev/null +++ b/reactos/w32api/include/rpcnsi.h @@ -0,0 +1,122 @@ +#ifndef _RPCNSI_H +#define _RPCNSI_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +typedef void *RPC_NS_HANDLE; +#define RPC_C_NS_SYNTAX_DEFAULT 0 +#define RPC_C_NS_SYNTAX_DCE 3 +#define RPC_C_PROFILE_DEFAULT_ELT 0 +#define RPC_C_PROFILE_ALL_ELT 1 +#define RPC_C_PROFILE_MATCH_BY_IF 2 +#define RPC_C_PROFILE_MATCH_BY_MBR 3 +#define RPC_C_PROFILE_MATCH_BY_BOTH 4 +#define RPC_C_NS_DEFAULT_EXP_AGE -1 + +RPC_STATUS RPC_ENTRY RpcNsBindingExportA(unsigned long,unsigned char*,RPC_IF_HANDLE,RPC_BINDING_VECTOR*,UUID_VECTOR*); +RPC_STATUS RPC_ENTRY RpcNsBindingUnexportA(unsigned long,unsigned char*,RPC_IF_HANDLE,UUID_VECTOR*); +RPC_STATUS RPC_ENTRY RpcNsBindingLookupBeginA(unsigned long,unsigned char*,RPC_IF_HANDLE,UUID*,unsigned long,RPC_NS_HANDLE*); +RPC_STATUS RPC_ENTRY RpcNsBindingLookupNext(RPC_NS_HANDLE,RPC_BINDING_VECTOR**); +RPC_STATUS RPC_ENTRY RpcNsBindingLookupDone(RPC_NS_HANDLE*); +RPC_STATUS RPC_ENTRY RpcNsGroupDeleteA(unsigned long,unsigned char*); +RPC_STATUS RPC_ENTRY RpcNsGroupMbrAddA(unsigned long,unsigned char*,unsigned long,unsigned char*); +RPC_STATUS RPC_ENTRY RpcNsGroupMbrRemoveA(unsigned long,unsigned char*,unsigned long,unsigned char*); +RPC_STATUS RPC_ENTRY RpcNsGroupMbrInqBeginA(unsigned long,unsigned char*,unsigned long,RPC_NS_HANDLE*); +RPC_STATUS RPC_ENTRY RpcNsGroupMbrInqNextA(RPC_NS_HANDLE,unsigned char**); +RPC_STATUS RPC_ENTRY RpcNsGroupMbrInqDone(RPC_NS_HANDLE*); +RPC_STATUS RPC_ENTRY RpcNsProfileDeleteA(unsigned long,unsigned char*); +RPC_STATUS RPC_ENTRY RpcNsProfileEltAddA(unsigned long,unsigned char*,RPC_IF_ID*,unsigned long,unsigned char*,unsigned long,unsigned char*); +RPC_STATUS RPC_ENTRY RpcNsProfileEltRemoveA(unsigned long,unsigned char*,RPC_IF_ID*,unsigned long,unsigned char*); +RPC_STATUS RPC_ENTRY RpcNsProfileEltInqBeginA(unsigned long,unsigned char*,unsigned long,RPC_IF_ID*,unsigned long,unsigned long,unsigned char*,RPC_NS_HANDLE*); +RPC_STATUS RPC_ENTRY RpcNsProfileEltInqNextA(RPC_NS_HANDLE,RPC_IF_ID*,unsigned char**,unsigned long*,unsigned char**); +RPC_STATUS RPC_ENTRY RpcNsProfileEltInqDone(RPC_NS_HANDLE*); +RPC_STATUS RPC_ENTRY RpcNsEntryObjectInqNext(IN RPC_NS_HANDLE,OUT UUID*); +RPC_STATUS RPC_ENTRY RpcNsEntryObjectInqDone(IN OUT RPC_NS_HANDLE*); +RPC_STATUS RPC_ENTRY RpcNsEntryExpandNameA(unsigned long,unsigned char*,unsigned char**); +RPC_STATUS RPC_ENTRY RpcNsMgmtBindingUnexportA(unsigned long,unsigned char*,RPC_IF_ID*,unsigned long,UUID_VECTOR*); +RPC_STATUS RPC_ENTRY RpcNsMgmtEntryCreateA(unsigned long,unsigned char*); +RPC_STATUS RPC_ENTRY RpcNsMgmtEntryDeleteA(unsigned long,unsigned char*); +RPC_STATUS RPC_ENTRY RpcNsMgmtEntryInqIfIdsA(unsigned long,unsigned char*,RPC_IF_ID_VECTOR**); +RPC_STATUS RPC_ENTRY RpcNsMgmtHandleSetExpAge(RPC_NS_HANDLE,unsigned long); +RPC_STATUS RPC_ENTRY RpcNsMgmtInqExpAge(unsigned long*); +RPC_STATUS RPC_ENTRY RpcNsMgmtSetExpAge(unsigned long); +RPC_STATUS RPC_ENTRY RpcNsBindingImportNext(RPC_NS_HANDLE,RPC_BINDING_HANDLE*); +RPC_STATUS RPC_ENTRY RpcNsBindingImportDone(RPC_NS_HANDLE*); +RPC_STATUS RPC_ENTRY RpcNsBindingSelect(RPC_BINDING_VECTOR*,RPC_BINDING_HANDLE*); +#ifndef UNICODE_ONLY +RPC_STATUS RPC_ENTRY RpcNsEntryObjectInqBeginA(unsigned long,unsigned char*,RPC_NS_HANDLE*); +RPC_STATUS RPC_ENTRY RpcNsBindingImportBeginA(unsigned long,unsigned char*,RPC_IF_HANDLE,UUID*,RPC_NS_HANDLE*); +#endif +#ifdef RPC_UNICODE_SUPPORTED +RPC_STATUS RPC_ENTRY RpcNsBindingExportW(unsigned long,unsigned short*,RPC_IF_HANDLE,RPC_BINDING_VECTOR*,UUID_VECTOR*); +RPC_STATUS RPC_ENTRY RpcNsBindingUnexportW(unsigned long,unsigned short*,RPC_IF_HANDLE,UUID_VECTOR*); +RPC_STATUS RPC_ENTRY RpcNsBindingLookupBeginW(unsigned long,unsigned short*,RPC_IF_HANDLE,UUID*,unsigned long,RPC_NS_HANDLE*); +RPC_STATUS RPC_ENTRY RpcNsGroupDeleteW(unsigned long,unsigned short*); +RPC_STATUS RPC_ENTRY RpcNsGroupMbrAddW(unsigned long,unsigned short*,unsigned long,unsigned short*); +RPC_STATUS RPC_ENTRY RpcNsGroupMbrRemoveW(unsigned long,unsigned short*,unsigned long,unsigned short*); +RPC_STATUS RPC_ENTRY RpcNsGroupMbrInqBeginW(unsigned long,unsigned short*,unsigned long,RPC_NS_HANDLE*); +RPC_STATUS RPC_ENTRY RpcNsGroupMbrInqNextW(RPC_NS_HANDLE,unsigned short**); +RPC_STATUS RPC_ENTRY RpcNsProfileDeleteW(unsigned long,unsigned short*); +RPC_STATUS RPC_ENTRY RpcNsProfileEltAddW(unsigned long,unsigned short*, RPC_IF_ID*,unsigned long,unsigned short*,unsigned long,unsigned short*); +RPC_STATUS RPC_ENTRY RpcNsProfileEltRemoveW(unsigned long,unsigned short*, RPC_IF_ID*,unsigned long,unsigned short*); +RPC_STATUS RPC_ENTRY RpcNsProfileEltInqBeginW(unsigned long,unsigned short*, unsigned long,RPC_IF_ID*,unsigned long,unsigned long,unsigned short*, RPC_NS_HANDLE*); +RPC_STATUS RPC_ENTRY RpcNsProfileEltInqNextW(RPC_NS_HANDLE,RPC_IF_ID*, unsigned short**,unsigned long*,unsigned short**); +RPC_STATUS RPC_ENTRY RpcNsEntryObjectInqBeginW(unsigned long,unsigned short*,RPC_NS_HANDLE*); +RPC_STATUS RPC_ENTRY RpcNsEntryExpandNameW(unsigned long,unsigned short*,unsigned short**); +RPC_STATUS RPC_ENTRY RpcNsMgmtBindingUnexportW(unsigned long,unsigned short*,RPC_IF_ID*,unsigned long,UUID_VECTOR*); +RPC_STATUS RPC_ENTRY RpcNsMgmtEntryCreateW(unsigned long,unsigned short*); +RPC_STATUS RPC_ENTRY RpcNsMgmtEntryDeleteW(unsigned long,unsigned short*); +RPC_STATUS RPC_ENTRY RpcNsMgmtEntryInqIfIdsW(unsigned long,unsigned short , RPC_IF_ID_VECTOR**); +RPC_STATUS RPC_ENTRY RpcNsBindingImportBeginW(unsigned long,unsigned short*,RPC_IF_HANDLE,UUID*,RPC_NS_HANDLE*); +#endif /* RPC_UNICODE_SUPPORTED */ +#ifdef UNICODE +#define RpcNsBindingLookupBegin RpcNsBindingLookupBeginW +#define RpcNsBindingImportBegin RpcNsBindingImportBeginW +#define RpcNsBindingExport RpcNsBindingExportW +#define RpcNsBindingUnexport RpcNsBindingUnexportW +#define RpcNsGroupDelete RpcNsGroupDeleteW +#define RpcNsGroupMbrAdd RpcNsGroupMbrAddW +#define RpcNsGroupMbrRemove RpcNsGroupMbrRemoveW +#define RpcNsGroupMbrInqBegin RpcNsGroupMbrInqBeginW +#define RpcNsGroupMbrInqNext RpcNsGroupMbrInqNextW +#define RpcNsEntryExpandName RpcNsEntryExpandNameW +#define RpcNsEntryObjectInqBegin RpcNsEntryObjectInqBeginW +#define RpcNsMgmtBindingUnexport RpcNsMgmtBindingUnexportW +#define RpcNsMgmtEntryCreate RpcNsMgmtEntryCreateW +#define RpcNsMgmtEntryDelete RpcNsMgmtEntryDeleteW +#define RpcNsMgmtEntryInqIfIds RpcNsMgmtEntryInqIfIdsW +#define RpcNsProfileDelete RpcNsProfileDeleteW +#define RpcNsProfileEltAdd RpcNsProfileEltAddW +#define RpcNsProfileEltRemove RpcNsProfileEltRemoveW +#define RpcNsProfileEltInqBegin RpcNsProfileEltInqBeginW +#define RpcNsProfileEltInqNext RpcNsProfileEltInqNextW +#else +#define RpcNsBindingLookupBegin RpcNsBindingLookupBeginA +#define RpcNsBindingImportBegin RpcNsBindingImportBeginA +#define RpcNsBindingExport RpcNsBindingExportA +#define RpcNsBindingUnexport RpcNsBindingUnexportA +#define RpcNsGroupDelete RpcNsGroupDeleteA +#define RpcNsGroupMbrAdd RpcNsGroupMbrAddA +#define RpcNsGroupMbrRemove RpcNsGroupMbrRemoveA +#define RpcNsGroupMbrInqBegin RpcNsGroupMbrInqBeginA +#define RpcNsGroupMbrInqNext RpcNsGroupMbrInqNextA +#define RpcNsEntryExpandName RpcNsEntryExpandNameA +#define RpcNsEntryObjectInqBegin RpcNsEntryObjectInqBeginA +#define RpcNsMgmtBindingUnexport RpcNsMgmtBindingUnexportA +#define RpcNsMgmtEntryCreate RpcNsMgmtEntryCreateA +#define RpcNsMgmtEntryDelete RpcNsMgmtEntryDeleteA +#define RpcNsMgmtEntryInqIfIds RpcNsMgmtEntryInqIfIdsA +#define RpcNsProfileDelete RpcNsProfileDeleteA +#define RpcNsProfileEltAdd RpcNsProfileEltAddA +#define RpcNsProfileEltRemove RpcNsProfileEltRemoveA +#define RpcNsProfileEltInqBegin RpcNsProfileEltInqBeginA +#define RpcNsProfileEltInqNext RpcNsProfileEltInqNextA +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/rpcnsip.h b/reactos/w32api/include/rpcnsip.h new file mode 100644 index 00000000000..15ed761041c --- /dev/null +++ b/reactos/w32api/include/rpcnsip.h @@ -0,0 +1,25 @@ +#ifndef _RPCNSIP_H +#define _RPCNSIP_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +typedef struct { + RPC_NS_HANDLE LookupContext; + RPC_BINDING_HANDLE ProposedHandle; + RPC_BINDING_VECTOR *Bindings; +} RPC_IMPORT_CONTEXT_P,*PRPC_IMPORT_CONTEXT_P; +RPC_STATUS RPC_ENTRY I_RpcNsGetBuffer(IN PRPC_MESSAGE); +RPC_STATUS RPC_ENTRY I_RpcNsSendReceive(IN PRPC_MESSAGE,OUT RPC_BINDING_HANDLE*); +void RPC_ENTRY I_RpcNsRaiseException(IN PRPC_MESSAGE,IN RPC_STATUS); +RPC_STATUS RPC_ENTRY I_RpcReBindBuffer(IN PRPC_MESSAGE); +RPC_STATUS RPC_ENTRY I_NsServerBindSearch(void); +RPC_STATUS RPC_ENTRY I_NsClientBindSearch(void); +void RPC_ENTRY I_NsClientBindDone(void); +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/rpcnterr.h b/reactos/w32api/include/rpcnterr.h new file mode 100644 index 00000000000..b23c429c6e9 --- /dev/null +++ b/reactos/w32api/include/rpcnterr.h @@ -0,0 +1,23 @@ +#ifndef _RPCNTERR_H +#define _RPCNTERR_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#define RPC_S_OK ERROR_SUCCESS +#define RPC_S_INVALID_ARG ERROR_INVALID_PARAMETER +#define RPC_S_OUT_OF_MEMORY ERROR_OUTOFMEMORY +#define RPC_S_OUT_OF_THREADS ERROR_MAX_THRDS_REACHED +#define RPC_S_INVALID_LEVEL ERROR_INVALID_PARAMETER +#define RPC_S_BUFFER_TOO_SMALL ERROR_INSUFFICIENT_BUFFER +#define RPC_S_INVALID_SECURITY_DESC ERROR_INVALID_SECURITY_DESCR +#define RPC_S_ACCESS_DENIED ERROR_ACCESS_DENIED +#define RPC_S_SERVER_OUT_OF_MEMORY ERROR_NOT_ENOUGH_SERVER_MEMORY +#define RPC_X_NO_MEMORY RPC_S_OUT_OF_MEMORY +#define RPC_X_INVALID_BOUND RPC_S_INVALID_BOUND +#define RPC_X_INVALID_TAG RPC_S_INVALID_TAG +#define RPC_X_ENUM_VALUE_TOO_LARGE RPC_X_ENUM_VALUE_OUT_OF_RANGE +#define RPC_X_SS_CONTEXT_MISMATCH ERROR_INVALID_HANDLE +#define RPC_X_INVALID_BUFFER ERROR_INVALID_USER_BUFFER +#define RPC_X_INVALID_PIPE_OPERATION RPC_X_WRONG_PIPE_ORDER +#endif diff --git a/reactos/w32api/include/rpcproxy.h b/reactos/w32api/include/rpcproxy.h new file mode 100644 index 00000000000..5700e541aae --- /dev/null +++ b/reactos/w32api/include/rpcproxy.h @@ -0,0 +1,200 @@ +/* + -DREGISTER_PROXY_DLL Generates DllMain, DllRegisterServer, and DllUnregisterServer + -DPROXY_CLSID=clsid Specifies a class ID to be used by the proxy DLL. + -DPROXY_CLSID_IS={..} Specifies the class ID to be used by the proxy DLL. + -DNT35_STRICT No new features +*/ +#ifndef _RPCPROXY_H +#define _RPCPROXY_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#if defined __cplusplus && !defined CINTERFACE +#warning "rpcproxy type definitions require CINTERFACE" +#else +#ifdef __cplusplus +extern "C" { +#endif +#include <rpc.h> +#include <rpcndr.h> +#include <string.h> + +#define CStdStubBuffer_METHODS CStdStubBuffer_QueryInterface,CStdStubBuffer_AddRef,\ +CStdStubBuffer_Release,CStdStubBuffer_Connect,CStdStubBuffer_Disconnect,CStdStubBuffer_Invoke,\ +CStdStubBuffer_IsIIDSupported,CStdStubBuffer_CountRefs,CStdStubBuffer_DebugServerQueryInterface,\ +CStdStubBuffer_DebugServerRelease +#define IID_GENERIC_CHECK_IID(name,pIID,index) memcmp(pIID,name##_ProxyVtblList[index]->header.piid,16) +#define IID_BS_LOOKUP_SETUP int result, low=-1; +#define IID_BS_LOOKUP_INITIAL_TEST(name,sz,split) if ((result = name##_CHECK_IID(split))>0) { low=sz-split;} else if (!result) { low = split; goto found_label; } +#define IID_BS_LOOKUP_NEXT_TEST(name,split) if ((result = name##_CHECK_IID(low+split))>=0) { low=low+split; if (!result) goto found_label; } +#define IID_BS_LOOKUP_RETURN_RESULT(name,sz,index) low+=1; if ((low>=sz )||(result=name##_CHECK_IID(low))) goto not_found_label; found_label: (index)=low; return 1; not_found_label: return 0; +#define REGISTER_PROXY_DLL_ROUTINES(pProxyFileList, pClsID) \ +HINSTANCE hProxyDll = 0; \ +BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) \ +{ \ +if(fdwReason == DLL_PROCESS_ATTACH) hProxyDll = hinstDLL; \ +return TRUE; \ +} \ +HRESULT STDAPICALLTYPE DllRegisterServer(void) \ +{\ +return NdrDllRegisterProxy(hProxyDll, pProxyFileList, pClsID); \ +}\ +HRESULT STDAPICALLTYPE DllUnregisterServer(void)\ +{\ +return NdrDllUnregisterProxy(hProxyDll, pProxyFileList, pClsID);\ +} +#ifdef PROXY_CLSID +#define CLSID_PSFACTORYBUFFER extern CLSID PROXY_CLSID; +#else +#ifdef PROXY_CLSID_IS +#define CLSID_PSFACTORYBUFFER const CLSID CLSID_PSFactoryBuffer = PROXY_CLSID_IS; +#define PROXY_CLSID CLSID_PSFactoryBuffer +#else +#define CLSID_PSFACTORYBUFFER +#endif +#endif +#ifndef PROXY_CLSID +#define GET_DLL_CLSID (aProxyFileList[0]->pStubVtblList[0] != 0 ? aProxyFileList[0]->pStubVtblList[0]->header.piid : 0) +#else +#define GET_DLL_CLSID &PROXY_CLSID +#endif +#define EXTERN_PROXY_FILE(name) EXTERN_C const ProxyFileInfo name##_ProxyFileInfo; +#define PROXYFILE_LIST_START const ProxyFileInfo * aProxyFileList[] = { +#define REFERENCE_PROXY_FILE(name) & name##_ProxyFileInfo +#define PROXYFILE_LIST_END 0 }; +#define DLLDATA_GETPROXYDLLINFO(pPFList,pClsid) \ +void RPC_ENTRY GetProxyDllInfo( const ProxyFileInfo*** pInfo, const CLSID ** pId ) \ +{ *pInfo = pPFList; *pId = pClsid; }; +#define DLLGETCLASSOBJECTROUTINE(pPFlist, pClsid,pFactory) HRESULT STDAPICALLTYPE DllGetClassObject(REFCLSID rclsid,REFIID riid,void **ppv) \ +{ return NdrDllGetClassObject(rclsid,riid,ppv,pPFlist,pClsid,pFactory ); } +#define DLLCANUNLOADNOW(pFactory) HRESULT STDAPICALLTYPE DllCanUnloadNow(void) \ +{ return NdrDllCanUnloadNow( pFactory ); } +#define DLLDUMMYPURECALL void __cdecl _purecall(void) { } +#define CSTDSTUBBUFFERRELEASE(pFactory) ULONG STDMETHODCALLTYPE CStdStubBuffer_Release(IRpcStubBuffer *This) \ +{ return NdrCStdStubBuffer_Release(This,(IPSFactoryBuffer *)pFactory); } +#ifdef PROXY_DELEGATION +#define CSTDSTUBBUFFER2RELEASE(pFactory) ULONG STDMETHODCALLTYPE CStdStubBuffer2_Release(IRpcStubBuffer *This) \ +{ return NdrCStdStubBuffer2_Release(This,(IPSFactoryBuffer *)pFactory); } +#else +#define CSTDSTUBBUFFER2RELEASE(pFactory) +#endif + +#ifdef REGISTER_PROXY_DLL +#define DLLREGISTRY_ROUTINES(pProxyFileList,pClsID ) REGISTER_PROXY_DLL_ROUTINES(pProxyFileList,pClsID) +#else +#define DLLREGISTRY_ROUTINES(pProxyFileList,pClsID) +#endif +#define DLLDATA_ROUTINES(pProxyFileList,pClsID) \ +CLSID_PSFACTORYBUFFER \ +CStdPSFactoryBuffer gPFactory = {0,0,0,0}; \ +DLLDATA_GETPROXYDLLINFO(pProxyFileList,pClsID) \ +DLLGETCLASSOBJECTROUTINE(pProxyFileList,pClsID,&gPFactory) \ +DLLCANUNLOADNOW(&gPFactory) \ +CSTDSTUBBUFFERRELEASE(&gPFactory) \ +CSTDSTUBBUFFER2RELEASE(&gPFactory) \ +DLLDUMMYPURECALL \ +DLLREGISTRY_ROUTINES(pProxyFileList, pClsID) + +#define DLLDATA_STANDARD_ROUTINES DLLDATA_ROUTINES( (const ProxyFileInfo**) pProxyFileList, &CLSID_PSFactoryBuffer) + +struct tagCInterfaceStubVtbl; +struct tagCInterfaceProxyVtbl; +typedef struct tagCInterfaceStubVtbl *PCInterfaceStubVtblList; +typedef struct tagCInterfaceProxyVtbl *PCInterfaceProxyVtblList; +typedef const char *PCInterfaceName; +typedef int __stdcall IIDLookupRtn(const IID*,int*); +typedef IIDLookupRtn *PIIDLookup; +typedef struct tagProxyFileInfo { + const PCInterfaceProxyVtblList *pProxyVtblList; + const PCInterfaceStubVtblList *pStubVtblList; + const PCInterfaceName * pNamesArray; + const IID ** pDelegatedIIDs; + const PIIDLookup pIIDLookupRtn; + unsigned short TableSize; + unsigned short TableVersion; + unsigned long Filler1; + unsigned long Filler2; + unsigned long Filler3; + unsigned long Filler4; +}ProxyFileInfo; +typedef ProxyFileInfo ExtendedProxyFileInfo; + +typedef struct tagCInterfaceProxyHeader { +#ifdef USE_STUBLESS_PROXY + const void *pStublessProxyInfo; +#endif + const IID *piid; +} CInterfaceProxyHeader; +typedef struct tagCInterfaceProxyVtbl { + CInterfaceProxyHeader header; +#if defined(__WATCOMC__) + void *Vtbl[1]; +#else +#ifdef __GNUC__ +__extension__ +#endif + void *Vtbl[0]; +#endif +} CInterfaceProxyVtbl; +typedef void (__RPC_STUB *PRPC_STUB_FUNCTION)(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,DWORD*); +typedef struct tagCInterfaceStubHeader { + const IID *piid; + const MIDL_SERVER_INFO *pServerInfo; + unsigned long DispatchTableCount; + const PRPC_STUB_FUNCTION *pDispatchTable; +} CInterfaceStubHeader; +typedef struct tagCInterfaceStubVtbl { + CInterfaceStubHeader header; + IRpcStubBufferVtbl Vtbl; +} CInterfaceStubVtbl; +typedef struct tagCStdStubBuffer { + const struct IRpcStubBufferVtbl * lpVtbl; + long RefCount; + struct IUnknown *pvServerObject; +} CStdStubBuffer; +typedef struct tagCStdPSFactoryBuffer { + const IPSFactoryBufferVtbl *lpVtbl; + long RefCount; + const ProxyFileInfo ** pProxyFileList; + long Filler1; +} CStdPSFactoryBuffer; +void RPC_ENTRY NdrProxyInitialize(void*,PRPC_MESSAGE,PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC,unsigned int); +void RPC_ENTRY NdrProxyGetBuffer(void*,PMIDL_STUB_MESSAGE); +void RPC_ENTRY NdrProxySendReceive(void*,MIDL_STUB_MESSAGE*); +void RPC_ENTRY NdrProxyFreeBuffer(void*,MIDL_STUB_MESSAGE*); +HRESULT RPC_ENTRY NdrProxyErrorHandler(DWORD); +void RPC_ENTRY NdrStubInitialize(PRPC_MESSAGE,PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC,IRpcChannelBuffer*); +void __RPC_STUB NdrStubForwardingFunction(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,DWORD*); +void RPC_ENTRY NdrStubGetBuffer(IRpcStubBuffer*,IRpcChannelBuffer*,PMIDL_STUB_MESSAGE); +HRESULT RPC_ENTRY NdrStubErrorHandler(DWORD); +HRESULT STDMETHODCALLTYPE CStdStubBuffer_QueryInterface(IRpcStubBuffer*,REFIID,void**); +ULONG STDMETHODCALLTYPE CStdStubBuffer_AddRef(IRpcStubBuffer*); +ULONG STDMETHODCALLTYPE CStdStubBuffer_Release(IRpcStubBuffer*); +ULONG STDMETHODCALLTYPE NdrCStdStubBuffer_Release(IRpcStubBuffer*,IPSFactoryBuffer*); +HRESULT STDMETHODCALLTYPE CStdStubBuffer_Connect(IRpcStubBuffer*,IUnknown*); +void STDMETHODCALLTYPE CStdStubBuffer_Disconnect(IRpcStubBuffer*); +HRESULT STDMETHODCALLTYPE CStdStubBuffer_Invoke(IRpcStubBuffer*,RPCOLEMESSAGE*,IRpcChannelBuffer*); +IRpcStubBuffer* STDMETHODCALLTYPE CStdStubBuffer_IsIIDSupported(IRpcStubBuffer*,REFIID); +ULONG STDMETHODCALLTYPE CStdStubBuffer_CountRefs(IRpcStubBuffer*); +HRESULT STDMETHODCALLTYPE CStdStubBuffer_DebugServerQueryInterface(IRpcStubBuffer*,void**); +void STDMETHODCALLTYPE CStdStubBuffer_DebugServerRelease(IRpcStubBuffer*,void*); +HRESULT RPC_ENTRY NdrDllGetClassObject(REFCLSID,REFIID,void**,const ProxyFileInfo**,const CLSID*,CStdPSFactoryBuffer*); +HRESULT RPC_ENTRY NdrDllCanUnloadNow(CStdPSFactoryBuffer*); +#ifndef NT35_STRICT +HRESULT RPC_ENTRY NdrDllRegisterProxy(HMODULE,const ProxyFileInfo**,const CLSID*); +HRESULT RPC_ENTRY NdrDllUnregisterProxy(HMODULE,const ProxyFileInfo**,const CLSID*); +#define STUB_FORWARDING_FUNCTION NdrStubForwardingFunction +ULONG STDMETHODCALLTYPE +CStdStubBuffer2_Release(IRpcStubBuffer*); +ULONG STDMETHODCALLTYPE +NdrCStdStubBuffer2_Release(IRpcStubBuffer*,IPSFactoryBuffer*); +#define CStdStubBuffer_DELEGATING_METHODS 0, 0, CStdStubBuffer2_Release, 0, 0, 0, 0, 0, 0, 0 +#endif + +#ifdef __cplusplus +} +#endif +#endif /* defined __cplusplus && !defined CINTERFACE */ +#endif /* ndef _RPCPROXY_H */ + diff --git a/reactos/w32api/include/schannel.h b/reactos/w32api/include/schannel.h new file mode 100644 index 00000000000..e0105551710 --- /dev/null +++ b/reactos/w32api/include/schannel.h @@ -0,0 +1,90 @@ +#ifndef _SCHANNEL_H +#define _SCHANNEL_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#include <wincrypt.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#define SCHANNEL_CRED_VERSION 4 +#define SCHANNEL_SHUTDOWN 1 +/* ? Do these belong here or in wincrypt.h */ +#define AUTHTYPE_CLIENT 1 +#define AUTHTYPE_SERVER 2 + +#define SP_PROT_TLS1_CLIENT 128 +#define SP_PROT_TLS1_SERVER 64 +#define SP_PROT_SSL3_CLIENT 32 +#define SP_PROT_SSL3_SERVER 16 +#define SP_PROT_SSL2_CLIENT 8 +#define SP_PROT_SSL2_SERVER 4 +#define SP_PROT_PCT1_SERVER 1 +#define SP_PROT_PCT1_CLIENT 2 + +#define SP_PROT_PCT1 (SP_PROT_PCT1_CLIENT|SP_PROT_PCT1_SERVER) +#define SP_PROT_TLS1 (SP_PROT_TLS1_CLIENT|SP_PROT_TLS1_SERVER) +#define SP_PROT_SSL2 (SP_PROT_SSL2_CLIENT|SP_PROT_SSL2_SERVER) +#define SP_PROT_SSL3 (SP_PROT_SSL3_CLIENT|SP_PROT_SSL3_SERVER) + +#define SCH_CRED_NO_SYSTEM_MAPPER 2 +#define SCH_CRED_NO_SERVERNAME_CHECK 4 +#define SCH_CRED_MANUAL_CRED_VALIDATION 8 +#define SCH_CRED_NO_DEFAULT_CREDS 16 +#define SCH_CRED_AUTO_CRED_VALIDATION 32 +#define SCH_CRED_REVOCATION_CHECK_CHAIN 512 +#define SCH_CRED_REVOCATION_CHECK_END_CERT 256 +#define SCH_CRED_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT 1024 +#define SCH_CRED_IGNORE_NO_REVOCATION_CHECK 2048 +#define SCH_CRED_IGNORE_REVOCATION_OFFLINE 4096 +#define SCH_CRED_USE_DEFAULT_CREDS 64 + +typedef struct _SCHANNEL_CRED { + DWORD dwVersion; + DWORD cCreds; + PCCERT_CONTEXT* paCred; + HCERTSTORE hRootStore; + DWORD cMappers; + struct _HMAPPER** aphMappers; + DWORD cSupportedAlgs; + ALG_ID* palgSupportedAlgs; + DWORD grbitEnabledProtocols; + DWORD dwMinimumCypherStrength; + DWORD dwMaximumCypherStrength; + DWORD dwSessionLifespan; + DWORD dwFlags; + DWORD reserved; +} SCHANNEL_CRED, *PSCHANNEL_CRED; +typedef struct _SecPkgCred_SupportedAlgs { + DWORD cSupportedAlgs; + ALG_ID* palgSupportedAlgs; +} SecPkgCred_SupportedAlgs, *PSecPkgCred_SupportedAlgs; +typedef struct _SecPkgCred_CypherStrengths { + DWORD dwMinimumCypherStrength; + DWORD dwMaximumCypherStrength; +} SecPkgCred_CypherStrengths, *PSecPkgCred_CypherStrengths; +typedef struct _SecPkgCred_SupportedProtocols { + DWORD grbitProtocol; +} SecPkgCred_SupportedProtocols, *PSecPkgCred_SupportedProtocols; +typedef struct _SecPkgContext_IssuerListInfoEx { + PCERT_NAME_BLOB aIssuers; + DWORD cIssuers; +} SecPkgContext_IssuerListInfoEx, *PSecPkgContext_IssuerListInfoEx; +typedef struct _SecPkgContext_ConnectionInfo { + DWORD dwProtocol; + ALG_ID aiCipher; + DWORD dwCipherStrength; + ALG_ID aiHash; + DWORD dwHashStrength; + ALG_ID aiExch; + DWORD dwExchStrength; +} SecPkgContext_ConnectionInfo, *PSecPkgContext_ConnectionInfo; + +#ifdef __cplusplus +} +#endif + +#endif /* _SCHANNEL_H */ diff --git a/reactos/w32api/include/schnlsp.h b/reactos/w32api/include/schnlsp.h new file mode 100644 index 00000000000..8e9e09574b2 --- /dev/null +++ b/reactos/w32api/include/schnlsp.h @@ -0,0 +1,14 @@ +#ifndef _SCHNLSP_H +#define _SCHNLSP_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + + +#define SECPKG_ATTR_SUPPORTED_ALGS 86 +#define SECPKG_ATTR_CIPHER_STRENGTHS 87 +#define SECPKG_ATTR_SUPPORTED_PROTOCOLS 88 + +#include <schannel.h> + +#endif /* _SCHNLSP_H */ diff --git a/reactos/w32api/include/scrnsave.h b/reactos/w32api/include/scrnsave.h new file mode 100644 index 00000000000..5cee4b66e71 --- /dev/null +++ b/reactos/w32api/include/scrnsave.h @@ -0,0 +1,81 @@ +/* + Screen saver library by Anders Norlander <anorland@hem2.passagen.se> + + This library is (hopefully) compatible with Microsoft's + screen saver library. + + This is public domain software. + + */ +#ifndef _SCRNSAVE_H +#define _SCRNSAVE_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* configure dialog identifier */ +#define DLG_SCRNSAVECONFIGURE 2003 + +#define idsIsPassword 1000 +#define idsIniFile 1001 +#define idsScreenSaver 1002 +#define idsPassword 1003 +#define idsDifferentPW 1004 +#define idsChangePW 1005 +#define idsBadOldPW 1006 +#define idsAppName 1007 +#define idsNoHelpMemory 1008 +#define idsHelpFile 1009 +#define idsDefKeyword 1010 + +#define IDS_DESCRIPTION 1 +#define ID_APP 100 + +#define WS_GT (WS_GROUP | WS_TABSTOP) +#define SCRM_VERIFYPW WM_APP +#define MAXFILELEN 13 +#define TITLEBARNAMELEN 40 +#define APPNAMEBUFFERLEN 40 +#define BUFFLEN 255 + +#ifndef RC_INVOKED + +/* functions provided by the aothor of the screen saver */ +BOOL WINAPI ScreenSaverConfigureDialog(HWND,UINT,WPARAM,LPARAM); +BOOL WINAPI RegisterDialogClasses(HANDLE); +LONG WINAPI ScreenSaverProc(HWND,UINT,WPARAM,LPARAM); + +/* Change name of function if we are using UNICODE */ +#ifdef UNICODE +#define DefScreenSaverProc DefScreenSaverProcW +#endif + +/* default screen saver proc; call instead of DefWindowProc */ +LONG WINAPI DefScreenSaverProc(HWND,UINT,WPARAM,LPARAM); + +/* change password */ +void WINAPI ScreenSaverChangePassword(HWND); + +/* globals that may be used by screen saver */ +extern HINSTANCE hMainInstance; +extern HWND hMainWindow; +extern BOOL fChildPreview; +extern TCHAR szName[]; +extern TCHAR szAppName[]; +extern TCHAR szIniFile[]; +extern TCHAR szScreenSaver[]; +extern TCHAR szHelpFile[]; +extern TCHAR szNoHelpMemory[]; +extern UINT MyHelpMessage; + +#endif /* RC_INVOKED */ + +#ifdef __cplusplus +} +#endif + +#endif /* _SCRNSAVE_H */ diff --git a/reactos/w32api/include/secext.h b/reactos/w32api/include/secext.h new file mode 100644 index 00000000000..1919f4fefe5 --- /dev/null +++ b/reactos/w32api/include/secext.h @@ -0,0 +1,43 @@ +#ifndef _SECEXT_H +#define _SECEXT_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifndef RC_INVOKED +#if (_WIN32_WINNT >= 0x0500) +typedef enum +{ + NameUnknown = 0, + NameFullyQualifiedDN = 1, + NameSamCompatible = 2, + NameDisplay = 3, + NameUniqueId = 6, + NameCanonical = 7, + NameUserPrincipal = 8, + NameCanonicalEx = 9, + NameServicePrincipal = 10, + NameDnsDomain = 12 +} EXTENDED_NAME_FORMAT, *PEXTENDED_NAME_FORMAT; + +BOOLEAN WINAPI GetComputerObjectNameA(EXTENDED_NAME_FORMAT,LPSTR,PULONG); +BOOLEAN WINAPI GetComputerObjectNameW(EXTENDED_NAME_FORMAT,LPWSTR,PULONG); +BOOLEAN WINAPI GetUserNameExA(EXTENDED_NAME_FORMAT,LPSTR,PULONG); +BOOLEAN WINAPI GetUserNameExW(EXTENDED_NAME_FORMAT,LPWSTR,PULONG); +BOOLEAN WINAPI TranslateNameA(LPCSTR,EXTENDED_NAME_FORMAT,EXTENDED_NAME_FORMAT,LPSTR,PULONG); +BOOLEAN WINAPI TranslateNameW(LPCWSTR,EXTENDED_NAME_FORMAT,EXTENDED_NAME_FORMAT,LPWSTR,PULONG); + +#ifdef UNICODE +#define GetComputerObjectName GetComputerObjectNameW +#define GetUserNameEx GetUserNameExW +#define TranslateName TranslateNameW +#else +#define GetComputerObjectName GetComputerObjectNameA +#define GetUserNameEx GetUserNameExA +#define TranslateName TranslateNameA +#endif + + +#endif /* ! RC_INVOKED */ +#endif /* _WIN32_WINNT >= 0x0500 */ +#endif /* ! _SECEXT_H */ diff --git a/reactos/w32api/include/security.h b/reactos/w32api/include/security.h new file mode 100644 index 00000000000..9685cf05146 --- /dev/null +++ b/reactos/w32api/include/security.h @@ -0,0 +1,42 @@ +#ifndef _SECURITY_H +#define _SECURITY_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + + +#define SEC_E_OK 0 +#define SEC_E_CERT_EXPIRED (-2146893016) +#define SEC_E_INCOMPLETE_MESSAGE (-2146893032) +#define SEC_E_INSUFFICIENT_MEMORY (-2146893056) +#define SEC_E_INTERNAL_ERROR (-2146893052) +#define SEC_E_INVALID_HANDLE (-2146893055) +#define SEC_E_INVALID_TOKEN (-2146893048) +#define SEC_E_LOGON_DENIED (-2146893044) +#define SEC_E_NO_AUTHENTICATING_AUTHORITY (-2146893039) +#define SEC_E_NO_CREDENTIALS (-2146893042) +#define SEC_E_TARGET_UNKNOWN (-2146893053) +#define SEC_E_UNSUPPORTED_FUNCTION (-2146893054) +#define SEC_E_UNTRUSTED_ROOT (-2146893019) +#define SEC_E_WRONG_PRINCIPAL (-2146893022) +#define SEC_E_SECPKG_NOT_FOUND (-2146893051) +#define SEC_E_QOP_NOT_SUPPORTED (-2146893046) +#define SEC_E_UNKNOWN_CREDENTIALS (-2146893043) +#define SEC_E_NOT_OWNER (-2146893050) +#define SEC_I_RENEGOTIATE 590625 +#define SEC_I_COMPLETE_AND_CONTINUE 590612 +#define SEC_I_COMPLETE_NEEDED 590611 +#define SEC_I_CONTINUE_NEEDED 590610 +#define SEC_I_INCOMPLETE_CREDENTIALS 590624 + +/* always a char */ +typedef char SEC_CHAR; +typedef wchar_t SEC_WCHAR; +typedef long SECURITY_STATUS; +#define SEC_FAR + +#include <sspi.h> +#include <ntsecpkg.h> +#include <secext.h> + +#endif /* _SECURITY_H */ diff --git a/reactos/w32api/include/servprov.h b/reactos/w32api/include/servprov.h new file mode 100644 index 00000000000..4905d69e495 --- /dev/null +++ b/reactos/w32api/include/servprov.h @@ -0,0 +1,33 @@ +#ifndef _SERVPROV_H +#define _SERVPROV_H +#define _OLEIDL_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +EXTERN_C const IID IID_IServiceProvider; +#undef INTERFACE +#define INTERFACE IServiceProvider +DECLARE_INTERFACE_(IServiceProvider,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(QueryService)(THIS_ REFGUID,REFIID,void**) PURE; +}; + +#ifdef COBJMACROS +#define IServiceProvider_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IServiceProvider_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IServiceProvider_Release(T) (T)->lpVtbl->Release(T) +#define IServiceProvider_QueryService(T,a,b,c) (T)->lpVtbl->QueryService(T,a,b,c) +#endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/setupapi.h b/reactos/w32api/include/setupapi.h new file mode 100644 index 00000000000..2202141f049 --- /dev/null +++ b/reactos/w32api/include/setupapi.h @@ -0,0 +1,1579 @@ +#ifndef _SETUPAPI_H_ +#define _SETUPAPI_H_ +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#include <commctrl.h> +#include <pshpack1.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#define WINSETUPAPI DECLSPEC_IMPORT + +#define LINE_LEN 256 +#define MAX_INF_STRING_LENGTH 4096 +#define MAX_TITLE_LEN 60 +#define MAX_INSTRUCTION_LEN 256 +#define MAX_LABEL_LEN 30 +#define MAX_SERVICE_NAME_LEN 256 +#define MAX_SUBTITLE_LEN 256 +#define SP_MAX_MACHINENAME_LENGTH (MAX_PATH + 3) + +#define COPYFLG_WARN_IF_SKIP 0x00000001 +#define COPYFLG_NOSKIP 0x00000002 +#define COPYFLG_NOVERSIONCHECK 0x00000004 +#define COPYFLG_FORCE_FILE_IN_USE 0x00000008 +#define COPYFLG_NO_OVERWRITE 0x00000010 +#define COPYFLG_NO_VERSION_DIALOG 0x00000020 +#define COPYFLG_OVERWRITE_OLDER_ONLY 0x00000040 +#define COPYFLG_REPLACEONLY 0x00000400 +#define COPYFLG_NODECOMP 0x00000800 +#define COPYFLG_REPLACE_BOOT_FILE 0x00001000 +#define COPYFLG_NOPRUNE 0x00002000 +#define DELFLG_IN_USE 0x00000001 +#define DELFLG_IN_USE1 0x00010000 +#define DI_REMOVEDEVICE_GLOBAL 0x00000001 +#define DI_REMOVEDEVICE_CONFIGSPECIFIC 0x00000002 +#define DI_UNREMOVEDEVICE_CONFIGSPECIFIC 0x00000002 +#define DI_SHOWOEM 0x00000001 +#define DI_SHOWCOMPAT 0x00000002 +#define DI_SHOWCLASS 0x00000004 +#define DI_SHOWALL 0x00000007 +#define DI_NOVCP 0x00000008 +#define DI_DIDCOMPAT 0x00000010 +#define DI_DIDCLASS 0x00000020 +#define DI_AUTOASSIGNRES 0x00000040 +#define DI_NEEDRESTART 0x00000080 +#define DI_NEEDREBOOT 0x00000100 +#define DI_NOBROWSE 0x00000200 +#define DI_MULTMFGS 0x00000400 +#define DI_DISABLED 0x00000800 +#define DI_GENERALPAGE_ADDED 0x00001000 +#define DI_RESOURCEPAGE_ADDED 0x00002000 +#define DI_PROPERTIES_CHANGE 0x00004000 +#define DI_INF_IS_SORTED 0x00008000 +#define DI_ENUMSINGLEINF 0x00010000 +#define DI_DONOTCALLCONFIGMG 0x00020000 +#define DI_INSTALLDISABLED 0x00040000 +#define DI_COMPAT_FROM_CLASS 0x00080000 +#define DI_CLASSINSTALLPARAMS 0x00100000 +#define DI_NODI_DEFAULTACTION 0x00200000 +#define DI_QUIETINSTALL 0x00800000 +#define DI_NOFILECOPY 0x01000000 +#define DI_FORCECOPY 0x02000000 +#define DI_DRIVERPAGE_ADDED 0x04000000 +#define DI_USECI_SELECTSTRINGS 0x08000000 +#define DI_OVERRIDE_INFFLAGS 0x10000000 +#define DI_PROPS_NOCHANGEUSAGE 0x20000000 +#define DI_NOSELECTICONS 0x40000000 +#define DI_NOWRITE_IDS 0x80000000 +#define DI_FLAGSEX_USEOLDINFSEARCH 0x00000001 +#define DI_FLAGSEX_AUTOSELECTRANK0 0x00000002 +#define DI_FLAGSEX_CI_FAILED 0x00000004 +#define DI_FLAGSEX_DIDINFOLIST 0x00000010 +#define DI_FLAGSEX_DIDCOMPATINFO 0x00000020 +#define DI_FLAGSEX_FILTERCLASSES 0x00000040 +#define DI_FLAGSEX_SETFAILEDINSTALL 0x00000080 +#define DI_FLAGSEX_DEVICECHANGE 0x00000100 +#define DI_FLAGSEX_ALWAYSWRITEIDS 0x00000200 +#define DI_FLAGSEX_PROPCHANGE_PENDING 0x00000400 +#define DI_FLAGSEX_ALLOWEXCLUDEDDRVS 0x00000800 +#define DI_FLAGSEX_NOUIONQUERYREMOVE 0x00001000 +#define DI_FLAGSEX_USECLASSFORCOMPAT 0x00002000 +#define DI_FLAGSEX_OLDINF_IN_CLASSLIST 0x00004000 +#define DI_FLAGSEX_NO_DRVREG_MODIFY 0x00008000 +#define DI_FLAGSEX_IN_SYSTEM_SETUP 0x00010000 +#define DI_FLAGSEX_INET_DRIVER 0x00020000 +#define DI_FLAGSEX_APPENDDRIVERLIST 0x00040000 +#define DI_FLAGSEX_PREINSTALLBACKUP 0x00080000 +#define DI_FLAGSEX_BACKUPONREPLACE 0x00100000 +#define DI_FLAGSEX_DRIVERLIST_FROM_URL 0x00200000 +#define DI_FLAGSEX_RESERVED1 0x00400000 +#define DI_FLAGSEX_EXCLUDE_OLD_INET_DRIVERS 0x00800000 +#define DI_FLAGSEX_POWERPAGE_ADDED 0x01000000 +#define DIBCI_NOINSTALLCLASS 0x00000001 +#define DIBCI_NODISPLAYCLASS 0x00000002 +#define DICD_GENERATE_ID 0x00000001 +#define DICD_INHERIT_CLASSDRVS 0x00000002 +#define DICS_ENABLE 1 +#define DICS_FLAG_GLOBAL 1 +#define DICS_DISABLE 2 +#define DICS_FLAG_CONFIGSPECIFIC 2 +#define DICS_PROPCHANGE 3 +#define DICS_START 4 +#define DICS_FLAG_CONFIGGENERAL 4 +#define DICS_STOP 5 +#define DIF_SELECTDEVICE 1 +#define DIF_INSTALLDEVICE 2 +#define DIF_ASSIGNRESOURCES 3 +#define DIF_PROPERTIES 4 +#define DIF_REMOVE 5 +#define DIF_FIRSTTIMESETUP 6 +#define DIF_FOUNDDEVICE 7 +#define DIF_SELECTCLASSDRIVERS 8 +#define DIF_VALIDATECLASSDRIVERS 9 +#define DIF_INSTALLCLASSDRIVERS 10 +#define DIF_CALCDISKSPACE 11 +#define DIF_DESTROYPRIVATEDATA 12 +#define DIF_VALIDATEDRIVER 13 +#define DIF_MOVEDEVICE 14 +#define DIF_DETECT 15 +#define DIF_INSTALLWIZARD 16 +#define DIF_DESTROYWIZARDDATA 17 +#define DIF_PROPERTYCHANGE 18 +#define DIF_ENABLECLASS 19 +#define DIF_DETECTVERIFY 20 +#define DIF_INSTALLDEVICEFILES 21 +#define DIF_UNREMOVE 22 +#define DIF_SELECTBESTCOMPATDRV 23 +#define DIF_ALLOW_INSTALL 24 +#define DIF_REGISTERDEVICE 25 +#define DIF_NEWDEVICEWIZARD_PRESELECT 26 +#define DIF_NEWDEVICEWIZARD_SELECT 27 +#define DIF_NEWDEVICEWIZARD_PREANALYZE 28 +#define DIF_NEWDEVICEWIZARD_POSTANALYZE 29 +#define DIF_NEWDEVICEWIZARD_FINISHINSTALL 30 +#define DIF_UNUSED1 31 +#define DIF_INSTALLINTERFACES 32 +#define DIF_DETECTCANCEL 33 +#define DIF_REGISTER_COINSTALLERS 34 +#define DIF_ADDPROPERTYPAGE_ADVANCED 35 +#define DIF_ADDPROPERTYPAGE_BASIC 36 +#define DIF_RESERVED1 37 +#define DIF_TROUBLESHOOTER 38 +#define DIF_POWERMESSAGEWAKE 39 +#define DIGCF_DEFAULT 0x00000001 +#define DIGCDP_FLAG_BASIC 0x00000001 +#define DIGCF_PRESENT 0x00000002 +#define DIGCDP_FLAG_ADVANCED 0x00000002 +#define DIGCF_ALLCLASSES 0x00000004 +#define DIGCF_PROFILE 0x00000008 +#define DIGCF_DEVICEINTERFACE 0x00000010 +#define DIGCF_INTERFACEDEVICE 0x00000010 +#define DIOCR_INSTALLER 0x00000001 +#define DIOCR_INTERFACE 0x00000002 +#define DIODI_NO_ADD 0x00000001 +#define DIOD_INHERIT_CLASSDRVS 0x00000002 +#define DIOD_CANCEL_REMOVE 0x00000004 +#define DIREG_DEV 0x00000001 +#define DIREG_DRV 0x00000002 +#define DIREG_BOTH 0x00000004 +#define DIRID_ABSOLUTE -1 +#define DIRID_NULL 0 +#define DIRID_SRCPATH 1 +#define DIRID_WINDOWS 10 +#define DIRID_SYSTEM 11 +#define DIRID_DRIVERS 12 +#define DIRID_INF 17 +#define DIRID_HELP 18 +#define DIRID_FONTS 20 +#define DIRID_VIEWERS 21 +#define DIRID_COLOR 23 +#define DIRID_APPS 24 +#define DIRID_SHARED 25 +#define DIRID_BOOT 30 +#define DIRID_SYSTEM16 50 +#define DIRID_SPOOL 51 +#define DIRID_SPOOLDRIVERS 52 +#define DIRID_USERPROFILE 53 +#define DIRID_LOADER 54 +#define DIRID_PRINTPROCESSOR 55 +#define DIRID_COMMON_STARTMENU 16406 +#define DIRID_COMMON_PROGRAMS 16407 +#define DIRID_COMMON_STARTUP 16408 +#define DIRID_COMMON_DESKTOPDIRECTORY 16409 +#define DIRID_COMMON_FAVORITES 16415 +#define DIRID_COMMON_APPDATA 16419 +#define DIRID_PROGRAM_FILES 16422 +#define DIRID_SYSTEM_X86 16425 +#define DIRID_PROGRAM_FILES_X86 16426 +#define DIRID_PROGRAM_FILES_COMMON 16427 +#define DIRID_PROGRAM_FILES_COMMONX86 16428 +#define DIRID_COMMON_TEMPLATES 16429 +#define DIRID_COMMON_DOCUMENTS 16430 +#define DIRID_USER 0x8000 +#define DIRID_ABSOLUTE_16BIT 0xffff +#define DIRID_IOSUBSYS DIRID_DRIVERS +#define DIRID_DEFAULT DIRID_SYSTEM +#define DMI_MASK 0x00000001 +#define DMI_BKCOLOR 0x00000002 +#define DMI_USERECT 0x00000004 +#define DNF_DUPDESC 0x00000001 +#define DNF_OLDDRIVER 0x00000002 +#define DNF_EXCLUDEFROMLIST 0x00000004 +#define DNF_NODRIVER 0x00000008 +#define DNF_LEGACYINF 0x00000010 +#define DNF_CLASS_DRIVER 0x00000020 +#define DNF_COMPATIBLE_DRIVER 0x00000040 +#define DNF_INET_DRIVER 0x00000080 +#define DNF_UNUSED1 0x00000100 +#define DNF_INDEXED_DRIVER 0x00000200 +#define DNF_OLD_INET_DRIVER 0x00000400 +#define DNF_BAD_DRIVER 0x00000800 +#define DNF_DUPPROVIDER 0x00001000 +#define DPROMPT_SUCCESS 0 +#define DPROMPT_CANCEL 1 +#define DPROMPT_SKIPFILE 2 +#define DPROMPT_BUFFERTOOSMALL 3 +#define DPROMPT_OUTOFMEMORY 4 +#define DRIVER_HARDWAREID_RANK 0x00000FFF +#define DYNAWIZ_FLAG_PAGESADDED 0x00000001 +#define DYNAWIZ_FLAG_INSTALLDET_NEXT 0x00000002 +#define DYNAWIZ_FLAG_INSTALLDET_PREV 0x00000004 +#define DYNAWIZ_FLAG_ANALYZE_HANDLECONFLICT 0x00000008 +#define ENABLECLASS_QUERY 0 +#define ENABLECLASS_SUCCESS 1 +#define ENABLECLASS_FAILURE 2 +#define ERROR_EXPECTED_SECTION_NAME (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0) +#define ERROR_BAD_SECTION_NAME_LINE (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|1) +#define ERROR_SECTION_NAME_TOO_LONG (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|2) +#define ERROR_GENERAL_SYNTAX (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|3) +#define ERROR_WRONG_INF_STYLE (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x100) +#define ERROR_NOT_INSTALLED (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x1000) +#define ERROR_SECTION_NOT_FOUND (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x101) +#define ERROR_LINE_NOT_FOUND (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x102) +#define ERROR_NO_BACKUP (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x103) +#define ERROR_NO_ASSOCIATED_CLASS (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x200) +#define ERROR_CLASS_MISMATCH (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x201) +#define ERROR_DUPLICATE_FOUND (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x202) +#define ERROR_NO_DRIVER_SELECTED (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x203) +#define ERROR_KEY_DOES_NOT_EXIST (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x204) +#define ERROR_INVALID_DEVINST_NAME (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x205) +#define ERROR_INVALID_CLASS (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x206) +#define ERROR_DEVINST_ALREADY_EXISTS (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x207) +#define ERROR_DEVINFO_NOT_REGISTERED (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x208) +#define ERROR_INVALID_REG_PROPERTY (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x209) +#define ERROR_NO_INF (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x20A) +#define ERROR_NO_SUCH_DEVINST (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x20B) +#define ERROR_CANT_LOAD_CLASS_ICON (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x20C) +#define ERROR_INVALID_CLASS_INSTALLER (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x20D) +#define ERROR_DI_DO_DEFAULT (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x20E) +#define ERROR_DI_NOFILECOPY (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x20F) +#define ERROR_INVALID_HWPROFILE (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x210) +#define ERROR_NO_DEVICE_SELECTED (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x211) +#define ERROR_DEVINFO_LIST_LOCKED (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x212) +#define ERROR_DEVINFO_DATA_LOCKED (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x213) +#define ERROR_DI_BAD_PATH (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x214) +#define ERROR_NO_CLASSINSTALL_PARAMS (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x215) +#define ERROR_FILEQUEUE_LOCKED (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x216) +#define ERROR_BAD_SERVICE_INSTALLSECT (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x217) +#define ERROR_NO_CLASS_DRIVER_LIST (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x218) +#define ERROR_NO_ASSOCIATED_SERVICE (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x219) +#define ERROR_NO_DEFAULT_DEVICE_INTERFACE (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x21A) +#define ERROR_DEVICE_INTERFACE_ACTIVE (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x21B) +#define ERROR_DEVICE_INTERFACE_REMOVED (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x21C) +#define ERROR_BAD_INTERFACE_INSTALLSECT (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x21D) +#define ERROR_NO_SUCH_INTERFACE_CLASS (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x21E) +#define ERROR_INVALID_REFERENCE_STRING (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x21F) +#define ERROR_INVALID_MACHINENAME (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x220) +#define ERROR_REMOTE_COMM_FAILURE (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x221) +#define ERROR_MACHINE_UNAVAILABLE (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x222) +#define ERROR_NO_CONFIGMGR_SERVICES (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x223) +#define ERROR_INVALID_PROPPAGE_PROVIDER (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x224) +#define ERROR_NO_SUCH_DEVICE_INTERFACE (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x225) +#define ERROR_DI_POSTPROCESSING_REQUIRED (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x226) +#define ERROR_INVALID_COINSTALLER (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x227) +#define ERROR_NO_COMPAT_DRIVERS (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x228) +#define ERROR_NO_DEVICE_ICON (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x229) +#define ERROR_INVALID_INF_LOGCONFIG (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x22A) +#define ERROR_DI_DONT_INSTALL (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x22B) +#define ERROR_INVALID_FILTER_DRIVER (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x22C) +#define ERROR_NON_WINDOWS_NT_DRIVER (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x22D) +#define ERROR_NON_WINDOWS_DRIVER (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x22E) +#define ERROR_NO_CATALOG_FOR_OEM_INF (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x22F) +#define ERROR_DEVINSTALL_QUEUE_NONNATIVE (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x230) +#define ERROR_NOT_DISABLEABLE (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x231) +#define ERROR_CANT_REMOVE_DEVINST (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x232) +#define ERROR_INTERFACE_DEVICE_ACTIVE ERROR_DEVICE_INTERFACE_ACTIVE +#define ERROR_INTERFACE_DEVICE_REMOVED ERROR_DEVICE_INTERFACE_REMOVED +#define ERROR_NO_DEFAULT_INTERFACE_DEVICE ERROR_NO_DEFAULT_DEVICE_INTERFACE +#define ERROR_NO_SUCH_INTERFACE_DEVICE ERROR_NO_SUCH_DEVICE_INTERFACE + +#define FILEOP_COPY 0 +#define FILEOP_ABORT 0 +#define FILE_COMPRESSION_NONE 0 +#define FILEOP_RENAME 1 +#define FILEOP_DOIT 1 +#define FILE_COMPRESSION_WINLZA 1 +#define FILEOP_DELETE 2 +#define FILEOP_SKIP 2 +#define FILE_COMPRESSION_MSZIP 2 +#define FILEOP_BACKUP 3 +#define FILE_COMPRESSION_NTCAB 3 +#define FILEOP_NEWPATH 4 +#define FILEOP_RETRY FILEOP_DOIT +#define FLG_ADDREG_TYPE_SZ 0x00000000 +#define FLG_ADDREG_BINVALUETYPE 0x00000001 +#define FLG_ADDREG_NOCLOBBER 0x00000002 +#define FLG_ADDREG_DELVAL 0x00000004 +#define FLG_ADDREG_APPEND 0x00000008 +#define FLG_ADDREG_KEYONLY 0x00000010 +#define FLG_ADDREG_OVERWRITEONLY 0x00000020 +#if (_SETUPAPI_VER >= 0x0501) +#define FLG_ADDREG_64BITKEY 0x00001000 +#define FLG_ADDREG_KEYONLY_COMMON 0x00002000 +#define FLG_ADDREG_32BITKEY 0x00004000 +#define FLG_ADDREG_DELREG_BIT 0x00008000 +#endif +#define FLG_ADDREG_TYPE_MULTI_SZ 0x00010000 +#define FLG_ADDREG_TYPE_EXPAND_SZ 0x00020000 +#define FLG_ADDREG_TYPE_BINARY (0x00000000|FLG_ADDREG_BINVALUETYPE) +#define FLG_ADDREG_TYPE_DWORD (0x00010000|FLG_ADDREG_BINVALUETYPE) +#define FLG_ADDREG_TYPE_NONE (0x00020000|FLG_ADDREG_BINVALUETYPE) +#define FLG_ADDREG_TYPE_MASK (0xFFFF0000|FLG_ADDREG_BINVALUETYPE) +#define FLG_DELREG_VALUE 0x00000000 +#if (_SETUPAPI_VER >= 0x0501) +#define FLG_DELREG_TYPE_MASK FLG_ADDREG_TYPE_MASK +#define FLG_DELREG_TYPE_SZ FLG_ADDREG_TYPE_SZ +#define FLG_DELREG_TYPE_MULTI_SZ FLG_ADDREG_TYPE_MULTI_SZ +#define FLG_DELREG_TYPE_EXPAND_SZ FLG_ADDREG_TYPE_EXPAND_SZ +#define FLG_DELREG_TYPE_BINARY FLG_ADDREG_TYPE_BINARY +#define FLG_DELREG_TYPE_DWORD FLG_ADDREG_TYPE_DWORD +#define FLG_DELREG_TYPE_NONE FLG_ADDREG_TYPE_NONE +#define FLG_DELREG_64BITKEY FLG_ADDREG_64BITKEY +#define FLG_DELREG_KEYONLY_COMMON FLG_ADDREG_KEYONLY_COMMON +#define FLG_DELREG_32BITKEY FLG_ADDREG_32BITKEY +#define FLG_DELREG_OPERATION_MASK 0x000000FE +#define FLG_DELREG_MULTI_SZ_DELSTRING (0x00000002|FLG_DELREG_TYPE_MULTI_SZ|FLG_ADDREG_DELREG_BIT) +#endif +#define FLG_BITREG_CLEARBITS 0x00000000 +#define FLG_BITREG_SETBITS 0x00000001 +#define FLG_PROFITEM_CURRENTUSER 0x00000001 +#define FLG_PROFITEM_DELETE 0x00000002 +#define FLG_PROFITEM_GROUP 0x00000004 +#define FLG_PROFITEM_CSIDL 0x00000008 +#define FLG_REGSVR_DLLREGISTER 0x00000001 +#define FLG_REGSVR_DLLINSTALL 0x00000002 +#define MIN_IDD_DYNAWIZ_RESOURCE_ID 10000 +#define MAX_IDD_DYNAWIZ_RESOURCE_ID 11000 +#define IDD_DYNAWIZ_FIRSTPAGE 10000 +#define IDD_DYNAWIZ_SELECT_PREVPAGE 10001 +#define IDD_DYNAWIZ_SELECT_NEXTPAGE 10002 +#define IDD_DYNAWIZ_ANALYZE_PREVPAGE 10003 +#define IDD_DYNAWIZ_ANALYZE_NEXTPAGE 10004 +#define IDD_DYNAWIZ_INSTALLDETECTED_PREVPAGE 10006 +#define IDD_DYNAWIZ_INSTALLDETECTED_NEXTPAGE 10007 +#define IDD_DYNAWIZ_INSTALLDETECTED_NODEVS 10008 +#define IDD_DYNAWIZ_SELECTDEV_PAGE 10009 +#define IDD_DYNAWIZ_ANALYZEDEV_PAGE 10010 +#define IDD_DYNAWIZ_INSTALLDETECTEDDEVS_PAGE 10011 +#define IDD_DYNAWIZ_SELECTCLASS_PAGE 10012 +#define IDF_NOBROWSE 0x00000001 +#define IDF_NOSKIP 0x00000002 +#define IDF_NODETAILS 0x00000004 +#define IDF_NOCOMPRESSED 0x00000008 +#define IDF_CHECKFIRST 0x00000100 +#define IDF_NOBEEP 0x00000200 +#define IDF_NOFOREGROUND 0x00000400 +#define IDF_WARNIFSKIP 0x00000800 +#define IDF_OEMDISK 0x80000000 +#define IDI_RESOURCEFIRST 159 +#define IDI_RESOURCE 159 +#define IDI_RESOURCELAST 161 +#define IDI_RESOURCEOVERLAYFIRST 161 +#define IDI_RESOURCEOVERLAYLAST 161 +#define IDI_CONFLICT 161 +#define IDI_PROBLEM_OVL 500 +#define IDI_DISABLED_OVL 501 +#define IDI_FORCED_OVL 502 +#define IDI_CLASSICON_OVERLAYFIRST 500 +#define IDI_CLASSICON_OVERLAYLAST 502 +#define INF_STYLE_NONE 0x00000000 +#define INF_STYLE_OLDNT 0x00000001 +#define INF_STYLE_WIN4 0x00000002 +#define INF_STYLE_CACHE_ENABLE 0x00000010 +#define INF_STYLE_CACHE_DISABLE 0x00000020 +#define INFINFO_INF_SPEC_IS_HINF 1 +#define INFINFO_INF_NAME_IS_ABSOLUTE 2 +#define INFINFO_DEFAULT_SEARCH 3 +#define INFINFO_REVERSE_DEFAULT_SEARCH 4 +#define INFINFO_INF_PATH_LIST_SEARCH 5 +#define LogSevInformation 0 +#define LogSevWarning 1 +#define LogSevError 2 +#define LogSevFatalError 3 +#define LogSevMaximum 4 +#define LogSeverity DWORD +#define MAX_INSTALLWIZARD_DYNAPAGES 20 +#define NDW_INSTALLFLAG_DIDFACTDEFS 0x00000001 +#define NDW_INSTALLFLAG_HARDWAREALLREADYIN 0x00000002 +#define NDW_INSTALLFLAG_NEEDSHUTDOWN 0x00000200 +#define NDW_INSTALLFLAG_EXPRESSINTRO 0x00000400 +#define NDW_INSTALLFLAG_SKIPISDEVINSTALLED 0x00000800 +#define NDW_INSTALLFLAG_NODETECTEDDEVS 0x00001000 +#define NDW_INSTALLFLAG_INSTALLSPECIFIC 0x00002000 +#define NDW_INSTALLFLAG_SKIPCLASSLIST 0x00004000 +#define NDW_INSTALLFLAG_CI_PICKED_OEM 0x00008000 +#define NDW_INSTALLFLAG_PCMCIAMODE 0x00010000 +#define NDW_INSTALLFLAG_PCMCIADEVICE 0x00020000 +#define NDW_INSTALLFLAG_USERCANCEL 0x00040000 +#define NDW_INSTALLFLAG_KNOWNCLASS 0x00080000 +#define NDW_INSTALLFLAG_NEEDRESTART 0x00000080 +#define NDW_INSTALLFLAG_NEEDREBOOT 0x00000100 +#define SETDIRID_NOT_FULL_PATH 0x00000001 +#define SP_COPY_DELETESOURCE 0x0000001 +#define SP_COPY_REPLACEONLY 0x0000002 +#define SP_COPY_NEWER 0x0000004 +#define SP_COPY_NEWER_OR_SAME 0x0000004 +#define SP_COPY_NOOVERWRITE 0x0000008 +#define SP_COPY_NODECOMP 0x0000010 +#define SP_COPY_LANGUAGEAWARE 0x0000020 +#define SP_COPY_SOURCE_ABSOLUTE 0x0000040 +#define SP_COPY_SOURCEPATH_ABSOLUTE 0x0000080 +#define SP_COPY_IN_USE_NEEDS_REBOOT 0x0000100 +#define SP_COPY_FORCE_IN_USE 0x0000200 +#define SP_COPY_NOSKIP 0x0000400 +#define SP_COPY_FORCE_NOOVERWRITE 0x0001000 +#define SP_COPY_FORCE_NEWER 0x0002000 +#define SP_COPY_WARNIFSKIP 0x0004000 +#define SP_COPY_NOBROWSE 0x0008000 +#define SP_COPY_NEWER_ONLY 0x0010000 +#define SP_COPY_SOURCE_SIS_MASTER 0x0020000 +#define SP_COPY_OEMINF_CATALOG_ONLY 0x0040000 +#define SP_COPY_REPLACE_BOOT_FILE 0x0080000 +#define SP_COPY_NOPRUNE 0x0100000 +#define SP_FLAG_CABINETCONTINUATION 0x0000800 +#define SPCRP_SECURITY 23 +#define SPCRP_SECURITY_SDS 24 +#define SPCRP_DEVTYPE 25 +#define SPCRP_EXCLUSIVE 26 +#define SPCRP_CHARACTERISTICS 27 +#define SPCRP_MAXIMUM_PROPERTY 28 +#define SPDIT_NODRIVER 0 +#define SPDIT_CLASSDRIVER 1 +#define SPDIT_COMPATDRIVER 2 +#define SPDRP_DEVICEDESC 0 +#define SPDRP_HARDWAREID 1 +#define SPDRP_COMPATIBLEIDS 2 +#define SPDRP_UNUSED0 3 +#define SPDRP_SERVICE 4 +#define SPDRP_UNUSED1 5 +#define SPDRP_UNUSED2 6 +#define SPDRP_CLASS 7 +#define SPDRP_CLASSGUID 8 +#define SPDRP_DRIVER 9 +#define SPDRP_CONFIGFLAGS 10 +#define SPDRP_MFG 11 +#define SPDRP_FRIENDLYNAME 12 +#define SPDRP_LOCATION_INFORMATION 13 +#define SPDRP_PHYSICAL_DEVICE_OBJECT_NAME 14 +#define SPDRP_CAPABILITIES 15 +#define SPDRP_UI_NUMBER 16 +#define SPDRP_UPPERFILTERS 17 +#define SPDRP_LOWERFILTERS 18 +#define SPDRP_BUSTYPEGUID 19 +#define SPDRP_LEGACYBUSTYPE 20 +#define SPDRP_BUSNUMBER 21 +#define SPDRP_ENUMERATOR_NAME 22 +#define SPDRP_SECURITY 23 +#define SPDRP_SECURITY_SDS 24 +#define SPDRP_DEVTYPE 25 +#define SPDRP_EXCLUSIVE 26 +#define SPDRP_CHARACTERISTICS 27 +#define SPDRP_ADDRESS 28 +#define SPDRP_UI_NUMBER_DESC_FORMAT 30 +#define SPDRP_MAXIMUM_PROPERTY 31 +#define SPDSL_IGNORE_DISK 1 +#define SPDSL_DISALLOW_NEGATIVE_ADJUST 2 + +#define SPFILENOTIFY_STARTQUEUE 1 +#define SPFILENOTIFY_ENDQUEUE 2 +#define SPFILENOTIFY_STARTSUBQUEUE 3 +#define SPFILENOTIFY_ENDSUBQUEUE 4 +#define SPFILENOTIFY_STARTDELETE 5 +#define SPFILENOTIFY_ENDDELETE 6 +#define SPFILENOTIFY_DELETEERROR 7 +#define SPFILENOTIFY_STARTRENAME 8 +#define SPFILENOTIFY_ENDRENAME 9 +#define SPFILENOTIFY_RENAMEERROR 10 +#define SPFILENOTIFY_STARTCOPY 11 +#define SPFILENOTIFY_ENDCOPY 12 +#define SPFILENOTIFY_COPYERROR 13 +#define SPFILENOTIFY_NEEDMEDIA 14 +#define SPFILENOTIFY_QUEUESCAN 15 +#define SPFILENOTIFY_CABINETINFO 16 +#define SPFILENOTIFY_FILEINCABINET 17 +#define SPFILENOTIFY_NEEDNEWCABINET 18 +#define SPFILENOTIFY_FILEEXTRACTED 19 +#define SPFILENOTIFY_FILEOPDELAYED 20 +#define SPFILENOTIFY_STARTBACKUP 21 +#define SPFILENOTIFY_BACKUPERROR 22 +#define SPFILENOTIFY_ENDBACKUP 23 +#define SPFILENOTIFY_QUEUESCAN_EX 24 +#define SPFILENOTIFY_LANGMISMATCH 0x00010000 +#define SPFILENOTIFY_TARGETEXISTS 0x00020000 +#define SPFILENOTIFY_TARGETNEWER 0x00040000 +#define SPFILELOG_SYSTEMLOG 0x00000001 +#define SPFILELOG_OEMFILE 0x00000001 +#define SPFILELOG_FORCENEW 0x00000002 +#define SPFILELOG_QUERYONLY 0x00000004 +#define SPFILEQ_FILE_IN_USE 0x00000001 +#define SPFILEQ_REBOOT_RECOMMENDED 0x00000002 +#define SPFILEQ_REBOOT_IN_PROGRESS 0x00000004 +#define SPINT_ACTIVE 0x00000001 +#define SPINT_DEFAULT 0x00000002 +#define SPINT_REMOVED 0x00000004 +#define SPID_ACTIVE 0x00000001 +#define SPID_DEFAULT 0x00000002 +#define SPID_REMOVED 0x00000004 +#define SPINST_LOGCONFIG 0x00000001 +#define SPINST_INIFILES 0x00000002 +#define SPINST_REGISTRY 0x00000004 +#define SPINST_INI2REG 0x00000008 +#define SPINST_FILES 0x00000010 +#define SPINST_BITREG 0x00000020 +#define SPINST_REGSVR 0x00000040 +#define SPINST_UNREGSVR 0x00000080 +#define SPINST_PROFILEITEMS 0x00000100 +#if (_SETUPAPI_VER >= 0x0501) +#define SPINST_COPYINF 0x00000200 +#define SPINST_ALL 0x000003ff +#else +#define SPINST_ALL 0x000001ff +#endif +#define SPINST_SINGLESECTION 0x00010000 +#define SPINST_LOGCONFIG_IS_FORCED 0x00020000 +#define SPINST_LOGCONFIGS_ARE_OVERRIDES 0x00040000 +#define SPOST_NONE 0 +#define SPOST_PATH 1 +#define SPOST_URL 2 +#define SPOST_MAX 3 +#define SPPSR_SELECT_DEVICE_RESOURCES 1 +#define SPPSR_ENUM_BASIC_DEVICE_PROPERTIES 2 +#define SPPSR_ENUM_ADV_DEVICE_PROPERTIES 3 +#define SPQ_SCAN_FILE_PRESENCE 0x00000001 +#define SPQ_DELAYED_COPY 0x00000001 +#define SPQ_SCAN_FILE_VALIDITY 0x00000002 +#define SPQ_SCAN_USE_CALLBACK 0x00000004 +#define SPQ_SCAN_USE_CALLBACKEX 0x00000008 +#define SPQ_SCAN_INFORM_USER 0x00000010 +#define SPQ_SCAN_PRUNE_COPY_QUEUE 0x00000020 +#define SPRDI_FIND_DUPS 0x00000001 +#define SPSVCINST_TAGTOFRONT 0x00000001 +#define SPSVCINST_ASSOCSERVICE 0x00000002 +#define SPSVCINST_DELETEEVENTLOGENTRY 0x00000004 +#define SPSVCINST_NOCLOBBER_DISPLAYNAME 0x00000008 +#define SPSVCINST_NOCLOBBER_STARTTYPE 0x00000010 +#define SPSVCINST_NOCLOBBER_ERRORCONTROL 0x00000020 +#define SPSVCINST_NOCLOBBER_LOADORDERGROUP 0x00000040 +#define SPSVCINST_NOCLOBBER_DEPENDENCIES 0x00000080 +#define SPSVCINST_NOCLOBBER_DESCRIPTION 0x00000100 +#define SPSVCINST_STOPSERVICE 0x00000200 +#define SPWPT_SELECTDEVICE 0x00000001 +#define SPWP_USE_DEVINFO_DATA 0x00000001 +#define SRCINFO_PATH 1 +#define SRCINFO_TAGFILE 2 +#define SRCINFO_DESCRIPTION 3 +#define SRCINFO_FLAGS 4 +#define SRCLIST_TEMPORARY 0x00000001 +#define SRCLIST_NOBROWSE 0x00000002 +#define SRCLIST_SYSTEM 0x00000010 +#define SRCLIST_USER 0x00000020 +#define SRCLIST_SYSIFADMIN 0x00000040 +#define SRCLIST_SUBDIRS 0x00000100 +#define SRCLIST_APPEND 0x00000200 +#define SRCLIST_NOSTRIPPLATFORM 0x00000400 + +#ifndef RC_INVOKED +typedef PVOID HINF; +typedef PVOID HDSKSPC; +typedef PVOID HDEVINFO; +typedef PVOID HSPFILEQ; +typedef PVOID HSPFILELOG; +typedef UINT DI_FUNCTION; + +typedef enum { + SetupFileLogSourceFilename, + SetupFileLogChecksum, + SetupFileLogDiskTagfile, + SetupFileLogDiskDescription, + SetupFileLogOtherInfo, + SetupFileLogMax +} SetupFileLogInfo; +typedef struct _INFCONTEXT { + PVOID Inf; + PVOID CurrentInf; + UINT Section; + UINT Line; +} INFCONTEXT, *PINFCONTEXT; +typedef struct _SP_INF_INFORMATION { + DWORD InfStyle; + DWORD InfCount; + BYTE VersionData[ANYSIZE_ARRAY]; +} SP_INF_INFORMATION, *PSP_INF_INFORMATION; +typedef struct _SP_ALTPLATFORM_INFO { + DWORD cbSize; + DWORD Platform; + DWORD MajorVersion; + DWORD MinorVersion; + WORD ProcessorArchitecture; + WORD Reserved; +} SP_ALTPLATFORM_INFO, *PSP_ALTPLATFORM_INFO; +typedef struct _SP_ORIGINAL_FILE_INFO_A { + DWORD cbSize; + CHAR OriginalInfName[MAX_PATH]; + CHAR OriginalCatalogName[MAX_PATH]; +} SP_ORIGINAL_FILE_INFO_A, *PSP_ORIGINAL_FILE_INFO_A; +typedef struct _SP_ORIGINAL_FILE_INFO_W { + DWORD cbSize; + WCHAR OriginalInfName[MAX_PATH]; + WCHAR OriginalCatalogName[MAX_PATH]; +} SP_ORIGINAL_FILE_INFO_W, *PSP_ORIGINAL_FILE_INFO_W; +typedef struct _FILEPATHS_A { + PCSTR Target; + PCSTR Source; + UINT Win32Error; + DWORD Flags; +} FILEPATHS_A, *PFILEPATHS_A; +typedef struct _FILEPATHS_W { + PCWSTR Target; + PCWSTR Source; + UINT Win32Error; + DWORD Flags; +} FILEPATHS_W, *PFILEPATHS_W; +typedef struct _SOURCE_MEDIA_A { + PCSTR Reserved; + PCSTR Tagfile; + PCSTR Description; + PCSTR SourcePath; + PCSTR SourceFile; + DWORD Flags; +} SOURCE_MEDIA_A, *PSOURCE_MEDIA_A; +typedef struct _SOURCE_MEDIA_W { + PCWSTR Reserved; + PCWSTR Tagfile; + PCWSTR Description; + PCWSTR SourcePath; + PCWSTR SourceFile; + DWORD Flags; +} SOURCE_MEDIA_W, *PSOURCE_MEDIA_W; +typedef struct _CABINET_INFO_A { + PCSTR CabinetPath; + PCSTR CabinetFile; + PCSTR DiskName; + USHORT SetId; + USHORT CabinetNumber; +} CABINET_INFO_A, *PCABINET_INFO_A; +typedef struct _CABINET_INFO_W { + PCWSTR CabinetPath; + PCWSTR CabinetFile; + PCWSTR DiskName; + USHORT SetId; + USHORT CabinetNumber; +} CABINET_INFO_W, *PCABINET_INFO_W; +typedef struct _FILE_IN_CABINET_INFO_A { + PCSTR NameInCabinet; + DWORD FileSize; + DWORD Win32Error; + WORD DosDate; + WORD DosTime; + WORD DosAttribs; + CHAR FullTargetName[MAX_PATH]; +} FILE_IN_CABINET_INFO_A, *PFILE_IN_CABINET_INFO_A; +typedef struct _FILE_IN_CABINET_INFO_W { + PCWSTR NameInCabinet; + DWORD FileSize; + DWORD Win32Error; + WORD DosDate; + WORD DosTime; + WORD DosAttribs; + WCHAR FullTargetName[MAX_PATH]; +} FILE_IN_CABINET_INFO_W, *PFILE_IN_CABINET_INFO_W; +typedef struct _SP_FILE_COPY_PARAMS_A { + DWORD cbSize; + HSPFILEQ QueueHandle; + PCSTR SourceRootPath; + PCSTR SourcePath; + PCSTR SourceFilename; + PCSTR SourceDescription; + PCSTR SourceTagfile; + PCSTR TargetDirectory; + PCSTR TargetFilename; + DWORD CopyStyle; + HINF LayoutInf; + PCSTR SecurityDescriptor; +} SP_FILE_COPY_PARAMS_A, *PSP_FILE_COPY_PARAMS_A; +typedef struct _SP_FILE_COPY_PARAMS_W { + DWORD cbSize; + HSPFILEQ QueueHandle; + PCWSTR SourceRootPath; + PCWSTR SourcePath; + PCWSTR SourceFilename; + PCWSTR SourceDescription; + PCWSTR SourceTagfile; + PCWSTR TargetDirectory; + PCWSTR TargetFilename; + DWORD CopyStyle; + HINF LayoutInf; + PCWSTR SecurityDescriptor; +} SP_FILE_COPY_PARAMS_W, *PSP_FILE_COPY_PARAMS_W; +typedef struct _SP_DEVINFO_DATA { + DWORD cbSize; + GUID ClassGuid; + DWORD DevInst; + ULONG_PTR Reserved; +} SP_DEVINFO_DATA, *PSP_DEVINFO_DATA; +typedef struct _SP_DEVICE_INTERFACE_DATA { + DWORD cbSize; + GUID InterfaceClassGuid; + DWORD Flags; + ULONG_PTR Reserved; +} SP_DEVICE_INTERFACE_DATA, *PSP_DEVICE_INTERFACE_DATA; +/* For backward compatability */ +typedef SP_DEVICE_INTERFACE_DATA SP_INTERFACE_DEVICE_DATA, *PSP_INTERFACE_DEVICE_DATA; + +typedef struct _SP_DEVICE_INTERFACE_DETAIL_DATA_A { + DWORD cbSize; + CHAR DevicePath[ANYSIZE_ARRAY]; +} SP_DEVICE_INTERFACE_DETAIL_DATA_A, *PSP_DEVICE_INTERFACE_DETAIL_DATA_A; +typedef struct _SP_DEVICE_INTERFACE_DETAIL_DATA_W { + DWORD cbSize; + WCHAR DevicePath[ANYSIZE_ARRAY]; +} SP_DEVICE_INTERFACE_DETAIL_DATA_W, *PSP_DEVICE_INTERFACE_DETAIL_DATA_W; +/* For backward compatability */ +typedef SP_DEVICE_INTERFACE_DETAIL_DATA_A SP_INTERFACE_DEVICE_DETAIL_DATA_A, + *PSP_INTERFACE_DEVICE_DETAIL_DATA_A; +typedef SP_DEVICE_INTERFACE_DETAIL_DATA_W SP_INTERFACE_DEVICE_DETAIL_DATA_W, + *PSP_INTERFACE_DEVICE_DETAIL_DATA_W; + +typedef struct _SP_DEVINFO_LIST_DETAIL_DATA_A { + DWORD cbSize; + GUID ClassGuid; + HANDLE RemoteMachineHandle; + CHAR RemoteMachineName[SP_MAX_MACHINENAME_LENGTH]; +} SP_DEVINFO_LIST_DETAIL_DATA_A, *PSP_DEVINFO_LIST_DETAIL_DATA_A; +typedef struct _SP_DEVINFO_LIST_DETAIL_DATA_W { + DWORD cbSize; + GUID ClassGuid; + HANDLE RemoteMachineHandle; + WCHAR RemoteMachineName[SP_MAX_MACHINENAME_LENGTH]; +} SP_DEVINFO_LIST_DETAIL_DATA_W, *PSP_DEVINFO_LIST_DETAIL_DATA_W; + +typedef UINT (CALLBACK* PSP_FILE_CALLBACK_A)(PVOID,UINT,UINT_PTR,UINT_PTR); +typedef UINT (CALLBACK* PSP_FILE_CALLBACK_W)(PVOID,UINT,UINT_PTR,UINT_PTR); +typedef struct _SP_DEVINSTALL_PARAMS_A { + DWORD cbSize; + DWORD Flags; + DWORD FlagsEx; + HWND hwndParent; + PSP_FILE_CALLBACK_A InstallMsgHandler; + PVOID InstallMsgHandlerContext; + HSPFILEQ FileQueue; + ULONG_PTR ClassInstallReserved; + DWORD Reserved; + CHAR DriverPath[MAX_PATH]; +} SP_DEVINSTALL_PARAMS_A, *PSP_DEVINSTALL_PARAMS_A; +typedef struct _SP_DEVINSTALL_PARAMS_W { + DWORD cbSize; + DWORD Flags; + DWORD FlagsEx; + HWND hwndParent; + PSP_FILE_CALLBACK_W InstallMsgHandler; + PVOID InstallMsgHandlerContext; + HSPFILEQ FileQueue; + ULONG_PTR ClassInstallReserved; + DWORD Reserved; + WCHAR DriverPath[MAX_PATH]; +} SP_DEVINSTALL_PARAMS_W, *PSP_DEVINSTALL_PARAMS_W; +typedef struct _SP_CLASSINSTALL_HEADER { + DWORD cbSize; + DI_FUNCTION InstallFunction; +} SP_CLASSINSTALL_HEADER, *PSP_CLASSINSTALL_HEADER; +typedef struct _SP_ENABLECLASS_PARAMS { + SP_CLASSINSTALL_HEADER ClassInstallHeader; + GUID ClassGuid; + DWORD EnableMessage; +} SP_ENABLECLASS_PARAMS, *PSP_ENABLECLASS_PARAMS; +typedef struct _SP_MOVEDEV_PARAMS { + SP_CLASSINSTALL_HEADER ClassInstallHeader; + SP_DEVINFO_DATA SourceDeviceInfoData; +} SP_MOVEDEV_PARAMS, *PSP_MOVEDEV_PARAMS; +typedef struct _SP_PROPCHANGE_PARAMS { + SP_CLASSINSTALL_HEADER ClassInstallHeader; + DWORD StateChange; + DWORD Scope; + DWORD HwProfile; +} SP_PROPCHANGE_PARAMS, *PSP_PROPCHANGE_PARAMS; +typedef struct _SP_REMOVEDEVICE_PARAMS { + SP_CLASSINSTALL_HEADER ClassInstallHeader; + DWORD Scope; + DWORD HwProfile; +} SP_REMOVEDEVICE_PARAMS, *PSP_REMOVEDEVICE_PARAMS; +typedef struct _SP_UNREMOVEDEVICE_PARAMS { + SP_CLASSINSTALL_HEADER ClassInstallHeader; + DWORD Scope; + DWORD HwProfile; +} SP_UNREMOVEDEVICE_PARAMS, *PSP_UNREMOVEDEVICE_PARAMS; +typedef struct _SP_SELECTDEVICE_PARAMS_A { + SP_CLASSINSTALL_HEADER ClassInstallHeader; + CHAR Title[MAX_TITLE_LEN]; + CHAR Instructions[MAX_INSTRUCTION_LEN]; + CHAR ListLabel[MAX_LABEL_LEN]; + CHAR SubTitle[MAX_SUBTITLE_LEN]; + BYTE Reserved[2]; +} SP_SELECTDEVICE_PARAMS_A, *PSP_SELECTDEVICE_PARAMS_A; +typedef struct _SP_SELECTDEVICE_PARAMS_W { + SP_CLASSINSTALL_HEADER ClassInstallHeader; + WCHAR Title[MAX_TITLE_LEN]; + WCHAR Instructions[MAX_INSTRUCTION_LEN]; + WCHAR ListLabel[MAX_LABEL_LEN]; + WCHAR SubTitle[MAX_SUBTITLE_LEN]; +} SP_SELECTDEVICE_PARAMS_W, *PSP_SELECTDEVICE_PARAMS_W; + +typedef BOOL (CALLBACK* PDETECT_PROGRESS_NOTIFY)(PVOID,DWORD); +typedef struct _SP_DETECTDEVICE_PARAMS { + SP_CLASSINSTALL_HEADER ClassInstallHeader; + PDETECT_PROGRESS_NOTIFY DetectProgressNotify; + PVOID ProgressNotifyParam; +} SP_DETECTDEVICE_PARAMS, *PSP_DETECTDEVICE_PARAMS; +typedef struct _SP_INSTALLWIZARD_DATA { + SP_CLASSINSTALL_HEADER ClassInstallHeader; + DWORD Flags; + HPROPSHEETPAGE DynamicPages[MAX_INSTALLWIZARD_DYNAPAGES]; + DWORD NumDynamicPages; + DWORD DynamicPageFlags; + DWORD PrivateFlags; + LPARAM PrivateData; + HWND hwndWizardDlg; +} SP_INSTALLWIZARD_DATA, *PSP_INSTALLWIZARD_DATA; +typedef struct _SP_NEWDEVICEWIZARD_DATA { + SP_CLASSINSTALL_HEADER ClassInstallHeader; + DWORD Flags; + HPROPSHEETPAGE DynamicPages[MAX_INSTALLWIZARD_DYNAPAGES]; + DWORD NumDynamicPages; + HWND hwndWizardDlg; +} SP_NEWDEVICEWIZARD_DATA, *PSP_NEWDEVICEWIZARD_DATA; +typedef SP_NEWDEVICEWIZARD_DATA SP_ADDPROPERTYPAGE_DATA, + *PSP_ADDPROPERTYPAGE_DATA; +typedef struct _SP_TROUBLESHOOTER_PARAMS_A { + SP_CLASSINSTALL_HEADER ClassInstallHeader; + CHAR ChmFile[MAX_PATH]; + CHAR HtmlTroubleShooter[MAX_PATH]; +} SP_TROUBLESHOOTER_PARAMS_A, *PSP_TROUBLESHOOTER_PARAMS_A; +typedef struct _SP_TROUBLESHOOTER_PARAMS_W { + SP_CLASSINSTALL_HEADER ClassInstallHeader; + WCHAR ChmFile[MAX_PATH]; + WCHAR HtmlTroubleShooter[MAX_PATH]; +} SP_TROUBLESHOOTER_PARAMS_W, *PSP_TROUBLESHOOTER_PARAMS_W; +typedef struct _SP_POWERMESSAGEWAKE_PARAMS_A { + SP_CLASSINSTALL_HEADER ClassInstallHeader; + CHAR PowerMessageWake[LINE_LEN*2]; +} SP_POWERMESSAGEWAKE_PARAMS_A, *PSP_POWERMESSAGEWAKE_PARAMS_A; +typedef struct _SP_POWERMESSAGEWAKE_PARAMS_W { + SP_CLASSINSTALL_HEADER ClassInstallHeader; + WCHAR PowerMessageWake[LINE_LEN*2]; +} SP_POWERMESSAGEWAKE_PARAMS_W, *PSP_POWERMESSAGEWAKE_PARAMS_W; +typedef struct _SP_DRVINFO_DATA_V2_A { + DWORD cbSize; + DWORD DriverType; + ULONG_PTR Reserved; + CHAR Description[LINE_LEN]; + CHAR MfgName[LINE_LEN]; + CHAR ProviderName[LINE_LEN]; + FILETIME DriverDate; + DWORDLONG DriverVersion; +} SP_DRVINFO_DATA_V2_A, *PSP_DRVINFO_DATA_V2_A; +typedef struct _SP_DRVINFO_DATA_V2_W { + DWORD cbSize; + DWORD DriverType; + ULONG_PTR Reserved; + WCHAR Description[LINE_LEN]; + WCHAR MfgName[LINE_LEN]; + WCHAR ProviderName[LINE_LEN]; + FILETIME DriverDate; + DWORDLONG DriverVersion; +} SP_DRVINFO_DATA_V2_W, *PSP_DRVINFO_DATA_V2_W; +typedef struct _SP_DRVINFO_DATA_V1_A { + DWORD cbSize; + DWORD DriverType; + ULONG_PTR Reserved; + CHAR Description[LINE_LEN]; + CHAR MfgName[LINE_LEN]; + CHAR ProviderName[LINE_LEN]; +} SP_DRVINFO_DATA_V1_A, *PSP_DRVINFO_DATA_V1_A; +typedef struct _SP_DRVINFO_DATA_V1_W { + DWORD cbSize; + DWORD DriverType; + ULONG_PTR Reserved; + WCHAR Description[LINE_LEN]; + WCHAR MfgName[LINE_LEN]; + WCHAR ProviderName[LINE_LEN]; +} SP_DRVINFO_DATA_V1_W, *PSP_DRVINFO_DATA_V1_W; + +#ifdef UNICODE +typedef SP_DRVINFO_DATA_V1_W SP_DRVINFO_DATA_V1, *PSP_DRVINFO_DATA_V1; +typedef SP_DRVINFO_DATA_V2_W SP_DRVINFO_DATA_V2, *PSP_DRVINFO_DATA_V2; +#else +typedef SP_DRVINFO_DATA_V1_A SP_DRVINFO_DATA_V1, *PSP_DRVINFO_DATA_V1; +typedef SP_DRVINFO_DATA_V2_A SP_DRVINFO_DATA_V2, *PSP_DRVINFO_DATA_V2; +#endif + +#if USE_SP_DRVINFO_DATA_V1 +typedef SP_DRVINFO_DATA_V1_A SP_DRVINFO_DATA_A, *PSP_DRVINFO_DATA_A; +typedef SP_DRVINFO_DATA_V1_W SP_DRVINFO_DATA_W, *PSP_DRVINFO_DATA_W; +typedef SP_DRVINFO_DATA_V1 SP_DRVINFO_DATA, *PSP_DRVINFO_DATA; +#else +typedef SP_DRVINFO_DATA_V2_A SP_DRVINFO_DATA_A, *PSP_DRVINFO_DATA_A; +typedef SP_DRVINFO_DATA_V2_W SP_DRVINFO_DATA_W, *PSP_DRVINFO_DATA_W; +typedef SP_DRVINFO_DATA_V2 SP_DRVINFO_DATA, *PSP_DRVINFO_DATA; +#endif + +typedef DWORD (CALLBACK* PSP_DETSIG_CMPPROC)(HDEVINFO,PSP_DEVINFO_DATA,PSP_DEVINFO_DATA,PVOID); + +typedef struct _SP_DRVINFO_DETAIL_DATA_A { + DWORD cbSize; + FILETIME InfDate; + DWORD CompatIDsOffset; + DWORD CompatIDsLength; + ULONG_PTR Reserved; + CHAR SectionName[LINE_LEN]; + CHAR InfFileName[MAX_PATH]; + CHAR DrvDescription[LINE_LEN]; + CHAR HardwareID[ANYSIZE_ARRAY]; +} SP_DRVINFO_DETAIL_DATA_A, *PSP_DRVINFO_DETAIL_DATA_A; +typedef struct _SP_DRVINFO_DETAIL_DATA_W { + DWORD cbSize; + FILETIME InfDate; + DWORD CompatIDsOffset; + DWORD CompatIDsLength; + ULONG_PTR Reserved; + WCHAR SectionName[LINE_LEN]; + WCHAR InfFileName[MAX_PATH]; + WCHAR DrvDescription[LINE_LEN]; + WCHAR HardwareID[ANYSIZE_ARRAY]; +} SP_DRVINFO_DETAIL_DATA_W, *PSP_DRVINFO_DETAIL_DATA_W; +typedef struct _SP_DRVINSTALL_PARAMS { + DWORD cbSize; + DWORD Rank; + DWORD Flags; + DWORD_PTR PrivateData; + DWORD Reserved; +} SP_DRVINSTALL_PARAMS, *PSP_DRVINSTALL_PARAMS; + + +typedef struct _COINSTALLER_CONTEXT_DATA { + BOOL PostProcessing; + DWORD InstallResult; + PVOID PrivateData; +} COINSTALLER_CONTEXT_DATA, *PCOINSTALLER_CONTEXT_DATA; +typedef struct _SP_CLASSIMAGELIST_DATA { + DWORD cbSize; + HIMAGELIST ImageList; + ULONG_PTR Reserved; +} SP_CLASSIMAGELIST_DATA, *PSP_CLASSIMAGELIST_DATA; +typedef struct _SP_PROPSHEETPAGE_REQUEST { + DWORD cbSize; + DWORD PageRequested; + HDEVINFO DeviceInfoSet; + PSP_DEVINFO_DATA DeviceInfoData; +} SP_PROPSHEETPAGE_REQUEST, *PSP_PROPSHEETPAGE_REQUEST; +typedef struct _SP_BACKUP_QUEUE_PARAMS_A { + DWORD cbSize; + CHAR FullInfPath[MAX_PATH]; + INT FilenameOffset; +} SP_BACKUP_QUEUE_PARAMS_A, *PSP_BACKUP_QUEUE_PARAMS_A; +typedef struct _SP_BACKUP_QUEUE_PARAMS_W { + DWORD cbSize; + WCHAR FullInfPath[MAX_PATH]; + INT FilenameOffset; +} SP_BACKUP_QUEUE_PARAMS_W, *PSP_BACKUP_QUEUE_PARAMS_W; + + +#ifdef UNICODE +typedef SP_ORIGINAL_FILE_INFO_W SP_ORIGINAL_FILE_INFO, *PSP_ORIGINAL_FILE_INFO; +typedef FILEPATHS_W FILEPATHS, *PFILEPATHS; +typedef SOURCE_MEDIA_W SOURCE_MEDIA, *PSOURCE_MEDIA; +typedef CABINET_INFO_W CABINET_INFO, *PCABINET_INFO; +typedef FILE_IN_CABINET_INFO_W FILE_IN_CABINET_INFO, *PFILE_IN_CABINET_INFO; +typedef SP_FILE_COPY_PARAMS_W SP_FILE_COPY_PARAMS, PSP_FILE_COPY_PARAMS; +typedef SP_DEVICE_INTERFACE_DETAIL_DATA_W SP_DEVICE_INTERFACE_DETAIL_DATA, + *PSP_DEVICE_INTERFACE_DETAIL_DATA; +typedef SP_INTERFACE_DEVICE_DETAIL_DATA_W SP_INTERFACE_DEVICE_DETAIL_DATA, + *PSP_INTERFACE_DEVICE_DETAIL_DATA; /* deprecated */ +typedef SP_DEVINFO_LIST_DETAIL_DATA_W SP_DEVINFO_LIST_DETAIL_DATA, + *PSP_DEVINFO_LIST_DETAIL_DATA; +typedef SP_DEVINSTALL_PARAMS_W SP_DEVINSTALL_PARAMS, *PSP_DEVINSTALL_PARAMS; +typedef SP_SELECTDEVICE_PARAMS_W SP_SELECTDEVICE_PARAMS, *PSP_SELECTDEVICE_PARAMS; +typedef SP_TROUBLESHOOTER_PARAMS_W SP_TROUBLESHOOTER_PARAMS, + *PSP_TROUBLESHOOTER_PARAMS; +typedef SP_POWERMESSAGEWAKE_PARAMS_W SP_POWERMESSAGEWAKE_PARAMS, + *PSP_POWERMESSAGEWAKE_PARAMS; +typedef SP_DRVINFO_DETAIL_DATA_W SP_DRVINFO_DETAIL_DATA, + *PSP_DRVINFO_DETAIL_DATA; +typedef SP_BACKUP_QUEUE_PARAMS_W SP_BACKUP_QUEUE_PARAMS, + *PSP_BACKUP_QUEUE_PARAMS; +#else +typedef SP_ORIGINAL_FILE_INFO_A SP_ORIGINAL_FILE_INFO, *PSP_ORIGINAL_FILE_INFO; +typedef FILEPATHS_A FILEPATHS, *PFILEPATHS; +typedef SOURCE_MEDIA_A SOURCE_MEDIA, *PSOURCE_MEDIA; +typedef CABINET_INFO_A CABINET_INFO, *PCABINET_INFO; +typedef FILE_IN_CABINET_INFO_A FILE_IN_CABINET_INFO, *PFILE_IN_CABINET_INFO; +typedef SP_FILE_COPY_PARAMS_A SP_FILE_COPY_PARAMS, *PSP_FILE_COPY_PARAMS; +typedef SP_DEVICE_INTERFACE_DETAIL_DATA_A SP_DEVICE_INTERFACE_DETAIL_DATA, + *PSP_DEVICE_INTERFACE_DETAIL_DATA; +typedef SP_INTERFACE_DEVICE_DETAIL_DATA_A SP_INTERFACE_DEVICE_DETAIL_DATA, + *PSP_INTERFACE_DEVICE_DETAIL_DATA; /* deprecated */ +typedef SP_DEVINFO_LIST_DETAIL_DATA_A SP_DEVINFO_LIST_DETAIL_DATA, + *PSP_DEVINFO_LIST_DETAIL_DATA; +typedef SP_DEVINSTALL_PARAMS_A SP_DEVINSTALL_PARAMS, *PSP_DEVINSTALL_PARAMS; +typedef SP_SELECTDEVICE_PARAMS_A SP_SELECTDEVICE_PARAMS, + *PSP_SELECTDEVICE_PARAMS; +typedef SP_TROUBLESHOOTER_PARAMS_A SP_TROUBLESHOOTER_PARAMS, + *PSP_TROUBLESHOOTER_PARAMS; +typedef SP_POWERMESSAGEWAKE_PARAMS_A SP_POWERMESSAGEWAKE_PARAMS, + *PSP_POWERMESSAGEWAKE_PARAMS; +typedef SP_DRVINFO_DETAIL_DATA_A SP_DRVINFO_DETAIL_DATA, + *PSP_DRVINFO_DETAIL_DATA; +typedef SP_BACKUP_QUEUE_PARAMS_A SP_BACKUP_QUEUE_PARAMS, + *PSP_BACKUP_QUEUE_PARAMS; +#endif /* UNICODE */ + +WINSETUPAPI BOOL WINAPI SetupAddInstallSectionToDiskSpaceListA(HDSKSPC,HINF,HINF,PCSTR,PVOID,UINT); +WINSETUPAPI BOOL WINAPI SetupAddInstallSectionToDiskSpaceListW(HDSKSPC,HINF,HINF,PCWSTR,PVOID,UINT); +WINSETUPAPI BOOL WINAPI SetupAddSectionToDiskSpaceListA(HDSKSPC,HINF,HINF,PCSTR,UINT,PVOID,UINT); +WINSETUPAPI BOOL WINAPI SetupAddSectionToDiskSpaceListW(HDSKSPC,HINF,HINF,PCWSTR,UINT,PVOID,UINT); +WINSETUPAPI BOOL WINAPI SetupAddToDiskSpaceListA(HDSKSPC,PCSTR,LONGLONG,UINT,PVOID,UINT); +WINSETUPAPI BOOL WINAPI SetupAddToDiskSpaceListW(HDSKSPC,PCWSTR,LONGLONG,UINT,PVOID,UINT); +WINSETUPAPI BOOL WINAPI SetupAddToSourceListA(DWORD,PCSTR); +WINSETUPAPI BOOL WINAPI SetupAddToSourceListW(DWORD,PCWSTR); +WINSETUPAPI BOOL WINAPI SetupAdjustDiskSpaceListA(HDSKSPC,LPCSTR,LONGLONG,PVOID,UINT); +WINSETUPAPI BOOL WINAPI SetupAdjustDiskSpaceListW(HDSKSPC,LPCWSTR,LONGLONG,PVOID,UINT); +WINSETUPAPI UINT WINAPI SetupBackupErrorA(HWND,PCSTR,PCSTR,PCSTR,UINT,DWORD); +WINSETUPAPI UINT WINAPI SetupBackupErrorW(HWND,PCWSTR,PCWSTR,PCWSTR,UINT,DWORD); +WINSETUPAPI BOOL WINAPI SetupCancelTemporary(VOID); +WINSETUPAPI BOOL WINAPI SetupCloseFileQueue(HSPFILEQ); +WINSETUPAPI VOID WINAPI SetupCloseInfFile(HINF); +WINSETUPAPI VOID WINAPI SetupCloseLog(VOID); +WINSETUPAPI BOOL WINAPI SetupCommitFileQueueA(HWND,HSPFILEQ,PSP_FILE_CALLBACK_A,PVOID); +WINSETUPAPI BOOL WINAPI SetupCommitFileQueueW(HWND,HSPFILEQ,PSP_FILE_CALLBACK_W,PVOID); +WINSETUPAPI UINT WINAPI SetupCopyErrorA(HWND,PCSTR,PCSTR,PCSTR,PCSTR,PCSTR,UINT,DWORD,PSTR,DWORD,PDWORD); +WINSETUPAPI UINT WINAPI SetupCopyErrorW(HWND,PCWSTR,PCWSTR,PCWSTR,PCWSTR,PCWSTR,UINT,DWORD,PWSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupCopyOEMInfA(PCSTR,PCSTR,DWORD,DWORD,PSTR,DWORD,PDWORD,PSTR*); +WINSETUPAPI BOOL WINAPI SetupCopyOEMInfW(PCWSTR,PCWSTR,DWORD,DWORD,PWSTR,DWORD,PDWORD,PWSTR*); +WINSETUPAPI HDSKSPC WINAPI SetupCreateDiskSpaceListA(PVOID,DWORD,UINT); +WINSETUPAPI HDSKSPC WINAPI SetupCreateDiskSpaceListW(PVOID,DWORD,UINT); +WINSETUPAPI DWORD WINAPI SetupDecompressOrCopyFileA(PCSTR,PCSTR,PUINT); +WINSETUPAPI DWORD WINAPI SetupDecompressOrCopyFileW(PCWSTR,PCWSTR,PUINT); +WINSETUPAPI UINT WINAPI SetupDefaultQueueCallbackA(PVOID,UINT,UINT_PTR,UINT_PTR); +WINSETUPAPI UINT WINAPI SetupDefaultQueueCallbackW(PVOID,UINT,UINT_PTR,UINT_PTR); +WINSETUPAPI UINT WINAPI SetupDeleteErrorA(HWND,PCSTR,PCSTR,UINT,DWORD); +WINSETUPAPI UINT WINAPI SetupDeleteErrorW(HWND,PCWSTR,PCWSTR,UINT,DWORD); +WINSETUPAPI BOOL WINAPI SetupDestroyDiskSpaceList(HDSKSPC); +WINSETUPAPI BOOL WINAPI SetupDiAskForOEMDisk(HDEVINFO,PSP_DEVINFO_DATA); +WINSETUPAPI BOOL WINAPI SetupDiBuildClassInfoList(DWORD,LPGUID,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupDiBuildClassInfoListExA(DWORD,LPGUID,DWORD,PDWORD,PCSTR,PVOID); +WINSETUPAPI BOOL WINAPI SetupDiBuildClassInfoListExW(DWORD,LPGUID,DWORD,PDWORD,PCWSTR,PVOID); +WINSETUPAPI BOOL WINAPI SetupDiBuildDriverInfoList(HDEVINFO,PSP_DEVINFO_DATA,DWORD); +WINSETUPAPI BOOL WINAPI SetupDiCallClassInstaller(DI_FUNCTION,HDEVINFO,PSP_DEVINFO_DATA); +WINSETUPAPI BOOL WINAPI SetupDiCancelDriverInfoSearch(HDEVINFO); +WINSETUPAPI BOOL WINAPI SetupDiChangeState(HDEVINFO,PSP_DEVINFO_DATA); +WINSETUPAPI BOOL WINAPI SetupDiClassGuidsFromNameA(PCSTR,LPGUID,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupDiClassGuidsFromNameW(PCWSTR,LPGUID,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupDiClassGuidsFromNameExA(PCSTR,LPGUID,DWORD,PDWORD,PCSTR,PVOID); +WINSETUPAPI BOOL WINAPI SetupDiClassGuidsFromNameExW(PCWSTR,LPGUID,DWORD,PDWORD,PCWSTR,PVOID); +WINSETUPAPI BOOL WINAPI SetupDiClassNameFromGuidA(CONST GUID*,PSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupDiClassNameFromGuidW(CONST GUID*,PWSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupDiClassNameFromGuidExA(CONST GUID*,PSTR,DWORD,PDWORD,PCSTR,PVOID); +WINSETUPAPI BOOL WINAPI SetupDiClassNameFromGuidExW(CONST GUID*,PWSTR,DWORD,PDWORD,PCWSTR,PVOID); +WINSETUPAPI BOOL WINAPI SetupDiCreateDeviceInfoA(HDEVINFO,PCSTR,CONST GUID*,PCSTR,HWND,DWORD,PSP_DEVINFO_DATA); +WINSETUPAPI BOOL WINAPI SetupDiCreateDeviceInfoW(HDEVINFO,PCWSTR,CONST GUID*,PCWSTR,HWND,DWORD,PSP_DEVINFO_DATA); +WINSETUPAPI HDEVINFO WINAPI SetupDiCreateDeviceInfoList(CONST GUID*,HWND); +WINSETUPAPI HDEVINFO WINAPI SetupDiCreateDeviceInfoListExA(CONST GUID*,HWND,PCSTR,PVOID); +WINSETUPAPI HDEVINFO WINAPI SetupDiCreateDeviceInfoListExW(CONST GUID*,HWND,PCWSTR,PVOID); +WINSETUPAPI BOOL WINAPI SetupDiCreateDeviceInterfaceA(HDEVINFO,PSP_DEVINFO_DATA,CONST GUID*,PCSTR,DWORD,PSP_DEVICE_INTERFACE_DATA); +WINSETUPAPI BOOL WINAPI SetupDiCreateDeviceInterfaceW(HDEVINFO,PSP_DEVINFO_DATA,CONST GUID*,PCWSTR,DWORD,PSP_DEVICE_INTERFACE_DATA); +WINSETUPAPI HKEY WINAPI SetupDiCreateDeviceInterfaceRegKeyA(HDEVINFO,PSP_DEVICE_INTERFACE_DATA,DWORD,REGSAM,HINF,PCSTR); +WINSETUPAPI HKEY WINAPI SetupDiCreateDeviceInterfaceRegKeyW(HDEVINFO,PSP_DEVICE_INTERFACE_DATA,DWORD,REGSAM,HINF,PCWSTR); +WINSETUPAPI HKEY WINAPI SetupDiCreateDevRegKeyA(HDEVINFO,PSP_DEVINFO_DATA,DWORD,DWORD,DWORD,HINF,PCSTR); +WINSETUPAPI HKEY WINAPI SetupDiCreateDevRegKeyW(HDEVINFO,PSP_DEVINFO_DATA,DWORD,DWORD,DWORD,HINF,PCWSTR); +WINSETUPAPI BOOL WINAPI SetupDiDeleteDeviceInfo(HDEVINFO,PSP_DEVINFO_DATA); +WINSETUPAPI BOOL WINAPI SetupDiDeleteDeviceInterfaceData(HDEVINFO,PSP_DEVICE_INTERFACE_DATA); +WINSETUPAPI BOOL WINAPI SetupDiDeleteDeviceInterfaceRegKey(HDEVINFO,PSP_DEVICE_INTERFACE_DATA,DWORD); +WINSETUPAPI BOOL WINAPI SetupDiDeleteDevRegKey(HDEVINFO,PSP_DEVINFO_DATA,DWORD,DWORD,DWORD); +WINSETUPAPI BOOL WINAPI SetupDiDestroyClassImageList(PSP_CLASSIMAGELIST_DATA); +WINSETUPAPI BOOL WINAPI SetupDiDestroyDeviceInfoList(HDEVINFO); +WINSETUPAPI BOOL WINAPI SetupDiDestroyDriverInfoList(HDEVINFO,PSP_DEVINFO_DATA,DWORD); +WINSETUPAPI INT WINAPI SetupDiDrawMiniIcon(HDC,RECT,INT,DWORD); +WINSETUPAPI BOOL WINAPI SetupDiEnumDeviceInfo(HDEVINFO,DWORD,PSP_DEVINFO_DATA); +WINSETUPAPI BOOL WINAPI SetupDiEnumDeviceInterfaces(HDEVINFO,PSP_DEVINFO_DATA,CONST GUID*,DWORD,PSP_DEVICE_INTERFACE_DATA); +WINSETUPAPI BOOL WINAPI SetupDiEnumDriverInfoA(HDEVINFO,PSP_DEVINFO_DATA,DWORD,DWORD,PSP_DRVINFO_DATA_A); +WINSETUPAPI BOOL WINAPI SetupDiEnumDriverInfoW(HDEVINFO,PSP_DEVINFO_DATA,DWORD,DWORD,PSP_DRVINFO_DATA_W); +WINSETUPAPI BOOL WINAPI SetupDiGetActualSectionToInstallA(HINF,PCSTR,PSTR,DWORD,PDWORD,PSTR*); +WINSETUPAPI BOOL WINAPI SetupDiGetActualSectionToInstallW(HINF,PCWSTR,PWSTR,DWORD,PDWORD,PWSTR*); +WINSETUPAPI BOOL WINAPI SetupDiGetClassBitmapIndex(CONST GUID*,PINT); +WINSETUPAPI BOOL WINAPI SetupDiGetClassDescriptionA(CONST GUID*,PSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupDiGetClassDescriptionW(CONST GUID*,PWSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupDiGetClassDescriptionExA(CONST GUID*,PSTR,DWORD,PDWORD,PCSTR,PVOID); +WINSETUPAPI BOOL WINAPI SetupDiGetClassDescriptionExW(CONST GUID*,PWSTR,DWORD,PDWORD,PCWSTR,PVOID); +WINSETUPAPI BOOL WINAPI SetupDiGetClassDevPropertySheetsA(HDEVINFO,PSP_DEVINFO_DATA,LPPROPSHEETHEADERA,DWORD,PDWORD,DWORD); +WINSETUPAPI BOOL WINAPI SetupDiGetClassDevPropertySheetsW(HDEVINFO,PSP_DEVINFO_DATA,LPPROPSHEETHEADERW,DWORD,PDWORD,DWORD); +WINSETUPAPI HDEVINFO WINAPI SetupDiGetClassDevsA(CONST GUID*,PCSTR,HWND,DWORD); +WINSETUPAPI HDEVINFO WINAPI SetupDiGetClassDevsW(CONST GUID*,PCWSTR,HWND,DWORD); +WINSETUPAPI HDEVINFO WINAPI SetupDiGetClassDevsExA(CONST GUID*,PCSTR,HWND,DWORD,HDEVINFO,PCSTR,PVOID); +WINSETUPAPI HDEVINFO WINAPI SetupDiGetClassDevsExW(CONST GUID*,PCWSTR,HWND,DWORD,HDEVINFO,PCWSTR,PVOID); +WINSETUPAPI BOOL WINAPI SetupDiGetClassImageIndex(PSP_CLASSIMAGELIST_DATA,CONST GUID*,PINT); +WINSETUPAPI BOOL WINAPI SetupDiGetClassImageList(PSP_CLASSIMAGELIST_DATA); +WINSETUPAPI BOOL WINAPI SetupDiGetClassImageListExA(PSP_CLASSIMAGELIST_DATA,PCSTR,PVOID); +WINSETUPAPI BOOL WINAPI SetupDiGetClassImageListExW(PSP_CLASSIMAGELIST_DATA,PCWSTR,PVOID); +WINSETUPAPI BOOL WINAPI SetupDiGetClassInstallParamsA(HDEVINFO,PSP_DEVINFO_DATA,PSP_CLASSINSTALL_HEADER,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupDiGetClassInstallParamsW(HDEVINFO,PSP_DEVINFO_DATA,PSP_CLASSINSTALL_HEADER,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupDiGetClassRegistryPropertyA(LPGUID,DWORD,PDWORD,PBYTE,DWORD,PDWORD,PCSTR,PVOID); +WINSETUPAPI BOOL WINAPI SetupDiGetClassRegistryPropertyW(LPGUID,DWORD,PDWORD,PBYTE,DWORD,PDWORD,PCWSTR,PVOID); +WINSETUPAPI BOOL WINAPI SetupDiGetDeviceInfoListClass(HDEVINFO,LPGUID); +WINSETUPAPI BOOL WINAPI SetupDiGetDeviceInfoListDetailA(HDEVINFO,PSP_DEVINFO_LIST_DETAIL_DATA_A); +WINSETUPAPI BOOL WINAPI SetupDiGetDeviceInfoListDetailW(HDEVINFO,PSP_DEVINFO_LIST_DETAIL_DATA_W); +WINSETUPAPI BOOL WINAPI SetupDiGetDeviceInstallParamsA(HDEVINFO,PSP_DEVINFO_DATA,PSP_DEVINSTALL_PARAMS_A); +WINSETUPAPI BOOL WINAPI SetupDiGetDeviceInstallParamsW(HDEVINFO,PSP_DEVINFO_DATA,PSP_DEVINSTALL_PARAMS_W); +WINSETUPAPI BOOL WINAPI SetupDiGetDeviceInstanceIdA(HDEVINFO,PSP_DEVINFO_DATA,PSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupDiGetDeviceInstanceIdW(HDEVINFO,PSP_DEVINFO_DATA,PWSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupDiGetDeviceInterfaceAlias(HDEVINFO,PSP_DEVICE_INTERFACE_DATA,CONST GUID*,PSP_DEVICE_INTERFACE_DATA); +WINSETUPAPI BOOL WINAPI SetupDiGetDeviceInterfaceDetailA(HDEVINFO,PSP_DEVICE_INTERFACE_DATA,PSP_DEVICE_INTERFACE_DETAIL_DATA_A,DWORD,PDWORD,PSP_DEVINFO_DATA); +WINSETUPAPI BOOL WINAPI SetupDiGetDeviceInterfaceDetailW(HDEVINFO,PSP_DEVICE_INTERFACE_DATA,PSP_DEVICE_INTERFACE_DETAIL_DATA_W,DWORD,PDWORD,PSP_DEVINFO_DATA); +WINSETUPAPI BOOL WINAPI SetupDiGetDeviceRegistryPropertyA(HDEVINFO,PSP_DEVINFO_DATA,DWORD,PDWORD,PBYTE,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupDiGetDeviceRegistryPropertyW(HDEVINFO,PSP_DEVINFO_DATA,DWORD,PDWORD,PBYTE,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupDiGetDriverInfoDetailA(HDEVINFO,PSP_DEVINFO_DATA,PSP_DRVINFO_DATA_A,PSP_DRVINFO_DETAIL_DATA_A,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupDiGetDriverInfoDetailW(HDEVINFO,PSP_DEVINFO_DATA,PSP_DRVINFO_DATA_W,PSP_DRVINFO_DETAIL_DATA_W,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupDiGetDriverInstallParamsA(HDEVINFO,PSP_DEVINFO_DATA,PSP_DRVINFO_DATA_A,PSP_DRVINSTALL_PARAMS); +WINSETUPAPI BOOL WINAPI SetupDiGetDriverInstallParamsW(HDEVINFO,PSP_DEVINFO_DATA,PSP_DRVINFO_DATA_W,PSP_DRVINSTALL_PARAMS); +WINSETUPAPI BOOL WINAPI SetupDiGetHwProfileFriendlyNameA(DWORD,PSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupDiGetHwProfileFriendlyNameExA(DWORD,PSTR,DWORD,PDWORD,PCSTR,PVOID); +WINSETUPAPI BOOL WINAPI SetupDiGetHwProfileFriendlyNameExW(DWORD,PWSTR,DWORD,PDWORD,PCWSTR,PVOID); +WINSETUPAPI BOOL WINAPI SetupDiGetHwProfileFriendlyNameW(DWORD,PWSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupDiGetHwProfileList(PDWORD,DWORD,PDWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupDiGetHwProfileListExA(PDWORD,DWORD,PDWORD,PDWORD,PCSTR,PVOID); +WINSETUPAPI BOOL WINAPI SetupDiGetHwProfileListExW(PDWORD,DWORD,PDWORD,PDWORD,PCWSTR,PVOID); +WINSETUPAPI BOOL WINAPI SetupDiGetINFClassA(PCSTR,LPGUID,PSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupDiGetINFClassW(PCWSTR,LPGUID,PWSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupDiGetSelectedDevice(HDEVINFO,PSP_DEVINFO_DATA); +WINSETUPAPI BOOL WINAPI SetupDiGetSelectedDriverA(HDEVINFO,PSP_DEVINFO_DATA,PSP_DRVINFO_DATA_A); +WINSETUPAPI BOOL WINAPI SetupDiGetSelectedDriverW(HDEVINFO,PSP_DEVINFO_DATA,PSP_DRVINFO_DATA_W); +WINSETUPAPI HPROPSHEETPAGE WINAPI SetupDiGetWizardage(HDEVINFO,PSP_DEVINFO_DATA,PSP_INSTALLWIZARD_DATA,DWORD,DWORD); +WINSETUPAPI BOOL WINAPI SetupDiInstallClassA(HWND,PCSTR,DWORD,HSPFILEQ); +WINSETUPAPI BOOL WINAPI SetupDiInstallClassW(HWND,PCWSTR,DWORD,HSPFILEQ); +WINSETUPAPI BOOL WINAPI SetupDiInstallClassExA(HWND,PCSTR,DWORD,HSPFILEQ,CONST GUID*,PVOID,PVOID); +WINSETUPAPI BOOL WINAPI SetupDiInstallClassExW(HWND,PCWSTR,DWORD,HSPFILEQ,CONST GUID*,PVOID,PVOID); +WINSETUPAPI BOOL WINAPI SetupDiInstallDevice(HDEVINFO,PSP_DEVINFO_DATA); +WINSETUPAPI BOOL WINAPI SetupDiInstallDeviceInterfaces(HDEVINFO,PSP_DEVINFO_DATA); +WINSETUPAPI BOOL WINAPI SetupDiInstallDriverFiles(HDEVINFO,PSP_DEVINFO_DATA); +WINSETUPAPI BOOL WINAPI SetupDiLoadClassIcon(CONST GUID*,HICON*,PINT); +WINSETUPAPI BOOL WINAPI SetupDiMoveDuplicateDevice(HDEVINFO,PSP_DEVINFO_DATA); +WINSETUPAPI HKEY WINAPI SetupDiOpenClassRegKey(CONST GUID*,REGSAM); +WINSETUPAPI HKEY WINAPI SetupDiOpenClassRegKeyExA(CONST GUID*,REGSAM,DWORD,PCSTR,PVOID); +WINSETUPAPI HKEY WINAPI SetupDiOpenClassRegKeyExW(CONST GUID*,REGSAM,DWORD,PCWSTR,PVOID); +WINSETUPAPI BOOL WINAPI SetupDiOpenDeviceInfoA(HDEVINFO,PCSTR,HWND,DWORD,PSP_DEVINFO_DATA); +WINSETUPAPI BOOL WINAPI SetupDiOpenDeviceInfoW(HDEVINFO,PCWSTR,HWND,DWORD,PSP_DEVINFO_DATA); +WINSETUPAPI BOOL WINAPI SetupDiOpenDeviceInterfaceA(HDEVINFO,PCSTR,DWORD,PSP_DEVICE_INTERFACE_DATA); +WINSETUPAPI BOOL WINAPI SetupDiOpenDeviceInterfaceW(HDEVINFO,PCWSTR,DWORD,PSP_DEVICE_INTERFACE_DATA); +WINSETUPAPI HKEY WINAPI SetupDiOpenDeviceInterfaceRegKey(HDEVINFO,PSP_DEVICE_INTERFACE_DATA,DWORD,REGSAM); +WINSETUPAPI HKEY WINAPI SetupDiOpenDevRegKey(HDEVINFO,PSP_DEVINFO_DATA,DWORD,DWORD,DWORD,REGSAM); +WINSETUPAPI BOOL WINAPI SetupDiRegisterCoDeviceInstallers(HDEVINFO,PSP_DEVINFO_DATA); +WINSETUPAPI BOOL WINAPI SetupDiRegisterDeviceInfo(HDEVINFO,PSP_DEVINFO_DATA,DWORD,PSP_DETSIG_CMPPROC,PVOID,PSP_DEVINFO_DATA); +WINSETUPAPI BOOL WINAPI SetupDiRemoveDevice(HDEVINFO,PSP_DEVINFO_DATA); +WINSETUPAPI BOOL WINAPI SetupDiRemoveDeviceInterface(HDEVINFO,PSP_DEVICE_INTERFACE_DATA); +WINSETUPAPI BOOL WINAPI SetupDiSelectBestCompatDrv(HDEVINFO,PSP_DEVINFO_DATA); +WINSETUPAPI BOOL WINAPI SetupDiSelectDevice(HDEVINFO,PSP_DEVINFO_DATA); +WINSETUPAPI BOOL WINAPI SetupDiSelectOEMDrv(HWND,HDEVINFO,PSP_DEVINFO_DATA); +WINSETUPAPI BOOL WINAPI SetupDiSetClassInstallParamsA(HDEVINFO,PSP_DEVINFO_DATA,PSP_CLASSINSTALL_HEADER,DWORD); +WINSETUPAPI BOOL WINAPI SetupDiSetClassInstallParamsW(HDEVINFO,PSP_DEVINFO_DATA,PSP_CLASSINSTALL_HEADER,DWORD); +WINSETUPAPI BOOL WINAPI SetupDiSetClassRegistryPropertyA(LPGUID,DWORD,CONST BYTE*,DWORD,PCSTR,PVOID); +WINSETUPAPI BOOL WINAPI SetupDiSetClassRegistryPropertyW(LPGUID,DWORD,CONST BYTE*,DWORD,PCWSTR,PVOID); +WINSETUPAPI BOOL WINAPI SetupDiSetDeviceInstallParamsA(HDEVINFO,PSP_DEVINFO_DATA,PSP_DEVINSTALL_PARAMS_A); +WINSETUPAPI BOOL WINAPI SetupDiSetDeviceInstallParamsW(HDEVINFO,PSP_DEVINFO_DATA,PSP_DEVINSTALL_PARAMS_W); +WINSETUPAPI BOOL WINAPI SetupDiSetDeviceRegistryPropertyA(HDEVINFO,PSP_DEVINFO_DATA,DWORD,CONST BYTE*,DWORD); +WINSETUPAPI BOOL WINAPI SetupDiSetDeviceRegistryPropertyW(HDEVINFO,PSP_DEVINFO_DATA,DWORD,CONST BYTE*,DWORD); +WINSETUPAPI BOOL WINAPI SetupDiSetDriverInstallParamsA(HDEVINFO,PSP_DEVINFO_DATA,PSP_DRVINFO_DATA_A,PSP_DRVINSTALL_PARAMS); +WINSETUPAPI BOOL WINAPI SetupDiSetDriverInstallParamsW(HDEVINFO,PSP_DEVINFO_DATA,PSP_DRVINFO_DATA_W,PSP_DRVINSTALL_PARAMS); +WINSETUPAPI BOOL WINAPI SetupDiSetSelectedDevice(HDEVINFO,PSP_DEVINFO_DATA); +WINSETUPAPI BOOL WINAPI SetupDiSetSelectedDriverA(HDEVINFO,PSP_DEVINFO_DATA,PSP_DRVINFO_DATA_A); +WINSETUPAPI BOOL WINAPI SetupDiSetSelectedDriverW(HDEVINFO,PSP_DEVINFO_DATA,PSP_DRVINFO_DATA_W); +WINSETUPAPI BOOL WINAPI SetupDiUnremoveDevice(HDEVINFO,PSP_DEVINFO_DATA); +WINSETUPAPI HDSKSPC WINAPI SetupDuplicateDiskSpaceListA(HDSKSPC,PVOID,DWORD,UINT); +WINSETUPAPI HDSKSPC WINAPI SetupDuplicateDiskSpaceListW(HDSKSPC,PVOID,DWORD,UINT); +WINSETUPAPI BOOL WINAPI SetupFindFirstLineA(HINF,PCSTR,PCSTR,PINFCONTEXT); +WINSETUPAPI BOOL WINAPI SetupFindFirstLineW(HINF,PCWSTR,PCWSTR,PINFCONTEXT); +WINSETUPAPI BOOL WINAPI SetupFindNextLine(PINFCONTEXT,PINFCONTEXT); +WINSETUPAPI BOOL WINAPI SetupFindNextMatchLineA(PINFCONTEXT,PCSTR,PINFCONTEXT); +WINSETUPAPI BOOL WINAPI SetupFindNextMatchLineW(PINFCONTEXT,PCWSTR,PINFCONTEXT); +WINSETUPAPI BOOL WINAPI SetupFreeA(PCSTR**,UINT); +WINSETUPAPI BOOL WINAPI SetupFreeW(PCWSTR**,UINT); +WINSETUPAPI BOOL WINAPI SetupGetBackupInformationA(HSPFILEQ,PSP_BACKUP_QUEUE_PARAMS_A); +WINSETUPAPI BOOL WINAPI SetupGetBackupInformationW(HSPFILEQ,PSP_BACKUP_QUEUE_PARAMS_W); +WINSETUPAPI BOOL WINAPI SetupGetBinaryField(PINFCONTEXT,DWORD,PBYTE,DWORD,LPDWORD); +WINSETUPAPI DWORD WINAPI SetupGetFieldCount(PINFCONTEXT); +WINSETUPAPI DWORD WINAPI SetupGetFileCompressionInfoA(PCSTR,PSTR*,PDWORD,PDWORD,PUINT); +WINSETUPAPI DWORD WINAPI SetupGetFileCompressionInfoW(PCWSTR,PWSTR*,PDWORD,PDWORD,PUINT); +WINSETUPAPI BOOL WINAPI SetupGetInfFileListA(PCSTR,DWORD,PSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupGetInfFileListW(PCWSTR,DWORD,PWSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupGetInfInformationA(LPCVOID,DWORD,PSP_INF_INFORMATION,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupGetInfInformationW(LPCVOID,DWORD,PSP_INF_INFORMATION,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupGetIntField(PINFCONTEXT,DWORD,PINT); +WINSETUPAPI BOOL WINAPI SetupGetLineByIndexA(HINF,PCSTR,DWORD,PINFCONTEXT); +WINSETUPAPI BOOL WINAPI SetupGetLineByIndexW(HINF,PCWSTR,DWORD,PINFCONTEXT); +WINSETUPAPI LONG WINAPI SetupGetLineCountA(HINF,PCSTR); +WINSETUPAPI LONG WINAPI SetupGetLineCountW(HINF,PCWSTR); +WINSETUPAPI BOOL WINAPI SetupGetLineTextA(PINFCONTEXT,HINF,PCSTR,PCSTR,PSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupGetLineTextW(PINFCONTEXT,HINF,PCWSTR,PCWSTR,PWSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupGetMultiSzFieldA(PINFCONTEXT,DWORD,PSTR,DWORD,LPDWORD); +WINSETUPAPI BOOL WINAPI SetupGetMultiSzFieldW(PINFCONTEXT,DWORD,PWSTR,DWORD,LPDWORD); +WINSETUPAPI BOOL WINAPI SetupGetSourceFileLocationA(HINF,PINFCONTEXT,PCSTR,PUINT,PSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupGetSourceFileLocationW(HINF,PINFCONTEXT,PCWSTR,PUINT,PWSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupGetSourceFileSizeA(HINF,PINFCONTEXT,PCSTR,PCSTR,PDWORD,UINT); +WINSETUPAPI BOOL WINAPI SetupGetSourceFileSizeW(HINF,PINFCONTEXT,PCWSTR,PCWSTR,PDWORD,UINT); +WINSETUPAPI BOOL WINAPI SetupGetSourceInfoA(HINF,UINT,UINT,PSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupGetSourceInfoW(HINF,UINT,UINT,PWSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupGetStringFieldA(PINFCONTEXT,DWORD,PSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupGetStringFieldW(PINFCONTEXT,DWORD,PWSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupGetTargetPathA(HINF,PINFCONTEXT,PCSTR,PSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupGetTargetPathW(HINF,PINFCONTEXT,PCWSTR,PWSTR,DWORD,PDWORD); +WINSETUPAPI PVOID WINAPI SetupInitDefaultQueueCallback(HWND); +WINSETUPAPI PVOID WINAPI SetupInitDefaultQueueCallbackEx(HWND,HWND,UINT,DWORD,PVOID); +WINSETUPAPI HSPFILELOG WINAPI SetupInitializeFileLogA(PCSTR,DWORD); +WINSETUPAPI HSPFILELOG WINAPI SetupInitializeFileLogW(PCWSTR,DWORD); +WINSETUPAPI BOOL WINAPI SetupInstallFileA(HINF,PINFCONTEXT,PCSTR,PCSTR,PCSTR,DWORD,PSP_FILE_CALLBACK_A,PVOID); +WINSETUPAPI BOOL WINAPI SetupInstallFileW(HINF,PINFCONTEXT,PCWSTR,PCWSTR,PCWSTR,DWORD,PSP_FILE_CALLBACK_W,PVOID); +WINSETUPAPI BOOL WINAPI SetupInstallFileExA(HINF,PINFCONTEXT,PCSTR,PCSTR,PCSTR,DWORD,PSP_FILE_CALLBACK_A,PVOID,PBOOL); +WINSETUPAPI BOOL WINAPI SetupInstallFileExW(HINF,PINFCONTEXT,PCWSTR,PCWSTR,PCWSTR,DWORD,PSP_FILE_CALLBACK_W,PVOID,PBOOL); +WINSETUPAPI BOOL WINAPI SetupInstallFilesFromInfSectionA(HINF,HINF,HSPFILEQ,PCSTR,PCSTR,UINT); +WINSETUPAPI BOOL WINAPI SetupInstallFilesFromInfSectionW(HINF,HINF,HSPFILEQ,PCWSTR,PCWSTR,UINT); +WINSETUPAPI BOOL WINAPI SetupInstallFromInfSectionA(HWND,HINF,PCSTR,UINT,HKEY,PCSTR,UINT,PSP_FILE_CALLBACK_A,PVOID,HDEVINFO,PSP_DEVINFO_DATA); +WINSETUPAPI BOOL WINAPI SetupInstallFromInfSectionW(HWND,HINF,PCWSTR,UINT,HKEY,PCWSTR,UINT,PSP_FILE_CALLBACK_W,PVOID,HDEVINFO,PSP_DEVINFO_DATA); +WINSETUPAPI BOOL WINAPI SetupInstallServicesFromInfSectionA(HINF,PCSTR,DWORD); +WINSETUPAPI BOOL WINAPI SetupInstallServicesFromInfSectionW(HINF,PCWSTR,DWORD); +WINSETUPAPI BOOL WINAPI SetupInstallServicesFromInfSectionExA(HINF,PCSTR,DWORD,HDEVINFO,PSP_DEVINFO_DATA,PVOID,PVOID); +WINSETUPAPI BOOL WINAPI SetupInstallServicesFromInfSectionExW(HINF,PCWSTR,DWORD,HDEVINFO,PSP_DEVINFO_DATA,PVOID,PVOID); +WINSETUPAPI BOOL WINAPI SetupIterateCabinetA(PCSTR,DWORD,PSP_FILE_CALLBACK_A,PVOID); +WINSETUPAPI BOOL WINAPI SetupIterateCabinetW(PCWSTR,DWORD,PSP_FILE_CALLBACK_W,PVOID); +WINSETUPAPI BOOL WINAPI SetupLogErrorA(LPCSTR,LogSeverity); +WINSETUPAPI BOOL WINAPI SetupLogErrorW(LPCWSTR,LogSeverity); +WINSETUPAPI BOOL WINAPI SetupLogFileA(HSPFILELOG,PCSTR,PCSTR,PCSTR,DWORD,PCSTR,PCSTR,PCSTR,DWORD); +WINSETUPAPI BOOL WINAPI SetupLogFileW(HSPFILELOG,PCWSTR,PCWSTR,PCWSTR,DWORD,PCWSTR,PCWSTR,PCWSTR,DWORD); +WINSETUPAPI BOOL WINAPI SetupOpenAppendInfFileA(PCSTR,HINF,PUINT); +WINSETUPAPI BOOL WINAPI SetupOpenAppendInfFileW(PCWSTR,HINF,PUINT); +WINSETUPAPI HSPFILEQ WINAPI SetupOpenFileQueue(VOID); +WINSETUPAPI HINF WINAPI SetupOpenInfFileA(PCSTR,PCSTR,DWORD,PUINT); +WINSETUPAPI HINF WINAPI SetupOpenInfFileW(PCWSTR,PCWSTR,DWORD,PUINT); +WINSETUPAPI BOOL WINAPI SetupOpenLog(BOOL); +WINSETUPAPI HINF WINAPI SetupOpenMasterInf(VOID); +WINSETUPAPI UINT WINAPI SetupPromptForDiskA(HWND,PCSTR,PCSTR,PCSTR,PCSTR,PCSTR,DWORD,PSTR,DWORD,PDWORD); +WINSETUPAPI UINT WINAPI SetupPromptForDiskW(HWND,PCWSTR,PCWSTR,PCWSTR,PCWSTR,PCWSTR,DWORD,PWSTR,DWORD,PDWORD); +WINSETUPAPI INT WINAPI SetupPromptReboot(HSPFILEQ,HWND,BOOL); +WINSETUPAPI BOOL WINAPI SetupQueryA(DWORD,PCSTR**,PUINT); +WINSETUPAPI BOOL WINAPI SetupQueryW(DWORD,PCWSTR**,PUINT); +WINSETUPAPI BOOL WINAPI SetupQueryDrivesInDiskSpaceListA(HDSKSPC,PSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupQueryDrivesInDiskSpaceListW(HDSKSPC,PWSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupQueryFileLogA(HSPFILELOG,PCSTR,PCSTR,SetupFileLogInfo,PSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupQueryFileLogW(HSPFILELOG,PCWSTR,PCWSTR,SetupFileLogInfo,PWSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupQueryInfFileInformationA(PSP_INF_INFORMATION,UINT,PSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupQueryInfFileInformationW(PSP_INF_INFORMATION,UINT,PWSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupQueryInfOriginalFileInformationA(PSP_INF_INFORMATION,UINT,PSP_ALTPLATFORM_INFO,PSP_ORIGINAL_FILE_INFO_A); +WINSETUPAPI BOOL WINAPI SetupQueryInfOriginalFileInformationW(PSP_INF_INFORMATION,UINT,PSP_ALTPLATFORM_INFO,PSP_ORIGINAL_FILE_INFO_W); +WINSETUPAPI BOOL WINAPI SetupQueryInfVersionInformationA(PSP_INF_INFORMATION,UINT,PSTR,PSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupQueryInfVersionInformationW(PSP_INF_INFORMATION,UINT,PCWSTR,PWSTR,DWORD,PDWORD); +WINSETUPAPI BOOL WINAPI SetupQuerySpaceRequiredOnDriveA(HDSKSPC,PCSTR,LONGLONG*,PVOID,UINT); +WINSETUPAPI BOOL WINAPI SetupQuerySpaceRequiredOnDriveW(HDSKSPC,PCWSTR,LONGLONG*,PVOID,UINT); +WINSETUPAPI BOOL WINAPI SetupQueueCopyA(HSPFILEQ,PCSTR,PCSTR,PCSTR,PCSTR,PCSTR,PCSTR,PCSTR,DWORD); +WINSETUPAPI BOOL WINAPI SetupQueueCopyW(HSPFILEQ,PCWSTR,PCWSTR,PCWSTR,PCWSTR,PCWSTR,PCWSTR,PCWSTR,DWORD); +WINSETUPAPI BOOL WINAPI SetupQueueCopyIndirectA(PSP_FILE_COPY_PARAMS_A); +WINSETUPAPI BOOL WINAPI SetupQueueCopyIndirectW(PSP_FILE_COPY_PARAMS_W); +WINSETUPAPI BOOL WINAPI SetupQueueCopySectionA(HSPFILEQ,PCSTR,HINF,HINF,PCSTR,DWORD); +WINSETUPAPI BOOL WINAPI SetupQueueCopySectionW(HSPFILEQ,PCWSTR,HINF,HINF,PCWSTR,DWORD); +WINSETUPAPI BOOL WINAPI SetupQueueDefaultCopyA(HSPFILEQ,HINF,PCSTR,PCSTR,PCSTR,DWORD); +WINSETUPAPI BOOL WINAPI SetupQueueDefaultCopyW(HSPFILEQ,HINF,PCWSTR,PCWSTR,PCWSTR,DWORD); +WINSETUPAPI BOOL WINAPI SetupQueueDeleteA(HSPFILEQ,PCSTR,PCSTR); +WINSETUPAPI BOOL WINAPI SetupQueueDeleteW(HSPFILEQ,PCWSTR,PCWSTR); +WINSETUPAPI BOOL WINAPI SetupQueueDeleteSectionA(HSPFILEQ,HINF,HINF,PCSTR); +WINSETUPAPI BOOL WINAPI SetupQueueDeleteSectionW(HSPFILEQ,HINF,HINF,PCWSTR); +WINSETUPAPI BOOL WINAPI SetupQueueRenameA(HSPFILEQ,PCSTR,PCSTR,PCSTR,PCSTR); +WINSETUPAPI BOOL WINAPI SetupQueueRenameW(HSPFILEQ,PCWSTR,PCWSTR,PCWSTR,PCWSTR); +WINSETUPAPI BOOL WINAPI SetupQueueRenameSectionA(HSPFILEQ,HINF,HINF,PCSTR); +WINSETUPAPI BOOL WINAPI SetupQueueRenameSectionW(HSPFILEQ,HINF,HINF,PCWSTR); +WINSETUPAPI BOOL WINAPI SetupRemoveFileLogEntryA(HSPFILELOG,PCSTR,PCSTR); +WINSETUPAPI BOOL WINAPI SetupRemoveFileLogEntryW(HSPFILELOG,PCWSTR,PCWSTR); +WINSETUPAPI BOOL WINAPI SetupRemoveFromDiskSpaceListA(HDSKSPC,PCSTR,UINT,PVOID,UINT); +WINSETUPAPI BOOL WINAPI SetupRemoveFromDiskSpaceListW(HDSKSPC,PCWSTR,UINT,PVOID,UINT); +WINSETUPAPI BOOL WINAPI SetupRemoveFromSourceListA(DWORD,PCSTR); +WINSETUPAPI BOOL WINAPI SetupRemoveFromSourceListW(DWORD,PCWSTR); +WINSETUPAPI BOOL WINAPI SetupRemoveInstallSectionFromDiskSpaceListA(HDSKSPC,HINF,HINF,PCSTR,PVOID,UINT); +WINSETUPAPI BOOL WINAPI SetupRemoveInstallSectionFromDiskSpaceListW(HDSKSPC,HINF,HINF,PCWSTR,PVOID,UINT); +WINSETUPAPI BOOL WINAPI SetupRemoveSectionFromDiskSpaceListA(HDSKSPC,HINF,HINF,PCSTR,UINT,PVOID,UINT); +WINSETUPAPI BOOL WINAPI SetupRemoveSectionFromDiskSpaceListW(HDSKSPC,HINF,HINF,PCWSTR,UINT,PVOID,UINT); +WINSETUPAPI UINT WINAPI SetupRenameErrorA(HWND,PCSTR,PCSTR,PCSTR,UINT,DWORD); +WINSETUPAPI UINT WINAPI SetupRenameErrorW(HWND,PCWSTR,PCWSTR,PCWSTR,UINT,DWORD); +WINSETUPAPI BOOL WINAPI SetupScanFileQueueA(HSPFILEQ,DWORD,HWND,PSP_FILE_CALLBACK_A,PVOID,PDWORD); +WINSETUPAPI BOOL WINAPI SetupScanFileQueueW(HSPFILEQ,DWORD,HWND,PSP_FILE_CALLBACK_W,PVOID,PDWORD); +WINSETUPAPI BOOL WINAPI SetupSetDirectoryIdA(HINF,DWORD,PCSTR); +WINSETUPAPI BOOL WINAPI SetupSetDirectoryIdW(HINF,DWORD,PCWSTR); +WINSETUPAPI BOOL WINAPI SetupSetDirectoryIdExA(HINF,DWORD,PCSTR,DWORD,DWORD,PVOID); +WINSETUPAPI BOOL WINAPI SetupSetDirectoryIdExW(HINF,DWORD,PCWSTR,DWORD,DWORD,PVOID); +WINSETUPAPI BOOL WINAPI SetupSetFileQueueAlternatePlatformA(HSPFILEQ,PSP_ALTPLATFORM_INFO,PCSTR); +WINSETUPAPI BOOL WINAPI SetupSetFileQueueAlternatePlatformW(HSPFILEQ,PSP_ALTPLATFORM_INFO,PCWSTR); +WINSETUPAPI BOOL WINAPI SetupSetPlatformPathOverrideA(PCSTR); +WINSETUPAPI BOOL WINAPI SetupSetPlatformPathOverrideW(PCWSTR); +WINSETUPAPI BOOL WINAPI SetupSetSourceListA(DWORD,PCSTR*,UINT); +WINSETUPAPI BOOL WINAPI SetupSetSourceListW(DWORD,PCWSTR*,UINT); +WINSETUPAPI VOID WINAPI SetupTermDefaultQueueCallback(PVOID); +WINSETUPAPI BOOL WINAPI SetupTerminateFileLog(HSPFILELOG); + +/* for backward compatability */ +#define SetupDiCreateInterfaceDeviceW SetupDiCreateDeviceInterfaceW +#define SetupDiCreateInterfaceDeviceRegKeyW SetupDiCreateDeviceInterfaceRegKeyW +#define SetupDiOpenInterfaceDeviceW SetupDiOpenDeviceInterfaceW +#define SetupDiGetInterfaceDeviceDetailW SetupDiGetDeviceInterfaceDetailW +#define SetupDiCreateInterfaceDeviceA SetupDiCreateDeviceInterfaceA +#define SetupDiCreateInterfaceDeviceRegKeyA SetupDiCreateDeviceInterfaceRegKeyA +#define SetupDiOpenInterfaceDeviceA SetupDiOpenDeviceInterfaceA +#define SetupDiGetInterfaceDeviceDetailA SetupDiGetDeviceInterfaceDetailA + +#ifdef UNICODE +#define PSP_FILE_CALLBACK PSP_FILE_CALLBACK_W +#define SetupAddInstallSectionToDiskSpaceList SetupAddInstallSectionToDiskSpaceListW +#define SetupAddSectionToDiskSpaceList SetupAddSectionToDiskSpaceListW +#define SetupAddToDiskSpaceList SetupAddToDiskSpaceListW +#define SetupAddToSourceList SetupAddToSourceListW +#define SetupAdjustDiskSpaceList SetupAdjustDiskSpaceListW +#define SetupBackupError SetupBackupErrorW +#define SetupCommitFileQueue SetupCommitFileQueueW +#define SetupCopyError SetupCopyErrorW +#define SetupCopyOEMInf SetupCopyOEMInfW +#define SetupCreateDiskSpaceList SetupCreateDiskSpaceListW +#define SetupDecompressOrCopyFile SetupDecompressOrCopyFileW +#define SetupDefaultQueueCallback SetupDefaultQueueCallbackW +#define SetupDeleteError SetupDeleteErrorW +#define SetupDiBuildClassInfoListEx SetupDiBuildClassInfoListExW +#define SetupDiClassGuidsFromNameEx SetupDiClassGuidsFromNameExW +#define SetupDiClassGuidsFromName SetupDiClassGuidsFromNameW +#define SetupDiClassNameFromGuidEx SetupDiClassNameFromGuidExW +#define SetupDiClassNameFromGuid SetupDiClassNameFromGuidW +#define SetupDiCreateDeviceInfoListEx SetupDiCreateDeviceInfoListExW +#define SetupDiCreateDeviceInfo SetupDiCreateDeviceInfoW +#define SetupDiCreateDeviceInterfaceRegKey SetupDiCreateDeviceInterfaceRegKeyW +#define SetupDiCreateInterfaceDeviceRegKey SetupDiCreateDeviceInterfaceRegKeyW +#define SetupDiCreateDeviceInterface SetupDiCreateDeviceInterfaceW +#define SetupDiCreateInterfaceDevice SetupDiCreateDeviceInterfaceW +#define SetupDiCreateDevRegKey SetupDiCreateDevRegKeyW +#define SetupDiEnumDriverInfo SetupDiEnumDriverInfoW +#define SetupDiGetActualSectionToInstall SetupDiGetActualSectionToInstallW +#define SetupDiGetClassDescriptionEx SetupDiGetClassDescriptionExW +#define SetupDiGetClassDescription SetupDiGetClassDescriptionW +#define SetupDiGetClassDevPropertySheets SetupDiGetClassDevPropertySheetsW +#define SetupDiGetClassDevsEx SetupDiGetClassDevsExW +#define SetupDiGetClassDevs SetupDiGetClassDevsW +#define SetupDiGetClassImageListEx SetupDiGetClassImageListExW +#define SetupDiGetClassInstallParams SetupDiGetClassInstallParamsW +#define SetupDiGetClassRegistryProperty SetupDiGetClassRegistryPropertyW +#define SetupDiGetDeviceInfoListDetail SetupDiGetDeviceInfoListDetailW +#define SetupDiGetDeviceInstallParams SetupDiGetDeviceInstallParamsW +#define SetupDiGetDeviceInstanceId SetupDiGetDeviceInstanceIdW +#define SetupDiGetDeviceInterfaceDetail SetupDiGetDeviceInterfaceDetailW +#define SetupDiGetInterfaceDeviceDetail SetupDiGetDeviceInterfaceDetailW +#define SetupDiGetDeviceRegistryProperty SetupDiGetDeviceRegistryPropertyW +#define SetupDiGetDriverInfoDetail SetupDiGetDriverInfoDetailW +#define SetupDiGetDriverInstallParams SetupDiGetDriverInstallParamsW +#define SetupDiGetHwProfileFriendlyNameEx SetupDiGetHwProfileFriendlyNameExW +#define SetupDiGetHwProfileFriendlyName SetupDiGetHwProfileFriendlyNameW +#define SetupDiGetHwProfileListEx SetupDiGetHwProfileListExW +#define SetupDiGetINFClass SetupDiGetINFClassW +#define SetupDiGetSelectedDriver SetupDiGetSelectedDriverW +#define SetupDiInstallClassEx SetupDiInstallClassExW +#define SetupDiInstallClass SetupDiInstallClassW +#define SetupDiOpenClassRegKeyEx SetupDiOpenClassRegKeyExW +#define SetupDiOpenDeviceInfo SetupDiOpenDeviceInfoW +#define SetupDiOpenDeviceInterface SetupDiOpenDeviceInterfaceW +#define SetupDiOpenInterfaceDevice SetupDiOpenDeviceInterfaceW +#define SetupDiSetClassInstallParams SetupDiSetClassInstallParamsW +#define SetupDiSetClassRegistryProperty SetupDiSetClassRegistryPropertyW +#define SetupDiSetDeviceInstallParams SetupDiSetDeviceInstallParamsW +#define SetupDiSetDeviceRegistryProperty SetupDiSetDeviceRegistryPropertyW +#define SetupDiSetDriverInstallParams SetupDiSetDriverInstallParamsW +#define SetupDiSetSelectedDriver SetupDiSetSelectedDriverW +#define SetupDuplicateDiskSpaceList SetupDuplicateDiskSpaceListW +#define SetupFindFirstLine SetupFindFirstLineW +#define SetupFindNextMatchLine SetupFindNextMatchLineW +#define SetupFreeSourceList SetupFreeSourceListW +#define SetupGetBackupInformation SetupGetBackupInformationW +#define SetupGetFileCompressionInfo SetupGetFileCompressionInfoW +#define SetupGetInfFileList SetupGetInfFileListW +#define SetupGetInfInformation SetupGetInfInformationW +#define SetupGetLineByIndex SetupGetLineByIndexW +#define SetupGetLineCount SetupGetLineCountW +#define SetupGetLineText SetupGetLineTextW +#define SetupGetMultiSzField SetupGetMultiSzFieldW +#define SetupGetSourceFileLocation SetupGetSourceFileLocationW +#define SetupGetSourceFileSize SetupGetSourceFileSizeW +#define SetupGetSourceInfo SetupGetSourceInfoW +#define SetupGetStringField SetupGetStringFieldW +#define SetupGetTargetPath SetupGetTargetPathW +#define SetupInitializeFileLog SetupInitializeFileLogW +#define SetupInstallFileEx SetupInstallFileExW +#define SetupInstallFilesFromInfSection SetupInstallFilesFromInfSectionW +#define SetupInstallFile SetupInstallFileW +#define SetupInstallFromInfSection SetupInstallFromInfSectionW +#define SetupInstallServicesFromInfSectionEx SetupInstallServicesFromInfSectionExW +#define SetupInstallServicesFromInfSection SetupInstallServicesFromInfSectionW +#define SetupIterateCabinet SetupIterateCabinetW +#define SetupLogError SetupLogErrorW +#define SetupLogFile SetupLogFileW +#define SetupOpenAppendInfFile SetupOpenAppendInfFileW +#define SetupOpenInfFile SetupOpenInfFileW +#define SetupPromptForDisk SetupPromptForDiskW +#define SetupQueryDrivesInDiskSpaceList SetupQueryDrivesInDiskSpaceListW +#define SetupQueryFileLog SetupQueryFileLogW +#define SetupQueryInfFileInformation SetupQueryInfFileInformationW +#define SetupQueryInfOriginalFileInformation SetupQueryInfOriginalFileInformationW +#define SetupQueryInfVersionInformation SetupQueryInfVersionInformationW +#define SetupQuerySourceList SetupQuerySourceListW +#define SetupQuerySpaceRequiredOnDrive SetupQuerySpaceRequiredOnDriveW +#define SetupQueueCopyIndirect SetupQueueCopyIndirectW +#define SetupQueueCopySection SetupQueueCopySectionW +#define SetupQueueCopy SetupQueueCopyW +#define SetupQueueDefaultCopy SetupQueueDefaultCopyW +#define SetupQueueDeleteSection SetupQueueDeleteSectionW +#define SetupQueueDelete SetupQueueDeleteW +#define SetupQueueRenameSection SetupQueueRenameSectionW +#define SetupQueueRename SetupQueueRenameW +#define SetupRemoveFileLogEntry SetupRemoveFileLogEntryW +#define SetupRemoveFromDiskSpaceList SetupRemoveFromDiskSpaceListW +#define SetupRemoveFromSourceList SetupRemoveFromSourceListW +#define SetupRemoveInstallSectionFromDiskSpaceList SetupRemoveInstallSectionFromDiskSpaceListW +#define SetupRemoveSectionFromDiskSpaceList SetupRemoveSectionFromDiskSpaceListW +#define SetupRenameError SetupRenameErrorW +#define SetupScanFileQueue SetupScanFileQueueW +#define SetupSetDirectoryIdEx SetupSetDirectoryIdExW +#define SetupSetDirectoryId SetupSetDirectoryIdW +#define SetupSetFileQueueAlternatePlatform SetupSetFileQueueAlternatePlatformW +#define SetupSetPlatformPathOverride SetupSetPlatformPathOverrideW +#define SetupSetSourceList SetupSetSourceListW +#else +#define PSP_FILE_CALLBACK PSP_FILE_CALLBACK_A +#define SetupAddInstallSectionToDiskSpaceList SetupAddInstallSectionToDiskSpaceListA +#define SetupAddSectionToDiskSpaceList SetupAddSectionToDiskSpaceListA +#define SetupAddToDiskSpaceList SetupAddToDiskSpaceListA +#define SetupAddToSourceList SetupAddToSourceListA +#define SetupAdjustDiskSpaceList SetupAdjustDiskSpaceListA +#define SetupBackupError SetupBackupErrorA +#define SetupCommitFileQueue SetupCommitFileQueueA +#define SetupCopyError SetupCopyErrorA +#define SetupCopyOEMInf SetupCopyOEMInfA +#define SetupCreateDiskSpaceList SetupCreateDiskSpaceListA +#define SetupDecompressOrCopyFile SetupDecompressOrCopyFileA +#define SetupDefaultQueueCallback SetupDefaultQueueCallbackA +#define SetupDeleteError SetupDeleteErrorA +#define SetupDiBuildClassInfoListEx SetupDiBuildClassInfoListExA +#define SetupDiClassGuidsFromName SetupDiClassGuidsFromNameA +#define SetupDiClassGuidsFromNameEx SetupDiClassGuidsFromNameExA +#define SetupDiClassNameFromGuid SetupDiClassNameFromGuidA +#define SetupDiClassNameFromGuidEx SetupDiClassNameFromGuidExA +#define SetupDiCreateDeviceInfo SetupDiCreateDeviceInfoA +#define SetupDiCreateDeviceInfoListEx SetupDiCreateDeviceInfoListExA +#define SetupDiCreateDeviceInterface SetupDiCreateDeviceInterfaceA +#define SetupDiCreateInterfaceDevice SetupDiCreateDeviceInterfaceA +#define SetupDiCreateDeviceInterfaceRegKey SetupDiCreateDeviceInterfaceRegKeyA +#define SetupDiCreateInterfaceDeviceRegKey SetupDiCreateDeviceInterfaceRegKeyA +#define SetupDiCreateDevRegKey SetupDiCreateDevRegKeyA +#define SetupDiDeleteInterfaceDeviceData SetupDiDeleteDeviceInterfaceData +#define SetupDiEnumDriverInfo SetupDiEnumDriverInfoA +#define SetupDiGetActualSectionToInstall SetupDiGetActualSectionToInstallA +#define SetupDiGetClassDescription SetupDiGetClassDescriptionA +#define SetupDiGetClassDescriptionEx SetupDiGetClassDescriptionExA +#define SetupDiGetClassDevPropertySheets SetupDiGetClassDevPropertySheetsA +#define SetupDiGetClassDevs SetupDiGetClassDevsA +#define SetupDiGetClassDevsEx SetupDiGetClassDevsExA +#define SetupDiGetClassImageListEx SetupDiGetClassImageListExA +#define SetupDiGetClassInstallParams SetupDiGetClassInstallParamsA +#define SetupDiGetClassRegistryProperty SetupDiGetClassRegistryPropertyA +#define SetupDiGetDeviceInfoListDetail SetupDiGetDeviceInfoListDetailA +#define SetupDiGetDeviceInstallParams SetupDiGetDeviceInstallParamsA +#define SetupDiGetDeviceInstanceId SetupDiGetDeviceInstanceIdA +#define SetupDiGetDeviceInterfaceDetail SetupDiGetDeviceInterfaceDetailA +#define SetupDiGetInterfaceDeviceDetail SetupDiGetDeviceInterfaceDetailA +#define SetupDiGetDeviceRegistryProperty SetupDiGetDeviceRegistryPropertyA +#define SetupDiGetDriverInfoDetail SetupDiGetDriverInfoDetailA +#define SetupDiGetDriverInstallParams SetupDiGetDriverInstallParamsA +#define SetupDiGetHwProfileFriendlyName SetupDiGetHwProfileFriendlyNameA +#define SetupDiGetHwProfileFriendlyNameEx SetupDiGetHwProfileFriendlyNameExA +#define SetupDiGetHwProfileListEx SetupDiGetHwProfileListExA +#define SetupDiGetINFClass SetupDiGetINFClassA +#define SetupDiGetSelectedDriver SetupDiGetSelectedDriverA +#define SetupDiInstallClass SetupDiInstallClassA +#define SetupDiInstallClassEx SetupDiInstallClassExA +#define SetupDiOpenClassRegKeyEx SetupDiOpenClassRegKeyExA +#define SetupDiOpenDeviceInfo SetupDiOpenDeviceInfoA +#define SetupDiOpenDeviceInterface SetupDiOpenDeviceInterfaceA +#define SetupDiOpenInterfaceDevice SetupDiOpenDeviceInterfaceA +#define SetupDiSetClassInstallParams SetupDiSetClassInstallParamsA +#define SetupDiSetClassRegistryProperty SetupDiSetClassRegistryPropertyA +#define SetupDiSetDeviceInstallParams SetupDiSetDeviceInstallParamsA +#define SetupDiSetDeviceRegistryProperty SetupDiSetDeviceRegistryPropertyA +#define SetupDiSetDriverInstallParams SetupDiSetDriverInstallParamsA +#define SetupDiSetSelectedDriver SetupDiSetSelectedDriverA +#define SetupDuplicateDiskSpaceList SetupDuplicateDiskSpaceListA +#define SetupFindFirstLine SetupFindFirstLineA +#define SetupFindNextMatchLine SetupFindNextMatchLineA +#define SetupFreeSourceList SetupFreeSourceListA +#define SetupGetBackupInformation SetupGetBackupInformationA +#define SetupGetFileCompressionInfo SetupGetFileCompressionInfoA +#define SetupGetInfFileList SetupGetInfFileListA +#define SetupGetInfInformation SetupGetInfInformationA +#define SetupGetLineByIndex SetupGetLineByIndexA +#define SetupGetLineCount SetupGetLineCountA +#define SetupGetLineText SetupGetLineTextA +#define SetupGetMultiSzField SetupGetMultiSzFieldA +#define SetupGetSourceFileLocation SetupGetSourceFileLocationA +#define SetupGetSourceFileSize SetupGetSourceFileSizeA +#define SetupGetSourceInfo SetupGetSourceInfoA +#define SetupGetStringField SetupGetStringFieldA +#define SetupGetTargetPath SetupGetTargetPathA +#define SetupInitializeFileLog SetupInitializeFileLogA +#define SetupInstallFile SetupInstallFileA +#define SetupInstallFileEx SetupInstallFileExA +#define SetupInstallFilesFromInfSection SetupInstallFilesFromInfSectionA +#define SetupInstallFromInfSection SetupInstallFromInfSectionA +#define SetupInstallServicesFromInfSection SetupInstallServicesFromInfSectionA +#define SetupInstallServicesFromInfSectionEx SetupInstallServicesFromInfSectionExA +#define SetupIterateCabinet SetupIterateCabinetA +#define SetupLogError SetupLogErrorA +#define SetupLogFile SetupLogFileA +#define SetupOpenAppendInfFile SetupOpenAppendInfFileA +#define SetupOpenInfFile SetupOpenInfFileA +#define SetupPromptForDisk SetupPromptForDiskA +#define SetupQueryDrivesInDiskSpaceList SetupQueryDrivesInDiskSpaceListA +#define SetupQueryFileLog SetupQueryFileLogA +#define SetupQueryInfFileInformation SetupQueryInfFileInformationA +#define SetupQueryInfOriginalFileInformation SetupQueryInfOriginalFileInformationA +#define SetupQueryInfVersionInformation SetupQueryInfVersionInformationA +#define SetupQuerySourceList SetupQuerySourceListA +#define SetupQuerySpaceRequiredOnDrive SetupQuerySpaceRequiredOnDriveA +#define SetupQueueCopy SetupQueueCopyA +#define SetupQueueCopyIndirect SetupQueueCopyIndirectA +#define SetupQueueCopySection SetupQueueCopySectionA +#define SetupQueueDefaultCopy SetupQueueDefaultCopyA +#define SetupQueueDelete SetupQueueDeleteA +#define SetupQueueDeleteSection SetupQueueDeleteSectionA +#define SetupQueueRename SetupQueueRenameA +#define SetupQueueRenameSection SetupQueueRenameSectionA +#define SetupRemoveFileLogEntry SetupRemoveFileLogEntryA +#define SetupRemoveFromDiskSpaceList SetupRemoveFromDiskSpaceListA +#define SetupRemoveFromSourceList SetupRemoveFromSourceListA +#define SetupRemoveInstallSectionFromDiskSpaceList SetupRemoveInstallSectionFromDiskSpaceListA +#define SetupRemoveSectionFromDiskSpaceList SetupRemoveSectionFromDiskSpaceListA +#define SetupRenameError SetupRenameErrorA +#define SetupScanFileQueue SetupScanFileQueueA +#define SetupSetDirectoryId SetupSetDirectoryIdA +#define SetupSetDirectoryIdEx SetupSetDirectoryIdExA +#define SetupSetFileQueueAlternatePlatform SetupSetFileQueueAlternatePlatformA +#define SetupSetPlatformPathOverride SetupSetPlatformPathOverrideA +#define SetupSetSourceList SetupSetSourceListA +#endif /* UNICODE */ + +#endif /* RC_INVOKED */ + +#ifdef __cplusplus +} +#endif + +#include <poppack.h> +#endif /* _SETUPAPI_H_ */ + diff --git a/reactos/w32api/include/shellapi.h b/reactos/w32api/include/shellapi.h new file mode 100644 index 00000000000..0a583077caf --- /dev/null +++ b/reactos/w32api/include/shellapi.h @@ -0,0 +1,282 @@ +#ifndef _SHELLAPI_H +#define _SHELLAPI_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define WINSHELLAPI DECLSPEC_IMPORT +#define ABE_LEFT 0 +#define ABE_TOP 1 +#define ABE_RIGHT 2 +#define ABE_BOTTOM 3 +#define ABS_AUTOHIDE 1 +#define ABS_ALWAYSONTOP 2 +#define SEE_MASK_CLASSNAME 1 +#define SEE_MASK_CLASSKEY 3 +#define SEE_MASK_IDLIST 4 +#define SEE_MASK_INVOKEIDLIST 12 +#define SEE_MASK_ICON 0x10 +#define SEE_MASK_HOTKEY 0x20 +#define SEE_MASK_NOCLOSEPROCESS 0x40 +#define SEE_MASK_CONNECTNETDRV 0x80 +#define SEE_MASK_FLAG_DDEWAIT 0x100 +#define SEE_MASK_DOENVSUBST 0x200 +#define SEE_MASK_FLAG_NO_UI 0x400 +#define SEE_MASK_NO_CONSOLE 0x8000 +#define SEE_MASK_UNICODE 0x10000 +#define SEE_MASK_ASYNCOK 0x100000 +#define SEE_MASK_HMONITOR 0x200000 +#define ABM_NEW 0 +#define ABM_REMOVE 1 +#define ABM_QUERYPOS 2 +#define ABM_SETPOS 3 +#define ABM_GETSTATE 4 +#define ABM_GETTASKBARPOS 5 +#define ABM_ACTIVATE 6 +#define ABM_GETAUTOHIDEBAR 7 +#define ABM_SETAUTOHIDEBAR 8 +#define ABM_WINDOWPOSCHANGED 9 +#define ABN_STATECHANGE 0 +#define ABN_POSCHANGED 1 +#define ABN_FULLSCREENAPP 2 +#define ABN_WINDOWARRANGE 3 +#define NIM_ADD 0 +#define NIM_MODIFY 1 +#define NIM_DELETE 2 +#define NIF_MESSAGE 1 +#define NIF_ICON 2 +#define NIF_TIP 4 +#define SE_ERR_FNF 2 +#define SE_ERR_PNF 3 +#define SE_ERR_ACCESSDENIED 5 +#define SE_ERR_OOM 8 +#define SE_ERR_DLLNOTFOUND 32 +#define SE_ERR_SHARE 26 +#define SE_ERR_ASSOCINCOMPLETE 27 +#define SE_ERR_DDETIMEOUT 28 +#define SE_ERR_DDEFAIL 29 +#define SE_ERR_DDEBUSY 30 +#define SE_ERR_NOASSOC 31 +#define FO_MOVE 1 +#define FO_COPY 2 +#define FO_DELETE 3 +#define FO_RENAME 4 +#define FOF_MULTIDESTFILES 1 +#define FOF_CONFIRMMOUSE 2 +#define FOF_SILENT 4 +#define FOF_RENAMEONCOLLISION 8 +#define FOF_NOCONFIRMATION 16 +#define FOF_WANTMAPPINGHANDLE 32 +#define FOF_ALLOWUNDO 64 +#define FOF_FILESONLY 128 +#define FOF_SIMPLEPROGRESS 256 +#define FOF_NOCONFIRMMKDIR 512 +#define FOF_NOERRORUI 1024 +#define FOF_NOCOPYSECURITYATTRIBS 2048 +#define PO_DELETE 19 +#define PO_RENAME 20 +#define PO_PORTCHANGE 32 +#define PO_REN_PORT 52 +#define SHGFI_ICON 256 +#define SHGFI_DISPLAYNAME 512 +#define SHGFI_TYPENAME 1024 +#define SHGFI_ATTRIBUTES 2048 +#define SHGFI_ICONLOCATION 4096 +#define SHGFI_EXETYPE 8192 +#define SHGFI_SYSICONINDEX 16384 +#define SHGFI_LINKOVERLAY 32768 +#define SHGFI_SELECTED 65536 +#define SHGFI_ATTR_SPECIFIED 131072 +#define SHGFI_LARGEICON 0 +#define SHGFI_SMALLICON 1 +#define SHGFI_OPENICON 2 +#define SHGFI_SHELLICONSIZE 4 +#define SHGFI_PIDL 8 +#define SHGFI_USEFILEATTRIBUTES 16 +#define SHERB_NOCONFIRMATION 1 +#define SHERB_NOPROGRESSUI 2 +#define SHERB_NOSOUND 4 + +typedef WORD FILEOP_FLAGS; +typedef WORD PRINTEROP_FLAGS; +#include <pshpack2.h> +typedef struct _AppBarData { + DWORD cbSize; + HWND hWnd; + UINT uCallbackMessage; + UINT uEdge; + RECT rc; + LPARAM lParam; +} APPBARDATA,*PAPPBARDATA; +DECLARE_HANDLE(HDROP); +typedef struct _NOTIFYICONDATAA { + DWORD cbSize; + HWND hWnd; + UINT uID; + UINT uFlags; + UINT uCallbackMessage; + HICON hIcon; + CHAR szTip[64]; +} NOTIFYICONDATAA,*PNOTIFYICONDATAA; +typedef struct _NOTIFYICONDATAW { + DWORD cbSize; + HWND hWnd; + UINT uID; + UINT uFlags; + UINT uCallbackMessage; + HICON hIcon; + WCHAR szTip[64]; +} NOTIFYICONDATAW,*PNOTIFYICONDATAW; +typedef struct _SHELLEXECUTEINFOA { + DWORD cbSize; + ULONG fMask; + HWND hwnd; + LPCSTR lpVerb; + LPCSTR lpFile; + LPCSTR lpParameters; + LPCSTR lpDirectory; + int nShow; + HINSTANCE hInstApp; + PVOID lpIDList; + LPCSTR lpClass; + HKEY hkeyClass; + DWORD dwHotKey; + HANDLE hIcon; + HANDLE hProcess; +} SHELLEXECUTEINFOA,*LPSHELLEXECUTEINFOA; +typedef struct _SHELLEXECUTEINFOW { + DWORD cbSize; + ULONG fMask; + HWND hwnd; + LPCWSTR lpVerb; + LPCWSTR lpFile; + LPCWSTR lpParameters; + LPCWSTR lpDirectory; + int nShow; + HINSTANCE hInstApp; + PVOID lpIDList; + LPCWSTR lpClass; + HKEY hkeyClass; + DWORD dwHotKey; + HANDLE hIcon; + HANDLE hProcess; +} SHELLEXECUTEINFOW,*LPSHELLEXECUTEINFOW; +typedef struct _SHFILEOPSTRUCTA { + HWND hwnd; + UINT wFunc; + LPCSTR pFrom; + LPCSTR pTo; + FILEOP_FLAGS fFlags; + BOOL fAnyOperationsAborted; + PVOID hNameMappings; + LPCSTR lpszProgressTitle; +} SHFILEOPSTRUCTA,*LPSHFILEOPSTRUCTA; +typedef struct _SHFILEOPSTRUCTW { + HWND hwnd; + UINT wFunc; + LPCWSTR pFrom; + LPCWSTR pTo; + FILEOP_FLAGS fFlags; + BOOL fAnyOperationsAborted; + PVOID hNameMappings; + LPCWSTR lpszProgressTitle; +} SHFILEOPSTRUCTW,*LPSHFILEOPSTRUCTW; +typedef struct _SHFILEINFOA { + HICON hIcon; + int iIcon; + DWORD dwAttributes; + CHAR szDisplayName[MAX_PATH]; + CHAR szTypeName[80]; +} SHFILEINFOA; +typedef struct _SHFILEINFOW { + HICON hIcon; + int iIcon; + DWORD dwAttributes; + WCHAR szDisplayName[MAX_PATH]; + WCHAR szTypeName[80]; +} SHFILEINFOW; +typedef struct _SHQUERYRBINFO { + DWORD cbSize; + __int64 i64Size; + __int64 i64NumItems; +} SHQUERYRBINFO, *LPSHQUERYRBINFO; +#include <poppack.h> + +LPWSTR * WINAPI CommandLineToArgvW(LPCWSTR,int*); +void WINAPI DragAcceptFiles(HWND,BOOL); +void WINAPI DragFinish(HDROP); +UINT WINAPI DragQueryFileA(HDROP,UINT,LPSTR,UINT); +UINT WINAPI DragQueryFileW(HDROP,UINT,LPWSTR,UINT); +BOOL WINAPI DragQueryPoint(HDROP,LPPOINT); +HICON WINAPI ExtractAssociatedIconA(HINSTANCE,LPCSTR,PWORD); +HICON WINAPI ExtractAssociatedIconW(HINSTANCE,LPCWSTR,PWORD); +HICON WINAPI ExtractIconA(HINSTANCE,LPCSTR,UINT); +HICON WINAPI ExtractIconW(HINSTANCE,LPCWSTR,UINT); +UINT WINAPI ExtractIconExA(LPCSTR,int,HICON*,HICON*,UINT); +UINT WINAPI ExtractIconExW(LPCWSTR,int,HICON*,HICON*,UINT); +HINSTANCE WINAPI FindExecutableA(LPCSTR,LPCSTR,LPSTR); +HINSTANCE WINAPI FindExecutableW(LPCWSTR,LPCWSTR,LPWSTR); +UINT WINAPI SHAppBarMessage(DWORD,PAPPBARDATA); +BOOL WINAPI Shell_NotifyIconA(DWORD,PNOTIFYICONDATAA); +BOOL WINAPI Shell_NotifyIconW(DWORD,PNOTIFYICONDATAW); +int WINAPI ShellAboutA(HWND,LPCSTR,LPCSTR,HICON); +int WINAPI ShellAboutW(HWND,LPCWSTR,LPCWSTR,HICON); +HINSTANCE WINAPI ShellExecuteA(HWND,LPCSTR,LPCSTR,LPCSTR,LPCSTR,INT); +HINSTANCE WINAPI ShellExecuteW(HWND,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR,INT); +BOOL WINAPI ShellExecuteExA(LPSHELLEXECUTEINFOA); +BOOL WINAPI ShellExecuteExW(LPSHELLEXECUTEINFOW); +int WINAPI SHFileOperationA(LPSHFILEOPSTRUCTA); +int WINAPI SHFileOperationW(LPSHFILEOPSTRUCTW); +void WINAPI SHFreeNameMappings(HANDLE); +DWORD WINAPI SHGetFileInfoA(LPCSTR,DWORD,SHFILEINFOA*,UINT,UINT); +DWORD WINAPI SHGetFileInfoW(LPCWSTR,DWORD,SHFILEINFOW*,UINT,UINT); +HRESULT WINAPI SHQueryRecycleBinA(LPCSTR, LPSHQUERYRBINFO); +HRESULT WINAPI SHQueryRecycleBinW(LPCWSTR, LPSHQUERYRBINFO); +HRESULT WINAPI SHEmptyRecycleBinA(HWND,LPCSTR,DWORD); +HRESULT WINAPI SHEmptyRecycleBinW(HWND,LPCWSTR,DWORD); + +#ifdef UNICODE +typedef NOTIFYICONDATAW NOTIFYICONDATA,*PNOTIFYICONDATA; +typedef SHELLEXECUTEINFOW SHELLEXECUTEINFO,*LPSHELLEXECUTEINFO; +typedef SHFILEOPSTRUCTW SHFILEOPSTRUCT,*LPSHFILEOPSTRUCT; +typedef SHFILEINFOW SHFILEINFO; +#define DragQueryFile DragQueryFileW +#define ExtractAssociatedIcon ExtractAssociatedIconW +#define ExtractIcon ExtractIconW +#define ExtractIconEx ExtractIconExW +#define FindExecutable FindExecutableW +#define Shell_NotifyIcon Shell_NotifyIconW +#define ShellAbout ShellAboutW +#define ShellExecute ShellExecuteW +#define ShellExecuteEx ShellExecuteExW +#define SHFileOperation SHFileOperationW +#define SHGetFileInfo SHGetFileInfoW +#define SHQueryRecycleBin SHQueryRecycleBinW +#define SHEmptyRecycleBin SHEmptyRecycleBinW + +#else +typedef NOTIFYICONDATAA NOTIFYICONDATA,*PNOTIFYICONDATA; +typedef SHELLEXECUTEINFOA SHELLEXECUTEINFO,*LPSHELLEXECUTEINFO; +typedef SHFILEOPSTRUCTA SHFILEOPSTRUCT,*LPSHFILEOPSTRUCT; +typedef SHFILEINFOA SHFILEINFO; +#define DragQueryFile DragQueryFileA +#define ExtractAssociatedIcon ExtractAssociatedIconA +#define ExtractIcon ExtractIconA +#define ExtractIconEx ExtractIconExA +#define FindExecutable FindExecutableA +#define Shell_NotifyIcon Shell_NotifyIconA +#define ShellAbout ShellAboutA +#define ShellExecute ShellExecuteA +#define ShellExecuteEx ShellExecuteExA +#define SHFileOperation SHFileOperationA +#define SHGetFileInfo SHGetFileInfoA +#define SHQueryRecycleBin SHQueryRecycleBinA +#define SHEmptyRecycleBin SHEmptyRecycleBinA +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/shlguid.h b/reactos/w32api/include/shlguid.h new file mode 100644 index 00000000000..5bbc7af414e --- /dev/null +++ b/reactos/w32api/include/shlguid.h @@ -0,0 +1,94 @@ +#ifndef _SHLGUID_H +#define _SHLGUID_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +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_ShellDesktop; +extern const GUID CLSID_ShellLink; +extern const GUID FMTID_Intshcut; +extern const GUID FMTID_InternetSite; +extern const GUID CGID_Explorer; +extern const GUID CGID_ShellDocView; +extern const GUID CGID_ShellServiceObject; +extern const GUID IID_INewShortcutHookA; +extern const GUID IID_IShellBrowser; +extern const GUID IID_IShellView; +extern const GUID IID_IContextMenu; +extern const GUID IID_IColumnProvider; +extern const GUID IID_IQueryInfo; +extern const GUID IID_IShellIcon; +extern const GUID IID_IShellIconOverlayIdentifier; +extern const GUID IID_IShellFolder; +extern const GUID IID_IShellExtInit; +extern const GUID IID_IShellPropSheetExt; +extern const GUID IID_IPersistFolder; +extern const GUID IID_IExtractIconA; +extern const GUID IID_IShellLinkA; +extern const GUID IID_IShellCopyHookA; +extern const GUID IID_IFileViewerA; +extern const GUID IID_ICommDlgBrowser; +extern const GUID IID_IEnumIDList; +extern const GUID IID_IFileViewerSite; +extern const GUID IID_IContextMenu2; +extern const GUID IID_IShellExecuteHookA; +extern const GUID IID_IPropSheetPage; +extern const GUID IID_INewShortcutHookW; +extern const GUID IID_IFileViewerW; +extern const GUID IID_IShellLinkW; +extern const GUID IID_IExtractIconW; +extern const GUID IID_IShellExecuteHookW; +extern const GUID IID_IShellCopyHookW; +extern const GUID IID_IShellView2; +extern const GUID LIBID_SHDocVw; +extern const GUID IID_IShellExplorer; +extern const GUID DIID_DShellExplorerEvents; +extern const GUID CLSID_ShellExplorer; +extern const GUID IID_ISHItemOC; +extern const GUID DIID_DSHItemOCEvents; +extern const GUID CLSID_SHItemOC; +extern const GUID IID_DHyperLink; +extern const GUID IID_DIExplorer; +extern const GUID DIID_DExplorerEvents; +extern const GUID CLSID_InternetExplorer; +extern const GUID CLSID_StdHyperLink; +extern const GUID CLSID_FileTypes; +extern const GUID CLSID_InternetShortcut; +extern const GUID IID_IUniformResourceLocator; +extern const GUID CLSID_DragDropHelper; +extern const GUID IID_IDropTargetHelper; +extern const GUID IID_IDragSourceHelper; +#if (_WIN32_IE >= 0x400 || _WIN32_WINNT >= 0x500) +extern const GUID IID_IPersistFolder2; +#endif +#if (_WIN32_WINNT >= 0x500) +extern const GUID IID_IPersistFolder3; +extern const GUID IID_IShellFolder2; +extern const GUID IID_IFileSystemBindData; +#endif +#ifdef UNICODE +#define IID_IFileViewer IID_IFileViewerW +#define IID_IShellLink IID_IShellLinkW +#define IID_IExtractIcon IID_IExtractIconW +#define IID_IShellCopyHook IID_IShellCopyHookW +#define IID_IShellExecuteHook IID_IShellExecuteHookW +#define IID_INewShortcutHook IID_INewShortcutHookW +#else +#define IID_IFileViewer IID_IFileViewerA +#define IID_IShellLink IID_IShellLinkA +#define IID_IExtractIcon IID_IExtractIconA +#define IID_IShellCopyHook IID_IShellCopyHookA +#define IID_IShellExecuteHook IID_IShellExecuteHookA +#define IID_INewShortcutHook IID_INewShortcutHookA +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/reactos/w32api/include/shlobj.h b/reactos/w32api/include/shlobj.h new file mode 100644 index 00000000000..2243bd4dcef --- /dev/null +++ b/reactos/w32api/include/shlobj.h @@ -0,0 +1,1440 @@ +#ifndef _SHLOBJ_H +#define _SHLOBJ_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#include <ole2.h> +#include <shlguid.h> +#include <shellapi.h> +#pragma pack(push,1) +#include <commctrl.h> + +#define BIF_RETURNONLYFSDIRS 1 +#define BIF_DONTGOBELOWDOMAIN 2 +#define BIF_STATUSTEXT 4 +#define BIF_RETURNFSANCESTORS 8 +#define BIF_EDITBOX 16 +#define BIF_VALIDATE 32 +#define BIF_NEWDIALOGSTYLE 64 +#define BIF_BROWSEINCLUDEURLS 128 +#define BIF_USENEWUI ( BIF_EDITBOX | BIF_NEWDIALOGSTYLE ) +#define BIF_BROWSEFORCOMPUTER 0x1000 +#define BIF_BROWSEFORPRINTER 0x2000 +#define BIF_BROWSEINCLUDEFILES 0x4000 +#define BIF_SHAREABLE 0x8000 +#define BFFM_INITIALIZED 1 +#define BFFM_SELCHANGED 2 +#define BFFM_VALIDATEFAILEDA 3 +#define BFFM_VALIDATEFAILEDW 4 +#define BFFM_SETSTATUSTEXTA (WM_USER + 100) +#define BFFM_SETSTATUSTEXTW (WM_USER + 104) +#define BFFM_ENABLEOK (WM_USER + 101) +#define BFFM_SETSELECTIONA (WM_USER + 102) +#define BFFM_SETSELECTIONW (WM_USER + 103) +#define BFFM_SETOKTEXT (WM_USER + 105) +#define BFFM_SETEXPANDED (WM_USER + 106) +#ifdef UNICODE +#define BFFM_SETSTATUSTEXT BFFM_SETSTATUSTEXTW +#define BFFM_SETSELECTION BFFM_SETSELECTIONW +#define BFFM_VALIDATEFAILED BFFM_VALIDATEFAILEDW +#else +#define BFFM_SETSTATUSTEXT BFFM_SETSTATUSTEXTA +#define BFFM_SETSELECTION BFFM_SETSELECTIONA +#define BFFM_VALIDATEFAILED BFFM_VALIDATEFAILEDA +#endif +#define DVASPECT_SHORTNAME 2 +#define SHARD_PIDL 1 +#define SHARD_PATH 2 +#define SHCNE_RENAMEITEM 1 +#define SHCNE_CREATE 2 +#define SHCNE_DELETE 4 +#define SHCNE_MKDIR 8 +#define SHCNE_RMDIR 16 +#define SHCNE_MEDIAINSERTED 32 +#define SHCNE_MEDIAREMOVED 64 +#define SHCNE_DRIVEREMOVED 128 +#define SHCNE_DRIVEADD 256 +#define SHCNE_NETSHARE 512 +#define SHCNE_NETUNSHARE 1024 +#define SHCNE_ATTRIBUTES 2048 +#define SHCNE_UPDATEDIR 4096 +#define SHCNE_UPDATEITEM 8192 +#define SHCNE_SERVERDISCONNECT 16384 +#define SHCNE_UPDATEIMAGE 32768 +#define SHCNE_DRIVEADDGUI 65536 +#define SHCNE_RENAMEFOLDER 0x20000 +#define SHCNE_FREESPACE 0x40000 +#define SHCNE_ASSOCCHANGED 0x8000000 +#define SHCNE_DISKEVENTS 0x2381F +#define SHCNE_GLOBALEVENTS 0xC0581E0 +#define SHCNE_ALLEVENTS 0x7FFFFFFF +#define SHCNE_INTERRUPT 0x80000000 +#define SHCNF_IDLIST 0 +#define SHCNF_PATHA 1 +#define SHCNF_PRINTERA 2 +#define SHCNF_DWORD 3 +#define SHCNF_PATHW 5 +#define SHCNF_PRINTERW 6 +#define SHCNF_TYPE 0xFF +#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 +#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_GHOSTED 0x00008000L +#define SFGAO_LINK 0x00010000L +#define SFGAO_SHARE 0x00020000L +#define SFGAO_READONLY 0x00040000L +#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 STRRET_WSTR 0 +#define STRRET_OFFSET 1 +#define STRRET_CSTR 2 +#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 +#ifndef REGSTR_PATH_EXPLORER +#define REGSTR_PATH_EXPLORER TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer") +#endif +#define REGSTR_PATH_SPECIAL_FOLDERS REGSTR_PATH_EXPLORER TEXT("\\Shell Folders") +#define CSIDL_DESKTOP 0 +#define CSIDL_INTERNET 1 +#define CSIDL_PROGRAMS 2 +#define CSIDL_CONTROLS 3 +#define CSIDL_PRINTERS 4 +#define CSIDL_PERSONAL 5 +#define CSIDL_FAVORITES 6 +#define CSIDL_STARTUP 7 +#define CSIDL_RECENT 8 +#define CSIDL_SENDTO 9 +#define CSIDL_BITBUCKET 10 +#define CSIDL_STARTMENU 11 +#define CSIDL_DESKTOPDIRECTORY 16 +#define CSIDL_DRIVES 17 +#define CSIDL_NETWORK 18 +#define CSIDL_NETHOOD 19 +#define CSIDL_FONTS 20 +#define CSIDL_TEMPLATES 21 +#define CSIDL_COMMON_STARTMENU 22 +#define CSIDL_COMMON_PROGRAMS 23 +#define CSIDL_COMMON_STARTUP 24 +#define CSIDL_COMMON_DESKTOPDIRECTORY 25 +#define CSIDL_APPDATA 26 +#define CSIDL_PRINTHOOD 27 +#define CSIDL_LOCAL_APPDATA 28 +#define CSIDL_ALTSTARTUP 29 +#define CSIDL_COMMON_ALTSTARTUP 30 +#define CSIDL_COMMON_FAVORITES 31 +#define CSIDL_INTERNET_CACHE 32 +#define CSIDL_COOKIES 33 +#define CSIDL_HISTORY 34 +#define CSIDL_COMMON_APPDATA 35 +#define CSIDL_WINDOWS 36 +#define CSIDL_SYSTEM 37 +#define CSIDL_PROGRAM_FILES 38 +#define CSIDL_MYPICTURES 39 +#define CSIDL_PROFILE 40 +#define CSIDL_SYSTEMX86 41 +#define CSIDL_PROGRAM_FILESX86 42 +#define CSIDL_PROGRAM_FILES_COMMON 43 +#define CSIDL_PROGRAM_FILES_COMMONX86 44 +#define CSIDL_COMMON_TEMPLATES 45 +#define CSIDL_COMMON_DOCUMENTS 46 +#define CSIDL_COMMON_ADMINTOOLS 47 +#define CSIDL_ADMINTOOLS 48 +#define CSIDL_CONNECTIONS 49 +#define CSIDL_COMMON_MUSIC 53 +#define CSIDL_COMMON_PICTURES 54 +#define CSIDL_COMMON_VIDEO 55 +#define CSIDL_RESOURCES 56 +#define CSIDL_RESOURCES_LOCALIZED 57 +#define CSIDL_COMMON_OEM_LINKS 58 +#define CSIDL_CDBURN_AREA 59 +#define CSIDL_COMPUTERSNEARME 61 +#define CSIDL_FLAG_DONT_VERIFY 0x4000 +#define CSIDL_FLAG_CREATE 0x8000 +#define CSIDL_FLAG_MASK 0xFF00 +#define CFSTR_SHELLIDLIST TEXT("Shell IDList Array") +#define CFSTR_SHELLIDLISTOFFSET TEXT("Shell Object Offsets") +#define CFSTR_NETRESOURCES TEXT("Net Resource") +#define CFSTR_FILECONTENTS TEXT("FileContents") +#define CFSTR_FILENAMEA TEXT("FileName") +#define CFSTR_FILENAMEMAPA TEXT("FileNameMap") +#define CFSTR_FILEDESCRIPTORA TEXT("FileGroupDescriptor") +#define CFSTR_INETURLA TEXT("UniformResourceLocator") +#define CFSTR_SHELLURL CFSTR_INETURLA +#define CFSTR_FILENAMEW TEXT("FileNameW") +#define CFSTR_FILENAMEMAPW TEXT("FileNameMapW") +#define CFSTR_FILEDESCRIPTORW TEXT("FileGroupDescriptorW") +#define CFSTR_INETURLW TEXT("UniformResourceLocatorW") +#ifdef UNICODE +#define CFSTR_FILENAME CFSTR_FILENAMEW +#define CFSTR_FILENAMEMAP CFSTR_FILENAMEMAPW +#define CFSTR_FILEDESCRIPTOR CFSTR_FILEDESCRIPTORW +#define CFSTR_INETURL CFSTR_INETURLW +#else +#define CFSTR_FILENAME CFSTR_FILENAMEA +#define CFSTR_FILENAMEMAP CFSTR_FILENAMEMAPA +#define CFSTR_FILEDESCRIPTOR CFSTR_FILEDESCRIPTORA +#define CFSTR_INETURL CFSTR_INETURLA +#endif +#define CFSTR_PRINTERGROUP TEXT("PrinterFriendlyName") +#define CFSTR_INDRAGLOOP TEXT("InShellDragLoop") +#define CFSTR_PASTESUCCEEDED TEXT("Paste Succeeded") +#define CFSTR_PERFORMEDDROPEFFECT TEXT("Performed DropEffect") +#define CFSTR_PREFERREDDROPEFFECT TEXT("Preferred DropEffect") +#define CMF_NORMAL 0 +#define CMF_DEFAULTONLY 1 +#define CMF_VERBSONLY 2 +#define CMF_EXPLORE 4 +#define CMF_NOVERBS 8 +#define CMF_CANRENAME 16 +#define CMF_NODEFAULT 32 +#define CMF_INCLUDESTATIC 64 +#define CMF_RESERVED 0xffff0000 +#define GCS_VERBA 0 +#define GCS_HELPTEXTA 1 +#define GCS_VALIDATEA 2 +#define GCS_VERBW 4 +#define GCS_HELPTEXTW 5 +#define GCS_VALIDATEW 6 +#define GCS_UNICODE 4 +#ifdef UNICODE +#define GCS_VERB GCS_VERBW +#define GCS_HELPTEXT GCS_HELPTEXTW +#define GCS_VALIDATE GCS_VALIDATEW +#else +#define GCS_VERB GCS_VERBA +#define GCS_HELPTEXT GCS_HELPTEXTA +#define GCS_VALIDATE GCS_VALIDATEA +#endif +#define CMDSTR_NEWFOLDERA "NewFolder" +#define CMDSTR_VIEWLISTA "ViewList" +#define CMDSTR_VIEWDETAILSA "ViewDetails" +#define CMDSTR_NEWFOLDERW L"NewFolder" +#define CMDSTR_VIEWLISTW L"ViewList" +#define CMDSTR_VIEWDETAILSW L"ViewDetails" +#ifdef UNICODE +#define CMDSTR_NEWFOLDER CMDSTR_NEWFOLDERW +#define CMDSTR_VIEWLIST CMDSTR_VIEWLISTW +#define CMDSTR_VIEWDETAILS CMDSTR_VIEWDETAILSW +#else +#define CMDSTR_NEWFOLDER CMDSTR_NEWFOLDER +#define CMDSTR_VIEWLIST CMDSTR_VIEWLIST +#define CMDSTR_VIEWDETAILS CMDSTR_VIEWDETAILS +#endif +#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_MODAL 0x80000000 +#define CMIC_VALID_SEE_FLAGS SEE_VALID_CMIC_FLAGS +#define GIL_OPENICON 1 +#define GIL_FORSHELL 2 +#define GIL_SIMULATEDOC 1 +#define GIL_PERINSTANCE 2 +#define GIL_PERCLASS 4 +#define GIL_NOTFILENAME 8 +#define GIL_DONTCACHE 16 +#define FVSIF_RECT 1 +#define FVSIF_PINNED 2 +#define FVSIF_NEWFAILED 0x8000000 +#define FVSIF_NEWFILE 0x80000000 +#define FVSIF_CANVIEWIT 0x40000000 +#define CDBOSC_SETFOCUS 0 +#define CDBOSC_KILLFOCUS 1 +#define CDBOSC_SELCHANGE 2 +#define CDBOSC_RENAME 3 +#define FCIDM_SHVIEWFIRST 0 +#define FCIDM_SHVIEWLAST 0x7fff +#define FCIDM_BROWSERFIRST 0xa000 +#define FCIDM_BROWSERLAST 0xbf00 +#define FCIDM_GLOBALFIRST 0x8000 +#define FCIDM_GLOBALLAST 0x9fff +#define FCIDM_MENU_FILE FCIDM_GLOBALFIRST +#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) +#define FCIDM_TOOLBAR FCIDM_BROWSERFIRST +#define FCIDM_STATUS (FCIDM_BROWSERFIRST+1) +#define SBSP_DEFBROWSER 0 +#define SBSP_SAMEBROWSER 1 +#define SBSP_NEWBROWSER 2 +#define SBSP_DEFMODE 0 +#define SBSP_OPENMODE 16 +#define SBSP_EXPLOREMODE 32 +#define SBSP_ABSOLUTE 0 +#define SBSP_RELATIVE 0x1000 +#define SBSP_PARENT 0x2000 +#define SBSP_INITIATEDBYHLINKFRAME 0x80000000 +#define SBSP_REDIRECT 0x40000000 +#define FCW_STATUS 1 +#define FCW_TOOLBAR 2 +#define FCW_TREE 3 +#define FCT_MERGE 1 +#define FCT_CONFIGABLE 2 +#define FCT_ADDTOEND 4 +#define SVSI_DESELECT 0 +#define SVSI_SELECT 1 +#define SVSI_EDIT 3 +#define SVSI_DESELECTOTHERS 4 +#define SVSI_ENSUREVISIBLE 8 +#define SVSI_FOCUSED 16 +#define SVGIO_BACKGROUND 0 +#define SVGIO_SELECTION 1 +#define SVGIO_ALLVIEW 2 +#define SV2GV_CURRENTVIEW ((UINT)-1) +#define SV2GV_DEFAULTVIEW ((UINT)-2) + +typedef ULONG SFGAOF; +typedef DWORD SHGDNF; + +typedef struct _IDA { + UINT cidl; + UINT aoffset[1]; +} CIDA,*LPIDA; +typedef struct _SHITEMID { + USHORT cb; + BYTE abID[1]; +} SHITEMID, * LPSHITEMID; +typedef const SHITEMID *LPCSHITEMID; +typedef struct _ITEMIDLIST { + SHITEMID mkid; +} ITEMIDLIST,*LPITEMIDLIST; +typedef const ITEMIDLIST *LPCITEMIDLIST; +typedef int (CALLBACK* BFFCALLBACK)(HWND,UINT,LPARAM,LPARAM); +typedef struct _browseinfoA { + HWND hwndOwner; + LPCITEMIDLIST pidlRoot; + LPSTR pszDisplayName; + LPCSTR lpszTitle; + UINT ulFlags; + BFFCALLBACK lpfn; + LPARAM lParam; + int iImage; +} BROWSEINFOA,*PBROWSEINFOA,*LPBROWSEINFOA; +typedef struct _browseinfoW { + HWND hwndOwner; + LPCITEMIDLIST pidlRoot; + LPWSTR pszDisplayName; + LPCWSTR lpszTitle; + UINT ulFlags; + BFFCALLBACK lpfn; + LPARAM lParam; + int iImage; +} BROWSEINFOW,*PBROWSEINFOW,*LPBROWSEINFOW; +typedef struct _CMInvokeCommandInfo { + DWORD cbSize; + DWORD fMask; + HWND hwnd; + LPCSTR lpVerb; + LPCSTR lpParameters; + LPCSTR lpDirectory; + int nShow; + DWORD dwHotKey; + HANDLE hIcon; +} CMINVOKECOMMANDINFO,*LPCMINVOKECOMMANDINFO; +typedef struct _DROPFILES { + DWORD pFiles; + POINT pt; + BOOL fNC; + BOOL fWide; +} DROPFILES,*LPDROPFILES; +typedef enum tagSHGDN { + SHGDN_NORMAL=0, + SHGDN_INFOLDER, + SHGDN_FOREDITING=0x1000, + SHGDN_INCLUDE_NONFILESYS=0x2000, + SHGDN_FORADDRESSBAR=0x4000, + SHGDN_FORPARSING=0x8000 +} SHGNO; +typedef 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 +} SHCONTF; +typedef struct _STRRET { + UINT uType; + _ANONYMOUS_UNION union { + LPWSTR pOleStr; + UINT uOffset; + char cStr[MAX_PATH]; + } DUMMYUNIONNAME; +} STRRET,*LPSTRRET; +typedef enum { + FD_CLSID=1,FD_SIZEPOINT=2,FD_ATTRIBUTES=4,FD_CREATETIME=8,FD_ACCESSTIME=16, + FD_WRITESTIME=32,FD_FILESIZE=64,FD_LINKUI=0x8000 +} FD_FLAGS; +typedef struct _FILEDESCRIPTOR { + DWORD dwFlags; + CLSID clsid; + SIZEL sizel; + POINTL pointl; + DWORD dwFileAttributes; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; + DWORD nFileSizeHigh; + DWORD nFileSizeLow; + CHAR cFileName[MAX_PATH]; +} FILEDESCRIPTOR,*LPFILEDESCRIPTOR; +typedef struct _FILEGROUPDESCRIPTOR { + UINT cItems; + FILEDESCRIPTOR fgd[1]; +} FILEGROUPDESCRIPTOR,*LPFILEGROUPDESCRIPTOR; +typedef enum { + SLR_NO_UI=1, + SLR_ANY_MATCH=2, + SLR_UPDATE=4, + SLR_NOUPDATE=8, + SLR_NOSEARCH=16, + SLR_NOTRACK=32, + SLR_NOLINKINFO=64, + SLR_INVOKE_MSI=128 +} SLR_FLAGS; +typedef enum { + SLGP_SHORTPATH=1, + SLGP_UNCPRIORITY +} SLGP_FLAGS; +typedef PBYTE LPVIEWSETTINGS; +typedef enum { + FWF_AUTOARRANGE=1,FWF_ABBREVIATEDNAMES=2,FWF_SNAPTOGRID=4,FWF_OWNERDATA=8, + FWF_BESTFITWINDOW=16,FWF_DESKTOP=32,FWF_SINGLESEL=64,FWF_NOSUBFOLDERS=128, + FWF_TRANSPARENT=256,FWF_NOCLIENTEDGE=512,FWF_NOSCROLL=0x400,FWF_ALIGNLEFT=0x800, + FWF_SINGLECLICKACTIVATE=0x8000 +} FOLDERFLAGS; +typedef enum { + FVM_ICON=1, + FVM_SMALLICON, + FVM_LIST, + FVM_DETAILS +} FOLDERVIEWMODE; +typedef struct { + UINT ViewMode; + UINT fFlags; +} FOLDERSETTINGS,*LPFOLDERSETTINGS; +typedef const FOLDERSETTINGS *LPCFOLDERSETTINGS; +typedef struct { + DWORD cbSize; + HWND hwndOwner; + int iShow; + DWORD dwFlags; + RECT rect; + LPUNKNOWN punkRel; + OLECHAR strNewFile[MAX_PATH]; +} FVSHOWINFO,*LPFVSHOWINFO; +typedef struct _NRESARRAY { + UINT cItems; + NETRESOURCE nr[1]; +} NRESARRAY, *LPNRESARRAY; +enum { SBSC_HIDE,SBSC_SHOW,SBSC_TOGGLE,SBSC_QUERY }; +enum { + SBCMDID_ENABLESHOWTREE,SBCMDID_SHOWCONTROL,SBCMDID_CANCELNAVIGATION, + SBCMDID_MAYSAVECHANGES,SBCMDID_SETHLINKFRAME,SBCMDID_ENABLESTOP,SBCMDID_OPTIONS +}; +typedef enum { + SVUIA_DEACTIVATE,SVUIA_ACTIVATE_NOFOCUS,SVUIA_ACTIVATE_FOCUS, + SVUIA_INPLACEACTIVATE +} SVUIA_STATUS; +#if (_WIN32_IE >= 0x0500) +typedef struct tagEXTRASEARCH +{ + GUID guidSearch; + WCHAR wszFriendlyName[80]; + WCHAR wszUrl[2084]; +} EXTRASEARCH, *LPEXTRASEARCH; +typedef DWORD SHCOLSTATEF; +typedef struct +{ + GUID fmtid; + DWORD pid; +} SHCOLUMNID, *LPSHCOLUMNID; +typedef const SHCOLUMNID *LPCSHCOLUMNID; +typedef struct _SHELLDETAILS +{ + int fmt; + int cxChar; + STRRET str; +} SHELLDETAILS, *LPSHELLDETAILS; +typedef struct +{ + LPITEMIDLIST pidlTargetFolder; + WCHAR szTargetParsingName[MAX_PATH]; + WCHAR szNetworkProvider[MAX_PATH]; + DWORD dwAttributes; + int csidl; +} PERSIST_FOLDER_TARGET_INFO; +#endif + +DECLARE_ENUMERATOR_(IEnumIDList,LPITEMIDLIST); +typedef IEnumIDList *LPENUMIDLIST; + +#ifdef COBJMACROS +#define IEnumIDList_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IEnumIDList_Release(T) (T)->lpVtbl->AddRef(T) +#define IEnumIDList_AddRef(T) (T)->lpVtbl->Release(T) +#define IEnumIDList_Next(T,a,b,c) (T)->lpVtbl->Next(T,a,b,c) +#define IEnumIDList_Skip(T,a) (T)->lpVtbl->Skip(T,a) +#define IEnumIDList_Reset(T) (T)->lpVtbl->Reset(T) +#define IEnumIDList_Clone(T,a) (T)->lpVtbl->Clone(T,a) +#endif + +#undef INTERFACE +#define INTERFACE IContextMenu +DECLARE_INTERFACE_(IContextMenu,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(QueryContextMenu)(THIS_ HMENU,UINT,UINT,UINT,UINT) PURE; + STDMETHOD(InvokeCommand)(THIS_ LPCMINVOKECOMMANDINFO) PURE; + STDMETHOD(GetCommandString)(THIS_ UINT,UINT,PUINT,LPSTR,UINT) PURE; +}; +typedef IContextMenu *LPCONTEXTMENU; + +#ifdef COBJMACROS +#define IContextMenu_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IContextMenu_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IContextMenu_Release(T) (T)->lpVtbl->Release(T) +#define IContextMenu_QueryContextMenu(T,a,b,c,d,e) (T)->lpVtbl->QueryContextMenu(T,a,b,c,d,e) +#define IContextMenu_InvokeCommand(T,a) (T)->lpVtbl->InvokeCommand(T,a) +#define IContextMenu_GetCommandString(T,a,b,c,d,e) (T)->lpVtbl->GetCommandString(T,a,b,c,d,e) +#endif + +#undef INTERFACE +#define INTERFACE IContextMenu2 +DECLARE_INTERFACE_(IContextMenu2,IContextMenu) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(QueryContextMenu)(THIS_ HMENU,UINT,UINT,UINT,UINT) PURE; + STDMETHOD(InvokeCommand)(THIS_ LPCMINVOKECOMMANDINFO) PURE; + STDMETHOD(GetCommandString)(THIS_ UINT,UINT,PUINT,LPSTR,UINT) PURE; + STDMETHOD(HandleMenuMsg)(THIS_ UINT,WPARAM,LPARAM) PURE; +}; +typedef IContextMenu2 *LPCONTEXTMENU2; + +#if (_WIN32_IE >= 0x0500) +#pragma pack(push,8) +typedef struct { + ULONG dwFlags; + ULONG dwReserved; + WCHAR wszFolder[MAX_PATH]; +} SHCOLUMNINIT,*LPSHCOLUMNINIT; +typedef const SHCOLUMNINIT* LPCSHCOLUMNINIT; +typedef struct { + ULONG dwFlags; + DWORD dwFileAttributes; + ULONG dwReserved; + WCHAR *pwszExt; + WCHAR wszFile[MAX_PATH]; +} SHCOLUMNDATA,*LPSHCOLUMNDATA; +typedef const SHCOLUMNDATA* LPCSHCOLUMNDATA; +#pragma pack(pop) + +#define MAX_COLUMN_NAME_LEN 80 +#define MAX_COLUMN_DESC_LEN 128 + +#pragma pack(push,1) +typedef struct { + SHCOLUMNID scid; + VARTYPE vt; + DWORD fmt; + UINT cChars; + DWORD csFlags; + WCHAR wszTitle[MAX_COLUMN_NAME_LEN]; + WCHAR wszDescription[MAX_COLUMN_DESC_LEN]; +} SHCOLUMNINFO,*LPSHCOLUMNINFO; +typedef const SHCOLUMNINFO* LPCSHCOLUMNINFO; +#pragma pack(pop) + +typedef enum { + SHCOLSTATE_TYPE_STR = 0x00000001, + SHCOLSTATE_TYPE_INT = 0x00000002, + SHCOLSTATE_TYPE_DATE = 0x00000003, + SHCOLSTATE_TYPEMASK = 0x0000000f, + SHCOLSTATE_ONBYDEFAULT = 0x00000010, + SHCOLSTATE_SLOW = 0x00000020, + SHCOLSTATE_EXTENDED = 0x00000040, + SHCOLSTATE_SECONDARYUI = 0x00000080, + SHCOLSTATE_HIDDEN = 0x00000100, + SHCOLSTATE_PREFER_VARCMP = 0x00000200 +} SHCOLSTATE; + +#ifdef COBJMACROS +#define IContextMenu2_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IContextMenu2_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IContextMenu2_Release(T) (T)->lpVtbl->Release(T) +#define IContextMenu2_QueryContextMenu(T,a,b,c,d,e) (T)->lpVtbl->QueryContextMenu(T,a,b,c,d,e) +#define IContextMenu2_InvokeCommand(T,a) (T)->lpVtbl->InvokeCommand(T,a) +#define IContextMenu2_GetCommandString(T,a,b,c,d,e) (T)->lpVtbl->GetCommandString(T,a,b,c,d,e) +#define IContextMenu2_HandleMenuMsg(T,a,b,c) (T)->lpVtbl->HandleMenuMsg(T,a,b,c) +#endif + +#undef INTERFACE +#define INTERFACE IColumnProvider +DECLARE_INTERFACE_(IColumnProvider,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Initialize)(THIS_ LPCSHCOLUMNINIT) PURE; + STDMETHOD(GetColumnInfo)(THIS_ DWORD,SHCOLUMNINFO*) PURE; + STDMETHOD(GetItemData)(THIS_ LPCSHCOLUMNID,LPCSHCOLUMNDATA,VARIANT*) PURE; +}; +#endif /* _WIN32_IE >= 0x0500 */ + +#undef INTERFACE +#define INTERFACE IQueryInfo +DECLARE_INTERFACE_(IQueryInfo,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetInfoTip)(THIS_ DWORD,WCHAR**) PURE; + STDMETHOD(GetInfoFlags)(THIS_ DWORD*) PURE; +}; + +#undef INTERFACE +#define INTERFACE IShellExtInit +DECLARE_INTERFACE_(IShellExtInit, IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Initialize)(THIS_ LPCITEMIDLIST,LPDATAOBJECT,HKEY) PURE; +}; +typedef IShellExtInit *LPSHELLEXTINIT; + +#undef INTERFACE +#define INTERFACE IShellPropSheetExt +DECLARE_INTERFACE_(IShellPropSheetExt, IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(AddPages)(THIS_ LPFNADDPROPSHEETPAGE,LPARAM) PURE; + STDMETHOD(ReplacePage)(THIS_ UINT,LPFNADDPROPSHEETPAGE,LPARAM) PURE; +}; +typedef IShellPropSheetExt *LPSHELLPROPSHEETEXT; + +#undef INTERFACE +#define INTERFACE IExtractIconA +DECLARE_INTERFACE_(IExtractIconA, IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetIconLocation)(THIS_ UINT,LPSTR,UINT,int*,PUINT) PURE; + STDMETHOD(Extract)(THIS_ LPCSTR,UINT,HICON*,HICON*,UINT) PURE; +}; +typedef IExtractIconA *LPEXTRACTICONA; + +#ifdef COBJMACROS +#define IExtractIconA_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IExtractIconA_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IExtractIconA_Release(T) (T)->lpVtbl->Release(T) +#define IExtractIconA_GetIconLocation(T,a,b,c,d,e) (T)->lpVtbl->GetIconLocation(T,a,b,c,d,e) +#define IExtractIconA_Extract(T,a,b,c,d,e) (T)->lpVtbl->Extract(T,a,b,c,d,e) +#endif + +#undef INTERFACE +#define INTERFACE IExtractIconW +DECLARE_INTERFACE_(IExtractIconW, IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetIconLocation)(THIS_ UINT,LPWSTR,UINT,int*,PUINT) PURE; + STDMETHOD(Extract)(THIS_ LPCWSTR,UINT,HICON*,HICON*,UINT) PURE; +}; +typedef IExtractIconW *LPEXTRACTICONW; + +#ifdef COBJMACROS +#define IExtractIconW_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IExtractIconW_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IExtractIconW_Release(T) (T)->lpVtbl->Release(T) +#define IExtractIconW_GetIconLocation(T,a,b,c,d,e) (T)->lpVtbl->GetIconLocation(T,a,b,c,d,e) +#define IExtractIconW_Extract(T,a,b,c,d,e) (T)->lpVtbl->Extract(T,a,b,c,d,e) +#endif + +#ifdef UNICODE +#define IExtractIcon IExtractIconW +#define LPEXTRACTICON LPEXTRACTICONW +#else +#define IExtractIcon IExtractIconA +#define LPEXTRACTICON LPEXTRACTICONA +#endif + +#undef INTERFACE +#define INTERFACE IShellLinkA +DECLARE_INTERFACE_(IShellLinkA, IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetPath)(THIS_ LPSTR,int,WIN32_FIND_DATAA*,DWORD) PURE; + STDMETHOD(GetIDList)(THIS_ LPITEMIDLIST*) PURE; + STDMETHOD(SetIDList)(THIS_ LPCITEMIDLIST) PURE; + STDMETHOD(GetDescription)(THIS_ LPSTR,int) PURE; + STDMETHOD(SetDescription)(THIS_ LPCSTR) PURE; + STDMETHOD(GetWorkingDirectory)(THIS_ LPSTR,int) PURE; + STDMETHOD(SetWorkingDirectory)(THIS_ LPCSTR) PURE; + STDMETHOD(GetArguments)(THIS_ LPSTR,int) PURE; + STDMETHOD(SetArguments)(THIS_ LPCSTR) PURE; + STDMETHOD(GetHotkey)(THIS_ PWORD) PURE; + STDMETHOD(SetHotkey)(THIS_ WORD) PURE; + STDMETHOD(GetShowCmd)(THIS_ int*) PURE; + STDMETHOD(SetShowCmd)(THIS_ int) PURE; + STDMETHOD(GetIconLocation)(THIS_ LPSTR,int,int*) PURE; + STDMETHOD(SetIconLocation)(THIS_ LPCSTR,int) PURE; + STDMETHOD(SetRelativePath)(THIS_ LPCSTR ,DWORD) PURE; + STDMETHOD(Resolve)(THIS_ HWND,DWORD) PURE; + STDMETHOD(SetPath)(THIS_ LPCSTR) PURE; +}; + +#ifdef COBJMACROS +#define IShellLinkA_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IShellLinkA_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IShellLinkA_Release(T) (T)->lpVtbl->Release(T) +#define IShellLinkA_GetPath(T,a,b,c,d) (T)->lpVtbl->GetPath(T,a,b,c,d) +#define IShellLinkA_GetIDList(T,a) (T)->lpVtbl->GetIDList(T,a) +#define IShellLinkA_SetIDList(T,a) (T)->lpVtbl->SetIDList(T,a) +#define IShellLinkA_GetDescription(T,a,b) (T)->lpVtbl->GetDescription(T,a,b) +#define IShellLinkA_SetDescription(T,a) (T)->lpVtbl->SetDescription(T,a) +#define IShellLinkA_GetWorkingDirectory(T,a,b) (T)->lpVtbl->GetWorkingDirectory(T,a,b) +#define IShellLinkA_SetWorkingDirectory(T,a) (T)->lpVtbl->SetWorkingDirectory(T,a) +#define IShellLinkA_GetArguments(T,a,b) (T)->lpVtbl->GetArguments(T,a,b) +#define IShellLinkA_SetArguments(T,a) (T)->lpVtbl->SetArguments(T,a) +#define IShellLinkA_GetHotkey(T,a) (T)->lpVtbl->GetHotkey(T,a) +#define IShellLinkA_SetHotkey(T,a) (T)->lpVtbl->SetHotkey(T,a) +#define IShellLinkA_GetShowCmd(T,a) (T)->lpVtbl->GetShowCmd(T,a) +#define IShellLinkA_SetShowCmd(T,a) (T)->lpVtbl->SetShowCmd(T,a) +#define IShellLinkA_GetIconLocation(T,a,b,c) (T)->lpVtbl->GetIconLocation(T,a,b,c) +#define IShellLinkA_SetIconLocation(T,a,b) (T)->lpVtbl->SetIconLocation(T,a,b) +#define IShellLinkA_SetRelativePath(T,a,b) (T)->lpVtbl->SetRelativePath(T,a,b) +#define IShellLinkA_Resolve(T,a,b) (T)->lpVtbl->Resolve(T,a,b) +#define IShellLinkA_SetPath(T,a) (T)->lpVtbl->SetPath(T,a) +#endif + +#undef INTERFACE +#define INTERFACE IShellLinkW +DECLARE_INTERFACE_(IShellLinkW, IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetPath)(THIS_ LPWSTR,int,WIN32_FIND_DATAW*,DWORD) PURE; + STDMETHOD(GetIDList)(THIS_ LPITEMIDLIST*) PURE; + STDMETHOD(SetIDList)(THIS_ LPCITEMIDLIST) PURE; + STDMETHOD(GetDescription)(THIS_ LPWSTR,int) PURE; + STDMETHOD(SetDescription)(THIS_ LPCWSTR) PURE; + STDMETHOD(GetWorkingDirectory)(THIS_ LPWSTR,int) PURE; + STDMETHOD(SetWorkingDirectory)(THIS_ LPCWSTR) PURE; + STDMETHOD(GetArguments)(THIS_ LPWSTR,int) PURE; + STDMETHOD(SetArguments)(THIS_ LPCWSTR) PURE; + STDMETHOD(GetHotkey)(THIS_ PWORD) PURE; + STDMETHOD(SetHotkey)(THIS_ WORD) PURE; + STDMETHOD(GetShowCmd)(THIS_ int*) PURE; + STDMETHOD(SetShowCmd)(THIS_ int) PURE; + STDMETHOD(GetIconLocation)(THIS_ LPWSTR,int,int*) PURE; + STDMETHOD(SetIconLocation)(THIS_ LPCWSTR,int) PURE; + STDMETHOD(SetRelativePath)(THIS_ LPCWSTR ,DWORD) PURE; + STDMETHOD(Resolve)(THIS_ HWND,DWORD) PURE; + STDMETHOD(SetPath)(THIS_ LPCWSTR) PURE; +}; + +#ifdef COBJMACROS +#define IShellLinkW_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IShellLinkW_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IShellLinkW_Release(T) (T)->lpVtbl->Release(T) +#define IShellLinkW_GetPath(T,a,b,c,d) (T)->lpVtbl->GetPath(T,a,b,c,d) +#define IShellLinkW_GetIDList(T,a) (T)->lpVtbl->GetIDList(T,a) +#define IShellLinkW_SetIDList(T,a) (T)->lpVtbl->SetIDList(T,a) +#define IShellLinkW_GetDescription(T,a,b) (T)->lpVtbl->GetDescription(T,a,b) +#define IShellLinkW_SetDescription(T,a) (T)->lpVtbl->SetDescription(T,a) +#define IShellLinkW_GetWorkingDirectory(T,a,b) (T)->lpVtbl->GetWorkingDirectory(T,a,b) +#define IShellLinkW_SetWorkingDirectory(T,a) (T)->lpVtbl->SetWorkingDirectory(T,a) +#define IShellLinkW_GetArguments(T,a,b) (T)->lpVtbl->GetArguments(T,a,b) +#define IShellLinkW_SetArguments(T,a) (T)->lpVtbl->SetArguments(T,a) +#define IShellLinkW_GetHotkey(T,a) (T)->lpVtbl->GetHotkey(T,a) +#define IShellLinkW_SetHotkey(T,a) (T)->lpVtbl->SetHotkey(T,a) +#define IShellLinkW_GetShowCmd(T,a) (T)->lpVtbl->GetShowCmd(T,a) +#define IShellLinkW_SetShowCmd(T,a) (T)->lpVtbl->SetShowCmd(T,a) +#define IShellLinkW_GetIconLocation(T,a,b,c) (T)->lpVtbl->GetIconLocation(T,a,b,c) +#define IShellLinkW_SetIconLocation(T,a,b) (T)->lpVtbl->SetIconLocation(T,a,b) +#define IShellLinkW_SetRelativePath(T,a,b) (T)->lpVtbl->SetRelativePath(T,a,b) +#define IShellLinkW_Resolve(T,a,b) (T)->lpVtbl->Resolve(T,a,b) +#define IShellLinkW_SetPath(T,a) (T)->lpVtbl->SetPath(T,a) +#endif + +#undef INTERFACE +#define INTERFACE IShellFolder +DECLARE_INTERFACE_(IShellFolder, IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(ParseDisplayName)(THIS_ HWND,LPBC,LPOLESTR,PULONG,LPITEMIDLIST*,PULONG) PURE; + STDMETHOD(EnumObjects)(THIS_ HWND,DWORD,LPENUMIDLIST*) PURE; + STDMETHOD(BindToObject)(THIS_ LPCITEMIDLIST,LPBC,REFIID,PVOID*) PURE; + STDMETHOD(BindToStorage)(THIS_ LPCITEMIDLIST,LPBC,REFIID,PVOID*) PURE; + STDMETHOD(CompareIDs)(THIS_ LPARAM,LPCITEMIDLIST,LPCITEMIDLIST) PURE; + STDMETHOD(CreateViewObject)(THIS_ HWND,REFIID,PVOID*) PURE; + STDMETHOD(GetAttributesOf)(THIS_ UINT,LPCITEMIDLIST*,PULONG) PURE; + STDMETHOD(GetUIObjectOf)(THIS_ HWND,UINT,LPCITEMIDLIST*,REFIID,PUINT,PVOID*) PURE; + STDMETHOD(GetDisplayNameOf)(THIS_ LPCITEMIDLIST,DWORD,LPSTRRET) PURE; + STDMETHOD(SetNameOf)(THIS_ HWND,LPCITEMIDLIST,LPCOLESTR,DWORD,LPITEMIDLIST*) PURE; +}; +typedef IShellFolder *LPSHELLFOLDER; + +#ifdef COBJMACROS +#define IShellFolder_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IShellFolder_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IShellFolder_Release(T) (T)->lpVtbl->Release(T) +#define IShellFolder_ParseDisplayName(T,a,b,c,d,e,f) (T)->lpVtbl->ParseDisplayName(T,a,b,c,d,e,f) +#define IShellFolder_EnumObjects(T,a,b,c) (T)->lpVtbl->EnumObjects(T,a,b,c) +#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_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) +#define IShellFolder_SetNameOf(T,a,b,c,d,e) (T)->lpVtbl->SetNameOf(T,a,b,c,d,e) +#endif + +#if (_WIN32_IE >= 0x0500) + +DECLARE_ENUMERATOR_(IEnumExtraSearch,LPEXTRASEARCH); +typedef IEnumExtraSearch *LPENUMEXTRASEARCH; + +#undef INTERFACE +#define INTERFACE IShellFolder2 +DECLARE_INTERFACE_(IShellFolder2, IShellFolder) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(ParseDisplayName)(THIS_ HWND,LPBC,LPOLESTR,PULONG,LPITEMIDLIST*,PULONG) PURE; + STDMETHOD(EnumObjects)(THIS_ HWND,DWORD,LPENUMIDLIST*) PURE; + STDMETHOD(BindToObject)(THIS_ LPCITEMIDLIST,LPBC,REFIID,PVOID*) PURE; + STDMETHOD(BindToStorage)(THIS_ LPCITEMIDLIST,LPBC,REFIID,PVOID*) PURE; + STDMETHOD(CompareIDs)(THIS_ LPARAM,LPCITEMIDLIST,LPCITEMIDLIST) PURE; + STDMETHOD(CreateViewObject)(THIS_ HWND,REFIID,PVOID*) PURE; + STDMETHOD(GetAttributesOf)(THIS_ UINT,LPCITEMIDLIST*,PULONG) PURE; + STDMETHOD(GetUIObjectOf)(THIS_ HWND,UINT,LPCITEMIDLIST*,REFIID,PUINT,PVOID*) PURE; + STDMETHOD(GetDisplayNameOf)(THIS_ LPCITEMIDLIST,DWORD,LPSTRRET) PURE; + STDMETHOD(SetNameOf)(THIS_ HWND,LPCITEMIDLIST,LPCOLESTR,DWORD,LPITEMIDLIST*) PURE; + STDMETHOD(GetDefaultSearchGUID)(THIS_ GUID*) PURE; + STDMETHOD(EnumSearches)(THIS_ IEnumExtraSearch**) PURE; + STDMETHOD(GetDefaultColumn)(THIS_ DWORD,ULONG*,ULONG*) PURE; + STDMETHOD(GetDefaultColumnState)(THIS_ UINT,SHCOLSTATEF*) PURE; + STDMETHOD(GetDetailsEx)(THIS_ LPCITEMIDLIST,const SHCOLUMNID*,VARIANT*) PURE; + STDMETHOD(GetDetailsOf)(THIS_ LPCITEMIDLIST,UINT,SHELLDETAILS*) PURE; + STDMETHOD(MapColumnToSCID)(THIS_ UINT,SHCOLUMNID*) PURE; +}; +typedef IShellFolder2 *LPSHELLFOLDER2; + +#ifdef COBJMACROS +#define IShellFolder2_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IShellFolder2_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IShellFolder2_Release(T) (T)->lpVtbl->Release(T) +#define IShellFolder2_ParseDisplayName(T,a,b,c,d,e,f) (T)->lpVtbl->ParseDisplayName(T,a,b,c,d,e,f) +#define IShellFolder2_EnumObjects(T,a,b,c) (T)->lpVtbl->EnumObjects(T,a,b,c) +#define IShellFolder2_BindToObject(T,a,b,c,d) (T)->lpVtbl->BindToObject(T,a,b,c,d) +#define IShellFolder2_BindToStorage(T,a,b,c,d) (T)->lpVtbl->BindToStorage(T,a,b,c,d) +#define IShellFolder2_CompareIDs(T,a,b,c) (T)->lpVtbl->CompareIDs(T,a,b,c) +#define IShellFolder2_CreateViewObject(T,a,b) (T)->lpVtbl->CreateViewObject(T,a,b) +#define IShellFolder2_GetAttributesOf(T,a,b,c) (T)->lpVtbl->GetAttributesOf(T,a,b,c) +#define IShellFolder2_GetUIObjectOf(T,a,b,c,d,e,f) (T)->lpVtbl->GetUIObjectOf(T,a,b,c,d,e,f) +#define IShellFolder2_GetDisplayNameOf(T,a,b,c) (T)->lpVtbl->GetDisplayNameOf(T,a,b,c) +#define IShellFolder2_SetNameOf(T,a,b,c,d,e) (T)->lpVtbl->SetNameOf(T,a,b,c,d,e) +#define IShellFolder2_GetDefaultSearchGUID(T,a) (T)->lpVtbl->GetDefaultSearchGUID(T,a) +#define IShellFolder2_EnumSearches(T,a) (T)->lpVtbl->EnumSearches(T,a) +#define IShellFolder2_GetDefaultColumn(T,a,b,c) (T)->lpVtbl->GetDefaultColumn(T,a,b,c) +#define IShellFolder2_GetDefaultColumnState(T,a,b) (T)->lpVtbl->GetDefaultColumnState(T,a,b) +#define IShellFolder2_GetDetailsEx(T,a,b,c) (T)->lpVtbl->GetDetailsEx(T,a,b,c) +#define IShellFolder2_GetDetailsOf(T,a,b,c) (T)->lpVtbl->GetDetailsOf(T,a,b,c) +#define IShellFolder2_MapColumnToSCID(T,a,b) (T)->lpVtbl->MapColumnToSCID(T,a,b) +#endif + +#endif /* _WIN32_IE >= 0x0500 */ +#undef INTERFACE +#define INTERFACE ICopyHook +DECLARE_INTERFACE_(ICopyHook, IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD_(UINT,CopyCallback)(THIS_ HWND,UINT,UINT,LPCSTR,DWORD,LPCSTR,DWORD) PURE; +}; +typedef ICopyHook *LPCOPYHOOK; + +#undef INTERFACE +#define INTERFACE IFileViewerSite +DECLARE_INTERFACE(IFileViewerSite) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(SetPinnedWindow)(THIS_ HWND) PURE; + STDMETHOD(GetPinnedWindow)(THIS_ HWND*) PURE; +}; +typedef IFileViewerSite *LPFILEVIEWERSITE; + +#undef INTERFACE +#define INTERFACE IFileViewer +DECLARE_INTERFACE(IFileViewer) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(ShowInitialize)(THIS_ LPFILEVIEWERSITE) PURE; + STDMETHOD(Show)(THIS_ LPFVSHOWINFO) PURE; + STDMETHOD(PrintTo)(THIS_ LPSTR,BOOL) PURE; +}; +typedef IFileViewer *LPFILEVIEWER; + +#undef INTERFACE +#define INTERFACE IFileSystemBindData +DECLARE_INTERFACE_(IFileSystemBindData, IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(SetFindData)(THIS_ const WIN32_FIND_DATAW*) PURE; + STDMETHOD(GetFindData)(THIS_ WIN32_FIND_DATAW*) PURE; +}; + +#undef INTERFACE +#define INTERFACE IPersistFolder +DECLARE_INTERFACE_(IPersistFolder,IPersist) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetClassID)(THIS_ CLSID*) PURE; + STDMETHOD(Initialize)(THIS_ LPCITEMIDLIST) PURE; +}; +typedef IPersistFolder *LPPERSISTFOLDER; + +#ifdef COBJMACROS +#define IPersistFolder_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IPersistFolder_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IPersistFolder_Release(T) (T)->lpVtbl->Release(T) +#define IPersistFolder_GetClassID(T,a) (T)->lpVtbl->GetClassID(T,a) +#define IPersistFolder_Initialize(T,a) (T)->lpVtbl->Initialize(T,a) +#endif + +#if (_WIN32_IE >= 0x0400 || _WIN32_WINNT >= 0x0500) + +#undef INTERFACE +#define INTERFACE IPersistFolder2 +DECLARE_INTERFACE_(IPersistFolder2,IPersistFolder) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetClassID)(THIS_ CLSID*) PURE; + STDMETHOD(Initialize)(THIS_ LPCITEMIDLIST) PURE; + STDMETHOD(GetCurFolder)(THIS_ LPITEMIDLIST*) PURE; +}; +typedef IPersistFolder2 *LPPERSISTFOLDER2; + +#ifdef COBJMACROS +#define IPersistFolder2_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IPersistFolder2_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IPersistFolder2_Release(T) (T)->lpVtbl->Release(T) +#define IPersistFolder2_GetClassID(T,a) (T)->lpVtbl->GetClassID(T,a) +#define IPersistFolder2_Initialize(T,a) (T)->lpVtbl->Initialize(T,a) +#define IPersistFolder2_GetCurFolder(T,a) (T)->lpVtbl->GetCurFolder(T,a) +#endif + +#endif /* _WIN32_IE >= 0x0400 || _WIN32_WINNT >= 0x0500 */ + +#if (_WIN32_IE >= 0x0500) + +#undef INTERFACE +#define INTERFACE IPersistFolder3 +DECLARE_INTERFACE_(IPersistFolder3,IPersistFolder2) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetClassID)(THIS_ CLSID*) PURE; + STDMETHOD(Initialize)(THIS_ LPCITEMIDLIST) PURE; + STDMETHOD(GetCurFolder)(THIS_ LPITEMIDLIST*) PURE; + STDMETHOD(InitializeEx)(THIS_ IBindCtx*,LPCITEMIDLIST,const PERSIST_FOLDER_TARGET_INFO*) PURE; + STDMETHOD(GetFolderTargetInfo)(THIS_ PERSIST_FOLDER_TARGET_INFO*) PURE; +}; +typedef IPersistFolder3 *LPPERSISTFOLDER3; + +#ifdef COBJMACROS +#define IPersistFolder3_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IPersistFolder3_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IPersistFolder3_Release(T) (T)->lpVtbl->Release(T) +#define IPersistFolder3_GetClassID(T,a) (T)->lpVtbl->GetClassID(T,a) +#define IPersistFolder3_Initialize(T,a) (T)->lpVtbl->Initialize(T,a) +#define IPersistFolder3_GetCurFolder(T,a) (T)->lpVtbl->GetCurFolder(T,a) +#define IPersistFolder3_InitializeEx(T,a,b,c) (T)->lpVtbl->InitializeEx(T,a,b,c) +#define IPersistFolder3_GetFolderTargetInfo(T,a) (T)->lpVtbl->GetFolderTargetInfo(T,a) +#endif + +#endif /* _WIN32_IE >= 0x0500 */ + +typedef interface IShellBrowser *LPSHELLBROWSER; +typedef interface IShellView *LPSHELLVIEW; + +#undef INTERFACE +#define INTERFACE IShellBrowser +DECLARE_INTERFACE_(IShellBrowser,IOleWindow) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetWindow)(THIS_ HWND*) PURE; + STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL) PURE; + STDMETHOD(InsertMenusSB)(THIS_ HMENU,LPOLEMENUGROUPWIDTHS) PURE; + STDMETHOD(SetMenuSB)(THIS_ HMENU,HOLEMENU,HWND) PURE; + STDMETHOD(RemoveMenusSB)(THIS_ HMENU) PURE; + STDMETHOD(SetStatusTextSB)(THIS_ LPCOLESTR) PURE; + STDMETHOD(EnableModelessSB)(THIS_ BOOL) PURE; + STDMETHOD(TranslateAcceleratorSB) (THIS_ LPMSG,WORD) PURE; + STDMETHOD(BrowseObject)(THIS_ LPCITEMIDLIST,UINT) PURE; + STDMETHOD(GetViewStateStream)(THIS_ DWORD,LPSTREAM*) PURE; + STDMETHOD(GetControlWindow)(THIS_ UINT,HWND*) PURE; + STDMETHOD(SendControlMsg)(THIS_ UINT,UINT,WPARAM,LPARAM,LRESULT*) PURE; + STDMETHOD(QueryActiveShellView)(THIS_ LPSHELLVIEW*) PURE; + STDMETHOD(OnViewWindowActive)(THIS_ LPSHELLVIEW) PURE; + STDMETHOD(SetToolbarItems)(THIS_ LPTBBUTTON,UINT,UINT) PURE; +}; + +#ifdef COBJMACROS +#define IShellBrowser_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IShellBrowser_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IShellBrowser_Release(T) (T)->lpVtbl->Release(T) +#define IShellBrowser_GetWindow(T,a) (T)->lpVtbl->GetWindow(T,a) +#define IShellBrowser_ContextSensitiveHelp(T,a) (T)->lpVtbl->ContextSensitiveHelp(T,a) +#define IShellBrowser_InsertMenusSB(T,a,b) (T)->lpVtbl->InsertMenusSB(T,a,b) +#define IShellBrowser_SetMenuSB(T,a,b,c) (T)->lpVtbl->SetMenuSB(T,a,b,c) +#define IShellBrowser_RemoveMenusSB(T,a) (T)->lpVtbl->RemoveMenusSB(T,a) +#define IShellBrowser_SetStatusTextSB(T,a) (T)->lpVtbl->SetStatusTextSB(T,a) +#define IShellBrowser_EnableModelessSB(T,a) (T)->lpVtbl->EnableModelessSB(T,a) +#define IShellBrowser_TranslateAcceleratorSB(T,a,b) (T)->lpVtbl->TranslateAcceleratorSB(T,a,b) +#define IShellBrowser_BrowseObject(T,a,b) (T)->lpVtbl->BrowseObject(T,a,b) +#define IShellBrowser_GetViewStateStream(T,a,b) (T)->lpVtbl->GetViewStateStream(T,a,b) +#define IShellBrowser_GetControlWindow(T,a,b) (T)->lpVtbl->GetControlWindow(T,a,b) +#define IShellBrowser_SendControlMsg(T,a,b,c,d,e) (T)->lpVtbl->SendControlMsg(T,a,b,c,d,e) +#define IShellBrowser_QueryActiveShellView(T,a) (T)->lpVtbl->QueryActiveShellView(T,a) +#define IShellBrowser_OnViewWindowActive(T,a) (T)->lpVtbl->OnViewWindowActive(T,a) +#define IShellBrowser_SetToolbarItems(T,a,b,c) (T)->lpVtbl->SetToolbarItems(T,a,b,c) +#endif + +#undef INTERFACE +#define INTERFACE IShellView +DECLARE_INTERFACE_(IShellView,IOleWindow) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetWindow)(THIS_ HWND*) PURE; + STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL) PURE; + STDMETHOD(TranslateAccelerator) (THIS_ LPMSG) PURE; +#ifdef _FIX_ENABLEMODELESS_CONFLICT + STDMETHOD(EnableModelessSV)(THIS_ BOOL) PURE; +#else + STDMETHOD(EnableModeless)(THIS_ BOOL) PURE; +#endif + STDMETHOD(UIActivate)(THIS_ UINT) PURE; + STDMETHOD(Refresh) (THIS) PURE; + STDMETHOD(CreateViewWindow)(THIS_ IShellView*,LPCFOLDERSETTINGS,LPSHELLBROWSER,RECT*,HWND*) PURE; + STDMETHOD(DestroyViewWindow)(THIS) PURE; + STDMETHOD(GetCurrentInfo)(THIS_ LPFOLDERSETTINGS) PURE; + STDMETHOD(AddPropertySheetPages)(THIS_ DWORD,LPFNADDPROPSHEETPAGE,LPARAM) PURE; + STDMETHOD(SaveViewState)(THIS) PURE; + STDMETHOD(SelectItem)(THIS_ LPCITEMIDLIST,UINT) PURE; + STDMETHOD(GetItemObject)(THIS_ UINT,REFIID,PVOID*) PURE; +}; + +#ifdef COBJMACROS +#define IShellView_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IShellView_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IShellView_Release(T) (T)->lpVtbl->Release(T) +#define IShellView_GetWindow(T,a) (T)->lpVtbl->GetWindow(T,a) +#define IShellView_ContextSensitiveHelp(T,a) (T)->lpVtbl->ContextSensitiveHelp(T,a) +#define IShellView_TranslateAccelerator(T,a) (T)->lpVtbl->TranslateAccelerator(T,a) +#ifdef _FIX_ENABLEMODELESS_CONFLICT +#define IShellView_EnableModeless(T,a) (T)->lpVtbl->EnableModelessSV(T,a) +#else +#define IShellView_EnableModeless(T,a) (T)->lpVtbl->EnableModeless(T,a) +#endif +#define IShellView_UIActivate(T,a) (T)->lpVtbl->UIActivate(T,a) +#define IShellView_Refresh(T) (T)->lpVtbl->Refresh(T) +#define IShellView_CreateViewWindow(T,a,b,c,d,e) (T)->lpVtbl->CreateViewWindow(T,a,b,c,d,e) +#define IShellView_DestroyViewWindow(T) (T)->lpVtbl->DestroyViewWindow(T) +#define IShellView_GetCurrentInfo(T,a) (T)->lpVtbl->GetCurrentInfo(T,a) +#define IShellView_AddPropertySheetPages(T,a,b,c) (T)->lpVtbl->AddPropertySheetPages(T,a,b,c) +#define IShellView_SaveViewState(T) (T)->lpVtbl->SaveViewState(T) +#define IShellView_SelectItem(T,a,b) (T)->lpVtbl->SelectItem(T,a,b) +#define IShellView_GetItemObject(T,a,b,c) (T)->lpVtbl->GetItemObject(T,a,b,c) +#endif + +#undef INTERFACE +#define INTERFACE ICommDlgBrowser +DECLARE_INTERFACE_(ICommDlgBrowser,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(OnDefaultCommand)(THIS_ IShellView*) PURE; + STDMETHOD(OnStateChange)(THIS_ IShellView*,ULONG) PURE; + STDMETHOD(IncludeObject)(THIS_ IShellView*,LPCITEMIDLIST) PURE; +}; +typedef ICommDlgBrowser *LPCOMMDLGBROWSER; + +#ifdef COBJMACROS +#define ICommDlgBrowser_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define ICommDlgBrowser_AddRef(T) (T)->lpVtbl->AddRef(T) +#define ICommDlgBrowser_Release(T) (T)->lpVtbl->Release(T) +#define ICommDlgBrowser_OnDefaultCommand(T,a) (T)->lpVtbl->OnDefaultCommand(T,a) +#define ICommDlgBrowser_OnStateChange(T,a,b) (T)->lpVtbl->OnStateChange(T,a,b) +#define ICommDlgBrowser_IncludeObject(T,a,b) (T)->lpVtbl->IncludeObject(T,a,b) +#endif + +typedef GUID SHELLVIEWID; +typedef struct _SV2CVW2_PARAMS { + DWORD cbSize; + IShellView *psvPrev; + FOLDERSETTINGS const *pfs; + IShellBrowser *psbOwner; + RECT *prcView; + SHELLVIEWID const *pvid; + HWND hwndView; +} SV2CVW2_PARAMS,*LPSV2CVW2_PARAMS; +#undef INTERFACE +#define INTERFACE IShellView2 +DECLARE_INTERFACE_(IShellView2,IShellView) +{ + + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetWindow)(THIS_ HWND*) PURE; + STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL) PURE; + STDMETHOD(TranslateAccelerator) (THIS_ LPMSG) PURE; +#ifdef _FIX_ENABLEMODELESS_CONFLICT + STDMETHOD(EnableModelessSV)(THIS_ BOOL) PURE; +#else + STDMETHOD(EnableModeless)(THIS_ BOOL) PURE; +#endif + STDMETHOD(UIActivate)(THIS_ UINT) PURE; + STDMETHOD(Refresh) (THIS) PURE; + STDMETHOD(CreateViewWindow)(THIS_ IShellView*,LPCFOLDERSETTINGS,LPSHELLBROWSER,RECT*,HWND*) PURE; + STDMETHOD(DestroyViewWindow)(THIS) PURE; + STDMETHOD(GetCurrentInfo)(THIS_ LPFOLDERSETTINGS) PURE; + STDMETHOD(AddPropertySheetPages)(THIS_ DWORD,LPFNADDPROPSHEETPAGE,LPARAM) PURE; + STDMETHOD(SaveViewState)(THIS) PURE; + STDMETHOD(SelectItem)(THIS_ LPCITEMIDLIST,UINT) PURE; + STDMETHOD(GetItemObject)(THIS_ UINT,REFIID,PVOID*) PURE; + STDMETHOD(GetView)(THIS_ SHELLVIEWID*,ULONG) PURE; + STDMETHOD(CreateViewWindow2)(THIS_ LPSV2CVW2_PARAMS) PURE; +}; + +#undef INTERFACE +#define INTERFACE IShellExecuteHookA +DECLARE_INTERFACE_(IShellExecuteHookA,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Execute)(THIS_ LPSHELLEXECUTEINFOA) PURE; +}; +#undef INTERFACE +#define INTERFACE IShellExecuteHookW +DECLARE_INTERFACE_(IShellExecuteHookW,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Execute)(THIS_ LPSHELLEXECUTEINFOW) PURE; +}; + +#undef INTERFACE +#define INTERFACE IShellIcon +DECLARE_INTERFACE_(IShellIcon,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(GetIconOf)(THIS_ LPCITEMIDLIST,UINT,PINT) PURE; +}; +typedef IShellIcon *LPSHELLICON; + +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; + +#define SSF_SHOWALLOBJECTS 0x1 +#define SSF_SHOWEXTENSIONS 0x2 +#define SSF_SHOWCOMPCOLOR 0x8 +#define SSF_SHOWSYSFILES 0x20 +#define SSF_DOUBLECLICKINWEBVIEW 0x80 +#define SSF_SHOWATTRIBCOL 0x100 +#define SSF_DESKTOPHTML 0x200 +#define SSF_WIN95CLASSIC 0x400 +#define SSF_DONTPRETTYPATH 0x800 +#define SSF_MAPNETDRVBUTTON 0x1000 +#define SSF_SHOWINFOTIP 0x2000 +#define SSF_HIDEICONS 0x4000 +#define SSF_NOCONFIRMRECYCLE 0x8000 + +#undef INTERFACE +#define INTERFACE IShellIconOverlayIdentifier +DECLARE_INTERFACE_(IShellIconOverlayIdentifier,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(IsMemberOf)(THIS_ LPCWSTR,DWORD) PURE; + STDMETHOD(GetOverlayInfo)(THIS_ LPWSTR,int,int*,DWORD*) PURE; + STDMETHOD(GetPriority)(THIS_ int*) PURE; +}; + +#define ISIOI_ICONFILE 0x00000001 +#define ISIOI_ICONINDEX 0x00000002 + +#if (_WIN32_WINNT >= 0x0500) /* W2K */ +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; +#endif /* _WIN32_WINNT >= 0x0500 */ + +#if (_WIN32_IE >= 0x0500) +#pragma pack(push,8) +typedef struct +{ + SIZE sizeDragImage; + POINT ptOffset; + HBITMAP hbmpDragImage; + COLORREF crColorKey; +} SHDRAGIMAGE, *LPSHDRAGIMAGE; +#pragma pack(pop) + +#undef INTERFACE +#define INTERFACE IDragSourceHelper +DECLARE_INTERFACE_(IDragSourceHelper, IUnknown) +{ + STDMETHOD (QueryInterface)(THIS_ REFIID riid, void **ppv) PURE; + STDMETHOD_(ULONG, AddRef) (THIS) PURE; + STDMETHOD_(ULONG, Release) (THIS) PURE; + STDMETHOD (InitializeFromBitmap)(THIS_ LPSHDRAGIMAGE pshdi, IDataObject* pDataObject) PURE; + STDMETHOD (InitializeFromWindow)(THIS_ HWND hwnd, POINT* ppt, IDataObject* pDataObject) PURE; +}; + +#undef INTERFACE +#define INTERFACE IDropTargetHelper +DECLARE_INTERFACE_(IDropTargetHelper, IUnknown) +{ + STDMETHOD (QueryInterface)(THIS_ REFIID riid, void** ppv) PURE; + STDMETHOD_(ULONG, AddRef) (THIS) PURE; + STDMETHOD_(ULONG, Release) (THIS) PURE; + STDMETHOD (DragEnter)(THIS_ HWND hwndTarget, IDataObject* pDataObject, POINT* ppt, DWORD dwEffect) PURE; + STDMETHOD (DragLeave)(THIS) PURE; + STDMETHOD (DragOver)(THIS_ POINT* ppt, DWORD dwEffect) PURE; + STDMETHOD (Drop)(THIS_ IDataObject* pDataObject, POINT* ppt, DWORD dwEffect) PURE; + STDMETHOD (Show)(THIS_ BOOL fShow) PURE; +}; +#endif /* _WIN32_IE >= 0x0500 */ + +void WINAPI SHAddToRecentDocs(UINT,PCVOID); +LPITEMIDLIST WINAPI SHBrowseForFolderA(PBROWSEINFOA); +LPITEMIDLIST WINAPI SHBrowseForFolderW(PBROWSEINFOW); +void WINAPI SHChangeNotify(LONG,UINT,PCVOID,PCVOID); +HRESULT WINAPI SHGetDataFromIDListA(LPSHELLFOLDER,LPCITEMIDLIST,int,PVOID,int); +HRESULT WINAPI SHGetDataFromIDListW(LPSHELLFOLDER,LPCITEMIDLIST,int,PVOID,int); +HRESULT WINAPI SHGetDesktopFolder(LPSHELLFOLDER*); +HRESULT WINAPI SHGetInstanceExplorer(IUnknown **); +HRESULT WINAPI SHGetMalloc(LPMALLOC*); +BOOL WINAPI SHGetPathFromIDListA(LPCITEMIDLIST,LPSTR); +BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST,LPWSTR); +HRESULT WINAPI SHGetSpecialFolderLocation(HWND,int,LPITEMIDLIST*); +HRESULT WINAPI SHLoadInProc(REFCLSID); +#if (_WIN32_IE >= 0x0400) +BOOL WINAPI SHGetSpecialFolderPathA(HWND,LPSTR,int,BOOL); +BOOL WINAPI SHGetSpecialFolderPathW(HWND,LPWSTR,int,BOOL); +#endif +/* SHGetFolderPath in shfolder.dll on W9x, NT4, also in shell32.dll on W2K */ +HRESULT WINAPI SHGetFolderPathA(HWND,int,HANDLE,DWORD,LPSTR); +HRESULT WINAPI SHGetFolderPathW(HWND,int,HANDLE,DWORD,LPWSTR); +#if (_WIN32_WINDOWS >= 0x0490) || (_WIN32_WINNT >= 0x0500) /* ME or W2K */ +HRESULT WINAPI SHGetFolderLocation(HWND,int,HANDLE,DWORD,LPITEMIDLIST*); +#endif +#if (_WIN32_WINNT >= 0x0500) +INT WINAPI SHCreateDirectoryExA(HWND,LPCSTR,LPSECURITY_ATTRIBUTES); +INT WINAPI SHCreateDirectoryExW(HWND,LPCWSTR,LPSECURITY_ATTRIBUTES); +HRESULT WINAPI SHBindToParent(LPCITEMIDLIST,REFIID,VOID**,LPCITEMIDLIST*); +#endif +#if (_WIN32_WINNT >= 0x0501) /* XP */ +HRESULT WINAPI SHGetFolderPathAndSubDirA(HWND,int,HANDLE,DWORD,LPCSTR,LPSTR); +HRESULT WINAPI SHGetFolderPathAndSubDirW(HWND,int,HANDLE,DWORD,LPCWSTR,LPWSTR); +#endif +void WINAPI SHGetSettings(LPSHELLFLAGSTATE,DWORD); +#if (_WIN32_WINNT >= 0x0500) /* W2K */ +void WINAPI SHGetSetSettings(LPSHELLSTATE,DWORD,BOOL); +#endif + +#if (_WIN32_WINNT >= 0x0500) /* W2K */ +BOOL WINAPI ILIsEqual(LPCITEMIDLIST, LPCITEMIDLIST); +BOOL WINAPI ILIsParent(LPCITEMIDLIST, LPCITEMIDLIST, BOOL); +BOOL WINAPI ILRemoveLastID(LPITEMIDLIST); +HRESULT WINAPI ILLoadFromStream(IStream*, LPITEMIDLIST*); +HRESULT WINAPI ILSaveToStream(IStream*, LPCITEMIDLIST); +LPITEMIDLIST WINAPI ILAppendID(LPITEMIDLIST, LPCSHITEMID, BOOL); +LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST); +LPITEMIDLIST WINAPI ILCloneFirst(LPCITEMIDLIST); +LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST, LPCITEMIDLIST); +LPITEMIDLIST WINAPI ILFindChild(LPCITEMIDLIST, LPCITEMIDLIST); +LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST); +LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST); +UINT WINAPI ILGetSize(LPCITEMIDLIST); +void WINAPI ILFree(LPITEMIDLIST); + +HRESULT WINAPI SHCoCreateInstance(LPCWSTR,REFCLSID,IUnknown*,REFIID,void**); +#endif + +#ifdef UNICODE +typedef IShellExecuteHookW IShellExecuteHook; +typedef IShellLinkW IShellLink; +typedef BROWSEINFOW BROWSEINFO,*PBROWSEINFO,*LPBROWSEINFO; +#define SHBrowseForFolder SHBrowseForFolderW +#define SHGetDataFromIDList SHGetDataFromIDListW +#define SHGetPathFromIDList SHGetPathFromIDListW +#if (_WIN32_IE >= 0x0400) +#define SHGetSpecialFolderPath SHGetSpecialFolderPathW +#endif +#define SHGetFolderPath SHGetFolderPathW +#if (_WIN32_WINNT >= 0x0500) +#define SHCreateDirectoryEx SHCreateDirectoryExW +#endif +#if (_WIN32_WINNT >= 0x0501) +#define SHGetFolderPathAndSubDir SHGetFolderPathAndSubDirW +#endif + +#else +typedef IShellExecuteHookA IShellExecuteHook; +typedef IShellLinkA IShellLink; +typedef BROWSEINFOA BROWSEINFO,*PBROWSEINFO,*LPBROWSEINFO; +#define SHBrowseForFolder SHBrowseForFolderA +#define SHGetDataFromIDList SHGetDataFromIDListA +#define SHGetPathFromIDList SHGetPathFromIDListA +#if (_WIN32_IE >= 0x0400) +#define SHGetSpecialFolderPath SHGetSpecialFolderPathA +#endif +#define SHGetFolderPath SHGetFolderPathA +#if (_WIN32_WINNT >= 0x0500) +#define SHCreateDirectoryEx SHCreateDirectoryExA +#endif +#if (_WIN32_WINNT >= 0x0501) +#define SHGetFolderPathAndSubDir SHGetFolderPathAndSubDirA +#endif +#endif /* UNICODE */ + +#pragma pack(pop) +#ifdef __cplusplus +} +#endif + + +#endif /* _SHLOBJ_H */ diff --git a/reactos/w32api/include/shlwapi.h b/reactos/w32api/include/shlwapi.h new file mode 100644 index 00000000000..764af951798 --- /dev/null +++ b/reactos/w32api/include/shlwapi.h @@ -0,0 +1,712 @@ +#ifndef _SHLWAPI_H +#define _SHLWAPI_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef __OBJC__ +#include <objbase.h> +#include <shlobj.h> +#endif + +#ifndef WINSHLWAPI +#define WINSHLWAPI DECLSPEC_IMPORT +#endif + +#define DLLVER_PLATFORM_WINDOWS 0x00000001 +#define DLLVER_PLATFORM_NT 0x00000002 + +#define URL_DONT_ESCAPE_EXTRA_INFO 0x02000000 +#define URL_DONT_SIMPLIFY 0x08000000 +#define URL_ESCAPE_PERCENT 0x00001000 +#define URL_ESCAPE_SEGMENT_ONLY 0x00002000 +#define URL_ESCAPE_SPACES_ONLY 0x04000000 +#define URL_ESCAPE_UNSAFE 0x20000000 +#define URL_INTERNAL_PATH 0x00800000 +#define URL_PARTFLAG_KEEPSCHEME 0x00000001 +#define URL_PLUGGABLE_PROTOCOL 0x40000000 +#define URL_UNESCAPE 0x10000000 +#define URL_UNESCAPE_HIGH_ANSI_ONLY 0x00400000 +#define URL_UNESCAPE_INPLACE 0x00100000 + +#ifndef RC_INVOKED +#include <pshpack1.h> +typedef struct _DllVersionInfo +{ + DWORD cbSize; + DWORD dwMajorVersion; + DWORD dwMinorVersion; + DWORD dwBuildNumber; + DWORD dwPlatformID; +} DLLVERSIONINFO; +typedef struct _DLLVERSIONINFO2 +{ + DLLVERSIONINFO info1; + DWORD dwFlags; + ULONGLONG ullVersion; +} DLLVERSIONINFO2; +#include <poppack.h> + +#define MAKEDLLVERULL(major, minor, build, qfe) \ + (((ULONGLONG)(major) << 48) | \ + ((ULONGLONG)(minor) << 32) | \ + ((ULONGLONG)(build) << 16) | \ + ((ULONGLONG)( qfe) << 0)) + +typedef enum { + ASSOCSTR_COMMAND, + ASSOCSTR_EXECUTABLE, + ASSOCSTR_FRIENDLYDOCNAME, + ASSOCSTR_FRIENDLYAPPNAME, + ASSOCSTR_NOOPEN, + ASSOCSTR_SHELLNEWVALUE, + ASSOCSTR_DDECOMMAND, + ASSOCSTR_DDEIFEXEC, + ASSOCSTR_DDEAPPLICATION, + ASSOCSTR_DDETOPIC +} ASSOCSTR; +typedef enum +{ + ASSOCKEY_SHELLEXECCLASS = 1, + ASSOCKEY_APP, + ASSOCKEY_CLASS, + ASSOCKEY_BASECLASS +} ASSOCKEY; +typedef enum +{ + ASSOCDATA_MSIDESCRIPTOR = 1, + ASSOCDATA_NOACTIVATEHANDLER, + ASSOCDATA_QUERYCLASSSTORE +} ASSOCDATA; +typedef DWORD ASSOCF; +typedef enum +{ + SHREGDEL_DEFAULT = 0x00000000, + SHREGDEL_HKCU = 0x00000001, + SHREGDEL_HKLM = 0x00000010, + SHREGDEL_BOTH = 0x00000011 +} SHREGDEL_FLAGS; +typedef enum +{ + SHREGENUM_DEFAULT = 0x00000000, + SHREGENUM_HKCU = 0x00000001, + SHREGENUM_HKLM = 0x00000010, + SHREGENUM_BOTH = 0x00000011 +} SHREGENUM_FLAGS; +typedef enum +{ + URLIS_URL, + URLIS_OPAQUE, + URLIS_NOHISTORY, + URLIS_FILEURL, + URLIS_APPLIABLE, + URLIS_DIRECTORY, + URLIS_HASQUERY +} URLIS; + +typedef HANDLE HUSKEY, *PHUSKEY; + +typedef HRESULT (WINAPI* DLLGETVERSIONPROC)(DLLVERSIONINFO *); + +WINSHLWAPI BOOL WINAPI ChrCmpIA(WORD,WORD); +WINSHLWAPI BOOL WINAPI ChrCmpIW(WCHAR,WCHAR); +#define IntlStrEqNA(pStr1, pStr2, nChar) IntlStrEqWorkerA(TRUE, pStr1, pStr2, nChar); +#define IntlStrEqNW(pStr1, pStr2, nChar) IntlStrEqWorkerW(TRUE, pStr1, pStr2, nChar); +#define IntlStrEqNIA(pStr1, pStr2, nChar) IntlStrEqWorkerA(FALSE, pStr1, pStr2, nChar); +#define IntlStrEqNIW(pStr1, pStr2, nChar) IntlStrEqWorkerW(FALSE, pStr1, pStr2, nChar); +WINSHLWAPI BOOL WINAPI IntlStrEqWorkerA(BOOL,LPCSTR,LPCSTR,int); +WINSHLWAPI BOOL WINAPI IntlStrEqWorkerW(BOOL,LPCWSTR,LPCWSTR,int); +WINSHLWAPI HRESULT WINAPI SHStrDupA(LPCSTR,LPWSTR*); +WINSHLWAPI HRESULT WINAPI SHStrDupW(LPCWSTR,LPWSTR*); +WINSHLWAPI LPSTR WINAPI StrCatA(LPSTR,LPCSTR); +WINSHLWAPI LPWSTR WINAPI StrCatW(LPWSTR,LPCWSTR); +WINSHLWAPI LPSTR WINAPI StrCatBuffA(LPSTR,LPCSTR,int); +WINSHLWAPI LPWSTR WINAPI StrCatBuffW(LPWSTR,LPCWSTR,int); +WINSHLWAPI DWORD WINAPI StrCatChainW(LPWSTR,DWORD,DWORD,LPCWSTR); +WINSHLWAPI LPSTR WINAPI StrChrA(LPCSTR,WORD); +WINSHLWAPI LPWSTR WINAPI StrChrW(LPCWSTR,WCHAR); +WINSHLWAPI LPSTR WINAPI StrChrIA(LPCSTR,WORD); +WINSHLWAPI LPWSTR WINAPI StrChrIW(LPCWSTR,WCHAR); +#define StrCmpIA lstrcmpiA +#define StrCmpA lstrcmpA +#define StrCpyA lstrcpyA +#define StrCpyNA lstrcpynA +WINSHLWAPI int WINAPI StrCmpIW(LPCWSTR,LPCWSTR); +WINSHLWAPI int WINAPI StrCmpW(LPCWSTR,LPCWSTR); +WINSHLWAPI LPWSTR WINAPI StrCpyW(LPWSTR,LPCWSTR); +WINSHLWAPI LPWSTR WINAPI StrCpyNW(LPWSTR,LPCWSTR,int); +WINSHLWAPI int WINAPI StrCmpNA(LPCSTR,LPCSTR,int); +WINSHLWAPI int WINAPI StrCmpNW(LPCWSTR,LPCWSTR,int); +WINSHLWAPI int WINAPI StrCmpNIA(LPCSTR,LPCSTR,int); +WINSHLWAPI int WINAPI StrCmpNIW(LPCWSTR,LPCWSTR,int); +WINSHLWAPI int WINAPI StrCSpnA(LPCSTR,LPCSTR); +WINSHLWAPI int WINAPI StrCSpnW(LPCWSTR,LPCWSTR); +WINSHLWAPI int WINAPI StrCSpnIA(LPCSTR,LPCSTR); +WINSHLWAPI int WINAPI StrCSpnIW(LPCWSTR,LPCWSTR); +WINSHLWAPI LPSTR WINAPI StrDupA(LPCSTR); +WINSHLWAPI LPWSTR WINAPI StrDupW(LPCWSTR); +WINSHLWAPI LPSTR WINAPI StrFormatByteSize64A(LONGLONG,LPSTR,UINT); +WINSHLWAPI LPSTR WINAPI StrFormatByteSizeA(DWORD,LPSTR,UINT); +WINSHLWAPI LPWSTR WINAPI StrFormatByteSizeW(LONGLONG,LPWSTR,UINT); +WINSHLWAPI LPSTR WINAPI StrFormatKBSizeA(LONGLONG,LPSTR,UINT); +WINSHLWAPI LPWSTR WINAPI StrFormatKBSizeW(LONGLONG,LPWSTR,UINT); +WINSHLWAPI int WINAPI StrFromTimeIntervalA(LPSTR,UINT,DWORD,int); +WINSHLWAPI int WINAPI StrFromTimeIntervalW(LPWSTR,UINT,DWORD,int); +WINSHLWAPI BOOL WINAPI StrIsIntlEqualA(BOOL,LPCSTR,LPCSTR,int); +WINSHLWAPI BOOL WINAPI StrIsIntlEqualW(BOOL,LPCWSTR,LPCWSTR,int); +WINSHLWAPI LPSTR WINAPI StrNCatA(LPSTR,LPCSTR,int); +WINSHLWAPI LPWSTR WINAPI StrNCatW(LPWSTR,LPCWSTR,int); +WINSHLWAPI LPSTR WINAPI StrPBrkA(LPCSTR,LPCSTR); +WINSHLWAPI LPWSTR WINAPI StrPBrkW(LPCWSTR,LPCWSTR); +WINSHLWAPI LPSTR WINAPI StrRChrA(LPCSTR,LPCSTR,WORD); +WINSHLWAPI LPWSTR WINAPI StrRChrW(LPCWSTR,LPCWSTR,WCHAR); +WINSHLWAPI LPSTR WINAPI StrRChrIA(LPCSTR,LPCSTR,WORD); +WINSHLWAPI LPWSTR WINAPI StrRChrIW(LPCWSTR,LPCWSTR,WCHAR); +#ifndef __OBJC__ +WINSHLWAPI HRESULT WINAPI StrRetToBufA(LPSTRRET,LPCITEMIDLIST,LPSTR,UINT); +WINSHLWAPI HRESULT WINAPI StrRetToBufW(LPSTRRET,LPCITEMIDLIST,LPWSTR,UINT); +WINSHLWAPI HRESULT WINAPI StrRetToStrA(LPSTRRET,LPCITEMIDLIST,LPSTR*); +WINSHLWAPI HRESULT WINAPI StrRetToStrW(LPSTRRET,LPCITEMIDLIST,LPWSTR*); +#endif +WINSHLWAPI LPSTR WINAPI StrRStrIA(LPCSTR,LPCSTR,LPCSTR); +WINSHLWAPI LPWSTR WINAPI StrRStrIW(LPCWSTR,LPCWSTR,LPCWSTR); +WINSHLWAPI int WINAPI StrSpnA(LPCSTR,LPCSTR); +WINSHLWAPI int WINAPI StrSpnW(LPCWSTR,LPCWSTR); +WINSHLWAPI LPSTR WINAPI StrStrA(LPCSTR, LPCSTR); +WINSHLWAPI LPSTR WINAPI StrStrIA(LPCSTR,LPCSTR); +WINSHLWAPI LPWSTR WINAPI StrStrIW(LPCWSTR,LPCWSTR); +WINSHLWAPI LPWSTR WINAPI StrStrW(LPCWSTR,LPCWSTR); +WINSHLWAPI int WINAPI StrToIntA(LPCSTR); +WINSHLWAPI int WINAPI StrToIntW(LPCWSTR); +WINSHLWAPI BOOL WINAPI StrToIntExA(LPCSTR,DWORD,int*); +WINSHLWAPI BOOL WINAPI StrToIntExW(LPCWSTR,DWORD,int*); +WINSHLWAPI BOOL WINAPI StrTrimA(LPSTR,LPCSTR); +WINSHLWAPI BOOL WINAPI StrTrimW(LPWSTR,LPCWSTR); +WINSHLWAPI LPSTR WINAPI PathAddBackslashA(LPSTR); +WINSHLWAPI LPWSTR WINAPI PathAddBackslashW(LPWSTR); +WINSHLWAPI BOOL WINAPI PathAddExtensionA(LPSTR,LPCSTR); +WINSHLWAPI BOOL WINAPI PathAddExtensionW(LPWSTR,LPCWSTR); +WINSHLWAPI BOOL WINAPI PathAppendA(LPSTR,LPCSTR); +WINSHLWAPI BOOL WINAPI PathAppendW(LPWSTR,LPCWSTR); +WINSHLWAPI LPSTR WINAPI PathBuildRootA(LPSTR,int); +WINSHLWAPI LPWSTR WINAPI PathBuildRootW(LPWSTR,int); +WINSHLWAPI BOOL WINAPI PathCanonicalizeA(LPSTR,LPCSTR); +WINSHLWAPI BOOL WINAPI PathCanonicalizeW(LPWSTR,LPCWSTR); +WINSHLWAPI LPSTR WINAPI PathCombineA(LPSTR,LPCSTR,LPCSTR); +WINSHLWAPI LPWSTR WINAPI PathCombineW(LPWSTR,LPCWSTR,LPCWSTR); +WINSHLWAPI int WINAPI PathCommonPrefixA(LPCSTR,LPCSTR,LPSTR); +WINSHLWAPI int WINAPI PathCommonPrefixW(LPCWSTR,LPCWSTR,LPWSTR); +WINSHLWAPI BOOL WINAPI PathCompactPathA(HDC,LPSTR,UINT); +WINSHLWAPI BOOL WINAPI PathCompactPathW(HDC,LPWSTR,UINT); +WINSHLWAPI BOOL WINAPI PathCompactPathExA(LPSTR,LPCSTR,UINT,DWORD); +WINSHLWAPI BOOL WINAPI PathCompactPathExW(LPWSTR,LPCWSTR,UINT,DWORD); +WINSHLWAPI HRESULT WINAPI PathCreateFromUrlA(LPCSTR,LPSTR,LPDWORD,DWORD); +WINSHLWAPI HRESULT WINAPI PathCreateFromUrlW(LPCWSTR,LPWSTR,LPDWORD,DWORD); +WINSHLWAPI BOOL WINAPI PathFileExistsA(LPCSTR); +WINSHLWAPI BOOL WINAPI PathFileExistsW(LPCWSTR); +WINSHLWAPI LPSTR WINAPI PathFindExtensionA(LPCSTR); +WINSHLWAPI LPWSTR WINAPI PathFindExtensionW(LPCWSTR); +WINSHLWAPI LPSTR WINAPI PathFindFileNameA(LPCSTR); +WINSHLWAPI LPWSTR WINAPI PathFindFileNameW(LPCWSTR); +WINSHLWAPI LPSTR WINAPI PathFindNextComponentA(LPCSTR); +WINSHLWAPI LPWSTR WINAPI PathFindNextComponentW(LPCWSTR); +WINSHLWAPI BOOL WINAPI PathFindOnPathA(LPSTR,LPCSTR*); +WINSHLWAPI BOOL WINAPI PathFindOnPathW(LPWSTR,LPCWSTR*); +WINSHLWAPI LPCSTR WINAPI PathFindSuffixArrayA(LPCSTR,LPCSTR*,int); +WINSHLWAPI LPCWSTR WINAPI PathFindSuffixArrayW(LPCWSTR,LPCWSTR*,int); +WINSHLWAPI LPSTR WINAPI PathGetArgsA(LPCSTR); +WINSHLWAPI LPWSTR WINAPI PathGetArgsW(LPCWSTR); +WINSHLWAPI UINT WINAPI PathGetCharTypeA(UCHAR); +WINSHLWAPI UINT WINAPI PathGetCharTypeW(WCHAR); +WINSHLWAPI int WINAPI PathGetDriveNumberA(LPCSTR); +WINSHLWAPI int WINAPI PathGetDriveNumberW(LPCWSTR); +WINSHLWAPI BOOL WINAPI PathIsContentTypeA(LPCSTR,LPCSTR); +WINSHLWAPI BOOL WINAPI PathIsContentTypeW(LPCWSTR,LPCWSTR); +WINSHLWAPI BOOL WINAPI PathIsDirectoryA(LPCSTR); +WINSHLWAPI BOOL WINAPI PathIsDirectoryEmptyA(LPCSTR); +WINSHLWAPI BOOL WINAPI PathIsDirectoryEmptyW(LPCWSTR); +WINSHLWAPI BOOL WINAPI PathIsDirectoryW(LPCWSTR); +WINSHLWAPI BOOL WINAPI PathIsFileSpecA(LPCSTR); +WINSHLWAPI BOOL WINAPI PathIsFileSpecW(LPCWSTR); +WINSHLWAPI BOOL WINAPI PathIsLFNFileSpecA(LPCSTR); +WINSHLWAPI BOOL WINAPI PathIsLFNFileSpecW(LPCWSTR); +WINSHLWAPI BOOL WINAPI PathIsNetworkPathA(LPCSTR); +WINSHLWAPI BOOL WINAPI PathIsNetworkPathW(LPCWSTR); +WINSHLWAPI BOOL WINAPI PathIsPrefixA(LPCSTR,LPCSTR); +WINSHLWAPI BOOL WINAPI PathIsPrefixW(LPCWSTR,LPCWSTR); +WINSHLWAPI BOOL WINAPI PathIsRelativeA(LPCSTR); +WINSHLWAPI BOOL WINAPI PathIsRelativeW(LPCWSTR); +WINSHLWAPI BOOL WINAPI PathIsRootA(LPCSTR); +WINSHLWAPI BOOL WINAPI PathIsRootW(LPCWSTR); +WINSHLWAPI BOOL WINAPI PathIsSameRootA(LPCSTR,LPCSTR); +WINSHLWAPI BOOL WINAPI PathIsSameRootW(LPCWSTR,LPCWSTR); +WINSHLWAPI BOOL WINAPI PathIsSystemFolderA(LPCSTR,DWORD); +WINSHLWAPI BOOL WINAPI PathIsSystemFolderW(LPCWSTR,DWORD); +WINSHLWAPI BOOL WINAPI PathIsUNCA(LPCSTR); +WINSHLWAPI BOOL WINAPI PathIsUNCServerA(LPCSTR); +WINSHLWAPI BOOL WINAPI PathIsUNCServerShareA(LPCSTR); +WINSHLWAPI BOOL WINAPI PathIsUNCServerShareW(LPCWSTR); +WINSHLWAPI BOOL WINAPI PathIsUNCServerW(LPCWSTR); +WINSHLWAPI BOOL WINAPI PathIsUNCW(LPCWSTR); +WINSHLWAPI BOOL WINAPI PathIsURLA(LPCSTR); +WINSHLWAPI BOOL WINAPI PathIsURLW(LPCWSTR); +WINSHLWAPI BOOL WINAPI PathMakePrettyA(LPSTR); +WINSHLWAPI BOOL WINAPI PathMakePrettyW(LPWSTR); +WINSHLWAPI BOOL WINAPI PathMakeSystemFolderA(LPSTR); +WINSHLWAPI BOOL WINAPI PathMakeSystemFolderW(LPWSTR); +WINSHLWAPI BOOL WINAPI PathMatchSpecA(LPCSTR,LPCSTR); +WINSHLWAPI BOOL WINAPI PathMatchSpecW(LPCWSTR,LPCWSTR); +WINSHLWAPI int WINAPI PathParseIconLocationA(LPSTR); +WINSHLWAPI int WINAPI PathParseIconLocationW(LPWSTR); +WINSHLWAPI void WINAPI PathQuoteSpacesA(LPSTR); +WINSHLWAPI void WINAPI PathQuoteSpacesW(LPWSTR); +WINSHLWAPI BOOL WINAPI PathRelativePathToA(LPSTR,LPCSTR,DWORD,LPCSTR,DWORD); +WINSHLWAPI BOOL WINAPI PathRelativePathToW(LPWSTR,LPCWSTR,DWORD,LPCWSTR,DWORD); +WINSHLWAPI void WINAPI PathRemoveArgsA(LPSTR); +WINSHLWAPI void WINAPI PathRemoveArgsW(LPWSTR); +WINSHLWAPI LPSTR WINAPI PathRemoveBackslashA(LPSTR); +WINSHLWAPI LPWSTR WINAPI PathRemoveBackslashW(LPWSTR); +WINSHLWAPI void WINAPI PathRemoveBlanksA(LPSTR); +WINSHLWAPI void WINAPI PathRemoveBlanksW(LPWSTR); +WINSHLWAPI void WINAPI PathRemoveExtensionA(LPSTR); +WINSHLWAPI void WINAPI PathRemoveExtensionW(LPWSTR); +WINSHLWAPI BOOL WINAPI PathRemoveFileSpecA(LPSTR); +WINSHLWAPI BOOL WINAPI PathRemoveFileSpecW(LPWSTR); +WINSHLWAPI BOOL WINAPI PathRenameExtensionA(LPSTR,LPCSTR); +WINSHLWAPI BOOL WINAPI PathRenameExtensionW(LPWSTR,LPCWSTR); +WINSHLWAPI BOOL WINAPI PathSearchAndQualifyA(LPCSTR,LPSTR,UINT); +WINSHLWAPI BOOL WINAPI PathSearchAndQualifyW(LPCWSTR,LPWSTR,UINT); +WINSHLWAPI void WINAPI PathSetDlgItemPathA(HWND,int,LPCSTR); +WINSHLWAPI void WINAPI PathSetDlgItemPathW(HWND,int,LPCWSTR); +WINSHLWAPI LPSTR WINAPI PathSkipRootA(LPCSTR); +WINSHLWAPI LPWSTR WINAPI PathSkipRootW(LPCWSTR); +WINSHLWAPI void WINAPI PathStripPathA(LPSTR); +WINSHLWAPI void WINAPI PathStripPathW(LPWSTR); +WINSHLWAPI BOOL WINAPI PathStripToRootA(LPSTR); +WINSHLWAPI BOOL WINAPI PathStripToRootW(LPWSTR); +WINSHLWAPI void WINAPI PathUndecorateA(LPSTR); +WINSHLWAPI void WINAPI PathUndecorateW(LPWSTR); +WINSHLWAPI BOOL WINAPI PathUnExpandEnvStringsA(LPCSTR,LPSTR,UINT); +WINSHLWAPI BOOL WINAPI PathUnExpandEnvStringsW(LPCWSTR,LPWSTR,UINT); +WINSHLWAPI BOOL WINAPI PathUnmakeSystemFolderA(LPSTR); +WINSHLWAPI BOOL WINAPI PathUnmakeSystemFolderW(LPWSTR); +WINSHLWAPI void WINAPI PathUnquoteSpacesA(LPSTR); +WINSHLWAPI void WINAPI PathUnquoteSpacesW(LPWSTR); +WINSHLWAPI HRESULT WINAPI SHAutoComplete(HWND,DWORD); +#ifndef __OBJC__ +WINSHLWAPI HRESULT WINAPI SHCreateStreamOnFileA(LPCSTR,DWORD,struct IStream**); +WINSHLWAPI HRESULT WINAPI SHCreateStreamOnFileW(LPCWSTR,DWORD,struct IStream**); +WINSHLWAPI struct IStream* WINAPI SHOpenRegStream2A(HKEY,LPCSTR,LPCSTR,DWORD); +WINSHLWAPI struct IStream* WINAPI SHOpenRegStream2W(HKEY,LPCWSTR,LPCWSTR,DWORD); +WINSHLWAPI struct IStream* WINAPI SHOpenRegStreamA(HKEY,LPCSTR,LPCSTR,DWORD); +WINSHLWAPI struct IStream* WINAPI SHOpenRegStreamW(HKEY,LPCWSTR,LPCWSTR,DWORD); +#endif +WINSHLWAPI BOOL WINAPI SHCreateThread(LPTHREAD_START_ROUTINE,void*,DWORD,LPTHREAD_START_ROUTINE); +WINSHLWAPI DWORD WINAPI SHCopyKeyA(HKEY,LPCSTR,HKEY,DWORD); +WINSHLWAPI DWORD WINAPI SHCopyKeyW(HKEY,LPCWSTR,HKEY,DWORD); +WINSHLWAPI DWORD WINAPI SHDeleteEmptyKeyA(HKEY,LPCSTR); +WINSHLWAPI DWORD WINAPI SHDeleteEmptyKeyW(HKEY,LPCWSTR); +WINSHLWAPI DWORD WINAPI SHDeleteKeyA(HKEY,LPCSTR); +WINSHLWAPI DWORD WINAPI SHDeleteKeyW(HKEY,LPCWSTR); +WINSHLWAPI DWORD WINAPI SHEnumKeyExA(HKEY,DWORD,LPSTR,LPDWORD); +WINSHLWAPI DWORD WINAPI SHEnumKeyExW(HKEY,DWORD,LPWSTR,LPDWORD); +WINSHLWAPI DWORD WINAPI SHQueryInfoKeyA(HKEY,LPDWORD,LPDWORD,LPDWORD,LPDWORD); +WINSHLWAPI DWORD WINAPI SHQueryInfoKeyW(HKEY,LPDWORD,LPDWORD,LPDWORD,LPDWORD); +WINSHLWAPI DWORD WINAPI SHQueryValueExA(HKEY,LPCSTR,LPDWORD,LPDWORD,LPVOID,LPDWORD); +WINSHLWAPI DWORD WINAPI SHQueryValueExW(HKEY,LPCWSTR,LPDWORD,LPDWORD,LPVOID,LPDWORD); +#ifndef __OBJC__ +WINSHLWAPI HRESULT WINAPI SHGetThreadRef(IUnknown**); +WINSHLWAPI HRESULT WINAPI SHSetThreadRef(IUnknown*); +WINSHLWAPI BOOL WINAPI SHSkipJunction(IBindCtx*,const CLSID*); +#endif +WINSHLWAPI DWORD WINAPI SHEnumValueA(HKEY,DWORD,LPSTR,LPDWORD,LPDWORD,LPVOID,LPDWORD); +WINSHLWAPI DWORD WINAPI SHEnumValueW(HKEY,DWORD,LPWSTR,LPDWORD,LPDWORD,LPVOID,LPDWORD); +WINSHLWAPI DWORD WINAPI SHGetValueA(HKEY,LPCSTR,LPCSTR,LPDWORD,LPVOID,LPDWORD); +WINSHLWAPI DWORD WINAPI SHGetValueW(HKEY,LPCWSTR,LPCWSTR,LPDWORD,LPVOID,LPDWORD); +WINSHLWAPI DWORD WINAPI SHSetValueA(HKEY,LPCSTR,LPCSTR,DWORD,LPCVOID,DWORD); +WINSHLWAPI DWORD WINAPI SHSetValueW(HKEY,LPCWSTR,LPCWSTR,DWORD,LPCVOID,DWORD); +WINSHLWAPI DWORD WINAPI SHDeleteValueA(HKEY,LPCSTR,LPCSTR); +WINSHLWAPI DWORD WINAPI SHDeleteValueW(HKEY,LPCWSTR,LPCWSTR); +WINSHLWAPI HRESULT WINAPI AssocCreate(CLSID,const IID* const,LPVOID*); +WINSHLWAPI HRESULT WINAPI AssocQueryKeyA(ASSOCF,ASSOCKEY,LPCSTR,LPCSTR,HKEY*); +WINSHLWAPI HRESULT WINAPI AssocQueryKeyW(ASSOCF,ASSOCKEY,LPCWSTR,LPCWSTR,HKEY*); +WINSHLWAPI HRESULT WINAPI AssocQueryStringA(ASSOCF,ASSOCSTR,LPCSTR,LPCSTR,LPSTR,DWORD*); +WINSHLWAPI HRESULT WINAPI AssocQueryStringByKeyA(ASSOCF,ASSOCSTR,HKEY,LPCSTR,LPSTR,DWORD*); +WINSHLWAPI HRESULT WINAPI AssocQueryStringByKeyW(ASSOCF,ASSOCSTR,HKEY,LPCWSTR,LPWSTR,DWORD*); +WINSHLWAPI HRESULT WINAPI AssocQueryStringW(ASSOCF,ASSOCSTR,LPCWSTR,LPCWSTR,LPWSTR,DWORD*); + +WINSHLWAPI HRESULT WINAPI UrlApplySchemeA(LPCSTR,LPSTR,LPDWORD,DWORD); +WINSHLWAPI HRESULT WINAPI UrlApplySchemeW(LPCWSTR,LPWSTR,LPDWORD,DWORD); +WINSHLWAPI HRESULT WINAPI UrlCanonicalizeA(LPCSTR,LPSTR,LPDWORD,DWORD); +WINSHLWAPI HRESULT WINAPI UrlCanonicalizeW(LPCWSTR,LPWSTR,LPDWORD,DWORD); +WINSHLWAPI HRESULT WINAPI UrlCombineA(LPCSTR,LPCSTR,LPSTR,LPDWORD,DWORD); +WINSHLWAPI HRESULT WINAPI UrlCombineW(LPCWSTR,LPCWSTR,LPWSTR,LPDWORD,DWORD); +WINSHLWAPI int WINAPI UrlCompareA(LPCSTR,LPCSTR,BOOL); +WINSHLWAPI int WINAPI UrlCompareW(LPCWSTR,LPCWSTR,BOOL); +WINSHLWAPI HRESULT WINAPI UrlCreateFromPathA(LPCSTR,LPSTR,LPDWORD,DWORD); +WINSHLWAPI HRESULT WINAPI UrlCreateFromPathW(LPCWSTR,LPWSTR,LPDWORD,DWORD); +WINSHLWAPI HRESULT WINAPI UrlEscapeA(LPCSTR,LPSTR,LPDWORD,DWORD); +WINSHLWAPI HRESULT WINAPI UrlEscapeW(LPCWSTR,LPWSTR,LPDWORD,DWORD); +WINSHLWAPI LPCSTR WINAPI UrlGetLocationA(LPCSTR); +WINSHLWAPI LPCWSTR WINAPI UrlGetLocationW(LPCWSTR); +WINSHLWAPI HRESULT WINAPI UrlGetPartA(LPCSTR,LPSTR,LPDWORD,DWORD,DWORD); +WINSHLWAPI HRESULT WINAPI UrlGetPartW(LPCWSTR,LPWSTR,LPDWORD,DWORD,DWORD); +WINSHLWAPI HRESULT WINAPI UrlHashA(LPCSTR,LPBYTE,DWORD); +WINSHLWAPI HRESULT WINAPI UrlHashW(LPCWSTR,LPBYTE,DWORD); +WINSHLWAPI BOOL WINAPI UrlIsA(LPCSTR,URLIS); +WINSHLWAPI BOOL WINAPI UrlIsW(LPCWSTR,URLIS); +#define UrlIsFileUrlA(pszURL) UrlIsA(pzURL, URLIS_FILEURL) +#define UrlIsFileUrlW(pszURL) UrlIsW(pszURL, URLIS_FILEURL) +WINSHLWAPI BOOL WINAPI UrlIsNoHistoryA(LPCSTR); +WINSHLWAPI BOOL WINAPI UrlIsNoHistoryW(LPCWSTR); +WINSHLWAPI BOOL WINAPI UrlIsOpaqueA(LPCSTR); +WINSHLWAPI BOOL WINAPI UrlIsOpaqueW(LPCWSTR); +WINSHLWAPI HRESULT WINAPI UrlUnescapeA(LPSTR,LPSTR,LPDWORD,DWORD); +WINSHLWAPI HRESULT WINAPI UrlUnescapeW(LPWSTR,LPWSTR,LPDWORD,DWORD); +#define UrlUnescapeInPlaceA(pszUrl,dwFlags )\ + UrlUnescapeA(pszUrl, NULL, NULL, dwFlags | URL_UNESCAPE_INPLACE) +#define UrlUnescapeInPlaceW(pszUrl,dwFlags )\ + UrlUnescapeW(pszUrl, NULL, NULL, dwFlags | URL_UNESCAPE_INPLACE) +WINSHLWAPI DWORD WINAPI SHRegCloseUSKey(HUSKEY); +WINSHLWAPI LONG WINAPI SHRegCreateUSKeyA(LPCSTR,REGSAM,HUSKEY,PHUSKEY,DWORD); +WINSHLWAPI LONG WINAPI SHRegCreateUSKeyW(LPCWSTR,REGSAM,HUSKEY,PHUSKEY,DWORD); +WINSHLWAPI LONG WINAPI SHRegDeleteEmptyUSKeyA(HUSKEY,LPCSTR,SHREGDEL_FLAGS); +WINSHLWAPI LONG WINAPI SHRegDeleteEmptyUSKeyW(HUSKEY,LPCWSTR,SHREGDEL_FLAGS); +WINSHLWAPI LONG WINAPI SHRegDeleteUSValueA(HUSKEY,LPCSTR,SHREGDEL_FLAGS); +WINSHLWAPI LONG WINAPI SHRegDeleteUSValueW(HUSKEY,LPCWSTR,SHREGDEL_FLAGS); +WINSHLWAPI HKEY WINAPI SHRegDuplicateHKey(HKEY); +WINSHLWAPI DWORD WINAPI SHRegEnumUSKeyA(HUSKEY,DWORD,LPSTR,LPDWORD,SHREGENUM_FLAGS); +WINSHLWAPI DWORD WINAPI SHRegEnumUSKeyW(HUSKEY,DWORD,LPWSTR,LPDWORD,SHREGENUM_FLAGS); +WINSHLWAPI DWORD WINAPI SHRegEnumUSValueA(HUSKEY,DWORD,LPSTR,LPDWORD,LPDWORD,LPVOID,LPDWORD,SHREGENUM_FLAGS); +WINSHLWAPI DWORD WINAPI SHRegEnumUSValueW(HUSKEY,DWORD,LPWSTR,LPDWORD,LPDWORD,LPVOID,LPDWORD,SHREGENUM_FLAGS); +WINSHLWAPI BOOL WINAPI SHRegGetBoolUSValueA(LPCSTR,LPCSTR,BOOL,BOOL); +WINSHLWAPI BOOL WINAPI SHRegGetBoolUSValueW(LPCWSTR,LPCWSTR,BOOL,BOOL); +WINSHLWAPI DWORD WINAPI SHRegGetPathA(HKEY,LPCSTR,LPCSTR,LPSTR,DWORD); +WINSHLWAPI DWORD WINAPI SHRegGetPathW(HKEY,LPCWSTR,LPCWSTR,LPWSTR,DWORD); +WINSHLWAPI LONG WINAPI SHRegGetUSValueA(LPCSTR,LPCSTR,LPDWORD,LPVOID,LPDWORD,BOOL,LPVOID,DWORD); +WINSHLWAPI LONG WINAPI SHRegGetUSValueW(LPCWSTR,LPCWSTR,LPDWORD,LPVOID,LPDWORD,BOOL,LPVOID,DWORD); +WINSHLWAPI LONG WINAPI SHRegOpenUSKeyA(LPCSTR,REGSAM,HUSKEY,PHUSKEY,BOOL); +WINSHLWAPI LONG WINAPI SHRegOpenUSKeyW(LPCWSTR,REGSAM,HUSKEY,PHUSKEY,BOOL); +WINSHLWAPI DWORD WINAPI SHRegQueryInfoUSKeyA(HUSKEY,LPDWORD,LPDWORD,LPDWORD,LPDWORD,SHREGENUM_FLAGS); +WINSHLWAPI DWORD WINAPI SHRegQueryInfoUSKeyW(HUSKEY,LPDWORD,LPDWORD,LPDWORD,LPDWORD,SHREGENUM_FLAGS); +WINSHLWAPI LONG WINAPI SHRegQueryUSValueA(HUSKEY,LPCSTR,LPDWORD,LPVOID,LPDWORD,BOOL,LPVOID,DWORD); +WINSHLWAPI LONG WINAPI SHRegQueryUSValueW(HUSKEY,LPCWSTR,LPDWORD,LPVOID,LPDWORD,BOOL,LPVOID,DWORD); +WINSHLWAPI DWORD WINAPI SHRegSetPathA(HKEY,LPCSTR,LPCSTR,LPCSTR,DWORD); +WINSHLWAPI DWORD WINAPI SHRegSetPathW(HKEY,LPCWSTR,LPCWSTR,LPCWSTR,DWORD); +WINSHLWAPI LONG WINAPI SHRegSetUSValueA(LPCSTR,LPCSTR,DWORD,LPVOID,DWORD,DWORD); +WINSHLWAPI LONG WINAPI SHRegSetUSValueW(LPCWSTR,LPCWSTR,DWORD,LPVOID,DWORD,DWORD); +WINSHLWAPI LONG WINAPI SHRegWriteUSValueA(HUSKEY,LPCSTR,DWORD,LPVOID,DWORD,DWORD); +WINSHLWAPI LONG WINAPI SHRegWriteUSValueW(HUSKEY,LPCWSTR,DWORD,LPVOID,DWORD,DWORD); +WINSHLWAPI HRESULT WINAPI HashData(LPBYTE,DWORD,LPBYTE,DWORD); +WINSHLWAPI HPALETTE WINAPI SHCreateShellPalette(HDC); +WINSHLWAPI COLORREF WINAPI ColorHLSToRGB(WORD,WORD,WORD); +WINSHLWAPI COLORREF WINAPI ColorAdjustLuma(COLORREF,int,BOOL); +WINSHLWAPI void WINAPI ColorRGBToHLS(COLORREF,WORD*,WORD*,WORD*); +WINSHLWAPI int __cdecl wnsprintfA(LPSTR,int,LPCSTR,...); +WINSHLWAPI int __cdecl wnsprintfW(LPWSTR,int,LPCWSTR,...); +WINSHLWAPI int WINAPI wvnsprintfA(LPSTR,int,LPCSTR,va_list); +WINSHLWAPI int WINAPI wvnsprintfW(LPWSTR,int,LPCWSTR,va_list); + +HINSTANCE WINAPI MLLoadLibraryA(LPCSTR,HANDLE,DWORD,LPCSTR,BOOL); +HINSTANCE WINAPI MLLoadLibraryW(LPCWSTR,HANDLE,DWORD,LPCWSTR,BOOL); + +HRESULT WINAPI DllInstall(BOOL,LPCWSTR); + +#ifdef UNICODE +#define ChrCmpI ChrCmpIW +#define IntlStrEqN IntlStrEqNW +#define IntlStrEqNI IntlStrEqNIW +#define IntlStrEqWorker IntlStrEqWorkerW +#define SHStrDup SHStrDupW +#define StrCat StrCatW +#define StrCatBuff StrCatBuffW +#define StrChr StrChrW +#define StrChrI StrChrIW +#define StrCmp StrCmpW +#define StrCmpI StrCmpIW +#define StrCmpNI StrCmpNIW +#define StrCmpN StrCmpNW +#define StrCpyN StrCpyNW +#define StrCpy StrCpyW +#define StrCSpnI StrCSpnIW +#define StrCSpn StrCSpnW +#define StrDup StrDupW +#define StrFormatByteSize StrFormatByteSizeW +#define StrFormatKBSize StrFormatKBSizeW +#define StrFromTimeInterval StrFromTimeIntervalW +#define StrIsIntlEqual StrIsIntlEqualW +#define StrNCat StrNCatW +#define StrPBrk StrPBrkW +#define StrRChr StrRChrW +#define StrRChrI StrRChrIW +#ifndef __OBJC__ +#define StrRetToBuf StrRetToBufW +#define StrRetToStr StrRetToStrW +#endif +#define StrRStrI StrRStrIW +#define StrSpn StrSpnW +#define StrStrI StrStrIW +#define StrStr StrStrW +#define StrToInt StrToIntW +#define StrToIntEx StrToIntExW +#define StrTrim StrTrimW +#define PathAddBackslash PathAddBackslashW +#define PathAddExtension PathAddExtensionW +#define PathAppend PathAppendW +#define PathBuildRoot PathBuildRootW +#define PathCanonicalize PathCanonicalizeW +#define PathCombine PathCombineW +#define PathCommonPrefix PathCommonPrefixW +#define PathCompactPath PathCompactPathW +#define PathCompactPathEx PathCompactPathExW +#define PathCreateFromUrl PathCreateFromUrlW +#define PathFileExists PathFileExistsW +#define PathFindExtension PathFindExtensionW +#define PathFindFileName PathFindFileNameW +#define PathFindNextComponent PathFindNextComponentW +#define PathFindOnPath PathFindOnPathW +#define PathFindSuffixArray PathFindSuffixArrayW +#define PathGetArgs PathGetArgsW +#define PathGetCharType PathGetCharTypeW +#define PathGetDriveNumber PathGetDriveNumberW +#define PathIsContentType PathIsContentTypeW +#define PathIsDirectoryEmpty PathIsDirectoryEmptyW +#define PathIsDirectory PathIsDirectoryW +#define PathIsFileSpec PathIsFileSpecW +#define PathIsLFNFileSpec PathIsLFNFileSpecW +#define PathIsNetworkPath PathIsNetworkPathW +#define PathIsPrefix PathIsPrefixW +#define PathIsRelative PathIsRelativeW +#define PathIsRoot PathIsRootW +#define PathIsSameRoot PathIsSameRootW +#define PathIsSystemFolder PathIsSystemFolderW +#define PathIsUNCServerShare PathIsUNCServerShareW +#define PathIsUNCServer PathIsUNCServerW +#define PathIsUNC PathIsUNCW +#define PathIsURL PathIsURLW +#define PathMakePretty PathMakePrettyW +#define PathMakeSystemFolder PathMakeSystemFolderW +#define PathMatchSpec PathMatchSpecW +#define PathParseIconLocation PathParseIconLocationW +#define PathQuoteSpaces PathQuoteSpacesW +#define PathRelativePathTo PathRelativePathToW +#define PathRemoveArgs PathRemoveArgsW +#define PathRemoveBackslash PathRemoveBackslashW +#define PathRemoveBlanks PathRemoveBlanksW +#define PathRemoveExtension PathRemoveExtensionW +#define PathRemoveFileSpec PathRemoveFileSpecW +#define PathRenameExtension PathRenameExtensionW +#define PathSearchAndQualify PathSearchAndQualifyW +#define PathSetDlgItemPath PathSetDlgItemPathW +#define PathSkipRoot PathSkipRootW +#define PathStripPath PathStripPathW +#define PathStripToRoot PathStripToRootW +#define PathUndecorate PathUndecorateW +#define PathUnExpandEnvStrings PathUnExpandEnvStringsW +#define PathUnmakeSystemFolder PathUnmakeSystemFolderW +#define PathUnquoteSpaces PathUnquoteSpacesW +#ifndef __OBJC__ +#define SHCreateStreamOnFile SHCreateStreamOnFileW +#define SHOpenRegStream SHOpenRegStreamW +#define SHOpenRegStream2 SHOpenRegStream2W +#endif +#define SHCopyKey SHCopyKeyW +#define SHDeleteEmptyKey SHDeleteEmptyKeyW +#define SHDeleteKey SHDeleteKeyW +#define SHEnumKeyEx SHEnumKeyExW +#define SHQueryInfoKey SHRegQueryInfoKeyW +#define SHQueryValueEx SHQueryValueExW +#define SHEnumValue SHEnumValueW +#define SHGetValue SHGetValueW +#define SHSetValue SHSetValueW +#define SHDeleteValue SHDeleteValueW +#define AssocQueryKey AssocQueryKeyW +#define AssocQueryStringByKey AssocQueryStringByKeyW +#define AssocQueryString AssocQueryStringW +#define UrlApplyScheme UrlApplySchemeW +#define UrlCanonicalize UrlCanonicalizeW +#define UrlCombine UrlCombineW +#define UrlCompare UrlCompareW +#define UrlCreateFromPath UrlCreateFromPathW +#define UrlEscape UrlEscapeW +#define UrlGetLocation UrlGetLocationW +#define UrlGetPart UrlGetPartW +#define UrlHash UrlHashW +#define UrlIs UrlIsW +#define UrlIsFileUrl UrlIsFileUrlW +#define UrlIsNoHistory UrlIsNoHistoryW +#define UrlIsOpaque UrlIsOpaqueW +#define UrlUnescape UrlUnescapeW +#define UrlUnescapeInPlace UrlUnescapeInPlaceW +#define SHRegCreateUSKey SHRegCreateUSKeyW +#define SHRegDeleteEmptyUSKey SHRegDeleteEmptyUSKeyW +#define SHRegDeleteUSValue SHRegDeleteUSValueW +#define SHRegEnumUSKey SHRegEnumUSKeyW +#define SHRegEnumUSValue SHRegEnumUSValueW +#define SHRegGetBoolUSValue SHRegGetBoolUSValueW +#define SHRegGetPath SHRegGetPathW +#define SHRegGetUSValue SHRegGetUSValueW +#define SHRegOpenUSKey SHRegOpenUSKeyW +#define SHRegQueryInfoUSKey SHRegQueryInfoUSKeyW +#define SHRegQueryUSValue SHRegQueryUSValueW +#define SHRegSetPath SHRegSetPathW +#define SHRegSetUSValue SHRegSetUSValueW +#define SHRegWriteUSValue SHRegWriteUSValueW +#define wnsprintf wnsprintfW +#define wvnsprintf wvnsprintfW +#else /* UNICODE */ +#define ChrCmpI ChrCmpIA +#define IntlStrEqN IntlStrEqNA +#define IntlStrEqNI IntlStrEqNIA +#define IntlStrEqWorker IntlStrEqWorkerA +#define SHStrDup SHStrDupA +#define StrCat lstrcatA +#define StrCatBuff StrCatBuffA +#define StrChr StrChrA +#define StrChrI StrChrIA +#define StrCmp lstrcmpA +#define StrCmpI lstrcmpiA +#define StrCmpNI StrCmpNIA +#define StrCmpN StrCmpNA +#define StrCpyN lstrcpynA +#define StrCpy lstrcpyA +#define StrCSpnI StrCSpnIA +#define StrCSpn StrCSpnA +#define StrDup StrDupA +#define StrFormatByteSize StrFormatByteSizeA +#define StrFormatKBSize StrFormatKBSizeA +#define StrFromTimeInterval StrFromTimeIntervalA +#define StrIsIntlEqual StrIsIntlEqualA +#define StrNCat StrNCatA +#define StrPBrk StrPBrkA +#define StrRChr StrRChrA +#define StrRChrI StrRChrIA +#ifndef __OBJC__ +#define StrRetToBuf StrRetToBufA +#define StrRetToStr StrRetToStrA +#endif +#define StrRStrI StrRStrIA +#define StrSpn StrSpnA +#define StrStrI StrStrIA +#define StrStr StrStrA +#define StrToInt StrToIntA +#define StrToIntEx StrToIntExA +#define StrTrim StrTrimA +#define PathAddBackslash PathAddBackslashA +#define PathAddExtension PathAddExtensionA +#define PathAppend PathAppendA +#define PathBuildRoot PathBuildRootA +#define PathCanonicalize PathCanonicalizeA +#define PathCombine PathCombineA +#define PathCommonPrefix PathCommonPrefixA +#define PathCompactPath PathCompactPathA +#define PathCompactPathEx PathCompactPathExA +#define PathCreateFromUrl PathCreateFromUrlA +#define PathFileExists PathFileExistsA +#define PathFindExtension PathFindExtensionA +#define PathFindFileName PathFindFileNameA +#define PathFindNextComponent PathFindNextComponentA +#define PathFindOnPath PathFindOnPathA +#define PathFindSuffixArray PathFindSuffixArrayA +#define PathGetArgs PathGetArgsA +#define PathGetCharType PathGetCharTypeA +#define PathGetDriveNumber PathGetDriveNumberA +#define PathIsContentType PathIsContentTypeA +#define PathIsDirectoryEmpty PathIsDirectoryEmptyA +#define PathIsDirectory PathIsDirectoryA +#define PathIsFileSpec PathIsFileSpecA +#define PathIsLFNFileSpec PathIsLFNFileSpecA +#define PathIsNetworkPath PathIsNetworkPathA +#define PathIsPrefix PathIsPrefixA +#define PathIsRelative PathIsRelativeA +#define PathIsRoot PathIsRootA +#define PathIsSameRoot PathIsSameRootA +#define PathIsSystemFolder PathIsSystemFolderA +#define PathIsUNCServerShare PathIsUNCServerShareA +#define PathIsUNCServer PathIsUNCServerA +#define PathIsUNC PathIsUNCA +#define PathIsURL PathIsURLA +#define PathMakePretty PathMakePrettyA +#define PathMakeSystemFolder PathMakeSystemFolderA +#define PathMatchSpec PathMatchSpecA +#define PathParseIconLocation PathParseIconLocationA +#define PathQuoteSpaces PathQuoteSpacesA +#define PathRelativePathTo PathRelativePathToA +#define PathRemoveArgs PathRemoveArgsA +#define PathRemoveBackslash PathRemoveBackslashA +#define PathRemoveBlanks PathRemoveBlanksA +#define PathRemoveExtension PathRemoveExtensionA +#define PathRemoveFileSpec PathRemoveFileSpecA +#define PathRenameExtension PathRenameExtensionA +#define PathSearchAndQualify PathSearchAndQualifyA +#define PathSetDlgItemPath PathSetDlgItemPathA +#define PathSkipRoot PathSkipRootA +#define PathStripPath PathStripPathA +#define PathStripToRoot PathStripToRootA +#define PathUndecorate PathUndecorateA +#define PathUnExpandEnvStrings PathUnExpandEnvStringsA +#define PathUnmakeSystemFolder PathUnmakeSystemFolderA +#define PathUnquoteSpaces PathUnquoteSpacesA +#ifndef __OBJC__ +#define SHCreateStreamOnFile SHCreateStreamOnFileA +#define SHOpenRegStream SHOpenRegStreamA +#define SHOpenRegStream2 SHOpenRegStream2A +#endif +#define SHCopyKey SHCopyKeyA +#define SHDeleteEmptyKey SHDeleteEmptyKeyA +#define SHDeleteKey SHDeleteKeyA +#define SHEnumKeyEx SHEnumKeyExA +#define SHQueryInfoKey SHRegQueryInfoKeyA +#define SHQueryValueEx SHQueryValueExA +#define SHEnumValue SHEnumValueA +#define SHGetValue SHGetValueA +#define SHSetValue SHSetValueA +#define SHDeleteValue SHDeleteValueA +#define AssocQueryKey AssocQueryKeyA +#define AssocQueryStringByKey AssocQueryStringByKeyA +#define AssocQueryString AssocQueryStringA +#define UrlApplyScheme UrlApplySchemeA +#define UrlCanonicalize UrlCanonicalizeA +#define UrlCombine UrlCombineA +#define UrlCompare UrlCompareA +#define UrlCreateFromPath UrlCreateFromPathA +#define UrlEscape UrlEscapeA +#define UrlGetLocation UrlGetLocationA +#define UrlGetPart UrlGetPartA +#define UrlHash UrlHashA +#define UrlIs UrlIsA +#define UrlIsFileUrl UrlIsFileUrl +#define UrlIsNoHistory UrlIsNoHistoryA +#define UrlIsOpaque UrlIsOpaqueA +#define UrlUnescape UrlUnescapeA +#define UrlUnescapeInPlace UrlUnescapeInPlaceA +#define SHRegCreateUSKey SHRegCreateUSKeyA +#define SHRegDeleteEmptyUSKey SHRegDeleteEmptyUSKeyA +#define SHRegDeleteUSValue SHRegDeleteUSValueA +#define SHRegEnumUSKey SHRegEnumUSKeyA +#define SHRegEnumUSValue SHRegEnumUSValueA +#define SHRegGetBoolUSValue SHRegGetBoolUSValueA +#define SHRegGetPath SHRegGetPathA +#define SHRegGetUSValue SHRegGetUSValueA +#define SHRegOpenUSKey SHRegOpenUSKeyA +#define SHRegQueryInfoUSKey SHRegQueryInfoUSKeyA +#define SHRegQueryUSValue SHRegQueryUSValueA +#define SHRegSetPath SHRegSetPathA +#define SHRegSetUSValue SHRegSetUSValueA +#define SHRegWriteUSValue SHRegWriteUSValueA +#define wnsprintf wnsprintfA +#define wvnsprintf wvnsprintfA +#endif /* UNICODE */ + +#define StrToLong StrToInt + +#endif /* !RC_INVOKED */ + +#ifdef __cplusplus +} +#endif +#endif /* ! defined _SHLWAPI_H */ diff --git a/reactos/w32api/include/snmp.h b/reactos/w32api/include/snmp.h new file mode 100644 index 00000000000..f35a2be0818 --- /dev/null +++ b/reactos/w32api/include/snmp.h @@ -0,0 +1,259 @@ +/* + snmp.h - Header file for the Windows SNMP API + + Written by Filip Navara <xnavara@volny.cz> + + References (2003-08-25): + http://msdn.microsoft.com/library/en-us/snmp/snmp/snmp_reference.asp + + 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. +*/ + +#ifndef _SNMP_H +#define _SNMP_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifndef _WINDOWS_H +#include <windows.h> +#endif + +#include <pshpack4.h> + +#ifndef WINSNMPAPI +#define WINSNMPAPI WINAPI +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define DEFAULT_SNMP_PORT_UDP 161 +#define DEFAULT_SNMP_PORT_IPX 36879 +#define DEFAULT_SNMPTRAP_PORT_UDP 162 +#define DEFAULT_SNMPTRAP_PORT_IPX 36880 +#ifndef _SNMP_ASN_DEFINED +#define _SNMP_ASN_DEFINED +#define ASN_UNIVERSAL 0x00 +#define ASN_PRIMITIVE 0x00 +#define ASN_CONSTRUCTOR 0x20 +#define ASN_APPLICATION 0x40 +#define ASN_CONTEXT 0x80 +#define ASN_PRIVATE 0xC0 +#define SNMP_PDU_GET (ASN_CONTEXT | ASN_CONSTRUCTOR | 0) +#define SNMP_PDU_GETNEXT (ASN_CONTEXT | ASN_CONSTRUCTOR | 1) +#define SNMP_PDU_RESPONSE (ASN_CONTEXT | ASN_CONSTRUCTOR | 2) +#define SNMP_PDU_SET (ASN_CONTEXT | ASN_CONSTRUCTOR | 3) +#define SNMP_PDU_GETBULK (ASN_CONTEXT | ASN_CONSTRUCTOR | 4) +#define SNMP_PDU_V1TRAP (ASN_CONTEXT | ASN_CONSTRUCTOR | 4) +#define SNMP_PDU_INFORM (ASN_CONTEXT | ASN_CONSTRUCTOR | 6) +#define SNMP_PDU_TRAP (ASN_CONTEXT | ASN_CONSTRUCTOR | 7) +#define SNMP_PDU_REPORT (ASN_CONTEXT | ASN_CONSTRUCTOR | 8) +#endif /* _SNMP_ASN_DEFINED */ +#define ASN_INTEGER (ASN_UNIVERSAL | ASN_PRIMITIVE | 2) +#define ASN_BITS (ASN_UNIVERSAL | ASN_PRIMITIVE | 3) +#define ASN_OCTETSTRING (ASN_UNIVERSAL | ASN_PRIMITIVE | 4) +#define ASN_NULL (ASN_UNIVERSAL | ASN_PRIMITIVE | 5) +#define ASN_OBJECTIDENTIFIER (ASN_UNIVERSAL | ASN_PRIMITIVE | 6) +#define ASN_INTEGER32 ASN_INTEGER +#define ASN_SEQUENCE (ASN_UNIVERSAL | ASN_CONSTRUCTOR | 0x10) +#define ASN_SEQUENCEOF ASN_SEQUENCE +#define ASN_IPADDRESS (ASN_APPLICATION | ASN_PRIMITIVE | 0x00) +#define ASN_COUNTER32 (ASN_APPLICATION | ASN_PRIMITIVE | 0x01) +#define ASN_GAUGE32 (ASN_APPLICATION | ASN_PRIMITIVE | 0x02) +#define ASN_TIMETICKS (ASN_APPLICATION | ASN_PRIMITIVE | 0x03) +#define ASN_OPAQUE (ASN_APPLICATION | ASN_PRIMITIVE | 0x04) +#define ASN_COUNTER64 (ASN_APPLICATION | ASN_PRIMITIVE | 0x06) +#define ASN_UNSIGNED32 (ASN_APPLICATION | ASN_PRIMITIVE | 0x07) +#define SNMP_EXCEPTION_NOSUCHOBJECT (ASN_CONTEXT | ASN_PRIMITIVE | 0x00) +#define SNMP_EXCEPTION_NOSUCHINSTANCE (ASN_CONTEXT | ASN_PRIMITIVE | 0x01) +#define SNMP_EXCEPTION_ENDOFMIBVIEW (ASN_CONTEXT | ASN_PRIMITIVE | 0x02) +#define SNMP_EXTENSION_GET SNMP_PDU_GET +#define SNMP_EXTENSION_GET_NEXT SNMP_PDU_GETNEXT +#define SNMP_EXTENSION_GET_BULK SNMP_PDU_GETBULK +#define SNMP_EXTENSION_SET_TEST (ASN_PRIVATE | ASN_CONSTRUCTOR | 0x0) +#define SNMP_EXTENSION_SET_COMMIT SNMP_PDU_SET +#define SNMP_EXTENSION_SET_UNDO (ASN_PRIVATE | ASN_CONSTRUCTOR | 0x1) +#define SNMP_EXTENSION_SET_CLEANUP (ASN_PRIVATE | ASN_CONSTRUCTOR | 0x2) +#define SNMP_ERRORSTATUS_NOERROR 0 +#define SNMP_ERRORSTATUS_TOOBIG 1 +#define SNMP_ERRORSTATUS_NOSUCHNAME 2 +#define SNMP_ERRORSTATUS_BADVALUE 3 +#define SNMP_ERRORSTATUS_READONLY 4 +#define SNMP_ERRORSTATUS_GENERR 5 +#define SNMP_ERRORSTATUS_NOACCESS 6 +#define SNMP_ERRORSTATUS_WRONGTYPE 7 +#define SNMP_ERRORSTATUS_WRONGLENGTH 8 +#define SNMP_ERRORSTATUS_WRONGENCODING 9 +#define SNMP_ERRORSTATUS_WRONGVALUE 10 +#define SNMP_ERRORSTATUS_NOCREATION 11 +#define SNMP_ERRORSTATUS_INCONSISTENTVALUE 12 +#define SNMP_ERRORSTATUS_RESOURCEUNAVAILABLE 13 +#define SNMP_ERRORSTATUS_COMMITFAILED 14 +#define SNMP_ERRORSTATUS_UNDOFAILED 15 +#define SNMP_ERRORSTATUS_AUTHORIZATIONERROR 16 +#define SNMP_ERRORSTATUS_NOTWRITABLE 17 +#define SNMP_ERRORSTATUS_INCONSISTENTNAME 18 +#define SNMP_GENERICTRAP_COLDSTART 0 +#define SNMP_GENERICTRAP_WARMSTART 1 +#define SNMP_GENERICTRAP_LINKDOWN 2 +#define SNMP_GENERICTRAP_LINKUP 3 +#define SNMP_GENERICTRAP_AUTHFAILURE 4 +#define SNMP_GENERICTRAP_EGPNEIGHLOSS 5 +#define SNMP_GENERICTRAP_ENTERSPECIFIC 6 +#define SNMP_ACCESS_NONE 0 +#define SNMP_ACCESS_NOTIFY 1 +#define SNMP_ACCESS_READ_ONLY 2 +#define SNMP_ACCESS_READ_WRITE 3 +#define SNMP_ACCESS_READ_CREATE 4 +#define SNMPAPI_ERROR FALSE +#define SNMPAPI_NOERROR TRUE +#define SNMP_LOG_SILENT 0 +#define SNMP_LOG_FATAL 1 +#define SNMP_LOG_ERROR 2 +#define SNMP_LOG_WARNING 3 +#define SNMP_LOG_TRACE 4 +#define SNMP_LOG_VERBOSE 5 +#define SNMP_OUTPUT_TO_CONSOLE 1 +#define SNMP_OUTPUT_TO_LOGFILE 2 +#define SNMP_OUTPUT_TO_EVENTLOG 4 +#define SNMP_OUTPUT_TO_DEBUGGER 8 +#define SNMP_MAX_OID_LEN 128 +#define SNMP_MEM_ALLOC_ERROR 1 +#define SNMP_BERAPI_INVALID_LENGTH 10 +#define SNMP_BERAPI_INVALID_TAG 11 +#define SNMP_BERAPI_OVERFLOW 12 +#define SNMP_BERAPI_SHORT_BUFFER 13 +#define SNMP_BERAPI_INVALID_OBJELEM 14 +#define SNMP_PDUAPI_UNRECOGNIZED_PDU 20 +#define SNMP_PDUAPI_INVALID_ES 21 +#define SNMP_PDUAPI_INVALID_GT 22 +#define SNMP_AUTHAPI_INVALID_VERSION 30 +#define SNMP_AUTHAPI_INVALID_MSG_TYPE 31 +#define SNMP_AUTHAPI_TRIV_AUTH_FAILED 32 + +#ifndef RC_INVOKED + +typedef INT SNMPAPI; +typedef LONG AsnInteger32; +typedef ULONG AsnUnsigned32; +typedef ULARGE_INTEGER AsnCounter64; +typedef AsnUnsigned32 AsnCounter32; +typedef AsnUnsigned32 AsnGauge32; +typedef AsnUnsigned32 AsnTimeticks; +typedef struct { + BYTE *stream; + UINT length; + BOOL dynamic; +} AsnOctetString, AsnBits, AsnSequence, AsnImplicitSequence, AsnIPAddress, AsnNetworkAddress, AsnDisplayString, AsnOpaque; +typedef struct { + UINT idLength; + UINT *ids; +} AsnObjectIdentifier, AsnObjectName; +typedef struct { + BYTE asnType; + union { + AsnInteger32 number; + AsnUnsigned32 unsigned32; + AsnCounter64 counter64; + AsnOctetString string; + AsnBits bits; + AsnObjectIdentifier object; + AsnSequence sequence; + AsnIPAddress address; + AsnCounter32 counter; + AsnGauge32 gauge; + AsnTimeticks ticks; + AsnOpaque arbitrary; + } asnValue; +} AsnAny, AsnObjectSyntax; +typedef struct { + AsnObjectName name; + AsnObjectSyntax value; +} SnmpVarBind; +typedef struct { + SnmpVarBind *list; + UINT len; +} SnmpVarBindList; + +VOID WINSNMPAPI SnmpExtensionClose(void); +BOOL WINSNMPAPI SnmpExtensionInit(DWORD,HANDLE*,AsnObjectIdentifier*); +BOOL WINSNMPAPI SnmpExtensionInitEx(AsnObjectIdentifier*); +BOOL WINSNMPAPI SnmpExtensionMonitor(LPVOID); +BOOL WINSNMPAPI SnmpExtensionQuery(BYTE,SnmpVarBindList*,AsnInteger32*,AsnInteger32*); +BOOL WINSNMPAPI SnmpExtensionQueryEx(DWORD,DWORD,SnmpVarBindList*,AsnOctetString*,AsnInteger32*,AsnInteger32*); +BOOL WINSNMPAPI SnmpExtensionTrap(AsnObjectIdentifier*,AsnInteger32*,AsnInteger32*,AsnTimeticks*,SnmpVarBindList*); +DWORD WINSNMPAPI SnmpSvcGetUptime(void); +VOID WINSNMPAPI SnmpSvcSetLogLevel(INT); +VOID WINSNMPAPI SnmpSvcSetLogType(INT); +SNMPAPI WINSNMPAPI SnmpUtilAsnAnyCpy(AsnAny*,AsnAny*); +VOID WINSNMPAPI SnmpUtilAsnAnyFree(AsnAny*); +VOID WINSNMPAPI SnmpUtilDbgPrint(INT,LPSTR,...); +LPSTR WINSNMPAPI SnmpUtilIdsToA(UINT*,UINT); +LPVOID WINSNMPAPI SnmpUtilMemAlloc(UINT); +VOID WINSNMPAPI SnmpUtilMemFree(LPVOID); +LPVOID WINSNMPAPI SnmpUtilMemReAlloc(LPVOID,UINT); +SNMPAPI WINSNMPAPI SnmpUtilOctetsCmp(AsnOctetString*,AsnOctetString*); +SNMPAPI WINSNMPAPI SnmpUtilOctetsCpy(AsnOctetString*,AsnOctetString*); +VOID WINSNMPAPI SnmpUtilOctetsFree(AsnOctetString*); +SNMPAPI WINSNMPAPI SnmpUtilOctetsNCmp(AsnOctetString*,AsnOctetString*,UINT); +SNMPAPI WINSNMPAPI SnmpUtilOidAppend(AsnObjectIdentifier*,AsnObjectIdentifier*); +SNMPAPI WINSNMPAPI SnmpUtilOidCmp(AsnObjectIdentifier*,AsnObjectIdentifier*); +SNMPAPI WINSNMPAPI SnmpUtilOidCpy(AsnObjectIdentifier*,AsnObjectIdentifier*); +VOID WINSNMPAPI SnmpUtilOidFree(AsnObjectIdentifier*); +SNMPAPI WINSNMPAPI SnmpUtilOidNCmp(AsnObjectIdentifier*,AsnObjectIdentifier*,UINT); +LPSTR WINSNMPAPI SnmpUtilOidToA(AsnObjectIdentifier*); +VOID WINSNMPAPI SnmpUtilPrintAsnAny(AsnAny*); +VOID WINSNMPAPI SnmpUtilPrintOid(AsnObjectIdentifier*); +SNMPAPI WINSNMPAPI SnmpUtilVarBindCpy( SnmpVarBind*,SnmpVarBind*); +SNMPAPI WINSNMPAPI SnmpUtilVarBindListCpy(SnmpVarBindList*,SnmpVarBindList*); +VOID WINSNMPAPI SnmpUtilVarBindFree(SnmpVarBind*); +VOID WINSNMPAPI SnmpUtilVarBindListFree(SnmpVarBindList*); + +#ifndef SNMPSTRICT +#define SNMP_malloc SnmpUtilMemAlloc +#define SNMP_free SnmpUtilMemFree +#define SNMP_realloc SnmpUtilMemReAlloc +#define SNMP_DBG_malloc SnmpUtilMemAlloc +#define SNMP_DBG_free SnmpUtilMemFree +#define SNMP_DBG_realloc SnmpUtilMemReAlloc +#define SNMP_oidappend SnmpUtilOidAppend +#define SNMP_oidcmp SnmpUtilOidCmp +#define SNMP_oidcpy SnmpUtilOidCpy +#define SNMP_oidfree SnmpUtilOidFree +#define SNMP_oidncmp SnmpUtilOidNCmp +#define SNMP_printany SnmpUtilPrintAsnAny +#define SNMP_CopyVarBind SnmpUtilVarBindCpy +#define SNMP_CopyVarBindList SnmpUtilVarBindListCpy +#define SNMP_FreeVarBind SnmpUtilVarBindFree +#define SNMP_FreeVarBindList SnmpUtilVarBindListFree +#define ASN_RFC1155_IPADDRESS ASN_IPADDRESS +#define ASN_RFC1155_COUNTER ASN_COUNTER32 +#define ASN_RFC1155_GAUGE ASN_GAUGE32 +#define ASN_RFC1155_TIMETICKS ASN_TIMETICKS +#define ASN_RFC1155_OPAQUE ASN_OPAQUE +#define ASN_RFC1213_DISPSTRING ASN_OCTETSTRING +#define ASN_RFC1157_GETREQUEST SNMP_PDU_GET +#define ASN_RFC1157_GETNEXTREQUEST SNMP_PDU_GETNEXT +#define ASN_RFC1157_GETRESPONSE SNMP_PDU_RESPONSE +#define ASN_RFC1157_SETREQUEST SNMP_PDU_SET +#define ASN_RFC1157_TRAP SNMP_PDU_V1TRAP +#define ASN_CONTEXTSPECIFIC ASN_CONTEXT +#define ASN_PRIMATIVE ASN_PRIMITIVE +#define RFC1157VarBindList SnmpVarBindList +#define RFC1157VarBind SnmpVarBind +#define AsnInteger AsnInteger32 +#define AsnCounter AsnCounter32 +#define AsnGauge AsnGauge32 +#endif /* SNMPSTRICT */ + +#endif /* RC_INVOKED */ + +#ifdef __cplusplus +} +#endif +#include <poppack.h> +#endif diff --git a/reactos/w32api/include/sql.h b/reactos/w32api/include/sql.h new file mode 100644 index 00000000000..2f0391b759f --- /dev/null +++ b/reactos/w32api/include/sql.h @@ -0,0 +1,408 @@ +#ifndef _SQL_H +#define _SQL_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#ifndef ODBCVER +#define ODBCVER 0x0351 +#endif +#include <sqltypes.h> +#define SQL_ACCESSIBLE_PROCEDURES 20 +#define SQL_ACCESSIBLE_TABLES 19 +#define SQL_ALL_TYPES 0 +#define SQL_ALTER_TABLE 86 +#define SQL_API_SQLALLOCCONNECT 1 +#define SQL_API_SQLALLOCENV 2 +#define SQL_API_SQLALLOCSTMT 3 +#define SQL_API_SQLBINDCOL 4 +#define SQL_API_SQLCANCEL 5 +#define SQL_API_SQLCOLUMNS 40 +#define SQL_API_SQLCONNECT 7 +#define SQL_API_SQLDATASOURCES 57 +#define SQL_API_SQLDESCRIBECOL 8 +#define SQL_API_SQLDISCONNECT 9 +#define SQL_API_SQLERROR 10 +#define SQL_API_SQLEXECDIRECT 11 +#define SQL_API_SQLEXECUTE 12 +#define SQL_API_SQLFETCH 13 +#define SQL_API_SQLFREECONNECT 14 +#define SQL_API_SQLFREEENV 15 +#define SQL_API_SQLFREESTMT 16 +#define SQL_API_SQLGETCONNECTOPTION 42 +#define SQL_API_SQLGETCURSORNAME 17 +#define SQL_API_SQLGETDATA 43 +#define SQL_API_SQLGETFUNCTIONS 44 +#define SQL_API_SQLGETINFO 45 +#define SQL_API_SQLGETSTMTOPTION 46 +#define SQL_API_SQLGETTYPEINFO 47 +#define SQL_API_SQLNUMRESULTCOLS 18 +#define SQL_API_SQLPARAMDATA 48 +#define SQL_API_SQLPREPARE 19 +#define SQL_API_SQLPUTDATA 49 +#define SQL_API_SQLROWCOUNT 20 +#define SQL_API_SQLSETCONNECTOPTION 50 +#define SQL_API_SQLSETCURSORNAME 21 +#define SQL_API_SQLSETPARAM 22 +#define SQL_API_SQLSETSTMTOPTION 51 +#define SQL_API_SQLSPECIALCOLUMNS 52 +#define SQL_API_SQLSTATISTICS 53 +#define SQL_API_SQLTABLES 54 +#define SQL_API_SQLTRANSACT 23 +#define SQL_CB_CLOSE 1 +#define SQL_CB_DELETE 0 +#define SQL_CB_PRESERVE 2 +#define SQL_CHAR 1 +#define SQL_CLOSE 0 +#define SQL_COMMIT 0 +#define SQL_CURSOR_COMMIT_BEHAVIOR 23 +#define SQL_DATA_AT_EXEC (-2) +#define SQL_DATA_SOURCE_NAME 2 +#define SQL_DATA_SOURCE_READ_ONLY 25 +#define SQL_DBMS_NAME 17 +#define SQL_DBMS_VER 18 +#define SQL_DECIMAL 3 +#define SQL_DEFAULT_TXN_ISOLATION 26 +#define SQL_DOUBLE 8 +#define SQL_DROP 1 +#define SQL_ERROR (-1) +#define SQL_FD_FETCH_ABSOLUTE 16 +#define SQL_FD_FETCH_FIRST 2 +#define SQL_FD_FETCH_LAST 4 +#define SQL_FD_FETCH_NEXT 1 +#define SQL_FD_FETCH_PRIOR 8 +#define SQL_FD_FETCH_RELATIVE 32 +#define SQL_FETCH_ABSOLUTE 5 +#define SQL_FETCH_DIRECTION 8 +#define SQL_FETCH_FIRST 2 +#define SQL_FETCH_LAST 3 +#define SQL_FETCH_NEXT 1 +#define SQL_FETCH_PRIOR 4 +#define SQL_FETCH_RELATIVE 6 +#define SQL_FLOAT 6 +#define SQL_GD_ANY_COLUMN 1 +#define SQL_GD_ANY_ORDER 2 +#define SQL_GETDATA_EXTENSIONS 81 +#define SQL_IC_LOWER 2 +#define SQL_IC_MIXED 4 +#define SQL_IC_SENSITIVE 3 +#define SQL_IC_UPPER 1 +#define SQL_IDENTIFIER_CASE 28 +#define SQL_IDENTIFIER_QUOTE_CHAR 29 +#define SQL_INDEX_ALL 1 +#define SQL_INDEX_CLUSTERED 1 +#define SQL_INDEX_HASHED 2 +#define SQL_INDEX_OTHER 3 +#define SQL_INDEX_UNIQUE 0 +#define SQL_INTEGER 4 +#define SQL_INTEGRITY 73 +#define SQL_INVALID_HANDLE (-2) +#define SQL_MAX_CATALOG_NAME_LEN 34 +#define SQL_MAX_COLUMN_NAME_LEN 30 +#define SQL_MAX_COLUMNS_IN_GROUP_BY 97 +#define SQL_MAX_COLUMNS_IN_INDEX 98 +#define SQL_MAX_COLUMNS_IN_ORDER_BY 99 +#define SQL_MAX_COLUMNS_IN_SELECT 100 +#define SQL_MAX_COLUMNS_IN_TABLE 101 +#define SQL_MAX_CURSOR_NAME_LEN 31 +#define SQL_MAX_INDEX_SIZE 102 +#define SQL_MAX_MESSAGE_LENGTH 512 +#define SQL_MAX_ROW_SIZE 104 +#define SQL_MAX_SCHEMA_NAME_LEN 32 +#define SQL_MAX_STATEMENT_LEN 105 +#define SQL_MAX_TABLE_NAME_LEN 35 +#define SQL_MAX_TABLES_IN_SELECT 106 +#define SQL_MAX_USER_NAME_LEN 107 +#define SQL_MAXIMUM_CATALOG_NAME_LENGTH SQL_MAX_CATALOG_NAME_LEN +#define SQL_MAXIMUM_COLUMN_NAME_LENGTH SQL_MAX_COLUMN_NAME_LEN +#define SQL_MAXIMUM_COLUMNS_IN_GROUP_BY SQL_MAX_COLUMNS_IN_GROUP_BY +#define SQL_MAXIMUM_COLUMNS_IN_INDEX SQL_MAX_COLUMNS_IN_INDEX +#define SQL_MAXIMUM_COLUMNS_IN_ORDER_BY SQL_MAX_COLUMNS_IN_ORDER_BY +#define SQL_MAXIMUM_COLUMNS_IN_SELECT SQL_MAX_COLUMNS_IN_SELECT +#define SQL_MAXIMUM_CURSOR_NAME_LENGTH SQL_MAX_CURSOR_NAME_LEN +#define SQL_MAXIMUM_INDEX_SIZE SQL_MAX_INDEX_SIZE +#define SQL_MAXIMUM_ROW_SIZE SQL_MAX_ROW_SIZE +#define SQL_MAXIMUM_SCHEMA_NAME_LENGTH SQL_MAX_SCHEMA_NAME_LEN +#define SQL_MAXIMUM_STATEMENT_LENGTH SQL_MAX_STATEMENT_LEN +#define SQL_MAXIMUM_TABLES_IN_SELECT SQL_MAX_TABLES_IN_SELECT +#define SQL_MAXIMUM_USER_NAME_LENGTH SQL_MAX_USER_NAME_LEN +#define SQL_NC_HIGH 0 +#define SQL_NC_LOW 1 +#define SQL_NEED_DATA 99 +#define SQL_NO_NULLS 0 +#define SQL_NTS (-3) +#define SQL_NTSL (-3L) +#define SQL_NULL_COLLATION 85 +#define SQL_NULL_DATA (-1) +#define SQL_NULL_HDBC 0 +#define SQL_NULL_HENV 0 +#define SQL_NULL_HSTMT 0 +#define SQL_NULLABLE 1 +#define SQL_NULLABLE_UNKNOWN 2 +#define SQL_NUMERIC 2 +#define SQL_ORDER_BY_COLUMNS_IN_SELECT 90 +#define SQL_PC_PSEUDO 2 +#define SQL_PC_UNKNOWN 0 +#define SQL_REAL 7 +#define SQL_RESET_PARAMS 3 +#define SQL_ROLLBACK 1 +#define SQL_SCCO_LOCK 2 +#define SQL_SCCO_OPT_ROWVER 4 +#define SQL_SCCO_OPT_VALUES 8 +#define SQL_SCCO_READ_ONLY 1 +#define SQL_SCOPE_CURROW 0 +#define SQL_SCOPE_SESSION 2 +#define SQL_SCOPE_TRANSACTION 1 +#define SQL_SCROLL_CONCURRENCY 43 +#define SQL_SEARCH_PATTERN_ESCAPE 14 +#define SQL_SERVER_NAME 13 +#define SQL_SMALLINT 5 +#define SQL_SPECIAL_CHARACTERS 94 +#define SQL_STILL_EXECUTING 2 +#define SQL_SUCCEEDED(rc) (((rc)&(~1))==0) +#define SQL_SUCCESS 0 +#define SQL_SUCCESS_WITH_INFO 1 +#define SQL_TC_ALL 2 +#define SQL_TC_DDL_COMMIT 3 +#define SQL_TC_DDL_IGNORE 4 +#define SQL_TC_DML 1 +#define SQL_TC_NONE 0 +#define SQL_TRANSACTION_CAPABLE SQL_TXN_CAPABLE +#define SQL_TRANSACTION_ISOLATION_OPTION SQL_TXN_ISOLATION_OPTION +#define SQL_TRANSACTION_READ_COMMITTED SQL_TXN_READ_COMMITTED +#define SQL_TRANSACTION_READ_UNCOMMITTED SQL_TXN_READ_UNCOMMITTED +#define SQL_TRANSACTION_REPEATABLE_READ SQL_TXN_REPEATABLE_READ +#define SQL_TRANSACTION_SERIALIZABLE SQL_TXN_SERIALIZABLE +#define SQL_TXN_CAPABLE 46 +#define SQL_TXN_ISOLATION_OPTION 72 +#define SQL_TXN_READ_COMMITTED 2 +#define SQL_TXN_READ_UNCOMMITTED 1 +#define SQL_TXN_REPEATABLE_READ 4 +#define SQL_TXN_SERIALIZABLE 8 +#define SQL_UNBIND 2 +#define SQL_UNKNOWN_TYPE 0 +#define SQL_USER_NAME 47 +#define SQL_VARCHAR 12 +#if (ODBCVER >= 0x0200) +#define SQL_AT_ADD_COLUMN 1 +#define SQL_AT_DROP_COLUMN 2 +#endif /* ODBCVER >= 0x0200 */ +#if (ODBCVER >= 0x0201) +#define SQL_OJ_LEFT 1 +#define SQL_OJ_RIGHT 2 +#define SQL_OJ_FULL 4 +#define SQL_OJ_NESTED 8 +#define SQL_OJ_NOT_ORDERED 16 +#define SQL_OJ_INNER 32 +#define SQL_OJ_ALL_COMPARISON_OPS 64 +#endif /* ODBCVER >= 0x0201 */ +#if (ODBCVER >= 0x0300) +#define SQL_AM_CONNECTION 1 +#define SQL_AM_NONE 0 +#define SQL_AM_STATEMENT 2 +#define SQL_API_SQLALLOCHANDLE 1001 +#define SQL_API_SQLBINDPARAM 1002 +#define SQL_API_SQLCLOSECURSOR 1003 +#define SQL_API_SQLCOLATTRIBUTE 6 +#define SQL_API_SQLCOPYDESC 1004 +#define SQL_API_SQLENDTRAN 1005 +#define SQL_API_SQLFETCHSCROLL 1021 +#define SQL_API_SQLFREEHANDLE 1006 +#define SQL_API_SQLGETCONNECTATTR 1007 +#define SQL_API_SQLGETDESCFIELD 1008 +#define SQL_API_SQLGETDESCREC 1009 +#define SQL_API_SQLGETDIAGFIELD 1010 +#define SQL_API_SQLGETDIAGREC 1011 +#define SQL_API_SQLGETENVATTR 1012 +#define SQL_API_SQLGETSTMTATTR 1014 +#define SQL_API_SQLSETCONNECTATTR 1016 +#define SQL_API_SQLSETDESCFIELD 1017 +#define SQL_API_SQLSETDESCREC 1018 +#define SQL_API_SQLSETENVATTR 1019 +#define SQL_API_SQLSETSTMTATTR 1020 +#define SQL_ARD_TYPE (-99) +#define SQL_AT_ADD_CONSTRAINT 8 +#define SQL_ATTR_APP_PARAM_DESC 10011 +#define SQL_ATTR_APP_ROW_DESC 10010 +#define SQL_ATTR_AUTO_IPD 10001 +#define SQL_ATTR_CURSOR_SCROLLABLE (-1) +#define SQL_ATTR_CURSOR_SENSITIVITY (-2) +#define SQL_ATTR_IMP_PARAM_DESC 10013 +#define SQL_ATTR_IMP_ROW_DESC 10012 +#define SQL_ATTR_METADATA_ID 10014 +#define SQL_ATTR_OUTPUT_NTS 10001 +#define SQL_CATALOG_NAME 10003 +#define SQL_CODE_DATE 1 +#define SQL_CODE_TIME 2 +#define SQL_CODE_TIMESTAMP 3 +#define SQL_COLLATION_SEQ 10004 +#define SQL_CURSOR_SENSITIVITY 10001 +#define SQL_DATE_LEN 10 +#define SQL_DATETIME 9 +#define SQL_DEFAULT 99 +#define SQL_DESC_ALLOC_AUTO 1 +#define SQL_DESC_ALLOC_TYPE 1099 +#define SQL_DESC_ALLOC_USER 2 +#define SQL_DESC_COUNT 1001 +#define SQL_DESC_DATA_PTR 1010 +#define SQL_DESC_DATETIME_INTERVAL_CODE 1007 +#define SQL_DESC_INDICATOR_PTR 1009 +#define SQL_DESC_LENGTH 1003 +#define SQL_DESC_NAME 1011 +#define SQL_DESC_NULLABLE 1008 +#define SQL_DESC_OCTET_LENGTH 1013 +#define SQL_DESC_OCTET_LENGTH_PTR 1004 +#define SQL_DESC_PRECISION 1005 +#define SQL_DESC_SCALE 1006 +#define SQL_DESC_TYPE 1002 +#define SQL_DESC_UNNAMED 1012 +#define SQL_DESCRIBE_PARAMETER 10002 +#define SQL_DIAG_ALTER_DOMAIN 3 +#define SQL_DIAG_ALTER_TABLE 4 +#define SQL_DIAG_CALL 7 +#define SQL_DIAG_CLASS_ORIGIN 8 +#define SQL_DIAG_CONNECTION_NAME 10 +#define SQL_DIAG_CREATE_ASSERTION 6 +#define SQL_DIAG_CREATE_CHARACTER_SET 8 +#define SQL_DIAG_CREATE_COLLATION 10 +#define SQL_DIAG_CREATE_DOMAIN 23 +#define SQL_DIAG_CREATE_INDEX (-1) +#define SQL_DIAG_CREATE_SCHEMA 64 +#define SQL_DIAG_CREATE_TABLE 77 +#define SQL_DIAG_CREATE_TRANSLATION 79 +#define SQL_DIAG_CREATE_VIEW 84 +#define SQL_DIAG_DELETE_WHERE 19 +#define SQL_DIAG_DROP_ASSERTION 24 +#define SQL_DIAG_DROP_CHARACTER_SET 25 +#define SQL_DIAG_DROP_COLLATION 26 +#define SQL_DIAG_DROP_DOMAIN 27 +#define SQL_DIAG_DROP_INDEX (-2) +#define SQL_DIAG_DROP_SCHEMA 31 +#define SQL_DIAG_DROP_TABLE 32 +#define SQL_DIAG_DROP_TRANSLATION 33 +#define SQL_DIAG_DROP_VIEW 36 +#define SQL_DIAG_DYNAMIC_DELETE_CURSOR 38 +#define SQL_DIAG_DYNAMIC_FUNCTION 7 +#define SQL_DIAG_DYNAMIC_FUNCTION_CODE 12 +#define SQL_DIAG_DYNAMIC_UPDATE_CURSOR 81 +#define SQL_DIAG_GRANT 48 +#define SQL_DIAG_INSERT 50 +#define SQL_DIAG_MESSAGE_TEXT 6 +#define SQL_DIAG_NATIVE 5 +#define SQL_DIAG_NUMBER 2 +#define SQL_DIAG_RETURNCODE 1 +#define SQL_DIAG_REVOKE 59 +#define SQL_DIAG_ROW_COUNT 3 +#define SQL_DIAG_SELECT_CURSOR 85 +#define SQL_DIAG_SERVER_NAME 11 +#define SQL_DIAG_SQLSTATE 4 +#define SQL_DIAG_SUBCLASS_ORIGIN 9 +#define SQL_DIAG_UNKNOWN_STATEMENT 0 +#define SQL_DIAG_UPDATE_WHERE 82 +#define SQL_FALSE 0 +#define SQL_HANDLE_DBC 2 +#define SQL_HANDLE_DESC 4 +#define SQL_HANDLE_ENV 1 +#define SQL_HANDLE_STMT 3 +#define SQL_INSENSITIVE 1 +#define SQL_MAX_CONCURRENT_ACTIVITIES 1 +#define SQL_MAX_DRIVER_CONNECTIONS 0 +#define SQL_MAX_IDENTIFIER_LEN 10005 +#define SQL_MAXIMUM_CONCURRENT_ACTIVITIES SQL_MAX_CONCURRENT_ACTIVITIES +#define SQL_MAXIMUM_DRIVER_CONNECTIONS SQL_MAX_DRIVER_CONNECTIONS +#define SQL_MAXIMUM_IDENTIFIER_LENGTH SQL_MAX_IDENTIFIER_LEN +#define SQL_NAMED 0 +#define SQL_NO_DATA 100 +#define SQL_NONSCROLLABLE 0 +#define SQL_NULL_HANDLE 0L +#define SQL_NULL_HDESC 0 +#define SQL_OJ_CAPABILITIES 115 +#define SQL_OUTER_JOIN_CAPABILITIES SQL_OJ_CAPABILITIES +#define SQL_PC_NON_PSEUDO 1 +#define SQL_PRED_BASIC 2 +#define SQL_PRED_CHAR 1 +#define SQL_PRED_NONE 0 +#define SQL_ROW_IDENTIFIER 1 +#define SQL_SCROLLABLE 1 +#define SQL_SENSITIVE 2 +#define SQL_TIME_LEN 8 +#define SQL_TIMESTAMP_LEN 19 +#define SQL_TRUE 1 +#define SQL_TYPE_DATE 91 +#define SQL_TYPE_TIME 92 +#define SQL_TYPE_TIMESTAMP 93 +#define SQL_UNNAMED 1 +#define SQL_UNSPECIFIED 0 +#define SQL_XOPEN_CLI_YEAR 10000 +#endif /* ODBCVER >= 0x0300 */ + +#ifndef RC_INVOKED +SQLRETURN SQL_API SQLAllocConnect(SQLHENV,SQLHDBC*); /* deprecated */ +SQLRETURN SQL_API SQLAllocEnv(SQLHENV*); /* deprecated */ +SQLRETURN SQL_API SQLAllocStmt(SQLHDBC,SQLHSTMT*); /* deprecated */ +SQLRETURN SQL_API SQLBindCol(SQLHSTMT,SQLUSMALLINT,SQLSMALLINT,SQLPOINTER,SQLLEN,SQLLEN*); +SQLRETURN SQL_API SQLCancel(SQLHSTMT); +SQLRETURN SQL_API SQLConnect(SQLHDBC,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT); +SQLRETURN SQL_API SQLDescribeCol(SQLHSTMT,SQLUSMALLINT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*,SQLSMALLINT*,SQLULEN*,SQLSMALLINT*,SQLSMALLINT*); +SQLRETURN SQL_API SQLDisconnect(SQLHDBC); +SQLRETURN SQL_API SQLError(SQLHENV,SQLHDBC,SQLHSTMT,SQLCHAR*,SQLINTEGER*,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*); /* deprecated */ +SQLRETURN SQL_API SQLExecDirect(SQLHSTMT,SQLCHAR*,SQLINTEGER); +SQLRETURN SQL_API SQLExecute(SQLHSTMT); +SQLRETURN SQL_API SQLFetch(SQLHSTMT); +SQLRETURN SQL_API SQLFreeConnect(SQLHDBC); /* deprecated */ +SQLRETURN SQL_API SQLFreeEnv(SQLHENV); /* deprecated */ +SQLRETURN SQL_API SQLFreeStmt(SQLHSTMT,SQLUSMALLINT); +SQLRETURN SQL_API SQLGetCursorName(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*); +SQLRETURN SQL_API SQLNumResultCols(SQLHSTMT,SQLSMALLINT*); +SQLRETURN SQL_API SQLPrepare(SQLHSTMT,SQLCHAR*,SQLINTEGER); +SQLRETURN SQL_API SQLRowCount(SQLHSTMT,SQLLEN*); +SQLRETURN SQL_API SQLSetCursorName(SQLHSTMT,SQLCHAR*,SQLSMALLINT); +SQLRETURN SQL_API SQLTransact(SQLHENV,SQLHDBC,SQLUSMALLINT); +SQLRETURN SQL_API SQLSetParam(SQLHSTMT,SQLUSMALLINT,SQLSMALLINT,SQLSMALLINT,SQLULEN,SQLSMALLINT,SQLPOINTER,SQLLEN*); /* deprecated */ +SQLRETURN SQL_API SQLColumns(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT); +SQLRETURN SQL_API SQLGetConnectOption(SQLHDBC,SQLUSMALLINT,SQLPOINTER); /* deprecated */ +SQLRETURN SQL_API SQLGetData(SQLHSTMT,SQLUSMALLINT,SQLSMALLINT,SQLPOINTER,SQLLEN,SQLLEN*); +SQLRETURN SQL_API SQLGetFunctions(SQLHDBC,SQLUSMALLINT,SQLUSMALLINT*); +SQLRETURN SQL_API SQLGetInfo(SQLHDBC,SQLUSMALLINT,SQLPOINTER,SQLSMALLINT,SQLSMALLINT*); +SQLRETURN SQL_API SQLGetStmtOption(SQLHSTMT,SQLUSMALLINT,SQLPOINTER); /* deprecated */ +SQLRETURN SQL_API SQLGetTypeInfo(SQLHSTMT,SQLSMALLINT); +SQLRETURN SQL_API SQLParamData(SQLHSTMT,SQLPOINTER*); +SQLRETURN SQL_API SQLPutData(SQLHSTMT,SQLPOINTER,SQLLEN); +SQLRETURN SQL_API SQLSetConnectOption(SQLHDBC,SQLUSMALLINT,SQLULEN); /* deprecated */ +SQLRETURN SQL_API SQLSetStmtOption(SQLHSTMT,SQLUSMALLINT,SQLROWCOUNT); /* deprecated */ +SQLRETURN SQL_API SQLSpecialColumns(SQLHSTMT,SQLUSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLUSMALLINT,SQLUSMALLINT); +SQLRETURN SQL_API SQLStatistics(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLUSMALLINT,SQLUSMALLINT); +SQLRETURN SQL_API SQLTables(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT); +SQLRETURN SQL_API SQLDataSources(SQLHENV,SQLUSMALLINT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*); +#if (ODBCVER >= 0x0300) +SQLRETURN SQL_API SQLAllocHandle(SQLSMALLINT,SQLHANDLE,SQLHANDLE*); +SQLRETURN SQL_API SQLBindParam(SQLHSTMT,SQLUSMALLINT,SQLSMALLINT,SQLSMALLINT,SQLULEN,SQLSMALLINT,SQLPOINTER,SQLLEN*); +SQLRETURN SQL_API SQLCloseCursor(SQLHSTMT); +SQLRETURN SQL_API SQLColAttribute(SQLHSTMT,SQLUSMALLINT,SQLUSMALLINT,SQLPOINTER,SQLSMALLINT,SQLSMALLINT*,SQLPOINTER); +SQLRETURN SQL_API SQLCopyDesc(SQLHDESC,SQLHDESC); +SQLRETURN SQL_API SQLEndTran(SQLSMALLINT,SQLHANDLE,SQLSMALLINT); +SQLRETURN SQL_API SQLFetchScroll(SQLHSTMT,SQLSMALLINT,SQLROWOFFSET); +SQLRETURN SQL_API SQLFreeHandle(SQLSMALLINT,SQLHANDLE); +SQLRETURN SQL_API SQLGetConnectAttr(SQLHDBC,SQLINTEGER,SQLPOINTER,SQLINTEGER,SQLINTEGER*); +SQLRETURN SQL_API SQLGetDescField(SQLHDESC,SQLSMALLINT,SQLSMALLINT,SQLPOINTER,SQLINTEGER,SQLINTEGER*); +SQLRETURN SQL_API SQLGetDescRec(SQLHDESC,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*, + SQLSMALLINT*,SQLSMALLINT*,SQLLEN*,SQLSMALLINT*,SQLSMALLINT*,SQLSMALLINT*); +SQLRETURN SQL_API SQLGetDiagField(SQLSMALLINT,SQLHANDLE,SQLSMALLINT,SQLSMALLINT,SQLPOINTER,SQLSMALLINT,SQLSMALLINT*); +SQLRETURN SQL_API SQLGetDiagRec(SQLSMALLINT,SQLHANDLE,SQLSMALLINT,SQLCHAR*,SQLINTEGER*,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*); +SQLRETURN SQL_API SQLGetEnvAttr(SQLHENV,SQLINTEGER,SQLPOINTER,SQLINTEGER,SQLINTEGER*); +SQLRETURN SQL_API SQLGetStmtAttr(SQLHSTMT,SQLINTEGER,SQLPOINTER,SQLINTEGER,SQLINTEGER*); +SQLRETURN SQL_API SQLSetConnectAttr(SQLHDBC,SQLINTEGER,SQLPOINTER,SQLINTEGER); +SQLRETURN SQL_API SQLSetDescField(SQLHDESC,SQLSMALLINT,SQLSMALLINT,SQLPOINTER,SQLINTEGER); +SQLRETURN SQL_API SQLSetDescRec(SQLHDESC,SQLSMALLINT,SQLSMALLINT,SQLSMALLINT,SQLLEN,SQLSMALLINT, + SQLSMALLINT,SQLPOINTER,SQLLEN*,SQLLEN*); +SQLRETURN SQL_API SQLSetEnvAttr(SQLHENV,SQLINTEGER,SQLPOINTER,SQLINTEGER); +SQLRETURN SQL_API SQLSetStmtAttr(SQLHSTMT,SQLINTEGER,SQLPOINTER,SQLINTEGER); +#endif /* (ODBCVER >= 0x0300) */ +#endif /* ndef RC_INVOKED */ +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/sqlext.h b/reactos/w32api/include/sqlext.h new file mode 100644 index 00000000000..884260781de --- /dev/null +++ b/reactos/w32api/include/sqlext.h @@ -0,0 +1,1218 @@ +#ifndef _SQLEXT_H +#define _SQLEXT_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#include <sql.h> +#ifdef __cplusplus +extern "C" { +#endif +#define SQL_SPEC_MAJOR 3 +#define SQL_SPEC_MINOR 51 +#define SQL_SPEC_STRING "03.51" +#define SQL_ACCESS_MODE 101 +#define SQL_ACTIVE_CONNECTIONS 0 +#define SQL_ACTIVE_STATEMENTS 1 +#define SQL_ADD 4 +#define SQL_ALL_EXCEPT_LIKE 2 +#define SQL_API_ALL_FUNCTIONS 0 +#define SQL_API_LOADBYORDINAL 199 +#define SQL_API_SQLBINDPARAMETER 72 +#define SQL_API_SQLBROWSECONNECT 55 +#define SQL_API_SQLCOLATTRIBUTES 6 +#define SQL_API_SQLCOLUMNPRIVILEGES 56 +#define SQL_API_SQLDESCRIBEPARAM 58 +#define SQL_API_SQLDRIVERCONNECT 41 +#define SQL_API_SQLDRIVERS 71 +#define SQL_API_SQLEXTENDEDFETCH 59 +#define SQL_API_SQLFOREIGNKEYS 60 +#define SQL_API_SQLMORERESULTS 61 +#define SQL_API_SQLNATIVESQL 62 +#define SQL_API_SQLNUMPARAMS 63 +#define SQL_API_SQLPARAMOPTIONS 64 +#define SQL_API_SQLPRIMARYKEYS 65 +#define SQL_API_SQLPROCEDURECOLUMNS 66 +#define SQL_API_SQLPROCEDURES 67 +#define SQL_API_SQLSETPOS 68 +#define SQL_API_SQLSETSCROLLOPTIONS 69 +#define SQL_API_SQLTABLEPRIVILEGES 70 +#define SQL_ASYNC_ENABLE 4 +#define SQL_ASYNC_ENABLE_DEFAULT SQL_ASYNC_ENABLE_OFF +#define SQL_ASYNC_ENABLE_OFF 0UL +#define SQL_ASYNC_ENABLE_ON 1UL +#define SQL_ATTR_CONNECTION_DEAD 1209 +#define SQL_ATTR_READONLY 0 +#define SQL_ATTR_READWRITE_UNKNOWN 2 +#define SQL_ATTR_WRITE 1 +#define SQL_AUTOCOMMIT 102 +#define SQL_AUTOCOMMIT_DEFAULT SQL_AUTOCOMMIT_ON +#define SQL_AUTOCOMMIT_OFF 0UL +#define SQL_AUTOCOMMIT_ON 1UL +#define SQL_BEST_ROWID 1 +#define SQL_BIGINT (-5) +#define SQL_BINARY (-2) +#define SQL_BIND_BY_COLUMN 0UL +#define SQL_BIND_TYPE 5 +#define SQL_BIND_TYPE_DEFAULT SQL_BIND_BY_COLUMN +#define SQL_BIT (-7) +#define SQL_BOOKMARK_PERSISTENCE 82 +#define SQL_BP_CLOSE 1 +#define SQL_BP_DELETE 2 +#define SQL_BP_DROP 4 +#define SQL_BP_OTHER_HSTMT 32 +#define SQL_BP_SCROLL 64 +#define SQL_BP_TRANSACTION 8 +#define SQL_BP_UPDATE 16 +#define SQL_C_BINARY SQL_BINARY +#define SQL_C_BIT SQL_BIT +#define SQL_C_BOOKMARK SQL_C_ULONG +#define SQL_C_CHAR SQL_CHAR +#define SQL_C_DATE SQL_DATE +#define SQL_C_DEFAULT 99 +#define SQL_C_DOUBLE SQL_DOUBLE +#define SQL_C_FLOAT SQL_REAL +#define SQL_C_LONG SQL_INTEGER +#define SQL_C_SHORT SQL_SMALLINT +#define SQL_C_SLONG (SQL_C_LONG+SQL_SIGNED_OFFSET) +#define SQL_C_SSHORT (SQL_C_SHORT+SQL_SIGNED_OFFSET) +#define SQL_C_STINYINT (SQL_TINYINT+SQL_SIGNED_OFFSET) +#define SQL_C_TIME SQL_TIME +#define SQL_C_TIMESTAMP SQL_TIMESTAMP +#define SQL_C_TINYINT SQL_TINYINT +#define SQL_C_ULONG (SQL_C_LONG+SQL_UNSIGNED_OFFSET) +#define SQL_C_USHORT (SQL_C_SHORT+SQL_UNSIGNED_OFFSET) +#define SQL_C_UTINYINT (SQL_TINYINT+SQL_UNSIGNED_OFFSET) +#define SQL_CASCADE 0 +#define SQL_CB_NON_NULL 1 +#define SQL_CB_NULL 0 +#define SQL_CC_CLOSE SQL_CB_CLOSE /* deprecated */ +#define SQL_CC_DELETE SQL_CB_DELETE /* deprecated */ +#define SQL_CC_PRESERVE SQL_CB_PRESERVE /* deprecated */ +#define SQL_CD_FALSE 0L +#define SQL_CD_TRUE 1L +#define SQL_CN_ANY 2 +#define SQL_CN_DIFFERENT 1 +#define SQL_CN_NONE 0 +#define SQL_COLATT_OPT_MAX SQL_COLUMN_LABEL +#define SQL_COLATT_OPT_MIN SQL_COLUMN_COUNT +#define SQL_COLUMN_ALIAS 87 +#define SQL_COLUMN_AUTO_INCREMENT 11 +#define SQL_COLUMN_CASE_SENSITIVE 12 +#define SQL_COLUMN_COUNT 0 +#define SQL_COLUMN_DISPLAY_SIZE 6 +#define SQL_COLUMN_LABEL 18 +#define SQL_COLUMN_LENGTH 3 +#define SQL_COLUMN_MONEY 9 +#define SQL_COLUMN_NAME 1 +#define SQL_COLUMN_NULLABLE 7 +#define SQL_COLUMN_OWNER_NAME 16 +#define SQL_COLUMN_PRECISION 4 +#define SQL_COLUMN_QUALIFIER_NAME 17 +#define SQL_COLUMN_SCALE 5 +#define SQL_COLUMN_SEARCHABLE 13 +#define SQL_COLUMN_TABLE_NAME 15 +#define SQL_COLUMN_TYPE 2 +#define SQL_COLUMN_TYPE_NAME 14 +#define SQL_COLUMN_UNSIGNED 8 +#define SQL_COLUMN_UPDATABLE 10 +#define SQL_CONCAT_NULL_BEHAVIOR 22 +#define SQL_CONCUR_DEFAULT SQL_CONCUR_READ_ONLY +#define SQL_CONCUR_LOCK 2 +#define SQL_CONCUR_READ_ONLY 1 +#define SQL_CONCUR_ROWVER 3 +#define SQL_CONCUR_TIMESTAMP SQL_CONCUR_ROWVER /* deprecated */ +#define SQL_CONCUR_VALUES 4 +#define SQL_CONCURRENCY 7 +#define SQL_CONVERT_BIGINT 53 +#define SQL_CONVERT_BINARY 54 +#define SQL_CONVERT_BIT 55 +#define SQL_CONVERT_CHAR 56 +#define SQL_CONVERT_DATE 57 +#define SQL_CONVERT_DECIMAL 58 +#define SQL_CONVERT_DOUBLE 59 +#define SQL_CONVERT_FLOAT 60 +#define SQL_CONVERT_FUNCTIONS 48 +#define SQL_CONVERT_INTEGER 61 +#define SQL_CONVERT_LONGVARBINARY 71 +#define SQL_CONVERT_LONGVARCHAR 62 +#define SQL_CONVERT_NUMERIC 63 +#define SQL_CONVERT_REAL 64 +#define SQL_CONVERT_SMALLINT 65 +#define SQL_CONVERT_TIME 66 +#define SQL_CONVERT_TIMESTAMP 67 +#define SQL_CONVERT_TINYINT 68 +#define SQL_CONVERT_VARBINARY 69 +#define SQL_CONVERT_VARCHAR 70 +#define SQL_CORRELATION_NAME 74 +#define SQL_CR_CLOSE SQL_CB_CLOSE /* deprecated */ +#define SQL_CR_DELETE SQL_CB_DELETE /* deprecated */ +#define SQL_CR_PRESERVE SQL_CB_PRESERVE /* deprecated */ +#define SQL_CUR_DEFAULT SQL_CUR_USE_DRIVER +#define SQL_CUR_USE_DRIVER 2UL +#define SQL_CUR_USE_IF_NEEDED 0UL +#define SQL_CUR_USE_ODBC 1UL +#define SQL_CURRENT_QUALIFIER 109 +#define SQL_CURSOR_DYNAMIC 2UL +#define SQL_CURSOR_FORWARD_ONLY 0UL +#define SQL_CURSOR_KEYSET_DRIVEN 1UL +#define SQL_CURSOR_ROLLBACK_BEHAVIOR 24 +#define SQL_CURSOR_STATIC 3UL +#define SQL_CURSOR_TYPE 6 +#define SQL_CURSOR_TYPE_DEFAULT SQL_CURSOR_FORWARD_ONLY +#define SQL_CV_CASCADED 0x00000004L +#define SQL_CV_CHECK_OPTION 0x00000002L +#define SQL_CV_CREATE_VIEW 0x00000001L +#define SQL_CV_LOCAL 0x00000008L +#define SQL_CVT_BIGINT 0x00004000L +#define SQL_CVT_BINARY 0x00000400L +#define SQL_CVT_BIT 0x00001000L +#define SQL_CVT_CHAR 0x00000001L +#define SQL_CVT_DATE 0x00008000L +#define SQL_CVT_DECIMAL 0x00000004L +#define SQL_CVT_DOUBLE 0x00000080L +#define SQL_CVT_FLOAT 0x00000020L +#define SQL_CVT_INTEGER 0x00000008L +#define SQL_CVT_LONGVARBINARY 0x00040000L +#define SQL_CVT_LONGVARCHAR 0x00000200L +#define SQL_CVT_NUMERIC 0x00000002L +#define SQL_CVT_REAL 0x00000040L +#define SQL_CVT_SMALLINT 0x00000010L +#define SQL_CVT_TIME 0x00010000L +#define SQL_CVT_TIMESTAMP 0x00020000L +#define SQL_CVT_TINYINT 0x00002000L +#define SQL_CVT_VARBINARY 0x00000800L +#define SQL_CVT_VARCHAR 0x00000100L +#define SQL_DATABASE_NAME 16 /* deprecated */ +#define SQL_DATE 9 +#define SQL_DEFAULT_PARAM (-5) +#define SQL_DELETE 3 +#define SQL_DRIVER_COMPLETE 1 +#define SQL_DRIVER_COMPLETE_REQUIRED 3 +#define SQL_DRIVER_HDBC 3 +#define SQL_DRIVER_HENV 4 +#define SQL_DRIVER_HLIB 76 +#define SQL_DRIVER_HSTMT 5 +#define SQL_DRIVER_NAME 6 +#define SQL_DRIVER_NOPROMPT 0 +#define SQL_DRIVER_ODBC_VER 77 +#define SQL_DRIVER_PROMPT 2 +#define SQL_DRIVER_VER 7 +#define SQL_DTC_ENLIST_EXPENSIVE 1 +#define SQL_DTC_TRANSITION_COST 1750 +#define SQL_DTC_UNENLIST_EXPENSIVE 2 +#define SQL_ENSURE 1 +#define SQL_ENTIRE_ROWSET 0 +#define SQL_EXPRESSIONS_IN_ORDERBY 27 +#define SQL_FD_FETCH_BOOKMARK 128 +#define SQL_FD_FETCH_PREV SQL_FD_FETCH_PRIOR /* deprecated */ +#define SQL_FD_FETCH_RESUME 64 +#define SQL_FETCH_BOOKMARK 8 +#define SQL_FETCH_PREV SQL_FETCH_PRIOR /* deprecated */ +#define SQL_FETCH_RESUME 7 /* deprecated */ +#define SQL_FILE_CATALOG SQL_FILE_QUALIFIER +#define SQL_FILE_NOT_SUPPORTED 0x0000 +#define SQL_FILE_QUALIFIER 0x0002 +#define SQL_FILE_TABLE 0x0001 +#define SQL_FILE_USAGE 84 +#define SQL_FN_CVT_CONVERT 0x00000001L +#define SQL_FN_NUM_ABS 0x00000001L +#define SQL_FN_NUM_ACOS 0x00000002L +#define SQL_FN_NUM_ASIN 0x00000004L +#define SQL_FN_NUM_ATAN 0x00000008L +#define SQL_FN_NUM_ATAN2 0x00000010L +#define SQL_FN_NUM_CEILING 0x00000020L +#define SQL_FN_NUM_COS 0x00000040L +#define SQL_FN_NUM_COT 0x00000080L +#define SQL_FN_NUM_DEGREES 0x00040000L +#define SQL_FN_NUM_EXP 0x00000100L +#define SQL_FN_NUM_FLOOR 0x00000200L +#define SQL_FN_NUM_LOG 0x00000400L +#define SQL_FN_NUM_LOG10 0x00080000L +#define SQL_FN_NUM_MOD 0x00000800L +#define SQL_FN_NUM_PI 0x00010000L +#define SQL_FN_NUM_POWER 0x00100000L +#define SQL_FN_NUM_RADIANS 0x00200000L +#define SQL_FN_NUM_RAND 0x00020000L +#define SQL_FN_NUM_ROUND 0x00400000L +#define SQL_FN_NUM_SIGN 0x00001000L +#define SQL_FN_NUM_SIN 0x00002000L +#define SQL_FN_NUM_SQRT 0x00004000L +#define SQL_FN_NUM_TAN 0x00008000L +#define SQL_FN_NUM_TRUNCATE 0x00800000L +#define SQL_FN_STR_ASCII 0x00002000L +#define SQL_FN_STR_CHAR 0x00004000L +#define SQL_FN_STR_CONCAT 0x00000001L +#define SQL_FN_STR_DIFFERENCE 0x00008000L +#define SQL_FN_STR_INSERT 0x00000002L +#define SQL_FN_STR_LCASE 0x00000040L +#define SQL_FN_STR_LEFT 0x00000004L +#define SQL_FN_STR_LENGTH 0x00000010L +#define SQL_FN_STR_LOCATE 0x00000020L +#define SQL_FN_STR_LOCATE_2 0x00010000L +#define SQL_FN_STR_LTRIM 0x00000008L +#define SQL_FN_STR_REPEAT 0x00000080L +#define SQL_FN_STR_REPLACE 0x00000100L +#define SQL_FN_STR_RIGHT 0x00000200L +#define SQL_FN_STR_RTRIM 0x00000400L +#define SQL_FN_STR_SOUNDEX 0x00020000L +#define SQL_FN_STR_SPACE 0x00040000L +#define SQL_FN_STR_SUBSTRING 0x00000800L +#define SQL_FN_STR_UCASE 0x00001000L +#define SQL_FN_SYS_DBNAME 0x00000002L +#define SQL_FN_SYS_IFNULL 0x00000004L +#define SQL_FN_SYS_USERNAME 0x00000001L +#define SQL_FN_TD_CURDATE 0x00000002L +#define SQL_FN_TD_CURTIME 0x00000200L +#define SQL_FN_TD_DAYNAME 0x00008000L +#define SQL_FN_TD_DAYOFMONTH 0x00000004L +#define SQL_FN_TD_DAYOFWEEK 0x00000008L +#define SQL_FN_TD_DAYOFYEAR 0x00000010L +#define SQL_FN_TD_HOUR 0x00000400L +#define SQL_FN_TD_MINUTE 0x00000800L +#define SQL_FN_TD_MONTH 0x00000020L +#define SQL_FN_TD_MONTHNAME 0x00010000L +#define SQL_FN_TD_NOW 0x00000001L +#define SQL_FN_TD_QUARTER 0x00000040L +#define SQL_FN_TD_SECOND 0x00001000L +#define SQL_FN_TD_TIMESTAMPADD 0x00002000L +#define SQL_FN_TD_TIMESTAMPDIFF 0x00004000L +#define SQL_FN_TD_WEEK 0x00000080L +#define SQL_FN_TD_YEAR 0x00000100L +#define SQL_FN_TSI_DAY 0x00000010L +#define SQL_FN_TSI_FRAC_SECOND 0x00000001L +#define SQL_FN_TSI_HOUR 0x00000008L +#define SQL_FN_TSI_MINUTE 0x00000004L +#define SQL_FN_TSI_MONTH 0x00000040L +#define SQL_FN_TSI_QUARTER 0x00000080L +#define SQL_FN_TSI_SECOND 0x00000002L +#define SQL_FN_TSI_WEEK 0x00000020L +#define SQL_FN_TSI_YEAR 0x00000100L +#define SQL_GB_GROUP_BY_CONTAINS_SELECT 2 +#define SQL_GB_GROUP_BY_EQUALS_SELECT 1 +#define SQL_GB_NO_RELATION 3 +#define SQL_GB_NOT_SUPPORTED 0 +#define SQL_GD_BLOCK 4 +#define SQL_GD_BOUND 8 +#define SQL_GET_BOOKMARK 13 +#define SQL_GROUP_BY 88 +#define SQL_IGNORE (-6) +#define SQL_INFO_FIRST 0 +#define SQL_KEYSET_SIZE 8 +#define SQL_KEYSET_SIZE_DEFAULT 0UL +#define SQL_KEYWORDS 89 +#define SQL_LCK_EXCLUSIVE 2 +#define SQL_LCK_NO_CHANGE 1 +#define SQL_LCK_UNLOCK 4 +#define SQL_LEN_BINARY_ATTR(length) (-(length)+SQL_LEN_BINARY_ATTR_OFFSET) +#define SQL_LEN_BINARY_ATTR_OFFSET (-100) +#define SQL_LEN_DATA_AT_EXEC(length) (-(length)+SQL_LEN_DATA_AT_EXEC_OFFSET) +#define SQL_LEN_DATA_AT_EXEC_OFFSET (-100) +#define SQL_LIKE_ESCAPE_CLAUSE 113 +#define SQL_LIKE_ONLY 1 +#define SQL_LOCK_EXCLUSIVE 1 +#define SQL_LOCK_NO_CHANGE 0 +#define SQL_LOCK_TYPES 78 +#define SQL_LOCK_UNLOCK 2 +#define SQL_LOGIN_TIMEOUT 103 +#define SQL_LOGIN_TIMEOUT_DEFAULT 15UL +#define SQL_LONGVARBINARY (-4) +#define SQL_LONGVARCHAR (-1) +#define SQL_MAX_BINARY_LITERAL_LEN 112 +#define SQL_MAX_CHAR_LITERAL_LEN 108 +#define SQL_MAX_DSN_LENGTH 32 +#define SQL_MAX_LENGTH 3 +#define SQL_MAX_LENGTH_DEFAULT 0UL +#define SQL_MAX_OPTION_STRING_LENGTH 256 +#define SQL_MAX_OWNER_NAME_LEN 32 +#define SQL_MAX_PROCEDURE_NAME_LEN 33 +#define SQL_MAX_QUALIFIER_NAME_LEN 34 +#define SQL_MAX_ROW_SIZE_INCLUDES_LONG 103 +#define SQL_MAX_ROWS 1 +#define SQL_MAX_ROWS_DEFAULT 0UL +#define SQL_MODE_DEFAULT SQL_MODE_READ_WRITE +#define SQL_MODE_READ_ONLY 1UL +#define SQL_MODE_READ_WRITE 0UL +#define SQL_MULT_RESULT_SETS 36 +#define SQL_MULTIPLE_ACTIVE_TXN 37 +#define SQL_NC_END 0x0004 +#define SQL_NC_START 0x0002 +#define SQL_NEED_LONG_DATA_LEN 111 +#define SQL_NNC_NON_NULL 0x0001 +#define SQL_NNC_NULL 0x0000 +#define SQL_NO_TOTAL (-4) +#define SQL_NON_NULLABLE_COLUMNS 75 +#define SQL_NOSCAN 2 +#define SQL_NOSCAN_DEFAULT SQL_NOSCAN_OFF +#define SQL_NOSCAN_OFF 0UL +#define SQL_NOSCAN_ON 1UL +#define SQL_NUMERIC_FUNCTIONS 49 +#define SQL_OAC_LEVEL1 0x0001 +#define SQL_OAC_LEVEL2 0x0002 +#define SQL_OAC_NONE 0x0000 +#define SQL_ODBC_API_CONFORMANCE 9 +#define SQL_ODBC_CURSORS 110 +#define SQL_ODBC_SAG_CLI_CONFORMANCE 12 +#define SQL_ODBC_SQL_CONFORMANCE 15 +#define SQL_ODBC_SQL_OPT_IEF 73 +#define SQL_ODBC_VER 10 +#define SQL_OPT_TRACE 104 +#define SQL_OPT_TRACE_DEFAULT SQL_OPT_TRACE_OFF +#define SQL_OPT_TRACE_FILE_DEFAULT "\\SQL.LOG" +#define SQL_OPT_TRACE_OFF 0UL +#define SQL_OPT_TRACE_ON 1UL +#define SQL_OPT_TRACEFILE 105 +#define SQL_OSC_CORE 1 +#define SQL_OSC_EXTENDED 2 +#define SQL_OSC_MINIMUM 0 +#define SQL_OSCC_COMPLIANT 1 +#define SQL_OSCC_NOT_COMPLIANT 0 +#define SQL_OU_DML_STATEMENTS 1 +#define SQL_OU_INDEX_DEFINITION 8 +#define SQL_OU_PRIVILEGE_DEFINITION 16 +#define SQL_OU_PROCEDURE_INVOCATION 2 +#define SQL_OU_TABLE_DEFINITION 4 +#define SQL_OUTER_JOINS 38 +#define SQL_OWNER_TERM 39 +#define SQL_OWNER_USAGE 91 +#define SQL_PACKET_SIZE 112 +#define SQL_PARAM_INPUT 1 +#define SQL_PARAM_INPUT_OUTPUT 2 +#define SQL_PARAM_OUTPUT 4 +#define SQL_PARAM_TYPE_DEFAULT SQL_PARAM_INPUT_OUTPUT +#define SQL_PARAM_TYPE_UNKNOWN 0 +#define SQL_PC_NOT_PSEUDO 1 +#define SQL_POS_ADD 16 +#define SQL_POS_DELETE 8 +#define SQL_POS_OPERATIONS 79 +#define SQL_POS_POSITION 1 +#define SQL_POS_REFRESH 2 +#define SQL_POS_UPDATE 4 +#define SQL_POSITION 0 +#define SQL_POSITIONED_STATEMENTS 80 +#define SQL_PRED_SEARCHABLE SQL_SEARCHABLE +#define SQL_PROCEDURE_TERM 40 +#define SQL_PROCEDURES 21 +#define SQL_PS_POSITIONED_DELETE 1 +#define SQL_PS_POSITIONED_UPDATE 2 +#define SQL_PS_SELECT_FOR_UPDATE 4 +#define SQL_PT_FUNCTION 2 +#define SQL_PT_PROCEDURE 1 +#define SQL_PT_UNKNOWN 0 +#define SQL_QL_END 0x0002 +#define SQL_QL_START 0x0001 +#define SQL_QU_DML_STATEMENTS 1 +#define SQL_QU_INDEX_DEFINITION 8 +#define SQL_QU_PRIVILEGE_DEFINITION 16 +#define SQL_QU_PROCEDURE_INVOCATION 2 +#define SQL_QU_TABLE_DEFINITION 4 +#define SQL_QUALIFIER_LOCATION 114 +#define SQL_QUALIFIER_NAME_SEPARATOR 41 +#define SQL_QUALIFIER_TERM 42 +#define SQL_QUALIFIER_USAGE 92 +#define SQL_QUERY_TIMEOUT 0 +#define SQL_QUERY_TIMEOUT_DEFAULT 0UL +#define SQL_QUICK 0 +#define SQL_QUIET_MODE 111 +#define SQL_QUOTED_IDENTIFIER_CASE 93 +#define SQL_RD_DEFAULT SQL_RD_ON +#define SQL_RD_OFF 0UL +#define SQL_RD_ON 1UL +#define SQL_REFRESH 1 +#define SQL_RESTRICT 1 +#define SQL_RESULT_COL 3 +#define SQL_RETRIEVE_DATA 11 +#define SQL_RETURN_VALUE 5 +#define SQL_ROW_ADDED 4 +#define SQL_ROW_DELETED 1 +#define SQL_ROW_ERROR 5 +#define SQL_ROW_NOROW 3 +#define SQL_ROW_NUMBER 14 +#define SQL_ROW_SUCCESS 0 +#define SQL_ROW_UPDATED 2 +#define SQL_ROW_UPDATES 11 +#define SQL_ROWSET_SIZE 9 +#define SQL_ROWSET_SIZE_DEFAULT 1UL +#define SQL_ROWVER 2 +#define SQL_SC_NON_UNIQUE 0UL +#define SQL_SC_TRY_UNIQUE 1UL +#define SQL_SC_UNIQUE 2UL +#define SQL_SCCO_OPT_TIMESTAMP SQL_SCCO_OPT_ROWVER /* deprecated */ +#define SQL_SCROLL_DYNAMIC (-2L) /* deprecated */ +#define SQL_SCROLL_FORWARD_ONLY 0L /* deprecated */ +#define SQL_SCROLL_KEYSET_DRIVEN (-1L) /* deprecated */ +#define SQL_SCROLL_OPTIONS 44 +#define SQL_SCROLL_STATIC (-3L) /* deprecated */ +#define SQL_SEARCHABLE 3 +#define SQL_SET_NULL 2 +#define SQL_SETPARAM_VALUE_MAX (-1L) +#define SQL_SETPOS_MAX_LOCK_VALUE SQL_LOCK_UNLOCK +#define SQL_SETPOS_MAX_OPTION_VALUE SQL_ADD +#define SQL_SIGNED_OFFSET (-20) +#define SQL_SIMULATE_CURSOR 10 +#define SQL_SO_DYNAMIC 4 +#define SQL_SO_FORWARD_ONLY 1 +#define SQL_SO_KEYSET_DRIVEN 2 +#define SQL_SO_MIXED 8 +#define SQL_SO_STATIC 16 +#define SQL_SQ_COMPARISON 1 +#define SQL_SQ_CORRELATED_SUBQUERIES 16 +#define SQL_SQ_EXISTS 2 +#define SQL_SQ_IN 4 +#define SQL_SQ_QUANTIFIED 8 +#define SQL_SQLSTATE_SIZE 5 +#define SQL_SS_ADDITIONS 1 +#define SQL_SS_DELETIONS 2 +#define SQL_SS_UPDATES 4 +#define SQL_STATIC_SENSITIVITY 83 +#define SQL_STRING_FUNCTIONS 50 +#define SQL_SUBQUERIES 95 +#define SQL_SYSTEM_FUNCTIONS 51 +#define SQL_TABLE_STAT 0 +#define SQL_TABLE_TERM 45 +#define SQL_TIME 10 +#define SQL_TIMEDATE_ADD_INTERVALS 109 +#define SQL_TIMEDATE_DIFF_INTERVALS 110 +#define SQL_TIMEDATE_FUNCTIONS 52 +#define SQL_TIMESTAMP 11 +#define SQL_TINYINT (-6) +#define SQL_TRANSLATE_DLL 106 +#define SQL_TRANSLATE_OPTION 107 +#define SQL_TXN_ISOLATION 108 +#define SQL_TXN_VERSIONING 16 +#define SQL_TYPE_NULL 0 +#define SQL_U_UNION 1 +#define SQL_U_UNION_ALL 2 +#define SQL_UB_DEFAULT SQL_UB_OFF +#define SQL_UB_OFF 0UL +#define SQL_UB_ON 01UL +#define SQL_UNION 96 +#define SQL_UNSEARCHABLE 0 +#define SQL_UNSIGNED_OFFSET (-22) +#define SQL_UPDATE 2 +#define SQL_USE_BOOKMARKS 12 +#define SQL_VARBINARY (-3) +#define SQL_POSITION_TO(s,r) SQLSetPos(s,r,SQL_POSITION,SQL_LOCK_NO_CHANGE) +#define SQL_LOCK_RECORD(s,r,l) SQLSetPos(s,r,SQL_POSITION,l) +#define SQL_REFRESH_RECORD(s,r,l) SQLSetPos(s,r,SQL_REFRESH,l) +#define SQL_UPDATE_RECORD(s,r) SQLSetPos(s,r,SQL_UPDATE,SQL_LOCK_NO_CHANGE) +#define SQL_DELETE_RECORD(s,r) SQLSetPos(s,r,SQL_DELETE,SQL_LOCK_NO_CHANGE) +#define SQL_ADD_RECORD(s,r) SQLSetPos(s,r,SQL_ADD,SQL_LOCK_NO_CHANGE) + +#if (ODBCVER < 0x0300) +#define SQL_CONNECT_OPT_DRVR_START 1000 +#define SQL_CONN_OPT_MAX SQL_PACKET_SIZE +#define SQL_CONN_OPT_MIN SQL_ACCESS_MODE +#define SQL_STMT_OPT_MAX SQL_ROW_NUMBER +#define SQL_STMT_OPT_MIN SQL_QUERY_TIMEOUT +#define SQL_TYPE_DRIVER_START SQL_INTERVAL_YEAR +#define SQL_TYPE_DRIVER_END SQL_UNICODE_LONGVARCHAR +#define SQL_TYPE_MIN SQL_BIT +#define SQL_TYPE_MAX SQL_VARCHAR +#endif + +#if (ODBCVER < 0x0300) +#define SQL_NO_DATA_FOUND 100 +#define SQL_INTERVAL_YEAR (-80) +#define SQL_INTERVAL_MONTH (-81) +#define SQL_INTERVAL_YEAR_TO_MONTH (-82) +#define SQL_INTERVAL_DAY (-83) +#define SQL_INTERVAL_HOUR (-84) +#define SQL_INTERVAL_MINUTE (-85) +#define SQL_INTERVAL_SECOND (-86) +#define SQL_INTERVAL_DAY_TO_HOUR (-87) +#define SQL_INTERVAL_DAY_TO_MINUTE (-88) +#define SQL_INTERVAL_DAY_TO_SECOND (-89) +#define SQL_INTERVAL_HOUR_TO_MINUTE (-90) +#define SQL_INTERVAL_HOUR_TO_SECOND (-91) +#define SQL_INTERVAL_MINUTE_TO_SECOND (-92) +#else +#define SQL_NO_DATA_FOUND SQL_NO_DATA +#define SQL_CODE_YEAR 1 +#define SQL_CODE_MONTH 2 +#define SQL_CODE_DAY 3 +#define SQL_CODE_HOUR 4 +#define SQL_CODE_MINUTE 5 +#define SQL_CODE_SECOND 6 +#define SQL_CODE_YEAR_TO_MONTH 7 +#define SQL_CODE_DAY_TO_HOUR 8 +#define SQL_CODE_DAY_TO_MINUTE 9 +#define SQL_CODE_DAY_TO_SECOND 10 +#define SQL_CODE_HOUR_TO_MINUTE 11 +#define SQL_CODE_HOUR_TO_SECOND 12 +#define SQL_CODE_MINUTE_TO_SECOND 13 +#define SQL_INTERVAL_YEAR (100 + SQL_CODE_SECOND) +#define SQL_INTERVAL_MONTH (100 + SQL_CODE_YEAR_TO_MONTH) +#define SQL_INTERVAL_DAY (100 + SQL_CODE_DAY_TO_HOUR) +#define SQL_INTERVAL_HOUR (100 + SQL_CODE_DAY_TO_MINUTE) +#define SQL_INTERVAL_MINUTE (100 + SQL_CODE_DAY_TO_SECOND) +#define SQL_INTERVAL_SECOND (100 + SQL_CODE_HOUR_TO_MINUTE) +#define SQL_INTERVAL_YEAR_TO_MONTH (100 + SQL_CODE_HOUR_TO_SECOND) +#define SQL_INTERVAL_DAY_TO_HOUR (100 + SQL_CODE_MINUTE_TO_SECOND) +#define SQL_INTERVAL_DAY_TO_MINUTE (100 + SQL_CODE_DAY_TO_MINUTE) +#define SQL_INTERVAL_DAY_TO_SECOND (100 + SQL_CODE_DAY_TO_SECOND) +#define SQL_INTERVAL_HOUR_TO_MINUTE (100 + SQL_CODE_HOUR_TO_MINUTE) +#define SQL_INTERVAL_HOUR_TO_SECOND (100 + SQL_CODE_HOUR_TO_SECOND) +#define SQL_INTERVAL_MINUTE_TO_SECOND (100 + SQL_CODE_MINUTE_TO_SECOND) +#endif + +#if (ODBCVER <= 0x0300) +#define SQL_UNICODE (-95) +#define SQL_UNICODE_VARCHAR (-96) +#define SQL_UNICODE_LONGVARCHAR (-97) +#define SQL_UNICODE_CHAR SQL_UNICODE +#else +#define SQL_UNICODE SQL_WCHAR +#define SQL_UNICODE_VARCHAR SQL_WVARCHAR +#define SQL_UNICODE_LONGVARCHAR SQL_WLONGVARCHAR +#define SQL_UNICODE_CHAR SQL_WCHAR +#endif + +#if (ODBCVER >= 0x0201) && (ODBCVER < 0x0300) +#define SQL_OJ_CAPABILITIES 65003 +#endif /* ODBCVER < 0x0300 */ + +#if (ODBCVER >= 0x0250) +#define SQL_NO_ACTION 3 +#define SQL_SET_DEFAULT 4 +#endif /* ODBCVER >= 0x0250 */ + +#if (ODBCVER >= 0x0300) +#define SQL_ACTIVE_ENVIRONMENTS 116 +#define SQL_AD_ADD_CONSTRAINT_DEFERRABLE 0x00000080L +#define SQL_AD_ADD_CONSTRAINT_INITIALLY_DEFERRED 0x00000020L +#define SQL_AD_ADD_CONSTRAINT_INITIALLY_IMMEDIATE 0x00000040L +#define SQL_AD_ADD_CONSTRAINT_NON_DEFERRABLE 0x00000100L +#define SQL_AD_ADD_DOMAIN_CONSTRAINT 0x00000002L +#define SQL_AD_ADD_DOMAIN_DEFAULT 0x00000008L +#define SQL_AD_CONSTRAINT_NAME_DEFINITION 0x00000001L +#define SQL_AD_DROP_DOMAIN_CONSTRAINT 0x00000004L +#define SQL_AD_DROP_DOMAIN_DEFAULT 0x00000010L +#define SQL_AF_ALL 0x00000040L +#define SQL_AF_AVG 0x00000001L +#define SQL_AF_COUNT 0x00000002L +#define SQL_AF_DISTINCT 0x00000020L +#define SQL_AF_MAX 0x00000004L +#define SQL_AF_MIN 0x00000008L +#define SQL_AF_SUM 0x00000010L +#define SQL_AGGREGATE_FUNCTIONS 169 +#define SQL_ALL_CATALOGS "%" +#define SQL_ALL_SCHEMAS "%" +#define SQL_ALL_TABLE_TYPES "%" +#define SQL_ALTER_DOMAIN 117 +#define SQL_AM_CONNECTION 1 +#define SQL_AM_NONE 0 +#define SQL_AM_STATEMENT 2 +#define SQL_API_ODBC3_ALL_FUNCTIONS 999 +#define SQL_API_ODBC3_ALL_FUNCTIONS_SIZE 250 +#define SQL_API_SQLALLOCHANDLESTD 73 +#define SQL_API_SQLBULKOPERATIONS 24 +#define SQL_ASYNC_MODE 10021 +#define SQL_AT_ADD_COLUMN_COLLATION 0x00000080L +#define SQL_AT_ADD_COLUMN_DEFAULT 0x00000040L +#define SQL_AT_ADD_COLUMN_SINGLE 0x00000020L +#define SQL_AT_ADD_TABLE_CONSTRAINT 0x00001000L +#define SQL_AT_CONSTRAINT_DEFERRABLE 0x00040000L +#define SQL_AT_CONSTRAINT_INITIALLY_DEFERRED 0x00010000L +#define SQL_AT_CONSTRAINT_INITIALLY_IMMEDIATE 0x00020000L +#define SQL_AT_CONSTRAINT_NAME_DEFINITION 0x00008000L +#define SQL_AT_CONSTRAINT_NON_DEFERRABLE 0x00080000L +#define SQL_AT_DROP_COLUMN_CASCADE 0x00000400L +#define SQL_AT_DROP_COLUMN_DEFAULT 0x00000200L +#define SQL_AT_DROP_COLUMN_RESTRICT 0x00000800L +#define SQL_AT_DROP_TABLE_CONSTRAINT_CASCADE 0x00002000L +#define SQL_AT_DROP_TABLE_CONSTRAINT_RESTRICT 0x00004000L +#define SQL_AT_SET_COLUMN_DEFAULT 0x00000100L +#define SQL_ATTR_ACCESS_MODE SQL_ACCESS_MODE +#define SQL_ATTR_ASYNC_ENABLE 4 +#define SQL_ATTR_AUTOCOMMIT SQL_AUTOCOMMIT +#define SQL_ATTR_CONCURRENCY SQL_CONCURRENCY +#define SQL_ATTR_CONNECTION_POOLING 201 +#define SQL_ATTR_CONNECTION_TIMEOUT 113 +#define SQL_ATTR_CP_MATCH 202 +#define SQL_ATTR_CURRENT_CATALOG SQL_CURRENT_QUALIFIER +#define SQL_ATTR_CURSOR_TYPE SQL_CURSOR_TYPE +#define SQL_ATTR_DISCONNECT_BEHAVIOR 114 +#define SQL_ATTR_ENABLE_AUTO_IPD 15 +#define SQL_ATTR_ENLIST_IN_DTC 1207 +#define SQL_ATTR_ENLIST_IN_XA 1208 +#define SQL_ATTR_FETCH_BOOKMARK_PTR 16 +#define SQL_ATTR_KEYSET_SIZE SQL_KEYSET_SIZE +#define SQL_ATTR_LOGIN_TIMEOUT SQL_LOGIN_TIMEOUT +#define SQL_ATTR_MAX_LENGTH SQL_MAX_LENGTH +#define SQL_ATTR_MAX_ROWS SQL_MAX_ROWS +#define SQL_ATTR_NOSCAN SQL_NOSCAN +#define SQL_ATTR_ODBC_CURSORS SQL_ODBC_CURSORS +#define SQL_ATTR_ODBC_VERSION 200 +#define SQL_ATTR_PACKET_SIZE SQL_PACKET_SIZE +#define SQL_ATTR_PARAM_BIND_OFFSET_PTR 17 +#define SQL_ATTR_PARAM_BIND_TYPE 18 +#define SQL_ATTR_PARAM_OPERATION_PTR 19 +#define SQL_ATTR_PARAM_STATUS_PTR 20 +#define SQL_ATTR_PARAMS_PROCESSED_PTR 21 +#define SQL_ATTR_PARAMSET_SIZE 22 +#define SQL_ATTR_QUERY_TIMEOUT SQL_QUERY_TIMEOUT +#define SQL_ATTR_QUIET_MODE SQL_QUIET_MODE +#define SQL_ATTR_RETRIEVE_DATA SQL_RETRIEVE_DATA +#define SQL_ATTR_ROW_ARRAY_SIZE 27 +#define SQL_ATTR_ROW_BIND_OFFSET_PTR 23 +#define SQL_ATTR_ROW_BIND_TYPE SQL_BIND_TYPE +#define SQL_ATTR_ROW_NUMBER SQL_ROW_NUMBER +#define SQL_ATTR_ROW_OPERATION_PTR 24 +#define SQL_ATTR_ROW_STATUS_PTR 25 +#define SQL_ATTR_ROWS_FETCHED_PTR 26 +#define SQL_ATTR_SIMULATE_CURSOR SQL_SIMULATE_CURSOR +#define SQL_ATTR_TRACE SQL_OPT_TRACE +#define SQL_ATTR_TRACEFILE SQL_OPT_TRACEFILE +#define SQL_ATTR_TRANSLATE_LIB SQL_TRANSLATE_DLL +#define SQL_ATTR_TRANSLATE_OPTION SQL_TRANSLATE_OPTION +#define SQL_ATTR_TXN_ISOLATION SQL_TXN_ISOLATION +#define SQL_ATTR_USE_BOOKMARKS SQL_USE_BOOKMARKS +#define SQL_BATCH_ROW_COUNT 120 +#define SQL_BATCH_SUPPORT 121 +#define SQL_BRC_EXPLICIT 0x0000002 +#define SQL_BRC_PROCEDURES 0x0000001 +#define SQL_BRC_ROLLED_UP 0x0000004 +#define SQL_BS_ROW_COUNT_EXPLICIT 0x00000002L +#define SQL_BS_ROW_COUNT_PROC 0x00000008L +#define SQL_BS_SELECT_EXPLICIT 0x00000001L +#define SQL_BS_SELECT_PROC 0x00000004L +#define SQL_C_INTERVAL_DAY SQL_INTERVAL_DAY +#define SQL_C_INTERVAL_DAY_TO_HOUR SQL_INTERVAL_DAY_TO_HOUR +#define SQL_C_INTERVAL_DAY_TO_MINUTE SQL_INTERVAL_DAY_TO_MINUTE +#define SQL_C_INTERVAL_DAY_TO_SECOND SQL_INTERVAL_DAY_TO_SECOND +#define SQL_C_INTERVAL_HOUR SQL_INTERVAL_HOUR +#define SQL_C_INTERVAL_HOUR_TO_MINUTE SQL_INTERVAL_HOUR_TO_MINUTE +#define SQL_C_INTERVAL_HOUR_TO_SECOND SQL_INTERVAL_HOUR_TO_SECOND +#define SQL_C_INTERVAL_MINUTE SQL_INTERVAL_MINUTE +#define SQL_C_INTERVAL_MINUTE_TO_SECOND SQL_INTERVAL_MINUTE_TO_SECOND +#define SQL_C_INTERVAL_MONTH SQL_INTERVAL_MONTH +#define SQL_C_INTERVAL_SECOND SQL_INTERVAL_SECOND +#define SQL_C_INTERVAL_YEAR SQL_INTERVAL_YEAR +#define SQL_C_INTERVAL_YEAR_TO_MONTH SQL_INTERVAL_YEAR_TO_MONTH +#define SQL_C_NUMERIC SQL_NUMERIC +#define SQL_C_SBIGINT (SQL_BIGINT+SQL_SIGNED_OFFSET) +#define SQL_C_TYPE_DATE SQL_TYPE_DATE +#define SQL_C_TYPE_TIME SQL_TYPE_TIME +#define SQL_C_TYPE_TIMESTAMP SQL_TYPE_TIMESTAMP +#define SQL_C_UBIGINT (SQL_BIGINT+SQL_UNSIGNED_OFFSET) +#define SQL_C_VARBOOKMARK SQL_C_BINARY +#define SQL_CA_CONSTRAINT_DEFERRABLE 0x00000040L +#define SQL_CA_CONSTRAINT_INITIALLY_DEFERRED 0x00000010L +#define SQL_CA_CONSTRAINT_INITIALLY_IMMEDIATE 0x00000020L +#define SQL_CA_CONSTRAINT_NON_DEFERRABLE 0x00000080L +#define SQL_CA_CREATE_ASSERTION 0x00000001L +#define SQL_CA1_ABSOLUTE 0x00000002L +#define SQL_CA1_BOOKMARK 0x00000008L +#define SQL_CA1_BULK_ADD 0x00010000L +#define SQL_CA1_BULK_DELETE_BY_BOOKMARK 0x00040000L +#define SQL_CA1_BULK_FETCH_BY_BOOKMARK 0x00080000L +#define SQL_CA1_BULK_UPDATE_BY_BOOKMARK 0x00020000L +#define SQL_CA1_LOCK_EXCLUSIVE 0x00000080L +#define SQL_CA1_LOCK_NO_CHANGE 0x00000040L +#define SQL_CA1_LOCK_UNLOCK 0x00000100L +#define SQL_CA1_NEXT 0x00000001L +#define SQL_CA1_POS_DELETE 0x00000800L +#define SQL_CA1_POS_POSITION 0x00000200L +#define SQL_CA1_POS_REFRESH 0x00001000L +#define SQL_CA1_POS_UPDATE 0x00000400L +#define SQL_CA1_POSITIONED_DELETE 0x00004000L +#define SQL_CA1_POSITIONED_UPDATE 0x00002000L +#define SQL_CA1_RELATIVE 0x00000004L +#define SQL_CA1_SELECT_FOR_UPDATE 0x00008000L +#define SQL_CA2_CRC_APPROXIMATE 0x00002000L +#define SQL_CA2_CRC_EXACT 0x00001000L +#define SQL_CA2_LOCK_CONCURRENCY 0x00000002L +#define SQL_CA2_MAX_ROWS_AFFECTS_ALL (SQL_CA2_MAX_ROWS_SELECT | SQL_CA2_MAX_ROWS_INSERT | \ + SQL_CA2_MAX_ROWS_DELETE | SQL_CA2_MAX_ROWS_UPDATE | SQL_CA2_MAX_ROWS_CATALOG) +#define SQL_CA2_MAX_ROWS_CATALOG 0x00000800L +#define SQL_CA2_MAX_ROWS_DELETE 0x00000200L +#define SQL_CA2_MAX_ROWS_INSERT 0x00000100L +#define SQL_CA2_MAX_ROWS_SELECT 0x00000080L +#define SQL_CA2_MAX_ROWS_UPDATE 0x00000400L +#define SQL_CA2_OPT_ROWVER_CONCURRENCY 0x00000004L +#define SQL_CA2_OPT_VALUES_CONCURRENCY 0x00000008L +#define SQL_CA2_READ_ONLY_CONCURRENCY 0x00000001L +#define SQL_CA2_SENSITIVITY_ADDITIONS 0x00000010L +#define SQL_CA2_SENSITIVITY_DELETIONS 0x00000020L +#define SQL_CA2_SENSITIVITY_UPDATES 0x00000040L +#define SQL_CA2_SIMULATE_NON_UNIQUE 0x00004000L +#define SQL_CA2_SIMULATE_TRY_UNIQUE 0x00008000L +#define SQL_CA2_SIMULATE_UNIQUE 0x00010000L +#define SQL_CATALOG_LOCATION SQL_QUALIFIER_LOCATION +#define SQL_CATALOG_NAME_SEPARATOR SQL_QUALIFIER_NAME_SEPARATOR +#define SQL_CATALOG_TERM SQL_QUALIFIER_TERM +#define SQL_CATALOG_USAGE SQL_QUALIFIER_USAGE +#define SQL_CCOL_CREATE_COLLATION 0x00000001L +#define SQL_CCS_COLLATE_CLAUSE 0x00000002L +#define SQL_CCS_CREATE_CHARACTER_SET 0x00000001L +#define SQL_CCS_LIMITED_COLLATION 0x00000004L +#define SQL_CDO_COLLATION 0x00000008L +#define SQL_CDO_CONSTRAINT 0x00000004L +#define SQL_CDO_CONSTRAINT_DEFERRABLE 0x00000080L +#define SQL_CDO_CONSTRAINT_INITIALLY_DEFERRED 0x00000020L +#define SQL_CDO_CONSTRAINT_INITIALLY_IMMEDIATE 0x00000040L +#define SQL_CDO_CONSTRAINT_NAME_DEFINITION 0x00000010L +#define SQL_CDO_CONSTRAINT_NON_DEFERRABLE 0x00000100L +#define SQL_CDO_CREATE_DOMAIN 0x00000001L +#define SQL_CDO_DEFAULT 0x00000002L +#define SQL_CL_END SQL_QL_END +#define SQL_CL_START SQL_QL_START +#define SQL_COL_PRED_BASIC SQL_ALL_EXCEPT_LIKE +#define SQL_COL_PRED_CHAR SQL_LIKE_ONLY +#define SQL_COLUMN_DRIVER_START 1000 +#define SQL_COLUMN_IGNORE SQL_IGNORE +#define SQL_COLUMN_NUMBER_UNKNOWN (-2) +#define SQL_CONVERT_GUID 173 +#define SQL_CONVERT_INTERVAL_DAY_TIME 123 +#define SQL_CONVERT_INTERVAL_YEAR_MONTH 124 +#define SQL_CONVERT_WCHAR 122 +#define SQL_CONVERT_WLONGVARCHAR 125 +#define SQL_CONVERT_WVARCHAR 126 +#define SQL_CP_DEFAULT SQL_CP_OFF +#define SQL_CP_MATCH_DEFAULT SQL_CP_STRICT_MATCH +#define SQL_CP_OFF 0UL +#define SQL_CP_ONE_PER_DRIVER 1UL +#define SQL_CP_ONE_PER_HENV 2UL +#define SQL_CP_RELAXED_MATCH 1UL +#define SQL_CP_STRICT_MATCH 0UL +#define SQL_CREATE_ASSERTION 127 +#define SQL_CREATE_CHARACTER_SET 128 +#define SQL_CREATE_COLLATION 129 +#define SQL_CREATE_DOMAIN 130 +#define SQL_CREATE_SCHEMA 131 +#define SQL_CREATE_TABLE 132 +#define SQL_CREATE_TRANSLATION 133 +#define SQL_CREATE_VIEW 134 +#define SQL_CS_AUTHORIZATION 0x00000002L +#define SQL_CS_CREATE_SCHEMA 0x00000001L +#define SQL_CS_DEFAULT_CHARACTER_SET 0x00000004L +#define SQL_CT_COLUMN_COLLATION 0x00000800L +#define SQL_CT_COLUMN_CONSTRAINT 0x00000200L +#define SQL_CT_COLUMN_DEFAULT 0x00000400L +#define SQL_CT_COMMIT_DELETE 0x00000004L +#define SQL_CT_COMMIT_PRESERVE 0x00000002L +#define SQL_CT_CONSTRAINT_DEFERRABLE 0x00000080L +#define SQL_CT_CONSTRAINT_INITIALLY_DEFERRED 0x00000020L +#define SQL_CT_CONSTRAINT_INITIALLY_IMMEDIATE 0x00000040L +#define SQL_CT_CONSTRAINT_NAME_DEFINITION 0x00002000L +#define SQL_CT_CONSTRAINT_NON_DEFERRABLE 0x00000100L +#define SQL_CT_CREATE_TABLE 0x00000001L +#define SQL_CT_GLOBAL_TEMPORARY 0x00000008L +#define SQL_CT_LOCAL_TEMPORARY 0x00000010L +#define SQL_CT_TABLE_CONSTRAINT 0x00001000L +#define SQL_CTR_CREATE_TRANSLATION 0x00000001L +#define SQL_CU_DML_STATEMENTS SQL_QU_DML_STATEMENTS +#define SQL_CU_INDEX_DEFINITION SQL_QU_INDEX_DEFINITION +#define SQL_CU_PRIVILEGE_DEFINITION SQL_QU_PRIVILEGE_DEFINITION +#define SQL_CU_PROCEDURE_INVOCATION SQL_QU_PROCEDURE_INVOCATION +#define SQL_CU_TABLE_DEFINITION SQL_QU_TABLE_DEFINITION +#define SQL_CVT_GUID 0x1000000L +#define SQL_CVT_INTERVAL_DAY_TIME 0x00100000L +#define SQL_CVT_INTERVAL_YEAR_MONTH 0x00080000L +#define SQL_CVT_WCHAR 0x00200000L +#define SQL_CVT_WLONGVARCHAR 0x00400000L +#define SQL_CVT_WVARCHAR 0x00800000L +#define SQL_DA_DROP_ASSERTION 0x00000001L +#define SQL_DATETIME_LITERALS 119 +#define SQL_DB_DEFAULT SQL_DB_RETURN_TO_POOL +#define SQL_DB_DISCONNECT 1UL +#define SQL_DB_RETURN_TO_POOL 0UL +#define SQL_DC_DROP_COLLATION 0x00000001L +#define SQL_DCS_DROP_CHARACTER_SET 0x00000001L +#define SQL_DD_CASCADE 0x00000004L +#define SQL_DD_DROP_DOMAIN 0x00000001L +#define SQL_DD_RESTRICT 0x00000002L +#define SQL_DDL_INDEX 170 +#define SQL_DELETE_BY_BOOKMARK 6 +#define SQL_DESC_ARRAY_SIZE 20 +#define SQL_DESC_ARRAY_STATUS_PTR 21 +#define SQL_DESC_AUTO_UNIQUE_VALUE SQL_COLUMN_AUTO_INCREMENT +#define SQL_DESC_BASE_COLUMN_NAME 22 +#define SQL_DESC_BASE_TABLE_NAME 23 +#define SQL_DESC_BIND_OFFSET_PTR 24 +#define SQL_DESC_BIND_TYPE 25 +#define SQL_DESC_CASE_SENSITIVE SQL_COLUMN_CASE_SENSITIVE +#define SQL_DESC_CATALOG_NAME SQL_COLUMN_QUALIFIER_NAME +#define SQL_DESC_CONCISE_TYPE SQL_COLUMN_TYPE +#define SQL_DESC_DATETIME_INTERVAL_PRECISION 26 +#define SQL_DESC_DISPLAY_SIZE SQL_COLUMN_DISPLAY_SIZE +#define SQL_DESC_FIXED_PREC_SCALE SQL_COLUMN_MONEY +#define SQL_DESC_LABEL SQL_COLUMN_LABEL +#define SQL_DESC_LITERAL_PREFIX 27 +#define SQL_DESC_LITERAL_SUFFIX 28 +#define SQL_DESC_LOCAL_TYPE_NAME 29 +#define SQL_DESC_MAXIMUM_SCALE 30 +#define SQL_DESC_MINIMUM_SCALE 31 +#define SQL_DESC_NUM_PREC_RADIX 32 +#define SQL_DESC_PARAMETER_TYPE 33 +#define SQL_DESC_ROWS_PROCESSED_PTR 34 +#define SQL_DESC_SCHEMA_NAME SQL_COLUMN_OWNER_NAME +#define SQL_DESC_SEARCHABLE SQL_COLUMN_SEARCHABLE +#define SQL_DESC_TABLE_NAME SQL_COLUMN_TABLE_NAME +#define SQL_DESC_TYPE_NAME SQL_COLUMN_TYPE_NAME +#define SQL_DESC_UNSIGNED SQL_COLUMN_UNSIGNED +#define SQL_DESC_UPDATABLE SQL_COLUMN_UPDATABLE +#define SQL_DI_CREATE_INDEX 0x00000001L +#define SQL_DI_DROP_INDEX 0x00000002L +#define SQL_DIAG_COLUMN_NUMBER (-1247) +#define SQL_DIAG_CURSOR_ROW_COUNT (-1249) +#define SQL_DIAG_ROW_NUMBER (-1248) +#define SQL_DL_SQL92_DATE 0x00000001L +#define SQL_DL_SQL92_INTERVAL_DAY 0x00000020L +#define SQL_DL_SQL92_INTERVAL_DAY_TO_HOUR 0x00000400L +#define SQL_DL_SQL92_INTERVAL_DAY_TO_MINUTE 0x00000800L +#define SQL_DL_SQL92_INTERVAL_DAY_TO_SECOND 0x00001000L +#define SQL_DL_SQL92_INTERVAL_HOUR 0x00000040L +#define SQL_DL_SQL92_INTERVAL_HOUR_TO_MINUTE 0x00002000L +#define SQL_DL_SQL92_INTERVAL_HOUR_TO_SECOND 0x00004000L +#define SQL_DL_SQL92_INTERVAL_MINUTE 0x00000080L +#define SQL_DL_SQL92_INTERVAL_MINUTE_TO_SECOND 0x00008000L +#define SQL_DL_SQL92_INTERVAL_MONTH 0x00000010L +#define SQL_DL_SQL92_INTERVAL_SECOND 0x00000100L +#define SQL_DL_SQL92_INTERVAL_YEAR 0x00000008L +#define SQL_DL_SQL92_INTERVAL_YEAR_TO_MONTH 0x00000200L +#define SQL_DL_SQL92_TIME 0x00000002L +#define SQL_DL_SQL92_TIMESTAMP 0x00000004L +#define SQL_DM_VER 171 +#define SQL_DRIVER_HDESC 135 +#define SQL_DROP_ASSERTION 136 +#define SQL_DROP_CHARACTER_SET 137 +#define SQL_DROP_COLLATION 138 +#define SQL_DROP_DOMAIN 139 +#define SQL_DROP_SCHEMA 140 +#define SQL_DROP_TABLE 141 +#define SQL_DROP_TRANSLATION 142 +#define SQL_DROP_VIEW 143 +#define SQL_DS_CASCADE 0x00000004L +#define SQL_DS_DROP_SCHEMA 0x00000001L +#define SQL_DS_RESTRICT 0x00000002L +#define SQL_DT_CASCADE 0x00000004L +#define SQL_DT_DROP_TABLE 0x00000001L +#define SQL_DT_RESTRICT 0x00000002L +#define SQL_DTC_DONE 0L +#define SQL_DTR_DROP_TRANSLATION 0x00000001L +#define SQL_DV_CASCADE 0x00000004L +#define SQL_DV_DROP_VIEW 0x00000001L +#define SQL_DV_RESTRICT 0x00000002L +#define SQL_DYNAMIC_CURSOR_ATTRIBUTES1 144 +#define SQL_DYNAMIC_CURSOR_ATTRIBUTES2 145 +#define SQL_EXT_API_LAST SQL_API_SQLBINDPARAMETER +#define SQL_EXT_API_START 40 +#define SQL_FETCH_BY_BOOKMARK 7 +#define SQL_FETCH_FIRST_SYSTEM 32 +#define SQL_FETCH_FIRST_USER 31 +#define SQL_FN_CVT_CAST 0x00000002L +#define SQL_FN_STR_BIT_LENGTH 0x00080000L +#define SQL_FN_STR_CHAR_LENGTH 0x00100000L +#define SQL_FN_STR_CHARACTER_LENGTH 0x00200000L +#define SQL_FN_STR_OCTET_LENGTH 0x00400000L +#define SQL_FN_STR_POSITION 0x00800000L +#define SQL_FN_TD_CURRENT_DATE 0x00020000L +#define SQL_FN_TD_CURRENT_TIME 0x00040000L +#define SQL_FN_TD_CURRENT_TIMESTAMP 0x00080000L +#define SQL_FN_TD_EXTRACT 0x00100000L +#define SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1 146 +#define SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2 147 +#define SQL_FUNC_EXISTS(exists, api) \ + ((*(((UWORD*) (exists)) + ((api) >> 4)) & (1 << ((api) & 15)) ) ? \ + SQL_TRUE : SQL_FALSE ) +#define SQL_GB_COLLATE 0x0004 +#define SQL_HANDLE_SENV 5 +#define SQL_IK_ALL (SQL_IK_ASC | SQL_IK_DESC) +#define SQL_IK_ASC 1 +#define SQL_IK_DESC 2 +#define SQL_IK_NONE 0 +#define SQL_INDEX_KEYWORDS 148 +#define SQL_INFO_DRIVER_START 1000 +#define SQL_INFO_LAST SQL_QUALIFIER_LOCATION +#define SQL_INFO_SCHEMA_VIEWS 149 +#define SQL_INITIALLY_DEFERRED 5 +#define SQL_INITIALLY_IMMEDIATE 6 +#define SQL_INSERT_STATEMENT 172 +#define SQL_INTERVAL 10 +#define SQL_IS_INSERT_LITERALS 0x00000001L +#define SQL_IS_INSERT_SEARCHED 0x00000002L +#define SQL_IS_INTEGER (-6) +#define SQL_IS_POINTER (-4) +#define SQL_IS_SELECT_INTO 0x00000004L +#define SQL_IS_SMALLINT (-8) +#define SQL_IS_UINTEGER (-5) +#define SQL_IS_USMALLINT (-7) +#define SQL_ISV_ASSERTIONS 0x00000001L +#define SQL_ISV_CHARACTER_SETS 0x00000002L +#define SQL_ISV_CHECK_CONSTRAINTS 0x00000004L +#define SQL_ISV_COLLATIONS 0x00000008L +#define SQL_ISV_COLUMN_DOMAIN_USAGE 0x00000010L +#define SQL_ISV_COLUMN_PRIVILEGES 0x00000020L +#define SQL_ISV_COLUMNS 0x00000040L +#define SQL_ISV_CONSTRAINT_COLUMN_USAGE 0x00000080L +#define SQL_ISV_CONSTRAINT_TABLE_USAGE 0x00000100L +#define SQL_ISV_DOMAIN_CONSTRAINTS 0x00000200L +#define SQL_ISV_DOMAINS 0x00000400L +#define SQL_ISV_KEY_COLUMN_USAGE 0x00000800L +#define SQL_ISV_REFERENTIAL_CONSTRAINTS 0x00001000L +#define SQL_ISV_SCHEMATA 0x00002000L +#define SQL_ISV_SQL_LANGUAGES 0x00004000L +#define SQL_ISV_TABLE_CONSTRAINTS 0x00008000L +#define SQL_ISV_TABLE_PRIVILEGES 0x00010000L +#define SQL_ISV_TABLES 0x00020000L +#define SQL_ISV_TRANSLATIONS 0x00040000L +#define SQL_ISV_USAGE_PRIVILEGES 0x00080000L +#define SQL_ISV_VIEW_COLUMN_USAGE 0x00100000L +#define SQL_ISV_VIEW_TABLE_USAGE 0x00200000L +#define SQL_ISV_VIEWS 0x00400000L +#define SQL_KEYSET_CURSOR_ATTRIBUTES1 150 +#define SQL_KEYSET_CURSOR_ATTRIBUTES2 151 +#define SQL_MAX_ASYNC_CONCURRENT_STATEMENTS 10022 +#define SQL_NO_COLUMN_NUMBER (-1) +#define SQL_NO_ROW_NUMBER (-1) +#define SQL_NOT_DEFERRABLE 7 +#define SQL_NUM_EXTENSIONS (SQL_EXT_API_LAST-SQL_EXT_API_START+1) +#define SQL_NUM_FUNCTIONS 23 +#define SQL_ODBC_INTERFACE_CONFORMANCE 152 +#define SQL_OIC_CORE 1UL +#define SQL_OIC_LEVEL1 2UL +#define SQL_OIC_LEVEL2 3UL +#define SQL_OV_ODBC2 2UL +#define SQL_OV_ODBC3 3UL +#define SQL_PARAM_ARRAY_ROW_COUNTS 153 +#define SQL_PARAM_ARRAY_SELECTS 154 +#define SQL_PARAM_BIND_BY_COLUMN 0UL +#define SQL_PARAM_BIND_TYPE_DEFAULT SQL_PARAM_BIND_BY_COLUMN +#define SQL_PARAM_DIAG_UNAVAILABLE 1 +#define SQL_PARAM_ERROR 5 +#define SQL_PARAM_IGNORE 1 +#define SQL_PARAM_PROCEED 0 +#define SQL_PARAM_SUCCESS 0 +#define SQL_PARAM_SUCCESS_WITH_INFO 6 +#define SQL_PARAM_UNUSED 7 +#define SQL_PARC_BATCH 1 +#define SQL_PARC_NO_BATCH 2 +#define SQL_PAS_BATCH 1 +#define SQL_PAS_NO_BATCH 2 +#define SQL_PAS_NO_SELECT 3 +#define SQL_ROW_IGNORE 1 +#define SQL_ROW_NUMBER_UNKNOWN (-2) +#define SQL_ROW_PROCEED 0 +#define SQL_ROW_SUCCESS_WITH_INFO 6 +#define SQL_SC_FIPS127_2_TRANSITIONAL 0x00000002L +#define SQL_SC_SQL92_ENTRY 0x00000001L +#define SQL_SC_SQL92_FULL 0x00000008L +#define SQL_SC_SQL92_INTERMEDIATE 0x00000004L +#define SQL_SCC_ISO92_CLI 0x00000002L +#define SQL_SCC_XOPEN_CLI_VERSION1 0x00000001L +#define SQL_SCHEMA_TERM SQL_OWNER_TERM +#define SQL_SCHEMA_USAGE SQL_OWNER_USAGE +#define SQL_SDF_CURRENT_DATE 0x00000001L +#define SQL_SDF_CURRENT_TIME 0x00000002L +#define SQL_SDF_CURRENT_TIMESTAMP 0x00000004L +#define SQL_SFKD_CASCADE 0x00000001L +#define SQL_SFKD_NO_ACTION 0x00000002L +#define SQL_SFKD_SET_DEFAULT 0x00000004L +#define SQL_SFKD_SET_NULL 0x00000008L +#define SQL_SFKU_CASCADE 0x00000001L +#define SQL_SFKU_NO_ACTION 0x00000002L +#define SQL_SFKU_SET_DEFAULT 0x00000004L +#define SQL_SFKU_SET_NULL 0x00000008L +#define SQL_SG_DELETE_TABLE 0x00000020L +#define SQL_SG_INSERT_COLUMN 0x00000080L +#define SQL_SG_INSERT_TABLE 0x00000040L +#define SQL_SG_REFERENCES_COLUMN 0x00000200L +#define SQL_SG_REFERENCES_TABLE 0x00000100L +#define SQL_SG_SELECT_TABLE 0x00000400L +#define SQL_SG_UPDATE_COLUMN 0x00001000L +#define SQL_SG_UPDATE_TABLE 0x00000800L +#define SQL_SG_USAGE_ON_CHARACTER_SET 0x00000002L +#define SQL_SG_USAGE_ON_COLLATION 0x00000004L +#define SQL_SG_USAGE_ON_DOMAIN 0x00000001L +#define SQL_SG_USAGE_ON_TRANSLATION 0x00000008L +#define SQL_SG_WITH_GRANT_OPTION 0x00000010L +#define SQL_SNVF_BIT_LENGTH 0x00000001L +#define SQL_SNVF_CHAR_LENGTH 0x00000002L +#define SQL_SNVF_CHARACTER_LENGTH 0x00000004L +#define SQL_SNVF_EXTRACT 0x00000008L +#define SQL_SNVF_OCTET_LENGTH 0x00000010L +#define SQL_SNVF_POSITION 0x00000020L +#define SQL_SP_BETWEEN 0x00000800L +#define SQL_SP_COMPARISON 0x00001000L +#define SQL_SP_EXISTS 0x00000001L +#define SQL_SP_IN 0x00000400L +#define SQL_SP_ISNOTNULL 0x00000002L +#define SQL_SP_ISNULL 0x00000004L +#define SQL_SP_LIKE 0x00000200L +#define SQL_SP_MATCH_FULL 0x00000008L +#define SQL_SP_MATCH_PARTIAL 0x00000010L +#define SQL_SP_MATCH_UNIQUE_FULL 0x00000020L +#define SQL_SP_MATCH_UNIQUE_PARTIAL 0x00000040L +#define SQL_SP_OVERLAPS 0x00000080L +#define SQL_SP_QUANTIFIED_COMPARISON 0x00002000L +#define SQL_SP_UNIQUE 0x00000100L +#define SQL_SQL_CONFORMANCE 118 +#define SQL_SQL92_DATETIME_FUNCTIONS 155 +#define SQL_SQL92_FOREIGN_KEY_DELETE_RULE 156 +#define SQL_SQL92_FOREIGN_KEY_UPDATE_RULE 157 +#define SQL_SQL92_GRANT 158 +#define SQL_SQL92_NUMERIC_VALUE_FUNCTIONS 159 +#define SQL_SQL92_PREDICATES 160 +#define SQL_SQL92_RELATIONAL_JOIN_OPERATORS 161 +#define SQL_SQL92_REVOKE 162 +#define SQL_SQL92_ROW_VALUE_CONSTRUCTOR 163 +#define SQL_SQL92_STRING_FUNCTIONS 164 +#define SQL_SQL92_VALUE_EXPRESSIONS 165 +#define SQL_SR_CASCADE 0x00000020L +#define SQL_SR_DELETE_TABLE 0x00000080L +#define SQL_SR_GRANT_OPTION_FOR 0x00000010L +#define SQL_SR_INSERT_COLUMN 0x00000200L +#define SQL_SR_INSERT_TABLE 0x00000100L +#define SQL_SR_REFERENCES_COLUMN 0x00000800L +#define SQL_SR_REFERENCES_TABLE 0x00000400L +#define SQL_SR_RESTRICT 0x00000040L +#define SQL_SR_SELECT_TABLE 0x00001000L +#define SQL_SR_UPDATE_COLUMN 0x00004000L +#define SQL_SR_UPDATE_TABLE 0x00002000L +#define SQL_SR_USAGE_ON_CHARACTER_SET 0x00000002L +#define SQL_SR_USAGE_ON_COLLATION 0x00000004L +#define SQL_SR_USAGE_ON_DOMAIN 0x00000001L +#define SQL_SR_USAGE_ON_TRANSLATION 0x00000008L +#define SQL_SRJO_CORRESPONDING_CLAUSE 0x00000001L +#define SQL_SRJO_CROSS_JOIN 0x00000002L +#define SQL_SRJO_EXCEPT_JOIN 0x00000004L +#define SQL_SRJO_FULL_OUTER_JOIN 0x00000008L +#define SQL_SRJO_INNER_JOIN 0x00000010L +#define SQL_SRJO_INTERSECT_JOIN 0x00000020L +#define SQL_SRJO_LEFT_OUTER_JOIN 0x00000040L +#define SQL_SRJO_NATURAL_JOIN 0x00000080L +#define SQL_SRJO_RIGHT_OUTER_JOIN 0x00000100L +#define SQL_SRJO_UNION_JOIN 0x00000200L +#define SQL_SRVC_DEFAULT 0x00000004L +#define SQL_SRVC_NULL 0x00000002L +#define SQL_SRVC_ROW_SUBQUERY 0x00000008L +#define SQL_SRVC_VALUE_EXPRESSION 0x00000001L +#define SQL_SSF_CONVERT 0x00000001L +#define SQL_SSF_LOWER 0x00000002L +#define SQL_SSF_SUBSTRING 0x00000008L +#define SQL_SSF_TRANSLATE 0x00000010L +#define SQL_SSF_TRIM_BOTH 0x00000020L +#define SQL_SSF_TRIM_LEADING 0x00000040L +#define SQL_SSF_TRIM_TRAILING 0x00000080L +#define SQL_SSF_UPPER 0x00000004L +#define SQL_STANDARD_CLI_CONFORMANCE 166 +#define SQL_STATIC_CURSOR_ATTRIBUTES1 167 +#define SQL_STATIC_CURSOR_ATTRIBUTES2 168 +#define SQL_SU_DML_STATEMENTS SQL_OU_DML_STATEMENTS +#define SQL_SU_INDEX_DEFINITION SQL_OU_INDEX_DEFINITION +#define SQL_SU_PRIVILEGE_DEFINITION SQL_OU_PRIVILEGE_DEFINITION +#define SQL_SU_PROCEDURE_INVOCATION SQL_OU_PROCEDURE_INVOCATION +#define SQL_SU_TABLE_DEFINITION SQL_OU_TABLE_DEFINITION +#define SQL_SVE_CASE 0x00000001L +#define SQL_SVE_CAST 0x00000002L +#define SQL_SVE_COALESCE 0x00000004L +#define SQL_SVE_NULLIF 0x00000008L +#define SQL_UB_FIXED SQL_UB_ON +#define SQL_UB_VARIABLE 2UL +#define SQL_UNION_STATEMENT SQL_UNION +#define SQL_UPDATE_BY_BOOKMARK 5 +#define SQL_US_UNION SQL_U_UNION +#define SQL_US_UNION_ALL SQL_U_UNION_ALL +#endif /* ODBCVER >= 0x300 */ +#if (ODBCVER >= 0x0350) +#define SQL_DESC_ROWVER 35 +#define SQL_GUID (-11) +#define SQL_C_GUID SQL_GUID +#ifdef ODBC_STD +#define SQLAllocHandle SQLAllocHandleStd +#define SQLAllocEnv(p) SQLAllocHandleStd(SQL_HANDLE_ENV,SQL_NULL_HANDLE,p) +#define SQL_YEAR SQL_CODE_YEAR +#define SQL_MONTH SQL_CODE_MONTH +#define SQL_DAY SQL_CODE_DAY +#define SQL_HOUR SQL_CODE_HOUR +#define SQL_MINUTE SQL_CODE_MINUTE +#define SQL_SECOND SQL_CODE_SECOND +#define SQL_YEAR_TO_MONTH SQL_CODE_YEAR_TO_MONTH +#define SQL_DAY_TO_HOUR SQL_CODE_DAY_TO_HOUR +#define SQL_DAY_TO_MINUTE SQL_CODE_DAY_TO_MINUTE +#define SQL_DAY_TO_SECOND SQL_CODE_DAY_TO_SECOND +#define SQL_HOUR_TO_MINUTE SQL_CODE_HOUR_TO_MINUTE +#define SQL_HOUR_TO_SECOND SQL_CODE_HOUR_TO_SECOND +#define SQL_MINUTE_TO_SECOND SQL_CODE_MINUTE_TO_SECOND +#endif /* ODBC_STD */ +#endif /* ODBCVER >= 0x0350 */ +#if (ODBCVER >= 0x0351) +#define SQL_ATTR_ANSI_APP 115 +#define SQL_AA_TRUE 1L +#define SQL_AA_FALSE 0L +#endif + +#define TRACE_VERSION 1000 +#define TRACE_ON 1 + +#ifndef RC_INVOKED +#define SQL_ODBC_KEYWORDS \ +"ABSOLUTE,ACTION,ADA,ADD,ALL,ALLOCATE,ALTER,AND,ANY,ARE,AS,"\ +"ASC,ASSERTION,AT,AUTHORIZATION,AVG,"\ +"BEGIN,BETWEEN,BIT,BIT_LENGTH,BOTH,BY,CASCADE,CASCADED,CASE,CAST,CATALOG,"\ +"CHAR,CHAR_LENGTH,CHARACTER,CHARACTER_LENGTH,CHECK,CLOSE,COALESCE,"\ +"COLLATE,COLLATION,COLUMN,COMMIT,CONNECT,CONNECTION,CONSTRAINT,"\ +"CONSTRAINTS,CONTINUE,CONVERT,CORRESPONDING,COUNT,CREATE,CROSS,CURRENT,"\ +"CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP,CURRENT_USER,CURSOR,"\ +"DATE,DAY,DEALLOCATE,DEC,DECIMAL,DECLARE,DEFAULT,DEFERRABLE,"\ +"DEFERRED,DELETE,DESC,DESCRIBE,DESCRIPTOR,DIAGNOSTICS,DISCONNECT,"\ +"DISTINCT,DOMAIN,DOUBLE,DROP,"\ +"ELSE,END,END-EXEC,ESCAPE,EXCEPT,EXCEPTION,EXEC,EXECUTE,"\ +"EXISTS,EXTERNAL,EXTRACT,"\ +"FALSE,FETCH,FIRST,FLOAT,FOR,FOREIGN,FORTRAN,FOUND,FROM,FULL,"\ +"GET,GLOBAL,GO,GOTO,GRANT,GROUP,HAVING,HOUR,"\ +"IDENTITY,IMMEDIATE,IN,INCLUDE,INDEX,INDICATOR,INITIALLY,INNER,"\ +"INPUT,INSENSITIVE,INSERT,INT,INTEGER,INTERSECT,INTERVAL,INTO,IS,ISOLATION,"\ +"JOIN,KEY,LANGUAGE,LAST,LEADING,LEFT,LEVEL,LIKE,LOCAL,LOWER,"\ +"MATCH,MAX,MIN,MINUTE,MODULE,MONTH,"\ +"NAMES,NATIONAL,NATURAL,NCHAR,NEXT,NO,NONE,NOT,NULL,NULLIF,NUMERIC,"\ +"OCTET_LENGTH,OF,ON,ONLY,OPEN,OPTION,OR,ORDER,OUTER,OUTPUT,OVERLAPS,"\ +"PAD,PARTIAL,PASCAL,PLI,POSITION,PRECISION,PREPARE,PRESERVE,"\ +"PRIMARY,PRIOR,PRIVILEGES,PROCEDURE,PUBLIC,"\ +"READ,REAL,REFERENCES,RELATIVE,RESTRICT,REVOKE,RIGHT,ROLLBACK,ROWS"\ +"SCHEMA,SCROLL,SECOND,SECTION,SELECT,SESSION,SESSION_USER,SET,SIZE,"\ +"SMALLINT,SOME,SPACE,SQL,SQLCA,SQLCODE,SQLERROR,SQLSTATE,SQLWARNING,"\ +"SUBSTRING,SUM,SYSTEM_USER,"\ +"TABLE,TEMPORARY,THEN,TIME,TIMESTAMP,TIMEZONE_HOUR,TIMEZONE_MINUTE,"\ +"TO,TRAILING,TRANSACTION,TRANSLATE,TRANSLATION,TRIM,TRUE,"\ +"UNION,UNIQUE,UNKNOWN,UPDATE,UPPER,USAGE,USER,USING,"\ +"VALUE,VALUES,VARCHAR,VARYING,VIEW,WHEN,WHENEVER,WHERE,WITH,WORK,WRITE,"\ +"YEAR,ZONE" + +SQLRETURN SQL_API SQLDriverConnect(SQLHDBC,SQLHWND,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*,SQLUSMALLINT); +SQLRETURN SQL_API SQLBrowseConnect(SQLHDBC,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*); +SQLRETURN SQL_API SQLColumnPrivileges(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT); +SQLRETURN SQL_API SQLColAttributes(SQLHSTMT,SQLUSMALLINT, SQLUSMALLINT, SQLPOINTER, SQLSMALLINT, SQLSMALLINT*, SQLLEN*); +SQLRETURN SQL_API SQLDescribeParam(SQLHSTMT,SQLUSMALLINT,SQLSMALLINT*,SQLULEN*,SQLSMALLINT*,SQLSMALLINT*); +SQLRETURN SQL_API SQLExtendedFetch(SQLHSTMT,SQLUSMALLINT,SQLINTEGER,SQLUINTEGER*,SQLUSMALLINT*); +SQLRETURN SQL_API SQLForeignKeys(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT); +SQLRETURN SQL_API SQLMoreResults(SQLHSTMT); +SQLRETURN SQL_API SQLNativeSql(SQLHDBC,SQLCHAR*,SQLINTEGER,SQLCHAR*,SQLINTEGER,SQLINTEGER*); +SQLRETURN SQL_API SQLNumParams(SQLHSTMT,SQLSMALLINT*); +SQLRETURN SQL_API SQLParamOptions(SQLHSTMT,SQLUINTEGER,SQLUINTEGER*); +SQLRETURN SQL_API SQLPrimaryKeys(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT); +SQLRETURN SQL_API SQLProcedureColumns(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT); +SQLRETURN SQL_API SQLProcedures(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT); +SQLRETURN SQL_API SQLSetPos(SQLHSTMT,SQLUSMALLINT,SQLUSMALLINT,SQLUSMALLINT); +SQLRETURN SQL_API SQLTablePrivileges(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT); +SQLRETURN SQL_API SQLDrivers(SQLHENV,SQLUSMALLINT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*); +SQLRETURN SQL_API SQLBindParameter(SQLHSTMT,SQLUSMALLINT,SQLSMALLINT,SQLSMALLINT,SQLSMALLINT,SQLULEN,SQLSMALLINT,SQLPOINTER,SQLLEN,SQLLEN*); +SQLRETURN SQL_API SQLSetScrollOptions(SQLHSTMT,SQLUSMALLINT,SQLLEN,SQLUSMALLINT); /* deprecated */ +DWORD SQL_API ODBCGetTryWaitValue(void); +BOOL SQL_API ODBCSetTryWaitValue(DWORD); +RETCODE SQL_API TraceOpenLogFile(LPWSTR,LPWSTR,DWORD); +RETCODE SQL_API TraceCloseLogFile(void); +VOID SQL_API TraceReturn(RETCODE,RETCODE); +DWORD SQL_API TraceVersion(void); +#if (ODBCVER >= 0x0300) +SQLRETURN SQL_API SQLBulkOperations(SQLHSTMT,SQLSMALLINT); +SQLRETURN SQL_API SQLAllocHandleStd( SQLSMALLINT,SQLHANDLE,SQLHANDLE*); +#endif +#endif /* ndef RC_INVOKED */ +#include <sqlucode.h> +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/sqltypes.h b/reactos/w32api/include/sqltypes.h new file mode 100644 index 00000000000..fcc713550c9 --- /dev/null +++ b/reactos/w32api/include/sqltypes.h @@ -0,0 +1,165 @@ +#ifndef _SQLTYPES_H +#define _SQLTYPES_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define SQL_API __stdcall +#ifndef RC_INVOKED +#define __need_wchar_t +#include <stddef.h> +typedef signed char SCHAR; +typedef long SDWORD; +typedef short SWORD; +typedef ULONG UDWORD; +typedef USHORT UWORD; +typedef signed long SLONG; +typedef signed short SSHORT; +typedef double SDOUBLE; +typedef double LDOUBLE; +typedef float SFLOAT; +typedef PVOID PTR; +typedef PVOID HENV; +typedef PVOID HDBC; +typedef PVOID HSTMT; +typedef short RETCODE; +typedef UCHAR SQLCHAR; +typedef SCHAR SQLSCHAR; +typedef SDWORD SQLINTEGER; +typedef SWORD SQLSMALLINT; +#ifndef __WIN64 +typedef UDWORD SQLUINTEGER; +#endif +typedef UWORD SQLUSMALLINT; +typedef PVOID SQLPOINTER; +#if (ODBCVER >= 0x0300) +typedef void* SQLHANDLE; +typedef SQLHANDLE SQLHENV; +typedef SQLHANDLE SQLHDBC; +typedef SQLHANDLE SQLHSTMT; +typedef SQLHANDLE SQLHDESC; +#else +typedef void* SQLHENV; +typedef void* SQLHDBC; +typedef void* SQLHSTMT; +#endif +typedef SQLSMALLINT SQLRETURN; +typedef HWND SQLHWND; +typedef ULONG BOOKMARK; +#ifdef _WIN64 +typedef INT64 SQLLEN; +typedef INT64 SQLROWOFFSET; +typedef UINT64 SQLROWCOUNT; +typedef UINT64 SQLULEN; +typedef UINT64 SQLTRANSID; +typedef unsigned long SQLSETPOSIROW; +#else +#define SQLLEN SQLINTEGER +#define SQLROWOFFSET SQLINTEGER +#define SQLROWCOUNT SQLUINTEGER +#define SQLULEN SQLUINTEGER +#define SQLTRANSID DWORD +#define SQLSETPOSIROW SQLUSMALLINT +#endif +typedef wchar_t SQLWCHAR; +#ifdef UNICODE +typedef SQLWCHAR SQLTCHAR; +#else +typedef SQLCHAR SQLTCHAR; +#endif /* UNICODE */ +#if (ODBCVER >= 0x0300) +typedef unsigned char SQLDATE; +typedef unsigned char SQLDECIMAL; +typedef double SQLDOUBLE; +typedef double SQLFLOAT; +typedef unsigned char SQLNUMERIC; +typedef float SQLREAL; +typedef unsigned char SQLTIME; +typedef unsigned char SQLTIMESTAMP; +typedef unsigned char SQLVARCHAR; +#define ODBCINT64 __int64 +typedef __int64 SQLBIGINT; +typedef unsigned __int64 SQLUBIGINT; +#endif + +typedef struct tagDATE_STRUCT { + SQLSMALLINT year; + SQLUSMALLINT month; + SQLUSMALLINT day; +} DATE_STRUCT; +typedef struct tagTIME_STRUCT { + SQLUSMALLINT hour; + SQLUSMALLINT minute; + SQLUSMALLINT second; +} TIME_STRUCT; +typedef struct tagTIMESTAMP_STRUCT { + SQLSMALLINT year; + SQLUSMALLINT month; + SQLUSMALLINT day; + SQLUSMALLINT hour; + SQLUSMALLINT minute; + SQLUSMALLINT second; + SQLUINTEGER fraction; +} TIMESTAMP_STRUCT; +#if (ODBCVER >= 0x0300) +typedef DATE_STRUCT SQL_DATE_STRUCT; +typedef TIME_STRUCT SQL_TIME_STRUCT; +typedef TIMESTAMP_STRUCT SQL_TIMESTAMP_STRUCT; +typedef enum { + SQL_IS_YEAR = 1,SQL_IS_MONTH,SQL_IS_DAY,SQL_IS_HOUR, + SQL_IS_MINUTE,SQL_IS_SECOND,SQL_IS_YEAR_TO_MONTH,SQL_IS_DAY_TO_HOUR, + SQL_IS_DAY_TO_MINUTE,SQL_IS_DAY_TO_SECOND,SQL_IS_HOUR_TO_MINUTE, + SQL_IS_HOUR_TO_SECOND,SQL_IS_MINUTE_TO_SECOND +} SQLINTERVAL; +typedef struct tagSQL_YEAR_MONTH { + SQLUINTEGER year; + SQLUINTEGER month; +} SQL_YEAR_MONTH_STRUCT; +typedef struct tagSQL_DAY_SECOND { + SQLUINTEGER day; + SQLUINTEGER hour; + SQLUINTEGER minute; + SQLUINTEGER second; + SQLUINTEGER fraction; +} SQL_DAY_SECOND_STRUCT; +typedef struct tagSQL_INTERVAL_STRUCT { + SQLINTERVAL interval_type; + SQLSMALLINT interval_sign; + union { + SQL_YEAR_MONTH_STRUCT year_month; + SQL_DAY_SECOND_STRUCT day_second; + } intval; +} SQL_INTERVAL_STRUCT; +#define SQL_MAX_NUMERIC_LEN 16 +typedef struct tagSQL_NUMERIC_STRUCT { + SQLCHAR precision; + SQLSCHAR scale; + SQLCHAR sign; + SQLCHAR val[SQL_MAX_NUMERIC_LEN]; +} SQL_NUMERIC_STRUCT; +#endif /* ODBCVER >= 0x0300 */ +#if (ODBCVER >= 0x0350) + +#ifdef _GUID_DEFINED +# warning _GUID_DEFINED is deprecated, use GUID_DEFINED instead +#endif + +#if defined _GUID_DEFINED || defined GUID_DEFINED +typedef GUID SQLGUID; +#else +typedef struct tagSQLGUID{ + DWORD Data1; + WORD Data2; + WORD Data3; + BYTE Data4[ 8 ]; +} SQLGUID; +#endif /* GUID_DEFINED */ +#endif /* ODBCVER >= 0x0350 */ +#endif /* RC_INVOKED */ +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/sqlucode.h b/reactos/w32api/include/sqlucode.h new file mode 100644 index 00000000000..688ced2c7a8 --- /dev/null +++ b/reactos/w32api/include/sqlucode.h @@ -0,0 +1,142 @@ +#ifndef _SQLUCODE_H +#define _SQLUCODE_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#include <sqlext.h> +#ifdef __cplusplus +extern "C" { +#endif +#define SQL_WCHAR (-8) +#define SQL_WVARCHAR (-9) +#define SQL_WLONGVARCHAR (-10) +#define SQL_C_WCHAR SQL_WCHAR +#define SQL_SQLSTATE_SIZEW 10 +#ifdef UNICODE +#define SQL_C_TCHAR SQL_C_WCHAR +#else +#define SQL_C_TCHAR SQL_C_CHAR +#endif +#ifndef RC_INVOKED +SQLRETURN SQL_API SQLBrowseConnectA(SQLHDBC,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*); +SQLRETURN SQL_API SQLBrowseConnectW(SQLHDBC,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLSMALLINT*); +SQLRETURN SQL_API SQLColAttributeA(SQLHSTMT,SQLSMALLINT,SQLSMALLINT,SQLPOINTER,SQLSMALLINT,SQLSMALLINT*,SQLPOINTER); +SQLRETURN SQL_API SQLColAttributeW(SQLHSTMT,SQLUSMALLINT,SQLUSMALLINT,SQLPOINTER,SQLSMALLINT,SQLSMALLINT*,SQLPOINTER); +SQLRETURN SQL_API SQLColAttributesA(SQLHSTMT,SQLUSMALLINT,SQLUSMALLINT,SQLPOINTER,SQLSMALLINT,SQLSMALLINT*,SQLLEN*); +SQLRETURN SQL_API SQLColAttributesW(SQLHSTMT,SQLUSMALLINT,SQLUSMALLINT,SQLPOINTER,SQLSMALLINT,SQLSMALLINT*,SQLLEN*); +SQLRETURN SQL_API SQLColumnPrivilegesA( SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT ,SQLCHAR*,SQLSMALLINT ); +SQLRETURN SQL_API SQLColumnPrivilegesW( SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT ); +SQLRETURN SQL_API SQLColumnsA(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT ,SQLCHAR*,SQLSMALLINT ); +SQLRETURN SQL_API SQLColumnsW(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT ,SQLWCHAR*,SQLSMALLINT ); +SQLRETURN SQL_API SQLConnectA(SQLHDBC,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT); +SQLRETURN SQL_API SQLConnectW(SQLHDBC,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT); +SQLRETURN SQL_API SQLDataSourcesA(SQLHENV,SQLUSMALLINT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*); +SQLRETURN SQL_API SQLDataSourcesW(SQLHENV,SQLUSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLSMALLINT*,SQLWCHAR*,SQLSMALLINT,SQLSMALLINT*); +SQLRETURN SQL_API SQLDescribeColA(SQLHSTMT,SQLUSMALLINT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*,SQLSMALLINT*,SQLULEN*,SQLSMALLINT*,SQLSMALLINT*); +SQLRETURN SQL_API SQLDescribeColW(SQLHSTMT,SQLUSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLSMALLINT*,SQLSMALLINT*,SQLULEN*,SQLSMALLINT*,SQLSMALLINT*); +SQLRETURN SQL_API SQLDriverConnectA(SQLHDBC,SQLHWND,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*,SQLUSMALLINT); +SQLRETURN SQL_API SQLDriverConnectW(SQLHDBC,SQLHWND,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLSMALLINT*,SQLUSMALLINT); +SQLRETURN SQL_API SQLDriversA(SQLHENV,SQLUSMALLINT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*); +SQLRETURN SQL_API SQLDriversW(SQLHENV,SQLUSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLSMALLINT*,SQLWCHAR*,SQLSMALLINT,SQLSMALLINT*); +SQLRETURN SQL_API SQLErrorA(SQLHENV,SQLHDBC,SQLHSTMT,SQLCHAR*,SQLINTEGER*,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*); +SQLRETURN SQL_API SQLErrorW(SQLHENV,SQLHDBC,SQLHSTMT,SQLWCHAR*,SQLINTEGER*,SQLWCHAR*,SQLSMALLINT,SQLSMALLINT*); +SQLRETURN SQL_API SQLExecDirectA(SQLHSTMT,SQLCHAR*,SQLINTEGER); +SQLRETURN SQL_API SQLExecDirectW(SQLHSTMT,SQLWCHAR*,SQLINTEGER); +SQLRETURN SQL_API SQLForeignKeysA(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT); +SQLRETURN SQL_API SQLForeignKeysW(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT); +SQLRETURN SQL_API SQLGetConnectAttrA(SQLHDBC,SQLINTEGER,SQLPOINTER,SQLINTEGER,SQLINTEGER*); +SQLRETURN SQL_API SQLGetConnectAttrW(SQLHDBC,SQLINTEGER,SQLPOINTER,SQLINTEGER,SQLINTEGER*); +SQLRETURN SQL_API SQLGetConnectOptionA(SQLHDBC,SQLUSMALLINT,SQLPOINTER); +SQLRETURN SQL_API SQLGetConnectOptionW(SQLHDBC,SQLUSMALLINT,SQLPOINTER); +SQLRETURN SQL_API SQLGetCursorNameA(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*); +SQLRETURN SQL_API SQLGetCursorNameW(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLSMALLINT*); +SQLRETURN SQL_API SQLGetInfoA(SQLHDBC,SQLUSMALLINT,SQLPOINTER,SQLSMALLINT,SQLSMALLINT*); +SQLRETURN SQL_API SQLGetInfoW(SQLHDBC,SQLUSMALLINT,SQLPOINTER,SQLSMALLINT,SQLSMALLINT*); +SQLRETURN SQL_API SQLGetTypeInfoA(SQLHSTMT,SQLSMALLINT); +SQLRETURN SQL_API SQLGetTypeInfoW(SQLHSTMT,SQLSMALLINT); +SQLRETURN SQL_API SQLNativeSqlA(SQLHDBC,SQLCHAR*,SQLINTEGER,SQLCHAR*,SQLINTEGER,SQLINTEGER*); +SQLRETURN SQL_API SQLNativeSqlW(SQLHDBC,SQLWCHAR*,SQLINTEGER,SQLWCHAR*,SQLINTEGER,SQLINTEGER*); +SQLRETURN SQL_API SQLPrepareA(SQLHSTMT,SQLCHAR*,SQLINTEGER); +SQLRETURN SQL_API SQLPrepareW(SQLHSTMT,SQLWCHAR*,SQLINTEGER); +SQLRETURN SQL_API SQLPrimaryKeysA(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT ); +SQLRETURN SQL_API SQLPrimaryKeysW(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT); +SQLRETURN SQL_API SQLProcedureColumnsA(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT); +SQLRETURN SQL_API SQLProcedureColumnsW(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT); +SQLRETURN SQL_API SQLProceduresA(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT); +SQLRETURN SQL_API SQLProceduresW(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT); +SQLRETURN SQL_API SQLSetConnectAttrA(SQLHDBC,SQLINTEGER,SQLPOINTER,SQLINTEGER); +SQLRETURN SQL_API SQLSetConnectAttrW(SQLHDBC,SQLINTEGER,SQLPOINTER,SQLINTEGER); +SQLRETURN SQL_API SQLSetConnectOptionA(SQLHDBC,SQLUSMALLINT,SQLULEN); +SQLRETURN SQL_API SQLSetConnectOptionW(SQLHDBC,SQLUSMALLINT,SQLULEN); +SQLRETURN SQL_API SQLSetCursorNameA(SQLHSTMT,SQLCHAR*,SQLSMALLINT); +SQLRETURN SQL_API SQLSetCursorNameW(SQLHSTMT,SQLWCHAR*,SQLSMALLINT); +SQLRETURN SQL_API SQLSpecialColumnsA(SQLHSTMT,SQLUSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT ,SQLUSMALLINT,SQLUSMALLINT); +SQLRETURN SQL_API SQLSpecialColumnsW(SQLHSTMT,SQLUSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT ,SQLUSMALLINT,SQLUSMALLINT); +SQLRETURN SQL_API SQLStatisticsA(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT ,SQLUSMALLINT,SQLUSMALLINT); +SQLRETURN SQL_API SQLStatisticsW(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT ,SQLUSMALLINT,SQLUSMALLINT); +SQLRETURN SQL_API SQLTablePrivilegesA(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT); +SQLRETURN SQL_API SQLTablePrivilegesW(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT ); +SQLRETURN SQL_API SQLTablesA(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT); +SQLRETURN SQL_API SQLTablesW(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT); +#if (ODBCVER >= 0x0300) +SQLRETURN SQL_API SQLGetDescFieldA(SQLHDESC,SQLSMALLINT,SQLSMALLINT,SQLPOINTER,SQLINTEGER,SQLINTEGER*); +SQLRETURN SQL_API SQLGetDescFieldW(SQLHDESC,SQLSMALLINT,SQLSMALLINT,SQLPOINTER,SQLINTEGER,SQLINTEGER*); +SQLRETURN SQL_API SQLSetDescFieldA(SQLHDESC,SQLSMALLINT,SQLSMALLINT,SQLPOINTER,SQLINTEGER); +SQLRETURN SQL_API SQLSetDescFieldW(SQLHDESC,SQLSMALLINT,SQLSMALLINT,SQLPOINTER,SQLINTEGER); +SQLRETURN SQL_API SQLGetDescRecA(SQLHDESC,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*,SQLSMALLINT*,SQLSMALLINT*,SQLLEN*,SQLSMALLINT*,SQLSMALLINT*,SQLSMALLINT*); +SQLRETURN SQL_API SQLGetDescRecW(SQLHDESC,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLSMALLINT*,SQLSMALLINT*,SQLSMALLINT*,SQLLEN*,SQLSMALLINT*,SQLSMALLINT*,SQLSMALLINT*); +SQLRETURN SQL_API SQLGetDiagFieldA(SQLSMALLINT,SQLHANDLE,SQLSMALLINT,SQLSMALLINT,SQLPOINTER,SQLSMALLINT,SQLSMALLINT*); +SQLRETURN SQL_API SQLGetDiagFieldW(SQLSMALLINT,SQLHANDLE,SQLSMALLINT,SQLSMALLINT,SQLPOINTER,SQLSMALLINT,SQLSMALLINT*); +SQLRETURN SQL_API SQLGetDiagRecA(SQLSMALLINT,SQLHANDLE,SQLSMALLINT,SQLCHAR*,SQLINTEGER*,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*); +SQLRETURN SQL_API SQLGetDiagRecW(SQLSMALLINT,SQLHANDLE,SQLSMALLINT,SQLWCHAR*,SQLINTEGER*,SQLWCHAR*,SQLSMALLINT,SQLSMALLINT*); +SQLRETURN SQL_API SQLGetStmtAttrA(SQLHSTMT,SQLINTEGER,SQLPOINTER,SQLINTEGER,SQLINTEGER*); +SQLRETURN SQL_API SQLGetStmtAttrW(SQLHSTMT,SQLINTEGER,SQLPOINTER,SQLINTEGER,SQLINTEGER*); +SQLRETURN SQL_API SQLSetStmtAttrA(SQLHSTMT,SQLINTEGER,SQLPOINTER,SQLINTEGER); +SQLRETURN SQL_API SQLSetStmtAttrW(SQLHSTMT,SQLINTEGER,SQLPOINTER,SQLINTEGER); +#endif /* (ODBCVER >= 0x0300) */ + +#if defined (UNICODE) && !defined (SQL_NOUNICODEMAP) +#define SQLBrowseConnect SQLBrowseConnectW +#define SQLColAttribute SQLColAttributeW +#define SQLColAttributes SQLColAttributesW +#define SQLColumnPrivileges SQLColumnPrivilegesW +#define SQLColumns SQLColumnsW +#define SQLConnect SQLConnectW +#define SQLDataSources SQLDataSourcesW +#define SQLDescribeCol SQLDescribeColW +#define SQLDriverConnect SQLDriverConnectW +#define SQLDrivers SQLDriversW +#define SQLError SQLErrorW +#define SQLExecDirect SQLExecDirectW +#define SQLForeignKeys SQLForeignKeysW +#define SQLGetConnectAttr SQLGetConnectAttrW +#define SQLGetConnectOption SQLGetConnectOptionW +#define SQLGetCursorName SQLGetCursorNameW +#define SQLGetDescField SQLGetDescFieldW +#define SQLGetDescRec SQLGetDescRecW +#define SQLGetDiagField SQLGetDiagFieldW +#define SQLGetDiagRec SQLGetDiagRecW +#define SQLGetInfo SQLGetInfoW +#define SQLGetStmtAttr SQLGetStmtAttrW +#define SQLGetTypeInfo SQLGetTypeInfoW +#define SQLNativeSql SQLNativeSqlW +#define SQLPrepare SQLPrepareW +#define SQLPrimaryKeys SQLPrimaryKeysW +#define SQLProcedureColumns SQLProcedureColumnsW +#define SQLProcedures SQLProceduresW +#define SQLSetConnectAttr SQLSetConnectAttrW +#define SQLSetConnectOption SQLSetConnectOptionW +#define SQLSetCursorName SQLSetCursorNameW +#define SQLSetDescField SQLSetDescFieldW +#define SQLSetStmtAttr SQLSetStmtAttrW +#define SQLSpecialColumns SQLSpecialColumnsW +#define SQLStatistics SQLStatisticsW +#define SQLTablePrivileges SQLTablePrivilegesW +#define SQLTables SQLTablesW +#endif /* UNICODE && ! SQL_NOUNICODEMAP */ +#endif /* RC_INVOKED */ +#ifdef __cplusplus +} +#endif /* __cplusplus*/ +#endif /* ndef _SQLUCODE_H */ diff --git a/reactos/w32api/include/sspi.h b/reactos/w32api/include/sspi.h new file mode 100644 index 00000000000..7f63e1ca7be --- /dev/null +++ b/reactos/w32api/include/sspi.h @@ -0,0 +1,338 @@ +#ifndef _SSPI_H +#define _SSPI_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define SECPKG_CRED_INBOUND 1 +#define SECPKG_CRED_OUTBOUND 2 +#define SECPKG_CRED_BOTH (SECPKG_CRED_OUTBOUND|SECPKG_CRED_INBOUND) +#define SECPKG_CRED_ATTR_NAMES 1 + +#define SECPKG_FLAG_INTEGRITY 1 +#define SECPKG_FLAG_PRIVACY 2 +#define SECPKG_FLAG_TOKEN_ONLY 4 +#define SECPKG_FLAG_DATAGRAM 8 +#define SECPKG_FLAG_CONNECTION 16 +#define SECPKG_FLAG_MULTI_REQUIRED 32 +#define SECPKG_FLAG_CLIENT_ONLY 64 +#define SECPKG_FLAG_EXTENDED_ERROR 128 +#define SECPKG_FLAG_IMPERSONATION 256 +#define SECPKG_FLAG_ACCEPT_WIN32_NAME 512 +#define SECPKG_FLAG_STREAM 1024 + +#define SECPKG_ATTR_AUTHORITY 6 +#define SECPKG_ATTR_CONNECTION_INFO 90 +#define SECPKG_ATTR_ISSUER_LIST 80 +#define SECPKG_ATTR_ISSUER_LIST_EX 89 +#define SECPKG_ATTR_KEY_INFO 5 +#define SECPKG_ATTR_LIFESPAN 2 +#define SECPKG_ATTR_LOCAL_CERT_CONTEXT 84 +#define SECPKG_ATTR_LOCAL_CRED 82 +#define SECPKG_ATTR_NAMES 1 +#define SECPKG_ATTR_PROTO_INFO 7 +#define SECPKG_ATTR_REMOTE_CERT_CONTEXT 83 +#define SECPKG_ATTR_REMOTE_CRED 81 +#define SECPKG_ATTR_SIZES 0 +#define SECPKG_ATTR_STREAM_SIZES 4 + +#define SECBUFFER_EMPTY 0 +#define SECBUFFER_DATA 1 +#define SECBUFFER_TOKEN 2 +#define SECBUFFER_PKG_PARAMS 3 +#define SECBUFFER_MISSING 4 +#define SECBUFFER_EXTRA 5 +#define SECBUFFER_STREAM_TRAILER 6 +#define SECBUFFER_STREAM_HEADER 7 +#define SECBUFFER_PADDING 9 +#define SECBUFFER_STREAM 10 +#define SECBUFFER_READONLY 0x80000000 +#define SECBUFFER_ATTRMASK 0xf0000000 + +#define UNISP_NAME_A "Microsoft Unified Security Protocol Provider" +#define UNISP_NAME_W L"Microsoft Unified Security Protocol Provider" +#define SECBUFFER_VERSION 0 + +typedef struct _SecHandle { + ULONG_PTR dwLower; + ULONG_PTR dwUpper; +} SecHandle, *PSecHandle; +typedef struct _SecBuffer { + ULONG cbBuffer; + ULONG BufferType; + PVOID pvBuffer; +} SecBuffer, *PSecBuffer; +typedef SecHandle CredHandle; +typedef PSecHandle PCredHandle; +typedef SecHandle CtxtHandle; +typedef PSecHandle PCtxtHandle; +typedef struct _SECURITY_INTEGER { + unsigned long LowPart; + long HighPart; +} SECURITY_INTEGER; +typedef SECURITY_INTEGER TimeStamp, *PTimeStamp; +typedef struct _SecBufferDesc { + ULONG ulVersion; + ULONG cBuffers; + PSecBuffer pBuffers; +} SecBufferDesc, *PSecBufferDesc; +typedef struct _SecPkgContext_StreamSizes { + ULONG cbHeader; + ULONG cbTrailer; + ULONG cbMaximumMessage; + ULONG cBuffers; + ULONG cbBlockSize; +} SecPkgContext_StreamSizes, *PSecPkgContext_StreamSizes; +typedef struct _SecPkgContext_Sizes { + ULONG cbMaxToken; + ULONG cbMaxSIgnature; + ULONG cbBlockSize; + ULONG cbSecurityTrailer; +} SecPkgContext_Sizes, *PSecPkgContext_Sizes; +typedef struct _SecPkgContext_AuthorityW { + SEC_WCHAR* sAuthorityName; +} SecPkgContext_AuthorityW, *PSecPkgContext_AuthorityW; +typedef struct _SecPkgContext_AuthorityA { + SEC_CHAR* sAuthorityName; +} SecPkgContext_AuthorityA, *PSecPkgContext_AuthorityA; +typedef struct _SecPkgContext_KeyInfoW { + SEC_WCHAR* sSignatureAlgorithmName; + SEC_WCHAR* sEncryptAlgorithmName; + ULONG KeySize; + ULONG SignatureAlgorithm; + ULONG EncryptAlgorithm; +} SecPkgContext_KeyInfoW, *PSecPkgContext_KeyInfoW; +typedef struct _SecPkgContext_KeyInfoA { + SEC_CHAR* sSignatureAlgorithmName; + SEC_CHAR* sEncryptAlgorithmName; + ULONG KeySize; + ULONG SignatureAlgorithm; + ULONG EncryptAlgorithm; +} SecPkgContext_KeyInfoA, *PSecPkgContext_KeyInfoA; +typedef struct _SecPkgContext_LifeSpan { + TimeStamp tsStart; + TimeStamp tsExpiry; +} SecPkgContext_LifeSpan, *PSecPkgContext_LifeSpan; +typedef struct _SecPkgContext_NamesW { + SEC_WCHAR* sUserName; +} SecPkgContext_NamesW, *PSecPkgContext_NamesW; +typedef struct _SecPkgContext_NamesA { + SEC_CHAR* sUserName; +} SecPkgContext_NamesA, *PSecPkgContext_NamesA; +typedef struct _SecPkgInfoW { + ULONG fCapabilities; + USHORT wVersion; + USHORT wRPCID; + ULONG cbMaxToken; + SEC_WCHAR* Name; + SEC_WCHAR* Comment; +} SecPkgInfoW, *PSecPkgInfoW; +typedef struct _SecPkgInfoA { + ULONG fCapabilities; + USHORT wVersion; + USHORT wRPCID; + ULONG cbMaxToken; + SEC_CHAR* Name; + SEC_CHAR* Comment; +} SecPkgInfoA, *PSecPkgInfoA; +/* supported only in win2k+, so it should be a PSecPkgInfoW */ +/* PSDK does not say it has ANSI/Unicode versions */ +typedef struct _SecPkgContext_PackageInfo { + PSecPkgInfoW PackageInfo; +} SecPkgContext_PackageInfo, *PSecPkgContext_PackageInfo; +typedef struct _SecPkgCredentials_NamesW { + SEC_WCHAR* sUserName; +} SecPkgCredentialsNamesW, *PSecPkgCredentialsNamesW; +typedef struct _SecPkgCredentials_NamesA { + SEC_CHAR* sUserName; +} SecPkgCredentialsNamesA, *PSecPkgCredentialsNamesA; + +/* TODO: missing type in SDK */ +typedef void (*SEC_GET_KEY_FN)(); + +typedef SECURITY_STATUS (WINAPI *ENUMERATE_SECURITY_PACKAGES_FN_W)(PULONG,PSecPkgInfoW*); +typedef SECURITY_STATUS (WINAPI *ENUMERATE_SECURITY_PACKAGES_FN_A)(PULONG,PSecPkgInfoA*); +typedef SECURITY_STATUS (WINAPI *QUERY_CREDENTIALS_ATTRIBUTES_FN_W)(PCredHandle,ULONG,PVOID); +typedef SECURITY_STATUS (WINAPI *QUERY_CREDENTIALS_ATTRIBUTES_FN_A)(PCredHandle,ULONG,PVOID); +typedef SECURITY_STATUS (WINAPI *ACQUIRE_CREDENTIALS_HANDLE_FN_W)(SEC_WCHAR*,SEC_WCHAR*,ULONG,PLUID,PVOID,SEC_GET_KEY_FN,PVOID,PCredHandle,PTimeStamp); +typedef SECURITY_STATUS (WINAPI *ACQUIRE_CREDENTIALS_HANDLE_FN_A)(SEC_CHAR*,SEC_CHAR*,ULONG,PLUID,PVOID,SEC_GET_KEY_FN,PVOID,PCredHandle,PTimeStamp); +typedef SECURITY_STATUS (WINAPI *FREE_CREDENTIALS_HANDLE_FN)(PCredHandle); +typedef SECURITY_STATUS (WINAPI *INITIALIZE_SECURITY_CONTEXT_FN_W)(PCredHandle,PCtxtHandle,SEC_WCHAR*,ULONG,ULONG,ULONG,PSecBufferDesc,ULONG,PCtxtHandle,PSecBufferDesc,PULONG,PTimeStamp); +typedef SECURITY_STATUS (WINAPI *INITIALIZE_SECURITY_CONTEXT_FN_A)(PCredHandle,PCtxtHandle,SEC_CHAR*,ULONG,ULONG,ULONG,PSecBufferDesc,ULONG,PCtxtHandle,PSecBufferDesc,PULONG,PTimeStamp); +typedef SECURITY_STATUS (WINAPI *ACCEPT_SECURITY_CONTEXT_FN)(PCredHandle,PCtxtHandle,PSecBufferDesc,ULONG,ULONG,PCtxtHandle,PSecBufferDesc,PULONG,PTimeStamp); +typedef SECURITY_STATUS (WINAPI *COMPLETE_AUTH_TOKEN_FN)(PCtxtHandle,PSecBufferDesc); +typedef SECURITY_STATUS (WINAPI *DELETE_SECURITY_CONTEXT_FN)(PCtxtHandle); +typedef SECURITY_STATUS (WINAPI *APPLY_CONTROL_TOKEN_FN_W)(PCtxtHandle,PSecBufferDesc); +typedef SECURITY_STATUS (WINAPI *APPLY_CONTROL_TOKEN_FN_A)(PCtxtHandle,PSecBufferDesc); +typedef SECURITY_STATUS (WINAPI *QUERY_CONTEXT_ATTRIBUTES_FN_A)(PCtxtHandle,ULONG,PVOID); +typedef SECURITY_STATUS (WINAPI *QUERY_CONTEXT_ATTRIBUTES_FN_W)(PCtxtHandle,ULONG,PVOID); +typedef SECURITY_STATUS (WINAPI *IMPERSONATE_SECURITY_CONTEXT_FN)(PCtxtHandle); +typedef SECURITY_STATUS (WINAPI *REVERT_SECURITY_CONTEXT_FN)(PCtxtHandle); +typedef SECURITY_STATUS (WINAPI *MAKE_SIGNATURE_FN)(PCtxtHandle,ULONG,PSecBufferDesc,ULONG); +typedef SECURITY_STATUS (WINAPI *VERIFY_SIGNATURE_FN)(PCtxtHandle,PSecBufferDesc,ULONG,PULONG); +typedef SECURITY_STATUS (WINAPI *FREE_CONTEXT_BUFFER_FN)(PVOID); +typedef SECURITY_STATUS (WINAPI *QUERY_SECURITY_PACKAGE_INFO_FN_A)(SEC_CHAR*,PSecPkgInfoA*); +typedef SECURITY_STATUS (WINAPI *QUERY_SECURITY_PACKAGE_INFO_FN_W)(SEC_WCHAR*,PSecPkgInfoW*); +typedef SECURITY_STATUS (WINAPI *ENCRYPT_MESSAGE_FN)(PCtxtHandle,ULONG,PSecBufferDesc,ULONG); +typedef SECURITY_STATUS (WINAPI *DECRYPT_MESSAGE_FN)(PCtxtHandle,PSecBufferDesc,ULONG,PULONG); + +/* No, it really is FreeCredentialsHandle, see the thread beginning + * http://sourceforge.net/mailarchive/message.php?msg_id=4321080 for a + * discovery discussion. */ +typedef struct _SECURITY_FUNCTION_TABLEW { + unsigned long dwVersion; + ENUMERATE_SECURITY_PACKAGES_FN_W EnumerateSecurityPackagesW; + QUERY_CREDENTIALS_ATTRIBUTES_FN_W QueryCredentialsAttributesW; + ACQUIRE_CREDENTIALS_HANDLE_FN_W AcquireCredentialsHandleW; + FREE_CREDENTIALS_HANDLE_FN FreeCredentialsHandle; + void SEC_FAR* Reserved2; + INITIALIZE_SECURITY_CONTEXT_FN_A InitializeSecurityContextA; + ACCEPT_SECURITY_CONTEXT_FN AcceptSecurityContext; + COMPLETE_AUTH_TOKEN_FN CompleteAuthToken; + DELETE_SECURITY_CONTEXT_FN DeleteSecurityContext; + APPLY_CONTROL_TOKEN_FN_W ApplyControlTokenW; + QUERY_CONTEXT_ATTRIBUTES_FN_W QueryContextAttributesW; + IMPERSONATE_SECURITY_CONTEXT_FN ImpersonateSecurityContext; + REVERT_SECURITY_CONTEXT_FN RevertSecurityContext; + MAKE_SIGNATURE_FN MakeSignature; + VERIFY_SIGNATURE_FN VerifySignature; + FREE_CONTEXT_BUFFER_FN FreeContextBuffer; + QUERY_SECURITY_PACKAGE_INFO_FN_A QuerySecurityPackageInfoA; + void SEC_FAR* Reserved3; + void SEC_FAR* Reserved4; + void SEC_FAR* Unknown1; + void SEC_FAR* Unknown2; + void SEC_FAR* Unknown3; + void SEC_FAR* Unknown4; + void SEC_FAR* Unknown5; + ENCRYPT_MESSAGE_FN EncryptMessage; + DECRYPT_MESSAGE_FN DecryptMessage; +} SecurityFunctionTableW, *PSecurityFunctionTableW; +typedef struct _SECURITY_FUNCTION_TABLEA { + unsigned long dwVersion; + ENUMERATE_SECURITY_PACKAGES_FN_A EnumerateSecurityPackagesA; + QUERY_CREDENTIALS_ATTRIBUTES_FN_A QueryCredentialsAttributesA; + ACQUIRE_CREDENTIALS_HANDLE_FN_A AcquireCredentialsHandleA; + FREE_CREDENTIALS_HANDLE_FN FreeCredentialsHandle; + void SEC_FAR* Reserved2; + INITIALIZE_SECURITY_CONTEXT_FN_A InitializeSecurityContextA; + ACCEPT_SECURITY_CONTEXT_FN AcceptSecurityContext; + COMPLETE_AUTH_TOKEN_FN CompleteAuthToken; + DELETE_SECURITY_CONTEXT_FN DeleteSecurityContext; + APPLY_CONTROL_TOKEN_FN_A ApplyControlTokenA; + QUERY_CONTEXT_ATTRIBUTES_FN_A QueryContextAttributesA; + IMPERSONATE_SECURITY_CONTEXT_FN ImpersonateSecurityContext; + REVERT_SECURITY_CONTEXT_FN RevertSecurityContext; + MAKE_SIGNATURE_FN MakeSignature; + VERIFY_SIGNATURE_FN VerifySignature; + FREE_CONTEXT_BUFFER_FN FreeContextBuffer; + QUERY_SECURITY_PACKAGE_INFO_FN_A QuerySecurityPackageInfoA; + void SEC_FAR* Reserved3; + void SEC_FAR* Reserved4; + void SEC_FAR* Unknown1; + void SEC_FAR* Unknown2; + void SEC_FAR* Unknown3; + void SEC_FAR* Unknown4; + void SEC_FAR* Unknown5; + ENCRYPT_MESSAGE_FN EncryptMessage; + DECRYPT_MESSAGE_FN DecryptMessage; +} SecurityFunctionTableA, *PSecurityFunctionTableA; +typedef PSecurityFunctionTableA (WINAPI *INIT_SECURITY_INTERFACE_A)(VOID); +typedef PSecurityFunctionTableW (WINAPI *INIT_SECURITY_INTERFACE_W)(VOID); + +SECURITY_STATUS WINAPI FreeCredentialsHandle(PCredHandle); +SECURITY_STATUS WINAPI EnumerateSecurityPackagesA(PULONG,PSecPkgInfoA*); +SECURITY_STATUS WINAPI EnumerateSecurityPackagesW(PULONG,PSecPkgInfoW*); +SECURITY_STATUS WINAPI AcquireCredentialsHandleA(SEC_CHAR*,SEC_CHAR*,ULONG,PLUID,PVOID,SEC_GET_KEY_FN,PVOID,PCredHandle,PTimeStamp); +SECURITY_STATUS WINAPI AcquireCredentialsHandleW(SEC_WCHAR*,SEC_WCHAR*,ULONG,PLUID,PVOID,SEC_GET_KEY_FN,PVOID,PCredHandle,PTimeStamp); +SECURITY_STATUS WINAPI AcceptSecurityContext(PCredHandle,PCtxtHandle,PSecBufferDesc,ULONG,ULONG,PCtxtHandle,PSecBufferDesc,PULONG,PTimeStamp); +SECURITY_STATUS WINAPI InitializeSecurityContextA(PCredHandle,PCtxtHandle,SEC_CHAR*,ULONG,ULONG,ULONG,PSecBufferDesc,ULONG,PCtxtHandle,PSecBufferDesc,PULONG,PTimeStamp); +SECURITY_STATUS WINAPI InitializeSecurityContextW(PCredHandle,PCtxtHandle,SEC_WCHAR*,ULONG,ULONG,ULONG,PSecBufferDesc,ULONG,PCtxtHandle,PSecBufferDesc,PULONG,PTimeStamp); +SECURITY_STATUS WINAPI FreeContextBuffer(PVOID); +SECURITY_STATUS WINAPI QueryContextAttributesA(PCtxtHandle,ULONG,PVOID); +SECURITY_STATUS WINAPI QueryContextAttributesW(PCtxtHandle,ULONG,PVOID); +SECURITY_STATUS WINAPI QueryCredentialsAttributesA(PCredHandle,ULONG,PVOID); +SECURITY_STATUS WINAPI QueryCredentialsAttributesW(PCredHandle,ULONG,PVOID); +SECURITY_STATUS WINAPI DecryptMessage(PCtxtHandle,PSecBufferDesc,ULONG,PULONG); +SECURITY_STATUS WINAPI EncryptMessage(PCtxtHandle,ULONG,PSecBufferDesc,ULONG); +SECURITY_STATUS WINAPI DeleteSecurityContext(PCtxtHandle); +SECURITY_STATUS WINAPI CompleteAuthToken(PCtxtHandle,PSecBufferDesc); +SECURITY_STATUS WINAPI ApplyControlTokenA(PCtxtHandle,PSecBufferDesc); +SECURITY_STATUS WINAPI ApplyControlTokenW(PCtxtHandle,PSecBufferDesc); +SECURITY_STATUS WINAPI ImpersonateSecurityContext(PCtxtHandle); +SECURITY_STATUS WINAPI RevertSecurityContext(PCtxtHandle); +SECURITY_STATUS WINAPI MakeSignature(PCtxtHandle,ULONG,PSecBufferDesc,ULONG); +SECURITY_STATUS WINAPI VerifySignature(PCtxtHandle,PSecBufferDesc,ULONG,PULONG); +SECURITY_STATUS WINAPI QuerySecurityPackageInfoA(SEC_CHAR*,PSecPkgInfoA*); +SECURITY_STATUS WINAPI QuerySecurityPackageInfoW(SEC_WCHAR*,PSecPkgInfoW*); +PSecurityFunctionTableA WINAPI InitSecurityInterfaceA(VOID); +PSecurityFunctionTableW WINAPI InitSecurityInterfaceW(VOID); + +#ifdef UNICODE +#define UNISP_NAME UNISP_NAME_W +#define SecPkgInfo SecPkgInfoW +#define PSecPkgInfo PSecPkgInfoW +#define SecPkgCredentialsNames SecPkgCredentialsNamesW +#define PSecPkgCredentialsNames PSecPkgCredentialsNamesW +#define SecPkgContext_Authority SecPkgContext_AuthorityW +#define PSecPkgContext_Authority PSecPkgContext_AuthorityW +#define SecPkgContext_KeyInfo SecPkgContext_KeyInfoW +#define PSecPkgContext_KeyInfo PSecPkgContext_KeyInfoW +#define SecPkgContext_Names SecPkgContext_NamesW +#define PSecPkgContext_Names PSecPkgContext_NamesW +#define SecurityFunctionTable SecurityFunctionTableW +#define PSecurityFunctionTable PSecurityFunctionTableW +#define AcquireCredentialsHandle AcquireCredentialsHandleW +#define EnumerateSecurityPackages EnumerateSecurityPackagesW +#define InitializeSecurityContext InitializeSecurityContextW +#define QueryContextAttributes QueryContextAttributesW +#define QueryCredentialsAttributes QueryCredentialsAttributesW +#define QuerySecurityPackageInfo QuerySecurityPackageInfoW +#define ApplyControlToken ApplyControlTokenW +#define ENUMERATE_SECURITY_PACKAGES_FN ENUMERATE_SECURITY_PACKAGES_FN_W +#define QUERY_CREDENTIALS_ATTRIBUTES_FN QUERY_CREDENTIALS_ATTRIBUTES_FN_W +#define ACQUIRE_CREDENTIALS_HANDLE_FN ACQUIRE_CREDENTIALS_HANDLE_FN_W +#define INITIALIZE_SECURITY_CONTEXT_FN INITIALIZE_SECURITY_CONTEXT_FN_W +#define APPLY_CONTROL_TOKEN_FN APPLY_CONTROL_TOKEN_FN_W +#define QUERY_CONTEXT_ATTRIBUTES_FN QUERY_CONTEXT_ATTRIBUTES_FN_W +#define QUERY_SECURITY_PACKAGE_INFO_FN QUERY_SECURITY_PACKAGE_INFO_FN_W +#define INIT_SECURITY_INTERFACE INIT_SECURITY_INTERFACE_W +#else +#define UNISP_NAME UNISP_NAME_A +#define SecPkgInfo SecPkgInfoA +#define PSecPkgInfo PSecPkgInfoA +#define SecPkgCredentialsNames SecPkgCredentialsNamesA +#define PSecPkgCredentialsNames PSecPkgCredentialsNamesA +#define SecPkgContext_Authority SecPkgContext_AuthorityA +#define PSecPkgContext_Authority PSecPkgContext_AuthorityA +#define SecPkgContext_KeyInfo SecPkgContext_KeyInfoA +#define PSecPkgContext_KeyInfo PSecPkgContext_KeyInfoA +#define SecPkgContext_Names SecPkgContext_NamesA +#define PSecPkgContext_Names PSecPkgContext_NamesA +#define SecurityFunctionTable SecurityFunctionTableA +#define PSecurityFunctionTable PSecurityFunctionTableA +#define AcquireCredentialsHandle AcquireCredentialsHandleA +#define EnumerateSecurityPackages EnumerateSecurityPackagesA +#define InitializeSecurityContext InitializeSecurityContextA +#define QueryContextAttributes QueryContextAttributesA +#define QueryCredentialsAttributes QueryCredentialsAttributesA +#define QuerySecurityPackageInfo QuerySecurityPackageInfoA +#define ApplyControlToken ApplyControlTokenA +#define ENUMERATE_SECURITY_PACKAGES_FN ENUMERATE_SECURITY_PACKAGES_FN_A +#define QUERY_CREDENTIALS_ATTRIBUTES_FN QUERY_CREDENTIALS_ATTRIBUTES_FN_A +#define ACQUIRE_CREDENTIALS_HANDLE_FN ACQUIRE_CREDENTIALS_HANDLE_FN_A +#define INITIALIZE_SECURITY_CONTEXT_FN INITIALIZE_SECURITY_CONTEXT_FN_A +#define APPLY_CONTROL_TOKEN_FN APPLY_CONTROL_TOKEN_FN_A +#define QUERY_CONTEXT_ATTRIBUTES_FN QUERY_CONTEXT_ATTRIBUTES_FN_A +#define QUERY_SECURITY_PACKAGE_INFO_FN QUERY_SECURITY_PACKAGE_INFO_FN_A +#define INIT_SECURITY_INTERFACE INIT_SECURITY_INTERFACE_A +#endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/subauth.h b/reactos/w32api/include/subauth.h new file mode 100644 index 00000000000..2c87f288fd2 --- /dev/null +++ b/reactos/w32api/include/subauth.h @@ -0,0 +1,209 @@ +#ifndef _SUBAUTH_H +#define _SUBAUTH_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#ifndef NT_SUCCESS +#define NT_SUCCESS(x) ((x)>=0) +#define STATUS_SUCCESS 0 +#endif +#define CYPHER_BLOCK_LENGTH 8 +#define USER_SESSION_KEY_LENGTH (CYPHER_BLOCK_LENGTH*2) +#define CLEAR_BLOCK_LENGTH 8 +#define MSV1_0_PASSTHRU 1 +#define MSV1_0_GUEST_LOGON 2 +#define MSV1_0_VALIDATION_LOGOFF_TIME 1 +#define MSV1_0_VALIDATION_KICKOFF_TIME 2 +#define MSV1_0_VALIDATION_LOGON_SERVER 4 +#define MSV1_0_VALIDATION_LOGON_DOMAIN 8 +#define MSV1_0_VALIDATION_SESSION_KEY 16 +#define MSV1_0_VALIDATION_USER_FLAGS 32 +#define MSV1_0_VALIDATION_USER_ID 64 +#define MSV1_0_SUBAUTH_ACCOUNT_DISABLED 1 +#define MSV1_0_SUBAUTH_PASSWORD 2 +#define MSV1_0_SUBAUTH_WORKSTATIONS 4 +#define MSV1_0_SUBAUTH_LOGON_HOURS 8 +#define MSV1_0_SUBAUTH_ACCOUNT_EXPIRY 16 +#define MSV1_0_SUBAUTH_PASSWORD_EXPIRY 32 +#define MSV1_0_SUBAUTH_ACCOUNT_TYPE 64 +#define MSV1_0_SUBAUTH_LOCKOUT 128 +#define NEXT_FREE_ACCOUNT_CONTROL_BIT 131072 +#define SAM_DAYS_PER_WEEK 7 +#define SAM_HOURS_PER_WEEK 168 +#define SAM_MINUTES_PER_WEEK 10080 +#define STATUS_INVALID_INFO_CLASS 0xC0000003L +#define STATUS_NO_SUCH_USER 0xC0000064L +#define STATUS_WRONG_PASSWORD 0xC000006AL +#define STATUS_PASSWORD_RESTRICTION 0xC000006CL +#define STATUS_LOGON_FAILURE 0xC000006DL +#define STATUS_ACCOUNT_RESTRICTION 0xC000006EL +#define STATUS_INVALID_LOGON_HOURS 0xC000006FL +#define STATUS_INVALID_WORKSTATION 0xC0000070L +#define STATUS_PASSWORD_EXPIRED 0xC0000071L +#define STATUS_ACCOUNT_DISABLED 0xC0000072L +#define STATUS_INSUFFICIENT_RESOURCES 0xC000009AL +#define STATUS_ACCOUNT_EXPIRED 0xC0000193L +#define STATUS_PASSWORD_MUST_CHANGE 0xC0000224L +#define STATUS_ACCOUNT_LOCKED_OUT 0xC0000234L +#define USER_ACCOUNT_DISABLED 1 +#define USER_HOME_DIRECTORY_REQUIRED 2 +#define USER_PASSWORD_NOT_REQUIRED 4 +#define USER_TEMP_DUPLICATE_ACCOUNT 8 +#define USER_NORMAL_ACCOUNT 16 +#define USER_MNS_LOGON_ACCOUNT 32 +#define USER_INTERDOMAIN_TRUST_ACCOUNT 64 +#define USER_WORKSTATION_TRUST_ACCOUNT 128 +#define USER_SERVER_TRUST_ACCOUNT 256 +#define USER_DONT_EXPIRE_PASSWORD 512 +#define USER_ACCOUNT_AUTO_LOCKED 1024 +#define USER_ENCRYPTED_TEXT_PASSWORD_ALLOWED 2048 +#define USER_SMARTCARD_REQUIRED 4096 +#define USER_TRUSTED_FOR_DELEGATION 8192 +#define USER_NOT_DELEGATED 16384 +#define USER_USE_DES_KEY_ONLY 32768 +#define USER_DONT_REQUIRE_PREAUTH 65536 +#define USER_MACHINE_ACCOUNT_MASK 448 +#define USER_ACCOUNT_TYPE_MASK 472 +#define USER_ALL_PARAMETERS 2097152 +#if !defined(_NTDEF_H) && !defined(_NTSECAPI_H) +typedef LONG NTSTATUS, *PNTSTATUS; +typedef struct _UNICODE_STRING { + USHORT Length; + USHORT MaximumLength; + PWSTR Buffer; +} UNICODE_STRING, *PUNICODE_STRING; +typedef struct _STRING { + USHORT Length; + USHORT MaximumLength; + PCHAR Buffer; +} STRING, *PSTRING; +#endif +typedef PVOID SAM_HANDLE, *PSAM_HANDLE; +typedef struct _OLD_LARGE_INTEGER { + ULONG LowPart; + LONG HighPart; +} OLD_LARGE_INTEGER, *POLD_LARGE_INTEGER; +typedef enum _NETLOGON_LOGON_INFO_CLASS { + NetlogonInteractiveInformation = 1,NetlogonNetworkInformation, + NetlogonServiceInformation,NetlogonGenericInformation, + NetlogonInteractiveTransitiveInformation,NetlogonNetworkTransitiveInformation, + NetlogonServiceTransitiveInformation +} NETLOGON_LOGON_INFO_CLASS; +typedef struct _CYPHER_BLOCK { + CHAR data[CYPHER_BLOCK_LENGTH]; +} CYPHER_BLOCK, *PCYPHER_BLOCK; +typedef struct _CLEAR_BLOCK { + CHAR data[CLEAR_BLOCK_LENGTH]; +} CLEAR_BLOCK, *PCLEAR_BLOCK; +typedef struct _LM_OWF_PASSWORD { + CYPHER_BLOCK data[2]; +} LM_OWF_PASSWORD, *PLM_OWF_PASSWORD; +typedef struct _USER_SESSION_KEY { + CYPHER_BLOCK data[2]; +} USER_SESSION_KEY, *PUSER_SESSION_KEY; +typedef CLEAR_BLOCK LM_CHALLENGE, *PLM_CHALLENGE; +typedef LM_OWF_PASSWORD NT_OWF_PASSWORD, *PNT_OWF_PASSWORD; +typedef LM_CHALLENGE NT_CHALLENGE, *PNT_CHALLENGE; +typedef struct _LOGON_HOURS { + USHORT UnitsPerWeek; + PUCHAR LogonHours; +} LOGON_HOURS, *PLOGON_HOURS; +typedef struct _SR_SECURITY_DESCRIPTOR { + ULONG Length; + PUCHAR SecurityDescriptor; +} SR_SECURITY_DESCRIPTOR, *PSR_SECURITY_DESCRIPTOR; +#pragma pack(push,4) +typedef struct _USER_ALL_INFORMATION { + LARGE_INTEGER LastLogon; + LARGE_INTEGER LastLogoff; + LARGE_INTEGER PasswordLastSet; + LARGE_INTEGER AccountExpires; + LARGE_INTEGER PasswordCanChange; + LARGE_INTEGER PasswordMustChange; + UNICODE_STRING UserName; + UNICODE_STRING FullName; + UNICODE_STRING HomeDirectory; + UNICODE_STRING HomeDirectoryDrive; + UNICODE_STRING ScriptPath; + UNICODE_STRING ProfilePath; + UNICODE_STRING AdminComment; + UNICODE_STRING WorkStations; + UNICODE_STRING UserComment; + UNICODE_STRING Parameters; + UNICODE_STRING LmPassword; + UNICODE_STRING NtPassword; + UNICODE_STRING PrivateData; + SR_SECURITY_DESCRIPTOR SecurityDescriptor; + ULONG UserId; + ULONG PrimaryGroupId; + ULONG UserAccountControl; + ULONG WhichFields; + LOGON_HOURS LogonHours; + USHORT BadPasswordCount; + USHORT LogonCount; + USHORT CountryCode; + USHORT CodePage; + BOOLEAN LmPasswordPresent; + BOOLEAN NtPasswordPresent; + BOOLEAN PasswordExpired; + BOOLEAN PrivateDataSensitive; +} USER_ALL_INFORMATION, *PUSER_ALL_INFORMATION; +#pragma pack(pop) +typedef struct _MSV1_0_VALIDATION_INFO { + LARGE_INTEGER LogoffTime; + LARGE_INTEGER KickoffTime; + UNICODE_STRING LogonServer; + UNICODE_STRING LogonDomainName; + USER_SESSION_KEY SessionKey; + BOOLEAN Authoritative; + ULONG UserFlags; + ULONG WhichFields; + ULONG UserId; +} MSV1_0_VALIDATION_INFO, *PMSV1_0_VALIDATION_INFO; +typedef struct _NETLOGON_LOGON_IDENTITY_INFO { + UNICODE_STRING LogonDomainName; + ULONG ParameterControl; + OLD_LARGE_INTEGER LogonId; + UNICODE_STRING UserName; + UNICODE_STRING Workstation; +} NETLOGON_LOGON_IDENTITY_INFO, *PNETLOGON_LOGON_IDENTITY_INFO; +typedef struct _NETLOGON_INTERACTIVE_INFO { + NETLOGON_LOGON_IDENTITY_INFO Identity; + LM_OWF_PASSWORD LmOwfPassword; + NT_OWF_PASSWORD NtOwfPassword; +} NETLOGON_INTERACTIVE_INFO, *PNETLOGON_INTERACTIVE_INFO; +typedef struct _NETLOGON_GENERIC_INFO { + NETLOGON_LOGON_IDENTITY_INFO Identity; + UNICODE_STRING PackageName; + ULONG DataLength; + PUCHAR LogonData; +} NETLOGON_GENERIC_INFO, *PNETLOGON_GENERIC_INFO; +typedef struct _NETLOGON_NETWORK_INFO { + NETLOGON_LOGON_IDENTITY_INFO Identity; + LM_CHALLENGE LmChallenge; + STRING NtChallengeResponse; + STRING LmChallengeResponse; +} NETLOGON_NETWORK_INFO, *PNETLOGON_NETWORK_INFO; +typedef struct _NETLOGON_SERVICE_INFO { + NETLOGON_LOGON_IDENTITY_INFO Identity; + LM_OWF_PASSWORD LmOwfPassword; + NT_OWF_PASSWORD NtOwfPassword; +} NETLOGON_SERVICE_INFO, *PNETLOGON_SERVICE_INFO; +NTSTATUS NTAPI Msv1_0SubAuthenticationRoutine(NETLOGON_LOGON_INFO_CLASS,PVOID, + ULONG,PUSER_ALL_INFORMATION,PULONG,PULONG, + PBOOLEAN,PLARGE_INTEGER,PLARGE_INTEGER); +NTSTATUS NTAPI Msv1_0SubAuthenticationFilter(NETLOGON_LOGON_INFO_CLASS,PVOID, + ULONG,PUSER_ALL_INFORMATION,PULONG,PULONG, + PBOOLEAN,PLARGE_INTEGER,PLARGE_INTEGER); +NTSTATUS NTAPI Msv1_0SubAuthenticationRoutineGeneric(PVOID,ULONG,PULONG,PVOID*); +NTSTATUS NTAPI Msv1_0SubAuthenticationRoutineEx(NETLOGON_LOGON_INFO_CLASS,PVOID, + ULONG,PUSER_ALL_INFORMATION,SAM_HANDLE, + PMSV1_0_VALIDATION_INFO,PULONG); +#ifdef __cplusplus +} +#endif +#endif /* _SUBAUTH_H */ diff --git a/reactos/w32api/include/svcguid.h b/reactos/w32api/include/svcguid.h new file mode 100644 index 00000000000..65072808cf1 --- /dev/null +++ b/reactos/w32api/include/svcguid.h @@ -0,0 +1,33 @@ +#ifndef _SVCGUID_H +#define _SVCGUID_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define SVCID_NETWARE(_SapId) \ + { (0x000B << 16) | (_SapId), 0, 0, { 0xC0,0,0,0,0,0,0,0x46 } } + +#define SAPID_FROM_SVCID_NETWARE(_g) \ + ((WORD)(_g->Data1 & 0xFFFF)) + +#define SET_NETWARE_SVCID(_g,_SapId) { \ + (_g)->Data1 = (0x000B << 16 ) | (_SapId); \ + (_g)->Data2 = 0; \ + (_g)->Data3 = 0; \ + (_g)->Data4[0] = 0xC0; \ + (_g)->Data4[1] = 0x0; \ + (_g)->Data4[2] = 0x0; \ + (_g)->Data4[3] = 0x0; \ + (_g)->Data4[4] = 0x0; \ + (_g)->Data4[5] = 0x0; \ + (_g)->Data4[6] = 0x0; \ + (_g)->Data4[7] = 0x46; } + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/tlhelp32.h b/reactos/w32api/include/tlhelp32.h new file mode 100644 index 00000000000..e92838006c0 --- /dev/null +++ b/reactos/w32api/include/tlhelp32.h @@ -0,0 +1,140 @@ +/* + tlhelp32.h - Include file for Tool help functions. + + Written by Mumit Khan <khan@nanotech.wisc.edu> + + This file is part of a free library for the Win32 API. + + 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. + +*/ +#ifndef _TLHELP32_H +#define _TLHELP32_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define HF32_DEFAULT 1 +#define HF32_SHARED 2 +#define LF32_FIXED 0x1 +#define LF32_FREE 0x2 +#define LF32_MOVEABLE 0x4 +#define MAX_MODULE_NAME32 255 +#define TH32CS_SNAPHEAPLIST 0x1 +#define TH32CS_SNAPPROCESS 0x2 +#define TH32CS_SNAPTHREAD 0x4 +#define TH32CS_SNAPMODULE 0x8 +#define TH32CS_SNAPALL (TH32CS_SNAPHEAPLIST|TH32CS_SNAPPROCESS|TH32CS_SNAPTHREAD|TH32CS_SNAPMODULE) +#define TH32CS_INHERIT 0x80000000 +typedef struct tagHEAPLIST32 { + DWORD dwSize; + DWORD th32ProcessID; + DWORD th32HeapID; + DWORD dwFlags; +} HEAPLIST32,*PHEAPLIST32,*LPHEAPLIST32; +typedef struct tagHEAPENTRY32 { + DWORD dwSize; + HANDLE hHandle; + DWORD dwAddress; + DWORD dwBlockSize; + DWORD dwFlags; + DWORD dwLockCount; + DWORD dwResvd; + DWORD th32ProcessID; + DWORD th32HeapID; +} HEAPENTRY32,*PHEAPENTRY32,*LPHEAPENTRY32; +typedef struct tagPROCESSENTRY32W { + DWORD dwSize; + DWORD cntUsage; + DWORD th32ProcessID; + DWORD th32DefaultHeapID; + DWORD th32ModuleID; + DWORD cntThreads; + DWORD th32ParentProcessID; + LONG pcPriClassBase; + DWORD dwFlags; + WCHAR szExeFile[MAX_PATH]; +} PROCESSENTRY32W,*PPROCESSENTRY32W,*LPPROCESSENTRY32W; +typedef struct tagPROCESSENTRY32 { + DWORD dwSize; + DWORD cntUsage; + DWORD th32ProcessID; + DWORD th32DefaultHeapID; + DWORD th32ModuleID; + DWORD cntThreads; + DWORD th32ParentProcessID; + LONG pcPriClassBase; + DWORD dwFlags; + CHAR szExeFile[MAX_PATH]; +} PROCESSENTRY32,*PPROCESSENTRY32,*LPPROCESSENTRY32; +typedef struct tagTHREADENTRY32 { + DWORD dwSize; + DWORD cntUsage; + DWORD th32ThreadID; + DWORD th32OwnerProcessID; + LONG tpBasePri; + LONG tpDeltaPri; + DWORD dwFlags; +} THREADENTRY32,*PTHREADENTRY32,*LPTHREADENTRY32; +typedef struct tagMODULEENTRY32W { + DWORD dwSize; + DWORD th32ModuleID; + DWORD th32ProcessID; + DWORD GlblcntUsage; + DWORD ProccntUsage; + BYTE *modBaseAddr; + DWORD modBaseSize; + HMODULE hModule; + WCHAR szModule[MAX_MODULE_NAME32 + 1]; + WCHAR szExePath[MAX_PATH]; +} MODULEENTRY32W,*PMODULEENTRY32W,*LPMODULEENTRY32W; +typedef struct tagMODULEENTRY32 { + DWORD dwSize; + DWORD th32ModuleID; + DWORD th32ProcessID; + DWORD GlblcntUsage; + DWORD ProccntUsage; + BYTE *modBaseAddr; + DWORD modBaseSize; + HMODULE hModule; + char szModule[MAX_MODULE_NAME32 + 1]; + char szExePath[MAX_PATH]; +} MODULEENTRY32,*PMODULEENTRY32,*LPMODULEENTRY32; +BOOL WINAPI Heap32First(LPHEAPENTRY32,DWORD,DWORD); +BOOL WINAPI Heap32ListFirst(HANDLE,LPHEAPLIST32); +BOOL WINAPI Heap32ListNext(HANDLE,LPHEAPLIST32); +BOOL WINAPI Heap32Next(LPHEAPENTRY32); +BOOL WINAPI Module32First(HANDLE,LPMODULEENTRY32); +BOOL WINAPI Module32FirstW(HANDLE,LPMODULEENTRY32W); +BOOL WINAPI Module32Next(HANDLE,LPMODULEENTRY32); +BOOL WINAPI Module32NextW(HANDLE,LPMODULEENTRY32W); +BOOL WINAPI Process32First(HANDLE,LPPROCESSENTRY32); +BOOL WINAPI Process32FirstW(HANDLE,LPPROCESSENTRY32W); +BOOL WINAPI Process32Next(HANDLE,LPPROCESSENTRY32); +BOOL WINAPI Process32NextW(HANDLE,LPPROCESSENTRY32W); +BOOL WINAPI Thread32First(HANDLE,LPTHREADENTRY32); +BOOL WINAPI Thread32Next(HANDLE,LPTHREADENTRY32); +BOOL WINAPI Toolhelp32ReadProcessMemory(DWORD,LPCVOID,LPVOID,DWORD,LPDWORD); +HANDLE WINAPI CreateToolhelp32Snapshot(DWORD,DWORD); +#ifdef UNICODE +#define LPMODULEENTRY32 LPMODULEENTRY32W +#define LPPROCESSENTRY32 LPPROCESSENTRY32W +#define MODULEENTRY32 MODULEENTRY32W +#define Module32First Module32FirstW +#define Module32Next Module32NextW +#define PMODULEENTRY32 PMODULEENTRY32W +#define PPROCESSENTRY32 PPROCESSENTRY32W +#define PROCESSENTRY32 PROCESSENTRY32W +#define Process32First Process32FirstW +#define Process32Next Process32NextW +#endif /* UNICODE */ +#ifdef __cplusplus +} +#endif +#endif /* _TLHELP32_H */ + diff --git a/reactos/w32api/include/tmschema.h b/reactos/w32api/include/tmschema.h new file mode 100644 index 00000000000..6ab03b431c8 --- /dev/null +++ b/reactos/w32api/include/tmschema.h @@ -0,0 +1,664 @@ +#ifndef _TMSCHEMA_H +#define _TMSCHEMA_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +/* BUTTON parts */ +enum { + BP_PUSHBUTTON = 1, + BP_RADIOBUTTON = 2, + BP_CHECKBOX = 3, + BP_GROUPBOX = 4, + BP_USERBUTTON = 5 +}; +enum { + CBS_UNCHECKEDNORMAL = 1, + CBS_UNCHECKEDHOT = 2, + CBS_UNCHECKEDPRESSED = 3, + CBS_UNCHECKEDDISABLED = 4, + CBS_CHECKEDNORMAL = 5, + CBS_CHECKEDHOT = 6, + CBS_CHECKEDPRESSED = 7, + CBS_CHECKEDDISABLED = 8, + CBS_MIXEDNORMAL = 9, + CBS_MIXEDHOT = 10, + CBS_MIXEDPRESSED = 11, + CBS_MIXEDDISABLED = 12 +}; +enum { + GBS_NORMAL = 1, + GBS_DISABLED = 2 +}; +enum { + PBS_NORMAL = 1, + PBS_HOT = 2, + PBS_PRESSED = 3, + PBS_DISABLED = 4, + PBS_DEFAULTED = 5 +}; +enum { + RBS_UNCHECKEDNORMAL = 1, + RBS_UNCHECKEDHOT = 2, + RBS_UNCHECKEDPRESSED = 3, + RBS_UNCHECKEDDISABLED = 4, + RBS_CHECKEDNORMAL = 5, + RBS_CHECKEDHOT = 6, + RBS_CHECKEDPRESSED = 7, + RBS_CHECKEDDISABLED = 8 +}; +/* CLOCK parts */ +enum { + CLP_TIME = 1 +}; +enum { + CLS_NORMAL = 1 +}; +/* COMBOBOX parts */ +enum { + CP_DROPDOWNBUTTON = 1 +}; +enum { + CBXS_NORMAL = 1, + CBXS_HOT = 2, + CBXS_PRESSED = 3, + CBXS_DISABLED = 4 +}; +/* EDIT parts */ +enum { + EP_EDITTEXT = 1, + EP_CARET = 2 +}; +enum { + ETS_NORMAL = 1, + ETS_HOT = 2, + ETS_SELECTED = 3, + ETS_DISABLED = 4, + ETS_FOCUSED = 5, + ETS_READONLY = 6, + ETS_ASSIST = 7 +}; +/* EXPLORERBAR parts */ +enum { + EBP_HEADERBACKGROUND = 1, + EBP_HEADERCLOSE = 2, + EBP_HEADERPIN = 3, + EBP_IEBARMENU = 4, + EBP_NORMALGROUPBACKGROUND = 5, + EBP_NORMALGROUPCOLLAPSE = 6, + EBP_NORMALGROUPEXPAND = 7, + EBP_NORMALGROUPHEAD = 8, + EBP_SPECIALGROUPBACKGROUND = 9, + EBP_SPECIALGROUPCOLLAPSE = 10, + EBP_SPECIALGROUPEXPAND = 11, + EBP_SPECIALGROUPHEAD = 12 +}; +enum { + EBHC_NORMAL = 1, + EBHC_HOT = 2, + EBHC_PRESSED = 3 +}; +enum { + EBHP_NORMAL = 1, + EBHP_HOT = 2, + EBHP_PRESSED = 3, + EBHP_SELECTEDNORMAL = 4, + EBHP_SELECTEDHOT = 5, + EBHP_SELECTEDPRESSED = 6 +}; +enum { + EBM_NORMAL = 1, + EBM_HOT = 2, + EBM_PRESSED = 3 +}; +enum { + EBNGC_NORMAL = 1, + EBNGC_HOT = 2, + EBNGC_PRESSED = 3 +}; +enum { + EBNGE_NORMAL = 1, + EBNGE_HOT = 2, + EBNGE_PRESSED = 3 +}; +enum { + EBSGC_NORMAL = 1, + EBSGC_HOT = 2, + EBSGC_PRESSED = 3 +}; +enum { + EBSGE_NORMAL = 1, + EBSGE_HOT = 2, + EBSGE_PRESSED = 3 +}; +/* HEADER parts */ +enum { + HP_HEADERITEM = 1, + HP_HEADERITEMLEFT = 2, + HP_HEADERITEMRIGHT = 3, + HP_HEADERSORTARROW = 4 +}; +enum { + HIS_NORMAL = 1, + HIS_HOT = 2, + HIS_PRESSED = 3 +}; +enum { + HILS_NORMAL = 1, + HILS_HOT = 2, + HILS_PRESSED = 3 +}; +enum { + HIRS_NORMAL = 1, + HIRS_HOT = 2, + HIRS_PRESSED = 3 +}; +enum { + HSAS_SORTEDUP = 1, + HSAS_SORTEDDOWN = 2 +}; +/* LISTVIEW parts */ +enum { + LVP_LISTITEM = 1, + LVP_LISTGROUP = 2, + LVP_LISTDETAIL = 3, + LVP_LISTSORTEDDETAIL = 4, + LVP_EMPTYTEXT = 5 +}; +enum { + LIS_NORMAL = 1, + LIS_HOT = 2, + LIS_SELECTED = 3, + LIS_DISABLED = 4, + LIS_SELECTEDNOTFOCUS = 5 +}; +/* MENU parts */ +enum { + MP_MENUITEM = 1, + MP_MENUDROPDOWN = 2, + MP_MENUBARITEM = 3, + MP_MENUBARDROPDOWN = 4, + MP_CHEVRON = 5, + MP_SEPARATOR = 6 +}; +enum { + MS_NORMAL = 1, + MS_SELECTED = 2, + MS_DEMOTED = 3 +}; +/* MENUBAND parts */ +enum { + MDP_NEWAPPBUTTON = 1, + MDP_SEPERATOR = 2 +}; +enum { + MDS_NORMAL = 1, + MDS_HOT = 2, + MDS_PRESSED = 3, + MDS_DISABLED = 4, + MDS_CHECKED = 5, + MDS_HOTCHECKED = 6 +}; +/* PAGE parts */ +enum { + PGRP_UP = 1, + PGRP_DOWN = 2, + PGRP_UPHORZ = 3, + PGRP_DOWNHORZ = 4 +}; +enum { + DNS_NORMAL = 1, + DNS_HOT = 2, + DNS_PRESSED = 3, + DNS_DISABLED = 4 +}; +enum { + DNHZS_NORMAL = 1, + DNHZS_HOT = 2, + DNHZS_PRESSED = 3, + DNHZS_DISABLED = 4 +}; +enum { + UPS_NORMAL = 1, + UPS_HOT = 2, + UPS_PRESSED = 3, + UPS_DISABLED = 4 +}; +enum { + UPHZS_NORMAL = 1, + UPHZS_HOT = 2, + UPHZS_PRESSED = 3, + UPHZS_DISABLED = 4 +}; +/* PROGRESS parts */ +enum { + PP_BAR = 1, + PP_BARVERT = 2, + PP_CHUNK = 3, + PP_CHUNKVERT = 4 +}; +/* REBAR parts */ +enum { + RP_GRIPPER = 1, + RP_GRIPPERVERT = 2, + RP_BAND = 3, + RP_CHEVRON = 4, + RP_CHEVRONVERT = 5 +}; +enum { + CHEVS_NORMAL = 1, + CHEVS_HOT = 2, + CHEVS_PRESSED = 3 +}; +/* SCROLLBAR parts */ +enum { + SBP_ARROWBTN = 1, + SBP_THUMBBTNHORZ = 2, + SBP_THUMBBTNVERT = 3, + SBP_LOWERTRACKHORZ = 4, + SBP_UPPERTRACKHORZ = 5, + SBP_LOWERTRACKVERT = 6, + SBP_UPPERTRACKVERT = 7, + SBP_GRIPPERHORZ = 8, + SBP_GRIPPERVERT = 9, + SBP_SIZEBOX = 10 +}; +enum { + ABS_UPNORMAL = 1, + ABS_UPHOT = 2, + ABS_UPPRESSED = 3, + ABS_UPDISABLED = 4, + ABS_DOWNNORMAL = 5, + ABS_DOWNHOT = 6, + ABS_DOWNPRESSED = 7, + ABS_DOWNDISABLED = 8, + ABS_LEFTNORMAL = 9, + ABS_LEFTHOT = 10, + ABS_LEFTPRESSED = 11, + ABS_LEFTDISABLED = 12, + ABS_RIGHTNORMAL = 13, + ABS_RIGHTHOT = 14, + ABS_RIGHTPRESSED = 15, + ABS_RIGHTDISABLED = 16 +}; +enum { + SCRBS_NORMAL = 1, + SCRBS_HOT = 2, + SCRBS_PRESSED = 3, + SCRBS_DISABLED = 4 +}; +enum { + SZB_RIGHTALIGN = 1, + SZB_LEFTALIGN = 2 +}; +/* SPIN parts */ +enum { + SPNP_UP = 1, + SPNP_DOWN = 2, + SPNP_UPHORZ = 3, + SPNP_DOWNHORZ = 4 +}; +/* STARTPANEL parts */ +enum { + SPP_USERPANE = 1, + SPP_MOREPROGRAMS = 2, + SPP_MOREPROGRAMSARROW = 3, + SPP_PROGLIST = 4, + SPP_PROGLISTSEPARATOR = 5, + SPP_PLACESLIST = 6, + SPP_PLACESLISTSEPARATOR = 7, + SPP_LOGOFF = 8, + SPP_LOGOFFBUTTONS = 9, + SPP_USERPICTURE = 10, + SPP_PREVIEW = 11 +}; +enum { + SPLS_NORMAL = 1, + SPLS_HOT = 2, + SPLS_PRESSED = 3 +}; +enum { + SPS_NORMAL = 1, + SPS_HOT = 2, + SPS_PRESSED = 3 +}; +/* STATUS parts */ +enum { + SP_PANE = 1, + SP_GRIPPERPANE = 2, + SP_GRIPPER = 3 +}; +/* TAB parts */ +enum { + TABP_TABITEM = 1, + TABP_TABITEMLEFTEDGE = 2, + TABP_TABITEMRIGHTEDGE = 3, + TABP_TABITEMBOTHEDGE = 4, + TABP_TOPTABITEM = 5, + TABP_TOPTABITEMLEFTEDGE = 6, + TABP_TOPTABITEMRIGHTEDGE = 7, + TABP_TOPTABITEMBOTHEDGE = 8, + TABP_PANE = 9, + TABP_BODY = 10 +}; +enum { + TIS_NORMAL = 1, + TIS_HOT = 2, + TIS_SELECTED = 3, + TIS_DISABLED = 4, + TIS_FOCUSED = 5 +}; +enum { + TIBES_NORMAL = 1, + TIBES_HOT = 2, + TIBES_SELECTED = 3, + TIBES_DISABLED = 4, + TIBES_FOCUSED = 5 +}; +enum { + TILES_NORMAL = 1, + TILES_HOT = 2, + TILES_SELECTED = 3, + TILES_DISABLED = 4, + TILES_FOCUSED = 5 +}; +enum { + TIRES_NORMAL = 1, + TIRES_HOT = 2, + TIRES_SELECTED = 3, + TIRES_DISABLED = 4, + TIRES_FOCUSED = 5 +}; +enum { + TTIS_NORMAL = 1, + TTIS_HOT = 2, + TTIS_SELECTED = 3, + TTIS_DISABLED = 4, + TTIS_FOCUSED = 5 +}; +enum { + TTIBES_NORMAL = 1, + TTIBES_HOT = 2, + TTIBES_SELECTED = 3, + TTIBES_DISABLED = 4, + TTIBES_FOCUSED = 5 +}; +enum { + TTILES_NORMAL = 1, + TTILES_HOT = 2, + TTILES_SELECTED = 3, + TTILES_DISABLED = 4, + TTILES_FOCUSED = 5 +}; +enum { + TTIRES_NORMAL = 1, + TTIRES_HOT = 2, + TTIRES_SELECTED = 3, + TTIRES_DISABLED = 4, + TTIRES_FOCUSED = 5 +}; +/* TASKBAND parts */ +enum { + TDP_GROUPCOUNT = 1, + TDP_FLASHBUTTON = 2, + TDP_FLASHBUTTONGROUPMENU = 3 +}; +/* TASKBAR parts */ +enum { + TBP_BACKGROUNDBOTTOM = 1, + TBP_BACKGROUNDRIGHT = 2, + TBP_BACKGROUNDTOP = 3, + TBP_BACKGROUNDLEFT = 4, + TBP_SIZINGBARBOTTOM = 5, + TBP_SIZINGBARRIGHT = 6, + TBP_SIZINGBARTOP = 7, + TBP_SIZINGBARLEFT = 8 +}; +/* TOOLBAR parts */ +enum { + TP_BUTTON = 1, + TP_DROPDOWNBUTTON = 2, + TP_SPLITBUTTON = 3, + TP_SPLITBUTTONDROPDOWN = 4, + TP_SEPARATOR = 5, + TP_SEPARATORVERT = 6 +}; +enum { + TS_NORMAL = 1, + TS_HOT = 2, + TS_PRESSED = 3, + TS_DISABLED = 4, + TS_CHECKED = 5, + TS_HOTCHECKED = 6 +}; +/* TOOLTIP parts */ +enum { + TTP_STANDARD = 1, + TTP_STANDARDTITLE = 2, + TTP_BALLOON = 3, + TTP_BALLOONTITLE = 4, + TTP_CLOSE = 5 +}; +enum { + TTBS_NORMAL = 1, + TTBS_LINK = 2 +}; +enum { + TTCS_NORMAL = 1, + TTCS_HOT = 2, + TTCS_PRESSED = 3 +}; +enum { + TTSS_NORMAL = 1, + TTSS_LINK = 2 +}; +/* TRACKBAR parts */ +enum { + TKP_TRACK = 1, + TKP_TRACKVERT = 2, + TKP_THUMB = 3, + TKP_THUMBBOTTOM = 4, + TKP_THUMBTOP = 5, + TKP_THUMBVERT = 6, + TKP_THUMBLEFT = 7, + TKP_THUMBRIGHT = 8, + TKP_TICS = 9, + TKP_TICSVERT = 10 +}; +enum { + TUS_NORMAL = 1, + TUS_HOT = 2, + TUS_PRESSED = 3, + TUS_FOCUSED = 4, + TUS_DISABLED = 5 +}; +enum { + TUBS_NORMAL = 1, + TUBS_HOT = 2, + TUBS_PRESSED = 3, + TUBS_FOCUSED = 4, + TUBS_DISABLED = 5 +}; +enum { + TUVLS_NORMAL = 1, + TUVLS_HOT = 2, + TUVLS_PRESSED = 3, + TUVLS_FOCUSED = 4, + TUVLS_DISABLED = 5 +}; +enum { + TUVRS_NORMAL = 1, + TUVRS_HOT = 2, + TUVRS_PRESSED = 3, + TUVRS_FOCUSED = 4, + TUVRS_DISABLED = 5 +}; +enum { + TUTS_NORMAL = 1, + TUTS_HOT = 2, + TUTS_PRESSED = 3, + TUTS_FOCUSED = 4, + TUTS_DISABLED = 5 +}; +enum { + TUVS_NORMAL = 1, + TUVS_HOT = 2, + TUVS_PRESSED = 3, + TUVS_FOCUSED = 4, + TUVS_DISABLED = 5 +}; +enum { + TSS_NORMAL = 1 +}; +enum { + TSVS_NORMAL = 1 +}; +enum { + TRS_NORMAL = 1 +}; +enum { + TRVS_NORMAL = 1 +}; +/* TRAYNOTIFY parts */ +enum { + TNP_BACKGROUND = 1, + TNP_ANIMBACKGROUND = 2 +}; +/* TREEVIEW parts */ +enum { + TVP_TREEITEM = 1, + TVP_GLYPH = 2, + TVP_BRANCH = 3 +}; +enum { + GLPS_CLOSED = 1, + GLPS_OPENED = 2 +}; +enum { + TREIS_NORMAL = 1, + TREIS_HOT = 2, + TREIS_SELECTED = 3, + TREIS_DISABLED = 4, + TREIS_SELECTEDNOTFOCUS = 5 +}; +/* WINDOW parts */ +enum { + WP_CAPTION = 1, + WP_SMALLCAPTION = 2, + WP_MINCAPTION = 3, + WP_SMALLMINCAPTION = 4, + WP_MAXCAPTION = 5, + WP_SMALLMAXCAPTION = 6, + WP_FRAMELEFT = 7, + WP_FRAMERIGHT = 8, + WP_FRAMEBOTTOM = 9, + WP_SMALLFRAMELEFT = 10, + WP_SMALLFRAMERIGHT = 11, + WP_SMALLFRAMEBOTTOM = 12, + WP_SYSBUTTON = 13, + WP_MDISYSBUTTON = 14, + WP_MINBUTTON = 15, + WP_MDIMINBUTTON = 16, + WP_MAXBUTTON = 17, + WP_CLOSEBUTTON = 18, + WP_SMALLCLOSEBUTTON = 19, + WP_MDICLOSEBUTTON = 20, + WP_RESTOREBUTTON = 21, + WP_MDIRESTOREBUTTON = 22, + WP_HELPBUTTON = 23, + WP_MDIHELPBUTTON = 24, + WP_HORZSCROLL = 25, + WP_HORZTHUMB = 26, + WP_VERTSCROLL = 27, + WP_VERTTHUMB = 28, + WP_DIALOG = 29, + WP_CAPTIONSIZINGTEMPLATE = 30, + WP_SMALLCAPTIONSIZINGTEMPLATE = 31, + WP_FRAMELEFTSIZINGTEMPLATE = 32, + WP_SMALLFRAMELEFTSIZINGTEMPLATE = 33, + WP_FRAMERIGHTSIZINGTEMPLATE = 34, + WP_SMALLFRAMERIGHTSIZINGTEMPLATE = 35, + WP_FRAMEBOTTOMSIZINGTEMPLATE = 36, + WP_SMALLFRAMEBOTTOMSIZINGTEMPLATE = 37 +}; +enum { + CS_ACTIVE = 1, + CS_INACTIVE = 2, + CS_DISABLED = 3 +}; +enum { + CBS_NORMAL = 1, + CBS_HOT = 2, + CBS_PUSHED = 3, + CBS_DISABLED = 4 +}; +enum { + FS_ACTIVE = 1, + FS_INACTIVE = 2 +}; +enum { + HBS_NORMAL = 1, + HBS_HOT = 2, + HBS_PUSHED = 3, + HBS_DISABLED = 4 +}; +enum { + HSS_NORMAL = 1, + HSS_HOT = 2, + HSS_PUSHED = 3, + HSS_DISABLED = 4 +}; +enum { + HTS_NORMAL = 1, + HTS_HOT = 2, + HTS_PUSHED = 3, + HTS_DISABLED = 4 +}; +enum { + MAXBS_NORMAL = 1, + MAXBS_HOT = 2, + MAXBS_PUSHED = 3, + MAXBS_DISABLED = 4 +}; +enum { + MXCS_ACTIVE = 1, + MXCS_INACTIVE = 2, + MXCS_DISABLED = 3 +}; +enum { + MINBS_NORMAL = 1, + MINBS_HOT = 2, + MINBS_PUSHED = 3, + MINBS_DISABLED = 4 +}; +enum { + RBS_NORMAL = 1, + RBS_HOT = 2, + RBS_PUSHED = 3, + RBS_DISABLED = 4 +}; +enum { + SBS_NORMAL = 1, + SBS_HOT = 2, + SBS_PUSHED = 3, + SBS_DISABLED = 4 +}; +enum { + MNCS_ACTIVE = 1, + MNCS_INACTIVE = 2, + MNCS_DISABLED = 3 +}; +enum { + VSS_NORMAL = 1, + VSS_HOT = 2, + VSS_PUSHED = 3, + VSS_DISABLED = 4 +}; +enum { + VTS_NORMAL = 1, + VTS_HOT = 2, + VTS_PUSHED = 3, + VTS_DISABLED = 4 +}; + +#endif diff --git a/reactos/w32api/include/unknwn.h b/reactos/w32api/include/unknwn.h new file mode 100644 index 00000000000..20a75afc545 --- /dev/null +++ b/reactos/w32api/include/unknwn.h @@ -0,0 +1,76 @@ +#ifndef COM_NO_WINDOWS_H +#include <windows.h> +#endif + +#ifndef _UNKNWN_H +#define _UNKNWN_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C"{ +#endif +#include <objfwd.h> +#include <wtypes.h> + +void * __RPC_USER MIDL_user_allocate(size_t); +void __RPC_USER MIDL_user_free(void*); +EXTERN_C const IID IID_IUnknown; +EXTERN_C const IID IID_IClassFactory; +#ifndef __IUnknown_INTERFACE_DEFINED__ +#define __IUnknown_INTERFACE_DEFINED__ +#undef INTERFACE +#define INTERFACE IUnknown +DECLARE_INTERFACE(IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; +}; +typedef IUnknown *LPUNKNOWN; +#endif +#ifndef __IClassFactory_INTERFACE_DEFINED__ +#define __IClassFactory_INTERFACE_DEFINED__ +#undef INTERFACE +#define INTERFACE IClassFactory +DECLARE_INTERFACE_(IClassFactory,IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(CreateInstance)(THIS_ LPUNKNOWN,REFIID,PVOID*) PURE; + STDMETHOD(LockServer)(THIS_ BOOL) PURE; +}; +typedef IClassFactory *LPCLASSFACTORY; +#endif +HRESULT STDMETHODCALLTYPE IUnknown_QueryInterface_Proxy(IUnknown*,REFIID,void**); +void __RPC_STUB IUnknown_QueryInterface_Stub(LPRPCSTUBBUFFER,LPRPCCHANNELBUFFER,PRPC_MESSAGE,PDWORD); +ULONG STDMETHODCALLTYPE IUnknown_AddRef_Proxy(IUnknown*); +void __RPC_STUB IUnknown_AddRef_Stub(LPRPCSTUBBUFFER,LPRPCCHANNELBUFFER,PRPC_MESSAGE,PDWORD); +ULONG STDMETHODCALLTYPE IUnknown_Release_Proxy(IUnknown*); +void __RPC_STUB IUnknown_Release_Stub(LPRPCSTUBBUFFER,LPRPCCHANNELBUFFER,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IClassFactory_RemoteCreateInstance_Proxy(IClassFactory*,REFIID,IUnknown**); +void __RPC_STUB IClassFactory_RemoteCreateInstance_Stub(LPRPCSTUBBUFFER,LPRPCCHANNELBUFFER,PRPC_MESSAGE,PDWORD); +HRESULT __stdcall IClassFactory_RemoteLockServer_Proxy(IClassFactory*,BOOL); +void __RPC_STUB IClassFactory_RemoteLockServer_Stub(LPRPCSTUBBUFFER,LPRPCCHANNELBUFFER,PRPC_MESSAGE,PDWORD); +HRESULT STDMETHODCALLTYPE IClassFactory_CreateInstance_Proxy(IClassFactory*,IUnknown*,REFIID,void**); +HRESULT STDMETHODCALLTYPE IClassFactory_CreateInstance_Stub(IClassFactory*,REFIID,IUnknown**); +HRESULT STDMETHODCALLTYPE IClassFactory_LockServer_Proxy(IClassFactory*,BOOL); +HRESULT STDMETHODCALLTYPE IClassFactory_LockServer_Stub(IClassFactory*,BOOL); + +#if (!defined (__cplusplus) || defined (CINTERFACE)) \ + && defined (COBJMACROS) +#define IUnknown_QueryInterface(T,r,O) (T)->lpVtbl->QueryInterface(T,r,O) +#define IUnknown_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IUnknown_Release(T) (T)->lpVtbl->Release(T) +#define IClassFactory_QueryInterface(T,r,O) (T)->lpVtbl->QueryInterface(T,r,O) +#define IClassFactory_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IClassFactory_Release(T) (T)->lpVtbl->Release(T) +#define IClassFactory_CreateInstance(T,p,r,O) (T)->lpVtbl->CreateInstance(T,p,r,O) +#define IClassFactory_LockServer(T,f) (T)->lpVtbl->LockServer(T,f) +#endif /* COBJMACROS */ +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/userenv.h b/reactos/w32api/include/userenv.h new file mode 100644 index 00000000000..fad9f813b7c --- /dev/null +++ b/reactos/w32api/include/userenv.h @@ -0,0 +1,57 @@ +#ifndef _USERENV_H +#define _USERENV_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define PI_NOUI (1) +#define PI_APPLYPOLICY (2) +typedef struct _PROFILEINFOA { + DWORD dwSize; + DWORD dwFlags; + LPSTR lpUserName; + LPSTR lpProfilePath; + LPSTR lpDefaultPath; + LPSTR lpServerName; + LPSTR lpPolicyPath; + HANDLE hProfile; +} PROFILEINFOA, *LPPROFILEINFOA; +typedef struct _PROFILEINFOW { + DWORD dwSize; + DWORD dwFlags; + LPWSTR lpUserName; + LPWSTR lpProfilePath; + LPWSTR lpDefaultPath; + LPWSTR lpServerName; + LPWSTR lpPolicyPath; + HANDLE hProfile; +} PROFILEINFOW, *LPPROFILEINFOW; +BOOL WINAPI LoadUserProfileA(HANDLE,LPPROFILEINFOA); +BOOL WINAPI LoadUserProfileW(HANDLE,LPPROFILEINFOW); +BOOL WINAPI UnloadUserProfile(HANDLE,HANDLE); +BOOL WINAPI GetProfilesDirectoryA(LPSTR,LPDWORD); +BOOL WINAPI GetProfilesDirectoryW(LPWSTR,LPDWORD); +BOOL WINAPI GetUserProfileDirectoryA(HANDLE,LPSTR,LPDWORD); +BOOL WINAPI GetUserProfileDirectoryW(HANDLE,LPWSTR,LPDWORD); +BOOL WINAPI CreateEnvironmentBlock(LPVOID*,HANDLE,BOOL); +BOOL WINAPI DestroyEnvironmentBlock(LPVOID); +#ifdef UNICODE +typedef PROFILEINFOW PROFILEINFO; +typedef LPPROFILEINFOW LPPROFILEINFO; +#define LoadUserProfile LoadUserProfileW +#define GetProfilesDirectory GetProfilesDirectoryW +#define GetUserProfileDirectory GetUserProfileDirectoryW +#else +typedef PROFILEINFOA PROFILEINFO; +typedef LPPROFILEINFOA LPPROFILEINFO; +#define LoadUserProfile LoadUserProfileA +#define GetProfilesDirectory GetProfilesDirectoryA +#define GetUserProfileDirectory GetUserProfileDirectoryA +#endif +#ifdef __cplusplus +} +#endif +#endif /* _USERENV_H */ diff --git a/reactos/w32api/include/uxtheme.h b/reactos/w32api/include/uxtheme.h new file mode 100644 index 00000000000..8014bfb7586 --- /dev/null +++ b/reactos/w32api/include/uxtheme.h @@ -0,0 +1,120 @@ +#ifndef _UXTHEME_H +#define _UXTHEME_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if (_WIN32_WINNT >= 0x0501) +#define DTBG_CLIPRECT 0x00000001 +#define DTBG_DRAWSOLID 0x00000002 +#define DTBG_OMITBORDER 0x00000004 +#define DTBG_OMITCONTENT 0x00000008 +#define DTBG_COMPUTINGREGION 0x00000010 +#define DTBG_MIRRORDC 0x00000020 +#define DTT_GRAYED 0x00000001 +#define ETDT_DISABLE 0x00000001 +#define ETDT_ENABLE 0x00000002 +#define ETDT_USETABTEXTURE 0x00000004 +#define ETDT_ENABLETAB (ETDT_ENABLE|ETDT_USETABTEXTURE) +#define STAP_ALLOW_NONCLIENT 0x00000001 +#define STAP_ALLOW_CONTROLS 0x00000002 +#define STAP_ALLOW_WEBCONTENT 0x00000004 +#define HTTB_BACKGROUNDSEG 0x0000 +#define HTTB_FIXEDBORDER 0x0002 +#define HTTB_CAPTION 0x0004 +#define HTTB_RESIZINGBORDER_LEFT 0x0010 +#define HTTB_RESIZINGBORDER_TOP 0x0020 +#define HTTB_RESIZINGBORDER_RIGHT 0x0040 +#define HTTB_RESIZINGBORDER_BOTTOM 0x0080 +#define HTTB_RESIZINGBORDER (HTTB_RESIZINGBORDER_LEFT|HTTB_RESIZINGBORDER_TOP|HTTB_RESIZINGBORDER_RIGHT|HTTB_RESIZINGBORDER_BOTTOM) +#define HTTB_SIZINGTEMPLATE 0x0100 +#define HTTB_SYSTEMSIZINGMARGINS 0x0200 + +typedef enum PROPERTYORIGIN { + PO_STATE = 0, + PO_PART = 1, + PO_CLASS = 2, + PO_GLOBAL = 3, + PO_NOTFOUND = 4 +} PROPERTYORIGIN; +typedef enum THEMESIZE { + TS_MIN, + TS_TRUE, + TS_DRAW +} THEME_SIZE; +typedef struct _DTBGOPTS { + DWORD dwSize; + DWORD dwFlags; + RECT rcClip; +} DTBGOPTS, *PDTBGOPTS; +#define MAX_INTLIST_COUNT 10 +typedef struct _INTLIST { + int iValueCount; + int iValues[MAX_INTLIST_COUNT]; +} INTLIST, *PINTLIST; +typedef struct _MARGINS { + int cxLeftWidth; + int cxRightWidth; + int cyTopHeight; + int cyBottomHeight; +} MARGINS, *PMARGINS; +typedef HANDLE HTHEME; + +HRESULT WINAPI CloseThemeData(HTHEME); +HRESULT WINAPI DrawThemeBackground(HTHEME,HDC,int,int,const RECT*,const RECT*); +HRESULT WINAPI DrawThemeBackgroundEx(HTHEME,HDC,int,int,const RECT*,const DTBGOPTS*); +HRESULT WINAPI DrawThemeEdge(HTHEME,HDC,int,int,const RECT*,UINT,UINT,RECT*); +HRESULT WINAPI DrawThemeIcon(HTHEME,HDC,int,int,const RECT*,HIMAGELIST,int); +HRESULT WINAPI DrawThemeParentBackground(HWND,HDC,RECT*); +HRESULT WINAPI DrawThemeText(HTHEME,HDC,int,int,LPCWSTR,int,DWORD,DWORD,const RECT*); +HRESULT WINAPI EnableThemeDialogTexture(HWND,DWORD); +HRESULT WINAPI EnableTheming(BOOL); +HRESULT WINAPI GetCurrentThemeName(LPWSTR,int,LPWSTR,int,LPWSTR,int); +DWORD WINAPI GetThemeAppProperties(); +HRESULT WINAPI GetThemeBackgroundContentRect(HTHEME,HDC,int,int,const RECT*,RECT*); +HRESULT WINAPI GetThemeBackgroundExtent(HTHEME,HDC,int,int,const RECT*,RECT*); +HRESULT WINAPI GetThemeBackgroundRegion(HTHEME,HDC,int,int,const RECT*,HRGN*); +HRESULT WINAPI GetThemeBool(HTHEME,int,int,int,BOOL*); +HRESULT WINAPI GetThemeColor(HTHEME,int,int,int,COLORREF*); +HRESULT WINAPI GetThemeDocumentationProperty(LPCWSTR,LPCWSTR,LPWSTR,int); +HRESULT WINAPI GetThemeEnumValue(HTHEME,int,int,int,int*); +HRESULT WINAPI GetThemeFilename(HTHEME,int,int,int,LPWSTR,int); +HRESULT WINAPI GetThemeFont(HTHEME,HDC,int,int,int,LOGFONT*); +HRESULT WINAPI GetThemeInt(HTHEME,int,int,int,int*); +HRESULT WINAPI GetThemeIntList(HTHEME,int,int,int,INTLIST*); +HRESULT WINAPI GetThemeMargins(HTHEME,HDC,int,int,int,RECT*,MARGINS*); +HRESULT WINAPI GetThemeMetric(HTHEME,HDC,int,int,int,int*); +HRESULT WINAPI GetThemePartSize(HTHEME,HDC,int,int,RECT*,THEME_SIZE,SIZE*); +HRESULT WINAPI GetThemePosition(HTHEME,int,int,int,POINT*); +HRESULT WINAPI GetThemePropertyOrigin(HTHEME,int,int,int,PROPERTYORIGIN*); +HRESULT WINAPI GetThemeRect(HTHEME,int,int,int,RECT*); +HRESULT WINAPI GetThemeString(HTHEME,int,int,int,LPWSTR,int); +BOOL WINAPI GetThemeSysBool(HTHEME,int); +COLORREF WINAPI GetThemeSysColor(HTHEME,int); +HBRUSH WINAPI GetThemeSysColorBrush(HTHEME,int); +HRESULT WINAPI GetThemeSysFont(HTHEME,int,LOGFONT*); +HRESULT WINAPI GetThemeSysInt(HTHEME,int,int*); +int WINAPI GetThemeSysSize(HTHEME,int); +HRESULT WINAPI GetThemeSysString(HTHEME,int,LPWSTR,int); +HRESULT WINAPI GetThemeTextExtent(HTHEME,HDC,int,int,LPCWSTR,int,DWORD,const RECT*,RECT*); +HRESULT WINAPI GetThemeTextMetrics(HTHEME,HDC,int,int,TEXTMETRIC*); +HTHEME WINAPI GetWindowTheme(HWND); +HRESULT WINAPI HitTestThemeBackground(HTHEME,HDC,int,int,DWORD,const RECT*,HRGN,POINT,WORD*); +BOOL WINAPI IsAppThemed(); +BOOL WINAPI IsThemeActive(); +BOOL WINAPI IsThemeBackgroundPartiallyTransparent(HTHEME,int,int); +BOOL WINAPI IsThemeDialogTextureEnabled(HWND); +BOOL WINAPI IsThemePartDefined(HTHEME,int,int); +HTHEME WINAPI OpenThemeData(HWND,LPCWSTR); +void WINAPI SetThemeAppProperties(DWORD); +HRESULT WINAPI SetWindowTheme(HWND,LPCWSTR,LPCWSTR); +#endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/vfw.h b/reactos/w32api/include/vfw.h new file mode 100644 index 00000000000..cce5e3126db --- /dev/null +++ b/reactos/w32api/include/vfw.h @@ -0,0 +1,1130 @@ +#ifndef _VFW_H +#define _VFW_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifndef _WINDOWS_H +#include <windows.h> +#endif +#ifndef _MMSYSTEM_H +#include <mmsystem.h> +#endif +#if !defined (_OLE2_H) && !defined (__OBJC__) +#include <ole2.h> +#endif + +#define VFWAPI WINAPI +#define VFWAPIV WINAPIV + +#include <pshpack8.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#define ICERR_OK 0 +#define ICERR_DONTDRAW 1 +#define ICERR_NEWPALETTE 2 +#define ICERR_GOTOKEYFRAME 3 +#define ICERR_STOPDRAWING 4 +#define ICERR_UNSUPPORTED -1 +#define ICERR_BADFORMAT -2 +#define ICERR_MEMORY -3 +#define ICERR_INTERNAL -4 +#define ICERR_BADFLAGS -5 +#define ICERR_BADPARAM -6 +#define ICERR_BADSIZE -7 +#define ICERR_BADHANDLE -8 +#define ICERR_CANTUPDATE -9 +#define ICERR_ABORT -10 +#define ICERR_ERROR -100 +#define ICERR_BADBITDEPTH -200 +#define ICERR_BADIMAGESIZE -201 +#define ICERR_CUSTOM -400 +#define ICCOMPRESSFRAMES_PADDING 0x01 +#define ICM_USER (DRV_USER+0x0000) +#define ICM_RESERVED_LOW (DRV_USER+0x1000) +#define ICM_RESERVED_HIGH (DRV_USER+0x2000) +#define ICM_RESERVED ICM_RESERVED_LOW +#define ICM_GETSTATE (ICM_RESERVED+0) +#define ICM_SETSTATE (ICM_RESERVED+1) +#define ICM_GETINFO (ICM_RESERVED+2) +#define ICM_CONFIGURE (ICM_RESERVED+10) +#define ICM_ABOUT (ICM_RESERVED+11) +#define ICM_GETDEFAULTQUALITY (ICM_RESERVED+30) +#define ICM_GETQUALITY (ICM_RESERVED+31) +#define ICM_SETQUALITY (ICM_RESERVED+32) +#define ICM_SET (ICM_RESERVED+40) +#define ICM_GET (ICM_RESERVED+41) +#define ICM_FRAMERATE mmioFOURCC('F','r','m','R') +#define ICM_KEYFRAMERATE mmioFOURCC('K','e','y','R') +#define ICM_COMPRESS_GET_FORMAT (ICM_USER+4) +#define ICM_COMPRESS_GET_SIZE (ICM_USER+5) +#define ICM_COMPRESS_QUERY (ICM_USER+6) +#define ICM_COMPRESS_BEGIN (ICM_USER+7) +#define ICM_COMPRESS (ICM_USER+8) +#define ICM_COMPRESS_END (ICM_USER+9) +#define ICM_DECOMPRESS_GET_FORMAT (ICM_USER+10) +#define ICM_DECOMPRESS_QUERY (ICM_USER+11) +#define ICM_DECOMPRESS_BEGIN (ICM_USER+12) +#define ICM_DECOMPRESS (ICM_USER+13) +#define ICM_DECOMPRESS_END (ICM_USER+14) +#define ICM_DECOMPRESS_SET_PALETTE (ICM_USER+29) +#define ICM_DECOMPRESS_GET_PALETTE (ICM_USER+30) +#define ICM_DRAW_QUERY (ICM_USER+31) +#define ICM_DRAW_BEGIN (ICM_USER+15) +#define ICM_DRAW_GET_PALETTE (ICM_USER+16) +#define ICM_DRAW_START (ICM_USER+18) +#define ICM_DRAW_STOP (ICM_USER+19) +#define ICM_DRAW_END (ICM_USER+21) +#define ICM_DRAW_GETTIME (ICM_USER+32) +#define ICM_DRAW (ICM_USER+33) +#define ICM_DRAW_WINDOW (ICM_USER+34) +#define ICM_DRAW_SETTIME (ICM_USER+35) +#define ICM_DRAW_REALIZE (ICM_USER+36) +#define ICM_DRAW_FLUSH (ICM_USER+37) +#define ICM_DRAW_RENDERBUFFER (ICM_USER+38) +#define ICM_DRAW_START_PLAY (ICM_USER+39) +#define ICM_DRAW_STOP_PLAY (ICM_USER+40) +#define ICM_DRAW_SUGGESTFORMAT (ICM_USER+50) +#define ICM_DRAW_CHANGEPALETTE (ICM_USER+51) +#define ICM_GETBUFFERSWANTED (ICM_USER+41) +#define ICM_GETDEFAULTKEYFRAMERATE (ICM_USER+42) +#define ICM_DECOMPRESSEX_BEGIN (ICM_USER+60) +#define ICM_DECOMPRESSEX_QUERY (ICM_USER+61) +#define ICM_DECOMPRESSEX (ICM_USER+62) +#define ICM_DECOMPRESSEX_END (ICM_USER+63) +#define ICM_COMPRESS_FRAMES_INFO (ICM_USER+70) +#define ICM_SET_STATUS_PROC (ICM_USER+72) +#define ICMF_CONFIGURE_QUERY 0x01 +#define ICCOMPRESS_KEYFRAME 0x01 +#define ICSTATUS_START 0 +#define ICSTATUS_STATUS 1 +#define ICSTATUS_END 2 +#define ICSTATUS_ERROR 3 +#define ICSTATUS_YIELD 4 +#define ICMODE_COMPRESS 1 +#define ICMODE_DECOMPRESS 2 +#define ICMODE_FASTDECOMPRESS 3 +#define ICMODE_QUERY 4 +#define ICMODE_FASTCOMPRESS 5 +#define ICMODE_DRAW 8 +#define ICQUALITY_LOW 0 +#define ICQUALITY_HIGH 10000 +#define ICQUALITY_DEFAULT -1 +#define VIDCF_QUALITY 0x01 +#define VIDCF_CRUNCH 0x02 +#define VIDCF_TEMPORAL 0x04 +#define VIDCF_COMPRESSFRAMES 0x08 +#define VIDCF_DRAW 0x10 +#define VIDCF_FASTTEMPORALC 0x20 +#define VIDCF_FASTTEMPORALD 0x80 +#define VIDCF_QUALITYTIME 0x40 +#define VIDCF_FASTTEMPORAL (VIDCF_FASTTEMPORALC|VIDCF_FASTTEMPORALD) +#define ICMF_ABOUT_QUERY 0x01 +#define ICDECOMPRESS_HURRYUP 0x80000000 +#define ICDECOMPRESS_UPDATE 0x40000000 +#define ICDECOMPRESS_PREROLL 0x20000000 +#define ICDECOMPRESS_NULLFRAME 0x10000000 +#define ICDECOMPRESS_NOTKEYFRAME 0x8000000 +#define ICDRAW_QUERY 0x01L +#define ICDRAW_FULLSCREEN 0x02L +#define ICDRAW_HDC 0x04L +#define ICDRAW_ANIMATE 0x08L +#define ICDRAW_CONTINUE 0x10L +#define ICDRAW_MEMORYDC 0x20L +#define ICDRAW_UPDATING 0x40L +#define ICDRAW_RENDER 0x80L +#define ICDRAW_BUFFER 0x100L +#define ICINSTALL_UNICODE 0x8000 +#define ICINSTALL_FUNCTION 0x01 +#define ICINSTALL_DRIVER 0x02 +#define ICINSTALL_HDRV 0x04 +#define ICINSTALL_DRIVERW 0x8002 +#define ICDRAW_HURRYUP 0x80000000L +#define ICDRAW_UPDATE 0x40000000L +#define ICDRAW_PREROLL 0x20000000L +#define ICDRAW_NULLFRAME 0x10000000L +#define ICDRAW_NOTKEYFRAME 0x8000000L +#define ICMF_COMPVARS_VALID 0x01 +#define ICMF_CHOOSE_KEYFRAME 0x01 +#define ICMF_CHOOSE_DATARATE 0x02 +#define ICMF_CHOOSE_PREVIEW 0x04 +#define ICMF_CHOOSE_ALLCOMPRESSORS 0x08 +#define ICTYPE_VIDEO mmioFOURCC('v','i','d','c') +#define ICTYPE_AUDIO mmioFOURCC('a','u','d','c') +#define formtypeAVI mmioFOURCC('A','V','I',' ') +#define listtypeAVIHEADER mmioFOURCC('h','d','r','l') +#define ckidAVIMAINHDR mmioFOURCC('a','v','i','h') +#define listtypeSTREAMHEADER mmioFOURCC('s','t','r','l') +#define ckidSTREAMHEADER mmioFOURCC('s','t','r','h') +#define ckidSTREAMFORMAT mmioFOURCC('s','t','r','f') +#define ckidSTREAMHANDLERDATA mmioFOURCC('s','t','r','d') +#define ckidSTREAMNAME mmioFOURCC('s','t','r','n') +#define listtypeAVIMOVIE mmioFOURCC('m','o','v','i') +#define listtypeAVIRECORD mmioFOURCC('r','e','c',' ') +#define ckidAVINEWINDEX mmioFOURCC('i', 'd', 'x', '1') +#define streamtypeANY 0UL +#define streamtypeVIDEO mmioFOURCC('v','i','d','s') +#define streamtypeAUDIO mmioFOURCC('a','u','d','s') +#define streamtypeMIDI mmioFOURCC('m','i','d','s') +#define streamtypeTEXT mmioFOURCC('t','x','t','s') +#define cktypeDIBbits aviTWOCC('d','b') +#define cktypeDIBcompressed aviTWOCC('d','c') +#define cktypePALchange aviTWOCC('p','c') +#define cktypeWAVEbytes aviTWOCC('w','b') +#define ckidAVIPADDING mmioFOURCC('J','U','N','K') +#define FromHex(n) (((n)>='A')?((n)+10-'A'):((n)-'0')) +#define StreamFromFOURCC(fcc) ((WORD)((FromHex(LOBYTE(LOWORD(fcc)))<<4)+(FromHex(HIBYTE(LOWORD(fcc)))))) +#define TWOCCFromFOURCC(fcc) HIWORD(fcc) +#define ToHex(n) ((BYTE)(((n)>9)?((n)-10+'A'):((n)+'0'))) +#define MAKEAVICKID(tcc, stream) MAKELONG((ToHex((stream)&0x0f)<<8)|(ToHex(((stream)&0xf0)>>4)),tcc) +#define AVIF_HASINDEX 0x10 +#define AVIF_MUSTUSEINDEX 0x20 +#define AVIF_ISINTERLEAVED 0x100 +#define AVIF_TRUSTCKTYPE 0x800 +#define AVIF_WASCAPTUREFILE 0x10000 +#define AVIF_COPYRIGHTED 0x20000 +#define AVI_HEADERSIZE 2048 +#define AVISF_DISABLED 0x01 +#define AVISF_VIDEO_PALCHANGES 0x10000 +#define AVIIF_LIST 0x01 +#define AVIIF_TWOCC 0x02 +#define AVIIF_KEYFRAME 0x10 +#define AVIIF_NOTIME 0x100 +#define AVIIF_COMPUSE 0xfff0000 +#define AVIIF_KEYFRAME 0x10 +#define AVIGETFRAMEF_BESTDISPLAYFMT 1 +#define AVISTREAMINFO_DISABLED 0x01 +#define AVISTREAMINFO_FORMATCHANGES 0x10000 +#define AVIFILEINFO_HASINDEX 0x10 +#define AVIFILEINFO_MUSTUSEINDEX 0x20 +#define AVIFILEINFO_ISINTERLEAVED 0x100 +#define AVIFILEINFO_TRUSTCKTYPE 0x800 +#define AVIFILEINFO_WASCAPTUREFILE 0x10000 +#define AVIFILEINFO_COPYRIGHTED 0x20000 +#define AVIFILECAPS_CANREAD 0x01 +#define AVIFILECAPS_CANWRITE 0x02 +#define AVIFILECAPS_ALLKEYFRAMES 0x10 +#define AVIFILECAPS_NOCOMPRESSION 0x20 +#define AVICOMPRESSF_INTERLEAVE 0x01 +#define AVICOMPRESSF_DATARATE 0x02 +#define AVICOMPRESSF_KEYFRAMES 0x04 +#define AVICOMPRESSF_VALID 0x08 +#define FIND_DIR 0x0000000fL +#define FIND_NEXT 0x00000001L +#define FIND_PREV 0x00000004L +#define FIND_FROM_START 0x00000008L +#define FIND_TYPE 0x000000f0L +#define FIND_KEY 0x00000010L +#define FIND_ANY 0x00000020L +#define FIND_FORMAT 0x00000040L +#define FIND_RET 0x0000f000L +#define FIND_POS 0x00000000L +#define FIND_LENGTH 0x00001000L +#define FIND_OFFSET 0x00002000L +#define FIND_SIZE 0x00003000L +#define FIND_INDEX 0x00004000L +#define AVIERR_OK 0 +#define MAKE_AVIERR(e) MAKE_SCODE(SEVERITY_ERROR,FACILITY_ITF,0x4000+e) +#define AVIERR_UNSUPPORTED MAKE_AVIERR(101) +#define AVIERR_BADFORMAT MAKE_AVIERR(102) +#define AVIERR_MEMORY MAKE_AVIERR(103) +#define AVIERR_INTERNAL MAKE_AVIERR(104) +#define AVIERR_BADFLAGS MAKE_AVIERR(105) +#define AVIERR_BADPARAM MAKE_AVIERR(106) +#define AVIERR_BADSIZE MAKE_AVIERR(107) +#define AVIERR_BADHANDLE MAKE_AVIERR(108) +#define AVIERR_FILEREAD MAKE_AVIERR(109) +#define AVIERR_FILEWRITE MAKE_AVIERR(110) +#define AVIERR_FILEOPEN MAKE_AVIERR(111) +#define AVIERR_COMPRESSOR MAKE_AVIERR(112) +#define AVIERR_NOCOMPRESSOR MAKE_AVIERR(113) +#define AVIERR_READONLY MAKE_AVIERR(114) +#define AVIERR_NODATA MAKE_AVIERR(115) +#define AVIERR_BUFFERTOOSMALL MAKE_AVIERR(116) +#define AVIERR_CANTCOMPRESS MAKE_AVIERR(117) +#define AVIERR_USERABORT MAKE_AVIERR(198) +#define AVIERR_ERROR MAKE_AVIERR(199) +#define MCIWNDOPENF_NEW 0x0001 +#define MCIWNDF_NOAUTOSIZEWINDOW 0x0001 +#define MCIWNDF_NOPLAYBAR 0x0002 +#define MCIWNDF_NOAUTOSIZEMOVIE 0x0004 +#define MCIWNDF_NOMENU 0x0008 +#define MCIWNDF_SHOWNAME 0x0010 +#define MCIWNDF_SHOWPOS 0x0020 +#define MCIWNDF_SHOWMODE 0x0040 +#define MCIWNDF_SHOWALL 0x0070 +#define MCIWNDF_NOTIFYMODE 0x0100 +#define MCIWNDF_NOTIFYPOS 0x0200 +#define MCIWNDF_NOTIFYSIZE 0x0400 +#define MCIWNDF_NOTIFYERROR 0x1000 +#define MCIWNDF_NOTIFYALL 0x1F00 +#define MCIWNDF_NOTIFYANSI 0x0080 +#define MCIWNDF_NOTIFYMEDIAA 0x0880 +#define MCIWNDF_NOTIFYMEDIAW 0x0800 +#define MCIWNDF_RECORD 0x2000 +#define MCIWNDF_NOERRORDLG 0x4000 +#define MCIWNDF_NOOPEN 0x8000 +#define MCIWNDM_GETDEVICEID (WM_USER + 100) +#define MCIWNDM_GETSTART (WM_USER + 103) +#define MCIWNDM_GETLENGTH (WM_USER + 104) +#define MCIWNDM_GETEND (WM_USER + 105) +#define MCIWNDM_EJECT (WM_USER + 107) +#define MCIWNDM_SETZOOM (WM_USER + 108) +#define MCIWNDM_GETZOOM (WM_USER + 109) +#define MCIWNDM_SETVOLUME (WM_USER + 110) +#define MCIWNDM_GETVOLUME (WM_USER + 111) +#define MCIWNDM_SETSPEED (WM_USER + 112) +#define MCIWNDM_GETSPEED (WM_USER + 113) +#define MCIWNDM_SETREPEAT (WM_USER + 114) +#define MCIWNDM_GETREPEAT (WM_USER + 115) +#define MCIWNDM_REALIZE (WM_USER + 118) +#define MCIWNDM_VALIDATEMEDIA (WM_USER + 121) +#define MCIWNDM_PLAYFROM (WM_USER + 122) +#define MCIWNDM_PLAYTO (WM_USER + 123) +#define MCIWNDM_GETPALETTE (WM_USER + 126) +#define MCIWNDM_SETPALETTE (WM_USER + 127) +#define MCIWNDM_SETTIMERS (WM_USER + 129) +#define MCIWNDM_SETACTIVETIMER (WM_USER + 130) +#define MCIWNDM_SETINACTIVETIMER (WM_USER + 131) +#define MCIWNDM_GETACTIVETIMER (WM_USER + 132) +#define MCIWNDM_GETINACTIVETIMER (WM_USER + 133) +#define MCIWNDM_CHANGESTYLES (WM_USER + 135) +#define MCIWNDM_GETSTYLES (WM_USER + 136) +#define MCIWNDM_GETALIAS (WM_USER + 137) +#define MCIWNDM_PLAYREVERSE (WM_USER + 139) +#define MCIWNDM_GET_SOURCE (WM_USER + 140) +#define MCIWNDM_PUT_SOURCE (WM_USER + 141) +#define MCIWNDM_GET_DEST (WM_USER + 142) +#define MCIWNDM_PUT_DEST (WM_USER + 143) +#define MCIWNDM_CAN_PLAY (WM_USER + 144) +#define MCIWNDM_CAN_WINDOW (WM_USER + 145) +#define MCIWNDM_CAN_RECORD (WM_USER + 146) +#define MCIWNDM_CAN_SAVE (WM_USER + 147) +#define MCIWNDM_CAN_EJECT (WM_USER + 148) +#define MCIWNDM_CAN_CONFIG (WM_USER + 149) +#define MCIWNDM_PALETTEKICK (WM_USER + 150) +#define MCIWNDM_OPENINTERFACE (WM_USER + 151) +#define MCIWNDM_SETOWNER (WM_USER + 152) +#define MCIWNDM_SENDSTRINGA (WM_USER + 101) +#define MCIWNDM_GETPOSITIONA (WM_USER + 102) +#define MCIWNDM_GETMODEA (WM_USER + 106) +#define MCIWNDM_SETTIMEFORMATA (WM_USER + 119) +#define MCIWNDM_GETTIMEFORMATA (WM_USER + 120) +#define MCIWNDM_GETFILENAMEA (WM_USER + 124) +#define MCIWNDM_GETDEVICEA (WM_USER + 125) +#define MCIWNDM_GETERRORA (WM_USER + 128) +#define MCIWNDM_NEWA (WM_USER + 134) +#define MCIWNDM_RETURNSTRINGA (WM_USER + 138) +#define MCIWNDM_OPENA (WM_USER + 153) +#define MCIWNDM_SENDSTRINGW (WM_USER + 201) +#define MCIWNDM_GETPOSITIONW (WM_USER + 202) +#define MCIWNDM_GETMODEW (WM_USER + 206) +#define MCIWNDM_SETTIMEFORMATW (WM_USER + 219) +#define MCIWNDM_GETTIMEFORMATW (WM_USER + 220) +#define MCIWNDM_GETFILENAMEW (WM_USER + 224) +#define MCIWNDM_GETDEVICEW (WM_USER + 225) +#define MCIWNDM_GETERRORW (WM_USER + 228) +#define MCIWNDM_NEWW (WM_USER + 234) +#define MCIWNDM_RETURNSTRINGW (WM_USER + 238) +#define MCIWNDM_OPENW (WM_USER + 252) +#define MCIWNDM_NOTIFYMODE (WM_USER + 200) +#define MCIWNDM_NOTIFYPOS (WM_USER + 201) +#define MCIWNDM_NOTIFYSIZE (WM_USER + 202) +#define MCIWNDM_NOTIFYMEDIA (WM_USER + 203) +#define MCIWNDM_NOTIFYERROR (WM_USER + 205) +#define MCIWND_START -1 +#define MCIWND_END -2 +#define DDF_UPDATE 0x02 +#define DDF_SAME_HDC 0x04 +#define DDF_SAME_DRAW 0x08 +#define DDF_DONTDRAW 0x10 +#define DDF_ANIMATE 0x20 +#define DDF_BUFFER 0x40 +#define DDF_JUSTDRAWIT 0x80 +#define DDF_FULLSCREEN 0x100 +#define DDF_BACKGROUNDPAL 0x200 +#define DDF_NOTKEYFRAME 0x400 +#define DDF_HURRYUP 0x800 +#define DDF_HALFTONE 0x1000 +#define DDF_PREROLL DDF_DONTDRAW +#define DDF_SAME_DIB DDF_SAME_DRAW +#define DDF_SAME_SIZE DDF_SAME_DRAW +#define PD_CAN_DRAW_DIB 0x01 +#define PD_CAN_STRETCHDIB 0x02 +#define PD_STRETCHDIB_1_1_OK 0x04 +#define PD_STRETCHDIB_1_2_OK 0x08 +#define PD_STRETCHDIB_1_N_OK 0x10 +#ifndef mmioFOURCC +#define mmioFOURCC(c0,c1,c2,c3) ((DWORD)(BYTE)(c0)|((DWORD)(BYTE)(c1)<<8)|((DWORD)(BYTE)(c2)<<16)|((DWORD)(BYTE)(c3)<<24)) +#endif +#ifndef aviTWOCC +#define aviTWOCC(ch0,ch1) ((WORD)(BYTE)(ch0)|((WORD)(BYTE)(ch1)<<8)) +#endif + +#ifndef RC_INVOKED +DECLARE_HANDLE(HIC); +DECLARE_HANDLE(HDRAWDIB); +typedef WORD TWOCC; +typedef BOOL (CALLBACK *AVISAVECALLBACK)(INT); +typedef struct { + DWORD dwSize; + DWORD fccType; + DWORD fccHandler; + DWORD dwVersion; + DWORD dwFlags; + LRESULT dwError; + LPVOID pV1Reserved; + LPVOID pV2Reserved; + DWORD dnDevNode; +} ICOPEN,*LPICOPEN; +typedef struct { + DWORD dwFlags; + LPBITMAPINFOHEADER lpbiOutput; + LPVOID lpOutput; + LPBITMAPINFOHEADER lpbiInput; + LPVOID lpInput; + LPDWORD lpckid; + LPDWORD lpdwFlags; + LONG lFrameNum; + DWORD dwFrameSize; + DWORD dwQuality; + LPBITMAPINFOHEADER lpbiPrev; + LPVOID lpPrev; +} ICCOMPRESS; +typedef struct { + DWORD dwFlags; + LPBITMAPINFOHEADER lpbiOutput; + LPARAM lOutput; + LPBITMAPINFOHEADER lpbiInput; + LPARAM lInput; + LONG lStartFrame; + LONG lFrameCount; + LONG lQuality; + LONG lDataRate; + LONG lKeyRate; + DWORD dwRate; + DWORD dwScale; + DWORD dwOverheadPerFrame; + DWORD dwReserved2; + LONG (CALLBACK *GetData)(LPARAM,LONG,LPVOID,LONG); + LONG (CALLBACK *PutData)(LPARAM,LONG,LPVOID,LONG); +} ICCOMPRESSFRAMES; +typedef struct { + DWORD dwFlags; + LPARAM lParam; + LONG (CALLBACK *Status)(LPARAM,UINT,LONG); +} ICSETSTATUSPROC; +typedef struct { + DWORD dwSize; + DWORD fccType; + DWORD fccHandler; + DWORD dwFlags; + DWORD dwVersion; + DWORD dwVersionICM; + WCHAR szName[16]; + WCHAR szDescription[128]; + WCHAR szDriver[128]; +} ICINFO; +typedef struct { + DWORD dwFlags; + LPBITMAPINFOHEADER lpbiInput; + LPVOID lpInput; + LPBITMAPINFOHEADER lpbiOutput; + LPVOID lpOutput; + DWORD ckid; +} ICDECOMPRESS; +typedef struct { + DWORD dwFlags; + LPBITMAPINFOHEADER lpbiSrc; + LPVOID lpSrc; + LPBITMAPINFOHEADER lpbiDst; + LPVOID lpDst; + INT xDst; + INT yDst; + INT dxDst; + INT dyDst; + INT xSrc; + INT ySrc; + INT dxSrc; + INT dySrc; +} ICDECOMPRESSEX; +typedef struct { + DWORD dwFlags; + LPBITMAPINFOHEADER lpbiIn; + LPBITMAPINFOHEADER lpbiSuggest; + INT dxSrc; + INT dySrc; + INT dxDst; + INT dyDst; + HIC hicDecompressor; +} ICDRAWSUGGEST; +typedef struct { + DWORD dwFlags; + INT iStart; + INT iLen; + LPPALETTEENTRY lppe; +} ICPALETTE; +typedef struct { + DWORD dwFlags; + HPALETTE hpal; + HWND hwnd; + HDC hdc; + INT xDst; + INT yDst; + INT dxDst; + INT dyDst; + LPBITMAPINFOHEADER lpbi; + INT xSrc; + INT ySrc; + INT dxSrc; + INT dySrc; + DWORD dwRate; + DWORD dwScale; +} ICDRAWBEGIN; +typedef struct { + DWORD dwFlags; + LPVOID lpFormat; + LPVOID lpData; + DWORD cbData; + LONG lTime; +} ICDRAW; +typedef struct { + LONG cbSize; + DWORD dwFlags; + HIC hic; + DWORD fccType; + DWORD fccHandler; + LPBITMAPINFO lpbiIn; + LPBITMAPINFO lpbiOut; + LPVOID lpBitsOut; + LPVOID lpBitsPrev; + LONG lFrame; + LONG lKey; + LONG lDataRate; + LONG lQ; + LONG lKeyCount; + LPVOID lpState; + LONG cbState; +} COMPVARS, *PCOMPVARS; +typedef struct _MainAVIHeader +{ + DWORD dwMicroSecPerFrame; + DWORD dwMaxBytesPerSec; + DWORD dwPaddingGranularity; + DWORD dwFlags; + DWORD dwTotalFrames; + DWORD dwInitialFrames; + DWORD dwStreams; + DWORD dwSuggestedBufferSize; + DWORD dwWidth; + DWORD dwHeight; + DWORD dwReserved[4]; +} MainAVIHeader; +typedef struct { + FOURCC fccType; + FOURCC fccHandler; + DWORD dwFlags; + WORD wPriority; + WORD wLanguage; + DWORD dwInitialFrames; + DWORD dwScale; + DWORD dwRate; + DWORD dwStart; + DWORD dwLength; + DWORD dwSuggestedBufferSize; + DWORD dwQuality; + DWORD dwSampleSize; + RECT rcFrame; +} AVIStreamHeader; +typedef struct _AVIINDEXENTRY { + DWORD ckid; + DWORD dwFlags; + DWORD dwChunkOffset; + DWORD dwChunkLength; +} AVIINDEXENTRY; +typedef struct _AVIPALCHANGE { + BYTE bFirstEntry; + BYTE bNumEntries; + WORD wFlags; + PALETTEENTRY peNew[1]; +} AVIPALCHANGE; +typedef struct _AVISTREAMINFOA { + DWORD fccType; + DWORD fccHandler; + DWORD dwFlags; + DWORD dwCaps; + WORD wPriority; + WORD wLanguage; + DWORD dwScale; + DWORD dwRate; + DWORD dwStart; + DWORD dwLength; + DWORD dwInitialFrames; + DWORD dwSuggestedBufferSize; + DWORD dwQuality; + DWORD dwSampleSize; + RECT rcFrame; + DWORD dwEditCount; + DWORD dwFormatChangeCount; + CHAR szName[64]; +} AVISTREAMINFOA, * LPAVISTREAMINFOA, *PAVISTREAMINFOA; +typedef struct _AVISTREAMINFOW { + DWORD fccType; + DWORD fccHandler; + DWORD dwFlags; + DWORD dwCaps; + WORD wPriority; + WORD wLanguage; + DWORD dwScale; + DWORD dwRate; + DWORD dwStart; + DWORD dwLength; + DWORD dwInitialFrames; + DWORD dwSuggestedBufferSize; + DWORD dwQuality; + DWORD dwSampleSize; + RECT rcFrame; + DWORD dwEditCount; + DWORD dwFormatChangeCount; + WCHAR szName[64]; +} AVISTREAMINFOW, * LPAVISTREAMINFOW, *PAVISTREAMINFOW; +typedef struct _AVIFILEINFOW { + DWORD dwMaxBytesPerSec; + DWORD dwFlags; + DWORD dwCaps; + DWORD dwStreams; + DWORD dwSuggestedBufferSize; + DWORD dwWidth; + DWORD dwHeight; + DWORD dwScale; + DWORD dwRate; + DWORD dwLength; + DWORD dwEditCount; + WCHAR szFileType[64]; +} AVIFILEINFOW, *LPAVIFILEINFOW, *PAVIFILEINFOW; +typedef struct _AVIFILEINFOA { + DWORD dwMaxBytesPerSec; + DWORD dwFlags; + DWORD dwCaps; + DWORD dwStreams; + DWORD dwSuggestedBufferSize; + DWORD dwWidth; + DWORD dwHeight; + DWORD dwScale; + DWORD dwRate; + DWORD dwLength; + DWORD dwEditCount; + CHAR szFileType[64]; +} AVIFILEINFOA, *LPAVIFILEINFOA, *PAVIFILEINFOA; +typedef struct _AVICOMPRESSOPTIONS { + DWORD fccType; + DWORD fccHandler; + DWORD dwKeyFrameEvery; + DWORD dwQuality; + DWORD dwBytesPerSecond; + DWORD dwFlags; + LPVOID lpFormat; + DWORD cbFormat; + LPVOID lpParms; + DWORD cbParms; + DWORD dwInterleaveEvery; +} AVICOMPRESSOPTIONS, *LPAVICOMPRESSOPTIONS,*PAVICOMPRESSOPTIONS; + +#if !defined (__OBJC__) +#define DEFINE_AVIGUID(name,l,w1,w2) DEFINE_GUID(name,l,w1,w2,0xC0,0,0,0,0,0,0,0x46) +DEFINE_AVIGUID(IID_IAVIFile,0x00020020,0,0); +DEFINE_AVIGUID(IID_IAVIStream,0x00020021,0,0); +DEFINE_AVIGUID(IID_IAVIStreaming,0x00020022,0,0); +DEFINE_AVIGUID(IID_IGetFrame,0x00020023,0,0); +DEFINE_AVIGUID(IID_IAVIEditStream,0x00020024,0,0); +DEFINE_AVIGUID(CLSID_AVIFile,0x00020000,0,0); + +#undef INTERFACE +#define INTERFACE IAVIStream +DECLARE_INTERFACE_(IAVIStream, IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Create)(THIS_ LPARAM,LPARAM) PURE; + STDMETHOD(Info)(THIS_ AVISTREAMINFOW*,LONG) PURE; + STDMETHOD_(LONG,FindSample)(THIS_ LONG,LONG) PURE; + STDMETHOD(ReadFormat)(THIS_ LONG,LPVOID,LONG*) PURE; + STDMETHOD(SetFormat)(THIS_ LONG,LPVOID,LONG) PURE; + STDMETHOD(Read)(THIS_ LONG,LONG,LPVOID,LONG,LONG*,LONG*) PURE; + STDMETHOD(Write)(THIS_ LONG,LONG,LPVOID,LONG,DWORD,LONG*,LONG*) PURE; + STDMETHOD(Delete)(THIS_ LONG,LONG) PURE; + STDMETHOD(ReadData)(THIS_ DWORD,LPVOID,LONG*) PURE; + STDMETHOD(WriteData)(THIS_ DWORD,LPVOID,LONG) PURE; + STDMETHOD(SetInfo)(THIS_ AVISTREAMINFOW*,LONG) PURE; +}; +typedef IAVIStream *PAVISTREAM; + +#undef INTERFACE +#define INTERFACE IAVIStreaming +DECLARE_INTERFACE_(IAVIStreaming, IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Begin)(THIS_ LONG,LONG,LONG) PURE; + STDMETHOD(End)(THIS) PURE; +}; +typedef IAVIStreaming *PAVISTREAMING; + +#undef INTERFACE +#define INTERFACE IAVIEditStream +DECLARE_INTERFACE_(IAVIEditStream, IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Cut)(THIS_ LONG*,LONG*,PAVISTREAM*) PURE; + STDMETHOD(Copy)(THIS_ LONG*,LONG*,PAVISTREAM*) PURE; + STDMETHOD(Paste)(THIS_ LONG*,LONG*,PAVISTREAM,LONG,LONG) PURE; + STDMETHOD(Clone)(THIS_ PAVISTREAM*) PURE; + STDMETHOD(SetInfo)(THIS_ LPAVISTREAMINFOW,LONG) PURE; +}; +typedef IAVIEditStream *PAVIEDITSTREAM; + +#undef INTERFACE +#define INTERFACE IAVIFile +DECLARE_INTERFACE_(IAVIFile, IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD(Info)(THIS_ AVIFILEINFOW*,LONG) PURE; + STDMETHOD(GetStream)(THIS_ PAVISTREAM*,DWORD,LONG) PURE; + STDMETHOD(CreateStream)(THIS_ PAVISTREAM*,AVISTREAMINFOW*) PURE; + STDMETHOD(WriteData)(THIS_ DWORD,LPVOID,LONG) PURE; + STDMETHOD(ReadData)(THIS_ DWORD,LPVOID,LONG*) PURE; + STDMETHOD(EndRecord)(THIS) PURE; + STDMETHOD(DeleteStream)(THIS_ DWORD,LONG) PURE; +}; +typedef IAVIFile *PAVIFILE; + +#undef INTERFACE +#define INTERFACE IGetFrame +DECLARE_INTERFACE_(IGetFrame, IUnknown) +{ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + STDMETHOD_(LPVOID,GetFrame)(THIS_ LONG) PURE; + STDMETHOD(Begin)(THIS_ LONG,LONG,LONG) PURE; + STDMETHOD(End)(THIS) PURE; + STDMETHOD(SetFormat)(THIS_ LPBITMAPINFOHEADER,LPVOID,INT,INT,INT,INT) PURE; +}; +typedef IGetFrame *PGETFRAME; +#endif /* !defined (__OBJC__) */ + +DWORD VFWAPI VideoForWindowsVersion(VOID); +LONG VFWAPI InitVFW(VOID); +LONG VFWAPI TermVFW(VOID); +DWORD VFWAPIV ICCompress(HIC,DWORD,LPBITMAPINFOHEADER,LPVOID,LPBITMAPINFOHEADER,LPVOID,LPDWORD,LPDWORD,LONG,DWORD,DWORD,LPBITMAPINFOHEADER,LPVOID); +DWORD VFWAPIV ICDecompress(HIC,DWORD,LPBITMAPINFOHEADER,LPVOID,LPBITMAPINFOHEADER,LPVOID); +LRESULT VFWAPI ICSendMessage(HIC,UINT,DWORD,DWORD); +HANDLE VFWAPI ICImageCompress(HIC,UINT,LPBITMAPINFO,LPVOID,LPBITMAPINFO,LONG,LONG*); +HANDLE VFWAPI ICImageDecompress(HIC,UINT,LPBITMAPINFO,LPVOID,LPBITMAPINFO); +BOOL VFWAPI ICInfo(DWORD,DWORD,ICINFO*); +BOOL VFWAPI ICInstall(DWORD,DWORD,LPARAM,LPSTR,UINT); +BOOL VFWAPI ICRemove(DWORD,DWORD,UINT); +LRESULT VFWAPI ICGetInfo(HIC,ICINFO*,DWORD); +HIC VFWAPI ICOpen(DWORD,DWORD,UINT); +HIC VFWAPI ICOpenFunction(DWORD,DWORD,UINT,FARPROC); +LRESULT VFWAPI ICClose(HIC hic); +HIC VFWAPI ICLocate(DWORD,DWORD,LPBITMAPINFOHEADER,LPBITMAPINFOHEADER,WORD); +HIC VFWAPI ICGetDisplayFormat(HIC,LPBITMAPINFOHEADER,LPBITMAPINFOHEADER,INT,INT,INT); +DWORD VFWAPIV ICDrawBegin(HIC,DWORD,HPALETTE,HWND,HDC,INT,INT,INT,INT,LPBITMAPINFOHEADER,INT,INT,INT,INT,DWORD,DWORD); +DWORD VFWAPIV ICDraw(HIC,DWORD,LPVOID,LPVOID,DWORD,LONG); +BOOL VFWAPI ICCompressorChoose(HWND,UINT,LPVOID,LPVOID,PCOMPVARS,LPSTR); +BOOL VFWAPI ICSeqCompressFrameStart(PCOMPVARS,LPBITMAPINFO); +void VFWAPI ICSeqCompressFrameEnd(PCOMPVARS); +LPVOID VFWAPI ICSeqCompressFrame(PCOMPVARS,UINT,LPVOID,BOOL*,LONG*); +void VFWAPI ICCompressorFree(PCOMPVARS); +#if !defined (__OBJC__) +ULONG WINAPI AVIStreamAddRef(PAVISTREAM); +ULONG WINAPI AVIStreamRelease(PAVISTREAM); +HRESULT WINAPI AVIStreamCreate(PAVISTREAM*,LONG,LONG,CLSID*); +HRESULT WINAPI AVIStreamInfoA(PAVISTREAM,AVISTREAMINFOA*,LONG); +HRESULT WINAPI AVIStreamInfoW(PAVISTREAM,AVISTREAMINFOW*,LONG); +HRESULT WINAPI AVIStreamFindSample(PAVISTREAM,LONG,DWORD); +HRESULT WINAPI AVIStreamReadFormat(PAVISTREAM,LONG,LPVOID,LONG*); +HRESULT WINAPI AVIStreamSetFormat(PAVISTREAM,LONG,LPVOID,LONG); +HRESULT WINAPI AVIStreamRead(PAVISTREAM,LONG,LONG,LPVOID,LONG,LONG*,LONG*); +HRESULT WINAPI AVIStreamWrite(PAVISTREAM,LONG,LONG,LPVOID,LONG,DWORD,LONG*,LONG*); +HRESULT WINAPI AVIStreamReadData(PAVISTREAM,DWORD,LPVOID,LONG*); +HRESULT WINAPI AVIStreamWriteData(PAVISTREAM,DWORD,LPVOID,LONG); +PGETFRAME WINAPI AVIStreamGetFrameOpen(PAVISTREAM,LPBITMAPINFOHEADER); +LPVOID WINAPI AVIStreamGetFrame(PGETFRAME,LONG); +HRESULT WINAPI AVIStreamGetFrameClose(PGETFRAME); +HRESULT WINAPI AVIMakeCompressedStream(PAVISTREAM*,PAVISTREAM,AVICOMPRESSOPTIONS*,CLSID*); +HRESULT WINAPI AVIMakeFileFromStreams(PAVIFILE*,INT,PAVISTREAM*); +HRESULT WINAPI AVIStreamOpenFromFileA(PAVISTREAM*,LPCSTR,DWORD,LONG,UINT,CLSID*); +HRESULT WINAPI AVIStreamOpenFromFileW(PAVISTREAM*,LPCWSTR,DWORD,LONG,UINT,CLSID*); +HRESULT WINAPI AVIBuildFilterA(LPSTR,LONG,BOOL); +HRESULT WINAPI AVIBuildFilterW(LPWSTR,LONG,BOOL); +BOOL WINAPI AVISaveOptions(HWND,UINT,INT,PAVISTREAM*,LPAVICOMPRESSOPTIONS*); +HRESULT WINAPI AVISaveOptionsFree(INT,LPAVICOMPRESSOPTIONS*); +HRESULT WINAPI AVISaveVA(LPCSTR,CLSID*,AVISAVECALLBACK,INT,PAVISTREAM*,LPAVICOMPRESSOPTIONS*); +HRESULT WINAPI AVISaveVW(LPCWSTR,CLSID*,AVISAVECALLBACK,INT,PAVISTREAM*,LPAVICOMPRESSOPTIONS*); +LONG WINAPI AVIStreamStart(PAVISTREAM); +LONG WINAPI AVIStreamLength(PAVISTREAM); +LONG WINAPI AVIStreamSampleToTime(PAVISTREAM,LONG); +LONG WINAPI AVIStreamTimeToSample(PAVISTREAM,LONG); +HRESULT WINAPI CreateEditableStream(PAVISTREAM*,PAVISTREAM); +HRESULT WINAPI EditStreamClone(PAVISTREAM,PAVISTREAM*); +HRESULT WINAPI EditStreamCopy(PAVISTREAM,LONG*,LONG*,PAVISTREAM*); +HRESULT WINAPI EditStreamCut(PAVISTREAM,LONG*,LONG*,PAVISTREAM*); +HRESULT WINAPI EditStreamPaste(PAVISTREAM,LONG*,LONG*,PAVISTREAM,LONG,LONG); +HRESULT WINAPI EditStreamSetInfoA(PAVISTREAM,LPAVISTREAMINFOA,LONG); +HRESULT WINAPI EditStreamSetInfoW(PAVISTREAM,LPAVISTREAMINFOW,LONG); +HRESULT WINAPI EditStreamSetNameA(PAVISTREAM,LPCSTR); +HRESULT WINAPI EditStreamSetNameW(PAVISTREAM,LPCWSTR); +HRESULT WINAPI CreateEditableStream(PAVISTREAM*,PAVISTREAM); +HRESULT WINAPI EditStreamClone(PAVISTREAM,PAVISTREAM*); +HRESULT WINAPI EditStreamCopy(PAVISTREAM,LONG*,LONG*,PAVISTREAM*); +HRESULT WINAPI EditStreamCut(PAVISTREAM,LONG*,LONG*,PAVISTREAM*); +HRESULT WINAPI EditStreamPaste(PAVISTREAM,LONG*,LONG*,PAVISTREAM,LONG,LONG); +HRESULT WINAPI EditStreamSetInfoA(PAVISTREAM,LPAVISTREAMINFOA,LONG); +HRESULT WINAPI EditStreamSetInfoW(PAVISTREAM,LPAVISTREAMINFOW,LONG); +HRESULT WINAPI EditStreamSetNameA(PAVISTREAM,LPCSTR); +HRESULT WINAPI EditStreamSetNameW(PAVISTREAM,LPCWSTR); +VOID WINAPI AVIFileInit(void); +VOID WINAPI AVIFileExit(void); +HRESULT WINAPI AVIFileOpenA(PAVIFILE*,LPCSTR,UINT,LPCLSID); +HRESULT WINAPI AVIFileOpenW(PAVIFILE*,LPCWSTR,UINT,LPCLSID); +ULONG WINAPI AVIFileAddRef(PAVIFILE); +ULONG WINAPI AVIFileRelease(PAVIFILE); +HRESULT WINAPI AVIFileInfoA(PAVIFILE,PAVIFILEINFOA,LONG); +HRESULT WINAPI AVIFileInfoW(PAVIFILE,PAVIFILEINFOW,LONG); +HRESULT WINAPI AVIFileGetStream(PAVIFILE,PAVISTREAM*,DWORD,LONG); +HRESULT WINAPI AVIFileCreateStreamA(PAVIFILE,PAVISTREAM*,AVISTREAMINFOA*); +HRESULT WINAPI AVIFileCreateStreamW(PAVIFILE,PAVISTREAM*,AVISTREAMINFOW*); +HRESULT WINAPI AVIFileWriteData(PAVIFILE,DWORD,LPVOID,LONG); +HRESULT WINAPI AVIFileReadData(PAVIFILE,DWORD,LPVOID,LPLONG); +HRESULT WINAPI AVIFileEndRecord(PAVIFILE); +HRESULT WINAPI AVIClearClipboard(VOID); +HRESULT WINAPI AVIGetFromClipboard(PAVIFILE*); +HRESULT WINAPI AVIPutFileOnClipboard(PAVIFILE); +#endif /* __OBJC__ */ +#ifdef OFN_READONLY +BOOL WINAPI GetOpenFileNamePreviewA(LPOPENFILENAMEA); +BOOL WINAPI GetOpenFileNamePreviewW(LPOPENFILENAMEW); +BOOL WINAPI GetSaveFileNamePreviewA(LPOPENFILENAMEA); +BOOL WINAPI GetSaveFileNamePreviewW(LPOPENFILENAMEW); +#endif +HWND VFWAPIV MCIWndCreateA(HWND,HINSTANCE,DWORD,LPCSTR); +HWND VFWAPIV MCIWndCreateW(HWND,HINSTANCE,DWORD,LPCWSTR); +HDRAWDIB VFWAPI DrawDibOpen(VOID); +UINT VFWAPI DrawDibRealize(HDRAWDIB,HDC,BOOL); +BOOL VFWAPI DrawDibBegin(HDRAWDIB,HDC,INT,INT,LPBITMAPINFOHEADER,INT,INT,UINT); +BOOL VFWAPI DrawDibDraw(HDRAWDIB,HDC,INT,INT,INT,INT,LPBITMAPINFOHEADER,LPVOID,INT,INT,INT,INT,UINT); +BOOL VFWAPI DrawDibSetPalette(HDRAWDIB,HPALETTE); +HPALETTE VFWAPI DrawDibGetPalette(HDRAWDIB); +BOOL VFWAPI DrawDibChangePalette(HDRAWDIB,int,int,LPPALETTEENTRY); +LPVOID VFWAPI DrawDibGetBuffer(HDRAWDIB,LPBITMAPINFOHEADER,DWORD,DWORD); +BOOL VFWAPI DrawDibStart(HDRAWDIB,DWORD); +BOOL VFWAPI DrawDibStop(HDRAWDIB); +BOOL VFWAPI DrawDibEnd(HDRAWDIB); +BOOL VFWAPI DrawDibClose(HDRAWDIB); +DWORD VFWAPI DrawDibProfileDisplay(LPBITMAPINFOHEADER); + +#define ICCompressGetFormat(hic,lpbiInput,lpbiOutput) ICSendMessage(hic,ICM_COMPRESS_GET_FORMAT,(DWORD)(lpbiInput),(DWORD)(lpbiOutput)) +#define ICCompressGetFormatSize(hic,lpbi) ICCompressGetFormat(hic,lpbi,NULL) +#define ICCompressBegin(hic,lpbiInput,lpbiOutput) ICSendMessage(hic,ICM_COMPRESS_BEGIN,(DWORD)(lpbiInput),(DWORD)(lpbiOutput)) +#define ICCompressGetSize(hic,lpbiInput,lpbiOutput) ICSendMessage(hic,ICM_COMPRESS_GET_SIZE,(DWORD)(lpbiInput),(DWORD)(lpbiOutput)) +#define ICCompressQuery(hic,lpbiInput,lpbiOutput) ICSendMessage(hic,ICM_COMPRESS_QUERY,(DWORD)(lpbiInput),(DWORD)(lpbiOutput)) +#define ICCompressEnd(hic) ICSendMessage(hic,ICM_COMPRESS_END,0,0) +#define ICQueryAbout(hic) (ICSendMessage(hic,ICM_ABOUT,(DWORD)-1,ICMF_ABOUT_QUERY)==ICERR_OK) +#define ICAbout(hic,hwnd) ICSendMessage(hic,ICM_ABOUT,(DWORD)(hwnd),0) +#define ICQueryConfigure(hic) (ICSendMessage(hic,ICM_CONFIGURE,(DWORD)-1,ICMF_CONFIGURE_QUERY)==ICERR_OK) +#define ICConfigure(hic,hwnd) ICSendMessage(hic,ICM_CONFIGURE,(DWORD)(hwnd),0) +#define ICDecompressBegin(hic,lpbiInput,lpbiOutput) ICSendMessage(hic,ICM_DECOMPRESS_BEGIN,(DWORD)(lpbiInput),(DWORD)(lpbiOutput)) +#define ICDecompressQuery(hic,lpbiInput,lpbiOutput) ICSendMessage(hic,ICM_DECOMPRESS_QUERY,(DWORD)(lpbiInput),(DWORD)(lpbiOutput)) +#define ICDecompressGetFormat(hic,lpbiInput,lpbiOutput) (LONG)ICSendMessage(hic,ICM_DECOMPRESS_GET_FORMAT,(DWORD)(lpbiInput),(DWORD)(lpbiOutput)) +#define ICDecompressGetFormatSize(hic,lpbi) ICDecompressGetFormat(hic, lpbi, NULL) +#define ICDecompressGetPalette(hic,lpbiInput,lpbiOutput) ICSendMessage(hic,ICM_DECOMPRESS_GET_PALETTE,(DWORD)(lpbiInput),(DWORD)(lpbiOutput)) +#define ICDecompressSetPalette(hic,lpbiPalette) ICSendMessage(hic,ICM_DECOMPRESS_SET_PALETTE,(DWORD)(lpbiPalette),0) +#define ICDecompressEnd(hic) ICSendMessage(hic,ICM_DECOMPRESS_END,0,0) +#define ICDecompressExEnd(hic) ICSendMessage(hic,ICM_DECOMPRESSEX_END,0,0) +#define ICDecompressOpen(fccType,fccHandler,lpbiIn,lpbiOut) ICLocate(fccType,fccHandler,lpbiIn,lpbiOut,ICMODE_DECOMPRESS) +#define ICDrawOpen(fccType,fccHandler,lpbiIn) ICLocate(fccType,fccHandler,lpbiIn,NULL,ICMODE_DRAW) +#define ICGetState(hic,pv,cb) ICSendMessage(hic,ICM_GETSTATE,(DWORD)(pv),(DWORD)(cb)) +#define ICSetState(hic,pv,cb) ICSendMessage(hic,ICM_SETSTATE,(DWORD)(pv),(DWORD)(cb)) +#define ICGetStateSize(hic) ICGetState(hic,NULL,0) +#define ICDrawWindow(hic,prc) ICSendMessage(hic,ICM_DRAW_WINDOW,(DWORD)(prc),sizeof(RECT)) +#define ICDrawQuery(hic,lpbiInput) ICSendMessage(hic,ICM_DRAW_QUERY,(DWORD)(lpbiInput),0) +#define ICDrawChangePalette(hic,lpbiInput) ICSendMessage(hic,ICM_DRAW_CHANGEPALETTE,(DWORD)(lpbiInput),0) +#define ICGetBuffersWanted(hic,lpdwBuffers) ICSendMessage(hic,ICM_GETBUFFERSWANTED,(DWORD)(lpdwBuffers),0) +#define ICDrawEnd(hic) ICSendMessage(hic,ICM_DRAW_END,0,0) +#define ICDrawStart(hic) ICSendMessage(hic,ICM_DRAW_START,0,0) +#define ICDrawStartPlay(hic,lFrom,lTo) ICSendMessage(hic,ICM_DRAW_START_PLAY,(DWORD)(lFrom),(DWORD)(lTo)) +#define ICDrawStop(hic) ICSendMessage(hic,ICM_DRAW_STOP,0,0) +#define ICDrawStopPlay(hic) ICSendMessage(hic,ICM_DRAW_STOP_PLAY,0,0) +#define ICDrawGetTime(hic,lplTime) ICSendMessage(hic,ICM_DRAW_GETTIME,(DWORD)(lplTime),0) +#define ICDrawSetTime(hic,lTime) ICSendMessage(hic,ICM_DRAW_SETTIME,(DWORD)lTime,0) +#define ICDrawRealize(hic,hdc,fBackground) ICSendMessage(hic,ICM_DRAW_REALIZE,(DWORD)(hdc),(DWORD)(fBackground)) +#define ICDrawFlush(hic) ICSendMessage(hic,ICM_DRAW_FLUSH,0,0) +#define ICDrawRenderBuffer(hic) ICSendMessage(hic,ICM_DRAW_RENDERBUFFER,0,0) +#define AVIFileClose(pavi) AVIFileRelease(pavi) +#define AVIStreamClose(pavi) AVIStreamRelease(pavi); +#define AVIStreamEnd(pavi) (AVIStreamStart(pavi)+AVIStreamLength(pavi)) +#define AVIStreamEndTime(pavi) AVIStreamSampleToTime(pavi,AVIStreamEnd(pavi)) +#define AVIStreamFormatSize(pavi,lPos,plSize) AVIStreamReadFormat(pavi,lPos,NULL,plSize) +#define AVIStreamLengthTime(pavi) AVIStreamSampleToTime(pavi,AVIStreamLength(pavi)) +#define AVIStreamSampleSize(pavi,pos,psize) AVIStreamRead(pavi,pos,1,NULL,0,psize,NULL) +#define AVIStreamSampleToSample(pavi1,pavi2,samp2) AVIStreamTimeToSample(pavi1,AVIStreamSampleToTime(pavi2,samp2)) +#define AVIStreamStartTime(pavi) AVIStreamSampleToTime(pavi,AVIStreamStart(pavi)) +#define AVIStreamNextSample(pavi,pos) AVIStreamFindSample(pavi,pos+1,FIND_NEXT|FIND_ANY) +#define AVIStreamPrevSample(pavi,pos) AVIStreamFindSample(pavi,pos-1,FIND_PREV|FIND_ANY) +#define AVIStreamNearestSample(pavi, pos) AVIStreamFindSample(pavi,pos,FIND_PREV|FIND_ANY) +#define AVStreamNextKeyFrame(pavi,pos) AVIStreamFindSample(pavi,pos+1,FIND_NEXT|FIND_KEY) +#define AVStreamPrevKeyFrame(pavi,pos) AVIStreamFindSample(pavi,pos-1,FIND_NEXT|FIND_KEY) +#define AVIStreamNearestKeyFrame(pavi,pos) AVIStreamFindSample(pavi,pos,FIND_PREV|FIND_KEY) +#define AVIStreamIsKeyFrame(pavi, pos) (AVIStreamNearestKeyFrame(pavi,pos) == pos) +#ifdef __cplusplus +#define MCIWndSM ::SendMessage +#else +#define MCIWndSM SendMessage +#endif +#define MCIWndCanPlay(hWnd) (BOOL)MCIWndSM(hWnd,MCIWNDM_CAN_PLAY,0,0) +#define MCIWndCanRecord(hWnd) (BOOL)MCIWndSM(hWnd,MCIWNDM_CAN_RECORD,0,0) +#define MCIWndCanSave(hWnd) (BOOL)MCIWndSM(hWnd,MCIWNDM_CAN_SAVE,0,0) +#define MCIWndCanWindow(hWnd) (BOOL)MCIWndSM(hWnd,MCIWNDM_CAN_WINDOW,0,0) +#define MCIWndCanEject(hWnd) (BOOL)MCIWndSM(hWnd,MCIWNDM_CAN_EJECT,0,0) +#define MCIWndCanConfig(hWnd) (BOOL)MCIWndSM(hWnd,MCIWNDM_CAN_CONFIG,0,0) +#define MCIWndPaletteKick(hWnd) (BOOL)MCIWndSM(hWnd,MCIWNDM_PALETTEKICK,0,0) +#define MCIWndSave(hWnd,szFile) (LONG)MCIWndSM(hWnd,MCI_SAVE,0,(LPARAM)(LPVOID)(szFile)) +#define MCIWndSaveDialog(hWnd) MCIWndSave(hWnd,-1) +#define MCIWndNew(hWnd,lp) (LONG)MCIWndSM(hWnd,MCIWNDM_NEW,0,(LPARAM)(LPVOID)(lp)) +#define MCIWndRecord(hWnd) (LONG)MCIWndSM(hWnd,MCI_RECORD,0,0) +#define MCIWndOpen(hWnd,sz,f) (LONG)MCIWndSM(hWnd,MCIWNDM_OPEN,(WPARAM)(UINT)(f),(LPARAM)(LPVOID)(sz)) +#define MCIWndOpenDialog(hWnd) MCIWndOpen(hWnd,-1,0) +#define MCIWndClose(hWnd) (LONG)MCIWndSM(hWnd,MCI_CLOSE,0,0) +#define MCIWndPlay(hWnd) (LONG)MCIWndSM(hWnd,MCI_PLAY,0,0) +#define MCIWndStop(hWnd) (LONG)MCIWndSM(hWnd,MCI_STOP,0,0) +#define MCIWndPause(hWnd) (LONG)MCIWndSM(hWnd,MCI_PAUSE,0,0) +#define MCIWndResume(hWnd) (LONG)MCIWndSM(hWnd,MCI_RESUME,0,0) +#define MCIWndSeek(hWnd,lPos) (LONG)MCIWndSM(hWnd,MCI_SEEK,0,(LPARAM)(LONG)(lPos)) +#define MCIWndEject(hWnd) (LONG)MCIWndSM(hWnd,MCIWNDM_EJECT,0,0) +#define MCIWndHome(hWnd) MCIWndSeek(hWnd,MCIWND_START) +#define MCIWndEnd(hWnd) MCIWndSeek(hWnd,MCIWND_END) +#define MCIWndGetSource(hWnd,prc) (LONG)MCIWndSM(hWnd,MCIWNDM_GET_SOURCE,0,(LPARAM)(LPRECT)(prc)) +#define MCIWndPutSource(hWnd,prc) (LONG)MCIWndSM(hWnd,MCIWNDM_PUT_SOURCE,0,(LPARAM)(LPRECT)(prc)) +#define MCIWndGetDest(hWnd,prc) (LONG)MCIWndSM(hWnd,MCIWNDM_GET_DEST,0,(LPARAM)(LPRECT)(prc)) +#define MCIWndPutDest(hWnd,prc) (LONG)MCIWndSM(hWnd,MCIWNDM_PUT_DEST,0,(LPARAM)(LPRECT)(prc)) +#define MCIWndPlayReverse(hWnd) (LONG)MCIWndSM(hWnd,MCIWNDM_PLAYREVERSE,0,0) +#define MCIWndPlayFrom(hWnd,lPos) (LONG)MCIWndSM(hWnd,MCIWNDM_PLAYFROM,0,(LPARAM)(LONG)(lPos)) +#define MCIWndPlayTo(hWnd,lPos) (LONG)MCIWndSM(hWnd,MCIWNDM_PLAYTO, 0,(LPARAM)(LONG)(lPos)) +#define MCIWndPlayFromTo(hWnd,lStart,lEnd) (MCIWndSeek(hWnd,lStart),MCIWndPlayTo(hWnd,lEnd)) +#define MCIWndGetDeviceID(hWnd) (UINT)MCIWndSM(hWnd,MCIWNDM_GETDEVICEID,0,0) +#define MCIWndGetAlias(hWnd) (UINT)MCIWndSM(hWnd,MCIWNDM_GETALIAS,0,0) +#define MCIWndGetMode(hWnd,lp,len) (LONG)MCIWndSM(hWnd,MCIWNDM_GETMODE,(WPARAM)(UINT)(len),(LPARAM)(LPTSTR)(lp)) +#define MCIWndGetPosition(hWnd) (LONG)MCIWndSM(hWnd,MCIWNDM_GETPOSITION,0,0) +#define MCIWndGetPositionString(hWnd,lp,len) (LONG)MCIWndSM(hWnd,MCIWNDM_GETPOSITION,(WPARAM)(UINT)(len),(LPARAM)(LPTSTR)(lp)) +#define MCIWndGetStart(hWnd) (LONG)MCIWndSM(hWnd,MCIWNDM_GETSTART,0,0) +#define MCIWndGetLength(hWnd) (LONG)MCIWndSM(hWnd,MCIWNDM_GETLENGTH,0,0) +#define MCIWndGetEnd(hWnd) (LONG)MCIWndSM(hWnd,MCIWNDM_GETEND,0,0) +#define MCIWndStep(hWnd,n) (LONG)MCIWndSM(hWnd,MCI_STEP,0,(LPARAM)(long)(n)) +#define MCIWndDestroy(hWnd) (VOID)MCIWndSM(hWnd,WM_CLOSE,0,0) +#define MCIWndSetZoom(hWnd,iZoom) (VOID)MCIWndSM(hWnd,MCIWNDM_SETZOOM,0,(LPARAM)(UINT)(iZoom)) +#define MCIWndGetZoom(hWnd) (UINT)MCIWndSM(hWnd,MCIWNDM_GETZOOM,0,0) +#define MCIWndSetVolume(hWnd,iVol) (LONG)MCIWndSM(hWnd,MCIWNDM_SETVOLUME,0,(LPARAM)(UINT)(iVol)) +#define MCIWndGetVolume(hWnd) (LONG)MCIWndSM(hWnd,MCIWNDM_GETVOLUME,0,0) +#define MCIWndSetSpeed(hWnd,iSpeed) (LONG)MCIWndSM(hWnd,MCIWNDM_SETSPEED,0,(LPARAM)(UINT)(iSpeed)) +#define MCIWndGetSpeed(hWnd) (LONG)MCIWndSM(hWnd,MCIWNDM_GETSPEED,0,0) +#define MCIWndSetTimeFormat(hWnd,lp) (LONG)MCIWndSM(hWnd,MCIWNDM_SETTIMEFORMAT,0,(LPARAM)(LPTSTR)(lp)) +#define MCIWndGetTimeFormat(hWnd,lp,len) (LONG)MCIWndSM(hWnd,MCIWNDM_GETTIMEFORMAT,(WPARAM)(UINT)(len),(LPARAM)(LPTSTR)(lp)) +#define MCIWndValidateMedia(hWnd) (VOID)MCIWndSM(hWnd,MCIWNDM_VALIDATEMEDIA,0,0) +#define MCIWndSetRepeat(hWnd,f) (void)MCIWndSM(hWnd,MCIWNDM_SETREPEAT,0,(LPARAM)(BOOL)(f)) +#define MCIWndGetRepeat(hWnd) (BOOL)MCIWndSM(hWnd,MCIWNDM_GETREPEAT,0,0) +#define MCIWndUseFrames(hWnd) MCIWndSetTimeFormat(hWnd,TEXT("frames")) +#define MCIWndUseTime(hWnd) MCIWndSetTimeFormat(hWnd,TEXT("ms")) +#define MCIWndSetActiveTimer(hWnd,active) (VOID)MCIWndSM(hWnd,MCIWNDM_SETACTIVETIMER,(WPARAM)(UINT)(active),0L) +#define MCIWndSetInactiveTimer(hWnd,inactive) (VOID)MCIWndSM(hWnd,MCIWNDM_SETINACTIVETIMER,(WPARAM)(UINT)(inactive),0L) +#define MCIWndSetTimers(hWnd,active,inactive) (VOID)MCIWndSM(hWnd,MCIWNDM_SETTIMERS,(WPARAM)(UINT)(active),(LPARAM)(UINT)(inactive)) +#define MCIWndGetActiveTimer(hWnd) (UINT)MCIWndSM(hWnd,MCIWNDM_GETACTIVETIMER,0,0L); +#define MCIWndGetInactiveTimer(hWnd) (UINT)MCIWndSM(hWnd,MCIWNDM_GETINACTIVETIMER,0,0L); +#define MCIWndRealize(hWnd,fBkgnd) (LONG)MCIWndSM(hWnd,MCIWNDM_REALIZE,(WPARAM)(BOOL)(fBkgnd),0) +#define MCIWndSendString(hWnd,sz) (LONG)MCIWndSM(hWnd,MCIWNDM_SENDSTRING,0,(LPARAM)(LPTSTR)(sz)) +#define MCIWndReturnString(hWnd,lp,len) (LONG)MCIWndSM(hWnd,MCIWNDM_RETURNSTRING,(WPARAM)(UINT)(len),(LPARAM)(LPVOID)(lp)) +#define MCIWndGetError(hWnd,lp,len) (LONG)MCIWndSM(hWnd,MCIWNDM_GETERROR,(WPARAM)(UINT)(len),(LPARAM)(LPVOID)(lp)) +#define MCIWndGetPalette(hWnd) (HPALETTE)MCIWndSM(hWnd,MCIWNDM_GETPALETTE,0,0) +#define MCIWndSetPalette(hWnd,hpal) (LONG)MCIWndSM(hWnd,MCIWNDM_SETPALETTE,(WPARAM)(HPALETTE)(hpal),0) +#define MCIWndGetFileName(hWnd,lp,len) (LONG)MCIWndSM(hWnd,MCIWNDM_GETFILENAME,(WPARAM)(UINT)(len),(LPARAM)(LPVOID)(lp)) +#define MCIWndGetDevice(hWnd,lp,len) (LONG)MCIWndSM(hWnd,MCIWNDM_GETDEVICE,(WPARAM)(UINT)(len),(LPARAM)(LPVOID)(lp)) +#define MCIWndGetStyles(hWnd) (UINT)MCIWndSM(hWnd,MCIWNDM_GETSTYLES,0,0L) +#define MCIWndChangeStyles(hWnd,mask,value) (LONG)MCIWndSM(hWnd,MCIWNDM_CHANGESTYLES,(WPARAM)(UINT)(mask),(LPARAM)(LONG)(value)) +#define MCIWndOpenInterface(hWnd,pUnk) (LONG)MCIWndSM(hWnd,MCIWNDM_OPENINTERFACE,0,(LPARAM)(LPUNKNOWN)(pUnk)) +#define MCIWndSetOwner(hWnd,hWndP) (LONG)MCIWndSM(hWnd,MCIWNDM_SETOWNER,(WPARAM)(hWndP),0) +#define DrawDibUpdate(hdd,hdc,x,y) DrawDibDraw(hdd,hdc,x,y,0,0,NULL,NULL,0,0,0,0,DDF_UPDATE) +static __inline DWORD +ICGetDefaultQuality(HIC hic) +{ + DWORD dwICValue; + ICSendMessage(hic, ICM_GETDEFAULTQUALITY, (DWORD)(LPVOID)&dwICValue, sizeof(DWORD)); + return dwICValue; +} +static __inline DWORD +ICGetDefaultKeyFrameRate(HIC hic) +{ + DWORD dwICValue; + ICSendMessage(hic, ICM_GETDEFAULTKEYFRAMERATE, (DWORD)(LPVOID)&dwICValue, sizeof(DWORD)); + return dwICValue; +} +static __inline LRESULT +ICDrawSuggestFormat(HIC hic,LPBITMAPINFOHEADER lpbiIn,LPBITMAPINFOHEADER lpbiOut,INT dxSrc,INT dySrc,INT dxDst,INT dyDst,HIC hicDecomp) +{ + ICDRAWSUGGEST ic; + ic.lpbiIn = lpbiIn; + ic.lpbiSuggest = lpbiOut; + ic.dxSrc = dxSrc; + ic.dySrc = dySrc; + ic.dxDst = dxDst; + ic.dyDst = dyDst; + ic.hicDecompressor = hicDecomp; + return ICSendMessage(hic,ICM_DRAW_SUGGESTFORMAT,(DWORD)&ic,sizeof(ic)); +} +static __inline LRESULT +ICSetStatusProc(HIC hic,DWORD dwFlags,LRESULT lParam,LONG (CALLBACK *fpfnStatus)(LPARAM,UINT,LONG)) +{ + ICSETSTATUSPROC ic; + ic.dwFlags = dwFlags; + ic.lParam = lParam; + ic.Status = fpfnStatus; + return ICSendMessage(hic,ICM_SET_STATUS_PROC,(DWORD)&ic,sizeof(ic)); +} +static __inline LRESULT +ICDecompressEx(HIC hic,DWORD dwFlags,LPBITMAPINFOHEADER lpbiSrc,LPVOID lpSrc,INT xSrc,INT ySrc,INT dxSrc,INT dySrc,LPBITMAPINFOHEADER lpbiDst,LPVOID lpDst,INT xDst,INT yDst,INT dxDst,INT dyDst) +{ + ICDECOMPRESSEX ic; + ic.dwFlags = dwFlags; + ic.lpbiSrc = lpbiSrc; + ic.lpSrc = lpSrc; + ic.xSrc = xSrc; + ic.ySrc = ySrc; + ic.dxSrc = dxSrc; + ic.dySrc = dySrc; + ic.lpbiDst = lpbiDst; + ic.lpDst = lpDst; + ic.xDst = xDst; + ic.yDst = yDst; + ic.dxDst = dxDst; + ic.dyDst = dyDst; + return ICSendMessage(hic,ICM_DECOMPRESSEX,(DWORD)&ic,sizeof(ic)); +} +static __inline LRESULT +ICDecompressExBegin(HIC hic,DWORD dwFlags,LPBITMAPINFOHEADER lpbiSrc,LPVOID lpSrc,INT xSrc,INT ySrc,INT dxSrc,INT dySrc,LPBITMAPINFOHEADER lpbiDst,LPVOID lpDst,INT xDst,INT yDst,INT dxDst,INT dyDst) +{ + ICDECOMPRESSEX ic; + ic.dwFlags = dwFlags; + ic.lpbiSrc = lpbiSrc; + ic.lpSrc = lpSrc; + ic.xSrc = xSrc; + ic.ySrc = ySrc; + ic.dxSrc = dxSrc; + ic.dySrc = dySrc; + ic.lpbiDst = lpbiDst; + ic.lpDst = lpDst; + ic.xDst = xDst; + ic.yDst = yDst; + ic.dxDst = dxDst; + ic.dyDst = dyDst; + return ICSendMessage(hic,ICM_DECOMPRESSEX_BEGIN,(DWORD)&ic,sizeof(ic)); +} +static __inline LRESULT +ICDecompressExQuery(HIC hic,DWORD dwFlags,LPBITMAPINFOHEADER lpbiSrc,LPVOID lpSrc,INT xSrc,INT ySrc,INT dxSrc,INT dySrc,LPBITMAPINFOHEADER lpbiDst,LPVOID lpDst,INT xDst,INT yDst,INT dxDst,INT dyDst) +{ + ICDECOMPRESSEX ic; + ic.dwFlags = dwFlags; + ic.lpbiSrc = lpbiSrc; + ic.lpSrc = lpSrc; + ic.xSrc = xSrc; + ic.ySrc = ySrc; + ic.dxSrc = dxSrc; + ic.dySrc = dySrc; + ic.lpbiDst = lpbiDst; + ic.lpDst = lpDst; + ic.xDst = xDst; + ic.yDst = yDst; + ic.dxDst = dxDst; + ic.dyDst = dyDst; + return ICSendMessage(hic,ICM_DECOMPRESSEX_QUERY,(DWORD)&ic,sizeof(ic)); +} + +#ifdef UNICODE +#define AVISTREAMINFO AVISTREAMINFOW +#define LPAVISTREAMINFO LPAVISTREAMINFOW +#define PAVISTREAMINFO PAVISTREAMINFOW +#define AVIFILEINFO AVIFILEINFOW +#define PAVIFILEINFO PAVIFILEINFOW +#define LPAVIFILEINFO LPAVIFILEINFOW +#define AVIStreamInfo AVIStreamInfoW +#define AVIStreamOpenFromFile AVIStreamOpenFromFileW +#define AVIBuildFilter AVIBuildFilterW +#define AVISaveV AVISaveVW +#define EditStreamSetInfo EditStreamSetInfoW +#define EditStreamSetName EditStreamSetNameW +#define AVIFileOpen AVIFileOpenW +#define AVIFileInfo AVIFileInfoW +#define AVIFileCreateStream AVIFileCreateStreamW +#define GetOpenFileNamePreview GetOpenFileNamePreviewW +#define GetSaveFileNamePreview GetSaveFileNamePreviewW +#define MCIWndCreate MCIWndCreateW +#define MCIWNDF_NOTIFYMEDIA MCIWNDF_NOTIFYMEDIAW +#define MCIWNDM_SENDSTRING MCIWNDM_SENDSTRINGW +#define MCIWNDM_GETPOSITION MCIWNDM_GETPOSITIONW +#define MCIWNDM_GETMODE MCIWNDM_GETMODEW +#define MCIWNDM_SETTIMEFORMAT MCIWNDM_SETTIMEFORMATW +#define MCIWNDM_GETTIMEFORMAT MCIWNDM_GETTIMEFORMATW +#define MCIWNDM_GETFILENAME MCIWNDM_GETFILENAMEW +#define MCIWNDM_GETDEVICE MCIWNDM_GETDEVICEW +#define MCIWNDM_GETERROR MCIWNDM_GETERRORW +#define MCIWNDM_NEW MCIWNDM_NEWW +#define MCIWNDM_RETURNSTRING MCIWNDM_RETURNSTRINGW +#define MCIWNDM_OPEN MCIWNDM_OPENW +#else +#define AVISTREAMINFO AVISTREAMINFOA +#define LPAVISTREAMINFO LPAVISTREAMINFOA +#define PAVISTREAMINFO PAVISTREAMINFOA +#define AVIFILEINFO AVIFILEINFOA +#define PAVIFILEINFO PAVIFILEINFOA +#define LPAVIFILEINFO LPAVIFILEINFOA +#define AVIStreamInfo AVIStreamInfoA +#define AVIStreamOpenFromFile AVIStreamOpenFromFileA +#define AVIBuildFilter AVIBuildFilterA +#define AVISaveV AVISaveVA +#define EditStreamSetInfo EditStreamSetInfoA +#define EditStreamSetName EditStreamSetNameA +#define AVIFileOpen AVIFileOpenA +#define AVIFileInfo AVIFileInfoA +#define AVIFileCreateStream AVIFileCreateStreamA +#define GetOpenFileNamePreview GetOpenFileNamePreviewA +#define GetSaveFileNamePreview GetSaveFileNamePreviewA +#define MCIWndCreate MCIWndCreateA +#define MCIWNDF_NOTIFYMEDIA MCIWNDF_NOTIFYMEDIAA +#define MCIWNDM_SENDSTRING MCIWNDM_SENDSTRINGA +#define MCIWNDM_GETPOSITION MCIWNDM_GETPOSITIONA +#define MCIWNDM_GETMODE MCIWNDM_GETMODEA +#define MCIWNDM_SETTIMEFORMAT MCIWNDM_SETTIMEFORMATA +#define MCIWNDM_GETTIMEFORMAT MCIWNDM_GETTIMEFORMATA +#define MCIWNDM_GETFILENAME MCIWNDM_GETFILENAMEA +#define MCIWNDM_GETDEVICE MCIWNDM_GETDEVICEA +#define MCIWNDM_GETERROR MCIWNDM_GETERRORA +#define MCIWNDM_NEW MCIWNDM_NEWA +#define MCIWNDM_RETURNSTRING MCIWNDM_RETURNSTRINGA +#define MCIWNDM_OPEN MCIWNDM_OPENA +#endif + +#endif /* RC_INVOKED */ + +#ifdef __cplusplus +} +#endif +#include <poppack.h> +#endif /* _VFW_H */ diff --git a/reactos/w32api/include/w32api.h b/reactos/w32api/include/w32api.h new file mode 100644 index 00000000000..3e0224164c2 --- /dev/null +++ b/reactos/w32api/include/w32api.h @@ -0,0 +1,11 @@ +#ifndef _W32API_H_ +#define _W32API_H_ +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#define __W32API_VERSION 2.5 +#define __W32API_MAJOR_VERSION 2 +#define __W32API_MINOR_VERSION 5 + +#endif /* ndef _W32API_H_ */ diff --git a/reactos/w32api/include/winable.h b/reactos/w32api/include/winable.h new file mode 100644 index 00000000000..0228293531d --- /dev/null +++ b/reactos/w32api/include/winable.h @@ -0,0 +1,99 @@ +#ifndef _WINABLE_H +#define _WINABLE_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if (_WIN32_WINNT < 0x0403) +#define INPUT_MOUSE 0x00000000 +#define INPUT_KEYBOARD 0x00000001 +#define INPUT_HARDWARE 0x00000002 +#endif /* (_WIN32_WINNT < 0x04030) */ +#if (WINVER < 0x0500) +#define CHILDID_SELF 0 +#define OBJID_WINDOW 0x00000000 +#define OBJID_SYSMENU 0xFFFFFFFF +#define OBJID_TITLEBAR 0xFFFFFFFE +#define OBJID_MENU 0xFFFFFFFD +#define OBJID_CLIENT 0xFFFFFFFC +#define OBJID_VSCROLL 0xFFFFFFFB +#define OBJID_HSCROLL 0xFFFFFFFA +#define OBJID_SIZEGRIP 0xFFFFFFF9 +#define OBJID_CARET 0xFFFFFFF8 +#define OBJID_CURSOR 0xFFFFFFF7 +#define OBJID_ALERT 0xFFFFFFF6 +#define OBJID_SOUND 0xFFFFFFF5 +#define GUI_CARETBLINKING 0x00000001 +#define GUI_INMOVESIZE 0x00000002 +#define GUI_INMENUMODE 0x00000004 +#define GUI_SYSTEMMENUMODE 0x00000008 +#define GUI_POPUPMENUMODE 0x00000010 +#define WINEVENT_OUTOFCONTEXT 0x0000 +#define WINEVENT_SKIPOWNTHREAD 0x0001 +#define WINEVENT_SKIPOWNPROCESS 0x0002 +#define WINEVENT_INCONTEXT 0x0004 +#endif /* (WINVER < 0x0500) */ +#if (_WIN32_WINNT < 0x0403) +typedef struct tagMOUSEINPUT { + LONG dx; + LONG dy; + DWORD mouseData; + DWORD dwFlags; + DWORD time; + ULONG_PTR dwExtraInfo; +} MOUSEINPUT,*PMOUSEINPUT; +typedef struct tagKEYBDINPUT { + WORD wVk; + WORD wScan; + DWORD dwFlags; + DWORD time; + ULONG_PTR dwExtraInfo; +} KEYBDINPUT,*PKEYBDINPUT; +typedef struct tagHARDWAREINPUT { + DWORD uMsg; + WORD wParamL; + WORD wParamH; +} HARDWAREINPUT,*PHARDWAREINPUT; +typedef struct tagINPUT { + DWORD type; + _ANONYMOUS_UNION union { + MOUSEINPUT mi; + KEYBDINPUT ki; + HARDWAREINPUT hi; + } DUMMYUNIONNAME; +} INPUT,*PINPUT,*LPINPUT; +#endif /* (_WIN32_WINNT < 0x0403) */ +#if (WINVER < 0x0500) +typedef VOID (*WINEVENTPROC)(HWINEVENTHOOK,DWORD,HWND,LONG,LONG,DWORD,DWORD); +typedef struct tagGUITHREADINFO { + DWORD cbSize; + DWORD flags; + HWND hwndActive; + HWND hwndFocus; + HWND hwndCapture; + HWND hwndMenuOwner; + HWND hwndMoveSize; + HWND hwndCaret; + RECT rcCaret; +} GUITHREADINFO,*PGUITHREADINFO,*LPGUITHREADINFO; +#endif /* (WINVER < 0x0500) */ + +BOOL WINAPI BlockInput(BOOL); +#if (_WIN32_WINNT < 0x0403) +UINT WINAPI SendInput(UINT,LPINPUT,int); +#endif +#if (WINVER < 0x0500) +BOOL WINAPI GetGUIThreadInfo(DWORD,LPGUITHREADINFO); +void WINAPI NotifyWinEvent(DWORD,HWND,LONG,LONG); +HWINEVENTHOOK WINAPI SetWinEventHook(UINT,UINT,HMODULE,WINEVENTPROC,DWORD,DWORD,UINT); +BOOL WINAPI UnhookWinEvent(HWINEVENTHOOK); +#endif /* (WINVER < 0x0500) */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/winbase.h b/reactos/w32api/include/winbase.h new file mode 100644 index 00000000000..c953afa9f2a --- /dev/null +++ b/reactos/w32api/include/winbase.h @@ -0,0 +1,2317 @@ +#ifndef _WINBASE_H +#define _WINBASE_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifndef WINBASEAPI +#define WINBASEAPI DECLSPEC_IMPORT +#endif +#ifdef __cplusplus +extern "C" { +#endif + +#define SP_SERIALCOMM 1 +#define PST_UNSPECIFIED 0 +#define PST_RS232 1 +#define PST_PARALLELPORT 2 +#define PST_RS422 3 +#define PST_RS423 4 +#define PST_RS449 5 +#define PST_MODEM 6 +#define PST_FAX 0x21 +#define PST_SCANNER 0x22 +#define PST_NETWORK_BRIDGE 0x100 +#define PST_LAT 0x101 +#define PST_TCPIP_TELNET 0x102 +#define PST_X25 0x103 +#define BAUD_075 1 +#define BAUD_110 2 +#define BAUD_134_5 4 +#define BAUD_150 8 +#define BAUD_300 16 +#define BAUD_600 32 +#define BAUD_1200 64 +#define BAUD_1800 128 +#define BAUD_2400 256 +#define BAUD_4800 512 +#define BAUD_7200 1024 +#define BAUD_9600 2048 +#define BAUD_14400 4096 +#define BAUD_19200 8192 +#define BAUD_38400 16384 +#define BAUD_56K 32768 +#define BAUD_128K 65536 +#define BAUD_115200 131072 +#define BAUD_57600 262144 +#define BAUD_USER 0x10000000 +#define PCF_DTRDSR 1 +#define PCF_RTSCTS 2 +#define PCF_RLSD 4 +#define PCF_PARITY_CHECK 8 +#define PCF_XONXOFF 16 +#define PCF_SETXCHAR 32 +#define PCF_TOTALTIMEOUTS 64 +#define PCF_INTTIMEOUTS 128 +#define PCF_SPECIALCHARS 256 +#define PCF_16BITMODE 512 +#define SP_PARITY 1 +#define SP_BAUD 2 +#define SP_DATABITS 4 +#define SP_STOPBITS 8 +#define SP_HANDSHAKING 16 +#define SP_PARITY_CHECK 32 +#define SP_RLSD 64 +#define DATABITS_5 1 +#define DATABITS_6 2 +#define DATABITS_7 4 +#define DATABITS_8 8 +#define DATABITS_16 16 +#define DATABITS_16X 32 +#define STOPBITS_10 1 +#define STOPBITS_15 2 +#define STOPBITS_20 4 +#define PARITY_NONE 256 +#define PARITY_ODD 512 +#define PARITY_EVEN 1024 +#define PARITY_MARK 2048 +#define PARITY_SPACE 4096 +#define EXCEPTION_DEBUG_EVENT 1 +#define CREATE_THREAD_DEBUG_EVENT 2 +#define CREATE_PROCESS_DEBUG_EVENT 3 +#define EXIT_THREAD_DEBUG_EVENT 4 +#define EXIT_PROCESS_DEBUG_EVENT 5 +#define LOAD_DLL_DEBUG_EVENT 6 +#define UNLOAD_DLL_DEBUG_EVENT 7 +#define OUTPUT_DEBUG_STRING_EVENT 8 +#define RIP_EVENT 9 +#define HFILE_ERROR ((HFILE)-1) +#define FILE_BEGIN 0 +#define FILE_CURRENT 1 +#define FILE_END 2 +#define INVALID_SET_FILE_POINTER ((DWORD)-1) +#define OF_READ 0 +#define OF_READWRITE 2 +#define OF_WRITE 1 +#define OF_SHARE_COMPAT 0 +#define OF_SHARE_DENY_NONE 64 +#define OF_SHARE_DENY_READ 48 +#define OF_SHARE_DENY_WRITE 32 +#define OF_SHARE_EXCLUSIVE 16 +#define OF_CANCEL 2048 +#define OF_CREATE 4096 +#define OF_DELETE 512 +#define OF_EXIST 16384 +#define OF_PARSE 256 +#define OF_PROMPT 8192 +#define OF_REOPEN 32768 +#define OF_VERIFY 1024 +#define NMPWAIT_NOWAIT 1 +#define NMPWAIT_WAIT_FOREVER ((DWORD)-1) +#define NMPWAIT_USE_DEFAULT_WAIT 0 +#define CE_BREAK 16 +#define CE_DNS 2048 +#define CE_FRAME 8 +#define CE_IOE 1024 +#define CE_MODE 32768 +#define CE_OOP 4096 +#define CE_OVERRUN 2 +#define CE_PTO 512 +#define CE_RXOVER 1 +#define CE_RXPARITY 4 +#define CE_TXFULL 256 +#define PROGRESS_CONTINUE 0 +#define PROGRESS_CANCEL 1 +#define PROGRESS_STOP 2 +#define PROGRESS_QUIET 3 +#define CALLBACK_CHUNK_FINISHED 0 +#define CALLBACK_STREAM_SWITCH 1 +#define COPY_FILE_FAIL_IF_EXISTS 1 +#define COPY_FILE_RESTARTABLE 2 +#define OFS_MAXPATHNAME 128 +#define FILE_MAP_ALL_ACCESS 0xf001f +#define FILE_MAP_READ 4 +#define FILE_MAP_WRITE 2 +#define FILE_MAP_COPY 1 +#define MUTEX_ALL_ACCESS 0x1f0001 +#define MUTEX_MODIFY_STATE 1 +#define SEMAPHORE_ALL_ACCESS 0x1f0003 +#define SEMAPHORE_MODIFY_STATE 2 +#define EVENT_ALL_ACCESS 0x1f0003 +#define EVENT_MODIFY_STATE 2 +#define PIPE_ACCESS_DUPLEX 3 +#define PIPE_ACCESS_INBOUND 1 +#define PIPE_ACCESS_OUTBOUND 2 +#define PIPE_TYPE_BYTE 0 +#define PIPE_TYPE_MESSAGE 4 +#define PIPE_READMODE_BYTE 0 +#define PIPE_READMODE_MESSAGE 2 +#define PIPE_WAIT 0 +#define PIPE_NOWAIT 1 +#define PIPE_CLIENT_END 0 +#define PIPE_SERVER_END 1 +#define PIPE_UNLIMITED_INSTANCES 255 +#define DEBUG_PROCESS 0x00000001 +#define DEBUG_ONLY_THIS_PROCESS 0x00000002 +#define CREATE_SUSPENDED 0x00000004 +#define DETACHED_PROCESS 0x00000008 +#define CREATE_NEW_CONSOLE 0x00000010 +#define NORMAL_PRIORITY_CLASS 0x00000020 +#define IDLE_PRIORITY_CLASS 0x00000040 +#define HIGH_PRIORITY_CLASS 0x00000080 +#define REALTIME_PRIORITY_CLASS 0x00000100 +#define CREATE_NEW_PROCESS_GROUP 0x00000200 +#define CREATE_UNICODE_ENVIRONMENT 0x00000400 +#define CREATE_SEPARATE_WOW_VDM 0x00000800 +#define CREATE_SHARED_WOW_VDM 0x00001000 +#define CREATE_FORCEDOS 0x00002000 +#define BELOW_NORMAL_PRIORITY_CLASS 0x00004000 +#define ABOVE_NORMAL_PRIORITY_CLASS 0x00008000 +#define CREATE_BREAKAWAY_FROM_JOB 0x01000000 +#define CREATE_WITH_USERPROFILE 0x02000000 +#define CREATE_DEFAULT_ERROR_MODE 0x04000000 +#define CREATE_NO_WINDOW 0x08000000 +#define PROFILE_USER 0x10000000 +#define PROFILE_KERNEL 0x20000000 +#define PROFILE_SERVER 0x40000000 +#define CONSOLE_TEXTMODE_BUFFER 1 +#define CREATE_NEW 1 +#define CREATE_ALWAYS 2 +#define OPEN_EXISTING 3 +#define OPEN_ALWAYS 4 +#define TRUNCATE_EXISTING 5 +#define FILE_FLAG_WRITE_THROUGH 0x80000000 +#define FILE_FLAG_OVERLAPPED 1073741824 +#define FILE_FLAG_NO_BUFFERING 536870912 +#define FILE_FLAG_RANDOM_ACCESS 268435456 +#define FILE_FLAG_SEQUENTIAL_SCAN 134217728 +#define FILE_FLAG_DELETE_ON_CLOSE 67108864 +#define FILE_FLAG_BACKUP_SEMANTICS 33554432 +#define FILE_FLAG_POSIX_SEMANTICS 16777216 +#define FILE_FLAG_OPEN_REPARSE_POINT 2097152 +#define FILE_FLAG_OPEN_NO_RECALL 1048576 +#if (_WIN32_WINNT >= 0x0500) +#define FILE_FLAG_FIRST_PIPE_INSTANCE 524288 +#endif +#define CLRDTR 6 +#define CLRRTS 4 +#define SETDTR 5 +#define SETRTS 3 +#define SETXOFF 1 +#define SETXON 2 +#define SETBREAK 8 +#define CLRBREAK 9 +#define STILL_ACTIVE 0x103 +#define FIND_FIRST_EX_CASE_SENSITIVE 1 +#define SCS_32BIT_BINARY 0 +#define SCS_DOS_BINARY 1 +#define SCS_OS216_BINARY 5 +#define SCS_PIF_BINARY 3 +#define SCS_POSIX_BINARY 4 +#define SCS_WOW_BINARY 2 +#define MAX_COMPUTERNAME_LENGTH 15 +#define HW_PROFILE_GUIDLEN 39 +#define MAX_PROFILE_LEN 80 +#define DOCKINFO_UNDOCKED 1 +#define DOCKINFO_DOCKED 2 +#define DOCKINFO_USER_SUPPLIED 4 +#define DOCKINFO_USER_UNDOCKED (DOCKINFO_USER_SUPPLIED|DOCKINFO_UNDOCKED) +#define DOCKINFO_USER_DOCKED (DOCKINFO_USER_SUPPLIED|DOCKINFO_DOCKED) +#define DRIVE_REMOVABLE 2 +#define DRIVE_FIXED 3 +#define DRIVE_REMOTE 4 +#define DRIVE_CDROM 5 +#define DRIVE_RAMDISK 6 +#define DRIVE_UNKNOWN 0 +#define DRIVE_NO_ROOT_DIR 1 +#define FILE_TYPE_UNKNOWN 0 +#define FILE_TYPE_DISK 1 +#define FILE_TYPE_CHAR 2 +#define FILE_TYPE_PIPE 3 +#define FILE_TYPE_REMOTE 0x8000 +/* also in ddk/ntapi.h */ +#define HANDLE_FLAG_INHERIT 0x01 +#define HANDLE_FLAG_PROTECT_FROM_CLOSE 0x02 +/* end ntapi.h */ +#define STD_INPUT_HANDLE (DWORD)(0xfffffff6) +#define STD_OUTPUT_HANDLE (DWORD)(0xfffffff5) +#define STD_ERROR_HANDLE (DWORD)(0xfffffff4) +#define INVALID_HANDLE_VALUE (HANDLE)(-1) +#define GET_TAPE_MEDIA_INFORMATION 0 +#define GET_TAPE_DRIVE_INFORMATION 1 +#define SET_TAPE_MEDIA_INFORMATION 0 +#define SET_TAPE_DRIVE_INFORMATION 1 +#define THREAD_PRIORITY_ABOVE_NORMAL 1 +#define THREAD_PRIORITY_BELOW_NORMAL (-1) +#define THREAD_PRIORITY_HIGHEST 2 +#define THREAD_PRIORITY_IDLE (-15) +#define THREAD_PRIORITY_LOWEST (-2) +#define THREAD_PRIORITY_NORMAL 0 +#define THREAD_PRIORITY_TIME_CRITICAL 15 +#define THREAD_PRIORITY_ERROR_RETURN 2147483647 +#define TIME_ZONE_ID_UNKNOWN 0 +#define TIME_ZONE_ID_STANDARD 1 +#define TIME_ZONE_ID_DAYLIGHT 2 +#define TIME_ZONE_ID_INVALID 0xFFFFFFFF +#define FS_CASE_IS_PRESERVED 2 +#define FS_CASE_SENSITIVE 1 +#define FS_UNICODE_STORED_ON_DISK 4 +#define FS_PERSISTENT_ACLS 8 +#define FS_FILE_COMPRESSION 16 +#define FS_VOL_IS_COMPRESSED 32768 +#define GMEM_FIXED 0 +#define GMEM_MOVEABLE 2 +#define GMEM_MODIFY 128 +#define GPTR 64 +#define GHND 66 +#define GMEM_DDESHARE 8192 +#define GMEM_DISCARDABLE 256 +#define GMEM_LOWER 4096 +#define GMEM_NOCOMPACT 16 +#define GMEM_NODISCARD 32 +#define GMEM_NOT_BANKED 4096 +#define GMEM_NOTIFY 16384 +#define GMEM_SHARE 8192 +#define GMEM_ZEROINIT 64 +#define GMEM_DISCARDED 16384 +#define GMEM_INVALID_HANDLE 32768 +#define GMEM_LOCKCOUNT 255 +#define GMEM_VALID_FLAGS 32626 +#define STATUS_WAIT_0 0 +#define STATUS_ABANDONED_WAIT_0 0x80 +#define STATUS_USER_APC 0xC0 +#define STATUS_TIMEOUT 0x102 +#define STATUS_PENDING 0x103 +#define STATUS_SEGMENT_NOTIFICATION 0x40000005 +#define STATUS_GUARD_PAGE_VIOLATION 0x80000001 +#define STATUS_DATATYPE_MISALIGNMENT 0x80000002 +#define STATUS_BREAKPOINT 0x80000003 +#define STATUS_SINGLE_STEP 0x80000004 +#define STATUS_ACCESS_VIOLATION 0xC0000005 +#define STATUS_IN_PAGE_ERROR 0xC0000006 +#define STATUS_INVALID_HANDLE 0xC0000008L +#define STATUS_NO_MEMORY 0xC0000017 +#define STATUS_ILLEGAL_INSTRUCTION 0xC000001D +#define STATUS_NONCONTINUABLE_EXCEPTION 0xC0000025 +#define STATUS_INVALID_DISPOSITION 0xC0000026 +#define STATUS_ARRAY_BOUNDS_EXCEEDED 0xC000008C +#define STATUS_FLOAT_DENORMAL_OPERAND 0xC000008D +#define STATUS_FLOAT_DIVIDE_BY_ZERO 0xC000008E +#define STATUS_FLOAT_INEXACT_RESULT 0xC000008F +#define STATUS_FLOAT_INVALID_OPERATION 0xC0000090 +#define STATUS_FLOAT_OVERFLOW 0xC0000091 +#define STATUS_FLOAT_STACK_CHECK 0xC0000092 +#define STATUS_FLOAT_UNDERFLOW 0xC0000093 +#define STATUS_INTEGER_DIVIDE_BY_ZERO 0xC0000094 +#define STATUS_INTEGER_OVERFLOW 0xC0000095 +#define STATUS_PRIVILEGED_INSTRUCTION 0xC0000096 +#define STATUS_STACK_OVERFLOW 0xC00000FD +#define STATUS_CONTROL_C_EXIT 0xC000013A +#define EXCEPTION_ACCESS_VIOLATION STATUS_ACCESS_VIOLATION +#define EXCEPTION_DATATYPE_MISALIGNMENT STATUS_DATATYPE_MISALIGNMENT +#define EXCEPTION_BREAKPOINT STATUS_BREAKPOINT +#define EXCEPTION_SINGLE_STEP STATUS_SINGLE_STEP +#define EXCEPTION_ARRAY_BOUNDS_EXCEEDED STATUS_ARRAY_BOUNDS_EXCEEDED +#define EXCEPTION_FLT_DENORMAL_OPERAND STATUS_FLOAT_DENORMAL_OPERAND +#define EXCEPTION_FLT_DIVIDE_BY_ZERO STATUS_FLOAT_DIVIDE_BY_ZERO +#define EXCEPTION_FLT_INEXACT_RESULT STATUS_FLOAT_INEXACT_RESULT +#define EXCEPTION_FLT_INVALID_OPERATION STATUS_FLOAT_INVALID_OPERATION +#define EXCEPTION_FLT_OVERFLOW STATUS_FLOAT_OVERFLOW +#define EXCEPTION_FLT_STACK_CHECK STATUS_FLOAT_STACK_CHECK +#define EXCEPTION_FLT_UNDERFLOW STATUS_FLOAT_UNDERFLOW +#define EXCEPTION_INT_DIVIDE_BY_ZERO STATUS_INTEGER_DIVIDE_BY_ZERO +#define EXCEPTION_INT_OVERFLOW STATUS_INTEGER_OVERFLOW +#define EXCEPTION_PRIV_INSTRUCTION STATUS_PRIVILEGED_INSTRUCTION +#define EXCEPTION_IN_PAGE_ERROR STATUS_IN_PAGE_ERROR +#define EXCEPTION_ILLEGAL_INSTRUCTION STATUS_ILLEGAL_INSTRUCTION +#define EXCEPTION_NONCONTINUABLE_EXCEPTION STATUS_NONCONTINUABLE_EXCEPTION +#define EXCEPTION_STACK_OVERFLOW STATUS_STACK_OVERFLOW +#define EXCEPTION_INVALID_DISPOSITION STATUS_INVALID_DISPOSITION +#define EXCEPTION_GUARD_PAGE STATUS_GUARD_PAGE_VIOLATION +#define EXCEPTION_INVALID_HANDLE STATUS_INVALID_HANDLE +#define CONTROL_C_EXIT STATUS_CONTROL_C_EXIT +#define PROCESS_HEAP_REGION 1 +#define PROCESS_HEAP_UNCOMMITTED_RANGE 2 +#define PROCESS_HEAP_ENTRY_BUSY 4 +#define PROCESS_HEAP_ENTRY_MOVEABLE 16 +#define PROCESS_HEAP_ENTRY_DDESHARE 32 +#define DONT_RESOLVE_DLL_REFERENCES 1 +#define LOAD_LIBRARY_AS_DATAFILE 2 +#define LOAD_WITH_ALTERED_SEARCH_PATH 8 +#define LMEM_FIXED 0 +#define LMEM_MOVEABLE 2 +#define LMEM_NONZEROLHND 2 +#define LMEM_NONZEROLPTR 0 +#define LMEM_DISCARDABLE 3840 +#define LMEM_NOCOMPACT 16 +#define LMEM_NODISCARD 32 +#define LMEM_ZEROINIT 64 +#define LMEM_DISCARDED 16384 +#define LMEM_MODIFY 128 +#define LMEM_INVALID_HANDLE 32768 +#define LMEM_LOCKCOUNT 255 +#define LPTR 64 +#define LHND 66 +#define NONZEROLHND 2 +#define NONZEROLPTR 0 +#define LOCKFILE_FAIL_IMMEDIATELY 1 +#define LOCKFILE_EXCLUSIVE_LOCK 2 +#define LOGON32_PROVIDER_DEFAULT 0 +#define LOGON32_PROVIDER_WINNT35 1 +#define LOGON32_LOGON_INTERACTIVE 2 +#define LOGON32_LOGON_BATCH 4 +#define LOGON32_LOGON_SERVICE 5 +#define MOVEFILE_REPLACE_EXISTING 1 +#define MOVEFILE_COPY_ALLOWED 2 +#define MOVEFILE_DELAY_UNTIL_REBOOT 4 +#define MOVEFILE_WRITE_THROUGH 8 +#define MAXIMUM_WAIT_OBJECTS 64 +#define MAXIMUM_SUSPEND_COUNT 0x7F +#define WAIT_OBJECT_0 0 +#define WAIT_ABANDONED_0 128 +#ifndef WAIT_TIMEOUT /* also in winerror.h */ +#define WAIT_TIMEOUT 258 +#endif +#define WAIT_IO_COMPLETION 0xC0 +#define WAIT_ABANDONED 128 +#define WAIT_FAILED ((DWORD)0xFFFFFFFF) +#define PURGE_TXABORT 1 +#define PURGE_RXABORT 2 +#define PURGE_TXCLEAR 4 +#define PURGE_RXCLEAR 8 +#define EVENTLOG_SUCCESS 0 +#define EVENTLOG_FORWARDS_READ 4 +#define EVENTLOG_BACKWARDS_READ 8 +#define EVENTLOG_SEEK_READ 2 +#define EVENTLOG_SEQUENTIAL_READ 1 +#define EVENTLOG_ERROR_TYPE 1 +#define EVENTLOG_WARNING_TYPE 2 +#define EVENTLOG_INFORMATION_TYPE 4 +#define EVENTLOG_AUDIT_SUCCESS 8 +#define EVENTLOG_AUDIT_FAILURE 16 +#define FORMAT_MESSAGE_ALLOCATE_BUFFER 256 +#define FORMAT_MESSAGE_IGNORE_INSERTS 512 +#define FORMAT_MESSAGE_FROM_STRING 1024 +#define FORMAT_MESSAGE_FROM_HMODULE 2048 +#define FORMAT_MESSAGE_FROM_SYSTEM 4096 +#define FORMAT_MESSAGE_ARGUMENT_ARRAY 8192 +#define FORMAT_MESSAGE_MAX_WIDTH_MASK 255 +#define EV_BREAK 64 +#define EV_CTS 8 +#define EV_DSR 16 +#define EV_ERR 128 +#define EV_EVENT1 2048 +#define EV_EVENT2 4096 +#define EV_PERR 512 +#define EV_RING 256 +#define EV_RLSD 32 +#define EV_RX80FULL 1024 +#define EV_RXCHAR 1 +#define EV_RXFLAG 2 +#define EV_TXEMPTY 4 +/* also in ddk/ntapi.h */ +#define SEM_FAILCRITICALERRORS 0x0001 +#define SEM_NOGPFAULTERRORBOX 0x0002 +#define SEM_NOALIGNMENTFAULTEXCEPT 0x0004 +#define SEM_NOOPENFILEERRORBOX 0x8000 +/* end ntapi.h */ +#define SLE_ERROR 1 +#define SLE_MINORERROR 2 +#define SLE_WARNING 3 +#define SHUTDOWN_NORETRY 1 +#define EXCEPTION_EXECUTE_HANDLER 1 +#define EXCEPTION_CONTINUE_EXECUTION (-1) +#define EXCEPTION_CONTINUE_SEARCH 0 +#define MAXINTATOM 0xC000 +#define INVALID_ATOM ((ATOM)0) +#define IGNORE 0 +#define INFINITE 0xFFFFFFFF +#define NOPARITY 0 +#define ODDPARITY 1 +#define EVENPARITY 2 +#define MARKPARITY 3 +#define SPACEPARITY 4 +#define ONESTOPBIT 0 +#define ONE5STOPBITS 1 +#define TWOSTOPBITS 2 +#define CBR_110 110 +#define CBR_300 300 +#define CBR_600 600 +#define CBR_1200 1200 +#define CBR_2400 2400 +#define CBR_4800 4800 +#define CBR_9600 9600 +#define CBR_14400 14400 +#define CBR_19200 19200 +#define CBR_38400 38400 +#define CBR_56000 56000 +#define CBR_57600 57600 +#define CBR_115200 115200 +#define CBR_128000 128000 +#define CBR_256000 256000 +#define BACKUP_INVALID 0 +#define BACKUP_DATA 1 +#define BACKUP_EA_DATA 2 +#define BACKUP_SECURITY_DATA 3 +#define BACKUP_ALTERNATE_DATA 4 +#define BACKUP_LINK 5 +#define BACKUP_PROPERTY_DATA 6 +#define BACKUP_OBJECT_ID 7 +#define BACKUP_REPARSE_DATA 8 +#define BACKUP_SPARSE_BLOCK 9 +#define STREAM_NORMAL_ATTRIBUTE 0 +#define STREAM_MODIFIED_WHEN_READ 1 +#define STREAM_CONTAINS_SECURITY 2 +#define STREAM_CONTAINS_PROPERTIES 4 +#define STARTF_USESHOWWINDOW 1 +#define STARTF_USESIZE 2 +#define STARTF_USEPOSITION 4 +#define STARTF_USECOUNTCHARS 8 +#define STARTF_USEFILLATTRIBUTE 16 +#define STARTF_RUNFULLSCREEN 32 +#define STARTF_FORCEONFEEDBACK 64 +#define STARTF_FORCEOFFFEEDBACK 128 +#define STARTF_USESTDHANDLES 256 +#define STARTF_USEHOTKEY 512 +#define TC_NORMAL 0 +#define TC_HARDERR 1 +#define TC_GP_TRAP 2 +#define TC_SIGNAL 3 +#define AC_LINE_OFFLINE 0 +#define AC_LINE_ONLINE 1 +#define AC_LINE_BACKUP_POWER 2 +#define AC_LINE_UNKNOWN 255 +#define BATTERY_FLAG_HIGH 1 +#define BATTERY_FLAG_LOW 2 +#define BATTERY_FLAG_CRITICAL 4 +#define BATTERY_FLAG_CHARGING 8 +#define BATTERY_FLAG_NO_BATTERY 128 +#define BATTERY_FLAG_UNKNOWN 255 +#define BATTERY_PERCENTAGE_UNKNOWN 255 +#define BATTERY_LIFE_UNKNOWN 0xFFFFFFFF +#define DDD_RAW_TARGET_PATH 1 +#define DDD_REMOVE_DEFINITION 2 +#define DDD_EXACT_MATCH_ON_REMOVE 4 +#define HINSTANCE_ERROR 32 +#define MS_CTS_ON 16 +#define MS_DSR_ON 32 +#define MS_RING_ON 64 +#define MS_RLSD_ON 128 +#define DTR_CONTROL_DISABLE 0 +#define DTR_CONTROL_ENABLE 1 +#define DTR_CONTROL_HANDSHAKE 2 +#define RTS_CONTROL_DISABLE 0 +#define RTS_CONTROL_ENABLE 1 +#define RTS_CONTROL_HANDSHAKE 2 +#define RTS_CONTROL_TOGGLE 3 +#define SECURITY_ANONYMOUS (SecurityAnonymous<<16) +#define SECURITY_IDENTIFICATION (SecurityIdentification<<16) +#define SECURITY_IMPERSONATION (SecurityImpersonation<<16) +#define SECURITY_DELEGATION (SecurityDelegation<<16) +#define SECURITY_CONTEXT_TRACKING 0x40000 +#define SECURITY_EFFECTIVE_ONLY 0x80000 +#define SECURITY_SQOS_PRESENT 0x100000 +#define SECURITY_VALID_SQOS_FLAGS 0x1F0000 +#define INVALID_FILE_SIZE 0xFFFFFFFF +#define TLS_OUT_OF_INDEXES (DWORD)0xFFFFFFFF +#if (_WIN32_WINNT >= 0x0501) +#define ACTCTX_FLAG_PROCESSOR_ARCHITECTURE_VALID 0x00000001 +#define ACTCTX_FLAG_LANGID_VALID 0x00000002 +#define ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID 0x00000004 +#define ACTCTX_FLAG_RESOURCE_NAME_VALID 0x00000008 +#define ACTCTX_FLAG_SET_PROCESS_DEFAULT 0x00000010 +#define ACTCTX_FLAG_APPLICATION_NAME_VALID 0x00000020 +#define ACTCTX_FLAG_HMODULE_VALID 0x00000080 +#define DEACTIVATE_ACTCTX_FLAG_FORCE_EARLY_DEACTIVATION 0x00000001 +#define FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX 0x00000001 +#define QUERY_ACTCTX_FLAG_USE_ACTIVE_ACTCTX 0x00000004 +#define QUERY_ACTCTX_FLAG_ACTCTX_IS_HMODULE 0x00000008 +#define QUERY_ACTCTX_FLAG_ACTCTX_IS_ADDRESS 0x00000010 +#endif /* (_WIN32_WINNT >= 0x0501) */ +#if (_WIN32_WINNT >= 0x0500) +#define REPLACEFILE_WRITE_THROUGH 0x00000001 +#define REPLACEFILE_IGNORE_MERGE_ERRORS 0x00000002 +#endif /* (_WIN32_WINNT >= 0x0500) */ + +#ifndef RC_INVOKED +typedef struct _FILETIME { + DWORD dwLowDateTime; + DWORD dwHighDateTime; +} FILETIME,*PFILETIME,*LPFILETIME; +typedef struct _BY_HANDLE_FILE_INFORMATION { + DWORD dwFileAttributes; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; + DWORD dwVolumeSerialNumber; + DWORD nFileSizeHigh; + DWORD nFileSizeLow; + DWORD nNumberOfLinks; + DWORD nFileIndexHigh; + DWORD nFileIndexLow; +} BY_HANDLE_FILE_INFORMATION,*LPBY_HANDLE_FILE_INFORMATION; +typedef struct _DCB { + DWORD DCBlength; + DWORD BaudRate; + DWORD fBinary:1; + DWORD fParity:1; + DWORD fOutxCtsFlow:1; + DWORD fOutxDsrFlow:1; + DWORD fDtrControl:2; + DWORD fDsrSensitivity:1; + DWORD fTXContinueOnXoff:1; + DWORD fOutX:1; + DWORD fInX:1; + DWORD fErrorChar:1; + DWORD fNull:1; + DWORD fRtsControl:2; + DWORD fAbortOnError:1; + DWORD fDummy2:17; + WORD wReserved; + WORD XonLim; + WORD XoffLim; + BYTE ByteSize; + BYTE Parity; + BYTE StopBits; + char XonChar; + char XoffChar; + char ErrorChar; + char EofChar; + char EvtChar; + WORD wReserved1; +} DCB,*LPDCB; +typedef struct _COMM_CONFIG { + DWORD dwSize; + WORD wVersion; + WORD wReserved; + DCB dcb; + DWORD dwProviderSubType; + DWORD dwProviderOffset; + DWORD dwProviderSize; + WCHAR wcProviderData[1]; +} COMMCONFIG,*LPCOMMCONFIG; +typedef struct _COMMPROP { + WORD wPacketLength; + WORD wPacketVersion; + DWORD dwServiceMask; + DWORD dwReserved1; + DWORD dwMaxTxQueue; + DWORD dwMaxRxQueue; + DWORD dwMaxBaud; + DWORD dwProvSubType; + DWORD dwProvCapabilities; + DWORD dwSettableParams; + DWORD dwSettableBaud; + WORD wSettableData; + WORD wSettableStopParity; + DWORD dwCurrentTxQueue; + DWORD dwCurrentRxQueue; + DWORD dwProvSpec1; + DWORD dwProvSpec2; + WCHAR wcProvChar[1]; +} COMMPROP,*LPCOMMPROP; +typedef struct _COMMTIMEOUTS { + DWORD ReadIntervalTimeout; + DWORD ReadTotalTimeoutMultiplier; + DWORD ReadTotalTimeoutConstant; + DWORD WriteTotalTimeoutMultiplier; + DWORD WriteTotalTimeoutConstant; +} COMMTIMEOUTS,*LPCOMMTIMEOUTS; +typedef struct _COMSTAT { + DWORD fCtsHold:1; + DWORD fDsrHold:1; + DWORD fRlsdHold:1; + DWORD fXoffHold:1; + DWORD fXoffSent:1; + DWORD fEof:1; + DWORD fTxim:1; + DWORD fReserved:25; + DWORD cbInQue; + DWORD cbOutQue; +} COMSTAT,*LPCOMSTAT; +typedef DWORD (WINAPI *LPTHREAD_START_ROUTINE)(LPVOID); +typedef struct _CREATE_PROCESS_DEBUG_INFO { + HANDLE hFile; + HANDLE hProcess; + HANDLE hThread; + LPVOID lpBaseOfImage; + DWORD dwDebugInfoFileOffset; + DWORD nDebugInfoSize; + LPVOID lpThreadLocalBase; + LPTHREAD_START_ROUTINE lpStartAddress; + LPVOID lpImageName; + WORD fUnicode; +} CREATE_PROCESS_DEBUG_INFO,*LPCREATE_PROCESS_DEBUG_INFO; +typedef struct _CREATE_THREAD_DEBUG_INFO { + HANDLE hThread; + LPVOID lpThreadLocalBase; + LPTHREAD_START_ROUTINE lpStartAddress; +} CREATE_THREAD_DEBUG_INFO,*LPCREATE_THREAD_DEBUG_INFO; +typedef struct _EXCEPTION_DEBUG_INFO { + EXCEPTION_RECORD ExceptionRecord; + DWORD dwFirstChance; +} EXCEPTION_DEBUG_INFO,*LPEXCEPTION_DEBUG_INFO; +typedef struct _EXIT_THREAD_DEBUG_INFO { + DWORD dwExitCode; +} EXIT_THREAD_DEBUG_INFO,*LPEXIT_THREAD_DEBUG_INFO; +typedef struct _EXIT_PROCESS_DEBUG_INFO { + DWORD dwExitCode; +} EXIT_PROCESS_DEBUG_INFO,*LPEXIT_PROCESS_DEBUG_INFO; +typedef struct _LOAD_DLL_DEBUG_INFO { + HANDLE hFile; + LPVOID lpBaseOfDll; + DWORD dwDebugInfoFileOffset; + DWORD nDebugInfoSize; + LPVOID lpImageName; + WORD fUnicode; +} LOAD_DLL_DEBUG_INFO,*LPLOAD_DLL_DEBUG_INFO; +typedef struct _UNLOAD_DLL_DEBUG_INFO { + LPVOID lpBaseOfDll; +} UNLOAD_DLL_DEBUG_INFO,*LPUNLOAD_DLL_DEBUG_INFO; +typedef struct _OUTPUT_DEBUG_STRING_INFO { + LPSTR lpDebugStringData; + WORD fUnicode; + WORD nDebugStringLength; +} OUTPUT_DEBUG_STRING_INFO,*LPOUTPUT_DEBUG_STRING_INFO; +typedef struct _RIP_INFO { + DWORD dwError; + DWORD dwType; +} RIP_INFO,*LPRIP_INFO; +typedef struct _DEBUG_EVENT { + DWORD dwDebugEventCode; + DWORD dwProcessId; + DWORD dwThreadId; + union { + EXCEPTION_DEBUG_INFO Exception; + CREATE_THREAD_DEBUG_INFO CreateThread; + CREATE_PROCESS_DEBUG_INFO CreateProcessInfo; + EXIT_THREAD_DEBUG_INFO ExitThread; + EXIT_PROCESS_DEBUG_INFO ExitProcess; + LOAD_DLL_DEBUG_INFO LoadDll; + UNLOAD_DLL_DEBUG_INFO UnloadDll; + OUTPUT_DEBUG_STRING_INFO DebugString; + RIP_INFO RipInfo; + } u; +} DEBUG_EVENT,*LPDEBUG_EVENT; +typedef struct _OVERLAPPED { + DWORD Internal; + DWORD InternalHigh; + DWORD Offset; + DWORD OffsetHigh; + HANDLE hEvent; +} OVERLAPPED,*POVERLAPPED,*LPOVERLAPPED; +typedef struct _STARTUPINFOA { + DWORD cb; + LPSTR lpReserved; + LPSTR lpDesktop; + LPSTR lpTitle; + DWORD dwX; + DWORD dwY; + DWORD dwXSize; + DWORD dwYSize; + DWORD dwXCountChars; + DWORD dwYCountChars; + DWORD dwFillAttribute; + DWORD dwFlags; + WORD wShowWindow; + WORD cbReserved2; + PBYTE lpReserved2; + HANDLE hStdInput; + HANDLE hStdOutput; + HANDLE hStdError; +} STARTUPINFOA,*LPSTARTUPINFOA; +typedef struct _STARTUPINFOW { + DWORD cb; + LPWSTR lpReserved; + LPWSTR lpDesktop; + LPWSTR lpTitle; + DWORD dwX; + DWORD dwY; + DWORD dwXSize; + DWORD dwYSize; + DWORD dwXCountChars; + DWORD dwYCountChars; + DWORD dwFillAttribute; + DWORD dwFlags; + WORD wShowWindow; + WORD cbReserved2; + PBYTE lpReserved2; + HANDLE hStdInput; + HANDLE hStdOutput; + HANDLE hStdError; +} STARTUPINFOW,*LPSTARTUPINFOW; +typedef struct _PROCESS_INFORMATION { + HANDLE hProcess; + HANDLE hThread; + DWORD dwProcessId; + DWORD dwThreadId; +} PROCESS_INFORMATION,*LPPROCESS_INFORMATION; +typedef struct _CRITICAL_SECTION_DEBUG { + WORD Type; + WORD CreatorBackTraceIndex; + struct _CRITICAL_SECTION *CriticalSection; + LIST_ENTRY ProcessLocksList; + DWORD EntryCount; + DWORD ContentionCount; + DWORD Spare [2]; +} CRITICAL_SECTION_DEBUG,*PCRITICAL_SECTION_DEBUG; +typedef struct _CRITICAL_SECTION { + PCRITICAL_SECTION_DEBUG DebugInfo; + LONG LockCount; + LONG RecursionCount; + HANDLE OwningThread; + HANDLE LockSemaphore; + DWORD SpinCount; +} CRITICAL_SECTION,*PCRITICAL_SECTION,*LPCRITICAL_SECTION; +typedef struct _SYSTEMTIME { + WORD wYear; + WORD wMonth; + WORD wDayOfWeek; + WORD wDay; + WORD wHour; + WORD wMinute; + WORD wSecond; + WORD wMilliseconds; +} SYSTEMTIME,*LPSYSTEMTIME; +typedef struct _WIN32_FILE_ATTRIBUTE_DATA { + DWORD dwFileAttributes; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; + DWORD nFileSizeHigh; + DWORD nFileSizeLow; +} WIN32_FILE_ATTRIBUTE_DATA,*LPWIN32_FILE_ATTRIBUTE_DATA; +typedef struct _WIN32_FIND_DATAA { + DWORD dwFileAttributes; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; + DWORD nFileSizeHigh; + DWORD nFileSizeLow; + DWORD dwReserved0; + DWORD dwReserved1; + CHAR cFileName[MAX_PATH]; + CHAR cAlternateFileName[14]; +} WIN32_FIND_DATAA,*PWIN32_FIND_DATAA,*LPWIN32_FIND_DATAA; +typedef struct _WIN32_FIND_DATAW { + DWORD dwFileAttributes; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; + DWORD nFileSizeHigh; + DWORD nFileSizeLow; + DWORD dwReserved0; + DWORD dwReserved1; + WCHAR cFileName[MAX_PATH]; + WCHAR cAlternateFileName[14]; +} WIN32_FIND_DATAW,*PWIN32_FIND_DATAW,*LPWIN32_FIND_DATAW; +typedef struct _WIN32_STREAM_ID { + DWORD dwStreamId; + DWORD dwStreamAttributes; + LARGE_INTEGER Size; + DWORD dwStreamNameSize; + WCHAR cStreamName[ANYSIZE_ARRAY]; +} WIN32_STREAM_ID, *LPWIN32_STREAM_ID; +typedef enum _FINDEX_INFO_LEVELS { + FindExInfoStandard, + FindExInfoMaxInfoLevel +} FINDEX_INFO_LEVELS; +typedef enum _FINDEX_SEARCH_OPS { + FindExSearchNameMatch, + FindExSearchLimitToDirectories, + FindExSearchLimitToDevices, + FindExSearchMaxSearchOp +} FINDEX_SEARCH_OPS; +typedef enum _ACL_INFORMATION_CLASS { + AclRevisionInformation=1, + AclSizeInformation +} ACL_INFORMATION_CLASS; +typedef struct tagHW_PROFILE_INFOA { + DWORD dwDockInfo; + CHAR szHwProfileGuid[HW_PROFILE_GUIDLEN]; + CHAR szHwProfileName[MAX_PROFILE_LEN]; +} HW_PROFILE_INFOA,*LPHW_PROFILE_INFOA; +typedef struct tagHW_PROFILE_INFOW { + DWORD dwDockInfo; + WCHAR szHwProfileGuid[HW_PROFILE_GUIDLEN]; + WCHAR szHwProfileName[MAX_PROFILE_LEN]; +} HW_PROFILE_INFOW,*LPHW_PROFILE_INFOW; +typedef enum _GET_FILEEX_INFO_LEVELS { + GetFileExInfoStandard, + GetFileExMaxInfoLevel +} GET_FILEEX_INFO_LEVELS; +typedef struct _SYSTEM_INFO { + _ANONYMOUS_UNION union { + DWORD dwOemId; + _ANONYMOUS_STRUCT struct { + WORD wProcessorArchitecture; + WORD wReserved; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; + DWORD dwPageSize; + PVOID lpMinimumApplicationAddress; + PVOID lpMaximumApplicationAddress; + DWORD dwActiveProcessorMask; + DWORD dwNumberOfProcessors; + DWORD dwProcessorType; + DWORD dwAllocationGranularity; + WORD wProcessorLevel; + WORD wProcessorRevision; +} SYSTEM_INFO,*LPSYSTEM_INFO; +typedef struct _SYSTEM_POWER_STATUS { + BYTE ACLineStatus; + BYTE BatteryFlag; + BYTE BatteryLifePercent; + BYTE Reserved1; + DWORD BatteryLifeTime; + DWORD BatteryFullLifeTime; +} SYSTEM_POWER_STATUS,*LPSYSTEM_POWER_STATUS; +typedef struct _TIME_ZONE_INFORMATION { + LONG Bias; + WCHAR StandardName[32]; + SYSTEMTIME StandardDate; + LONG StandardBias; + WCHAR DaylightName[32]; + SYSTEMTIME DaylightDate; + LONG DaylightBias; +} TIME_ZONE_INFORMATION,*LPTIME_ZONE_INFORMATION; +typedef struct _MEMORYSTATUS { + DWORD dwLength; + DWORD dwMemoryLoad; + DWORD dwTotalPhys; + DWORD dwAvailPhys; + DWORD dwTotalPageFile; + DWORD dwAvailPageFile; + DWORD dwTotalVirtual; + DWORD dwAvailVirtual; +} MEMORYSTATUS,*LPMEMORYSTATUS; +#if (_WIN32_WINNT >= 0x0500) +typedef struct _MEMORYSTATUSEX { + DWORD dwLength; + DWORD dwMemoryLoad; + DWORDLONG ullTotalPhys; + DWORDLONG ullAvailPhys; + DWORDLONG ullTotalPageFile; + DWORDLONG ullAvailPageFile; + DWORDLONG ullTotalVirtual; + DWORDLONG ullAvailVirtual; + DWORDLONG ullAvailExtendedVirtual; +} MEMORYSTATUSEX, *LPMEMORYSTATUSEX; +#endif +typedef struct _LDT_ENTRY { + WORD LimitLow; + WORD BaseLow; + union { + struct { + BYTE BaseMid; + BYTE Flags1; + BYTE Flags2; + BYTE BaseHi; + } Bytes; + struct { + DWORD BaseMid:8; + DWORD Type:5; + DWORD Dpl:2; + DWORD Pres:1; + DWORD LimitHi:4; + DWORD Sys:1; + DWORD Reserved_0:1; + DWORD Default_Big:1; + DWORD Granularity:1; + DWORD BaseHi:8; + } Bits; + } HighWord; +} LDT_ENTRY,*PLDT_ENTRY,*LPLDT_ENTRY; +typedef struct _PROCESS_HEAP_ENTRY { + PVOID lpData; + DWORD cbData; + BYTE cbOverhead; + BYTE iRegionIndex; + WORD wFlags; + _ANONYMOUS_UNION union { + struct { + HANDLE hMem; + DWORD dwReserved[3]; + } Block; + struct { + DWORD dwCommittedSize; + DWORD dwUnCommittedSize; + LPVOID lpFirstBlock; + LPVOID lpLastBlock; + } Region; + } DUMMYUNIONNAME; +} PROCESS_HEAP_ENTRY,*LPPROCESS_HEAP_ENTRY; +typedef struct _OFSTRUCT { + BYTE cBytes; + BYTE fFixedDisk; + WORD nErrCode; + WORD Reserved1; + WORD Reserved2; + CHAR szPathName[OFS_MAXPATHNAME]; +} OFSTRUCT,*LPOFSTRUCT,*POFSTRUCT; +typedef struct _WIN_CERTIFICATE { + DWORD dwLength; + WORD wRevision; + WORD wCertificateType; + BYTE bCertificate[1]; +} WIN_CERTIFICATE, *LPWIN_CERTIFICATE; +#if (_WIN32_WINNT >= 0x0501) +typedef struct tagACTCTXA { + ULONG cbSize; + DWORD dwFlags; + LPCSTR lpSource; + USHORT wProcessorArchitecture; + LANGID wLangId; + LPCSTR lpAssemblyDirectory; + LPCSTR lpResourceName; + LPCSTR lpApplicationName; + HMODULE hModule; +} ACTCTXA,*PACTCTXA; +typedef const ACTCTXA *PCACTCTXA; +typedef struct tagACTCTXW { + ULONG cbSize; + DWORD dwFlags; + LPCWSTR lpSource; + USHORT wProcessorArchitecture; + LANGID wLangId; + LPCWSTR lpAssemblyDirectory; + LPCWSTR lpResourceName; + LPCWSTR lpApplicationName; + HMODULE hModule; +} ACTCTXW,*PACTCTXW; +typedef const ACTCTXW *PCACTCTXW; +typedef struct tagACTCTX_SECTION_KEYED_DATA { + ULONG cbSize; + ULONG ulDataFormatVersion; + PVOID lpData; + ULONG ulLength; + PVOID lpSectionGlobalData; + ULONG ulSectionGlobalDataLength; + PVOID lpSectionBase; + ULONG ulSectionTotalLength; + HANDLE hActCtx; + HANDLE ulAssemblyRosterIndex; +} ACTCTX_SECTION_KEYED_DATA,*PACTCTX_SECTION_KEYED_DATA; +typedef const ACTCTX_SECTION_KEYED_DATA *PCACTCTX_SECTION_KEYED_DATA; +typedef enum { + LowMemoryResourceNotification , + HighMemoryResourceNotification +} MEMORY_RESOURCE_NOTIFICATION_TYPE; +#endif /* (_WIN32_WINNT >= 0x0501) */ +#if (_WIN32_WINNT >= 0x0500) +typedef enum _COMPUTER_NAME_FORMAT { + ComputerNameNetBIOS, + ComputerNameDnsHostname, + ComputerNameDnsDomain, + ComputerNameDnsFullyQualified, + ComputerNamePhysicalNetBIOS, + ComputerNamePhysicalDnsHostname, + ComputerNamePhysicalDnsDomain, + ComputerNamePhysicalDnsFullyQualified, + ComputerNameMax +} COMPUTER_NAME_FORMAT; +#endif /* (_WIN32_WINNT >= 0x0500) */ + +typedef DWORD(WINAPI *LPPROGRESS_ROUTINE)(LARGE_INTEGER,LARGE_INTEGER,LARGE_INTEGER,LARGE_INTEGER,DWORD,DWORD,HANDLE,HANDLE,LPVOID); +typedef void(WINAPI *LPFIBER_START_ROUTINE)(PVOID); +typedef BOOL(CALLBACK *ENUMRESLANGPROC)(HMODULE,LPCTSTR,LPCTSTR,WORD,LONG); +typedef BOOL(CALLBACK *ENUMRESNAMEPROC)(HMODULE,LPCTSTR,LPTSTR,LONG); +typedef BOOL(CALLBACK *ENUMRESTYPEPROC)(HMODULE,LPTSTR,LONG); +typedef void(CALLBACK *LPOVERLAPPED_COMPLETION_ROUTINE)(DWORD,DWORD,LPOVERLAPPED); +typedef LONG(CALLBACK *PTOP_LEVEL_EXCEPTION_FILTER)(LPEXCEPTION_POINTERS); +typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER; +typedef void(APIENTRY *PAPCFUNC)(DWORD); +typedef void(CALLBACK *PTIMERAPCROUTINE)(PVOID,DWORD,DWORD); +#if (_WIN32_WINNT >= 0x0500) +typedef void(CALLBACK *WAITORTIMERCALLBACK)(PVOID,BOOLEAN); +#endif +#define MAKEINTATOM(i) (LPTSTR)((DWORD)((WORD)(i))) +/* Functions */ +#ifndef UNDER_CE +int APIENTRY WinMain(HINSTANCE,HINSTANCE,LPSTR,int); +#else +int APIENTRY WinMain(HINSTANCE,HINSTANCE,LPWSTR,int); +#endif +int APIENTRY wWinMain(HINSTANCE,HINSTANCE,LPWSTR,int); +long WINAPI _hread(HFILE,LPVOID,long); +long WINAPI _hwrite(HFILE,LPCSTR,long); +HFILE WINAPI _lclose(HFILE); +HFILE WINAPI _lcreat(LPCSTR,int); +LONG WINAPI _llseek(HFILE,LONG,int); +HFILE WINAPI _lopen(LPCSTR,int); +UINT WINAPI _lread(HFILE,LPVOID,UINT); +UINT WINAPI _lwrite(HFILE,LPCSTR,UINT); +#define AbnormalTermination() FALSE +BOOL WINAPI AccessCheck(PSECURITY_DESCRIPTOR,HANDLE,DWORD,PGENERIC_MAPPING,PPRIVILEGE_SET,PDWORD,PDWORD,PBOOL); +BOOL WINAPI AccessCheckAndAuditAlarmA(LPCSTR,LPVOID,LPSTR,LPSTR,PSECURITY_DESCRIPTOR,DWORD,PGENERIC_MAPPING,BOOL,PDWORD,PBOOL,PBOOL); +BOOL WINAPI AccessCheckAndAuditAlarmW(LPCWSTR,LPVOID,LPWSTR,LPWSTR,PSECURITY_DESCRIPTOR,DWORD,PGENERIC_MAPPING,BOOL,PDWORD,PBOOL,PBOOL); +#if (_WIN32_WINNT >= 0x0501) +BOOL WINAPI ActivateActCtx(HANDLE,ULONG_PTR*); +#endif +BOOL WINAPI AddAccessAllowedAce(PACL,DWORD,DWORD,PSID); +BOOL WINAPI AddAccessDeniedAce(PACL,DWORD,DWORD,PSID); +#if (_WIN32_WINNT >= 0x0500) +BOOL WINAPI AddAccessAllowedAceEx(PACL,DWORD,DWORD,DWORD,PSID); +BOOL WINAPI AddAccessDeniedAceEx(PACL,DWORD,DWORD,DWORD,PSID); +#endif +BOOL WINAPI AddAce(PACL,DWORD,DWORD,PVOID,DWORD); +ATOM WINAPI AddAtomA(LPCSTR); +ATOM WINAPI AddAtomW(LPCWSTR); +BOOL WINAPI AddAuditAccessAce(PACL,DWORD,DWORD,PSID,BOOL,BOOL); +#if (_WIN32_WINNT >= 0x0501) +void WINAPI AddRefActCtx(HANDLE); +#endif +#if (_WIN32_WINNT >= 0x0500) +PVOID WINAPI AddVectoredExceptionHandler(ULONG,PVECTORED_EXCEPTION_HANDLER); +#endif +BOOL WINAPI AdjustTokenGroups(HANDLE,BOOL,PTOKEN_GROUPS,DWORD,PTOKEN_GROUPS,PDWORD); +BOOL WINAPI AdjustTokenPrivileges(HANDLE,BOOL,PTOKEN_PRIVILEGES,DWORD,PTOKEN_PRIVILEGES,PDWORD); +BOOL WINAPI AllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY,BYTE,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,PSID*); +BOOL WINAPI AllocateLocallyUniqueId(PLUID); +BOOL WINAPI AreAllAccessesGranted(DWORD,DWORD); +BOOL WINAPI AreAnyAccessesGranted(DWORD,DWORD); +BOOL WINAPI AreFileApisANSI(void); +BOOL WINAPI BackupEventLogA(HANDLE,LPCSTR); +BOOL WINAPI BackupEventLogW(HANDLE,LPCWSTR); +BOOL WINAPI BackupRead(HANDLE,LPBYTE,DWORD,LPDWORD,BOOL,BOOL,LPVOID*); +BOOL WINAPI BackupSeek(HANDLE,DWORD,DWORD,LPDWORD,LPDWORD,LPVOID*); +BOOL WINAPI BackupWrite(HANDLE,LPBYTE,DWORD,LPDWORD,BOOL,BOOL,LPVOID*); +BOOL WINAPI Beep(DWORD,DWORD); +HANDLE WINAPI BeginUpdateResourceA(LPCSTR,BOOL); +HANDLE WINAPI BeginUpdateResourceW(LPCWSTR,BOOL); +BOOL WINAPI BuildCommDCBA(LPCSTR,LPDCB); +BOOL WINAPI BuildCommDCBW(LPCWSTR,LPDCB); +BOOL WINAPI BuildCommDCBAndTimeoutsA(LPCSTR,LPDCB,LPCOMMTIMEOUTS); +BOOL WINAPI BuildCommDCBAndTimeoutsW(LPCWSTR,LPDCB,LPCOMMTIMEOUTS); +BOOL WINAPI CallNamedPipeA(LPCSTR,PVOID,DWORD,PVOID,DWORD,PDWORD,DWORD); +BOOL WINAPI CallNamedPipeW(LPCWSTR,PVOID,DWORD,PVOID,DWORD,PDWORD,DWORD); +BOOL WINAPI CancelDeviceWakeupRequest(HANDLE); +BOOL WINAPI CancelIo(HANDLE); +BOOL WINAPI CancelWaitableTimer(HANDLE); +#if (_WIN32_WINNT >= 0x0501) +BOOL WINAPI CheckNameLegalDOS8Dot3A(LPCSTR,LPSTR,DWORD,PBOOL,PBOOL); +BOOL WINAPI CheckNameLegalDOS8Dot3W(LPCWSTR,LPSTR,DWORD,PBOOL,PBOOL); +BOOL WINAPI CheckRemoteDebuggerPresent(HANDLE,PBOOL); +#endif +BOOL WINAPI ClearCommBreak(HANDLE); +BOOL WINAPI ClearCommError(HANDLE,PDWORD,LPCOMSTAT); +BOOL WINAPI ClearEventLogA(HANDLE,LPCSTR); +BOOL WINAPI ClearEventLogW(HANDLE,LPCWSTR); +BOOL WINAPI CloseEventLog(HANDLE); +BOOL WINAPI CloseHandle(HANDLE); +BOOL WINAPI CommConfigDialogA(LPCSTR,HWND,LPCOMMCONFIG); +BOOL WINAPI CommConfigDialogW(LPCWSTR,HWND,LPCOMMCONFIG); +LONG WINAPI CompareFileTime(CONST FILETIME*,CONST FILETIME*); +BOOL WINAPI ConnectNamedPipe(HANDLE,LPOVERLAPPED); +BOOL WINAPI ContinueDebugEvent(DWORD,DWORD,DWORD); +#if (_WIN32_WINNT >= 0x0400) +BOOL WINAPI ConvertFiberToThread(void); +#endif +PVOID WINAPI ConvertThreadToFiber(PVOID); +BOOL WINAPI CopyFileA(LPCSTR,LPCSTR,BOOL); +BOOL WINAPI CopyFileW(LPCWSTR,LPCWSTR,BOOL); +BOOL WINAPI CopyFileExA(LPCSTR,LPCSTR,LPPROGRESS_ROUTINE,LPVOID,LPBOOL,DWORD); +BOOL WINAPI CopyFileExW(LPCWSTR,LPCWSTR,LPPROGRESS_ROUTINE,LPVOID,LPBOOL,DWORD); +#define RtlMoveMemory memmove +#define RtlCopyMemory memcpy +#define RtlFillMemory(d,l,f) memset((d), (f), (l)) +#define RtlZeroMemory(d,l) RtlFillMemory((d),(l),0) +#define MoveMemory RtlMoveMemory +#define CopyMemory RtlCopyMemory +#define FillMemory RtlFillMemory +#define ZeroMemory RtlZeroMemory +BOOL WINAPI CopySid(DWORD,PSID,PSID); +#if (_WIN32_WINNT >= 0x0501) +HANDLE WINAPI CreateActCtxA(PCACTCTXA); +HANDLE WINAPI CreateActCtxW(PCACTCTXW); +#endif +BOOL WINAPI CreateDirectoryA(LPCSTR,LPSECURITY_ATTRIBUTES); +BOOL WINAPI CreateDirectoryW(LPCWSTR,LPSECURITY_ATTRIBUTES); +BOOL WINAPI CreateDirectoryExA(LPCSTR,LPCSTR,LPSECURITY_ATTRIBUTES); +BOOL WINAPI CreateDirectoryExW(LPCWSTR,LPCWSTR,LPSECURITY_ATTRIBUTES); +HANDLE WINAPI CreateEventA(LPSECURITY_ATTRIBUTES,BOOL,BOOL,LPCSTR); +HANDLE WINAPI CreateEventW(LPSECURITY_ATTRIBUTES,BOOL,BOOL,LPCWSTR); +LPVOID WINAPI CreateFiber(SIZE_T,LPFIBER_START_ROUTINE,LPVOID); +#if (_WIN32_WINNT >= 0x0400) +LPVOID WINAPI CreateFiberEx(SIZE_T,SIZE_T,DWORD,LPFIBER_START_ROUTINE,LPVOID); +#endif +HANDLE WINAPI CreateFileA(LPCSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE); +HANDLE WINAPI CreateFileW(LPCWSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE); +HANDLE WINAPI CreateFileMappingA(HANDLE,LPSECURITY_ATTRIBUTES,DWORD,DWORD,DWORD,LPCSTR); +HANDLE WINAPI CreateFileMappingW(HANDLE,LPSECURITY_ATTRIBUTES,DWORD,DWORD,DWORD,LPCWSTR); +#if (_WIN32_WINNT >= 0x0500) +BOOL WINAPI CreateHardLinkA(LPCSTR,LPCSTR,LPSECURITY_ATTRIBUTES); +BOOL WINAPI CreateHardLinkW(LPCWSTR,LPCWSTR,LPSECURITY_ATTRIBUTES); +#endif +HANDLE WINAPI CreateIoCompletionPort(HANDLE,HANDLE,DWORD,DWORD); +#if (_WIN32_WINNT >= 0x0500) +HANDLE WINAPI CreateJobObjectA(LPSECURITY_ATTRIBUTES,LPCSTR); +HANDLE WINAPI CreateJobObjectW(LPSECURITY_ATTRIBUTES,LPCWSTR); +BOOL WINAPI TerminateJobObject(HANDLE,UINT); +BOOL WINAPI AssignProcessToJobObject(HANDLE,HANDLE); +#endif +HANDLE WINAPI CreateMailslotA(LPCSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES); +HANDLE WINAPI CreateMailslotW(LPCWSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES); +#if (_WIN32_WINNT >= 0x0501) +HANDLE WINAPI CreateMemoryResourceNotification(MEMORY_RESOURCE_NOTIFICATION_TYPE); +#endif +HANDLE WINAPI CreateMutexA(LPSECURITY_ATTRIBUTES,BOOL,LPCSTR); +HANDLE WINAPI CreateMutexW(LPSECURITY_ATTRIBUTES,BOOL,LPCWSTR); +HANDLE WINAPI CreateNamedPipeA(LPCSTR,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,LPSECURITY_ATTRIBUTES); +HANDLE WINAPI CreateNamedPipeW(LPCWSTR,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,LPSECURITY_ATTRIBUTES); +BOOL WINAPI CreatePipe(PHANDLE,PHANDLE,LPSECURITY_ATTRIBUTES,DWORD); +BOOL WINAPI CreatePrivateObjectSecurity(PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR*,BOOL,HANDLE,PGENERIC_MAPPING); +BOOL WINAPI CreateProcessA(LPCSTR,LPSTR,LPSECURITY_ATTRIBUTES,LPSECURITY_ATTRIBUTES,BOOL,DWORD,PVOID,LPCSTR,LPSTARTUPINFOA,LPPROCESS_INFORMATION); +BOOL WINAPI CreateProcessW(LPCWSTR,LPWSTR,LPSECURITY_ATTRIBUTES,LPSECURITY_ATTRIBUTES,BOOL,DWORD,PVOID,LPCWSTR,LPSTARTUPINFOW,LPPROCESS_INFORMATION); +BOOL WINAPI CreateProcessAsUserA(HANDLE,LPCSTR,LPSTR,LPSECURITY_ATTRIBUTES,LPSECURITY_ATTRIBUTES,BOOL,DWORD,PVOID,LPCSTR,LPSTARTUPINFOA,LPPROCESS_INFORMATION); +BOOL WINAPI CreateProcessAsUserW(HANDLE,LPCWSTR,LPWSTR,LPSECURITY_ATTRIBUTES,LPSECURITY_ATTRIBUTES,BOOL,DWORD,PVOID,LPCWSTR,LPSTARTUPINFOW,LPPROCESS_INFORMATION); +HANDLE WINAPI CreateRemoteThread(HANDLE,LPSECURITY_ATTRIBUTES,DWORD,LPTHREAD_START_ROUTINE,LPVOID,DWORD,LPDWORD); +HANDLE WINAPI CreateSemaphoreA(LPSECURITY_ATTRIBUTES,LONG,LONG,LPCSTR); +HANDLE WINAPI CreateSemaphoreW(LPSECURITY_ATTRIBUTES,LONG,LONG,LPCWSTR); +DWORD WINAPI CreateTapePartition(HANDLE,DWORD,DWORD,DWORD); +#if (_WIN32_WINNT >= 0x0500) +HANDLE WINAPI CreateTimerQueue(void); +BOOL WINAPI CreateTimerQueueTimer(PHANDLE,HANDLE,WAITORTIMERCALLBACK,PVOID,DWORD,DWORD,ULONG); +#endif +HANDLE WINAPI CreateThread(LPSECURITY_ATTRIBUTES,DWORD,LPTHREAD_START_ROUTINE,PVOID,DWORD,PDWORD); +HANDLE WINAPI CreateWaitableTimerA(LPSECURITY_ATTRIBUTES,BOOL,LPCSTR); +HANDLE WINAPI CreateWaitableTimerW(LPSECURITY_ATTRIBUTES,BOOL,LPCWSTR); +#if (_WIN32_WINNT >= 0x0501) +BOOL WINAPI DeactivateActCtx(DWORD,ULONG_PTR); +#endif +BOOL WINAPI DebugActiveProcess(DWORD); +#if (_WIN32_WINNT >= 0x0501) +BOOL WINAPI DebugActiveProcessStop(DWORD); +#endif +void WINAPI DebugBreak(void); +#if (_WIN32_WINNT >= 0x0501) +BOOL WINAPI DebugBreakProcess(HANDLE); +BOOL WINAPI DebugSetProcessKillOnExit(BOOL); +#endif +BOOL WINAPI DefineDosDeviceA(DWORD,LPCSTR,LPCSTR); +BOOL WINAPI DefineDosDeviceW(DWORD,LPCWSTR,LPCWSTR); +#define DefineHandleTable(w) ((w),TRUE) +BOOL WINAPI DeleteAce(PACL,DWORD); +ATOM WINAPI DeleteAtom(ATOM); +void WINAPI DeleteCriticalSection(PCRITICAL_SECTION); +void WINAPI DeleteFiber(PVOID); +BOOL WINAPI DeleteFileA(LPCSTR); +BOOL WINAPI DeleteFileW(LPCWSTR); +#if (_WIN32_WINNT >= 0x0500) +BOOL WINAPI DeleteTimerQueue(HANDLE); +BOOL WINAPI DeleteTimerQueueEx(HANDLE,HANDLE); +BOOL WINAPI DeleteTimerQueueTimer(HANDLE,HANDLE,HANDLE); +BOOL WINAPI DeleteVolumeMountPointA(LPCSTR); +BOOL WINAPI DeleteVolumeMountPointW(LPCWSTR); +#endif +BOOL WINAPI DeregisterEventSource(HANDLE); +BOOL WINAPI DestroyPrivateObjectSecurity(PSECURITY_DESCRIPTOR*); +BOOL WINAPI DeviceIoControl(HANDLE,DWORD,PVOID,DWORD,PVOID,DWORD,PDWORD,POVERLAPPED); +BOOL WINAPI DisableThreadLibraryCalls(HMODULE); +#if (_WIN32_WINNT >= 0x0500) +BOOL WINAPI DnsHostnameToComputerNameA(LPCSTR,LPSTR,LPDWORD); +BOOL WINAPI DnsHostnameToComputerNameW(LPCWSTR,LPWSTR,LPDWORD); +#endif +BOOL WINAPI DisconnectNamedPipe(HANDLE); +BOOL WINAPI DosDateTimeToFileTime(WORD,WORD,LPFILETIME); +BOOL WINAPI DuplicateHandle(HANDLE,HANDLE,HANDLE,PHANDLE,DWORD,BOOL,DWORD); +BOOL WINAPI DuplicateToken(HANDLE,SECURITY_IMPERSONATION_LEVEL,PHANDLE); +BOOL WINAPI DuplicateTokenEx(HANDLE,DWORD,LPSECURITY_ATTRIBUTES,SECURITY_IMPERSONATION_LEVEL,TOKEN_TYPE,PHANDLE); +BOOL WINAPI EncryptFileA(LPCSTR); +BOOL WINAPI EncryptFileW(LPCWSTR); +BOOL WINAPI EndUpdateResourceA(HANDLE,BOOL); +BOOL WINAPI EndUpdateResourceW(HANDLE,BOOL); +void WINAPI EnterCriticalSection(LPCRITICAL_SECTION); +BOOL WINAPI EnumResourceLanguagesA(HMODULE,LPCSTR,LPCSTR,ENUMRESLANGPROC,LONG_PTR); +BOOL WINAPI EnumResourceLanguagesW(HMODULE,LPCWSTR,LPCWSTR,ENUMRESLANGPROC,LONG_PTR); +BOOL WINAPI EnumResourceNamesA(HMODULE,LPCSTR,ENUMRESNAMEPROC,LONG_PTR); +BOOL WINAPI EnumResourceNamesW(HMODULE,LPCWSTR,ENUMRESNAMEPROC,LONG_PTR); +BOOL WINAPI EnumResourceTypesA(HMODULE,ENUMRESTYPEPROC,LONG_PTR); +BOOL WINAPI EnumResourceTypesW(HMODULE,ENUMRESTYPEPROC,LONG_PTR); +BOOL WINAPI EqualPrefixSid(PSID,PSID); +BOOL WINAPI EqualSid(PSID,PSID); +DWORD WINAPI EraseTape(HANDLE,DWORD,BOOL); +BOOL WINAPI EscapeCommFunction(HANDLE,DWORD); +DECLSPEC_NORETURN void WINAPI ExitProcess(UINT); +DECLSPEC_NORETURN void WINAPI ExitThread(DWORD); +DWORD WINAPI ExpandEnvironmentStringsA(LPCSTR,LPSTR,DWORD); +DWORD WINAPI ExpandEnvironmentStringsW(LPCWSTR,LPWSTR,DWORD); +void WINAPI FatalAppExitA(UINT,LPCSTR); +void WINAPI FatalAppExitW(UINT,LPCWSTR); +void WINAPI FatalExit(int); +BOOL WINAPI FileEncryptionStatusA(LPCSTR,LPDWORD); +BOOL WINAPI FileEncryptionStatusW(LPCWSTR,LPDWORD); +BOOL WINAPI FileTimeToDosDateTime(CONST FILETIME *,LPWORD,LPWORD); +BOOL WINAPI FileTimeToLocalFileTime(CONST FILETIME *,LPFILETIME); +BOOL WINAPI FileTimeToSystemTime(CONST FILETIME *,LPSYSTEMTIME); +#if (_WIN32_WINNT >= 0x0501) +BOOL WINAPI FindActCtxSectionGuid(DWORD,const GUID*,ULONG,const GUID*,PACTCTX_SECTION_KEYED_DATA); +BOOL WINAPI FindActCtxSectionStringA(DWORD,const GUID*,ULONG,LPCSTR,PACTCTX_SECTION_KEYED_DATA); +BOOL WINAPI FindActCtxSectionStringW(DWORD,const GUID*,ULONG,LPCWSTR,PACTCTX_SECTION_KEYED_DATA); +#endif +ATOM WINAPI FindAtomA(LPCSTR); +ATOM WINAPI FindAtomW(LPCWSTR); +BOOL WINAPI FindClose(HANDLE); +BOOL WINAPI FindCloseChangeNotification(HANDLE); +HANDLE WINAPI FindFirstChangeNotificationA(LPCSTR,BOOL,DWORD); +HANDLE WINAPI FindFirstChangeNotificationW(LPCWSTR,BOOL,DWORD); +HANDLE WINAPI FindFirstFileA(LPCSTR,LPWIN32_FIND_DATAA); +HANDLE WINAPI FindFirstFileW(LPCWSTR,LPWIN32_FIND_DATAW); +HANDLE WINAPI FindFirstFileExA(LPCSTR,FINDEX_INFO_LEVELS,PVOID,FINDEX_SEARCH_OPS,PVOID,DWORD); +HANDLE WINAPI FindFirstFileExW(LPCWSTR,FINDEX_INFO_LEVELS,PVOID,FINDEX_SEARCH_OPS,PVOID,DWORD); +BOOL WINAPI FindFirstFreeAce(PACL,PVOID*); +#if (_WIN32_WINNT >= 0x0500) +HANDLE WINAPI FindFirstVolumeA(LPCSTR,DWORD); +HANDLE WINAPI FindFirstVolumeW(LPCWSTR,DWORD); +HANDLE WINAPI FindFirstVolumeMountPointA(LPSTR,LPSTR,DWORD); +HANDLE WINAPI FindFirstVolumeMountPointW(LPWSTR,LPWSTR,DWORD); +#endif +BOOL WINAPI FindNextChangeNotification(HANDLE); +BOOL WINAPI FindNextFileA(HANDLE,LPWIN32_FIND_DATAA); +BOOL WINAPI FindNextFileW(HANDLE,LPWIN32_FIND_DATAW); +#if (_WIN32_WINNT >= 0x0500) +BOOL WINAPI FindNextVolumeA(HANDLE,LPCSTR,DWORD); +BOOL WINAPI FindNextVolumeW(HANDLE,LPWSTR,DWORD); +BOOL WINAPI FindNextVolumeMountPointA(HANDLE,LPSTR,DWORD); +BOOL WINAPI FindNextVolumeMountPointW(HANDLE,LPWSTR,DWORD); +BOOL WINAPI FindVolumeClose(HANDLE); +BOOL WINAPI FindVolumeMountPointClose(HANDLE); +#endif +HRSRC WINAPI FindResourceA(HMODULE,LPCSTR,LPCSTR); +HRSRC WINAPI FindResourceW(HINSTANCE,LPCWSTR,LPCWSTR); +HRSRC WINAPI FindResourceExA(HINSTANCE,LPCSTR,LPCSTR,WORD); +HRSRC WINAPI FindResourceExW(HINSTANCE,LPCWSTR,LPCWSTR,WORD); +#if (_WIN32_WINNT >= 0x0502) +DWORD WINAPI GetFirmwareEnvironmentVariableA(LPCSTR,LPCSTR,PVOID,DWORD); +DWORD WINAPI GetFirmwareEnvironmentVariableW(LPCWSTR,LPCWSTR,PVOID,DWORD); +#endif +BOOL WINAPI FlushFileBuffers(HANDLE); +BOOL WINAPI FlushInstructionCache(HANDLE,PCVOID,DWORD); +BOOL WINAPI FlushViewOfFile(PCVOID,DWORD); +DWORD WINAPI FormatMessageA(DWORD,PCVOID,DWORD,DWORD,LPSTR,DWORD,va_list*); +DWORD WINAPI FormatMessageW(DWORD,PCVOID,DWORD,DWORD,LPWSTR,DWORD,va_list*); +BOOL WINAPI FreeEnvironmentStringsA(LPSTR); +BOOL WINAPI FreeEnvironmentStringsW(LPWSTR); +BOOL WINAPI FreeLibrary(HMODULE); +DECLSPEC_NORETURN void WINAPI FreeLibraryAndExitThread(HMODULE,DWORD); +#define FreeModule(m) FreeLibrary(m) +#define FreeProcInstance(p) (void)(p) +#ifndef XFree86Server +BOOL WINAPI FreeResource(HGLOBAL); +#endif /* ndef XFree86Server */ +PVOID WINAPI FreeSid(PSID); +BOOL WINAPI GetAce(PACL,DWORD,LPVOID*); +BOOL WINAPI GetAclInformation(PACL,PVOID,DWORD,ACL_INFORMATION_CLASS); +UINT WINAPI GetAtomNameA(ATOM,LPSTR,int); +UINT WINAPI GetAtomNameW(ATOM,LPWSTR,int); +BOOL WINAPI GetBinaryTypeA(LPCSTR,PDWORD); +BOOL WINAPI GetBinaryTypeW(LPCWSTR,PDWORD); +LPSTR WINAPI GetCommandLineA(VOID); +LPWSTR WINAPI GetCommandLineW(VOID); +BOOL WINAPI GetCommConfig(HANDLE,LPCOMMCONFIG,PDWORD); +BOOL WINAPI GetCommMask(HANDLE,PDWORD); +BOOL WINAPI GetCommModemStatus(HANDLE,PDWORD); +BOOL WINAPI GetCommProperties(HANDLE,LPCOMMPROP); +BOOL WINAPI GetCommState(HANDLE,LPDCB); +BOOL WINAPI GetCommTimeouts(HANDLE,LPCOMMTIMEOUTS); +DWORD WINAPI GetCompressedFileSizeA(LPCSTR,PDWORD); +DWORD WINAPI GetCompressedFileSizeW(LPCWSTR,PDWORD); +BOOL WINAPI GetComputerNameA(LPSTR,PDWORD); +BOOL WINAPI GetComputerNameW(LPWSTR,PDWORD); +#if (_WIN32_WINNT >= 0x0500) +BOOL WINAPI GetComputerNameExA(COMPUTER_NAME_FORMAT,LPSTR,LPDWORD); +BOOL WINAPI GetComputerNameExW(COMPUTER_NAME_FORMAT,LPWSTR,LPDWORD); +#endif +#if (_WIN32_WINNT >= 0x0501) +BOOL WINAPI GetCurrentActCtx(HANDLE*); +#endif +DWORD WINAPI GetCurrentDirectoryA(DWORD,LPSTR); +DWORD WINAPI GetCurrentDirectoryW(DWORD,LPWSTR); +BOOL WINAPI GetCurrentHwProfileA(LPHW_PROFILE_INFOA); +BOOL WINAPI GetCurrentHwProfileW(LPHW_PROFILE_INFOW); +HANDLE WINAPI GetCurrentProcess(void); +DWORD WINAPI GetCurrentProcessId(void); +HANDLE WINAPI GetCurrentThread(void); +DWORD WINAPI GetCurrentThreadId(void); +#define GetCurrentTime GetTickCount +BOOL WINAPI GetDefaultCommConfigA(LPCSTR,LPCOMMCONFIG,PDWORD); +BOOL WINAPI GetDefaultCommConfigW(LPCWSTR,LPCOMMCONFIG,PDWORD); +BOOL WINAPI GetDiskFreeSpaceA(LPCSTR,PDWORD,PDWORD,PDWORD,PDWORD); +BOOL WINAPI GetDiskFreeSpaceW(LPCWSTR,PDWORD,PDWORD,PDWORD,PDWORD); +BOOL WINAPI GetDiskFreeSpaceExA(LPCSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER); +BOOL WINAPI GetDiskFreeSpaceExW(LPCWSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER); +#if (_WIN32_WINNT >= 0x0502) +DWORD WINAPI GetDllDirectoryA(DWORD,LPSTR); +DWORD WINAPI GetDllDirectoryW(DWORD,LPWSTR); +#endif +UINT WINAPI GetDriveTypeA(LPCSTR); +UINT WINAPI GetDriveTypeW(LPCWSTR); +LPSTR WINAPI GetEnvironmentStrings(void); +LPSTR WINAPI GetEnvironmentStringsA(void); +LPWSTR WINAPI GetEnvironmentStringsW(void); +DWORD WINAPI GetEnvironmentVariableA(LPCSTR,LPSTR,DWORD); +DWORD WINAPI GetEnvironmentVariableW(LPCWSTR,LPWSTR,DWORD); +BOOL WINAPI GetExitCodeProcess(HANDLE,PDWORD); +BOOL WINAPI GetExitCodeThread(HANDLE,PDWORD); +DWORD WINAPI GetFileAttributesA(LPCSTR); +DWORD WINAPI GetFileAttributesW(LPCWSTR); +BOOL WINAPI GetFileAttributesExA(LPCSTR,GET_FILEEX_INFO_LEVELS,PVOID); +BOOL WINAPI GetFileAttributesExW(LPCWSTR,GET_FILEEX_INFO_LEVELS,PVOID); +BOOL WINAPI GetFileInformationByHandle(HANDLE,LPBY_HANDLE_FILE_INFORMATION); +BOOL WINAPI GetFileSecurityA(LPCSTR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR,DWORD,PDWORD); +BOOL WINAPI GetFileSecurityW(LPCWSTR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR,DWORD,PDWORD); +DWORD WINAPI GetFileSize(HANDLE,PDWORD); +BOOL WINAPI GetFileSizeEx(HANDLE,PLARGE_INTEGER); +BOOL WINAPI GetFileTime(HANDLE,LPFILETIME,LPFILETIME,LPFILETIME); +DWORD WINAPI GetFileType(HANDLE); +#define GetFreeSpace(w) (0x100000L) +DWORD WINAPI GetFullPathNameA(LPCSTR,DWORD,LPSTR,LPSTR*); +DWORD WINAPI GetFullPathNameW(LPCWSTR,DWORD,LPWSTR,LPWSTR*); +BOOL WINAPI GetHandleInformation(HANDLE,PDWORD); +BOOL WINAPI GetKernelObjectSecurity(HANDLE,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR,DWORD,PDWORD); +DWORD WINAPI GetLengthSid(PSID); +void WINAPI GetLocalTime(LPSYSTEMTIME); +DWORD WINAPI GetLogicalDrives(void); +DWORD WINAPI GetLogicalDriveStringsA(DWORD,LPSTR); +DWORD WINAPI GetLogicalDriveStringsW(DWORD,LPWSTR); +#if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0410) +DWORD WINAPI GetLongPathNameA(LPCSTR,LPSTR,DWORD); +DWORD WINAPI GetLongPathNameW(LPCWSTR,LPWSTR,DWORD); +#endif +BOOL WINAPI GetMailslotInfo(HANDLE,PDWORD,PDWORD,PDWORD,PDWORD); +DWORD WINAPI GetModuleFileNameA(HINSTANCE,LPSTR,DWORD); +DWORD WINAPI GetModuleFileNameW(HINSTANCE,LPWSTR,DWORD); +HMODULE WINAPI GetModuleHandleA(LPCSTR); +HMODULE WINAPI GetModuleHandleW(LPCWSTR); +#if (_WIN32_WINNT >= 0x0500) +BOOL WINAPI GetModuleHandleExA(DWORD,LPCSTR,HMODULE*); +BOOL WINAPI GetModuleHandleExW(DWORD,LPCWSTR,HMODULE*); +#endif +BOOL WINAPI GetNamedPipeHandleStateA(HANDLE,PDWORD,PDWORD,PDWORD,PDWORD,LPSTR,DWORD); +BOOL WINAPI GetNamedPipeHandleStateW(HANDLE,PDWORD,PDWORD,PDWORD,PDWORD,LPWSTR,DWORD); +BOOL WINAPI GetNamedPipeInfo(HANDLE,PDWORD,PDWORD,PDWORD,PDWORD); +#if (_WIN32_WINNT >= 0x0501) +VOID WINAPI GetNativeSystemInfo(LPSYSTEM_INFO); +#endif +BOOL WINAPI GetNumberOfEventLogRecords(HANDLE,PDWORD); +BOOL WINAPI GetOldestEventLogRecord(HANDLE,PDWORD); +BOOL WINAPI GetOverlappedResult(HANDLE,LPOVERLAPPED,PDWORD,BOOL); +DWORD WINAPI GetPriorityClass(HANDLE); +BOOL WINAPI GetPrivateObjectSecurity(PSECURITY_DESCRIPTOR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR,DWORD,PDWORD); +UINT WINAPI GetPrivateProfileIntA(LPCSTR,LPCSTR,INT,LPCSTR); +UINT WINAPI GetPrivateProfileIntW(LPCWSTR,LPCWSTR,INT,LPCWSTR); +DWORD WINAPI GetPrivateProfileSectionA(LPCSTR,LPSTR,DWORD,LPCSTR); +DWORD WINAPI GetPrivateProfileSectionW(LPCWSTR,LPWSTR,DWORD,LPCWSTR); +DWORD WINAPI GetPrivateProfileSectionNamesA(LPSTR,DWORD,LPCSTR); +DWORD WINAPI GetPrivateProfileSectionNamesW(LPWSTR,DWORD,LPCWSTR); +DWORD WINAPI GetPrivateProfileStringA(LPCSTR,LPCSTR,LPCSTR,LPSTR,DWORD,LPCSTR); +DWORD WINAPI GetPrivateProfileStringW(LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,DWORD,LPCWSTR); +BOOL WINAPI GetPrivateProfileStructA(LPCSTR,LPCSTR,LPVOID,UINT,LPCSTR); +BOOL WINAPI GetPrivateProfileStructW(LPCWSTR,LPCWSTR,LPVOID,UINT,LPCWSTR); +FARPROC WINAPI GetProcAddress(HINSTANCE,LPCSTR); +BOOL WINAPI GetProcessAffinityMask(HANDLE,PDWORD,PDWORD); +#if (_WIN32_WINNT >= 0x0502) +BOOL WINAPI GetProcessHandleCount(HANDLE,PDWORD); +#endif +HANDLE WINAPI GetProcessHeap(VOID); +DWORD WINAPI GetProcessHeaps(DWORD,PHANDLE); +#if (_WIN32_WINNT >= 0x0502) +DWORD WINAPI GetProcessId(HANDLE); +#endif +#if (_WIN32_WINNT >= 0x0500) +BOOL WINAPI GetProcessIoCounters(HANDLE,PIO_COUNTERS); +#endif +BOOL WINAPI GetProcessPriorityBoost(HANDLE,PBOOL); +BOOL WINAPI GetProcessShutdownParameters(PDWORD,PDWORD); +BOOL WINAPI GetProcessTimes(HANDLE,LPFILETIME,LPFILETIME,LPFILETIME,LPFILETIME); +DWORD WINAPI GetProcessVersion(DWORD); +HWINSTA WINAPI GetProcessWindowStation(void); +BOOL WINAPI GetProcessWorkingSetSize(HANDLE,PSIZE_T,PSIZE_T); +UINT WINAPI GetProfileIntA(LPCSTR,LPCSTR,INT); +UINT WINAPI GetProfileIntW(LPCWSTR,LPCWSTR,INT); +DWORD WINAPI GetProfileSectionA(LPCSTR,LPSTR,DWORD); +DWORD WINAPI GetProfileSectionW(LPCWSTR,LPWSTR,DWORD); +DWORD WINAPI GetProfileStringA(LPCSTR,LPCSTR,LPCSTR,LPSTR,DWORD); +DWORD WINAPI GetProfileStringW(LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,DWORD); +BOOL WINAPI GetQueuedCompletionStatus(HANDLE,PDWORD,PDWORD,LPOVERLAPPED*,DWORD); +BOOL WINAPI GetSecurityDescriptorControl(PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR_CONTROL,PDWORD); +BOOL WINAPI GetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR,LPBOOL,PACL*,LPBOOL); +BOOL WINAPI GetSecurityDescriptorGroup(PSECURITY_DESCRIPTOR,PSID*,LPBOOL); +DWORD WINAPI GetSecurityDescriptorLength(PSECURITY_DESCRIPTOR); +BOOL WINAPI GetSecurityDescriptorOwner(PSECURITY_DESCRIPTOR,PSID*,LPBOOL); +BOOL WINAPI GetSecurityDescriptorSacl(PSECURITY_DESCRIPTOR,LPBOOL,PACL*,LPBOOL); +DWORD WINAPI GetShortPathNameA(LPCSTR,LPSTR,DWORD); +DWORD WINAPI GetShortPathNameW(LPCWSTR,LPWSTR,DWORD); +PSID_IDENTIFIER_AUTHORITY WINAPI GetSidIdentifierAuthority(PSID); +DWORD WINAPI GetSidLengthRequired(UCHAR); +PDWORD WINAPI GetSidSubAuthority(PSID,DWORD); +PUCHAR WINAPI GetSidSubAuthorityCount(PSID); +VOID WINAPI GetStartupInfoA(LPSTARTUPINFOA); +VOID WINAPI GetStartupInfoW(LPSTARTUPINFOW); +HANDLE WINAPI GetStdHandle(DWORD); +UINT WINAPI GetSystemDirectoryA(LPSTR,UINT); +UINT WINAPI GetSystemDirectoryW(LPWSTR,UINT); +VOID WINAPI GetSystemInfo(LPSYSTEM_INFO); +BOOL WINAPI GetSystemPowerStatus(LPSYSTEM_POWER_STATUS); +#if (_WIN32_WINNT >= 0x0502) +BOOL WINAPI GetSystemRegistryQuota(PDWORD,PDWORD); +#endif +VOID WINAPI GetSystemTime(LPSYSTEMTIME); +#if (_WIN32_WINNT >= 0x0501) +BOOL WINAPI GetSystemTimes(LPFILETIME,LPFILETIME,LPFILETIME); +#endif +BOOL WINAPI GetSystemTimeAdjustment(PDWORD,PDWORD,PBOOL); +void WINAPI GetSystemTimeAsFileTime(LPFILETIME); +#if (_WIN32_WINNT >= 0x0500) +UINT WINAPI GetSystemWindowsDirectoryA(LPSTR,UINT); +UINT WINAPI GetSystemWindowsDirectoryW(LPWSTR,UINT); +#endif +#if (_WIN32_WINNT >= 0x0501) +UINT WINAPI GetSystemWow64DirectoryA(LPSTR,UINT); +UINT WINAPI GetSystemWow64DirectoryW(LPWSTR,UINT); +#endif +DWORD WINAPI GetTapeParameters(HANDLE,DWORD,PDWORD,PVOID); +DWORD WINAPI GetTapePosition(HANDLE,DWORD,PDWORD,PDWORD,PDWORD); +DWORD WINAPI GetTapeStatus(HANDLE); +UINT WINAPI GetTempFileNameA(LPCSTR,LPCSTR,UINT,LPSTR); +UINT WINAPI GetTempFileNameW(LPCWSTR,LPCWSTR,UINT,LPWSTR); +DWORD WINAPI GetTempPathA(DWORD,LPSTR); +DWORD WINAPI GetTempPathW(DWORD,LPWSTR); +BOOL WINAPI GetThreadContext(HANDLE,LPCONTEXT); +#if (_WIN32_WINNT >= 0x0502) +BOOL WINAPI GetThreadIOPendingFlag(HANDLE,PBOOL); +#endif +int WINAPI GetThreadPriority(HANDLE); +BOOL WINAPI GetThreadPriorityBoost(HANDLE,PBOOL); +BOOL WINAPI GetThreadSelectorEntry(HANDLE,DWORD,LPLDT_ENTRY); +BOOL WINAPI GetThreadTimes(HANDLE,LPFILETIME,LPFILETIME,LPFILETIME,LPFILETIME); +DWORD WINAPI GetTickCount(VOID); +DWORD WINAPI GetTimeZoneInformation(LPTIME_ZONE_INFORMATION); +BOOL WINAPI GetTokenInformation(HANDLE,TOKEN_INFORMATION_CLASS,PVOID,DWORD,PDWORD); +BOOL WINAPI GetUserNameA (LPSTR,PDWORD); +BOOL WINAPI GetUserNameW(LPWSTR,PDWORD); +DWORD WINAPI GetVersion(void); +BOOL WINAPI GetVersionExA(LPOSVERSIONINFOA); +BOOL WINAPI GetVersionExW(LPOSVERSIONINFOW); +BOOL WINAPI GetVolumeInformationA(LPCSTR,LPSTR,DWORD,PDWORD,PDWORD,PDWORD,LPSTR,DWORD); +BOOL WINAPI GetVolumeInformationW(LPCWSTR,LPWSTR,DWORD,PDWORD,PDWORD,PDWORD,LPWSTR,DWORD); +#if (_WIN32_WINNT >= 0x0500) +BOOL WINAPI GetVolumeNameForVolumeMountPointA(LPCSTR,LPSTR,DWORD); +BOOL WINAPI GetVolumeNameForVolumeMountPointW(LPCWSTR,LPWSTR,DWORD); +BOOL WINAPI GetVolumePathNameA(LPCSTR,LPSTR,DWORD); +BOOL WINAPI GetVolumePathNameW(LPCWSTR,LPWSTR,DWORD); +#endif +#if (_WIN32_WINNT >= 0x0501) +BOOL WINAPI GetVolumePathNamesForVolumeNameA(LPCSTR,LPSTR,DWORD,PDWORD); +BOOL WINAPI GetVolumePathNamesForVolumeNameW(LPCWSTR,LPWSTR,DWORD,PDWORD); +#endif +UINT WINAPI GetWindowsDirectoryA(LPSTR,UINT); +UINT WINAPI GetWindowsDirectoryW(LPWSTR,UINT); +DWORD WINAPI GetWindowThreadProcessId(HWND,PDWORD); +UINT GetWriteWatch(DWORD,PVOID,SIZE_T,PVOID*,PULONG_PTR,PULONG); +ATOM WINAPI GlobalAddAtomA(LPCSTR); +ATOM WINAPI GlobalAddAtomW( LPCWSTR); +HGLOBAL WINAPI GlobalAlloc(UINT,DWORD); +SIZE_T WINAPI GlobalCompact(DWORD); /* Obsolete: Has no effect. */ +ATOM WINAPI GlobalDeleteAtom(ATOM); +HGLOBAL GlobalDiscard(HGLOBAL); +ATOM WINAPI GlobalFindAtomA(LPCSTR); +ATOM WINAPI GlobalFindAtomW(LPCWSTR); +VOID WINAPI GlobalFix(HGLOBAL); /* Obsolete: Has no effect. */ +UINT WINAPI GlobalFlags(HGLOBAL); /* Obsolete: Has no effect. */ +HGLOBAL WINAPI GlobalFree(HGLOBAL); +UINT WINAPI GlobalGetAtomNameA(ATOM,LPSTR,int); +UINT WINAPI GlobalGetAtomNameW(ATOM,LPWSTR,int); +HGLOBAL WINAPI GlobalHandle(PCVOID); +LPVOID WINAPI GlobalLock(HGLOBAL); +VOID WINAPI GlobalMemoryStatus(LPMEMORYSTATUS); +#if (_WIN32_WINNT >= 0x0500) +BOOL WINAPI GlobalMemoryStatusEx(LPMEMORYSTATUSEX); +#endif +HGLOBAL WINAPI GlobalReAlloc(HGLOBAL,DWORD,UINT); +DWORD WINAPI GlobalSize(HGLOBAL); +VOID WINAPI GlobalUnfix(HGLOBAL); /* Obsolete: Has no effect. */ +BOOL WINAPI GlobalUnlock(HGLOBAL); +BOOL WINAPI GlobalUnWire(HGLOBAL); /* Obsolete: Has no effect. */ +PVOID WINAPI GlobalWire(HGLOBAL); /* Obsolete: Has no effect. */ +#define HasOverlappedIoCompleted(lpOverlapped) ((lpOverlapped)->Internal != STATUS_PENDING) +PVOID WINAPI HeapAlloc(HANDLE,DWORD,DWORD); +SIZE_T WINAPI HeapCompact(HANDLE,DWORD); +HANDLE WINAPI HeapCreate(DWORD,DWORD,DWORD); +BOOL WINAPI HeapDestroy(HANDLE); +BOOL WINAPI HeapFree(HANDLE,DWORD,PVOID); +BOOL WINAPI HeapLock(HANDLE); +#if (_WIN32_WINNT >= 0x0501) +BOOL WINAPI HeapQueryInformation(HANDLE,HEAP_INFORMATION_CLASS,PVOID,SIZE_T,PSIZE_T); +#endif +PVOID WINAPI HeapReAlloc(HANDLE,DWORD,PVOID,DWORD); +#if (_WIN32_WINNT >= 0x0501) +BOOL WINAPI HeapSetInformation(HANDLE,HEAP_INFORMATION_CLASS,PVOID,SIZE_T); +#endif +DWORD WINAPI HeapSize(HANDLE,DWORD,PCVOID); +BOOL WINAPI HeapUnlock(HANDLE); +BOOL WINAPI HeapValidate(HANDLE,DWORD,PCVOID); +BOOL WINAPI HeapWalk(HANDLE,LPPROCESS_HEAP_ENTRY); +BOOL WINAPI ImpersonateLoggedOnUser(HANDLE); +BOOL WINAPI ImpersonateNamedPipeClient(HANDLE); +BOOL WINAPI ImpersonateSelf(SECURITY_IMPERSONATION_LEVEL); +BOOL WINAPI InitAtomTable(DWORD); +BOOL WINAPI InitializeAcl(PACL,DWORD,DWORD); +VOID WINAPI InitializeCriticalSection(LPCRITICAL_SECTION); +BOOL WINAPI InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION,DWORD); +DWORD WINAPI SetCriticalSectionSpinCount(LPCRITICAL_SECTION,DWORD); +BOOL WINAPI InitializeSecurityDescriptor(PSECURITY_DESCRIPTOR,DWORD); +BOOL WINAPI InitializeSid (PSID,PSID_IDENTIFIER_AUTHORITY,BYTE); +#if (_WIN32_WINNT >= 0x0501) +VOID WINAPI InitializeSListHead(PSLIST_HEADER); +#endif +#ifndef __INTERLOCKED_DECLARED +#define __INTERLOCKED_DECLARED +LONG WINAPI InterlockedCompareExchange(LPLONG,LONG,LONG); +/* PVOID WINAPI InterlockedCompareExchangePointer(PVOID*,PVOID,PVOID); */ +#define InterlockedCompareExchangePointer(d,e,c) \ + (PVOID)InterlockedCompareExchange((LPLONG)(d),(LONG)(e),(LONG)(c)) +LONG WINAPI InterlockedDecrement(LPLONG); +LONG WINAPI InterlockedExchange(LPLONG,LONG); +/* PVOID WINAPI InterlockedExchangePointer(PVOID*,PVOID); */ +#define InterlockedExchangePointer(t,v) \ + (PVOID)InterlockedExchange((LPLONG)(t),(LONG)(v)) +LONG WINAPI InterlockedExchangeAdd(LPLONG,LONG); +#if (_WIN32_WINNT >= 0x0501) +PSLIST_ENTRY WINAPI InterlockedFlushSList(PSLIST_HEADER); +#endif +LONG WINAPI InterlockedIncrement(LPLONG); +#if (_WIN32_WINNT >= 0x0501) +PSLIST_ENTRY WINAPI InterlockedPopEntrySList(PSLIST_HEADER); +PSLIST_ENTRY WINAPI InterlockedPushEntrySList(PSLIST_HEADER,PSLIST_ENTRY); +#endif +#endif /* __INTERLOCKED_DECLARED */ +BOOL WINAPI IsBadCodePtr(FARPROC); +BOOL WINAPI IsBadHugeReadPtr(PCVOID,UINT); +BOOL WINAPI IsBadHugeWritePtr(PVOID,UINT); +BOOL WINAPI IsBadReadPtr(PCVOID,UINT); +BOOL WINAPI IsBadStringPtrA(LPCSTR,UINT); +BOOL WINAPI IsBadStringPtrW(LPCWSTR,UINT); +BOOL WINAPI IsBadWritePtr(PVOID,UINT); +BOOL WINAPI IsDebuggerPresent(void); +#if (_WIN32_WINNT >= 0x0501) +BOOL IsProcessInJob(HANDLE,HANDLE,PBOOL); +#endif +BOOL WINAPI IsProcessorFeaturePresent(DWORD); +BOOL WINAPI IsSystemResumeAutomatic(void); +BOOL WINAPI IsTextUnicode(PCVOID,int,LPINT); +BOOL WINAPI IsValidAcl(PACL); +BOOL WINAPI IsValidSecurityDescriptor(PSECURITY_DESCRIPTOR); +BOOL WINAPI IsValidSid(PSID); +#if (_WIN32_WINNT >= 0x0501) +BOOL IsWow64Process(HANDLE,PBOOL); +#endif +void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION); +#define LimitEmsPages(n) +HINSTANCE WINAPI LoadLibraryA(LPCSTR); +HINSTANCE WINAPI LoadLibraryExA(LPCSTR,HANDLE,DWORD); +HINSTANCE WINAPI LoadLibraryExW(LPCWSTR,HANDLE,DWORD); +HINSTANCE WINAPI LoadLibraryW(LPCWSTR); +DWORD WINAPI LoadModule(LPCSTR,PVOID); +HGLOBAL WINAPI LoadResource(HINSTANCE,HRSRC); +HLOCAL WINAPI LocalAlloc(UINT,SIZE_T); +SIZE_T WINAPI LocalCompact(UINT); /* Obsolete: Has no effect. */ +HLOCAL LocalDiscard(HLOCAL); +BOOL WINAPI LocalFileTimeToFileTime(CONST FILETIME *,LPFILETIME); +UINT WINAPI LocalFlags(HLOCAL); /* Obsolete: Has no effect. */ +HLOCAL WINAPI LocalFree(HLOCAL); +HLOCAL WINAPI LocalHandle(LPCVOID); +PVOID WINAPI LocalLock(HLOCAL); +HLOCAL WINAPI LocalReAlloc(HLOCAL,SIZE_T,UINT); +SIZE_T WINAPI LocalShrink(HLOCAL,UINT); /* Obsolete: Has no effect. */ +UINT WINAPI LocalSize(HLOCAL); +BOOL WINAPI LocalUnlock(HLOCAL); +BOOL WINAPI LockFile(HANDLE,DWORD,DWORD,DWORD,DWORD); +BOOL WINAPI LockFileEx(HANDLE,DWORD,DWORD,DWORD,DWORD,LPOVERLAPPED); +PVOID WINAPI LockResource(HGLOBAL); +#define LockSegment(w) GlobalFix((HANDLE)(w)) /* Obsolete: Has no effect. */ +BOOL WINAPI LogonUserA(LPSTR,LPSTR,LPSTR,DWORD,DWORD,PHANDLE); +BOOL WINAPI LogonUserW(LPWSTR,LPWSTR,LPWSTR,DWORD,DWORD,PHANDLE); +BOOL WINAPI LookupAccountNameA(LPCSTR,LPCSTR,PSID,PDWORD,LPSTR,PDWORD,PSID_NAME_USE); +BOOL WINAPI LookupAccountNameW(LPCWSTR,LPCWSTR,PSID,PDWORD,LPWSTR,PDWORD,PSID_NAME_USE); +BOOL WINAPI LookupAccountSidA(LPCSTR,PSID,LPSTR,PDWORD,LPSTR,PDWORD,PSID_NAME_USE); +BOOL WINAPI LookupAccountSidW(LPCWSTR,PSID,LPWSTR,PDWORD,LPWSTR,PDWORD,PSID_NAME_USE); +BOOL WINAPI LookupPrivilegeDisplayNameA(LPCSTR,LPCSTR,LPSTR,PDWORD,PDWORD); +BOOL WINAPI LookupPrivilegeDisplayNameW(LPCWSTR,LPCWSTR,LPWSTR,PDWORD,PDWORD); +BOOL WINAPI LookupPrivilegeNameA(LPCSTR,PLUID,LPSTR,PDWORD); +BOOL WINAPI LookupPrivilegeNameW(LPCWSTR,PLUID,LPWSTR,PDWORD); +BOOL WINAPI LookupPrivilegeValueA(LPCSTR,LPCSTR,PLUID); +BOOL WINAPI LookupPrivilegeValueW(LPCWSTR,LPCWSTR,PLUID); +LPSTR WINAPI lstrcatA(LPSTR,LPCSTR); +LPWSTR WINAPI lstrcatW(LPWSTR,LPCWSTR); +int WINAPI lstrcmpA(LPCSTR,LPCSTR); +int WINAPI lstrcmpiA(LPCSTR,LPCSTR); +int WINAPI lstrcmpiW( LPCWSTR,LPCWSTR); +int WINAPI lstrcmpW(LPCWSTR,LPCWSTR); +LPSTR WINAPI lstrcpyA(LPSTR,LPCSTR); +LPSTR WINAPI lstrcpynA(LPSTR,LPCSTR,int); +LPWSTR WINAPI lstrcpynW(LPWSTR,LPCWSTR,int); +LPWSTR WINAPI lstrcpyW(LPWSTR,LPCWSTR); +int WINAPI lstrlenA(LPCSTR); +int WINAPI lstrlenW(LPCWSTR); +BOOL WINAPI MakeAbsoluteSD(PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR,PDWORD,PACL,PDWORD,PACL,PDWORD,PSID,PDWORD,PSID,PDWORD); +#define MakeProcInstance(p,i) (p) +BOOL WINAPI MakeSelfRelativeSD(PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR,PDWORD); +VOID WINAPI MapGenericMask(PDWORD,PGENERIC_MAPPING); +PVOID WINAPI MapViewOfFile(HANDLE,DWORD,DWORD,DWORD,DWORD); +PVOID WINAPI MapViewOfFileEx(HANDLE,DWORD,DWORD,DWORD,DWORD,PVOID); +BOOL WINAPI MoveFileA(LPCSTR,LPCSTR); +BOOL WINAPI MoveFileExA(LPCSTR,LPCSTR,DWORD); +BOOL WINAPI MoveFileExW(LPCWSTR,LPCWSTR,DWORD); +BOOL WINAPI MoveFileW(LPCWSTR,LPCWSTR); +int WINAPI MulDiv(int,int,int); +BOOL WINAPI NotifyChangeEventLog(HANDLE,HANDLE); +BOOL WINAPI ObjectCloseAuditAlarmA(LPCSTR,PVOID,BOOL); +BOOL WINAPI ObjectCloseAuditAlarmW(LPCWSTR,PVOID,BOOL); +BOOL WINAPI ObjectDeleteAuditAlarmA(LPCSTR,PVOID,BOOL); +BOOL WINAPI ObjectDeleteAuditAlarmW(LPCWSTR,PVOID,BOOL); +BOOL WINAPI ObjectOpenAuditAlarmA(LPCSTR,PVOID,LPSTR,LPSTR,PSECURITY_DESCRIPTOR,HANDLE,DWORD,DWORD,PPRIVILEGE_SET,BOOL,BOOL,PBOOL); +BOOL WINAPI ObjectOpenAuditAlarmW(LPCWSTR,PVOID,LPWSTR,LPWSTR,PSECURITY_DESCRIPTOR,HANDLE,DWORD,DWORD,PPRIVILEGE_SET,BOOL,BOOL,PBOOL); +BOOL WINAPI ObjectPrivilegeAuditAlarmA(LPCSTR,PVOID,HANDLE,DWORD,PPRIVILEGE_SET,BOOL); +BOOL WINAPI ObjectPrivilegeAuditAlarmW(LPCWSTR,PVOID,HANDLE,DWORD,PPRIVILEGE_SET,BOOL); +HANDLE WINAPI OpenBackupEventLogA(LPCSTR,LPCSTR); +HANDLE WINAPI OpenBackupEventLogW(LPCWSTR,LPCWSTR); +HANDLE WINAPI OpenEventA(DWORD,BOOL,LPCSTR); +HANDLE WINAPI OpenEventLogA (LPCSTR,LPCSTR); +HANDLE WINAPI OpenEventLogW(LPCWSTR,LPCWSTR); +HANDLE WINAPI OpenEventW(DWORD,BOOL,LPCWSTR); +HFILE WINAPI OpenFile(LPCSTR,LPOFSTRUCT,UINT); +HANDLE WINAPI OpenFileMappingA(DWORD,BOOL,LPCSTR); +HANDLE WINAPI OpenFileMappingW(DWORD,BOOL,LPCWSTR); +HANDLE WINAPI OpenMutexA(DWORD,BOOL,LPCSTR); +HANDLE WINAPI OpenMutexW(DWORD,BOOL,LPCWSTR); +HANDLE WINAPI OpenProcess(DWORD,BOOL,DWORD); +BOOL WINAPI OpenProcessToken(HANDLE,DWORD,PHANDLE); +HANDLE WINAPI OpenSemaphoreA(DWORD,BOOL,LPCSTR); +HANDLE WINAPI OpenSemaphoreW(DWORD,BOOL,LPCWSTR); +#if (_WIN32_WINNT >= 0x0500) || (_WIN32_WINDOWS >= 0x0490) +HANDLE WINAPI OpenThread(DWORD,BOOL,DWORD); +#endif +BOOL WINAPI OpenThreadToken(HANDLE,DWORD,BOOL,PHANDLE); +HANDLE WINAPI OpenWaitableTimerA(DWORD,BOOL,LPCSTR); +HANDLE WINAPI OpenWaitableTimerW(DWORD,BOOL,LPCWSTR); +void WINAPI OutputDebugStringA(LPCSTR); +void WINAPI OutputDebugStringW(LPCWSTR); +BOOL WINAPI PeekNamedPipe(HANDLE,PVOID,DWORD,PDWORD,PDWORD,PDWORD); +BOOL WINAPI PostQueuedCompletionStatus(HANDLE,DWORD,DWORD,LPOVERLAPPED); +DWORD WINAPI PrepareTape(HANDLE,DWORD,BOOL); +BOOL WINAPI PrivilegeCheck (HANDLE,PPRIVILEGE_SET,PBOOL); +BOOL WINAPI PrivilegedServiceAuditAlarmA(LPCSTR,LPCSTR,HANDLE,PPRIVILEGE_SET,BOOL); +BOOL WINAPI PrivilegedServiceAuditAlarmW(LPCWSTR,LPCWSTR,HANDLE,PPRIVILEGE_SET,BOOL); +#if (_WIN32_WINNT >= 0x0500) +BOOL WINAPI ProcessIdToSessionId(DWORD,DWORD*); +#endif +BOOL WINAPI PulseEvent(HANDLE); +BOOL WINAPI PurgeComm(HANDLE,DWORD); +#if (_WIN32_WINNT >= 0x0501) +BOOL WINAPI QueryActCtxW(DWORD,HANDLE,PVOID,ULONG,PVOID,SIZE_T,SIZE_T*); +#endif +DWORD WINAPI QueryDosDeviceA(LPCSTR,LPSTR,DWORD); +DWORD WINAPI QueryDosDeviceW(LPCWSTR,LPWSTR,DWORD); +#if (_WIN32_WINNT >= 0x0501) +BOOL WINAPI QueryMemoryResourceNotification(HANDLE,PBOOL); +#endif +BOOL WINAPI QueryPerformanceCounter(PLARGE_INTEGER); +BOOL WINAPI QueryPerformanceFrequency(PLARGE_INTEGER); +DWORD WINAPI QueueUserAPC(PAPCFUNC,HANDLE,DWORD); +void WINAPI RaiseException(DWORD,DWORD,DWORD,const DWORD*); +BOOL WINAPI ReadDirectoryChangesW(HANDLE,PVOID,DWORD,BOOL,DWORD,PDWORD,LPOVERLAPPED,LPOVERLAPPED_COMPLETION_ROUTINE); +BOOL WINAPI ReadEventLogA(HANDLE,DWORD,DWORD,PVOID,DWORD,DWORD *,DWORD *); +BOOL WINAPI ReadEventLogW(HANDLE,DWORD,DWORD,PVOID,DWORD,DWORD *,DWORD *); +BOOL WINAPI ReadFile(HANDLE,PVOID,DWORD,PDWORD,LPOVERLAPPED); +BOOL WINAPI ReadFileEx(HANDLE,PVOID,DWORD,LPOVERLAPPED,LPOVERLAPPED_COMPLETION_ROUTINE); +BOOL WINAPI ReadFileScatter(HANDLE,FILE_SEGMENT_ELEMENT*,DWORD,LPDWORD,LPOVERLAPPED); +BOOL WINAPI ReadProcessMemory(HANDLE,PCVOID,PVOID,DWORD,PDWORD); +HANDLE WINAPI RegisterEventSourceA (LPCSTR,LPCSTR); +HANDLE WINAPI RegisterEventSourceW(LPCWSTR,LPCWSTR); +#if (_WIN32_WINNT >= 0x0501) +void WINAPI ReleaseActCtx(HANDLE); +#endif +BOOL WINAPI ReleaseMutex(HANDLE); +BOOL WINAPI ReleaseSemaphore(HANDLE,LONG,LPLONG); +BOOL WINAPI RemoveDirectoryA(LPCSTR); +BOOL WINAPI RemoveDirectoryW(LPCWSTR); +#if (_WIN32_WINNT >= 0x0500) +ULONG WINAPI RemoveVectoredExceptionHandler(PVOID); +#endif +#if (_WIN32_WINNT >= 0x0500) +BOOL WINAPI ReplaceFileA(LPCSTR,LPCSTR,LPCSTR,DWORD,LPVOID,LPVOID); +BOOL WINAPI ReplaceFileW(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,LPVOID,LPVOID); +#endif +BOOL WINAPI ReportEventA(HANDLE,WORD,WORD,DWORD,PSID,WORD,DWORD,LPCSTR*,PVOID); +BOOL WINAPI ReportEventW(HANDLE,WORD,WORD,DWORD,PSID,WORD,DWORD,LPCWSTR*,PVOID); +BOOL WINAPI ResetEvent(HANDLE); +UINT WINAPI ResetWriteWatch(LPVOID,SIZE_T); +#if (_WIN32_WINNT >= 0x0510) +VOID WINAPI RestoreLastError(DWORD); +#endif +DWORD WINAPI ResumeThread(HANDLE); +BOOL WINAPI RevertToSelf(void); +DWORD WINAPI SearchPathA(LPCSTR,LPCSTR,LPCSTR,DWORD,LPSTR,LPSTR*); +DWORD WINAPI SearchPathW(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,LPWSTR,LPWSTR*); +BOOL WINAPI SetAclInformation(PACL,PVOID,DWORD,ACL_INFORMATION_CLASS); +BOOL WINAPI SetCommBreak(HANDLE); +BOOL WINAPI SetCommConfig(HANDLE,LPCOMMCONFIG,DWORD); +BOOL WINAPI SetCommMask(HANDLE,DWORD); +BOOL WINAPI SetCommState(HANDLE,LPDCB); +BOOL WINAPI SetCommTimeouts(HANDLE,LPCOMMTIMEOUTS); +BOOL WINAPI SetComputerNameA(LPCSTR); +BOOL WINAPI SetComputerNameW(LPCWSTR); +#if (_WIN32_WINNT >= 0x0500) +BOOL WINAPI SetComputerNameExA(COMPUTER_NAME_FORMAT,LPCSTR); +BOOL WINAPI SetComputerNameExW(COMPUTER_NAME_FORMAT,LPCWSTR); +#endif +BOOL WINAPI SetCurrentDirectoryA(LPCSTR); +BOOL WINAPI SetCurrentDirectoryW(LPCWSTR); +BOOL WINAPI SetDefaultCommConfigA(LPCSTR,LPCOMMCONFIG,DWORD); +BOOL WINAPI SetDefaultCommConfigW(LPCWSTR,LPCOMMCONFIG,DWORD); +#if (_WIN32_WINNT >= 0x0502) +BOOL WINAPI SetDllDirectoryA(LPCSTR); +BOOL WINAPI SetDllDirectoryW(LPCWSTR); +#endif +BOOL WINAPI SetEndOfFile(HANDLE); +BOOL WINAPI SetEnvironmentVariableA(LPCSTR,LPCSTR); +BOOL WINAPI SetEnvironmentVariableW(LPCWSTR,LPCWSTR); +UINT WINAPI SetErrorMode(UINT); +BOOL WINAPI SetEvent(HANDLE); +VOID WINAPI SetFileApisToANSI(void); +VOID WINAPI SetFileApisToOEM(void); +BOOL WINAPI SetFileAttributesA(LPCSTR,DWORD); +BOOL WINAPI SetFileAttributesW(LPCWSTR,DWORD); +DWORD WINAPI SetFilePointer(HANDLE,LONG,PLONG,DWORD); +BOOL WINAPI SetFilePointerEx(HANDLE,LARGE_INTEGER,PLARGE_INTEGER,DWORD); +BOOL WINAPI SetFileSecurityA(LPCSTR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR); +BOOL WINAPI SetFileSecurityW(LPCWSTR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR); +#if (_WIN32_WINNT >= 0x0501) +BOOL WINAPI SetFileShortNameA(HANDLE,LPCSTR); +BOOL WINAPI SetFileShortNameW(HANDLE,LPCWSTR); +#endif +BOOL WINAPI SetFileTime(HANDLE,const FILETIME*,const FILETIME*,const FILETIME*); +#if (_WIN32_WINNT >= 0x0501) +BOOL WINAPI SetFileValidData(HANDLE,LONGLONG); +#endif +#if (_WIN32_WINNT >= 0x0502) +BOOL WINAPI SetFirmwareEnvironmentVariableA(LPCSTR,LPCSTR,PVOID,DWORD); +BOOL WINAPI SetFirmwareEnvironmentVariableW(LPCWSTR,LPCWSTR,PVOID,DWORD); +#endif +UINT WINAPI SetHandleCount(UINT); +BOOL WINAPI SetHandleInformation(HANDLE,DWORD,DWORD); +BOOL WINAPI SetKernelObjectSecurity(HANDLE,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR); +void WINAPI SetLastError(DWORD); +void WINAPI SetLastErrorEx(DWORD,DWORD); +BOOL WINAPI SetLocalTime(const SYSTEMTIME*); +BOOL WINAPI SetMailslotInfo(HANDLE,DWORD); +BOOL WINAPI SetNamedPipeHandleState(HANDLE,PDWORD,PDWORD,PDWORD); +BOOL WINAPI SetPriorityClass(HANDLE,DWORD); +BOOL WINAPI SetPrivateObjectSecurity(SECURITY_INFORMATION,PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR *,PGENERIC_MAPPING,HANDLE); +BOOL WINAPI SetProcessAffinityMask(HANDLE,DWORD); +BOOL WINAPI SetProcessPriorityBoost(HANDLE,BOOL); +BOOL WINAPI SetProcessShutdownParameters(DWORD,DWORD); +BOOL WINAPI SetProcessWorkingSetSize(HANDLE,DWORD,DWORD); +BOOL WINAPI SetSecurityDescriptorControl(PSECURITY_DESCRIPTOR,SECURITY_DESCRIPTOR_CONTROL,SECURITY_DESCRIPTOR_CONTROL); +BOOL WINAPI SetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR,BOOL,PACL,BOOL); +BOOL WINAPI SetSecurityDescriptorGroup(PSECURITY_DESCRIPTOR,PSID,BOOL); +BOOL WINAPI SetSecurityDescriptorOwner(PSECURITY_DESCRIPTOR,PSID,BOOL); +BOOL WINAPI SetSecurityDescriptorSacl(PSECURITY_DESCRIPTOR,BOOL,PACL,BOOL); +BOOL WINAPI SetStdHandle(DWORD,HANDLE); +#define SetSwapAreaSize(w) (w) +BOOL WINAPI SetSystemPowerState(BOOL,BOOL); +BOOL WINAPI SetSystemTime(const SYSTEMTIME*); +BOOL WINAPI SetSystemTimeAdjustment(DWORD,BOOL); +DWORD WINAPI SetTapeParameters(HANDLE,DWORD,PVOID); +DWORD WINAPI SetTapePosition(HANDLE,DWORD,DWORD,DWORD,DWORD,BOOL); +DWORD WINAPI SetThreadAffinityMask(HANDLE,DWORD); +BOOL WINAPI SetThreadContext(HANDLE,const CONTEXT*); +DWORD WINAPI SetThreadIdealProcessor(HANDLE,DWORD); +BOOL WINAPI SetThreadPriority(HANDLE,int); +BOOL WINAPI SetThreadPriorityBoost(HANDLE,BOOL); +BOOL WINAPI SetThreadToken (PHANDLE,HANDLE); +BOOL WINAPI SetTimeZoneInformation(const TIME_ZONE_INFORMATION *); +BOOL WINAPI SetTokenInformation(HANDLE,TOKEN_INFORMATION_CLASS,PVOID,DWORD); +LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER); +BOOL WINAPI SetupComm(HANDLE,DWORD,DWORD); +BOOL WINAPI SetVolumeLabelA(LPCSTR,LPCSTR); +BOOL WINAPI SetVolumeLabelW(LPCWSTR,LPCWSTR); +#if (_WIN32_WINNT >= 0x0500) +BOOL WINAPI SetVolumeMountPointA(LPCSTR,LPCSTR); +BOOL WINAPI SetVolumeMountPointW(LPCWSTR,LPCWSTR); +#endif +BOOL WINAPI SetWaitableTimer(HANDLE,const LARGE_INTEGER*,LONG,PTIMERAPCROUTINE,PVOID,BOOL); +DWORD WINAPI SignalObjectAndWait(HANDLE,HANDLE,DWORD,BOOL); +DWORD WINAPI SizeofResource(HINSTANCE,HRSRC); +void WINAPI Sleep(DWORD); +DWORD WINAPI SleepEx(DWORD,BOOL); +DWORD WINAPI SuspendThread(HANDLE); +void WINAPI SwitchToFiber(PVOID); +BOOL WINAPI SwitchToThread(void); +BOOL WINAPI SystemTimeToFileTime(const SYSTEMTIME*,LPFILETIME); +BOOL WINAPI SystemTimeToTzSpecificLocalTime(LPTIME_ZONE_INFORMATION,LPSYSTEMTIME,LPSYSTEMTIME); +BOOL WINAPI TerminateProcess(HANDLE,UINT); +BOOL WINAPI TerminateThread(HANDLE,DWORD); +DWORD WINAPI TlsAlloc(VOID); +BOOL WINAPI TlsFree(DWORD); +PVOID WINAPI TlsGetValue(DWORD); +BOOL WINAPI TlsSetValue(DWORD,PVOID); +BOOL WINAPI TransactNamedPipe(HANDLE,PVOID,DWORD,PVOID,DWORD,PDWORD,LPOVERLAPPED); +BOOL WINAPI TransmitCommChar(HANDLE,char); +BOOL WINAPI TryEnterCriticalSection(LPCRITICAL_SECTION); +LONG WINAPI UnhandledExceptionFilter(LPEXCEPTION_POINTERS); +BOOL WINAPI UnlockFile(HANDLE,DWORD,DWORD,DWORD,DWORD); +BOOL WINAPI UnlockFileEx(HANDLE,DWORD,DWORD,DWORD,LPOVERLAPPED); +#define UnlockResource(h) (h) +#define UnlockSegment(w) GlobalUnfix((HANDLE)(w)) /* Obsolete: Has no effect. */ +BOOL WINAPI UnmapViewOfFile(PVOID); +#if (_WIN32_WINNT >= 0x0500) +BOOL WINAPI UnregisterWaitEx(HANDLE,HANDLE); +#endif +BOOL WINAPI UpdateResourceA(HANDLE,LPCSTR,LPCSTR,WORD,PVOID,DWORD); +BOOL WINAPI UpdateResourceW(HANDLE,LPCWSTR,LPCWSTR,WORD,PVOID,DWORD); +BOOL WINAPI VerifyVersionInfoA(LPOSVERSIONINFOEXA,DWORD,DWORDLONG); +BOOL WINAPI VerifyVersionInfoW(LPOSVERSIONINFOEXW,DWORD,DWORDLONG); +PVOID WINAPI VirtualAlloc(PVOID,DWORD,DWORD,DWORD); +PVOID WINAPI VirtualAllocEx(HANDLE,PVOID,DWORD,DWORD,DWORD); +BOOL WINAPI VirtualFree(PVOID,DWORD,DWORD); +BOOL WINAPI VirtualFreeEx(HANDLE,PVOID,DWORD,DWORD); +BOOL WINAPI VirtualLock(PVOID,DWORD); +BOOL WINAPI VirtualProtect(PVOID,DWORD,DWORD,PDWORD); +BOOL WINAPI VirtualProtectEx(HANDLE,PVOID,DWORD,DWORD,PDWORD); +DWORD WINAPI VirtualQuery(LPCVOID,PMEMORY_BASIC_INFORMATION,DWORD); +DWORD WINAPI VirtualQueryEx(HANDLE,LPCVOID,PMEMORY_BASIC_INFORMATION,DWORD); +BOOL WINAPI VirtualUnlock(PVOID,DWORD); +BOOL WINAPI WaitCommEvent(HANDLE,PDWORD,LPOVERLAPPED); +BOOL WINAPI WaitForDebugEvent(LPDEBUG_EVENT,DWORD); +DWORD WINAPI WaitForMultipleObjects(DWORD,const HANDLE*,BOOL,DWORD); +DWORD WINAPI WaitForMultipleObjectsEx(DWORD,const HANDLE*,BOOL,DWORD,BOOL); +DWORD WINAPI WaitForSingleObject(HANDLE,DWORD); +DWORD WINAPI WaitForSingleObjectEx(HANDLE,DWORD,BOOL); +BOOL WINAPI WaitNamedPipeA(LPCSTR,DWORD); +BOOL WINAPI WaitNamedPipeW(LPCWSTR,DWORD); +BOOL WINAPI WinLoadTrustProvider(GUID*); +BOOL WINAPI WriteFile(HANDLE,PCVOID,DWORD,PDWORD,LPOVERLAPPED); +BOOL WINAPI WriteFileEx(HANDLE,PCVOID,DWORD,LPOVERLAPPED,LPOVERLAPPED_COMPLETION_ROUTINE); +BOOL WINAPI WriteFileGather(HANDLE,FILE_SEGMENT_ELEMENT*,DWORD,LPDWORD,LPOVERLAPPED); +BOOL WINAPI WritePrivateProfileSectionA(LPCSTR,LPCSTR,LPCSTR); +BOOL WINAPI WritePrivateProfileSectionW(LPCWSTR,LPCWSTR,LPCWSTR); +BOOL WINAPI WritePrivateProfileStringA(LPCSTR,LPCSTR,LPCSTR,LPCSTR); +BOOL WINAPI WritePrivateProfileStringW(LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR); +BOOL WINAPI WritePrivateProfileStructA(LPCSTR,LPCSTR,LPVOID,UINT,LPCSTR); +BOOL WINAPI WritePrivateProfileStructW(LPCWSTR,LPCWSTR,LPVOID,UINT,LPCWSTR); +BOOL WINAPI WriteProcessMemory(HANDLE,LPVOID,LPCVOID,SIZE_T,SIZE_T*); +BOOL WINAPI WriteProfileSectionA(LPCSTR,LPCSTR); +BOOL WINAPI WriteProfileSectionW(LPCWSTR,LPCWSTR); +BOOL WINAPI WriteProfileStringA(LPCSTR,LPCSTR,LPCSTR); +BOOL WINAPI WriteProfileStringW(LPCWSTR,LPCWSTR,LPCWSTR); +DWORD WINAPI WriteTapemark(HANDLE,DWORD,DWORD,BOOL); +#define Yield() +#if (_WIN32_WINNT >= 0x0501) +BOOL WINAPI ZombifyActCtx(HANDLE); +#endif +#if (_WIN32_WINNT >= 0x0500) +BOOL WINAPI AllocateUserPhysicalPages(HANDLE,PULONG_PTR,PULONG_PTR); +BOOL WINAPI FreeUserPhysicalPages(HANDLE,PULONG_PTR,PULONG_PTR); +BOOL WINAPI MapUserPhysicalPages(PVOID,ULONG_PTR,PULONG_PTR); +BOOL WINAPI MapUserPhysicalPagesScatter(PVOID*,ULONG_PTR,PULONG_PTR); +#endif + +#ifdef UNICODE +typedef STARTUPINFOW STARTUPINFO,*LPSTARTUPINFO; +typedef WIN32_FIND_DATAW WIN32_FIND_DATA,*LPWIN32_FIND_DATA; +typedef HW_PROFILE_INFOW HW_PROFILE_INFO,*LPHW_PROFILE_INFO; +#if (_WIN32_WINNT >= 0x0501) +typedef ACTCTXW ACTCTX,*PACTCTX; +typedef PCACTCTXW PCACTCTX; +#endif +#define AccessCheckAndAuditAlarm AccessCheckAndAuditAlarmW +#define AddAtom AddAtomW +#define BackupEventLog BackupEventLogW +#define BeginUpdateResource BeginUpdateResourceW +#define BuildCommDCB BuildCommDCBW +#define BuildCommDCBAndTimeouts BuildCommDCBAndTimeoutsW +#define CallNamedPipe CallNamedPipeW +#if (_WIN32_WINNT >= 0x0501) +#define CheckNameLegalDOS8Dot3 CheckNameLegalDOS8Dot3W +#endif +#define ClearEventLog ClearEventLogW +#define CommConfigDialog CommConfigDialogW +#define CopyFile CopyFileW +#define CopyFileEx CopyFileExW +#if (_WIN32_WINNT >= 0x0501) +#define CreateActCtx CreateActCtxW +#endif +#define CreateDirectory CreateDirectoryW +#define CreateDirectoryEx CreateDirectoryExW +#define CreateEvent CreateEventW +#define CreateFile CreateFileW +#define CreateFileMapping CreateFileMappingW +#if (_WIN32_WINNT >= 0x0500) +#define CreateHardLink CreateHardLinkW +#define CreateJobObject CreateJobObjectW +#endif +#define CreateMailslot CreateMailslotW +#define CreateMutex CreateMutexW +#define CreateNamedPipe CreateNamedPipeW +#define CreateProcess CreateProcessW +#define CreateProcessAsUser CreateProcessAsUserW +#define CreateSemaphore CreateSemaphoreW +#define CreateWaitableTimer CreateWaitableTimerW +#define DefineDosDevice DefineDosDeviceW +#define DeleteFile DeleteFileW +#if (_WIN32_WINNT >= 0x0500) +#define DeleteVolumeMountPoint DeleteVolumeMountPointW +#define DnsHostnameToComputerName DnsHostnameToComputerNameW +#endif +#define EncryptFile EncryptFileW +#define EndUpdateResource EndUpdateResourceW +#define EnumResourceLanguages EnumResourceLanguagesW +#define EnumResourceNames EnumResourceNamesW +#define EnumResourceTypes EnumResourceTypesW +#define ExpandEnvironmentStrings ExpandEnvironmentStringsW +#define FatalAppExit FatalAppExitW +#define FileEncryptionStatus FileEncryptionStatusW +#if (_WIN32_WINNT >= 0x0501) +#define FindActCtxSectionString FindActCtxSectionStringW +#endif +#define FindAtom FindAtomW +#define FindFirstChangeNotification FindFirstChangeNotificationW +#define FindFirstFile FindFirstFileW +#define FindFirstFileEx FindFirstFileExW +#if (_WIN32_WINNT >= 0x0500) +#define FindFirstVolume FindFirstVolumeW +#define FindFirstVolumeMountPoint FindFirstVolumeMountPointW +#endif +#define FindNextFile FindNextFileW +#if (_WIN32_WINNT >= 0x0500) +#define FindNextVolume FindNextVolumeW +#define FindNextVolumeMountPoint FindNextVolumeMountPointW +#endif +#define FindResource FindResourceW +#define FindResourceEx FindResourceExW +#define FormatMessage FormatMessageW +#define FreeEnvironmentStrings FreeEnvironmentStringsW +#define GetAtomName GetAtomNameW +#define GetBinaryType GetBinaryTypeW +#define GetCommandLine GetCommandLineW +#define GetCompressedFileSize GetCompressedFileSizeW +#define GetComputerName GetComputerNameW +#define GetCurrentDirectory GetCurrentDirectoryW +#define GetDefaultCommConfig GetDefaultCommConfigW +#define GetDiskFreeSpace GetDiskFreeSpaceW +#define GetDiskFreeSpaceEx GetDiskFreeSpaceExW +#if (_WIN32_WINNT >= 0x0502) +#define GetDllDirectory GetDllDirectoryW +#endif +#define GetDriveType GetDriveTypeW +#define GetEnvironmentStrings GetEnvironmentStringsW +#define GetEnvironmentVariable GetEnvironmentVariableW +#define GetFileAttributes GetFileAttributesW +#define GetFileSecurity GetFileSecurityW +#define GetFileAttributesEx GetFileAttributesExW +#define GetFullPathName GetFullPathNameW +#define GetLogicalDriveStrings GetLogicalDriveStringsW +#if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0410) +#define GetLongPathName GetLongPathNameW +#endif +#define GetModuleFileName GetModuleFileNameW +#define GetModuleHandle GetModuleHandleW +#if (_WIN32_WINNT >= 0x0500) +#define GetModuleHandleEx GetModuleHandleExW +#endif +#define GetNamedPipeHandleState GetNamedPipeHandleStateW +#define GetPrivateProfileInt GetPrivateProfileIntW +#define GetPrivateProfileSection GetPrivateProfileSectionW +#define GetPrivateProfileSectionNames GetPrivateProfileSectionNamesW +#define GetPrivateProfileString GetPrivateProfileStringW +#define GetPrivateProfileStruct GetPrivateProfileStructW +#define GetProfileInt GetProfileIntW +#define GetProfileSection GetProfileSectionW +#define GetProfileString GetProfileStringW +#define GetShortPathName GetShortPathNameW +#define GetStartupInfo GetStartupInfoW +#define GetSystemDirectory GetSystemDirectoryW +#if (_WIN32_WINNT >= 0x0500) +#define GetSystemWindowsDirectory GetSystemWindowsDirectoryW +#endif +#if (_WIN32_WINNT >= 0x0501) +#define GetSystemWow64Directory GetSystemWow64DirectoryW +#endif +#define GetTempFileName GetTempFileNameW +#define GetTempPath GetTempPathW +#define GetUserName GetUserNameW +#define GetVersionEx GetVersionExW +#define GetVolumeInformation GetVolumeInformationW +#define GetVolumeNameForVolumeMountPoint GetVolumeNameForVolumeMountPointW +#define GetVolumePathName GetVolumePathNameW +#define GetVolumePathNamesForVolumeName GetVolumePathNamesForVolumeNameW +#define GetWindowsDirectory GetWindowsDirectoryW +#define GlobalAddAtom GlobalAddAtomW +#define GlobalFindAtom GlobalFindAtomW +#define GlobalGetAtomName GlobalGetAtomNameW +#define IsBadStringPtr IsBadStringPtrW +#define LoadLibrary LoadLibraryW +#define LoadLibraryEx LoadLibraryExW +#define LogonUser LogonUserW +#define LookupAccountName LookupAccountNameW +#define LookupAccountSid LookupAccountSidW +#define LookupPrivilegeDisplayName LookupPrivilegeDisplayNameW +#define LookupPrivilegeName LookupPrivilegeNameW +#define LookupPrivilegeValue LookupPrivilegeValueW +#define lstrcat lstrcatW +#define lstrcmp lstrcmpW +#define lstrcmpi lstrcmpiW +#define lstrcpy lstrcpyW +#define lstrcpyn lstrcpynW +#define lstrlen lstrlenW +#define MoveFile MoveFileW +#define MoveFileEx MoveFileExW +#define ObjectCloseAuditAlarm ObjectCloseAuditAlarmW +#define ObjectDeleteAuditAlarm ObjectDeleteAuditAlarmW +#define ObjectOpenAuditAlarm ObjectOpenAuditAlarmW +#define ObjectPrivilegeAuditAlarm ObjectPrivilegeAuditAlarmW +#define OpenBackupEventLog OpenBackupEventLogW +#define OpenEvent OpenEventW +#define OpenEventLog OpenEventLogW +#define OpenFileMapping OpenFileMappingW +#define OpenMutex OpenMutexW +#define OpenSemaphore OpenSemaphoreW +#define OutputDebugString OutputDebugStringW +#define PrivilegedServiceAuditAlarm PrivilegedServiceAuditAlarmW +#define QueryDosDevice QueryDosDeviceW +#define ReadEventLog ReadEventLogW +#define RegisterEventSource RegisterEventSourceW +#define RemoveDirectory RemoveDirectoryW +#if (_WIN32_WINNT >= 0x0500) +#define ReplaceFile ReplaceFileW +#endif +#define ReportEvent ReportEventW +#define SearchPath SearchPathW +#define SetComputerName SetComputerNameW +#define SetCurrentDirectory SetCurrentDirectoryW +#define SetDefaultCommConfig SetDefaultCommConfigW +#if (_WIN32_WINNT >= 0x0502) +#define SetDllDirectory SetDllDirectoryW +#endif +#define SetEnvironmentVariable SetEnvironmentVariableW +#define SetFileAttributes SetFileAttributesW +#define SetFileSecurity SetFileSecurityW +#if (_WIN32_WINNT >= 0x0501) +#define SetFileShortName SetFileShortNameW +#endif +#if (_WIN32_WINNT >= 0x0502) +#define SetFirmwareEnvironmentVariable SetFirmwareEnvironmentVariableW +#endif +#define SetVolumeLabel SetVolumeLabelW +#define SetVolumeMountPoint SetVolumeMountPointW +#define UpdateResource UpdateResourceW +#define VerifyVersionInfo VerifyVersionInfoW +#define WaitNamedPipe WaitNamedPipeW +#define WritePrivateProfileSection WritePrivateProfileSectionW +#define WritePrivateProfileString WritePrivateProfileStringW +#define WritePrivateProfileStruct WritePrivateProfileStructW +#define WriteProfileSection WriteProfileSectionW +#define WriteProfileString WriteProfileStringW +#else +typedef STARTUPINFOA STARTUPINFO,*LPSTARTUPINFO; +typedef WIN32_FIND_DATAA WIN32_FIND_DATA,*LPWIN32_FIND_DATA; +typedef HW_PROFILE_INFOA HW_PROFILE_INFO,*LPHW_PROFILE_INFO; +#if (_WIN32_WINNT >= 0x0501) +typedef ACTCTXA ACTCTX,*PACTCTX; +typedef PCACTCTXA PCACTCTX; +#endif +#define AccessCheckAndAuditAlarm AccessCheckAndAuditAlarmA +#define AddAtom AddAtomA +#define BackupEventLog BackupEventLogA +#define BeginUpdateResource BeginUpdateResourceA +#define BuildCommDCB BuildCommDCBA +#define BuildCommDCBAndTimeouts BuildCommDCBAndTimeoutsA +#define CallNamedPipe CallNamedPipeA +#if (_WIN32_WINNT >= 0x0501) +#define CheckNameLegalDOS8Dot3 CheckNameLegalDOS8Dot3A +#endif +#define ClearEventLog ClearEventLogA +#define CommConfigDialog CommConfigDialogA +#define CopyFile CopyFileA +#define CopyFileEx CopyFileExA +#if (_WIN32_WINNT >= 0x0501) +#define CreateActCtx CreateActCtxA +#endif +#define CreateDirectory CreateDirectoryA +#define CreateDirectoryEx CreateDirectoryExA +#define CreateEvent CreateEventA +#define CreateFile CreateFileA +#define CreateFileMapping CreateFileMappingA +#if (_WIN32_WINNT >= 0x0500) +#define CreateHardLink CreateHardLinkA +#define CreateJobObject CreateJobObjectA +#endif +#define CreateMailslot CreateMailslotA +#define CreateMutex CreateMutexA +#define CreateNamedPipe CreateNamedPipeA +#define CreateProcess CreateProcessA +#define CreateProcessAsUser CreateProcessAsUserA +#define CreateSemaphore CreateSemaphoreA +#define CreateWaitableTimer CreateWaitableTimerA +#define DefineDosDevice DefineDosDeviceA +#define DeleteFile DeleteFileA +#if (_WIN32_WINNT >= 0x0500) +#define DeleteVolumeMountPoint DeleteVolumeMountPointA +#define DnsHostnameToComputerName DnsHostnameToComputerNameA +#endif +#define EncryptFile EncryptFileA +#define EndUpdateResource EndUpdateResourceA +#define EnumResourceLanguages EnumResourceLanguagesA +#define EnumResourceNames EnumResourceNamesA +#define EnumResourceTypes EnumResourceTypesA +#define ExpandEnvironmentStrings ExpandEnvironmentStringsA +#define FatalAppExit FatalAppExitA +#define FileEncryptionStatus FileEncryptionStatusA +#if (_WIN32_WINNT >= 0x0501) +#define FindActCtxSectionString FindActCtxSectionStringA +#endif +#define FindAtom FindAtomA +#define FindFirstChangeNotification FindFirstChangeNotificationA +#define FindFirstFile FindFirstFileA +#define FindFirstFileEx FindFirstFileExA +#if (_WIN32_WINNT >= 0x0500) +#define FindFirstVolume FindFirstVolumeA +#define FindFirstVolumeMountPoint FindFirstVolumeMountPointA +#endif +#define FindNextFile FindNextFileA +#if (_WIN32_WINNT >= 0x0500) +#define FindNextVolume FindNextVolumeA +#define FindNextVolumeMountPoint FindNextVolumeMountPointA +#endif +#define FindResource FindResourceA +#define FindResourceEx FindResourceExA +#define FormatMessage FormatMessageA +#define FreeEnvironmentStrings FreeEnvironmentStringsA +#define GetAtomName GetAtomNameA +#define GetBinaryType GetBinaryTypeA +#define GetCommandLine GetCommandLineA +#define GetComputerName GetComputerNameA +#define GetCompressedFileSize GetCompressedFileSizeA +#define GetCurrentDirectory GetCurrentDirectoryA +#define GetDefaultCommConfig GetDefaultCommConfigA +#define GetDiskFreeSpace GetDiskFreeSpaceA +#define GetDiskFreeSpaceEx GetDiskFreeSpaceExA +#if (_WIN32_WINNT >= 0x0502) +#define GetDllDirectory GetDllDirectoryA +#endif +#define GetDriveType GetDriveTypeA +#define GetEnvironmentVariable GetEnvironmentVariableA +#define GetFileAttributes GetFileAttributesA +#define GetFileSecurity GetFileSecurityA +#define GetFileAttributesEx GetFileAttributesExA +#define GetFullPathName GetFullPathNameA +#define GetLogicalDriveStrings GetLogicalDriveStringsA +#if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0410) +#define GetLongPathName GetLongPathNameA +#endif +#define GetNamedPipeHandleState GetNamedPipeHandleStateA +#define GetModuleHandle GetModuleHandleA +#if (_WIN32_WINNT >= 0x0500) +#define GetModuleHandleEx GetModuleHandleExA +#endif +#define GetModuleFileName GetModuleFileNameA +#define GetPrivateProfileInt GetPrivateProfileIntA +#define GetPrivateProfileSection GetPrivateProfileSectionA +#define GetPrivateProfileSectionNames GetPrivateProfileSectionNamesA +#define GetPrivateProfileString GetPrivateProfileStringA +#define GetPrivateProfileStruct GetPrivateProfileStructA +#define GetProfileInt GetProfileIntA +#define GetProfileSection GetProfileSectionA +#define GetProfileString GetProfileStringA +#define GetShortPathName GetShortPathNameA +#define GetStartupInfo GetStartupInfoA +#define GetSystemDirectory GetSystemDirectoryA +#if (_WIN32_WINNT >= 0x0500) +#define GetSystemWindowsDirectory GetSystemWindowsDirectoryA +#endif +#if (_WIN32_WINNT >= 0x0501) +#define GetSystemWow64Directory GetSystemWow64DirectoryA +#endif +#define GetTempFileName GetTempFileNameA +#define GetTempPath GetTempPathA +#define GetUserName GetUserNameA +#define GetVersionEx GetVersionExA +#define GetVolumeInformation GetVolumeInformationA +#define GetVolumeNameForVolumeMountPoint GetVolumeNameForVolumeMountPointA +#define GetVolumePathName GetVolumePathNameA +#define GetVolumePathNamesForVolumeName GetVolumePathNamesForVolumeNameA +#define GetWindowsDirectory GetWindowsDirectoryA +#define GlobalAddAtom GlobalAddAtomA +#define GlobalFindAtom GlobalFindAtomA +#define GlobalGetAtomName GlobalGetAtomNameA +#define IsBadStringPtr IsBadStringPtrA +#define LoadLibrary LoadLibraryA +#define LoadLibraryEx LoadLibraryExA +#define LogonUser LogonUserA +#define LookupAccountName LookupAccountNameA +#define LookupAccountSid LookupAccountSidA +#define LookupPrivilegeDisplayName LookupPrivilegeDisplayNameA +#define LookupPrivilegeName LookupPrivilegeNameA +#define LookupPrivilegeValue LookupPrivilegeValueA +#define lstrcat lstrcatA +#define lstrcmp lstrcmpA +#define lstrcmpi lstrcmpiA +#define lstrcpy lstrcpyA +#define lstrcpyn lstrcpynA +#define lstrlen lstrlenA +#define MoveFile MoveFileA +#define MoveFileEx MoveFileExA +#define ObjectCloseAuditAlarm ObjectCloseAuditAlarmA +#define ObjectDeleteAuditAlarm ObjectDeleteAuditAlarmA +#define ObjectOpenAuditAlarm ObjectOpenAuditAlarmA +#define ObjectPrivilegeAuditAlarm ObjectPrivilegeAuditAlarmA +#define OpenBackupEventLog OpenBackupEventLogA +#define OpenEvent OpenEventA +#define OpenEventLog OpenEventLogA +#define OpenFileMapping OpenFileMappingA +#define OpenMutex OpenMutexA +#define OpenSemaphore OpenSemaphoreA +#define OutputDebugString OutputDebugStringA +#define PrivilegedServiceAuditAlarm PrivilegedServiceAuditAlarmA +#define QueryDosDevice QueryDosDeviceA +#define ReadEventLog ReadEventLogA +#define RegisterEventSource RegisterEventSourceA +#define RemoveDirectory RemoveDirectoryA +#if (_WIN32_WINNT >= 0x0500) +#define ReplaceFile ReplaceFileA +#endif +#define ReportEvent ReportEventA +#define SearchPath SearchPathA +#define SetComputerName SetComputerNameA +#define SetCurrentDirectory SetCurrentDirectoryA +#define SetDefaultCommConfig SetDefaultCommConfigA +#if (_WIN32_WINNT >= 0x0502) +#define SetDllDirectory SetDllDirectoryA +#endif +#define SetEnvironmentVariable SetEnvironmentVariableA +#define SetFileAttributes SetFileAttributesA +#define SetFileSecurity SetFileSecurityA +#if (_WIN32_WINNT >= 0x0501) +#define SetFileShortName SetFileShortNameA +#endif +#if (_WIN32_WINNT >= 0x0502) +#define SetFirmwareEnvironmentVariable SetFirmwareEnvironmentVariableA +#endif +#define SetVolumeLabel SetVolumeLabelA +#define SetVolumeMountPoint SetVolumeMountPointA +#define UpdateResource UpdateResourceA +#define VerifyVersionInfo VerifyVersionInfoA +#define WaitNamedPipe WaitNamedPipeA +#define WritePrivateProfileSection WritePrivateProfileSectionA +#define WritePrivateProfileString WritePrivateProfileStringA +#define WritePrivateProfileStruct WritePrivateProfileStructA +#define WriteProfileSection WriteProfileSectionA +#define WriteProfileString WriteProfileStringA +#endif +#endif +#ifdef __cplusplus +} +#endif +#endif /* _WINBASE_H */ diff --git a/reactos/w32api/include/winber.h b/reactos/w32api/include/winber.h new file mode 100644 index 00000000000..462a66d5320 --- /dev/null +++ b/reactos/w32api/include/winber.h @@ -0,0 +1,67 @@ +/* + winber.h - Header file for the Windows LDAP Basic Encoding Rules API + + Written by Filip Navara <xnavara@volny.cz> + + References: + The C LDAP Application Program Interface + http://www.watersprings.org/pub/id/draft-ietf-ldapext-ldap-c-api-05.txt + + Lightweight Directory Access Protocol Reference + http://msdn.microsoft.com/library/en-us/netdir/ldap/ldap_reference.asp + + 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. +*/ + +#ifndef _WINBER_H +#define _WINBER_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef WINBERAPI +#define WINBERAPI DECLSPEC_IMPORT +#endif + +typedef struct berelement BerElement; +typedef ULONG ber_len_t; +#include <pshpack4.h> +typedef struct berval { + ber_len_t bv_len; + char *bv_val; +} BerValue, LDAP_BERVAL, *PLDAP_BERVAL, BERVAL, *PBERVAL; +#include <poppack.h> + +typedef ULONG ber_tag_t; +typedef INT ber_int_t; +typedef UINT ber_uint_t; +typedef INT ber_slen_t; + +#define LBER_ERROR ((ber_tag_t)-1) +#define LBER_DEFAULT ((ber_tag_t)-1) +#define LBER_USE_DER 0x01 + +WINBERAPI BerElement *ber_init(const BerValue*); +WINBERAPI int ber_printf(BerElement*,const char*,...); +WINBERAPI int ber_flatten(BerElement*,BerValue**); +WINBERAPI ber_tag_t ber_scanf(BerElement*,const char*,...); +WINBERAPI ber_tag_t ber_peek_tag(BerElement*,ber_len_t*); +WINBERAPI ber_tag_t ber_skip_tag(BerElement*,ber_len_t*); +WINBERAPI ber_tag_t ber_first_element(BerElement*,ber_len_t*,char**); +WINBERAPI ber_tag_t ber_next_element(BerElement*,ber_len_t*,char*); +WINBERAPI void ber_bvfree(BerValue*); +WINBERAPI void ber_bvecfree(BerValue**); +WINBERAPI void ber_free(BerElement*,int); +WINBERAPI BerValue *ber_bvdup(BerValue*); +WINBERAPI BerElement *ber_alloc_t(int); + +#ifdef __cplusplus +} +#endif +#endif /* _WINBER_H */ diff --git a/reactos/w32api/include/wincon.h b/reactos/w32api/include/wincon.h new file mode 100644 index 00000000000..6c92f09ce04 --- /dev/null +++ b/reactos/w32api/include/wincon.h @@ -0,0 +1,216 @@ +#ifndef _WINCON_H +#define _WINCON_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define FOREGROUND_BLUE 1 +#define FOREGROUND_GREEN 2 +#define FOREGROUND_RED 4 +#define FOREGROUND_INTENSITY 8 +#define BACKGROUND_BLUE 16 +#define BACKGROUND_GREEN 32 +#define BACKGROUND_RED 64 +#define BACKGROUND_INTENSITY 128 +#define CTRL_C_EVENT 0 +#define CTRL_BREAK_EVENT 1 +#define CTRL_CLOSE_EVENT 2 +#define CTRL_LOGOFF_EVENT 5 +#define CTRL_SHUTDOWN_EVENT 6 +#define ENABLE_LINE_INPUT 2 +#define ENABLE_ECHO_INPUT 4 +#define ENABLE_PROCESSED_INPUT 1 +#define ENABLE_WINDOW_INPUT 8 +#define ENABLE_MOUSE_INPUT 16 +#define ENABLE_PROCESSED_OUTPUT 1 +#define ENABLE_WRAP_AT_EOL_OUTPUT 2 +#define KEY_EVENT 1 +#define MOUSE_EVENT 2 +#define WINDOW_BUFFER_SIZE_EVENT 4 +#define MENU_EVENT 8 +#define FOCUS_EVENT 16 +#define CAPSLOCK_ON 128 +#define ENHANCED_KEY 256 +#define RIGHT_ALT_PRESSED 1 +#define LEFT_ALT_PRESSED 2 +#define RIGHT_CTRL_PRESSED 4 +#define LEFT_CTRL_PRESSED 8 +#define SHIFT_PRESSED 16 +#define NUMLOCK_ON 32 +#define SCROLLLOCK_ON 64 +#define FROM_LEFT_1ST_BUTTON_PRESSED 1 +#define RIGHTMOST_BUTTON_PRESSED 2 +#define FROM_LEFT_2ND_BUTTON_PRESSED 4 +#define FROM_LEFT_3RD_BUTTON_PRESSED 8 +#define FROM_LEFT_4TH_BUTTON_PRESSED 16 +#define MOUSE_MOVED 1 +#define DOUBLE_CLICK 2 +#define MOUSE_WHEELED 4 + +typedef struct _CHAR_INFO { + union { + WCHAR UnicodeChar; + CHAR AsciiChar; + } Char; + WORD Attributes; +} CHAR_INFO,*PCHAR_INFO; +typedef struct _SMALL_RECT { + SHORT Left; + SHORT Top; + SHORT Right; + SHORT Bottom; +} SMALL_RECT,*PSMALL_RECT; +typedef struct _CONSOLE_CURSOR_INFO { + DWORD dwSize; + BOOL bVisible; +} CONSOLE_CURSOR_INFO,*PCONSOLE_CURSOR_INFO; +typedef struct _COORD { + SHORT X; + SHORT Y; +} COORD; +typedef struct _CONSOLE_FONT_INFO { + DWORD nFont; + COORD dwFontSize; +} CONSOLE_FONT_INFO, *PCONSOLE_FONT_INFO; +typedef struct _CONSOLE_SCREEN_BUFFER_INFO { + COORD dwSize; + COORD dwCursorPosition; + WORD wAttributes; + SMALL_RECT srWindow; + COORD dwMaximumWindowSize; +} CONSOLE_SCREEN_BUFFER_INFO,*PCONSOLE_SCREEN_BUFFER_INFO; +typedef BOOL(CALLBACK *PHANDLER_ROUTINE)(DWORD); +typedef struct _KEY_EVENT_RECORD { + BOOL bKeyDown; + WORD wRepeatCount; + WORD wVirtualKeyCode; + WORD wVirtualScanCode; + union { + WCHAR UnicodeChar; + CHAR AsciiChar; + } uChar; + DWORD dwControlKeyState; +} +#ifdef __GNUC__ +/* gcc's alignment is not what win32 expects */ + PACKED +#endif +KEY_EVENT_RECORD; + +typedef struct _MOUSE_EVENT_RECORD { + COORD dwMousePosition; + DWORD dwButtonState; + DWORD dwControlKeyState; + DWORD dwEventFlags; +} MOUSE_EVENT_RECORD; +typedef struct _WINDOW_BUFFER_SIZE_RECORD { COORD dwSize; } WINDOW_BUFFER_SIZE_RECORD; +typedef struct _MENU_EVENT_RECORD { UINT dwCommandId; } MENU_EVENT_RECORD,*PMENU_EVENT_RECORD; +typedef struct _FOCUS_EVENT_RECORD { BOOL bSetFocus; } FOCUS_EVENT_RECORD; +typedef struct _INPUT_RECORD { + WORD EventType; + union { + KEY_EVENT_RECORD KeyEvent; + MOUSE_EVENT_RECORD MouseEvent; + WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent; + MENU_EVENT_RECORD MenuEvent; + FOCUS_EVENT_RECORD FocusEvent; + } Event; +} INPUT_RECORD,*PINPUT_RECORD; + +BOOL WINAPI AllocConsole(void); +#if (_WIN32_WINNT >= 0x05001) +BOOL WINAPI AttachConsole(DWORD); +#endif +HANDLE WINAPI CreateConsoleScreenBuffer(DWORD,DWORD,CONST SECURITY_ATTRIBUTES*,DWORD,LPVOID); +BOOL WINAPI FillConsoleOutputAttribute(HANDLE,WORD,DWORD,COORD,PDWORD); +BOOL WINAPI FillConsoleOutputCharacterA(HANDLE,CHAR,DWORD,COORD,PDWORD); +BOOL WINAPI FillConsoleOutputCharacterW(HANDLE,WCHAR,DWORD,COORD,PDWORD); +BOOL WINAPI FlushConsoleInputBuffer(HANDLE); +BOOL WINAPI FreeConsole(void); +BOOL WINAPI GenerateConsoleCtrlEvent(DWORD,DWORD); +UINT WINAPI GetConsoleCP(void); +BOOL WINAPI GetConsoleCursorInfo(HANDLE,PCONSOLE_CURSOR_INFO); +BOOL WINAPI GetConsoleMode(HANDLE,PDWORD); +UINT WINAPI GetConsoleOutputCP(void); +BOOL WINAPI GetConsoleScreenBufferInfo(HANDLE,PCONSOLE_SCREEN_BUFFER_INFO); +DWORD WINAPI GetConsoleTitleA(LPSTR,DWORD); +DWORD WINAPI GetConsoleTitleW(LPWSTR,DWORD); +#if (_WIN32_WINNT >= 0x0500) +HWND WINAPI GetConsoleWindow(void); +#endif +COORD WINAPI GetLargestConsoleWindowSize(HANDLE); +BOOL WINAPI GetNumberOfConsoleInputEvents(HANDLE,PDWORD); +BOOL WINAPI GetNumberOfConsoleMouseButtons(PDWORD); +BOOL WINAPI PeekConsoleInputA(HANDLE,PINPUT_RECORD,DWORD,PDWORD); +BOOL WINAPI PeekConsoleInputW(HANDLE,PINPUT_RECORD,DWORD,PDWORD); +BOOL WINAPI ReadConsoleA(HANDLE,PVOID,DWORD,PDWORD,PVOID); +BOOL WINAPI ReadConsoleW(HANDLE,PVOID,DWORD,PDWORD,PVOID); +BOOL WINAPI ReadConsoleInputA(HANDLE,PINPUT_RECORD,DWORD,PDWORD); +BOOL WINAPI ReadConsoleInputW(HANDLE,PINPUT_RECORD,DWORD,PDWORD); +BOOL WINAPI ReadConsoleOutputAttribute(HANDLE,LPWORD,DWORD,COORD,LPDWORD); +BOOL WINAPI ReadConsoleOutputCharacterA(HANDLE,LPSTR,DWORD,COORD,PDWORD); +BOOL WINAPI ReadConsoleOutputCharacterW(HANDLE,LPWSTR,DWORD,COORD,PDWORD); +BOOL WINAPI ReadConsoleOutputA(HANDLE,PCHAR_INFO,COORD,COORD,PSMALL_RECT); +BOOL WINAPI ReadConsoleOutputW(HANDLE,PCHAR_INFO,COORD,COORD,PSMALL_RECT); +BOOL WINAPI ScrollConsoleScreenBufferA(HANDLE,const SMALL_RECT*,const SMALL_RECT*,COORD,const CHAR_INFO*); +BOOL WINAPI ScrollConsoleScreenBufferW(HANDLE,const SMALL_RECT*,const SMALL_RECT*,COORD,const CHAR_INFO*); +BOOL WINAPI SetConsoleActiveScreenBuffer(HANDLE); +BOOL WINAPI SetConsoleCP(UINT); +BOOL WINAPI SetConsoleCtrlHandler(PHANDLER_ROUTINE,BOOL); +BOOL WINAPI SetConsoleCursorInfo(HANDLE,const CONSOLE_CURSOR_INFO*); +BOOL WINAPI SetConsoleCursorPosition(HANDLE,COORD); +BOOL WINAPI SetConsoleMode(HANDLE,DWORD); +BOOL WINAPI SetConsoleOutputCP(UINT); +BOOL WINAPI SetConsoleScreenBufferSize(HANDLE,COORD); +BOOL WINAPI SetConsoleTextAttribute(HANDLE,WORD); +BOOL WINAPI SetConsoleTitleA(LPCSTR); +BOOL WINAPI SetConsoleTitleW(LPCWSTR); +BOOL WINAPI SetConsoleWindowInfo(HANDLE,BOOL,const SMALL_RECT*); +BOOL WINAPI WriteConsoleA(HANDLE,PCVOID,DWORD,PDWORD,PVOID); +BOOL WINAPI WriteConsoleW(HANDLE,PCVOID,DWORD,PDWORD,PVOID); +BOOL WINAPI WriteConsoleInputA(HANDLE,const INPUT_RECORD*,DWORD,PDWORD); +BOOL WINAPI WriteConsoleInputW(HANDLE,const INPUT_RECORD*,DWORD,PDWORD); +BOOL WINAPI WriteConsoleOutputA(HANDLE,const CHAR_INFO*,COORD,COORD,PSMALL_RECT); +BOOL WINAPI WriteConsoleOutputW(HANDLE,const CHAR_INFO*,COORD,COORD,PSMALL_RECT); +BOOL WINAPI WriteConsoleOutputAttribute(HANDLE,const WORD*,DWORD,COORD,PDWORD); +BOOL WINAPI WriteConsoleOutputCharacterA(HANDLE,LPCSTR,DWORD,COORD,PDWORD); +BOOL WINAPI WriteConsoleOutputCharacterW(HANDLE,LPCWSTR,DWORD,COORD,PDWORD); + +#ifdef UNICODE +#define FillConsoleOutputCharacter FillConsoleOutputCharacterW +#define GetConsoleTitle GetConsoleTitleW +#define PeekConsoleInput PeekConsoleInputW +#define ReadConsole ReadConsoleW +#define ReadConsoleInput ReadConsoleInputW +#define ReadConsoleOutput ReadConsoleOutputW +#define ReadConsoleOutputCharacter ReadConsoleOutputCharacterW +#define ScrollConsoleScreenBuffer ScrollConsoleScreenBufferW +#define SetConsoleTitle SetConsoleTitleW +#define WriteConsole WriteConsoleW +#define WriteConsoleInput WriteConsoleInputW +#define WriteConsoleOutput WriteConsoleOutputW +#define WriteConsoleOutputCharacter WriteConsoleOutputCharacterW +#else +#define FillConsoleOutputCharacter FillConsoleOutputCharacterA +#define GetConsoleTitle GetConsoleTitleA +#define PeekConsoleInput PeekConsoleInputA +#define ReadConsole ReadConsoleA +#define ReadConsoleInput ReadConsoleInputA +#define ReadConsoleOutput ReadConsoleOutputA +#define ReadConsoleOutputCharacter ReadConsoleOutputCharacterA +#define ScrollConsoleScreenBuffer ScrollConsoleScreenBufferA +#define SetConsoleTitle SetConsoleTitleA +#define WriteConsole WriteConsoleA +#define WriteConsoleInput WriteConsoleInputA +#define WriteConsoleOutput WriteConsoleOutputA +#define WriteConsoleOutputCharacter WriteConsoleOutputCharacterA +#endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/wincrypt.h b/reactos/w32api/include/wincrypt.h new file mode 100644 index 00000000000..c3ebf2d5d00 --- /dev/null +++ b/reactos/w32api/include/wincrypt.h @@ -0,0 +1,695 @@ +#ifndef _WINCRYPT_H +#define _WINCRYPT_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define MS_DEF_PROV_A "Microsoft Base Cryptographic Provider v1.0" +#define MS_DEF_PROV_W L"Microsoft Base Cryptographic Provider v1.0" +#define MS_ENHANCED_PROV_A "Microsoft Enhanced Cryptographic Provider v1.0" +#define MS_ENHANCED_PROV_W L"Microsoft Enhanced Cryptographic Provider v1.0" +#define MS_STRONG_PROV_A "Microsoft Strong Cryptographic Provider" +#define MS_STRONG_PROV_W L"Microsoft Strong Cryptographic Provider" +#define MS_DEF_RSA_SIG_PROV_A "Microsoft RSA Signature Cryptographic Provider" +#define MS_DEF_RSA_SIG_PROV_W L"Microsoft RSA Signature Cryptographic Provider" +#define MS_DEF_RSA_SCHANNEL_PROV_A "Microsoft RSA SChannel Cryptographic Provider" +#define MS_DEF_RSA_SCHANNEL_PROV_W L"Microsoft RSA SChannel Cryptographic Provider" +#define MS_DEF_DSS_PROV_A "Microsoft Base DSS Cryptographic Provider" +#define MS_DEF_DSS_PROV_W L"Microsoft Base DSS Cryptographic Provider" +#define MS_DEF_DSS_DH_PROV_A "Microsoft Base DSS and Diffie-Hellman Cryptographic Provider" +#define MS_DEF_DSS_DH_PROV_W L"Microsoft Base DSS and Diffie-Hellman Cryptographic Provider" +#define MS_ENH_DSS_DH_PROV_A "Microsoft Enhanced DSS and Diffie-Hellman Cryptographic Provider" +#define MS_ENH_DSS_DH_PROV_W L"Microsoft Enhanced DSS and Diffie-Hellman Cryptographic Provider" +#define MS_DEF_DH_SCHANNEL_PROV_A "Microsoft DH SChannel Cryptographic Provider" +#define MS_DEF_DH_SCHANNEL_PROV_W L"Microsoft DH SChannel Cryptographic Provider" +#define MS_SCARD_PROV_A "Microsoft Base Smart Card Crypto Provider" +#define MS_SCARD_PROV_W L"Microsoft Base Smart Card Crypto Provider" +#define GET_ALG_CLASS(x) (x&57344) +#define GET_ALG_TYPE(x) (x&7680) +#define GET_ALG_SID(x) (x&511) +#define ALG_CLASS_ANY 0 +#define ALG_CLASS_SIGNATURE 8192 +#define ALG_CLASS_MSG_ENCRYPT 16384 +#define ALG_CLASS_DATA_ENCRYPT 24576 +#define ALG_CLASS_HASH 32768 +#define ALG_CLASS_KEY_EXCHANGE 40960 +#define ALG_CLASS_ALL 57344 /* (7 << 13) */ +#define ALG_TYPE_ANY 0 +#define ALG_TYPE_DSS 512 +#define ALG_TYPE_RSA 1024 +#define ALG_TYPE_BLOCK 1536 +#define ALG_TYPE_STREAM 2048 +#define ALG_TYPE_DH 2560 /* (5 << 9) */ +#define ALG_TYPE_SECURECHANNEL 3072 /* (6 << 9) */ +#define ALG_SID_ANY 0 +#define ALG_SID_RSA_ANY 0 +#define ALG_SID_RSA_PKCS 1 +#define ALG_SID_RSA_MSATWORK 2 +#define ALG_SID_RSA_ENTRUST 3 +#define ALG_SID_RSA_PGP 4 +#define ALG_SID_DSS_ANY 0 +#define ALG_SID_DSS_PKCS 1 +#define ALG_SID_DSS_DMS 2 +#define ALG_SID_DES 1 +#define ALG_SID_3DES 3 +#define ALG_SID_DESX 4 +#define ALG_SID_IDEA 5 +#define ALG_SID_CAST 6 +#define ALG_SID_SAFERSK64 7 +#define ALG_SID_SAFERSK128 8 +#define ALG_SID_3DES_112 9 +#define ALG_SID_SKIPJACK 10 +#define ALG_SID_TEK 11 +#define ALG_SID_CYLINK_MEK 12 +#define ALG_SID_RC5 13 +#define ALG_SID_RC2 2 +#define ALG_SID_RC4 1 +#define ALG_SID_SEAL 2 +#define ALG_SID_MD2 1 +#define ALG_SID_MD4 2 +#define ALG_SID_MD5 3 +#define ALG_SID_SHA 4 +#define ALG_SID_MAC 5 +#define ALG_SID_RIPEMD 6 +#define ALG_SID_RIPEMD160 7 +#define ALG_SID_SSL3SHAMD5 8 +#define ALG_SID_HMAC 9 +#define ALG_SID_TLS1PRF 10 +#define ALG_SID_EXAMPLE 80 + +#define CALG_MD2 (ALG_CLASS_HASH|ALG_TYPE_ANY|ALG_SID_MD2) +#define CALG_MD4 (ALG_CLASS_HASH|ALG_TYPE_ANY|ALG_SID_MD4) +#define CALG_MD5 (ALG_CLASS_HASH|ALG_TYPE_ANY|ALG_SID_MD5) +#define CALG_SHA (ALG_CLASS_HASH|ALG_TYPE_ANY|ALG_SID_SHA) +#define CALG_MAC (ALG_CLASS_HASH|ALG_TYPE_ANY|ALG_SID_MAC) +#define CALG_3DES (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|3) +#define CALG_CYLINK_MEK (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|12) +#define CALG_SKIPJACK (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|10) +#define CALG_KEA_KEYX (ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_STREAM|ALG_TYPE_DSS|4) +#define CALG_RSA_SIGN (ALG_CLASS_SIGNATURE|ALG_TYPE_RSA|ALG_SID_RSA_ANY) +#define CALG_DSS_SIGN (ALG_CLASS_SIGNATURE|ALG_TYPE_DSS|ALG_SID_DSS_ANY) +#define CALG_RSA_KEYX (ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_RSA|ALG_SID_RSA_ANY) +#define CALG_DES (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_DES) +#define CALG_RC2 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_RC2) +#define CALG_RC4 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_STREAM|ALG_SID_RC4) +#define CALG_SEAL (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_STREAM|ALG_SID_SEAL) +#define CALG_DH_EPHEM (ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_STREAM|ALG_TYPE_DSS|ALG_SID_DSS_DMS) +#define CALG_DESX (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_DESX) +#define CALG_TLS1PRF (ALG_CLASS_DHASH|ALG_TYPE_ANY|ALG_SID_TLS1PRF) + +#define CRYPT_VERIFYCONTEXT 0xF0000000 +#define CRYPT_NEWKEYSET 8 +#define CRYPT_DELETEKEYSET 16 +#define CRYPT_MACHINE_KEYSET 32 +#define CRYPT_SILENT 64 +#define CRYPT_EXPORTABLE 1 +#define CRYPT_USER_PROTECTED 2 +#define CRYPT_CREATE_SALT 4 +#define CRYPT_UPDATE_KEY 8 +#define SIMPLEBLOB 1 +#define PUBLICKEYBLOB 6 +#define PRIVATEKEYBLOB 7 +#define PLAINTEXTKEYBLOB 8 +#define OPAQUEKEYBLOB 9 +#define PUBLICKEYBLOBEX 10 +#define SYMMETRICWRAPKEYBLOB 11 +#define AT_KEYEXCHANGE 1 +#define AT_SIGNATURE 2 +#define CRYPT_USERDATA 1 +#define PKCS5_PADDING 1 +#define CRYPT_MODE_CBC 1 +#define CRYPT_MODE_ECB 2 +#define CRYPT_MODE_OFB 3 +#define CRYPT_MODE_CFB 4 +#define CRYPT_MODE_CTS 5 +#define CRYPT_MODE_CBCI 6 +#define CRYPT_MODE_CFBP 7 +#define CRYPT_MODE_OFBP 8 +#define CRYPT_MODE_CBCOFM 9 +#define CRYPT_MODE_CBCOFMI 10 +#define CRYPT_ENCRYPT 1 +#define CRYPT_DECRYPT 2 +#define CRYPT_EXPORT 4 +#define CRYPT_READ 8 +#define CRYPT_WRITE 16 +#define CRYPT_MAC 32 +#define HP_ALGID 1 +#define HP_HASHVAL 2 +#define HP_HASHSIZE 4 +#define CRYPT_FAILED FALSE +#define CRYPT_SUCCEED TRUE +#define RCRYPT_SUCCEEDED(r) ((r)==CRYPT_SUCCEED) +#define RCRYPT_FAILED(r) ((r)==CRYPT_FAILED) +#define PP_ENUMALGS 1 +#define PP_ENUMCONTAINERS 2 +#define PP_IMPTYPE 3 +#define PP_NAME 4 +#define PP_VERSION 5 +#define PP_CONTAINER 6 +#define PP_CHANGE_PASSWORD 7 +#define PP_KEYSET_SEC_DESCR 8 +#define PP_CERTCHAIN 9 +#define PP_KEY_TYPE_SUBTYPE 10 +#define PP_PROVTYPE 16 +#define PP_KEYSTORAGE 17 +#define PP_APPLI_CERT 18 +#define PP_SYM_KEYSIZE 19 +#define PP_SESSION_KEYSIZE 20 +#define PP_UI_PROMPT 21 +#define PP_ENUMALGS_EX 22 +#define PP_ENUMMANDROOTS 25 +#define PP_ENUMELECTROOTS 26 +#define PP_KEYSET_TYPE 27 +#define PP_ADMIN_PIN 31 +#define PP_KEYEXCHANGE_PIN 32 +#define PP_SIGNATURE_PIN 33 +#define PP_SIG_KEYSIZE_INC 34 +#define PP_KEYX_KEYSIZE_INC 35 +#define PP_UNIQUE_CONTAINER 36 +#define PP_SGC_INFO 37 +#define PP_USE_HARDWARE_RNG 38 +#define PP_KEYSPEC 39 +#define PP_ENUMEX_SIGNING_PROT 40 +#define CRYPT_FIRST 1 +#define CRYPT_NEXT 2 +#define CRYPT_IMPL_HARDWARE 1 +#define CRYPT_IMPL_SOFTWARE 2 +#define CRYPT_IMPL_MIXED 3 +#define CRYPT_IMPL_UNKNOWN 4 +#define PROV_RSA_FULL 1 +#define PROV_RSA_SIG 2 +#define PROV_DSS 3 +#define PROV_FORTEZZA 4 +#define PROV_MS_MAIL 5 +#define PROV_SSL 6 +#define PROV_STT_MER 7 +#define PROV_STT_ACQ 8 +#define PROV_STT_BRND 9 +#define PROV_STT_ROOT 10 +#define PROV_STT_ISS 11 +#define PROV_RSA_SCHANNEL 12 +#define PROV_DSS_DH 13 +#define PROV_EC_ECDSA_SIG 14 +#define PROV_EC_ECNRA_SIG 15 +#define PROV_EC_ECDSA_FULL 16 +#define PROV_EC_ECNRA_FULL 17 +#define PROV_DH_SCHANNEL 18 +#define PROV_SPYRUS_LYNKS 20 +#define PROV_RNG 21 +#define PROV_INTEL_SEC 22 +#define MAXUIDLEN 64 +#define CUR_BLOB_VERSION 2 +#define X509_ASN_ENCODING 1 +#define PKCS_7_ASN_ENCODING 65536 +#define CERT_V1 0 +#define CERT_V2 1 +#define CERT_V3 2 +#define CERT_E_CHAINING (-2146762486) +#define CERT_E_CN_NO_MATCH (-2146762481) +#define CERT_E_EXPIRED (-2146762495) +#define CERT_E_PURPOSE (-2146762490) +#define CERT_E_REVOCATION_FAILURE (-2146762482) +#define CERT_E_REVOKED (-2146762484) +#define CERT_E_ROLE (-2146762493) +#define CERT_E_UNTRUSTEDROOT (-2146762487) +#define CERT_E_UNTRUSTEDTESTROOT (-2146762483) +#define CERT_E_VALIDITYPERIODNESTING (-2146762494) +#define CERT_E_WRONG_USAGE (-2146762480) +#define CERT_E_PATHLENCONST (-2146762492) +#define CERT_E_CRITICAL (-2146762491) +#define CERT_E_ISSUERCHAINING (-2146762489) +#define CERT_E_MALFORMED (-2146762488) +#define CRYPT_E_REVOCATION_OFFLINE (-2146885613) +#define CRYPT_E_REVOKED (-2146885616) +#define TRUST_E_BASIC_CONSTRAINTS (-2146869223) +#define TRUST_E_CERT_SIGNATURE (-2146869244) +#define TRUST_E_FAIL (-2146762485) +#define CERT_TRUST_NO_ERROR 0 +#define CERT_TRUST_IS_NOT_TIME_VALID 1 +#define CERT_TRUST_IS_NOT_TIME_NESTED 2 +#define CERT_TRUST_IS_REVOKED 4 +#define CERT_TRUST_IS_NOT_SIGNATURE_VALID 8 +#define CERT_TRUST_IS_NOT_VALID_FOR_USAGE 16 +#define CERT_TRUST_IS_UNTRUSTED_ROOT 32 +#define CERT_TRUST_REVOCATION_STATUS_UNKNOWN 64 +#define CERT_TRUST_IS_CYCLIC 128 +#define CERT_TRUST_IS_PARTIAL_CHAIN 65536 +#define CERT_TRUST_CTL_IS_NOT_TIME_VALID 131072 +#define CERT_TRUST_CTL_IS_NOT_SIGNATURE_VALID 262144 +#define CERT_TRUST_CTL_IS_NOT_VALID_FOR_USAGE 524288 +#define CERT_TRUST_HAS_EXACT_MATCH_ISSUER 1 +#define CERT_TRUST_HAS_KEY_MATCH_ISSUER 2 +#define CERT_TRUST_HAS_NAME_MATCH_ISSUER 4 +#define CERT_TRUST_IS_SELF_SIGNED 8 +#define CERT_TRUST_IS_COMPLEX_CHAIN 65536 +#define CERT_CHAIN_POLICY_BASE ((LPCSTR) 1) +#define CERT_CHAIN_POLICY_AUTHENTICODE ((LPCSTR) 2) +#define CERT_CHAIN_POLICY_AUTHENTICODE_TS ((LPCSTR) 3) +#define CERT_CHAIN_POLICY_SSL ((LPCSTR) 4) +#define CERT_CHAIN_POLICY_BASIC_CONSTRAINTS ((LPCSTR) 5) +#define CERT_CHAIN_POLICY_NT_AUTH ((LPCSTR) 6) +#define USAGE_MATCH_TYPE_AND 0 +#define USAGE_MATCH_TYPE_OR 1 +#define CERT_SIMPLE_NAME_STR 1 +#define CERT_OID_NAME_STR 2 +#define CERT_X500_NAME_STR 3 +#define CERT_NAME_STR_SEMICOLON_FLAG 1073741824 +#define CERT_NAME_STR_CRLF_FLAG 134217728 +#define CERT_NAME_STR_NO_PLUS_FLAG 536870912 +#define CERT_NAME_STR_NO_QUOTING_FLAG 268435456 +#define CERT_NAME_STR_REVERSE_FLAG 33554432 +#define CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG 131072 +#define CERT_FIND_ANY 0 +#define CERT_FIND_CERT_ID 1048576 +#define CERT_FIND_CTL_USAGE 655360 +#define CERT_FIND_ENHKEY_USAGE 655360 +#define CERT_FIND_EXISTING 851968 +#define CERT_FIND_HASH 65536 +#define CERT_FIND_ISSUER_ATTR 196612 +#define CERT_FIND_ISSUER_NAME 131076 +#define CERT_FIND_ISSUER_OF 786432 +#define CERT_FIND_KEY_IDENTIFIER 983040 +#define CERT_FIND_KEY_SPEC 589824 +#define CERT_FIND_MD5_HASH 262144 +#define CERT_FIND_PROPERTY 327680 +#define CERT_FIND_PUBLIC_KEY 393216 +#define CERT_FIND_SHA1_HASH 65536 +#define CERT_FIND_SIGNATURE_HASH 917504 +#define CERT_FIND_SUBJECT_ATTR 196615 +#define CERT_FIND_SUBJECT_CERT 720896 +#define CERT_FIND_SUBJECT_NAME 131079 +#define CERT_FIND_SUBJECT_STR_A 458759 +#define CERT_FIND_SUBJECT_STR_W 524295 +#define CERT_FIND_ISSUER_STR_A 458756 +#define CERT_FIND_ISSUER_STR_W 524292 +#define CERT_FIND_OR_ENHKEY_USAGE_FLAG 16 +#define CERT_FIND_OPTIONAL_ENHKEY_USAGE_FLAG 1 +#define CERT_FIND_NO_ENHKEY_USAGE_FLAG 8 +#define CERT_FIND_VALID_ENHKEY_USAGE_FLAG 32 +#define CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG 2 +#define CERT_CASE_INSENSITIVE_IS_RDN_ATTRS_FLAG 2 +#define CERT_UNICODE_IS_RDN_ATTRS_FLAG 1 +#define CERT_CHAIN_FIND_BY_ISSUER 1 +#define CERT_CHAIN_FIND_BY_ISSUER_COMPARE_KEY_FLAG 1 +#define CERT_CHAIN_FIND_BY_ISSUER_COMPLEX_CHAIN_FLAG 2 +#define CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_FLAG 32768 +#define CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_URL_FLAG 4 +#define CERT_CHAIN_FIND_BY_ISSUER_LOCAL_MACHINE_FLAG 8 +#define CERT_CHAIN_FIND_BY_ISSUER_NO_KEY_FLAG 16384 +#define CERT_STORE_PROV_SYSTEM 10 +#define CERT_SYSTEM_STORE_LOCAL_MACHINE 131072 +#define szOID_PKIX_KP_SERVER_AUTH "4235600" +#define szOID_SERVER_GATED_CRYPTO "4235658" +#define szOID_SGC_NETSCAPE "2.16.840.1.113730.4.1" +#define szOID_PKIX_KP_CLIENT_AUTH "1.3.6.1.5.5.7.3.2" +#define CRYPT_NOHASHOID 0x00000001 +#define CRYPT_NO_SALT 0x10 +#define CRYPT_PREGEN 0x40 +#define CRYPT_RECIPIENT 0x10 +#define CRYPT_INITIATOR 0x40 +#define CRYPT_ONLINE 0x80 +#define CRYPT_SF 0x100 +#define CRYPT_CREATE_IV 0x200 +#define CRYPT_KEK 0x400 +#define CRYPT_DATA_KEY 0x800 +#define CRYPT_VOLATILE 0x1000 +#define CRYPT_SGCKEY 0x2000 +#define KP_IV 0x00000001 +#define KP_SALT 0x00000002 +#define KP_PADDING 0x00000003 +#define KP_MODE 0x00000004 +#define KP_MODE_BITS 0x00000005 +#define KP_PERMISSIONS 0x00000006 +#define KP_ALGID 0x00000007 +#define KP_BLOCKLEN 0x00000008 +#define KP_KEYLEN 0x00000009 +#define KP_SALT_EX 0x0000000a +#define KP_P 0x0000000b +#define KP_G 0x0000000c +#define KP_Q 0x0000000d +#define KP_X 0x0000000e +#define KP_Y 0x0000000f +#define KP_RA 0x00000010 +#define KP_RB 0x00000011 +#define KP_INFO 0x00000012 +#define KP_EFFECTIVE_KEYLEN 0x00000013 +#define KP_SCHANNEL_ALG 0x00000014 +#define KP_PUB_PARAMS 0x00000027 +#define CRYPT_FLAG_PCT1 0x0001 +#define CRYPT_FLAG_SSL2 0x0002 +#define CRYPT_FLAG_SSL3 0x0004 +#define CRYPT_FLAG_TLS1 0x0008 +#define CRYPT_FLAG_IPSEC 0x0010 +#define CRYPT_FLAG_SIGNING 0x0020 +#define SCHANNEL_MAC_KEY 0x00000000 +#define SCHANNEL_ENC_KEY 0x00000001 +#define INTERNATIONAL_USAGE 0x00000001 + +typedef UINT ALG_ID; +typedef struct _VTableProvStruc {FARPROC FuncVerifyImage;} VTableProvStruc,*PVTableProvStruc; +typedef ULONG HCRYPTPROV; +typedef ULONG HCRYPTKEY; +typedef ULONG HCRYPTHASH; +typedef PVOID HCERTSTORE; +typedef PVOID HCRYPTMSG; +typedef PVOID HCERTCHAINENGINE; +typedef struct _CRYPTOAPI_BLOB { + DWORD cbData; + BYTE* pbData; +} CRYPT_INTEGER_BLOB, *PCRYPT_INTEGER_BLOB, + CRYPT_UINT_BLOB, *PCRYPT_UINT_BLOB, + CRYPT_OBJID_BLOB, *PCRYPT_OBJID_BLOB, + CERT_NAME_BLOB, *PCERT_NAME_BLOB, + CERT_RDN_VALUE_BLOB,*PCERT_RDN_VALUE_BLOB, + CERT_BLOB, *PCERT_BLOB, + CRL_BLOB, *PCRL_BLOB, + DATA_BLOB, *PDATA_BLOB, + CRYPT_DATA_BLOB, *PCRYPT_DATA_BLOB, + CRYPT_HASH_BLOB, *PCRYPT_HASH_BLOB, + CRYPT_DIGEST_BLOB, *PCRYPT_DIGEST_BLOB, + CRYPT_DER_BLOB, *PCRYPT_DER_BLOB, + CRYPT_ATTR_BLOB, *PCRYPT_ATTR_BLOB; +/* not described in SDK; has the same layout as HTTPSPolicyCallbackData */ +typedef struct _SSL_EXTRA_CERT_CHAIN_POLICY_PARA { + DWORD cbStruct; + DWORD dwAuthType; + DWORD fdwChecks; + LPWSTR pwszServerName; +} SSL_EXTRA_CERT_CHAIN_POLICY_PARA, *PSSL_EXTRA_CERT_CHAIN_POLICY_PARA, + HTTPSPolicyCallbackData, *PHTTPSPolicyCallbackData; +/* #if (_WIN32_WINNT>=0x500) */ +typedef struct _CERT_CHAIN_POLICY_PARA { + DWORD cbSize; + DWORD dwFlags; + void* pvExtraPolicyPara; +} CERT_CHAIN_POLICY_PARA, *PCERT_CHAIN_POLICY_PARA; +typedef struct _CERT_CHAIN_POLICY_STATUS { + DWORD cbSize; + DWORD dwError; + LONG lChainIndex; + LONG lElementIndex; + void* pvExtraPolicyStatus; +} CERT_CHAIN_POLICY_STATUS, *PCERT_CHAIN_POLICY_STATUS; +/* #endif */ +typedef struct _CRYPT_ALGORITHM_IDENTIFIER { + LPSTR pszObjId; + CRYPT_OBJID_BLOB Parameters; +} CRYPT_ALGORITHM_IDENTIFIER, *PCRYPT_ALGORITHM_IDENTIFIER; +typedef struct _CRYPT_BIT_BLOB { + DWORD cbData; + BYTE* pbData; + DWORD cUnusedBits; +} CRYPT_BIT_BLOB, *PCRYPT_BIT_BLOB; +typedef struct _CERT_PUBLIC_KEY_INFO { + CRYPT_ALGORITHM_IDENTIFIER Algorithm; + CRYPT_BIT_BLOB PublicKey; +} CERT_PUBLIC_KEY_INFO, *PCERT_PUBLIC_KEY_INFO; +typedef struct _CERT_EXTENSION { + LPSTR pszObjId; + BOOL fCritical; + CRYPT_OBJID_BLOB Value; +} CERT_EXTENSION, *PCERT_EXTENSION; +typedef struct _CERT_INFO { + DWORD dwVersion; + CRYPT_INTEGER_BLOB SerialNumber; + CRYPT_ALGORITHM_IDENTIFIER SignatureAlgorithm; + CERT_NAME_BLOB Issuer; + FILETIME NotBefore; + FILETIME NotAfter; + CERT_NAME_BLOB Subject; + CERT_PUBLIC_KEY_INFO SubjectPublicKeyInfo; + CRYPT_BIT_BLOB IssuerUniqueId; + CRYPT_BIT_BLOB SubjectUniqueId; + DWORD cExtension; + PCERT_EXTENSION rgExtension; +} CERT_INFO, *PCERT_INFO; +typedef struct _CERT_CONTEXT { + DWORD dwCertEncodingType; + BYTE* pbCertEncoded; + DWORD cbCertEncoded; + PCERT_INFO pCertInfo; + HCERTSTORE hCertStore; +} CERT_CONTEXT, *PCERT_CONTEXT; +typedef const CERT_CONTEXT *PCCERT_CONTEXT; +typedef struct _CTL_USAGE { + DWORD cUsageIdentifier; + LPSTR *rgpszUsageIdentifier; +} CTL_USAGE, *PCTRL_USAGE, + CERT_ENHKEY_USAGE, *PCERT_ENHKEY_USAGE; +typedef struct _CERT_USAGE_MATCH { + DWORD dwType; + CERT_ENHKEY_USAGE Usage; +} CERT_USAGE_MATCH, *PCERT_USAGE_MATCH; +/* #if (_WIN32_WINNT>=0x500) */ +typedef struct _CERT_CHAIN_PARA { + DWORD cbSize; + CERT_USAGE_MATCH RequestedUsage; +#if CERT_CHAIN_PARA_HAS_EXTRA_FIELDS + CERT_USAGE_MATCH RequestedIssuancePolicy; + DWORD dwUrlRetrievalTimeout; + BOOL fCheckRevocationFreshnessTime; + DWORD dwRevocationFreshnessTime; +#endif +} CERT_CHAIN_PARA, *PCERT_CHAIN_PARA; +typedef BOOL (WINAPI *PFN_CERT_CHAIN_FIND_BY_ISSUER_CALLBACK)(PCCERT_CONTEXT,void*); +typedef struct _CERT_CHAIN_FIND_BY_ISSUER_PARA { + DWORD cbSize; + LPCSTR pszUsageIdentifier; + DWORD dwKeySpec; + DWORD dwAcquirePrivateKeyFlags; + DWORD cIssuer; + CERT_NAME_BLOB* rgIssuer; + PFN_CERT_CHAIN_FIND_BY_ISSUER_CALLBACK pfnFIndCallback; + void* pvFindArg; + DWORD* pdwIssuerChainIndex; + DWORD* pdwIssuerElementIndex; +} CERT_CHAIN_FIND_BY_ISSUER_PARA, *PCERT_CHAIN_FIND_BY_ISSUER_PARA; +/* #endif */ +typedef struct _CERT_TRUST_STATUS { + DWORD dwErrorStatus; + DWORD dwInfoStatus; +} CERT_TRUST_STATUS, *PCERT_TRUST_STATUS; +typedef struct _CRL_ENTRY { + CRYPT_INTEGER_BLOB SerialNumber; + FILETIME RevocationDate; + DWORD cExtension; + PCERT_EXTENSION rgExtension; +} CRL_ENTRY, *PCRL_ENTRY; +typedef struct _CRL_INFO { + DWORD dwVersion; + CRYPT_ALGORITHM_IDENTIFIER SignatureAlgorithm; + CERT_NAME_BLOB Issuer; + FILETIME ThisUpdate; + FILETIME NextUpdate; + DWORD cCRLEntry; + PCRL_ENTRY rgCRLEntry; + DWORD cExtension; + PCERT_EXTENSION rgExtension; +} CRL_INFO, *PCRL_INFO; +typedef struct _CRL_CONTEXT { + DWORD dwCertEncodingType; + BYTE* pbCrlEncoded; + DWORD cbCrlEncoded; + PCRL_INFO pCrlInfo; + HCERTSTORE hCertStore; +} CRL_CONTEXT, *PCRL_CONTEXT; +typedef const CRL_CONTEXT *PCCRL_CONTEXT; +typedef struct _CERT_REVOCATION_CRL_INFO { + DWORD cbSize; + PCCRL_CONTEXT pBaseCRLContext; + PCCRL_CONTEXT pDeltaCRLContext; + PCRL_ENTRY pCrlEntry; + BOOL fDeltaCrlEntry; +} CERT_REVOCATION_CRL_INFO, *PCERT_REVOCATION_CRL_INFO; +typedef struct _CERT_REVOCATION_INFO { + DWORD cbSize; + DWORD dwRevocationResult; + LPCSTR pszRevocationOid; + LPVOID pvOidSpecificInfo; + BOOL fHasFreshnessTime; + DWORD dwFreshnessTime; + PCERT_REVOCATION_CRL_INFO pCrlInfo; +} CERT_REVOCATION_INFO, *PCERT_REVOCATION_INFO; +/* #if (_WIN32_WINNT>=0x500) */ +typedef struct _CERT_CHAIN_ELEMENT { + DWORD cbSize; + PCCERT_CONTEXT pCertContext; + CERT_TRUST_STATUS TrustStatus; + PCERT_REVOCATION_INFO pRevocationInfo; + PCERT_ENHKEY_USAGE pIssuanceUsage; + PCERT_ENHKEY_USAGE pApplicationUsage; +} CERT_CHAIN_ELEMENT, *PCERT_CHAIN_ELEMENT; +/* #endif */ +typedef struct _CRYPT_ATTRIBUTE { + LPSTR pszObjId; + DWORD cValue; + PCRYPT_ATTR_BLOB rgValue; +} CRYPT_ATTRIBUTE, *PCRYPT_ATTRIBUTE; +typedef struct _CTL_ENTRY { + CRYPT_DATA_BLOB SubjectIdentifier; + DWORD cAttribute; + PCRYPT_ATTRIBUTE rgAttribute; +} CTL_ENTRY, *PCTL_ENTRY; +typedef struct _CTL_INFO { + DWORD dwVersion; + CTL_USAGE SubjectUsage; + CRYPT_DATA_BLOB ListIdentifier; + CRYPT_INTEGER_BLOB SequenceNumber; + FILETIME ThisUpdate; + FILETIME NextUpdate; + CRYPT_ALGORITHM_IDENTIFIER SubjectAlgorithm; + DWORD cCTLEntry; + PCTL_ENTRY rgCTLEntry; + DWORD cExtension; + PCERT_EXTENSION rgExtension; +} CTL_INFO, *PCTL_INFO; +typedef struct _CTL_CONTEXT { + DWORD dwMsgAndCertEncodingType; + BYTE* pbCtlEncoded; + DWORD cbCtlEncoded; + PCTL_INFO pCtlInfo; + HCERTSTORE hCertStore; + HCRYPTMSG hCryptMsg; + BYTE* pbCtlContent; + DWORD cbCtlContent; +} CTL_CONTEXT, *PCTL_CONTEXT; +typedef const CTL_CONTEXT *PCCTL_CONTEXT; +typedef struct _CERT_TRUST_LIST_INFO { + DWORD cbSize; + PCTL_ENTRY pCtlEntry; + PCCTL_CONTEXT pCtlContext; +} CERT_TRUST_LIST_INFO, *PCERT_TRUST_LIST_INFO; +typedef struct _CERT_SIMPLE_CHAIN { + DWORD cbSize; + CERT_TRUST_STATUS TrustStatus; + DWORD cElement; + PCERT_CHAIN_ELEMENT* rgpElement; + PCERT_TRUST_LIST_INFO pTrustListInfo; + BOOL fHasRevocationFreshnessTime; + DWORD dwRevocationFreshnessTime; +} CERT_SIMPLE_CHAIN, *PCERT_SIMPLE_CHAIN; +/* #if (_WIN32_WINNT>=0x500) */ +typedef const struct _CERT_CHAIN_CONTEXT* PCCERT_CHAIN_CONTEXT; +typedef struct _CERT_CHAIN_CONTEXT { + DWORD cbSize; + CERT_TRUST_STATUS TrustStatus; + DWORD cChain; + PCERT_SIMPLE_CHAIN* rgpChain; + DWORD cLowerQualityChainContext; + PCCERT_CHAIN_CONTEXT* rgpLowerQualityChainContext; + BOOL fHasRevocationFreshnessTime; + DWORD dwRevocationFreshnessTime; +} CERT_CHAIN_CONTEXT, *PCERT_CHAIN_CONTEXT; +/* #endif */ +typedef struct _PROV_ENUMALGS { + ALG_ID aiAlgid; + DWORD dwBitLen; + DWORD dwNameLen; + CHAR szName[20]; +} PROV_ENUMALGS; +typedef struct _PUBLICKEYSTRUC { + BYTE bType; + BYTE bVersion; + WORD reserved; + ALG_ID aiKeyAlg; +} PUBLICKEYSTRUC; +typedef struct _RSAPUBKEY { + DWORD magic; + DWORD bitlen; + DWORD pubexp; +} RSAPUBKEY; + +BOOL WINAPI CertCloseStore(HCERTSTORE,DWORD); +BOOL WINAPI CertGetCertificateChain(HCERTCHAINENGINE,PCCERT_CONTEXT,LPFILETIME,HCERTSTORE,PCERT_CHAIN_PARA,DWORD,LPVOID,PCCERT_CHAIN_CONTEXT*); +BOOL WINAPI CertVerifyCertificateChainPolicy(LPCSTR,PCCERT_CHAIN_CONTEXT,PCERT_CHAIN_POLICY_PARA,PCERT_CHAIN_POLICY_STATUS); +void WINAPI CertFreeCertificateChain(PCCERT_CHAIN_CONTEXT); +DWORD WINAPI CertNameToStrA(DWORD,PCERT_NAME_BLOB,DWORD,LPSTR,DWORD); +DWORD WINAPI CertNameToStrW(DWORD,PCERT_NAME_BLOB,DWORD,LPWSTR,DWORD); +HCERTSTORE WINAPI CertOpenSystemStoreA(HCRYPTPROV,LPCSTR); +HCERTSTORE WINAPI CertOpenSystemStoreW(HCRYPTPROV,LPCWSTR); +HCERTSTORE WINAPI CertOpenStore(LPCSTR,DWORD,HCRYPTPROV,DWORD,const void*); +PCCERT_CONTEXT WINAPI CertFindCertificateInStore(HCERTSTORE,DWORD,DWORD,DWORD,const void*,PCCERT_CONTEXT); +BOOL WINAPI CertFreeCertificateContext(PCCERT_CONTEXT); +PCCERT_CONTEXT WINAPI CertGetIssuerCertificateFromStore(HCERTSTORE,PCCERT_CONTEXT,PCCERT_CONTEXT,DWORD*); +PCCERT_CHAIN_CONTEXT WINAPI CertFindChainInStore(HCERTSTORE,DWORD,DWORD,DWORD,const void*,PCCERT_CHAIN_CONTEXT); +BOOL WINAPI CryptAcquireContextA(HCRYPTPROV*,LPCSTR,LPCSTR,DWORD,DWORD); +BOOL WINAPI CryptAcquireContextW(HCRYPTPROV*,LPCWSTR,LPCWSTR,DWORD,DWORD); +BOOL WINAPI CryptContextAddRef(HCRYPTPROV,DWORD*,DWORD); +BOOL WINAPI CryptReleaseContext(HCRYPTPROV,DWORD); +BOOL WINAPI CryptGenKey(HCRYPTPROV,ALG_ID,DWORD,HCRYPTKEY*); +BOOL WINAPI CryptDeriveKey(HCRYPTPROV,ALG_ID,HCRYPTHASH,DWORD,HCRYPTKEY*); +BOOL WINAPI CryptDestroyKey(HCRYPTKEY); +#if (WINVER >= 0x0500) +BOOL WINAPI CryptDuplicateHash(HCRYPTHASH,DWORD*,DWORD,HCRYPTHASH*); +BOOL WINAPI CryptDuplicateKey(HCRYPTKEY,DWORD*,DWORD,HCRYPTKEY*); +#endif +BOOL WINAPI CryptSetKeyParam(HCRYPTKEY,DWORD,PBYTE,DWORD); +BOOL WINAPI CryptGetKeyParam(HCRYPTKEY,DWORD,PBYTE,PDWORD,DWORD); +BOOL WINAPI CryptSetHashParam(HCRYPTHASH,DWORD,PBYTE,DWORD); +BOOL WINAPI CryptGetHashParam(HCRYPTHASH,DWORD,PBYTE,PDWORD,DWORD); +BOOL WINAPI CryptSetProvParam(HCRYPTPROV,DWORD,PBYTE,DWORD); +BOOL WINAPI CryptGetProvParam(HCRYPTPROV,DWORD,PBYTE,PDWORD,DWORD); +BOOL WINAPI CryptGenRandom(HCRYPTPROV,DWORD,PBYTE); +BOOL WINAPI CryptGetUserKey(HCRYPTPROV,DWORD,HCRYPTKEY*); +BOOL WINAPI CryptExportKey(HCRYPTKEY,HCRYPTKEY,DWORD,DWORD,PBYTE,PDWORD); +BOOL WINAPI CryptImportKey(HCRYPTPROV,PBYTE,DWORD,HCRYPTKEY,DWORD,HCRYPTKEY*); +BOOL WINAPI CryptEncrypt(HCRYPTKEY,HCRYPTHASH,BOOL,DWORD,PBYTE,PDWORD,DWORD); +BOOL WINAPI CryptDecrypt(HCRYPTKEY,HCRYPTHASH,BOOL,DWORD,PBYTE,PDWORD); +BOOL WINAPI CryptCreateHash(HCRYPTPROV,ALG_ID,HCRYPTKEY,DWORD,HCRYPTHASH*); +BOOL WINAPI CryptHashData(HCRYPTHASH,PBYTE,DWORD,DWORD); +BOOL WINAPI CryptHashSessionKey(HCRYPTHASH,HCRYPTKEY,DWORD); +BOOL WINAPI CryptGetHashValue(HCRYPTHASH,DWORD,PBYTE,PDWORD); +BOOL WINAPI CryptDestroyHash(HCRYPTHASH); +BOOL WINAPI CryptSignHashA(HCRYPTHASH,DWORD,LPCSTR,DWORD,PBYTE,PDWORD); +BOOL WINAPI CryptSignHashW(HCRYPTHASH,DWORD,LPCWSTR,DWORD,PBYTE,PDWORD); +BOOL WINAPI CryptVerifySignatureA(HCRYPTHASH,PBYTE,DWORD,HCRYPTKEY,LPCSTR,DWORD); +BOOL WINAPI CryptVerifySignatureW(HCRYPTHASH,PBYTE,DWORD,HCRYPTKEY,LPCWSTR,DWORD); +BOOL WINAPI CryptSetProviderA(LPCSTR,DWORD); +BOOL WINAPI CryptSetProviderW(LPCWSTR,DWORD); + +#ifdef UNICODE +#define CertNameToStr CertNameToStrW +#define CryptAcquireContext CryptAcquireContextW +#define CryptSignHash CryptSignHashW +#define CryptVerifySignature CryptVerifySignatureW +#define CryptSetProvider CryptSetProviderW +#define CertOpenSystemStore CertOpenSystemStoreW +#define CERT_FIND_SUBJECT_STR CERT_FIND_SUBJECT_STR_W +#define CERT_FIND_ISSUER_STR CERT_FIND_ISSUER_STR_W +#define MS_DEF_PROV MS_DEF_PROV_W +#define MS_ENHANCED_PROV MS_ENHANCED_PROV_W +#define MS_STRONG_PROV MS_STRONG_PROV_W +#define MS_DEF_RSA_SIG_PROV MS_DEF_RSA_SIG_PROV_W +#define MS_DEF_RSA_SCHANNEL_PROV MS_DEF_RSA_SCHANNEL_PROV_W +#define MS_DEF_DSS_PROV MS_DEF_DSS_PROV_W +#define MS_DEF_DSS_DH_PROV MS_DEF_DSS_DH_PROV_W +#define MS_ENH_DSS_DH_PROV MS_ENH_DSS_DH_PROV_W +#define MS_DEF_DH_SCHANNEL_PROV MS_DEF_DH_SCHANNEL_PROV_W +#define MS_SCARD_PROV MS_SCARD_PROV_W +#else +#define CertNameToStr CertNameToStrA +#define CryptAcquireContext CryptAcquireContextA +#define CryptSignHash CryptSignHashA +#define CryptVerifySignature CryptVerifySignatureA +#define CryptSetProvider CryptSetProviderA +#define CertOpenSystemStore CertOpenSystemStoreA +#define CERT_FIND_SUBJECT_STR CERT_FIND_SUBJECT_STR_A +#define CERT_FIND_ISSUER_STR CERT_FIND_ISSUER_STR_A +#define MS_DEF_PROV MS_DEF_PROV_A +#define MS_ENHANCED_PROV MS_ENHANCED_PROV_A +#define MS_STRONG_PROV MS_STRONG_PROV_A +#define MS_DEF_RSA_SIG_PROV MS_DEF_RSA_SIG_PROV_A +#define MS_DEF_RSA_SCHANNEL_PROV MS_DEF_RSA_SCHANNEL_PROV_A +#define MS_DEF_DSS_PROV MS_DEF_DSS_PROV_A +#define MS_DEF_DSS_DH_PROV MS_DEF_DSS_DH_PROV_A +#define MS_ENH_DSS_DH_PROV MS_ENH_DSS_DH_PROV_A +#define MS_DEF_DH_SCHANNEL_PROV MS_DEF_DH_SCHANNEL_PROV_A +#define MS_SCARD_PROV MS_SCARD_PROV_A +#endif +#ifdef __cplusplus +} +#endif +#endif /* _WINCRYPT_H */ diff --git a/reactos/w32api/include/windef.h b/reactos/w32api/include/windef.h new file mode 100644 index 00000000000..ffc09debf9b --- /dev/null +++ b/reactos/w32api/include/windef.h @@ -0,0 +1,331 @@ +#ifndef _WINDEF_H +#define _WINDEF_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef WINVER +#define WINVER 0x0400 +/* + * If you need Win32 API features newer the Win95 and WinNT then you must + * define WINVER before including windows.h or any other method of including + * the windef.h header. + */ +#endif +#ifndef _WIN32_WINNT +#define _WIN32_WINNT WINVER +/* + * There may be the need to define _WIN32_WINNT to a value different from + * the value of WINVER. I don't have any example of why you would do that. + * However, if you must then define _WIN32_WINNT to the value required before + * including windows.h or any other method of including the windef.h header. + */ +#endif +#ifndef WIN32 +#define WIN32 +#endif +#ifndef _WIN32 +#define _WIN32 +#endif +#define FAR +#define far +#define NEAR +#define near +#ifndef CONST +#define CONST const +#endif +#undef MAX_PATH +#define MAX_PATH 260 + +#ifndef NULL +#ifdef __cplusplus +#define NULL 0 +#else +#define NULL ((void*)0) +#endif +#endif +#ifndef FALSE +#define FALSE 0 +#endif +#ifndef TRUE +#define TRUE 1 +#endif +#define IN +#define OUT +#ifndef OPTIONAL +#define OPTIONAL +#endif + +#ifdef __GNUC__ +#define PACKED __attribute__((packed)) +#ifndef _fastcall +#define _fastcall __attribute__((fastcall)) +#endif +#ifndef __fastcall +#define __fastcall __attribute__((fastcall)) +#endif +#ifndef _stdcall +#define _stdcall __attribute__((stdcall)) +#endif +#ifndef __stdcall +#define __stdcall __attribute__((stdcall)) +#endif +#ifndef _cdecl +#define _cdecl __attribute__((cdecl)) +#endif +#ifndef __cdecl +#define __cdecl __attribute__((cdecl)) +#endif +#ifndef __declspec +#define __declspec(e) __attribute__((e)) +#endif +#ifndef _declspec +#define _declspec(e) __attribute__((e)) +#endif +#elif defined(__WATCOMC__) +#define PACKED +#else +#define PACKED +#define _cdecl +#define __cdecl +#endif + +#undef pascal +#undef _pascal +#undef __pascal +#define pascal __stdcall +#define _pascal __stdcall +#define __pascal __stdcall +#define PASCAL _pascal +#define CDECL _cdecl +#define STDCALL __stdcall +#define FASTCALL __fastcall +#define WINAPI __stdcall +#define WINAPIV __cdecl +#define APIENTRY __stdcall +#define CALLBACK __stdcall +#define APIPRIVATE __stdcall + +#define DECLSPEC_IMPORT __declspec(dllimport) +#define DECLSPEC_EXPORT __declspec(dllexport) +#ifdef __GNUC__ +#define DECLSPEC_NORETURN __declspec(noreturn) +#define DECLARE_STDCALL_P( type ) __stdcall type +#elif defined(__WATCOMC__) +#define DECLSPEC_NORETURN +#define DECLARE_STDCALL_P( type ) type __stdcall +#endif /* __GNUC__/__WATCOMC__ */ +#define MAKEWORD(a,b) ((WORD)(((BYTE)(a))|(((WORD)((BYTE)(b)))<<8))) +#define MAKELONG(a,b) ((LONG)(((WORD)(a))|(((DWORD)((WORD)(b)))<<16))) +#define LOWORD(l) ((WORD)((DWORD)(l))) +#define HIWORD(l) ((WORD)(((DWORD)(l)>>16)&0xFFFF)) +#define LOBYTE(w) ((BYTE)(w)) +#define HIBYTE(w) ((BYTE)(((WORD)(w)>>8)&0xFF)) + +#ifndef __WATCOMC__ +#ifndef _export +#define _export +#endif +#ifndef __export +#define __export +#endif +#endif + +#ifndef NOMINMAX +#ifndef max +#define max(a,b) ((a)>(b)?(a):(b)) +#endif +#ifndef min +#define min(a,b) ((a)<(b)?(a):(b)) +#endif +#endif + +#define UNREFERENCED_PARAMETER(P) {(P)=(P);} +#define UNREFERENCED_LOCAL_VARIABLE(L) {(L)=(L);} +#define DBG_UNREFERENCED_PARAMETER(P) +#define DBG_UNREFERENCED_LOCAL_VARIABLE(L) + +#ifdef __GNUC__ +#ifndef NONAMELESSUNION +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) +#define _ANONYMOUS_UNION __extension__ +#define _ANONYMOUS_STRUCT __extension__ +#else +#if defined(__cplusplus) +#define _ANONYMOUS_UNION __extension__ +#endif /* __cplusplus */ +#endif /* __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) */ +#endif /* NONAMELESSUNION */ +#elif defined(__WATCOMC__) +#define _ANONYMOUS_UNION +#define _ANONYMOUS_STRUCT +#endif /* __GNUC__/__WATCOMC__ */ + +#ifndef _ANONYMOUS_UNION +#define _ANONYMOUS_UNION +#define _UNION_NAME(x) x +#define DUMMYUNIONNAME u +#define DUMMYUNIONNAME2 u2 +#define DUMMYUNIONNAME3 u3 +#define DUMMYUNIONNAME4 u4 +#define DUMMYUNIONNAME5 u5 +#define DUMMYUNIONNAME6 u6 +#define DUMMYUNIONNAME7 u7 +#define DUMMYUNIONNAME8 u8 +#else +#define _UNION_NAME(x) +#define DUMMYUNIONNAME +#define DUMMYUNIONNAME2 +#define DUMMYUNIONNAME3 +#define DUMMYUNIONNAME4 +#define DUMMYUNIONNAME5 +#define DUMMYUNIONNAME6 +#define DUMMYUNIONNAME7 +#define DUMMYUNIONNAME8 +#endif +#ifndef _ANONYMOUS_STRUCT +#define _ANONYMOUS_STRUCT +#define _STRUCT_NAME(x) x +#define DUMMYSTRUCTNAME s +#define DUMMYSTRUCTNAME2 s2 +#define DUMMYSTRUCTNAME3 s3 +#else +#define _STRUCT_NAME(x) +#define DUMMYSTRUCTNAME +#define DUMMYSTRUCTNAME2 +#define DUMMYSTRUCTNAME3 +#endif + +#ifndef NO_STRICT +#ifndef STRICT +#define STRICT 1 +#endif +#endif + +/* FIXME: This will make some code compile. The programs will most + likely crash when an exception is raised, but at least they will + compile. */ +#if defined (__GNUC__) && defined (__SEH_NOOP) +#define __try +#define __except(x) if (0) /* don't execute handler */ +#define __finally + +#define _try __try +#define _except __except +#define _finally __finally +#endif + +typedef unsigned long DWORD; +typedef int WINBOOL,*PWINBOOL,*LPWINBOOL; +/* FIXME: Is there a good solution to this? */ +#ifndef XFree86Server +#ifndef __OBJC__ +typedef WINBOOL BOOL; +#else +#define BOOL WINBOOL +#endif +typedef unsigned char BYTE; +#endif /* ndef XFree86Server */ +typedef BOOL *PBOOL,*LPBOOL; +typedef unsigned short WORD; +typedef float FLOAT; +typedef FLOAT *PFLOAT; +typedef BYTE *PBYTE,*LPBYTE; +typedef int *PINT,*LPINT; +typedef WORD *PWORD,*LPWORD; +typedef long *LPLONG; +typedef DWORD *PDWORD,*LPDWORD; +typedef CONST void *PCVOID,*LPCVOID; +typedef int INT; +typedef unsigned int UINT,*PUINT,*LPUINT; + +#include <winnt.h> + +typedef UINT_PTR WPARAM; +typedef LONG_PTR LPARAM; +typedef LONG_PTR LRESULT; +#ifndef _HRESULT_DEFINED +typedef LONG HRESULT; +#define _HRESULT_DEFINED +#endif +#ifndef XFree86Server +typedef WORD ATOM; +#endif /* XFree86Server */ +typedef HANDLE HGLOBAL; +typedef HANDLE HLOCAL; +typedef HANDLE GLOBALHANDLE; +typedef HANDLE LOCALHANDLE; +typedef void *HGDIOBJ; +DECLARE_HANDLE(HACCEL); +DECLARE_HANDLE(HBITMAP); +DECLARE_HANDLE(HBRUSH); +DECLARE_HANDLE(HCOLORSPACE); +DECLARE_HANDLE(HDC); +DECLARE_HANDLE(HGLRC); +DECLARE_HANDLE(HDESK); +DECLARE_HANDLE(HENHMETAFILE); +DECLARE_HANDLE(HFONT); +DECLARE_HANDLE(HICON); +DECLARE_HANDLE(HKEY); +/* FIXME: How to handle these. SM_CMONITORS etc in winuser.h also. */ +/* #if (WINVER >= 0x0500) */ +DECLARE_HANDLE(HMONITOR); +#define HMONITOR_DECLARED 1 +DECLARE_HANDLE(HTERMINAL); +DECLARE_HANDLE(HWINEVENTHOOK); +/* #endif */ +typedef HKEY *PHKEY; +DECLARE_HANDLE(HMENU); +DECLARE_HANDLE(HMETAFILE); +DECLARE_HANDLE(HINSTANCE); +typedef HINSTANCE HMODULE; +DECLARE_HANDLE(HPALETTE); +DECLARE_HANDLE(HPEN); +DECLARE_HANDLE(HRGN); +DECLARE_HANDLE(HRSRC); +DECLARE_HANDLE(HSTR); +DECLARE_HANDLE(HTASK); +DECLARE_HANDLE(HWND); +DECLARE_HANDLE(HWINSTA); +DECLARE_HANDLE(HKL); +typedef int HFILE; +typedef HICON HCURSOR; +typedef DWORD COLORREF; +typedef int (WINAPI *FARPROC)(); +typedef int (WINAPI *NEARPROC)(); +typedef int (WINAPI *PROC)(); +typedef struct tagRECT { + LONG left; + LONG top; + LONG right; + LONG bottom; +} RECT,*PRECT,*LPRECT; +typedef const RECT *LPCRECT; +typedef struct tagRECTL { + LONG left; + LONG top; + LONG right; + LONG bottom; +} RECTL,*PRECTL,*LPRECTL; +typedef const RECTL *LPCRECTL; +typedef struct tagPOINT { + LONG x; + LONG y; +} POINT,POINTL,*PPOINT,*LPPOINT,*PPOINTL,*LPPOINTL; +typedef struct tagSIZE { + LONG cx; + LONG cy; +} SIZE,SIZEL,*PSIZE,*LPSIZE,*PSIZEL,*LPSIZEL; +typedef struct tagPOINTS { + SHORT x; + SHORT y; +} POINTS,*PPOINTS,*LPPOINTS; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/windns.h b/reactos/w32api/include/windns.h new file mode 100644 index 00000000000..3eb8f245b5b --- /dev/null +++ b/reactos/w32api/include/windns.h @@ -0,0 +1,363 @@ +#ifndef _WINDNS_H +#define _WINDNS_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define DNS_QUERY_STANDARD 0x0 +#define DNS_QUERY_ACCEPT_TRUNCATED_RESPONSE 0x1 +#define DNS_QUERY_USE_TCP_ONLY 0x2 +#define DNS_QUERY_NO_RECURSION 0x4 +#define DNS_QUERY_BYPASS_CACHE 0x8 +#define DNS_QUERY_NO_WIRE_QUERY 0x10 +#define DNS_QUERY_NO_LOCAL_NAME 0x20 +#define DNS_QUERY_NO_HOSTS_FILE 0x40 +#define DNS_QUERY_NO_NETBT 0x80 +#define DNS_QUERY_TREAT_AS_FQDN 0x1000 +#define DNS_QUERY_WIRE_ONLY 0x100 +#define DNS_QUERY_RETURN_MESSAGE 0x200 +#define DNS_QUERY_DONT_RESET_TTL_VALUES 0x100000 +#define DNS_QUERY_RESERVED 0xff000000 + +#define DNS_UPDATE_SECURITY_USE_DEFAULT 0x0 +#define DNS_UPDATE_SECURITY_OFF 0x10 +#define DNS_UPDATE_SECURITY_ON 0x20 +#define DNS_UPDATE_SECURITY_ONLY 0x100 +#define DNS_UPDATE_CACHE_SECURITY_CONTEXT 0x200 +#define DNS_UPDATE_TEST_USE_LOCAL_SYS_ACCT 0x400 +#define DNS_UPDATE_FORCE_SECURITY_NEGO 0x800 +#define DNS_UPDATE_RESERVED 0xffff0000 + +#ifndef RC_INVOKE +typedef DWORD IP4_ADDRESS; +typedef DWORD DNS_STATUS; +enum { + DNS_TYPE_A=1, + DNS_TYPE_NS, + DNS_TYPE_MD, + DNS_TYPE_MF, + DNS_TYPE_CNAME, + DNS_TYPE_SOA, + DNS_TYPE_MB, + DNS_TYPE_MG, + DNS_TYPE_MR, + DNS_TYPE_NULL, + DNS_TYPE_WKS, + DNS_TYPE_PTR, + DNS_TYPE_HINFO, + DNS_TYPE_MINFO, + DNS_TYPE_MX, + DNS_TYPE_TEXT +}; +typedef enum _DNS_CHARSET +{ + DnsCharSetUnknown, + DnsCharSetUnicode, + DnsCharSetUtf8, + DnsCharSetAnsi +} DNS_CHARSET; +typedef enum +{ + DnsConfigPrimaryDomainName_W, + DnsConfigPrimaryDomainName_A, + DnsConfigPrimaryDomainName_UTF8, + DnsConfigAdapterDomainName_W, + DnsConfigAdapterDomainName_A, + DnsConfigAdapterDomainName_UTF8, + DnsConfigDnsServerList, + DnsConfigSearchList, + DnsConfigAdapterInfo, + DnsConfigPrimaryHostNameRegistrationEnabled, + DnsConfigAdapterHostNameRegistrationEnabled, + DnsConfigAddressRegistrationMaxCount, + DnsConfigHostName_W, + DnsConfigHostName_A, + DnsConfigHostName_UTF8, + DnsConfigFullHostName_W, + DnsConfigFullHostName_A, + DnsConfigFullHostName_UTF8 +} DNS_CONFIG_TYPE; +typedef enum +{ + DnsFreeFlat = 0, + DnsFreeRecordList, + DnsFreeParsedMessageFields +} DNS_FREE_TYPE; +typedef enum _DNS_NAME_FORMAT +{ + DnsNameDomain, + DnsNameDomainLabel, + DnsNameHostnameFull, + DnsNameHostnameLabel, + DnsNameWildcard, + DnsNameSrvRecord +} DNS_NAME_FORMAT; +typedef enum +{ + DnsSectionQuestion, + DnsSectionAnswer, + DnsSectionAuthority, + DnsSectionAdditional +} DNS_SECTION; +typedef struct _IP4_ARRAY { + DWORD AddrCount; + IP4_ADDRESS AddrArray[1]; +} IP4_ARRAY, *PIP4_ARRAY; +typedef struct { + DWORD IP6Dword[4]; +} IP6_ADDRESS, *PIP6_ADDRESS, DNS_IP6_ADDRESS, *PDNS_IP6_ADDRESS; +typedef struct _DNS_HEADER { + WORD Xid; + BYTE RecursionDesired; + BYTE Truncation; + BYTE Authoritative; + BYTE Opcode; + BYTE IsResponse; + BYTE ResponseCode; + BYTE Reserved; + BYTE RecursionAvailable; + WORD QuestionCount; + WORD AnswerCount; + WORD NameServerCount; + WORD AdditionalCount; +} DNS_HEADER, *PDNS_HEADER; +typedef struct _DNS_MESSAGE_BUFFER { + DNS_HEADER MessageHead; + CHAR MessageBody[1]; +} DNS_MESSAGE_BUFFER, *PDNS_MESSAGE_BUFFER; +typedef struct _DnsRecordFlags { + DWORD Section :2; + DWORD Delete :1; + DWORD CharSet :2; + DWORD Unused :3; + DWORD Reserved :24; +} DNS_RECORD_FLAGS; +typedef struct { + IP4_ADDRESS IpAddress; +} DNS_A_DATA, *PDNS_A_DATA; +typedef struct { + DNS_IP6_ADDRESS Ip6Address; +} DNS_AAAA_DATA, *PDNS_AAAA_DATA; +#define DNS_ATMA_MAX_ADDR_LENGTH 20 +typedef struct { + BYTE AddressType; + BYTE Address[DNS_ATMA_MAX_ADDR_LENGTH]; +} DNS_ATMA_DATA, *PDNS_ATMA_DATA; +typedef struct { + WORD wFlags; + BYTE chProtocol; + BYTE chAlgorithm; + BYTE Key[1]; +} DNS_KEY_DATA, *PDNS_KEY_DATA; +typedef struct { + WORD wVersion; + WORD wSize; + WORD wHorPrec; + WORD wVerPrec; + DWORD dwLatitude; + DWORD dwLongitude; + DWORD dwAltitude; +} DNS_LOC_DATA, *PDNS_LOC_DATA; +typedef struct { + LPTSTR pNameMailbox; + LPTSTR pNameErrorsMailbox; +} DNS_MINFO_DATA, *PDNS_MINFO_DATA; +typedef struct { + LPTSTR pNameExchange; + WORD wPreference; + WORD Pad; +} DNS_MX_DATA, *PDNS_MX_DATA; +typedef struct { + DWORD dwByteCount; + BYTE Data[1]; +} DNS_NULL_DATA, *PDNS_NULL_DATA; +typedef struct { + LPTSTR pNameNext; + WORD wNumTypes; + WORD wTypes[1]; +} DNS_NXT_DATA, *PDNS_NXT_DATA; +typedef struct { + LPTSTR pNameHost; +} DNS_PTR_DATA, *PDNS_PTR_DATA; +typedef struct { + LPTSTR pNameSigner; + WORD wTypeCovered; + BYTE chAlgorithm; + BYTE chLabelCount; + DWORD dwOriginalTtl; + DWORD dwExpiration; + DWORD dwTimeSigned; + WORD wKeyTag; + WORD Pad; + BYTE Signature[1]; +} DNS_SIG_DATA, *PDNS_SIG_DATA; +typedef struct { + LPTSTR pNamePrimaryServer; + LPTSTR pNameAdministrator; + DWORD dwSerialNo; + DWORD dwRefresh; + DWORD dwRetry; + DWORD dwExpire; + DWORD dwDefaultTtl; +} DNS_SOA_DATA, *PDNS_SOA_DATA; +typedef struct { + LPTSTR pNameTarget; + WORD wPriority; + WORD wWeight; + WORD wPort; + WORD Pad; +} DNS_SRV_DATA, *PDNS_SRV_DATA; +typedef struct { + DWORD dwStringCount; + LPTSTR pStringArray[1]; +} DNS_TXT_DATA, *PDNS_TXT_DATA; +typedef struct { + LPTSTR pNameAlgorithm; + PBYTE pAlgorithmPacket; + PBYTE pKey; + PBYTE pOtherData; + DWORD dwCreateTime; + DWORD dwExpireTime; + WORD wMode; + WORD wError; + WORD wKeyLength; + WORD wOtherLength; + UCHAR cAlgNameLength; + BOOL bPacketPointers; +} DNS_TKEY_DATA, *PDNS_TKEY_DATA; +typedef struct { + LPTSTR pNameAlgorithm; + PBYTE pAlgorithmPacket; + PBYTE pSignature; + PBYTE pOtherData; + LONGLONG i64CreateTime; + WORD wFudgeTime; + WORD wOriginalXid; + WORD wError; + WORD wSigLength; + WORD wOtherLength; + UCHAR cAlgNameLength; + BOOL bPacketPointers; +} DNS_TSIG_DATA, *PDNS_TSIG_DATA; +typedef struct { + DWORD dwMappingFlag; + DWORD dwLookupTimeout; + DWORD dwCacheTimeout; + DWORD cWinsServerCount; + IP4_ADDRESS WinsServers[1]; +} DNS_WINS_DATA, *PDNS_WINS_DATA; +typedef struct { + DWORD dwMappingFlag; + DWORD dwLookupTimeout; + DWORD dwCacheTimeout; + LPTSTR pNameResultDomain; +} DNS_WINSR_DATA, *PDNS_WINSR_DATA; +typedef struct _DNS_WIRE_QUESTION { + WORD QuestionType; + WORD QuestionClass; +} DNS_WIRE_QUESTION, *PDNS_WIRE_QUESTION; +typedef struct _DNS_WIRE_RECORD { + WORD RecordType; + WORD RecordClass; + DWORD TimeToLive; + WORD DataLength; +} DNS_WIRE_RECORD, *PDNS_WIRE_RECORD; +typedef struct { + IP4_ADDRESS IpAddress; + UCHAR chProtocol; + BYTE BitMask[1]; +} DNS_WKS_DATA, *PDNS_WKS_DATA; +typedef struct _DnsRecord { + struct _DnsRecord* pNext; + LPTSTR pName; + WORD wType; + WORD wDataLength; + union { + DWORD DW; + DNS_RECORD_FLAGS S; + } Flags; + DWORD dwTtl; + DWORD dwReserved; + union { + DNS_A_DATA A; + DNS_SOA_DATA SOA, Soa; + DNS_PTR_DATA PTR, Ptr, NS, Ns, CNAME, Cname, MB, Mb, + MD, Md, MF, Mf, MG, Mg, MR, Mr; + DNS_MINFO_DATA MINFO, Minfo, RP, Rp; + DNS_MX_DATA MX, Mx, AFSDB, Afsdb, RT, Rt; + DNS_TXT_DATA HINFO, Hinfo, ISDN, Isdn, TXT, Txt, X25; + DNS_NULL_DATA Null; + DNS_WKS_DATA WKS, Wks; + DNS_AAAA_DATA AAAA; + DNS_KEY_DATA KEY, Key; + DNS_SIG_DATA SIG, Sig; + DNS_ATMA_DATA ATMA, Atma; + DNS_NXT_DATA NXT, Nxt; + DNS_SRV_DATA SRV, Srv; + DNS_TKEY_DATA TKEY, Tkey; + DNS_TSIG_DATA TSIG, Tsig; + DNS_WINS_DATA WINS, Wins; + DNS_WINSR_DATA WINSR, WinsR, NBSTAT, Nbstat; + } Data; +} DNS_RECORD, *PDNS_RECORD; +typedef struct _DnsRRSet { + PDNS_RECORD pFirstRR; + PDNS_RECORD pLastRR; +} DNS_RRSET, *PDNS_RRSET; + +DNS_STATUS WINAPI DnsAcquireContextHandle_A(DWORD,PVOID,HANDLE*); +DNS_STATUS WINAPI DnsAcquireContextHandle_W(DWORD,PVOID,HANDLE*); +DNS_STATUS WINAPI DnsExtractRecordsFromMessage_W(PDNS_MESSAGE_BUFFER,WORD,PDNS_RECORD*); +DNS_STATUS WINAPI DnsExtractRecordsFromMessage_UTF8(PDNS_MESSAGE_BUFFER,WORD,PDNS_RECORD*); +DNS_STATUS WINAPI DnsModifyRecordsInSet_A(PDNS_RECORD,PDNS_RECORD,DWORD,HANDLE,PIP4_ARRAY,PVOID); +DNS_STATUS WINAPI DnsModifyRecordsInSet_W(PDNS_RECORD,PDNS_RECORD,DWORD,HANDLE,PIP4_ARRAY,PVOID); +DNS_STATUS WINAPI DnsModifyRecordsInSet_UTF8(PDNS_RECORD,PDNS_RECORD,DWORD,HANDLE,PIP4_ARRAY,PVOID); +BOOL WINAPI DnsNameCompare_A(LPSTR,LPSTR); +BOOL WINAPI DnsNameCompare_W(LPWSTR,LPWSTR); +DNS_STATUS WINAPI DnsQuery_A(PCSTR,WORD,DWORD,PIP4_ARRAY,PDNS_RECORD*,PVOID*); +DNS_STATUS WINAPI DnsQuery_W(PCWSTR,WORD,DWORD,PIP4_ARRAY,PDNS_RECORD*,PVOID*); +DNS_STATUS WINAPI DnsQuery_UTF8(PCSTR,WORD,DWORD,PIP4_ARRAY,PDNS_RECORD*,PVOID*); +DNS_STATUS WINAPI DnsQueryConfig(DNS_CONFIG_TYPE,DWORD,PWSTR,PVOID,PVOID,PDWORD); +BOOL WINAPI DnsRecordCompare(PDNS_RECORD,PDNS_RECORD); +PDNS_RECORD WINAPI DnsRecordCopyEx(PDNS_RECORD,DNS_CHARSET,DNS_CHARSET); +void WINAPI DnsRecordListFree(PDNS_RECORD,DNS_FREE_TYPE); +BOOL WINAPI DnsRecordSetCompare(PDNS_RECORD,PDNS_RECORD,PDNS_RECORD*,PDNS_RECORD*); +PDNS_RECORD WINAPI DnsRecordSetCopyEx(PDNS_RECORD,DNS_CHARSET,DNS_CHARSET); +PDNS_RECORD WINAPI DnsRecordSetDetach(PDNS_RECORD); +void WINAPI DnsReleaseContextHandle(HANDLE); +DNS_STATUS WINAPI DnsReplaceRecordSetA(PDNS_RECORD,DWORD,HANDLE,PIP4_ARRAY,PVOID); +DNS_STATUS WINAPI DnsReplaceRecordSetW(PDNS_RECORD,DWORD,HANDLE,PIP4_ARRAY,PVOID); +DNS_STATUS WINAPI DnsReplaceRecordSetUTF8(PDNS_RECORD,DWORD,HANDLE,PIP4_ARRAY,PVOID); +DNS_STATUS WINAPI DnsValidateName_A(LPCSTR,DNS_NAME_FORMAT); +DNS_STATUS WINAPI DnsValidateName_W(LPCWSTR, DNS_NAME_FORMAT); +DNS_STATUS WINAPI DnsValidateName_UTF8(LPCSTR,DNS_NAME_FORMAT); +BOOL WINAPI DnsWriteQuestionToBuffer_W(PDNS_MESSAGE_BUFFER,LPDWORD,LPWSTR,WORD,WORD,BOOL); +BOOL WINAPI DnsWriteQuestionToBuffer_UTF8(PDNS_MESSAGE_BUFFER,LPDWORD,LPSTR,WORD,WORD,BOOL); + +#ifdef UNICODE +#define DnsAcquireContextHandle DnsAcquireContextHandle_W +#define DnsModifyRecordsInSet DnsModifyRecordsInSet_W +#define DnsNameCompare DnsNameCompare_W +#define DnsQuery DnsQuery_W +#define DnsReplaceRecordSet DnsReplaceRecordSetW +#define DnsValidateName DnsValidateName_W +#else +#define DnsAcquireContextHandle DnsAcquireContextHandle_A +#define DnsModifyRecordsInSet DnsModifyRecordsInSet_A +#define DnsNameCompare DnsNameCompare_A +#define DnsQuery DnsQuery_A +#define DnsReplaceRecordSet DnsReplaceRecordSetA +#define DnsValidateName DnsValidateName_A +#endif + +#endif /* RC_INVOKED */ + +#ifdef __cplusplus +} +#endif + +#endif /* _WINDNS_H */ diff --git a/reactos/w32api/include/windows.h b/reactos/w32api/include/windows.h new file mode 100644 index 00000000000..dde83a316a3 --- /dev/null +++ b/reactos/w32api/include/windows.h @@ -0,0 +1,128 @@ +/* + windows.h - main header file for the Win32 API + + Written by Anders Norlander <anorland@hem2.passagen.se> + + This file is part of a free library for the Win32 API. + + 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. + +*/ +#ifndef _WINDOWS_H +#define _WINDOWS_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +/* translate GCC target defines to MS equivalents. Keep this synchronized + with winnt.h. */ +#if defined(__i686__) && !defined(_M_IX86) +#define _M_IX86 600 +#elif defined(__i586__) && !defined(_M_IX86) +#define _M_IX86 500 +#elif defined(__i486__) && !defined(_M_IX86) +#define _M_IX86 400 +#elif defined(__i386__) && !defined(_M_IX86) +#define _M_IX86 300 +#endif +#if defined(_M_IX86) && !defined(_X86_) +#define _X86_ +#elif defined(_M_ALPHA) && !defined(_ALPHA_) +#define _ALPHA_ +#elif defined(_M_PPC) && !defined(_PPC_) +#define _PPC_ +#elif defined(_M_MRX000) && !defined(_MIPS_) +#define _MIPS_ +#elif defined(_M_M68K) && !defined(_68K_) +#define _68K_ +#endif + +#ifdef RC_INVOKED +/* winresrc.h includes the necessary headers */ +#include <winresrc.h> +#else + +#include <stdarg.h> +#include <windef.h> +#include <wincon.h> +#include <winbase.h> +#if !(defined NOGDI || defined _WINGDI_H) +#include <wingdi.h> +#endif +#ifndef _WINUSER_H +#include <winuser.h> +#endif +#ifndef _WINNLS_H +#include <winnls.h> +#endif +#ifndef _WINVER_H +#include <winver.h> +#endif +#ifndef _WINNETWK_H +#include <winnetwk.h> +#endif +#ifndef _WINREG_H +#include <winreg.h> +#endif +#ifndef _WINSVC_H +#include <winsvc.h> +#endif + +#ifndef WIN32_LEAN_AND_MEAN +#include <cderr.h> +#include <dde.h> +#include <ddeml.h> +#include <dlgs.h> +#include <imm.h> +#include <lzexpand.h> +#include <mmsystem.h> +#include <nb30.h> +#include <rpc.h> +#include <shellapi.h> +#include <winperf.h> +#ifndef NOGDI +#include <commdlg.h> +#include <winspool.h> +#endif +#if defined(Win32_Winsock) +#warning "The Win32_Winsock macro name is deprecated.\ + Please use __USE_W32_SOCKETS instead" +#ifndef __USE_W32_SOCKETS +#define __USE_W32_SOCKETS +#endif +#endif +#if defined(__USE_W32_SOCKETS) || !(defined(__CYGWIN__) || defined(__MSYS__) || defined(_UWIN)) +#if (_WIN32_WINNT >= 0x0400) +#include <winsock2.h> +/* + * MS likes to include mswsock.h here as well, + * but that can cause undefined symbols if + * winsock2.h is included before windows.h + */ +#else +#include <winsock.h> +#endif /* (_WIN32_WINNT >= 0x0400) */ +#endif +#ifndef NOGDI +#if !defined (__OBJC__) +#if (__GNUC__ >= 3) || defined (__WATCOMC__) +#include <ole2.h> +#endif +#endif /* __OBJC__ */ +#endif + +#endif /* WIN32_LEAN_AND_MEAN */ + +#endif /* RC_INVOKED */ + +#ifdef __OBJC__ +/* FIXME: Not undefining BOOL here causes all BOOLs to be WINBOOL (int), + but undefining it causes trouble as well if a file is included after + windows.h +*/ +#undef BOOL +#endif + +#endif diff --git a/reactos/w32api/include/windowsx.h b/reactos/w32api/include/windowsx.h new file mode 100644 index 00000000000..460718e6409 --- /dev/null +++ b/reactos/w32api/include/windowsx.h @@ -0,0 +1,544 @@ +#ifndef _WINDOWSX_H +#define _WINDOWSX_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#define WM_CTLCOLOR 25 +#define Button_Enable(hwndCtl,fEnable) EnableWindow((hwndCtl),(fEnable)) +#define Button_GetCheck(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),BM_GETCHECK,0,0)) +#define Button_GetState(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),BM_GETSTATE,0,0)) +#define Button_GetText(hwndCtl,lpch,cchMax) GetWindowText((hwndCtl),(lpch),(cchMax)) +#define Button_GetTextLength(hwndCtl) GetWindowTextLength(hwndCtl) +#define Button_SetCheck(hwndCtl,check) ((void)SendMessage((hwndCtl),BM_SETCHECK,(WPARAM)(int)(check),0)) +#define Button_SetState(hwndCtl,state) ((UINT)(DWORD)SendMessage((hwndCtl),BM_SETSTATE,(WPARAM)(int)(state),0)) +#define Button_SetStyle(hwndCtl,style,fRedraw) ((void)SendMessage((hwndCtl),BM_SETSTYLE,(WPARAM)LOWORD(style),MAKELPARAM(((fRedraw) ? TRUE : FALSE),0))) +#define Button_SetText(hwndCtl,lpsz) SetWindowText((hwndCtl),(lpsz)) +#define CheckDefDlgRecursion(pfRecursion) if (*(pfRecursion)) {*(pfRecursion) = FALSE; return FALSE; } +#define ComboBox_AddItemData(hwndCtl,data) ((int)(DWORD)SendMessage((hwndCtl),CB_ADDSTRING,0,(LPARAM)(data))) +#define ComboBox_AddString(hwndCtl,lpsz) ((int)(DWORD)SendMessage((hwndCtl),CB_ADDSTRING,0,(LPARAM)(LPCTSTR)(lpsz))) +#define ComboBox_DeleteString(hwndCtl,index) ((int)(DWORD)SendMessage((hwndCtl),CB_DELETESTRING,(WPARAM)(int)(index),0)) +#define ComboBox_Dir(hwndCtl,attrs,lpszFileSpec) ((int)(DWORD)SendMessage((hwndCtl),CB_DIR,(WPARAM)(UINT)(attrs),(LPARAM)(LPCTSTR)(lpszFileSpec))) +#define ComboBox_Enable(hwndCtl,fEnable) EnableWindow((hwndCtl),(fEnable)) +#define ComboBox_FindItemData(hwndCtl,indexStart,data) ((int)(DWORD)SendMessage((hwndCtl),CB_FINDSTRING,(WPARAM)(int)(indexStart),(LPARAM)(data))) +#define ComboBox_FindString(hwndCtl,indexStart,lpszFind) ((int)(DWORD)SendMessage((hwndCtl),CB_FINDSTRING,(WPARAM)(int)(indexStart),(LPARAM)(LPCTSTR)(lpszFind))) +#define ComboBox_FindStringExact(hwndCtl,indexStart,lpszFind) ((int)(DWORD)SendMessage((hwndCtl),CB_FINDSTRINGEXACT,(WPARAM)(int)(indexStart),(LPARAM)(LPCTSTR)(lpszFind))) +#define ComboBox_GetCount(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),CB_GETCOUNT,0,0)) +#define ComboBox_GetCurSel(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),CB_GETCURSEL,0,0)) +#define ComboBox_GetDroppedControlRect(hwndCtl,lprc) ((void)SendMessage((hwndCtl),CB_GETDROPPEDCONTROLRECT,0,(LPARAM)(RECT*)(lprc))) +#define ComboBox_GetDroppedState(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl),CB_GETDROPPEDSTATE,0,0)) +#define ComboBox_GetEditSel(hwndCtl) ((DWORD)SendMessage((hwndCtl),CB_GETEDITSEL,0,0)) +#define ComboBox_GetExtendedUI(hwndCtl) ((UINT)(DWORD)SendMessage((hwndCtl),CB_GETEXTENDEDUI,0,0)) +#define ComboBox_GetItemData(hwndCtl,index) ((LRESULT)(DWORD)SendMessage((hwndCtl),CB_GETITEMDATA,(WPARAM)(int)(index),0)) +#define ComboBox_GetItemHeight(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),CB_GETITEMHEIGHT,0,0)) +#define ComboBox_GetLBText(hwndCtl,index,lpszBuffer) ((int)(DWORD)SendMessage((hwndCtl),CB_GETLBTEXT,(WPARAM)(int)(index),(LPARAM)(LPCTSTR)(lpszBuffer))) +#define ComboBox_GetLBTextLen(hwndCtl,index) ((int)(DWORD)SendMessage((hwndCtl),CB_GETLBTEXTLEN,(WPARAM)(int)(index),0)) +#define ComboBox_GetText(hwndCtl,lpch,cchMax) GetWindowText((hwndCtl),(lpch),(cchMax)) +#define ComboBox_GetTextLength(hwndCtl) GetWindowTextLength(hwndCtl) +#define ComboBox_InsertItemData(hwndCtl,index,data) ((int)(DWORD)SendMessage((hwndCtl),CB_INSERTSTRING,(WPARAM)(int)(index),(LPARAM)(data))) +#define ComboBox_InsertString(hwndCtl,index,lpsz) ((int)(DWORD)SendMessage((hwndCtl),CB_INSERTSTRING,(WPARAM)(int)(index),(LPARAM)(LPCTSTR)(lpsz))) +#define ComboBox_LimitText(hwndCtl,cchLimit) ((int)(DWORD)SendMessage((hwndCtl),CB_LIMITTEXT,(WPARAM)(int)(cchLimit),0)) +#define ComboBox_ResetContent(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),CB_RESETCONTENT,0,0)) +#define ComboBox_SelectItemData(hwndCtl,indexStart,data) ((int)(DWORD)SendMessage((hwndCtl),CB_SELECTSTRING,(WPARAM)(int)(indexStart),(LPARAM)(data))) +#define ComboBox_SelectString(hwndCtl,indexStart,lpszSelect) ((int)(DWORD)SendMessage((hwndCtl),CB_SELECTSTRING,(WPARAM)(int)(indexStart),(LPARAM)(LPCTSTR)(lpszSelect))) +#define ComboBox_SetCurSel(hwndCtl,index) ((int)(DWORD)SendMessage((hwndCtl),CB_SETCURSEL,(WPARAM)(int)(index),0)) +#define ComboBox_SetEditSel(hwndCtl,ichStart,ichEnd) ((int)(DWORD)SendMessage((hwndCtl),CB_SETEDITSEL,0,MAKELPARAM((ichStart),(ichEnd)))) +#define ComboBox_SetExtendedUI(hwndCtl,flags) ((int)(DWORD)SendMessage((hwndCtl),CB_SETEXTENDEDUI,(WPARAM)(UINT)(flags),0)) +#define ComboBox_SetItemData(hwndCtl,index,data) ((int)(DWORD)SendMessage((hwndCtl),CB_SETITEMDATA,(WPARAM)(int)(index),(LPARAM)(data))) +#define ComboBox_SetItemHeight(hwndCtl,index,cyItem) ((int)(DWORD)SendMessage((hwndCtl),CB_SETITEMHEIGHT,(WPARAM)(int)(index),(LPARAM)(int)cyItem)) +#define ComboBox_SetText(hwndCtl,lpsz) SetWindowText((hwndCtl),(lpsz)) +#define ComboBox_ShowDropdown(hwndCtl,fShow) ((BOOL)(DWORD)SendMessage((hwndCtl),CB_SHOWDROPDOWN,(WPARAM)(BOOL)(fShow),0)) +#define CopyRgn(hrgnDst,hrgnSrc) CombineRgn(hrgnDst,hrgnSrc,0,RGN_COPY) +#define DECLARE_HANDLE32 DECLARE_HANDLE +#define DefDlgProcEx(hwnd,msg,wParam,lParam,pfRecursion) (*(pfRecursion) = TRUE,DefDlgProc(hwnd,msg,wParam,lParam)) +#define DeleteBitmap(hbm) DeleteObject((HGDIOBJ)(HBITMAP)(hbm)) +#define DeleteBrush(hbr) DeleteObject((HGDIOBJ)(HBRUSH)(hbr)) +#define DeleteFont(hfont) DeleteObject((HGDIOBJ)(HFONT)(hfont)) +#define DeletePalette(hpal) DeleteObject((HGDIOBJ)(HPALETTE)(hpal)) +#define DeletePen(hpen) DeleteObject((HGDIOBJ)(HPEN)(hpen)) +#define DeleteRgn(hrgn) DeleteObject((HGDIOBJ)(HRGN)(hrgn)) +#define Edit_CanUndo(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl),EM_CANUNDO,0,0)) +#define Edit_EmptyUndoBuffer(hwndCtl) ((void)SendMessage((hwndCtl),EM_EMPTYUNDOBUFFER,0,0)) +#define Edit_Enable(hwndCtl,fEnable) EnableWindow((hwndCtl),(fEnable)) +#define Edit_FmtLines(hwndCtl,fAddEOL) ((BOOL)(DWORD)SendMessage((hwndCtl),EM_FMTLINES,(WPARAM)(BOOL)(fAddEOL),0)) +#define Edit_GetFirstVisibleLine(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),EM_GETFIRSTVISIBLELINE,0,0)) +#define Edit_GetHandle(hwndCtl) ((HLOCAL)(UINT)(DWORD)SendMessage((hwndCtl),EM_GETHANDLE,0,0)) +#define Edit_GetLine(hwndCtl,line,lpch,cchMax) ((*((int*)(lpch)) = (cchMax)),((int)(DWORD)SendMessage((hwndCtl),EM_GETLINE,(WPARAM)(int)(line),(LPARAM)(LPTSTR)(lpch)))) +#define Edit_GetLineCount(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),EM_GETLINECOUNT,0,0)) +#define Edit_GetModify(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl),EM_GETMODIFY,0,0)) +#define Edit_GetPasswordChar(hwndCtl) ((TCHAR)(DWORD)SendMessage((hwndCtl),EM_GETPASSWORDCHAR,0,0)) +#define Edit_GetRect(hwndCtl,lprc) ((void)SendMessage((hwndCtl),EM_GETRECT,0,(LPARAM)(RECT*)(lprc))) +#define Edit_GetSel(hwndCtl) ((DWORD)SendMessage((hwndCtl),EM_GETSEL,0,0)) +#define Edit_GetText(hwndCtl,lpch,cchMax) GetWindowText((hwndCtl),(lpch),(cchMax)) +#define Edit_GetTextLength(hwndCtl) GetWindowTextLength(hwndCtl) +#define Edit_GetWordBreakProc(hwndCtl) ((EDITWORDBREAKPROC)SendMessage((hwndCtl),EM_GETWORDBREAKPROC,0,0)) +#define Edit_LimitText(hwndCtl,cchMax) ((void)SendMessage((hwndCtl),EM_LIMITTEXT,(WPARAM)(cchMax),0)) +#define Edit_LineFromChar(hwndCtl,ich) ((int)(DWORD)SendMessage((hwndCtl),EM_LINEFROMCHAR,(WPARAM)(int)(ich),0)) +#define Edit_LineIndex(hwndCtl,line) ((int)(DWORD)SendMessage((hwndCtl),EM_LINEINDEX,(WPARAM)(int)(line),0)) +#define Edit_LineLength(hwndCtl,line) ((int)(DWORD)SendMessage((hwndCtl),EM_LINELENGTH,(WPARAM)(int)(line),0)) +#define Edit_ReplaceSel(hwndCtl,lpszReplace) ((void)SendMessage((hwndCtl),EM_REPLACESEL,0,(LPARAM)(LPCTSTR)(lpszReplace))) +#define Edit_Scroll(hwndCtl,dv,dh) ((void)SendMessage((hwndCtl),EM_LINESCROLL,(WPARAM)(dh),(LPARAM)(dv))) +#define Edit_ScrollCaret(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl),EM_SCROLLCARET,0,0)) +#define Edit_SetHandle(hwndCtl,h) ((void)SendMessage((hwndCtl),EM_SETHANDLE,(WPARAM)(UINT)(HLOCAL)(h),0)) +#define Edit_SetModify(hwndCtl,fModified) ((void)SendMessage((hwndCtl),EM_SETMODIFY,(WPARAM)(UINT)(fModified),0)) +#define Edit_SetPasswordChar(hwndCtl,ch) ((void)SendMessage((hwndCtl),EM_SETPASSWORDCHAR,(WPARAM)(UINT)(ch),0)) +#define Edit_SetReadOnly(hwndCtl,fReadOnly) ((BOOL)(DWORD)SendMessage((hwndCtl),EM_SETREADONLY,(WPARAM)(BOOL)(fReadOnly),0)) +#define Edit_SetRect(hwndCtl,lprc) ((void)SendMessage((hwndCtl),EM_SETRECT,0,(LPARAM)(const RECT*)(lprc))) +#define Edit_SetRectNoPaint(hwndCtl,lprc) ((void)SendMessage((hwndCtl),EM_SETRECTNP,0,(LPARAM)(const RECT*)(lprc))) +#define Edit_SetSel(hwndCtl,ichStart,ichEnd) ((void)SendMessage((hwndCtl),EM_SETSEL,(ichStart),(ichEnd))) +#define Edit_SetTabStops(hwndCtl,cTabs,lpTabs) ((void)SendMessage((hwndCtl),EM_SETTABSTOPS,(WPARAM)(int)(cTabs),(LPARAM)(const int*)(lpTabs))) +#define Edit_SetText(hwndCtl,lpsz) SetWindowText((hwndCtl),(lpsz)) +#define Edit_SetWordBreakProc(hwndCtl,lpfnWordBreak) ((void)SendMessage((hwndCtl),EM_SETWORDBREAKPROC,0,(LPARAM)(EDITWORDBREAKPROC)(lpfnWordBreak))) +#define Edit_Undo(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl),EM_UNDO,0,0)) +#define FORWARD_WM_ACTIVATE(hwnd,state,hwndActDeact,fMinimized,fn) (void)(fn)((hwnd),WM_ACTIVATE,MAKEWPARAM((state),(fMinimized)),(LPARAM)(HWND)(hwndActDeact)) +#define FORWARD_WM_ACTIVATEAPP(hwnd,fActivate,dwThreadId,fn) (void)(fn)((hwnd),WM_ACTIVATEAPP,(WPARAM)(BOOL)(fActivate),(LPARAM)(dwThreadId)) +#define FORWARD_WM_ASKCBFORMATNAME(hwnd,cchMax,rgchName,fn) (void)(fn)((hwnd),WM_ASKCBFORMATNAME,(WPARAM)(int)(cchMax),(LPARAM)(rgchName)) +#define FORWARD_WM_CANCELMODE(hwnd,fn) (void)(fn)((hwnd),WM_CANCELMODE,0,0) +#define FORWARD_WM_CHANGECBCHAIN(hwnd,hwndRemove,hwndNext,fn) (void)(fn)((hwnd),WM_CHANGECBCHAIN,(WPARAM)(HWND)(hwndRemove),(LPARAM)(HWND)(hwndNext)) +#define FORWARD_WM_CHAR(hwnd,ch,cRepeat,fn) (void)(fn)((hwnd),WM_CHAR,(WPARAM)(TCHAR)(ch),MAKELPARAM((cRepeat),0)) +#define FORWARD_WM_CHARTOITEM(hwnd,ch,hwndListBox,iCaret,fn) (int)(DWORD)(fn)((hwnd),WM_CHARTOITEM,MAKEWPARAM((UINT)(iCaret),(UINT)(ch)),(LPARAM)(hwndListBox)) +#define FORWARD_WM_CHILDACTIVATE(hwnd,fn) (void)(fn)((hwnd),WM_CHILDACTIVATE,0,0) +#define FORWARD_WM_CLEAR(hwnd,fn) (void)(fn)((hwnd),WM_CLEAR,0,0) +#define FORWARD_WM_CLOSE(hwnd,fn) (void)(fn)((hwnd),WM_CLOSE,0,0) +#define FORWARD_WM_COMMAND(hwnd,id,hwndCtl,codeNotify,fn) (void)(fn)((hwnd),WM_COMMAND,MAKEWPARAM((UINT)(id),(UINT)(codeNotify)),(LPARAM)(HWND)(hwndCtl)) +#define FORWARD_WM_COMMNOTIFY(hwnd,cid,flags,fn) (void)(fn)((hwnd),WM_COMMNOTIFY,(WPARAM)(cid),MAKELPARAM((flags),0)) +#define FORWARD_WM_COMPACTING(hwnd,compactRatio,fn) (void)(fn)((hwnd),WM_COMPACTING,(WPARAM)(UINT)(compactRatio),0) +#define FORWARD_WM_COMPAREITEM(hwnd,lpCompareItem,fn) (int)(DWORD)(fn)((hwnd),WM_COMPAREITEM,(WPARAM)(((const COMPAREITEMSTRUCT*)(lpCompareItem))->CtlID),(LPARAM)(const COMPAREITEMSTRUCT*)(lpCompareItem)) +#define FORWARD_WM_COPY(hwnd,fn) (void)(fn)((hwnd),WM_COPY,0,0) +#define FORWARD_WM_CREATE(hwnd,lpCreateStruct,fn) (BOOL)(DWORD)(fn)((hwnd),WM_CREATE,0,(LPARAM)(LPCREATESTRUCT)(lpCreateStruct)) +#define FORWARD_WM_CTLCOLORBTN(hwnd,hdc,hwndChild,fn) (HBRUSH)(UINT)(DWORD)(fn)((hwnd),WM_CTLCOLORBTN,(WPARAM)(HDC)(hdc),(LPARAM)(HWND)(hwndChild)) +#define FORWARD_WM_CTLCOLORDLG(hwnd,hdc,hwndChild,fn) (HBRUSH)(UINT)(DWORD)(fn)((hwnd),WM_CTLCOLORDLG,(WPARAM)(HDC)(hdc),(LPARAM)(HWND)(hwndChild)) +#define FORWARD_WM_CTLCOLOREDIT(hwnd,hdc,hwndChild,fn) (HBRUSH)(UINT)(DWORD)(fn)((hwnd),WM_CTLCOLOREDIT,(WPARAM)(HDC)(hdc),(LPARAM)(HWND)(hwndChild)) +#define FORWARD_WM_CTLCOLORLISTBOX(hwnd,hdc,hwndChild,fn) (HBRUSH)(UINT)(DWORD)(fn)((hwnd),WM_CTLCOLORLISTBOX,(WPARAM)(HDC)(hdc),(LPARAM)(HWND)(hwndChild)) +#define FORWARD_WM_CTLCOLORMSGBOX(hwnd,hdc,hwndChild,fn) (HBRUSH)(UINT)(DWORD)(fn)((hwnd),WM_CTLCOLORMSGBOX,(WPARAM)(HDC)(hdc),(LPARAM)(HWND)(hwndChild)) +#define FORWARD_WM_CTLCOLORSCROLLBAR(hwnd,hdc,hwndChild,fn) (HBRUSH)(UINT)(DWORD)(fn)((hwnd),WM_CTLCOLORSCROLLBAR,(WPARAM)(HDC)(hdc),(LPARAM)(HWND)(hwndChild)) +#define FORWARD_WM_CTLCOLORSTATIC(hwnd,hdc,hwndChild,fn) (HBRUSH)(UINT)(DWORD)(fn)((hwnd),WM_CTLCOLORSTATIC,(WPARAM)(HDC)(hdc),(LPARAM)(HWND)(hwndChild)) +#define FORWARD_WM_CUT(hwnd,fn) (void)(fn)((hwnd),WM_CUT,0,0) +#define FORWARD_WM_DEADCHAR(hwnd,ch,cRepeat,fn) (void)(fn)((hwnd),WM_DEADCHAR,(WPARAM)(TCHAR)(ch),MAKELPARAM((cRepeat),0)) +#define FORWARD_WM_DELETEITEM(hwnd,lpDeleteItem,fn) (void)(fn)((hwnd),WM_DELETEITEM,(WPARAM)(((const DELETEITEMSTRUCT*)(lpDeleteItem))->CtlID),(LPARAM)(const DELETEITEMSTRUCT*)(lpDeleteItem)) +#define FORWARD_WM_DESTROY(hwnd,fn) (void)(fn)((hwnd),WM_DESTROY,0,0) +#define FORWARD_WM_DESTROYCLIPBOARD(hwnd,fn) (void)(fn)((hwnd),WM_DESTROYCLIPBOARD,0,0) +#define FORWARD_WM_DEVMODECHANGE(hwnd,lpszDeviceName,fn) (void)(fn)((hwnd),WM_DEVMODECHANGE,0,(LPARAM)(LPCTSTR)(lpszDeviceName)) +#define FORWARD_WM_DRAWCLIPBOARD(hwnd,fn) (void)(fn)((hwnd),WM_DRAWCLIPBOARD,0,0) +#define FORWARD_WM_DRAWITEM(hwnd,lpDrawItem,fn) (void)(fn)((hwnd),WM_DRAWITEM,(WPARAM)(((const DRAWITEMSTRUCT*)lpDrawItem)->CtlID),(LPARAM)(const DRAWITEMSTRUCT*)(lpDrawItem)) +#define FORWARD_WM_DROPFILES(hwnd,hdrop,fn) (void)(fn)((hwnd),WM_DROPFILES,(WPARAM)(HDROP)(hdrop),0) +#define FORWARD_WM_ENABLE(hwnd,fEnable,fn) (void)(fn)((hwnd),WM_ENABLE,(WPARAM)(BOOL)(fEnable),0) +#define FORWARD_WM_ENDSESSION(hwnd,fEnding,fn) (void)(fn)((hwnd),WM_ENDSESSION,(WPARAM)(BOOL)(fEnding),0) +#define FORWARD_WM_ENTERIDLE(hwnd,source,hwndSource,fn) (void)(fn)((hwnd),WM_ENTERIDLE,(WPARAM)(UINT)(source),(LPARAM)(HWND)(hwndSource)) +#define FORWARD_WM_ERASEBKGND(hwnd,hdc,fn) (BOOL)(DWORD)(fn)((hwnd),WM_ERASEBKGND,(WPARAM)(HDC)(hdc),0) +#define FORWARD_WM_FONTCHANGE(hwnd,fn) (void)(fn)((hwnd),WM_FONTCHANGE,0,0) +#define FORWARD_WM_GETDLGCODE(hwnd,lpmsg,fn) (UINT)(DWORD)(fn)((hwnd),WM_GETDLGCODE,(lpmsg ? lpmsg->wParam : 0),(LPARAM)(LPMSG)(lpmsg)) +#define FORWARD_WM_GETFONT(hwnd,fn) (HFONT)(UINT)(DWORD)(fn)((hwnd),WM_GETFONT,0,0) +#define FORWARD_WM_GETMINMAXINFO(hwnd,lpMinMaxInfo,fn) (void)(fn)((hwnd),WM_GETMINMAXINFO,0,(LPARAM)(LPMINMAXINFO)(lpMinMaxInfo)) +#define FORWARD_WM_GETTEXT(hwnd,cchTextMax,lpszText,fn) (int)(DWORD)(fn)((hwnd),WM_GETTEXT,(WPARAM)(int)(cchTextMax),(LPARAM)(LPTSTR)(lpszText)) +#define FORWARD_WM_GETTEXTLENGTH(hwnd,fn) (int)(DWORD)(fn)((hwnd),WM_GETTEXTLENGTH,0,0) +#define FORWARD_WM_HSCROLL(hwnd,hwndCtl,code,pos,fn) (void)(fn)((hwnd),WM_HSCROLL,MAKEWPARAM((UINT)(int)(code),(UINT)(int)(pos)),(LPARAM)(UINT)(hwndCtl)) +#define FORWARD_WM_HSCROLLCLIPBOARD(hwnd,hwndCBViewer,code,pos,fn) (void)(fn)((hwnd),WM_HSCROLLCLIPBOARD,(WPARAM)(HWND)(hwndCBViewer),MAKELPARAM((code),(pos))) +#define FORWARD_WM_ICONERASEBKGND(hwnd,hdc,fn) (BOOL)(DWORD)(fn)((hwnd),WM_ICONERASEBKGND,(WPARAM)(HDC)(hdc),0) +#define FORWARD_WM_INITDIALOG(hwnd,hwndFocus,lParam,fn) (BOOL)(DWORD)(fn)((hwnd),WM_INITDIALOG,(WPARAM)(HWND)(hwndFocus),(lParam)) +#define FORWARD_WM_INITMENU(hwnd,hMenu,fn) (void)(fn)((hwnd),WM_INITMENU,(WPARAM)(HMENU)(hMenu),0) +#define FORWARD_WM_INITMENUPOPUP(hwnd,hMenu,item,fSystemMenu,fn) (void)(fn)((hwnd),WM_INITMENUPOPUP,(WPARAM)(HMENU)(hMenu),MAKELPARAM((item),(fSystemMenu))) +#define FORWARD_WM_KEYDOWN(hwnd,vk,cRepeat,flags,fn) (void)(fn)((hwnd),WM_KEYDOWN,(WPARAM)(UINT)(vk),MAKELPARAM((cRepeat),(flags))) +#define FORWARD_WM_KEYUP(hwnd,vk,cRepeat,flags,fn) (void)(fn)((hwnd),WM_KEYUP,(WPARAM)(UINT)(vk),MAKELPARAM((cRepeat),(flags))) +#define FORWARD_WM_KILLFOCUS(hwnd,hwndNewFocus,fn) (void)(fn)((hwnd),WM_KILLFOCUS,(WPARAM)(HWND)(hwndNewFocus),0) +#define FORWARD_WM_LBUTTONDOWN(hwnd,fDoubleClick,x,y,keyFlags,fn) (void)(fn)((hwnd),(fDoubleClick) ? WM_LBUTTONDBLCLK : WM_LBUTTONDOWN,(WPARAM)(UINT)(keyFlags),MAKELPARAM((x),(y))) +#define FORWARD_WM_LBUTTONUP(hwnd,x,y,keyFlags,fn) (void)(fn)((hwnd),WM_LBUTTONUP,(WPARAM)(UINT)(keyFlags),MAKELPARAM((x),(y))) +#define FORWARD_WM_MBUTTONDOWN(hwnd,fDoubleClick,x,y,keyFlags,fn) (void)(fn)((hwnd),(fDoubleClick) ? WM_MBUTTONDBLCLK : WM_MBUTTONDOWN,(WPARAM)(UINT)(keyFlags),MAKELPARAM((x),(y))) +#define FORWARD_WM_MBUTTONUP(hwnd,x,y,keyFlags,fn) (void)(fn)((hwnd),WM_MBUTTONUP,(WPARAM)(UINT)(keyFlags),MAKELPARAM((x),(y))) +#define FORWARD_WM_MDIACTIVATE(hwnd,fActive,hwndActivate,hwndDeactivate,fn) (void)(fn)(hwnd,WM_MDIACTIVATE,(WPARAM)(hwndDeactivate),(LPARAM)(hwndActivate)) +#define FORWARD_WM_MDICASCADE(hwnd,cmd,fn) (BOOL)(DWORD)(fn)((hwnd),WM_MDICASCADE,(WPARAM)(cmd),0) +#define FORWARD_WM_MDICREATE(hwnd,lpmcs,fn) (HWND)(UINT)(DWORD)(fn)((hwnd),WM_MDICREATE,0,(LPARAM)(LPMDICREATESTRUCT)(lpmcs)) +#define FORWARD_WM_MDIDESTROY(hwnd,hwndDestroy,fn) (void)(fn)((hwnd),WM_MDIDESTROY,(WPARAM)(hwndDestroy),0) +#define FORWARD_WM_MDIGETACTIVE(hwnd,fn) (HWND)(UINT)(DWORD)(fn)((hwnd),WM_MDIGETACTIVE,0,0) +#define FORWARD_WM_MDIICONARRANGE(hwnd,fn) (void)(fn)((hwnd),WM_MDIICONARRANGE,0,0) +#define FORWARD_WM_MDIMAXIMIZE(hwnd,hwndMaximize,fn) (void)(fn)((hwnd),WM_MDIMAXIMIZE,(WPARAM)(hwndMaximize),0) +#define FORWARD_WM_MDINEXT(hwnd,hwndCur,fPrev,fn) (HWND)(UINT)(DWORD)(fn)((hwnd),WM_MDINEXT,(WPARAM)(hwndCur),(LPARAM)(fPrev)) +#define FORWARD_WM_MDIRESTORE(hwnd,hwndRestore,fn) (void)(fn)((hwnd),WM_MDIRESTORE,(WPARAM)(hwndRestore),0) +#define FORWARD_WM_MDISETMENU(hwnd,fRefresh,hmenuFrame,hmenuWindow,fn) (HMENU)(UINT)(DWORD)(fn)((hwnd),WM_MDISETMENU,(WPARAM)((fRefresh) ? (hmenuFrame) : 0),(LPARAM)(hmenuWindow)) +#define FORWARD_WM_MDITILE(hwnd,cmd,fn) (BOOL)(DWORD)(fn)((hwnd),WM_MDITILE,(WPARAM)(cmd),0) +#define FORWARD_WM_MEASUREITEM(hwnd,lpMeasureItem,fn) (void)(fn)((hwnd),WM_MEASUREITEM,(WPARAM)(((MEASUREITEMSTRUCT*)lpMeasureItem)->CtlID),(LPARAM)(MEASUREITEMSTRUCT*)(lpMeasureItem)) +#define FORWARD_WM_MENUCHAR(hwnd,ch,flags,hmenu,fn) (DWORD)(fn)((hwnd),WM_MENUCHAR,MAKEWPARAM(flags,(WORD)(ch)),(LPARAM)(HMENU)(hmenu)) +#define FORWARD_WM_MENUSELECT(hwnd,hmenu,item,hmenuPopup,flags,fn) (void)(fn)((hwnd),WM_MENUSELECT,MAKEWPARAM((item),(flags)),(LPARAM)(HMENU)((hmenu) ? (hmenu) : (hmenuPopup))) +#define FORWARD_WM_MOUSEACTIVATE(hwnd,hwndTopLevel,codeHitTest,msg,fn) (int)(DWORD)(fn)((hwnd),WM_MOUSEACTIVATE,(WPARAM)(HWND)(hwndTopLevel),MAKELPARAM((codeHitTest),(msg))) +#define FORWARD_WM_MOUSEMOVE(hwnd,x,y,keyFlags,fn) (void)(fn)((hwnd),WM_MOUSEMOVE,(WPARAM)(UINT)(keyFlags),MAKELPARAM((x),(y))) +#define FORWARD_WM_MOVE(hwnd,x,y,fn) (void)(fn)((hwnd),WM_MOVE,0,MAKELPARAM((x),(y))) +#define FORWARD_WM_NCACTIVATE(hwnd,fActive,hwndActDeact,fMinimized,fn) (BOOL)(DWORD)(fn)((hwnd),WM_NCACTIVATE,(WPARAM)(BOOL)(fActive),0) +#define FORWARD_WM_NCCALCSIZE(hwnd,fCalcValidRects,lpcsp,fn) (UINT)(DWORD)(fn)((hwnd),WM_NCCALCSIZE,0,(LPARAM)(NCCALCSIZE_PARAMS*)(lpcsp)) +#define FORWARD_WM_NCCREATE(hwnd,lpCreateStruct,fn) (BOOL)(DWORD)(fn)((hwnd),WM_NCCREATE,0,(LPARAM)(LPCREATESTRUCT)(lpCreateStruct)) +#define FORWARD_WM_NCDESTROY(hwnd,fn) (void)(fn)((hwnd),WM_NCDESTROY,0,0) +#define FORWARD_WM_NCHITTEST(hwnd,x,y,fn) (UINT)(DWORD)(fn)((hwnd),WM_NCHITTEST,0,MAKELPARAM((x),(y))) +#define FORWARD_WM_NCLBUTTONDOWN(hwnd,fDoubleClick,x,y,codeHitTest,fn) (void)(fn)((hwnd),(fDoubleClick) ? WM_NCLBUTTONDBLCLK : WM_NCLBUTTONDOWN,(WPARAM)(UINT)(codeHitTest),MAKELPARAM((x),(y))) +#define FORWARD_WM_NCLBUTTONUP(hwnd,x,y,codeHitTest,fn) (void)(fn)((hwnd),WM_NCLBUTTONUP,(WPARAM)(UINT)(codeHitTest),MAKELPARAM((x),(y))) +#define FORWARD_WM_NCMBUTTONDOWN(hwnd,fDoubleClick,x,y,codeHitTest,fn) (void)(fn)((hwnd),(fDoubleClick) ? WM_NCMBUTTONDBLCLK : WM_NCMBUTTONDOWN,(WPARAM)(UINT)(codeHitTest),MAKELPARAM((x),(y)) ) +#define FORWARD_WM_NCMBUTTONUP(hwnd,x,y,codeHitTest,fn) (void)(fn)((hwnd),WM_NCMBUTTONUP,(WPARAM)(UINT)(codeHitTest),MAKELPARAM((x),(y)) ) +#define FORWARD_WM_NCMOUSEMOVE(hwnd,x,y,codeHitTest,fn) (void)(fn)((hwnd),WM_NCMOUSEMOVE,(WPARAM)(UINT)(codeHitTest),MAKELPARAM((x),(y))) +#define FORWARD_WM_NCPAINT(hwnd,hrgn,fn) (void)(fn)((hwnd),WM_NCPAINT,(WPARAM)(HRGN)(hrgn),0) +#define FORWARD_WM_NCRBUTTONDOWN(hwnd,fDoubleClick,x,y,codeHitTest,fn) (void)(fn)((hwnd),(fDoubleClick) ? WM_NCRBUTTONDBLCLK : WM_NCRBUTTONDOWN,(WPARAM)(UINT)(codeHitTest),MAKELPARAM((x),(y)) ) +#define FORWARD_WM_NCRBUTTONUP(hwnd,x,y,codeHitTest,fn) (void)(fn)((hwnd),WM_NCRBUTTONUP,(WPARAM)(UINT)(codeHitTest),MAKELPARAM((x),(y)) ) +#define FORWARD_WM_NEXTDLGCTL(hwnd,hwndSetFocus,fNext,fn) (HWND)(UINT)(DWORD)(fn)((hwnd),WM_NEXTDLGCTL,(WPARAM)(HWND)(hwndSetFocus),(LPARAM)(fNext)) +#define FORWARD_WM_PAINT(hwnd,fn) (void)(fn)((hwnd),WM_PAINT,0,0) +#define FORWARD_WM_PAINTCLIPBOARD(hwnd,hwndCBViewer,lpPaintStruct,fn) (void)(fn)((hwnd),WM_PAINTCLIPBOARD,(WPARAM)(HWND)(hwndCBViewer),(LPARAM)(LPPAINTSTRUCT)(lpPaintStruct)) +#define FORWARD_WM_PALETTECHANGED(hwnd,hwndPaletteChange,fn) (void)(fn)((hwnd),WM_PALETTECHANGED,(WPARAM)(HWND)(hwndPaletteChange),0) +#define FORWARD_WM_PALETTEISCHANGING(hwnd,hwndPaletteChange,fn) (void)(fn)((hwnd),WM_PALETTEISCHANGING,(WPARAM)(HWND)(hwndPaletteChange),0) +#define FORWARD_WM_PARENTNOTIFY(hwnd,msg,hwndChild,idChild,fn) (void)(fn)((hwnd),WM_PARENTNOTIFY,MAKEWPARAM(msg,idChild),(LPARAM)(hwndChild)) +#define FORWARD_WM_PASTE(hwnd,fn) (void)(fn)((hwnd),WM_PASTE,0,0) +#define FORWARD_WM_POWER(hwnd,code,fn) (void)(fn)((hwnd),WM_POWER,(WPARAM)(int)(code),0) +#define FORWARD_WM_QUERYDRAGICON(hwnd,fn) (HICON)(UINT)(DWORD)(fn)((hwnd),WM_QUERYDRAGICON,0,0) +#define FORWARD_WM_QUERYENDSESSION(hwnd,fn) (BOOL)(DWORD)(fn)((hwnd),WM_QUERYENDSESSION,0,0) +#define FORWARD_WM_QUERYNEWPALETTE(hwnd,fn) (BOOL)(DWORD)(fn)((hwnd),WM_QUERYNEWPALETTE,0,0) +#define FORWARD_WM_QUERYOPEN(hwnd,fn) (BOOL)(DWORD)(fn)((hwnd),WM_QUERYOPEN,0,0) +#define FORWARD_WM_QUEUESYNC(hwnd,fn) (void)(fn)((hwnd),WM_QUEUESYNC,0,0) +#define FORWARD_WM_QUIT(hwnd,exitCode,fn) (void)(fn)((hwnd),WM_QUIT,(WPARAM)(exitCode),0) +#define FORWARD_WM_RBUTTONDOWN(hwnd,fDoubleClick,x,y,keyFlags,fn) (void)(fn)((hwnd),(fDoubleClick) ? WM_RBUTTONDBLCLK : WM_RBUTTONDOWN,(WPARAM)(UINT)(keyFlags),MAKELPARAM((x),(y))) +#define FORWARD_WM_RBUTTONUP(hwnd,x,y,keyFlags,fn) (void)(fn)((hwnd),WM_RBUTTONUP,(WPARAM)(UINT)(keyFlags),MAKELPARAM((x),(y))) +#define FORWARD_WM_RENDERALLFORMATS(hwnd,fn) (void)(fn)((hwnd),WM_RENDERALLFORMATS,0,0) +#define FORWARD_WM_RENDERFORMAT(hwnd,fmt,fn) (HANDLE)(UINT)(DWORD)(fn)((hwnd),WM_RENDERFORMAT,(WPARAM)(UINT)(fmt),0) +#define FORWARD_WM_SETCURSOR(hwnd,hwndCursor,codeHitTest,msg,fn) (BOOL)(DWORD)(fn)((hwnd),WM_SETCURSOR,(WPARAM)(HWND)(hwndCursor),MAKELPARAM((codeHitTest),(msg))) +#define FORWARD_WM_SETFOCUS(hwnd,hwndOldFocus,fn) (void)(fn)((hwnd),WM_SETFOCUS,(WPARAM)(HWND)(hwndOldFocus),0) +#define FORWARD_WM_SETFONT(hwnd,hfont,fRedraw,fn) (void)(fn)((hwnd),WM_SETFONT,(WPARAM)(HFONT)(hfont),(LPARAM)(BOOL)(fRedraw)) +#define FORWARD_WM_SETREDRAW(hwnd,fRedraw,fn) (void)(fn)((hwnd),WM_SETREDRAW,(WPARAM)(BOOL)(fRedraw),0) +#define FORWARD_WM_SETTEXT(hwnd,lpszText,fn) (void)(fn)((hwnd),WM_SETTEXT,0,(LPARAM)(LPCTSTR)(lpszText)) +#define FORWARD_WM_SHOWWINDOW(hwnd,fShow,status,fn) (void)(fn)((hwnd),WM_SHOWWINDOW,(WPARAM)(BOOL)(fShow),(LPARAM)(UINT)(status)) +#define FORWARD_WM_SIZE(hwnd,state,cx,cy,fn) (void)(fn)((hwnd),WM_SIZE,(WPARAM)(UINT)(state),MAKELPARAM((cx),(cy))) +#define FORWARD_WM_SIZECLIPBOARD(hwnd,hwndCBViewer,lprc,fn) (void)(fn)((hwnd),WM_SIZECLIPBOARD,(WPARAM)(HWND)(hwndCBViewer),(LPARAM)(LPRECT)(lprc)) +#define FORWARD_WM_SPOOLERSTATUS(hwnd,status,cJobInQueue,fn) (void)(fn)((hwnd),WM_SPOOLERSTATUS,(WPARAM)(status),MAKELPARAM((cJobInQueue),0)) +#define FORWARD_WM_SYSCHAR(hwnd,ch,cRepeat,fn) (void)(fn)((hwnd),WM_SYSCHAR,(WPARAM)(TCHAR)(ch),MAKELPARAM((cRepeat),0)) +#define FORWARD_WM_SYSCOLORCHANGE(hwnd,fn) (void)(fn)((hwnd),WM_SYSCOLORCHANGE,0,0) +#define FORWARD_WM_SYSCOMMAND(hwnd,cmd,x,y,fn) (void)(fn)((hwnd),WM_SYSCOMMAND,(WPARAM)(UINT)(cmd),MAKELPARAM((x),(y))) +#define FORWARD_WM_SYSDEADCHAR(hwnd,ch,cRepeat,fn) (void)(fn)((hwnd),WM_SYSDEADCHAR,(WPARAM)(TCHAR)(ch),MAKELPARAM((cRepeat),0)) +#define FORWARD_WM_SYSKEYDOWN(hwnd,vk,cRepeat,flags,fn) (void)(fn)((hwnd),WM_SYSKEYDOWN,(WPARAM)(UINT)(vk),MAKELPARAM((cRepeat),(flags))) +#define FORWARD_WM_SYSKEYUP(hwnd,vk,cRepeat,flags,fn) (void)(fn)((hwnd),WM_SYSKEYUP,(WPARAM)(UINT)(vk),MAKELPARAM((cRepeat),(flags))) +#define FORWARD_WM_SYSTEMERROR(hwnd,errCode,fn) 0 +#define FORWARD_WM_TIMECHANGE(hwnd,fn) (void)(fn)((hwnd),WM_TIMECHANGE,0,0) +#define FORWARD_WM_TIMER(hwnd,id,fn) (void)(fn)((hwnd),WM_TIMER,(WPARAM)(UINT)(id),0) +#define FORWARD_WM_UNDO(hwnd,fn) (void)(fn)((hwnd),WM_UNDO,0,0) +#define FORWARD_WM_VKEYTOITEM(hwnd,vk,hwndListBox,iCaret,fn) (int)(DWORD)(fn)((hwnd),WM_VKEYTOITEM,MAKEWPARAM((vk),(iCaret)),(LPARAM)(hwndListBox)) +#define FORWARD_WM_VSCROLL(hwnd,hwndCtl,code,pos,fn) (void)(fn)((hwnd),WM_VSCROLL,MAKEWPARAM((UINT)(int)(code),(UINT)(int)(pos)),(LPARAM)(HWND)(hwndCtl)) +#define FORWARD_WM_VSCROLLCLIPBOARD(hwnd,hwndCBViewer,code,pos,fn) (void)(fn)((hwnd),WM_VSCROLLCLIPBOARD,(WPARAM)(HWND)(hwndCBViewer),MAKELPARAM((code),(pos))) +#define FORWARD_WM_WINDOWPOSCHANGED(hwnd,lpwpos,fn) (void)(fn)((hwnd),WM_WINDOWPOSCHANGED,0,(LPARAM)(const LPWINDOWPOS)(lpwpos)) +#define FORWARD_WM_WINDOWPOSCHANGING(hwnd,lpwpos,fn) (BOOL)(DWORD)(fn)((hwnd),WM_WINDOWPOSCHANGING,0,(LPARAM)(LPWINDOWPOS)(lpwpos)) +#define FORWARD_WM_WININICHANGE(hwnd,lpszSectionName,fn) (void)(fn)((hwnd),WM_WININICHANGE,0,(LPARAM)(LPCTSTR)(lpszSectionName)) +#define GET_EM_LINESCROLL_MPS(vert,horz) (WPARAM)horz,(LONG)vert +#define GET_EM_SETSEL_END(wp,lp) (lp) +#define GET_EM_SETSEL_MPS(iStart,iEnd) (WPARAM)(iStart),(LONG)(iEnd) +#define GET_EM_SETSEL_START(wp,lp) (INT)(wp) +#define GET_LPARAM(wp,lp) (lp) +#define GET_WM_ACTIVATE_FMINIMIZED(wp,lp) (BOOL)HIWORD(wp) +#define GET_WM_ACTIVATE_HWND(wp,lp) (HWND)(lp) +#define GET_WM_ACTIVATE_MPS(s,fmin,hwnd) (WPARAM)MAKELONG((s),(fmin)),(LONG)(hwnd) +#define GET_WM_ACTIVATE_STATE(wp,lp) LOWORD(wp) +#define GET_WM_CHANGECBCHAIN_HWNDNEXT(wp,lp) (HWND)(lp) +#define GET_WM_CHARTOITEM_CHAR(wp,lp) (TCHAR)LOWORD(wp) +#define GET_WM_CHARTOITEM_HWND(wp,lp) (HWND)(lp) +#define GET_WM_CHARTOITEM_MPS(ch,pos,hwnd) (WPARAM)MAKELONG((pos),(ch)),(LONG)(hwnd) +#define GET_WM_CHARTOITEM_POS(wp,lp) HIWORD(wp) +#define GET_WM_COMMAND_CMD(wp,lp) HIWORD(wp) +#define GET_WM_COMMAND_HWND(wp,lp) (HWND)(lp) +#define GET_WM_COMMAND_ID(wp,lp) LOWORD(wp) +#define GET_WM_COMMAND_MPS(id,hwnd,cmd) (WPARAM)MAKELONG(id,cmd),(LONG)(hwnd) +#define GET_WM_CTLCOLOR_HDC(wp,lp,msg) (HDC)(wp) +#define GET_WM_CTLCOLOR_HWND(wp,lp,msg) (HWND)(lp) +#define GET_WM_CTLCOLOR_MPS(hdc,hwnd,type) (WPARAM)(hdc),(LONG)(hwnd) +#define GET_WM_CTLCOLOR_MSG(type) (WORD)(WM_CTLCOLORMSGBOX+(type)) +#define GET_WM_CTLCOLOR_TYPE(wp,lp,msg) (WORD)(msg - WM_CTLCOLORMSGBOX) +#define GET_WM_HSCROLL_CODE(wp,lp) LOWORD(wp) +#define GET_WM_HSCROLL_HWND(wp,lp) (HWND)(lp) +#define GET_WM_HSCROLL_MPS(code,pos,hwnd) (WPARAM)MAKELONG(code,pos),(LONG)(hwnd) +#define GET_WM_HSCROLL_POS(wp,lp) HIWORD(wp) +#define GET_WM_MDIACTIVATE_FACTIVATE(hwnd,wp,lp) (lp == (LONG)hwnd) +#define GET_WM_MDIACTIVATE_HWNDACTIVATE(wp,lp) (HWND)(lp) +#define GET_WM_MDIACTIVATE_HWNDDEACT(wp,lp) (HWND)(wp) +#define GET_WM_MDIACTIVATE_MPS(f,hwndD,hwndA) (WPARAM)(hwndA),0 +#define GET_WM_MDISETMENU_MPS(hmenuF,hmenuW) (WPARAM)hmenuF,(LONG)hmenuW +#define GET_WM_MENUCHAR_CHAR(wp,lp) (TCHAR)LOWORD(wp) +#define GET_WM_MENUCHAR_FMENU(wp,lp) (BOOL)HIWORD(wp) +#define GET_WM_MENUCHAR_HMENU(wp,lp) (HMENU)(lp) +#define GET_WM_MENUCHAR_MPS(ch,hmenu,f) (WPARAM)MAKELONG(ch,f),(LONG)(hmenu) +#define GET_WM_MENUSELECT_CMD(wp,lp) LOWORD(wp) +#define GET_WM_MENUSELECT_FLAGS(wp,lp) (UINT)(int)(short)HIWORD(wp) +#define GET_WM_MENUSELECT_HMENU(wp,lp) (HMENU)(lp) +#define GET_WM_MENUSELECT_MPS(cmd,f,hmenu) (WPARAM)MAKELONG(cmd,f),(LONG)(hmenu) +#define GET_WM_PARENTNOTIFY2_MPS(msg,x,y) (WPARAM)MAKELONG(0,msg),MAKELONG(x,y) +#define GET_WM_PARENTNOTIFY_HWNDCHILD(wp,lp) (HWND)(lp) +#define GET_WM_PARENTNOTIFY_ID(wp,lp) HIWORD(wp) +#define GET_WM_PARENTNOTIFY_MPS(msg,id,hwnd) (WPARAM)MAKELONG(id,msg),(LONG)(hwnd) +#define GET_WM_PARENTNOTIFY_MSG(wp,lp) LOWORD(wp) +#define GET_WM_PARENTNOTIFY_X(wp,lp) (int)(short)LOWORD(lp) +#define GET_WM_PARENTNOTIFY_Y(wp,lp) (int)(short)HIWORD(lp) +#define GET_WM_VKEYTOITEM_CODE(wp,lp) (int)(short)LOWORD(wp) +#define GET_WM_VKEYTOITEM_HWND(wp,lp) (HWND)(lp) +#define GET_WM_VKEYTOITEM_ITEM(wp,lp) HIWORD(wp) +#define GET_WM_VKEYTOITEM_MPS(code,item,hwnd) (WPARAM)MAKELONG(item,code),(LONG)(hwnd) +#define GET_WM_VSCROLL_CODE(wp,lp) LOWORD(wp) +#define GET_WM_VSCROLL_HWND(wp,lp) (HWND)(lp) +#define GET_WM_VSCROLL_MPS(code,pos,hwnd) (WPARAM)MAKELONG(code,pos),(LONG)(hwnd) +#define GET_WM_VSCROLL_POS(wp,lp) HIWORD(wp) +#define GET_WPARAM(wp,lp) (wp) +#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp)) +#define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp)) +#define GetFirstChild(hwnd) GetTopWindow(hwnd) +#define GetFirstSibling(hwnd) GetWindow(hwnd,GW_HWNDFIRST) +#define GetInstanceModule(hInstance) (HMODULE)(hInstance) +#define GetLastSibling(hwnd) GetWindow(hwnd,GW_HWNDLAST) +#define GetNextSibling(hwnd) GetWindow(hwnd,GW_HWNDNEXT) +#define GetPrevSibling(hwnd) GetWindow(hwnd,GW_HWNDPREV) +#define GetStockBrush(i) ((HBRUSH)GetStockObject(i)) +#define GetStockFont(i) ((HFONT)GetStockObject(i)) +#define GetStockPen(i) ((HPEN)GetStockObject(i)) +#define GetWindowExStyle(hwnd) ((DWORD)GetWindowLong(hwnd,GWL_EXSTYLE)) +#define GetWindowFont(hwnd) FORWARD_WM_GETFONT((hwnd),SendMessage) +#define GetWindowID(hwnd) GetDlgCtrlID(hwnd) +#define GetWindowInstance(hwnd) ((HMODULE)GetWindowLong(hwnd,GWL_HINSTANCE)) +#define GetWindowOwner(hwnd) GetWindow(hwnd,GW_OWNER) +#define GetWindowStyle(hwnd) ((DWORD)GetWindowLong(hwnd,GWL_STYLE)) +#define GlobalAllocPtr(flags,cb) (GlobalLock(GlobalAlloc((flags),(cb)))) +#define GlobalFreePtr(lp) (GlobalUnlockPtr(lp),(BOOL)GlobalFree(GlobalPtrHandle(lp))) +#define GlobalLockPtr(lp) ((BOOL)GlobalLock(GlobalPtrHandle(lp))) +#define GlobalPtrHandle(lp) ((HGLOBAL)GlobalHandle(lp)) +#define GlobalReAllocPtr(lp,cbNew,flags) (GlobalUnlockPtr(lp),GlobalLock(GlobalReAlloc(GlobalPtrHandle(lp) ,(cbNew),(flags)))) +#define GlobalUnlockPtr(lp) GlobalUnlock(GlobalPtrHandle(lp)) +#define HANDLE_MSG(hwnd,message,fn) case (message): return HANDLE_##message((hwnd),(wParam),(lParam),(fn)) +#define HANDLE_WM_ACTIVATE(hwnd,wParam,lParam,fn) ((fn)((hwnd),(UINT)LOWORD(wParam),(HWND)(lParam),(BOOL)HIWORD(wParam)),0) +#define HANDLE_WM_ACTIVATEAPP(hwnd,wParam,lParam,fn) ((fn)((hwnd),(BOOL)(wParam),(DWORD)(lParam)),0) +#define HANDLE_WM_ASKCBFORMATNAME(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(wParam),(LPTSTR)(lParam)),0) +#define HANDLE_WM_CANCELMODE(hwnd,wParam,lParam,fn) ((fn)(hwnd),0) +#define HANDLE_WM_CHANGECBCHAIN(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(wParam),(HWND)(lParam)),0) +#define HANDLE_WM_CHAR(hwnd,wParam,lParam,fn) ((fn)((hwnd),(TCHAR)(wParam),(int)(short)LOWORD(lParam)),0) +#define HANDLE_WM_CHARTOITEM(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(int)(fn)((hwnd),(UINT)LOWORD(wParam),(HWND)(lParam),(int)(short)HIWORD(wParam)) +#define HANDLE_WM_CHILDACTIVATE(hwnd,wParam,lParam,fn) ((fn)(hwnd),0) +#define HANDLE_WM_CLEAR(hwnd,wParam,lParam,fn) ((fn)(hwnd),0) +#define HANDLE_WM_CLOSE(hwnd,wParam,lParam,fn) ((fn)(hwnd),0) +#define HANDLE_WM_COMMAND(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(LOWORD(wParam)),(HWND)(lParam),(UINT)HIWORD(wParam)),0) +#define HANDLE_WM_COMMNOTIFY(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(wParam),(UINT)LOWORD(lParam)),0) +#define HANDLE_WM_COMPACTING(hwnd,wParam,lParam,fn) ((fn)((hwnd),(UINT)(wParam)),0) +#define HANDLE_WM_COMPAREITEM(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(int)(fn)((hwnd),(const COMPAREITEMSTRUCT*)(lParam)) +#define HANDLE_WM_COPY(hwnd,wParam,lParam,fn) ((fn)(hwnd),0) +#define HANDLE_WM_CREATE(hwnd,wParam,lParam,fn) ((fn)((hwnd),(LPCREATESTRUCT)(lParam)) ? 0 : (LRESULT)-1L) +#define HANDLE_WM_CTLCOLORBTN(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(HBRUSH)(fn)((hwnd),(HDC)(wParam),(HWND)(lParam),CTLCOLOR_BTN) +#define HANDLE_WM_CTLCOLORDLG(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(HBRUSH)(fn)((hwnd),(HDC)(wParam),(HWND)(lParam),CTLCOLOR_DLG) +#define HANDLE_WM_CTLCOLOREDIT(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(HBRUSH)(fn)((hwnd),(HDC)(wParam),(HWND)(lParam),CTLCOLOR_EDIT) +#define HANDLE_WM_CTLCOLORLISTBOX(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(HBRUSH)(fn)((hwnd),(HDC)(wParam),(HWND)(lParam),CTLCOLOR_LISTBOX) +#define HANDLE_WM_CTLCOLORMSGBOX(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(HBRUSH)(fn)((hwnd),(HDC)(wParam),(HWND)(lParam),CTLCOLOR_MSGBOX) +#define HANDLE_WM_CTLCOLORSCROLLBAR(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(HBRUSH)(fn)((hwnd),(HDC)(wParam),(HWND)(lParam),CTLCOLOR_SCROLLBAR) +#define HANDLE_WM_CTLCOLORSTATIC(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(HBRUSH)(fn)((hwnd),(HDC)(wParam),(HWND)(lParam),CTLCOLOR_STATIC) +#define HANDLE_WM_CUT(hwnd,wParam,lParam,fn) ((fn)(hwnd),0) +#define HANDLE_WM_DEADCHAR(hwnd,wParam,lParam,fn) ((fn)((hwnd),(TCHAR)(wParam),(int)(short)LOWORD(lParam)),0) +#define HANDLE_WM_DELETEITEM(hwnd,wParam,lParam,fn) ((fn)((hwnd),(const DELETEITEMSTRUCT*)(lParam)),0) +#define HANDLE_WM_DESTROY(hwnd,wParam,lParam,fn) ((fn)(hwnd),0) +#define HANDLE_WM_DESTROYCLIPBOARD(hwnd,wParam,lParam,fn) ((fn)(hwnd),0) +#define HANDLE_WM_DEVMODECHANGE(hwnd,wParam,lParam,fn) ((fn)((hwnd),(LPCTSTR)(lParam)),0) +#define HANDLE_WM_DRAWCLIPBOARD(hwnd,wParam,lParam,fn) ((fn)(hwnd),0) +#define HANDLE_WM_DRAWITEM(hwnd,wParam,lParam,fn) ((fn)((hwnd),(const DRAWITEMSTRUCT*)(lParam)),0) +#define HANDLE_WM_DROPFILES(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HDROP)(wParam)),0) +#define HANDLE_WM_ENABLE(hwnd,wParam,lParam,fn) ((fn)((hwnd),(BOOL)(wParam)),0) +#define HANDLE_WM_ENDSESSION(hwnd,wParam,lParam,fn) ((fn)((hwnd),(BOOL)(wParam)),0) +#define HANDLE_WM_ENTERIDLE(hwnd,wParam,lParam,fn) ((fn)((hwnd),(UINT)(wParam),(HWND)(lParam)),0) +#define HANDLE_WM_ERASEBKGND(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(BOOL)(fn)((hwnd),(HDC)(wParam)) +#define HANDLE_WM_FONTCHANGE(hwnd,wParam,lParam,fn) ((fn)(hwnd),0) +#define HANDLE_WM_GETDLGCODE(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(fn)(hwnd,(LPMSG)(lParam)) +#define HANDLE_WM_GETFONT(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(HFONT)(fn)(hwnd) +#define HANDLE_WM_GETMINMAXINFO(hwnd,wParam,lParam,fn) ((fn)((hwnd),(LPMINMAXINFO)(lParam)),0) +#define HANDLE_WM_GETTEXT(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(int)(fn)((hwnd),(int)(wParam),(LPTSTR)(lParam)) +#define HANDLE_WM_GETTEXTLENGTH(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(int)(fn)(hwnd) +#define HANDLE_WM_HSCROLL(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(lParam),(UINT)(LOWORD(wParam)),(int)(short)HIWORD(wParam)),0) +#define HANDLE_WM_HSCROLLCLIPBOARD(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(wParam),(UINT)LOWORD(lParam),(int)(short)HIWORD(lParam)),0) +#define HANDLE_WM_ICONERASEBKGND(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(BOOL)(fn)((hwnd),(HDC)(wParam)) +#define HANDLE_WM_INITDIALOG(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(BOOL)(fn)((hwnd),(HWND)(wParam),lParam) +#define HANDLE_WM_INITMENU(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HMENU)(wParam)),0) +#define HANDLE_WM_INITMENUPOPUP(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HMENU)(wParam),(UINT)LOWORD(lParam),(BOOL)HIWORD(lParam)),0) +#define HANDLE_WM_KEYDOWN(hwnd,wParam,lParam,fn) ((fn)((hwnd),(UINT)(wParam),TRUE,(int)(short)LOWORD(lParam),(UINT)HIWORD(lParam)),0) +#define HANDLE_WM_KEYUP(hwnd,wParam,lParam,fn) ((fn)((hwnd),(UINT)(wParam),FALSE,(int)(short)LOWORD(lParam),(UINT)HIWORD(lParam)),0) +#define HANDLE_WM_KILLFOCUS(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(wParam)),0) +#define HANDLE_WM_LBUTTONDBLCLK(hwnd,wParam,lParam,fn) ((fn)((hwnd),TRUE,(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0) +#define HANDLE_WM_LBUTTONDOWN(hwnd,wParam,lParam,fn) ((fn)((hwnd),FALSE,(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0) +#define HANDLE_WM_LBUTTONUP(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0) +#define HANDLE_WM_MBUTTONDBLCLK(hwnd,wParam,lParam,fn) ((fn)((hwnd),TRUE,(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0) +#define HANDLE_WM_MBUTTONDOWN(hwnd,wParam,lParam,fn) ((fn)((hwnd),FALSE,(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0) +#define HANDLE_WM_MBUTTONUP(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0) +#define HANDLE_WM_MDIACTIVATE(hwnd,wParam,lParam,fn) ((fn)((hwnd),(BOOL)(lParam == (LPARAM)hwnd),(HWND)(lParam),(HWND)(wParam)),0) +#define HANDLE_WM_MDICASCADE(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(fn)((hwnd),(UINT)(wParam)) +#define HANDLE_WM_MDICREATE(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(fn)((hwnd),(LPMDICREATESTRUCT)(lParam)) +#define HANDLE_WM_MDIDESTROY(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(wParam)),0) +#define HANDLE_WM_MDIGETACTIVE(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(fn)(hwnd) +#define HANDLE_WM_MDIICONARRANGE(hwnd,wParam,lParam,fn) ((fn)(hwnd),0) +#define HANDLE_WM_MDIMAXIMIZE(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(wParam)),0) +#define HANDLE_WM_MDINEXT(hwnd,wParam,lParam,fn) (LRESULT)(HWND)(fn)((hwnd),(HWND)(wParam),(BOOL)lParam) +#define HANDLE_WM_MDIRESTORE(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(wParam)),0) +#define HANDLE_WM_MDISETMENU(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(fn)((hwnd),(BOOL)(wParam),(HMENU)(wParam),(HMENU)(lParam)) +#define HANDLE_WM_MDITILE(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(fn)((hwnd),(UINT)(wParam)) +#define HANDLE_WM_MEASUREITEM(hwnd,wParam,lParam,fn) ((fn)((hwnd),(MEASUREITEMSTRUCT*)(lParam)),0) +#define HANDLE_WM_MENUCHAR(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(fn)((hwnd),(UINT)(LOWORD(wParam)),(UINT)HIWORD(wParam),(HMENU)(lParam)) +#define HANDLE_WM_MENUSELECT(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HMENU)(lParam),(int)(LOWORD(wParam)),(HIWORD(wParam) & MF_POPUP) ? GetSubMenu((HMENU)lParam,LOWORD(wParam)) : 0,(UINT)(((short)HIWORD(wParam) == -1) ? 0xFFFFFFFF : HIWORD(wParam))),0) +#define HANDLE_WM_MOUSEACTIVATE(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(int)(fn)((hwnd),(HWND)(wParam),(UINT)LOWORD(lParam),(UINT)HIWORD(lParam)) +#define HANDLE_WM_MOUSEMOVE(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0) +#define HANDLE_WM_MOVE(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam)),0) +#define HANDLE_WM_NCACTIVATE(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(BOOL)(fn)((hwnd),(BOOL)(wParam),0,0) +#define HANDLE_WM_NCCALCSIZE(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(fn)((hwnd),(BOOL)(0),(NCCALCSIZE_PARAMS*)(lParam)) +#define HANDLE_WM_NCCREATE(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(BOOL)(fn)((hwnd),(LPCREATESTRUCT)(lParam)) +#define HANDLE_WM_NCDESTROY(hwnd,wParam,lParam,fn) ((fn)(hwnd),0) +#define HANDLE_WM_NCHITTEST(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(fn)((hwnd),(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam)) +#define HANDLE_WM_NCLBUTTONDBLCLK(hwnd,wParam,lParam,fn) ((fn)((hwnd),TRUE,(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0) +#define HANDLE_WM_NCLBUTTONDOWN(hwnd,wParam,lParam,fn) ((fn)((hwnd),FALSE,(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0) +#define HANDLE_WM_NCLBUTTONUP(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0) +#define HANDLE_WM_NCMBUTTONDBLCLK(hwnd,wParam,lParam,fn) ((fn)((hwnd),TRUE,(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0) +#define HANDLE_WM_NCMBUTTONDOWN(hwnd,wParam,lParam,fn) ((fn)((hwnd),FALSE,(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0) +#define HANDLE_WM_NCMBUTTONUP(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0) +#define HANDLE_WM_NCMOUSEMOVE(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0) +#define HANDLE_WM_NCPAINT(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HRGN)(wParam)),0) +#define HANDLE_WM_NCRBUTTONDBLCLK(hwnd,wParam,lParam,fn) ((fn)((hwnd),TRUE,(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0) +#define HANDLE_WM_NCRBUTTONDOWN(hwnd,wParam,lParam,fn) ((fn)((hwnd),FALSE,(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0) +#define HANDLE_WM_NCRBUTTONUP(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0) +#define HANDLE_WM_NEXTDLGCTL(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(HWND)(fn)((hwnd),(HWND)(wParam),(BOOL)(lParam)) +#define HANDLE_WM_PAINT(hwnd,wParam,lParam,fn) ((fn)(hwnd),0) +#define HANDLE_WM_PAINTCLIPBOARD(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(wParam),(const LPPAINTSTRUCT)GlobalLock((HGLOBAL)(lParam))),GlobalUnlock((HGLOBAL)(lParam)),0) +#define HANDLE_WM_PALETTECHANGED(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(wParam)),0) +#define HANDLE_WM_PALETTEISCHANGING(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(wParam)),0) +#define HANDLE_WM_PARENTNOTIFY(hwnd,wParam,lParam,fn) ((fn)((hwnd),(UINT)LOWORD(wParam),(HWND)(lParam),(UINT)HIWORD(wParam)),0) +#define HANDLE_WM_PASTE(hwnd,wParam,lParam,fn) ((fn)(hwnd),0) +#define HANDLE_WM_POWER(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(wParam)),0) +#define HANDLE_WM_QUERYDRAGICON(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(fn)(hwnd) +#define HANDLE_WM_QUERYENDSESSION(hwnd,wParam,lParam,fn) MAKELRESULT((BOOL)(fn)(hwnd),0) +#define HANDLE_WM_QUERYNEWPALETTE(hwnd,wParam,lParam,fn) MAKELRESULT((BOOL)(fn)(hwnd),0) +#define HANDLE_WM_QUERYOPEN(hwnd,wParam,lParam,fn) MAKELRESULT((BOOL)(fn)(hwnd),0) +#define HANDLE_WM_QUEUESYNC(hwnd,wParam,lParam,fn) ((fn)(hwnd),0) +#define HANDLE_WM_QUIT(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(wParam)),0) +#define HANDLE_WM_RBUTTONDBLCLK(hwnd,wParam,lParam,fn) ((fn)((hwnd),TRUE,(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0) +#define HANDLE_WM_RBUTTONDOWN(hwnd,wParam,lParam,fn) ((fn)((hwnd),FALSE,(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0) +#define HANDLE_WM_RBUTTONUP(hwnd,wParam,lParam,fn) ((fn)((hwnd),(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam),(UINT)(wParam)),0) +#define HANDLE_WM_RENDERALLFORMATS(hwnd,wParam,lParam,fn) ((fn)(hwnd),0) +#define HANDLE_WM_RENDERFORMAT(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(UINT)(HANDLE)(fn)((hwnd),(UINT)(wParam)) +#define HANDLE_WM_SETCURSOR(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(BOOL)(fn)((hwnd),(HWND)(wParam),(UINT)LOWORD(lParam),(UINT)HIWORD(lParam)) +#define HANDLE_WM_SETFOCUS(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(wParam)),0) +#define HANDLE_WM_SETFONT(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HFONT)(wParam),(BOOL)(lParam)),0) +#define HANDLE_WM_SETREDRAW(hwnd,wParam,lParam,fn) ((fn)((hwnd),(BOOL)(wParam)),0) +#define HANDLE_WM_SETTEXT(hwnd,wParam,lParam,fn) ((fn)((hwnd),(LPCTSTR)(lParam)),0) +#define HANDLE_WM_SHOWWINDOW(hwnd,wParam,lParam,fn) ((fn)((hwnd),(BOOL)(wParam),(UINT)(lParam)),0) +#define HANDLE_WM_SIZE(hwnd,wParam,lParam,fn) ((fn)((hwnd),(UINT)(wParam),(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam)),0) +#define HANDLE_WM_SIZECLIPBOARD(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(wParam),(const LPRECT)GlobalLock((HGLOBAL)(lParam))),GlobalUnlock((HGLOBAL)(lParam)),0) +#define HANDLE_WM_SPOOLERSTATUS(hwnd,wParam,lParam,fn) ((fn)((hwnd),(UINT)(wParam),(int)(short)LOWORD(lParam)),0) +#define HANDLE_WM_SYSCHAR(hwnd,wParam,lParam,fn) ((fn)((hwnd),(TCHAR)(wParam),(int)(short)LOWORD(lParam)),0) +#define HANDLE_WM_SYSCOLORCHANGE(hwnd,wParam,lParam,fn) ((fn)(hwnd),0) +#define HANDLE_WM_SYSCOMMAND(hwnd,wParam,lParam,fn) ((fn)((hwnd),(UINT)(wParam),(int)(short)LOWORD(lParam),(int)(short)HIWORD(lParam)),0) +#define HANDLE_WM_SYSDEADCHAR(hwnd,wParam,lParam,fn) ((fn)((hwnd),(TCHAR)(wParam),(int)(short)LOWORD(lParam)),0) +#define HANDLE_WM_SYSKEYDOWN(hwnd,wParam,lParam,fn) ((fn)((hwnd),(UINT)(wParam),TRUE,(int)(short)LOWORD(lParam),(UINT)HIWORD(lParam)),0) +#define HANDLE_WM_SYSKEYUP(hwnd,wParam,lParam,fn) ((fn)((hwnd),(UINT)(wParam),FALSE,(int)(short)LOWORD(lParam),(UINT)HIWORD(lParam)),0) +#define HANDLE_WM_SYSTEMERROR(hwnd,wParam,lParam,fn) 0 +#define HANDLE_WM_TIMECHANGE(hwnd,wParam,lParam,fn) ((fn)(hwnd),0) +#define HANDLE_WM_TIMER(hwnd,wParam,lParam,fn) ((fn)((hwnd),(UINT)(wParam)),0) +#define HANDLE_WM_UNDO(hwnd,wParam,lParam,fn) ((fn)(hwnd),0) +#define HANDLE_WM_VKEYTOITEM(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(int)(fn)((hwnd),(UINT)LOWORD(wParam),(HWND)(lParam),(int)(short)HIWORD(wParam)) +#define HANDLE_WM_VSCROLL(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(lParam),(UINT)(LOWORD(wParam)),(int)(short)HIWORD(wParam)),0) +#define HANDLE_WM_VSCROLLCLIPBOARD(hwnd,wParam,lParam,fn) ((fn)((hwnd),(HWND)(wParam),(UINT)LOWORD(lParam),(int)(short)HIWORD(lParam)),0) +#define HANDLE_WM_WINDOWPOSCHANGED(hwnd,wParam,lParam,fn) ((fn)((hwnd),(const LPWINDOWPOS)(lParam)),0) +#define HANDLE_WM_WINDOWPOSCHANGING(hwnd,wParam,lParam,fn) (LRESULT)(DWORD)(BOOL)(fn)((hwnd),(LPWINDOWPOS)(lParam)) +#define HANDLE_WM_WININICHANGE(hwnd,wParam,lParam,fn) ((fn)((hwnd),(LPCTSTR)(lParam)),0) +#define InsetRect(lprc,dx,dy) InflateRect((lprc),-(dx),-(dy)) +#define IntersectRgn(hrgnResult,hrgnA,hrgnB) CombineRgn(hrgnResult,hrgnA,hrgnB,RGN_AND) +#define IsLButtonDown() (GetKeyState(VK_LBUTTON) < 0) +#define IsMButtonDown() (GetKeyState(VK_MBUTTON) < 0) +#define IsMaximized(hwnd) IsZoomed(hwnd) +#define IsMinimized(hwnd) IsIconic(hwnd) +#define IsRButtonDown() (GetKeyState(VK_RBUTTON) < 0) +#define IsRestored(hwnd) ((GetWindowStyle(hwnd) & (WS_MINIMIZE | WS_MAXIMIZE)) == 0) +#define ListBox_AddItemData(hwndCtl,data) ((int)(DWORD)SendMessage((hwndCtl),LB_ADDSTRING,0,(LPARAM)(data))) +#define ListBox_AddString(hwndCtl,lpsz) ((int)(DWORD)SendMessage((hwndCtl),LB_ADDSTRING,0,(LPARAM)(LPCTSTR)(lpsz))) +#define ListBox_DeleteString(hwndCtl,index) ((int)(DWORD)SendMessage((hwndCtl),LB_DELETESTRING,(WPARAM)(int)(index),0)) +#define ListBox_Dir(hwndCtl,attrs,lpszFileSpec) ((int)(DWORD)SendMessage((hwndCtl),LB_DIR,(WPARAM)(UINT)(attrs),(LPARAM)(LPCTSTR)(lpszFileSpec))) +#define ListBox_Enable(hwndCtl,fEnable) EnableWindow((hwndCtl),(fEnable)) +#define ListBox_FindItemData(hwndCtl,indexStart,data) ((int)(DWORD)SendMessage((hwndCtl),LB_FINDSTRING,(WPARAM)(int)(indexStart),(LPARAM)(data))) +#define ListBox_FindString(hwndCtl,indexStart,lpszFind) ((int)(DWORD)SendMessage((hwndCtl),LB_FINDSTRING,(WPARAM)(int)(indexStart),(LPARAM)(LPCTSTR)(lpszFind))) +#define ListBox_FindStringExact(hwndCtl,indexStart,lpszFind) ((int)(DWORD)SendMessage((hwndCtl),LB_FINDSTRINGEXACT,(WPARAM)(int)(indexStart),(LPARAM)(LPCTSTR)(lpszFind))) +#define ListBox_GetCaretIndex(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),LB_GETCARETINDEX,0,0)) +#define ListBox_GetCount(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),LB_GETCOUNT,0,0)) +#define ListBox_GetCurSel(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),LB_GETCURSEL,0,0)) +#define ListBox_GetHorizontalExtent(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),LB_GETHORIZONTALEXTENT,0,0)) +#define ListBox_GetItemData(hwndCtl,index) ((LRESULT)(DWORD)SendMessage((hwndCtl),LB_GETITEMDATA,(WPARAM)(int)(index),0)) +#define ListBox_GetItemHeight(hwndCtl,index) ((int)(DWORD)SendMessage((hwndCtl),LB_GETITEMHEIGHT,(WPARAM)(int)(index),0)) +#define ListBox_GetItemRect(hwndCtl,index,lprc) ((int)(DWORD)SendMessage((hwndCtl),LB_GETITEMRECT,(WPARAM)(int)(index),(LPARAM)(RECT*)(lprc))) +#define ListBox_GetSel(hwndCtl,index) ((int)(DWORD)SendMessage((hwndCtl),LB_GETSEL,(WPARAM)(int)(index),0)) +#define ListBox_GetSelCount(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),LB_GETSELCOUNT,0,0)) +#define ListBox_GetSelItems(hwndCtl,cItems,lpItems) ((int)(DWORD)SendMessage((hwndCtl),LB_GETSELITEMS,(WPARAM)(int)(cItems),(LPARAM)(int*)(lpItems))) +#define ListBox_GetText(hwndCtl,index,lpszBuffer) ((int)(DWORD)SendMessage((hwndCtl),LB_GETTEXT,(WPARAM)(int)(index),(LPARAM)(LPCTSTR)(lpszBuffer))) +#define ListBox_GetTextLen(hwndCtl,index) ((int)(DWORD)SendMessage((hwndCtl),LB_GETTEXTLEN,(WPARAM)(int)(index),0)) +#define ListBox_GetTopIndex(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),LB_GETTOPINDEX,0,0)) +#define ListBox_InsertItemData(hwndCtl,index,data) ((int)(DWORD)SendMessage((hwndCtl),LB_INSERTSTRING,(WPARAM)(int)(index),(LPARAM)(data))) +#define ListBox_InsertString(hwndCtl,index,lpsz) ((int)(DWORD)SendMessage((hwndCtl),LB_INSERTSTRING,(WPARAM)(int)(index),(LPARAM)(LPCTSTR)(lpsz))) +#define ListBox_ResetContent(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl),LB_RESETCONTENT,0,0)) +#define ListBox_SelItemRange(hwndCtl,fSelect,first,last) ((int)(DWORD)SendMessage((hwndCtl),LB_SELITEMRANGE,(WPARAM)(BOOL)(fSelect),MAKELPARAM((first),(last)))) +#define ListBox_SelectItemData(hwndCtl,indexStart,data) ((int)(DWORD)SendMessage((hwndCtl),LB_SELECTSTRING,(WPARAM)(int)(indexStart),(LPARAM)(data))) +#define ListBox_SelectString(hwndCtl,indexStart,lpszFind) ((int)(DWORD)SendMessage((hwndCtl),LB_SELECTSTRING,(WPARAM)(int)(indexStart),(LPARAM)(LPCTSTR)(lpszFind))) +#define ListBox_SetCaretIndex(hwndCtl,index) ((int)(DWORD)SendMessage((hwndCtl),LB_SETCARETINDEX,(WPARAM)(int)(index),0)) +#define ListBox_SetColumnWidth(hwndCtl,cxColumn) ((void)SendMessage((hwndCtl),LB_SETCOLUMNWIDTH,(WPARAM)(int)(cxColumn),0)) +#define ListBox_SetCurSel(hwndCtl,index) ((int)(DWORD)SendMessage((hwndCtl),LB_SETCURSEL,(WPARAM)(int)(index),0)) +#define ListBox_SetHorizontalExtent(hwndCtl,cxExtent) ((void)SendMessage((hwndCtl),LB_SETHORIZONTALEXTENT,(WPARAM)(int)(cxExtent),0)) +#define ListBox_SetItemData(hwndCtl,index,data) ((int)(DWORD)SendMessage((hwndCtl),LB_SETITEMDATA,(WPARAM)(int)(index),(LPARAM)(data))) +#define ListBox_SetItemHeight(hwndCtl,index,cy) ((int)(DWORD)SendMessage((hwndCtl),LB_SETITEMHEIGHT,(WPARAM)(int)(index),MAKELPARAM((cy),0))) +#define ListBox_SetSel(hwndCtl,fSelect,index) ((int)(DWORD)SendMessage((hwndCtl),LB_SETSEL,(WPARAM)(BOOL)(fSelect),(LPARAM)(index))) +#define ListBox_SetTabStops(hwndCtl,cTabs,lpTabs) ((BOOL)(DWORD)SendMessage((hwndCtl),LB_SETTABSTOPS,(WPARAM)(int)(cTabs),(LPARAM)(int*)(lpTabs))) +#define ListBox_SetTopIndex(hwndCtl,indexTop) ((int)(DWORD)SendMessage((hwndCtl),LB_SETTOPINDEX,(WPARAM)(int)(indexTop),0)) +#define MapWindowRect(hwndFrom,hwndTo,lprc) MapWindowPoints((hwndFrom),(hwndTo),(POINT*)(lprc),2) +#define ScrollBar_Enable(hwndCtl,flags) EnableScrollBar((hwndCtl),SB_CTL,(flags)) +#define ScrollBar_GetPos(hwndCtl) GetScrollPos((hwndCtl),SB_CTL) +#define ScrollBar_GetRange(hwndCtl,lpposMin,lpposMax) GetScrollRange((hwndCtl),SB_CTL,(lpposMin),(lpposMax)) +#define ScrollBar_SetPos(hwndCtl,pos,fRedraw) SetScrollPos((hwndCtl),SB_CTL,(pos),(fRedraw)) +#define ScrollBar_SetRange(hwndCtl,posMin,posMax,fRedraw) SetScrollRange((hwndCtl),SB_CTL,(posMin),(posMax),(fRedraw)) +#define ScrollBar_Show(hwndCtl,fShow) ShowWindow((hwndCtl),(fShow) ? SW_SHOWNORMAL : SW_HIDE) +#define SelectBitmap(hdc,hbm) ((HBITMAP)SelectObject((hdc),(HGDIOBJ)(HBITMAP)(hbm))) +#define SelectBrush(hdc,hbr) ((HBRUSH)SelectObject((hdc),(HGDIOBJ)(HBRUSH)(hbr))) +#define SelectFont(hdc,hfont) ((HFONT)SelectObject((hdc),(HGDIOBJ)(HFONT)(hfont))) +#define SelectPen(hdc,hpen) ((HPEN)SelectObject((hdc),(HGDIOBJ)(HPEN)(hpen))) +#define SetDlgMsgResult(hwnd,msg,result) (( (msg) == WM_CTLCOLORMSGBOX || (msg) == WM_CTLCOLOREDIT || (msg) == WM_CTLCOLORLISTBOX || (msg) == WM_CTLCOLORBTN || (msg) == WM_CTLCOLORDLG || (msg) == WM_CTLCOLORSCROLLBAR || (msg) == WM_CTLCOLORSTATIC || (msg) == WM_COMPAREITEM || (msg) == WM_VKEYTOITEM || (msg) == WM_CHARTOITEM || (msg) == WM_QUERYDRAGICON || (msg) == WM_INITDIALOG ) ? (BOOL)(result) : (SetWindowLong((hwnd),DWL_MSGRESULT,(LPARAM)(LRESULT)(result)),TRUE)) +#define SetWindowFont(hwnd,hfont,fRedraw) FORWARD_WM_SETFONT((hwnd),(hfont),(fRedraw),SendMessage) +#define SetWindowRedraw(hwnd,fRedraw) ((void)SendMessage(hwnd,WM_SETREDRAW,(WPARAM)(BOOL)(fRedraw),0)) +#define Static_Enable(hwndCtl,fEnable) EnableWindow((hwndCtl),(fEnable)) +#define Static_GetIcon(hwndCtl,hIcon) ((HICON)(UINT)(DWORD)SendMessage((hwndCtl),STM_GETICON,0,0)) +#define Static_GetText(hwndCtl,lpch,cchMax) GetWindowText((hwndCtl),(lpch),(cchMax)) +#define Static_GetTextLength(hwndCtl) GetWindowTextLength(hwndCtl) +#define Static_SetIcon(hwndCtl,hIcon) ((HICON)(UINT)(DWORD)SendMessage((hwndCtl),STM_SETICON,(WPARAM)(HICON)(hIcon),0)) +#define Static_SetText(hwndCtl,lpsz) SetWindowText((hwndCtl),(lpsz)) +#define SubclassDialog(hwndDlg,lpfn) ((DLGPROC)SetWindowLong(hwndDlg,DWL_DLGPROC,(LPARAM)(DLGPROC)(lpfn))) +#define SubclassWindow(hwnd,lpfn) ((WNDPROC)SetWindowLong((hwnd),GWL_WNDPROC,(LPARAM)(WNDPROC)(lpfn))) +#define SubtractRgn(hrgnResult,hrgnA,hrgnB) CombineRgn(hrgnResult,hrgnA,hrgnB,RGN_DIFF) +#define UnionRgn(hrgnResult,hrgnA,hrgnB) CombineRgn(hrgnResult,hrgnA,hrgnB,RGN_OR) +#define XorRgn(hrgnResult,hrgnA,hrgnB) CombineRgn(hrgnResult,hrgnA,hrgnB,RGN_XOR) + +/* FAR versions of mem and string functions for porting from old code*/ +#define _ffree free +#define _fmalloc malloc +#define _frealloc realloc +#define _fmsize _msize + +#define _fmemcpy memcpy +#define _fmemmove memmove +#define _fmemset memset +#define _fmemcmp memcmp +#define _fmemchr memchr +#define _fmemccpy _memccpy +#define _fmemicmp _memicmp + +#define _fstrcat strcat +#define _fstrchr strchr +#define _fstrcmp strcmp +#define _fstrcpy strcpy +#define _fstrcspn strcspn +#define _fstrdup _strdup +#define _fstricmp _stricmp +#define _fstrlen strlen +#define _fstrlwr _strlwr +#define _fstrncat strncat +#define _fstrncmp strncmp +#define _fstrncpy strncpy +#define _fstrnicmp _strnicmp +#define _fstrnset _strnset +#define _fstrpbrk strpbrk +#define _fstrrchr strrchr +#define _fstrrev _strrev +#define _fstrset _strset +#define _fstrspn strspn +#define _fstrstr strstr +#define _fstrtok strtok +#define _fstrupr _strupr + +#define hmemcpy MoveMemory + +#endif diff --git a/reactos/w32api/include/winerror.h b/reactos/w32api/include/winerror.h new file mode 100644 index 00000000000..42e8bce99e7 --- /dev/null +++ b/reactos/w32api/include/winerror.h @@ -0,0 +1,2229 @@ +#ifndef _WINERROR_H +#define _WINERROR_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#define ERROR_SUCCESS 0L +#define NO_ERROR 0L +#define ERROR_INVALID_FUNCTION 1L +#define ERROR_FILE_NOT_FOUND 2L +#define ERROR_PATH_NOT_FOUND 3L +#define ERROR_TOO_MANY_OPEN_FILES 4L +#define ERROR_ACCESS_DENIED 5L +#define ERROR_INVALID_HANDLE 6L +#define ERROR_ARENA_TRASHED 7L +#define ERROR_NOT_ENOUGH_MEMORY 8L +#define ERROR_INVALID_BLOCK 9L +#define ERROR_BAD_ENVIRONMENT 10L +#define ERROR_BAD_FORMAT 11L +#define ERROR_INVALID_ACCESS 12L +#define ERROR_INVALID_DATA 13L +#define ERROR_OUTOFMEMORY 14L +#define ERROR_INVALID_DRIVE 15L +#define ERROR_CURRENT_DIRECTORY 16L +#define ERROR_NOT_SAME_DEVICE 17L +#define ERROR_NO_MORE_FILES 18L +#define ERROR_WRITE_PROTECT 19L +#define ERROR_BAD_UNIT 20L +#define ERROR_NOT_READY 21L +#define ERROR_BAD_COMMAND 22L +#define ERROR_CRC 23L +#define ERROR_BAD_LENGTH 24L +#define ERROR_SEEK 25L +#define ERROR_NOT_DOS_DISK 26L +#define ERROR_SECTOR_NOT_FOUND 27L +#define ERROR_OUT_OF_PAPER 28L +#define ERROR_WRITE_FAULT 29L +#define ERROR_READ_FAULT 30L +#define ERROR_GEN_FAILURE 31L +#define ERROR_SHARING_VIOLATION 32L +#define ERROR_LOCK_VIOLATION 33L +#define ERROR_WRONG_DISK 34L +#define ERROR_SHARING_BUFFER_EXCEEDED 36L +#define ERROR_HANDLE_EOF 38L +#define ERROR_HANDLE_DISK_FULL 39L +#define ERROR_NOT_SUPPORTED 50L +#define ERROR_REM_NOT_LIST 51L +#define ERROR_DUP_NAME 52L +#define ERROR_BAD_NETPATH 53L +#define ERROR_NETWORK_BUSY 54L +#define ERROR_DEV_NOT_EXIST 55L +#define ERROR_TOO_MANY_CMDS 56L +#define ERROR_ADAP_HDW_ERR 57L +#define ERROR_BAD_NET_RESP 58L +#define ERROR_UNEXP_NET_ERR 59L +#define ERROR_BAD_REM_ADAP 60L +#define ERROR_PRINTQ_FULL 61L +#define ERROR_NO_SPOOL_SPACE 62L +#define ERROR_PRINT_CANCELLED 63L +#define ERROR_NETNAME_DELETED 64L +#define ERROR_NETWORK_ACCESS_DENIED 65L +#define ERROR_BAD_DEV_TYPE 66L +#define ERROR_BAD_NET_NAME 67L +#define ERROR_TOO_MANY_NAMES 68L +#define ERROR_TOO_MANY_SESS 69L +#define ERROR_SHARING_PAUSED 70L +#define ERROR_REQ_NOT_ACCEP 71L +#define ERROR_REDIR_PAUSED 72L +#define ERROR_FILE_EXISTS 80L +#define ERROR_CANNOT_MAKE 82L +#define ERROR_FAIL_I24 83L +#define ERROR_OUT_OF_STRUCTURES 84L +#define ERROR_ALREADY_ASSIGNED 85L +#define ERROR_INVALID_PASSWORD 86L +#define ERROR_INVALID_PARAMETER 87L +#define ERROR_NET_WRITE_FAULT 88L +#define ERROR_NO_PROC_SLOTS 89L +#define ERROR_TOO_MANY_SEMAPHORES 100L +#define ERROR_EXCL_SEM_ALREADY_OWNED 101L +#define ERROR_SEM_IS_SET 102L +#define ERROR_TOO_MANY_SEM_REQUESTS 103L +#define ERROR_INVALID_AT_INTERRUPT_TIME 104L +#define ERROR_SEM_OWNER_DIED 105L +#define ERROR_SEM_USER_LIMIT 106L +#define ERROR_DISK_CHANGE 107L +#define ERROR_DRIVE_LOCKED 108L +#define ERROR_BROKEN_PIPE 109L +#define ERROR_OPEN_FAILED 110L +#define ERROR_BUFFER_OVERFLOW 111L +#define ERROR_DISK_FULL 112L +#define ERROR_NO_MORE_SEARCH_HANDLES 113L +#define ERROR_INVALID_TARGET_HANDLE 114L +#define ERROR_INVALID_CATEGORY 117L +#define ERROR_INVALID_VERIFY_SWITCH 118L +#define ERROR_BAD_DRIVER_LEVEL 119L +#define ERROR_CALL_NOT_IMPLEMENTED 120L +#define ERROR_SEM_TIMEOUT 121L +#define ERROR_INSUFFICIENT_BUFFER 122L +#define ERROR_INVALID_NAME 123L +#define ERROR_INVALID_LEVEL 124L +#define ERROR_NO_VOLUME_LABEL 125L +#define ERROR_MOD_NOT_FOUND 126L +#define ERROR_PROC_NOT_FOUND 127L +#define ERROR_WAIT_NO_CHILDREN 128L +#define ERROR_CHILD_NOT_COMPLETE 129L +#define ERROR_DIRECT_ACCESS_HANDLE 130L +#define ERROR_NEGATIVE_SEEK 131L +#define ERROR_SEEK_ON_DEVICE 132L +#define ERROR_IS_JOIN_TARGET 133L +#define ERROR_IS_JOINED 134L +#define ERROR_IS_SUBSTED 135L +#define ERROR_NOT_JOINED 136L +#define ERROR_NOT_SUBSTED 137L +#define ERROR_JOIN_TO_JOIN 138L +#define ERROR_SUBST_TO_SUBST 139L +#define ERROR_JOIN_TO_SUBST 140L +#define ERROR_SUBST_TO_JOIN 141L +#define ERROR_BUSY_DRIVE 142L +#define ERROR_SAME_DRIVE 143L +#define ERROR_DIR_NOT_ROOT 144L +#define ERROR_DIR_NOT_EMPTY 145L +#define ERROR_IS_SUBST_PATH 146L +#define ERROR_IS_JOIN_PATH 147L +#define ERROR_PATH_BUSY 148L +#define ERROR_IS_SUBST_TARGET 149L +#define ERROR_SYSTEM_TRACE 150L +#define ERROR_INVALID_EVENT_COUNT 151L +#define ERROR_TOO_MANY_MUXWAITERS 152L +#define ERROR_INVALID_LIST_FORMAT 153L +#define ERROR_LABEL_TOO_LONG 154L +#define ERROR_TOO_MANY_TCBS 155L +#define ERROR_SIGNAL_REFUSED 156L +#define ERROR_DISCARDED 157L +#define ERROR_NOT_LOCKED 158L +#define ERROR_BAD_THREADID_ADDR 159L +#define ERROR_BAD_ARGUMENTS 160L +#define ERROR_BAD_PATHNAME 161L +#define ERROR_SIGNAL_PENDING 162L +#define ERROR_MAX_THRDS_REACHED 164L +#define ERROR_LOCK_FAILED 167L +#define ERROR_BUSY 170L +#define ERROR_CANCEL_VIOLATION 173L +#define ERROR_ATOMIC_LOCKS_NOT_SUPPORTED 174L +#define ERROR_INVALID_SEGMENT_NUMBER 180L +#define ERROR_INVALID_ORDINAL 182L +#define ERROR_ALREADY_EXISTS 183L +#define ERROR_INVALID_FLAG_NUMBER 186L +#define ERROR_SEM_NOT_FOUND 187L +#define ERROR_INVALID_STARTING_CODESEG 188L +#define ERROR_INVALID_STACKSEG 189L +#define ERROR_INVALID_MODULETYPE 190L +#define ERROR_INVALID_EXE_SIGNATURE 191L +#define ERROR_EXE_MARKED_INVALID 192L +#define ERROR_BAD_EXE_FORMAT 193L +#define ERROR_ITERATED_DATA_EXCEEDS_64k 194L +#define ERROR_INVALID_MINALLOCSIZE 195L +#define ERROR_DYNLINK_FROM_INVALID_RING 196L +#define ERROR_IOPL_NOT_ENABLED 197L +#define ERROR_INVALID_SEGDPL 198L +#define ERROR_AUTODATASEG_EXCEEDS_64k 199L +#define ERROR_RING2SEG_MUST_BE_MOVABLE 200L +#define ERROR_RELOC_CHAIN_XEEDS_SEGLIM 201L +#define ERROR_INFLOOP_IN_RELOC_CHAIN 202L +#define ERROR_ENVVAR_NOT_FOUND 203L +#define ERROR_NO_SIGNAL_SENT 205L +#define ERROR_FILENAME_EXCED_RANGE 206L +#define ERROR_RING2_STACK_IN_USE 207L +#define ERROR_META_EXPANSION_TOO_LONG 208L +#define ERROR_INVALID_SIGNAL_NUMBER 209L +#define ERROR_THREAD_1_INACTIVE 210L +#define ERROR_LOCKED 212L +#define ERROR_TOO_MANY_MODULES 214L +#define ERROR_NESTING_NOT_ALLOWED 215L +#define ERROR_EXE_MACHINE_TYPE_MISMATCH 216L +#define ERROR_EXE_CANNOT_MODIFY_SIGNED_BINARY 217L +#define ERRO_EXE_CANNOT_MODIFY_STRONG_SIGNED_BINARY 218L +#define ERROR_BAD_PIPE 230L +#define ERROR_PIPE_BUSY 231L +#define ERROR_NO_DATA 232L +#define ERROR_PIPE_NOT_CONNECTED 233L +#define ERROR_MORE_DATA 234L +#define ERROR_VC_DISCONNECTED 240L +#define ERROR_INVALID_EA_NAME 254L +#define ERROR_EA_LIST_INCONSISTENT 255L +#ifndef WAIT_TIMEOUT /* also in winbase.h */ +#define WAIT_TIMEOUT 258L +#endif +#define ERROR_NO_MORE_ITEMS 259L +#define ERROR_CANNOT_COPY 266L +#define ERROR_DIRECTORY 267L +#define ERROR_EAS_DIDNT_FIT 275L +#define ERROR_EA_FILE_CORRUPT 276L +#define ERROR_EA_TABLE_FULL 277L +#define ERROR_INVALID_EA_HANDLE 278L +#define ERROR_EAS_NOT_SUPPORTED 282L +#define ERROR_NOT_OWNER 288L +#define ERROR_TOO_MANY_POSTS 298L +#define ERROR_PARTIAL_COPY 299L +#define ERROR_OPLOCK_NOT_GRANTED 300L +#define ERROR_INVALID_OPLOCK_PROTOCOL 301L +#define ERROR_DISK_TOO_FRAGMENTED 302L +#define ERROR_DELETE_PENDING 303L +#define ERROR_MR_MID_NOT_FOUND 317L +#define ERROR_SCOPE_NOT_FOUND 318L +#define ERROR_INVALID_ADDRESS 487L +#define ERROR_ARITHMETIC_OVERFLOW 534L +#define ERROR_PIPE_CONNECTED 535L +#define ERROR_PIPE_LISTENING 536L +#define ERROR_EA_ACCESS_DENIED 994L +#define ERROR_OPERATION_ABORTED 995L +#define ERROR_IO_INCOMPLETE 996L +#define ERROR_IO_PENDING 997L +#define ERROR_NOACCESS 998L +#define ERROR_SWAPERROR 999L +#define ERROR_STACK_OVERFLOW 1001L +#define ERROR_INVALID_MESSAGE 1002L +#define ERROR_CAN_NOT_COMPLETE 1003L +#define ERROR_INVALID_FLAGS 1004L +#define ERROR_UNRECOGNIZED_VOLUME 1005L +#define ERROR_FILE_INVALID 1006L +#define ERROR_FULLSCREEN_MODE 1007L +#define ERROR_NO_TOKEN 1008L +#define ERROR_BADDB 1009L +#define ERROR_BADKEY 1010L +#define ERROR_CANTOPEN 1011L +#define ERROR_CANTREAD 1012L +#define ERROR_CANTWRITE 1013L +#define ERROR_REGISTRY_RECOVERED 1014L +#define ERROR_REGISTRY_CORRUPT 1015L +#define ERROR_REGISTRY_IO_FAILED 1016L +#define ERROR_NOT_REGISTRY_FILE 1017L +#define ERROR_KEY_DELETED 1018L +#define ERROR_NO_LOG_SPACE 1019L +#define ERROR_KEY_HAS_CHILDREN 1020L +#define ERROR_CHILD_MUST_BE_VOLATILE 1021L +#define ERROR_NOTIFY_ENUM_DIR 1022L +#define ERROR_DEPENDENT_SERVICES_RUNNING 1051L +#define ERROR_INVALID_SERVICE_CONTROL 1052L +#define ERROR_SERVICE_REQUEST_TIMEOUT 1053L +#define ERROR_SERVICE_NO_THREAD 1054L +#define ERROR_SERVICE_DATABASE_LOCKED 1055L +#define ERROR_SERVICE_ALREADY_RUNNING 1056L +#define ERROR_INVALID_SERVICE_ACCOUNT 1057L +#define ERROR_SERVICE_DISABLED 1058L +#define ERROR_CIRCULAR_DEPENDENCY 1059L +#define ERROR_SERVICE_DOES_NOT_EXIST 1060L +#define ERROR_SERVICE_CANNOT_ACCEPT_CTRL 1061L +#define ERROR_SERVICE_NOT_ACTIVE 1062L +#define ERROR_FAILED_SERVICE_CONTROLLER_CONNECT 1063L +#define ERROR_EXCEPTION_IN_SERVICE 1064L +#define ERROR_DATABASE_DOES_NOT_EXIST 1065L +#define ERROR_SERVICE_SPECIFIC_ERROR 1066L +#define ERROR_PROCESS_ABORTED 1067L +#define ERROR_SERVICE_DEPENDENCY_FAIL 1068L +#define ERROR_SERVICE_LOGON_FAILED 1069L +#define ERROR_SERVICE_START_HANG 1070L +#define ERROR_INVALID_SERVICE_LOCK 1071L +#define ERROR_SERVICE_MARKED_FOR_DELETE 1072L +#define ERROR_SERVICE_EXISTS 1073L +#define ERROR_ALREADY_RUNNING_LKG 1074L +#define ERROR_SERVICE_DEPENDENCY_DELETED 1075L +#define ERROR_BOOT_ALREADY_ACCEPTED 1076L +#define ERROR_SERVICE_NEVER_STARTED 1077L +#define ERROR_DUPLICATE_SERVICE_NAME 1078L +#define ERROR_DIFFERENT_SERVICE_ACCOUNT 1079L +#define ERROR_CANNOT_DETECT_DRIVER_FAILURE 1080L +#define ERROR_CANNOT_DETECT_PROCESS_ABORT 1081L +#define ERROR_NO_RECOVERY_PROGRAM 1082L +#define ERROR_SERVICE_NOT_IN_EXE 1083L +#define ERROR_NOT_SAFEBOOT_SERVICE 1084L +#define ERROR_END_OF_MEDIA 1100L +#define ERROR_FILEMARK_DETECTED 1101L +#define ERROR_BEGINNING_OF_MEDIA 1102L +#define ERROR_SETMARK_DETECTED 1103L +#define ERROR_NO_DATA_DETECTED 1104L +#define ERROR_PARTITION_FAILURE 1105L +#define ERROR_INVALID_BLOCK_LENGTH 1106L +#define ERROR_DEVICE_NOT_PARTITIONED 1107L +#define ERROR_UNABLE_TO_LOCK_MEDIA 1108L +#define ERROR_UNABLE_TO_UNLOAD_MEDIA 1109L +#define ERROR_MEDIA_CHANGED 1110L +#define ERROR_BUS_RESET 1111L +#define ERROR_NO_MEDIA_IN_DRIVE 1112L +#define ERROR_NO_UNICODE_TRANSLATION 1113L +#define ERROR_DLL_INIT_FAILED 1114L +#define ERROR_SHUTDOWN_IN_PROGRESS 1115L +#define ERROR_NO_SHUTDOWN_IN_PROGRESS 1116L +#define ERROR_IO_DEVICE 1117L +#define ERROR_SERIAL_NO_DEVICE 1118L +#define ERROR_IRQ_BUSY 1119L +#define ERROR_MORE_WRITES 1120L +#define ERROR_COUNTER_TIMEOUT 1121L +#define ERROR_FLOPPY_ID_MARK_NOT_FOUND 1122L +#define ERROR_FLOPPY_WRONG_CYLINDER 1123L +#define ERROR_FLOPPY_UNKNOWN_ERROR 1124L +#define ERROR_FLOPPY_BAD_REGISTERS 1125L +#define ERROR_DISK_RECALIBRATE_FAILED 1126L +#define ERROR_DISK_OPERATION_FAILED 1127L +#define ERROR_DISK_RESET_FAILED 1128L +#define ERROR_EOM_OVERFLOW 1129L +#define ERROR_NOT_ENOUGH_SERVER_MEMORY 1130L +#define ERROR_POSSIBLE_DEADLOCK 1131L +#define ERROR_MAPPED_ALIGNMENT 1132L +#define ERROR_SET_POWER_STATE_VETOED 1140L +#define ERROR_SET_POWER_STATE_FAILED 1141L +#define ERROR_TOO_MANY_LINKS 1142L +#define ERROR_OLD_WIN_VERSION 1150L +#define ERROR_APP_WRONG_OS 1151L +#define ERROR_SINGLE_INSTANCE_APP 1152L +#define ERROR_RMODE_APP 1153L +#define ERROR_INVALID_DLL 1154L +#define ERROR_NO_ASSOCIATION 1155L +#define ERROR_DDE_FAIL 1156L +#define ERROR_DLL_NOT_FOUND 1157L +#define ERROR_NO_MORE_USER_HANDLES 1158L +#define ERROR_MESSAGE_SYNC_ONLY 1159L +#define ERROR_SOURCE_ELEMENT_EMPTY 1160L +#define ERROR_DESTINATION_ELEMENT_FULL 1161L +#define ERROR_ILLEGAL_ELEMENT_ADDRESS 1162L +#define ERROR_MAGAZINE_NOT_PRESENT 1163L +#define ERROR_DEVICE_REINITIALIZATION_NEEDED 1164L +#define ERROR_DEVICE_REQUIRES_CLEANING 1165L +#define ERROR_DEVICE_DOOR_OPEN 1166L +#define ERROR_DEVICE_NOT_CONNECTED 1167L +#define ERROR_NOT_FOUND 1168L +#define ERROR_NO_MATCH 1169L +#define ERROR_SET_NOT_FOUND 1170L +#define ERROR_POINT_NOT_FOUND 1171L +#define ERROR_NO_TRACKING_SERVICE 1172L +#define ERROR_NO_VOLUME_ID 1173L +#define ERROR_UNABLE_TO_REMOVE_REPLACED 1175L +#define ERROR_UNABLE_TO_MOVE_REPLACEMENT 1176L +#define ERROR_UNABLE_TO_MOVE_REPLACEMENT_2 1177L +#define ERROR_JOURNAL_DELETE_IN_PROGRESS 1178L +#define ERROR_JOURNAL_NOT_ACTIVE 1179L +#define ERROR_POTENTIAL_FILE_FOUND 1180L +#define ERROR_JOURNAL_ENTRY_DELETED 1181L +#define ERROR_BAD_DEVICE 1200L +#define ERROR_CONNECTION_UNAVAIL 1201L +#define ERROR_DEVICE_ALREADY_REMEMBERED 1202L +#define ERROR_NO_NET_OR_BAD_PATH 1203L +#define ERROR_BAD_PROVIDER 1204L +#define ERROR_CANNOT_OPEN_PROFILE 1205L +#define ERROR_BAD_PROFILE 1206L +#define ERROR_NOT_CONTAINER 1207L +#define ERROR_EXTENDED_ERROR 1208L +#define ERROR_INVALID_GROUPNAME 1209L +#define ERROR_INVALID_COMPUTERNAME 1210L +#define ERROR_INVALID_EVENTNAME 1211L +#define ERROR_INVALID_DOMAINNAME 1212L +#define ERROR_INVALID_SERVICENAME 1213L +#define ERROR_INVALID_NETNAME 1214L +#define ERROR_INVALID_SHARENAME 1215L +#define ERROR_INVALID_PASSWORDNAME 1216L +#define ERROR_INVALID_MESSAGENAME 1217L +#define ERROR_INVALID_MESSAGEDEST 1218L +#define ERROR_SESSION_CREDENTIAL_CONFLICT 1219L +#define ERROR_REMOTE_SESSION_LIMIT_EXCEEDED 1220L +#define ERROR_DUP_DOMAINNAME 1221L +#define ERROR_NO_NETWORK 1222L +#define ERROR_CANCELLED 1223L +#define ERROR_USER_MAPPED_FILE 1224L +#define ERROR_CONNECTION_REFUSED 1225L +#define ERROR_GRACEFUL_DISCONNECT 1226L +#define ERROR_ADDRESS_ALREADY_ASSOCIATED 1227L +#define ERROR_ADDRESS_NOT_ASSOCIATED 1228L +#define ERROR_CONNECTION_INVALID 1229L +#define ERROR_CONNECTION_ACTIVE 1230L +#define ERROR_NETWORK_UNREACHABLE 1231L +#define ERROR_HOST_UNREACHABLE 1232L +#define ERROR_PROTOCOL_UNREACHABLE 1233L +#define ERROR_PORT_UNREACHABLE 1234L +#define ERROR_REQUEST_ABORTED 1235L +#define ERROR_CONNECTION_ABORTED 1236L +#define ERROR_RETRY 1237L +#define ERROR_CONNECTION_COUNT_LIMIT 1238L +#define ERROR_LOGIN_TIME_RESTRICTION 1239L +#define ERROR_LOGIN_WKSTA_RESTRICTION 1240L +#define ERROR_INCORRECT_ADDRESS 1241L +#define ERROR_ALREADY_REGISTERED 1242L +#define ERROR_SERVICE_NOT_FOUND 1243L +#define ERROR_NOT_AUTHENTICATED 1244L +#define ERROR_NOT_LOGGED_ON 1245L +#define ERROR_CONTINUE 1246L +#define ERROR_ALREADY_INITIALIZED 1247L +#define ERROR_NO_MORE_DEVICES 1248L +#define ERROR_NO_SUCH_SITE 1249L +#define ERROR_DOMAIN_CONTROLLER_EXISTS 1250L +#define ERROR_ONLY_IF_CONNECTED 1251L +#define ERROR_OVERRIDE_NOCHANGES 1252L +#define ERROR_BAD_USER_PROFILE 1253L +#define ERROR_NOT_SUPPORTED_ON_SBS 1254L +#define ERROR_SERVER_SHUTDOWN_IN_PROGRESS 1255L +#define ERROR_HOST_DOWN 1256L +#define ERROR_NON_ACCOUNT_SID 1257L +#define ERROR_NON_DOMAIN_SID 1258L +#define ERROR_APPHELP_BLOCK 1259L +#define ERROR_ACCESS_DISABLED_BY_POLICY 1260L +#define ERROR_REG_NAT_CONSUMPTION 1261L +#define ERROR_CSCSHARE_OFFLINE 1262L +#define ERROR_PKINIT_FAILURE 1263L +#define ERROR_SMARTCARD_SUBSYSTEM_FAILURE 1264L +#define ERROR_DOWNGRADE_DETECTED 1265L +#define SEC_E_SMARTCARD_CERT_REVOKED 1266L +#define SEC_E_ISSUING_CA_UNTRUSTED 1267L +#define SEC_E_REVOCATION_OFFLINE_C 1268L +#define SEC_E_PKINIT_CLIENT_FAILUR 1269L +#define SEC_E_SMARTCARD_CERT_EXPIRED 1270L +#define ERROR_MACHINE_LOCKED 1271L +#define ERROR_CALLBACK_SUPPLIED_INVALID_DATA 1273L +#define ERROR_SYNC_FOREGROUND_REFRESH_REQUIRED 1274L +#define ERROR_DRIVER_BLOCKED 1275L +#define ERROR_INVALID_IMPORT_OF_NON_DLL 1276L +#define ERROR_ACCESS_DISABLED_WEBBLADE 1277L +#define ERROR_ACCESS_DISABLED_WEBBLADE_TAMPER 1278L +#define ERROR_RECOVERY_FAILURE 1279L +#define ERROR_ALREADY_FIBER 1280L +#define ERROR_ALREADY_THREAD 1281L +#define ERROR_STACK_BUFFER_OVERRUN 1282L +#define ERROR_PARAMETER_QUOTA_EXCEEDED 1283L +#define ERROR_DEBUGGER_INACTIVE 1284L +#define ERROR_NOT_ALL_ASSIGNED 1300L +#define ERROR_SOME_NOT_MAPPED 1301L +#define ERROR_NO_QUOTAS_FOR_ACCOUNT 1302L +#define ERROR_LOCAL_USER_SESSION_KEY 1303L +#define ERROR_NULL_LM_PASSWORD 1304L +#define ERROR_UNKNOWN_REVISION 1305L +#define ERROR_REVISION_MISMATCH 1306L +#define ERROR_INVALID_OWNER 1307L +#define ERROR_INVALID_PRIMARY_GROUP 1308L +#define ERROR_NO_IMPERSONATION_TOKEN 1309L +#define ERROR_CANT_DISABLE_MANDATORY 1310L +#define ERROR_NO_LOGON_SERVERS 1311L +#define ERROR_NO_SUCH_LOGON_SESSION 1312L +#define ERROR_NO_SUCH_PRIVILEGE 1313L +#define ERROR_PRIVILEGE_NOT_HELD 1314L +#define ERROR_INVALID_ACCOUNT_NAME 1315L +#define ERROR_USER_EXISTS 1316L +#define ERROR_NO_SUCH_USER 1317L +#define ERROR_GROUP_EXISTS 1318L +#define ERROR_NO_SUCH_GROUP 1319L +#define ERROR_MEMBER_IN_GROUP 1320L +#define ERROR_MEMBER_NOT_IN_GROUP 1321L +#define ERROR_LAST_ADMIN 1322L +#define ERROR_WRONG_PASSWORD 1323L +#define ERROR_ILL_FORMED_PASSWORD 1324L +#define ERROR_PASSWORD_RESTRICTION 1325L +#define ERROR_LOGON_FAILURE 1326L +#define ERROR_ACCOUNT_RESTRICTION 1327L +#define ERROR_INVALID_LOGON_HOURS 1328L +#define ERROR_INVALID_WORKSTATION 1329L +#define ERROR_PASSWORD_EXPIRED 1330L +#define ERROR_ACCOUNT_DISABLED 1331L +#define ERROR_NONE_MAPPED 1332L +#define ERROR_TOO_MANY_LUIDS_REQUESTED 1333L +#define ERROR_LUIDS_EXHAUSTED 1334L +#define ERROR_INVALID_SUB_AUTHORITY 1335L +#define ERROR_INVALID_ACL 1336L +#define ERROR_INVALID_SID 1337L +#define ERROR_INVALID_SECURITY_DESCR 1338L +#define ERROR_BAD_INHERITANCE_ACL 1340L +#define ERROR_SERVER_DISABLED 1341L +#define ERROR_SERVER_NOT_DISABLED 1342L +#define ERROR_INVALID_ID_AUTHORITY 1343L +#define ERROR_ALLOTTED_SPACE_EXCEEDED 1344L +#define ERROR_INVALID_GROUP_ATTRIBUTES 1345L +#define ERROR_BAD_IMPERSONATION_LEVEL 1346L +#define ERROR_CANT_OPEN_ANONYMOUS 1347L +#define ERROR_BAD_VALIDATION_CLASS 1348L +#define ERROR_BAD_TOKEN_TYPE 1349L +#define ERROR_NO_SECURITY_ON_OBJECT 1350L +#define ERROR_CANT_ACCESS_DOMAIN_INFO 1351L +#define ERROR_INVALID_SERVER_STATE 1352L +#define ERROR_INVALID_DOMAIN_STATE 1353L +#define ERROR_INVALID_DOMAIN_ROLE 1354L +#define ERROR_NO_SUCH_DOMAIN 1355L +#define ERROR_DOMAIN_EXISTS 1356L +#define ERROR_DOMAIN_LIMIT_EXCEEDED 1357L +#define ERROR_INTERNAL_DB_CORRUPTION 1358L +#define ERROR_INTERNAL_ERROR 1359L +#define ERROR_GENERIC_NOT_MAPPED 1360L +#define ERROR_BAD_DESCRIPTOR_FORMAT 1361L +#define ERROR_NOT_LOGON_PROCESS 1362L +#define ERROR_LOGON_SESSION_EXISTS 1363L +#define ERROR_NO_SUCH_PACKAGE 1364L +#define ERROR_BAD_LOGON_SESSION_STATE 1365L +#define ERROR_LOGON_SESSION_COLLISION 1366L +#define ERROR_INVALID_LOGON_TYPE 1367L +#define ERROR_CANNOT_IMPERSONATE 1368L +#define ERROR_RXACT_INVALID_STATE 1369L +#define ERROR_RXACT_COMMIT_FAILURE 1370L +#define ERROR_SPECIAL_ACCOUNT 1371L +#define ERROR_SPECIAL_GROUP 1372L +#define ERROR_SPECIAL_USER 1373L +#define ERROR_MEMBERS_PRIMARY_GROUP 1374L +#define ERROR_TOKEN_ALREADY_IN_USE 1375L +#define ERROR_NO_SUCH_ALIAS 1376L +#define ERROR_MEMBER_NOT_IN_ALIAS 1377L +#define ERROR_MEMBER_IN_ALIAS 1378L +#define ERROR_ALIAS_EXISTS 1379L +#define ERROR_LOGON_NOT_GRANTED 1380L +#define ERROR_TOO_MANY_SECRETS 1381L +#define ERROR_SECRET_TOO_LONG 1382L +#define ERROR_INTERNAL_DB_ERROR 1383L +#define ERROR_TOO_MANY_CONTEXT_IDS 1384L +#define ERROR_LOGON_TYPE_NOT_GRANTED 1385L +#define ERROR_NT_CROSS_ENCRYPTION_REQUIRED 1386L +#define ERROR_NO_SUCH_MEMBER 1387L +#define ERROR_INVALID_MEMBER 1388L +#define ERROR_TOO_MANY_SIDS 1389L +#define ERROR_LM_CROSS_ENCRYPTION_REQUIRED 1390L +#define ERROR_NO_INHERITANCE 1391L +#define ERROR_FILE_CORRUPT 1392L +#define ERROR_DISK_CORRUPT 1393L +#define ERROR_NO_USER_SESSION_KEY 1394L +#define ERROR_LICENSE_QUOTA_EXCEEDED 1395L +#define ERROR_WRONG_TARGET_NAME 1396L +#define ERROR_MUTUAL_AUTH_FAILED 1397L +#define ERROR_TIME_SKEW 1398L +#define ERROR_CURRENT_DOMAIN_NOT_ALLOWED 1399L +#define ERROR_INVALID_WINDOW_HANDLE 1400L +#define ERROR_INVALID_MENU_HANDLE 1401L +#define ERROR_INVALID_CURSOR_HANDLE 1402L +#define ERROR_INVALID_ACCEL_HANDLE 1403L +#define ERROR_INVALID_HOOK_HANDLE 1404L +#define ERROR_INVALID_DWP_HANDLE 1405L +#define ERROR_TLW_WITH_WSCHILD 1406L +#define ERROR_CANNOT_FIND_WND_CLASS 1407L +#define ERROR_WINDOW_OF_OTHER_THREAD 1408L +#define ERROR_HOTKEY_ALREADY_REGISTERED 1409L +#define ERROR_CLASS_ALREADY_EXISTS 1410L +#define ERROR_CLASS_DOES_NOT_EXIST 1411L +#define ERROR_CLASS_HAS_WINDOWS 1412L +#define ERROR_INVALID_INDEX 1413L +#define ERROR_INVALID_ICON_HANDLE 1414L +#define ERROR_PRIVATE_DIALOG_INDEX 1415L +#define ERROR_LISTBOX_ID_NOT_FOUND 1416L +#define ERROR_NO_WILDCARD_CHARACTERS 1417L +#define ERROR_CLIPBOARD_NOT_OPEN 1418L +#define ERROR_HOTKEY_NOT_REGISTERED 1419L +#define ERROR_WINDOW_NOT_DIALOG 1420L +#define ERROR_CONTROL_ID_NOT_FOUND 1421L +#define ERROR_INVALID_COMBOBOX_MESSAGE 1422L +#define ERROR_WINDOW_NOT_COMBOBOX 1423L +#define ERROR_INVALID_EDIT_HEIGHT 1424L +#define ERROR_DC_NOT_FOUND 1425L +#define ERROR_INVALID_HOOK_FILTER 1426L +#define ERROR_INVALID_FILTER_PROC 1427L +#define ERROR_HOOK_NEEDS_HMOD 1428L +#define ERROR_GLOBAL_ONLY_HOOK 1429L +#define ERROR_JOURNAL_HOOK_SET 1430L +#define ERROR_HOOK_NOT_INSTALLED 1431L +#define ERROR_INVALID_LB_MESSAGE 1432L +#define ERROR_SETCOUNT_ON_BAD_LB 1433L +#define ERROR_LB_WITHOUT_TABSTOPS 1434L +#define ERROR_DESTROY_OBJECT_OF_OTHER_THREAD 1435L +#define ERROR_CHILD_WINDOW_MENU 1436L +#define ERROR_NO_SYSTEM_MENU 1437L +#define ERROR_INVALID_MSGBOX_STYLE 1438L +#define ERROR_INVALID_SPI_VALUE 1439L +#define ERROR_SCREEN_ALREADY_LOCKED 1440L +#define ERROR_HWNDS_HAVE_DIFF_PARENT 1441L +#define ERROR_NOT_CHILD_WINDOW 1442L +#define ERROR_INVALID_GW_COMMAND 1443L +#define ERROR_INVALID_THREAD_ID 1444L +#define ERROR_NON_MDICHILD_WINDOW 1445L +#define ERROR_POPUP_ALREADY_ACTIVE 1446L +#define ERROR_NO_SCROLLBARS 1447L +#define ERROR_INVALID_SCROLLBAR_RANGE 1448L +#define ERROR_INVALID_SHOWWIN_COMMAND 1449L +#define ERROR_NO_SYSTEM_RESOURCES 1450L +#define ERROR_NONPAGED_SYSTEM_RESOURCES 1451L +#define ERROR_PAGED_SYSTEM_RESOURCES 1452L +#define ERROR_WORKING_SET_QUOTA 1453L +#define ERROR_PAGEFILE_QUOTA 1454L +#define ERROR_COMMITMENT_LIMIT 1455L +#define ERROR_MENU_ITEM_NOT_FOUND 1456L +#define ERROR_INVALID_KEYBOARD_HANDLE 1457L +#define ERROR_HOOK_TYPE_NOT_ALLOWED 1458L +#define ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION 1459L +#define ERROR_TIMEOUT 1460L +#define ERROR_INVALID_MONITOR_HANDLE 1461L +#define ERROR_EVENTLOG_FILE_CORRUPT 1500L +#define ERROR_EVENTLOG_CANT_START 1501L +#define ERROR_LOG_FILE_FULL 1502L +#define ERROR_EVENTLOG_FILE_CHANGED 1503L +#define ERROR_INSTALL_SERVICE_FAILURE 1601L +#define ERROR_INSTALL_USEREXIT 1602L +#define ERROR_INSTALL_FAILURE 1603L +#define ERROR_INSTALL_SUSPEND 1604L +#define ERROR_UNKNOWN_PRODUCT 1605L +#define ERROR_UNKNOWN_FEATURE 1606L +#define ERROR_UNKNOWN_COMPONENT 1607L +#define ERROR_UNKNOWN_PROPERTY 1608L +#define ERROR_INVALID_HANDLE_STATE 1609L +#define ERROR_BAD_CONFIGURATION 1610L +#define ERROR_INDEX_ABSENT 1611L +#define ERROR_INSTALL_SOURCE_ABSENT 1612L +#define ERROR_INSTALL_PACKAGE_VERSION 1613L +#define ERROR_PRODUCT_UNINSTALLED 1614L +#define ERROR_BAD_QUERY_SYNTAX 1615L +#define ERROR_INVALID_FIELD 1616L +#define ERROR_DEVICE_REMOVED 1617L +#define ERROR_INSTALL_ALREADY_RUNNING 1618L +#define ERROR_INSTALL_PACKAGE_OPEN_FAILED 1619L +#define ERROR_INSTALL_PACKAGE_INVALID 1620L +#define ERROR_INSTALL_UI_FAILURE 1621L +#define ERROR_INSTALL_LOG_FAILURE 1622L +#define ERROR_INSTALL_LANGUAGE_UNSUPPORTED 1623L +#define ERROR_INSTALL_TRANSFORM_FAILURE 1624L +#define ERROR_INSTALL_PACKAGE_REJECTED 1625L +#define ERROR_FUNCTION_NOT_CALLED 1626L +#define ERROR_FUNCTION_FAILED 1627L +#define ERROR_INVALID_TABLE 1628L +#define ERROR_DATATYPE_MISMATCH 1629L +#define ERROR_UNSUPPORTED_TYPE 1630L +#define ERROR_CREATE_FAILED 1631L +#define ERROR_INSTALL_TEMP_UNWRITABLE 1632L +#define ERROR_INSTALL_PLATFORM_UNSUPPORTED 1633L +#define ERROR_INSTALL_NOTUSED 1634L +#define ERROR_PATCH_PACKAGE_OPEN_FAILED 1635L +#define ERROR_PATCH_PACKAGE_INVALID 1636L +#define ERROR_PATCH_PACKAGE_UNSUPPORTED 1637L +#define ERROR_PRODUCT_VERSION 1638L +#define ERROR_INVALID_COMMAND_LINE 1639L +#define ERROR_INSTALL_REMOTE_DISALLOWED 1640L +#define ERROR_SUCCESS_REBOOT_INITIATED 1641L +#define ERROR_PATCH_TARGET_NOT_FOUND 1642L +#define ERROR_PATCH_PACKAGE_REJECTED 1643L +#define ERROR_INSTALL_TRANSFORM_REJECTED 1644L +#define ERROR_INSTALL_REMOTE_PROHIBITED 1645L +#define RPC_S_INVALID_STRING_BINDING 1700L +#define RPC_S_WRONG_KIND_OF_BINDING 1701L +#define RPC_S_INVALID_BINDING 1702L +#define RPC_S_PROTSEQ_NOT_SUPPORTED 1703L +#define RPC_S_INVALID_RPC_PROTSEQ 1704L +#define RPC_S_INVALID_STRING_UUID 1705L +#define RPC_S_INVALID_ENDPOINT_FORMAT 1706L +#define RPC_S_INVALID_NET_ADDR 1707L +#define RPC_S_NO_ENDPOINT_FOUND 1708L +#define RPC_S_INVALID_TIMEOUT 1709L +#define RPC_S_OBJECT_NOT_FOUND 1710L +#define RPC_S_ALREADY_REGISTERED 1711L +#define RPC_S_TYPE_ALREADY_REGISTERED 1712L +#define RPC_S_ALREADY_LISTENING 1713L +#define RPC_S_NO_PROTSEQS_REGISTERED 1714L +#define RPC_S_NOT_LISTENING 1715L +#define RPC_S_UNKNOWN_MGR_TYPE 1716L +#define RPC_S_UNKNOWN_IF 1717L +#define RPC_S_NO_BINDINGS 1718L +#define RPC_S_NO_PROTSEQS 1719L +#define RPC_S_CANT_CREATE_ENDPOINT 1720L +#define RPC_S_OUT_OF_RESOURCES 1721L +#define RPC_S_SERVER_UNAVAILABLE 1722L +#define RPC_S_SERVER_TOO_BUSY 1723L +#define RPC_S_INVALID_NETWORK_OPTIONS 1724L +#define RPC_S_NO_CALL_ACTIVE 1725L +#define RPC_S_CALL_FAILED 1726L +#define RPC_S_CALL_FAILED_DNE 1727L +#define RPC_S_PROTOCOL_ERROR 1728L +#define RPC_S_UNSUPPORTED_TRANS_SYN 1730L +#define RPC_S_UNSUPPORTED_TYPE 1732L +#define RPC_S_INVALID_TAG 1733L +#define RPC_S_INVALID_BOUND 1734L +#define RPC_S_NO_ENTRY_NAME 1735L +#define RPC_S_INVALID_NAME_SYNTAX 1736L +#define RPC_S_UNSUPPORTED_NAME_SYNTAX 1737L +#define RPC_S_UUID_NO_ADDRESS 1739L +#define RPC_S_DUPLICATE_ENDPOINT 1740L +#define RPC_S_UNKNOWN_AUTHN_TYPE 1741L +#define RPC_S_MAX_CALLS_TOO_SMALL 1742L +#define RPC_S_STRING_TOO_LONG 1743L +#define RPC_S_PROTSEQ_NOT_FOUND 1744L +#define RPC_S_PROCNUM_OUT_OF_RANGE 1745L +#define RPC_S_BINDING_HAS_NO_AUTH 1746L +#define RPC_S_UNKNOWN_AUTHN_SERVICE 1747L +#define RPC_S_UNKNOWN_AUTHN_LEVEL 1748L +#define RPC_S_INVALID_AUTH_IDENTITY 1749L +#define RPC_S_UNKNOWN_AUTHZ_SERVICE 1750L +#define EPT_S_INVALID_ENTRY 1751L +#define EPT_S_CANT_PERFORM_OP 1752L +#define EPT_S_NOT_REGISTERED 1753L +#define RPC_S_NOTHING_TO_EXPORT 1754L +#define RPC_S_INCOMPLETE_NAME 1755L +#define RPC_S_INVALID_VERS_OPTION 1756L +#define RPC_S_NO_MORE_MEMBERS 1757L +#define RPC_S_NOT_ALL_OBJS_UNEXPORTED 1758L +#define RPC_S_INTERFACE_NOT_FOUND 1759L +#define RPC_S_ENTRY_ALREADY_EXISTS 1760L +#define RPC_S_ENTRY_NOT_FOUND 1761L +#define RPC_S_NAME_SERVICE_UNAVAILABLE 1762L +#define RPC_S_INVALID_NAF_ID 1763L +#define RPC_S_CANNOT_SUPPORT 1764L +#define RPC_S_NO_CONTEXT_AVAILABLE 1765L +#define RPC_S_INTERNAL_ERROR 1766L +#define RPC_S_ZERO_DIVIDE 1767L +#define RPC_S_ADDRESS_ERROR 1768L +#define RPC_S_FP_DIV_ZERO 1769L +#define RPC_S_FP_UNDERFLOW 1770L +#define RPC_S_FP_OVERFLOW 1771L +#define RPC_X_NO_MORE_ENTRIES 1772L +#define RPC_X_SS_CHAR_TRANS_OPEN_FAIL 1773L +#define RPC_X_SS_CHAR_TRANS_SHORT_FILE 1774L +#define RPC_X_SS_IN_NULL_CONTEXT 1775L +#define RPC_X_SS_CONTEXT_DAMAGED 1777L +#define RPC_X_SS_HANDLES_MISMATCH 1778L +#define RPC_X_SS_CANNOT_GET_CALL_HANDLE 1779L +#define RPC_X_NULL_REF_POINTER 1780L +#define RPC_X_ENUM_VALUE_OUT_OF_RANGE 1781L +#define RPC_X_BYTE_COUNT_TOO_SMALL 1782L +#define RPC_X_BAD_STUB_DATA 1783L +#define ERROR_INVALID_USER_BUFFER 1784L +#define ERROR_UNRECOGNIZED_MEDIA 1785L +#define ERROR_NO_TRUST_LSA_SECRET 1786L +#define ERROR_NO_TRUST_SAM_ACCOUNT 1787L +#define ERROR_TRUSTED_DOMAIN_FAILURE 1788L +#define ERROR_TRUSTED_RELATIONSHIP_FAILURE 1789L +#define ERROR_TRUST_FAILURE 1790L +#define RPC_S_CALL_IN_PROGRESS 1791L +#define ERROR_NETLOGON_NOT_STARTED 1792L +#define ERROR_ACCOUNT_EXPIRED 1793L +#define ERROR_REDIRECTOR_HAS_OPEN_HANDLES 1794L +#define ERROR_PRINTER_DRIVER_ALREADY_INSTALLED 1795L +#define ERROR_UNKNOWN_PORT 1796L +#define ERROR_UNKNOWN_PRINTER_DRIVER 1797L +#define ERROR_UNKNOWN_PRINTPROCESSOR 1798L +#define ERROR_INVALID_SEPARATOR_FILE 1799L +#define ERROR_INVALID_PRIORITY 1800L +#define ERROR_INVALID_PRINTER_NAME 1801L +#define ERROR_PRINTER_ALREADY_EXISTS 1802L +#define ERROR_INVALID_PRINTER_COMMAND 1803L +#define ERROR_INVALID_DATATYPE 1804L +#define ERROR_INVALID_ENVIRONMENT 1805L +#define RPC_S_NO_MORE_BINDINGS 1806L +#define ERROR_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT 1807L +#define ERROR_NOLOGON_WORKSTATION_TRUST_ACCOUNT 1808L +#define ERROR_NOLOGON_SERVER_TRUST_ACCOUNT 1809L +#define ERROR_DOMAIN_TRUST_INCONSISTENT 1810L +#define ERROR_SERVER_HAS_OPEN_HANDLES 1811L +#define ERROR_RESOURCE_DATA_NOT_FOUND 1812L +#define ERROR_RESOURCE_TYPE_NOT_FOUND 1813L +#define ERROR_RESOURCE_NAME_NOT_FOUND 1814L +#define ERROR_RESOURCE_LANG_NOT_FOUND 1815L +#define ERROR_NOT_ENOUGH_QUOTA 1816L +#define RPC_S_NO_INTERFACES 1817L +#define RPC_S_CALL_CANCELLED 1818L +#define RPC_S_BINDING_INCOMPLETE 1819L +#define RPC_S_COMM_FAILURE 1820L +#define RPC_S_UNSUPPORTED_AUTHN_LEVEL 1821L +#define RPC_S_NO_PRINC_NAME 1822L +#define RPC_S_NOT_RPC_ERROR 1823L +#define RPC_S_UUID_LOCAL_ONLY 1824L +#define RPC_S_SEC_PKG_ERROR 1825L +#define RPC_S_NOT_CANCELLED 1826L +#define RPC_X_INVALID_ES_ACTION 1827L +#define RPC_X_WRONG_ES_VERSION 1828L +#define RPC_X_WRONG_STUB_VERSION 1829L +#define RPC_X_INVALID_PIPE_OBJECT 1830L +#define RPC_X_WRONG_PIPE_ORDER 1831L +#define RPC_X_WRONG_PIPE_VERSION 1832L +#define RPC_S_GROUP_MEMBER_NOT_FOUND 1898L +#define EPT_S_CANT_CREATE 1899L +#define RPC_S_INVALID_OBJECT 1900L +#define ERROR_INVALID_TIME 1901L +#define ERROR_INVALID_FORM_NAME 1902L +#define ERROR_INVALID_FORM_SIZE 1903L +#define ERROR_ALREADY_WAITING 1904L +#define ERROR_PRINTER_DELETED 1905L +#define ERROR_INVALID_PRINTER_STATE 1906L +#define ERROR_PASSWORD_MUST_CHANGE 1907L +#define ERROR_DOMAIN_CONTROLLER_NOT_FOUND 1908L +#define ERROR_ACCOUNT_LOCKED_OUT 1909L +#define OR_INVALID_OXID 1910L +#define OR_INVALID_OID 1911L +#define OR_INVALID_SET 1912L +#define RPC_S_SEND_INCOMPLETE 1913L +#define RPC_S_INVALID_ASYNC_HANDLE 1914L +#define RPC_S_INVALID_ASYNC_CALL 1915L +#define RPC_X_PIPE_CLOSED 1916L +#define RPC_X_PIPE_DISCIPLINE_ERROR 1917L +#define RPC_X_PIPE_EMPTY 1918L +#define ERROR_NO_SITENAME 1919L +#define ERROR_CANT_ACCESS_FILE 1920L +#define ERROR_CANT_RESOLVE_FILENAME 1921L +#define RPC_S_ENTRY_TYPE_MISMATCH 1922L +#define RPC_S_NOT_ALL_OBJS_EXPORTED 1923L +#define RPC_S_INTERFACE_NOT_EXPORTED 1924L +#define RPC_S_PROFILE_NOT_ADDED 1925L +#define RPC_S_PRF_ELT_NOT_ADDED 1926L +#define RPC_S_PRF_ELT_NOT_REMOVED 1927L +#define RPC_S_GRP_ELT_NOT_ADDED 1928L +#define RPC_S_GRP_ELT_NOT_REMOVED 1929L +#define ERROR_KM_DRIVER_BLOCKED 1930L +#define ERROR_CONTEXT_EXPIRED 1931L +#define ERROR_PER_USER_TRUST_QUOTA_EXCEEDED 1932L +#define ERROR_ALL_USER_TRUST_QUOTA_EXCEEDED 1933L +#define ERROR_USER_DELETE_TRUST_QUOTA_EXCEEDED 1934L +#define ERROR_INVALID_PIXEL_FORMAT 2000L +#define ERROR_BAD_DRIVER 2001L +#define ERROR_INVALID_WINDOW_STYLE 2002L +#define ERROR_METAFILE_NOT_SUPPORTED 2003L +#define ERROR_TRANSFORM_NOT_SUPPORTED 2004L +#define ERROR_CLIPPING_NOT_SUPPORTED 2005L +#define ERROR_INVALID_CMM 2010L +#define ERROR_INVALID_PROFILE 2011L +#define ERROR_TAG_NOT_FOUND 2012L +#define ERROR_TAG_NOT_PRESENT 2013L +#define ERROR_DUPLICATE_TAG 2014L +#define ERROR_PROFILE_NOT_ASSOCIATED_WITH_DEVICE 2015L +#define ERROR_PROFILE_NOT_FOUND 2016L +#define ERROR_INVALID_COLORSPACE 2017L +#define ERROR_ICM_NOT_ENABLED 2018L +#define ERROR_DELETING_ICM_XFORM 2019L +#define ERROR_INVALID_TRANSFORM 2020L +#define ERROR_COLORSPACE_MISMATCH 2021L +#define ERROR_INVALID_COLORINDEX 2022L +#define ERROR_CONNECTED_OTHER_PASSWORD 2108L +#define ERROR_CONNECTED_OTHER_PASSWORD_DEFAULT 2109L +#define ERROR_BAD_USERNAME 2202L +#define ERROR_NOT_CONNECTED 2250L +#define ERROR_OPEN_FILES 2401L +#define ERROR_ACTIVE_CONNECTIONS 2402L +#define ERROR_DEVICE_IN_USE 2404L +#define ERROR_UNKNOWN_PRINT_MONITOR 3000L +#define ERROR_PRINTER_DRIVER_IN_USE 3001L +#define ERROR_SPOOL_FILE_NOT_FOUND 3002L +#define ERROR_SPL_NO_STARTDOC 3003L +#define ERROR_SPL_NO_ADDJOB 3004L +#define ERROR_PRINT_PROCESSOR_ALREADY_INSTALLED 3005L +#define ERROR_PRINT_MONITOR_ALREADY_INSTALLED 3006L +#define ERROR_INVALID_PRINT_MONITOR 3007L +#define ERROR_PRINT_MONITOR_IN_USE 3008L +#define ERROR_PRINTER_HAS_JOBS_QUEUED 3009L +#define ERROR_SUCCESS_REBOOT_REQUIRED 3010L +#define ERROR_SUCCESS_RESTART_REQUIRED 3011L +#define ERROR_PRINTER_NOT_FOUND 3012L +#define ERROR_PRINTER_DRIVER_WARNED 3013L +#define ERROR_PRINTER_DRIVER_BLOCKED 3014L +#define ERROR_WINS_INTERNAL 4000L +#define ERROR_CAN_NOT_DEL_LOCAL_WINS 4001L +#define ERROR_STATIC_INIT 4002L +#define ERROR_INC_BACKUP 4003L +#define ERROR_FULL_BACKUP 4004L +#define ERROR_REC_NON_EXISTENT 4005L +#define ERROR_RPL_NOT_ALLOWED 4006L +#define ERROR_DHCP_ADDRESS_CONFLICT 4100L +#define ERROR_WMI_GUID_NOT_FOUND 4200L +#define ERROR_WMI_INSTANCE_NOT_FOUND 4201L +#define ERROR_WMI_ITEMID_NOT_FOUND 4202L +#define ERROR_WMI_TRY_AGAIN 4203L +#define ERROR_WMI_DP_NOT_FOUND 4204L +#define ERROR_WMI_UNRESOLVED_INSTANCE_REF 4205L +#define ERROR_WMI_ALREADY_ENABLED 4206L +#define ERROR_WMI_GUID_DISCONNECTED 4207L +#define ERROR_WMI_SERVER_UNAVAILABLE 4208L +#define ERROR_WMI_DP_FAILED 4209L +#define ERROR_WMI_INVALID_MOF 4210L +#define ERROR_WMI_INVALID_REGINFO 4211L +#define ERROR_WMI_ALREADY_DISABLED 4212L +#define ERROR_WMI_READ_ONLY 4213L +#define ERROR_WMI_SET_FAILURE 4214L +#define ERROR_INVALID_MEDIA 4300L +#define ERROR_INVALID_LIBRARY 4301L +#define ERROR_INVALID_MEDIA_POOL 4302L +#define ERROR_DRIVE_MEDIA_MISMATCH 4303L +#define ERROR_MEDIA_OFFLINE 4304L +#define ERROR_LIBRARY_OFFLINE 4305L +#define ERROR_EMPTY 4306L +#define ERROR_NOT_EMPTY 4307L +#define ERROR_MEDIA_UNAVAILABLE 4308L +#define ERROR_RESOURCE_DISABLED 4309L +#define ERROR_INVALID_CLEANER 4310L +#define ERROR_UNABLE_TO_CLEAN 4311L +#define ERROR_OBJECT_NOT_FOUND 4312L +#define ERROR_DATABASE_FAILURE 4313L +#define ERROR_DATABASE_FULL 4314L +#define ERROR_MEDIA_INCOMPATIBLE 4315L +#define ERROR_RESOURCE_NOT_PRESENT 4316L +#define ERROR_INVALID_OPERATION 4317L +#define ERROR_MEDIA_NOT_AVAILABLE 4318L +#define ERROR_DEVICE_NOT_AVAILABLE 4319L +#define ERROR_REQUEST_REFUSED 4320L +#define ERROR_INVALID_DRIVE_OBJECT 4321L +#define ERROR_LIBRARY_FULL 4322L +#define ERROR_MEDIUM_NOT_ACCESSIBLE 4323L +#define ERROR_UNABLE_TO_LOAD_MEDIUM 4324L +#define ERROR_UNABLE_TO_INVENTORY_DRIVE 4325L +#define ERROR_UNABLE_TO_INVENTORY_SLOT 4326L +#define ERROR_UNABLE_TO_INVENTORY_TRANSPORT 4327L +#define ERROR_TRANSPORT_FULL 4328L +#define ERROR_CONTROLLING_IEPORT 4329L +#define ERROR_UNABLE_TO_EJECT_MOUNTED_MEDIA 4330L +#define ERROR_CLEANER_SLOT_SET 4331L +#define ERROR_CLEANER_SLOT_NOT_SET 4332L +#define ERROR_CLEANER_CARTRIDGE_SPENT 4333L +#define ERROR_UNEXPECTED_OMID 4334L +#define ERROR_CANT_DELETE_LAST_ITEM 4335L +#define ERROR_MESSAGE_EXCEEDS_MAX_SIZE 4336L +#define ERROR_VOLUME_CONTAINS_SYS_FILES 4337L +#define ERROR_INDIGENOUS_TYPE 4338L +#define ERROR_NO_SUPPORTING_DRIVES 4339L +#define ERROR_CLEANER_CARTRIDGE_INSTALLED 4340L +#define ERROR_FILE_OFFLINE 4350L +#define ERROR_REMOTE_STORAGE_NOT_ACTIVE 4351L +#define ERROR_REMOTE_STORAGE_MEDIA_ERROR 4352L +#define ERROR_NOT_A_REPARSE_POINT 4390L +#define ERROR_REPARSE_ATTRIBUTE_CONFLICT 4391L +#define ERROR_INVALID_REPARSE_DATA 4392L +#define ERROR_REPARSE_TAG_INVALID 4393L +#define ERROR_REPARSE_TAG_MISMATCH 4394L +#define ERROR_VOLUME_NOT_SIS_ENABLED 4500L +#define ERROR_DEPENDENT_RESOURCE_EXISTS 5001L +#define ERROR_DEPENDENCY_NOT_FOUND 5002L +#define ERROR_DEPENDENCY_ALREADY_EXISTS 5003L +#define ERROR_RESOURCE_NOT_ONLINE 5004L +#define ERROR_HOST_NODE_NOT_AVAILABLE 5005L +#define ERROR_RESOURCE_NOT_AVAILABLE 5006L +#define ERROR_RESOURCE_NOT_FOUND 5007L +#define ERROR_SHUTDOWN_CLUSTER 5008L +#define ERROR_CANT_EVICT_ACTIVE_NODE 5009L +#define ERROR_OBJECT_ALREADY_EXISTS 5010L +#define ERROR_OBJECT_IN_LIST 5011L +#define ERROR_GROUP_NOT_AVAILABLE 5012L +#define ERROR_GROUP_NOT_FOUND 5013L +#define ERROR_GROUP_NOT_ONLINE 5014L +#define ERROR_HOST_NODE_NOT_RESOURCE_OWNER 5015L +#define ERROR_HOST_NODE_NOT_GROUP_OWNER 5016L +#define ERROR_RESMON_CREATE_FAILED 5017L +#define ERROR_RESMON_ONLINE_FAILED 5018L +#define ERROR_RESOURCE_ONLINE 5019L +#define ERROR_QUORUM_RESOURCE 5020L +#define ERROR_NOT_QUORUM_CAPABLE 5021L +#define ERROR_CLUSTER_SHUTTING_DOWN 5022L +#define ERROR_INVALID_STATE 5023L +#define ERROR_RESOURCE_PROPERTIES_STORED 5024L +#define ERROR_NOT_QUORUM_CLASS 5025L +#define ERROR_CORE_RESOURCE 5026L +#define ERROR_QUORUM_RESOURCE_ONLINE_FAILED 5027L +#define ERROR_QUORUMLOG_OPEN_FAILED 5028L +#define ERROR_CLUSTERLOG_CORRUPT 5029L +#define ERROR_CLUSTERLOG_RECORD_EXCEEDS_MAXSIZE 5030L +#define ERROR_CLUSTERLOG_EXCEEDS_MAXSIZE 5031L +#define ERROR_CLUSTERLOG_CHKPOINT_NOT_FOUND 5032L +#define ERROR_CLUSTERLOG_NOT_ENOUGH_SPACE 5033L +#define ERROR_QUORUM_OWNER_ALIVE 5034L +#define ERROR_NETWORK_NOT_AVAILABLE 5035L +#define ERROR_NODE_NOT_AVAILABLE 5036L +#define ERROR_ALL_NODES_NOT_AVAILABLE 5037L +#define ERROR_RESOURCE_FAILED 5038L +#define ERROR_CLUSTER_INVALID_NODE 5039L +#define ERROR_CLUSTER_NODE_EXISTS 5040L +#define ERROR_CLUSTER_JOIN_IN_PROGRESS 5041L +#define ERROR_CLUSTER_NODE_NOT_FOUND 5042L +#define ERROR_CLUSTER_LOCAL_NODE_NOT_FOUND 5043L +#define ERROR_CLUSTER_NETWORK_EXISTS 5044L +#define ERROR_CLUSTER_NETWORK_NOT_FOUND 5045L +#define ERROR_CLUSTER_NETINTERFACE_EXISTS 5046L +#define ERROR_CLUSTER_NETINTERFACE_NOT_FOUND 5047L +#define ERROR_CLUSTER_INVALID_REQUEST 5048L +#define ERROR_CLUSTER_INVALID_NETWORK_PROVIDER 5049L +#define ERROR_CLUSTER_NODE_DOWN 5050L +#define ERROR_CLUSTER_NODE_UNREACHABLE 5051L +#define ERROR_CLUSTER_NODE_NOT_MEMBER 5052L +#define ERROR_CLUSTER_JOIN_NOT_IN_PROGRESS 5053L +#define ERROR_CLUSTER_INVALID_NETWORK 5054L +#define ERROR_CLUSTER_NODE_UP 5056L +#define ERROR_CLUSTER_IPADDR_IN_USE 5057L +#define ERROR_CLUSTER_NODE_NOT_PAUSED 5058L +#define ERROR_CLUSTER_NO_SECURITY_CONTEXT 5059L +#define ERROR_CLUSTER_NETWORK_NOT_INTERNAL 5060L +#define ERROR_CLUSTER_NODE_ALREADY_UP 5061L +#define ERROR_CLUSTER_NODE_ALREADY_DOWN 5062L +#define ERROR_CLUSTER_NETWORK_ALREADY_ONLINE 5063L +#define ERROR_CLUSTER_NETWORK_ALREADY_OFFLINE 5064L +#define ERROR_CLUSTER_NODE_ALREADY_MEMBER 5065L +#define ERROR_CLUSTER_LAST_INTERNAL_NETWORK 5066L +#define ERROR_CLUSTER_NETWORK_HAS_DEPENDENTS 5067L +#define ERROR_INVALID_OPERATION_ON_QUORUM 5068L +#define ERROR_DEPENDENCY_NOT_ALLOWED 5069L +#define ERROR_CLUSTER_NODE_PAUSED 5070L +#define ERROR_NODE_CANT_HOST_RESOURCE 5071L +#define ERROR_CLUSTER_NODE_NOT_READY 5072L +#define ERROR_CLUSTER_NODE_SHUTTING_DOWN 5073L +#define ERROR_CLUSTER_JOIN_ABORTED 5074L +#define ERROR_CLUSTER_INCOMPATIBLE_VERSIONS 5075L +#define ERROR_CLUSTER_MAXNUM_OF_RESOURCES_EXCEEDED 5076L +#define ERROR_CLUSTER_SYSTEM_CONFIG_CHANGED 5077L +#define ERROR_CLUSTER_RESOURCE_TYPE_NOT_FOUND 5078L +#define ERROR_CLUSTER_RESTYPE_NOT_SUPPORTED 5079L +#define ERROR_CLUSTER_RESNAME_NOT_FOUND 5080L +#define ERROR_CLUSTER_NO_RPC_PACKAGES_REGISTERED 5081L +#define ERROR_CLUSTER_OWNER_NOT_IN_PREFLIST 5082L +#define ERROR_CLUSTER_DATABASE_SEQMISMATCH 5083L +#define ERROR_RESMON_INVALID_STATE 5084L +#define ERROR_CLUSTER_GUM_NOT_LOCKER 5085L +#define ERROR_QUORUM_DISK_NOT_FOUND 5086L +#define ERROR_DATABASE_BACKUP_CORRUPT 5087L +#define ERROR_CLUSTER_NODE_ALREADY_HAS_DFS_ROOT 5088L +#define ERROR_RESOURCE_PROPERTY_UNCHANGEABLE 5089L +#define ERROR_CLUSTER_MEMBERSHIP_INVALID_STATE 5890L +#define ERROR_CLUSTER_QUORUMLOG_NOT_FOUND 5891L +#define ERROR_CLUSTER_MEMBERSHIP_HALT 5892L +#define ERROR_CLUSTER_INSTANCE_ID_MISMATCH 5893L +#define ERROR_CLUSTER_NETWORK_NOT_FOUND_FOR_IP 5894L +#define ERROR_CLUSTER_PROPERTY_DATA_TYPE_MISMATCH 5895L +#define ERROR_CLUSTER_EVICT_WITHOUT_CLEANUP 5896L +#define ERROR_CLUSTER_PARAMETER_MISMATCH 5897L +#define ERROR_NODE_CANNOT_BE_CLUSTERED 5898L +#define ERROR_CLUSTER_WRONG_OS_VERSION 5899L +#define ERROR_CLUSTER_CANT_CREATE_DUP_CLUSTER_NAME 5900L +#define ERROR_CLUSCFG_ALREADY_COMMITTED 5901L +#define ERROR_CLUSCFG_ROLLBACK_FAILED 5902L +#define ERROR_CLUSCFG_SYSTEM_DISK_DRIVE_LETTER_CONFLICT 5903L +#define ERROR_CLUSTER_OLD_VERSION 5904L +#define ERROR_CLUSTER_MISMATCHED_COMPUTER_ACCT_NAME 5905L +#define ERROR_ENCRYPTION_FAILED 6000L +#define ERROR_DECRYPTION_FAILED 6001L +#define ERROR_FILE_ENCRYPTED 6002L +#define ERROR_NO_RECOVERY_POLICY 6003L +#define ERROR_NO_EFS 6004L +#define ERROR_WRONG_EFS 6005L +#define ERROR_NO_USER_KEYS 6006L +#define ERROR_FILE_NOT_ENCRYPTED 6007L +#define ERROR_NOT_EXPORT_FORMAT 6008L +#define ERROR_FILE_READ_ONLY 6009L +#define ERROR_DIR_EFS_DISALLOWED 6010L +#define ERROR_EFS_SERVER_NOT_TRUSTED 6011L +#define ERROR_BAD_RECOVERY_POLICY 6012L +#define ERROR_EFS_ALG_BLOB_TOO_BIG 6013L +#define ERROR_VOLUME_NOT_SUPPORT_EFS 6014L +#define ERROR_EFS_DISABLED 6015L +#define ERROR_EFS_VERSION_NOT_SUPPORT 6016L +#define ERROR_NO_BROWSER_SERVERS_FOUND 6118L +#define SCHED_E_SERVICE_NOT_LOCALSYSTEM 6200L + +#define ERROR_CTX_WINSTATION_NAME_INVALID 7001L +#define ERROR_CTX_INVALID_PD 7002L +#define ERROR_CTX_PD_NOT_FOUND 7003L +#define ERROR_CTX_WD_NOT_FOUND 7004L +#define ERROR_CTX_CANNOT_MAKE_EVENTLOG_ENTRY 7005L +#define ERROR_CTX_SERVICE_NAME_COLLISION 7006L +#define ERROR_CTX_CLOSE_PENDING 7007L +#define ERROR_CTX_NO_OUTBUF 7008L +#define ERROR_CTX_MODEM_INF_NOT_FOUND 7009L +#define ERROR_CTX_INVALID_MODEMNAME 7010L +#define ERROR_CTX_MODEM_RESPONSE_ERROR 7011L +#define ERROR_CTX_MODEM_RESPONSE_TIMEOUT 7012L +#define ERROR_CTX_MODEM_RESPONSE_NO_CARRIER 7013L +#define ERROR_CTX_MODEM_RESPONSE_NO_DIALTONE 7014L +#define ERROR_CTX_MODEM_RESPONSE_BUSY 7015L +#define ERROR_CTX_MODEM_RESPONSE_VOICE 7016L +#define ERROR_CTX_TD_ERROR 7017L +#define ERROR_CTX_WINSTATION_NOT_FOUND 7022L +#define ERROR_CTX_WINSTATION_ALREADY_EXISTS 7023L +#define ERROR_CTX_WINSTATION_BUSY 7024L +#define ERROR_CTX_BAD_VIDEO_MODE 7025L +#define ERROR_CTX_GRAPHICS_INVALID 7035L +#define ERROR_CTX_LOGON_DISABLED 7037L +#define ERROR_CTX_NOT_CONSOLE 7038L +#define ERROR_CTX_CLIENT_QUERY_TIMEOUT 7040L +#define ERROR_CTX_CONSOLE_DISCONNECT 7041L +#define ERROR_CTX_CONSOLE_CONNECT 7042L +#define ERROR_CTX_SHADOW_DENIED 7044L +#define ERROR_CTX_WINSTATION_ACCESS_DENIED 7045L +#define ERROR_CTX_INVALID_WD 7049L +#define ERROR_CTX_SHADOW_INVALID 7050L +#define ERROR_CTX_SHADOW_DISABLED 7051L +#define ERROR_CTX_CLIENT_LICENSE_IN_USE 7052L +#define ERROR_CTX_CLIENT_LICENSE_NOT_SET 7053L +#define ERROR_CTX_LICENSE_NOT_AVAILABLE 7054L +#define ERROR_CTX_LICENSE_CLIENT_INVALID 7055L +#define ERROR_CTX_LICENSE_EXPIRED 7056L +#define ERROR_CTX_SHADOW_NOT_RUNNING 7057L +#define ERROR_CTX_SHADOW_ENDED_BY_MODE_CHANGE 7058L +#define ERROR_ACTIVATION_COUNT_EXCEEDED 7059L + +#define FRS_ERR_INVALID_API_SEQUENCE 8001L +#define FRS_ERR_STARTING_SERVICE 8002L +#define FRS_ERR_STOPPING_SERVICE 8003L +#define FRS_ERR_INTERNAL_API 8004L +#define FRS_ERR_INTERNAL 8005L +#define FRS_ERR_SERVICE_COMM 8006L +#define FRS_ERR_INSUFFICIENT_PRIV 8007L +#define FRS_ERR_AUTHENTICATION 8008L +#define FRS_ERR_PARENT_INSUFFICIENT_PRIV 8009L +#define FRS_ERR_PARENT_AUTHENTICATION 8010L +#define FRS_ERR_CHILD_TO_PARENT_COMM 8011L +#define FRS_ERR_PARENT_TO_CHILD_COMM 8012L +#define FRS_ERR_SYSVOL_POPULATE 8013L +#define FRS_ERR_SYSVOL_POPULATE_TIMEOUT 8014L +#define FRS_ERR_SYSVOL_IS_BUSY 8015L +#define FRS_ERR_SYSVOL_DEMOTE 8016L +#define FRS_ERR_INVALID_SERVICE_PARAMETER 8017L +#define ERROR_DS_NOT_INSTALLED 8200L +#define ERROR_DS_MEMBERSHIP_EVALUATED_LOCALLY 8201L +#define ERROR_DS_NO_ATTRIBUTE_OR_VALUE 8202L +#define ERROR_DS_INVALID_ATTRIBUTE_SYNTAX 8203L +#define ERROR_DS_ATTRIBUTE_TYPE_UNDEFINED 8204L +#define ERROR_DS_ATTRIBUTE_OR_VALUE_EXISTS 8205L +#define ERROR_DS_BUSY 8206L +#define ERROR_DS_UNAVAILABLE 8207L +#define ERROR_DS_NO_RIDS_ALLOCATED 8208L +#define ERROR_DS_NO_MORE_RIDS 8209L +#define ERROR_DS_INCORRECT_ROLE_OWNER 8210L +#define ERROR_DS_RIDMGR_INIT_ERROR 8211L +#define ERROR_DS_OBJ_CLASS_VIOLATION 8212L +#define ERROR_DS_CANT_ON_NON_LEAF 8213L +#define ERROR_DS_CANT_ON_RDN 8214L +#define ERROR_DS_CANT_MOD_OBJ_CLASS 8215L +#define ERROR_DS_CROSS_DOM_MOVE_ERROR 8216L +#define ERROR_DS_GC_NOT_AVAILABLE 8217L +#define ERROR_SHARED_POLICY 8218L +#define ERROR_POLICY_OBJECT_NOT_FOUND 8219L +#define ERROR_POLICY_ONLY_IN_DS 8220L +#define ERROR_PROMOTION_ACTIVE 8221L +#define ERROR_NO_PROMOTION_ACTIVE 8222L +#define ERROR_DS_OPERATIONS_ERROR 8224L +#define ERROR_DS_PROTOCOL_ERROR 8225L +#define ERROR_DS_TIMELIMIT_EXCEEDED 8226L +#define ERROR_DS_SIZELIMIT_EXCEEDED 8227L +#define ERROR_DS_ADMIN_LIMIT_EXCEEDED 8228L +#define ERROR_DS_COMPARE_FALSE 8229L +#define ERROR_DS_COMPARE_TRUE 8230L +#define ERROR_DS_AUTH_METHOD_NOT_SUPPORTED 8231L +#define ERROR_DS_STRONG_AUTH_REQUIRED 8232L +#define ERROR_DS_INAPPROPRIATE_AUTH 8233L +#define ERROR_DS_AUTH_UNKNOWN 8234L +#define ERROR_DS_REFERRAL 8235L +#define ERROR_DS_UNAVAILABLE_CRIT_EXTENSION 8236L +#define ERROR_DS_CONFIDENTIALITY_REQUIRED 8237L +#define ERROR_DS_INAPPROPRIATE_MATCHING 8238L +#define ERROR_DS_CONSTRAINT_VIOLATION 8239L +#define ERROR_DS_NO_SUCH_OBJECT 8240L +#define ERROR_DS_ALIAS_PROBLEM 8241L +#define ERROR_DS_INVALID_DN_SYNTAX 8242L +#define ERROR_DS_IS_LEAF 8243L +#define ERROR_DS_ALIAS_DEREF_PROBLEM 8244L +#define ERROR_DS_UNWILLING_TO_PERFORM 8245L +#define ERROR_DS_LOOP_DETECT 8246L +#define ERROR_DS_NAMING_VIOLATION 8247L +#define ERROR_DS_OBJECT_RESULTS_TOO_LARGE 8248L +#define ERROR_DS_AFFECTS_MULTIPLE_DSAS 8249L +#define ERROR_DS_SERVER_DOWN 8250L +#define ERROR_DS_LOCAL_ERROR 8251L +#define ERROR_DS_ENCODING_ERROR 8252L +#define ERROR_DS_DECODING_ERROR 8253L +#define ERROR_DS_FILTER_UNKNOWN 8254L +#define ERROR_DS_PARAM_ERROR 8255L +#define ERROR_DS_NOT_SUPPORTED 8256L +#define ERROR_DS_NO_RESULTS_RETURNED 8257L +#define ERROR_DS_CONTROL_NOT_FOUND 8258L +#define ERROR_DS_CLIENT_LOOP 8259L +#define ERROR_DS_REFERRAL_LIMIT_EXCEEDED 8260L +#define ERROR_DS_SORT_CONTROL_MISSING 8261L +#define ERROR_DS_OFFSET_RANGE_ERROR 8262L +#define ERROR_DS_ROOT_MUST_BE_NC 8301L +#define ERROR_DS_ADD_REPLICA_INHIBITED 8302L +#define ERROR_DS_ATT_NOT_DEF_IN_SCHEMA 8303L +#define ERROR_DS_MAX_OBJ_SIZE_EXCEEDED 8304L +#define ERROR_DS_OBJ_STRING_NAME_EXISTS 8305L +#define ERROR_DS_NO_RDN_DEFINED_IN_SCHEMA 8306L +#define ERROR_DS_RDN_DOESNT_MATCH_SCHEMA 8307L +#define ERROR_DS_NO_REQUESTED_ATTS_FOUND 8308L +#define ERROR_DS_USER_BUFFER_TO_SMALL 8309L +#define ERROR_DS_ATT_IS_NOT_ON_OBJ 8310L +#define ERROR_DS_ILLEGAL_MOD_OPERATION 8311L +#define ERROR_DS_OBJ_TOO_LARGE 8312L +#define ERROR_DS_BAD_INSTANCE_TYPE 8313L +#define ERROR_DS_MASTERDSA_REQUIRED 8314L +#define ERROR_DS_OBJECT_CLASS_REQUIRED 8315L +#define ERROR_DS_MISSING_REQUIRED_ATT 8316L +#define ERROR_DS_ATT_NOT_DEF_FOR_CLASS 8317L +#define ERROR_DS_ATT_ALREADY_EXISTS 8318L +#define ERROR_DS_CANT_ADD_ATT_VALUES 8320L +#define ERROR_DS_SINGLE_VALUE_CONSTRAINT 8321L +#define ERROR_DS_RANGE_CONSTRAINT 8322L +#define ERROR_DS_ATT_VAL_ALREADY_EXISTS 8323L +#define ERROR_DS_CANT_REM_MISSING_ATT 8324L +#define ERROR_DS_CANT_REM_MISSING_ATT_VAL 8325L +#define ERROR_DS_ROOT_CANT_BE_SUBREF 8326L +#define ERROR_DS_NO_CHAINING 8327L +#define ERROR_DS_NO_CHAINED_EVAL 8328L +#define ERROR_DS_NO_PARENT_OBJECT 8329L +#define ERROR_DS_PARENT_IS_AN_ALIAS 8330L +#define ERROR_DS_CANT_MIX_MASTER_AND_REPS 8331L +#define ERROR_DS_CHILDREN_EXIST 8332L +#define ERROR_DS_OBJ_NOT_FOUND 8333L +#define ERROR_DS_ALIASED_OBJ_MISSING 8334L +#define ERROR_DS_BAD_NAME_SYNTAX 8335L +#define ERROR_DS_ALIAS_POINTS_TO_ALIAS 8336L +#define ERROR_DS_CANT_DEREF_ALIAS 8337L +#define ERROR_DS_OUT_OF_SCOPE 8338L +#define ERROR_DS_OBJECT_BEING_REMOVED 8339L +#define ERROR_DS_CANT_DELETE_DSA_OBJ 8340L +#define ERROR_DS_GENERIC_ERROR 8341L +#define ERROR_DS_DSA_MUST_BE_INT_MASTER 8342L +#define ERROR_DS_CLASS_NOT_DSA 8343L +#define ERROR_DS_INSUFF_ACCESS_RIGHTS 8344L +#define ERROR_DS_ILLEGAL_SUPERIOR 8345L +#define ERROR_DS_ATTRIBUTE_OWNED_BY_SAM 8346L +#define ERROR_DS_NAME_TOO_MANY_PARTS 8347L +#define ERROR_DS_NAME_TOO_LONG 8348L +#define ERROR_DS_NAME_VALUE_TOO_LONG 8349L +#define ERROR_DS_NAME_UNPARSEABLE 8350L +#define ERROR_DS_NAME_TYPE_UNKNOWN 8351L +#define ERROR_DS_NOT_AN_OBJECT 8352L +#define ERROR_DS_SEC_DESC_TOO_SHORT 8353L +#define ERROR_DS_SEC_DESC_INVALID 8354L +#define ERROR_DS_NO_DELETED_NAME 8355L +#define ERROR_DS_SUBREF_MUST_HAVE_PARENT 8356L +#define ERROR_DS_NCNAME_MUST_BE_NC 8357L +#define ERROR_DS_CANT_ADD_SYSTEM_ONLY 8358L +#define ERROR_DS_CLASS_MUST_BE_CONCRETE 8359L +#define ERROR_DS_INVALID_DMD 8360L +#define ERROR_DS_OBJ_GUID_EXISTS 8361L +#define ERROR_DS_NOT_ON_BACKLINK 8362L +#define ERROR_DS_NO_CROSSREF_FOR_NC 8363L +#define ERROR_DS_SHUTTING_DOWN 8364L +#define ERROR_DS_UNKNOWN_OPERATION 8365L +#define ERROR_DS_INVALID_ROLE_OWNER 8366L +#define ERROR_DS_COULDNT_CONTACT_FSMO 8367L +#define ERROR_DS_CROSS_NC_DN_RENAME 8368L +#define ERROR_DS_CANT_MOD_SYSTEM_ONLY 8369L +#define ERROR_DS_REPLICATOR_ONLY 8370L +#define ERROR_DS_OBJ_CLASS_NOT_DEFINED 8371L +#define ERROR_DS_OBJ_CLASS_NOT_SUBCLASS 8372L +#define ERROR_DS_NAME_REFERENCE_INVALID 8373L +#define ERROR_DS_CROSS_REF_EXISTS 8374L +#define ERROR_DS_CANT_DEL_MASTER_CROSSREF 8375L +#define ERROR_DS_SUBTREE_NOTIFY_NOT_NC_HEAD 8376L +#define ERROR_DS_NOTIFY_FILTER_TOO_COMPLEX 8377L +#define ERROR_DS_DUP_RDN 8378L +#define ERROR_DS_DUP_OID 8379L +#define ERROR_DS_DUP_MAPI_ID 8380L +#define ERROR_DS_DUP_SCHEMA_ID_GUID 8381L +#define ERROR_DS_DUP_LDAP_DISPLAY_NAME 8382L +#define ERROR_DS_SEMANTIC_ATT_TEST 8383L +#define ERROR_DS_SYNTAX_MISMATCH 8384L +#define ERROR_DS_EXISTS_IN_MUST_HAVE 8385L +#define ERROR_DS_EXISTS_IN_MAY_HAVE 8386L +#define ERROR_DS_NONEXISTENT_MAY_HAVE 8387L +#define ERROR_DS_NONEXISTENT_MUST_HAVE 8388L +#define ERROR_DS_AUX_CLS_TEST_FAIL 8389L +#define ERROR_DS_NONEXISTENT_POSS_SUP 8390L +#define ERROR_DS_SUB_CLS_TEST_FAIL 8391L +#define ERROR_DS_BAD_RDN_ATT_ID_SYNTAX 8392L +#define ERROR_DS_EXISTS_IN_AUX_CLS 8393L +#define ERROR_DS_EXISTS_IN_SUB_CLS 8394L +#define ERROR_DS_EXISTS_IN_POSS_SUP 8395L +#define ERROR_DS_RECALCSCHEMA_FAILED 8396L +#define ERROR_DS_TREE_DELETE_NOT_FINISHED 8397L +#define ERROR_DS_CANT_DELETE 8398L +#define ERROR_DS_ATT_SCHEMA_REQ_ID 8399L +#define ERROR_DS_BAD_ATT_SCHEMA_SYNTAX 8400L +#define ERROR_DS_CANT_CACHE_ATT 8401L +#define ERROR_DS_CANT_CACHE_CLASS 8402L +#define ERROR_DS_CANT_REMOVE_ATT_CACHE 8403L +#define ERROR_DS_CANT_REMOVE_CLASS_CACHE 8404L +#define ERROR_DS_CANT_RETRIEVE_DN 8405L +#define ERROR_DS_MISSING_SUPREF 8406L +#define ERROR_DS_CANT_RETRIEVE_INSTANCE 8407L +#define ERROR_DS_CODE_INCONSISTENCY 8408L +#define ERROR_DS_DATABASE_ERROR 8409L +#define ERROR_DS_GOVERNSID_MISSING 8410L +#define ERROR_DS_MISSING_EXPECTED_ATT 8411L +#define ERROR_DS_NCNAME_MISSING_CR_REF 8412L +#define ERROR_DS_SECURITY_CHECKING_ERROR 8413L +#define ERROR_DS_SCHEMA_NOT_LOADED 8414L +#define ERROR_DS_SCHEMA_ALLOC_FAILED 8415L +#define ERROR_DS_ATT_SCHEMA_REQ_SYNTAX 8416L +#define ERROR_DS_GCVERIFY_ERROR 8417L +#define ERROR_DS_DRA_SCHEMA_MISMATCH 8418L +#define ERROR_DS_CANT_FIND_DSA_OBJ 8419L +#define ERROR_DS_CANT_FIND_EXPECTED_NC 8420L +#define ERROR_DS_CANT_FIND_NC_IN_CACHE 8421L +#define ERROR_DS_CANT_RETRIEVE_CHILD 8422L +#define ERROR_DS_SECURITY_ILLEGAL_MODIFY 8423L +#define ERROR_DS_CANT_REPLACE_HIDDEN_REC 8424L +#define ERROR_DS_BAD_HIERARCHY_FILE 8425L +#define ERROR_DS_BUILD_HIERARCHY_TABLE_FAILED 8426L +#define ERROR_DS_CONFIG_PARAM_MISSING 8427L +#define ERROR_DS_COUNTING_AB_INDICES_FAILED 8428L +#define ERROR_DS_HIERARCHY_TABLE_MALLOC_FAILED 8429L +#define ERROR_DS_INTERNAL_FAILURE 8430L +#define ERROR_DS_UNKNOWN_ERROR 8431L +#define ERROR_DS_ROOT_REQUIRES_CLASS_TOP 8432L +#define ERROR_DS_REFUSING_FSMO_ROLES 8433L +#define ERROR_DS_MISSING_FSMO_SETTINGS 8434L +#define ERROR_DS_UNABLE_TO_SURRENDER_ROLES 8435L +#define ERROR_DS_DRA_GENERIC 8436L +#define ERROR_DS_DRA_INVALID_PARAMETER 8437L +#define ERROR_DS_DRA_BUSY 8438L +#define ERROR_DS_DRA_BAD_DN 8439L +#define ERROR_DS_DRA_BAD_NC 8440L +#define ERROR_DS_DRA_DN_EXISTS 8441L +#define ERROR_DS_DRA_INTERNAL_ERROR 8442L +#define ERROR_DS_DRA_INCONSISTENT_DIT 8443L +#define ERROR_DS_DRA_CONNECTION_FAILED 8444L +#define ERROR_DS_DRA_BAD_INSTANCE_TYPE 8445L +#define ERROR_DS_DRA_OUT_OF_MEM 8446L +#define ERROR_DS_DRA_MAIL_PROBLEM 8447L +#define ERROR_DS_DRA_REF_ALREADY_EXISTS 8448L +#define ERROR_DS_DRA_REF_NOT_FOUND 8449L +#define ERROR_DS_DRA_OBJ_IS_REP_SOURCE 8450L +#define ERROR_DS_DRA_DB_ERROR 8451L +#define ERROR_DS_DRA_NO_REPLICA 8452L +#define ERROR_DS_DRA_ACCESS_DENIED 8453L +#define ERROR_DS_DRA_NOT_SUPPORTED 8454L +#define ERROR_DS_DRA_RPC_CANCELLED 8455L +#define ERROR_DS_DRA_SOURCE_DISABLED 8456L +#define ERROR_DS_DRA_SINK_DISABLED 8457L +#define ERROR_DS_DRA_NAME_COLLISION 8458L +#define ERROR_DS_DRA_SOURCE_REINSTALLED 8459L +#define ERROR_DS_DRA_MISSING_PARENT 8460L +#define ERROR_DS_DRA_PREEMPTED 8461L +#define ERROR_DS_DRA_ABANDON_SYNC 8462L +#define ERROR_DS_DRA_SHUTDOWN 8463L +#define ERROR_DS_DRA_INCOMPATIBLE_PARTIAL_SET 8464L +#define ERROR_DS_DRA_SOURCE_IS_PARTIAL_REPLICA 8465L +#define ERROR_DS_DRA_EXTN_CONNECTION_FAILED 8466L +#define ERROR_DS_INSTALL_SCHEMA_MISMATCH 8467L +#define ERROR_DS_DUP_LINK_ID 8468L +#define ERROR_DS_NAME_ERROR_RESOLVING 8469L +#define ERROR_DS_NAME_ERROR_NOT_FOUND 8470L +#define ERROR_DS_NAME_ERROR_NOT_UNIQUE 8471L +#define ERROR_DS_NAME_ERROR_NO_MAPPING 8472L +#define ERROR_DS_NAME_ERROR_DOMAIN_ONLY 8473L +#define ERROR_DS_NAME_ERROR_NO_SYNTACTICAL_MAPPING 8474L +#define ERROR_DS_CONSTRUCTED_ATT_MOD 8475L +#define ERROR_DS_WRONG_OM_OBJ_CLASS 8476L +#define ERROR_DS_DRA_REPL_PENDING 8477L +#define ERROR_DS_DS_REQUIRED 8478L +#define ERROR_DS_INVALID_LDAP_DISPLAY_NAME 8479L +#define ERROR_DS_NON_BASE_SEARCH 8480L +#define ERROR_DS_CANT_RETRIEVE_ATTS 8481L +#define ERROR_DS_BACKLINK_WITHOUT_LINK 8482L +#define ERROR_DS_EPOCH_MISMATCH 8483L +#define ERROR_DS_SRC_NAME_MISMATCH 8484L +#define ERROR_DS_SRC_AND_DST_NC_IDENTICAL 8485L +#define ERROR_DS_DST_NC_MISMATCH 8486L +#define ERROR_DS_NOT_AUTHORITIVE_FOR_DST_NC 8487L +#define ERROR_DS_SRC_GUID_MISMATCH 8488L +#define ERROR_DS_CANT_MOVE_DELETED_OBJECT 8489L +#define ERROR_DS_PDC_OPERATION_IN_PROGRESS 8490L +#define ERROR_DS_CROSS_DOMAIN_CLEANUP_REQD 8491L +#define ERROR_DS_ILLEGAL_XDOM_MOVE_OPERATION 8492L +#define ERROR_DS_CANT_WITH_ACCT_GROUP_MEMBERSHPS 8493L +#define ERROR_DS_NC_MUST_HAVE_NC_PARENT 8494L +#define ERROR_DS_CR_IMPOSSIBLE_TO_VALIDATE 8495L +#define ERROR_DS_DST_DOMAIN_NOT_NATIVE 8496L +#define ERROR_DS_MISSING_INFRASTRUCTURE_CONTAINER 8497L +#define ERROR_DS_CANT_MOVE_ACCOUNT_GROUP 8498L +#define ERROR_DS_CANT_MOVE_RESOURCE_GROUP 8499L +#define ERROR_DS_INVALID_SEARCH_FLAG 8500L +#define ERROR_DS_NO_TREE_DELETE_ABOVE_NC 8501L +#define ERROR_DS_COULDNT_LOCK_TREE_FOR_DELETE 8502L +#define ERROR_DS_COULDNT_IDENTIFY_OBJECTS_FOR_TREE_DELETE 8503L +#define ERROR_DS_SAM_INIT_FAILURE 8504L +#define ERROR_DS_SENSITIVE_GROUP_VIOLATION 8505L +#define ERROR_DS_CANT_MOD_PRIMARYGROUPID 8506L +#define ERROR_DS_ILLEGAL_BASE_SCHEMA_MOD 8507L +#define ERROR_DS_NONSAFE_SCHEMA_CHANGE 8508L +#define ERROR_DS_SCHEMA_UPDATE_DISALLOWED 8509L +#define ERROR_DS_CANT_CREATE_UNDER_SCHEMA 8510L +#define ERROR_DS_INSTALL_NO_SRC_SCH_VERSION 8511L +#define ERROR_DS_INSTALL_NO_SCH_VERSION_IN_INIFILE 8512L +#define ERROR_DS_INVALID_GROUP_TYPE 8513L +#define ERROR_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN 8514L +#define ERROR_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN 8515L +#define ERROR_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER 8516L +#define ERROR_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER 8517L +#define ERROR_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER 8518L +#define ERROR_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER 8519L +#define ERROR_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER 8520L +#define ERROR_DS_HAVE_PRIMARY_MEMBERS 8521L +#define ERROR_DS_STRING_SD_CONVERSION_FAILED 8522L +#define ERROR_DS_NAMING_MASTER_GC 8523L +#define ERROR_DS_LOOKUP_FAILURE 8524L +#define ERROR_DS_COULDNT_UPDATE_SPNS 8525L +#define ERROR_DS_CANT_RETRIEVE_SD 8526L +#define ERROR_DS_KEY_NOT_UNIQUE 8527L +#define ERROR_DS_WRONG_LINKED_ATT_SYNTAX 8528L +#define ERROR_DS_SAM_NEED_BOOTKEY_PASSWORD 8529L +#define ERROR_DS_SAM_NEED_BOOTKEY_FLOPPY 8530L +#define ERROR_DS_CANT_START 8531L +#define ERROR_DS_INIT_FAILURE 8532L +#define ERROR_DS_NO_PKT_PRIVACY_ON_CONNECTION 8533L +#define ERROR_DS_SOURCE_DOMAIN_IN_FOREST 8534L +#define ERROR_DS_DESTINATION_DOMAIN_NOT_IN_FOREST 8535L +#define ERROR_DS_DESTINATION_AUDITING_NOT_ENABLED 8536L +#define ERROR_DS_CANT_FIND_DC_FOR_SRC_DOMAIN 8537L +#define ERROR_DS_SRC_OBJ_NOT_GROUP_OR_USER 8538L +#define ERROR_DS_SRC_SID_EXISTS_IN_FOREST 8539L +#define ERROR_DS_SRC_AND_DST_OBJECT_CLASS_MISMATCH 8540L +#define ERROR_SAM_INIT_FAILURE 8541L +#define ERROR_DS_DRA_SCHEMA_INFO_SHIP 8542L +#define ERROR_DS_DRA_SCHEMA_CONFLICT 8543L +#define ERROR_DS_DRA_EARLIER_SCHEMA_CONLICT 8544L +#define ERROR_DS_DRA_OBJ_NC_MISMATCH 8545L +#define ERROR_DS_NC_STILL_HAS_DSAS 8546L +#define ERROR_DS_GC_REQUIRED 8547L +#define ERROR_DS_LOCAL_MEMBER_OF_LOCAL_ONLY 8548L +#define ERROR_DS_NO_FPO_IN_UNIVERSAL_GROUPS 8549L +#define ERROR_DS_CANT_ADD_TO_GC 8550L +#define ERROR_DS_NO_CHECKPOINT_WITH_PDC 8551L +#define ERROR_DS_SOURCE_AUDITING_NOT_ENABLED 8552L +#define ERROR_DS_CANT_CREATE_IN_NONDOMAIN_NC 8553L +#define ERROR_DS_INVALID_NAME_FOR_SPN 8554L +#define ERROR_DS_FILTER_USES_CONTRUCTED_ATTRS 8555L +#define ERROR_DS_UNICODEPWD_NOT_IN_QUOTES 8556L +#define ERROR_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED 8557L +#define ERROR_DS_MUST_BE_RUN_ON_DST_DC 8558L +#define ERROR_DS_SRC_DC_MUST_BE_SP4_OR_GREATER 8559L +#define ERROR_DS_CANT_TREE_DELETE_CRITICAL_OBJ 8560L +#define ERROR_DS_INIT_FAILURE_CONSOLE 8561L +#define ERROR_DS_SAM_INIT_FAILURE_CONSOLE 8562L +#define ERROR_DS_FOREST_VERSION_TOO_HIGH 8563L +#define ERROR_DS_DOMAIN_VERSION_TOO_HIGH 8564L +#define ERROR_DS_FOREST_VERSION_TOO_LOW 8565L +#define ERROR_DS_DOMAIN_VERSION_TOO_LOW 8566L +#define ERROR_DS_INCOMPATIBLE_VERSION 8567L +#define ERROR_DS_LOW_DSA_VERSION 8568L +#define ERROR_DS_NO_BEHAVIOR_VERSION_IN_MIXEDDOMAIN 8569L +#define ERROR_DS_NOT_SUPPORTED_SORT_ORDER 8570L +#define ERROR_DS_NAME_NOT_UNIQUE 8571L +#define ERROR_DS_MACHINE_ACCOUNT_CREATED_PRENT4 8572L +#define ERROR_DS_OUT_OF_VERSION_STORE 8573L +#define ERROR_DS_INCOMPATIBLE_CONTROLS_USED 8574L +#define ERROR_DS_NO_REF_DOMAIN 8575L +#define ERROR_DS_RESERVED_LINK_ID 8576L +#define ERROR_DS_LINK_ID_NOT_AVAILABLE 8577L +#define ERROR_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER 8578L +#define ERROR_DS_MODIFYDN_DISALLOWED_BY_INSTANCE_TYPE 8579L +#define ERROR_DS_NO_OBJECT_MOVE_IN_SCHEMA_NC 8580L +#define ERROR_DS_MODIFYDN_DISALLOWED_BY_FLAG 8581L +#define ERROR_DS_MODIFYDN_WRONG_GRANDPARENT 8582L +#define ERROR_DS_NAME_ERROR_TRUST_REFERRAL 8583L +#define ERROR_NOT_SUPPORTED_ON_STANDARD_SERVER 8584L +#define ERROR_DS_CANT_ACCESS_REMOTE_PART_OF_AD 8585L +#define ERROR_DS_CR_IMPOSSIBLE_TO_VALIDATE_V2 8586L +#define ERROR_DS_THREAD_LIMIT_EXCEEDED 8587L +#define ERROR_DS_NOT_CLOSEST 8588L +#define ERROR_DS_CANT_DERIVE_SPN_WITHOUT_SERVER_REF 8589L +#define ERROR_DS_SINGLE_USER_MODE_FAILED 8590L +#define ERROR_DS_NTDSCRIPT_SYNTAX_ERROR 8591L +#define ERROR_DS_NTDSCRIPT_PROCESS_ERROR 8592L +#define ERROR_DS_DIFFERENT_REPL_EPOCHS 8593L +#define ERROR_DS_DRS_EXTENSIONS_CHANGED 8594L +#define ERROR_DS_REPLICA_SET_CHANGE_NOT_ALLOWED_ON_DISABLED_CR 8595L +#define ERROR_DS_NO_MSDS_INTID 8596L +#define ERROR_DS_DUP_MSDS_INTID 8597L +#define ERROR_DS_EXISTS_IN_RDNATTID 8598L +#define ERROR_DS_AUTHORIZATION_FAILED 8599L +#define ERROR_DS_INVALID_SCRIPT 8600L +#define ERROR_DS_REMOTE_CROSSREF_OP_FAILED 8601L +#define ERROR_DS_CROSS_REF_BUSY 8602L +#define ERROR_DS_CANT_DERIVE_SPN_FOR_DELETED_DOMAIN 8603L +#define ERROR_DS_CANT_DEMOTE_WITH_WRITEABLE_NC 8604L +#define ERROR_DS_DUPLICATE_ID_FOUND 8605L +#define ERROR_DS_INSUFFICIENT_ATTR_TO_CREATE_OBJECT 8606L +#define ERROR_DS_GROUP_CONVERSION_ERROR 8607L +#define ERROR_DS_CANT_MOVE_APP_BASIC_GROUP 8608L +#define ERROR_DS_CANT_MOVE_APP_QUERY_GROUP 8609L +#define ERROR_DS_ROLE_NOT_VERIFIED 8610L +#define ERROR_DS_WKO_CONTAINER_CANNOT_BE_SPECIAL 8611L +#define ERROR_DS_DOMAIN_RENAME_IN_PROGRESS 8612L +#define ERROR_DS_EXISTING_AD_CHILD_NC 8613L +#define DNS_ERROR_RCODE_FORMAT_ERROR 9001L +#define DNS_ERROR_RCODE_SERVER_FAILURE 9002L +#define DNS_ERROR_RCODE_NAME_ERROR 9003L +#define DNS_ERROR_RCODE_NOT_IMPLEMENTED 9004L +#define DNS_ERROR_RCODE_REFUSED 9005L +#define DNS_ERROR_RCODE_YXDOMAIN 9006L +#define DNS_ERROR_RCODE_YXRRSET 9007L +#define DNS_ERROR_RCODE_NXRRSET 9008L +#define DNS_ERROR_RCODE_NOTAUTH 9009L +#define DNS_ERROR_RCODE_NOTZONE 9010L +#define DNS_ERROR_RCODE_BADSIG 9016L +#define DNS_ERROR_RCODE_BADKEY 9017L +#define DNS_ERROR_RCODE_BADTIME 9018L +#define DNS_INFO_NO_RECORDS 9501L +#define DNS_ERROR_BAD_PACKET 9502L +#define DNS_ERROR_NO_PACKET 9503L +#define DNS_ERROR_RCODE 9504L +#define DNS_ERROR_UNSECURE_PACKET 9505L +#define DNS_ERROR_INVALID_TYPE 9551L +#define DNS_ERROR_INVALID_IP_ADDRESS 9552L +#define DNS_ERROR_INVALID_PROPERTY 9553L +#define DNS_ERROR_TRY_AGAIN_LATER 9554L +#define DNS_ERROR_NOT_UNIQUE 9555L +#define DNS_ERROR_NON_RFC_NAME 9556L +#define DNS_STATUS_FQDN 9557L +#define DNS_STATUS_DOTTED_NAME 9558L +#define DNS_STATUS_SINGLE_PART_NAME 9559L +#define DNS_ERROR_INVALID_NAME_CHAR 9560L +#define DNS_ERROR_NUMERIC_NAME 9561L +#define DNS_ERROR_NOT_ALLOWED_ON_ROOT_SERVER 9562L +#define DNS_ERROR_NOT_ALLOWED_UNDER_DELEGATION 9563L +#define DNS_ERROR_CANNOT_FIND_ROOT_HINTS 9564L +#define DNS_ERROR_INCONSISTENT_ROOT_HINTS 9565L +#define DNS_ERROR_ZONE_DOES_NOT_EXIST 9601L +#define DNS_ERROR_NO_ZONE_INFO 9602L +#define DNS_ERROR_INVALID_ZONE_OPERATION 9603L +#define DNS_ERROR_ZONE_CONFIGURATION_ERROR 9604L +#define DNS_ERROR_ZONE_HAS_NO_SOA_RECORD 9605L +#define DNS_ERROR_ZONE_HAS_NO_NS_RECORDS 9606L +#define DNS_ERROR_ZONE_LOCKED 9607L +#define DNS_ERROR_ZONE_CREATION_FAILED 9608L +#define DNS_ERROR_ZONE_ALREADY_EXISTS 9609L +#define DNS_ERROR_AUTOZONE_ALREADY_EXISTS 9610L +#define DNS_ERROR_INVALID_ZONE_TYPE 9611L +#define DNS_ERROR_SECONDARY_REQUIRES_MASTER_IP 9612L +#define DNS_ERROR_ZONE_NOT_SECONDARY 9613L +#define DNS_ERROR_NEED_SECONDARY_ADDRESSES 9614L +#define DNS_ERROR_WINS_INIT_FAILED 9615L +#define DNS_ERROR_NEED_WINS_SERVERS 9616L +#define DNS_ERROR_NBSTAT_INIT_FAILED 9617L +#define DNS_ERROR_SOA_DELETE_INVALID 9618L +#define DNS_ERROR_FORWARDER_ALREADY_EXISTS 9619L +#define DNS_ERROR_ZONE_REQUIRES_MASTER_IP 9620L +#define DNS_ERROR_ZONE_IS_SHUTDOWN 9621L +#define DNS_ERROR_PRIMARY_REQUIRES_DATAFILE 9651L +#define DNS_ERROR_INVALID_DATAFILE_NAME 9652L +#define DNS_ERROR_DATAFILE_OPEN_FAILURE 9653L +#define DNS_ERROR_FILE_WRITEBACK_FAILED 9654L +#define DNS_ERROR_DATAFILE_PARSING 9655L +#define DNS_ERROR_RECORD_DOES_NOT_EXIST 9701L +#define DNS_ERROR_RECORD_FORMAT 9702L +#define DNS_ERROR_NODE_CREATION_FAILED 9703L +#define DNS_ERROR_UNKNOWN_RECORD_TYPE 9704L +#define DNS_ERROR_RECORD_TIMED_OUT 9705L +#define DNS_ERROR_NAME_NOT_IN_ZONE 9706L +#define DNS_ERROR_CNAME_LOOP 9707L +#define DNS_ERROR_NODE_IS_CNAME 9708L +#define DNS_ERROR_CNAME_COLLISION 9709L +#define DNS_ERROR_RECORD_ONLY_AT_ZONE_ROOT 9710L +#define DNS_ERROR_RECORD_ALREADY_EXISTS 9711L +#define DNS_ERROR_SECONDARY_DATA 9712L +#define DNS_ERROR_NO_CREATE_CACHE_DATA 9713L +#define DNS_ERROR_NAME_DOES_NOT_EXIST 9714L +#define DNS_WARNING_PTR_CREATE_FAILED 9715L +#define DNS_WARNING_DOMAIN_UNDELETED 9716L +#define DNS_ERROR_DS_UNAVAILABLE 9717L +#define DNS_ERROR_DS_ZONE_ALREADY_EXISTS 9718L +#define DNS_ERROR_NO_BOOTFILE_IF_DS_ZONE 9719L +#define DNS_INFO_AXFR_COMPLETE 9751L +#define DNS_ERROR_AXFR 9752L +#define DNS_INFO_ADDED_LOCAL_WINS 9753L +#define DNS_STATUS_CONTINUE_NEEDED 9801L +#define DNS_ERROR_NO_TCPIP 9851L +#define DNS_ERROR_NO_DNS_SERVERS 9852L +#define DNS_ERROR_DP_DOES_NOT_EXIST 9901L +#define DNS_ERROR_DP_ALREADY_EXISTS 9902L +#define DNS_ERROR_DP_NOT_ENLISTED 9903L +#define DNS_ERROR_DP_ALREADY_ENLISTED 9904L +#define DNS_ERROR_DP_NOT_AVAILABLE 9905L + +#ifndef WSABASEERR +#define WSABASEERR 10000 +#define WSAEINTR 10004L +#define WSAEBADF 10009L +#define WSAEACCES 10013L +#define WSAEFAULT 10014L +#define WSAEINVAL 10022L +#define WSAEMFILE 10024L +#define WSAEWOULDBLOCK 10035L +#define WSAEINPROGRESS 10036L +#define WSAEALREADY 10037L +#define WSAENOTSOCK 10038L +#define WSAEDESTADDRREQ 10039L +#define WSAEMSGSIZE 10040L +#define WSAEPROTOTYPE 10041L +#define WSAENOPROTOOPT 10042L +#define WSAEPROTONOSUPPORT 10043L +#define WSAESOCKTNOSUPPORT 10044L +#define WSAEOPNOTSUPP 10045L +#define WSAEPFNOSUPPORT 10046L +#define WSAEAFNOSUPPORT 10047L +#define WSAEADDRINUSE 10048L +#define WSAEADDRNOTAVAIL 10049L +#define WSAENETDOWN 10050L +#define WSAENETUNREACH 10051L +#define WSAENETRESET 10052L +#define WSAECONNABORTED 10053L +#define WSAECONNRESET 10054L +#define WSAENOBUFS 10055L +#define WSAEISCONN 10056L +#define WSAENOTCONN 10057L +#define WSAESHUTDOWN 10058L +#define WSAETOOMANYREFS 10059L +#define WSAETIMEDOUT 10060L +#define WSAECONNREFUSED 10061L +#define WSAELOOP 10062L +#define WSAENAMETOOLONG 10063L +#define WSAEHOSTDOWN 10064L +#define WSAEHOSTUNREACH 10065L +#define WSAENOTEMPTY 10066L +#define WSAEPROCLIM 10067L +#define WSAEUSERS 10068L +#define WSAEDQUOT 10069L +#define WSAESTALE 10070L +#define WSAEREMOTE 10071L +#define WSASYSNOTREADY 10091L +#define WSAVERNOTSUPPORTED 10092L +#define WSANOTINITIALISED 10093L +#define WSAEDISCON 10101L +#define WSAENOMORE 10102L +#define WSAECANCELLED 10103L +#define WSAEINVALIDPROCTABLE 10104L +#define WSAEINVALIDPROVIDER 10105L +#define WSAEPROVIDERFAILEDINIT 10106L +#define WSASYSCALLFAILURE 10107L +#define WSASERVICE_NOT_FOUND 10108L +#define WSATYPE_NOT_FOUND 10109L +#define WSA_E_NO_MORE 10110L +#define WSA_E_CANCELLED 10111L +#define WSAEREFUSED 10112L +#define WSAHOST_NOT_FOUND 11001L +#define WSATRY_AGAIN 11002L +#define WSANO_RECOVERY 11003L +#define WSANO_DATA 11004L +#define WSA_QOS_RECEIVERS 11005L +#define WSA_QOS_SENDERS 11006L +#define WSA_QOS_NO_SENDERS 11007L +#define WSA_QOS_NO_RECEIVERS 11008L +#define WSA_QOS_REQUEST_CONFIRMED 11009L +#define WSA_QOS_ADMISSION_FAILURE 11010L +#define WSA_QOS_POLICY_FAILURE 11011L +#define WSA_QOS_BAD_STYLE 11012L +#define WSA_QOS_BAD_OBJECT 11013L +#define WSA_QOS_TRAFFIC_CTRL_ERROR 11014L +#define WSA_QOS_GENERIC_ERROR 11015L +#define WSA_QOS_ESERVICETYPE 11016L +#define WSA_QOS_EFLOWSPEC 11017L +#define WSA_QOS_EPROVSPECBUF 11018L +#define WSA_QOS_EFILTERSTYLE 11019L +#define WSA_QOS_EFILTERTYPE 11020L +#define WSA_QOS_EFILTERCOUNT 11021L +#define WSA_QOS_EOBJLENGTH 11022L +#define WSA_QOS_EFLOWCOUNT 11023L +#define WSA_QOS_EUNKNOWNPSOBJ 11024L +#define WSA_QOS_EPOLICYOBJ 11025L +#define WSA_QOS_EFLOWDESC 11026L +#define WSA_QOS_EPSFLOWSPEC 11027L +#define WSA_QOS_EPSFILTERSPEC 11028L +#define WSA_QOS_ESDMODEOBJ 11029L +#define WSA_QOS_ESHAPERATEOBJ 11030L +#define WSA_QOS_RESERVED_PETYPE 11031L +#endif /* !WSABASEERR */ + +#define ERROR_IPSEC_QM_POLICY_EXISTS 13000L +#define ERROR_IPSEC_QM_POLICY_NOT_FOUND 13001L +#define ERROR_IPSEC_QM_POLICY_IN_USE 13002L +#define ERROR_IPSEC_MM_POLICY_EXISTS 13003L +#define ERROR_IPSEC_MM_POLICY_NOT_FOUND 13004L +#define ERROR_IPSEC_MM_POLICY_IN_USE 13005L +#define ERROR_IPSEC_MM_FILTER_EXISTS 13006L +#define ERROR_IPSEC_MM_FILTER_NOT_FOUND 13007L +#define ERROR_IPSEC_TRANSPORT_FILTER_EXISTS 13008L +#define ERROR_IPSEC_TRANSPORT_FILTER_NOT_FOUND 13009L +#define ERROR_IPSEC_MM_AUTH_EXISTS 13010L +#define ERROR_IPSEC_MM_AUTH_NOT_FOUND 13011L +#define ERROR_IPSEC_MM_AUTH_IN_USE 13012L +#define ERROR_IPSEC_DEFAULT_MM_POLICY_NOT_FOUND 13013L +#define ERROR_IPSEC_DEFAULT_MM_AUTH_NOT_FOUND 13014L +#define ERROR_IPSEC_DEFAULT_QM_POLICY_NOT_FOUND 13015L +#define ERROR_IPSEC_TUNNEL_FILTER_EXISTS 13016L +#define ERROR_IPSEC_TUNNEL_FILTER_NOT_FOUND 13017L +#define ERROR_IPSEC_MM_FILTER_PENDING_DELETION 13018L +#define ERROR_IPSEC_TRANSPORT_FILTER_PENDING_DELETION 13019L +#define ERROR_IPSEC_TUNNEL_FILTER_PENDING_DELETION 13020L +#define ERROR_IPSEC_MM_POLICY_PENDING_DELETION 13021L +#define ERROR_IPSEC_MM_AUTH_PENDING_DELETION 13022L +#define ERROR_IPSEC_QM_POLICY_PENDING_DELETION 13023L +#define WARNING_IPSEC_MM_POLICY_PRUNED 13024L +#define WARNING_IPSEC_QM_POLICY_PRUNED 13025L +#define ERROR_IPSEC_IKE_AUTH_FAIL 13801L +#define ERROR_IPSEC_IKE_ATTRIB_FAIL 13802L +#define ERROR_IPSEC_IKE_NEGOTIATION_PENDING 13803L +#define ERROR_IPSEC_IKE_GENERAL_PROCESSING_ERROR 13804L +#define ERROR_IPSEC_IKE_TIMED_OUT 13805L +#define ERROR_IPSEC_IKE_NO_CERT 13806L +#define ERROR_IPSEC_IKE_SA_DELETED 13807L +#define ERROR_IPSEC_IKE_SA_REAPED 13808L +#define ERROR_IPSEC_IKE_MM_ACQUIRE_DROP 13809L +#define ERROR_IPSEC_IKE_QM_ACQUIRE_DROP 13810L +#define ERROR_IPSEC_IKE_QUEUE_DROP_MM 13811L +#define ERROR_IPSEC_IKE_QUEUE_DROP_NO_MM 13812L +#define ERROR_IPSEC_IKE_DROP_NO_RESPONSE 13813L +#define ERROR_IPSEC_IKE_MM_DELAY_DROP 13814L +#define ERROR_IPSEC_IKE_QM_DELAY_DROP 13815L +#define ERROR_IPSEC_IKE_ERROR 13816L +#define ERROR_IPSEC_IKE_CRL_FAILED 13817L +#define ERROR_IPSEC_IKE_INVALID_KEY_USAGE 13818L +#define ERROR_IPSEC_IKE_INVALID_CERT_TYPE 13819L +#define ERROR_IPSEC_IKE_NO_PRIVATE_KEY 13820L +#define ERROR_IPSEC_IKE_DH_FAIL 13822L +#define ERROR_IPSEC_IKE_INVALID_HEADER 13824L +#define ERROR_IPSEC_IKE_NO_POLICY 13825L +#define ERROR_IPSEC_IKE_INVALID_SIGNATURE 13826L +#define ERROR_IPSEC_IKE_KERBEROS_ERROR 13827L +#define ERROR_IPSEC_IKE_NO_PUBLIC_KEY 13828L +#define ERROR_IPSEC_IKE_PROCESS_ERR 13829L +#define ERROR_IPSEC_IKE_PROCESS_ERR_SA 13830L +#define ERROR_IPSEC_IKE_PROCESS_ERR_PROP 13831L +#define ERROR_IPSEC_IKE_PROCESS_ERR_TRANS 13832L +#define ERROR_IPSEC_IKE_PROCESS_ERR_KE 13833L +#define ERROR_IPSEC_IKE_PROCESS_ERR_ID 13834L +#define ERROR_IPSEC_IKE_PROCESS_ERR_CERT 13835L +#define ERROR_IPSEC_IKE_PROCESS_ERR_CERT_REQ 13836L +#define ERROR_IPSEC_IKE_PROCESS_ERR_HASH 13837L +#define ERROR_IPSEC_IKE_PROCESS_ERR_SIG 13838L +#define ERROR_IPSEC_IKE_PROCESS_ERR_NONCE 13839L +#define ERROR_IPSEC_IKE_PROCESS_ERR_NOTIFY 13840L +#define ERROR_IPSEC_IKE_PROCESS_ERR_DELETE 13841L +#define ERROR_IPSEC_IKE_PROCESS_ERR_VENDOR 13842L +#define ERROR_IPSEC_IKE_INVALID_PAYLOAD 13843L +#define ERROR_IPSEC_IKE_LOAD_SOFT_SA 13844L +#define ERROR_IPSEC_IKE_SOFT_SA_TORN_DOWN 13845L +#define ERROR_IPSEC_IKE_INVALID_COOKIE 13846L +#define ERROR_IPSEC_IKE_NO_PEER_CERT 13847L +#define ERROR_IPSEC_IKE_PEER_CRL_FAILED 13848L +#define ERROR_IPSEC_IKE_POLICY_CHANGE 13849L +#define ERROR_IPSEC_IKE_NO_MM_POLICY 13850L +#define ERROR_IPSEC_IKE_NOTCBPRIV 13851L +#define ERROR_IPSEC_IKE_SECLOADFAIL 13852L +#define ERROR_IPSEC_IKE_FAILSSPINIT 13853L +#define ERROR_IPSEC_IKE_FAILQUERYSSP 13854L +#define ERROR_IPSEC_IKE_SRVACQFAIL 13855L +#define ERROR_IPSEC_IKE_SRVQUERYCRED 13856L +#define ERROR_IPSEC_IKE_GETSPIFAIL 13857L +#define ERROR_IPSEC_IKE_INVALID_FILTER 13858L +#define ERROR_IPSEC_IKE_OUT_OF_MEMORY 13859L +#define ERROR_IPSEC_IKE_ADD_UPDATE_KEY_FAILED 13860L +#define ERROR_IPSEC_IKE_INVALID_POLICY 13861L +#define ERROR_IPSEC_IKE_UNKNOWN_DOI 13862L +#define ERROR_IPSEC_IKE_INVALID_SITUATION 13863L +#define ERROR_IPSEC_IKE_DH_FAILURE 13864L +#define ERROR_IPSEC_IKE_INVALID_GROUP 13865L +#define ERROR_IPSEC_IKE_ENCRYPT 13866L +#define ERROR_IPSEC_IKE_DECRYPT 13867L +#define ERROR_IPSEC_IKE_POLICY_MATCH 13868L +#define ERROR_IPSEC_IKE_UNSUPPORTED_ID 13869L +#define ERROR_IPSEC_IKE_INVALID_HASH 13870L +#define ERROR_IPSEC_IKE_INVALID_HASH_ALG 13871L +#define ERROR_IPSEC_IKE_INVALID_HASH_SIZE 13872L +#define ERROR_IPSEC_IKE_INVALID_ENCRYPT_ALG 13873L +#define ERROR_IPSEC_IKE_INVALID_AUTH_ALG 13874L +#define ERROR_IPSEC_IKE_INVALID_SIG 13875L +#define ERROR_IPSEC_IKE_LOAD_FAILED 13876L +#define ERROR_IPSEC_IKE_RPC_DELETE 13877L +#define ERROR_IPSEC_IKE_BENIGN_REINIT 13878L +#define ERROR_IPSEC_IKE_INVALID_RESPONDER_LIFETIME_NOTIFY 13879L +#define ERROR_IPSEC_IKE_INVALID_CERT_KEYLEN 13881L +#define ERROR_IPSEC_IKE_MM_LIMIT 13882L +#define ERROR_IPSEC_IKE_NEGOTIATION_DISABLED 13883L +#define ERROR_IPSEC_IKE_NEG_STATUS_END 13884L + +#define ERROR_SXS_SECTION_NOT_FOUND 14000L +#define ERROR_SXS_CANT_GEN_ACTCTX 14001L +#define ERROR_SXS_INVALID_ACTCTXDATA_FORMAT 14002L +#define ERROR_SXS_ASSEMBLY_NOT_FOUND 14003L +#define ERROR_SXS_MANIFEST_FORMAT_ERROR 14004L +#define ERROR_SXS_MANIFEST_PARSE_ERROR 14005L +#define ERROR_SXS_ACTIVATION_CONTEXT_DISABLED 14006L +#define ERROR_SXS_KEY_NOT_FOUND 14007L +#define ERROR_SXS_VERSION_CONFLICT 14008L +#define ERROR_SXS_WRONG_SECTION_TYPE 14009L +#define ERROR_SXS_THREAD_QUERIES_DISABLED 14010L +#define ERROR_SXS_PROCESS_DEFAULT_ALREADY_SET 14011L +#define ERROR_SXS_UNKNOWN_ENCODING_GROUP 14012L +#define ERROR_SXS_UNKNOWN_ENCODING 14013L +#define ERROR_SXS_INVALID_XML_NAMESPACE_URI 14014L +#define ERROR_SXS_ROOT_MANIFEST_DEPENDENCY_NOT_INSTALLED 14015L +#define ERROR_SXS_LEAF_MANIFEST_DEPENDENCY_NOT_INSTALLED 14016L +#define ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE 14017L +#define ERROR_SXS_MANIFEST_MISSING_REQUIRED_DEFAULT_NAMESPACE 14018L +#define ERROR_SXS_MANIFEST_INVALID_REQUIRED_DEFAULT_NAMESPACE 14019L +#define ERROR_SXS_PRIVATE_MANIFEST_CROSS_PATH_WITH_REPARSE_POINT 14020L +#define ERROR_SXS_DUPLICATE_DLL_NAME 14021L +#define ERROR_SXS_DUPLICATE_WINDOWCLASS_NAME 14022L +#define ERROR_SXS_DUPLICATE_CLSID 14023L +#define ERROR_SXS_DUPLICATE_IID 14024L +#define ERROR_SXS_DUPLICATE_TLBID 14025L +#define ERROR_SXS_DUPLICATE_PROGID 14026L +#define ERROR_SXS_DUPLICATE_ASSEMBLY_NAME 14027L +#define ERROR_SXS_FILE_HASH_MISMATCH 14028L +#define ERROR_SXS_POLICY_PARSE_ERROR 14029L +#define ERROR_SXS_XML_E_MISSINGQUOTE 14030L +#define ERROR_SXS_XML_E_COMMENTSYNTAX 14031L +#define ERROR_SXS_XML_E_BADSTARTNAMECHAR 14032L +#define ERROR_SXS_XML_E_BADNAMECHAR 14033L +#define ERROR_SXS_XML_E_BADCHARINSTRING 14034L +#define ERROR_SXS_XML_E_XMLDECLSYNTAX 14035L +#define ERROR_SXS_XML_E_BADCHARDATA 14036L +#define ERROR_SXS_XML_E_MISSINGWHITESPACE 14037L +#define ERROR_SXS_XML_E_EXPECTINGTAGEND 14038L +#define ERROR_SXS_XML_E_MISSINGSEMICOLON 14039L +#define ERROR_SXS_XML_E_UNBALANCEDPAREN 14040L +#define ERROR_SXS_XML_E_INTERNALERROR 14041L +#define ERROR_SXS_XML_E_UNEXPECTED_WHITESPACE 14042L +#define ERROR_SXS_XML_E_INCOMPLETE_ENCODING 14043L +#define ERROR_SXS_XML_E_MISSING_PAREN 14044L +#define ERROR_SXS_XML_E_EXPECTINGCLOSEQUOTE 14045L +#define ERROR_SXS_XML_E_MULTIPLE_COLONS 14046L +#define ERROR_SXS_XML_E_INVALID_DECIMAL 14047L +#define ERROR_SXS_XML_E_INVALID_HEXIDECIMAL 14048L +#define ERROR_SXS_XML_E_INVALID_UNICODE 14049L +#define ERROR_SXS_XML_E_WHITESPACEORQUESTIONMARK 14050L +#define ERROR_SXS_XML_E_UNEXPECTEDENDTAG 14051L +#define ERROR_SXS_XML_E_UNCLOSEDTAG 14052L +#define ERROR_SXS_XML_E_DUPLICATEATTRIBUTE 14053L +#define ERROR_SXS_XML_E_MULTIPLEROOTS 14054L +#define ERROR_SXS_XML_E_INVALIDATROOTLEVEL 14055L +#define ERROR_SXS_XML_E_BADXMLDECL 14056L +#define ERROR_SXS_XML_E_MISSINGROOT 14057L +#define ERROR_SXS_XML_E_UNEXPECTEDEOF 14058L +#define ERROR_SXS_XML_E_BADPEREFINSUBSET 14059L +#define ERROR_SXS_XML_E_UNCLOSEDSTARTTAG 14060L +#define ERROR_SXS_XML_E_UNCLOSEDENDTAG 14061L +#define ERROR_SXS_XML_E_UNCLOSEDSTRING 14062L +#define ERROR_SXS_XML_E_UNCLOSEDCOMMENT 14063L +#define ERROR_SXS_XML_E_UNCLOSEDDECL 14064L +#define ERROR_SXS_XML_E_UNCLOSEDCDATA 14065L +#define ERROR_SXS_XML_E_RESERVEDNAMESPACE 14066L +#define ERROR_SXS_XML_E_INVALIDENCODING 14067L +#define ERROR_SXS_XML_E_INVALIDSWITCH 14068L +#define ERROR_SXS_XML_E_BADXMLCASE 14069L +#define ERROR_SXS_XML_E_INVALID_STANDALONE 14070L +#define ERROR_SXS_XML_E_UNEXPECTED_STANDALONE 14071L +#define ERROR_SXS_XML_E_INVALID_VERSION 14072L +#define ERROR_SXS_XML_E_MISSINGEQUALS 14073L +#define ERROR_SXS_PROTECTION_RECOVERY_FAILED 14074L +#define ERROR_SXS_PROTECTION_PUBLIC_KEY_TOO_SHORT 14075L +#define ERROR_SXS_PROTECTION_CATALOG_NOT_VALID 14076L +#define ERROR_SXS_UNTRANSLATABLE_HRESULT 14077L +#define ERROR_SXS_PROTECTION_CATALOG_FILE_MISSING 14078L +#define ERROR_SXS_MISSING_ASSEMBLY_IDENTITY_ATTRIBUTE 14079L +#define ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE_NAME 14080L + +#define SEVERITY_SUCCESS 0 +#define SEVERITY_ERROR 1 +#define FACILITY_WINDOWS 8 +#define FACILITY_STORAGE 3 +#define FACILITY_RPC 1 +#define FACILITY_WIN32 7 +#define FACILITY_CONTROL 10 +#define FACILITY_NULL 0 +#define FACILITY_ITF 4 +#define FACILITY_DISPATCH 2 +#define SUCCEEDED(Status) ((HRESULT)(Status) >= 0) +#define FAILED(Status) ((HRESULT)(Status)<0) +#define IS_ERROR(Status) ((unsigned long)(Status) >> 31 == SEVERITY_ERROR) +#define HRESULT_CODE(r) ((r)&0xFFFF) +#define SCODE_CODE(c) ((c)&0xFFFF) +#define HRESULT_FACILITY(r) (((r)>>16)&0x1fff) +#define SCODE_FACILITY(c) (((c)>>16)&0x1fff) +#define HRESULT_SEVERITY(r) (((r)>>31)&0x1) +#define SCODE_SEVERITY(c) (((c)>>31)&0x1) +#define MAKE_HRESULT(s,f,c) ((HRESULT)(((unsigned long)(s)<<31)|((unsigned long)(f)<<16)|((unsigned long)(c)))) +#define MAKE_SCODE(s,f,c) ((SCODE)(((unsigned long)(s)<<31)|((unsigned long)(f)<<16)|((unsigned long)(c))) ) +#define FACILITY_NT_BIT 0x10000000 +#define HRESULT_FROM_WIN32(x) (x?((HRESULT)(((x)&0x0000FFFF)|(FACILITY_WIN32<<16)|0x80000000)):0) +#define HRESULT_FROM_NT(x) ((HRESULT)((x)|FACILITY_NT_BIT)) +#define GetScode(hr) ((SCODE) (hr)) +#define ResultFromScode(sc) ((HRESULT) (sc)) +#define PropagateResult(hrPrevious, scBase) ((HRESULT) scBase) + +#define NOERROR S_OK +#define E_UNEXPECTED ((HRESULT)0x8000FFFFL) +#define E_NOTIMPL ((HRESULT)0x80004001L) +#define E_OUTOFMEMORY ((HRESULT)0x8007000EL) +#define E_INVALIDARG ((HRESULT)0x80070057L) +#define E_NOINTERFACE ((HRESULT)0x80004002L) +#define E_POINTER ((HRESULT)0x80004003L) +#define E_HANDLE ((HRESULT)0x80070006L) +#define E_ABORT ((HRESULT)0x80004004L) +#define E_FAIL ((HRESULT)0x80004005L) +#define E_ACCESSDENIED ((HRESULT)0x80070005L) +#define E_PENDING ((HRESULT)0x8000000AL) +#define CO_E_INIT_TLS ((HRESULT)0x80004006L) +#define CO_E_INIT_SHARED_ALLOCATOR ((HRESULT)0x80004007L) +#define CO_E_INIT_MEMORY_ALLOCATOR ((HRESULT)0x80004008L) +#define CO_E_INIT_CLASS_CACHE ((HRESULT)0x80004009L) +#define CO_E_INIT_RPC_CHANNEL ((HRESULT)0x8000400AL) +#define CO_E_INIT_TLS_SET_CHANNEL_CONTROL ((HRESULT)0x8000400BL) +#define CO_E_INIT_TLS_CHANNEL_CONTROL ((HRESULT)0x8000400CL) +#define CO_E_INIT_UNACCEPTED_USER_ALLOCATOR ((HRESULT)0x8000400DL) +#define CO_E_INIT_SCM_MUTEX_EXISTS ((HRESULT)0x8000400EL) +#define CO_E_INIT_SCM_FILE_MAPPING_EXISTS ((HRESULT)0x8000400FL) +#define CO_E_INIT_SCM_MAP_VIEW_OF_FILE ((HRESULT)0x80004010L) +#define CO_E_INIT_SCM_EXEC_FAILURE ((HRESULT)0x80004011L) +#define CO_E_INIT_ONLY_SINGLE_THREADED ((HRESULT)0x80004012L) +#define S_OK ((HRESULT)0x00000000L) +#define S_FALSE ((HRESULT)0x00000001L) +#define OLE_E_FIRST ((HRESULT)0x80040000L) +#define OLE_E_LAST ((HRESULT)0x800400FFL) +#define OLE_S_FIRST ((HRESULT)0x00040000L) +#define OLE_S_LAST ((HRESULT)0x000400FFL) +#define OLE_E_OLEVERB ((HRESULT)0x80040000L) +#define OLE_E_ADVF ((HRESULT)0x80040001L) +#define OLE_E_ENUM_NOMORE ((HRESULT)0x80040002L) +#define OLE_E_ADVISENOTSUPPORTED ((HRESULT)0x80040003L) +#define OLE_E_NOCONNECTION ((HRESULT)0x80040004L) +#define OLE_E_NOTRUNNING ((HRESULT)0x80040005L) +#define OLE_E_NOCACHE ((HRESULT)0x80040006L) +#define OLE_E_BLANK ((HRESULT)0x80040007L) +#define OLE_E_CLASSDIFF ((HRESULT)0x80040008L) +#define OLE_E_CANT_GETMONIKER ((HRESULT)0x80040009L) +#define OLE_E_CANT_BINDTOSOURCE ((HRESULT)0x8004000AL) +#define OLE_E_STATIC ((HRESULT)0x8004000BL) +#define OLE_E_PROMPTSAVECANCELLED ((HRESULT)0x8004000CL) +#define OLE_E_INVALIDRECT ((HRESULT)0x8004000DL) +#define OLE_E_WRONGCOMPOBJ ((HRESULT)0x8004000EL) +#define OLE_E_INVALIDHWND ((HRESULT)0x8004000FL) +#define OLE_E_NOT_INPLACEACTIVE ((HRESULT)0x80040010L) +#define OLE_E_CANTCONVERT ((HRESULT)0x80040011L) +#define OLE_E_NOSTORAGE ((HRESULT)0x80040012L) +#define DV_E_FORMATETC ((HRESULT)0x80040064L) +#define DV_E_DVTARGETDEVICE ((HRESULT)0x80040065L) +#define DV_E_STGMEDIUM ((HRESULT)0x80040066L) +#define DV_E_STATDATA ((HRESULT)0x80040067L) +#define DV_E_LINDEX ((HRESULT)0x80040068L) +#define DV_E_TYMED ((HRESULT)0x80040069L) +#define DV_E_CLIPFORMAT ((HRESULT)0x8004006AL) +#define DV_E_DVASPECT ((HRESULT)0x8004006BL) +#define DV_E_DVTARGETDEVICE_SIZE ((HRESULT)0x8004006CL) +#define DV_E_NOIVIEWOBJECT ((HRESULT)0x8004006DL) +#define DRAGDROP_E_FIRST ((HRESULT)0x80040100L) +#define DRAGDROP_E_LAST ((HRESULT)0x8004010FL) +#define DRAGDROP_S_FIRST ((HRESULT)0x00040100L) +#define DRAGDROP_S_LAST ((HRESULT)0x0004010FL) +#define DRAGDROP_E_NOTREGISTERED ((HRESULT)0x80040100L) +#define DRAGDROP_E_ALREADYREGISTERED ((HRESULT)0x80040101L) +#define DRAGDROP_E_INVALIDHWND ((HRESULT)0x80040102L) +#define CLASSFACTORY_E_FIRST ((HRESULT)0x80040110L) +#define CLASSFACTORY_E_LAST ((HRESULT)0x8004011FL) +#define CLASSFACTORY_S_FIRST ((HRESULT)0x00040110L) +#define CLASSFACTORY_S_LAST ((HRESULT)0x0004011FL) +#define CLASS_E_NOAGGREGATION ((HRESULT)0x80040110L) +#define CLASS_E_CLASSNOTAVAILABLE ((HRESULT)0x80040111L) +#define MARSHAL_E_FIRST ((HRESULT)0x80040120L) +#define MARSHAL_E_LAST ((HRESULT)0x8004012FL) +#define MARSHAL_S_FIRST ((HRESULT)0x00040120L) +#define MARSHAL_S_LAST ((HRESULT)0x0004012FL) +#define DATA_E_FIRST ((HRESULT)0x80040130L) +#define DATA_E_LAST ((HRESULT)0x8004013FL) +#define DATA_S_FIRST ((HRESULT)0x00040130L) +#define DATA_S_LAST ((HRESULT)0x0004013FL) +#define VIEW_E_FIRST ((HRESULT)0x80040140L) +#define VIEW_E_LAST ((HRESULT)0x8004014FL) +#define VIEW_S_FIRST ((HRESULT)0x00040140L) +#define VIEW_S_LAST ((HRESULT)0x0004014FL) +#define VIEW_E_DRAW ((HRESULT)0x80040140L) +#define REGDB_E_FIRST ((HRESULT)0x80040150L) +#define REGDB_E_LAST ((HRESULT)0x8004015FL) +#define REGDB_S_FIRST ((HRESULT)0x00040150L) +#define REGDB_S_LAST ((HRESULT)0x0004015FL) +#define REGDB_E_READREGDB ((HRESULT)0x80040150L) +#define REGDB_E_WRITEREGDB ((HRESULT)0x80040151L) +#define REGDB_E_KEYMISSING ((HRESULT)0x80040152L) +#define REGDB_E_INVALIDVALUE ((HRESULT)0x80040153L) +#define REGDB_E_CLASSNOTREG ((HRESULT)0x80040154L) +#define REGDB_E_IIDNOTREG ((HRESULT)0x80040155L) +#define CACHE_E_FIRST ((HRESULT)0x80040170L) +#define CACHE_E_LAST ((HRESULT)0x8004017FL) +#define CACHE_S_FIRST ((HRESULT)0x00040170L) +#define CACHE_S_LAST ((HRESULT)0x0004017FL) +#define CACHE_E_NOCACHE_UPDATED ((HRESULT)0x80040170L) +#define OLEOBJ_E_FIRST ((HRESULT)0x80040180L) +#define OLEOBJ_E_LAST ((HRESULT)0x8004018FL) +#define OLEOBJ_S_FIRST ((HRESULT)0x00040180L) +#define OLEOBJ_S_LAST ((HRESULT)0x0004018FL) +#define OLEOBJ_E_NOVERBS ((HRESULT)0x80040180L) +#define OLEOBJ_E_INVALIDVERB ((HRESULT)0x80040181L) +#define CLIENTSITE_E_FIRST ((HRESULT)0x80040190L) +#define CLIENTSITE_E_LAST ((HRESULT)0x8004019FL) +#define CLIENTSITE_S_FIRST ((HRESULT)0x00040190L) +#define CLIENTSITE_S_LAST ((HRESULT)0x0004019FL) +#define INPLACE_E_NOTUNDOABLE ((HRESULT)0x800401A0L) +#define INPLACE_E_NOTOOLSPACE ((HRESULT)0x800401A1L) +#define INPLACE_E_FIRST ((HRESULT)0x800401A0L) +#define INPLACE_E_LAST ((HRESULT)0x800401AFL) +#define INPLACE_S_FIRST ((HRESULT)0x000401A0L) +#define INPLACE_S_LAST ((HRESULT)0x000401AFL) +#define ENUM_E_FIRST ((HRESULT)0x800401B0L) +#define ENUM_E_LAST ((HRESULT)0x800401BFL) +#define ENUM_S_FIRST ((HRESULT)0x000401B0L) +#define ENUM_S_LAST ((HRESULT)0x000401BFL) +#define CONVERT10_E_FIRST ((HRESULT)0x800401C0L) +#define CONVERT10_E_LAST ((HRESULT)0x800401CFL) +#define CONVERT10_S_FIRST ((HRESULT)0x000401C0L) +#define CONVERT10_S_LAST ((HRESULT)0x000401CFL) +#define CONVERT10_E_OLESTREAM_GET ((HRESULT)0x800401C0L) +#define CONVERT10_E_OLESTREAM_PUT ((HRESULT)0x800401C1L) +#define CONVERT10_E_OLESTREAM_FMT ((HRESULT)0x800401C2L) +#define CONVERT10_E_OLESTREAM_BITMAP_TO_DIB ((HRESULT)0x800401C3L) +#define CONVERT10_E_STG_FMT ((HRESULT)0x800401C4L) +#define CONVERT10_E_STG_NO_STD_STREAM ((HRESULT)0x800401C5L) +#define CONVERT10_E_STG_DIB_TO_BITMAP ((HRESULT)0x800401C6L) +#define CLIPBRD_E_FIRST ((HRESULT)0x800401D0L) +#define CLIPBRD_E_LAST ((HRESULT)0x800401DFL) +#define CLIPBRD_S_FIRST ((HRESULT)0x000401D0L) +#define CLIPBRD_S_LAST ((HRESULT)0x000401DFL) +#define CLIPBRD_E_CANT_OPEN ((HRESULT)0x800401D0L) +#define CLIPBRD_E_CANT_EMPTY ((HRESULT)0x800401D1L) +#define CLIPBRD_E_CANT_SET ((HRESULT)0x800401D2L) +#define CLIPBRD_E_BAD_DATA ((HRESULT)0x800401D3L) +#define CLIPBRD_E_CANT_CLOSE ((HRESULT)0x800401D4L) +#define MK_E_FIRST ((HRESULT)0x800401E0L) +#define MK_E_LAST ((HRESULT)0x800401EFL) +#define MK_S_FIRST ((HRESULT)0x000401E0L) +#define MK_S_LAST ((HRESULT)0x000401EFL) +#define MK_E_CONNECTMANUALLY ((HRESULT)0x800401E0L) +#define MK_E_EXCEEDEDDEADLINE ((HRESULT)0x800401E1L) +#define MK_E_NEEDGENERIC ((HRESULT)0x800401E2L) +#define MK_E_UNAVAILABLE ((HRESULT)0x800401E3L) +#define MK_E_SYNTAX ((HRESULT)0x800401E4L) +#define MK_E_NOOBJECT ((HRESULT)0x800401E5L) +#define MK_E_INVALIDEXTENSION ((HRESULT)0x800401E6L) +#define MK_E_INTERMEDIATEINTERFACENOTSUPPORTED ((HRESULT)0x800401E7L) +#define MK_E_NOTBINDABLE ((HRESULT)0x800401E8L) +#define MK_E_NOTBOUND ((HRESULT)0x800401E9L) +#define MK_E_CANTOPENFILE ((HRESULT)0x800401EAL) +#define MK_E_MUSTBOTHERUSER ((HRESULT)0x800401EBL) +#define MK_E_NOINVERSE ((HRESULT)0x800401ECL) +#define MK_E_NOSTORAGE ((HRESULT)0x800401EDL) +#define MK_E_NOPREFIX ((HRESULT)0x800401EEL) +#define MK_E_ENUMERATION_FAILED ((HRESULT)0x800401EFL) +#define CO_E_FIRST ((HRESULT)0x800401F0L) +#define CO_E_LAST ((HRESULT)0x800401FFL) +#define CO_S_FIRST ((HRESULT)0x000401F0L) +#define CO_S_LAST ((HRESULT)0x000401FFL) +#define CO_E_NOTINITIALIZED ((HRESULT)0x800401F0L) +#define CO_E_ALREADYINITIALIZED ((HRESULT)0x800401F1L) +#define CO_E_CANTDETERMINECLASS ((HRESULT)0x800401F2L) +#define CO_E_CLASSSTRING ((HRESULT)0x800401F3L) +#define CO_E_IIDSTRING ((HRESULT)0x800401F4L) +#define CO_E_APPNOTFOUND ((HRESULT)0x800401F5L) +#define CO_E_APPSINGLEUSE ((HRESULT)0x800401F6L) +#define CO_E_ERRORINAPP ((HRESULT)0x800401F7L) +#define CO_E_DLLNOTFOUND ((HRESULT)0x800401F8L) +#define CO_E_ERRORINDLL ((HRESULT)0x800401F9L) +#define CO_E_WRONGOSFORAPP ((HRESULT)0x800401FAL) +#define CO_E_OBJNOTREG ((HRESULT)0x800401FBL) +#define CO_E_OBJISREG ((HRESULT)0x800401FCL) +#define CO_E_OBJNOTCONNECTED ((HRESULT)0x800401FDL) +#define CO_E_APPDIDNTREG ((HRESULT)0x800401FEL) +#define CO_E_RELEASED ((HRESULT)0x800401FFL) +#define OLE_S_USEREG ((HRESULT)0x00040000L) +#define OLE_S_STATIC ((HRESULT)0x00040001L) +#define OLE_S_MAC_CLIPFORMAT ((HRESULT)0x00040002L) +#define DRAGDROP_S_DROP ((HRESULT)0x00040100L) +#define DRAGDROP_S_CANCEL ((HRESULT)0x00040101L) +#define DRAGDROP_S_USEDEFAULTCURSORS ((HRESULT)0x00040102L) +#define DATA_S_SAMEFORMATETC ((HRESULT)0x00040130L) +#define VIEW_S_ALREADY_FROZEN ((HRESULT)0x00040140L) +#define CACHE_S_FORMATETC_NOTSUPPORTED ((HRESULT)0x00040170L) +#define CACHE_S_SAMECACHE ((HRESULT)0x00040171L) +#define CACHE_S_SOMECACHES_NOTUPDATED ((HRESULT)0x00040172L) +#define OLEOBJ_S_INVALIDVERB ((HRESULT)0x00040180L) +#define OLEOBJ_S_CANNOT_DOVERB_NOW ((HRESULT)0x00040181L) +#define OLEOBJ_S_INVALIDHWND ((HRESULT)0x00040182L) +#define INPLACE_S_TRUNCATED ((HRESULT)0x000401A0L) +#define CONVERT10_S_NO_PRESENTATION ((HRESULT)0x000401C0L) +#define MK_S_REDUCED_TO_SELF ((HRESULT)0x000401E2L) +#define MK_S_ME ((HRESULT)0x000401E4L) +#define MK_S_HIM ((HRESULT)0x000401E5L) +#define MK_S_US ((HRESULT)0x000401E6L) +#define MK_S_MONIKERALREADYREGISTERED ((HRESULT)0x000401E7L) +#define CO_E_CLASS_CREATE_FAILED ((HRESULT)0x80080001L) +#define CO_E_SCM_ERROR ((HRESULT)0x80080002L) +#define CO_E_SCM_RPC_FAILURE ((HRESULT)0x80080003L) +#define CO_E_BAD_PATH ((HRESULT)0x80080004L) +#define CO_E_SERVER_EXEC_FAILURE ((HRESULT)0x80080005L) +#define CO_E_OBJSRV_RPC_FAILURE ((HRESULT)0x80080006L) +#define MK_E_NO_NORMALIZED ((HRESULT)0x80080007L) +#define CO_E_SERVER_STOPPING ((HRESULT)0x80080008L) +#define MEM_E_INVALID_ROOT ((HRESULT)0x80080009L) +#define MEM_E_INVALID_LINK ((HRESULT)0x80080010L) +#define MEM_E_INVALID_SIZE ((HRESULT)0x80080011L) +#define CO_S_NOTALLINTERFACES ((HRESULT)0x00080012L) +#define DISP_E_UNKNOWNINTERFACE ((HRESULT)0x80020001L) +#define DISP_E_MEMBERNOTFOUND ((HRESULT)0x80020003L) +#define DISP_E_PARAMNOTFOUND ((HRESULT)0x80020004L) +#define DISP_E_TYPEMISMATCH ((HRESULT)0x80020005L) +#define DISP_E_UNKNOWNNAME ((HRESULT)0x80020006L) +#define DISP_E_NONAMEDARGS ((HRESULT)0x80020007L) +#define DISP_E_BADVARTYPE ((HRESULT)0x80020008L) +#define DISP_E_EXCEPTION ((HRESULT)0x80020009L) +#define DISP_E_OVERFLOW ((HRESULT)0x8002000AL) +#define DISP_E_BADINDEX ((HRESULT)0x8002000BL) +#define DISP_E_UNKNOWNLCID ((HRESULT)0x8002000CL) +#define DISP_E_ARRAYISLOCKED ((HRESULT)0x8002000DL) +#define DISP_E_BADPARAMCOUNT ((HRESULT)0x8002000EL) +#define DISP_E_PARAMNOTOPTIONAL ((HRESULT)0x8002000FL) +#define DISP_E_BADCALLEE ((HRESULT)0x80020010L) +#define DISP_E_NOTACOLLECTION ((HRESULT)0x80020011L) +#define TYPE_E_BUFFERTOOSMALL ((HRESULT)0x80028016L) +#define TYPE_E_INVDATAREAD ((HRESULT)0x80028018L) +#define TYPE_E_UNSUPFORMAT ((HRESULT)0x80028019L) +#define TYPE_E_REGISTRYACCESS ((HRESULT)0x8002801CL) +#define TYPE_E_LIBNOTREGISTERED ((HRESULT)0x8002801DL) +#define TYPE_E_UNDEFINEDTYPE ((HRESULT)0x80028027L) +#define TYPE_E_QUALIFIEDNAMEDISALLOWED ((HRESULT)0x80028028L) +#define TYPE_E_INVALIDSTATE ((HRESULT)0x80028029L) +#define TYPE_E_WRONGTYPEKIND ((HRESULT)0x8002802AL) +#define TYPE_E_ELEMENTNOTFOUND ((HRESULT)0x8002802BL) +#define TYPE_E_AMBIGUOUSNAME ((HRESULT)0x8002802CL) +#define TYPE_E_NAMECONFLICT ((HRESULT)0x8002802DL) +#define TYPE_E_UNKNOWNLCID ((HRESULT)0x8002802EL) +#define TYPE_E_DLLFUNCTIONNOTFOUND ((HRESULT)0x8002802FL) +#define TYPE_E_BADMODULEKIND ((HRESULT)0x800288BDL) +#define TYPE_E_SIZETOOBIG ((HRESULT)0x800288C5L) +#define TYPE_E_DUPLICATEID ((HRESULT)0x800288C6L) +#define TYPE_E_INVALIDID ((HRESULT)0x800288CFL) +#define TYPE_E_TYPEMISMATCH ((HRESULT)0x80028CA0L) +#define TYPE_E_OUTOFBOUNDS ((HRESULT)0x80028CA1L) +#define TYPE_E_IOERROR ((HRESULT)0x80028CA2L) +#define TYPE_E_CANTCREATETMPFILE ((HRESULT)0x80028CA3L) +#define TYPE_E_CANTLOADLIBRARY ((HRESULT)0x80029C4AL) +#define TYPE_E_INCONSISTENTPROPFUNCS ((HRESULT)0x80029C83L) +#define TYPE_E_CIRCULARTYPE ((HRESULT)0x80029C84L) +#define STG_E_INVALIDFUNCTION ((HRESULT)0x80030001L) +#define STG_E_FILENOTFOUND ((HRESULT)0x80030002L) +#define STG_E_PATHNOTFOUND ((HRESULT)0x80030003L) +#define STG_E_TOOMANYOPENFILES ((HRESULT)0x80030004L) +#define STG_E_ACCESSDENIED ((HRESULT)0x80030005L) +#define STG_E_INVALIDHANDLE ((HRESULT)0x80030006L) +#define STG_E_INSUFFICIENTMEMORY ((HRESULT)0x80030008L) +#define STG_E_INVALIDPOINTER ((HRESULT)0x80030009L) +#define STG_E_NOMOREFILES ((HRESULT)0x80030012L) +#define STG_E_DISKISWRITEPROTECTED ((HRESULT)0x80030013L) +#define STG_E_SEEKERROR ((HRESULT)0x80030019L) +#define STG_E_WRITEFAULT ((HRESULT)0x8003001DL) +#define STG_E_READFAULT ((HRESULT)0x8003001EL) +#define STG_E_SHAREVIOLATION ((HRESULT)0x80030020L) +#define STG_E_LOCKVIOLATION ((HRESULT)0x80030021L) +#define STG_E_FILEALREADYEXISTS ((HRESULT)0x80030050L) +#define STG_E_INVALIDPARAMETER ((HRESULT)0x80030057L) +#define STG_E_MEDIUMFULL ((HRESULT)0x80030070L) +#define STG_E_ABNORMALAPIEXIT ((HRESULT)0x800300FAL) +#define STG_E_INVALIDHEADER ((HRESULT)0x800300FBL) +#define STG_E_INVALIDNAME ((HRESULT)0x800300FCL) +#define STG_E_UNKNOWN ((HRESULT)0x800300FDL) +#define STG_E_UNIMPLEMENTEDFUNCTION ((HRESULT)0x800300FEL) +#define STG_E_INVALIDFLAG ((HRESULT)0x800300FFL) +#define STG_E_INUSE ((HRESULT)0x80030100L) +#define STG_E_NOTCURRENT ((HRESULT)0x80030101L) +#define STG_E_REVERTED ((HRESULT)0x80030102L) +#define STG_E_CANTSAVE ((HRESULT)0x80030103L) +#define STG_E_OLDFORMAT ((HRESULT)0x80030104L) +#define STG_E_OLDDLL ((HRESULT)0x80030105L) +#define STG_E_SHAREREQUIRED ((HRESULT)0x80030106L) +#define STG_E_NOTFILEBASEDSTORAGE ((HRESULT)0x80030107L) +#define STG_E_EXTANTMARSHALLINGS ((HRESULT)0x80030108L) +#define STG_S_CONVERTED ((HRESULT)0x00030200L) +#define RPC_E_CALL_REJECTED ((HRESULT)0x80010001L) +#define RPC_E_CALL_CANCELED ((HRESULT)0x80010002L) +#define RPC_E_CANTPOST_INSENDCALL ((HRESULT)0x80010003L) +#define RPC_E_CANTCALLOUT_INASYNCCALL ((HRESULT)0x80010004L) +#define RPC_E_CANTCALLOUT_INEXTERNALCALL ((HRESULT)0x80010005L) +#define RPC_E_CONNECTION_TERMINATED ((HRESULT)0x80010006L) +#define RPC_E_SERVER_DIED ((HRESULT)0x80010007L) +#define RPC_E_CLIENT_DIED ((HRESULT)0x80010008L) +#define RPC_E_INVALID_DATAPACKET ((HRESULT)0x80010009L) +#define RPC_E_CANTTRANSMIT_CALL ((HRESULT)0x8001000AL) +#define RPC_E_CLIENT_CANTMARSHAL_DATA ((HRESULT)0x8001000BL) +#define RPC_E_CLIENT_CANTUNMARSHAL_DATA ((HRESULT)0x8001000CL) +#define RPC_E_SERVER_CANTMARSHAL_DATA ((HRESULT)0x8001000DL) +#define RPC_E_SERVER_CANTUNMARSHAL_DATA ((HRESULT)0x8001000EL) +#define RPC_E_INVALID_DATA ((HRESULT)0x8001000FL) +#define RPC_E_INVALID_PARAMETER ((HRESULT)0x80010010L) +#define RPC_E_CANTCALLOUT_AGAIN ((HRESULT)0x80010011L) +#define RPC_E_SERVER_DIED_DNE ((HRESULT)0x80010012L) +#define RPC_E_SYS_CALL_FAILED ((HRESULT)0x80010100L) +#define RPC_E_OUT_OF_RESOURCES ((HRESULT)0x80010101L) +#define RPC_E_ATTEMPTED_MULTITHREAD ((HRESULT)0x80010102L) +#define RPC_E_NOT_REGISTERED ((HRESULT)0x80010103L) +#define RPC_E_FAULT ((HRESULT)0x80010104L) +#define RPC_E_SERVERFAULT ((HRESULT)0x80010105L) +#define RPC_E_CHANGED_MODE ((HRESULT)0x80010106L) +#define RPC_E_INVALIDMETHOD ((HRESULT)0x80010107L) +#define RPC_E_DISCONNECTED ((HRESULT)0x80010108L) +#define RPC_E_RETRY ((HRESULT)0x80010109L) +#define RPC_E_SERVERCALL_RETRYLATER ((HRESULT)0x8001010AL) +#define RPC_E_SERVERCALL_REJECTED ((HRESULT)0x8001010BL) +#define RPC_E_INVALID_CALLDATA ((HRESULT)0x8001010CL) +#define RPC_E_CANTCALLOUT_ININPUTSYNCCALL ((HRESULT)0x8001010DL) +#define RPC_E_WRONG_THREAD ((HRESULT)0x8001010EL) +#define RPC_E_THREAD_NOT_INIT ((HRESULT)0x8001010FL) +#define RPC_E_UNEXPECTED ((HRESULT)0x8001FFFFL) + +#define NTE_BAD_UID ((HRESULT)0x80090001L) +#define NTE_BAD_HASH ((HRESULT)0x80090002L) +#define NTE_BAD_KEY ((HRESULT)0x80090003L) +#define NTE_BAD_LEN ((HRESULT)0x80090004L) +#define NTE_BAD_DATA ((HRESULT)0x80090005L) +#define NTE_BAD_SIGNATURE ((HRESULT)0x80090006L) +#define NTE_BAD_VER ((HRESULT)0x80090007L) +#define NTE_BAD_ALGID ((HRESULT)0x80090008L) +#define NTE_BAD_FLAGS ((HRESULT)0x80090009L) +#define NTE_BAD_TYPE ((HRESULT)0x8009000AL) +#define NTE_BAD_KEY_STATE ((HRESULT)0x8009000BL) +#define NTE_BAD_HASH_STATE ((HRESULT)0x8009000CL) +#define NTE_NO_KEY ((HRESULT)0x8009000DL) +#define NTE_NO_MEMORY ((HRESULT)0x8009000EL) +#define NTE_EXISTS ((HRESULT)0x8009000FL) +#define NTE_PERM ((HRESULT)0x80090010L) +#define NTE_NOT_FOUND ((HRESULT)0x80090011L) +#define NTE_DOUBLE_ENCRYPT ((HRESULT)0x80090012L) +#define NTE_BAD_PROVIDER ((HRESULT)0x80090013L) +#define NTE_BAD_PROV_TYPE ((HRESULT)0x80090014L) +#define NTE_BAD_PUBLIC_KEY ((HRESULT)0x80090015L) +#define NTE_BAD_KEYSET ((HRESULT)0x80090016L) +#define NTE_PROV_TYPE_NOT_DEF ((HRESULT)0x80090017L) +#define NTE_PROV_TYPE_ENTRY_BAD ((HRESULT)0x80090018L) +#define NTE_KEYSET_NOT_DEF ((HRESULT)0x80090019L) +#define NTE_KEYSET_ENTRY_BAD ((HRESULT)0x8009001AL) +#define NTE_PROV_TYPE_NO_MATCH ((HRESULT)0x8009001BL) +#define NTE_SIGNATURE_FILE_BAD ((HRESULT)0x8009001CL) +#define NTE_PROVIDER_DLL_FAIL ((HRESULT)0x8009001DL) +#define NTE_PROV_DLL_NOT_FOUND ((HRESULT)0x8009001EL) +#define NTE_BAD_KEYSET_PARAM ((HRESULT)0x8009001FL) +#define NTE_FAIL ((HRESULT)0x80090020L) +#define NTE_SYS_ERR ((HRESULT)0x80090021L) +/* #define NTE_TOKEN_KEYSET_STORAGE ??? */ + +#endif diff --git a/reactos/w32api/include/wingdi.h b/reactos/w32api/include/wingdi.h new file mode 100644 index 00000000000..5c5f9a0844f --- /dev/null +++ b/reactos/w32api/include/wingdi.h @@ -0,0 +1,2981 @@ +#ifndef _WINGDI_H +#define _WINGDI_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define WINGDIAPI +#define BI_RGB 0 +#define BI_RLE8 1 +#define BI_RLE4 2 +#define BI_BITFIELDS 3 +#define BI_JPEG 4 +#define BI_PNG 5 +#define LF_FACESIZE 32 +#define LF_FULLFACESIZE 64 +#define CA_NEGATIVE 1 +#define CA_LOG_FILTER 2 +#define ILLUMINANT_DEVICE_DEFAULT 0 +#define ILLUMINANT_A 1 +#define ILLUMINANT_B 2 +#define ILLUMINANT_C 3 +#define ILLUMINANT_D50 4 +#define ILLUMINANT_D55 5 +#define ILLUMINANT_D65 6 +#define ILLUMINANT_D75 7 +#define ILLUMINANT_F2 8 +#define ILLUMINANT_MAX_INDEX ILLUMINANT_F2 +#define ILLUMINANT_TUNGSTEN ILLUMINANT_A +#define ILLUMINANT_DAYLIGHT ILLUMINANT_C +#define ILLUMINANT_FLUORESCENT ILLUMINANT_F2 +#define ILLUMINANT_NTSC ILLUMINANT_C +#define RGB_GAMMA_MIN 2500 +#define RGB_GAMMA_MAX 65000 +#define REFERENCE_WHITE_MIN 6000 +#define REFERENCE_WHITE_MAX 10000 +#define REFERENCE_BLACK_MIN 0 +#define REFERENCE_BLACK_MAX 4000 +#define COLOR_ADJ_MIN (-100) +#define COLOR_ADJ_MAX 100 +#define CCHDEVICENAME 32 +#define CCHFORMNAME 32 +#define DI_COMPAT 4 +#define DI_DEFAULTSIZE 8 +#define DI_IMAGE 2 +#define DI_MASK 1 +#define DI_NORMAL 3 +#define DI_APPBANDING 1 +#define EMR_HEADER 1 +#define EMR_POLYBEZIER 2 +#define EMR_POLYGON 3 +#define EMR_POLYLINE 4 +#define EMR_POLYBEZIERTO 5 +#define EMR_POLYLINETO 6 +#define EMR_POLYPOLYLINE 7 +#define EMR_POLYPOLYGON 8 +#define EMR_SETWINDOWEXTEX 9 +#define EMR_SETWINDOWORGEX 10 +#define EMR_SETVIEWPORTEXTEX 11 +#define EMR_SETVIEWPORTORGEX 12 +#define EMR_SETBRUSHORGEX 13 +#define EMR_EOF 14 +#define EMR_SETPIXELV 15 +#define EMR_SETMAPPERFLAGS 16 +#define EMR_SETMAPMODE 17 +#define EMR_SETBKMODE 18 +#define EMR_SETPOLYFILLMODE 19 +#define EMR_SETROP2 20 +#define EMR_SETSTRETCHBLTMODE 21 +#define EMR_SETTEXTALIGN 22 +#define EMR_SETCOLORADJUSTMENT 23 +#define EMR_SETTEXTCOLOR 24 +#define EMR_SETBKCOLOR 25 +#define EMR_OFFSETCLIPRGN 26 +#define EMR_MOVETOEX 27 +#define EMR_SETMETARGN 28 +#define EMR_EXCLUDECLIPRECT 29 +#define EMR_INTERSECTCLIPRECT 30 +#define EMR_SCALEVIEWPORTEXTEX 31 +#define EMR_SCALEWINDOWEXTEX 32 +#define EMR_SAVEDC 33 +#define EMR_RESTOREDC 34 +#define EMR_SETWORLDTRANSFORM 35 +#define EMR_MODIFYWORLDTRANSFORM 36 +#define EMR_SELECTOBJECT 37 +#define EMR_CREATEPEN 38 +#define EMR_CREATEBRUSHINDIRECT 39 +#define EMR_DELETEOBJECT 40 +#define EMR_ANGLEARC 41 +#define EMR_ELLIPSE 42 +#define EMR_RECTANGLE 43 +#define EMR_ROUNDRECT 44 +#define EMR_ARC 45 +#define EMR_CHORD 46 +#define EMR_PIE 47 +#define EMR_SELECTPALETTE 48 +#define EMR_CREATEPALETTE 49 +#define EMR_SETPALETTEENTRIES 50 +#define EMR_RESIZEPALETTE 51 +#define EMR_REALIZEPALETTE 52 +#define EMR_EXTFLOODFILL 53 +#define EMR_LINETO 54 +#define EMR_ARCTO 55 +#define EMR_POLYDRAW 56 +#define EMR_SETARCDIRECTION 57 +#define EMR_SETMITERLIMIT 58 +#define EMR_BEGINPATH 59 +#define EMR_ENDPATH 60 +#define EMR_CLOSEFIGURE 61 +#define EMR_FILLPATH 62 +#define EMR_STROKEANDFILLPATH 63 +#define EMR_STROKEPATH 64 +#define EMR_FLATTENPATH 65 +#define EMR_WIDENPATH 66 +#define EMR_SELECTCLIPPATH 67 +#define EMR_ABORTPATH 68 +#define EMR_GDICOMMENT 70 +#define EMR_FILLRGN 71 +#define EMR_FRAMERGN 72 +#define EMR_INVERTRGN 73 +#define EMR_PAINTRGN 74 +#define EMR_EXTSELECTCLIPRGN 75 +#define EMR_BITBLT 76 +#define EMR_STRETCHBLT 77 +#define EMR_MASKBLT 78 +#define EMR_PLGBLT 79 +#define EMR_SETDIBITSTODEVICE 80 +#define EMR_STRETCHDIBITS 81 +#define EMR_EXTCREATEFONTINDIRECTW 82 +#define EMR_EXTTEXTOUTA 83 +#define EMR_EXTTEXTOUTW 84 +#define EMR_POLYBEZIER16 85 +#define EMR_POLYGON16 86 +#define EMR_POLYLINE16 87 +#define EMR_POLYBEZIERTO16 88 +#define EMR_POLYLINETO16 89 +#define EMR_POLYPOLYLINE16 90 +#define EMR_POLYPOLYGON16 91 +#define EMR_POLYDRAW16 92 +#define EMR_CREATEMONOBRUSH 93 +#define EMR_CREATEDIBPATTERNBRUSHPT 94 +#define EMR_EXTCREATEPEN 95 +#define EMR_POLYTEXTOUTA 96 +#define EMR_POLYTEXTOUTW 97 +#define EMR_SETICMMODE 98 +#define EMR_CREATECOLORSPACE 99 +#define EMR_SETCOLORSPACE 100 +#define EMR_DELETECOLORSPACE 101 +#define EMR_GLSRECORD 102 +#define EMR_GLSBOUNDEDRECORD 103 +#define EMR_PIXELFORMAT 104 +#define ENHMETA_SIGNATURE 1179469088 +#define EPS_SIGNATURE 0x46535045 +#if (_WIN32_WINNT >= 0x0500) +#define FR_PRIVATE 0x10 +#define FR_NOT_ENUM 0x20 +#endif +#define META_SETBKCOLOR 0x201 +#define META_SETBKMODE 0x102 +#define META_SETMAPMODE 0x103 +#define META_SETROP2 0x104 +#define META_SETRELABS 0x105 +#define META_SETPOLYFILLMODE 0x106 +#define META_SETSTRETCHBLTMODE 0x107 +#define META_SETTEXTCHAREXTRA 0x108 +#define META_SETTEXTCOLOR 0x209 +#define META_SETTEXTJUSTIFICATION 0x20A +#define META_SETWINDOWORG 0x20B +#define META_SETWINDOWEXT 0x20C +#define META_SETVIEWPORTORG 0x20D +#define META_SETVIEWPORTEXT 0x20E +#define META_OFFSETWINDOWORG 0x20F +#define META_SCALEWINDOWEXT 0x410 +#define META_OFFSETVIEWPORTORG 0x211 +#define META_SCALEVIEWPORTEXT 0x412 +#define META_LINETO 0x213 +#define META_MOVETO 0x214 +#define META_EXCLUDECLIPRECT 0x415 +#define META_INTERSECTCLIPRECT 0x416 +#define META_ARC 0x817 +#define META_ELLIPSE 0x418 +#define META_FLOODFILL 0x419 +#define META_PIE 0x81A +#define META_RECTANGLE 0x41B +#define META_ROUNDRECT 0x61C +#define META_PATBLT 0x61D +#define META_SAVEDC 0x1E +#define META_SETPIXEL 0x41F +#define META_OFFSETCLIPRGN 0x220 +#define META_TEXTOUT 0x521 +#define META_BITBLT 0x922 +#define META_STRETCHBLT 0xB23 +#define META_POLYGON 0x324 +#define META_POLYLINE 0x325 +#define META_ESCAPE 0x626 +#define META_RESTOREDC 0x127 +#define META_FILLREGION 0x228 +#define META_FRAMEREGION 0x429 +#define META_INVERTREGION 0x12A +#define META_PAINTREGION 0x12B +#define META_SELECTCLIPREGION 0x12C +#define META_SELECTOBJECT 0x12D +#define META_SETTEXTALIGN 0x12E +#define META_CHORD 0x830 +#define META_SETMAPPERFLAGS 0x231 +#define META_EXTTEXTOUT 0xa32 +#define META_SETDIBTODEV 0xd33 +#define META_SELECTPALETTE 0x234 +#define META_REALIZEPALETTE 0x35 +#define META_ANIMATEPALETTE 0x436 +#define META_SETPALENTRIES 0x37 +#define META_POLYPOLYGON 0x538 +#define META_RESIZEPALETTE 0x139 +#define META_DIBBITBLT 0x940 +#define META_DIBSTRETCHBLT 0xb41 +#define META_DIBCREATEPATTERNBRUSH 0x142 +#define META_STRETCHDIB 0xf43 +#define META_EXTFLOODFILL 0x548 +#define META_DELETEOBJECT 0x1f0 +#define META_CREATEPALETTE 0xf7 +#define META_CREATEPATTERNBRUSH 0x1F9 +#define META_CREATEPENINDIRECT 0x2FA +#define META_CREATEFONTINDIRECT 0x2FB +#define META_CREATEBRUSHINDIRECT 0x2FC +#define META_CREATEREGION 0x6FF +#define PT_MOVETO 6 +#define PT_LINETO 2 +#define PT_BEZIERTO 4 +#define PT_CLOSEFIGURE 1 +#define ELF_VENDOR_SIZE 4 +#define ELF_VERSION 0 +#define ELF_CULTURE_LATIN 0 +#define PFD_TYPE_RGBA 0 +#define PFD_TYPE_COLORINDEX 1 +#define PFD_MAIN_PLANE 0 +#define PFD_OVERLAY_PLANE 1 +#define PFD_UNDERLAY_PLANE (-1) +#define PFD_DOUBLEBUFFER 1 +#define PFD_STEREO 2 +#define PFD_DRAW_TO_WINDOW 4 +#define PFD_DRAW_TO_BITMAP 8 +#define PFD_SUPPORT_GDI 16 +#define PFD_SUPPORT_OPENGL 32 +#define PFD_GENERIC_FORMAT 64 +#define PFD_NEED_PALETTE 128 +#define PFD_NEED_SYSTEM_PALETTE 0x00000100 +#define PFD_SWAP_EXCHANGE 0x00000200 +#define PFD_SWAP_COPY 0x00000400 +#define PFD_SWAP_LAYER_BUFFERS 0x00000800 +#define PFD_GENERIC_ACCELERATED 0x00001000 +#define PFD_DEPTH_DONTCARE 0x20000000 +#define PFD_DOUBLEBUFFER_DONTCARE 0x40000000 +#define PFD_STEREO_DONTCARE 0x80000000 +#define SP_ERROR (-1) +#define SP_OUTOFDISK (-4) +#define SP_OUTOFMEMORY (-5) +#define SP_USERABORT (-3) +#define SP_APPABORT (-2) +#define BLACKNESS 0x42 +#define NOTSRCERASE 0x1100A6 +#define NOTSRCCOPY 0x330008 +#define SRCERASE 0x440328 +#define DSTINVERT 0x550009 +#define PATINVERT 0x5A0049 +#define SRCINVERT 0x660046 +#define SRCAND 0x8800C6 +#define MERGEPAINT 0xBB0226 +#define MERGECOPY 0xC000CA +#define SRCCOPY 0xCC0020 +#define SRCPAINT 0xEE0086 +#define PATCOPY 0xF00021 +#define PATPAINT 0xFB0A09 +#define WHITENESS 0xFF0062 +#define R2_BLACK 1 +#define R2_COPYPEN 13 +#define R2_MASKNOTPEN 3 +#define R2_MASKPEN 9 +#define R2_MASKPENNOT 5 +#define R2_MERGENOTPEN 12 +#define R2_MERGEPEN 15 +#define R2_MERGEPENNOT 14 +#define R2_NOP 11 +#define R2_NOT 6 +#define R2_NOTCOPYPEN 4 +#define R2_NOTMASKPEN 8 +#define R2_NOTMERGEPEN 2 +#define R2_NOTXORPEN 10 +#define R2_WHITE 16 +#define R2_XORPEN 7 +#define CM_OUT_OF_GAMUT 255 +#define CM_IN_GAMUT 0 +#define RGN_AND 1 +#define RGN_COPY 5 +#define RGN_DIFF 4 +#define RGN_OR 2 +#define RGN_XOR 3 +#define NULLREGION 1 +#define SIMPLEREGION 2 +#define COMPLEXREGION 3 +#define ERROR 0 +#define CBM_INIT 4 +#define DIB_PAL_COLORS 1 +#define DIB_RGB_COLORS 0 +#define FW_DONTCARE 0 +#define FW_THIN 100 +#define FW_EXTRALIGHT 200 +#define FW_ULTRALIGHT FW_EXTRALIGHT +#define FW_LIGHT 300 +#define FW_NORMAL 400 +#define FW_REGULAR 400 +#define FW_MEDIUM 500 +#define FW_SEMIBOLD 600 +#define FW_DEMIBOLD FW_SEMIBOLD +#define FW_BOLD 700 +#define FW_EXTRABOLD 800 +#define FW_ULTRABOLD FW_EXTRABOLD +#define FW_HEAVY 900 +#define FW_BLACK FW_HEAVY +#define ANSI_CHARSET 0 +#define DEFAULT_CHARSET 1 +#define SYMBOL_CHARSET 2 +#define SHIFTJIS_CHARSET 128 +#define HANGEUL_CHARSET 129 +#define HANGUL_CHARSET 129 +#define GB2312_CHARSET 134 +#define CHINESEBIG5_CHARSET 136 +#define GREEK_CHARSET 161 +#define TURKISH_CHARSET 162 +#define HEBREW_CHARSET 177 +#define ARABIC_CHARSET 178 +#define BALTIC_CHARSET 186 +#define RUSSIAN_CHARSET 204 +#define THAI_CHARSET 222 +#define EASTEUROPE_CHARSET 238 +#define OEM_CHARSET 255 +#define JOHAB_CHARSET 130 +#define VIETNAMESE_CHARSET 163 +#define MAC_CHARSET 77 +#define OUT_DEFAULT_PRECIS 0 +#define OUT_STRING_PRECIS 1 +#define OUT_CHARACTER_PRECIS 2 +#define OUT_STROKE_PRECIS 3 +#define OUT_TT_PRECIS 4 +#define OUT_DEVICE_PRECIS 5 +#define OUT_RASTER_PRECIS 6 +#define OUT_TT_ONLY_PRECIS 7 +#define OUT_OUTLINE_PRECIS 8 +#define CLIP_DEFAULT_PRECIS 0 +#define CLIP_CHARACTER_PRECIS 1 +#define CLIP_STROKE_PRECIS 2 +#define CLIP_MASK 15 +#define CLIP_LH_ANGLES 16 +#define CLIP_TT_ALWAYS 32 +#define CLIP_EMBEDDED 128 +#define DEFAULT_QUALITY 0 +#define DRAFT_QUALITY 1 +#define PROOF_QUALITY 2 +#define NONANTIALIASED_QUALITY 3 +#define ANTIALIASED_QUALITY 4 +#define DEFAULT_PITCH 0 +#define FIXED_PITCH 1 +#define VARIABLE_PITCH 2 +#define MONO_FONT 8 +#define FF_DECORATIVE 80 +#define FF_DONTCARE 0 +#define FF_MODERN 48 +#define FF_ROMAN 16 +#define FF_SCRIPT 64 +#define FF_SWISS 32 +#define PANOSE_COUNT 10 +#define PAN_FAMILYTYPE_INDEX 0 +#define PAN_SERIFSTYLE_INDEX 1 +#define PAN_WEIGHT_INDEX 2 +#define PAN_PROPORTION_INDEX 3 +#define PAN_CONTRAST_INDEX 4 +#define PAN_STROKEVARIATION_INDEX 5 +#define PAN_ARMSTYLE_INDEX 6 +#define PAN_LETTERFORM_INDEX 7 +#define PAN_MIDLINE_INDEX 8 +#define PAN_XHEIGHT_INDEX 9 +#define PAN_CULTURE_LATIN 0 +#define PAN_ANY 0 +#define PAN_NO_FIT 1 +#define PAN_FAMILY_TEXT_DISPLAY 2 +#define PAN_FAMILY_SCRIPT 3 +#define PAN_FAMILY_DECORATIVE 4 +#define PAN_FAMILY_PICTORIAL 5 +#define PAN_SERIF_COVE 2 +#define PAN_SERIF_OBTUSE_COVE 3 +#define PAN_SERIF_SQUARE_COVE 4 +#define PAN_SERIF_OBTUSE_SQUARE_COVE 5 +#define PAN_SERIF_SQUARE 6 +#define PAN_SERIF_THIN 7 +#define PAN_SERIF_BONE 8 +#define PAN_SERIF_EXAGGERATED 9 +#define PAN_SERIF_TRIANGLE 10 +#define PAN_SERIF_NORMAL_SANS 11 +#define PAN_SERIF_OBTUSE_SANS 12 +#define PAN_SERIF_PERP_SANS 13 +#define PAN_SERIF_FLARED 14 +#define PAN_SERIF_ROUNDED 15 +#define PAN_WEIGHT_VERY_LIGHT 2 +#define PAN_WEIGHT_LIGHT 3 +#define PAN_WEIGHT_THIN 4 +#define PAN_WEIGHT_BOOK 5 +#define PAN_WEIGHT_MEDIUM 6 +#define PAN_WEIGHT_DEMI 7 +#define PAN_WEIGHT_BOLD 8 +#define PAN_WEIGHT_HEAVY 9 +#define PAN_WEIGHT_BLACK 10 +#define PAN_WEIGHT_NORD 11 +#define PAN_PROP_OLD_STYLE 2 +#define PAN_PROP_MODERN 3 +#define PAN_PROP_EVEN_WIDTH 4 +#define PAN_PROP_EXPANDED 5 +#define PAN_PROP_CONDENSED 6 +#define PAN_PROP_VERY_EXPANDED 7 +#define PAN_PROP_VERY_CONDENSED 8 +#define PAN_PROP_MONOSPACED 9 +#define PAN_CONTRAST_NONE 2 +#define PAN_CONTRAST_VERY_LOW 3 +#define PAN_CONTRAST_LOW 4 +#define PAN_CONTRAST_MEDIUM_LOW 5 +#define PAN_CONTRAST_MEDIUM 6 +#define PAN_CONTRAST_MEDIUM_HIGH 7 +#define PAN_CONTRAST_HIGH 8 +#define PAN_CONTRAST_VERY_HIGH 9 +#define PAN_STROKE_GRADUAL_DIAG 2 +#define PAN_STROKE_GRADUAL_TRAN 3 +#define PAN_STROKE_GRADUAL_VERT 4 +#define PAN_STROKE_GRADUAL_HORZ 5 +#define PAN_STROKE_RAPID_VERT 6 +#define PAN_STROKE_RAPID_HORZ 7 +#define PAN_STROKE_INSTANT_VERT 8 +#define PAN_STRAIGHT_ARMS_HORZ 2 +#define PAN_STRAIGHT_ARMS_WEDGE 3 +#define PAN_STRAIGHT_ARMS_VERT 4 +#define PAN_STRAIGHT_ARMS_SINGLE_SERIF 5 +#define PAN_STRAIGHT_ARMS_DOUBLE_SERIF 6 +#define PAN_BENT_ARMS_HORZ 7 +#define PAN_BENT_ARMS_WEDGE 8 +#define PAN_BENT_ARMS_VERT 9 +#define PAN_BENT_ARMS_SINGLE_SERIF 10 +#define PAN_BENT_ARMS_DOUBLE_SERIF 11 +#define PAN_LETT_NORMAL_CONTACT 2 +#define PAN_LETT_NORMAL_WEIGHTED 3 +#define PAN_LETT_NORMAL_BOXED 4 +#define PAN_LETT_NORMAL_FLATTENED 5 +#define PAN_LETT_NORMAL_ROUNDED 6 +#define PAN_LETT_NORMAL_OFF_CENTER 7 +#define PAN_LETT_NORMAL_SQUARE 8 +#define PAN_LETT_OBLIQUE_CONTACT 9 +#define PAN_LETT_OBLIQUE_WEIGHTED 10 +#define PAN_LETT_OBLIQUE_BOXED 11 +#define PAN_LETT_OBLIQUE_FLATTENED 12 +#define PAN_LETT_OBLIQUE_ROUNDED 13 +#define PAN_LETT_OBLIQUE_OFF_CENTER 14 +#define PAN_LETT_OBLIQUE_SQUARE 15 +#define PAN_MIDLINE_STANDARD_TRIMMED 2 +#define PAN_MIDLINE_STANDARD_POINTED 3 +#define PAN_MIDLINE_STANDARD_SERIFED 4 +#define PAN_MIDLINE_HIGH_TRIMMED 5 +#define PAN_MIDLINE_HIGH_POINTED 6 +#define PAN_MIDLINE_HIGH_SERIFED 7 +#define PAN_MIDLINE_CONSTANT_TRIMMED 8 +#define PAN_MIDLINE_CONSTANT_POINTED 9 +#define PAN_MIDLINE_CONSTANT_SERIFED 10 +#define PAN_MIDLINE_LOW_TRIMMED 11 +#define PAN_MIDLINE_LOW_POINTED 12 +#define PAN_MIDLINE_LOW_SERIFED 13 +#define PAN_XHEIGHT_CONSTANT_SMALL 2 +#define PAN_XHEIGHT_CONSTANT_STD 3 +#define PAN_XHEIGHT_CONSTANT_LARGE 4 +#define PAN_XHEIGHT_DUCKING_SMALL 5 +#define PAN_XHEIGHT_DUCKING_STD 6 +#define PAN_XHEIGHT_DUCKING_LARGE 7 +#define FS_LATIN1 1 +#define FS_LATIN2 2 +#define FS_CYRILLIC 4 +#define FS_GREEK 8 +#define FS_TURKISH 16 +#define FS_HEBREW 32 +#define FS_ARABIC 64 +#define FS_BALTIC 128 +#define FS_THAI 0x10000 +#define FS_JISJAPAN 0x20000 +#define FS_CHINESESIMP 0x40000 +#define FS_WANSUNG 0x80000 +#define FS_CHINESETRAD 0x100000 +#define FS_JOHAB 0x200000 +#define FS_SYMBOL 0x80000000 +#define HS_BDIAGONAL 3 +#define HS_CROSS 4 +#define HS_DIAGCROSS 5 +#define HS_FDIAGONAL 2 +#define HS_HORIZONTAL 0 +#define HS_VERTICAL 1 +#define PS_GEOMETRIC 65536 +#define PS_COSMETIC 0 +#define PS_ALTERNATE 8 +#define PS_SOLID 0 +#define PS_DASH 1 +#define PS_DOT 2 +#define PS_DASHDOT 3 +#define PS_DASHDOTDOT 4 +#define PS_NULL 5 +#define PS_USERSTYLE 7 +#define PS_INSIDEFRAME 6 +#define PS_ENDCAP_ROUND 0 +#define PS_ENDCAP_SQUARE 256 +#define PS_ENDCAP_FLAT 512 +#define PS_JOIN_BEVEL 4096 +#define PS_JOIN_MITER 8192 +#define PS_JOIN_ROUND 0 +#define PS_STYLE_MASK 15 +#define PS_ENDCAP_MASK 3840 +#define PS_TYPE_MASK 983040 +#define ALTERNATE 1 +#define WINDING 2 +#define DC_BINNAMES 12 +#define DC_BINS 6 +#define DC_COPIES 18 +#define DC_DRIVER 11 +#define DC_DATATYPE_PRODUCED 21 +#define DC_DUPLEX 7 +#define DC_EMF_COMPLIANT 20 +#define DC_ENUMRESOLUTIONS 13 +#define DC_EXTRA 9 +#define DC_FIELDS 1 +#define DC_FILEDEPENDENCIES 14 +#define DC_MAXEXTENT 5 +#define DC_MINEXTENT 4 +#define DC_ORIENTATION 17 +#define DC_PAPERNAMES 16 +#define DC_PAPERS 2 +#define DC_PAPERSIZE 3 +#define DC_SIZE 8 +#define DC_TRUETYPE 15 +#define DCTT_BITMAP 1 +#define DCTT_DOWNLOAD 2 +#define DCTT_SUBDEV 4 +#define DCTT_DOWNLOAD_OUTLINE 8 +#define DC_VERSION 10 +#define DC_BINADJUST 19 +#define DC_EMF_COMPLIANT 20 +#define DC_DATATYPE_PRODUCED 21 +#define DC_MANUFACTURER 23 +#define DC_MODEL 24 +#define DCBA_FACEUPNONE 0 +#define DCBA_FACEUPCENTER 1 +#define DCBA_FACEUPLEFT 2 +#define DCBA_FACEUPRIGHT 3 +#define DCBA_FACEDOWNNONE 256 +#define DCBA_FACEDOWNCENTER 257 +#define DCBA_FACEDOWNLEFT 258 +#define DCBA_FACEDOWNRIGHT 259 +#define FLOODFILLBORDER 0 +#define FLOODFILLSURFACE 1 +#define ETO_CLIPPED 4 +#define ETO_GLYPH_INDEX 16 +#define ETO_OPAQUE 2 +#define ETO_RTLREADING 128 +#define GDICOMMENT_WINDOWS_METAFILE (-2147483647) +#define GDICOMMENT_BEGINGROUP 2 +#define GDICOMMENT_ENDGROUP 3 +#define GDICOMMENT_MULTIFORMATS 1073741828 +#define GDICOMMENT_IDENTIFIER 1128875079 +#define AD_COUNTERCLOCKWISE 1 +#define AD_CLOCKWISE 2 +#define RDH_RECTANGLES 1 +#define GCPCLASS_LATIN 1 +#define GCPCLASS_HEBREW 2 +#define GCPCLASS_ARABIC 2 +#define GCPCLASS_NEUTRAL 3 +#define GCPCLASS_LOCALNUMBER 4 +#define GCPCLASS_LATINNUMBER 5 +#define GCPCLASS_LATINNUMERICTERMINATOR 6 +#define GCPCLASS_LATINNUMERICSEPARATOR 7 +#define GCPCLASS_NUMERICSEPARATOR 8 +#define GCPCLASS_PREBOUNDLTR 128 +#define GCPCLASS_PREBOUNDRTL 64 +#define GCPCLASS_POSTBOUNDLTR 32 +#define GCPCLASS_POSTBOUNDRTL 16 +#define GCPGLYPH_LINKBEFORE 0x8000 +#define GCPGLYPH_LINKAFTER 0x4000 +#define DCB_DISABLE 8 +#define DCB_ENABLE 4 +#define DCB_RESET 1 +#define DCB_SET 3 +#define DCB_ACCUMULATE 2 +#define DCB_DIRTY 2 +#define OBJ_BRUSH 2 +#define OBJ_PEN 1 +#define OBJ_PAL 5 +#define OBJ_FONT 6 +#define OBJ_BITMAP 7 +#define OBJ_EXTPEN 11 +#define OBJ_REGION 8 +#define OBJ_DC 3 +#define OBJ_MEMDC 10 +#define OBJ_METAFILE 9 +#define OBJ_METADC 4 +#define OBJ_ENHMETAFILE 13 +#define OBJ_ENHMETADC 12 +#define DRIVERVERSION 0 +#define TECHNOLOGY 2 +#define DT_PLOTTER 0 +#define DT_RASDISPLAY 1 +#define DT_RASPRINTER 2 +#define DT_RASCAMERA 3 +#define DT_CHARSTREAM 4 +#define DT_METAFILE 5 +#define DT_DISPFILE 6 +#define HORZSIZE 4 +#define VERTSIZE 6 +#define HORZRES 8 +#define VERTRES 10 +#define LOGPIXELSX 88 +#define LOGPIXELSY 90 +#define BITSPIXEL 12 +#define PLANES 14 +#define NUMBRUSHES 16 +#define NUMPENS 18 +#define NUMFONTS 22 +#define NUMCOLORS 24 +#define NUMMARKERS 20 +#define ASPECTX 40 +#define ASPECTY 42 +#define ASPECTXY 44 +#define PDEVICESIZE 26 +#define CLIPCAPS 36 +#define SIZEPALETTE 104 +#define NUMRESERVED 106 +#define COLORRES 108 +#define PHYSICALWIDTH 110 +#define PHYSICALHEIGHT 111 +#define PHYSICALOFFSETX 112 +#define PHYSICALOFFSETY 113 +#define SCALINGFACTORX 114 +#define SCALINGFACTORY 115 +#define VREFRESH 116 +#define DESKTOPHORZRES 118 +#define DESKTOPVERTRES 117 +#define BLTALIGNMENT 119 +#define RASTERCAPS 38 +#define RC_BANDING 2 +#define RC_BITBLT 1 +#define RC_BITMAP64 8 +#define RC_DI_BITMAP 128 +#define RC_DIBTODEV 512 +#define RC_FLOODFILL 4096 +#define RC_GDI20_OUTPUT 16 +#define RC_PALETTE 256 +#define RC_SCALING 4 +#define RC_STRETCHBLT 2048 +#define RC_STRETCHDIB 8192 +#define RC_DEVBITS 0x8000 +#define RC_OP_DX_OUTPUT 0x4000 +#define CURVECAPS 28 +#define CC_NONE 0 +#define CC_CIRCLES 1 +#define CC_PIE 2 +#define CC_CHORD 4 +#define CC_ELLIPSES 8 +#define CC_WIDE 16 +#define CC_STYLED 32 +#define CC_WIDESTYLED 64 +#define CC_INTERIORS 128 +#define CC_ROUNDRECT 256 +#define LINECAPS 30 +#define LC_NONE 0 +#define LC_POLYLINE 2 +#define LC_MARKER 4 +#define LC_POLYMARKER 8 +#define LC_WIDE 16 +#define LC_STYLED 32 +#define LC_WIDESTYLED 64 +#define LC_INTERIORS 128 +#define POLYGONALCAPS 32 +#define RC_BANDING 2 +#define RC_BIGFONT 1024 +#define RC_BITBLT 1 +#define RC_BITMAP64 8 +#define RC_DEVBITS 0x8000 +#define RC_DI_BITMAP 128 +#define RC_GDI20_OUTPUT 16 +#define RC_GDI20_STATE 32 +#define RC_NONE 0 +#define RC_OP_DX_OUTPUT 0x4000 +#define RC_PALETTE 256 +#define RC_SAVEBITMAP 64 +#define RC_SCALING 4 +#define PC_NONE 0 +#define PC_POLYGON 1 +#define PC_POLYPOLYGON 256 +#define PC_PATHS 512 +#define PC_RECTANGLE 2 +#define PC_WINDPOLYGON 4 +#define PC_SCANLINE 8 +#define PC_TRAPEZOID 4 +#define PC_WIDE 16 +#define PC_STYLED 32 +#define PC_WIDESTYLED 64 +#define PC_INTERIORS 128 +#define PC_PATHS 512 +#define TEXTCAPS 34 +#define TC_OP_CHARACTER 1 +#define TC_OP_STROKE 2 +#define TC_CP_STROKE 4 +#define TC_CR_90 8 +#define TC_CR_ANY 16 +#define TC_SF_X_YINDEP 32 +#define TC_SA_DOUBLE 64 +#define TC_SA_INTEGER 128 +#define TC_SA_CONTIN 256 +#define TC_EA_DOUBLE 512 +#define TC_IA_ABLE 1024 +#define TC_UA_ABLE 2048 +#define TC_SO_ABLE 4096 +#define TC_RA_ABLE 8192 +#define TC_VA_ABLE 16384 +#define TC_RESERVED 32768 +#define TC_SCROLLBLT 65536 +#define GCP_DBCS 1 +#define GCP_ERROR 0x8000 +#define GCP_CLASSIN 0x80000 +#define GCP_DIACRITIC 256 +#define GCP_DISPLAYZWG 0x400000 +#define GCP_GLYPHSHAPE 16 +#define GCP_JUSTIFY 0x10000 +#define GCP_JUSTIFYIN 0x200000 +#define GCP_KASHIDA 1024 +#define GCP_LIGATE 32 +#define GCP_MAXEXTENT 0x100000 +#define GCP_NEUTRALOVERRIDE 0x2000000 +#define GCP_NUMERICOVERRIDE 0x1000000 +#define GCP_NUMERICSLATIN 0x4000000 +#define GCP_NUMERICSLOCAL 0x8000000 +#define GCP_REORDER 2 +#define GCP_SYMSWAPOFF 0x800000 +#define GCP_USEKERNING 8 +#define FLI_GLYPHS 0x40000 +#define FLI_MASK 0x103b +#define GGO_METRICS 0 +#define GGO_BITMAP 1 +#define GGO_NATIVE 2 +#define GGO_BEZIER 3 +#define GGO_GRAY2_BITMAP 4 +#define GGO_GRAY4_BITMAP 5 +#define GGO_GRAY8_BITMAP 6 +#define GGO_GLYPH_INDEX 128 +#define GGO_UNHINTED 256 +#define GM_COMPATIBLE 1 +#define GM_ADVANCED 2 +#define MM_ANISOTROPIC 8 +#define MM_HIENGLISH 5 +#define MM_HIMETRIC 3 +#define MM_ISOTROPIC 7 +#define MM_LOENGLISH 4 +#define MM_LOMETRIC 2 +#define MM_TEXT 1 +#define MM_TWIPS 6 +#define MM_MAX_FIXEDSCALE MM_TWIPS +#define ABSOLUTE 1 +#define RELATIVE 2 +#define PC_EXPLICIT 2 +#define PC_NOCOLLAPSE 4 +#define PC_RESERVED 1 +#define CLR_NONE 0xffffffff +#define CLR_INVALID CLR_NONE +#define CLR_DEFAULT 0xff000000 +#define PT_MOVETO 6 +#define PT_LINETO 2 +#define PT_BEZIERTO 4 +#define PT_CLOSEFIGURE 1 +#define TT_AVAILABLE 1 +#define TT_ENABLED 2 +#define BLACK_BRUSH 4 +#define DKGRAY_BRUSH 3 +#define GRAY_BRUSH 2 +#define HOLLOW_BRUSH 5 +#define LTGRAY_BRUSH 1 +#define NULL_BRUSH 5 +#define WHITE_BRUSH 0 +#define BLACK_PEN 7 +#define NULL_PEN 8 +#define WHITE_PEN 6 +#define ANSI_FIXED_FONT 11 +#define ANSI_VAR_FONT 12 +#define DEVICE_DEFAULT_FONT 14 +#define DEFAULT_GUI_FONT 17 +#define OEM_FIXED_FONT 10 +#define SYSTEM_FONT 13 +#define SYSTEM_FIXED_FONT 16 +#define DEFAULT_PALETTE 15 +#if (_WIN32_WINNT >= 0x0500) +#define DC_BRUSH 18 +#define DC_PEN 19 +#endif +#define SYSPAL_NOSTATIC 2 +#define SYSPAL_STATIC 1 +#define SYSPAL_ERROR 0 +#define TA_BASELINE 24 +#define TA_BOTTOM 8 +#define TA_TOP 0 +#define TA_CENTER 6 +#define TA_LEFT 0 +#define TA_RIGHT 2 +#define TA_RTLREADING 256 +#define TA_NOUPDATECP 0 +#define TA_UPDATECP 1 +#define TA_MASK (TA_BASELINE+TA_CENTER+TA_UPDATECP+TA_RTLREADING) +#define VTA_BASELINE 24 +#define VTA_CENTER 6 +#define VTA_LEFT TA_BOTTOM +#define VTA_RIGHT TA_TOP +#define VTA_BOTTOM TA_RIGHT +#define VTA_TOP TA_LEFT +#define MWT_IDENTITY 1 +#define MWT_LEFTMULTIPLY 2 +#define MWT_RIGHTMULTIPLY 3 +#define OPAQUE 2 +#define TRANSPARENT 1 +#define BLACKONWHITE 1 +#define WHITEONBLACK 2 +#define COLORONCOLOR 3 +#define HALFTONE 4 +#define MAXSTRETCHBLTMODE 4 +#define STRETCH_ANDSCANS 1 +#define STRETCH_DELETESCANS 3 +#define STRETCH_HALFTONE 4 +#define STRETCH_ORSCANS 2 +#define TCI_SRCCHARSET 1 +#define TCI_SRCCODEPAGE 2 +#define TCI_SRCFONTSIG 3 +#define ICM_ON 2 +#define ICM_OFF 1 +#define ICM_QUERY 3 +#define NEWFRAME 1 +#define ABORTDOC 2 +#define NEXTBAND 3 +#define SETCOLORTABLE 4 +#define GETCOLORTABLE 5 +#define FLUSHOUTPUT 6 +#define DRAFTMODE 7 +#define QUERYESCSUPPORT 8 +#define SETABORTPROC 9 +#define STARTDOC 10 +#define ENDDOC 11 +#define GETPHYSPAGESIZE 12 +#define GETPRINTINGOFFSET 13 +#define GETSCALINGFACTOR 14 +#define MFCOMMENT 15 +#define GETPENWIDTH 16 +#define SETCOPYCOUNT 17 +#define SELECTPAPERSOURCE 18 +#define DEVICEDATA 19 +#define PASSTHROUGH 19 +#define GETTECHNOLGY 20 +#define GETTECHNOLOGY 20 +#define SETLINECAP 21 +#define SETLINEJOIN 22 +#define SETMITERLIMIT 23 +#define BANDINFO 24 +#define DRAWPATTERNRECT 25 +#define GETVECTORPENSIZE 26 +#define GETVECTORBRUSHSIZE 27 +#define ENABLEDUPLEX 28 +#define GETSETPAPERBINS 29 +#define GETSETPRINTORIENT 30 +#define ENUMPAPERBINS 31 +#define SETDIBSCALING 32 +#define EPSPRINTING 33 +#define ENUMPAPERMETRICS 34 +#define GETSETPAPERMETRICS 35 +#define POSTSCRIPT_DATA 37 +#define POSTSCRIPT_IGNORE 38 +#define MOUSETRAILS 39 +#define GETDEVICEUNITS 42 +#define GETEXTENDEDTEXTMETRICS 256 +#define GETEXTENTTABLE 257 +#define GETPAIRKERNTABLE 258 +#define GETTRACKKERNTABLE 259 +#define EXTTEXTOUT 512 +#define GETFACENAME 513 +#define DOWNLOADFACE 514 +#define ENABLERELATIVEWIDTHS 768 +#define ENABLEPAIRKERNING 769 +#define SETKERNTRACK 770 +#define SETALLJUSTVALUES 771 +#define SETCHARSET 772 +#define STRETCHBLT 2048 +#define GETSETSCREENPARAMS 3072 +#define QUERYDIBSUPPORT 3073 +#define BEGIN_PATH 4096 +#define CLIP_TO_PATH 4097 +#define END_PATH 4098 +#define EXT_DEVICE_CAPS 4099 +#define RESTORE_CTM 4100 +#define SAVE_CTM 4101 +#define SET_ARC_DIRECTION 4102 +#define SET_BACKGROUND_COLOR 4103 +#define SET_POLY_MODE 4104 +#define SET_SCREEN_ANGLE 4105 +#define SET_SPREAD 4106 +#define TRANSFORM_CTM 4107 +#define SET_CLIP_BOX 4108 +#define SET_BOUNDS 4109 +#define SET_MIRROR_MODE 4110 +#define OPENCHANNEL 4110 +#define DOWNLOADHEADER 4111 +#define CLOSECHANNEL 4112 +#define POSTSCRIPT_PASSTHROUGH 4115 +#define ENCAPSULATED_POSTSCRIPT 4116 +#define QDI_SETDIBITS 1 +#define QDI_GETDIBITS 2 +#define QDI_DIBTOSCREEN 4 +#define QDI_STRETCHDIB 8 +#define SP_NOTREPORTED 0x4000 +#define PR_JOBSTATUS 0 +#define ASPECT_FILTERING 1 +#define BS_SOLID 0 +#define BS_NULL 1 +#define BS_HOLLOW 1 +#define BS_HATCHED 2 +#define BS_PATTERN 3 +#define BS_INDEXED 4 +#define BS_DIBPATTERN 5 +#define BS_DIBPATTERNPT 6 +#define BS_PATTERN8X8 7 +#define BS_DIBPATTERN8X8 8 +#define LCS_CALIBRATED_RGB 0 +#define LCS_DEVICE_RGB 1 +#define LCS_DEVICE_CMYK 2 +#define LCS_GM_BUSINESS 1 +#define LCS_GM_GRAPHICS 2 +#define LCS_GM_IMAGES 4 +#define RASTER_FONTTYPE 1 +#define DEVICE_FONTTYPE 2 +#define TRUETYPE_FONTTYPE 4 +#define DMORIENT_PORTRAIT 1 +#define DMORIENT_LANDSCAPE 2 +#define DMPAPER_FIRST 1 +#define DMPAPER_LETTER 1 +#define DMPAPER_LETTERSMALL 2 +#define DMPAPER_TABLOID 3 +#define DMPAPER_LEDGER 4 +#define DMPAPER_LEGAL 5 +#define DMPAPER_STATEMENT 6 +#define DMPAPER_EXECUTIVE 7 +#define DMPAPER_A3 8 +#define DMPAPER_A4 9 +#define DMPAPER_A4SMALL 10 +#define DMPAPER_A5 11 +#define DMPAPER_B4 12 +#define DMPAPER_B5 13 +#define DMPAPER_FOLIO 14 +#define DMPAPER_QUARTO 15 +#define DMPAPER_10X14 16 +#define DMPAPER_11X17 17 +#define DMPAPER_NOTE 18 +#define DMPAPER_ENV_9 19 +#define DMPAPER_ENV_10 20 +#define DMPAPER_ENV_11 21 +#define DMPAPER_ENV_12 22 +#define DMPAPER_ENV_14 23 +#define DMPAPER_CSHEET 24 +#define DMPAPER_DSHEET 25 +#define DMPAPER_ESHEET 26 +#define DMPAPER_ENV_DL 27 +#define DMPAPER_ENV_C5 28 +#define DMPAPER_ENV_C3 29 +#define DMPAPER_ENV_C4 30 +#define DMPAPER_ENV_C6 31 +#define DMPAPER_ENV_C65 32 +#define DMPAPER_ENV_B4 33 +#define DMPAPER_ENV_B5 34 +#define DMPAPER_ENV_B6 35 +#define DMPAPER_ENV_ITALY 36 +#define DMPAPER_ENV_MONARCH 37 +#define DMPAPER_ENV_PERSONAL 38 +#define DMPAPER_FANFOLD_US 39 +#define DMPAPER_FANFOLD_STD_GERMAN 40 +#define DMPAPER_FANFOLD_LGL_GERMAN 41 +#define DMPAPER_ISO_B4 42 +#define DMPAPER_JAPANESE_POSTCARD 43 +#define DMPAPER_9X11 44 +#define DMPAPER_10X11 45 +#define DMPAPER_15X11 46 +#define DMPAPER_ENV_INVITE 47 +#define DMPAPER_RESERVED_48 48 +#define DMPAPER_RESERVED_49 49 +#define DMPAPER_LETTER_EXTRA 50 +#define DMPAPER_LEGAL_EXTRA 51 +#define DMPAPER_TABLOID_EXTRA 52 +#define DMPAPER_A4_EXTRA 53 +#define DMPAPER_LETTER_TRANSVERSE 54 +#define DMPAPER_A4_TRANSVERSE 55 +#define DMPAPER_LETTER_EXTRA_TRANSVERSE 56 +#define DMPAPER_A_PLUS 57 +#define DMPAPER_B_PLUS 58 +#define DMPAPER_LETTER_PLUS 59 +#define DMPAPER_A4_PLUS 60 +#define DMPAPER_A5_TRANSVERSE 61 +#define DMPAPER_B5_TRANSVERSE 62 +#define DMPAPER_A3_EXTRA 63 +#define DMPAPER_A5_EXTRA 64 +#define DMPAPER_B5_EXTRA 65 +#define DMPAPER_A2 66 +#define DMPAPER_A3_TRANSVERSE 67 +#define DMPAPER_A3_EXTRA_TRANSVERSE 68 +#define DMPAPER_LAST 68 +#define DMPAPER_USER 256 +#define DMBIN_FIRST 1 +#define DMBIN_UPPER 1 +#define DMBIN_ONLYONE 1 +#define DMBIN_LOWER 2 +#define DMBIN_MIDDLE 3 +#define DMBIN_MANUAL 4 +#define DMBIN_ENVELOPE 5 +#define DMBIN_ENVMANUAL 6 +#define DMBIN_AUTO 7 +#define DMBIN_TRACTOR 8 +#define DMBIN_SMALLFMT 9 +#define DMBIN_LARGEFMT 10 +#define DMBIN_LARGECAPACITY 11 +#define DMBIN_CASSETTE 14 +#define DMBIN_FORMSOURCE 15 +#define DMBIN_LAST 15 +#define DMBIN_USER 256 +#define DMRES_DRAFT (-1) +#define DMRES_LOW (-2) +#define DMRES_MEDIUM (-3) +#define DMRES_HIGH (-4) +#define DMCOLOR_MONOCHROME 1 +#define DMCOLOR_COLOR 2 +#define DMDUP_SIMPLEX 1 +#define DMDUP_VERTICAL 2 +#define DMDUP_HORIZONTAL 3 +#define DMTT_BITMAP 1 +#define DMTT_DOWNLOAD 2 +#define DMTT_SUBDEV 3 +#define DMTT_DOWNLOAD_OUTLINE 4 +#define DMCOLLATE_FALSE 0 +#define DMCOLLATE_TRUE 1 +#define DM_SPECVERSION 800 +#define DM_GRAYSCALE 1 +#define DM_INTERLACED 2 +#define DM_UPDATE 1 +#define DM_COPY 2 +#define DM_PROMPT 4 +#define DM_MODIFY 8 +#define DM_IN_BUFFER DM_MODIFY +#define DM_IN_PROMPT DM_PROMPT +#define DM_OUT_BUFFER DM_COPY +#define DM_OUT_DEFAULT DM_UPDATE +#define DM_ORIENTATION 1 +#define DM_PAPERSIZE 2 +#define DM_PAPERLENGTH 4 +#define DM_PAPERWIDTH 8 +#define DM_SCALE 16 +#define DM_COPIES 256 +#define DM_DEFAULTSOURCE 512 +#define DM_PRINTQUALITY 1024 +#define DM_COLOR 2048 +#define DM_DUPLEX 4096 +#define DM_YRESOLUTION 8192 +#define DM_TTOPTION 16384 +#define DM_COLLATE 32768 +#define DM_FORMNAME 65536 +#define DM_LOGPIXELS 0x20000 +#define DM_BITSPERPEL 0x40000 +#define DM_PELSWIDTH 0x80000 +#define DM_PELSHEIGHT 0x100000 +#define DM_DISPLAYFLAGS 0x200000 +#define DM_DISPLAYFREQUENCY 0x400000 +#define DM_ICMMETHOD 0x800000 +#define DM_ICMINTENT 0x1000000 +#define DM_MEDIATYPE 0x2000000 +#define DM_DITHERTYPE 0x4000000 +#define DMICMMETHOD_NONE 1 +#define DMICMMETHOD_SYSTEM 2 +#define DMICMMETHOD_DRIVER 3 +#define DMICMMETHOD_DEVICE 4 +#define DMICMMETHOD_USER 256 +#define DMICM_SATURATE 1 +#define DMICM_CONTRAST 2 +#define DMICM_COLORMETRIC 3 +#define DMICM_USER 256 +#define DMMEDIA_STANDARD 1 +#define DMMEDIA_TRANSPARENCY 2 +#define DMMEDIA_GLOSSY 3 +#define DMMEDIA_USER 256 +#define DMDITHER_NONE 1 +#define DMDITHER_COARSE 2 +#define DMDITHER_FINE 3 +#define DMDITHER_LINEART 4 +#define DMDITHER_ERRORDIFFUSION 5 +#define DMDITHER_RESERVED6 6 +#define DMDITHER_RESERVED7 7 +#define DMDITHER_RESERVED8 8 +#define DMDITHER_RESERVED9 9 +#define DMDITHER_GRAYSCALE 10 +#define DMDITHER_USER 256 +#define GDI_ERROR 0xFFFFFFFF +#define HGDI_ERROR ((HANDLE)GDI_ERROR) +#define TMPF_FIXED_PITCH 1 +#define TMPF_VECTOR 2 +#define TMPF_TRUETYPE 4 +#define TMPF_DEVICE 8 +#define NTM_ITALIC 1 +#define NTM_BOLD 32 +#define NTM_REGULAR 64 +#define TT_POLYGON_TYPE 24 +#define TT_PRIM_LINE 1 +#define TT_PRIM_QSPLINE 2 +#define FONTMAPPER_MAX 10 +#define ENHMETA_STOCK_OBJECT 0x80000000 +#define WGL_FONT_LINES 0 +#define WGL_FONT_POLYGONS 1 +#define LPD_DOUBLEBUFFER 1 +#define LPD_STEREO 2 +#define LPD_SUPPORT_GDI 16 +#define LPD_SUPPORT_OPENGL 32 +#define LPD_SHARE_DEPTH 64 +#define LPD_SHARE_STENCIL 128 +#define LPD_SHARE_ACCUM 256 +#define LPD_SWAP_EXCHANGE 512 +#define LPD_SWAP_COPY 1024 +#define LPD_TRANSPARENT 4096 +#define LPD_TYPE_RGBA 0 +#define LPD_TYPE_COLORINDEX 1 +#define WGL_SWAP_MAIN_PLANE 1 +#define WGL_SWAP_OVERLAY1 2 +#define WGL_SWAP_OVERLAY2 4 +#define WGL_SWAP_OVERLAY3 8 +#define WGL_SWAP_OVERLAY4 16 +#define WGL_SWAP_OVERLAY5 32 +#define WGL_SWAP_OVERLAY6 64 +#define WGL_SWAP_OVERLAY7 128 +#define WGL_SWAP_OVERLAY8 256 +#define WGL_SWAP_OVERLAY9 512 +#define WGL_SWAP_OVERLAY10 1024 +#define WGL_SWAP_OVERLAY11 2048 +#define WGL_SWAP_OVERLAY12 4096 +#define WGL_SWAP_OVERLAY13 8192 +#define WGL_SWAP_OVERLAY14 16384 +#define WGL_SWAP_OVERLAY15 32768 +#define WGL_SWAP_UNDERLAY1 65536 +#define WGL_SWAP_UNDERLAY2 0x20000 +#define WGL_SWAP_UNDERLAY3 0x40000 +#define WGL_SWAP_UNDERLAY4 0x80000 +#define WGL_SWAP_UNDERLAY5 0x100000 +#define WGL_SWAP_UNDERLAY6 0x200000 +#define WGL_SWAP_UNDERLAY7 0x400000 +#define WGL_SWAP_UNDERLAY8 0x800000 +#define WGL_SWAP_UNDERLAY9 0x1000000 +#define WGL_SWAP_UNDERLAY10 0x2000000 +#define WGL_SWAP_UNDERLAY11 0x4000000 +#define WGL_SWAP_UNDERLAY12 0x8000000 +#define WGL_SWAP_UNDERLAY13 0x10000000 +#define WGL_SWAP_UNDERLAY14 0x20000000 +#define WGL_SWAP_UNDERLAY15 0x40000000 +#define AC_SRC_OVER 0 +#define LAYOUT_RTL 1 +#define LAYOUT_BITMAPORIENTATIONPRESERVED 8 +#if (WINVER > 0x400) +#define CS_ENABLE 0x00000001 +#define CS_DISABLE 0x00000002 +#define CS_DELETE_TRANSFORM 0x00000003 +#endif +#if (WINVER > 0x500) +#define GRADIENT_FILL_RECT_H 0x00 +#define GRADIENT_FILL_RECT_V 0x01 +#define GRADIENT_FILL_TRIANGLE 0x02 +#define GRADIENT_FILL_OP_FLAG 0xff +#define COLORMATCHTOTARGET_EMBEDED 0x00000001 +#define CREATECOLORSPACE_EMBEDED 0x00000001 +#define SETICMPROFILE_EMBEDED 0x00000001 +#endif + +#define DISPLAY_DEVICE_ATTACHED_TO_DESKTOP 0x00000001 +#define DISPLAY_DEVICE_MULTI_DRIVER 0x00000002 +#define DISPLAY_DEVICE_PRIMARY_DEVICE 0x00000004 +#define DISPLAY_DEVICE_MIRRORING_DRIVER 0x00000008 +#define DISPLAY_DEVICE_VGA_COMPATIBLE 0x00000010 +#define DISPLAY_DEVICE_REMOVABLE 0x00000020 +#define DISPLAY_DEVICE_MODESPRUNED 0x08000000 +#ifndef RC_INVOKED +typedef struct _ABC { + int abcA; + UINT abcB; + int abcC; +} ABC,*LPABC; +typedef struct _ABCFLOAT { + FLOAT abcfA; + FLOAT abcfB; + FLOAT abcfC; +} ABCFLOAT,*LPABCFLOAT; +typedef struct tagBITMAP { + LONG bmType; + LONG bmWidth; + LONG bmHeight; + LONG bmWidthBytes; + WORD bmPlanes; + WORD bmBitsPixel; + LPVOID bmBits; +} BITMAP,*PBITMAP,*LPBITMAP; +typedef struct tagBITMAPCOREHEADER { + DWORD bcSize; + WORD bcWidth; + WORD bcHeight; + WORD bcPlanes; + WORD bcBitCount; +} BITMAPCOREHEADER,*LPBITMAPCOREHEADER,*PBITMAPCOREHEADER; +#pragma pack(push,1) +typedef struct tagRGBTRIPLE { + BYTE rgbtBlue; + BYTE rgbtGreen; + BYTE rgbtRed; +} RGBTRIPLE,*LPRGBTRIPLE; +#pragma pack(pop) +#pragma pack(push,2) +typedef struct tagBITMAPFILEHEADER { + WORD bfType; + DWORD bfSize; + WORD bfReserved1; + WORD bfReserved2; + DWORD bfOffBits; +} BITMAPFILEHEADER,*LPBITMAPFILEHEADER,*PBITMAPFILEHEADER; +#pragma pack(pop) +typedef struct _BITMAPCOREINFO { + BITMAPCOREHEADER bmciHeader; + RGBTRIPLE bmciColors[1]; +} BITMAPCOREINFO,*LPBITMAPCOREINFO,*PBITMAPCOREINFO; +typedef struct tagBITMAPINFOHEADER{ + DWORD biSize; + LONG biWidth; + LONG biHeight; + WORD biPlanes; + WORD biBitCount; + DWORD biCompression; + DWORD biSizeImage; + LONG biXPelsPerMeter; + LONG biYPelsPerMeter; + DWORD biClrUsed; + DWORD biClrImportant; +} BITMAPINFOHEADER,*LPBITMAPINFOHEADER,*PBITMAPINFOHEADER; +typedef struct tagRGBQUAD { + BYTE rgbBlue; + BYTE rgbGreen; + BYTE rgbRed; + BYTE rgbReserved; +} RGBQUAD,*LPRGBQUAD; +typedef struct tagBITMAPINFO { + BITMAPINFOHEADER bmiHeader; + RGBQUAD bmiColors[1]; +} BITMAPINFO,*LPBITMAPINFO,*PBITMAPINFO; +typedef long FXPT16DOT16,*LPFXPT16DOT16; +typedef long FXPT2DOT30,*LPFXPT2DOT30; +typedef struct tagCIEXYZ { + FXPT2DOT30 ciexyzX; + FXPT2DOT30 ciexyzY; + FXPT2DOT30 ciexyzZ; +} CIEXYZ,*LPCIEXYZ; +typedef struct tagCIEXYZTRIPLE { + CIEXYZ ciexyzRed; + CIEXYZ ciexyzGreen; + CIEXYZ ciexyzBlue; +} CIEXYZTRIPLE,*LPCIEXYZTRIPLE; +typedef struct { + DWORD bV4Size; + LONG bV4Width; + LONG bV4Height; + WORD bV4Planes; + WORD bV4BitCount; + DWORD bV4V4Compression; + DWORD bV4SizeImage; + LONG bV4XPelsPerMeter; + LONG bV4YPelsPerMeter; + DWORD bV4ClrUsed; + DWORD bV4ClrImportant; + DWORD bV4RedMask; + DWORD bV4GreenMask; + DWORD bV4BlueMask; + DWORD bV4AlphaMask; + DWORD bV4CSType; + CIEXYZTRIPLE bV4Endpoints; + DWORD bV4GammaRed; + DWORD bV4GammaGreen; + DWORD bV4GammaBlue; +} BITMAPV4HEADER,*LPBITMAPV4HEADER,*PBITMAPV4HEADER; +typedef struct tagFONTSIGNATURE { + DWORD fsUsb[4]; + DWORD fsCsb[2]; +} FONTSIGNATURE,*LPFONTSIGNATURE; +typedef struct { + UINT ciCharset; + UINT ciACP; + FONTSIGNATURE fs; +} CHARSETINFO,*LPCHARSETINFO; +typedef struct tagCOLORADJUSTMENT { + WORD caSize; + WORD caFlags; + WORD caIlluminantIndex; + WORD caRedGamma; + WORD caGreenGamma; + WORD caBlueGamma; + WORD caReferenceBlack; + WORD caReferenceWhite; + SHORT caContrast; + SHORT caBrightness; + SHORT caColorfulness; + SHORT caRedGreenTint; +} COLORADJUSTMENT,*LPCOLORADJUSTMENT; +typedef struct _devicemodeA { + BYTE dmDeviceName[CCHDEVICENAME]; + WORD dmSpecVersion; + WORD dmDriverVersion; + WORD dmSize; + WORD dmDriverExtra; + DWORD dmFields; + _ANONYMOUS_UNION union { + _ANONYMOUS_STRUCT struct { + short dmOrientation; + short dmPaperSize; + short dmPaperLength; + short dmPaperWidth; + short dmScale; + short dmCopies; + short dmDefaultSource; + short dmPrintQuality; + } DUMMYSTRUCTNAME; + POINTL dmPosition; + DWORD dmDisplayOrientation; + DWORD dmDisplayFixedOutput; + } DUMMYUNIONNAME; + + short dmColor; + short dmDuplex; + short dmYResolution; + short dmTTOption; + short dmCollate; + BYTE dmFormName[CCHFORMNAME]; + WORD dmLogPixels; + DWORD dmBitsPerPel; + DWORD dmPelsWidth; + DWORD dmPelsHeight; + _ANONYMOUS_UNION union { + DWORD dmDisplayFlags; + DWORD dmNup; + } DUMMYUNIONNAME2; + DWORD dmDisplayFrequency; +#if(WINVER >= 0x0400) + DWORD dmICMMethod; + DWORD dmICMIntent; + DWORD dmMediaType; + DWORD dmDitherType; + DWORD dmReserved1; + DWORD dmReserved2; +#if (WINVER >= 0x0500) || (_WIN32_WINNT >= 0x0400) + DWORD dmPanningWidth; + DWORD dmPanningHeight; +#endif +#endif /* WINVER >= 0x0400 */ +} DEVMODEA,*LPDEVMODEA,*PDEVMODEA; +typedef struct _devicemodeW { + WCHAR dmDeviceName[CCHDEVICENAME]; + WORD dmSpecVersion; + WORD dmDriverVersion; + WORD dmSize; + WORD dmDriverExtra; + DWORD dmFields; + _ANONYMOUS_UNION union { + _ANONYMOUS_STRUCT struct { + short dmOrientation; + short dmPaperSize; + short dmPaperLength; + short dmPaperWidth; + short dmScale; + short dmCopies; + short dmDefaultSource; + short dmPrintQuality; + } DUMMYSTRUCTNAME; + POINTL dmPosition; + DWORD dmDisplayOrientation; + DWORD dmDisplayFixedOutput; + } DUMMYUNIONNAME; + + short dmColor; + short dmDuplex; + short dmYResolution; + short dmTTOption; + short dmCollate; + WCHAR dmFormName[CCHFORMNAME]; + WORD dmLogPixels; + DWORD dmBitsPerPel; + DWORD dmPelsWidth; + DWORD dmPelsHeight; + _ANONYMOUS_UNION union { + DWORD dmDisplayFlags; + DWORD dmNup; + } DUMMYUNIONNAME2; + DWORD dmDisplayFrequency; +#if(WINVER >= 0x0400) + DWORD dmICMMethod; + DWORD dmICMIntent; + DWORD dmMediaType; + DWORD dmDitherType; + DWORD dmReserved1; + DWORD dmReserved2; +#if (WINVER >= 0x0500) || (_WIN32_WINNT >= 0x0400) + DWORD dmPanningWidth; + DWORD dmPanningHeight; +#endif +#endif /* WINVER >= 0x0400 */ +} DEVMODEW,*LPDEVMODEW,*PDEVMODEW; +typedef struct tagDIBSECTION { + BITMAP dsBm; + BITMAPINFOHEADER dsBmih; + DWORD dsBitfields[3]; + HANDLE dshSection; + DWORD dsOffset; +} DIBSECTION; +typedef struct _DOCINFOA { + int cbSize; + LPCSTR lpszDocName; + LPCSTR lpszOutput; + LPCSTR lpszDatatype; + DWORD fwType; +} DOCINFOA,*LPDOCINFOA; +typedef struct _DOCINFOW { + int cbSize; + LPCWSTR lpszDocName; + LPCWSTR lpszOutput; + LPCWSTR lpszDatatype; + DWORD fwType; +} DOCINFOW,*LPDOCINFOW; +typedef struct tagEMR { + DWORD iType; + DWORD nSize; +} EMR,*PEMR; +typedef struct tagEMRANGLEARC { + EMR emr; + POINTL ptlCenter; + DWORD nRadius; + FLOAT eStartAngle; + FLOAT eSweepAngle; +} EMRANGLEARC,*PEMRANGLEARC; +typedef struct tagEMRARC { + EMR emr; + RECTL rclBox; + POINTL ptlStart; + POINTL ptlEnd; +} EMRARC,*PEMRARC,EMRARCTO,*PEMRARCTO,EMRCHORD,*PEMRCHORD,EMRPIE,*PEMRPIE; +typedef struct _XFORM { + FLOAT eM11; + FLOAT eM12; + FLOAT eM21; + FLOAT eM22; + FLOAT eDx; + FLOAT eDy; +} XFORM,*PXFORM,*LPXFORM; +typedef struct tagEMRBITBLT { + EMR emr; + RECTL rclBounds; + LONG xDest; + LONG yDest; + LONG cxDest; + LONG cyDest; + DWORD dwRop; + LONG xSrc; + LONG ySrc; + XFORM xformSrc; + COLORREF crBkColorSrc; + DWORD iUsageSrc; + DWORD offBmiSrc; + DWORD offBitsSrc; + DWORD cbBitsSrc; +} EMRBITBLT,*PEMRBITBLT; +typedef struct tagLOGBRUSH { + UINT lbStyle; + COLORREF lbColor; + LONG lbHatch; +} LOGBRUSH,*PLOGBRUSH,*LPLOGBRUSH; +typedef LOGBRUSH PATTERN,*PPATTERN,*LPPATTERN; +typedef struct tagEMRCREATEBRUSHINDIRECT { + EMR emr; + DWORD ihBrush; + LOGBRUSH lb; +} EMRCREATEBRUSHINDIRECT,*PEMRCREATEBRUSHINDIRECT; +typedef LONG LCSCSTYPE; +typedef LONG LCSGAMUTMATCH; +typedef struct tagLOGCOLORSPACEA { + DWORD lcsSignature; + DWORD lcsVersion; + DWORD lcsSize; + LCSCSTYPE lcsCSType; + LCSGAMUTMATCH lcsIntent; + CIEXYZTRIPLE lcsEndpoints; + DWORD lcsGammaRed; + DWORD lcsGammaGreen; + DWORD lcsGammaBlue; + CHAR lcsFilename[MAX_PATH]; +} LOGCOLORSPACEA,*LPLOGCOLORSPACEA; +typedef struct tagLOGCOLORSPACEW { + DWORD lcsSignature; + DWORD lcsVersion; + DWORD lcsSize; + LCSCSTYPE lcsCSType; + LCSGAMUTMATCH lcsIntent; + CIEXYZTRIPLE lcsEndpoints; + DWORD lcsGammaRed; + DWORD lcsGammaGreen; + DWORD lcsGammaBlue; + WCHAR lcsFilename[MAX_PATH]; +} LOGCOLORSPACEW,*LPLOGCOLORSPACEW; +typedef struct tagEMRCREATECOLORSPACE { + EMR emr; + DWORD ihCS; + LOGCOLORSPACEW lcs; +} EMRCREATECOLORSPACE,*PEMRCREATECOLORSPACE; +typedef struct tagEMRCREATEDIBPATTERNBRUSHPT { + EMR emr; + DWORD ihBrush; + DWORD iUsage; + DWORD offBmi; + DWORD cbBmi; + DWORD offBits; + DWORD cbBits; +} EMRCREATEDIBPATTERNBRUSHPT,*PEMRCREATEDIBPATTERNBRUSHPT; +typedef struct tagEMRCREATEMONOBRUSH { + EMR emr; + DWORD ihBrush; + DWORD iUsage; + DWORD offBmi; + DWORD cbBmi; + DWORD offBits; + DWORD cbBits; +} EMRCREATEMONOBRUSH,*PEMRCREATEMONOBRUSH; +typedef struct tagPALETTEENTRY { + BYTE peRed; + BYTE peGreen; + BYTE peBlue; + BYTE peFlags; +} PALETTEENTRY,*LPPALETTEENTRY,*PPALETTEENTRY; +typedef struct tagLOGPALETTE { + WORD palVersion; + WORD palNumEntries; + PALETTEENTRY palPalEntry[1]; +} LOGPALETTE,*NPLOGPALETTE,*PLOGPALETTE,*LPLOGPALETTE; +typedef struct tagEMRCREATEPALETTE { + EMR emr; + DWORD ihPal; + LOGPALETTE lgpl; +} EMRCREATEPALETTE,*PEMRCREATEPALETTE; +typedef struct tagLOGPEN { + UINT lopnStyle; + POINT lopnWidth; + COLORREF lopnColor; +} LOGPEN,*PLOGPEN,*LPLOGPEN; +typedef struct tagEMRCREATEPEN { + EMR emr; + DWORD ihPen; + LOGPEN lopn; +} EMRCREATEPEN,*PEMRCREATEPEN; +typedef struct tagEMRELLIPSE { + EMR emr; + RECTL rclBox; +} EMRELLIPSE,*PEMRELLIPSE,EMRRECTANGLE,*PEMRRECTANGLE; +typedef struct tagEMREOF { + EMR emr; + DWORD nPalEntries; + DWORD offPalEntries; + DWORD nSizeLast; +} EMREOF,*PEMREOF; +typedef struct tagEMREXCLUDECLIPRECT { + EMR emr; + RECTL rclClip; +} EMREXCLUDECLIPRECT,*PEMREXCLUDECLIPRECT,EMRINTERSECTCLIPRECT,*PEMRINTERSECTCLIPRECT; +typedef struct tagPANOSE { + BYTE bFamilyType; + BYTE bSerifStyle; + BYTE bWeight; + BYTE bProportion; + BYTE bContrast; + BYTE bStrokeVariation; + BYTE bArmStyle; + BYTE bLetterform; + BYTE bMidline; + BYTE bXHeight; +} PANOSE; +typedef struct tagLOGFONTA { + LONG lfHeight; + LONG lfWidth; + LONG lfEscapement; + LONG lfOrientation; + LONG lfWeight; + BYTE lfItalic; + BYTE lfUnderline; + BYTE lfStrikeOut; + BYTE lfCharSet; + BYTE lfOutPrecision; + BYTE lfClipPrecision; + BYTE lfQuality; + BYTE lfPitchAndFamily; + CHAR lfFaceName[LF_FACESIZE]; +} LOGFONTA,*PLOGFONTA,*LPLOGFONTA; +typedef struct tagLOGFONTW { + LONG lfHeight; + LONG lfWidth; + LONG lfEscapement; + LONG lfOrientation; + LONG lfWeight; + BYTE lfItalic; + BYTE lfUnderline; + BYTE lfStrikeOut; + BYTE lfCharSet; + BYTE lfOutPrecision; + BYTE lfClipPrecision; + BYTE lfQuality; + BYTE lfPitchAndFamily; + WCHAR lfFaceName[LF_FACESIZE]; +} LOGFONTW,*PLOGFONTW,*LPLOGFONTW; +typedef struct tagEXTLOGFONTA { + LOGFONTA elfLogFont; + BYTE elfFullName[LF_FULLFACESIZE]; + BYTE elfStyle[LF_FACESIZE]; + DWORD elfVersion; + DWORD elfStyleSize; + DWORD elfMatch; + DWORD elfReserved; + BYTE elfVendorId[ELF_VENDOR_SIZE]; + DWORD elfCulture; + PANOSE elfPanose; +} EXTLOGFONTA,*PEXTLOGFONTA,*LPEXTLOGFONTA; +typedef struct tagEXTLOGFONTW { + LOGFONTW elfLogFont; + WCHAR elfFullName[LF_FULLFACESIZE]; + WCHAR elfStyle[LF_FACESIZE]; + DWORD elfVersion; + DWORD elfStyleSize; + DWORD elfMatch; + DWORD elfReserved; + BYTE elfVendorId[ELF_VENDOR_SIZE]; + DWORD elfCulture; + PANOSE elfPanose; +} EXTLOGFONTW,*PEXTLOGFONTW,*LPEXTLOGFONTW; +typedef struct tagEMREXTCREATEFONTINDIRECTW { + EMR emr; + DWORD ihFont; + EXTLOGFONTW elfw; +} EMREXTCREATEFONTINDIRECTW,*PEMREXTCREATEFONTINDIRECTW; +typedef struct tagEXTLOGPEN { + UINT elpPenStyle; + UINT elpWidth; + UINT elpBrushStyle; + COLORREF elpColor; + LONG elpHatch; + DWORD elpNumEntries; + DWORD elpStyleEntry[1]; +} EXTLOGPEN,*PEXTLOGPEN,*LPEXTLOGPEN; +typedef struct tagEMREXTCREATEPEN { + EMR emr; + DWORD ihPen; + DWORD offBmi; + DWORD cbBmi; + DWORD offBits; + DWORD cbBits; + EXTLOGPEN elp; +} EMREXTCREATEPEN,*PEMREXTCREATEPEN; +typedef struct tagEMREXTFLOODFILL { + EMR emr; + POINTL ptlStart; + COLORREF crColor; + DWORD iMode; +} EMREXTFLOODFILL,*PEMREXTFLOODFILL; +typedef struct tagEMREXTSELECTCLIPRGN { + EMR emr; + DWORD cbRgnData; + DWORD iMode; + BYTE RgnData[1]; +} EMREXTSELECTCLIPRGN,*PEMREXTSELECTCLIPRGN; +typedef struct tagEMRTEXT { + POINTL ptlReference; + DWORD nChars; + DWORD offString; + DWORD fOptions; + RECTL rcl; + DWORD offDx; +} EMRTEXT,*PEMRTEXT; +typedef struct tagEMREXTTEXTOUTA { + EMR emr; + RECTL rclBounds; + DWORD iGraphicsMode; + FLOAT exScale; + FLOAT eyScale; + EMRTEXT emrtext; +} EMREXTTEXTOUTA,*PEMREXTTEXTOUTA,EMREXTTEXTOUTW,*PEMREXTTEXTOUTW; +typedef struct tagEMRFILLPATH { + EMR emr; + RECTL rclBounds; +} EMRFILLPATH,*PEMRFILLPATH,EMRSTROKEANDFILLPATH,*PEMRSTROKEANDFILLPATH,EMRSTROKEPATH,*PEMRSTROKEPATH; +typedef struct tagEMRFILLRGN { + EMR emr; + RECTL rclBounds; + DWORD cbRgnData; + DWORD ihBrush; + BYTE RgnData[1]; +} EMRFILLRGN,*PEMRFILLRGN; +typedef struct tagEMRFORMAT { + DWORD dSignature; + DWORD nVersion; + DWORD cbData; + DWORD offData; +} EMRFORMAT; +typedef struct tagEMRFRAMERGN { + EMR emr; + RECTL rclBounds; + DWORD cbRgnData; + DWORD ihBrush; + SIZEL szlStroke; + BYTE RgnData[1]; +} EMRFRAMERGN,*PEMRFRAMERGN; +typedef struct tagEMRGDICOMMENT { + EMR emr; + DWORD cbData; + BYTE Data[1]; +} EMRGDICOMMENT,*PEMRGDICOMMENT; +typedef struct tagEMRINVERTRGN { + EMR emr; + RECTL rclBounds; + DWORD cbRgnData; + BYTE RgnData[1]; +} EMRINVERTRGN,*PEMRINVERTRGN,EMRPAINTRGN,*PEMRPAINTRGN; +typedef struct tagEMRLINETO { + EMR emr; + POINTL ptl; +} EMRLINETO,*PEMRLINETO,EMRMOVETOEX,*PEMRMOVETOEX; +typedef struct tagEMRMASKBLT { + EMR emr; + RECTL rclBounds; + LONG xDest; + LONG yDest; + LONG cxDest; + LONG cyDest; + DWORD dwRop; + LONG xSrc; + LONG ySrc; + XFORM xformSrc; + COLORREF crBkColorSrc; + DWORD iUsageSrc; + DWORD offBmiSrc; + DWORD cbBmiSrc; + DWORD offBitsSrc; + DWORD cbBitsSrc; + LONG xMask; + LONG yMask; + DWORD iUsageMask; + DWORD offBmiMask; + DWORD cbBmiMask; + DWORD offBitsMask; + DWORD cbBitsMask; +} EMRMASKBLT,*PEMRMASKBLT; +typedef struct tagEMRMODIFYWORLDTRANSFORM { + EMR emr; + XFORM xform; + DWORD iMode; +} EMRMODIFYWORLDTRANSFORM,*PEMRMODIFYWORLDTRANSFORM; +typedef struct tagEMROFFSETCLIPRGN { + EMR emr; + POINTL ptlOffset; +} EMROFFSETCLIPRGN,*PEMROFFSETCLIPRGN; +typedef struct tagEMRPLGBLT { + EMR emr; + RECTL rclBounds; + POINTL aptlDest[3]; + LONG xSrc; + LONG ySrc; + LONG cxSrc; + LONG cySrc; + XFORM xformSrc; + COLORREF crBkColorSrc; + DWORD iUsageSrc; + DWORD offBmiSrc; + DWORD cbBmiSrc; + DWORD offBitsSrc; + DWORD cbBitsSrc; + LONG xMask; + LONG yMask; + DWORD iUsageMask; + DWORD offBmiMask; + DWORD cbBmiMask; + DWORD offBitsMask; + DWORD cbBitsMask; +} EMRPLGBLT,*PEMRPLGBLT; +typedef struct tagEMRPOLYDRAW { + EMR emr; + RECTL rclBounds; + DWORD cptl; + POINTL aptl[1]; + BYTE abTypes[1]; +} EMRPOLYDRAW,*PEMRPOLYDRAW; +typedef struct tagEMRPOLYDRAW16 { + EMR emr; + RECTL rclBounds; + DWORD cpts; + POINTS apts[1]; + BYTE abTypes[1]; +} EMRPOLYDRAW16,*PEMRPOLYDRAW16; +typedef struct tagEMRPOLYLINE { + EMR emr; + RECTL rclBounds; + DWORD cptl; + POINTL aptl[1]; +} EMRPOLYLINE,*PEMRPOLYLINE,EMRPOLYBEZIER,*PEMRPOLYBEZIER,EMRPOLYGON,*PEMRPOLYGON,EMRPOLYBEZIERTO,*PEMRPOLYBEZIERTO,EMRPOLYLINETO,*PEMRPOLYLINETO; +typedef struct tagEMRPOLYLINE16 { + EMR emr; + RECTL rclBounds; + DWORD cpts; + POINTL apts[1]; +} EMRPOLYLINE16,*PEMRPOLYLINE16,EMRPOLYBEZIER16,*PEMRPOLYBEZIER16,EMRPOLYGON16,*PEMRPOLYGON16,EMRPOLYBEZIERTO16,*PEMRPOLYBEZIERTO16,EMRPOLYLINETO16,*PEMRPOLYLINETO16; +typedef struct tagEMRPOLYPOLYLINE { + EMR emr; + RECTL rclBounds; + DWORD nPolys; + DWORD cptl; + DWORD aPolyCounts[1]; + POINTL aptl[1]; +} EMRPOLYPOLYLINE,*PEMRPOLYPOLYLINE,EMRPOLYPOLYGON,*PEMRPOLYPOLYGON; +typedef struct tagEMRPOLYPOLYLINE16 { + EMR emr; + RECTL rclBounds; + DWORD nPolys; + DWORD cpts; + DWORD aPolyCounts[1]; + POINTS apts[1]; +} EMRPOLYPOLYLINE16,*PEMRPOLYPOLYLINE16,EMRPOLYPOLYGON16,*PEMRPOLYPOLYGON16; +typedef struct tagEMRPOLYTEXTOUTA { + EMR emr; + RECTL rclBounds; + DWORD iGraphicsMode; + FLOAT exScale; + FLOAT eyScale; + LONG cStrings; + EMRTEXT aemrtext[1]; +} EMRPOLYTEXTOUTA,*PEMRPOLYTEXTOUTA,EMRPOLYTEXTOUTW,*PEMRPOLYTEXTOUTW; +typedef struct tagEMRRESIZEPALETTE { + EMR emr; + DWORD ihPal; + DWORD cEntries; +} EMRRESIZEPALETTE,*PEMRRESIZEPALETTE; +typedef struct tagEMRRESTOREDC { + EMR emr; + LONG iRelative; +} EMRRESTOREDC,*PEMRRESTOREDC; +typedef struct tagEMRROUNDRECT { + EMR emr; + RECTL rclBox; + SIZEL szlCorner; +} EMRROUNDRECT,*PEMRROUNDRECT; +typedef struct tagEMRSCALEVIEWPORTEXTEX { + EMR emr; + LONG xNum; + LONG xDenom; + LONG yNum; + LONG yDenom; +} EMRSCALEVIEWPORTEXTEX,*PEMRSCALEVIEWPORTEXTEX,EMRSCALEWINDOWEXTEX,*PEMRSCALEWINDOWEXTEX; +typedef struct tagEMRSELECTCOLORSPACE { + EMR emr; + DWORD ihCS; +} EMRSELECTCOLORSPACE,*PEMRSELECTCOLORSPACE,EMRDELETECOLORSPACE,*PEMRDELETECOLORSPACE; +typedef struct tagEMRSELECTOBJECT { + EMR emr; + DWORD ihObject; +} EMRSELECTOBJECT,*PEMRSELECTOBJECT,EMRDELETEOBJECT,*PEMRDELETEOBJECT; +typedef struct tagEMRSELECTPALETTE { + EMR emr; + DWORD ihPal; +} EMRSELECTPALETTE,*PEMRSELECTPALETTE; +typedef struct tagEMRSETARCDIRECTION { + EMR emr; + DWORD iArcDirection; +} EMRSETARCDIRECTION,*PEMRSETARCDIRECTION; +typedef struct tagEMRSETTEXTCOLOR { + EMR emr; + COLORREF crColor; +} EMRSETBKCOLOR,*PEMRSETBKCOLOR,EMRSETTEXTCOLOR,*PEMRSETTEXTCOLOR; +typedef struct tagEMRSETCOLORADJUSTMENT { + EMR emr; + COLORADJUSTMENT ColorAdjustment; +} EMRSETCOLORADJUSTMENT,*PEMRSETCOLORADJUSTMENT; +typedef struct tagEMRSETDIBITSTODEVICE { + EMR emr; + RECTL rclBounds; + LONG xDest; + LONG yDest; + LONG xSrc; + LONG ySrc; + LONG cxSrc; + LONG cySrc; + DWORD offBmiSrc; + DWORD cbBmiSrc; + DWORD offBitsSrc; + DWORD cbBitsSrc; + DWORD iUsageSrc; + DWORD iStartScan; + DWORD cScans; +} EMRSETDIBITSTODEVICE,*PEMRSETDIBITSTODEVICE; +typedef struct tagEMRSETMAPPERFLAGS { + EMR emr; + DWORD dwFlags; +} EMRSETMAPPERFLAGS,*PEMRSETMAPPERFLAGS; +typedef struct tagEMRSETMITERLIMIT { + EMR emr; + FLOAT eMiterLimit; +} EMRSETMITERLIMIT,*PEMRSETMITERLIMIT; +typedef struct tagEMRSETPALETTEENTRIES { + EMR emr; + DWORD ihPal; + DWORD iStart; + DWORD cEntries; + PALETTEENTRY aPalEntries[1]; +} EMRSETPALETTEENTRIES,*PEMRSETPALETTEENTRIES; +typedef struct tagEMRSETPIXELV { + EMR emr; + POINTL ptlPixel; + COLORREF crColor; +} EMRSETPIXELV,*PEMRSETPIXELV; +typedef struct tagEMRSETVIEWPORTEXTEX { + EMR emr; + SIZEL szlExtent; +} EMRSETVIEWPORTEXTEX,*PEMRSETVIEWPORTEXTEX,EMRSETWINDOWEXTEX,*PEMRSETWINDOWEXTEX; +typedef struct tagEMRSETVIEWPORTORGEX { + EMR emr; + POINTL ptlOrigin; +} EMRSETVIEWPORTORGEX,*PEMRSETVIEWPORTORGEX,EMRSETWINDOWORGEX,*PEMRSETWINDOWORGEX,EMRSETBRUSHORGEX,*PEMRSETBRUSHORGEX; +typedef struct tagEMRSETWORLDTRANSFORM { + EMR emr; + XFORM xform; +} EMRSETWORLDTRANSFORM,*PEMRSETWORLDTRANSFORM; +typedef struct tagEMRSTRETCHBLT { + EMR emr; + RECTL rclBounds; + LONG xDest; + LONG yDest; + LONG cxDest; + LONG cyDest; + DWORD dwRop; + LONG xSrc; + LONG ySrc; + XFORM xformSrc; + COLORREF crBkColorSrc; + DWORD iUsageSrc; + DWORD offBmiSrc; + DWORD cbBmiSrc; + DWORD offBitsSrc; + DWORD cbBitsSrc; + LONG cxSrc; + LONG cySrc; +} EMRSTRETCHBLT,*PEMRSTRETCHBLT; +typedef struct tagEMRSTRETCHDIBITS { + EMR emr; + RECTL rclBounds; + LONG xDest; + LONG yDest; + LONG xSrc; + LONG ySrc; + LONG cxSrc; + LONG cySrc; + DWORD offBmiSrc; + DWORD cbBmiSrc; + DWORD offBitsSrc; + DWORD cbBitsSrc; + DWORD iUsageSrc; + DWORD dwRop; + LONG cxDest; + LONG cyDest; +} EMRSTRETCHDIBITS,*PEMRSTRETCHDIBITS; +typedef struct tagABORTPATH { + EMR emr; +} EMRABORTPATH,*PEMRABORTPATH,EMRBEGINPATH,*PEMRBEGINPATH,EMRENDPATH,*PEMRENDPATH,EMRCLOSEFIGURE,*PEMRCLOSEFIGURE,EMRFLATTENPATH,*PEMRFLATTENPATH,EMRWIDENPATH,*PEMRWIDENPATH,EMRSETMETARGN,*PEMRSETMETARGN,EMRSAVEDC,*PEMRSAVEDC,EMRREALIZEPALETTE,*PEMRREALIZEPALETTE; +typedef struct tagEMRSELECTCLIPPATH { + EMR emr; + DWORD iMode; +} EMRSELECTCLIPPATH,*PEMRSELECTCLIPPATH,EMRSETBKMODE,*PEMRSETBKMODE,EMRSETMAPMODE,*PEMRSETMAPMODE,EMRSETPOLYFILLMODE,*PEMRSETPOLYFILLMODE,EMRSETROP2,*PEMRSETROP2,EMRSETSTRETCHBLTMODE,*PEMRSETSTRETCHBLTMODE,EMRSETTEXTALIGN,*PEMRSETTEXTALIGN,EMRENABLEICM,*PEMRENABLEICM; +#pragma pack(push,2) +typedef struct tagMETAHEADER { + WORD mtType; + WORD mtHeaderSize; + WORD mtVersion; + DWORD mtSize; + WORD mtNoObjects; + DWORD mtMaxRecord; + WORD mtNoParameters; +} METAHEADER,*PMETAHEADER,*LPMETAHEADER; +#pragma pack(pop) +typedef struct tagENHMETAHEADER { + DWORD iType; + DWORD nSize; + RECTL rclBounds; + RECTL rclFrame; + DWORD dSignature; + DWORD nVersion; + DWORD nBytes; + DWORD nRecords; + WORD nHandles; + WORD sReserved; + DWORD nDescription; + DWORD offDescription; + DWORD nPalEntries; + SIZEL szlDevice; + SIZEL szlMillimeters; +} ENHMETAHEADER,*LPENHMETAHEADER; +typedef struct tagMETARECORD { + DWORD rdSize; + WORD rdFunction; + WORD rdParm[1]; +} METARECORD,*PMETARECORD,*LPMETARECORD; +typedef struct tagENHMETARECORD { + DWORD iType; + DWORD nSize; + DWORD dParm[1]; +} ENHMETARECORD,*LPENHMETARECORD; +typedef struct tagHANDLETABLE { + HGDIOBJ objectHandle[1]; +} HANDLETABLE,*LPHANDLETABLE; +typedef struct tagTEXTMETRICA { + LONG tmHeight; + LONG tmAscent; + LONG tmDescent; + LONG tmInternalLeading; + LONG tmExternalLeading; + LONG tmAveCharWidth; + LONG tmMaxCharWidth; + LONG tmWeight; + LONG tmOverhang; + LONG tmDigitizedAspectX; + LONG tmDigitizedAspectY; + BYTE tmFirstChar; + BYTE tmLastChar; + BYTE tmDefaultChar; + BYTE tmBreakChar; + BYTE tmItalic; + BYTE tmUnderlined; + BYTE tmStruckOut; + BYTE tmPitchAndFamily; + BYTE tmCharSet; +} TEXTMETRICA,*PTEXTMETRICA,*LPTEXTMETRICA; +typedef struct tagTEXTMETRICW { + LONG tmHeight; + LONG tmAscent; + LONG tmDescent; + LONG tmInternalLeading; + LONG tmExternalLeading; + LONG tmAveCharWidth; + LONG tmMaxCharWidth; + LONG tmWeight; + LONG tmOverhang; + LONG tmDigitizedAspectX; + LONG tmDigitizedAspectY; + WCHAR tmFirstChar; + WCHAR tmLastChar; + WCHAR tmDefaultChar; + WCHAR tmBreakChar; + BYTE tmItalic; + BYTE tmUnderlined; + BYTE tmStruckOut; + BYTE tmPitchAndFamily; + BYTE tmCharSet; +} TEXTMETRICW,*PTEXTMETRICW,*LPTEXTMETRICW; +typedef struct _RGNDATAHEADER { + DWORD dwSize; + DWORD iType; + DWORD nCount; + DWORD nRgnSize; + RECT rcBound; +} RGNDATAHEADER; +typedef struct _RGNDATA { + RGNDATAHEADER rdh; + char Buffer[1]; +} RGNDATA,*PRGNDATA, *LPRGNDATA; +/* for GetRandomRgn */ +#define SYSRGN 4 +typedef struct tagGCP_RESULTSA { + DWORD lStructSize; + LPSTR lpOutString; + UINT *lpOrder; + INT *lpDx; + INT *lpCaretPos; + LPSTR lpClass; + LPWSTR lpGlyphs; + UINT nGlyphs; + UINT nMaxFit; +} GCP_RESULTSA,*LPGCP_RESULTSA; +typedef struct tagGCP_RESULTSW { + DWORD lStructSize; + LPWSTR lpOutString; + UINT *lpOrder; + INT *lpDx; + INT *lpCaretPos; + LPWSTR lpClass; + LPWSTR lpGlyphs; + UINT nGlyphs; + UINT nMaxFit; +} GCP_RESULTSW,*LPGCP_RESULTSW; +typedef struct _GLYPHMETRICS { + UINT gmBlackBoxX; + UINT gmBlackBoxY; + POINT gmptGlyphOrigin; + short gmCellIncX; + short gmCellIncY; +} GLYPHMETRICS,*LPGLYPHMETRICS; +typedef struct tagKERNINGPAIR { + WORD wFirst; + WORD wSecond; + int iKernAmount; +} KERNINGPAIR,*LPKERNINGPAIR; +typedef struct _FIXED { + WORD fract; + short value; +} FIXED; +typedef struct _MAT2 { + FIXED eM11; + FIXED eM12; + FIXED eM21; + FIXED eM22; +} MAT2,*LPMAT2; +typedef struct _OUTLINETEXTMETRICA { + UINT otmSize; + TEXTMETRICA otmTextMetrics; + BYTE otmFiller; + PANOSE otmPanoseNumber; + UINT otmfsSelection; + UINT otmfsType; + int otmsCharSlopeRise; + int otmsCharSlopeRun; + int otmItalicAngle; + UINT otmEMSquare; + int otmAscent; + int otmDescent; + UINT otmLineGap; + UINT otmsCapEmHeight; + UINT otmsXHeight; + RECT otmrcFontBox; + int otmMacAscent; + int otmMacDescent; + UINT otmMacLineGap; + UINT otmusMinimumPPEM; + POINT otmptSubscriptSize; + POINT otmptSubscriptOffset; + POINT otmptSuperscriptSize; + POINT otmptSuperscriptOffset; + UINT otmsStrikeoutSize; + int otmsStrikeoutPosition; + int otmsUnderscoreSize; + int otmsUnderscorePosition; + PSTR otmpFamilyName; + PSTR otmpFaceName; + PSTR otmpStyleName; + PSTR otmpFullName; +} OUTLINETEXTMETRICA,*POUTLINETEXTMETRICA,*LPOUTLINETEXTMETRICA; +typedef struct _OUTLINETEXTMETRICW { + UINT otmSize; + TEXTMETRICW otmTextMetrics; + BYTE otmFiller; + PANOSE otmPanoseNumber; + UINT otmfsSelection; + UINT otmfsType; + int otmsCharSlopeRise; + int otmsCharSlopeRun; + int otmItalicAngle; + UINT otmEMSquare; + int otmAscent; + int otmDescent; + UINT otmLineGap; + UINT otmsCapEmHeight; + UINT otmsXHeight; + RECT otmrcFontBox; + int otmMacAscent; + int otmMacDescent; + UINT otmMacLineGap; + UINT otmusMinimumPPEM; + POINT otmptSubscriptSize; + POINT otmptSubscriptOffset; + POINT otmptSuperscriptSize; + POINT otmptSuperscriptOffset; + UINT otmsStrikeoutSize; + int otmsStrikeoutPosition; + int otmsUnderscoreSize; + int otmsUnderscorePosition; + PSTR otmpFamilyName; + PSTR otmpFaceName; + PSTR otmpStyleName; + PSTR otmpFullName; +} OUTLINETEXTMETRICW,*POUTLINETEXTMETRICW,*LPOUTLINETEXTMETRICW; +typedef struct _RASTERIZER_STATUS { + short nSize; + short wFlags; + short nLanguageID; +} RASTERIZER_STATUS,*LPRASTERIZER_STATUS; +typedef struct _POLYTEXTA { + int x; + int y; + UINT n; + LPCSTR lpstr; + UINT uiFlags; + RECT rcl; + int *pdx; +} POLYTEXTA, *PPOLYTEXTA; +typedef struct _POLYTEXTW { + int x; + int y; + UINT n; + LPCWSTR lpstr; + UINT uiFlags; + RECT rcl; + int *pdx; +} POLYTEXTW, *PPOLYTEXTW; +typedef struct tagPIXELFORMATDESCRIPTOR { + WORD nSize; + WORD nVersion; + DWORD dwFlags; + BYTE iPixelType; + BYTE cColorBits; + BYTE cRedBits; + BYTE cRedShift; + BYTE cGreenBits; + BYTE cGreenShift; + BYTE cBlueBits; + BYTE cBlueShift; + BYTE cAlphaBits; + BYTE cAlphaShift; + BYTE cAccumBits; + BYTE cAccumRedBits; + BYTE cAccumGreenBits; + BYTE cAccumBlueBits; + BYTE cAccumAlphaBits; + BYTE cDepthBits; + BYTE cStencilBits; + BYTE cAuxBuffers; + BYTE iLayerType; + BYTE bReserved; + DWORD dwLayerMask; + DWORD dwVisibleMask; + DWORD dwDamageMask; +} PIXELFORMATDESCRIPTOR,*PPIXELFORMATDESCRIPTOR,*LPPIXELFORMATDESCRIPTOR; +typedef struct tagMETAFILEPICT { + LONG mm; + LONG xExt; + LONG yExt; + HMETAFILE hMF; +} METAFILEPICT,*LPMETAFILEPICT; +typedef struct tagLOCALESIGNATURE { + DWORD lsUsb[4]; + DWORD lsCsbDefault[2]; + DWORD lsCsbSupported[2]; +} LOCALESIGNATURE,*PLOCALESIGNATURE,*LPLOCALESIGNATURE; +typedef LONG LCSTYPE; +#pragma pack(push,4) +typedef struct tagNEWTEXTMETRICA { + LONG tmHeight; + LONG tmAscent; + LONG tmDescent; + LONG tmInternalLeading; + LONG tmExternalLeading; + LONG tmAveCharWidth; + LONG tmMaxCharWidth; + LONG tmWeight; + LONG tmOverhang; + LONG tmDigitizedAspectX; + LONG tmDigitizedAspectY; + BYTE tmFirstChar; + BYTE tmLastChar; + BYTE tmDefaultChar; + BYTE tmBreakChar; + BYTE tmItalic; + BYTE tmUnderlined; + BYTE tmStruckOut; + BYTE tmPitchAndFamily; + BYTE tmCharSet; + DWORD ntmFlags; + UINT ntmSizeEM; + UINT ntmCellHeight; + UINT ntmAvgWidth; +} NEWTEXTMETRICA,*PNEWTEXTMETRICA,*LPNEWTEXTMETRICA; +typedef struct tagNEWTEXTMETRICW { + LONG tmHeight; + LONG tmAscent; + LONG tmDescent; + LONG tmInternalLeading; + LONG tmExternalLeading; + LONG tmAveCharWidth; + LONG tmMaxCharWidth; + LONG tmWeight; + LONG tmOverhang; + LONG tmDigitizedAspectX; + LONG tmDigitizedAspectY; + WCHAR tmFirstChar; + WCHAR tmLastChar; + WCHAR tmDefaultChar; + WCHAR tmBreakChar; + BYTE tmItalic; + BYTE tmUnderlined; + BYTE tmStruckOut; + BYTE tmPitchAndFamily; + BYTE tmCharSet; + DWORD ntmFlags; + UINT ntmSizeEM; + UINT ntmCellHeight; + UINT ntmAvgWidth; +} NEWTEXTMETRICW,*PNEWTEXTMETRICW,*LPNEWTEXTMETRICW; +#pragma pack(pop) +typedef struct tagNEWTEXTMETRICEXA { + NEWTEXTMETRICA ntmTm; + FONTSIGNATURE ntmFontSig; +} NEWTEXTMETRICEXA; +typedef struct tagNEWTEXTMETRICEXW { + NEWTEXTMETRICW ntmTm; + FONTSIGNATURE ntmFontSig; +} NEWTEXTMETRICEXW; +typedef struct tagPELARRAY { + LONG paXCount; + LONG paYCount; + LONG paXExt; + LONG paYExt; + BYTE paRGBs; +} PELARRAY,*PPELARRAY,*LPPELARRAY; +typedef struct tagENUMLOGFONTA { + LOGFONTA elfLogFont; + BYTE elfFullName[LF_FULLFACESIZE]; + BYTE elfStyle[LF_FACESIZE]; +} ENUMLOGFONTA,*LPENUMLOGFONTA; +typedef struct tagENUMLOGFONTW { + LOGFONTW elfLogFont; + WCHAR elfFullName[LF_FULLFACESIZE]; + WCHAR elfStyle[LF_FACESIZE]; +} ENUMLOGFONTW,*LPENUMLOGFONTW; +typedef struct tagENUMLOGFONTEXA { + LOGFONTA elfLogFont; + BYTE elfFullName[LF_FULLFACESIZE]; + BYTE elfStyle[LF_FACESIZE]; + BYTE elfScript[LF_FACESIZE]; +} ENUMLOGFONTEXA,*LPENUMLOGFONTEXA; +typedef struct tagENUMLOGFONTEXW { + LOGFONTW elfLogFont; + WCHAR elfFullName[LF_FULLFACESIZE]; + BYTE elfStyle[LF_FACESIZE]; + BYTE elfScript[LF_FACESIZE]; +} ENUMLOGFONTEXW,*LPENUMLOGFONTEXW; +typedef struct tagPOINTFX { + FIXED x; + FIXED y; +} POINTFX,*LPPOINTFX; +typedef struct tagTTPOLYCURVE { + WORD wType; + WORD cpfx; + POINTFX apfx[1]; +} TTPOLYCURVE,*LPTTPOLYCURVE; +typedef struct tagTTPOLYGONHEADER { + DWORD cb; + DWORD dwType; + POINTFX pfxStart; +} TTPOLYGONHEADER,*LPTTPOLYGONHEADER; +typedef struct _POINTFLOAT { + FLOAT x; + FLOAT y; +} POINTFLOAT,*PPOINTFLOAT; +typedef struct _GLYPHMETRICSFLOAT { + FLOAT gmfBlackBoxX; + FLOAT gmfBlackBoxY; + POINTFLOAT gmfptGlyphOrigin; + FLOAT gmfCellIncX; + FLOAT gmfCellIncY; +} GLYPHMETRICSFLOAT,*PGLYPHMETRICSFLOAT,*LPGLYPHMETRICSFLOAT; +typedef struct tagLAYERPLANEDESCRIPTOR { + WORD nSize; + WORD nVersion; + DWORD dwFlags; + BYTE iPixelType; + BYTE cColorBits; + BYTE cRedBits; + BYTE cRedShift; + BYTE cGreenBits; + BYTE cGreenShift; + BYTE cBlueBits; + BYTE cBlueShift; + BYTE cAlphaBits; + BYTE cAlphaShift; + BYTE cAccumBits; + BYTE cAccumRedBits; + BYTE cAccumGreenBits; + BYTE cAccumBlueBits; + BYTE cAccumAlphaBits; + BYTE cDepthBits; + BYTE cStencilBits; + BYTE cAuxBuffers; + BYTE iLayerPlane; + BYTE bReserved; + COLORREF crTransparent; +} LAYERPLANEDESCRIPTOR,*PLAYERPLANEDESCRIPTOR,*LPLAYERPLANEDESCRIPTOR; +typedef struct _BLENDFUNCTION { + BYTE BlendOp; + BYTE BlendFlags; + BYTE SourceConstantAlpha; + BYTE AlphaFormat; +} BLENDFUNCTION,*PBLENDFUNCTION,*LPBLENDFUNCTION; +#define MM_MAX_NUMAXES 16 +typedef struct _DESIGNVECTOR { + DWORD dvReserved; + DWORD dvNumAxes; + LONG dvValues[MM_MAX_NUMAXES]; +} DESIGNVECTOR, *PDESIGNVECTOR, FAR *LPDESIGNVECTOR; +typedef USHORT COLOR16; +typedef struct _TRIVERTEX { + LONG x; + LONG y; + COLOR16 Red; + COLOR16 Green; + COLOR16 Blue; + COLOR16 Alpha; +} TRIVERTEX, *PTRIVERTEX, *LPTRIVERTEX; +typedef struct _GRADIENT_TRIANGLE { + ULONG Vertex1; + ULONG Vertex2; + ULONG Vertex3; +} GRADIENT_TRIANGLE,*PGRADIENT_TRIANGLE,*LPGRADIENT_TRIANGLE; +typedef struct _GRADIENT_RECT { + ULONG UpperLeft; + ULONG LowerRight; +}GRADIENT_RECT,*PGRADIENT_RECT,*LPGRADIENT_RECT; +typedef struct _DISPLAY_DEVICEA { + DWORD cb; + CHAR DeviceName[32]; + CHAR DeviceString[128]; + DWORD StateFlags; + CHAR DeviceID[128]; + CHAR DeviceKey[128]; +} DISPLAY_DEVICEA, *PDISPLAY_DEVICEA, *LPDISPLAY_DEVICEA; +typedef struct _DISPLAY_DEVICEW { + DWORD cb; + WCHAR DeviceName[32]; + WCHAR DeviceString[128]; + DWORD StateFlags; + WCHAR DeviceID[128]; + WCHAR DeviceKey[128]; +} DISPLAY_DEVICEW, *PDISPLAY_DEVICEW, *LPDISPLAY_DEVICEW; + +typedef BOOL (CALLBACK *ABORTPROC)(HDC,int); +typedef int (CALLBACK *MFENUMPROC)(HDC,HANDLETABLE*,METARECORD*,int,LPARAM); +typedef int (CALLBACK *ENHMFENUMPROC)(HDC,HANDLETABLE*,ENHMETARECORD*,int,LPARAM); +typedef int (CALLBACK *OLDFONTENUMPROCA)(const LOGFONTA*,const TEXTMETRICA*,DWORD,LPARAM); +typedef int (CALLBACK *OLDFONTENUMPROCW)(const LOGFONTW*,const TEXTMETRICW*,DWORD,LPARAM); +typedef OLDFONTENUMPROCA FONTENUMPROCA; +typedef OLDFONTENUMPROCW FONTENUMPROCW; +typedef int (CALLBACK *ICMENUMPROCA)(LPSTR,LPARAM); +typedef int (CALLBACK *ICMENUMPROCW)(LPWSTR,LPARAM); +typedef void (CALLBACK *GOBJENUMPROC)(LPVOID,LPARAM); +typedef void (CALLBACK *LINEDDAPROC)(int,int,LPARAM); +typedef UINT (CALLBACK *LPFNDEVMODE)(HWND,HMODULE,LPDEVMODEA,LPSTR,LPSTR,LPDEVMODEA,LPSTR,UINT); +typedef DWORD (CALLBACK *LPFNDEVCAPS)(LPSTR,LPSTR,UINT,LPSTR,LPDEVMODEA); + + +#define RGB(r,g,b) ((DWORD)(((BYTE)(r)|((WORD)(g)<<8))|(((DWORD)(BYTE)(b))<<16))) +#define MAKEPOINTS(l) (*((POINTS*)&(l))) +#define MAKEROP4(f,b) (DWORD)((((b)<<8)&0xFF000000)|(f)) +#define PALETTEINDEX(i) ((0x01000000|(COLORREF)(WORD)(i))) +#define PALETTERGB(r,g,b) (0x02000000|RGB(r,g,b)) +int WINAPI AbortDoc(HDC); +BOOL WINAPI AbortPath(HDC); +int WINAPI AddFontResourceA(LPCSTR); +int WINAPI AddFontResourceW(LPCWSTR); +#if (_WIN32_WINNT >= 0x0500) +HANDLE WINAPI AddFontMemResourceEx(PVOID,DWORD,PVOID,DWORD *); +int WINAPI AddFontResourceExA(LPCSTR,DWORD,PVOID); +int WINAPI AddFontResourceExW(LPCWSTR,DWORD,PVOID); +#endif +BOOL WINAPI AngleArc(HDC,int,int,DWORD,FLOAT,FLOAT); +BOOL WINAPI AnimatePalette(HPALETTE,UINT,UINT,const PALETTEENTRY*); +BOOL WINAPI Arc(HDC,int,int,int,int,int,int,int,int); +BOOL WINAPI ArcTo(HDC,int,int,int,int,int,int,int,int); +BOOL WINAPI BeginPath(HDC); +BOOL WINAPI BitBlt(HDC,int,int,int,int,HDC,int,int,DWORD); +BOOL WINAPI CancelDC(HDC); +BOOL WINAPI CheckColorsInGamut(HDC,PVOID,PVOID,DWORD); +BOOL WINAPI Chord(HDC,int,int,int,int,int,int,int,int); +int WINAPI ChoosePixelFormat(HDC,CONST PIXELFORMATDESCRIPTOR*); +HENHMETAFILE WINAPI CloseEnhMetaFile(HDC); +BOOL WINAPI CloseFigure(HDC); +HMETAFILE WINAPI CloseMetaFile(HDC); +BOOL WINAPI ColorMatchToTarget(HDC,HDC,DWORD); +int WINAPI CombineRgn(HRGN,HRGN,HRGN,int); +BOOL WINAPI CombineTransform(LPXFORM,const XFORM*,const XFORM*); +HENHMETAFILE WINAPI CopyEnhMetaFileA(HENHMETAFILE,LPCSTR); +HENHMETAFILE WINAPI CopyEnhMetaFileW(HENHMETAFILE,LPCWSTR); +HMETAFILE WINAPI CopyMetaFileA(HMETAFILE,LPCSTR); +HMETAFILE WINAPI CopyMetaFileW(HMETAFILE,LPCWSTR); +HBITMAP WINAPI CreateBitmap(int,int,UINT,UINT,PCVOID); +HBITMAP WINAPI CreateBitmapIndirect(const BITMAP*); +HBRUSH WINAPI CreateBrushIndirect(const LOGBRUSH*); +HCOLORSPACE WINAPI CreateColorSpaceA(LPLOGCOLORSPACEA); +HCOLORSPACE WINAPI CreateColorSpaceW(LPLOGCOLORSPACEW); +HBITMAP WINAPI CreateCompatibleBitmap(HDC,int,int); +HDC WINAPI CreateCompatibleDC(HDC); +HDC WINAPI CreateDCA(LPCSTR,LPCSTR,LPCSTR,const DEVMODEA*); +HDC WINAPI CreateDCW(LPCWSTR,LPCWSTR,LPCWSTR,const DEVMODEW*); +HBITMAP WINAPI CreateDIBitmap(HDC,const BITMAPINFOHEADER*,DWORD,PCVOID,const BITMAPINFO*,UINT); +HBRUSH WINAPI CreateDIBPatternBrush(HGLOBAL,UINT); +HBRUSH WINAPI CreateDIBPatternBrushPt(PCVOID,UINT); +HBITMAP WINAPI CreateDIBSection(HDC,const BITMAPINFO*,UINT,void**,HANDLE,DWORD); +HBITMAP WINAPI CreateDiscardableBitmap(HDC,int,int); +HRGN WINAPI CreateEllipticRgn(int,int,int,int); +HRGN WINAPI CreateEllipticRgnIndirect(LPCRECT); +HDC WINAPI CreateEnhMetaFileA(HDC,LPCSTR,LPCRECT,LPCSTR); +HDC WINAPI CreateEnhMetaFileW(HDC,LPCWSTR,LPCRECT,LPCWSTR); +HFONT WINAPI CreateFontA(int,int,int,int,int,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,LPCSTR); +HFONT WINAPI CreateFontW(int,int,int,int,int,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,LPCWSTR); +HFONT WINAPI CreateFontIndirectA(const LOGFONTA*); +HFONT WINAPI CreateFontIndirectW(const LOGFONTW*); +HPALETTE WINAPI CreateHalftonePalette(HDC); +HBRUSH WINAPI CreateHatchBrush(int,COLORREF); +HDC WINAPI CreateICA(LPCSTR,LPCSTR,LPCSTR,const DEVMODEA*); +HDC WINAPI CreateICW(LPCWSTR,LPCWSTR,LPCWSTR,const DEVMODEW*); +HDC WINAPI CreateMetaFileA(LPCSTR); +HDC WINAPI CreateMetaFileW(LPCWSTR); +HPALETTE WINAPI CreatePalette(const LOGPALETTE*); +HBRUSH WINAPI CreatePatternBrush(HBITMAP); +HPEN WINAPI CreatePen(int,int,COLORREF); +HPEN WINAPI CreatePenIndirect(const LOGPEN*); +HRGN WINAPI CreatePolygonRgn(const POINT*,int,int); +HRGN WINAPI CreatePolyPolygonRgn(const POINT*,const INT*,int,int); +HRGN WINAPI CreateRectRgn(int,int,int,int); +HRGN WINAPI CreateRectRgnIndirect(LPCRECT); +HRGN WINAPI CreateRoundRectRgn(int,int,int,int,int,int); +BOOL WINAPI CreateScalableFontResourceA(DWORD,LPCSTR,LPCSTR,LPCSTR); +BOOL WINAPI CreateScalableFontResourceW(DWORD,LPCWSTR,LPCWSTR,LPCWSTR); +HBRUSH WINAPI CreateSolidBrush(COLORREF); +BOOL WINAPI DeleteColorSpace(HCOLORSPACE); +BOOL WINAPI DeleteDC(HDC); +BOOL WINAPI DeleteEnhMetaFile(HENHMETAFILE); +BOOL WINAPI DeleteMetaFile(HMETAFILE); +BOOL WINAPI DeleteObject(HGDIOBJ); +int WINAPI DescribePixelFormat(HDC,int,UINT,LPPIXELFORMATDESCRIPTOR); +DWORD WINAPI DeviceCapabilitiesA(LPCSTR,LPCSTR,WORD,LPSTR,const DEVMODEA*); +DWORD WINAPI DeviceCapabilitiesW(LPCWSTR,LPCWSTR,WORD,LPWSTR,const DEVMODEW*); +BOOL WINAPI DPtoLP(HDC,LPPOINT,int); +int WINAPI DrawEscape(HDC,int,int,LPCSTR); +BOOL WINAPI Ellipse(HDC,int,int,int,int); +int WINAPI EndDoc(HDC); +int WINAPI EndPage(HDC); +BOOL WINAPI EndPath(HDC); +BOOL WINAPI EnumEnhMetaFile(HDC,HENHMETAFILE,ENHMFENUMPROC,PVOID,LPCRECT); +int WINAPI EnumFontFamiliesA(HDC,LPCSTR,FONTENUMPROCA,LPARAM); +int WINAPI EnumFontFamiliesW(HDC,LPCWSTR,FONTENUMPROCW,LPARAM); +int WINAPI EnumFontFamiliesExA(HDC,PLOGFONTA,FONTENUMPROCA,LPARAM,DWORD); +int WINAPI EnumFontFamiliesExW(HDC,PLOGFONTW,FONTENUMPROCW,LPARAM,DWORD); +int WINAPI EnumFontsA(HDC,LPCSTR,FONTENUMPROCA,LPARAM); +int WINAPI EnumFontsW(HDC,LPCWSTR,FONTENUMPROCW,LPARAM); +int WINAPI EnumICMProfilesA(HDC,ICMENUMPROCA,LPARAM); +int WINAPI EnumICMProfilesW(HDC,ICMENUMPROCW,LPARAM); +BOOL WINAPI EnumMetaFile(HDC,HMETAFILE,MFENUMPROC,LPARAM); +int WINAPI EnumObjects(HDC,int,GOBJENUMPROC,LPARAM); +BOOL WINAPI EqualRgn(HRGN,HRGN); +int WINAPI Escape(HDC,int,int,LPCSTR,PVOID); +int WINAPI ExcludeClipRect(HDC,int,int,int,int); +int WINAPI ExcludeUpdateRgn(HDC,HWND); +HPEN WINAPI ExtCreatePen(DWORD,DWORD,const LOGBRUSH*,DWORD,const DWORD*); +HRGN WINAPI ExtCreateRegion(const XFORM*,DWORD,const RGNDATA*); +int WINAPI ExtEscape(HDC,int,int,LPCSTR,int,LPSTR); +BOOL WINAPI ExtFloodFill(HDC,int,int,COLORREF,UINT); +int WINAPI ExtSelectClipRgn(HDC,HRGN,int); +BOOL WINAPI ExtTextOutA(HDC,int,int,UINT,LPCRECT,LPCSTR,UINT,const INT*); +BOOL WINAPI ExtTextOutW(HDC,int,int,UINT,LPCRECT,LPCWSTR,UINT,const INT*); +BOOL WINAPI FillPath(HDC); +int WINAPI FillRect(HDC,LPCRECT,HBRUSH); +int WINAPI FillRgn(HDC,HRGN,HBRUSH); +BOOL WINAPI FixBrushOrgEx(HDC,int,int,LPPOINT); +BOOL WINAPI FlattenPath(HDC); +BOOL WINAPI FloodFill(HDC,int,int,COLORREF); +BOOL WINAPI GdiComment(HDC,UINT,const BYTE*); +BOOL WINAPI GdiFlush(void); +DWORD WINAPI GdiGetBatchLimit(void); +DWORD WINAPI GdiSetBatchLimit(DWORD); +#define GetCValue(cmyk) ((BYTE)(cmyk)) +#define GetMValue(cmyk) ((BYTE)((cmyk)>> 8)) +#define GetYValue(cmyk) ((BYTE)((cmyk)>>16)) +#define GetKValue(cmyk) ((BYTE)((cmyk)>>24)) +#define CMYK(c,m,y,k) ((COLORREF)((((BYTE)(c)|((WORD)((BYTE)(m))<<8))|(((DWORD)(BYTE)(y))<<16))|(((DWORD)(BYTE)(k))<<24))) +#define GetRValue(c) ((BYTE)(c)) +#define GetGValue(c) ((BYTE)(((WORD)(c))>>8)) +#define GetBValue(c) ((BYTE)((c)>>16)) +int WINAPI GetArcDirection(HDC); +BOOL WINAPI GetAspectRatioFilterEx(HDC,LPSIZE); +LONG WINAPI GetBitmapBits(HBITMAP,LONG,PVOID); +BOOL WINAPI GetBitmapDimensionEx(HBITMAP,LPSIZE); +COLORREF WINAPI GetBkColor(HDC); +int WINAPI GetBkMode(HDC); +UINT WINAPI GetBoundsRect(HDC,LPRECT,UINT); +BOOL WINAPI GetBrushOrgEx(HDC,LPPOINT); +BOOL WINAPI GetCharABCWidthsA(HDC,UINT,UINT,LPABC); +BOOL WINAPI GetCharABCWidthsW(HDC,UINT,UINT,LPABC); +BOOL WINAPI GetCharABCWidthsFloatA(HDC,UINT,UINT,LPABCFLOAT); +BOOL WINAPI GetCharABCWidthsFloatW(HDC,UINT,UINT,LPABCFLOAT); +DWORD WINAPI GetCharacterPlacementA(HDC,LPCSTR,int,int,LPGCP_RESULTSA,DWORD); +DWORD WINAPI GetCharacterPlacementW(HDC,LPCWSTR,int,int,LPGCP_RESULTSW,DWORD); +BOOL WINAPI GetCharWidth32A(HDC,UINT,UINT,LPINT); +BOOL WINAPI GetCharWidth32W(HDC,UINT,UINT,LPINT); +BOOL WINAPI GetCharWidthA(HDC,UINT,UINT,LPINT); +BOOL WINAPI GetCharWidthW(HDC,UINT,UINT,LPINT); +BOOL WINAPI GetCharWidthFloatA(HDC,UINT,UINT,PFLOAT); +BOOL WINAPI GetCharWidthFloatW(HDC,UINT,UINT,PFLOAT); +int WINAPI GetClipBox(HDC,LPRECT); +int WINAPI GetClipRgn(HDC,HRGN); +BOOL WINAPI GetColorAdjustment(HDC,LPCOLORADJUSTMENT); +HANDLE WINAPI GetColorSpace(HDC); +HGDIOBJ WINAPI GetCurrentObject(HDC,UINT); +BOOL WINAPI GetCurrentPositionEx(HDC,LPPOINT); +HCURSOR WINAPI GetCursor(void); +BOOL WINAPI GetDCOrgEx(HDC,LPPOINT); +int WINAPI GetDeviceCaps(HDC,int); +BOOL WINAPI GetDeviceGammaRamp(HDC,PVOID); +UINT WINAPI GetDIBColorTable(HDC,UINT,UINT,RGBQUAD*); +int WINAPI GetDIBits(HDC,HBITMAP,UINT,UINT,PVOID,LPBITMAPINFO,UINT); +HENHMETAFILE WINAPI GetEnhMetaFileA(LPCSTR); +HENHMETAFILE WINAPI GetEnhMetaFileW(LPCWSTR); +UINT WINAPI GetEnhMetaFileBits(HENHMETAFILE,UINT,LPBYTE); +UINT WINAPI GetEnhMetaFileDescriptionA(HENHMETAFILE,UINT,LPSTR); +UINT WINAPI GetEnhMetaFileDescriptionW(HENHMETAFILE,UINT,LPWSTR); +UINT WINAPI GetEnhMetaFileHeader(HENHMETAFILE,UINT,LPENHMETAHEADER); +UINT WINAPI GetEnhMetaFilePaletteEntries(HENHMETAFILE,UINT,LPPALETTEENTRY); +UINT WINAPI GetEnhMetaFilePixelFormat(HENHMETAFILE,DWORD,CONST PIXELFORMATDESCRIPTOR*); +DWORD WINAPI GetFontData(HDC,DWORD,DWORD,PVOID,DWORD); +DWORD WINAPI GetFontLanguageInfo(HDC); +DWORD WINAPI GetGlyphOutlineA(HDC,UINT,UINT,LPGLYPHMETRICS,DWORD,PVOID,const MAT2*); +DWORD WINAPI GetGlyphOutlineW(HDC,UINT,UINT,LPGLYPHMETRICS,DWORD,PVOID,const MAT2*); +int WINAPI GetGraphicsMode(HDC); +BOOL WINAPI GetICMProfileA(HDC,DWORD,LPSTR); +BOOL WINAPI GetICMProfileW(HDC,DWORD,LPWSTR); +DWORD WINAPI GetKerningPairsA(HDC,DWORD,LPKERNINGPAIR); +DWORD WINAPI GetKerningPairsW(HDC,DWORD,LPKERNINGPAIR); +BOOL WINAPI GetLogColorSpaceA(HCOLORSPACE,LPLOGCOLORSPACEA,DWORD); +BOOL WINAPI GetLogColorSpaceW(HCOLORSPACE,LPLOGCOLORSPACEW,DWORD); +int WINAPI GetMapMode(HDC); +HMETAFILE WINAPI GetMetaFileA(LPCSTR); +HMETAFILE WINAPI GetMetaFileW(LPCWSTR); +UINT WINAPI GetMetaFileBitsEx(HMETAFILE,UINT,PVOID); +int WINAPI GetMetaRgn(HDC,HRGN); +BOOL WINAPI GetMiterLimit(HDC,PFLOAT); +COLORREF WINAPI GetNearestColor(HDC,COLORREF); +UINT WINAPI GetNearestPaletteIndex(HPALETTE,COLORREF); +int WINAPI GetObjectA(HGDIOBJ,int,PVOID); +int WINAPI GetObjectW(HGDIOBJ,int,PVOID); +DWORD WINAPI GetObjectType(HGDIOBJ); +UINT WINAPI GetOutlineTextMetricsA(HDC,UINT,LPOUTLINETEXTMETRICA); +UINT WINAPI GetOutlineTextMetricsW(HDC,UINT,LPOUTLINETEXTMETRICW); +UINT WINAPI GetPaletteEntries(HPALETTE,UINT,UINT,LPPALETTEENTRY); +int WINAPI GetPath(HDC,LPPOINT,PBYTE,int); +COLORREF WINAPI GetPixel(HDC,int,int); +int WINAPI GetPixelFormat(HDC); +int WINAPI GetPolyFillMode(HDC); +BOOL WINAPI GetRasterizerCaps(LPRASTERIZER_STATUS,UINT); +int WINAPI GetRandomRgn (HDC,HRGN,INT); +DWORD WINAPI GetRegionData(HRGN,DWORD,LPRGNDATA); +int WINAPI GetRgnBox(HRGN,LPRECT); +int WINAPI GetROP2(HDC); +HGDIOBJ WINAPI GetStockObject(int); +int WINAPI GetStretchBltMode(HDC); +UINT WINAPI GetSystemPaletteEntries(HDC,UINT,UINT,LPPALETTEENTRY); +UINT WINAPI GetSystemPaletteUse(HDC); +UINT WINAPI GetTextAlign(HDC); +int WINAPI GetTextCharacterExtra(HDC); +int WINAPI GetTextCharset(HDC); +int WINAPI GetTextCharsetInfo(HDC,LPFONTSIGNATURE,DWORD); +COLORREF WINAPI GetTextColor(HDC); +BOOL WINAPI GetTextExtentExPointA(HDC,LPCSTR,int,int,LPINT,LPINT,LPSIZE); +BOOL WINAPI GetTextExtentExPointW( HDC,LPCWSTR,int,int,LPINT,LPINT,LPSIZE ); +BOOL WINAPI GetTextExtentPointA(HDC,LPCSTR,int,LPSIZE); +BOOL WINAPI GetTextExtentPointW(HDC,LPCWSTR,int,LPSIZE); +BOOL WINAPI GetTextExtentPoint32A(HDC,LPCSTR,int,LPSIZE); +BOOL WINAPI GetTextExtentPoint32W( HDC,LPCWSTR,int,LPSIZE); +int WINAPI GetTextFaceA(HDC,int,LPSTR); +int WINAPI GetTextFaceW(HDC,int,LPWSTR); +BOOL WINAPI GetTextMetricsA(HDC,LPTEXTMETRICA); +BOOL WINAPI GetTextMetricsW(HDC,LPTEXTMETRICW); +BOOL WINAPI GetViewportExtEx(HDC,LPSIZE); +BOOL WINAPI GetViewportOrgEx(HDC,LPPOINT); +BOOL WINAPI GetWindowExtEx(HDC,LPSIZE); +BOOL WINAPI GetWindowOrgEx(HDC,LPPOINT); +UINT WINAPI GetWinMetaFileBits(HENHMETAFILE,UINT,LPBYTE,INT,HDC); +BOOL WINAPI GetWorldTransform(HDC,LPXFORM); +int WINAPI IntersectClipRect(HDC,int,int,int,int); +BOOL WINAPI InvertRgn(HDC,HRGN); +BOOL WINAPI LineDDA(int,int,int,int,LINEDDAPROC,LPARAM); +BOOL WINAPI LineTo(HDC,int,int); +BOOL WINAPI LPtoDP(HDC,LPPOINT,int); +BOOL WINAPI MaskBlt(HDC,int,int,int,int,HDC,int,int,HBITMAP,int,int,DWORD); +BOOL WINAPI ModifyWorldTransform(HDC,const XFORM*,DWORD); +BOOL WINAPI MoveToEx(HDC,int,int,LPPOINT); +int WINAPI OffsetClipRgn(HDC,int,int); +int WINAPI OffsetRgn(HRGN,int,int); +BOOL WINAPI OffsetViewportOrgEx(HDC,int,int,LPPOINT); +BOOL WINAPI OffsetWindowOrgEx(HDC,int,int,LPPOINT); +BOOL WINAPI PaintRgn(HDC,HRGN); +BOOL WINAPI PatBlt(HDC,int,int,int,int,DWORD); +HRGN WINAPI PathToRegion(HDC); +BOOL WINAPI Pie(HDC,int,int,int,int,int,int,int,int); +BOOL WINAPI PlayEnhMetaFile(HDC,HENHMETAFILE,LPCRECT); +BOOL WINAPI PlayEnhMetaFileRecord(HDC,LPHANDLETABLE,const ENHMETARECORD*,UINT); +BOOL WINAPI PlayMetaFile(HDC,HMETAFILE); +BOOL WINAPI PlayMetaFileRecord(HDC,LPHANDLETABLE,LPMETARECORD,UINT); +BOOL WINAPI PlgBlt(HDC,const POINT*,HDC,int,int,int,int,HBITMAP,int,int); +BOOL WINAPI PolyBezier(HDC,const POINT*,DWORD); +BOOL WINAPI PolyBezierTo(HDC,const POINT*,DWORD); +BOOL WINAPI PolyDraw(HDC,const POINT*,const BYTE*,int); +BOOL WINAPI Polygon(HDC,const POINT*,int); +BOOL WINAPI Polyline(HDC,const POINT*,int); +BOOL WINAPI PolylineTo(HDC,const POINT*,DWORD); +BOOL WINAPI PolyPolygon(HDC,const POINT*,const INT*,int); +BOOL WINAPI PolyPolyline(HDC,const POINT*,const DWORD*,DWORD); +BOOL WINAPI PolyTextOutA(HDC,const POLYTEXTA*,int); +BOOL WINAPI PolyTextOutW(HDC,const POLYTEXTW*,int); +BOOL WINAPI PtInRegion(HRGN,int,int); +BOOL WINAPI PtVisible(HDC,int,int); +UINT WINAPI RealizePalette(HDC); +BOOL WINAPI Rectangle(HDC,int,int,int,int); +BOOL WINAPI RectInRegion(HRGN,LPCRECT); +BOOL WINAPI RectVisible(HDC,LPCRECT); +BOOL WINAPI RemoveFontResourceA(LPCSTR); +BOOL WINAPI RemoveFontResourceW(LPCWSTR); +#if (_WIN32_WINNT >= 0x0500) +BOOL WINAPI RemoveFontMemResourceEx(HANDLE); +BOOL WINAPI RemoveFontResourceExA(LPCSTR,DWORD,PVOID); +BOOL WINAPI RemoveFontResourceExW(LPCWSTR,DWORD,PVOID); +#endif +HDC WINAPI ResetDCA(HDC,const DEVMODEA*); +HDC WINAPI ResetDCW(HDC,const DEVMODEW*); +BOOL WINAPI ResizePalette(HPALETTE,UINT); +BOOL WINAPI RestoreDC(HDC,int); +BOOL WINAPI RoundRect(HDC,int,int,int,int,int,int); +int WINAPI SaveDC(HDC); +BOOL WINAPI ScaleViewportExtEx(HDC,int,int,int,int,LPSIZE); +BOOL WINAPI ScaleWindowExtEx(HDC,int,int,int,int,LPSIZE); +BOOL WINAPI SelectClipPath(HDC,int); +int WINAPI SelectClipRgn(HDC,HRGN); +HGDIOBJ WINAPI SelectObject(HDC,HGDIOBJ); +HPALETTE WINAPI SelectPalette(HDC,HPALETTE,BOOL); +int WINAPI SetAbortProc(HDC,ABORTPROC); +int WINAPI SetArcDirection(HDC,int); +LONG WINAPI SetBitmapBits(HBITMAP,DWORD,PCVOID); +BOOL WINAPI SetBitmapDimensionEx(HBITMAP,int,int,LPSIZE); +COLORREF WINAPI SetBkColor(HDC,COLORREF); +int WINAPI SetBkMode(HDC,int); +UINT WINAPI SetBoundsRect(HDC,LPCRECT,UINT); +BOOL WINAPI SetBrushOrgEx(HDC,int,int,LPPOINT); +BOOL WINAPI SetColorAdjustment(HDC,const COLORADJUSTMENT*); +BOOL WINAPI SetColorSpace(HDC,HCOLORSPACE); +#if (_WIN32_WINNT >= 0x0500) +COLORREF WINAPI SetDCBrushColor(HDC,COLORREF); +COLORREF WINAPI SetDCPenColor(HDC,COLORREF); +#endif +BOOL WINAPI SetDeviceGammaRamp(HDC,PVOID); +UINT WINAPI SetDIBColorTable(HDC,UINT,UINT,const RGBQUAD*); +int WINAPI SetDIBits(HDC,HBITMAP,UINT,UINT,PCVOID,const BITMAPINFO*,UINT); +int WINAPI SetDIBitsToDevice(HDC,int,int,DWORD,DWORD,int,int,UINT,UINT,PCVOID,const BITMAPINFO*,UINT); +HENHMETAFILE WINAPI SetEnhMetaFileBits(UINT,const BYTE*); +int WINAPI SetGraphicsMode(HDC,int); +int WINAPI SetICMMode(HDC,int); +BOOL WINAPI SetICMProfileA(HDC,LPSTR); +BOOL WINAPI SetICMProfileW(HDC,LPWSTR); +int WINAPI SetMapMode(HDC,int); +DWORD WINAPI SetMapperFlags(HDC,DWORD); +HMETAFILE WINAPI SetMetaFileBitsEx(UINT,const BYTE *); +int WINAPI SetMetaRgn(HDC); +BOOL WINAPI SetMiterLimit(HDC,FLOAT,PFLOAT); +UINT WINAPI SetPaletteEntries(HPALETTE,UINT,UINT,const PALETTEENTRY*); +COLORREF WINAPI SetPixel(HDC,int,int,COLORREF); +BOOL WINAPI SetPixelFormat(HDC,int,const PIXELFORMATDESCRIPTOR*); +BOOL WINAPI SetPixelV(HDC,int,int,COLORREF); +int WINAPI SetPolyFillMode(HDC,int); +BOOL WINAPI SetRectRgn(HRGN,int,int,int,int); +int WINAPI SetROP2(HDC,int); +int WINAPI SetStretchBltMode(HDC,int); +UINT WINAPI SetSystemPaletteUse(HDC,UINT); +UINT WINAPI SetTextAlign(HDC,UINT); +int WINAPI SetTextCharacterExtra(HDC,int); +COLORREF WINAPI SetTextColor(HDC,COLORREF); +BOOL WINAPI SetTextJustification(HDC,int,int); +BOOL WINAPI SetViewportExtEx(HDC,int,int,LPSIZE); +BOOL WINAPI SetViewportOrgEx(HDC,int,int,LPPOINT); +BOOL WINAPI SetWindowExtEx(HDC,int,int,LPSIZE); +BOOL WINAPI SetWindowOrgEx(HDC,int,int,LPPOINT); +HENHMETAFILE WINAPI SetWinMetaFileBits(UINT,const BYTE*,HDC,const METAFILEPICT*); +BOOL WINAPI SetWorldTransform(HDC,const XFORM *); +int WINAPI StartDocA(HDC,const DOCINFOA*); +int WINAPI StartDocW(HDC,const DOCINFOW*); +int WINAPI StartPage(HDC); +BOOL WINAPI StretchBlt(HDC,int,int,int,int,HDC,int,int,int,int,DWORD); +int WINAPI StretchDIBits(HDC,int,int,int,int,int,int,int,int,const VOID *,const BITMAPINFO *,UINT,DWORD); +BOOL WINAPI StrokeAndFillPath(HDC); +BOOL WINAPI StrokePath(HDC); +BOOL WINAPI SwapBuffers(HDC); +BOOL WINAPI TextOutA(HDC,int,int,LPCSTR,int); +BOOL WINAPI TextOutW(HDC,int,int,LPCWSTR,int); +BOOL WINAPI TranslateCharsetInfo(PDWORD,LPCHARSETINFO,DWORD); +BOOL WINAPI UnrealizeObject(HGDIOBJ); +BOOL WINAPI UpdateColors(HDC); +BOOL WINAPI UpdateICMRegKeyA(DWORD,DWORD,LPSTR,UINT); +BOOL WINAPI UpdateICMRegKeyW(DWORD,DWORD,LPWSTR,UINT); +BOOL WINAPI WidenPath(HDC); +BOOL WINAPI wglCopyContext(HGLRC,HGLRC,UINT); +HGLRC WINAPI wglCreateContext(HDC); +HGLRC WINAPI wglCreateLayerContext(HDC,int); +BOOL WINAPI wglDeleteContext(HGLRC); +BOOL WINAPI wglDescribeLayerPlane(HDC,int,int,UINT,LPLAYERPLANEDESCRIPTOR); +HGLRC WINAPI wglGetCurrentContext(void); +HDC WINAPI wglGetCurrentDC(void); +int WINAPI wglGetLayerPaletteEntries(HDC,int,int,int,COLORREF*); +PROC WINAPI wglGetProcAddress(LPCSTR); +BOOL WINAPI wglMakeCurrent(HDC,HGLRC); +BOOL WINAPI wglRealizeLayerPalette(HDC,int,BOOL); +int WINAPI wglSetLayerPaletteEntries(HDC,int,int,int,const COLORREF*); +BOOL WINAPI wglShareLists(HGLRC,HGLRC); +BOOL WINAPI wglSwapLayerBuffers(HDC,UINT); +BOOL WINAPI wglUseFontBitmapsA(HDC,DWORD,DWORD,DWORD); +BOOL WINAPI wglUseFontBitmapsW(HDC,DWORD,DWORD,DWORD); +BOOL WINAPI wglUseFontOutlinesA(HDC,DWORD,DWORD,DWORD,FLOAT,FLOAT,int,LPGLYPHMETRICSFLOAT); +BOOL WINAPI wglUseFontOutlinesW(HDC,DWORD,DWORD,DWORD,FLOAT,FLOAT,int,LPGLYPHMETRICSFLOAT); + +#if (WINVER>= 0x0500) +BOOL WINAPI AlphaBlend(HDC,int,int,int,int,HDC,int,int,int,int,BLENDFUNCTION); +BOOL WINAPI GradientFill(HDC,PTRIVERTEX,ULONG,PVOID,ULONG,ULONG); +BOOL WINAPI TransparentBlt(HDC,int,int,int,int,HDC,int,int,int,int,UINT); +#endif + +#ifdef UNICODE +typedef WCHAR BCHAR; +typedef DOCINFOW DOCINFO, *LPDOCINFO; +typedef LOGFONTW LOGFONT,*PLOGFONT,*LPLOGFONT; +typedef TEXTMETRICW TEXTMETRIC,*PTEXTMETRIC,*LPTEXTMETRIC; +#define ICMENUMPROC ICMENUMPROCW +#define FONTENUMPROC FONTENUMPROCW +typedef DEVMODEW DEVMODE,*PDEVMODE,*LPDEVMODE; +typedef EXTLOGFONTW EXTLOGFONT,*PEXTLOGFONT,*LPEXTLOGFONT; +typedef GCP_RESULTSW GCP_RESULTS,*LPGCP_RESULTS; +typedef OUTLINETEXTMETRICW OUTLINETEXTMETRIC,*POUTLINETEXTMETRIC,*LPOUTLINETEXTMETRIC; +typedef POLYTEXTW POLYTEXT; +typedef LOGCOLORSPACEW LOGCOLORSPACE,*LPLOGCOLORSPACE; +typedef NEWTEXTMETRICW NEWTEXTMETRIC,*PNEWTEXTMETRIC,*LPNEWTEXTMETRIC; +typedef NEWTEXTMETRICEXW NEWTEXTMETRICEX; +typedef ENUMLOGFONTW ENUMLOGFONT,*LPENUMLOGFONT; +typedef ENUMLOGFONTEXW ENUMLOGFONTEX,*LPENUMLOGFONTEX; +typedef DISPLAY_DEVICEW DISPLAY_DEVICE, *PDISPLAY_DEVICE, *LPDISPLAY_DEVICE; +#define AddFontResource AddFontResourceW +#if (_WIN32_WINNT >= 0x0500) +#define AddFontResourceEx AddFontResourceExW +#endif +#define CopyEnhMetaFile CopyEnhMetaFileW +#define CopyMetaFile CopyMetaFileW +#define CreateDC CreateDCW +#define CreateEnhMetaFile CreateEnhMetaFileW +#define CreateFont CreateFontW +#define CreateFontIndirect CreateFontIndirectW +#define CreateIC CreateICW +#define CreateMetaFile CreateMetaFileW +#define CreateScalableFontResource CreateScalableFontResourceW +#define DeviceCapabilities DeviceCapabilitiesW +#define EnumFontFamilies EnumFontFamiliesW +#define EnumFontFamiliesEx EnumFontFamiliesExW +#define EnumFonts EnumFontsW +#define EnumICMProfiles EnumICMProfilesW +#define ExtTextOut ExtTextOutW +#define GetCharABCWidthsFloat GetCharABCWidthsFloatW +#define GetCharABCWidths GetCharABCWidthsW +#define GetCharacterPlacement GetCharacterPlacementW +#define GetCharWidth32 GetCharWidth32W +#define GetCharWidthFloat GetCharWidthFloatW +#define GetCharWidth GetCharWidthW +#define GetEnhMetaFile GetEnhMetaFileW +#define GetEnhMetaFileDescription GetEnhMetaFileDescriptionW +#define GetGlyphOutline GetGlyphOutlineW +#define GetICMProfile GetICMProfileW +#define GetKerningPairs GetKerningPairsW +#define GetLogColorSpace GetLogColorSpaceW +#define GetMetaFile GetMetaFileW +#define GetObject GetObjectW +#define GetOutlineTextMetrics GetOutlineTextMetricsW +#define GetTextExtentPoint GetTextExtentPointW +#define GetTextExtentExPoint GetTextExtentExPointW +#define GetTextExtentPoint32 GetTextExtentPoint32W +#define GetTextFace GetTextFaceW +#define GetTextMetrics GetTextMetricsW +#define PolyTextOut PolyTextOutW +#define RemoveFontResource RemoveFontResourceW +#if (_WIN32_WINNT >= 0x0500) +#define RemoveFontResourceEx RemoveFontResourceExW +#endif +#define ResetDC ResetDCW +#define SetICMProfile SetICMProfileW +#define StartDoc StartDocW +#define TextOut TextOutW +#define UpdateICMRegKey UpdateICMRegKeyW +#define wglUseFontBitmaps wglUseFontBitmapsW +#define wglUseFontOutlines wglUseFontOutlinesW +#else +typedef BYTE BCHAR; +typedef DOCINFOA DOCINFO, *LPDOCINFO; +typedef LOGFONTA LOGFONT,*PLOGFONT,*LPLOGFONT; +typedef TEXTMETRICA TEXTMETRIC,*PTEXTMETRIC,*LPTEXTMETRIC; +#define ICMENUMPROC ICMENUMPROCA +#define FONTENUMPROC FONTENUMPROCA +typedef DEVMODEA DEVMODE,*PDEVMODE,*LPDEVMODE; +typedef EXTLOGFONTA EXTLOGFONT,*PEXTLOGFONT,*LPEXTLOGFONT; +typedef GCP_RESULTSA GCP_RESULTS,*LPGCP_RESULTS; +typedef OUTLINETEXTMETRICA OUTLINETEXTMETRIC,*POUTLINETEXTMETRIC,*LPOUTLINETEXTMETRIC; +typedef POLYTEXTA POLYTEXT; +typedef LOGCOLORSPACEA LOGCOLORSPACE,*LPLOGCOLORSPACE; +typedef NEWTEXTMETRICA NEWTEXTMETRIC,*PNEWTEXTMETRIC,*LPNEWTEXTMETRIC; +typedef NEWTEXTMETRICEXA NEWTEXTMETRICEX; +typedef ENUMLOGFONTA ENUMLOGFONT,*LPENUMLOGFONT; +typedef ENUMLOGFONTEXA ENUMLOGFONTEX,*LPENUMLOGFONTEX; +typedef DISPLAY_DEVICEA DISPLAY_DEVICE, *PDISPLAY_DEVICE, *LPDISPLAY_DEVICE; +#define AddFontResource AddFontResourceA +#if (_WIN32_WINNT >= 0x0500) +#define AddFontResourceEx AddFontResourceExA +#endif +#define CopyEnhMetaFile CopyEnhMetaFileA +#define CopyMetaFile CopyMetaFileA +#define CreateDC CreateDCA +#define CreateEnhMetaFile CreateEnhMetaFileA +#define CreateFont CreateFontA +#define CreateFontIndirect CreateFontIndirectA +#define CreateIC CreateICA +#define CreateMetaFile CreateMetaFileA +#define CreateScalableFontResource CreateScalableFontResourceA +#define DeviceCapabilities DeviceCapabilitiesA +#define EnumFontFamilies EnumFontFamiliesA +#define EnumFontFamiliesEx EnumFontFamiliesExA +#define EnumFonts EnumFontsA +#define EnumICMProfiles EnumICMProfilesA +#define ExtTextOut ExtTextOutA +#define GetCharWidthFloat GetCharWidthFloatA +#define GetCharWidth GetCharWidthA +#define GetCharacterPlacement GetCharacterPlacementA +#define GetCharABCWidths GetCharABCWidthsA +#define GetCharABCWidthsFloat GetCharABCWidthsFloatA +#define GetCharWidth32 GetCharWidth32A +#define GetEnhMetaFile GetEnhMetaFileA +#define GetEnhMetaFileDescription GetEnhMetaFileDescriptionA +#define GetGlyphOutline GetGlyphOutlineA +#define GetICMProfile GetICMProfileA +#define GetKerningPairs GetKerningPairsA +#define GetLogColorSpace GetLogColorSpaceA +#define GetMetaFile GetMetaFileA +#define GetObject GetObjectA +#define GetOutlineTextMetrics GetOutlineTextMetricsA +#define GetTextExtentPoint GetTextExtentPointA +#define GetTextExtentExPoint GetTextExtentExPointA +#define GetTextExtentPoint32 GetTextExtentPoint32A +#define GetTextFace GetTextFaceA +#define GetTextMetrics GetTextMetricsA +#define PolyTextOut PolyTextOutA +#define RemoveFontResource RemoveFontResourceA +#if (_WIN32_WINNT >= 0x0500) +#define RemoveFontResourceEx RemoveFontResourceExA +#endif +#define ResetDC ResetDCA +#define SetICMProfile SetICMProfileA +#define StartDoc StartDocA +#define TextOut TextOutA +#define UpdateICMRegKey UpdateICMRegKeyA +#define wglUseFontBitmaps wglUseFontBitmapsA +#define wglUseFontOutlines wglUseFontOutlinesA +#endif +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/wininet.h b/reactos/w32api/include/wininet.h new file mode 100644 index 00000000000..1c3353423cb --- /dev/null +++ b/reactos/w32api/include/wininet.h @@ -0,0 +1,921 @@ +#ifndef _WININET_H +#define _WININET_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#include <windows.h> +#ifdef __cplusplus +extern "C" { +#endif +#define INTERNET_INVALID_PORT_NUMBER 0 +#define INTERNET_DEFAULT_FTP_PORT 21 +#define INTERNET_DEFAULT_GOPHER_PORT 70 +#define INTERNET_DEFAULT_HTTP_PORT 80 +#define INTERNET_DEFAULT_HTTPS_PORT 443 +#define INTERNET_DEFAULT_SOCKS_PORT 1080 +#define MAX_CACHE_ENTRY_INFO_SIZE 4096 +#define INTERNET_MAX_HOST_NAME_LENGTH 256 +#define INTERNET_MAX_USER_NAME_LENGTH 128 +#define INTERNET_MAX_PASSWORD_LENGTH 128 +#define INTERNET_MAX_PORT_NUMBER_LENGTH 5 +#define INTERNET_MAX_PORT_NUMBER_VALUE 65535 +#define INTERNET_MAX_PATH_LENGTH 2048 +#define INTERNET_MAX_SCHEME_LENGTH 32 +#define INTERNET_MAX_URL_LENGTH (INTERNET_MAX_SCHEME_LENGTH+sizeof("://")+INTERNET_MAX_PATH_LENGTH) +#define INTERNET_KEEP_ALIVE_UNKNOWN ((DWORD)-1) +#define INTERNET_KEEP_ALIVE_ENABLED 1 +#define INTERNET_KEEP_ALIVE_DISABLED 0 +#define INTERNET_REQFLAG_FROM_CACHE 1 +#define INTERNET_REQFLAG_ASYNC 2 +#define INTERNET_FLAG_RELOAD 0x80000000 +#define INTERNET_FLAG_RAW_DATA 0x40000000 +#define INTERNET_FLAG_EXISTING_CONNECT 0x20000000 +#define INTERNET_FLAG_ASYNC 0x10000000 +#define INTERNET_FLAG_PASSIVE 0x08000000 +#define INTERNET_FLAG_NO_CACHE_WRITE 0x04000000 +#define INTERNET_FLAG_DONT_CACHE INTERNET_FLAG_NO_CACHE_WRITE +#define INTERNET_FLAG_MAKE_PERSISTENT 0x02000000 +#define INTERNET_FLAG_OFFLINE 0x1000000 +#define INTERNET_FLAG_SECURE 0x800000 +#define INTERNET_FLAG_KEEP_CONNECTION 0x400000 +#define INTERNET_FLAG_NO_AUTO_REDIRECT 0x200000 +#define INTERNET_FLAG_READ_PREFETCH 0x100000 +#define INTERNET_FLAG_NO_COOKIES 0x80000 +#define INTERNET_FLAG_NO_AUTH 0x40000 +#define INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP 0x8000 +#define INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS 0x4000 +#define INTERNET_FLAG_IGNORE_CERT_DATE_INVALID 0x2000 +#define INTERNET_FLAG_IGNORE_CERT_CN_INVALID 0x1000 +#define INTERNET_FLAG_MUST_CACHE_REQUEST 16 +#define INTERNET_FLAG_RESYNCHRONIZE 0x800 +#define INTERNET_FLAG_HYPERLINK 0x400 +#define INTERNET_FLAG_NO_UI 0x200 +#define INTERNET_FLAG_PRAGMA_NOCACHE 0x100 +#define INTERNET_FLAG_TRANSFER_ASCII FTP_TRANSFER_TYPE_ASCII +#define INTERNET_FLAG_TRANSFER_BINARY FTP_TRANSFER_TYPE_BINARY +#define SECURITY_INTERNET_MASK (INTERNET_FLAG_IGNORE_CERT_CN_INVALID|INTERNET_FLAG_IGNORE_CERT_DATE_INVALID|INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS|INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP) +#define SECURITY_SET_MASK SECURITY_INTERNET_MASK +#define INTERNET_FLAGS_MASK (INTERNET_FLAG_RELOAD|INTERNET_FLAG_RAW_DATA|INTERNET_FLAG_EXISTING_CONNECT|\ +INTERNET_FLAG_ASYNC|INTERNET_FLAG_PASSIVE|INTERNET_FLAG_NO_CACHE_WRITE|INTERNET_FLAG_MAKE_PERSISTENT|INTERNET_FLAG_OFFLINE|\ +INTERNET_FLAG_SECURE|INTERNET_FLAG_KEEP_CONNECTION|INTERNET_FLAG_NO_AUTO_REDIRECT|INTERNET_FLAG_READ_PREFETCH |\ +INTERNET_FLAG_NO_COOKIES|INTERNET_FLAG_NO_AUTH|SECURITY_INTERNET_MASK|INTERNET_FLAG_TRANSFER_ASCII|INTERNET_FLAG_TRANSFER_BINARY\ +|INTERNET_FLAG_RESYNCHRONIZE|INTERNET_FLAG_MUST_CACHE_REQUEST|INTERNET_FLAG_HYPERLINK|INTERNET_FLAG_NO_UI) +#define INTERNET_OPTIONS_MASK (~INTERNET_FLAGS_MASK) +#define INTERNET_NO_CALLBACK 0 +#define INTERNET_RFC1123_FORMAT 0 +#define INTERNET_RFC1123_BUFSIZE 30 +#define ICU_ESCAPE 0x80000000 +#define ICU_USERNAME 0x40000000 +#define ICU_NO_ENCODE 0x20000000 +#define ICU_DECODE 0x10000000 +#define ICU_NO_META 0x08000000 +#define ICU_ENCODE_SPACES_ONLY 0x04000000 +#define ICU_BROWSER_MODE 0x02000000 +#define INTERNET_OPEN_TYPE_PRECONFIG 0 +#define INTERNET_OPEN_TYPE_DIRECT 1 +#define INTERNET_OPEN_TYPE_PROXY 3 +#define PRE_CONFIG_INTERNET_ACCESS INTERNET_OPEN_TYPE_PRECONFIG +#define LOCAL_INTERNET_ACCESS INTERNET_OPEN_TYPE_DIRECT +#define GATEWAY_INTERNET_ACCESS 2 +#define CERN_PROXY_INTERNET_ACCESS INTERNET_OPEN_TYPE_PROXY +#define ISO_GLOBAL 1 +#define ISO_REGISTRY 2 +#define ISO_VALID_FLAGS (ISO_GLOBAL | ISO_REGISTRY) +#define INTERNET_OPTION_CALLBACK 1 +#define INTERNET_OPTION_CONNECT_TIMEOUT 2 +#define INTERNET_OPTION_CONNECT_RETRIES 3 +#define INTERNET_OPTION_CONNECT_BACKOFF 4 +#define INTERNET_OPTION_SEND_TIMEOUT 5 +#define INTERNET_OPTION_CONTROL_SEND_TIMEOUT INTERNET_OPTION_SEND_TIMEOUT +#define INTERNET_OPTION_RECEIVE_TIMEOUT 6 +#define INTERNET_OPTION_CONTROL_RECEIVE_TIMEOUT INTERNET_OPTION_RECEIVE_TIMEOUT +#define INTERNET_OPTION_DATA_SEND_TIMEOUT 7 +#define INTERNET_OPTION_DATA_RECEIVE_TIMEOUT 8 +#define INTERNET_OPTION_HANDLE_TYPE 9 +#define INTERNET_OPTION_CONTEXT_VALUE 10 +#define INTERNET_OPTION_LISTEN_TIMEOUT 11 +#define INTERNET_OPTION_READ_BUFFER_SIZE 12 +#define INTERNET_OPTION_WRITE_BUFFER_SIZE 13 +#define INTERNET_OPTION_ASYNC_ID 15 +#define INTERNET_OPTION_ASYNC_PRIORITY 16 +#define INTERNET_OPTION_PARENT_HANDLE 21 +#define INTERNET_OPTION_KEEP_CONNECTION 22 +#define INTERNET_OPTION_REQUEST_FLAGS 23 +#define INTERNET_OPTION_EXTENDED_ERROR 24 +#define INTERNET_OPTION_OFFLINE_MODE 26 +#define INTERNET_OPTION_CACHE_STREAM_HANDLE 27 +#define INTERNET_OPTION_USERNAME 28 +#define INTERNET_OPTION_PASSWORD 29 +#define INTERNET_OPTION_ASYNC 30 +#define INTERNET_OPTION_SECURITY_FLAGS 31 +#define INTERNET_OPTION_SECURITY_CERTIFICATE_STRUCT 32 +#define INTERNET_OPTION_DATAFILE_NAME 33 +#define INTERNET_OPTION_URL 34 +#define INTERNET_OPTION_SECURITY_CERTIFICATE 35 +#define INTERNET_OPTION_SECURITY_KEY_BITNESS 36 +#define INTERNET_OPTION_REFRESH 37 +#define INTERNET_OPTION_PROXY 38 +#define INTERNET_OPTION_SETTINGS_CHANGED 39 +#define INTERNET_OPTION_VERSION 40 +#define INTERNET_OPTION_USER_AGENT 41 +#define INTERNET_OPTION_END_BROWSER_SESSION 42 +#define INTERNET_OPTION_PROXY_USERNAME 43 +#define INTERNET_OPTION_PROXY_PASSWORD 44 +#define INTERNET_FIRST_OPTION INTERNET_OPTION_CALLBACK +#define INTERNET_LAST_OPTION INTERNET_OPTION_USER_AGENT +#define INTERNET_PRIORITY_FOREGROUND 1000 +#define INTERNET_HANDLE_TYPE_INTERNET 1 +#define INTERNET_HANDLE_TYPE_CONNECT_FTP 2 +#define INTERNET_HANDLE_TYPE_CONNECT_GOPHER 3 +#define INTERNET_HANDLE_TYPE_CONNECT_HTTP 4 +#define INTERNET_HANDLE_TYPE_FTP_FIND 5 +#define INTERNET_HANDLE_TYPE_FTP_FIND_HTML 6 +#define INTERNET_HANDLE_TYPE_FTP_FILE 7 +#define INTERNET_HANDLE_TYPE_FTP_FILE_HTML 8 +#define INTERNET_HANDLE_TYPE_GOPHER_FIND 9 +#define INTERNET_HANDLE_TYPE_GOPHER_FIND_HTML 10 +#define INTERNET_HANDLE_TYPE_GOPHER_FILE 11 +#define INTERNET_HANDLE_TYPE_GOPHER_FILE_HTML 12 +#define INTERNET_HANDLE_TYPE_HTTP_REQUEST 13 +#define SECURITY_FLAG_SECURE 1 +#define SECURITY_FLAG_SSL 2 +#define SECURITY_FLAG_SSL3 4 +#define SECURITY_FLAG_PCT 8 +#define SECURITY_FLAG_PCT4 16 +#define SECURITY_FLAG_IETFSSL4 0x20 +#define SECURITY_FLAG_IGNORE_REVOCATION 0x00000080 +#define SECURITY_FLAG_IGNORE_UNKNOWN_CA 0x00000100 +#define SECURITY_FLAG_IGNORE_WRONG_USAGE 0x00000200 +#define SECURITY_FLAG_40BIT 0x10000000 +#define SECURITY_FLAG_128BIT 0x20000000 +#define SECURITY_FLAG_56BIT 0x40000000 +#define SECURITY_FLAG_UNKNOWNBIT 0x80000000 +#define SECURITY_FLAG_NORMALBITNESS SECURITY_FLAG_40BIT +#define SECURITY_FLAG_IGNORE_CERT_CN_INVALID INTERNET_FLAG_IGNORE_CERT_CN_INVALID +#define SECURITY_FLAG_IGNORE_CERT_DATE_INVALID INTERNET_FLAG_IGNORE_CERT_DATE_INVALID +#define SECURITY_FLAG_IGNORE_REDIRECT_TO_HTTPS INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS +#define SECURITY_FLAG_IGNORE_REDIRECT_TO_HTTP INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP +#define INTERNET_SERVICE_FTP 1 +#define INTERNET_SERVICE_GOPHER 2 +#define INTERNET_SERVICE_HTTP 3 +#define INTERNET_STATUS_RESOLVING_NAME 10 +#define INTERNET_STATUS_NAME_RESOLVED 11 +#define INTERNET_STATUS_CONNECTING_TO_SERVER 20 +#define INTERNET_STATUS_CONNECTED_TO_SERVER 21 +#define INTERNET_STATUS_SENDING_REQUEST 30 +#define INTERNET_STATUS_REQUEST_SENT 31 +#define INTERNET_STATUS_RECEIVING_RESPONSE 40 +#define INTERNET_STATUS_RESPONSE_RECEIVED 41 +#define INTERNET_STATUS_CTL_RESPONSE_RECEIVED 42 +#define INTERNET_STATUS_PREFETCH 43 +#define INTERNET_STATUS_CLOSING_CONNECTION 50 +#define INTERNET_STATUS_CONNECTION_CLOSED 51 +#define INTERNET_STATUS_HANDLE_CREATED 60 +#define INTERNET_STATUS_HANDLE_CLOSING 70 +#define INTERNET_STATUS_REQUEST_COMPLETE 100 +#define INTERNET_STATUS_REDIRECT 110 +#define INTERNET_INVALID_STATUS_CALLBACK ((INTERNET_STATUS_CALLBACK)(-1L)) +#define FTP_TRANSFER_TYPE_UNKNOWN 0 +#define FTP_TRANSFER_TYPE_ASCII 1 +#define FTP_TRANSFER_TYPE_BINARY 2 +#define FTP_TRANSFER_TYPE_MASK (FTP_TRANSFER_TYPE_ASCII | FTP_TRANSFER_TYPE_BINARY) +#define MAX_GOPHER_DISPLAY_TEXT 128 +#define MAX_GOPHER_SELECTOR_TEXT 256 +#define MAX_GOPHER_HOST_NAME INTERNET_MAX_HOST_NAME_LENGTH +#define MAX_GOPHER_LOCATOR_LENGTH (1+MAX_GOPHER_DISPLAY_TEXT+1+MAX_GOPHER_SELECTOR_TEXT+1+MAX_GOPHER_HOST_NAME+1+INTERNET_MAX_PORT_NUMBER_LENGTH+1+1+2) +#define GOPHER_TYPE_TEXT_FILE 1 +#define GOPHER_TYPE_DIRECTORY 2 +#define GOPHER_TYPE_CSO 4 +#define GOPHER_TYPE_ERROR 8 +#define GOPHER_TYPE_MAC_BINHEX 16 +#define GOPHER_TYPE_DOS_ARCHIVE 32 +#define GOPHER_TYPE_UNIX_UUENCODED 64 +#define GOPHER_TYPE_INDEX_SERVER 128 +#define GOPHER_TYPE_TELNET 256 +#define GOPHER_TYPE_BINARY 512 +#define GOPHER_TYPE_REDUNDANT 1024 +#define GOPHER_TYPE_TN3270 0x800 +#define GOPHER_TYPE_GIF 0x1000 +#define GOPHER_TYPE_IMAGE 0x2000 +#define GOPHER_TYPE_BITMAP 0x4000 +#define GOPHER_TYPE_MOVIE 0x8000 +#define GOPHER_TYPE_SOUND 0x10000 +#define GOPHER_TYPE_HTML 0x20000 +#define GOPHER_TYPE_PDF 0x40000 +#define GOPHER_TYPE_CALENDAR 0x80000 +#define GOPHER_TYPE_INLINE 0x100000 +#define GOPHER_TYPE_UNKNOWN 0x20000000 +#define GOPHER_TYPE_ASK 0x40000000 +#define GOPHER_TYPE_GOPHER_PLUS 0x80000000 +#define IS_GOPHER_FILE(t) (BOOL)(((t)&GOPHER_TYPE_FILE_MASK)?TRUE:FALSE) +#define IS_GOPHER_DIRECTORY(t) (BOOL)(((t)&GOPHER_TYPE_DIRECTORY)?TRUE:FALSE) +#define IS_GOPHER_PHONE_SERVER(t) (BOOL)(((t)&GOPHER_TYPE_CSO)?TRUE:FALSE) +#define IS_GOPHER_ERROR(t) (BOOL)(((t)&GOPHER_TYPE_ERROR)?TRUE:FALSE) +#define IS_GOPHER_INDEX_SERVER(t) (BOOL)(((t)&GOPHER_TYPE_INDEX_SERVER)?TRUE:FALSE) +#define IS_GOPHER_TELNET_SESSION(t) (BOOL)(((t)&GOPHER_TYPE_TELNET)?TRUE:FALSE) +#define IS_GOPHER_BACKUP_SERVER(t) (BOOL)(((t)&GOPHER_TYPE_REDUNDANT)?TRUE:FALSE) +#define IS_GOPHER_TN3270_SESSION(t) (BOOL)(((t)&GOPHER_TYPE_TN3270)?TRUE:FALSE) +#define IS_GOPHER_ASK(t) (BOOL)(((t)&GOPHER_TYPE_ASK)?TRUE:FALSE) +#define IS_GOPHER_PLUS(t) (BOOL)(((t)&GOPHER_TYPE_GOPHER_PLUS)?TRUE:FALSE) +#define IS_GOPHER_TYPE_KNOWN(t) (BOOL)(((t)&GOPHER_TYPE_UNKNOWN)?FALSE:TRUE) +#define GOPHER_TYPE_FILE_MASK (GOPHER_TYPE_TEXT_FILE|GOPHER_TYPE_MAC_BINHEX|GOPHER_TYPE_DOS_ARCHIVE|\ +GOPHER_TYPE_UNIX_UUENCODED|GOPHER_TYPE_BINARY|GOPHER_TYPE_GIF|GOPHER_TYPE_IMAGE|GOPHER_TYPE_BITMAP\ +|GOPHER_TYPE_MOVIE|GOPHER_TYPE_SOUND|GOPHER_TYPE_HTML|GOPHER_TYPE_PDF|GOPHER_TYPE_CALENDAR|GOPHER_TYPE_INLINE) +#define MAX_GOPHER_CATEGORY_NAME 128 +#define MAX_GOPHER_ATTRIBUTE_NAME 128 +#define MIN_GOPHER_ATTRIBUTE_LENGTH 256 +#define GOPHER_INFO_CATEGORY TEXT("+INFO") +#define GOPHER_ADMIN_CATEGORY TEXT("+ADMIN") +#define GOPHER_VIEWS_CATEGORY TEXT("+VIEWS") +#define GOPHER_ABSTRACT_CATEGORY TEXT("+ABSTRACT") +#define GOPHER_VERONICA_CATEGORY TEXT("+VERONICA") +#define GOPHER_ADMIN_ATTRIBUTE TEXT("Admin") +#define GOPHER_MOD_DATE_ATTRIBUTE TEXT("Mod-Date") +#define GOPHER_TTL_ATTRIBUTE TEXT("TTL") +#define GOPHER_SCORE_ATTRIBUTE TEXT("Score") +#define GOPHER_RANGE_ATTRIBUTE TEXT("Score-range") +#define GOPHER_SITE_ATTRIBUTE TEXT("Site") +#define GOPHER_ORG_ATTRIBUTE TEXT("Org") +#define GOPHER_LOCATION_ATTRIBUTE TEXT("Loc") +#define GOPHER_GEOG_ATTRIBUTE TEXT("Geog") +#define GOPHER_TIMEZONE_ATTRIBUTE TEXT("TZ") +#define GOPHER_PROVIDER_ATTRIBUTE TEXT("Provider") +#define GOPHER_VERSION_ATTRIBUTE TEXT("Version") +#define GOPHER_ABSTRACT_ATTRIBUTE TEXT("Abstract") +#define GOPHER_VIEW_ATTRIBUTE TEXT("View") +#define GOPHER_TREEWALK_ATTRIBUTE TEXT("treewalk") +#define GOPHER_ATTRIBUTE_ID_BASE 0xabcccc00 +#define GOPHER_CATEGORY_ID_ALL (GOPHER_ATTRIBUTE_ID_BASE+1) +#define GOPHER_CATEGORY_ID_INFO (GOPHER_ATTRIBUTE_ID_BASE+2) +#define GOPHER_CATEGORY_ID_ADMIN (GOPHER_ATTRIBUTE_ID_BASE+3) +#define GOPHER_CATEGORY_ID_VIEWS (GOPHER_ATTRIBUTE_ID_BASE+4) +#define GOPHER_CATEGORY_ID_ABSTRACT (GOPHER_ATTRIBUTE_ID_BASE+5) +#define GOPHER_CATEGORY_ID_VERONICA (GOPHER_ATTRIBUTE_ID_BASE+6) +#define GOPHER_CATEGORY_ID_ASK (GOPHER_ATTRIBUTE_ID_BASE+7) +#define GOPHER_CATEGORY_ID_UNKNOWN (GOPHER_ATTRIBUTE_ID_BASE+8) +#define GOPHER_ATTRIBUTE_ID_ALL (GOPHER_ATTRIBUTE_ID_BASE+9) +#define GOPHER_ATTRIBUTE_ID_ADMIN (GOPHER_ATTRIBUTE_ID_BASE+10) +#define GOPHER_ATTRIBUTE_ID_MOD_DATE (GOPHER_ATTRIBUTE_ID_BASE+11) +#define GOPHER_ATTRIBUTE_ID_TTL (GOPHER_ATTRIBUTE_ID_BASE+12) +#define GOPHER_ATTRIBUTE_ID_SCORE (GOPHER_ATTRIBUTE_ID_BASE+13) +#define GOPHER_ATTRIBUTE_ID_RANGE (GOPHER_ATTRIBUTE_ID_BASE+14) +#define GOPHER_ATTRIBUTE_ID_SITE (GOPHER_ATTRIBUTE_ID_BASE+15) +#define GOPHER_ATTRIBUTE_ID_ORG (GOPHER_ATTRIBUTE_ID_BASE+16) +#define GOPHER_ATTRIBUTE_ID_LOCATION (GOPHER_ATTRIBUTE_ID_BASE+17) +#define GOPHER_ATTRIBUTE_ID_GEOG (GOPHER_ATTRIBUTE_ID_BASE+18) +#define GOPHER_ATTRIBUTE_ID_TIMEZONE (GOPHER_ATTRIBUTE_ID_BASE+19) +#define GOPHER_ATTRIBUTE_ID_PROVIDER (GOPHER_ATTRIBUTE_ID_BASE+20) +#define GOPHER_ATTRIBUTE_ID_VERSION (GOPHER_ATTRIBUTE_ID_BASE+21) +#define GOPHER_ATTRIBUTE_ID_ABSTRACT (GOPHER_ATTRIBUTE_ID_BASE+22) +#define GOPHER_ATTRIBUTE_ID_VIEW (GOPHER_ATTRIBUTE_ID_BASE+23) +#define GOPHER_ATTRIBUTE_ID_TREEWALK (GOPHER_ATTRIBUTE_ID_BASE+24) +#define GOPHER_ATTRIBUTE_ID_UNKNOWN (GOPHER_ATTRIBUTE_ID_BASE+25) +#define HTTP_MAJOR_VERSION 1 +#define HTTP_MINOR_VERSION 0 +#define HTTP_VERSION TEXT("HTTP/1.0") +#define HTTP_QUERY_MIME_VERSION 0 +#define HTTP_QUERY_CONTENT_TYPE 1 +#define HTTP_QUERY_CONTENT_TRANSFER_ENCODING 2 +#define HTTP_QUERY_CONTENT_ID 3 +#define HTTP_QUERY_CONTENT_DESCRIPTION 4 +#define HTTP_QUERY_CONTENT_LENGTH 5 +#define HTTP_QUERY_CONTENT_LANGUAGE 6 +#define HTTP_QUERY_ALLOW 7 +#define HTTP_QUERY_PUBLIC 8 +#define HTTP_QUERY_DATE 9 +#define HTTP_QUERY_EXPIRES 10 +#define HTTP_QUERY_LAST_MODIFIED 11 +#define HTTP_QUERY_MESSAGE_ID 12 +#define HTTP_QUERY_URI 13 +#define HTTP_QUERY_DERIVED_FROM 14 +#define HTTP_QUERY_COST 15 +#define HTTP_QUERY_LINK 16 +#define HTTP_QUERY_PRAGMA 17 +#define HTTP_QUERY_VERSION 18 +#define HTTP_QUERY_STATUS_CODE 19 +#define HTTP_QUERY_STATUS_TEXT 20 +#define HTTP_QUERY_RAW_HEADERS 21 +#define HTTP_QUERY_RAW_HEADERS_CRLF 22 +#define HTTP_QUERY_CONNECTION 23 +#define HTTP_QUERY_ACCEPT 24 +#define HTTP_QUERY_ACCEPT_CHARSET 25 +#define HTTP_QUERY_ACCEPT_ENCODING 26 +#define HTTP_QUERY_ACCEPT_LANGUAGE 27 +#define HTTP_QUERY_AUTHORIZATION 28 +#define HTTP_QUERY_CONTENT_ENCODING 29 +#define HTTP_QUERY_FORWARDED 30 +#define HTTP_QUERY_FROM 31 +#define HTTP_QUERY_IF_MODIFIED_SINCE 32 +#define HTTP_QUERY_LOCATION 33 +#define HTTP_QUERY_ORIG_URI 34 +#define HTTP_QUERY_REFERER 35 +#define HTTP_QUERY_RETRY_AFTER 36 +#define HTTP_QUERY_SERVER 37 +#define HTTP_QUERY_TITLE 38 +#define HTTP_QUERY_USER_AGENT 39 +#define HTTP_QUERY_WWW_AUTHENTICATE 40 +#define HTTP_QUERY_PROXY_AUTHENTICATE 41 +#define HTTP_QUERY_ACCEPT_RANGES 42 +#define HTTP_QUERY_SET_COOKIE 43 +#define HTTP_QUERY_COOKIE 44 +#define HTTP_QUERY_REQUEST_METHOD 45 +#define HTTP_QUERY_MAX 45 +#define HTTP_QUERY_CUSTOM 65535 +#define HTTP_QUERY_FLAG_REQUEST_HEADERS 0x80000000 +#define HTTP_QUERY_FLAG_SYSTEMTIME 0x40000000 +#define HTTP_QUERY_FLAG_NUMBER 0x20000000 +#define HTTP_QUERY_FLAG_COALESCE 0x10000000 +#define HTTP_QUERY_MODIFIER_FLAGS_MASK (HTTP_QUERY_FLAG_REQUEST_HEADERS|HTTP_QUERY_FLAG_SYSTEMTIME|HTTP_QUERY_FLAG_NUMBER|HTTP_QUERY_FLAG_COALESCE) +#define HTTP_QUERY_HEADER_MASK (~HTTP_QUERY_MODIFIER_FLAGS_MASK) +#define HTTP_STATUS_OK 200 +#define HTTP_STATUS_CREATED 201 +#define HTTP_STATUS_ACCEPTED 202 +#define HTTP_STATUS_PARTIAL 203 +#define HTTP_STATUS_NO_CONTENT 204 +#define HTTP_STATUS_AMBIGUOUS 300 +#define HTTP_STATUS_MOVED 301 +#define HTTP_STATUS_REDIRECT 302 +#define HTTP_STATUS_REDIRECT_METHOD 303 +#define HTTP_STATUS_NOT_MODIFIED 304 +#define HTTP_STATUS_BAD_REQUEST 400 +#define HTTP_STATUS_DENIED 401 +#define HTTP_STATUS_PAYMENT_REQ 402 +#define HTTP_STATUS_FORBIDDEN 403 +#define HTTP_STATUS_NOT_FOUND 404 +#define HTTP_STATUS_BAD_METHOD 405 +#define HTTP_STATUS_NONE_ACCEPTABLE 406 +#define HTTP_STATUS_PROXY_AUTH_REQ 407 +#define HTTP_STATUS_REQUEST_TIMEOUT 408 +#define HTTP_STATUS_CONFLICT 409 +#define HTTP_STATUS_GONE 410 +#define HTTP_STATUS_AUTH_REFUSED 411 +#define HTTP_STATUS_SERVER_ERROR 500 +#define HTTP_STATUS_NOT_SUPPORTED 501 +#define HTTP_STATUS_BAD_GATEWAY 502 +#define HTTP_STATUS_SERVICE_UNAVAIL 503 +#define HTTP_STATUS_GATEWAY_TIMEOUT 504 +#define INTERNET_PREFETCH_PROGRESS 0 +#define INTERNET_PREFETCH_COMPLETE 1 +#define INTERNET_PREFETCH_ABORTED 2 +#define FLAGS_ERROR_UI_FILTER_FOR_ERRORS 0x01 +#define FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS 0x02 +#define FLAGS_ERROR_UI_FLAGS_GENERATE_DATA 0x04 +#define FLAGS_ERROR_UI_FLAGS_NO_UI 0x08 +#define HTTP_ADDREQ_INDEX_MASK 0x0000FFFF +#define HTTP_ADDREQ_FLAGS_MASK 0xFFFF0000 +#define HTTP_ADDREQ_FLAG_ADD_IF_NEW 0x10000000 +#define HTTP_ADDREQ_FLAG_ADD 0x20000000 +#define HTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA 0x40000000 +#define HTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON 0x01000000 +#define HTTP_ADDREQ_FLAG_COALESCE HTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA +#define HTTP_ADDREQ_FLAG_REPLACE 0x80000000 +#define INTERNET_ERROR_BASE 12000 +#define ERROR_INTERNET_OUT_OF_HANDLES (INTERNET_ERROR_BASE+1) +#define ERROR_INTERNET_TIMEOUT (INTERNET_ERROR_BASE+2) +#define ERROR_INTERNET_EXTENDED_ERROR (INTERNET_ERROR_BASE+3) +#define ERROR_INTERNET_INTERNAL_ERROR (INTERNET_ERROR_BASE+4) +#define ERROR_INTERNET_INVALID_URL (INTERNET_ERROR_BASE+5) +#define ERROR_INTERNET_UNRECOGNIZED_SCHEME (INTERNET_ERROR_BASE+6) +#define ERROR_INTERNET_NAME_NOT_RESOLVED (INTERNET_ERROR_BASE+7) +#define ERROR_INTERNET_PROTOCOL_NOT_FOUND (INTERNET_ERROR_BASE+8) +#define ERROR_INTERNET_INVALID_OPTION (INTERNET_ERROR_BASE+9) +#define ERROR_INTERNET_BAD_OPTION_LENGTH (INTERNET_ERROR_BASE+10) +#define ERROR_INTERNET_OPTION_NOT_SETTABLE (INTERNET_ERROR_BASE+11) +#define ERROR_INTERNET_SHUTDOWN (INTERNET_ERROR_BASE+12) +#define ERROR_INTERNET_INCORRECT_USER_NAME (INTERNET_ERROR_BASE+13) +#define ERROR_INTERNET_INCORRECT_PASSWORD (INTERNET_ERROR_BASE+14) +#define ERROR_INTERNET_LOGIN_FAILURE (INTERNET_ERROR_BASE+15) +#define ERROR_INTERNET_INVALID_OPERATION (INTERNET_ERROR_BASE+16) +#define ERROR_INTERNET_OPERATION_CANCELLED (INTERNET_ERROR_BASE+17) +#define ERROR_INTERNET_INCORRECT_HANDLE_TYPE (INTERNET_ERROR_BASE+18) +#define ERROR_INTERNET_INCORRECT_HANDLE_STATE (INTERNET_ERROR_BASE+19) +#define ERROR_INTERNET_NOT_PROXY_REQUEST (INTERNET_ERROR_BASE+20) +#define ERROR_INTERNET_REGISTRY_VALUE_NOT_FOUND (INTERNET_ERROR_BASE+21) +#define ERROR_INTERNET_BAD_REGISTRY_PARAMETER (INTERNET_ERROR_BASE+22) +#define ERROR_INTERNET_NO_DIRECT_ACCESS (INTERNET_ERROR_BASE+23) +#define ERROR_INTERNET_NO_CONTEXT (INTERNET_ERROR_BASE+24) +#define ERROR_INTERNET_NO_CALLBACK (INTERNET_ERROR_BASE+25) +#define ERROR_INTERNET_REQUEST_PENDING (INTERNET_ERROR_BASE+26) +#define ERROR_INTERNET_INCORRECT_FORMAT (INTERNET_ERROR_BASE+27) +#define ERROR_INTERNET_ITEM_NOT_FOUND (INTERNET_ERROR_BASE+28) +#define ERROR_INTERNET_CANNOT_CONNECT (INTERNET_ERROR_BASE+29) +#define ERROR_INTERNET_CONNECTION_ABORTED (INTERNET_ERROR_BASE+30) +#define ERROR_INTERNET_CONNECTION_RESET (INTERNET_ERROR_BASE+31) +#define ERROR_INTERNET_FORCE_RETRY (INTERNET_ERROR_BASE+32) +#define ERROR_INTERNET_INVALID_PROXY_REQUEST (INTERNET_ERROR_BASE+33) +#define ERROR_INTERNET_NEED_UI (INTERNET_ERROR_BASE+34) +#define ERROR_INTERNET_HANDLE_EXISTS (INTERNET_ERROR_BASE+36) +#define ERROR_INTERNET_SEC_CERT_DATE_INVALID (INTERNET_ERROR_BASE+37) +#define ERROR_INTERNET_SEC_CERT_CN_INVALID (INTERNET_ERROR_BASE+38) +#define ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR (INTERNET_ERROR_BASE+39) +#define ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR (INTERNET_ERROR_BASE+40) +#define ERROR_INTERNET_MIXED_SECURITY (INTERNET_ERROR_BASE+41) +#define ERROR_INTERNET_CHG_POST_IS_NON_SECURE (INTERNET_ERROR_BASE+42) +#define ERROR_INTERNET_POST_IS_NON_SECURE (INTERNET_ERROR_BASE+43) +#define ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED (INTERNET_ERROR_BASE+44) +#define ERROR_INTERNET_INVALID_CA (INTERNET_ERROR_BASE+45) +#define ERROR_INTERNET_CLIENT_AUTH_NOT_SETUP (INTERNET_ERROR_BASE+46) +#define ERROR_INTERNET_ASYNC_THREAD_FAILED (INTERNET_ERROR_BASE+47) +#define ERROR_INTERNET_REDIRECT_SCHEME_CHANGE (INTERNET_ERROR_BASE+48) +#define ERROR_FTP_TRANSFER_IN_PROGRESS (INTERNET_ERROR_BASE+110) +#define ERROR_FTP_DROPPED (INTERNET_ERROR_BASE+111) +#define ERROR_GOPHER_PROTOCOL_ERROR (INTERNET_ERROR_BASE+130) +#define ERROR_GOPHER_NOT_FILE (INTERNET_ERROR_BASE+131) +#define ERROR_GOPHER_DATA_ERROR (INTERNET_ERROR_BASE+132) +#define ERROR_GOPHER_END_OF_DATA (INTERNET_ERROR_BASE+133) +#define ERROR_GOPHER_INVALID_LOCATOR (INTERNET_ERROR_BASE+134) +#define ERROR_GOPHER_INCORRECT_LOCATOR_TYPE (INTERNET_ERROR_BASE+135) +#define ERROR_GOPHER_NOT_GOPHER_PLUS (INTERNET_ERROR_BASE+136) +#define ERROR_GOPHER_ATTRIBUTE_NOT_FOUND (INTERNET_ERROR_BASE+137) +#define ERROR_GOPHER_UNKNOWN_LOCATOR (INTERNET_ERROR_BASE+138) +#define ERROR_HTTP_HEADER_NOT_FOUND (INTERNET_ERROR_BASE+150) +#define ERROR_HTTP_DOWNLEVEL_SERVER (INTERNET_ERROR_BASE+151) +#define ERROR_HTTP_INVALID_SERVER_RESPONSE (INTERNET_ERROR_BASE+152) +#define ERROR_HTTP_INVALID_HEADER (INTERNET_ERROR_BASE+153) +#define ERROR_HTTP_INVALID_QUERY_REQUEST (INTERNET_ERROR_BASE+154) +#define ERROR_HTTP_HEADER_ALREADY_EXISTS (INTERNET_ERROR_BASE+155) +#define ERROR_HTTP_REDIRECT_FAILED (INTERNET_ERROR_BASE+156) +#define ERROR_HTTP_NOT_REDIRECTED (INTERNET_ERROR_BASE+160) +#define ERROR_INTERNET_SECURITY_CHANNEL_ERROR (INTERNET_ERROR_BASE+157) +#define ERROR_INTERNET_UNABLE_TO_CACHE_FILE (INTERNET_ERROR_BASE+158) +#define ERROR_INTERNET_TCPIP_NOT_INSTALLED (INTERNET_ERROR_BASE+159) +#define INTERNET_ERROR_LAST ERROR_INTERNET_TCPIP_NOT_INSTALLED +#define URLCACHEAPI DECLSPEC_IMPORT +#define NORMAL_CACHE_ENTRY 1 +#define STABLE_CACHE_ENTRY 2 +#define STICKY_CACHE_ENTRY 4 +#define SPARSE_CACHE_ENTRY 0x10000 +#define OCX_CACHE_ENTRY 0x20000 +#define COOKIE_CACHE_ENTRY 0x100000 +#define URLHISTORY_CACHE_ENTRY 0x200000 +#define CACHE_ENTRY_ATTRIBUTE_FC 4 +#define CACHE_ENTRY_HITRATE_FC 0x10 +#define CACHE_ENTRY_MODTIME_FC 0x40 +#define CACHE_ENTRY_EXPTIME_FC 0x80 +#define CACHE_ENTRY_ACCTIME_FC 0x100 +#define CACHE_ENTRY_SYNCTIME_FC 0x200 +#define CACHE_ENTRY_HEADERINFO_FC 0x400 +#define IRF_ASYNC WININET_API_FLAG_ASYNC +#define IRF_SYNC WININET_API_FLAG_SYNC +#define IRF_USE_CONTEXT WININET_API_FLAG_USE_CONTEXT +#define IRF_NO_WAIT 8 +#define HSR_ASYNC WININET_API_FLAG_ASYNC +#define HSR_SYNC WININET_API_FLAG_SYNC +#define HSR_USE_CONTEXT WININET_API_FLAG_USE_CONTEXT +#define HSR_INITIATE 8 +#define HSR_DOWNLOAD 16 +#define HSR_CHUNKED 32 +#define INTERNET_DIAL_UNATTENDED 0x8000 +#define INTERNET_DIALSTATE_DISCONNECTED 1 +#define INTERENT_GOONLINE_REFRESH 1 +#define INTERENT_GOONLINE_MASK 1 +#define INTERNET_AUTODIAL_FORCE_ONLINE 1 +#define INTERNET_AUTODIAL_FORCE_UNATTENDED 2 +#define INTERNET_AUTODIAL_FAILIFSECURITYCHECK 4 +#define INTERNET_CONNECTION_MODEM 1 +#define INTERNET_CONNECTION_LAN 2 +#define INTERNET_CONNECTION_PROXY 4 +#define INTERNET_CONNECTION_MODEM_BUSY 8 + +#ifndef RC_INVOKED +typedef PVOID HINTERNET; +typedef HINTERNET *LPHINTERNET; +typedef WORD INTERNET_PORT,*LPINTERNET_PORT; +typedef enum { + INTERNET_SCHEME_PARTIAL = -2, INTERNET_SCHEME_UNKNOWN = -1, + INTERNET_SCHEME_DEFAULT = 0, INTERNET_SCHEME_FTP, INTERNET_SCHEME_GOPHER, + INTERNET_SCHEME_HTTP, INTERNET_SCHEME_HTTPS, INTERNET_SCHEME_FILE, + INTERNET_SCHEME_NEWS, INTERNET_SCHEME_MAILTO, INTERNET_SCHEME_SOCKS, + INTERNET_SCHEME_FIRST = INTERNET_SCHEME_FTP, INTERNET_SCHEME_LAST = INTERNET_SCHEME_SOCKS +} INTERNET_SCHEME,*LPINTERNET_SCHEME; +typedef struct { DWORD dwResult; DWORD dwError; } INTERNET_ASYNC_RESULT,*LPINTERNET_ASYNC_RESULT; +typedef struct { DWORD dwStatus; DWORD dwSize; } INTERNET_PREFETCH_STATUS,*LPINTERNET_PREFETCH_STATUS; +typedef struct { + DWORD dwAccessType; + LPCTSTR lpszProxy; + LPCTSTR lpszProxyBypass; +} INTERNET_PROXY_INFO,*LPINTERNET_PROXY_INFO; +typedef struct { + DWORD dwMajorVersion; + DWORD dwMinorVersion; +} INTERNET_VERSION_INFO,*LPINTERNET_VERSION_INFO; +typedef struct { + DWORD dwStructSize; + LPSTR lpszScheme; + DWORD dwSchemeLength; + INTERNET_SCHEME nScheme; + LPSTR lpszHostName; + DWORD dwHostNameLength; + INTERNET_PORT nPort; + LPSTR lpszUserName; + DWORD dwUserNameLength; + LPSTR lpszPassword; + DWORD dwPasswordLength; + LPSTR lpszUrlPath; + DWORD dwUrlPathLength; + LPSTR lpszExtraInfo; + DWORD dwExtraInfoLength; +} URL_COMPONENTSA,*LPURL_COMPONENTSA; +typedef struct { + DWORD dwStructSize; + LPWSTR lpszScheme; + DWORD dwSchemeLength; + INTERNET_SCHEME nScheme; + LPWSTR lpszHostName; + DWORD dwHostNameLength; + INTERNET_PORT nPort; + LPWSTR lpszUserName; + DWORD dwUserNameLength; + LPWSTR lpszPassword; + DWORD dwPasswordLength; + LPWSTR lpszUrlPath; + DWORD dwUrlPathLength; + LPWSTR lpszExtraInfo; + DWORD dwExtraInfoLength; +} URL_COMPONENTSW,*LPURL_COMPONENTSW; +typedef struct { + FILETIME ftExpiry; + FILETIME ftStart; + LPTSTR lpszSubjectInfo; + LPTSTR lpszIssuerInfo; + LPTSTR lpszProtocolName; + LPTSTR lpszSignatureAlgName; + LPTSTR lpszEncryptionAlgName; + DWORD dwKeySize; +} INTERNET_CERTIFICATE_INFO,*LPINTERNET_CERTIFICATE_INFO; +typedef VOID (CALLBACK * INTERNET_STATUS_CALLBACK)(HINTERNET,DWORD,DWORD,PVOID,DWORD); +typedef INTERNET_STATUS_CALLBACK * LPINTERNET_STATUS_CALLBACK; +typedef struct { + CHAR DisplayString[MAX_GOPHER_DISPLAY_TEXT+1]; + DWORD GopherType; + DWORD SizeLow; + DWORD SizeHigh; + FILETIME LastModificationTime; + CHAR Locator[MAX_GOPHER_LOCATOR_LENGTH+1]; +} GOPHER_FIND_DATAA,*LPGOPHER_FIND_DATAA; +typedef struct { + WCHAR DisplayString[MAX_GOPHER_DISPLAY_TEXT+1]; + DWORD GopherType; + DWORD SizeLow; + DWORD SizeHigh; + FILETIME LastModificationTime; + WCHAR Locator[MAX_GOPHER_LOCATOR_LENGTH+1]; +} GOPHER_FIND_DATAW,*LPGOPHER_FIND_DATAW; +typedef struct { + LPCTSTR Comment; + LPCTSTR EmailAddress; +} GOPHER_ADMIN_ATTRIBUTE_TYPE,*LPGOPHER_ADMIN_ATTRIBUTE_TYPE; +typedef struct {FILETIME DateAndTime;} GOPHER_MOD_DATE_ATTRIBUTE_TYPE,*LPGOPHER_MOD_DATE_ATTRIBUTE_TYPE; +typedef struct {DWORD Ttl;} GOPHER_TTL_ATTRIBUTE_TYPE,*LPGOPHER_TTL_ATTRIBUTE_TYPE; +typedef struct {INT Score;} GOPHER_SCORE_ATTRIBUTE_TYPE,*LPGOPHER_SCORE_ATTRIBUTE_TYPE; +typedef struct { + INT LowerBound; + INT UpperBound; +} GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE,*LPGOPHER_SCORE_RANGE_ATTRIBUTE_TYPE; +typedef struct {LPCTSTR Site;} GOPHER_SITE_ATTRIBUTE_TYPE,*LPGOPHER_SITE_ATTRIBUTE_TYPE; +typedef struct {LPCTSTR Organization;} GOPHER_ORGANIZATION_ATTRIBUTE_TYPE,*LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPE; +typedef struct {LPCTSTR Location;} GOPHER_LOCATION_ATTRIBUTE_TYPE,*LPGOPHER_LOCATION_ATTRIBUTE_TYPE; +typedef struct { + INT DegreesNorth; + INT MinutesNorth; + INT SecondsNorth; + INT DegreesEast; + INT MinutesEast; + INT SecondsEast; +} GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE,*LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE; +typedef struct {INT Zone;} GOPHER_TIMEZONE_ATTRIBUTE_TYPE,*LPGOPHER_TIMEZONE_ATTRIBUTE_TYPE; +typedef struct {LPCTSTR Provider;} GOPHER_PROVIDER_ATTRIBUTE_TYPE,*LPGOPHER_PROVIDER_ATTRIBUTE_TYPE; +typedef struct {LPCTSTR Version;} GOPHER_VERSION_ATTRIBUTE_TYPE,*LPGOPHER_VERSION_ATTRIBUTE_TYPE; +typedef struct { + LPCTSTR ShortAbstract; + LPCTSTR AbstractFile; +} GOPHER_ABSTRACT_ATTRIBUTE_TYPE,*LPGOPHER_ABSTRACT_ATTRIBUTE_TYPE; +typedef struct { + LPCTSTR ContentType; + LPCTSTR Language; + DWORD Size; +} GOPHER_VIEW_ATTRIBUTE_TYPE,*LPGOPHER_VIEW_ATTRIBUTE_TYPE; +typedef struct {BOOL TreeWalk;} GOPHER_VERONICA_ATTRIBUTE_TYPE,*LPGOPHER_VERONICA_ATTRIBUTE_TYPE; +typedef struct { + LPCTSTR QuestionType; + LPCTSTR QuestionText; +} GOPHER_ASK_ATTRIBUTE_TYPE,*LPGOPHER_ASK_ATTRIBUTE_TYPE; +typedef struct {LPCTSTR Text;} GOPHER_UNKNOWN_ATTRIBUTE_TYPE,*LPGOPHER_UNKNOWN_ATTRIBUTE_TYPE; +typedef struct { + DWORD CategoryId; + DWORD AttributeId; + union { + GOPHER_ADMIN_ATTRIBUTE_TYPE Admin; + GOPHER_MOD_DATE_ATTRIBUTE_TYPE ModDate; + GOPHER_TTL_ATTRIBUTE_TYPE Ttl; + GOPHER_SCORE_ATTRIBUTE_TYPE Score; + GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE ScoreRange; + GOPHER_SITE_ATTRIBUTE_TYPE Site; + GOPHER_ORGANIZATION_ATTRIBUTE_TYPE Organization; + GOPHER_LOCATION_ATTRIBUTE_TYPE Location; + GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE GeographicalLocation; + GOPHER_TIMEZONE_ATTRIBUTE_TYPE TimeZone; + GOPHER_PROVIDER_ATTRIBUTE_TYPE Provider; + GOPHER_VERSION_ATTRIBUTE_TYPE Version; + GOPHER_ABSTRACT_ATTRIBUTE_TYPE Abstract; + GOPHER_VIEW_ATTRIBUTE_TYPE View; + GOPHER_VERONICA_ATTRIBUTE_TYPE Veronica; + GOPHER_ASK_ATTRIBUTE_TYPE Ask; + GOPHER_UNKNOWN_ATTRIBUTE_TYPE Unknown; + } AttributeType; +} GOPHER_ATTRIBUTE_TYPE,*LPGOPHER_ATTRIBUTE_TYPE; +typedef BOOL(CALLBACK *GOPHER_ATTRIBUTE_ENUMERATOR)(LPGOPHER_ATTRIBUTE_TYPE,DWORD); +typedef struct _INTERNET_CACHE_ENTRY_INFOA { + DWORD dwStructSize; + LPSTR lpszSourceUrlName; + LPSTR lpszLocalFileName; + DWORD CacheEntryType; + DWORD dwUseCount; + DWORD dwHitRate; + DWORD dwSizeLow; + DWORD dwSizeHigh; + FILETIME LastModifiedTime; + FILETIME ExpireTime; + FILETIME LastAccessTime; + FILETIME LastSyncTime; + PBYTE lpHeaderInfo; + DWORD dwHeaderInfoSize; + LPSTR lpszFileExtension; + DWORD dwReserved; +} INTERNET_CACHE_ENTRY_INFOA,*LPINTERNET_CACHE_ENTRY_INFOA; +typedef struct _INTERNET_CACHE_ENTRY_INFOW { + DWORD dwStructSize; + LPSTR lpszSourceUrlName; + LPWSTR lpszLocalFileName; + DWORD CacheEntryType; + DWORD dwUseCount; + DWORD dwHitRate; + DWORD dwSizeLow; + DWORD dwSizeHigh; + FILETIME LastModifiedTime; + FILETIME ExpireTime; + FILETIME LastAccessTime; + FILETIME LastSyncTime; + PBYTE lpHeaderInfo; + DWORD dwHeaderInfoSize; + LPWSTR lpszFileExtension; + DWORD dwReserved; +} INTERNET_CACHE_ENTRY_INFOW,*LPINTERNET_CACHE_ENTRY_INFOW; +typedef struct _INTERNET_BUFFERSA { + DWORD dwStructSize; + struct _INTERNET_BUFFERSA *Next; + LPCSTR lpcszHeader; + DWORD dwHeadersLength; + DWORD dwHeadersTotal; + LPVOID lpvBuffer; + DWORD dwBufferLength; + DWORD dwBufferTotal; + DWORD dwOffsetLow; + DWORD dwOffsetHigh; +} INTERNET_BUFFERSA,*LPINTERNET_BUFFERSA; +typedef struct _INTERNET_BUFFERSW { + DWORD dwStructSize; + struct _INTERNET_BUFFERS *Next; + LPCWSTR lpcszHeader; + DWORD dwHeadersLength; + DWORD dwHeadersTotal; + LPVOID lpvBuffer; + DWORD dwBufferLength; + DWORD dwBufferTotal; + DWORD dwOffsetLow; + DWORD dwOffsetHigh; +} INTERNET_BUFFERSW,*LPINTERNET_BUFFERSW; + +#ifdef UNICODE +typedef URL_COMPONENTSW URL_COMPONENTS; +typedef LPURL_COMPONENTSW LPURL_COMPONENTS; +typedef GOPHER_FIND_DATAW GOPHER_FIND_DATA; +typedef LPGOPHER_FIND_DATAW LPGOPHER_FIND_DATA; +typedef INTERNET_CACHE_ENTRY_INFOW INTERNET_CACHE_ENTRY_INFO; +typedef LPINTERNET_CACHE_ENTRY_INFOW LPINTERNET_CACHE_ENTRY_INFO; +typedef INTERNET_BUFFERSW INTERNET_BUFFERS,*LPINTERNET_BUFFERS; +#else +typedef URL_COMPONENTSA URL_COMPONENTS; +typedef LPURL_COMPONENTSA LPURL_COMPONENTS; +typedef GOPHER_FIND_DATAA GOPHER_FIND_DATA; +typedef LPGOPHER_FIND_DATAA LPGOPHER_FIND_DATA; +typedef INTERNET_CACHE_ENTRY_INFOA INTERNET_CACHE_ENTRY_INFO; +typedef LPINTERNET_CACHE_ENTRY_INFOA LPINTERNET_CACHE_ENTRY_INFO; +typedef INTERNET_BUFFERSA INTERNET_BUFFERS,*LPINTERNET_BUFFERS; +#endif +BOOL WINAPI InternetTimeFromSystemTime(SYSTEMTIME*,DWORD,LPSTR,DWORD); +BOOL WINAPI InternetTimeToSystemTime(LPCSTR,SYSTEMTIME*,DWORD); +BOOL WINAPI InternetDebugGetLocalTime(SYSTEMTIME*,PDWORD); +BOOL WINAPI InternetCrackUrlA(LPCSTR,DWORD,DWORD,LPURL_COMPONENTSA); +BOOL WINAPI InternetCrackUrlW(LPCWSTR,DWORD,DWORD,LPURL_COMPONENTSW); +BOOL WINAPI InternetCreateUrlA(LPURL_COMPONENTSA,DWORD,LPSTR,PDWORD); +BOOL WINAPI InternetCreateUrlW(LPURL_COMPONENTSW,DWORD,LPWSTR,PDWORD); +BOOL WINAPI InternetCanonicalizeUrlA(LPCSTR,LPSTR,PDWORD,DWORD); +BOOL WINAPI InternetCanonicalizeUrlW(LPCWSTR,LPWSTR,PDWORD,DWORD); +BOOL WINAPI InternetCombineUrlA(LPCSTR,LPCSTR,LPSTR,PDWORD,DWORD); +BOOL WINAPI InternetCombineUrlW(LPCWSTR,LPCWSTR,LPWSTR,PDWORD,DWORD); +HINTERNET WINAPI InternetOpenA(LPCSTR,DWORD,LPCSTR,LPCSTR,DWORD); +HINTERNET WINAPI InternetOpenW(LPCWSTR,DWORD,LPCWSTR,LPCWSTR,DWORD); +BOOL WINAPI InternetCloseHandle(HINTERNET); +HINTERNET WINAPI InternetConnectA(HINTERNET,LPCSTR,INTERNET_PORT,LPCSTR,LPCSTR,DWORD,DWORD,DWORD); +HINTERNET WINAPI InternetConnectW(HINTERNET,LPCWSTR,INTERNET_PORT,LPCWSTR,LPCWSTR,DWORD,DWORD,DWORD); +HINTERNET WINAPI InternetOpenUrlA(HINTERNET,LPCSTR,LPCSTR,DWORD,DWORD,DWORD); +HINTERNET WINAPI InternetOpenUrlW(HINTERNET,LPCWSTR,LPCWSTR,DWORD,DWORD,DWORD); +BOOL WINAPI InternetReadFile(HINTERNET,PVOID,DWORD,PDWORD); +DWORD WINAPI InternetSetFilePointer( HINTERNET,LONG,PVOID,DWORD,DWORD); +BOOL WINAPI InternetWriteFile(HINTERNET,LPCVOID,DWORD,PDWORD); +BOOL WINAPI InternetQueryDataAvailable( HINTERNET,PDWORD,DWORD,DWORD); +BOOL WINAPI InternetFindNextFileA(HINTERNET,PVOID); +BOOL WINAPI InternetFindNextFileW(HINTERNET,PVOID); +BOOL WINAPI InternetQueryOptionA(HINTERNET,DWORD,PVOID,PDWORD); +BOOL WINAPI InternetQueryOptionW(HINTERNET,DWORD,PVOID,PDWORD); +BOOL WINAPI InternetSetOptionA(HINTERNET,DWORD,PVOID,DWORD); +BOOL WINAPI InternetSetOptionW(HINTERNET,DWORD,PVOID,DWORD); +BOOL WINAPI InternetSetOptionExA(HINTERNET,DWORD,PVOID,DWORD,DWORD); +BOOL WINAPI InternetSetOptionExW(HINTERNET,DWORD,PVOID,DWORD,DWORD); +BOOL WINAPI InternetGetLastResponseInfoA(PDWORD,LPSTR,PDWORD); +BOOL WINAPI InternetGetLastResponseInfoW(PDWORD,LPWSTR,PDWORD); +INTERNET_STATUS_CALLBACK WINAPI InternetSetStatusCallback(HINTERNET,INTERNET_STATUS_CALLBACK); +HINTERNET WINAPI FtpFindFirstFileA(HINTERNET,LPCSTR,LPWIN32_FIND_DATA,DWORD,DWORD); +HINTERNET WINAPI FtpFindFirstFileW(HINTERNET,LPCWSTR,LPWIN32_FIND_DATA,DWORD,DWORD); +BOOL WINAPI FtpGetFileA(HINTERNET,LPCSTR,LPCSTR,BOOL,DWORD,DWORD,DWORD); +BOOL WINAPI FtpGetFileW( HINTERNET,LPCWSTR,LPCWSTR,BOOL,DWORD,DWORD,DWORD); +BOOL WINAPI FtpPutFileA(HINTERNET,LPCSTR,LPCSTR,DWORD,DWORD); +BOOL WINAPI FtpPutFileW(HINTERNET,LPCWSTR,LPCWSTR,DWORD,DWORD); +BOOL WINAPI FtpDeleteFileA(HINTERNET,LPCSTR); +BOOL WINAPI FtpDeleteFileW(HINTERNET,LPCWSTR); +BOOL WINAPI FtpRenameFileA(HINTERNET, LPCSTR,LPCSTR); +BOOL WINAPI FtpRenameFileW(HINTERNET,LPCWSTR,LPCWSTR); +HINTERNET WINAPI FtpOpenFileA(HINTERNET,LPCSTR,DWORD,DWORD,DWORD); +HINTERNET WINAPI FtpOpenFileW(HINTERNET,LPCWSTR,DWORD,DWORD,DWORD); +BOOL WINAPI FtpCreateDirectoryA(HINTERNET,LPCSTR); +BOOL WINAPI FtpCreateDirectoryW(HINTERNET,LPCWSTR); +BOOL WINAPI FtpRemoveDirectoryA(HINTERNET,LPCSTR); +BOOL WINAPI FtpRemoveDirectoryW(HINTERNET,LPCWSTR); +BOOL WINAPI FtpSetCurrentDirectoryA(HINTERNET,LPCSTR); +BOOL WINAPI FtpSetCurrentDirectoryW(HINTERNET,LPCWSTR); +BOOL WINAPI FtpGetCurrentDirectoryA(HINTERNET,LPSTR,PDWORD); +BOOL WINAPI FtpGetCurrentDirectoryW(HINTERNET,LPWSTR,PDWORD); +BOOL WINAPI FtpCommandA(HINTERNET,BOOL,DWORD,LPCSTR,DWORD); +BOOL WINAPI FtpCommandW( HINTERNET,BOOL,DWORD,LPCWSTR,DWORD); +BOOL WINAPI GopherCreateLocatorA(LPCSTR,INTERNET_PORT,LPCSTR,LPCSTR,DWORD,LPSTR,PDWORD); +BOOL WINAPI GopherCreateLocatorW(LPCWSTR,INTERNET_PORT,LPCWSTR,LPCWSTR,DWORD,LPWSTR,PDWORD); +BOOL WINAPI GopherGetLocatorTypeA(LPCSTR,PDWORD); +BOOL WINAPI GopherGetLocatorTypeW(LPCWSTR,PDWORD); +HINTERNET WINAPI GopherFindFirstFileA(HINTERNET,LPCSTR,LPCSTR,LPGOPHER_FIND_DATAA,DWORD,DWORD); +HINTERNET WINAPI GopherFindFirstFileW(HINTERNET,LPCWSTR,LPCWSTR,LPGOPHER_FIND_DATAW,DWORD,DWORD); +HINTERNET WINAPI GopherOpenFileA(HINTERNET,LPCSTR,LPCSTR,DWORD,DWORD); +HINTERNET WINAPI GopherOpenFileW(HINTERNET,LPCWSTR,LPCWSTR,DWORD,DWORD); +BOOL WINAPI GopherGetAttributeA(HINTERNET,LPCSTR,LPCSTR,LPBYTE,DWORD,PDWORD,GOPHER_ATTRIBUTE_ENUMERATOR,DWORD); +BOOL WINAPI GopherGetAttributeW(HINTERNET,LPCWSTR, +LPCWSTR, LPBYTE, DWORD, PDWORD, GOPHER_ATTRIBUTE_ENUMERATOR, DWORD); +HINTERNET WINAPI HttpOpenRequestA(HINTERNET,LPCSTR,LPCSTR,LPCSTR,LPCSTR,LPCSTR *,DWORD,DWORD); +HINTERNET WINAPI HttpOpenRequestW(HINTERNET,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR FAR * lplpszAcceptTypes , DWORD dwFlags, DWORD dwContext); +BOOL WINAPI HttpAddRequestHeadersA(HINTERNET,LPCSTR,DWORD,DWORD); +BOOL WINAPI HttpAddRequestHeadersW(HINTERNET,LPCWSTR,DWORD,DWORD); +BOOL WINAPI HttpSendRequestA(HINTERNET,LPCSTR,DWORD,PVOID,DWORD); +BOOL WINAPI HttpSendRequestW(HINTERNET,LPCWSTR,DWORD,PVOID,DWORD); +BOOL WINAPI HttpQueryInfoA(HINTERNET,DWORD,PVOID,PDWORD,PDWORD); +BOOL WINAPI HttpQueryInfoW(HINTERNET,DWORD,PVOID,PDWORD,PDWORD); +BOOL WINAPI InternetSetCookieA(LPCSTR,LPCSTR,LPCSTR); +BOOL WINAPI InternetSetCookieW(LPCSTR,LPCWSTR,LPCWSTR); +BOOL WINAPI InternetGetCookieA(LPCSTR,LPCSTR,LPSTR,PDWORD); +BOOL WINAPI InternetGetCookieW(LPCSTR,LPCWSTR,LPWSTR,PDWORD); +DWORD WINAPI InternetAttemptConnect(DWORD); +DWORD WINAPI InternetErrorDlg(HWND,HINTERNET,DWORD,DWORD,PVOID *); +DWORD WINAPI InternetConfirmZoneCrossing(HWND,LPSTR,LPSTR,BOOL); +BOOL WINAPI CreateUrlCacheEntryA(LPCSTR,DWORD,LPCSTR,LPSTR,DWORD); +BOOL WINAPI CreateUrlCacheEntryW(LPCSTR,DWORD,LPCSTR,LPWSTR,DWORD); +BOOL WINAPI CommitUrlCacheEntryA(LPCSTR,LPCSTR,FILETIME,FILETIME,DWORD,LPBYTE,DWORD,LPCSTR,DWORD); +BOOL WINAPI CommitUrlCacheEntryW(LPCSTR,LPCWSTR,FILETIME,FILETIME,DWORD,LPBYTE,DWORD,LPCWSTR,DWORD); +BOOL WINAPI RetrieveUrlCacheEntryFileA(LPCSTR,LPINTERNET_CACHE_ENTRY_INFOA,PDWORD,DWORD); +BOOL WINAPI RetrieveUrlCacheEntryFileW(LPCSTR,LPINTERNET_CACHE_ENTRY_INFOW,PDWORD,DWORD); +BOOL WINAPI UnlockUrlCacheEntryFile(LPCSTR,DWORD); +HANDLE WINAPI RetrieveUrlCacheEntryStreamA(LPCSTR,LPINTERNET_CACHE_ENTRY_INFOA,PDWORD,BOOL,DWORD); +HANDLE WINAPI RetrieveUrlCacheEntryStreamW( LPCSTR,LPINTERNET_CACHE_ENTRY_INFOW,PDWORD,BOOL,DWORD); +BOOL WINAPI ReadUrlCacheEntryStream(HANDLE,DWORD,PVOID,PDWORD,DWORD); +BOOL WINAPI UnlockUrlCacheEntryStream( HANDLE,DWORD); +BOOL WINAPI GetUrlCacheEntryInfoA(LPCSTR,LPINTERNET_CACHE_ENTRY_INFOA,PDWORD); +BOOL WINAPI GetUrlCacheEntryInfoW(LPCSTR,LPINTERNET_CACHE_ENTRY_INFOW,PDWORD); +BOOL WINAPI SetUrlCacheEntryInfoA(LPCSTR,LPINTERNET_CACHE_ENTRY_INFOA,DWORD); +BOOL WINAPI SetUrlCacheEntryInfoW(LPCSTR,LPINTERNET_CACHE_ENTRY_INFOW,DWORD); +HANDLE WINAPI FindFirstUrlCacheEntryA(LPCSTR,LPINTERNET_CACHE_ENTRY_INFOA,PDWORD); +HANDLE WINAPI FindFirstUrlCacheEntryW(LPCSTR,LPINTERNET_CACHE_ENTRY_INFOW,PDWORD); +BOOL WINAPI FindNextUrlCacheEntryA(HANDLE,LPINTERNET_CACHE_ENTRY_INFOA,PDWORD); +BOOL WINAPI FindNextUrlCacheEntryW(HANDLE,LPINTERNET_CACHE_ENTRY_INFOW,PDWORD); +BOOL WINAPI FindCloseUrlCache(HANDLE); +BOOL WINAPI DeleteUrlCacheEntry(LPCSTR); +DWORD AuthenticateUser(PVOID*,LPSTR,LPSTR,DWORD,LPSTR,DWORD,LPSTR,LPSTR); +BOOL WINAPI HttpSendRequestExA(HINTERNET,LPINTERNET_BUFFERSA,LPINTERNET_BUFFERSA,DWORD,DWORD); +BOOL WINAPI HttpSendRequestExW(HINTERNET,LPINTERNET_BUFFERSW,LPINTERNET_BUFFERSW,DWORD,DWORD); +BOOL WINAPI HttpEndRequestA(HINTERNET,LPINTERNET_BUFFERSA,DWORD,DWORD); +BOOL WINAPI HttpEndRequestW(HINTERNET,LPINTERNET_BUFFERSW,DWORD,DWORD); +DWORD WINAPI InternetDial(HWND,LPTSTR,DWORD,LPDWORD,DWORD); +DWORD WINAPI InternetHangUp(DWORD,DWORD); +BOOL WINAPI InternetGoOnline(LPTSTR,HWND,DWORD); +BOOL WINAPI InternetAutodial(DWORD,DWORD); +BOOL WINAPI InternetAutodialHangup(DWORD); +BOOL WINAPI InternetGetConnectedState(LPDWORD,DWORD); +BOOL WINAPI InternetSetDialState(LPCTSTR,DWORD,DWORD); +BOOL WINAPI InternetReadFileExA(HINTERNET,LPINTERNET_BUFFERSA,DWORD,DWORD_PTR); +BOOL WINAPI InternetReadFileExW(HINTERNET,LPINTERNET_BUFFERSW,DWORD,DWORD_PTR); + +#ifdef UNICODE +#define InternetCrackUrl InternetCrackUrlW +#define InternetCreateUrl InternetCreateUrlW +#define InternetCanonicalizeUrl InternetCanonicalizeUrlW +#define InternetCombineUrl InternetCombineUrlW +#define InternetOpen InternetOpenW +#define InternetConnect InternetConnectW +#define InternetOpenUrl InternetOpenUrlW +#define InternetFindNextFile InternetFindNextFileW +#define InternetQueryOption InternetQueryOptionW +#define InternetSetOption InternetSetOptionW +#define InternetSetOptionEx InternetSetOptionExW +#define InternetGetLastResponseInfo InternetGetLastResponseInfoW +#define InternetReadFileEx InternetReadFileExW +#define FtpFindFirstFile FtpFindFirstFileW +#define FtpGetFile FtpGetFileW +#define FtpPutFile FtpPutFileW +#define FtpDeleteFile FtpDeleteFileW +#define FtpRenameFile FtpRenameFileW +#define FtpOpenFile FtpOpenFileW +#define FtpCreateDirectory FtpCreateDirectoryW +#define FtpRemoveDirectory FtpRemoveDirectoryW +#define FtpSetCurrentDirectory FtpSetCurrentDirectoryW +#define FtpGetCurrentDirectory FtpGetCurrentDirectoryW +#define FtpCommand FtpCommandW +#define GopherGetLocatorType GopherGetLocatorTypeW +#define GopherCreateLocator GopherCreateLocatorW +#define GopherFindFirstFile GopherFindFirstFileW +#define GopherOpenFile GopherOpenFileW +#define GopherGetAttribute GopherGetAttributeW +#define HttpSendRequest HttpSendRequestW +#define HttpOpenRequest HttpOpenRequestW +#define HttpAddRequestHeaders HttpAddRequestHeadersW +#define HttpQueryInfo HttpQueryInfoW +#define InternetSetCookie InternetSetCookieW +#define InternetGetCookie InternetGetCookieW +#define CreateUrlCacheEntry CreateUrlCacheEntryW +#define RetrieveUrlCacheEntryStream RetrieveUrlCacheEntryStreamW +#define FindNextUrlCacheEntry FindNextUrlCacheEntryW +#define CommitUrlCacheEntry CommitUrlCacheEntryW +#define GetUrlCacheEntryInfo GetUrlCacheEntryInfoW +#define SetUrlCacheEntryInfo SetUrlCacheEntryInfoW +#define FindFirstUrlCacheEntry FindFirstUrlCacheEntryW +#define RetrieveUrlCacheEntryFile RetrieveUrlCacheEntryFileW +#define HttpSendRequestEx HttpSendRequestExW +#define HttpEndRequest HttpEndRequestW +#else +#define GopherGetAttribute GopherGetAttributeA +#define InternetCrackUrl InternetCrackUrlA +#define InternetCreateUrl InternetCreateUrlA +#define InternetCanonicalizeUrl InternetCanonicalizeUrlA +#define InternetCombineUrl InternetCombineUrlA +#define InternetOpen InternetOpenA +#define InternetConnect InternetConnectA +#define InternetOpenUrl InternetOpenUrlA +#define InternetFindNextFile InternetFindNextFileA +#define InternetQueryOption InternetQueryOptionA +#define InternetSetOption InternetSetOptionA +#define InternetSetOptionEx InternetSetOptionExA +#define InternetGetLastResponseInfo InternetGetLastResponseInfoA +#define InternetReadFileEx InternetReadFileExA +#define FtpFindFirstFile FtpFindFirstFileA +#define FtpGetFile FtpGetFileA +#define FtpPutFile FtpPutFileA +#define FtpDeleteFile FtpDeleteFileA +#define FtpRenameFile FtpRenameFileA +#define FtpOpenFile FtpOpenFileA +#define FtpCreateDirectory FtpCreateDirectoryA +#define FtpRemoveDirectory FtpRemoveDirectoryA +#define FtpSetCurrentDirectory FtpSetCurrentDirectoryA +#define FtpGetCurrentDirectory FtpGetCurrentDirectoryA +#define FtpCommand FtpCommandA +#define GopherGetLocatorType GopherGetLocatorTypeA +#define GopherCreateLocator GopherCreateLocatorA +#define GopherFindFirstFile GopherFindFirstFileA +#define GopherOpenFile GopherOpenFileA +#define HttpSendRequest HttpSendRequestA +#define HttpOpenRequest HttpOpenRequestA +#define HttpAddRequestHeaders HttpAddRequestHeadersA +#define HttpQueryInfo HttpQueryInfoA +#define InternetSetCookie InternetSetCookieA +#define InternetGetCookie InternetGetCookieA +#define CreateUrlCacheEntry CreateUrlCacheEntryA +#define RetrieveUrlCacheEntryStream RetrieveUrlCacheEntryStreamA +#define FindNextUrlCacheEntry FindNextUrlCacheEntryA +#define CommitUrlCacheEntry CommitUrlCacheEntryA +#define GetUrlCacheEntryInfo GetUrlCacheEntryInfoA +#define SetUrlCacheEntryInfo SetUrlCacheEntryInfoA +#define FindFirstUrlCacheEntry FindFirstUrlCacheEntryA +#define RetrieveUrlCacheEntryFile RetrieveUrlCacheEntryFileA +#define HttpSendRequestEx HttpSendRequestExA +#define HttpEndRequest HttpEndRequestA +#endif /* UNICODE */ +#endif /* RC_INVOKED */ +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/winioctl.h b/reactos/w32api/include/winioctl.h new file mode 100644 index 00000000000..2457d603ca4 --- /dev/null +++ b/reactos/w32api/include/winioctl.h @@ -0,0 +1,546 @@ +#ifndef _WINIOCTL_H +#define _WINIOCTL_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define HIST_NO_OF_BUCKETS 24 +#define HISTOGRAM_BUCKET_SIZE sizeof(HISTOGRAM_BUCKET) +#define DISK_HISTOGRAM_SIZE sizeof(DISK_HISTOGRAM) +#define CTL_CODE(t,f,m,a) (((t)<<16)|((a)<<14)|((f)<<2)|(m)) +#define DEVICE_TYPE_FROM_CTL_CODE(c) (((DWORD)((c)&0xffff0000))>>16) +#define IOCTL_STORAGE_BASE FILE_DEVICE_MASS_STORAGE +#define IOCTL_STORAGE_CHECK_VERIFY CTL_CODE(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_STORAGE_CHECK_VERIFY2 CTL_CODE(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_STORAGE_MEDIA_REMOVAL CTL_CODE(IOCTL_STORAGE_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_STORAGE_EJECT_MEDIA CTL_CODE(IOCTL_STORAGE_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_STORAGE_LOAD_MEDIA CTL_CODE(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_STORAGE_LOAD_MEDIA2 CTL_CODE(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_STORAGE_RESERVE CTL_CODE(IOCTL_STORAGE_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_STORAGE_RELEASE CTL_CODE(IOCTL_STORAGE_BASE, 0x0205, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_STORAGE_FIND_NEW_DEVICES CTL_CODE(IOCTL_STORAGE_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_STORAGE_EJECTION_CONTROL CTL_CODE(IOCTL_STORAGE_BASE, 0x0250, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_STORAGE_MCN_CONTROL CTL_CODE(IOCTL_STORAGE_BASE, 0x0251, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_STORAGE_GET_MEDIA_TYPES CTL_CODE(IOCTL_STORAGE_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_STORAGE_GET_MEDIA_TYPES_EX CTL_CODE(IOCTL_STORAGE_BASE, 0x0301, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_STORAGE_RESET_BUS CTL_CODE(IOCTL_STORAGE_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_STORAGE_RESET_DEVICE CTL_CODE(IOCTL_STORAGE_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_STORAGE_GET_DEVICE_NUMBER CTL_CODE(IOCTL_STORAGE_BASE, 0x0420, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_STORAGE_PREDICT_FAILURE CTL_CODE(IOCTL_STORAGE_BASE, 0x0440, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_DISK_BASE FILE_DEVICE_DISK +#define IOCTL_DISK_GET_DRIVE_GEOMETRY CTL_CODE(IOCTL_DISK_BASE,0,METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_DISK_GET_PARTITION_INFO CTL_CODE(IOCTL_DISK_BASE,1,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_DISK_SET_PARTITION_INFO CTL_CODE(IOCTL_DISK_BASE,2,METHOD_BUFFERED,FILE_READ_ACCESS|FILE_WRITE_ACCESS) +#define IOCTL_DISK_GET_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE,3,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_DISK_SET_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE,4,METHOD_BUFFERED,FILE_READ_ACCESS|FILE_WRITE_ACCESS) +#define IOCTL_DISK_VERIFY CTL_CODE(IOCTL_DISK_BASE,5,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_FORMAT_TRACKS CTL_CODE(IOCTL_DISK_BASE,6,METHOD_BUFFERED,FILE_READ_ACCESS|FILE_WRITE_ACCESS) +#define IOCTL_DISK_REASSIGN_BLOCKS CTL_CODE(IOCTL_DISK_BASE,7,METHOD_BUFFERED,FILE_READ_ACCESS|FILE_WRITE_ACCESS) +#define IOCTL_DISK_PERFORMANCE CTL_CODE(IOCTL_DISK_BASE,8,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_IS_WRITABLE CTL_CODE(IOCTL_DISK_BASE,9,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_LOGGING CTL_CODE(IOCTL_DISK_BASE,10,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_FORMAT_TRACKS_EX CTL_CODE(IOCTL_DISK_BASE,11,METHOD_BUFFERED,FILE_READ_ACCESS|FILE_WRITE_ACCESS) +#define IOCTL_DISK_HISTOGRAM_STRUCTURE CTL_CODE(IOCTL_DISK_BASE,12,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_HISTOGRAM_DATA CTL_CODE(IOCTL_DISK_BASE,13,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_HISTOGRAM_RESET CTL_CODE(IOCTL_DISK_BASE,14,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_REQUEST_STRUCTURE CTL_CODE(IOCTL_DISK_BASE,15,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_REQUEST_DATA CTL_CODE(IOCTL_DISK_BASE,16,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_GET_PARTITION_INFO_EX CTL_CODE(IOCTL_DISK_BASE,0x12,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_SET_PARTITION_INFO_EX CTL_CODE(IOCTL_DISK_BASE,0x13,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_GET_DRIVE_LAYOUT_EX CTL_CODE(IOCTL_DISK_BASE,0x14,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_SET_DRIVE_LAYOUT_EX CTL_CODE(IOCTL_DISK_BASE,0x15,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_CREATE_DISK CTL_CODE(IOCTL_DISK_BASE,0x16,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_GET_LENGTH_INFO CTL_CODE(IOCTL_DISK_BASE,0x17,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_DISK_PERFORMANCE_OFF CTL_CODE(IOCTL_DISK_BASE,0x18,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_GET_DRIVE_GEOMETRY_EX CTL_CODE(IOCTL_DISK_BASE,0x28,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_GROW_PARTITION CTL_CODE(IOCTL_DISK_BASE,0x34,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_GET_CACHE_INFORMATION CTL_CODE(IOCTL_DISK_BASE,0x35,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_DISK_SET_CACHE_INFORMATION CTL_CODE(IOCTL_DISK_BASE,0x36,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_DELETE_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE,0x40,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_UPDATE_PROPERTIES CTL_CODE(IOCTL_DISK_BASE,0x50,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_CHECK_VERIFY CTL_CODE(IOCTL_DISK_BASE,0x200,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_DISK_MEDIA_REMOVAL CTL_CODE(IOCTL_DISK_BASE,0x201,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_DISK_EJECT_MEDIA CTL_CODE(IOCTL_DISK_BASE,0x202,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_DISK_LOAD_MEDIA CTL_CODE(IOCTL_DISK_BASE,0x203,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_DISK_RESERVE CTL_CODE(IOCTL_DISK_BASE,0x204,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_DISK_RELEASE CTL_CODE(IOCTL_DISK_BASE,0x205,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_DISK_FIND_NEW_DEVICES CTL_CODE(IOCTL_DISK_BASE,0x206,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_DISK_REMOVE_DEVICE CTL_CODE(IOCTL_DISK_BASE,0x207,METHOD_BUFFERED,FILE_READ_ACCESS) +#define IOCTL_DISK_GET_MEDIA_TYPES CTL_CODE(IOCTL_DISK_BASE,0x300,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_DISK_UPDATE_DRIVE_SIZE CTL_CODE(IOCTL_DISK_BASE, 0x0032, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_SERIAL_LSRMST_INSERT CTL_CODE(FILE_DEVICE_SERIAL_PORT,31,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_LOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,6,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_UNLOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,7,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_DISMOUNT_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,8,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_MOUNT_DBLS_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,13,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_GET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,15,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_SET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,16,METHOD_BUFFERED,FILE_READ_DATA|FILE_WRITE_DATA) +#define FSCTL_READ_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,17,METHOD_NEITHER,FILE_READ_DATA) +#define FSCTL_WRITE_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,18,METHOD_NEITHER,FILE_WRITE_DATA) +#define FSCTL_GET_NTFS_VOLUME_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM,25,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_GET_VOLUME_BITMAP CTL_CODE(FILE_DEVICE_FILE_SYSTEM,27,METHOD_NEITHER,FILE_ANY_ACCESS) +#define FSCTL_GET_RETRIEVAL_POINTERS CTL_CODE(FILE_DEVICE_FILE_SYSTEM,28,METHOD_NEITHER,FILE_ANY_ACCESS) +#define FSCTL_MOVE_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,29,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_GET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 42, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_SET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 41, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_DELETE_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 43, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_SET_SPARSE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 49, METHOD_BUFFERED, FILE_SPECIAL_ACCESS) +#define DEVICE_TYPE DWORD +#define FILE_DEVICE_BEEP 1 +#define FILE_DEVICE_CD_ROM 2 +#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 3 +#define FILE_DEVICE_CONTROLLER 4 +#define FILE_DEVICE_DATALINK 5 +#define FILE_DEVICE_DFS 6 +#define FILE_DEVICE_DISK 7 +#define FILE_DEVICE_DISK_FILE_SYSTEM 8 +#define FILE_DEVICE_FILE_SYSTEM 9 +#define FILE_DEVICE_INPORT_PORT 10 +#define FILE_DEVICE_KEYBOARD 11 +#define FILE_DEVICE_MAILSLOT 12 +#define FILE_DEVICE_MIDI_IN 13 +#define FILE_DEVICE_MIDI_OUT 14 +#define FILE_DEVICE_MOUSE 15 +#define FILE_DEVICE_MULTI_UNC_PROVIDER 16 +#define FILE_DEVICE_NAMED_PIPE 17 +#define FILE_DEVICE_NETWORK 18 +#define FILE_DEVICE_NETWORK_BROWSER 19 +#define FILE_DEVICE_NETWORK_FILE_SYSTEM 20 +#define FILE_DEVICE_NULL 21 +#define FILE_DEVICE_PARALLEL_PORT 22 +#define FILE_DEVICE_PHYSICAL_NETCARD 23 +#define FILE_DEVICE_PRINTER 24 +#define FILE_DEVICE_SCANNER 25 +#define FILE_DEVICE_SERIAL_MOUSE_PORT 26 +#define FILE_DEVICE_SERIAL_PORT 27 +#define FILE_DEVICE_SCREEN 28 +#define FILE_DEVICE_SOUND 29 +#define FILE_DEVICE_STREAMS 30 +#define FILE_DEVICE_TAPE 31 +#define FILE_DEVICE_TAPE_FILE_SYSTEM 32 +#define FILE_DEVICE_TRANSPORT 33 +#define FILE_DEVICE_UNKNOWN 34 +#define FILE_DEVICE_VIDEO 35 +#define FILE_DEVICE_VIRTUAL_DISK 36 +#define FILE_DEVICE_WAVE_IN 37 +#define FILE_DEVICE_WAVE_OUT 38 +#define FILE_DEVICE_8042_PORT 39 +#define FILE_DEVICE_NETWORK_REDIRECTOR 40 +#define FILE_DEVICE_BATTERY 41 +#define FILE_DEVICE_BUS_EXTENDER 42 +#define FILE_DEVICE_MODEM 43 +#define FILE_DEVICE_VDM 44 +#define FILE_DEVICE_MASS_STORAGE 45 +#define FILE_DEVICE_SMB 46 +#define FILE_DEVICE_KS 47 +#define FILE_DEVICE_CHANGER 48 +#define FILE_DEVICE_SMARTCARD 49 +#define FILE_DEVICE_ACPI 50 +#define FILE_DEVICE_DVD 51 +#define FILE_DEVICE_FULLSCREEN_VIDEO 52 +#define FILE_DEVICE_DFS_FILE_SYSTEM 53 +#define FILE_DEVICE_DFS_VOLUME 54 +#define FILE_DEVICE_SERENUM 55 +#define FILE_DEVICE_TERMSRV 56 +#define FILE_DEVICE_KSEC 57 +#define PARTITION_ENTRY_UNUSED 0 +#define PARTITION_FAT_12 1 +#define PARTITION_XENIX_1 2 +#define PARTITION_XENIX_2 3 +#define PARTITION_FAT_16 4 +#define PARTITION_EXTENDED 5 +#define PARTITION_HUGE 6 +#define PARTITION_IFS 7 +#define PARTITION_FAT32 0x0B +#define PARTITION_FAT32_XINT13 0x0C +#define PARTITION_XINT13 0x0E +#define PARTITION_XINT13_EXTENDED 0x0F +#define PARTITION_PREP 0x41 +#define PARTITION_LDM 0x42 +#define PARTITION_UNIX 0x63 +#define PARTITION_NTFT 128 +#define VALID_NTFT 0xC0 +#define METHOD_BUFFERED 0 +#define METHOD_IN_DIRECT 1 +#define METHOD_OUT_DIRECT 2 +#define METHOD_NEITHER 3 +#define SERIAL_LSRMST_ESCAPE 0 +#define SERIAL_LSRMST_LSR_DATA 1 +#define SERIAL_LSRMST_LSR_NODATA 2 +#define SERIAL_LSRMST_MST 3 + +/* Also in ddk/winddk.h */ +#define FILE_ANY_ACCESS 0x00000000 +#define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS +#define FILE_READ_ACCESS 0x00000001 +#define FILE_WRITE_ACCESS 0x00000002 + +#define DISK_LOGGING_START 0 +#define DISK_LOGGING_STOP 1 +#define DISK_LOGGING_DUMP 2 +#define DISK_BINNING 3 +typedef WORD BAD_TRACK_NUMBER,*PBAD_TRACK_NUMBER; +typedef enum _BIN_TYPES {RequestSize,RequestLocation} BIN_TYPES; +typedef struct _BIN_RANGE { + LARGE_INTEGER StartValue; + LARGE_INTEGER Length; +} BIN_RANGE,*PBIN_RANGE; +typedef struct _BIN_COUNT { + BIN_RANGE BinRange; + DWORD BinCount; +} BIN_COUNT,*PBIN_COUNT; +typedef struct _BIN_RESULTS { + DWORD NumberOfBins; + BIN_COUNT BinCounts[1]; +} BIN_RESULTS,*PBIN_RESULTS; +typedef enum _PARTITION_STYLE { + PARTITION_STYLE_MBR, + PARTITION_STYLE_GPT, + PARTITION_STYLE_RAW +} PARTITION_STYLE; +typedef struct { + GUID DiskId; + DWORD MaxPartitionCount; +} CREATE_DISK_GPT,*PCREATE_DISK_GPT; +typedef struct { + DWORD Signature; +} CREATE_DISK_MBR,*PCREATE_DISK_MBR; +typedef struct { + PARTITION_STYLE PartitionStyle; + _ANONYMOUS_UNION union { + CREATE_DISK_MBR Mbr; + CREATE_DISK_GPT Gpt; + }; +} CREATE_DISK,*PCREATE_DISK; +typedef enum { + EqualPriority, + KeepPrefetchedData, + KeepReadData +} DISK_CACHE_RETENTION_PRIORITY; +typedef struct _DISK_CACHE_INFORMATION { + BOOLEAN ParametersSavable; + BOOLEAN ReadCacheEnabled; + BOOLEAN WriteCacheEnabled; + DISK_CACHE_RETENTION_PRIORITY ReadRetentionPriority; + DISK_CACHE_RETENTION_PRIORITY WriteRetentionPriority; + WORD DisablePrefetchTransferLength; + BOOLEAN PrefetchScalar; + _ANONYMOUS_UNION union { + struct { + WORD Minimum; + WORD Maximum; + WORD MaximumBlocks; + } ScalarPrefetch; + struct { + WORD Minimum; + WORD Maximum; + } BlockPrefetch; + }; +} DISK_CACHE_INFORMATION,*PDISK_CACHE_INFORMATION; +typedef enum _DETECTION_TYPE { + DetectNone, + DetectInt13, + DetectExInt13 +} DETECTION_TYPE; +typedef struct _DISK_INT13_INFO { + WORD DriveSelect; + DWORD MaxCylinders; + WORD SectorsPerTrack; + WORD MaxHeads; + WORD NumberDrives; +} DISK_INT13_INFO,*PDISK_INT13_INFO; +typedef struct _DISK_EX_INT13_INFO { + WORD ExBufferSize; + WORD ExFlags; + DWORD ExCylinders; + DWORD ExHeads; + DWORD ExSectorsPerTrack; + DWORD64 ExSectorsPerDrive; + WORD ExSectorSize; + WORD ExReserved; +} DISK_EX_INT13_INFO,*PDISK_EX_INT13_INFO; +typedef struct _DISK_DETECTION_INFO { + DWORD SizeOfDetectInfo; + DETECTION_TYPE DetectionType; + _ANONYMOUS_UNION union { + _ANONYMOUS_STRUCT struct { + DISK_INT13_INFO Int13; + DISK_EX_INT13_INFO ExInt13; + }; + }; +} DISK_DETECTION_INFO,*PDISK_DETECTION_INFO; +typedef enum _MEDIA_TYPE { + Unknown, + F5_1Pt2_512, + F3_1Pt44_512, + F3_2Pt88_512, + F3_20Pt8_512, + F3_720_512, + F5_360_512, + F5_320_512, + F5_320_1024, + F5_180_512, + F5_160_512, + RemovableMedia, + FixedMedia, + F3_120M_512, + F3_640_512, + F5_640_512, + F5_720_512, + F3_1Pt2_512, + F3_1Pt23_1024, + F5_1Pt23_1024, + F3_128Mb_512, + F3_230Mb_512, + F8_256_128, + F3_200Mb_512, + F3_240M_512, + F3_32M_512 +} MEDIA_TYPE,*PMEDIA_TYPE; +typedef struct _DISK_GEOMETRY { + LARGE_INTEGER Cylinders; + MEDIA_TYPE MediaType; + DWORD TracksPerCylinder; + DWORD SectorsPerTrack; + DWORD BytesPerSector; +} DISK_GEOMETRY,*PDISK_GEOMETRY; +typedef struct _DISK_GEOMETRY_EX { + DISK_GEOMETRY Geometry; + LARGE_INTEGER DiskSize; + BYTE Data[1]; +} DISK_GEOMETRY_EX,*PDISK_GEOMETRY_EX; +typedef struct _DISK_GROW_PARTITION { + DWORD PartitionNumber; + LARGE_INTEGER BytesToGrow; +} DISK_GROW_PARTITION, *PDISK_GROW_PARTITION; +typedef struct _DISK_PARTITION_INFO { + DWORD SizeOfPartitionInfo; + PARTITION_STYLE PartitionStyle; + _ANONYMOUS_UNION union { + struct { + DWORD Signature; + } Mbr; + struct { + GUID DiskId; + } Gpt; + }; +} DISK_PARTITION_INFO,*PDISK_PARTITION_INFO; +typedef struct _DISK_PERFORMANCE { + LARGE_INTEGER BytesRead; + LARGE_INTEGER BytesWritten; + LARGE_INTEGER ReadTime; + LARGE_INTEGER WriteTime; + DWORD ReadCount; + DWORD WriteCount; + DWORD QueueDepth; +} DISK_PERFORMANCE, *PDISK_PERFORMANCE; +typedef struct _DISK_RECORD { + LARGE_INTEGER ByteOffset; + LARGE_INTEGER StartTime; + LARGE_INTEGER EndTime; + PVOID VirtualAddress; + DWORD NumberOfBytes; + BYTE DeviceNumber; + BOOLEAN ReadRequest; +} DISK_RECORD,*PDISK_RECORD; +typedef struct _DISK_LOGGING { + BYTE Function; + PVOID BufferAddress; + DWORD BufferSize; +} DISK_LOGGING,*PDISK_LOGGING; +typedef struct DiskQuotaUserInformation { + LONGLONG QuotaUsed; + LONGLONG QuotaThreshold; + LONGLONG QuotaLimit; +} DISKQUOTA_USER_INFORMATION,*PDISKQUOTA_USER_INFORMATION; +typedef struct _FORMAT_PARAMETERS { + MEDIA_TYPE MediaType; + DWORD StartCylinderNumber; + DWORD EndCylinderNumber; + DWORD StartHeadNumber; + DWORD EndHeadNumber; +} FORMAT_PARAMETERS,*PFORMAT_PARAMETERS; +typedef struct _FORMAT_EX_PARAMETERS { + MEDIA_TYPE MediaType; + DWORD StartCylinderNumber; + DWORD EndCylinderNumber; + DWORD StartHeadNumber; + DWORD EndHeadNumber; + WORD FormatGapLength; + WORD SectorsPerTrack; + WORD SectorNumber[1]; +} FORMAT_EX_PARAMETERS,*PFORMAT_EX_PARAMETERS; +typedef struct { + LARGE_INTEGER Length; +} GET_LENGTH_INFORMATION; +typedef struct _HISTOGRAM_BUCKET { + DWORD Reads; + DWORD Writes; +} HISTOGRAM_BUCKET,*PHISTOGRAM_BUCKET; +typedef struct _DISK_HISTOGRAM { + LARGE_INTEGER DiskSize; + LARGE_INTEGER Start; + LARGE_INTEGER End; + LARGE_INTEGER Average; + LARGE_INTEGER AverageRead; + LARGE_INTEGER AverageWrite; + DWORD Granularity; + DWORD Size; + DWORD ReadCount; + DWORD WriteCount; + PHISTOGRAM_BUCKET Histogram; +} DISK_HISTOGRAM,*PDISK_HISTOGRAM; +typedef struct _DISK_EXTENT { + DWORD DiskNumber; + LARGE_INTEGER StartingOffset; + LARGE_INTEGER ExtentLength; +} DISK_EXTENT,*PDISK_EXTENT; +typedef struct _VOLUME_DISK_EXTENTS { + DWORD NumberOfDiskExtents; + DISK_EXTENT Extents[1]; +} VOLUME_DISK_EXTENTS,*PVOLUME_DISK_EXTENTS; +typedef struct _PARTITION_INFORMATION { + LARGE_INTEGER StartingOffset; + LARGE_INTEGER PartitionLength; + DWORD HiddenSectors; + DWORD PartitionNumber; + BYTE PartitionType; + BOOLEAN BootIndicator; + BOOLEAN RecognizedPartition; + BOOLEAN RewritePartition; +} PARTITION_INFORMATION,*PPARTITION_INFORMATION; +typedef struct _DRIVE_LAYOUT_INFORMATION { + DWORD PartitionCount; + DWORD Signature; + PARTITION_INFORMATION PartitionEntry[1]; +} DRIVE_LAYOUT_INFORMATION, *PDRIVE_LAYOUT_INFORMATION; +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_MBR { + BYTE PartitionType; + BOOLEAN BootIndicator; + BOOLEAN RecognizedPartition; + DWORD HiddenSectors; +} PARTITION_INFORMATION_MBR; +typedef struct _PARTITION_INFORMATION_GPT { + GUID PartitionType; + GUID PartitionId; + DWORD64 Attributes; + WCHAR Name[36]; +} PARTITION_INFORMATION_GPT; +typedef struct _PARTITION_INFORMATION_EX { + PARTITION_STYLE PartitionStyle; + LARGE_INTEGER StartingOffset; + LARGE_INTEGER PartitionLength; + DWORD PartitionNumber; + BOOLEAN RewritePartition; + _ANONYMOUS_UNION union { + PARTITION_INFORMATION_MBR Mbr; + PARTITION_INFORMATION_GPT Gpt; + }; +} PARTITION_INFORMATION_EX; +typedef struct _DRIVE_LAYOUT_INFORMATION_EX { + DWORD PartitionStyle; + DWORD PartitionCount; + _ANONYMOUS_UNION 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 { + HANDLE FileHandle; + LARGE_INTEGER StartingVcn; + LARGE_INTEGER StartingLcn; + DWORD ClusterCount; +} MOVE_FILE_DATA,*PMOVE_FILE_DATA; +typedef struct _PERF_BIN { + DWORD NumberOfBins; + DWORD TypeOfBin; + BIN_RANGE BinsRanges[1]; +} PERF_BIN,*PPERF_BIN; +typedef struct _PREVENT_MEDIA_REMOVAL { + BOOLEAN PreventMediaRemoval; +} PREVENT_MEDIA_REMOVAL,*PPREVENT_MEDIA_REMOVAL; +typedef struct RETRIEVAL_POINTERS_BUFFER { + DWORD ExtentCount; + LARGE_INTEGER StartingVcn; + struct { + LARGE_INTEGER NextVcn; + LARGE_INTEGER Lcn; + } Extents[1]; +} RETRIEVAL_POINTERS_BUFFER,*PRETRIEVAL_POINTERS_BUFFER; +typedef struct _REASSIGN_BLOCKS { + WORD Reserved; + WORD Count; + DWORD BlockNumber[1]; +} REASSIGN_BLOCKS,*PREASSIGN_BLOCKS; +typedef struct _SET_PARTITION_INFORMATION { + BYTE PartitionType; +} SET_PARTITION_INFORMATION,*PSET_PARTITION_INFORMATION; +typedef struct { + LARGE_INTEGER StartingLcn; +} STARTING_LCN_INPUT_BUFFER,*PSTARTING_LCN_INPUT_BUFFER; +typedef struct { + LARGE_INTEGER StartingVcn; +} STARTING_VCN_INPUT_BUFFER,*PSTARTING_VCN_INPUT_BUFFER; +typedef struct _VERIFY_INFORMATION { + LARGE_INTEGER StartingOffset; + DWORD Length; +} VERIFY_INFORMATION,*PVERIFY_INFORMATION; +typedef struct { + LARGE_INTEGER StartingLcn; + LARGE_INTEGER BitmapSize; + BYTE Buffer[1]; +} VOLUME_BITMAP_BUFFER,*PVOLUME_BITMAP_BUFFER; +typedef struct { + LARGE_INTEGER VolumeSerialNumber; + LARGE_INTEGER NumberSectors; + LARGE_INTEGER TotalClusters; + LARGE_INTEGER FreeClusters; + LARGE_INTEGER TotalReserved; + DWORD BytesPerSector; + DWORD BytesPerCluster; + DWORD BytesPerFileRecordSegment; + DWORD ClustersPerFileRecordSegment; + LARGE_INTEGER MftValidDataLength; + LARGE_INTEGER MftStartLcn; + LARGE_INTEGER Mft2StartLcn; + LARGE_INTEGER MftZoneStart; + LARGE_INTEGER MftZoneEnd; +} NTFS_VOLUME_DATA_BUFFER, *PNTFS_VOLUME_DATA_BUFFER; + +#define IsRecognizedPartition(t)\ + (((t&PARTITION_NTFT)&&((t&~VALID_NTFT)==PARTITION_FAT_12))||\ + ((t&PARTITION_NTFT)&&((t&~VALID_NTFT)==PARTITION_FAT_16))||\ + ((t&PARTITION_NTFT)&&((t&~VALID_NTFT)==PARTITION_IFS))||\ + ((t&PARTITION_NTFT)&&((t&~VALID_NTFT)==PARTITION_HUGE))||\ + ((t&PARTITION_NTFT)&&((t&~VALID_NTFT)==PARTITION_FAT32))||\ + ((t&PARTITION_NTFT)&&((t&~VALID_NTFT)==PARTITION_FAT32_XINT13))||\ + ((t&PARTITION_NTFT)&&((t&~VALID_NTFT)==PARTITION_XINT13))||\ + ((t&~PARTITION_NTFT)==PARTITION_FAT_12)||\ + ((t&~PARTITION_NTFT)==PARTITION_FAT_16)||\ + ((t&~PARTITION_NTFT)==PARTITION_IFS)||\ + ((t&~PARTITION_NTFT)==PARTITION_HUGE)||\ + ((t&~PARTITION_NTFT)==PARTITION_FAT32)||\ + ((t&~PARTITION_NTFT)==PARTITION_FAT32_XINT13)||\ + ((t&~PARTITION_NTFT)==PARTITION_XINT13)) +#define IsContainerPartition(t)\ + (((t&PARTITION_NTFT)&&((t&~VALID_NTFT)==PARTITION_EXTENDED))||\ + ((t&PARTITION_NTFT)&&((t&~VALID_NTFT)==PARTITION_XINT13_EXTENDED))||\ + ((t&~PARTITION_NTFT)==PARTITION_EXTENDED)||\ + ((t&~PARTITION_NTFT)==PARTITION_XINT13_EXTENDED)) +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/winldap.h b/reactos/w32api/include/winldap.h new file mode 100644 index 00000000000..36b86268d2c --- /dev/null +++ b/reactos/w32api/include/winldap.h @@ -0,0 +1,713 @@ +/* + winldap.h - Header file for the Windows LDAP API + + Written by Filip Navara <xnavara@volny.cz> + + References: + The C LDAP Application Program Interface + http://www.watersprings.org/pub/id/draft-ietf-ldapext-ldap-c-api-05.txt + + Lightweight Directory Access Protocol Reference + http://msdn.microsoft.com/library/en-us/netdir/ldap/ldap_reference.asp + + 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. +*/ + +#ifndef _WINLDAP_H +#define _WINLDAP_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifndef _SCHANNEL_H +#include <schannel.h> +#endif + +#ifndef _WINBER_H +#include <winber.h> +#endif + +#ifndef WINLDAPAPI +#define WINLDAPAPI DECLSPEC_IMPORT +#endif + +#ifndef _WINLDAP_DEPRECATED +#if (( __GNUC__ == 3 && __GNUC_MINOR__ > 0 ) || __GNUC__ > 3) +#define _WINLDAP_DEPRECATED __attribute__((__deprecated__)) +#else +#define _WINLDAP_DEPRECATED +#endif +#endif + +#include <pshpack4.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#define LDAP_VERSION1 1 +#define LDAP_VERSION2 2 +#define LDAP_VERSION3 3 +#define LDAP_VERSION LDAP_VERSION2 +#define LDAP_API_VERSION 2004 +#define LDAP_VERSION_MIN LDAP_VERSION2 +#define LDAP_VERSION_MAX LDAP_VERSION3 +#define LDAP_VENDOR_NAME "Microsoft Corporation." +#define LDAP_VENDOR_NAME_W L"Microsoft Corporation." +#define LDAP_VENDOR_VERSION 510 +#define LDAP_API_INFO_VERSION 1 +#define LDAP_FEATURE_INFO_VERSION 1 +#define LDAP_SUCCESS 0x00 +#define LDAP_OPERATIONS_ERROR 0x01 +#define LDAP_PROTOCOL_ERROR 0x02 +#define LDAP_TIMELIMIT_EXCEEDED 0x03 +#define LDAP_SIZELIMIT_EXCEEDED 0x04 +#define LDAP_COMPARE_FALSE 0x05 +#define LDAP_COMPARE_TRUE 0x06 +#define LDAP_STRONG_AUTH_NOT_SUPPORTED 0x07 +#define LDAP_STRONG_AUTH_REQUIRED 0x08 +#define LDAP_REFERRAL_V2 0x09 +#define LDAP_REFERRAL 0x0a +#define LDAP_ADMIN_LIMIT_EXCEEDED 0x0b +#define LDAP_UNAVAILABLE_CRIT_EXTENSION 0x0c +#define LDAP_CONFIDENTIALITY_REQUIRED 0x0d +#define LDAP_SASL_BIND_IN_PROGRESS 0x0e +#define LDAP_NO_SUCH_ATTRIBUTE 0x10 +#define LDAP_UNDEFINED_TYPE 0x11 +#define LDAP_INAPPROPRIATE_MATCHING 0x12 +#define LDAP_CONSTRAINT_VIOLATION 0x13 +#define LDAP_TYPE_OR_VALUE_EXISTS 0x14 +#define LDAP_INVALID_SYNTAX 0x15 +#define LDAP_NO_SUCH_OBJECT 0x20 +#define LDAP_ALIAS_PROBLEM 0x21 +#define LDAP_INVALID_DN_SYNTAX 0x22 +#define LDAP_IS_LEAF 0x23 +#define LDAP_ALIAS_DEREF_PROBLEM 0x24 +#define LDAP_INAPPROPRIATE_AUTH 0x30 +#define LDAP_INVALID_CREDENTIALS 0x31 +#define LDAP_INSUFFICIENT_ACCESS 0x32 +#define LDAP_BUSY 0x33 +#define LDAP_UNAVAILABLE 0x34 +#define LDAP_UNWILLING_TO_PERFORM 0x35 +#define LDAP_LOOP_DETECT 0x36 +#define LDAP_NAMING_VIOLATION 0x40 +#define LDAP_OBJECT_CLASS_VIOLATION 0x41 +#define LDAP_NOT_ALLOWED_ON_NONLEAF 0x42 +#define LDAP_NOT_ALLOWED_ON_RDN 0x43 +#define LDAP_ALREADY_EXISTS 0x44 +#define LDAP_NO_OBJECT_CLASS_MODS 0x45 +#define LDAP_RESULTS_TOO_LARGE 0x46 +#define LDAP_AFFECTS_MULTIPLE_DSAS 0x47 +#define LDAP_OTHER 0x50 +#define LDAP_SERVER_DOWN 0x51 +#define LDAP_LOCAL_ERROR 0x52 +#define LDAP_ENCODING_ERROR 0x53 +#define LDAP_DECODING_ERROR 0x54 +#define LDAP_TIMEOUT 0x55 +#define LDAP_AUTH_UNKNOWN 0x56 +#define LDAP_FILTER_ERROR 0x57 +#define LDAP_USER_CANCELLED 0x58 +#define LDAP_PARAM_ERROR 0x59 +#define LDAP_NO_MEMORY 0x5a +#define LDAP_CONNECT_ERROR 0x5b +#define LDAP_NOT_SUPPORTED 0x5c +#define LDAP_CONTROL_NOT_FOUND 0x5d +#define LDAP_NO_RESULTS_RETURNED 0x5e +#define LDAP_MORE_RESULTS_TO_RETURN 0x5f +#define LDAP_CLIENT_LOOP 0x60 +#define LDAP_REFERRAL_LIMIT_EXCEEDED 0x61 +#define LDAP_OPT_SUCCESS LDAP_SUCCESS +#define LDAP_AUTH_METHOD_NOT_SUPPORTED LDAP_STRONG_AUTH_NOT_SUPPORTED +#define LDAP_ATTRIBUTE_OR_VALUE_EXISTS LDAP_TYPE_OR_VALUE_EXISTS +#define LDAP_INSUFFICIENT_RIGHTS LDAP_INSUFFICIENT_ACCESS +#define LDAP_PARTIAL_RESULTS LDAP_REFERRAL_V2 +#define LDAP_PORT 389 +#define LDAP_SSL_PORT 636 +#define LDAP_GC_PORT 3268 +#define LDAP_SSL_GC_PORT 3269 +#define LDAP_OPT_ON ((void*)1) +#define LDAP_OPT_OFF ((void*)0) +#define LDAP_OPT_API_INFO 0x00 +#define LDAP_OPT_DESC 0x01 +#define LDAP_OPT_DEREF 0x02 +#define LDAP_OPT_SIZELIMIT 0x03 +#define LDAP_OPT_TIMELIMIT 0x04 +#define LDAP_OPT_THREAD_FN_PTRS 0x05 +#define LDAP_OPT_REBIND_FN 0x06 +#define LDAP_OPT_REBIND_ARG 0x07 +#define LDAP_OPT_REFERRALS 0x08 +#define LDAP_OPT_RESTART 0x09 +#define LDAP_OPT_SSL 0x0a +#define LDAP_OPT_IO_FN_PTRS 0x0b +#define LDAP_OPT_CACHE_FN_PTRS 0x0d +#define LDAP_OPT_CACHE_STRATEGY 0x0e +#define LDAP_OPT_CACHE_ENABLE 0x0f +#define LDAP_OPT_REFERRAL_HOP_LIMIT 0x10 +#define LDAP_OPT_PROTOCOL_VERSION 0x11 +#define LDAP_OPT_SERVER_CONTROLS 0x12 +#define LDAP_OPT_CLIENT_CONTROLS 0x13 +#define LDAP_OPT_API_FEATURE_INFO 0x15 +#define LDAP_OPT_HOST_NAME 0x30 +#define LDAP_OPT_ERROR_NUMBER 0x31 +#define LDAP_OPT_ERROR_STRING 0x32 +#define LDAP_OPT_SERVER_ERROR 0x33 +#define LDAP_OPT_SERVER_EXT_ERROR 0x34 +#define LDAP_OPT_PING_KEEP_ALIVE 0x36 +#define LDAP_OPT_PING_WAIT_TIME 0x37 +#define LDAP_OPT_PING_LIMIT 0x38 +#define LDAP_OPT_DNSDOMAIN_NAME 0x3b +#define LDAP_OPT_GETDSNAME_FLAGS 0x3d +#define LDAP_OPT_HOST_REACHABLE 0x3e +#define LDAP_OPT_PROMPT_CREDENTIALS 0x3f +#define LDAP_OPT_TCP_KEEPALIVE 0x40 +#define LDAP_OPT_REFERRAL_CALLBACK 0x70 +#define LDAP_OPT_CLIENT_CERTIFICATE 0x80 +#define LDAP_OPT_SERVER_CERTIFICATE 0x81 +#define LDAP_OPT_AUTO_RECONNECT 0x91 +#define LDAP_OPT_SSPI_FLAGS 0x92 +#define LDAP_OPT_SSL_INFO 0x93 +#define LDAP_OPT_REF_DEREF_CONN_PER_MSG 0x94 +#define LDAP_OPT_SIGN 0x95 +#define LDAP_OPT_ENCRYPT 0x96 +#define LDAP_OPT_SASL_METHOD 0x97 +#define LDAP_OPT_AREC_EXCLUSIVE 0x98 +#define LDAP_OPT_SECURITY_CONTEXT 0x99 +#define LDAP_OPT_ROOTDSE_CACHE 0x9a +#define LDAP_OPT_VERSION LDAP_OPT_PROTOCOL_VERSION +#define LDAP_OPT_TLS LDAP_OPT_SSL +#define LDAP_OPT_TLS_INFO LDAP_OPT_SSL_INFO +#define LDAP_DEREF_NEVER 0x00 +#define LDAP_DEREF_SEARCHING 0x01 +#define LDAP_DEREF_FINDING 0x02 +#define LDAP_DEREF_ALWAYS 0x03 +#define LDAP_NO_LIMIT 0 +#define LDAP_CONTROL_REFERRALS "1.2.840.113556.1.4.616" +#define LDAP_CONTROL_REFERRALS_W L"1.2.840.113556.1.4.616" +#define LDAP_CHASE_SUBORDINATE_REFERRALS 0x20U +#define LDAP_CHASE_EXTERNAL_REFERRALS 0x40U +#define LDAP_SCOPE_DEFAULT -1 +#define LDAP_SCOPE_BASE 0x0000 +#define LDAP_SCOPE_ONELEVEL 0x0001 +#define LDAP_SCOPE_SUBTREE 0x0002 +#define LDAP_MOD_ADD 0x00 +#define LDAP_MOD_DELETE 0x01 +#define LDAP_MOD_REPLACE 0x02 +#define LDAP_MOD_BVALUES 0x80 +#define LDAP_RES_BIND 0x61 +#define LDAP_RES_SEARCH_ENTRY 0x64 +#define LDAP_RES_SEARCH_RESULT 0x65 +#define LDAP_RES_MODIFY 0x67 +#define LDAP_RES_ADD 0x69 +#define LDAP_RES_DELETE 0x6b +#define LDAP_RES_MODRDN 0x6d +#define LDAP_RES_COMPARE 0x6f +#define LDAP_RES_SEARCH_REFERENCE 0x73 +#define LDAP_RES_EXTENDED 0x78 +#define LDAP_RES_ANY (-1L) +#define LDAP_MSG_ONE 0x00 +#define LDAP_MSG_ALL 0x01 +#define LDAP_MSG_RECEIVED 0x02 +#define LDAP_SERVER_SORT_OID "1.2.840.113556.1.4.473" +#define LDAP_SERVER_SORT_OID_W L"1.2.840.113556.1.4.473" +#define LDAP_SERVER_RESP_SORT_OID "1.2.840.113556.1.4.474" +#define LDAP_SERVER_RESP_SORT_OID_W L"1.2.840.113556.1.4.474" +#define LDAP_PAGED_RESULT_OID_STRING "1.2.840.113556.1.4.319" +#define LDAP_PAGED_RESULT_OID_STRING_W L"1.2.840.113556.1.4.319" +#define LDAP_CONTROL_VLVREQUEST "2.16.840.1.113730.3.4.9" +#define LDAP_CONTROL_VLVREQUEST_W L"2.16.840.1.113730.3.4.9" +#define LDAP_CONTROL_VLVRESPONSE "2.16.840.1.113730.3.4.10" +#define LDAP_CONTROL_VLVRESPONSE_W L"2.16.840.1.113730.3.4.10" +#define LDAP_START_TLS_OID "1.3.6.1.4.1.1466.20037" +#define LDAP_START_TLS_OID_W L"1.3.6.1.4.1.1466.20037" +#define LDAP_TTL_EXTENDED_OP_OID "1.3.6.1.4.1.1466.101.119.1" +#define LDAP_TTL_EXTENDED_OP_OID_W L"1.3.6.1.4.1.1466.101.119.1" +#define LDAP_AUTH_NONE 0x00U +#define LDAP_AUTH_SIMPLE 0x80U +#define LDAP_AUTH_SASL 0x83U +#define LDAP_AUTH_OTHERKIND 0x86U +#define LDAP_AUTH_EXTERNAL (LDAP_AUTH_OTHERKIND | 0x20U) +#define LDAP_AUTH_SICILY (LDAP_AUTH_OTHERKIND | 0x200U) +#define LDAP_AUTH_NEGOTIATE (LDAP_AUTH_OTHERKIND | 0x400U) +#define LDAP_AUTH_MSN (LDAP_AUTH_OTHERKIND | 0x800U) +#define LDAP_AUTH_NTLM (LDAP_AUTH_OTHERKIND | 0x1000U) +#define LDAP_AUTH_DIGEST (LDAP_AUTH_OTHERKIND | 0x4000U) +#define LDAP_AUTH_DPA (LDAP_AUTH_OTHERKIND | 0x2000U) +#define LDAP_AUTH_SSPI LDAP_AUTH_NEGOTIATE +#define LDAP_FILTER_AND 0xa0 +#define LDAP_FILTER_OR 0xa1 +#define LDAP_FILTER_NOT 0xa2 +#define LDAP_FILTER_EQUALITY 0xa3 +#define LDAP_FILTER_SUBSTRINGS 0xa4 +#define LDAP_FILTER_GE 0xa5 +#define LDAP_FILTER_LE 0xa6 +#define LDAP_FILTER_APPROX 0xa8 +#define LDAP_FILTER_EXTENSIBLE 0xa9 +#define LDAP_FILTER_PRESENT 0x87 +#define LDAP_SUBSTRING_INITIAL 0x80 +#define LDAP_SUBSTRING_ANY 0x81 +#define LDAP_SUBSTRING_FINAL 0x82 + +typedef struct ldap { + char Reserved[76]; + PCHAR ld_host; + ULONG ld_version; + UCHAR ld_lberoptions; + int ld_deref; + int ld_timelimit; + int ld_sizelimit; + int ld_errno; + PCHAR ld_matched; + PCHAR ld_error; +} LDAP, *PLDAP; +typedef struct ldapmsg { + ULONG lm_msgid; + ULONG lm_msgtype; + BerElement *lm_ber; + struct ldapmsg *lm_chain; + struct ldapmsg *lm_next; + ULONG lm_time; +} LDAPMessage, *PLDAPMessage; +typedef struct l_timeval { + LONG tv_sec; + LONG tv_usec; +} LDAP_TIMEVAL, *PLDAP_TIMEVAL; +typedef struct ldapapiinfoA { + int ldapai_info_version; + int ldapai_api_version; + int ldapai_protocol_version; + char **ldapai_extensions; + char *ldapai_vendor_name; + int ldapai_vendor_version; +} LDAPAPIInfoA, *PLDAPAPIInfoA; +typedef struct ldapapiinfoW { + int ldapai_info_version; + int ldapai_api_version; + int ldapai_protocol_version; + PWCHAR *ldapai_extensions; + PWCHAR ldapai_vendor_name; + int ldapai_vendor_version; +} LDAPAPIInfoW, *PLDAPAPIInfoW; +typedef struct ldap_apifeature_infoA { + int ldapaif_info_version; + char *ldapaif_name; + int ldapaif_version; +} LDAPAPIFeatureInfoA, *PLDAPAPIFeatureInfoA; +typedef struct ldap_apifeature_infoW { + int ldapaif_info_version; + PWCHAR ldapaif_name; + int ldapaif_version; +} LDAPAPIFeatureInfoW, *PLDAPAPIFeatureInfoW; +typedef struct ldapcontrolA { + PCHAR ldctl_oid; + BerValue ldctl_value; + BOOLEAN ldctl_iscritical; +} LDAPControlA, *PLDAPControlA; +typedef struct ldapcontrolW { + PWCHAR ldctl_oid; + BerValue ldctl_value; + BOOLEAN ldctl_iscritical; +} LDAPControlW, *PLDAPControlW; +typedef union mod_vals_uA { + PCHAR *modv_strvals; + BerValue **modv_bvals; +} mod_vals_u_tA; +typedef union mod_vals_uW { + PWCHAR *modv_strvals; + BerValue **modv_bvals; +} mod_vals_u_tW; +typedef struct ldapmodA { + ULONG mod_op; + PCHAR mod_type; + mod_vals_u_tA mod_vals; +} LDAPModA, *PLDAPModA; +typedef struct ldapmodW { + ULONG mod_op; + PWCHAR mod_type; + mod_vals_u_tW mod_vals; +} LDAPModW, *PLDAPModW; + +#define mod_values mod_vals.modv_strvals +#define mod_bvalues mod_vals.modv_bvals + +typedef struct ldapsearch LDAPSearch, *PLDAPSearch; +typedef struct ldapsortkeyA { + PCHAR sk_attrtype; + PCHAR sk_matchruleoid; + BOOLEAN sk_reverseorder; +} LDAPSortKeyA, *PLDAPSortKeyA; +typedef struct ldapsortkeyW { + PWCHAR sk_attrtype; + PWCHAR sk_matchruleoid; + BOOLEAN sk_reverseorder; +} LDAPSortKeyW, *PLDAPSortKeyW; +typedef ULONG (__cdecl QUERYFORCONNECTION)(PLDAP,PLDAP,PWCHAR,PCHAR,ULONG,PVOID,PVOID,PLDAP*); +typedef BOOLEAN (__cdecl NOTIFYOFNEWCONNECTION)(PLDAP,PLDAP,PWCHAR,PCHAR,PLDAP,ULONG,PVOID,PVOID,ULONG); +typedef ULONG (__cdecl DEREFERENCECONNECTION)(PLDAP,PLDAP); +typedef BOOLEAN (__cdecl QUERYCLIENTCERT)(PLDAP,PSecPkgContext_IssuerListInfoEx,PCCERT_CONTEXT*); +typedef struct LdapReferralCallback { + ULONG SizeOfCallbacks; + QUERYFORCONNECTION *QueryForConnection; + NOTIFYOFNEWCONNECTION *NotifyRoutine; + DEREFERENCECONNECTION *DereferenceRoutine; +} LDAP_REFERRAL_CALLBACK, *PLDAP_REFERRAL_CALLBACK; +typedef struct ldapvlvinfo { + int ldvlv_version; + unsigned long ldvlv_before_count; + unsigned long ldvlv_after_count; + unsigned long ldvlv_offset; + unsigned long ldvlv_count; + BerValue *ldvlv_attrvalue; + BerValue *ldvlv_context; + void *ldvlv_extradata; +} LDAPVLVInfo; + +/* + * Under Microsoft WinLDAP the function ldap_error is only stub. + * This macro uses LDAP structure to get error string and pass it to the user. + */ +#define ldap_perror(handle,message) printf("%s: %s\n", message, handle->ld_error); + +WINLDAPAPI PLDAP ldap_initA(PCHAR,ULONG); +WINLDAPAPI PLDAP ldap_initW(PWCHAR,ULONG); +WINLDAPAPI PLDAP ldap_openA(const PCHAR,ULONG); +WINLDAPAPI PLDAP ldap_openW(const PWCHAR,ULONG); +WINLDAPAPI PLDAP cldap_openA(const PCHAR,ULONG); +WINLDAPAPI PLDAP cldap_openW(const PWCHAR,ULONG); +WINLDAPAPI ULONG ldap_connect(LDAP*,struct l_timeval*); +WINLDAPAPI PLDAP ldap_sslinitA(PCHAR,ULONG,int); +WINLDAPAPI PLDAP ldap_sslinitW(PWCHAR,ULONG,int); +WINLDAPAPI ULONG ldap_start_tls_sA(LDAP*,PLDAPControlA*,PLDAPControlA*); +WINLDAPAPI ULONG ldap_start_tls_sW(LDAP*,PLDAPControlW*,PLDAPControlW*); +WINLDAPAPI BOOLEAN ldap_stop_tls_s(LDAP*); +WINLDAPAPI ULONG ldap_get_optionA(LDAP*,int,void*); +WINLDAPAPI ULONG ldap_get_optionW(LDAP*,int,void*); +WINLDAPAPI ULONG ldap_set_optionA(LDAP*,int,const void*); +WINLDAPAPI ULONG ldap_set_optionW(LDAP*,int,const void*); +WINLDAPAPI ULONG ldap_control_freeA(LDAPControlA*); +WINLDAPAPI ULONG ldap_control_freeW(LDAPControlW*); +WINLDAPAPI ULONG ldap_controls_freeA(LDAPControlA**); +WINLDAPAPI ULONG ldap_controls_freeW(LDAPControlW**); +WINLDAPAPI ULONG ldap_free_controlsA(LDAPControlA**); +WINLDAPAPI ULONG ldap_free_controlsW(LDAPControlW**); +WINLDAPAPI ULONG ldap_sasl_bindA(LDAP*,const PCHAR, const PCHAR,const BERVAL*,PLDAPControlA*,PLDAPControlA*,int*); +WINLDAPAPI ULONG ldap_sasl_bindW(LDAP*,const PWCHAR, const PWCHAR,const BERVAL*,PLDAPControlW*,PLDAPControlW*,int*); +WINLDAPAPI ULONG ldap_sasl_bind_sA(LDAP*,const PCHAR,const PCHAR,const BERVAL*,PLDAPControlA*,PLDAPControlA*,PBERVAL*); +WINLDAPAPI ULONG ldap_sasl_bind_sW(LDAP*,const PWCHAR,const PWCHAR,const BERVAL*,PLDAPControlW*,PLDAPControlW*,PBERVAL*); +WINLDAPAPI ULONG ldap_simple_bindA(LDAP*,const PCHAR,const PCHAR); +WINLDAPAPI ULONG ldap_simple_bindW(LDAP*,const PWCHAR,const PCHAR); +WINLDAPAPI ULONG ldap_simple_bind_sA(LDAP*,const PCHAR,const PCHAR); +WINLDAPAPI ULONG ldap_simple_bind_sW(LDAP*,const PWCHAR,const PCHAR); +WINLDAPAPI ULONG ldap_bindA(LDAP*,const PCHAR,const PCHAR,ULONG) _WINLDAP_DEPRECATED; +WINLDAPAPI ULONG ldap_bindW(LDAP*,const PWCHAR,const PCHAR,ULONG) _WINLDAP_DEPRECATED; +WINLDAPAPI ULONG ldap_bind_sA(LDAP*,const PCHAR,const PCHAR,ULONG) _WINLDAP_DEPRECATED; +WINLDAPAPI ULONG ldap_bind_sW(LDAP*,const PWCHAR,const PCHAR,ULONG) _WINLDAP_DEPRECATED; +WINLDAPAPI ULONG ldap_unbind(LDAP*); +WINLDAPAPI ULONG ldap_unbind_s(LDAP*); +WINLDAPAPI ULONG ldap_search_extA(LDAP*,const PCHAR,ULONG,const PCHAR,PCHAR[],ULONG,PLDAPControlW*,PLDAPControlW*,ULONG,ULONG,ULONG*); +WINLDAPAPI ULONG ldap_search_extW(LDAP*,const PWCHAR,ULONG,const PWCHAR,PWCHAR[],ULONG,PLDAPControlW*,PLDAPControlW*,ULONG,ULONG,ULONG*); +WINLDAPAPI ULONG ldap_search_ext_sA(LDAP*,const PCHAR,ULONG,const PCHAR,PCHAR[],ULONG,PLDAPControlA*,PLDAPControlA*,struct l_timeval*,ULONG,LDAPMessage**); +WINLDAPAPI ULONG ldap_search_ext_sW(LDAP*,const PWCHAR,ULONG,const PWCHAR,PWCHAR[],ULONG,PLDAPControlW*,PLDAPControlW*,struct l_timeval*,ULONG,LDAPMessage**); +WINLDAPAPI ULONG ldap_searchA(LDAP*,const PCHAR,ULONG,const PCHAR,PCHAR[],ULONG); +WINLDAPAPI ULONG ldap_searchW(LDAP*,const PWCHAR,ULONG,const PWCHAR,PWCHAR[],ULONG); +WINLDAPAPI ULONG ldap_search_sA(LDAP*,const PCHAR,ULONG,const PCHAR,PCHAR[],ULONG,LDAPMessage**); +WINLDAPAPI ULONG ldap_search_sW(LDAP*,const PWCHAR,ULONG,const PWCHAR,PWCHAR[],ULONG,LDAPMessage**); +WINLDAPAPI ULONG ldap_search_stA(LDAP*,const PCHAR,ULONG,const PCHAR,PCHAR[],ULONG,struct l_timeval*,LDAPMessage**); +WINLDAPAPI ULONG ldap_search_stW(LDAP*,const PWCHAR,ULONG,const PWCHAR,PWCHAR[],ULONG,struct l_timeval*,LDAPMessage**); +WINLDAPAPI ULONG ldap_compare_extA(LDAP*,const PCHAR,const PCHAR,PCHAR,struct berval*,PLDAPControlA*,PLDAPControlA*,ULONG*); +WINLDAPAPI ULONG ldap_compare_extW(LDAP*,const PWCHAR,const PWCHAR,PWCHAR,struct berval*,PLDAPControlW*,PLDAPControlW*,ULONG*); +WINLDAPAPI ULONG ldap_compare_ext_sA(LDAP*,const PCHAR,const PCHAR,const PCHAR,struct berval*,PLDAPControlA*,PLDAPControlA*); +WINLDAPAPI ULONG ldap_compare_ext_sW(LDAP*,const PWCHAR,const PWCHAR,const PWCHAR,struct berval*,PLDAPControlW*,PLDAPControlW*); +WINLDAPAPI ULONG ldap_compareA(LDAP*,const PCHAR,const PCHAR,PCHAR); +WINLDAPAPI ULONG ldap_compareW(LDAP*,const PWCHAR,const PWCHAR,PWCHAR); +WINLDAPAPI ULONG ldap_compare_sA(LDAP*,const PCHAR,const PCHAR,PCHAR); +WINLDAPAPI ULONG ldap_compare_sW(LDAP*,const PWCHAR,const PWCHAR,PWCHAR); +WINLDAPAPI ULONG ldap_modify_extA(LDAP*,const PCHAR,LDAPModA*[],PLDAPControlA*,PLDAPControlA*,ULONG*); +WINLDAPAPI ULONG ldap_modify_extW(LDAP*,const PWCHAR,LDAPModW*[],PLDAPControlW*,PLDAPControlW*,ULONG*); +WINLDAPAPI ULONG ldap_modify_ext_sA(LDAP*,const PCHAR,LDAPModA*[],PLDAPControlA*,PLDAPControlA*); +WINLDAPAPI ULONG ldap_modify_ext_sW(LDAP*,const PWCHAR,LDAPModW*[],PLDAPControlW*,PLDAPControlW*); +WINLDAPAPI ULONG ldap_modifyA(LDAP*,const PCHAR,LDAPModA*[]); +WINLDAPAPI ULONG ldap_modifyW(LDAP*,const PWCHAR,LDAPModW*[]); +WINLDAPAPI ULONG ldap_modify_sA(LDAP*,const PCHAR,LDAPModA*[]); +WINLDAPAPI ULONG ldap_modify_sW(LDAP*,const PWCHAR,LDAPModW*[]); +WINLDAPAPI ULONG ldap_rename_extA(LDAP*,const PCHAR,const PCHAR,const PCHAR,INT,PLDAPControlA*,PLDAPControlA*,ULONG*); +WINLDAPAPI ULONG ldap_rename_extW(LDAP*,const PWCHAR,const PWCHAR,const PWCHAR,INT,PLDAPControlW*,PLDAPControlW*,ULONG*); +WINLDAPAPI ULONG ldap_rename_ext_sA(LDAP*,const PCHAR,const PCHAR,const PCHAR,INT,PLDAPControlA*,PLDAPControlA*); +WINLDAPAPI ULONG ldap_rename_ext_sW(LDAP*,const PWCHAR,const PWCHAR,const PWCHAR,INT,PLDAPControlW*,PLDAPControlW*); +WINLDAPAPI ULONG ldap_modrdnA(LDAP*,PCHAR,PCHAR) _WINLDAP_DEPRECATED; +WINLDAPAPI ULONG ldap_modrdnW(LDAP*,PWCHAR,PWCHAR) _WINLDAP_DEPRECATED; +WINLDAPAPI ULONG ldap_modrdn_sA(LDAP*,PCHAR,PCHAR) _WINLDAP_DEPRECATED; +WINLDAPAPI ULONG ldap_modrdn_sW(LDAP*,PWCHAR,PWCHAR) _WINLDAP_DEPRECATED; +WINLDAPAPI ULONG ldap_modrdn2A(LDAP*,PCHAR,PCHAR,INT) _WINLDAP_DEPRECATED; +WINLDAPAPI ULONG ldap_modrdn2W(LDAP*,PWCHAR,PWCHAR,INT) _WINLDAP_DEPRECATED; +WINLDAPAPI ULONG ldap_modrdn2_sA(LDAP*,PCHAR,PCHAR,INT) _WINLDAP_DEPRECATED; +WINLDAPAPI ULONG ldap_modrdn2_sW(LDAP*,PWCHAR,PWCHAR,INT) _WINLDAP_DEPRECATED; +WINLDAPAPI ULONG ldap_add_extA(LDAP*,const PCHAR,LDAPModA*[],PLDAPControlA*,PLDAPControlA*,ULONG*); +WINLDAPAPI ULONG ldap_add_extW(LDAP*,const PWCHAR,LDAPModW*[],PLDAPControlW*,PLDAPControlW*,ULONG*); +WINLDAPAPI ULONG ldap_add_ext_sA(LDAP*,const PCHAR,LDAPModA*[],PLDAPControlA*,PLDAPControlA*); +WINLDAPAPI ULONG ldap_add_ext_sW(LDAP*,const PWCHAR,LDAPModW*[],PLDAPControlW*,PLDAPControlW*); +WINLDAPAPI ULONG ldap_addA(LDAP*,const PCHAR,LDAPModA*[]); +WINLDAPAPI ULONG ldap_addW(LDAP*,const PWCHAR,LDAPModW*[]); +WINLDAPAPI ULONG ldap_add_sA(LDAP*,const PCHAR,LDAPModA*[]); +WINLDAPAPI ULONG ldap_add_sW(LDAP*,const PWCHAR,LDAPModW*[]); +WINLDAPAPI ULONG ldap_delete_extA(LDAP*,const PCHAR,PLDAPControlA*,PLDAPControlA*,ULONG*); +WINLDAPAPI ULONG ldap_delete_extW(LDAP*,const PWCHAR,PLDAPControlW*,PLDAPControlW*,ULONG*); +WINLDAPAPI ULONG ldap_delete_ext_sA(LDAP*,const PCHAR,PLDAPControlA*,PLDAPControlA*); +WINLDAPAPI ULONG ldap_delete_ext_sW(LDAP*,const PWCHAR,PLDAPControlW*,PLDAPControlW*); +WINLDAPAPI ULONG ldap_deleteA(LDAP*,const PCHAR); +WINLDAPAPI ULONG ldap_deleteW(LDAP*,const PWCHAR); +WINLDAPAPI ULONG ldap_delete_sA(LDAP*,const PCHAR); +WINLDAPAPI ULONG ldap_delete_sW(LDAP*,const PWCHAR); +WINLDAPAPI ULONG ldap_extended_operationA(LDAP*,const PCHAR,const struct berval*,PLDAPControlA*,PLDAPControlA*,ULONG*); +WINLDAPAPI ULONG ldap_extended_operationW(LDAP*,const PWCHAR,const struct berval*,PLDAPControlW*,PLDAPControlW*,ULONG*); +WINLDAPAPI ULONG ldap_extended_operation_sA(LDAP*,const PCHAR,const struct berval*,PLDAPControlA*,PLDAPControlA*,PCHAR*,struct berval**); +WINLDAPAPI ULONG ldap_extended_operation_sW(LDAP*,const PWCHAR,const struct berval*,PLDAPControlW*,PLDAPControlW*,PWCHAR*,struct berval**); +WINLDAPAPI ULONG ldap_close_extended_op(LDAP*,ULONG); +WINLDAPAPI ULONG ldap_abandon(LDAP*,ULONG); +WINLDAPAPI ULONG ldap_result(LDAP*,ULONG,ULONG,struct l_timeval*,LDAPMessage**); +WINLDAPAPI ULONG ldap_msgfree(LDAPMessage*); +WINLDAPAPI ULONG ldap_parse_resultA(LDAP*,LDAPMessage*,ULONG*,PCHAR*,PCHAR*,PCHAR**,PLDAPControlA**,BOOLEAN); +WINLDAPAPI ULONG ldap_parse_resultW(LDAP*,LDAPMessage*,ULONG*,PWCHAR*,PWCHAR*,PWCHAR**,PLDAPControlW**,BOOLEAN); +WINLDAPAPI ULONG ldap_parse_extended_resultA(LDAP,LDAPMessage*,PCHAR*,struct berval**,BOOLEAN); +WINLDAPAPI ULONG ldap_parse_extended_resultW(LDAP,LDAPMessage*,PWCHAR*,struct berval**,BOOLEAN); +WINLDAPAPI PCHAR ldap_err2stringA(ULONG); +WINLDAPAPI PWCHAR ldap_err2stringW(ULONG); +WINLDAPAPI ULONG LdapGetLastError(void); +WINLDAPAPI ULONG LdapMapErrorToWin32(ULONG); +WINLDAPAPI ULONG ldap_result2error(LDAP*,LDAPMessage*,ULONG); +WINLDAPAPI PLDAPMessage ldap_first_entry(LDAP*,LDAPMessage*); +WINLDAPAPI PLDAPMessage ldap_next_entry(LDAP*,LDAPMessage*); +WINLDAPAPI PLDAPMessage ldap_first_reference(LDAP*,LDAPMessage*); +WINLDAPAPI PLDAPMessage ldap_next_reference(LDAP*,LDAPMessage*); +WINLDAPAPI ULONG ldap_count_entries(LDAP*,LDAPMessage*); +WINLDAPAPI ULONG ldap_count_references(LDAP*,LDAPMessage*); +WINLDAPAPI PCHAR ldap_first_attributeA(LDAP*,LDAPMessage*,BerElement**); +WINLDAPAPI PWCHAR ldap_first_attributeW(LDAP*,LDAPMessage*,BerElement**); +WINLDAPAPI PCHAR ldap_next_attributeA(LDAP*,LDAPMessage*,BerElement*); +WINLDAPAPI PWCHAR ldap_next_attributeW(LDAP*,LDAPMessage*,BerElement*); +WINLDAPAPI VOID ldap_memfreeA(PCHAR); +WINLDAPAPI VOID ldap_memfreeW(PWCHAR); +WINLDAPAPI PCHAR* ldap_get_valuesA(LDAP*,LDAPMessage*,const PCHAR); +WINLDAPAPI PWCHAR* ldap_get_valuesW(LDAP*,LDAPMessage*,const PWCHAR); +WINLDAPAPI BerValue** ldap_get_values_lenA(LDAP*,LDAPMessage*,const PCHAR); +WINLDAPAPI BerValue** ldap_get_values_lenW(LDAP*,LDAPMessage*,const PWCHAR); +WINLDAPAPI ULONG ldap_count_valuesA(PCHAR*); +WINLDAPAPI ULONG ldap_count_valuesW(PWCHAR*); +WINLDAPAPI ULONG ldap_count_values_len(struct berval**); +WINLDAPAPI ULONG ldap_value_freeA(PCHAR*); +WINLDAPAPI ULONG ldap_value_freeW(PWCHAR*); +WINLDAPAPI ULONG ldap_value_free_len(struct berval**); +WINLDAPAPI PCHAR ldap_get_dnA(LDAP*,LDAPMessage*); +WINLDAPAPI PWCHAR ldap_get_dnW(LDAP*,LDAPMessage*); +WINLDAPAPI PCHAR ldap_explode_dnA(PCHAR,ULONG); +WINLDAPAPI PWCHAR ldap_explode_dnW(PWCHAR,ULONG); +WINLDAPAPI PCHAR ldap_dn2ufnA(PCHAR); +WINLDAPAPI PWCHAR ldap_dn2ufnW(PWCHAR); +WINLDAPAPI ULONG ldap_ufn2dnA(const PCHAR,PCHAR*); +WINLDAPAPI ULONG ldap_ufn2dnW(const PWCHAR,PWCHAR*); +WINLDAPAPI ULONG ldap_parse_referenceA(LDAP*,LDAPMessage*,PCHAR**); +WINLDAPAPI ULONG ldap_parse_referenceW(LDAP*,LDAPMessage*,PWCHAR**); +WINLDAPAPI ULONG ldap_check_filterA(LDAP*,PCHAR); +WINLDAPAPI ULONG ldap_check_filterW(LDAP*,PWCHAR); +WINLDAPAPI ULONG ldap_create_page_controlA(PLDAP,ULONG,struct berval*,UCHAR,PLDAPControlA*); +WINLDAPAPI ULONG ldap_create_page_controlW(PLDAP,ULONG,struct berval*,UCHAR,PLDAPControlW*); +WINLDAPAPI ULONG ldap_create_sort_controlA(PLDAP,PLDAPSortKeyA*,UCHAR,PLDAPControlA*); +WINLDAPAPI ULONG ldap_create_sort_controlW(PLDAP,PLDAPSortKeyW*,UCHAR,PLDAPControlW*); +WINLDAPAPI INT ldap_create_vlv_controlA(LDAP*,LDAPVLVInfo*,UCHAR,LDAPControlA**); +WINLDAPAPI INT ldap_create_vlv_controlW(LDAP*,LDAPVLVInfo*,UCHAR,LDAPControlW**); +WINLDAPAPI ULONG ldap_encode_sort_controlA(PLDAP,PLDAPSortKeyA*,PLDAPControlA,BOOLEAN); +WINLDAPAPI ULONG ldap_encode_sort_controlW(PLDAP,PLDAPSortKeyW*,PLDAPControlW,BOOLEAN); +WINLDAPAPI ULONG ldap_escape_filter_elementA(PCHAR,ULONG,PCHAR,ULONG); +WINLDAPAPI ULONG ldap_escape_filter_elementW(PWCHAR,ULONG,PWCHAR,ULONG); +WINLDAPAPI ULONG ldap_get_next_page(PLDAP,PLDAPSearch,ULONG,ULONG*); +WINLDAPAPI ULONG ldap_get_next_page_s(PLDAP,PLDAPSearch,struct l_timeval*,ULONG,ULONG*,LDAPMessage**); +WINLDAPAPI ULONG ldap_get_paged_count(PLDAP,PLDAPSearch,ULONG*,PLDAPMessage); +WINLDAPAPI ULONG ldap_parse_page_controlA(PLDAP,PLDAPControlA*,ULONG*,struct berval**); +WINLDAPAPI ULONG ldap_parse_page_controlW(PLDAP,PLDAPControlW*,ULONG*,struct berval**); +WINLDAPAPI ULONG ldap_parse_sort_controlA(PLDAP,PLDAPControlA*,ULONG*,PCHAR*); +WINLDAPAPI ULONG ldap_parse_sort_controlW(PLDAP,PLDAPControlW*,ULONG*,PWCHAR*); +WINLDAPAPI INT ldap_parse_vlv_controlA(LDAP*,LDAPControlA**,unsigned long*,unsigned long*,struct berval**,int*); +WINLDAPAPI INT ldap_parse_vlv_controlW(LDAP*,LDAPControlW**,unsigned long*,unsigned long*,struct berval**,int*); +WINLDAPAPI PLDAPSearch ldap_search_init_pageA(PLDAP,const PCHAR,ULONG,const PCHAR,PCHAR[],ULONG,PLDAPControlA*,PLDAPControlA*,ULONG,ULONG,PLDAPSortKeyA*); +WINLDAPAPI PLDAPSearch ldap_search_init_pageW(PLDAP,const PWCHAR,ULONG,const PWCHAR,PWCHAR[],ULONG,PLDAPControlW*,PLDAPControlW*,ULONG,ULONG,PLDAPSortKeyW*); +WINLDAPAPI ULONG ldap_search_abandon_page(PLDAP,PLDAPSearch); +WINLDAPAPI LDAP ldap_conn_from_msg(LDAP*,LDAPMessage*); +WINLDAPAPI INT LdapUnicodeToUTF8(LPCWSTR,int,LPSTR,int); +WINLDAPAPI INT LdapUTF8ToUnicode(LPCSTR,int,LPWSTR,int); + +#if UNICODE +#define LDAPControl LDAPControlW +#define PLDAPControl PLDAPControlW +#define LDAPMod LDAPModW +#define PLDAPMod LDAPModW +#define LDAPSortKey LDAPSortKeyW +#define PLDAPSortKey PLDAPSortKeyW +#define LDAPAPIInfo LDAPAPIInfoW +#define PLDAPAPIInfo PLDAPAPIInfoW +#define LDAPAPIFeatureInfo LDAPAPIFeatureInfoW +#define PLDAPAPIFeatureInfo PLDAPAPIFeatureInfoW +#define cldap_open cldap_openW +#define ldap_open ldap_openW +#define ldap_bind ldap_bindW +#define ldap_bind_s ldap_bind_sW +#define ldap_simple_bind ldap_simple_bindW +#define ldap_simple_bind_s ldap_simple_bind_sW +#define ldap_sasl_bind ldap_sasl_bindW +#define ldap_sasl_bind_s ldap_sasl_bind_sW +#define ldap_init ldap_initW +#define ldap_sslinit ldap_sslinitW +#define ldap_get_option ldap_get_optionW +#define ldap_set_option ldap_set_optionW +#define ldap_start_tls_s ldap_start_tls_sW +#define ldap_add ldap_addW +#define ldap_add_ext ldap_add_extW +#define ldap_add_s ldap_add_sW +#define ldap_add_ext_s ldap_add_ext_sW +#define ldap_compare ldap_compareW +#define ldap_compare_ext ldap_compare_extW +#define ldap_compare_s ldap_compare_sW +#define ldap_compare_ext_s ldap_compare_ext_sW +#define ldap_delete ldap_deleteW +#define ldap_delete_ext ldap_delete_extW +#define ldap_delete_s ldap_delete_sW +#define ldap_delete_ext_s ldap_delete_ext_sW +#define ldap_extended_operation_s ldap_extended_operation_sW +#define ldap_extended_operation ldap_extended_operationW +#define ldap_modify ldap_modifyW +#define ldap_modify_ext ldap_modify_extW +#define ldap_modify_s ldap_modify_sW +#define ldap_modify_ext_s ldap_modify_ext_sW +#define ldap_check_filter ldap_check_filterW +#define ldap_count_values ldap_count_valuesW +#define ldap_create_page_control ldap_create_page_controlW +#define ldap_create_sort_control ldap_create_sort_controlW +#define ldap_create_vlv_control ldap_create_vlv_controlW +#define ldap_encode_sort_control ldap_encode_sort_controlW +#define ldap_escape_filter_element ldap_escape_filter_elementW +#define ldap_first_attribute ldap_first_attributeW +#define ldap_next_attribute ldap_next_attributeW +#define ldap_get_values ldap_get_valuesW +#define ldap_get_values_len ldap_get_values_lenW +#define ldap_parse_extended_result ldap_parse_extended_resultW +#define ldap_parse_page_control ldap_parse_page_controlW +#define ldap_parse_reference ldap_parse_referenceW +#define ldap_parse_result ldap_parse_resultW +#define ldap_parse_sort_control ldap_parse_sort_controlW +#define ldap_parse_vlv_control ldap_parse_vlv_controlW +#define ldap_search ldap_searchW +#define ldap_search_s ldap_search_sW +#define ldap_search_st ldap_search_stW +#define ldap_search_ext ldap_search_extW +#define ldap_search_ext_s ldap_search_ext_sW +#define ldap_search_init_page ldap_search_init_pageW +#define ldap_err2string ldap_err2stringW +#define ldap_control_free ldap_control_freeW +#define ldap_controls_free ldap_controls_freeW +#define ldap_free_controls ldap_free_controlsW +#define ldap_memfree ldap_memfreeW +#define ldap_value_free ldap_value_freeW +#define ldap_dn2ufn ldap_dn2ufnW +#define ldap_ufn2dn ldap_ufn2dnW +#define ldap_explode_dn ldap_explode_dnW +#define ldap_get_dn ldap_get_dnW +#define ldap_modrdn ldap_modrdnW +#define ldap_modrdn_s ldap_modrdn_sW +#define ldap_modrdn2 ldap_modrdn2W +#define ldap_modrdn2_s ldap_modrdn2_sW +#define ldap_rename ldap_rename_extW +#define ldap_rename_s ldap_rename_ext_sW +#define ldap_rename_ext ldap_rename_extW +#define ldap_rename_ext_s ldap_rename_ext_sW +#else +#define LDAPControl LDAPControlA +#define PLDAPControl PLDAPControlA +#define LDAPMod LDAPModA +#define PLDAPMod LDAPModA +#define LDAPSortKey LDAPSortKeyA +#define PLDAPSortKey PLDAPSortKeyA +#define LDAPAPIInfo LDAPAPIInfoA +#define PLDAPAPIInfo PLDAPAPIInfoA +#define LDAPAPIFeatureInfo LDAPAPIFeatureInfoA +#define PLDAPAPIFeatureInfo PLDAPAPIFeatureInfoA +#define cldap_open cldap_openA +#define ldap_open ldap_openA +#define ldap_bind ldap_bindA +#define ldap_bind_s ldap_bind_sA +#define ldap_simple_bind ldap_simple_bindA +#define ldap_simple_bind_s ldap_simple_bind_sA +#define ldap_sasl_bind ldap_sasl_bindA +#define ldap_sasl_bind_s ldap_sasl_bind_sA +#define ldap_init ldap_initA +#define ldap_sslinit ldap_sslinitA +#define ldap_get_option ldap_get_optionA +#define ldap_set_option ldap_set_optionA +#define ldap_start_tls_s ldap_start_tls_sA +#define ldap_add ldap_addA +#define ldap_add_ext ldap_add_extA +#define ldap_add_s ldap_add_sA +#define ldap_add_ext_s ldap_add_ext_sA +#define ldap_compare ldap_compareA +#define ldap_compare_ext ldap_compare_extA +#define ldap_compare_s ldap_compare_sA +#define ldap_compare_ext_s ldap_compare_ext_sA +#define ldap_delete ldap_deleteA +#define ldap_delete_ext ldap_delete_extA +#define ldap_delete_s ldap_delete_sA +#define ldap_delete_ext_s ldap_delete_ext_sA +#define ldap_extended_operation_s ldap_extended_operation_sA +#define ldap_extended_operation ldap_extended_operationA +#define ldap_modify ldap_modifyA +#define ldap_modify_ext ldap_modify_extA +#define ldap_modify_s ldap_modify_sA +#define ldap_modify_ext_s ldap_modify_ext_sA +#define ldap_check_filter ldap_check_filterA +#define ldap_count_values ldap_count_valuesA +#define ldap_create_page_control ldap_create_page_controlA +#define ldap_create_sort_control ldap_create_sort_controlA +#define ldap_create_vlv_control ldap_create_vlv_controlA +#define ldap_encode_sort_control ldap_encode_sort_controlA +#define ldap_escape_filter_element ldap_escape_filter_elementA +#define ldap_first_attribute ldap_first_attributeA +#define ldap_next_attribute ldap_next_attributeA +#define ldap_get_values ldap_get_valuesA +#define ldap_get_values_len ldap_get_values_lenA +#define ldap_parse_extended_result ldap_parse_extended_resultA +#define ldap_parse_page_control ldap_parse_page_controlA +#define ldap_parse_reference ldap_parse_referenceA +#define ldap_parse_result ldap_parse_resultA +#define ldap_parse_sort_control ldap_parse_sort_controlA +#define ldap_parse_vlv_control ldap_parse_vlv_controlA +#define ldap_search ldap_searchA +#define ldap_search_s ldap_search_sA +#define ldap_search_st ldap_search_stA +#define ldap_search_ext ldap_search_extA +#define ldap_search_ext_s ldap_search_ext_sA +#define ldap_search_init_page ldap_search_init_pageA +#define ldap_err2string ldap_err2stringA +#define ldap_control_free ldap_control_freeA +#define ldap_controls_free ldap_controls_freeA +#define ldap_free_controls ldap_free_controlsA +#define ldap_memfree ldap_memfreeA +#define ldap_value_free ldap_value_freeA +#define ldap_dn2ufn ldap_dn2ufnA +#define ldap_ufn2dn ldap_ufn2dnA +#define ldap_explode_dn ldap_explode_dnA +#define ldap_get_dn ldap_get_dnA +#define ldap_modrdn ldap_modrdnA +#define ldap_modrdn_s ldap_modrdn_sA +#define ldap_modrdn2 ldap_modrdn2A +#define ldap_modrdn2_s ldap_modrdn2_sA +#define ldap_rename ldap_rename_extA +#define ldap_rename_s ldap_rename_ext_sA +#define ldap_rename_ext ldap_rename_extA +#define ldap_rename_ext_s ldap_rename_ext_sA +#endif + +#ifdef __cplusplus +} +#endif + +#include <poppack.h> + +#endif /* _WINLDAP_H */ diff --git a/reactos/w32api/include/winnetwk.h b/reactos/w32api/include/winnetwk.h new file mode 100644 index 00000000000..0e734462587 --- /dev/null +++ b/reactos/w32api/include/winnetwk.h @@ -0,0 +1,346 @@ +#ifndef _WINNETWK_H +#define _WINNETWK_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#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 +#define WNNC_NET_SYMFONET 0x00150000 +#define WNNC_NET_CLEARCASE 0x00160000 +#define WNNC_NET_FRONTIER 0x00170000 +#define WNNC_NET_BMC 0x00180000 +#define WNNC_NET_DCE 0x00190000 +#define WNNC_NET_AVID 0x001A0000 +#define WNNC_NET_DOCUSPACE 0x001B0000 +#define WNNC_NET_MANGOSOFT 0x001C0000 +#define WNNC_NET_SERNET 0x001D0000 +#define WNNC_NET_DECORB 0x00200000 +#define WNNC_NET_PROTSTOR 0x00210000 +#define WNNC_NET_FJ_REDIR 0x00220000 +#define WNNC_NET_DISTINCT 0x00230000 +#define WNNC_NET_TWINS 0x00240000 +#define WNNC_NET_RDR2SAMPLE 0x00250000 +#define WNNC_NET_CSC 0x00260000 +#define WNNC_NET_3IN1 0x00270000 +#define WNNC_NET_EXTENDNET 0x00290000 +#define WNNC_NET_OBJECT_DIRE 0x00300000 +#define WNNC_NET_MASFAX 0x00310000 +#define WNNC_NET_HOB_NFS 0x00320000 +#define WNNC_NET_SHIVA 0x00330000 +#define WNNC_NET_IBMAL 0x00340000 +#define WNNC_CRED_MANAGER 0xFFFF0000 + +#define RESOURCE_CONNECTED 1 +#define RESOURCE_GLOBALNET 2 +#define RESOURCE_REMEMBERED 3 +#define RESOURCE_RECENT 4 +#define RESOURCE_CONTEXT 5 +#define RESOURCETYPE_ANY 0 +#define RESOURCETYPE_DISK 1 +#define RESOURCETYPE_PRINT 2 +#define RESOURCETYPE_RESERVED 8 +#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 0 +#define RESOURCEDISPLAYTYPE_DOMAIN 1 +#define RESOURCEDISPLAYTYPE_SERVER 2 +#define RESOURCEDISPLAYTYPE_SHARE 3 +#define RESOURCEDISPLAYTYPE_FILE 4 +#define RESOURCEDISPLAYTYPE_GROUP 5 +#define RESOURCEDISPLAYTYPE_NETWORK 6 +#define RESOURCEDISPLAYTYPE_ROOT 7 +#define RESOURCEDISPLAYTYPE_SHAREADMIN 8 +#define RESOURCEDISPLAYTYPE_DIRECTORY 9 +#define RESOURCEDISPLAYTYPE_TREE 10 +#define NETPROPERTY_PERSISTENT 1 +#define CONNECT_UPDATE_PROFILE 1 +#define CONNECT_UPDATE_RECENT 2 +#define CONNECT_TEMPORARY 4 +#define CONNECT_INTERACTIVE 8 +#define CONNECT_PROMPT 16 +#define CONNECT_NEED_DRIVE 32 +#define CONNECT_REFCOUNT 64 +#define CONNECT_REDIRECT 128 +#define CONNECT_LOCALDRIVE 256 +#define CONNECT_CURRENT_MEDIA 512 +#define CONNDLG_RO_PATH 1 +#define CONNDLG_CONN_POINT 2 +#define CONNDLG_USE_MRU 4 +#define CONNDLG_HIDE_BOX 8 +#define CONNDLG_PERSIST 16 +#define CONNDLG_NOT_PERSIST 32 +#define DISC_UPDATE_PROFILE 1 +#define DISC_NO_FORCE 64 +#define WNFMT_MULTILINE 1 +#define WNFMT_ABBREVIATED 2 +#define WNFMT_INENUM 16 +#define WNFMT_CONNECTION 32 +#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 +#define UNIVERSAL_NAME_INFO_LEVEL 1 +#define REMOTE_NAME_INFO_LEVEL 2 +#define NETINFO_DLL16 1 +#define NETINFO_DISKRED 4 +#define NETINFO_PRINTERRED 8 +#define RP_LOGON 1 +#define RP_INIFILE 2 +#define PP_DISPLAYERRORS 1 +#define WNCON_FORNETCARD 1 +#define WNCON_NOTROUTED 2 +#define WNCON_SLOWLINK 4 +#define WNCON_DYNAMIC 8 + +#ifndef RC_INVOKED +typedef struct _NETRESOURCEA { + DWORD dwScope; + DWORD dwType; + DWORD dwDisplayType; + DWORD dwUsage; + LPSTR lpLocalName; + LPSTR lpRemoteName; + LPSTR lpComment ; + LPSTR lpProvider; +}NETRESOURCEA,*LPNETRESOURCEA; +typedef struct _NETRESOURCEW { + DWORD dwScope; + DWORD dwType; + DWORD dwDisplayType; + DWORD dwUsage; + LPWSTR lpLocalName; + LPWSTR lpRemoteName; + LPWSTR lpComment ; + LPWSTR lpProvider; +}NETRESOURCEW,*LPNETRESOURCEW; +typedef struct _CONNECTDLGSTRUCTA{ + DWORD cbStructure; + HWND hwndOwner; + LPNETRESOURCEA lpConnRes; + DWORD dwFlags; + DWORD dwDevNum; +} CONNECTDLGSTRUCTA,*LPCONNECTDLGSTRUCTA; +typedef struct _CONNECTDLGSTRUCTW{ + DWORD cbStructure; + HWND hwndOwner; + LPNETRESOURCEW lpConnRes; + DWORD dwFlags; + DWORD dwDevNum; +} CONNECTDLGSTRUCTW,*LPCONNECTDLGSTRUCTW; +typedef struct _DISCDLGSTRUCTA{ + DWORD cbStructure; + HWND hwndOwner; + LPSTR lpLocalName; + LPSTR lpRemoteName; + DWORD dwFlags; +} DISCDLGSTRUCTA,*LPDISCDLGSTRUCTA; +typedef struct _DISCDLGSTRUCTW{ + DWORD cbStructure; + HWND hwndOwner; + LPWSTR lpLocalName; + LPWSTR lpRemoteName; + DWORD dwFlags; +} DISCDLGSTRUCTW,*LPDISCDLGSTRUCTW; +typedef struct _UNIVERSAL_NAME_INFOA { LPSTR lpUniversalName; }UNIVERSAL_NAME_INFOA,*LPUNIVERSAL_NAME_INFOA; +typedef struct _UNIVERSAL_NAME_INFOW { LPWSTR lpUniversalName; }UNIVERSAL_NAME_INFOW,*LPUNIVERSAL_NAME_INFOW; +typedef struct _REMOTE_NAME_INFOA { + LPSTR lpUniversalName; + LPSTR lpConnectionName; + LPSTR lpRemainingPath; +}REMOTE_NAME_INFOA,*LPREMOTE_NAME_INFOA; +typedef struct _REMOTE_NAME_INFOW { + LPWSTR lpUniversalName; + LPWSTR lpConnectionName; + LPWSTR lpRemainingPath; +}REMOTE_NAME_INFOW,*LPREMOTE_NAME_INFOW; +typedef struct _NETINFOSTRUCT{ + DWORD cbStructure; + DWORD dwProviderVersion; + DWORD dwStatus; + DWORD dwCharacteristics; + DWORD dwHandle; + WORD wNetType; + DWORD dwPrinters; + DWORD dwDrives; +} NETINFOSTRUCT,*LPNETINFOSTRUCT; +typedef UINT(PASCAL *PFNGETPROFILEPATHA)(LPCSTR,LPSTR,UINT); +typedef UINT(PASCAL *PFNGETPROFILEPATHW)(LPCWSTR,LPWSTR,UINT); +typedef UINT(PASCAL *PFNRECONCILEPROFILEA)(LPCSTR,LPCSTR,DWORD); +typedef UINT(PASCAL *PFNRECONCILEPROFILEW)(LPCWSTR,LPCWSTR,DWORD); +typedef BOOL(PASCAL *PFNPROCESSPOLICIESA)(HWND,LPCSTR,LPCSTR,LPCSTR,DWORD); +typedef BOOL(PASCAL *PFNPROCESSPOLICIESW)(HWND,LPCWSTR,LPCWSTR,LPCWSTR,DWORD); +typedef struct _NETCONNECTINFOSTRUCT{ + DWORD cbStructure; + DWORD dwFlags; + DWORD dwSpeed; + DWORD dwDelay; + DWORD dwOptDataSize; +} NETCONNECTINFOSTRUCT,*LPNETCONNECTINFOSTRUCT; + +DWORD APIENTRY WNetAddConnectionA(LPCSTR,LPCSTR,LPCSTR); +DWORD APIENTRY WNetAddConnectionW(LPCWSTR,LPCWSTR,LPCWSTR); +DWORD APIENTRY WNetAddConnection2A(LPNETRESOURCEA,LPCSTR,LPCSTR,DWORD); +DWORD APIENTRY WNetAddConnection2W(LPNETRESOURCEW,LPCWSTR,LPCWSTR,DWORD); +DWORD APIENTRY WNetAddConnection3A(HWND,LPNETRESOURCEA,LPCSTR,LPCSTR,DWORD); +DWORD APIENTRY WNetAddConnection3W(HWND,LPNETRESOURCEW,LPCWSTR,LPCWSTR,DWORD); +DWORD APIENTRY WNetCancelConnectionA(LPCSTR,BOOL); +DWORD APIENTRY WNetCancelConnectionW(LPCWSTR,BOOL); +DWORD APIENTRY WNetCancelConnection2A(LPCSTR,DWORD,BOOL); +DWORD APIENTRY WNetCancelConnection2W(LPCWSTR,DWORD,BOOL); +DWORD APIENTRY WNetGetConnectionA(LPCSTR,LPSTR,PDWORD); +DWORD APIENTRY WNetGetConnectionW(LPCWSTR,LPWSTR,PDWORD); +DWORD APIENTRY WNetUseConnectionA(HWND,LPNETRESOURCEA,LPCSTR,LPCSTR,DWORD,LPSTR,PDWORD,PDWORD); +DWORD APIENTRY WNetUseConnectionW(HWND,LPNETRESOURCEW,LPCWSTR,LPCWSTR,DWORD,LPWSTR,PDWORD,PDWORD); +DWORD APIENTRY WNetSetConnectionA(LPCSTR,DWORD,PVOID); +DWORD APIENTRY WNetSetConnectionW(LPCWSTR,DWORD,PVOID); +DWORD APIENTRY WNetConnectionDialog(HWND,DWORD); +DWORD APIENTRY WNetDisconnectDialog(HWND,DWORD); +DWORD APIENTRY WNetConnectionDialog1A(LPCONNECTDLGSTRUCTA); +DWORD APIENTRY WNetConnectionDialog1W(LPCONNECTDLGSTRUCTW); +DWORD APIENTRY WNetDisconnectDialog1A(LPDISCDLGSTRUCTA); +DWORD APIENTRY WNetDisconnectDialog1W(LPDISCDLGSTRUCTW); +DWORD APIENTRY WNetOpenEnumA(DWORD,DWORD,DWORD,LPNETRESOURCEA,LPHANDLE); +DWORD APIENTRY WNetOpenEnumW(DWORD,DWORD,DWORD,LPNETRESOURCEW,LPHANDLE); +DWORD APIENTRY WNetEnumResourceA(HANDLE,PDWORD,PVOID,PDWORD); +DWORD APIENTRY WNetEnumResourceW(HANDLE,PDWORD,PVOID,PDWORD); +DWORD APIENTRY WNetCloseEnum(HANDLE); +DWORD APIENTRY WNetGetUniversalNameA(LPCSTR,DWORD,PVOID,PDWORD); +DWORD APIENTRY WNetGetUniversalNameW(LPCWSTR,DWORD,PVOID,PDWORD); +DWORD APIENTRY WNetGetUserA(LPCSTR,LPSTR,PDWORD); +DWORD APIENTRY WNetGetUserW(LPCWSTR,LPWSTR,PDWORD); +DWORD APIENTRY WNetGetProviderNameA(DWORD,LPSTR,PDWORD); +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 WNetGetLastErrorA(PDWORD,LPSTR,DWORD,LPSTR,DWORD); +DWORD APIENTRY WNetGetLastErrorW(PDWORD,LPWSTR,DWORD,LPWSTR,DWORD); +DWORD APIENTRY MultinetGetConnectionPerformanceA(LPNETRESOURCEA,LPNETCONNECTINFOSTRUCT); +DWORD APIENTRY MultinetGetConnectionPerformanceW(LPNETRESOURCEW,LPNETCONNECTINFOSTRUCT); +#ifdef UNICODE +#define PFNPROCESSPOLICIES PFNPROCESSPOLICIESW +#define PFNRECONCILEPROFILE PFNRECONCILEPROFILEW +#define PFNGETPROFILEPATH PFNGETPROFILEPATHW +typedef NETRESOURCEW NETRESOURCE,*LPNETRESOURCE; +typedef CONNECTDLGSTRUCTW CONNECTDLGSTRUCT,*LPCONNECTDLGSTRUCT; +typedef DISCDLGSTRUCTW DISCDLGSTRUCT,*LPDISCDLGSTRUCT; +typedef REMOTE_NAME_INFOW REMOTE_NAME_INFO,*LPREMOTE_NAME_INFO; +typedef UNIVERSAL_NAME_INFOW UNIVERSAL_NAME_INFO,*LPUNIVERSAL_NAME_INFO; +#define WNetEnumResource WNetEnumResourceW +#define WNetOpenEnum WNetOpenEnumW +#define WNetGetResourceInformation WNetGetResourceInformationW +#define WNetGetUniversalName WNetGetUniversalNameW +#define WNetSetConnection WNetSetConnectionW +#define WNetUseConnection WNetUseConnectionW +#define WNetGetConnection WNetGetConnectionW +#define WNetCancelConnection2 WNetCancelConnection2W +#define WNetCancelConnection WNetCancelConnectionW +#define WNetAddConnection3 WNetAddConnection3W +#define WNetAddConnection2 WNetAddConnection2W +#define WNetAddConnection WNetAddConnectionW +#define WNetConnectionDialog1 WNetConnectionDialog1W +#define WNetDisconnectDialog1 WNetDisconnectDialog1W +#define WNetGetNetworkInformation WNetGetNetworkInformationW +#define WNetGetProviderName WNetGetProviderNameW +#define WNetGetUser WNetGetUserW +#define MultinetGetConnectionPerformance MultinetGetConnectionPerformanceW +#define WNetGetLastError WNetGetLastErrorW +#else +#define PFNGETPROFILEPATH PFNGETPROFILEPATHA +#define PFNRECONCILEPROFILE PFNRECONCILEPROFILEA +#define PFNPROCESSPOLICIES PFNPROCESSPOLICIESA +typedef NETRESOURCEA NETRESOURCE,*LPNETRESOURCE; +typedef CONNECTDLGSTRUCTA CONNECTDLGSTRUCT,*LPCONNECTDLGSTRUCT; +typedef DISCDLGSTRUCTA DISCDLGSTRUCT,*LPDISCDLGSTRUCT; +typedef UNIVERSAL_NAME_INFOA UNIVERSAL_NAME_INFO,*LPUNIVERSAL_NAME_INFO; +typedef REMOTE_NAME_INFOA REMOTE_NAME_INFO,*LPREMOTE_NAME_INFO; +#define WNetOpenEnum WNetOpenEnumA +#define WNetEnumResource WNetEnumResourceA +#define WNetGetResourceInformation WNetGetResourceInformationA +#define WNetGetUniversalName WNetGetUniversalNameA +#define WNetConnectionDialog1 WNetConnectionDialog1A +#define WNetDisconnectDialog1 WNetDisconnectDialog1A +#define WNetAddConnection2 WNetAddConnection2A +#define WNetAddConnection3 WNetAddConnection3A +#define WNetCancelConnection WNetCancelConnectionA +#define WNetCancelConnection2 WNetCancelConnection2A +#define WNetGetConnection WNetGetConnectionA +#define WNetUseConnection WNetUseConnectionA +#define WNetSetConnection WNetSetConnectionA +#define WNetAddConnection WNetAddConnectionA +#define WNetGetUser WNetGetUserA +#define WNetGetProviderName WNetGetProviderNameA +#define WNetGetNetworkInformation WNetGetNetworkInformationA +#define WNetGetLastError WNetGetLastErrorA +#define MultinetGetConnectionPerformance MultinetGetConnectionPerformanceA +#endif +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/winnls.h b/reactos/w32api/include/winnls.h new file mode 100644 index 00000000000..acdaf516c65 --- /dev/null +++ b/reactos/w32api/include/winnls.h @@ -0,0 +1,705 @@ +#ifndef _WINNLS_H +#define _WINNLS_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define MAX_LEADBYTES 12 +#define MAX_DEFAULTCHAR 2 +#define LOCALE_NOUSEROVERRIDE 0x80000000 +#define LOCALE_USE_CP_ACP 0x40000000 +#if (WINVER >= 0x0400) +#define LOCALE_RETURN_NUMBER 0x20000000 +#endif +#define LOCALE_ILANGUAGE 1 +#define LOCALE_SLANGUAGE 2 +#define LOCALE_SENGLANGUAGE 0x1001 +#define LOCALE_SABBREVLANGNAME 3 +#define LOCALE_SNATIVELANGNAME 4 +#define LOCALE_ICOUNTRY 5 +#define LOCALE_SCOUNTRY 6 +#define LOCALE_SENGCOUNTRY 0x1002 +#define LOCALE_SABBREVCTRYNAME 7 +#define LOCALE_SNATIVECTRYNAME 8 +#define LOCALE_IDEFAULTLANGUAGE 9 +#define LOCALE_IDEFAULTCOUNTRY 10 +#define LOCALE_IDEFAULTCODEPAGE 11 +#define LOCALE_IDEFAULTANSICODEPAGE 0x1004 +#define LOCALE_SLIST 12 +#define LOCALE_IMEASURE 13 +#define LOCALE_SDECIMAL 14 +#define LOCALE_STHOUSAND 15 +#define LOCALE_SGROUPING 16 +#define LOCALE_IDIGITS 17 +#define LOCALE_ILZERO 18 +#define LOCALE_INEGNUMBER 0x1010 +#define LOCALE_SNATIVEDIGITS 19 +#define LOCALE_SCURRENCY 20 +#define LOCALE_SINTLSYMBOL 21 +#define LOCALE_SMONDECIMALSEP 22 +#define LOCALE_SMONTHOUSANDSEP 23 +#define LOCALE_SMONGROUPING 24 +#define LOCALE_ICURRDIGITS 25 +#define LOCALE_IINTLCURRDIGITS 26 +#define LOCALE_ICURRENCY 27 +#define LOCALE_INEGCURR 28 +#define LOCALE_SDATE 29 +#define LOCALE_STIME 30 +#define LOCALE_SSHORTDATE 31 +#define LOCALE_SLONGDATE 32 +#define LOCALE_STIMEFORMAT 0x1003 +#define LOCALE_IDATE 33 +#define LOCALE_ILDATE 34 +#define LOCALE_ITIME 35 +#define LOCALE_ITIMEMARKPOSN 0x1005 +#define LOCALE_ICENTURY 36 +#define LOCALE_ITLZERO 37 +#define LOCALE_IDAYLZERO 38 +#define LOCALE_IMONLZERO 39 +#define LOCALE_S1159 40 +#define LOCALE_S2359 41 +#define LOCALE_ICALENDARTYPE 0x1009 +#define LOCALE_IOPTIONALCALENDAR 0x100B +#define LOCALE_IFIRSTDAYOFWEEK 0x100C +#define LOCALE_IFIRSTWEEKOFYEAR 0x100D +#define LOCALE_SDAYNAME1 42 +#define LOCALE_SDAYNAME2 43 +#define LOCALE_SDAYNAME3 44 +#define LOCALE_SDAYNAME4 45 +#define LOCALE_SDAYNAME5 46 +#define LOCALE_SDAYNAME6 47 +#define LOCALE_SDAYNAME7 48 +#define LOCALE_SABBREVDAYNAME1 49 +#define LOCALE_SABBREVDAYNAME2 50 +#define LOCALE_SABBREVDAYNAME3 51 +#define LOCALE_SABBREVDAYNAME4 52 +#define LOCALE_SABBREVDAYNAME5 53 +#define LOCALE_SABBREVDAYNAME6 54 +#define LOCALE_SABBREVDAYNAME7 55 +#define LOCALE_SMONTHNAME1 56 +#define LOCALE_SMONTHNAME2 57 +#define LOCALE_SMONTHNAME3 58 +#define LOCALE_SMONTHNAME4 59 +#define LOCALE_SMONTHNAME5 60 +#define LOCALE_SMONTHNAME6 61 +#define LOCALE_SMONTHNAME7 62 +#define LOCALE_SMONTHNAME8 63 +#define LOCALE_SMONTHNAME9 64 +#define LOCALE_SMONTHNAME10 65 +#define LOCALE_SMONTHNAME11 66 +#define LOCALE_SMONTHNAME12 67 +#define LOCALE_SMONTHNAME13 0x100E +#define LOCALE_SABBREVMONTHNAME1 68 +#define LOCALE_SABBREVMONTHNAME2 69 +#define LOCALE_SABBREVMONTHNAME3 70 +#define LOCALE_SABBREVMONTHNAME4 71 +#define LOCALE_SABBREVMONTHNAME5 72 +#define LOCALE_SABBREVMONTHNAME6 73 +#define LOCALE_SABBREVMONTHNAME7 74 +#define LOCALE_SABBREVMONTHNAME8 75 +#define LOCALE_SABBREVMONTHNAME9 76 +#define LOCALE_SABBREVMONTHNAME10 77 +#define LOCALE_SABBREVMONTHNAME11 78 +#define LOCALE_SABBREVMONTHNAME12 79 +#define LOCALE_SABBREVMONTHNAME13 0x100F +#define LOCALE_SPOSITIVESIGN 80 +#define LOCALE_SNEGATIVESIGN 81 +#define LOCALE_IPOSSIGNPOSN 82 +#define LOCALE_INEGSIGNPOSN 83 +#define LOCALE_IPOSSYMPRECEDES 84 +#define LOCALE_IPOSSEPBYSPACE 85 +#define LOCALE_INEGSYMPRECEDES 86 +#define LOCALE_INEGSEPBYSPACE 87 +#define LOCALE_FONTSIGNATURE 88 +#define LOCALE_SISO639LANGNAME 89 +#define LOCALE_SISO3166CTRYNAME 90 +#define LOCALE_SYSTEM_DEFAULT 0x800 +#define LOCALE_USER_DEFAULT 0x400 +#define NORM_IGNORECASE 1 +#define NORM_IGNOREKANATYPE 65536 +#define NORM_IGNORENONSPACE 2 +#define NORM_IGNORESYMBOLS 4 +#define NORM_IGNOREWIDTH 131072 +#define SORT_STRINGSORT 4096 +#define LCMAP_LOWERCASE 0x00000100 +#define LCMAP_UPPERCASE 0x00000200 +#define LCMAP_SORTKEY 0x00000400 +#define LCMAP_BYTEREV 0x00000800 +#define LCMAP_HIRAGANA 0x00100000 +#define LCMAP_KATAKANA 0x00200000 +#define LCMAP_HALFWIDTH 0x00400000 +#define LCMAP_FULLWIDTH 0x00800000 +#define LCMAP_LINGUISTIC_CASING 0x01000000 +#define LCMAP_SIMPLIFIED_CHINESE 0x02000000 +#define LCMAP_TRADITIONAL_CHINESE 0x04000000 +#define ENUM_ALL_CALENDARS (-1) +#define DATE_SHORTDATE 1 +#define DATE_LONGDATE 2 +#define DATE_USE_ALT_CALENDAR 4 +#define CP_INSTALLED 1 +#define CP_SUPPORTED 2 +#define LCID_INSTALLED 1 +#define LCID_SUPPORTED 2 +#define LCID_ALTERNATE_SORTS 4 +#define MAP_FOLDCZONE 16 +#define MAP_FOLDDIGITS 128 +#define MAP_PRECOMPOSED 32 +#define MAP_COMPOSITE 64 +#define CP_ACP 0 +#define CP_OEMCP 1 +#define CP_MACCP 2 +#define CP_THREAD_ACP 3 +#define CP_SYMBOL 42 +#define CP_UTF7 65000 +#define CP_UTF8 65001 +#define CT_CTYPE1 1 +#define CT_CTYPE2 2 +#define CT_CTYPE3 4 +#define C1_UPPER 1 +#define C1_LOWER 2 +#define C1_DIGIT 4 +#define C1_SPACE 8 +#define C1_PUNCT 16 +#define C1_CNTRL 32 +#define C1_BLANK 64 +#define C1_XDIGIT 128 +#define C1_ALPHA 256 +#define C2_LEFTTORIGHT 1 +#define C2_RIGHTTOLEFT 2 +#define C2_EUROPENUMBER 3 +#define C2_EUROPESEPARATOR 4 +#define C2_EUROPETERMINATOR 5 +#define C2_ARABICNUMBER 6 +#define C2_COMMONSEPARATOR 7 +#define C2_BLOCKSEPARATOR 8 +#define C2_SEGMENTSEPARATOR 9 +#define C2_WHITESPACE 10 +#define C2_OTHERNEUTRAL 11 +#define C2_NOTAPPLICABLE 0 +#define C3_NONSPACING 1 +#define C3_DIACRITIC 2 +#define C3_VOWELMARK 4 +#define C3_SYMBOL 8 +#define C3_KATAKANA 16 +#define C3_HIRAGANA 32 +#define C3_HALFWIDTH 64 +#define C3_FULLWIDTH 128 +#define C3_IDEOGRAPH 256 +#define C3_KASHIDA 512 +#define C3_LEXICAL 1024 +#define C3_ALPHA 32768 +#define C3_NOTAPPLICABLE 0 +#define TIME_NOMINUTESORSECONDS 1 +#define TIME_NOSECONDS 2 +#define TIME_NOTIMEMARKER 4 +#define TIME_FORCE24HOURFORMAT 8 +#define MB_PRECOMPOSED 1 +#define MB_COMPOSITE 2 +#define MB_ERR_INVALID_CHARS 8 +#define MB_USEGLYPHCHARS 4 +#define WC_COMPOSITECHECK 512 +#define WC_DISCARDNS 16 +#define WC_SEPCHARS 32 +#define WC_DEFAULTCHAR 64 +#define CTRY_DEFAULT 0 +#define CTRY_ALBANIA 355 +#define CTRY_ALGERIA 213 +#define CTRY_ARGENTINA 54 +#define CTRY_ARMENIA 374 +#define CTRY_AUSTRALIA 61 +#define CTRY_AUSTRIA 43 +#define CTRY_AZERBAIJAN 994 +#define CTRY_BAHRAIN 973 +#define CTRY_BELARUS 375 +#define CTRY_BELGIUM 32 +#define CTRY_BELIZE 501 +#define CTRY_BOLIVIA 591 +#define CTRY_BRAZIL 55 +#define CTRY_BRUNEI_DARUSSALAM 673 +#define CTRY_BULGARIA 359 +#define CTRY_CANADA 2 +#define CTRY_CARIBBEAN 1 +#define CTRY_CHILE 56 +#define CTRY_COLOMBIA 57 +#define CTRY_COSTA_RICA 506 +#define CTRY_CROATIA 385 +#define CTRY_CZECH 420 +#define CTRY_DENMARK 45 +#define CTRY_DOMINICAN_REPUBLIC 1 +#define CTRY_ECUADOR 593 +#define CTRY_EGYPT 20 +#define CTRY_EL_SALVADOR 503 +#define CTRY_ESTONIA 372 +#define CTRY_FAEROE_ISLANDS 298 +#define CTRY_FINLAND 358 +#define CTRY_FRANCE 33 +#define CTRY_GEORGIA 995 +#define CTRY_GERMANY 49 +#define CTRY_GREECE 30 +#define CTRY_GUATEMALA 502 +#define CTRY_HONDURAS 504 +#define CTRY_HONG_KONG 852 +#define CTRY_HUNGARY 36 +#define CTRY_ICELAND 354 +#define CTRY_INDIA 91 +#define CTRY_INDONESIA 62 +#define CTRY_IRAN 981 +#define CTRY_IRAQ 964 +#define CTRY_IRELAND 353 +#define CTRY_ISRAEL 972 +#define CTRY_ITALY 39 +#define CTRY_JAMAICA 1 +#define CTRY_JAPAN 81 +#define CTRY_JORDAN 962 +#define CTRY_KAZAKSTAN 7 +#define CTRY_KENYA 254 +#define CTRY_KUWAIT 965 +#define CTRY_KYRGYZSTAN 996 +#define CTRY_LATVIA 371 +#define CTRY_LEBANON 961 +#define CTRY_LIBYA 218 +#define CTRY_LIECHTENSTEIN 41 +#define CTRY_LITHUANIA 370 +#define CTRY_LUXEMBOURG 352 +#define CTRY_MACAU 853 +#define CTRY_MACEDONIA 389 +#define CTRY_MALAYSIA 60 +#define CTRY_MALDIVES 960 +#define CTRY_MEXICO 52 +#define CTRY_MONACO 33 +#define CTRY_MONGOLIA 976 +#define CTRY_MOROCCO 212 +#define CTRY_NETHERLANDS 31 +#define CTRY_NEW_ZEALAND 64 +#define CTRY_NICARAGUA 505 +#define CTRY_NORWAY 47 +#define CTRY_OMAN 968 +#define CTRY_PAKISTAN 92 +#define CTRY_PANAMA 507 +#define CTRY_PARAGUAY 595 +#define CTRY_PERU 51 +#define CTRY_PHILIPPINES 63 +#define CTRY_POLAND 48 +#define CTRY_PORTUGAL 351 +#define CTRY_PRCHINA 86 +#define CTRY_PUERTO_RICO 1 +#define CTRY_QATAR 974 +#define CTRY_ROMANIA 40 +#define CTRY_RUSSIA 7 +#define CTRY_SAUDI_ARABIA 966 +#define CTRY_SERBIA 381 +#define CTRY_SINGAPORE 65 +#define CTRY_SLOVAK 421 +#define CTRY_SLOVENIA 386 +#define CTRY_SOUTH_AFRICA 27 +#define CTRY_SOUTH_KOREA 82 +#define CTRY_SPAIN 34 +#define CTRY_SWEDEN 46 +#define CTRY_SWITZERLAND 41 +#define CTRY_SYRIA 963 +#define CTRY_TAIWAN 886 +#define CTRY_TATARSTAN 7 +#define CTRY_THAILAND 66 +#define CTRY_TRINIDAD_Y_TOBAGO 1 +#define CTRY_TUNISIA 216 +#define CTRY_TURKEY 90 +#define CTRY_UAE 971 +#define CTRY_UKRAINE 380 +#define CTRY_UNITED_KINGDOM 44 +#define CTRY_UNITED_STATES 1 +#define CTRY_URUGUAY 598 +#define CTRY_UZBEKISTAN 7 +#define CTRY_VENEZUELA 58 +#define CTRY_VIET_NAM 84 +#define CTRY_YEMEN 967 +#define CTRY_ZIMBABWE 263 +#define CAL_ICALINTVALUE 1 +#define CAL_SCALNAME 2 +#define CAL_IYEAROFFSETRANGE 3 +#define CAL_SERASTRING 4 +#define CAL_SSHORTDATE 5 +#define CAL_SLONGDATE 6 +#define CAL_SDAYNAME1 7 +#define CAL_SDAYNAME2 8 +#define CAL_SDAYNAME3 9 +#define CAL_SDAYNAME4 10 +#define CAL_SDAYNAME5 11 +#define CAL_SDAYNAME6 12 +#define CAL_SDAYNAME7 13 +#define CAL_SABBREVDAYNAME1 14 +#define CAL_SABBREVDAYNAME2 15 +#define CAL_SABBREVDAYNAME3 16 +#define CAL_SABBREVDAYNAME4 17 +#define CAL_SABBREVDAYNAME5 18 +#define CAL_SABBREVDAYNAME6 19 +#define CAL_SABBREVDAYNAME7 20 +#define CAL_SMONTHNAME1 21 +#define CAL_SMONTHNAME2 22 +#define CAL_SMONTHNAME3 23 +#define CAL_SMONTHNAME4 24 +#define CAL_SMONTHNAME5 25 +#define CAL_SMONTHNAME6 26 +#define CAL_SMONTHNAME7 27 +#define CAL_SMONTHNAME8 28 +#define CAL_SMONTHNAME9 29 +#define CAL_SMONTHNAME10 30 +#define CAL_SMONTHNAME11 31 +#define CAL_SMONTHNAME12 32 +#define CAL_SMONTHNAME13 33 +#define CAL_SABBREVMONTHNAME1 34 +#define CAL_SABBREVMONTHNAME2 35 +#define CAL_SABBREVMONTHNAME3 36 +#define CAL_SABBREVMONTHNAME4 37 +#define CAL_SABBREVMONTHNAME5 38 +#define CAL_SABBREVMONTHNAME6 39 +#define CAL_SABBREVMONTHNAME7 40 +#define CAL_SABBREVMONTHNAME8 41 +#define CAL_SABBREVMONTHNAME9 42 +#define CAL_SABBREVMONTHNAME10 43 +#define CAL_SABBREVMONTHNAME11 44 +#define CAL_SABBREVMONTHNAME12 45 +#define CAL_SABBREVMONTHNAME13 46 +#define CAL_GREGORIAN 1 +#define CAL_GREGORIAN_US 2 +#define CAL_JAPAN 3 +#define CAL_TAIWAN 4 +#define CAL_KOREA 5 +#define CAL_HIJRI 6 +#define CAL_THAI 7 +#define CAL_HEBREW 8 +#define CAL_GREGORIAN_ME_FRENCH 9 +#define CAL_GREGORIAN_ARABIC 10 +#define CAL_GREGORIAN_XLIT_ENGLISH 11 +#define CAL_GREGORIAN_XLIT_FRENCH 12 +#define CSTR_LESS_THAN 1 +#define CSTR_EQUAL 2 +#define CSTR_GREATER_THAN 3 +#define LGRPID_INSTALLED 1 +#define LGRPID_SUPPORTED 2 +#define LGRPID_WESTERN_EUROPE 1 +#define LGRPID_CENTRAL_EUROPE 2 +#define LGRPID_BALTIC 3 +#define LGRPID_GREEK 4 +#define LGRPID_CYRILLIC 5 +#define LGRPID_TURKISH 6 +#define LGRPID_JAPANESE 7 +#define LGRPID_KOREAN 8 +#define LGRPID_TRADITIONAL_CHINESE 9 +#define LGRPID_SIMPLIFIED_CHINESE 10 +#define LGRPID_THAI 11 +#define LGRPID_HEBREW 12 +#define LGRPID_ARABIC 13 +#define LGRPID_VIETNAMESE 14 +#define LGRPID_INDIC 15 +#define LGRPID_GEORGIAN 16 +#define LGRPID_ARMENIAN 17 + +#if (WINVER >= 0x0500) +#define LOCALE_SYEARMONTH 0x1006 +#define LOCALE_SENGCURRNAME 0x1007 +#define LOCALE_SNATIVECURRNAME 0x1008 +#define LOCALE_IDEFAULTEBCDICCODEPAGE 0x1012 +#define LOCALE_SSORTNAME 0x1013 +#define LOCALE_IDIGITSUBSTITUTION 0x1014 +#define LOCALE_IPAPERSIZE 0x100A +#define DATE_YEARMONTH 8 +#define DATE_LTRREADING 16 +#define DATE_RTLREADING 32 +#define MAP_EXPAND_LIGATURES 0x2000 +#define WC_NO_BEST_FIT_CHARS 1024 +#define CAL_SYEARMONTH 47 +#define CAL_ITWODIGITYEARMAX 48 +#define CAL_NOUSEROVERRIDE LOCALE_NOUSEROVERRIDE +#define CAL_RETURN_NUMBER LOCALE_RETURN_NUMBER +#define CAL_USE_CP_ACP LOCALE_USE_CP_ACP +#endif /* (WINVER >= 0x0500) */ +#ifndef _BASETSD_H +typedef long LONG_PTR; +#endif + +#ifndef RC_INVOKED +typedef DWORD LCTYPE; +typedef DWORD CALTYPE; +typedef DWORD CALID; +typedef DWORD LGRPID; +typedef DWORD GEOID; +typedef DWORD GEOTYPE; +typedef DWORD GEOCLASS; +typedef BOOL (CALLBACK *CALINFO_ENUMPROCA)(LPSTR); +typedef BOOL (CALLBACK *CALINFO_ENUMPROCW)(LPWSTR); +typedef BOOL (CALLBACK *CALINFO_ENUMPROCEXA)(LPSTR, CALID); +typedef BOOL (CALLBACK *CALINFO_ENUMPROCEXW)(LPWSTR, CALID); +typedef BOOL (CALLBACK *LANGUAGEGROUP_ENUMPROCA)(LGRPID, LPSTR, LPSTR, DWORD, LONG_PTR); +typedef BOOL (CALLBACK *LANGUAGEGROUP_ENUMPROCW)(LGRPID, LPWSTR, LPWSTR, DWORD, LONG_PTR); +typedef BOOL (CALLBACK *LANGGROUPLOCALE_ENUMPROCA)(LGRPID, LCID, LPSTR, LONG_PTR); +typedef BOOL (CALLBACK *LANGGROUPLOCALE_ENUMPROCW)(LGRPID, LCID, LPWSTR, LONG_PTR); +typedef BOOL (CALLBACK *UILANGUAGE_ENUMPROCW)(LPWSTR, LONG_PTR); +typedef BOOL (CALLBACK *UILANGUAGE_ENUMPROCA)(LPSTR, LONG_PTR); +typedef BOOL (CALLBACK *LOCALE_ENUMPROCA)(LPSTR); +typedef BOOL (CALLBACK *LOCALE_ENUMPROCW)(LPWSTR); +typedef BOOL (CALLBACK *CODEPAGE_ENUMPROCA)(LPSTR); +typedef BOOL (CALLBACK *CODEPAGE_ENUMPROCW)(LPWSTR); +typedef BOOL (CALLBACK *DATEFMT_ENUMPROCA)(LPSTR); +typedef BOOL (CALLBACK *DATEFMT_ENUMPROCW)(LPWSTR); +typedef BOOL (CALLBACK *DATEFMT_ENUMPROCEXA)(LPSTR, CALID); +typedef BOOL (CALLBACK *DATEFMT_ENUMPROCEXW)(LPWSTR, CALID); +typedef BOOL (CALLBACK *TIMEFMT_ENUMPROCA)(LPSTR); +typedef BOOL (CALLBACK *TIMEFMT_ENUMPROCW)(LPWSTR); +typedef BOOL (CALLBACK *GEO_ENUMPROC)(GEOID); + +enum NLS_FUNCTION { + COMPARE_STRING = 0x0001 +}; +typedef enum NLS_FUNCTION NLS_FUNCTION; +enum SYSGEOCLASS { + GEOCLASS_NATION = 16, + GEOCLASS_REGION = 14 +}; +enum SYSGEOTYPE { + GEO_NATION = 0x0001, + GEO_LATITUDE = 0x0002, + GEO_LONGITUDE = 0x0003, + GEO_ISO2 = 0x0004, + GEO_ISO3 = 0x0005, + GEO_RFC1766 = 0x0006, + GEO_LCID = 0x0007, + GEO_FRIENDLYNAME = 0x0008, + GEO_OFFICIALNAME = 0x0009, + GEO_TIMEZONES = 0x000a, + GEO_OFFICIALLANGUAGES = 0x000a +}; + +typedef struct _cpinfo { + UINT MaxCharSize; + BYTE DefaultChar[MAX_DEFAULTCHAR]; + BYTE LeadByte[MAX_LEADBYTES]; +} CPINFO,*LPCPINFO; +typedef struct _cpinfoexA { + UINT MaxCharSize; + BYTE DefaultChar[MAX_DEFAULTCHAR]; + BYTE LeadByte[MAX_LEADBYTES]; + WCHAR UnicodeDefaultChar; + UINT CodePage; + CHAR CodePageName[MAX_PATH]; +} CPINFOEXA,*LPCPINFOEXA; +typedef struct _cpinfoexW { + UINT MaxCharSize; + BYTE DefaultChar[MAX_DEFAULTCHAR]; + BYTE LeadByte[MAX_LEADBYTES]; + WCHAR UnicodeDefaultChar; + UINT CodePage; + WCHAR CodePageName[MAX_PATH]; +} CPINFOEXW,*LPCPINFOEXW; +typedef struct _currencyfmtA { + UINT NumDigits; + UINT LeadingZero; + UINT Grouping; + LPSTR lpDecimalSep; + LPSTR lpThousandSep; + UINT NegativeOrder; + UINT PositiveOrder; + LPSTR lpCurrencySymbol; +} CURRENCYFMTA,*LPCURRENCYFMTA; +typedef struct _currencyfmtW { + UINT NumDigits; + UINT LeadingZero; + UINT Grouping; + LPWSTR lpDecimalSep; + LPWSTR lpThousandSep; + UINT NegativeOrder; + UINT PositiveOrder; + LPWSTR lpCurrencySymbol; +} CURRENCYFMTW,*LPCURRENCYFMTW; +typedef struct nlsversioninfo { + DWORD dwNLSVersionInfoSize; + DWORD dwNLSVersion; + DWORD dwDefinedVersion; +} NLSVERSIONINFO,*LPNLSVERSIONINFO; +typedef struct _numberfmtA { + UINT NumDigits; + UINT LeadingZero; + UINT Grouping; + LPSTR lpDecimalSep; + LPSTR lpThousandSep; + UINT NegativeOrder; +} NUMBERFMTA,*LPNUMBERFMTA; +typedef struct _numberfmtW { + UINT NumDigits; + UINT LeadingZero; + UINT Grouping; + LPWSTR lpDecimalSep; + LPWSTR lpThousandSep; + UINT NegativeOrder; +} NUMBERFMTW,*LPNUMBERFMTW; + +int WINAPI CompareStringA(LCID,DWORD,LPCSTR,int,LPCSTR,int); +int WINAPI CompareStringW(LCID,DWORD,LPCWSTR,int,LPCWSTR,int); +LCID WINAPI ConvertDefaultLocale(LCID); +BOOL WINAPI EnumCalendarInfoA(CALINFO_ENUMPROCA,LCID,CALID,CALTYPE); +BOOL WINAPI EnumCalendarInfoW(CALINFO_ENUMPROCW,LCID,CALID,CALTYPE); +BOOL WINAPI EnumDateFormatsA(DATEFMT_ENUMPROCA,LCID,DWORD); +BOOL WINAPI EnumDateFormatsW(DATEFMT_ENUMPROCW,LCID,DWORD); +BOOL WINAPI EnumSystemCodePagesA(CODEPAGE_ENUMPROCA,DWORD); +BOOL WINAPI EnumSystemCodePagesW(CODEPAGE_ENUMPROCW,DWORD); +BOOL WINAPI EnumSystemGeoID(GEOCLASS,GEOID,GEO_ENUMPROC); +BOOL WINAPI EnumSystemLocalesA(LOCALE_ENUMPROCA,DWORD); +BOOL WINAPI EnumSystemLocalesW(LOCALE_ENUMPROCW,DWORD); +BOOL WINAPI EnumTimeFormatsA(TIMEFMT_ENUMPROCA,LCID,DWORD); +BOOL WINAPI EnumTimeFormatsW(TIMEFMT_ENUMPROCW,LCID,DWORD); +int WINAPI FoldStringA(DWORD,LPCSTR,int,LPSTR,int); +int WINAPI FoldStringW(DWORD,LPCWSTR,int,LPWSTR,int); +UINT WINAPI GetACP(void); +int WINAPI GetCalendarInfoA(LCID,CALID,CALTYPE,LPSTR,int,LPDWORD); +int WINAPI GetCalendarInfoW(LCID,CALID,CALTYPE,LPWSTR,int,LPDWORD); +BOOL WINAPI GetCPInfo(UINT,LPCPINFO); +BOOL WINAPI GetCPInfoExA(UINT,DWORD,LPCPINFOEXA); +BOOL WINAPI GetCPInfoExW(UINT,DWORD,LPCPINFOEXW); +int WINAPI GetCurrencyFormatA(LCID,DWORD,LPCSTR,const CURRENCYFMTA*,LPSTR,int); +int WINAPI GetCurrencyFormatW(LCID,DWORD,LPCWSTR,const CURRENCYFMTW*,LPWSTR,int); +int WINAPI GetDateFormatA(LCID,DWORD,const SYSTEMTIME*,LPCSTR,LPSTR,int); +int WINAPI GetDateFormatW(LCID,DWORD,const SYSTEMTIME*,LPCWSTR,LPWSTR,int); +int WINAPI GetGeoInfoA(GEOID,GEOTYPE,LPSTR,int,LANGID); +int WINAPI GetGeoInfoW(GEOID,GEOTYPE,LPWSTR,int,LANGID); +int WINAPI GetLocaleInfoA(LCID,LCTYPE,LPSTR,int); +int WINAPI GetLocaleInfoW(LCID,LCTYPE,LPWSTR,int); +BOOL WINAPI GetNLSVersion(NLS_FUNCTION,LCID,LPNLSVERSIONINFO); +int WINAPI GetNumberFormatA(LCID,DWORD,LPCSTR,const NUMBERFMTA*,LPSTR,int); +int WINAPI GetNumberFormatW(LCID,DWORD,LPCWSTR,const NUMBERFMTW*,LPWSTR,int); +UINT WINAPI GetOEMCP(void); +BOOL WINAPI GetStringTypeA(LCID,DWORD,LPCSTR,int,LPWORD); +BOOL WINAPI GetStringTypeW(DWORD,LPCWSTR,int,LPWORD); +BOOL WINAPI GetStringTypeExA(LCID,DWORD,LPCSTR,int,LPWORD); +BOOL WINAPI GetStringTypeExW(LCID,DWORD,LPCWSTR,int,LPWORD); +LANGID WINAPI GetSystemDefaultLangID(void); +LCID WINAPI GetSystemDefaultLCID(void); +LCID WINAPI GetThreadLocale(void); +int WINAPI GetTimeFormatA(LCID,DWORD,const SYSTEMTIME*,LPCSTR,LPSTR,int); +int WINAPI GetTimeFormatW(LCID,DWORD,const SYSTEMTIME*,LPCWSTR,LPWSTR,int); +LANGID WINAPI GetUserDefaultLangID(void); +LCID WINAPI GetUserDefaultLCID(void); +GEOID WINAPI GetUserGeoID(GEOCLASS); +BOOL WINAPI IsDBCSLeadByte(BYTE); +BOOL WINAPI IsDBCSLeadByteEx(UINT,BYTE); +BOOL WINAPI IsNLSDefinedString(NLS_FUNCTION,DWORD,LPNLSVERSIONINFO,LPCWSTR,int); +BOOL WINAPI IsValidCodePage(UINT); +BOOL WINAPI IsValidLocale(LCID,DWORD); +int WINAPI LCMapStringA(LCID,DWORD,LPCSTR,int,LPSTR,int); +int WINAPI LCMapStringW(LCID,DWORD,LPCWSTR,int,LPWSTR,int); +int WINAPI MultiByteToWideChar(UINT,DWORD,LPCSTR,int,LPWSTR,int); +int WINAPI SetCalendarInfoA(LCID,CALID,CALTYPE,LPCSTR); +int WINAPI SetCalendarInfoW(LCID,CALID,CALTYPE,LPCWSTR); +BOOL WINAPI SetLocaleInfoA(LCID,LCTYPE,LPCSTR); +BOOL WINAPI SetLocaleInfoW(LCID,LCTYPE,LPCWSTR); +BOOL WINAPI SetThreadLocale(LCID); +BOOL WINAPI SetUserGeoID(GEOID); +int WINAPI WideCharToMultiByte(UINT,DWORD,LPCWSTR,int,LPSTR,int,LPCSTR,LPBOOL); +#if (WINVER >= 0x0500) +BOOL WINAPI EnumCalendarInfoExA(CALINFO_ENUMPROCEXA,LCID,CALID,CALTYPE); +BOOL WINAPI EnumCalendarInfoExW(CALINFO_ENUMPROCEXW,LCID,CALID,CALTYPE); +BOOL WINAPI EnumDateFormatsExA(DATEFMT_ENUMPROCEXA,LCID,DWORD); +BOOL WINAPI EnumDateFormatsExW(DATEFMT_ENUMPROCEXW,LCID,DWORD); +BOOL WINAPI EnumSystemLanguageGroupsA(LANGUAGEGROUP_ENUMPROCA,DWORD,LONG_PTR); +BOOL WINAPI EnumSystemLanguageGroupsW(LANGUAGEGROUP_ENUMPROCW,DWORD,LONG_PTR); +BOOL WINAPI EnumLanguageGroupLocalesA(LANGGROUPLOCALE_ENUMPROCA,LGRPID,DWORD,LONG_PTR); +BOOL WINAPI EnumLanguageGroupLocalesW(LANGGROUPLOCALE_ENUMPROCW,LGRPID,DWORD,LONG_PTR); +BOOL WINAPI EnumUILanguagesA(UILANGUAGE_ENUMPROCA,DWORD,LONG_PTR); +BOOL WINAPI EnumUILanguagesW(UILANGUAGE_ENUMPROCW,DWORD,LONG_PTR); +LANGID WINAPI GetSystemDefaultUILanguage(void); +LANGID WINAPI GetUserDefaultUILanguage(void); +BOOL WINAPI IsValidLanguageGroup(LGRPID,DWORD); +#endif /* (WINVER >= 0x0500) */ + +#ifdef UNICODE +#define CALINFO_ENUMPROC CALINFO_ENUMPROCW +#define CALINFO_ENUMPROCEX CALINFO_ENUMPROCEXW +#define LOCALE_ENUMPROC LOCALE_ENUMPROCW +#define CODEPAGE_ENUMPROC CODEPAGE_ENUMPROCW +#define DATEFMT_ENUMPROC DATEFMT_ENUMPROCW +#define DATEFMT_ENUMPROCEX DATEFMT_ENUMPROCEXW +#define TIMEFMT_ENUMPROC TIMEFMT_ENUMPROCW +#define LANGUAGEGROUP_ENUMPROC LANGUAGEGROUP_ENUMPROCW +#define LANGGROUPLOCALE_ENUMPROC LANGGROUPLOCALE_ENUMPROCW +#define UILANGUAGE_ENUMPROC UILANGUAGE_ENUMPROCW +typedef CPINFOEXW CPINFOEX; +typedef LPCPINFOEXW LPCPINFOEX; +typedef CURRENCYFMTW CURRENCYFMT; +typedef LPCURRENCYFMTW LPCURRENCYFMT; +typedef NUMBERFMTW NUMBERFMT; +typedef LPNUMBERFMTW LPNUMBERFMT; +#define CompareString CompareStringW +#define EnumCalendarInfo EnumCalendarInfoW +#define EnumSystemCodePages EnumSystemCodePagesW +#define EnumSystemLocales EnumSystemLocalesW +#define EnumTimeFormats EnumTimeFormatsW +#define FoldString FoldStringW +#define GetCalendarInfo GetCalendarInfoW +#define GetCPInfoEx GetCPInfoExW +#define GetCurrencyFormat GetCurrencyFormatW +#define GetDateFormat GetDateFormatW +#define GetGeoInfo GetGeoInfoW +#define GetLocaleInfo GetLocaleInfoW +#define GetNumberFormat GetNumberFormatW +#define GetStringTypeEx GetStringTypeExW +#define GetTimeFormat GetTimeFormatW +#define LCMapString LCMapStringW +#define SetCalendarInfo SetCalendarInfoW +#define SetLocaleInfo SetLocaleInfoW +#if (WINVER >= 0x0500) +#define EnumCalendarInfoEx EnumCalendarInfoExW; +#define EnumDateFormatsEx EnumDateFormatsExW; +#define EnumSystemLanguageGroups EnumSystemLanguageGroupsW; +#define EnumLanguageGroupLocales EnumLanguageGroupLocalesW; +#define EnumUILanguages EnumUILanguagesW; +#endif /* (WINVER >= 0x0500) */ +#else +#define CALINFO_ENUMPROC CALINFO_ENUMPROCA +#define CALINFO_ENUMPROCEX CALINFO_ENUMPROCEXA +#define LOCALE_ENUMPROC LOCALE_ENUMPROCA +#define CODEPAGE_ENUMPROC CODEPAGE_ENUMPROCA +#define DATEFMT_ENUMPROC DATEFMT_ENUMPROCA +#define DATEFMT_ENUMPROCEX DATEFMT_ENUMPROCEXA +#define TIMEFMT_ENUMPROC TIMEFMT_ENUMPROCA +#define LANGUAGEGROUP_ENUMPROC LANGUAGEGROUP_ENUMPROCA +#define LANGGROUPLOCALE_ENUMPROC LANGGROUPLOCALE_ENUMPROCA +#define UILANGUAGE_ENUMPROC UILANGUAGE_ENUMPROCA +typedef CPINFOEXA CPINFOEX; +typedef LPCPINFOEXA LPCPINFOEX; +typedef CURRENCYFMTA CURRENCYFMT; +typedef LPCURRENCYFMTA LPCURRENCYFMT; +typedef NUMBERFMTA NUMBERFMT; +typedef LPNUMBERFMTA LPNUMBERFMT; +#define CompareString CompareStringA +#define EnumCalendarInfo EnumCalendarInfoA +#define EnumSystemCodePages EnumSystemCodePagesA +#define EnumSystemLocales EnumSystemLocalesA +#define EnumTimeFormats EnumTimeFormatsA +#define FoldString FoldStringA +#define GetCalendarInfo GetCalendarInfoA +#define GetCPInfoEx GetCPInfoExA +#define GetCurrencyFormat GetCurrencyFormatA +#define GetDateFormat GetDateFormatA +#define GetGeoInfo GetGeoInfoA +#define GetLocaleInfo GetLocaleInfoA +#define GetNumberFormat GetNumberFormatA +#define GetStringTypeEx GetStringTypeExA +#define GetTimeFormat GetTimeFormatA +#define LCMapString LCMapStringA +#define SetCalendarInfo SetCalendarInfoA +#define SetLocaleInfo SetLocaleInfoA +#if (WINVER >= 0x0500) +#define EnumCalendarInfoEx EnumCalendarInfoExA; +#define EnumDateFormatsEx EnumDateFormatsExA; +#define EnumSystemLanguageGroups EnumSystemLanguageGroupsA; +#define EnumLanguageGroupLocales EnumLanguageGroupLocalesA; +#define EnumUILanguages EnumUILanguagesA; +#endif /* (WINVER >= 0x0500) */ +#endif /* UNICODE */ +#endif /* RC_INVOKED */ +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/winnt.h b/reactos/w32api/include/winnt.h new file mode 100644 index 00000000000..3cfa2667a61 --- /dev/null +++ b/reactos/w32api/include/winnt.h @@ -0,0 +1,3341 @@ +#ifndef _WINNT_H +#define _WINNT_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +/* translate GCC target defines to MS equivalents. Keep this synchronized + with windows.h. */ +#if defined(__i686__) && !defined(_M_IX86) +#define _M_IX86 600 +#elif defined(__i586__) && !defined(_M_IX86) +#define _M_IX86 500 +#elif defined(__i486__) && !defined(_M_IX86) +#define _M_IX86 400 +#elif defined(__i386__) && !defined(_M_IX86) +#define _M_IX86 300 +#endif +#if defined(_M_IX86) && !defined(_X86_) +#define _X86_ +#elif defined(_M_ALPHA) && !defined(_ALPHA_) +#define _ALPHA_ +#elif defined(_M_PPC) && !defined(_PPC_) +#define _PPC_ +#elif defined(_M_MRX000) && !defined(_MIPS_) +#define _MIPS_ +#elif defined(_M_M68K) && !defined(_68K_) +#define _68K_ +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#include <winerror.h> + +#ifndef RC_INVOKED +#include <string.h> + +/* FIXME: add more architectures. Is there a way to specify this in GCC? */ +#ifdef _X86_ +#define UNALIGNED +#else +#define UNALIGNED +#endif + +#ifndef VOID +#define VOID void +#endif +typedef char CHAR; +typedef short SHORT; +typedef long LONG; +typedef char CCHAR, *PCCHAR; +typedef unsigned char UCHAR,*PUCHAR; +typedef unsigned short USHORT,*PUSHORT; +typedef unsigned long ULONG,*PULONG; +typedef char *PSZ; + +typedef void *PVOID,*LPVOID; + +/* FIXME for __WIN64 */ +#ifndef __ptr64 +#define __ptr64 +#endif +typedef void* __ptr64 PVOID64; + +#ifndef _WCHAR_T_DEFINED +#define _WCHAR_T_DEFINED +#ifndef _WCHAR_T_ +#define _WCHAR_T_ +#undef __need_wchar_t +#ifndef __cplusplus +typedef unsigned short wchar_t; +#endif +#endif +#endif + +typedef wchar_t WCHAR; +typedef WCHAR *PWCHAR,*LPWCH,*PWCH,*NWPSTR,*LPWSTR,*PWSTR; +typedef CONST WCHAR *LPCWCH,*PCWCH,*LPCWSTR,*PCWSTR; +typedef CHAR *PCHAR,*LPCH,*PCH,*NPSTR,*LPSTR,*PSTR; +typedef CONST CHAR *LPCCH,*PCSTR,*LPCSTR; +#ifndef _TCHAR_DEFINED +#define _TCHAR_DEFINED +#ifdef UNICODE +/* + * NOTE: This tests UNICODE, which is different from the _UNICODE define + * used to differentiate standard C runtime calls. + */ +typedef WCHAR TCHAR; +typedef WCHAR _TCHAR; +#else +typedef CHAR TCHAR; +typedef CHAR _TCHAR; +#endif +#endif +typedef TCHAR TBYTE,*PTCH,*PTBYTE; +typedef TCHAR *LPTCH,*PTSTR,*LPTSTR,*LP,*PTCHAR; +typedef const TCHAR *LPCTSTR; +#ifdef UNICODE +/* + * __TEXT is a private macro whose specific use is to force the expansion of a + * macro passed as an argument to the macro TEXT. DO NOT use this + * macro within your programs. It's name and function could change without + * notice. + */ +#define __TEXT(q) L##q +#else +#define __TEXT(q) q +#endif +/* + * UNICODE a constant string when UNICODE is defined, else returns the string + * unmodified. + * The corresponding macros _TEXT() and _T() for mapping _UNICODE strings + * passed to C runtime functions are defined in mingw/tchar.h + */ +#define TEXT(q) __TEXT(q) +typedef SHORT *PSHORT; +typedef LONG *PLONG; +#ifdef STRICT +typedef void *HANDLE; +#define DECLARE_HANDLE(n) typedef struct n##__{int i;}*n +#else +typedef PVOID HANDLE; +#define DECLARE_HANDLE(n) typedef HANDLE n +#endif +typedef HANDLE *PHANDLE,*LPHANDLE; +typedef DWORD LCID; +typedef PDWORD PLCID; +typedef WORD LANGID; +#ifdef __GNUC__ +#define _HAVE_INT64 +#define _INTEGRAL_MAX_BITS 64 +#undef __int64 +#define __int64 long long +#elif defined(__WATCOMC__) && (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 64 ) +#define _HAVE_INT64 +#endif /* __GNUC__/__WATCOMC */ +#if defined(_HAVE_INT64) || (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 64) +typedef __int64 LONGLONG; +typedef unsigned __int64 DWORDLONG; +#else +typedef double LONGLONG,DWORDLONG; +#endif +typedef LONGLONG *PLONGLONG; +typedef DWORDLONG *PDWORDLONG; +typedef DWORDLONG ULONGLONG,*PULONGLONG; +typedef LONGLONG USN; +#ifdef _HAVE_INT64 +#define Int32x32To64(a,b) ((LONGLONG)(a)*(LONGLONG)(b)) +#define UInt32x32To64(a,b) ((DWORDLONG)(a)*(DWORDLONG)(b)) +#define Int64ShllMod32(a,b) ((DWORDLONG)(a)<<(b)) +#define Int64ShraMod32(a,b) ((LONGLONG)(a)>>(b)) +#define Int64ShrlMod32(a,b) ((DWORDLONG)(a)>>(b)) +#endif +#define ANSI_NULL '\0' +#define UNICODE_NULL L'\0' +typedef BYTE BOOLEAN,*PBOOLEAN; +#endif +typedef BYTE FCHAR; +typedef WORD FSHORT; +typedef DWORD FLONG; + +#define NTAPI __stdcall +#include <basetsd.h> +#define ACE_OBJECT_TYPE_PRESENT 0x00000001 +#define ACE_INHERITED_OBJECT_TYPE_PRESENT 0x00000002 +#define APPLICATION_ERROR_MASK 0x20000000 +#define ERROR_SEVERITY_SUCCESS 0x00000000 +#define ERROR_SEVERITY_INFORMATIONAL 0x40000000 +#define ERROR_SEVERITY_WARNING 0x80000000 +#define ERROR_SEVERITY_ERROR 0xC0000000 +/* also in ddk/ntifs.h */ +#define COMPRESSION_FORMAT_NONE (0x0000) +#define COMPRESSION_FORMAT_DEFAULT (0x0001) +#define COMPRESSION_FORMAT_LZNT1 (0x0002) +#define COMPRESSION_ENGINE_STANDARD (0x0000) +#define COMPRESSION_ENGINE_MAXIMUM (0x0100) +#define COMPRESSION_ENGINE_HIBER (0x0200) +#define ACCESS_ALLOWED_ACE_TYPE (0x0) +#define ACCESS_DENIED_ACE_TYPE (0x1) +#define SYSTEM_AUDIT_ACE_TYPE (0x2) +#define SYSTEM_ALARM_ACE_TYPE (0x3) +/*end ntifs.h */ +#define ANYSIZE_ARRAY 1 +#define OBJECT_INHERIT_ACE 1 +#define CONTAINER_INHERIT_ACE 2 +#define NO_PROPAGATE_INHERIT_ACE 4 +#define INHERIT_ONLY_ACE 8 +#define VALID_INHERIT_FLAGS 16 +#define SUCCESSFUL_ACCESS_ACE_FLAG 64 +#define FAILED_ACCESS_ACE_FLAG 128 +#define DELETE 0x00010000L +#define READ_CONTROL 0x20000L +#define WRITE_DAC 0x40000L +#define WRITE_OWNER 0x80000L +#define SYNCHRONIZE 0x100000L +#define STANDARD_RIGHTS_REQUIRED 0xF0000 +#define STANDARD_RIGHTS_READ 0x20000 +#define STANDARD_RIGHTS_WRITE 0x20000 +#define STANDARD_RIGHTS_EXECUTE 0x20000 +#define STANDARD_RIGHTS_ALL 0x1F0000 +#define SPECIFIC_RIGHTS_ALL 0xFFFF +#define ACCESS_SYSTEM_SECURITY 0x1000000 + +#define MAXIMUM_ALLOWED 0x2000000 +#define GENERIC_READ 0x80000000 +#define GENERIC_WRITE 0x40000000 +#define GENERIC_EXECUTE 0x20000000 +#define GENERIC_ALL 0x10000000 + +#define INVALID_FILE_ATTRIBUTES ((DWORD)-1) + +/* Also in ddk/winddk.h */ +#define FILE_LIST_DIRECTORY 0x00000001 +#define FILE_READ_DATA 0x00000001 +#define FILE_ADD_FILE 0x00000002 +#define FILE_WRITE_DATA 0x00000002 +#define FILE_ADD_SUBDIRECTORY 0x00000004 +#define FILE_APPEND_DATA 0x00000004 +#define FILE_CREATE_PIPE_INSTANCE 0x00000004 +#define FILE_READ_EA 0x00000008 +#define FILE_READ_PROPERTIES 0x00000008 +#define FILE_WRITE_EA 0x00000010 +#define FILE_WRITE_PROPERTIES 0x00000010 +#define FILE_EXECUTE 0x00000020 +#define FILE_TRAVERSE 0x00000020 +#define FILE_DELETE_CHILD 0x00000040 +#define FILE_READ_ATTRIBUTES 0x00000080 +#define FILE_WRITE_ATTRIBUTES 0x00000100 + +#define FILE_SHARE_READ 0x00000001 +#define FILE_SHARE_WRITE 0x00000002 +#define FILE_SHARE_DELETE 0x00000004 +#define FILE_SHARE_VALID_FLAGS 0x00000007 + +#define FILE_ATTRIBUTE_READONLY 0x00000001 +#define FILE_ATTRIBUTE_HIDDEN 0x00000002 +#define FILE_ATTRIBUTE_SYSTEM 0x00000004 +#define FILE_ATTRIBUTE_DIRECTORY 0x00000010 +#define FILE_ATTRIBUTE_ARCHIVE 0x00000020 +#define FILE_ATTRIBUTE_DEVICE 0x00000040 +#define FILE_ATTRIBUTE_NORMAL 0x00000080 +#define FILE_ATTRIBUTE_TEMPORARY 0x00000100 +#define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200 +#define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400 +#define FILE_ATTRIBUTE_COMPRESSED 0x00000800 +#define FILE_ATTRIBUTE_OFFLINE 0x00001000 +#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000 +#define FILE_ATTRIBUTE_ENCRYPTED 0x00004000 +#define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7 +#define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7 + +#define FILE_COPY_STRUCTURED_STORAGE 0x00000041 +#define FILE_STRUCTURED_STORAGE 0x00000441 + +#define FILE_VALID_OPTION_FLAGS 0x00ffffff +#define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032 +#define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032 +#define FILE_VALID_SET_FLAGS 0x00000036 + +#define FILE_SUPERSEDE 0x00000000 +#define FILE_OPEN 0x00000001 +#define FILE_CREATE 0x00000002 +#define FILE_OPEN_IF 0x00000003 +#define FILE_OVERWRITE 0x00000004 +#define FILE_OVERWRITE_IF 0x00000005 +#define FILE_MAXIMUM_DISPOSITION 0x00000005 + +#define FILE_DIRECTORY_FILE 0x00000001 +#define FILE_WRITE_THROUGH 0x00000002 +#define FILE_SEQUENTIAL_ONLY 0x00000004 +#define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008 +#define FILE_SYNCHRONOUS_IO_ALERT 0x00000010 +#define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020 +#define FILE_NON_DIRECTORY_FILE 0x00000040 +#define FILE_CREATE_TREE_CONNECTION 0x00000080 +#define FILE_COMPLETE_IF_OPLOCKED 0x00000100 +#define FILE_NO_EA_KNOWLEDGE 0x00000200 +#define FILE_OPEN_FOR_RECOVERY 0x00000400 +#define FILE_RANDOM_ACCESS 0x00000800 +#define FILE_DELETE_ON_CLOSE 0x00001000 +#define FILE_OPEN_BY_FILE_ID 0x00002000 +#define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000 +#define FILE_NO_COMPRESSION 0x00008000 +#define FILE_RESERVE_OPFILTER 0x00100000 +#define FILE_OPEN_REPARSE_POINT 0x00200000 +#define FILE_OPEN_NO_RECALL 0x00400000 +#define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000 + +#define FILE_ALL_ACCESS \ + (STANDARD_RIGHTS_REQUIRED | \ + SYNCHRONIZE | \ + 0x1FF) + +#define FILE_GENERIC_EXECUTE \ + (STANDARD_RIGHTS_EXECUTE | \ + FILE_READ_ATTRIBUTES | \ + FILE_EXECUTE | \ + SYNCHRONIZE) + +#define FILE_GENERIC_READ \ + (STANDARD_RIGHTS_READ | \ + FILE_READ_DATA | \ + FILE_READ_ATTRIBUTES | \ + FILE_READ_EA | \ + SYNCHRONIZE) + +#define FILE_GENERIC_WRITE \ + (STANDARD_RIGHTS_WRITE | \ + FILE_WRITE_DATA | \ + FILE_WRITE_ATTRIBUTES | \ + FILE_WRITE_EA | \ + FILE_APPEND_DATA | \ + SYNCHRONIZE) +/* end winddk.h */ +/* also in ddk/ntifs.h */ +#define FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001 +#define FILE_NOTIFY_CHANGE_DIR_NAME 0x00000002 +#define FILE_NOTIFY_CHANGE_NAME 0x00000003 +#define FILE_NOTIFY_CHANGE_ATTRIBUTES 0x00000004 +#define FILE_NOTIFY_CHANGE_SIZE 0x00000008 +#define FILE_NOTIFY_CHANGE_LAST_WRITE 0x00000010 +#define FILE_NOTIFY_CHANGE_LAST_ACCESS 0x00000020 +#define FILE_NOTIFY_CHANGE_CREATION 0x00000040 +#define FILE_NOTIFY_CHANGE_EA 0x00000080 +#define FILE_NOTIFY_CHANGE_SECURITY 0x00000100 +#define FILE_NOTIFY_CHANGE_STREAM_NAME 0x00000200 +#define FILE_NOTIFY_CHANGE_STREAM_SIZE 0x00000400 +#define FILE_NOTIFY_CHANGE_STREAM_WRITE 0x00000800 +#define FILE_NOTIFY_VALID_MASK 0x00000fff + +#define FILE_CASE_SENSITIVE_SEARCH 0x00000001 +#define FILE_CASE_PRESERVED_NAMES 0x00000002 +#define FILE_UNICODE_ON_DISK 0x00000004 +#define FILE_PERSISTENT_ACLS 0x00000008 +#define FILE_FILE_COMPRESSION 0x00000010 +#define FILE_VOLUME_QUOTAS 0x00000020 +#define FILE_SUPPORTS_SPARSE_FILES 0x00000040 +#define FILE_SUPPORTS_REPARSE_POINTS 0x00000080 +#define FILE_SUPPORTS_REMOTE_STORAGE 0x00000100 +#define FS_LFN_APIS 0x00004000 +#define FILE_VOLUME_IS_COMPRESSED 0x00008000 +#define FILE_SUPPORTS_OBJECT_IDS 0x00010000 +#define FILE_SUPPORTS_ENCRYPTION 0x00020000 +#define FILE_NAMED_STREAMS 0x00040000 + +#define IO_COMPLETION_QUERY_STATE 0x0001 +#define IO_COMPLETION_MODIFY_STATE 0x0002 +#define IO_COMPLETION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3) +/* end ntifs.h */ + +/* also in ddk/winddk.h */ +#define DUPLICATE_CLOSE_SOURCE 0x00000001 +#define DUPLICATE_SAME_ACCESS 0x00000002 +#define DUPLICATE_SAME_ATTRIBUTES 0x00000004 +/* end winddk.k */ + +#define MAILSLOT_NO_MESSAGE ((DWORD)-1) +#define MAILSLOT_WAIT_FOREVER ((DWORD)-1) +#define PROCESS_TERMINATE 1 +#define PROCESS_CREATE_THREAD 2 +#define PROCESS_SET_SESSIONID 4 +#define PROCESS_VM_OPERATION 8 +#define PROCESS_VM_READ 16 +#define PROCESS_VM_WRITE 32 +#define PROCESS_DUP_HANDLE 64 +#define PROCESS_CREATE_PROCESS 128 +#define PROCESS_SET_QUOTA 256 +#define PROCESS_SET_INFORMATION 512 +#define PROCESS_QUERY_INFORMATION 1024 +#define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0xFFF) +#define THREAD_TERMINATE 1 +#define THREAD_SUSPEND_RESUME 2 +#define THREAD_GET_CONTEXT 8 +#define THREAD_SET_CONTEXT 16 +#define THREAD_SET_INFORMATION 32 +#define THREAD_QUERY_INFORMATION 64 +#define THREAD_SET_THREAD_TOKEN 128 +#define THREAD_IMPERSONATE 256 +#define THREAD_DIRECT_IMPERSONATION 0x200 +#define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3FF) +#define THREAD_BASE_PRIORITY_LOWRT 15 +#define THREAD_BASE_PRIORITY_MAX 2 +#define THREAD_BASE_PRIORITY_MIN (-2) +#define THREAD_BASE_PRIORITY_IDLE (-15) +#define EXCEPTION_NONCONTINUABLE 1 +#define EXCEPTION_MAXIMUM_PARAMETERS 15 +#define MUTANT_QUERY_STATE 0x0001 +#define MUTANT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|MUTANT_QUERY_STATE) +#define TIMER_QUERY_STATE 0x0001 +#define TIMER_MODIFY_STATE 0x0002 +#define TIMER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|TIMER_QUERY_STATE|TIMER_MODIFY_STATE) +/* + * To prevent gcc compiler warnings, bracket these defines when initialising + * a SID_IDENTIFIER_AUTHORITY, eg. + * SID_IDENTIFIER_AUTHORITY aNullSidAuthority = {SECURITY_NULL_SID_AUTHORITY}; + */ +#define SECURITY_NULL_SID_AUTHORITY {0,0,0,0,0,0} +#define SECURITY_WORLD_SID_AUTHORITY {0,0,0,0,0,1} +#define SECURITY_LOCAL_SID_AUTHORITY {0,0,0,0,0,2} +#define SECURITY_CREATOR_SID_AUTHORITY {0,0,0,0,0,3} +#define SECURITY_NON_UNIQUE_AUTHORITY {0,0,0,0,0,4} +#define SECURITY_NT_AUTHORITY {0,0,0,0,0,5} +#define SECURITY_NULL_RID 0 +#define SECURITY_WORLD_RID (0x00000000L) +#define SECURITY_LOCAL_RID 0 +#define SECURITY_CREATOR_OWNER_RID 0 +#define SECURITY_CREATOR_GROUP_RID 1 +#define SECURITY_DIALUP_RID 1 +#define SECURITY_NETWORK_RID 2 +#define SECURITY_BATCH_RID 3 +#define SECURITY_INTERACTIVE_RID 4 +#define SECURITY_LOGON_IDS_RID 5 +#define SECURITY_SERVICE_RID 6 +#define SECURITY_LOCAL_SYSTEM_RID 18 +#define SECURITY_BUILTIN_DOMAIN_RID 32 +#define SECURITY_PRINCIPAL_SELF_RID 10 +#define SECURITY_CREATOR_OWNER_SERVER_RID 0x2 +#define SECURITY_CREATOR_GROUP_SERVER_RID 0x3 +#define SECURITY_LOGON_IDS_RID_COUNT 0x3 +#define SECURITY_ANONYMOUS_LOGON_RID 0x7 +#define SECURITY_PROXY_RID 0x8 +#define SECURITY_ENTERPRISE_CONTROLLERS_RID 0x9 +#define SECURITY_SERVER_LOGON_RID SECURITY_ENTERPRISE_CONTROLLERS_RID +#define SECURITY_AUTHENTICATED_USER_RID 0xB +#define SECURITY_RESTRICTED_CODE_RID 0xC +#define SECURITY_NT_NON_UNIQUE_RID 0x15 +#define SID_REVISION 1 +#define DOMAIN_USER_RID_ADMIN 0x1F4L +#define DOMAIN_USER_RID_GUEST 0x1F5L +#define DOMAIN_GROUP_RID_ADMINS 0x200L +#define DOMAIN_GROUP_RID_USERS 0x201L +#define DOMAIN_ALIAS_RID_ADMINS 0x220L +#define DOMAIN_ALIAS_RID_USERS 0x221L +#define DOMAIN_ALIAS_RID_GUESTS 0x222L +#define DOMAIN_ALIAS_RID_POWER_USERS 0x223L +#define DOMAIN_ALIAS_RID_ACCOUNT_OPS 0x224L +#define DOMAIN_ALIAS_RID_SYSTEM_OPS 0x225L +#define DOMAIN_ALIAS_RID_PRINT_OPS 0x226L +#define DOMAIN_ALIAS_RID_BACKUP_OPS 0x227L +#define DOMAIN_ALIAS_RID_REPLICATOR 0x228L +#define SE_CREATE_TOKEN_NAME TEXT("SeCreateTokenPrivilege") +#define SE_ASSIGNPRIMARYTOKEN_NAME TEXT("SeAssignPrimaryTokenPrivilege") +#define SE_LOCK_MEMORY_NAME TEXT("SeLockMemoryPrivilege") +#define SE_INCREASE_QUOTA_NAME TEXT("SeIncreaseQuotaPrivilege") +#define SE_UNSOLICITED_INPUT_NAME TEXT("SeUnsolicitedInputPrivilege") +#define SE_MACHINE_ACCOUNT_NAME TEXT("SeMachineAccountPrivilege") +#define SE_TCB_NAME TEXT("SeTcbPrivilege") +#define SE_SECURITY_NAME TEXT("SeSecurityPrivilege") +#define SE_TAKE_OWNERSHIP_NAME TEXT("SeTakeOwnershipPrivilege") +#define SE_LOAD_DRIVER_NAME TEXT("SeLoadDriverPrivilege") +#define SE_SYSTEM_PROFILE_NAME TEXT("SeSystemProfilePrivilege") +#define SE_SYSTEMTIME_NAME TEXT("SeSystemtimePrivilege") +#define SE_PROF_SINGLE_PROCESS_NAME TEXT("SeProfileSingleProcessPrivilege") +#define SE_INC_BASE_PRIORITY_NAME TEXT("SeIncreaseBasePriorityPrivilege") +#define SE_CREATE_PAGEFILE_NAME TEXT("SeCreatePagefilePrivilege") +#define SE_CREATE_PERMANENT_NAME TEXT("SeCreatePermanentPrivilege") +#define SE_BACKUP_NAME TEXT("SeBackupPrivilege") +#define SE_RESTORE_NAME TEXT("SeRestorePrivilege") +#define SE_SHUTDOWN_NAME TEXT("SeShutdownPrivilege") +#define SE_DEBUG_NAME TEXT("SeDebugPrivilege") +#define SE_AUDIT_NAME TEXT("SeAuditPrivilege") +#define SE_SYSTEM_ENVIRONMENT_NAME TEXT("SeSystemEnvironmentPrivilege") +#define SE_CHANGE_NOTIFY_NAME TEXT("SeChangeNotifyPrivilege") +#define SE_REMOTE_SHUTDOWN_NAME TEXT("SeRemoteShutdownPrivilege") +#define SE_CREATE_GLOBAL_NAME TEXT("SeCreateGlobalPrivilege") +#define SE_GROUP_MANDATORY 1 +#define SE_GROUP_ENABLED_BY_DEFAULT 2 +#define SE_GROUP_ENABLED 4 +#define SE_GROUP_OWNER 8 +#define SE_GROUP_USE_FOR_DENY_ONLY 16 +#define SE_GROUP_LOGON_ID 3221225472U +#define SE_GROUP_RESOURCE 536870912 +#define LANG_NEUTRAL 0x00 +#define LANG_ARABIC 0x01 +#define LANG_BULGARIAN 0x02 +#define LANG_CATALAN 0x03 +#define LANG_CHINESE 0x04 +#define LANG_CZECH 0x05 +#define LANG_DANISH 0x06 +#define LANG_GERMAN 0x07 +#define LANG_GREEK 0x08 +#define LANG_ENGLISH 0x09 +#define LANG_SPANISH 0x0a +#define LANG_FINNISH 0x0b +#define LANG_FRENCH 0x0c +#define LANG_HEBREW 0x0d +#define LANG_HUNGARIAN 0x0e +#define LANG_ICELANDIC 0x0f +#define LANG_ITALIAN 0x10 +#define LANG_JAPANESE 0x11 +#define LANG_KOREAN 0x12 +#define LANG_DUTCH 0x13 +#define LANG_NORWEGIAN 0x14 +#define LANG_POLISH 0x15 +#define LANG_PORTUGUESE 0x16 +#define LANG_ROMANIAN 0x18 +#define LANG_RUSSIAN 0x19 +#define LANG_CROATIAN 0x1a +#define LANG_SERBIAN 0x1a +#define LANG_SLOVAK 0x1b +#define LANG_ALBANIAN 0x1c +#define LANG_SWEDISH 0x1d +#define LANG_THAI 0x1e +#define LANG_TURKISH 0x1f +#define LANG_URDU 0x20 +#define LANG_INDONESIAN 0x21 +#define LANG_UKRAINIAN 0x22 +#define LANG_BELARUSIAN 0x23 +#define LANG_SLOVENIAN 0x24 +#define LANG_ESTONIAN 0x25 +#define LANG_LATVIAN 0x26 +#define LANG_LITHUANIAN 0x27 +#define LANG_FARSI 0x29 +#define LANG_VIETNAMESE 0x2a +#define LANG_ARMENIAN 0x2b +#define LANG_AZERI 0x2c +#define LANG_BASQUE 0x2d +#define LANG_MACEDONIAN 0x2f +#define LANG_AFRIKAANS 0x36 +#define LANG_GEORGIAN 0x37 +#define LANG_FAEROESE 0x38 +#define LANG_HINDI 0x39 +#define LANG_MALAY 0x3e +#define LANG_KAZAK 0x3f +#define LANG_KYRGYZ 0x40 +#define LANG_SWAHILI 0x41 +#define LANG_UZBEK 0x43 +#define LANG_TATAR 0x44 +#define LANG_BENGALI 0x45 +#define LANG_PUNJABI 0x46 +#define LANG_GUJARATI 0x47 +#define LANG_ORIYA 0x48 +#define LANG_TAMIL 0x49 +#define LANG_TELUGU 0x4a +#define LANG_KANNADA 0x4b +#define LANG_MALAYALAM 0x4c +#define LANG_ASSAMESE 0x4d +#define LANG_MARATHI 0x4e +#define LANG_SANSKRIT 0x4f +#define LANG_MONGOLIAN 0x50 +#define LANG_GALICIAN 0x56 +#define LANG_KONKANI 0x57 +#define LANG_MANIPURI 0x58 +#define LANG_SINDHI 0x59 +#define LANG_SYRIAC 0x5a +#define LANG_KASHMIRI 0x60 +#define LANG_NEPALI 0x61 +#define LANG_DIVEHI 0x65 +#define LANG_INVARIANT 0x7f +#define SUBLANG_NEUTRAL 0x00 +#define SUBLANG_DEFAULT 0x01 +#define SUBLANG_SYS_DEFAULT 0x02 +#define SUBLANG_ARABIC_SAUDI_ARABIA 0x01 +#define SUBLANG_ARABIC_IRAQ 0x02 +#define SUBLANG_ARABIC_EGYPT 0x03 +#define SUBLANG_ARABIC_LIBYA 0x04 +#define SUBLANG_ARABIC_ALGERIA 0x05 +#define SUBLANG_ARABIC_MOROCCO 0x06 +#define SUBLANG_ARABIC_TUNISIA 0x07 +#define SUBLANG_ARABIC_OMAN 0x08 +#define SUBLANG_ARABIC_YEMEN 0x09 +#define SUBLANG_ARABIC_SYRIA 0x0a +#define SUBLANG_ARABIC_JORDAN 0x0b +#define SUBLANG_ARABIC_LEBANON 0x0c +#define SUBLANG_ARABIC_KUWAIT 0x0d +#define SUBLANG_ARABIC_UAE 0x0e +#define SUBLANG_ARABIC_BAHRAIN 0x0f +#define SUBLANG_ARABIC_QATAR 0x10 +#define SUBLANG_AZERI_LATIN 0x01 +#define SUBLANG_AZERI_CYRILLIC 0x02 +#define SUBLANG_CHINESE_TRADITIONAL 0x01 +#define SUBLANG_CHINESE_SIMPLIFIED 0x02 +#define SUBLANG_CHINESE_HONGKONG 0x03 +#define SUBLANG_CHINESE_SINGAPORE 0x04 +#define SUBLANG_CHINESE_MACAU 0x05 +#define SUBLANG_DUTCH 0x01 +#define SUBLANG_DUTCH_BELGIAN 0x02 +#define SUBLANG_ENGLISH_US 0x01 +#define SUBLANG_ENGLISH_UK 0x02 +#define SUBLANG_ENGLISH_AUS 0x03 +#define SUBLANG_ENGLISH_CAN 0x04 +#define SUBLANG_ENGLISH_NZ 0x05 +#define SUBLANG_ENGLISH_EIRE 0x06 +#define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07 +#define SUBLANG_ENGLISH_JAMAICA 0x08 +#define SUBLANG_ENGLISH_CARIBBEAN 0x09 +#define SUBLANG_ENGLISH_BELIZE 0x0a +#define SUBLANG_ENGLISH_TRINIDAD 0x0b +#define SUBLANG_ENGLISH_ZIMBABWE 0x0c +#define SUBLANG_ENGLISH_PHILIPPINES 0x0d +#define SUBLANG_FRENCH 0x01 +#define SUBLANG_FRENCH_BELGIAN 0x02 +#define SUBLANG_FRENCH_CANADIAN 0x03 +#define SUBLANG_FRENCH_SWISS 0x04 +#define SUBLANG_FRENCH_LUXEMBOURG 0x05 +#define SUBLANG_FRENCH_MONACO 0x06 +#define SUBLANG_GERMAN 0x01 +#define SUBLANG_GERMAN_SWISS 0x02 +#define SUBLANG_GERMAN_AUSTRIAN 0x03 +#define SUBLANG_GERMAN_LUXEMBOURG 0x04 +#define SUBLANG_GERMAN_LIECHTENSTEIN 0x05 +#define SUBLANG_ITALIAN 0x01 +#define SUBLANG_ITALIAN_SWISS 0x02 +#define SUBLANG_KASHMIRI_INDIA 0x02 +#define SUBLANG_KASHMIRI_SASIA 0x02 +#define SUBLANG_KOREAN 0x01 +#define SUBLANG_LITHUANIAN 0x01 +#define SUBLANG_MALAY_MALAYSIA 0x01 +#define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02 +#define SUBLANG_NEPALI_INDIA 0x02 +#define SUBLANG_NORWEGIAN_BOKMAL 0x01 +#define SUBLANG_NORWEGIAN_NYNORSK 0x02 +#define SUBLANG_PORTUGUESE 0x01 +#define SUBLANG_PORTUGUESE_BRAZILIAN 0x02 +#define SUBLANG_SERBIAN_LATIN 0x02 +#define SUBLANG_SERBIAN_CYRILLIC 0x03 +#define SUBLANG_SPANISH 0x01 +#define SUBLANG_SPANISH_MEXICAN 0x02 +#define SUBLANG_SPANISH_MODERN 0x03 +#define SUBLANG_SPANISH_GUATEMALA 0x04 +#define SUBLANG_SPANISH_COSTA_RICA 0x05 +#define SUBLANG_SPANISH_PANAMA 0x06 +#define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07 +#define SUBLANG_SPANISH_VENEZUELA 0x08 +#define SUBLANG_SPANISH_COLOMBIA 0x09 +#define SUBLANG_SPANISH_PERU 0x0a +#define SUBLANG_SPANISH_ARGENTINA 0x0b +#define SUBLANG_SPANISH_ECUADOR 0x0c +#define SUBLANG_SPANISH_CHILE 0x0d +#define SUBLANG_SPANISH_URUGUAY 0x0e +#define SUBLANG_SPANISH_PARAGUAY 0x0f +#define SUBLANG_SPANISH_BOLIVIA 0x10 +#define SUBLANG_SPANISH_EL_SALVADOR 0x11 +#define SUBLANG_SPANISH_HONDURAS 0x12 +#define SUBLANG_SPANISH_NICARAGUA 0x13 +#define SUBLANG_SPANISH_PUERTO_RICO 0x14 +#define SUBLANG_SWEDISH 0x01 +#define SUBLANG_SWEDISH_FINLAND 0x02 +#define SUBLANG_URDU_PAKISTAN 0x01 +#define SUBLANG_URDU_INDIA 0x02 +#define SUBLANG_UZBEK_LATIN 0x01 +#define SUBLANG_UZBEK_CYRILLIC 0x02 +#define NLS_VALID_LOCALE_MASK 1048575 +#define SORT_DEFAULT 0 +#define SORT_JAPANESE_XJIS 0 +#define SORT_JAPANESE_UNICODE 1 +#define SORT_CHINESE_BIG5 0 +#define SORT_CHINESE_PRCP 0 +#define SORT_CHINESE_UNICODE 1 +#define SORT_CHINESE_PRC 2 +#define SORT_CHINESE_BOPOMOFO 3 +#define SORT_KOREAN_KSC 0 +#define SORT_KOREAN_UNICODE 1 +#define SORT_GERMAN_PHONE_BOOK 1 +#define SORT_HUNGARIAN_DEFAULT 0 +#define SORT_HUNGARIAN_TECHNICAL 1 +#define SORT_GEORGIAN_TRADITIONAL 0 +#define SORT_GEORGIAN_MODERN 1 +#define MAKELANGID(p,s) ((((WORD)(s))<<10)|(WORD)(p)) +#define MAKELCID(l,s) ((DWORD)((((DWORD)((WORD)(s)))<<16)|((DWORD)((WORD)(l))))) +#define PRIMARYLANGID(l) ((WORD)(l)&0x3ff) +#define SORTIDFROMLCID(l) ((WORD)((((DWORD)(l))&NLS_VALID_LOCALE_MASK)>>16)) +#define SORTVERSIONFROMLCID(l) ((WORD)((((DWORD)(l))>>20)&0xf)) +#define SUBLANGID(l) ((WORD)(l)>>10) +#define LANGIDFROMLCID(l) ((WORD)(l)) +#define LANG_SYSTEM_DEFAULT MAKELANGID(LANG_NEUTRAL,SUBLANG_SYS_DEFAULT) +#define LANG_USER_DEFAULT MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT) +#define LOCALE_NEUTRAL MAKELCID(MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL),SORT_DEFAULT) +#define ACL_REVISION 2 +#define ACL_REVISION_DS 4 +#define ACL_REVISION1 1 +#define ACL_REVISION2 2 +#define ACL_REVISION3 3 +#define ACL_REVISION4 4 +#define MIN_ACL_REVISION 2 +#define MAX_ACL_REVISION 4 +#define MINCHAR 0x80 +#define MAXCHAR 0x7f +#define MINSHORT 0x8000 +#define MAXSHORT 0x7fff +#define MINLONG 0x80000000 +#define MAXLONG 0x7fffffff +#define MAXBYTE 0xff +#define MAXWORD 0xffff +#define MAXDWORD 0xffffffff +#define PROCESSOR_INTEL_386 386 +#define PROCESSOR_INTEL_486 486 +#define PROCESSOR_INTEL_PENTIUM 586 +#define PROCESSOR_MIPS_R4000 4000 +#define PROCESSOR_ALPHA_21064 21064 +#define PROCESSOR_INTEL_IA64 2200 + +#define PROCESSOR_ARCHITECTURE_INTEL 0 +#define PROCESSOR_ARCHITECTURE_MIPS 1 +#define PROCESSOR_ARCHITECTURE_ALPHA 2 +#define PROCESSOR_ARCHITECTURE_PPC 3 +#define PROCESSOR_ARCHITECTURE_SHX 4 +#define PROCESSOR_ARCHITECTURE_ARM 5 +#define PROCESSOR_ARCHITECTURE_IA64 6 +#define PROCESSOR_ARCHITECTURE_ALPHA64 7 +#define PROCESSOR_ARCHITECTURE_MSIL8 +#define PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF +#define PF_FLOATING_POINT_PRECISION_ERRATA 0 +#define PF_FLOATING_POINT_EMULATED 1 +#define PF_COMPARE_EXCHANGE_DOUBLE 2 +#define PF_MMX_INSTRUCTIONS_AVAILABLE 3 +#define PF_PPC_MOVEMEM_64BIT_OK 4 +#define PF_ALPHA_BYTE_INSTRUCTIONS 5 +#define PF_XMMI_INSTRUCTIONS_AVAILABLE 6 +#define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7 +#define PF_RDTSC_INSTRUCTION_AVAILABLE 8 +#define PF_PAE_ENABLED 9 +#define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10 +/* also in ddk/ntifs.h */ +#define FILE_ACTION_ADDED 0x00000001 +#define FILE_ACTION_REMOVED 0x00000002 +#define FILE_ACTION_MODIFIED 0x00000003 +#define FILE_ACTION_RENAMED_OLD_NAME 0x00000004 +#define FILE_ACTION_RENAMED_NEW_NAME 0x00000005 +#define FILE_ACTION_ADDED_STREAM 0x00000006 +#define FILE_ACTION_REMOVED_STREAM 0x00000007 +#define FILE_ACTION_MODIFIED_STREAM 0x00000008 +#define FILE_ACTION_REMOVED_BY_DELETE 0x00000009 +#define FILE_ACTION_ID_NOT_TUNNELLED 0x0000000A +#define FILE_ACTION_TUNNELLED_ID_COLLISION 0x0000000B +/* end ntifs.h */ +#define HEAP_NO_SERIALIZE 1 +#define HEAP_GROWABLE 2 +#define HEAP_GENERATE_EXCEPTIONS 4 +#define HEAP_ZERO_MEMORY 8 +#define HEAP_REALLOC_IN_PLACE_ONLY 16 +#define HEAP_TAIL_CHECKING_ENABLED 32 +#define HEAP_FREE_CHECKING_ENABLED 64 +#define HEAP_DISABLE_COALESCE_ON_FREE 128 +#define HEAP_CREATE_ALIGN_16 0x0000 +#define HEAP_CREATE_ENABLE_TRACING 0x20000 +#define HEAP_MAXIMUM_TAG 0xFFF +#define HEAP_PSEUDO_TAG_FLAG 0x8000 +#define HEAP_TAG_SHIFT 16 +#define HEAP_MAKE_TAG_FLAGS(b,o) ((DWORD)((b)+(o)<<16))) +#define KEY_QUERY_VALUE 1 +#define KEY_SET_VALUE 2 +#define KEY_CREATE_SUB_KEY 4 +#define KEY_ENUMERATE_SUB_KEYS 8 +#define KEY_NOTIFY 16 +#define KEY_CREATE_LINK 32 +#define KEY_WRITE 0x20006 +#define KEY_EXECUTE 0x20019 +#define KEY_READ 0x20019 +#define KEY_ALL_ACCESS 0xf003f +#define REG_WHOLE_HIVE_VOLATILE 1 +#define REG_REFRESH_HIVE 2 +#define REG_NO_LAZY_FLUSH 4 +#define REG_OPTION_RESERVED 0 +#define REG_OPTION_NON_VOLATILE 0 +#define REG_OPTION_VOLATILE 1 +#define REG_OPTION_CREATE_LINK 2 +#define REG_OPTION_BACKUP_RESTORE 4 +#define REG_OPTION_OPEN_LINK 8 +#define REG_LEGAL_OPTION 15 +#define OWNER_SECURITY_INFORMATION 1 +#define GROUP_SECURITY_INFORMATION 2 +#define DACL_SECURITY_INFORMATION 4 +#define SACL_SECURITY_INFORMATION 8 +#define MAXIMUM_PROCESSORS 32 +#define PAGE_NOACCESS 0x0001 +#define PAGE_READONLY 0x0002 +#define PAGE_READWRITE 0x0004 +#define PAGE_WRITECOPY 0x0008 +#define PAGE_EXECUTE 0x0010 +#define PAGE_EXECUTE_READ 0x0020 +#define PAGE_EXECUTE_READWRITE 0x0040 +#define PAGE_EXECUTE_WRITECOPY 0x0080 +#define PAGE_GUARD 0x0100 +#define PAGE_NOCACHE 0x0200 +#define MEM_COMMIT 0x1000 +#define MEM_RESERVE 0x2000 +#define MEM_DECOMMIT 0x4000 +#define MEM_RELEASE 0x8000 +#define MEM_FREE 0x10000 +#define MEM_PRIVATE 0x20000 +#define MEM_MAPPED 0x40000 +#define MEM_RESET 0x80000 +#define MEM_TOP_DOWN 0x100000 +#define MEM_WRITE_WATCH 0x200000 /* 98/Me */ +#define MEM_PHYSICAL 0x400000 +#define MEM_4MB_PAGES 0x80000000 +/* also in ddk/ntifs.h */ +#define MEM_IMAGE SEC_IMAGE +#define SEC_BASED 0x00200000 +#define SEC_NO_CHANGE 0x00400000 +#define SEC_FILE 0x00800000 +#define SEC_IMAGE 0x01000000 +#define SEC_VLM 0x02000000 +#define SEC_RESERVE 0x04000000 +#define SEC_COMMIT 0x08000000 +#define SEC_NOCACHE 0x10000000 +/* end ntifs.h */ +#define SECTION_EXTEND_SIZE 16 +#define SECTION_MAP_READ 4 +#define SECTION_MAP_WRITE 2 +#define SECTION_QUERY 1 +#define SECTION_MAP_EXECUTE 8 +#define SECTION_ALL_ACCESS 0xf001f +#define MESSAGE_RESOURCE_UNICODE 1 +#define RTL_CRITSECT_TYPE 0 +#define RTL_RESOURCE_TYPE 1 +/* Also in winddk.h */ +#define FIELD_OFFSET(t,f) ((LONG)&(((t*)0)->f)) +#ifndef CONTAINING_RECORD +#define CONTAINING_RECORD(address, type, field) \ + ((type*)((PCHAR)(address) - (PCHAR)(&((type *)0)->field))) +#endif +/* end winddk.h */ +#define IMAGE_SIZEOF_FILE_HEADER 20 +#define IMAGE_FILE_RELOCS_STRIPPED 1 +#define IMAGE_FILE_EXECUTABLE_IMAGE 2 +#define IMAGE_FILE_LINE_NUMS_STRIPPED 4 +#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 8 +#define IMAGE_FILE_AGGRESIVE_WS_TRIM 16 +#define IMAGE_FILE_LARGE_ADDRESS_AWARE 32 +#define IMAGE_FILE_BYTES_REVERSED_LO 128 +#define IMAGE_FILE_32BIT_MACHINE 256 +#define IMAGE_FILE_DEBUG_STRIPPED 512 +#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 1024 +#define IMAGE_FILE_NET_RUN_FROM_SWAP 2048 +#define IMAGE_FILE_SYSTEM 4096 +#define IMAGE_FILE_DLL 8192 +#define IMAGE_FILE_UP_SYSTEM_ONLY 16384 +#define IMAGE_FILE_BYTES_REVERSED_HI 32768 +#define IMAGE_FILE_MACHINE_UNKNOWN 0 +#define IMAGE_FILE_MACHINE_I386 332 +#define IMAGE_FILE_MACHINE_R3000 354 +#define IMAGE_FILE_MACHINE_R4000 358 +#define IMAGE_FILE_MACHINE_R10000 360 +#define IMAGE_FILE_MACHINE_ALPHA 388 +#define IMAGE_FILE_MACHINE_POWERPC 496 +#define IMAGE_DOS_SIGNATURE 0x5A4D +#define IMAGE_OS2_SIGNATURE 0x454E +#define IMAGE_OS2_SIGNATURE_LE 0x454C +#define IMAGE_VXD_SIGNATURE 0x454C +#define IMAGE_NT_SIGNATURE 0x00004550 +#define IMAGE_NT_OPTIONAL_HDR_MAGIC 0x10b +#define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107 +#define IMAGE_SEPARATE_DEBUG_SIGNATURE 0x4944 +#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 +#define IMAGE_SIZEOF_ROM_OPTIONAL_HEADER 56 +#define IMAGE_SIZEOF_STD_OPTIONAL_HEADER 28 +#define IMAGE_SIZEOF_NT_OPTIONAL_HEADER 224 +#define IMAGE_SIZEOF_SHORT_NAME 8 +#define IMAGE_SIZEOF_SECTION_HEADER 40 +#define IMAGE_SIZEOF_SYMBOL 18 +#define IMAGE_SIZEOF_AUX_SYMBOL 18 +#define IMAGE_SIZEOF_RELOCATION 10 +#define IMAGE_SIZEOF_BASE_RELOCATION 8 +#define IMAGE_SIZEOF_LINENUMBER 6 +#define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60 +#define SIZEOF_RFPO_DATA 16 +#define IMAGE_SUBSYSTEM_UNKNOWN 0 +#define IMAGE_SUBSYSTEM_NATIVE 1 +#define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 +#define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 +#define IMAGE_SUBSYSTEM_OS2_CUI 5 +#define IMAGE_SUBSYSTEM_POSIX_CUI 7 +#define IMAGE_SUBSYSTEM_XBOX 14 +#define IMAGE_FIRST_SECTION(h) ((PIMAGE_SECTION_HEADER) ((DWORD)h+FIELD_OFFSET(IMAGE_NT_HEADERS,OptionalHeader)+((PIMAGE_NT_HEADERS)(h))->FileHeader.SizeOfOptionalHeader)) +#define IMAGE_DIRECTORY_ENTRY_EXPORT 0 +#define IMAGE_DIRECTORY_ENTRY_IMPORT 1 +#define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 +#define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 +#define IMAGE_DIRECTORY_ENTRY_SECURITY 4 +#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 +#define IMAGE_DIRECTORY_ENTRY_DEBUG 6 +#define IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 +#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 +#define IMAGE_DIRECTORY_ENTRY_TLS 9 +#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 +#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11 +#define IMAGE_DIRECTORY_ENTRY_IAT 12 +#define IMAGE_SCN_TYPE_NO_PAD 8 +#define IMAGE_SCN_CNT_CODE 32 +#define IMAGE_SCN_CNT_INITIALIZED_DATA 64 +#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 128 +#define IMAGE_SCN_LNK_OTHER 256 +#define IMAGE_SCN_LNK_INFO 512 +#define IMAGE_SCN_LNK_REMOVE 2048 +#define IMAGE_SCN_LNK_COMDAT 4096 +#define IMAGE_SCN_MEM_FARDATA 0x8000 +#define IMAGE_SCN_MEM_PURGEABLE 0x20000 +#define IMAGE_SCN_MEM_16BIT 0x20000 +#define IMAGE_SCN_MEM_LOCKED 0x40000 +#define IMAGE_SCN_MEM_PRELOAD 0x80000 +#define IMAGE_SCN_ALIGN_1BYTES 0x100000 +#define IMAGE_SCN_ALIGN_2BYTES 0x200000 +#define IMAGE_SCN_ALIGN_4BYTES 0x300000 +#define IMAGE_SCN_ALIGN_8BYTES 0x400000 +#define IMAGE_SCN_ALIGN_16BYTES 0x500000 +#define IMAGE_SCN_ALIGN_32BYTES 0x600000 +#define IMAGE_SCN_ALIGN_64BYTES 0x700000 +#define IMAGE_SCN_LNK_NRELOC_OVFL 0x1000000 +#define IMAGE_SCN_MEM_DISCARDABLE 0x2000000 +#define IMAGE_SCN_MEM_NOT_CACHED 0x4000000 +#define IMAGE_SCN_MEM_NOT_PAGED 0x8000000 +#define IMAGE_SCN_MEM_SHARED 0x10000000 +#define IMAGE_SCN_MEM_EXECUTE 0x20000000 +#define IMAGE_SCN_MEM_READ 0x40000000 +#define IMAGE_SCN_MEM_WRITE 0x80000000 +#define IMAGE_SYM_UNDEFINED 0 +#define IMAGE_SYM_ABSOLUTE (-1) +#define IMAGE_SYM_DEBUG (-2) +#define IMAGE_SYM_TYPE_NULL 0 +#define IMAGE_SYM_TYPE_VOID 1 +#define IMAGE_SYM_TYPE_CHAR 2 +#define IMAGE_SYM_TYPE_SHORT 3 +#define IMAGE_SYM_TYPE_INT 4 +#define IMAGE_SYM_TYPE_LONG 5 +#define IMAGE_SYM_TYPE_FLOAT 6 +#define IMAGE_SYM_TYPE_DOUBLE 7 +#define IMAGE_SYM_TYPE_STRUCT 8 +#define IMAGE_SYM_TYPE_UNION 9 +#define IMAGE_SYM_TYPE_ENUM 10 +#define IMAGE_SYM_TYPE_MOE 11 +#define IMAGE_SYM_TYPE_BYTE 12 +#define IMAGE_SYM_TYPE_WORD 13 +#define IMAGE_SYM_TYPE_UINT 14 +#define IMAGE_SYM_TYPE_DWORD 15 +#define IMAGE_SYM_TYPE_PCODE 32768 +#define IMAGE_SYM_DTYPE_NULL 0 +#define IMAGE_SYM_DTYPE_POINTER 1 +#define IMAGE_SYM_DTYPE_FUNCTION 2 +#define IMAGE_SYM_DTYPE_ARRAY 3 +#define IMAGE_SYM_CLASS_END_OF_FUNCTION (-1) +#define IMAGE_SYM_CLASS_NULL 0 +#define IMAGE_SYM_CLASS_AUTOMATIC 1 +#define IMAGE_SYM_CLASS_EXTERNAL 2 +#define IMAGE_SYM_CLASS_STATIC 3 +#define IMAGE_SYM_CLASS_REGISTER 4 +#define IMAGE_SYM_CLASS_EXTERNAL_DEF 5 +#define IMAGE_SYM_CLASS_LABEL 6 +#define IMAGE_SYM_CLASS_UNDEFINED_LABEL 7 +#define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT 8 +#define IMAGE_SYM_CLASS_ARGUMENT 9 +#define IMAGE_SYM_CLASS_STRUCT_TAG 10 +#define IMAGE_SYM_CLASS_MEMBER_OF_UNION 11 +#define IMAGE_SYM_CLASS_UNION_TAG 12 +#define IMAGE_SYM_CLASS_TYPE_DEFINITION 13 +#define IMAGE_SYM_CLASS_UNDEFINED_STATIC 14 +#define IMAGE_SYM_CLASS_ENUM_TAG 15 +#define IMAGE_SYM_CLASS_MEMBER_OF_ENUM 16 +#define IMAGE_SYM_CLASS_REGISTER_PARAM 17 +#define IMAGE_SYM_CLASS_BIT_FIELD 18 +#define IMAGE_SYM_CLASS_FAR_EXTERNAL 68 +#define IMAGE_SYM_CLASS_BLOCK 100 +#define IMAGE_SYM_CLASS_FUNCTION 101 +#define IMAGE_SYM_CLASS_END_OF_STRUCT 102 +#define IMAGE_SYM_CLASS_FILE 103 +#define IMAGE_SYM_CLASS_SECTION 104 +#define IMAGE_SYM_CLASS_WEAK_EXTERNAL 105 +#define IMAGE_COMDAT_SELECT_NODUPLICATES 1 +#define IMAGE_COMDAT_SELECT_ANY 2 +#define IMAGE_COMDAT_SELECT_SAME_SIZE 3 +#define IMAGE_COMDAT_SELECT_EXACT_MATCH 4 +#define IMAGE_COMDAT_SELECT_ASSOCIATIVE 5 +#define IMAGE_COMDAT_SELECT_LARGEST 6 +#define IMAGE_COMDAT_SELECT_NEWEST 7 +#define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY 1 +#define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY 2 +#define IMAGE_WEAK_EXTERN_SEARCH_ALIAS 3 +#define IMAGE_REL_I386_ABSOLUTE 0 +#define IMAGE_REL_I386_DIR16 1 +#define IMAGE_REL_I386_REL16 2 +#define IMAGE_REL_I386_DIR32 6 +#define IMAGE_REL_I386_DIR32NB 7 +#define IMAGE_REL_I386_SEG12 9 +#define IMAGE_REL_I386_SECTION 10 +#define IMAGE_REL_I386_SECREL 11 +#define IMAGE_REL_I386_REL32 20 +#define IMAGE_REL_MIPS_ABSOLUTE 0 +#define IMAGE_REL_MIPS_REFHALF 1 +#define IMAGE_REL_MIPS_REFWORD 2 +#define IMAGE_REL_MIPS_JMPADDR 3 +#define IMAGE_REL_MIPS_REFHI 4 +#define IMAGE_REL_MIPS_REFLO 5 +#define IMAGE_REL_MIPS_GPREL 6 +#define IMAGE_REL_MIPS_LITERAL 7 +#define IMAGE_REL_MIPS_SECTION 10 +#define IMAGE_REL_MIPS_SECREL 11 +#define IMAGE_REL_MIPS_SECRELLO 12 +#define IMAGE_REL_MIPS_SECRELHI 13 +#define IMAGE_REL_MIPS_REFWORDNB 34 +#define IMAGE_REL_MIPS_PAIR 35 +#define IMAGE_REL_ALPHA_ABSOLUTE 0 +#define IMAGE_REL_ALPHA_REFLONG 1 +#define IMAGE_REL_ALPHA_REFQUAD 2 +#define IMAGE_REL_ALPHA_GPREL32 3 +#define IMAGE_REL_ALPHA_LITERAL 4 +#define IMAGE_REL_ALPHA_LITUSE 5 +#define IMAGE_REL_ALPHA_GPDISP 6 +#define IMAGE_REL_ALPHA_BRADDR 7 +#define IMAGE_REL_ALPHA_HINT 8 +#define IMAGE_REL_ALPHA_INLINE_REFLONG 9 +#define IMAGE_REL_ALPHA_REFHI 10 +#define IMAGE_REL_ALPHA_REFLO 11 +#define IMAGE_REL_ALPHA_PAIR 12 +#define IMAGE_REL_ALPHA_MATCH 13 +#define IMAGE_REL_ALPHA_SECTION 14 +#define IMAGE_REL_ALPHA_SECREL 15 +#define IMAGE_REL_ALPHA_REFLONGNB 16 +#define IMAGE_REL_ALPHA_SECRELLO 17 +#define IMAGE_REL_ALPHA_SECRELHI 18 +#define IMAGE_REL_PPC_ABSOLUTE 0 +#define IMAGE_REL_PPC_ADDR64 1 +#define IMAGE_REL_PPC_ADDR32 2 +#define IMAGE_REL_PPC_ADDR24 3 +#define IMAGE_REL_PPC_ADDR16 4 +#define IMAGE_REL_PPC_ADDR14 5 +#define IMAGE_REL_PPC_REL24 6 +#define IMAGE_REL_PPC_REL14 7 +#define IMAGE_REL_PPC_TOCREL16 8 +#define IMAGE_REL_PPC_TOCREL14 9 +#define IMAGE_REL_PPC_ADDR32NB 10 +#define IMAGE_REL_PPC_SECREL 11 +#define IMAGE_REL_PPC_SECTION 12 +#define IMAGE_REL_PPC_IFGLUE 13 +#define IMAGE_REL_PPC_IMGLUE 14 +#define IMAGE_REL_PPC_SECREL16 15 +#define IMAGE_REL_PPC_REFHI 16 +#define IMAGE_REL_PPC_REFLO 17 +#define IMAGE_REL_PPC_PAIR 18 +#define IMAGE_REL_PPC_TYPEMASK 255 +#define IMAGE_REL_PPC_NEG 256 +#define IMAGE_REL_PPC_BRTAKEN 512 +#define IMAGE_REL_PPC_BRNTAKEN 1024 +#define IMAGE_REL_PPC_TOCDEFN 2048 +#define IMAGE_REL_BASED_ABSOLUTE 0 +#define IMAGE_REL_BASED_HIGH 1 +#define IMAGE_REL_BASED_LOW 2 +#define IMAGE_REL_BASED_HIGHLOW 3 +#define IMAGE_REL_BASED_HIGHADJ 4 +#define IMAGE_REL_BASED_MIPS_JMPADDR 5 +#define IMAGE_ARCHIVE_START_SIZE 8 +#define IMAGE_ARCHIVE_START "!<arch>\n" +#define IMAGE_ARCHIVE_END "`\n" +#define IMAGE_ARCHIVE_PAD "\n" +#define IMAGE_ARCHIVE_LINKER_MEMBER "/ " +#define IMAGE_ARCHIVE_LONGNAMES_MEMBER "// " +#define IMAGE_ORDINAL_FLAG 0x80000000 +#define IMAGE_SNAP_BY_ORDINAL(o) ((o&IMAGE_ORDINAL_FLAG)!=0) +#define IMAGE_ORDINAL(o) (o&0xffff) +#define IMAGE_RESOURCE_NAME_IS_STRING 0x80000000 +#define IMAGE_RESOURCE_DATA_IS_DIRECTORY 0x80000000 +#define IMAGE_DEBUG_TYPE_UNKNOWN 0 +#define IMAGE_DEBUG_TYPE_COFF 1 +#define IMAGE_DEBUG_TYPE_CODEVIEW 2 +#define IMAGE_DEBUG_TYPE_FPO 3 +#define IMAGE_DEBUG_TYPE_MISC 4 +#define IMAGE_DEBUG_TYPE_EXCEPTION 5 +#define IMAGE_DEBUG_TYPE_FIXUP 6 +#define IMAGE_DEBUG_TYPE_OMAP_TO_SRC 7 +#define IMAGE_DEBUG_TYPE_OMAP_FROM_SRC 8 +#define FRAME_FPO 0 +#define FRAME_TRAP 1 +#define FRAME_TSS 2 +#define FRAME_NONFPO 3 +#define IMAGE_DEBUG_MISC_EXENAME 1 +#define N_BTMASK 0x000F +#define N_TMASK 0x0030 +#define N_TMASK1 0x00C0 +#define N_TMASK2 0x00F0 +#define N_BTSHFT 4 +#define N_TSHIFT 2 +#define IS_TEXT_UNICODE_ASCII16 1 +#define IS_TEXT_UNICODE_REVERSE_ASCII16 16 +#define IS_TEXT_UNICODE_STATISTICS 2 +#define IS_TEXT_UNICODE_REVERSE_STATISTICS 32 +#define IS_TEXT_UNICODE_CONTROLS 4 +#define IS_TEXT_UNICODE_REVERSE_CONTROLS 64 +#define IS_TEXT_UNICODE_SIGNATURE 8 +#define IS_TEXT_UNICODE_REVERSE_SIGNATURE 128 +#define IS_TEXT_UNICODE_ILLEGAL_CHARS 256 +#define IS_TEXT_UNICODE_ODD_LENGTH 512 +#define IS_TEXT_UNICODE_NULL_BYTES 4096 +#define IS_TEXT_UNICODE_UNICODE_MASK 15 +#define IS_TEXT_UNICODE_REVERSE_MASK 240 +#define IS_TEXT_UNICODE_NOT_UNICODE_MASK 3840 +#define IS_TEXT_UNICODE_NOT_ASCII_MASK 61440 +#define SERVICE_KERNEL_DRIVER 1 +#define SERVICE_FILE_SYSTEM_DRIVER 2 +#define SERVICE_ADAPTER 4 +#define SERVICE_RECOGNIZER_DRIVER 8 +#define SERVICE_DRIVER (SERVICE_KERNEL_DRIVER|SERVICE_FILE_SYSTEM_DRIVER|SERVICE_RECOGNIZER_DRIVER) +#define SERVICE_WIN32_OWN_PROCESS 16 +#define SERVICE_WIN32_SHARE_PROCESS 32 +#define SERVICE_WIN32 (SERVICE_WIN32_OWN_PROCESS|SERVICE_WIN32_SHARE_PROCESS) +#define SERVICE_INTERACTIVE_PROCESS 256 +#define SERVICE_TYPE_ALL (SERVICE_WIN32|SERVICE_ADAPTER|SERVICE_DRIVER|SERVICE_INTERACTIVE_PROCESS) +#define SERVICE_BOOT_START 0 +#define SERVICE_SYSTEM_START 1 +#define SERVICE_AUTO_START 2 +#define SERVICE_DEMAND_START 3 +#define SERVICE_DISABLED 4 +#define SERVICE_ERROR_IGNORE 0 +#define SERVICE_ERROR_NORMAL 1 +#define SERVICE_ERROR_SEVERE 2 +#define SERVICE_ERROR_CRITICAL 3 +#define SE_OWNER_DEFAULTED 1 +#define SE_GROUP_DEFAULTED 2 +#define SE_DACL_PRESENT 4 +#define SE_DACL_DEFAULTED 8 +#define SE_SACL_PRESENT 16 +#define SE_SACL_DEFAULTED 32 +#define SE_DACL_AUTO_INHERIT_REQ 256 +#define SE_SACL_AUTO_INHERIT_REQ 512 +#define SE_DACL_AUTO_INHERITED 1024 +#define SE_SACL_AUTO_INHERITED 2048 +#define SE_DACL_PROTECTED 4096 +#define SE_SACL_PROTECTED 8192 +#define SE_SELF_RELATIVE 0x8000 +#define SECURITY_DESCRIPTOR_MIN_LENGTH 20 +#define SECURITY_DESCRIPTOR_REVISION 1 +#define SECURITY_DESCRIPTOR_REVISION1 1 +#define SE_PRIVILEGE_ENABLED_BY_DEFAULT 1 +#define SE_PRIVILEGE_ENABLED 2 +#define SE_PRIVILEGE_USED_FOR_ACCESS 0x80000000 +#define PRIVILEGE_SET_ALL_NECESSARY 1 +#define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation +#define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation +#define SECURITY_DYNAMIC_TRACKING TRUE +#define SECURITY_STATIC_TRACKING FALSE +/* also in ddk/ntifs.h */ +#define TOKEN_ASSIGN_PRIMARY (0x0001) +#define TOKEN_DUPLICATE (0x0002) +#define TOKEN_IMPERSONATE (0x0004) +#define TOKEN_QUERY (0x0008) +#define TOKEN_QUERY_SOURCE (0x0010) +#define TOKEN_ADJUST_PRIVILEGES (0x0020) +#define TOKEN_ADJUST_GROUPS (0x0040) +#define TOKEN_ADJUST_DEFAULT (0x0080) +#define TOKEN_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\ + TOKEN_ASSIGN_PRIMARY |\ + TOKEN_DUPLICATE |\ + TOKEN_IMPERSONATE |\ + TOKEN_QUERY |\ + TOKEN_QUERY_SOURCE |\ + TOKEN_ADJUST_PRIVILEGES |\ + TOKEN_ADJUST_GROUPS |\ + TOKEN_ADJUST_DEFAULT) +#define TOKEN_READ (STANDARD_RIGHTS_READ |\ + TOKEN_QUERY) +#define TOKEN_WRITE (STANDARD_RIGHTS_WRITE |\ + TOKEN_ADJUST_PRIVILEGES |\ + TOKEN_ADJUST_GROUPS |\ + TOKEN_ADJUST_DEFAULT) + +#define TOKEN_EXECUTE (STANDARD_RIGHTS_EXECUTE) +#define TOKEN_SOURCE_LENGTH 8 +/* end ddk/ntifs.h */ +#define DLL_PROCESS_DETACH 0 +#define DLL_PROCESS_ATTACH 1 +#define DLL_THREAD_ATTACH 2 +#define DLL_THREAD_DETACH 3 +#define DBG_CONTINUE 0x10002 +#define DBG_TERMINATE_THREAD 0x40010003 +#define DBG_TERMINATE_PROCESS 0x40010004 +#define DBG_CONTROL_C 0x40010005 +#define DBG_CONTROL_BREAK 0x40010008 +#define DBG_EXCEPTION_NOT_HANDLED 0x80010001 +#define TAPE_ABSOLUTE_POSITION 0 +#define TAPE_LOGICAL_POSITION 1 +#define TAPE_PSEUDO_LOGICAL_POSITION 2 +#define TAPE_REWIND 0 +#define TAPE_ABSOLUTE_BLOCK 1 +#define TAPE_LOGICAL_BLOCK 2 +#define TAPE_PSEUDO_LOGICAL_BLOCK 3 +#define TAPE_SPACE_END_OF_DATA 4 +#define TAPE_SPACE_RELATIVE_BLOCKS 5 +#define TAPE_SPACE_FILEMARKS 6 +#define TAPE_SPACE_SEQUENTIAL_FMKS 7 +#define TAPE_SPACE_SETMARKS 8 +#define TAPE_SPACE_SEQUENTIAL_SMKS 9 +#define TAPE_DRIVE_FIXED 1 +#define TAPE_DRIVE_SELECT 2 +#define TAPE_DRIVE_INITIATOR 4 +#define TAPE_DRIVE_ERASE_SHORT 16 +#define TAPE_DRIVE_ERASE_LONG 32 +#define TAPE_DRIVE_ERASE_BOP_ONLY 64 +#define TAPE_DRIVE_ERASE_IMMEDIATE 128 +#define TAPE_DRIVE_TAPE_CAPACITY 256 +#define TAPE_DRIVE_TAPE_REMAINING 512 +#define TAPE_DRIVE_FIXED_BLOCK 1024 +#define TAPE_DRIVE_VARIABLE_BLOCK 2048 +#define TAPE_DRIVE_WRITE_PROTECT 4096 +#define TAPE_DRIVE_EOT_WZ_SIZE 8192 +#define TAPE_DRIVE_ECC 0x10000 +#define TAPE_DRIVE_COMPRESSION 0x20000 +#define TAPE_DRIVE_PADDING 0x40000 +#define TAPE_DRIVE_REPORT_SMKS 0x80000 +#define TAPE_DRIVE_GET_ABSOLUTE_BLK 0x100000 +#define TAPE_DRIVE_GET_LOGICAL_BLK 0x200000 +#define TAPE_DRIVE_SET_EOT_WZ_SIZE 0x400000 +#define TAPE_DRIVE_EJECT_MEDIA 0x1000000 +#define TAPE_DRIVE_CLEAN_REQUESTS 0x2000000 +#define TAPE_DRIVE_SET_CMP_BOP_ONLY 0x4000000 +#define TAPE_DRIVE_RESERVED_BIT 0x80000000 +#define TAPE_DRIVE_LOAD_UNLOAD 0x80000001 +#define TAPE_DRIVE_TENSION 0x80000002 +#define TAPE_DRIVE_LOCK_UNLOCK 0x80000004 +#define TAPE_DRIVE_REWIND_IMMEDIATE 0x80000008 +#define TAPE_DRIVE_SET_BLOCK_SIZE 0x80000010 +#define TAPE_DRIVE_LOAD_UNLD_IMMED 0x80000020 +#define TAPE_DRIVE_TENSION_IMMED 0x80000040 +#define TAPE_DRIVE_LOCK_UNLK_IMMED 0x80000080 +#define TAPE_DRIVE_SET_ECC 0x80000100 +#define TAPE_DRIVE_SET_COMPRESSION 0x80000200 +#define TAPE_DRIVE_SET_PADDING 0x80000400 +#define TAPE_DRIVE_SET_REPORT_SMKS 0x80000800 +#define TAPE_DRIVE_ABSOLUTE_BLK 0x80001000 +#define TAPE_DRIVE_ABS_BLK_IMMED 0x80002000 +#define TAPE_DRIVE_LOGICAL_BLK 0x80004000 +#define TAPE_DRIVE_LOG_BLK_IMMED 0x80008000 +#define TAPE_DRIVE_END_OF_DATA 0x80010000 +#define TAPE_DRIVE_RELATIVE_BLKS 0x80020000 +#define TAPE_DRIVE_FILEMARKS 0x80040000 +#define TAPE_DRIVE_SEQUENTIAL_FMKS 0x80080000 +#define TAPE_DRIVE_SETMARKS 0x80100000 +#define TAPE_DRIVE_SEQUENTIAL_SMKS 0x80200000 +#define TAPE_DRIVE_REVERSE_POSITION 0x80400000 +#define TAPE_DRIVE_SPACE_IMMEDIATE 0x80800000 +#define TAPE_DRIVE_WRITE_SETMARKS 0x81000000 +#define TAPE_DRIVE_WRITE_FILEMARKS 0x82000000 +#define TAPE_DRIVE_WRITE_SHORT_FMKS 0x84000000 +#define TAPE_DRIVE_WRITE_LONG_FMKS 0x88000000 +#define TAPE_DRIVE_WRITE_MARK_IMMED 0x90000000 +#define TAPE_DRIVE_FORMAT 0xA0000000 +#define TAPE_DRIVE_FORMAT_IMMEDIATE 0xC0000000 +#define TAPE_DRIVE_HIGH_FEATURES 0x80000000 +#define TAPE_FIXED_PARTITIONS 0 +#define TAPE_INITIATOR_PARTITIONS 2 +#define TAPE_SELECT_PARTITIONS 1 +#define TAPE_FILEMARKS 1 +#define TAPE_LONG_FILEMARKS 3 +#define TAPE_SETMARKS 0 +#define TAPE_SHORT_FILEMARKS 2 +#define TAPE_ERASE_LONG 1 +#define TAPE_ERASE_SHORT 0 +#define TAPE_LOAD 0 +#define TAPE_UNLOAD 1 +#define TAPE_TENSION 2 +#define TAPE_LOCK 3 +#define TAPE_UNLOCK 4 +#define TAPE_FORMAT 5 +#if (_WIN32_WINNT >= 0x0500) +#define VER_MINORVERSION 0x0000001 +#define VER_MAJORVERSION 0x0000002 +#define VER_BUILDNUMBER 0x0000004 +#define VER_PLATFORMID 0x0000008 +#define VER_SERVICEPACKMINOR 0x0000010 +#define VER_SERVICEPACKMAJOR 0x0000020 +#define VER_SUITENAME 0x0000040 +#define VER_PRODUCT_TYPE 0x0000080 +#define VER_EQUAL 1 +#define VER_GREATER 2 +#define VER_GREATER_EQUAL 3 +#define VER_LESS 4 +#define VER_LESS_EQUAL 5 +#define VER_AND 6 +#define VER_OR 7 +#endif +#define VER_PLATFORM_WIN32s 0 +#define VER_PLATFORM_WIN32_WINDOWS 1 +#define VER_PLATFORM_WIN32_NT 2 +#define VER_NT_WORKSTATION 1 +#define VER_NT_DOMAIN_CONTROLLER 2 +#define VER_NT_SERVER 3 +#define VER_SUITE_SMALLBUSINESS 1 +#define VER_SUITE_ENTERPRISE 2 +#define VER_SUITE_BACKOFFICE 4 +#define VER_SUITE_TERMINAL 16 +#define VER_SUITE_SMALLBUSINESS_RESTRICTED 32 +#define VER_SUITE_DATACENTER 128 +#define VER_SUITE_PERSONAL 512 +#define VER_SUITE_BLADE 1024 +#define WT_EXECUTEDEFAULT 0x00000000 +#define WT_EXECUTEINIOTHREAD 0x00000001 +#define WT_EXECUTEINWAITTHREAD 0x00000004 +#define WT_EXECUTEONLYONCE 0x00000008 +#define WT_EXECUTELONGFUNCTION 0x00000010 +#define WT_EXECUTEINTIMERTHREAD 0x00000020 +#define WT_EXECUTEINPERSISTENTTHREAD 0x00000080 +#define WT_TRANSFER_IMPERSONATION 0x00000100 +#if (_WIN32_WINNT >= 0x0501) +#define ACTIVATION_CONTEXT_SECTION_ASSEMBLY_INFORMATION 1 +#define ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION 2 +#define ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION 3 +#define ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION 4 +#define ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION 5 +#define ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION 6 +#define ACTIVATION_CONTEXT_SECTION_COM_PROGID_REDIRECTION 7 +#define ACTIVATION_CONTEXT_SECTION_CLR_SURROGATES 9 +#endif /* (_WIN32_WINNT >= 0x0501) */ +#define BTYPE(x) ((x)&N_BTMASK) +#define ISPTR(x) (((x)&N_TMASK)==(IMAGE_SYM_DTYPE_POINTER<<N_BTSHFT)) +#define ISFCN(x) (((x)&N_TMASK)==(IMAGE_SYM_DTYPE_FUNCTION<<N_BTSHFT)) +#define ISARY(x) (((x)&N_TMASK)==(IMAGE_SYM_DTYPE_ARRAY<<N_BTSHFT)) +#define ISTAG(x) ((x)==IMAGE_SYM_CLASS_STRUCT_TAG||(x)==IMAGE_SYM_CLASS_UNION_TAG||(x)==IMAGE_SYM_CLASS_ENUM_TAG) +#define INCREF(x) ((((x)&~N_BTMASK)<<N_TSHIFT)|(IMAGE_SYM_DTYPE_POINTER<<N_BTSHFT)|((x)&N_BTMASK)) +#define DECREF(x) ((((x)>>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK)) +#define TLS_MINIMUM_AVAILABLE 64 +#define REPARSE_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer) +#define REPARSE_GUID_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer) +#define MAXIMUM_REPARSE_DATA_BUFFER_SIZE 16384 +#define IO_REPARSE_TAG_RESERVED_ZERO 0 +#define IO_REPARSE_TAG_RESERVED_ONE 1 +#define IO_REPARSE_TAG_RESERVED_RANGE IO_REPARSE_TAG_RESERVED_ONE +#define IsReparseTagMicrosoft(x) ((x)&0x80000000) +#define IsReparseTagHighLatency(x) ((x)&0x40000000) +#define IsReparseTagNameSurrogate(x) ((x)&0x20000000) +#define IO_REPARSE_TAG_VALID_VALUES 0xE000FFFF +#define IsReparseTagValid(x) (!((x)&~IO_REPARSE_TAG_VALID_VALUES)&&((x)>IO_REPARSE_TAG_RESERVED_RANGE)) +#define IO_REPARSE_TAG_SYMBOLIC_LINK IO_REPARSE_TAG_RESERVED_ZERO +#define IO_REPARSE_TAG_MOUNT_POINT 0xA0000003 +#ifndef RC_INVOKED +typedef DWORD ACCESS_MASK, *PACCESS_MASK; + +#ifdef _GUID_DEFINED +# warning _GUID_DEFINED is deprecated, use GUID_DEFINED instead +#endif + +#if ! (defined _GUID_DEFINED || defined GUID_DEFINED) /* also defined in basetyps.h */ +#define GUID_DEFINED +typedef struct _GUID { + unsigned long Data1; + unsigned short Data2; + unsigned short Data3; + unsigned char Data4[8]; +} GUID, *REFGUID, *LPGUID; +#define SYSTEM_LUID { QuadPart:999 } +#endif /* GUID_DEFINED */ +typedef struct _GENERIC_MAPPING { + ACCESS_MASK GenericRead; + ACCESS_MASK GenericWrite; + ACCESS_MASK GenericExecute; + ACCESS_MASK GenericAll; +} GENERIC_MAPPING, *PGENERIC_MAPPING; +typedef struct _ACE_HEADER { + BYTE AceType; + BYTE AceFlags; + WORD AceSize; +} ACE_HEADER, *PACE_HEADER; +typedef struct _ACCESS_ALLOWED_ACE { + ACE_HEADER Header; + ACCESS_MASK Mask; + DWORD SidStart; +} ACCESS_ALLOWED_ACE, *PACCESS_ALLOWED_ACE; +typedef struct _ACCESS_DENIED_ACE { + ACE_HEADER Header; + ACCESS_MASK Mask; + DWORD SidStart; +} ACCESS_DENIED_ACE, *PACCESS_DENIED_ACE; +typedef struct _SYSTEM_AUDIT_ACE { + ACE_HEADER Header; + ACCESS_MASK Mask; + DWORD SidStart; +} SYSTEM_AUDIT_ACE; +typedef SYSTEM_AUDIT_ACE *PSYSTEM_AUDIT_ACE; +typedef struct _SYSTEM_ALARM_ACE { + ACE_HEADER Header; + ACCESS_MASK Mask; + DWORD SidStart; +} SYSTEM_ALARM_ACE,*PSYSTEM_ALARM_ACE; +typedef struct _ACCESS_ALLOWED_OBJECT_ACE { + ACE_HEADER Header; + ACCESS_MASK Mask; + DWORD Flags; + GUID ObjectType; + GUID InheritedObjectType; + DWORD SidStart; +} ACCESS_ALLOWED_OBJECT_ACE,*PACCESS_ALLOWED_OBJECT_ACE; +typedef struct _ACCESS_DENIED_OBJECT_ACE { + ACE_HEADER Header; + ACCESS_MASK Mask; + DWORD Flags; + GUID ObjectType; + GUID InheritedObjectType; + DWORD SidStart; +} ACCESS_DENIED_OBJECT_ACE,*PACCESS_DENIED_OBJECT_ACE; +typedef struct _SYSTEM_AUDIT_OBJECT_ACE { + ACE_HEADER Header; + ACCESS_MASK Mask; + DWORD Flags; + GUID ObjectType; + GUID InheritedObjectType; + DWORD SidStart; +} SYSTEM_AUDIT_OBJECT_ACE,*PSYSTEM_AUDIT_OBJECT_ACE; +typedef struct _SYSTEM_ALARM_OBJECT_ACE { + ACE_HEADER Header; + ACCESS_MASK Mask; + DWORD Flags; + GUID ObjectType; + GUID InheritedObjectType; + DWORD SidStart; +} SYSTEM_ALARM_OBJECT_ACE,*PSYSTEM_ALARM_OBJECT_ACE; +typedef struct _ACL { + BYTE AclRevision; + BYTE Sbz1; + WORD AclSize; + WORD AceCount; + WORD Sbz2; +} ACL,*PACL; +typedef struct _ACL_REVISION_INFORMATION { + DWORD AclRevision; +} ACL_REVISION_INFORMATION; +typedef struct _ACL_SIZE_INFORMATION { + DWORD AceCount; + DWORD AclBytesInUse; + DWORD AclBytesFree; +} ACL_SIZE_INFORMATION; + +/* FIXME: add more machines */ +#ifdef _X86_ +#define SIZE_OF_80387_REGISTERS 80 +#define CONTEXT_i386 0x10000 +#define CONTEXT_i486 0x10000 +#define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L) +#define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L) +#define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L) +#define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L) +#define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L) +#define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L) +#define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS) +#define MAXIMUM_SUPPORTED_EXTENSION 512 +typedef struct _FLOATING_SAVE_AREA { + DWORD ControlWord; + DWORD StatusWord; + DWORD TagWord; + DWORD ErrorOffset; + DWORD ErrorSelector; + DWORD DataOffset; + DWORD DataSelector; + BYTE RegisterArea[80]; + DWORD Cr0NpxState; +} FLOATING_SAVE_AREA; +typedef struct _CONTEXT { + DWORD ContextFlags; + DWORD Dr0; + DWORD Dr1; + DWORD Dr2; + DWORD Dr3; + DWORD Dr6; + DWORD Dr7; + FLOATING_SAVE_AREA FloatSave; + DWORD SegGs; + DWORD SegFs; + DWORD SegEs; + DWORD SegDs; + DWORD Edi; + DWORD Esi; + DWORD Ebx; + DWORD Edx; + DWORD Ecx; + DWORD Eax; + DWORD Ebp; + DWORD Eip; + DWORD SegCs; + DWORD EFlags; + DWORD Esp; + DWORD SegSs; + BYTE ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION]; +} CONTEXT; +#elif defined(_PPC_) +#define CONTEXT_CONTROL 1L +#define CONTEXT_FLOATING_POINT 2L +#define CONTEXT_INTEGER 4L +#define CONTEXT_DEBUG_REGISTERS 8L +#define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_FLOATING_POINT|CONTEXT_INTEGER) +typedef struct { + double Fpr0; + double Fpr1; + double Fpr2; + double Fpr3; + double Fpr4; + double Fpr5; + double Fpr6; + double Fpr7; + double Fpr8; + double Fpr9; + double Fpr10; + double Fpr11; + double Fpr12; + double Fpr13; + double Fpr14; + double Fpr15; + double Fpr16; + double Fpr17; + double Fpr18; + double Fpr19; + double Fpr20; + double Fpr21; + double Fpr22; + double Fpr23; + double Fpr24; + double Fpr25; + double Fpr26; + double Fpr27; + double Fpr28; + double Fpr29; + double Fpr30; + double Fpr31; + double Fpscr; + DWORD Gpr0; + DWORD Gpr1; + DWORD Gpr2; + DWORD Gpr3; + DWORD Gpr4; + DWORD Gpr5; + DWORD Gpr6; + DWORD Gpr7; + DWORD Gpr8; + DWORD Gpr9; + DWORD Gpr10; + DWORD Gpr11; + DWORD Gpr12; + DWORD Gpr13; + DWORD Gpr14; + DWORD Gpr15; + DWORD Gpr16; + DWORD Gpr17; + DWORD Gpr18; + DWORD Gpr19; + DWORD Gpr20; + DWORD Gpr21; + DWORD Gpr22; + DWORD Gpr23; + DWORD Gpr24; + DWORD Gpr25; + DWORD Gpr26; + DWORD Gpr27; + DWORD Gpr28; + DWORD Gpr29; + DWORD Gpr30; + DWORD Gpr31; + DWORD Cr; + DWORD Xer; + DWORD Msr; + DWORD Iar; + DWORD Lr; + DWORD Ctr; + DWORD ContextFlags; + DWORD Fill[3]; + DWORD Dr0; + DWORD Dr1; + DWORD Dr2; + DWORD Dr3; + DWORD Dr4; + DWORD Dr5; + DWORD Dr6; + DWORD Dr7; +} CONTEXT; +#elif defined(_ALPHA_) +#define CONTEXT_ALPHA 0x20000 +#define CONTEXT_CONTROL (CONTEXT_ALPHA|1L) +#define CONTEXT_FLOATING_POINT (CONTEXT_ALPHA|2L) +#define CONTEXT_INTEGER (CONTEXT_ALPHA|4L) +#define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_FLOATING_POINT|CONTEXT_INTEGER) +typedef struct _CONTEXT { + ULONGLONG FltF0; + ULONGLONG FltF1; + ULONGLONG FltF2; + ULONGLONG FltF3; + ULONGLONG FltF4; + ULONGLONG FltF5; + ULONGLONG FltF6; + ULONGLONG FltF7; + ULONGLONG FltF8; + ULONGLONG FltF9; + ULONGLONG FltF10; + ULONGLONG FltF11; + ULONGLONG FltF12; + ULONGLONG FltF13; + ULONGLONG FltF14; + ULONGLONG FltF15; + ULONGLONG FltF16; + ULONGLONG FltF17; + ULONGLONG FltF18; + ULONGLONG FltF19; + ULONGLONG FltF20; + ULONGLONG FltF21; + ULONGLONG FltF22; + ULONGLONG FltF23; + ULONGLONG FltF24; + ULONGLONG FltF25; + ULONGLONG FltF26; + ULONGLONG FltF27; + ULONGLONG FltF28; + ULONGLONG FltF29; + ULONGLONG FltF30; + ULONGLONG FltF31; + ULONGLONG IntV0; + ULONGLONG IntT0; + ULONGLONG IntT1; + ULONGLONG IntT2; + ULONGLONG IntT3; + ULONGLONG IntT4; + ULONGLONG IntT5; + ULONGLONG IntT6; + ULONGLONG IntT7; + ULONGLONG IntS0; + ULONGLONG IntS1; + ULONGLONG IntS2; + ULONGLONG IntS3; + ULONGLONG IntS4; + ULONGLONG IntS5; + ULONGLONG IntFp; + ULONGLONG IntA0; + ULONGLONG IntA1; + ULONGLONG IntA2; + ULONGLONG IntA3; + ULONGLONG IntA4; + ULONGLONG IntA5; + ULONGLONG IntT8; + ULONGLONG IntT9; + ULONGLONG IntT10; + ULONGLONG IntT11; + ULONGLONG IntRa; + ULONGLONG IntT12; + ULONGLONG IntAt; + ULONGLONG IntGp; + ULONGLONG IntSp; + ULONGLONG IntZero; + ULONGLONG Fpcr; + ULONGLONG SoftFpcr; + ULONGLONG Fir; + DWORD Psr; + DWORD ContextFlags; + DWORD Fill[4]; +} CONTEXT; +#elif defined(SHx) + +/* These are the debug or break registers on the SH3 */ +typedef struct _DEBUG_REGISTERS { + ULONG BarA; + UCHAR BasrA; + UCHAR BamrA; + USHORT BbrA; + ULONG BarB; + UCHAR BasrB; + UCHAR BamrB; + USHORT BbrB; + ULONG BdrB; + ULONG BdmrB; + USHORT Brcr; + USHORT Align; +} DEBUG_REGISTERS, *PDEBUG_REGISTERS; + +/* The following flags control the contents of the CONTEXT structure. */ + +#define CONTEXT_SH3 0x00000040 +#define CONTEXT_SH4 0x000000c0 /* CONTEXT_SH3 | 0x80 - must contain the SH3 bits */ + +#ifdef SH3 +#define CONTEXT_CONTROL (CONTEXT_SH3 | 0x00000001L) +#define CONTEXT_INTEGER (CONTEXT_SH3 | 0x00000002L) +#define CONTEXT_DEBUG_REGISTERS (CONTEXT_SH3 | 0x00000008L) +#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_DEBUG_REGISTERS) +#else /* SH4 */ +#define CONTEXT_CONTROL (CONTEXT_SH4 | 0x00000001L) +#define CONTEXT_INTEGER (CONTEXT_SH4 | 0x00000002L) +#define CONTEXT_DEBUG_REGISTERS (CONTEXT_SH4 | 0x00000008L) +#define CONTEXT_FLOATING_POINT (CONTEXT_SH4 | 0x00000004L) +#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_DEBUG_REGISTERS | CONTEXT_FLOATING_POINT) +#endif + +/* Context Frame */ + +/* This frame is used to store a limited processor context into the */ +/* Thread structure for CPUs which have no floating point support. */ + +typedef struct _CONTEXT { + /* The flags values within this flag control the contents of */ + /* a CONTEXT record. */ + + /* If the context record is used as an input parameter, then */ + /* for each portion of the context record controlled by a flag */ + /* whose value is set, it is assumed that that portion of the */ + /* context record contains valid context. If the context record */ + /* is being used to modify a thread's context, then only that */ + /* portion of the threads context will be modified. */ + + /* If the context record is used as an IN OUT parameter to capture */ + /* the context of a thread, then only those portions of the thread's */ + /* context corresponding to set flags will be returned. */ + + /* The context record is never used as an OUT only parameter. */ + + + ULONG ContextFlags; + + /* This section is specified/returned if the ContextFlags word contains */ + /* the flag CONTEXT_INTEGER. */ + + /* N.B. The registers RA and R15 are defined in this section, but are */ + /* considered part of the control context rather than part of the integer */ + /* context. */ + + ULONG PR; + ULONG MACH; + ULONG MACL; + ULONG GBR; + ULONG R0; + ULONG R1; + ULONG R2; + ULONG R3; + ULONG R4; + ULONG R5; + ULONG R6; + ULONG R7; + ULONG R8; + ULONG R9; + ULONG R10; + ULONG R11; + ULONG R12; + ULONG R13; + ULONG R14; + ULONG R15; + + /* This section is specified/returned if the ContextFlags word contains */ + /* the flag CONTEXT_CONTROL. */ + + /* N.B. The registers r15 and ra are defined in the integer section, */ + /* but are considered part of the control context rather than part of */ + /* the integer context. */ + + ULONG Fir; + ULONG Psr; + +#if !defined(SH3e) && !defined(SH4) + ULONG OldStuff[2]; + DEBUG_REGISTERS DebugRegisters; +#else + ULONG Fpscr; + ULONG Fpul; + ULONG FRegs[16]; +#if defined(SH4) + ULONG xFRegs[16]; +#endif +#endif +} CONTEXT; + +#elif defined(MIPS) + +/* The following flags control the contents of the CONTEXT structure. */ + +#define CONTEXT_R4000 0x00010000 /* r4000 context */ + +#define CONTEXT_CONTROL (CONTEXT_R4000 | 0x00000001L) +#define CONTEXT_FLOATING_POINT (CONTEXT_R4000 | 0x00000002L) +#define CONTEXT_INTEGER (CONTEXT_R4000 | 0x00000004L) + +#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER) + +/* Context Frame */ + +/* N.B. This frame must be exactly a multiple of 16 bytes in length. */ + +/* This frame has a several purposes: 1) it is used as an argument to */ +/* NtContinue, 2) it is used to constuct a call frame for APC delivery, */ +/* 3) it is used to construct a call frame for exception dispatching */ +/* in user mode, and 4) it is used in the user level thread creation */ +/* routines. */ + +/* The layout of the record conforms to a standard call frame. */ + + +typedef struct _CONTEXT { + + /* This section is always present and is used as an argument build */ + /* area. */ + + DWORD Argument[4]; + + /* This section is specified/returned if the ContextFlags word contains */ + /* the flag CONTEXT_FLOATING_POINT. */ + + DWORD FltF0; + DWORD FltF1; + DWORD FltF2; + DWORD FltF3; + DWORD FltF4; + DWORD FltF5; + DWORD FltF6; + DWORD FltF7; + DWORD FltF8; + DWORD FltF9; + DWORD FltF10; + DWORD FltF11; + DWORD FltF12; + DWORD FltF13; + DWORD FltF14; + DWORD FltF15; + DWORD FltF16; + DWORD FltF17; + DWORD FltF18; + DWORD FltF19; + DWORD FltF20; + DWORD FltF21; + DWORD FltF22; + DWORD FltF23; + DWORD FltF24; + DWORD FltF25; + DWORD FltF26; + DWORD FltF27; + DWORD FltF28; + DWORD FltF29; + DWORD FltF30; + DWORD FltF31; + + /* This section is specified/returned if the ContextFlags word contains */ + /* the flag CONTEXT_INTEGER. */ + + /* N.B. The registers gp, sp, and ra are defined in this section, but are */ + /* considered part of the control context rather than part of the integer */ + /* context. */ + + /* N.B. Register zero is not stored in the frame. */ + + DWORD IntZero; + DWORD IntAt; + DWORD IntV0; + DWORD IntV1; + DWORD IntA0; + DWORD IntA1; + DWORD IntA2; + DWORD IntA3; + DWORD IntT0; + DWORD IntT1; + DWORD IntT2; + DWORD IntT3; + DWORD IntT4; + DWORD IntT5; + DWORD IntT6; + DWORD IntT7; + DWORD IntS0; + DWORD IntS1; + DWORD IntS2; + DWORD IntS3; + DWORD IntS4; + DWORD IntS5; + DWORD IntS6; + DWORD IntS7; + DWORD IntT8; + DWORD IntT9; + DWORD IntK0; + DWORD IntK1; + DWORD IntGp; + DWORD IntSp; + DWORD IntS8; + DWORD IntRa; + DWORD IntLo; + DWORD IntHi; + + /* This section is specified/returned if the ContextFlags word contains */ + /* the flag CONTEXT_FLOATING_POINT. */ + + DWORD Fsr; + + /* This section is specified/returned if the ContextFlags word contains */ + /* the flag CONTEXT_CONTROL. */ + + /* N.B. The registers gp, sp, and ra are defined in the integer section, */ + /* but are considered part of the control context rather than part of */ + /* the integer context. */ + + DWORD Fir; + DWORD Psr; + + /* The flags values within this flag control the contents of */ + /* a CONTEXT record. */ + + /* If the context record is used as an input parameter, then */ + /* for each portion of the context record controlled by a flag */ + /* whose value is set, it is assumed that that portion of the */ + /* context record contains valid context. If the context record */ + /* is being used to modify a thread's context, then only that */ + /* portion of the threads context will be modified. */ + + /* If the context record is used as an IN OUT parameter to capture */ + /* the context of a thread, then only those portions of the thread's */ + /* context corresponding to set flags will be returned. */ + + /* The context record is never used as an OUT only parameter. */ + + DWORD ContextFlags; + + DWORD Fill[2]; + +} CONTEXT; +#elif defined(ARM) + +/* The following flags control the contents of the CONTEXT structure. */ + +#define CONTEXT_ARM 0x0000040 +#define CONTEXT_CONTROL (CONTEXT_ARM | 0x00000001L) +#define CONTEXT_INTEGER (CONTEXT_ARM | 0x00000002L) + +#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER) + +typedef struct _CONTEXT { + /* The flags values within this flag control the contents of + a CONTEXT record. + + If the context record is used as an input parameter, then + for each portion of the context record controlled by a flag + whose value is set, it is assumed that that portion of the + context record contains valid context. If the context record + is being used to modify a thread's context, then only that + portion of the threads context will be modified. + + If the context record is used as an IN OUT parameter to capture + the context of a thread, then only those portions of the thread's + context corresponding to set flags will be returned. + + The context record is never used as an OUT only parameter. */ + + ULONG ContextFlags; + + /* This section is specified/returned if the ContextFlags word contains + the flag CONTEXT_INTEGER. */ + ULONG R0; + ULONG R1; + ULONG R2; + ULONG R3; + ULONG R4; + ULONG R5; + ULONG R6; + ULONG R7; + ULONG R8; + ULONG R9; + ULONG R10; + ULONG R11; + ULONG R12; + + ULONG Sp; + ULONG Lr; + ULONG Pc; + ULONG Psr; +} CONTEXT; + +#else +#error "undefined processor type" +#endif +typedef CONTEXT *PCONTEXT,*LPCONTEXT; +typedef struct _EXCEPTION_RECORD { + DWORD ExceptionCode; + DWORD ExceptionFlags; + struct _EXCEPTION_RECORD *ExceptionRecord; + PVOID ExceptionAddress; + DWORD NumberParameters; + DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; +} EXCEPTION_RECORD,*PEXCEPTION_RECORD,*LPEXCEPTION_RECORD; +typedef struct _EXCEPTION_POINTERS { + PEXCEPTION_RECORD ExceptionRecord; + PCONTEXT ContextRecord; +} EXCEPTION_POINTERS,*PEXCEPTION_POINTERS,*LPEXCEPTION_POINTERS; +typedef union _LARGE_INTEGER { + struct { + DWORD LowPart; + LONG HighPart; + } u; +#if ! defined(NONAMELESSUNION) || defined(__cplusplus) + _ANONYMOUS_STRUCT struct { + DWORD LowPart; + LONG HighPart; + }; +#endif /* NONAMELESSUNION */ + LONGLONG QuadPart; +} LARGE_INTEGER, *PLARGE_INTEGER; +typedef union _ULARGE_INTEGER { + struct { + DWORD LowPart; + DWORD HighPart; + } u; +#if ! defined(NONAMELESSUNION) || defined(__cplusplus) + _ANONYMOUS_STRUCT struct { + DWORD LowPart; + DWORD HighPart; + }; +#endif /* NONAMELESSUNION */ + ULONGLONG QuadPart; +} ULARGE_INTEGER, *PULARGE_INTEGER; +typedef LARGE_INTEGER LUID,*PLUID; +#pragma pack(push,4) +typedef struct _LUID_AND_ATTRIBUTES { + LUID Luid; + DWORD Attributes; +} LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES; +#pragma pack(pop) +typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY]; +typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY; +typedef struct _PRIVILEGE_SET { + DWORD PrivilegeCount; + DWORD Control; + LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY]; +} PRIVILEGE_SET,*PPRIVILEGE_SET; +typedef struct _SECURITY_ATTRIBUTES { + DWORD nLength; + LPVOID lpSecurityDescriptor; + BOOL bInheritHandle; +} SECURITY_ATTRIBUTES,*PSECURITY_ATTRIBUTES,*LPSECURITY_ATTRIBUTES; +typedef enum _SECURITY_IMPERSONATION_LEVEL { + SecurityAnonymous, + SecurityIdentification, + SecurityImpersonation, + SecurityDelegation +} SECURITY_IMPERSONATION_LEVEL,*PSECURITY_IMPERSONATION_LEVEL; +typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE,*PSECURITY_CONTEXT_TRACKING_MODE; +typedef struct _SECURITY_QUALITY_OF_SERVICE { + DWORD Length; + SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; + SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode; + BOOLEAN EffectiveOnly; +} SECURITY_QUALITY_OF_SERVICE,*PSECURITY_QUALITY_OF_SERVICE; +typedef PVOID PACCESS_TOKEN; +typedef struct _SE_IMPERSONATION_STATE { + PACCESS_TOKEN Token; + BOOLEAN CopyOnOpen; + BOOLEAN EffectiveOnly; + SECURITY_IMPERSONATION_LEVEL Level; +} SE_IMPERSONATION_STATE,*PSE_IMPERSONATION_STATE; +typedef struct _SID_IDENTIFIER_AUTHORITY { + BYTE Value[6]; +} SID_IDENTIFIER_AUTHORITY,*PSID_IDENTIFIER_AUTHORITY,*LPSID_IDENTIFIER_AUTHORITY; +typedef PVOID PSID; +typedef struct _SID { + BYTE Revision; + BYTE SubAuthorityCount; + SID_IDENTIFIER_AUTHORITY IdentifierAuthority; + DWORD SubAuthority[ANYSIZE_ARRAY]; +} SID, *PISID; +typedef struct _SID_AND_ATTRIBUTES { + PSID Sid; + DWORD Attributes; +} SID_AND_ATTRIBUTES, *PSID_AND_ATTRIBUTES; +typedef SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY]; +typedef SID_AND_ATTRIBUTES_ARRAY *PSID_AND_ATTRIBUTES_ARRAY; +typedef struct _TOKEN_SOURCE { + CHAR SourceName[TOKEN_SOURCE_LENGTH]; + LUID SourceIdentifier; +} TOKEN_SOURCE,*PTOKEN_SOURCE; +typedef struct _TOKEN_CONTROL { + LUID TokenId; + LUID AuthenticationId; + LUID ModifiedId; + TOKEN_SOURCE TokenSource; +} TOKEN_CONTROL,*PTOKEN_CONTROL; +typedef struct _TOKEN_DEFAULT_DACL { + PACL DefaultDacl; +} TOKEN_DEFAULT_DACL,*PTOKEN_DEFAULT_DACL; +typedef struct _TOKEN_GROUPS { + DWORD GroupCount; + SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY]; +} TOKEN_GROUPS,*PTOKEN_GROUPS,*LPTOKEN_GROUPS; +typedef struct _TOKEN_OWNER { + PSID Owner; +} TOKEN_OWNER,*PTOKEN_OWNER; +typedef struct _TOKEN_PRIMARY_GROUP { + PSID PrimaryGroup; +} TOKEN_PRIMARY_GROUP,*PTOKEN_PRIMARY_GROUP; +typedef struct _TOKEN_PRIVILEGES { + DWORD PrivilegeCount; + LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY]; +} TOKEN_PRIVILEGES,*PTOKEN_PRIVILEGES,*LPTOKEN_PRIVILEGES; +typedef enum tagTOKEN_TYPE { + TokenPrimary = 1, + TokenImpersonation +} TOKEN_TYPE,*PTOKEN_TYPE; +typedef struct _TOKEN_STATISTICS { + LUID TokenId; + LUID AuthenticationId; + LARGE_INTEGER ExpirationTime; + TOKEN_TYPE TokenType; + SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; + DWORD DynamicCharged; + DWORD DynamicAvailable; + DWORD GroupCount; + DWORD PrivilegeCount; + LUID ModifiedId; +} TOKEN_STATISTICS, *PTOKEN_STATISTICS; +typedef struct _TOKEN_USER { + SID_AND_ATTRIBUTES User; +} TOKEN_USER, *PTOKEN_USER; +typedef DWORD SECURITY_INFORMATION,*PSECURITY_INFORMATION; +typedef WORD SECURITY_DESCRIPTOR_CONTROL,*PSECURITY_DESCRIPTOR_CONTROL; +typedef struct _SECURITY_DESCRIPTOR { + BYTE Revision; + BYTE Sbz1; + SECURITY_DESCRIPTOR_CONTROL Control; + PSID Owner; + PSID Group; + PACL Sacl; + PACL Dacl; +} SECURITY_DESCRIPTOR, *PSECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR; +typedef enum _TOKEN_INFORMATION_CLASS { + TokenUser=1,TokenGroups,TokenPrivileges,TokenOwner, + TokenPrimaryGroup,TokenDefaultDacl,TokenSource,TokenType, + TokenImpersonationLevel,TokenStatistics,TokenRestrictedSids, + TokenSessionId +} TOKEN_INFORMATION_CLASS; +typedef enum _SID_NAME_USE { + SidTypeUser=1,SidTypeGroup,SidTypeDomain,SidTypeAlias, + SidTypeWellKnownGroup,SidTypeDeletedAccount,SidTypeInvalid, + SidTypeUnknown +} SID_NAME_USE,*PSID_NAME_USE; +typedef struct _QUOTA_LIMITS { + SIZE_T PagedPoolLimit; + SIZE_T NonPagedPoolLimit; + SIZE_T MinimumWorkingSetSize; + SIZE_T MaximumWorkingSetSize; + SIZE_T PagefileLimit; + LARGE_INTEGER TimeLimit; +} QUOTA_LIMITS,*PQUOTA_LIMITS; +typedef struct _IO_COUNTERS { + ULONGLONG ReadOperationCount; + ULONGLONG WriteOperationCount; + ULONGLONG OtherOperationCount; + ULONGLONG ReadTransferCount; + ULONGLONG WriteTransferCount; + ULONGLONG OtherTransferCount; +} IO_COUNTERS, *PIO_COUNTERS; +typedef struct _FILE_NOTIFY_INFORMATION { + DWORD NextEntryOffset; + DWORD Action; + DWORD FileNameLength; + WCHAR FileName[1]; +} FILE_NOTIFY_INFORMATION,*PFILE_NOTIFY_INFORMATION; +typedef struct _TAPE_ERASE { + DWORD Type; + BOOLEAN Immediate; +} TAPE_ERASE,*PTAPE_ERASE; +typedef struct _TAPE_GET_DRIVE_PARAMETERS { + BOOLEAN ECC; + BOOLEAN Compression; + BOOLEAN DataPadding; + BOOLEAN ReportSetmarks; + DWORD DefaultBlockSize; + DWORD MaximumBlockSize; + DWORD MinimumBlockSize; + DWORD MaximumPartitionCount; + DWORD FeaturesLow; + DWORD FeaturesHigh; + DWORD EOTWarningZoneSize; +} TAPE_GET_DRIVE_PARAMETERS,*PTAPE_GET_DRIVE_PARAMETERS; +typedef struct _TAPE_GET_MEDIA_PARAMETERS { + LARGE_INTEGER Capacity; + LARGE_INTEGER Remaining; + DWORD BlockSize; + DWORD PartitionCount; + BOOLEAN WriteProtected; +} TAPE_GET_MEDIA_PARAMETERS,*PTAPE_GET_MEDIA_PARAMETERS; +typedef struct _TAPE_GET_POSITION { + ULONG Type; + ULONG Partition; + ULONG OffsetLow; + ULONG OffsetHigh; +} TAPE_GET_POSITION,*PTAPE_GET_POSITION; +typedef struct _TAPE_PREPARE { + DWORD Operation; + BOOLEAN Immediate; +} TAPE_PREPARE,*PTAPE_PREPARE; +typedef struct _TAPE_SET_DRIVE_PARAMETERS { + BOOLEAN ECC; + BOOLEAN Compression; + BOOLEAN DataPadding; + BOOLEAN ReportSetmarks; + ULONG EOTWarningZoneSize; +} TAPE_SET_DRIVE_PARAMETERS,*PTAPE_SET_DRIVE_PARAMETERS; +typedef struct _TAPE_SET_MEDIA_PARAMETERS { + ULONG BlockSize; +} TAPE_SET_MEDIA_PARAMETERS,*PTAPE_SET_MEDIA_PARAMETERS; +typedef struct _TAPE_SET_POSITION { + DWORD Method; + DWORD Partition; + LARGE_INTEGER Offset; + BOOLEAN Immediate; +} TAPE_SET_POSITION,*PTAPE_SET_POSITION; +typedef struct _TAPE_WRITE_MARKS { + DWORD Type; + DWORD Count; + BOOLEAN Immediate; +} TAPE_WRITE_MARKS,*PTAPE_WRITE_MARKS; +typedef struct _TAPE_CREATE_PARTITION { + DWORD Method; + DWORD Count; + DWORD Size; +} TAPE_CREATE_PARTITION,*PTAPE_CREATE_PARTITION; +typedef struct _MEMORY_BASIC_INFORMATION { + PVOID BaseAddress; + PVOID AllocationBase; + DWORD AllocationProtect; + DWORD RegionSize; + DWORD State; + DWORD Protect; + DWORD Type; +} MEMORY_BASIC_INFORMATION,*PMEMORY_BASIC_INFORMATION; +typedef struct _MESSAGE_RESOURCE_ENTRY { + WORD Length; + WORD Flags; + BYTE Text[1]; +} MESSAGE_RESOURCE_ENTRY,*PMESSAGE_RESOURCE_ENTRY; +typedef struct _MESSAGE_RESOURCE_BLOCK { + DWORD LowId; + DWORD HighId; + DWORD OffsetToEntries; +} MESSAGE_RESOURCE_BLOCK,*PMESSAGE_RESOURCE_BLOCK; +typedef struct _MESSAGE_RESOURCE_DATA { + DWORD NumberOfBlocks; + MESSAGE_RESOURCE_BLOCK Blocks[1]; +} MESSAGE_RESOURCE_DATA,*PMESSAGE_RESOURCE_DATA; +typedef struct _LIST_ENTRY { + struct _LIST_ENTRY *Flink; + struct _LIST_ENTRY *Blink; +} LIST_ENTRY,*PLIST_ENTRY; +typedef struct _SINGLE_LIST_ENTRY { + struct _SINGLE_LIST_ENTRY *Next; +} SINGLE_LIST_ENTRY,*PSINGLE_LIST_ENTRY; + +#ifndef _SLIST_HEADER_ +#define _SLIST_HEADER_ +#define SLIST_ENTRY SINGLE_LIST_ENTRY +#define _SLIST_ENTRY _SINGLE_LIST_ENTRY +#define PSLIST_ENTRY PSINGLE_LIST_ENTRY +typedef union _SLIST_HEADER { + ULONGLONG Alignment; + _ANONYMOUS_STRUCT struct { + SLIST_ENTRY Next; + WORD Depth; + WORD Sequence; + } DUMMYSTRUCTNAME; +} SLIST_HEADER,*PSLIST_HEADER; +#endif /* !_SLIST_HEADER_ */ + +typedef struct _RTL_CRITICAL_SECTION_DEBUG { + WORD Type; + WORD CreatorBackTraceIndex; + struct _RTL_CRITICAL_SECTION *CriticalSection; + LIST_ENTRY ProcessLocksList; + DWORD EntryCount; + DWORD ContentionCount; + DWORD Spare[2]; +} RTL_CRITICAL_SECTION_DEBUG,*PRTL_CRITICAL_SECTION_DEBUG; +typedef struct _RTL_CRITICAL_SECTION { + PRTL_CRITICAL_SECTION_DEBUG DebugInfo; + LONG LockCount; + LONG RecursionCount; + HANDLE OwningThread; + HANDLE LockSemaphore; + DWORD Reserved; +} RTL_CRITICAL_SECTION,*PRTL_CRITICAL_SECTION; +typedef struct _EVENTLOGRECORD { + DWORD Length; + DWORD Reserved; + DWORD RecordNumber; + DWORD TimeGenerated; + DWORD TimeWritten; + DWORD EventID; + WORD EventType; + WORD NumStrings; + WORD EventCategory; + WORD ReservedFlags; + DWORD ClosingRecordNumber; + DWORD StringOffset; + DWORD UserSidLength; + DWORD UserSidOffset; + DWORD DataLength; + DWORD DataOffset; +} EVENTLOGRECORD,*PEVENTLOGRECORD; +typedef struct _OSVERSIONINFOA { + DWORD dwOSVersionInfoSize; + DWORD dwMajorVersion; + DWORD dwMinorVersion; + DWORD dwBuildNumber; + DWORD dwPlatformId; + CHAR szCSDVersion[128]; +} OSVERSIONINFOA,*POSVERSIONINFOA,*LPOSVERSIONINFOA; +typedef struct _OSVERSIONINFOW { + DWORD dwOSVersionInfoSize; + DWORD dwMajorVersion; + DWORD dwMinorVersion; + DWORD dwBuildNumber; + DWORD dwPlatformId; + WCHAR szCSDVersion[128]; +} OSVERSIONINFOW,*POSVERSIONINFOW,*LPOSVERSIONINFOW; +typedef struct _OSVERSIONINFOEXA { + DWORD dwOSVersionInfoSize; + DWORD dwMajorVersion; + DWORD dwMinorVersion; + DWORD dwBuildNumber; + DWORD dwPlatformId; + CHAR szCSDVersion[128]; + WORD wServicePackMajor; + WORD wServicePackMinor; + WORD wSuiteMask; + BYTE wProductType; + BYTE wReserved; +} OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA; +typedef struct _OSVERSIONINFOEXW { + DWORD dwOSVersionInfoSize; + DWORD dwMajorVersion; + DWORD dwMinorVersion; + DWORD dwBuildNumber; + DWORD dwPlatformId; + WCHAR szCSDVersion[128]; + WORD wServicePackMajor; + WORD wServicePackMinor; + WORD wSuiteMask; + BYTE wProductType; + BYTE wReserved; +} OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW; +#pragma pack(push,2) +typedef struct _IMAGE_VXD_HEADER { + WORD e32_magic; + BYTE e32_border; + BYTE e32_worder; + DWORD e32_level; + WORD e32_cpu; + WORD e32_os; + DWORD e32_ver; + DWORD e32_mflags; + DWORD e32_mpages; + DWORD e32_startobj; + DWORD e32_eip; + DWORD e32_stackobj; + DWORD e32_esp; + DWORD e32_pagesize; + DWORD e32_lastpagesize; + DWORD e32_fixupsize; + DWORD e32_fixupsum; + DWORD e32_ldrsize; + DWORD e32_ldrsum; + DWORD e32_objtab; + DWORD e32_objcnt; + DWORD e32_objmap; + DWORD e32_itermap; + DWORD e32_rsrctab; + DWORD e32_rsrccnt; + DWORD e32_restab; + DWORD e32_enttab; + DWORD e32_dirtab; + DWORD e32_dircnt; + DWORD e32_fpagetab; + DWORD e32_frectab; + DWORD e32_impmod; + DWORD e32_impmodcnt; + DWORD e32_impproc; + DWORD e32_pagesum; + DWORD e32_datapage; + DWORD e32_preload; + DWORD e32_nrestab; + DWORD e32_cbnrestab; + DWORD e32_nressum; + DWORD e32_autodata; + DWORD e32_debuginfo; + DWORD e32_debuglen; + DWORD e32_instpreload; + DWORD e32_instdemand; + DWORD e32_heapsize; + BYTE e32_res3[12]; + DWORD e32_winresoff; + DWORD e32_winreslen; + WORD e32_devid; + WORD e32_ddkver; +} IMAGE_VXD_HEADER,*PIMAGE_VXD_HEADER; +#pragma pack(pop) +#pragma pack(push,4) +typedef struct _IMAGE_FILE_HEADER { + WORD Machine; + WORD NumberOfSections; + DWORD TimeDateStamp; + DWORD PointerToSymbolTable; + DWORD NumberOfSymbols; + WORD SizeOfOptionalHeader; + WORD Characteristics; +} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; +typedef struct _IMAGE_DATA_DIRECTORY { + DWORD VirtualAddress; + DWORD Size; +} IMAGE_DATA_DIRECTORY,*PIMAGE_DATA_DIRECTORY; +typedef struct _IMAGE_OPTIONAL_HEADER { + WORD Magic; + BYTE MajorLinkerVersion; + BYTE MinorLinkerVersion; + DWORD SizeOfCode; + DWORD SizeOfInitializedData; + DWORD SizeOfUninitializedData; + DWORD AddressOfEntryPoint; + DWORD BaseOfCode; + DWORD BaseOfData; + DWORD ImageBase; + DWORD SectionAlignment; + DWORD FileAlignment; + WORD MajorOperatingSystemVersion; + WORD MinorOperatingSystemVersion; + WORD MajorImageVersion; + WORD MinorImageVersion; + WORD MajorSubsystemVersion; + WORD MinorSubsystemVersion; + DWORD Reserved1; + DWORD SizeOfImage; + DWORD SizeOfHeaders; + DWORD CheckSum; + WORD Subsystem; + WORD DllCharacteristics; + DWORD SizeOfStackReserve; + DWORD SizeOfStackCommit; + DWORD SizeOfHeapReserve; + DWORD SizeOfHeapCommit; + DWORD LoaderFlags; + DWORD NumberOfRvaAndSizes; + IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; +} IMAGE_OPTIONAL_HEADER,*PIMAGE_OPTIONAL_HEADER; +typedef struct _IMAGE_ROM_OPTIONAL_HEADER { + WORD Magic; + BYTE MajorLinkerVersion; + BYTE MinorLinkerVersion; + DWORD SizeOfCode; + DWORD SizeOfInitializedData; + DWORD SizeOfUninitializedData; + DWORD AddressOfEntryPoint; + DWORD BaseOfCode; + DWORD BaseOfData; + DWORD BaseOfBss; + DWORD GprMask; + DWORD CprMask[4]; + DWORD GpValue; +} IMAGE_ROM_OPTIONAL_HEADER,*PIMAGE_ROM_OPTIONAL_HEADER; +#pragma pack(pop) +#pragma pack(push,2) +typedef struct _IMAGE_DOS_HEADER { + WORD e_magic; + WORD e_cblp; + WORD e_cp; + WORD e_crlc; + WORD e_cparhdr; + WORD e_minalloc; + WORD e_maxalloc; + WORD e_ss; + WORD e_sp; + WORD e_csum; + WORD e_ip; + WORD e_cs; + WORD e_lfarlc; + WORD e_ovno; + WORD e_res[4]; + WORD e_oemid; + WORD e_oeminfo; + WORD e_res2[10]; + LONG e_lfanew; +} IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER; +typedef struct _IMAGE_OS2_HEADER { + WORD ne_magic; + CHAR ne_ver; + CHAR ne_rev; + WORD ne_enttab; + WORD ne_cbenttab; + LONG ne_crc; + WORD ne_flags; + WORD ne_autodata; + WORD ne_heap; + WORD ne_stack; + LONG ne_csip; + LONG ne_sssp; + WORD ne_cseg; + WORD ne_cmod; + WORD ne_cbnrestab; + WORD ne_segtab; + WORD ne_rsrctab; + WORD ne_restab; + WORD ne_modtab; + WORD ne_imptab; + LONG ne_nrestab; + WORD ne_cmovent; + WORD ne_align; + WORD ne_cres; + BYTE ne_exetyp; + BYTE ne_flagsothers; + WORD ne_pretthunks; + WORD ne_psegrefbytes; + WORD ne_swaparea; + WORD ne_expver; +} IMAGE_OS2_HEADER,*PIMAGE_OS2_HEADER; +#pragma pack(pop) +#pragma pack(push,4) +typedef struct _IMAGE_NT_HEADERS { + DWORD Signature; + IMAGE_FILE_HEADER FileHeader; + IMAGE_OPTIONAL_HEADER OptionalHeader; +} IMAGE_NT_HEADERS,*PIMAGE_NT_HEADERS; +typedef struct _IMAGE_ROM_HEADERS { + IMAGE_FILE_HEADER FileHeader; + IMAGE_ROM_OPTIONAL_HEADER OptionalHeader; +} IMAGE_ROM_HEADERS,*PIMAGE_ROM_HEADERS; +typedef struct _IMAGE_SECTION_HEADER { + BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; + union { + DWORD PhysicalAddress; + DWORD VirtualSize; + } Misc; + DWORD VirtualAddress; + DWORD SizeOfRawData; + DWORD PointerToRawData; + DWORD PointerToRelocations; + DWORD PointerToLinenumbers; + WORD NumberOfRelocations; + WORD NumberOfLinenumbers; + DWORD Characteristics; +} IMAGE_SECTION_HEADER,*PIMAGE_SECTION_HEADER; +#pragma pack(pop) +#pragma pack(push,2) +typedef struct _IMAGE_SYMBOL { + union { + BYTE ShortName[8]; + struct { + DWORD Short; + DWORD Long; + } Name; + PBYTE LongName[2]; + } N; + DWORD Value; + SHORT SectionNumber; + WORD Type; + BYTE StorageClass; + BYTE NumberOfAuxSymbols; +} IMAGE_SYMBOL,*PIMAGE_SYMBOL; +typedef union _IMAGE_AUX_SYMBOL { + struct { + DWORD TagIndex; + union { + struct { + WORD Linenumber; + WORD Size; + } LnSz; + DWORD TotalSize; + } Misc; + union { + struct { + DWORD PointerToLinenumber; + DWORD PointerToNextFunction; + } Function; + struct { + WORD Dimension[4]; + } Array; + } FcnAry; + WORD TvIndex; + } Sym; + struct { + BYTE Name[IMAGE_SIZEOF_SYMBOL]; + } File; + struct { + DWORD Length; + WORD NumberOfRelocations; + WORD NumberOfLinenumbers; + DWORD CheckSum; + SHORT Number; + BYTE Selection; + } Section; +} IMAGE_AUX_SYMBOL,*PIMAGE_AUX_SYMBOL; +typedef struct _IMAGE_COFF_SYMBOLS_HEADER { + DWORD NumberOfSymbols; + DWORD LvaToFirstSymbol; + DWORD NumberOfLinenumbers; + DWORD LvaToFirstLinenumber; + DWORD RvaToFirstByteOfCode; + DWORD RvaToLastByteOfCode; + DWORD RvaToFirstByteOfData; + DWORD RvaToLastByteOfData; +} IMAGE_COFF_SYMBOLS_HEADER,*PIMAGE_COFF_SYMBOLS_HEADER; +typedef struct _IMAGE_RELOCATION { + _ANONYMOUS_UNION union { + DWORD VirtualAddress; + DWORD RelocCount; + } DUMMYUNIONNAME; + DWORD SymbolTableIndex; + WORD Type; +} IMAGE_RELOCATION,*PIMAGE_RELOCATION; +#pragma pack(pop) +#pragma pack(push,4) +typedef struct _IMAGE_BASE_RELOCATION { + DWORD VirtualAddress; + DWORD SizeOfBlock; +} IMAGE_BASE_RELOCATION,*PIMAGE_BASE_RELOCATION; +#pragma pack(pop) +#pragma pack(push,2) +typedef struct _IMAGE_LINENUMBER { + union { + DWORD SymbolTableIndex; + DWORD VirtualAddress; + } Type; + WORD Linenumber; +} IMAGE_LINENUMBER,*PIMAGE_LINENUMBER; +#pragma pack(pop) +#pragma pack(push,4) +typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER { + BYTE Name[16]; + BYTE Date[12]; + BYTE UserID[6]; + BYTE GroupID[6]; + BYTE Mode[8]; + BYTE Size[10]; + BYTE EndHeader[2]; +} IMAGE_ARCHIVE_MEMBER_HEADER,*PIMAGE_ARCHIVE_MEMBER_HEADER; +typedef struct _IMAGE_EXPORT_DIRECTORY { + DWORD Characteristics; + DWORD TimeDateStamp; + WORD MajorVersion; + WORD MinorVersion; + DWORD Name; + DWORD Base; + DWORD NumberOfFunctions; + DWORD NumberOfNames; + PDWORD *AddressOfFunctions; + PDWORD *AddressOfNames; + PWORD *AddressOfNameOrdinals; +} IMAGE_EXPORT_DIRECTORY,*PIMAGE_EXPORT_DIRECTORY; +typedef struct _IMAGE_IMPORT_BY_NAME { + WORD Hint; + BYTE Name[1]; +} IMAGE_IMPORT_BY_NAME,*PIMAGE_IMPORT_BY_NAME; +typedef struct _IMAGE_THUNK_DATA { + union { + PBYTE ForwarderString; + PDWORD Function; + DWORD Ordinal; + PIMAGE_IMPORT_BY_NAME AddressOfData; + } u1; +} IMAGE_THUNK_DATA,*PIMAGE_THUNK_DATA; +typedef struct _IMAGE_IMPORT_DESCRIPTOR { + _ANONYMOUS_UNION union { + DWORD Characteristics; + PIMAGE_THUNK_DATA OriginalFirstThunk; + } DUMMYUNIONNAME; + DWORD TimeDateStamp; + DWORD ForwarderChain; + DWORD Name; + PIMAGE_THUNK_DATA FirstThunk; +} IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR; +typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR { + DWORD TimeDateStamp; + WORD OffsetModuleName; + WORD NumberOfModuleForwarderRefs; +} IMAGE_BOUND_IMPORT_DESCRIPTOR,*PIMAGE_BOUND_IMPORT_DESCRIPTOR; +typedef struct _IMAGE_BOUND_FORWARDER_REF { + DWORD TimeDateStamp; + WORD OffsetModuleName; + WORD Reserved; +} IMAGE_BOUND_FORWARDER_REF,*PIMAGE_BOUND_FORWARDER_REF; +typedef void(NTAPI *PIMAGE_TLS_CALLBACK)(PVOID,DWORD,PVOID); +typedef struct _IMAGE_TLS_DIRECTORY { + DWORD StartAddressOfRawData; + DWORD EndAddressOfRawData; + PDWORD AddressOfIndex; + PIMAGE_TLS_CALLBACK *AddressOfCallBacks; + DWORD SizeOfZeroFill; + DWORD Characteristics; +} IMAGE_TLS_DIRECTORY,*PIMAGE_TLS_DIRECTORY; +typedef struct _IMAGE_RESOURCE_DIRECTORY { + DWORD Characteristics; + DWORD TimeDateStamp; + WORD MajorVersion; + WORD MinorVersion; + WORD NumberOfNamedEntries; + WORD NumberOfIdEntries; +} IMAGE_RESOURCE_DIRECTORY,*PIMAGE_RESOURCE_DIRECTORY; +_ANONYMOUS_STRUCT typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY { + _ANONYMOUS_UNION union { + _ANONYMOUS_STRUCT struct { + DWORD NameOffset:31; + DWORD NameIsString:1; + }DUMMYSTRUCTNAME; + DWORD Name; + WORD Id; + } DUMMYUNIONNAME; + _ANONYMOUS_UNION union { + DWORD OffsetToData; + _ANONYMOUS_STRUCT struct { + DWORD OffsetToDirectory:31; + DWORD DataIsDirectory:1; + } DUMMYSTRUCTNAME2; + } DUMMYUNIONNAME2; +} IMAGE_RESOURCE_DIRECTORY_ENTRY,*PIMAGE_RESOURCE_DIRECTORY_ENTRY; +typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING { + WORD Length; + CHAR NameString[1]; +} IMAGE_RESOURCE_DIRECTORY_STRING,*PIMAGE_RESOURCE_DIRECTORY_STRING; +typedef struct _IMAGE_RESOURCE_DIR_STRING_U { + WORD Length; + WCHAR NameString[1]; +} IMAGE_RESOURCE_DIR_STRING_U,*PIMAGE_RESOURCE_DIR_STRING_U; +typedef struct _IMAGE_RESOURCE_DATA_ENTRY { + DWORD OffsetToData; + DWORD Size; + DWORD CodePage; + DWORD Reserved; +} IMAGE_RESOURCE_DATA_ENTRY,*PIMAGE_RESOURCE_DATA_ENTRY; +typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY { + DWORD Characteristics; + DWORD TimeDateStamp; + WORD MajorVersion; + WORD MinorVersion; + DWORD GlobalFlagsClear; + DWORD GlobalFlagsSet; + DWORD CriticalSectionDefaultTimeout; + DWORD DeCommitFreeBlockThreshold; + DWORD DeCommitTotalFreeThreshold; + PVOID LockPrefixTable; + DWORD MaximumAllocationSize; + DWORD VirtualMemoryThreshold; + DWORD ProcessHeapFlags; + DWORD Reserved[4]; +} IMAGE_LOAD_CONFIG_DIRECTORY,*PIMAGE_LOAD_CONFIG_DIRECTORY; +typedef struct _IMAGE_RUNTIME_FUNCTION_ENTRY { + DWORD BeginAddress; + DWORD EndAddress; + PVOID ExceptionHandler; + PVOID HandlerData; + DWORD PrologEndAddress; +} IMAGE_RUNTIME_FUNCTION_ENTRY,*PIMAGE_RUNTIME_FUNCTION_ENTRY; +typedef struct _IMAGE_DEBUG_DIRECTORY { + DWORD Characteristics; + DWORD TimeDateStamp; + WORD MajorVersion; + WORD MinorVersion; + DWORD Type; + DWORD SizeOfData; + DWORD AddressOfRawData; + DWORD PointerToRawData; +} IMAGE_DEBUG_DIRECTORY,*PIMAGE_DEBUG_DIRECTORY; +typedef struct _FPO_DATA { + DWORD ulOffStart; + DWORD cbProcSize; + DWORD cdwLocals; + WORD cdwParams; + WORD cbProlog:8; + WORD cbRegs:3; + WORD fHasSEH:1; + WORD fUseBP:1; + WORD reserved:1; + WORD cbFrame:2; +} FPO_DATA,*PFPO_DATA; +typedef struct _IMAGE_DEBUG_MISC { + DWORD DataType; + DWORD Length; + BOOLEAN Unicode; + BYTE Reserved[3]; + BYTE Data[1]; +} IMAGE_DEBUG_MISC,*PIMAGE_DEBUG_MISC; +typedef struct _IMAGE_FUNCTION_ENTRY { + DWORD StartingAddress; + DWORD EndingAddress; + DWORD EndOfPrologue; +} IMAGE_FUNCTION_ENTRY,*PIMAGE_FUNCTION_ENTRY; +typedef struct _IMAGE_SEPARATE_DEBUG_HEADER { + WORD Signature; + WORD Flags; + WORD Machine; + WORD Characteristics; + DWORD TimeDateStamp; + DWORD CheckSum; + DWORD ImageBase; + DWORD SizeOfImage; + DWORD NumberOfSections; + DWORD ExportedNamesSize; + DWORD DebugDirectorySize; + DWORD SectionAlignment; + DWORD Reserved[2]; +} IMAGE_SEPARATE_DEBUG_HEADER,*PIMAGE_SEPARATE_DEBUG_HEADER; +#pragma pack(pop) +typedef enum _CM_SERVICE_NODE_TYPE { + DriverType=SERVICE_KERNEL_DRIVER, + FileSystemType=SERVICE_FILE_SYSTEM_DRIVER, + Win32ServiceOwnProcess=SERVICE_WIN32_OWN_PROCESS, + Win32ServiceShareProcess=SERVICE_WIN32_SHARE_PROCESS, + AdapterType=SERVICE_ADAPTER, + RecognizerType=SERVICE_RECOGNIZER_DRIVER +} SERVICE_NODE_TYPE; +typedef enum _CM_SERVICE_LOAD_TYPE { + BootLoad=SERVICE_BOOT_START, + SystemLoad=SERVICE_SYSTEM_START, + AutoLoad=SERVICE_AUTO_START, + DemandLoad=SERVICE_DEMAND_START, + DisableLoad=SERVICE_DISABLED +} SERVICE_LOAD_TYPE; +typedef enum _CM_ERROR_CONTROL_TYPE { + IgnoreError=SERVICE_ERROR_IGNORE, + NormalError=SERVICE_ERROR_NORMAL, + SevereError=SERVICE_ERROR_SEVERE, + CriticalError=SERVICE_ERROR_CRITICAL +} SERVICE_ERROR_TYPE; +typedef struct _NT_TIB { + struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList; + PVOID StackBase; + PVOID StackLimit; + PVOID SubSystemTib; + _ANONYMOUS_UNION union { + PVOID FiberData; + DWORD Version; + } DUMMYUNIONNAME; + PVOID ArbitraryUserPointer; + struct _NT_TIB *Self; +} NT_TIB,*PNT_TIB; +typedef struct _REPARSE_DATA_BUFFER { + DWORD ReparseTag; + WORD ReparseDataLength; + WORD Reserved; + _ANONYMOUS_UNION union { + struct { + WORD SubstituteNameOffset; + WORD SubstituteNameLength; + WORD PrintNameOffset; + WORD PrintNameLength; + WCHAR PathBuffer[1]; + } SymbolicLinkReparseBuffer; + struct { + WORD SubstituteNameOffset; + WORD SubstituteNameLength; + WORD PrintNameOffset; + WORD PrintNameLength; + WCHAR PathBuffer[1]; + } MountPointReparseBuffer; + struct { + BYTE DataBuffer[1]; + } GenericReparseBuffer; + } DUMMYUNIONNAME; +} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER; +typedef struct _REPARSE_GUID_DATA_BUFFER { + DWORD ReparseTag; + WORD ReparseDataLength; + WORD Reserved; + GUID ReparseGuid; + struct { + BYTE DataBuffer[1]; + } GenericReparseBuffer; +} REPARSE_GUID_DATA_BUFFER, *PREPARSE_GUID_DATA_BUFFER; +typedef struct _REPARSE_POINT_INFORMATION { + WORD ReparseDataLength; + WORD UnparsedNameLength; +} REPARSE_POINT_INFORMATION, *PREPARSE_POINT_INFORMATION; + +typedef union _FILE_SEGMENT_ELEMENT { + PVOID64 Buffer; + ULONGLONG Alignment; +}FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT; + +/* JOBOBJECT_BASIC_LIMIT_INFORMATION.LimitFlags constants */ +#define JOB_OBJECT_LIMIT_WORKINGSET 0x0001 +#define JOB_OBJECT_LIMIT_PROCESS_TIME 0x0002 +#define JOB_OBJECT_LIMIT_JOB_TIME 0x0004 +#define JOB_OBJECT_LIMIT_ACTIVE_PROCESS 0x0008 +#define JOB_OBJECT_LIMIT_AFFINITY 0x0010 +#define JOB_OBJECT_LIMIT_PRIORITY_CLASS 0x0020 +#define JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME 0x0040 +#define JOB_OBJECT_LIMIT_SCHEDULING_CLASS 0x0080 +#define JOB_OBJECT_LIMIT_PROCESS_MEMORY 0x0100 +#define JOB_OBJECT_LIMIT_JOB_MEMORY 0x0200 +#define JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION 0x0400 +#define JOB_OBJECT_BREAKAWAY_OK 0x0800 +#define JOB_OBJECT_SILENT_BREAKAWAY 0x1000 + +/* JOBOBJECT_BASIC_UI_RESTRICTIONS.UIRestrictionsClass constants */ +#define JOB_OBJECT_UILIMIT_HANDLES 0x0001 +#define JOB_OBJECT_UILIMIT_READCLIPBOARD 0x0002 +#define JOB_OBJECT_UILIMIT_WRITECLIPBOARD 0x0004 +#define JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS 0x0008 +#define JOB_OBJECT_UILIMIT_DISPLAYSETTINGS 0x0010 +#define JOB_OBJECT_UILIMIT_GLOBALATOMS 0x0020 +#define JOB_OBJECT_UILIMIT_DESKTOP 0x0040 +#define JOB_OBJECT_UILIMIT_EXITWINDOWS 0x0080 + +/* JOBOBJECT_SECURITY_LIMIT_INFORMATION.SecurityLimitFlags constants */ +#define JOB_OBJECT_SECURITY_NO_ADMIN 0x0001 +#define JOB_OBJECT_SECURITY_RESTRICTED_TOKEN 0x0002 +#define JOB_OBJECT_SECURITY_ONLY_TOKEN 0x0004 +#define JOB_OBJECT_SECURITY_FILTER_TOKENS 0x0008 + +/* JOBOBJECT_END_OF_JOB_TIME_INFORMATION.EndOfJobTimeAction constants */ +#define JOB_OBJECT_TERMINATE_AT_END_OF_JOB 0 +#define JOB_OBJECT_POST_AT_END_OF_JOB 1 + +#define JOB_OBJECT_MSG_END_OF_JOB_TIME 1 +#define JOB_OBJECT_MSG_END_OF_PROCESS_TIME 2 +#define JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT 3 +#define JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO 4 +#define JOB_OBJECT_MSG_NEW_PROCESS 6 +#define JOB_OBJECT_MSG_EXIT_PROCESS 7 +#define JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS 8 +#define JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT 9 +#define JOB_OBJECT_MSG_JOB_MEMORY_LIMIT 10 + +typedef enum _JOBOBJECTINFOCLASS { + JobObjectBasicAccountingInformation = 1, + JobObjectBasicLimitInformation, + JobObjectBasicProcessIdList, + JobObjectBasicUIRestrictions, + JobObjectSecurityLimitInformation, + JobObjectEndOfJobTimeInformation, + JobObjectAssociateCompletionPortInformation, + JobObjectBasicAndIoAccountingInformation, + JobObjectExtendedLimitInformation, + JobObjectJobSetInformation, + MaxJobObjectInfoClass +} JOBOBJECTINFOCLASS; +typedef struct _JOBOBJECT_BASIC_ACCOUNTING_INFORMATION { + LARGE_INTEGER TotalUserTime; + LARGE_INTEGER TotalKernelTime; + LARGE_INTEGER ThisPeriodTotalUserTime; + LARGE_INTEGER ThisPeriodTotalKernelTime; + DWORD TotalPageFaultCount; + DWORD TotalProcesses; + DWORD ActiveProcesses; + DWORD TotalTerminatedProcesses; +} JOBOBJECT_BASIC_ACCOUNTING_INFORMATION,*PJOBOBJECT_BASIC_ACCOUNTING_INFORMATION; +typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION { + LARGE_INTEGER PerProcessUserTimeLimit; + LARGE_INTEGER PerJobUserTimeLimit; + DWORD LimitFlags; + SIZE_T MinimumWorkingSetSize; + SIZE_T MaximumWorkingSetSize; + DWORD ActiveProcessLimit; + ULONG_PTR Affinity; + DWORD PriorityClass; + DWORD SchedulingClass; +} JOBOBJECT_BASIC_LIMIT_INFORMATION,*PJOBOBJECT_BASIC_LIMIT_INFORMATION; +typedef struct _JOBOBJECT_BASIC_PROCESS_ID_LIST { + DWORD NumberOfAssignedProcesses; + DWORD NumberOfProcessIdsInList; + ULONG_PTR ProcessIdList[1]; +} JOBOBJECT_BASIC_PROCESS_ID_LIST, *PJOBOBJECT_BASIC_PROCESS_ID_LIST; +typedef struct _JOBOBJECT_BASIC_UI_RESTRICTIONS { + DWORD UIRestrictionsClass; +} JOBOBJECT_BASIC_UI_RESTRICTIONS,*PJOBOBJECT_BASIC_UI_RESTRICTIONS; +typedef struct _JOBOBJECT_SECURITY_LIMIT_INFORMATION { + DWORD SecurityLimitFlags; + HANDLE JobToken; + PTOKEN_GROUPS SidsToDisable; + PTOKEN_PRIVILEGES PrivilegesToDelete; + PTOKEN_GROUPS RestrictedSids; +} JOBOBJECT_SECURITY_LIMIT_INFORMATION,*PJOBOBJECT_SECURITY_LIMIT_INFORMATION; +typedef struct _JOBOBJECT_END_OF_JOB_TIME_INFORMATION { + DWORD EndOfJobTimeAction; +} JOBOBJECT_END_OF_JOB_TIME_INFORMATION,*PJOBOBJECT_END_OF_JOB_TIME_INFORMATION; +typedef struct _JOBOBJECT_ASSOCIATE_COMPLETION_PORT { + PVOID CompletionKey; + HANDLE CompletionPort; +} JOBOBJECT_ASSOCIATE_COMPLETION_PORT,*PJOBOBJECT_ASSOCIATE_COMPLETION_PORT; +typedef struct _JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION { + JOBOBJECT_BASIC_ACCOUNTING_INFORMATION BasicInfo; + IO_COUNTERS IoInfo; +} JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION,*PJOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION; +typedef struct _JOBOBJECT_EXTENDED_LIMIT_INFORMATION { + JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation; + IO_COUNTERS IoInfo; + SIZE_T ProcessMemoryLimit; + SIZE_T JobMemoryLimit; + SIZE_T PeakProcessMemoryUsed; + SIZE_T PeakJobMemoryUsed; +} JOBOBJECT_EXTENDED_LIMIT_INFORMATION,*PJOBOBJECT_EXTENDED_LIMIT_INFORMATION; +typedef struct _JOBOBJECT_JOBSET_INFORMATION { + DWORD MemberLevel; +} JOBOBJECT_JOBSET_INFORMATION,*PJOBOBJECT_JOBSET_INFORMATION; + +/* Fixme: Making these defines conditional on WINVER will break ddk includes */ +#if 1 /* (WINVER >= 0x0500) */ +#include <pshpack4.h> + +#define ES_SYSTEM_REQUIRED 0x00000001 +#define ES_DISPLAY_REQUIRED 0x00000002 +#define ES_USER_PRESENT 0x00000004 +#define ES_CONTINUOUS 0x80000000 + +typedef enum _LATENCY_TIME { + LT_DONT_CARE, + LT_LOWEST_LATENCY +} LATENCY_TIME, *PLATENCY_TIME; + +typedef enum _SYSTEM_POWER_STATE { + PowerSystemUnspecified, + PowerSystemWorking, + PowerSystemSleeping1, + PowerSystemSleeping2, + PowerSystemSleeping3, + PowerSystemHibernate, + PowerSystemShutdown, + PowerSystemMaximum +} SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE; +#define POWER_SYSTEM_MAXIMUM PowerSystemMaximum + +typedef enum { + PowerActionNone, + PowerActionReserved, + PowerActionSleep, + PowerActionHibernate, + PowerActionShutdown, + PowerActionShutdownReset, + PowerActionShutdownOff, + PowerActionWarmEject +} POWER_ACTION, *PPOWER_ACTION; + +typedef enum _DEVICE_POWER_STATE { + PowerDeviceUnspecified, + PowerDeviceD0, + PowerDeviceD1, + PowerDeviceD2, + PowerDeviceD3, + PowerDeviceMaximum +} DEVICE_POWER_STATE, *PDEVICE_POWER_STATE; + +typedef struct { + DWORD Granularity; + DWORD Capacity; +} BATTERY_REPORTING_SCALE, *PBATTERY_REPORTING_SCALE; + +typedef struct _POWER_ACTION_POLICY { + POWER_ACTION Action; + ULONG Flags; + ULONG EventCode; +} POWER_ACTION_POLICY, *PPOWER_ACTION_POLICY; + +/* POWER_ACTION_POLICY.Flags constants */ +#define POWER_ACTION_QUERY_ALLOWED 0x00000001 +#define POWER_ACTION_UI_ALLOWED 0x00000002 +#define POWER_ACTION_OVERRIDE_APPS 0x00000004 +#define POWER_ACTION_LIGHTEST_FIRST 0x10000000 +#define POWER_ACTION_LOCK_CONSOLE 0x20000000 +#define POWER_ACTION_DISABLE_WAKES 0x40000000 +#define POWER_ACTION_CRITICAL 0x80000000 + +/* POWER_ACTION_POLICY.EventCode constants */ +#define POWER_LEVEL_USER_NOTIFY_TEXT 0x00000001 +#define POWER_LEVEL_USER_NOTIFY_SOUND 0x00000002 +#define POWER_LEVEL_USER_NOTIFY_EXEC 0x00000004 +#define POWER_USER_NOTIFY_BUTTON 0x00000008 +#define POWER_USER_NOTIFY_SHUTDOWN 0x00000010 +#define POWER_FORCE_TRIGGER_RESET 0x80000000 + +#define DISCHARGE_POLICY_CRITICAL 0 +#define DISCHARGE_POLICY_LOW 1 +#define NUM_DISCHARGE_POLICIES 4 + +#define PO_THROTTLE_NONE 0 +#define PO_THROTTLE_CONSTANT 1 +#define PO_THROTTLE_DEGRADE 2 +#define PO_THROTTLE_ADAPTIVE 3 +#define PO_THROTTLE_MAXIMUM 4 + +typedef struct _SYSTEM_POWER_LEVEL { + BOOLEAN Enable; + UCHAR Spare[3]; + ULONG BatteryLevel; + POWER_ACTION_POLICY PowerPolicy; + SYSTEM_POWER_STATE MinSystemState; +} SYSTEM_POWER_LEVEL, *PSYSTEM_POWER_LEVEL; + +typedef struct _SYSTEM_POWER_POLICY { + ULONG Revision; + POWER_ACTION_POLICY PowerButton; + POWER_ACTION_POLICY SleepButton; + POWER_ACTION_POLICY LidClose; + SYSTEM_POWER_STATE LidOpenWake; + ULONG Reserved; + POWER_ACTION_POLICY Idle; + ULONG IdleTimeout; + UCHAR IdleSensitivity; + UCHAR DynamicThrottle; + UCHAR Spare2[2]; + SYSTEM_POWER_STATE MinSleep; + SYSTEM_POWER_STATE MaxSleep; + SYSTEM_POWER_STATE ReducedLatencySleep; + ULONG WinLogonFlags; + ULONG Spare3; + ULONG DozeS4Timeout; + ULONG BroadcastCapacityResolution; + SYSTEM_POWER_LEVEL DischargePolicy[NUM_DISCHARGE_POLICIES]; + ULONG VideoTimeout; + BOOLEAN VideoDimDisplay; + ULONG VideoReserved[3]; + ULONG SpindownTimeout; + BOOLEAN OptimizeForPower; + UCHAR FanThrottleTolerance; + UCHAR ForcedThrottle; + UCHAR MinThrottle; + POWER_ACTION_POLICY OverThrottled; +} SYSTEM_POWER_POLICY, *PSYSTEM_POWER_POLICY; + +typedef struct _SYSTEM_POWER_CAPABILITIES { + BOOLEAN PowerButtonPresent; + BOOLEAN SleepButtonPresent; + BOOLEAN LidPresent; + BOOLEAN SystemS1; + BOOLEAN SystemS2; + BOOLEAN SystemS3; + BOOLEAN SystemS4; + BOOLEAN SystemS5; + BOOLEAN HiberFilePresent; + BOOLEAN FullWake; + BOOLEAN VideoDimPresent; + BOOLEAN ApmPresent; + BOOLEAN UpsPresent; + BOOLEAN ThermalControl; + BOOLEAN ProcessorThrottle; + UCHAR ProcessorMinThrottle; + UCHAR ProcessorMaxThrottle; + UCHAR spare2[4]; + BOOLEAN DiskSpinDown; + UCHAR spare3[8]; + BOOLEAN SystemBatteriesPresent; + BOOLEAN BatteriesAreShortTerm; + BATTERY_REPORTING_SCALE BatteryScale[3]; + SYSTEM_POWER_STATE AcOnLineWake; + SYSTEM_POWER_STATE SoftLidWake; + SYSTEM_POWER_STATE RtcWake; + SYSTEM_POWER_STATE MinDeviceWakeState; + SYSTEM_POWER_STATE DefaultLowLatencyWake; +} SYSTEM_POWER_CAPABILITIES, *PSYSTEM_POWER_CAPABILITIES; + +typedef struct _SYSTEM_BATTERY_STATE { + BOOLEAN AcOnLine; + BOOLEAN BatteryPresent; + BOOLEAN Charging; + BOOLEAN Discharging; + BOOLEAN Spare1[4]; + ULONG MaxCapacity; + ULONG RemainingCapacity; + ULONG Rate; + ULONG EstimatedTime; + ULONG DefaultAlert1; + ULONG DefaultAlert2; +} SYSTEM_BATTERY_STATE, *PSYSTEM_BATTERY_STATE; + +typedef enum _POWER_INFORMATION_LEVEL { + SystemPowerPolicyAc, + SystemPowerPolicyDc, + VerifySystemPolicyAc, + VerifySystemPolicyDc, + SystemPowerCapabilities, + SystemBatteryState, + SystemPowerStateHandler, + ProcessorStateHandler, + SystemPowerPolicyCurrent, + AdministratorPowerPolicy, + SystemReserveHiberFile, + ProcessorInformation, + SystemPowerInformation, + ProcessorStateHandler2, + LastWakeTime, + LastSleepTime, + SystemExecutionState, + SystemPowerStateNotifyHandler, + ProcessorPowerPolicyAc, + ProcessorPowerPolicyDc, + VerifyProcessorPowerPolicyAc, + VerifyProcessorPowerPolicyDc, + ProcessorPowerPolicyCurrent +} POWER_INFORMATION_LEVEL; + +#if (_WIN32_WINNT >= 0x0500) +typedef LONG (WINAPI *PVECTORED_EXCEPTION_HANDLER)(PEXCEPTION_POINTERS); +#endif +#if 1 /* (WIN32_WINNT >= 0x0500) */ +typedef struct _SYSTEM_POWER_INFORMATION { + ULONG MaxIdlenessAllowed; + ULONG Idleness; + ULONG TimeRemaining; + UCHAR CoolingMode; +} SYSTEM_POWER_INFORMATION,*PSYSTEM_POWER_INFORMATION; +#endif + +#if (_WIN32_WINNT >= 0x0501) +typedef enum _HEAP_INFORMATION_CLASS { + HeapCompatibilityInformation +} HEAP_INFORMATION_CLASS; +typedef enum _ACTIVATION_CONTEXT_INFO_CLASS { + ActivationContextBasicInformation = 1, + ActivationContextDetailedInformation, + AssemblyDetailedInformationInActivationContext, + FileInformationInAssemblyOfAssemblyInActivationContext +} ACTIVATION_CONTEXT_INFO_CLASS; +typedef struct _ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION { + DWORD ulFlags; + DWORD ulEncodedAssemblyIdentityLength; + DWORD ulManifestPathType; + DWORD ulManifestPathLength; + LARGE_INTEGER liManifestLastWriteTime; + DWORD ulPolicyPathType; + DWORD ulPolicyPathLength; + LARGE_INTEGER liPolicyLastWriteTime; + DWORD ulMetadataSatelliteRosterIndex; + DWORD ulManifestVersionMajor; + DWORD ulManifestVersionMinor; + DWORD ulPolicyVersionMajor; + DWORD ulPolicyVersionMinor; + DWORD ulAssemblyDirectoryNameLength; + PCWSTR lpAssemblyEncodedAssemblyIdentity; + PCWSTR lpAssemblyManifestPath; + PCWSTR lpAssemblyPolicyPath; + PCWSTR lpAssemblyDirectoryName; +} ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION,*PACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION; +typedef const ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION *PCACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION; +typedef struct _ACTIVATION_CONTEXT_DETAILED_INFORMATION { + DWORD dwFlags; + DWORD ulFormatVersion; + DWORD ulAssemblyCount; + DWORD ulRootManifestPathType; + DWORD ulRootManifestPathChars; + DWORD ulRootConfigurationPathType; + DWORD ulRootConfigurationPathChars; + DWORD ulAppDirPathType; + DWORD ulAppDirPathChars; + PCWSTR lpRootManifestPath; + PCWSTR lpRootConfigurationPath; + PCWSTR lpAppDirPath; +} ACTIVATION_CONTEXT_DETAILED_INFORMATION,*PACTIVATION_CONTEXT_DETAILED_INFORMATION; +typedef const ACTIVATION_CONTEXT_DETAILED_INFORMATION *PCACTIVATION_CONTEXT_DETAILED_INFORMATION; +typedef struct _ACTIVATION_CONTEXT_QUERY_INDEX { + ULONG ulAssemblyIndex; + ULONG ulFileIndexInAssembly; +} ACTIVATION_CONTEXT_QUERY_INDEX,*PACTIVATION_CONTEXT_QUERY_INDEX; +typedef const ACTIVATION_CONTEXT_QUERY_INDEX *PCACTIVATION_CONTEXT_QUERY_INDEX; +typedef struct _ASSEMBLY_FILE_DETAILED_INFORMATION { + DWORD ulFlags; + DWORD ulFilenameLength; + DWORD ulPathLength; + PCWSTR lpFileName; + PCWSTR lpFilePath; +} ASSEMBLY_FILE_DETAILED_INFORMATION,*PASSEMBLY_FILE_DETAILED_INFORMATION; +typedef const ASSEMBLY_FILE_DETAILED_INFORMATION *PCASSEMBLY_FILE_DETAILED_INFORMATION; +#endif /* (WIN32_WINNT >= 0x0501) */ + +typedef struct _PROCESSOR_POWER_POLICY_INFO { + ULONG TimeCheck; + ULONG DemoteLimit; + ULONG PromoteLimit; + UCHAR DemotePercent; + UCHAR PromotePercent; + UCHAR Spare[2]; + ULONG AllowDemotion : 1; + ULONG AllowPromotion : 1; + ULONG Reserved : 30; +} PROCESSOR_POWER_POLICY_INFO, *PPROCESSOR_POWER_POLICY_INFO; +typedef struct _PROCESSOR_POWER_POLICY { + ULONG Revision; + UCHAR DynamicThrottle; + UCHAR Spare[3]; + ULONG Reserved; + ULONG PolicyCount; + PROCESSOR_POWER_POLICY_INFO Policy[3]; +} PROCESSOR_POWER_POLICY, *PPROCESSOR_POWER_POLICY; +typedef struct _ADMINISTRATOR_POWER_POLICY { + SYSTEM_POWER_STATE MinSleep; + SYSTEM_POWER_STATE MaxSleep; + ULONG MinVideoTimeout; + ULONG MaxVideoTimeout; + ULONG MinSpindownTimeout; + ULONG MaxSpindownTimeout; +} ADMINISTRATOR_POWER_POLICY, *PADMINISTRATOR_POWER_POLICY; +#include <poppack.h> +#endif /* WINVER >= 0x0500 */ + +typedef VOID (NTAPI *WAITORTIMERCALLBACKFUNC)(PVOID,BOOLEAN); + +#ifdef UNICODE +typedef OSVERSIONINFOW OSVERSIONINFO,*POSVERSIONINFO,*LPOSVERSIONINFO; +typedef OSVERSIONINFOEXW OSVERSIONINFOEX,*POSVERSIONINFOEX,*LPOSVERSIONINFOEX; +#else +typedef OSVERSIONINFOA OSVERSIONINFO,*POSVERSIONINFO,*LPOSVERSIONINFO; +typedef OSVERSIONINFOEXA OSVERSIONINFOEX,*POSVERSIONINFOEX,*LPOSVERSIONINFOEX; +#endif + +#if (WIN32_WINNT >= 0x0500) +ULONGLONG WINAPI VerSetConditionMask(ULONGLONG,DWORD,BYTE); +#endif + +#if defined(__GNUC__) + +PVOID GetCurrentFiber(void); +extern __inline__ PVOID GetCurrentFiber(void) +{ + void* ret; + __asm__ __volatile__ ( + "movl %%fs:0x10,%0" + : "=r" (ret) /* allow use of reg eax,ebx,ecx,edx,esi,edi */ + ); + return ret; +} + +PVOID GetFiberData(void); +extern __inline__ PVOID GetFiberData(void) +{ + void* ret; + __asm__ __volatile__ ( + "movl %%fs:0x10,%0\n" + "movl (%0),%0" + : "=r" (ret) /* allow use of reg eax,ebx,ecx,edx,esi,edi */ + ); + return ret; +} + +static __inline__ struct _TEB * NtCurrentTeb(void) +{ + struct _TEB *ret; + + __asm__ __volatile__ ( + "movl %%fs:0x18, %0\n" + : "=r" (ret) + : /* no inputs */ + ); + + return ret; +} + +#else + +extern PVOID GetCurrentFiber(void); +#pragma aux GetCurrentFiber = \ + "mov eax, dword ptr fs:0x10" \ + value [eax] \ + modify [eax]; + +extern PVOID GetFiberData(void); +#pragma aux GetFiberData = \ + "mov eax, dword ptr fs:0x10" \ + "mov eax, [eax]" \ + value [eax] \ + modify [eax]; + +#endif /* __GNUC__ */ + +#endif /* RC_INVOKED */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/winperf.h b/reactos/w32api/include/winperf.h new file mode 100644 index 00000000000..75e29a8ec72 --- /dev/null +++ b/reactos/w32api/include/winperf.h @@ -0,0 +1,139 @@ +#ifndef _WINPERF_H +#define _WINPERF_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define PERF_DATA_VERSION 1 +#define PERF_DATA_REVISION 1 +#define PERF_NO_INSTANCES -1 +#define PERF_SIZE_DWORD 0 +#define PERF_SIZE_LARGE 256 +#define PERF_SIZE_ZERO 512 +#define PERF_SIZE_VARIABLE_LEN 768 +#define PERF_TYPE_NUMBER 0 +#define PERF_TYPE_COUNTER 1024 +#define PERF_TYPE_TEXT 2048 +#define PERF_TYPE_ZERO 0xC00 +#define PERF_NUMBER_HEX 0 +#define PERF_NUMBER_DECIMAL 0x10000 +#define PERF_NUMBER_DEC_1000 0x20000 +#define PERF_COUNTER_VALUE 0 +#define PERF_COUNTER_RATE 0x10000 +#define PERF_COUNTER_FRACTION 0x20000 +#define PERF_COUNTER_BASE 0x30000 +#define PERF_COUNTER_ELAPSED 0x40000 +#define PERF_COUNTER_QUEUELEN 0x50000 +#define PERF_COUNTER_HISTOGRAM 0x60000 +#define PERF_TEXT_UNICODE 0 +#define PERF_TEXT_ASCII 0x10000 +#define PERF_TIMER_TICK 0 +#define PERF_TIMER_100NS 0x100000 +#define PERF_OBJECT_TIMER 0x200000 +#define PERF_DELTA_COUNTER 0x400000 +#define PERF_DELTA_BASE 0x800000 +#define PERF_INVERSE_COUNTER 0x1000000 +#define PERF_MULTI_COUNTER 0x2000000 +#define PERF_DISPLAY_NO_SUFFIX 0 +#define PERF_DISPLAY_PER_SEC 0x10000000 +#define PERF_DISPLAY_PERCENT 0x20000000 +#define PERF_DISPLAY_SECONDS 0x30000000 +#define PERF_DISPLAY_NOSHOW 0x40000000 +#define PERF_COUNTER_HISTOGRAM_TYPE 0x80000000 +#define PERF_NO_UNIQUE_ID (-1) +#define PERF_DETAIL_NOVICE 100 +#define PERF_DETAIL_ADVANCED 200 +#define PERF_DETAIL_EXPERT 300 +#define PERF_DETAIL_WIZARD 400 +#define PERF_COUNTER_COUNTER (PERF_SIZE_DWORD|PERF_TYPE_COUNTER|PERF_COUNTER_RATE|PERF_TIMER_TICK|PERF_DELTA_COUNTER|PERF_DISPLAY_PER_SEC) +#define PERF_COUNTER_TIMER (PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_RATE|PERF_TIMER_TICK|PERF_DELTA_COUNTER|PERF_DISPLAY_PERCENT) +#define PERF_COUNTER_QUEUELEN_TYPE (PERF_SIZE_DWORD|PERF_TYPE_COUNTER|PERF_COUNTER_QUEUELEN|PERF_TIMER_TICK|PERF_DELTA_COUNTER|PERF_DISPLAY_NO_SUFFIX) +#define PERF_COUNTER_BULK_COUNT (PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_RATE|PERF_TIMER_TICK|PERF_DELTA_COUNTER|PERF_DISPLAY_PER_SEC) +#define PERF_COUNTER_TEXT (PERF_SIZE_VARIABLE_LEN|PERF_TYPE_TEXT|PERF_TEXT_UNICODE|PERF_DISPLAY_NO_SUFFIX) +#define PERF_COUNTER_RAWCOUNT (PERF_SIZE_DWORD|PERF_TYPE_NUMBER|PERF_NUMBER_DECIMAL|PERF_DISPLAY_NO_SUFFIX) +#define PERF_COUNTER_LARGE_RAWCOUNT (PERF_SIZE_LARGE|PERF_TYPE_NUMBER|PERF_NUMBER_DECIMAL|PERF_DISPLAY_NO_SUFFIX) +#define PERF_COUNTER_RAWCOUNT_HEX (PERF_SIZE_DWORD|PERF_TYPE_NUMBER|PERF_NUMBER_HEX|PERF_DISPLAY_NO_SUFFIX) +#define PERF_COUNTER_LARGE_RAWCOUNT_HEX (PERF_SIZE_LARGE|PERF_TYPE_NUMBER|PERF_NUMBER_HEX|PERF_DISPLAY_NO_SUFFIX) +#define PERF_SAMPLE_FRACTION (PERF_SIZE_DWORD|PERF_TYPE_COUNTER|PERF_COUNTER_FRACTION|PERF_DELTA_COUNTER|PERF_DELTA_BASE|PERF_DISPLAY_PERCENT) +#define PERF_SAMPLE_COUNTER (PERF_SIZE_DWORD|PERF_TYPE_COUNTER|PERF_COUNTER_RATE|PERF_TIMER_TICK|PERF_DELTA_COUNTER|PERF_DISPLAY_NO_SUFFIX) +#define PERF_COUNTER_NODATA (PERF_SIZE_ZERO|PERF_DISPLAY_NOSHOW) +#define PERF_COUNTER_TIMER_INV (PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_RATE|PERF_TIMER_TICK|PERF_DELTA_COUNTER|PERF_INVERSE_COUNTER|PERF_DISPLAY_PERCENT) +#define PERF_SAMPLE_BASE (PERF_SIZE_DWORD|PERF_TYPE_COUNTER|PERF_COUNTER_BASE|PERF_DISPLAY_NOSHOW|1) +#define PERF_AVERAGE_TIMER (PERF_SIZE_DWORD|PERF_TYPE_COUNTER|PERF_COUNTER_FRACTION|PERF_DISPLAY_SECONDS) +#define PERF_AVERAGE_BASE (PERF_SIZE_DWORD|PERF_TYPE_COUNTER|PERF_COUNTER_BASE|PERF_DISPLAY_NOSHOW|2) +#define PERF_AVERAGE_BULK (PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_FRACTION|PERF_DISPLAY_NOSHOW) +#define PERF_100NSEC_TIMER (PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_RATE|PERF_TIMER_100NS|PERF_DELTA_COUNTER|PERF_DISPLAY_PERCENT) +#define PERF_100NSEC_TIMER_INV (PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_RATE|PERF_TIMER_100NS|PERF_DELTA_COUNTER|PERF_INVERSE_COUNTER|PERF_DISPLAY_PERCENT) +#define PERF_COUNTER_MULTI_TIMER (PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_RATE|PERF_DELTA_COUNTER|PERF_TIMER_TICK|PERF_MULTI_COUNTER|PERF_DISPLAY_PERCENT) +#define PERF_COUNTER_MULTI_TIMER_INV (PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_RATE|PERF_DELTA_COUNTER|PERF_MULTI_COUNTER|PERF_TIMER_TICK|PERF_INVERSE_COUNTER|PERF_DISPLAY_PERCENT) +#define PERF_COUNTER_MULTI_BASE (PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_BASE|PERF_MULTI_COUNTER|PERF_DISPLAY_NOSHOW) +#define PERF_100NSEC_MULTI_TIMER (PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_DELTA_COUNTER|PERF_COUNTER_RATE|PERF_TIMER_100NS|PERF_MULTI_COUNTER|PERF_DISPLAY_PERCENT) +#define PERF_100NSEC_MULTI_TIMER_INV (PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_DELTA_COUNTER|PERF_COUNTER_RATE|PERF_TIMER_100NS|PERF_MULTI_COUNTER|PERF_INVERSE_COUNTER|PERF_DISPLAY_PERCENT) +#define PERF_RAW_FRACTION (PERF_SIZE_DWORD|PERF_TYPE_COUNTER|PERF_COUNTER_FRACTION|PERF_DISPLAY_PERCENT) +#define PERF_RAW_BASE (PERF_SIZE_DWORD|PERF_TYPE_COUNTER|PERF_COUNTER_BASE|PERF_DISPLAY_NOSHOW|3) +#define PERF_ELAPSED_TIME (PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_ELAPSED|PERF_OBJECT_TIMER|PERF_DISPLAY_SECONDS) +typedef struct _PERF_DATA_BLOCK { + WCHAR Signature[4]; + DWORD LittleEndian; + DWORD Version; + DWORD Revision; + DWORD TotalByteLength; + DWORD HeaderLength; + DWORD NumObjectTypes; + LONG DefaultObject; + SYSTEMTIME SystemTime; + LARGE_INTEGER PerfTime; + LARGE_INTEGER PerfFreq; + LARGE_INTEGER PerfTime100nSec; + DWORD SystemNameLength; + DWORD SystemNameOffset; +} PERF_DATA_BLOCK, *PPERF_DATA_BLOCK; +typedef struct _PERF_OBJECT_TYPE { + DWORD TotalByteLength; + DWORD DefinitionLength; + DWORD HeaderLength; + DWORD ObjectNameTitleIndex; + LPWSTR ObjectNameTitle; + DWORD ObjectHelpTitleIndex; + LPWSTR ObjectHelpTitle; + DWORD DetailLevel; + DWORD NumCounters; + LONG DefaultCounter; + LONG NumInstances; + DWORD CodePage; + LARGE_INTEGER PerfTime; + LARGE_INTEGER PerfFreq; +} PERF_OBJECT_TYPE, *PPERF_OBJECT_TYPE; +typedef struct _PERF_COUNTER_DEFINITION { + DWORD ByteLength; + DWORD CounterNameTitleIndex; + LPWSTR CounterNameTitle; + DWORD CounterHelpTitleIndex; + LPWSTR CounterHelpTitle; + LONG DefaultScale; + DWORD DetailLevel; + DWORD CounterType; + DWORD CounterSize; + DWORD CounterOffset; +} PERF_COUNTER_DEFINITION,*PPERF_COUNTER_DEFINITION; +typedef struct _PERF_INSTANCE_DEFINITION { + DWORD ByteLength; + DWORD ParentObjectTitleIndex; + DWORD ParentObjectInstance; + LONG UniqueID; + DWORD NameOffset; + DWORD NameLength; +} PERF_INSTANCE_DEFINITION,*PPERF_INSTANCE_DEFINITION; +typedef struct _PERF_COUNTER_BLOCK { + DWORD ByteLength; +} PERF_COUNTER_BLOCK, *PPERF_COUNTER_BLOCK; +typedef DWORD(CALLBACK PM_OPEN_PROC)(LPWSTR); +typedef DWORD(CALLBACK PM_COLLECT_PROC)(LPWSTR,PVOID*,PDWORD,PDWORD); +typedef DWORD(CALLBACK PM_CLOSE_PROC)(void); +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/winreg.h b/reactos/w32api/include/winreg.h new file mode 100644 index 00000000000..c82adf5d72b --- /dev/null +++ b/reactos/w32api/include/winreg.h @@ -0,0 +1,161 @@ +#ifndef _WINREG_H +#define _WINREG_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define HKEY_CLASSES_ROOT ((HKEY)0x80000000) +#define HKEY_CURRENT_USER ((HKEY)0x80000001) +#define HKEY_LOCAL_MACHINE ((HKEY)0x80000002) +#define HKEY_USERS ((HKEY)0x80000003) +#define HKEY_PERFORMANCE_DATA ((HKEY)0x80000004) +#define HKEY_CURRENT_CONFIG ((HKEY)0x80000005) +#define HKEY_DYN_DATA ((HKEY)0x80000006) +#define REG_OPTION_VOLATILE 1 +#define REG_OPTION_NON_VOLATILE 0 +#define REG_CREATED_NEW_KEY 1 +#define REG_OPENED_EXISTING_KEY 2 +#define REG_NONE 0 +#define REG_SZ 1 +#define REG_EXPAND_SZ 2 +#define REG_BINARY 3 +#define REG_DWORD_LITTLE_ENDIAN 4 +#define REG_DWORD 4 +#define REG_DWORD_BIG_ENDIAN 5 +#define REG_LINK 6 +#define REG_MULTI_SZ 7 +#define REG_RESOURCE_LIST 8 +#define REG_FULL_RESOURCE_DESCRIPTOR 9 +#define REG_RESOURCE_REQUIREMENTS_LIST 10 +#define REG_QWORD_LITTLE_ENDIAN 11 +#define REG_QWORD 11 +#define REG_NOTIFY_CHANGE_NAME 1 +#define REG_NOTIFY_CHANGE_ATTRIBUTES 2 +#define REG_NOTIFY_CHANGE_LAST_SET 4 +#define REG_NOTIFY_CHANGE_SECURITY 8 + +#ifndef RC_INVOKED +typedef ACCESS_MASK REGSAM; +typedef struct value_entA { + LPSTR ve_valuename; + DWORD ve_valuelen; + DWORD ve_valueptr; + DWORD ve_type; +} VALENTA,*PVALENTA; +typedef struct value_entW { + LPWSTR ve_valuename; + DWORD ve_valuelen; + DWORD ve_valueptr; + DWORD ve_type; +} VALENTW,*PVALENTW; +BOOL WINAPI AbortSystemShutdownA(LPCSTR); +BOOL WINAPI AbortSystemShutdownW(LPCWSTR); +BOOL WINAPI InitiateSystemShutdownA(LPSTR,LPSTR,DWORD,BOOL,BOOL); +BOOL WINAPI InitiateSystemShutdownW(LPWSTR,LPWSTR,DWORD,BOOL,BOOL); +LONG WINAPI RegCloseKey(HKEY); +LONG WINAPI RegConnectRegistryA(LPCSTR,HKEY,PHKEY); +LONG WINAPI RegConnectRegistryW(LPCWSTR,HKEY,PHKEY); +LONG WINAPI RegCreateKeyA(HKEY,LPCSTR,PHKEY); +LONG WINAPI RegCreateKeyExA(HKEY,LPCSTR,DWORD,LPSTR,DWORD,REGSAM,LPSECURITY_ATTRIBUTES,PHKEY,PDWORD); +LONG WINAPI RegCreateKeyExW(HKEY,LPCWSTR,DWORD,LPWSTR,DWORD,REGSAM,LPSECURITY_ATTRIBUTES,PHKEY,PDWORD); +LONG WINAPI RegCreateKeyW(HKEY,LPCWSTR,PHKEY); +LONG WINAPI RegDeleteKeyA(HKEY,LPCSTR); +LONG WINAPI RegDeleteKeyW(HKEY,LPCWSTR); +LONG WINAPI RegDeleteValueA(HKEY,LPCSTR); +LONG WINAPI RegDeleteValueW(HKEY,LPCWSTR); +LONG WINAPI RegEnumKeyA(HKEY,DWORD,LPSTR,DWORD); +LONG WINAPI RegEnumKeyW(HKEY,DWORD,LPWSTR,DWORD); +LONG WINAPI RegEnumKeyExA(HKEY,DWORD,LPSTR,PDWORD,PDWORD,LPSTR,PDWORD,PFILETIME); +LONG WINAPI RegEnumKeyExW(HKEY,DWORD,LPWSTR,PDWORD,PDWORD,LPWSTR,PDWORD,PFILETIME); +LONG WINAPI RegEnumValueA(HKEY,DWORD,LPSTR,PDWORD,PDWORD,PDWORD,LPBYTE,PDWORD); +LONG WINAPI RegEnumValueW(HKEY,DWORD,LPWSTR,PDWORD,PDWORD,PDWORD,LPBYTE,PDWORD); +LONG WINAPI RegFlushKey(HKEY); +LONG WINAPI RegGetKeySecurity(HKEY,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR,PDWORD); +LONG WINAPI RegLoadKeyA(HKEY,LPCSTR,LPCSTR); +LONG WINAPI RegLoadKeyW(HKEY,LPCWSTR,LPCWSTR); +LONG WINAPI RegNotifyChangeKeyValue(HKEY,BOOL,DWORD,HANDLE,BOOL); +LONG WINAPI RegOpenKeyA(HKEY,LPCSTR,PHKEY); +LONG WINAPI RegOpenKeyExA(HKEY,LPCSTR,DWORD,REGSAM,PHKEY); +LONG WINAPI RegOpenKeyExW(HKEY,LPCWSTR,DWORD,REGSAM,PHKEY); +LONG WINAPI RegOpenKeyW(HKEY,LPCWSTR,PHKEY); +LONG WINAPI RegQueryInfoKeyA(HKEY,LPSTR,PDWORD,PDWORD,PDWORD,PDWORD,PDWORD,PDWORD,PDWORD,PDWORD,PDWORD,PFILETIME); +LONG WINAPI RegQueryInfoKeyW(HKEY,LPWSTR,PDWORD,PDWORD,PDWORD,PDWORD,PDWORD,PDWORD,PDWORD,PDWORD,PDWORD,PFILETIME); +LONG WINAPI RegQueryMultipleValuesA(HKEY,PVALENTA,DWORD,LPSTR,LPDWORD); +LONG WINAPI RegQueryMultipleValuesW(HKEY,PVALENTW,DWORD,LPWSTR,LPDWORD); +LONG WINAPI RegQueryValueA(HKEY,LPCSTR,LPSTR,PLONG); +LONG WINAPI RegQueryValueExA(HKEY,LPCSTR,LPDWORD,LPDWORD,LPBYTE,LPDWORD); +LONG WINAPI RegQueryValueExW(HKEY,LPCWSTR,LPDWORD,LPDWORD,LPBYTE,LPDWORD); +LONG WINAPI RegQueryValueW(HKEY,LPCWSTR,LPWSTR,PLONG); +LONG WINAPI RegReplaceKeyA(HKEY,LPCSTR,LPCSTR,LPCSTR); +LONG WINAPI RegReplaceKeyW(HKEY,LPCWSTR,LPCWSTR,LPCWSTR); +LONG WINAPI RegRestoreKeyA(HKEY,LPCSTR,DWORD); +LONG WINAPI RegRestoreKeyW(HKEY,LPCWSTR,DWORD); +LONG WINAPI RegSaveKeyA(HKEY,LPCSTR,LPSECURITY_ATTRIBUTES); +LONG WINAPI RegSaveKeyW(HKEY,LPCWSTR,LPSECURITY_ATTRIBUTES); +LONG WINAPI RegSetKeySecurity(HKEY,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR); +LONG WINAPI RegSetValueA(HKEY,LPCSTR,DWORD,LPCSTR,DWORD); +LONG WINAPI RegSetValueExA(HKEY,LPCSTR,DWORD,DWORD,const BYTE*,DWORD); +LONG WINAPI RegSetValueExW(HKEY,LPCWSTR,DWORD,DWORD,const BYTE*,DWORD); +LONG WINAPI RegSetValueW(HKEY,LPCWSTR,DWORD,LPCWSTR,DWORD); +LONG WINAPI RegUnLoadKeyA(HKEY,LPCSTR); +LONG WINAPI RegUnLoadKeyW(HKEY,LPCWSTR); + +#ifdef UNICODE +typedef VALENTW VALENT,*PVALENT; +#define AbortSystemShutdown AbortSystemShutdownW +#define InitiateSystemShutdown InitiateSystemShutdownW +#define RegConnectRegistry RegConnectRegistryW +#define RegCreateKey RegCreateKeyW +#define RegCreateKeyEx RegCreateKeyExW +#define RegDeleteKey RegDeleteKeyW +#define RegDeleteValue RegDeleteValueW +#define RegEnumKey RegEnumKeyW +#define RegEnumKeyEx RegEnumKeyExW +#define RegEnumValue RegEnumValueW +#define RegLoadKey RegLoadKeyW +#define RegOpenKey RegOpenKeyW +#define RegOpenKeyEx RegOpenKeyExW +#define RegQueryInfoKey RegQueryInfoKeyW +#define RegQueryMultipleValues RegQueryMultipleValuesW +#define RegQueryValue RegQueryValueW +#define RegQueryValueEx RegQueryValueExW +#define RegReplaceKey RegReplaceKeyW +#define RegRestoreKey RegRestoreKeyW +#define RegSaveKey RegSaveKeyW +#define RegSetValue RegSetValueW +#define RegSetValueEx RegSetValueExW +#define RegUnLoadKey RegUnLoadKeyW +#else +typedef VALENTA VALENT,*PVALENT; +#define AbortSystemShutdown AbortSystemShutdownA +#define InitiateSystemShutdown InitiateSystemShutdownA +#define RegConnectRegistry RegConnectRegistryA +#define RegCreateKey RegCreateKeyA +#define RegCreateKeyEx RegCreateKeyExA +#define RegDeleteKey RegDeleteKeyA +#define RegDeleteValue RegDeleteValueA +#define RegEnumKey RegEnumKeyA +#define RegEnumKeyEx RegEnumKeyExA +#define RegEnumValue RegEnumValueA +#define RegLoadKey RegLoadKeyA +#define RegOpenKey RegOpenKeyA +#define RegOpenKeyEx RegOpenKeyExA +#define RegQueryInfoKey RegQueryInfoKeyA +#define RegQueryMultipleValues RegQueryMultipleValuesA +#define RegQueryValue RegQueryValueA +#define RegQueryValueEx RegQueryValueExA +#define RegReplaceKey RegReplaceKeyA +#define RegRestoreKey RegRestoreKeyA +#define RegSaveKey RegSaveKeyA +#define RegSetValue RegSetValueA +#define RegSetValueEx RegSetValueExA +#define RegUnLoadKey RegUnLoadKeyA +#endif +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/winresrc.h b/reactos/w32api/include/winresrc.h new file mode 100644 index 00000000000..79a5d8e03e4 --- /dev/null +++ b/reactos/w32api/include/winresrc.h @@ -0,0 +1,14 @@ +#ifndef _WINRESRC_H +#define _WINRESRC_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#define WIN32_LEAN_AND_MEAN +#include <winuser.h> +#include <winnt.h> +#include <winver.h> +#include <dde.h> +#include <dlgs.h> +#include <commctrl.h> +#endif diff --git a/reactos/w32api/include/winsnmp.h b/reactos/w32api/include/winsnmp.h new file mode 100644 index 00000000000..bfed3864c19 --- /dev/null +++ b/reactos/w32api/include/winsnmp.h @@ -0,0 +1,329 @@ +/* + winsnmp.h - Header file for the Windows SNMP API + + Written by Filip Navara <xnavara@volny.cz> + + References (2003-08-25): + Windows SNMP + http://www.winsnmp.com/docs/winsnmp.doc + + WinSNMP v2.0 Addendum + http://www.winsnmp.com/docs/winsnmp2.txt + + WinSNMP v3.0 API Addendum + http://www.winsnmp.com/docs/winsnmp3.htm + + WinSNMP Reference + http://msdn.microsoft.com/library/en-us/snmp/snmp/winsnmp_api_reference.asp + + 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. +*/ + +#ifndef _WINSNMP_H +#define _WINSNMP_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifndef _WINDOWS_H +#include <windows.h> +#endif + +#include <pshpack4.h> + +#ifndef WINSNMPAPI +#define WINSNMPAPI WINAPI +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define MAXOBJIDSIZE 128 +#define MAXOBJIDSTRSIZE 1408 +#define MAXVENDORINFO 32 +#ifndef _SNMP_ASN_DEFINED +#define _SNMP_ASN_DEFINED +#define ASN_UNIVERSAL 0x00 +#define ASN_PRIMITIVE 0x00 +#define ASN_CONSTRUCTOR 0x20 +#define ASN_APPLICATION 0x40 +#define ASN_CONTEXT 0x80 +#define ASN_PRIVATE 0xC0 +#define SNMP_PDU_GET (ASN_CONTEXT | ASN_CONSTRUCTOR | 0) +#define SNMP_PDU_GETNEXT (ASN_CONTEXT | ASN_CONSTRUCTOR | 1) +#define SNMP_PDU_RESPONSE (ASN_CONTEXT | ASN_CONSTRUCTOR | 2) +#define SNMP_PDU_SET (ASN_CONTEXT | ASN_CONSTRUCTOR | 3) +#define SNMP_PDU_GETBULK (ASN_CONTEXT | ASN_CONSTRUCTOR | 4) +#define SNMP_PDU_V1TRAP (ASN_CONTEXT | ASN_CONSTRUCTOR | 4) +#define SNMP_PDU_INFORM (ASN_CONTEXT | ASN_CONSTRUCTOR | 6) +#define SNMP_PDU_TRAP (ASN_CONTEXT | ASN_CONSTRUCTOR | 7) +#define SNMP_PDU_REPORT (ASN_CONTEXT | ASN_CONSTRUCTOR | 8) +#endif /* _SNMP_ASN_DEFINED */ +#define SNMP_SYNTAX_SEQUENCE (ASN_UNIVERSAL | ASN_CONSTRUCTOR | 0x10) +#define SNMP_SYNTAX_INT (ASN_UNIVERSAL | ASN_PRIMITIVE | 0x02) +#define SNMP_SYNTAX_BITS (ASN_UNIVERSAL | ASN_PRIMITIVE | 0x03) +#define SNMP_SYNTAX_OCTETS (ASN_UNIVERSAL | ASN_PRIMITIVE | 0x04) +#define SNMP_SYNTAX_NULL (ASN_UNIVERSAL | ASN_PRIMITIVE | 0x05) +#define SNMP_SYNTAX_OID (ASN_UNIVERSAL | ASN_PRIMITIVE | 0x06) +#define SNMP_SYNTAX_IPADDR (ASN_APPLICATION | ASN_PRIMITIVE | 0x00) +#define SNMP_SYNTAX_CNTR32 (ASN_APPLICATION | ASN_PRIMITIVE | 0x01) +#define SNMP_SYNTAX_GAUGE32 (ASN_APPLICATION | ASN_PRIMITIVE | 0x02) +#define SNMP_SYNTAX_TIMETICKS (ASN_APPLICATION | ASN_PRIMITIVE | 0x03) +#define SNMP_SYNTAX_OPAQUE (ASN_APPLICATION | ASN_PRIMITIVE | 0x04) +#define SNMP_SYNTAX_NSAPADDR (ASN_APPLICATION | ASN_PRIMITIVE | 0x05) +#define SNMP_SYNTAX_CNTR64 (ASN_APPLICATION | ASN_PRIMITIVE | 0x06) +#define SNMP_SYNTAX_UINT32 (ASN_APPLICATION | ASN_PRIMITIVE | 0x07) +#define SNMP_SYNTAX_NOSUCHOBJECT (ASN_CONTEXT | ASN_PRIMITIVE | 0x00) +#define SNMP_SYNTAX_NOSUCHINSTANCE (ASN_CONTEXT | ASN_PRIMITIVE | 0x01) +#define SNMP_SYNTAX_ENDOFMIBVIEW (ASN_CONTEXT | ASN_PRIMITIVE | 0x02) +#define SNMP_SYNTAX_INT32 SNMP_SYNTAX_INT +#define SNMP_TRAP_COLDSTART 0 +#define SNMP_TRAP_WARMSTART 1 +#define SNMP_TRAP_LINKDOWN 2 +#define SNMP_TRAP_LINKUP 3 +#define SNMP_TRAP_AUTHFAIL 4 +#define SNMP_TRAP_EGPNEIGHBORLOSS 5 +#define SNMP_TRAP_ENTERPRISESPECIFIC 6 +#define SNMP_ERROR_NOERROR 0 +#define SNMP_ERROR_TOOBIG 1 +#define SNMP_ERROR_NOSUCHNAME 2 +#define SNMP_ERROR_BADVALUE 3 +#define SNMP_ERROR_READONLY 4 +#define SNMP_ERROR_GENERR 5 +#define SNMP_ERROR_NOACCESS 6 +#define SNMP_ERROR_WRONGTYPE 7 +#define SNMP_ERROR_WRONGLENGTH 8 +#define SNMP_ERROR_WRONGENCODING 9 +#define SNMP_ERROR_WRONGVALUE 10 +#define SNMP_ERROR_NOCREATION 11 +#define SNMP_ERROR_INCONSISTENTVALUE 12 +#define SNMP_ERROR_RESOURCEUNAVAILABLE 13 +#define SNMP_ERROR_COMMITFAILED 14 +#define SNMP_ERROR_UNDOFAILED 15 +#define SNMP_ERROR_AUTHORIZATIONERROR 16 +#define SNMP_ERROR_NOTWRITABLE 17 +#define SNMP_ERROR_INCONSISTENTNAME 18 +#define SNMP_SEC_MODEL_V1 1 +#define SNMP_SEC_MODEL_V2 2 +#define SNMP_SEC_MODEL_USM 3 +#define SNMP_NOAUTH_NOPRIV 0 +#define SNMP_AUTH_NOPRIV 1 +#define SNMP_AUTH_PRIV 3 +#define SNMP_USM_NO_AUTH_PROTOCOL 1 +#define SNMP_USM_HMACMD5_AUTH_PROTOCOL 2 +#define SNMP_USM_HMACSHA_AUTH_PROTOCOL 3 +#define SNMP_USM_NO_PRIV_PROTOCOL 1 +#define SNMP_USM_DES_PRIV_PROTOCOL 2 +#define SNMPAPI_TRANSLATED 0 +#define SNMPAPI_UNTRANSLATED_V1 1 +#define SNMPAPI_UNTRANSLATED_V2 2 +#define SNMPAPI_UNTRANSLATED_V3 3 +#define SNMPAPI_OFF 0 +#define SNMPAPI_ON 1 +#define SNMPAPI_FAILURE 0 +#define SNMPAPI_SUCCESS 1 +#define SNMPAPI_NO_SUPPORT 0 +#define SNMPAPI_V1_SUPPORT 1 +#define SNMPAPI_V2_SUPPORT 2 +#define SNMPAPI_M2M_SUPPORT 3 +#define SNMPAPI_V3_SUPPORT 3 +#define SNMPAPI_ALLOC_ERROR 2 +#define SNMPAPI_CONTEXT_INVALID 3 +#define SNMPAPI_CONTEXT_UNKNOWN 4 +#define SNMPAPI_ENTITY_INVALID 5 +#define SNMPAPI_ENTITY_UNKNOWN 6 +#define SNMPAPI_INDEX_INVALID 7 +#define SNMPAPI_NOOP 8 +#define SNMPAPI_OID_INVALID 9 +#define SNMPAPI_OPERATION_INVALID 10 +#define SNMPAPI_OUTPUT_TRUNCATED 11 +#define SNMPAPI_PDU_INVALID 12 +#define SNMPAPI_SESSION_INVALID 13 +#define SNMPAPI_SYNTAX_INVALID 14 +#define SNMPAPI_VBL_INVALID 15 +#define SNMPAPI_MODE_INVALID 16 +#define SNMPAPI_SIZE_INVALID 17 +#define SNMPAPI_NOT_INITIALIZED 18 +#define SNMPAPI_MESSAGE_INVALID 19 +#define SNMPAPI_HWND_INVALID 20 +#define SNMPAPI_ENGINE_INVALID 30 +#define SNMPAPI_ENGINE_DISCOVERY_FAILED 31 +#define SNMPAPI_OTHER_ERROR 99 +#define SNMPAPI_TL_NOT_INITIALIZED 100 +#define SNMPAPI_TL_NOT_SUPPORTED 101 +#define SNMPAPI_TL_NOT_AVAILABLE 102 +#define SNMPAPI_TL_RESOURCE_ERROR 103 +#define SNMPAPI_TL_UNDELIVERABLE 104 +#define SNMPAPI_TL_SRC_INVALID 105 +#define SNMPAPI_TL_INVALID_PARAM 106 +#define SNMPAPI_TL_IN_USE 107 +#define SNMPAPI_TL_TIMEOUT 108 +#define SNMPAPI_TL_PDU_TOO_BIG 109 +#define SNMPAPI_TL_OTHER 199 +#define SNMPAPI_RPT_INVALIDMSG 200 +#define SNMPAPI_RPT_INASNPARSEERR 201 +#define SNMPAPI_RPT_UNKNOWNSECMODEL 202 +#define SNMPAPI_RPT_UNKNOWNENGINEID 203 +#define SNMPAPI_RPT_UNSUPPSECLEVEL 204 +#define SNMPAPI_RPT_UNKNOWNUSERNAME 205 +#define SNMPAPI_RPT_WRONGDIGEST 206 +#define SNMPAPI_RPT_NOTINTIMEWINDOW 207 +#define SNMPAPI_RPT_DECRYPTIONERROR 208 +#define SNMPAPI_RPT_OTHER 299 + +#ifndef RC_INVOKED + +typedef HANDLE HSNMP_SESSION, *LPHSNMP_SESSION; +typedef HANDLE HSNMP_CONTEXT, *LPHSNMP_CONTEXT; +typedef HANDLE HSNMP_VBL, *LPHSNMP_VBL; +typedef HANDLE HSNMP_PDU, *LPHSNMP_PDU; +typedef HANDLE HSNMP_ENTITY, *LPHSNMP_ENTITY; +typedef unsigned char smiBYTE, *smiLPBYTE; +typedef signed int smiINT, *smiLPINT; +typedef signed int smiINT32, *smiLPINT32; +typedef unsigned int smiUINT32, *smiLPUINT32; +typedef smiUINT32 smiCNTR32, *smiLPCNTR32; +typedef smiUINT32 smiGAUGE32, *smiLPGAUGE32; +typedef smiUINT32 smiTIMETICKS, *smiLPTIMETICKS; +typedef smiUINT32 SNMPAPI_STATUS; +typedef struct { + smiUINT32 len; + smiLPBYTE ptr; +} smiOCTETS, *smiLPOCTETS, smiOPAQUE, *smiLPOPAQUE, smiBITS, *smiLPBITS, smiIPADDR, *smiLPIPADDR, smiNSAPADDR, *smiLPNSAPADDR; +typedef const smiLPOCTETS smiLPCOCTETS; +typedef struct { + smiUINT32 len; + smiLPUINT32 ptr; +} smiOID, *smiLPOID; +typedef const smiLPOID smiLPCOID; +typedef struct { + smiUINT32 hipart; + smiUINT32 lopart; +} smiCNTR64, *smiLPCNTR64; +typedef struct { + smiUINT32 syntax; + union { + smiINT sNumber; + smiUINT32 uNumber; + smiCNTR64 hNumber; + smiOCTETS string; + smiOID oid; + smiBYTE empty; + } value; +} smiVALUE, *smiLPVALUE; +typedef const smiLPVALUE smiLPCVALUE; +typedef struct { + CHAR vendorName[MAXVENDORINFO*2]; + CHAR vendorContact[MAXVENDORINFO*2]; + CHAR vendorVersionId[MAXVENDORINFO]; + CHAR vendorVersionDate[MAXVENDORINFO]; + smiUINT32 vendorEnterprise; +} smiVENDORINFO, FAR *smiLPVENDORINFO; +typedef SNMPAPI_STATUS (CALLBACK *SNMPAPI_CALLBACK)(HSNMP_SESSION,HWND,UINT,WPARAM,LPARAM,LPVOID); +typedef struct +{ + HSNMP_ENTITY hEntity; + HSNMP_SESSION hSession; + smiUINT32 nTranslateMode; + smiUINT32 nSnmpVersion; + smiOCTETS dFriendlyName; + smiUINT32 nAddressFamily; + smiOCTETS dAddressString; + smiUINT32 nRequestPort; + smiUINT32 nNotificationPort; + smiUINT32 nMaxMsgSize; + smiOCTETS dEngineID; + smiUINT32 nEngineBoots; + smiUINT32 nEngineTime; + smiUINT32 nEngineSeconds; + smiUINT32 nRetransmitMode; + smiTIMETICKS nPolicyTimeout; + smiUINT32 nPolicyRetry; + smiTIMETICKS nActualTimeout; + smiUINT32 nActualRetry; +} smiENTITYINFO, *smiLPENTITYINFO; +typedef struct +{ + HSNMP_CONTEXT hContext; + HSNMP_SESSION hSession; + smiUINT32 nTranslateMode; + smiUINT32 nSnmpVersion; + smiOCTETS dFriendlyName; + smiOCTETS dContextEngineID; + smiOCTETS dContextName; + smiOCTETS dSecurityName; + smiUINT32 nSecurityModel; + smiUINT32 nSecurityLevel; + smiUINT32 nSecurityAuthProtocol; + smiOCTETS dSecurityAuthKey; + smiUINT32 nSecurityPrivProtocol; + smiOCTETS dSecurityPrivKey; +} smiCONTEXTINFO, *smiLPCONTEXTINFO; + +SNMPAPI_STATUS WINSNMPAPI SnmpCancelMsg(HSNMP_SESSION,smiINT32); +SNMPAPI_STATUS WINSNMPAPI SnmpCleanup(VOID); +SNMPAPI_STATUS WINSNMPAPI SnmpClose(HSNMP_SESSION); +SNMPAPI_STATUS WINSNMPAPI SnmpContextToStr(HSNMP_CONTEXT,smiLPOCTETS); +SNMPAPI_STATUS WINSNMPAPI SnmpCountVbl(HSNMP_VBL); +HSNMP_PDU WINSNMPAPI SnmpCreatePdu(HSNMP_SESSION,smiINT,smiINT32,smiINT,smiINT,HSNMP_VBL); +HSNMP_SESSION WINSNMPAPI SnmpCreateSession(HWND,UINT,SNMPAPI_CALLBACK,LPVOID); +HSNMP_VBL WINSNMPAPI SnmpCreateVbl(HSNMP_SESSION,smiLPCOID,smiLPCVALUE); +SNMPAPI_STATUS WINSNMPAPI SnmpDecodeMsg(HSNMP_SESSION,LPHSNMP_ENTITY,LPHSNMP_ENTITY,LPHSNMP_CONTEXT,LPHSNMP_PDU,smiLPCOCTETS); +SNMPAPI_STATUS WINSNMPAPI SnmpDeleteVb(HSNMP_VBL,smiUINT32); +HSNMP_PDU WINSNMPAPI SnmpDuplicatePdu(HSNMP_SESSION,HSNMP_PDU); +HSNMP_VBL WINSNMPAPI SnmpDuplicateVbl(HSNMP_SESSION,HSNMP_VBL); +SNMPAPI_STATUS WINSNMPAPI SnmpEncodeMsg(HSNMP_SESSION,HSNMP_ENTITY,HSNMP_ENTITY,HSNMP_CONTEXT,HSNMP_PDU,smiLPOCTETS); +SNMPAPI_STATUS WINSNMPAPI SnmpEntityToStr(HSNMP_ENTITY,smiUINT32,LPSTR); +SNMPAPI_STATUS WINSNMPAPI SnmpFreeContext(HSNMP_CONTEXT); +SNMPAPI_STATUS WINSNMPAPI SnmpFreeDescriptor(smiUINT32,smiLPOPAQUE); +SNMPAPI_STATUS WINSNMPAPI SnmpFreeEntity(HSNMP_ENTITY); +SNMPAPI_STATUS WINSNMPAPI SnmpFreePdu(HSNMP_PDU); +SNMPAPI_STATUS WINSNMPAPI SnmpFreeVbl(HSNMP_VBL); +SNMPAPI_STATUS WINSNMPAPI SnmpGetLastError(HSNMP_SESSION); +SNMPAPI_STATUS WINSNMPAPI SnmpGetPduData(HSNMP_PDU,smiLPINT,smiLPINT32,smiLPINT,smiLPINT,LPHSNMP_VBL); +SNMPAPI_STATUS WINSNMPAPI SnmpGetRetransmitMode(smiLPUINT32); +SNMPAPI_STATUS WINSNMPAPI SnmpGetRetry(HSNMP_ENTITY,smiLPUINT32,smiLPUINT32); +SNMPAPI_STATUS WINSNMPAPI SnmpGetTimeout(HSNMP_ENTITY,smiLPTIMETICKS,smiLPTIMETICKS); +SNMPAPI_STATUS WINSNMPAPI SnmpGetTranslateMode(smiLPUINT32); +SNMPAPI_STATUS WINSNMPAPI SnmpGetVb(HSNMP_VBL,smiUINT32,smiLPOID,smiLPVALUE); +SNMPAPI_STATUS WINSNMPAPI SnmpGetVendorInfo(smiLPVENDORINFO); +SNMPAPI_STATUS WINSNMPAPI SnmpListen(HSNMP_ENTITY,SNMPAPI_STATUS); +SNMPAPI_STATUS WINSNMPAPI SnmpOidCompare(smiLPCOID,smiLPCOID,smiUINT32,smiLPINT); +SNMPAPI_STATUS WINSNMPAPI SnmpOidCopy(smiLPCOID,smiLPOID); +SNMPAPI_STATUS WINSNMPAPI SnmpOidToStr(smiLPCOID,smiUINT32,LPSTR); +HSNMP_SESSION WINSNMPAPI SnmpOpen(HWND,UINT); +SNMPAPI_STATUS WINSNMPAPI SnmpRecvMsg(HSNMP_SESSION,LPHSNMP_ENTITY,LPHSNMP_ENTITY,LPHSNMP_CONTEXT,LPHSNMP_PDU); +SNMPAPI_STATUS WINSNMPAPI SnmpRegister(HSNMP_SESSION,HSNMP_ENTITY,HSNMP_ENTITY,HSNMP_CONTEXT,smiLPCOID,smiUINT32); +SNMPAPI_STATUS WINSNMPAPI SnmpSendMsg(HSNMP_SESSION,HSNMP_ENTITY,HSNMP_ENTITY,HSNMP_CONTEXT,HSNMP_PDU); +SNMPAPI_STATUS WINSNMPAPI SnmpSetPduData(HSNMP_PDU,const smiINT *,const smiINT32 *,const smiINT *,const smiINT *,const HSNMP_VBL *); +SNMPAPI_STATUS WINSNMPAPI SnmpSetPort(HSNMP_ENTITY,UINT); +SNMPAPI_STATUS WINSNMPAPI SnmpSetRetransmitMode(smiUINT32); +SNMPAPI_STATUS WINSNMPAPI SnmpSetRetry(HSNMP_ENTITY,smiUINT32); +SNMPAPI_STATUS WINSNMPAPI SnmpSetTimeout(HSNMP_ENTITY,smiTIMETICKS); +SNMPAPI_STATUS WINSNMPAPI SnmpSetTranslateMode(smiUINT32); +SNMPAPI_STATUS WINSNMPAPI SnmpSetVb(HSNMP_VBL,smiUINT32,smiLPCOID,smiLPCVALUE); +SNMPAPI_STATUS WINSNMPAPI SnmpStartup(smiLPUINT32,smiLPUINT32,smiLPUINT32,smiLPUINT32,smiLPUINT32); +HSNMP_CONTEXT WINSNMPAPI SnmpStrToContext(HSNMP_SESSION,smiLPCOCTETS); +HSNMP_ENTITY WINSNMPAPI SnmpStrToEntity(HSNMP_SESSION,LPCSTR); +SNMPAPI_STATUS WINSNMPAPI SnmpStrToOid(LPCSTR,smiLPOID); +/* Added in WinSNMP v3.0, not present in some (all?) versions of MS wsnmp32.dll */ +HSNMP_ENTITY WINSNMPAPI SnmpCreateEntity(HSNMP_SESSION,smiLPENTITYINFO); +SNMPAPI_STATUS WINSNMPAPI SnmpGetEntityInfo(HSNMP_ENTITY,smiLPENTITYINFO); +SNMPAPI_STATUS WINSNMPAPI SnmpSetEntityInfo(HSNMP_ENTITY,smiLPENTITYINFO); +SNMPAPI_STATUS WINSNMPAPI SnmpFreeEntityInfo(smiLPENTITYINFO); +HSNMP_CONTEXT WINSNMPAPI SnmpCreateContext(HSNMP_SESSION,smiLPCONTEXTINFO); +SNMPAPI_STATUS WINSNMPAPI SnmpGetContextInfo(HSNMP_CONTEXT,smiLPCONTEXTINFO); +SNMPAPI_STATUS WINSNMPAPI SnmpSetContextInfo(HSNMP_CONTEXT,smiLPCONTEXTINFO); +SNMPAPI_STATUS WINSNMPAPI SnmpFreeContextInfo(smiLPCONTEXTINFO); +SNMPAPI_STATUS WINSNMPAPI SnmpPasswordToKey(smiLPOCTETS,smiINT32,smiLPOCTETS); + +#endif /* RC_INVOKED */ + +#ifdef __cplusplus +} +#endif +#include <poppack.h> +#endif diff --git a/reactos/w32api/include/winsock.h b/reactos/w32api/include/winsock.h new file mode 100644 index 00000000000..36eb713e496 --- /dev/null +++ b/reactos/w32api/include/winsock.h @@ -0,0 +1,535 @@ +/* + + Definitions for winsock 1.1 + + Portions Copyright (c) 1980, 1983, 1988, 1993 + The Regents of the University of California. All rights reserved. + + Portions Copyright (c) 1993 by Digital Equipment Corporation. + */ + +#ifndef _WINSOCK_H +#define _WINSOCK_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#define _GNU_H_WINDOWS32_SOCKETS +#include <windows.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined ( _BSDTYPES_DEFINED ) +/* also defined in gmon.h and in cygwin's sys/types */ +typedef unsigned char u_char; +typedef unsigned short u_short; +typedef unsigned int u_int; +typedef unsigned long u_long; +#define _BSDTYPES_DEFINED +#endif /* !defined _BSDTYPES_DEFINED */ +typedef u_int SOCKET; +#ifndef FD_SETSIZE +#define FD_SETSIZE 64 +#endif + +/* shutdown() how types */ +#define SD_RECEIVE 0x00 +#define SD_SEND 0x01 +#define SD_BOTH 0x02 + +#ifndef _SYS_TYPES_FD_SET +/* fd_set may have be defined by the newlib <sys/types.h> + * if __USE_W32_SOCKETS not defined. + */ +#ifdef fd_set +#undef fd_set +#endif +typedef struct fd_set { + u_int fd_count; + SOCKET fd_array[FD_SETSIZE]; +} fd_set; +int PASCAL __WSAFDIsSet(SOCKET,fd_set*); +#ifndef FD_CLR +#define FD_CLR(fd,set) do { u_int __i;\ +for (__i = 0; __i < ((fd_set *)(set))->fd_count ; __i++) {\ + if (((fd_set *)(set))->fd_array[__i] == (fd)) {\ + while (__i < ((fd_set *)(set))->fd_count-1) {\ + ((fd_set*)(set))->fd_array[__i] = ((fd_set*)(set))->fd_array[__i+1];\ + __i++;\ + }\ + ((fd_set*)(set))->fd_count--;\ + break;\ + }\ +}\ +} while (0) +#endif +#ifndef FD_SET +#define FD_SET(fd, set) do { \ + if (((fd_set *)(set))->fd_count < FD_SETSIZE) \ + ((fd_set *)(set))->fd_array[((fd_set *)(set))->fd_count++]=(fd);\ +}while (0) +#endif +#ifndef FD_ZERO +#define FD_ZERO(set) (((fd_set *)(set))->fd_count=0) +#endif +#ifndef FD_ISSET +#define FD_ISSET(fd, set) __WSAFDIsSet((SOCKET)(fd), (fd_set *)(set)) +#endif +#elif !defined(USE_SYS_TYPES_FD_SET) +#warning "fd_set and associated macros have been defined in sys/types. \ + This can cause runtime problems with W32 sockets" +#endif /* ndef _SYS_TYPES_FD_SET */ + +#if !(defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +#ifndef _TIMEVAL_DEFINED /* also in sys/time.h */ +#define _TIMEVAL_DEFINED +struct timeval { + long tv_sec; + long tv_usec; +}; +#define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec) +#define timercmp(tvp, uvp, cmp) \ + (((tvp)->tv_sec != (uvp)->tv_sec) ? \ + ((tvp)->tv_sec cmp (uvp)->tv_sec) : \ + ((tvp)->tv_usec cmp (uvp)->tv_usec)) +#define timerclear(tvp) (tvp)->tv_sec = (tvp)->tv_usec = 0 +#endif /* _TIMEVAL_DEFINED */ +struct hostent { + char *h_name; + char **h_aliases; + short h_addrtype; + short h_length; + char **h_addr_list; +#define h_addr h_addr_list[0] +}; +struct linger { + u_short l_onoff; + u_short l_linger; +}; +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ +#define IOCPARM_MASK 0x7f +#define IOC_VOID 0x20000000 +#define IOC_OUT 0x40000000 +#define IOC_IN 0x80000000 +#define IOC_INOUT (IOC_IN|IOC_OUT) + +#if !(defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +#define _IO(x,y) (IOC_VOID|((x)<<8)|(y)) +#define _IOR(x,y,t) (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) +#define _IOW(x,y,t) (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) +#define FIONBIO _IOW('f', 126, u_long) +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ + +#define FIONREAD _IOR('f', 127, u_long) +#define FIOASYNC _IOW('f', 125, u_long) +#define SIOCSHIWAT _IOW('s', 0, u_long) +#define SIOCGHIWAT _IOR('s', 1, u_long) +#define SIOCSLOWAT _IOW('s', 2, u_long) +#define SIOCGLOWAT _IOR('s', 3, u_long) +#define SIOCATMARK _IOR('s', 7, u_long) + +#if !(defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +struct netent { + char * n_name; + char **n_aliases; + short n_addrtype; + u_long n_net; +}; +struct servent { + char *s_name; + char **s_aliases; + short s_port; + char *s_proto; +}; +struct protoent { + char *p_name; + char **p_aliases; + short p_proto; +}; +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ + +#define IPPROTO_IP 0 +#define IPPROTO_ICMP 1 +#define IPPROTO_IGMP 2 +#define IPPROTO_GGP 3 +#define IPPROTO_TCP 6 +#define IPPROTO_PUP 12 +#define IPPROTO_UDP 17 +#define IPPROTO_IDP 22 +#define IPPROTO_ND 77 +#define IPPROTO_RAW 255 +#define IPPROTO_MAX 256 +#define IPPORT_ECHO 7 +#define IPPORT_DISCARD 9 +#define IPPORT_SYSTAT 11 +#define IPPORT_DAYTIME 13 +#define IPPORT_NETSTAT 15 +#define IPPORT_FTP 21 +#define IPPORT_TELNET 23 +#define IPPORT_SMTP 25 +#define IPPORT_TIMESERVER 37 +#define IPPORT_NAMESERVER 42 +#define IPPORT_WHOIS 43 +#define IPPORT_MTP 57 +#define IPPORT_TFTP 69 +#define IPPORT_RJE 77 +#define IPPORT_FINGER 79 +#define IPPORT_TTYLINK 87 +#define IPPORT_SUPDUP 95 +#define IPPORT_EXECSERVER 512 +#define IPPORT_LOGINSERVER 513 +#define IPPORT_CMDSERVER 514 +#define IPPORT_EFSSERVER 520 +#define IPPORT_BIFFUDP 512 +#define IPPORT_WHOSERVER 513 +#define IPPORT_ROUTESERVER 520 +#define IPPORT_RESERVED 1024 +#define IMPLINK_IP 155 +#define IMPLINK_LOWEXPER 156 +#define IMPLINK_HIGHEXPER 158 +struct in_addr { + union { + struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b; + struct { u_short s_w1,s_w2; } S_un_w; + u_long S_addr; + } S_un; +#define s_addr S_un.S_addr +#define s_host S_un.S_un_b.s_b2 +#define s_net S_un.S_un_b.s_b1 +#define s_imp S_un.S_un_w.s_w2 +#define s_impno S_un.S_un_b.s_b4 +#define s_lh S_un.S_un_b.s_b3 +}; +#define IN_CLASSA(i) ((long)(i)&0x80000000) +#define IN_CLASSA_NET 0xff000000 +#define IN_CLASSA_NSHIFT 24 +#define IN_CLASSA_HOST 0x00ffffff +#define IN_CLASSA_MAX 128 +#define IN_CLASSB(i) (((long)(i)&0xc0000000)==0x80000000) +#define IN_CLASSB_NET 0xffff0000 +#define IN_CLASSB_NSHIFT 16 +#define IN_CLASSB_HOST 0x0000ffff +#define IN_CLASSB_MAX 65536 +#define IN_CLASSC(i) (((long)(i)&0xe0000000)==0xc0000000) +#define IN_CLASSC_NET 0xffffff00 +#define IN_CLASSC_NSHIFT 8 +#define IN_CLASSC_HOST 0xff +#define INADDR_ANY (u_long)0 +#define INADDR_LOOPBACK 0x7f000001 +#define INADDR_BROADCAST (u_long)0xffffffff +#define INADDR_NONE 0xffffffff +struct sockaddr_in { + short sin_family; + u_short sin_port; + struct in_addr sin_addr; + char sin_zero[8]; +}; +#define WSADESCRIPTION_LEN 256 +#define WSASYS_STATUS_LEN 128 +typedef struct WSAData { + WORD wVersion; + WORD wHighVersion; + char szDescription[WSADESCRIPTION_LEN+1]; + char szSystemStatus[WSASYS_STATUS_LEN+1]; + unsigned short iMaxSockets; + unsigned short iMaxUdpDg; + char * lpVendorInfo; +} WSADATA; +typedef WSADATA *LPWSADATA; + +#if !(defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +#define IP_OPTIONS 1 +#define SO_DEBUG 1 +#define SO_ACCEPTCONN 2 +#define SO_REUSEADDR 4 +#define SO_KEEPALIVE 8 +#define SO_DONTROUTE 16 +#define SO_BROADCAST 32 +#define SO_USELOOPBACK 64 +#define SO_LINGER 128 +#define SO_OOBINLINE 256 +#define SO_DONTLINGER (u_int)(~SO_LINGER) +#define SO_SNDBUF 0x1001 +#define SO_RCVBUF 0x1002 +#define SO_SNDLOWAT 0x1003 +#define SO_RCVLOWAT 0x1004 +#define SO_SNDTIMEO 0x1005 +#define SO_RCVTIMEO 0x1006 +#define SO_ERROR 0x1007 +#define SO_TYPE 0x1008 +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ +/* + * Note that the next 5 IP defines are specific to WinSock 1.1 (wsock32.dll). + * They will cause errors or unexpected results if used with the + * (gs)etsockopts exported from the WinSock 2 lib, ws2_32.dll. Refer ws2tcpip.h. + */ +#define IP_MULTICAST_IF 2 +#define IP_MULTICAST_TTL 3 +#define IP_MULTICAST_LOOP 4 +#define IP_ADD_MEMBERSHIP 5 +#define IP_DROP_MEMBERSHIP 6 + +#define IP_DEFAULT_MULTICAST_TTL 1 +#define IP_DEFAULT_MULTICAST_LOOP 1 +#define IP_MAX_MEMBERSHIPS 20 +struct ip_mreq { + struct in_addr imr_multiaddr; + struct in_addr imr_interface; +}; +#define INVALID_SOCKET (SOCKET)(~0) +#define SOCKET_ERROR (-1) +#define SOCK_STREAM 1 +#define SOCK_DGRAM 2 +#define SOCK_RAW 3 +#define SOCK_RDM 4 +#define SOCK_SEQPACKET 5 +#define TCP_NODELAY 0x0001 +#define AF_UNSPEC 0 +#define AF_UNIX 1 +#define AF_INET 2 +#define AF_IMPLINK 3 +#define AF_PUP 4 +#define AF_CHAOS 5 +#define AF_IPX 6 +#define AF_NS 6 +#define AF_ISO 7 +#define AF_OSI AF_ISO +#define AF_ECMA 8 +#define AF_DATAKIT 9 +#define AF_CCITT 10 +#define AF_SNA 11 +#define AF_DECnet 12 +#define AF_DLI 13 +#define AF_LAT 14 +#define AF_HYLINK 15 +#define AF_APPLETALK 16 +#define AF_NETBIOS 17 +#define AF_VOICEVIEW 18 +#define AF_FIREFOX 19 +#define AF_UNKNOWN1 20 +#define AF_BAN 21 +#define AF_ATM 22 +#define AF_INET6 23 +#if !(defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +#define AF_MAX 24 +struct sockaddr { + u_short sa_family; + char sa_data[14]; +}; +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ + +struct sockproto { + u_short sp_family; + u_short sp_protocol; +}; +#define PF_UNSPEC AF_UNSPEC +#define PF_UNIX AF_UNIX +#define PF_INET AF_INET +#define PF_IMPLINK AF_IMPLINK +#define PF_PUP AF_PUP +#define PF_CHAOS AF_CHAOS +#define PF_NS AF_NS +#define PF_IPX AF_IPX +#define PF_ISO AF_ISO +#define PF_OSI AF_OSI +#define PF_ECMA AF_ECMA +#define PF_DATAKIT AF_DATAKIT +#define PF_CCITT AF_CCITT +#define PF_SNA AF_SNA +#define PF_DECnet AF_DECnet +#define PF_DLI AF_DLI +#define PF_LAT AF_LAT +#define PF_HYLINK AF_HYLINK +#define PF_APPLETALK AF_APPLETALK +#define PF_VOICEVIEW AF_VOICEVIEW +#define PF_FIREFOX AF_FIREFOX +#define PF_UNKNOWN1 AF_UNKNOWN1 +#define PF_BAN AF_BAN +#define PF_ATM AF_ATM +#define PF_INET6 AF_INET6 +#define PF_MAX AF_MAX +#define SOL_SOCKET 0xffff +#define SOMAXCONN 5 +#if !(defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +#define MSG_OOB 1 +#define MSG_PEEK 2 +#define MSG_DONTROUTE 4 +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ +#define MSG_MAXIOVLEN 16 +#define MSG_PARTIAL 0x8000 +#define MAXGETHOSTSTRUCT 1024 +#define FD_READ 1 +#define FD_WRITE 2 +#define FD_OOB 4 +#define FD_ACCEPT 8 +#define FD_CONNECT 16 +#define FD_CLOSE 32 +#ifndef WSABASEERR +#define WSABASEERR 10000 +#define WSAEINTR (WSABASEERR+4) +#define WSAEBADF (WSABASEERR+9) +#define WSAEACCES (WSABASEERR+13) +#define WSAEFAULT (WSABASEERR+14) +#define WSAEINVAL (WSABASEERR+22) +#define WSAEMFILE (WSABASEERR+24) +#define WSAEWOULDBLOCK (WSABASEERR+35) +#define WSAEINPROGRESS (WSABASEERR+36) +#define WSAEALREADY (WSABASEERR+37) +#define WSAENOTSOCK (WSABASEERR+38) +#define WSAEDESTADDRREQ (WSABASEERR+39) +#define WSAEMSGSIZE (WSABASEERR+40) +#define WSAEPROTOTYPE (WSABASEERR+41) +#define WSAENOPROTOOPT (WSABASEERR+42) +#define WSAEPROTONOSUPPORT (WSABASEERR+43) +#define WSAESOCKTNOSUPPORT (WSABASEERR+44) +#define WSAEOPNOTSUPP (WSABASEERR+45) +#define WSAEPFNOSUPPORT (WSABASEERR+46) +#define WSAEAFNOSUPPORT (WSABASEERR+47) +#define WSAEADDRINUSE (WSABASEERR+48) +#define WSAEADDRNOTAVAIL (WSABASEERR+49) +#define WSAENETDOWN (WSABASEERR+50) +#define WSAENETUNREACH (WSABASEERR+51) +#define WSAENETRESET (WSABASEERR+52) +#define WSAECONNABORTED (WSABASEERR+53) +#define WSAECONNRESET (WSABASEERR+54) +#define WSAENOBUFS (WSABASEERR+55) +#define WSAEISCONN (WSABASEERR+56) +#define WSAENOTCONN (WSABASEERR+57) +#define WSAESHUTDOWN (WSABASEERR+58) +#define WSAETOOMANYREFS (WSABASEERR+59) +#define WSAETIMEDOUT (WSABASEERR+60) +#define WSAECONNREFUSED (WSABASEERR+61) +#define WSAELOOP (WSABASEERR+62) +#define WSAENAMETOOLONG (WSABASEERR+63) +#define WSAEHOSTDOWN (WSABASEERR+64) +#define WSAEHOSTUNREACH (WSABASEERR+65) +#define WSAENOTEMPTY (WSABASEERR+66) +#define WSAEPROCLIM (WSABASEERR+67) +#define WSAEUSERS (WSABASEERR+68) +#define WSAEDQUOT (WSABASEERR+69) +#define WSAESTALE (WSABASEERR+70) +#define WSAEREMOTE (WSABASEERR+71) +#define WSAEDISCON (WSABASEERR+101) +#define WSASYSNOTREADY (WSABASEERR+91) +#define WSAVERNOTSUPPORTED (WSABASEERR+92) +#define WSANOTINITIALISED (WSABASEERR+93) +#define WSAHOST_NOT_FOUND (WSABASEERR+1001) +#define WSATRY_AGAIN (WSABASEERR+1002) +#define WSANO_RECOVERY (WSABASEERR+1003) +#define WSANO_DATA (WSABASEERR+1004) +#endif /* !WSABASEERR */ + +#define WSANO_ADDRESS WSANO_DATA +#if !(defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +#define h_errno WSAGetLastError() +#define HOST_NOT_FOUND WSAHOST_NOT_FOUND +#define TRY_AGAIN WSATRY_AGAIN +#define NO_RECOVERY WSANO_RECOVERY +#define NO_DATA WSANO_DATA +#define NO_ADDRESS WSANO_ADDRESS +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ +SOCKET PASCAL accept(SOCKET,struct sockaddr*,int*); +int PASCAL bind(SOCKET,const struct sockaddr*,int); +int PASCAL closesocket(SOCKET); +int PASCAL connect(SOCKET,const struct sockaddr*,int); +int PASCAL ioctlsocket(SOCKET,long,u_long *); +int PASCAL getpeername(SOCKET,struct sockaddr*,int*); +int PASCAL getsockname(SOCKET,struct sockaddr*,int*); +int PASCAL getsockopt(SOCKET,int,int,char*,int*); +unsigned long PASCAL inet_addr(const char*); +DECLARE_STDCALL_P(char *) inet_ntoa(struct in_addr); +int PASCAL listen(SOCKET,int); +int PASCAL recv(SOCKET,char*,int,int); +int PASCAL recvfrom(SOCKET,char*,int,int,struct sockaddr*,int*); +int PASCAL send(SOCKET,const char*,int,int); +int PASCAL sendto(SOCKET,const char*,int,int,const struct sockaddr*,int); +int PASCAL setsockopt(SOCKET,int,int,const char*,int); +int PASCAL shutdown(SOCKET,int); +SOCKET PASCAL socket(int,int,int); +DECLARE_STDCALL_P(struct hostent *) gethostbyaddr(const char*,int,int); +DECLARE_STDCALL_P(struct hostent *) gethostbyname(const char*); +DECLARE_STDCALL_P(struct servent *) getservbyport(int,const char*); +DECLARE_STDCALL_P(struct servent *) getservbyname(const char*,const char*); +DECLARE_STDCALL_P(struct protoent *) getprotobynumber(int); +DECLARE_STDCALL_P(struct protoent *) getprotobyname(const char*); +int PASCAL WSAStartup(WORD,LPWSADATA); +int PASCAL WSACleanup(void); +void PASCAL WSASetLastError(int); +int PASCAL WSAGetLastError(void); +BOOL PASCAL WSAIsBlocking(void); +int PASCAL WSAUnhookBlockingHook(void); +FARPROC PASCAL WSASetBlockingHook(FARPROC); +int PASCAL WSACancelBlockingCall(void); +HANDLE PASCAL WSAAsyncGetServByName(HWND,u_int,const char*,const char*,char*,int); +HANDLE PASCAL WSAAsyncGetServByPort(HWND,u_int,int,const char*,char*,int); +HANDLE PASCAL WSAAsyncGetProtoByName(HWND,u_int,const char*,char*,int); +HANDLE PASCAL WSAAsyncGetProtoByNumber(HWND,u_int,int,char*,int); +HANDLE PASCAL WSAAsyncGetHostByName(HWND,u_int,const char*,char*,int); +HANDLE PASCAL WSAAsyncGetHostByAddr(HWND,u_int,const char*,int,int,char*,int); +int PASCAL WSACancelAsyncRequest(HANDLE); +int PASCAL WSAAsyncSelect(SOCKET,HWND,u_int,long); +#if !(defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +u_long PASCAL htonl(u_long); +u_long PASCAL ntohl(u_long); +u_short PASCAL htons(u_short); +u_short PASCAL ntohs(u_short); +int PASCAL select(int nfds,fd_set*,fd_set*,fd_set*,const struct timeval*); +int PASCAL gethostname(char*,int); +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ + +#define WSAMAKEASYNCREPLY(b,e) MAKELONG(b,e) +#define WSAMAKESELECTREPLY(e,error) MAKELONG(e,error) +#define WSAGETASYNCBUFLEN(l) LOWORD(l) +#define WSAGETASYNCERROR(l) HIWORD(l) +#define WSAGETSELECTEVENT(l) LOWORD(l) +#define WSAGETSELECTERROR(l) HIWORD(l) + +typedef struct sockaddr SOCKADDR; +typedef struct sockaddr *PSOCKADDR; +typedef struct sockaddr *LPSOCKADDR; +typedef struct sockaddr_in SOCKADDR_IN; +typedef struct sockaddr_in *PSOCKADDR_IN; +typedef struct sockaddr_in *LPSOCKADDR_IN; +typedef struct linger LINGER; +typedef struct linger *PLINGER; +typedef struct linger *LPLINGER; +typedef struct in_addr IN_ADDR; +typedef struct in_addr *PIN_ADDR; +typedef struct in_addr *LPIN_ADDR; +typedef struct fd_set FD_SET; +typedef struct fd_set *PFD_SET; +typedef struct fd_set *LPFD_SET; +typedef struct hostent HOSTENT; +typedef struct hostent *PHOSTENT; +typedef struct hostent *LPHOSTENT; +typedef struct servent SERVENT; +typedef struct servent *PSERVENT; +typedef struct servent *LPSERVENT; +typedef struct protoent PROTOENT; +typedef struct protoent *PPROTOENT; +typedef struct protoent *LPPROTOENT; +typedef struct timeval TIMEVAL; +typedef struct timeval *PTIMEVAL; +typedef struct timeval *LPTIMEVAL; + +#ifdef __cplusplus +} +#endif +/* + * Recent MSDN docs indicate that the MS-specific extensions exported from + * mswsock.dll (AcceptEx, TransmitFile. WSARecEx and GetAcceptExSockaddrs) are + * declared in mswsock.h. These extensions are not supported on W9x or WinCE. + * However, code using WinSock 1.1 API may expect the declarations and + * associated defines to be in this header. Thus we include mswsock.h here. + * + * When linking against the WinSock 1.1 lib, wsock32.dll, the mswsock functions + * are automatically routed to mswsock.dll (on platforms with support). + * The WinSock 2 lib, ws2_32.dll, does not contain any references to + * the mswsock extensions. + */ + +#include <mswsock.h> + +#endif diff --git a/reactos/w32api/include/winsock2.h b/reactos/w32api/include/winsock2.h new file mode 100644 index 00000000000..3cae8a93587 --- /dev/null +++ b/reactos/w32api/include/winsock2.h @@ -0,0 +1,1218 @@ +/* + + Definitions for winsock 2 + + Initially taken from the Wine project. + + Portions Copyright (c) 1980, 1983, 1988, 1993 + The Regents of the University of California. All rights reserved. + + Portions Copyright (c) 1993 by Digital Equipment Corporation. + */ + +#if !(defined _WINSOCK2_H || defined _WINSOCK_H) +#define _WINSOCK2_H +#define _WINSOCK_H /* to prevent later inclusion of winsock.h */ +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#define _GNU_H_WINDOWS32_SOCKETS + +#include <windows.h> + +#ifdef __cplusplus +extern "C" { +#endif +/* Names common to Winsock1.1 and Winsock2 */ +#if !defined ( _BSDTYPES_DEFINED ) +/* also defined in gmon.h and in cygwin's sys/types */ +typedef unsigned char u_char; +typedef unsigned short u_short; +typedef unsigned int u_int; +typedef unsigned long u_long; +#define _BSDTYPES_DEFINED +#endif /* ! def _BSDTYPES_DEFINED */ +typedef u_int SOCKET; +#ifndef FD_SETSIZE +#define FD_SETSIZE 64 +#endif + +/* shutdown() how types */ +#define SD_RECEIVE 0x00 +#define SD_SEND 0x01 +#define SD_BOTH 0x02 + +#ifndef _SYS_TYPES_FD_SET +/* fd_set may be defined by the newlib <sys/types.h> + * if __USE_W32_SOCKETS not defined. + */ +#ifdef fd_set +#undef fd_set +#endif +typedef struct fd_set { + u_int fd_count; + SOCKET fd_array[FD_SETSIZE]; +} fd_set; +int PASCAL __WSAFDIsSet(SOCKET,fd_set*); +#ifndef FD_CLR +#define FD_CLR(fd,set) do { u_int __i;\ +for (__i = 0; __i < ((fd_set *)(set))->fd_count ; __i++) {\ + if (((fd_set *)(set))->fd_array[__i] == (fd)) {\ + while (__i < ((fd_set *)(set))->fd_count-1) {\ + ((fd_set*)(set))->fd_array[__i] = ((fd_set*)(set))->fd_array[__i+1];\ + __i++;\ + }\ + ((fd_set*)(set))->fd_count--;\ + break;\ + }\ +}\ +} while (0) +#endif +#ifndef FD_SET +/* this differs from the define in winsock.h and in cygwin sys/types.h */ +#define FD_SET(fd, set) do { u_int __i;\ +for (__i = 0; __i < ((fd_set *)(set))->fd_count ; __i++) {\ + if (((fd_set *)(set))->fd_array[__i] == (fd)) {\ + break;\ + }\ +}\ +if (__i == ((fd_set *)(set))->fd_count) {\ + if (((fd_set *)(set))->fd_count < FD_SETSIZE) {\ + ((fd_set *)(set))->fd_array[__i] = (fd);\ + ((fd_set *)(set))->fd_count++;\ + }\ +}\ +} while(0) +#endif +#ifndef FD_ZERO +#define FD_ZERO(set) (((fd_set *)(set))->fd_count=0) +#endif +#ifndef FD_ISSET +#define FD_ISSET(fd, set) __WSAFDIsSet((SOCKET)(fd), (fd_set *)(set)) +#endif +#elif !defined (USE_SYS_TYPES_FD_SET) +#warning "fd_set and associated macros have been defined in sys/types. \ + This may cause runtime problems with W32 sockets" +#endif /* ndef _SYS_TYPES_FD_SET */ +#if !(defined (__INSIDE_CYGWIN__) || (__INSIDE_MSYS__)) +#ifndef _TIMEVAL_DEFINED /* also in sys/time.h */ +#define _TIMEVAL_DEFINED +struct timeval { + long tv_sec; + long tv_usec; +}; +#define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec) +#define timercmp(tvp, uvp, cmp) \ + (((tvp)->tv_sec != (uvp)->tv_sec) ? \ + ((tvp)->tv_sec cmp (uvp)->tv_sec) : \ + ((tvp)->tv_usec cmp (uvp)->tv_usec)) +#define timerclear(tvp) (tvp)->tv_sec = (tvp)->tv_usec = 0 +#endif /* _TIMEVAL_DEFINED */ +struct hostent { + char *h_name; + char **h_aliases; + short h_addrtype; + short h_length; + char **h_addr_list; +#define h_addr h_addr_list[0] +}; +struct linger { + u_short l_onoff; + u_short l_linger; +}; +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ +#define IOCPARM_MASK 0x7f +#define IOC_VOID 0x20000000 +#define IOC_OUT 0x40000000 +#define IOC_IN 0x80000000 +#define IOC_INOUT (IOC_IN|IOC_OUT) + +#if ! (defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +#define _IO(x,y) (IOC_VOID|((x)<<8)|(y)) +#define _IOR(x,y,t) (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) +#define _IOW(x,y,t) (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) +#define FIONBIO _IOW('f', 126, u_long) +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ + +#define FIONREAD _IOR('f', 127, u_long) +#define FIOASYNC _IOW('f', 125, u_long) +#define SIOCSHIWAT _IOW('s', 0, u_long) +#define SIOCGHIWAT _IOR('s', 1, u_long) +#define SIOCSLOWAT _IOW('s', 2, u_long) +#define SIOCGLOWAT _IOR('s', 3, u_long) +#define SIOCATMARK _IOR('s', 7, u_long) + +#if ! (defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +struct netent { + char * n_name; + char **n_aliases; + short n_addrtype; + u_long n_net; +}; +struct servent { + char *s_name; + char **s_aliases; + short s_port; + char *s_proto; +}; +struct protoent { + char *p_name; + char **p_aliases; + short p_proto; +}; +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ + +#define IPPROTO_IP 0 +#define IPPROTO_ICMP 1 +#define IPPROTO_IGMP 2 +#define IPPROTO_GGP 3 +#define IPPROTO_TCP 6 +#define IPPROTO_PUP 12 +#define IPPROTO_UDP 17 +#define IPPROTO_IDP 22 +#define IPPROTO_ND 77 +#define IPPROTO_RAW 255 +#define IPPROTO_MAX 256 +/* IPv6 options */ +#define IPPROTO_HOPOPTS 0 /* IPv6 Hop-by-Hop options */ +#define IPPROTO_IPV6 41 /* IPv6 header */ +#define IPPROTO_ROUTING 43 /* IPv6 Routing header */ +#define IPPROTO_FRAGMENT 44 /* IPv6 fragmentation header */ +#define IPPROTO_ESP 50 /* encapsulating security payload */ +#define IPPROTO_AH 51 /* authentication header */ +#define IPPROTO_ICMPV6 58 /* ICMPv6 */ +#define IPPROTO_NONE 59 /* IPv6 no next header */ +#define IPPROTO_DSTOPTS 60 /* IPv6 Destination options */ +#define IPPORT_ECHO 7 +#define IPPORT_DISCARD 9 +#define IPPORT_SYSTAT 11 +#define IPPORT_DAYTIME 13 +#define IPPORT_NETSTAT 15 +#define IPPORT_FTP 21 +#define IPPORT_TELNET 23 +#define IPPORT_SMTP 25 +#define IPPORT_TIMESERVER 37 +#define IPPORT_NAMESERVER 42 +#define IPPORT_WHOIS 43 +#define IPPORT_MTP 57 +#define IPPORT_TFTP 69 +#define IPPORT_RJE 77 +#define IPPORT_FINGER 79 +#define IPPORT_TTYLINK 87 +#define IPPORT_SUPDUP 95 +#define IPPORT_EXECSERVER 512 +#define IPPORT_LOGINSERVER 513 +#define IPPORT_CMDSERVER 514 +#define IPPORT_EFSSERVER 520 +#define IPPORT_BIFFUDP 512 +#define IPPORT_WHOSERVER 513 +#define IPPORT_ROUTESERVER 520 +#define IPPORT_RESERVED 1024 +#define IMPLINK_IP 155 +#define IMPLINK_LOWEXPER 156 +#define IMPLINK_HIGHEXPER 158 +struct in_addr { + union { + struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b; + struct { u_short s_w1,s_w2; } S_un_w; + u_long S_addr; + } S_un; +#define s_addr S_un.S_addr +#define s_host S_un.S_un_b.s_b2 +#define s_net S_un.S_un_b.s_b1 +#define s_imp S_un.S_un_w.s_w2 +#define s_impno S_un.S_un_b.s_b4 +#define s_lh S_un.S_un_b.s_b3 +}; +#define IN_CLASSA(i) ((long)(i)&0x80000000) +#define IN_CLASSA_NET 0xff000000 +#define IN_CLASSA_NSHIFT 24 +#define IN_CLASSA_HOST 0x00ffffff +#define IN_CLASSA_MAX 128 +#define IN_CLASSB(i) (((long)(i)&0xc0000000)==0x80000000) +#define IN_CLASSB_NET 0xffff0000 +#define IN_CLASSB_NSHIFT 16 +#define IN_CLASSB_HOST 0x0000ffff +#define IN_CLASSB_MAX 65536 +#define IN_CLASSC(i) (((long)(i)&0xe0000000)==0xc0000000) +#define IN_CLASSC_NET 0xffffff00 +#define IN_CLASSC_NSHIFT 8 +#define IN_CLASSC_HOST 0xff +#define INADDR_ANY (u_long)0 +#define INADDR_LOOPBACK 0x7f000001 +#define INADDR_BROADCAST (u_long)0xffffffff +#define INADDR_NONE 0xffffffff +struct sockaddr_in { + short sin_family; + u_short sin_port; + struct in_addr sin_addr; + char sin_zero[8]; +}; +#define WSADESCRIPTION_LEN 256 +#define WSASYS_STATUS_LEN 128 +typedef struct WSAData { + WORD wVersion; + WORD wHighVersion; + char szDescription[WSADESCRIPTION_LEN+1]; + char szSystemStatus[WSASYS_STATUS_LEN+1]; + unsigned short iMaxSockets; + unsigned short iMaxUdpDg; + char * lpVendorInfo; +} WSADATA; +typedef WSADATA *LPWSADATA; + +#if ! (defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +#define IP_OPTIONS 1 +#define SO_DEBUG 1 +#define SO_ACCEPTCONN 2 +#define SO_REUSEADDR 4 +#define SO_KEEPALIVE 8 +#define SO_DONTROUTE 16 +#define SO_BROADCAST 32 +#define SO_USELOOPBACK 64 +#define SO_LINGER 128 +#define SO_OOBINLINE 256 +#define SO_DONTLINGER (u_int)(~SO_LINGER) +#define SO_SNDBUF 0x1001 +#define SO_RCVBUF 0x1002 +#define SO_SNDLOWAT 0x1003 +#define SO_RCVLOWAT 0x1004 +#define SO_SNDTIMEO 0x1005 +#define SO_RCVTIMEO 0x1006 +#define SO_ERROR 0x1007 +#define SO_TYPE 0x1008 +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ + +#define INVALID_SOCKET (SOCKET)(~0) +#define SOCKET_ERROR (-1) +#define SOCK_STREAM 1 +#define SOCK_DGRAM 2 +#define SOCK_RAW 3 +#define SOCK_RDM 4 +#define SOCK_SEQPACKET 5 +#define TCP_NODELAY 0x0001 +#define AF_UNSPEC 0 +#define AF_UNIX 1 +#define AF_INET 2 +#define AF_IMPLINK 3 +#define AF_PUP 4 +#define AF_CHAOS 5 +#define AF_IPX 6 +#define AF_NS 6 +#define AF_ISO 7 +#define AF_OSI AF_ISO +#define AF_ECMA 8 +#define AF_DATAKIT 9 +#define AF_CCITT 10 +#define AF_SNA 11 +#define AF_DECnet 12 +#define AF_DLI 13 +#define AF_LAT 14 +#define AF_HYLINK 15 +#define AF_APPLETALK 16 +#define AF_NETBIOS 17 +#define AF_VOICEVIEW 18 +#define AF_FIREFOX 19 +#define AF_UNKNOWN1 20 +#define AF_BAN 21 +#define AF_ATM 22 +#define AF_INET6 23 +#define AF_CLUSTER 24 +#define AF_12844 25 +#define AF_IRDA 26 +#define AF_NETDES 28 +#if !(defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +#define AF_MAX 29 +struct sockaddr { + u_short sa_family; + char sa_data[14]; +}; +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ + +/* Portable IPv6/IPv4 version of sockaddr. + Uses padding to force 8 byte alignment + and maximum size of 128 bytes */ +struct sockaddr_storage { + short ss_family; + char __ss_pad1[6]; /* pad to 8 */ + __int64 __ss_align; /* force alignment */ + char __ss_pad2[112]; /* pad to 128 */ +}; + +struct sockproto { + u_short sp_family; + u_short sp_protocol; +}; +#define PF_UNSPEC AF_UNSPEC +#define PF_UNIX AF_UNIX +#define PF_INET AF_INET +#define PF_IMPLINK AF_IMPLINK +#define PF_PUP AF_PUP +#define PF_CHAOS AF_CHAOS +#define PF_NS AF_NS +#define PF_IPX AF_IPX +#define PF_ISO AF_ISO +#define PF_OSI AF_OSI +#define PF_ECMA AF_ECMA +#define PF_DATAKIT AF_DATAKIT +#define PF_CCITT AF_CCITT +#define PF_SNA AF_SNA +#define PF_DECnet AF_DECnet +#define PF_DLI AF_DLI +#define PF_LAT AF_LAT +#define PF_HYLINK AF_HYLINK +#define PF_APPLETALK AF_APPLETALK +#define PF_VOICEVIEW AF_VOICEVIEW +#define PF_FIREFOX AF_FIREFOX +#define PF_UNKNOWN1 AF_UNKNOWN1 +#define PF_BAN AF_BAN +#define PF_ATM AF_ATM +#define PF_INET6 AF_INET6 +#define PF_MAX AF_MAX +#define SOL_SOCKET 0xffff +#if ! (defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +#define SOMAXCONN 0x7fffffff /* (5) in WinSock1.1 */ +#define MSG_OOB 1 +#define MSG_PEEK 2 +#define MSG_DONTROUTE 4 +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ +#define MSG_MAXIOVLEN 16 +#define MSG_PARTIAL 0x8000 +#define MAXGETHOSTSTRUCT 1024 + +#define FD_READ_BIT 0 +#define FD_READ (1 << FD_READ_BIT) +#define FD_WRITE_BIT 1 +#define FD_WRITE (1 << FD_WRITE_BIT) +#define FD_OOB_BIT 2 +#define FD_OOB (1 << FD_OOB_BIT) +#define FD_ACCEPT_BIT 3 +#define FD_ACCEPT (1 << FD_ACCEPT_BIT) +#define FD_CONNECT_BIT 4 +#define FD_CONNECT (1 << FD_CONNECT_BIT) +#define FD_CLOSE_BIT 5 +#define FD_CLOSE (1 << FD_CLOSE_BIT) +/* winsock1.1 defines stop at FD_CLOSE (32) */ +#define FD_QOS_BIT 6 +#define FD_QOS (1 << FD_QOS_BIT) +#define FD_GROUP_QOS_BIT 7 +#define FD_GROUP_QOS (1 << FD_GROUP_QOS_BIT) +#define FD_ROUTING_INTERFACE_CHANGE_BIT 8 +#define FD_ROUTING_INTERFACE_CHANGE (1 << FD_ROUTING_INTERFACE_CHANGE_BIT) +#define FD_ADDRESS_LIST_CHANGE_BIT 9 +#define FD_ADDRESS_LIST_CHANGE (1 << FD_ADDRESS_LIST_CHANGE_BIT) +#define FD_MAX_EVENTS 10 +#define FD_ALL_EVENTS ((1 << FD_MAX_EVENTS) - 1) + +#ifndef WSABASEERR +#define WSABASEERR 10000 +#define WSAEINTR (WSABASEERR+4) +#define WSAEBADF (WSABASEERR+9) +#define WSAEACCES (WSABASEERR+13) +#define WSAEFAULT (WSABASEERR+14) +#define WSAEINVAL (WSABASEERR+22) +#define WSAEMFILE (WSABASEERR+24) +#define WSAEWOULDBLOCK (WSABASEERR+35) +#define WSAEINPROGRESS (WSABASEERR+36) /* deprecated on WinSock2 */ +#define WSAEALREADY (WSABASEERR+37) +#define WSAENOTSOCK (WSABASEERR+38) +#define WSAEDESTADDRREQ (WSABASEERR+39) +#define WSAEMSGSIZE (WSABASEERR+40) +#define WSAEPROTOTYPE (WSABASEERR+41) +#define WSAENOPROTOOPT (WSABASEERR+42) +#define WSAEPROTONOSUPPORT (WSABASEERR+43) +#define WSAESOCKTNOSUPPORT (WSABASEERR+44) +#define WSAEOPNOTSUPP (WSABASEERR+45) +#define WSAEPFNOSUPPORT (WSABASEERR+46) +#define WSAEAFNOSUPPORT (WSABASEERR+47) +#define WSAEADDRINUSE (WSABASEERR+48) +#define WSAEADDRNOTAVAIL (WSABASEERR+49) +#define WSAENETDOWN (WSABASEERR+50) +#define WSAENETUNREACH (WSABASEERR+51) +#define WSAENETRESET (WSABASEERR+52) +#define WSAECONNABORTED (WSABASEERR+53) +#define WSAECONNRESET (WSABASEERR+54) +#define WSAENOBUFS (WSABASEERR+55) +#define WSAEISCONN (WSABASEERR+56) +#define WSAENOTCONN (WSABASEERR+57) +#define WSAESHUTDOWN (WSABASEERR+58) +#define WSAETOOMANYREFS (WSABASEERR+59) +#define WSAETIMEDOUT (WSABASEERR+60) +#define WSAECONNREFUSED (WSABASEERR+61) +#define WSAELOOP (WSABASEERR+62) +#define WSAENAMETOOLONG (WSABASEERR+63) +#define WSAEHOSTDOWN (WSABASEERR+64) +#define WSAEHOSTUNREACH (WSABASEERR+65) +#define WSAENOTEMPTY (WSABASEERR+66) +#define WSAEPROCLIM (WSABASEERR+67) +#define WSAEUSERS (WSABASEERR+68) +#define WSAEDQUOT (WSABASEERR+69) +#define WSAESTALE (WSABASEERR+70) +#define WSAEREMOTE (WSABASEERR+71) +#define WSAEDISCON (WSABASEERR+101) +#define WSASYSNOTREADY (WSABASEERR+91) +#define WSAVERNOTSUPPORTED (WSABASEERR+92) +#define WSANOTINITIALISED (WSABASEERR+93) +#define WSAHOST_NOT_FOUND (WSABASEERR+1001) +#define WSATRY_AGAIN (WSABASEERR+1002) +#define WSANO_RECOVERY (WSABASEERR+1003) +#define WSANO_DATA (WSABASEERR+1004) + +/* WinSock2 specific error codes */ +#define WSAENOMORE (WSABASEERR+102) +#define WSAECANCELLED (WSABASEERR+103) +#define WSAEINVALIDPROCTABLE (WSABASEERR+104) +#define WSAEINVALIDPROVIDER (WSABASEERR+105) +#define WSAEPROVIDERFAILEDINIT (WSABASEERR+106) +#define WSASYSCALLFAILURE (WSABASEERR+107) +#define WSASERVICE_NOT_FOUND (WSABASEERR+108) +#define WSATYPE_NOT_FOUND (WSABASEERR+109) +#define WSA_E_NO_MORE (WSABASEERR+110) +#define WSA_E_CANCELLED (WSABASEERR+111) +#define WSAEREFUSED (WSABASEERR+112) + +/* WS QualityofService errors */ +#define WSA_QOS_RECEIVERS (WSABASEERR + 1005) +#define WSA_QOS_SENDERS (WSABASEERR + 1006) +#define WSA_QOS_NO_SENDERS (WSABASEERR + 1007) +#define WSA_QOS_NO_RECEIVERS (WSABASEERR + 1008) +#define WSA_QOS_REQUEST_CONFIRMED (WSABASEERR + 1009) +#define WSA_QOS_ADMISSION_FAILURE (WSABASEERR + 1010) +#define WSA_QOS_POLICY_FAILURE (WSABASEERR + 1011) +#define WSA_QOS_BAD_STYLE (WSABASEERR + 1012) +#define WSA_QOS_BAD_OBJECT (WSABASEERR + 1013) +#define WSA_QOS_TRAFFIC_CTRL_ERROR (WSABASEERR + 1014) +#define WSA_QOS_GENERIC_ERROR (WSABASEERR + 1015) +#define WSA_QOS_ESERVICETYPE (WSABASEERR + 1016) +#define WSA_QOS_EFLOWSPEC (WSABASEERR + 1017) +#define WSA_QOS_EPROVSPECBUF (WSABASEERR + 1018) +#define WSA_QOS_EFILTERSTYLE (WSABASEERR + 1019) +#define WSA_QOS_EFILTERTYPE (WSABASEERR + 1020) +#define WSA_QOS_EFILTERCOUNT (WSABASEERR + 1021) +#define WSA_QOS_EOBJLENGTH (WSABASEERR + 1022) +#define WSA_QOS_EFLOWCOUNT (WSABASEERR + 1023) +#define WSA_QOS_EUNKOWNPSOBJ (WSABASEERR + 1024) +#define WSA_QOS_EPOLICYOBJ (WSABASEERR + 1025) +#define WSA_QOS_EFLOWDESC (WSABASEERR + 1026) +#define WSA_QOS_EPSFLOWSPEC (WSABASEERR + 1027) +#define WSA_QOS_EPSFILTERSPEC (WSABASEERR + 1028) +#define WSA_QOS_ESDMODEOBJ (WSABASEERR + 1029) +#define WSA_QOS_ESHAPERATEOBJ (WSABASEERR + 1030) +#define WSA_QOS_RESERVED_PETYPE (WSABASEERR + 1031) + +#endif /* !WSABASEERR */ + +#define WSANO_ADDRESS WSANO_DATA +#if !(defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +#define h_errno WSAGetLastError() +#define HOST_NOT_FOUND WSAHOST_NOT_FOUND +#define TRY_AGAIN WSATRY_AGAIN +#define NO_RECOVERY WSANO_RECOVERY +#define NO_DATA WSANO_DATA +#define NO_ADDRESS WSANO_ADDRESS +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ +SOCKET PASCAL accept(SOCKET,struct sockaddr*,int*); +int PASCAL bind(SOCKET,const struct sockaddr*,int); +int PASCAL closesocket(SOCKET); +int PASCAL connect(SOCKET,const struct sockaddr*,int); +int PASCAL ioctlsocket(SOCKET,long,u_long *); +int PASCAL getpeername(SOCKET,struct sockaddr*,int*); +int PASCAL getsockname(SOCKET,struct sockaddr*,int*); +int PASCAL getsockopt(SOCKET,int,int,char*,int*); +unsigned long PASCAL inet_addr(const char*); +DECLARE_STDCALL_P(char *) inet_ntoa(struct in_addr); +int PASCAL listen(SOCKET,int); +int PASCAL recv(SOCKET,char*,int,int); +int PASCAL recvfrom(SOCKET,char*,int,int,struct sockaddr*,int*); +int PASCAL send(SOCKET,const char*,int,int); +int PASCAL sendto(SOCKET,const char*,int,int,const struct sockaddr*,int); +int PASCAL setsockopt(SOCKET,int,int,const char*,int); +int PASCAL shutdown(SOCKET,int); +SOCKET PASCAL socket(int,int,int); +DECLARE_STDCALL_P(struct hostent *) gethostbyaddr(const char*,int,int); +DECLARE_STDCALL_P(struct hostent *) gethostbyname(const char*); +DECLARE_STDCALL_P(struct servent *) getservbyport(int,const char*); +DECLARE_STDCALL_P(struct servent *) getservbyname(const char*,const char*); +DECLARE_STDCALL_P(struct protoent *) getprotobynumber(int); +DECLARE_STDCALL_P(struct protoent *) getprotobyname(const char*); +int PASCAL WSAStartup(WORD,LPWSADATA); +int PASCAL WSACleanup(void); +void PASCAL WSASetLastError(int); +int PASCAL WSAGetLastError(void); +/* + * Pseudo-blocking functions are deprecated in WinSock2 + * spec. Use threads instead. + */ +BOOL PASCAL WSAIsBlocking(void); +int PASCAL WSAUnhookBlockingHook(void); +FARPROC PASCAL WSASetBlockingHook(FARPROC); +int PASCAL WSACancelBlockingCall(void); + +HANDLE PASCAL WSAAsyncGetServByName(HWND,u_int,const char*,const char*,char*,int); +HANDLE PASCAL WSAAsyncGetServByPort(HWND,u_int,int,const char*,char*,int); +HANDLE PASCAL WSAAsyncGetProtoByName(HWND,u_int,const char*,char*,int); +HANDLE PASCAL WSAAsyncGetProtoByNumber(HWND,u_int,int,char*,int); +HANDLE PASCAL WSAAsyncGetHostByName(HWND,u_int,const char*,char*,int); +HANDLE PASCAL WSAAsyncGetHostByAddr(HWND,u_int,const char*,int,int,char*,int); +int PASCAL WSACancelAsyncRequest(HANDLE); +int PASCAL WSAAsyncSelect(SOCKET,HWND,u_int,long); +#if ! (defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +u_long PASCAL htonl(u_long); +u_long PASCAL ntohl(u_long); +u_short PASCAL htons(u_short); +u_short PASCAL ntohs(u_short); +int PASCAL select(int nfds,fd_set*,fd_set*,fd_set*,const struct timeval*); +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ + +int PASCAL gethostname(char*,int); + +#define WSAMAKEASYNCREPLY(b,e) MAKELONG(b,e) +#define WSAMAKESELECTREPLY(e,error) MAKELONG(e,error) +#define WSAGETASYNCBUFLEN(l) LOWORD(l) +#define WSAGETASYNCERROR(l) HIWORD(l) +#define WSAGETSELECTEVENT(l) LOWORD(l) +#define WSAGETSELECTERROR(l) HIWORD(l) + +typedef struct sockaddr SOCKADDR; +typedef struct sockaddr *PSOCKADDR; +typedef struct sockaddr *LPSOCKADDR; +typedef struct sockaddr_storage SOCKADDR_STORAGE, *PSOCKADDR_STORAGE; +typedef struct sockaddr_in SOCKADDR_IN; +typedef struct sockaddr_in *PSOCKADDR_IN; +typedef struct sockaddr_in *LPSOCKADDR_IN; +typedef struct linger LINGER; +typedef struct linger *PLINGER; +typedef struct linger *LPLINGER; +typedef struct in_addr IN_ADDR; +typedef struct in_addr *PIN_ADDR; +typedef struct in_addr *LPIN_ADDR; +typedef struct fd_set FD_SET; +typedef struct fd_set *PFD_SET; +typedef struct fd_set *LPFD_SET; +typedef struct hostent HOSTENT; +typedef struct hostent *PHOSTENT; +typedef struct hostent *LPHOSTENT; +typedef struct servent SERVENT; +typedef struct servent *PSERVENT; +typedef struct servent *LPSERVENT; +typedef struct protoent PROTOENT; +typedef struct protoent *PPROTOENT; +typedef struct protoent *LPPROTOENT; +typedef struct timeval TIMEVAL; +typedef struct timeval *PTIMEVAL; +typedef struct timeval *LPTIMEVAL; + +/* winsock2 additions */ +#define ADDR_ANY INADDR_ANY + +#define IN_CLASSD(i) (((long)(i) & 0xf0000000) == 0xe0000000) +#define IN_CLASSD_NET 0xf0000000 +#define IN_CLASSD_NSHIFT 28 +#define IN_CLASSD_HOST 0x0fffffff +#define IN_MULTICAST(i) IN_CLASSD(i) + +#define FROM_PROTOCOL_INFO (-1) + +#define SO_DONTLINGER (u_int)(~SO_LINGER) +#define SO_GROUP_ID 0x2001 +#define SO_GROUP_PRIORITY 0x2002 +#define SO_MAX_MSG_SIZE 0x2003 +#define SO_PROTOCOL_INFOA 0x2004 +#define SO_PROTOCOL_INFOW 0x2005 +#ifdef UNICODE +#define SO_PROTOCOL_INFO SO_PROTOCOL_INFOW +#else +#define SO_PROTOCOL_INFO SO_PROTOCOL_INFOA +#endif +#define PVD_CONFIG 0x3001 + +#define MSG_INTERRUPT 0x10 +#define MSG_MAXIOVLEN 16 + +#define WSAAPI WINAPI +#define WSAEVENT HANDLE +#define LPWSAEVENT LPHANDLE +#define WSAOVERLAPPED OVERLAPPED +typedef struct _OVERLAPPED *LPWSAOVERLAPPED; + +#define WSA_IO_PENDING (ERROR_IO_PENDING) +#define WSA_IO_INCOMPLETE (ERROR_IO_INCOMPLETE) +#define WSA_INVALID_HANDLE (ERROR_INVALID_HANDLE) +#define WSA_INVALID_PARAMETER (ERROR_INVALID_PARAMETER) +#define WSA_NOT_ENOUGH_MEMORY (ERROR_NOT_ENOUGH_MEMORY) +#define WSA_OPERATION_ABORTED (ERROR_OPERATION_ABORTED) + +#define WSA_INVALID_EVENT ((WSAEVENT)NULL) +#define WSA_MAXIMUM_WAIT_EVENTS (MAXIMUM_WAIT_OBJECTS) +#define WSA_WAIT_FAILED ((DWORD)-1L) +#define WSA_WAIT_EVENT_0 (WAIT_OBJECT_0) +#define WSA_WAIT_IO_COMPLETION (WAIT_IO_COMPLETION) +#define WSA_WAIT_TIMEOUT (WAIT_TIMEOUT) +#define WSA_INFINITE (INFINITE) + +typedef struct _WSABUF { + unsigned long len; + char *buf; +} WSABUF, *LPWSABUF; + +typedef enum +{ + BestEffortService, + ControlledLoadService, + PredictiveService, + GuaranteedDelayService, + GuaranteedService +} GUARANTEE; + +/* TODO: FLOWSPEC and related definitions belong in qos.h */ + +/* + Windows Sockets 2 Application Programming Interface, + revision 2.2.2 (1997) uses the type uint32 for SERVICETYPE + and the elements of _flowspec, but the type uint32 is not defined + or used anywhere else in the w32api. For now, just use + unsigned int, which is 32 bits on _WIN32 and _WIN64. +*/ + +typedef unsigned int SERVICETYPE; +typedef struct _flowspec +{ + unsigned int TokenRate; + unsigned int TokenBucketSize; + unsigned int PeakBandwidth; + unsigned int Latency; + unsigned int DelayVariation; + SERVICETYPE ServiceType; + unsigned int MaxSduSize; + unsigned int MinimumPolicedSize; + } FLOWSPEC, *PFLOWSPEC, *LPFLOWSPEC; + +typedef struct _QualityOfService +{ + FLOWSPEC SendingFlowspec; + FLOWSPEC ReceivingFlowspec; + WSABUF ProviderSpecific; +} QOS, *LPQOS; + +#define CF_ACCEPT 0x0000 +#define CF_REJECT 0x0001 +#define CF_DEFER 0x0002 +#define SD_RECEIVE 0x00 +#define SD_SEND 0x01 +#define SD_BOTH 0x02 +typedef unsigned int GROUP; + +#define SG_UNCONSTRAINED_GROUP 0x01 +#define SG_CONSTRAINED_GROUP 0x02 +typedef struct _WSANETWORKEVENTS { + long lNetworkEvents; + int iErrorCode[FD_MAX_EVENTS]; +} WSANETWORKEVENTS, *LPWSANETWORKEVENTS; + +#define MAX_PROTOCOL_CHAIN 7 + +#define BASE_PROTOCOL 1 +#define LAYERED_PROTOCOL 0 + +typedef enum _WSAESETSERVICEOP +{ + RNRSERVICE_REGISTER=0, + RNRSERVICE_DEREGISTER, + RNRSERVICE_DELETE +} WSAESETSERVICEOP, *PWSAESETSERVICEOP, *LPWSAESETSERVICEOP; + +typedef struct _AFPROTOCOLS { + INT iAddressFamily; + INT iProtocol; +} AFPROTOCOLS, *PAFPROTOCOLS, *LPAFPROTOCOLS; + +typedef enum _WSAEcomparator +{ + COMP_EQUAL = 0, + COMP_NOTLESS +} WSAECOMPARATOR, *PWSAECOMPARATOR, *LPWSAECOMPARATOR; + +typedef struct _WSAVersion +{ + DWORD dwVersion; + WSAECOMPARATOR ecHow; +} WSAVERSION, *PWSAVERSION, *LPWSAVERSION; + +#ifndef __CSADDR_T_DEFINED /* also in nspapi.h */ +#define __CSADDR_T_DEFINED +typedef struct _SOCKET_ADDRESS { + LPSOCKADDR lpSockaddr; + INT iSockaddrLength; +} SOCKET_ADDRESS,*PSOCKET_ADDRESS,*LPSOCKET_ADDRESS; +typedef struct _CSADDR_INFO { + SOCKET_ADDRESS LocalAddr; + SOCKET_ADDRESS RemoteAddr; + INT iSocketType; + INT iProtocol; +} CSADDR_INFO,*PCSADDR_INFO,*LPCSADDR_INFO; +#endif + +typedef struct _SOCKET_ADDRESS_LIST { + INT iAddressCount; + SOCKET_ADDRESS Address[1]; +} SOCKET_ADDRESS_LIST, * LPSOCKET_ADDRESS_LIST; + +#ifndef __BLOB_T_DEFINED /* also in wtypes.h and nspapi.h */ +#define __BLOB_T_DEFINED +typedef struct _BLOB { + ULONG cbSize; + BYTE *pBlobData; +} BLOB,*PBLOB,*LPBLOB; +#endif + +typedef struct _WSAQuerySetA +{ + DWORD dwSize; + LPSTR lpszServiceInstanceName; + LPGUID lpServiceClassId; + LPWSAVERSION lpVersion; + LPSTR lpszComment; + DWORD dwNameSpace; + LPGUID lpNSProviderId; + LPSTR lpszContext; + DWORD dwNumberOfProtocols; + LPAFPROTOCOLS lpafpProtocols; + LPSTR lpszQueryString; + DWORD dwNumberOfCsAddrs; + LPCSADDR_INFO lpcsaBuffer; + DWORD dwOutputFlags; + LPBLOB lpBlob; +} WSAQUERYSETA, *PWSAQUERYSETA, *LPWSAQUERYSETA; + +typedef struct _WSAQuerySetW +{ + DWORD dwSize; + LPWSTR lpszServiceInstanceName; + LPGUID lpServiceClassId; + LPWSAVERSION lpVersion; + LPWSTR lpszComment; + DWORD dwNameSpace; + LPGUID lpNSProviderId; + LPWSTR lpszContext; + DWORD dwNumberOfProtocols; + LPAFPROTOCOLS lpafpProtocols; + LPWSTR lpszQueryString; + DWORD dwNumberOfCsAddrs; + LPCSADDR_INFO lpcsaBuffer; + DWORD dwOutputFlags; + LPBLOB lpBlob; +} WSAQUERYSETW, *PWSAQUERYSETW, *LPWSAQUERYSETW; + +#ifdef UNICODE +typedef WSAQUERYSETW WSAQUERYSET; +typedef PWSAQUERYSETW PWSAQUERYSET; +typedef LPWSAQUERYSETW LPWSAQUERYSET; +#else +typedef WSAQUERYSETA WSAQUERYSET; +typedef PWSAQUERYSETA PWSAQUERYSET; +typedef LPWSAQUERYSETA LPWSAQUERYSET; +#endif + +typedef struct _WSANSClassInfoA +{ + LPSTR lpszName; + DWORD dwNameSpace; + DWORD dwValueType; + DWORD dwValueSize; + LPVOID lpValue; +} WSANSCLASSINFOA, *PWSANSCLASSINFOA, *LPWSANSCLASSINFOA; + +typedef struct _WSANSClassInfoW +{ + LPWSTR lpszName; + DWORD dwNameSpace; + DWORD dwValueType; + DWORD dwValueSize; + LPVOID lpValue; +} WSANSCLASSINFOW, *PWSANSCLASSINFOW, *LPWSANSCLASSINFOW; + +#ifdef UNICODE +typedef WSANSCLASSINFOW WSANSCLASSINFO; +typedef PWSANSCLASSINFOW PWSANSCLASSINFO; +typedef LPWSANSCLASSINFOW LPWSANSCLASSINFO; +#else +typedef WSANSCLASSINFOA WSANSCLASSINFO; +typedef PWSANSCLASSINFOA PWSANSCLASSINFO; +typedef LPWSANSCLASSINFOA LPWSANSCLASSINFO; +#endif + +typedef struct _WSAServiceClassInfoA +{ + LPGUID lpServiceClassId; + LPSTR lpszServiceClassName; + DWORD dwCount; + LPWSANSCLASSINFOA lpClassInfos; +} WSASERVICECLASSINFOA, *PWSASERVICECLASSINFOA, *LPWSASERVICECLASSINFOA; + +typedef struct _WSAServiceClassInfoW +{ + LPGUID lpServiceClassId; + LPWSTR lpszServiceClassName; + DWORD dwCount; + LPWSANSCLASSINFOW lpClassInfos; +} WSASERVICECLASSINFOW, *PWSASERVICECLASSINFOW, *LPWSASERVICECLASSINFOW; + +#ifdef UNICODE +typedef WSASERVICECLASSINFOW WSASERVICECLASSINFO; +typedef PWSASERVICECLASSINFOW PWSASERVICECLASSINFO; +typedef LPWSASERVICECLASSINFOW LPWSASERVICECLASSINFO; +#else +typedef WSASERVICECLASSINFOA WSASERVICECLASSINFO; +typedef PWSASERVICECLASSINFOA PWSASERVICECLASSINFO; +typedef LPWSASERVICECLASSINFOA LPWSASERVICECLASSINFO; +#endif + +typedef struct _WSANAMESPACE_INFOA { + GUID NSProviderId; + DWORD dwNameSpace; + BOOL fActive; + DWORD dwVersion; + LPSTR lpszIdentifier; +} WSANAMESPACE_INFOA, *PWSANAMESPACE_INFOA, *LPWSANAMESPACE_INFOA; + +typedef struct _WSANAMESPACE_INFOW { + GUID NSProviderId; + DWORD dwNameSpace; + BOOL fActive; + DWORD dwVersion; + LPWSTR lpszIdentifier; +} WSANAMESPACE_INFOW, *PWSANAMESPACE_INFOW, *LPWSANAMESPACE_INFOW; + +#ifdef UNICODE +typedef WSANAMESPACE_INFOW WSANAMESPACE_INFO; +typedef PWSANAMESPACE_INFOW PWSANAMESPACE_INFO; +typedef LPWSANAMESPACE_INFOW LPWSANAMESPACE_INFO; +#else +typedef WSANAMESPACE_INFOA WSANAMESPACE_INFO; +typedef PWSANAMESPACE_INFOA PWSANAMESPACE_INFO; +typedef LPWSANAMESPACE_INFOA LPWSANAMESPACE_INFO; +#endif + +typedef struct _WSAPROTOCOLCHAIN { + int ChainLen; + DWORD ChainEntries[MAX_PROTOCOL_CHAIN]; +} WSAPROTOCOLCHAIN, *LPWSAPROTOCOLCHAIN; + +#define WSAPROTOCOL_LEN 255 + +typedef struct _WSAPROTOCOL_INFOA { + DWORD dwServiceFlags1; + DWORD dwServiceFlags2; + DWORD dwServiceFlags3; + DWORD dwServiceFlags4; + DWORD dwProviderFlags; + GUID ProviderId; + DWORD dwCatalogEntryId; + WSAPROTOCOLCHAIN ProtocolChain; + int iVersion; + int iAddressFamily; + int iMaxSockAddr; + int iMinSockAddr; + int iSocketType; + int iProtocol; + int iProtocolMaxOffset; + int iNetworkByteOrder; + int iSecurityScheme; + DWORD dwMessageSize; + DWORD dwProviderReserved; + CHAR szProtocol[WSAPROTOCOL_LEN+1]; +} WSAPROTOCOL_INFOA, *LPWSAPROTOCOL_INFOA; + +typedef struct _WSAPROTOCOL_INFOW { + DWORD dwServiceFlags1; + DWORD dwServiceFlags2; + DWORD dwServiceFlags3; + DWORD dwServiceFlags4; + DWORD dwProviderFlags; + GUID ProviderId; + DWORD dwCatalogEntryId; + WSAPROTOCOLCHAIN ProtocolChain; + int iVersion; + int iAddressFamily; + int iMaxSockAddr; + int iMinSockAddr; + int iSocketType; + int iProtocol; + int iProtocolMaxOffset; + int iNetworkByteOrder; + int iSecurityScheme; + DWORD dwMessageSize; + DWORD dwProviderReserved; + WCHAR szProtocol[WSAPROTOCOL_LEN+1]; +} WSAPROTOCOL_INFOW, * LPWSAPROTOCOL_INFOW; + +typedef int (CALLBACK *LPCONDITIONPROC)(LPWSABUF, LPWSABUF, LPQOS, LPQOS, LPWSABUF, LPWSABUF, GROUP *, DWORD); +typedef void (WINAPI *LPWSAOVERLAPPED_COMPLETION_ROUTINE)(DWORD, DWORD, LPWSAOVERLAPPED, DWORD); + + +#ifdef UNICODE +typedef WSAPROTOCOL_INFOW WSAPROTOCOL_INFO; +typedef LPWSAPROTOCOL_INFOW LPWSAPROTOCOL_INFO; +#else +typedef WSAPROTOCOL_INFOA WSAPROTOCOL_INFO; +typedef LPWSAPROTOCOL_INFOA LPWSAPROTOCOL_INFO; +#endif + +/* Needed for XP & .NET Server function WSANSPIoctl. */ +typedef enum _WSACOMPLETIONTYPE { + NSP_NOTIFY_IMMEDIATELY = 0, + NSP_NOTIFY_HWND, + NSP_NOTIFY_EVENT, + NSP_NOTIFY_PORT, + NSP_NOTIFY_APC +} WSACOMPLETIONTYPE, * PWSACOMPLETIONTYPE, * LPWSACOMPLETIONTYPE; +typedef struct _WSACOMPLETION { + WSACOMPLETIONTYPE Type; + union { + struct { + HWND hWnd; + UINT uMsg; + WPARAM context; + } WindowMessage; + struct { + LPWSAOVERLAPPED lpOverlapped; + } Event; + struct { + LPWSAOVERLAPPED lpOverlapped; + LPWSAOVERLAPPED_COMPLETION_ROUTINE lpfnCompletionProc; + } Apc; + struct { + LPWSAOVERLAPPED lpOverlapped; + HANDLE hPort; + ULONG_PTR Key; + } Port; + } Parameters; +} WSACOMPLETION, *PWSACOMPLETION, *LPWSACOMPLETION; + +#define PFL_MULTIPLE_PROTO_ENTRIES 0x00000001 +#define PFL_RECOMMENDED_PROTO_ENTRY 0x00000002 +#define PFL_HIDDEN 0x00000004 +#define PFL_MATCHES_PROTOCOL_ZERO 0x00000008 +#define XP1_CONNECTIONLESS 0x00000001 +#define XP1_GUARANTEED_DELIVERY 0x00000002 +#define XP1_GUARANTEED_ORDER 0x00000004 +#define XP1_MESSAGE_ORIENTED 0x00000008 +#define XP1_PSEUDO_STREAM 0x00000010 +#define XP1_GRACEFUL_CLOSE 0x00000020 +#define XP1_EXPEDITED_DATA 0x00000040 +#define XP1_CONNECT_DATA 0x00000080 +#define XP1_DISCONNECT_DATA 0x00000100 +#define XP1_SUPPORT_BROADCAST 0x00000200 +#define XP1_SUPPORT_MULTIPOINT 0x00000400 +#define XP1_MULTIPOINT_CONTROL_PLANE 0x00000800 +#define XP1_MULTIPOINT_DATA_PLANE 0x00001000 +#define XP1_QOS_SUPPORTED 0x00002000 +#define XP1_INTERRUPT 0x00004000 +#define XP1_UNI_SEND 0x00008000 +#define XP1_UNI_RECV 0x00010000 +#define XP1_IFS_HANDLES 0x00020000 +#define XP1_PARTIAL_MESSAGE 0x00040000 + +#define BIGENDIAN 0x0000 +#define LITTLEENDIAN 0x0001 + +#define SECURITY_PROTOCOL_NONE 0x0000 +#define JL_SENDER_ONLY 0x01 +#define JL_RECEIVER_ONLY 0x02 +#define JL_BOTH 0x04 +#define WSA_FLAG_OVERLAPPED 0x01 +#define WSA_FLAG_MULTIPOINT_C_ROOT 0x02 +#define WSA_FLAG_MULTIPOINT_C_LEAF 0x04 +#define WSA_FLAG_MULTIPOINT_D_ROOT 0x08 +#define WSA_FLAG_MULTIPOINT_D_LEAF 0x10 +#define IOC_UNIX 0x00000000 +#define IOC_WS2 0x08000000 +#define IOC_PROTOCOL 0x10000000 +#define IOC_VENDOR 0x18000000 + +#define _WSAIO(x,y) (IOC_VOID|(x)|(y)) +#define _WSAIOR(x,y) (IOC_OUT|(x)|(y)) +#define _WSAIOW(x,y) (IOC_IN|(x)|(y)) +#define _WSAIORW(x,y) (IOC_INOUT|(x)|(y)) + +#define SIO_ASSOCIATE_HANDLE _WSAIOW(IOC_WS2,1) +#define SIO_ENABLE_CIRCULAR_QUEUEING _WSAIO(IOC_WS2,2) +#define SIO_FIND_ROUTE _WSAIOR(IOC_WS2,3) +#define SIO_FLUSH _WSAIO(IOC_WS2,4) +#define SIO_GET_BROADCAST_ADDRESS _WSAIOR(IOC_WS2,5) +#define SIO_GET_EXTENSION_FUNCTION_POINTER _WSAIORW(IOC_WS2,6) +#define SIO_GET_QOS _WSAIORW(IOC_WS2,7) +#define SIO_GET_GROUP_QOS _WSAIORW(IOC_WS2,8) +#define SIO_MULTIPOINT_LOOPBACK _WSAIOW(IOC_WS2,9) +#define SIO_MULTICAST_SCOPE _WSAIOW(IOC_WS2,10) +#define SIO_SET_QOS _WSAIOW(IOC_WS2,11) +#define SIO_SET_GROUP_QOS _WSAIOW(IOC_WS2,12) +#define SIO_TRANSLATE_HANDLE _WSAIORW(IOC_WS2,13) +#define SIO_ROUTING_INTERFACE_QUERY _WSAIORW(IOC_WS2,20) +#define SIO_ROUTING_INTERFACE_CHANGE _WSAIOW(IOC_WS2,21) +#define SIO_ADDRESS_LIST_QUERY _WSAIOR(IOC_WS2,22) +#define SIO_ADDRESS_LIST_CHANGE _WSAIO(IOC_WS2,23) +#define SIO_QUERY_TARGET_PNP_HANDLE _WSAIOR(IOC_WS2,24) +#define SIO_NSP_NOTIFY_CHANGE _WSAIOW(IOC_WS2,25) + +#define TH_NETDEV 0x00000001 +#define TH_TAPI 0x00000002 + +SOCKET WINAPI WSAAccept(SOCKET, struct sockaddr *, LPINT, LPCONDITIONPROC, DWORD); +INT WINAPI WSAAddressToStringA(LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFOA, LPSTR, LPDWORD); +INT WINAPI WSAAddressToStringW(LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFOW, LPWSTR, LPDWORD); +BOOL WINAPI WSACloseEvent(WSAEVENT); +int WINAPI WSAConnect(SOCKET, const struct sockaddr *, int, LPWSABUF, LPWSABUF, LPQOS, LPQOS); +WSAEVENT WINAPI WSACreateEvent(void); +int WINAPI WSADuplicateSocketA(SOCKET, DWORD, LPWSAPROTOCOL_INFOA); +int WINAPI WSADuplicateSocketW(SOCKET, DWORD, LPWSAPROTOCOL_INFOW); +INT WINAPI WSAEnumNameSpaceProvidersA(LPDWORD, LPWSANAMESPACE_INFOA); +INT WINAPI WSAEnumNameSpaceProvidersW(LPDWORD, LPWSANAMESPACE_INFOW); +int WINAPI WSAEnumNetworkEvents(SOCKET, WSAEVENT, LPWSANETWORKEVENTS); +int WINAPI WSAEnumProtocolsA(LPINT, LPWSAPROTOCOL_INFOA, LPDWORD); +int WINAPI WSAEnumProtocolsW(LPINT, LPWSAPROTOCOL_INFOW, LPDWORD); +int WINAPI WSAEventSelect(SOCKET, WSAEVENT, long); +BOOL WINAPI WSAGetOverlappedResult(SOCKET, LPWSAOVERLAPPED, LPDWORD, BOOL, LPDWORD); +BOOL WINAPI WSAGetQOSByName(SOCKET, LPWSABUF, LPQOS); +INT WINAPI WSAGetServiceClassInfoA(LPGUID, LPGUID, LPDWORD, LPWSASERVICECLASSINFOA); +INT WINAPI WSAGetServiceClassInfoW(LPGUID, LPGUID, LPDWORD, LPWSASERVICECLASSINFOW); +INT WINAPI WSAGetServiceClassNameByClassIdA(LPGUID, LPSTR, LPDWORD); +INT WINAPI WSAGetServiceClassNameByClassIdW(LPGUID, LPWSTR, LPDWORD); +int WINAPI WSAHtonl(SOCKET, unsigned long, unsigned long *); +int WINAPI WSAHtons(SOCKET, unsigned short, unsigned short *); +INT WINAPI WSAInstallServiceClassA(LPWSASERVICECLASSINFOA); +INT WINAPI WSAInstallServiceClassW(LPWSASERVICECLASSINFOW); +int WINAPI WSAIoctl(SOCKET, DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +SOCKET WINAPI WSAJoinLeaf(SOCKET, const struct sockaddr *, int, LPWSABUF, LPWSABUF, LPQOS, LPQOS, DWORD); +INT WINAPI WSALookupServiceBeginA(LPWSAQUERYSETA, DWORD, LPHANDLE); +INT WINAPI WSALookupServiceBeginW(LPWSAQUERYSETW lpqsRestrictions, DWORD, LPHANDLE); +INT WINAPI WSALookupServiceNextA(HANDLE, DWORD, LPDWORD, LPWSAQUERYSETA); +INT WINAPI WSALookupServiceNextW(HANDLE, DWORD, LPDWORD, LPWSAQUERYSETW); +INT WINAPI WSALookupServiceEnd(HANDLE); +int WINAPI WSANSPIoctl(HANDLE,DWORD,LPVOID,DWORD,LPVOID,DWORD,LPDWORD,LPWSACOMPLETION); /* XP or .NET Server */ +int WINAPI WSANtohl(SOCKET, unsigned long, unsigned long *); +int WINAPI WSANtohs(SOCKET, unsigned short, unsigned short *); +int WINAPI WSARecv(SOCKET, LPWSABUF, DWORD, LPDWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +int WINAPI WSARecvDisconnect(SOCKET, LPWSABUF); +int WINAPI WSARecvFrom(SOCKET, LPWSABUF, DWORD, LPDWORD, LPDWORD, struct sockaddr *, LPINT, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +INT WINAPI WSARemoveServiceClass(LPGUID); +BOOL WINAPI WSAResetEvent(WSAEVENT); +int WINAPI WSASend(SOCKET, LPWSABUF, DWORD, LPDWORD, DWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +int WINAPI WSASendDisconnect(SOCKET, LPWSABUF); +int WINAPI WSASendTo(SOCKET, LPWSABUF, DWORD, LPDWORD, DWORD, const struct sockaddr *, int, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +BOOL WINAPI WSASetEvent(WSAEVENT); +INT WSAAPI WSASetServiceA(LPWSAQUERYSETA, WSAESETSERVICEOP, DWORD); +INT WINAPI WSASetServiceW(LPWSAQUERYSETW, WSAESETSERVICEOP, DWORD); +SOCKET WINAPI WSASocketA(int, int, int, LPWSAPROTOCOL_INFOA, GROUP, DWORD); +SOCKET WINAPI WSASocketW(int, int, int, LPWSAPROTOCOL_INFOW, GROUP, DWORD); +INT WINAPI WSAStringToAddressA(LPSTR, INT, LPWSAPROTOCOL_INFOA, LPSOCKADDR, LPINT); +INT WINAPI WSAStringToAddressW(LPWSTR, INT, LPWSAPROTOCOL_INFOW, LPSOCKADDR, LPINT); +DWORD WINAPI WSAWaitForMultipleEvents(DWORD, const WSAEVENT *, BOOL, DWORD, BOOL); +typedef SOCKET (WINAPI *LPFN_WSAACCEPT)(SOCKET, struct sockaddr *, LPINT, LPCONDITIONPROC, DWORD); +typedef INT (WINAPI *LPFN_WSAADDRESSTOSTRINGA)(LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFOA, LPSTR, LPDWORD); +typedef INT (WINAPI *LPFN_WSAADDRESSTOSTRINGW)(LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFOW, LPWSTR, LPDWORD); +typedef BOOL (WINAPI *LPFN_WSACLOSEEVENT)(WSAEVENT); +typedef int (WINAPI *LPFN_WSACONNECT)(SOCKET, const struct sockaddr *, int, LPWSABUF, LPWSABUF, LPQOS, LPQOS); +typedef WSAEVENT (WINAPI *LPFN_WSACREATEEVENT)(void); +typedef int (WINAPI *LPFN_WSADUPLICATESOCKETA)(SOCKET, DWORD, LPWSAPROTOCOL_INFOA); +typedef int (WINAPI *LPFN_WSADUPLICATESOCKETW)(SOCKET, DWORD, LPWSAPROTOCOL_INFOW); +typedef INT (WINAPI *LPFN_WSAENUMNAMESPACEPROVIDERSA)(LPDWORD, LPWSANAMESPACE_INFOA); +typedef INT (WINAPI *LPFN_WSAENUMNAMESPACEPROVIDERSW)(LPDWORD, LPWSANAMESPACE_INFOW); +typedef int (WINAPI *LPFN_WSAENUMNETWORKEVENTS)(SOCKET, WSAEVENT, LPWSANETWORKEVENTS); +typedef int (WINAPI *LPFN_WSAENUMPROTOCOLSA)(LPINT, LPWSAPROTOCOL_INFOA, LPDWORD); +typedef int (WINAPI *LPFN_WSAENUMPROTOCOLSW)(LPINT, LPWSAPROTOCOL_INFOW, LPDWORD); +typedef int (WINAPI *LPFN_WSAEVENTSELECT)(SOCKET, WSAEVENT, long); +typedef BOOL (WINAPI *LPFN_WSAGETOVERLAPPEDRESULT)(SOCKET, LPWSAOVERLAPPED, LPDWORD, BOOL, LPDWORD); +typedef BOOL (WINAPI *LPFN_WSAGETQOSBYNAME)(SOCKET, LPWSABUF, LPQOS); +typedef INT (WINAPI *LPFN_WSAGETSERVICECLASSINFOA)(LPGUID, LPGUID, LPDWORD, LPWSASERVICECLASSINFOA); +typedef INT (WINAPI *LPFN_WSAGETSERVICECLASSINFOW)(LPGUID, LPGUID, LPDWORD, LPWSASERVICECLASSINFOW); +typedef INT (WINAPI *LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDA)(LPGUID, LPSTR, LPDWORD); +typedef INT (WINAPI *LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDW)(LPGUID, LPWSTR, LPDWORD); +typedef int (WINAPI *LPFN_WSAHTONL)(SOCKET, unsigned long, unsigned long *); +typedef int (WINAPI *LPFN_WSAHTONS)(SOCKET, unsigned short, unsigned short *); +typedef INT (WINAPI *LPFN_WSAINSTALLSERVICECLASSA)(LPWSASERVICECLASSINFOA); +typedef INT (WINAPI *LPFN_WSAINSTALLSERVICECLASSW)(LPWSASERVICECLASSINFOW); +typedef int (WINAPI *LPFN_WSAIOCTL)(SOCKET, DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +typedef SOCKET (WINAPI *LPFN_WSAJOINLEAF)(SOCKET, const struct sockaddr *, int, LPWSABUF, LPWSABUF, LPQOS, LPQOS, DWORD); +typedef INT (WINAPI *LPFN_WSALOOKUPSERVICEBEGINA)(LPWSAQUERYSETA, DWORD, LPHANDLE); +typedef INT (WINAPI *LPFN_WSALOOKUPSERVICEBEGINW)(LPWSAQUERYSETW, DWORD, LPHANDLE); +typedef INT (WINAPI *LPFN_WSALOOKUPSERVICENEXTA)(HANDLE, DWORD, LPDWORD, LPWSAQUERYSETA); +typedef INT (WINAPI *LPFN_WSALOOKUPSERVICENEXTW)(HANDLE, DWORD, LPDWORD, LPWSAQUERYSETW); +typedef INT (WINAPI *LPFN_WSALOOKUPSERVICEEND)(HANDLE); +typedef int (WINAPI *LPFN_WSANSPIoctl)(HANDLE, DWORD,LPVOID,DWORD,LPVOID,DWORD,LPDWORD,LPWSACOMPLETION); +typedef int (WINAPI *LPFN_WSANTOHL)(SOCKET, unsigned long, unsigned long *); +typedef int (WINAPI *LPFN_WSANTOHS)(SOCKET, unsigned short, unsigned short *); +typedef int (WINAPI *LPFN_WSARECV)(SOCKET, LPWSABUF, DWORD, LPDWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +typedef int (WINAPI *LPFN_WSARECVDISCONNECT)(SOCKET, LPWSABUF); +typedef int (WINAPI *LPFN_WSARECVFROM)(SOCKET, LPWSABUF, DWORD, LPDWORD, LPDWORD, struct sockaddr *, LPINT, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +typedef INT (WINAPI *LPFN_WSAREMOVESERVICECLASS)(LPGUID); +typedef BOOL (WINAPI *LPFN_WSARESETEVENT)(WSAEVENT); +typedef int (WINAPI *LPFN_WSASEND)(SOCKET, LPWSABUF, DWORD, LPDWORD, DWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +typedef int (WINAPI *LPFN_WSASENDDISCONNECT)(SOCKET, LPWSABUF); +typedef int (WINAPI *LPFN_WSASENDTO)(SOCKET, LPWSABUF, DWORD, LPDWORD, DWORD, const struct sockaddr *, int, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +typedef BOOL (WINAPI *LPFN_WSASETEVENT)(WSAEVENT); +typedef INT (WINAPI *LPFN_WSASETSERVICEA)(LPWSAQUERYSETA, WSAESETSERVICEOP, DWORD); +typedef INT (WINAPI *LPFN_WSASETSERVICEW)(LPWSAQUERYSETW, WSAESETSERVICEOP, DWORD); +typedef SOCKET (WINAPI *LPFN_WSASOCKETA)(int, int, int, LPWSAPROTOCOL_INFOA, GROUP, DWORD); +typedef SOCKET (WINAPI *LPFN_WSASOCKETW)(int, int, int, LPWSAPROTOCOL_INFOW, GROUP, DWORD); +typedef INT (WINAPI *LPFN_WSASTRINGTOADDRESSA)(LPSTR, INT, LPWSAPROTOCOL_INFOA, LPSOCKADDR, LPINT); +typedef INT (WINAPI *LPFN_WSASTRINGTOADDRESSW)(LPWSTR, INT, LPWSAPROTOCOL_INFOW, LPSOCKADDR, LPINT); +typedef DWORD (WINAPI *LPFN_WSAWAITFORMULTIPLEEVENTS)(DWORD, const WSAEVENT *, BOOL, DWORD, BOOL); + +#ifdef UNICODE +#define LPFN_WSAADDRESSTOSTRING LPFN_WSAADDRESSTOSTRINGW +#define LPFN_WSADUPLICATESOCKET LPFN_WSADUPLICATESOCKETW +#define LPFN_WSAENUMNAMESPACEPROVIDERS LPFN_WSAENUMNAMESPACEPROVIDERSW +#define LPFN_WSAENUMPROTOCOLS LPFN_WSAENUMPROTOCOLSW +#define LPFN_WSAGETSERVICECLASSINFO LPFN_WSAGETSERVICECLASSINFOW +#define LPFN_WSAGETSERVICECLASSNAMEBYCLASSID LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDW +#define LPFN_WSAINSTALLSERVICECLASS LPFN_WSAINSTALLSERVICECLASSW +#define LPFN_WSALOOKUPSERVICEBEGIN LPFN_WSALOOKUPSERVICEBEGINW +#define LPFN_WSALOOKUPSERVICENEXT LPFN_WSALOOKUPSERVICENEXTW +#define LPFN_WSASETSERVICE LPFN_WSASETSERVICEW +#define LPFN_WSASOCKET LPFN_WSASOCKETW +#define LPFN_WSASTRINGTOADDRESS LPFN_WSASTRINGTOADDRESSW +#define WSAAddressToString WSAAddressToStringW +#define WSADuplicateSocket WSADuplicateSocketW +#define WSAEnumNameSpaceProviders WSAEnumNameSpaceProvidersW +#define WSAEnumProtocols WSAEnumProtocolsW +#define WSAGetServiceClassInfo WSAGetServiceClassInfoW +#define WSAGetServiceClassNameByClassId WSAGetServiceClassNameByClassIdW +#define WSASetService WSASetServiceW +#define WSASocket WSASocketW +#define WSAStringToAddress WSAStringToAddressW +#define WSALookupServiceBegin WSALookupServiceBeginW +#define WSALookupServiceNext WSALookupServiceNextW +#define WSAInstallServiceClass WSAInstallServiceClassW +#else +#define LPFN_WSAADDRESSTOSTRING LPFN_WSAADDRESSTOSTRINGA +#define LPFN_WSADUPLICATESOCKET LPFN_WSADUPLICATESOCKETW +#define LPFN_WSAENUMNAMESPACEPROVIDERS LPFN_WSAENUMNAMESPACEPROVIDERSA +#define LPFN_WSAENUMPROTOCOLS LPFN_WSAENUMPROTOCOLSA +#define LPFN_WSAGETSERVICECLASSINFO LPFN_WSAGETSERVICECLASSINFOA +#define LPFN_WSAGETSERVICECLASSNAMEBYCLASSID LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDA +#define LPFN_WSAINSTALLSERVICECLASS LPFN_WSAINSTALLSERVICECLASSA +#define LPFN_WSALOOKUPSERVICEBEGIN LPFN_WSALOOKUPSERVICEBEGINA +#define LPFN_WSALOOKUPSERVICENEXT LPFN_WSALOOKUPSERVICENEXTA +#define LPFN_WSASETSERVICE LPFN_WSASETSERVICEA +#define LPFN_WSASOCKET LPFN_WSASOCKETA +#define LPFN_WSASTRINGTOADDRESS LPFN_WSASTRINGTOADDRESSA +#define WSAAddressToString WSAAddressToStringA +#define WSADuplicateSocket WSADuplicateSocketA +#define WSAEnumNameSpaceProviders WSAEnumNameSpaceProvidersA +#define WSAEnumProtocols WSAEnumProtocolsA +#define WSAGetServiceClassInfo WSAGetServiceClassInfoA +#define WSAGetServiceClassNameByClassId WSAGetServiceClassNameByClassIdA +#define WSAInstallServiceClass WSAInstallServiceClassA +#define WSALookupServiceBegin WSALookupServiceBeginA +#define WSALookupServiceNext WSALookupServiceNextA +#define WSASocket WSASocketA +#define WSAStringToAddress WSAStringToAddressA +#define WSASetService WSASetServiceA +#endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/winspool.h b/reactos/w32api/include/winspool.h new file mode 100644 index 00000000000..cc803ca2747 --- /dev/null +++ b/reactos/w32api/include/winspool.h @@ -0,0 +1,791 @@ +#ifndef _WINSPOOL_H +#define _WINSPOOL_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define DI_CHANNEL 1 +#define DI_CHANNEL_WRITE 2 +#define DI_READ_SPOOL_JOB 3 +#define FORM_BUILTIN 1 +#define JOB_CONTROL_PAUSE 1 +#define JOB_CONTROL_RESUME 2 +#define JOB_CONTROL_CANCEL 3 +#define JOB_CONTROL_RESTART 4 +#define JOB_CONTROL_DELETE 5 +#define JOB_STATUS_PAUSED 1 +#define JOB_STATUS_ERROR 2 +#define JOB_STATUS_DELETING 4 +#define JOB_STATUS_SPOOLING 8 +#define JOB_STATUS_PRINTING 16 +#define JOB_STATUS_OFFLINE 32 +#define JOB_STATUS_PAPEROUT 0x40 +#define JOB_STATUS_PRINTED 0x80 +#define JOB_STATUS_DELETED 0x100 +#define JOB_STATUS_BLOCKED_DEVQ 0x200 +#define JOB_STATUS_USER_INTERVENTION 0x400 +#define JOB_POSITION_UNSPECIFIED 0 +#define JOB_NOTIFY_TYPE 1 +#define JOB_NOTIFY_FIELD_PRINTER_NAME 0 +#define JOB_NOTIFY_FIELD_MACHINE_NAME 1 +#define JOB_NOTIFY_FIELD_PORT_NAME 2 +#define JOB_NOTIFY_FIELD_USER_NAME 3 +#define JOB_NOTIFY_FIELD_NOTIFY_NAME 4 +#define JOB_NOTIFY_FIELD_DATATYPE 5 +#define JOB_NOTIFY_FIELD_PRINT_PROCESSOR 6 +#define JOB_NOTIFY_FIELD_PARAMETERS 7 +#define JOB_NOTIFY_FIELD_DRIVER_NAME 8 +#define JOB_NOTIFY_FIELD_DEVMODE 9 +#define JOB_NOTIFY_FIELD_STATUS 10 +#define JOB_NOTIFY_FIELD_STATUS_STRING 11 +#define JOB_NOTIFY_FIELD_SECURITY_DESCRIPTOR 12 +#define JOB_NOTIFY_FIELD_DOCUMENT 13 +#define JOB_NOTIFY_FIELD_PRIORITY 14 +#define JOB_NOTIFY_FIELD_POSITION 15 +#define JOB_NOTIFY_FIELD_SUBMITTED 16 +#define JOB_NOTIFY_FIELD_START_TIME 17 +#define JOB_NOTIFY_FIELD_UNTIL_TIME 18 +#define JOB_NOTIFY_FIELD_TIME 19 +#define JOB_NOTIFY_FIELD_TOTAL_PAGES 20 +#define JOB_NOTIFY_FIELD_PAGES_PRINTED 21 +#define JOB_NOTIFY_FIELD_TOTAL_BYTES 22 +#define JOB_NOTIFY_FIELD_BYTES_PRINTED 23 +#define JOB_ACCESS_ADMINISTER 16 +#define JOB_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|JOB_ACCESS_ADMINISTER) +#define JOB_READ (STANDARD_RIGHTS_READ| JOB_ACCESS_ADMINISTER) +#define JOB_WRITE (STANDARD_RIGHTS_WRITE|JOB_ACCESS_ADMINISTER) +#define JOB_EXECUTE (STANDARD_RIGHTS_EXECUTE|JOB_ACCESS_ADMINISTER) +#define PRINTER_NOTIFY_OPTIONS_REFRESH 1 +#define PRINTER_ACCESS_ADMINISTER 4 +#define PRINTER_ACCESS_USE 8 +#define PRINTER_ERROR_INFORMATION 0x80000000 +#define PRINTER_ERROR_WARNING 0x40000000 +#define PRINTER_ERROR_SEVERE 0x20000000 +#define PRINTER_ERROR_OUTOFPAPER 1 +#define PRINTER_ERROR_JAM 2 +#define PRINTER_ERROR_OUTOFTONER 4 +#define PRINTER_CONTROL_PAUSE 1 +#define PRINTER_CONTROL_RESUME 2 +#define PRINTER_CONTROL_PURGE 3 +#define PRINTER_CONTROL_SET_STATUS 4 +#define PRINTER_STATUS_PAUSED 1 +#define PRINTER_STATUS_ERROR 2 +#define PRINTER_STATUS_PENDING_DELETION 4 +#define PRINTER_STATUS_PAPER_JAM 8 +#define PRINTER_STATUS_PAPER_OUT 0x10 +#define PRINTER_STATUS_MANUAL_FEED 0x20 +#define PRINTER_STATUS_PAPER_PROBLEM 0x40 +#define PRINTER_STATUS_OFFLINE 0x80 +#define PRINTER_STATUS_IO_ACTIVE 0x100 +#define PRINTER_STATUS_BUSY 0x200 +#define PRINTER_STATUS_PRINTING 0x400 +#define PRINTER_STATUS_OUTPUT_BIN_FULL 0x800 +#define PRINTER_STATUS_NOT_AVAILABLE 0x1000 +#define PRINTER_STATUS_WAITING 0x2000 +#define PRINTER_STATUS_PROCESSING 0x4000 +#define PRINTER_STATUS_INITIALIZING 0x8000 +#define PRINTER_STATUS_WARMING_UP 0x10000 +#define PRINTER_STATUS_TONER_LOW 0x20000 +#define PRINTER_STATUS_NO_TONER 0x40000 +#define PRINTER_STATUS_PAGE_PUNT 0x80000 +#define PRINTER_STATUS_USER_INTERVENTION 0x100000 +#define PRINTER_STATUS_OUT_OF_MEMORY 0x200000 +#define PRINTER_STATUS_DOOR_OPEN 0x400000 +#define PRINTER_STATUS_SERVER_UNKNOWN 0x800000 +#define PRINTER_STATUS_POWER_SAVE 0x1000000 +#define PRINTER_ATTRIBUTE_QUEUED 1 +#define PRINTER_ATTRIBUTE_DIRECT 2 +#define PRINTER_ATTRIBUTE_DEFAULT 4 +#define PRINTER_ATTRIBUTE_SHARED 8 +#define PRINTER_ATTRIBUTE_NETWORK 0x10 +#define PRINTER_ATTRIBUTE_HIDDEN 0x20 +#define PRINTER_ATTRIBUTE_LOCAL 0x40 +#define PRINTER_ATTRIBUTE_ENABLE_DEVQ 0x80 +#define PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS 0x100 +#define PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST 0x200 +#define PRINTER_ATTRIBUTE_WORK_OFFLINE 0x400 +#define PRINTER_ATTRIBUTE_ENABLE_BIDI 0x800 +#define PRINTER_ATTRIBUTE_RAW_ONLY 0x1000 +#define PRINTER_ATTRIBUTE_PUBLISHED 0x2000 +#define PRINTER_ENUM_DEFAULT 1 +#define PRINTER_ENUM_LOCAL 2 +#define PRINTER_ENUM_CONNECTIONS 4 +#define PRINTER_ENUM_FAVORITE 4 +#define PRINTER_ENUM_NAME 8 +#define PRINTER_ENUM_REMOTE 16 +#define PRINTER_ENUM_SHARED 32 +#define PRINTER_ENUM_NETWORK 0x40 +#define PRINTER_ENUM_EXPAND 0x4000 +#define PRINTER_ENUM_CONTAINER 0x8000 +#define PRINTER_ENUM_ICONMASK 0xff0000 +#define PRINTER_ENUM_ICON1 0x10000 +#define PRINTER_ENUM_ICON2 0x20000 +#define PRINTER_ENUM_ICON3 0x40000 +#define PRINTER_ENUM_ICON4 0x80000 +#define PRINTER_ENUM_ICON5 0x100000 +#define PRINTER_ENUM_ICON6 0x200000 +#define PRINTER_ENUM_ICON7 0x400000 +#define PRINTER_ENUM_ICON8 0x800000 +#define PRINTER_NOTIFY_TYPE 0 +#define PRINTER_NOTIFY_FIELD_SERVER_NAME 0 +#define PRINTER_NOTIFY_FIELD_PRINTER_NAME 1 +#define PRINTER_NOTIFY_FIELD_SHARE_NAME 2 +#define PRINTER_NOTIFY_FIELD_PORT_NAME 3 +#define PRINTER_NOTIFY_FIELD_DRIVER_NAME 4 +#define PRINTER_NOTIFY_FIELD_COMMENT 5 +#define PRINTER_NOTIFY_FIELD_LOCATION 6 +#define PRINTER_NOTIFY_FIELD_DEVMODE 7 +#define PRINTER_NOTIFY_FIELD_SEPFILE 8 +#define PRINTER_NOTIFY_FIELD_PRINT_PROCESSOR 9 +#define PRINTER_NOTIFY_FIELD_PARAMETERS 10 +#define PRINTER_NOTIFY_FIELD_DATATYPE 11 +#define PRINTER_NOTIFY_FIELD_SECURITY_DESCRIPTOR 12 +#define PRINTER_NOTIFY_FIELD_ATTRIBUTES 13 +#define PRINTER_NOTIFY_FIELD_PRIORITY 14 +#define PRINTER_NOTIFY_FIELD_DEFAULT_PRIORITY 15 +#define PRINTER_NOTIFY_FIELD_START_TIME 16 +#define PRINTER_NOTIFY_FIELD_UNTIL_TIME 17 +#define PRINTER_NOTIFY_FIELD_STATUS 18 +#define PRINTER_NOTIFY_FIELD_STATUS_STRING 19 +#define PRINTER_NOTIFY_FIELD_CJOBS 20 +#define PRINTER_NOTIFY_FIELD_AVERAGE_PPM 21 +#define PRINTER_NOTIFY_FIELD_TOTAL_PAGES 22 +#define PRINTER_NOTIFY_FIELD_PAGES_PRINTED 23 +#define PRINTER_NOTIFY_FIELD_TOTAL_BYTES 24 +#define PRINTER_NOTIFY_FIELD_BYTES_PRINTED 25 +#define PRINTER_CHANGE_ADD_PRINTER 1 +#define PRINTER_CHANGE_SET_PRINTER 2 +#define PRINTER_CHANGE_DELETE_PRINTER 4 +#define PRINTER_CHANGE_FAILED_CONNECTION_PRINTER 8 +#define PRINTER_CHANGE_PRINTER 0xFF +#define PRINTER_CHANGE_ADD_JOB 0x100 +#define PRINTER_CHANGE_SET_JOB 0x200 +#define PRINTER_CHANGE_DELETE_JOB 0x400 +#define PRINTER_CHANGE_WRITE_JOB 0x800 +#define PRINTER_CHANGE_JOB 0xFF00 +#define PRINTER_CHANGE_ADD_FORM 0x10000 +#define PRINTER_CHANGE_SET_FORM 0x20000 +#define PRINTER_CHANGE_DELETE_FORM 0x40000 +#define PRINTER_CHANGE_FORM 0x70000 +#define PRINTER_CHANGE_ADD_PORT 0x100000 +#define PRINTER_CHANGE_CONFIGURE_PORT 0x200000 +#define PRINTER_CHANGE_DELETE_PORT 0x400000 +#define PRINTER_CHANGE_PORT 0x700000 +#define PRINTER_CHANGE_ADD_PRINT_PROCESSOR 0x1000000 +#define PRINTER_CHANGE_DELETE_PRINT_PROCESSOR 0x4000000 +#define PRINTER_CHANGE_PRINT_PROCESSOR 0x7000000 +#define PRINTER_CHANGE_ADD_PRINTER_DRIVER 0x10000000 +#define PRINTER_CHANGE_SET_PRINTER_DRIVER 0x20000000 +#define PRINTER_CHANGE_DELETE_PRINTER_DRIVER 0x40000000 +#define PRINTER_CHANGE_PRINTER_DRIVER 0x70000000 +#define PRINTER_CHANGE_TIMEOUT 0x80000000 +#define PRINTER_CHANGE_ALL 0x7777FFFF +#define PRINTER_NOTIFY_INFO_DISCARDED 1 +#define PRINTER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|PRINTER_ACCESS_ADMINISTER|PRINTER_ACCESS_USE) +#define PRINTER_READ (STANDARD_RIGHTS_READ|PRINTER_ACCESS_USE) +#define PRINTER_WRITE (STANDARD_RIGHTS_WRITE|PRINTER_ACCESS_USE) +#define PRINTER_EXECUTE (STANDARD_RIGHTS_EXECUTE|PRINTER_ACCESS_USE) +#define NO_PRIORITY 0 +#define MAX_PRIORITY 99 +#define MIN_PRIORITY 1 +#define DEF_PRIORITY 1 +#define PORT_TYPE_WRITE 1 +#define PORT_TYPE_READ 2 +#define PORT_TYPE_REDIRECTED 4 +#define PORT_TYPE_NET_ATTACHED 8 +#define SERVER_ACCESS_ADMINISTER 1 +#define SERVER_ACCESS_ENUMERATE 2 +#define SERVER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SERVER_ACCESS_ADMINISTER|SERVER_ACCESS_ENUMERATE) +#define SERVER_READ (STANDARD_RIGHTS_READ|SERVER_ACCESS_ENUMERATE) +#define SERVER_WRITE (STANDARD_RIGHTS_WRITE|SERVER_ACCESS_ADMINISTER|SERVER_ACCESS_ENUMERATE) +#define SERVER_EXECUTE (STANDARD_RIGHTS_EXECUTE|SERVER_ACCESS_ENUMERATE) +#define PORT_STATUS_TYPE_ERROR 1 +#define PORT_STATUS_TYPE_WARNING 2 +#define PORT_STATUS_TYPE_INFO 3 +#define PORT_STATUS_OFFLINE 1 +#define PORT_STATUS_PAPER_JAM 2 +#define PORT_STATUS_PAPER_OUT 3 +#define PORT_STATUS_OUTPUT_BIN_FULL 4 +#define PORT_STATUS_PAPER_PROBLEM 5 +#define PORT_STATUS_NO_TONER 6 +#define PORT_STATUS_DOOR_OPEN 7 +#define PORT_STATUS_USER_INTERVENTION 8 +#define PORT_STATUS_OUT_OF_MEMORY 9 +#define PORT_STATUS_TONER_LOW 10 +#define PORT_STATUS_WARMING_UP 11 +#define PORT_STATUS_POWER_SAVE 12 +#ifndef RC_INVOKED +typedef struct _ADDJOB_INFO_1A { + LPSTR Path; + DWORD JobId; +} ADDJOB_INFO_1A,*PADDJOB_INFO_1A,*LPADDJOB_INFO_1A; +typedef struct _ADDJOB_INFO_1W { + LPWSTR Path; + DWORD JobId; +} ADDJOB_INFO_1W,*PADDJOB_INFO_1W,*LPADDJOB_INFO_1W; +typedef struct _DATATYPES_INFO_1A{LPSTR pName;} DATATYPES_INFO_1A,*PDATATYPES_INFO_1A,*LPDATATYPES_INFO_1A; +typedef struct _DATATYPES_INFO_1W{LPWSTR pName;} DATATYPES_INFO_1W,*PDATATYPES_INFO_1W,*LPDATATYPES_INFO_1W; +typedef struct _JOB_INFO_1A { + DWORD JobId; + LPSTR pPrinterName; + LPSTR pMachineName; + LPSTR pUserName; + LPSTR pDocument; + LPSTR pDatatype; + LPSTR pStatus; + DWORD Status; + DWORD Priority; + DWORD Position; + DWORD TotalPages; + DWORD PagesPrinted; + SYSTEMTIME Submitted; +} JOB_INFO_1A,*PJOB_INFO_1A,*LPJOB_INFO_1A; +typedef struct _JOB_INFO_1W { + DWORD JobId; + LPWSTR pPrinterName; + LPWSTR pMachineName; + LPWSTR pUserName; + LPWSTR pDocument; + LPWSTR pDatatype; + LPWSTR pStatus; + DWORD Status; + DWORD Priority; + DWORD Position; + DWORD TotalPages; + DWORD PagesPrinted; + SYSTEMTIME Submitted; +} JOB_INFO_1W,*PJOB_INFO_1W,*LPJOB_INFO_1W; +typedef struct _JOB_INFO_2A { + DWORD JobId; + LPSTR pPrinterName; + LPSTR pMachineName; + LPSTR pUserName; + LPSTR pDocument; + LPSTR pNotifyName; + LPSTR pDatatype; + LPSTR pPrintProcessor; + LPSTR pParameters; + LPSTR pDriverName; + LPDEVMODEA pDevMode; + LPSTR pStatus; + PSECURITY_DESCRIPTOR pSecurityDescriptor; + DWORD Status; + DWORD Priority; + DWORD Position; + DWORD StartTime; + DWORD UntilTime; + DWORD TotalPages; + DWORD Size; + SYSTEMTIME Submitted; + DWORD Time; + DWORD PagesPrinted; +} JOB_INFO_2A,*PJOB_INFO_2A,*LPJOB_INFO_2A; +typedef struct _JOB_INFO_2W { + DWORD JobId; + LPWSTR pPrinterName; + LPWSTR pMachineName; + LPWSTR pUserName; + LPWSTR pDocument; + LPWSTR pNotifyName; + LPWSTR pDatatype; + LPWSTR pPrintProcessor; + LPWSTR pParameters; + LPWSTR pDriverName; + LPDEVMODEW pDevMode; + LPWSTR pStatus; + PSECURITY_DESCRIPTOR pSecurityDescriptor; + DWORD Status; + DWORD Priority; + DWORD Position; + DWORD StartTime; + DWORD UntilTime; + DWORD TotalPages; + DWORD Size; + SYSTEMTIME Submitted; + DWORD Time; + DWORD PagesPrinted; +} JOB_INFO_2W,*PJOB_INFO_2W,*LPJOB_INFO_2W; +typedef struct _DOC_INFO_1A { + LPSTR pDocName; + LPSTR pOutputFile; + LPSTR pDatatype; +} DOC_INFO_1A,*PDOC_INFO_1A,*LPDOC_INFO_1A; +typedef struct _DOC_INFO_1W { + LPWSTR pDocName; + LPWSTR pOutputFile; + LPWSTR pDatatype; +} DOC_INFO_1W,*PDOC_INFO_1W,*LPDOC_INFO_1W; +typedef struct _DOC_INFO_2A { + LPSTR pDocName; + LPSTR pOutputFile; + LPSTR pDatatype; + DWORD dwMode; + DWORD JobId; +} DOC_INFO_2A,*PDOC_INFO_2A,*LPDOC_INFO_2A; +typedef struct _DOC_INFO_2W { + LPWSTR pDocName; + LPWSTR pOutputFile; + LPWSTR pDatatype; + DWORD dwMode; + DWORD JobId; +} DOC_INFO_2W,*PDOC_INFO_2W,*LPDOC_INFO_2W; +typedef struct _DRIVER_INFO_1A {LPSTR pName;} DRIVER_INFO_1A,*PDRIVER_INFO_1A,*LPDRIVER_INFO_1A; +typedef struct _DRIVER_INFO_1W {LPWSTR pName;} DRIVER_INFO_1W,*PDRIVER_INFO_1W,*LPDRIVER_INFO_1W; +typedef struct _DRIVER_INFO_2A { + DWORD cVersion; + LPSTR pName; + LPSTR pEnvironment; + LPSTR pDriverPath; + LPSTR pDataFile; + LPSTR pConfigFile; +} DRIVER_INFO_2A,*PDRIVER_INFO_2A,*LPDRIVER_INFO_2A; +typedef struct _DRIVER_INFO_2W { + DWORD cVersion; + LPWSTR pName; + LPWSTR pEnvironment; + LPWSTR pDriverPath; + LPWSTR pDataFile; + LPWSTR pConfigFile; +} DRIVER_INFO_2W,*PDRIVER_INFO_2W,*LPDRIVER_INFO_2W; +typedef struct _DRIVER_INFO_3A { + DWORD cVersion; + LPSTR pName; + LPSTR pEnvironment; + LPSTR pDriverPath; + LPSTR pDataFile; + LPSTR pConfigFile; + LPSTR pHelpFile; + LPSTR pDependentFiles; + LPSTR pMonitorName; + LPSTR pDefaultDataType; +} DRIVER_INFO_3A,*PDRIVER_INFO_3A,*LPDRIVER_INFO_3A; +typedef struct _DRIVER_INFO_3W { + DWORD cVersion; + LPWSTR pName; + LPWSTR pEnvironment; + LPWSTR pDriverPath; + LPWSTR pDataFile; + LPWSTR pConfigFile; + LPWSTR pHelpFile; + LPWSTR pDependentFiles; + LPWSTR pMonitorName; + LPWSTR pDefaultDataType; +} DRIVER_INFO_3W,*PDRIVER_INFO_3W,*LPDRIVER_INFO_3W; +typedef struct _MONITOR_INFO_1A{LPSTR pName;} MONITOR_INFO_1A,*PMONITOR_INFO_1A,*LPMONITOR_INFO_1A; +typedef struct _MONITOR_INFO_1W{LPWSTR pName;} MONITOR_INFO_1W,*PMONITOR_INFO_1W,*LPMONITOR_INFO_1W; +typedef struct _PORT_INFO_1A {LPSTR pName;} PORT_INFO_1A,*PPORT_INFO_1A,*LPPORT_INFO_1A; +typedef struct _PORT_INFO_1W {LPWSTR pName;} PORT_INFO_1W,*PPORT_INFO_1W,*LPPORT_INFO_1W; +typedef struct _MONITOR_INFO_2A{ + LPSTR pName; + LPSTR pEnvironment; + LPSTR pDLLName; +} MONITOR_INFO_2A,*PMONITOR_INFO_2A,*LPMONITOR_INFO_2A; +typedef struct _MONITOR_INFO_2W{ + LPWSTR pName; + LPWSTR pEnvironment; + LPWSTR pDLLName; +} MONITOR_INFO_2W,*PMONITOR_INFO_2W,*LPMONITOR_INFO_2W; +typedef struct _PORT_INFO_2A { + LPSTR pPortName; + LPSTR pMonitorName; + LPSTR pDescription; + DWORD fPortType; + DWORD Reserved; +} PORT_INFO_2A,*PPORT_INFO_2A,*LPPORT_INFO_2A; +typedef struct _PORT_INFO_2W { + LPWSTR pPortName; + LPWSTR pMonitorName; + LPWSTR pDescription; + DWORD fPortType; + DWORD Reserved; +} PORT_INFO_2W,*PPORT_INFO_2W,*LPPORT_INFO_2W; +typedef struct _PORT_INFO_3A { + DWORD dwStatus; + LPSTR pszStatus; + DWORD dwSeverity; +} PORT_INFO_3A,*PPORT_INFO_3A,*LPPORT_INFO_3A; +typedef struct _PORT_INFO_3W { + DWORD dwStatus; + LPWSTR pszStatus; + DWORD dwSeverity; +} PORT_INFO_3W,*PPORT_INFO_3W,*LPPORT_INFO_3W; +typedef struct _PRINTER_INFO_1A { + DWORD Flags; + LPSTR pDescription; + LPSTR pName; + LPSTR pComment; +} PRINTER_INFO_1A,*PPRINTER_INFO_1A,*LPPRINTER_INFO_1A; +typedef struct _PRINTER_INFO_1W { + DWORD Flags; + LPWSTR pDescription; + LPWSTR pName; + LPWSTR pComment; +} PRINTER_INFO_1W,*PPRINTER_INFO_1W,*LPPRINTER_INFO_1W; +typedef struct _PRINTER_INFO_2A { + LPSTR pServerName; + LPSTR pPrinterName; + LPSTR pShareName; + LPSTR pPortName; + LPSTR pDriverName; + LPSTR pComment; + LPSTR pLocation; + LPDEVMODEA pDevMode; + LPSTR pSepFile; + LPSTR pPrintProcessor; + LPSTR pDatatype; + LPSTR pParameters; + PSECURITY_DESCRIPTOR pSecurityDescriptor; + DWORD Attributes; + DWORD Priority; + DWORD DefaultPriority; + DWORD StartTime; + DWORD UntilTime; + DWORD Status; + DWORD cJobs; + DWORD AveragePPM; +} PRINTER_INFO_2A,*PPRINTER_INFO_2A,*LPPRINTER_INFO_2A; +typedef struct _PRINTER_INFO_2W { + LPWSTR pServerName; + LPWSTR pPrinterName; + LPWSTR pShareName; + LPWSTR pPortName; + LPWSTR pDriverName; + LPWSTR pComment; + LPWSTR pLocation; + LPDEVMODEW pDevMode; + LPWSTR pSepFile; + LPWSTR pPrintProcessor; + LPWSTR pDatatype; + LPWSTR pParameters; + PSECURITY_DESCRIPTOR pSecurityDescriptor; + DWORD Attributes; + DWORD Priority; + DWORD DefaultPriority; + DWORD StartTime; + DWORD UntilTime; + DWORD Status; + DWORD cJobs; + DWORD AveragePPM; +} PRINTER_INFO_2W,*PPRINTER_INFO_2W,*LPPRINTER_INFO_2W; +typedef struct _PRINTER_INFO_3 { + PSECURITY_DESCRIPTOR pSecurityDescriptor; +} PRINTER_INFO_3,*PPRINTER_INFO_3,*LPPRINTER_INFO_3; +typedef struct _PRINTER_INFO_4A { + LPSTR pPrinterName; + LPSTR pServerName; + DWORD Attributes; +} PRINTER_INFO_4A,*PPRINTER_INFO_4A,*LPPRINTER_INFO_4A; +typedef struct _PRINTER_INFO_4W { + LPWSTR pPrinterName; + LPWSTR pServerName; + DWORD Attributes; +} PRINTER_INFO_4W,*PPRINTER_INFO_4W,*LPPRINTER_INFO_4W; +typedef struct _PRINTER_INFO_5A { + LPSTR pPrinterName; + LPSTR pPortName; + DWORD Attributes; + DWORD DeviceNotSelectedTimeout; + DWORD TransmissionRetryTimeout; +} PRINTER_INFO_5A,*PPRINTER_INFO_5A,*LPPRINTER_INFO_5A; +typedef struct _PRINTER_INFO_5W { + LPWSTR pPrinterName; + LPWSTR pPortName; + DWORD Attributes; + DWORD DeviceNotSelectedTimeout; + DWORD TransmissionRetryTimeout; +} PRINTER_INFO_5W,*PPRINTER_INFO_5W,*LPPRINTER_INFO_5W; +typedef struct _PRINTER_INFO_6 { + DWORD dwStatus; +} PRINTER_INFO_6,*PPRINTER_INFO_6,*LPPRINTER_INFO_6; +typedef struct _PRINTPROCESSOR_INFO_1A {LPSTR pName;} PRINTPROCESSOR_INFO_1A,*PPRINTPROCESSOR_INFO_1A,*LPPRINTPROCESSOR_INFO_1A; +typedef struct _PRINTPROCESSOR_INFO_1W {LPWSTR pName;} PRINTPROCESSOR_INFO_1W,*PPRINTPROCESSOR_INFO_1W,*LPPRINTPROCESSOR_INFO_1W; +typedef struct _PRINTER_NOTIFY_INFO_DATA { + WORD Type; + WORD Field; + DWORD Reserved; + DWORD Id; + union { + DWORD adwData[2]; + struct { + DWORD cbBuf; + PVOID pBuf; + } Data; + } NotifyData; +} PRINTER_NOTIFY_INFO_DATA,*PPRINTER_NOTIFY_INFO_DATA,*LPPRINTER_NOTIFY_INFO_DATA; +typedef struct _PRINTER_NOTIFY_INFO { + DWORD Version; + DWORD Flags; + DWORD Count; + PRINTER_NOTIFY_INFO_DATA aData[1]; +} PRINTER_NOTIFY_INFO,*PPRINTER_NOTIFY_INFO,*LPPRINTER_NOTIFY_INFO; +typedef struct _FORM_INFO_1A { + DWORD Flags; + LPSTR pName; + SIZEL Size; + RECTL ImageableArea; +} FORM_INFO_1A,*PFORM_INFO_1A,*LPFORM_INFO_1A; +typedef struct _FORM_INFO_1W { + DWORD Flags; + LPWSTR pName; + SIZEL Size; + RECTL ImageableArea; +} FORM_INFO_1W,*PFORM_INFO_1W,*LPFORM_INFO_1W; +typedef struct _PRINTER_DEFAULTSA { + LPSTR pDatatype; + LPDEVMODE pDevMode; + ACCESS_MASK DesiredAccess; +} PRINTER_DEFAULTSA,*PPRINTER_DEFAULTSA,*LPPRINTER_DEFAULTSA; +typedef struct _PRINTER_DEFAULTSW { + LPWSTR pDatatype; + LPDEVMODE pDevMode; + ACCESS_MASK DesiredAccess; +} PRINTER_DEFAULTSW,*PPRINTER_DEFAULTSW,*LPPRINTER_DEFAULTSW; + +BOOL WINAPI AbortPrinter(HANDLE); +BOOL WINAPI AddFormA(HANDLE,DWORD,PBYTE); +BOOL WINAPI AddFormW(HANDLE,DWORD,PBYTE); +BOOL WINAPI AddJobA(HANDLE,DWORD,PBYTE,DWORD,PDWORD); +BOOL WINAPI AddJobW(HANDLE,DWORD,PBYTE,DWORD,PDWORD); +BOOL WINAPI AddMonitorA(LPSTR,DWORD,PBYTE); +BOOL WINAPI AddMonitorW(LPWSTR,DWORD,PBYTE); +BOOL WINAPI AddPortA(LPSTR,HWND,LPSTR); +BOOL WINAPI AddPortW(LPWSTR,HWND,LPWSTR); +HANDLE WINAPI AddPrinterA(LPSTR,DWORD,PBYTE); +HANDLE WINAPI AddPrinterW(LPWSTR,DWORD,PBYTE); +BOOL WINAPI AddPrinterConnectionA(LPSTR); +BOOL WINAPI AddPrinterConnectionW(LPWSTR); +BOOL WINAPI AddPrinterDriverA(LPSTR,DWORD,PBYTE); +BOOL WINAPI AddPrinterDriverW(LPWSTR,DWORD,PBYTE); +BOOL WINAPI AddPrintProcessorA(LPSTR,LPSTR,LPSTR,LPSTR); +BOOL WINAPI AddPrintProcessorW(LPWSTR,LPWSTR,LPWSTR,LPWSTR); +BOOL WINAPI AddPrintProvidorA(LPSTR,DWORD,PBYTE); +BOOL WINAPI AddPrintProvidorW(LPWSTR,DWORD,PBYTE); +LONG WINAPI AdvancedDocumentPropertiesA(HWND,HANDLE,LPSTR,PDEVMODE,PDEVMODEA); +LONG WINAPI AdvancedDocumentPropertiesW(HWND,HANDLE,LPWSTR,PDEVMODE,PDEVMODEW); +BOOL WINAPI ClosePrinter(HANDLE); +BOOL WINAPI ConfigurePortA(LPSTR,HWND,LPSTR); +BOOL WINAPI ConfigurePortW(LPWSTR,HWND,LPWSTR); +HANDLE WINAPI ConnectToPrinterDlg(HWND,DWORD); +BOOL WINAPI DeleteFormA(HANDLE,LPSTR); +BOOL WINAPI DeleteFormW(HANDLE,LPWSTR); +BOOL WINAPI DeleteMonitorA(LPSTR,LPSTR,LPSTR); +BOOL WINAPI DeleteMonitorW(LPWSTR,LPWSTR,LPWSTR); +BOOL WINAPI DeletePortA(LPSTR,HWND,LPSTR); +BOOL WINAPI DeletePortW(LPWSTR,HWND,LPWSTR); +BOOL WINAPI DeletePrinter(HANDLE); +BOOL WINAPI DeletePrinterConnectionA(LPSTR); +BOOL WINAPI DeletePrinterConnectionW(LPWSTR); +DWORD WINAPI DeletePrinterDataA(HANDLE,LPSTR); +DWORD WINAPI DeletePrinterDataW(HANDLE,LPWSTR); +BOOL WINAPI DeletePrinterDriverA(LPSTR,LPSTR,LPSTR); +BOOL WINAPI DeletePrinterDriverW(LPWSTR,LPWSTR,LPWSTR); +BOOL WINAPI DeletePrintProcessorA(LPSTR,LPSTR,LPSTR); +BOOL WINAPI DeletePrintProcessorW(LPWSTR,LPWSTR,LPWSTR); +BOOL WINAPI DeletePrintProvidorA(LPSTR,LPSTR,LPSTR); +BOOL WINAPI DeletePrintProvidorW(LPWSTR,LPWSTR,LPWSTR); +LONG WINAPI DocumentPropertiesA(HWND,HANDLE,LPSTR,PDEVMODEA,PDEVMODEA,DWORD); +LONG WINAPI DocumentPropertiesW(HWND,HANDLE,LPWSTR,PDEVMODEA,PDEVMODEA,DWORD); +BOOL WINAPI EndDocPrinter(HANDLE); +BOOL WINAPI EndPagePrinter(HANDLE); +BOOL WINAPI EnumFormsA(HANDLE,DWORD,PBYTE,DWORD,PDWORD,PDWORD); +BOOL WINAPI EnumFormsW(HANDLE,DWORD,PBYTE,DWORD,PDWORD,PDWORD); +BOOL WINAPI EnumJobsA(HANDLE,DWORD,DWORD,DWORD,PBYTE,DWORD,PDWORD,PDWORD); +BOOL WINAPI EnumJobsW(HANDLE,DWORD,DWORD,DWORD,PBYTE,DWORD,PDWORD,PDWORD); +BOOL WINAPI EnumMonitorsA(LPSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD); +BOOL WINAPI EnumMonitorsW(LPWSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD); +BOOL WINAPI EnumPortsA(LPSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD); +BOOL WINAPI EnumPortsW(LPWSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD); +DWORD WINAPI EnumPrinterDataA(HANDLE,DWORD,LPSTR,DWORD,PDWORD,PDWORD,PBYTE,DWORD,PDWORD); +DWORD WINAPI EnumPrinterDataW(HANDLE,DWORD,LPWSTR,DWORD,PDWORD,PDWORD,PBYTE,DWORD,PDWORD); +BOOL WINAPI EnumPrinterDriversA(LPSTR,LPSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD); +BOOL WINAPI EnumPrinterDriversW(LPWSTR,LPWSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD); +BOOL WINAPI EnumPrintersA(DWORD,LPSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD); +BOOL WINAPI EnumPrintersW(DWORD,LPWSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD); +BOOL WINAPI EnumPrintProcessorDatatypesA(LPSTR,LPSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD); +BOOL WINAPI EnumPrintProcessorDatatypesW(LPWSTR,LPWSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD); +BOOL WINAPI EnumPrintProcessorsA(LPSTR,LPSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD); +BOOL WINAPI EnumPrintProcessorsW(LPWSTR,LPWSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD); +BOOL WINAPI FindClosePrinterChangeNotification(HANDLE); +HANDLE WINAPI FindFirstPrinterChangeNotification(HANDLE,DWORD,DWORD,PVOID); +HANDLE WINAPI FindNextPrinterChangeNotification(HANDLE,PDWORD,PVOID,PVOID*); +BOOL WINAPI FreePrinterNotifyInfo(PPRINTER_NOTIFY_INFO); +#if _WIN32_WINNT >= 0x0500 +BOOL WINAPI GetDefaultPrinterA(LPSTR,LPDWORD); +BOOL WINAPI GetDefaultPrinterW(LPWSTR,LPDWORD); +#endif +BOOL WINAPI GetFormA(HANDLE,LPSTR,DWORD,PBYTE,DWORD,PDWORD); +BOOL WINAPI GetFormW(HANDLE,LPWSTR,DWORD,PBYTE,DWORD,PDWORD); +BOOL WINAPI GetJobA(HANDLE,DWORD,DWORD,PBYTE,DWORD,PDWORD); +BOOL WINAPI GetJobW(HANDLE,DWORD,DWORD,PBYTE,DWORD,PDWORD); +BOOL WINAPI GetPrinterA(HANDLE,DWORD,PBYTE,DWORD,PDWORD); +BOOL WINAPI GetPrinterW(HANDLE,DWORD,PBYTE,DWORD,PDWORD); +DWORD WINAPI GetPrinterDataA(HANDLE,LPSTR,PDWORD,PBYTE,DWORD,PDWORD); +DWORD WINAPI GetPrinterDataW(HANDLE,LPWSTR,PDWORD,PBYTE,DWORD,PDWORD); +DWORD WINAPI GetPrinterDriverA(HANDLE,LPSTR,DWORD,PBYTE,DWORD,PDWORD); +DWORD WINAPI GetPrinterDriverW(HANDLE,LPWSTR,DWORD,PBYTE,DWORD,PDWORD); +DWORD WINAPI GetPrinterDriverDirectoryA(LPSTR,LPSTR,DWORD,PBYTE,DWORD,PDWORD); +DWORD WINAPI GetPrinterDriverDirectoryW(LPWSTR,LPWSTR,DWORD,PBYTE,DWORD,PDWORD); +DWORD WINAPI GetPrintProcessorDirectoryA(LPSTR,LPSTR,DWORD,PBYTE,DWORD,PDWORD); +DWORD WINAPI GetPrintProcessorDirectoryW(LPWSTR,LPWSTR,DWORD,PBYTE,DWORD,PDWORD); +BOOL WINAPI OpenPrinterA(LPSTR,PHANDLE,LPPRINTER_DEFAULTSA); +BOOL WINAPI OpenPrinterW(LPWSTR,PHANDLE,LPPRINTER_DEFAULTSW); +DWORD WINAPI PrinterMessageBoxA(HANDLE,DWORD,HWND,LPSTR,LPSTR,DWORD); +DWORD WINAPI PrinterMessageBoxW(HANDLE,DWORD,HWND,LPWSTR,LPWSTR,DWORD); +BOOL WINAPI PrinterProperties(HWND,HANDLE); +BOOL WINAPI ReadPrinter(HANDLE,PVOID,DWORD,PDWORD); +BOOL WINAPI ResetPrinterA(HANDLE,LPPRINTER_DEFAULTSA); +BOOL WINAPI ResetPrinterW(HANDLE,LPPRINTER_DEFAULTSW); +BOOL WINAPI ScheduleJob(HANDLE,DWORD); +BOOL WINAPI SetFormA(HANDLE,LPSTR,DWORD,PBYTE); +BOOL WINAPI SetFormW(HANDLE,LPWSTR,DWORD,PBYTE); +BOOL WINAPI SetJobA(HANDLE,DWORD,DWORD,PBYTE,DWORD); +BOOL WINAPI SetJobW(HANDLE,DWORD,DWORD,PBYTE,DWORD); +BOOL WINAPI SetPrinterA(HANDLE,DWORD,PBYTE,DWORD); +BOOL WINAPI SetPrinterW(HANDLE,DWORD,PBYTE,DWORD); +BOOL WINAPI SetPrinterDataA(HANDLE,LPSTR,DWORD,PBYTE,DWORD); +BOOL WINAPI SetPrinterDataW(HANDLE,LPWSTR,DWORD,PBYTE,DWORD); +DWORD WINAPI StartDocPrinterA(HANDLE,DWORD,PBYTE); +DWORD WINAPI StartDocPrinterW(HANDLE,DWORD,PBYTE); +BOOL WINAPI StartPagePrinter(HANDLE); +DWORD WINAPI WaitForPrinterChange(HANDLE,DWORD); +BOOL WINAPI WritePrinter(HANDLE,PVOID,DWORD,PDWORD); + +#ifdef UNICODE +typedef JOB_INFO_1W JOB_INFO_1,*PJOB_INFO_1,*LPJOB_INFO_1; +typedef JOB_INFO_2W JOB_INFO_2,*PJOB_INFO_2,*LPJOB_INFO_2; +typedef ADDJOB_INFO_1W ADDJOB_INFO_1,*PADDJOB_INFO_1,*LPADDJOB_INFO_1; +typedef DATATYPES_INFO_1W DATATYPES_INFO_1,*PDATATYPES_INFO_1,*LPDATATYPES_INFO_1; +typedef MONITOR_INFO_1W MONITOR_INFO_1,*PMONITOR_INFO_1,*LPMONITOR_INFO_1; +typedef MONITOR_INFO_2W MONITOR_INFO_2,*PMONITOR_INFO_2,*LPMONITOR_INFO_2; +typedef DOC_INFO_1W DOC_INFO_1,*PDOC_INFO_1,*LPDOC_INFO_1; +typedef DOC_INFO_2W DOC_INFO_2,*PDOC_INFO_2,*LPDOC_INFO_2; +typedef PORT_INFO_1W PORT_INFO_1,*PPORT_INFO_1,*LPPORT_INFO_1; +typedef PORT_INFO_2W PORT_INFO_2,*PPORT_INFO_2,*LPPORT_INFO_2; +typedef PORT_INFO_3W PORT_INFO_3,*PPORT_INFO_3,*LPPORT_INFO_3; +typedef DRIVER_INFO_2W DRIVER_INFO_2,*PDRIVER_INFO_2,*LPDRIVER_INFO_2; +typedef PRINTER_INFO_1W PRINTER_INFO_1,*PPRINTER_INFO_1,*LPPRINTER_INFO_1; +typedef PRINTER_INFO_2W PRINTER_INFO_2,*PPRINTER_INFO_2,*LPPRINTER_INFO_2; +typedef PRINTER_INFO_4W PRINTER_INFO_4,*PPRINTER_INFO_4,*LPPRINTER_INFO_4; +typedef PRINTER_INFO_5W PRINTER_INFO_5,*PPRINTER_INFO_5,*LPPRINTER_INFO_5; +typedef PRINTPROCESSOR_INFO_1W PRINTPROCESSOR_INFO_1,*PPRINTPROCESSOR_INFO_1,*LPPRINTPROCESSOR_INFO_1; +typedef FORM_INFO_1W FORM_INFO_1,*PFORM_INFO_1,*LPFORM_INFO_1; +typedef PRINTER_DEFAULTSW PRINTER_DEFAULTS,*PPRINTER_DEFAULTS,*LPPRINTER_DEFAULTS; +#define AddForm AddFormW +#define AddJob AddJobW +#define AddMonitor AddMonitorW +#define AddPort AddPortW +#define AddPrinter AddPrinterW +#define AddPrinterConnection AddPrinterConnectionW +#define AddPrinterDriver AddPrinterDriverW +#define AddPrintProcessor AddPrintProcessorW +#define AddPrintProvidor AddPrintProvidorW +#define AdvancedDocumentProperties AdvancedDocumentPropertiesW +#define ConfigurePort ConfigurePortW +#define DeleteForm DeleteFormW +#define DeleteMonitor DeleteMonitorW +#define DeletePort DeletePortW +#define DeletePrinterConnection DeletePrinterConnectionW +#define DeletePrinterData DeletePrinterDataW +#define DeletePrinterDriver DeletePrinterDriverW +#define DeletePrintProcessor DeletePrinterProcessorW +#define DeletePrintProvidor DeletePrinterProvidorW +#define DocumentProperties DocumentPropertiesW +#define EnumForms EnumFormsW +#define EnumJobs EnumJobsW +#define EnumMonitors EnumMonitorsW +#define EnumPorts EnumPortsW +#define EnumPrinterData EnumPrinterDataW +#define EnumPrinterDrivers EnumPrinterDriversW +#define EnumPrinters EnumPrintersW +#define EnumPrintProcessorDatatypes EnumPrintProcessorDatatypesW +#define EnumPrintProcessors EnumPrintProcessorsW +#define GetDefaultPrinter GetDefaultPrinterW +#define GetForm GetFormW +#define GetJob GetJobW +#define GetPrinter GetPrinterW +#define GetPrinterData GetPrinterDataW +#define GetPrinterDriver GetPrinterDriverW +#define GetPrinterDriverDirectory GetPrinterDriverDirectoryW +#define GetPrintProcessorDirectory GetPrintProcessorDirectoryW +#define OpenPrinter OpenPrinterW +#define PrinterMessageBox PrinterMessageBoxW +#define ResetPrinter ResetPrinterW +#define SetForm SetFormW +#define SetJob SetJobW +#define SetPrinter SetPrinterW +#define SetPrinterData SetPrinterDataW +#define StartDocPrinter StartDocPrinterW +#else +typedef JOB_INFO_1A JOB_INFO_1,*PJOB_INFO_1,*LPJOB_INFO_1; +typedef JOB_INFO_2A JOB_INFO_2,*PJOB_INFO_2,*LPJOB_INFO_2; +typedef ADDJOB_INFO_1A ADDJOB_INFO_1,*PADDJOB_INFO_1,*LPADDJOB_INFO_1; +typedef DATATYPES_INFO_1A DATATYPES_INFO_1,*PDATATYPES_INFO_1,*LPDATATYPES_INFO_1; +typedef MONITOR_INFO_1A MONITOR_INFO_1,*PMONITOR_INFO_1,*LPMONITOR_INFO_1; +typedef MONITOR_INFO_2A MONITOR_INFO_2,*PMONITOR_INFO_2,*LPMONITOR_INFO_2; +typedef DOC_INFO_1A DOC_INFO_1,*PDOC_INFO_1,*LPDOC_INFO_1; +typedef DOC_INFO_2A DOC_INFO_2,*PDOC_INFO_2,*LPDOC_INFO_2; +typedef PORT_INFO_1A PORT_INFO_1,*PPORT_INFO_1,*LPPORT_INFO_1; +typedef PORT_INFO_2A PORT_INFO_2,*PPORT_INFO_2,*LPPORT_INFO_2; +typedef PORT_INFO_3A PORT_INFO_3,*PPORT_INFO_3,*LPPORT_INFO_3; +typedef DRIVER_INFO_2A DRIVER_INFO_2,*PDRIVER_INFO_2,*LPDRIVER_INFO_2; +typedef PRINTER_INFO_1A PRINTER_INFO_1,*PPRINTER_INFO_1,*LPPRINTER_INFO_1; +typedef PRINTER_INFO_2A PRINTER_INFO_2,*PPRINTER_INFO_2,*LPPRINTER_INFO_2; +typedef PRINTER_INFO_4A PRINTER_INFO_4,*PPRINTER_INFO_4,*LPPRINTER_INFO_4; +typedef PRINTER_INFO_5A PRINTER_INFO_5,*PPRINTER_INFO_5,*LPPRINTER_INFO_5; +typedef PRINTPROCESSOR_INFO_1A PRINTPROCESSOR_INFO_1,*PPRINTPROCESSOR_INFO_1,*LPPRINTPROCESSOR_INFO_1; +typedef FORM_INFO_1A FORM_INFO_1,*PFORM_INFO_1,*LPFORM_INFO_1; +typedef PRINTER_DEFAULTSA PRINTER_DEFAULTS,*PPRINTER_DEFAULTS,*LPPRINTER_DEFAULTS; +#define AddForm AddFormA +#define AddJob AddJobA +#define AddMonitor AddMonitorA +#define AddPort AddPortA +#define AddPrinter AddPrinterA +#define AddPrinterConnection AddPrinterConnectionA +#define AddPrinterDriver AddPrinterDriverA +#define AddPrintProcessor AddPrintProcessorA +#define AddPrintProvidor AddPrintProvidorA +#define AdvancedDocumentProperties AdvancedDocumentPropertiesA +#define ConfigurePort ConfigurePortA +#define DeleteForm DeleteFormA +#define DeleteMonitor DeleteMonitorA +#define DeletePort DeletePortA +#define DeletePrinterConnection DeletePrinterConnectionA +#define DeletePrinterData DeletePrinterDataA +#define DeletePrinterDriver DeletePrinterDriverA +#define DeletePrintProcessor DeletePrinterProcessorA +#define DeletePrintProvidor DeletePrinterProvidorA +#define DocumentProperties DocumentPropertiesA +#define EnumForms EnumFormsA +#define EnumJobs EnumJobsA +#define EnumMonitors EnumMonitorsA +#define EnumPorts EnumPortsA +#define EnumPrinterData EnumPrinterDataA +#define EnumPrinterDrivers EnumPrinterDriversA +#define EnumPrinters EnumPrintersA +#define EnumPrintProcessorDatatypes EnumPrintProcessorDatatypesA +#define EnumPrintProcessors EnumPrintProcessorsA +#define GetDefaultPrinter GetDefaultPrinterA +#define GetForm GetFormA +#define GetJob GetJobA +#define GetPrinter GetPrinterA +#define GetPrinterData GetPrinterDataA +#define GetPrinterDriver GetPrinterDriverA +#define GetPrinterDriverDirectory GetPrinterDriverDirectoryA +#define GetPrintProcessorDirectory GetPrintProcessorDirectoryA +#define OpenPrinter OpenPrinterA +#define PrinterMessageBox PrinterMessageBoxA +#define ResetPrinter ResetPrinterA +#define SetForm SetFormA +#define SetJob SetJobA +#define SetPrinter SetPrinterA +#define SetPrinterData SetPrinterDataA +#define StartDocPrinter StartDocPrinterA +#endif +#endif /* RC_INVOKED */ +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/winsvc.h b/reactos/w32api/include/winsvc.h new file mode 100644 index 00000000000..cfc3f57a9d2 --- /dev/null +++ b/reactos/w32api/include/winsvc.h @@ -0,0 +1,309 @@ +#ifndef _WINSVC_H +#define _WINSVC_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define SERVICES_ACTIVE_DATABASEA "ServicesActive" +#define SERVICES_ACTIVE_DATABASEW L"ServicesActive" +#define SERVICES_FAILED_DATABASEA "ServicesFailed" +#define SERVICES_FAILED_DATABASEW L"ServicesFailed" +#define SC_GROUP_IDENTIFIERA '+' +#define SC_GROUP_IDENTIFIERW L'+' +#define SC_MANAGER_ALL_ACCESS 0xf003f +#define SC_MANAGER_CONNECT 1 +#define SC_MANAGER_CREATE_SERVICE 2 +#define SC_MANAGER_ENUMERATE_SERVICE 4 +#define SC_MANAGER_LOCK 8 +#define SC_MANAGER_QUERY_LOCK_STATUS 16 +#define SC_MANAGER_MODIFY_BOOT_CONFIG 32 +#define SERVICE_NO_CHANGE 0xffffffff +#define SERVICE_STOPPED 1 +#define SERVICE_START_PENDING 2 +#define SERVICE_STOP_PENDING 3 +#define SERVICE_RUNNING 4 +#define SERVICE_CONTINUE_PENDING 5 +#define SERVICE_PAUSE_PENDING 6 +#define SERVICE_PAUSED 7 +#define SERVICE_ACCEPT_STOP 1 +#define SERVICE_ACCEPT_PAUSE_CONTINUE 2 +#define SERVICE_ACCEPT_SHUTDOWN 4 +#define SERVICE_ACCEPT_PARAMCHANGE 8 +#define SERVICE_ACCEPT_NETBINDCHANGE 16 +#define SERVICE_ACCEPT_HARDWAREPROFILECHANGE 32 +#define SERVICE_ACCEPT_POWEREVENT 64 +#define SERVICE_ACCEPT_SESSIONCHANGE 128 +#define SERVICE_CONTROL_STOP 1 +#define SERVICE_CONTROL_PAUSE 2 +#define SERVICE_CONTROL_CONTINUE 3 +#define SERVICE_CONTROL_INTERROGATE 4 +#define SERVICE_CONTROL_SHUTDOWN 5 +#define SERVICE_CONTROL_PARAMCHANGE 6 +#define SERVICE_CONTROL_NETBINDADD 7 +#define SERVICE_CONTROL_NETBINDREMOVE 8 +#define SERVICE_CONTROL_NETBINDENABLE 9 +#define SERVICE_CONTROL_NETBINDDISABLE 10 +#define SERVICE_CONTROL_DEVICEEVENT 11 +#define SERVICE_CONTROL_HARDWAREPROFILECHANGE 12 +#define SERVICE_CONTROL_POWEREVENT 13 +#define SERVICE_CONTROL_SESSIONCHANGE 14 +#define SERVICE_ACTIVE 1 +#define SERVICE_INACTIVE 2 +#define SERVICE_STATE_ALL 3 +#define SERVICE_QUERY_CONFIG 1 +#define SERVICE_CHANGE_CONFIG 2 +#define SERVICE_QUERY_STATUS 4 +#define SERVICE_ENUMERATE_DEPENDENTS 8 +#define SERVICE_START 16 +#define SERVICE_STOP 32 +#define SERVICE_PAUSE_CONTINUE 64 +#define SERVICE_INTERROGATE 128 +#define SERVICE_USER_DEFINED_CONTROL 256 +#define SERVICE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SERVICE_QUERY_CONFIG|SERVICE_CHANGE_CONFIG|SERVICE_QUERY_STATUS|SERVICE_ENUMERATE_DEPENDENTS|SERVICE_START|SERVICE_STOP|SERVICE_PAUSE_CONTINUE|SERVICE_INTERROGATE|SERVICE_USER_DEFINED_CONTROL) +#define SERVICE_RUNS_IN_SYSTEM_PROCESS 1 +#define SERVICE_CONFIG_DESCRIPTION 1 +#define SERVICE_CONFIG_FAILURE_ACTIONS 2 + +typedef struct _SERVICE_STATUS { + DWORD dwServiceType; + DWORD dwCurrentState; + DWORD dwControlsAccepted; + DWORD dwWin32ExitCode; + DWORD dwServiceSpecificExitCode; + DWORD dwCheckPoint; + DWORD dwWaitHint; +} SERVICE_STATUS,*LPSERVICE_STATUS; +typedef struct _SERVICE_STATUS_PROCESS { + DWORD dwServiceType; + DWORD dwCurrentState; + DWORD dwControlsAccepted; + DWORD dwWin32ExitCode; + DWORD dwServiceSpecificExitCode; + DWORD dwCheckPoint; + DWORD dwWaitHint; + DWORD dwProcessId; + DWORD dwServiceFlags; +} SERVICE_STATUS_PROCESS, *LPSERVICE_STATUS_PROCESS; +typedef enum _SC_STATUS_TYPE { + SC_STATUS_PROCESS_INFO = 0 +} SC_STATUS_TYPE; +typedef enum _SC_ENUM_TYPE { + SC_ENUM_PROCESS_INFO = 0 +} SC_ENUM_TYPE; +typedef struct _ENUM_SERVICE_STATUSA { + LPSTR lpServiceName; + LPSTR lpDisplayName; + SERVICE_STATUS ServiceStatus; +} ENUM_SERVICE_STATUSA,*LPENUM_SERVICE_STATUSA; +typedef struct _ENUM_SERVICE_STATUSW { + LPWSTR lpServiceName; + LPWSTR lpDisplayName; + SERVICE_STATUS ServiceStatus; +} ENUM_SERVICE_STATUSW,*LPENUM_SERVICE_STATUSW; +typedef struct _ENUM_SERVICE_STATUS_PROCESSA { + LPSTR lpServiceName; + LPSTR lpDisplayName; + SERVICE_STATUS_PROCESS ServiceStatusProcess; +} ENUM_SERVICE_STATUS_PROCESSA,*LPENUM_SERVICE_STATUS_PROCESSA; +typedef struct _ENUM_SERVICE_STATUS_PROCESSW { + LPWSTR lpServiceName; + LPWSTR lpDisplayName; + SERVICE_STATUS_PROCESS ServiceStatusProcess; +} ENUM_SERVICE_STATUS_PROCESSW,*LPENUM_SERVICE_STATUS_PROCESSW; +typedef struct _QUERY_SERVICE_CONFIGA { + DWORD dwServiceType; + DWORD dwStartType; + DWORD dwErrorControl; + LPSTR lpBinaryPathName; + LPSTR lpLoadOrderGroup; + DWORD dwTagId; + LPSTR lpDependencies; + LPSTR lpServiceStartName; + LPSTR lpDisplayName; +} QUERY_SERVICE_CONFIGA,*LPQUERY_SERVICE_CONFIGA; +typedef struct _QUERY_SERVICE_CONFIGW { + DWORD dwServiceType; + DWORD dwStartType; + DWORD dwErrorControl; + LPWSTR lpBinaryPathName; + LPWSTR lpLoadOrderGroup; + DWORD dwTagId; + LPWSTR lpDependencies; + LPWSTR lpServiceStartName; + LPWSTR lpDisplayName; +} QUERY_SERVICE_CONFIGW,*LPQUERY_SERVICE_CONFIGW; +typedef struct _QUERY_SERVICE_LOCK_STATUSA { + DWORD fIsLocked; + LPSTR lpLockOwner; + DWORD dwLockDuration; +} QUERY_SERVICE_LOCK_STATUSA,*LPQUERY_SERVICE_LOCK_STATUSA; +typedef struct _QUERY_SERVICE_LOCK_STATUSW { + DWORD fIsLocked; + LPWSTR lpLockOwner; + DWORD dwLockDuration; +} QUERY_SERVICE_LOCK_STATUSW,*LPQUERY_SERVICE_LOCK_STATUSW; +typedef void (WINAPI *LPSERVICE_MAIN_FUNCTIONA)(DWORD,LPSTR*); +typedef void (WINAPI *LPSERVICE_MAIN_FUNCTIONW)(DWORD,LPWSTR*); +typedef struct _SERVICE_TABLE_ENTRYA { + LPSTR lpServiceName; + LPSERVICE_MAIN_FUNCTIONA lpServiceProc; +} SERVICE_TABLE_ENTRYA,*LPSERVICE_TABLE_ENTRYA; +typedef struct _SERVICE_TABLE_ENTRYW { + LPWSTR lpServiceName; + LPSERVICE_MAIN_FUNCTIONW lpServiceProc; +} SERVICE_TABLE_ENTRYW,*LPSERVICE_TABLE_ENTRYW; +DECLARE_HANDLE(SC_HANDLE); +typedef SC_HANDLE *LPSC_HANDLE; +typedef PVOID SC_LOCK; +typedef DWORD SERVICE_STATUS_HANDLE; +typedef VOID(WINAPI *LPHANDLER_FUNCTION)(DWORD); +typedef DWORD (WINAPI *LPHANDLER_FUNCTION_EX)(DWORD,DWORD,LPVOID,LPVOID); +typedef struct _SERVICE_DESCRIPTIONA { + LPSTR lpDescription; +} SERVICE_DESCRIPTIONA,*LPSERVICE_DESCRIPTIONA; +typedef struct _SERVICE_DESCRIPTIONW { + LPWSTR lpDescription; +} SERVICE_DESCRIPTIONW,*LPSERVICE_DESCRIPTIONW; +typedef enum _SC_ACTION_TYPE { + SC_ACTION_NONE = 0, + SC_ACTION_RESTART = 1, + SC_ACTION_REBOOT = 2, + SC_ACTION_RUN_COMMAND = 3 +} SC_ACTION_TYPE; +typedef struct _SC_ACTION { + SC_ACTION_TYPE Type; + DWORD Delay; +} SC_ACTION,*LPSC_ACTION; +typedef struct _SERVICE_FAILURE_ACTIONSA { + DWORD dwResetPeriod; + LPSTR lpRebootMsg; + LPSTR lpCommand; + DWORD cActions; + SC_ACTION * lpsaActions; +} SERVICE_FAILURE_ACTIONSA,*LPSERVICE_FAILURE_ACTIONSA; +typedef struct _SERVICE_FAILURE_ACTIONSW { + DWORD dwResetPeriod; + LPWSTR lpRebootMsg; + LPWSTR lpCommand; + DWORD cActions; + SC_ACTION * lpsaActions; +} SERVICE_FAILURE_ACTIONSW,*LPSERVICE_FAILURE_ACTIONSW; + +BOOL WINAPI ChangeServiceConfigA(SC_HANDLE,DWORD,DWORD,DWORD,LPCSTR,LPCSTR,LPDWORD,LPCSTR,LPCSTR,LPCSTR,LPCSTR); +BOOL WINAPI ChangeServiceConfigW(SC_HANDLE,DWORD,DWORD,DWORD,LPCWSTR,LPCWSTR,LPDWORD,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR); +BOOL WINAPI ChangeServiceConfig2A(SC_HANDLE,DWORD,LPVOID); +BOOL WINAPI ChangeServiceConfig2W(SC_HANDLE,DWORD,LPVOID); +BOOL WINAPI CloseServiceHandle(SC_HANDLE); +BOOL WINAPI ControlService(SC_HANDLE,DWORD,LPSERVICE_STATUS); +SC_HANDLE WINAPI CreateServiceA(SC_HANDLE,LPCSTR,LPCSTR,DWORD,DWORD,DWORD,DWORD,LPCSTR,LPCSTR,PDWORD,LPCSTR,LPCSTR,LPCSTR); +SC_HANDLE WINAPI CreateServiceW(SC_HANDLE,LPCWSTR,LPCWSTR,DWORD,DWORD,DWORD,DWORD,LPCWSTR,LPCWSTR,PDWORD,LPCWSTR,LPCWSTR,LPCWSTR); +BOOL WINAPI DeleteService(SC_HANDLE); +BOOL WINAPI EnumDependentServicesA(SC_HANDLE,DWORD,LPENUM_SERVICE_STATUSA,DWORD,PDWORD,PDWORD); +BOOL WINAPI EnumDependentServicesW(SC_HANDLE,DWORD,LPENUM_SERVICE_STATUSW,DWORD,PDWORD,PDWORD); +BOOL WINAPI EnumServicesStatusA(SC_HANDLE,DWORD,DWORD,LPENUM_SERVICE_STATUSA,DWORD,PDWORD,PDWORD,PDWORD); +BOOL WINAPI EnumServicesStatusW(SC_HANDLE,DWORD,DWORD,LPENUM_SERVICE_STATUSW,DWORD,PDWORD,PDWORD,PDWORD); +BOOL WINAPI EnumServicesStatusExA(SC_HANDLE,SC_ENUM_TYPE,DWORD,DWORD,LPBYTE,DWORD,LPDWORD,LPDWORD,LPDWORD,LPCSTR); +BOOL WINAPI EnumServicesStatusExW(SC_HANDLE,SC_ENUM_TYPE,DWORD,DWORD,LPBYTE,DWORD,LPDWORD,LPDWORD,LPDWORD,LPCWSTR); +BOOL WINAPI GetServiceDisplayNameA(SC_HANDLE,LPCSTR,LPSTR,PDWORD); +BOOL WINAPI GetServiceDisplayNameW(SC_HANDLE,LPCWSTR,LPWSTR,PDWORD); +BOOL WINAPI GetServiceKeyNameA(SC_HANDLE,LPCSTR,LPSTR,PDWORD); +BOOL WINAPI GetServiceKeyNameW(SC_HANDLE,LPCWSTR,LPWSTR,PDWORD); +SC_LOCK WINAPI LockServiceDatabase(SC_HANDLE); +BOOL WINAPI NotifyBootConfigStatus(BOOL); +SC_HANDLE WINAPI OpenSCManagerA(LPCSTR,LPCSTR,DWORD); +SC_HANDLE WINAPI OpenSCManagerW(LPCWSTR,LPCWSTR,DWORD); +SC_HANDLE WINAPI OpenServiceA(SC_HANDLE,LPCSTR,DWORD); +SC_HANDLE WINAPI OpenServiceW(SC_HANDLE,LPCWSTR,DWORD); +BOOL WINAPI QueryServiceConfigA(SC_HANDLE,LPQUERY_SERVICE_CONFIGA,DWORD,PDWORD); +BOOL WINAPI QueryServiceConfigW(SC_HANDLE,LPQUERY_SERVICE_CONFIGW,DWORD,PDWORD); +BOOL WINAPI QueryServiceConfig2A(SC_HANDLE,DWORD,LPBYTE,DWORD,LPDWORD); +BOOL WINAPI QueryServiceConfig2W(SC_HANDLE,DWORD,LPBYTE,DWORD,LPDWORD); +BOOL WINAPI QueryServiceLockStatusA(SC_HANDLE,LPQUERY_SERVICE_LOCK_STATUSA,DWORD,PDWORD); +BOOL WINAPI QueryServiceLockStatusW(SC_HANDLE,LPQUERY_SERVICE_LOCK_STATUSW,DWORD,PDWORD); +BOOL WINAPI QueryServiceObjectSecurity(SC_HANDLE,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR,DWORD,LPDWORD); +BOOL WINAPI QueryServiceStatus(SC_HANDLE,LPSERVICE_STATUS); +BOOL WINAPI QueryServiceStatusEx(SC_HANDLE,SC_STATUS_TYPE,LPBYTE,DWORD,LPDWORD); +SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerA(LPCSTR,LPHANDLER_FUNCTION); +SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerW(LPCWSTR,LPHANDLER_FUNCTION); +SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerExA(LPCSTR,LPHANDLER_FUNCTION_EX,LPVOID); +SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerExW(LPCWSTR,LPHANDLER_FUNCTION_EX,LPVOID); +BOOL WINAPI SetServiceObjectSecurity(SC_HANDLE,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR); +BOOL WINAPI SetServiceStatus(SERVICE_STATUS_HANDLE,LPSERVICE_STATUS); +BOOL WINAPI StartServiceA(SC_HANDLE,DWORD,LPCSTR*); +BOOL WINAPI StartServiceCtrlDispatcherA(LPSERVICE_TABLE_ENTRYA); +BOOL WINAPI StartServiceCtrlDispatcherW(LPSERVICE_TABLE_ENTRYW); +BOOL WINAPI StartServiceW(SC_HANDLE,DWORD,LPCWSTR*); +BOOL WINAPI UnlockServiceDatabase(SC_LOCK); + +#ifdef UNICODE +typedef ENUM_SERVICE_STATUSW ENUM_SERVICE_STATUS,*LPENUM_SERVICE_STATUS; +typedef ENUM_SERVICE_STATUS_PROCESSW ENUM_SERVICE_STATUS_PROCESS; +typedef LPENUM_SERVICE_STATUS_PROCESSW LPENUM_SERVICE_STATUS_PROCESS; +typedef QUERY_SERVICE_CONFIGW QUERY_SERVICE_CONFIG,*LPQUERY_SERVICE_CONFIG; +typedef QUERY_SERVICE_LOCK_STATUSW QUERY_SERVICE_LOCK_STATUS,*LPQUERY_SERVICE_LOCK_STATUS; +typedef SERVICE_TABLE_ENTRYW SERVICE_TABLE_ENTRY,*LPSERVICE_TABLE_ENTRY; +typedef LPSERVICE_MAIN_FUNCTIONW LPSERVICE_MAIN_FUNCTION; +typedef SERVICE_DESCRIPTIONW SERVICE_DESCRIPTION; +typedef LPSERVICE_DESCRIPTIONW LPSERVICE_DESCRIPTION; +typedef SERVICE_FAILURE_ACTIONSW SERVICE_FAILURE_ACTIONS; +typedef LPSERVICE_FAILURE_ACTIONSW LPSERVICE_FAILURE_ACTIONS; +#define SERVICES_ACTIVE_DATABASE SERVICES_ACTIVE_DATABASEW +#define SERVICES_FAILED_DATABASE SERVICES_FAILED_DATABASEW +#define SC_GROUP_IDENTIFIER SC_GROUP_IDENTIFIERW +#define ChangeServiceConfig ChangeServiceConfigW +#define ChangeServiceConfig2 ChangeServiceConfig2W +#define CreateService CreateServiceW +#define EnumDependentServices EnumDependentServicesW +#define EnumServicesStatus EnumServicesStatusW +#define EnumServicesStatusEx EnumServicesStatusExW +#define GetServiceDisplayName GetServiceDisplayNameW +#define GetServiceKeyName GetServiceKeyNameW +#define OpenSCManager OpenSCManagerW +#define OpenService OpenServiceW +#define QueryServiceConfig QueryServiceConfigW +#define QueryServiceConfig2 QueryServiceConfig2W +#define QueryServiceLockStatus QueryServiceLockStatusW +#define RegisterServiceCtrlHandler RegisterServiceCtrlHandlerW +#define RegisterServiceCtrlHandlerEx RegisterServiceCtrlHandlerExW +#define StartService StartServiceW +#define StartServiceCtrlDispatcher StartServiceCtrlDispatcherW +#else +typedef ENUM_SERVICE_STATUSA ENUM_SERVICE_STATUS,*LPENUM_SERVICE_STATUS; +typedef ENUM_SERVICE_STATUS_PROCESSA ENUM_SERVICE_STATUS_PROCESS; +typedef LPENUM_SERVICE_STATUS_PROCESSA LPENUM_SERVICE_STATUS_PROCESS; +typedef QUERY_SERVICE_CONFIGA QUERY_SERVICE_CONFIG,*LPQUERY_SERVICE_CONFIG; +typedef QUERY_SERVICE_LOCK_STATUSA QUERY_SERVICE_LOCK_STATUS,*LPQUERY_SERVICE_LOCK_STATUS; +typedef SERVICE_TABLE_ENTRYA SERVICE_TABLE_ENTRY,*LPSERVICE_TABLE_ENTRY; +typedef LPSERVICE_MAIN_FUNCTIONA LPSERVICE_MAIN_FUNCTION; +typedef SERVICE_DESCRIPTIONA SERVICE_DESCRIPTION; +typedef LPSERVICE_DESCRIPTIONA LPSERVICE_DESCRIPTION; +typedef SERVICE_FAILURE_ACTIONSA SERVICE_FAILURE_ACTIONS; +typedef LPSERVICE_FAILURE_ACTIONSA LPSERVICE_FAILURE_ACTIONS; +#define SERVICES_ACTIVE_DATABASE SERVICES_ACTIVE_DATABASEA +#define SERVICES_FAILED_DATABASE SERVICES_FAILED_DATABASEA +#define SC_GROUP_IDENTIFIER SC_GROUP_IDENTIFIERA +#define ChangeServiceConfig ChangeServiceConfigA +#define ChangeServiceConfig2 ChangeServiceConfig2A +#define CreateService CreateServiceA +#define EnumDependentServices EnumDependentServicesA +#define EnumServicesStatus EnumServicesStatusA +#define EnumServicesStatusEx EnumServicesStatusExA +#define GetServiceDisplayName GetServiceDisplayNameA +#define GetServiceKeyName GetServiceKeyNameA +#define OpenSCManager OpenSCManagerA +#define OpenService OpenServiceA +#define QueryServiceConfig QueryServiceConfigA +#define QueryServiceConfig2 QueryServiceConfig2A +#define QueryServiceLockStatus QueryServiceLockStatusA +#define RegisterServiceCtrlHandler RegisterServiceCtrlHandlerA +#define RegisterServiceCtrlHandlerEx RegisterServiceCtrlHandlerExA +#define StartService StartServiceA +#define StartServiceCtrlDispatcher StartServiceCtrlDispatcherA +#endif +#ifdef __cplusplus +} +#endif +#endif /* _WINSVC_H */ diff --git a/reactos/w32api/include/winuser.h b/reactos/w32api/include/winuser.h new file mode 100644 index 00000000000..2c094c5db55 --- /dev/null +++ b/reactos/w32api/include/winuser.h @@ -0,0 +1,4123 @@ +#ifndef _WINUSER_H +#define _WINUSER_H +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define WC_DIALOG MAKEINTATOM(0x8002) +#define FALT 16 +#define FCONTROL 8 +#define FNOINVERT 2 +#define FSHIFT 4 +#define FVIRTKEY 1 +#define ATF_TIMEOUTON 1 +#define ATF_ONOFFFEEDBACK 2 +#define ATF_AVAILABLE 4 /* May be obsolete. Not in recent MS docs. */ +#define WH_MIN (-1) +#define WH_MSGFILTER (-1) +#define WH_JOURNALRECORD 0 +#define WH_JOURNALPLAYBACK 1 +#define WH_KEYBOARD 2 +#define WH_GETMESSAGE 3 +#define WH_CALLWNDPROC 4 +#define WH_CBT 5 +#define WH_SYSMSGFILTER 6 +#define WH_MOUSE 7 +#define WH_HARDWARE 8 +#define WH_DEBUG 9 +#define WH_SHELL 10 +#define WH_FOREGROUNDIDLE 11 +#define WH_CALLWNDPROCRET 12 +#define WH_KEYBOARD_LL 13 +#define WH_MOUSE_LL 14 +#define WH_MAX 14 +#define WH_MINHOOK WH_MIN +#define WH_MAXHOOK WH_MAX +#define HC_ACTION 0 +#define HC_GETNEXT 1 +#define HC_SKIP 2 +#define HC_NOREMOVE 3 +#define HC_NOREM 3 +#define HC_SYSMODALON 4 +#define HC_SYSMODALOFF 5 +#define HCBT_MOVESIZE 0 +#define HCBT_MINMAX 1 +#define HCBT_QS 2 +#define HCBT_CREATEWND 3 +#define HCBT_DESTROYWND 4 +#define HCBT_ACTIVATE 5 +#define HCBT_CLICKSKIPPED 6 +#define HCBT_KEYSKIPPED 7 +#define HCBT_SYSCOMMAND 8 +#define HCBT_SETFOCUS 9 +#define CF_TEXT 1 +#define CF_BITMAP 2 +#define CF_METAFILEPICT 3 +#define CF_SYLK 4 +#define CF_DIF 5 +#define CF_TIFF 6 +#define CF_OEMTEXT 7 +#define CF_DIB 8 +#define CF_PALETTE 9 +#define CF_PENDATA 10 +#define CF_RIFF 11 +#define CF_WAVE 12 +#define CF_UNICODETEXT 13 +#define CF_ENHMETAFILE 14 +#define CF_HDROP 15 +#define CF_LOCALE 16 +#define CF_MAX 17 +#define CF_OWNERDISPLAY 128 +#define CF_DSPTEXT 129 +#define CF_DSPBITMAP 130 +#define CF_DSPMETAFILEPICT 131 +#define CF_DSPENHMETAFILE 142 +#define CF_PRIVATEFIRST 512 +#define CF_PRIVATELAST 767 +#define CF_GDIOBJFIRST 768 +#define CF_GDIOBJLAST 1023 +#define HKL_NEXT 1 +#define HKL_PREV 0 +#define KLF_ACTIVATE 1 +#define KLF_SUBSTITUTE_OK 2 +#define KLF_UNLOADPREVIOUS 4 +#define KLF_REORDER 8 +#define KLF_REPLACELANG 16 +#define KLF_NOTELLSHELL 128 +#define KLF_SETFORPROCESS 256 +#define KL_NAMELENGTH 9 +#define MF_ENABLED 0 +#define MF_GRAYED 1 +#define MF_DISABLED 2 +#define MF_BITMAP 4 +#define MF_CHECKED 8 +#define MF_MENUBARBREAK 32 +#define MF_MENUBREAK 64 +#define MF_OWNERDRAW 256 +#define MF_POPUP 16 +#define MF_SEPARATOR 0x800 +#define MF_STRING 0 +#define MF_UNCHECKED 0 +#define MF_DEFAULT 4096 +#define MF_SYSMENU 0x2000 +#define MF_HELP 0x4000 +#define MF_END 128 +#define MF_RIGHTJUSTIFY 0x4000 +#define MF_MOUSESELECT 0x8000 +#define MF_INSERT 0 +#define MF_CHANGE 128 +#define MF_APPEND 256 +#define MF_DELETE 512 +#define MF_REMOVE 4096 +#define MF_USECHECKBITMAPS 512 +#define MF_UNHILITE 0 +#define MF_HILITE 128 + +/* Also defined in dbt.h */ +#define BSM_ALLCOMPONENTS 0 +#define BSM_APPLICATIONS 8 +#define BSM_ALLDESKTOPS 16 +#define BSM_INSTALLABLEDRIVERS 4 +#define BSM_NETDRIVER 2 +#define BSM_VXDS 1 +#define BSF_FLUSHDISK 0x00000004 +#define BSF_FORCEIFHUNG 0x00000020 +#define BSF_IGNORECURRENTTASK 0x00000002 +#define BSF_NOHANG 0x00000008 +#define BSF_NOTIMEOUTIFNOTHUNG 0x00000040 +#define BSF_POSTMESSAGE 0x00000010 +#define BSF_QUERY 0x00000001 +#if (_WIN32_WINNT >= 0x0500) +#define BSF_ALLOWSFW 0x00000080 +#define BSF_SENDNOTIFYMESSAGE 0x00000100 +#endif /* (_WIN32_WINNT >= 0x0500) */ +#if (_WIN32_WINNT >= 0x0501) +#define BSF_LUID 0x00000400 +#define BSF_RETURNHDESK 0x00000200 +#endif /* (_WIN32_WINNT >= 0x0501) */ + +#define BROADCAST_QUERY_DENY 1112363332 +#define ENUM_CURRENT_SETTINGS ((DWORD)-1) +#define ENUM_REGISTRY_SETTINGS ((DWORD)-2) +#define DM_BITSPERPEL 0x40000 +#define DM_PELSWIDTH 0x80000 +#define DM_PELSHEIGHT 0x100000 +#define DM_DISPLAYFLAGS 0x200000 +#define DM_DISPLAYFREQUENCY 0x400000 +#define CDS_UPDATEREGISTRY 1 +#define CDS_TEST 2 +#define CDS_FULLSCREEN 4 +#define CDS_GLOBAL 8 +#define CDS_SET_PRIMARY 16 +#define CDS_RESET 0x40000000 +#define CDS_SETRECT 0x20000000 +#define CDS_NORESET 0x10000000 +#define DISP_CHANGE_SUCCESSFUL 0 +#define DISP_CHANGE_RESTART 1 +#define DISP_CHANGE_BADFLAGS (-4) +#define DISP_CHANGE_BADPARAM (-5) +#define DISP_CHANGE_FAILED (-1) +#define DISP_CHANGE_BADMODE (-2) +#define DISP_CHANGE_NOTUPDATED (-3) +#define BST_CHECKED 1 +#define BST_INDETERMINATE 2 +#define BST_UNCHECKED 0 +#define BST_FOCUS 8 +#define BST_PUSHED 4 +#define MF_BYCOMMAND 0 +#define MF_BYPOSITION 1024 +#define MF_UNCHECKED 0 +#define MF_HILITE 128 +#define MF_UNHILITE 0 +#define CWP_ALL 0 +#define CWP_SKIPINVISIBLE 1 +#define CWP_SKIPDISABLED 2 +#define CWP_SKIPTRANSPARENT 4 +#define IMAGE_BITMAP 0 +#define IMAGE_ICON 1 +#define IMAGE_CURSOR 2 +#define IMAGE_ENHMETAFILE 3 +#define DF_ALLOWOTHERACCOUNTHOOK 1 +#define DESKTOP_CREATEMENU 4 +#define DESKTOP_CREATEWINDOW 2 +#define DESKTOP_ENUMERATE 64 +#define DESKTOP_HOOKCONTROL 8 +#define DESKTOP_JOURNALPLAYBACK 32 +#define DESKTOP_JOURNALRECORD 16 +#define DESKTOP_READOBJECTS 1 +#define DESKTOP_SWITCHDESKTOP 256 +#define DESKTOP_WRITEOBJECTS 128 +#define CW_USEDEFAULT 0x80000000 +#define WS_BORDER 0x800000 +#define WS_CAPTION 0xc00000 +#define WS_CHILD 0x40000000 +#define WS_CHILDWINDOW 0x40000000 +#define WS_CLIPCHILDREN 0x2000000 +#define WS_CLIPSIBLINGS 0x4000000 +#define WS_DISABLED 0x8000000 +#define WS_DLGFRAME 0x400000 +#define WS_GROUP 0x20000 +#define WS_HSCROLL 0x100000 +#define WS_ICONIC 0x20000000 +#define WS_MAXIMIZE 0x1000000 +#define WS_MAXIMIZEBOX 0x10000 +#define WS_MINIMIZE 0x20000000 +#define WS_MINIMIZEBOX 0x20000 +#define WS_OVERLAPPED 0 +#define WS_OVERLAPPEDWINDOW 0xcf0000 +#define WS_POPUP 0x80000000 +#define WS_POPUPWINDOW 0x80880000 +#define WS_SIZEBOX 0x40000 +#define WS_SYSMENU 0x80000 +#define WS_TABSTOP 0x10000 +#define WS_THICKFRAME 0x40000 +#define WS_TILED 0 +#define WS_TILEDWINDOW 0xcf0000 +#define WS_VISIBLE 0x10000000 +#define WS_VSCROLL 0x200000 +#define MDIS_ALLCHILDSTYLES 1 +#define BS_3STATE 5 +#define BS_AUTO3STATE 6 +#define BS_AUTOCHECKBOX 3 +#define BS_AUTORADIOBUTTON 9 +#define BS_BITMAP 128 +#define BS_BOTTOM 0x800 +#define BS_CENTER 0x300 +#define BS_CHECKBOX 2 +#define BS_DEFPUSHBUTTON 1 +#define BS_GROUPBOX 7 +#define BS_ICON 64 +#define BS_LEFT 256 +#define BS_LEFTTEXT 32 +#define BS_MULTILINE 0x2000 +#define BS_NOTIFY 0x4000 +#define BS_OWNERDRAW 0xb +#define BS_PUSHBUTTON 0 +#define BS_PUSHLIKE 4096 +#define BS_RADIOBUTTON 4 +#define BS_RIGHT 512 +#define BS_RIGHTBUTTON 32 +#define BS_TEXT 0 +#define BS_TOP 0x400 +#define BS_USERBUTTON 8 +#define BS_VCENTER 0xc00 +#define BS_FLAT 0x8000 +#define CBS_AUTOHSCROLL 64 +#define CBS_DISABLENOSCROLL 0x800 +#define CBS_DROPDOWN 2 +#define CBS_DROPDOWNLIST 3 +#define CBS_HASSTRINGS 512 +#define CBS_LOWERCASE 0x4000 +#define CBS_NOINTEGRALHEIGHT 0x400 +#define CBS_OEMCONVERT 128 +#define CBS_OWNERDRAWFIXED 16 +#define CBS_OWNERDRAWVARIABLE 32 +#define CBS_SIMPLE 1 +#define CBS_SORT 256 +#define CBS_UPPERCASE 0x2000 +#define ES_AUTOHSCROLL 128 +#define ES_AUTOVSCROLL 64 +#define ES_CENTER 1 +#define ES_LEFT 0 +#define ES_LOWERCASE 16 +#define ES_MULTILINE 4 +#define ES_NOHIDESEL 256 +#define ES_NUMBER 0x2000 +#define ES_OEMCONVERT 0x400 +#define ES_PASSWORD 32 +#define ES_READONLY 0x800 +#define ES_RIGHT 2 +#define ES_UPPERCASE 8 +#define ES_WANTRETURN 4096 +#define LBS_DISABLENOSCROLL 4096 +#define LBS_EXTENDEDSEL 0x800 +#define LBS_HASSTRINGS 64 +#define LBS_MULTICOLUMN 512 +#define LBS_MULTIPLESEL 8 +#define LBS_NODATA 0x2000 +#define LBS_NOINTEGRALHEIGHT 256 +#define LBS_NOREDRAW 4 +#define LBS_NOSEL 0x4000 +#define LBS_NOTIFY 1 +#define LBS_OWNERDRAWFIXED 16 +#define LBS_OWNERDRAWVARIABLE 32 +#define LBS_SORT 2 +#define LBS_STANDARD 0xa00003 +#define LBS_USETABSTOPS 128 +#define LBS_WANTKEYBOARDINPUT 0x400 +#define SBS_BOTTOMALIGN 4 +#define SBS_HORZ 0 +#define SBS_LEFTALIGN 2 +#define SBS_RIGHTALIGN 4 +#define SBS_SIZEBOX 8 +#define SBS_SIZEBOXBOTTOMRIGHTALIGN 4 +#define SBS_SIZEBOXTOPLEFTALIGN 2 +#define SBS_SIZEGRIP 16 +#define SBS_TOPALIGN 2 +#define SBS_VERT 1 +#define SS_BITMAP 14 +#define SS_BLACKFRAME 7 +#define SS_BLACKRECT 4 +#define SS_CENTER 1 +#define SS_CENTERIMAGE 512 +#define SS_ENHMETAFILE 15 +#define SS_ETCHEDFRAME 18 +#define SS_ETCHEDHORZ 16 +#define SS_ETCHEDVERT 17 +#define SS_GRAYFRAME 8 +#define SS_GRAYRECT 5 +#define SS_ICON 3 +#define SS_LEFT 0 +#define SS_LEFTNOWORDWRAP 0xc +#define SS_NOPREFIX 128 +#define SS_NOTIFY 256 +#define SS_OWNERDRAW 0xd +#define SS_REALSIZEIMAGE 0x800 +#define SS_RIGHT 2 +#define SS_RIGHTJUST 0x400 +#define SS_SIMPLE 11 +#define SS_SUNKEN 4096 +#define SS_WHITEFRAME 9 +#define SS_WHITERECT 6 +#define SS_USERITEM 10 +#define SS_TYPEMASK 0x0000001FL +#define SS_ENDELLIPSIS 0x00004000L +#define SS_PATHELLIPSIS 0x00008000L +#define SS_WORDELLIPSIS 0x0000C000L +#define SS_ELLIPSISMASK 0x0000C000L +#define DS_3DLOOK 4 +#define DS_ABSALIGN 1 +#define DS_CENTER 0x800 +#define DS_CENTERMOUSE 4096 +#define DS_CONTEXTHELP 0x2000 +#define DS_CONTROL 0x400 +#define DS_FIXEDSYS 8 +#define DS_LOCALEDIT 32 +#define DS_MODALFRAME 128 +#define DS_NOFAILCREATE 16 +#define DS_NOIDLEMSG 256 +#define DS_SETFONT 64 +#define DS_SETFOREGROUND 512 +#define DS_SYSMODAL 2 +#define DS_SHELLFONT (DS_SETFONT | DS_FIXEDSYS) +#define WS_EX_ACCEPTFILES 16 +#define WS_EX_APPWINDOW 0x40000 +#define WS_EX_CLIENTEDGE 512 +#define WS_EX_COMPOSITED 0x2000000 /* XP */ +#define WS_EX_CONTEXTHELP 0x400 +#define WS_EX_CONTROLPARENT 0x10000 +#define WS_EX_DLGMODALFRAME 1 +#define WS_EX_LAYERED 0x80000 /* w2k */ +#define WS_EX_LAYOUTRTL 0x400000 /* w98, w2k */ +#define WS_EX_LEFT 0 +#define WS_EX_LEFTSCROLLBAR 0x4000 +#define WS_EX_LTRREADING 0 +#define WS_EX_MDICHILD 64 +#define WS_EX_NOACTIVATE 0x8000000 /* w2k */ +#define WS_EX_NOINHERITLAYOUT 0x100000 /* w2k */ +#define WS_EX_NOPARENTNOTIFY 4 +#define WS_EX_OVERLAPPEDWINDOW 0x300 +#define WS_EX_PALETTEWINDOW 0x188 +#define WS_EX_RIGHT 0x1000 +#define WS_EX_RIGHTSCROLLBAR 0 +#define WS_EX_RTLREADING 0x2000 +#define WS_EX_STATICEDGE 0x20000 +#define WS_EX_TOOLWINDOW 128 +#define WS_EX_TOPMOST 8 +#define WS_EX_TRANSPARENT 32 +#define WS_EX_WINDOWEDGE 256 +#define WINSTA_ACCESSCLIPBOARD 4 +#define WINSTA_ACCESSGLOBALATOMS 32 +#define WINSTA_CREATEDESKTOP 8 +#define WINSTA_ENUMDESKTOPS 1 +#define WINSTA_ENUMERATE 256 +#define WINSTA_EXITWINDOWS 64 +#define WINSTA_READATTRIBUTES 2 +#define WINSTA_READSCREEN 512 +#define WINSTA_WRITEATTRIBUTES 16 +#define DDL_READWRITE 0 +#define DDL_READONLY 1 +#define DDL_HIDDEN 2 +#define DDL_SYSTEM 4 +#define DDL_DIRECTORY 16 +#define DDL_ARCHIVE 32 +#define DDL_POSTMSGS 8192 +#define DDL_DRIVES 16384 +#define DDL_EXCLUSIVE 32768 +#define DC_ACTIVE 0x00000001 +#define DC_SMALLCAP 0x00000002 +#define DC_ICON 0x00000004 +#define DC_TEXT 0x00000008 +#define DC_INBUTTON 0x00000010 +#if (_WIN32_WINDOWS >= 0x0410 || _WIN32_WINNT >= 0x0500) +#define DC_GRADIENT 0x00000020 +#endif +#if (_WIN32_WINNT >= 0x0501) +#define DC_BUTTONS 0x00001000 +#endif +/* Where are these documented? */ +#define DC_CAPTION (DC_ICON|DC_TEXT|DC_BUTTONS) +#define DC_NC (DC_CAPTION|DC_FRAME) + +#define BDR_RAISEDOUTER 1 +#define BDR_SUNKENOUTER 2 +#define BDR_RAISEDINNER 4 +#define BDR_SUNKENINNER 8 +#define BDR_OUTER 3 +#define BDR_INNER 0xc +#define BDR_RAISED 5 +#define BDR_SUNKEN 10 +#define EDGE_RAISED (BDR_RAISEDOUTER|BDR_RAISEDINNER) +#define EDGE_SUNKEN (BDR_SUNKENOUTER|BDR_SUNKENINNER) +#define EDGE_ETCHED (BDR_SUNKENOUTER|BDR_RAISEDINNER) +#define EDGE_BUMP (BDR_RAISEDOUTER|BDR_SUNKENINNER) +#define BF_LEFT 1 +#define BF_TOP 2 +#define BF_RIGHT 4 +#define BF_BOTTOM 8 +#define BF_TOPLEFT (BF_TOP|BF_LEFT) +#define BF_TOPRIGHT (BF_TOP|BF_RIGHT) +#define BF_BOTTOMLEFT (BF_BOTTOM|BF_LEFT) +#define BF_BOTTOMRIGHT (BF_BOTTOM|BF_RIGHT) +#define BF_RECT (BF_LEFT|BF_TOP|BF_RIGHT|BF_BOTTOM) +#define BF_DIAGONAL 16 +#define BF_DIAGONAL_ENDTOPRIGHT (BF_DIAGONAL|BF_TOP|BF_RIGHT) +#define BF_DIAGONAL_ENDTOPLEFT (BF_DIAGONAL|BF_TOP|BF_LEFT) +#define BF_DIAGONAL_ENDBOTTOMLEFT (BF_DIAGONAL|BF_BOTTOM|BF_LEFT) +#define BF_DIAGONAL_ENDBOTTOMRIGHT (BF_DIAGONAL|BF_BOTTOM|BF_RIGHT) +#define BF_MIDDLE 0x800 +#define BF_SOFT 0x1000 +#define BF_ADJUST 0x2000 +#define BF_FLAT 0x4000 +#define BF_MONO 0x8000 +#define DFC_CAPTION 1 +#define DFC_MENU 2 +#define DFC_SCROLL 3 +#define DFC_BUTTON 4 +#if (WINVER >= 0x0500) +#define DFC_POPUPMENU 5 +#endif /* WINVER >= 0x0500 */ +#define DFCS_CAPTIONCLOSE 0 +#define DFCS_CAPTIONMIN 1 +#define DFCS_CAPTIONMAX 2 +#define DFCS_CAPTIONRESTORE 3 +#define DFCS_CAPTIONHELP 4 +#define DFCS_MENUARROW 0 +#define DFCS_MENUCHECK 1 +#define DFCS_MENUBULLET 2 +#define DFCS_MENUARROWRIGHT 4 +#define DFCS_SCROLLUP 0 +#define DFCS_SCROLLDOWN 1 +#define DFCS_SCROLLLEFT 2 +#define DFCS_SCROLLRIGHT 3 +#define DFCS_SCROLLCOMBOBOX 5 +#define DFCS_SCROLLSIZEGRIP 8 +#define DFCS_SCROLLSIZEGRIPRIGHT 16 +#define DFCS_BUTTONCHECK 0 +#define DFCS_BUTTONRADIOIMAGE 1 +#define DFCS_BUTTONRADIOMASK 2 +#define DFCS_BUTTONRADIO 4 +#define DFCS_BUTTON3STATE 8 +#define DFCS_BUTTONPUSH 16 +#define DFCS_INACTIVE 256 +#define DFCS_PUSHED 512 +#define DFCS_CHECKED 1024 +#if (WINVER >= 0x0500) +#define DFCS_TRANSPARENT 0x800 +#define DFCS_HOT 0x1000 +#endif +#define DFCS_ADJUSTRECT 0x2000 +#define DFCS_FLAT 0x4000 +#define DFCS_MONO 0x8000 +#define DST_COMPLEX 0 +#define DST_TEXT 1 +#define DST_PREFIXTEXT 2 +#define DST_ICON 3 +#define DST_BITMAP 4 +#define DSS_NORMAL 0 +#define DSS_UNION 16 +#define DSS_DISABLED 32 +#define DSS_MONO 128 +#define DSS_RIGHT 0x8000 +#define DT_BOTTOM 8 +#define DT_CALCRECT 1024 +#define DT_CENTER 1 +#define DT_EDITCONTROL 8192 +#define DT_END_ELLIPSIS 32768 +#define DT_PATH_ELLIPSIS 16384 +#define DT_WORD_ELLIPSIS 0x40000 +#define DT_EXPANDTABS 64 +#define DT_EXTERNALLEADING 512 +#define DT_LEFT 0 +#define DT_MODIFYSTRING 65536 +#define DT_NOCLIP 256 +#define DT_NOPREFIX 2048 +#define DT_RIGHT 2 +#define DT_RTLREADING 131072 +#define DT_SINGLELINE 32 +#define DT_TABSTOP 128 +#define DT_TOP 0 +#define DT_VCENTER 4 +#define DT_WORDBREAK 16 +#define DT_INTERNAL 4096 +#define WB_ISDELIMITER 2 +#define WB_LEFT 0 +#define WB_RIGHT 1 +#define SB_HORZ 0 +#define SB_VERT 1 +#define SB_CTL 2 +#define SB_BOTH 3 +#define ESB_DISABLE_BOTH 3 +#define ESB_DISABLE_DOWN 2 +#define ESB_DISABLE_LEFT 1 +#define ESB_DISABLE_LTUP 1 +#define ESB_DISABLE_RIGHT 2 +#define ESB_DISABLE_RTDN 2 +#define ESB_DISABLE_UP 1 +#define ESB_ENABLE_BOTH 0 +#define SB_LINEUP 0 +#define SB_LINEDOWN 1 +#define SB_LINELEFT 0 +#define SB_LINERIGHT 1 +#define SB_PAGEUP 2 +#define SB_PAGEDOWN 3 +#define SB_PAGELEFT 2 +#define SB_PAGERIGHT 3 +#define SB_THUMBPOSITION 4 +#define SB_THUMBTRACK 5 +#define SB_ENDSCROLL 8 +#define SB_LEFT 6 +#define SB_RIGHT 7 +#define SB_BOTTOM 7 +#define SB_TOP 6 +#define MAKEINTRESOURCEA(i) (LPSTR)((DWORD)((WORD)(i))) +#define MAKEINTRESOURCEW(i) (LPWSTR)((DWORD)((WORD)(i))) +#ifndef XFree86Server +# define RT_CURSOR MAKEINTRESOURCE(1) +# define RT_FONT MAKEINTRESOURCE(8) +#endif /* ndef XFree86Server */ +#define RT_BITMAP MAKEINTRESOURCE(2) +#define RT_ICON MAKEINTRESOURCE(3) +#define RT_MENU MAKEINTRESOURCE(4) +#define RT_DIALOG MAKEINTRESOURCE(5) +#define RT_STRING MAKEINTRESOURCE(6) +#define RT_FONTDIR MAKEINTRESOURCE(7) +#define RT_ACCELERATOR MAKEINTRESOURCE(9) +#define RT_RCDATA MAKEINTRESOURCE(10) +#define RT_MESSAGETABLE MAKEINTRESOURCE(11) +#define DIFFERENCE 11 +#define RT_GROUP_CURSOR MAKEINTRESOURCE((DWORD)RT_CURSOR+DIFFERENCE) +#define RT_GROUP_ICON MAKEINTRESOURCE((DWORD)RT_ICON+DIFFERENCE) +#define RT_VERSION MAKEINTRESOURCE(16) +#define RT_DLGINCLUDE MAKEINTRESOURCE(17) +#define RT_PLUGPLAY MAKEINTRESOURCE(19) +#define RT_VXD MAKEINTRESOURCE(20) +#define RT_ANICURSOR MAKEINTRESOURCE(21) +#define RT_ANIICON MAKEINTRESOURCE(22) +#define RT_HTML MAKEINTRESOURCE(23) +#ifndef RC_INVOKED +#define RT_MANIFEST MAKEINTRESOURCE(24) +#define CREATEPROCESS_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(1) +#define ISOLATIONAWARE_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(2) +#define ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(3) +#else +#define RT_MANIFEST 24 +#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1 +#define ISOLATIONAWARE_MANIFEST_RESOURCE_ID 2 +#define ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID 3 +#endif +#define EWX_FORCE 4 +#define EWX_LOGOFF 0 +#define EWX_POWEROFF 8 +#define EWX_REBOOT 2 +#define EWX_SHUTDOWN 1 +#if (_WIN32_WINNT >= 0x0500) +#define EWX_FORCEIFHUNG 16 +#endif +#define CS_BYTEALIGNCLIENT 4096 +#define CS_BYTEALIGNWINDOW 8192 +#define CS_KEYCVTWINDOW 4 +#define CS_NOKEYCVT 256 +#define CS_CLASSDC 64 +#define CS_DBLCLKS 8 +#define CS_GLOBALCLASS 16384 +#define CS_HREDRAW 2 +#define CS_NOCLOSE 512 +#define CS_OWNDC 32 +#define CS_PARENTDC 128 +#define CS_SAVEBITS 2048 +#define CS_VREDRAW 1 +#define CS_IME 0x10000 +#define GCW_ATOM (-32) +#define GCL_CBCLSEXTRA (-20) +#define GCL_CBWNDEXTRA (-18) +#define GCL_HBRBACKGROUND (-10) +#define GCL_HCURSOR (-12) +#define GCL_HICON (-14) +#define GCL_HICONSM (-34) +#define GCL_HMODULE (-16) +#define GCL_MENUNAME (-8) +#define GCL_STYLE (-26) +#define GCL_WNDPROC (-24) +#if 0 + /* This is supposed to be defined by the program using it not defined + in the w32api headers. I've left it here for documentation purposes. + */ +#ifndef IDC_STATIC /* May be predefined by resource compiler. */ +#define IDC_STATIC (-1) +#endif +#endif +#define IDC_ARROW MAKEINTRESOURCE(32512) +#define IDC_IBEAM MAKEINTRESOURCE(32513) +#define IDC_WAIT MAKEINTRESOURCE(32514) +#define IDC_CROSS MAKEINTRESOURCE(32515) +#define IDC_UPARROW MAKEINTRESOURCE(32516) +#define IDC_SIZENWSE MAKEINTRESOURCE(32642) +#define IDC_SIZENESW MAKEINTRESOURCE(32643) +#define IDC_SIZEWE MAKEINTRESOURCE(32644) +#define IDC_SIZENS MAKEINTRESOURCE(32645) +#define IDC_SIZEALL MAKEINTRESOURCE(32646) +#define IDC_NO MAKEINTRESOURCE(32648) +#define IDC_HAND MAKEINTRESOURCE(32649) +#define IDC_APPSTARTING MAKEINTRESOURCE(32650) +#define IDC_HELP MAKEINTRESOURCE(32651) +#define IDC_ICON MAKEINTRESOURCE(32641) +#define IDC_SIZE MAKEINTRESOURCE(32640) +#ifndef RC_INVOKED +#define IDI_APPLICATION MAKEINTRESOURCE(32512) +#define IDI_HAND MAKEINTRESOURCE(32513) +#define IDI_QUESTION MAKEINTRESOURCE(32514) +#define IDI_EXCLAMATION MAKEINTRESOURCE(32515) +#define IDI_ASTERISK MAKEINTRESOURCE(32516) +#define IDI_WINLOGO MAKEINTRESOURCE(32517) +#else +#define IDI_APPLICATION 32512 +#define IDI_HAND 32513 +#define IDI_QUESTION 32514 +#define IDI_EXCLAMATION 32515 +#define IDI_ASTERISK 32516 +#define IDI_WINLOGO 32517 +#endif +#define IDI_WARNING IDI_EXCLAMATION +#define IDI_ERROR IDI_HAND +#define IDI_INFORMATION IDI_ASTERISK +#define MIIM_STATE 1 +#define MIIM_ID 2 +#define MIIM_SUBMENU 4 +#define MIIM_CHECKMARKS 8 +#define MIIM_TYPE 16 +#define MIIM_DATA 32 +#define MIIM_STRING 64 +#define MIIM_BITMAP 128 +#define MIIM_FTYPE 256 +#if (WINVER >= 0x0500) +#define MIM_MAXHEIGHT 1 +#define MIM_BACKGROUND 2 +#define MIM_HELPID 4 +#define MIM_MENUDATA 8 +#define MIM_STYLE 16 +#define MIM_APPLYTOSUBMENUS 0x80000000L +#endif +#define MFT_BITMAP 4 +#define MFT_MENUBARBREAK 32 +#define MFT_MENUBREAK 64 +#define MFT_OWNERDRAW 256 +#define MFT_RADIOCHECK 512 +#define MFT_RIGHTJUSTIFY 0x4000 +#define MFT_SEPARATOR 0x800 +#define MFT_RIGHTORDER 0x2000L +#define MFT_STRING 0 +#define MFS_CHECKED 8 +#define MFS_DEFAULT 4096 +#define MFS_DISABLED 3 +#define MFS_ENABLED 0 +#define MFS_GRAYED 3 +#define MFS_HILITE 128 +#define MFS_UNCHECKED 0 +#define MFS_UNHILITE 0 +#define GW_HWNDNEXT 2 +#define GW_HWNDPREV 3 +#define GW_CHILD 5 +#define GW_HWNDFIRST 0 +#define GW_HWNDLAST 1 +#define GW_OWNER 4 +#define SW_HIDE 0 +#define SW_NORMAL 1 +#define SW_SHOWNORMAL 1 +#define SW_SHOWMINIMIZED 2 +#define SW_MAXIMIZE 3 +#define SW_SHOWMAXIMIZED 3 +#define SW_SHOWNOACTIVATE 4 +#define SW_SHOW 5 +#define SW_MINIMIZE 6 +#define SW_SHOWMINNOACTIVE 7 +#define SW_SHOWNA 8 +#define SW_RESTORE 9 +#define SW_SHOWDEFAULT 10 +#define SW_FORCEMINIMIZE 11 +#define SW_MAX 11 +#define MB_USERICON 128 +#define MB_ICONASTERISK 64 +#define MB_ICONEXCLAMATION 0x30 +#define MB_ICONWARNING 0x30 +#define MB_ICONERROR 16 +#define MB_ICONHAND 16 +#define MB_ICONQUESTION 32 +#define MB_OK 0 +#define MB_ABORTRETRYIGNORE 2 +#define MB_APPLMODAL 0 +#define MB_DEFAULT_DESKTOP_ONLY 0x20000 +#define MB_HELP 0x4000 +#define MB_RIGHT 0x80000 +#define MB_RTLREADING 0x100000 +#define MB_TOPMOST 0x40000 +#define MB_DEFBUTTON1 0 +#define MB_DEFBUTTON2 256 +#define MB_DEFBUTTON3 512 +#define MB_DEFBUTTON4 0x300 +#define MB_ICONINFORMATION 64 +#define MB_ICONSTOP 16 +#define MB_OKCANCEL 1 +#define MB_RETRYCANCEL 5 +#ifdef _WIN32_WINNT +#if (_WIN32_WINNT >= 0x0400) +#define MB_SERVICE_NOTIFICATION 0x00200000 +#else +#define MB_SERVICE_NOTIFICATION 0x00040000 +#endif +#define MB_SERVICE_NOTIFICATION_NT3X 0x00040000 +#endif +#define MB_SETFOREGROUND 0x10000 +#define MB_SYSTEMMODAL 4096 +#define MB_TASKMODAL 0x2000 +#define MB_YESNO 4 +#define MB_YESNOCANCEL 3 +#define MB_ICONMASK 240 +#define MB_DEFMASK 3840 +#define MB_MODEMASK 0x00003000 +#define MB_MISCMASK 0x0000C000 +#define MB_NOFOCUS 0x00008000 +#define MB_TYPEMASK 15 +#define MB_TOPMOST 0x40000 + +#define IDOK 1 +#define IDCANCEL 2 +#define IDABORT 3 +#define IDRETRY 4 +#define IDIGNORE 5 +#define IDYES 6 +#define IDNO 7 +#if (WINVER >= 0x0400) +#define IDCLOSE 8 +#define IDHELP 9 +#endif +#if (WINVER >= 0x0500) +#define IDTRYAGAIN 10 +#define IDCONTINUE 11 +#endif + +#define GWL_EXSTYLE (-20) +#define GWL_STYLE (-16) +#define GWL_WNDPROC (-4) +#define GWLP_WNDPROC (-4) +#define GWL_HINSTANCE (-6) +#define GWLP_HINSTANCE (-6) +#define GWL_HWNDPARENT (-8) +#define GWLP_HWNDPARENT (-8) +#define GWL_ID (-12) +#define GWLP_ID (-12) +#define GWL_USERDATA (-21) +#define GWLP_USERDATA (-21) +#define DWL_DLGPROC 4 +#define DWLP_DLGPROC 4 +#define DWL_MSGRESULT 0 +#define DWLP_MSGRESULT 0 +#define DWL_USER 8 +#define DWLP_USER 8 +#if (_WIN32_WINNT >= 0x0501) +#define QS_ALLEVENTS 1215 +#define QS_ALLINPUT 1279 +#else +#define QS_ALLEVENTS 191 +#define QS_ALLINPUT 255 +#endif +#define QS_ALLPOSTMESSAGE 256 +#define QS_HOTKEY 128 +#if (_WIN32_WINNT >= 0x0501) +#define QS_INPUT 1031 +#else +#define QS_INPUT 7 +#endif +#define QS_KEY 1 +#define QS_MOUSE 6 +#define QS_MOUSEBUTTON 4 +#define QS_MOUSEMOVE 2 +#define QS_PAINT 32 +#define QS_POSTMESSAGE 8 +#if (_WIN32_WINNT >= 0x0501) +#define QS_RAWINPUT 1024 +#endif +#define QS_SENDMESSAGE 64 +#define QS_TIMER 16 +#define MWMO_WAITALL 1 +#define MWMO_ALERTABLE 2 +#define MWMO_INPUTAVAILABLE 4 +#define COLOR_3DDKSHADOW 21 +#define COLOR_3DFACE 15 +#define COLOR_3DHILIGHT 20 +#define COLOR_3DHIGHLIGHT 20 +#define COLOR_3DLIGHT 22 +#define COLOR_BTNHILIGHT 20 +#define COLOR_3DSHADOW 16 +#define COLOR_ACTIVEBORDER 10 +#define COLOR_ACTIVECAPTION 2 +#define COLOR_APPWORKSPACE 12 +#define COLOR_BACKGROUND 1 +#define COLOR_DESKTOP 1 +#define COLOR_BTNFACE 15 +#define COLOR_BTNHIGHLIGHT 20 +#define COLOR_BTNSHADOW 16 +#define COLOR_BTNTEXT 18 +#define COLOR_CAPTIONTEXT 9 +#define COLOR_GRAYTEXT 17 +#define COLOR_HIGHLIGHT 13 +#define COLOR_HIGHLIGHTTEXT 14 +#define COLOR_INACTIVEBORDER 11 +#define COLOR_INACTIVECAPTION 3 +#define COLOR_INACTIVECAPTIONTEXT 19 +#define COLOR_INFOBK 24 +#define COLOR_INFOTEXT 23 +#define COLOR_MENU 4 +#define COLOR_MENUTEXT 7 +#define COLOR_SCROLLBAR 0 +#define COLOR_WINDOW 5 +#define COLOR_WINDOWFRAME 6 +#define COLOR_WINDOWTEXT 8 +#define CTLCOLOR_MSGBOX 0 +#define CTLCOLOR_EDIT 1 +#define CTLCOLOR_LISTBOX 2 +#define CTLCOLOR_BTN 3 +#define CTLCOLOR_DLG 4 +#define CTLCOLOR_SCROLLBAR 5 +#define CTLCOLOR_STATIC 6 +#define CTLCOLOR_MAX 7 +#define SM_CXSCREEN 0 +#define SM_CYSCREEN 1 +#define SM_CXVSCROLL 2 +#define SM_CYHSCROLL 3 +#define SM_CYCAPTION 4 +#define SM_CXBORDER 5 +#define SM_CYBORDER 6 +#define SM_CXDLGFRAME 7 +#define SM_CXFIXEDFRAME 7 +#define SM_CYDLGFRAME 8 +#define SM_CYFIXEDFRAME 8 +#define SM_CYVTHUMB 9 +#define SM_CXHTHUMB 10 +#define SM_CXICON 11 +#define SM_CYICON 12 +#define SM_CXCURSOR 13 +#define SM_CYCURSOR 14 +#define SM_CYMENU 15 +#define SM_CXFULLSCREEN 16 +#define SM_CYFULLSCREEN 17 +#define SM_CYKANJIWINDOW 18 +#define SM_MOUSEPRESENT 19 +#define SM_CYVSCROLL 20 +#define SM_CXHSCROLL 21 +#define SM_DEBUG 22 +#define SM_SWAPBUTTON 23 +#define SM_RESERVED1 24 +#define SM_RESERVED2 25 +#define SM_RESERVED3 26 +#define SM_RESERVED4 27 +#define SM_CXMIN 28 +#define SM_CYMIN 29 +#define SM_CXSIZE 30 +#define SM_CYSIZE 31 +#define SM_CXSIZEFRAME 32 +#define SM_CXFRAME 32 +#define SM_CYSIZEFRAME 33 +#define SM_CYFRAME 33 +#define SM_CXMINTRACK 34 +#define SM_CYMINTRACK 35 +#define SM_CXDOUBLECLK 36 +#define SM_CYDOUBLECLK 37 +#define SM_CXICONSPACING 38 +#define SM_CYICONSPACING 39 +#define SM_MENUDROPALIGNMENT 40 +#define SM_PENWINDOWS 41 +#define SM_DBCSENABLED 42 +#define SM_CMOUSEBUTTONS 43 +#define SM_SECURE 44 +#define SM_CXEDGE 45 +#define SM_CYEDGE 46 +#define SM_CXMINSPACING 47 +#define SM_CYMINSPACING 48 +#define SM_CXSMICON 49 +#define SM_CYSMICON 50 +#define SM_CYSMCAPTION 51 +#define SM_CXSMSIZE 52 +#define SM_CYSMSIZE 53 +#define SM_CXMENUSIZE 54 +#define SM_CYMENUSIZE 55 +#define SM_ARRANGE 56 +#define SM_CXMINIMIZED 57 +#define SM_CYMINIMIZED 58 +#define SM_CXMAXTRACK 59 +#define SM_CYMAXTRACK 60 +#define SM_CXMAXIMIZED 61 +#define SM_CYMAXIMIZED 62 +#define SM_NETWORK 63 +#define LR_DEFAULTSIZE 64 +#define SM_CLEANBOOT 67 +#define SM_CXDRAG 68 +#define SM_CYDRAG 69 +#define SM_SHOWSOUNDS 70 +#define SM_CXMENUCHECK 71 +#define SM_CYMENUCHECK 72 +#define SM_SLOWMACHINE 73 +#define SM_MIDEASTENABLED 74 +#define SM_MOUSEWHEELPRESENT 75 +#define SM_XVIRTUALSCREEN 76 +#define SM_YVIRTUALSCREEN 77 +#define SM_CXVIRTUALSCREEN 78 +#define SM_CYVIRTUALSCREEN 79 +#define SM_CMONITORS 80 +#define SM_SAMEDISPLAYFORMAT 81 +#if (_WIN32_WINNT < 0x0400) +#define SM_CMETRICS 76 +#else +#define SM_CMETRICS 83 +#endif +#define SM_REMOTESESSION 0X1000 +#define ARW_BOTTOMLEFT 0 +#define ARW_BOTTOMRIGHT 1 +#define ARW_HIDE 8 +#define ARW_TOPLEFT 2 +#define ARW_TOPRIGHT 3 +#define ARW_DOWN 4 +#define ARW_LEFT 0 +#define ARW_RIGHT 0 +#define ARW_UP 4 +#define UOI_FLAGS 1 +#define UOI_NAME 2 +#define UOI_TYPE 3 +#define UOI_USER_SID 4 +#define LR_DEFAULTCOLOR 0 +#define LR_MONOCHROME 1 +#define LR_COLOR 2 +#define LR_COPYRETURNORG 4 +#define LR_COPYDELETEORG 8 +#define LR_LOADFROMFILE 16 +#define LR_LOADTRANSPARENT 32 +#define LR_LOADREALSIZE 128 +#define LR_LOADMAP3DCOLORS 4096 +#define LR_CREATEDIBSECTION 8192 +#define LR_COPYFROMRESOURCE 0x4000 +#define LR_SHARED 32768 +#define KEYEVENTF_EXTENDEDKEY 0x00000001 +#define KEYEVENTF_KEYUP 00000002 +#if (_WIN32_WINNT >= 0x0500) +#define KEYEVENTF_UNICODE 0x00000004 +#define KEYEVENTF_SCANCODE 0x00000008 +#endif +#define OBM_BTNCORNERS 32758 +#define OBM_BTSIZE 32761 +#define OBM_CHECK 32760 +#define OBM_CHECKBOXES 32759 +#define OBM_CLOSE 32754 +#define OBM_COMBO 32738 +#define OBM_DNARROW 32752 +#define OBM_DNARROWD 32742 +#define OBM_DNARROWI 32736 +#define OBM_LFARROW 32750 +#define OBM_LFARROWI 32734 +#define OBM_LFARROWD 32740 +#define OBM_MNARROW 32739 +#define OBM_OLD_CLOSE 32767 +#define OBM_OLD_DNARROW 32764 +#define OBM_OLD_LFARROW 32762 +#define OBM_OLD_REDUCE 32757 +#define OBM_OLD_RESTORE 32755 +#define OBM_OLD_RGARROW 32763 +#define OBM_OLD_UPARROW 32765 +#define OBM_OLD_ZOOM 32756 +#define OBM_REDUCE 32749 +#define OBM_REDUCED 32746 +#define OBM_RESTORE 32747 +#define OBM_RESTORED 32744 +#define OBM_RGARROW 32751 +#define OBM_RGARROWD 32741 +#define OBM_RGARROWI 32735 +#define OBM_SIZE 32766 +#define OBM_UPARROW 32753 +#define OBM_UPARROWD 32743 +#define OBM_UPARROWI 32737 +#define OBM_ZOOM 32748 +#define OBM_ZOOMD 32745 +#define OCR_NORMAL 32512 +#define OCR_IBEAM 32513 +#define OCR_WAIT 32514 +#define OCR_CROSS 32515 +#define OCR_UP 32516 +#define OCR_SIZE 32640 +#define OCR_ICON 32641 +#define OCR_SIZENWSE 32642 +#define OCR_SIZENESW 32643 +#define OCR_SIZEWE 32644 +#define OCR_SIZENS 32645 +#define OCR_SIZEALL 32646 +#define OCR_NO 32648 +#define OCR_APPSTARTING 32650 +#define OIC_SAMPLE 32512 +#define OIC_HAND 32513 +#define OIC_QUES 32514 +#define OIC_BANG 32515 +#define OIC_NOTE 32516 +#define OIC_WINLOGO 32517 +#define OIC_WARNING OIC_BANG +#define OIC_ERROR OIC_HAND +#define OIC_INFORMATION OIC_NOTE +#define HELPINFO_MENUITEM 2 +#define HELPINFO_WINDOW 1 +#define MSGF_DIALOGBOX 0 +#define MSGF_MESSAGEBOX 1 +#define MSGF_MENU 2 +#define MSGF_MOVE 3 +#define MSGF_SIZE 4 +#define MSGF_SCROLLBAR 5 +#define MSGF_NEXTWINDOW 6 +#define MSGF_MAINLOOP 8 +#define MSGF_USER 4096 +#define MOUSEEVENTF_MOVE 1 +#define MOUSEEVENTF_LEFTDOWN 2 +#define MOUSEEVENTF_LEFTUP 4 +#define MOUSEEVENTF_RIGHTDOWN 8 +#define MOUSEEVENTF_RIGHTUP 16 +#define MOUSEEVENTF_MIDDLEDOWN 32 +#define MOUSEEVENTF_MIDDLEUP 64 +#define MOUSEEVENTF_WHEEL 0x0800 +#define MOUSEEVENTF_ABSOLUTE 32768 +#define PM_NOREMOVE 0 +#define PM_REMOVE 1 +#define PM_NOYIELD 2 +#if (WINVER >= 0x0500) +# define PM_QS_INPUT (QS_INPUT << 16) +# define PM_QS_POSTMESSAGE ((QS_POSTMESSAGE|QS_HOTKEY|QS_TIMER) << 16) +# define PM_QS_PAINT (QS_PAINT << 16) +# define PM_QS_SENDMESSAGE (QS_SENDMESSAGE << 16) +#endif +#define HWND_BROADCAST ((HWND)0xffff) +#define HWND_BOTTOM ((HWND)1) +#define HWND_NOTOPMOST ((HWND)(-2)) +#define HWND_TOP ((HWND)0) +#define HWND_TOPMOST ((HWND)(-1)) +#define HWND_DESKTOP (HWND)0 +#define HWND_MESSAGE ((HWND)(-3)) /* w2k */ +#define RDW_ERASE 4 +#define RDW_FRAME 1024 +#define RDW_INTERNALPAINT 2 +#define RDW_INVALIDATE 1 +#define RDW_NOERASE 32 +#define RDW_NOFRAME 2048 +#define RDW_NOINTERNALPAINT 16 +#define RDW_VALIDATE 8 +#define RDW_ERASENOW 512 +#define RDW_UPDATENOW 256 +#define RDW_ALLCHILDREN 128 +#define RDW_NOCHILDREN 64 +#define SMTO_ABORTIFHUNG 2 +#define SMTO_BLOCK 1 +#define SMTO_NORMAL 0 +#define SIF_ALL 23 +#define SIF_PAGE 2 +#define SIF_POS 4 +#define SIF_RANGE 1 +#define SIF_DISABLENOSCROLL 8 +#define SIF_TRACKPOS 16 +#define SWP_DRAWFRAME 32 +#define SWP_FRAMECHANGED 32 +#define SWP_HIDEWINDOW 128 +#define SWP_NOACTIVATE 16 +#define SWP_NOCOPYBITS 256 +#define SWP_NOMOVE 2 +#define SWP_NOSIZE 1 +#define SWP_NOREDRAW 8 +#define SWP_NOZORDER 4 +#define SWP_SHOWWINDOW 64 +#define SWP_NOOWNERZORDER 512 +#define SWP_NOREPOSITION 512 +#define SWP_NOSENDCHANGING 1024 +#define SWP_DEFERERASE 8192 +#define SWP_ASYNCWINDOWPOS 16384 +#define HSHELL_ACTIVATESHELLWINDOW 3 +#define HSHELL_GETMINRECT 5 +#define HSHELL_LANGUAGE 8 +#define HSHELL_REDRAW 6 +#define HSHELL_TASKMAN 7 +#define HSHELL_WINDOWACTIVATED 4 +#define HSHELL_WINDOWCREATED 1 +#define HSHELL_WINDOWDESTROYED 2 +#define SPI_GETACCESSTIMEOUT 60 +#define SPI_GETACTIVEWINDOWTRACKING 4096 +#define SPI_GETACTIVEWNDTRKTIMEOUT 8194 +#define SPI_GETACTIVEWNDTRKZORDER 4108 +#define SPI_GETANIMATION 72 +#define SPI_GETBEEP 1 +#define SPI_GETBORDER 5 +#define SPI_GETDEFAULTINPUTLANG 89 +#define SPI_GETDRAGFULLWINDOWS 38 +#define SPI_GETFASTTASKSWITCH 35 +#define SPI_GETFILTERKEYS 50 +#define SPI_GETFONTSMOOTHING 74 +#define SPI_GETGRIDGRANULARITY 18 +#define SPI_GETHIGHCONTRAST 66 +#define SPI_GETICONMETRICS 45 +#define SPI_GETICONTITLELOGFONT 31 +#define SPI_GETICONTITLEWRAP 25 +#define SPI_GETKEYBOARDDELAY 22 +#define SPI_GETKEYBOARDPREF 68 +#define SPI_GETKEYBOARDSPEED 10 +#define SPI_GETLOWPOWERACTIVE 83 +#define SPI_GETLOWPOWERTIMEOUT 79 +#define SPI_GETMENUDROPALIGNMENT 27 +#define SPI_GETMINIMIZEDMETRICS 43 +#define SPI_GETMOUSE 3 +#define SPI_GETMOUSEKEYS 54 +#define SPI_GETMOUSETRAILS 94 +#define SPI_GETNONCLIENTMETRICS 41 +#define SPI_GETPOWEROFFACTIVE 84 +#define SPI_GETPOWEROFFTIMEOUT 80 +#define SPI_GETSCREENREADER 70 +#define SPI_GETSCREENSAVEACTIVE 16 +#define SPI_GETSCREENSAVETIMEOUT 14 +#define SPI_GETSERIALKEYS 62 +#define SPI_GETSHOWSOUNDS 56 +#define SPI_GETSOUNDSENTRY 64 +#define SPI_GETSTICKYKEYS 58 +#define SPI_GETTOGGLEKEYS 52 +#define SPI_GETWHEELSCROLLLINES 104 +#define SPI_GETWINDOWSEXTENSION 92 +#define SPI_GETWORKAREA 48 +#define SPI_ICONHORIZONTALSPACING 13 +#define SPI_ICONVERTICALSPACING 24 +#define SPI_LANGDRIVER 12 +#define SPI_SCREENSAVERRUNNING 97 +#define SPI_SETACCESSTIMEOUT 61 +#define SPI_SETACTIVEWINDOWTRACKING 4097 +#define SPI_SETACTIVEWNDTRKTIMEOUT 8195 +#define SPI_SETACTIVEWNDTRKZORDER 4109 +#define SPI_SETANIMATION 73 +#define SPI_SETBEEP 2 +#define SPI_SETBORDER 6 +#define SPI_SETDEFAULTINPUTLANG 90 +#define SPI_SETDESKPATTERN 21 +#define SPI_SETDESKWALLPAPER 20 +#define SPI_SETDOUBLECLICKTIME 32 +#define SPI_SETDOUBLECLKHEIGHT 30 +#define SPI_SETDOUBLECLKWIDTH 29 +#define SPI_SETDRAGFULLWINDOWS 37 +#define SPI_SETDRAGHEIGHT 77 +#define SPI_SETDRAGWIDTH 76 +#define SPI_SETFASTTASKSWITCH 36 +#define SPI_SETFILTERKEYS 51 +#define SPI_SETFONTSMOOTHING 75 +#define SPI_SETGRIDGRANULARITY 19 +#define SPI_SETHANDHELD 78 +#define SPI_SETHIGHCONTRAST 67 +#define SPI_SETICONMETRICS 46 +#define SPI_SETICONTITLELOGFONT 34 +#define SPI_SETICONTITLEWRAP 26 +#define SPI_SETKEYBOARDDELAY 23 +#define SPI_SETKEYBOARDPREF 69 +#define SPI_SETKEYBOARDSPEED 11 +#define SPI_SETLANGTOGGLE 91 +#define SPI_SETLOWPOWERACTIVE 85 +#define SPI_SETLOWPOWERTIMEOUT 81 +#define SPI_SETMENUDROPALIGNMENT 28 +#define SPI_SETMINIMIZEDMETRICS 44 +#define SPI_SETMOUSE 4 +#define SPI_SETMOUSEBUTTONSWAP 33 +#define SPI_SETMOUSEKEYS 55 +#define SPI_SETMOUSETRAILS 93 +#define SPI_SETNONCLIENTMETRICS 42 +#define SPI_SETPENWINDOWS 49 +#define SPI_SETPOWEROFFACTIVE 86 +#define SPI_SETPOWEROFFTIMEOUT 82 +#define SPI_SETSCREENREADER 71 +#define SPI_SETSCREENSAVEACTIVE 17 +#define SPI_SETSCREENSAVERRUNNING 97 +#define SPI_SETSCREENSAVETIMEOUT 15 +#define SPI_SETSERIALKEYS 63 +#define SPI_SETSHOWSOUNDS 57 +#define SPI_SETSOUNDSENTRY 65 +#define SPI_SETSTICKYKEYS 59 +#define SPI_SETTOGGLEKEYS 53 +#define SPI_SETWHEELSCROLLLINES 105 +#define SPI_SETWORKAREA 47 +#define SPIF_UPDATEINIFILE 1 +#define SPIF_SENDWININICHANGE 2 +#define SPIF_SENDCHANGE 2 +#define ATF_ONOFFFEEDBACK 2 +#define ATF_TIMEOUTON 1 +#define WM_APP 32768 +#define WM_ACTIVATE 6 +#define WM_ACTIVATEAPP 28 +/* FIXME/CHECK: Are WM_AFX{FIRST,LAST} valid for WINVER < 0x400? */ +#define WM_AFXFIRST 864 +#define WM_AFXLAST 895 +#define WM_ASKCBFORMATNAME 780 +#define WM_CANCELJOURNAL 75 +#define WM_CANCELMODE 31 +#define WM_CAPTURECHANGED 533 +#define WM_CHANGECBCHAIN 781 +#define WM_CHAR 258 +#define WM_CHARTOITEM 47 +#define WM_CHILDACTIVATE 34 +#define WM_CLEAR 771 +#define WM_CLOSE 16 +#define WM_COMMAND 273 +#define WM_COMMNOTIFY 68 /* obsolete */ +#define WM_COMPACTING 65 +#define WM_COMPAREITEM 57 +#define WM_CONTEXTMENU 123 +#define WM_COPY 769 +#define WM_COPYDATA 74 +#define WM_CREATE 1 +#define WM_CTLCOLORBTN 309 +#define WM_CTLCOLORDLG 310 +#define WM_CTLCOLOREDIT 307 +#define WM_CTLCOLORLISTBOX 308 +#define WM_CTLCOLORMSGBOX 306 +#define WM_CTLCOLORSCROLLBAR 311 +#define WM_CTLCOLORSTATIC 312 +#define WM_CUT 768 +#define WM_DEADCHAR 259 +#define WM_DELETEITEM 45 +#define WM_DESTROY 2 +#define WM_DESTROYCLIPBOARD 775 +#define WM_DEVICECHANGE 537 +#define WM_DEVMODECHANGE 27 +#define WM_DISPLAYCHANGE 126 +#define WM_DRAWCLIPBOARD 776 +#define WM_DRAWITEM 43 +#define WM_DROPFILES 563 +#define WM_ENABLE 10 +#define WM_ENDSESSION 22 +#define WM_ENTERIDLE 289 +#define WM_ENTERMENULOOP 529 +#define WM_ENTERSIZEMOVE 561 +#define WM_ERASEBKGND 20 +#define WM_EXITMENULOOP 530 +#define WM_EXITSIZEMOVE 562 +#define WM_FONTCHANGE 29 +#define WM_GETDLGCODE 135 +#define WM_GETFONT 49 +#define WM_GETHOTKEY 51 +#define WM_GETICON 127 +#define WM_GETMINMAXINFO 36 +#define WM_GETTEXT 13 +#define WM_GETTEXTLENGTH 14 +/* FIXME/CHECK: Are WM_HANDHEL{FIRST,LAST} valid for WINVER < 0x400? */ +#define WM_HANDHELDFIRST 856 +#define WM_HANDHELDLAST 863 +#define WM_HELP 83 +#define WM_HOTKEY 786 +#define WM_HSCROLL 276 +#define WM_HSCROLLCLIPBOARD 782 +#define WM_ICONERASEBKGND 39 +#define WM_INITDIALOG 272 +#define WM_INITMENU 278 +#define WM_INITMENUPOPUP 279 +#define WM_INPUTLANGCHANGE 81 +#define WM_INPUTLANGCHANGEREQUEST 80 +#define WM_KEYDOWN 256 +#define WM_KEYUP 257 +#define WM_KILLFOCUS 8 +#define WM_MDIACTIVATE 546 +#define WM_MDICASCADE 551 +#define WM_MDICREATE 544 +#define WM_MDIDESTROY 545 +#define WM_MDIGETACTIVE 553 +#define WM_MDIICONARRANGE 552 +#define WM_MDIMAXIMIZE 549 +#define WM_MDINEXT 548 +#define WM_MDIREFRESHMENU 564 +#define WM_MDIRESTORE 547 +#define WM_MDISETMENU 560 +#define WM_MDITILE 550 +#define WM_MEASUREITEM 44 +#if (WINVER >= 0x0500) +#define WM_MENURBUTTONUP 290 +#endif +#define WM_MENUCHAR 288 +#define WM_MENUSELECT 287 +#define WM_NEXTMENU 531 +#define WM_MOVE 3 +#define WM_MOVING 534 +#define WM_NCACTIVATE 134 +#define WM_NCCALCSIZE 131 +#define WM_NCCREATE 129 +#define WM_NCDESTROY 130 +#define WM_NCHITTEST 132 +#define WM_NCLBUTTONDBLCLK 163 +#define WM_NCLBUTTONDOWN 161 +#define WM_NCLBUTTONUP 162 +#define WM_NCMBUTTONDBLCLK 169 +#define WM_NCMBUTTONDOWN 167 +#define WM_NCMBUTTONUP 168 +#define WM_NCMOUSEMOVE 160 +#define WM_NCPAINT 133 +#define WM_NCRBUTTONDBLCLK 166 +#define WM_NCRBUTTONDOWN 164 +#define WM_NCRBUTTONUP 165 +#define WM_NEXTDLGCTL 40 +#define WM_NEXTMENU 531 +#define WM_NOTIFY 78 +#define WM_NOTIFYFORMAT 85 +#define WM_NULL 0 +#define WM_PAINT 15 +#define WM_PAINTCLIPBOARD 777 +#define WM_PAINTICON 38 +#define WM_PALETTECHANGED 785 +#define WM_PALETTEISCHANGING 784 +#define WM_PARENTNOTIFY 528 +#define WM_PASTE 770 +#define WM_PENWINFIRST 896 +#define WM_PENWINLAST 911 +#define WM_POWER 72 +#define WM_POWERBROADCAST 536 +#define WM_PRINT 791 +#define WM_PRINTCLIENT 792 +#define WM_QUERYDRAGICON 55 +#define WM_QUERYENDSESSION 17 +#define WM_QUERYNEWPALETTE 783 +#define WM_QUERYOPEN 19 +#define WM_QUEUESYNC 35 +#define WM_QUIT 18 +#define WM_RENDERALLFORMATS 774 +#define WM_RENDERFORMAT 773 +#define WM_SETCURSOR 32 +#define WM_SETFOCUS 7 +#define WM_SETFONT 48 +#define WM_SETHOTKEY 50 +#define WM_SETICON 128 +#define WM_SETREDRAW 11 +#define WM_SETTEXT 12 +#define WM_SETTINGCHANGE 26 +#define WM_SHOWWINDOW 24 +#define WM_SIZE 5 +#define WM_SIZECLIPBOARD 779 +#define WM_SIZING 532 +#define WM_SPOOLERSTATUS 42 +#define WM_STYLECHANGED 125 +#define WM_STYLECHANGING 124 +#define WM_SYSCHAR 262 +#define WM_SYSCOLORCHANGE 21 +#define WM_SYSCOMMAND 274 +#define WM_SYSDEADCHAR 263 +#define WM_SYSKEYDOWN 260 +#define WM_SYSKEYUP 261 +#define WM_TCARD 82 +#define WM_TIMECHANGE 30 +#define WM_TIMER 275 +#define WM_UNDO 772 +#define WM_USER 1024 +#define WM_USERCHANGED 84 +#define WM_VKEYTOITEM 46 +#define WM_VSCROLL 277 +#define WM_VSCROLLCLIPBOARD 778 +#define WM_WINDOWPOSCHANGED 71 +#define WM_WINDOWPOSCHANGING 70 +#define WM_WININICHANGE 26 +#define WM_KEYFIRST 256 +#define WM_KEYLAST 264 +#define WM_SYNCPAINT 136 +#define WM_MOUSEACTIVATE 33 +#define WM_MOUSEMOVE 512 +#define WM_LBUTTONDOWN 513 +#define WM_LBUTTONUP 514 +#define WM_LBUTTONDBLCLK 515 +#define WM_RBUTTONDOWN 516 +#define WM_RBUTTONUP 517 +#define WM_RBUTTONDBLCLK 518 +#define WM_MBUTTONDOWN 519 +#define WM_MBUTTONUP 520 +#define WM_MBUTTONDBLCLK 521 +#define WM_MOUSEWHEEL 522 +#define WM_MOUSEFIRST 512 +#define WM_MOUSELAST 522 +#define WM_MOUSEHOVER 0x2A1 +#define WM_MOUSELEAVE 0x2A3 +#if (_WIN32_WINNT >= 0x0400) +#define WHEEL_DELTA 120 +#define GET_WHEEL_DELTA_WPARAM(wparam) ((short)HIWORD (wparam)) +#define WHEEL_PAGESCROLL UINT_MAX +#endif +#define BM_CLICK 245 +#define BM_GETCHECK 240 +#define BM_GETIMAGE 246 +#define BM_GETSTATE 242 +#define BM_SETCHECK 241 +#define BM_SETIMAGE 247 +#define BM_SETSTATE 243 +#define BM_SETSTYLE 244 +#define BN_CLICKED 0 +#define BN_DBLCLK 5 +#define BN_DISABLE 4 +#define BN_DOUBLECLICKED 5 +#define BN_HILITE 2 +#define BN_KILLFOCUS 7 +#define BN_PAINT 1 +#define BN_PUSHED 2 +#define BN_SETFOCUS 6 +#define BN_UNHILITE 3 +#define BN_UNPUSHED 3 +#define CB_ADDSTRING 323 +#define CB_DELETESTRING 324 +#define CB_DIR 325 +#define CB_FINDSTRING 332 +#define CB_FINDSTRINGEXACT 344 +#define CB_GETCOUNT 326 +#define CB_GETCURSEL 327 +#define CB_GETDROPPEDCONTROLRECT 338 +#define CB_GETDROPPEDSTATE 343 +#define CB_GETDROPPEDWIDTH 351 +#define CB_GETEDITSEL 320 +#define CB_GETEXTENDEDUI 342 +#define CB_GETHORIZONTALEXTENT 349 +#define CB_GETITEMDATA 336 +#define CB_GETITEMHEIGHT 340 +#define CB_GETLBTEXT 328 +#define CB_GETLBTEXTLEN 329 +#define CB_GETLOCALE 346 +#define CB_GETTOPINDEX 347 +#define CB_INITSTORAGE 353 +#define CB_INSERTSTRING 330 +#define CB_LIMITTEXT 321 +#define CB_RESETCONTENT 331 +#define CB_SELECTSTRING 333 +#define CB_SETCURSEL 334 +#define CB_SETDROPPEDWIDTH 352 +#define CB_SETEDITSEL 322 +#define CB_SETEXTENDEDUI 341 +#define CB_SETHORIZONTALEXTENT 350 +#define CB_SETITEMDATA 337 +#define CB_SETITEMHEIGHT 339 +#define CB_SETLOCALE 345 +#define CB_SETTOPINDEX 348 +#define CB_SHOWDROPDOWN 335 +#define CBN_CLOSEUP 8 +#define CBN_DBLCLK 2 +#define CBN_DROPDOWN 7 +#define CBN_EDITCHANGE 5 +#define CBN_EDITUPDATE 6 +#define CBN_ERRSPACE (-1) +#define CBN_KILLFOCUS 4 +#define CBN_SELCHANGE 1 +#define CBN_SELENDCANCEL 10 +#define CBN_SELENDOK 9 +#define CBN_SETFOCUS 3 +#define EM_CANUNDO 198 +#define EM_CHARFROMPOS 215 +#define EM_EMPTYUNDOBUFFER 205 +#define EM_FMTLINES 200 +#define EM_GETFIRSTVISIBLELINE 206 +#define EM_GETHANDLE 189 +#define EM_GETLIMITTEXT 213 +#define EM_GETLINE 196 +#define EM_GETLINECOUNT 186 +#define EM_GETMARGINS 212 +#define EM_GETMODIFY 184 +#define EM_GETPASSWORDCHAR 210 +#define EM_GETRECT 178 +#define EM_GETSEL 176 +#define EM_GETTHUMB 190 +#define EM_GETWORDBREAKPROC 209 +#define EM_LIMITTEXT 197 +#define EM_LINEFROMCHAR 201 +#define EM_LINEINDEX 187 +#define EM_LINELENGTH 193 +#define EM_LINESCROLL 182 +#define EM_POSFROMCHAR 214 +#define EM_REPLACESEL 194 +#define EM_SCROLL 181 +#define EM_SCROLLCARET 183 +#define EM_SETHANDLE 188 +#define EM_SETLIMITTEXT 197 +#define EM_SETMARGINS 211 +#define EM_SETMODIFY 185 +#define EM_SETPASSWORDCHAR 204 +#define EM_SETREADONLY 207 +#define EM_SETRECT 179 +#define EM_SETRECTNP 180 +#define EM_SETSEL 177 +#define EM_SETTABSTOPS 203 +#define EM_SETWORDBREAKPROC 208 +#define EM_UNDO 199 +#define EN_CHANGE 768 +#define EN_ERRSPACE 1280 +#define EN_HSCROLL 1537 +#define EN_KILLFOCUS 512 +#define EN_MAXTEXT 1281 +#define EN_SETFOCUS 256 +#define EN_UPDATE 1024 +#define EN_VSCROLL 1538 +#define LB_ADDFILE 406 +#define LB_ADDSTRING 384 +#define LB_DELETESTRING 386 +#define LB_DIR 397 +#define LB_FINDSTRING 399 +#define LB_FINDSTRINGEXACT 418 +#define LB_GETANCHORINDEX 413 +#define LB_GETCARETINDEX 415 +#define LB_GETCOUNT 395 +#define LB_GETCURSEL 392 +#define LB_GETHORIZONTALEXTENT 403 +#define LB_GETITEMDATA 409 +#define LB_GETITEMHEIGHT 417 +#define LB_GETITEMRECT 408 +#define LB_GETLOCALE 422 +#define LB_GETSEL 391 +#define LB_GETSELCOUNT 400 +#define LB_GETSELITEMS 401 +#define LB_GETTEXT 393 +#define LB_GETTEXTLEN 394 +#define LB_GETTOPINDEX 398 +#define LB_INITSTORAGE 424 +#define LB_INSERTSTRING 385 +#define LB_ITEMFROMPOINT 425 +#define LB_RESETCONTENT 388 +#define LB_SELECTSTRING 396 +#define LB_SELITEMRANGE 411 +#define LB_SELITEMRANGEEX 387 +#define LB_SETANCHORINDEX 412 +#define LB_SETCARETINDEX 414 +#define LB_SETCOLUMNWIDTH 405 +#define LB_SETCOUNT 423 +#define LB_SETCURSEL 390 +#define LB_SETHORIZONTALEXTENT 404 +#define LB_SETITEMDATA 410 +#define LB_SETITEMHEIGHT 416 +#define LB_SETLOCALE 421 +#define LB_SETSEL 389 +#define LB_SETTABSTOPS 402 +#define LB_SETTOPINDEX 407 +#define LBN_DBLCLK 2 +#define LBN_ERRSPACE (-2) +#define LBN_KILLFOCUS 5 +#define LBN_SELCANCEL 3 +#define LBN_SELCHANGE 1 +#define LBN_SETFOCUS 4 +#define SBM_ENABLE_ARROWS 228 +#define SBM_GETPOS 225 +#define SBM_GETRANGE 227 +#define SBM_GETSCROLLINFO 234 +#define SBM_SETPOS 224 +#define SBM_SETRANGE 226 +#define SBM_SETRANGEREDRAW 230 +#define SBM_SETSCROLLINFO 233 +#define STM_GETICON 369 +#define STM_GETIMAGE 371 +#define STM_SETICON 368 +#define STM_SETIMAGE 370 +#define STN_CLICKED 0 +#define STN_DBLCLK 1 +#define STN_DISABLE 3 +#define STN_ENABLE 2 +#define DM_GETDEFID WM_USER +#define DM_SETDEFID (WM_USER+1) +#define DM_REPOSITION (WM_USER+2) +#define PSM_PAGEINFO (WM_USER+100) +#define PSM_SHEETINFO (WM_USER+101) +#define PSI_SETACTIVE 1 +#define PSI_KILLACTIVE 2 +#define PSI_APPLY 3 +#define PSI_RESET 4 +#define PSI_HASHELP 5 +#define PSI_HELP 6 +#define PSI_CHANGED 1 +#define PSI_GUISTART 2 +#define PSI_REBOOT 3 +#define PSI_GETSIBLINGS 4 +#define DCX_WINDOW 1 +#define DCX_CACHE 2 +#define DCX_PARENTCLIP 32 +#define DCX_CLIPSIBLINGS 16 +#define DCX_CLIPCHILDREN 8 +#define DCX_NORESETATTRS 4 +#define DCX_LOCKWINDOWUPDATE 0x400 +#define DCX_EXCLUDERGN 64 +#define DCX_INTERSECTRGN 128 +#define DCX_VALIDATE 0x200000 +#define GMDI_GOINTOPOPUPS 2 +#define GMDI_USEDISABLED 1 +#define FKF_AVAILABLE 2 +#define FKF_CLICKON 64 +#define FKF_FILTERKEYSON 1 +#define FKF_HOTKEYACTIVE 4 +#define FKF_HOTKEYSOUND 16 +#define FKF_CONFIRMHOTKEY 8 +#define FKF_INDICATOR 32 +#define HCF_HIGHCONTRASTON 1 +#define HCF_AVAILABLE 2 +#define HCF_HOTKEYACTIVE 4 +#define HCF_CONFIRMHOTKEY 8 +#define HCF_HOTKEYSOUND 16 +#define HCF_INDICATOR 32 +#define HCF_HOTKEYAVAILABLE 64 +#define MKF_AVAILABLE 2 +#define MKF_CONFIRMHOTKEY 8 +#define MKF_HOTKEYACTIVE 4 +#define MKF_HOTKEYSOUND 16 +#define MKF_INDICATOR 32 +#define MKF_MOUSEKEYSON 1 +#define MKF_MODIFIERS 64 +#define MKF_REPLACENUMBERS 128 +#define SERKF_ACTIVE 8 /* May be obsolete. Not in recent MS docs. */ +#define SERKF_AVAILABLE 2 +#define SERKF_INDICATOR 4 +#define SERKF_SERIALKEYSON 1 +#define SSF_AVAILABLE 2 +#define SSF_SOUNDSENTRYON 1 +#define SSTF_BORDER 2 +#define SSTF_CHARS 1 +#define SSTF_DISPLAY 3 +#define SSTF_NONE 0 +#define SSGF_DISPLAY 3 +#define SSGF_NONE 0 +#define SSWF_CUSTOM 4 +#define SSWF_DISPLAY 3 +#define SSWF_NONE 0 +#define SSWF_TITLE 1 +#define SSWF_WINDOW 2 +#define SKF_AUDIBLEFEEDBACK 64 +#define SKF_AVAILABLE 2 +#define SKF_CONFIRMHOTKEY 8 +#define SKF_HOTKEYACTIVE 4 +#define SKF_HOTKEYSOUND 16 +#define SKF_INDICATOR 32 +#define SKF_STICKYKEYSON 1 +#define SKF_TRISTATE 128 +#define SKF_TWOKEYSOFF 256 +#define TKF_AVAILABLE 2 +#define TKF_CONFIRMHOTKEY 8 +#define TKF_HOTKEYACTIVE 4 +#define TKF_HOTKEYSOUND 16 +#define TKF_TOGGLEKEYSON 1 +#define MDITILE_SKIPDISABLED 2 +#define MDITILE_HORIZONTAL 1 +#define MDITILE_VERTICAL 0 +#define VK_LBUTTON 1 +#define VK_RBUTTON 2 +#define VK_CANCEL 3 +#define VK_MBUTTON 4 +#if (_WIN32_WINNT >= 0x0500) +#define VK_XBUTTON1 5 +#define VK_XBUTTON2 6 +#endif +#define VK_BACK 8 +#define VK_TAB 9 +#define VK_CLEAR 12 +#define VK_RETURN 13 +#define VK_SHIFT 16 +#define VK_CONTROL 17 +#define VK_MENU 18 +#define VK_PAUSE 19 +#define VK_CAPITAL 20 +#define VK_KANA 0x15 +#define VK_HANGEUL 0x15 +#define VK_HANGUL 0x15 +#define VK_JUNJA 0x17 +#define VK_FINAL 0x18 +#define VK_HANJA 0x19 +#define VK_KANJI 0x19 +#define VK_ESCAPE 0x1B +#define VK_CONVERT 0x1C +#define VK_NONCONVERT 0x1D +#define VK_ACCEPT 0x1E +#define VK_MODECHANGE 0x1F +#define VK_SPACE 32 +#define VK_PRIOR 33 +#define VK_NEXT 34 +#define VK_END 35 +#define VK_HOME 36 +#define VK_LEFT 37 +#define VK_UP 38 +#define VK_RIGHT 39 +#define VK_DOWN 40 +#define VK_SELECT 41 +#define VK_PRINT 42 +#define VK_EXECUTE 43 +#define VK_SNAPSHOT 44 +#define VK_INSERT 45 +#define VK_DELETE 46 +#define VK_HELP 47 +#define VK_LWIN 0x5B +#define VK_RWIN 0x5C +#define VK_APPS 0x5D +#define VK_SLEEP 0x5F +#define VK_NUMPAD0 0x60 +#define VK_NUMPAD1 0x61 +#define VK_NUMPAD2 0x62 +#define VK_NUMPAD3 0x63 +#define VK_NUMPAD4 0x64 +#define VK_NUMPAD5 0x65 +#define VK_NUMPAD6 0x66 +#define VK_NUMPAD7 0x67 +#define VK_NUMPAD8 0x68 +#define VK_NUMPAD9 0x69 +#define VK_MULTIPLY 0x6A +#define VK_ADD 0x6B +#define VK_SEPARATOR 0x6C +#define VK_SUBTRACT 0x6D +#define VK_DECIMAL 0x6E +#define VK_DIVIDE 0x6F +#define VK_F1 0x70 +#define VK_F2 0x71 +#define VK_F3 0x72 +#define VK_F4 0x73 +#define VK_F5 0x74 +#define VK_F6 0x75 +#define VK_F7 0x76 +#define VK_F8 0x77 +#define VK_F9 0x78 +#define VK_F10 0x79 +#define VK_F11 0x7A +#define VK_F12 0x7B +#define VK_F13 0x7C +#define VK_F14 0x7D +#define VK_F15 0x7E +#define VK_F16 0x7F +#define VK_F17 0x80 +#define VK_F18 0x81 +#define VK_F19 0x82 +#define VK_F20 0x83 +#define VK_F21 0x84 +#define VK_F22 0x85 +#define VK_F23 0x86 +#define VK_F24 0x87 +#define VK_NUMLOCK 0x90 +#define VK_SCROLL 0x91 +#define VK_LSHIFT 0xA0 +#define VK_RSHIFT 0xA1 +#define VK_LCONTROL 0xA2 +#define VK_RCONTROL 0xA3 +#define VK_LMENU 0xA4 +#define VK_RMENU 0xA5 +#if (_WIN32_WINNT >= 0x0500) +#define VK_BROWSER_BACK 0xA6 +#define VK_BROWSER_FORWARD 0xA7 +#define VK_BROWSER_REFRESH 0xA8 +#define VK_BROWSER_STOP 0xA9 +#define VK_BROWSER_SEARCH 0xAA +#define VK_BROWSER_FAVORITES 0xAB +#define VK_BROWSER_HOME 0xAC +#define VK_VOLUME_MUTE 0xAD +#define VK_VOLUME_DOWN 0xAE +#define VK_VOLUME_UP 0xAF +#define VK_MEDIA_NEXT_TRACK 0xB0 +#define VK_MEDIA_PREV_TRACK 0xB1 +#define VK_MEDIA_STOP 0xB2 +#define VK_MEDIA_PLAY_PAUSE 0xB3 +#define VK_LAUNCH_MAIL 0xB4 +#define VK_LAUNCH_MEDIA_SELECT 0xB5 +#define VK_LAUNCH_APP1 0xB6 +#define VK_LAUNCH_APP2 0xB7 +#endif +#define VK_OEM_1 0xBA +#if (_WIN32_WINNT >= 0x0500) +#define VK_OEM_PLUS 0xBB +#define VK_OEM_COMMA 0xBC +#define VK_OEM_MINUS 0xBD +#define VK_OEM_PERIOD 0xBE +#endif +#define VK_OEM_2 0xBF +#define VK_OEM_3 0xC0 +#define VK_OEM_4 0xDB +#define VK_OEM_5 0xDC +#define VK_OEM_6 0xDD +#define VK_OEM_7 0xDE +#define VK_OEM_8 0xDF +#if (_WIN32_WINNT >= 0x0500) +#define VK_OEM_102 0xE2 +#endif +#define VK_PROCESSKEY 0xE5 +#if (_WIN32_WINNT >= 0x0500) +#define VK_PACKET 0xE7 +#endif +#define VK_ATTN 0xF6 +#define VK_CRSEL 0xF7 +#define VK_EXSEL 0xF8 +#define VK_EREOF 0xF9 +#define VK_PLAY 0xFA +#define VK_ZOOM 0xFB +#define VK_NONAME 0xFC +#define VK_PA1 0xFD +#define VK_OEM_CLEAR 0xFE +#define TME_HOVER 1 +#define TME_LEAVE 2 +#define TME_QUERY 0x40000000 +#define TME_CANCEL 0x80000000 +#define HOVER_DEFAULT 0xFFFFFFFF +#define MK_LBUTTON 1 +#define MK_RBUTTON 2 +#define MK_SHIFT 4 +#define MK_CONTROL 8 +#define MK_MBUTTON 16 +#define TPM_CENTERALIGN 4 +#define TPM_LEFTALIGN 0 +#define TPM_RIGHTALIGN 8 +#define TPM_LEFTBUTTON 0 +#define TPM_RIGHTBUTTON 2 +#define TPM_HORIZONTAL 0 +#define TPM_VERTICAL 64 +#define TPM_TOPALIGN 0 +#define TPM_VCENTERALIGN 16 +#define TPM_BOTTOMALIGN 32 +#define TPM_NONOTIFY 128 +#define TPM_RETURNCMD 256 +#if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0410) +#define TPM_RECURSE 1 +#endif +#define HELP_COMMAND 0x102 +#define HELP_CONTENTS 3 +#define HELP_CONTEXT 1 +#define HELP_CONTEXTPOPUP 8 +#define HELP_FORCEFILE 9 +#define HELP_HELPONHELP 4 +#define HELP_INDEX 3 +#define HELP_KEY 0x101 +#define HELP_MULTIKEY 0x201 +#define HELP_PARTIALKEY 0x105 +#define HELP_QUIT 2 +#define HELP_SETCONTENTS 5 +#define HELP_SETINDEX 5 +#define HELP_CONTEXTMENU 0xa +#define HELP_FINDER 0xb +#define HELP_WM_HELP 0xc +#define HELP_TCARD 0x8000 +#define HELP_TCARD_DATA 16 +#define HELP_TCARD_OTHER_CALLER 0x11 +#define IDH_NO_HELP 28440 +#define IDH_MISSING_CONTEXT 28441 +#define IDH_GENERIC_HELP_BUTTON 28442 +#define IDH_OK 28443 +#define IDH_CANCEL 28444 +#define IDH_HELP 28445 +#define LB_CTLCODE 0 +#define LB_OKAY 0 +#define LB_ERR (-1) +#define LB_ERRSPACE (-2) +#define CB_OKAY 0 +#define CB_ERR (-1) +#define CB_ERRSPACE (-2) +#define HIDE_WINDOW 0 +#define SHOW_OPENWINDOW 1 +#define SHOW_ICONWINDOW 2 +#define SHOW_FULLSCREEN 3 +#define SHOW_OPENNOACTIVATE 4 +#define SW_PARENTCLOSING 1 +#define SW_OTHERZOOM 2 +#define SW_PARENTOPENING 3 +#define SW_OTHERUNZOOM 4 +#define KF_EXTENDED 256 +#define KF_DLGMODE 2048 +#define KF_MENUMODE 4096 +#define KF_ALTDOWN 8192 +#define KF_REPEAT 16384 +#define KF_UP 32768 +#define WSF_VISIBLE 1 +#define PWR_OK 1 +#define PWR_FAIL (-1) +#define PWR_SUSPENDREQUEST 1 +#define PWR_SUSPENDRESUME 2 +#define PWR_CRITICALRESUME 3 +#define NFR_ANSI 1 +#define NFR_UNICODE 2 +#define NF_QUERY 3 +#define NF_REQUERY 4 +#define MENULOOP_WINDOW 0 +#define MENULOOP_POPUP 1 +#define WMSZ_LEFT 1 +#define WMSZ_RIGHT 2 +#define WMSZ_TOP 3 +#define WMSZ_TOPLEFT 4 +#define WMSZ_TOPRIGHT 5 +#define WMSZ_BOTTOM 6 +#define WMSZ_BOTTOMLEFT 7 +#define WMSZ_BOTTOMRIGHT 8 +#define HTERROR (-2) +#define HTTRANSPARENT (-1) +#define HTNOWHERE 0 +#define HTCLIENT 1 +#define HTCAPTION 2 +#define HTSYSMENU 3 +#define HTGROWBOX 4 +#define HTSIZE 4 +#define HTMENU 5 +#define HTHSCROLL 6 +#define HTVSCROLL 7 +#define HTMINBUTTON 8 +#define HTMAXBUTTON 9 +#define HTREDUCE 8 +#define HTZOOM 9 +#define HTLEFT 10 +#define HTSIZEFIRST 10 +#define HTRIGHT 11 +#define HTTOP 12 +#define HTTOPLEFT 13 +#define HTTOPRIGHT 14 +#define HTBOTTOM 15 +#define HTBOTTOMLEFT 16 +#define HTBOTTOMRIGHT 17 +#define HTSIZELAST 17 +#define HTBORDER 18 +#define HTOBJECT 19 +#define HTCLOSE 20 +#define HTHELP 21 +#define MA_ACTIVATE 1 +#define MA_ACTIVATEANDEAT 2 +#define MA_NOACTIVATE 3 +#define MA_NOACTIVATEANDEAT 4 +#define SIZE_RESTORED 0 +#define SIZE_MINIMIZED 1 +#define SIZE_MAXIMIZED 2 +#define SIZE_MAXSHOW 3 +#define SIZE_MAXHIDE 4 +#define SIZENORMAL 0 +#define SIZEICONIC 1 +#define SIZEFULLSCREEN 2 +#define SIZEZOOMSHOW 3 +#define SIZEZOOMHIDE 4 +#define WVR_ALIGNTOP 16 +#define WVR_ALIGNLEFT 32 +#define WVR_ALIGNBOTTOM 64 +#define WVR_ALIGNRIGHT 128 +#define WVR_HREDRAW 256 +#define WVR_VREDRAW 512 +#define WVR_REDRAW (WVR_HREDRAW|WVR_VREDRAW) +#define WVR_VALIDRECTS 1024 +#define PRF_CHECKVISIBLE 1 +#define PRF_NONCLIENT 2 +#define PRF_CLIENT 4 +#define PRF_ERASEBKGND 8 +#define PRF_CHILDREN 16 +#define PRF_OWNED 32 +#define IDANI_OPEN 1 +#define IDANI_CLOSE 2 +#define IDANI_CAPTION 3 +#define WPF_RESTORETOMAXIMIZED 2 +#define WPF_SETMINPOSITION 1 +#define ODT_MENU 1 +#define ODT_LISTBOX 2 +#define ODT_COMBOBOX 3 +#define ODT_BUTTON 4 +#define ODT_STATIC 5 +#define ODA_DRAWENTIRE 1 +#define ODA_SELECT 2 +#define ODA_FOCUS 4 +#define ODS_SELECTED 1 +#define ODS_GRAYED 2 +#define ODS_DISABLED 4 +#define ODS_CHECKED 8 +#define ODS_FOCUS 16 +#define ODS_DEFAULT 32 +#define ODS_COMBOBOXEDIT 4096 +#define IDHOT_SNAPWINDOW (-1) +#define IDHOT_SNAPDESKTOP (-2) +#define DBWF_LPARAMPOINTER 0x8000 +#define DLGWINDOWEXTRA 30 +#define MNC_IGNORE 0 +#define MNC_CLOSE 1 +#define MNC_EXECUTE 2 +#define MNC_SELECT 3 +#define DOF_EXECUTABLE 0x8001 +#define DOF_DOCUMENT 0x8002 +#define DOF_DIRECTORY 0x8003 +#define DOF_MULTIPLE 0x8004 +#define DOF_PROGMAN 1 +#define DOF_SHELLDATA 2 +#define DO_DROPFILE 0x454C4946 +#define DO_PRINTFILE 0x544E5250 +#define SW_SCROLLCHILDREN 1 +#define SW_INVALIDATE 2 +#define SW_ERASE 4 +#define SC_SIZE 0xF000 +#define SC_MOVE 0xF010 +#define SC_MINIMIZE 0xF020 +#define SC_ICON 0xf020 +#define SC_MAXIMIZE 0xF030 +#define SC_ZOOM 0xF030 +#define SC_NEXTWINDOW 0xF040 +#define SC_PREVWINDOW 0xF050 +#define SC_CLOSE 0xF060 +#define SC_VSCROLL 0xF070 +#define SC_HSCROLL 0xF080 +#define SC_MOUSEMENU 0xF090 +#define SC_KEYMENU 0xF100 +#define SC_ARRANGE 0xF110 +#define SC_RESTORE 0xF120 +#define SC_TASKLIST 0xF130 +#define SC_SCREENSAVE 0xF140 +#define SC_HOTKEY 0xF150 +#define SC_DEFAULT 0xF160 +#define SC_MONITORPOWER 0xF170 +#define SC_CONTEXTHELP 0xF180 +#define SC_SEPARATOR 0xF00F +#define EC_LEFTMARGIN 1 +#define EC_RIGHTMARGIN 2 +#define EC_USEFONTINFO 0xffff +#define DC_HASDEFID 0x534B +#define DLGC_WANTARROWS 1 +#define DLGC_WANTTAB 2 +#define DLGC_WANTALLKEYS 4 +#define DLGC_WANTMESSAGE 4 +#define DLGC_HASSETSEL 8 +#define DLGC_DEFPUSHBUTTON 16 +#define DLGC_UNDEFPUSHBUTTON 32 +#define DLGC_RADIOBUTTON 64 +#define DLGC_WANTCHARS 128 +#define DLGC_STATIC 256 +#define DLGC_BUTTON 0x2000 +#define LB_CTLCODE 0 +#define WA_INACTIVE 0 +#define WA_ACTIVE 1 +#define WA_CLICKACTIVE 2 +#define ICON_SMALL 0 +#define ICON_BIG 1 +#if (_WIN32_WINNT >= 0x0501) +#define ICON_SMALL2 2 +#endif +#define HBMMENU_CALLBACK ((HBITMAP) -1) +#define HBMMENU_SYSTEM ((HBITMAP)1) +#define HBMMENU_MBAR_RESTORE ((HBITMAP)2) +#define HBMMENU_MBAR_MINIMIZE ((HBITMAP)3) +#define HBMMENU_MBAR_CLOSE ((HBITMAP)5) +#define HBMMENU_MBAR_CLOSE_D ((HBITMAP)6) +#define HBMMENU_MBAR_MINIMIZE_D ((HBITMAP)7) +#define HBMMENU_POPUP_CLOSE ((HBITMAP)8) +#define HBMMENU_POPUP_RESTORE ((HBITMAP)9) +#define HBMMENU_POPUP_MAXIMIZE ((HBITMAP)10) +#define HBMMENU_POPUP_MINIMIZE ((HBITMAP)11) +#define MOD_ALT 1 +#define MOD_CONTROL 2 +#define MOD_SHIFT 4 +#define MOD_WIN 8 +#define MOD_IGNORE_ALL_MODIFIER 1024 +#define MOD_ON_KEYUP 2048 +#define MOD_RIGHT 16384 +#define MOD_LEFT 32768 +#define LLKHF_ALTDOWN 0x00000020 +#if (WINVER >= 0x0500) +#define FLASHW_STOP 0 +#define FLASHW_CAPTION 1 +#define FLASHW_TRAY 2 +#define FLASHW_ALL (FLASHW_CAPTION|FLASHW_TRAY) +#define FLASHW_TIMER 4 +#define FLASHW_TIMERNOFG 12 +#endif /* (WINVER >= 0x0500) */ +#define CURSOR_SHOWING 0x00000001 +#define WS_ACTIVECAPTION 0x00000001 +#if (_WIN32_WINNT >= 0x0403) +#define INPUT_MOUSE 0x00000000 +#define INPUT_KEYBOARD 0x00000001 +#define INPUT_HARDWARE 0x00000002 +#endif /* (_WIN32_WINNT >= 0x0403) */ +#if (WINVER >= 0x0400) +#define ENDSESSION_LOGOFF 0x80000000 +#endif +#if (WINVER >= 0x0500) +#define CHILDID_SELF 0 +#define OBJID_WINDOW 0x00000000 +#define OBJID_SYSMENU 0xFFFFFFFF +#define OBJID_TITLEBAR 0xFFFFFFFE +#define OBJID_MENU 0xFFFFFFFD +#define OBJID_CLIENT 0xFFFFFFFC +#define OBJID_VSCROLL 0xFFFFFFFB +#define OBJID_HSCROLL 0xFFFFFFFA +#define OBJID_SIZEGRIP 0xFFFFFFF9 +#define OBJID_CARET 0xFFFFFFF8 +#define OBJID_CURSOR 0xFFFFFFF7 +#define OBJID_ALERT 0xFFFFFFF6 +#define OBJID_SOUND 0xFFFFFFF5 +#define GUI_CARETBLINKING 0x00000001 +#define GUI_INMOVESIZE 0x00000002 +#define GUI_INMENUMODE 0x00000004 +#define GUI_SYSTEMMENUMODE 0x00000008 +#define GUI_POPUPMENUMODE 0x00000010 +#if (_WIN32_WINNT >= 0x0501) +#define GUI_16BITTASK 0x00000020 +#endif +#define WINEVENT_OUTOFCONTEXT 0x0000 +#define WINEVENT_SKIPOWNTHREAD 0x0001 +#define WINEVENT_SKIPOWNPROCESS 0x0002 +#define WINEVENT_INCONTEXT 0x0004 +#define AW_HOR_POSITIVE 0x00000001 +#define AW_HOR_NEGATIVE 0x00000002 +#define AW_VER_POSITIVE 0x00000004 +#define AW_VER_NEGATIVE 0x00000008 +#define AW_CENTER 0x00000010 +#define AW_HIDE 0x00010000 +#define AW_ACTIVATE 0x00020000 +#define AW_SLIDE 0x00040000 +#define AW_BLEND 0x00080000 +#define DEVICE_NOTIFY_WINDOW_HANDLE 0x00000000 +#define DEVICE_NOTIFY_SERVICE_HANDLE 0x00000001 +#if (_WIN32_WINNT >= 0x0501) +#define DEVICE_NOTIFY_ALL_INTERFACE_CLASSES 0x00000004 +#endif +#define EVENT_MIN 0x00000001 +#define EVENT_SYSTEM_SOUND 0x00000001 +#define EVENT_SYSTEM_ALERT 0x00000002 +#define EVENT_SYSTEM_FOREGROUND 0x00000003 +#define EVENT_SYSTEM_MENUSTART 0x00000004 +#define EVENT_SYSTEM_MENUEND 0x00000005 +#define EVENT_SYSTEM_MENUPOPUPSTART 0x00000006 +#define EVENT_SYSTEM_MENUPOPUPEND 0x00000007 +#define EVENT_SYSTEM_CAPTURESTART 0x00000008 +#define EVENT_SYSTEM_CAPTUREEND 0x00000009 +#define EVENT_SYSTEM_MOVESIZESTART 0x0000000a +#define EVENT_SYSTEM_MOVESIZEEND 0x0000000b +#define EVENT_SYSTEM_CONTEXTHELPSTART 0x0000000c +#define EVENT_SYSTEM_CONTEXTHELPEND 0x0000000d +#define EVENT_SYSTEM_DRAGDROPSTART 0x0000000e +#define EVENT_SYSTEM_DRAGDROPEND 0x0000000f +#define EVENT_SYSTEM_DIALOGSTART 0x00000010 +#define EVENT_SYSTEM_DIALOGEND 0x00000011 +#define EVENT_SYSTEM_SCROLLINGSTART 0x00000012 +#define EVENT_SYSTEM_SCROLLINGEND 0x00000013 +#define EVENT_SYSTEM_SWITCHSTART 0x00000014 +#define EVENT_SYSTEM_SWITCHEND 0x00000015 +#define EVENT_SYSTEM_MINIMIZESTART 0x00000016 +#define EVENT_SYSTEM_MINIMIZEEND 0x00000017 +#define EVENT_OBJECT_CREATE 0x00008000 +#define EVENT_OBJECT_DESTROY 0x00008001 +#define EVENT_OBJECT_SHOW 0x00008002 +#define EVENT_OBJECT_HIDE 0x00008003 +#define EVENT_OBJECT_REORDER 0x00008004 +#define EVENT_OBJECT_FOCUS 0x00008005 +#define EVENT_OBJECT_SELECTION 0x00008006 +#define EVENT_OBJECT_SELECTIONADD 0x00008007 +#define EVENT_OBJECT_SELECTIONREMOVE 0x00008008 +#define EVENT_OBJECT_SELECTIONWITHIN 0x00008009 +#define EVENT_OBJECT_STATECHANGE 0x0000800a +#define EVENT_OBJECT_LOCATIONCHANGE 0x0000800b +#define EVENT_OBJECT_NAMECHANGE 0x0000800c +#define EVENT_OBJECT_DESCRIPTIONCHANGE 0x0000800d +#define EVENT_OBJECT_VALUECHANGE 0x0000800e +#define EVENT_OBJECT_PARENTCHANGE 0x0000800f +#define EVENT_OBJECT_HELPCHANGE 0x00008010 +#define EVENT_OBJECT_DEFACTIONCHANGE 0x00008011 +#define EVENT_OBJECT_ACCELERATORCHANGE 0x00008012 +#if (_WIN32_WINNT >= 0x0501) +#define EVENT_CONSOLE_CARET 0x00004001 +#define CONSOLE_CARET_SELECTION 0x00000001 +#define CONSOLE_CARET_VISIBLE 0x00000002 +#define EVENT_CONSOLE_UPDATE_REGION 0x00004002 +#define EVENT_CONSOLE_UPDATE_SIMPLE 0x00004003 +#define EVENT_CONSOLE_UPDATE_SCROLL 0x00004004 +#define EVENT_CONSOLE_LAYOUT 0x00004005 +#define EVENT_CONSOLE_START_APPLICATION 0x00004006 +#define CONSOLE_APPLICATION_16BIT 0x00000001 +#define EVENT_CONSOLE_END_APPLICATION 0x00004007 +#endif /* (_WIN32_WINNT >= 0x0501) */ +#define EVENT_MAX 0x7fffffff +#endif /* (WINVER >= 0x0500) */ +#if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0490) +#define ASFW_ANY ((DWORD)-1) +#define LSFW_LOCK 1 +#define LSFW_UNLOCK 2 +#endif +#if (_WIN32_WINNT >= 0x0500) +#define LWA_COLORKEY 1 +#define LWA_ALPHA 2 +#endif +#define GA_PARENT 1 +#define GA_ROOT 2 +#define GA_ROOTOWNER 3 +#if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0410) +#define MONITOR_DEFAULTTONULL 0 +#define MONITOR_DEFAULTTOPRIMARY 1 +#define MONITOR_DEFAULTTONEAREST 2 +#define MONITORINFOF_PRIMARY 1 +#define EDS_RAWMODE 0x00000002 +#define ISMEX_NOSEND 0x00000000 +#define ISMEX_CALLBACK 0x00000004 +#define ISMEX_NOTIFY 0x00000002 +#define ISMEX_REPLIED 0x00000008 +#define ISMEX_SEND 0x00000001 +#endif +#if (_WIN32_WINNT >= 0x0500) +#define GR_GDIOBJECTS 0 +#define GR_USEROBJECTS 1 +#endif +#if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0490) +#define GMMP_USE_DISPLAY_POINTS 1 +#define GMMP_USE_HIGH_RESOLUTION_POINTS 2 +#endif +#if (_WIN32_WINNT >= 0x0501) +#define PW_CLIENTONLY 0x00000001 +#define RIM_INPUT 0x00000000 +#define RIM_INPUTSINK 0x00000001 +#define RIM_TYPEMOUSE 0x00000000 +#define RIM_TYPEKEYBOARD 0x00000001 +#define RIM_TYPEHID 0x00000002 +#define MOUSE_MOVE_RELATIVE 0x00000000 +#define MOUSE_MOVE_ABSOLUTE 0x00000001 +#define MOUSE_VIRTUAL_DESKTOP 0x00000002 +#define MOUSE_ATTRIBUTES_CHANGED 0x00000004 +#define RI_MOUSE_LEFT_BUTTON_DOWN 0x0001 +#define RI_MOUSE_LEFT_BUTTON_UP 0x0002 +#define RI_MOUSE_RIGHT_BUTTON_DOWN 0x0004 +#define RI_MOUSE_RIGHT_BUTTON_UP 0x0008 +#define RI_MOUSE_MIDDLE_BUTTON_DOWN 0x0010 +#define RI_MOUSE_MIDDLE_BUTTON_UP 0x0020 +#define RI_MOUSE_BUTTON_1_DOWN RI_MOUSE_LEFT_BUTTON_DOWN +#define RI_MOUSE_BUTTON_1_UP RI_MOUSE_LEFT_BUTTON_UP +#define RI_MOUSE_BUTTON_2_DOWN RI_MOUSE_RIGHT_BUTTON_DOWN +#define RI_MOUSE_BUTTON_2_UP RI_MOUSE_RIGHT_BUTTON_UP +#define RI_MOUSE_BUTTON_3_DOWN RI_MOUSE_MIDDLE_BUTTON_DOWN +#define RI_MOUSE_BUTTON_3_UP RI_MOUSE_MIDDLE_BUTTON_UP +#define RI_MOUSE_BUTTON_4_DOWN 0x0040 +#define RI_MOUSE_BUTTON_4_UP 0x0080 +#define RI_MOUSE_BUTTON_5_DOWN 0x0100 +#define RI_MOUSE_BUTTON_5_UP 0x0200 +#define RI_MOUSE_WHEEL 0x0400 +#define KEYBOARD_OVERRUN_MAKE_CODE 0x00ff +#define RI_KEY_MAKE 0x0000 +#define RI_KEY_BREAK 0x0001 +#define RI_KEY_E0 0x0002 +#define RI_KEY_E1 0x0004 +#define RI_KEY_TERMSRV_SET_LED 0x0008 +#define RI_KEY_TERMSRV_SHADOW 0x0010 +#define RID_INPUT 0x10000003 +#define RID_HEADER 0x10000005 +#define RIDI_PREPARSEDDATA 0x20000005 +#define RIDI_DEVICENAME 0x20000007 +#define RIDI_DEVICEINFO 0x2000000b +#define RIDEV_REMOVE 0x00000001 +#define RIDEV_EXCLUDE 0x00000010 +#define RIDEV_PAGEONLY 0x00000020 +#define RIDEV_NOLEGACY 0x00000030 +#define RIDEV_INPUTSINK 0x00000100 +#define RIDEV_CAPTUREMOUSE 0x00000200 +#define RIDEV_NOHOTKEYS 0x00000200 +#define RIDEV_APPKEYS 0x00000400 +#endif + +#ifndef RC_INVOKED +typedef BOOL(CALLBACK *DLGPROC)(HWND,UINT,WPARAM,LPARAM); +typedef VOID(CALLBACK *TIMERPROC)(HWND,UINT,UINT,DWORD); +typedef BOOL(CALLBACK *GRAYSTRINGPROC)(HDC,LPARAM,int); +typedef LRESULT(CALLBACK *HOOKPROC)(int,WPARAM,LPARAM); +typedef BOOL(CALLBACK *PROPENUMPROCA)(HWND,LPCSTR,HANDLE); +typedef BOOL(CALLBACK *PROPENUMPROCW)(HWND,LPCWSTR,HANDLE); +typedef BOOL(CALLBACK *PROPENUMPROCEXA)(HWND,LPSTR,HANDLE,DWORD); +typedef BOOL(CALLBACK *PROPENUMPROCEXW)(HWND,LPWSTR,HANDLE,DWORD); +typedef int(CALLBACK *EDITWORDBREAKPROCA)(LPSTR,int,int,int); +typedef int(CALLBACK *EDITWORDBREAKPROCW)(LPWSTR,int,int,int); +typedef LRESULT(CALLBACK *WNDPROC)(HWND,UINT,WPARAM,LPARAM); +typedef BOOL(CALLBACK *DRAWSTATEPROC)(HDC,LPARAM,WPARAM,int,int); +typedef BOOL(CALLBACK *WNDENUMPROC)(HWND,LPARAM); +typedef BOOL(CALLBACK *ENUMWINDOWSPROC)(HWND,LPARAM); +typedef BOOL(CALLBACK* MONITORENUMPROC)(HMONITOR,HDC,LPRECT,LPARAM); +typedef BOOL(CALLBACK *NAMEENUMPROCA)(LPSTR,LPARAM); +typedef BOOL(CALLBACK *NAMEENUMPROCW)(LPWSTR,LPARAM); +typedef NAMEENUMPROCA DESKTOPENUMPROCA; +typedef NAMEENUMPROCW DESKTOPENUMPROCW; +typedef NAMEENUMPROCA WINSTAENUMPROCA; +typedef NAMEENUMPROCW WINSTAENUMPROCW; +typedef void(CALLBACK *SENDASYNCPROC)(HWND,UINT,DWORD,LRESULT); +DECLARE_HANDLE(HHOOK); +DECLARE_HANDLE(HDWP); +DECLARE_HANDLE(HDEVNOTIFY); +typedef struct tagACCEL { + BYTE fVirt; + WORD key; + WORD cmd; +} ACCEL,*LPACCEL; +typedef struct tagACCESSTIMEOUT { + UINT cbSize; + DWORD dwFlags; + DWORD iTimeOutMSec; +} ACCESSTIMEOUT, *LPACCESSTIMEOUT; +typedef struct tagANIMATIONINFO { + UINT cbSize; + int iMinAnimate; +} ANIMATIONINFO,*LPANIMATIONINFO; +typedef struct tagCREATESTRUCTA { + LPVOID lpCreateParams; + HINSTANCE hInstance; + HMENU hMenu; + HWND hwndParent; + int cy; + int cx; + int y; + int x; + LONG style; + LPCSTR lpszName; + LPCSTR lpszClass; + DWORD dwExStyle; +} CREATESTRUCTA,*LPCREATESTRUCTA; +typedef struct tagCREATESTRUCTW { + LPVOID lpCreateParams; + HINSTANCE hInstance; + HMENU hMenu; + HWND hwndParent; + int cy; + int cx; + int y; + int x; + LONG style; + LPCWSTR lpszName; + LPCWSTR lpszClass; + DWORD dwExStyle; +} CREATESTRUCTW,*LPCREATESTRUCTW; +typedef struct tagCBT_CREATEWNDA { + LPCREATESTRUCTA lpcs; + HWND hwndInsertAfter; +} CBT_CREATEWNDA, *LPCBT_CREATEWNDA; +typedef struct tagCBT_CREATEWNDW { + LPCREATESTRUCTW lpcs; + HWND hwndInsertAfter; +} CBT_CREATEWNDW, *LPCBT_CREATEWNDW; +typedef struct tagCBTACTIVATESTRUCT { + BOOL fMouse; + HWND hWndActive; +} CBTACTIVATESTRUCT,*LPCBTACTIVATESTRUCT; +typedef struct tagCLIENTCREATESTRUCT { + HANDLE hWindowMenu; + UINT idFirstChild; +} CLIENTCREATESTRUCT,*LPCLIENTCREATESTRUCT; +typedef struct tagCOMPAREITEMSTRUCT { + UINT CtlType; + UINT CtlID; + HWND hwndItem; + UINT itemID1; + DWORD itemData1; + UINT itemID2; + DWORD itemData2; + DWORD dwLocaleId; +} COMPAREITEMSTRUCT,*LPCOMPAREITEMSTRUCT; +typedef struct tagCOPYDATASTRUCT { + DWORD dwData; + DWORD cbData; + PVOID lpData; +} COPYDATASTRUCT,*PCOPYDATASTRUCT; +typedef struct tagCURSORSHAPE { + int xHotSpot; + int yHotSpot; + int cx; + int cy; + int cbWidth; + BYTE Planes; + BYTE BitsPixel; +} CURSORSHAPE,*LPCURSORSHAPE; +typedef struct tagCWPRETSTRUCT { + LRESULT lResult; + LPARAM lParam; + WPARAM wParam; + DWORD message; + HWND hwnd; +} CWPRETSTRUCT; +typedef struct tagCWPSTRUCT { + LPARAM lParam; + WPARAM wParam; + UINT message; + HWND hwnd; +} CWPSTRUCT,*PCWPSTRUCT; +typedef struct tagDEBUGHOOKINFO { + DWORD idThread; + DWORD idThreadInstaller; + LPARAM lParam; + WPARAM wParam; + int code; +} DEBUGHOOKINFO,*PDEBUGHOOKINFO,*LPDEBUGHOOKINFO; +typedef struct tagDELETEITEMSTRUCT { + UINT CtlType; + UINT CtlID; + UINT itemID; + HWND hwndItem; + UINT itemData; +} DELETEITEMSTRUCT,*PDELETEITEMSTRUCT,*LPDELETEITEMSTRUCT; +#pragma pack(push,2) +typedef struct { + DWORD style; + DWORD dwExtendedStyle; + short x; + short y; + short cx; + short cy; + WORD id; +} DLGITEMTEMPLATE,*LPDLGITEMTEMPLATE; +typedef struct { + DWORD style; + DWORD dwExtendedStyle; + WORD cdit; + short x; + short y; + short cx; + short cy; +} DLGTEMPLATE,*LPDLGTEMPLATE,*LPDLGTEMPLATEA,*LPDLGTEMPLATEW; +typedef const DLGTEMPLATE *LPCDLGTEMPLATE; +#pragma pack(pop) +typedef struct tagDRAWITEMSTRUCT { + UINT CtlType; + UINT CtlID; + UINT itemID; + UINT itemAction; + UINT itemState; + HWND hwndItem; + HDC hDC; + RECT rcItem; + DWORD itemData; +} DRAWITEMSTRUCT,*LPDRAWITEMSTRUCT,*PDRAWITEMSTRUCT; +typedef struct { + UINT cbSize; + int iTabLength; + int iLeftMargin; + int iRightMargin; + UINT uiLengthDrawn; +} DRAWTEXTPARAMS,*LPDRAWTEXTPARAMS; +typedef struct tagPAINTSTRUCT { + HDC hdc; + BOOL fErase; + RECT rcPaint; + BOOL fRestore; + BOOL fIncUpdate; + BYTE rgbReserved[32]; +} PAINTSTRUCT,*LPPAINTSTRUCT; +typedef struct tagMSG { + HWND hwnd; + UINT message; + WPARAM wParam; + LPARAM lParam; + DWORD time; + POINT pt; +} MSG,*LPMSG,*PMSG; +typedef struct _ICONINFO { + BOOL fIcon; + DWORD xHotspot; + DWORD yHotspot; + HBITMAP hbmMask; + HBITMAP hbmColor; +} ICONINFO,*PICONINFO; +typedef struct tagNMHDR { + HWND hwndFrom; + UINT idFrom; + UINT code; +} NMHDR,*LPNMHDR; +typedef struct _WNDCLASSA { + UINT style; + WNDPROC lpfnWndProc; + int cbClsExtra; + int cbWndExtra; + HINSTANCE hInstance; + HICON hIcon; + HCURSOR hCursor; + HBRUSH hbrBackground; + LPCSTR lpszMenuName; + LPCSTR lpszClassName; +} WNDCLASSA,*LPWNDCLASSA,*PWNDCLASSA; +typedef struct _WNDCLASSW { + UINT style; + WNDPROC lpfnWndProc; + int cbClsExtra; + int cbWndExtra; + HINSTANCE hInstance; + HICON hIcon; + HCURSOR hCursor; + HBRUSH hbrBackground; + LPCWSTR lpszMenuName; + LPCWSTR lpszClassName; +} WNDCLASSW,*LPWNDCLASSW,*PWNDCLASSW; +typedef struct _WNDCLASSEXA { + UINT cbSize; + UINT style; + WNDPROC lpfnWndProc; + int cbClsExtra; + int cbWndExtra; + HINSTANCE hInstance; + HICON hIcon; + HCURSOR hCursor; + HBRUSH hbrBackground; + LPCSTR lpszMenuName; + LPCSTR lpszClassName; + HICON hIconSm; +} WNDCLASSEXA,*LPWNDCLASSEXA,*PWNDCLASSEXA; +typedef struct _WNDCLASSEXW { + UINT cbSize; + UINT style; + WNDPROC lpfnWndProc; + int cbClsExtra; + int cbWndExtra; + HINSTANCE hInstance; + HICON hIcon; + HCURSOR hCursor; + HBRUSH hbrBackground; + LPCWSTR lpszMenuName; + LPCWSTR lpszClassName; + HICON hIconSm; +} WNDCLASSEXW,*LPWNDCLASSEXW,*PWNDCLASSEXW; +typedef struct tagMENUITEMINFOA { + UINT cbSize; + UINT fMask; + UINT fType; + UINT fState; + UINT wID; + HMENU hSubMenu; + HBITMAP hbmpChecked; + HBITMAP hbmpUnchecked; + DWORD dwItemData; + LPSTR dwTypeData; + UINT cch; +#if (_WIN32_WINNT >= 0x0500) + HBITMAP hbmpItem; +#endif +} MENUITEMINFOA,*LPMENUITEMINFOA; +typedef const MENUITEMINFOA *LPCMENUITEMINFOA; +typedef struct tagMENUITEMINFOW { + UINT cbSize; + UINT fMask; + UINT fType; + UINT fState; + UINT wID; + HMENU hSubMenu; + HBITMAP hbmpChecked; + HBITMAP hbmpUnchecked; + DWORD dwItemData; + LPWSTR dwTypeData; + UINT cch; +#if (_WIN32_WINNT >= 0x0500) + HBITMAP hbmpItem; +#endif +} MENUITEMINFOW,*LPMENUITEMINFOW; +typedef const MENUITEMINFOW *LPCMENUITEMINFOW; +typedef struct tagSCROLLINFO { + UINT cbSize; + UINT fMask; + int nMin; + int nMax; + UINT nPage; + int nPos; + int nTrackPos; +} SCROLLINFO,*LPSCROLLINFO; +typedef const SCROLLINFO *LPCSCROLLINFO; +typedef struct _WINDOWPLACEMENT { + UINT length; + UINT flags; + UINT showCmd; + POINT ptMinPosition; + POINT ptMaxPosition; + RECT rcNormalPosition; +} WINDOWPLACEMENT,*LPWINDOWPLACEMENT,*PWINDOWPLACEMENT; +typedef struct { + WORD versionNumber; + WORD offset; +} MENUITEMTEMPLATEHEADER; +typedef struct { + WORD mtOption; + WORD mtID; + WCHAR mtString[1]; +} MENUITEMTEMPLATE; +typedef void MENUTEMPLATE,MENUTEMPLATEA,MENUTEMPLATEW,*LPMENUTEMPLATEA,*LPMENUTEMPLATEW,*LPMENUTEMPLATE; +typedef struct tagHELPINFO { + UINT cbSize; + int iContextType; + int iCtrlId; + HANDLE hItemHandle; + DWORD dwContextId; + POINT MousePos; +} HELPINFO,*LPHELPINFO; +typedef void(CALLBACK *MSGBOXCALLBACK)(LPHELPINFO); +typedef struct { + UINT cbSize; + HWND hwndOwner; + HINSTANCE hInstance; + LPCSTR lpszText; + LPCSTR lpszCaption; + DWORD dwStyle; + LPCSTR lpszIcon; + DWORD dwContextHelpId; + MSGBOXCALLBACK lpfnMsgBoxCallback; + DWORD dwLanguageId; +} MSGBOXPARAMSA,*PMSGBOXPARAMSA,*LPMSGBOXPARAMSA; +typedef struct { + UINT cbSize; + HWND hwndOwner; + HINSTANCE hInstance; + LPCWSTR lpszText; + LPCWSTR lpszCaption; + DWORD dwStyle; + LPCWSTR lpszIcon; + DWORD dwContextHelpId; + MSGBOXCALLBACK lpfnMsgBoxCallback; + DWORD dwLanguageId; +} MSGBOXPARAMSW,*PMSGBOXPARAMSW,*LPMSGBOXPARAMSW; +typedef struct tagUSEROBJECTFLAGS { + BOOL fInherit; + BOOL fReserved; + DWORD dwFlags; +} USEROBJECTFLAGS; +typedef struct tagFILTERKEYS { + UINT cbSize; + DWORD dwFlags; + DWORD iWaitMSec; + DWORD iDelayMSec; + DWORD iRepeatMSec; + DWORD iBounceMSec; +} FILTERKEYS; +typedef struct tagHIGHCONTRASTA { + UINT cbSize; + DWORD dwFlags; + LPSTR lpszDefaultScheme; +} HIGHCONTRASTA,*LPHIGHCONTRASTA; +typedef struct tagHIGHCONTRASTW { + UINT cbSize; + DWORD dwFlags; + LPWSTR lpszDefaultScheme; +} HIGHCONTRASTW,*LPHIGHCONTRASTW; +#ifndef NOGDI +typedef struct tagICONMETRICSA { + UINT cbSize; + int iHorzSpacing; + int iVertSpacing; + int iTitleWrap; + LOGFONTA lfFont; +} ICONMETRICSA,*LPICONMETRICSA; +typedef struct tagICONMETRICSW { + UINT cbSize; + int iHorzSpacing; + int iVertSpacing; + int iTitleWrap; + LOGFONTW lfFont; +} ICONMETRICSW,*LPICONMETRICSW; +#endif /* NOGDI */ +typedef struct tagMINIMIZEDMETRICS { + UINT cbSize; + int iWidth; + int iHorzGap; + int iVertGap; + int iArrange; +} MINIMIZEDMETRICS,*LPMINIMIZEDMETRICS; +typedef struct tagMOUSEKEYS{ + UINT cbSize; + DWORD dwFlags; + DWORD iMaxSpeed; + DWORD iTimeToMaxSpeed; + DWORD iCtrlSpeed; + DWORD dwReserved1; + DWORD dwReserved2; +} MOUSEKEYS,*LPMOUSEKEYS; +#ifndef NOGDI +typedef struct tagNONCLIENTMETRICSA { + UINT cbSize; + int iBorderWidth; + int iScrollWidth; + int iScrollHeight; + int iCaptionWidth; + int iCaptionHeight; + LOGFONTA lfCaptionFont; + int iSmCaptionWidth; + int iSmCaptionHeight; + LOGFONTA lfSmCaptionFont; + int iMenuWidth; + int iMenuHeight; + LOGFONTA lfMenuFont; + LOGFONTA lfStatusFont; + LOGFONTA lfMessageFont; +} NONCLIENTMETRICSA,*LPNONCLIENTMETRICSA; +typedef struct tagNONCLIENTMETRICSW { + UINT cbSize; + int iBorderWidth; + int iScrollWidth; + int iScrollHeight; + int iCaptionWidth; + int iCaptionHeight; + LOGFONTW lfCaptionFont; + int iSmCaptionWidth; + int iSmCaptionHeight; + LOGFONTW lfSmCaptionFont; + int iMenuWidth; + int iMenuHeight; + LOGFONTW lfMenuFont; + LOGFONTW lfStatusFont; + LOGFONTW lfMessageFont; +} NONCLIENTMETRICSW,*LPNONCLIENTMETRICSW; +#endif +typedef struct tagSERIALKEYSA { + UINT cbSize; + DWORD dwFlags; + LPSTR lpszActivePort; + LPSTR lpszPort; + UINT iBaudRate; + UINT iPortState; + UINT iActive; +} SERIALKEYSA,*LPSERIALKEYSA; +typedef struct tagSERIALKEYSW { + UINT cbSize; + DWORD dwFlags; + LPWSTR lpszActivePort; + LPWSTR lpszPort; + UINT iBaudRate; + UINT iPortState; + UINT iActive; +} SERIALKEYSW,*LPSERIALKEYSW; +typedef struct tagSOUNDSENTRYA { + UINT cbSize; + DWORD dwFlags; + DWORD iFSTextEffect; + DWORD iFSTextEffectMSec; + DWORD iFSTextEffectColorBits; + DWORD iFSGrafEffect; + DWORD iFSGrafEffectMSec; + DWORD iFSGrafEffectColor; + DWORD iWindowsEffect; + DWORD iWindowsEffectMSec; + LPSTR lpszWindowsEffectDLL; + DWORD iWindowsEffectOrdinal; +} SOUNDSENTRYA,*LPSOUNDSENTRYA; +typedef struct tagSOUNDSENTRYW { + UINT cbSize; + DWORD dwFlags; + DWORD iFSTextEffect; + DWORD iFSTextEffectMSec; + DWORD iFSTextEffectColorBits; + DWORD iFSGrafEffect; + DWORD iFSGrafEffectMSec; + DWORD iFSGrafEffectColor; + DWORD iWindowsEffect; + DWORD iWindowsEffectMSec; + LPWSTR lpszWindowsEffectDLL; + DWORD iWindowsEffectOrdinal; +} SOUNDSENTRYW,*LPSOUNDSENTRYW; +typedef struct tagSTICKYKEYS { + DWORD cbSize; + DWORD dwFlags; +} STICKYKEYS,*LPSTICKYKEYS; +typedef struct tagTOGGLEKEYS { + DWORD cbSize; + DWORD dwFlags; +} TOGGLEKEYS; +typedef struct tagMOUSEHOOKSTRUCT { + POINT pt; + HWND hwnd; + UINT wHitTestCode; + DWORD dwExtraInfo; +} MOUSEHOOKSTRUCT,*LPMOUSEHOOKSTRUCT,*PMOUSEHOOKSTRUCT; +typedef struct tagTRACKMOUSEEVENT { + DWORD cbSize; + DWORD dwFlags; + HWND hwndTrack; + DWORD dwHoverTime; +} TRACKMOUSEEVENT,*LPTRACKMOUSEEVENT; +typedef struct tagTPMPARAMS { + UINT cbSize; + RECT rcExclude; +} TPMPARAMS,*LPTPMPARAMS; +typedef struct tagEVENTMSG { + UINT message; + UINT paramL; + UINT paramH; + DWORD time; + HWND hwnd; +} EVENTMSG,*PEVENTMSGMSG,*LPEVENTMSGMSG,*PEVENTMSG,*LPEVENTMSG; +typedef struct _WINDOWPOS { + HWND hwnd; + HWND hwndInsertAfter; + int x; + int y; + int cx; + int cy; + UINT flags; +} WINDOWPOS,*PWINDOWPOS,*LPWINDOWPOS; +typedef struct tagNCCALCSIZE_PARAMS { + RECT rgrc[3]; + PWINDOWPOS lppos; +} NCCALCSIZE_PARAMS, *LPNCCALCSIZE_PARAMS; +typedef struct tagMDICREATESTRUCTA { + LPCSTR szClass; + LPCSTR szTitle; + HANDLE hOwner; + int x; + int y; + int cx; + int cy; + DWORD style; + LPARAM lParam; +} MDICREATESTRUCTA,*LPMDICREATESTRUCTA; +typedef struct tagMDICREATESTRUCTW { + LPCWSTR szClass; + LPCWSTR szTitle; + HANDLE hOwner; + int x; + int y; + int cx; + int cy; + DWORD style; + LPARAM lParam; +} MDICREATESTRUCTW,*LPMDICREATESTRUCTW; +typedef struct tagMINMAXINFO { + POINT ptReserved; + POINT ptMaxSize; + POINT ptMaxPosition; + POINT ptMinTrackSize; + POINT ptMaxTrackSize; +} MINMAXINFO,*PMINMAXINFO,*LPMINMAXINFO; +typedef struct tagMDINEXTMENU { + HMENU hmenuIn; + HMENU hmenuNext; + HWND hwndNext; +} MDINEXTMENU,*PMDINEXTMENU,*LPMDINEXTMENU; +typedef struct tagMEASUREITEMSTRUCT { + UINT CtlType; + UINT CtlID; + UINT itemID; + UINT itemWidth; + UINT itemHeight; + DWORD itemData; +} MEASUREITEMSTRUCT,*PMEASUREITEMSTRUCT,*LPMEASUREITEMSTRUCT; +typedef struct tagDROPSTRUCT { + HWND hwndSource; + HWND hwndSink; + DWORD wFmt; + DWORD dwData; + POINT ptDrop; + DWORD dwControlData; +} DROPSTRUCT,*PDROPSTRUCT,*LPDROPSTRUCT; +typedef DWORD HELPPOLY; +typedef struct tagMULTIKEYHELPA { + DWORD mkSize; + CHAR mkKeylist; + CHAR szKeyphrase[1]; +} MULTIKEYHELPA,*PMULTIKEYHELPA,*LPMULTIKEYHELPA; +typedef struct tagMULTIKEYHELPW { + DWORD mkSize; + WCHAR mkKeylist; + WCHAR szKeyphrase[1]; +} MULTIKEYHELPW,*PMULTIKEYHELPW,*LPMULTIKEYHELPW; +typedef struct tagHELPWININFOA { + int wStructSize; + int x; + int y; + int dx; + int dy; + int wMax; + CHAR rgchMember[2]; +} HELPWININFOA,*PHELPWININFOA,*LPHELPWININFOA; +typedef struct tagHELPWININFOW { + int wStructSize; + int x; + int y; + int dx; + int dy; + int wMax; + WCHAR rgchMember[2]; +} HELPWININFOW,*PHELPWININFOW,*LPHELPWININFOW; +typedef struct tagSTYLESTRUCT { + DWORD styleOld; + DWORD styleNew; +} STYLESTRUCT,*LPSTYLESTRUCT; +typedef struct tagALTTABINFO { + DWORD cbSize; + int cItems; + int cColumns; + int cRows; + int iColFocus; + int iRowFocus; + int cxItem; + int cyItem; + POINT ptStart; +} ALTTABINFO,*PALTTABINFO,*LPALTTABINFO; +typedef struct tagCOMBOBOXINFO { + DWORD cbSize; + RECT rcItem; + RECT rcButton; + DWORD stateButton; + HWND hwndCombo; + HWND hwndItem; + HWND hwndList; +} COMBOBOXINFO,*PCOMBOBOXINFO,*LPCOMBOBOXINFO; +typedef struct tagCURSORINFO { + DWORD cbSize; + DWORD flags; + HCURSOR hCursor; + POINT ptScreenPos; +} CURSORINFO,*PCURSORINFO,*LPCURSORINFO; +typedef struct tagMENUBARINFO { + DWORD cbSize; + RECT rcBar; + HMENU hMenu; + HWND hwndMenu; + BOOL fBarFocused:1; + BOOL fFocused:1; +} MENUBARINFO,*PMENUBARINFO; +typedef struct tagMENUINFO { + DWORD cbSize; + DWORD fMask; + DWORD dwStyle; + UINT cyMax; + HBRUSH hbrBack; + DWORD dwContextHelpID; + ULONG_PTR dwMenuData; +} MENUINFO,*LPMENUINFO; +typedef MENUINFO CONST *LPCMENUINFO; +#define CCHILDREN_SCROLLBAR 5 +typedef struct tagSCROLLBARINFO { + DWORD cbSize; + RECT rcScrollBar; + int dxyLineButton; + int xyThumbTop; + int xyThumbBottom; + int reserved; + DWORD rgstate[CCHILDREN_SCROLLBAR+1]; +} SCROLLBARINFO,*PSCROLLBARINFO,*LPSCROLLBARINFO; +#define CCHILDREN_TITLEBAR 5 +typedef struct tagTITLEBARINFO { + DWORD cbSize; + RECT rcTitleBar; + DWORD rgstate[CCHILDREN_TITLEBAR+1]; +} TITLEBARINFO,*PTITLEBARINFO,*LPTITLEBARINFO; +typedef struct tagWINDOWINFO { + DWORD cbSize; + RECT rcWindow; + RECT rcClient; + DWORD dwStyle; + DWORD dwExStyle; + DWORD dwWindowStatus; + UINT cxWindowBorders; + UINT cyWindowBorders; + ATOM atomWindowType; + WORD wCreatorVersion; +} WINDOWINFO,*PWINDOWINFO,*LPWINDOWINFO; +typedef struct tagLASTINPUTINFO { + UINT cbSize; + DWORD dwTime; +} LASTINPUTINFO,*PLASTINPUTINFO; +typedef struct tagMONITORINFO { + DWORD cbSize; + RECT rcMonitor; + RECT rcWork; + DWORD dwFlags; +} MONITORINFO,*LPMONITORINFO; +#define CCHDEVICENAME 32 +typedef struct tagMONITORINFOEXA { + DWORD cbSize; + RECT rcMonitor; + RECT rcWork; + DWORD dwFlags; + CHAR szDevice[CCHDEVICENAME]; +} MONITORINFOEXA,*LPMONITORINFOEXA; +typedef struct tagMONITORINFOEXW { + DWORD cbSize; + RECT rcMonitor; + RECT rcWork; + DWORD dwFlags; + WCHAR szDevice[CCHDEVICENAME]; +} MONITORINFOEXW,*LPMONITORINFOEXW; +typedef struct tagKBDLLHOOKSTRUCT { + DWORD vkCode; + DWORD scanCode; + DWORD flags; + DWORD time; + DWORD dwExtraInfo; +} KBDLLHOOKSTRUCT,*LPKBDLLHOOKSTRUCT,*PKBDLLHOOKSTRUCT; +#if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0410) +typedef struct { + UINT cbSize; + HWND hwnd; + DWORD dwFlags; + UINT uCount; + DWORD dwTimeout; +} FLASHWINFO,*PFLASHWINFO; +#endif /* (WINVER >= 0x0500 || _WIN32_WINDOWS >= 0x0410) */ +#if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0490) +typedef struct tagMOUSEMOVEPOINT { + int x; + int y; + DWORD time; + ULONG_PTR dwExtraInfo; +} MOUSEMOVEPOINT,*PMOUSEMOVEPOINT,*LPMOUSEMOVEPOINT; +#endif +#if (_WIN32_WINNT >= 0x0403) +typedef struct tagMOUSEINPUT { + LONG dx; + LONG dy; + DWORD mouseData; + DWORD dwFlags; + DWORD time; + ULONG_PTR dwExtraInfo; +} MOUSEINPUT,*PMOUSEINPUT; +typedef struct tagKEYBDINPUT { + WORD wVk; + WORD wScan; + DWORD dwFlags; + DWORD time; + ULONG_PTR dwExtraInfo; +} KEYBDINPUT,*PKEYBDINPUT; +typedef struct tagHARDWAREINPUT { + DWORD uMsg; + WORD wParamL; + WORD wParamH; +} HARDWAREINPUT,*PHARDWAREINPUT; +typedef struct tagINPUT { + DWORD type; + _ANONYMOUS_UNION union { + MOUSEINPUT mi; + KEYBDINPUT ki; + HARDWAREINPUT hi; + } DUMMYUNIONNAME; +} INPUT,*PINPUT,*LPINPUT; +#endif /* (_WIN32_WINNT >= 0x0403) */ +#if (WINVER >= 0x0500) +typedef struct tagGUITHREADINFO { + DWORD cbSize; + DWORD flags; + HWND hwndActive; + HWND hwndFocus; + HWND hwndCapture; + HWND hwndMenuOwner; + HWND hwndMoveSize; + HWND hwndCaret; + RECT rcCaret; +} GUITHREADINFO,*PGUITHREADINFO,*LPGUITHREADINFO; +typedef VOID (*WINEVENTPROC)(HWINEVENTHOOK,DWORD,HWND,LONG,LONG,DWORD,DWORD); +#endif /* (WINVER >= 0x0500) */ +#if (_WIN32_WINNT >= 0x0501) +typedef struct { + UINT cbSize; + HDESK hdesk; + HWND hwnd; + LUID luid; +} BSMINFO,*PBSMINFO; +DECLARE_HANDLE(HRAWINPUT); +typedef struct tagRAWINPUTHEADER { + DWORD dwType; + DWORD dwSize; + HANDLE hDevice; + WPARAM wParam; +} RAWINPUTHEADER,*PRAWINPUTHEADER; +typedef struct tagRAWMOUSE { + USHORT usFlags; + _ANONYMOUS_UNION union { + ULONG ulButtons; + _ANONYMOUS_STRUCT struct { + USHORT usButtonFlags; + USHORT usButtonData; + }; + }; + ULONG ulRawButtons; + LONG lLastX; + LONG lLastY; + ULONG ulExtraInformation; +} RAWMOUSE,*PRAWMOUSE,*LPRAWMOUSE; +typedef struct tagRAWKEYBOARD { + USHORT MakeCode; + USHORT Flags; + USHORT Reserved; + USHORT VKey; + UINT Message; + ULONG ExtraInformation; +} RAWKEYBOARD,*PRAWKEYBOARD,*LPRAWKEYBOARD; +typedef struct tagRAWHID { + DWORD dwSizeHid; + DWORD dwCount; + BYTE bRawData; +} RAWHID,*PRAWHID,*LPRAWHID; +typedef struct tagRAWINPUT { + RAWINPUTHEADER header; + union { + RAWMOUSE mouse; + RAWKEYBOARD keyboard; + RAWHID hid; + } data; +} RAWINPUT,*PRAWINPUT,*LPRAWINPUT; +typedef struct tagRAWINPUTDEVICE { + USHORT usUsagePage; + USHORT usUsage; + DWORD dwFlags; + HWND hwndTarget; +} RAWINPUTDEVICE,*PRAWINPUTDEVICE,*LPRAWINPUTDEVICE; +typedef const RAWINPUTDEVICE *PCRAWINPUTDEVICE; +typedef struct tagRAWINPUTDEVICELIST { + HANDLE hDevice; + DWORD dwType; +} RAWINPUTDEVICELIST,*PRAWINPUTDEVICELIST; +#endif /* (_WIN32_WINNT >= 0x0501) */ + +#define AnsiToOem CharToOemA +#define OemToAnsi OemToCharA +#define AnsiToOemBuff CharToOemBuffA +#define OemToAnsiBuff OemToCharBuffA +#define AnsiUpper CharUpperA +#define AnsiUpperBuff CharUpperBuffA +#define AnsiLower CharLowerA +#define AnsiLowerBuff CharLowerBuffA +#define AnsiNext CharNextA +#define AnsiPrev CharPrevA +#define MAKELPARAM(l,h) ((LPARAM)MAKELONG(l,h)) +#define MAKEWPARAM(l,h) ((WPARAM)MAKELONG(l,h)) +#define MAKELRESULT(l,h) ((LRESULT)MAKELONG(l,h)) +#define POINTSTOPOINT(p,ps) { \ + (p).x=LOWORD(*(DWORD *)&ps); \ + (p).y=HIWORD(*(DWORD *)&ps); \ +} +#define POINTTOPOINTS(p) ((POINTS)MAKELONG((p).x,(p).y)) + +HKL WINAPI ActivateKeyboardLayout(HKL,UINT); +BOOL WINAPI AdjustWindowRect(LPRECT,DWORD,BOOL); +BOOL WINAPI AdjustWindowRectEx(LPRECT,DWORD,BOOL,DWORD); +#if (_WIN32_WINNT >= 0x0500) +BOOL WINAPI AnimateWindow(HWND,DWORD,DWORD); +#endif /* (_WIN32_WINNT >= 0x0500) */ +BOOL WINAPI AnyPopup(void); +BOOL WINAPI AppendMenuA(HMENU,UINT,UINT_PTR,LPCSTR); +BOOL WINAPI AppendMenuW(HMENU,UINT,UINT_PTR,LPCWSTR); +UINT WINAPI ArrangeIconicWindows(HWND); +BOOL WINAPI AttachThreadInput(DWORD,DWORD,BOOL); +HDWP WINAPI BeginDeferWindowPos(int); +HDC WINAPI BeginPaint(HWND,LPPAINTSTRUCT); +BOOL WINAPI BringWindowToTop(HWND); +long WINAPI BroadcastSystemMessage(DWORD,LPDWORD,UINT,WPARAM,LPARAM); +#if (_WIN32_WINNT >= 0x0400) +long WINAPI BroadcastSystemMessageA(DWORD,LPDWORD,UINT,WPARAM,LPARAM); +long WINAPI BroadcastSystemMessageW(DWORD,LPDWORD,UINT,WPARAM,LPARAM); +#endif /* (_WIN32_WINNT >= 0x0400) */ +#if (_WIN32_WINNT >= 0x0501) +long WINAPI BroadcastSystemMessageExA(DWORD,LPDWORD,UINT,WPARAM,LPARAM,PBSMINFO); +long WINAPI BroadcastSystemMessageExW(DWORD,LPDWORD,UINT,WPARAM,LPARAM,PBSMINFO); +#endif /* (_WIN32_WINNT >= 0x0501) */ +BOOL WINAPI CallMsgFilter(PMSG,int); +LRESULT WINAPI CallNextHookEx(HHOOK,int,WPARAM,LPARAM); +LRESULT WINAPI CallWindowProcA(WNDPROC,HWND,UINT,WPARAM,LPARAM); +LRESULT WINAPI CallWindowProcW(WNDPROC,HWND,UINT,WPARAM,LPARAM); +WORD WINAPI CascadeWindows(HWND,UINT,LPCRECT,UINT,const HWND*); +BOOL WINAPI ChangeClipboardChain(HWND,HWND); +#ifndef NOGDI +LONG WINAPI ChangeDisplaySettingsA(PDEVMODEA,DWORD); +LONG WINAPI ChangeDisplaySettingsW(PDEVMODEW,DWORD); +LONG WINAPI ChangeDisplaySettingsExA(LPCSTR,LPDEVMODEA,HWND,DWORD,LPVOID); +LONG WINAPI ChangeDisplaySettingsExW(LPCWSTR,LPDEVMODEW,HWND,DWORD,LPVOID); +#endif +BOOL WINAPI ChangeMenuA(HMENU,UINT,LPCSTR,UINT,UINT); +BOOL WINAPI ChangeMenuW(HMENU,UINT,LPCWSTR,UINT,UINT); +LPSTR WINAPI CharLowerA(LPSTR); +LPWSTR WINAPI CharLowerW(LPWSTR); +DWORD WINAPI CharLowerBuffA(LPSTR,DWORD); +DWORD WINAPI CharLowerBuffW(LPWSTR,DWORD); +LPSTR WINAPI CharNextA(LPCSTR); +LPWSTR WINAPI CharNextW(LPCWSTR); +LPSTR WINAPI CharNextExA(WORD,LPCSTR,DWORD); +LPWSTR WINAPI CharNextExW(WORD,LPCWSTR,DWORD); +LPSTR WINAPI CharPrevA(LPCSTR,LPCSTR); +LPWSTR WINAPI CharPrevW(LPCWSTR,LPCWSTR); +LPSTR WINAPI CharPrevExA(WORD,LPCSTR,LPCSTR,DWORD); +LPWSTR WINAPI CharPrevExW(WORD,LPCWSTR,LPCWSTR,DWORD); +BOOL WINAPI CharToOemA(LPCSTR,LPSTR); +BOOL WINAPI CharToOemW(LPCWSTR,LPSTR); +BOOL WINAPI CharToOemBuffA(LPCSTR,LPSTR,DWORD); +BOOL WINAPI CharToOemBuffW(LPCWSTR,LPSTR,DWORD); +LPSTR WINAPI CharUpperA(LPSTR); +LPWSTR WINAPI CharUpperW(LPWSTR); +DWORD WINAPI CharUpperBuffA(LPSTR,DWORD); +DWORD WINAPI CharUpperBuffW(LPWSTR,DWORD); +BOOL WINAPI CheckDlgButton(HWND,int,UINT); +DWORD WINAPI CheckMenuItem(HMENU,UINT,UINT); +BOOL WINAPI CheckMenuRadioItem(HMENU,UINT,UINT,UINT,UINT); +BOOL WINAPI CheckRadioButton(HWND,int,int,int); +HWND WINAPI ChildWindowFromPoint(HWND,POINT); +HWND WINAPI ChildWindowFromPointEx(HWND,POINT,UINT); +BOOL WINAPI ClientToScreen(HWND,LPPOINT); +BOOL WINAPI ClipCursor(LPCRECT); +BOOL WINAPI CloseClipboard(void); +BOOL WINAPI CloseDesktop(HDESK); +BOOL WINAPI CloseWindow(HWND); +BOOL WINAPI CloseWindowStation(HWINSTA); +int WINAPI CopyAcceleratorTableA(HACCEL,LPACCEL,int); +int WINAPI CopyAcceleratorTableW(HACCEL,LPACCEL,int); +#define CopyCursor(c) ((HCURSOR)CopyIcon((HICON)(c))) +HICON WINAPI CopyIcon(HICON); +HANDLE WINAPI CopyImage(HANDLE,UINT,int,int,UINT); +BOOL WINAPI CopyRect(LPRECT,LPCRECT); +int WINAPI CountClipboardFormats(void); +HACCEL WINAPI CreateAcceleratorTableA(LPACCEL,int); +HACCEL WINAPI CreateAcceleratorTableW(LPACCEL,int); +BOOL WINAPI CreateCaret(HWND,HBITMAP,int,int); +HCURSOR WINAPI CreateCursor(HINSTANCE,int,int,int,int,PCVOID,PCVOID); +#ifndef NOGDI +HDESK WINAPI CreateDesktopA(LPCSTR,LPCSTR,LPDEVMODEA,DWORD,ACCESS_MASK,LPSECURITY_ATTRIBUTES); +HDESK WINAPI CreateDesktopW(LPCWSTR,LPCWSTR,LPDEVMODEW,DWORD,ACCESS_MASK,LPSECURITY_ATTRIBUTES); +#endif +#define CreateDialogA(h,n,w,f) CreateDialogParamA(h,n,w,f,0) +#define CreateDialogW(h,n,w,f) CreateDialogParamW(h,n,w,f,0) +#define CreateDialogIndirectA(h,t,w,f) CreateDialogIndirectParamA(h,t,w,f,0) +#define CreateDialogIndirectW(h,t,w,f) CreateDialogIndirectParamW(h,t,w,f,0) +HWND WINAPI CreateDialogIndirectParamA(HINSTANCE,LPCDLGTEMPLATE,HWND,DLGPROC,LPARAM); +HWND WINAPI CreateDialogIndirectParamW(HINSTANCE,LPCDLGTEMPLATE,HWND,DLGPROC,LPARAM); +HWND WINAPI CreateDialogParamA(HINSTANCE,LPCSTR,HWND,DLGPROC,LPARAM); +HWND WINAPI CreateDialogParamW(HINSTANCE,LPCWSTR,HWND,DLGPROC,LPARAM); +HICON WINAPI CreateIcon(HINSTANCE,int,int,BYTE,BYTE,const BYTE*,const BYTE*); +HICON WINAPI CreateIconFromResource(PBYTE,DWORD,BOOL,DWORD); +HICON WINAPI CreateIconFromResourceEx(PBYTE,DWORD,BOOL,DWORD,int,int,UINT); +HICON WINAPI CreateIconIndirect(PICONINFO); +HWND WINAPI CreateMDIWindowA(LPCSTR,LPCSTR,DWORD,int,int,int,int,HWND,HINSTANCE,LPARAM); +HWND WINAPI CreateMDIWindowW(LPCWSTR,LPCWSTR,DWORD,int,int,int,int,HWND,HINSTANCE,LPARAM); +HMENU WINAPI CreateMenu(void); +HMENU WINAPI CreatePopupMenu(void); +#define CreateWindowA(a,b,c,d,e,f,g,h,i,j,k) CreateWindowExA(0,a,b,c,d,e,f,g,h,i,j,k) +#define CreateWindowW(a,b,c,d,e,f,g,h,i,j,k) CreateWindowExW(0,a,b,c,d,e,f,g,h,i,j,k) +HWND WINAPI CreateWindowExA(DWORD,LPCSTR,LPCSTR,DWORD,int,int,int,int,HWND,HMENU,HINSTANCE,LPVOID); +HWND WINAPI CreateWindowExW(DWORD,LPCWSTR,LPCWSTR,DWORD,int,int,int,int,HWND,HMENU,HINSTANCE,LPVOID); +HWINSTA WINAPI CreateWindowStationA(LPSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES); +HWINSTA WINAPI CreateWindowStationW(LPWSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES); +LRESULT WINAPI DefDlgProcA(HWND,UINT,WPARAM,LPARAM); +LRESULT WINAPI DefDlgProcW(HWND,UINT,WPARAM,LPARAM); +HDWP WINAPI DeferWindowPos(HDWP,HWND,HWND,int,int,int,int,UINT); +LRESULT WINAPI DefFrameProcA(HWND,HWND,UINT,WPARAM,LPARAM); +LRESULT WINAPI DefFrameProcW(HWND,HWND,UINT,WPARAM,LPARAM); +#define DefHookProc(c,p,lp,h) CallNextHookEx((HHOOK)*h,c,p,lp) +LRESULT WINAPI DefMDIChildProcA(HWND,UINT,WPARAM,LPARAM); +LRESULT WINAPI DefMDIChildProcW(HWND,UINT,WPARAM,LPARAM); +#if (_WIN32_WINNT >= 0x0501) +LRESULT WINAPI DefRawInputProc(PRAWINPUT*,INT,UINT); +#endif +LRESULT WINAPI DefWindowProcA(HWND,UINT,WPARAM,LPARAM); +LRESULT WINAPI DefWindowProcW(HWND,UINT,WPARAM,LPARAM); +BOOL WINAPI DeleteMenu(HMENU,UINT,UINT); +BOOL WINAPI DeregisterShellHookWindow(HWND); +BOOL WINAPI DestroyAcceleratorTable(HACCEL); +BOOL WINAPI DestroyCaret(void); +BOOL WINAPI DestroyCursor(HCURSOR); +BOOL WINAPI DestroyIcon(HICON); +BOOL WINAPI DestroyMenu(HMENU); +BOOL WINAPI DestroyWindow(HWND); +#define DialogBoxA(i,t,p,f) DialogBoxParamA(i,t,p,f,0) +#define DialogBoxW(i,t,p,f) DialogBoxParamW(i,t,p,f,0) +#define DialogBoxIndirectA(i,t,p,f) DialogBoxIndirectParamA(i,t,p,f,0) +#define DialogBoxIndirectW(i,t,p,f) DialogBoxIndirectParamW(i,t,p,f,0) +int WINAPI DialogBoxIndirectParamA(HINSTANCE,LPCDLGTEMPLATE,HWND,DLGPROC,LPARAM); +int WINAPI DialogBoxIndirectParamW(HINSTANCE,LPCDLGTEMPLATE,HWND,DLGPROC,LPARAM); +int WINAPI DialogBoxParamA(HINSTANCE,LPCSTR,HWND,DLGPROC,LPARAM); +int WINAPI DialogBoxParamW(HINSTANCE,LPCWSTR,HWND,DLGPROC,LPARAM); +LONG WINAPI DispatchMessageA(const MSG*); +LONG WINAPI DispatchMessageW(const MSG*); +int WINAPI DlgDirListA(HWND,LPSTR,int,int,UINT); +int WINAPI DlgDirListW(HWND,LPWSTR,int,int,UINT); +int WINAPI DlgDirListComboBoxA(HWND,LPSTR,int,int,UINT); +int WINAPI DlgDirListComboBoxW(HWND,LPWSTR,int,int,UINT); +BOOL WINAPI DlgDirSelectComboBoxExA(HWND,LPSTR,int,int); +BOOL WINAPI DlgDirSelectComboBoxExW(HWND,LPWSTR,int,int); +BOOL WINAPI DlgDirSelectExA(HWND,LPSTR,int,int); +BOOL WINAPI DlgDirSelectExW(HWND,LPWSTR,int,int); +BOOL WINAPI DragDetect(HWND,POINT); +DWORD WINAPI DragObject(HWND,HWND,UINT,DWORD,HCURSOR); +BOOL WINAPI DrawAnimatedRects(HWND,int,LPCRECT,LPCRECT); +BOOL WINAPI DrawCaption(HWND,HDC,LPCRECT,UINT); +BOOL WINAPI DrawEdge(HDC,LPRECT,UINT,UINT); +BOOL WINAPI DrawFocusRect(HDC,LPCRECT); +BOOL WINAPI DrawFrameControl(HDC,LPRECT,UINT,UINT); +BOOL WINAPI DrawIcon(HDC,int,int,HICON); +BOOL WINAPI DrawIconEx(HDC,int,int,HICON,int,int,UINT,HBRUSH,UINT); +BOOL WINAPI DrawMenuBar(HWND); +BOOL WINAPI DrawStateA(HDC,HBRUSH,DRAWSTATEPROC,LPARAM,WPARAM,int,int,int,int,UINT); +BOOL WINAPI DrawStateW(HDC,HBRUSH,DRAWSTATEPROC,LPARAM,WPARAM,int,int,int,int,UINT); +int WINAPI DrawTextA(HDC,LPCSTR,int,LPRECT,UINT); +int WINAPI DrawTextW(HDC,LPCWSTR,int,LPRECT,UINT); +int WINAPI DrawTextExA(HDC,LPSTR,int,LPRECT,UINT,LPDRAWTEXTPARAMS); +int WINAPI DrawTextExW(HDC,LPWSTR,int,LPRECT,UINT,LPDRAWTEXTPARAMS); +BOOL WINAPI EmptyClipboard(void); +BOOL WINAPI EnableMenuItem(HMENU,UINT,UINT); +BOOL WINAPI EnableScrollBar(HWND,UINT,UINT); +BOOL WINAPI EnableWindow(HWND,BOOL); +BOOL WINAPI EndDeferWindowPos(HDWP); +BOOL WINAPI EndDialog(HWND,int); +BOOL WINAPI EndMenu(void); +BOOL WINAPI EndPaint(HWND,const PAINTSTRUCT*); +#if (_WIN32_WINNT >= 0x0500) +BOOL WINAPI EndTask(HWND,BOOL,BOOL); +#endif +BOOL WINAPI EnumChildWindows(HWND,ENUMWINDOWSPROC,LPARAM); +UINT WINAPI EnumClipboardFormats(UINT); +BOOL WINAPI EnumDesktopsA(HWINSTA,DESKTOPENUMPROCA,LPARAM); +BOOL WINAPI EnumDesktopsW(HWINSTA,DESKTOPENUMPROCW,LPARAM); +BOOL WINAPI EnumDesktopWindows(HDESK,ENUMWINDOWSPROC,LPARAM); +BOOL WINAPI EnumDisplayMonitors(HDC,LPCRECT,MONITORENUMPROC,LPARAM); +#ifndef NOGDI +BOOL WINAPI EnumDisplaySettingsA(LPCSTR,DWORD,PDEVMODEA); +BOOL WINAPI EnumDisplaySettingsW(LPCWSTR,DWORD,PDEVMODEW); +#if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0410) +BOOL WINAPI EnumDisplaySettingsExA(LPCSTR,DWORD,LPDEVMODEA,DWORD); +BOOL WINAPI EnumDisplaySettingsExW(LPCWSTR,DWORD,LPDEVMODEW,DWORD); +#endif +BOOL WINAPI EnumDisplayDevicesA(LPCSTR,DWORD,PDISPLAY_DEVICEA,DWORD); +BOOL WINAPI EnumDisplayDevicesW(LPCWSTR,DWORD,PDISPLAY_DEVICEW,DWORD); +#endif +int WINAPI EnumPropsA(HWND,PROPENUMPROCA); +int WINAPI EnumPropsW(HWND,PROPENUMPROCW); +int WINAPI EnumPropsExA(HWND,PROPENUMPROCEXA,LPARAM); +int WINAPI EnumPropsExW(HWND,PROPENUMPROCEXW,LPARAM); +#define EnumTaskWindows(h,f,p) EnumThreadWindows((DWORD)h,f,p) +BOOL WINAPI EnumThreadWindows(DWORD,WNDENUMPROC,LPARAM); +BOOL WINAPI EnumWindows(WNDENUMPROC,LPARAM); +BOOL WINAPI EnumWindowStationsA(WINSTAENUMPROCA,LPARAM); +BOOL WINAPI EnumWindowStationsW(WINSTAENUMPROCW,LPARAM); +BOOL WINAPI EqualRect(LPCRECT,LPCRECT); +#define ExitWindows(r,c) ExitWindowsEx(EWX_LOGOFF,0) +BOOL WINAPI ExitWindowsEx(UINT,DWORD); +HWND WINAPI FindWindowA(LPCSTR,LPCSTR); +HWND WINAPI FindWindowExA(HWND,HWND,LPCSTR,LPCSTR); +HWND WINAPI FindWindowExW(HWND,HWND,LPCWSTR,LPCWSTR); +HWND WINAPI FindWindowW(LPCWSTR,LPCWSTR); +BOOL WINAPI FlashWindow(HWND,BOOL); +#if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0410) +BOOL WINAPI FlashWindowEx(PFLASHWINFO); +#endif +int WINAPI FrameRect(HDC,LPCRECT,HBRUSH); +BOOL WINAPI FrameRgn(HDC,HRGN,HBRUSH,int,int); +HWND WINAPI GetActiveWindow(void); +HWND WINAPI GetAncestor(HWND,UINT); +SHORT WINAPI GetAsyncKeyState(int); +HWND WINAPI GetCapture(void); +UINT WINAPI GetCaretBlinkTime(void); +BOOL WINAPI GetCaretPos(LPPOINT); +BOOL WINAPI GetClassInfoA(HINSTANCE,LPCSTR,LPWNDCLASSA); +BOOL WINAPI GetClassInfoExA(HINSTANCE,LPCSTR,LPWNDCLASSEXA); +BOOL WINAPI GetClassInfoW(HINSTANCE,LPCWSTR,LPWNDCLASSW); +BOOL WINAPI GetClassInfoExW(HINSTANCE,LPCWSTR,LPWNDCLASSEXW); +DWORD WINAPI GetClassLongA(HWND,int); +DWORD WINAPI GetClassLongW(HWND,int); +int WINAPI GetClassNameA(HWND,LPSTR,int); +int WINAPI GetClassNameW(HWND,LPWSTR,int); +WORD WINAPI GetClassWord(HWND,int); +BOOL WINAPI GetClientRect(HWND,LPRECT); +HANDLE WINAPI GetClipboardData(UINT); +int WINAPI GetClipboardFormatNameA(UINT,LPSTR,int); +int WINAPI GetClipboardFormatNameW(UINT,LPWSTR,int); +HWND WINAPI GetClipboardOwner(void); +#if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0410) +DWORD WINAPI GetClipboardSequenceNumber(void); +#endif +HWND WINAPI GetClipboardViewer(void); +BOOL WINAPI GetClipCursor(LPRECT); +BOOL WINAPI GetCursorPos(LPPOINT); +HDC WINAPI GetDC(HWND); +HDC WINAPI GetDCEx(HWND,HRGN,DWORD); +HWND WINAPI GetDesktopWindow(void); +long WINAPI GetDialogBaseUnits(void); +int WINAPI GetDlgCtrlID(HWND); +HWND WINAPI GetDlgItem(HWND,int); +UINT WINAPI GetDlgItemInt(HWND,int,PBOOL,BOOL); +UINT WINAPI GetDlgItemTextA(HWND,int,LPSTR,int); +UINT WINAPI GetDlgItemTextW(HWND,int,LPWSTR,int); +UINT WINAPI GetDoubleClickTime(void); +HWND WINAPI GetFocus(void); +HWND WINAPI GetForegroundWindow(void); +#if (_WIN32_WINNT >= 0x0500) +DWORD WINAPI GetGuiResources(HANDLE,DWORD); +#endif +BOOL WINAPI GetIconInfo(HICON,PICONINFO); +BOOL WINAPI GetInputState(void); +UINT WINAPI GetKBCodePage(void); +HKL WINAPI GetKeyboardLayout(DWORD); +UINT WINAPI GetKeyboardLayoutList(int,HKL*); +BOOL WINAPI GetKeyboardLayoutNameA(LPSTR); +BOOL WINAPI GetKeyboardLayoutNameW(LPWSTR); +BOOL WINAPI GetKeyboardState(PBYTE); +int WINAPI GetKeyboardType(int); +int WINAPI GetKeyNameTextA(LONG,LPSTR,int); +int WINAPI GetKeyNameTextW(LONG,LPWSTR,int); +SHORT WINAPI GetKeyState(int); +HWND WINAPI GetLastActivePopup(HWND); +DWORD WINAPI GetLastError(void); +HMENU WINAPI GetMenu(HWND); +LONG WINAPI GetMenuCheckMarkDimensions(void); +DWORD WINAPI GetMenuContextHelpId(HMENU); +UINT WINAPI GetMenuDefaultItem(HMENU,UINT,UINT); +int WINAPI GetMenuItemCount(HMENU); +UINT WINAPI GetMenuItemID(HMENU,int); +BOOL WINAPI GetMenuItemInfoA(HMENU,UINT,BOOL,LPMENUITEMINFOA); +BOOL WINAPI GetMenuItemInfoW(HMENU,UINT,BOOL,LPMENUITEMINFOW); +BOOL WINAPI GetMenuItemRect(HWND,HMENU,UINT,LPRECT); +UINT WINAPI GetMenuState(HMENU,UINT,UINT); +int WINAPI GetMenuStringA(HMENU,UINT,LPSTR,int,UINT); +int WINAPI GetMenuStringW(HMENU,UINT,LPWSTR,int,UINT); +BOOL WINAPI GetMessageA(LPMSG,HWND,UINT,UINT); +BOOL WINAPI GetMessageW(LPMSG,HWND,UINT,UINT); +LONG WINAPI GetMessageExtraInfo(void); +DWORD WINAPI GetMessagePos(void); +LONG WINAPI GetMessageTime(void); +#if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0490) +int WINAPI GetMouseMovePointsEx(UINT,LPMOUSEMOVEPOINT,LPMOUSEMOVEPOINT,int,DWORD); +#endif +HWND WINAPI GetNextDlgGroupItem(HWND,HWND,BOOL); +HWND WINAPI GetNextDlgTabItem(HWND,HWND,BOOL); +#define GetNextWindow(h,c) GetWindow(h,c) +HWND WINAPI GetOpenClipboardWindow(void); +HWND WINAPI GetParent(HWND); +int WINAPI GetPriorityClipboardFormat(UINT*,int); +HANDLE WINAPI GetPropA(HWND,LPCSTR); +HANDLE WINAPI GetPropW(HWND,LPCWSTR); +#if (_WIN32_WINNT >= 0x0501) +UINT WINAPI GetRawInputBuffer(PRAWINPUT,PUINT,UINT); +UINT WINAPI GetRawInputData(HRAWINPUT,UINT,LPVOID,PUINT,UINT); +UINT WINAPI GetRawInputDeviceInfoA(HANDLE,UINT,LPVOID,PUINT); +UINT WINAPI GetRawInputDeviceInfoW(HANDLE,UINT,LPVOID,PUINT); +UINT WINAPI GetRawInputDeviceList(PRAWINPUTDEVICELIST,PUINT,UINT); +UINT WINAPI GetRegisteredRawInputDevices(PRAWINPUTDEVICE,PUINT,UINT); +#endif +DWORD WINAPI GetQueueStatus(UINT); +BOOL WINAPI GetScrollInfo(HWND,int,LPSCROLLINFO); +int WINAPI GetScrollPos(HWND,int); +BOOL WINAPI GetScrollRange(HWND,int,LPINT,LPINT); +#if (_WIN32_WINNT >= 0x0500) +HWND WINAPI GetShellWindow(void); +#endif +HMENU WINAPI GetSubMenu(HMENU,int); +DWORD WINAPI GetSysColor(int); +HBRUSH WINAPI GetSysColorBrush(int); +#define GetSysModalWindow() (NULL) +HMENU WINAPI GetSystemMenu(HWND,BOOL); +int WINAPI GetSystemMetrics(int); +DWORD WINAPI GetTabbedTextExtentA(HDC,LPCSTR,int,int,LPINT); +DWORD WINAPI GetTabbedTextExtentW(HDC,LPCWSTR,int,int,LPINT); +LONG WINAPI GetWindowLongA(HWND,int); +LONG WINAPI GetWindowLongW(HWND,int); +#ifdef _WIN64 +LONG_PTR WINAPI GetWindowLongPtrA(HWND,int); +LONG_PTR WINAPI GetWindowLongPtrW(HWND,int); +#else +#define GetWindowLongPtrA GetWindowLongA +#define GetWindowLongPtrW GetWindowLongW +#endif +HDESK WINAPI GetThreadDesktop(DWORD); +HWND WINAPI GetTopWindow(HWND); +BOOL WINAPI GetUpdateRect(HWND,LPRECT,BOOL); +int WINAPI GetUpdateRgn(HWND,HRGN,BOOL); +BOOL WINAPI GetUserObjectInformationA(HANDLE,int,PVOID,DWORD,PDWORD); +BOOL WINAPI GetUserObjectInformationW(HANDLE,int,PVOID,DWORD,PDWORD); +BOOL WINAPI GetUserObjectSecurity(HANDLE,PSECURITY_INFORMATION,PSECURITY_DESCRIPTOR,DWORD,PDWORD); +HWND WINAPI GetWindow(HWND,UINT); +DWORD WINAPI GetWindowContextHelpId(HWND); +HDC WINAPI GetWindowDC(HWND); +BOOL WINAPI GetWindowExtEx(HDC,LPSIZE); +BOOL WINAPI GetWindowPlacement(HWND,WINDOWPLACEMENT*); +BOOL WINAPI GetWindowRect(HWND,LPRECT); +int WINAPI GetWindowRgn(HWND,HRGN); +#define GetWindowTask(hWnd) ((HANDLE)GetWindowThreadProcessId(hWnd, NULL)) +int WINAPI GetWindowTextA(HWND,LPSTR,int); +int WINAPI GetWindowTextLengthA(HWND); +int WINAPI GetWindowTextLengthW(HWND); +int WINAPI GetWindowTextW(HWND,LPWSTR,int); +WORD WINAPI GetWindowWord(HWND,int); +BOOL WINAPI GetAltTabInfoA(HWND,int,PALTTABINFO,LPSTR,UINT); +BOOL WINAPI GetAltTabInfoW(HWND,int,PALTTABINFO,LPWSTR,UINT); +BOOL WINAPI GetComboBoxInfo(HWND,PCOMBOBOXINFO); +BOOL WINAPI GetCursorInfo(PCURSORINFO); +#if (WINVER >= 0x0500) +BOOL WINAPI GetGUIThreadInfo(DWORD,LPGUITHREADINFO); +#endif +BOOL WINAPI GetLastInputInfo(PLASTINPUTINFO); +DWORD WINAPI GetListBoxInfo(HWND); +BOOL WINAPI GetMenuBarInfo(HWND,LONG,LONG,PMENUBARINFO); +BOOL WINAPI GetMenuInfo(HMENU,LPMENUINFO); +#if (_WIN32_WINNT >= 0x0500) +BOOL WINAPI GetProcessDefaultLayout(DWORD*); +#endif +BOOL WINAPI GetScrollBarInfo(HWND,LONG,PSCROLLBARINFO); +BOOL WINAPI GetTitleBarInfo(HWND,PTITLEBARINFO); +BOOL WINAPI GetWindowInfo(HWND,PWINDOWINFO); +BOOL WINAPI GetMonitorInfoA(HMONITOR,LPMONITORINFO); +BOOL WINAPI GetMonitorInfoW(HMONITOR,LPMONITORINFO); +UINT WINAPI GetWindowModuleFileNameA(HWND,LPSTR,UINT); +UINT WINAPI GetWindowModuleFileNameW(HWND,LPWSTR,UINT); +BOOL WINAPI GrayStringA(HDC,HBRUSH,GRAYSTRINGPROC,LPARAM,int,int,int,int,int); +BOOL WINAPI GrayStringW(HDC,HBRUSH,GRAYSTRINGPROC,LPARAM,int,int,int,int,int); +BOOL WINAPI HideCaret(HWND); +BOOL WINAPI HiliteMenuItem(HWND,HMENU,UINT,UINT); +BOOL WINAPI InflateRect(LPRECT,int,int); +BOOL WINAPI InSendMessage(void); +#if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0410) +DWORD WINAPI InSendMessageEx(LPVOID); +#endif +BOOL WINAPI InsertMenuA(HMENU,UINT,UINT,UINT,LPCSTR); +BOOL WINAPI InsertMenuW(HMENU,UINT,UINT,UINT,LPCWSTR); +BOOL WINAPI InsertMenuItemA(HMENU,UINT,BOOL,LPCMENUITEMINFOA); +BOOL WINAPI InsertMenuItemW(HMENU,UINT,BOOL,LPCMENUITEMINFOW); +BOOL WINAPI IntersectRect(LPRECT,LPCRECT,LPCRECT); +BOOL WINAPI InvalidateRect(HWND,LPCRECT,BOOL); +BOOL WINAPI InvalidateRgn(HWND,HRGN,BOOL); +BOOL WINAPI InvertRect(HDC,LPCRECT); +BOOL WINAPI IsCharAlphaA(CHAR ch); +BOOL WINAPI IsCharAlphaNumericA(CHAR); +BOOL WINAPI IsCharAlphaNumericW(WCHAR); +BOOL WINAPI IsCharAlphaW(WCHAR); +BOOL WINAPI IsCharLowerA(CHAR); +BOOL WINAPI IsCharLowerW(WCHAR); +BOOL WINAPI IsCharUpperA(CHAR); +BOOL WINAPI IsCharUpperW(WCHAR); +BOOL WINAPI IsChild(HWND,HWND); +BOOL WINAPI IsClipboardFormatAvailable(UINT); +BOOL WINAPI IsDialogMessageA(HWND,LPMSG); +BOOL WINAPI IsDialogMessageW(HWND,LPMSG); +UINT WINAPI IsDlgButtonChecked(HWND,int); +#if(_WIN32_WINNT >= 0x0501) +BOOL WINAPI IsGUIThread(BOOL); +#endif +#if(_WIN32_WINNT >= 0x0500) +BOOL WINAPI IsHungAppWindow(HWND); +#endif +BOOL WINAPI IsIconic(HWND); +BOOL WINAPI IsMenu(HMENU); +BOOL WINAPI IsRectEmpty(LPCRECT); +BOOL WINAPI IsWindow(HWND); +BOOL WINAPI IsWindowEnabled(HWND); +BOOL WINAPI IsWindowUnicode(HWND); +BOOL WINAPI IsWindowVisible(HWND); +#if (_WIN32_WINNT >= 0x0501) +BOOL WINAPI IsWinEventHookInstalled(DWORD); +#endif +BOOL WINAPI IsZoomed(HWND); +VOID WINAPI keybd_event(BYTE,BYTE,DWORD,DWORD); +BOOL WINAPI KillTimer(HWND,UINT); +HACCEL WINAPI LoadAcceleratorsA(HINSTANCE,LPCSTR); +HACCEL WINAPI LoadAcceleratorsW(HINSTANCE,LPCWSTR); +HBITMAP WINAPI LoadBitmapA(HINSTANCE,LPCSTR); +HBITMAP WINAPI LoadBitmapW(HINSTANCE,LPCWSTR); +HCURSOR WINAPI LoadCursorA(HINSTANCE,LPCSTR); +HCURSOR WINAPI LoadCursorFromFileA(LPCSTR); +HCURSOR WINAPI LoadCursorFromFileW(LPCWSTR); +HCURSOR WINAPI LoadCursorW(HINSTANCE,LPCWSTR); +HICON WINAPI LoadIconA(HINSTANCE,LPCSTR); +HICON WINAPI LoadIconW(HINSTANCE,LPCWSTR); +HANDLE WINAPI LoadImageA(HINSTANCE,LPCSTR,UINT,int,int,UINT); +HANDLE WINAPI LoadImageW(HINSTANCE,LPCWSTR,UINT,int,int,UINT); +HKL WINAPI LoadKeyboardLayoutA(LPCSTR,UINT); +HKL WINAPI LoadKeyboardLayoutW(LPCWSTR,UINT); +HMENU WINAPI LoadMenuA(HINSTANCE,LPCSTR); +HMENU WINAPI LoadMenuIndirectA(const MENUTEMPLATE*); +HMENU WINAPI LoadMenuIndirectW(const MENUTEMPLATE*); +HMENU WINAPI LoadMenuW(HINSTANCE,LPCWSTR); +int WINAPI LoadStringA(HINSTANCE,UINT,LPSTR,int); +int WINAPI LoadStringW(HINSTANCE,UINT,LPWSTR,int); +BOOL WINAPI LockWindowUpdate(HWND); +#if (_WIN32_WINNT >= 0x0500) +BOOL WINAPI LockWorkStation(void); +#endif +int WINAPI LookupIconIdFromDirectory(PBYTE,BOOL); +int WINAPI LookupIconIdFromDirectoryEx(PBYTE,BOOL,int,int,UINT); +BOOL WINAPI MapDialogRect(HWND,LPRECT); +UINT WINAPI MapVirtualKeyA(UINT,UINT); +UINT WINAPI MapVirtualKeyExA(UINT,UINT,HKL); +UINT WINAPI MapVirtualKeyExW(UINT,UINT,HKL); +UINT WINAPI MapVirtualKeyW(UINT,UINT); +int WINAPI MapWindowPoints(HWND,HWND,LPPOINT,UINT); +int WINAPI MenuItemFromPoint(HWND,HMENU,POINT); +BOOL WINAPI MessageBeep(UINT); +int WINAPI MessageBoxA(HWND,LPCSTR,LPCSTR,UINT); +int WINAPI MessageBoxW(HWND,LPCWSTR,LPCWSTR,UINT); +int WINAPI MessageBoxExA(HWND,LPCSTR,LPCSTR,UINT,WORD); +int WINAPI MessageBoxExW(HWND,LPCWSTR,LPCWSTR,UINT,WORD); +int WINAPI MessageBoxIndirectA(CONST MSGBOXPARAMSA*); +int WINAPI MessageBoxIndirectW(CONST MSGBOXPARAMSW*); +BOOL WINAPI ModifyMenuA(HMENU,UINT,UINT,UINT,LPCSTR); +BOOL WINAPI ModifyMenuW(HMENU,UINT,UINT,UINT,LPCWSTR); +void WINAPI mouse_event(DWORD,DWORD,DWORD,DWORD,ULONG_PTR); +BOOL WINAPI MoveWindow(HWND,int,int,int,int,BOOL); +DWORD WINAPI MsgWaitForMultipleObjects(DWORD,CONST HANDLE*,BOOL,DWORD,DWORD); +DWORD WINAPI MsgWaitForMultipleObjectsEx(DWORD,CONST HANDLE*,DWORD,DWORD,DWORD); +#if (WINVER >= 0x0500) +void WINAPI NotifyWinEvent(DWORD,HWND,LONG,LONG); +#endif +DWORD WINAPI OemKeyScan(WORD); +BOOL WINAPI OemToCharA(LPCSTR,LPSTR); +BOOL WINAPI OemToCharBuffA(LPCSTR,LPSTR,DWORD); +BOOL WINAPI OemToCharBuffW(LPCSTR,LPWSTR,DWORD); +BOOL WINAPI OemToCharW(LPCSTR,LPWSTR); +BOOL WINAPI OffsetRect(LPRECT,int,int); +BOOL WINAPI OpenClipboard(HWND); +HDESK WINAPI OpenDesktopA(LPSTR,DWORD,BOOL,DWORD); +HDESK WINAPI OpenDesktopW(LPWSTR,DWORD,BOOL,DWORD); +BOOL WINAPI OpenIcon(HWND); +HDESK WINAPI OpenInputDesktop(DWORD,BOOL,DWORD); +HWINSTA WINAPI OpenWindowStationA(LPSTR,BOOL,DWORD); +HWINSTA WINAPI OpenWindowStationW(LPWSTR,BOOL,DWORD); +BOOL WINAPI PaintDesktop(HDC); +BOOL WINAPI PeekMessageA(LPMSG,HWND,UINT,UINT,UINT); +BOOL WINAPI PeekMessageW(LPMSG,HWND,UINT,UINT,UINT); +#define PostAppMessageA(t,m,w,l) PostThreadMessageA((DWORD)t,m,w,l) +#define PostAppMessageW(t,m,w,l) PostThreadMessageW((DWORD)t,m,w,l) +BOOL WINAPI PostMessageA(HWND,UINT,WPARAM,LPARAM); +BOOL WINAPI PostMessageW(HWND,UINT,WPARAM,LPARAM); +void WINAPI PostQuitMessage(int); +BOOL WINAPI PostThreadMessageA(DWORD,UINT,WPARAM,LPARAM); +BOOL WINAPI PostThreadMessageW(DWORD,UINT,WPARAM,LPARAM); +#if (_WIN32_WINNT >= 0x0501) +BOOL WINAPI PrintWindow(HWND,HDC,UINT); +#endif +BOOL WINAPI PtInRect(LPCRECT,POINT); +HWND WINAPI RealChildWindowFromPoint(HWND,POINT); +UINT WINAPI RealGetWindowClassA(HWND,LPSTR,UINT); +UINT WINAPI RealGetWindowClassW(HWND,LPWSTR,UINT); +BOOL WINAPI RedrawWindow(HWND,LPCRECT,HRGN,UINT); +ATOM WINAPI RegisterClassA(CONST WNDCLASSA*); +ATOM WINAPI RegisterClassW(CONST WNDCLASSW*); +ATOM WINAPI RegisterClassExA(CONST WNDCLASSEXA*); +ATOM WINAPI RegisterClassExW(CONST WNDCLASSEXW*); +UINT WINAPI RegisterClipboardFormatA(LPCSTR); +UINT WINAPI RegisterClipboardFormatW(LPCWSTR); +#if (WINVER >= 0x0500) +HDEVNOTIFY WINAPI RegisterDeviceNotificationA(HANDLE,LPVOID,DWORD); +HDEVNOTIFY WINAPI RegisterDeviceNotificationW(HANDLE,LPVOID,DWORD); +#endif +BOOL WINAPI RegisterHotKey(HWND,int,UINT,UINT); +#if (_WIN32_WINNT >= 0x0501) +BOOL WINAPI RegisterRawInputDevices(PCRAWINPUTDEVICE,UINT,UINT); +#endif +UINT WINAPI RegisterWindowMessageA(LPCSTR); +UINT WINAPI RegisterWindowMessageW(LPCWSTR); +BOOL WINAPI ReleaseCapture(void); +int WINAPI ReleaseDC(HWND,HDC); +BOOL WINAPI RemoveMenu(HMENU,UINT,UINT); +HANDLE WINAPI RemovePropA(HWND,LPCSTR); +HANDLE WINAPI RemovePropW(HWND,LPCWSTR); +BOOL WINAPI ReplyMessage(LRESULT); +BOOL WINAPI ScreenToClient(HWND,LPPOINT); +BOOL WINAPI ScrollDC(HDC,int,int,LPCRECT,LPCRECT,HRGN,LPRECT); +BOOL WINAPI ScrollWindow(HWND,int,int,LPCRECT,LPCRECT); +int WINAPI ScrollWindowEx(HWND,int,int,LPCRECT,LPCRECT,HRGN,LPRECT,UINT); +LONG WINAPI SendDlgItemMessageA(HWND,int,UINT,WPARAM,LPARAM); +LONG WINAPI SendDlgItemMessageW(HWND,int,UINT,WPARAM,LPARAM); +#if (_WIN32_WINNT >= 0x0403) +UINT WINAPI SendInput(UINT,LPINPUT,int); +#endif +LRESULT WINAPI SendMessageA(HWND,UINT,WPARAM,LPARAM); +BOOL WINAPI SendMessageCallbackA(HWND,UINT,WPARAM,LPARAM,SENDASYNCPROC,DWORD); +BOOL WINAPI SendMessageCallbackW(HWND,UINT,WPARAM,LPARAM,SENDASYNCPROC,DWORD); +LRESULT WINAPI SendMessageTimeoutA(HWND,UINT,WPARAM,LPARAM,UINT,UINT,PDWORD); +LRESULT WINAPI SendMessageTimeoutW(HWND,UINT,WPARAM,LPARAM,UINT,UINT,PDWORD); +LRESULT WINAPI SendMessageW(HWND,UINT,WPARAM,LPARAM); +BOOL WINAPI SendNotifyMessageA(HWND,UINT,WPARAM,LPARAM); +BOOL WINAPI SendNotifyMessageW(HWND,UINT,WPARAM,LPARAM); +HWND WINAPI SetActiveWindow(HWND); +HWND WINAPI SetCapture(HWND hWnd); +BOOL WINAPI SetCaretBlinkTime(UINT); +BOOL WINAPI SetCaretPos(int,int); +DWORD WINAPI SetClassLongA(HWND,int,LONG); +DWORD WINAPI SetClassLongW(HWND,int,LONG); +WORD WINAPI SetClassWord(HWND,int,WORD); +HANDLE WINAPI SetClipboardData(UINT,HANDLE); +HWND WINAPI SetClipboardViewer(HWND); +HCURSOR WINAPI SetCursor(HCURSOR); +BOOL WINAPI SetCursorPos(int,int); +VOID WINAPI SetDebugErrorLevel(DWORD); +BOOL WINAPI SetDlgItemInt(HWND,int,UINT,BOOL); +BOOL WINAPI SetDlgItemTextA(HWND,int,LPCSTR); +BOOL WINAPI SetDlgItemTextW(HWND,int,LPCWSTR); +BOOL WINAPI SetDoubleClickTime(UINT); +HWND WINAPI SetFocus(HWND); +BOOL WINAPI SetForegroundWindow(HWND); +BOOL WINAPI SetKeyboardState(PBYTE); +BOOL WINAPI SetMenu(HWND,HMENU); +BOOL WINAPI SetMenuContextHelpId(HMENU,DWORD); +BOOL WINAPI SetMenuDefaultItem(HMENU,UINT,UINT); +BOOL WINAPI SetMenuInfo(HMENU,LPCMENUINFO); +BOOL WINAPI SetMenuItemBitmaps(HMENU,UINT,UINT,HBITMAP,HBITMAP); +BOOL WINAPI SetMenuItemInfoA(HMENU,UINT,BOOL,LPCMENUITEMINFOA); +BOOL WINAPI SetMenuItemInfoW( HMENU,UINT,BOOL,LPCMENUITEMINFOW); +LPARAM WINAPI SetMessageExtraInfo(LPARAM); +BOOL WINAPI SetMessageQueue(int); +HWND WINAPI SetParent(HWND,HWND); +#if (_WIN32_WINNT >= 0x0500) +BOOL WINAPI SetProcessDefaultLayout(DWORD); +#endif /* (_WIN32_WINNT >= 0x0500) */ +BOOL WINAPI SetProcessWindowStation(HWINSTA); +BOOL WINAPI SetPropA(HWND,LPCSTR,HANDLE); +BOOL WINAPI SetPropW(HWND,LPCWSTR,HANDLE); +BOOL WINAPI SetRect(LPRECT,int,int,int,int); +BOOL WINAPI SetRectEmpty(LPRECT); +int WINAPI SetScrollInfo(HWND,int,LPCSCROLLINFO,BOOL); +int WINAPI SetScrollPos(HWND,int,int,BOOL); +BOOL WINAPI SetScrollRange(HWND,int,int,int,BOOL); +BOOL WINAPI SetSysColors(int,const INT *,const COLORREF *); +#define SetSysModalWindow(h) (NULL) +BOOL WINAPI SetSystemCursor(HCURSOR,DWORD); +BOOL WINAPI SetThreadDesktop(HDESK); +UINT WINAPI SetTimer(HWND,UINT,UINT,TIMERPROC); +BOOL WINAPI SetUserObjectInformationA(HANDLE,int,PVOID,DWORD); +BOOL WINAPI SetUserObjectInformationW(HANDLE,int,PVOID,DWORD); +BOOL WINAPI SetUserObjectSecurity(HANDLE,PSECURITY_INFORMATION,PSECURITY_DESCRIPTOR); +#if (WINVER >= 0x0500) +HWINEVENTHOOK WINAPI SetWinEventHook(UINT,UINT,HMODULE,WINEVENTPROC,DWORD,DWORD,UINT); +#endif +BOOL WINAPI SetWindowContextHelpId(HWND,DWORD); +LONG WINAPI SetWindowLongA(HWND,int,LONG); +LONG WINAPI SetWindowLongW(HWND,int,LONG); +#ifdef _WIN64 +LONG_PTR WINAPI SetWindowLongPtrA(HWND,int,LONG_PTR); +LONG_PTR WINAPI SetWindowLongPtrW(HWND,int,LONG_PTR); +#else +#define SetWindowLongPtrA SetWindowLongA +#define SetWindowLongPtrW SetWindowLongW +#endif +BOOL WINAPI SetWindowPlacement(HWND hWnd,const WINDOWPLACEMENT*); +BOOL WINAPI SetWindowPos(HWND,HWND,int,int,int,int,UINT); +int WINAPI SetWindowRgn(HWND,HRGN,BOOL); +HOOKPROC WINAPI SetWindowsHookA(int,HOOKPROC); +HHOOK WINAPI SetWindowsHookExA(int,HOOKPROC,HINSTANCE,DWORD); +HHOOK WINAPI SetWindowsHookExW(int,HOOKPROC,HINSTANCE,DWORD); +BOOL WINAPI SetWindowTextA(HWND,LPCSTR); +BOOL WINAPI SetWindowTextW(HWND,LPCWSTR); +WORD WINAPI SetWindowWord(HWND,int,WORD); +BOOL WINAPI ShowCaret(HWND); +int WINAPI ShowCursor(BOOL); +BOOL WINAPI ShowOwnedPopups(HWND,BOOL); +BOOL WINAPI ShowScrollBar(HWND,int,BOOL); +BOOL WINAPI ShowWindow(HWND,int); +BOOL WINAPI ShowWindowAsync(HWND,int); +BOOL WINAPI SubtractRect(LPRECT,LPCRECT,LPCRECT); +BOOL WINAPI SwapMouseButton(BOOL); +BOOL WINAPI SwitchDesktop(HDESK); +#if(_WIN32_WINNT >= 0x0500) +VOID WINAPI SwitchToThisWindow(HWND,BOOL); +#endif /* (_WIN32_WINNT >= 0x0500) */ +BOOL WINAPI SystemParametersInfoA(UINT,UINT,PVOID,UINT); +BOOL WINAPI SystemParametersInfoW(UINT,UINT,PVOID,UINT); +LONG WINAPI TabbedTextOutA(HDC,int,int,LPCSTR,int,int,LPINT,int); +LONG WINAPI TabbedTextOutW(HDC,int,int,LPCWSTR,int,int,LPINT,int); +WORD WINAPI TileWindows(HWND,UINT,LPCRECT,UINT,const HWND *); +int WINAPI ToAscii(UINT,UINT,PBYTE,LPWORD,UINT); +int WINAPI ToAsciiEx(UINT,UINT,PBYTE,LPWORD,UINT,HKL); +int WINAPI ToUnicode(UINT,UINT,PBYTE,LPWSTR,int,UINT); +int WINAPI ToUnicodeEx(UINT,UINT,PBYTE,LPWSTR,int,UINT,HKL); +BOOL WINAPI TrackMouseEvent(LPTRACKMOUSEEVENT); +BOOL WINAPI TrackPopupMenu(HMENU,UINT,int,int,int,HWND,LPCRECT); +BOOL WINAPI TrackPopupMenuEx(HMENU,UINT,int,int,HWND,LPTPMPARAMS); +int WINAPI TranslateAcceleratorA(HWND,HACCEL,LPMSG); +int WINAPI TranslateAcceleratorW(HWND,HACCEL,LPMSG); +BOOL WINAPI TranslateMDISysAccel(HWND,LPMSG); +BOOL WINAPI TranslateMessage(const MSG*); +BOOL WINAPI UnhookWindowsHook(int,HOOKPROC); +BOOL WINAPI UnhookWindowsHookEx(HHOOK); +#if (WINVER >= 0x0500) +BOOL WINAPI UnhookWinEvent(HWINEVENTHOOK); +#endif +BOOL WINAPI UnionRect(LPRECT,LPCRECT,LPCRECT); +BOOL WINAPI UnloadKeyboardLayout(HKL); +BOOL WINAPI UnregisterClassA(LPCSTR,HINSTANCE); +BOOL WINAPI UnregisterClassW(LPCWSTR,HINSTANCE); +BOOL WINAPI UnregisterHotKey(HWND,int); +BOOL WINAPI UpdateWindow(HWND); +#if (_WIN32_WINNT >= 0x0500) +BOOL WINAPI UserHandleGrantAccess(HANDLE,HANDLE,BOOL); +#endif +BOOL WINAPI ValidateRect(HWND,LPCRECT); +BOOL WINAPI ValidateRgn(HWND,HRGN); +SHORT WINAPI VkKeyScanA(CHAR); +SHORT WINAPI VkKeyScanExA(CHAR,HKL); +SHORT WINAPI VkKeyScanExW(WCHAR,HKL); +SHORT WINAPI VkKeyScanW(WCHAR); +DWORD WINAPI WaitForInputIdle(HANDLE,DWORD); +BOOL WINAPI WaitMessage(void); +HWND WINAPI WindowFromDC(HDC hDC); +HWND WINAPI WindowFromPoint(POINT); +UINT WINAPI WinExec(LPCSTR,UINT); +BOOL WINAPI WinHelpA(HWND,LPCSTR,UINT,DWORD); +BOOL WINAPI WinHelpW(HWND,LPCWSTR,UINT,DWORD); +int WINAPIV wsprintfA(LPSTR,LPCSTR,...); +int WINAPIV wsprintfW(LPWSTR,LPCWSTR,...); +int WINAPI wvsprintfA(LPSTR,LPCSTR,va_list arglist); +int WINAPI wvsprintfW(LPWSTR,LPCWSTR,va_list arglist); +#if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0490) +BOOL WINAPI AllowSetForegroundWindow(DWORD); +BOOL WINAPI LockSetForegroundWindow(UINT); +#endif +#if (_WIN32_WINNT >= 0x0500) +BOOL WINAPI SetLayeredWindowAttributes(HWND,COLORREF,BYTE,DWORD); +#ifndef NOGDI +BOOL WINAPI UpdateLayeredWindow(HWND,HDC,POINT*,SIZE*,HDC,POINT*,COLORREF,BLENDFUNCTION*,DWORD); +#endif +#endif +#if (_WIN32_WINNT >= 0x0501) +BOOL WINAPI GetLayeredWindowAttributes(HWND,COLORREF*,BYTE*,DWORD*); +#endif +#ifdef UNICODE +#define EDITWORDBREAKPROC EDITWORDBREAKPROCW +#define PROPENUMPROC PROPENUMPROCW +#define PROPENUMPROCEX PROPENUMPROCEXW +#define DEKSTOPENUMPROC DEKSTOPENUMPROCW +#define WINSTAENUMPROC WINSTAENUMPROCW +#define PROPENUMPROC PROPENUMPROCW +#define PROPENUMPROCEX PROPENUMPROCEXW +#define MAKEINTRESOURCE MAKEINTRESOURCEW +typedef WNDCLASSW WNDCLASS,*LPWNDCLASS,*PWNDCLASS; +typedef WNDCLASSEXW WNDCLASSEX,*LPWNDCLASSEX,*PWNDCLASSEX; +typedef MENUITEMINFOW MENUITEMINFO,*LPMENUITEMINFO; +typedef LPCMENUITEMINFOW LPCMENUITEMINFO; +typedef MSGBOXPARAMSW MSGBOXPARAMS,*PMSGBOXPARAMS,*LPMSGBOXPARAMS; +typedef HIGHCONTRASTW HIGHCONTRAST,*LPHIGHCONTRAST; +typedef SERIALKEYSW SERIALKEYS,*LPSERIALKEYS; +typedef SOUNDSENTRYW SOUNDSENTRY,*LPSOUNDSENTRY; +typedef CREATESTRUCTW CREATESTRUCT, *LPCREATESTRUCT; +typedef CBT_CREATEWNDW CBT_CREATEWND, *LPCBT_CREATEWND; +typedef MDICREATESTRUCTW MDICREATESTRUCT,*LPMDICREATESTRUCT; +typedef MULTIKEYHELPW MULTIKEYHELP,*PMULTIKEYHELP,*LPMULTIKEYHELP; +typedef MONITORINFOEXW MONITORINFOEX, *LPMONITORINFOEX; +#define AppendMenu AppendMenuW +#define BroadcastSystemMessage BroadcastSystemMessageW +#define BroadcastSystemMessageEx BroadcastSystemMessageExW +#define CallWindowProc CallWindowProcW +#define ChangeMenu ChangeMenuW +#define CharLower CharLowerW +#define CharLowerBuff CharLowerBuffW +#define CharNext CharNextW +#define CharNextEx CharNextExW +#define CharPrev CharPrevW +#define CharPrevEx CharPrevExW +#define CharToOem CharToOemW +#define CharToOemBuff CharToOemBuffW +#define CharUpper CharUpperW +#define CharUpperBuff CharUpperBuffW +#define CopyAcceleratorTable CopyAcceleratorTableW +#define CreateAcceleratorTable CreateAcceleratorTableW +#define CreateDialog CreateDialogW +#define CreateDialogIndirect CreateDialogIndirectW +#define CreateDialogIndirectParam CreateDialogIndirectParamW +#define CreateDialogParam CreateDialogParamW +#define CreateMDIWindow CreateMDIWindowW +#define CreateWindow CreateWindowW +#define CreateWindowEx CreateWindowExW +#define CreateWindowStation CreateWindowStationW +#define DefDlgProc DefDlgProcW +#define DefFrameProc DefFrameProcW +#define DefMDIChildProc DefMDIChildProcW +#define DefWindowProc DefWindowProcW +#define DialogBox DialogBoxW +#define DialogBoxIndirect DialogBoxIndirectW +#define DialogBoxIndirectParam DialogBoxIndirectParamW +#define DialogBoxParam DialogBoxParamW +#define DispatchMessage DispatchMessageW +#define DlgDirList DlgDirListW +#define DlgDirListComboBox DlgDirListComboBoxW +#define DlgDirSelectComboBoxEx DlgDirSelectComboBoxExW +#define DlgDirSelectEx DlgDirSelectExW +#define DrawState DrawStateW +#define DrawText DrawTextW +#define DrawTextEx DrawTextExW +#define EnumDesktops EnumDesktopsW +#define EnumProps EnumPropsW +#define EnumPropsEx EnumPropsExW +#define EnumWindowStations EnumWindowStationsW +#define FindWindow FindWindowW +#define FindWindowEx FindWindowExW +#define GetClassInfo GetClassInfoW +#define GetClassInfoEx GetClassInfoExW +#define GetClassLong GetClassLongW +#define GetClassName GetClassNameW +#define GetClipboardFormatName GetClipboardFormatNameW +#define GetDlgItemText GetDlgItemTextW +#define GetKeyboardLayoutName GetKeyboardLayoutNameW +#define GetKeyNameText GetKeyNameTextW +#define GetMenuItemInfo GetMenuItemInfoW +#define GetMenuString GetMenuStringW +#define GetMessage GetMessageW +#define GetMonitorInfo GetMonitorInfoW +#define GetProp GetPropW +#define GetRawInputDeviceInfo GetRawInputDeviceInfoW +#define GetTabbedTextExtent GetTabbedTextExtentW +#define GetUserObjectInformation GetUserObjectInformationW +#define GetWindowLong GetWindowLongW +#define GetWindowLongPtr GetWindowLongPtrW +#define GetWindowText GetWindowTextW +#define GetWindowTextLength GetWindowTextLengthW +#define GetAltTabInfo GetAltTabInfoW +#define GetWindowModuleFileName GetWindowModuleFileNameW +#define GrayString GrayStringW +#define InsertMenu InsertMenuW +#define InsertMenuItem InsertMenuItemW +#define IsCharAlpha IsCharAlphaW +#define IsCharAlphaNumeric IsCharAlphaNumericW +#define IsCharLower IsCharLowerW +#define IsCharUpper IsCharUpperW +#define IsDialogMessage IsDialogMessageW +#define LoadAccelerators LoadAcceleratorsW +#define LoadBitmap LoadBitmapW +#define LoadCursor LoadCursorW +#define LoadCursorFromFile LoadCursorFromFileW +#define LoadIcon LoadIconW +#define LoadImage LoadImageW +#define LoadKeyboardLayout LoadKeyboardLayoutW +#define LoadMenu LoadMenuW +#define LoadMenuIndirect LoadMenuIndirectW +#define LoadString LoadStringW +#define MapVirtualKey MapVirtualKeyW +#define MapVirtualKeyEx MapVirtualKeyExW +#define MessageBox MessageBoxW +#define MessageBoxEx MessageBoxExW +#define MessageBoxIndirect MessageBoxIndirectW +#define ModifyMenu ModifyMenuW +#define OemToChar OemToCharW +#define OemToCharBuff OemToCharBuffW +#define OpenDesktop OpenDesktopW +#define OpenWindowStation OpenWindowStationW +#define PeekMessage PeekMessageW +#define PostAppMessage PostAppMessageW +#define PostMessage PostMessageW +#define PostThreadMessage PostThreadMessageW +#define RealGetWindowClass RealGetWindowClassW +#define RegisterClass RegisterClassW +#define RegisterClassEx RegisterClassExW +#define RegisterClipboardFormat RegisterClipboardFormatW +#define RegisterDeviceNotification RegisterDeviceNotificationW +#define RegisterWindowMessage RegisterWindowMessageW +#define RemoveProp RemovePropW +#define SendDlgItemMessage SendDlgItemMessageW +#define SendMessage SendMessageW +#define SendMessageCallback SendMessageCallbackW +#define SendMessageTimeout SendMessageTimeoutW +#define SendNotifyMessage SendNotifyMessageW +#define SetClassLong SetClassLongW +#define SetDlgItemText SetDlgItemTextW +#define SetMenuItemInfo SetMenuItemInfoW +#define SetProp SetPropW +#define SetUserObjectInformation SetUserObjectInformationW +#define SetWindowLong SetWindowLongW +#define SetWindowLongPtr SetWindowLongPtrW +#define SetWindowsHook SetWindowsHookW +#define SetWindowsHookEx SetWindowsHookExW +#define SetWindowText SetWindowTextW +#define SystemParametersInfo SystemParametersInfoW +#define TabbedTextOut TabbedTextOutW +#define TranslateAccelerator TranslateAcceleratorW +#define UnregisterClass UnregisterClassW +#define VkKeyScan VkKeyScanW +#define VkKeyScanEx VkKeyScanExW +#define WinHelp WinHelpW +#define wsprintf wsprintfW +#define wvsprintf wvsprintfW +#ifndef NOGDI +typedef ICONMETRICSW ICONMETRICS,*LPICONMETRICS; +typedef NONCLIENTMETRICSW NONCLIENTMETRICS,*LPNONCLIENTMETRICS; +#define ChangeDisplaySettings ChangeDisplaySettingsW +#define ChangeDisplaySettingsEx ChangeDisplaySettingsExW +#define CreateDesktop CreateDesktopW +#define EnumDisplaySettings EnumDisplaySettingsW +#define EnumDisplaySettingsEx EnumDisplaySettingsExW +#define EnumDisplayDevices EnumDisplayDevicesW +#endif /* NOGDI */ +#else /* UNICODE */ +#define EDITWORDBREAKPROC EDITWORDBREAKPROCA +#define PROPENUMPROC PROPENUMPROCA +#define PROPENUMPROCEX PROPENUMPROCEXA +#define DEKSTOPENUMPROC DEKSTOPENUMPROCA +#define WINSTAENUMPROC WINSTAENUMPROCA +#define PROPENUMPROC PROPENUMPROCA +#define PROPENUMPROCEX PROPENUMPROCEXA +#define MAKEINTRESOURCE MAKEINTRESOURCEA +typedef WNDCLASSA WNDCLASS,*LPWNDCLASS,*PWNDCLASS; +typedef WNDCLASSEXA WNDCLASSEX,*LPWNDCLASSEX,*PWNDCLASSEX; +typedef MENUITEMINFOA MENUITEMINFO,*LPMENUITEMINFO; +typedef LPCMENUITEMINFOA LPCMENUITEMINFO; +typedef MSGBOXPARAMSA MSGBOXPARAMS,*PMSGBOXPARAMS,*LPMSGBOXPARAMS; +typedef HIGHCONTRASTA HIGHCONTRAST,*LPHIGHCONTRAST; +typedef SERIALKEYSA SERIALKEYS,*LPSERIALKEYS; +typedef SOUNDSENTRYA SOUNDSENTRY,*LPSOUNDSENTRY; +typedef CREATESTRUCTA CREATESTRUCT, *LPCREATESTRUCT; +typedef CBT_CREATEWNDA CBT_CREATEWND, *LPCBT_CREATEWND; +typedef MDICREATESTRUCTA MDICREATESTRUCT,*LPMDICREATESTRUCT; +typedef MULTIKEYHELPA MULTIKEYHELP,*PMULTIKEYHELP,*LPMULTIKEYHELP; +typedef MONITORINFOEXA MONITORINFOEX, *LPMONITORINFOEX; +#define AppendMenu AppendMenuA +#define BroadcastSystemMessage BroadcastSystemMessageA +#define BroadcastSystemMessageEx BroadcastSystemMessageExA +#define CallWindowProc CallWindowProcA +#define ChangeMenu ChangeMenuA +#define CharLower CharLowerA +#define CharLowerBuff CharLowerBuffA +#define CharNext CharNextA +#define CharNextEx CharNextExA +#define CharPrev CharPrevA +#define CharPrevEx CharPrevExA +#define CharToOem CharToOemA +#define CharToOemBuff CharToOemBuffA +#define CharUpper CharUpperA +#define CharUpperBuff CharUpperBuffA +#define CopyAcceleratorTable CopyAcceleratorTableA +#define CreateAcceleratorTable CreateAcceleratorTableA +#define CreateDialog CreateDialogA +#define CreateDialogIndirect CreateDialogIndirectA +#define CreateDialogIndirectParam CreateDialogIndirectParamA +#define CreateDialogParam CreateDialogParamA +#define CreateMDIWindow CreateMDIWindowA +#define CreateWindow CreateWindowA +#define CreateWindowEx CreateWindowExA +#define CreateWindowStation CreateWindowStationA +#define DefDlgProc DefDlgProcA +#define DefFrameProc DefFrameProcA +#define DefMDIChildProc DefMDIChildProcA +#define DefWindowProc DefWindowProcA +#define DialogBox DialogBoxA +#define DialogBoxIndirect DialogBoxIndirectA +#define DialogBoxIndirectParam DialogBoxIndirectParamA +#define DialogBoxParam DialogBoxParamA +#define DispatchMessage DispatchMessageA +#define DlgDirList DlgDirListA +#define DlgDirListComboBox DlgDirListComboBoxA +#define DlgDirSelectComboBoxEx DlgDirSelectComboBoxExA +#define DlgDirSelectEx DlgDirSelectExA +#define DrawState DrawStateA +#define DrawText DrawTextA +#define DrawTextEx DrawTextExA +#define EnumDesktops EnumDesktopsA +#define EnumProps EnumPropsA +#define EnumPropsEx EnumPropsExA +#define EnumWindowStations EnumWindowStationsA +#define FindWindow FindWindowA +#define FindWindowEx FindWindowExA +#define GetClassInfo GetClassInfoA +#define GetClassInfoEx GetClassInfoExA +#define GetClassLong GetClassLongA +#define GetClassName GetClassNameA +#define GetClipboardFormatName GetClipboardFormatNameA +#define GetDlgItemText GetDlgItemTextA +#define GetKeyboardLayoutName GetKeyboardLayoutNameA +#define GetKeyNameText GetKeyNameTextA +#define GetMenuItemInfo GetMenuItemInfoA +#define GetMenuString GetMenuStringA +#define GetMessage GetMessageA +#define GetMonitorInfo GetMonitorInfoA +#define GetProp GetPropA +#define GetRawInputDeviceInfo GetRawInputDeviceInfoA +#define GetTabbedTextExtent GetTabbedTextExtentA +#define GetUserObjectInformation GetUserObjectInformationA +#define GetWindowLong GetWindowLongA +#define GetWindowLongPtr GetWindowLongPtrA +#define GetWindowText GetWindowTextA +#define GetWindowTextLength GetWindowTextLengthA +#define GetAltTabInfo GetAltTabInfoA +#define GetWindowModuleFileName GetWindowModuleFileNameA +#define GrayString GrayStringA +#define InsertMenu InsertMenuA +#define InsertMenuItem InsertMenuItemA +#define IsCharAlpha IsCharAlphaA +#define IsCharAlphaNumeric IsCharAlphaNumericA +#define IsCharLower IsCharLowerA +#define IsCharUpper IsCharUpperA +#define IsDialogMessage IsDialogMessageA +#define LoadAccelerators LoadAcceleratorsA +#define LoadBitmap LoadBitmapA +#define LoadCursor LoadCursorA +#define LoadIcon LoadIconA +#define LoadCursorFromFile LoadCursorFromFileA +#define LoadImage LoadImageA +#define LoadKeyboardLayout LoadKeyboardLayoutA +#define LoadMenu LoadMenuA +#define LoadMenuIndirect LoadMenuIndirectA +#define LoadString LoadStringA +#define MapVirtualKey MapVirtualKeyA +#define MapVirtualKeyEx MapVirtualKeyExA +#define MessageBox MessageBoxA +#define MessageBoxEx MessageBoxExA +#define MessageBoxIndirect MessageBoxIndirectA +#define ModifyMenu ModifyMenuA +#define OemToChar OemToCharA +#define OemToCharBuff OemToCharBuffA +#define OpenDesktop OpenDesktopA +#define OpenWindowStation OpenWindowStationA +#define PeekMessage PeekMessageA +#define PostAppMessage PostAppMessageA +#define PostMessage PostMessageA +#define PostThreadMessage PostThreadMessageA +#define RealGetWindowClass RealGetWindowClassA +#define RegisterClass RegisterClassA +#define RegisterClassEx RegisterClassExA +#define RegisterClipboardFormat RegisterClipboardFormatA +#define RegisterDeviceNotification RegisterDeviceNotificationA +#define RegisterWindowMessage RegisterWindowMessageA +#define RemoveProp RemovePropA +#define SendDlgItemMessage SendDlgItemMessageA +#define SendMessage SendMessageA +#define SendMessageCallback SendMessageCallbackA +#define SendMessageTimeout SendMessageTimeoutA +#define SendNotifyMessage SendNotifyMessageA +#define SetClassLong SetClassLongA +#define SetDlgItemText SetDlgItemTextA +#define SetMenuItemInfo SetMenuItemInfoA +#define SetProp SetPropA +#define SetUserObjectInformation SetUserObjectInformationA +#define SetWindowLong SetWindowLongA +#define SetWindowLongPtr SetWindowLongPtrA +#define SetWindowsHook SetWindowsHookA +#define SetWindowsHookEx SetWindowsHookExA +#define SetWindowText SetWindowTextA +#define SystemParametersInfo SystemParametersInfoA +#define TabbedTextOut TabbedTextOutA +#define TranslateAccelerator TranslateAcceleratorA +#define UnregisterClass UnregisterClassA +#define VkKeyScan VkKeyScanA +#define VkKeyScanEx VkKeyScanExA +#define WinHelp WinHelpA +#define wsprintf wsprintfA +#define wvsprintf wvsprintfA +#ifndef NOGDI +typedef ICONMETRICSA ICONMETRICS,*LPICONMETRICS; +typedef NONCLIENTMETRICSA NONCLIENTMETRICS,*LPNONCLIENTMETRICS; +#define ChangeDisplaySettings ChangeDisplaySettingsA +#define ChangeDisplaySettingsEx ChangeDisplaySettingsExA +#define CreateDesktop CreateDesktopA +#define EnumDisplaySettings EnumDisplaySettingsA +#define EnumDisplaySettingsEx EnumDisplaySettingsExA +#define EnumDisplayDevices EnumDisplayDevicesA +#endif /* NOGDI */ +#endif /* UNICODE */ +#endif /* RC_INVOKED */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/winver.h b/reactos/w32api/include/winver.h new file mode 100644 index 00000000000..913a35561ae --- /dev/null +++ b/reactos/w32api/include/winver.h @@ -0,0 +1,133 @@ +#ifndef _WINVER_H +#define _WINVER_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#define VS_FILE_INFO RT_VERSION +#define VS_VERSION_INFO 1 +#define VS_USER_DEFINED 100 +#define VS_FFI_SIGNATURE 0xFEEF04BD +#define VS_FFI_STRUCVERSION 0x10000 +#define VS_FFI_FILEFLAGSMASK 0x3F +#define VS_FF_DEBUG 1 +#define VS_FF_PRERELEASE 2 +#define VS_FF_PATCHED 4 +#define VS_FF_PRIVATEBUILD 8 +#define VS_FF_INFOINFERRED 16 +#define VS_FF_SPECIALBUILD 32 +#define VOS_UNKNOWN 0 +#define VOS_DOS 0x10000 +#define VOS_OS216 0x20000 +#define VOS_OS232 0x30000 +#define VOS_NT 0x40000 +#define VOS__BASE 0 +#define VOS__WINDOWS16 1 +#define VOS__PM16 2 +#define VOS__PM32 3 +#define VOS__WINDOWS32 4 +#define VOS_DOS_WINDOWS16 0x10001 +#define VOS_DOS_WINDOWS32 0x10004 +#define VOS_OS216_PM16 0x20002 +#define VOS_OS232_PM32 0x30003 +#define VOS_NT_WINDOWS32 0x40004 +#define VFT_UNKNOWN 0 +#define VFT_APP 1 +#define VFT_DLL 2 +#define VFT_DRV 3 +#define VFT_FONT 4 +#define VFT_VXD 5 +#define VFT_STATIC_LIB 7 +#define VFT2_UNKNOWN 0 +#define VFT2_DRV_PRINTER 1 +#define VFT2_DRV_KEYBOARD 2 +#define VFT2_DRV_LANGUAGE 3 +#define VFT2_DRV_DISPLAY 4 +#define VFT2_DRV_MOUSE 5 +#define VFT2_DRV_NETWORK 6 +#define VFT2_DRV_SYSTEM 7 +#define VFT2_DRV_INSTALLABLE 8 +#define VFT2_DRV_SOUND 9 +#define VFT2_DRV_COMM 10 +#define VFT2_DRV_INPUTMETHOD 11 +#define VFT2_FONT_RASTER 1 +#define VFT2_FONT_VECTOR 2 +#define VFT2_FONT_TRUETYPE 3 +#define VFFF_ISSHAREDFILE 1 +#define VFF_CURNEDEST 1 +#define VFF_FILEINUSE 2 +#define VFF_BUFFTOOSMALL 4 +#define VIFF_FORCEINSTALL 1 +#define VIFF_DONTDELETEOLD 2 +#define VIF_TEMPFILE 1 +#define VIF_MISMATCH 2 +#define VIF_SRCOLD 4 +#define VIF_DIFFLANG 8 +#define VIF_DIFFCODEPG 16 +#define VIF_DIFFTYPE 32 +#define VIF_WRITEPROT 64 +#define VIF_FILEINUSE 128 +#define VIF_OUTOFSPACE 256 +#define VIF_ACCESSVIOLATION 512 +#define VIF_SHARINGVIOLATION 1024 +#define VIF_CANNOTCREATE 2048 +#define VIF_CANNOTDELETE 4096 +#define VIF_CANNOTRENAME 8192 +#define VIF_CANNOTDELETECUR 16384 +#define VIF_OUTOFMEMORY 32768 +#define VIF_CANNOTREADSRC 65536 +#define VIF_CANNOTREADDST 0x20000 +#define VIF_BUFFTOOSMALL 0x40000 +#ifndef RC_INVOKED +typedef struct tagVS_FIXEDFILEINFO { + DWORD dwSignature; + DWORD dwStrucVersion; + DWORD dwFileVersionMS; + DWORD dwFileVersionLS; + DWORD dwProductVersionMS; + DWORD dwProductVersionLS; + DWORD dwFileFlagsMask; + DWORD dwFileFlags; + DWORD dwFileOS; + DWORD dwFileType; + DWORD dwFileSubtype; + DWORD dwFileDateMS; + DWORD dwFileDateLS; +} VS_FIXEDFILEINFO; +DWORD WINAPI VerFindFileA(DWORD,LPSTR,LPSTR,LPSTR,LPSTR,PUINT,LPSTR,PUINT); +DWORD WINAPI VerFindFileW(DWORD,LPWSTR,LPWSTR,LPWSTR,LPWSTR,PUINT,LPWSTR,PUINT); +DWORD WINAPI VerInstallFileA(DWORD,LPSTR,LPSTR,LPSTR,LPSTR,LPSTR,LPSTR,PUINT); +DWORD WINAPI VerInstallFileW(DWORD,LPWSTR,LPWSTR,LPWSTR,LPWSTR,LPWSTR,LPWSTR,PUINT); +DWORD WINAPI GetFileVersionInfoSizeA(LPSTR,PDWORD); +DWORD WINAPI GetFileVersionInfoSizeW(LPWSTR,PDWORD); +BOOL WINAPI GetFileVersionInfoA(LPSTR,DWORD,DWORD,PVOID); +BOOL WINAPI GetFileVersionInfoW(LPWSTR,DWORD,DWORD,PVOID); +DWORD WINAPI VerLanguageNameA(DWORD,LPSTR,DWORD); +DWORD WINAPI VerLanguageNameW(DWORD,LPWSTR,DWORD); +BOOL WINAPI VerQueryValueA(const LPVOID,LPSTR,LPVOID*,PUINT); +BOOL WINAPI VerQueryValueW(const LPVOID,LPWSTR,LPVOID*,PUINT); +#ifdef UNICODE +#define VerFindFile VerFindFileW +#define VerQueryValue VerQueryValueW +#define VerInstallFile VerInstallFileW +#define GetFileVersionInfoSize GetFileVersionInfoSizeW +#define GetFileVersionInfo GetFileVersionInfoW +#define VerLanguageName VerLanguageNameW +#define VerQueryValue VerQueryValueW +#else +#define VerQueryValue VerQueryValueA +#define VerFindFile VerFindFileA +#define VerInstallFile VerInstallFileA +#define GetFileVersionInfoSize GetFileVersionInfoSizeA +#define GetFileVersionInfo GetFileVersionInfoA +#define VerLanguageName VerLanguageNameA +#define VerQueryValue VerQueryValueA +#endif +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/ws2spi.h b/reactos/w32api/include/ws2spi.h new file mode 100644 index 00000000000..49b7c4afc93 --- /dev/null +++ b/reactos/w32api/include/ws2spi.h @@ -0,0 +1,200 @@ +/* + * ws2spi.h + * + * Winsock 2 Service Provider interface. + * + * + * 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 _WS2SPI_H +#define _WS2SPI_H + +#include <winsock2.h> + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#define WSPAPI WSAAPI +#define WSPDESCRIPTION_LEN 255 + +#ifndef RC_INVOKED + +typedef struct WSPData { + WORD wVersion; + WORD wHighVersion; + WCHAR szDescription[WSPDESCRIPTION_LEN+1]; +} WSPDATA, FAR *LPWSPDATA; +typedef struct _WSATHREADID { + HANDLE ThreadHandle; + DWORD Reserved; +} WSATHREADID, FAR *LPWSATHREADID; + +typedef BOOL (CALLBACK FAR *LPBLOCKINGCALLBACK)(DWORD); +typedef VOID (CALLBACK FAR *LPWSAUSERAPC)(DWORD); + +/* Prototypes for service provider procedure table */ +typedef SOCKET (WSPAPI *LPWSPACCEPT)(SOCKET,LPSOCKADDR,LPINT,LPCONDITIONPROC,DWORD,LPINT); +typedef INT (WSPAPI *LPWSPADDRESSTOSTRING)(LPSOCKADDR,DWORD,LPWSAPROTOCOL_INFOW,LPWSTR,LPDWORD,LPINT); +typedef INT (WSPAPI *LPWSPASYNCSELECT)(SOCKET,HWND,UINT,LONG,LPINT); +typedef INT (WSPAPI *LPWSPBIND)(SOCKET,const struct sockaddr*,INT,LPINT); +typedef INT (WSPAPI *LPWSPCANCELBLOCKINGCALL)(LPINT); +typedef INT (WSPAPI *LPWSPCLEANUP)(LPINT); +typedef INT (WSPAPI *LPWSPCLOSESOCKET)(SOCKET,LPINT); +typedef INT (WSPAPI *LPWSPCONNECT)(SOCKET,const struct sockaddr*,INT,LPWSABUF,LPWSABUF,LPQOS,LPQOS,LPINT); +typedef INT (WSPAPI *LPWSPDUPLICATESOCKET)(SOCKET,DWORD,LPWSAPROTOCOL_INFOW,LPINT); +typedef INT (WSPAPI *LPWSPENUMNETWORKEVENTS)(SOCKET,WSAEVENT,LPWSANETWORKEVENTS,LPINT); +typedef INT (WSPAPI *LPWSPEVENTSELECT)(SOCKET,WSAEVENT,LONG,LPINT); +typedef BOOL (WSPAPI *LPWSPGETOVERLAPPEDRESULT)(SOCKET,LPWSAOVERLAPPED,LPDWORD,BOOL,LPDWORD,LPINT); +typedef INT (WSPAPI *LPWSPGETPEERNAME)(SOCKET,LPSOCKADDR,LPINT,LPINT); +typedef BOOL (WSPAPI *LPWSPGETQOSBYNAME)(SOCKET,LPWSABUF,LPQOS,LPINT); +typedef INT (WSPAPI *LPWSPGETSOCKNAME)(SOCKET,LPSOCKADDR,LPINT,LPINT); +typedef INT (WSPAPI *LPWSPGETSOCKOPT)(SOCKET,INT,INT,CHAR FAR*,LPINT,LPINT); +typedef INT (WSPAPI *LPWSPIOCTL)(SOCKET,DWORD,LPVOID,DWORD,LPVOID,DWORD,LPDWORD, + LPWSAOVERLAPPED,LPWSAOVERLAPPED_COMPLETION_ROUTINE,LPWSATHREADID,LPINT); +typedef SOCKET (WSPAPI *LPWSPJOINLEAF)(SOCKET,const struct sockaddr*,INT,LPWSABUF,LPWSABUF,LPQOS,LPQOS,DWORD,LPINT); +typedef INT (WSPAPI *LPWSPLISTEN)(SOCKET,INT,LPINT); +typedef INT (WSPAPI *LPWSPRECV)(SOCKET,LPWSABUF,DWORD,LPDWORD,LPDWORD, +LPWSAOVERLAPPED,LPWSAOVERLAPPED_COMPLETION_ROUTINE,LPWSATHREADID,LPINT); +typedef INT (WSPAPI *LPWSPRECVDISCONNECT)(SOCKET,LPWSABUF,LPINT); +typedef INT (WSPAPI *LPWSPRECVFROM)(SOCKET,LPWSABUF,DWORD,LPDWORD,LPDWORD,LPSOCKADDR, +LPINT,LPWSAOVERLAPPED,LPWSAOVERLAPPED_COMPLETION_ROUTINE,LPWSATHREADID,LPINT); +typedef INT (WSPAPI *LPWSPSELECT)(INT,LPFD_SET,LPFD_SET,LPFD_SET,CONST LPTIMEVAL,LPINT); +typedef INT (WSPAPI *LPWSPSEND)(SOCKET,LPWSABUF,DWORD,LPDWORD,DWORD, +LPWSAOVERLAPPED,LPWSAOVERLAPPED_COMPLETION_ROUTINE,LPWSATHREADID,LPINT); +typedef INT (WSPAPI *LPWSPSENDDISCONNECT)(SOCKET,LPWSABUF,LPINT); +typedef INT (WSPAPI *LPWSPSENDTO)(SOCKET,LPWSABUF,DWORD,LPDWORD,DWORD,const struct sockaddr*, + INT,LPWSAOVERLAPPED,LPWSAOVERLAPPED_COMPLETION_ROUTINE,LPWSATHREADID,LPINT); +typedef INT (WSPAPI *LPWSPSETSOCKOPT)(SOCKET,INT,INT,CONST CHAR FAR*,INT,LPINT); +typedef INT (WSPAPI *LPWSPSHUTDOWN)(SOCKET,INT,LPINT); +typedef SOCKET (WSPAPI *LPWSPSOCKET)(INT,INT,INT,LPWSAPROTOCOL_INFOW,GROUP,DWORD,LPINT); +typedef INT (WSPAPI *LPWSPSTRINGTOADDRESS)(LPWSTR,INT,LPWSAPROTOCOL_INFOW,LPSOCKADDR,LPINT,LPINT); + +/* Service provider procedure table */ +typedef struct _WSPPROC_TABLE { + LPWSPACCEPT lpWSPAccept; + LPWSPADDRESSTOSTRING lpWSPAddressToString; + LPWSPASYNCSELECT lpWSPAsyncSelect; + LPWSPBIND lpWSPBind; + LPWSPCANCELBLOCKINGCALL lpWSPCancelBlockingCall; + LPWSPCLEANUP lpWSPCleanup; + LPWSPCLOSESOCKET lpWSPCloseSocket; + LPWSPCONNECT lpWSPConnect; + LPWSPDUPLICATESOCKET lpWSPDuplicateSocket; + LPWSPENUMNETWORKEVENTS lpWSPEnumNetworkEvents; + LPWSPEVENTSELECT lpWSPEventSelect; + LPWSPGETOVERLAPPEDRESULT lpWSPGetOverlappedResult; + LPWSPGETPEERNAME lpWSPGetPeerName; + LPWSPGETSOCKNAME lpWSPGetSockName; + LPWSPGETSOCKOPT lpWSPGetSockOpt; + LPWSPGETQOSBYNAME lpWSPGetQOSByName; + LPWSPIOCTL lpWSPIoctl; + LPWSPJOINLEAF lpWSPJoinLeaf; + LPWSPLISTEN lpWSPListen; + LPWSPRECV lpWSPRecv; + LPWSPRECVDISCONNECT lpWSPRecvDisconnect; + LPWSPRECVFROM lpWSPRecvFrom; + LPWSPSELECT lpWSPSelect; + LPWSPSEND lpWSPSend; + LPWSPSENDDISCONNECT lpWSPSendDisconnect; + LPWSPSENDTO lpWSPSendTo; + LPWSPSETSOCKOPT lpWSPSetSockOpt; + LPWSPSHUTDOWN lpWSPShutdown; + LPWSPSOCKET lpWSPSocket; + LPWSPSTRINGTOADDRESS lpWSPStringToAddress; +} WSPPROC_TABLE, FAR* LPWSPPROC_TABLE; + +/* Prototypes for service provider upcall procedure table */ +typedef BOOL (WSPAPI *LPWPUCLOSEEVENT)(WSAEVENT,LPINT); +typedef INT (WSPAPI *LPWPUCLOSESOCKETHANDLE)(SOCKET,LPINT); +typedef INT (WSPAPI *LPWPUCLOSETHREAD)(LPWSATHREADID,LPINT); +typedef WSAEVENT (WSPAPI *LPWPUCREATEEVENT)(LPINT); +typedef SOCKET (WSPAPI *LPWPUCREATESOCKETHANDLE)(DWORD,DWORD,LPINT); +typedef SOCKET (WSPAPI *LPWPUFDISSET)(SOCKET,LPFD_SET); +typedef INT (WSPAPI *LPWPUGETPROVIDERPATH)(LPGUID,LPWSTR,LPINT,LPINT); +typedef SOCKET (WSPAPI *LPWPUMODIFYIFSHANDLE)(DWORD,SOCKET,LPINT); +typedef INT (WSPAPI *LPWPUOPENCURRENTTHREAD)(LPWSATHREADID,LPINT); +typedef BOOL (WSPAPI *LPWPUPOSTMESSAGE)(HWND,UINT,WPARAM,LPARAM); +typedef INT (WSPAPI *LPWPUQUERYBLOCKINGCALLBACK)(DWORD,LPBLOCKINGCALLBACK FAR*,LPDWORD,LPINT); +typedef INT (WSPAPI *LPWPUQUERYSOCKETHANDLECONTEXT)(SOCKET,LPDWORD,LPINT); +typedef INT (WSPAPI *LPWPUQUEUEAPC)(LPWSATHREADID,LPWSAUSERAPC,DWORD,LPINT); +typedef BOOL (WSPAPI *LPWPURESETEVENT)(WSAEVENT,LPINT); +typedef BOOL (WSPAPI *LPWPUSETEVENT)(WSAEVENT,LPINT); +/* Available only directly from the DLL */ +typedef INT (WSPAPI *LPWPUCOMPLETEOVERLAPPEDREQUEST)(SOCKET,LPWSAOVERLAPPED,DWORD,DWORD,LPINT); + +/* Service Provider upcall table */ +typedef struct _WSPUPCALLTABLE { + LPWPUCLOSEEVENT lpWPUCloseEvent; + LPWPUCLOSESOCKETHANDLE lpWPUCloseSocketHandle; + LPWPUCREATEEVENT lpWPUCreateEvent; + LPWPUCREATESOCKETHANDLE lpWPUCreateSocketHandle; + LPWPUFDISSET lpWPUFDIsSet; + LPWPUGETPROVIDERPATH lpWPUGetProviderPath; + LPWPUMODIFYIFSHANDLE lpWPUModifyIFSHandle; + LPWPUPOSTMESSAGE lpWPUPostMessage; + LPWPUQUERYBLOCKINGCALLBACK lpWPUQueryBlockingCallback; + LPWPUQUERYSOCKETHANDLECONTEXT lpWPUQuerySocketHandleContext; + LPWPUQUEUEAPC lpWPUQueueApc; + LPWPURESETEVENT lpWPUResetEvent; + LPWPUSETEVENT lpWPUSetEvent; + LPWPUOPENCURRENTTHREAD lpWPUOpenCurrentThread; + LPWPUCLOSETHREAD lpWPUCloseThread; +} WSPUPCALLTABLE, FAR* LPWSPUPCALLTABLE; + +typedef INT (WSPAPI *LPWSPSTARTUP)(WORD,LPWSPDATA,LPWSAPROTOCOL_INFOW,WSPUPCALLTABLE,LPWSPPROC_TABLE); + +/* Prototypes for service provider namespace procedure table */ +typedef INT (WSPAPI *LPNSPCLEANUP)(LPGUID); +typedef INT (WSPAPI *LPNSPGETSERVICECLASSINFO)(LPGUID,LPDWORD,LPWSASERVICECLASSINFOW); +typedef INT (WSPAPI *LPNSPINSTALLSERVICECLASS)(LPGUID,LPWSASERVICECLASSINFOW); +typedef INT (WSPAPI *LPNSPLOOKUPSERVICEBEGIN)(LPGUID,LPWSAQUERYSETW,LPWSASERVICECLASSINFOW,DWORD,LPHANDLE); +typedef INT (WSPAPI *LPNSPLOOKUPSERVICEEND)(HANDLE); +typedef INT (WSPAPI *LPNSPLOOKUPSERVICENEXT)(HANDLE,DWORD,LPDWORD,LPWSAQUERYSET); +typedef INT (WSPAPI *LPNSPREMOVESERVICECLASS)(LPGUID,LPGUID); +typedef INT (WSPAPI *LPNSPSETSERVICE)(LPGUID,LPWSASERVICECLASSINFOW,LPWSAQUERYSETW,WSAESETSERVICEOP,DWORD); + +typedef struct _NSP_ROUTINE { + DWORD cbSize; + DWORD dwMajorVersion; + DWORD dwMinorVersion; + LPNSPCLEANUP NSPCleanup; + LPNSPLOOKUPSERVICEBEGIN NSPLookupServiceBegin; + LPNSPLOOKUPSERVICENEXT NSPLookupServiceNext; + LPNSPLOOKUPSERVICEEND NSPLookupServiceEnd; + LPNSPSETSERVICE NSPSetService; + LPNSPINSTALLSERVICECLASS NSPInstallServiceClass; + LPNSPREMOVESERVICECLASS NSPRemoveServiceClass; + LPNSPGETSERVICECLASSINFO NSPGetServiceClassInfo; +} NSP_ROUTINE, *PNSP_ROUTINE, *LPNSP_ROUTINE; + +INT WSPAPI NSPStartup(LPGUID,LPNSP_ROUTINE); + +/* WinSock 2 DLL function prototypes */ +INT WSPAPI WPUCompleteOverlappedRequest(SOCKET,LPWSAOVERLAPPED,DWORD,DWORD,LPINT); +INT WSPAPI WSPStartup(WORD,LPWSPDATA,LPWSAPROTOCOL_INFOW,WSPUPCALLTABLE,LPWSPPROC_TABLE); +INT WSPAPI WSCDeinstallProvider(LPGUID,LPINT); +INT WSPAPI WSCEnumProtocols(LPINT,LPWSAPROTOCOL_INFOW,LPDWORD,LPINT); +INT WSPAPI WSCGetProviderPath(LPGUID,LPWSTR,LPINT,LPINT); +INT WSPAPI WSCInstallProvider(CONST LPGUID,CONST LPWSTR,CONST LPWSAPROTOCOL_INFOW,DWORD,LPINT); +INT WSPAPI WSCEnableNSProvider(LPGUID,BOOL); +INT WSPAPI WSCInstallNameSpace(LPWSTR,LPWSTR,DWORD,DWORD,LPGUID); +INT WSPAPI WSCUnInstallNameSpace(LPGUID); +INT WSPAPI WSCWriteProviderOrder(LPDWORD,DWORD); + +#endif /* RC_INVOKED */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _WS2SPI_H */ diff --git a/reactos/w32api/include/ws2tcpip.h b/reactos/w32api/include/ws2tcpip.h new file mode 100644 index 00000000000..ac66fb0be6e --- /dev/null +++ b/reactos/w32api/include/ws2tcpip.h @@ -0,0 +1,358 @@ +/* + * ws2tcpip.h : TCP/IP specific extensions in Windows Sockets 2 + * + * Portions Copyright (c) 1980, 1983, 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + */ + +#ifndef _WS2TCPIP_H +#define _WS2TCPIP_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#if (defined _WINSOCK_H && !defined _WINSOCK2_H) +#error "ws2tcpip.h is not compatable with winsock.h. Include winsock2.h instead." +#endif + +#include <winsock2.h> +#ifdef __cplusplus +extern "C" { +#endif + +/* + * The IP_* macros are also defined in winsock.h, but some values are different there. + * The values defined in winsock.h for 1.1 and used in wsock32.dll are consistent + * with the original values Steve Deering defined in his document "IP Multicast Extensions + * for 4.3BSD UNIX related systems (MULTICAST 1.2 Release)." However, these conflicted with + * the definitions for some IPPROTO_IP level socket options already assigned by BSD, + * so Berkeley changed all the values by adding 7. WinSock2 (ws2_32.dll) uses + * the BSD 4.4 compatible values defined here. + * + * See also: msdn kb article Q257460 + * http://support.microsoft.com/support/kb/articles/Q257/4/60.asp + */ + +/* This is also defined in winsock.h; value hasn't changed */ +#define IP_OPTIONS 1 + +#define IP_HDRINCL 2 +/* + * These are also be defined in winsock.h, + * but values have changed for WinSock2 interface + */ +#define IP_TOS 3 /* old (winsock 1.1) value 8 */ +#define IP_TTL 4 /* old value 7 */ +#define IP_MULTICAST_IF 9 /* old value 2 */ +#define IP_MULTICAST_TTL 10 /* old value 3 */ +#define IP_MULTICAST_LOOP 11 /* old value 4 */ +#define IP_ADD_MEMBERSHIP 12 /* old value 5 */ +#define IP_DROP_MEMBERSHIP 13 /* old value 6 */ +#define IP_DONTFRAGMENT 14 /* old value 9 */ +#define IP_ADD_SOURCE_MEMBERSHIP 15 +#define IP_DROP_SOURCE_MEMBERSHIP 16 +#define IP_BLOCK_SOURCE 17 +#define IP_UNBLOCK_SOURCE 18 +#define IP_PKTINFO 19 + +/* + * As with BSD implementation, IPPROTO_IPV6 level socket options have + * same values as IPv4 counterparts. + */ +#define IPV6_UNICAST_HOPS 4 +#define IPV6_MULTICAST_IF 9 +#define IPV6_MULTICAST_HOPS 10 +#define IPV6_MULTICAST_LOOP 11 +#define IPV6_ADD_MEMBERSHIP 12 +#define IPV6_DROP_MEMBERSHIP 13 +#define IPV6_JOIN_GROUP IPV6_ADD_MEMBERSHIP +#define IPV6_LEAVE_GROUP IPV6_DROP_MEMBERSHIP +#define IPV6_PKTINFO 19 + +#define IP_DEFAULT_MULTICAST_TTL 1 +#define IP_DEFAULT_MULTICAST_LOOP 1 +#define IP_MAX_MEMBERSHIPS 20 + +#define TCP_EXPEDITED_1122 2 + +#define UDP_NOCHECKSUM 1 + +/* INTERFACE_INFO iiFlags */ +#define IFF_UP 1 +#define IFF_BROADCAST 2 +#define IFF_LOOPBACK 4 +#define IFF_POINTTOPOINT 8 +#define IFF_MULTICAST 16 + +#define SIO_GET_INTERFACE_LIST _IOR('t', 127, u_long) + +#define INET_ADDRSTRLEN 16 +#define INET6_ADDRSTRLEN 46 + +/* getnameinfo constants */ +#define NI_MAXHOST 1025 +#define NI_MAXSERV 32 + +#define NI_NOFQDN 0x01 +#define NI_NUMERICHOST 0x02 +#define NI_NAMEREQD 0x04 +#define NI_NUMERICSERV 0x08 +#define NI_DGRAM 0x10 + +/* getaddrinfo constants */ +#define AI_PASSIVE 1 +#define AI_CANONNAME 2 +#define AI_NUMERICHOST 4 + +/* getaddrinfo error codes */ +#define EAI_AGAIN WSATRY_AGAIN +#define EAI_BADFLAGS WSAEINVAL +#define EAI_FAIL WSANO_RECOVERY +#define EAI_FAMILY WSAEAFNOSUPPORT +#define EAI_MEMORY WSA_NOT_ENOUGH_MEMORY +#define EAI_NODATA WSANO_DATA +#define EAI_NONAME WSAHOST_NOT_FOUND +#define EAI_SERVICE WSATYPE_NOT_FOUND +#define EAI_SOCKTYPE WSAESOCKTNOSUPPORT + +/* + * ip_mreq also in winsock.h for WinSock1.1, + * but online msdn docs say it is defined here for WinSock2. + */ + +struct ip_mreq { + struct in_addr imr_multiaddr; + struct in_addr imr_interface; +}; + +struct ip_mreq_source { + struct in_addr imr_multiaddr; + struct in_addr imr_sourceaddr; + struct in_addr imr_interface; +}; + +struct ip_msfilter { + struct in_addr imsf_multiaddr; + struct in_addr imsf_interface; + u_long imsf_fmode; + u_long imsf_numsrc; + struct in_addr imsf_slist[1]; +}; + +#define IP_MSFILTER_SIZE(numsrc) \ + (sizeof(struct ip_msfilter) - sizeof(struct in_addr) \ + + (numsrc) * sizeof(struct in_addr)) + +struct in_pktinfo { + IN_ADDR ipi_addr; + UINT ipi_ifindex; +}; +typedef struct in_pktinfo IN_PKTINFO; + + +/* ipv6 */ +/* These require XP or .NET Server or use of add-on IPv6 stacks on NT 4 + or higher */ + +/* This is based on the example given in RFC 2553 with stdint types + changed to BSD types. For now, use these field names until there + is some consistency in MS docs. In this file, we only use the + in6_addr structure start address, with casts to get the right offsets + when testing addresses */ + +struct in6_addr { + union { + u_char _S6_u8[16]; + u_short _S6_u16[8]; + u_long _S6_u32[4]; + } _S6_un; +}; +/* s6_addr is the standard name */ +#define s6_addr _S6_un._S6_u8 + +/* These are GLIBC names */ +#define s6_addr16 _S6_un._S6_u16 +#define s6_addr32 _S6_un._S6_u16 + +/* These are used in some MS code */ +#define in_addr6 in6_addr +#define _s6_bytes _S6_un._S6_u8 +#define _s6_words _S6_un._S6_u16 + +typedef struct in6_addr IN6_ADDR, *PIN6_ADDR, *LPIN6_ADDR; + +struct sockaddr_in6 { + short sin6_family; /* AF_INET6 */ + u_short sin6_port; /* transport layer port # */ + u_long sin6_flowinfo; /* IPv6 traffic class & flow info */ + struct in6_addr sin6_addr; /* IPv6 address */ + u_long sin6_scope_id; /* set of interfaces for a scope */ +}; +typedef struct sockaddr_in6 SOCKADDR_IN6, *PSOCKADDR_IN6, *LPSOCKADDR_IN6; + +extern const struct in6_addr in6addr_any; +extern const struct in6_addr in6addr_loopback; +/* the above can get initialised using: */ +#define IN6ADDR_ANY_INIT { 0 } +#define IN6ADDR_LOOPBACK_INIT { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } + +/* Described in RFC 2292, but not in 2553 */ +/* int IN6_ARE_ADDR_EQUAL(const struct in6_addr * a, const struct in6_addr * b) */ +#define IN6_ARE_ADDR_EQUAL(a, b) \ + (memcmp ((void*)(a), (void*)(b), sizeof (struct in6_addr)) == 0) + + +/* Address Testing Macros + + These macro functions all take const struct in6_addr* as arg. + Static inlines would allow type checking, but RFC 2553 says they + macros. + NB: These are written specifically for little endian host */ + +#define IN6_IS_ADDR_UNSPECIFIED(_addr) \ + ( (((const u_long *)(_addr))[0] == 0) \ + && (((const u_long *)(_addr))[1] == 0) \ + && (((const u_long *)(_addr))[2] == 0) \ + && (((const u_long *)(_addr))[3] == 0)) + +#define IN6_IS_ADDR_LOOPBACK(_addr) \ + ( (((const u_long *)(_addr))[0] == 0) \ + && (((const u_long *)(_addr))[1] == 0) \ + && (((const u_long *)(_addr))[2] == 0) \ + && (((const u_long *)(_addr))[3] == 0x01000000)) /* Note byte order reversed */ +/* (((const u_long *)(_addr))[3] == ntohl(1)) */ + +#define IN6_IS_ADDR_MULTICAST(_addr) (((const u_char *) (_addr))[0] == 0xff) + +#define IN6_IS_ADDR_LINKLOCAL(_addr) \ + ( (((const u_char *)(_addr))[0] == 0xfe) \ + && ((((const u_char *)(_addr))[1] & 0xc0) == 0x80)) + +#define IN6_IS_ADDR_SITELOCAL(_addr) \ + ( (((const u_char *)(_addr))[0] == 0xfe) \ + && ((((const u_char *)(_addr))[1] & 0xc0) == 0xc0)) + +#define IN6_IS_ADDR_V4MAPPED(_addr) \ + ( (((const u_long *)(_addr))[0] == 0) \ + && (((const u_long *)(_addr))[1] == 0) \ + && (((const u_long *)(_addr))[2] == 0xffff0000)) /* Note byte order reversed */ +/* (((const u_long *)(_addr))[2] == ntohl(0x0000ffff))) */ + +#define IN6_IS_ADDR_V4COMPAT(_addr) \ + ( (((const u_long *)(_addr))[0] == 0) \ + && (((const u_long *)(_addr))[1] == 0) \ + && (((const u_long *)(_addr))[2] == 0) \ + && (((const u_long *)(_addr))[3] != 0) \ + && (((const u_long *)(_addr))[3] != 0x01000000)) /* Note byte order reversed */ +/* (ntohl (((const u_long *)(_addr))[3]) > 1 ) */ + + +#define IN6_IS_ADDR_MC_NODELOCAL(_addr) \ + ( IN6_IS_ADDR_MULTICAST(_addr) \ + && ((((const u_char *)(_addr))[1] & 0xf) == 0x1)) + +#define IN6_IS_ADDR_MC_LINKLOCAL(_addr) \ + ( IN6_IS_ADDR_MULTICAST (_addr) \ + && ((((const u_char *)(_addr))[1] & 0xf) == 0x2)) + +#define IN6_IS_ADDR_MC_SITELOCAL(_addr) \ + ( IN6_IS_ADDR_MULTICAST(_addr) \ + && ((((const u_char *)(_addr))[1] & 0xf) == 0x5)) + +#define IN6_IS_ADDR_MC_ORGLOCAL(_addr) \ + ( IN6_IS_ADDR_MULTICAST(_addr) \ + && ((((const u_char *)(_addr))[1] & 0xf) == 0x8)) + +#define IN6_IS_ADDR_MC_GLOBAL(_addr) \ + ( IN6_IS_ADDR_MULTICAST(_addr) \ + && ((((const u_char *)(_addr))[1] & 0xf) == 0xe)) + + +typedef int socklen_t; + +struct ipv6_mreq { + struct in6_addr ipv6mr_multiaddr; + unsigned int ipv6mr_interface; +}; +typedef struct ipv6_mreq IPV6_MREG; + +struct in6_pktinfo { + IN6_ADDR ipi6_addr; + UINT ipi6_ifindex; +}; +typedef struct in6_pktinfo IN6_PKTINFO; + +struct addrinfo { + int ai_flags; + int ai_family; + int ai_socktype; + int ai_protocol; + size_t ai_addrlen; + char *ai_canonname; + struct sockaddr *ai_addr; + struct addrinfo *ai_next; +}; + +void WSAAPI freeaddrinfo (struct addrinfo*); +int WSAAPI getaddrinfo (const char*,const char*,const struct addrinfo*, + struct addrinfo**); + +char* WSAAPI gai_strerrorA(int); +WCHAR* WSAAPI gai_strerrorW(int); +#ifdef UNICODE +#define gai_strerror gai_strerrorW +#else +#define gai_strerror gai_strerrorA +#endif /* UNICODE */ + +int WSAAPI getnameinfo(const struct sockaddr*,socklen_t,char*,DWORD, + char*,DWORD,int); + + +/* Some older IPv4/IPv6 compatability stuff */ + +/* This struct lacks sin6_scope_id; retained for use in sockaddr_gen */ +struct sockaddr_in6_old { + short sin6_family; + u_short sin6_port; + u_long sin6_flowinfo; + struct in6_addr sin6_addr; +}; + +typedef union sockaddr_gen{ + struct sockaddr Address; + struct sockaddr_in AddressIn; + struct sockaddr_in6_old AddressIn6; +} sockaddr_gen; + + +typedef struct _INTERFACE_INFO { + u_long iiFlags; + sockaddr_gen iiAddress; + sockaddr_gen iiBroadcastAddress; + sockaddr_gen iiNetmask; +} INTERFACE_INFO, *LPINTERFACE_INFO; + +/* + The definition above can cause problems on NT4,prior to sp4. + To workaround, include the following struct and typedef and + #define INTERFACE_INFO OLD_INTERFACE_INFO + See: FIX: WSAIoctl SIO_GET_INTERFACE_LIST Option Problem + (Q181520) in MSDN KB. + + The old definition causes problems on newer NT and on XP. + +typedef struct _OLD_INTERFACE_INFO { + u_long iiFlags; + struct sockaddr iiAddress; + struct sockaddr iiBroadcastAddress; + struct sockaddr iiNetmask; +} OLD_INTERFACE_INFO; +*/ + +#ifdef __cplusplus +} +#endif + +#endif /* _WS2TCPIP_H */ diff --git a/reactos/w32api/include/wsahelp.h b/reactos/w32api/include/wsahelp.h new file mode 100644 index 00000000000..3c715e622a5 --- /dev/null +++ b/reactos/w32api/include/wsahelp.h @@ -0,0 +1,92 @@ +#ifndef _WSAHELP_H +#define _WSAHELP_H + +#include <winsock2.h> +#include <ntsecapi.h> +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#define WSH_NOTIFY_BIND 0x00000001 +#define WSH_NOTIFY_LISTEN 0x00000002 +#define WSH_NOTIFY_CONNECT 0x00000004 +#define WSH_NOTIFY_ACCEPT 0x00000008 +#define WSH_NOTIFY_SHUTDOWN_RECEIVE 0x00000010 +#define WSH_NOTIFY_SHUTDOWN_SEND 0x00000020 +#define WSH_NOTIFY_SHUTDOWN_ALL 0x00000040 +#define WSH_NOTIFY_CLOSE 0x00000080 +#define WSH_NOTIFY_CONNECT_ERROR 0x00000100 +#define SOL_INTERNAL 0xFFFE +#define SO_CONTEXT 1 + +#ifndef RC_INVOKED +typedef enum _SOCKADDR_ADDRESS_INFO { + SockaddrAddressInfoNormal, + SockaddrAddressInfoWildcard, + SockaddrAddressInfoBroadcast, + SockaddrAddressInfoLoopback +} SOCKADDR_ADDRESS_INFO, *PSOCKADDR_ADDRESS_INFO; +typedef enum _SOCKADDR_ENDPOINT_INFO { + SockaddrEndpointInfoNormal, + SockaddrEndpointInfoWildcard, + SockaddrEndpointInfoReserved +} SOCKADDR_ENDPOINT_INFO, *PSOCKADDR_ENDPOINT_INFO; +typedef struct _WINSOCK_MAPPING { + DWORD Rows; + DWORD Columns; + struct { + DWORD AddressFamily; + DWORD SocketType; + DWORD Protocol; + } Mapping[1]; +} WINSOCK_MAPPING, *PWINSOCK_MAPPING; +typedef struct _SOCKADDR_INFO { + SOCKADDR_ADDRESS_INFO AddressInfo; + SOCKADDR_ENDPOINT_INFO EndpointInfo; +} SOCKADDR_INFO, *PSOCKADDR_INFO; + +INT WINAPI WSHAddressToString(LPSOCKADDR,INT,LPWSAPROTOCOL_INFOW,LPWSTR,LPDWORD); +INT WINAPI WSHEnumProtocols(LPINT,LPWSTR,LPVOID,LPDWORD); +INT WINAPI WSHGetBroadcastSockaddr(PVOID,PSOCKADDR,PINT); +INT WINAPI WSHGetProviderGuid(LPWSTR,LPGUID); +INT WINAPI WSHGetSockaddrType(PSOCKADDR,DWORD,PSOCKADDR_INFO); +INT WINAPI WSHGetSocketInformation(PVOID,SOCKET,HANDLE,HANDLE,INT,INT,PCHAR,INT); +INT WINAPI WSHGetWildcardSockaddr(PVOID,PSOCKADDR,PINT); +DWORD WINAPI WSHGetWinsockMapping(PWINSOCK_MAPPING,DWORD); +INT WINAPI WSHGetWSAProtocolInfo(LPWSTR,LPWSAPROTOCOL_INFOW*,LPDWORD); +INT WINAPI WSHIoctl(PVOID,SOCKET,HANDLE,HANDLE,DWORD,LPVOID,DWORD,LPVOID,DWORD, +LPDWORD,LPWSAOVERLAPPED,LPWSAOVERLAPPED_COMPLETION_ROUTINE,LPBOOL); +INT WINAPI WSHJoinLeaf(PVOID,SOCKET,HANDLE,HANDLE,PVOID,SOCKET,PSOCKADDR, +DWORD,LPWSABUF,LPWSABUF,LPQOS,LPQOS,DWORD); +INT WINAPI WSHNotify(PVOID,SOCKET,HANDLE,HANDLE,DWORD); +INT WINAPI WSHOpenSocket(PINT,PINT,PINT,PUNICODE_STRING,PVOID,PDWORD); +INT WINAPI WSHOpenSocket2(PINT,PINT,PINT,GROUP,DWORD,PUNICODE_STRING,PVOID*,PDWORD); +INT WINAPI WSHSetSocketInformation(PVOID,SOCKET,HANDLE,HANDLE,INT,INT,PCHAR,INT); +INT WINAPI WSHStringToAddress(LPWSTR,DWORD,LPWSAPROTOCOL_INFOW,LPSOCKADDR,LPDWORD); + +typedef INT (WINAPI *PWSH_ADDRESS_TO_STRING)(LPSOCKADDR,INT,LPWSAPROTOCOL_INFOW,LPWSTR,LPDWORD); +typedef INT (WINAPI *PWSH_ENUM_PROTOCOLS)(LPINT,LPWSTR,LPVOID,LPDWORD); +typedef INT (WINAPI *PWSH_GET_BROADCAST_SOCKADDR)(PVOID,PSOCKADDR,PINT); +typedef INT (WINAPI *PWSH_GET_PROVIDER_GUID)(LPWSTR,LPGUID); +typedef INT (WINAPI *PWSH_GET_SOCKADDR_TYPE)(PSOCKADDR,DWORD,PSOCKADDR_INFO); +typedef INT (WINAPI *PWSH_GET_SOCKET_INFORMATION)(PVOID,SOCKET,HANDLE,HANDLE,INT,INT,PCHAR,INT); +typedef INT (WINAPI *PWSH_GET_WILDCARD_SOCKEADDR)(PVOID,PSOCKADDR,PINT); +typedef DWORD (WINAPI *PWSH_GET_WINSOCK_MAPPING)(PWINSOCK_MAPPING,DWORD); +typedef INT (WINAPI *PWSH_GET_WSAPROTOCOL_INFO)(LPWSTR,LPWSAPROTOCOL_INFOW*,LPDWORD); +typedef INT (WINAPI *PWSH_IOCTL)(PVOID,SOCKET,HANDLE,HANDLE,DWORD,LPVOID,DWORD, + LPVOID,DWORD,LPDWORD,LPWSAOVERLAPPED,LPWSAOVERLAPPED_COMPLETION_ROUTINE,LPBOOL); +typedef INT (WINAPI *PWSH_JOIN_LEAF)(PVOID,SOCKET,HANDLE,HANDLE,PVOID,SOCKET, + PSOCKADDR,DWORD,LPWSABUF,LPWSABUF,LPQOS,LPQOS,DWORD); +typedef INT (WINAPI *PWSH_NOTIFY)(PVOID,SOCKET,HANDLE,HANDLE,DWORD); +typedef INT (WINAPI *PWSH_OPEN_SOCKET)(PINT,PINT,PINT,PUNICODE_STRING,PVOID,PDWORD); +typedef INT (WINAPI *PWSH_OPEN_SOCKET2)(PINT,PINT,PINT,GROUP,DWORD,PUNICODE_STRING,PVOID*,PDWORD); +typedef INT (WINAPI *PWSH_SET_SOCKET_INFORMATION)(PVOID,SOCKET,HANDLE,HANDLE,INT,INT,PCHAR,INT); +typedef INT (WINAPI *PWSH_STRING_TO_ADDRESS)(LPWSTR,DWORD,LPWSAPROTOCOL_INFOW,LPSOCKADDR,LPDWORD); + +#endif /* RC_INVOKED */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _WSAHELP_H */ diff --git a/reactos/w32api/include/wsipx.h b/reactos/w32api/include/wsipx.h new file mode 100644 index 00000000000..4f24db43bc6 --- /dev/null +++ b/reactos/w32api/include/wsipx.h @@ -0,0 +1,28 @@ +/* WSIPX.H - initially taken from the Wine project + */ + +#ifndef _WSIPX_H +#define _WSIPX_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define NSPROTO_IPX 1000 +#define NSPROTO_SPX 1256 +#define NSPROTO_SPXII 1257 + +typedef struct sockaddr_ipx { + short sa_family; + char sa_netnum[4]; + char sa_nodenum[6]; + unsigned short sa_socket; +} SOCKADDR_IPX, *PSOCKADDR_IPX, *LPSOCKADDR_IPX; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/wsnetbs.h b/reactos/w32api/include/wsnetbs.h new file mode 100644 index 00000000000..e435b5daf1f --- /dev/null +++ b/reactos/w32api/include/wsnetbs.h @@ -0,0 +1,35 @@ +#ifndef _WSNETBS_H +#define _WSNETBS_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#define NETBIOS_NAME_LENGTH 16 +#define NETBIOS_UNIQUE_NAME 0 +#define NETBIOS_GROUP_NAME 1 +#define NETBIOS_TYPE_QUICK_UNIQUE 2 +#define NETBIOS_TYPE_QUICK_GROUP 3 + +#ifndef RC_INVOKED +typedef struct sockaddr_nb { + short snb_family; + u_short snb_type; + char snb_name[NETBIOS_NAME_LENGTH]; +} SOCKADDR_NB, *PSOCKADDR_NB, *LPSOCKADDR_NB; +#define SET_NETBIOS_SOCKADDR(_snb,_type,_name,_port) \ +{ \ + register int _i; \ + register char *_n = (_name); \ + register PSOCKADDR_NB _s = (_snb); \ + _s->snb_family = AF_NETBIOS; \ + _s->snb_type = (_type); \ + for (_i=0; _n[_i] != '\0' && _i<NETBIOS_NAME_LENGTH-1; _i++) { \ + _s->snb_name[_i] = _n[_i]; \ + } \ + for (; _i<NETBIOS_NAME_LENGTH-1; _i++) { \ + _s->snb_name[_i] = ' '; \ + } \ + _s->snb_name[NETBIOS_NAME_LENGTH-1] = (_port); \ +} +#endif /* RC_INVOKED */ +#endif diff --git a/reactos/w32api/include/wtypes.h b/reactos/w32api/include/wtypes.h new file mode 100644 index 00000000000..612b8dc9790 --- /dev/null +++ b/reactos/w32api/include/wtypes.h @@ -0,0 +1,173 @@ +#include <rpc.h> +#include <rpcndr.h> + +#ifndef _WTYPES_H +#define _WTYPES_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define IID_NULL GUID_NULL +#define CLSID_NULL GUID_NULL +#define CBPCLIPDATA(d) ((d).cbSize-sizeof((d).ulClipFmt)) +#define DECIMAL_NEG ((BYTE)0x80) +#define DECIMAL_SETZERO(d) {(d).Lo64=(d).Hi32=(d).signscale=0;} +#define ROTFLAGS_REGISTRATIONKEEPSALIVE 0x01 +#define ROTFLAGS_ALLOWANYCLIENT 0x02 + +#ifndef __BLOB_T_DEFINED /* also in winsock2.h */ +#define __BLOB_T_DEFINED +typedef struct _BLOB { + ULONG cbSize; + BYTE *pBlobData; +} BLOB,*PBLOB,*LPBLOB; +#endif +typedef enum tagDVASPECT { + DVASPECT_CONTENT=1, + DVASPECT_THUMBNAIL=2, + DVASPECT_ICON=4, + DVASPECT_DOCPRINT=8 +} DVASPECT; +typedef enum tagDVASPECT2 { + DVASPECT_OPAQUE=16, + DVASPECT_TRANSPARENT=32 +} DVASPECT2; +typedef enum tagSTATFLAG { + STATFLAG_DEFAULT=0, + STATFLAG_NONAME=1 +} STATFLAG; +typedef enum tagMEMCTX { + MEMCTX_LOCAL=0, + MEMCTX_TASK, + MEMCTX_SHARED, + MEMCTX_MACSYSTEM, + MEMCTX_UNKNOWN=-1, + MEMCTX_SAME=-2 +} MEMCTX; +typedef enum tagMSHCTX { + MSHCTX_LOCAL=0, + MSHCTX_NOSHAREDMEM, + MSHCTX_DIFFERENTMACHINE, + MSHCTX_INPROC, + MSHCTX_CROSSCTX +} MSHCTX; +typedef enum tagCLSCTX { + CLSCTX_INPROC_SERVER=1,CLSCTX_INPROC_HANDLER=2,CLSCTX_LOCAL_SERVER=4, + CLSCTX_INPROC_SERVER16=8,CLSCTX_REMOTE_SERVER=16 +} CLSCTX; +typedef enum tagMSHLFLAGS { + MSHLFLAGS_NORMAL,MSHLFLAGS_TABLESTRONG,MSHLFLAGS_TABLEWEAK +} MSHLFLAGS; +typedef struct _FLAGGED_WORD_BLOB { + unsigned long fFlags; + unsigned long clSize; + unsigned short asData[1]; +}FLAGGED_WORD_BLOB; + +#ifndef OLE2ANSI +typedef WCHAR OLECHAR; +typedef LPWSTR LPOLESTR; +typedef LPCWSTR LPCOLESTR; +#define OLESTR(s) L##s +#else +typedef char OLECHAR; +typedef LPSTR LPOLESTR; +typedef LPCSTR LPCOLESTR; +#define OLESTR(s) s +#endif +typedef unsigned short VARTYPE; +typedef short VARIANT_BOOL; +typedef VARIANT_BOOL _VARIANT_BOOL; +#define VARIANT_TRUE ((VARIANT_BOOL)0xffff) +#define VARIANT_FALSE ((VARIANT_BOOL)0) +typedef OLECHAR *BSTR; +typedef FLAGGED_WORD_BLOB *wireBSTR; +typedef BSTR *LPBSTR; +typedef LONG SCODE; +typedef void *HCONTEXT; +typedef union tagCY { + _ANONYMOUS_STRUCT struct { + unsigned long Lo; + long Hi; + }_STRUCT_NAME(s); + LONGLONG int64; +} CY; +typedef double DATE; +typedef struct tagBSTRBLOB { + ULONG cbSize; + PBYTE pData; +}BSTRBLOB; +typedef struct tagBSTRBLOB *LPBSTRBLOB; +typedef struct tagCLIPDATA { + ULONG cbSize; + long ulClipFmt; + PBYTE pClipData; +}CLIPDATA; +typedef enum tagSTGC { + STGC_DEFAULT,STGC_OVERWRITE,STGC_ONLYIFCURRENT, + STGC_DANGEROUSLYCOMMITMERELYTODISKCACHE +}STGC; +typedef enum tagSTGMOVE { + STGMOVE_MOVE,STGMOVE_COPY,STGMOVE_SHALLOWCOPY +}STGMOVE; +enum VARENUM { + VT_EMPTY,VT_NULL,VT_I2,VT_I4,VT_R4,VT_R8,VT_CY,VT_DATE,VT_BSTR,VT_DISPATCH, + VT_ERROR,VT_BOOL,VT_VARIANT,VT_UNKNOWN,VT_DECIMAL,VT_I1=16,VT_UI1,VT_UI2,VT_UI4,VT_I8, + VT_UI8,VT_INT,VT_UINT,VT_VOID,VT_HRESULT,VT_PTR,VT_SAFEARRAY,VT_CARRAY,VT_USERDEFINED, + VT_LPSTR,VT_LPWSTR,VT_RECORD=36,VT_FILETIME=64,VT_BLOB,VT_STREAM,VT_STORAGE,VT_STREAMED_OBJECT, + VT_STORED_OBJECT,VT_BLOB_OBJECT,VT_CF,VT_CLSID,VT_BSTR_BLOB=0xfff,VT_VECTOR=0x1000, + VT_ARRAY=0x2000,VT_BYREF=0x4000,VT_RESERVED=0x8000,VT_ILLEGAL= 0xffff,VT_ILLEGALMASKED=0xfff, + VT_TYPEMASK=0xfff +}; +#ifdef _WIN64 +#define VT_INT_PTR VT_I8 +#define VT_UINT_PTR VT_UI8 +#else +#define VT_INT_PTR VT_I4 +#define VT_UINT_PTR VT_UI4 +#endif + +typedef struct _BYTE_SIZEDARR { + unsigned long clSize; + byte *pData; +}BYTE_SIZEDARR; +typedef struct _SHORT_SIZEDARR { + unsigned long clSize; + unsigned short *pData; +}WORD_SIZEDARR; +typedef struct _LONG_SIZEDARR { + unsigned long clSize; + unsigned long *pData; +}DWORD_SIZEDARR; +typedef struct _HYPER_SIZEDARR { + unsigned long clSize; + hyper *pData; +}HYPER_SIZEDARR; +typedef double DOUBLE; +typedef struct tagDEC { + USHORT wReserved; + _ANONYMOUS_UNION union { + _ANONYMOUS_STRUCT struct { + BYTE scale; + BYTE sign; + }_STRUCT_NAME(s); + USHORT signscale; + } DUMMYUNIONNAME; + ULONG Hi32; + _ANONYMOUS_UNION union { + _ANONYMOUS_STRUCT struct { + ULONG Lo32; + ULONG Mid32; + }_STRUCT_NAME(s2); + ULONGLONG Lo64; + } DUMMYUNIONNAME2; +} DECIMAL; +typedef void *HMETAFILEPICT; +#ifdef __cplusplus +} +#endif +#endif diff --git a/reactos/w32api/include/zmouse.h b/reactos/w32api/include/zmouse.h new file mode 100644 index 00000000000..764d43d1314 --- /dev/null +++ b/reactos/w32api/include/zmouse.h @@ -0,0 +1,36 @@ +/* + zmouse.h - Header for IntelliMouse. + + This file is part of a free library for the Win32 API. + + 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. + + FIXME: This file is obviously horribly incomplete! + +*/ + +#ifndef _ZMOUSE_H +#define _ZMOUSE_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifndef WM_MOUSEWHEEL +# define WM_MOUSEWHEEL (WM_MOUSELAST + 1) +#endif + +#ifndef WHEEL_DELTA +# define WHEEL_DELTA 120 +#endif + +#ifndef WHEEL_PAGESCROLL +# define WHEEL_PAGESCROLL UINT_MAX +#endif + +#ifndef SPI_SETWHEELSCROLLLINES +# define SPI_SETWHEELSCROLLLINES 105 +#endif + +#endif /* _ZMOUSE_H */ diff --git a/rosapps/calc/makefile b/rosapps/calc/makefile index b8c2cc1e410..75dcaa63476 100644 --- a/rosapps/calc/makefile +++ b/rosapps/calc/makefile @@ -18,6 +18,8 @@ TARGET_NAME = calc WINE_INCLUDE = ./ +TARGET_CFLAGS = -D__USE_W32API + #TARGET_CFLAGS = -I$(TEST_ROOT) -DDBG -DUNICODE -D_UNICODE BASE_CFLAGS = -D_WIN32_IE=0x0400 diff --git a/rosapps/dflat32/makefile b/rosapps/dflat32/makefile index 5ac8176a7c1..9c2f8636645 100644 --- a/rosapps/dflat32/makefile +++ b/rosapps/dflat32/makefile @@ -18,6 +18,8 @@ WINE_RC = $(TARGET_NAME) WINE_INCLUDE = ./ +TARGET_CFLAGS = -D__USE_W32API + #WITH_DEBUGGING=yes TARGET_SDKLIBS = \ diff --git a/rosapps/hcalc/Makefile b/rosapps/hcalc/Makefile index c256679e234..c27d52ef9ee 100644 --- a/rosapps/hcalc/Makefile +++ b/rosapps/hcalc/Makefile @@ -18,6 +18,8 @@ WINE_RC = $(TARGET_NAME) WINE_INCLUDE = ./ +TARGET_CFLAGS = -D__USE_W32API + TARGET_SDKLIBS = \ kernel32.a \ user32.a \ diff --git a/rosapps/mc/Makefile b/rosapps/mc/Makefile index b5e2956a405..8a3d5b1ab40 100644 --- a/rosapps/mc/Makefile +++ b/rosapps/mc/Makefile @@ -14,13 +14,7 @@ TARGET_APPTYPE = console TARGET_NAME = mc -TARGET_CFLAGS = -I./pc -I./slang -DMC_$(TARGET_OS) -DHAVE_CONFIG_H - -WINE_MODE = yes - -WINE_RC = $(TARGET_NAME) - -WINE_INCLUDE = ./ +TARGET_CFLAGS = -I./pc -I./slang -DMC_$(TARGET_OS) -DHAVE_CONFIG_H -D__USE_W32API TARGET_SDKLIBS = \ kernel32.a \ diff --git a/rosapps/notepad/makefile b/rosapps/notepad/makefile index c4c5f4c32be..ef75fcf72fc 100644 --- a/rosapps/notepad/makefile +++ b/rosapps/notepad/makefile @@ -26,8 +26,8 @@ TARGET_SDKLIBS = \ kernel32.a \ user32.a \ gdi32.a \ - $(COMCTL32_TARGET).a \ - $(COMDLG32_TARGET).a + comctl32.a \ + comdlg32.a TARGET_OBJECTS = \ framewnd.o \ diff --git a/rosapps/rules.mak b/rosapps/rules.mak index 13dc0f06676..b8bb6417762 100644 --- a/rosapps/rules.mak +++ b/rosapps/rules.mak @@ -19,6 +19,8 @@ ifeq ($(HOST),mingw32-linux) TOPDIR := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi) endif +W32API_PATH = $(PATH_TO_TOP)/../reactos/w32api + # # Choose various options # @@ -85,6 +87,7 @@ CFLAGS = \ -Wall \ -Wstrict-prototypes \ -fno-builtin \ + -I$(W32API_PATH)/include \ $(LEAN_AND_MEAN_DEFINE) \ $(DEFINES) \ $(DEBUGGING_CFLAGS) \ diff --git a/rosapps/winfile/Makefile b/rosapps/winfile/Makefile index 9db8b020235..51825a55795 100644 --- a/rosapps/winfile/Makefile +++ b/rosapps/winfile/Makefile @@ -12,7 +12,7 @@ TARGET_APPTYPE = windows TARGET_NAME = winfile -TARGET_CFLAGS = -D_WIN32_IE=0x0400 +TARGET_CFLAGS = -D_WIN32_IE=0x0400 -D__USE_W32API TARGET_RCFLAGS = -D_WIN32_IE=0x0400 From 5b5028fcb9d45aa9c5242243a65464d4691e8356 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sat, 21 Feb 2004 12:58:49 +0000 Subject: [PATCH 0104/1463] - Fixed a wrong index, which resulted in writing over the end of an allocated buffer. svn path=/trunk/; revision=8284 --- reactos/drivers/net/ndis/ndis/io.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/reactos/drivers/net/ndis/ndis/io.c b/reactos/drivers/net/ndis/ndis/io.c index ceb0ab80ff3..0ec3e106a95 100644 --- a/reactos/drivers/net/ndis/ndis/io.c +++ b/reactos/drivers/net/ndis/ndis/io.c @@ -426,6 +426,7 @@ NdisMAllocateMapRegisters( { NDIS_DbgPrint(MAX_TRACE, ("iterating, basemapregistersneeded = %d, IoAlloc = 0x%x\n", BaseMapRegistersNeeded, IoAllocateAdapterChannel)); + BaseMapRegistersNeeded--; Adapter->NdisMiniportBlock.CurrentMapRegister = BaseMapRegistersNeeded; KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); { @@ -453,8 +454,6 @@ NdisMAllocateMapRegisters( NDIS_DbgPrint(MAX_TRACE, ("resetting event\n")); KeResetEvent(&Adapter->DmaEvent); - - BaseMapRegistersNeeded--; } NDIS_DbgPrint(MAX_TRACE, ("returning success\n")); From 409eab1805cc1e19636c340604c97cc995a898dd Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 21 Feb 2004 13:13:27 +0000 Subject: [PATCH 0105/1463] - Fixed some nonsense code in NtGdiGetDCEx. - Fixed few race conditions in painting code. - Removed function IntGetNCUpdateRegion and inlined it's code into IntInvalidateWindows. - Removed function IsHidden and replaced it's usage by IntIsWindowVisible. svn path=/trunk/; revision=8285 --- reactos/subsys/win32k/ntuser/desktop.c | 3 +- reactos/subsys/win32k/ntuser/painting.c | 142 ++++++++++-------------- reactos/subsys/win32k/ntuser/windc.c | 26 ++--- reactos/subsys/win32k/ntuser/window.c | 27 +---- reactos/subsys/win32k/ntuser/winpos.c | 8 +- 5 files changed, 77 insertions(+), 129 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/desktop.c b/reactos/subsys/win32k/ntuser/desktop.c index a4bbac36970..558c09f4006 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.8 2003/12/26 00:58:33 weiden Exp $ + * $Id: desktop.c,v 1.9 2004/02/21 13:13:26 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -254,7 +254,6 @@ IntHideDesktop(PDESKTOP_OBJECT Desktop) } /* -<<<<<<< winsta.c * NtUserCreateDesktop * * Creates a new desktop. diff --git a/reactos/subsys/win32k/ntuser/painting.c b/reactos/subsys/win32k/ntuser/painting.c index 03c4e0bf74e..c3aabd0a82f 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.67 2004/02/04 23:01:07 gvg Exp $ + * $Id: painting.c,v 1.68 2004/02/21 13:13:26 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -92,60 +92,6 @@ IntValidateParent(PWINDOW_OBJECT Child, HRGN ValidRegion) } } -/* - * IntGetNCUpdateRegion - * - * Get nonclient part of window update region. - * - * Return Value - * Handle to region that represents invalid nonclient window area. The - * caller is responsible for deleting it. - * - * Remarks - * This function also marks the nonclient update region of window - * as valid, clears the WINDOWOBJECT_NEED_NCPAINT flag. - */ - -STATIC HRGN FASTCALL -IntGetNCUpdateRegion(PWINDOW_OBJECT Window) -{ - HRGN WindowRgn; - HRGN NonclientRgn; - - ASSERT(! ExTryToAcquireFastMutex(&Window->UpdateLock)); - - /* - * Generate the update region. - */ - - WindowRgn = UnsafeIntCreateRectRgnIndirect(&Window->ClientRect); - NtGdiOffsetRgn(WindowRgn, - -Window->WindowRect.left, - -Window->WindowRect.top); - NonclientRgn = NtGdiCreateRectRgn(0, 0, 0, 0); - if (NtGdiCombineRgn(NonclientRgn, Window->UpdateRegion, - WindowRgn, RGN_DIFF) == NULLREGION) - { - NtGdiDeleteObject(NonclientRgn); - NonclientRgn = NULL; - } - - /* - * Remove the nonclient region from the standard update region. - */ - - if (NtGdiCombineRgn(Window->UpdateRegion, Window->UpdateRegion, - WindowRgn, RGN_AND) == NULLREGION) - { - NtGdiDeleteObject(Window->UpdateRegion); - Window->UpdateRegion = NULL; - } - - NtGdiDeleteObject(WindowRgn); - - return NonclientRgn; -} - /* * IntPaintWindows * @@ -158,11 +104,6 @@ IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags) HDC hDC; HWND hWnd = Window->Self; - if (! (Window->Style & WS_VISIBLE)) - { - return; - } - if (Flags & (RDW_ERASENOW | RDW_UPDATENOW)) { if (Window->Flags & WINDOWOBJECT_NEED_NCPAINT) @@ -239,7 +180,7 @@ IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags) for (phWnd = List; *phWnd; ++phWnd) { Window = IntGetWindowObject(*phWnd); - if (Window) + if (Window && (Window->Style & WS_VISIBLE)) { IntPaintWindows(Window, Flags); IntReleaseWindowObject(Window); @@ -262,7 +203,6 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags) INT RgnType; BOOL HadPaintMessage, HadNCPaintMessage; BOOL HasPaintMessage, HasNCPaintMessage; - HRGN hRgnWindow; /* * Clip the given region with window rectangle (or region) @@ -272,11 +212,13 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags) if (!Window->WindowRegion) #endif { + HRGN hRgnWindow; + hRgnWindow = UnsafeIntCreateRectRgnIndirect(&Window->WindowRect); NtGdiOffsetRgn(hRgnWindow, -Window->WindowRect.left, -Window->WindowRect.top); - RgnType = NtGdiCombineRgn(hRgn, hRgn, hRgnWindow, RGN_AND); + RgnType = NtGdiCombineRgn(hRgn, hRgn, hRgnWindow, RGN_AND); NtGdiDeleteObject(hRgnWindow); } #ifdef TODO @@ -355,16 +297,44 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags) * Split the nonclient update region. */ - if (Window->NCUpdateRegion == NULL) { - Window->NCUpdateRegion = IntGetNCUpdateRegion(Window); - } - else - { - HRGN hRgnNonClient = IntGetNCUpdateRegion(Window); - NtGdiCombineRgn(Window->NCUpdateRegion, Window->NCUpdateRegion, - hRgnNonClient, RGN_OR); - NtGdiDeleteObject(hRgnNonClient); + HRGN hRgnWindow, hRgnNonClient; + + hRgnWindow = UnsafeIntCreateRectRgnIndirect(&Window->ClientRect); + NtGdiOffsetRgn(hRgnWindow, + -Window->WindowRect.left, + -Window->WindowRect.top); + + hRgnNonClient = NtGdiCreateRectRgn(0, 0, 0, 0); + if (NtGdiCombineRgn(hRgnNonClient, Window->UpdateRegion, + hRgnWindow, RGN_DIFF) == NULLREGION) + { + NtGdiDeleteObject(hRgnNonClient); + hRgnNonClient = NULL; + } + + /* + * Remove the nonclient region from the standard update region. + */ + + if (NtGdiCombineRgn(Window->UpdateRegion, Window->UpdateRegion, + hRgnWindow, RGN_AND) == NULLREGION) + { + NtGdiDeleteObject(Window->UpdateRegion); + Window->UpdateRegion = NULL; + } + + if (Window->NCUpdateRegion == NULL) + { + Window->NCUpdateRegion = hRgnNonClient; + } + else + { + NtGdiCombineRgn(Window->NCUpdateRegion, Window->NCUpdateRegion, + hRgnNonClient, RGN_OR); + } + + NtGdiDeleteObject(hRgnWindow); } /* @@ -408,6 +378,7 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags) /* * Fake post paint messages to window message queue if needed */ + HasPaintMessage = Window->UpdateRegion != NULL || Window->Flags & WINDOWOBJECT_NEED_INTERNALPAINT; HasNCPaintMessage = Window->Flags & WINDOWOBJECT_NEED_NCPAINT; @@ -534,7 +505,8 @@ IntRedrawWindow(PWINDOW_OBJECT Window, const RECT* UpdateRect, HRGN UpdateRgn, * Repaint and erase windows if needed. */ - if (Flags & (RDW_ERASENOW | RDW_UPDATENOW)) + if ((Flags & (RDW_ERASENOW | RDW_UPDATENOW)) && + IntIsWindowVisible(Window)) { IntPaintWindows(Window, Flags); } @@ -552,6 +524,15 @@ IntRedrawWindow(PWINDOW_OBJECT Window, const RECT* UpdateRect, HRGN UpdateRgn, return TRUE; } +BOOL FASTCALL +IntIsWindowDirty(PWINDOW_OBJECT Window) +{ + return (Window->Style & WS_VISIBLE) && + ((Window->UpdateRegion != NULL) || + (Window->Flags & WINDOWOBJECT_NEED_INTERNALPAINT) || + (Window->Flags & WINDOWOBJECT_NEED_NCPAINT)); +} + HWND STDCALL IntFindWindowToRepaint(HWND hWnd, PW32THREAD Thread) { @@ -563,8 +544,7 @@ IntFindWindowToRepaint(HWND hWnd, PW32THREAD Thread) if (Window == NULL) return NULL; - if ((Window->UpdateRegion != NULL || - Window->Flags & (WINDOWOBJECT_NEED_INTERNALPAINT | WINDOWOBJECT_NEED_NCPAINT)) && + if (IntIsWindowDirty(Window) && IntWndBelongsToThread(Window, Thread)) { IntReleaseWindowObject(Window); @@ -573,13 +553,10 @@ IntFindWindowToRepaint(HWND hWnd, PW32THREAD Thread) ExAcquireFastMutex(&Window->ChildrenListLock); - for (Child = Window->FirstChild; Child; Child = Child->NextSibling) + for (Child = Window->LastChild; Child; Child = Child->PrevSibling) { - if (Child->Style & WS_VISIBLE && - (Child->UpdateRegion != NULL || - Child->Flags & WINDOWOBJECT_NEED_INTERNALPAINT || - Child->Flags & WINDOWOBJECT_NEED_NCPAINT) - && IntWndBelongsToThread(Child, Thread)) + if (IntIsWindowDirty(Child) && + IntWndBelongsToThread(Child, Thread)) { hFoundWnd = Child->Self; break; @@ -588,7 +565,7 @@ IntFindWindowToRepaint(HWND hWnd, PW32THREAD Thread) if (hFoundWnd == NULL) { - for (Child = Window->FirstChild; Child; Child = Child->NextSibling) + for (Child = Window->LastChild; Child; Child = Child->PrevSibling) { if (Child->Style & WS_VISIBLE) { @@ -643,6 +620,7 @@ IntGetPaintMessage(HWND hWnd, PW32THREAD Thread, MSG *Message, Message->lParam = 0; if (Remove) { + IntValidateParent(Window, Window->NCUpdateRegion); Window->NCUpdateRegion = NULL; Window->Flags &= ~WINDOWOBJECT_NEED_NCPAINT; MsqDecPaintCountQueue(Window->MessageQueue); diff --git a/reactos/subsys/win32k/ntuser/windc.c b/reactos/subsys/win32k/ntuser/windc.c index f724e343ea8..3cbe02bfd43 100644 --- a/reactos/subsys/win32k/ntuser/windc.c +++ b/reactos/subsys/win32k/ntuser/windc.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: windc.c,v 1.56 2004/02/08 22:02:40 gvg Exp $ +/* $Id: windc.c,v 1.57 2004/02/21 13:13:27 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -240,8 +240,7 @@ DceUpdateVisRgn(DCE *Dce, PWINDOW_OBJECT Window, ULONG Flags) Parent = Window->Parent; - if (Window->Style & WS_VISIBLE /*&& - !(Parent->Style & WS_MINIMIZE)*/) + if (Window->Style & WS_VISIBLE) { if (Parent->Style & WS_CLIPSIBLINGS) { @@ -381,18 +380,15 @@ NtUserGetDCEx(HWND hWnd, HANDLE ClipRegion, ULONG Flags) else if (Flags & DCX_PARENTCLIP) { Flags |= DCX_CACHE; - if (!(Flags & (DCX_CLIPCHILDREN | DCX_CLIPSIBLINGS))) - { - if ((Window->Style & WS_VISIBLE) && - (Window->Parent->Style & WS_VISIBLE)) - { - Flags &= ~DCX_CLIPCHILDREN; - if (Window->Parent->Style & WS_CLIPSIBLINGS) - { - Flags |= DCX_CLIPSIBLINGS; - } - } - } + if ((Window->Style & WS_VISIBLE) && + (Window->Parent->Style & WS_VISIBLE)) + { + Flags &= ~DCX_CLIPCHILDREN; + if (Window->Parent->Style & WS_CLIPSIBLINGS) + { + Flags |= DCX_CLIPSIBLINGS; + } + } } DcxFlags = Flags & DCX_CACHECOMPAREMASK; diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 0a7b6d000d8..9a0cd6dd21d 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.185 2004/02/19 21:12:09 weiden Exp $ +/* $Id: window.c,v 1.186 2004/02/21 13:13:27 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -3309,29 +3309,6 @@ static BOOL IsStaticClass(PWINDOW_OBJECT Window) return rc; } -static BOOL IsHidden(PWINDOW_OBJECT Window) -{ - BOOL rc = FALSE; - ASSERT(0 != Window); - PWINDOW_OBJECT wnd = Window; - - while (0 != wnd && wnd->Style & WS_CHILD) - { - if (!(wnd->Style & WS_VISIBLE)) - { - rc = TRUE; - break; - } - wnd = wnd->Parent; - } - if (0 != wnd) - { - rc = !(wnd->Style & WS_VISIBLE); - } - - return rc; -} - static BOOL IsDisabled(PWINDOW_OBJECT Window) { BOOL rc = FALSE; @@ -3365,7 +3342,7 @@ static PWINDOW_OBJECT RestrictiveSearchChildWindows(PWINDOW_OBJECT Window, POINT */ if (!IsStaticClass(ChildWindow) && !IsDisabled(ChildWindow) && - !IsHidden(ChildWindow) ) + IntIsWindowVisible(ChildWindow)) { /* **Now find the deepest child window diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index f0b7c198a62..f5224e26f0d 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.92 2004/02/19 21:12:09 weiden Exp $ +/* $Id: winpos.c,v 1.93 2004/02/21 13:13:27 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -747,8 +747,8 @@ WinPosSetWindowPos(HWND Wnd, HWND WndInsertAfter, INT x, INT y, INT cx, if (Wnd == IntGetDesktopWindow() && Window->OwnerThread->ThreadsProcess != PsGetCurrentProcess()) { - IntReleaseWindowObject(Window); - return FALSE; + IntReleaseWindowObject(Window); + return FALSE; } WinPos.hwnd = Wnd; @@ -831,8 +831,6 @@ WinPosSetWindowPos(HWND Wnd, HWND WndInsertAfter, INT x, INT y, INT cx, } } - /* FIXME: Reset active DCEs */ - OldWindowRect = Window->WindowRect; OldClientRect = Window->ClientRect; From 717c7d03330336c37b45a16a7666b9ea7104db9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Sat, 21 Feb 2004 13:37:26 +0000 Subject: [PATCH 0106/1463] Fix double release of fast mutex svn path=/trunk/; revision=8286 --- reactos/subsys/win32k/ntuser/winpos.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index f5224e26f0d..e8f9b46b877 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.93 2004/02/21 13:13:27 navaraf Exp $ +/* $Id: winpos.c,v 1.94 2004/02/21 13:37:26 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1282,9 +1282,9 @@ WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, POINT *Point, Point->y < Current->ClientRect.bottom) { USHORT ChildHitTest; - ExReleaseFastMutexUnsafe(&ScopeWin->ChildrenListLock); if(WinPosSearchChildren(Current, Point, Window, &ChildHitTest)) { + ExReleaseFastMutexUnsafe(&ScopeWin->ChildrenListLock); *HitTest = ChildHitTest; return TRUE; } From 391292e419478054ca68ea49f11f31d44a04799c Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 21 Feb 2004 13:51:13 +0000 Subject: [PATCH 0107/1463] - Minor correction svn path=/trunk/; revision=8287 --- reactos/subsys/win32k/ntuser/painting.c | 5 ++--- reactos/subsys/win32k/ntuser/winpos.c | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/painting.c b/reactos/subsys/win32k/ntuser/painting.c index c3aabd0a82f..28b7e7b69ff 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.68 2004/02/21 13:13:26 navaraf Exp $ + * $Id: painting.c,v 1.69 2004/02/21 13:51:13 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -505,8 +505,7 @@ IntRedrawWindow(PWINDOW_OBJECT Window, const RECT* UpdateRect, HRGN UpdateRgn, * Repaint and erase windows if needed. */ - if ((Flags & (RDW_ERASENOW | RDW_UPDATENOW)) && - IntIsWindowVisible(Window)) + if (Flags & (RDW_ERASENOW | RDW_UPDATENOW)) { IntPaintWindows(Window, Flags); } diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index e8f9b46b877..6c9bbf0725c 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.94 2004/02/21 13:37:26 gvg Exp $ +/* $Id: winpos.c,v 1.95 2004/02/21 13:51:13 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1022,7 +1022,7 @@ WinPosSetWindowPos(HWND Wnd, HWND WndInsertAfter, INT x, INT y, INT cx, NtGdiDeleteObject(VisAfter); } - if (!(WinPos.flags & SWP_NOREDRAW)) + if (!(WinPos.flags & SWP_NOREDRAW) && IntIsWindowVisible(Window)) { IntRedrawWindow(Window, NULL, 0, RDW_ALLCHILDREN | RDW_ERASENOW); } From c2458a1a4cdb5833368184ba5147f4da54ee55ed Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 21 Feb 2004 13:56:36 +0000 Subject: [PATCH 0108/1463] CVS maintenance svn path=/trunk/; revision=8288 --- reactos/apps/tests/cliarea/.cvsignore | 6 ++++++ reactos/apps/tests/lock/.cvsignore | 6 ++++++ reactos/drivers/dd/sound/.cvsignore | 7 +++---- reactos/drivers/net/tditest/.cvsignore | 1 + reactos/drivers/net/tditest/tditest/.cvsignore | 2 ++ 5 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 reactos/apps/tests/cliarea/.cvsignore create mode 100644 reactos/apps/tests/lock/.cvsignore create mode 100644 reactos/drivers/net/tditest/tditest/.cvsignore diff --git a/reactos/apps/tests/cliarea/.cvsignore b/reactos/apps/tests/cliarea/.cvsignore new file mode 100644 index 00000000000..d63774a7353 --- /dev/null +++ b/reactos/apps/tests/cliarea/.cvsignore @@ -0,0 +1,6 @@ +*.o +*.d +*.exe +*.coff +*.sym +*.map diff --git a/reactos/apps/tests/lock/.cvsignore b/reactos/apps/tests/lock/.cvsignore new file mode 100644 index 00000000000..bafdb94150e --- /dev/null +++ b/reactos/apps/tests/lock/.cvsignore @@ -0,0 +1,6 @@ +*.exe +*.sym +*.coff +*.d +*.o +*.map diff --git a/reactos/drivers/dd/sound/.cvsignore b/reactos/drivers/dd/sound/.cvsignore index a576db0a2b4..70c367194a2 100644 --- a/reactos/drivers/dd/sound/.cvsignore +++ b/reactos/drivers/dd/sound/.cvsignore @@ -1,8 +1,7 @@ base.tmp junk.tmp temp.exp -sound.coff -sound.sys -sound.sys.unstripped - +*.coff +*.sys +*.sym *.map diff --git a/reactos/drivers/net/tditest/.cvsignore b/reactos/drivers/net/tditest/.cvsignore index 12395156e6f..f66cc3edfa4 100644 --- a/reactos/drivers/net/tditest/.cvsignore +++ b/reactos/drivers/net/tditest/.cvsignore @@ -2,5 +2,6 @@ objects tditest.coff *.d *.o +*.sys *.sym *.map diff --git a/reactos/drivers/net/tditest/tditest/.cvsignore b/reactos/drivers/net/tditest/tditest/.cvsignore new file mode 100644 index 00000000000..ecc3f45a042 --- /dev/null +++ b/reactos/drivers/net/tditest/tditest/.cvsignore @@ -0,0 +1,2 @@ +*.o +*.map From 445eb5362d410b35cf6a87c80309161e0414b648 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 21 Feb 2004 13:57:31 +0000 Subject: [PATCH 0109/1463] - Minor correction (again) svn path=/trunk/; revision=8289 --- reactos/subsys/win32k/ntuser/winpos.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index 6c9bbf0725c..49003f7b8b3 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.95 2004/02/21 13:51:13 navaraf Exp $ +/* $Id: winpos.c,v 1.96 2004/02/21 13:57:31 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1022,7 +1022,7 @@ WinPosSetWindowPos(HWND Wnd, HWND WndInsertAfter, INT x, INT y, INT cx, NtGdiDeleteObject(VisAfter); } - if (!(WinPos.flags & SWP_NOREDRAW) && IntIsWindowVisible(Window)) + if (!(WinPos.flags & SWP_NOREDRAW)) { IntRedrawWindow(Window, NULL, 0, RDW_ALLCHILDREN | RDW_ERASENOW); } From 5aaaf343344896774379f78e95481ee5256e9fbc Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 21 Feb 2004 14:00:30 +0000 Subject: [PATCH 0110/1463] - Fixed my use of IntIsWindowVisible, it takes HWND as parameter and not PWINDOW_OBJECT. svn path=/trunk/; revision=8290 --- 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 9a0cd6dd21d..e48e37dc7d3 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.186 2004/02/21 13:13:27 navaraf Exp $ +/* $Id: window.c,v 1.187 2004/02/21 14:00:30 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -3342,7 +3342,7 @@ static PWINDOW_OBJECT RestrictiveSearchChildWindows(PWINDOW_OBJECT Window, POINT */ if (!IsStaticClass(ChildWindow) && !IsDisabled(ChildWindow) && - IntIsWindowVisible(ChildWindow)) + IntIsWindowVisible(ChildWindow->Self)) { /* **Now find the deepest child window From 3cb945ba086083aaf6b3bee89a4d27c7f1a58f80 Mon Sep 17 00:00:00 2001 From: Emanuele Aliberti <ea@iol.it> Date: Sat, 21 Feb 2004 15:34:51 +0000 Subject: [PATCH 0111/1463] KERNEL_VERSION_BUILD_RC added in buildno.h. svn path=/trunk/; revision=8291 --- reactos/tools/buildno.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/tools/buildno.c b/reactos/tools/buildno.c index b69e0934b04..cea2661c515 100644 --- a/reactos/tools/buildno.c +++ b/reactos/tools/buildno.c @@ -1,4 +1,4 @@ -/* $Id: buildno.c,v 1.4 2004/01/12 00:22:34 gvg Exp $ +/* $Id: buildno.c,v 1.5 2004/02/21 15:34:51 ea Exp $ * * buildno - Generate the build number for ReactOS * @@ -90,6 +90,7 @@ write_h (int build) s = s + sprintf (s, "#define KERNEL_VERSION_BUILD\t%d\n", build); s = s + sprintf (s, "#define KERNEL_VERSION_BUILD_STR\t\"%d\"\n", build); + s = s + sprintf (s, "#define KERNEL_VERSION_BUILD_RC\t\"%d\\0\"\n", build); s = s + sprintf (s, "#define KERNEL_RELEASE_RC\t\"%d.%d", KERNEL_VERSION_MAJOR, KERNEL_VERSION_MINOR); if (0 != KERNEL_VERSION_PATCH_LEVEL) From 63eaa13a61ebc9c144ef26042f63e31a39cec55a Mon Sep 17 00:00:00 2001 From: Jason Filby <jason.filby@gmail.com> Date: Sat, 21 Feb 2004 16:36:02 +0000 Subject: [PATCH 0112/1463] Null terminator fixes svn path=/trunk/; revision=8292 --- reactos/lib/kernel32/file/volume.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/reactos/lib/kernel32/file/volume.c b/reactos/lib/kernel32/file/volume.c index 39fcf68c02e..9119a0df206 100644 --- a/reactos/lib/kernel32/file/volume.c +++ b/reactos/lib/kernel32/file/volume.c @@ -1,4 +1,4 @@ -/* $Id: volume.c,v 1.38 2004/01/23 21:16:03 ekohl Exp $ +/* $Id: volume.c,v 1.39 2004/02/21 16:36:02 jfilby Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -21,7 +21,7 @@ #include <k32.h> -#define NDEBUG +//#define NDEBUG #include "../include/debug.h" @@ -236,8 +236,8 @@ GetDiskFreeSpaceW( else { GetCurrentDirectoryW (MAX_PATH, RootPathName); - RootPathName[3] = 0; } + RootPathName[3] = 0; hFile = InternalOpenDirW(RootPathName, FALSE); if (INVALID_HANDLE_VALUE == hFile) @@ -263,6 +263,7 @@ GetDiskFreeSpaceW( *lpNumberOfFreeClusters = FileFsSize.AvailableAllocationUnits.u.LowPart; *lpTotalNumberOfClusters = FileFsSize.TotalAllocationUnits.u.LowPart; CloseHandle(hFile); + return TRUE; } @@ -342,8 +343,8 @@ GetDiskFreeSpaceExW( else { GetCurrentDirectoryW (MAX_PATH, RootPathName); - RootPathName[3] = 0; } + RootPathName[3] = 0; hFile = InternalOpenDirW(RootPathName, FALSE); if (INVALID_HANDLE_VALUE == hFile) @@ -379,6 +380,7 @@ GetDiskFreeSpaceExW( BytesPerCluster.QuadPart * FileFsSize.AvailableAllocationUnits.QuadPart; CloseHandle(hFile); + return TRUE; } @@ -610,7 +612,7 @@ GetVolumeInformationW( HANDLE hFile; NTSTATUS errCode; - + FileFsVolume = (PFILE_FS_VOLUME_INFORMATION)Buffer; FileFsAttribute = (PFILE_FS_ATTRIBUTE_INFORMATION)Buffer; @@ -620,12 +622,12 @@ GetVolumeInformationW( if (!lpRootPathName || !wcscmp(lpRootPathName, L"")) { GetCurrentDirectoryW (MAX_PATH, RootPathName); - RootPathName[3] = 0; } else { - wcsncpy (RootPathName, lpRootPathName, min(MAX_PATH, wcslen(lpRootPathName) + 1)); + wcsncpy (RootPathName, lpRootPathName, 3); } + RootPathName[3] = 0; hFile = InternalOpenDirW(RootPathName, FALSE); if (hFile == INVALID_HANDLE_VALUE) From 232ffaff281df44e05e4a8ff33a00041bf0e7886 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 21 Feb 2004 20:26:54 +0000 Subject: [PATCH 0113/1463] - Moved code from NtGdiTextOut to NtGdiExtTextOut and added basic support for ETO_OPAQUE flag. svn path=/trunk/; revision=8293 --- reactos/subsys/win32k/objects/text.c | 558 ++++++++------------------- 1 file changed, 156 insertions(+), 402 deletions(-) diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index 52b0d073ec3..1d5e6b0c555 100644 --- a/reactos/subsys/win32k/objects/text.c +++ b/reactos/subsys/win32k/objects/text.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: text.c,v 1.74 2004/02/19 21:12:10 weiden Exp $ */ +/* $Id: text.c,v 1.75 2004/02/21 20:26:54 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -563,119 +563,156 @@ BOOL STDCALL NtGdiExtTextOut(HDC hDC, int XStart, int YStart, UINT fuOptions, CONST RECT *lprc, LPCWSTR String, UINT Count, CONST INT *lpDx) { -#if 1 - /* FIXME: Implement */ - return NtGdiTextOut(hDC, XStart, YStart, String, Count); -#else - // Fixme: Call EngTextOut, which does the real work (calling DrvTextOut where appropriate) + /* + * FIXME: + * Call EngTextOut, which does the real work (calling DrvTextOut where + * appropriate) + */ - DC *dc; - SURFOBJ *SurfObj; - int error, glyph_index, n, i; - FT_Face face; - FT_GlyphSlot glyph; - ULONG TextLeft, TextTop, pitch, previous, BackgroundLeft; - FT_Bool use_kerning; - RECTL DestRect, MaskRect; - POINTL SourcePoint, BrushOrigin; - HBRUSH hBrushFg = NULL; - PBRUSHOBJ BrushFg = NULL; - HBRUSH hBrushBg = NULL; - PBRUSHOBJ BrushBg = NULL; - HBITMAP HSourceGlyph; - PSURFOBJ SourceGlyphSurf; - SIZEL bitSize; - FT_CharMap found = 0, charmap; - INT yoff; - PFONTOBJ FontObj; - PFONTGDI FontGDI; - PTEXTOBJ TextObj; - PPALGDI PalDestGDI; - PXLATEOBJ XlateObj; - ULONG Mode; + DC *dc; + SURFOBJ *SurfObj; + int error, glyph_index, n, i; + FT_Face face; + FT_GlyphSlot glyph; + ULONG TextLeft, TextTop, pitch, previous, BackgroundLeft; + FT_Bool use_kerning; + RECTL DestRect, MaskRect; + POINTL SourcePoint, BrushOrigin; + HBRUSH hBrushFg = NULL; + PBRUSHOBJ BrushFg = NULL; + HBRUSH hBrushBg = NULL; + PBRUSHOBJ BrushBg = NULL; + HBITMAP HSourceGlyph; + PSURFOBJ SourceGlyphSurf; + SIZEL bitSize; + FT_CharMap found = 0, charmap; + INT yoff; + PFONTOBJ FontObj; + PFONTGDI FontGDI; + PTEXTOBJ TextObj; + PPALGDI PalDestGDI; + PXLATEOBJ XlateObj, XlateObj2; + ULONG Mode; + FT_Render_Mode RenderMode; + BOOL Render; - dc = DC_LockDc(hDC); - if( !dc ) - return FALSE; - SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface); + dc = DC_LockDc(hDC); + if (!dc) + return FALSE; + + SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface); - XStart += dc->w.DCOrgX; - YStart += dc->w.DCOrgY; - TextLeft = XStart; - TextTop = YStart; - BackgroundLeft = XStart; + if (dc->w.backgroundMode == OPAQUE) + fuOptions |= ETO_OPAQUE; - TextObj = TEXTOBJ_LockText(dc->w.hFont); + XStart += dc->w.DCOrgX; + YStart += dc->w.DCOrgY; + TextLeft = XStart; + TextTop = YStart; + BackgroundLeft = XStart; - if (! NT_SUCCESS(GetFontObjectsFromTextObj(TextObj, NULL, &FontObj, &FontGDI))) - { - goto fail; - } - face = FontGDI->face; + TextObj = TEXTOBJ_LockText(dc->w.hFont); - if (face->charmap == NULL) - { - DPRINT("WARNING: No charmap selected!\n"); - DPRINT("This font face has %d charmaps\n", face->num_charmaps); + if (!NT_SUCCESS(GetFontObjectsFromTextObj(TextObj, NULL, &FontObj, &FontGDI))) + { + goto fail; + } - for (n = 0; n < face->num_charmaps; n++) - { - charmap = face->charmaps[n]; - DPRINT("found charmap encoding: %u\n", charmap->encoding); - if (charmap->encoding != 0) + 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++) { - found = charmap; - break; + 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"); - ExAcquireFastMutex(&FreeTypeLock); - error = FT_Set_Charmap(face, found); - ExReleaseFastMutex(&FreeTypeLock); - if (error) DPRINT1("WARNING: Could not set the charmap!\n"); - } + if (!found) + DPRINT1("WARNING: Could not find desired charmap!\n"); + ExAcquireFastMutex(&FreeTypeLock); + error = FT_Set_Charmap(face, found); + ExReleaseFastMutex(&FreeTypeLock); + if (error) + DPRINT1("WARNING: Could not set the charmap!\n"); + } - ExAcquireFastMutex(&FreeTypeLock); - 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); - ExReleaseFastMutex(&FreeTypeLock); - if(error) { - DPRINT1("Error in setting pixel sizes: %u\n", error); - goto fail; - } + Render = IntIsFontRenderingEnabled(); + if (Render) + RenderMode = IntGetFontRenderMode(&TextObj->logfont); + else + RenderMode = FT_RENDER_MODE_MONO; + + ExAcquireFastMutex(&FreeTypeLock); + 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); + ExReleaseFastMutex(&FreeTypeLock); + if (error) + { + DPRINT1("Error in setting pixel sizes: %u\n", error); + goto fail; + } - // Create the brushes - PalDestGDI = PALETTE_LockPalette(dc->w.hPalette); - Mode = PalDestGDI->Mode; - PALETTE_UnlockPalette(dc->w.hPalette); - XlateObj = (PXLATEOBJ)IntEngCreateXlate(Mode, PAL_RGB, dc->w.hPalette, NULL); - hBrushFg = NtGdiCreateSolidBrush(XLATEOBJ_iXlate(XlateObj, dc->w.textColor)); - BrushFg = BRUSHOBJ_LockBrush(hBrushFg); - if (OPAQUE == dc->w.backgroundMode) - { + /* Create the brushes */ + PalDestGDI = PALETTE_LockPalette(dc->w.hPalette); + Mode = PalDestGDI->Mode; + PALETTE_UnlockPalette(dc->w.hPalette); + XlateObj = (PXLATEOBJ)IntEngCreateXlate(Mode, PAL_RGB, dc->w.hPalette, NULL); + hBrushFg = NtGdiCreateSolidBrush(XLATEOBJ_iXlate(XlateObj, dc->w.textColor)); + BrushFg = BRUSHOBJ_LockBrush(hBrushFg); + if (fuOptions & ETO_OPAQUE) + { hBrushBg = NtGdiCreateSolidBrush(XLATEOBJ_iXlate(XlateObj, dc->w.backgroundColor)); - if(hBrushBg) + if (hBrushBg) { - BrushBg = BRUSHOBJ_LockBrush(hBrushBg); + BrushBg = BRUSHOBJ_LockBrush(hBrushBg); } else { - EngDeleteXlate(XlateObj); - goto fail; + EngDeleteXlate(XlateObj); + goto fail; } - } - EngDeleteXlate(XlateObj); + } + XlateObj2 = (PXLATEOBJ)IntEngCreateXlate(PAL_RGB, Mode, NULL, dc->w.hPalette); + + SourcePoint.x = 0; + SourcePoint.y = 0; + MaskRect.left = 0; + MaskRect.top = 0; + BrushOrigin.x = 0; + BrushOrigin.y = 0; - SourcePoint.x = 0; - SourcePoint.y = 0; - MaskRect.left = 0; - MaskRect.top = 0; - BrushOrigin.x = 0; - BrushOrigin.y = 0; + if ((fuOptions & ETO_OPAQUE) && lprc) + { + MmCopyFromCaller(&DestRect, lprc, sizeof(RECT)); + DestRect.left += dc->w.DCOrgX; + DestRect.top += dc->w.DCOrgY; + DestRect.right += dc->w.DCOrgX; + DestRect.bottom += dc->w.DCOrgY; + IntEngBitBlt( + SurfObj, + NULL, + NULL, + dc->CombinedClip, + NULL, + &DestRect, + &SourcePoint, + &SourcePoint, + BrushBg, + &BrushOrigin, + PATCOPY); + } // Determine the yoff from the dc's w.textAlign if (dc->w.textAlign & TA_BASELINE) { @@ -699,6 +736,8 @@ NtGdiExtTextOut(HDC hDC, int XStart, int YStart, UINT fuOptions, error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT); ExReleaseFastMutex(&FreeTypeLock); if(error) { + EngDeleteXlate(XlateObj); + EngDeleteXlate(XlateObj2); DPRINT1("WARNING: Failed to load and render glyph! [index: %u]\n", glyph_index); goto fail; } @@ -717,9 +756,11 @@ NtGdiExtTextOut(HDC hDC, int XStart, int YStart, UINT fuOptions, if (glyph->format == ft_glyph_format_outline) { ExAcquireFastMutex(&FreeTypeLock); - error = FT_Render_Glyph(glyph, IntGetFontRenderMode(&TextObj->logfont)); + error = FT_Render_Glyph(glyph, RenderMode); ExReleaseFastMutex(&FreeTypeLock); if(error) { + EngDeleteXlate(XlateObj); + EngDeleteXlate(XlateObj2); DPRINT1("WARNING: Failed to render glyph!\n"); goto fail; } @@ -728,27 +769,12 @@ NtGdiExtTextOut(HDC hDC, int XStart, int YStart, UINT fuOptions, pitch = glyph->bitmap.width; } - if (OPAQUE == dc->w.backgroundMode) + if ((fuOptions & ETO_OPAQUE) && !lprc) { DestRect.left = BackgroundLeft; DestRect.right = TextLeft + (glyph->advance.x + 32) / 64; DestRect.top = TextTop + yoff - (face->size->metrics.ascender + 32) / 64; DestRect.bottom = TextTop + yoff + (- face->size->metrics.descender + 32) / 64; - if (fuOptions & ETO_CLIPPED) - { - if (DestRect.left > lprc->right || DestRect.right < lprc->left || - DestRect.top > lprc->bottom || DestRect.bottom < lprc->top) - { - DestRect.right = DestRect.left; - } - else - { - DestRect.left = max(DestRect.left, lprc->left); - DestRect.right = min(DestRect.right, lprc->right); - DestRect.top = max(DestRect.top, lprc->top); - DestRect.bottom = min(DestRect.bottom, lprc->bottom); - } - } IntEngBitBlt(SurfObj, NULL, NULL, @@ -768,45 +794,28 @@ NtGdiExtTextOut(HDC hDC, int XStart, int YStart, UINT fuOptions, DestRect.top = TextTop + yoff - glyph->bitmap_top; DestRect.bottom = DestRect.top + glyph->bitmap.rows; - if (fuOptions & ETO_CLIPPED) - { - if (DestRect.left > lprc->right || DestRect.right < lprc->left || - DestRect.top > lprc->bottom || DestRect.bottom < lprc->top) - { - break; - } - else - { - DestRect.left = max(DestRect.left, lprc->left); - DestRect.right = min(DestRect.right, lprc->right); - DestRect.top = max(DestRect.top, lprc->top); - DestRect.bottom = min(DestRect.bottom, lprc->bottom); - } - } - bitSize.cx = glyph->bitmap.width; bitSize.cy = glyph->bitmap.rows; MaskRect.right = glyph->bitmap.width; MaskRect.bottom = glyph->bitmap.rows; - + // We should create the bitmap out of the loop at the biggest possible glyph size // Then use memset with 0 to clear it and sourcerect to limit the work of the transbitblt - HSourceGlyph = EngCreateBitmap(bitSize, pitch, BMF_1BPP, 0, glyph->bitmap.buffer); + HSourceGlyph = EngCreateBitmap(bitSize, pitch, (glyph->bitmap.pixel_mode == ft_pixel_mode_grays) ? BMF_8BPP : BMF_1BPP, 0, glyph->bitmap.buffer); SourceGlyphSurf = (PSURFOBJ)AccessUserObject((ULONG) HSourceGlyph); - + // Use the font data as a mask to paint onto the DCs surface using a brush - IntEngBitBlt ( + IntEngMaskBlt ( SurfObj, - NULL, SourceGlyphSurf, dc->CombinedClip, - NULL, + XlateObj, + XlateObj2, &DestRect, &SourcePoint, (PPOINTL)&MaskRect, BrushFg, - &BrushOrigin, - 0xAACC ); + &BrushOrigin); EngDeleteSurface(HSourceGlyph); @@ -815,6 +824,8 @@ NtGdiExtTextOut(HDC hDC, int XStart, int YStart, UINT fuOptions, String++; } + EngDeleteXlate(XlateObj); + EngDeleteXlate(XlateObj2); TEXTOBJ_UnlockText(dc->w.hFont); if (NULL != hBrushBg) { @@ -840,7 +851,6 @@ fail: } DC_UnlockDc( hDC ); return FALSE; -#endif } BOOL @@ -1568,271 +1578,15 @@ NtGdiSetTextJustification(HDC hDC, UNIMPLEMENTED; } -BOOL -STDCALL -NtGdiTextOut(HDC hDC, - int XStart, - int YStart, - LPCWSTR String, - int Count) +BOOL STDCALL +NtGdiTextOut( + HDC hDC, + INT XStart, + INT YStart, + LPCWSTR String, + INT Count) { - // Fixme: Call EngTextOut, which does the real work (calling DrvTextOut where appropriate) - - DC *dc; - SURFOBJ *SurfObj; - int error, glyph_index, n, i; - FT_Face face; - FT_GlyphSlot glyph; - ULONG TextLeft, TextTop, pitch, previous, BackgroundLeft; - FT_Bool use_kerning; - RECTL DestRect, MaskRect; - POINTL SourcePoint, BrushOrigin; - HBRUSH hBrushFg = NULL; - PBRUSHOBJ BrushFg = NULL; - HBRUSH hBrushBg = NULL; - PBRUSHOBJ BrushBg = NULL; - HBITMAP HSourceGlyph; - PSURFOBJ SourceGlyphSurf; - SIZEL bitSize; - FT_CharMap found = 0, charmap; - INT yoff; - PFONTOBJ FontObj; - PFONTGDI FontGDI; - PTEXTOBJ TextObj; - PPALGDI PalDestGDI; - PXLATEOBJ XlateObj, XlateObj2; - ULONG Mode; - FT_Render_Mode RenderMode; - BOOL Render; - - dc = DC_LockDc(hDC); - if( !dc ) - return FALSE; - SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface); - - XStart += dc->w.DCOrgX; - YStart += dc->w.DCOrgY; - TextLeft = XStart; - TextTop = YStart; - BackgroundLeft = XStart; - - 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"); - ExAcquireFastMutex(&FreeTypeLock); - error = FT_Set_Charmap(face, found); - ExReleaseFastMutex(&FreeTypeLock); - if (error) DPRINT1("WARNING: Could not set the charmap!\n"); - } - - - Render = IntIsFontRenderingEnabled(); - - if(Render) - RenderMode = IntGetFontRenderMode(&TextObj->logfont); - else - RenderMode = FT_RENDER_MODE_MONO; - - ExAcquireFastMutex(&FreeTypeLock); - 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); - ExReleaseFastMutex(&FreeTypeLock); - if(error) { - DPRINT1("Error in setting pixel sizes: %u\n", error); - goto fail; - } - - // Create the brushes - PalDestGDI = PALETTE_LockPalette(dc->w.hPalette); - Mode = PalDestGDI->Mode; - PALETTE_UnlockPalette(dc->w.hPalette); - XlateObj = (PXLATEOBJ)IntEngCreateXlate(Mode, PAL_RGB, dc->w.hPalette, NULL); - hBrushFg = NtGdiCreateSolidBrush(XLATEOBJ_iXlate(XlateObj, dc->w.textColor)); - BrushFg = BRUSHOBJ_LockBrush(hBrushFg); - if (OPAQUE == dc->w.backgroundMode) - { - hBrushBg = NtGdiCreateSolidBrush(XLATEOBJ_iXlate(XlateObj, dc->w.backgroundColor)); - if(hBrushBg) - { - BrushBg = BRUSHOBJ_LockBrush(hBrushBg); - } - else - { - EngDeleteXlate(XlateObj); - goto fail; - } - } - XlateObj2 = (PXLATEOBJ)IntEngCreateXlate(PAL_RGB, Mode, NULL, dc->w.hPalette); - - SourcePoint.x = 0; - SourcePoint.y = 0; - MaskRect.left = 0; - MaskRect.top = 0; - BrushOrigin.x = 0; - BrushOrigin.y = 0; - - // Determine the yoff from the dc's w.textAlign - if (dc->w.textAlign & TA_BASELINE) { - yoff = 0; - } - else - if (dc->w.textAlign & TA_BOTTOM) { - yoff = -face->size->metrics.descender / 64; - } - else { // TA_TOP - yoff = face->size->metrics.ascender / 64; - } - - use_kerning = FT_HAS_KERNING(face); - previous = 0; - - for(i=0; i<Count; i++) - { - ExAcquireFastMutex(&FreeTypeLock); - glyph_index = FT_Get_Char_Index(face, *String); - error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT); - ExReleaseFastMutex(&FreeTypeLock); - if(error) { - EngDeleteXlate(XlateObj); - EngDeleteXlate(XlateObj2); - DPRINT1("WARNING: Failed to load and render glyph! [index: %u]\n", glyph_index); - goto fail; - } - glyph = face->glyph; - - // retrieve kerning distance and move pen position - if (use_kerning && previous && glyph_index) - { - FT_Vector delta; - ExAcquireFastMutex(&FreeTypeLock); - FT_Get_Kerning(face, previous, glyph_index, 0, &delta); - ExReleaseFastMutex(&FreeTypeLock); - TextLeft += delta.x >> 6; - } - - if (glyph->format == ft_glyph_format_outline) - { - ExAcquireFastMutex(&FreeTypeLock); - error = FT_Render_Glyph(glyph, RenderMode); - ExReleaseFastMutex(&FreeTypeLock); - if(error) { - EngDeleteXlate(XlateObj); - EngDeleteXlate(XlateObj2); - DPRINT1("WARNING: Failed to render glyph!\n"); - goto fail; - } - pitch = glyph->bitmap.pitch; - } else { - pitch = glyph->bitmap.width; - } - - if (OPAQUE == dc->w.backgroundMode) - { - DestRect.left = BackgroundLeft; - DestRect.right = TextLeft + (glyph->advance.x + 32) / 64; - DestRect.top = TextTop + yoff - (face->size->metrics.ascender + 32) / 64; - DestRect.bottom = TextTop + yoff + (- face->size->metrics.descender + 32) / 64; - IntEngBitBlt(SurfObj, - NULL, - NULL, - dc->CombinedClip, - NULL, - &DestRect, - &SourcePoint, - &SourcePoint, - BrushBg, - &BrushOrigin, - PATCOPY); - BackgroundLeft = DestRect.right; - } - - DestRect.left = TextLeft; - DestRect.right = TextLeft + glyph->bitmap.width; - DestRect.top = TextTop + yoff - glyph->bitmap_top; - DestRect.bottom = DestRect.top + glyph->bitmap.rows; - - bitSize.cx = glyph->bitmap.width; - bitSize.cy = glyph->bitmap.rows; - MaskRect.right = glyph->bitmap.width; - MaskRect.bottom = glyph->bitmap.rows; - - // We should create the bitmap out of the loop at the biggest possible glyph size - // Then use memset with 0 to clear it and sourcerect to 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); - SourceGlyphSurf = (PSURFOBJ)AccessUserObject((ULONG) HSourceGlyph); - - // Use the font data as a mask to paint onto the DCs surface using a brush - IntEngMaskBlt ( - SurfObj, - SourceGlyphSurf, - dc->CombinedClip, - XlateObj, - XlateObj2, - &DestRect, - &SourcePoint, - (PPOINTL)&MaskRect, - BrushFg, - &BrushOrigin); - - EngDeleteSurface(HSourceGlyph); - - TextLeft += (glyph->advance.x + 32) / 64; - previous = glyph_index; - - String++; - } - EngDeleteXlate(XlateObj); - EngDeleteXlate(XlateObj2); - TEXTOBJ_UnlockText(dc->w.hFont); - if (NULL != hBrushBg) - { - BRUSHOBJ_UnlockBrush(hBrushBg); - NtGdiDeleteObject(hBrushBg); - } - BRUSHOBJ_UnlockBrush(hBrushFg); - NtGdiDeleteObject(hBrushFg); - DC_UnlockDc(hDC); - return TRUE; - -fail: - TEXTOBJ_UnlockText( dc->w.hFont ); - if (NULL != hBrushBg) - { - BRUSHOBJ_UnlockBrush(hBrushBg); - NtGdiDeleteObject(hBrushBg); - } - if (NULL != hBrushFg) - { - BRUSHOBJ_UnlockBrush(hBrushFg); - NtGdiDeleteObject(hBrushFg); - } - DC_UnlockDc( hDC ); - return FALSE; + return NtGdiExtTextOut(hDC, XStart, YStart, 0, NULL, String, Count, NULL); } UINT From d83db81881a1297662c056619a9039b2f2724d20 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 21 Feb 2004 21:15:22 +0000 Subject: [PATCH 0114/1463] - Minor correction of NtGdiExtTextOut. svn path=/trunk/; revision=8294 --- reactos/subsys/win32k/objects/text.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index 1d5e6b0c555..c4f5776977b 100644 --- a/reactos/subsys/win32k/objects/text.c +++ b/reactos/subsys/win32k/objects/text.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: text.c,v 1.75 2004/02/21 20:26:54 navaraf Exp $ */ +/* $Id: text.c,v 1.76 2004/02/21 21:15:22 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -602,9 +602,6 @@ NtGdiExtTextOut(HDC hDC, int XStart, int YStart, UINT fuOptions, SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface); - if (dc->w.backgroundMode == OPAQUE) - fuOptions |= ETO_OPAQUE; - XStart += dc->w.DCOrgX; YStart += dc->w.DCOrgY; TextLeft = XStart; @@ -671,7 +668,7 @@ NtGdiExtTextOut(HDC hDC, int XStart, int YStart, UINT fuOptions, XlateObj = (PXLATEOBJ)IntEngCreateXlate(Mode, PAL_RGB, dc->w.hPalette, NULL); hBrushFg = NtGdiCreateSolidBrush(XLATEOBJ_iXlate(XlateObj, dc->w.textColor)); BrushFg = BRUSHOBJ_LockBrush(hBrushFg); - if (fuOptions & ETO_OPAQUE) + if ((fuOptions & ETO_OPAQUE) || dc->w.backgroundMode == OPAQUE) { hBrushBg = NtGdiCreateSolidBrush(XLATEOBJ_iXlate(XlateObj, dc->w.backgroundColor)); if (hBrushBg) @@ -712,6 +709,14 @@ NtGdiExtTextOut(HDC hDC, int XStart, int YStart, UINT fuOptions, BrushBg, &BrushOrigin, PATCOPY); + fuOptions &= ~ETO_OPAQUE; + } + else + { + if (dc->w.backgroundMode == OPAQUE) + { + fuOptions |= ETO_OPAQUE; + } } // Determine the yoff from the dc's w.textAlign @@ -769,7 +774,7 @@ NtGdiExtTextOut(HDC hDC, int XStart, int YStart, UINT fuOptions, pitch = glyph->bitmap.width; } - if ((fuOptions & ETO_OPAQUE) && !lprc) + if (fuOptions & ETO_OPAQUE) { DestRect.left = BackgroundLeft; DestRect.right = TextLeft + (glyph->advance.x + 32) / 64; From f38fdd47c359165b95e37139fb2b58c2484f54ba Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 21 Feb 2004 22:22:26 +0000 Subject: [PATCH 0115/1463] - Fixed releasing of window object in IntValidateParent and NtUserRedrawWindow. Spotted by Thomas Weidenmuller. - Fixed potencial deadlock in IntPaintWindows. Spotted by Thomas Weidenmuller. svn path=/trunk/; revision=8295 --- reactos/subsys/win32k/ntuser/painting.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/painting.c b/reactos/subsys/win32k/ntuser/painting.c index 28b7e7b69ff..40b26434415 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.69 2004/02/21 13:51:13 navaraf Exp $ + * $Id: painting.c,v 1.70 2004/02/21 22:22:26 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -87,8 +87,15 @@ IntValidateParent(PWINDOW_OBJECT Child, HRGN ValidRegion) } ExReleaseFastMutex(&ParentWindow->UpdateLock); } - IntReleaseWindowObject(ParentWindow); - Parent = NtUserGetAncestor(Parent, GA_PARENT); + if (ParentWindow) + { + IntReleaseWindowObject(ParentWindow); + Parent = NtUserGetAncestor(Parent, GA_PARENT); + } + else + { + return; + } } } @@ -103,6 +110,7 @@ IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags) { HDC hDC; HWND hWnd = Window->Self; + HRGN TempRegion; if (Flags & (RDW_ERASENOW | RDW_UPDATENOW)) { @@ -113,11 +121,12 @@ IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags) { IntValidateParent(Window, Window->NCUpdateRegion); } - IntSendMessage(hWnd, WM_NCPAINT, (WPARAM)Window->NCUpdateRegion, 0); + TempRegion = Window->NCUpdateRegion; Window->NCUpdateRegion = NULL; Window->Flags &= ~WINDOWOBJECT_NEED_NCPAINT; MsqDecPaintCountQueue(Window->MessageQueue); ExReleaseFastMutex(&Window->UpdateLock); + IntSendMessage(hWnd, WM_NCPAINT, (WPARAM)TempRegion, 0); } if (Window->Flags & WINDOWOBJECT_NEED_ERASEBKGND) @@ -912,6 +921,7 @@ NtUserRedrawWindow(HWND hWnd, CONST RECT *lprcUpdate, HRGN hrgnUpdate, if (!NT_SUCCESS(Status)) { SetLastWin32Error(ERROR_INVALID_PARAMETER); + IntReleaseWindowObject(Wnd); return FALSE; } } @@ -923,9 +933,11 @@ NtUserRedrawWindow(HWND hWnd, CONST RECT *lprcUpdate, HRGN hrgnUpdate, { /* IntRedrawWindow fails only in case that flags are invalid */ SetLastWin32Error(ERROR_INVALID_PARAMETER); + IntReleaseWindowObject(Wnd); return FALSE; } + IntReleaseWindowObject(Wnd); return TRUE; } From e6ad1bc2c0fe21542cf32d895a35cd0d5d3c75b0 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 21 Feb 2004 23:30:18 +0000 Subject: [PATCH 0116/1463] - Fixed deadlock in IntFindWindowToRepaint. svn path=/trunk/; revision=8296 --- reactos/subsys/win32k/ntuser/painting.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/painting.c b/reactos/subsys/win32k/ntuser/painting.c index 40b26434415..b7738e6676c 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.70 2004/02/21 22:22:26 navaraf Exp $ + * $Id: painting.c,v 1.71 2004/02/21 23:30:18 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -560,7 +560,6 @@ IntFindWindowToRepaint(HWND hWnd, PW32THREAD Thread) } ExAcquireFastMutex(&Window->ChildrenListLock); - for (Child = Window->LastChild; Child; Child = Child->PrevSibling) { if (IntIsWindowDirty(Child) && @@ -570,21 +569,26 @@ IntFindWindowToRepaint(HWND hWnd, PW32THREAD Thread) break; } } + ExReleaseFastMutex(&Window->ChildrenListLock); if (hFoundWnd == NULL) { - for (Child = Window->LastChild; Child; Child = Child->PrevSibling) + HWND *List; + INT i; + + List = IntWinListChildren(Window); + if (List != NULL) { - if (Child->Style & WS_VISIBLE) + for (i = 0; List[i]; i++) { - hFoundWnd = IntFindWindowToRepaint(Child->Self, Thread); + hFoundWnd = IntFindWindowToRepaint(List[i], Thread); if (hFoundWnd != NULL) break; } + ExFreePool(List); } } - ExReleaseFastMutex(&Window->ChildrenListLock); IntReleaseWindowObject(Window); return hFoundWnd; From a7b989769f830421bd3054cff4d92e9d068e34d8 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 22 Feb 2004 08:35:21 +0000 Subject: [PATCH 0117/1463] - Unified indenting style in NtGdiExtTextOut and implemented support for right and centered text alignment. - Don't render glyphs in TextIntGetTextExtentPoint. svn path=/trunk/; revision=8297 --- reactos/subsys/win32k/objects/text.c | 334 ++++++++++++++++----------- 1 file changed, 203 insertions(+), 131 deletions(-) diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index c4f5776977b..bf0af9fc751 100644 --- a/reactos/subsys/win32k/objects/text.c +++ b/reactos/subsys/win32k/objects/text.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: text.c,v 1.76 2004/02/21 21:15:22 navaraf Exp $ */ +/* $Id: text.c,v 1.77 2004/02/22 08:35:21 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -560,8 +560,15 @@ NtGdiEnumFonts(HDC hDC, } BOOL STDCALL -NtGdiExtTextOut(HDC hDC, int XStart, int YStart, UINT fuOptions, - CONST RECT *lprc, LPCWSTR String, UINT Count, CONST INT *lpDx) +NtGdiExtTextOut( + HDC hDC, + INT XStart, + INT YStart, + UINT fuOptions, + CONST RECT *lprc, + LPCWSTR String, + UINT Count, + CONST INT *lpDx) { /* * FIXME: @@ -604,9 +611,6 @@ NtGdiExtTextOut(HDC hDC, int XStart, int YStart, UINT fuOptions, XStart += dc->w.DCOrgX; YStart += dc->w.DCOrgY; - TextLeft = XStart; - TextTop = YStart; - BackgroundLeft = XStart; TextObj = TEXTOBJ_LockText(dc->w.hFont); @@ -719,143 +723,221 @@ NtGdiExtTextOut(HDC hDC, int XStart, int YStart, UINT fuOptions, } } - // Determine the yoff from the dc's w.textAlign - if (dc->w.textAlign & TA_BASELINE) { - yoff = 0; - } - else - if (dc->w.textAlign & TA_BOTTOM) { - yoff = -face->size->metrics.descender / 64; - } - else { // TA_TOP - yoff = face->size->metrics.ascender / 64; - } + /* + * Process the vertical alignment and determine the yoff. + */ - use_kerning = FT_HAS_KERNING(face); - previous = 0; + if (dc->w.textAlign & TA_BASELINE) + yoff = 0; + else if (dc->w.textAlign & TA_BOTTOM) + yoff = -face->size->metrics.descender / 64; + else /* TA_TOP */ + yoff = face->size->metrics.ascender / 64; - for(i=0; i<Count; i++) - { - ExAcquireFastMutex(&FreeTypeLock); - glyph_index = FT_Get_Char_Index(face, *String); - error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT); - ExReleaseFastMutex(&FreeTypeLock); - if(error) { - EngDeleteXlate(XlateObj); - EngDeleteXlate(XlateObj2); - DPRINT1("WARNING: Failed to load and render glyph! [index: %u]\n", glyph_index); - goto fail; - } - glyph = face->glyph; + use_kerning = FT_HAS_KERNING(face); + previous = 0; - // retrieve kerning distance and move pen position - if (use_kerning && previous && glyph_index) - { - FT_Vector delta; - ExAcquireFastMutex(&FreeTypeLock); - FT_Get_Kerning(face, previous, glyph_index, 0, &delta); - ExReleaseFastMutex(&FreeTypeLock); - TextLeft += delta.x >> 6; - } + /* + * Process the horizontal alignment and modify XStart accordingly. + */ - if (glyph->format == ft_glyph_format_outline) - { - ExAcquireFastMutex(&FreeTypeLock); - error = FT_Render_Glyph(glyph, RenderMode); - ExReleaseFastMutex(&FreeTypeLock); - if(error) { - EngDeleteXlate(XlateObj); - EngDeleteXlate(XlateObj2); - DPRINT1("WARNING: Failed to render glyph!\n"); - goto fail; - } - pitch = glyph->bitmap.pitch; - } else { - pitch = glyph->bitmap.width; - } + if (dc->w.textAlign & (TA_RIGHT | TA_CENTER)) + { + UINT TextWidth; + LPCWSTR TempText = String; - if (fuOptions & ETO_OPAQUE) + /* + * Calculate width of the text. + */ + + for (i = 0; i < Count; i++) { - DestRect.left = BackgroundLeft; - DestRect.right = TextLeft + (glyph->advance.x + 32) / 64; - DestRect.top = TextTop + yoff - (face->size->metrics.ascender + 32) / 64; - DestRect.bottom = TextTop + yoff + (- face->size->metrics.descender + 32) / 64; - IntEngBitBlt(SurfObj, - NULL, - NULL, - dc->CombinedClip, - NULL, - &DestRect, - &SourcePoint, - &SourcePoint, - BrushBg, - &BrushOrigin, - PATCOPY); - BackgroundLeft = DestRect.right; + ExAcquireFastMutex(&FreeTypeLock); + glyph_index = FT_Get_Char_Index(face, *TempText); + error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT); + ExReleaseFastMutex(&FreeTypeLock); + + if (error) + { + DPRINT1("WARNING: Failed to load and render glyph! [index: %u]\n", glyph_index); + } + + glyph = face->glyph; + + /* retrieve kerning distance */ + if (use_kerning && previous && glyph_index) + { + FT_Vector delta; + ExAcquireFastMutex(&FreeTypeLock); + FT_Get_Kerning(face, previous, glyph_index, 0, &delta); + ExReleaseFastMutex(&FreeTypeLock); + TextWidth += delta.x >> 6; + } + + TextWidth += glyph->advance.x >> 6; + + previous = glyph_index; + TempText++; } - DestRect.left = TextLeft; - DestRect.right = TextLeft + glyph->bitmap.width; - DestRect.top = TextTop + yoff - glyph->bitmap_top; - DestRect.bottom = DestRect.top + glyph->bitmap.rows; + previous = 0; + + if (dc->w.textAlign & TA_RIGHT) + { + XStart -= TextWidth; + } + else + { + XStart -= TextWidth >> 1; + } + } + + TextLeft = XStart; + TextTop = YStart; + BackgroundLeft = XStart; + + /* + * The main rendering loop. + */ + + for (i = 0; i < Count; i++) + { + ExAcquireFastMutex(&FreeTypeLock); + glyph_index = FT_Get_Char_Index(face, *String); + error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT); + ExReleaseFastMutex(&FreeTypeLock); + + if (error) + { + EngDeleteXlate(XlateObj); + EngDeleteXlate(XlateObj2); + DPRINT1("WARNING: Failed to load and render glyph! [index: %u]\n", glyph_index); + goto fail; + } + + glyph = face->glyph; + + /* retrieve kerning distance and move pen position */ + if (use_kerning && previous && glyph_index) + { + FT_Vector delta; + ExAcquireFastMutex(&FreeTypeLock); + FT_Get_Kerning(face, previous, glyph_index, 0, &delta); + ExReleaseFastMutex(&FreeTypeLock); + TextLeft += delta.x >> 6; + } + + if (glyph->format == ft_glyph_format_outline) + { + ExAcquireFastMutex(&FreeTypeLock); + error = FT_Render_Glyph(glyph, RenderMode); + ExReleaseFastMutex(&FreeTypeLock); + if (error) + { + EngDeleteXlate(XlateObj); + EngDeleteXlate(XlateObj2); + DPRINT1("WARNING: Failed to render glyph!\n"); + goto fail; + } + pitch = glyph->bitmap.pitch; + } else { + pitch = glyph->bitmap.width; + } + + if (fuOptions & ETO_OPAQUE) + { + DestRect.left = BackgroundLeft; + DestRect.right = TextLeft + (glyph->advance.x + 32) / 64; + DestRect.top = TextTop + yoff - (face->size->metrics.ascender + 32) / 64; + DestRect.bottom = TextTop + yoff + (- face->size->metrics.descender + 32) / 64; + IntEngBitBlt( + SurfObj, + NULL, + NULL, + dc->CombinedClip, + NULL, + &DestRect, + &SourcePoint, + &SourcePoint, + BrushBg, + &BrushOrigin, + PATCOPY); + BackgroundLeft = DestRect.right; + } + + DestRect.left = TextLeft; + DestRect.right = TextLeft + glyph->bitmap.width; + DestRect.top = TextTop + yoff - glyph->bitmap_top; + DestRect.bottom = DestRect.top + glyph->bitmap.rows; - bitSize.cx = glyph->bitmap.width; - bitSize.cy = glyph->bitmap.rows; - MaskRect.right = glyph->bitmap.width; - MaskRect.bottom = glyph->bitmap.rows; + bitSize.cx = glyph->bitmap.width; + bitSize.cy = glyph->bitmap.rows; + MaskRect.right = glyph->bitmap.width; + MaskRect.bottom = glyph->bitmap.rows; - // We should create the bitmap out of the loop at the biggest possible glyph size - // Then use memset with 0 to clear it and sourcerect to 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); - SourceGlyphSurf = (PSURFOBJ)AccessUserObject((ULONG) HSourceGlyph); + /* + * We should create the bitmap out of the loop at the biggest possible + * glyph size. Then use memset with 0 to clear it and sourcerect to + * 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); + SourceGlyphSurf = (PSURFOBJ)AccessUserObject((ULONG) HSourceGlyph); - // Use the font data as a mask to paint onto the DCs surface using a brush - IntEngMaskBlt ( - SurfObj, - SourceGlyphSurf, - dc->CombinedClip, - XlateObj, - XlateObj2, - &DestRect, - &SourcePoint, - (PPOINTL)&MaskRect, - BrushFg, - &BrushOrigin); + /* + * Use the font data as a mask to paint onto the DCs surface using a + * brush. + */ - EngDeleteSurface(HSourceGlyph); + IntEngMaskBlt( + SurfObj, + SourceGlyphSurf, + dc->CombinedClip, + XlateObj, + XlateObj2, + &DestRect, + &SourcePoint, + (PPOINTL)&MaskRect, + BrushFg, + &BrushOrigin); - TextLeft += (glyph->advance.x + 32) / 64; - previous = glyph_index; + EngDeleteSurface(HSourceGlyph); - String++; - } - EngDeleteXlate(XlateObj); - EngDeleteXlate(XlateObj2); - TEXTOBJ_UnlockText(dc->w.hFont); - if (NULL != hBrushBg) - { + TextLeft += (glyph->advance.x + 32) / 64; + previous = glyph_index; + + String++; + } + + EngDeleteXlate(XlateObj); + EngDeleteXlate(XlateObj2); + TEXTOBJ_UnlockText(dc->w.hFont); + if (hBrushBg != NULL) + { BRUSHOBJ_UnlockBrush(hBrushBg); NtGdiDeleteObject(hBrushBg); - } - BRUSHOBJ_UnlockBrush(hBrushFg); - NtGdiDeleteObject(hBrushFg); - DC_UnlockDc(hDC); - return TRUE; + } + BRUSHOBJ_UnlockBrush(hBrushFg); + NtGdiDeleteObject(hBrushFg); + DC_UnlockDc(hDC); + + return TRUE; fail: - TEXTOBJ_UnlockText( dc->w.hFont ); - if (NULL != hBrushBg) - { + TEXTOBJ_UnlockText(dc->w.hFont); + if (hBrushBg != NULL) + { BRUSHOBJ_UnlockBrush(hBrushBg); NtGdiDeleteObject(hBrushBg); - } - if (NULL != hBrushFg) - { + } + if (hBrushFg != NULL) + { BRUSHOBJ_UnlockBrush(hBrushFg); NtGdiDeleteObject(hBrushFg); - } - DC_UnlockDc( hDC ); - return FALSE; + } + DC_UnlockDc(hDC); + + return FALSE; } BOOL @@ -1167,16 +1249,6 @@ TextIntGetTextExtentPoint(HDC hDC, } TotalWidth += glyph->advance.x >> 6; - if (glyph->format == ft_glyph_format_outline) - { - ExAcquireFastMutex(&FreeTypeLock); - error = FT_Render_Glyph(glyph, FT_RENDER_MODE_MONO); - ExReleaseFastMutex(&FreeTypeLock); - if (error) - { - DPRINT1("WARNING: Failed to render glyph!\n"); - } - } if (TotalWidth <= MaxExtent && NULL != Fit) { From cc3221be2cf70faff0ae668f25cad1fb0152bb2b Mon Sep 17 00:00:00 2001 From: Casper Hornstrup <chorns@users.sourceforge.net> Date: Sun, 22 Feb 2004 09:59:17 +0000 Subject: [PATCH 0118/1463] 2004-02-22 Casper S. Hornstrup <chorns@users.sourceforge.net> * config (REGRESSIONTESTS): Add. * rules.mak (REGTESTS_PATH_INC): Add. * drivers/net/tcpip/makefile: Support regression tests. * drivers/net/tcpip/tcpip/main.c: Prepare regression tests. * hal/halx86/Makefile: Rename TARGET_LIBPATH to TARGET_IMPLIBPATH. * regtests/kmregtests/driver.c (KMRegTestsRegister): Add. (KMRegTestsRun): Move call to InitializeTests() and RegisterTests() to DriverEntry(). (KMRegTestsDispatch): Support IOCTL_KMREGTESTS_REGISTER. * regtests/kmregtests/kmregtests.h (IOCTL_KMREGTESTS_REGISTER): Define. * tools/config.mk: Define REGTESTS if REGRESSIONTESTS = 1. * tools/helper.mk: Support module private regression tests. (TARGET_LIBPATH): Rename to TARGET_IMPLIBPATH. (TARGET_LIBPATH, TARGET_REGTESTS): Add. * tools/mkconfig.c: Support REGTESTS. * tools/regtests.c (umstubfile, kmstubfile): Add. (is_file_changed, write_file_if_changed): Add. (KMSTUB): Add. (HELP): Mention -u and -k switches. (main): Parse -u and -k switches. * drivers/net/tcpip/tests: New directory. * drivers/net/tcpip/tests/.cvsignore: New file. * drivers/net/tcpip/tests/Makefile: Makefile. * drivers/net/tcpip/tests/tests: New directory. * drivers/net/tcpip/tests/tests/.cvsignore: New file. svn path=/trunk/; revision=8298 --- reactos/ChangeLog | 28 +++ reactos/config | 6 +- reactos/drivers/net/tcpip/makefile | 4 +- reactos/drivers/net/tcpip/tcpip/main.c | 3 + reactos/drivers/net/tcpip/tests/.cvsignore | 6 + reactos/drivers/net/tcpip/tests/Makefile | 21 ++ .../drivers/net/tcpip/tests/tests/.cvsignore | 2 + reactos/hal/halx86/Makefile | 4 +- reactos/regtests/kmregtests/driver.c | 48 +++-- reactos/regtests/kmregtests/kmregtests.h | 7 +- reactos/rules.mak | 1 + reactos/tools/config.mk | 5 +- reactos/tools/helper.mk | 62 ++++-- reactos/tools/mkconfig.c | 23 ++- reactos/tools/regtests.c | 182 +++++++++++++++++- 15 files changed, 365 insertions(+), 37 deletions(-) create mode 100644 reactos/drivers/net/tcpip/tests/.cvsignore create mode 100644 reactos/drivers/net/tcpip/tests/Makefile create mode 100644 reactos/drivers/net/tcpip/tests/tests/.cvsignore diff --git a/reactos/ChangeLog b/reactos/ChangeLog index bc76663081d..9c18b96f10c 100644 --- a/reactos/ChangeLog +++ b/reactos/ChangeLog @@ -1,3 +1,31 @@ +2004-02-22 Casper S. Hornstrup <chorns@users.sourceforge.net> + + * config (REGRESSIONTESTS): Add. + * rules.mak (REGTESTS_PATH_INC): Add. + * drivers/net/tcpip/makefile: Support regression tests. + * drivers/net/tcpip/tcpip/main.c: Prepare regression tests. + * hal/halx86/Makefile: Rename TARGET_LIBPATH to TARGET_IMPLIBPATH. + * regtests/kmregtests/driver.c (KMRegTestsRegister): Add. + (KMRegTestsRun): Move call to InitializeTests() and RegisterTests() to + DriverEntry(). + (KMRegTestsDispatch): Support IOCTL_KMREGTESTS_REGISTER. + * regtests/kmregtests/kmregtests.h (IOCTL_KMREGTESTS_REGISTER): Define. + * tools/config.mk: Define REGTESTS if REGRESSIONTESTS = 1. + * tools/helper.mk: Support module private regression tests. + (TARGET_LIBPATH): Rename to TARGET_IMPLIBPATH. + (TARGET_LIBPATH, TARGET_REGTESTS): Add. + * tools/mkconfig.c: Support REGTESTS. + * tools/regtests.c (umstubfile, kmstubfile): Add. + (is_file_changed, write_file_if_changed): Add. + (KMSTUB): Add. + (HELP): Mention -u and -k switches. + (main): Parse -u and -k switches. + * drivers/net/tcpip/tests: New directory. + * drivers/net/tcpip/tests/.cvsignore: New file. + * drivers/net/tcpip/tests/Makefile: Makefile. + * drivers/net/tcpip/tests/tests: New directory. + * drivers/net/tcpip/tests/tests/.cvsignore: New file. + 2004-02-18 Casper S. Hornstrup <chorns@users.sourceforge.net> * apistatus.lst: Correct path of videoprt.dll. diff --git a/reactos/config b/reactos/config index 2db3d9446d3..8edf2b8696f 100644 --- a/reactos/config +++ b/reactos/config @@ -25,12 +25,16 @@ MP := 0 # ACPI := 0 +# +# Whether to build regression tests +# +REGRESSIONTESTS := 0 + # # Whether to use Structured Exception Handling # SEH := 0 - # # Which version of NDIS do we support up to? # diff --git a/reactos/drivers/net/tcpip/makefile b/reactos/drivers/net/tcpip/makefile index 9a44b9f34ba..3e85e8fe05d 100644 --- a/reactos/drivers/net/tcpip/makefile +++ b/reactos/drivers/net/tcpip/makefile @@ -1,7 +1,9 @@ -# $Id: makefile,v 1.13 2003/08/04 19:31:06 royce Exp $ +# $Id: makefile,v 1.14 2004/02/22 09:59:17 chorns Exp $ PATH_TO_TOP = ../../.. +TARGET_REGTESTS = yes + TARGET_TYPE = export_driver TARGET_NAME = tcpip diff --git a/reactos/drivers/net/tcpip/tcpip/main.c b/reactos/drivers/net/tcpip/tcpip/main.c index 7c9d2e2b59a..7f43f8466cf 100644 --- a/reactos/drivers/net/tcpip/tcpip/main.c +++ b/reactos/drivers/net/tcpip/tcpip/main.c @@ -7,6 +7,7 @@ * REVISIONS: * CSH 01/08-2000 Created */ +#include <roscfg.h> #include <tcpip.h> #include <dispatch.h> #include <fileobjs.h> @@ -840,6 +841,8 @@ DriverEntry( DriverObject->DriverUnload = TiUnload; + PREPARE_TESTS + return STATUS_SUCCESS; } diff --git a/reactos/drivers/net/tcpip/tests/.cvsignore b/reactos/drivers/net/tcpip/tests/.cvsignore new file mode 100644 index 00000000000..576b35ee7b0 --- /dev/null +++ b/reactos/drivers/net/tcpip/tests/.cvsignore @@ -0,0 +1,6 @@ +_regtests.c +_rtstub.c +Makefile.tests +*.d +*.o +*.a diff --git a/reactos/drivers/net/tcpip/tests/Makefile b/reactos/drivers/net/tcpip/tests/Makefile new file mode 100644 index 00000000000..4f12c38aa97 --- /dev/null +++ b/reactos/drivers/net/tcpip/tests/Makefile @@ -0,0 +1,21 @@ +# $Id: Makefile,v 1.1 2004/02/22 09:59:17 chorns Exp $ + +PATH_TO_TOP = ../../../.. + +TARGET_TYPE = library + +TARGET_NAME = regtests + +TARGET_LIBPATH = . + +TARGET_CFLAGS = -I$(REGTESTS_PATH_INC) + +-include Makefile.tests + +TARGET_OBJECTS = \ + _regtests.o \ + $(addprefix tests/, $(TESTS)) + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk diff --git a/reactos/drivers/net/tcpip/tests/tests/.cvsignore b/reactos/drivers/net/tcpip/tests/tests/.cvsignore new file mode 100644 index 00000000000..31dc3078b3a --- /dev/null +++ b/reactos/drivers/net/tcpip/tests/tests/.cvsignore @@ -0,0 +1,2 @@ +*.d +*.o diff --git a/reactos/hal/halx86/Makefile b/reactos/hal/halx86/Makefile index 5ed42e251bc..207b94c2b26 100644 --- a/reactos/hal/halx86/Makefile +++ b/reactos/hal/halx86/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.12 2003/11/05 22:37:42 gvg Exp $ +# $Id: Makefile,v 1.13 2004/02/22 09:59:17 chorns Exp $ PATH_TO_TOP = ../.. @@ -22,7 +22,7 @@ TARGET_BASENAME = hal TARGET_DEFNAME = ../hal/hal -TARGET_LIBPATH = . +TARGET_IMPLIBPATH = . TARGET_ASFLAGS = -I$(PATH_TO_TOP)/include -I$(PATH_TO_TOP)/ntoskrnl/include -D__ASM__ diff --git a/reactos/regtests/kmregtests/driver.c b/reactos/regtests/kmregtests/driver.c index 97933364cdd..4a2e50fffa6 100755 --- a/reactos/regtests/kmregtests/driver.c +++ b/reactos/regtests/kmregtests/driver.c @@ -14,6 +14,8 @@ #define NDEBUG #include <debug.h> +extern void AddTest(TestRoutine Routine); + PVOID AllocateMemory(ULONG Size) { @@ -36,14 +38,28 @@ ShutdownBochs() strlen("Shutdown")); } +NTSTATUS +STDCALL +KMRegTestsRegister( + PIRP Irp, + PIO_STACK_LOCATION IrpSp) +{ + TestRoutine *pTestRoutine; + + pTestRoutine = (TestRoutine*)Irp->AssociatedIrp.SystemBuffer; + AddTest(*pTestRoutine); + + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + return STATUS_SUCCESS; +} + NTSTATUS STDCALL KMRegTestsRun( PIRP Irp, PIO_STACK_LOCATION IrpSp) { - InitializeTests(); - RegisterTests(); PerformTests(); ShutdownBochs(); @@ -77,6 +93,10 @@ KMRegTestsDispatch( Irp->IoStatus.Information = 0; switch (IrpSp->Parameters.DeviceIoControl.IoControlCode) { + case IOCTL_KMREGTESTS_REGISTER: + Status = KMRegTestsRegister(Irp, IrpSp); + break; + case IOCTL_KMREGTESTS_RUN: Status = KMRegTestsRun(Irp, IrpSp); break; @@ -95,18 +115,21 @@ KMRegTestsDispatch( DPRINT("Leaving. Status (0x%X).\n", Status); - return Status; + return Status; } NTSTATUS STDCALL KMRegTestsOpenClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { - PIO_STACK_LOCATION piosStack = IoGetCurrentIrpStackLocation(Irp); - NTSTATUS nErrCode; + PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); + NTSTATUS Status; - nErrCode = STATUS_SUCCESS; + DPRINT("Called. DeviceObject is at (0x%X), IRP is at (0x%X), IrpSp->FileObject (0x%X).\n", + DeviceObject, Irp, IrpSp->FileObject); - switch(piosStack->MajorFunction) + Status = STATUS_SUCCESS; + + switch (IrpSp->MajorFunction) { /* Opening and closing handles to the device */ case IRP_MJ_CREATE: @@ -123,18 +146,18 @@ KMRegTestsOpenClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) case IRP_MJ_READ: /* Ignore */ Irp->IoStatus.Information = 0; - nErrCode = STATUS_END_OF_FILE; + Status = STATUS_END_OF_FILE; break; /* Unsupported operations */ default: - nErrCode = STATUS_NOT_IMPLEMENTED; + Status = STATUS_NOT_IMPLEMENTED; } - Irp->IoStatus.Status = nErrCode; + Irp->IoStatus.Status = Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); - return nErrCode; + return Status; } NTSTATUS STDCALL @@ -177,5 +200,8 @@ DriverEntry(PDRIVER_OBJECT DriverObject, DeviceObject->Flags |= DO_BUFFERED_IO; + InitializeTests(); + RegisterTests(); + return Status; } diff --git a/reactos/regtests/kmregtests/kmregtests.h b/reactos/regtests/kmregtests/kmregtests.h index ab24c408a57..d16f56e93d8 100755 --- a/reactos/regtests/kmregtests/kmregtests.h +++ b/reactos/regtests/kmregtests/kmregtests.h @@ -10,10 +10,13 @@ /* KMREGTESTS IOCTL code definitions */ -#define FSCTL_KMREGTESTS_BASE FILE_DEVICE_NAMED_PIPE // ??? +#define FSCTL_KMREGTESTS_BASE FILE_DEVICE_NAMED_PIPE #define KMREGTESTS_CTL_CODE(Function, Method, Access) \ CTL_CODE(FSCTL_KMREGTESTS_BASE, Function, Method, Access) -#define IOCTL_KMREGTESTS_RUN \ +#define IOCTL_KMREGTESTS_REGISTER \ KMREGTESTS_CTL_CODE(0, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_KMREGTESTS_RUN \ + KMREGTESTS_CTL_CODE(1, METHOD_BUFFERED, FILE_ANY_ACCESS) diff --git a/reactos/rules.mak b/reactos/rules.mak index 3a8337f9450..f51874b828b 100644 --- a/reactos/rules.mak +++ b/reactos/rules.mak @@ -133,3 +133,4 @@ OS2_PATH_INC=$(OS2_PATH)/include # Other systems integration ROOT_PATH=$(PATH_TO_TOP)/.. +REGTESTS_PATH_INC=$(PATH_TO_TOP)/regtests/shared \ No newline at end of file diff --git a/reactos/tools/config.mk b/reactos/tools/config.mk index 73b9c725a50..91f3ae4e219 100644 --- a/reactos/tools/config.mk +++ b/reactos/tools/config.mk @@ -25,11 +25,14 @@ ifeq ($(ACPI), 1) CONFIG += ACPI endif +ifeq ($(REGRESSIONTESTS), 1) +CONFIG += REGTESTS +endif + ifeq ($(SEH), 1) CONFIG += SEH endif - $(PATH_TO_TOP)/tools/mkconfig$(EXE_POSTFIX): $(PATH_TO_TOP)/tools/mkconfig.c $(HOST_CC) -g -o $(PATH_TO_TOP)/tools/mkconfig$(EXE_POSTFIX) $(PATH_TO_TOP)/tools/mkconfig.c diff --git a/reactos/tools/helper.mk b/reactos/tools/helper.mk index 428adca0bd7..7e851cae5e7 100644 --- a/reactos/tools/helper.mk +++ b/reactos/tools/helper.mk @@ -1,4 +1,4 @@ -# $Id: helper.mk,v 1.53 2004/02/21 09:20:33 gvg Exp $ +# $Id: helper.mk,v 1.54 2004/02/22 09:59:17 chorns Exp $ # # Helper makefile for ReactOS modules # Variables this makefile accepts: @@ -18,7 +18,8 @@ # subsystem = Kernel subsystem # kmdll = Kernel mode DLL # winedll = DLL imported from wine -# $TARGET_APPTYPE = Application type (windows,native,console) +# $TARGET_APPTYPE = Application type (windows,native,console). +# Required only for TARGET_TYPEs program and proglib # $TARGET_NAME = Base name of output file and .rc, .def, and .edf files # $TARGET_OBJECTS = Object files that compose the module # $TARGET_CPPAPP = C++ application (no,yes) (optional) @@ -42,11 +43,13 @@ # $TARGET_ENTRY = Entry point (optional) # $TARGET_DEFONLY = Use .def instead of .edf extension (no,yes) (optional) # $TARGET_NORC = Do not include standard resource file (no,yes) (optional) -# $TARGET_LIBPATH = Destination path for import libraries (optional) +# $TARGET_LIBPATH = Destination path for static libraries (optional) +# $TARGET_IMPLIBPATH = Destination path for import libraries (optional) # $TARGET_INSTALLDIR = Destination path when installed (optional) # $TARGET_PCH = Filename of header to use to generate a PCH if supported by the compiler (optional) # $TARGET_BOOTSTRAP = Whether this file is needed to bootstrap the installation (no,yes) (optional) # $TARGET_BOOTSTRAP_NAME = Name on the installation medium (optional) +# $TARGET_REGTESTS = This module has regression tests (no,yes) (optional) # $WINE_MODE = Compile using WINE headers (no,yes) (optional) # $WINE_RC = Name of .rc file for WINE modules (optional) # $SUBDIRS = Subdirs in which to run make (optional) @@ -483,9 +486,15 @@ endif ifeq ($(TARGET_LIBPATH),) + MK_LIBPATH := $(SDK_PATH_LIB) +else + MK_LIBPATH := $(TARGET_LIBPATH) +endif + +ifeq ($(TARGET_IMPLIBPATH),) MK_IMPLIBPATH := $(MK_IMPLIBDEFPATH) else - MK_IMPLIBPATH := $(TARGET_LIBPATH) + MK_IMPLIBPATH := $(TARGET_IMPLIBPATH) endif @@ -583,8 +592,8 @@ TARGET_NFLAGS += $(MK_NFLAGS) MK_GCCLIBS := $(addprefix -l, $(TARGET_GCCLIBS)) -ifeq ($(TARGET_TYPE), library) - MK_FULLNAME := $(SDK_PATH_LIB)/$(MK_BASENAME)$(MK_EXT) +ifeq ($(MK_MODE),static) + MK_FULLNAME := $(MK_LIBPATH)/$(MK_BASENAME)$(MK_EXT) else MK_FULLNAME := $(MK_BASENAME)$(MK_EXT) endif @@ -608,13 +617,23 @@ else MK_STRIPPED_OBJECT := $(MK_BASENAME).stripped.o endif +ifeq ($(TARGET_REGTESTS),yes) + MK_REGTESTS := gen_regtests + MK_REGTESTS_CLEAN := clean_regtests + MK_OBJECTS += tests/_rtstub.o tests/regtests.a + TARGET_CFLAGS += -I$(REGTESTS_PATH_INC) +else + MK_REGTESTS := + MK_REGTESTS_CLEAN := +endif + ifeq ($(MK_IMPLIBONLY),yes) TARGET_CLEAN += $(MK_IMPLIBPATH)/$(MK_IMPLIB_FULLNAME) -all: $(MK_IMPLIBPATH)/$(MK_IMPLIB_FULLNAME) +all: $(MK_REGTESTS) $(MK_IMPLIBPATH)/$(MK_IMPLIB_FULLNAME) -$(MK_IMPLIBPATH)/$(MK_IMPLIB_FULLNAME): $(TARGET_OBJECTS) $(MK_DEFNAME) +$(MK_IMPLIBPATH)/$(MK_IMPLIB_FULLNAME): $(MK_OBJECTS) $(MK_DEFNAME) $(DLLTOOL) \ --dllname $(MK_FULLNAME) \ --def $(MK_DEFNAME) \ @@ -623,7 +642,7 @@ $(MK_IMPLIBPATH)/$(MK_IMPLIB_FULLNAME): $(TARGET_OBJECTS) $(MK_DEFNAME) else # MK_IMPLIBONLY -all: $(MK_FULLNAME) $(MK_NOSTRIPNAME) $(SUBDIRS:%=%_all) +all: $(MK_REGTESTS) $(MK_FULLNAME) $(MK_NOSTRIPNAME) $(SUBDIRS:%=%_all) ifeq ($(MK_IMPLIB),yes) @@ -644,7 +663,7 @@ else MK_EXTRACMD2 := endif -$(MK_NOSTRIPNAME): $(MK_FULLRES) $(TARGET_OBJECTS) $(MK_EXTRADEP) $(MK_LIBS) +$(MK_NOSTRIPNAME): $(MK_FULLRES) $(MK_OBJECTS) $(MK_EXTRADEP) $(MK_LIBS) ifeq ($(MK_EXETYPE),dll) $(LD_CC) -Wl,--base-file,base.tmp \ -Wl,--entry,$(TARGET_ENTRY) \ @@ -736,7 +755,7 @@ else MK_EXTRADEP := endif -$(MK_NOSTRIPNAME): $(MK_FULLRES) $(TARGET_OBJECTS) $(MK_EXTRADEP) $(MK_LIBS) +$(MK_NOSTRIPNAME): $(MK_FULLRES) $(MK_OBJECTS) $(MK_EXTRADEP) $(MK_LIBS) $(LD_CC) -Wl,--base-file,base.tmp \ -Wl,--entry,$(TARGET_ENTRY) \ $(TARGET_LFLAGS) \ @@ -766,7 +785,7 @@ else $(NM) --numeric-sort $(MK_NOSTRIPNAME) > $(MK_BASENAME).map endif -$(MK_FULLNAME): $(MK_FULLRES) $(TARGET_OBJECTS) $(MK_EXTRADEP) $(MK_LIBS) $(MK_NOSTRIPNAME) +$(MK_FULLNAME): $(MK_FULLRES) $(MK_OBJECTS) $(MK_EXTRADEP) $(MK_LIBS) $(MK_NOSTRIPNAME) - ifneq ($(TARGET_CPPAPP),yes) $(LD) -r -o $(MK_STRIPPED_OBJECT) $(MK_OBJECTS) @@ -843,7 +862,7 @@ MK_CLEANFILES := $(filter %.o,$(MK_OBJECTS)) MK_CLEANFILTERED := $(MK_OBJECTS:.o=.d) MK_CLEANDEPS := $(join $(dir $(MK_CLEANFILTERED)), $(addprefix ., $(notdir $(MK_CLEANFILTERED)))) -clean: $(SUBDIRS:%=%_clean) +clean: $(MK_REGTESTS_CLEAN) $(SUBDIRS:%=%_clean) - $(RM) *.o depend.d *.pch $(MK_BASENAME).sym $(MK_BASENAME).a $(MK_RESOURCE) \ $(MK_FULLNAME) $(MK_NOSTRIPNAME) $(MK_CLEANFILES) $(MK_CLEANDEPS) $(MK_BASENAME).map \ junk.tmp base.tmp temp.exp $(MK_RC_BINARIES) $(MK_SPECDEF) $(MK_GENERATED_MAKEFILE) \ @@ -921,7 +940,22 @@ $(MK_RC_BINARIES): $(TARGET_RC_BINSRC) $(MK_RESOURCE): $(MK_RC_BINARIES) endif -.PHONY: all depends implib clean install dist bootcd depends +gen_regtests: +ifeq ($(MK_MODE),user) + $(REGTESTS) ./tests/tests ./tests/_regtests.c ./tests/Makefile.tests -u ./tests/_rtstub.c + $(MAKE) -C tests TARGET_REGTESTS=no all +else +ifeq ($(MK_MODE),kernel) + $(REGTESTS) ./tests/tests ./tests/_regtests.c ./tests/Makefile.tests -k ./tests/_rtstub.c + $(MAKE) -C tests TARGET_REGTESTS=no all +endif +endif + +clean_regtests: + $(MAKE) -C tests TARGET_REGTESTS=no clean + $(RM) ./tests/_rtstub.c ./tests/_regtests.c ./tests/Makefile.tests + +.PHONY: all depends implib clean install dist bootcd depends gen_regtests clean_regtests ifneq ($(SUBDIRS),) $(SUBDIRS:%=%_all): %_all: diff --git a/reactos/tools/mkconfig.c b/reactos/tools/mkconfig.c index 56bb885dc08..3e92a861dbd 100644 --- a/reactos/tools/mkconfig.c +++ b/reactos/tools/mkconfig.c @@ -72,6 +72,7 @@ write_if_change(char* outbuf, char* filename) int main(int argc, char* argv[]) { + int include_tests; unsigned int i; char* outbuf; char* s; @@ -93,11 +94,16 @@ main(int argc, char* argv[]) s = outbuf; s = s + sprintf(s, "/* Automatically generated, "); s = s + sprintf(s, "Edit the Makefile to change configuration */\n"); - s = s + sprintf(s, "#ifndef __NTOSKRNL_INCLUDE_INTERNAL_CONFIG_H\n"); - s = s + sprintf(s, "#define __NTOSKRNL_INCLUDE_INTERNAL_CONFIG_H\n"); + s = s + sprintf(s, "#ifndef __INCLUDE_CONFIG_H\n"); + s = s + sprintf(s, "#define __INCLUDE_CONFIG_H\n"); strcpy(config, ""); + include_tests = 0; for (i = 2; i < argc; i++) { + if (strcmp(argv[i], "REGTESTS") == 0) + { + include_tests = 1; + } s = s + sprintf(s, "#define %s\n", argv[i]); strcat(config, argv[i]); if (i != (argc - 1)) @@ -105,8 +111,19 @@ main(int argc, char* argv[]) strcat(config, " "); } } + if (include_tests) + { + s = s + sprintf(s, "#ifndef __ASM__\n"); + s = s + sprintf(s, "extern void PrepareTests();\n"); + s = s + sprintf(s, "#define PREPARE_TESTS PrepareTests();\n"); + s = s + sprintf(s, "#endif /* __ASM__ */\n"); + } + else + { + s = s + sprintf(s, "#define PREPARE_TESTS\n"); + } s = s + sprintf(s, "#define CONFIG \"%s\"\n", config); - s = s + sprintf(s, "#endif /* __NTOSKRNL_INCLUDE_INTERNAL_CONFIG_H */\n"); + s = s + sprintf(s, "#endif /* __INCLUDE_CONFIG_H */\n"); return(write_if_change(outbuf, argv[1])); } diff --git a/reactos/tools/regtests.c b/reactos/tools/regtests.c index 062a990429e..667e22a27c0 100755 --- a/reactos/tools/regtests.c +++ b/reactos/tools/regtests.c @@ -36,6 +36,8 @@ static FILE *out; static char *path; static char *file; static char *makefile; +static char *umstubfile; +static char *kmstubfile; char* convert_path(char* origpath) { @@ -324,16 +326,136 @@ make_file_list (int type) #endif +static int +is_file_changed(char *filename, char *content) +{ + FILE *file; + int size; + int n; + char *filecontent; + + file = fopen(filename, "rb"); + if (file == NULL) + { + return 1; + } + + fseek(file, 0, SEEK_END); + size = ftell(file); + fseek(file, 0, SEEK_SET); + if (size <= 0) + { + fclose(file); + return 1; + } + filecontent = malloc(size); + if (filecontent == NULL) + { + fclose(file); + return 1; + } + + n = fread(filecontent, 1, size, file); + + if (n != strlen(content)) + { + free(filecontent); + fclose(file); + return 1; + } + + if (strcmp(content, filecontent) != 0) + { + free(filecontent); + fclose(file); + return 1; + } + + free(filecontent); + + fclose(file); + + return 0; +} + +static int +write_file_if_changed(char *filename, char *content) +{ + FILE *file; + int n; + + if (is_file_changed(filename, content) == 0) + { + return 0; + } + + file = fopen(filename, "wb"); + if (file == NULL) + { + return 1; + } + + n = fwrite(content, 1, strlen(content), file); + + fclose(file); + + return 0; +} + +static char KMSTUB[] = + "/* This file is autogenerated. */\n" + "\n" + "#include <roskrnl.h>\n" + "#include <../kmregtests/kmregtests.h>\n" + "\n" + "typedef int (*TestRoutine)(int Command, char *Buffer);\n" + "\n" + "extern void RegisterTests();\n" + "\n" + "static PDEVICE_OBJECT KMRegTestsDeviceObject = NULL;\n" + "static PFILE_OBJECT KMRegTestsFileObject = NULL;\n" + "\n" + "void AddTest(TestRoutine Routine)\n" + "{\n" + " PDEVICE_OBJECT DeviceObject;\n" + " UNICODE_STRING DriverName;\n" + " IO_STATUS_BLOCK IoStatus;\n" + " NTSTATUS Status;\n" + " KEVENT Event;\n" + " PIRP Irp;\n" + "\n" + " if (KMRegTestsDeviceObject == NULL)\n" + " {\n" + " RtlInitUnicodeString(&DriverName, L\"\\Device\\KMRegTests\");\n" + " Status = IoGetDeviceObjectPointer(&DriverName, FILE_WRITE_ATTRIBUTES,\n" + " &KMRegTestsFileObject, &KMRegTestsDeviceObject);\n" + " if (!NT_SUCCESS(Status)) return;\n" + " }\n" + " KeInitializeEvent(&Event, NotificationEvent, FALSE);\n" + " Irp = IoBuildDeviceIoControlRequest(IOCTL_KMREGTESTS_REGISTER,\n" + " KMRegTestsDeviceObject, &Routine, sizeof(TestRoutine), NULL, 0, FALSE, &Event, &IoStatus);\n" + " Status = IoCallDriver(KMRegTestsDeviceObject, Irp);\n" + "}\n" + "\n" + "void PrepareTests()\n" + "{\n" + " RegisterTests();\n" + "}\n"; + static char HELP[] = - "REGTESTS path file makefile\n" + "REGTESTS path file makefile [-u umstubfile] [-k kmstubfile]\n" "\n" " path Path to files\n" " file Registration file to create\n" - " makefile Makefile to create\n"; + " makefile Makefile to create\n" + " umstubfile Optional stub for running tests internal to a user-mode module\n" + " kmstubfile Optional stub for running tests internal to a kernel-mode module\n"; int main(int argc, char **argv) { char buf[MAX_PATH]; + int i; + if (argc < 4) { puts(HELP); @@ -369,6 +491,38 @@ int main(int argc, char **argv) return 1; } + umstubfile = NULL; + kmstubfile = NULL; + for (i = 4; i < argc; i++) + { + if (argv[i][0] == '-') + { + if (argv[i][1] == 'u') + { + umstubfile = convert_path(argv[++i]); + if (umstubfile[0] == 0) + { + printf("Missing umstubfile\n"); + return 1; + } + } + else if (argv[i][1] == 'k') + { + kmstubfile = convert_path(argv[++i]); + if (kmstubfile[0] == 0) + { + printf("Missing kmstubfile\n"); + return 1; + } + } + else + { + printf("Unknown switch\n"); + return 1; + } + } + } + /* Registration file */ out = fopen(file, "wb"); @@ -416,6 +570,30 @@ int main(int argc, char **argv) fclose(out); + /* User-mode stubfile */ + if (umstubfile != NULL) + { +#if 0 + if (write_file_if_changed(umstubfile, UMSTUB) != 0) + { + perror("Cannot create output user-mode stubfile"); + return 1; + } +#else + perror("WATNING: Cannot create output user-mode stubfile"); +#endif + } + + /* Kernel-mode stubfile */ + if (kmstubfile != NULL) + { + if (write_file_if_changed(kmstubfile, KMSTUB) != 0) + { + perror("Cannot create output kernel-mode stubfile"); + return 1; + } + } + printf("Successfully generated regression test registrations.\n"); return 0; From b45d1b24ec788943e5d9c6fd71387ed54cdec99b Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 22 Feb 2004 10:20:30 +0000 Subject: [PATCH 0119/1463] - handle case, when having problems to open image file - disable FAT-button since it's not yet ready svn path=/trunk/; revision=8299 --- .../subsys/system/explorer/doxy-footer.html | 2 +- .../system/explorer/shell/filechild.cpp | 42 ++++++++++++------- .../system/explorer/shell/mainframe.cpp | 2 + 3 files changed, 29 insertions(+), 17 deletions(-) diff --git a/reactos/subsys/system/explorer/doxy-footer.html b/reactos/subsys/system/explorer/doxy-footer.html index 5855b19a591..da80c841467 100644 --- a/reactos/subsys/system/explorer/doxy-footer.html +++ b/reactos/subsys/system/explorer/doxy-footer.html @@ -3,7 +3,7 @@ <tr> <td><address style="align: right;"><small> ROS Explorer Source Code Documentation -<br>generated on 11.02.2004 by <a href="http://www.doxygen.org/index.html"> +<br>generated on 22.02.2004 by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border=0> </small></address> </td> diff --git a/reactos/subsys/system/explorer/shell/filechild.cpp b/reactos/subsys/system/explorer/shell/filechild.cpp index 28ca0572140..ddb78ac00f9 100644 --- a/reactos/subsys/system/explorer/shell/filechild.cpp +++ b/reactos/subsys/system/explorer/shell/filechild.cpp @@ -101,7 +101,10 @@ FileChildWindow::FileChildWindow(HWND hwnd, const FileChildWndInfo& info) CONTEXT("FileChildWindow::FileChildWindow()"); TCHAR drv[_MAX_DRIVE+1]; - Entry* entry; + Entry* entry = NULL; + + _left = NULL; + _right = NULL; switch(info._etype) { case ET_SHELL: { //@@ evtl. Aufteilung von FileChildWindow in ShellChildWindow, WinChildWindow, UnixChildWindow @@ -156,7 +159,7 @@ FileChildWindow::FileChildWindow(HWND hwnd, const FileChildWndInfo& info) entry = _root._entry->read_tree(info._path, SORT_NONE); break; - case ET_FAT: + case ET_FAT: { _root._drive_type = DRIVE_UNKNOWN; _tsplitpath(info._path, drv, NULL, NULL, NULL); @@ -164,9 +167,13 @@ FileChildWindow::FileChildWindow(HWND hwnd, const FileChildWndInfo& info) lstrcpy(_root._volname, TEXT("FAT XXX")); //@@ lstrcpy(_root._fs, TEXT("FAT")); lstrcpy(_root._path, drv); - _root._entry = new FATDrive(TEXT("c:/reactos-bochs/cdrv.img")); //TEXT("\\\\.\\F:")); //@@ - entry = _root._entry->read_tree(info._path, SORT_NONE); - break; + FATDrive* drive = new FATDrive(TEXT("c:/reactos-bochs/cdrv.img")); //TEXT("\\\\.\\F:")); //@@ + + if (drive->_hDrive != INVALID_HANDLE_VALUE) { + _root._entry = drive; + entry = _root._entry->read_tree(info._path, SORT_NONE); + } + break;} default: // ET_WINDOWS _root._drive_type = GetDriveType(info._path); @@ -179,24 +186,27 @@ FileChildWindow::FileChildWindow(HWND hwnd, const FileChildWndInfo& info) entry = _root._entry->read_tree(info._path, SORT_NAME); } - if (info._etype != ET_SHELL) - wsprintf(_root._entry->_data.cFileName, TEXT("%s - %s"), drv, _root._fs); -/*@@else - lstrcpy(_root._entry->_data.cFileName, TEXT("GetDesktopFolder"));*/ + if (_root._entry) { + if (info._etype != ET_SHELL) + wsprintf(_root._entry->_data.cFileName, TEXT("%s - %s"), drv, _root._fs); + /*@@else + lstrcpy(_root._entry->_data.cFileName, TEXT("GetDesktopFolder"));*/ - _root._entry->_data.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY; + _root._entry->_data.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY; - if (info._open_mode & OWM_EXPLORE) ///@todo Is not-explore-mode for FileChildWindow completely implemented? + if (info._open_mode & OWM_EXPLORE) ///@todo Is not-explore-mode for FileChildWindow completely implemented? _left_hwnd = *(_left=new Pane(_hwnd, IDW_TREE_LEFT, IDW_HEADER_LEFT, _root._entry, true, COL_CONTENT)); - _right_hwnd = *(_right=new Pane(_hwnd, IDW_TREE_RIGHT, IDW_HEADER_RIGHT, NULL, false, - COL_TYPE|COL_SIZE|COL_DATE|COL_TIME|COL_ATTRIBUTES|COL_INDEX|COL_LINKS|COL_CONTENT)); + _right_hwnd = *(_right=new Pane(_hwnd, IDW_TREE_RIGHT, IDW_HEADER_RIGHT, NULL, false, + COL_TYPE|COL_SIZE|COL_DATE|COL_TIME|COL_ATTRIBUTES|COL_INDEX|COL_LINKS|COL_CONTENT)); + } _sortOrder = SORT_NAME; _header_wdths_ok = false; - set_curdir(entry, hwnd); + if (entry) + set_curdir(entry, hwnd); if (_left_hwnd) { int idx = ListBox_FindItemData(_left_hwnd, ListBox_GetCurSel(_left_hwnd), _left->_cur); @@ -346,7 +356,7 @@ void FileChildWindow::resize_children(int cx, int cy) cx = _split_pos + SPLIT_WIDTH/2; - { + if (_left && _right) { WINDOWPOS wp; HD_LAYOUT hdl; @@ -397,7 +407,7 @@ LRESULT FileChildWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) case WM_SETFOCUS: { TCHAR path[MAX_PATH]; - if (_left->_cur) { + if (_left && _left->_cur) { _left->_cur->get_path(path); SetCurrentDirectory(path); } diff --git a/reactos/subsys/system/explorer/shell/mainframe.cpp b/reactos/subsys/system/explorer/shell/mainframe.cpp index 9db46e270c7..72af7146c96 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.cpp +++ b/reactos/subsys/system/explorer/shell/mainframe.cpp @@ -144,12 +144,14 @@ MainFrame::MainFrame(HWND hwnd) SendMessage(_hdrivebar, TB_INSERTBUTTON, btn++, (LPARAM)&drivebarBtn); ++drivebarBtn.iString; +#ifdef _DEBUG // insert FAT direct file system access button SendMessage(_hdrivebar, TB_ADDSTRING, 0, (LPARAM)TEXT("FAT\0")); drivebarBtn.idCommand = ID_DRIVE_FAT; SendMessage(_hdrivebar, TB_INSERTBUTTON, btn++, (LPARAM)&drivebarBtn); ++drivebarBtn.iString; +#endif // insert web control button SendMessage(_hdrivebar, TB_ADDSTRING, 0, (LPARAM)TEXT("Web\0")); From 80c553b4b538d4b8d4dc970d0cd2f9a408cb2e24 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sun, 22 Feb 2004 12:06:43 +0000 Subject: [PATCH 0120/1463] minor cleanup svn path=/trunk/; revision=8301 --- reactos/subsys/win32k/include/tags.h | 3 +++ reactos/subsys/win32k/misc/driver.c | 11 +++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/reactos/subsys/win32k/include/tags.h b/reactos/subsys/win32k/include/tags.h index 3dcf20d4016..08b29101d13 100644 --- a/reactos/subsys/win32k/include/tags.h +++ b/reactos/subsys/win32k/include/tags.h @@ -41,4 +41,7 @@ #define TAG_GDITEXT TAG('T', 'X', 'T', 'O') /* text */ #define TAG_FONT TAG('F', 'N', 'T', 'O') /* font entry */ +/* misc */ +#define TAG_DRIVER TAG('G', 'D', 'R', 'V') /* video drivers */ + #endif /* _WIN32K_TAGS_H */ diff --git a/reactos/subsys/win32k/misc/driver.c b/reactos/subsys/win32k/misc/driver.c index 15ce99d1373..8bc4753b8dd 100644 --- a/reactos/subsys/win32k/misc/driver.c +++ b/reactos/subsys/win32k/misc/driver.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: driver.c,v 1.35 2004/02/08 21:37:53 weiden Exp $ +/* $Id: driver.c,v 1.36 2004/02/22 12:06:43 weiden Exp $ * * GDI Driver support routines * (mostly swiped from Wine) @@ -34,12 +34,11 @@ #include <ddk/winddi.h> #include <ddk/ntddvid.h> #include <rosrtl/string.h> +#include <include/tags.h> #define NDEBUG #include <debug.h> -#define DRIVER_TAG TAG('G', 'D', 'R', 'V') - typedef struct _GRAPHICS_DRIVER { PWSTR Name; @@ -53,7 +52,7 @@ static PGRAPHICS_DRIVER GenericDriver = 0; BOOL DRIVER_RegisterDriver(LPCWSTR Name, PGD_ENABLEDRIVER EnableDriver) { - PGRAPHICS_DRIVER Driver = ExAllocatePoolWithTag(NonPagedPool, sizeof(*Driver), DRIVER_TAG); + PGRAPHICS_DRIVER Driver = ExAllocatePoolWithTag(NonPagedPool, sizeof(*Driver), TAG_DRIVER); DPRINT( "DRIVER_RegisterDriver( Name: %S )\n", Name ); if (!Driver) return FALSE; Driver->ReferenceCount = 0; @@ -62,7 +61,7 @@ BOOL DRIVER_RegisterDriver(LPCWSTR Name, PGD_ENABLEDRIVER EnableDriver) { Driver->Name = ExAllocatePoolWithTag(PagedPool, (wcslen(Name) + 1) * sizeof(WCHAR), - DRIVER_TAG); + TAG_DRIVER); wcscpy(Driver->Name, Name); Driver->Next = DriverList; DriverList = Driver; @@ -118,7 +117,7 @@ PGD_ENABLEDRIVER DRIVER_FindDDIDriver(LPCWSTR Name) { Size += sizeof(DefaultExtension) - sizeof(WCHAR); } - FullName = ExAllocatePoolWithTag(PagedPool, Size, DRIVER_TAG); + FullName = ExAllocatePoolWithTag(PagedPool, Size, TAG_DRIVER); if (NULL == FullName) { DPRINT1("Out of memory\n"); From 2ae57f1248b7dbb56515a4fb7041c740ed9b07f8 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 22 Feb 2004 12:18:58 +0000 Subject: [PATCH 0121/1463] disable stubs for SHFindFiles() and SHFindComputer() svn path=/trunk/; revision=8303 --- reactos/lib/shell32/shell32.spec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/shell32/shell32.spec b/reactos/lib/shell32/shell32.spec index bda4e681f81..ec7384ad548 100644 --- a/reactos/lib/shell32/shell32.spec +++ b/reactos/lib/shell32/shell32.spec @@ -83,8 +83,8 @@ 87 stdcall SHRevokeDragDrop(long) 88 stdcall SHDoDragDrop(long ptr ptr long ptr) 89 stdcall SHCloneSpecialIDList(long long long) - 90 stub SHFindFiles - 91 stub SHFindComputer +# 90 stub SHFindFiles +# 91 stub SHFindComputer 92 stdcall PathGetShortPath (ptr) PathGetShortPathAW 93 stdcall Win32CreateDirectory(wstr ptr) Win32CreateDirectoryAW 94 stdcall Win32RemoveDirectory(wstr) Win32RemoveDirectoryAW From 936dffea066a78b17556f6c7629acfcd629f34da Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 22 Feb 2004 12:25:02 +0000 Subject: [PATCH 0122/1463] - Don't call IntSendMessage in MsqTranslateMouseMessage with uninitialized variable as window handle. svn path=/trunk/; revision=8304 --- reactos/subsys/win32k/ntuser/msgqueue.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index f2bbfc05426..e2138ed08f3 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.67 2004/02/19 21:12:09 weiden Exp $ +/* $Id: msgqueue.c,v 1.68 2004/02/22 12:25:02 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -243,7 +243,6 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, { USHORT Msg = Message->Msg.message; PWINDOW_OBJECT CaptureWin, Window = NULL; - HWND Wnd; POINT Point; LPARAM SpareLParam; LRESULT Result; @@ -265,7 +264,7 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, if(Window && (Hit != (USHORT)HTTRANSPARENT)) { - Result = IntSendMessage(Wnd, WM_MOUSEACTIVATE, (WPARAM)NtUserGetParent(Window->Self), (LPARAM)SpareLParam); + Result = IntSendMessage(Window->Self, WM_MOUSEACTIVATE, (WPARAM)NtUserGetParent(Window->Self), (LPARAM)SpareLParam); switch (Result) { @@ -982,6 +981,7 @@ MsqCreateMessageQueue(struct _ETHREAD *Thread) MessageQueue = (PUSER_MESSAGE_QUEUE)ExAllocatePoolWithTag(PagedPool, sizeof(USER_MESSAGE_QUEUE) + sizeof(THRDCARETINFO), TAG_MSGQ); + RtlZeroMemory(MessageQueue, sizeof(USER_MESSAGE_QUEUE) + sizeof(THRDCARETINFO)); if (!MessageQueue) { return NULL; From 9dacfa1b682b37c7dc5d8f9f0c8a326af93b01dd Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 22 Feb 2004 12:25:35 +0000 Subject: [PATCH 0123/1463] - Modifed DceUpdateVisRgn to correctly handle situations when DceGetVisRgn returns NULL. - Fixed the alternative version of VIS_ComputeVisibleRegion and made it the one and only, because it's smaller and faster than the original one. svn path=/trunk/; revision=8305 --- reactos/subsys/win32k/ntuser/vis.c | 225 ++++----------------------- reactos/subsys/win32k/ntuser/windc.c | 123 ++++++++------- 2 files changed, 89 insertions(+), 259 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/vis.c b/reactos/subsys/win32k/ntuser/vis.c index 35c7a224a7c..c2aa65d3e46 100644 --- a/reactos/subsys/win32k/ntuser/vis.c +++ b/reactos/subsys/win32k/ntuser/vis.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: vis.c,v 1.17 2004/02/04 22:55:21 gvg Exp $ + * $Id: vis.c,v 1.18 2004/02/22 12:25:34 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -34,183 +34,6 @@ #include <win32k/debug1.h> #include <debug.h> -#if 1 -BOOL STATIC FASTCALL -VIS_GetVisRect(PDESKTOP_OBJECT Desktop, PWINDOW_OBJECT Window, - BOOLEAN ClientArea, RECT* Rect) -{ - PWINDOW_OBJECT DesktopWindow; - - if (ClientArea) - { - *Rect = Window->ClientRect; - } - else - { - *Rect = Window->WindowRect; - } - - if (0 == (Window->Style & WS_VISIBLE)) - { - NtGdiSetEmptyRect(Rect); - - return FALSE; - } - - if (Window->Self == Desktop->DesktopWindow) - { - return TRUE; - } - - if (0 != (Window->Style & WS_CHILD)) - { - do - { - Window = Window->Parent; - if (WS_VISIBLE != (Window->Style & (WS_ICONIC | WS_VISIBLE))) - { - NtGdiSetEmptyRect(Rect); - return FALSE; - } - if (! NtGdiIntersectRect(Rect, Rect, &(Window->ClientRect))) - { - return FALSE; - } - } - while (0 != (Window->Style & WS_CHILD)); - } - - DesktopWindow = IntGetWindowObject(Desktop->DesktopWindow); - if (NULL == DesktopWindow) - { - ASSERT(FALSE); - return FALSE; - } - - if (! NtGdiIntersectRect(Rect, Rect, &(DesktopWindow->ClientRect))) - { - IntReleaseWindowObject(DesktopWindow); - return FALSE; - } - IntReleaseWindowObject(DesktopWindow); - - return TRUE; -} - -STATIC BOOL FASTCALL -VIS_AddClipRects(PWINDOW_OBJECT Parent, PWINDOW_OBJECT End, - HRGN ClipRgn, PRECT Rect) -{ - PWINDOW_OBJECT Child; - RECT Intersect; - - ExAcquireFastMutexUnsafe(&Parent->ChildrenListLock); - Child = Parent->FirstChild; - while (Child) - { - if (Child == End) - { - ExReleaseFastMutexUnsafe(&Parent->ChildrenListLock); - return TRUE; - } - - if (Child->Style & WS_VISIBLE) - { - if (NtGdiIntersectRect(&Intersect, &Child->WindowRect, Rect)) - { - UnsafeIntUnionRectWithRgn(ClipRgn, &Child->WindowRect); - } - } - - Child = Child->NextSibling; - } - - ExReleaseFastMutexUnsafe(&Parent->ChildrenListLock); - - return FALSE; -} - -HRGN FASTCALL -VIS_ComputeVisibleRegion(PWINDOW_OBJECT Window, - BOOLEAN ClientArea, BOOLEAN ClipChildren, - BOOLEAN ClipSiblings) -{ - HRGN VisRgn; - RECT Rect; - HRGN ClipRgn; - PWINDOW_OBJECT DesktopWindow; - INT LeftOffset, TopOffset; - PDESKTOP_OBJECT Desktop = Window->OwnerThread->Win32Thread->Desktop; - - DesktopWindow = IntGetWindowObject(Desktop->DesktopWindow); - if (NULL == DesktopWindow) - { - ASSERT(FALSE); - return NULL; - } - - if (VIS_GetVisRect(Desktop, Window, ClientArea, &Rect)) - { - VisRgn = UnsafeIntCreateRectRgnIndirect(&Rect); - if (NULL != VisRgn) - { - if (ClientArea) - { - LeftOffset = Window->ClientRect.left; - TopOffset = Window->ClientRect.top; - } - else - { - LeftOffset = Window->WindowRect.left; - TopOffset = Window->WindowRect.top; - } - - ClipRgn = NtGdiCreateRectRgn(0, 0, 0, 0); - - if (ClipRgn != NULL) - { - if (ClipChildren && Window->FirstChild) - { - VIS_AddClipRects(Window, NULL, ClipRgn, &Rect); - } - - if (ClipSiblings && 0 != (Window->Style & WS_CHILD)) - { - VIS_AddClipRects(Window->Parent, Window, ClipRgn, &Rect); - } - - while (0 != (Window->Style & WS_CHILD)) - { - if (0 != (Window->Style & WS_CLIPSIBLINGS)) - { - VIS_AddClipRects(Window->Parent, Window, ClipRgn, &Rect); - } - Window = Window->Parent; - } - - VIS_AddClipRects(DesktopWindow, Window, ClipRgn, &Rect); - - NtGdiCombineRgn(VisRgn, VisRgn, ClipRgn, RGN_DIFF); - NtGdiDeleteObject(ClipRgn); - NtGdiOffsetRgn(VisRgn, -LeftOffset, -TopOffset); - } - else - { - NtGdiDeleteObject(VisRgn); - VisRgn = NULL; - } - } - } - else - { - VisRgn = NtGdiCreateRectRgn(0, 0, 0, 0); - } - - IntReleaseWindowObject(DesktopWindow); - - return VisRgn; -} -#else HRGN FASTCALL VIS_ComputeVisibleRegion( PWINDOW_OBJECT Window, @@ -220,7 +43,7 @@ VIS_ComputeVisibleRegion( { HRGN VisRgn, ClipRgn; INT LeftOffset, TopOffset; - PWINDOW_OBJECT CurrentWindow; + PWINDOW_OBJECT PreviousWindow, CurrentWindow, CurrentSibling; if (!(Window->Style & WS_VISIBLE)) { @@ -240,6 +63,13 @@ VIS_ComputeVisibleRegion( TopOffset = Window->WindowRect.top; } + /* + * Walk through all perent windows and for each clip the visble region + * to the parent's client area and exclude all siblings that are over + * our window. + */ + + PreviousWindow = Window; CurrentWindow = Window->Parent; while (CurrentWindow) { @@ -251,6 +81,25 @@ VIS_ComputeVisibleRegion( ClipRgn = UnsafeIntCreateRectRgnIndirect(&CurrentWindow->ClientRect); NtGdiCombineRgn(VisRgn, VisRgn, ClipRgn, RGN_AND); NtGdiDeleteObject(ClipRgn); + + if (ClipSiblings) + { + ExAcquireFastMutexUnsafe(&CurrentWindow->ChildrenListLock); + CurrentSibling = CurrentWindow->FirstChild; + while (CurrentSibling != PreviousWindow) + { + if (CurrentSibling->Style & WS_VISIBLE) + { + ClipRgn = UnsafeIntCreateRectRgnIndirect(&CurrentSibling->WindowRect); + NtGdiCombineRgn(VisRgn, VisRgn, ClipRgn, RGN_DIFF); + NtGdiDeleteObject(ClipRgn); + } + CurrentSibling = CurrentSibling->NextSibling; + } + ExReleaseFastMutexUnsafe(&CurrentWindow->ChildrenListLock); + } + + PreviousWindow = CurrentWindow; CurrentWindow = CurrentWindow->Parent; } @@ -271,28 +120,10 @@ VIS_ComputeVisibleRegion( ExReleaseFastMutexUnsafe(&Window->ChildrenListLock); } - if (ClipSiblings && Window->Parent != NULL) - { - ExAcquireFastMutexUnsafe(&Window->Parent->ChildrenListLock); - CurrentWindow = Window->Parent->FirstChild; - while (CurrentWindow != Window) - { - if (CurrentWindow->Style & WS_VISIBLE) - { - ClipRgn = UnsafeIntCreateRectRgnIndirect(&CurrentWindow->WindowRect); - NtGdiCombineRgn(VisRgn, VisRgn, ClipRgn, RGN_DIFF); - NtGdiDeleteObject(ClipRgn); - } - CurrentWindow = CurrentWindow->NextSibling; - } - ExReleaseFastMutexUnsafe(&Window->Parent->ChildrenListLock); - } - NtGdiOffsetRgn(VisRgn, -LeftOffset, -TopOffset); return VisRgn; } -#endif VOID FASTCALL VIS_WindowLayoutChanged( diff --git a/reactos/subsys/win32k/ntuser/windc.c b/reactos/subsys/win32k/ntuser/windc.c index 3cbe02bfd43..3b37cc15765 100644 --- a/reactos/subsys/win32k/ntuser/windc.c +++ b/reactos/subsys/win32k/ntuser/windc.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: windc.c,v 1.57 2004/02/21 13:13:27 navaraf Exp $ +/* $Id: windc.c,v 1.58 2004/02/22 12:25:35 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -230,83 +230,82 @@ DceReleaseDC(DCE* dce) STATIC VOID FASTCALL DceUpdateVisRgn(DCE *Dce, PWINDOW_OBJECT Window, ULONG Flags) { - HANDLE hRgnVisible = NULL; - ULONG DcxFlags; - PWINDOW_OBJECT DesktopWindow; + HANDLE hRgnVisible = NULL; + ULONG DcxFlags; + PWINDOW_OBJECT DesktopWindow; - if (Flags & DCX_PARENTCLIP) - { + if (Flags & DCX_PARENTCLIP) + { PWINDOW_OBJECT Parent; Parent = Window->Parent; - - if (Window->Style & WS_VISIBLE) - { - if (Parent->Style & WS_CLIPSIBLINGS) - { - DcxFlags = DCX_CLIPSIBLINGS | - (Flags & ~(DCX_CLIPCHILDREN | DCX_WINDOW)); - } - else - { - DcxFlags = Flags & - ~(DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN | DCX_WINDOW); - } - hRgnVisible = DceGetVisRgn(Parent->Self, DcxFlags, - Window->Self, Flags); - if (0 == (Flags & DCX_WINDOW)) - { - NtGdiOffsetRgn(hRgnVisible, - Parent->ClientRect.left - Window->ClientRect.left, - Parent->ClientRect.top - Window->ClientRect.top); - } - else - { - NtGdiOffsetRgn(hRgnVisible, - Parent->WindowRect.left - Window->WindowRect.left, - Parent->WindowRect.top - Window->WindowRect.top); - } - } + if (Parent->Style & WS_CLIPSIBLINGS) + { + DcxFlags = DCX_CLIPSIBLINGS | + (Flags & ~(DCX_CLIPCHILDREN | DCX_WINDOW)); + } else - { - hRgnVisible = NtGdiCreateRectRgn(0, 0, 0, 0); - } - } - else if (NULL == Window) - { + { + DcxFlags = Flags & ~(DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN | DCX_WINDOW); + } + hRgnVisible = DceGetVisRgn(Parent->Self, DcxFlags, Window->Self, Flags); + if (hRgnVisible == NULL) + { + hRgnVisible = NtGdiCreateRectRgn(0, 0, 0, 0); + } + else + { + if (0 == (Flags & DCX_WINDOW)) + { + NtGdiOffsetRgn( + hRgnVisible, + Parent->ClientRect.left - Window->ClientRect.left, + Parent->ClientRect.top - Window->ClientRect.top); + } + else + { + NtGdiOffsetRgn( + hRgnVisible, + Parent->WindowRect.left - Window->WindowRect.left, + Parent->WindowRect.top - Window->WindowRect.top); + } + } + } + else if (Window == NULL) + { DesktopWindow = IntGetWindowObject(IntGetDesktopWindow()); if (NULL != DesktopWindow) - { - hRgnVisible = UnsafeIntCreateRectRgnIndirect(&DesktopWindow->WindowRect); - IntReleaseWindowObject(DesktopWindow); - } + { + hRgnVisible = UnsafeIntCreateRectRgnIndirect(&DesktopWindow->WindowRect); + IntReleaseWindowObject(DesktopWindow); + } else - { - hRgnVisible = NULL; - } - } - else - { + { + hRgnVisible = NULL; + } + } + else + { hRgnVisible = DceGetVisRgn(Window->Self, Flags, 0, 0); - } + } - if (0 != (Flags & DCX_INTERSECTRGN)) - { + if (Flags & DCX_INTERSECTRGN) + { NtGdiCombineRgn(hRgnVisible, hRgnVisible, Dce->hClipRgn, RGN_AND); - } + } - if (0 != (Flags & DCX_EXCLUDERGN)) - { + if (Flags & DCX_EXCLUDERGN) + { NtGdiCombineRgn(hRgnVisible, hRgnVisible, Dce->hClipRgn, RGN_DIFF); - } + } - Dce->DCXFlags &= ~DCX_DCEDIRTY; - NtGdiSelectVisRgn(Dce->hDC, hRgnVisible); + Dce->DCXFlags &= ~DCX_DCEDIRTY; + NtGdiSelectVisRgn(Dce->hDC, hRgnVisible); - if (hRgnVisible != NULL) - { + if (hRgnVisible != NULL) + { NtGdiDeleteObject(hRgnVisible); - } + } } HDC STDCALL From 765c5f4797006eb524a137babec844ee31f51b19 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 22 Feb 2004 12:26:06 +0000 Subject: [PATCH 0124/1463] display 'not yet implemented' messages for printers, network and RAS; disable address&command bar svn path=/trunk/; revision=8306 --- .../system/explorer/shell/mainframe.cpp | 2 ++ .../system/explorer/taskbar/startmenu.cpp | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/reactos/subsys/system/explorer/shell/mainframe.cpp b/reactos/subsys/system/explorer/shell/mainframe.cpp index 72af7146c96..86f404984ac 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.cpp +++ b/reactos/subsys/system/explorer/shell/mainframe.cpp @@ -186,6 +186,7 @@ MainFrame::MainFrame(HWND hwnd) } +#ifdef _DEBUG // address & command bar WindowCanvas canvas(hwnd); RECT rect = {0, 0, 0, 0}; @@ -199,6 +200,7 @@ MainFrame::MainFrame(HWND hwnd) _hcommandedit = CreateWindow(TEXT("EDIT"), TEXT("> Command"), WS_CHILD|WS_VISIBLE, 0, 0, 0, rect.bottom, hwnd, (HMENU)IDW_ADDRESSBAR, g_Globals._hInstance, 0); SetWindowFont(_hcommandedit, hfont, FALSE); +#endif /* CreateStatusWindow does not accept WS_BORDER _hstatusbar = CreateWindowEx(WS_EX_NOPARENTNOTIFY, STATUSCLASSNAME, 0, diff --git a/reactos/subsys/system/explorer/taskbar/startmenu.cpp b/reactos/subsys/system/explorer/taskbar/startmenu.cpp index fcb71556b79..76fbdbae1cc 100644 --- a/reactos/subsys/system/explorer/taskbar/startmenu.cpp +++ b/reactos/subsys/system/explorer/taskbar/startmenu.cpp @@ -1592,7 +1592,11 @@ int StartMenuHandler::Command(int id, int code) break; case IDC_PRINTERS: +#ifdef _ROS_ // to be removed when printer folder will be implemented + MessageBox(0, TEXT("printer folder not yet implemented in SHELL32"), ResString(IDS_TITLE), MB_OK); +#else CreateSubmenu(id, CSIDL_PRINTERS, CSIDL_PRINTHOOD, ResString(IDS_PRINTERS)); +#endif break; case IDC_CONTROL_PANEL: @@ -1605,14 +1609,22 @@ int StartMenuHandler::Command(int id, int code) break; case IDC_CONNECTIONS: +#ifdef _ROS_ // to be removed when RAS will be implemented + MessageBox(0, TEXT("RAS folder not yet implemented in SHELL32"), ResString(IDS_TITLE), MB_OK); +#else CreateSubmenu(id, CSIDL_CONNECTIONS, ResString(IDS_CONNECTIONS)); +#endif break; // browse menu case IDC_NETWORK: +#ifdef _ROS_ // to be removed when network will be implemented + MessageBox(0, TEXT("network not yet implemented"), ResString(IDS_TITLE), MB_OK); +#else CreateSubmenu(id, CSIDL_NETWORK, ResString(IDS_NETWORK)); +#endif break; case IDC_DRIVES: @@ -1723,8 +1735,13 @@ void SettingsMenu::AddEntries() #endif AddButton(ResString(IDS_CONTROL_PANEL), ICID_CONFIG, false, IDC_CONTROL_PANEL); +#ifdef _ROS_ // to be removed when printer/network will be implemented + AddButton(ResString(IDS_PRINTERS), ICID_PRINTER, false, IDC_PRINTERS); + AddButton(ResString(IDS_CONNECTIONS), ICID_NETWORK, false, IDC_CONNECTIONS); +#else AddButton(ResString(IDS_PRINTERS), ICID_PRINTER, true, IDC_PRINTERS); AddButton(ResString(IDS_CONNECTIONS), ICID_NETWORK, true, IDC_CONNECTIONS); +#endif AddButton(ResString(IDS_ADMIN), ICID_CONFIG, true, IDC_ADMIN); #ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003) @@ -1742,7 +1759,11 @@ void BrowseMenu::AddEntries() #ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003) if (!g_Globals._SHRestricted || !SHRestricted(REST_NONETHOOD)) // or REST_NOENTIRENETWORK ? #endif +#ifdef _ROS_ // to be removed when printer/network will be implemented + AddButton(ResString(IDS_NETWORK), ICID_NETWORK, false, IDC_NETWORK); +#else AddButton(ResString(IDS_NETWORK), ICID_NETWORK, true, IDC_NETWORK); +#endif AddButton(ResString(IDS_DRIVES), ICID_FOLDER, true, IDC_DRIVES); } From 2d6b7b125584a0762f066677b1da8b7b4bcd5aeb Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sun, 22 Feb 2004 14:09:51 +0000 Subject: [PATCH 0125/1463] minor fix svn path=/trunk/; revision=8310 --- reactos/subsys/win32k/ntuser/prop.c | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/prop.c b/reactos/subsys/win32k/ntuser/prop.c index fc2159beb35..480f2386dce 100644 --- a/reactos/subsys/win32k/ntuser/prop.c +++ b/reactos/subsys/win32k/ntuser/prop.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: prop.c,v 1.7 2004/02/19 21:12:09 weiden Exp $ +/* $Id: prop.c,v 1.8 2004/02/22 14:09:51 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -185,11 +185,8 @@ NtUserGetProp(HWND hWnd, ATOM Atom) PPROPERTY Prop; HANDLE Data = NULL; - IntAcquireWinLockShared(); - if (!(WindowObject = IntGetWindowObject(hWnd))) { - IntReleaseWinLock(); SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return FALSE; } @@ -201,8 +198,6 @@ NtUserGetProp(HWND hWnd, ATOM Atom) { Data = Prop->Data; } - - IntReleaseWinLock(); return(Data); } @@ -237,11 +232,8 @@ NtUserSetProp(HWND hWnd, ATOM Atom, HANDLE Data) PWINDOW_OBJECT Wnd; BOOL ret; - IntAcquireWinLockExclusive(); - if (!(Wnd = IntGetWindowObject(hWnd))) { - IntReleaseWinLock(); SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return FALSE; } @@ -250,7 +242,6 @@ NtUserSetProp(HWND hWnd, ATOM Atom, HANDLE Data) ret = IntSetProp(Wnd, Atom, Data); ExReleaseFastMutexUnsafe(&Wnd->PropListLock); - IntReleaseWinLock(); return ret; } From a1eebee733c3b9de9f8697c050adcb2e140643f3 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Sun, 22 Feb 2004 14:26:07 +0000 Subject: [PATCH 0126/1463] Minor cleanup. Implement RegRestoreKeyW(). svn path=/trunk/; revision=8311 --- reactos/lib/advapi32/reg/reg.c | 533 ++++++++++++++++++++------------- 1 file changed, 325 insertions(+), 208 deletions(-) diff --git a/reactos/lib/advapi32/reg/reg.c b/reactos/lib/advapi32/reg/reg.c index 9db226ea6c3..277c8cca6e0 100644 --- a/reactos/lib/advapi32/reg/reg.c +++ b/reactos/lib/advapi32/reg/reg.c @@ -1,4 +1,4 @@ -/* $Id: reg.c,v 1.42 2003/12/29 23:04:55 gvg Exp $ +/* $Id: reg.c,v 1.43 2004/02/22 14:26:07 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -393,15 +393,15 @@ RegCreateKeyExA (HKEY hKey, * @implemented */ LONG STDCALL -RegCreateKeyExW(HKEY hKey, - LPCWSTR lpSubKey, - DWORD Reserved, - LPWSTR lpClass, - DWORD dwOptions, - REGSAM samDesired, - LPSECURITY_ATTRIBUTES lpSecurityAttributes, - PHKEY phkResult, - LPDWORD lpdwDisposition) +RegCreateKeyExW (HKEY hKey, + LPCWSTR lpSubKey, + DWORD Reserved, + LPWSTR lpClass, + DWORD dwOptions, + REGSAM samDesired, + LPSECURITY_ATTRIBUTES lpSecurityAttributes, + PHKEY phkResult, + LPDWORD lpdwDisposition) { UNICODE_STRING SubKeyString; UNICODE_STRING ClassString; @@ -774,6 +774,7 @@ RegEnumKeyExA (HKEY hKey, SetLastError (ERROR_INVALID_PARAMETER); return ERROR_INVALID_PARAMETER; } + Status = MapDefaultKey(&KeyHandle, hKey); if (!NT_SUCCESS(Status)) @@ -791,16 +792,18 @@ RegEnumKeyExA (HKEY hKey, { NameLength = 0; } + if (lpClass) { if (*lpcbClass > 0) - { - ClassLength = min (*lpcbClass -1, REG_MAX_NAME_SIZE) * sizeof(WCHAR); + { + ClassLength = min (*lpcbClass -1, REG_MAX_NAME_SIZE) * sizeof(WCHAR); } else - { + { ClassLength = 0; } + /* The class name should start at a dword boundary */ BufferSize = ((sizeof(KEY_NODE_INFORMATION) + NameLength + 3) & ~3) + ClassLength; } @@ -808,11 +811,10 @@ RegEnumKeyExA (HKEY hKey, { BufferSize = sizeof(KEY_BASIC_INFORMATION) + NameLength; } - + KeyInfo = RtlAllocateHeap (ProcessHeap, 0, BufferSize); - if (KeyInfo == NULL) { SetLastError (ERROR_OUTOFMEMORY); @@ -833,7 +835,7 @@ RegEnumKeyExA (HKEY hKey, else { if (lpClass == NULL) - { + { if (KeyInfo->Basic.NameLength > NameLength) { ErrorCode = ERROR_BUFFER_OVERFLOW; @@ -846,7 +848,7 @@ RegEnumKeyExA (HKEY hKey, } } else - { + { if (KeyInfo->Node.NameLength > NameLength || KeyInfo->Node.ClassLength > ClassLength) { @@ -854,13 +856,13 @@ RegEnumKeyExA (HKEY hKey, } else { - StringA.Buffer = lpClass; + StringA.Buffer = lpClass; StringA.Length = 0; StringA.MaximumLength = *lpcbClass; StringU.Buffer = (PWCHAR)((ULONG_PTR)KeyInfo->Node.Name + KeyInfo->Node.ClassOffset); StringU.Length = KeyInfo->Node.ClassLength; StringU.MaximumLength = KeyInfo->Node.ClassLength; - RtlUnicodeStringToAnsiString (&StringA, &StringU, FALSE); + RtlUnicodeStringToAnsiString (&StringA, &StringU, FALSE); lpClass[StringA.Length] = 0; *lpcbClass = StringA.Length; StringU.Buffer = KeyInfo->Node.Name; @@ -868,26 +870,27 @@ RegEnumKeyExA (HKEY hKey, StringU.MaximumLength = KeyInfo->Node.NameLength; } } + if (ErrorCode == ERROR_SUCCESS) - { - StringA.Buffer = lpName; + { + StringA.Buffer = lpName; StringA.Length = 0; StringA.MaximumLength = *lpcbName; - RtlUnicodeStringToAnsiString (&StringA, &StringU, FALSE); + RtlUnicodeStringToAnsiString (&StringA, &StringU, FALSE); lpName[StringA.Length] = 0; *lpcbName = StringA.Length; if (lpftLastWriteTime != NULL) { if (lpClass == NULL) - { - lpftLastWriteTime->dwLowDateTime = KeyInfo->Basic.LastWriteTime.u.LowPart; - lpftLastWriteTime->dwHighDateTime = KeyInfo->Basic.LastWriteTime.u.HighPart; - } + { + lpftLastWriteTime->dwLowDateTime = KeyInfo->Basic.LastWriteTime.u.LowPart; + lpftLastWriteTime->dwHighDateTime = KeyInfo->Basic.LastWriteTime.u.HighPart; + } else - { - lpftLastWriteTime->dwLowDateTime = KeyInfo->Node.LastWriteTime.u.LowPart; - lpftLastWriteTime->dwHighDateTime = KeyInfo->Node.LastWriteTime.u.HighPart; - } + { + lpftLastWriteTime->dwLowDateTime = KeyInfo->Node.LastWriteTime.u.LowPart; + lpftLastWriteTime->dwHighDateTime = KeyInfo->Node.LastWriteTime.u.HighPart; + } } } } @@ -947,6 +950,7 @@ RegEnumKeyExW (HKEY hKey, SetLastError (ErrorCode); return ErrorCode; } + if (*lpcbName > 0) { NameLength = min (*lpcbName - 1, REG_MAX_NAME_SIZE) * sizeof (WCHAR); @@ -955,22 +959,25 @@ RegEnumKeyExW (HKEY hKey, { NameLength = 0; } + if (lpClass) { if (*lpcbClass > 0) - { - ClassLength = min (*lpcbClass - 1, REG_MAX_NAME_SIZE) * sizeof(WCHAR); + { + ClassLength = min (*lpcbClass - 1, REG_MAX_NAME_SIZE) * sizeof(WCHAR); } else - { + { ClassLength = 0; } + BufferSize = ((sizeof(KEY_NODE_INFORMATION) + NameLength + 3) & ~3) + ClassLength; } else { BufferSize = sizeof(KEY_BASIC_INFORMATION) + NameLength; } + KeyInfo = RtlAllocateHeap (ProcessHeap, 0, BufferSize); @@ -994,7 +1001,7 @@ RegEnumKeyExW (HKEY hKey, else { if (lpClass == NULL) - { + { if (KeyInfo->Basic.NameLength > NameLength) { ErrorCode = ERROR_BUFFER_OVERFLOW; @@ -1009,7 +1016,7 @@ RegEnumKeyExW (HKEY hKey, } } else - { + { if (KeyInfo->Node.NameLength > NameLength || KeyInfo->Node.ClassLength > ClassLength) { @@ -1018,7 +1025,7 @@ RegEnumKeyExW (HKEY hKey, else { RtlCopyMemory (lpName, - KeyInfo->Node.Name, + KeyInfo->Node.Name, KeyInfo->Node.NameLength); *lpcbName = KeyInfo->Node.NameLength / sizeof(WCHAR); lpName[*lpcbName] = 0; @@ -1029,6 +1036,7 @@ RegEnumKeyExW (HKEY hKey, lpClass[*lpcbClass] = 0; } } + if (ErrorCode == ERROR_SUCCESS && lpftLastWriteTime != NULL) { if (lpClass == NULL) @@ -1052,6 +1060,7 @@ RegEnumKeyExW (HKEY hKey, { SetLastError(ErrorCode); } + return ErrorCode; } @@ -1107,6 +1116,7 @@ RegEnumValueA (HKEY hKey, { NameLength = 0; } + if (lpData) { DataLength = min (*lpcbData * sizeof(WCHAR), REG_MAX_DATA_SIZE); @@ -1118,7 +1128,7 @@ RegEnumValueA (HKEY hKey, } ValueInfo = RtlAllocateHeap (ProcessHeap, - 0, + 0, BufferSize); if (ValueInfo == NULL) { @@ -1142,8 +1152,8 @@ RegEnumValueA (HKEY hKey, { if (lpData) { - IsStringType = (ValueInfo->Full.Type == REG_SZ) || - (ValueInfo->Full.Type == REG_MULTI_SZ) || + IsStringType = (ValueInfo->Full.Type == REG_SZ) || + (ValueInfo->Full.Type == REG_MULTI_SZ) || (ValueInfo->Full.Type == REG_EXPAND_SZ); if (ValueInfo->Full.NameLength > NameLength || (!IsStringType && ValueInfo->Full.DataLength > *lpcbData) || @@ -1161,45 +1171,47 @@ RegEnumValueA (HKEY hKey, StringA.Buffer = (PCHAR)lpData; StringA.Length = 0; StringA.MaximumLength = *lpcbData; - RtlUnicodeStringToAnsiString (&StringA, - &StringU, - FALSE); - *lpcbData = StringA.Length; + RtlUnicodeStringToAnsiString (&StringA, + &StringU, + FALSE); + *lpcbData = StringA.Length; } else - { - RtlCopyMemory(lpData, - (PVOID)((ULONG_PTR)ValueInfo + ValueInfo->Full.DataOffset), - ValueInfo->Full.DataLength); + { + RtlCopyMemory (lpData, + (PVOID)((ULONG_PTR)ValueInfo + ValueInfo->Full.DataOffset), + ValueInfo->Full.DataLength); *lpcbData = ValueInfo->Full.DataLength; } - StringU.Buffer = ValueInfo->Full.Name; + + StringU.Buffer = ValueInfo->Full.Name; StringU.Length = ValueInfo->Full.NameLength; StringU.MaximumLength = NameLength; } } else - { + { if (ValueInfo->Basic.NameLength > NameLength) { ErrorCode = ERROR_BUFFER_OVERFLOW; } else { - StringU.Buffer = ValueInfo->Basic.Name; + StringU.Buffer = ValueInfo->Basic.Name; StringU.Length = ValueInfo->Basic.NameLength; StringU.MaximumLength = NameLength; } } + if (ErrorCode == ERROR_SUCCESS) { StringA.Buffer = (PCHAR)lpValueName; StringA.Length = 0; StringA.MaximumLength = *lpcbValueName; RtlUnicodeStringToAnsiString (&StringA, - &StringU, + &StringU, FALSE); - StringA.Buffer[StringA.Length] = 0; + StringA.Buffer[StringA.Length] = 0; *lpcbValueName = StringA.Length; if (lpType) { @@ -1207,13 +1219,15 @@ RegEnumValueA (HKEY hKey, } } } + RtlFreeHeap (ProcessHeap, - 0, + 0, ValueInfo); if (ErrorCode != ERROR_SUCCESS) { SetLastError(ErrorCode); } + return ErrorCode; } @@ -1246,7 +1260,7 @@ RegEnumValueW (HKEY hKey, HKEY KeyHandle; LONG ErrorCode; NTSTATUS Status; - + ErrorCode = ERROR_SUCCESS; Status = MapDefaultKey (&KeyHandle, @@ -1257,7 +1271,7 @@ RegEnumValueW (HKEY hKey, SetLastError (ErrorCode); return ErrorCode; } - + if (*lpcbValueName > 0) { NameLength = min (*lpcbValueName - 1, REG_MAX_NAME_SIZE) * sizeof(WCHAR); @@ -1266,6 +1280,7 @@ RegEnumValueW (HKEY hKey, { NameLength = 0; } + if (lpData) { DataLength = min(*lpcbData, REG_MAX_DATA_SIZE); @@ -1298,13 +1313,13 @@ RegEnumValueW (HKEY hKey, else { if (lpData) - { - if (ValueInfo->Full.DataLength > DataLength || + { + if (ValueInfo->Full.DataLength > DataLength || ValueInfo->Full.NameLength > NameLength) - { + { ErrorCode = ERROR_BUFFER_OVERFLOW; } - else + else { RtlCopyMemory (lpValueName, ValueInfo->Full.Name, @@ -1318,7 +1333,7 @@ RegEnumValueW (HKEY hKey, } } else - { + { if (ValueInfo->Basic.NameLength > NameLength) { ErrorCode = ERROR_BUFFER_OVERFLOW; @@ -1332,18 +1347,22 @@ RegEnumValueW (HKEY hKey, lpValueName[*lpcbValueName] = 0; } } + if (ErrorCode == ERROR_SUCCESS && lpType != NULL) { *lpType = lpData ? ValueInfo->Full.Type : ValueInfo->Basic.Type; } } + RtlFreeHeap (ProcessHeap, 0, ValueInfo); + if (ErrorCode != ERROR_SUCCESS) { - SetLastError(ErrorCode); + SetLastError (ErrorCode); } + return ErrorCode; } @@ -1445,7 +1464,7 @@ RegLoadKeyA (HKEY hKey, { UNICODE_STRING FileName; UNICODE_STRING KeyName; - DWORD ErrorCode; + LONG ErrorCode; RtlCreateUnicodeStringFromAsciiz (&KeyName, (LPSTR)lpSubKey); @@ -1478,7 +1497,7 @@ RegLoadKeyW (HKEY hKey, UNICODE_STRING FileName; UNICODE_STRING KeyName; HANDLE KeyHandle; - DWORD ErrorCode; + LONG ErrorCode; NTSTATUS Status; if (hKey == HKEY_PERFORMANCE_DATA) @@ -1898,13 +1917,14 @@ RegQueryInfoKeyW (HKEY hKey, if (lpClass != NULL) { if (*lpcbClass > 0) - { - ClassLength = min(*lpcbClass - 1, REG_MAX_NAME_SIZE) * sizeof(WCHAR); + { + ClassLength = min(*lpcbClass - 1, REG_MAX_NAME_SIZE) * sizeof(WCHAR); } else - { + { ClassLength = 0; } + FullInfoSize = sizeof(KEY_FULL_INFORMATION) + ((ClassLength + 3) & ~3); FullInfo = RtlAllocateHeap (ProcessHeap, 0, @@ -1914,6 +1934,7 @@ RegQueryInfoKeyW (HKEY hKey, SetLastError (ERROR_OUTOFMEMORY); return ERROR_OUTOFMEMORY; } + FullInfo->ClassLength = ClassLength; } else @@ -1932,83 +1953,89 @@ RegQueryInfoKeyW (HKEY hKey, DPRINT("NtQueryKey() returned status 0x%X\n", Status); if (!NT_SUCCESS(Status)) { - ErrorCode = RtlNtStatusToDosError (Status); - } - else - { - DPRINT("SubKeys %d\n", FullInfo->SubKeys); - if (lpcSubKeys != NULL) - { - *lpcSubKeys = FullInfo->SubKeys; - } - - DPRINT("MaxNameLen %lu\n", FullInfo->MaxNameLen); - if (lpcbMaxSubKeyLen != NULL) - { - *lpcbMaxSubKeyLen = FullInfo->MaxNameLen / sizeof(WCHAR) + 1; - } - - DPRINT("MaxClassLen %lu\n", FullInfo->MaxClassLen); - if (lpcbMaxClassLen != NULL) - { - *lpcbMaxClassLen = FullInfo->MaxClassLen / sizeof(WCHAR) + 1; - } - - DPRINT("Values %lu\n", FullInfo->Values); - if (lpcValues) - { - *lpcValues = FullInfo->Values; - } - - DPRINT("MaxValueNameLen %lu\n", FullInfo->MaxValueNameLen); - if (lpcbMaxValueNameLen) - { - *lpcbMaxValueNameLen = FullInfo->MaxValueNameLen / sizeof(WCHAR) + 1; - } - - DPRINT("MaxValueDataLen %lu\n", FullInfo->MaxValueDataLen); - if (lpcbMaxValueLen) - { - *lpcbMaxValueLen = FullInfo->MaxValueDataLen; - } - - if (lpcbSecurityDescriptor) - { - *lpcbSecurityDescriptor = 0; - /* FIXME */ - } - - if (lpftLastWriteTime != NULL) - { - lpftLastWriteTime->dwLowDateTime = FullInfo->LastWriteTime.u.LowPart; - lpftLastWriteTime->dwHighDateTime = FullInfo->LastWriteTime.u.HighPart; - } - if (lpClass != NULL) - { - if (FullInfo->ClassLength > ClassLength) - { - ErrorCode = ERROR_BUFFER_OVERFLOW; - } - else - { - RtlCopyMemory (lpClass, - FullInfo->Class, - FullInfo->ClassLength); - *lpcbClass = FullInfo->ClassLength / sizeof(WCHAR); - lpClass[*lpcbClass] = 0; - } + { + RtlFreeHeap (ProcessHeap, + 0, + FullInfo); } + + ErrorCode = RtlNtStatusToDosError (Status); + SetLastError (ErrorCode); + return ErrorCode; } + + DPRINT("SubKeys %d\n", FullInfo->SubKeys); + if (lpcSubKeys != NULL) + { + *lpcSubKeys = FullInfo->SubKeys; + } + + DPRINT("MaxNameLen %lu\n", FullInfo->MaxNameLen); + if (lpcbMaxSubKeyLen != NULL) + { + *lpcbMaxSubKeyLen = FullInfo->MaxNameLen / sizeof(WCHAR) + 1; + } + + DPRINT("MaxClassLen %lu\n", FullInfo->MaxClassLen); + if (lpcbMaxClassLen != NULL) + { + *lpcbMaxClassLen = FullInfo->MaxClassLen / sizeof(WCHAR) + 1; + } + + DPRINT("Values %lu\n", FullInfo->Values); + if (lpcValues != NULL) + { + *lpcValues = FullInfo->Values; + } + + DPRINT("MaxValueNameLen %lu\n", FullInfo->MaxValueNameLen); + if (lpcbMaxValueNameLen != NULL) + { + *lpcbMaxValueNameLen = FullInfo->MaxValueNameLen / sizeof(WCHAR) + 1; + } + + DPRINT("MaxValueDataLen %lu\n", FullInfo->MaxValueDataLen); + if (lpcbMaxValueLen != NULL) + { + *lpcbMaxValueLen = FullInfo->MaxValueDataLen; + } + + if (lpcbSecurityDescriptor != NULL) + { + /* FIXME */ + *lpcbSecurityDescriptor = 0; + } + + if (lpftLastWriteTime != NULL) + { + lpftLastWriteTime->dwLowDateTime = FullInfo->LastWriteTime.u.LowPart; + lpftLastWriteTime->dwHighDateTime = FullInfo->LastWriteTime.u.HighPart; + } + if (lpClass != NULL) { + if (FullInfo->ClassLength > ClassLength) + { + ErrorCode = ERROR_BUFFER_OVERFLOW; + } + else + { + RtlCopyMemory (lpClass, + FullInfo->Class, + FullInfo->ClassLength); + *lpcbClass = FullInfo->ClassLength / sizeof(WCHAR); + lpClass[*lpcbClass] = 0; + } + RtlFreeHeap (ProcessHeap, - 0, + 0, FullInfo); } + if (ErrorCode != ERROR_SUCCESS) { - SetLastError(ErrorCode); + SetLastError (ErrorCode); } return ErrorCode; @@ -2047,32 +2074,42 @@ RegQueryMultipleValuesW (HKEY hKey, { ULONG i; DWORD maxBytes = *ldwTotsize; - HRESULT status; LPSTR bufptr = (LPSTR)lpValueBuf; + LONG ErrorCode; - if ( maxBytes >= (1024*1024) ) + if (maxBytes >= (1024*1024)) return ERROR_TRANSFER_TOO_LONG; *ldwTotsize = 0; - //TRACE("(%p,%p,%ld,%p,%p=%ld)\n", hKey, val_list, num_vals, lpValueBuf, ldwTotsize, *ldwTotsize); + DPRINT ("RegQueryMultipleValuesW(%p,%p,%ld,%p,%p=%ld)\n", + hKey, val_list, num_vals, lpValueBuf, ldwTotsize, *ldwTotsize); - for(i=0; i < num_vals; ++i) + for (i = 0; i < num_vals; ++i) { - val_list[i].ve_valuelen=0; - status = RegQueryValueExW(hKey, val_list[i].ve_valuename, NULL, NULL, NULL, &val_list[i].ve_valuelen); - if(status != ERROR_SUCCESS) + val_list[i].ve_valuelen = 0; + ErrorCode = RegQueryValueExW (hKey, + val_list[i].ve_valuename, + NULL, + NULL, + NULL, + &val_list[i].ve_valuelen); + if(ErrorCode != ERROR_SUCCESS) { - return status; + return ErrorCode; } if(lpValueBuf != NULL && *ldwTotsize + val_list[i].ve_valuelen <= maxBytes) { - status = RegQueryValueExW(hKey, val_list[i].ve_valuename, NULL, &val_list[i].ve_type, - bufptr, &val_list[i].ve_valuelen); - if(status != ERROR_SUCCESS) + ErrorCode = RegQueryValueExW (hKey, + val_list[i].ve_valuename, + NULL, + &val_list[i].ve_type, + bufptr, + &val_list[i].ve_valuelen); + if (ErrorCode != ERROR_SUCCESS) { - return status; + return ErrorCode; } val_list[i].ve_valueptr = (DWORD_PTR)bufptr; @@ -2082,7 +2119,8 @@ RegQueryMultipleValuesW (HKEY hKey, *ldwTotsize += val_list[i].ve_valuelen; } - return lpValueBuf != NULL && *ldwTotsize <= maxBytes ? ERROR_SUCCESS : ERROR_MORE_DATA; + + return (lpValueBuf != NULL && *ldwTotsize <= maxBytes) ? ERROR_SUCCESS : ERROR_MORE_DATA; } @@ -2205,15 +2243,13 @@ RegQueryValueExW (HKEY hKey, * * @implemented */ -LONG -STDCALL -RegQueryValueExA( - HKEY hKey, - LPCSTR lpValueName, - LPDWORD lpReserved, - LPDWORD lpType, - LPBYTE lpData, - LPDWORD lpcbData) +LONG STDCALL +RegQueryValueExA (HKEY hKey, + LPCSTR lpValueName, + LPDWORD lpReserved, + LPDWORD lpType, + LPBYTE lpData, + LPDWORD lpcbData) { UNICODE_STRING ValueName; UNICODE_STRING ValueData; @@ -2232,10 +2268,9 @@ RegQueryValueExA( { ValueData.Length = *lpcbData * sizeof(WCHAR); ValueData.MaximumLength = ValueData.Length + sizeof(WCHAR); - ValueData.Buffer = RtlAllocateHeap( - ProcessHeap, - 0, - ValueData.MaximumLength); + ValueData.Buffer = RtlAllocateHeap (ProcessHeap, + 0, + ValueData.MaximumLength); if (!ValueData.Buffer) { SetLastError(ERROR_OUTOFMEMORY); @@ -2249,37 +2284,41 @@ RegQueryValueExA( ValueData.MaximumLength = 0; } - RtlCreateUnicodeStringFromAsciiz(&ValueName, (LPSTR)lpValueName); + RtlCreateUnicodeStringFromAsciiz (&ValueName, + (LPSTR)lpValueName); /* Convert length from USHORT to DWORD */ Length = ValueData.Length; - ErrorCode = RegQueryValueExW - (hKey, - ValueName.Buffer, - lpReserved, - &Type, - (LPBYTE)ValueData.Buffer, - &Length); - if (lpType) *lpType = Type; + ErrorCode = RegQueryValueExW (hKey, + ValueName.Buffer, + lpReserved, + &Type, + (LPBYTE)ValueData.Buffer, + &Length); + if (lpType != NULL) + *lpType = Type; + if ((ErrorCode == ERROR_SUCCESS) && (ValueData.Buffer != NULL)) { if ((Type == REG_SZ) || (Type == REG_MULTI_SZ) || (Type == REG_EXPAND_SZ)) - { - RtlInitAnsiString(&AnsiString, NULL); - AnsiString.Buffer = lpData; - AnsiString.MaximumLength = *lpcbData; + { + RtlInitAnsiString(&AnsiString, NULL); + AnsiString.Buffer = lpData; + AnsiString.MaximumLength = *lpcbData; ValueData.Length = Length; ValueData.MaximumLength = ValueData.Length + sizeof(WCHAR); - RtlUnicodeStringToAnsiString(&AnsiString, &ValueData, FALSE); - Length = Length / sizeof(WCHAR); - } else { - Length = min(*lpcbData, Length); - RtlMoveMemory(lpData, ValueData.Buffer, Length); - } + RtlUnicodeStringToAnsiString(&AnsiString, &ValueData, FALSE); + Length = Length / sizeof(WCHAR); + } + else + { + Length = min(*lpcbData, Length); + RtlMoveMemory(lpData, ValueData.Buffer, Length); + } } - if (NULL != lpcbData) - { + if (lpcbData != NULL) + { *lpcbData = Length; } @@ -2460,19 +2499,28 @@ RegReplaceKeyA (HKEY hKey, LPCSTR lpNewFile, LPCSTR lpOldFile) { - UNICODE_STRING lpSubKeyW; - UNICODE_STRING lpNewFileW; - UNICODE_STRING lpOldFileW; - LONG ret; + UNICODE_STRING SubKey; + UNICODE_STRING NewFile; + UNICODE_STRING OldFile; + LONG ErrorCode; - RtlCreateUnicodeStringFromAsciiz( &lpSubKeyW, (PCSZ)lpSubKey ); - RtlCreateUnicodeStringFromAsciiz( &lpOldFileW, (PCSZ)lpOldFile ); - RtlCreateUnicodeStringFromAsciiz( &lpNewFileW, (PCSZ)lpNewFile ); - ret = RegReplaceKeyW( hKey, lpSubKeyW.Buffer, lpNewFileW.Buffer, lpOldFileW.Buffer ); - RtlFreeUnicodeString( &lpOldFileW ); - RtlFreeUnicodeString( &lpNewFileW ); - RtlFreeUnicodeString( &lpSubKeyW ); - return ret; + RtlCreateUnicodeStringFromAsciiz (&SubKey, + (PCSZ)lpSubKey); + RtlCreateUnicodeStringFromAsciiz (&OldFile, + (PCSZ)lpOldFile); + RtlCreateUnicodeStringFromAsciiz (&NewFile, + (PCSZ)lpNewFile); + + ErrorCode = RegReplaceKeyW (hKey, + SubKey.Buffer, + NewFile.Buffer, + OldFile.Buffer); + + RtlFreeUnicodeString (&OldFile); + RtlFreeUnicodeString (&NewFile); + RtlFreeUnicodeString (&SubKey); + + return ErrorCode; } @@ -2503,29 +2551,95 @@ RegRestoreKeyA (HKEY hKey, LPCSTR lpFile, DWORD dwFlags) { - UNICODE_STRING lpFileW; - LONG ret; + UNICODE_STRING FileName; + LONG ErrorCode; - RtlCreateUnicodeStringFromAsciiz( &lpFileW, (PCSZ)lpFile ); - ret = RegRestoreKeyW( hKey, lpFileW.Buffer, dwFlags ); - RtlFreeUnicodeString( &lpFileW ); - return ret; + RtlCreateUnicodeStringFromAsciiz (&FileName, + (PCSZ)lpFile); + + ErrorCode = RegRestoreKeyW (hKey, + FileName.Buffer, + dwFlags); + + RtlFreeUnicodeString (&FileName); + + return ErrorCode; } /************************************************************************ * RegRestoreKeyW * - * @unimplemented + * @implemented */ LONG STDCALL RegRestoreKeyW (HKEY hKey, LPCWSTR lpFile, DWORD dwFlags) { - UNIMPLEMENTED; - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return ERROR_CALL_NOT_IMPLEMENTED; + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK IoStatusBlock; + UNICODE_STRING FileName; + HANDLE FileHandle; + HANDLE KeyHandle; + LONG ErrorCode; + NTSTATUS Status; + + if (hKey == HKEY_PERFORMANCE_DATA) + { + return ERROR_INVALID_HANDLE; + } + + Status = MapDefaultKey (&KeyHandle, + hKey); + if (!NT_SUCCESS(Status)) + { + ErrorCode = RtlNtStatusToDosError (Status); + SetLastError (ErrorCode); + return ErrorCode; + } + + if (!RtlDosPathNameToNtPathName_U ((LPWSTR)lpFile, + &FileName, + NULL, + NULL)) + { + SetLastError (ERROR_INVALID_PARAMETER); + return ERROR_INVALID_PARAMETER; + } + + InitializeObjectAttributes (&ObjectAttributes, + &FileName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + Status = NtOpenFile (&FileHandle, + FILE_GENERIC_READ, + &ObjectAttributes, + &IoStatusBlock, + FILE_SHARE_READ, + FILE_SYNCHRONOUS_IO_NONALERT); + RtlFreeUnicodeString (&FileName); + if (!NT_SUCCESS(Status)) + { + ErrorCode = RtlNtStatusToDosError (Status); + SetLastError (ErrorCode); + return ErrorCode; + } + + Status = NtRestoreKey (KeyHandle, + FileHandle, + (ULONG)dwFlags); + NtClose (FileHandle); + if (!NT_SUCCESS(Status)) + { + ErrorCode = RtlNtStatusToDosError (Status); + SetLastError (ErrorCode); + return ErrorCode; + } + + return ERROR_SUCCESS; } @@ -2565,7 +2679,7 @@ RegSaveKeyW (HKEY hKey, { PSECURITY_DESCRIPTOR SecurityDescriptor = NULL; OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING NtName; + UNICODE_STRING FileName; IO_STATUS_BLOCK IoStatusBlock; HANDLE FileHandle; HKEY KeyHandle; @@ -2582,7 +2696,7 @@ RegSaveKeyW (HKEY hKey, } if (!RtlDosPathNameToNtPathName_U ((LPWSTR)lpFile, - &NtName, + &FileName, NULL, NULL)) { @@ -2596,7 +2710,7 @@ RegSaveKeyW (HKEY hKey, } InitializeObjectAttributes (&ObjectAttributes, - &NtName, + &FileName, OBJ_CASE_INSENSITIVE, NULL, SecurityDescriptor); @@ -2611,7 +2725,7 @@ RegSaveKeyW (HKEY hKey, FILE_OPEN_FOR_BACKUP_INTENT | FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); - RtlFreeUnicodeString (&NtName); + RtlFreeUnicodeString (&FileName); if (!NT_SUCCESS(Status)) { ErrorCode = RtlNtStatusToDosError (Status); @@ -2644,11 +2758,13 @@ RegSetKeySecurity (HKEY hKey, PSECURITY_DESCRIPTOR pSecurityDescriptor) { HKEY KeyHandle; - NTSTATUS Status; LONG ErrorCode; + NTSTATUS Status; if (hKey == HKEY_PERFORMANCE_DATA) - return ERROR_INVALID_HANDLE; + { + return ERROR_INVALID_HANDLE; + } Status = MapDefaultKey (&KeyHandle, hKey); @@ -2866,6 +2982,7 @@ RegSetValueA (HKEY hKey, dwType, Data.Buffer, DataSize); + RtlFreeHeap (ProcessHeap, 0, Data.Buffer); From 1dc0c104917b697896ea267890a8ccf5619a1c77 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 22 Feb 2004 14:26:35 +0000 Subject: [PATCH 0127/1463] - Fixed couple of mutex locking issues. - Removed IntInitDesktopWindow function, because it's no longer used. svn path=/trunk/; revision=8312 --- reactos/subsys/win32k/ntuser/window.c | 40 +++++++++------------------ reactos/subsys/win32k/ntuser/winpos.c | 40 +++++++++++++++------------ 2 files changed, 35 insertions(+), 45 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index e48e37dc7d3..e7de44636b3 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.187 2004/02/21 14:00:30 navaraf Exp $ +/* $Id: window.c,v 1.188 2004/02/22 14:26:35 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -410,11 +410,12 @@ static LRESULT IntDestroyWindow(PWINDOW_OBJECT Window, CLASS_RemoveWindow(Window->Class); #endif - if(Window->Parent) + if (Window->Parent) { - ExAcquireFastMutexUnsafe(&Window->Parent->ChildrenListLock); + PWINDOW_OBJECT Parent = Window->Parent; + ExAcquireFastMutexUnsafe(&Parent->ChildrenListLock); IntUnlinkWindow(Window); - ExReleaseFastMutexUnsafe(&Window->Parent->ChildrenListLock); + ExReleaseFastMutexUnsafe(&Parent->ChildrenListLock); } ExAcquireFastMutexUnsafe (&ThreadData->WindowListLock); @@ -670,27 +671,6 @@ IntGetWindowThreadProcessId(PWINDOW_OBJECT Wnd, PDWORD pid) return (DWORD) Wnd->OwnerThread->Cid.UniqueThread; } -VOID FASTCALL -IntInitDesktopWindow(ULONG Width, ULONG Height) -{ - PWINDOW_OBJECT DesktopWindow; - - DesktopWindow = IntGetWindowObject(PsGetWin32Thread()->Desktop->DesktopWindow); - if (NULL == DesktopWindow) - { - return; - } - DesktopWindow->WindowRect.left = 0; - DesktopWindow->WindowRect.top = 0; - DesktopWindow->WindowRect.right = Width; - DesktopWindow->WindowRect.bottom = Height; - DesktopWindow->ClientRect = DesktopWindow->WindowRect; - - IntRedrawWindow(DesktopWindow, NULL, 0, RDW_INVALIDATE | RDW_ERASE); - IntReleaseWindowObject(DesktopWindow); -} - - BOOL FASTCALL IntIsChildWindow(HWND Parent, HWND Child) { @@ -709,7 +689,6 @@ IntIsChildWindow(HWND Parent, HWND Child) return(FALSE); } - BOOL FASTCALL IntIsWindowVisible(HWND Wnd) { @@ -813,8 +792,12 @@ IntSetParent(PWINDOW_OBJECT Wnd, PWINDOW_OBJECT WndNewParent) if (WndNewParent != WndOldParent) { + ExAcquireFastMutexUnsafe(&WndOldParent->ChildrenListLock); IntUnlinkWindow(Wnd); + ExReleaseFastMutexUnsafe(&WndOldParent->ChildrenListLock); + ExAcquireFastMutexUnsafe(&WndNewParent->ChildrenListLock); IntLinkWindow(Wnd, WndNewParent, NULL /*prev sibling*/); + ExReleaseFastMutexUnsafe(&WndNewParent->ChildrenListLock); if (WndNewParent->Self != IntGetDesktopWindow()) /* a child window */ { @@ -1609,7 +1592,7 @@ NtUserDeferWindowPos(HDWP WinPosInfo, BOOLEAN STDCALL NtUserDestroyWindow(HWND Wnd) { - PWINDOW_OBJECT Window; + PWINDOW_OBJECT Window, Parent; BOOLEAN isChild; Window = IntGetWindowObject(Wnd); @@ -1736,7 +1719,10 @@ NtUserDestroyWindow(HWND Wnd) } /* Unlink now so we won't bother with the children later on */ + Parent = Window->Parent; + ExAcquireFastMutexUnsafe(&Parent->ChildrenListLock); IntUnlinkWindow(Window); + ExReleaseFastMutexUnsafe(&Parent->ChildrenListLock); /* Destroy the window storage */ IntDestroyWindow(Window, PsGetWin32Process(), PsGetWin32Thread(), TRUE); diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index 49003f7b8b3..aa24ea7ca31 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.96 2004/02/21 13:57:31 navaraf Exp $ +/* $Id: winpos.c,v 1.97 2004/02/22 14:26:35 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -588,26 +588,30 @@ WinPosDoOwnedPopups(HWND hWnd, HWND hWndInsertAfter) VOID STATIC FASTCALL WinPosInternalMoveWindow(PWINDOW_OBJECT Window, INT MoveX, INT MoveY) { - PWINDOW_OBJECT Child; + HWND *Children; + UINT Count; - Window->WindowRect.left += MoveX; - Window->WindowRect.right += MoveX; - Window->WindowRect.top += MoveY; - Window->WindowRect.bottom += MoveY; + Window->WindowRect.left += MoveX; + Window->WindowRect.right += MoveX; + Window->WindowRect.top += MoveY; + Window->WindowRect.bottom += MoveY; - Window->ClientRect.left += MoveX; - Window->ClientRect.right += MoveX; - Window->ClientRect.top += MoveY; - Window->ClientRect.bottom += MoveY; + Window->ClientRect.left += MoveX; + Window->ClientRect.right += MoveX; + Window->ClientRect.top += MoveY; + Window->ClientRect.bottom += MoveY; - ExAcquireFastMutexUnsafe(&Window->ChildrenListLock); - Child = Window->FirstChild; - while (Child) - { - WinPosInternalMoveWindow(Child, MoveX, MoveY); - Child = Child->NextSibling; - } - ExReleaseFastMutexUnsafe(&Window->ChildrenListLock); + Children = IntWinListChildren(Window); + if (Children) + { + for (Count = 0; Children[Count] != NULL; Count++) + { + Window = IntGetWindowObject(Children[Count]); + WinPosInternalMoveWindow(Window, MoveX, MoveY); + IntReleaseWindowObject(Window); + } + ExFreePool(Children); + } } /* From b716aa0265d1212f3cbe9086697f4cc95bc8426a Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 22 Feb 2004 15:14:27 +0000 Subject: [PATCH 0128/1463] - Prevent double unlinking of window. svn path=/trunk/; revision=8313 --- reactos/subsys/win32k/ntuser/window.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index e7de44636b3..a6df96b5847 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.188 2004/02/22 14:26:35 navaraf Exp $ +/* $Id: window.c,v 1.189 2004/02/22 15:14:27 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -721,7 +721,7 @@ IntLinkWindow( PWINDOW_OBJECT WndPrevSibling /* set to NULL if top sibling */ ) { - Wnd->Parent = WndParent; + Wnd->Parent = WndParent; if ((Wnd->PrevSibling = WndPrevSibling)) { @@ -1722,6 +1722,7 @@ NtUserDestroyWindow(HWND Wnd) Parent = Window->Parent; ExAcquireFastMutexUnsafe(&Parent->ChildrenListLock); IntUnlinkWindow(Window); + Window->Parent = NULL; ExReleaseFastMutexUnsafe(&Parent->ChildrenListLock); /* Destroy the window storage */ From e8cc37fcecb36baca5619791e751bb362f0c7bae Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 22 Feb 2004 16:56:14 +0000 Subject: [PATCH 0129/1463] - Added some strange behaviour to VIS_ComputeVisibleRegion. - Draw windows from foreground to background in IntFindWindowToRepaint, because it causes problems otherwise. svn path=/trunk/; revision=8315 --- reactos/subsys/win32k/ntuser/painting.c | 4 ++-- reactos/subsys/win32k/ntuser/vis.c | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/painting.c b/reactos/subsys/win32k/ntuser/painting.c index b7738e6676c..cf5067c8334 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.71 2004/02/21 23:30:18 navaraf Exp $ + * $Id: painting.c,v 1.72 2004/02/22 16:56:14 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -560,7 +560,7 @@ IntFindWindowToRepaint(HWND hWnd, PW32THREAD Thread) } ExAcquireFastMutex(&Window->ChildrenListLock); - for (Child = Window->LastChild; Child; Child = Child->PrevSibling) + for (Child = Window->FirstChild; Child; Child = Child->NextSibling) { if (IntIsWindowDirty(Child) && IntWndBelongsToThread(Child, Thread)) diff --git a/reactos/subsys/win32k/ntuser/vis.c b/reactos/subsys/win32k/ntuser/vis.c index c2aa65d3e46..c5e600a2df2 100644 --- a/reactos/subsys/win32k/ntuser/vis.c +++ b/reactos/subsys/win32k/ntuser/vis.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: vis.c,v 1.18 2004/02/22 12:25:34 navaraf Exp $ + * $Id: vis.c,v 1.19 2004/02/22 16:56:14 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -82,7 +82,8 @@ VIS_ComputeVisibleRegion( NtGdiCombineRgn(VisRgn, VisRgn, ClipRgn, RGN_AND); NtGdiDeleteObject(ClipRgn); - if (ClipSiblings) + if ((CurrentWindow->Style & WS_CLIPSIBLINGS) || + (PreviousWindow == Window && ClipSiblings)) { ExAcquireFastMutexUnsafe(&CurrentWindow->ChildrenListLock); CurrentSibling = CurrentWindow->FirstChild; From af770309fccb55512f3b6effaf14b45b940f8a63 Mon Sep 17 00:00:00 2001 From: Casper Hornstrup <chorns@users.sourceforge.net> Date: Sun, 22 Feb 2004 17:30:33 +0000 Subject: [PATCH 0130/1463] 2004-02-22 Casper S. Hornstrup <chorns@users.sourceforge.net> * Makefile (all): Put REGTESTS dependency earlier in the list. * lib/kernel32/makefile: Support regression tests. * lib/kernel32/misc/dllmain.c: Prepare regression tests. * regtests/win32base/driver.c: (DummyThreadMain, RunPrivateTests): Add. (RegTestMain): Run private module regression tests. * tools/helper.mk: Add rtshared.a to MK_LIBS if building user-mode regression tests. * tools/regtests.c (UMSTUB): Add. (main): Output user-mode stub. * lib/kernel32/tests: New directory. * lib/kernel32/tests/.cvsignore: New file. * lib/kernel32/tests/Makefile: New file. * lib/kernel32/tests/tests: New directory. * lib/kernel32/tests/tests/.cvsignore: New file. * regtests/win32base/tests/file-1.c: move... * lib/kernel32/tests/tests/file-1.c: ...here. svn path=/trunk/; revision=8316 --- reactos/ChangeLog | 20 ++++++ reactos/Makefile | 6 +- reactos/lib/kernel32/makefile | 4 +- reactos/lib/kernel32/misc/dllmain.c | 18 ++++- reactos/lib/kernel32/tests/.cvsignore | 6 ++ reactos/lib/kernel32/tests/Makefile | 21 ++++++ reactos/lib/kernel32/tests/tests/.cvsignore | 2 + .../kernel32/tests}/tests/file-1.c | 0 reactos/regtests/win32base/driver.c | 65 +++++++++++++++++++ reactos/tools/helper.mk | 5 +- reactos/tools/regtests.c | 47 ++++++++++++-- 11 files changed, 183 insertions(+), 11 deletions(-) create mode 100644 reactos/lib/kernel32/tests/.cvsignore create mode 100644 reactos/lib/kernel32/tests/Makefile create mode 100644 reactos/lib/kernel32/tests/tests/.cvsignore rename reactos/{regtests/win32base => lib/kernel32/tests}/tests/file-1.c (100%) diff --git a/reactos/ChangeLog b/reactos/ChangeLog index 9c18b96f10c..d3b53bfe5fb 100644 --- a/reactos/ChangeLog +++ b/reactos/ChangeLog @@ -1,3 +1,23 @@ +2004-02-22 Casper S. Hornstrup <chorns@users.sourceforge.net> + + * Makefile (all): Put REGTESTS dependency earlier in the list. + * lib/kernel32/makefile: Support regression tests. + * lib/kernel32/misc/dllmain.c: Prepare regression tests. + * regtests/win32base/driver.c: (DummyThreadMain, + RunPrivateTests): Add. + (RegTestMain): Run private module regression tests. + * tools/helper.mk: Add rtshared.a to MK_LIBS if building + user-mode regression tests. + * tools/regtests.c (UMSTUB): Add. + (main): Output user-mode stub. + * lib/kernel32/tests: New directory. + * lib/kernel32/tests/.cvsignore: New file. + * lib/kernel32/tests/Makefile: New file. + * lib/kernel32/tests/tests: New directory. + * lib/kernel32/tests/tests/.cvsignore: New file. + * regtests/win32base/tests/file-1.c: move... + * lib/kernel32/tests/tests/file-1.c: ...here. + 2004-02-22 Casper S. Hornstrup <chorns@users.sourceforge.net> * config (REGRESSIONTESTS): Add. diff --git a/reactos/Makefile b/reactos/Makefile index 9b34cde46d7..446fd8d0ead 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.210 2004/02/07 18:53:58 mf Exp $ +# $Id: Makefile,v 1.211 2004/02/22 17:30:32 chorns Exp $ # # Global makefile # @@ -117,9 +117,9 @@ KERNEL_DRIVERS = $(DRIVERS_LIB) $(DEVICE_DRIVERS) $(INPUT_DRIVERS) $(FS_DRIVERS) # Regression tests REGTESTS = regtests -all: tools dk implib $(LIB_STATIC) $(COMPONENTS) $(HALS) $(BUS) $(LIB_FSLIB) $(DLLS) $(SUBSYS) \ +all: tools dk implib $(LIB_STATIC) $(COMPONENTS) $(REGTESTS) $(HALS) $(BUS) $(LIB_FSLIB) $(DLLS) $(SUBSYS) \ $(LOADERS) $(KERNEL_DRIVERS) $(SYS_APPS) $(SYS_SVC) \ - $(APPS) $(EXT_MODULES) $(REGTESTS) + $(APPS) $(EXT_MODULES) #config: $(TOOLS:%=%_config) diff --git a/reactos/lib/kernel32/makefile b/reactos/lib/kernel32/makefile index c7c83249b32..ebd99de263c 100644 --- a/reactos/lib/kernel32/makefile +++ b/reactos/lib/kernel32/makefile @@ -1,7 +1,9 @@ -# $Id: makefile,v 1.76 2004/02/15 07:03:55 arty Exp $ +# $Id: makefile,v 1.77 2004/02/22 17:30:32 chorns Exp $ PATH_TO_TOP = ../.. +TARGET_REGTESTS = yes + TARGET_TYPE = dynlink TARGET_NAME = kernel32 diff --git a/reactos/lib/kernel32/misc/dllmain.c b/reactos/lib/kernel32/misc/dllmain.c index ed954f03db9..0a9e5a0159d 100644 --- a/reactos/lib/kernel32/misc/dllmain.c +++ b/reactos/lib/kernel32/misc/dllmain.c @@ -1,4 +1,4 @@ -/* $Id: dllmain.c,v 1.33 2004/01/30 21:48:09 gvg Exp $ +/* $Id: dllmain.c,v 1.34 2004/02/22 17:30:32 chorns Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -11,6 +11,7 @@ /* INCLUDES ******************************************************************/ +#include <roscfg.h> #include <k32.h> #define NDEBUG @@ -83,14 +84,25 @@ DllMain(HANDLE hDll, (void)lpReserved; DPRINT("DllMain(hInst %lx, dwReason %lu)\n", - hInst, dwReason); + hDll, dwReason); switch (dwReason) { case DLL_PROCESS_ATTACH: DPRINT("DLL_PROCESS_ATTACH\n"); +#if !defined(REGTESTS) + /* + * When running regression tests, this module need to receive + * thread attach/detach notifications. This is needed because + * the module is already loaded when the regression test suite + * driver would load this module using LoadLibrary() so a + * DLL_PROCESS_ATTACH notification is not sent. The regression + * test suite driver sends thread notifications instead in this + * case. + */ LdrDisableThreadCalloutsForDll ((PVOID)hDll); +#endif /* * Connect to the csrss server @@ -170,6 +182,8 @@ DllMain(HANDLE hDll, break; } + PREPARE_TESTS + return TRUE; } diff --git a/reactos/lib/kernel32/tests/.cvsignore b/reactos/lib/kernel32/tests/.cvsignore new file mode 100644 index 00000000000..576b35ee7b0 --- /dev/null +++ b/reactos/lib/kernel32/tests/.cvsignore @@ -0,0 +1,6 @@ +_regtests.c +_rtstub.c +Makefile.tests +*.d +*.o +*.a diff --git a/reactos/lib/kernel32/tests/Makefile b/reactos/lib/kernel32/tests/Makefile new file mode 100644 index 00000000000..8f525c250bf --- /dev/null +++ b/reactos/lib/kernel32/tests/Makefile @@ -0,0 +1,21 @@ +# $Id: Makefile,v 1.1 2004/02/22 17:30:32 chorns Exp $ + +PATH_TO_TOP = ../../.. + +TARGET_TYPE = library + +TARGET_NAME = regtests + +TARGET_LIBPATH = . + +TARGET_CFLAGS = -I$(REGTESTS_PATH_INC) + +-include Makefile.tests + +TARGET_OBJECTS = \ + _regtests.o \ + $(addprefix tests/, $(TESTS)) + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk diff --git a/reactos/lib/kernel32/tests/tests/.cvsignore b/reactos/lib/kernel32/tests/tests/.cvsignore new file mode 100644 index 00000000000..31dc3078b3a --- /dev/null +++ b/reactos/lib/kernel32/tests/tests/.cvsignore @@ -0,0 +1,2 @@ +*.d +*.o diff --git a/reactos/regtests/win32base/tests/file-1.c b/reactos/lib/kernel32/tests/tests/file-1.c similarity index 100% rename from reactos/regtests/win32base/tests/file-1.c rename to reactos/lib/kernel32/tests/tests/file-1.c diff --git a/reactos/regtests/win32base/driver.c b/reactos/regtests/win32base/driver.c index 3c89a692cb0..7680e96f7d7 100755 --- a/reactos/regtests/win32base/driver.c +++ b/reactos/regtests/win32base/driver.c @@ -24,9 +24,74 @@ FreeMemory(PVOID Base) } +static DWORD WINAPI +DummyThreadMain(LPVOID lpParameter) +{ + return 0; +} + + +VOID +RunPrivateTests(LPTSTR FileName) +{ + HMODULE hModule; + HANDLE hEvent; + + hEvent = CreateEventA( + NULL, + FALSE, + FALSE, + "WinRegTests"); + if (hEvent == NULL) + { + return; + } + + hModule = GetModuleHandle(FileName); + if (hModule != NULL) + { + HANDLE hThread; + + /* + * The module is a core OS component that is already + * mapped into the current process. + * NOTE: This will cause all core OS components that are already mapped + * into the process to run their regression tests. + */ + hThread = CreateThread(NULL, 0, DummyThreadMain, NULL, 0, NULL); + if (hThread != NULL) + { + DWORD ErrorCode; + ErrorCode = WaitForSingleObject(hEvent, 5000); /* Wait up to 5 seconds */ + CloseHandle(hThread); + } + } + else + { + hModule = LoadLibrary(FileName); + if (hModule != NULL) + { + CloseHandle(hEvent); + FreeLibrary(hModule); + } + } + + CloseHandle(hEvent); +} + + VOID STDCALL RegTestMain() { + /* + * Private module regression tests in components already mapped + * (ntdll.dll, kernel32.dll, msvcrt.dll) + */ + RunPrivateTests(_T("ntdll.dll")); + + /* Other private module regression tests */ + + /* Cross-module regression tests */ InitializeTests(); RegisterTests(); PerformTests(); diff --git a/reactos/tools/helper.mk b/reactos/tools/helper.mk index 7e851cae5e7..dc61b053c2e 100644 --- a/reactos/tools/helper.mk +++ b/reactos/tools/helper.mk @@ -1,4 +1,4 @@ -# $Id: helper.mk,v 1.54 2004/02/22 09:59:17 chorns Exp $ +# $Id: helper.mk,v 1.55 2004/02/22 17:30:33 chorns Exp $ # # Helper makefile for ReactOS modules # Variables this makefile accepts: @@ -618,6 +618,9 @@ else endif ifeq ($(TARGET_REGTESTS),yes) +ifeq ($(MK_MODE),user) + MK_LIBS := $(SDK_PATH_LIB)/rtshared.a $(MK_LIBS) +endif MK_REGTESTS := gen_regtests MK_REGTESTS_CLEAN := clean_regtests MK_OBJECTS += tests/_rtstub.o tests/regtests.a diff --git a/reactos/tools/regtests.c b/reactos/tools/regtests.c index 667e22a27c0..2794393c1bf 100755 --- a/reactos/tools/regtests.c +++ b/reactos/tools/regtests.c @@ -442,6 +442,49 @@ static char KMSTUB[] = " RegisterTests();\n" "}\n"; +static char UMSTUB[] = + "/* This file is autogenerated. */\n" + "\n" + "#include <windows.h>\n" + "#define NTOS_MODE_USER\n" + "#include <ntos.h>\n" + "#include \"regtests.h\"\n" + "\n" + "PVOID\n" + "AllocateMemory(ULONG Size)\n" + "{\n" + " return (PVOID) RtlAllocateHeap(RtlGetProcessHeap(), 0, Size);\n" + "}\n" + "\n" + "VOID\n" + "FreeMemory(PVOID Base)\n" + "{\n" + " RtlFreeHeap(RtlGetProcessHeap(), 0, Base);\n" + "}\n" + "\n" + "/* This function will be called several times */\n" + "void PrepareTests()\n" + "{\n" + " static int testsRegistered = 0;\n" + " if (testsRegistered == 0)\n" + " {\n" + " HANDLE hEvent;\n" + " hEvent = OpenEventW(\n" + " EVENT_ALL_ACCESS,\n" + " FALSE,\n" + " L\"WinRegTests\");\n" + " if (hEvent != NULL)\n" + " {\n" + " SetEvent(hEvent);\n" + " CloseHandle(hEvent);\n" + " testsRegistered = 1;\n" + " InitializeTests();\n" + " RegisterTests();\n" + " PerformTests();\n" + " }\n" + " }\n" + "}\n"; + static char HELP[] = "REGTESTS path file makefile [-u umstubfile] [-k kmstubfile]\n" "\n" @@ -573,15 +616,11 @@ int main(int argc, char **argv) /* User-mode stubfile */ if (umstubfile != NULL) { -#if 0 if (write_file_if_changed(umstubfile, UMSTUB) != 0) { perror("Cannot create output user-mode stubfile"); return 1; } -#else - perror("WATNING: Cannot create output user-mode stubfile"); -#endif } /* Kernel-mode stubfile */ From dc9250b384b38f2601c91f486d062047f3bed31f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Sun, 22 Feb 2004 18:04:52 +0000 Subject: [PATCH 0131/1463] Implement keyboard navigation for menus svn path=/trunk/; revision=8317 --- reactos/ChangeLog | 4 + reactos/include/messages.h | 1 + reactos/include/structs.h | 6 + reactos/lib/user32/windows/menu.c | 931 +++++++++++++++++++++++----- reactos/subsys/win32k/ntuser/menu.c | 134 ++-- 5 files changed, 874 insertions(+), 202 deletions(-) diff --git a/reactos/ChangeLog b/reactos/ChangeLog index d3b53bfe5fb..b82d408a3db 100644 --- a/reactos/ChangeLog +++ b/reactos/ChangeLog @@ -1,3 +1,7 @@ +2004-02-22 Ge van Geldorp <ge@gse.nl> + + * Implement keyboard navigation for menus + 2004-02-22 Casper S. Hornstrup <chorns@users.sourceforge.net> * Makefile (all): Put REGTESTS dependency earlier in the list. diff --git a/reactos/include/messages.h b/reactos/include/messages.h index c799adda1bb..821693c0f0c 100644 --- a/reactos/include/messages.h +++ b/reactos/include/messages.h @@ -1054,6 +1054,7 @@ extern "C" { #define WM_NCXBUTTONUP (172) #define WM_NCXBUTTONDBLCLK (173) #define WM_NEXTDLGCTL (40) +#define WM_NEXTMENU (531) #define WM_NOTIFY (78) #define WM_NOTIFYFORMAT (85) #define WM_NULL (0) diff --git a/reactos/include/structs.h b/reactos/include/structs.h index ead9cab20e7..db33b5bdeb2 100644 --- a/reactos/include/structs.h +++ b/reactos/include/structs.h @@ -3136,6 +3136,12 @@ typedef struct tagMDICREATESTRUCTW { typedef_tident(MDICREATESTRUCT) typedef_tident(LPMDICREATESTRUCT) +typedef struct tagMDINEXTMENU { + HMENU hmenuIn; + HMENU hmenuNext; + HWND hwndNext; +} MDINEXTMENU,*PMDINEXTMENU,*LPMDINEXTMENU; + typedef struct tagMEASUREITEMSTRUCT { UINT CtlType; UINT CtlID; diff --git a/reactos/lib/user32/windows/menu.c b/reactos/lib/user32/windows/menu.c index 7b5eecfc316..9af3f8e64de 100644 --- a/reactos/lib/user32/windows/menu.c +++ b/reactos/lib/user32/windows/menu.c @@ -21,7 +21,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: menu.c,v 1.48 2004/02/15 07:39:12 gvg Exp $ +/* $Id: menu.c,v 1.49 2004/02/22 18:04:52 gvg Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/menu.c @@ -33,12 +33,15 @@ /* INCLUDES ******************************************************************/ +#define __NTAPP__ + #include <windows.h> #include <user32.h> #include <string.h> #include <draw.h> #include <window.h> #include <strpool.h> +#include <ntos/rtl.h> #include <user32/callback.h> #include "user32/regcontrol.h" @@ -331,6 +334,41 @@ MenuCleanupRosMenuItemInfo(PROSMENUITEMINFO ItemInfo) } } +/*********************************************************************** + * MenuGetAllRosMenuItemInfo + * + * Get full information about all menu items + */ +static INT FASTCALL +MenuGetAllRosMenuItemInfo(HMENU Menu, PROSMENUITEMINFO *ItemInfo) +{ + DWORD BufSize; + + BufSize = NtUserBuildMenuItemList(Menu, (VOID *) 1, 0, 0); + if (BufSize <= 0) + { + return -1; + } + *ItemInfo = HeapAlloc(GetProcessHeap(), 0, BufSize); + if (NULL == *ItemInfo) + { + return -1; + } + + return NtUserBuildMenuItemList(Menu, *ItemInfo, BufSize, 0); +} + +/*********************************************************************** + * MenuCleanupAllRosMenuItemInfo + * + * Cleanup after use of MenuGetAllRosMenuItemInfo + */ +static VOID FASTCALL +MenuCleanupAllRosMenuItemInfo(PROSMENUITEMINFO ItemInfo) +{ + HeapFree(GetProcessHeap(), 0, ItemInfo); +} + /*********************************************************************** * MenuDrawMenuItem * @@ -941,8 +979,8 @@ MenuInit(VOID) } -static BOOL -MeasureMenuItem(HWND hWnd, HMENU mnu, HDC hDC, MENUITEMINFOW *mii, RECT *mir, LPWSTR str) +static BOOL FASTCALL +MeasureMenuItem(HWND hWnd, HMENU mnu, HDC hDC, PROSMENUITEMINFO mii, LPWSTR str) { BOOL res = FALSE; MEASUREITEMSTRUCT mis; @@ -960,14 +998,14 @@ MeasureMenuItem(HWND hWnd, HMENU mnu, HDC hDC, MENUITEMINFOW *mii, RECT *mir, LP res = (BOOL)SendMessageW(hWnd, WM_MEASUREITEM, 0, (LPARAM)&mis); if(res) { - mir->right = mir->left + mis.itemWidth; - mir->bottom = mir->top + mis.itemHeight; + mii->Rect.right = mii->Rect.left + mis.itemWidth; + mii->Rect.bottom = mii->Rect.top + mis.itemHeight; } else { /* FIXME calculate size internally assuming the menu item is empty */ - mir->right = mir->left + 1; - mir->bottom = mir->top + 1; + mii->Rect.right = mii->Rect.left + 1; + mii->Rect.bottom = mii->Rect.top + 1; } return res; } @@ -975,14 +1013,14 @@ MeasureMenuItem(HWND hWnd, HMENU mnu, HDC hDC, MENUITEMINFOW *mii, RECT *mir, LP { GetTextExtentPoint32W(hDC, str, mii->cch, &sz); /* FIXME calculate the size of the menu item */ - mir->right = mir->left + sz.cx + 6; - mir->bottom = mir->top + max(sz.cy, GetSystemMetrics(SM_CYMENU)); + mii->Rect.right = mii->Rect.left + sz.cx + 6; + mii->Rect.bottom = mii->Rect.top + max(sz.cy, GetSystemMetrics(SM_CYMENU)); return TRUE; } } static BOOL -DrawMenuItem(HWND hWnd, HMENU mnu, HDC hDC, MENUITEMINFOW *mii, RECT *mir, LPWSTR str) +DrawMenuItem(HWND hWnd, HMENU mnu, HDC hDC, PROSMENUITEMINFO mii, LPWSTR str) { BOOL res = FALSE; DRAWITEMSTRUCT dis; @@ -997,7 +1035,7 @@ DrawMenuItem(HWND hWnd, HMENU mnu, HDC hDC, MENUITEMINFOW *mii, RECT *mir, LPWST dis.itemState = 0; /* FIXME */ dis.hwndItem = (HWND)mnu; dis.hDC = hDC; - RtlCopyMemory(&dis.rcItem, mir, sizeof(RECT)); + RtlCopyMemory(&dis.rcItem, &mii->Rect, sizeof(RECT)); dis.itemData = mii->dwItemData; res = (BOOL)SendMessageW(hWnd, WM_DRAWITEM, 0, (LPARAM)&dis); return res; @@ -1007,7 +1045,7 @@ DrawMenuItem(HWND hWnd, HMENU mnu, HDC hDC, MENUITEMINFOW *mii, RECT *mir, LPWST /* FIXME draw the menu item */ SetTextColor(hDC, COLOR_MENUTEXT); SetBkMode(hDC, TRANSPARENT); - DrawTextW(hDC, str, mii->cch, mir, DT_SINGLELINE | DT_VCENTER | DT_CENTER); + DrawTextW(hDC, str, mii->cch, &mii->Rect, DT_SINGLELINE | DT_VCENTER | DT_CENTER); } return res; } @@ -1392,10 +1430,10 @@ MenuDrawMenuBar(HDC hDC, LPRECT Rect, HWND hWnd, BOOL Draw) HANDLE hHeap; PVOID Buf, hBuf; DWORD BufSize, Items, Items2, hItems; - MENUITEMINFOW *mii; + ROSMENUITEMINFO *mii; PVOID milist, *mih; SETMENUITEMRECT smir; - RECT *omir, *mir = NULL; + RECT omir; LPWSTR str; mnu = GetMenu(hWnd); /* Fixme - pass menu handle as parameter */ @@ -1421,50 +1459,46 @@ MenuDrawMenuBar(HDC hDC, LPRECT Rect, HWND hWnd, BOOL Draw) hItems = 0; while(Items > 0) { - omir = mir; - mii = (LPMENUITEMINFOW)Buf; - Buf += sizeof(MENUITEMINFOW); - mir = (LPRECT)Buf; - Buf += sizeof(RECT); + mii = (PROSMENUITEMINFO)Buf; + Buf += sizeof(ROSMENUITEMINFO); if(mii->cch) { - str = (LPWSTR)Buf; - Buf += (mii->cch + 1) * sizeof(WCHAR); + str = (LPWSTR)mii->dwTypeData; } else str = NULL; - if(omir) + if(Items != Items2) { - mir->left = omir->right + 1; - mir->top = omir->top; - mir->right += mir->left; - mir->bottom += mir->top; + mii->Rect.left = omir.right + 1; + mii->Rect.top = omir.top; + mii->Rect.right += mii->Rect.left; + mii->Rect.bottom += mii->Rect.top; } else { - mir->left = Rect->left; - mir->top = Rect->top; + mii->Rect.left = Rect->left; + mii->Rect.top = Rect->top; } if((mii->fType & MFT_RIGHTJUSTIFY) && !milist) { - milist = mih = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, Items * sizeof(MENUITEMINFOW*)); + milist = mih = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, Items * sizeof(PROSMENUITEMINFO)); hItems = Items; } - MeasureMenuItem(hWnd, mnu, hDC, mii, mir, str); + MeasureMenuItem(hWnd, mnu, hDC, mii, str); - if((mir->right > Rect->right) || (mii->fType & (MFT_MENUBREAK | MFT_MENUBARBREAK))) + if((mii->Rect.right > Rect->right) || (mii->fType & (MFT_MENUBREAK | MFT_MENUBARBREAK))) { - mir->right -= (mir->left - Rect->left); - mir->left = Rect->left; - mir->top += line; - mir->bottom += line; - line = mir->bottom - mir->top; + mii->Rect.right -= (mii->Rect.left - Rect->left); + mii->Rect.left = Rect->left; + mii->Rect.top += line; + mii->Rect.bottom += line; + line = mii->Rect.bottom - mii->Rect.top; } if(!milist) { - smir.rcRect = *mir; + smir.rcRect = mii->Rect; NtUserSetMenuItemRect(mnu, &smir); smir.uItem++; } @@ -1473,8 +1507,9 @@ MenuDrawMenuBar(HDC hDC, LPRECT Rect, HWND hWnd, BOOL Draw) *(mih++) = mii; } - bottom = max(bottom, mir->bottom); - line = max(line, mir->bottom - mir->top); + bottom = max(bottom, mii->Rect.bottom); + line = max(line, mii->Rect.bottom - mii->Rect.top); + omir = mii->Rect; Items--; } /* align help menus to the right */ @@ -1487,23 +1522,22 @@ MenuDrawMenuBar(HDC hDC, LPRECT Rect, HWND hWnd, BOOL Draw) while(hItems > 0) { LONG wd; - MENUITEMINFOW *omii; + PROSMENUITEMINFO omii; omii = mii; - mii = (MENUITEMINFOW*)(*(--mih)); - mir = (LPRECT)(mii + 1); + mii = (PROSMENUITEMINFO)(*(--mih)); - if(omii && ((mir->right > x) || (omii->fType & (MFT_MENUBREAK | MFT_MENUBARBREAK)))) + if(omii && ((mii->Rect.right > x) || (omii->fType & (MFT_MENUBREAK | MFT_MENUBARBREAK)))) { x = Rect->right; } - wd = (mir->right - mir->left); - mir->right = x - 1; - mir->left = mir->right - wd; - x = mir->left; + wd = (mii->Rect.right - mii->Rect.left); + mii->Rect.right = x - 1; + mii->Rect.left = mii->Rect.right - wd; + x = mii->Rect.left; - smir.rcRect = *mir; + smir.rcRect = mii->Rect; NtUserSetMenuItemRect(mnu, &smir); smir.uItem--; @@ -1528,19 +1562,16 @@ MenuDrawMenuBar(HDC hDC, LPRECT Rect, HWND hWnd, BOOL Draw) /* draw menu items */ while (Items2 > 0) { - mii = (LPMENUITEMINFOW)Buf; - Buf += sizeof(MENUITEMINFOW); - mir = (LPRECT)Buf; - Buf += sizeof(RECT); + mii = (PROSMENUITEMINFO)Buf; + Buf += sizeof(ROSMENUITEMINFO); if(mii->cch) { - str = (LPWSTR)Buf; - Buf += (mii->cch + 1) * sizeof(WCHAR); + str = (LPWSTR)mii->dwTypeData; } else str = NULL; /* DbgPrint("Draw menu item %ws at (%d, %d, %d, %d)\n", str, mir->left, mir->top, mir->right, mir->bottom); */ - DrawMenuItem(hWnd, mnu, hDC, mii, mir, str); + DrawMenuItem(hWnd, mnu, hDC, mii, str); Items2--; } } @@ -1908,6 +1939,7 @@ MenuShowSubPopup(HWND WndOwner, PROSMENUINFO MenuInfo, BOOL SelectFirst, UINT Fl { RECT Rect; ROSMENUITEMINFO ItemInfo; + ROSMENUINFO SubMenuInfo; HDC Dc; HMENU Ret; @@ -2012,9 +2044,9 @@ MenuShowSubPopup(HWND WndOwner, PROSMENUINFO MenuInfo, BOOL SelectFirst, UINT Fl MenuShowPopup(WndOwner, ItemInfo.hSubMenu, MenuInfo->FocusedItem, Rect.left, Rect.top, Rect.right, Rect.bottom ); - if (SelectFirst) + if (SelectFirst && MenuGetRosMenuInfo(&SubMenuInfo, ItemInfo.hSubMenu)) { - MenuMoveSelection(WndOwner, ItemInfo.hSubMenu, ITEM_NEXT); + MenuMoveSelection(WndOwner, &SubMenuInfo, ITEM_NEXT); } Ret = ItemInfo.hSubMenu; @@ -2376,6 +2408,545 @@ MenuMouseMove(MTRACKER *Mt, HMENU PtMenu, UINT Flags) return TRUE; } +/****************************************************************************** + * + * UINT MenuGetStartOfNextColumn(PROSMENUINFO MenuInfo) + */ +static UINT MenuGetStartOfNextColumn(PROSMENUINFO MenuInfo) +{ + UINT i; + PROSMENUITEMINFO MenuItems; + + i = MenuInfo->FocusedItem; + if (NO_SELECTED_ITEM == i) + { + return i; + } + + if (MenuGetAllRosMenuItemInfo(MenuInfo->Self, &MenuItems) <= 0) + { + return NO_SELECTED_ITEM; + } + + for (i++ ; i < MenuInfo->MenuItemCount; i++) + { + if (0 != (MenuItems[i].fType & MF_MENUBARBREAK)) + { + return i; + } + } + + return NO_SELECTED_ITEM; +} + +/****************************************************************************** + * + * UINT MenuGetStartOfPrevColumn(PROSMENUINFO MenuInfo) + */ +static UINT FASTCALL +MenuGetStartOfPrevColumn(PROSMENUINFO MenuInfo) +{ + UINT i; + PROSMENUITEMINFO MenuItems; + + if (0 == MenuInfo->FocusedItem || NO_SELECTED_ITEM == MenuInfo->FocusedItem) + { + return NO_SELECTED_ITEM; + } + + if (MenuGetAllRosMenuItemInfo(MenuInfo->Self, &MenuItems) <= 0) + { + return NO_SELECTED_ITEM; + } + + /* Find the start of the column */ + + for (i = MenuInfo->FocusedItem; + 0 != i && 0 == (MenuItems[i].fType & MF_MENUBARBREAK); + --i) + { + ; /* empty */ + } + + if (0 == i) + { + MenuCleanupAllRosMenuItemInfo(MenuItems); + return NO_SELECTED_ITEM; + } + + for (--i; 0 != i; --i) + { + if (MenuItems[i].fType & MF_MENUBARBREAK) + { + break; + } + } + + MenuCleanupAllRosMenuItemInfo(MenuItems); + DPRINT("ret %d.\n", i ); + + return i; +} + +/*********************************************************************** + * MenuGetSubPopup + * + * Return the handle of the selected sub-popup menu (if any). + */ +static HMENU FASTCALL +MenuGetSubPopup(HMENU Menu) +{ + ROSMENUINFO MenuInfo; + ROSMENUITEMINFO ItemInfo; + + if (! MenuGetRosMenuInfo(&MenuInfo, Menu) + || NO_SELECTED_ITEM == MenuInfo.FocusedItem) + { + return NULL; + } + + MenuInitRosMenuItemInfo(&ItemInfo); + if (! MenuGetRosMenuItemInfo(MenuInfo.Self, MenuInfo.FocusedItem, &ItemInfo)) + { + MenuCleanupRosMenuItemInfo(&ItemInfo); + return NULL; + } + if (0 != (ItemInfo.fType & MF_POPUP) && 0 != (ItemInfo.fState & MF_MOUSESELECT)) + { + MenuCleanupRosMenuItemInfo(&ItemInfo); + return ItemInfo.hSubMenu; + } + + MenuCleanupRosMenuItemInfo(&ItemInfo); + return NULL; +} + +/*********************************************************************** + * MenuDoNextMenu + * + * NOTE: WM_NEXTMENU documented in Win32 is a bit different. + */ +static LRESULT FASTCALL +MenuDoNextMenu(MTRACKER* Mt, UINT Vk) +{ +#if 0 /* FIXME */ + ROSMENUINFO TopMenuInfo; + ROSMENUINFO MenuInfo; + + if (! MenuGetRosMenuInfo(&TopMenuInfo, Mt->TopMenu)) + { + return (LRESULT) FALSE; + } + + if ((VK_LEFT == Vk && 0 == TopMenuInfo.FocusedItem) + || (VK_RIGHT == Vk && TopMenuInfo.FocusedItem == TopMenuInfo.MenuItemCount - 1)) + { + MDINEXTMENU NextMenu; + HMENU NewMenu; + HWND NewWnd; + UINT Id = 0; + + NextMenu.hmenuIn = (IS_SYSTEM_MENU(&TopMenuInfo)) ? GetSubMenu(Mt->TopMenu, 0) : Mt->TopMenu; + NextMenu.hmenuNext = NULL; + NextMenu.hwndNext = NULL; + SendMessageW(Mt->OwnerWnd, WM_NEXTMENU, Vk, (LPARAM) &NextMenu); + + DPRINT("%p [%p] -> %p [%p]\n", + Mt->CurrentMenu, Mt->OwnerWnd, NextMenu.hmenuNext, NextMenu.hwndNext ); + + if (NULL == NextMenu.hmenuNext || NULL == NextMenu.hwndNext) + { + DWORD Style = GetWindowLongW(Mt->OwnerWnd, GWL_STYLE); + NewWnd = Mt->OwnerWnd; + if (IS_SYSTEM_MENU(&TopMenuInfo)) + { + /* switch to the menu bar */ + + if (0 != (Style & WS_CHILD) + || NULL == (NewMenu = GetMenu(NewWnd))) + { + return FALSE; + } + + if (VK_LEFT == Vk) + { + if (! MenuGetRosMenuInfo(&MenuInfo, NewMenu)) + { + return FALSE; + } + Id = MenuInfo.MenuItemCount - 1; + } + } + else if (0 != (Style & WS_SYSMENU)) + { +#if 0 /* FIXME */ + /* switch to the system menu */ + NewMenu = get_win_sys_menu(NewWnd); +#endif + } + else + { + return FALSE; + } + } + else /* application returned a new menu to switch to */ + { + NewMenu = NextMenu.hmenuNext; + NewWnd = NextMenu.hwndNext; + + if (IsMenu(NewMenu) && IsWindow(NewWnd)) + { + DWORD Style = GetWindowLongW(NewWnd, GWL_STYLE); + +#if 0 /* FIXME */ + if (0 != (Style & WS_SYSMENU) + && GetSubMenu(get_win_sys_menu(NewWnd), 0) == NewMenu) + { + /* get the real system menu */ + NewMenu = get_win_sys_menu(NewWnd); + } + else if (0 != (Style & WS_CHILD) || GetMenu(NewWnd) != NewMenu) +#else + if (0 != (Style & WS_CHILD) || GetMenu(NewWnd) != NewMenu) +#endif + { + /* FIXME: Not sure what to do here; + * perhaps try to track NewMenu as a popup? */ + + DPRINT(" -- got confused.\n"); + return FALSE; + } + } + else + { + return FALSE; + } + } + + if (NewMenu != Mt->TopMenu) + { + MenuSelectItem(Mt->OwnerWnd, &TopMenuInfo, NO_SELECTED_ITEM, + FALSE, 0 ); + if (Mt->CurrentMenu != Mt->TopMenu) + { + MenuHideSubPopups(Mt->OwnerWnd, &TopMenuInfo, FALSE); + } + } + + if (NewWnd != Mt->OwnerWnd) + { + Mt->OwnerWnd = NewWnd; + SetCapture(Mt->OwnerWnd); + } + + Mt->TopMenu = Mt->CurrentMenu = NewMenu; /* all subpopups are hidden */ + if (MenuGetRosMenuInfo(&TopMenuInfo, Mt->TopMenu)) + { + MenuSelectItem(Mt->OwnerWnd, &TopMenuInfo, Id, TRUE, 0); + } + + return TRUE; + } +#endif + + return FALSE; +} + +/*********************************************************************** + * MenuSuspendPopup + * + * The idea is not to show the popup if the next input message is + * going to hide it anyway. + */ +static BOOL FASTCALL +MenuSuspendPopup(MTRACKER* Mt, UINT Message) +{ + MSG Msg; + + Msg.hwnd = Mt->OwnerWnd; + + PeekMessageW(&Msg, 0, 0, 0, PM_NOYIELD | PM_REMOVE); + Mt->TrackFlags |= TF_SKIPREMOVE; + + switch (Message) + { + case WM_KEYDOWN: + PeekMessageW(&Msg, 0, 0, 0, PM_NOYIELD | PM_NOREMOVE); + if (WM_KEYUP == Msg.message || WM_PAINT == Msg.message) + { + PeekMessageW(&Msg, 0, 0, 0, PM_NOYIELD | PM_REMOVE); + PeekMessageW(&Msg, 0, 0, 0, PM_NOYIELD | PM_NOREMOVE); + if (WM_KEYDOWN == Msg.message + && (VK_LEFT == Msg.wParam || VK_RIGHT == Msg.wParam)) + { + Mt->TrackFlags |= TF_SUSPENDPOPUP; + return TRUE; + } + } + break; + } + + /* failures go through this */ + Mt->TrackFlags &= ~TF_SUSPENDPOPUP; + + return FALSE; +} + +/*********************************************************************** + * MenuKeyEscape + * + * Handle a VK_ESCAPE key event in a menu. + */ +static BOOL FASTCALL +MenuKeyEscape(MTRACKER *Mt, UINT Flags) +{ + BOOL EndMenu = TRUE; + ROSMENUINFO MenuInfo; + HMENU MenuTmp, MenuPrev; + + if (Mt->CurrentMenu != Mt->TopMenu) + { + if (MenuGetRosMenuInfo(&MenuInfo, Mt->CurrentMenu) + && 0 != (MenuInfo.Flags & MF_POPUP)) + { + MenuPrev = MenuTmp = Mt->TopMenu; + + /* close topmost popup */ + while (MenuTmp != Mt->CurrentMenu) + { + MenuPrev = MenuTmp; + MenuTmp = MenuGetSubPopup(MenuPrev); + } + + if (MenuGetRosMenuInfo(&MenuInfo, MenuPrev)) + { + MenuHideSubPopups(Mt->OwnerWnd, &MenuInfo, TRUE); + } + Mt->CurrentMenu = MenuPrev; + EndMenu = FALSE; + } + } + + return EndMenu; +} + +/*********************************************************************** + * MenuKeyLeft + * + * Handle a VK_LEFT key event in a menu. + */ +static void FASTCALL +MenuKeyLeft(MTRACKER* Mt, UINT Flags) +{ + ROSMENUINFO MenuInfo; + ROSMENUINFO TopMenuInfo; + ROSMENUINFO PrevMenuInfo; + HMENU MenuTmp, MenuPrev; + UINT PrevCol; + + MenuPrev = MenuTmp = Mt->TopMenu; + + if (! MenuGetRosMenuInfo(&MenuInfo, Mt->CurrentMenu)) + { + return; + } + + /* Try to move 1 column left (if possible) */ + if (NO_SELECTED_ITEM != (PrevCol = MenuGetStartOfPrevColumn(&MenuInfo))) + { + if (MenuGetRosMenuInfo(&MenuInfo, Mt->CurrentMenu)) + { + MenuSelectItem(Mt->OwnerWnd, &MenuInfo, PrevCol, TRUE, 0); + } + return; + } + + /* close topmost popup */ + while (MenuTmp != Mt->CurrentMenu) + { + MenuPrev = MenuTmp; + MenuTmp = MenuGetSubPopup(MenuPrev); + } + + if (! MenuGetRosMenuInfo(&PrevMenuInfo, MenuPrev)) + { + return; + } + MenuHideSubPopups(Mt->OwnerWnd, &PrevMenuInfo, TRUE); + Mt->CurrentMenu = MenuPrev; + + if (! MenuGetRosMenuInfo(&TopMenuInfo, Mt->TopMenu)) + { + return; + } + if ((MenuPrev == Mt->TopMenu) && 0 == (TopMenuInfo.Flags & MF_POPUP)) + { + /* move menu bar selection if no more popups are left */ + + if (! MenuDoNextMenu(Mt, VK_LEFT)) + { + MenuMoveSelection(Mt->OwnerWnd, &TopMenuInfo, ITEM_PREV); + } + + if (MenuPrev != MenuTmp || 0 != (Mt->TrackFlags & TF_SUSPENDPOPUP)) + { + /* A sublevel menu was displayed - display the next one + * unless there is another displacement coming up */ + + if (! MenuSuspendPopup(Mt, WM_KEYDOWN)) + { + Mt->CurrentMenu = MenuShowSubPopup(Mt->OwnerWnd, &TopMenuInfo, + TRUE, Flags); + } + } + } +} + +/*********************************************************************** + * MenuKeyRight + * + * Handle a VK_RIGHT key event in a menu. + */ +static void FASTCALL +MenuKeyRight(MTRACKER *Mt, UINT Flags) +{ + HMENU MenuTmp; + ROSMENUINFO MenuInfo; + ROSMENUINFO CurrentMenuInfo; + UINT NextCol; + + DPRINT("MenuKeyRight called, cur %p, top %p.\n", + Mt->CurrentMenu, Mt->TopMenu); + + if (! MenuGetRosMenuInfo(&MenuInfo, Mt->TopMenu)) + { + return; + } + if (0 != (MenuInfo.Flags & MF_POPUP) || (Mt->CurrentMenu != Mt->TopMenu)) + { + /* If already displaying a popup, try to display sub-popup */ + + MenuTmp = Mt->CurrentMenu; + if (MenuGetRosMenuInfo(&CurrentMenuInfo, Mt->CurrentMenu)) + { + Mt->CurrentMenu = MenuShowSubPopup(Mt->OwnerWnd, &CurrentMenuInfo, TRUE, Flags); + } + + /* if subpopup was displayed then we are done */ + if (MenuTmp != Mt->CurrentMenu) + { + return; + } + } + + if (! MenuGetRosMenuInfo(&CurrentMenuInfo, Mt->CurrentMenu)) + { + return; + } + + /* Check to see if there's another column */ + if (NO_SELECTED_ITEM != (NextCol = MenuGetStartOfNextColumn(&CurrentMenuInfo))) + { + DPRINT("Going to %d.\n", NextCol); + if (MenuGetRosMenuInfo(&MenuInfo, Mt->CurrentMenu)) + { + MenuSelectItem(Mt->OwnerWnd, &MenuInfo, NextCol, TRUE, 0); + } + return; + } + + if (0 == (MenuInfo.Flags & MF_POPUP)) /* menu bar tracking */ + { + if (Mt->CurrentMenu != Mt->TopMenu) + { + MenuHideSubPopups(Mt->OwnerWnd, &MenuInfo, FALSE ); + MenuTmp = Mt->CurrentMenu = Mt->TopMenu; + } + else + { + MenuTmp = NULL; + } + + /* try to move to the next item */ + if (! MenuDoNextMenu(Mt, VK_RIGHT)) + { + MenuMoveSelection(Mt->OwnerWnd, &MenuInfo, ITEM_NEXT); + } + + if (NULL != MenuTmp || 0 != (Mt->TrackFlags & TF_SUSPENDPOPUP)) + { + if (! MenuSuspendPopup(Mt, WM_KEYDOWN)) + { + Mt->CurrentMenu = MenuShowSubPopup(Mt->OwnerWnd, &MenuInfo, + TRUE, Flags); + } + } + } +} + +/*********************************************************************** + * MenuFindItemByKey + * + * Find the menu item selected by a key press. + * Return item id, -1 if none, -2 if we should close the menu. + */ +static UINT FASTCALL +MenuFindItemByKey(HWND WndOwner, PROSMENUINFO MenuInfo, + WCHAR Key, BOOL ForceMenuChar) +{ + PROSMENUITEMINFO Items, ItemInfo; + LRESULT MenuChar; + UINT i; + + DPRINT("\tlooking for '%c' (0x%02x) in [%p]\n", (char) Key, Key, MenuInfo); + +#if 0 /* FIXME */ + if (! IsMenu( hmenu )) hmenu = GetSubMenu( get_win_sys_menu(hwndOwner), 0); +#endif + + if (NULL != MenuInfo) + { + if (MenuGetAllRosMenuItemInfo(MenuInfo->Self, &Items) <= 0) + { + return -1; + } + if (! ForceMenuChar) + { + Key = towupper(Key); + ItemInfo = Items; + for (i = 0; i < MenuInfo->MenuItemCount; i++, ItemInfo++) + { + if (IS_STRING_ITEM(ItemInfo->fType) && NULL != ItemInfo->dwTypeData) + { + WCHAR *p = (WCHAR *) ItemInfo->dwTypeData - 2; + do + { + p = wcschr(p + 2, '&'); + } + while (NULL != p && L'&' == p[1]); + if (NULL != p && (towupper(p[1]) == Key)) + { + return i; + } + } + } + } + + MenuChar = SendMessageW(WndOwner, WM_MENUCHAR, + MAKEWPARAM(Key, MenuInfo->Flags), (LPARAM) MenuInfo->Self); + if (2 == HIWORD(MenuChar)) + { + return LOWORD(MenuChar); + } + if (1 == HIWORD(MenuChar)) + { + return (UINT) (-2); + } + } + + return (UINT)(-1); +} + /*********************************************************************** * MenuTrackMenu * @@ -2387,6 +2958,7 @@ MenuTrackMenu(HMENU Menu, UINT Flags, INT x, INT y, { MSG Msg; ROSMENUINFO MenuInfo; + ROSMENUITEMINFO ItemInfo; BOOL fRemove; INT ExecutedMenuId = -1; MTRACKER Mt; @@ -2537,106 +3109,148 @@ MenuTrackMenu(HMENU Menu, UINT Flags, INT x, INT y, } else if (WM_KEYFIRST <= Msg.message && Msg.message <= WM_KEYLAST) { -#if 0 /* FIXME */ - fRemove = TRUE; /* Keyboard messages are always removed */ - switch(msg.message) - { - case WM_KEYDOWN: - switch(msg.wParam) - { - case VK_HOME: - case VK_END: - MENU_SelectItem( mt.hOwnerWnd, mt.hCurrentMenu, - NO_SELECTED_ITEM, FALSE, 0 ); - /* fall through */ - case VK_UP: - MENU_MoveSelection( mt.hOwnerWnd, mt.hCurrentMenu, - (msg.wParam == VK_HOME)? ITEM_NEXT : ITEM_PREV ); - break; + fRemove = TRUE; /* Keyboard messages are always removed */ + switch(Msg.message) + { + case WM_KEYDOWN: + switch(Msg.wParam) + { + case VK_HOME: + case VK_END: + if (MenuGetRosMenuInfo(&MenuInfo, Mt.CurrentMenu)) + { + MenuSelectItem(Mt.OwnerWnd, &MenuInfo, NO_SELECTED_ITEM, + FALSE, 0 ); + } + /* fall through */ - case VK_DOWN: /* If on menu bar, pull-down the menu */ + case VK_UP: + if (MenuGetRosMenuInfo(&MenuInfo, Mt.CurrentMenu)) + { + MenuMoveSelection(Mt.OwnerWnd, &MenuInfo, + VK_HOME == Msg.wParam ? ITEM_NEXT : ITEM_PREV); + } + break; - menu = MENU_GetMenu( mt.hCurrentMenu ); - if (!(menu->wFlags & MF_POPUP)) - mt.hCurrentMenu = MENU_ShowSubPopup(mt.hOwnerWnd, mt.hTopMenu, TRUE, wFlags); - else /* otherwise try to move selection */ - MENU_MoveSelection( mt.hOwnerWnd, mt.hCurrentMenu, ITEM_NEXT ); - break; + case VK_DOWN: /* If on menu bar, pull-down the menu */ + if (MenuGetRosMenuInfo(&MenuInfo, Mt.CurrentMenu)) + { + if (0 == (MenuInfo.Flags & MF_POPUP)) + { + if (MenuGetRosMenuInfo(&MenuInfo, Mt.TopMenu)) + { + Mt.CurrentMenu = MenuShowSubPopup(Mt.OwnerWnd, &MenuInfo, + TRUE, Flags); + } + } + else /* otherwise try to move selection */ + { + MenuMoveSelection(Mt.OwnerWnd, &MenuInfo, ITEM_NEXT); + } + } + break; - case VK_LEFT: - MENU_KeyLeft( &mt, wFlags ); - break; + case VK_LEFT: + MenuKeyLeft(&Mt, Flags); + break; - case VK_RIGHT: - MENU_KeyRight( &mt, wFlags ); - break; + case VK_RIGHT: + MenuKeyRight(&Mt, Flags); + break; - case VK_ESCAPE: - fEndMenu = MENU_KeyEscape(&mt, wFlags); - break; + case VK_ESCAPE: + fEndMenu = MenuKeyEscape(&Mt, Flags); + break; - case VK_F1: - { - HELPINFO hi; - hi.cbSize = sizeof(HELPINFO); - hi.iContextType = HELPINFO_MENUITEM; - if (menu->FocusedItem == NO_SELECTED_ITEM) - hi.iCtrlId = 0; - else - hi.iCtrlId = menu->items[menu->FocusedItem].wID; - hi.hItemHandle = hmenu; - hi.dwContextId = menu->dwContextHelpID; - hi.MousePos = msg.pt; - SendMessageW(hwnd, WM_HELP, 0, (LPARAM)&hi); - break; - } + case VK_F1: + { + HELPINFO hi; + hi.cbSize = sizeof(HELPINFO); + hi.iContextType = HELPINFO_MENUITEM; + if (MenuGetRosMenuInfo(&MenuInfo, Mt.CurrentMenu)) + { + if (NO_SELECTED_ITEM == MenuInfo.FocusedItem) + { + hi.iCtrlId = 0; + } + else + { + MenuInitRosMenuItemInfo(&ItemInfo); + if (MenuGetRosMenuItemInfo(MenuInfo.Self, + MenuInfo.FocusedItem, + &ItemInfo)) + { + hi.iCtrlId = ItemInfo.wID; + } + else + { + hi.iCtrlId = 0; + } + MenuCleanupRosMenuItemInfo(&ItemInfo); + } + } + hi.hItemHandle = Menu; + hi.dwContextId = MenuInfo.dwContextHelpID; + hi.MousePos = Msg.pt; + SendMessageW(Wnd, WM_HELP, 0, (LPARAM) &hi); + break; + } - default: - break; + default: + break; + } + break; /* WM_KEYDOWN */ + + case WM_SYSKEYDOWN: + switch (Msg.wParam) + { + case VK_MENU: + fEndMenu = TRUE; + break; + } + break; /* WM_SYSKEYDOWN */ + + case WM_CHAR: + { + UINT Pos; + + if (! MenuGetRosMenuInfo(&MenuInfo, Mt.CurrentMenu)) + { + break; + } + if (L'\r' == Msg.wParam || L' ' == Msg.wParam) + { + ExecutedMenuId = MenuExecFocusedItem(&Mt, &MenuInfo, Flags); + fEndMenu = (ExecutedMenuId != -1); + break; + } + + /* Hack to avoid control chars. */ + /* We will find a better way real soon... */ + if (Msg.wParam < 32) + { + break; + } + + Pos = MenuFindItemByKey(Mt.OwnerWnd, &MenuInfo, + LOWORD(Msg.wParam), FALSE); + if ((UINT) -2 == Pos) + { + fEndMenu = TRUE; + } + else if ((UINT) -1 == Pos) + { + MessageBeep(0); + } + else + { + MenuSelectItem(Mt.OwnerWnd, &MenuInfo, Pos, TRUE, 0); + ExecutedMenuId = MenuExecFocusedItem(&Mt, &MenuInfo, Flags); + fEndMenu = (-1 != ExecutedMenuId); + } } - break; /* WM_KEYDOWN */ - - case WM_SYSKEYDOWN: - switch(msg.wParam) - { - case VK_MENU: - fEndMenu = TRUE; - break; - - } - break; /* WM_SYSKEYDOWN */ - - case WM_CHAR: - { - UINT pos; - - if (msg.wParam == '\r' || msg.wParam == ' ') - { - ExecutedMenuId = MENU_ExecFocusedItem(&mt,mt.hCurrentMenu, wFlags); - fEndMenu = (ExecutedMenuId != -1); - - break; - } - - /* Hack to avoid control chars. */ - /* We will find a better way real soon... */ - if (msg.wParam < 32) break; - - pos = MENU_FindItemByKey( mt.hOwnerWnd, mt.hCurrentMenu, - LOWORD(msg.wParam), FALSE ); - if (pos == (UINT)-2) fEndMenu = TRUE; - else if (pos == (UINT)-1) MessageBeep(0); - else - { - MENU_SelectItem( mt.hOwnerWnd, mt.hCurrentMenu, pos, - TRUE, 0 ); - ExecutedMenuId = MENU_ExecFocusedItem(&mt,mt.hCurrentMenu, wFlags); - fEndMenu = (ExecutedMenuId != -1); - } - } - break; - } /* switch(msg.message) - kbd */ -#endif + break; + } /* switch(msg.message) - kbd */ } else { @@ -2970,9 +3584,11 @@ GetMenuInfo(HMENU hmenu, * @implemented */ int STDCALL -GetMenuItemCount(HMENU hMenu) +GetMenuItemCount(HMENU Menu) { - return NtUserBuildMenuItemList(hMenu, NULL, 0, 0); + ROSMENUINFO MenuInfo; + + return MenuGetRosMenuInfo(&MenuInfo, Menu) ? MenuInfo.MenuItemCount : 0; } @@ -3061,6 +3677,7 @@ GetMenuState( UINT uId, UINT uFlags) { + ROSMENUINFO MenuInfo; ROSMENUITEMINFO mii; mii.cbSize = sizeof(MENUITEMINFOW); @@ -3072,7 +3689,11 @@ GetMenuState( UINT nSubItems = 0; if(mii.hSubMenu) { - nSubItems = (UINT)NtUserBuildMenuItemList(mii.hSubMenu, NULL, 0, 0); + if (! MenuGetRosMenuInfo(&MenuInfo, mii.hSubMenu)) + { + return (UINT) -1; + } + nSubItems = MenuInfo.MenuItemCount; /* FIXME - ported from wine, does that work (0xff)? */ if(GetLastError() != ERROR_INVALID_MENU_HANDLE) @@ -3392,9 +4013,11 @@ InsertMenuW( BOOL STDCALL IsMenu( - HMENU hMenu) + HMENU Menu) { - return 0 <= NtUserBuildMenuItemList(hMenu, NULL, 0, 0); + ROSMENUINFO MenuInfo; + + return MenuGetRosMenuInfo(&MenuInfo, Menu); } diff --git a/reactos/subsys/win32k/ntuser/menu.c b/reactos/subsys/win32k/ntuser/menu.c index d3f62ddceb8..ffddad0ac5e 100644 --- a/reactos/subsys/win32k/ntuser/menu.c +++ b/reactos/subsys/win32k/ntuser/menu.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: menu.c,v 1.46 2004/02/19 21:12:09 weiden Exp $ +/* $Id: menu.c,v 1.47 2004/02/22 18:04:52 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -888,58 +888,96 @@ IntBuildMenuItemList(PMENU_OBJECT MenuObject, PVOID Buffer, ULONG nMax) { DWORD res = 0; UINT sz; - MENUITEMINFOW mii; + ROSMENUITEMINFO mii; PVOID Buf; PMENU_ITEM CurItem = MenuObject->MenuItemList; - if(nMax) - { - sz = sizeof(MENUITEMINFOW) + sizeof(RECT); - Buf = Buffer; - mii.cbSize = sz; - mii.fMask = 0; - while(CurItem && (nMax >= sz)) - { - mii.cch = CurItem->Text.Length / sizeof(WCHAR); - mii.dwItemData = CurItem->dwItemData; - if(CurItem->Text.Length) - mii.dwTypeData = NULL; - else - mii.dwTypeData = (LPWSTR)CurItem->Text.Buffer; - mii.fState = CurItem->fState; - mii.fType = CurItem->fType; - mii.hbmpChecked = CurItem->hbmpChecked; - mii.hbmpItem = CurItem->hbmpItem; - mii.hbmpUnchecked = CurItem->hbmpUnchecked; - mii.hSubMenu = CurItem->hSubMenu; - RtlCopyMemory(Buf, &mii, sizeof(MENUITEMINFOW)); - Buf += sizeof(MENUITEMINFOW); - RtlCopyMemory(Buf, &CurItem->Rect, sizeof(RECT)); - Buf += sizeof(RECT); - nMax -= sz; - - if(CurItem->Text.Length && (nMax >= CurItem->Text.Length + sizeof(WCHAR))) - { - /* copy string */ - RtlCopyMemory(Buf, (LPWSTR)CurItem->Text.Buffer, CurItem->Text.Length); - Buf += CurItem->Text.Length + sizeof(WCHAR); - nMax -= CurItem->Text.Length + sizeof(WCHAR); - } - else - break; + PWCHAR StrOut; + NTSTATUS Status; + WCHAR NulByte; - CurItem = CurItem->Next; - res++; - } - } - else - { - while(CurItem) + if (0 != nMax) { - res += sizeof(MENUITEMINFOW) + sizeof(RECT); - res += CurItem->Text.Length + sizeof(WCHAR); - CurItem = CurItem->Next; + if (nMax < MenuObject->MenuInfo.MenuItemCount * sizeof(ROSMENUITEMINFO)) + { + return 0; + } + StrOut = (PWCHAR)((char *) Buffer + MenuObject->MenuInfo.MenuItemCount + * sizeof(ROSMENUITEMINFO)); + nMax -= MenuObject->MenuInfo.MenuItemCount * sizeof(ROSMENUITEMINFO); + sz = sizeof(ROSMENUITEMINFO); + Buf = Buffer; + mii.cbSize = sizeof(ROSMENUITEMINFO); + mii.fMask = 0; + NulByte = L'\0'; + + while (NULL != CurItem) + { + mii.cch = CurItem->Text.Length / sizeof(WCHAR); + mii.dwItemData = CurItem->dwItemData; + if (0 != CurItem->Text.Length) + { + mii.dwTypeData = StrOut; + } + else + { + mii.dwTypeData = NULL; + } + mii.fState = CurItem->fState; + mii.fType = CurItem->fType; + mii.hbmpChecked = CurItem->hbmpChecked; + mii.hbmpItem = CurItem->hbmpItem; + mii.hbmpUnchecked = CurItem->hbmpUnchecked; + mii.hSubMenu = CurItem->hSubMenu; + mii.Rect = CurItem->Rect; + mii.XTab = CurItem->XTab; + + Status = MmCopyToCaller(Buf, &mii, sizeof(ROSMENUITEMINFO)); + if (! NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return 0; + } + Buf += sizeof(ROSMENUITEMINFO); + + if (0 != CurItem->Text.Length + && (nMax >= CurItem->Text.Length + sizeof(WCHAR))) + { + /* copy string */ + Status = MmCopyToCaller(StrOut, CurItem->Text.Buffer, + CurItem->Text.Length); + if (! NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return 0; + } + StrOut += CurItem->Text.Length / sizeof(WCHAR); + Status = MmCopyToCaller(StrOut, &NulByte, sizeof(WCHAR)); + if (! NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return 0; + } + StrOut++; + nMax -= CurItem->Text.Length + sizeof(WCHAR); + } + else if (0 != CurItem->Text.Length) + { + break; + } + + CurItem = CurItem->Next; + res++; + } } - } + else + { + while (NULL != CurItem) + { + res += sizeof(ROSMENUITEMINFO) + CurItem->Text.Length + sizeof(WCHAR); + CurItem = CurItem->Next; + } + } + return res; } From 0679c1f91e3346e0f09adf784a378e3ad4611bae Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Sun, 22 Feb 2004 18:46:45 +0000 Subject: [PATCH 0132/1463] - Inherit any PREFIX setting for cross-compilation from the environment. svn path=/trunk/; revision=8318 --- reactos/subsys/system/explorer/Makefile | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/reactos/subsys/system/explorer/Makefile b/reactos/subsys/system/explorer/Makefile index 6a0cac62543..b78e87e4218 100644 --- a/reactos/subsys/system/explorer/Makefile +++ b/reactos/subsys/system/explorer/Makefile @@ -9,13 +9,17 @@ ifeq ($(HOST),) HOST = mingw32-windows endif -ifeq ($(HOST),mingw32-linux) -CC = mingw32-gcc -CXX = mingw32-g++ -LINK = mingw32-g++ -RC = mingw32-windres -CD_PREFIX := ./ +# Set up default prefix +ifeq ($(PREFIX),) PREFIX = mingw32- +endif + +ifeq ($(HOST),mingw32-linux) +CC = $(PREFIX)gcc +CXX = $(PREFIX)g++ +LINK = $(PREFIX)g++ +RC = $(PREFIX)windres +CD_PREFIX := ./ EXE_POSTFIX := EXE_PREFIX := ./ endif From 77c171884478d6d4200d98433db0a79c440f7270 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Sun, 22 Feb 2004 18:53:39 +0000 Subject: [PATCH 0133/1463] - Make the targets for regression test files the files themselves to avoid unnecessary recompilation. svn path=/trunk/; revision=8319 --- reactos/regtests/Makefile | 8 +++++--- reactos/tools/helper.mk | 12 ++++++------ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/reactos/regtests/Makefile b/reactos/regtests/Makefile index 712e3fe9128..2ee5211edd2 100755 --- a/reactos/regtests/Makefile +++ b/reactos/regtests/Makefile @@ -1,8 +1,10 @@ -# $Id: Makefile,v 1.2 2003/12/07 11:34:41 chorns Exp $ +# $Id: Makefile,v 1.3 2004/02/22 18:53:39 dwelch Exp $ PATH_TO_TOP = .. -all: registrations +REGTEST_TARGETS = kmregtests/_regtests.c kmregtests/Makefile.tests win32base/_regtests.c win32base/Makefile.tests + +all: $(REGTEST_TARGETS) $(MAKE) -C shared all $(MAKE) -C win32base all $(MAKE) -C kmregtests all @@ -25,7 +27,7 @@ install: $(MAKE) -C kmrtint install $(MAKE) -C regtests install -registrations: +$(REGTEST_TARGETS): kmregtests/tests/* win32base/tests/* $(REGTESTS) ./kmregtests/tests ./kmregtests/_regtests.c ./kmregtests/Makefile.tests $(REGTESTS) ./win32base/tests ./win32base/_regtests.c ./win32base/Makefile.tests diff --git a/reactos/tools/helper.mk b/reactos/tools/helper.mk index dc61b053c2e..16f2631e3b7 100644 --- a/reactos/tools/helper.mk +++ b/reactos/tools/helper.mk @@ -1,4 +1,4 @@ -# $Id: helper.mk,v 1.55 2004/02/22 17:30:33 chorns Exp $ +# $Id: helper.mk,v 1.56 2004/02/22 18:53:38 dwelch Exp $ # # Helper makefile for ReactOS modules # Variables this makefile accepts: @@ -618,15 +618,15 @@ else endif ifeq ($(TARGET_REGTESTS),yes) + REGTEST_TARGETS := tests/_regtests.c tests/Makefile.tests tests/_rtstub.c ifeq ($(MK_MODE),user) MK_LIBS := $(SDK_PATH_LIB)/rtshared.a $(MK_LIBS) endif - MK_REGTESTS := gen_regtests MK_REGTESTS_CLEAN := clean_regtests MK_OBJECTS += tests/_rtstub.o tests/regtests.a TARGET_CFLAGS += -I$(REGTESTS_PATH_INC) else - MK_REGTESTS := + REGTEST_TARGETS := MK_REGTESTS_CLEAN := endif @@ -634,7 +634,7 @@ ifeq ($(MK_IMPLIBONLY),yes) TARGET_CLEAN += $(MK_IMPLIBPATH)/$(MK_IMPLIB_FULLNAME) -all: $(MK_REGTESTS) $(MK_IMPLIBPATH)/$(MK_IMPLIB_FULLNAME) +all: $(REGTEST_TARGETS) $(MK_IMPLIBPATH)/$(MK_IMPLIB_FULLNAME) $(MK_IMPLIBPATH)/$(MK_IMPLIB_FULLNAME): $(MK_OBJECTS) $(MK_DEFNAME) $(DLLTOOL) \ @@ -645,7 +645,7 @@ $(MK_IMPLIBPATH)/$(MK_IMPLIB_FULLNAME): $(MK_OBJECTS) $(MK_DEFNAME) else # MK_IMPLIBONLY -all: $(MK_REGTESTS) $(MK_FULLNAME) $(MK_NOSTRIPNAME) $(SUBDIRS:%=%_all) +all: $(REGTEST_TARGETS) $(MK_FULLNAME) $(MK_NOSTRIPNAME) $(SUBDIRS:%=%_all) ifeq ($(MK_IMPLIB),yes) @@ -943,7 +943,7 @@ $(MK_RC_BINARIES): $(TARGET_RC_BINSRC) $(MK_RESOURCE): $(MK_RC_BINARIES) endif -gen_regtests: +$(REGTEST_TARGETS): tests/tests/* $(REGTESTS) ifeq ($(MK_MODE),user) $(REGTESTS) ./tests/tests ./tests/_regtests.c ./tests/Makefile.tests -u ./tests/_rtstub.c $(MAKE) -C tests TARGET_REGTESTS=no all From 63aeee7369f3801503c1f5ce64dd7a0786672246 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 22 Feb 2004 20:21:05 +0000 Subject: [PATCH 0134/1463] Corrected packing! svn path=/trunk/; revision=8321 --- reactos/w32api/include/ddk/video.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/reactos/w32api/include/ddk/video.h b/reactos/w32api/include/ddk/video.h index fd63f7dff44..c4d4be87924 100644 --- a/reactos/w32api/include/ddk/video.h +++ b/reactos/w32api/include/ddk/video.h @@ -36,8 +36,6 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #if defined(_VIDEOPORT_) @@ -1559,8 +1557,6 @@ VideoPortZeroMemory( #define VideoDebugPrint(x) #endif -#pragma pack(pop) - #ifdef __cplusplus } #endif From cc1c862daec8d9e4aa2af8ede81edd9e084d8d43 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 22 Feb 2004 22:19:42 +0000 Subject: [PATCH 0135/1463] - Added more debugging messages for video port driver Int 10 services. svn path=/trunk/; revision=8322 --- reactos/drivers/video/videoprt/int10.c | 27 +++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/reactos/drivers/video/videoprt/int10.c b/reactos/drivers/video/videoprt/int10.c index 9392a92bac0..34efdef34af 100644 --- a/reactos/drivers/video/videoprt/int10.c +++ b/reactos/drivers/video/videoprt/int10.c @@ -18,7 +18,7 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: int10.c,v 1.1 2004/01/19 15:56:53 navaraf Exp $ + * $Id: int10.c,v 1.2 2004/02/22 22:19:42 navaraf Exp $ */ #include "videoprt.h" @@ -94,18 +94,24 @@ IntInt10AllocateBuffer( Length, MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (!NT_SUCCESS(Status)) { + DPRINT("- ZwAllocateVirtualMemory failed\n"); return STATUS_NO_MEMORY; } if (MemoryAddress > (PVOID)(0x100000 - *Length)) { ZwFreeVirtualMemory(NtCurrentProcess(), &MemoryAddress, Length, MEM_RELEASE); + DPRINT("- Unacceptable memory allocated\n"); return STATUS_NO_MEMORY; } *Seg = (ULONG)MemoryAddress >> 4; *Off = (ULONG)MemoryAddress & 0xFF; + DPRINT("- Segment: %x\n", (ULONG)MemoryAddress >> 4); + DPRINT("- Offset: %x\n", (ULONG)MemoryAddress & 0xFF); + DPRINT("- Length: %x\n", *Length); + return STATUS_SUCCESS; } @@ -117,6 +123,8 @@ IntInt10FreeBuffer( { PVOID MemoryAddress = (PVOID)((Seg << 4) + Off); DPRINT("IntInt10FreeBuffer\n"); + DPRINT("- Segment: %x\n", Seg); + DPRINT("- Offset: %x\n", Off); return ZwFreeVirtualMemory(NtCurrentProcess(), &MemoryAddress, 0, MEM_RELEASE); } @@ -130,6 +138,10 @@ IntInt10ReadMemory( IN ULONG Length) { DPRINT("IntInt10ReadMemory\n"); + DPRINT("- Segment: %x\n", Seg); + DPRINT("- Offset: %x\n", Off); + DPRINT("- Buffer: %x\n", Buffer); + DPRINT("- Length: %x\n", Length); RtlCopyMemory(Buffer, (PVOID)((Seg << 4) + Off), Length); return STATUS_SUCCESS; } @@ -143,6 +155,10 @@ IntInt10WriteMemory( IN ULONG Length) { DPRINT("IntInt10WriteMemory\n"); + DPRINT("- Segment: %x\n", Seg); + DPRINT("- Offset: %x\n", Off); + DPRINT("- Buffer: %x\n", Buffer); + DPRINT("- Length: %x\n", Length); RtlCopyMemory((PVOID)((Seg << 4) + Off), Buffer, Length); return STATUS_SUCCESS; } @@ -175,14 +191,23 @@ IntInt10CallBios( } memset(&Regs, 0, sizeof(Regs)); + DPRINT("- Input register Eax: %x\n", BiosArguments->Eax); Regs.Eax = BiosArguments->Eax; + DPRINT("- Input register Ebx: %x\n", BiosArguments->Ebx); Regs.Ebx = BiosArguments->Ebx; + DPRINT("- Input register Ecx: %x\n", BiosArguments->Ecx); Regs.Ecx = BiosArguments->Ecx; + DPRINT("- Input register Edx: %x\n", BiosArguments->Edx); Regs.Edx = BiosArguments->Edx; + DPRINT("- Input register Esi: %x\n", BiosArguments->Esi); Regs.Esi = BiosArguments->Esi; + DPRINT("- Input register Edi: %x\n", BiosArguments->Edi); Regs.Edi = BiosArguments->Edi; + DPRINT("- Input register Ebp: %x\n", BiosArguments->Ebp); Regs.Ebp = BiosArguments->Ebp; + DPRINT("- Input register SegDs: %x\n", BiosArguments->SegDs); Regs.Ds = BiosArguments->SegDs; + DPRINT("- Input register SegEs: %x\n", BiosArguments->SegEs); Regs.Es = BiosArguments->SegEs; Status = Ke386CallBios(0x10, &Regs); BiosArguments->Eax = Regs.Eax; From 576e14972b7f9e1165610b8dc81a0441912ac4aa Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 22 Feb 2004 22:19:48 +0000 Subject: [PATCH 0136/1463] - Advancing pointer inside loop makes more sense than checking the same structure ModeCount times. svn path=/trunk/; revision=8323 --- reactos/drivers/video/displays/framebuf/screen.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/drivers/video/displays/framebuf/screen.c b/reactos/drivers/video/displays/framebuf/screen.c index 530936e5c3a..95abedddda3 100644 --- a/reactos/drivers/video/displays/framebuf/screen.c +++ b/reactos/drivers/video/displays/framebuf/screen.c @@ -90,7 +90,7 @@ GetAvailableModes( while (ulTemp--) { - if ((ModeInfoPtr->NumberOfPlanes != 1 ) || + if ((ModeInfoPtr->NumberOfPlanes != 1) || !(ModeInfoPtr->AttributeFlags & VIDEO_MODE_GRAPHICS) || ((ModeInfoPtr->BitsPerPlane != 8) && (ModeInfoPtr->BitsPerPlane != 16) && @@ -145,6 +145,8 @@ IntInitScreenInfo( { if (ModeInfoPtr->Length == 0) { + ModeInfoPtr = (PVIDEO_MODE_INFORMATION) + (((PUCHAR)ModeInfoPtr) + ModeInfoSize); continue; } SelectedMode = ModeInfoPtr; From 50103fff09a8417bd9fc82ac21b28dbdd7e1987b Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 22 Feb 2004 22:19:49 +0000 Subject: [PATCH 0137/1463] - Added missing members of GDIINFO structure. svn path=/trunk/; revision=8324 --- reactos/include/ddk/winddi.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/reactos/include/ddk/winddi.h b/reactos/include/ddk/winddi.h index a6f7454d3cd..d6d40fdf533 100644 --- a/reactos/include/ddk/winddi.h +++ b/reactos/include/ddk/winddi.h @@ -589,6 +589,16 @@ typedef struct _GDIINFO ULONG ulBltAlignment; ULONG ulPanningHorzRes; ULONG ulPanningVertRes; + ULONG xPanningAlignment; + ULONG yPanningAlignment; + ULONG cxHTPat; + ULONG cyHTPat; + LPBYTE pHTPatA; + LPBYTE pHTPatB; + LPBYTE pHTPatC; + ULONG flShadeBlend; + ULONG ulPhysicalPixelCharacteristics; + ULONG ulPhysicalPixelGamma; } GDIINFO, *PGDIINFO; typedef struct _BRUSHOBJ From 0970df8771ceb3280c27d91f869114a001ac1195 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Sun, 22 Feb 2004 23:40:58 +0000 Subject: [PATCH 0138/1463] Implement system menus svn path=/trunk/; revision=8325 --- reactos/ChangeLog | 1 + reactos/lib/user32/user32.rc | 21 ++-- reactos/lib/user32/windows/defwnd.c | 4 +- reactos/lib/user32/windows/menu.c | 138 +++++++++++++++++-------- reactos/lib/user32/windows/nonclient.c | 82 +++++++++++++++ reactos/lib/user32/windows/window.c | 41 +------- reactos/subsys/win32k/include/menu.h | 3 + reactos/subsys/win32k/ntuser/menu.c | 8 +- reactos/subsys/win32k/ntuser/window.c | 61 +++++++---- 9 files changed, 238 insertions(+), 121 deletions(-) diff --git a/reactos/ChangeLog b/reactos/ChangeLog index b82d408a3db..16a39332003 100644 --- a/reactos/ChangeLog +++ b/reactos/ChangeLog @@ -1,6 +1,7 @@ 2004-02-22 Ge van Geldorp <ge@gse.nl> * Implement keyboard navigation for menus + * Implement system menus 2004-02-22 Casper S. Hornstrup <chorns@users.sourceforge.net> diff --git a/reactos/lib/user32/user32.rc b/reactos/lib/user32/user32.rc index 1ec2aa8ab4b..35b36cfd4ad 100644 --- a/reactos/lib/user32/user32.rc +++ b/reactos/lib/user32/user32.rc @@ -119,20 +119,13 @@ EDITMENU MENU LOADONCALL MOVEABLE DISCARDABLE SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE { - POPUP "" - { - MENUITEM "&Restore", 61728 - MENUITEM "&Move", 61456 - MENUITEM "&Size", 61440 - MENUITEM "Mi&nimize", 61472 - MENUITEM "Ma&ximize", 61488 - MENUITEM SEPARATOR - MENUITEM "&Close\tAlt-F4", 61536 - //MENUITEM SEPARATOR - //MENUITEM "&Switch to ...\tCtrl-Esc", 61744 - //MENUITEM SEPARATOR - //MENUITEM "&About ReactOS ...", 61761 - } + MENUITEM "&Restore", 61728 + MENUITEM "&Move", 61456 + MENUITEM "&Size", 61440 + MENUITEM "Mi&nimize", 61472 + MENUITEM "Ma&ximize", 61488 + MENUITEM SEPARATOR + MENUITEM "&Close\tAlt-F4", 61536 } ///////////////////////////////////////////////////////////////////////////// diff --git a/reactos/lib/user32/windows/defwnd.c b/reactos/lib/user32/windows/defwnd.c index 6927255d0a6..035fabbba3c 100644 --- a/reactos/lib/user32/windows/defwnd.c +++ b/reactos/lib/user32/windows/defwnd.c @@ -1,4 +1,4 @@ -/* $Id: defwnd.c,v 1.123 2004/01/26 08:44:51 weiden Exp $ +/* $Id: defwnd.c,v 1.124 2004/02/22 23:40:58 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -817,7 +817,7 @@ DefWndHandleSysCommand(HWND hWnd, WPARAM wParam, POINT Pt) SendMessageA(hWnd, WM_CLOSE, 0, 0); break; case SC_MOUSEMENU: - MenuTrackMouseMenuBar(hWnd, wParam, Pt); + MenuTrackMouseMenuBar(hWnd, wParam & 0x000f, Pt); break; case SC_KEYMENU: MenuTrackKbdMenuBar(hWnd, wParam, Pt.x); diff --git a/reactos/lib/user32/windows/menu.c b/reactos/lib/user32/windows/menu.c index 9af3f8e64de..bd69c6ada5a 100644 --- a/reactos/lib/user32/windows/menu.c +++ b/reactos/lib/user32/windows/menu.c @@ -21,7 +21,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: menu.c,v 1.49 2004/02/22 18:04:52 gvg Exp $ +/* $Id: menu.c,v 1.50 2004/02/22 23:40:58 gvg Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/menu.c @@ -1928,6 +1928,35 @@ MenuMoveSelection(HWND WndOwner, PROSMENUINFO MenuInfo, INT Offset) MenuCleanupRosMenuItemInfo(&ItemInfo); } +/*********************************************************************** + * MenuInitSysMenuPopup + * + * Grey the appropriate items in System menu. + */ +static void FASTCALL +MenuInitSysMenuPopup(HMENU Menu, DWORD Style, DWORD ClsStyle ) +{ + BOOL Gray; + + Gray = 0 == (Style & WS_THICKFRAME) || 0 != (Style & (WS_MAXIMIZE | WS_MINIMIZE)); + EnableMenuItem(Menu, SC_SIZE, (Gray ? MF_GRAYED : MF_ENABLED)); + Gray = 0 != (Style & WS_MAXIMIZE); + EnableMenuItem(Menu, SC_MOVE, (Gray ? MF_GRAYED : MF_ENABLED)); + Gray = 0 == (Style & WS_MINIMIZEBOX) || 0 != (Style & WS_MINIMIZE); + EnableMenuItem(Menu, SC_MINIMIZE, (Gray ? MF_GRAYED : MF_ENABLED)); + Gray = 0 == (Style & WS_MAXIMIZEBOX) || 0 != (Style & WS_MAXIMIZE); + EnableMenuItem(Menu, SC_MAXIMIZE, (Gray ? MF_GRAYED : MF_ENABLED)); + Gray = 0 == (Style & (WS_MAXIMIZE | WS_MINIMIZE)); + EnableMenuItem(Menu, SC_RESTORE, (Gray ? MF_GRAYED : MF_ENABLED)); + Gray = 0 != (ClsStyle & CS_NOCLOSE); + + /* The menu item must keep its state if it's disabled */ + if (Gray) + { + EnableMenuItem(Menu, SC_CLOSE, MF_GRAYED); + } +} + /*********************************************************************** * MenuShowSubPopup * @@ -1937,6 +1966,7 @@ MenuMoveSelection(HWND WndOwner, PROSMENUINFO MenuInfo, INT Offset) static HMENU FASTCALL MenuShowSubPopup(HWND WndOwner, PROSMENUINFO MenuInfo, BOOL SelectFirst, UINT Flags) { + extern void FASTCALL NcGetSysPopupPos(HWND Wnd, RECT *Rect); RECT Rect; ROSMENUITEMINFO ItemInfo; ROSMENUINFO SubMenuInfo; @@ -2012,16 +2042,14 @@ MenuShowSubPopup(HWND WndOwner, PROSMENUINFO MenuInfo, BOOL SelectFirst, UINT Fl if (IS_SYSTEM_MENU(MenuInfo)) { -#if 0 /* FIXME */ - MENU_InitSysMenuPopup(item->hSubMenu, - GetWindowLongW( menu->hWnd, GWL_STYLE ), - GetClassLongW( menu->hWnd, GCL_STYLE)); + MenuInitSysMenuPopup(ItemInfo.hSubMenu, + GetWindowLongW(MenuInfo->Wnd, GWL_STYLE ), + GetClassLongW(MenuInfo->Wnd, GCL_STYLE)); - NC_GetSysPopupPos( menu->hWnd, &rect ); - rect.top = rect.bottom; - rect.right = GetSystemMetrics(SM_CXSIZE); - rect.bottom = GetSystemMetrics(SM_CYSIZE); -#endif + NcGetSysPopupPos(MenuInfo->Wnd, &Rect); + Rect.top = Rect.bottom; + Rect.right = GetSystemMetrics(SM_CXSIZE); + Rect.bottom = GetSystemMetrics(SM_CYSIZE); } else { @@ -2345,11 +2373,7 @@ MenuPtMenu(HMENU Menu, POINT Pt) } else if (HTSYSMENU == Ht) { -#if 0 /* FIXME */ - Ret = get_win_sys_menu( menu->hWnd ); -#else - Ret = NULL; -#endif + Ret = NtUserGetSystemMenu(MenuInfo.Wnd, FALSE); } else if (HTMENU == Ht) { @@ -2529,7 +2553,6 @@ MenuGetSubPopup(HMENU Menu) static LRESULT FASTCALL MenuDoNextMenu(MTRACKER* Mt, UINT Vk) { -#if 0 /* FIXME */ ROSMENUINFO TopMenuInfo; ROSMENUINFO MenuInfo; @@ -2579,10 +2602,8 @@ MenuDoNextMenu(MTRACKER* Mt, UINT Vk) } else if (0 != (Style & WS_SYSMENU)) { -#if 0 /* FIXME */ /* switch to the system menu */ - NewMenu = get_win_sys_menu(NewWnd); -#endif + NewMenu = NtUserGetSystemMenu(NewWnd, FALSE); } else { @@ -2598,17 +2619,13 @@ MenuDoNextMenu(MTRACKER* Mt, UINT Vk) { DWORD Style = GetWindowLongW(NewWnd, GWL_STYLE); -#if 0 /* FIXME */ if (0 != (Style & WS_SYSMENU) - && GetSubMenu(get_win_sys_menu(NewWnd), 0) == NewMenu) + && GetSystemMenu(NewWnd, FALSE) == NewMenu) { /* get the real system menu */ - NewMenu = get_win_sys_menu(NewWnd); + NewMenu = NtUserGetSystemMenu(NewWnd, FALSE); } else if (0 != (Style & WS_CHILD) || GetMenu(NewWnd) != NewMenu) -#else - if (0 != (Style & WS_CHILD) || GetMenu(NewWnd) != NewMenu) -#endif { /* FIXME: Not sure what to do here; * perhaps try to track NewMenu as a popup? */ @@ -2647,7 +2664,6 @@ MenuDoNextMenu(MTRACKER* Mt, UINT Vk) return TRUE; } -#endif return FALSE; } @@ -2894,15 +2910,24 @@ static UINT FASTCALL MenuFindItemByKey(HWND WndOwner, PROSMENUINFO MenuInfo, WCHAR Key, BOOL ForceMenuChar) { + ROSMENUINFO SysMenuInfo; PROSMENUITEMINFO Items, ItemInfo; LRESULT MenuChar; UINT i; DPRINT("\tlooking for '%c' (0x%02x) in [%p]\n", (char) Key, Key, MenuInfo); -#if 0 /* FIXME */ - if (! IsMenu( hmenu )) hmenu = GetSubMenu( get_win_sys_menu(hwndOwner), 0); -#endif + if (NULL == MenuInfo || ! IsMenu(MenuInfo->Self)) + { + if (MenuGetRosMenuInfo(&SysMenuInfo, GetSystemMenu(WndOwner, FALSE))) + { + MenuInfo = &SysMenuInfo; + } + else + { + MenuInfo = NULL; + } + } if (NULL != MenuInfo) { @@ -3328,19 +3353,8 @@ MenuExitTracking(HWND Wnd) VOID MenuTrackMouseMenuBar(HWND Wnd, ULONG Ht, POINT Pt) { -#if 0 /* FIXME */ - HMENU Menu = (ht == HTSYSMENU) ? get_win_sys_menu( Wnd ) : GetMenu( Wnd ); + HMENU Menu = (HTSYSMENU == Ht) ? NtUserGetSystemMenu(Wnd, FALSE) : GetMenu(Wnd); UINT Flags = TPM_ENTERIDLEEX | TPM_BUTTONDOWN | TPM_LEFTALIGN | TPM_LEFTBUTTON; -#else - HMENU Menu; - UINT Flags = TPM_ENTERIDLEEX | TPM_BUTTONDOWN | TPM_LEFTALIGN | TPM_LEFTBUTTON; - - if (HTSYSMENU == Ht) - { - return; - } - Menu = GetMenu(Wnd); -#endif DPRINT("wnd=%p ht=0x%04x (%ld,%ld)\n", Wnd, Ht, pt.x, pt.y); @@ -3760,10 +3774,26 @@ GetSubMenu( if (NtUserMenuItemInfo(hMenu, (UINT)nPos, MF_BYPOSITION, &mi, FALSE)) { - return mi.hSubMenu; + return IsMenu(mi.hSubMenu) ? mi.hSubMenu : NULL; } - return (HMENU)0; + return NULL; +} + +/* + * @implemented + */ +HMENU +STDCALL +GetSystemMenu( + HWND hWnd, + BOOL bRevert) +{ + HMENU TopMenu; + + TopMenu = NtUserGetSystemMenu(hWnd, bRevert); + + return NULL == TopMenu ? NULL : GetSubMenu(TopMenu, 0); } @@ -4259,6 +4289,28 @@ SetMenuItemInfoW( return FALSE; } +/* + * @implemented + */ +BOOL +STDCALL +SetSystemMenu ( + HWND hwnd, + HMENU hMenu) +{ + if(!hwnd) + { + SetLastError(ERROR_INVALID_WINDOW_HANDLE); + return FALSE; + } + if(!hMenu) + { + SetLastError(ERROR_INVALID_MENU_HANDLE); + return FALSE; + } + return NtUserSetSystemMenu(hwnd, hMenu); +} + /* * @implemented diff --git a/reactos/lib/user32/windows/nonclient.c b/reactos/lib/user32/windows/nonclient.c index 842ae1597b9..b9c90b6f9b6 100644 --- a/reactos/lib/user32/windows/nonclient.c +++ b/reactos/lib/user32/windows/nonclient.c @@ -1321,3 +1321,85 @@ DrawCaptionTempA( UNIMPLEMENTED; return FALSE; } + +/*********************************************************************** + * NcGetInsideRect + * + * Get the 'inside' rectangle of a window, i.e. the whole window rectangle + * but without the borders (if any). + * The rectangle is in window coordinates (for drawing with GetWindowDC()). + */ +static void FASTCALL +NcGetInsideRect(HWND Wnd, RECT *Rect) +{ + DWORD Style; + DWORD ExStyle; + + GetWindowRect(Wnd, Rect); + Rect->right = Rect->right - Rect->left; + Rect->left = 0; + Rect->bottom = Rect->bottom - Rect->top; + Rect->top = 0; + + Style = GetWindowLongW(Wnd, GWL_STYLE); + if (0 != (Style & WS_ICONIC)) + { + return; + } + + /* Remove frame from rectangle */ + ExStyle = GetWindowLongW(Wnd, GWL_EXSTYLE); + if (HAS_THICKFRAME(Style, ExStyle)) + { + InflateRect(Rect, - GetSystemMetrics(SM_CXFRAME), - GetSystemMetrics(SM_CYFRAME)); + } + else if (HAS_DLGFRAME(Style, ExStyle)) + { + InflateRect(Rect, - GetSystemMetrics(SM_CXDLGFRAME), - GetSystemMetrics(SM_CYDLGFRAME)); + } + else if (HAS_THINFRAME(Style, ExStyle)) + { + InflateRect(Rect, - GetSystemMetrics(SM_CXBORDER), - GetSystemMetrics(SM_CYBORDER)); + } + + /* We have additional border information if the window + * is a child (but not an MDI child) */ + if (0 != (Style & WS_CHILD) + && 0 == (ExStyle & WS_EX_MDICHILD)) + { + if (0 != (ExStyle & WS_EX_CLIENTEDGE)) + { + InflateRect(Rect, - GetSystemMetrics(SM_CXEDGE), - GetSystemMetrics(SM_CYEDGE)); + } + if (0 != (ExStyle & WS_EX_STATICEDGE)) + { + InflateRect(Rect, - GetSystemMetrics(SM_CXBORDER), - GetSystemMetrics(SM_CYBORDER)); + } + } +} + +/*********************************************************************** + * NcGetSysPopupPos + */ +void FASTCALL +NcGetSysPopupPos(HWND Wnd, RECT *Rect) +{ + RECT WindowRect; + + if (IsIconic(Wnd)) + { + GetWindowRect(Wnd, Rect); + } + else + { + NcGetInsideRect(Wnd, Rect); + GetWindowRect(Wnd, &WindowRect); + OffsetRect(Rect, WindowRect.left, WindowRect.top); + if (0 != (GetWindowLongW(Wnd, GWL_STYLE) & WS_CHILD)) + { + ClientToScreen(GetParent(Wnd), (POINT *) Rect); + } + Rect->right = Rect->left + GetSystemMetrics(SM_CYCAPTION) - 1; + Rect->bottom = Rect->top + GetSystemMetrics(SM_CYCAPTION) - 1; + } +} diff --git a/reactos/lib/user32/windows/window.c b/reactos/lib/user32/windows/window.c index 953322c341b..18bb95fb406 100644 --- a/reactos/lib/user32/windows/window.c +++ b/reactos/lib/user32/windows/window.c @@ -1,4 +1,4 @@ -/* $Id: window.c,v 1.98 2004/02/02 11:46:41 ea Exp $ +/* $Id: window.c,v 1.99 2004/02/22 23:40:58 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -1462,45 +1462,6 @@ SetLastErrorEx(DWORD dwErrCode, DWORD dwType) SetLastError(dwErrCode); } -/* - * @implemented - */ -BOOL -STDCALL -SetSystemMenu ( - HWND hwnd, - HMENU hMenu) -{ - if(!hwnd) - { - SetLastError(ERROR_INVALID_WINDOW_HANDLE); - return FALSE; - } - if(!hMenu) - { - SetLastError(ERROR_INVALID_MENU_HANDLE); - return FALSE; - } - return NtUserSetSystemMenu(hwnd, hMenu); -} - -/* - * @implemented - */ -HMENU -STDCALL -GetSystemMenu( - HWND hWnd, - BOOL bRevert) -{ - if(!hWnd) - { - SetLastError(ERROR_INVALID_WINDOW_HANDLE); - return (HMENU)0; - } - return NtUserGetSystemMenu(hWnd, bRevert); -} - /* * @implemented */ diff --git a/reactos/subsys/win32k/include/menu.h b/reactos/subsys/win32k/include/menu.h index 83ce0984df6..cc54ecff07a 100644 --- a/reactos/subsys/win32k/include/menu.h +++ b/reactos/subsys/win32k/include/menu.h @@ -101,6 +101,9 @@ IntSetMenuItemRect(PMENU_OBJECT MenuObject, UINT Item, BOOL fByPos, RECT *rcRect BOOL FASTCALL IntCleanupMenus(struct _EPROCESS *Process, PW32PROCESS Win32Process); +BOOL FASTCALL +IntInsertMenuItem(PMENU_OBJECT MenuObject, UINT uItem, BOOL fByPosition, + PROSMENUITEMINFO ItemInfo); NTSTATUS FASTCALL diff --git a/reactos/subsys/win32k/ntuser/menu.c b/reactos/subsys/win32k/ntuser/menu.c index ffddad0ac5e..dddff914113 100644 --- a/reactos/subsys/win32k/ntuser/menu.c +++ b/reactos/subsys/win32k/ntuser/menu.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: menu.c,v 1.47 2004/02/22 18:04:52 gvg Exp $ +/* $Id: menu.c,v 1.48 2004/02/22 23:40:58 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -763,8 +763,8 @@ IntSetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, PROSMENUITEMINF } else { - FreeMenuText(MenuItem); - MenuItem->fType = MF_SEPARATOR; + MenuItem->fType |= MF_SEPARATOR; + RtlInitUnicodeString(&MenuItem->Text, NULL); } } else @@ -781,7 +781,7 @@ IntSetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, PROSMENUITEMINF return TRUE; } -static BOOL FASTCALL +BOOL FASTCALL IntInsertMenuItem(PMENU_OBJECT MenuObject, UINT uItem, BOOL fByPosition, PROSMENUITEMINFO ItemInfo) { diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index a6df96b5847..5f58d6ea6c9 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.189 2004/02/22 15:14:27 navaraf Exp $ +/* $Id: window.c,v 1.190 2004/02/22 23:40:58 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -589,9 +589,10 @@ IntGetParent(PWINDOW_OBJECT Wnd) PMENU_OBJECT FASTCALL IntGetSystemMenu(PWINDOW_OBJECT WindowObject, BOOL bRevert, BOOL RetMenu) { - PMENU_OBJECT MenuObject, NewMenuObject, ret = NULL; + PMENU_OBJECT MenuObject, NewMenuObject, SysMenuObject, ret = NULL; PW32PROCESS W32Process; - HMENU NewMenu; + HMENU NewMenu, SysMenu; + ROSMENUITEMINFO ItemInfo; if(bRevert) { @@ -623,6 +624,7 @@ IntGetSystemMenu(PWINDOW_OBJECT WindowObject, BOOL bRevert, BOOL RetMenu) { WindowObject->SystemMenu = NewMenuObject->MenuInfo.Self; NewMenuObject->MenuInfo.Flags |= MF_SYSMENU; + NewMenuObject->MenuInfo.Wnd = WindowObject->Self; ret = NewMenuObject; //IntReleaseMenuObject(NewMenuObject); } @@ -630,20 +632,53 @@ IntGetSystemMenu(PWINDOW_OBJECT WindowObject, BOOL bRevert, BOOL RetMenu) } else { + SysMenu = NtUserCreateMenu(FALSE); + if (NULL == SysMenu) + { + return NULL; + } + SysMenuObject = IntGetMenuObject(SysMenu); + if (NULL == SysMenuObject) + { + NtUserDestroyMenu(SysMenu); + return NULL; + } + SysMenuObject->MenuInfo.Flags |= MF_SYSMENU; + SysMenuObject->MenuInfo.Wnd = WindowObject->Self; NewMenu = IntLoadSysMenuTemplate(); if(!NewMenu) + { + IntReleaseMenuObject(SysMenuObject); + NtUserDestroyMenu(SysMenu); return NULL; + } MenuObject = IntGetMenuObject(NewMenu); if(!MenuObject) + { + IntReleaseMenuObject(SysMenuObject); + NtUserDestroyMenu(SysMenu); return NULL; + } NewMenuObject = IntCloneMenu(MenuObject); if(NewMenuObject) { - WindowObject->SystemMenu = NewMenuObject->MenuInfo.Self; - NewMenuObject->MenuInfo.Flags |= MF_SYSMENU; - ret = NewMenuObject; - //IntReleaseMenuObject(NewMenuObject); + NewMenuObject->MenuInfo.Flags |= MF_SYSMENU | MF_POPUP; + IntReleaseMenuObject(NewMenuObject); + NtUserSetMenuDefaultItem(NewMenuObject->MenuInfo.Self, SC_CLOSE, FALSE); + + ItemInfo.cbSize = sizeof(MENUITEMINFOW); + ItemInfo.fMask = MIIM_FTYPE | MIIM_STRING | MIIM_STATE | MIIM_SUBMENU; + ItemInfo.fType = MF_POPUP; + ItemInfo.fState = MFS_ENABLED; + ItemInfo.dwTypeData = NULL; + ItemInfo.cch = 0; + ItemInfo.hSubMenu = NewMenuObject->MenuInfo.Self; + IntInsertMenuItem(SysMenuObject, (UINT) -1, TRUE, &ItemInfo); + + WindowObject->SystemMenu = SysMenuObject->MenuInfo.Self; + + ret = SysMenuObject; } IntDestroyMenuObject(MenuObject, FALSE, TRUE); IntReleaseMenuObject(MenuObject); @@ -2317,17 +2352,7 @@ NtUserGetSystemMenu(HWND hWnd, BOOL bRevert) MenuObject = IntGetSystemMenu(WindowObject, bRevert, FALSE); if (MenuObject) { - /* - * Return the handle of the first submenu. - */ - ExAcquireFastMutexUnsafe(&MenuObject->MenuItemsLock); - if (MenuObject->MenuItemList) - { - Result = MenuObject->MenuItemList->hSubMenu; - if (!IntIsMenu(Result)) - Result = 0; - } - ExReleaseFastMutexUnsafe(&MenuObject->MenuItemsLock); + Result = MenuObject->MenuInfo.Self; IntReleaseMenuObject(MenuObject); } From 8265b68f5161f5d1181289c802e47a65388c9f16 Mon Sep 17 00:00:00 2001 From: Jason Filby <jason.filby@gmail.com> Date: Mon, 23 Feb 2004 04:29:39 +0000 Subject: [PATCH 0139/1463] Add Everaldo to credits svn path=/trunk/; revision=8326 --- reactos/CREDITS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/reactos/CREDITS b/reactos/CREDITS index 214a1645939..f9853e3c96b 100644 --- a/reactos/CREDITS +++ b/reactos/CREDITS @@ -47,6 +47,10 @@ David Welch <welch@cwcom.net> Jonathan Wilson <jonwil@tpgi.com.au> Art Yerkes <ayerkes@speakeasy.net> +Graphic Design from + +Everaldo (http://everaldo.com) for Explorer icons + Source and inspiration from WINE (http://www.winehq.com) From 2beb8b39ac8f469ca62e5b8b34d1c2e71ff6eaf2 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Mon, 23 Feb 2004 11:53:00 +0000 Subject: [PATCH 0140/1463] * lib/fmifs * lib/fslib/fvatlib Convert Win32 types to native svn path=/trunk/; revision=8328 --- reactos/include/fmifs.h | 45 +++++++++++++++------------------ reactos/include/fslib/vfatlib.h | 20 +++++++-------- 2 files changed, 30 insertions(+), 35 deletions(-) diff --git a/reactos/include/fmifs.h b/reactos/include/fmifs.h index 2570dce80b1..ba398f57ba9 100644 --- a/reactos/include/fmifs.h +++ b/reactos/include/fmifs.h @@ -1,6 +1,6 @@ #ifndef _FMIFS_H #define _FMIFS_H -/* $Id: fmifs.h,v 1.2 2000/04/25 23:22:48 ea Exp $ +/* $Id: fmifs.h,v 1.3 2004/02/23 11:52:39 ekohl Exp $ * * fmifs.h * @@ -17,15 +17,12 @@ * Normalized function names. * */ -#ifndef _INC_WINDOWS_ -#include <windows.h> -#endif /* Output command */ typedef struct { - DWORD Lines; + ULONG Lines; PCHAR Output; } TEXTOUTPUT, *PTEXTOUTPUT; @@ -57,10 +54,10 @@ enum /* FMIFS callback definition */ typedef -BOOL +BOOLEAN (STDCALL * PFMIFSCALLBACK) ( CALLBACKCOMMAND Command, - DWORD SubAction, + ULONG SubAction, PVOID ActionInfo ); @@ -68,13 +65,13 @@ BOOL VOID STDCALL Chkdsk( - PWCHAR DriveRoot, + PWCHAR DriveRoot, PWCHAR Format, - BOOL CorrectErrors, - BOOL Verbose, - BOOL CheckOnlyIfDirty, - BOOL ScanDrive, - PVOID Unused2, + BOOLEAN CorrectErrors, + BOOLEAN Verbose, + BOOLEAN CheckOnlyIfDirty, + BOOLEAN ScanDrive, + PVOID Unused2, PVOID Unused3, PFMIFSCALLBACK Callback ); @@ -83,13 +80,13 @@ Chkdsk( VOID STDCALL ChkDskEx( - PWCHAR DriveRoot, + PWCHAR DriveRoot, PWCHAR Format, - BOOL CorrectErrors, - BOOL Verbose, - BOOL CheckOnlyIfDirty, - BOOL ScanDrive, - PVOID Unused2, + BOOLEAN CorrectErrors, + BOOLEAN Verbose, + BOOLEAN CheckOnlyIfDirty, + BOOLEAN ScanDrive, + PVOID Unused2, PVOID Unused3, PFMIFSCALLBACK Callback ); @@ -101,11 +98,11 @@ STDCALL DiskCopy(VOID); /* Enable/Disable volume compression */ -BOOL +BOOLEAN STDCALL EnableVolumeCompression( PWCHAR DriveRoot, - BOOL Enable + BOOLEAN Enable ); /* Format command in FMIFS */ @@ -118,11 +115,11 @@ VOID STDCALL FormatEx( PWCHAR DriveRoot, - DWORD MediaFlag, + ULONG MediaFlag, PWCHAR Format, PWCHAR Label, - BOOL QuickFormat, - DWORD ClusterSize, + BOOLEAN QuickFormat, + ULONG ClusterSize, PFMIFSCALLBACK Callback ); diff --git a/reactos/include/fslib/vfatlib.h b/reactos/include/fslib/vfatlib.h index c8246389a40..c1259ff481c 100755 --- a/reactos/include/fslib/vfatlib.h +++ b/reactos/include/fslib/vfatlib.h @@ -9,20 +9,18 @@ #include <fmifs.h> +NTSTATUS +VfatInitialize (VOID); NTSTATUS -VfatInitialize(); +VfatCleanup (VOID); NTSTATUS -VfatCleanup(); - -NTSTATUS -VfatFormat( - PUNICODE_STRING DriveRoot, - DWORD MediaFlag, - PUNICODE_STRING Label, - BOOL QuickFormat, - DWORD ClusterSize, - PFMIFSCALLBACK Callback); +VfatFormat (PUNICODE_STRING DriveRoot, + ULONG MediaFlag, + PUNICODE_STRING Label, + BOOLEAN QuickFormat, + ULONG ClusterSize, + PFMIFSCALLBACK Callback); #endif /*__VFATLIB_H */ From 2b197a92e6617e80f81686ebe113f9db7c16b84e Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Mon, 23 Feb 2004 11:55:12 +0000 Subject: [PATCH 0141/1463] * lib/fmifs * lib/fslib/fvatlib Convert Win32 types to native InitializeFmIfs() is the DLL entry point svn path=/trunk/; revision=8329 --- reactos/lib/fmifs/chkdsk.c | 39 ++++++++----------- reactos/lib/fmifs/compress.c | 14 +++---- reactos/lib/fmifs/diskcopy.c | 7 ++-- reactos/lib/fmifs/dllmain.c | 27 -------------- reactos/lib/fmifs/extend.c | 7 ++-- reactos/lib/fmifs/fmifs.def | 4 +- reactos/lib/fmifs/fmifs.edf | 4 +- reactos/lib/fmifs/format.c | 72 ++++++++++++++++++------------------ reactos/lib/fmifs/init.c | 39 ++++++++++++++----- reactos/lib/fmifs/label.c | 8 ++-- reactos/lib/fmifs/makefile | 15 ++++---- reactos/lib/fmifs/media.c | 8 ++-- 12 files changed, 109 insertions(+), 135 deletions(-) delete mode 100644 reactos/lib/fmifs/dllmain.c diff --git a/reactos/lib/fmifs/chkdsk.c b/reactos/lib/fmifs/chkdsk.c index 07846dfc9dc..834f778c4c9 100644 --- a/reactos/lib/fmifs/chkdsk.c +++ b/reactos/lib/fmifs/chkdsk.c @@ -1,4 +1,4 @@ -/* $Id: chkdsk.c,v 1.1 1999/05/11 21:19:41 ea Exp $ +/* $Id: chkdsk.c,v 1.2 2004/02/23 11:55:12 ekohl Exp $ * * COPYING: See the top level directory * PROJECT: ReactOS @@ -16,37 +16,30 @@ /* FMIFS.1 */ -VOID -__stdcall -Chkdsk( - PWCHAR DriveRoot, +VOID STDCALL +Chkdsk (PWCHAR DriveRoot, PWCHAR Format, - BOOL CorrectErrors, - BOOL Verbose, - BOOL CheckOnlyIfDirty, - BOOL ScanDrive, - PVOID Unused2, + BOOLEAN CorrectErrors, + BOOLEAN Verbose, + BOOLEAN CheckOnlyIfDirty, + BOOLEAN ScanDrive, + PVOID Unused2, PVOID Unused3, - PFMIFSCALLBACK Callback - ) + PFMIFSCALLBACK Callback) { - BOOL Argument = FALSE; + BOOLEAN Argument = FALSE; - /* FAIL immediately */ - Callback( - DONE, /* Command */ - 0, /* DWORD Modifier */ - & Argument /* Argument */ - ); + /* FAIL immediately */ + Callback (DONE, /* Command */ + 0, /* DWORD Modifier */ + &Argument); /* Argument */ } /* FMIFS.2 (SP4 only?) */ -VOID -__stdcall -ChkdskEx(VOID) +VOID STDCALL +ChkdskEx (VOID) { } - /* EOF */ diff --git a/reactos/lib/fmifs/compress.c b/reactos/lib/fmifs/compress.c index 3dc431e0ead..c07e7e57484 100644 --- a/reactos/lib/fmifs/compress.c +++ b/reactos/lib/fmifs/compress.c @@ -1,4 +1,4 @@ -/* $Id: compress.c,v 1.1 1999/05/11 21:19:41 ea Exp $ +/* $Id: compress.c,v 1.2 2004/02/23 11:55:12 ekohl Exp $ * * COPYING: See the top level directory * PROJECT: ReactOS @@ -16,15 +16,11 @@ /* FMIFS.4 */ -BOOL -__stdcall -EnableVolumeCompression( - PWCHAR DriveRoot, - BOOL Enable - ) +BOOLEAN STDCALL +EnableVolumeCompression (PWCHAR DriveRoot, + BOOLEAN Enable) { - return FALSE; + return FALSE; } - /* EOF */ diff --git a/reactos/lib/fmifs/diskcopy.c b/reactos/lib/fmifs/diskcopy.c index 63a89ce19a3..05c5d53f28b 100644 --- a/reactos/lib/fmifs/diskcopy.c +++ b/reactos/lib/fmifs/diskcopy.c @@ -1,4 +1,4 @@ -/* $Id: diskcopy.c,v 1.1 1999/05/11 21:19:41 ea Exp $ +/* $Id: diskcopy.c,v 1.2 2004/02/23 11:55:12 ekohl Exp $ * * COPYING: See the top level directory * PROJECT: ReactOS @@ -15,9 +15,8 @@ #include <fmifs.h> /* FMIFS.3 */ -VOID -__stdcall -DiskCopy(VOID) +VOID STDCALL +DiskCopy (VOID) { } diff --git a/reactos/lib/fmifs/dllmain.c b/reactos/lib/fmifs/dllmain.c deleted file mode 100644 index 9c3c07d939c..00000000000 --- a/reactos/lib/fmifs/dllmain.c +++ /dev/null @@ -1,27 +0,0 @@ -/* $Id: dllmain.c,v 1.2 2000/04/25 23:22:53 ea Exp $ - * - * ReactOS FMIFS.DLL - */ -#include <windows.h> -BOOLEAN -__stdcall -DllMain( - PVOID hinstDll, - ULONG dwReason, - PVOID reserved - ) -{ - switch (dwReason) - { - case DLL_PROCESS_ATTACH: - break; - case DLL_THREAD_ATTACH: - break; - case DLL_THREAD_DETACH: - break; - case DLL_PROCESS_DETACH: - break; - } - return (TRUE); -} -/* EOF */ diff --git a/reactos/lib/fmifs/extend.c b/reactos/lib/fmifs/extend.c index d597f382d47..edc4334a92f 100644 --- a/reactos/lib/fmifs/extend.c +++ b/reactos/lib/fmifs/extend.c @@ -1,4 +1,4 @@ -/* $Id: extend.c,v 1.1 1999/05/11 21:19:41 ea Exp $ +/* $Id: extend.c,v 1.2 2004/02/23 11:55:12 ekohl Exp $ * * COPYING: See the top level directory * PROJECT: ReactOS @@ -15,9 +15,8 @@ #include <fmifs.h> /* FMIFS.5 */ -VOID -__stdcall -Extend(VOID) +VOID STDCALL +Extend (VOID) { } diff --git a/reactos/lib/fmifs/fmifs.def b/reactos/lib/fmifs/fmifs.def index 01e3da501ed..ee15bacf61d 100644 --- a/reactos/lib/fmifs/fmifs.def +++ b/reactos/lib/fmifs/fmifs.def @@ -1,4 +1,4 @@ -; $Id: fmifs.def,v 1.5 2003/09/08 09:56:56 weiden Exp $ +; $Id: fmifs.def,v 1.6 2004/02/23 11:55:12 ekohl Exp $ ; ; fmifs.def ; @@ -21,7 +21,7 @@ Extend@0 Format@0 FormatEx@28 ;FormatEx2 -InitializeFmIfs@0 +InitializeFmIfs@12 ;QueryAvailableFileSystemFormat ;QueryDeviceInformation ;QueryDeviceInformationByHandle diff --git a/reactos/lib/fmifs/fmifs.edf b/reactos/lib/fmifs/fmifs.edf index b83f8c568b3..8b9deb9ed79 100644 --- a/reactos/lib/fmifs/fmifs.edf +++ b/reactos/lib/fmifs/fmifs.edf @@ -1,4 +1,4 @@ -; $Id: fmifs.edf,v 1.3 2003/09/08 09:56:56 weiden Exp $ +; $Id: fmifs.edf,v 1.4 2004/02/23 11:55:12 ekohl Exp $ ; ; fmifs.def ; @@ -21,7 +21,7 @@ Extend=Extend@0 Format=Format@0 FormatEx=FormatEx@28 ;FormatEx2 -InitializeFmIfs=InitializeFmIfs@0 +InitializeFmIfs=InitializeFmIfs@12 ;QueryAvailableFileSystemFormat ;QueryDeviceInformation ;QueryDeviceInformationByHandle diff --git a/reactos/lib/fmifs/format.c b/reactos/lib/fmifs/format.c index 30b2cceada4..667b6899a9d 100644 --- a/reactos/lib/fmifs/format.c +++ b/reactos/lib/fmifs/format.c @@ -1,4 +1,4 @@ -/* $Id: format.c,v 1.3 2003/09/12 17:51:46 vizzini Exp $ +/* $Id: format.c,v 1.4 2004/02/23 11:55:12 ekohl Exp $ * * COPYING: See the top level directory * PROJECT: ReactOS @@ -21,51 +21,49 @@ /* FMIFS.6 */ -VOID -__stdcall -Format(VOID) +VOID STDCALL +Format (VOID) { } /* FMIFS.7 */ -VOID -__stdcall -FormatEx( - PWCHAR DriveRoot, - DWORD MediaFlag, - PWCHAR Format, - PWCHAR Label, - BOOL QuickFormat, - DWORD ClusterSize, - PFMIFSCALLBACK Callback - ) +VOID STDCALL +FormatEx (PWCHAR DriveRoot, + ULONG MediaFlag, + PWCHAR Format, + PWCHAR Label, + BOOLEAN QuickFormat, + ULONG ClusterSize, + PFMIFSCALLBACK Callback) { - UNICODE_STRING usDriveRoot; - UNICODE_STRING usLabel; - BOOL Argument = FALSE; + UNICODE_STRING usDriveRoot; + UNICODE_STRING usLabel; + BOOLEAN Argument = FALSE; - RtlInitUnicodeString(&usDriveRoot, DriveRoot); - RtlInitUnicodeString(&usLabel, Label); + RtlInitUnicodeString(&usDriveRoot, DriveRoot); + RtlInitUnicodeString(&usLabel, Label); - if (_wcsnicmp(Format, L"FAT", 3) == 0) - { - DPRINT1("FormatEx - FAT\n"); - VfatInitialize(); + if (_wcsnicmp(Format, L"FAT", 3) == 0) + { + DPRINT1("FormatEx - FAT\n"); - VfatFormat(&usDriveRoot, MediaFlag, &usLabel, QuickFormat, ClusterSize, Callback); - - VfatCleanup(); - } - else - { - /* Unknown file system */ - Callback(DONE, /* Command */ - 0, /* DWORD Modifier */ - &Argument /* Argument */ - ); - } + VfatInitialize (); + VfatFormat (&usDriveRoot, + MediaFlag, + &usLabel, + QuickFormat, + ClusterSize, + Callback); + VfatCleanup (); + } + else + { + /* Unknown file system */ + Callback (DONE, /* Command */ + 0, /* DWORD Modifier */ + &Argument); /* Argument */ + } } - /* EOF */ diff --git a/reactos/lib/fmifs/init.c b/reactos/lib/fmifs/init.c index dc98dbd4e4a..f1eb2bb11e6 100644 --- a/reactos/lib/fmifs/init.c +++ b/reactos/lib/fmifs/init.c @@ -1,4 +1,4 @@ -/* $Id: init.c,v 1.2 2002/03/07 00:24:24 ea Exp $ +/* $Id: init.c,v 1.3 2004/02/23 11:55:12 ekohl Exp $ * * COPYING: See the top level directory * PROJECT: ReactOS @@ -14,7 +14,6 @@ #include <windows.h> #include <fmifs.h> -/* FMIFS.8 */ static BOOL FmIfsInitialized = FALSE; static BOOL STDCALL @@ -25,18 +24,38 @@ InitializeFmIfsOnce (VOID) return TRUE; } + +/* FMIFS.8 */ BOOL STDCALL -InitializeFmIfs(VOID) +InitializeFmIfs (PVOID hinstDll, + DWORD dwReason, + PVOID reserved) { - if (FALSE == FmIfsInitialized) + switch (dwReason) + { + case DLL_PROCESS_ATTACH: + if (FALSE == FmIfsInitialized) + { + if (FALSE == InitializeFmIfsOnce()) { - if (FALSE == InitializeFmIfsOnce()) - { - return FALSE; - } - FmIfsInitialized = TRUE; + return FALSE; } - return TRUE; + + FmIfsInitialized = TRUE; + } + break; + + case DLL_THREAD_ATTACH: + break; + + case DLL_THREAD_DETACH: + break; + + case DLL_PROCESS_DETACH: + break; + } + + return TRUE; } /* EOF */ diff --git a/reactos/lib/fmifs/label.c b/reactos/lib/fmifs/label.c index 59449570631..dd311775bb0 100644 --- a/reactos/lib/fmifs/label.c +++ b/reactos/lib/fmifs/label.c @@ -1,4 +1,4 @@ -/* $Id: label.c,v 1.1 1999/05/11 21:19:41 ea Exp $ +/* $Id: label.c,v 1.2 2004/02/23 11:55:12 ekohl Exp $ * * COPYING: See the top level directory * PROJECT: ReactOS @@ -16,11 +16,9 @@ /* FMIFS.10 */ -VOID -__stdcall -SetLabel(VOID) +VOID STDCALL +SetLabel (VOID) { } - /* EOF */ diff --git a/reactos/lib/fmifs/makefile b/reactos/lib/fmifs/makefile index 83e0f06be56..a04e7ea675b 100644 --- a/reactos/lib/fmifs/makefile +++ b/reactos/lib/fmifs/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.20 2003/09/12 17:51:46 vizzini Exp $ +# $Id: makefile,v 1.21 2004/02/23 11:55:12 ekohl Exp $ PATH_TO_TOP = ../.. @@ -8,21 +8,22 @@ TARGET_NAME = fmifs TARGET_BASE = 0x76df0000 +TARGET_ENTRY = _InitializeFmIfs@12 + TARGET_CFLAGS = -fno-builtin -Werror -Wall # require os code to explicitly request A/W version of structs/functions TARGET_CFLAGS += -D_DISABLE_TIDENTS -TARGET_LFLAGS = -nostdlib -nostartfiles +TARGET_LFLAGS = -nostartfiles TARGET_SDKLIBS = vfatlib.a ntdll.a kernel32.a TARGET_OBJECTS = \ - chkdsk.o \ - compress.o \ - diskcopy.o \ - dllmain.o \ - extend.o \ + chkdsk.o \ + compress.o \ + diskcopy.o \ + extend.o \ format.o \ init.o \ label.o \ diff --git a/reactos/lib/fmifs/media.c b/reactos/lib/fmifs/media.c index b52f543d287..98dc4709acd 100644 --- a/reactos/lib/fmifs/media.c +++ b/reactos/lib/fmifs/media.c @@ -1,4 +1,4 @@ -/* $Id: media.c,v 1.1 1999/05/11 21:19:41 ea Exp $ +/* $Id: media.c,v 1.2 2004/02/23 11:55:12 ekohl Exp $ * * COPYING: See the top level directory * PROJECT: ReactOS @@ -16,11 +16,9 @@ /* FMIFS.9 */ -VOID -__stdcall -QuerySupportedMedia(VOID) +VOID STDCALL +QuerySupportedMedia (VOID) { } - /* EOF */ From 574b42db313ff99d01a57f514aab84dd13439ff6 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Mon, 23 Feb 2004 11:56:10 +0000 Subject: [PATCH 0142/1463] * lib/fmifs * lib/fslib/fvatlib Convert Win32 types to native Add PROGRESS and DONE callbacks. svn path=/trunk/; revision=8330 --- reactos/lib/fslib/vfatlib/fat12.c | 96 ++++++++++++++++--------- reactos/lib/fslib/vfatlib/fat16.c | 108 +++++++++++++++++----------- reactos/lib/fslib/vfatlib/fat32.c | 108 +++++++++++++++++++--------- reactos/lib/fslib/vfatlib/vfatlib.c | 64 +++++++++++++---- reactos/lib/fslib/vfatlib/vfatlib.h | 52 +++++++++----- 5 files changed, 290 insertions(+), 138 deletions(-) diff --git a/reactos/lib/fslib/vfatlib/fat12.c b/reactos/lib/fslib/vfatlib/fat12.c index 16dca94701b..050aed8ccff 100644 --- a/reactos/lib/fslib/vfatlib/fat12.c +++ b/reactos/lib/fslib/vfatlib/fat12.c @@ -52,8 +52,9 @@ CalcVolumeSerialNumber(VOID) static NTSTATUS -Fat12WriteBootSector(IN HANDLE FileHandle, - IN PFAT16_BOOT_SECTOR BootSector) +Fat12WriteBootSector (IN HANDLE FileHandle, + IN PFAT16_BOOT_SECTOR BootSector, + IN OUT PFORMAT_CONTEXT Context) { IO_STATUS_BLOCK IoStatusBlock; NTSTATUS Status; @@ -61,9 +62,9 @@ Fat12WriteBootSector(IN HANDLE FileHandle, LARGE_INTEGER FileOffset; /* Allocate buffer for new bootsector */ - NewBootSector = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(), - 0, - SECTORSIZE); + NewBootSector = (PUCHAR)RtlAllocateHeap (RtlGetProcessHeap (), + 0, + SECTORSIZE); if (NewBootSector == NULL) return(STATUS_INSUFFICIENT_RESOURCES); @@ -96,14 +97,17 @@ Fat12WriteBootSector(IN HANDLE FileHandle, /* Free the new boot sector */ RtlFreeHeap(RtlGetProcessHeap(), 0, NewBootSector); + UpdateProgress (Context, 1); + return(Status); } static NTSTATUS -Fat12WriteFAT(IN HANDLE FileHandle, - ULONG SectorOffset, - IN PFAT16_BOOT_SECTOR BootSector) +Fat12WriteFAT (IN HANDLE FileHandle, + IN ULONG SectorOffset, + IN PFAT16_BOOT_SECTOR BootSector, + IN OUT PFORMAT_CONTEXT Context) { IO_STATUS_BLOCK IoStatusBlock; NTSTATUS Status; @@ -146,6 +150,8 @@ Fat12WriteFAT(IN HANDLE FileHandle, return(Status); } + UpdateProgress (Context, 1); + /* Zero the begin of the buffer */ memset(Buffer, 0, 3); @@ -155,12 +161,12 @@ Fat12WriteFAT(IN HANDLE FileHandle, { /* Zero some sectors of the FAT */ FileOffset.QuadPart = (SectorOffset + BootSector->ReservedSectors + i) * BootSector->BytesPerSector; - Size = (ULONG)BootSector->FATSectors - i; - if (Size > Sectors) + if (((ULONG)BootSector->FATSectors - i) <= Sectors) { - Size = Sectors; + Sectors = (ULONG)BootSector->FATSectors - i; } - Size *= BootSector->BytesPerSector; + + Size = Sectors * BootSector->BytesPerSector; Status = NtWriteFile(FileHandle, NULL, NULL, @@ -176,6 +182,8 @@ Fat12WriteFAT(IN HANDLE FileHandle, RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer); return(Status); } + + UpdateProgress (Context, Sectors); } /* Free the buffer */ @@ -186,8 +194,9 @@ Fat12WriteFAT(IN HANDLE FileHandle, static NTSTATUS -Fat12WriteRootDirectory(IN HANDLE FileHandle, - IN PFAT16_BOOT_SECTOR BootSector) +Fat12WriteRootDirectory (IN HANDLE FileHandle, + IN PFAT16_BOOT_SECTOR BootSector, + IN OUT PFORMAT_CONTEXT Context) { IO_STATUS_BLOCK IoStatusBlock; NTSTATUS Status; @@ -227,12 +236,12 @@ Fat12WriteRootDirectory(IN HANDLE FileHandle, { /* Zero some sectors of the root directory */ FileOffset.QuadPart = (FirstRootDirSector + i) * BootSector->BytesPerSector; - Size = RootDirSectors - i; - if (Size > Sectors) + + if ((RootDirSectors - i) <= Sectors) { - Size = Sectors; + Sectors = RootDirSectors - i; } - Size *= BootSector->BytesPerSector; + Size = Sectors * BootSector->BytesPerSector; Status = NtWriteFile(FileHandle, NULL, @@ -249,6 +258,7 @@ Fat12WriteRootDirectory(IN HANDLE FileHandle, RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer); return(Status); } + UpdateProgress (Context, Sectors); } /* Free the buffer */ @@ -259,13 +269,13 @@ Fat12WriteRootDirectory(IN HANDLE FileHandle, NTSTATUS -Fat12Format (HANDLE FileHandle, - PPARTITION_INFORMATION PartitionInfo, +Fat12Format (HANDLE FileHandle, + PPARTITION_INFORMATION PartitionInfo, PDISK_GEOMETRY DiskGeometry, PUNICODE_STRING Label, - BOOL QuickFormat, - DWORD ClusterSize, - PFMIFSCALLBACK Callback) + BOOLEAN QuickFormat, + ULONG ClusterSize, + PFORMAT_CONTEXT Context) { FAT16_BOOT_SECTOR BootSector; OEM_STRING VolumeLabel; @@ -331,8 +341,20 @@ Fat12Format (HANDLE FileHandle, DPRINT("BootSector.FATSectors = %hx\n", BootSector.FATSectors); - Status = Fat12WriteBootSector(FileHandle, - &BootSector); + /* Init context data */ + if (QuickFormat) + { + Context->TotalSectorCount = + 1 + (BootSector.FATSectors * 2) + RootDirSectors; + } + else + { + Context->TotalSectorCount = SectorCount; + } + + Status = Fat12WriteBootSector (FileHandle, + &BootSector, + Context); if (!NT_SUCCESS(Status)) { DPRINT("Fat12WriteBootSector() failed with status 0x%.08x\n", Status); @@ -340,9 +362,10 @@ Fat12Format (HANDLE FileHandle, } /* Write first FAT copy */ - Status = Fat12WriteFAT(FileHandle, - 0, - &BootSector); + Status = Fat12WriteFAT (FileHandle, + 0, + &BootSector, + Context); if (!NT_SUCCESS(Status)) { DPRINT("Fat12WriteFAT() failed with status 0x%.08x\n", Status); @@ -350,21 +373,28 @@ Fat12Format (HANDLE FileHandle, } /* Write second FAT copy */ - Status = Fat12WriteFAT(FileHandle, - (ULONG)BootSector.FATSectors, - &BootSector); + Status = Fat12WriteFAT (FileHandle, + (ULONG)BootSector.FATSectors, + &BootSector, + Context); if (!NT_SUCCESS(Status)) { DPRINT("Fat12WriteFAT() failed with status 0x%.08x.\n", Status); return Status; } - Status = Fat12WriteRootDirectory(FileHandle, - &BootSector); + Status = Fat12WriteRootDirectory (FileHandle, + &BootSector, + Context); if (!NT_SUCCESS(Status)) { DPRINT("Fat12WriteRootDirectory() failed with status 0x%.08x\n", Status); } + if (!QuickFormat) + { + /* FIXME: Fill remaining sectors */ + } + return Status; } diff --git a/reactos/lib/fslib/vfatlib/fat16.c b/reactos/lib/fslib/vfatlib/fat16.c index 0867d8a08ce..31b6c5cdd86 100644 --- a/reactos/lib/fslib/vfatlib/fat16.c +++ b/reactos/lib/fslib/vfatlib/fat16.c @@ -52,8 +52,9 @@ CalcVolumeSerialNumber(VOID) static NTSTATUS -Fat16WriteBootSector(IN HANDLE FileHandle, - IN PFAT16_BOOT_SECTOR BootSector) +Fat16WriteBootSector (IN HANDLE FileHandle, + IN PFAT16_BOOT_SECTOR BootSector, + IN OUT PFORMAT_CONTEXT Context) { IO_STATUS_BLOCK IoStatusBlock; NTSTATUS Status; @@ -90,27 +91,29 @@ Fat16WriteBootSector(IN HANDLE FileHandle, { DPRINT("NtWriteFile() failed (Status %lx)\n", Status); RtlFreeHeap(RtlGetProcessHeap(), 0, NewBootSector); - return(Status); + return Status; } + UpdateProgress (Context, 1); + /* Free the new boot sector */ RtlFreeHeap(RtlGetProcessHeap(), 0, NewBootSector); - return(Status); + return Status; } static NTSTATUS -Fat16WriteFAT(IN HANDLE FileHandle, - ULONG SectorOffset, - IN PFAT16_BOOT_SECTOR BootSector) +Fat16WriteFAT (IN HANDLE FileHandle, + IN ULONG SectorOffset, + IN PFAT16_BOOT_SECTOR BootSector, + IN OUT PFORMAT_CONTEXT Context) { IO_STATUS_BLOCK IoStatusBlock; NTSTATUS Status; PUCHAR Buffer; LARGE_INTEGER FileOffset; ULONG i; - ULONG Size; ULONG Sectors; /* Allocate buffer */ @@ -149,6 +152,8 @@ Fat16WriteFAT(IN HANDLE FileHandle, return(Status); } + UpdateProgress (Context, 1); + /* Zero the begin of the buffer */ memset(Buffer, 0, 4); @@ -158,19 +163,19 @@ Fat16WriteFAT(IN HANDLE FileHandle, { /* Zero some sectors of the FAT */ FileOffset.QuadPart = (SectorOffset + BootSector->ReservedSectors + i) * BootSector->BytesPerSector; - Size = (ULONG)BootSector->FATSectors - i; - if (Size > Sectors) - { - Size = Sectors; - } - Size *= BootSector->BytesPerSector; + + if (((ULONG)BootSector->FATSectors - i) <= Sectors) + { + Sectors = (ULONG)BootSector->FATSectors - i; + } + Status = NtWriteFile(FileHandle, NULL, NULL, NULL, &IoStatusBlock, Buffer, - Size, + Sectors * BootSector->BytesPerSector, &FileOffset, NULL); if (!NT_SUCCESS(Status)) @@ -179,6 +184,8 @@ Fat16WriteFAT(IN HANDLE FileHandle, RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer); return(Status); } + + UpdateProgress (Context, Sectors); } /* Free the buffer */ @@ -189,8 +196,9 @@ Fat16WriteFAT(IN HANDLE FileHandle, static NTSTATUS -Fat16WriteRootDirectory(IN HANDLE FileHandle, - IN PFAT16_BOOT_SECTOR BootSector) +Fat16WriteRootDirectory (IN HANDLE FileHandle, + IN PFAT16_BOOT_SECTOR BootSector, + IN OUT PFORMAT_CONTEXT Context) { IO_STATUS_BLOCK IoStatusBlock; NTSTATUS Status; @@ -199,7 +207,6 @@ Fat16WriteRootDirectory(IN HANDLE FileHandle, ULONG FirstRootDirSector; ULONG RootDirSectors; ULONG Sectors; - ULONG Size; ULONG i; DPRINT("BootSector->ReservedSectors = %hu\n", BootSector->ReservedSectors); @@ -230,12 +237,11 @@ Fat16WriteRootDirectory(IN HANDLE FileHandle, { /* Zero some sectors of the root directory */ FileOffset.QuadPart = (FirstRootDirSector + i) * BootSector->BytesPerSector; - Size = RootDirSectors - i; - if (Size > Sectors) - { - Size = Sectors; - } - Size *= BootSector->BytesPerSector; + + if ((RootDirSectors - i) <= Sectors) + { + Sectors = RootDirSectors - i; + } Status = NtWriteFile(FileHandle, NULL, @@ -243,7 +249,7 @@ Fat16WriteRootDirectory(IN HANDLE FileHandle, NULL, &IoStatusBlock, Buffer, - Size, + Sectors * BootSector->BytesPerSector, &FileOffset, NULL); if (!NT_SUCCESS(Status)) @@ -252,6 +258,8 @@ Fat16WriteRootDirectory(IN HANDLE FileHandle, RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer); return(Status); } + + UpdateProgress (Context, Sectors); } /* Free the buffer */ @@ -262,13 +270,13 @@ Fat16WriteRootDirectory(IN HANDLE FileHandle, NTSTATUS -Fat16Format (HANDLE FileHandle, - PPARTITION_INFORMATION PartitionInfo, +Fat16Format (HANDLE FileHandle, + PPARTITION_INFORMATION PartitionInfo, PDISK_GEOMETRY DiskGeometry, PUNICODE_STRING Label, - BOOL QuickFormat, - DWORD ClusterSize, - PFMIFSCALLBACK Callback) + BOOLEAN QuickFormat, + ULONG ClusterSize, + PFORMAT_CONTEXT Context) { FAT16_BOOT_SECTOR BootSector; OEM_STRING VolumeLabel; @@ -351,8 +359,20 @@ Fat16Format (HANDLE FileHandle, BootSector.FATSectors = (unsigned short)(TmpVal3 & 0xffff); DPRINT("BootSector.FATSectors = %hu\n", BootSector.FATSectors); - Status = Fat16WriteBootSector(FileHandle, - &BootSector); + /* Init context data */ + if (QuickFormat) + { + Context->TotalSectorCount = + 1 + (BootSector.FATSectors * 2) + RootDirSectors; + } + else + { + Context->TotalSectorCount = SectorCount; + } + + Status = Fat16WriteBootSector (FileHandle, + &BootSector, + Context); if (!NT_SUCCESS(Status)) { DPRINT("Fat16WriteBootSector() failed with status 0x%.08x\n", Status); @@ -360,9 +380,10 @@ Fat16Format (HANDLE FileHandle, } /* Write first FAT copy */ - Status = Fat16WriteFAT(FileHandle, - 0, - &BootSector); + Status = Fat16WriteFAT (FileHandle, + 0, + &BootSector, + Context); if (!NT_SUCCESS(Status)) { DPRINT("Fat16WriteFAT() failed with status 0x%.08x\n", Status); @@ -370,21 +391,28 @@ Fat16Format (HANDLE FileHandle, } /* Write second FAT copy */ - Status = Fat16WriteFAT(FileHandle, - (ULONG)BootSector.FATSectors, - &BootSector); + Status = Fat16WriteFAT (FileHandle, + (ULONG)BootSector.FATSectors, + &BootSector, + Context); if (!NT_SUCCESS(Status)) { DPRINT("Fat16WriteFAT() failed with status 0x%.08x.\n", Status); return Status; } - Status = Fat16WriteRootDirectory(FileHandle, - &BootSector); + Status = Fat16WriteRootDirectory (FileHandle, + &BootSector, + Context); if (!NT_SUCCESS(Status)) { DPRINT("Fat16WriteRootDirectory() failed with status 0x%.08x\n", Status); } + if (!QuickFormat) + { + /* FIXME: Fill remaining sectors */ + } + return Status; } diff --git a/reactos/lib/fslib/vfatlib/fat32.c b/reactos/lib/fslib/vfatlib/fat32.c index e6025de6236..a26a9a7c3ba 100644 --- a/reactos/lib/fslib/vfatlib/fat32.c +++ b/reactos/lib/fslib/vfatlib/fat32.c @@ -52,8 +52,9 @@ CalcVolumeSerialNumber(VOID) static NTSTATUS -Fat32WriteBootSector(IN HANDLE FileHandle, - IN PFAT32_BOOT_SECTOR BootSector) +Fat32WriteBootSector (IN HANDLE FileHandle, + IN PFAT32_BOOT_SECTOR BootSector, + IN OUT PFORMAT_CONTEXT Context) { IO_STATUS_BLOCK IoStatusBlock; NTSTATUS Status; @@ -90,9 +91,11 @@ Fat32WriteBootSector(IN HANDLE FileHandle, { DPRINT("NtWriteFile() failed (Status %lx)\n", Status); RtlFreeHeap(RtlGetProcessHeap(), 0, NewBootSector); - return(Status); + return Status; } + UpdateProgress (Context, 1); + /* Write backup boot sector */ if (BootSector->BootBackup != 0x0000) { @@ -110,20 +113,23 @@ Fat32WriteBootSector(IN HANDLE FileHandle, { DPRINT("NtWriteFile() failed (Status %lx)\n", Status); RtlFreeHeap(RtlGetProcessHeap(), 0, NewBootSector); - return(Status); + return Status; } + + UpdateProgress (Context, 1); } /* Free the new boot sector */ RtlFreeHeap(RtlGetProcessHeap(), 0, NewBootSector); - return(Status); + return Status; } static NTSTATUS -Fat32WriteFsInfo(IN HANDLE FileHandle, - IN PFAT32_BOOT_SECTOR BootSector) +Fat32WriteFsInfo (IN HANDLE FileHandle, + IN PFAT32_BOOT_SECTOR BootSector, + IN OUT PFORMAT_CONTEXT Context) { IO_STATUS_BLOCK IoStatusBlock; NTSTATUS Status; @@ -164,6 +170,8 @@ Fat32WriteFsInfo(IN HANDLE FileHandle, return(Status); } + UpdateProgress (Context, 1); + /* Free the new sector buffer */ RtlFreeHeap(RtlGetProcessHeap(), 0, FsInfo); @@ -172,16 +180,16 @@ Fat32WriteFsInfo(IN HANDLE FileHandle, static NTSTATUS -Fat32WriteFAT(IN HANDLE FileHandle, - ULONG SectorOffset, - IN PFAT32_BOOT_SECTOR BootSector) +Fat32WriteFAT (IN HANDLE FileHandle, + IN ULONG SectorOffset, + IN PFAT32_BOOT_SECTOR BootSector, + IN OUT PFORMAT_CONTEXT Context) { IO_STATUS_BLOCK IoStatusBlock; NTSTATUS Status; PUCHAR Buffer; LARGE_INTEGER FileOffset; ULONG i; - ULONG Size; ULONG Sectors; /* Allocate buffer */ @@ -228,6 +236,8 @@ Fat32WriteFAT(IN HANDLE FileHandle, return(Status); } + UpdateProgress (Context, 1); + /* Zero the begin of the buffer */ memset(Buffer, 0, 12); @@ -237,19 +247,19 @@ Fat32WriteFAT(IN HANDLE FileHandle, { /* Zero some sectors of the FAT */ FileOffset.QuadPart = (SectorOffset + BootSector->ReservedSectors + i) * BootSector->BytesPerSector; - Size = BootSector->FATSectors32 - i; - if (Size > Sectors) + + if ((BootSector->FATSectors32 - i) <= Sectors) { - Size = Sectors; + Sectors = BootSector->FATSectors32 - i; } - Size *= BootSector->BytesPerSector; + Status = NtWriteFile(FileHandle, NULL, NULL, NULL, &IoStatusBlock, Buffer, - Size, + Sectors * BootSector->BytesPerSector, &FileOffset, NULL); if (!NT_SUCCESS(Status)) @@ -258,6 +268,8 @@ Fat32WriteFAT(IN HANDLE FileHandle, RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer); return(Status); } + + UpdateProgress (Context, Sectors); } /* Free the buffer */ @@ -268,8 +280,9 @@ Fat32WriteFAT(IN HANDLE FileHandle, static NTSTATUS -Fat32WriteRootDirectory(IN HANDLE FileHandle, - IN PFAT32_BOOT_SECTOR BootSector) +Fat32WriteRootDirectory (IN HANDLE FileHandle, + IN PFAT32_BOOT_SECTOR BootSector, + IN OUT PFORMAT_CONTEXT Context) { IO_STATUS_BLOCK IoStatusBlock; NTSTATUS Status; @@ -321,6 +334,8 @@ Fat32WriteRootDirectory(IN HANDLE FileHandle, return(Status); } + UpdateProgress (Context, (ULONG)BootSector->SectorsPerCluster); + /* Free the buffer */ RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer); @@ -329,13 +344,13 @@ Fat32WriteRootDirectory(IN HANDLE FileHandle, NTSTATUS -Fat32Format (HANDLE FileHandle, - PPARTITION_INFORMATION PartitionInfo, +Fat32Format (HANDLE FileHandle, + PPARTITION_INFORMATION PartitionInfo, PDISK_GEOMETRY DiskGeometry, PUNICODE_STRING Label, - BOOL QuickFormat, - DWORD ClusterSize, - PFMIFSCALLBACK Callback) + BOOLEAN QuickFormat, + ULONG ClusterSize, + PFORMAT_CONTEXT Context) { FAT32_BOOT_SECTOR BootSector; OEM_STRING VolumeLabel; @@ -417,16 +432,29 @@ Fat32Format (HANDLE FileHandle, BootSector.FATSectors32 = (TmpVal1 + (TmpVal2 - 1)) / TmpVal2; DPRINT("FATSectors32 = %lu\n", BootSector.FATSectors32); - Status = Fat32WriteBootSector(FileHandle, - &BootSector); + /* Init context data */ + if (QuickFormat) + { + Context->TotalSectorCount = + 2 + (BootSector.FATSectors32 * BootSector.FATCount) + BootSector.SectorsPerCluster; + } + else + { + Context->TotalSectorCount = BootSector.SectorsHuge; + } + + Status = Fat32WriteBootSector (FileHandle, + &BootSector, + Context); if (!NT_SUCCESS(Status)) { DPRINT("Fat32WriteBootSector() failed with status 0x%.08x\n", Status); return Status; } - Status = Fat32WriteFsInfo(FileHandle, - &BootSector); + Status = Fat32WriteFsInfo (FileHandle, + &BootSector, + Context); if (!NT_SUCCESS(Status)) { DPRINT("Fat32WriteFsInfo() failed with status 0x%.08x\n", Status); @@ -434,9 +462,10 @@ Fat32Format (HANDLE FileHandle, } /* Write first FAT copy */ - Status = Fat32WriteFAT(FileHandle, - 0, - &BootSector); + Status = Fat32WriteFAT (FileHandle, + 0, + &BootSector, + Context); if (!NT_SUCCESS(Status)) { DPRINT("Fat32WriteFAT() failed with status 0x%.08x\n", Status); @@ -444,21 +473,30 @@ Fat32Format (HANDLE FileHandle, } /* Write second FAT copy */ - Status = Fat32WriteFAT(FileHandle, - BootSector.FATSectors32, - &BootSector); + Status = Fat32WriteFAT (FileHandle, + BootSector.FATSectors32, + &BootSector, + Context); if (!NT_SUCCESS(Status)) { DPRINT("Fat32WriteFAT() failed with status 0x%.08x.\n", Status); return Status; } - Status = Fat32WriteRootDirectory(FileHandle, - &BootSector); + Status = Fat32WriteRootDirectory (FileHandle, + &BootSector, + Context); if (!NT_SUCCESS(Status)) { DPRINT("Fat32WriteRootDirectory() failed with status 0x%.08x\n", Status); } + if (!QuickFormat) + { + /* FIXME: Fill remaining sectors */ + } + return Status; } + +/* EOF */ diff --git a/reactos/lib/fslib/vfatlib/vfatlib.c b/reactos/lib/fslib/vfatlib/vfatlib.c index d06f85c6bc6..1a05e5e94bb 100755 --- a/reactos/lib/fslib/vfatlib/vfatlib.c +++ b/reactos/lib/fslib/vfatlib/vfatlib.c @@ -7,14 +7,15 @@ * REVISIONS: * CSH 05/04-2003 Created */ -#define NDEBUG -#include <debug.h> #define NTOS_MODE_USER #include <ntos.h> #include <ddk/ntddscsi.h> #include <fslib/vfatlib.h> #include "vfatlib.h" +#define NDEBUG +#include <debug.h> + NTSTATUS VfatInitialize(VOID) @@ -26,23 +27,29 @@ VfatInitialize(VOID) NTSTATUS -VfatFormat( - PUNICODE_STRING DriveRoot, - DWORD MediaFlag, - PUNICODE_STRING Label, - BOOL QuickFormat, - DWORD ClusterSize, - PFMIFSCALLBACK Callback) +VfatFormat (PUNICODE_STRING DriveRoot, + ULONG MediaFlag, + PUNICODE_STRING Label, + BOOLEAN QuickFormat, + ULONG ClusterSize, + PFMIFSCALLBACK Callback) { OBJECT_ATTRIBUTES ObjectAttributes; DISK_GEOMETRY DiskGeometry; IO_STATUS_BLOCK Iosb; HANDLE FileHandle; PARTITION_INFORMATION PartitionInfo; + FORMAT_CONTEXT Context; NTSTATUS Status; DPRINT("VfatFormat(DriveRoot '%wZ')\n", DriveRoot); + Context.TotalSectorCount = 0; + Context.CurrentSectorCount = 0; + Context.Callback = Callback; + Context.Success = FALSE; + Context.Percent = 0; + InitializeObjectAttributes(&ObjectAttributes, DriveRoot, 0, @@ -138,6 +145,12 @@ VfatFormat( DPRINT("RewritePartition %d\n", PartitionInfo.RewritePartition); DPRINT("RecognizedPartition %d\n", PartitionInfo.RecognizedPartition); + if (Callback != NULL) + { + Context.Percent = 0; + Callback (PROGRESS, 0, (PVOID)&Context.Percent); + } + if (PartitionInfo.PartitionLength.QuadPart < (4200ULL * 1024ULL)) { /* FAT12 (volume is smaller than 4.1MB) */ @@ -147,7 +160,7 @@ VfatFormat( Label, QuickFormat, ClusterSize, - Callback); + &Context); } else if (PartitionInfo.PartitionLength.QuadPart < (512ULL * 1024ULL * 1024ULL)) { @@ -158,7 +171,7 @@ VfatFormat( Label, QuickFormat, ClusterSize, - Callback); + &Context); } else { @@ -169,11 +182,17 @@ VfatFormat( Label, QuickFormat, ClusterSize, - Callback); + &Context); } NtClose(FileHandle); + if (Callback != NULL) + { + Context.Success = (BOOLEAN)(NT_SUCCESS(Status)); + Callback (DONE, 0, (PVOID)&Context.Success); + } + DPRINT("VfatFormat() done. Status 0x%.08x\n", Status); return Status; @@ -187,3 +206,24 @@ VfatCleanup(VOID) return STATUS_SUCCESS; } + + +VOID +UpdateProgress (PFORMAT_CONTEXT Context, + ULONG Increment) +{ + ULONG NewPercent; + + Context->CurrentSectorCount += (ULONGLONG)Increment; + + + NewPercent = (Context->CurrentSectorCount * 100ULL) / Context->TotalSectorCount; + + if (NewPercent > Context->Percent) + { + Context->Percent = NewPercent; + Context->Callback (PROGRESS, 0, &Context->Percent); + } +} + +/* EOF */ diff --git a/reactos/lib/fslib/vfatlib/vfatlib.h b/reactos/lib/fslib/vfatlib/vfatlib.h index 02406cf4c6a..fd886684907 100755 --- a/reactos/lib/fslib/vfatlib/vfatlib.h +++ b/reactos/lib/fslib/vfatlib/vfatlib.h @@ -87,29 +87,45 @@ typedef struct _FAT32_FSINFO } __attribute__((packed)) FAT32_FSINFO, *PFAT32_FSINFO; -NTSTATUS -Fat12Format (HANDLE FileHandle, - PPARTITION_INFORMATION PartitionInfo, - PDISK_GEOMETRY DiskGeometry, - PUNICODE_STRING Label, - BOOL QuickFormat, - DWORD ClusterSize, - PFMIFSCALLBACK Callback); +typedef struct _FORMAT_CONTEXT +{ + PFMIFSCALLBACK Callback; + ULONG TotalSectorCount; + ULONG CurrentSectorCount; + BOOLEAN Success; + ULONG Percent; +} FORMAT_CONTEXT, *PFORMAT_CONTEXT; + NTSTATUS -Fat16Format (HANDLE FileHandle, - PPARTITION_INFORMATION PartitionInfo, +Fat12Format (HANDLE FileHandle, + PPARTITION_INFORMATION PartitionInfo, PDISK_GEOMETRY DiskGeometry, PUNICODE_STRING Label, - BOOL QuickFormat, - DWORD ClusterSize, - PFMIFSCALLBACK Callback); + BOOLEAN QuickFormat, + ULONG ClusterSize, + PFORMAT_CONTEXT Context); NTSTATUS -Fat32Format (HANDLE FileHandle, - PPARTITION_INFORMATION PartitionInfo, +Fat16Format (HANDLE FileHandle, + PPARTITION_INFORMATION PartitionInfo, PDISK_GEOMETRY DiskGeometry, PUNICODE_STRING Label, - BOOL QuickFormat, - DWORD ClusterSize, - PFMIFSCALLBACK Callback); + BOOLEAN QuickFormat, + ULONG ClusterSize, + PFORMAT_CONTEXT Context); + +NTSTATUS +Fat32Format (HANDLE FileHandle, + PPARTITION_INFORMATION PartitionInfo, + PDISK_GEOMETRY DiskGeometry, + PUNICODE_STRING Label, + BOOLEAN QuickFormat, + ULONG ClusterSize, + PFORMAT_CONTEXT Context); + +VOID +UpdateProgress (PFORMAT_CONTEXT Context, + ULONG Increment); + +/* EOF */ From 951f5f360f890177db63d54359e97097171183d6 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Mon, 23 Feb 2004 11:57:00 +0000 Subject: [PATCH 0143/1463] Update to new fmifs types. svn path=/trunk/; revision=8331 --- reactos/subsys/system/format/format.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/reactos/subsys/system/format/format.c b/reactos/subsys/system/format/format.c index d887e6b3bff..d556f9ee112 100755 --- a/reactos/subsys/system/format/format.c +++ b/reactos/subsys/system/format/format.c @@ -175,7 +175,10 @@ int ParseCommandLine( int argc, WCHAR *argv[] ) // can interpret. If we wanted to halt the chkdsk we could return FALSE. // //---------------------------------------------------------------------- -BOOL __stdcall FormatExCallback( CALLBACKCOMMAND Command, DWORD Modifier, PVOID Argument ) +BOOLEAN STDCALL +FormatExCallback (CALLBACKCOMMAND Command, + ULONG Modifier, + PVOID Argument) { PDWORD percent; PTEXTOUTPUT output; @@ -318,7 +321,6 @@ int wmain( int argc, WCHAR *argv[] ) } if( driveType != DRIVE_FIXED ) { - printf("Insert a new floppy in drive %C:\nand press Enter when ready...", RootDirectory[0] ); fgetws( input, sizeof(input)/2, stdin ); @@ -326,10 +328,8 @@ int wmain( int argc, WCHAR *argv[] ) media = FMIFS_FLOPPY; -driveType = DRIVE_FIXED; -media = FMIFS_HARDDISK; - - + driveType = DRIVE_FIXED; + media = FMIFS_HARDDISK; } // From 95033dafabdeb33527d2ab138c9c9237d7640546 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Mon, 23 Feb 2004 11:58:27 +0000 Subject: [PATCH 0144/1463] Update to new fmifs types. Implement partition format progress bar. svn path=/trunk/; revision=8332 --- reactos/subsys/system/usetup/format.c | 98 ++++++++++++++++++++++--- reactos/subsys/system/usetup/makefile | 6 +- reactos/subsys/system/usetup/progress.c | 90 ++++++++++++++++++++--- reactos/subsys/system/usetup/progress.h | 16 ++-- reactos/subsys/system/usetup/usetup.c | 36 ++++----- 5 files changed, 196 insertions(+), 50 deletions(-) diff --git a/reactos/subsys/system/usetup/format.c b/reactos/subsys/system/usetup/format.c index 391774b6906..122e3f0ea73 100755 --- a/reactos/subsys/system/usetup/format.c +++ b/reactos/subsys/system/usetup/format.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: format.c,v 1.2 2003/08/18 17:39:26 ekohl Exp $ +/* $Id: format.c,v 1.3 2004/02/23 11:58:27 ekohl Exp $ * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS text-mode setup * FILE: subsys/system/usetup/format.c @@ -28,28 +28,104 @@ #include <ddk/ntddk.h> #include <ntdll/rtl.h> +#include <fslib/vfatlib.h> + +#include "usetup.h" +#include "console.h" +#include "progress.h" + #define NDEBUG #include <debug.h> -#include <fslib/vfatlib.h> + + +PPROGRESSBAR ProgressBar = NULL; /* FUNCTIONS ****************************************************************/ + +BOOLEAN STDCALL +FormatCallback (CALLBACKCOMMAND Command, + ULONG Modifier, + PVOID Argument) +{ +// DPRINT1 ("FormatCallback() called\n"); + + switch (Command) + { + case PROGRESS: + { + PULONG Percent; + + Percent = (PULONG)Argument; + DPRINT ("%lu percent completed\n", *Percent); + + ProgressSetStep (ProgressBar, *Percent); + } + break; + +// case OUTPUT: +// { +// PTEXTOUTPUT Output; +// output = (PTEXTOUTPUT) Argument; +// fprintf(stdout, "%s", output->Output); +// } +// break; + + case DONE: + { + DPRINT ("Done\n"); +// PBOOLEAN Success; +// status = (PBOOLEAN) Argument; +// if ( *status == FALSE ) +// { +// wprintf(L"FormatEx was unable to complete successfully.\n\n"); +// Error = TRUE; +// } + } + break; + + default: + DPRINT ("Unknown callback %lu\n", (ULONG)Command); + break; + } + +// DPRINT1 ("FormatCallback() done\n"); + + return TRUE; +} + + NTSTATUS -FormatPartition(PUNICODE_STRING DriveRoot) +FormatPartition (PUNICODE_STRING DriveRoot) { NTSTATUS Status; + SHORT xScreen; + SHORT yScreen; - VfatInitialize(); + GetScreenSize(&xScreen, &yScreen); + + ProgressBar = CreateProgressBar (6, + yScreen - 14, + xScreen - 7, + yScreen - 10); + + ProgressSetStepCount (ProgressBar, 100); + + VfatInitialize (); Status = VfatFormat (DriveRoot, - 0, // MediaFlag - NULL, // Label - TRUE, // QuickFormat - 0, // ClusterSize - NULL); // Callback - DPRINT1("VfatFormat() status 0x%.08x\n", Status); + 0, /* MediaFlag */ + NULL, /* Label */ + TRUE, /* QuickFormat */ + 0, /* ClusterSize */ + (PFMIFSCALLBACK)FormatCallback); /* Callback */ - VfatCleanup(); + VfatCleanup (); + + DestroyProgressBar (ProgressBar); + ProgressBar = NULL; + + DPRINT ("VfatFormat() status 0x%.08x\n", Status); return Status; } diff --git a/reactos/subsys/system/usetup/makefile b/reactos/subsys/system/usetup/makefile index 302696b44db..70c297cc3d2 100644 --- a/reactos/subsys/system/usetup/makefile +++ b/reactos/subsys/system/usetup/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.14 2003/11/14 17:13:33 weiden Exp $ +# $Id: makefile,v 1.15 2004/02/23 11:58:27 ekohl Exp $ PATH_TO_TOP = ../../.. @@ -18,9 +18,9 @@ TARGET_INSTALLDIR = system32 TARGET_CFLAGS = -D__NTAPP__ -I$(PATH_TO_TOP)/lib/zlib -Wall -Werror -Wno-format -TARGET_OBJECTS = $(TARGET_NAME).o bootsup.o cabinet.o console.o drivesup.o \ +TARGET_OBJECTS = bootsup.o cabinet.o console.o drivesup.o \ filequeue.o filesup.o format.o fslist.o infcache.o \ - inicache.o partlist.o progress.o registry.o + inicache.o partlist.o progress.o registry.o usetup.o include $(PATH_TO_TOP)/rules.mak diff --git a/reactos/subsys/system/usetup/progress.c b/reactos/subsys/system/usetup/progress.c index 13ca4bf5869..2a720cb745a 100644 --- a/reactos/subsys/system/usetup/progress.c +++ b/reactos/subsys/system/usetup/progress.c @@ -12,7 +12,7 @@ static VOID -DrawBorder(PPROGRESS Bar) +DrawBorder(PPROGRESSBAR Bar) { COORD coPos; ULONG Written; @@ -86,7 +86,7 @@ DrawBorder(PPROGRESS Bar) static VOID -DrawProgressBar(PPROGRESS Bar) +DrawProgressBar(PPROGRESSBAR Bar) { CHAR TextBuffer[8]; COORD coPos; @@ -122,17 +122,17 @@ DrawProgressBar(PPROGRESS Bar) -PPROGRESS +PPROGRESSBAR CreateProgressBar(SHORT Left, SHORT Top, SHORT Right, SHORT Bottom) { - PPROGRESS Bar; + PPROGRESSBAR Bar; - Bar = (PPROGRESS)RtlAllocateHeap(ProcessHeap, - 0, - sizeof(PROGRESS)); + Bar = (PPROGRESSBAR)RtlAllocateHeap(ProcessHeap, + 0, + sizeof(PROGRESSBAR)); if (Bar == NULL) return(NULL); @@ -156,7 +156,7 @@ CreateProgressBar(SHORT Left, VOID -DestroyProgressBar(PPROGRESS Bar) +DestroyProgressBar(PPROGRESSBAR Bar) { RtlFreeHeap(ProcessHeap, 0, @@ -164,7 +164,7 @@ DestroyProgressBar(PPROGRESS Bar) } VOID -ProgressSetStepCount(PPROGRESS Bar, +ProgressSetStepCount(PPROGRESSBAR Bar, ULONG StepCount) { Bar->CurrentStep = 0; @@ -175,7 +175,7 @@ ProgressSetStepCount(PPROGRESS Bar, VOID -ProgressNextStep(PPROGRESS Bar) +ProgressNextStep(PPROGRESSBAR Bar) { CHAR TextBuffer[8]; COORD coPos; @@ -243,4 +243,74 @@ ProgressNextStep(PPROGRESS Bar) } } + +VOID +ProgressSetStep (PPROGRESSBAR Bar, + ULONG Step) +{ + CHAR TextBuffer[8]; + COORD coPos; + ULONG Written; + ULONG NewPercent; + ULONG NewPos; + + if (Step > Bar->StepCount) + return; + + Bar->CurrentStep = Step; + + /* Calculate new percentage */ + NewPercent = (ULONG)(((100.0 * (float)Bar->CurrentStep) / (float)Bar->StepCount) + 0.5); + + /* Redraw precentage if changed */ + if (Bar->Percent != NewPercent) + { + Bar->Percent = NewPercent; + + sprintf(TextBuffer, "%-3lu%%", Bar->Percent); + + coPos.X = Bar->Left + (Bar->Width - 2) / 2; + coPos.Y = Bar->Top; + WriteConsoleOutputCharacters(TextBuffer, + 4, + coPos); + } + + /* Calculate bar position */ + NewPos = (ULONG)((((float)(Bar->Width - 2) * 2.0 * (float)Bar->CurrentStep) / (float)Bar->StepCount) + 0.5); + + /* Redraw bar if changed */ + if (Bar->Pos != NewPos) + { + Bar->Pos = NewPos; + + for (coPos.Y = Bar->Top + 2; coPos.Y <= Bar->Bottom - 1; coPos.Y++) + { + coPos.X = Bar->Left + 1; + FillConsoleOutputCharacter(0xDB, + Bar->Pos / 2, + coPos, + &Written); + coPos.X += Bar->Pos/2; + + if (NewPos & 1) + { + FillConsoleOutputCharacter(0xDD, + 1, + coPos, + &Written); + coPos.X++; + } + + if (coPos.X <= Bar->Right - 1) + { + FillConsoleOutputCharacter(' ', + Bar->Right - coPos.X, + coPos, + &Written); + } + } + } +} + /* EOF */ diff --git a/reactos/subsys/system/usetup/progress.h b/reactos/subsys/system/usetup/progress.h index 4f2defc0b79..1c16b6305dc 100644 --- a/reactos/subsys/system/usetup/progress.h +++ b/reactos/subsys/system/usetup/progress.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: progress.h,v 1.2 2003/02/27 14:42:43 ekohl Exp $ +/* $Id: progress.h,v 1.3 2004/02/23 11:58:27 ekohl Exp $ * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS text-mode setup * FILE: subsys/system/usetup/partlist.h @@ -42,25 +42,29 @@ typedef struct _PROGRESS ULONG StepCount; ULONG CurrentStep; -} PROGRESS, *PPROGRESS; +} PROGRESSBAR, *PPROGRESSBAR; /* FUNCTIONS ****************************************************************/ -PPROGRESS +PPROGRESSBAR CreateProgressBar(SHORT Left, SHORT Top, SHORT Right, SHORT Bottom); VOID -DestroyProgressBar(PPROGRESS Bar); +DestroyProgressBar(PPROGRESSBAR Bar); VOID -ProgressSetStepCount(PPROGRESS Bar, +ProgressSetStepCount(PPROGRESSBAR Bar, ULONG StepCount); VOID -ProgressNextStep(PPROGRESS Bar); +ProgressNextStep(PPROGRESSBAR Bar); + +VOID +ProgressSetStep (PPROGRESSBAR Bar, + ULONG Step); #endif /* __PROGRESS_H__ */ diff --git a/reactos/subsys/system/usetup/usetup.c b/reactos/subsys/system/usetup/usetup.c index 1a584b0aeff..a0edcd97171 100644 --- a/reactos/subsys/system/usetup/usetup.c +++ b/reactos/subsys/system/usetup/usetup.c @@ -1,6 +1,6 @@ /* * ReactOS kernel - * Copyright (C) 2002, 2003 ReactOS Team + * Copyright (C) 2002, 2003, 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 @@ -84,7 +84,7 @@ typedef struct _COPYCONTEXT { ULONG TotalOperations; ULONG CompletedOperations; - PPROGRESS ProgressBar; + PPROGRESSBAR ProgressBar; } COPYCONTEXT, *PCOPYCONTEXT; @@ -492,6 +492,7 @@ CheckUnattendedSetup() InfCloseFile(UnattendInf); return; } + /* Get pointer 'InstallationDirectory' key */ if (!InfGetData(&Context, NULL, &Value)) { @@ -688,19 +689,15 @@ 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."); - SetStatusText(" ENTER = Continue F3 = Quit"); if (IsUnattendedSetup) { - return(INSTALL_INTRO_PAGE); + return INSTALL_INTRO_PAGE; } while(TRUE) @@ -711,24 +708,24 @@ IntroPage(PINPUT_RECORD Ir) (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */ { if (ConfirmQuit(Ir) == TRUE) - return(QUIT_PAGE); + return QUIT_PAGE; break; } else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(INSTALL_INTRO_PAGE); + return INSTALL_INTRO_PAGE; } else if (toupper(Ir->Event.KeyEvent.uChar.AsciiChar) == 'E') /* E */ { - return(EMERGENCY_INTRO_PAGE); + return EMERGENCY_INTRO_PAGE; } else if (toupper(Ir->Event.KeyEvent.uChar.AsciiChar) == 'R') /* R */ { - return(REPAIR_INTRO_PAGE); + return REPAIR_INTRO_PAGE; } } - return(INTRO_PAGE); + return INTRO_PAGE; } @@ -1930,8 +1927,8 @@ FormatPartitionPage (PINPUT_RECORD Ir) wcscpy (PathBuffer, SourceRootPath.Buffer); wcscat (PathBuffer, L"\\loader\\fat32.bin"); - DPRINT1 ("Install FAT32 bootcode: %S ==> %S\n", PathBuffer, - DestinationRootPath.Buffer); + DPRINT ("Install FAT32 bootcode: %S ==> %S\n", PathBuffer, + DestinationRootPath.Buffer); Status = InstallFat32BootCodeToDisk (PathBuffer, DestinationRootPath.Buffer); if (!NT_SUCCESS (Status)) @@ -1946,8 +1943,8 @@ FormatPartitionPage (PINPUT_RECORD Ir) wcscpy (PathBuffer, SourceRootPath.Buffer); wcscat (PathBuffer, L"\\loader\\fat.bin"); - DPRINT1 ("Install FAT bootcode: %S ==> %S\n", PathBuffer, - DestinationRootPath.Buffer); + DPRINT ("Install FAT bootcode: %S ==> %S\n", PathBuffer, + DestinationRootPath.Buffer); Status = InstallFat16BootCodeToDisk (PathBuffer, DestinationRootPath.Buffer); if (!NT_SUCCESS (Status)) @@ -3334,7 +3331,6 @@ BootLoaderPage(PINPUT_RECORD Ir) } - static PAGE_NUMBER QuitPage(PINPUT_RECORD Ir) { @@ -3534,9 +3530,6 @@ NtProcessStartup(PPEB Peb) Page = RepairIntroPage(&Ir); break; - case REBOOT_PAGE: - break; - /* Emergency pages */ case EMERGENCY_INTRO_PAGE: @@ -3555,6 +3548,9 @@ NtProcessStartup(PPEB Peb) case QUIT_PAGE: Page = QuitPage(&Ir); break; + + case REBOOT_PAGE: + break; } } From f493ab9cc7913c58051a09cace8850eaf0723fe0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Mon, 23 Feb 2004 12:39:37 +0000 Subject: [PATCH 0145/1463] Release the correct lock svn path=/trunk/; revision=8333 --- 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 b0dccf35e3c..0a933f1f833 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.16 2004/02/01 15:46:53 gvg Exp $ + * $Id: focus.c,v 1.17 2004/02/23 12:39:37 gvg Exp $ */ #include <win32k/win32k.h> @@ -176,7 +176,7 @@ IntSetForegroundAndFocusWindow(PWINDOW_OBJECT Window, PWINDOW_OBJECT FocusWindow { FocusWindow->MessageQueue->FocusWindow = hWndFocus; } - ExReleaseFastMutex(&Window->MessageQueue->Lock); + ExReleaseFastMutex(&FocusWindow->MessageQueue->Lock); IntSendDeactivateMessages(hWndPrev, hWnd); IntSendKillFocusMessages(hWndFocusPrev, hWndFocus); From 7a4c78bd4df8fb1e23c3df65c66313a15a1b4412 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Mon, 23 Feb 2004 18:16:37 +0000 Subject: [PATCH 0146/1463] - Fixed icon lookup so that in high color video modes colorfull icons are used. svn path=/trunk/; revision=8334 --- reactos/lib/user32/windows/bitmap.c | 20 +++++++++++--------- reactos/lib/user32/windows/icon.c | 6 +++--- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/reactos/lib/user32/windows/bitmap.c b/reactos/lib/user32/windows/bitmap.c index 6e72757bb33..cc4905ae585 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.26 2003/12/31 19:25:51 navaraf Exp $ +/* $Id: bitmap.c,v 1.27 2004/02/23 18:16:37 navaraf Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/input.c @@ -94,7 +94,7 @@ LoadCursorImage(HINSTANCE hinst, LPCWSTR lpszName, UINT fuLoad) GRPCURSORICONDIR* IconResDir; INT id; ICONIMAGE *ResIcon; - UINT Colors; + UINT ColorBits; if (!(fuLoad & LR_LOADFROMFILE)) { @@ -200,19 +200,21 @@ LoadCursorImage(HINSTANCE hinst, LPCWSTR lpszName, UINT fuLoad) if (fuLoad & LR_MONOCHROME) { - Colors = 2; + ColorBits = 1; } else { - Colors = GetDeviceCaps(hScreenDc, BITSPIXEL); - if (Colors > 8) - Colors = 256; - else - Colors = 1 << Colors; + ColorBits = GetDeviceCaps(hScreenDc, BITSPIXEL); + /* + * FIXME: + * Remove this after proper support for alpha icons will be finished. + */ + if (ColorBits > 8) + ColorBits = 8; } /* Pick the best size. */ - dirEntry = (CURSORICONDIRENTRY *)CURSORICON_FindBestIcon(IconDIR, 32, 32, Colors); + dirEntry = (CURSORICONDIRENTRY *)CURSORICON_FindBestIcon(IconDIR, 32, 32, ColorBits); if (!dirEntry) { UnmapViewOfFile(IconDIR); diff --git a/reactos/lib/user32/windows/icon.c b/reactos/lib/user32/windows/icon.c index dde510f5b2d..7e04ed21227 100644 --- a/reactos/lib/user32/windows/icon.c +++ b/reactos/lib/user32/windows/icon.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: icon.c,v 1.18 2004/01/23 23:38:26 ekohl Exp $ +/* $Id: icon.c,v 1.19 2004/02/23 18:16:37 navaraf Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/icon.c @@ -505,7 +505,7 @@ CURSORICON_FindBestCursor( GRPCURSORICONDIR *dir, int width, int height, int col /* Ported from WINE20030408 */ GRPCURSORICONDIRENTRY* -CURSORICON_FindBestIcon( GRPCURSORICONDIR *dir, int width, int height, int colors) +CURSORICON_FindBestIcon( GRPCURSORICONDIR *dir, int width, int height, int colorbits) { int i; GRPCURSORICONDIRENTRY *entry, *bestEntry = NULL; @@ -543,7 +543,7 @@ CURSORICON_FindBestIcon( GRPCURSORICONDIR *dir, int width, int height, int color if(abs(width - entry->ResInfo.icon.bWidth) == (int) iXDiff && abs(height - entry->ResInfo.icon.bHeight) == (int) iYDiff) { - iTempColorDiff = abs(colors - entry->ResInfo.icon.bColorCount); + iTempColorDiff = abs(colorbits - entry->wBitCount); if(iColorDiff > iTempColorDiff) { bestEntry = entry; From 405c0e0d5af6936187706691d73ea0ea5b497482 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Mon, 23 Feb 2004 20:08:35 +0000 Subject: [PATCH 0147/1463] Fix race condition svn path=/trunk/; revision=8335 --- reactos/subsys/win32k/ntuser/msgqueue.c | 28 +++++++++++++------------ 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index e2138ed08f3..2a3483d3139 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.68 2004/02/22 12:25:02 navaraf Exp $ +/* $Id: msgqueue.c,v 1.69 2004/02/23 20:08:35 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -447,6 +447,19 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, DesktopWindow = IntGetWindowObject(IntGetDesktopWindow()); + WaitObjects[1] = &MessageQueue->NewMessages; + WaitObjects[0] = &HardwareMessageQueueLock; + do + { + WaitStatus = KeWaitForMultipleObjects(2, WaitObjects, WaitAny, UserRequest, + UserMode, TRUE, NULL, NULL); + while (MsqDispatchOneSentMessage(MessageQueue)) + { + ; + } + } + while (NT_SUCCESS(WaitStatus) && STATUS_WAIT_0 != WaitStatus); + /* Process messages in the message queue itself. */ ExAcquireFastMutex(&MessageQueue->HardwareLock); CurrentEntry = MessageQueue->HardwareMessagesListHead.Flink; @@ -469,6 +482,7 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, RemoveEntryList(&Current->ListEntry); } ExReleaseFastMutex(&MessageQueue->HardwareLock); + KeReleaseMutex(&HardwareMessageQueueLock, FALSE); *Message = Current; IntReleaseWindowObject(DesktopWindow); return(TRUE); @@ -481,18 +495,6 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, ExReleaseFastMutex(&MessageQueue->HardwareLock); /* Now try the global queue. */ - WaitObjects[1] = &MessageQueue->NewMessages; - WaitObjects[0] = &HardwareMessageQueueLock; - do - { - WaitStatus = KeWaitForMultipleObjects(2, WaitObjects, WaitAny, UserRequest, - UserMode, TRUE, NULL, NULL); - while (MsqDispatchOneSentMessage(MessageQueue)) - { - ; - } - } - while (NT_SUCCESS(WaitStatus) && STATUS_WAIT_0 != WaitStatus); /* Transfer all messages from the DPC accessible queue to the main queue. */ KeAcquireSpinLock(&SystemMessageQueueLock, &OldIrql); From 717ccf2aa4273b18c7feaf77f4af0c828b002c48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Mon, 23 Feb 2004 20:10:01 +0000 Subject: [PATCH 0148/1463] Fix key left at begin and key right at end of menu svn path=/trunk/; revision=8336 --- reactos/lib/user32/windows/menu.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/reactos/lib/user32/windows/menu.c b/reactos/lib/user32/windows/menu.c index bd69c6ada5a..fe85317d018 100644 --- a/reactos/lib/user32/windows/menu.c +++ b/reactos/lib/user32/windows/menu.c @@ -21,7 +21,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: menu.c,v 1.50 2004/02/22 23:40:58 gvg Exp $ +/* $Id: menu.c,v 1.51 2004/02/23 20:10:01 gvg Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/menu.c @@ -238,6 +238,7 @@ MenuGetRosMenuItemInfo(HMENU Menu, UINT Index, PROSMENUITEMINFO ItemInfo) ItemInfo->cch = 0; } ItemInfo->fType = 0; + return FALSE; } if (MF_STRING == MENU_ITEM_TYPE(ItemInfo->fType)) @@ -2241,7 +2242,7 @@ MenuButtonDown(MTRACKER* Mt, HMENU PtMenu, UINT Flags) Index = NtUserMenuItemFromPoint(Mt->OwnerWnd, PtMenu, Mt->Pt.x, Mt->Pt.y); } MenuInitRosMenuItemInfo(&Item); - if (Index < 0 || ! MenuGetRosMenuItemInfo(PtMenu, Index, &Item)) + if (NO_SELECTED_ITEM == Index || ! MenuGetRosMenuItemInfo(PtMenu, Index, &Item)) { MenuCleanupRosMenuItemInfo(&Item); return FALSE; @@ -2809,7 +2810,8 @@ MenuKeyLeft(MTRACKER* Mt, UINT Flags) /* A sublevel menu was displayed - display the next one * unless there is another displacement coming up */ - if (! MenuSuspendPopup(Mt, WM_KEYDOWN)) + if (! MenuSuspendPopup(Mt, WM_KEYDOWN) + && MenuGetRosMenuInfo(&TopMenuInfo, Mt->TopMenu)) { Mt->CurrentMenu = MenuShowSubPopup(Mt->OwnerWnd, &TopMenuInfo, TRUE, Flags); @@ -2891,7 +2893,8 @@ MenuKeyRight(MTRACKER *Mt, UINT Flags) if (NULL != MenuTmp || 0 != (Mt->TrackFlags & TF_SUSPENDPOPUP)) { - if (! MenuSuspendPopup(Mt, WM_KEYDOWN)) + if (! MenuSuspendPopup(Mt, WM_KEYDOWN) + && MenuGetRosMenuInfo(&MenuInfo, Mt->TopMenu)) { Mt->CurrentMenu = MenuShowSubPopup(Mt->OwnerWnd, &MenuInfo, TRUE, Flags); From 8c1f187f6e46205c33cf0185834069a1f1ddb134 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Mon, 23 Feb 2004 20:36:21 +0000 Subject: [PATCH 0149/1463] fixed icon handle leak in notification area svn path=/trunk/; revision=8337 --- reactos/subsys/system/explorer/doc/TODO.txt | 1 - .../subsys/system/explorer/taskbar/traynotify.cpp | 12 ++++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/reactos/subsys/system/explorer/doc/TODO.txt b/reactos/subsys/system/explorer/doc/TODO.txt index c213f16491d..4f079c3f76a 100644 --- a/reactos/subsys/system/explorer/doc/TODO.txt +++ b/reactos/subsys/system/explorer/doc/TODO.txt @@ -22,7 +22,6 @@ - implement more than one column for very crowded start menus - Execute selected programs with additional command line options ("Run" dialog with pre-filled edit field) -- GDI-Leaks - autostart doesn't on NT4 ? - Startmenu: You can't close the start menu with pressing Win-key You can open the start menu diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index 53c5691598e..10eee1a68d7 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -68,10 +68,14 @@ NotifyInfo& NotifyInfo::operator=(NOTIFYICONDATA* pnid) if (pnid->uFlags & NIF_MESSAGE) _uCallbackMessage = pnid->uCallbackMessage; - if (pnid->uFlags & NIF_ICON) - // Some applications destroy the icon immediatelly after completing the, - // NIM_ADD/MODIFY message, so we have to make a copy if it. + if (pnid->uFlags & NIF_ICON) { + // Some applications destroy the icon immediatelly after completing the + // NIM_ADD/MODIFY message, so we have to make a copy of it. + if (_hIcon) + DestroyIcon(_hIcon); + _hIcon = (HICON) CopyImage(pnid->hIcon, IMAGE_ICON, 16, 16, 0); + } #ifdef NIF_STATE // currently (as of 21.08.2003) missing in MinGW headers if (pnid->uFlags & NIF_STATE) @@ -287,7 +291,7 @@ void NotifyArea::Paint() // draw icons int x = 2; - int y = 2; + int y = 3; for(NotifyIconSet::const_iterator it=_sorted_icons.begin(); it!=_sorted_icons.end(); ++it) { DrawIconEx(canvas, x, y, it->_hIcon, 16, 16, 0, 0, DI_NORMAL); From b320e099ed84090efeea79a7edfb0efb24de9202 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Mon, 23 Feb 2004 20:56:50 +0000 Subject: [PATCH 0150/1463] - Compilation fixes. svn path=/trunk/; revision=8339 --- reactos/apps/utils/net/roshttpd/httpd.cpp | 2 +- reactos/apps/utils/net/roshttpd/include/error.h | 2 +- reactos/apps/utils/net/roshttpd/makefile | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/apps/utils/net/roshttpd/httpd.cpp b/reactos/apps/utils/net/roshttpd/httpd.cpp index 2ab38c88471..2aa43bdaec1 100644 --- a/reactos/apps/utils/net/roshttpd/httpd.cpp +++ b/reactos/apps/utils/net/roshttpd/httpd.cpp @@ -315,7 +315,7 @@ VOID CHttpClient::OnWrite() DWORD nBytesToRead; DWORD nBytesRead; - OutputDebugString(_T("Can write\n")); + OutputDebugString(TS("Can write\n")); if (bSendingFile) { if (nTotalRead + nBufferSize < nFileSize) diff --git a/reactos/apps/utils/net/roshttpd/include/error.h b/reactos/apps/utils/net/roshttpd/include/error.h index 33cf9c40a6d..483d9159ddd 100644 --- a/reactos/apps/utils/net/roshttpd/include/error.h +++ b/reactos/apps/utils/net/roshttpd/include/error.h @@ -8,7 +8,7 @@ #include <windows.h> -#define TS(x) (LPTSTR)_T(x) +#define TS(x) (LPTSTR)TEXT(x) void ReportErrorStr(LPTSTR lpsText); diff --git a/reactos/apps/utils/net/roshttpd/makefile b/reactos/apps/utils/net/roshttpd/makefile index 5b4ebf9f839..bda5b01f2e9 100644 --- a/reactos/apps/utils/net/roshttpd/makefile +++ b/reactos/apps/utils/net/roshttpd/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.7 2003/12/25 14:06:14 chorns Exp $ +# $Id: makefile,v 1.8 2004/02/23 20:56:50 navaraf Exp $ PATH_TO_TOP = ../../../.. @@ -10,7 +10,7 @@ TARGET_APPTYPE = console TARGET_NAME = roshttpd -TARGET_CPPFLAGS = -I./include -DUNICODE -D_UNICODE -DDBG -Wno-deprecated +TARGET_CPPFLAGS = -I./include -DUNICODE -D_UNICODE -DDBG -D__USE_W32API -Wno-deprecated TARGET_GCCLIBS = stdc++ From 1092faa446ab9f5d5ab2ba02a8b1c37db0eb0d24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Mon, 23 Feb 2004 21:18:45 +0000 Subject: [PATCH 0151/1463] Recursively search sub menus when a command id is specified svn path=/trunk/; revision=8340 --- reactos/subsys/win32k/ntuser/menu.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/menu.c b/reactos/subsys/win32k/ntuser/menu.c index dddff914113..e6addf19e3d 100644 --- a/reactos/subsys/win32k/ntuser/menu.c +++ b/reactos/subsys/win32k/ntuser/menu.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: menu.c,v 1.48 2004/02/22 23:40:58 gvg Exp $ +/* $Id: menu.c,v 1.49 2004/02/23 21:18:45 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -507,11 +507,13 @@ IntSetMenuInfo(PMENU_OBJECT MenuObject, PROSMENUINFO lpmi) int FASTCALL IntGetMenuItemByFlag(PMENU_OBJECT MenuObject, UINT uSearchBy, UINT fFlag, - PMENU_ITEM *MenuItem, PMENU_ITEM *PrevMenuItem) + PMENU_ITEM *MenuItem, PMENU_ITEM *PrevMenuItem) { PMENU_ITEM PrevItem = NULL; PMENU_ITEM CurItem = MenuObject->MenuItemList; int p; + int ret; + if(MF_BYPOSITION & fFlag) { p = uSearchBy; @@ -546,6 +548,21 @@ IntGetMenuItemByFlag(PMENU_OBJECT MenuObject, UINT uSearchBy, UINT fFlag, if(PrevMenuItem) *PrevMenuItem = PrevItem; return p; } + else if (0 != (CurItem->fType & MF_POPUP)) + { + MenuObject = IntGetMenuObject(CurItem->hSubMenu); + if (NULL != MenuObject) + { + ret = IntGetMenuItemByFlag(MenuObject, uSearchBy, fFlag, + MenuItem, PrevMenuItem); + if (-1 != ret) + { + IntReleaseMenuObject(MenuObject); + return ret; + } + } + IntReleaseMenuObject(MenuObject); + } PrevItem = CurItem; CurItem = CurItem->Next; p++; From 46d0e1a57c3b29e0478efce45598cc0e944cc1a0 Mon Sep 17 00:00:00 2001 From: Casper Hornstrup <chorns@users.sourceforge.net> Date: Mon, 23 Feb 2004 21:46:54 +0000 Subject: [PATCH 0152/1463] 2004-02-23 Casper S. Hornstrup <chorns@users.sourceforge.net> * tools/regtests.c (KMSTUB): Correct device name. svn path=/trunk/; revision=8341 --- reactos/ChangeLog | 4 ++++ reactos/tools/regtests.c | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/reactos/ChangeLog b/reactos/ChangeLog index 16a39332003..a6c46456e52 100644 --- a/reactos/ChangeLog +++ b/reactos/ChangeLog @@ -1,3 +1,7 @@ +2004-02-23 Casper S. Hornstrup <chorns@users.sourceforge.net> + + * tools/regtests.c (KMSTUB): Correct device name. + 2004-02-22 Ge van Geldorp <ge@gse.nl> * Implement keyboard navigation for menus diff --git a/reactos/tools/regtests.c b/reactos/tools/regtests.c index 2794393c1bf..ea28f56913b 100755 --- a/reactos/tools/regtests.c +++ b/reactos/tools/regtests.c @@ -426,7 +426,7 @@ static char KMSTUB[] = "\n" " if (KMRegTestsDeviceObject == NULL)\n" " {\n" - " RtlInitUnicodeString(&DriverName, L\"\\Device\\KMRegTests\");\n" + " RtlInitUnicodeString(&DriverName, L\"\\\\Device\\\\KMRegTests\");\n" " Status = IoGetDeviceObjectPointer(&DriverName, FILE_WRITE_ATTRIBUTES,\n" " &KMRegTestsFileObject, &KMRegTestsDeviceObject);\n" " if (!NT_SUCCESS(Status)) return;\n" From 47d8d8ba89470837272c668924eaf7bc47396411 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Mon, 23 Feb 2004 22:04:38 +0000 Subject: [PATCH 0153/1463] - As CURSORICON_FindBestIcon now takes color *bits* count and not color count, fixed the color calculation in LookupIconIdFromDirectoryEx. svn path=/trunk/; revision=8342 --- reactos/lib/user32/windows/icon.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/reactos/lib/user32/windows/icon.c b/reactos/lib/user32/windows/icon.c index 7e04ed21227..8850e17c07b 100644 --- a/reactos/lib/user32/windows/icon.c +++ b/reactos/lib/user32/windows/icon.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: icon.c,v 1.19 2004/02/23 18:16:37 navaraf Exp $ +/* $Id: icon.c,v 1.20 2004/02/23 22:04:38 navaraf Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/icon.c @@ -574,24 +574,22 @@ LookupIconIdFromDirectoryEx( { GRPCURSORICONDIRENTRY *entry; HDC hdc; - int colors; + int ColorBits; hdc = GetDC(0); if (Flags & LR_MONOCHROME) { - colors = 2; + ColorBits = 1; } else { - colors = GetDeviceCaps(hdc, BITSPIXEL); - if (colors > 8) - colors = 256; - else - colors = 1 << colors; + ColorBits = GetDeviceCaps(hdc, BITSPIXEL); + if (ColorBits > 8) + ColorBits = 8; } ReleaseDC(0, hdc); - entry = CURSORICON_FindBestIcon( dir, cxDesired, cyDesired, colors ); + entry = CURSORICON_FindBestIcon( dir, cxDesired, cyDesired, ColorBits ); if (entry) retVal = entry->nID; From 60f5689a701a5879677d785fd9d18c439591d5a0 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Mon, 23 Feb 2004 22:17:01 +0000 Subject: [PATCH 0154/1463] keyboard navigation in start menu using first character of display names svn path=/trunk/; revision=8344 --- .../subsys/system/explorer/doxy-footer.html | 2 +- .../system/explorer/taskbar/startmenu.cpp | 54 +++++++++++++++++++ .../system/explorer/taskbar/startmenu.h | 1 + 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/system/explorer/doxy-footer.html b/reactos/subsys/system/explorer/doxy-footer.html index da80c841467..3c9901bd1b9 100644 --- a/reactos/subsys/system/explorer/doxy-footer.html +++ b/reactos/subsys/system/explorer/doxy-footer.html @@ -3,7 +3,7 @@ <tr> <td><address style="align: right;"><small> ROS Explorer Source Code Documentation -<br>generated on 22.02.2004 by <a href="http://www.doxygen.org/index.html"> +<br>generated on 23.02.2004 by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border=0> </small></address> </td> diff --git a/reactos/subsys/system/explorer/taskbar/startmenu.cpp b/reactos/subsys/system/explorer/taskbar/startmenu.cpp index 76fbdbae1cc..26d3c658f87 100644 --- a/reactos/subsys/system/explorer/taskbar/startmenu.cpp +++ b/reactos/subsys/system/explorer/taskbar/startmenu.cpp @@ -542,6 +542,10 @@ void StartMenu::ProcessKey(int vk) case VK_ESCAPE: CloseStartMenu(); break; + + default: + if (vk>='0' && vk<='Z') + JumpToNextShortcut(vk); } } @@ -568,6 +572,56 @@ bool StartMenu::Navigate(int step) return false; } +bool StartMenu::JumpToNextShortcut(char c) +{ + int cur_idx = GetSelectionIndex(); + + if (cur_idx == -1) + cur_idx = 0; + + int first_found = 0; + int found_more = 0; + + SMBtnVector::const_iterator cur_it = _buttons.begin(); + cur_it += cur_idx + 1; + + // first search down from current item... + SMBtnVector::const_iterator it = cur_it; + for(; it!=_buttons.end(); ++it) { + const SMBtnInfo& btn = *it; + + if (!btn._title.empty() && toupper((TBYTE)btn._title.at(0)) == c) { + if (!first_found) + first_found = btn._id; + else + ++found_more; + } + } + + // ...now search from top to the current item + it = _buttons.begin(); + for(; it!=_buttons.end() && it!=cur_it; ++it) { + const SMBtnInfo& btn = *it; + + if (!btn._title.empty() && toupper((TBYTE)btn._title.at(0)) == c) { + if (!first_found) + first_found = btn._id; + else + ++found_more; + } + } + + if (first_found) { + SelectButton(first_found); + + if (!found_more) + Command(first_found, BN_CLICKED); + + return true; + } else + return false; +} + #endif // _LIGHT_STARTMENU diff --git a/reactos/subsys/system/explorer/taskbar/startmenu.h b/reactos/subsys/system/explorer/taskbar/startmenu.h index 550f35fb883..4cea212148e 100644 --- a/reactos/subsys/system/explorer/taskbar/startmenu.h +++ b/reactos/subsys/system/explorer/taskbar/startmenu.h @@ -258,6 +258,7 @@ protected: virtual void ProcessKey(int vk); bool Navigate(int step); bool OpenSubmenu(bool select_first=false); + bool JumpToNextShortcut(char c); #endif // member functions From d8b7c0ee97ecbc0515e69e0a7a5dd76f4ea8a8d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Mon, 23 Feb 2004 22:44:52 +0000 Subject: [PATCH 0155/1463] Fix mono -> color bitblts svn path=/trunk/; revision=8345 --- reactos/subsys/win32k/objects/bitmaps.c | 28 ++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index e8bff7e148b..916f5932373 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.56 2004/02/20 07:45:58 royce Exp $ */ +/* $Id: bitmaps.c,v 1.57 2004/02/23 22:44:52 gvg Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> #include <stdlib.h> @@ -61,6 +61,7 @@ BOOL STDCALL NtGdiBitBlt(HDC hDCDest, PBRUSHOBJ BrushObj; BOOL UsesSource = ((ROP & 0xCC0000) >> 2) != (ROP & 0x330000); BOOL UsesPattern = TRUE;//((ROP & 0xF00000) >> 4) != (ROP & 0x0F0000); + HPALETTE Mono = NULL; DCDest = DC_LockDc(hDCDest); if (NULL == DCDest) @@ -196,17 +197,38 @@ BOOL STDCALL NtGdiBitBlt(HDC hDCDest, PALETTE_UnlockPalette(DestPalette); } + /* KB41464 details how to convert between mono and color */ if (DCDest->w.bitsPerPixel == 1) { XlateObj = (PXLATEOBJ)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 = EngCreatePalette(PAL_INDEXED, 2, Colors, 0, 0, 0); + if (NULL != Mono) + { + XlateObj = (PXLATEOBJ)IntEngCreateXlate(DestMode, PAL_INDEXED, DestPalette, Mono); + } + else + { + XlateObj = NULL; + } + } else { XlateObj = (PXLATEOBJ)IntEngCreateXlate(DestMode, SourceMode, DestPalette, SourcePalette); } if (NULL == XlateObj) { + if (NULL != Mono) + { + EngDeletePalette(Mono); + } if (UsesSource && hDCSrc != hDCDest) { DC_UnlockDc(hDCSrc); @@ -221,6 +243,10 @@ BOOL STDCALL NtGdiBitBlt(HDC hDCDest, &DestRect, &SourcePoint, NULL, BrushObj, NULL, ROP); EngDeleteXlate(XlateObj); + if (NULL != Mono) + { + EngDeletePalette(Mono); + } if (UsesPattern) { BRUSHOBJ_UnlockBrush(DCDest->w.hBrush); From b13d239f87305a052ad0bdceb07dfd5c8b99a6c3 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Tue, 24 Feb 2004 01:30:58 +0000 Subject: [PATCH 0156/1463] 1. get rid of winlock.c 2. changed the Parent and Object field of the WINDOW_OBJECT structure to HANDLE for easier maintainance and serialize any access to them svn path=/trunk/; revision=8346 --- reactos/subsys/win32k/include/window.h | 77 +-- reactos/subsys/win32k/main/dllmain.c | 4 +- reactos/subsys/win32k/makefile | 5 +- reactos/subsys/win32k/misc/object.c | 17 +- reactos/subsys/win32k/ntuser/focus.c | 33 +- reactos/subsys/win32k/ntuser/message.c | 12 +- reactos/subsys/win32k/ntuser/msgqueue.c | 15 +- reactos/subsys/win32k/ntuser/painting.c | 40 +- reactos/subsys/win32k/ntuser/vis.c | 28 +- reactos/subsys/win32k/ntuser/windc.c | 24 +- reactos/subsys/win32k/ntuser/window.c | 708 +++++++++++------------- reactos/subsys/win32k/ntuser/winlock.c | 126 ----- reactos/subsys/win32k/ntuser/winpos.c | 293 ++++++---- 13 files changed, 639 insertions(+), 743 deletions(-) delete mode 100644 reactos/subsys/win32k/ntuser/winlock.c diff --git a/reactos/subsys/win32k/include/window.h b/reactos/subsys/win32k/include/window.h index bcc22d276c6..09d3a851310 100644 --- a/reactos/subsys/win32k/include/window.h +++ b/reactos/subsys/win32k/include/window.h @@ -7,6 +7,7 @@ typedef struct _WINDOW_OBJECT *PWINDOW_OBJECT; #include <windows.h> #include <ddk/ntddk.h> +#include <include/object.h> #include <include/class.h> #include <include/msgqueue.h> #include <include/winsta.h> @@ -63,18 +64,18 @@ typedef struct _WINDOW_OBJECT FAST_MUTEX UpdateLock; /* Pointer to the owning thread's message queue. */ PUSER_MESSAGE_QUEUE MessageQueue; + /* Lock for the list of child windows. */ + FAST_MUTEX RelativesLock; struct _WINDOW_OBJECT* FirstChild; struct _WINDOW_OBJECT* LastChild; - /* Lock for the list of child windows. */ - FAST_MUTEX ChildrenListLock; struct _WINDOW_OBJECT* NextSibling; struct _WINDOW_OBJECT* PrevSibling; /* Entry in the list of thread windows. */ LIST_ENTRY ThreadListEntry; /* Pointer to the parent window. */ - struct _WINDOW_OBJECT* Parent; + HANDLE Parent; /* Pointer to the owner window. */ - struct _WINDOW_OBJECT* Owner; + HANDLE Owner; /* DC Entries (DCE) */ PDCE Dce; /* Property list head.*/ @@ -101,9 +102,40 @@ typedef struct _WINDOW_OBJECT #define WINDOWOBJECT_NEED_INTERNALPAINT (0x00000008) #define WINDOWOBJECT_RESTOREMAX (0x00000020) -inline BOOL IntIsDesktopWindow(PWINDOW_OBJECT WindowObject); +#define IntIsDesktopWindow(WndObj) \ + (WndObj->Parent == NULL) -inline BOOL IntIsBroadcastHwnd(HWND hwnd); +#define IntIsBroadcastHwnd(hWnd) \ + (hWnd == HWND_BROADCAST || hWnd == HWND_TOPMOST) + +#define IntGetWindowObject(hWnd) \ + IntGetProcessWindowObject(PsGetWin32Process(), hWnd) + +#define IntReferenceWindowObject(WndObj) \ + ObmReferenceObjectByPointer(WndObj, otWindow) + +#define IntReleaseWindowObject(WndObj) \ + ObmDereferenceObject(WndObj) + +#define IntWndBelongsToThread(WndObj, W32Thread) \ + (((WndObj->OwnerThread && WndObj->OwnerThread->Win32Thread)) && \ + (WndObj->OwnerThread->Win32Thread == W32Thread)) + +#define IntGetWndThreadId(WndObj) \ + WndObj->OwnerThread->Cid.UniqueThread + +#define IntGetWndProcessId(WndObj) \ + WndObj->OwnerThread->ThreadsProcess->UniqueProcessId + +#define IntLockRelatives(WndObj) \ + ExAcquireFastMutexUnsafe(&WndObj->RelativesLock) + +#define IntUnLockRelatives(WndObj) \ + ExReleaseFastMutexUnsafe(&WndObj->RelativesLock) + + +PWINDOW_OBJECT FASTCALL +IntGetProcessWindowObject(PW32PROCESS ProcessData, HWND hWnd); BOOL FASTCALL IntIsWindow(HWND hWnd); @@ -111,9 +143,6 @@ IntIsWindow(HWND hWnd); HWND* FASTCALL IntWinListChildren(PWINDOW_OBJECT Window); -BOOLEAN FASTCALL -IntWndBelongsToThread(PWINDOW_OBJECT Window, PW32THREAD ThreadData); - NTSTATUS FASTCALL InitWindowImpl (VOID); @@ -123,17 +152,11 @@ CleanupWindowImpl (VOID); VOID FASTCALL IntGetClientRect (PWINDOW_OBJECT WindowObject, PRECT Rect); -PWINDOW_OBJECT FASTCALL -IntGetWindowObject (HWND hWnd); - -VOID FASTCALL -IntReleaseWindowObject (PWINDOW_OBJECT Window); - HWND FASTCALL IntGetActiveWindow (VOID); BOOL FASTCALL -IntIsWindowVisible (HWND Wnd); +IntIsWindowVisible (HWND hWnd); BOOL FASTCALL IntIsChildWindow (HWND Parent, HWND Child); @@ -144,9 +167,6 @@ IntSetProp(PWINDOW_OBJECT Wnd, ATOM Atom, HANDLE Data); PPROPERTY FASTCALL IntGetProp(PWINDOW_OBJECT WindowObject, ATOM Atom); -DWORD FASTCALL -IntGetWindowThreadProcessId(PWINDOW_OBJECT Wnd, PDWORD pid); - VOID FASTCALL IntUnlinkWindow(PWINDOW_OBJECT Wnd); @@ -159,24 +179,9 @@ IntGetAncestor(PWINDOW_OBJECT Wnd, UINT Type); PWINDOW_OBJECT FASTCALL IntGetParent(PWINDOW_OBJECT Wnd); -typedef enum _WINLOCK_TYPE -{ - None, - Any, - Shared, - Exclusive -} WINLOCK_TYPE; +PWINDOW_OBJECT FASTCALL +IntGetParentObject(PWINDOW_OBJECT Wnd); -#define ASSERT_WINLOCK(a) assert(IntVerifyWinLock(a)) - -inline VOID IntAcquireWinLockShared(); -inline VOID IntAcquireWinLockExclusive(); -inline VOID IntReleaseWinLock(); -BOOL FASTCALL IntVerifyWinLock(WINLOCK_TYPE Type); -WINLOCK_TYPE FASTCALL IntSuspendWinLock(); -VOID FASTCALL IntRestoreWinLock(WINLOCK_TYPE Type); -inline BOOL IntInitializeWinLock(); -inline VOID IntDeleteWinLock(); DWORD IntRemoveWndProcHandle(WNDPROC Handle); DWORD IntRemoveProcessWndProcHandles(HANDLE ProcessID); DWORD IntAddWndProcHandle(WNDPROC WindowProc, BOOL IsUnicode); diff --git a/reactos/subsys/win32k/main/dllmain.c b/reactos/subsys/win32k/main/dllmain.c index 95ab484902c..13d37e615bf 100644 --- a/reactos/subsys/win32k/main/dllmain.c +++ b/reactos/subsys/win32k/main/dllmain.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: dllmain.c,v 1.66 2004/02/05 20:09:10 gvg Exp $ +/* $Id: dllmain.c,v 1.67 2004/02/24 01:30:57 weiden Exp $ * * Entry Point for win32k.sys */ @@ -194,8 +194,6 @@ DllMain ( NTSTATUS Status; BOOLEAN Result; - IntInitializeWinLock(); - /* * Register user mode call interface * (system service table index = 1) diff --git a/reactos/subsys/win32k/makefile b/reactos/subsys/win32k/makefile index a99cbc05316..1a52e0eddfe 100644 --- a/reactos/subsys/win32k/makefile +++ b/reactos/subsys/win32k/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.93 2004/02/19 06:59:50 arty Exp $ +# $Id: makefile,v 1.94 2004/02/24 01:30:57 weiden Exp $ PATH_TO_TOP = ../.. @@ -56,8 +56,7 @@ NTUSER_OBJECTS = ntuser/accelerator.o ntuser/callback.o ntuser/caret.o ntuser/cl ntuser/menu.o ntuser/message.o ntuser/metric.o ntuser/misc.o \ ntuser/msgqueue.o ntuser/painting.o ntuser/prop.o ntuser/scrollbar.o \ ntuser/stubs.o ntuser/timer.o ntuser/useratom.o ntuser/vis.o \ - ntuser/windc.o ntuser/window.o ntuser/winlock.o ntuser/winpos.o \ - ntuser/winsta.o + ntuser/windc.o ntuser/window.o ntuser/winpos.o ntuser/winsta.o OBJECTS_OBJECTS = objects/bitmaps.o objects/brush.o objects/cliprgn.o \ objects/color.o objects/coord.o objects/dc.o \ diff --git a/reactos/subsys/win32k/misc/object.c b/reactos/subsys/win32k/misc/object.c index 95b36e9dcf7..35b093aea82 100644 --- a/reactos/subsys/win32k/misc/object.c +++ b/reactos/subsys/win32k/misc/object.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: object.c,v 1.8 2003/12/17 19:56:13 weiden Exp $ +/* $Id: object.c,v 1.9 2004/02/24 01:30:57 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -31,6 +31,7 @@ #include <ddk/ntddk.h> #include <include/object.h> +#include <include/window.h> #define NDEBUG #include <debug.h> @@ -113,7 +114,7 @@ ObmpGetObjectByHandle(PUSER_HANDLE_TABLE HandleTable, Current = Current->Flink; if (Current == &(HandleTable->ListHead)) { - DPRINT1("Invalid handle 0x%x\n", Handle); + DPRINT1("Invalid handle 0x%x\n", Handle); return NULL; } } @@ -275,6 +276,7 @@ ObmReferenceObject(PVOID ObjectBody) if (!ObjectBody) { + DPRINT1("Cannot Reference NULL!\n"); return; } @@ -298,13 +300,17 @@ ObmDereferenceObject(PVOID ObjectBody) if (!ObjectBody) { + DPRINT1("Cannot Dereference NULL!\n"); return; } ObjectHeader = BODY_TO_HEADER(ObjectBody); ObjectHeader->RefCount--; - + #if 0 + if(ObjectHeader->Type == otWindow) + DbgPrint("Dereference 0x%x: %d\n", ((PWINDOW_OBJECT)ObjectBody)->Self, ObjectHeader->RefCount); + #endif ObmpPerformRetentionChecks(ObjectHeader); } @@ -327,7 +333,10 @@ ObmReferenceObjectByPointer(PVOID ObjectBody, { return STATUS_INVALID_PARAMETER; } - + #if 0 + if(ObjectType == otWindow) + DbgPrint("Reference 0x%x: %d\n", ((PWINDOW_OBJECT)ObjectBody)->Self, ObjectHeader->RefCount); + #endif ObjectHeader->RefCount++; return STATUS_SUCCESS; diff --git a/reactos/subsys/win32k/ntuser/focus.c b/reactos/subsys/win32k/ntuser/focus.c index 0a933f1f833..2efd2840c46 100644 --- a/reactos/subsys/win32k/ntuser/focus.c +++ b/reactos/subsys/win32k/ntuser/focus.c @@ -16,10 +16,11 @@ * 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.17 2004/02/23 12:39:37 gvg Exp $ + * $Id: focus.c,v 1.18 2004/02/24 01:30:57 weiden Exp $ */ #include <win32k/win32k.h> +#include <include/object.h> #include <include/window.h> #include <include/desktop.h> #include <include/focus.h> @@ -112,20 +113,28 @@ HWND FASTCALL IntFindChildWindowToOwner(PWINDOW_OBJECT Root, PWINDOW_OBJECT Owner) { HWND Ret; - PWINDOW_OBJECT Child; - ExAcquireFastMutexUnsafe(&Root->ChildrenListLock); + PWINDOW_OBJECT Child, OwnerWnd; + IntLockRelatives(Root); for(Child = Root->FirstChild; Child; Child = Child->NextSibling) { - if(Child->Owner == Owner) + IntLockRelatives(Child); + OwnerWnd = IntGetWindowObject(Child->Owner); + IntUnLockRelatives(Child); + if(!OwnerWnd) + continue; + + if(OwnerWnd == Owner) { + IntUnLockRelatives(Root); Ret = Child->Self; - ExReleaseFastMutexUnsafe(&Root->ChildrenListLock); + IntReleaseWindowObject(OwnerWnd); return Ret; } + IntReleaseWindowObject(OwnerWnd); } - ExReleaseFastMutexUnsafe(&Root->ChildrenListLock); + IntUnLockRelatives(Root); return NULL; } @@ -186,7 +195,7 @@ IntSetForegroundAndFocusWindow(PWINDOW_OBJECT Window, PWINDOW_OBJECT FocusWindow } IntSendSetFocusMessages(hWndFocusPrev, hWndFocus); IntSendActivateMessages(hWndPrev, hWnd, MouseActivate); - + return TRUE; } @@ -210,8 +219,7 @@ IntMouseActivateWindow(PWINDOW_OBJECT Window) if(DesktopWindow) { Top = IntFindChildWindowToOwner(DesktopWindow, Window); - TopWnd = IntGetWindowObject(Top); - if(TopWnd) + if((TopWnd = IntGetWindowObject(Top))) { Ret = IntMouseActivateWindow(TopWnd); IntReleaseWindowObject(TopWnd); @@ -283,9 +291,8 @@ IntSetActiveWindow(PWINDOW_OBJECT Window) } HWND FASTCALL -IntSetFocusWindow(PWINDOW_OBJECT Window) +IntSetFocusWindow(HWND hWnd) { - HWND hWnd = Window != 0 ? Window->Self : 0; HWND hWndPrev = 0; PUSER_MESSAGE_QUEUE ThreadQueue; @@ -453,14 +460,14 @@ NtUserSetFocus(HWND hWnd) NtUserSetActiveWindow(hWndTop); } - hWndPrev = IntSetFocusWindow(Window); + hWndPrev = IntSetFocusWindow(hWnd); IntReleaseWindowObject(Window); return hWndPrev; } else { - return IntSetFocusWindow(0); + return IntSetFocusWindow(NULL); } } diff --git a/reactos/subsys/win32k/ntuser/message.c b/reactos/subsys/win32k/ntuser/message.c index 8d518c87202..de41ee99cba 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.50 2004/02/19 21:12:09 weiden Exp $ +/* $Id: message.c,v 1.51 2004/02/24 01:30:57 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -776,13 +776,11 @@ IntSendMessage(HWND hWnd, IntReleaseWindowObject(Window); return Result; } - else - { - Result = MsqSendMessage(Window->MessageQueue, hWnd, Msg, wParam, lParam); + + Result = MsqSendMessage(Window->MessageQueue, hWnd, Msg, wParam, lParam); - IntReleaseWindowObject(Window); - return Result; - } + IntReleaseWindowObject(Window); + return Result; } static NTSTATUS FASTCALL diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index 2a3483d3139..d83d2726e10 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.69 2004/02/23 20:08:35 gvg Exp $ +/* $Id: msgqueue.c,v 1.70 2004/02/24 01:30:57 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -258,11 +258,13 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, /* **Make sure that we have a window that is not already in focus */ - if (0 != Window && Window->Self != IntGetFocusWindow()) + if (Window) { + if(Window->Self != IntGetFocusWindow()) + { SpareLParam = MAKELONG(Hit, Msg); - if(Window && (Hit != (USHORT)HTTRANSPARENT)) + if(Hit != (USHORT)HTTRANSPARENT) { Result = IntSendMessage(Window->Self, WM_MOUSEACTIVATE, (WPARAM)NtUserGetParent(Window->Self), (LPARAM)SpareLParam); @@ -285,16 +287,16 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, IntMouseActivateWindow(Window); break; } - IntReleaseWindowObject(Window); } else { - if(Window) - IntReleaseWindowObject(Window); + IntReleaseWindowObject(Window); ExFreePool(Message); *Freed = TRUE; return(FALSE); } + } + IntReleaseWindowObject(Window); } } @@ -577,6 +579,7 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, } } } + IntReleaseWindowObject(DesktopWindow); /* Check if the system message queue is now empty. */ KeAcquireSpinLock(&SystemMessageQueueLock, &OldIrql); if (SystemMessageQueueCount == 0 && IsListEmpty(&HardwareMessageQueueHead)) diff --git a/reactos/subsys/win32k/ntuser/painting.c b/reactos/subsys/win32k/ntuser/painting.c index cf5067c8334..0111b82f37f 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.72 2004/02/22 16:56:14 navaraf Exp $ + * $Id: painting.c,v 1.73 2004/02/24 01:30:57 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -59,14 +59,11 @@ VOID FASTCALL IntValidateParent(PWINDOW_OBJECT Child, HRGN ValidRegion) { - HWND Parent; - PWINDOW_OBJECT ParentWindow; + PWINDOW_OBJECT ParentWindow = IntGetParentObject(Child), OldWindow; - Parent = NtUserGetAncestor(Child->Self, GA_PARENT); - while (Parent) + while (ParentWindow) { - ParentWindow = IntGetWindowObject(Parent); - if (ParentWindow && !(ParentWindow->Style & WS_CLIPCHILDREN)) + if (!(ParentWindow->Style & WS_CLIPCHILDREN)) { ExAcquireFastMutex(&ParentWindow->UpdateLock); if (ParentWindow->UpdateRegion != 0) @@ -87,15 +84,9 @@ IntValidateParent(PWINDOW_OBJECT Child, HRGN ValidRegion) } ExReleaseFastMutex(&ParentWindow->UpdateLock); } - if (ParentWindow) - { - IntReleaseWindowObject(ParentWindow); - Parent = NtUserGetAncestor(Parent, GA_PARENT); - } - else - { - return; - } + OldWindow = ParentWindow; + ParentWindow = IntGetParentObject(ParentWindow); + IntReleaseWindowObject(OldWindow); } } @@ -422,14 +413,21 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags) BOOL FASTCALL IntIsWindowDrawable(PWINDOW_OBJECT Window) { - PWINDOW_OBJECT Wnd = Window; + PWINDOW_OBJECT Old, Wnd = Window; - for (; Wnd; Wnd = Wnd->Parent) + IntReferenceWindowObject(Wnd); + do { if (!(Wnd->Style & WS_VISIBLE) || ((Wnd->Style & WS_MINIMIZE) && (Wnd != Window))) + { + IntReleaseWindowObject(Wnd); return FALSE; - } + } + Old = Wnd; + Wnd = IntGetParentObject(Wnd); + IntReleaseWindowObject(Old); + } while(Wnd); return TRUE; } @@ -559,7 +557,7 @@ IntFindWindowToRepaint(HWND hWnd, PW32THREAD Thread) return hWnd; } - ExAcquireFastMutex(&Window->ChildrenListLock); + IntLockRelatives(Window); for (Child = Window->FirstChild; Child; Child = Child->NextSibling) { if (IntIsWindowDirty(Child) && @@ -569,7 +567,7 @@ IntFindWindowToRepaint(HWND hWnd, PW32THREAD Thread) break; } } - ExReleaseFastMutex(&Window->ChildrenListLock); + IntUnLockRelatives(Window); if (hFoundWnd == NULL) { diff --git a/reactos/subsys/win32k/ntuser/vis.c b/reactos/subsys/win32k/ntuser/vis.c index c5e600a2df2..9335da8c4e8 100644 --- a/reactos/subsys/win32k/ntuser/vis.c +++ b/reactos/subsys/win32k/ntuser/vis.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: vis.c,v 1.19 2004/02/22 16:56:14 navaraf Exp $ + * $Id: vis.c,v 1.20 2004/02/24 01:30:57 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -70,7 +70,7 @@ VIS_ComputeVisibleRegion( */ PreviousWindow = Window; - CurrentWindow = Window->Parent; + CurrentWindow = IntGetParentObject(Window); while (CurrentWindow) { if (!(CurrentWindow->Style & WS_VISIBLE)) @@ -85,7 +85,7 @@ VIS_ComputeVisibleRegion( if ((CurrentWindow->Style & WS_CLIPSIBLINGS) || (PreviousWindow == Window && ClipSiblings)) { - ExAcquireFastMutexUnsafe(&CurrentWindow->ChildrenListLock); + IntLockRelatives(CurrentWindow); CurrentSibling = CurrentWindow->FirstChild; while (CurrentSibling != PreviousWindow) { @@ -97,16 +97,17 @@ VIS_ComputeVisibleRegion( } CurrentSibling = CurrentSibling->NextSibling; } - ExReleaseFastMutexUnsafe(&CurrentWindow->ChildrenListLock); + IntUnLockRelatives(CurrentWindow); } PreviousWindow = CurrentWindow; - CurrentWindow = CurrentWindow->Parent; + CurrentWindow = IntGetParentObject(CurrentWindow); + IntReleaseWindowObject(PreviousWindow); } if (ClipChildren) { - ExAcquireFastMutexUnsafe(&Window->ChildrenListLock); + IntLockRelatives(Window); CurrentWindow = Window->FirstChild; while (CurrentWindow) { @@ -118,7 +119,7 @@ VIS_ComputeVisibleRegion( } CurrentWindow = CurrentWindow->NextSibling; } - ExReleaseFastMutexUnsafe(&Window->ChildrenListLock); + IntUnLockRelatives(Window); } NtGdiOffsetRgn(VisRgn, -LeftOffset, -TopOffset); @@ -132,18 +133,23 @@ VIS_WindowLayoutChanged( HRGN NewlyExposed) { HRGN Temp; + PWINDOW_OBJECT Parent; Temp = NtGdiCreateRectRgn(0, 0, 0, 0); NtGdiCombineRgn(Temp, NewlyExposed, NULL, RGN_COPY); - if (Window->Parent != NULL) + + Parent = IntGetParentObject(Window); + if(Parent) { NtGdiOffsetRgn(Temp, - Window->WindowRect.left - Window->Parent->ClientRect.left, - Window->WindowRect.top - Window->Parent->ClientRect.top); + Window->WindowRect.left - Parent->ClientRect.left, + Window->WindowRect.top - Parent->ClientRect.top); } - IntRedrawWindow(Window->Parent, NULL, Temp, + IntRedrawWindow(Parent, NULL, Temp, RDW_FRAME | RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN); + if(Parent) + IntReleaseWindowObject(Parent); NtGdiDeleteObject(Temp); } diff --git a/reactos/subsys/win32k/ntuser/windc.c b/reactos/subsys/win32k/ntuser/windc.c index 3b37cc15765..684f99796cf 100644 --- a/reactos/subsys/win32k/ntuser/windc.c +++ b/reactos/subsys/win32k/ntuser/windc.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: windc.c,v 1.58 2004/02/22 12:25:35 navaraf Exp $ +/* $Id: windc.c,v 1.59 2004/02/24 01:30:57 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -238,7 +238,13 @@ DceUpdateVisRgn(DCE *Dce, PWINDOW_OBJECT Window, ULONG Flags) { PWINDOW_OBJECT Parent; - Parent = Window->Parent; + Parent = IntGetParentObject(Window); + if(!Parent) + { + hRgnVisible = NULL; + goto noparent; + } + if (Parent->Style & WS_CLIPSIBLINGS) { DcxFlags = DCX_CLIPSIBLINGS | @@ -289,6 +295,7 @@ DceUpdateVisRgn(DCE *Dce, PWINDOW_OBJECT Window, ULONG Flags) hRgnVisible = DceGetVisRgn(Window->Self, Flags, 0, 0); } +noparent: if (Flags & DCX_INTERSECTRGN) { NtGdiCombineRgn(hRgnVisible, hRgnVisible, Dce->hClipRgn, RGN_AND); @@ -311,7 +318,7 @@ DceUpdateVisRgn(DCE *Dce, PWINDOW_OBJECT Window, ULONG Flags) HDC STDCALL NtUserGetDCEx(HWND hWnd, HANDLE ClipRegion, ULONG Flags) { - PWINDOW_OBJECT Window; + PWINDOW_OBJECT Window, Parent; ULONG DcxFlags; DCE* Dce; BOOL UpdateVisRgn = TRUE; @@ -372,7 +379,9 @@ NtUserGetDCEx(HWND hWnd, HANDLE ClipRegion, ULONG Flags) Flags = (Flags & ~DCX_CLIPCHILDREN) | DCX_CACHE; } - if (NULL == Window || !(Window->Style & WS_CHILD) || NULL == Window->Parent) + Parent = (Window ? IntGetParentObject(Window) : NULL); + + if (NULL == Window || !(Window->Style & WS_CHILD) || NULL == Parent) { Flags &= ~DCX_PARENTCLIP; } @@ -380,16 +389,19 @@ NtUserGetDCEx(HWND hWnd, HANDLE ClipRegion, ULONG Flags) { Flags |= DCX_CACHE; if ((Window->Style & WS_VISIBLE) && - (Window->Parent->Style & WS_VISIBLE)) + (Parent->Style & WS_VISIBLE)) { Flags &= ~DCX_CLIPCHILDREN; - if (Window->Parent->Style & WS_CLIPSIBLINGS) + if (Parent->Style & WS_CLIPSIBLINGS) { Flags |= DCX_CLIPSIBLINGS; } } } + if(Parent) + IntReleaseWindowObject(Parent); + DcxFlags = Flags & DCX_CACHECOMPAREMASK; if (Flags & DCX_CACHE) diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 5f58d6ea6c9..2a38cc60621 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.190 2004/02/22 23:40:58 gvg Exp $ +/* $Id: window.c,v 1.191 2004/02/24 01:30:57 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -97,36 +97,6 @@ CleanupWindowImpl(VOID) /* HELPER FUNCTIONS ***********************************************************/ -/* - * IntIsBroadcastHwnd - * - * Check if window is a broadcast. - * - * Return Value - * TRUE if window is broadcast, FALSE otherwise. - */ - -inline BOOL -IntIsBroadcastHwnd(HWND hWnd) -{ - return (hWnd == HWND_BROADCAST || hWnd == HWND_TOPMOST); -} - -/* - * IntIsDesktopWindow - * - * Check if window is a desktop. Desktop windows has no parent. - * - * Return Value - * TRUE if window is desktop, FALSE otherwise. - */ - -inline BOOL -IntIsDesktopWindow(PWINDOW_OBJECT Wnd) -{ - return Wnd->Parent == NULL; -} - /* * IntIsWindow * @@ -150,9 +120,8 @@ IntIsWindow(HWND hWnd) if (!(Window = IntGetWindowObject(hWnd))) return FALSE; - else - IntReleaseWindowObject(Window); - + + IntReleaseWindowObject(Window); return TRUE; } @@ -177,29 +146,40 @@ IntGetProcessWindowObject(PW32PROCESS ProcessData, HWND hWnd) return WindowObject; } -/* - * IntGetWindowObject - * - * Get window object from handle of current process. - */ PWINDOW_OBJECT FASTCALL -IntGetWindowObject(HWND hWnd) +IntGetParent(PWINDOW_OBJECT Wnd) { - return IntGetProcessWindowObject(PsGetWin32Process(), hWnd); + HWND hWnd; + + if (Wnd->Style & WS_POPUP) + { + IntLockRelatives(Wnd); + hWnd = Wnd->Owner; + IntUnLockRelatives(Wnd); + return IntGetWindowObject(hWnd); + } + else if (Wnd->Style & WS_CHILD) + { + IntLockRelatives(Wnd); + hWnd = Wnd->Parent; + IntUnLockRelatives(Wnd); + return IntGetWindowObject(hWnd); + } + + return NULL; } -/* - * IntReleaseWindowObject - * - * Release window object returned by IntGetWindowObject or - * IntGetProcessWindowObject. - */ -VOID FASTCALL -IntReleaseWindowObject(PWINDOW_OBJECT Window) +PWINDOW_OBJECT FASTCALL +IntGetParentObject(PWINDOW_OBJECT Wnd) { - ObmDereferenceObject(Window); + HWND hParent; + + IntLockRelatives(Wnd); + hParent = Wnd->Parent; + IntUnLockRelatives(Wnd); + return IntGetWindowObject(hParent); } /* @@ -219,7 +199,7 @@ IntWinListChildren(PWINDOW_OBJECT Window) HWND *List; UINT Index, NumChildren = 0; - ExAcquireFastMutexUnsafe(&Window->ChildrenListLock); + IntLockRelatives(Window); for (Child = Window->FirstChild; Child; Child = Child->NextSibling) ++NumChildren; @@ -227,21 +207,20 @@ IntWinListChildren(PWINDOW_OBJECT Window) if (NumChildren != 0) { List = ExAllocatePoolWithTag(PagedPool, (NumChildren + 1) * sizeof(HWND), TAG_WINLIST); - if (List != NULL) + if(!List) { - for (Child = Window->FirstChild, Index = 0; - Child != NULL; - Child = Child->NextSibling, ++Index) - List[Index] = Child->Self; - List[Index] = NULL; - } - else - { - DPRINT1("Failed to allocate memory for children array\n"); + DPRINT1("Failed to allocate memory for children array\n"); + IntUnLockRelatives(Window); + return NULL; } + for (Child = Window->FirstChild, Index = 0; + Child != NULL; + Child = Child->NextSibling, ++Index) + List[Index] = Child->Self; + List[Index] = NULL; } - ExReleaseFastMutexUnsafe(&Window->ChildrenListLock); + IntUnLockRelatives(Window); return (NumChildren > 0) ? List : NULL; } @@ -328,8 +307,7 @@ static LRESULT IntDestroyWindow(PWINDOW_OBJECT Window, { for (ChildHandle = Children; *ChildHandle; ++ChildHandle) { - Child = IntGetProcessWindowObject(ProcessData, *ChildHandle); - if (NULL != Child) + if ((Child = IntGetWindowObject(*ChildHandle))) { if(IntWndBelongsToThread(Child, ThreadData)) { @@ -409,14 +387,8 @@ static LRESULT IntDestroyWindow(PWINDOW_OBJECT Window, WINPROC_FreeProc(Window->winproc, WIN_PROC_WINDOW); CLASS_RemoveWindow(Window->Class); #endif - - if (Window->Parent) - { - PWINDOW_OBJECT Parent = Window->Parent; - ExAcquireFastMutexUnsafe(&Parent->ChildrenListLock); - IntUnlinkWindow(Window); - ExReleaseFastMutexUnsafe(&Parent->ChildrenListLock); - } + + IntUnlinkWindow(Window); ExAcquireFastMutexUnsafe (&ThreadData->WindowListLock); RemoveEntryList(&Window->ThreadListEntry); @@ -545,8 +517,7 @@ IntGetClientRect(PWINDOW_OBJECT WindowObject, PRECT Rect) Rect->left = Rect->top = 0; Rect->right = WindowObject->ClientRect.right - WindowObject->ClientRect.left; - Rect->bottom = - WindowObject->ClientRect.bottom - WindowObject->ClientRect.top; + Rect->bottom = WindowObject->ClientRect.bottom - WindowObject->ClientRect.top; } @@ -569,23 +540,6 @@ IntGetFocusWindow(VOID) } #endif -PWINDOW_OBJECT FASTCALL -IntGetParent(PWINDOW_OBJECT Wnd) -{ - if (Wnd->Style & WS_POPUP) - { - return Wnd->Owner; - } - else if (Wnd->Style & WS_CHILD) - { - return Wnd->Parent; - } - - return NULL; -} - - - PMENU_OBJECT FASTCALL IntGetSystemMenu(PWINDOW_OBJECT WindowObject, BOOL bRevert, BOOL RetMenu) { @@ -698,51 +652,54 @@ IntGetSystemMenu(PWINDOW_OBJECT WindowObject, BOOL bRevert, BOOL RetMenu) } - -DWORD FASTCALL -IntGetWindowThreadProcessId(PWINDOW_OBJECT Wnd, PDWORD pid) -{ - if (pid) *pid = (DWORD) Wnd->OwnerThread->ThreadsProcess->UniqueProcessId; - return (DWORD) Wnd->OwnerThread->Cid.UniqueThread; -} - BOOL FASTCALL IntIsChildWindow(HWND Parent, HWND Child) { PWINDOW_OBJECT BaseWindow = IntGetWindowObject(Child); PWINDOW_OBJECT Window = BaseWindow; + while (Window != NULL && Window->Style & WS_CHILD) + { + if (Window->Self == Parent) { - if (Window->Self == Parent) - { - IntReleaseWindowObject(BaseWindow); - return(TRUE); - } - Window = Window->Parent; + if(Window != BaseWindow) + IntReleaseWindowObject(Window); + IntReleaseWindowObject(BaseWindow); + return(TRUE); } + if(Window != BaseWindow) + IntReleaseWindowObject(Window); + Window = IntGetParentObject(Window); + } + IntReleaseWindowObject(BaseWindow); return(FALSE); } BOOL FASTCALL -IntIsWindowVisible(HWND Wnd) +IntIsWindowVisible(HWND hWnd) { - PWINDOW_OBJECT BaseWindow = IntGetWindowObject(Wnd); + PWINDOW_OBJECT BaseWindow = IntGetWindowObject(hWnd); PWINDOW_OBJECT Window = BaseWindow; BOOLEAN Result = FALSE; + while (Window != NULL && Window->Style & WS_CHILD) - { - if (!(Window->Style & WS_VISIBLE)) + { + if (!(Window->Style & WS_VISIBLE)) { + if(Window != BaseWindow) + IntReleaseWindowObject(Window); IntReleaseWindowObject(BaseWindow); return(FALSE); } - Window = Window->Parent; - } + if(Window != BaseWindow) + IntReleaseWindowObject(Window); + Window = IntGetParentObject(Window); + } if (Window != NULL && Window->Style & WS_VISIBLE) - { - Result = TRUE; - } + { + Result = TRUE; + } IntReleaseWindowObject(BaseWindow); return(Result); } @@ -756,33 +713,64 @@ IntLinkWindow( PWINDOW_OBJECT WndPrevSibling /* set to NULL if top sibling */ ) { - Wnd->Parent = WndParent; - + PWINDOW_OBJECT Parent; + + IntLockRelatives(Wnd); + Wnd->Parent = WndParent->Self; if ((Wnd->PrevSibling = WndPrevSibling)) { /* link after WndPrevSibling */ - if ((Wnd->NextSibling = WndPrevSibling->NextSibling)) Wnd->NextSibling->PrevSibling = Wnd; - else if (Wnd->Parent->LastChild == WndPrevSibling) Wnd->Parent->LastChild = Wnd; + if ((Wnd->NextSibling = WndPrevSibling->NextSibling)) + Wnd->NextSibling->PrevSibling = Wnd; + else if ((Parent = IntGetWindowObject(Wnd->Parent))) + { + IntLockRelatives(Parent); + if(Parent->LastChild == WndPrevSibling) + Parent->LastChild = Wnd; + IntUnLockRelatives(Parent); + IntReleaseWindowObject(Parent); + } Wnd->PrevSibling->NextSibling = Wnd; } else { /* link at top */ - if ((Wnd->NextSibling = WndParent->FirstChild)) Wnd->NextSibling->PrevSibling = Wnd; - else Wnd->Parent->LastChild = Wnd; - WndParent->FirstChild = Wnd; + Parent = IntGetWindowObject(Wnd->Parent); + if ((Wnd->NextSibling = WndParent->FirstChild)) + Wnd->NextSibling->PrevSibling = Wnd; + else if (Parent) + { + IntLockRelatives(Parent); + Parent->LastChild = Wnd; + Parent->FirstChild = Wnd; + IntUnLockRelatives(Parent); + IntReleaseWindowObject(Parent); + IntUnLockRelatives(Wnd); + return; + } + if(Parent) + { + IntLockRelatives(Parent); + Parent->FirstChild = Wnd; + IntUnLockRelatives(Parent); + IntReleaseWindowObject(Parent); + } } - + IntUnLockRelatives(Wnd); } HWND FASTCALL IntSetOwner(HWND hWnd, HWND hWndNewOwner) { - PWINDOW_OBJECT Wnd, WndOldOwner; + PWINDOW_OBJECT Wnd, WndOldOwner, WndNewOwner; HWND ret; Wnd = IntGetWindowObject(hWnd); - WndOldOwner = Wnd->Owner; + if(!Wnd) + return NULL; + + IntLockRelatives(Wnd); + WndOldOwner = IntGetWindowObject(Wnd->Owner); if (WndOldOwner) { ret = WndOldOwner->Self; @@ -792,7 +780,16 @@ IntSetOwner(HWND hWnd, HWND hWndNewOwner) { ret = 0; } - Wnd->Owner = IntGetWindowObject(hWndNewOwner); + + if((WndNewOwner = IntGetWindowObject(hWndNewOwner))) + { + Wnd->Owner = hWndNewOwner; + IntReleaseWindowObject(WndNewOwner); + } + else + Wnd->Owner = NULL; + + IntUnLockRelatives(Wnd); IntReleaseWindowObject(Wnd); return ret; } @@ -822,17 +819,13 @@ IntSetParent(PWINDOW_OBJECT Wnd, PWINDOW_OBJECT WndNewParent) if (Wnd->OwnerThread->ThreadsProcess != PsGetCurrentProcess()) return NULL; - WndOldParent = Wnd->Parent; - hWndOldParent = WndOldParent->Self; + WndOldParent = IntGetParentObject(Wnd); + hWndOldParent = (WndOldParent ? WndOldParent->Self : NULL); if (WndNewParent != WndOldParent) { - ExAcquireFastMutexUnsafe(&WndOldParent->ChildrenListLock); IntUnlinkWindow(Wnd); - ExReleaseFastMutexUnsafe(&WndOldParent->ChildrenListLock); - ExAcquireFastMutexUnsafe(&WndNewParent->ChildrenListLock); IntLinkWindow(Wnd, WndNewParent, NULL /*prev sibling*/); - ExReleaseFastMutexUnsafe(&WndNewParent->ChildrenListLock); if (WndNewParent->Self != IntGetDesktopWindow()) /* a child window */ { @@ -843,7 +836,9 @@ IntSetParent(PWINDOW_OBJECT Wnd, PWINDOW_OBJECT WndNewParent) } } } - + + if(WndOldParent) + IntReleaseWindowObject(WndOldParent); /* * SetParent additionally needs to make hwnd the topmost window * in the x-order and send the expected WM_WINDOWPOSCHANGING and @@ -895,29 +890,29 @@ IntSetSystemMenu(PWINDOW_OBJECT WindowObject, PMENU_OBJECT MenuObject) VOID FASTCALL IntUnlinkWindow(PWINDOW_OBJECT Wnd) { - PWINDOW_OBJECT WndParent = Wnd->Parent; - + PWINDOW_OBJECT WndParent; + + IntLockRelatives(Wnd); + if((WndParent = IntGetWindowObject(Wnd->Parent))) + { + IntLockRelatives(WndParent); + } + if (Wnd->NextSibling) Wnd->NextSibling->PrevSibling = Wnd->PrevSibling; - else if (WndParent->LastChild == Wnd) WndParent->LastChild = Wnd->PrevSibling; + else if (WndParent && WndParent->LastChild == Wnd) WndParent->LastChild = Wnd->PrevSibling; if (Wnd->PrevSibling) Wnd->PrevSibling->NextSibling = Wnd->NextSibling; - else if (WndParent->FirstChild == Wnd) WndParent->FirstChild = Wnd->NextSibling; + else if (WndParent && WndParent->FirstChild == Wnd) WndParent->FirstChild = Wnd->NextSibling; //else if (parent->first_unlinked == win) parent->first_unlinked = Wnd->NextSibling; -} - - -BOOLEAN FASTCALL -IntWndBelongsToThread(PWINDOW_OBJECT Window, PW32THREAD ThreadData) -{ - if (Window->OwnerThread && Window->OwnerThread->Win32Thread) + if(WndParent) { - return (Window->OwnerThread->Win32Thread == ThreadData); + IntUnLockRelatives(WndParent); + IntReleaseWindowObject(WndParent); } - - return FALSE; + Wnd->PrevSibling = Wnd->NextSibling = Wnd->Parent = NULL; + IntUnLockRelatives(Wnd); } - /* FUNCTIONS *****************************************************************/ /* @@ -972,7 +967,7 @@ NtUserBuildHwndList( return 0; } - ExAcquireFastMutex ( &WindowObject->ChildrenListLock ); + IntLockRelatives(WindowObject ); Child = WindowObject->FirstChild; while (Child) { @@ -981,7 +976,7 @@ NtUserBuildHwndList( dwCount++; Child = Child->NextSibling; } - ExReleaseFastMutex ( &WindowObject->ChildrenListLock ); + IntUnLockRelatives(WindowObject); IntReleaseWindowObject ( WindowObject ); } else if ( dwThreadId ) @@ -1028,7 +1023,7 @@ NtUserBuildHwndList( if ( pWnd && dwCount < nBufSize ) { pWnd[dwCount] = - (HWND)ObmReferenceObjectByPointer ( ObjectBody, otWindow ); + (HWND)IntReferenceWindowObject(ObjectBody); } dwCount++; } @@ -1078,13 +1073,15 @@ NtUserBuildHwndList( /* * @implemented */ + + /* FIXME - NEEDS TO BE FIXED - UNSAFE !!! */ HWND STDCALL NtUserChildWindowFromPointEx(HWND hwndParent, LONG x, LONG y, UINT uiFlags) { - PWINDOW_OBJECT pParent, pCurrent, pLast; + PWINDOW_OBJECT pParent, pCurrent, pLast, pPar; POINT p = {x,y}; RECT rc; BOOL bFirstRun = TRUE; @@ -1094,7 +1091,7 @@ NtUserChildWindowFromPointEx(HWND hwndParent, pParent = IntGetWindowObject(hwndParent); if(pParent) { - ExAcquireFastMutexUnsafe (&pParent->ChildrenListLock); + IntLockRelatives(pParent); pLast = IntGetWindowObject(pParent->LastChild->Self); pCurrent = IntGetWindowObject(pParent->FirstChild->Self); @@ -1109,13 +1106,21 @@ NtUserChildWindowFromPointEx(HWND hwndParent, else bFirstRun = FALSE; if(!pCurrent) + { + IntUnLockRelatives(pParent); return (HWND)NULL; - - rc.left = pCurrent->WindowRect.left - pCurrent->Parent->ClientRect.left; - rc.top = pCurrent->WindowRect.top - pCurrent->Parent->ClientRect.top; + } + if(!(pPar = IntGetWindowObject(pCurrent->Parent))) + { + IntUnLockRelatives(pParent); + return (HWND)NULL; + } + rc.left = pCurrent->WindowRect.left - pPar->ClientRect.left; + rc.top = pCurrent->WindowRect.top - pPar->ClientRect.top; rc.right = rc.left + (pCurrent->WindowRect.right - pCurrent->WindowRect.left); rc.bottom = rc.top + (pCurrent->WindowRect.bottom - pCurrent->WindowRect.top); DbgPrint("Rect: %i,%i,%i,%i\n",rc.left, rc.top, rc.right, rc.bottom); + IntReleaseWindowObject(pPar); if (POINT_IN_RECT(p,rc)) /* Found a match */ { if ( (uiFlags & CWP_SKIPDISABLED) && (pCurrent->Style & WS_DISABLED) ) @@ -1125,13 +1130,13 @@ NtUserChildWindowFromPointEx(HWND hwndParent, if( (uiFlags & CWP_SKIPINVISIBLE) && !(pCurrent->Style & WS_VISIBLE) ) continue; - ExReleaseFastMutexUnsafe(&pParent->ChildrenListLock); + IntUnLockRelatives(pParent); return pCurrent->Self; } } while(pCurrent != pLast); - ExReleaseFastMutexUnsafe(&pParent->ChildrenListLock); + IntUnLockRelatives(pParent); return (HWND)NULL; } SetLastWin32Error(ERROR_INVALID_PARAMETER); @@ -1163,7 +1168,7 @@ NtUserCreateWindowEx(DWORD dwExStyle, PWINSTATION_OBJECT WinStaObject; PWNDCLASS_OBJECT ClassObject; PWINDOW_OBJECT WindowObject; - PWINDOW_OBJECT ParentWindow; + PWINDOW_OBJECT ParentWindow, OwnerWindow; HWND ParentWindowHandle; HWND OwnerWindowHandle; PMENU_OBJECT SystemMenu; @@ -1306,8 +1311,14 @@ NtUserCreateWindowEx(DWORD dwExStyle, IntSetMenu(WindowObject, hMenu, &MenuChanged); } WindowObject->MessageQueue = PsGetWin32Thread()->MessageQueue; - WindowObject->Parent = ParentWindow; - WindowObject->Owner = IntGetWindowObject(OwnerWindowHandle); + WindowObject->Parent = (ParentWindow ? ParentWindow->Self : NULL); + if((OwnerWindow = IntGetWindowObject(OwnerWindowHandle))) + { + WindowObject->Owner = OwnerWindowHandle; + IntReleaseWindowObject(OwnerWindow); + } + else + WindowObject->Owner = NULL; WindowObject->UserData = 0; if ((((DWORD)ClassObject->lpfnWndProcA & 0xFFFF0000) != 0xFFFF0000) && (((DWORD)ClassObject->lpfnWndProcW & 0xFFFF0000) != 0xFFFF0000)) @@ -1341,7 +1352,7 @@ NtUserCreateWindowEx(DWORD dwExStyle, InitializeListHead(&WindowObject->PropListHead); ExInitializeFastMutex(&WindowObject->PropListLock); - ExInitializeFastMutex(&WindowObject->ChildrenListLock); + ExInitializeFastMutex(&WindowObject->RelativesLock); ExInitializeFastMutex(&WindowObject->UpdateLock); RtlInitUnicodeString(&WindowObject->WindowName, WindowName.Buffer); @@ -1389,10 +1400,10 @@ NtUserCreateWindowEx(DWORD dwExStyle, WindowObject->WindowRect.top = y; WindowObject->WindowRect.right = x + nWidth; WindowObject->WindowRect.bottom = y + nHeight; - if (0 != (WindowObject->Style & WS_CHILD)) + if (0 != (WindowObject->Style & WS_CHILD) && ParentWindow) { - NtGdiOffsetRect(&(WindowObject->WindowRect), WindowObject->Parent->ClientRect.left, - WindowObject->Parent->ClientRect.top); + NtGdiOffsetRect(&(WindowObject->WindowRect), ParentWindow->ClientRect.left, + ParentWindow->ClientRect.top); } WindowObject->ClientRect = WindowObject->WindowRect; @@ -1442,10 +1453,10 @@ NtUserCreateWindowEx(DWORD dwExStyle, WindowObject->WindowRect.top = y; WindowObject->WindowRect.right = x + nWidth; WindowObject->WindowRect.bottom = y + nHeight; - if (0 != (WindowObject->Style & WS_CHILD)) + if (0 != (WindowObject->Style & WS_CHILD) && ParentWindow) { - NtGdiOffsetRect(&(WindowObject->WindowRect), WindowObject->Parent->ClientRect.left, - WindowObject->Parent->ClientRect.top); + NtGdiOffsetRect(&(WindowObject->WindowRect), ParentWindow->ClientRect.left, + ParentWindow->ClientRect.top); } WindowObject->ClientRect = WindowObject->WindowRect; @@ -1499,7 +1510,6 @@ NtUserCreateWindowEx(DWORD dwExStyle, if (NULL != ParentWindow) { /* link the window into the parent's child list */ - ExAcquireFastMutexUnsafe(&ParentWindow->ChildrenListLock); if ((dwStyle & (WS_CHILD|WS_MAXIMIZE)) == WS_CHILD) { /* link window as bottom sibling */ @@ -1510,7 +1520,6 @@ NtUserCreateWindowEx(DWORD dwExStyle, /* link window as top sibling */ IntLinkWindow(WindowObject, ParentWindow, NULL /*prev sibling*/); } - ExReleaseFastMutexUnsafe(&ParentWindow->ChildrenListLock); } /* Send the WM_CREATE message. */ @@ -1547,10 +1556,10 @@ NtUserCreateWindowEx(DWORD dwExStyle, DPRINT("NtUserCreateWindow(): About to send WM_MOVE\n"); - if (0 != (WindowObject->Style & WS_CHILD)) + if (0 != (WindowObject->Style & WS_CHILD) && ParentWindow) { - lParam = MAKE_LONG(WindowObject->ClientRect.left - WindowObject->Parent->ClientRect.left, - WindowObject->ClientRect.top - WindowObject->Parent->ClientRect.top); + lParam = MAKE_LONG(WindowObject->ClientRect.left - ParentWindow->ClientRect.left, + WindowObject->ClientRect.top - ParentWindow->ClientRect.top); } else { @@ -1581,15 +1590,20 @@ NtUserCreateWindowEx(DWORD dwExStyle, /* Notify the parent window of a new child. */ if ((WindowObject->Style & WS_CHILD) && - (!(WindowObject->ExStyle & WS_EX_NOPARENTNOTIFY))) + (!(WindowObject->ExStyle & WS_EX_NOPARENTNOTIFY)) && ParentWindow) { DPRINT("NtUserCreateWindow(): About to notify parent\n"); - IntSendMessage(WindowObject->Parent->Self, + IntSendMessage(ParentWindow->Self, WM_PARENTNOTIFY, MAKEWPARAM(WM_CREATE, WindowObject->IDMenu), (LPARAM)WindowObject->Self); } + if (NULL != ParentWindow) + { + IntReleaseWindowObject(ParentWindow); + } + if (dwStyle & WS_VISIBLE) { DPRINT("NtUserCreateWindow(): About to show window\n"); @@ -1627,7 +1641,7 @@ NtUserDeferWindowPos(HDWP WinPosInfo, BOOLEAN STDCALL NtUserDestroyWindow(HWND Wnd) { - PWINDOW_OBJECT Window, Parent; + PWINDOW_OBJECT Window; BOOLEAN isChild; Window = IntGetWindowObject(Wnd); @@ -1720,7 +1734,7 @@ NtUserDestroyWindow(HWND Wnd) { continue; } - if (Child->Parent != Window) + if (Child->Parent != Window->Self) { IntReleaseWindowObject(Child); continue; @@ -1734,7 +1748,6 @@ NtUserDestroyWindow(HWND Wnd) } if (Child->Owner != NULL) { - IntReleaseWindowObject(Child->Owner); Child->Owner = NULL; } IntReleaseWindowObject(Child); @@ -1754,11 +1767,7 @@ NtUserDestroyWindow(HWND Wnd) } /* Unlink now so we won't bother with the children later on */ - Parent = Window->Parent; - ExAcquireFastMutexUnsafe(&Parent->ChildrenListLock); IntUnlinkWindow(Window); - Window->Parent = NULL; - ExReleaseFastMutexUnsafe(&Parent->ChildrenListLock); /* Destroy the window storage */ IntDestroyWindow(Window, PsGetWin32Process(), PsGetWin32Thread(), TRUE); @@ -1872,7 +1881,7 @@ NtUserFindWindowEx(HWND hwndParent, return NULL; } - ExAcquireFastMutexUnsafe (&ParentWindow->ChildrenListLock); + IntLockRelatives(ParentWindow); if(hwndChildAfter) { @@ -1883,11 +1892,14 @@ NtUserFindWindowEx(HWND hwndParent, } /* must be a direct child (not a decendant child)*/ - if (WndChildAfter->Parent != ParentWindow) + IntLockRelatives(WndChildAfter); + if (WndChildAfter->Parent != ParentWindow->Self) { + IntUnLockRelatives(WndChildAfter); SetLastWin32Error(ERROR_INVALID_PARAMETER); return NULL; } + IntUnLockRelatives(WndChildAfter); WndChild = WndChildAfter->NextSibling; } @@ -1903,7 +1915,7 @@ NtUserFindWindowEx(HWND hwndParent, { windowHandle = WndChild->Self; - ExReleaseFastMutexUnsafe (&ParentWindow->ChildrenListLock); + IntUnLockRelatives(ParentWindow); IntReleaseWindowObject(ParentWindow); ObmDereferenceObject (classObject); @@ -1913,7 +1925,7 @@ NtUserFindWindowEx(HWND hwndParent, WndChild = WndChild->NextSibling; } - ExReleaseFastMutexUnsafe (&ParentWindow->ChildrenListLock); + IntUnLockRelatives(ParentWindow); IntReleaseWindowObject(ParentWindow); ObmDereferenceObject (classObject); @@ -1940,19 +1952,16 @@ NtUserFlashWindowEx(DWORD Unknown0) HWND STDCALL NtUserGetAncestor(HWND hWnd, UINT Type) { - PWINDOW_OBJECT Wnd, WndAncestor; - HWND hWndAncestor = NULL; + PWINDOW_OBJECT Wnd, WndAncestor, Parent; + HWND hWndAncestor; if (hWnd == IntGetDesktopWindow()) { return NULL; } - IntAcquireWinLockShared(); - if (!(Wnd = IntGetWindowObject(hWnd))) { - IntReleaseWinLock(); SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return NULL; } @@ -1960,36 +1969,71 @@ NtUserGetAncestor(HWND hWnd, UINT Type) switch (Type) { case GA_PARENT: - WndAncestor = Wnd->Parent; + WndAncestor = IntGetParentObject(Wnd); break; case GA_ROOT: WndAncestor = Wnd; - while (!IntIsDesktopWindow(WndAncestor->Parent)) - WndAncestor = WndAncestor->Parent; + Parent = NULL; +#if 0 + while (0 != (WndAncestor->Style & WS_CHILD)) + { + Parent = IntGetParentObject(WndAncestor); + if (WndAncestor != Wnd) + { + IntReleaseWindowObject(WndAncestor); + } + WndAncestor = Parent; + } +#else + for(;;) + { + if(Parent) + { + IntReleaseWindowObject(Parent); + } + if(!(Parent = IntGetParentObject(WndAncestor)) || + !IntIsDesktopWindow(WndAncestor)) + { + break; + } + WndAncestor = Parent; + } +#endif break; case GA_ROOTOWNER: WndAncestor = Wnd; + IntReferenceWindowObject(WndAncestor); for (;;) { - PWINDOW_OBJECT Parent = IntGetParent(WndAncestor); - if (!Parent) break; + PWINDOW_OBJECT Old; + Old = WndAncestor; + Parent = IntGetParent(WndAncestor); + IntReleaseWindowObject(Old); + if (!Parent) + { + break; + } WndAncestor = Parent; } break; default: - WndAncestor = NULL; + IntReleaseWindowObject(Wnd); + return NULL; } - - if (WndAncestor) - { - hWndAncestor = WndAncestor->Self; - } - + IntReleaseWindowObject(Wnd); - IntReleaseWinLock(); + + if(!WndAncestor) + { + return NULL; + } + + hWndAncestor = WndAncestor->Self; + if(WndAncestor != Wnd) + IntReleaseWindowObject(WndAncestor); return hWndAncestor; } @@ -2011,16 +2055,13 @@ NtUserGetClientRect(HWND hWnd, LPRECT Rect) PWINDOW_OBJECT WindowObject; RECT SafeRect; - IntAcquireWinLockShared(); if (!(WindowObject = IntGetWindowObject(hWnd))) { - IntReleaseWinLock(); SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return FALSE; } IntGetClientRect(WindowObject, &SafeRect); - IntReleaseWinLock(); if (! NT_SUCCESS(MmCopyToCaller(Rect, &SafeRect, sizeof(RECT)))) { @@ -2109,11 +2150,8 @@ NtUserGetParent(HWND hWnd) PWINDOW_OBJECT Wnd, WndParent; HWND hWndParent = NULL; - IntAcquireWinLockShared(); - if (!(Wnd = IntGetWindowObject(hWnd))) { - IntReleaseWinLock(); SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return NULL; } @@ -2122,10 +2160,10 @@ NtUserGetParent(HWND hWnd) if (WndParent) { hWndParent = WndParent->Self; + IntReleaseWindowObject(WndParent); } IntReleaseWindowObject(Wnd); - IntReleaseWinLock(); return hWndParent; } @@ -2165,12 +2203,10 @@ NtUserSetParent(HWND hWndChild, HWND hWndNewParent) return NULL; } - IntAcquireWinLockExclusive(); if (hWndNewParent) { if (!(WndParent = IntGetWindowObject(hWndNewParent))) { - IntReleaseWinLock(); SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return NULL; } @@ -2179,7 +2215,6 @@ NtUserSetParent(HWND hWndChild, HWND hWndNewParent) { if (!(WndParent = IntGetWindowObject(IntGetDesktopWindow()))) { - IntReleaseWinLock(); SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return NULL; } @@ -2187,7 +2222,6 @@ NtUserSetParent(HWND hWndChild, HWND hWndNewParent) if (!(Wnd = IntGetWindowObject(hWndChild))) { - IntReleaseWinLock(); SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return NULL; } @@ -2201,7 +2235,6 @@ NtUserSetParent(HWND hWndChild, HWND hWndNewParent) IntReleaseWindowObject(Wnd); IntReleaseWindowObject(WndParent); - IntReleaseWinLock(); return hWndOldParent; } @@ -2417,28 +2450,38 @@ NtUserSetSystemMenu(HWND hWnd, HMENU hMenu) HWND STDCALL NtUserGetWindow(HWND hWnd, UINT Relationship) { - PWINDOW_OBJECT WindowObject; + PWINDOW_OBJECT WindowObject, Parent; HWND hWndResult = NULL; - IntAcquireWinLockShared(); - if (!(WindowObject = IntGetWindowObject(hWnd))) { - IntReleaseWinLock(); SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return NULL; } + IntLockRelatives(WindowObject); switch (Relationship) { case GW_HWNDFIRST: - if (WindowObject->Parent && WindowObject->Parent->FirstChild) - hWndResult = WindowObject->Parent->FirstChild->Self; + if((Parent = IntGetParentObject(WindowObject))) + { + IntLockRelatives(Parent); + if (Parent->FirstChild) + hWndResult = Parent->FirstChild->Self; + IntUnLockRelatives(Parent); + IntReleaseWindowObject(Parent); + } break; case GW_HWNDLAST: - if (WindowObject->Parent && WindowObject->Parent->LastChild) - hWndResult = WindowObject->Parent->LastChild->Self; + if((Parent = IntGetParentObject(WindowObject))) + { + IntLockRelatives(Parent); + if (Parent->LastChild) + hWndResult = Parent->LastChild->Self; + IntUnLockRelatives(Parent); + IntReleaseWindowObject(Parent); + } break; case GW_HWNDNEXT: @@ -2452,17 +2495,20 @@ NtUserGetWindow(HWND hWnd, UINT Relationship) break; case GW_OWNER: - if (WindowObject->Owner) - hWndResult = WindowObject->Owner->Self; + if((Parent = IntGetWindowObject(WindowObject->Owner))) + { + hWndResult = Parent->Self; + IntReleaseWindowObject(Parent); + } break; case GW_CHILD: if (WindowObject->FirstChild) hWndResult = WindowObject->FirstChild->Self; break; } + IntUnLockRelatives(WindowObject); IntReleaseWindowObject(WindowObject); - IntReleaseWinLock(); return hWndResult; } @@ -2500,7 +2546,7 @@ NtUserGetWindowDC(HWND hWnd) LONG STDCALL NtUserGetWindowLong(HWND hWnd, DWORD Index, BOOL Ansi) { - PWINDOW_OBJECT WindowObject; + PWINDOW_OBJECT WindowObject, Parent; LONG Result; DPRINT("NtUserGetWindowLong(%x,%d,%d)\n", hWnd, (INT)Index, Ansi); @@ -2555,10 +2601,17 @@ NtUserGetWindowLong(HWND hWnd, DWORD Index, BOOL Ansi) break; case GWL_HWNDPARENT: - if (WindowObject->Parent->Self == IntGetDesktopWindow()) - Result = (LONG) NtUserGetWindow(WindowObject->Self, GW_OWNER); - else - Result = (LONG) NtUserGetAncestor(WindowObject->Self, GA_PARENT); + IntLockRelatives(WindowObject); + Parent = IntGetWindowObject(WindowObject->Parent); + IntUnLockRelatives(WindowObject); + if(Parent) + { + if (Parent && Parent->Self == IntGetDesktopWindow()) + Result = (LONG) NtUserGetWindow(WindowObject->Self, GW_OWNER); + else + Result = (LONG) Parent->Self; + IntReleaseWindowObject(Parent); + } break; case GWL_ID: @@ -2596,7 +2649,7 @@ NtUserGetWindowLong(HWND hWnd, DWORD Index, BOOL Ansi) LONG STDCALL NtUserSetWindowLong(HWND hWnd, DWORD Index, LONG NewValue, BOOL Ansi) { - PWINDOW_OBJECT WindowObject; + PWINDOW_OBJECT WindowObject, Parent; PW32PROCESS Process; PWINSTATION_OBJECT WindowStation; LONG OldValue; @@ -2684,10 +2737,13 @@ NtUserSetWindowLong(HWND hWnd, DWORD Index, LONG NewValue, BOOL Ansi) break; case GWL_HWNDPARENT: - if (WindowObject->Parent->Self == IntGetDesktopWindow()) + Parent = IntGetParentObject(WindowObject); + if (Parent && (Parent->Self == IntGetDesktopWindow())) OldValue = (LONG) IntSetOwner(WindowObject->Self, (HWND) NewValue); else OldValue = (LONG) NtUserSetParent(WindowObject->Self, (HWND) NewValue); + if(Parent) + IntReleaseWindowObject(Parent); break; case GWL_ID: @@ -2841,24 +2897,22 @@ BOOL STDCALL NtUserGetWindowRect(HWND hWnd, LPRECT Rect) { PWINDOW_OBJECT Wnd; - RECT SafeRect; + NTSTATUS Status; - IntAcquireWinLockShared(); if (!(Wnd = IntGetWindowObject(hWnd))) { - IntReleaseWinLock(); SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return FALSE; } - - SafeRect = Wnd->WindowRect; - IntReleaseWinLock(); - - if (! NT_SUCCESS(MmCopyToCaller(Rect, &SafeRect, sizeof(RECT)))) + Status = MmCopyToCaller(Rect, &Wnd->WindowRect, sizeof(RECT)); + if (!NT_SUCCESS(Status)) { + IntReleaseWindowObject(Wnd); + SetLastNtError(Status); return FALSE; } - + + IntReleaseWindowObject(Wnd); return TRUE; } @@ -2871,18 +2925,15 @@ NtUserGetWindowThreadProcessId(HWND hWnd, LPDWORD UnsafePid) { PWINDOW_OBJECT Wnd; DWORD tid, pid; - - IntAcquireWinLockShared(); - + if (!(Wnd = IntGetWindowObject(hWnd))) { - IntReleaseWinLock(); SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return 0; } - tid = IntGetWindowThreadProcessId(Wnd, &pid); - IntReleaseWinLock(); + tid = (DWORD)IntGetWndThreadId(Wnd); + pid = (DWORD)IntGetWndProcessId(Wnd); if (UnsafePid) MmCopyToCaller(UnsafePid, &pid, sizeof(DWORD)); @@ -2914,11 +2965,9 @@ NtUserMoveWindow( int nHeight, BOOL bRepaint) { - UINT flags = SWP_NOZORDER | SWP_NOACTIVATE; - - if(!bRepaint) - flags |= SWP_NOREDRAW; - return NtUserSetWindowPos(hWnd, 0, X, Y, nWidth, nHeight, flags); + return NtUserSetWindowPos(hWnd, 0, X, Y, nWidth, nHeight, + (bRepaint ? SWP_NOZORDER | SWP_NOACTIVATE : + SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW)); } /* @@ -2951,11 +3000,11 @@ NtUserQueryWindow(HWND hWnd, DWORD Index) switch(Index) { case 0x00: - Result = (DWORD)Window->OwnerThread->ThreadsProcess->UniqueProcessId; + Result = (DWORD)IntGetWndProcessId(Window); break; case 0x01: - Result = (DWORD)Window->OwnerThread->Cid.UniqueThread; + Result = (DWORD)IntGetWndThreadId(Window); break; default: @@ -3306,153 +3355,38 @@ NtUserValidateRect(HWND hWnd, const RECT* Rect) return (VOID)NtUserRedrawWindow(hWnd, Rect, 0, RDW_VALIDATE | RDW_NOCHILDREN); } -static BOOL IsStaticClass(PWINDOW_OBJECT Window) -{ - BOOL rc = FALSE; - - ASSERT(0 != Window->Class); - ASSERT(0 != Window->Class->Atom); - - DbgPrint("FIXME: Update IsStatic to really check if a window is a static\n"); - /* - if (0 == wcscmp((LPWSTR)Window->Class->lpszClassName, L"Static")) - rc = TRUE; - */ - return rc; -} - -static BOOL IsDisabled(PWINDOW_OBJECT Window) -{ - BOOL rc = FALSE; - ASSERT(0 != Window); - - rc = (Window->Style & WS_DISABLED); - - return rc; -} - -static PWINDOW_OBJECT RestrictiveSearchChildWindows(PWINDOW_OBJECT Window, POINT p) -{ - PWINDOW_OBJECT ChildWindow = 0; - PWINDOW_OBJECT rc = Window; - ASSERT(0 != Window); - - /* - **Aquire a mutex to the Child list. - */ - ExAcquireFastMutexUnsafe(&Window->ChildrenListLock); - - /* - **Now Find the first non-static window. - */ - ChildWindow = Window->FirstChild; - - while (0 != ChildWindow) - { - /* - **Test Restrictions on the window. - */ - if (!IsStaticClass(ChildWindow) && - !IsDisabled(ChildWindow) && - IntIsWindowVisible(ChildWindow->Self)) - { - /* - **Now find the deepest child window - */ - if (POINT_IN_RECT(p, ChildWindow->WindowRect)) - { - rc = RestrictiveSearchChildWindows(ChildWindow, p); - break; - } - } - ChildWindow = ChildWindow->NextSibling; - } - - /* - **Release mutex. - */ - ExReleaseFastMutexUnsafe(&Window->ChildrenListLock); - - return rc; -} /* - * NtUserWindowFromPoint - * - * Return Value - * The return value is a handle to the window that contains the point. - * If no window exists at the given point, the return value is NULL. - * If the point is over a static text control, the return value is a handle - * to the window under the static text control. - * - * Remarks - * The WindowFromPoint function does not retrieve a handle to a hidden or - * disabled window, even if the point is within the window. An application - * should use the ChildWindowFromPoint function for a nonrestrictive search. - * - * Author - * Mark Tempel - * - * Status * @implemented */ - HWND STDCALL NtUserWindowFromPoint(LONG X, LONG Y) { - HWND hWnd = 0; - PWINDOW_OBJECT DesktopWindow = 0; - PWINDOW_OBJECT TopWindow = 0; - PWINDOW_OBJECT ChildWindow = 0; POINT pt; + HWND Ret; + PWINDOW_OBJECT DesktopWindow, Window = NULL; - DesktopWindow = IntGetWindowObject(IntGetDesktopWindow()); - - pt.x = X; - pt.y = Y; - - if (DesktopWindow != NULL) + if ((DesktopWindow = IntGetWindowObject(IntGetDesktopWindow()))) { - /* - * Aquire the mutex to the child window list. (All the topmost windows) - */ - ExAcquireFastMutexUnsafe(&DesktopWindow->ChildrenListLock); - - /* - * Spin through the windows looking for the window that contains the - * point. The child windows are in Z-order. - */ - TopWindow = DesktopWindow->FirstChild; - while (TopWindow != NULL) + USHORT Hit; + + pt.x = X; + pt.y = Y; + + Hit = WinPosWindowFromPoint(DesktopWindow, pt, &Window); + + if(Window) { - if (POINT_IN_RECT(pt, TopWindow->WindowRect)) - { - break; - } - TopWindow = TopWindow->NextSibling; + Ret = Window->Self; + IntReleaseWindowObject(Window); + IntReleaseWindowObject(DesktopWindow); + return Ret; } - /* - * Search for the child window that contains the point. - */ - if (TopWindow != NULL) - { - ChildWindow = RestrictiveSearchChildWindows(TopWindow, pt); - if (ChildWindow != NULL) - { - hWnd = ChildWindow->Self; - } - } - - /* - * Release mutex. - */ - ExReleaseFastMutexUnsafe(&DesktopWindow->ChildrenListLock); + IntReleaseWindowObject(DesktopWindow); } - - IntReleaseWindowObject(DesktopWindow); - return hWnd; + return NULL; } diff --git a/reactos/subsys/win32k/ntuser/winlock.c b/reactos/subsys/win32k/ntuser/winlock.c deleted file mode 100644 index 3b1bb1d921f..00000000000 --- a/reactos/subsys/win32k/ntuser/winlock.c +++ /dev/null @@ -1,126 +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. - */ -/* - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * PURPOSE: Windows++ locking - * FILE: subsys/win32k/ntuser/winlock.c - * PROGRAMER: Gunnar - * REVISION HISTORY: - * - */ -/* INCLUDES ******************************************************************/ - -#include <ddk/ntddk.h> -#include <win32k/win32k.h> -#include <include/object.h> -#include <include/guicheck.h> -#include <include/window.h> -#include <include/class.h> -#include <include/error.h> -#include <include/winsta.h> -#include <include/winpos.h> -#include <include/callback.h> -#include <include/msgqueue.h> -#include <include/rect.h> - -#define NDEBUG -#include <win32k/debug1.h> -#include <debug.h> - -/* GLOBALS *****************************************************************/ - -static ERESOURCE WinLock; - -/* FUNCTIONS *****************************************************************/ - -BOOL FASTCALL IntVerifyWinLock(WINLOCK_TYPE Type) -{ - switch (Type) - { - case None: - return !ExIsResourceAcquiredSharedLite(&WinLock); - case Shared: /* NOTE: an exclusive lock is also a shared lock */ - case Any: - return ExIsResourceAcquiredSharedLite(&WinLock); - case Exclusive: - return ExIsResourceAcquiredExclusiveLite(&WinLock); - } - - KEBUGCHECK(0); - return FALSE; -} - -WINLOCK_TYPE FASTCALL IntSuspendWinLock() -{ - ASSERT_WINLOCK(Any); - - if (ExIsResourceAcquiredExclusiveLite(&WinLock)) return Exclusive; - - return Shared; -} - -VOID FASTCALL IntRestoreWinLock(WINLOCK_TYPE Type) -{ - switch (Type) - { - case Exclusive: - return IntAcquireWinLockExclusive(&WinLock); - case Shared: - return IntAcquireWinLockShared(&WinLock); - /* silence warnings */ - case None: - case Any: - break; - } - - KEBUGCHECK(0); -} - -inline VOID IntAcquireWinLockShared() -{ - KeEnterCriticalRegion(); - ExAcquireResourceSharedLite(&WinLock, TRUE /*Wait*/ ); -} - -inline VOID IntAcquireWinLockExclusive() -{ - KeEnterCriticalRegion(); - ExAcquireResourceExclusiveLite(&WinLock, TRUE /*Wait*/ ); -} - -inline VOID IntReleaseWinLock() -{ - ExReleaseResourceLite(&WinLock ); - KeLeaveCriticalRegion(); -} - -inline BOOL IntInitializeWinLock() -{ - ExInitializeResourceLite(&WinLock ); - return TRUE; -} - -inline VOID IntDeleteWinLock() -{ - ExDeleteResourceLite(&WinLock ); -} - -/* EOF */ diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index aa24ea7ca31..7e0c759d1cf 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.97 2004/02/22 14:26:35 navaraf Exp $ +/* $Id: winpos.c,v 1.98 2004/02/24 01:30:58 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -122,34 +122,53 @@ NtUserGetClientOrigin(HWND hWnd, LPPOINT Point) VOID FASTCALL WinPosActivateOtherWindow(PWINDOW_OBJECT Window) { - PWINDOW_OBJECT Child; - PWINDOW_OBJECT TabooWindow = Window; + PWINDOW_OBJECT Child, Wnd = Window; + HWND *List, *phWnd; - for (;;) + if (!Window || IntIsDesktopWindow(Window)) + { + IntSetFocusMessageQueue(NULL); + return; + } + + for(;;) + { + Wnd = IntGetParentObject(Wnd); + if(!Wnd) { - if (NULL == Window || IntIsDesktopWindow(Window)) - { - IntSetFocusMessageQueue(NULL); - return; - } - Window = Window->Parent; - ExAcquireFastMutex(&(Window->ChildrenListLock)); - Child = Window->FirstChild; - while (NULL != Child) - { - if (Child != TabooWindow) - { - ExReleaseFastMutex(&(Window->ChildrenListLock)); - if (IntSetForegroundWindow(Child)) - { - return; - } - ExAcquireFastMutex(&(Window->ChildrenListLock)); - } - Child = Child->NextSibling; - } - ExReleaseFastMutex(&(Window->ChildrenListLock)); + IntSetFocusMessageQueue(NULL); + return; } + if(IntIsDesktopWindow(Wnd)) + { + IntReleaseWindowObject(Wnd); + IntSetFocusMessageQueue(NULL); + return; + } + if((List = IntWinListChildren(Window))) + { + for(phWnd = List; *phWnd; ++phWnd) + { + if(*phWnd == Window->Self) + { + continue; + } + + Child = IntGetWindowObject(*phWnd); + if(Child) + { + if(IntSetForegroundWindow(Child)) + { + IntReleaseWindowObject(Child); + ExFreePool(List); + return; + } + IntReleaseWindowObject(Child); + } + } + ExFreePool(List); + } + } } VOID STATIC FASTCALL @@ -161,6 +180,7 @@ WinPosFindIconPos(HWND hWnd, POINT *Pos) PINTERNALPOS FASTCALL WinPosInitInternalPos(PWINDOW_OBJECT WindowObject, POINT pt, PRECT RestoreRect) { + PWINDOW_OBJECT Parent; INT XInc, YInc; if (WindowObject->InternalPos == NULL) @@ -168,10 +188,17 @@ WinPosInitInternalPos(PWINDOW_OBJECT WindowObject, POINT pt, PRECT RestoreRect) RECT WorkArea; PDESKTOP_OBJECT Desktop = PsGetWin32Thread()->Desktop; /* Or rather get it from the window? */ - if(IntIsDesktopWindow(WindowObject->Parent)) - WorkArea = *IntGetDesktopWorkArea(Desktop); + Parent = IntGetParentObject(WindowObject); + if(Parent) + { + if(IntIsDesktopWindow(Parent)) + WorkArea = *IntGetDesktopWorkArea(Desktop); + else + WorkArea = Parent->ClientRect; + IntReleaseWindowObject(Parent); + } else - WorkArea = WindowObject->Parent->ClientRect; + WorkArea = *IntGetDesktopWorkArea(Desktop); WindowObject->InternalPos = ExAllocatePoolWithTag(NonPagedPool, sizeof(INTERNALPOS), TAG_WININTLIST); if(!WindowObject->InternalPos) @@ -402,6 +429,7 @@ LONG STATIC FASTCALL WinPosDoNCCALCSize(PWINDOW_OBJECT Window, PWINDOWPOS WinPos, RECT* WindowRect, RECT* ClientRect) { + PWINDOW_OBJECT Parent; UINT wvrFlags = 0; /* Send WM_NCCALCSIZE message to get new client area */ @@ -413,14 +441,15 @@ WinPosDoNCCALCSize(PWINDOW_OBJECT Window, PWINDOWPOS WinPos, params.rgrc[0] = *WindowRect; params.rgrc[1] = Window->WindowRect; params.rgrc[2] = Window->ClientRect; - if (0 != (Window->Style & WS_CHILD)) + Parent = IntGetParentObject(Window); + if (0 != (Window->Style & WS_CHILD) && Parent) { - NtGdiOffsetRect(&(params.rgrc[0]), - Window->Parent->ClientRect.left, - - Window->Parent->ClientRect.top); - NtGdiOffsetRect(&(params.rgrc[1]), - Window->Parent->ClientRect.left, - - Window->Parent->ClientRect.top); - NtGdiOffsetRect(&(params.rgrc[2]), - Window->Parent->ClientRect.left, - - Window->Parent->ClientRect.top); + NtGdiOffsetRect(&(params.rgrc[0]), - Parent->ClientRect.left, + - Parent->ClientRect.top); + NtGdiOffsetRect(&(params.rgrc[1]), - Parent->ClientRect.left, + - Parent->ClientRect.top); + NtGdiOffsetRect(&(params.rgrc[2]), - Parent->ClientRect.left, + - Parent->ClientRect.top); } params.lppos = &winposCopy; winposCopy = *WinPos; @@ -432,10 +461,10 @@ WinPosDoNCCALCSize(PWINDOW_OBJECT Window, PWINDOWPOS WinPos, params.rgrc[0].top <= params.rgrc[0].bottom) { *ClientRect = params.rgrc[0]; - if (Window->Style & WS_CHILD) + if ((Window->Style & WS_CHILD) && Parent) { - NtGdiOffsetRect(ClientRect, Window->Parent->ClientRect.left, - Window->Parent->ClientRect.top); + NtGdiOffsetRect(ClientRect, Parent->ClientRect.left, + Parent->ClientRect.top); } } @@ -454,6 +483,8 @@ WinPosDoNCCALCSize(PWINDOW_OBJECT Window, PWINDOWPOS WinPos, { WinPos->flags &= ~SWP_NOCLIENTSIZE; } + if(Parent) + IntReleaseWindowObject(Parent); } else { @@ -492,13 +523,17 @@ WinPosDoWinPosChanging(PWINDOW_OBJECT WindowObject, if (!(WinPos->flags & SWP_NOMOVE)) { + PWINDOW_OBJECT Parent; X = WinPos->x; Y = WinPos->y; - if (0 != (WindowObject->Style & WS_CHILD)) + Parent = IntGetParentObject(WindowObject); + if ((0 != (WindowObject->Style & WS_CHILD)) && Parent) { - X += WindowObject->Parent->ClientRect.left; - Y += WindowObject->Parent->ClientRect.top; + X += Parent->ClientRect.left; + Y += Parent->ClientRect.top; } + if(Parent) + IntReleaseWindowObject(Parent); WindowRect->left = X; WindowRect->top = Y; WindowRect->right += X - WindowObject->WindowRect.left; @@ -588,8 +623,7 @@ WinPosDoOwnedPopups(HWND hWnd, HWND hWndInsertAfter) VOID STATIC FASTCALL WinPosInternalMoveWindow(PWINDOW_OBJECT Window, INT MoveX, INT MoveY) { - HWND *Children; - UINT Count; + PWINDOW_OBJECT Child; Window->WindowRect.left += MoveX; Window->WindowRect.right += MoveX; @@ -600,18 +634,13 @@ WinPosInternalMoveWindow(PWINDOW_OBJECT Window, INT MoveX, INT MoveY) Window->ClientRect.right += MoveX; Window->ClientRect.top += MoveY; Window->ClientRect.bottom += MoveY; - - Children = IntWinListChildren(Window); - if (Children) + + IntLockRelatives(Window); + for(Child = Window->FirstChild; Child; Child = Child->NextSibling) { - for (Count = 0; Children[Count] != NULL; Count++) - { - Window = IntGetWindowObject(Children[Count]); - WinPosInternalMoveWindow(Window, MoveX, MoveY); - IntReleaseWindowObject(Window); - } - ExFreePool(Children); + WinPosInternalMoveWindow(Child, MoveX, MoveY); } + IntUnLockRelatives(Window); } /* @@ -691,13 +720,18 @@ WinPosFixupFlags(WINDOWPOS *WinPos, PWINDOW_OBJECT Window) if ((WinPos->hwndInsertAfter != HWND_TOP) && (WinPos->hwndInsertAfter != HWND_BOTTOM)) { + PWINDOW_OBJECT Parent = IntGetParentObject(Window); if (NtUserGetAncestor(WinPos->hwndInsertAfter, GA_PARENT) != - Window->Parent->Self) + (Parent ? Parent->Self : NULL)) { + if(Parent) + IntReleaseWindowObject(Parent); return FALSE; } else { + if(Parent) + IntReleaseWindowObject(Parent); /* * We don't need to change the Z order of hwnd if it's already * inserted after hwndInsertAfter or when inserting hwnd after @@ -812,26 +846,35 @@ WinPosSetWindowPos(HWND Wnd, HWND WndInsertAfter, INT x, INT y, INT cx, PWINDOW_OBJECT ParentWindow; PWINDOW_OBJECT InsertAfterWindow; - ParentWindow = Window->Parent; - if (ParentWindow) + if ((ParentWindow = IntGetParentObject(Window))) { if (WinPos.hwndInsertAfter == HWND_TOP) InsertAfterWindow = NULL; else if (WinPos.hwndInsertAfter == HWND_BOTTOM) - InsertAfterWindow = IntGetWindowObject(ParentWindow->LastChild->Self); + { + IntLockRelatives(ParentWindow); + if(ParentWindow->LastChild) + { + IntReferenceWindowObject(ParentWindow->LastChild); + InsertAfterWindow = ParentWindow->LastChild; + } + else + InsertAfterWindow = NULL; + IntUnLockRelatives(ParentWindow); + } else InsertAfterWindow = IntGetWindowObject(WinPos.hwndInsertAfter); /* Do nothing if hwndInsertAfter is HWND_BOTTOM and Window is already the last window */ if (InsertAfterWindow != Window) { - ExAcquireFastMutexUnsafe(&ParentWindow->ChildrenListLock); IntUnlinkWindow(Window); IntLinkWindow(Window, ParentWindow, InsertAfterWindow); - ExReleaseFastMutexUnsafe(&ParentWindow->ChildrenListLock); } if (InsertAfterWindow != NULL) IntReleaseWindowObject(InsertAfterWindow); + + IntReleaseWindowObject(ParentWindow); } } @@ -1191,7 +1234,7 @@ WinPosShowWindow(HWND Wnd, INT Cmd) if (Wnd == IntGetThreadFocusWindow() || IntIsChildWindow(Wnd, IntGetThreadFocusWindow())) { - NtUserSetFocus(Window->Parent->Self); + NtUserSetFocus(Window->Parent); } } @@ -1238,71 +1281,78 @@ WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, POINT *Point, PWINDOW_OBJECT* Window, USHORT *HitTest) { PWINDOW_OBJECT Current; + HWND *List, *phWnd; - ExAcquireFastMutexUnsafe(&ScopeWin->ChildrenListLock); - Current = ScopeWin->FirstChild; - while (Current) + if((List = IntWinListChildren(ScopeWin))) + { + for(phWnd = List; *phWnd; ++phWnd) { + if(!(Current = IntGetWindowObject(*phWnd))) + { + continue; + } + if (Current->Style & WS_VISIBLE && - ((!(Current->Style & WS_DISABLED)) || - (Current->Style & (WS_CHILD | WS_POPUP)) != WS_CHILD) && - (Point->x >= Current->WindowRect.left && + ((!(Current->Style & WS_DISABLED)) || + (Current->Style & (WS_CHILD | WS_POPUP)) != WS_CHILD) && + (Point->x >= Current->WindowRect.left && Point->x < Current->WindowRect.right && Point->y >= Current->WindowRect.top && Point->y < Current->WindowRect.bottom)) /* FIXME - check if Point is in window region */ - { - if(*Window) { - ObmDereferenceObject(*Window); - } - ObmReferenceObjectByPointer(Current, otWindow); - *Window = Current; - - if (Current->Style & WS_DISABLED) + if(*Window) { - ExReleaseFastMutexUnsafe(&ScopeWin->ChildrenListLock); - *HitTest = HTERROR; - return TRUE; + IntReleaseWindowObject(*Window); } - if(Current->MessageQueue == PsGetWin32Thread()->MessageQueue) - { - *HitTest = IntSendMessage(Current->Self, WM_NCHITTEST, 0, - MAKELONG(Point->x, Point->y)); - if((*HitTest) == (USHORT)HTTRANSPARENT) - { - Current = Current->NextSibling; - continue; - } - } - else - { - *HitTest = HTCLIENT; - } - - if (Point->x >= Current->ClientRect.left && - Point->x < Current->ClientRect.right && - Point->y >= Current->ClientRect.top && - Point->y < Current->ClientRect.bottom) - { - USHORT ChildHitTest; - if(WinPosSearchChildren(Current, Point, Window, &ChildHitTest)) - { - ExReleaseFastMutexUnsafe(&ScopeWin->ChildrenListLock); - *HitTest = ChildHitTest; - return TRUE; - } - } - - ExReleaseFastMutexUnsafe(&ScopeWin->ChildrenListLock); - return TRUE; - } - Current = Current->NextSibling; + *Window = Current; + + if(Current->Style & WS_DISABLED) + { + *HitTest = HTERROR; + ExFreePool(List); + return TRUE; + } + + if(Current->MessageQueue == PsGetWin32Thread()->MessageQueue) + { + *HitTest = IntSendMessage(Current->Self, WM_NCHITTEST, 0, + MAKELONG(Point->x, Point->y)); + if((*HitTest) == (USHORT)HTTRANSPARENT) + { + continue; + } + } + else + { + *HitTest = HTCLIENT; + } + + if(Point->x >= Current->ClientRect.left && + Point->x < Current->ClientRect.right && + Point->y >= Current->ClientRect.top && + Point->y < Current->ClientRect.bottom) + { + USHORT ChildHitTest; + if(WinPosSearchChildren(Current, Point, Window, &ChildHitTest)) + { + *HitTest = ChildHitTest; + ExFreePool(List); + return TRUE; + } + } + + ExFreePool(List); + return TRUE; + } + IntReleaseWindowObject(Current); } - - ExReleaseFastMutexUnsafe(&ScopeWin->ChildrenListLock); - if(*Window == NULL) - *HitTest = HTNOWHERE; + ExFreePool(List); + } + + if((*Window) == NULL) + HitTest = HTNOWHERE; + return FALSE; } @@ -1330,15 +1380,18 @@ WinPosWindowFromPoint(PWINDOW_OBJECT ScopeWin, POINT WinPoint, /* Translate the point to the space of the scope window. */ DesktopWindowHandle = IntGetDesktopWindow(); - DesktopWindow = IntGetWindowObject(DesktopWindowHandle); - Point.x += ScopeWin->ClientRect.left - DesktopWindow->ClientRect.left; - Point.y += ScopeWin->ClientRect.top - DesktopWindow->ClientRect.top; - IntReleaseWindowObject(DesktopWindow); - + if((DesktopWindow = IntGetWindowObject(DesktopWindowHandle))) + { + Point.x += ScopeWin->ClientRect.left - DesktopWindow->ClientRect.left; + Point.y += ScopeWin->ClientRect.top - DesktopWindow->ClientRect.top; + IntReleaseWindowObject(DesktopWindow); + } + if(WinPosSearchChildren(ScopeWin, &Point, Window, &HitTest)) { return HitTest; } + return HTNOWHERE; } From dcbe451792b322046273b2f6337f6cc5dc3325cc Mon Sep 17 00:00:00 2001 From: Aleksey Bragin <aleksey@reactos.org> Date: Tue, 24 Feb 2004 08:05:13 +0000 Subject: [PATCH 0157/1463] I modified this StretchBlt sample to provide non-uniform scaling of image, plus two ways to scale it - via stretchblt() and via stretchdibits() -- to test both functions in ReactOS. If anyone is strictly against me modifiying this sample from the book -- tell me, and I will create stretchblt2 then. But I think this is unncessary. svn path=/trunk/; revision=8347 --- reactos/apps/tests/stretchblt/stretchblt.cpp | 196 +++++++++++++++---- 1 file changed, 155 insertions(+), 41 deletions(-) diff --git a/reactos/apps/tests/stretchblt/stretchblt.cpp b/reactos/apps/tests/stretchblt/stretchblt.cpp index ef7bed1d459..dec7dd56a71 100644 --- a/reactos/apps/tests/stretchblt/stretchblt.cpp +++ b/reactos/apps/tests/stretchblt/stretchblt.cpp @@ -10,14 +10,22 @@ // if you have any questions about this code. // ------------------------------------------------------------------ +// Modified by Aleksey Bragin (aleksey at studiocerebral.com) +// to support non-uniform scaling, and output via sretchdibits +// (type something in the command line to invoke this mode, +// in future it will be source BPP) //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> #include <windows.h> +#include <stdio.h> //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< HWND HListBox = NULL; +HWND VListBox = NULL; const int ID_LISTBOX = 101; +const int ID_LISTBOX2 = 102; +BOOL useDIBits=FALSE; // How to display the image - via StretchDIBits HINSTANCE HInst; HINSTANCE HPrevInst; @@ -47,7 +55,7 @@ int APIENTRY WinMain(HINSTANCE HInstance, HINSTANCE HPrevInstance, if (RegisterClass(&wc)) { HWND HWnd = - CreateWindow(WndClassName, TEXT("StretchBlt Zooming Demo"), + CreateWindow(WndClassName, TEXT("StretchBlt NonUniform Zooming Demo"), WS_OVERLAPPEDWINDOW | WS_CAPTION | WS_VISIBLE | WS_CLIPSIBLINGS, 0, 0, 675, 560, @@ -61,8 +69,16 @@ int APIENTRY WinMain(HINSTANCE HInstance, HINSTANCE HPrevInstance, 530, 5, 130, 150, HWnd, reinterpret_cast<HMENU>(ID_LISTBOX), HInst, NULL); - if (HListBox) + VListBox = + CreateWindowEx(WS_EX_CLIENTEDGE, "LISTBOX", "", + LBS_NOTIFY | WS_CHILD | WS_VISIBLE, + 530, 5+170, 130, 150, HWnd, + reinterpret_cast<HMENU>(ID_LISTBOX2), + HInst, NULL); + + if (HListBox && VListBox) { +// horizontal zoom SNDMSG(HListBox, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>("Zoom 25%")); SNDMSG(HListBox, LB_ADDSTRING, 0, @@ -79,6 +95,24 @@ int APIENTRY WinMain(HINSTANCE HInstance, HINSTANCE HPrevInstance, reinterpret_cast<LPARAM>("Zoom 200%")); SNDMSG(HListBox, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>("Zoom 300%")); +// vertical zoom + SNDMSG(VListBox, LB_ADDSTRING, 0, + reinterpret_cast<LPARAM>("Zoom 25%")); + SNDMSG(VListBox, LB_ADDSTRING, 0, + reinterpret_cast<LPARAM>("Zoom 50%")); + SNDMSG(VListBox, LB_ADDSTRING, 0, + reinterpret_cast<LPARAM>("Zoom 75%")); + SNDMSG(VListBox, LB_ADDSTRING, 0, + reinterpret_cast<LPARAM>("Zoom 100%")); + SNDMSG(VListBox, LB_ADDSTRING, 0, + reinterpret_cast<LPARAM>("Zoom 125%")); + SNDMSG(VListBox, LB_ADDSTRING, 0, + reinterpret_cast<LPARAM>("Zoom 150%")); + SNDMSG(VListBox, LB_ADDSTRING, 0, + reinterpret_cast<LPARAM>("Zoom 200%")); + SNDMSG(VListBox, LB_ADDSTRING, 0, + reinterpret_cast<LPARAM>("Zoom 300%")); + } ShowWindow(HWnd, nCmdShow); @@ -99,12 +133,15 @@ int APIENTRY WinMain(HINSTANCE HInstance, HINSTANCE HPrevInstance, // image related BITMAP bmp; +BITMAPINFO bmInfo; +char *bbits = NULL; // bitmap bits const char* filename = "LENA.BMP"; HDC HMemDC = NULL; HBITMAP HOldBmp = NULL; // zooming related -float zoom_factor = 0.5; +float zoom_factor_h = 0.5; +float zoom_factor_v = 0.5; RECT RDest = {5, 5, 0, 0}; enum {ID_ZOOM25, ID_ZOOM50, ID_ZOOM75, ID_ZOOM100, ID_ZOOM125, ID_ZOOM150, ID_ZOOM200, ID_ZOOM300}; @@ -116,6 +153,15 @@ LRESULT CALLBACK MainWndProc(HWND HWnd, UINT Msg, WPARAM WParam, { case WM_CREATE: { + // check commandline + if (strlen(cmdline) != 0) + { + + useDIBits = TRUE; + } + else + useDIBits = FALSE; + // create a memory DC HMemDC = CreateCompatibleDC(NULL); if (HMemDC) @@ -131,34 +177,76 @@ LRESULT CALLBACK MainWndProc(HWND HWnd, UINT Msg, WPARAM WParam, // extract dimensions of the bitmap GetObject(HBmp, sizeof(BITMAP), &bmp); - // associate the bitmap with the memory DC + // fill the BITMAPINFO stucture for further use by StretchDIBits + bmInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bmInfo.bmiHeader.biWidth = bmp.bmWidth; + bmInfo.bmiHeader.biHeight = bmp.bmHeight; + bmInfo.bmiHeader.biPlanes = 1;//bmp.bmPlanes; + bmInfo.bmiHeader.biBitCount = bmp.bmBitsPixel; + bmInfo.bmiHeader.biCompression = BI_RGB; + bmInfo.bmiHeader.biSizeImage = 0; + bmInfo.bmiHeader.biXPelsPerMeter = 0; + bmInfo.bmiHeader.biClrImportant = 0; + bmInfo.bmiHeader.biClrUsed = 0; + + // associate the bitmap with the memory DC HOldBmp = static_cast<HBITMAP>( SelectObject(HMemDC, HBmp) ); + + if (useDIBits) + { + bbits = new char[bmp.bmHeight*bmp.bmWidthBytes*(bmp.bmBitsPixel / 8)]; + //GetDIBits(HMemDC, HBmp, 0, bmp.bmHeight, bbits, &bmInfo, DIB_RGB_COLORS); + + // Here goes a temp hack, since GetDIBits doesn't exist in ReactOS yet + FILE *f = fopen(filename, "rb"); + BITMAPFILEHEADER bmpHeader; + + fread(&bmpHeader, sizeof(BITMAPFILEHEADER), 1, f); + fread(&bmInfo, sizeof(BITMAPINFO), 1, f); + fseek(f, bmpHeader.bfOffBits, SEEK_SET); + fread(bbits, bmp.bmHeight*bmp.bmWidthBytes*(bmp.bmBitsPixel / 8), 1, f); + + fclose(f); + } } } } case WM_COMMAND: { - if (WParam == MAKEWPARAM(ID_LISTBOX, LBN_SELCHANGE)) + if (WParam == MAKEWPARAM(ID_LISTBOX, LBN_SELCHANGE) || + WParam == MAKEWPARAM(ID_LISTBOX2, LBN_SELCHANGE)) { switch (SNDMSG(HListBox, LB_GETCURSEL, 0, 0)) { - case ID_ZOOM25: zoom_factor = 0.25; break; - case ID_ZOOM50: zoom_factor = 0.50; break; - case ID_ZOOM75: zoom_factor = 0.75; break; - case ID_ZOOM100: zoom_factor = 1.00; break; - case ID_ZOOM125: zoom_factor = 1.25; break; - case ID_ZOOM150: zoom_factor = 1.50; break; - case ID_ZOOM200: zoom_factor = 2.00; break; - case ID_ZOOM300: zoom_factor = 3.00; break; + case ID_ZOOM25: zoom_factor_h = 0.25; break; + case ID_ZOOM50: zoom_factor_h = 0.50; break; + case ID_ZOOM75: zoom_factor_h = 0.75; break; + case ID_ZOOM100: zoom_factor_h = 1.00; break; + case ID_ZOOM125: zoom_factor_h = 1.25; break; + case ID_ZOOM150: zoom_factor_h = 1.50; break; + case ID_ZOOM200: zoom_factor_h = 2.00; break; + case ID_ZOOM300: zoom_factor_h = 3.00; break; + } + + switch (SNDMSG(VListBox, LB_GETCURSEL, 0, 0)) + { + case ID_ZOOM25: zoom_factor_v = 0.25; break; + case ID_ZOOM50: zoom_factor_v = 0.50; break; + case ID_ZOOM75: zoom_factor_v = 0.75; break; + case ID_ZOOM100: zoom_factor_v = 1.00; break; + case ID_ZOOM125: zoom_factor_v = 1.25; break; + case ID_ZOOM150: zoom_factor_v = 1.50; break; + case ID_ZOOM200: zoom_factor_v = 2.00; break; + case ID_ZOOM300: zoom_factor_v = 3.00; break; } // calculate the new width and height const int new_width = - static_cast<int>(zoom_factor * bmp.bmWidth); + static_cast<int>(zoom_factor_h * bmp.bmWidth); const int new_height = - static_cast<int>(zoom_factor * bmp.bmHeight); + static_cast<int>(zoom_factor_v * bmp.bmHeight); // is zooming in? bool zoom_in = (new_width > RDest.right - RDest.left); @@ -210,34 +298,57 @@ LRESULT CALLBACK MainWndProc(HWND HWnd, UINT Msg, WPARAM WParam, // // TODO: add palette support (see Chapter 9)... // + if (useDIBits) + { + if (RDest.right - RDest.left > 0) + { + if (zoom_factor_h < 1.0 || zoom_factor_v < 1.0) + { + SetStretchBltMode(Hdc, COLORONCOLOR); + } - if (RDest.right - RDest.left > 0) - { - // use BitBlt when not zooming - if (zoom_factor == 1.0) - { - BitBlt(Hdc, RDest.left, RDest.top, - RDest.right - RDest.left, - RDest.bottom - RDest.top, - HMemDC, 0, 0, - SRCCOPY); - } - else - { - if (zoom_factor < 1.0) - { - SetStretchBltMode(Hdc, COLORONCOLOR); - } + // render the zoomed image + StretchDIBits(Hdc, RDest.left, RDest.top, + RDest.right - RDest.left, + RDest.bottom - RDest.top, + 0, 0, + bmp.bmWidth, bmp.bmHeight, + bbits, &bmInfo, + DIB_RGB_COLORS, + SRCCOPY); + } + } + else + { + if (RDest.right - RDest.left > 0) + { + + // use BitBlt when not zooming + if (zoom_factor_h == 1.0 && zoom_factor_v == 1.0) + { + BitBlt(Hdc, RDest.left, RDest.top, + RDest.right - RDest.left, + RDest.bottom - RDest.top, + HMemDC, 0, 0, + SRCCOPY); + } + else + { + if (zoom_factor_h < 1.0 || zoom_factor_v < 1.0) + { + SetStretchBltMode(Hdc, COLORONCOLOR); + } - // render the zoomed image - StretchBlt(Hdc, RDest.left, RDest.top, - RDest.right - RDest.left, - RDest.bottom - RDest.top, - HMemDC, 0, 0, - bmp.bmWidth, bmp.bmHeight, - SRCCOPY); - } - } + // render the zoomed image + StretchBlt(Hdc, RDest.left, RDest.top, + RDest.right - RDest.left, + RDest.bottom - RDest.top, + HMemDC, 0, 0, + bmp.bmWidth, bmp.bmHeight, + SRCCOPY); + } + } + } } #if 0 catch (...) @@ -254,6 +365,9 @@ LRESULT CALLBACK MainWndProc(HWND HWnd, UINT Msg, WPARAM WParam, DeleteObject(SelectObject(HMemDC, HOldBmp)); DeleteDC(HMemDC); + if (bbits) + delete bbits; + PostQuitMessage(0); return 0; } From 36136326185342dbdcbfe2d1af7fe15d66b3111c Mon Sep 17 00:00:00 2001 From: Aleksey Bragin <aleksey@reactos.org> Date: Tue, 24 Feb 2004 08:17:37 +0000 Subject: [PATCH 0158/1463] InstallHinfSection has had a good progress at last - now it supports (at least _should_ - I didn't have time to test it thoroughly) file operations via file queues. There maybe a mess with paths, and I'm committing this now to have this code lying in CVS rather than on my HDD, since it isn't fully finished yet. But it's really close to the final stage. svn path=/trunk/; revision=8348 --- reactos/lib/setupapi/setupapi_main.c | 85 ++++++++++++++++++++++------ 1 file changed, 68 insertions(+), 17 deletions(-) diff --git a/reactos/lib/setupapi/setupapi_main.c b/reactos/lib/setupapi/setupapi_main.c index 739850f2b6b..441c5b8fbe6 100644 --- a/reactos/lib/setupapi/setupapi_main.c +++ b/reactos/lib/setupapi/setupapi_main.c @@ -133,16 +133,23 @@ int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, * * nCmdShow = nCmdShow of CreateProcess */ -// TODO: 1) Set errors -// 2) Take flags into account + +// In development now, current status: +// Currently it does registry settings + file operations +// Registry settings tested +// File operations - not tested, just done according to MSDN (file queus) +// Flags - taken from WINE implementation + void WINAPI InstallHinfSection(HWND hwnd, HINSTANCE handle, LPCSTR lpszCmdLine, INT nCmdShow) { - LPSTR *pSub; + LPSTR *pSub; DWORD count; HINF hInf = 0; - RETERR16 res = OK, tmp; WORD wFlags; BOOL reboot = FALSE; + BOOL err; + HSPFILEQ fQueue; + PVOID cbContext; TRACE("(%04x, %04x, %s, %d);\n", hwnd, hinst, lpszCmdLine, nCmdShow); @@ -158,23 +165,61 @@ void WINAPI InstallHinfSection(HWND hwnd, HINSTANCE handle, LPCSTR lpszCmdLine, hInf = SetupOpenInfFileA(*(pSub+count), NULL, INF_STYLE_WIN4, NULL); if (hInf == (HINF)INVALID_HANDLE_VALUE) { - //res = ERROR_FILE_NOT_FOUND; /* yes, correct */ + SetLastError(ERROR_FILE_NOT_FOUND); SETUPX_FreeSubStrings(pSub); return; } - // FIXME: Take result in mind - SetupInstallFromInfSectionA(hwnd, hInf, (PCSTR)(*(pSub+1)), SPINST_ALL/*flags*/, - NULL/*HKEY key_root*/, "C:\\"/*PCWSTR src_root*/, 0/*UINT copy_flags*/, + // Deal with registry settings + err = SetupInstallFromInfSectionA(hwnd, hInf, (PCSTR)(*(pSub+1)), SPINST_ALL ^ SPINST_FILES/*flags*/, + NULL/*HKEY key_root*/, NULL/*PCWSTR src_root*/, 0/*UINT copy_flags*/, NULL/*PSP_FILE_CALLBACK_W callback*/, NULL/*PVOID context*/, NULL/*HDEVINFO devinfo*/, NULL/*PSP_DEVINFO_DATA devinfo_data*/); - - // release alloced memory + + if (err) + { + // TODO: Show some message box saying installing from INF section has failed + // FIXME: Use strings from resources, and do it the way Windows does + MessageBox(hwnd, "InstallFromHinfSection", "Installing registry settings from an INF section failed", MB_OK); + + // release alloced memory + SetupCloseInfFile(hInf); + SETUPX_FreeSubStrings(pSub); + return; + } + + // Deal with files now + fQueue = SetupOpenFileQueue(); + + if (fQueue == INVALID_HANDLE_VALUE) + { + // TODO: Show some message box saying creating a file queue has failed + MessageBox(hwnd, "InstallFromHinfSection", "File queue opening failed", MB_OK); + + // release alloced memory + SetupCloseInfFile(hInf); + SETUPX_FreeSubStrings(pSub); + return; + } + + cbContext = SetupInitDefaultQueueCallback(hwnd); + + // Fullfill the file queue + //FIXME: Is the flag (SP_COPY_NEWER) right for this call? + SetupInstallFilesFromInfSectionA(hInf, /*HINF hlayout*/NULL, fQueue, + (PCSTR)(*(pSub+1)), /*PCSTR src_root*/NULL, SP_COPY_NEWER); + + err = SetupCommitFileQueueA(hwnd, fQueue, SetupDefaultQueueCallbackA, cbContext); + + + // Release all alloced handles and memory + SetupCloseFileQueue(fQueue); + SetupTermDefaultQueueCallback(cbContext); SetupCloseInfFile(hInf); - SETUPX_FreeSubStrings(pSub); - -/* - wFlags = atoi(*(pSub+count-1)) & ~128; + SETUPX_FreeSubStrings(pSub); + + // Deal with flags now + wFlags = atoi(*(pSub+count-1)) & ~128; switch (wFlags) { case HOW_ALWAYS_SILENT_REBOOT: @@ -183,14 +228,20 @@ void WINAPI InstallHinfSection(HWND hwnd, HINSTANCE handle, LPCSTR lpszCmdLine, break; case HOW_ALWAYS_PROMPT_REBOOT: case HOW_PROMPT_REBOOT: - if (MessageBoxA(HWND_32(hwnd), "You must restart Wine before the new settings will take effect.\n\nDo you want to exit Wine now ?", "Systems Settings Change", MB_YESNO|MB_ICONQUESTION) == IDYES) + // FIXME: What is the SetupPromptReboot() function is for? + // Anyway it isn't implemented + if (MessageBoxA(hwnd, "You must restart ReactOS before the new settings will take effect.\n\nDo you want to exit ReactOS now ?", "Systems Settings Change", MB_YESNO|MB_ICONQUESTION) == IDYES) reboot = TRUE; break; default: ERR("invalid flags %d !\n", wFlags); - goto end; + return; + } + + if (reboot) + { + ExitWindowsEx(EWX_REBOOT, 0); } -*/ } typedef struct From e3ead6ead594666928351170b1f870d6ae0de3e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Tue, 24 Feb 2004 09:16:32 +0000 Subject: [PATCH 0159/1463] Add more icon images svn path=/trunk/; revision=8349 --- reactos/subsys/system/cmd/res/terminal.ico | Bin 4710 -> 94198 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/reactos/subsys/system/cmd/res/terminal.ico b/reactos/subsys/system/cmd/res/terminal.ico index d420bc6f6f897f0447912636112800d35bc4e651..c3f80a07e3d7172b3151bd0ffa875e6ced982334 100644 GIT binary patch literal 94198 zcmeI52Y??%^~W~_F4Tk;L;^WN5G0i7350$?=tV?xbdcg1`bC7hKZ?0SAg3Y;MaWT< zE{3Cup#(7W77<07O0iHaL?w5Za+&}4Gy8j&xxM|B`&~i;>?H5@x4SbtZ{GLKn>S@= zqo`lBN;G<Oe;xZpqX$IMOHmY6R_4z8MbYvDqiD#G`1}st+j_Z3@rNk(z-avPQS`RX zD=Xvkcl$@t0V@+fKHo&?w;oLVNbv_nH?JB+M-3r<?tGA*Kb-jS`FK6+wvD5xv61u2 zXp=$xqM@5x`pW3$jiP9$t#rqy*SXTYeOSL-`pRg$c)jqXe$gi4Q&~n|7f~)kV|?(x z!#~cs@U&OI`|rKaW&2h~(O~B~7tW5N;cmuhGw$W+7Je{3igwn+T}KqHKW+Lg2fd=} z1NWNJ{I1SdTWz1p29;%>A8s&^>(P+0Lv+6Wz`a+m*8SnDji?^T{pul~k92?if#)_x z+>a{9R(I%rKNaQ>&LuhJyM9#N#QmKH4XPaS3itoJYqieTA93@bLF6}f><u??{-4!W zTdhOKhprnj;t<6@YTUSSq<?7Iv}xR*qjT<`m^;_$*K~jQrt!JT<;$b;`r~kpx<7#9 zn^D<;<iL>cs4SwWB8p~mRMG9&$axl`#+(fN(d47L?B%BVmrt&CeG{dx6jh75>WhA- z1rJopjiI;Qdf?8T^Y5ML+=p9DpMJ!ci+?a|%nBpd{J*i)SB+Wy;$fqs=rd!Q#||6Q zKN>bB8nR~HR{e&J*=w(1+mBrRkgcA%;i~QL{OS?gJ-gXeRU<EcWhdtz*x9)S!@ZXE z%uGCVg_%;nMz0k;<1LOWJbPwN#Vu3hHAGY?GI>?&cUn-IuFKn;97PjfkD{-Ph@!nN zjiO_BmCR*BzkW^>?K3or&NxxkTIcl(6>mXTGU2!AcW-}@7JeoFoIRA0RA`J3{&)93 zjk>8Tjg9d^fAv$;7|onHQ#Yun99(?RU-Agcsk_T~sP7r-#B#-C5AkHz;U*J02)Z$d z3mvYb!!_$dvk#MXeIn6`*z6`Z>z2PUJ9j<zC?e=*bMqvwx92jRR6i;HH92>^q9S0a zqOPuaawG94)zvS$q2JNOwD@&(b#^_BUtd9d|D1L`zoIVALa`Npa?DRfl)GB5ls>-a zzdhnidFyXoeN-12|B6o*FjY}kAr?F0=R|eHj6;QL$HbWb_DJ!$rJyK^pW`2CE51rp zCqe2u@rOIb*M<K6j#BXaCjD{BB+fI=g!s99E9x4YYlIzzI>py>B<F7OtgpB7PHL#% zI1n_~<M=8^x9gKBSA%PBnC!aU$i<&j-_ZT~WcU&PVkUe}{Y2-VKWSn|x6Ac<ERI8a zL-)&F@ey!WXb_*o7eDo}_QiiEHS0P4`Ci$&|B>7Vb-xmyDSk!Db@V*y_VhT9dR>mq z9Hws3KYw}I`V*JR+amq!d6Z^nenbJt8guvjv0u*5D%+137(cCl?x8&n%0>T|iFT&G zd6GhNLw$2Y!z9&%xEb)~esXhruDVRdkYna`j!7Vi4$aLvZ_HI!*}B2abvpOPiuzm8 z;P0D}#USf`Y>Vsa6@L)VYsB2@R3>kD{5+Xu?Aeg0!9Oo&UMplX{C%usY&#n|hE%w^ zNc_~*Pf+^!{<oC%1oE$M=pesE)@Nd~Dn?+A8pyxCx!p(BpNSnq`ngGq;>Y*v8*=}2 zU-3I=2jehV6)l!m&Zx+QH_#?pn9u|HzFr8e*UY8v|HXRVn72^6!_CIV_@KY~DeApH zRngqg+$;qhEWfy;V{+s07_-KSXjfgu?7`?nMTO332|1Vk4bgcVZ}#8@6t<zUA#QYL z4{k=CC(p*ck$>acVR70Ou%YD!(suVd2gQ$CA$X!}j9L`$JI+#q7E!IJio_x}%SE$9 zEuvacl_(Oq7F`#$h-yVuA|;Mot*(n&M75$SkscViDqR<~h-yVuB4vW-8qE^5h-yVu zB4w<sXDORmdgLr6pQWg?bXhTH>AI*zR4b|y>4Nytby16`R#YWYB=Mu`q83rDs7j=S z;z!p-Euvacl}Ha$&bqFDEuvacl}H(gA6*f(h-yVuB4sLmbY0XUsufj<#E5R`x~N4| zE2<LdMEvNws6|vOsuC%J_|bJyi>OvqB~l{sqw6C6)rzV_dXV@LccK<it*A<*hl?Lw z7qy6LMO7kYD1LNZ)FP@CRf)uelIXgqMN})Q66uHd(RERas8&=Z(oONB>z)%`*S{)} z5{Ms3O4K5%6;+A!5b>kyq83rDs7j;<iyvJVwTNm(RU&03eso>bBB~WtiNt^&rR$;= zQLU&-q(9<E*S%D9T}S@uhWJr7BGeKUMBNlw{OGy}^*|MXT@L_CU;`rHK=eA%brla0 zA}&OO7$`EuqbRTqi?Bo1WWys#PE;;O(Z5BniDrnViDdsHoVszMu_ARwqtzC7wCLae z{&)1+Yp+E!X3U5*dZhkCv)ZWoNJC1|*s)`y5hF%K8jVuk;yVkAT>_o+<`xKcvuR;2 z;{|OV3H_O~D74LK<Nv5Og;8yz6y}Ut;1hI?QbdcYIEs}Eisxf0a{H+E_BORF3avz6 zl!634i5_hU+I@miqdJMt;D-|ALN2NDvn+EwlB6qsG`Fc~o)2-sYv$I(KjzJy*Tld1 z?QP1Wwd?uw7j|~Gwze)H%+LMPPhDzl?d)8*(ACW8_Wb#AbP_1~{Fq3r=t|J3_{rz% zM(ct_Irzvv14UoBP|qLLzKDO%&!PlGCdBM0zN<m9-T9{g3gi+0;mmUr^PiKa<R3-z z-&cWE2A{@9CvsQxg>LQ~fzid!oCR+Z-4{BJ7{nI$UOwUT7ksFTmL$%`b0XG#bUj}M z2%hiW<VG$9QIVp>mS##mZLxej{|nsv3*Y2faSHnzKO9Bw@q8r^Pu-IE*bAN4`?-;o zw-puhs_mouN5{<gpDHT>egghM0$x18h!MeCD&o(L+5-N0K1EzGXXKobQAd|ZNkY2t z`IL7~tBcX~Iz6BGv2Ny4cKYYX{KWAWv^6OP$a-Dy%Hvfi{?jA=Sy9y1aidpe>2vr0 zI%};F|D$}-y?o}+pW8Mvno}dyPYnw?FcuzP_-SjJKYyMQw9Riy5A!=BDa4}ZH_dAY zh8k5>Rpj8Wuf3|jia#g!d_`<)?TALU*C3s_akaO<oX(v$x2Z;41kdlBKdOf7b4B6b z+{xU|xw1I{|DCQ$CZy*-Z&zw+=1ZPY)V_%Snt3(t1;X5U3~nvrUneDmnE!>cx21*H z-n#jv#g5uydoGJxkasIqjkiANwp71_5Xa2^mLdW3gL)pbajU}G+?c!Vk9{7u%JowR z26<-vRP{5merncF&HAaOSn{P8r?aNr#$`Fy#8gw$Q8O2&%#FzPqjKFgIklrkwbkf; z*PL?@A@16#BP2&h_uG8eu|}bTKQ;8R<ZbB*@%?sr#CWRmD*3OU@{kvHw)u{Z(zkOv z_D6MFfd~s*#X=%|9A{DbuKT#$ITx4%k9VE1qpjz6<T?~_4Bgai?)&G<Ep5kd@t5(t z{at_GJEElbj!hgPcUywt`QlIM@vqc}ct4DxE3xAnrx$w?PLpR&d9=dcoUZihE_5!y zA@1_jTNiZd`IJx3ubDTpV_sZ#FP~V93)<%R{O3d+a>Aqb`SY9fFZdIrZy(v#5qr$O z+Z*?N=Xghz=Qqvi0I=Nu+;M>%-(3Ek^W^a^`p>VLrq0-rRyROhpq^orMh{58uxk_{ zXgqU2(J$B9&S-)ZF8G7`wT<dfa)Q9Xuk7(BzPs%Fow?NK9ddpOzKMm*Ps#ig4HRd7 zO6I2&w3Ia0bm=?fEwnc|S@+z4tak+#wnp<>8Q@fC?VLMmVP`aNp>MR++B%)<zS_UI z?RE3obiYaV+P9V(^dkOz*V#1RH?Z;jc}<KiF-X}tw@s~K&6h{fc+rS;kbZ85AIH(S zO;gProy*<utjKL>o5R4EA2E*q%%f<&h0rLTj%mRRV(*X4-E5*{jU<&lWgW5)T8o^8 zOahq%G6`f7$Rv<SAd^5QflLCK1TqO^638TwNg$IzCV@->nFKNkWD>|EkVznuKtcjc zAn-P%b~#};i-<R&Rurw2(NdEE@&^a-02lCC+!H-KkJW@s*lP!zXid>)MeB<yMZAEM z(bACt@&^a-02lB9C-Ca49*|ydPy6Q$(UCl~gHg1lXpCql(XOK1L}N4h$Yp@skv}+q z2e^O_IDr>>0Dk4@L4T!NUW7jJJf@VtEV@ker06|S?ybP=xD;jazVd!X^i$EXB6MPF z5qN<c_<<vMmKunQ?yN2vAv#QSpD4q7*_Xk?!ifzFu*Y8#fgd=6XDK>h*srDdTZw)l z%5eYq$zZy0J4CdD2wMQ2#dILV{vgGFN0edz@s+_pgx~3+YSE^mLOOttKs&L9=s?l` zL>cxUe;LdXj^7qli?9RW3(iTOkp6;pT8#D=6~%tN_11H{?Y5iSZ@>LAT1qlN{@@_I ziV-?+x`=+lND(-Lw*_>8aRh9{e?_U!TXDq|J=W))cb=O%b*j7NmRsCiciolIQj!7k z2M6$=9)eFk>~tL+z>lYIFiZsAW&_X#e8dMtsn7V_=RW7oJ@;I9!womM-~ayiPOnVy zev8v<K2A%X{W;ely|LAev`X8Bq?d1;k#@mwA$|Dahc2Z5{qKLy=)eE{uM6ov|M`y# zY4+^d&gg>=K5!vvFBccmzy9?v7t%lf`A=u`kAM8bh4lXW@4JxRd+$AG^zOUwx{%&^ z=N%W)+i$<^jNW?dEf><?|NeIu(%=5}Hy6@h|N2*F^q0T<#Tk)?a%ye6mp6ET3;2Lj zJ`8pJS<xOM>N$9WJ37Gl;W$xh+A(9sxXUlU+&%W#V?IBvlJ`f$&F~6wGF*~)7zQSL zWNxxH87F0H@(kr@ax-})<@Dy8Z#w9WH{S5{`s=Sd?d9X?&wu{2gZ}iVKY9A&AOGl} zS6_YA(<`sM;$D9FWlt}?^pb;KeDOt3fB3^69Q48qFL*-s(C>ctJNNwa&wKjqZ-48c z=bn4c({FzB8wY9MEl<xr`>cbWdFC1S^wUp!dg`gC9Q5RqPkMUdi6<QN_~VazLiUe7 z`lzQz9(lw;4?p~{=LJ2d-Vq0!z$+h?x_-83TM;$@-0}Ho51tnFNVnydTe{0GyUZaI z0(G6boUFf@4lF$#Ko1Nbj^G7uX?W_|OQNx&jYZ(joI#bSNBk95SixOz!3AFD40~+5 z+44*WmK{5Q4q#sh*a>h0zcgHR?Re1_L_<Z43H(^pBkn%??BlMx?mGWW+WD|;&vf8L zZ+n-ewg4TVT_b=S_@&{hYtuyAiPjb22Qr@DBkqrW^dsK};^$%a&CfIcF4KW!QwQ(| z@L#|$4Od-zQB*A&E@JM!N4$+T+Q?mU$tB*8r|#oxW;*ck@d>G;;0KOr`05(-L>q`w z@!xyzz1>YW-PC3K!9UZ1k59h<;J^<Y^WcvUIHC~#x88bd7yf1gG9CDM=m7mO@LL@C z)87aGd^&(%Xud({Bc}Bg=rbh84d68#JFqdHd}9c-Z#Is=F&s-sj^QN76c}5u@fsUf z;24fA*ceT6jDfL+eB%t^SOa4Yj5ma14vanI8+S;KJ<x}Pl4B4y4#BuWvGD=MUHXFm zUVH83v^#>Y|KMLp2hfWwd~^~(4;d#aqyyj&e&AS+{U;sc%LM%YLOMWR)SsXK{O8{1 z!0)*9(o6j~1mjT<<J2wM?EZ=?u5edgd8NDRs;k`9S6}UZ`qQ7fpZ)A-?wV_^@pSFA z*ZRK8_19nT$24!e@kZZ{(U$T2n{U3^(=UGU3#UD~J;5hLc_H-P=(gK#bA`y_+0mY1 z&m<4>g2)>lAozhd#$6%!rOyTbl!Y=;Hi&XkUdm1RkpuETE{xUu<R?Gz@<MJGUwpB< z=%S0<lqpmADwDhL!VBGxfBa+LpC^BU;a^Axz=SfCi~pW`?%56hLOOt*WPJ000}k;1 z=EfUu>^}eb&pYkV;x^xWb3YdKg)e+TThLdzt+v|AZN2r@evERv?Y46}?68B|X{Vjs z&O7hycG+bYKc}d@)!iO@?BRK*{n~fmef|6f&;Rn5zw8b?@IZIaK?k|7e)X&FYhU}C z(|+tuJAAo=4?fr(a>ya>&_fUPbl72sxx)`XydV(=vNWXUIXsW&k_UNx<ttzD`I7(s z`|t1hp??j3$ZGf9cX#l;>#n=H>gsA=o*j4G(QUu|_HNs4w{_cWvyCtJm%j8R_r))M z(TyHG+HJAL7G6G^Zn~-4WRp!Ca>HNWaKjDV1{-YPh7TX^=l9lKcU`y6I_r2Iz#n-R z8!I;a;jNtdPdaqp0{G|C0mC1;j2t=A&p}Wg%C*^MoB485UdnAcfIN^(r~}BYm=2JK z=>VAI(*x6mP#+BA@W}ln=HQNAh1ioP`d18l_(zw)9^IyVjK`z%U{Cp}3yjZFH>e}j z6|iUS2Kni`0<N;M(yhP#`fk{;VeYe^{jB@UXFlWgFT}r)4uC)SEiU}YH=hoK_@le% zaGDJ;9Y7Aq!*qZ;g1oQ;X*xg|sAtqS<~hM2v;|2$2yFuO*lYtjVPw~>o`;x+xMOP! zd-BE>!3TB~zQTHM*i()Wd&-I31N*S<Q#Y*cgMFd8zxLW|cf+4~qe62=_|AR7ANxz2 zmken-fWM6WM?UCoJ{y3}TRUJnK;6I&l%fO39NAlYkfsNrE?E13J`^J2g_wu7KCJWP ziyp!U@+pLUX!pTBwEJmwAM6X&{h>pLdOZXW<Xvpu5d6UpKFhKHq%(h`m<|~J$cJ_- zv;k@DfayTe7bv6y$QquIz1e~^JqX(d(*@dyd_)|>+v>X2ceC~66Snn+J?n31@00aD z#NO;a^*+t+BcIUjr?vak{k7Iw%iBD|zu4R{_=De)z#kq$J7D-DBib#q0cq_3K998n z<_m=WV44mfV`ObQfZfff2cb;>N7DzeO(Tm#JrC=8XzQ)chxXpEH($?eej4^+n@{;e zyPx#=tlh`wvv!}lzvh~2cEi8e`hmXUkF4qE6bhyThCgz`XGMoi2heSFJlP+}rvu5h z0AC6jn-1V(7t#Z>3Far5J{Z2?k$XnO4>7m;j-G+L)p_&rsq==t`Fe%0r@SHd=JOS@ z`}q7;_t#is4bLlhAn#&pNWdTbkX1SMzZCr81s$O8Py3Io@LAE}upKZRu>OGc35)3f zJ`}Pw9YE%V^dPhe<|m*Jp-vdihPB-%ej4T>?pEhRdvDm|=O_DlR__h_LjHa}yKi-W z_0?DR`iabuH*@`kbfB;JqvtmNL!O0#;ZHrGzhXLo4anyU6w(3f7g*oW`UZvcAhZeA zKA1jWm&|7faklHkgRGv1m?MV}cdPTEy|+Fdd|P{82>Y<jPwVT4cAs{iy07odc|8UP z!@rOYfIs-be>wHP9Q=_R?G|g2X$R7LfzTgJ(*f%jAWQlN$QHY5wg9=O=>ZtQGkRdU z06!48<|B(^>39ZYn45nW;-0MY@M(QK_%8+fu&-xrzV-E!cAvUGWXKS2pA7$E>j@VJ z{)}&y60H6sLv%OPfzTH)e=wg8Sib-nhJ6DYCn}@|VcP(9rVoav;Ts<9p5dK_c^dBU zk*xD!ACGdR*?g<_hCTK%#NNjFX!Aq65B96Bx~jKfA^wGQfbk#jqip5We`LY9b}7N| zCojgS%FzMq7a%+ON}&#zEhwZ1W)r{*T`+y1{u-HHggDzhOGEk)bL@@Pcf%b%(&~KJ z$D=%9d!G+`>?HQmut$D|z1jW2g9p1+R$0ZjQQ*ORC3Aq_pHBzCAN(lmM}<Fmp}W{G zbijOpWS<~u2W*}Inb{Z-vc!&-st4vHSo;v_gJGKQNL(Y*hnUmuq~T6GZ*@Mj_wa9i zzK!jcf_=U=-|GI#E3fR^un_-3I=~z`b5ec5pY-_m#e&s;>Jqx!TOF{zq0JQ_L+q#7 zf<k(bv<c=Xpbw!=7_MnYi_6jQPGWBLJ&C*3`Ow~5|K9p|;n=R({IK2|_F-So+I;Lj z*srwGO5N};_I^QM@dwM^;*SkwoT4{6V0}Ym74{F!78KKiux&71FrN_&!Lt|<&+sO# z+4m6hLbzL<H+yem`r(`oets#~BR|95>^|7DmK$G{!1|S9@0hSIhWTi4EXV$nj`Ym? z7YkPZv9GjQrRsq74bcH)Wqu)clRAVvi|K*+iQr?p0B#UCh6J{TZ+Jb4H_zdDA?D`S zhxI+gJ*@MT!^ZU()3-hzzFwhvZ`jk<3$f?DzCnWq`F@Sz&$~v2bO8KWi%>59)Me85 z27lU6crT;_$-W`7K}MlZV74IX7o@cd);5@*kkkjTEJlX4;ce}Dh<PF0;WJt1DUZ$P z&<8R<-+aBK%}>J~yKmT6R8)9hKE%I}4uC)FP{6UA`cFF2m$J6Y#v^Gz@mC7zK-f1# zCdvL`XbX~hkhBM3+hG1;s1Kn|fN4G=o)PIGo)=<HUdj4yxWlK_dHA<FkG;2XJ)6s? z{Jp^*yASruEw`Na<qZE~?;Elvvak5FhKcpQ#RBvH%tz7A;;-b>fn?thnP3l12SQtr zPY=R&A#58=7tCig{0z^0M~i1zlO8g>L(I`X^3R96)%i4gPhTkP<C(9QtoP>cQSS}= z<(FUH4IDVo+j6jA4QsJ?PQf4i%B}yj<-Nh5`Dof!Y*v~MFpf!?(E<90$O4&!?Llw# zAWav*%i0Mr4E4gWwWHm)qoqZ!An;DZJXzmE+^x>1*?Y=u{d?rm8|()R7~ruC@h_wU ztb=ClAvl&}|9gW!>k(Otf**yin$!XOS;|V8=^L01U<a)|Fk29|3Hj^+wl-`VsE?)# zhM8e#N5j^Rc0D{=TAmfwbK3S0bMx!-;f_s9+It(*rTjLgk6c1u&)WNBy$Ab#{rYvo zpZCuTy?YM+tUK*1{;caS7FZL{T4ekzcn@^|KbA65R{TQK0kZ|B1Nm$L^(m<bVcTH3 zVEO=7=!21AS?FkSIg;M+Hq67e9n6d2j!mOHl+Efq<pq1{0dh$8@rq%ehJPU)U{3|s z9G8nfzC8Ay_c@9M@MoU_{Ac<pp$;%^i4Ncsm=2gNFdaZf`Sc*o9$0??JuqFc{$r>Q z;1}wJVH+MTPKdSP9oF*@bM!H^^H$#tck}U*b>6V2KG?V(@}a(@wf9!<!9K*FcUp?Q zcWn5BV>$Mpboh^@;LpA!>^*^hjjv)lK$+0%PzS=kLDClF(*xui>Op7|Oc%h%^dZy< zFbs7AY>n)m9mDj=dLCkqp8`LHaHow+tMeiD$i}coX88H$>m{*I!@rOYpd-9*&=>si zA4<ia{Ydb!>8DTz%7Pt02Ph*t5c-8lTVP{`N#DTQh0s4p(*<iI(1%bb49BE?gxBr2 zrR7<Mx7G6y^HOm~zpc)v*?Z)Ij0}5Zho7H@eG-56qXGYXIspE>Yf>)$jFaO(@D5+G zz`JkkJ%C>g@07uGfU=nmq}hT{572>PdVq~JT>uBu1?xMQZAj{aVVm!0m>0sGd_x-_ z+WD})Cvgw!JoO-K>yZz#GVJ^J@9%BB+5GTGUycB_#r7j24(}O(V>$M}H~7Dy_Z?@> zoayn0U(*4~gdL!aW(!OQumwrq(ENgY?LyK=Na{hT3!y%s6NQMlA@Ljt{enW=u}8hd zopM^g-t0Z{Fnf=jkXa$@!}?F#ZtsHTvjdC~^aX#$@~Hpp@lh;*|3eQw<onvDuapHl zK-tU|m<}L=P!DXpD6|Ep3uX_}d;_xu#q_|iH65_?<S`9*!@f85KD71Vo>u1#d$ae& zuusFkkPd)9?-+t(IrYCc_`j}qogaMg!EX4&FJ&@YU^)=mf=~~vkASU2eh}D$JN3={ z0K?qsrePLhX*hEX?RwhpFfPBt=h(B&2AD3ui`juRTY%q({-W3Dd06L@_8$3Iohf!S z`%nGn-Ei>FrvuCp@_uPw@TdP+O8w{E_6Ht#pa=d|9@Bx)7Ua_dWCrfo`a+l+PKIBI zZL*Cw|1Nn<#^c<cW6!mG3h4qmkfsNegSLz^m1FNses(nc8QZb_0rKep`15XYx%e}d z5B}`eP%MD|j2SchxU2D+JchQw^dQs$>Ob-_%+02o+`+*xF^s?~#5C-`C4XBVFFYpW zgy;5L(-F%vv=Q)TwxL-2fK9-*QRY(G`lS3gPvT!l2Mm93EXV$n4*#JP{MpyyzWeSg zh`*I5=@(EhkWCuyR`-xO@-KvUh%3LXkKdbP@)^bS!F0j&pj2Hz4`}yICZ!%j{MoA% z{PXDmYXsR>pfC7iKT5^_-h1yY34h9JIzSswJrC=8vYv;SgGY#wVQXV};kX{Z!*ShW zzr(clyl_k~%ojee520-^U4Vbn2P<3BHduQ>yHHO1kNpq#s!h`Y@MjN>a`9(96#Bzn zJ;eh1=-zYBJ$}xt6kVpyBLn0V*70OLxB3^>=MWpi%&<+4@!Nb(DaSCaJ&&X15$22D znLd~<m_A^qD2M5T=>oPPjnEDJ!&2mC^`E)jv^|4DpO7_K>?Z<_<=Fq;;14g;r%x{l zfBYe<H{lWag?J<1t+(FF9d*=U?&zbT!`;`v4jti+IVPkdb$+Bf_E_jBPsbg1l-A1c z*<&8q=6S=T%?ENUG#6<4VY-1{m`<2J82?G%AuMOU-^ity4kYm}qyvisf9yvo^&dX& zzWeTi_|x7|*Ue_99ZjBA=fK;!f0ad3r%v|cQH)83Ydpf=whkaXhPq+DO-D>WuqUBD z7{8_yX=N+r8uBUR7lim@bCG*K9biosdkK|W|5?j{{a|mlVu7~km%sdFUi>K&b)pnI z9LAwOmy3T(%apD)UADHX(6QM1Ak&dhCrlqWhJ5$sH*#WZD9sim@h_wU;Lko%;8>3R zCmrc~gFod?@(uRrzR9mQ$9?zRTYZozJ?M%nF4Ek_BD(U*i#6BPolZF6_@e7Rlj}m$ z)`2G1f}$tIY)Eg)m=+g(O0xroKWjVbbAf+89bipfU+`xwPpSChf8KfLoxTo)_)`Y# zWGL6g^*hAQ)_bR|`KBD`az5gINa3@>Jovr1crWES$StV@N&E}x0Qj?q9Azt~{*#XM zrPP1$zvGTOy5YaeE<0$vV&}Ya&xc2EuG6-q5q+L=DeZZ^;c0Qk#UBdmQ;2_|{X}Vx z!JqvD`+`5|*_X9gpx<%(?YDQszp=62x81+}?ZfW;^Bes<G;`4z^-czii<u4>{=C}- z{)KdaHJR)kSuXzALDI7qZ?V7_G<$4fv*4BS-K(#@)Z=gd+dJ>PqW4LrYA?n^{d)}I zyVu$8c+Y_}IZ$7aCvpw(XU?sV4jBI6SdRTS{MkpKSO9<aPc{7M<6eLL72WVRJ>dBG z<M+8U&Y0leXSTgJvSYjlNtzsxXA*zr+zaUdYckn4wp{%2cld@3?~xY^tU+L}S;L<) z+;r2`dGR-0c<;Se<;P#F{Woj6_F=O9n6l%dy{V9A8vccJ0Q|uZ9LuTyq~rS`v^B*7 z__Nm}V`I$QvY+0?7hg~mf762xKm42458UM@OgPo2wLST=W4t#ZazL(T|EZJVe)DN| zfHk?`S1$haQAp2NbFsi0ME05lfBLhwx9UkJouD<uQ?*|0k0tBE8*e<Xd4~(To?*}W zv>%ac68}Ov0RBJx;SYVEwVe77{-kHFsaW7W1ooN)e|#9*Q#(9<|N9g5&BEy#PyTyJ zy71CVPo+L5eCDU=H*yW}2Vd~drvu#o!4H1WC;UmzTBBlt_mJ3YjPY;w(LMU;qw~@U zCyduv-KF}L=?ew*;N_Q}&ijl)&;O*}W6$y={)Kb^z32=6jC(dWH~Y25rQpwAQ{aEx zamSTJjg4n(?ZPv8b>Nj(o-OG)rRMiZh-diIC&Rx3|9m=tZwP+iSdRVg4gS1~&R#K$ zSB)P(J}*s}P$xg(TJipeyttcB`0A^(@;;|f9-riUhCgdE@yqeeSmzHh-^-X^*d9!p zG^tPclb&_N#RB_KuvZB9<Ex&0^2yz(rR7q6ujYZGm>c$OZEtBj;l^&yNIvt^c8**P zf8NOrznNv<&axwVK>a`e{PWAkpSe=fmx@2{3W7iTY)+Uk!JTtXqt*o7CLMjPWZd6+ z>m~US*SNFJYVgnCIT^(=VBhK_{^)>_Vb77dU;2dL2ae^~f5V@3q{RaJ5b>@s_%jA{ z#u;b0`|rQAWZY-XdRTK!7x;9f&8Vjgz$3)pzM;p_bij^=|9R(~S2q64bCbRl{Mm<) zcSV`!XHDZ-XPu?@0e)E!{|`QRLu-a^m7Qqv@kx_Wei<NF!=F8QSeFZhdSJit1(+K+ z_uO;+JGtf5fAA+g>qv_Q@aJ6t@MoNoZz}xy*V9w+fBEHSwJ-g(?t9<+UPdL#fNvIs z<G&&PrU#)e82;b?{`dQYKk0c^vA`a*ylZawvyN@%%zL`<Z*PCwpI>y*g|4ZoDWhJ> z0C^_yw{Nf8G1LR<EcL%H__M~TH~90eIcs*|6Phw*k{{#2#^Z-%RGtj@Zk5S2wEw)9 zAAVog^nfGyvo`3QbI$Q=)ylE|;7@vdiDH585b&;0h(Bxm8yXt?7&7C?8TDQU*h=J> z#GgGG4gc_HI)Kjx{-g)Ta`7j9Dfsgp65cfp@rP&L@n8*6M&-!>`5E>ct^R{Q`?45? zI>2x6XI*GxV`JI)Gv7pd#uADJ@aJ7I-hT-B<u~(>tRv5;cQQb3Nm=H@-}JzajM;$y z#EBFAd~7-O-|%N0QL(_@pS&w}<dH}EZ`9Z~mF#%-*=M_7{pwd4l_&$`WwHy8w5J62 zWM&L7B*UH~<H5Wa(pUURUkd*0{mHvR87)~Eu*NbU{-G`y{`9e_$K}?4@MoT>SYVAP z?ZhXYs0)jekZmbs^L(`HwEYlc03n6=GiT2l@Wp{Y^9Wg3Bmw*8WhqDObg5*xmU0Yn zPy5Z74ew+W!GAZ|g$+b2rr8JVMtyy~-)Ck~>9b#<1WM5Xi&Lr|gz-wz1&d>PVEupA z<bhuS`(G{Ghl>WK;m>|{#~gEv|Hecq?*N2y`854De0y^YG4Abe!#m%Rbpf;&jLCo> zIHuvNYuky|6)h)vT+}1p;fEjY*Y&cdAPdDM&>I~{#_g>hB;%tG*7wKuvmO)t(s0$a z7erqW4HfklO%nBpi|weZtMhwJma-1GxP(6WF_O5Jd!EF%*g5!v5&jzMF;6?~v_iK3 zI^n&sXt1cCXcJKn{MoY)9b)W;_Jp=23%!#-x%iio&U6CbpLfC;t7R=7`#yjh_@&{h zYX^yjiB=F128tdN^@z_NMzkZW@8><QQr-vYorFF;u}i_UH*vt9Ie+RsZ9ePp_~tu! zfm<4$y7oKKrlQqF;7-5>>?ul3!~17E6Fb0IFKdfRc`xwOf@~5qtCt*;ewz8|9K$|) zIDVHL&$oFUJ2KacPY&*kNAUhNV{p`aa00J<SnB$C5p|z_AGljU7w#6Nrp1pOH*TD7 zS6J(b9`N25^UT;C#wI>(#5}7JeeRHuiBWP~EF42hj{n$Lj~(&7jcD5;WDe%odcM2! zGp)U&y$7EH{yw-qA{r^8-M6~0pFW@q_=B@WsX9P=f=@_3=-HWPp6M8?&gi3&!FRv= zT^ADTB*6hZz@<QY51#)MZ6#Vmw7e*+`#SZ3zQER^ygHzJUN_jgk@r2wH>0H^1LO}5 zhDm`V*yHo9C1Sh>ob!c}bwCd&CGRZG(v=g~A1EpXd(#Qifxl!Jf2?)<ZQ-|{2w%Tg zy;qcO0Uf{}_=za1!yi8xTr1od*I89Wdtb=r>vn3uM;IW&C%93R>A|uugIk5u?xG<g z>OA<R`Fgrsav(kZ1;z{;M86XKRg~$&(wD*Cgu}g}i6X}Isqf$pUVX(~kLVV79(IH| zqY4q@hm0evl+jX?0rCe2@BkO^S=_kmky*$jkVznuKqi4q0+|Fd31kw;B#=oUlRzec zOahq%G6`f7$Rv<SAd^5QflLCK1TqO^638TwNnlx*z{h@#{+pqM2RPRlo=0wBx6^3n z1>MhwcXU4=%)-|oRJ<9S=;wf$-Ou|a&l|hnkCNw!+u3O*flLCK1U@wqXiStec|NoI z{T}x9&F=RHB<*$5o+s^nvOP$)7p_|dYEM4lfd!(YMPC>7iz@XuiW)cahwM)#flLDV zCBT|T-lN@S86(z!@~%g|_1>%n|Ej1}^q#1F8KZZ^&ot4|BHmj_u4Qb}wU5KPW15}| zL~DvHd_zCxi~P5e*;|8etn-~+i0^eKiElU>@jbpIh5PFAy{9Dc4WN+trc07+Z)W11 zc;bm}#E20l-%jxg&#Wz7S@gQd??Y<)!tw4i?>XE1%)GnId&<0{%=ZX*PZ{Eyh3rwl zJIj1ijy>wwr;>Mud2g0?WqB`_=ko3=@44D{4cW_*{mj_cg!f)~@0k54`0gC<!1CTZ zd(g8FIqCS#cf8?M^as)BMPK8b?<f+Vz&qC=uY5a$_uARxz<6aZHF$+j-t~o7-sd$w zc{dk6?OW_=e6k-0dGehMcw=uK-k)aQOy1vp^2sOlP29)bqmMr7e*NoT`}ceAyz@@~ z{dag4ohCY;-#hDj!1lhmy(eyEU@rhGgUK6NQwEbYWe8;r|HzDYiYWv8Mp_vP$(b@F z`G4%O$D9%Og7?s;iuZHjpYOvED1*KK9=;=QdSvgzC(CI2+}pP<D6i=l*imlCFf<%Z z?~sLI8tNc&0U!7Wizl9V!fm<bmZn3O8UMTQzPsn&$^akK$)oknJL=9Ur<~%yS;M=z z?7#J$?|jEi)IN&rrF^cwr$F7Ko>6bDE>pkx%{A^(ABjsE_Hg4F?ET3zzxAzexl>O) z)tz+GN$#89{HFg#8s7)F@4owd{egeeC%(mk%tfjEQwC(m9^-4Qv4-1l!wvl&{+n;U zx!*UKZ$MIy(7D}q+s*B<#~yC)z4!Kelkz<pzVl$jIp6HvXP<ricb$<F`_=Ba<Bt9t z<b1ybdGgNcMjLJ9Dl01;-!@-st+l+Kvv(+U4B1mBkbfHgd<QWM$e-^(Qm^^`K*;-c z+imA|+G!`Z>#n;x_~ARc?57H!@O|Kc2X+zXlwrU9_VZ;xPsyvgy4vlq!w&vC%9LUB z=+V9m>~)Ntqzo&qw36TdnmUH;*^7Z=8vn>K4Aj{}4mrfFz4qE(F34w#Ew<>Azm)+# z3<Jsm4#?W}hvhfd;G42iW^haL4o~dU4c6=tvd%i|xIu#k`Td)z5Acp{f`7i}nbe;& z{(1i#{XrhcC0Pc(L607R1v&w5$QC}0IOo~ir>y7=W#{|VCU<xTW9$n0!~WPqhYt1M zM@N6)AG<?40RQlj<e$95fc*Jp<>0}Cy*!d-;N5oer!G(q<Oy$-1^I@=HSSYZ_~sjW zd`AVnPx6l5uvY``Z?n%cd#hlVkUe$?{`sC#8voc%3-Hgk!B$>*WnTxtG%N%8qO)N+ z;El2%-;lV@zSG7x>Ci>=Ae6iDzUG>1dbz<PehfAi+0)kL;~#AC7c5YJsgLL&SfY=V zVFP{h0-VuRaHJf_k#ex7J#qyXBhDf2hkPSLbP|0ZK76>>8RQP{d{c+I3;$E5Oz~|# z?K3_F_J=Yj<q!X~R~F!(dN*Le0Jqv|t9g4y8ITeAfd%%Ca=;6+q%7DeWNXAZ#C^(3 z-tdhKkOeZq#$hLncQCK0sPH`EKhowQd;B8!C(mO1(|%&tiMPrstN1eTd}Ks^>#et* zuWOV8Uf_x6!XHGLAUo$i<wf4`jSP?lG67%g1a%F$gE?{|Z}_L(M)vp}`S_>4;Uid} z&8JTD48D~>8Nii%Xj_mM<$wodh~0oM_)8LH<Q{Q|i+u_C249{J@5tSFH~!%TUypsV z;2&9VPt?`^Vk7W-ERY7BBHqA(1HDXmei93KfhXi?Wq@BJ_%_~6<{|&s8J>yEms@T* z&pUP}$Dfx!z5sqTem4ArW0HStU&ue0feG<=UjP36eL2Vr9YTNBU3Zv{@Lt))JF-WQ zjF6S-4tkc<AIbujV34-Y3HpOBqdWMo`S`~^<6Byw&VY%@0Zfq<GKL5Ay1IHNwN2G( zvuL+=RejlAc7FS=dTe!<dTsUB>I7xtIpD-IA#@QPMOKzC{A0`M-_YNIf8>yqf0BRv zTQITbkPm!dL&$r#-FA^(drkeEcSUb`>gbrQeLb%cubXw*Qfw-O{e-Z!*ru>dJQJdf zlo@@rG8q5p4t)vur`$>YX&dqBEzoAr2CcZ_3X=84%6D{^ZO5J?=hIF*(Vc$!siITd zx4(U=_8pp_Zw(x#HhCN0j?tDGSsO-sO*>YIh>N`75&r30(Ep)7mydsVrN3o?{?%ri zZSIab>R{>KbK>=6Z;!@|+1BGi-QIRv{FrS$!6(0W*kMN>58D+I{!d8Zy|mx>Otb^^ zACN1$L!S=*u?I={lRxFOfX@U!XP<p$?$U?q2R`R+x#c?bFOK&<^ZxrE;C*BK<Hb$* z;NXD&hFsAd`v3X(CoXNS1^Tk|e-1vlM*E*#ApD+F`@lErJ7f>uc2{40neX4=V=pPf z2WL+->M#5=Hb6gyx}KCj{uOr00&)3f@sUR!B|mhWa5zit_fxt(Thytx<Y~Xh6W^~s z{`ljU2qC{|)24a5jy&lL!~bx#HA()dPqY&j;Gge)G&G#)zxmkK#`ogd)W82gdibKd z;)<X6@A%SZWskBYLB}3@tl#$#p3n{Sh(09tDUE;HTnmilp#OZ6o-k+5Tkhe9?-Spb z3ybf{-kjn4-}J#3H}Sno#s=8Ki|;29sGImV`S{1*rOma#coc0^P0d#{w)B+h(M8%L z>}-u2O!VJxV;o^gk&PSDhBIzKzy{$T!$0j@QvON)kw0w=@y3roL3Q{N^(8L$dl|By z;gY1OQ>VHkjyS^Sjr}Cx8_>VX$3JZnK7$4N{PcYor-9c89(cgbm@(rcBl1L#=x^DW z8oa?jK2sq7W`5JQ<1^$7;aJ?__>C@yWMh6DLq81OEkAgpJOTfVAD#mLTw{!4Sqt!Q z{aVVw{@eK4Ir%s0xVDJtYTpiFW0%!H|B>+|coqFyw1tRpg~<0EX!H2y=e_sdyTs|9 zd+yP<#P4y_r%&&q@Ox5s-+j0Lw$xpB-R0{dK4#E2J6k;4To`*F&ZG<w{Vn>4%L>u& z4*O){@lg?TU}0cx?;O!TMTXI`c4SW)<i46HUl^qu6GY4lEK9^(%Z8#XWD>|Ekdr{% zR>|P_(DUfmVQH3lCh;|6Z^uT?v(U8;xDi>Hd<Mi00lP8hldD~4omQo&TGY?~(mJgn zI?2MaDgk_r14PFxVcJ*EC$BK<u9Fu;CHn>V9fgQ-zBE!EEUA24w5^DMulNDupL`P> zzYV_(Vok#xciiD_zx{T{w+wH+^;Xx~+Un_+TW;}V5PW9>-<j_iKsViVle_W88{G{z z+~BUi{(5)ab=Uc^7RFn+PX8IdNqN2^8X>xzbLMfvU~5$9pVG%>oPco*`f`jxG7iT4 zGvgohNo@@Z<2j6}F|NtDKI7xeQ7}ixTo?EG_G!-FJX85UU~{CFCw$m%`aFzJSpM|o z>5ti(7+Vhm53GlQk8q8Nt<QiL`az7-K+JI{Z~961GoNDtU!HLb<aFM7=lS(PtTCd` z%9tDD4t%>CtRQ}KjeEo)E^CSyL*RSBJnQt+PxoUB@IXK9kw+e}u@>ez?hoha@za?H z7_PA-#wi$AW^9&mY{oOgH3jr3Yz`Y4GA_?}AAMHFof%K2|F`O@tNJ-7uwcHF{F!G^ z-adbmKQf?yLf*_}FrLl$17o;5YtDjr%$JjAIFHW!y3PI5mw;dRhJVIX=`S$HNcqt- z*6rl_s;T*d4Lpz@9vDMl9FS+j2V=xGw#(Qr*N_iohhNf=mhv;E!u%OyCiV@0Wd1zE z0(~ax!#eA%<9TPShVgsK10R%)d_v+H`BFymAr0f?<jox3iYu<@uTdw!fc$g%=gUud z=noU<n=u!}oQlbTa_~$rWgY=u$P3~(<%LJe%p3^gsK^(&GjBp&;~C8JfC2a?^S8b@ z_J;W)=G2%IWDbdEfd^QIbDHpEb5J&4LtONiwCJ7n>EX%hBKad<(?9UD{IPMm?)#eX z0CwO3zc#lDALM7mIb)Z|+wx|NpK{oI3;AQ0;DP*!XZcfa7=s{SU&$XLJ$aKa`41bm zp3i5*h<Kh0c_(FnoD6sPw`Y+*>&38t$^6k>#(W5jE0d;w{{bFH>ftuqY$cm{fyNIm zaaUb6Rco3~@p_Qd0d$Xc1fGoGg?0+Qn5V%ul0UdAAFqGZE6blYW8}yYT4S)U*LUWZ zcHD6X&21c~^;)%BM>SsKG2{IF5$Pc8Lp)E@y<TvQ`;-BU$e;0V^q+cR`IFw}NUyx| zDvcqZB76V7#su$@?L1AkW<PIV#*W?HANSZ}Pe0zmm`fU&ZL%ZwiaLh;X(uQ@b;I(9 zPa9jKJw524gS58nJom;MF9?x&;^Pi?=%I)Du}{YC83PT8Yx#(Hd|T>ht#_ksVjPS7 z(JRXz+h%iQ*I$2w@U2sv`_<0Asr8eusV)C$*>eImk8r{XC-^mul#@1y`f2%NzbyYt zF1b`PKUr<*pX5(mr#5V&<|_Wrw}-Te<q+RH0RzT<3ADr5H_M+n5}RZDnZC`k;f5o$ zmaox|ZPTveFO)-<U3QsoqgiK&?Y4OU);uvUp3DD1Y`4v^!Xs-Eu+?v9ohLfm8=`(E z$<_#%j?)HXmz6*M$4%%W{?SJj@LO{J*Y}kFSkXf2AZ-t2$6xCUv8Kk>?@}(>d<g#! ze<?T5^uF@lSVTBUG#j441=%bKqAgKA&>NyXMPXok?c1UyJ+?+!KO1J8{a$(!2<zNT zy|3IDG1{<X0?(eQJi<H~r(js3Qq(UuPEkEjCyPG})gzm=mg(k@<m23&B(2rD*+^;5 z6RoZ|SFskGb?mG)pbeinbEbRn!3W*__uudPt@K^!x8g(6U!~v5nrqeT3+0czf{(>q zzJ1RNUw}3d`-*Rde~$gJ^{Cho)@Q4&ctXC-OZdpl8{+4%4wiMCtWltSrG2K|rhkGh z!{1<zm1n7~eN4Xdi^!ez;MiMyW_);jKkGx_2jElTE3-C^whkWDRz7O!S+9;?M;v@^ z;@dhP_`*NNx5e+I-J?G#{vVZJ_9Fa$;~U@bHi-5g9}M4;G&~Qx$TjmD`F0iSvq&#r z^F@5*BaS%Ir^oj_>Zn8YEvth(ALjQ_ZhTepCq3;L>E)-t*w)tW&N-)1Ya))8-?X>n zcBs~YjPt$`J~*;qZ4|$G9`XYd*<_!dbpV%Newo$`Kji7~!x#BB_%|W3#+h*m@|P`t zR6gK~q`%;TAL{xwTE9ER&%>sz5kPLp>6&Y<@$Zk2Ugdg~_7mO1e|rA;-+9@-@WSuC z&Y(9&w72LczCPm<>W4fbeV&Ftfd6NDhwdfG-tXW#?LYiUmY1pyRElm=8!`*hGfN_+ Rxk|)bW}kus^)dr#{~y4WF82Tc delta 147 zcmex%pY@qaGy?-80}F$Kf&c>uykKHra0Ai;0ua6iBLjmTGXqc_B+J0Cf`fq}j0GeQ z;b*WiF#O|TV9)?^6@b_Qh(YFoK*MCiK*`NDJm;7g4@?eZlAK(_<2895{}v$ypriv3 VGco{81A+#Yi66u^8_7T61pshs7AgP$ From 5299e2afd5b013cf7905778d4e3609fe45d768a4 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Tue, 24 Feb 2004 13:27:03 +0000 Subject: [PATCH 0160/1463] cleanup svn path=/trunk/; revision=8350 --- reactos/subsys/win32k/eng/bitblt.c | 21 ++-- reactos/subsys/win32k/eng/copybits.c | 10 +- reactos/subsys/win32k/eng/gradient.c | 11 ++- reactos/subsys/win32k/eng/lineto.c | 7 +- reactos/subsys/win32k/eng/mouse.c | 22 ++--- reactos/subsys/win32k/eng/paint.c | 7 +- reactos/subsys/win32k/eng/transblt.c | 7 +- reactos/subsys/win32k/include/class.h | 6 ++ reactos/subsys/win32k/include/cursoricon.h | 6 ++ reactos/subsys/win32k/include/eng.h | 6 ++ reactos/subsys/win32k/include/hook.h | 6 ++ reactos/subsys/win32k/include/hotkey.h | 6 ++ reactos/subsys/win32k/include/menu.h | 16 ++- reactos/subsys/win32k/include/msgqueue.h | 16 +++ reactos/subsys/win32k/include/object.h | 6 ++ reactos/subsys/win32k/include/painting.h | 6 ++ reactos/subsys/win32k/include/prop.h | 6 ++ reactos/subsys/win32k/include/text.h | 18 ++++ reactos/subsys/win32k/include/window.h | 10 +- reactos/subsys/win32k/include/winpos.h | 4 +- reactos/subsys/win32k/misc/object.c | 42 ++------ reactos/subsys/win32k/ntuser/class.c | 12 +-- reactos/subsys/win32k/ntuser/focus.c | 23 ++--- reactos/subsys/win32k/ntuser/hook.c | 38 +++---- reactos/subsys/win32k/ntuser/hotkey.c | 30 +++--- reactos/subsys/win32k/ntuser/keyboard.c | 32 +++--- reactos/subsys/win32k/ntuser/menu.c | 80 +++++++-------- reactos/subsys/win32k/ntuser/message.c | 6 +- reactos/subsys/win32k/ntuser/msgqueue.c | 109 +++++++++++---------- reactos/subsys/win32k/ntuser/painting.c | 30 +++--- reactos/subsys/win32k/ntuser/prop.c | 26 ++--- reactos/subsys/win32k/ntuser/timer.c | 44 +++++---- reactos/subsys/win32k/ntuser/window.c | 30 +++--- reactos/subsys/win32k/ntuser/winpos.c | 16 +-- reactos/subsys/win32k/objects/color.c | 7 +- reactos/subsys/win32k/objects/cursoricon.c | 28 +++--- reactos/subsys/win32k/objects/text.c | 85 ++++++++-------- 37 files changed, 465 insertions(+), 370 deletions(-) diff --git a/reactos/subsys/win32k/eng/bitblt.c b/reactos/subsys/win32k/eng/bitblt.c index 5f35497a6ff..edd4835eec4 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.41 2004/02/06 20:36:31 gvg Exp $ +/* $Id: bitblt.c,v 1.42 2004/02/24 13:27:02 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -40,6 +40,7 @@ #include <include/object.h> #include <include/dib.h> #include <include/surface.h> +#include <include/eng.h> #include <include/inteng.h> #define NDEBUG @@ -519,11 +520,11 @@ IntEngBitBlt(SURFOBJ *DestObj, /* Call the driver's DrvBitBlt if available */ if (NULL != DestGDI->BitBlt) { - ExAcquireFastMutex(DestGDI->DriverLock); + IntLockGDIDriver(DestGDI); ret = DestGDI->BitBlt(DestObj, SourceObj, Mask, ClipRegion, ColorTranslation, &OutputRect, &InputPoint, MaskOrigin, Brush, BrushOrigin, Rop4); - ExReleaseFastMutex(DestGDI->DriverLock); + IntUnLockGDIDriver(DestGDI); } if (! ret) @@ -837,10 +838,10 @@ IntEngStretchBlt(SURFOBJ *DestObj, /* 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 ! - ExAcquireFastMutex(DestGDI->DriverLock); + IntLockGDIDriver(DestGDI); ret = DestGDI->StretchBlt(DestObj, SourceObj, Mask, ClipRegion, ColorTranslation, &ca, BrushOrigin, &OutputRect, &InputRect, NULL, Mode); - ExReleaseFastMutex(DestGDI->DriverLock); + IntUnLockGDIDriver(DestGDI); } if (! ret) @@ -977,10 +978,10 @@ EngMaskBitBlt(SURFOBJ *DestObj, } DestGDI = (SURFGDI*)AccessInternalObjectFromUserObject(DestObj); - ExAcquireFastMutex(DestGDI->DriverLock); + IntLockGDIDriver(DestGDI); if (! IntEngEnter(&EnterLeaveSource, NULL, &InputRect, TRUE, &Translate, &InputObj)) { - ExReleaseFastMutex(DestGDI->DriverLock); + IntUnLockGDIDriver(DestGDI); return FALSE; } @@ -1036,14 +1037,14 @@ EngMaskBitBlt(SURFOBJ *DestObj, if (OutputRect.right <= OutputRect.left || OutputRect.bottom <= OutputRect.top) { IntEngLeave(&EnterLeaveSource); - ExReleaseFastMutex(DestGDI->DriverLock); + IntUnLockGDIDriver(DestGDI); return TRUE; } if (! IntEngEnter(&EnterLeaveDest, DestObj, &OutputRect, FALSE, &Translate, &OutputObj)) { IntEngLeave(&EnterLeaveSource); - ExReleaseFastMutex(DestGDI->DriverLock); + IntUnLockGDIDriver(DestGDI); return FALSE; } @@ -1138,7 +1139,7 @@ EngMaskBitBlt(SURFOBJ *DestObj, IntEngLeave(&EnterLeaveDest); IntEngLeave(&EnterLeaveSource); - ExReleaseFastMutex(DestGDI->DriverLock); + IntUnLockGDIDriver(DestGDI); /* Dummy BitBlt to let driver know that something has changed. 0x00AA0029 is the Rop for D (no-op) */ diff --git a/reactos/subsys/win32k/eng/copybits.c b/reactos/subsys/win32k/eng/copybits.c index 71cfbb322ce..5ac9cf6d079 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.20 2004/01/16 19:32:00 gvg Exp $ +/* $Id: copybits.c,v 1.21 2004/02/24 13:27:02 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -75,9 +75,9 @@ EngCopyBits(SURFOBJ *Dest, if (DestGDI->CopyBits!=NULL) { - ExAcquireFastMutex(DestGDI->DriverLock); + IntLockGDIDriver(DestGDI); ret = DestGDI->CopyBits(Dest, Source, Clip, ColorTranslation, DestRect, SourcePoint); - ExReleaseFastMutex(DestGDI->DriverLock); + IntUnLockGDIDriver(DestGDI); MouseSafetyOnDrawEnd(Source, SourceGDI); MouseSafetyOnDrawEnd(Dest, DestGDI); @@ -93,9 +93,9 @@ EngCopyBits(SURFOBJ *Dest, if (SourceGDI->CopyBits!=NULL) { - ExAcquireFastMutex(DestGDI->DriverLock); + IntLockGDIDriver(DestGDI); ret = SourceGDI->CopyBits(Dest, Source, Clip, ColorTranslation, DestRect, SourcePoint); - ExReleaseFastMutex(DestGDI->DriverLock); + IntUnLockGDIDriver(DestGDI); MouseSafetyOnDrawEnd(Source, SourceGDI); MouseSafetyOnDrawEnd(Dest, DestGDI); diff --git a/reactos/subsys/win32k/eng/gradient.c b/reactos/subsys/win32k/eng/gradient.c index 1891d4247cf..8db04065306 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.4 2004/02/09 22:16:50 weiden Exp $ +/* $Id: gradient.c,v 1.5 2004/02/24 13:27:02 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -29,6 +29,7 @@ #include <ddk/winddi.h> #include <ddk/ntddmou.h> +#include <include/eng.h> #include <include/object.h> #include <include/paint.h> #include <include/surface.h> @@ -549,10 +550,10 @@ IntEngGradientFill( pco->rclBounds.right, pco->rclBounds.bottom); if((psoDest->iType != STYPE_BITMAP) && SurfGDI->GradientFill) { - ExAcquireFastMutex(SurfGDI->DriverLock); + IntLockGDIDriver(SurfGDI); Ret = SurfGDI->GradientFill(psoDest, pco, pxlo, pVertex, nVertex, pMesh, nMesh, prclExtents, pptlDitherOrg, ulMode); - ExReleaseFastMutex(SurfGDI->DriverLock); + IntUnLockGDIDriver(SurfGDI); MouseSafetyOnDrawEnd(psoDest, SurfGDI); return Ret; } @@ -564,10 +565,10 @@ IntEngGradientFill( 0x00AA0029 is the Rop for D (no-op) */ if(SurfGDI->BitBlt) { - ExAcquireFastMutex(SurfGDI->DriverLock); + IntLockGDIDriver(SurfGDI); SurfGDI->BitBlt(psoDest, NULL, NULL, pco, pxlo, prclExtents, pptlDitherOrg, NULL, NULL, NULL, 0x00AA0029); - ExReleaseFastMutex(SurfGDI->DriverLock); + IntUnLockGDIDriver(SurfGDI); MouseSafetyOnDrawEnd(psoDest, SurfGDI); return TRUE; } diff --git a/reactos/subsys/win32k/eng/lineto.c b/reactos/subsys/win32k/eng/lineto.c index ac90ea8f745..b99d5cd1737 100644 --- a/reactos/subsys/win32k/eng/lineto.c +++ b/reactos/subsys/win32k/eng/lineto.c @@ -16,12 +16,13 @@ * 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.29 2004/01/16 19:32:00 gvg Exp $ + * $Id: lineto.c,v 1.30 2004/02/24 13:27:02 weiden Exp $ */ #include <ddk/winddi.h> #include <ddk/ntddmou.h> #include <include/inteng.h> +#include <include/eng.h> #include <include/dib.h> #include "clip.h" #include "objects.h" @@ -521,9 +522,9 @@ IntEngLineTo(SURFOBJ *DestSurf, if (NULL != SurfGDI->LineTo) { /* Call the driver's DrvLineTo */ - ExAcquireFastMutex(SurfGDI->DriverLock); + IntLockGDIDriver(SurfGDI); ret = SurfGDI->LineTo(DestSurf, Clip, Brush, x1, y1, x2, y2, /*RectBounds*/&b, mix); - ExReleaseFastMutex(SurfGDI->DriverLock); + IntUnLockGDIDriver(SurfGDI); } #if 0 diff --git a/reactos/subsys/win32k/eng/mouse.c b/reactos/subsys/win32k/eng/mouse.c index 65e94d18fde..16c09ed385d 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.61 2004/02/19 21:12:09 weiden Exp $ +/* $Id: mouse.c,v 1.62 2004/02/24 13:27:02 weiden Exp $ * * PROJECT: ReactOS kernel * PURPOSE: Mouse @@ -154,9 +154,9 @@ MouseSafetyOnDrawStart(PSURFOBJ SurfObj, PSURFGDI SurfGDI, LONG HazardX1, return FALSE; } CurInfo->SafetySwitch = TRUE; - ExAcquireFastMutex(SurfGDI->DriverLock); + IntLockGDIDriver(SurfGDI); SurfGDI->MovePointer(SurfObj, -1, -1, NULL); - ExReleaseFastMutex(SurfGDI->DriverLock); + IntUnLockGDIDriver(SurfGDI); ExReleaseFastMutex(&CurInfo->CursorMutex); } @@ -224,9 +224,9 @@ MouseSafetyOnDrawEnd(PSURFOBJ SurfObj, PSURFGDI SurfGDI) ObDereferenceObject(InputWindowStation); return FALSE; } - ExAcquireFastMutex(SurfGDI->DriverLock); + IntLockGDIDriver(SurfGDI); SurfGDI->MovePointer(SurfObj, CurInfo->x, CurInfo->y, &PointerRect); - ExReleaseFastMutex(SurfGDI->DriverLock); + IntUnLockGDIDriver(SurfGDI); SetPointerRect(CurInfo, &PointerRect); CurInfo->SafetySwitch = FALSE; } @@ -280,9 +280,9 @@ MouseMoveCursor(LONG X, LONG Y) if(CurInfo->Enabled) { ExAcquireFastMutex(&CurInfo->CursorMutex); - ExAcquireFastMutex(SurfGDI->DriverLock); + IntLockGDIDriver(SurfGDI); SurfGDI->MovePointer(SurfObj, CurInfo->x, CurInfo->y, &PointerRect); - ExReleaseFastMutex(SurfGDI->DriverLock); + IntUnLockGDIDriver(SurfGDI); SetPointerRect(CurInfo, &PointerRect); ExReleaseFastMutex(&CurInfo->CursorMutex); } @@ -441,9 +441,9 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount) ((mouse_ox != CurInfo->x) || (mouse_oy != CurInfo->y))) { ExAcquireFastMutex(&CurInfo->CursorMutex); - ExAcquireFastMutex(SurfGDI->DriverLock); + IntLockGDIDriver(SurfGDI); SurfGDI->MovePointer(SurfObj, CurInfo->x, CurInfo->y, &PointerRect); - ExReleaseFastMutex(SurfGDI->DriverLock); + IntUnLockGDIDriver(SurfGDI); SetPointerRect(CurInfo, &PointerRect); ExReleaseFastMutex(&CurInfo->CursorMutex); mouse_cx = 0; @@ -471,9 +471,9 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount) ((mouse_ox != CurInfo->x) || (mouse_oy != CurInfo->y))) { ExAcquireFastMutex(&CurInfo->CursorMutex); - ExAcquireFastMutex(SurfGDI->DriverLock); + IntLockGDIDriver(SurfGDI); SurfGDI->MovePointer(SurfObj, CurInfo->x, CurInfo->y, &PointerRect); - ExReleaseFastMutex(SurfGDI->DriverLock); + IntUnLockGDIDriver(SurfGDI); SetPointerRect(CurInfo, &PointerRect); ExReleaseFastMutex(&CurInfo->CursorMutex); } diff --git a/reactos/subsys/win32k/eng/paint.c b/reactos/subsys/win32k/eng/paint.c index e4ddd279a73..fcf7b45c5f5 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.17 2004/01/16 19:32:00 gvg Exp $ +/* $Id: paint.c,v 1.18 2004/02/24 13:27:02 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -32,6 +32,7 @@ #include <include/object.h> #include <include/paint.h> #include <include/surface.h> +#include <include/eng.h> #include "objects.h" #include <include/mouse.h> @@ -141,9 +142,9 @@ IntEngPaint(IN SURFOBJ *Surface, ClipRegion->rclBounds.top, ClipRegion->rclBounds.right, ClipRegion->rclBounds.bottom); - ExAcquireFastMutex(SurfGDI->DriverLock); + IntLockGDIDriver(SurfGDI); ret = SurfGDI->Paint(Surface, ClipRegion, Brush, BrushOrigin, Mix); - ExReleaseFastMutex(SurfGDI->DriverLock); + IntUnLockGDIDriver(SurfGDI); MouseSafetyOnDrawEnd(Surface, SurfGDI); return ret; } diff --git a/reactos/subsys/win32k/eng/transblt.c b/reactos/subsys/win32k/eng/transblt.c index ceb2ce3fdb4..5caab776e47 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.10 2004/01/16 19:32:00 gvg Exp $ +/* $Id: transblt.c,v 1.11 2004/02/24 13:27:02 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -32,6 +32,7 @@ #include <ddk/ntddmou.h> #include <ntos/minmax.h> #include <include/dib.h> +#include <include/eng.h> #include <include/object.h> #include <include/surface.h> @@ -96,10 +97,10 @@ EngTransparentBlt(PSURFOBJ Dest, // FIXME: Skip creating a TempSurf if we have the same BPP and palette EngBitBlt(TempSurf, Source, NULL, NULL, ColorTranslation, &TempRect, &SourcePoint, NULL, NULL, NULL, 0); - ExAcquireFastMutex(DestGDI->DriverLock); + IntLockGDIDriver(DestGDI); ret = DestGDI->TransparentBlt(Dest, TempSurf, Clip, NULL, DestRect, SourceRect, TransparentColor, Reserved); - ExReleaseFastMutex(DestGDI->DriverLock); + IntUnLockGDIDriver(DestGDI); MouseSafetyOnDrawEnd(Source, SourceGDI); MouseSafetyOnDrawEnd(Dest, DestGDI); diff --git a/reactos/subsys/win32k/include/class.h b/reactos/subsys/win32k/include/class.h index 9a8f77d5643..2beed0598f2 100644 --- a/reactos/subsys/win32k/include/class.h +++ b/reactos/subsys/win32k/include/class.h @@ -34,6 +34,12 @@ InitClassImpl(VOID); NTSTATUS FASTCALL CleanupClassImpl(VOID); +#define IntLockProcessClasses(W32Process) \ + ExAcquireFastMutex(&W32Process->ClassListLock) + +#define IntUnLockProcessClasses(W32Process) \ + ExReleaseFastMutex(&W32Process->ClassListLock) + NTSTATUS STDCALL ClassReferenceClassByName(PWNDCLASS_OBJECT *Class, LPCWSTR ClassName); diff --git a/reactos/subsys/win32k/include/cursoricon.h b/reactos/subsys/win32k/include/cursoricon.h index 75cb0b376fa..c9b5a0e307b 100644 --- a/reactos/subsys/win32k/include/cursoricon.h +++ b/reactos/subsys/win32k/include/cursoricon.h @@ -23,6 +23,12 @@ VOID FASTCALL IntReleaseCurIconObject(PCURICON_OBJECT Object); PCURICON_OBJECT FASTCALL IntCreateCurIconHandle(PWINSTATION_OBJECT WinStaObject); VOID FASTCALL IntCleanupCurIcons(struct _EPROCESS *Process, PW32PROCESS Win32Process); +#define IntLockProcessCursorIcons(W32Process) \ + ExAcquireFastMutex(&W32Process->CursorIconListLock) + +#define IntUnLockProcessCursorIcons(W32Process) \ + ExReleaseFastMutex(&W32Process->CursorIconListLock) + #endif /* _WIN32K_CURSORICON_H */ /* EOF */ diff --git a/reactos/subsys/win32k/include/eng.h b/reactos/subsys/win32k/include/eng.h index cafed3f9bff..52d0d98039b 100644 --- a/reactos/subsys/win32k/include/eng.h +++ b/reactos/subsys/win32k/include/eng.h @@ -1,6 +1,12 @@ #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/hook.h b/reactos/subsys/win32k/include/hook.h index 921cf25c17a..49c418d7833 100644 --- a/reactos/subsys/win32k/include/hook.h +++ b/reactos/subsys/win32k/include/hook.h @@ -27,6 +27,12 @@ typedef struct tagHOOKTABLE LRESULT FASTCALL HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam); VOID FASTCALL HOOK_DestroyThreadHooks(PETHREAD Thread); +#define IntLockHookTable(HookTable) \ + ExAcquireFastMutex(&HookTable->Lock) + +#define IntUnLockHookTable(HookTable) \ + ExReleaseFastMutex(&HookTable->Lock) + #endif /* _WIN32K_HOOK_H */ /* EOF */ diff --git a/reactos/subsys/win32k/include/hotkey.h b/reactos/subsys/win32k/include/hotkey.h index 449c4434bd3..9711a3a666a 100644 --- a/reactos/subsys/win32k/include/hotkey.h +++ b/reactos/subsys/win32k/include/hotkey.h @@ -36,6 +36,12 @@ UnregisterWindowHotKeys(PWINDOW_OBJECT Window); VOID UnregisterThreadHotKeys(struct _ETHREAD *Thread); +#define IntLockHotKeys(WinStaObject) \ + ExAcquireFastMutex(&WinStaObject->HotKeyListLock) + +#define IntUnLockHotKeys(WinStaObject) \ + ExReleaseFastMutex(&WinStaObject->HotKeyListLock) + #endif /* _WIN32K_HOTKEY_H */ /* EOF */ diff --git a/reactos/subsys/win32k/include/menu.h b/reactos/subsys/win32k/include/menu.h index cc54ecff07a..5c421b86815 100644 --- a/reactos/subsys/win32k/include/menu.h +++ b/reactos/subsys/win32k/include/menu.h @@ -44,8 +44,20 @@ typedef struct _MENU_OBJECT PMENU_OBJECT FASTCALL IntGetMenuObject(HMENU hMenu); -VOID FASTCALL -IntReleaseMenuObject(PMENU_OBJECT MenuObject); +#define IntLockMenuItems(MenuObj) \ + ExAcquireFastMutex(&MenuObj->MenuItemsLock) + +#define IntUnLockMenuItems(MenuObj) \ + ExReleaseFastMutex(&MenuObj->MenuItemsLock) + +#define IntLockProcessMenus(W32Process) \ + ExAcquireFastMutex(&W32Process->MenuListLock) + +#define IntUnLockProcessMenus(W32Process) \ + ExReleaseFastMutex(&W32Process->MenuListLock) + +#define IntReleaseMenuObject(MenuObj) \ + ObmDereferenceObject(MenuObj) BOOL FASTCALL IntFreeMenuItem(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, diff --git a/reactos/subsys/win32k/include/msgqueue.h b/reactos/subsys/win32k/include/msgqueue.h index 3348106ce93..ae43ea642c7 100644 --- a/reactos/subsys/win32k/include/msgqueue.h +++ b/reactos/subsys/win32k/include/msgqueue.h @@ -170,6 +170,22 @@ VOID FASTCALL MsqSetHooks(PUSER_MESSAGE_QUEUE Queue, PHOOKTABLE Hooks); LPARAM FASTCALL MsqSetMessageExtraInfo(LPARAM lParam); LPARAM FASTCALL MsqGetMessageExtraInfo(VOID); +#define IntLockMessageQueue(MsgQueue) \ + ExAcquireFastMutex(&MsgQueue->Lock) + +#define IntUnLockMessageQueue(MsgQueue) \ + ExReleaseFastMutex(&MsgQueue->Lock) + +#define IntLockHardwareMessageQueue(MsgQueue) \ + ExAcquireFastMutex(&MsgQueue->HardwareLock) + +#define IntUnLockHardwareMessageQueue(MsgQueue) \ + ExReleaseFastMutex(&MsgQueue->HardwareLock) + +/* check the queue status */ +#define MsqIsSignaled(MsgQueue) \ + ((MsgQueue->WakeBits & MsgQueue->WakeMask) || (MsgQueue->ChangedBits & MsgQueue->ChangedMask)) + #endif /* _WIN32K_MSGQUEUE_H */ /* EOF */ diff --git a/reactos/subsys/win32k/include/object.h b/reactos/subsys/win32k/include/object.h index 686a4b275e4..4d166532a44 100644 --- a/reactos/subsys/win32k/include/object.h +++ b/reactos/subsys/win32k/include/object.h @@ -47,6 +47,12 @@ typedef struct _USER_HANDLE_TABLE } USER_HANDLE_TABLE, *PUSER_HANDLE_TABLE; +#define ObmpLockHandleTable(HandleTable) \ + ExAcquireFastMutex(&HandleTable->ListLock) + +#define ObmpUnlockHandleTable(HandleTable) \ + ExReleaseFastMutex(&HandleTable->ListLock) + ULONG FASTCALL ObmGetReferenceCount( PVOID ObjectBody); diff --git a/reactos/subsys/win32k/include/painting.h b/reactos/subsys/win32k/include/painting.h index 72a75641a3f..1c01747c965 100644 --- a/reactos/subsys/win32k/include/painting.h +++ b/reactos/subsys/win32k/include/painting.h @@ -16,4 +16,10 @@ IntGetPaintMessage(HWND hWnd, PW32THREAD Thread, MSG *Message, BOOL Remove); BOOL STDCALL NtUserValidateRgn(HWND hWnd, HRGN hRgn); +#define IntLockWindowUpdate(Window) \ + ExAcquireFastMutex(&Window->UpdateLock) + +#define IntUnLockWindowUpdate(Window) \ + ExReleaseFastMutex(&Window->UpdateLock) + #endif /* _WIN32K_PAINTING_H */ diff --git a/reactos/subsys/win32k/include/prop.h b/reactos/subsys/win32k/include/prop.h index cf429ab65b8..99bedb233bd 100644 --- a/reactos/subsys/win32k/include/prop.h +++ b/reactos/subsys/win32k/include/prop.h @@ -8,5 +8,11 @@ typedef struct _PROPERTY ATOM Atom; } PROPERTY, *PPROPERTY; +#define IntLockWindowProperties(Window) \ + ExAcquireFastMutex(&Window->PropListLock) + +#define IntUnLockWindowProperties(Window) \ + ExReleaseFastMutex(&Window->PropListLock) + #endif /* _WIN32K_PROP_H */ diff --git a/reactos/subsys/win32k/include/text.h b/reactos/subsys/win32k/include/text.h index d2fbac525c8..ebb8afcc149 100644 --- a/reactos/subsys/win32k/include/text.h +++ b/reactos/subsys/win32k/include/text.h @@ -6,4 +6,22 @@ BOOL FASTCALL IntIsFontRenderingEnabled(VOID); BOOL FASTCALL IntIsFontRenderingEnabled(VOID); VOID FASTCALL IntEnableFontRendering(BOOL Enable); +#define IntLockProcessPrivateFonts(W32Process) \ + ExAcquireFastMutex(&W32Process->PrivateFontListLock) + +#define IntUnLockProcessPrivateFonts(W32Process) \ + ExReleaseFastMutex(&W32Process->PrivateFontListLock) + +#define IntLockGlobalFonts \ + ExAcquireFastMutex(&FontListLock) + +#define IntUnLockGlobalFonts \ + ExReleaseFastMutex(&FontListLock) + +#define IntLockFreeType \ + ExAcquireFastMutex(&FreeTypeLock) + +#define IntUnLockFreeType \ + ExReleaseFastMutex(&FreeTypeLock) + #endif /* _WIN32K_TEXT_H */ diff --git a/reactos/subsys/win32k/include/window.h b/reactos/subsys/win32k/include/window.h index 09d3a851310..9f316a67030 100644 --- a/reactos/subsys/win32k/include/window.h +++ b/reactos/subsys/win32k/include/window.h @@ -128,10 +128,16 @@ typedef struct _WINDOW_OBJECT WndObj->OwnerThread->ThreadsProcess->UniqueProcessId #define IntLockRelatives(WndObj) \ - ExAcquireFastMutexUnsafe(&WndObj->RelativesLock) + ExAcquireFastMutex(&WndObj->RelativesLock) #define IntUnLockRelatives(WndObj) \ - ExReleaseFastMutexUnsafe(&WndObj->RelativesLock) + ExReleaseFastMutex(&WndObj->RelativesLock) + +#define IntLockThreadWindows(Thread) \ + ExAcquireFastMutex(&Thread->WindowListLock) + +#define IntUnLockThreadWindows(Thread) \ + ExReleaseFastMutex(&Thread->WindowListLock) PWINDOW_OBJECT FASTCALL diff --git a/reactos/subsys/win32k/include/winpos.h b/reactos/subsys/win32k/include/winpos.h index d45ce2b0a1e..c4e9f469d8a 100644 --- a/reactos/subsys/win32k/include/winpos.h +++ b/reactos/subsys/win32k/include/winpos.h @@ -20,11 +20,11 @@ WinPosSetWindowPos(HWND Wnd, HWND WndInsertAfter, INT x, INT y, INT cx, BOOLEAN FASTCALL WinPosShowWindow(HWND Wnd, INT Cmd); USHORT FASTCALL -WinPosWindowFromPoint(PWINDOW_OBJECT ScopeWin, POINT WinPoint, +WinPosWindowFromPoint(PWINDOW_OBJECT ScopeWin, POINT *WinPoint, PWINDOW_OBJECT* Window); VOID FASTCALL WinPosActivateOtherWindow(PWINDOW_OBJECT Window); PINTERNALPOS FASTCALL WinPosInitInternalPos(PWINDOW_OBJECT WindowObject, - POINT pt, PRECT RestoreRect); + POINT *pt, PRECT RestoreRect); #endif /* _WIN32K_WINPOS_H */ diff --git a/reactos/subsys/win32k/misc/object.c b/reactos/subsys/win32k/misc/object.c index 35b093aea82..e5985b13097 100644 --- a/reactos/subsys/win32k/misc/object.c +++ b/reactos/subsys/win32k/misc/object.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: object.c,v 1.9 2004/02/24 01:30:57 weiden Exp $ +/* $Id: object.c,v 1.10 2004/02/24 13:27:03 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -36,32 +36,14 @@ #define NDEBUG #include <debug.h> +#define HEADER_TO_BODY(ObjectHeader) \ + ((PVOID)(((PUSER_OBJECT_HEADER)ObjectHeader) + 1)) + +#define BODY_TO_HEADER(ObjectBody) \ + ((PUSER_OBJECT_HEADER)(((PUSER_OBJECT_HEADER)ObjectBody) - 1)) + /* FUNCTIONS *****************************************************************/ -PVOID FASTCALL -HEADER_TO_BODY(PUSER_OBJECT_HEADER ObjectHeader) -{ - return (((PUSER_OBJECT_HEADER)ObjectHeader) + 1); -} - -PUSER_OBJECT_HEADER FASTCALL -BODY_TO_HEADER(PVOID ObjectBody) -{ - return (((PUSER_OBJECT_HEADER)ObjectBody) - 1); -} - -VOID STATIC FASTCALL -ObmpLockHandleTable(PUSER_HANDLE_TABLE HandleTable) -{ - ExAcquireFastMutex(&HandleTable->ListLock); -} - -VOID STATIC FASTCALL -ObmpUnlockHandleTable(PUSER_HANDLE_TABLE HandleTable) -{ - ExReleaseFastMutex(&HandleTable->ListLock); -} - VOID FASTCALL ObmpPerformRetentionChecks(PUSER_OBJECT_HEADER ObjectHeader) { @@ -307,10 +289,7 @@ ObmDereferenceObject(PVOID ObjectBody) ObjectHeader = BODY_TO_HEADER(ObjectBody); ObjectHeader->RefCount--; - #if 0 - if(ObjectHeader->Type == otWindow) - DbgPrint("Dereference 0x%x: %d\n", ((PWINDOW_OBJECT)ObjectBody)->Self, ObjectHeader->RefCount); - #endif + ObmpPerformRetentionChecks(ObjectHeader); } @@ -333,10 +312,7 @@ ObmReferenceObjectByPointer(PVOID ObjectBody, { return STATUS_INVALID_PARAMETER; } - #if 0 - if(ObjectType == otWindow) - DbgPrint("Reference 0x%x: %d\n", ((PWINDOW_OBJECT)ObjectBody)->Self, ObjectHeader->RefCount); - #endif + ObjectHeader->RefCount++; return STATUS_SUCCESS; diff --git a/reactos/subsys/win32k/ntuser/class.c b/reactos/subsys/win32k/ntuser/class.c index 45d37f7522c..e64f891d0ae 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.47 2004/02/19 21:12:09 weiden Exp $ +/* $Id: class.c,v 1.48 2004/02/24 13:27:03 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -66,7 +66,7 @@ ClassReferenceClassByAtom(PWNDCLASS_OBJECT* Class, PLIST_ENTRY CurrentEntry; PW32PROCESS Process = PsGetWin32Process(); - ExAcquireFastMutexUnsafe (&Process->ClassListLock); + IntLockProcessClasses(Process); CurrentEntry = Process->ClassListHead.Flink; while (CurrentEntry != &Process->ClassListHead) { @@ -76,13 +76,13 @@ ClassReferenceClassByAtom(PWNDCLASS_OBJECT* Class, { *Class = Current; ObmReferenceObject(Current); - ExReleaseFastMutexUnsafe (&Process->ClassListLock); + IntUnLockProcessClasses(Process); return(STATUS_SUCCESS); } CurrentEntry = CurrentEntry->Flink; } - ExReleaseFastMutexUnsafe (&Process->ClassListLock); + IntUnLockProcessClasses(Process); return(STATUS_NOT_FOUND); } @@ -418,9 +418,9 @@ NtUserRegisterClassExWOW( DPRINT("Failed creating window class object\n"); return((RTL_ATOM)0); } - ExAcquireFastMutex(&PsGetWin32Process()->ClassListLock); + IntLockProcessClasses(PsGetWin32Process()); InsertTailList(&PsGetWin32Process()->ClassListHead, &ClassObject->ListEntry); - ExReleaseFastMutex(&PsGetWin32Process()->ClassListLock); + IntUnLockProcessClasses(PsGetWin32Process()); ObDereferenceObject(WinStaObject); return(Atom); } diff --git a/reactos/subsys/win32k/ntuser/focus.c b/reactos/subsys/win32k/ntuser/focus.c index 2efd2840c46..59fcfb7bbc9 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.18 2004/02/24 01:30:57 weiden Exp $ + * $Id: focus.c,v 1.19 2004/02/24 13:27:03 weiden Exp $ */ #include <win32k/win32k.h> @@ -26,6 +26,7 @@ #include <include/focus.h> #include <include/error.h> #include <include/winpos.h> +#include <include/msgqueue.h> #define NDEBUG #include <win32k/debug1.h> #include <debug.h> @@ -174,18 +175,18 @@ IntSetForegroundAndFocusWindow(PWINDOW_OBJECT Window, PWINDOW_OBJECT FocusWindow /* FIXME: Call hooks. */ IntSetFocusMessageQueue(Window->MessageQueue); - ExAcquireFastMutex(&Window->MessageQueue->Lock); + IntLockMessageQueue(Window->MessageQueue); if (Window->MessageQueue) { Window->MessageQueue->ActiveWindow = hWnd; } - ExReleaseFastMutex(&Window->MessageQueue->Lock); - ExAcquireFastMutex(&FocusWindow->MessageQueue->Lock); + IntUnLockMessageQueue(Window->MessageQueue); + IntLockMessageQueue(FocusWindow->MessageQueue); if (FocusWindow->MessageQueue) { FocusWindow->MessageQueue->FocusWindow = hWndFocus; } - ExReleaseFastMutex(&FocusWindow->MessageQueue->Lock); + IntUnLockMessageQueue(FocusWindow->MessageQueue); IntSendDeactivateMessages(hWndPrev, hWnd); IntSendKillFocusMessages(hWndFocusPrev, hWndFocus); @@ -278,9 +279,9 @@ IntSetActiveWindow(PWINDOW_OBJECT Window) /* FIXME: Call hooks. */ - ExAcquireFastMutex(&ThreadQueue->Lock); + IntLockMessageQueue(ThreadQueue); ThreadQueue->ActiveWindow = hWnd; - ExReleaseFastMutex(&ThreadQueue->Lock); + IntUnLockMessageQueue(ThreadQueue); IntSendDeactivateMessages(hWndPrev, hWnd); IntSendActivateMessages(hWndPrev, hWnd, FALSE); @@ -305,9 +306,9 @@ IntSetFocusWindow(HWND hWnd) return hWndPrev; } - ExAcquireFastMutex(&ThreadQueue->Lock); + IntLockMessageQueue(ThreadQueue); ThreadQueue->FocusWindow = hWnd; - ExReleaseFastMutex(&ThreadQueue->Lock); + IntUnLockMessageQueue(ThreadQueue); IntSendKillFocusMessages(hWndPrev, hWnd); IntSendSetFocusMessages(hWndPrev, hWnd); @@ -411,9 +412,9 @@ NtUserSetCapture(HWND hWnd) } hWndPrev = ThreadQueue->CaptureWindow; IntSendMessage(hWndPrev, WM_CAPTURECHANGED, 0, (LPARAM)hWnd); - ExAcquireFastMutex(&ThreadQueue->Lock); + IntLockMessageQueue(ThreadQueue); ThreadQueue->CaptureWindow = hWnd; - ExReleaseFastMutex(&ThreadQueue->Lock); + IntUnLockMessageQueue(ThreadQueue); return hWndPrev; } diff --git a/reactos/subsys/win32k/ntuser/hook.c b/reactos/subsys/win32k/ntuser/hook.c index 05bd006e136..eb284f77c88 100644 --- a/reactos/subsys/win32k/ntuser/hook.c +++ b/reactos/subsys/win32k/ntuser/hook.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: hook.c,v 1.5 2004/02/19 21:12:09 weiden Exp $ +/* $Id: hook.c,v 1.6 2004/02/24 13:27:03 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -106,9 +106,9 @@ IntAddHook(PETHREAD Thread, int HookId, BOOLEAN Global, PWINSTATION_OBJECT WinSt Hook->HookId = HookId; RtlInitUnicodeString(&Hook->ModuleName, NULL); - ExAcquireFastMutex(&Table->Lock); + IntLockHookTable(Table); InsertHeadList(&Table->Hooks[HOOKID_TO_INDEX(HookId)], &Hook->Chain); - ExReleaseFastMutex(&Table->Lock); + IntUnLockHookTable(Table); return Hook; } @@ -142,7 +142,7 @@ IntGetFirstValidHook(PHOOKTABLE Table, int HookId) PHOOK Hook; PLIST_ENTRY Elem; - ExAcquireFastMutex(&Table->Lock); + IntLockHookTable(Table); Hook = IntGetFirstHook(Table, HookId); while (NULL != Hook && NULL == Hook->Proc) { @@ -150,7 +150,7 @@ IntGetFirstValidHook(PHOOKTABLE Table, int HookId) Hook = (Elem == &Table->Hooks[HOOKID_TO_INDEX(HookId)] ? NULL : CONTAINING_RECORD(Elem, HOOK, Chain)); } - ExReleaseFastMutex(&Table->Lock); + IntUnLockHookTable(Table); return Hook; } @@ -163,18 +163,18 @@ IntGetNextHook(PHOOK Hook) int HookId = Hook->HookId; PLIST_ENTRY Elem; - ExAcquireFastMutex(&Table->Lock); + IntLockHookTable(Table); Elem = Hook->Chain.Flink; while (Elem != &Table->Hooks[HOOKID_TO_INDEX(HookId)]) { Hook = CONTAINING_RECORD(Elem, HOOK, Chain); if (NULL != Hook->Proc) { - ExReleaseFastMutex(&Table->Lock); + IntUnLockHookTable(Table); return Hook; } } - ExReleaseFastMutex(&Table->Lock); + IntUnLockHookTable(Table); if (NULL != GlobalHooks && Table != GlobalHooks) /* now search through the global table */ { @@ -206,7 +206,7 @@ IntRemoveHook(PHOOK Hook, PWINSTATION_OBJECT WinStaObj) return; } - ExAcquireFastMutex(&Table->Lock); + IntLockHookTable(Table); if (0 != Table->Counts[HOOKID_TO_INDEX(Hook->HookId)]) { Hook->Proc = NULL; /* chain is in use, just mark it and return */ @@ -215,7 +215,7 @@ IntRemoveHook(PHOOK Hook, PWINSTATION_OBJECT WinStaObj) { IntFreeHook(Table, Hook, WinStaObj); } - ExReleaseFastMutex(&Table->Lock); + IntUnLockHookTable(Table); } /* release a hook chain, removing deleted hooks if the use count drops to 0 */ @@ -230,12 +230,12 @@ IntReleaseHookChain(PHOOKTABLE Table, int HookId, PWINSTATION_OBJECT WinStaObj) return; } - ExAcquireFastMutex(&Table->Lock); + IntLockHookTable(Table); /* use count shouldn't already be 0 */ ASSERT(0 != Table->Counts[HOOKID_TO_INDEX(HookId)]); if (0 == Table->Counts[HOOKID_TO_INDEX(HookId)]) { - ExReleaseFastMutex(&Table->Lock); + IntUnLockHookTable(Table); return; } if (0 == --Table->Counts[HOOKID_TO_INDEX(HookId)]) @@ -251,7 +251,7 @@ IntReleaseHookChain(PHOOKTABLE Table, int HookId, PWINSTATION_OBJECT WinStaObj) } } } - ExReleaseFastMutex(&Table->Lock); + IntUnLockHookTable(Table); } LRESULT FASTCALL @@ -281,14 +281,14 @@ HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam) return 0; } - ExAcquireFastMutex(&Table->Lock); + IntLockHookTable(Table); Table->Counts[HOOKID_TO_INDEX(HookId)]++; - ExReleaseFastMutex(&Table->Lock); + IntUnLockHookTable(Table); if (Table != GlobalHooks && GlobalHooks != NULL) { - ExAcquireFastMutex(&GlobalHooks->Lock); + IntLockHookTable(GlobalHooks); GlobalHooks->Counts[HOOKID_TO_INDEX(HookId)]++; - ExReleaseFastMutex(&GlobalHooks->Lock); + IntUnLockHookTable(GlobalHooks); } Result = IntCallHookProc(HookId, Code, wParam, lParam, Hook->Proc, @@ -334,7 +334,7 @@ HOOK_DestroyThreadHooks(PETHREAD Thread) DPRINT1("Invalid window station????\n"); return; } - ExAcquireFastMutex(&GlobalHooks->Lock); + IntLockHookTable(GlobalHooks); for (HookId = WH_MINHOOK; HookId <= WH_MAXHOOK; HookId++) { /* only low-level keyboard/mouse global hooks can be owned by a thread */ @@ -355,7 +355,7 @@ HOOK_DestroyThreadHooks(PETHREAD Thread) break; } } - ExReleaseFastMutex(&GlobalHooks->Lock); + IntUnLockHookTable(GlobalHooks); ObDereferenceObject(WinStaObj); } } diff --git a/reactos/subsys/win32k/ntuser/hotkey.c b/reactos/subsys/win32k/ntuser/hotkey.c index 9f93a82f025..3fa628f68f2 100644 --- a/reactos/subsys/win32k/ntuser/hotkey.c +++ b/reactos/subsys/win32k/ntuser/hotkey.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: hotkey.c,v 1.7 2004/02/19 21:12:09 weiden Exp $ +/* $Id: hotkey.c,v 1.8 2004/02/24 13:27:03 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -80,7 +80,7 @@ GetHotKey (PWINSTATION_OBJECT WinStaObject, return FALSE; } - ExAcquireFastMutex (&WinStaObject->HotKeyListLock); + IntLockHotKeys(WinStaObject); Entry = WinStaObject->HotKeyListHead.Flink; while (Entry != &WinStaObject->HotKeyListHead) @@ -100,7 +100,7 @@ GetHotKey (PWINSTATION_OBJECT WinStaObject, if (id != NULL) *id = HotKeyItem->id; - ExReleaseFastMutex (&WinStaObject->HotKeyListLock); + IntUnLockHotKeys(WinStaObject); return TRUE; } @@ -108,7 +108,7 @@ GetHotKey (PWINSTATION_OBJECT WinStaObject, Entry = Entry->Flink; } - ExReleaseFastMutex (&WinStaObject->HotKeyListLock); + IntUnLockHotKeys(WinStaObject); return FALSE; } @@ -128,7 +128,7 @@ UnregisterWindowHotKeys(PWINDOW_OBJECT Window) if(!WinStaObject) return; - ExAcquireFastMutex (&WinStaObject->HotKeyListLock); + IntLockHotKeys(WinStaObject); Entry = WinStaObject->HotKeyListHead.Flink; while (Entry != &WinStaObject->HotKeyListHead) @@ -144,7 +144,7 @@ UnregisterWindowHotKeys(PWINDOW_OBJECT Window) } } - ExReleaseFastMutex (&WinStaObject->HotKeyListLock); + IntUnLockHotKeys(WinStaObject); } @@ -161,7 +161,7 @@ UnregisterThreadHotKeys(struct _ETHREAD *Thread) if(!WinStaObject) return; - ExAcquireFastMutex (&WinStaObject->HotKeyListLock); + IntLockHotKeys(WinStaObject); Entry = WinStaObject->HotKeyListHead.Flink; while (Entry != &WinStaObject->HotKeyListHead) @@ -177,7 +177,7 @@ UnregisterThreadHotKeys(struct _ETHREAD *Thread) } } - ExReleaseFastMutex (&WinStaObject->HotKeyListLock); + IntUnLockHotKeys(WinStaObject); } @@ -234,12 +234,12 @@ NtUserRegisterHotKey(HWND hWnd, return FALSE; } - ExAcquireFastMutex (&WinStaObject->HotKeyListLock); + IntLockHotKeys(WinStaObject); /* Check for existing hotkey */ if (IsHotKey (WinStaObject, fsModifiers, vk)) { - ExReleaseFastMutex (&WinStaObject->HotKeyListLock); + IntUnLockHotKeys(WinStaObject); IntReleaseWindowObject(Window); return FALSE; } @@ -247,7 +247,7 @@ NtUserRegisterHotKey(HWND hWnd, HotKeyItem = ExAllocatePoolWithTag (PagedPool, sizeof(HOT_KEY_ITEM), TAG_HOTKEY); if (HotKeyItem == NULL) { - ExReleaseFastMutex (&WinStaObject->HotKeyListLock); + IntUnLockHotKeys(WinStaObject); IntReleaseWindowObject(Window); return FALSE; } @@ -261,7 +261,7 @@ NtUserRegisterHotKey(HWND hWnd, InsertHeadList (&WinStaObject->HotKeyListHead, &HotKeyItem->ListEntry); - ExReleaseFastMutex (&WinStaObject->HotKeyListLock); + IntUnLockHotKeys(WinStaObject); IntReleaseWindowObject(Window); return TRUE; @@ -293,7 +293,7 @@ NtUserUnregisterHotKey(HWND hWnd, return FALSE; } - ExAcquireFastMutex (&WinStaObject->HotKeyListLock); + IntLockHotKeys(WinStaObject); Entry = WinStaObject->HotKeyListHead.Flink; while (Entry != &WinStaObject->HotKeyListHead) @@ -306,7 +306,7 @@ NtUserUnregisterHotKey(HWND hWnd, { RemoveEntryList (&HotKeyItem->ListEntry); ExFreePool (HotKeyItem); - ExReleaseFastMutex (&WinStaObject->HotKeyListLock); + IntUnLockHotKeys(WinStaObject); IntReleaseWindowObject(Window); return TRUE; @@ -315,7 +315,7 @@ NtUserUnregisterHotKey(HWND hWnd, Entry = Entry->Flink; } - ExReleaseFastMutex (&WinStaObject->HotKeyListLock); + IntUnLockHotKeys(WinStaObject); IntReleaseWindowObject(Window); return FALSE; diff --git a/reactos/subsys/win32k/ntuser/keyboard.c b/reactos/subsys/win32k/ntuser/keyboard.c index 0d1e09a6619..1f2ca51ca91 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.24 2004/02/19 21:12:09 weiden Exp $ +/* $Id: keyboard.c,v 1.25 2004/02/24 13:27:03 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -67,6 +67,12 @@ FAST_MUTEX QueueStateLock; BYTE QueueKeyStateTable[256]; +#define IntLockQueueState \ + ExAcquireFastMutex(&QueueStateLock) + +#define IntUnLockQueueState \ + ExReleaseFastMutex(&QueueStateLock) + /* FUNCTIONS *****************************************************************/ /* Initialization -- Right now, just zero the key state and init the lock */ @@ -314,12 +320,12 @@ NtUserGetKeyState( { DWORD ret = 0; - ExAcquireFastMutex(&QueueStateLock); + IntLockQueueState; if( key < 0x100 ) { ret = ((DWORD)(QueueKeyStateTable[key] & KS_DOWN_BIT) << 8 ) | (QueueKeyStateTable[key] & KS_LOCK_BIT); } - ExReleaseFastMutex(&QueueStateLock); + IntUnLockQueueState; return ret; } @@ -332,7 +338,7 @@ int STDCALL ToUnicodeEx( UINT wVirtKey, HKL dwhkl ) { int ToUnicodeResult = 0; - ExAcquireFastMutex(&QueueStateLock); + IntLockQueueState; ToUnicodeResult = ToUnicodeInner( wVirtKey, wScanCode, lpKeyState, @@ -341,7 +347,7 @@ int STDCALL ToUnicodeEx( UINT wVirtKey, wFlags, PsGetWin32Thread() ? PsGetWin32Thread()->KeyboardLayout : 0 ); - ExReleaseFastMutex(&QueueStateLock); + IntUnLockQueueState; return ToUnicodeResult; } @@ -618,7 +624,7 @@ IntTranslateKbdMessage(LPMSG lpMsg, ScanCode = (lpMsg->lParam >> 16) & 0xff; - ExAcquireFastMutex(&QueueStateLock); + IntLockQueueState; UState = ToUnicodeInner(lpMsg->wParam, HIWORD(lpMsg->lParam) & 0xff, QueueKeyStateTable, wp, 2, 0, @@ -681,7 +687,7 @@ IntTranslateKbdMessage(LPMSG lpMsg, Result = TRUE; } - ExReleaseFastMutex(&QueueStateLock); + IntUnLockQueueState; return Result; } @@ -692,12 +698,12 @@ NtUserGetKeyboardState( { BOOL Result = TRUE; - ExAcquireFastMutex(&QueueStateLock); + IntLockQueueState; if (lpKeyState) { if(!NT_SUCCESS(MmCopyToCaller(lpKeyState, QueueKeyStateTable, 256))) Result = FALSE; } - ExReleaseFastMutex(&QueueStateLock); + IntUnLockQueueState; return Result; } @@ -708,12 +714,12 @@ NtUserSetKeyboardState( { BOOL Result = TRUE; - ExAcquireFastMutex(&QueueStateLock); + IntLockQueueState; if (lpKeyState) { if(! NT_SUCCESS(MmCopyFromCaller(QueueKeyStateTable, lpKeyState, 256))) Result = FALSE; } - ExReleaseFastMutex(&QueueStateLock); + IntUnLockQueueState; return Result; } @@ -964,7 +970,7 @@ VOID FASTCALL W32kKeyProcessMessage(LPMSG Msg, PKBDTABLES KeyboardLayout) { return; } - ExAcquireFastMutex(&QueueStateLock); + IntLockQueueState; /* arty -- handle numpad -- On real windows, the actual key produced * by the messaging layer is different based on the state of numlock. */ @@ -1017,6 +1023,6 @@ VOID FASTCALL W32kKeyProcessMessage(LPMSG Msg, PKBDTABLES KeyboardLayout) { else Msg->message = WM_KEYUP; } - ExReleaseFastMutex(&QueueStateLock); + IntUnLockQueueState; } /* EOF */ diff --git a/reactos/subsys/win32k/ntuser/menu.c b/reactos/subsys/win32k/ntuser/menu.c index e6addf19e3d..cd1a774e68a 100644 --- a/reactos/subsys/win32k/ntuser/menu.c +++ b/reactos/subsys/win32k/ntuser/menu.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: menu.c,v 1.49 2004/02/23 21:18:45 gvg Exp $ +/* $Id: menu.c,v 1.50 2004/02/24 13:27:03 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -163,12 +163,6 @@ IntGetMenuObject(HMENU hMenu) return MenuObject; } -VOID FASTCALL -IntReleaseMenuObject(PMENU_OBJECT MenuObject) -{ - ObmDereferenceObject(MenuObject); -} - BOOL FASTCALL IntFreeMenuItem(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, BOOL RemoveFromList, BOOL bRecurse) @@ -243,15 +237,15 @@ IntDestroyMenuObject(PMENU_OBJECT MenuObject, if(MenuObject) { /* remove all menu items */ - ExAcquireFastMutexUnsafe (&MenuObject->MenuItemsLock); + IntLockMenuItems(MenuObject); IntDeleteMenuItems(MenuObject, bRecurse); /* do not destroy submenus */ - ExReleaseFastMutexUnsafe (&MenuObject->MenuItemsLock); + IntUnLockMenuItems(MenuObject); if(RemoveFromProcess) { - ExAcquireFastMutexUnsafe(&MenuObject->W32Process->MenuListLock); + IntLockProcessMenus(MenuObject->W32Process); RemoveEntryList(&MenuObject->ListEntry); - ExReleaseFastMutexUnsafe(&MenuObject->W32Process->MenuListLock); + IntUnLockProcessMenus(MenuObject->W32Process); } ObmCloseHandle(MenuObject->W32Process->WindowStation->HandleTable, MenuObject->MenuInfo.Self); @@ -301,9 +295,9 @@ IntCreateMenu(PHANDLE Handle, BOOL IsMenuBar) ExInitializeFastMutex(&MenuObject->MenuItemsLock); /* Insert menu item into process menu handle list */ - ExAcquireFastMutexUnsafe(&Win32Process->MenuListLock); + IntLockProcessMenus(Win32Process); InsertTailList(&Win32Process->MenuListHead, &MenuObject->ListEntry); - ExReleaseFastMutexUnsafe(&Win32Process->MenuListLock); + IntUnLockProcessMenus(Win32Process); return MenuObject; } @@ -317,8 +311,8 @@ IntCloneMenuItems(PMENU_OBJECT Destination, PMENU_OBJECT Source) if(!Source->MenuInfo.MenuItemCount) return FALSE; - ExAcquireFastMutexUnsafe(&Destination->MenuItemsLock); - ExAcquireFastMutexUnsafe(&Source->MenuItemsLock); + IntLockMenuItems(Destination); + IntLockMenuItems(Source); MenuItem = Source->MenuItemList; while(MenuItem) @@ -370,8 +364,8 @@ IntCloneMenuItems(PMENU_OBJECT Destination, PMENU_OBJECT Source) MenuItem = MenuItem->Next; } - ExReleaseFastMutexUnsafe(&Source->MenuItemsLock); - ExReleaseFastMutexUnsafe(&Destination->MenuItemsLock); + IntUnLockMenuItems(Source); + IntUnLockMenuItems(Destination); return TRUE; } @@ -413,9 +407,9 @@ IntCloneMenu(PMENU_OBJECT Source) ExInitializeFastMutex(&MenuObject->MenuItemsLock); /* Insert menu item into process menu handle list */ - ExAcquireFastMutexUnsafe(&Process->MenuListLock); + IntLockProcessMenus(Process); InsertTailList(&Process->MenuListHead, &MenuObject->ListEntry); - ExReleaseFastMutexUnsafe(&Process->MenuListLock); + IntUnLockProcessMenus(Process); IntCloneMenuItems(MenuObject, Source); @@ -1142,15 +1136,15 @@ IntGetMenuDefaultItem(PMENU_OBJECT MenuObject, UINT fByPos, UINT gmdiFlags, if(!SubMenuObject || (SubMenuObject == MenuObject)) break; - ExAcquireFastMutexUnsafe(&SubMenuObject->MenuItemsLock); - ExReleaseFastMutexUnsafe(&MenuObject->MenuItemsLock); + IntLockMenuItems(SubMenuObject); + IntUnLockMenuItems(MenuObject); (*gismc)++; sres = IntGetMenuDefaultItem(SubMenuObject, fByPos, gmdiFlags, gismc); (*gismc)--; - ExReleaseFastMutexUnsafe(&SubMenuObject->MenuItemsLock); - ExAcquireFastMutexUnsafe(&MenuObject->MenuItemsLock); + IntUnLockMenuItems(SubMenuObject); + IntLockMenuItems(MenuObject); IntReleaseMenuObject(SubMenuObject); if(sres > (UINT)-1) @@ -1239,18 +1233,18 @@ IntCleanupMenus(struct _EPROCESS *Process, PW32PROCESS Win32Process) KeAttachProcess(Process); } - ExAcquireFastMutexUnsafe(&Win32Process->MenuListLock); + IntLockProcessMenus(Win32Process); while (Win32Process->MenuListHead.Flink != &(Win32Process->MenuListHead) && Win32Process->MenuListHead.Flink != LastHead) { LastHead = Win32Process->MenuListHead.Flink; MenuObject = CONTAINING_RECORD(Win32Process->MenuListHead.Flink, MENU_OBJECT, ListEntry); - ExReleaseFastMutexUnsafe(&Win32Process->MenuListLock); + IntUnLockProcessMenus(Win32Process); IntDestroyMenuObject(MenuObject, FALSE, TRUE); - ExAcquireFastMutexUnsafe(&Win32Process->MenuListLock); + IntLockProcessMenus(Win32Process); } - ExReleaseFastMutexUnsafe(&Win32Process->MenuListLock); + IntUnLockProcessMenus(Win32Process); if (CurrentProcess != Process) { @@ -1283,9 +1277,9 @@ NtUserBuildMenuItemList( if(Buffer) { - ExAcquireFastMutexUnsafe(&MenuObject->MenuItemsLock); + IntLockMenuItems(MenuObject); res = IntBuildMenuItemList(MenuObject, Buffer, nBufSize); - ExReleaseFastMutexUnsafe(&MenuObject->MenuItemsLock); + IntUnLockMenuItems(MenuObject); } else { @@ -1314,9 +1308,9 @@ NtUserCheckMenuItem( SetLastWin32Error(ERROR_INVALID_MENU_HANDLE); return (DWORD)-1; } - ExAcquireFastMutexUnsafe(&MenuObject->MenuItemsLock); + IntLockMenuItems(MenuObject); res = IntCheckMenuItem(MenuObject, uIDCheckItem, uCheck); - ExReleaseFastMutexUnsafe(&MenuObject->MenuItemsLock); + IntUnLockMenuItems(MenuObject); IntReleaseMenuObject(MenuObject); return res; } @@ -1421,9 +1415,9 @@ NtUserEnableMenuItem( SetLastWin32Error(ERROR_INVALID_MENU_HANDLE); return res; } - ExAcquireFastMutexUnsafe(&MenuObject->MenuItemsLock); + IntLockMenuItems(MenuObject); res = IntEnableMenuItem(MenuObject, uIDEnableItem, uEnable); - ExReleaseFastMutexUnsafe(&MenuObject->MenuItemsLock); + IntUnLockMenuItems(MenuObject); IntReleaseMenuObject(MenuObject); return res; @@ -1466,9 +1460,9 @@ NtUserInsertMenuItem( return FALSE; } - ExAcquireFastMutexUnsafe(&MenuObject->MenuItemsLock); + IntLockMenuItems(MenuObject); Res = IntInsertMenuItem(MenuObject, uItem, fByPosition, &ItemInfo); - ExReleaseFastMutexUnsafe(&MenuObject->MenuItemsLock); + IntUnLockMenuItems(MenuObject); IntReleaseMenuObject(MenuObject); return Res; @@ -1505,9 +1499,9 @@ NtUserGetMenuDefaultItem( SetLastWin32Error(ERROR_INVALID_MENU_HANDLE); return res; } - ExAcquireFastMutexUnsafe(&MenuObject->MenuItemsLock); + IntLockMenuItems(MenuObject); res = IntGetMenuDefaultItem(MenuObject, fByPos, gmdiFlags, &gismc); - ExReleaseFastMutexUnsafe(&MenuObject->MenuItemsLock); + IntUnLockMenuItems(MenuObject); IntReleaseMenuObject(MenuObject); return res; } @@ -1586,9 +1580,9 @@ NtUserHiliteMenuItem( } if(WindowObject->IDMenu == (UINT)hmenu) { - ExAcquireFastMutexUnsafe(&MenuObject->MenuItemsLock); + IntLockMenuItems(MenuObject); res = IntHiliteMenuItem(WindowObject, MenuObject, uItemHilite, uHilite); - ExReleaseFastMutexUnsafe(&MenuObject->MenuItemsLock); + IntUnLockMenuItems(MenuObject); } IntReleaseMenuObject(MenuObject); IntReleaseWindowObject(WindowObject); @@ -1697,7 +1691,7 @@ NtUserMenuItemFromPoint( IntReleaseWindowObject(WindowObject); } - ExAcquireFastMutexUnsafe(&MenuObject->MenuItemsLock); + IntLockMenuItems(MenuObject); mi = MenuObject->MenuItemList; for (i = 0; NULL != mi; i++) { @@ -1707,7 +1701,7 @@ NtUserMenuItemFromPoint( } mi = mi->Next; } - ExReleaseFastMutexUnsafe(&MenuObject->MenuItemsLock); + IntUnLockMenuItems(MenuObject); IntReleaseMenuObject(MenuObject); @@ -1857,9 +1851,9 @@ NtUserSetMenuDefaultItem( SetLastWin32Error(ERROR_INVALID_MENU_HANDLE); return FALSE; } - ExAcquireFastMutexUnsafe(&MenuObject->MenuItemsLock); + IntLockMenuItems(MenuObject); res = IntSetMenuDefaultItem(MenuObject, uItem, fByPos); - ExReleaseFastMutexUnsafe(&MenuObject->MenuItemsLock); + IntUnLockMenuItems(MenuObject); IntReleaseMenuObject(MenuObject); return res; diff --git a/reactos/subsys/win32k/ntuser/message.c b/reactos/subsys/win32k/ntuser/message.c index de41ee99cba..3e41db76e32 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.51 2004/02/24 01:30:57 weiden Exp $ +/* $Id: message.c,v 1.52 2004/02/24 13:27:03 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1018,7 +1018,7 @@ NtUserGetQueueStatus(BOOL ClearChanges) Queue = PsGetWin32Thread()->MessageQueue; - ExAcquireFastMutex(&Queue->Lock); + IntLockMessageQueue(Queue); Result = MAKELONG(Queue->ChangedBits, Queue->WakeBits); if (ClearChanges) @@ -1026,7 +1026,7 @@ NtUserGetQueueStatus(BOOL ClearChanges) Queue->ChangedBits = 0; } - ExReleaseFastMutex(&Queue->Lock); + IntUnLockMessageQueue(Queue); return Result; } diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index d83d2726e10..9e14e76f1ee 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.70 2004/02/24 01:30:57 weiden Exp $ +/* $Id: msgqueue.c,v 1.71 2004/02/24 13:27:03 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -68,13 +68,16 @@ static KEVENT HardwareMessageEvent; static PAGED_LOOKASIDE_LIST MessageLookasideList; -/* FUNCTIONS *****************************************************************/ +#define IntLockSystemMessageQueue(OldIrql) \ + KeAcquireSpinLock(&SystemMessageQueueLock, &OldIrql) -/* check the queue status */ -inline BOOL MsqIsSignaled( PUSER_MESSAGE_QUEUE Queue ) -{ - return ((Queue->WakeBits & Queue->WakeMask) || (Queue->ChangedBits & Queue->ChangedMask)); -} +#define IntUnLockSystemMessageQueue(OldIrql) \ + KeReleaseSpinLock(&SystemMessageQueueLock, OldIrql) + +#define IntUnLockSystemHardwareMessageQueueLock(Wait) \ + KeReleaseMutex(&HardwareMessageQueueLock, Wait) + +/* FUNCTIONS *****************************************************************/ /* set some queue bits */ inline VOID MsqSetQueueBits( PUSER_MESSAGE_QUEUE Queue, WORD Bits ) @@ -94,23 +97,23 @@ inline VOID MsqClearQueueBits( PUSER_MESSAGE_QUEUE Queue, WORD Bits ) VOID FASTCALL MsqIncPaintCountQueue(PUSER_MESSAGE_QUEUE Queue) { - ExAcquireFastMutex(&Queue->Lock); + IntLockMessageQueue(Queue); Queue->PaintCount++; Queue->PaintPosted = TRUE; KeSetEvent(&Queue->NewMessages, IO_NO_INCREMENT, FALSE); - ExReleaseFastMutex(&Queue->Lock); + IntUnLockMessageQueue(Queue); } VOID FASTCALL MsqDecPaintCountQueue(PUSER_MESSAGE_QUEUE Queue) { - ExAcquireFastMutex(&Queue->Lock); + IntLockMessageQueue(Queue); Queue->PaintCount--; if (Queue->PaintCount == 0) { Queue->PaintPosted = FALSE; } - ExReleaseFastMutex(&Queue->Lock); + IntUnLockMessageQueue(Queue); } @@ -144,7 +147,7 @@ MsqInsertSystemMessage(MSG* Msg, BOOL RemMouseMoveMsg) KeQueryTickCount(&LargeTickCount); Msg->time = LargeTickCount.u.LowPart; - KeAcquireSpinLock(&SystemMessageQueueLock, &OldIrql); + IntLockSystemMessageQueue(OldIrql); /* only insert WM_MOUSEMOVE messages if not already in system message queue */ if((Msg->message == WM_MOUSEMOVE) && RemMouseMoveMsg) @@ -167,7 +170,7 @@ MsqInsertSystemMessage(MSG* Msg, BOOL RemMouseMoveMsg) { if (SystemMessageQueueCount == SYSTEM_MESSAGE_QUEUE_SIZE) { - KeReleaseSpinLock(&SystemMessageQueueLock, OldIrql); + IntUnLockSystemMessageQueue(OldIrql); return; } SystemMessageQueue[SystemMessageQueueTail] = *Msg; @@ -177,7 +180,7 @@ MsqInsertSystemMessage(MSG* Msg, BOOL RemMouseMoveMsg) (SystemMessageQueueTail + 1) % SYSTEM_MESSAGE_QUEUE_SIZE; SystemMessageQueueCount++; } - KeReleaseSpinLock(&SystemMessageQueueLock, OldIrql); + IntUnLockSystemMessageQueue(OldIrql); KeSetEvent(&HardwareMessageEvent, IO_NO_INCREMENT, FALSE); } @@ -253,7 +256,7 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, Msg == WM_XBUTTONDOWN) { USHORT Hit = WinPosWindowFromPoint(ScopeWin, - Message->Msg.pt, + &Message->Msg.pt, &Window); /* **Make sure that we have a window that is not already in focus @@ -312,7 +315,7 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, } else { - *HitTest = WinPosWindowFromPoint(ScopeWin, Message->Msg.pt, &Window); + *HitTest = WinPosWindowFromPoint(ScopeWin, &Message->Msg.pt, &Window); if(!Window) { /* change the cursor on desktop background */ @@ -346,10 +349,10 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, * old queue */ RemoveEntryList(&Message->ListEntry); } - ExAcquireFastMutex(&Window->MessageQueue->HardwareLock); + IntLockHardwareMessageQueue(Window->MessageQueue); InsertTailList(&Window->MessageQueue->HardwareMessagesListHead, &Message->ListEntry); - ExReleaseFastMutex(&Window->MessageQueue->HardwareLock); + IntUnLockHardwareMessageQueue(Window->MessageQueue); KeSetEvent(&Window->MessageQueue->NewMessages, IO_NO_INCREMENT, FALSE); IntReleaseWindowObject(Window); *Freed = FALSE; @@ -359,10 +362,10 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, if (hWnd != NULL && Window->Self != hWnd && !IntIsChildWindow(hWnd, Window->Self)) { - ExAcquireFastMutex(&Window->MessageQueue->HardwareLock); + IntLockHardwareMessageQueue(Window->MessageQueue); InsertTailList(&Window->MessageQueue->HardwareMessagesListHead, &Message->ListEntry); - ExReleaseFastMutex(&Window->MessageQueue->HardwareLock); + IntUnLockHardwareMessageQueue(Window->MessageQueue); KeSetEvent(&Window->MessageQueue->NewMessages, IO_NO_INCREMENT, FALSE); IntReleaseWindowObject(Window); *Freed = FALSE; @@ -463,7 +466,7 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, while (NT_SUCCESS(WaitStatus) && STATUS_WAIT_0 != WaitStatus); /* Process messages in the message queue itself. */ - ExAcquireFastMutex(&MessageQueue->HardwareLock); + IntLockHardwareMessageQueue(MessageQueue); CurrentEntry = MessageQueue->HardwareMessagesListHead.Flink; while (CurrentEntry != &MessageQueue->HardwareMessagesListHead) { @@ -483,8 +486,8 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, { RemoveEntryList(&Current->ListEntry); } - ExReleaseFastMutex(&MessageQueue->HardwareLock); - KeReleaseMutex(&HardwareMessageQueueLock, FALSE); + IntUnLockHardwareMessageQueue(MessageQueue); + IntUnLockSystemHardwareMessageQueueLock(FALSE); *Message = Current; IntReleaseWindowObject(DesktopWindow); return(TRUE); @@ -494,12 +497,12 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, RemoveEntryList(&Current->ListEntry); } } - ExReleaseFastMutex(&MessageQueue->HardwareLock); + IntUnLockHardwareMessageQueue(MessageQueue); /* Now try the global queue. */ /* Transfer all messages from the DPC accessible queue to the main queue. */ - KeAcquireSpinLock(&SystemMessageQueueLock, &OldIrql); + IntLockSystemMessageQueue(OldIrql); while (SystemMessageQueueCount > 0) { PUSER_MESSAGE UserMsg; @@ -510,13 +513,13 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, SystemMessageQueueHead = (SystemMessageQueueHead + 1) % SYSTEM_MESSAGE_QUEUE_SIZE; SystemMessageQueueCount--; - KeReleaseSpinLock(&SystemMessageQueueLock, OldIrql); + IntUnLockSystemMessageQueue(OldIrql); UserMsg = ExAllocateFromPagedLookasideList(&MessageLookasideList); /* What to do if out of memory? For now we just panic a bit in debug */ ASSERT(UserMsg); UserMsg->Msg = Msg; InsertTailList(&HardwareMessageQueueHead, &UserMsg->ListEntry); - KeAcquireSpinLock(&SystemMessageQueueLock, &OldIrql); + IntLockSystemMessageQueue(OldIrql); } /* * we could set this to -1 conditionally if we find one, but @@ -524,7 +527,7 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, */ SystemMessageQueueMouseMove = -1; HardwareMessageQueueStamp++; - KeReleaseSpinLock(&SystemMessageQueueLock, OldIrql); + IntUnLockSystemMessageQueue(OldIrql); /* Process messages in the queue until we find one to return. */ CurrentEntry = HardwareMessageQueueHead.Flink; @@ -547,13 +550,13 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, if (Accept) { /* Check for no more messages in the system queue. */ - KeAcquireSpinLock(&SystemMessageQueueLock, &OldIrql); + IntLockSystemMessageQueue(OldIrql); if (SystemMessageQueueCount == 0 && IsListEmpty(&HardwareMessageQueueHead)) { KeClearEvent(&HardwareMessageEvent); } - KeReleaseSpinLock(&SystemMessageQueueLock, OldIrql); + IntUnLockSystemMessageQueue(OldIrql); /* If we aren't removing the message then add it to the private @@ -561,12 +564,12 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, */ if (!Remove) { - ExAcquireFastMutex(&MessageQueue->HardwareLock); + IntLockHardwareMessageQueue(MessageQueue); InsertTailList(&MessageQueue->HardwareMessagesListHead, &Current->ListEntry); - ExReleaseFastMutex(&MessageQueue->HardwareLock); + IntUnLockHardwareMessageQueue(MessageQueue); } - KeReleaseMutex(&HardwareMessageQueueLock, FALSE); + IntUnLockSystemHardwareMessageQueueLock(FALSE); *Message = Current; IntReleaseWindowObject(DesktopWindow); return(TRUE); @@ -581,13 +584,13 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, } IntReleaseWindowObject(DesktopWindow); /* Check if the system message queue is now empty. */ - KeAcquireSpinLock(&SystemMessageQueueLock, &OldIrql); + IntLockSystemMessageQueue(OldIrql); if (SystemMessageQueueCount == 0 && IsListEmpty(&HardwareMessageQueueHead)) { KeClearEvent(&HardwareMessageEvent); } - KeReleaseSpinLock(&SystemMessageQueueLock, OldIrql); - KeReleaseMutex(&HardwareMessageQueueLock, FALSE); + IntUnLockSystemMessageQueue(OldIrql); + IntUnLockSystemHardwareMessageQueueLock(FALSE); return(FALSE); } @@ -687,11 +690,11 @@ MsqPostHotKeyMessage(PVOID Thread, HWND hWnd, WPARAM wParam, LPARAM lParam) ObmDereferenceObject(Window); ObDereferenceObject (Thread); -// ExAcquireFastMutex(&pThread->MessageQueue->Lock); +// IntLockMessageQueue(pThread->MessageQueue); // InsertHeadList(&pThread->MessageQueue->PostedMessagesListHead, // &Message->ListEntry); // KeSetEvent(&pThread->MessageQueue->NewMessages, IO_NO_INCREMENT, FALSE); -// ExReleaseFastMutex(&pThread->MessageQueue->Lock); +// IntUnLockMessageQueue(pThread->MessageQueue); } @@ -732,11 +735,11 @@ MsqDispatchSentNotifyMessages(PUSER_MESSAGE_QUEUE MessageQueue) while (!IsListEmpty(&MessageQueue->SentMessagesListHead)) { - ExAcquireFastMutex(&MessageQueue->Lock); + IntLockMessageQueue(MessageQueue); ListEntry = RemoveHeadList(&MessageQueue->SentMessagesListHead); Message = CONTAINING_RECORD(ListEntry, USER_SENT_MESSAGE_NOTIFY, ListEntry); - ExReleaseFastMutex(&MessageQueue->Lock); + IntUnLockMessageQueue(MessageQueue); IntCallSentMessageCallback(Message->CompletionCallback, Message->hWnd, @@ -760,7 +763,7 @@ MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) LRESULT Result; PUSER_SENT_MESSAGE_NOTIFY NotifyMessage; - ExAcquireFastMutex(&MessageQueue->Lock); + IntLockMessageQueue(MessageQueue); if (IsListEmpty(&MessageQueue->SentMessagesListHead)) { ExReleaseFastMutex(&MessageQueue->Lock); @@ -768,7 +771,7 @@ MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) } Entry = RemoveHeadList(&MessageQueue->SentMessagesListHead); Message = CONTAINING_RECORD(Entry, USER_SENT_MESSAGE, ListEntry); - ExReleaseFastMutex(&MessageQueue->Lock); + IntUnLockMessageQueue(MessageQueue); /* Call the window procedure. */ Result = IntSendMessage(Message->Msg.hwnd, @@ -811,11 +814,11 @@ VOID FASTCALL MsqSendNotifyMessage(PUSER_MESSAGE_QUEUE MessageQueue, PUSER_SENT_MESSAGE_NOTIFY NotifyMessage) { - ExAcquireFastMutex(&MessageQueue->Lock); + IntLockMessageQueue(MessageQueue); InsertTailList(&MessageQueue->NotifyMessagesListHead, &NotifyMessage->ListEntry); KeSetEvent(&MessageQueue->NewMessages, IO_NO_INCREMENT, FALSE); - ExReleaseFastMutex(&MessageQueue->Lock); + IntUnLockMessageQueue(MessageQueue); } LRESULT FASTCALL @@ -841,10 +844,10 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, Message->CompletionQueue = NULL; Message->CompletionCallback = NULL; - ExAcquireFastMutex(&MessageQueue->Lock); + IntLockMessageQueue(MessageQueue); InsertTailList(&MessageQueue->SentMessagesListHead, &Message->ListEntry); KeSetEvent(&MessageQueue->NewMessages, IO_NO_INCREMENT, FALSE); - ExReleaseFastMutex(&MessageQueue->Lock); + IntUnLockMessageQueue(MessageQueue); ThreadQueue = PsGetWin32Thread()->MessageQueue; WaitObjects[1] = &ThreadQueue->NewMessages; @@ -866,21 +869,21 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, VOID FASTCALL MsqPostMessage(PUSER_MESSAGE_QUEUE MessageQueue, PUSER_MESSAGE Message) { - ExAcquireFastMutex(&MessageQueue->Lock); + IntLockMessageQueue(MessageQueue); InsertTailList(&MessageQueue->PostedMessagesListHead, &Message->ListEntry); KeSetEvent(&MessageQueue->NewMessages, IO_NO_INCREMENT, FALSE); - ExReleaseFastMutex(&MessageQueue->Lock); + IntUnLockMessageQueue(MessageQueue); } VOID FASTCALL MsqPostQuitMessage(PUSER_MESSAGE_QUEUE MessageQueue, ULONG ExitCode) { - ExAcquireFastMutex(&MessageQueue->Lock); + IntLockMessageQueue(MessageQueue); MessageQueue->QuitPosted = TRUE; MessageQueue->QuitExitCode = ExitCode; KeSetEvent(&MessageQueue->NewMessages, IO_NO_INCREMENT, FALSE); - ExReleaseFastMutex(&MessageQueue->Lock); + IntUnLockMessageQueue(MessageQueue); } BOOLEAN STDCALL @@ -903,7 +906,7 @@ MsqFindMessage(IN PUSER_MESSAGE_QUEUE MessageQueue, Remove, Message)); } - ExAcquireFastMutex(&MessageQueue->Lock); + IntLockMessageQueue(MessageQueue); CurrentEntry = MessageQueue->PostedMessagesListHead.Flink; ListHead = &MessageQueue->PostedMessagesListHead; while (CurrentEntry != ListHead) @@ -919,13 +922,13 @@ MsqFindMessage(IN PUSER_MESSAGE_QUEUE MessageQueue, { RemoveEntryList(&CurrentMessage->ListEntry); } - ExReleaseFastMutex(&MessageQueue->Lock); + IntUnLockMessageQueue(MessageQueue); *Message = CurrentMessage; return(TRUE); } CurrentEntry = CurrentEntry->Flink; } - ExReleaseFastMutex(&MessageQueue->Lock); + IntUnLockMessageQueue(MessageQueue); return(FALSE); } diff --git a/reactos/subsys/win32k/ntuser/painting.c b/reactos/subsys/win32k/ntuser/painting.c index 0111b82f37f..051d8c8eaa2 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.73 2004/02/24 01:30:57 weiden Exp $ + * $Id: painting.c,v 1.74 2004/02/24 13:27:03 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -65,7 +65,7 @@ IntValidateParent(PWINDOW_OBJECT Child, HRGN ValidRegion) { if (!(ParentWindow->Style & WS_CLIPCHILDREN)) { - ExAcquireFastMutex(&ParentWindow->UpdateLock); + IntLockWindowUpdate(ParentWindow); if (ParentWindow->UpdateRegion != 0) { INT OffsetX, OffsetY; @@ -82,7 +82,7 @@ IntValidateParent(PWINDOW_OBJECT Child, HRGN ValidRegion) /* FIXME: If the resulting region is empty, remove fake posted paint message */ NtGdiOffsetRgn(ValidRegion, -OffsetX, -OffsetY); } - ExReleaseFastMutex(&ParentWindow->UpdateLock); + IntUnLockWindowUpdate(ParentWindow); } OldWindow = ParentWindow; ParentWindow = IntGetParentObject(ParentWindow); @@ -107,7 +107,7 @@ IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags) { if (Window->Flags & WINDOWOBJECT_NEED_NCPAINT) { - ExAcquireFastMutex(&Window->UpdateLock); + IntLockWindowUpdate(Window); if (Window->NCUpdateRegion) { IntValidateParent(Window, Window->NCUpdateRegion); @@ -116,7 +116,7 @@ IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags) Window->NCUpdateRegion = NULL; Window->Flags &= ~WINDOWOBJECT_NEED_NCPAINT; MsqDecPaintCountQueue(Window->MessageQueue); - ExReleaseFastMutex(&Window->UpdateLock); + IntUnLockWindowUpdate(Window); IntSendMessage(hWnd, WM_NCPAINT, (WPARAM)TempRegion, 0); } @@ -144,7 +144,7 @@ IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags) Window->Flags & WINDOWOBJECT_NEED_INTERNALPAINT) { IntSendMessage(hWnd, WM_PAINT, 0, 0); - ExAcquireFastMutex(&Window->UpdateLock); + IntLockWindowUpdate(Window); if (Window->Flags & WINDOWOBJECT_NEED_INTERNALPAINT) { Window->Flags &= ~WINDOWOBJECT_NEED_INTERNALPAINT; @@ -153,7 +153,7 @@ IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags) MsqDecPaintCountQueue(Window->MessageQueue); } } - ExReleaseFastMutex(&Window->UpdateLock); + IntUnLockWindowUpdate(Window); } } } @@ -232,7 +232,7 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags) * Save current state of pending updates */ - ExAcquireFastMutex(&Window->UpdateLock); + IntLockWindowUpdate(Window); HadPaintMessage = Window->UpdateRegion != NULL || Window->Flags & WINDOWOBJECT_NEED_INTERNALPAINT; HadNCPaintMessage = Window->Flags & WINDOWOBJECT_NEED_NCPAINT; @@ -399,7 +399,7 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags) MsqIncPaintCountQueue(Window->MessageQueue); } - ExReleaseFastMutex(&Window->UpdateLock); + IntUnLockWindowUpdate(Window); } /* @@ -612,17 +612,17 @@ IntGetPaintMessage(HWND hWnd, PW32THREAD Thread, MSG *Message, #if 0 DPRINT1("PAINTING BUG: Thread marked as containing dirty windows, but no dirty windows found!\n"); #endif - ExAcquireFastMutex(&MessageQueue->Lock); + IntLockMessageQueue(MessageQueue); MessageQueue->PaintPosted = 0; MessageQueue->PaintCount = 0; - ExReleaseFastMutex(&MessageQueue->Lock); + IntUnLockMessageQueue(MessageQueue); return FALSE; } Window = IntGetWindowObject(Message->hwnd); if (Window != NULL) { - ExAcquireFastMutex(&Window->UpdateLock); + IntLockWindowUpdate(Window); if (Window->Flags & WINDOWOBJECT_NEED_NCPAINT) { Message->message = WM_NCPAINT; @@ -648,7 +648,7 @@ IntGetPaintMessage(HWND hWnd, PW32THREAD Thread, MSG *Message, } } } - ExReleaseFastMutex(&Window->UpdateLock); + IntUnLockWindowUpdate(Window); IntReleaseWindowObject(Window); return TRUE; @@ -726,7 +726,7 @@ NtUserBeginPaint(HWND hWnd, PAINTSTRUCT* lPs) return NULL; } - ExAcquireFastMutex(&Window->UpdateLock); + IntLockWindowUpdate(Window); if (Window->UpdateRegion != NULL) { MsqDecPaintCountQueue(Window->MessageQueue); @@ -742,7 +742,7 @@ NtUserBeginPaint(HWND hWnd, PAINTSTRUCT* lPs) { NtUserGetClientRect(Window, &lPs->rcPaint); } - ExReleaseFastMutex(&Window->UpdateLock); + IntUnLockWindowUpdate(Window); if (Window->Flags & WINDOWOBJECT_NEED_ERASEBKGND) { diff --git a/reactos/subsys/win32k/ntuser/prop.c b/reactos/subsys/win32k/ntuser/prop.c index 480f2386dce..fe7c5b0f686 100644 --- a/reactos/subsys/win32k/ntuser/prop.c +++ b/reactos/subsys/win32k/ntuser/prop.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: prop.c,v 1.8 2004/02/22 14:09:51 weiden Exp $ +/* $Id: prop.c,v 1.9 2004/02/24 13:27:03 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -100,7 +100,7 @@ NtUserBuildPropList(HWND hWnd, } /* copy list */ - ExAcquireFastMutexUnsafe(&WindowObject->PropListLock); + IntLockWindowProperties(WindowObject); li = (PROPLISTITEM *)Buffer; ListEntry = WindowObject->PropListHead.Flink; @@ -113,7 +113,7 @@ NtUserBuildPropList(HWND hWnd, Status = MmCopyToCaller(li, &listitem, sizeof(PROPLISTITEM)); if(!NT_SUCCESS(Status)) { - ExReleaseFastMutexUnsafe(&WindowObject->PropListLock); + IntUnLockWindowProperties(WindowObject); IntReleaseWindowObject(WindowObject); return Status; } @@ -124,13 +124,13 @@ NtUserBuildPropList(HWND hWnd, ListEntry = ListEntry->Flink; } - ExReleaseFastMutexUnsafe(&WindowObject->PropListLock); + IntUnLockWindowProperties(WindowObject); } else { - ExAcquireFastMutexUnsafe(&WindowObject->PropListLock); + IntLockWindowProperties(WindowObject); Cnt = WindowObject->PropListItems * sizeof(PROPLISTITEM); - ExReleaseFastMutexUnsafe(&WindowObject->PropListLock); + IntUnLockWindowProperties(WindowObject); } IntReleaseWindowObject(WindowObject); @@ -160,12 +160,12 @@ NtUserRemoveProp(HWND hWnd, ATOM Atom) return NULL; } - ExAcquireFastMutexUnsafe(&WindowObject->PropListLock); + IntLockWindowProperties(WindowObject); Prop = IntGetProp(WindowObject, Atom); if (Prop == NULL) { - ExReleaseFastMutexUnsafe(&WindowObject->PropListLock); + IntUnLockWindowProperties(WindowObject); IntReleaseWindowObject(WindowObject); return(NULL); } @@ -173,7 +173,7 @@ NtUserRemoveProp(HWND hWnd, ATOM Atom) RemoveEntryList(&Prop->PropListEntry); ExFreePool(Prop); WindowObject->PropListItems--; - ExReleaseFastMutexUnsafe(&WindowObject->PropListLock); + IntUnLockWindowProperties(WindowObject); IntReleaseWindowObject(WindowObject); return(Data); } @@ -191,9 +191,9 @@ NtUserGetProp(HWND hWnd, ATOM Atom) return FALSE; } - ExAcquireFastMutexUnsafe(&WindowObject->PropListLock); + IntLockWindowProperties(WindowObject); Prop = IntGetProp(WindowObject, Atom); - ExReleaseFastMutexUnsafe(&WindowObject->PropListLock); + IntUnLockWindowProperties(WindowObject); if (Prop != NULL) { Data = Prop->Data; @@ -238,9 +238,9 @@ NtUserSetProp(HWND hWnd, ATOM Atom, HANDLE Data) return FALSE; } - ExAcquireFastMutexUnsafe(&Wnd->PropListLock); + IntLockWindowProperties(Wnd); ret = IntSetProp(Wnd, Atom, Data); - ExReleaseFastMutexUnsafe(&Wnd->PropListLock); + IntUnLockWindowProperties(Wnd); return ret; } diff --git a/reactos/subsys/win32k/ntuser/timer.c b/reactos/subsys/win32k/ntuser/timer.c index 0fdb492b435..eaf61232b88 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.23 2004/02/19 21:12:09 weiden Exp $ +/* $Id: timer.c,v 1.24 2004/02/24 13:27:03 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -62,6 +62,12 @@ static HANDLE MsgTimerThreadHandle; static CLIENT_ID MsgTimerThreadId; +#define IntLockTimerList \ + ExAcquireFastMutex(&Mutex) + +#define IntUnLockTimerList \ + ExReleaseFastMutex(&Mutex) + /* FUNCTIONS *****************************************************************/ @@ -140,7 +146,7 @@ RemoveTimersThread(HANDLE ThreadID) PMSG_TIMER_ENTRY MsgTimer; PLIST_ENTRY EnumEntry; - ExAcquireFastMutex(&Mutex); + IntLockTimerList; EnumEntry = SysTimerListHead.Flink; while (EnumEntry != &SysTimerListHead) @@ -173,7 +179,7 @@ RemoveTimersThread(HANDLE ThreadID) } } - ExReleaseFastMutex(&Mutex); + IntUnLockTimerList; } UINT_PTR FASTCALL @@ -190,7 +196,7 @@ IntSetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc, B ThreadID = PsGetCurrentThreadId(); KeQuerySystemTime(&CurrentTime); - ExAcquireFastMutex(&Mutex); + IntLockTimerList; if((hWnd == NULL) && !SystemTimer) { @@ -199,12 +205,12 @@ IntSetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc, B if(Index == (ULONG) -1) { - ExReleaseFastMutex(&Mutex); + IntUnLockTimerList; return 0; } HintIndex = ++Index; - ExReleaseFastMutex(&Mutex); + IntUnLockTimerList; return Index; } else @@ -212,15 +218,15 @@ IntSetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc, B WindowObject = IntGetWindowObject(hWnd); if(!WindowObject) { - ExReleaseFastMutex(&Mutex); + IntUnLockTimerList; SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return 0; } if(WindowObject->OwnerThread != PsGetCurrentThread()) { + IntUnLockTimerList; IntReleaseWindowObject(WindowObject); - ExReleaseFastMutex(&Mutex); SetLastWin32Error(ERROR_ACCESS_DENIED); return 0; } @@ -263,7 +269,7 @@ IntSetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc, B NewTimer = ExAllocatePoolWithTag(PagedPool, sizeof(MSG_TIMER_ENTRY), TAG_TIMER); if(!NewTimer) { - ExReleaseFastMutex(&Mutex); + IntUnLockTimerList; SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); return 0; } @@ -322,7 +328,7 @@ IntSetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc, B } } - ExReleaseFastMutex(&Mutex); + IntUnLockTimerList; return Ret; } @@ -333,16 +339,16 @@ IntKillTimer(HWND hWnd, UINT_PTR uIDEvent, BOOL SystemTimer) PMSG_TIMER_ENTRY MsgTimer; PWINDOW_OBJECT WindowObject; - ExAcquireFastMutex(&Mutex); + IntLockTimerList; /* handle-less timer? */ if((hWnd == NULL) && !SystemTimer) { if(!RtlAreBitsSet(&HandleLessTimersBitMap, uIDEvent - 1, 1)) { + IntUnLockTimerList; /* bit was not set */ /* FIXME: set the last error */ - ExReleaseFastMutex(&Mutex); return FALSE; } @@ -353,14 +359,14 @@ IntKillTimer(HWND hWnd, UINT_PTR uIDEvent, BOOL SystemTimer) WindowObject = IntGetWindowObject(hWnd); if(!WindowObject) { - ExReleaseFastMutex(&Mutex); + IntUnLockTimerList; SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return FALSE; } if(WindowObject->OwnerThread != PsGetCurrentThread()) { + IntUnLockTimerList; IntReleaseWindowObject(WindowObject); - ExReleaseFastMutex(&Mutex); SetLastWin32Error(ERROR_ACCESS_DENIED); return FALSE; } @@ -369,7 +375,7 @@ IntKillTimer(HWND hWnd, UINT_PTR uIDEvent, BOOL SystemTimer) MsgTimer = IntRemoveTimer(hWnd, uIDEvent, PsGetCurrentThreadId(), SystemTimer); - ExReleaseFastMutex(&Mutex); + IntUnLockTimerList; if(MsgTimer == NULL) { @@ -409,11 +415,11 @@ TimerThreadMain(PVOID StartContext) KEBUGCHECK(0); } - ExAcquireFastMutex(&Mutex); + ThreadsToDereferenceCount = ThreadsToDereferencePos = 0; + + IntLockTimerList; KeQuerySystemTime(&CurrentTime); - - ThreadsToDereferenceCount = ThreadsToDereferencePos = 0; for (EnumEntry = TimerListHead.Flink; EnumEntry != &TimerListHead; @@ -552,7 +558,7 @@ TimerThreadMain(PVOID StartContext) } } - ExReleaseFastMutex(&Mutex); + IntUnLockTimerList; for (i = 0; i < ThreadsToDereferencePos; i++) ObDereferenceObject(ThreadsToDereference[i]); diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 2a38cc60621..81a172e3ddc 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.191 2004/02/24 01:30:57 weiden Exp $ +/* $Id: window.c,v 1.192 2004/02/24 13:27:03 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -390,9 +390,9 @@ static LRESULT IntDestroyWindow(PWINDOW_OBJECT Window, IntUnlinkWindow(Window); - ExAcquireFastMutexUnsafe (&ThreadData->WindowListLock); + IntLockThreadWindows(ThreadData); RemoveEntryList(&Window->ThreadListEntry); - ExReleaseFastMutexUnsafe (&ThreadData->WindowListLock); + IntUnLockThreadWindows(ThreadData); IntDestroyScrollBar(Window, SB_VERT); IntDestroyScrollBar(Window, SB_HORZ); @@ -482,24 +482,24 @@ DestroyThreadWindows(struct _ETHREAD *Thread) Win32Thread = Thread->Win32Thread; Win32Process = Thread->ThreadsProcess->Win32Process; - ExAcquireFastMutexUnsafe(&Win32Thread->WindowListLock); + IntLockThreadWindows(Win32Thread); LastHead = NULL; while (Win32Thread->WindowListHead.Flink != &(Win32Thread->WindowListHead) && Win32Thread->WindowListHead.Flink != LastHead) { LastHead = Win32Thread->WindowListHead.Flink; Window = CONTAINING_RECORD(Win32Thread->WindowListHead.Flink, WINDOW_OBJECT, ThreadListEntry); - ExReleaseFastMutexUnsafe(&Win32Thread->WindowListLock); + IntUnLockThreadWindows(Win32Thread); WinPosShowWindow(Window->Self, SW_HIDE); IntDestroyWindow(Window, Win32Process, Win32Thread, FALSE); - ExAcquireFastMutexUnsafe(&Win32Thread->WindowListLock); + IntLockThreadWindows(Win32Thread); } if (Win32Thread->WindowListHead.Flink == LastHead) { /* Window at head of list was not removed, should never happen, infinite loop */ KEBUGCHECK(0); } - ExReleaseFastMutexUnsafe(&Win32Thread->WindowListLock); + IntUnLockThreadWindows(Win32Thread); } @@ -1009,7 +1009,7 @@ NtUserBuildHwndList( ObDereferenceObject(Thread); - ExAcquireFastMutex(&HandleTable->ListLock); + ObmpLockHandleTable(HandleTable); Current = HandleTable->ListHead.Flink; while ( Current != &HandleTable->ListHead ) @@ -1031,7 +1031,7 @@ NtUserBuildHwndList( Current = Current->Flink; } - ExReleaseFastMutex(&HandleTable->ListLock); + ObmpUnlockHandleTable(HandleTable); } else { @@ -1383,10 +1383,10 @@ NtUserCreateWindowEx(DWORD dwExStyle, } /* Insert the window into the thread's window list. */ - ExAcquireFastMutexUnsafe (&PsGetWin32Thread()->WindowListLock); + IntLockThreadWindows(PsGetWin32Thread()); InsertTailList (&PsGetWin32Thread()->WindowListHead, &WindowObject->ThreadListEntry); - ExReleaseFastMutexUnsafe (&PsGetWin32Thread()->WindowListLock); + IntUnLockThreadWindows(PsGetWin32Thread()); /* Allocate a DCE for this window. */ if (dwStyle & CS_OWNDC) @@ -1668,14 +1668,14 @@ NtUserDestroyWindow(HWND Wnd) WinPosActivateOtherWindow(Window); } } - ExAcquireFastMutex(&Window->MessageQueue->Lock); + IntLockMessageQueue(Window->MessageQueue); if (Window->MessageQueue->ActiveWindow == Window->Self) Window->MessageQueue->ActiveWindow = NULL; if (Window->MessageQueue->FocusWindow == Window->Self) Window->MessageQueue->FocusWindow = NULL; if (Window->MessageQueue->CaptureWindow == Window->Self) Window->MessageQueue->CaptureWindow = NULL; - ExReleaseFastMutex(&Window->MessageQueue->Lock); + IntUnLockMessageQueue(Window->MessageQueue); /* Call hooks */ #if 0 /* FIXME */ @@ -2858,7 +2858,7 @@ NtUserGetWindowPlacement(HWND hWnd, Size.x = WindowObject->WindowRect.left; Size.y = WindowObject->WindowRect.top; - InternalPos = WinPosInitInternalPos(WindowObject, Size, + InternalPos = WinPosInitInternalPos(WindowObject, &Size, &WindowObject->WindowRect); if (InternalPos) { @@ -3373,7 +3373,7 @@ NtUserWindowFromPoint(LONG X, LONG Y) pt.x = X; pt.y = Y; - Hit = WinPosWindowFromPoint(DesktopWindow, pt, &Window); + Hit = WinPosWindowFromPoint(DesktopWindow, &pt, &Window); if(Window) { diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index 7e0c759d1cf..74e54143660 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.98 2004/02/24 01:30:58 weiden Exp $ +/* $Id: winpos.c,v 1.99 2004/02/24 13:27:03 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -178,7 +178,7 @@ WinPosFindIconPos(HWND hWnd, POINT *Pos) } PINTERNALPOS FASTCALL -WinPosInitInternalPos(PWINDOW_OBJECT WindowObject, POINT pt, PRECT RestoreRect) +WinPosInitInternalPos(PWINDOW_OBJECT WindowObject, POINT *pt, PRECT RestoreRect) { PWINDOW_OBJECT Parent; INT XInc, YInc; @@ -233,11 +233,11 @@ WinPosInitInternalPos(PWINDOW_OBJECT WindowObject, POINT pt, PRECT RestoreRect) } if (WindowObject->Style & WS_MINIMIZE) { - WindowObject->InternalPos->IconPos = pt; + WindowObject->InternalPos->IconPos = *pt; } else if (WindowObject->Style & WS_MAXIMIZE) { - WindowObject->InternalPos->MaxPos = pt; + WindowObject->InternalPos->MaxPos = *pt; } else if (RestoreRect != NULL) { @@ -255,7 +255,7 @@ WinPosMinMaximize(PWINDOW_OBJECT WindowObject, UINT ShowFlag, RECT* NewPos) Size.x = WindowObject->WindowRect.left; Size.y = WindowObject->WindowRect.top; - InternalPos = WinPosInitInternalPos(WindowObject, Size, + InternalPos = WinPosInitInternalPos(WindowObject, &Size, &WindowObject->WindowRect); if (InternalPos) @@ -1357,12 +1357,12 @@ WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, POINT *Point, } USHORT FASTCALL -WinPosWindowFromPoint(PWINDOW_OBJECT ScopeWin, POINT WinPoint, +WinPosWindowFromPoint(PWINDOW_OBJECT ScopeWin, POINT *WinPoint, PWINDOW_OBJECT* Window) { HWND DesktopWindowHandle; PWINDOW_OBJECT DesktopWindow; - POINT Point = WinPoint; + POINT Point = *WinPoint; USHORT HitTest; *Window = NULL; @@ -1417,7 +1417,7 @@ NtUserGetMinMaxInfo( Size.x = Window->WindowRect.left; Size.y = Window->WindowRect.top; - InternalPos = WinPosInitInternalPos(Window, Size, + InternalPos = WinPosInitInternalPos(Window, &Size, &Window->WindowRect); if(InternalPos) { diff --git a/reactos/subsys/win32k/objects/color.c b/reactos/subsys/win32k/objects/color.c index d1276acc9a3..22599ca7aeb 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.33 2004/01/16 19:32:00 gvg Exp $ */ +/* $Id: color.c,v 1.34 2004/02/24 13:27:03 weiden Exp $ */ // FIXME: Use PXLATEOBJ logicalToSystem instead of int *mapping @@ -31,6 +31,7 @@ #include <win32k/ntuser.h> #include "../eng/handle.h" #include <include/inteng.h> +#include <include/eng.h> #include <include/color.h> #include <include/palette.h> #include <include/error.h> @@ -333,9 +334,9 @@ UINT STDCALL NtGdiRealizePalette(HDC hDC) } else { if(SurfGDI->SetPalette) { - ExAcquireFastMutex(SurfGDI->DriverLock); + IntLockGDIDriver(SurfGDI); success = SurfGDI->SetPalette(dc->PDev, sysPtr, 0, 0, sysGDI->NumColors); - ExReleaseFastMutex(SurfGDI->DriverLock); + IntUnLockGDIDriver(SurfGDI); } } diff --git a/reactos/subsys/win32k/objects/cursoricon.c b/reactos/subsys/win32k/objects/cursoricon.c index f83e739bf27..13823645022 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.47 2004/02/10 23:40:01 gvg Exp $ */ +/* $Id: cursoricon.c,v 1.48 2004/02/24 13:27:03 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -146,9 +146,9 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, if (NULL != CurInfo->CurrentCursorObject && CurInfo->ShowingCursor) { /* Remove the cursor if it was displayed */ - ExAcquireFastMutex(SurfGDI->DriverLock); + IntLockGDIDriver(SurfGDI); SurfGDI->MovePointer(SurfObj, -1, -1, &PointerRect); - ExReleaseFastMutex(SurfGDI->DriverLock); + IntUnLockGDIDriver(SurfGDI); SetPointerRect(CurInfo, &PointerRect); } @@ -220,7 +220,7 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, CurInfo->CurrentCursorObject = NULL; } - ExAcquireFastMutex(SurfGDI->DriverLock); + IntLockGDIDriver(SurfGDI); SurfGDI->PointerStatus = SurfGDI->SetPointerShape(SurfObj, soMask, soColor, XlateObj, NewCursor->IconInfo.xHotspot, NewCursor->IconInfo.yHotspot, @@ -228,7 +228,7 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, CurInfo->y, &PointerRect, SPS_CHANGE); - ExReleaseFastMutex(SurfGDI->DriverLock); + IntUnLockGDIDriver(SurfGDI); if(SurfGDI->PointerStatus == SPS_DECLINE) { @@ -287,7 +287,7 @@ IntFindExistingCurIconObject(PWINSTATION_OBJECT WinStaObject, HMODULE hModule, ULONG i; HandleTable = (PUSER_HANDLE_TABLE)WinStaObject->SystemCursor.CurIconHandleTable; - ExAcquireFastMutex(&HandleTable->ListLock); + ObmpLockHandleTable(HandleTable); CurrentEntry = HandleTable->ListHead.Flink; while(CurrentEntry != &HandleTable->ListHead) @@ -303,14 +303,14 @@ IntFindExistingCurIconObject(PWINSTATION_OBJECT WinStaObject, HMODULE hModule, continue; } ObmReferenceObject(Object); - ExReleaseFastMutex(&HandleTable->ListLock); + ObmpUnlockHandleTable(HandleTable); return Object; } } CurrentEntry = CurrentEntry->Flink; } - ExReleaseFastMutex(&HandleTable->ListLock); + ObmpUnlockHandleTable(HandleTable); return NULL; } @@ -334,9 +334,9 @@ IntCreateCurIconHandle(PWINSTATION_OBJECT WinStaObject) Win32Process = PsGetWin32Process(); - ExAcquireFastMutex(&Win32Process->CursorIconListLock); + IntLockProcessCursorIcons(Win32Process); InsertTailList(&Win32Process->CursorIconListHead, &Object->ListEntry); - ExReleaseFastMutex(&Win32Process->CursorIconListLock); + IntUnLockProcessCursorIcons(Win32Process); Object->Self = Handle; Object->Process = PsGetWin32Process(); @@ -373,9 +373,9 @@ IntDestroyCurIconObject(PWINSTATION_OBJECT WinStaObject, HANDLE Handle, BOOL Rem if(Object->Process && RemoveFromProcess) { - ExAcquireFastMutex(&Object->Process->CursorIconListLock); + IntLockProcessCursorIcons(Object->Process); RemoveEntryList(&Object->ListEntry); - ExReleaseFastMutex(&Object->Process->CursorIconListLock); + IntUnLockProcessCursorIcons(Object->Process); } ObmDereferenceObject(Object); @@ -401,7 +401,7 @@ IntCleanupCurIcons(struct _EPROCESS *Process, PW32PROCESS Win32Process) if(!(WinStaObject = Win32Process->WindowStation)) return; - ExAcquireFastMutex(&Win32Process->CursorIconListLock); + IntLockProcessCursorIcons(Win32Process); CurrentEntry = Win32Process->CursorIconListHead.Flink; while(CurrentEntry != &Win32Process->CursorIconListHead) { @@ -411,7 +411,7 @@ IntCleanupCurIcons(struct _EPROCESS *Process, PW32PROCESS Win32Process) IntDestroyCurIconObject(WinStaObject, Current->Self, FALSE); CurrentEntry = NextEntry; } - ExReleaseFastMutex(&Win32Process->CursorIconListLock); + IntUnLockProcessCursorIcons(Win32Process); } /* diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index bf0af9fc751..d8c44b7e09b 100644 --- a/reactos/subsys/win32k/objects/text.c +++ b/reactos/subsys/win32k/objects/text.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: text.c,v 1.77 2004/02/22 08:35:21 navaraf Exp $ */ +/* $Id: text.c,v 1.78 2004/02/24 13:27:03 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -184,9 +184,9 @@ IntGdiAddFontResource(PUNICODE_STRING Filename, DWORD fl) ZwClose(FileHandle); - ExAcquireFastMutex(&FreeTypeLock); + IntLockFreeType; error = FT_New_Memory_Face(library, buffer, size, 0, &face); - ExReleaseFastMutex(&FreeTypeLock); + IntUnLockFreeType; if (error == FT_Err_Unknown_File_Format) { DPRINT1("Unknown font file format\n"); @@ -226,17 +226,17 @@ IntGdiAddFontResource(PUNICODE_STRING Filename, DWORD fl) { PW32PROCESS Win32Process = PsGetWin32Process(); - ExAcquireFastMutex(&Win32Process->PrivateFontListLock); + IntLockProcessPrivateFonts(Win32Process); InsertTailList(&Win32Process->PrivateFontListHead, &entry->ListEntry); FontsLoaded++; - ExReleaseFastMutex(&Win32Process->PrivateFontListLock); + IntUnLockProcessPrivateFonts(Win32Process); } else { - ExAcquireFastMutex(&FontListLock); + IntLockGlobalFonts; InsertTailList(&FontListHead, &entry->ListEntry); FontsLoaded++; - ExReleaseFastMutex(&FontListLock); + IntUnLockGlobalFonts; } return 1; @@ -637,9 +637,9 @@ NtGdiExtTextOut( } if (!found) DPRINT1("WARNING: Could not find desired charmap!\n"); - ExAcquireFastMutex(&FreeTypeLock); + IntLockFreeType; error = FT_Set_Charmap(face, found); - ExReleaseFastMutex(&FreeTypeLock); + IntUnLockFreeType; if (error) DPRINT1("WARNING: Could not set the charmap!\n"); } @@ -650,7 +650,7 @@ NtGdiExtTextOut( else RenderMode = FT_RENDER_MODE_MONO; - ExAcquireFastMutex(&FreeTypeLock); + IntLockFreeType; error = FT_Set_Pixel_Sizes( face, /* FIXME should set character height if neg */ @@ -658,7 +658,7 @@ NtGdiExtTextOut( - TextObj->logfont.lfHeight : TextObj->logfont.lfHeight), TextObj->logfont.lfWidth); - ExReleaseFastMutex(&FreeTypeLock); + IntUnLockFreeType; if (error) { DPRINT1("Error in setting pixel sizes: %u\n", error); @@ -752,10 +752,10 @@ NtGdiExtTextOut( for (i = 0; i < Count; i++) { - ExAcquireFastMutex(&FreeTypeLock); + IntLockFreeType; glyph_index = FT_Get_Char_Index(face, *TempText); error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT); - ExReleaseFastMutex(&FreeTypeLock); + IntUnLockFreeType; if (error) { @@ -768,9 +768,9 @@ NtGdiExtTextOut( if (use_kerning && previous && glyph_index) { FT_Vector delta; - ExAcquireFastMutex(&FreeTypeLock); + IntLockFreeType; FT_Get_Kerning(face, previous, glyph_index, 0, &delta); - ExReleaseFastMutex(&FreeTypeLock); + IntUnLockFreeType; TextWidth += delta.x >> 6; } @@ -802,10 +802,10 @@ NtGdiExtTextOut( for (i = 0; i < Count; i++) { - ExAcquireFastMutex(&FreeTypeLock); + IntLockFreeType; glyph_index = FT_Get_Char_Index(face, *String); error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT); - ExReleaseFastMutex(&FreeTypeLock); + IntUnLockFreeType; if (error) { @@ -821,17 +821,17 @@ NtGdiExtTextOut( if (use_kerning && previous && glyph_index) { FT_Vector delta; - ExAcquireFastMutex(&FreeTypeLock); + IntLockFreeType; FT_Get_Kerning(face, previous, glyph_index, 0, &delta); - ExReleaseFastMutex(&FreeTypeLock); + IntUnLockFreeType; TextLeft += delta.x >> 6; } if (glyph->format == ft_glyph_format_outline) { - ExAcquireFastMutex(&FreeTypeLock); + IntLockFreeType; error = FT_Render_Glyph(glyph, RenderMode); - ExReleaseFastMutex(&FreeTypeLock); + IntUnLockFreeType; if (error) { EngDeleteXlate(XlateObj); @@ -1054,12 +1054,12 @@ NtGdiGetCharWidth32(HDC hDC, return FALSE; } - ExAcquireFastMutex(&FreeTypeLock); + IntLockFreeType; FT_Set_Charmap(face, found); - ExReleaseFastMutex(&FreeTypeLock); + IntUnLockFreeType; } - ExAcquireFastMutex(&FreeTypeLock); + IntLockFreeType; FT_Set_Pixel_Sizes(face, /* FIXME should set character height if neg */ (TextObj->logfont.lfHeight < 0 ? @@ -1073,7 +1073,7 @@ NtGdiGetCharWidth32(HDC hDC, FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT); SafeBuffer[i] = face->glyph->advance.x >> 6; } - ExReleaseFastMutex(&FreeTypeLock); + IntUnLockFreeType; TEXTOBJ_UnlockText(dc->w.hFont); MmCopyToCaller(Buffer, SafeBuffer, BufferSize); ExFreePool(SafeBuffer); @@ -1201,23 +1201,23 @@ TextIntGetTextExtentPoint(HDC hDC, DPRINT1("WARNING: Could not find desired charmap!\n"); } - ExAcquireFastMutex(&FreeTypeLock); + IntLockFreeType; error = FT_Set_Charmap(face, found); - ExReleaseFastMutex(&FreeTypeLock); + IntUnLockFreeType; if (error) { DPRINT1("WARNING: Could not set the charmap!\n"); } } - ExAcquireFastMutex(&FreeTypeLock); + 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); - ExReleaseFastMutex(&FreeTypeLock); + IntUnLockFreeType; if (error) { DPRINT1("Error in setting pixel sizes: %u\n", error); @@ -1228,10 +1228,10 @@ TextIntGetTextExtentPoint(HDC hDC, for (i = 0; i < Count; i++) { - ExAcquireFastMutex(&FreeTypeLock); + IntLockFreeType; glyph_index = FT_Get_Char_Index(face, *String); error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT); - ExReleaseFastMutex(&FreeTypeLock); + IntUnLockFreeType; if (error) { DPRINT1("WARNING: Failed to load and render glyph! [index: %u]\n", glyph_index); @@ -1242,9 +1242,9 @@ TextIntGetTextExtentPoint(HDC hDC, if (use_kerning && previous && glyph_index) { FT_Vector delta; - ExAcquireFastMutex(&FreeTypeLock); + IntLockFreeType; FT_Get_Kerning(face, previous, glyph_index, 0, &delta); - ExReleaseFastMutex(&FreeTypeLock); + IntUnLockFreeType; TotalWidth += delta.x >> 6; } @@ -1536,14 +1536,14 @@ NtGdiGetTextMetrics(HDC hDC, if (NT_SUCCESS(Status)) { Face = FontGDI->face; - ExAcquireFastMutex(&FreeTypeLock); + 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); - ExReleaseFastMutex(&FreeTypeLock); + IntUnLockFreeType; if (0 != Error) { DPRINT1("Error in setting pixel sizes: %u\n", Error); @@ -1552,9 +1552,9 @@ NtGdiGetTextMetrics(HDC hDC, else { memcpy(&SafeTm, &FontGDI->TextMetric, sizeof(TEXTMETRICW)); - ExAcquireFastMutex(&FreeTypeLock); + IntLockFreeType; pOS2 = FT_Get_Sfnt_Table(Face, ft_sfnt_os2); - ExReleaseFastMutex(&FreeTypeLock); + IntUnLockFreeType; if (NULL == pOS2) { DPRINT1("Can't find OS/2 table - not TT font?\n"); @@ -1695,7 +1695,7 @@ TextIntRealizeFont(HFONT FontHandle) /* find font in private fonts */ Win32Process = PsGetWin32Process(); - ExAcquireFastMutex(&Win32Process->PrivateFontListLock); + IntLockProcessPrivateFonts(Win32Process); Entry = Win32Process->PrivateFontListHead.Flink; while(Entry != &Win32Process->PrivateFontListHead) @@ -1710,10 +1710,10 @@ TextIntRealizeFont(HFONT FontHandle) } Entry = Entry->Flink; } - ExReleaseFastMutex(&Win32Process->PrivateFontListLock); + IntUnLockProcessPrivateFonts(Win32Process); /* find font in system fonts */ - ExAcquireFastMutex(&FontListLock); + IntLockGlobalFonts; Entry = FontListHead.Flink; while(Entry != &FontListHead) @@ -1749,7 +1749,10 @@ TextIntRealizeFont(HFONT FontHandle) } - ExReleaseFastMutex((Private ? &Win32Process->PrivateFontListLock : &FontListLock)); + if(Private) + IntUnLockProcessPrivateFonts(Win32Process); + else + IntUnLockGlobalFonts; ASSERT(! NT_SUCCESS(Status) || NULL != TextObj->GDIFontHandle); From e7282af976d1c07d36897746284470e03d7d81ed Mon Sep 17 00:00:00 2001 From: Vizzini <vizzini@plasmic.com> Date: Tue, 24 Feb 2004 15:42:06 +0000 Subject: [PATCH 0161/1463] patch by Michael Fritscher to get Mspaint closer to working svn path=/trunk/; revision=8351 --- reactos/lib/msvcrt/msvcrt.def | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/msvcrt/msvcrt.def b/reactos/lib/msvcrt/msvcrt.def index 07b86ba84f0..74b7b691f57 100644 --- a/reactos/lib/msvcrt/msvcrt.def +++ b/reactos/lib/msvcrt/msvcrt.def @@ -1,4 +1,4 @@ -; $Id: msvcrt.def,v 1.29 2004/01/01 17:08:38 sedwards Exp $ +; $Id: msvcrt.def,v 1.30 2004/02/24 15:42:06 vizzini Exp $ ; ; ReactOS MSVCRT Compatibility Library ; @@ -126,9 +126,9 @@ __iscsymf __mb_cur_max DATA __p___argc __p___argv +__p___wargv __p___initenv __p___mb_cur_max -;__p___wargv ;__p___winitenv __p__acmdln ;__p__amblksiz From aec334c343dffaa51168a914f7ede0fcbd4f9931 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Tue, 24 Feb 2004 15:56:53 +0000 Subject: [PATCH 0162/1463] fixed WindowFromPoint() to send WM_NCHITTEST messages to windows that belong to the current process. svn path=/trunk/; revision=8352 --- reactos/subsys/win32k/include/winpos.h | 2 +- reactos/subsys/win32k/ntuser/msgqueue.c | 8 +++----- reactos/subsys/win32k/ntuser/window.c | 4 ++-- reactos/subsys/win32k/ntuser/winpos.c | 14 ++++++++------ 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/reactos/subsys/win32k/include/winpos.h b/reactos/subsys/win32k/include/winpos.h index c4e9f469d8a..0113b37c48b 100644 --- a/reactos/subsys/win32k/include/winpos.h +++ b/reactos/subsys/win32k/include/winpos.h @@ -20,7 +20,7 @@ WinPosSetWindowPos(HWND Wnd, HWND WndInsertAfter, INT x, INT y, INT cx, BOOLEAN FASTCALL WinPosShowWindow(HWND Wnd, INT Cmd); USHORT FASTCALL -WinPosWindowFromPoint(PWINDOW_OBJECT ScopeWin, POINT *WinPoint, +WinPosWindowFromPoint(PWINDOW_OBJECT ScopeWin, BOOL SendProcHitTests, POINT *WinPoint, PWINDOW_OBJECT* Window); VOID FASTCALL WinPosActivateOtherWindow(PWINDOW_OBJECT Window); diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index 9e14e76f1ee..1a83f53e431 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.71 2004/02/24 13:27:03 weiden Exp $ +/* $Id: msgqueue.c,v 1.72 2004/02/24 15:56:52 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -255,9 +255,7 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, Msg == WM_RBUTTONDOWN || Msg == WM_XBUTTONDOWN) { - USHORT Hit = WinPosWindowFromPoint(ScopeWin, - &Message->Msg.pt, - &Window); + USHORT Hit = WinPosWindowFromPoint(ScopeWin, FALSE, &Message->Msg.pt, &Window); /* **Make sure that we have a window that is not already in focus */ @@ -315,7 +313,7 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, } else { - *HitTest = WinPosWindowFromPoint(ScopeWin, &Message->Msg.pt, &Window); + *HitTest = WinPosWindowFromPoint(ScopeWin, FALSE, &Message->Msg.pt, &Window); if(!Window) { /* change the cursor on desktop background */ diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 81a172e3ddc..6bad046cb90 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.192 2004/02/24 13:27:03 weiden Exp $ +/* $Id: window.c,v 1.193 2004/02/24 15:56:52 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -3373,7 +3373,7 @@ NtUserWindowFromPoint(LONG X, LONG Y) pt.x = X; pt.y = Y; - Hit = WinPosWindowFromPoint(DesktopWindow, &pt, &Window); + Hit = WinPosWindowFromPoint(DesktopWindow, TRUE, &pt, &Window); if(Window) { diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index 74e54143660..d0a541d2573 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.99 2004/02/24 13:27:03 weiden Exp $ +/* $Id: winpos.c,v 1.100 2004/02/24 15:56:53 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1277,7 +1277,7 @@ WinPosShowWindow(HWND Wnd, INT Cmd) } BOOL STATIC FASTCALL -WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, POINT *Point, +WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, BOOL SendProcHitTests, POINT *Point, PWINDOW_OBJECT* Window, USHORT *HitTest) { PWINDOW_OBJECT Current; @@ -1314,7 +1314,9 @@ WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, POINT *Point, return TRUE; } - if(Current->MessageQueue == PsGetWin32Thread()->MessageQueue) + if((SendProcHitTests && + (Current->OwnerThread->ThreadsProcess == PsGetCurrentProcess())) || + (Current->MessageQueue == PsGetWin32Thread()->MessageQueue)) { *HitTest = IntSendMessage(Current->Self, WM_NCHITTEST, 0, MAKELONG(Point->x, Point->y)); @@ -1334,7 +1336,7 @@ WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, POINT *Point, Point->y < Current->ClientRect.bottom) { USHORT ChildHitTest; - if(WinPosSearchChildren(Current, Point, Window, &ChildHitTest)) + if(WinPosSearchChildren(Current, SendProcHitTests, Point, Window, &ChildHitTest)) { *HitTest = ChildHitTest; ExFreePool(List); @@ -1357,7 +1359,7 @@ WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, POINT *Point, } USHORT FASTCALL -WinPosWindowFromPoint(PWINDOW_OBJECT ScopeWin, POINT *WinPoint, +WinPosWindowFromPoint(PWINDOW_OBJECT ScopeWin, BOOL SendProcHitTests, POINT *WinPoint, PWINDOW_OBJECT* Window) { HWND DesktopWindowHandle; @@ -1387,7 +1389,7 @@ WinPosWindowFromPoint(PWINDOW_OBJECT ScopeWin, POINT *WinPoint, IntReleaseWindowObject(DesktopWindow); } - if(WinPosSearchChildren(ScopeWin, &Point, Window, &HitTest)) + if(WinPosSearchChildren(ScopeWin, SendProcHitTests, &Point, Window, &HitTest)) { return HitTest; } From f276f1c016864c4d95837a8a825ddfa46346c46f Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Tue, 24 Feb 2004 20:00:16 +0000 Subject: [PATCH 0163/1463] - launch task manager - set foregroundwindow when opening start menu (CTRL-ESC shortcut) svn path=/trunk/; revision=8354 --- reactos/subsys/system/explorer/explorer_intres.h | 5 +++-- reactos/subsys/system/explorer/explorer_intres.rc | 1 + reactos/subsys/system/explorer/taskbar/desktopbar.cpp | 4 ++++ reactos/subsys/system/explorer/taskbar/startmenu.cpp | 1 + 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/system/explorer/explorer_intres.h b/reactos/subsys/system/explorer/explorer_intres.h index 637fe933f95..870b0fb030a 100644 --- a/reactos/subsys/system/explorer/explorer_intres.h +++ b/reactos/subsys/system/explorer/explorer_intres.h @@ -136,7 +136,8 @@ #define ID_STOP 40009 #define ID_MINIMIZE_ALL 40010 #define ID_EXPLORE 40011 -#define ID_SWITCH_DESKTOP_1 40012 +#define ID_SWITCH_DESKTOP_1 50000 +#define ID_TASKMGR 40012 #define ID_WINDOW_NEW 0xE130 #define ID_WINDOW_ARRANGE 0xE131 #define ID_WINDOW_CASCADE 0xE132 @@ -154,7 +155,7 @@ #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 161 -#define _APS_NEXT_COMMAND_VALUE 40015 +#define _APS_NEXT_COMMAND_VALUE 40013 #define _APS_NEXT_CONTROL_VALUE 1003 #define _APS_NEXT_SYMED_VALUE 101 #endif diff --git a/reactos/subsys/system/explorer/explorer_intres.rc b/reactos/subsys/system/explorer/explorer_intres.rc index 8a4e9997dc5..60ba1e3ca48 100644 --- a/reactos/subsys/system/explorer/explorer_intres.rc +++ b/reactos/subsys/system/explorer/explorer_intres.rc @@ -669,6 +669,7 @@ BEGIN BEGIN MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER MENUITEM "&Settings...", ID_DESKTOPBAR_SETTINGS + MENUITEM "&Task Manager...", ID_TASKMGR END END diff --git a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp index 9fb01218fe3..759d7d2fc9d 100644 --- a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp @@ -245,6 +245,10 @@ int DesktopBar::Command(int id, int code) explorer_show_frame(SW_SHOWNORMAL); break; + case ID_TASKMGR: + launch_file(_hwnd, TEXT("taskmgr.exe"), SW_SHOWNORMAL); + break; + case ID_SWITCH_DESKTOP_1: case ID_SWITCH_DESKTOP_1+1: case ID_SWITCH_DESKTOP_1+2: diff --git a/reactos/subsys/system/explorer/taskbar/startmenu.cpp b/reactos/subsys/system/explorer/taskbar/startmenu.cpp index 26d3c658f87..611f0cc4396 100644 --- a/reactos/subsys/system/explorer/taskbar/startmenu.cpp +++ b/reactos/subsys/system/explorer/taskbar/startmenu.cpp @@ -1360,6 +1360,7 @@ void StartMenuRoot::TrackStartmenu() // show previously hidden start menu ShowWindow(hwnd, SW_SHOW); + SetForegroundWindow(hwnd); while(IsWindow(hwnd)) { if (!GetMessage(&msg, 0, 0, 0)) { From 7db5e43a17a9d5f529b15dea351e6b5f4753986c Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Tue, 24 Feb 2004 21:25:41 +0000 Subject: [PATCH 0164/1463] added /KDNOECHO parameter to disable serial echo by default in kdgb svn path=/trunk/; revision=8355 --- reactos/ntoskrnl/dbg/kdb.c | 6 ++++-- reactos/ntoskrnl/include/internal/kd.h | 3 ++- reactos/ntoskrnl/kd/kdebug.c | 8 +++++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/reactos/ntoskrnl/dbg/kdb.c b/reactos/ntoskrnl/dbg/kdb.c index 4e5fb149c3e..1b95b1762fd 100644 --- a/reactos/ntoskrnl/dbg/kdb.c +++ b/reactos/ntoskrnl/dbg/kdb.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: kdb.c,v 1.17 2004/01/17 17:13:13 arty Exp $ +/* $Id: kdb.c,v 1.18 2004/02/24 21:25:40 weiden Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/dbg/kdb.c @@ -206,7 +206,9 @@ KdbGetCommand(PCH Buffer) { CHAR Key; PCH Orig = Buffer; - + + KbdEchoOn = !((KdDebugState & KD_DEBUG_KDNOECHO) != 0); + for (;;) { if (KdDebugState & KD_DEBUG_KDSERIAL) diff --git a/reactos/ntoskrnl/include/internal/kd.h b/reactos/ntoskrnl/include/internal/kd.h index c580e4262b5..dd0112f35a3 100644 --- a/reactos/ntoskrnl/include/internal/kd.h +++ b/reactos/ntoskrnl/include/internal/kd.h @@ -1,4 +1,4 @@ -/* $Id: kd.h,v 1.22 2004/01/17 17:13:13 arty Exp $ +/* $Id: kd.h,v 1.23 2004/02/24 21:25:41 weiden Exp $ * * kernel debugger prototypes */ @@ -19,6 +19,7 @@ #define KD_DEBUG_MDA 0x40 #define KD_DEBUG_KDB 0x80 #define KD_DEBUG_KDSERIAL 0x100 +#define KD_DEBUG_KDNOECHO 0x200 extern ULONG KdDebugState; diff --git a/reactos/ntoskrnl/kd/kdebug.c b/reactos/ntoskrnl/kd/kdebug.c index be7cd40ff4c..67cd35774ef 100644 --- a/reactos/ntoskrnl/kd/kdebug.c +++ b/reactos/ntoskrnl/kd/kdebug.c @@ -1,4 +1,4 @@ -/* $Id: kdebug.c,v 1.50 2004/01/05 14:28:20 weiden Exp $ +/* $Id: kdebug.c,v 1.51 2004/02/24 21:25:41 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -160,6 +160,12 @@ KdInitSystem(ULONG Reserved, KdDebuggerEnabled = TRUE; KdDebugState |= KD_DEBUG_SERIAL | KD_DEBUG_KDSERIAL; } + else if (!_strnicmp(p2, "KDNOECHO", 8)) + { + p2 += 8; + KdDebuggerEnabled = TRUE; + KdDebugState |= KD_DEBUG_KDNOECHO; + } else if (!_strnicmp(p2, "DEBUG", 5)) { p2 += 5; From 4438a2a27ccf68572edded9e8984f6e0981937ea Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Tue, 24 Feb 2004 22:15:43 +0000 Subject: [PATCH 0165/1463] fixed more GDI handle leaks svn path=/trunk/; revision=8357 --- .../system/explorer/taskbar/taskbar.cpp | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/system/explorer/taskbar/taskbar.cpp b/reactos/subsys/system/explorer/taskbar/taskbar.cpp index 578e66b66e0..a4c1a244f1b 100644 --- a/reactos/subsys/system/explorer/taskbar/taskbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/taskbar.cpp @@ -274,8 +274,14 @@ BOOL CALLBACK TaskBar::EnumWndProc(HWND hwnd, LPARAM lparam) if (!last_id) found->second._id = pThis->_next_id++; } else { + HBITMAP hbmp; HICON hIcon = get_window_icon(hwnd); - HBITMAP hbmp = hIcon? create_bitmap_from_icon(hIcon, GetSysColorBrush(COLOR_BTNFACE), WindowCanvas(pThis->_htoolbar)): 0; + + if (hIcon) { + hbmp = create_bitmap_from_icon(hIcon, GetSysColorBrush(COLOR_BTNFACE), WindowCanvas(pThis->_htoolbar)); + DestroyIcon(hIcon); // some icons can be freed, some not - so ignore any error return of DestroyIcon() + } else + hbmp = 0; TBADDBITMAP ab = {0, (UINT_PTR)hbmp}; int bmp_idx = SendMessage(pThis->_htoolbar, TB_ADDBITMAP, 1, (LPARAM)&ab); @@ -358,6 +364,7 @@ void TaskBar::Refresh() //EnumDesktopWindows(GetThreadDesktop(GetCurrentThreadId()), EnumWndProc, (LPARAM)_htoolbar); set<int> btn_idx_to_delete; + set<HBITMAP> hbmp_to_delete; for(TaskBarMap::iterator it=_map.begin(); it!=_map.end(); ++it) { TaskBarEntry& entry = it->second; @@ -365,6 +372,7 @@ void TaskBar::Refresh() if (!entry._used && entry._id) { // store button indexes to remove btn_idx_to_delete.insert(entry._btn_idx); + hbmp_to_delete.insert(entry._hbmp); entry._id = 0; } } @@ -385,6 +393,21 @@ void TaskBar::Refresh() } } + for(set<HBITMAP>::iterator it=hbmp_to_delete.begin(); it!=hbmp_to_delete.end(); ++it) { + HBITMAP hbmp = *it; + + TBREPLACEBITMAP tbrepl = {0, (UINT_PTR)hbmp, 0, 0}; + SendMessage(_htoolbar, TB_REPLACEBITMAP, 0, (LPARAM)&tbrepl); + + DeleteObject(hbmp); + + for(TaskBarMap::iterator it=_map.begin(); it!=_map.end(); ++it) + if (it->second._hbmp == hbmp) { + _map.erase(it); + break; + } + } + SendMessage(_htoolbar, TB_AUTOSIZE, 0, 0); ///@todo useless? } } From e105a067191fc9b304417d0a3be236e5656a90cb Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Tue, 24 Feb 2004 22:20:18 +0000 Subject: [PATCH 0166/1463] docu update svn path=/trunk/; revision=8358 --- reactos/subsys/system/explorer/doc/changes.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/system/explorer/doc/changes.txt b/reactos/subsys/system/explorer/doc/changes.txt index 6c1b4fe15ad..2ad53d9a8f5 100644 --- a/reactos/subsys/system/explorer/doc/changes.txt +++ b/reactos/subsys/system/explorer/doc/changes.txt @@ -61,5 +61,7 @@ If you search for more information, look into the CVS repository. 31.01.2004 m. fuchs included Registry as virtual file system 02.02.2004 m. fuchs reading of FAT image files 07.02.2004 m. fuchs included IE/Mozilla as Active X control -08.02.2003 m. fuchs desktop switching -16.02.200 m. fuchs lean explorer version without additional bells and whistles -> see CVS branch "lean-explorer" +08.02.2004 m. fuchs desktop switching +16.02.2004 m. fuchs lean explorer version without additional bells and whistles -> see CVS branch "lean-explorer" +23.02.2004 m. fuchs start menu navigation using first characters of entry names + fixes for leaking GDI handles From f8a6374074a60a59813bfdcab3b7b83d5c2330fb Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Tue, 24 Feb 2004 23:30:20 +0000 Subject: [PATCH 0167/1463] Get most of PICE to build again. svn path=/trunk/; revision=8359 --- reactos/apps/utils/pice/module/disassembler.c | 2 +- reactos/apps/utils/pice/module/gpfault.c | 6 +++--- reactos/apps/utils/pice/module/parse.c | 3 +++ reactos/apps/utils/pice/module/parse.h | 7 ++++--- reactos/apps/utils/pice/module/pci_ids.h | 2 +- reactos/apps/utils/pice/module/pice_ver.h | 2 +- reactos/apps/utils/pice/module/precomp.h | 2 +- reactos/apps/utils/pice/module/scancodes.h | 2 +- reactos/apps/utils/pice/module/symbols.h | 4 ---- 9 files changed, 15 insertions(+), 15 deletions(-) diff --git a/reactos/apps/utils/pice/module/disassembler.c b/reactos/apps/utils/pice/module/disassembler.c index c268dba379e..522bb6267da 100644 --- a/reactos/apps/utils/pice/module/disassembler.c +++ b/reactos/apps/utils/pice/module/disassembler.c @@ -713,4 +713,4 @@ BOOLEAN Disasm(PULONG pOffset,PUCHAR pchDst) *pOffset += (ULONG)Disassembler( &dis); return TRUE; -} \ No newline at end of file +} diff --git a/reactos/apps/utils/pice/module/gpfault.c b/reactos/apps/utils/pice/module/gpfault.c index 914dd602685..34e156eb0b2 100644 --- a/reactos/apps/utils/pice/module/gpfault.c +++ b/reactos/apps/utils/pice/module/gpfault.c @@ -60,14 +60,14 @@ void HandleGPFault(FRAME* ptr) // //************************************************************************* __asm__ ("\n\t \ -NewGPFaultHandler:\n\t \ + NewGPFaultHandler:\n\t \ pushfl\n\t \ cli\n\t \ cld\n\t \ pushal\n\t \ pushl %ds\n\t \ \n\t \ - // test for v86 mode. + // test for v86 mode\n\t \ testl $0x20000,40(%esp)\n\t \ jnz notv86\n\t \ popl %ds\n\t \ @@ -75,7 +75,7 @@ NewGPFaultHandler:\n\t \ popfl\n\t \ .byte 0x2e\n\t \ jmp *_OldGPFaultHandler\n\t \ -notv86:\n\t \ + notv86:\n\t \ // setup default data selectors\n\t \ movw %ss,%ax\n\t \ movw %ax,%ds\n\t \ diff --git a/reactos/apps/utils/pice/module/parse.c b/reactos/apps/utils/pice/module/parse.c index e5687398a33..66e449c9a9a 100644 --- a/reactos/apps/utils/pice/module/parse.c +++ b/reactos/apps/utils/pice/module/parse.c @@ -3092,6 +3092,8 @@ COMMAND_PROTOTYPE(ShowPCI) if(WaitForKey()==FALSE)goto CommonShowPCIExit; } ppciConfig = &pciConfig; + #if 0 + // sedwards SHOW_FIELD_WORD(ppciConfig,Status,TRUE); SHOW_FIELD_WORD(ppciConfig,Command,TRUE); SHOW_FIELD_BYTE(ppciConfig,RevisionID,TRUE); @@ -3100,6 +3102,7 @@ COMMAND_PROTOTYPE(ShowPCI) SHOW_FIELD_BYTE(ppciConfig,SubClass,TRUE); SHOW_FIELD_BYTE(ppciConfig,CacheLineSize,TRUE); SHOW_FIELD_BYTE(ppciConfig,LatencyTimer,TRUE); + #endif } } } diff --git a/reactos/apps/utils/pice/module/parse.h b/reactos/apps/utils/pice/module/parse.h index 0f291a86ff2..432c6660d9a 100644 --- a/reactos/apps/utils/pice/module/parse.h +++ b/reactos/apps/utils/pice/module/parse.h @@ -168,12 +168,13 @@ COMMAND_PROTOTYPE(ShowSysCallTable); COMMAND_PROTOTYPE(SetAltKey); COMMAND_PROTOTYPE(ShowContext); -//ei make sure the following correspond to ntoskrnl/mm/i386/page.c +//ei - make sure the following correspond to ntoskrnl/mm/i386/page.c +//sedwards - Dont use them if you dont need them. Use DDK headers instead. #define PAGETABLE_MAP (0xf0000000) #define PAGEDIRECTORY_MAP (0xf0000000 + (PAGETABLE_MAP / (1024))) -#define PAGE_SHIFT 12 +//#define PAGE_SHIFT 12 #define PTRS_PER_PTE 1024 -#define PAGE_SIZE (1UL << PAGE_SHIFT) +//#define PAGE_SIZE (1UL << PAGE_SHIFT) #define ADDR_TO_PAGE_TABLE(v) (((ULONG)(v)) / (4 * 1024 * 1024)) #define ADDR_TO_PDE(v) (PULONG)(PAGEDIRECTORY_MAP + \ (((ULONG)v / (1024 * 1024))&(~0x3))) diff --git a/reactos/apps/utils/pice/module/pci_ids.h b/reactos/apps/utils/pice/module/pci_ids.h index d4e9c838c97..1b085d1a8ec 100644 --- a/reactos/apps/utils/pice/module/pci_ids.h +++ b/reactos/apps/utils/pice/module/pci_ids.h @@ -902,4 +902,4 @@ struct _PCI_VENDOR_IDS {0xEA01 ,"EAGLE TECHNOLOGY"}, {0xFA57 ,"FAST SEARCH & TRANSFER ASA"}, {0xFEDA ,"EPIGRAM INC"} -}; \ No newline at end of file +}; diff --git a/reactos/apps/utils/pice/module/pice_ver.h b/reactos/apps/utils/pice/module/pice_ver.h index f015033e5f8..e4c7a7b89cd 100644 --- a/reactos/apps/utils/pice/module/pice_ver.h +++ b/reactos/apps/utils/pice/module/pice_ver.h @@ -33,4 +33,4 @@ Copyright notice: #define PICE_MINOR_VERSION (99) // reset this on major or minor version change // increment this on every release build -#define PICE_BUILD (0007) \ No newline at end of file +#define PICE_BUILD (0007) diff --git a/reactos/apps/utils/pice/module/precomp.h b/reactos/apps/utils/pice/module/precomp.h index 90d3757bafd..50d46125441 100644 --- a/reactos/apps/utils/pice/module/precomp.h +++ b/reactos/apps/utils/pice/module/precomp.h @@ -34,7 +34,7 @@ Copyright notice: #include <ddk/ntddk.h> #include <ntos/types.h> #include <ddk/types.h> -#include <ddk/i386/tss.h> +//#include <ddk/i386/tss.h> #include <internal/ob.h> #include <internal/i386/segment.h> #include <defines.h> diff --git a/reactos/apps/utils/pice/module/scancodes.h b/reactos/apps/utils/pice/module/scancodes.h index ea76882fdb8..8e451accfb8 100644 --- a/reactos/apps/utils/pice/module/scancodes.h +++ b/reactos/apps/utils/pice/module/scancodes.h @@ -103,4 +103,4 @@ Copyright notice: #define SCANCODE_9 0x0A #define SCANCODE_0 0x0B -#define SCANCODE_EXTENDED 0xE0 \ No newline at end of file +#define SCANCODE_EXTENDED 0xE0 diff --git a/reactos/apps/utils/pice/module/symbols.h b/reactos/apps/utils/pice/module/symbols.h index e7d359362a8..7b598aeaf90 100644 --- a/reactos/apps/utils/pice/module/symbols.h +++ b/reactos/apps/utils/pice/module/symbols.h @@ -29,10 +29,6 @@ Copyright notice: --*/ -// constant defines -#define FIELD_OFFSET(Type,Field) (LONG)(&(((Type *)(0))->Field)) -#define CONTAINING_RECORD(Address,Type,Field) (Type *)(((LONG)Address) - FIELD_OFFSET(Type,Field)) - typedef struct _LOCAL_VARIABLE { char type_name[64]; From 446f263ed3a2c6143a9a2292359d3503c0857f46 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Tue, 24 Feb 2004 23:50:26 +0000 Subject: [PATCH 0168/1463] - Try to avoid crashing when dumping out a corrupted stack. svn path=/trunk/; revision=8360 --- reactos/ntoskrnl/ke/i386/exp.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/ke/i386/exp.c b/reactos/ntoskrnl/ke/i386/exp.c index 2afd69b345f..0645581eed6 100644 --- a/reactos/ntoskrnl/ke/i386/exp.c +++ b/reactos/ntoskrnl/ke/i386/exp.c @@ -500,8 +500,20 @@ KiDumpTrapFrame(PKTRAP_FRAME Tf, ULONG Parameter1, ULONG Parameter2) Frame = (PULONG)Tf->Ebp; while (Frame != NULL) { - print_address((PVOID)Frame[1]); - Frame = (PULONG)Frame[0]; + NTSTATUS Status; + PVOID Eip; + Status = MmSafeCopyFromUser(&Eip, Frame + 1, sizeof(Eip)); + if (!NT_SUCCESS(Status)) + { + DbgPrint("<INVALID>"); + break; + } + print_address(Eip); + Status = MmSafeCopyFromUser(&Frame, Frame, sizeof(Frame)); + if (!NT_SUCCESS(Status)) + { + break; + } i++; DbgPrint(" "); } From 7eeed460046cf8a47a23273bcecc3104f56a7388 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Tue, 24 Feb 2004 23:51:04 +0000 Subject: [PATCH 0169/1463] - Avoid a crashing when trying to process an exception early in the boot process. svn path=/trunk/; revision=8361 --- reactos/ntoskrnl/rtl/i386/exception.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/rtl/i386/exception.c b/reactos/ntoskrnl/rtl/i386/exception.c index 85b06dd7383..7e2306aed32 100755 --- a/reactos/ntoskrnl/rtl/i386/exception.c +++ b/reactos/ntoskrnl/rtl/i386/exception.c @@ -1,4 +1,4 @@ -/* $Id: exception.c,v 1.9 2003/12/30 18:52:06 fireball Exp $ +/* $Id: exception.c,v 1.10 2004/02/24 23:51:04 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -165,6 +165,15 @@ RtlpDispatchException(IN PEXCEPTION_RECORD ExceptionRecord, 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 */ From 5fd0390001f180f03cfdbb47d6112a3f12750e73 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Tue, 24 Feb 2004 23:51:38 +0000 Subject: [PATCH 0170/1463] - Make the install target depend on the files to be installed. svn path=/trunk/; revision=8362 --- reactos/ntoskrnl/Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/Makefile b/reactos/ntoskrnl/Makefile index e7947641a51..4e44a12fb14 100644 --- a/reactos/ntoskrnl/Makefile +++ b/reactos/ntoskrnl/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.114 2004/02/21 09:20:33 gvg Exp $ +# $Id: Makefile,v 1.115 2004/02/24 23:51:38 dwelch Exp $ # # ReactOS Operating System # @@ -711,12 +711,12 @@ clean: ifneq ($(BOOTCD_INSTALL),) -install: +install: $(TARGETNAME).exe $(TARGETNAME).sym $(TARGETNAME).nostrip.exe - $(CP) $(TARGETNAME).exe $(INSTALL_DIR)/$(TARGETNAME).exe else # BOOTCD_INSTALL -install: +install: $(TARGETNAME).exe $(TARGETNAME).sym $(TARGETNAME).nostrip.exe - $(CP) $(TARGETNAME).exe $(INSTALL_DIR)/system32/$(TARGETNAME).exe - $(CP) $(TARGETNAME).sym $(INSTALL_DIR)/symbols/$(TARGETNAME).sym From 2b83ae3b6467c0c731666f4efb52b9fb9603285f Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Wed, 25 Feb 2004 01:25:51 +0000 Subject: [PATCH 0171/1463] Change a UNIMPLEMENTED to a DPRINT so we dont hang After doing Help -> About -> About OS in Explorer. svn path=/trunk/; revision=8363 --- reactos/subsys/win32k/objects/bitmaps.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index 916f5932373..afad18f1402 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.57 2004/02/23 22:44:52 gvg Exp $ */ +/* $Id: bitmaps.c,v 1.58 2004/02/25 01:25:51 sedwards Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> #include <stdlib.h> @@ -280,7 +280,7 @@ HBITMAP STDCALL NtGdiCreateBitmap(INT Width, } if (Planes != 1) { - UNIMPLEMENTED; + DPRINT("NtGdiCreateBitmap - UNIMPLEMENTED\n"); return 0; } if (Height < 0) From f687066559244f4d5a276dc5f7fb19373aed0220 Mon Sep 17 00:00:00 2001 From: James Tabor <james.tabor@reactos.org> Date: Wed, 25 Feb 2004 02:59:55 +0000 Subject: [PATCH 0172/1463] Started implementation of VideoPortGetVgaStatus svn path=/trunk/; revision=8364 --- reactos/drivers/video/videoprt/videoprt.c | 17 ++++++++++++++++- reactos/drivers/video/videoprt/videoprt.def | 3 ++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index 0a22b17d1f3..bfcdc8d7b1e 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.2 2004/02/10 16:22:56 navaraf Exp $ + * $Id: videoprt.c,v 1.3 2004/02/25 02:55:28 jimtabor Exp $ */ #include "videoprt.h" @@ -407,6 +407,21 @@ VideoPortGetRegistryParameters(IN PVOID HwDeviceExtension, ? ERROR_SUCCESS : ERROR_INVALID_PARAMETER; } + +/* + * @unimplemented + */ +VP_STATUS +STDCALL +VideoPortGetVgaStatus(IN PVOID HwDeviceExtension, + OUT PULONG VgaStatus) +{ + DPRINT("VideoPortGetVgaStatus\n"); + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + +} + static BOOLEAN VPInterruptRoutine(IN struct _KINTERRUPT *Interrupt, IN PVOID ServiceContext) diff --git a/reactos/drivers/video/videoprt/videoprt.def b/reactos/drivers/video/videoprt/videoprt.def index 8ec804b8bcd..361457e1490 100644 --- a/reactos/drivers/video/videoprt/videoprt.def +++ b/reactos/drivers/video/videoprt/videoprt.def @@ -1,4 +1,4 @@ -; $Id: videoprt.def,v 1.1 2004/01/19 15:56:53 navaraf Exp $ +; $Id: videoprt.def,v 1.2 2004/02/25 02:59:55 jimtabor Exp $ ; ; vidport.def - export definition file for ReactOS ; @@ -15,6 +15,7 @@ VideoPortGetDeviceBase@20 VideoPortGetDeviceData@16 VideoPortGetAccessRanges@32 VideoPortGetRegistryParameters@20 +VideoPortGetVgaStatus@8 VideoPortInitialize@16 VideoPortInt10@8 VideoPortLogError@16 From 11f62ff83b3beeb874857187b99019d869f9a7ac Mon Sep 17 00:00:00 2001 From: James Tabor <james.tabor@reactos.org> Date: Wed, 25 Feb 2004 03:05:27 +0000 Subject: [PATCH 0173/1463] Started implementation of VideoPortGetVgaStatus svn path=/trunk/; revision=8365 --- reactos/drivers/video/videoprt/videoprt.edf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/drivers/video/videoprt/videoprt.edf b/reactos/drivers/video/videoprt/videoprt.edf index 867c2a92d53..47e9cfb65bc 100644 --- a/reactos/drivers/video/videoprt/videoprt.edf +++ b/reactos/drivers/video/videoprt/videoprt.edf @@ -1,4 +1,4 @@ -; $Id: videoprt.edf,v 1.1 2004/01/19 15:56:53 navaraf Exp $ +; $Id: videoprt.edf,v 1.2 2004/02/25 03:05:27 jimtabor Exp $ ; ; vidport.def - export definition file for ReactOS ; @@ -16,6 +16,7 @@ VideoPortGetDeviceBase=VideoPortGetDeviceBase@20 VideoPortGetDeviceData=VideoPortGetDeviceData@16 VideoPortGetAccessRanges=VideoPortGetAccessRanges@32 VideoPortGetRegistryParameters=VideoPortGetRegistryParameters@20 +VideoPortGetVgaStatus=VideoPortGetVgaStatus@8 VideoPortInitialize=VideoPortInitialize@16 VideoPortInt10=VideoPortInt10@8 VideoPortLogError=VideoPortLogError@16 From 5e2693380d7b0cbedc39bb11051c5b991963c47d Mon Sep 17 00:00:00 2001 From: James Tabor <james.tabor@reactos.org> Date: Wed, 25 Feb 2004 05:38:33 +0000 Subject: [PATCH 0174/1463] Partial implementation of VideoPortGetVgaStatus, needs testing svn path=/trunk/; revision=8366 --- reactos/drivers/video/videoprt/videoprt.c | 34 ++++++++++++++++++----- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index bfcdc8d7b1e..56e9ee09dc7 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.3 2004/02/25 02:55:28 jimtabor Exp $ + * $Id: videoprt.c,v 1.4 2004/02/25 05:38:33 jimtabor Exp $ */ #include "videoprt.h" @@ -409,17 +409,37 @@ VideoPortGetRegistryParameters(IN PVOID HwDeviceExtension, /* - * @unimplemented - */ + * @implemented + */ VP_STATUS STDCALL VideoPortGetVgaStatus(IN PVOID HwDeviceExtension, OUT PULONG VgaStatus) { - DPRINT("VideoPortGetVgaStatus\n"); - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; - + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + + DPRINT("VideoPortGetVgaStatus = %S \n", VgaStatus); + + DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, + VIDEO_PORT_DEVICE_EXTENSION, + MiniPortDeviceExtension); + + if(KeGetCurrentIrql() == PASSIVE_LEVEL) + { + if ( PCIBus == DeviceExtension->AdapterInterfaceType) + { +/* + VgaStatus 0 == VGA not enabled, 1 == VGA enabled. + */ + + /* Assumed for now */ + + VgaStatus = (PULONG) 1; + + return STATUS_SUCCESS; + } + } + return ERROR_INVALID_FUNCTION; } static BOOLEAN From 5c85402724124820625750943cc7cff52eb2fbce Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Wed, 25 Feb 2004 07:41:50 +0000 Subject: [PATCH 0175/1463] Iphlpapi is now fully merged. Further changes should be synced with wine. svn path=/trunk/; revision=8367 --- reactos/lib/iphlpapi/Makefile.in | 28 + reactos/lib/iphlpapi/Makefile.ros-template | 21 + reactos/lib/iphlpapi/debug.h | 9 - reactos/lib/iphlpapi/icmp.c | 69 +- reactos/lib/iphlpapi/icmp_reactos.c | 127 ++ reactos/lib/iphlpapi/ifenum.h | 3 + reactos/lib/iphlpapi/ifenum_reactos.c | 557 +++++---- reactos/lib/iphlpapi/iphlp_res.h | 12 - reactos/lib/iphlpapi/iphlpapi.c | 1295 -------------------- reactos/lib/iphlpapi/iphlpapi.def | 158 --- reactos/lib/iphlpapi/iphlpapi.edf | 159 --- reactos/lib/iphlpapi/iphlpapi.spec | 117 ++ reactos/lib/iphlpapi/iphlpapi_main.c | 81 +- reactos/lib/iphlpapi/iphlpv6.c | 63 +- reactos/lib/iphlpapi/ipprivate.h | 92 -- reactos/lib/iphlpapi/ipregprivate.h | 13 - reactos/lib/iphlpapi/ipstats_reactos.c | 65 +- reactos/lib/iphlpapi/makefile | 9 +- reactos/lib/iphlpapi/media.c | 60 +- reactos/lib/iphlpapi/merge-notes.txt | 20 + reactos/lib/iphlpapi/registry.c | 6 +- reactos/lib/iphlpapi/resinfo.c | 61 + reactos/lib/iphlpapi/resinfo.h | 35 + reactos/lib/iphlpapi/resinfo_reactos.c | 39 +- reactos/lib/iphlpapi/route.c | 69 ++ reactos/lib/iphlpapi/route.h | 29 + 26 files changed, 1038 insertions(+), 2159 deletions(-) create mode 100644 reactos/lib/iphlpapi/Makefile.in create mode 100644 reactos/lib/iphlpapi/Makefile.ros-template create mode 100644 reactos/lib/iphlpapi/icmp_reactos.c delete mode 100644 reactos/lib/iphlpapi/iphlp_res.h delete mode 100644 reactos/lib/iphlpapi/iphlpapi.c delete mode 100644 reactos/lib/iphlpapi/iphlpapi.def delete mode 100644 reactos/lib/iphlpapi/iphlpapi.edf create mode 100644 reactos/lib/iphlpapi/iphlpapi.spec delete mode 100644 reactos/lib/iphlpapi/ipprivate.h delete mode 100644 reactos/lib/iphlpapi/ipregprivate.h create mode 100644 reactos/lib/iphlpapi/resinfo.c create mode 100644 reactos/lib/iphlpapi/resinfo.h create mode 100644 reactos/lib/iphlpapi/route.c create mode 100644 reactos/lib/iphlpapi/route.h diff --git a/reactos/lib/iphlpapi/Makefile.in b/reactos/lib/iphlpapi/Makefile.in new file mode 100644 index 00000000000..3e256027c4b --- /dev/null +++ b/reactos/lib/iphlpapi/Makefile.in @@ -0,0 +1,28 @@ +EXTRADEFS = +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = iphlpapi.dll +IMPORTS = advapi32 kernel32 +DELAYIMPORTS = +EXTRALIBS = + +C_SRCS = \ + icmp_reactos.c \ + ifenum_reactos.c \ + ipstats_reactos.c \ + iphlpapi_main.c \ + iphlpv6_reactos.c \ + media.c \ + registry.c \ + resinfo_reactos.c \ + route.c + +RC_SRCS = iphlpapi.rc +RC_BINSRC = iphlpapi.rc +RC_BINARIES = + +@MAKE_DLL_RULES@ + +### Dependencies: diff --git a/reactos/lib/iphlpapi/Makefile.ros-template b/reactos/lib/iphlpapi/Makefile.ros-template new file mode 100644 index 00000000000..622389c6314 --- /dev/null +++ b/reactos/lib/iphlpapi/Makefile.ros-template @@ -0,0 +1,21 @@ +# $Id: Makefile.ros-template,v 1.1 2004/02/25 07:41:50 arty Exp $ + +TARGET_NAME = iphlpapi + +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_BASE = 0x77300000 + +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/iphlpapi/debug.h b/reactos/lib/iphlpapi/debug.h index 457916728a5..d2492dcf3af 100644 --- a/reactos/lib/iphlpapi/debug.h +++ b/reactos/lib/iphlpapi/debug.h @@ -49,15 +49,6 @@ extern DWORD DebugTraceLevel; #endif /* DBG */ - -#define assert(x) ASSERT(x) -#define assert_irql(x) ASSERT_IRQL(x) - - -#define UNIMPLEMENTED \ - WSH_DbgPrint(MIN_TRACE, ("(%s:%d)(%s) is unimplemented, \ - please try again later.\n", __FILE__, __LINE__, __FUNCTION__)); - #define CHECKPOINT \ WSH_DbgPrint(MIN_TRACE, ("\n")); diff --git a/reactos/lib/iphlpapi/icmp.c b/reactos/lib/iphlpapi/icmp.c index 29fa0f857a0..cd404213c61 100644 --- a/reactos/lib/iphlpapi/icmp.c +++ b/reactos/lib/iphlpapi/icmp.c @@ -1,6 +1,27 @@ -#ifdef HAVE_CONFIG_H +/* + * iphlpapi dll implementation -- Auxiliary icmp functions + * + * These are stubs for functions that provide a simple ICMP probing API. They + * will be operating system specific when implemented. + * + * Copyright (C) 2004 Art Yerkes + * 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 "config.h" -#endif +#include "iphlpapi_private.h" #include <stdarg.h> #include <stdlib.h> @@ -18,67 +39,55 @@ # include <resolv.h> #endif -#ifdef __REACTOS__ -# include <windows.h> -# include <windef.h> -# include <winbase.h> -# include <net/miniport.h> -# include <winsock2.h> -# include <nspapi.h> -# include <iptypes.h> -# include "iphlpapiextra.h" -#else -# include "windef.h" -# include "winbase.h" -# include "winreg.h" -#endif - +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "resinfo.h" #include "iphlpapi.h" -#include "ifenum.h" -#include "ipstats.h" -#include "iphlp_res.h" #include "wine/debug.h" +WINE_DEFAULT_DEBUG_CHANNEL(iphlpapi); + /* * @unimplemented */ DWORD -STDCALL +WINAPI IcmpParseReplies( LPVOID ReplyBuffer, DWORD ReplySize ) { - UNIMPLEMENTED + FIXME(":stub\n"); return 0L; } /* * @unimplemented */ -HANDLE STDCALL IcmpCreateFile( +HANDLE WINAPI IcmpCreateFile( VOID ) { - UNIMPLEMENTED + FIXME(":stub\n"); return 0L; } /* * @unimplemented */ -BOOL STDCALL IcmpCloseHandle( +BOOL WINAPI IcmpCloseHandle( HANDLE IcmpHandle ) { - UNIMPLEMENTED + FIXME(":stub\n"); return 0L; } /* * @unimplemented */ -DWORD STDCALL IcmpSendEcho( +DWORD WINAPI IcmpSendEcho( HANDLE IcmpHandle, IPAddr DestinationAddress, LPVOID RequestData, @@ -89,7 +98,7 @@ DWORD STDCALL IcmpSendEcho( DWORD Timeout ) { - UNIMPLEMENTED + FIXME(":stub\n"); return 0L; } @@ -97,7 +106,7 @@ DWORD STDCALL IcmpSendEcho( * @unimplemented */ DWORD -STDCALL +WINAPI IcmpSendEcho2( HANDLE IcmpHandle, HANDLE Event, @@ -112,6 +121,6 @@ IcmpSendEcho2( DWORD Timeout ) { - UNIMPLEMENTED + FIXME(":stub\n"); return 0L; } diff --git a/reactos/lib/iphlpapi/icmp_reactos.c b/reactos/lib/iphlpapi/icmp_reactos.c new file mode 100644 index 00000000000..8d59ac26cda --- /dev/null +++ b/reactos/lib/iphlpapi/icmp_reactos.c @@ -0,0 +1,127 @@ +/* + * iphlpapi dll implementation -- Auxiliary ICMP functions. + * + * These are stubs for functions that set routing information on the target + * operating system. They are grouped here because their implementation will + * vary widely by operating system. + * + * Copyright (C) 2004 Art Yerkes + * 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 "config.h" +#include "iphlpapi_private.h" + +#include <stdarg.h> +#include <stdlib.h> +#include <sys/types.h> +#ifdef HAVE_NETINET_IN_H +# include <netinet/in.h> +#endif +#ifdef HAVE_ARPA_INET_H +# include <arpa/inet.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +# include <arpa/nameser.h> +#endif +#ifdef HAVE_RESOLV_H +# include <resolv.h> +#endif + +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "resinfo.h" +#include "iphlpapi.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(iphlpapi); + +/* + * @unimplemented + */ +DWORD +STDCALL +IcmpParseReplies( + LPVOID ReplyBuffer, + DWORD ReplySize + ) +{ + UNIMPLEMENTED + return 0L; +} + +/* + * @unimplemented + */ +HANDLE STDCALL IcmpCreateFile( + VOID + ) +{ + UNIMPLEMENTED + return 0L; +} + +/* + * @unimplemented + */ +BOOL STDCALL IcmpCloseHandle( + HANDLE IcmpHandle + ) +{ + UNIMPLEMENTED + return 0L; +} + +/* + * @unimplemented + */ +DWORD STDCALL IcmpSendEcho( + HANDLE IcmpHandle, + IPAddr DestinationAddress, + LPVOID RequestData, + WORD RequestSize, + PIP_OPTION_INFORMATION RequestOptions, + LPVOID ReplyBuffer, + DWORD ReplySize, + DWORD Timeout + ) +{ + UNIMPLEMENTED + return 0L; +} + +/* + * @unimplemented + */ +DWORD +STDCALL +IcmpSendEcho2( + HANDLE IcmpHandle, + HANDLE Event, + FARPROC ApcRoutine, + PVOID ApcContext, + IPAddr DestinationAddress, + LPVOID RequestData, + WORD RequestSize, + PIP_OPTION_INFORMATION RequestOptions, + LPVOID ReplyBuffer, + DWORD ReplySize, + DWORD Timeout + ) +{ + UNIMPLEMENTED + return 0L; +} diff --git a/reactos/lib/iphlpapi/ifenum.h b/reactos/lib/iphlpapi/ifenum.h index 406fa0f5ada..e37d4451c59 100644 --- a/reactos/lib/iphlpapi/ifenum.h +++ b/reactos/lib/iphlpapi/ifenum.h @@ -139,4 +139,7 @@ DWORD getInterfaceEntryByIndex(DWORD index, PMIB_IFROW entry); */ char *toIPAddressString(unsigned int addr, char string[16]); +/* Inserts a route into the route table. */ +DWORD createIpForwardEntryOS(PMIB_IPFORWARDROW pRoute); + #endif /* ndef WINE_IFENUM_H_ */ diff --git a/reactos/lib/iphlpapi/ifenum_reactos.c b/reactos/lib/iphlpapi/ifenum_reactos.c index 9956b5e585e..d58c0ebc905 100644 --- a/reactos/lib/iphlpapi/ifenum_reactos.c +++ b/reactos/lib/iphlpapi/ifenum_reactos.c @@ -37,7 +37,7 @@ * functions into iphlpv6.c (arty) */ -#include "ipprivate.h" +#include "iphlpapi_private.h" #include "ifenum.h" /* Globals */ @@ -45,6 +45,10 @@ const PWCHAR TcpFileName = L"\\Device\\Tcp"; /* Functions */ +/* I'm a bit skittish about maintaining this info in memory, as I'd rather + * not add any mutex or critical section blockers to these functions. I've + * encountered far too many windows functions that contribute to deadlock + * by not announcing themselves. */ void interfaceMapInit(void) { /* For now, nothing */ @@ -212,19 +216,18 @@ VOID tdiFreeThingSet( PVOID things ) { } NTSTATUS tdiGetMibForIfEntity -( HANDLE tcpFile, DWORD entityId, IFEntrySafelySized *entry ) { +( HANDLE tcpFile, TDIEntityID *ent, IFEntrySafelySized *entry ) { TCP_REQUEST_QUERY_INFORMATION_EX req = TCP_REQUEST_QUERY_INFORMATION_INIT; NTSTATUS status = STATUS_SUCCESS; DWORD returnSize; DPRINT("TdiGetMibForIfEntity(tcpFile %x,entityId %x)\n", - (int)tcpFile, (int)entityId); + (int)tcpFile, (int)ent->tei_instance); req.ID.toi_class = INFO_CLASS_PROTOCOL; req.ID.toi_type = INFO_TYPE_PROVIDER; req.ID.toi_id = IF_MIB_STATS_ID; - req.ID.toi_entity.tei_entity = IF_ENTITY; - req.ID.toi_entity.tei_instance = entityId; + req.ID.toi_entity = *ent; status = DeviceIoControl( tcpFile, IOCTL_TCP_QUERY_INFORMATION_EX, @@ -245,23 +248,22 @@ NTSTATUS tdiGetMibForIfEntity " if_type ........................ %x\n" " if_mtu ......................... %d\n" " if_speed ....................... %x\n" - " if_physaddrlen ................. %d\n" - " if_physaddr .................... %02x:%02x:%02x:%02x:%02x:%02x\n", - " if_descr ....................... %s\n" - "} status %08x\n", - (int)entry->offset.ent.if_index, - (int)entry->offset.ent.if_type, - (int)entry->offset.ent.if_mtu, - (int)entry->offset.ent.if_speed, - (int)entry->offset.ent.if_physaddrlen, - entry->offset.ent.if_physaddr[0] & 0xff, - entry->offset.ent.if_physaddr[1] & 0xff, - entry->offset.ent.if_physaddr[2] & 0xff, - entry->offset.ent.if_physaddr[3] & 0xff, - entry->offset.ent.if_physaddr[4] & 0xff, - entry->offset.ent.if_physaddr[5] & 0xff, - entry->offset.ent.if_descr, - (int)status); + " if_physaddrlen ................. %d\n", + entry->ent.if_index, + entry->ent.if_type, + entry->ent.if_mtu, + entry->ent.if_speed, + entry->ent.if_physaddrlen); + DPRINT(" if_physaddr .................... %02x:%02x:%02x:%02x:%02x:%02x\n", + " if_descr ....................... %s\n", + entry->ent.if_physaddr[0] & 0xff, + entry->ent.if_physaddr[1] & 0xff, + entry->ent.if_physaddr[2] & 0xff, + entry->ent.if_physaddr[3] & 0xff, + entry->ent.if_physaddr[4] & 0xff, + entry->ent.if_physaddr[5] & 0xff, + entry->ent.if_descr); + DPRINT("} status %08x\n",status); return status; } @@ -301,11 +303,11 @@ static BOOL isLoopback( HANDLE tcpFile, TDIEntityID *loop_maybe ) { IFEntrySafelySized entryInfo; tdiGetMibForIfEntity( tcpFile, - loop_maybe->tei_instance, + loop_maybe, &entryInfo ); - return !entryInfo.offset.ent.if_type || - entryInfo.offset.ent.if_type == IFENT_SOFTWARE_LOOPBACK; + return !entryInfo.ent.if_type || + entryInfo.ent.if_type == IFENT_SOFTWARE_LOOPBACK; } NTSTATUS tdiGetEntityType( HANDLE tcpFile, TDIEntityID *ent, PULONG type ) { @@ -336,6 +338,63 @@ NTSTATUS tdiGetEntityType( HANDLE tcpFile, TDIEntityID *ent, PULONG type ) { return status; } +static NTSTATUS getInterfaceInfoSet( HANDLE tcpFile, + IFInfo **infoSet, + PDWORD numInterfaces ) { + DWORD numEntities; + TDIEntityID *entIDSet = 0; + NTSTATUS status = tdiGetEntityIDSet( tcpFile, &entIDSet, &numEntities ); + IFInfo *infoSetInt = 0; + BOOL interfaceInfoComplete; + int curInterf = 0, i; + + if( NT_SUCCESS(status) ) + infoSetInt = HeapAlloc( GetProcessHeap(), 0, + sizeof(IFInfo) * numEntities ); + + if( infoSetInt ) { + for( i = 0; i < numEntities; i++ ) { + if( isInterface( &entIDSet[i] ) ) { + status = tdiGetMibForIfEntity + ( tcpFile, + &entIDSet[i], + &infoSetInt[curInterf].if_info ); + if( NT_SUCCESS(status) ) { + DWORD numAddrs; + IPAddrEntry *addrs; + TDIEntityID ip_ent; + int j,k; + + interfaceInfoComplete = FALSE; + for( j = 0; NT_SUCCESS(status); j++ ) { + status = getNthIpEntity( tcpFile, j, &ip_ent ); + if( NT_SUCCESS(status) ) + status = tdiGetIpAddrsForIpEntity + ( tcpFile, &ip_ent, &addrs, &numAddrs ); + for( k = 0; k < numAddrs && NT_SUCCESS(status); k++ ) { + if( addrs[k].iae_index == + infoSetInt[curInterf].if_info.ent.if_index ) { + memcpy( &infoSetInt[curInterf].ip_addr, + &addrs[k], + sizeof( addrs[k] ) ); + interfaceInfoComplete = TRUE; + break; + } + } + if( interfaceInfoComplete ) break; + } + } + if( NT_SUCCESS(status) ) curInterf++; + } + } + } + + *infoSet = infoSetInt; + *numInterfaces = curInterf; + + return STATUS_SUCCESS; +} + static DWORD getNumInterfacesInt(BOOL onlyLoopback) { DWORD numEntities, numInterfaces = 0; @@ -413,48 +472,70 @@ DWORD getNthInterfaceEntity( HANDLE tcpFile, DWORD index, TDIEntityID *ent ) { return STATUS_UNSUCCESSFUL; } } + +NTSTATUS getInterfaceInfoByIndex( HANDLE tcpFile, DWORD index, IFInfo *info ) { + IFInfo *ifInfo; + DWORD numInterfaces; + NTSTATUS status = getInterfaceInfoSet( tcpFile, &ifInfo, &numInterfaces ); + int i; + + if( NT_SUCCESS(status) ) + for( i = 0; i < numInterfaces; i++ ) { + if( ifInfo[i].if_info.ent.if_index == index ) { + memcpy( info, &ifInfo[i], sizeof(*info) ); + break; + } + } + + if( NT_SUCCESS(status) ) + return i < numInterfaces ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL; + else + return status; +} + +NTSTATUS getInterfaceInfoByName( HANDLE tcpFile, char *name, IFInfo *info ) { + IFInfo *ifInfo; + DWORD numInterfaces; + int i; + NTSTATUS status = getInterfaceInfoSet( tcpFile, &ifInfo, &numInterfaces ); + + if( NT_SUCCESS(status) ) + for( i = 0; i < numInterfaces; i++ ) { + if( !strcmp(ifInfo[i].if_info.ent.if_descr, name) ) { + memcpy( info, &ifInfo[i], sizeof(*info) ); + break; + } + } + + if( NT_SUCCESS(status) ) + return i < numInterfaces ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL; + else + return status; +} /* Note that the result of this operation must be freed later */ const char *getInterfaceNameByIndex(DWORD index) { - TDIEntityID ent; - IFEntrySafelySized entityInfo; - HANDLE tcpFile = INVALID_HANDLE_VALUE; - NTSTATUS status = STATUS_SUCCESS; - PCHAR interfaceName = 0; - char simple_name_buf[100]; - char *adapter_name; + IFInfo ifInfo; + HANDLE tcpFile; + char *interfaceName = 0, *adapter_name = 0; + NTSTATUS status = openTcpFile( &tcpFile ); - status = openTcpFile( &tcpFile ); - if( !NT_SUCCESS(status) ) { - DPRINT("failed %08x\n", status ); - return 0; - } - - status = getNthInterfaceEntity( tcpFile, index, &ent ); - - if( !NT_SUCCESS(status) ) { - DPRINT("failed %08x\n", status ); - return 0; - } - - status = tdiGetMibForIfEntity( tcpFile, - ent.tei_instance, - &entityInfo ); if( NT_SUCCESS(status) ) { - adapter_name = entityInfo.offset.ent.if_descr; - } else { - sprintf( simple_name_buf, "eth%x", - (int)ent.tei_instance ); - adapter_name = simple_name_buf; + status = getInterfaceInfoByIndex( tcpFile, index, &ifInfo ); + + if( NT_SUCCESS(status) ) { + adapter_name = ifInfo.if_info.ent.if_descr; + + interfaceName = HeapAlloc( GetProcessHeap(), 0, + strlen(adapter_name) + 1 ); + strcpy( interfaceName, adapter_name ); + + closeTcpFile( tcpFile ); + } } - interfaceName = HeapAlloc( GetProcessHeap(), 0, - strlen(adapter_name) + 1 ); - strcpy( interfaceName, adapter_name ); - closeTcpFile( tcpFile ); - return interfaceName; } @@ -464,63 +545,58 @@ void consumeInterfaceName(const char *name) { DWORD getInterfaceIndexByName(const char *name, PDWORD index) { - DWORD ret = STATUS_SUCCESS; - int numInterfaces = getNumInterfaces(); - const char *iname = 0; - int i; + IFInfo ifInfo; HANDLE tcpFile; + NTSTATUS status = openTcpFile( &tcpFile ); - ret = openTcpFile( &tcpFile ); - - if( !NT_SUCCESS(ret) ) { - DPRINT("Failure: %08x\n", ret); - return ret; - } - - for( i = 0; i < numInterfaces; i++ ) { - iname = getInterfaceNameByIndex( i ); - if( !strcmp(iname, name) ) { - *index = i; + if( NT_SUCCESS(status) ) { + status = getInterfaceInfoByName( tcpFile, (char *)name, &ifInfo ); + + if( NT_SUCCESS(status) ) { + *index = ifInfo.if_info.ent.if_index; + closeTcpFile( tcpFile ); } - HeapFree( GetProcessHeap(), 0, (char *)iname ); } - closeTcpFile( tcpFile ); - - return ret; + return status; } InterfaceIndexTable *getInterfaceIndexTableInt( BOOL nonLoopbackOnly ) { - HANDLE tcpFile; DWORD numInterfaces, curInterface = 0; int i; - InterfaceIndexTable *ret; - TDIEntityID *entitySet; - DWORD numEntities; - NTSTATUS status; + IFInfo *ifInfo; + InterfaceIndexTable *ret = 0; + HANDLE tcpFile; + NTSTATUS status = openTcpFile( &tcpFile ); - numInterfaces = getNumInterfaces(); - TRACE("getInterfaceIndexTable: numInterfaces: %d\n", numInterfaces); - ret = (InterfaceIndexTable *)calloc(1, - sizeof(InterfaceIndexTable) + (numInterfaces - 1) * sizeof(DWORD)); - if (ret) { - ret->numAllocated = numInterfaces; - } - - status = openTcpFile( &tcpFile ); - tdiGetEntityIDSet( tcpFile, &entitySet, &numEntities ); - - for( i = 0; i < numEntities; i++ ) { - if( isInterface( &entitySet[i] ) && - (!nonLoopbackOnly || !isLoopback( tcpFile, &entitySet[i] )) ) { - ret->indexes[curInterface++] = entitySet[i].tei_instance; + if( NT_SUCCESS(status) ) { + status = getInterfaceInfoSet( tcpFile, &ifInfo, &numInterfaces ); + + if( NT_SUCCESS(status) ) { + ret = (InterfaceIndexTable *) + calloc(1, + sizeof(InterfaceIndexTable) + + (numInterfaces - 1) * sizeof(DWORD)); + + if (ret) { + ret->numAllocated = numInterfaces; + + for( i = 0; i < numInterfaces; i++ ) { + if( !nonLoopbackOnly || + !isLoopback( tcpFile, &ifInfo[i].entity_id ) ) { + ret->indexes[curInterface++] = + ifInfo[i].if_info.ent.if_index; + } + } + + ret->numIndexes = curInterface; + } + + tdiFreeThingSet( ifInfo ); } + closeTcpFile( tcpFile ); } - - tdiFreeThingSet( entitySet ); - closeTcpFile( tcpFile ); - ret->numIndexes = curInterface; - + return ret; } @@ -537,175 +613,167 @@ DWORD getInterfaceIPAddrByName(const char *name) return INADDR_ANY; } -DWORD getInterfaceIPAddrByIndex(DWORD index) -{ - return INADDR_ANY; +NTSTATUS getIPAddrEntryForIf(HANDLE tcpFile, + char *name, + DWORD index, + IFInfo *ifInfo) { + NTSTATUS status = + name ? + getInterfaceInfoByName( tcpFile, name, ifInfo ) : + getInterfaceInfoByIndex( tcpFile, index, ifInfo ); + return status; } -DWORD getInterfaceBCastAddrByName(const char *name) -{ - return INADDR_ANY; +DWORD getAddrByIndexOrName( char *name, DWORD index, IPHLPAddrType addrType ) { + IFInfo ifInfo; + HANDLE tcpFile = INVALID_HANDLE_VALUE; + NTSTATUS status = STATUS_SUCCESS; + DWORD addrOut = INADDR_ANY; + + status = openTcpFile( &tcpFile ); + + if( NT_SUCCESS(status) ) { + status = getIPAddrEntryForIf( tcpFile, name, index, &ifInfo ); + if( NT_SUCCESS(status) ) { + switch( addrType ) { + case IPAAddr: addrOut = ifInfo.ip_addr.iae_addr; break; + case IPABcast: addrOut = ifInfo.ip_addr.iae_bcastaddr; break; + case IPAMask: addrOut = ifInfo.ip_addr.iae_mask; break; + case IFMtu: addrOut = ifInfo.if_info.ent.if_mtu; break; + case IFStatus: addrOut = ifInfo.if_info.ent.if_operstatus; break; + } + } + closeTcpFile( &tcpFile ); + } + + return addrOut; +} + +DWORD getInterfaceIPAddrByIndex(DWORD index) { + return getAddrByIndexOrName( 0, index, IPAAddr ); } -DWORD getInterfaceBCastAddrByIndex(DWORD index) -{ - return INADDR_ANY; +DWORD getInterfaceBCastAddrByName(const char *name) { + return getAddrByIndexOrName( (char *)name, 0, IPABcast ); } -DWORD getInterfaceMaskByName(const char *name) -{ - DWORD ret = INADDR_NONE; - return ret; +DWORD getInterfaceBCastAddrByIndex(DWORD index) { + return getAddrByIndexOrName( 0, index, IPABcast ); } -DWORD getInterfaceMaskByIndex(DWORD index) -{ - DWORD ret = INADDR_NONE; - return ret; +DWORD getInterfaceMaskByName(const char *name) { + return getAddrByIndexOrName( (char *)name, 0, IPAMask ); +} + +DWORD getInterfaceMaskByIndex(DWORD index) { + return getAddrByIndexOrName( 0, index, IPAMask ); +} + +void getInterfacePhysicalFromInfo( IFInfo *info, + PDWORD len, PBYTE addr, PDWORD type ) { + *len = info->if_info.ent.if_physaddrlen; + memcpy( addr, info->if_info.ent.if_physaddr, *len ); + *type = info->if_info.ent.if_type; } DWORD getInterfacePhysicalByName(const char *name, PDWORD len, PBYTE addr, - PDWORD type) + PDWORD type) { - DWORD ret; - DWORD addrLen; + HANDLE tcpFile; + IFInfo info; + NTSTATUS status = openTcpFile( &tcpFile ); - if (!name || !len || !addr || !type) - return ERROR_INVALID_PARAMETER; + if( NT_SUCCESS(status) ) { + status = getInterfaceInfoByName( tcpFile, (char *)name, &info ); + if( NT_SUCCESS(status) ) + getInterfacePhysicalFromInfo( &info, len, addr, type ); + closeTcpFile( tcpFile ); + } - if (addrLen > *len) { - ret = ERROR_INSUFFICIENT_BUFFER; - *len = addrLen; - } - else { - /* zero out remaining bytes for broken implementations */ - memset(addr + addrLen, 0, *len - addrLen); - *len = addrLen; - ret = NO_ERROR; - } - - ret = ERROR_NO_MORE_FILES; - return ret; + return status; } DWORD getInterfacePhysicalByIndex(DWORD index, PDWORD len, PBYTE addr, PDWORD type) { - const char *name = getInterfaceNameByIndex(index); + HANDLE tcpFile; + IFInfo info; + NTSTATUS status = openTcpFile( &tcpFile ); - if (name) - return getInterfacePhysicalByName(name, len, addr, type); - else - return ERROR_INVALID_DATA; + if( NT_SUCCESS(status) ) { + status = getInterfaceInfoByIndex( tcpFile, index, &info ); + if( NT_SUCCESS(status) ) + getInterfacePhysicalFromInfo( &info, len, addr, type ); + closeTcpFile( tcpFile ); + } + + return status; } -DWORD getInterfaceMtuByName(const char *name, PDWORD mtu) -{ - *mtu = 0; - return ERROR_SUCCESS; +DWORD getInterfaceMtuByName(const char *name, PDWORD mtu) { + *mtu = getAddrByIndexOrName( (char *)name, 0, IFMtu ); + return STATUS_SUCCESS; } -DWORD getInterfaceMtuByIndex(DWORD index, PDWORD mtu) -{ - const char *name = getInterfaceNameByIndex(index); - - if (name) - return getInterfaceMtuByName(name, mtu); - else - return ERROR_INVALID_DATA; +DWORD getInterfaceMtuByIndex(DWORD index, PDWORD mtu) { + *mtu = getAddrByIndexOrName( 0, index, IFMtu ); + return STATUS_SUCCESS; } -DWORD getInterfaceStatusByName(const char *name, PDWORD status) -{ - DWORD ret; - - if (!name) - return ERROR_INVALID_PARAMETER; - if (!status) - return ERROR_INVALID_PARAMETER; - - ret = ERROR_NO_MORE_FILES; - return ret; +DWORD getInterfaceStatusByName(const char *name, PDWORD status) { + *status = getAddrByIndexOrName( (char *)name, 0, IFStatus ); + return STATUS_SUCCESS; } DWORD getInterfaceStatusByIndex(DWORD index, PDWORD status) { - const char *name = getInterfaceNameByIndex(index); - - if (name) - return getInterfaceStatusByName(name, status); - else - return ERROR_INVALID_DATA; + *status = getAddrByIndexOrName( 0, index, IFStatus ); + return STATUS_SUCCESS; } DWORD getInterfaceEntryByName(const char *name, PMIB_IFROW entry) { - BYTE addr[MAX_INTERFACE_PHYSADDR]; - DWORD ret, len = sizeof(addr), type; + HANDLE tcpFile; + IFInfo info; + NTSTATUS status = openTcpFile( &tcpFile ); - if (!name) - return ERROR_INVALID_PARAMETER; - if (!entry) - return ERROR_INVALID_PARAMETER; + DPRINT("Called.\n"); - if (getInterfacePhysicalByName(name, &len, addr, &type) == NO_ERROR) { - WCHAR *assigner; - const char *walker; + if( NT_SUCCESS(status) ) { + status = getInterfaceInfoByName( tcpFile, (char *)name, &info ); + + if( NT_SUCCESS(status) ) { + memcpy( &entry->wszName[MAX_INTERFACE_NAME_LEN], + &info.if_info, + sizeof(info.if_info) ); + } + + closeTcpFile( tcpFile ); + } - memset(entry, 0, sizeof(MIB_IFROW)); - for (assigner = entry->wszName, walker = name; *walker; - walker++, assigner++) - *assigner = *walker; - *assigner = 0; - getInterfaceIndexByName(name, &entry->dwIndex); - entry->dwPhysAddrLen = len; - memcpy(entry->bPhysAddr, addr, len); - memset(entry->bPhysAddr + len, 0, sizeof(entry->bPhysAddr) - len); - entry->dwType = type; - /* FIXME: how to calculate real speed? */ - getInterfaceMtuByName(name, &entry->dwMtu); - /* lie, there's no "administratively down" here */ - entry->dwAdminStatus = MIB_IF_ADMIN_STATUS_UP; - getInterfaceStatusByName(name, &entry->dwOperStatus); - /* punt on dwLastChange? */ - entry->dwDescrLen = min(strlen(name), MAX_INTERFACE_DESCRIPTION - 1); - memcpy(entry->bDescr, name, entry->dwDescrLen); - entry->bDescr[entry->dwDescrLen] = '\0'; - entry->dwDescrLen++; - ret = NO_ERROR; - } - else - ret = ERROR_INVALID_DATA; - return ret; + return status; } DWORD getInterfaceEntryByIndex(DWORD index, PMIB_IFROW entry) { HANDLE tcpFile; + IFInfo info; NTSTATUS status = openTcpFile( &tcpFile ); - TDIEntityID entity; DPRINT("Called.\n"); - if( !NT_SUCCESS(status) ) { - DPRINT("Failed: %08x\n", status); - return status; - } - - status = getNthInterfaceEntity( tcpFile, index, &entity ); - - if( !NT_SUCCESS(status) ) { - DPRINT("Failed: %08x\n", status); + if( NT_SUCCESS(status) ) { + status = getInterfaceInfoByIndex( tcpFile, index, &info ); + + if( NT_SUCCESS(status) ) { + memcpy( &entry->wszName[MAX_INTERFACE_NAME_LEN], + &info.if_info, + sizeof(info.if_info) ); + } + closeTcpFile( tcpFile ); - return status; } - status = tdiGetMibForIfEntity( tcpFile, - entity.tei_instance, - (IFEntrySafelySized *) - &entry->wszName[MAX_INTERFACE_NAME_LEN] ); - - closeTcpFile( tcpFile ); return status; } @@ -721,3 +789,48 @@ char *toIPAddressString(unsigned int addr, char string[16]) } return string; } + +DWORD createIpForwardEntryOS( PMIB_IPFORWARDROW pRoute ) { + HANDLE tcpFile = INVALID_HANDLE_VALUE; + NTSTATUS status = openTcpFile( &tcpFile ); + TCP_REQUEST_SET_INFORMATION_EX_SAFELY_SIZED req = + TCP_REQUEST_SET_INFORMATION_INIT; + IPRouteEntry *rte; + TDIEntityID id; + DWORD returnSize = 0; + + DPRINT("Called.\n"); + + if( NT_SUCCESS(status) ) + status = getNthIpEntity( tcpFile, 0, &id ); + + if( NT_SUCCESS(status) ) { + req.Req.ID.toi_class = INFO_CLASS_PROTOCOL; + req.Req.ID.toi_type = INFO_TYPE_PROVIDER; + req.Req.ID.toi_id = IP_MIB_ROUTETABLE_ENTRY_ID; + req.Req.ID.toi_entity = id; + req.Req.BufferSize = sizeof(*rte); + rte = + (IPRouteEntry *)&req.Req.Buffer[0]; + + rte->ire_dest = pRoute->dwForwardDest; + rte->ire_index = pRoute->dwForwardIfIndex; + rte->ire_metric = pRoute->dwForwardMetric1; + rte->ire_gw = pRoute->dwForwardNextHopAS; + rte->ire_mask = pRoute->dwForwardMask; + + status = DeviceIoControl( tcpFile, + IOCTL_TCP_SET_INFORMATION_EX, + &req, + sizeof(req), + NULL, + 0, + &returnSize, + NULL ); + } + + if( tcpFile != INVALID_HANDLE_VALUE ) + closeTcpFile( tcpFile ); + + return status; +} diff --git a/reactos/lib/iphlpapi/iphlp_res.h b/reactos/lib/iphlpapi/iphlp_res.h deleted file mode 100644 index 81d41b27de7..00000000000 --- a/reactos/lib/iphlpapi/iphlp_res.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef _IPHLP_RES_H -#define _IPHLP_RES_H - -typedef struct _IPHLP_RES_INFO { - DWORD riCount; - LPSOCKADDR riAddressList; -} IPHLP_RES_INFO, *PIPHLP_RES_INFO; - -PIPHLP_RES_INFO getResInfo(); -VOID disposeResInfo( PIPHLP_RES_INFO InfoPtr ); - -#endif/*_IPHLP_RES_H*/ diff --git a/reactos/lib/iphlpapi/iphlpapi.c b/reactos/lib/iphlpapi/iphlpapi.c deleted file mode 100644 index d5ee736cb62..00000000000 --- a/reactos/lib/iphlpapi/iphlpapi.c +++ /dev/null @@ -1,1295 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 IP Helper API DLL - * FILE: iphlpapi.c - * PURPOSE: DLL entry - * PROGRAMMERS: Robert Dickenson (robd@reactos.org) - * REVISIONS: - * RDD August 18, 2002 Created - */ - -#include <stdio.h> -#include <windows.h> -#include <tchar.h> -#include <time.h> -#include <stdlib.h> - -#include <winsock2.h> -#include <ws2tcpip.h> -#include <iptypes.h> -#include <ipexport.h> -#include <iphlpapi.h> -#include <icmpapi.h> - -#include "ipprivate.h" -#include "ipregprivate.h" -#include "debug.h" -//#include "trace.h" - -#ifdef __GNUC__ -#define EXPORT STDCALL -#else -#define EXPORT CALLBACK -#endif - -#ifdef DBG - -/* See debug.h for debug/trace constants */ -DWORD DebugTraceLevel = MAX_TRACE; - -#endif /* DBG */ - -/* To make the linker happy */ -//VOID STDCALL KeBugCheck (ULONG BugCheckCode) {} - - -BOOL -EXPORT -DllMain(HANDLE hInstDll, - ULONG dwReason, - PVOID Reserved) -{ - //WSH_DbgPrint(MIN_TRACE, ("DllMain of iphlpapi.dll\n")); - - switch (dwReason) { - case DLL_PROCESS_ATTACH: - /* Don't need thread attach notifications - so disable them to improve performance */ - DisableThreadLibraryCalls(hInstDll); - break; - - case DLL_THREAD_ATTACH: - break; - - case DLL_THREAD_DETACH: - break; - - case DLL_PROCESS_DETACH: - break; - } - return TRUE; -} - - -/* - * @unimplemented - */ -DWORD -STDCALL -AddIPAddress(IPAddr Address, IPMask IpMask, DWORD IfIndex, PULONG NTEContext, PULONG NTEInstance) -{ - UNIMPLEMENTED - return 0L; -} - - -/* - * @unimplemented - */ -DWORD -STDCALL -SetIpNetEntry(PMIB_IPNETROW pArpEntry) -{ - UNIMPLEMENTED - return 0L; -} - - -/* - * @unimplemented - */ -DWORD -STDCALL -CreateIpForwardEntry(PMIB_IPFORWARDROW pRoute) -{ - UNIMPLEMENTED - return 0L; -} - - -/* - * @unimplemented - */ -DWORD -STDCALL -GetAdapterIndex(LPWSTR AdapterName, PULONG IfIndex) -{ - return 0; -} - - -/* - * @unimplemented - */ -DWORD -STDCALL -GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen) -{ - LONG lErr; - DWORD dwSize; - DWORD dwIndex; - BYTE* pNextMemFree = (BYTE*) pAdapterInfo; - ULONG uUsedMemory = 0; - PIP_ADAPTER_INFO pPrevAdapter = NULL; - PIP_ADAPTER_INFO pCurrentAdapter = NULL; - HKEY hAdapters; - HKEY hAdapter; - HKEY hIpConfig; - wchar_t* strAdapter; - wchar_t* strTemp1; - wchar_t* strTemp2; - DWORD dwAdapterLen; - char strTemp[MAX_ADAPTER_NAME_LENGTH + 4]; - - if(pAdapterInfo == NULL && pOutBufLen == NULL) - return ERROR_INVALID_PARAMETER; - ZeroMemory(pAdapterInfo, *pOutBufLen); - - lErr = RegOpenKeyExW(HKEY_LOCAL_MACHINE, - L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Adapters", 0, KEY_READ, &hAdapters); - if(lErr != ERROR_SUCCESS) - return lErr; - - // Determine the size of the largest name of any adapter and the number of adapters. - lErr = RegQueryInfoKeyW(hAdapters, NULL, NULL, NULL, NULL, &dwAdapterLen, NULL, NULL, NULL, NULL, NULL, NULL); - if(lErr != ERROR_SUCCESS) - { - RegCloseKey(hAdapters); - return lErr; - } - dwAdapterLen++; // RegQueryInfoKeyW return value does not include terminating null. - - strAdapter = (wchar_t*) malloc(dwAdapterLen * sizeof(wchar_t)); - - // Enumerate all adapters in SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Adapters. - for(dwIndex = 0; ; dwIndex++) - { - dwSize = dwAdapterLen; // Reset size of the strAdapterLen buffer. - lErr = RegEnumKeyExW(hAdapters, dwIndex, strAdapter, &dwSize, NULL, NULL, NULL, NULL); - if(lErr == ERROR_NO_MORE_ITEMS) - break; - - // TODO Skip NdisWanIP??? - if(wcsstr(strAdapter, L"NdisWanIp") != 0) - continue; - - lErr = RegOpenKeyExW(hAdapters, strAdapter, 0, KEY_READ, &hAdapter); - if(lErr != ERROR_SUCCESS) - continue; - - // Read the IpConfig value. - lErr = RegQueryValueExW(hAdapter, L"IpConfig", NULL, NULL, NULL, &dwSize); - if(lErr != ERROR_SUCCESS) - continue; - - strTemp1 = (wchar_t*) malloc(dwSize); - strTemp2 = (wchar_t*) malloc(dwSize + 35 * sizeof(wchar_t)); - lErr = RegQueryValueExW(hAdapter, L"IpConfig", NULL, NULL, (BYTE*) strTemp1, &dwSize); - if(lErr != ERROR_SUCCESS) - { - free(strTemp1); - free(strTemp2); - continue; - } - swprintf(strTemp2, L"SYSTEM\\CurrentControlSet\\Services\\%s", strTemp1); - - // Open the IpConfig key. - lErr = RegOpenKeyExW(HKEY_LOCAL_MACHINE, strTemp2, 0, KEY_READ, &hIpConfig); - if(lErr != ERROR_SUCCESS) - { - free(strTemp1); - free(strTemp2); - continue; - } - free((void*) strTemp1); - free((void*) strTemp2); - - - // Fill IP_ADAPTER_INFO block. - pCurrentAdapter = (IP_ADAPTER_INFO*) pNextMemFree; - pNextMemFree += sizeof(IP_ADAPTER_INFO); - uUsedMemory += sizeof(IP_ADAPTER_INFO); - if(uUsedMemory > *pOutBufLen) - return ERROR_BUFFER_OVERFLOW; // TODO return the needed size - - // struct _IP_ADAPTER_INFO* Next - if(pPrevAdapter != NULL) - pPrevAdapter->Next = pCurrentAdapter; - // TODO DWORD ComboIndex - // char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4] - wcstombs(strTemp, strAdapter, MAX_ADAPTER_NAME_LENGTH + 4); - strcpy(pCurrentAdapter->AdapterName, strTemp); - // TODO char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4] - // TODO UINT AddressLength - // TODO BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH] - // TODO DWORD Index - // TODO UINT Type - // TODO UINT DhcpEnabled - // TODO PIP_ADDR_STRING CurrentIpAddress - // IP_ADDR_STRING IpAddressList - dwSize = 16; lErr = RegQueryValueExW(hIpConfig, L"IPAddress", NULL, NULL, (BYTE*) &pCurrentAdapter->IpAddressList.IpAddress, &dwSize); - dwSize = 16; lErr = RegQueryValueExW(hIpConfig, L"SubnetMask", NULL, NULL, (BYTE*) &pCurrentAdapter->IpAddressList.IpMask, &dwSize); - if(strstr(pCurrentAdapter->IpAddressList.IpAddress.String, "0.0.0.0") != 0) - { - dwSize = 16; lErr = RegQueryValueExW(hIpConfig, L"DhcpIPAddress", NULL, NULL, (BYTE*) &pCurrentAdapter->IpAddressList.IpAddress, &dwSize); - dwSize = 16; lErr = RegQueryValueExW(hIpConfig, L"DhcpSubnetMask", NULL, NULL, (BYTE*) &pCurrentAdapter->IpAddressList.IpMask, &dwSize); - } - // TODO IP_ADDR_STRING GatewayList - // IP_ADDR_STRING DhcpServer - dwSize = 16; lErr = RegQueryValueExW(hIpConfig, L"DhcpServer", NULL, NULL, (BYTE*) &pCurrentAdapter->DhcpServer.IpAddress, &dwSize); - dwSize = 16; lErr = RegQueryValueExW(hIpConfig, L"DhcpSubnetMask", NULL, NULL, (BYTE*) &pCurrentAdapter->DhcpServer.IpMask, &dwSize); - // TODO BOOL HaveWins - // TODO IP_ADDR_STRING PrimaryWinsServer - // TODO IP_ADDR_STRING SecondaryWinsServer - // TODO time_t LeaseObtained - // TODO time_t LeaseExpires - - pPrevAdapter = pCurrentAdapter; - RegCloseKey(hAdapter); - RegCloseKey(hIpConfig); - } - - // Cleanup - free(strAdapter); - RegCloseKey(hAdapters); - - return ERROR_SUCCESS; -} - - -//////////////////////////////////////////////////////////////////////////////// - -/* - * @implemented - */ -DWORD -STDCALL -GetNumberOfInterfaces(OUT PDWORD pdwNumIf) -{ - DWORD result = NO_ERROR; - HKEY hKey; - LONG errCode; - int i = 0; - - if (pdwNumIf == NULL) return ERROR_INVALID_PARAMETER; - *pdwNumIf = 0; - errCode = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Linkage", 0, KEY_READ, &hKey); - if (errCode == ERROR_SUCCESS) { - DWORD dwSize; - errCode = RegQueryValueExW(hKey, L"Bind", NULL, NULL, NULL, &dwSize); - if (errCode == ERROR_SUCCESS) { - wchar_t* pData = (wchar_t*)malloc(dwSize * sizeof(wchar_t)); - errCode = RegQueryValueExW(hKey, L"Bind", NULL, NULL, (LPBYTE)pData, &dwSize); - if (errCode == ERROR_SUCCESS) { - wchar_t* pStr = pData; - for (i = 0; *pStr != L'\0'; i++) { - pStr = pStr + wcslen(pStr) + 1; // next string - } - } - free(pData); - } - RegCloseKey(hKey); - *pdwNumIf = i; - } else { - result = errCode; - } - return result; -} - - -/* - * @implemented - */ -DWORD -STDCALL -GetInterfaceInfo(PIP_INTERFACE_INFO pIfTable, PULONG pOutBufLen) -{ - DWORD result = ERROR_SUCCESS; - DWORD dwSize; - DWORD dwOutBufLen; - DWORD dwNumIf; - HKEY hKey; - LONG errCode; - int i = 0; - - if ((errCode = GetNumberOfInterfaces(&dwNumIf)) != NO_ERROR) { - _tprintf(_T("GetInterfaceInfo() failed with code 0x%08X - Use FormatMessage to obtain the message string for the returned error\n"), (int)errCode); - return errCode; - } - if (dwNumIf == 0) return ERROR_NO_DATA; // No adapter information exists for the local computer - if (pOutBufLen == NULL) return ERROR_INVALID_PARAMETER; - dwOutBufLen = sizeof(IP_INTERFACE_INFO) + dwNumIf * sizeof(IP_ADAPTER_INDEX_MAP); - if (*pOutBufLen < dwOutBufLen || pIfTable == NULL) { - *pOutBufLen = dwOutBufLen; - return ERROR_INSUFFICIENT_BUFFER; - } - memset(pIfTable, 0, dwOutBufLen); - pIfTable->NumAdapters = dwNumIf - 1; - errCode = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Linkage", 0, KEY_READ, &hKey); - if (errCode == ERROR_SUCCESS) { - errCode = RegQueryValueExW(hKey, L"Bind", NULL, NULL, NULL, &dwSize); - if (errCode == ERROR_SUCCESS) { - wchar_t* pData = (wchar_t*)malloc(dwSize * sizeof(wchar_t)); - errCode = RegQueryValueExW(hKey, L"Bind", NULL, NULL, (LPBYTE)pData, &dwSize); - if (errCode == ERROR_SUCCESS) { - wchar_t* pStr = pData; - for (i = 0; i < pIfTable->NumAdapters && *pStr != L'\0'; pStr += wcslen(pStr) + 1) { - if (wcsstr(pStr, L"\\Device\\NdisWanIp") == 0) { - wcsncpy(pIfTable->Adapter[i].Name, pStr, MAX_ADAPTER_NAME); - pIfTable->Adapter[i].Index = i; - i++; - } - } - - } - free(pData); - } - RegCloseKey(hKey); - } else { - result = errCode; - } - return result; -} - -/* - * EnumNameServers - */ - -static void EnumNameServers( HANDLE RegHandle, PWCHAR Interface, - PVOID Data, EnumNameServersFunc cb ) { - PWCHAR NameServerString = QueryRegistryValueString(RegHandle, L"NameServer"); - /* Now, count the non-empty comma separated */ - if (NameServerString) { - DWORD ch; - DWORD LastNameStart = 0; - for (ch = 0; NameServerString[ch]; ch++) { - if (NameServerString[ch] == ',') { - if (ch - LastNameStart > 0) { /* Skip empty entries */ - PWCHAR NameServer = malloc(sizeof(WCHAR) * (ch - LastNameStart + 1)); - if (NameServer) { - memcpy(NameServer,NameServerString + LastNameStart, - (ch - LastNameStart) * sizeof(WCHAR)); - NameServer[ch - LastNameStart] = 0; - cb( Interface, NameServer, Data ); - free(NameServer); - } - } - LastNameStart = ch + 1; /* The first one after the comma */ - } - } - if (ch - LastNameStart > 0) { /* A last name? */ - PWCHAR NameServer = malloc(sizeof(WCHAR) * (ch - LastNameStart + 1)); - memcpy(NameServer,NameServerString + LastNameStart, - (ch - LastNameStart) * sizeof(WCHAR)); - NameServer[ch - LastNameStart] = 0; - cb( Interface, NameServer, Data ); - free(NameServer); - } - ConsumeRegValueString(NameServerString); - } -} - -/* - * EnumInterfaces - * - * Call the enumeration function for each name server. - */ - -static void EnumInterfaces( PVOID Data, EnumInterfacesFunc cb ) { - HKEY RegHandle; - HKEY ChildKeyHandle = 0; - PWCHAR RegKeyToEnumerate = - L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces"; - PWCHAR ChildKeyName = 0; - DWORD CurrentInterface; - - if (OpenChildKeyRead(HKEY_LOCAL_MACHINE,RegKeyToEnumerate,&RegHandle)) { - return; - } - - for (CurrentInterface = 0; TRUE; CurrentInterface++) { - ChildKeyName = GetNthChildKeyName( RegHandle, CurrentInterface ); - if (!ChildKeyName) break; - if (OpenChildKeyRead(RegHandle,ChildKeyName, - &ChildKeyHandle) == 0) { - cb( ChildKeyHandle, ChildKeyName, Data ); - RegCloseKey( ChildKeyHandle ); - } - ConsumeChildKeyName( ChildKeyName ); - } -} - -static void CreateNameServerListEnumNamesFuncCount( PWCHAR Interface, - PWCHAR Server, - PVOID _Data ) { - PNAME_SERVER_LIST_PRIVATE Data = (PNAME_SERVER_LIST_PRIVATE)_Data; - Data->NumServers++; -} - -static void CreateNameServerListEnumIfFuncCount( HANDLE RegHandle, - PWCHAR InterfaceName, - PVOID _Data ) { - PNAME_SERVER_LIST_PRIVATE Data = (PNAME_SERVER_LIST_PRIVATE)_Data; - EnumNameServers(RegHandle,InterfaceName,Data, - CreateNameServerListEnumNamesFuncCount); -} - -static void CreateNameServerListEnumNamesFunc( PWCHAR Interface, - PWCHAR Server, - PVOID _Data ) { - PNAME_SERVER_LIST_PRIVATE Data = (PNAME_SERVER_LIST_PRIVATE)_Data; - wcstombs(Data->AddrString[Data->CurrentName].IpAddress.String, - Server, - sizeof(IP_ADDRESS_STRING)); - strcpy(Data->AddrString[Data->CurrentName].IpMask.String,"0.0.0.0"); - Data->AddrString[Data->CurrentName].Context = 0; - if (Data->CurrentName < Data->NumServers - 1) { - Data->AddrString[Data->CurrentName].Next = - &Data->AddrString[Data->CurrentName+1]; - } else - Data->AddrString[Data->CurrentName].Next = 0; - - Data->CurrentName++; -} - -static void CreateNameServerListEnumIfFunc( HANDLE RegHandle, - PWCHAR InterfaceName, - PVOID _Data ) { - PNAME_SERVER_LIST_PRIVATE Data = (PNAME_SERVER_LIST_PRIVATE)_Data; - EnumNameServers(RegHandle,InterfaceName,Data, - CreateNameServerListEnumNamesFunc); -} - -static int CountNameServers( PNAME_SERVER_LIST_PRIVATE PrivateData ) { - EnumInterfaces(PrivateData,CreateNameServerListEnumIfFuncCount); - return PrivateData->NumServers; -} - -static void MakeNameServerList( PNAME_SERVER_LIST_PRIVATE PrivateData ) { - EnumInterfaces(PrivateData,CreateNameServerListEnumIfFunc); -} - -/* - * @implemented - */ -DWORD -STDCALL -GetNetworkParams(PFIXED_INFO pFixedInfo, PULONG pOutBufLen) -{ - DWORD result = ERROR_SUCCESS; - DWORD dwSize; - HKEY hKey; - LONG errCode; - NAME_SERVER_LIST_PRIVATE PrivateNSEnum = { 0 }; - - CountNameServers( &PrivateNSEnum ); - - if (pOutBufLen == NULL) return ERROR_INVALID_PARAMETER; - - if (*pOutBufLen < sizeof(FIXED_INFO)) - { - *pOutBufLen = sizeof(FIXED_INFO) + - ((PrivateNSEnum.NumServers - 1) * sizeof(IP_ADDR_STRING)); - return ERROR_BUFFER_OVERFLOW; - } - if (pFixedInfo == NULL) return ERROR_INVALID_PARAMETER; - memset(pFixedInfo, 0, sizeof(FIXED_INFO)); - - errCode = RegOpenKeyExW(HKEY_LOCAL_MACHINE, - L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters", 0, KEY_READ, &hKey); - if (errCode == ERROR_SUCCESS) - { - dwSize = sizeof(pFixedInfo->HostName); - errCode = RegQueryValueExA(hKey, "Hostname", NULL, NULL, (LPBYTE)&pFixedInfo->HostName, &dwSize); - dwSize = sizeof(pFixedInfo->DomainName); - errCode = RegQueryValueExA(hKey, "Domain", NULL, NULL, (LPBYTE)&pFixedInfo->DomainName, &dwSize); - if (errCode != ERROR_SUCCESS) - { - dwSize = sizeof(pFixedInfo->DomainName); - errCode = RegQueryValueExA(hKey, "DhcpDomain", NULL, NULL, (LPBYTE)&pFixedInfo->DomainName, &dwSize); - } - dwSize = sizeof(pFixedInfo->EnableRouting); - errCode = RegQueryValueExW(hKey, L"IPEnableRouter", NULL, NULL, (LPBYTE)&pFixedInfo->EnableRouting, &dwSize); - RegCloseKey(hKey); - - /* Get the number of name servers */ - PIP_ADDR_STRING AddressAfterFixedInfo; - AddressAfterFixedInfo = (PIP_ADDR_STRING)&pFixedInfo[1]; - DWORD NumberOfServersAllowed = 0, CurrentServer = 0; - - while( &AddressAfterFixedInfo[NumberOfServersAllowed] < - (PIP_ADDR_STRING)(((PCHAR)pFixedInfo) + *pOutBufLen) ) - NumberOfServersAllowed++; - - NumberOfServersAllowed++; /* One struct is built in */ - - /* Since the first part of the struct is built in, we have to do some - fiddling */ - PrivateNSEnum.AddrString = - malloc(NumberOfServersAllowed * sizeof(IP_ADDR_STRING)); - if (PrivateNSEnum.NumServers > NumberOfServersAllowed) - PrivateNSEnum.NumServers = NumberOfServersAllowed; - MakeNameServerList( &PrivateNSEnum ); - - /* Now we have the name servers, place the first one in the struct, - and follow it with the rest */ - if (!PrivateNSEnum.NumServers) - RtlZeroMemory( &pFixedInfo->DnsServerList, - sizeof(pFixedInfo->DnsServerList) ); - else - memcpy( &pFixedInfo->DnsServerList, &PrivateNSEnum.AddrString[0], - sizeof(PrivateNSEnum.AddrString[0]) ); - - if (PrivateNSEnum.NumServers > 1) { - pFixedInfo->CurrentDnsServer = &pFixedInfo->DnsServerList; - memcpy( &AddressAfterFixedInfo[0], - &PrivateNSEnum.AddrString[1], - sizeof(IP_ADDR_STRING) * (PrivateNSEnum.NumServers - 1) ); - } else if (PrivateNSEnum.NumServers == 0) { - pFixedInfo->CurrentDnsServer = &pFixedInfo->DnsServerList; - } else { - pFixedInfo->CurrentDnsServer = 0; - } - - for( CurrentServer = 0; - PrivateNSEnum.NumServers && - CurrentServer < PrivateNSEnum.NumServers - 1; - CurrentServer++ ) { - pFixedInfo->CurrentDnsServer->Next = &AddressAfterFixedInfo[CurrentServer]; - pFixedInfo->CurrentDnsServer = &AddressAfterFixedInfo[CurrentServer]; - pFixedInfo->CurrentDnsServer->Next = 0; - } - - /* For now, set the first server as the current server, if there are any */ - if( PrivateNSEnum.NumServers ) { - pFixedInfo->CurrentDnsServer = &pFixedInfo->DnsServerList; - } - - free(PrivateNSEnum.AddrString); - } - else - { - WSH_DbgPrint( MIN_TRACE, - ("Open Tcpip parameters key: error %08x\n", errCode )); - result = ERROR_NO_DATA; // No adapter information exists for the local computer - } - - errCode = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\NetBT\\Parameters", 0, KEY_READ, &hKey); - if (errCode == ERROR_SUCCESS) - { - dwSize = sizeof(pFixedInfo->ScopeId); - errCode = RegQueryValueExA(hKey, "ScopeId", NULL, NULL, (LPBYTE)&pFixedInfo->ScopeId, &dwSize); - if (errCode != ERROR_SUCCESS) - { - dwSize = sizeof(pFixedInfo->ScopeId); - errCode = RegQueryValueExA(hKey, "DhcpScopeId", NULL, NULL, (LPBYTE)&pFixedInfo->ScopeId, &dwSize); - } - dwSize = sizeof(pFixedInfo->NodeType); - errCode = RegQueryValueExW(hKey, L"NodeType", NULL, NULL, (LPBYTE)&pFixedInfo->NodeType, &dwSize); - if (errCode != ERROR_SUCCESS) - { - dwSize = sizeof(pFixedInfo->NodeType); - errCode = RegQueryValueExA(hKey, "DhcpNodeType", NULL, NULL, (LPBYTE)&pFixedInfo->NodeType, &dwSize); - } - dwSize = sizeof(pFixedInfo->EnableProxy); - errCode = RegQueryValueExW(hKey, L"EnableProxy", NULL, NULL, (LPBYTE)&pFixedInfo->EnableProxy, &dwSize); - dwSize = sizeof(pFixedInfo->EnableDns); - errCode = RegQueryValueExW(hKey, L"EnableDNS", NULL, NULL, (LPBYTE)&pFixedInfo->EnableDns, &dwSize); - RegCloseKey(hKey); - } - else - { - WSH_DbgPrint(MIN_TRACE, - ("iphlpapi: Ignoring lack of netbios data for now.\n")); -#if 0 - result = ERROR_NO_DATA; // No adapter information exists for the local computer -#endif - } - - return result; -} - - -/* - * @unimplemented - */ -DWORD -STDCALL -GetTcpStatistics(PMIB_TCPSTATS pStats) -{ - DWORD result = NO_ERROR; - - result = ERROR_NO_DATA; - - return result; -} - - -/* - * @unimplemented - */ -DWORD -STDCALL -GetTcpTable(PMIB_TCPTABLE pTcpTable, PDWORD pdwSize, BOOL bOrder) -{ - DWORD result = NO_ERROR; - - result = ERROR_NO_DATA; - - return result; -} - - -/* - * @unimplemented - */ -DWORD -STDCALL -GetUdpStatistics(PMIB_UDPSTATS pStats) -{ - DWORD result = NO_ERROR; - - result = ERROR_NO_DATA; - - return result; -} - - -/* - * @unimplemented - */ -DWORD -STDCALL -GetUdpTable(PMIB_UDPTABLE pUdpTable, PDWORD pdwSize, BOOL bOrder) -{ - DWORD result = NO_ERROR; - - result = ERROR_NO_DATA; - - return result; -} - - -/* - * @unimplemented - */ -DWORD -STDCALL -FlushIpNetTable(DWORD dwIfIndex) -{ - DWORD result = NO_ERROR; - - return result; -} - -/****************************************************************** - * GetIfEntry (IPHLPAPI.@) - * - * - * PARAMS - * - * pIfRow [In/Out] - * - * RETURNS - * - * DWORD - * - */ -DWORD -STDCALL -GetIfEntry(PMIB_IFROW pIfRow) -{ - DWORD result = NO_ERROR; - - return result; -} - - -/****************************************************************** - * GetIfTable (IPHLPAPI.@) - * - * - * PARAMS - * - * pIfTable [In/Out] - * pdwSize [In/Out] - * bOrder [In] - * - * RETURNS - * - * DWORD - * - */ -DWORD -STDCALL -GetIfTable(PMIB_IFTABLE pIfTable, PULONG pdwSize, BOOL bOrder) -{ - DWORD result = NO_ERROR; - - return result; -} - -/* - * @unimplemented - */ -DWORD STDCALL GetIpAddrTable(PMIB_IPADDRTABLE pIpAddrTable, PULONG pdwSize, - BOOL bOrder) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL GetIpNetTable(PMIB_IPNETTABLE pIpNetTable, PULONG pdwSize, - BOOL bOrder) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL GetIpForwardTable(PMIB_IPFORWARDTABLE pIpForwardTable, - PULONG pdwSize, BOOL bOrder) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL GetIpStatistics(PMIB_IPSTATS pStats) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL GetIpStatisticsEx(PMIB_IPSTATS pStats, DWORD dwFamily) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL GetIcmpStatistics(PMIB_ICMP pStats) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL GetTcpStatisticsEx(PMIB_TCPSTATS pStats, DWORD dwFamily) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL GetUdpStatisticsEx(PMIB_UDPSTATS pStats, DWORD dwFamily) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL SetIfEntry(PMIB_IFROW pIfRow) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL SetIpForwardEntry(PMIB_IPFORWARDROW pRoute) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL DeleteIpForwardEntry(PMIB_IPFORWARDROW pRoute) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL SetIpStatistics(PMIB_IPSTATS pIpStats) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL SetIpTTL(UINT nTTL) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL CreateIpNetEntry(PMIB_IPNETROW pArpEntry) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL DeleteIpNetEntry(PMIB_IPNETROW pArpEntry) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL CreateProxyArpEntry(DWORD dwAddress, DWORD dwMask, - DWORD dwIfIndex) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL DeleteProxyArpEntry(DWORD dwAddress, DWORD dwMask, - DWORD dwIfIndex) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL SetTcpEntry(PMIB_TCPROW pTcpRow) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL GetUniDirectionalAdapterInfo( - PIP_UNIDIRECTIONAL_ADAPTER_ADDRESS pIPIfInfo, PULONG dwOutBufLen) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL GetBestInterface(IPAddr dwDestAddr, PDWORD pdwBestIfIndex) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL GetBestRoute(DWORD dwDestAddr, DWORD dwSourceAddr, - PMIB_IPFORWARDROW pBestRoute) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL NotifyAddrChange(PHANDLE Handle, LPOVERLAPPED overlapped) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL NotifyRouteChange(PHANDLE Handle, LPOVERLAPPED overlapped) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL DeleteIPAddress(ULONG NTEContext) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL GetPerAdapterInfo(ULONG IfIndex, - PIP_PER_ADAPTER_INFO pPerAdapterInfo, PULONG pOutBufLen) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL IpReleaseAddress(PIP_ADAPTER_INDEX_MAP AdapterInfo) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL IpRenewAddress(PIP_ADAPTER_INDEX_MAP AdapterInfo) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL SendARP(IPAddr DestIP, IPAddr SrcIP, PULONG pMacAddr, - PULONG PhyAddrLen) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -BOOL STDCALL GetRTTAndHopCount(IPAddr DestIpAddress, PULONG HopCount, - ULONG MaxHops, PULONG RTT) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL GetFriendlyIfIndex(DWORD IfIndex) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL EnableRouter(HANDLE* pHandle, OVERLAPPED* pOverlapped) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL UnenableRouter(OVERLAPPED* pOverlapped, LPDWORD lpdwEnableCount) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL GetIcmpStatisticsEx(PMIB_ICMP_EX pStats,DWORD dwFamily) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL NhpAllocateAndGetInterfaceInfoFromStack(IP_INTERFACE_NAME_INFO **ppTable,PDWORD pdwCount,BOOL bOrder,HANDLE hHeap,DWORD dwFlags) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL GetBestInterfaceEx(struct sockaddr *pDestAddr,PDWORD pdwBestIfIndex) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -BOOL STDCALL CancelIPChangeNotify(LPOVERLAPPED notifyOverlapped) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -PIP_ADAPTER_ORDER_MAP STDCALL GetAdapterOrderMap(VOID) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL GetAdaptersAddresses(ULONG Family,DWORD Flags,PVOID Reserved,PIP_ADAPTER_ADDRESSES pAdapterAddresses,PULONG pOutBufLen) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL DisableMediaSense(HANDLE *pHandle,OVERLAPPED *pOverLapped) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL RestoreMediaSense(OVERLAPPED* pOverlapped,LPDWORD lpdwEnableCount) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL GetIpErrorString(IP_STATUS ErrorCode,PWCHAR Buffer,PDWORD Size) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -HANDLE STDCALL IcmpCreateFile( - VOID - ) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -HANDLE STDCALL Icmp6CreateFile( - VOID - ) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -BOOL STDCALL IcmpCloseHandle( - HANDLE IcmpHandle - ) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL IcmpSendEcho( - HANDLE IcmpHandle, - IPAddr DestinationAddress, - LPVOID RequestData, - WORD RequestSize, - PIP_OPTION_INFORMATION RequestOptions, - LPVOID ReplyBuffer, - DWORD ReplySize, - DWORD Timeout - ) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD -STDCALL -IcmpSendEcho2( - HANDLE IcmpHandle, - HANDLE Event, - FARPROC ApcRoutine, - PVOID ApcContext, - IPAddr DestinationAddress, - LPVOID RequestData, - WORD RequestSize, - PIP_OPTION_INFORMATION RequestOptions, - LPVOID ReplyBuffer, - DWORD ReplySize, - DWORD Timeout - ) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD -STDCALL -Icmp6SendEcho2( - HANDLE IcmpHandle, - HANDLE Event, - FARPROC ApcRoutine, - PVOID ApcContext, - struct sockaddr_in6 *SourceAddress, - struct sockaddr_in6 *DestinationAddress, - LPVOID RequestData, - WORD RequestSize, - PIP_OPTION_INFORMATION RequestOptions, - LPVOID ReplyBuffer, - DWORD ReplySize, - DWORD Timeout - ) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD -STDCALL -IcmpParseReplies( - LPVOID ReplyBuffer, - DWORD ReplySize - ) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD -STDCALL -Icmp6ParseReplies( - LPVOID ReplyBuffer, - DWORD ReplySize - ) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL AllocateAndGetIfTableFromStack(PMIB_IFTABLE *ppIfTable, - BOOL bOrder, HANDLE heap, DWORD flags) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL AllocateAndGetIpAddrTableFromStack(PMIB_IPADDRTABLE *ppIpAddrTable, - BOOL bOrder, HANDLE heap, DWORD flags) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL AllocateAndGetIpForwardTableFromStack(PMIB_IPFORWARDTABLE * - ppIpForwardTable, BOOL bOrder, HANDLE heap, DWORD flags) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL AllocateAndGetIpNetTableFromStack(PMIB_IPNETTABLE *ppIpNetTable, - BOOL bOrder, HANDLE heap, DWORD flags) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL AllocateAndGetTcpTableFromStack(PMIB_TCPTABLE *ppTcpTable, - BOOL bOrder, HANDLE heap, DWORD flags) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL AllocateAndGetUdpTableFromStack(PMIB_UDPTABLE *ppUdpTable, - BOOL bOrder, HANDLE heap, DWORD flags) -{ - UNIMPLEMENTED - return 0L; -} diff --git a/reactos/lib/iphlpapi/iphlpapi.def b/reactos/lib/iphlpapi/iphlpapi.def deleted file mode 100644 index 57c00a8ad9e..00000000000 --- a/reactos/lib/iphlpapi/iphlpapi.def +++ /dev/null @@ -1,158 +0,0 @@ -; IPHLPAPI.DLL - ReactOS Sockets 2 IP Helper API DLL - -LIBRARY iphlpapi.dll - -EXPORTS -AddIPAddress@20 -SetIpNetEntry@4 -CreateIpForwardEntry@4 -GetAdaptersInfo@8 -GetNetworkParams@8 -GetNumberOfInterfaces@4 -GetIfEntry@4 -GetIfTable@12 -GetInterfaceInfo@8 -GetTcpStatistics@4 -GetTcpTable@12 -GetUdpStatistics@4 -GetUdpTable@12 -FlushIpNetTable@4 -;IpHlpDllEntry -;AllocateAndGetArpEntTableFromStack=AllocateAndGetArpEntTableFromStack -AllocateAndGetIfTableFromStack=AllocateAndGetIfTableFromStack@16 -AllocateAndGetIpAddrTableFromStack=AllocateAndGetIpAddrTableFromStack@16 -AllocateAndGetIpForwardTableFromStack=AllocateAndGetIpForwardTableFromStack@16 -AllocateAndGetIpNetTableFromStack=AllocateAndGetIpNetTableFromStack@16 -;AllocateAndGetTcpExTableFromStack -AllocateAndGetTcpTableFromStack=AllocateAndGetTcpTableFromStack@16 -;AllocateAndGetUdpExTableFromStack -AllocateAndGetUdpTableFromStack=AllocateAndGetUdpTableFromStack@16 -CreateIpNetEntry@4 -CreateProxyArpEntry@12 -DeleteIPAddress@4 -DeleteIpForwardEntry@4 -DeleteIpNetEntry@4 -DeleteProxyArpEntry@12 -DisableMediaSense@8 -EnableRouter@8 -;FlushIpNetTableFromStack -GetAdapterIndex@8 -GetAdapterOrderMap@0 -GetAdaptersAddresses@20 -GetBestInterface@8 -GetBestInterfaceEx@8 -;GetBestInterfaceFromStack -GetBestRoute@12 -;GetBestRouteFromStack -GetFriendlyIfIndex@4 -GetIcmpStatistics@4 -GetIcmpStatisticsEx@8 -;GetIcmpStatsFromStack -;GetIcmpStatsFromStackEx -;GetIfEntryFromStack -;GetIfTableFromStack -;GetIgmpList -GetIpAddrTable@12 -;GetIpAddrTableFromStack -GetIpErrorString@12 -GetIpForwardTable@12 -;GetIpForwardTableFromStack -GetIpNetTable@12 -;GetIpNetTableFromStack -GetIpStatistics@4 -GetIpStatisticsEx@8 -;GetIpStatsFromStack -;GetIpStatsFromStackEx -GetPerAdapterInfo@12 -GetRTTAndHopCount@16 -GetTcpStatisticsEx@8 -;GetTcpStatsFromStack -;GetTcpStatsFromStackEx -;GetTcpTableFromStack -GetUdpStatisticsEx@8 -;GetUdpStatsFromStack -;GetUdpStatsFromStackEx -;GetUdpTableFromStack -GetUniDirectionalAdapterInfo@8 -Icmp6CreateFile@0 -Icmp6ParseReplies@8 -Icmp6SendEcho2@48 -IcmpCloseHandle@4 -IcmpCreateFile@0 -IcmpParseReplies@8 -IcmpSendEcho@32 -IcmpSendEcho2@44 -;InternalCreateIpForwardEntry -;InternalCreateIpNetEntry -;InternalDeleteIpForwardEntry -;InternalDeleteIpNetEntry -;InternalGetIfTable -;InternalGetIpAddrTable -;InternalGetIpForwardTable -;InternalGetIpNetTable -;InternalGetTcpTable -;InternalGetUdpTable -;InternalSetIfEntry -;InternalSetIpForwardEntry -;InternalSetIpNetEntry -;InternalSetIpStats -;InternalSetTcpEntry -IpReleaseAddress@4 -IpRenewAddress@4 -;IsLocalAddress -;NTPTimeToNTFileTime -;NTTimeToNTPTime -;NhGetGuidFromInterfaceName -;NhGetInterfaceNameFromDeviceGuid -;NhGetInterfaceNameFromGuid -NhpAllocateAndGetInterfaceInfoFromStack@20 -;NhpGetInterfaceIndexFromStack -NotifyAddrChange@8 -NotifyRouteChange@8 -;NotifyRouteChangeEx -RestoreMediaSense@8 -;RtlIpv4AddressToStringExA -;RtlIpv4AddressToStringExW -;RtlIpv4StringToAddressExA -;RtlIpv4StringToAddressExW -;RtlIpv6AddressToStringExA -;RtlIpv6AddressToStringExW -;RtlIpv6StringToAddressExA -;RtlIpv6StringToAddressExW -SendARP@16 -;SetAdapterIpAddress -;SetBlockRoutes -SetIfEntry@4 -;SetIfEntryToStack -SetIpForwardEntry@4 -;SetIpForwardEntryToStack -;SetIpMultihopRouteEntryToStack -;SetIpNetEntryToStack -;SetIpRouteEntryToStack -SetIpStatistics@4 -;SetIpStatsToStack -SetIpTTL@4 -;SetProxyArpEntryToStack -;SetRouteWithRef -SetTcpEntry@4 -;SetTcpEntryToStack -UnenableRouter@8 -;@_PfAddFiltersToInterface@24 -;@_PfAddGlobalFilterToInterface@8 -;@_PfBindInterfaceToIPAddress@12 -;@_PfBindInterfaceToIndex@16 -;@_PfCreateInterface@24 -;@_PfDeleteInterface@4 -;@_PfDeleteLog@0 -;@_PfGetInterfaceStatistics@16 -;@_PfMakeLog@4 -;@_PfRebindFilters@8 -;@_PfRemoveFilterHandles@12 -;@_PfRemoveFiltersFromInterface@20 -;@_PfRemoveGlobalFilterFromInterface@8 -;@_PfSetLogBuffer@28 -;@_PfTestPacket@20 -;@_PfUnBindInterface@4 -;do_echo_rep -;do_echo_req -;register_icmp diff --git a/reactos/lib/iphlpapi/iphlpapi.edf b/reactos/lib/iphlpapi/iphlpapi.edf deleted file mode 100644 index 7c42cd373e1..00000000000 --- a/reactos/lib/iphlpapi/iphlpapi.edf +++ /dev/null @@ -1,159 +0,0 @@ -; IPHLPAPI.DLL - ReactOS Sockets 2 IP Helper API DLL - -LIBRARY iphlpapi.dll - -EXPORTS -AddIPAddress=AddIPAddress@20 -SetIpNetEntry=SetIpNetEntry@4 -CreateIpForwardEntry=CreateIpForwardEntry@4 -GetAdaptersInfo=GetAdaptersInfo@8 -GetNetworkParams=GetNetworkParams@8 -GetNumberOfInterfaces=GetNumberOfInterfaces@4 -GetIfEntry=GetIfEntry@4 -GetIfTable=GetIfTable@12 -GetInterfaceInfo=GetInterfaceInfo@8 -GetTcpStatistics=GetTcpStatistics@4 -GetTcpTable=GetTcpTable@12 -GetUdpStatistics=GetUdpStatistics@4 -GetUdpTable=GetUdpTable@12 -FlushIpNetTable=FlushIpNetTable@4 -;IpHlpDllEntry -;AllocateAndGetArpEntTableFromStack -AllocateAndGetIfTableFromStack=AllocateAndGetIfTableFromStack@16 -AllocateAndGetIpAddrTableFromStack=AllocateAndGetIpAddrTableFromStack@16 -AllocateAndGetIpForwardTableFromStack=AllocateAndGetIpForwardTableFromStack@16 -AllocateAndGetIpNetTableFromStack=AllocateAndGetIpNetTableFromStack@16 -;AllocateAndGetTcpExTableFromStack -AllocateAndGetTcpTableFromStack=AllocateAndGetTcpTableFromStack@16 -;AllocateAndGetUdpExTableFromStack -AllocateAndGetUdpTableFromStack=AllocateAndGetUdpTableFromStack@16 -CreateIpNetEntry=CreateIpNetEntry@4 -CreateProxyArpEntry=CreateProxyArpEntry@12 -DeleteIPAddress=DeleteIPAddress@4 -DeleteIpForwardEntry=DeleteIpForwardEntry@4 -DeleteIpNetEntry=DeleteIpNetEntry@4 -DeleteProxyArpEntry=DeleteProxyArpEntry@12 -DisableMediaSense=DisableMediaSense@8 -EnableRouter=EnableRouter@8 -;FlushIpNetTableFromStack -GetAdapterIndex=GetAdapterIndex@8 -GetAdapterOrderMap=GetAdapterOrderMap@0 -GetAdaptersAddresses=GetAdaptersAddresses@20 -GetBestInterface=GetBestInterface@8 -GetBestInterfaceEx=GetBestInterfaceEx@8 -;GetBestInterfaceFromStack -GetBestRoute=GetBestRoute@12 -;GetBestRouteFromStack -GetFriendlyIfIndex=GetFriendlyIfIndex@4 -GetIcmpStatistics=GetIcmpStatistics@4 -GetIcmpStatisticsEx=GetIcmpStatisticsEx@8 -;GetIcmpStatsFromStack -;GetIcmpStatsFromStackEx -;GetIfEntryFromStack -;GetIfTableFromStack -;GetIgmpList -GetIpAddrTable=GetIpAddrTable@12 -;GetIpAddrTableFromStack -GetIpErrorString=GetIpErrorString@12 -GetIpForwardTable=GetIpForwardTable@12 -;GetIpForwardTableFromStack -GetIpNetTable=GetIpNetTable@12 -;GetIpNetTableFromStack -GetIpStatistics=GetIpStatistics@4 -GetIpStatisticsEx=GetIpStatisticsEx@8 -;GetIpStatsFromStack -;GetIpStatsFromStackEx -GetPerAdapterInfo=GetPerAdapterInfo@12 -GetRTTAndHopCount=GetRTTAndHopCount@16 -GetTcpStatisticsEx=GetTcpStatisticsEx@8 -;GetTcpStatsFromStack -;GetTcpStatsFromStackEx -;GetTcpTableFromStack -GetUdpStatisticsEx=GetUdpStatisticsEx@8 -;GetUdpStatsFromStack -;GetUdpStatsFromStackEx -;GetUdpTableFromStack -GetUniDirectionalAdapterInfo=GetUniDirectionalAdapterInfo@8 -Icmp6CreateFile=Icmp6CreateFile@0 -Icmp6ParseReplies=Icmp6ParseReplies@8 -Icmp6SendEcho2=Icmp6SendEcho2@48 -IcmpCloseHandle=IcmpCloseHandle@4 -IcmpCreateFile=IcmpCreateFile@0 -IcmpParseReplies=IcmpParseReplies@8 -IcmpSendEcho=IcmpSendEcho@32 -IcmpSendEcho2=IcmpSendEcho2@44 -;InternalCreateIpForwardEntry -;InternalCreateIpNetEntry -;InternalDeleteIpForwardEntry -;InternalDeleteIpNetEntry -;InternalGetIfTable -;InternalGetIpAddrTable -;InternalGetIpForwardTable -;InternalGetIpNetTable -;InternalGetTcpTable -;InternalGetUdpTable -;InternalSetIfEntry -;InternalSetIpForwardEntry -;InternalSetIpNetEntry -;InternalSetIpStats -;InternalSetTcpEntry -IpReleaseAddress=IpReleaseAddress@4 -IpRenewAddress=IpRenewAddress@4 -;IsLocalAddress -;NTPTimeToNTFileTime -;NTTimeToNTPTime -;NhGetGuidFromInterfaceName -;NhGetInterfaceNameFromDeviceGuid -;NhGetInterfaceNameFromGuid -NhpAllocateAndGetInterfaceInfoFromStack=NhpAllocateAndGetInterfaceInfoFromStack@20 -;NhpGetInterfaceIndexFromStack -NotifyAddrChange=NotifyAddrChange@8 -NotifyRouteChange=NotifyRouteChange@8 -;NotifyRouteChangeEx -RestoreMediaSense=RestoreMediaSense@8 -;RtlIpv4AddressToStringExA -;RtlIpv4AddressToStringExW -;RtlIpv4StringToAddressExA -;RtlIpv4StringToAddressExW -;RtlIpv6AddressToStringExA -;RtlIpv6AddressToStringExW -;RtlIpv6StringToAddressExA -;RtlIpv6StringToAddressExW -SendARP=SendARP@16 -;SetAdapterIpAddress -;SetBlockRoutes -SetIfEntry=SetIfEntry@4 -;SetIfEntryToStack -SetIpForwardEntry=SetIpForwardEntry@4 -;SetIpForwardEntryToStack -;SetIpMultihopRouteEntryToStack -;SetIpNetEntryToStack -;SetIpRouteEntryToStack -SetIpStatistics=SetIpStatistics@4 -;SetIpStatsToStack -SetIpTTL=SetIpTTL@4 -;SetProxyArpEntryToStack -;SetRouteWithRef -SetTcpEntry=SetTcpEntry@4 -;SetTcpEntryToStack -UnenableRouter=UnenableRouter@8 -;_PfAddFiltersToInterface@24 -;_PfAddGlobalFilterToInterface@8 -;_PfBindInterfaceToIPAddress@12 -;_PfBindInterfaceToIndex@16 -;_PfCreateInterface@24 -;_PfDeleteInterface@4 -;_PfDeleteLog@0 -;_PfGetInterfaceStatistics@16 -;_PfMakeLog@4 -;_PfRebindFilters@8 -;_PfRemoveFilterHandles@12 -;_PfRemoveFiltersFromInterface@20 -;_PfRemoveGlobalFilterFromInterface@8 -;_PfSetLogBuffer@28 -;_PfTestPacket@20 -;_PfUnBindInterface@4 -;do_echo_rep -;do_echo_req -;register_icmp -; EOF diff --git a/reactos/lib/iphlpapi/iphlpapi.spec b/reactos/lib/iphlpapi/iphlpapi.spec new file mode 100644 index 00000000000..a9797ac6689 --- /dev/null +++ b/reactos/lib/iphlpapi/iphlpapi.spec @@ -0,0 +1,117 @@ +@ stdcall AddIPAddress( long long long ptr ptr ) +@ stub AllocateAndGetArpEntTableFromStack +@ stdcall AllocateAndGetIfTableFromStack( ptr long long long ) +@ stdcall AllocateAndGetIpAddrTableFromStack( ptr long long long ) +@ stdcall AllocateAndGetIpForwardTableFromStack( ptr long long long ) +@ stdcall AllocateAndGetIpNetTableFromStack( ptr long long long ) +@ stdcall AllocateAndGetTcpTableFromStack( ptr long long long ) +@ stdcall AllocateAndGetUdpTableFromStack( ptr long long long ) +@ stdcall CreateIpForwardEntry( ptr ) +@ stdcall CreateIpNetEntry( ptr ) +@ stdcall CreateProxyArpEntry( long long long ) +@ stdcall DeleteIPAddress( long ) +@ stdcall DeleteIpForwardEntry( ptr ) +@ stdcall DeleteIpNetEntry( ptr ) +@ stdcall DeleteProxyArpEntry( long long long ) +@ stdcall EnableRouter( ptr ptr ) +@ stdcall FlushIpNetTable( long ) +@ stub FlushIpNetTableFromStack +@ stdcall GetAdapterIndex( wstr ptr ) +@ stub GetAdapterOrderMap +@ stdcall GetAdaptersInfo( ptr ptr ) +@ stdcall GetBestInterface( long ptr ) +@ stub GetBestInterfaceFromStack +@ stdcall GetBestRoute( long long long ) +@ stub GetBestRouteFromStack +@ stdcall GetFriendlyIfIndex( long ) +@ stdcall GetIcmpStatistics( ptr ) +@ stub GetIcmpStatsFromStack +@ stdcall GetIfEntry( ptr ) +@ stub GetIfEntryFromStack +@ stdcall GetIfTable( ptr ptr long ) +@ stub GetIfTableFromStack +@ stub GetIgmpList +@ stdcall GetInterfaceInfo( ptr ptr ) +@ stdcall GetIpAddrTable( ptr ptr long ) +@ stub GetIpAddrTableFromStack +@ stdcall GetIpForwardTable( ptr ptr long ) +@ stub GetIpForwardTableFromStack +@ stdcall GetIpNetTable( ptr ptr long ) +@ stub GetIpNetTableFromStack +@ stdcall GetIpStatistics( ptr ) +@ stub GetIpStatsFromStack +@ stdcall GetNetworkParams( ptr ptr ) +@ stdcall GetNumberOfInterfaces( ptr ) +@ stdcall GetPerAdapterInfo( long ptr ptr ) +@ stdcall GetRTTAndHopCount( long ptr long ptr ) +@ stdcall GetTcpStatistics( ptr ) +@ stub GetTcpStatsFromStack +@ stdcall GetTcpTable( ptr ptr long ) +@ stub GetTcpTableFromStack +@ stdcall GetUdpStatistics( ptr ) +@ stub GetUdpStatsFromStack +@ stdcall GetUdpTable( ptr ptr long ) +@ stub GetUdpTableFromStack +@ stdcall GetUniDirectionalAdapterInfo( ptr ptr ) +@ stub InternalCreateIpForwardEntry +@ stub InternalCreateIpNetEntry +@ stub InternalDeleteIpForwardEntry +@ stub InternalDeleteIpNetEntry +@ stub InternalGetIfTable +@ stub InternalGetIpAddrTable +@ stub InternalGetIpForwardTable +@ stub InternalGetIpNetTable +@ stub InternalGetTcpTable +@ stub InternalGetUdpTable +@ stub InternalSetIfEntry +@ stub InternalSetIpForwardEntry +@ stub InternalSetIpNetEntry +@ stub InternalSetIpStats +@ stub InternalSetTcpEntry +@ stdcall IpReleaseAddress( ptr ) +@ stdcall IpRenewAddress( ptr ) +@ stub IsLocalAddress +@ stub NTPTimeToNTFileTime +@ stub NTTimeToNTPTime +@ stub NhGetGuidFromInterfaceName +@ stub NhGetInterfaceNameFromGuid +@ stub NhpAllocateAndGetInterfaceInfoFromStack +@ stub NhpGetInterfaceIndexFromStack +@ stdcall NotifyAddrChange( ptr ptr ) +@ stdcall NotifyRouteChange( ptr ptr ) +@ stub NotifyRouteChangeEx +@ stub _PfAddFiltersToInterface@24 +@ stub _PfAddGlobalFilterToInterface@8 +@ stub _PfBindInterfaceToIPAddress@12 +@ stub _PfBindInterfaceToIndex@16 +@ stub _PfCreateInterface@24 +@ stub _PfDeleteInterface@4 +@ stub _PfDeleteLog@0 +@ stub _PfGetInterfaceStatistics@16 +@ stub _PfMakeLog@4 +@ stub _PfRebindFilters@8 +@ stub _PfRemoveFilterHandles@12 +@ stub _PfRemoveFiltersFromInterface@20 +@ stub _PfRemoveGlobalFilterFromInterface@8 +@ stub _PfSetLogBuffer@28 +@ stub _PfTestPacket@20 +@ stub _PfUnBindInterface@4 +@ stdcall SendARP( long long ptr ptr ) +@ stub SetAdapterIpAddress +@ stub SetBlockRoutes +@ stdcall SetIfEntry( ptr ) +@ stub SetIfEntryToStack +@ stdcall SetIpForwardEntry( ptr ) +@ stub SetIpForwardEntryToStack +@ stub SetIpMultihopRouteEntryToStack +@ stdcall SetIpNetEntry( ptr ) +@ stub SetIpNetEntryToStack +@ stub SetIpRouteEntryToStack +@ stdcall SetIpStatistics( ptr ) +@ stub SetIpStatsToStack +@ stdcall SetIpTTL( long ) +@ stub SetProxyArpEntryToStack +@ stub SetRouteWithRef +@ stdcall SetTcpEntry( ptr ) +@ stub SetTcpEntryToStack +@ stdcall UnenableRouter( ptr ptr ) diff --git a/reactos/lib/iphlpapi/iphlpapi_main.c b/reactos/lib/iphlpapi/iphlpapi_main.c index 8a93ef03087..9888e845151 100644 --- a/reactos/lib/iphlpapi/iphlpapi_main.c +++ b/reactos/lib/iphlpapi/iphlpapi_main.c @@ -18,9 +18,8 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif +#include "iphlpapi_private.h" #include <stdarg.h> #include <stdlib.h> @@ -38,28 +37,16 @@ # include <resolv.h> #endif -#ifdef __REACTOS__ -# include <windows.h> -# include <windef.h> -# include <winbase.h> -# include <net/miniport.h> -# include <winsock2.h> -# include <nspapi.h> -# include <iptypes.h> -# include "iphlpapiextra.h" -# include "wine/debug.h" -#else -# include "windef.h" -# include "winbase.h" -# include "winreg.h" -# include "debug.h" -#endif -#include <stdio.h> +#include "windef.h" +#include "winbase.h" +#include "winreg.h" #include "iphlpapi.h" #include "ifenum.h" #include "ipstats.h" -#include "iphlp_res.h" +#include "resinfo.h" +#include "route.h" +#include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(iphlpapi); @@ -350,10 +337,7 @@ DWORD WINAPI AllocateAndGetUdpTableFromStack(PMIB_UDPTABLE *ppUdpTable, */ DWORD WINAPI CreateIpForwardEntry(PMIB_IPFORWARDROW pRoute) { - TRACE("pRoute %p\n", pRoute); - /* could use SIOCADDRT, not sure I want to */ - FIXME(":stub\n"); - return (DWORD) 0; + return createIpForwardEntry( pRoute ); } @@ -441,10 +425,7 @@ DWORD WINAPI DeleteIPAddress(ULONG NTEContext) */ DWORD WINAPI DeleteIpForwardEntry(PMIB_IPFORWARDROW pRoute) { - TRACE("pRoute %p\n", pRoute); - /* could use SIOCDELRT, not sure I want to */ - FIXME(":stub\n"); - return (DWORD) 0; + return deleteIpForwardEntry( pRoute ); } @@ -847,7 +828,7 @@ DWORD WINAPI GetIfEntry(PMIB_IFROW pIfRow) if (name) { ret = getInterfaceEntryByIndex(pIfRow->dwIndex, pIfRow); if (ret == NO_ERROR) - ret = getInterfaceStatsByIndex(pIfRow->dwIndex, pIfRow); + ret = getInterfaceStatsByName(name, pIfRow); consumeInterfaceName(name); } else @@ -1355,8 +1336,6 @@ DWORD WINAPI GetNetworkParams(PFIXED_INFO pFixedInfo, PULONG pOutBufLen) if (!resInfo) return ERROR_OUTOFMEMORY; - TRACE("resInfo->riCount = %d\n", resInfo->riCount); - size = sizeof(FIXED_INFO) + (resInfo->riCount > 0 ? (resInfo->riCount - 1) * sizeof(IP_ADDR_STRING) : 0); if (!pFixedInfo || *pOutBufLen < size) { @@ -1379,8 +1358,10 @@ DWORD WINAPI GetNetworkParams(PFIXED_INFO pFixedInfo, PULONG pOutBufLen) for (i = 0, ptr = &pFixedInfo->DnsServerList; i < resInfo->riCount && ptr; i++, ptr = ptr->Next) { + struct sockaddr_in *addr_v4 = + (struct sockaddr_in *)&resInfo->riAddressList[i]; toIPAddressString - (((PSOCKADDR_IN)&resInfo->riAddressList[i])->sin_addr.s_addr, + (addr_v4->sin_addr.s_addr, ptr->IpAddress.String); if (i == resInfo->riCount - 1) ptr->Next = NULL; @@ -1916,12 +1897,7 @@ DWORD WINAPI SetIfEntry(PMIB_IFROW pIfRow) */ DWORD WINAPI SetIpForwardEntry(PMIB_IPFORWARDROW pRoute) { - TRACE("pRoute %p\n", pRoute); - /* this is to add a route entry, how's it distinguishable from - CreateIpForwardEntry? - could use SIOCADDRT, not sure I want to */ - FIXME(":stub\n"); - return (DWORD) 0; + return setIpForwardEntry( pRoute ); } @@ -2039,9 +2015,9 @@ DWORD WINAPI UnenableRouter(OVERLAPPED * pOverlapped, LPDWORD lpdwEnableCount) /* * @unimplemented */ -DWORD STDCALL GetIpErrorString(IP_STATUS ErrorCode,PWCHAR Buffer,PDWORD Size) +DWORD WINAPI GetIpErrorString(IP_STATUS ErrorCode,PWCHAR Buffer,PDWORD Size) { - UNIMPLEMENTED + FIXME(":stub\n"); return 0L; } @@ -2049,54 +2025,55 @@ DWORD STDCALL GetIpErrorString(IP_STATUS ErrorCode,PWCHAR Buffer,PDWORD Size) /* * @unimplemented */ -PIP_ADAPTER_ORDER_MAP STDCALL GetAdapterOrderMap(VOID) +PIP_ADAPTER_ORDER_MAP WINAPI GetAdapterOrderMap(VOID) { - UNIMPLEMENTED + FIXME(":stub\n"); return 0L; } /* * @unimplemented */ -DWORD STDCALL GetAdaptersAddresses(ULONG Family,DWORD Flags,PVOID Reserved,PIP_ADAPTER_ADDRESSES pAdapterAddresses,PULONG pOutBufLen) +DWORD WINAPI GetAdaptersAddresses(ULONG Family,DWORD Flags,PVOID Reserved,PIP_ADAPTER_ADDRESSES pAdapterAddresses,PULONG pOutBufLen) { - UNIMPLEMENTED + FIXME(":stub\n"); return 0L; } /* * @unimplemented */ -BOOL STDCALL CancelIPChangeNotify(LPOVERLAPPED notifyOverlapped) +BOOL WINAPI CancelIPChangeNotify(LPOVERLAPPED notifyOverlapped) { - UNIMPLEMENTED + FIXME(":stub\n"); return 0L; } /* * @unimplemented */ -DWORD STDCALL GetBestInterfaceEx(struct sockaddr *pDestAddr,PDWORD pdwBestIfIndex) +DWORD WINAPI GetBestInterfaceEx(struct sockaddr *pDestAddr,PDWORD pdwBestIfIndex) { - UNIMPLEMENTED + FIXME(":stub\n"); return 0L; } /* * @unimplemented */ -DWORD STDCALL NhpAllocateAndGetInterfaceInfoFromStack(IP_INTERFACE_NAME_INFO **ppTable,PDWORD pdwCount,BOOL bOrder,HANDLE hHeap,DWORD dwFlags) +DWORD WINAPI NhpAllocateAndGetInterfaceInfoFromStack(IP_INTERFACE_NAME_INFO **ppTable,PDWORD pdwCount,BOOL bOrder,HANDLE hHeap,DWORD dwFlags) { - UNIMPLEMENTED + FIXME(":stub\n"); return 0L; } /* * @unimplemented */ -DWORD STDCALL GetIcmpStatisticsEx(PMIB_ICMP_EX pStats,DWORD dwFamily) +DWORD WINAPI GetIcmpStatisticsEx(PMIB_ICMP_EX pStats,DWORD dwFamily) { - UNIMPLEMENTED + FIXME(":stub\n"); return 0L; } + diff --git a/reactos/lib/iphlpapi/iphlpv6.c b/reactos/lib/iphlpapi/iphlpv6.c index 6c6472b5488..f624bf8678d 100644 --- a/reactos/lib/iphlpapi/iphlpv6.c +++ b/reactos/lib/iphlpapi/iphlpv6.c @@ -1,6 +1,28 @@ -#ifdef HAVE_CONFIG_H +/* + * iphlpapi dll implementation -- Auxiliary IPv6 stubs + * + * These are stubs for functions that provide and set IPv6 information on the + * target operating system. They are grouped here because their + * implementation will vary widely by operating system. + * + * Copyright (C) 2004 Art Yerkes + * 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 "config.h" -#endif +#include "iphlpapi_private.h" #include <stdarg.h> #include <stdlib.h> @@ -18,36 +40,23 @@ # include <resolv.h> #endif -#ifdef __REACTOS__ -# include <windows.h> -# include <windef.h> -# include <winbase.h> -# include <net/miniport.h> -# include <winsock2.h> -# include <nspapi.h> -# include <iptypes.h> -# include <ws2tcpip.h> -# include "iphlpapiextra.h" -#else -# include "windef.h" -# include "winbase.h" -# include "winreg.h" -#endif - +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "resinfo.h" #include "iphlpapi.h" -#include "ifenum.h" -#include "ipstats.h" -#include "iphlp_res.h" #include "wine/debug.h" +WINE_DEFAULT_DEBUG_CHANNEL(iphlpapi); + /* * @unimplemented */ -HANDLE STDCALL Icmp6CreateFile( +HANDLE WINAPI Icmp6CreateFile( VOID ) { - UNIMPLEMENTED + FIXME(":stub\n"); return 0L; } @@ -55,7 +64,7 @@ HANDLE STDCALL Icmp6CreateFile( * @unimplemented */ DWORD -STDCALL +WINAPI Icmp6SendEcho2( HANDLE IcmpHandle, HANDLE Event, @@ -71,7 +80,7 @@ Icmp6SendEcho2( DWORD Timeout ) { - UNIMPLEMENTED + FIXME(":stub\n"); return 0L; } @@ -79,13 +88,13 @@ Icmp6SendEcho2( * @unimplemented */ DWORD -STDCALL +WINAPI Icmp6ParseReplies( LPVOID ReplyBuffer, DWORD ReplySize ) { - UNIMPLEMENTED + FIXME(":stub\n"); return 0L; } diff --git a/reactos/lib/iphlpapi/ipprivate.h b/reactos/lib/iphlpapi/ipprivate.h deleted file mode 100644 index bd4955caeea..00000000000 --- a/reactos/lib/iphlpapi/ipprivate.h +++ /dev/null @@ -1,92 +0,0 @@ -#ifndef IPPRIVATE_H -#define IPPRIVATE_H - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <stdarg.h> -#include <stdlib.h> -#include <sys/types.h> -#ifdef HAVE_NETINET_IN_H -# include <netinet/in.h> -#endif -#ifdef HAVE_ARPA_INET_H -# include <arpa/inet.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -# include <arpa/nameser.h> -#endif -#ifdef HAVE_RESOLV_H -# include <resolv.h> -#endif - -#define NTOS_MODE_USER -#include <ntos.h> -#include <ddk/ntddk.h> -#include <rosrtl/string.h> -#include <ntdll/rtl.h> -#include <windows.h> -#include <windef.h> -#include <winbase.h> -#include <net/miniport.h> -#include <winsock2.h> -#include <nspapi.h> -#include <iptypes.h> -#include "iphlpapiextra.h" -#include "ipregprivate.h" -#include "iphlpapi.h" -#include "ifenum.h" -#include "ipstats.h" -#include "iphlp_res.h" -#include "wine/debug.h" - -#undef TRACE -#define TRACE(fmt,args...) DbgPrint("(%s:%d - %s) " fmt, __FILE__, __LINE__, __FUNCTION__, ## args) - -#include "net/tdiinfo.h" -#include "tcpioctl.h" - -#ifndef ETH_ALEN -#define ETH_ALEN 6 -#endif - -#ifndef INADDR_NONE -#define INADDR_NONE (~0U) -#endif - -#ifndef IFENT_SOFTWARE_LOOPBACK -#define IFENT_SOFTWARE_LOOPBACK 24 /* This is an SNMP constant from rfc1213 */ -#endif/*IFENT_SOFTWARE_LOOPBACK*/ - -#define INDEX_IS_LOOPBACK 0x00800000 - -/* Type declarations */ - -#ifndef IFNAMSIZ -#define IFNAMSIZ 0x20 -#endif/*IFNAMSIZ*/ - -#define TCP_REQUEST_QUERY_INFORMATION_INIT { { { 0 } } } - -/* No caddr_t in reactos headers */ -typedef char *caddr_t; - -typedef union _IFEntrySafelySized { - PCHAR MaxSize[sizeof(DWORD) + - sizeof(IFEntry) + - MAX_ADAPTER_DESCRIPTION_LENGTH + 1]; - struct { - DWORD ProperlyOffsetTheStructure; - IFEntry ent; - } offset; -} IFEntrySafelySized; - -/** Prototypes **/ -NTSTATUS openTcpFile(PHANDLE tcpFile); -VOID closeTcpFile(HANDLE tcpFile); -NTSTATUS tdiGetEntityIDSet( HANDLE tcpFile, TDIEntityID **entitySet, - PDWORD numEntities ); -VOID tdiFreeThingSet( PVOID things ); - -#endif/*IPPRIVATE_H*/ diff --git a/reactos/lib/iphlpapi/ipregprivate.h b/reactos/lib/iphlpapi/ipregprivate.h deleted file mode 100644 index a9e370c2eab..00000000000 --- a/reactos/lib/iphlpapi/ipregprivate.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef IPREGPRIVATE_H -#define IPREGPRIVATE_H - -int GetLongestChildKeyName( HANDLE RegHandle ); -LONG OpenChildKeyRead( HANDLE RegHandle, - PCHAR ChildKeyName, - PHKEY ReturnHandle ); -PCHAR GetNthChildKeyName( HANDLE RegHandle, DWORD n ); -void ConsumeChildKeyName( PCHAR Name ); -PCHAR QueryRegistryValueString( HANDLE RegHandle, PCHAR ValueName ); -void ConsumeRegValueString( PCHAR NameServer ); - -#endif/*IPREGPRIVATE_H*/ diff --git a/reactos/lib/iphlpapi/ipstats_reactos.c b/reactos/lib/iphlpapi/ipstats_reactos.c index 34a072375a1..4f5e6da9a0e 100644 --- a/reactos/lib/iphlpapi/ipstats_reactos.c +++ b/reactos/lib/iphlpapi/ipstats_reactos.c @@ -1,4 +1,5 @@ -/* Copyright (C) 2003 Juan Lang +/* Copyright (C) 2003 Art Yerkes + * A reimplementation of ifenum.c by Juan Lang * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -14,11 +15,11 @@ * 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 file implements statistics getting using the /proc filesystem exported - * by Linux, and maybe other OSes. + * This file is implemented on the IOCTL_TCP_QUERY_INFORMATION_EX ioctl on + * tcpip.sys */ -#include "ipprivate.h" +#include "iphlpapi_private.h" #include "ipstats.h" #include "ifenum.h" @@ -101,10 +102,9 @@ NTSTATUS getNthIpEntity( HANDLE tcpFile, DWORD index, TDIEntityID *ent ) { } } - DPRINT("Index %d is entity #%d - %04x:%08x\n", index, i, - entitySet[i].tei_entity, entitySet[i].tei_instance ); - if( numRoutes == index && i < numEntities ) { + DPRINT("Index %d is entity #%d - %04x:%08x\n", index, i, + entitySet[i].tei_entity, entitySet[i].tei_instance ); memcpy( ent, &entitySet[i], sizeof(*ent) ); tdiFreeThingSet( entitySet ); return STATUS_SUCCESS; @@ -169,27 +169,41 @@ NTSTATUS tdiGetMibForIpEntity } NTSTATUS tdiGetRoutesForIpEntity -( HANDLE tcpFile, TDIEntityID *ent, int numRoutes, IPRouteEntry *routes ) { - TCP_REQUEST_QUERY_INFORMATION_EX req = TCP_REQUEST_QUERY_INFORMATION_INIT; +( HANDLE tcpFile, TDIEntityID *ent, IPRouteEntry **routes, PDWORD numRoutes ) { NTSTATUS status = STATUS_SUCCESS; - DWORD returnSize; DPRINT("TdiGetRoutesForIpEntity(tcpFile %x,entityId %x)\n", (DWORD)tcpFile, ent->tei_instance); - req.ID.toi_class = INFO_CLASS_PROTOCOL; - req.ID.toi_type = INFO_TYPE_PROVIDER; - req.ID.toi_id = IP_MIB_ROUTETABLE_ENTRY_ID; - req.ID.toi_entity = *ent; + status = tdiGetSetOfThings( tcpFile, + INFO_CLASS_PROTOCOL, + INFO_TYPE_PROVIDER, + IP_MIB_ROUTETABLE_ENTRY_ID, + ent->tei_entity, + 0, + sizeof(IPRouteEntry), + (PVOID *)routes, + numRoutes); - status = DeviceIoControl( tcpFile, - IOCTL_TCP_QUERY_INFORMATION_EX, - &req, - sizeof(req), - routes, - sizeof(*routes) * numRoutes, - &returnSize, - NULL ); + return status; +} + +NTSTATUS tdiGetIpAddrsForIpEntity +( HANDLE tcpFile, TDIEntityID *ent, IPAddrEntry **addrs, PDWORD numAddrs ) { + NTSTATUS status; + + DPRINT("TdiGetIpAddrsForIpEntity(tcpFile %x,entityId %x)\n", + (DWORD)tcpFile, ent->tei_instance); + + status = tdiGetSetOfThings( tcpFile, + INFO_CLASS_PROTOCOL, + INFO_TYPE_PROVIDER, + IP_MIB_ADDRTABLE_ENTRY_ID, + ent->tei_entity, + 0, + sizeof(IPAddrEntry), + (PVOID *)addrs, + numAddrs ); return status; } @@ -444,9 +458,6 @@ RouteTable *getRouteTable(void) getNthIpEntity( tcpFile, i, &ent ); tdiGetMibForIpEntity( tcpFile, &ent, &snmpInfo ); - route_set = HeapAlloc( GetProcessHeap(), 0, - sizeof( IPRouteEntry ) * - snmpInfo.ipsi_numroutes ); DPRINT( "%d routes in instance %d\n", snmpInfo.ipsi_numroutes, i ); @@ -456,7 +467,7 @@ RouteTable *getRouteTable(void) return 0; } - tdiGetRoutesForIpEntity( tcpFile, &ent, numRoutes, route_set ); + tdiGetRoutesForIpEntity( tcpFile, &ent, &route_set, &numRoutes ); DPRINT("Route set returned\n"); #if 0 @@ -479,6 +490,8 @@ RouteTable *getRouteTable(void) route_set[j].ire_metric; } + if( route_set ) tdiFreeThingSet( route_set ); + routesAdded += snmpInfo.ipsi_numroutes; } diff --git a/reactos/lib/iphlpapi/makefile b/reactos/lib/iphlpapi/makefile index 8871cad628e..ea2bf2c5cbd 100644 --- a/reactos/lib/iphlpapi/makefile +++ b/reactos/lib/iphlpapi/makefile @@ -2,20 +2,17 @@ PATH_TO_TOP = ../.. -TARGET_TYPE = dynlink +TARGET_TYPE = winedll TARGET_NAME = iphlpapi TARGET_BASE = 0x777c0000 -TARGET_CFLAGS += -DYDEBUG -DUNICODE -D_UNICODE -D__USE_W32API -D__REACTOS__ -D_WIN32_WINNT=0x0500 -Wall -#-Werror +TARGET_CFLAGS += -DYDEBUG -DUNICODE -D_UNICODE -D__USE_W32API -D__REACTOS__ -Wall -Werror +# -D_WIN32_WINNT=0x0500 TARGET_SDKLIBS = ntdll.a kernel32.a ws2_32.a -TARGET_OBJECTS = iphlpapi_main.o icmp.o iphlpv6.o media.o registry.o \ - ifenum_reactos.o ipstats_reactos.o resinfo_reactos.o - DEP_OBJECTS = $(TARGET_OBJECTS) include $(PATH_TO_TOP)/rules.mak diff --git a/reactos/lib/iphlpapi/media.c b/reactos/lib/iphlpapi/media.c index bd6a7c74966..ceb78b6245b 100644 --- a/reactos/lib/iphlpapi/media.c +++ b/reactos/lib/iphlpapi/media.c @@ -1,43 +1,23 @@ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <stdarg.h> -#include <stdlib.h> -#include <sys/types.h> -#ifdef HAVE_NETINET_IN_H -# include <netinet/in.h> -#endif -#ifdef HAVE_ARPA_INET_H -# include <arpa/inet.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -# include <arpa/nameser.h> -#endif -#ifdef HAVE_RESOLV_H -# include <resolv.h> -#endif - -#ifdef __REACTOS__ -# include <windows.h> -# include <windef.h> -# include <winbase.h> -# include <net/miniport.h> -# include <winsock2.h> -# include <nspapi.h> -# include <iptypes.h> -# include "iphlpapiextra.h" -#else -# include "windef.h" -# include "winbase.h" -# include "winreg.h" -#endif - -#include "iphlpapi.h" -#include "ifenum.h" -#include "ipstats.h" -#include "iphlp_res.h" -#include "wine/debug.h" +/* + * iphlpapi dll implementation -- physical media stubs + * + * Copyright (C) 2004 Art Yerkes + * + * 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 "iphlpapi_private.h" /* * @unimplemented diff --git a/reactos/lib/iphlpapi/merge-notes.txt b/reactos/lib/iphlpapi/merge-notes.txt index 71f318919b1..8be72a710e7 100644 --- a/reactos/lib/iphlpapi/merge-notes.txt +++ b/reactos/lib/iphlpapi/merge-notes.txt @@ -3,11 +3,14 @@ Wine uses: Software\\Wine\\Wine\\Config\\Network -- Wins support is todo so this part isn't so important. -- Overall, workable Wine uses ansi functions + +-- Done -- GetNetworkParams -- -- Make workable interface for _res -- Wine based on real _res -- Reactos based on my enumerator funcs +-- Done -- Prints route info on windows ROUTE PRINT: iphlpapi_main.c:137 - ppIfTable 0104bd80, bOrder 1, heap 0xa0000000, flags 0x00000001 @@ -34,3 +37,20 @@ iphlpapi_main.c:1151 - pIpForwardTable a0001d68, pdwSize 0104bd00, bOrder 1 - GetIpForwardTable again iphlpapi_main.c:1214 - returning 122 iphlpapi_main.c:225 - returning 122 + +Overall architecture of the ifenum and ipstats functions. + +Right now, I rely heavily on a couple of enumeration functions. +What I need to do is consolidate them and reduce traffic on the ioctl. + +There are two things I need to do: + +1. Lookup an interface by index (or name) +2. Get the IP info + +I have too many functions that loop over various things. + +What I need are the get** functions from ipstats (which I think are ok) +And then to change the detritus in ifenum to be all based on +getInterfaceIndexTable and getInterfaceMibByIndex, getInterfaceMibByName + diff --git a/reactos/lib/iphlpapi/registry.c b/reactos/lib/iphlpapi/registry.c index 99ae679931d..614bbdec492 100644 --- a/reactos/lib/iphlpapi/registry.c +++ b/reactos/lib/iphlpapi/registry.c @@ -1,8 +1,4 @@ -#include <stdio.h> -#include <windows.h> -#include <tchar.h> -#include <stdlib.h> -#include "ipregprivate.h" +#include "iphlpapi_private.h" #include "debug.h" diff --git a/reactos/lib/iphlpapi/resinfo.c b/reactos/lib/iphlpapi/resinfo.c new file mode 100644 index 00000000000..39c213bda03 --- /dev/null +++ b/reactos/lib/iphlpapi/resinfo.c @@ -0,0 +1,61 @@ +/* + * iphlpapi dll implementation -- Setting and storing route information + * + * These are stubs for functions that set routing information on the target + * operating system. They are grouped here because their implementation will + * vary widely by operating system. + * + * Copyright (C) 2004 Art Yerkes + * 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 "config.h" +#include "iphlpapi_private.h" + +#include <stdarg.h> +#include <stdlib.h> +#include <sys/types.h> +#ifdef HAVE_NETINET_IN_H +# include <netinet/in.h> +#endif +#ifdef HAVE_ARPA_INET_H +# include <arpa/inet.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +# include <arpa/nameser.h> +#endif +#ifdef HAVE_RESOLV_H +# include <resolv.h> +#endif + +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "resinfo.h" +#include "iphlpapi.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(iphlpapi); + +IPHLP_RES_INFO ResInfo; + +PIPHLP_RES_INFO getResInfo() { + ResInfo.riCount = _res.nscount; + ResInfo.riAddressList = _res.nsaddr_list; + return &ResInfo; +} + +VOID disposeResInfo( PIPHLP_RES_INFO InfoPtr ) { +} diff --git a/reactos/lib/iphlpapi/resinfo.h b/reactos/lib/iphlpapi/resinfo.h new file mode 100644 index 00000000000..be71202c582 --- /dev/null +++ b/reactos/lib/iphlpapi/resinfo.h @@ -0,0 +1,35 @@ +/* + * iphlpapi dll implementation -- Resolver information helper function + * prototypes + * + * Copyright (C) 2004 Art Yerkes + * 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 _IPHLP_RES_H +#define _IPHLP_RES_H + +typedef struct _IPHLP_RES_INFO { + DWORD riCount; + struct sockaddr_in *riAddressList; +} IPHLP_RES_INFO, *PIPHLP_RES_INFO; + +/* Get resolver info. This currently is limited to a list of IP addresses + * that name our DNS server list. */ +PIPHLP_RES_INFO getResInfo(); +/* Release any resources used in acquiring the resolver information */ +VOID disposeResInfo( PIPHLP_RES_INFO InfoPtr ); + +#endif/*_IPHLP_RES_H*/ diff --git a/reactos/lib/iphlpapi/resinfo_reactos.c b/reactos/lib/iphlpapi/resinfo_reactos.c index ec85a600b60..39f6aaf14ae 100644 --- a/reactos/lib/iphlpapi/resinfo_reactos.c +++ b/reactos/lib/iphlpapi/resinfo_reactos.c @@ -1,6 +1,27 @@ -#ifdef HAVE_CONFIG_H +/* + * iphlpapi dll implementation -- Auxiliary icmp functions + * + * These are stubs for functions that provide a simple ICMP probing API. They + * will be operating system specific when implemented. + * + * Copyright (C) 2004 Art Yerkes + * 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 "config.h" -#endif +#include "iphlpapi_private.h" #include <stdarg.h> #include <stdlib.h> @@ -21,20 +42,12 @@ #include "windef.h" #include "winbase.h" #include "winreg.h" - -#ifdef __REACTOS__ -# include <net/miniport.h> /* ULONGLONG */ -# include <winsock2.h> /* Enables NSPAPI */ -# include <nspapi.h> /* SOCKET_ADDRESS */ -# include <iptypes.h> /* IP_ADAPTER_ADDRESSES */ -#endif - +#include "resinfo.h" #include "iphlpapi.h" -#include "ifenum.h" -#include "ipstats.h" -#include "iphlp_res.h" #include "wine/debug.h" +WINE_DEFAULT_DEBUG_CHANNEL(iphlpapi); + PIPHLP_RES_INFO getResInfo() { PIPHLP_RES_INFO InfoPtr = (PIPHLP_RES_INFO)HeapAlloc( GetProcessHeap(), 0, diff --git a/reactos/lib/iphlpapi/route.c b/reactos/lib/iphlpapi/route.c new file mode 100644 index 00000000000..1d67b9ff98a --- /dev/null +++ b/reactos/lib/iphlpapi/route.c @@ -0,0 +1,69 @@ +/* + * iphlpapi dll implementation -- Setting and storing route information + * + * These are stubs for functions that set routing information on the target + * operating system. They are grouped here because their implementation will + * vary widely by operating system. + * + * Copyright (C) 2004 Art Yerkes + * 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 "config.h" +#include "iphlpapi_private.h" + +#include <stdarg.h> +#include <stdlib.h> +#include <sys/types.h> +#ifdef HAVE_NETINET_IN_H +# include <netinet/in.h> +#endif +#ifdef HAVE_ARPA_INET_H +# include <arpa/inet.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +# include <arpa/nameser.h> +#endif +#ifdef HAVE_RESOLV_H +# include <resolv.h> +#endif + +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "resinfo.h" +#include "iphlpapi.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(iphlpapi); + +DWORD createIpForwardEntry( PMIB_IPFORWARDROW pRoute ) { + TRACE("pRoute %p\n", pRoute); + /* could use SIOCADDRT, not sure I want to */ + FIXME(":stub\n"); + return (DWORD) 0; +} + +DWORD setIpForwardEntry( PMIB_IPFORWARDROW pRoute ) { + FIXME(":stub\n"); + return (DWORD) 0; +} + +DWORD deleteIpForwardEntry( PMIB_IPFORWARDROW pRoute ) { + TRACE("pRoute %p\n", pRoute); + /* could use SIOCDELRT, not sure I want to */ + FIXME(":stub\n"); + return (DWORD) 0; +} diff --git a/reactos/lib/iphlpapi/route.h b/reactos/lib/iphlpapi/route.h new file mode 100644 index 00000000000..61e83c733be --- /dev/null +++ b/reactos/lib/iphlpapi/route.h @@ -0,0 +1,29 @@ +/* + * iphlpapi dll implementation -- Route function prototypes. + * + * Copyright (C) 2004 Art Yerkes + * 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_IPHLP_ROUTE_H_ +#define WINE_IPHLP_ROUTE_H_ + +/* Create a route entry. */ + +DWORD createIpForwardEntry( PMIB_IPFORWARDROW Route ); +DWORD setIpForwardEntry( PMIB_IPFORWARDROW Route ); +DWORD deleteIpForwardEntry( PMIB_IPFORWARDROW Route ); + +#endif/*WINE_IPHLP_ROUTE_H_*/ From 5ed2e7cef13db8cd3e64b1d4817d1452ece838f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Wed, 25 Feb 2004 09:55:30 +0000 Subject: [PATCH 0176/1463] Silence debug messages svn path=/trunk/; revision=8368 --- reactos/lib/kernel32/file/volume.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/kernel32/file/volume.c b/reactos/lib/kernel32/file/volume.c index 9119a0df206..0b3e26a167d 100644 --- a/reactos/lib/kernel32/file/volume.c +++ b/reactos/lib/kernel32/file/volume.c @@ -1,4 +1,4 @@ -/* $Id: volume.c,v 1.39 2004/02/21 16:36:02 jfilby Exp $ +/* $Id: volume.c,v 1.40 2004/02/25 09:55:30 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -21,7 +21,7 @@ #include <k32.h> -//#define NDEBUG +#define NDEBUG #include "../include/debug.h" From 8b99b4ec5ec3122a25f71b088ce8f15d3be206d6 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Wed, 25 Feb 2004 14:25:11 +0000 Subject: [PATCH 0177/1463] Remove ALL stubs which might be of questionable origin. svn path=/trunk/; revision=8369 --- reactos/lib/advapi32/advapi32.def | 574 +++------- reactos/lib/advapi32/advapi32.edf | 563 +++------- reactos/lib/advapi32/makefile | 8 +- reactos/lib/advapi32/misc/aclstubs.c | 319 ------ reactos/lib/advapi32/misc/crstubs.c | 298 ----- reactos/lib/advapi32/misc/logon.c | 60 +- reactos/lib/advapi32/misc/stubs.c | 1399 ------------------------ reactos/lib/advapi32/reg/reg.c | 136 ++- reactos/lib/advapi32/sec/ac.c | 115 +- reactos/lib/advapi32/sec/lsa.c | 26 +- reactos/lib/advapi32/sec/misc.c | 13 +- reactos/lib/advapi32/sec/sec.c | 136 +-- reactos/lib/advapi32/sec/sid.c | 66 +- reactos/lib/advapi32/token/privilege.c | 229 ++-- reactos/lib/advapi32/token/token.c | 116 +- 15 files changed, 597 insertions(+), 3461 deletions(-) delete mode 100644 reactos/lib/advapi32/misc/aclstubs.c delete mode 100644 reactos/lib/advapi32/misc/crstubs.c delete mode 100644 reactos/lib/advapi32/misc/stubs.c diff --git a/reactos/lib/advapi32/advapi32.def b/reactos/lib/advapi32/advapi32.def index 9dc8e46ff8e..e7363fdf0ba 100644 --- a/reactos/lib/advapi32/advapi32.def +++ b/reactos/lib/advapi32/advapi32.def @@ -1,191 +1,93 @@ -; $Id: advapi32.def,v 1.11 2003/09/12 17:51:46 vizzini Exp $ +; $Id: advapi32.def,v 1.12 2004/02/25 14:25:10 ekohl Exp $ ; ; advapi32.def ; ; ReactOS Operating System ; -; Some stack sizes are taken from Ander Norlander's .DEFs. -; LIBRARY advapi32.dll EXPORTS -A_SHAFinal@8 -A_SHAInit@4 -A_SHAUpdate@12 AbortSystemShutdownA@4 AbortSystemShutdownW@4 AccessCheck@32 -AccessCheckByType@44 -AccessCheckByTypeAndAuditAlarmA@64 -AccessCheckByTypeAndAuditAlarmW@64 -AccessCheckByTypeResultList@44 -AccessCheckByTypeResultListAndAuditAlarmA@64 -AccessCheckByTypeResultListAndAuditAlarmByHandleA@68 -AccessCheckByTypeResultListAndAuditAlarmByHandleW@68 -AccessCheckByTypeResultListAndAuditAlarmW@64 AccessCheckAndAuditAlarmA@44 AccessCheckAndAuditAlarmW@44 AddAccessAllowedAce@16 -AddAccessAllowedAceEx@20 -AddAccessAllowedObjectAce@28 +;AddAccessAllowedAceEx@20 AddAccessDeniedAce@16 -AddAccessDeniedAceEx@20 -AddAccessDeniedObjectAce@28 +;AddAccessDeniedAceEx@20 AddAce@20 AddAuditAccessAce@24 -AddAuditAccessAceEx@28 -AddAuditAccessObjectAce@36 -;@AddUsersToEncryptedFile +;AddAuditAccessAceEx@28 AdjustTokenGroups@24 AdjustTokenPrivileges@24 AllocateAndInitializeSid@44 AllocateLocallyUniqueId@4 AreAllAccessesGranted@8 AreAnyAccessesGranted@8 -BackupEventLogA@8 -BackupEventLogW@8 -BuildExplicitAccessWithNameA@20 -BuildExplicitAccessWithNameW@20 -BuildImpersonateExplicitAccessWithNameA@24 -BuildImpersonateExplicitAccessWithNameW@24 -BuildImpersonateTrusteeA@8 -BuildImpersonateTrusteeW@8 -BuildSecurityDescriptorA@36 -BuildSecurityDescriptorW@36 -BuildTrusteeWithNameA@8 -BuildTrusteeWithNameW@8 -BuildTrusteeWithObjectsAndNameA@24 -BuildTrusteeWithObjectsAndNameW@24 -BuildTrusteeWithObjectsAndSidA@20 -BuildTrusteeWithObjectsAndSidW@20 -BuildTrusteeWithSidA@8 -BuildTrusteeWithSidW@8 -;CancelOverlappedAccess +;BackupEventLogA@8 +;BackupEventLogW@8 +;BuildAccessRequestA +;BuildAccessRequestW +;BuildExplicitAccessWithNameA@20 +;BuildExplicitAccessWithNameW@20 +;BuildImpersonateExplicitAccessWithNameA@24 +;BuildImpersonateExplicitAccessWithNameW@24 +;BuildImpersonateTrusteeA@8 +;BuildImpersonateTrusteeW@8 +;BuildSecurityDescriptorA@36 +;BuildSecurityDescriptorW@36 +;BuildTrusteeWithNameA@8 +;BuildTrusteeWithNameW@8 +;BuildTrusteeWithSidA@8 +;BuildTrusteeWithSidW@8 ChangeServiceConfigA@44 ChangeServiceConfigW@44 -ChangeServiceConfig2A@12 -ChangeServiceConfig2W@12 -CheckTokenMembership@12 -ClearEventLogA@8 -ClearEventLogW@8 -;CloseCodeAuthzLevel -CloseEncryptedFileRaw@4 -CloseEventLog@4 +;ClearEventLogA@8 +;ClearEventLogW@8 +;CloseEventLog@4 CloseServiceHandle@4 -;@CloseTrace -;@CommandLineFromMsiDescriptor -;ComputeAccessTokenFromCodeAuthzLevel -;@ControlTraceA -;@ControlTraceW ControlService@12 -;ConvertAccessToSecurityDescriptorA -;ConvertAccessToSecurityDescriptorW -;ConvertSDToStringSDRootDomainA -;ConvertSDToStringSDRootDomainW -;ConvertSecurityDescriptorToAccessA -;ConvertSecurityDescriptorToAccessNamedA -;ConvertSecurityDescriptorToAccessNamedW -;ConvertSecurityDescriptorToAccessW -;@ConvertSecurityDescriptorToStringSecurityDescriptorA -;@ConvertSecurityDescriptorToStringSecurityDescriptorW -;@ConvertSidToStringSidA -;@ConvertSidToStringSidW -;ConvertStringSDToSDDomainA -;ConvertStringSDToSDDomainW -;ConvertStringSDToSDRootDomainA -;ConvertStringSDToSDRootDomainW -;@ConvertStringSecurityDescriptorToSecurityDescriptorA -;@ConvertStringSecurityDescriptorToSecurityDescriptorW -;@ConvertStringSidToSidA -;@ConvertStringSidToSidW -ConvertToAutoInheritPrivateObjectSecurity@24 CopySid@12 -;CreateCodeAuthzLevel -CreatePrivateObjectSecurity@24 -CreatePrivateObjectSecurityEx@32 -CreatePrivateObjectSecurityWithMultipleInheritance@36 +;CreatePrivateObjectSecurity@24 CreateProcessAsUserA@44 CreateProcessAsUserW@44 -CreateProcessWithLogonW@44 -CreateRestrictedToken@36 CreateServiceA@52 CreateServiceW@52 -;@CreateTraceInstanceId -CreateWellKnownSid@16 -;@CredDeleteA -;@CredDeleteW -;@CredEnumerateA -;@CredEnumerateW -;@CredFree -;@CredGetSessionTypes -;@CredGetTargetInfoA -;@CredGetTargetInfoW -;@CredIsMarshaledCredentialA -;@CredIsMarshaledCredentialW -;@CredMarshalCredentialA -;@CredMarshalCredentialW -;CredProfileLoaded -;@CredReadA -;@CredReadDomainCredentialsA -;@CredReadDomainCredentialsW -;@CredReadW -;@CredRenameA -;@CredRenameW -;@CredUnmarshalCredentialA -;@CredUnmarshalCredentialW -;@CredWriteA -;@CredWriteDomainCredentialsA -;@CredWriteDomainCredentialsW -;@CredWriteW -;CredpConvertCredential -;CredpConvertTargetInfo -;CredpDecodeCredential -;CredpEncodeCredential -CryptAcquireContextA@20 -CryptAcquireContextW@20 -CryptContextAddRef@12 -CryptCreateHash@20 -CryptDecrypt@24 -CryptDeriveKey@20 -CryptDestroyHash@4 -CryptDestroyKey@4 -CryptDuplicateHash@16 -CryptDuplicateKey@16 -CryptEncrypt@28 -CryptEnumProviderTypesA@24 -CryptEnumProviderTypesW@24 -CryptEnumProvidersA@24 -CryptEnumProvidersW@24 -CryptExportKey@24 -CryptGenKey@16 -CryptGenRandom@12 -CryptGetDefaultProviderA@20 -CryptGetDefaultProviderW@20 -CryptGetHashParam@20 -CryptGetKeyParam@20 -CryptGetProvParam@20 -CryptGetUserKey@12 -CryptHashData@16 -CryptHashSessionKey@12 -CryptImportKey@24 -CryptReleaseContext@8 -CryptSetHashParam@16 -CryptSetKeyParam@16 -CryptSetProvParam@16 -CryptSetProviderA@8 -CryptSetProviderW@8 -CryptSetProviderExA@16 -CryptSetProviderExW@16 -CryptSignHashA@24 -CryptSignHashW@24 -CryptVerifySignatureA@24 -CryptVerifySignatureW@24 -DecryptFileA@8 -DecryptFileW@8 +;CryptAcquireContextA@20 +;CryptAcquireContextW@20 +;CryptContextAddRef@12 +;CryptCreateHash@20 +;CryptDecrypt@24 +;CryptDeriveKey@20 +;CryptDestroyHash@4 +;CryptDestroyKey@4 +;CryptEncrypt@28 +;CryptExportKey@24 +;CryptGenKey@16 +;CryptGenRandom@12 +;CryptGetHashParam@20 +;CryptGetKeyParam@20 +;CryptGetProvParam@20 +;CryptGetUserKey@12 +;CryptHashData@16 +;CryptHashSessionKey@12 +;CryptImportKey@24 +;CryptReleaseContext@8 +;CryptSetHashParam@16 +;CryptSetKeyParam@16 +;CryptSetProvParam@16 +;CryptSetProviderA@8 +;CryptSetProviderW@8 +;CryptSignHashA@24 +;CryptSignHashW@24 +;CryptVerifySignatureA@24 +;CryptVerifySignatureW@24 DeleteAce@8 DeleteService@4 -DeregisterEventSource@4 -DestroyPrivateObjectSecurity@4 -;@DuplicateEncryptionInfoFile +;DenyAccessRightsA +;DenyAccessRightsW +;DeregisterEventSource@4 +;DestroyPrivateObjectSecurity@4 DuplicateToken@12 DuplicateTokenEx@24 ;ElfBackupEventLogFileA@8 @@ -207,78 +109,53 @@ DuplicateTokenEx@24 ;ElfRegisterEventSourceW@12 ;ElfReportEventA@48 ;ElfReportEventW@48 -;@EnableTrace -EncryptFileA@4 -EncryptFileW@4 -;EncryptedFileKeyInfo -;@EncryptionDisable EnumDependentServicesA@24 EnumDependentServicesW@24 EnumServiceGroupW@36 EnumServicesStatusA@32 -EnumServicesStatusExA@40 -EnumServicesStatusExW@40 EnumServicesStatusW@32 -;@EnumerateTraceGuids -EqualDomainSid@12 EqualPrefixSid@8 EqualSid@8 -FileEncryptionStatusA@8 -FileEncryptionStatusW@8 FindFirstFreeAce@8 -;@FlushTraceA -;@FlushTraceW -;FreeEncryptedFileKeyInfo -;@FreeEncryptionCertificateHashList -FreeInheritedFromArray@12 FreeSid@4 -;GetAccessPermissionsForObjectA -;GetAccessPermissionsForObjectW GetAce@12 GetAclInformation@16 -GetAuditedPermissionsFromAclA@16 -GetAuditedPermissionsFromAclW@16 -GetCurrentHwProfileA@4 -GetCurrentHwProfileW@4 -GetEffectiveRightsFromAclA@12 -GetEffectiveRightsFromAclW@12 -GetEventLogInformation@20 -GetExplicitEntriesFromAclA@12 -GetExplicitEntriesFromAclW@12 -GetFileSecurityA@20 -GetFileSecurityW@20 -;GetInformationCodeAuthzLevelW -;GetInformationCodeAuthzPolicyW -GetInheritanceSourceA@40 -GetInheritanceSourceW@40 +;GetAuditedPermissionsFromAclA@16 +;GetAuditedPermissionsFromAclW@16 +;GetAuditedPermissionsFromSDA +;GetAuditedPermissionsFromSDW +;GetCurrentHwProfileA@4 +;GetCurrentHwProfileW@4 +;GetEffectiveAccessRightsA +;GetEffectiveAccessRightsW +;GetEffectiveRightsFromAclA@12 +;GetEffectiveRightsFromAclW@12 +;GetEffectiveRightsFromSDA@12 +;GetEffectiveRightsFromSDW@12 +;GetExplicitAccessRightsA +;GetExplicitAccessRightsW +;GetExplicitEntriesFromAclA@12 +;GetExplicitEntriesFromAclW@12 +;GetFileSecurityA@20 +;GetFileSecurityW@20 GetKernelObjectSecurity@20 GetLengthSid@4 -;@GetLocalManagedApplicationData -;@GetLocalManagedApplications -;@GetManagedApplicationCategories -;@GetManagedApplications -GetMultipleTrusteeA@4 -GetMultipleTrusteeOperationA@4 -GetMultipleTrusteeOperationW@4 -GetMultipleTrusteeW@4 -GetNamedSecurityInfoA@32 -;GetNamedSecurityInfoExA -;GetNamedSecurityInfoExW -GetNamedSecurityInfoW@32 -GetNumberOfEventLogRecords@8 -GetOldestEventLogRecord@8 -;GetOverlappedAccessResults -GetPrivateObjectSecurity@20 +;GetMultipleTrusteeA@4 +;GetMultipleTrusteeOperationA@4 +;GetMultipleTrusteeOperationW@4 +;GetMultipleTrusteeW@4 +;GetNamedSecurityInfoA@32 +;GetNamedSecurityInfoW@32 +;GetNumberOfEventLogRecords@8 +;GetOldestEventLogRecord@8 +;GetPrivateObjectSecurity@20 GetSecurityDescriptorControl@12 GetSecurityDescriptorDacl@16 GetSecurityDescriptorGroup@12 GetSecurityDescriptorLength@4 GetSecurityDescriptorOwner@12 -GetSecurityDescriptorRMControl@8 GetSecurityDescriptorSacl@16 -GetSecurityInfo@32 -GetSecurityInfoExA@36 -GetSecurityInfoExW@36 +;GetSecurityInfo@32 GetServiceDisplayNameA@16 GetServiceDisplayNameW@16 GetServiceKeyNameA@16 @@ -288,52 +165,33 @@ GetSidLengthRequired@4 GetSidSubAuthority@8 GetSidSubAuthorityCount@4 GetTokenInformation@20 -;@GetTraceEnableFlags -;@GetTraceEnableLevel -;@GetTraceLoggerHandle -GetTrusteeFormA@4 -GetTrusteeFormW@4 -GetTrusteeNameA@4 -GetTrusteeNameW@4 -GetTrusteeTypeA@4 -GetTrusteeTypeW@4 -GetUserNameA@8 -GetUserNameW@8 -GetWindowsAccountDomainSid@12 -GrantAccessRightsA@16 -GrantAccessRightsW@16 +;GetTrusteeNameA@4 +;GetTrusteeNameW@4 +;GetTrusteeTypeA@4 +;GetTrusteeTypeW@4 +;GetUserNameA@8 +;GetUserNameW@8 +;GrantAccessRightsA@16 +;GrantAccessRightsW@16 ;I_ScGetCurrentGroupStateW@12 -;I_ScIsSecurityProcess -;I_ScPnPGetServiceName -;I_ScSendTSMessage ;I_ScSetServiceBitsA@20 ;I_ScSetServiceBitsW@20 -;IdentifyCodeAuthzLevelW -ImpersonateAnonymousToken@4 -ImpersonateLoggedOnUser@4 -ImpersonateNamedPipeClient@4 +;ImpersonateLoggedOnUser@4 +;ImpersonateNamedPipeClient@4 ImpersonateSelf@4 InitializeAcl@12 InitializeSecurityDescriptor@8 InitializeSid@12 InitiateSystemShutdownA@20 -InitiateSystemShutdownExA@24 -InitiateSystemShutdownExW@24 InitiateSystemShutdownW@20 -;@InstallApplication -IsAccessPermittedA@20 -IsAccessPermittedW@20 -IsTextUnicode@12 -IsTokenRestricted@4 -IsTokenUntrusted@4 -IsWellKnownSid@8 +;IsAccessPermittedA@20 +;IsAccessPermittedW@20 +;IsTextUnicode@12 IsValidAcl@4 IsValidSecurityDescriptor@4 IsValidSid@4 LockServiceDatabase@4 LogonUserA@24 -LogonUserExA@40 -LogonUserExW@40 LogonUserW@24 LookupAccountNameA@28 LookupAccountNameW@28 @@ -345,84 +203,61 @@ LookupPrivilegeNameA@16 LookupPrivilegeNameW@16 LookupPrivilegeValueA@12 LookupPrivilegeValueW@12 -LookupSecurityDescriptorPartsA@28 -LookupSecurityDescriptorPartsW@28 -LsaAddAccountRights@16 +;LookupSecurityDescriptorPartsA@28 +;LookupSecurityDescriptorPartsW@28 +;LsaAddAccountRights@16 ;LsaAddPrivilegesToAccount@8 ;LsaClearAuditLog@4 -LsaClose@4 +;LsaClose@4 ;LsaCreateAccount@16 ;LsaCreateSecret@16 ;LsaCreateTrustedDomain@16 -LsaCreateTrustedDomainEx@20 ;LsaDelete@4 -LsaDeleteTrustedDomain@8 -LsaEnumerateAccountRights@16 +;LsaDeleteTrustedDomain@8 +;LsaEnumerateAccountRights@16 ;LsaEnumerateAccounts@20 -LsaEnumerateAccountsWithUserRight@16 +;LsaEnumerateAccountsWithUserRight@16 ;LsaEnumeratePrivileges@20 ;LsaEnumeratePrivilegesOfAccount@8 -LsaEnumerateTrustedDomains@20 -LsaEnumerateTrustedDomainsEx@20 -LsaFreeMemory@4 +;LsaEnumerateTrustedDomains@20 +;LsaFreeMemory@4 ;LsaGetQuotasForAccount@8 -;LsaGetRemoteUserName ;LsaGetSystemAccessAccount@8 ;LsaGetUserName@8 ;LsaICLookupNames@32 -;LsaICLookupNamesWithCreds ;LsaICLookupSids@32 -;LsaICLookupSidsWithCreds -LsaLookupNames@20 -LsaLookupNames2@24 +;LsaLookupNames@20 ;LsaLookupPrivilegeDisplayName@16 ;LsaLookupPrivilegeName@12 ;LsaLookupPrivilegeValue@12 -LsaLookupSids@20 -LsaNtStatusToWinError@4 +;LsaLookupSids@20 +;LsaNtStatusToWinError@4 ;LsaOpenAccount@16 -LsaOpenPolicy@16 -;LsaOpenPolicySce +;LsaOpenPolicy@16 ;LsaOpenSecret@16 ;LsaOpenTrustedDomain@16 -LsaOpenTrustedDomainByName@16 -LsaQueryDomainInformationPolicy@12 -LsaQueryForestTrustInformation@12 -LsaQueryInformationPolicy@12 -;LsaQueryInfoTrustedDomain@12 -LsaQueryTrustedDomainInfoByName@16 +;LsaQueryInfoTrustedDomain +;LsaQueryInformationPolicy@12 ;LsaQuerySecret@20 ;LsaQuerySecurityObject@12 -LsaQueryTrustedDomainInfo@16 -LsaRemoveAccountRights@20 +;LsaQueryTrustedDomainInfo@16 +;LsaRemoveAccountRights@20 ;LsaRemovePrivilegesFromAccount@12 ;LsaRetrievePrivateData@12 -LsaSetDomainInformationPolicy@12 -LsaSetInformationPolicy@12 +;LsaSetInformationPolicy@12 ;LsaSetInformationTrustedDomain@12 -LsaSetForestTrustInformation@20 -LsaSetTrustedDomainInfoByName@16 ;LsaSetQuotasForAccount@8 ;LsaSetSecret@12 ;LsaSetSecurityObject@12 ;LsaSetSystemAccessAccount@8 -LsaSetTrustedDomainInformation@16 -LsaStorePrivateData@12 +;LsaSetTrustedDomainInformation@16 +;LsaStorePrivateData@12 MakeAbsoluteSD@44 MakeSelfRelativeSD@12 MapGenericMask@8 -MD4Final@4 -MD4Init@4 -MD4Update@12 -MD5Final@4 -MD5Init@4 -MD5Update@12 -;@MSChapSrvChangePassword -;@MSChapSrvChangePassword2 -MakeAbsoluteSD2@8 -NTAccessMaskToProvAccessRights@12 -NotifyBootConfigStatus@4 -NotifyChangeEventLog@8 +;NTAccessMaskToProvAccessRights@12 +;NotifyBootConfigStatus@4 +;NotifyChangeEventLog@8 ObjectCloseAuditAlarmA@12 ObjectCloseAuditAlarmW@12 ObjectDeleteAuditAlarmA@12 @@ -431,44 +266,29 @@ ObjectOpenAuditAlarmA@48 ObjectOpenAuditAlarmW@48 ObjectPrivilegeAuditAlarmA@24 ObjectPrivilegeAuditAlarmW@24 -OpenBackupEventLogA@8 -OpenBackupEventLogW@8 -OpenEncryptedFileRawA@12 -OpenEncryptedFileRawW@12 -OpenEventLogA@8 -OpenEventLogW@8 +;OpenBackupEventLogA@8 +;OpenBackupEventLogW@8 +;OpenEventLogA@8 +;OpenEventLogW@8 OpenProcessToken@12 OpenSCManagerA@12 OpenSCManagerW@12 OpenServiceA@12 OpenServiceW@12 OpenThreadToken@16 -;@OpenTraceA -;@OpenTraceW PrivilegeCheck@12 PrivilegedServiceAuditAlarmA@20 PrivilegedServiceAuditAlarmW@20 -;ProcessIdleTasks -;@ProcessTrace -;@QueryAllTracesA -;@QueryAllTracesW -;@QueryRecoveryAgentsOnEncryptedFile +;ProvAccessRightsToNTAccessMask QueryServiceConfigA@16 QueryServiceConfigW@16 -QueryServiceConfig2A@20 -QueryServiceConfig2W@20 QueryServiceLockStatusA@16 QueryServiceLockStatusW@16 QueryServiceObjectSecurity@20 QueryServiceStatus@8 -QueryServiceStatusEx@20 -;@QueryTraceA -;@QueryTraceW -;@QueryUsersOnEncryptedFile -QueryWindows31FilesMigration@4 -ReadEncryptedFileRaw@12 -ReadEventLogA@28 -ReadEventLogW@28 +;QueryWindows31FilesMigration@4 +;ReadEventLogA@28 +;ReadEventLogW@28 RegCloseKey@4 RegConnectRegistryA@12 RegConnectRegistryW@12 @@ -480,7 +300,6 @@ RegDeleteKeyA@8 RegDeleteKeyW@8 RegDeleteValueA@8 RegDeleteValueW@8 -RegDisablePredefinedCache@0 RegEnumKeyA@16 RegEnumKeyExA@32 RegEnumKeyExW@32 @@ -492,13 +311,10 @@ RegGetKeySecurity@16 RegLoadKeyA@12 RegLoadKeyW@12 RegNotifyChangeKeyValue@20 -RegOpenCurrentUser@8 RegOpenKeyA@12 RegOpenKeyExA@20 RegOpenKeyExW@20 RegOpenKeyW@12 -RegOpenUserClassesRoot@16 -RegOverridePredefKey@8 RegQueryInfoKeyA@48 RegQueryInfoKeyW@48 RegQueryMultipleValuesA@20 @@ -512,8 +328,6 @@ RegReplaceKeyW@16 RegRestoreKeyA@12 RegRestoreKeyW@12 RegSaveKeyA@12 -RegSaveKeyExA@16 -RegSaveKeyExW@16 RegSaveKeyW@12 RegSetKeySecurity@12 RegSetValueA@20 @@ -522,82 +336,40 @@ RegSetValueExW@24 RegSetValueW@20 RegUnLoadKeyA@8 RegUnLoadKeyW@8 -RegisterEventSourceA@8 -RegisterEventSourceW@8 -;RegisterIdleTask +;RegisterEventSourceA@8 +;RegisterEventSourceW@8 RegisterServiceCtrlHandlerA@8 -RegisterServiceCtrlHandlerExA@12 -RegisterServiceCtrlHandlerExW@12 RegisterServiceCtrlHandlerW@8 -;@RegisterTraceGuidsA -;@RegisterTraceGuidsW -;@RemoveTraceCallback -;@RemoveUsersFromEncryptedFile -ReportEventA@36 -ReportEventW@36 +;ReplaceAllAccessRightsA +;ReplaceAllAccessRightsW +;ReportEventA@36 +;ReportEventW@36 RevertToSelf@0 -RevokeExplicitAccessRightsA@16 -RevokeExplicitAccessRightsW@16 -;@SaferCloseLevel -;@SaferComputeTokenFromLevel -;@SaferCreateLevel -;@SaferGetLevelInformation -;@SaferGetPolicyInformation -;@SaferIdentifyLevel -;@SaferRecordEventLogEntry -;@SaferSetLevelInformation -;@SaferSetPolicyInformation -;SaferiChangeRegistryScope -;SaferiCompareTokenLevels -;@SaferiIsExecutableFileType -;SaferiPopulateDefaultsInRegistry -;SaferiRecordEventLogEntry -;SaferiReplaceProcessThreadTokens -;SaferiSearchMatchingHashRules -SetAccessRightsA@16 -SetAccessRightsW@16 +;RevokeExplicitAccessRightsA@16 +;RevokeExplicitAccessRightsW@16 +;SetAccessRightsA@16 +;SetAccessRightsW@16 SetAclInformation@16 -;SetEntriesInAccessListA -;SetEntriesInAccessListW -SetEntriesInAclA@16 -SetEntriesInAclW@16 -;SetEntriesInAuditListA -;SetEntriesInAuditListW -SetFileSecurityA@12 -SetFileSecurityW@12 +;SetEntriesInAclA@16 +;SetEntriesInAclW@16 SetKernelObjectSecurity@12 -;SetInformationCodeAuthzLevelW -;SetInformationCodeAuthzPolicyW -SetNamedSecurityInfoA@28 -;SetNamedSecurityInfoExA -;SetNamedSecurityInfoExW -SetNamedSecurityInfoW@28 -SetPrivateObjectSecurity@20 -SetPrivateObjectSecurityEx@24 -SetSecurityDescriptorControl@12 +;SetNamedSecurityInfoA@28 +;SetNamedSecurityInfoW@28 +;SetPrivateObjectSecurity@20 SetSecurityDescriptorDacl@16 SetSecurityDescriptorGroup@12 SetSecurityDescriptorOwner@12 -SetSecurityDescriptorRMControl@8 SetSecurityDescriptorSacl@16 -SetSecurityInfo@28 -;SetSecurityInfoExA -;SetSecurityInfoExW +;SetSecurityInfo@28 SetServiceBits@16 SetServiceObjectSecurity@12 SetServiceStatus@8 SetThreadToken@8 SetTokenInformation@16 -;@SetTraceCallback -;@SetUserFileEncryptionKey StartServiceA@12 StartServiceCtrlDispatcherA@4 StartServiceCtrlDispatcherW@4 StartServiceW@12 -;@StartTraceA -;@StartTraceW -;@StopTraceA -;@StopTraceW ;SynchronizeWindows31FilesAndWindowsNTRegistry@16 SystemFunction001@12 SystemFunction002@12 @@ -634,59 +406,5 @@ SystemFunction032@8 SystemFunction033@8 SystemFunction034@8 SystemFunction035@8 -;SystemFunction036 -;SystemFunction040 -;SystemFunction041 -;@TraceEvent -;@TraceEventInstance -;@TraceMessage -;@TraceMessageVa -TreeResetNamedSecurityInfoA@44 -TreeResetNamedSecurityInfoW@44 -;TrusteeAccessToObjectA -;TrusteeAccessToObjectW -;@UninstallApplication UnlockServiceDatabase@4 -;UnregisterIdleTask -;@UnregisterTraceGuids -;@UpdateTraceA -;@UpdateTraceW -;WdmWmiServiceMain -;WmiCloseBlock -;WmiCloseTraceWithCursor -;WmiConvertTimestamp -;WmiDevInstToInstanceNameA -;WmiDevInstToInstanceNameW -;WmiEnumerateGuids -;WmiExecuteMethodA -;WmiExecuteMethodW -;WmiFileHandleToInstanceNameA -;WmiFileHandleToInstanceNameW -;WmiFreeBuffer -;WmiGetFirstTraceOffset -;WmiGetNextEvent -;WmiGetTraceHeader -;WmiMofEnumerateResourcesA -;WmiMofEnumerateResourcesW -;WmiNotificationRegistrationA -;WmiNotificationRegistrationW -;WmiOpenBlock -;WmiOpenTraceWithCursor -;WmiParseTraceEvent -;WmiQueryAllDataA -;WmiQueryAllDataMultipleA -;WmiQueryAllDataMultipleW -;WmiQueryAllDataW -;WmiQueryGuidInformation -;WmiQuerySingleInstanceA -;WmiQuerySingleInstanceMultipleA -;WmiQuerySingleInstanceMultipleW -;WmiQuerySingleInstanceW -;WmiReceiveNotificationsA -;WmiReceiveNotificationsW -;WmiSetSingleInstanceA -;WmiSetSingleInstanceW -;WmiSetSingleItemA -;WmiSetSingleItemW -Wow64Win32ApiEntry@12 -WriteEncryptedFileRaw@12 +; EOF diff --git a/reactos/lib/advapi32/advapi32.edf b/reactos/lib/advapi32/advapi32.edf index c0fd1fd955a..3af35f98bd3 100644 --- a/reactos/lib/advapi32/advapi32.edf +++ b/reactos/lib/advapi32/advapi32.edf @@ -1,191 +1,89 @@ -; $Id: advapi32.edf,v 1.27 2003/10/12 09:39:44 hbirr Exp $ +; $Id: advapi32.edf,v 1.28 2004/02/25 14:25:10 ekohl Exp $ ; ; advapi32.edf ; ; ReactOS Operating System ; -; Some stack sizes are taken from Ander Norlander's .DEFs. -; LIBRARY advapi32.dll EXPORTS -A_SHAFinal=A_SHAFinal@8 -A_SHAInit=A_SHAInit@4 -A_SHAUpdate=A_SHAUpdate@12 AbortSystemShutdownA=AbortSystemShutdownA@4 AbortSystemShutdownW=AbortSystemShutdownW@4 AccessCheck=AccessCheck@32 AccessCheckAndAuditAlarmA=AccessCheckAndAuditAlarmA@44 AccessCheckAndAuditAlarmW=AccessCheckAndAuditAlarmW@44 -AccessCheckByType=AccessCheckByType@44 -AccessCheckByTypeAndAuditAlarmA=AccessCheckByTypeAndAuditAlarmA@64 -AccessCheckByTypeAndAuditAlarmW=AccessCheckByTypeAndAuditAlarmW@64 -AccessCheckByTypeResultList=AccessCheckByTypeResultList@44 -AccessCheckByTypeResultListAndAuditAlarmA=AccessCheckByTypeResultListAndAuditAlarmA@64 -AccessCheckByTypeResultListAndAuditAlarmByHandleA=AccessCheckByTypeResultListAndAuditAlarmByHandleA@68 -AccessCheckByTypeResultListAndAuditAlarmByHandleW=AccessCheckByTypeResultListAndAuditAlarmByHandleW@68 -AccessCheckByTypeResultListAndAuditAlarmW=AccessCheckByTypeResultListAndAuditAlarmW@64 AddAccessAllowedAce=AddAccessAllowedAce@16 -AddAccessAllowedAceEx=AddAccessAllowedAceEx@20 -AddAccessAllowedObjectAce=AddAccessAllowedObjectAce@28 AddAccessDeniedAce=AddAccessDeniedAce@16 -AddAccessDeniedAceEx=AddAccessDeniedAceEx@20 -AddAccessDeniedObjectAce=AddAccessDeniedObjectAce@28 AddAce=AddAce@20 AddAuditAccessAce=AddAuditAccessAce@24 -AddAuditAccessAceEx=AddAuditAccessAceEx@28 -AddAuditAccessObjectAce=AddAuditAccessObjectAce@36 -;AddUsersToEncryptedFile AdjustTokenGroups=AdjustTokenGroups@24 AdjustTokenPrivileges=AdjustTokenPrivileges@24 AllocateAndInitializeSid=AllocateAndInitializeSid@44 AllocateLocallyUniqueId=AllocateLocallyUniqueId@4 AreAllAccessesGranted=AreAllAccessesGranted@8 AreAnyAccessesGranted=AreAnyAccessesGranted@8 -BackupEventLogA=BackupEventLogA@8 -BackupEventLogW=BackupEventLogW@8 -BuildExplicitAccessWithNameA=BuildExplicitAccessWithNameA@20 -BuildExplicitAccessWithNameW=BuildExplicitAccessWithNameW@20 -BuildImpersonateExplicitAccessWithNameA=BuildImpersonateExplicitAccessWithNameA@24 -BuildImpersonateExplicitAccessWithNameW=BuildImpersonateExplicitAccessWithNameW@24 -BuildImpersonateTrusteeA=BuildImpersonateTrusteeA@8 -BuildImpersonateTrusteeW=BuildImpersonateTrusteeW@8 -BuildSecurityDescriptorA=BuildSecurityDescriptorA@36 -BuildSecurityDescriptorW=BuildSecurityDescriptorW@36 -BuildTrusteeWithNameA=BuildTrusteeWithNameA@8 -BuildTrusteeWithNameW=BuildTrusteeWithNameW@8 -BuildTrusteeWithObjectsAndNameA=BuildTrusteeWithObjectsAndNameA@24 -BuildTrusteeWithObjectsAndNameW=BuildTrusteeWithObjectsAndNameW@24 -BuildTrusteeWithObjectsAndSidA=BuildTrusteeWithObjectsAndSidA@20 -BuildTrusteeWithObjectsAndSidW=BuildTrusteeWithObjectsAndSidA@20 -BuildTrusteeWithSidA=BuildTrusteeWithSidA@8 -BuildTrusteeWithSidW=BuildTrusteeWithSidW@8 -;CancelOverlappedAccess +;BackupEventLogA=BackupEventLogA@8 +;BackupEventLogW=BackupEventLogW@8 +;BuildAccessRequestA +;BuildAccessRequestW +;BuildExplicitAccessWithNameA=BuildExplicitAccessWithNameA@20 +;BuildExplicitAccessWithNameW=BuildExplicitAccessWithNameW@20 +;BuildImpersonateExplicitAccessWithNameA=BuildImpersonateExplicitAccessWithNameA@24 +;BuildImpersonateExplicitAccessWithNameW=BuildImpersonateExplicitAccessWithNameW@24 +;BuildImpersonateTrusteeA=BuildImpersonateTrusteeA@8 +;BuildImpersonateTrusteeW=BuildImpersonateTrusteeW@8 +;BuildSecurityDescriptorA=BuildSecurityDescriptorA@36 +;BuildSecurityDescriptorW=BuildSecurityDescriptorW@36 +;BuildTrusteeWithNameA=BuildTrusteeWithNameA@8 +;BuildTrusteeWithNameW=BuildTrusteeWithNameW@8 +;BuildTrusteeWithSidA=BuildTrusteeWithSidA@8 +;BuildTrusteeWithSidW=BuildTrusteeWithSidW@8 ChangeServiceConfigA=ChangeServiceConfigA@44 ChangeServiceConfigW=ChangeServiceConfigW@44 -ChangeServiceConfig2A=ChangeServiceConfig2A@12 -ChangeServiceConfig2W=ChangeServiceConfig2W@12 -CheckTokenMembership=CheckTokenMembership@12 -ClearEventLogA=ClearEventLogA@8 -ClearEventLogW=ClearEventLogW@8 -;CloseCodeAuthzLevel -CloseEncryptedFileRaw=CloseEncryptedFileRaw@4 -CloseEventLog=CloseEventLog@4 +;ClearEventLogA=ClearEventLogA@8 +;ClearEventLogW=ClearEventLogW@8 +;CloseEventLog=CloseEventLog@4 CloseServiceHandle=CloseServiceHandle@4 -;CloseTrace -;CommandLineFromMsiDescriptor -;ComputeAccessTokenFromCodeAuthzLevel -;ControlTraceA -;ControlTraceW ControlService=ControlService@12 -;ConvertAccessToSecurityDescriptorA -;ConvertAccessToSecurityDescriptorW -;ConvertSDToStringSDRootDomainA -;ConvertSDToStringSDRootDomainW -;ConvertSecurityDescriptorToAccessA -;ConvertSecurityDescriptorToAccessNamedA -;ConvertSecurityDescriptorToAccessNamedW -;ConvertSecurityDescriptorToAccessW -;ConvertSecurityDescriptorToStringSecurityDescriptorA -;ConvertSecurityDescriptorToStringSecurityDescriptorW -;ConvertSidToStringSidA -;ConvertSidToStringSidW -;ConvertStringSDToSDDomainA -;ConvertStringSDToSDDomainW -;ConvertStringSDToSDRootDomainA -;ConvertStringSDToSDRootDomainW -;ConvertStringSecurityDescriptorToSecurityDescriptorA -;ConvertStringSecurityDescriptorToSecurityDescriptorW -;ConvertStringSidToSidA -;ConvertStringSidToSidW -ConvertToAutoInheritPrivateObjectSecurity=ConvertToAutoInheritPrivateObjectSecurity@24 CopySid=CopySid@12 -;CreateCodeAuthzLevel -CreatePrivateObjectSecurity=CreatePrivateObjectSecurity@24 -CreatePrivateObjectSecurityEx=CreatePrivateObjectSecurityEx@32 -CreatePrivateObjectSecurityWithMultipleInheritance=CreatePrivateObjectSecurityWithMultipleInheritance@36 +;CreatePrivateObjectSecurity=CreatePrivateObjectSecurity@24 CreateProcessAsUserA=CreateProcessAsUserA@44 CreateProcessAsUserW=CreateProcessAsUserW@44 -CreateProcessWithLogonW=CreateProcessWithLogonW@44 -CreateRestrictedToken=CreateRestrictedToken@36 CreateServiceA=CreateServiceA@52 CreateServiceW=CreateServiceW@52 -;CreateTraceInstanceId -CreateWellKnownSid=CreateWellKnownSid@16 -;CredDeleteA -;CredDeleteW -;CredEnumerateA -;CredEnumerateW -;CredFree -;CredGetSessionTypes -;CredGetTargetInfoA -;CredGetTargetInfoW -;CredIsMarshaledCredentialA -;CredIsMarshaledCredentialW -;CredMarshalCredentialA -;CredMarshalCredentialW -;CredProfileLoaded -;CredReadA -;CredReadDomainCredentialsA -;CredReadDomainCredentialsW -;CredReadW -;CredRenameA -;CredRenameW -;CredUnmarshalCredentialA -;CredUnmarshalCredentialW -;CredWriteA -;CredWriteDomainCredentialsA -;CredWriteDomainCredentialsW -;CredWriteW -;CredpConvertCredential -;CredpConvertTargetInfo -;CredpDecodeCredential -;CredpEncodeCredential -CryptAcquireContextA=CryptAcquireContextA@20 -CryptAcquireContextW=CryptAcquireContextW@20 -CryptContextAddRef=CryptContextAddRef@12 -CryptCreateHash=CryptCreateHash@20 -CryptDecrypt=CryptDecrypt@24 -CryptDeriveKey=CryptDeriveKey@20 -CryptDestroyHash=CryptDestroyHash@4 -CryptDestroyKey=CryptDestroyKey@4 -CryptDuplicateHash=CryptDuplicateHash@16 -CryptDuplicateKey=CryptDuplicateKey@16 -CryptEncrypt=CryptEncrypt@28 -CryptEnumProviderTypesA=CryptEnumProviderTypesA@24 -CryptEnumProviderTypesW=CryptEnumProviderTypesW@24 -CryptEnumProvidersA=CryptEnumProvidersA@24 -CryptEnumProvidersW=CryptEnumProvidersW@24 -CryptExportKey=CryptExportKey@24 -CryptGenKey=CryptGenKey@16 -CryptGenRandom=CryptGenRandom@12 -CryptGetDefaultProviderA=CryptGetDefaultProviderA@20 -CryptGetDefaultProviderW=CryptGetDefaultProviderW@20 -CryptGetHashParam=CryptGetHashParam@20 -CryptGetKeyParam=CryptGetKeyParam@20 -CryptGetProvParam=CryptGetProvParam@20 -CryptGetUserKey=CryptGetUserKey@12 -CryptHashData=CryptHashData@16 -CryptHashSessionKey=CryptHashSessionKey@12 -CryptImportKey=CryptImportKey@24 -CryptReleaseContext=CryptReleaseContext@8 -CryptSetHashParam=CryptSetHashParam@16 -CryptSetKeyParam=CryptSetKeyParam@16 -CryptSetProvParam=CryptSetProvParam@16 -CryptSetProviderA=CryptSetProviderA@8 -CryptSetProviderW=CryptSetProviderW@8 -CryptSetProviderExA=CryptSetProviderExA@16 -CryptSetProviderExW=CryptSetProviderExW@16 -CryptSignHashA=CryptSignHashA@24 -CryptSignHashW=CryptSignHashW@24 -CryptVerifySignatureA=CryptVerifySignatureA@24 -CryptVerifySignatureW=CryptVerifySignatureW@24 -DecryptFileA=DecryptFileA@8 -DecryptFileW=DecryptFileW@8 +;CryptAcquireContextA=CryptAcquireContextA@20 +;CryptAcquireContextW=CryptAcquireContextW@20 +;CryptCreateHash=CryptCreateHash@20 +;CryptDecrypt=CryptDecrypt@24 +;CryptDeriveKey=CryptDeriveKey@20 +;CryptDestroyHash=CryptDestroyHash@4 +;CryptDestroyKey=CryptDestroyKey@4 +;CryptEncrypt=CryptEncrypt@28 +;CryptExportKey=CryptExportKey@24 +;CryptGenKey=CryptGenKey@16 +;CryptGenRandom=CryptGenRandom@12 +;CryptGetHashParam=CryptGetHashParam@20 +;CryptGetKeyParam=CryptGetKeyParam@20 +;CryptGetProvParam=CryptGetProvParam@20 +;CryptGetUserKey=CryptGetUserKey@12 +;CryptHashData=CryptHashData@16 +;CryptHashSessionKey=CryptHashSessionKey@12 +;CryptImportKey=CryptImportKey@24 +;CryptReleaseContext=CryptReleaseContext@8 +;CryptSetHashParam=CryptSetHashParam@16 +;CryptSetKeyParam=CryptSetKeyParam@16 +;CryptSetProvParam=CryptSetProvParam@16 +;CryptSetProviderA=CryptSetProviderA@8 +;CryptSetProviderW=CryptSetProviderW@8 +;CryptSignHashA=CryptSignHashA@24 +;CryptSignHashW=CryptSignHashW@24 +;CryptVerifySignatureA=CryptVerifySignatureA@24 +;CryptVerifySignatureW=CryptVerifySignatureW@24 DeleteAce=DeleteAce@8 DeleteService=DeleteService@4 -DeregisterEventSource=DeregisterEventSource@4 -DestroyPrivateObjectSecurity=DestroyPrivateObjectSecurity@4 -;DuplicateEncryptionInfoFile +;DenyAccessRightsA +;DenyAccessRightsW +;DeregisterEventSource=DeregisterEventSource@4 +;DestroyPrivateObjectSecurity=DestroyPrivateObjectSecurity@4 DuplicateToken=DuplicateToken@12 DuplicateTokenEx=DuplicateTokenEx@24 ;ElfBackupEventLogFileA=ElfBackupEventLogFileA@8 @@ -207,78 +105,53 @@ DuplicateTokenEx=DuplicateTokenEx@24 ;ElfRegisterEventSourceW=ElfRegisterEventSourceW@12 ;ElfReportEventA=ElfReportEventA@48 ;ElfReportEventW=ElfReportEventW@48 -;EnableTrace -EncryptFileA=EncryptFileA@4 -EncryptFileW=EncryptFileW@4 -;EncryptedFileKeyInfo -;EncryptionDisable EnumDependentServicesA=EnumDependentServicesA@24 EnumDependentServicesW=EnumDependentServicesW@24 EnumServiceGroupW=EnumServiceGroupW@36 EnumServicesStatusA=EnumServicesStatusA@32 -EnumServicesStatusExA=EnumServicesStatusExA@40 -EnumServicesStatusExW=EnumServicesStatusExW@40 EnumServicesStatusW=EnumServicesStatusW@32 -;EnumerateTraceGuids -EqualDomainSid=EqualDomainSid@12 EqualPrefixSid=EqualPrefixSid@8 EqualSid=EqualSid@8 -FileEncryptionStatusA=FileEncryptionStatusA@8 -FileEncryptionStatusW=FileEncryptionStatusW@8 FindFirstFreeAce=FindFirstFreeAce@8 -;FlushTraceA -;FlushTraceW -;FreeEncryptedFileKeyInfo -;FreeEncryptionCertificateHashList -FreeInheritedFromArray=FreeInheritedFromArray@12 FreeSid=FreeSid@4 -;GetAccessPermissionsForObjectA -;GetAccessPermissionsForObjectW GetAce=GetAce@12 GetAclInformation=GetAclInformation@16 -GetAuditedPermissionsFromAclA=GetAuditedPermissionsFromAclA@16 -GetAuditedPermissionsFromAclW=GetAuditedPermissionsFromAclW@16 -GetCurrentHwProfileA=GetCurrentHwProfileA@4 -GetCurrentHwProfileW=GetCurrentHwProfileW@4 -GetEffectiveRightsFromAclA=GetEffectiveRightsFromAclA@12 -GetEffectiveRightsFromAclW=GetEffectiveRightsFromAclW@12 -GetEventLogInformation=GetEventLogInformation@20 -GetExplicitEntriesFromAclA=GetExplicitEntriesFromAclA@12 -GetExplicitEntriesFromAclW=GetExplicitEntriesFromAclW@12 -GetFileSecurityA=GetFileSecurityA@20 -GetFileSecurityW=GetFileSecurityW@20 -;GetInformationCodeAuthzLevelW -;GetInformationCodeAuthzPolicyW -GetInheritanceSourceA=GetInheritanceSourceA@40 -GetInheritanceSourceW=GetInheritanceSourceW@40 +;GetAuditedPermissionsFromAclA=GetAuditedPermissionsFromAclA@16 +;GetAuditedPermissionsFromAclW=GetAuditedPermissionsFromAclW@16 +;GetAuditedPermissionsFromSDA +;GetAuditedPermissionsFromSDW +;GetCurrentHwProfileA=GetCurrentHwProfileA@4 +;GetCurrentHwProfileW=GetCurrentHwProfileW@4 +;GetEffectiveAccessRightsA +;GetEffectiveAccessRightsW +;GetEffectiveRightsFromAclA=GetEffectiveRightsFromAclA@12 +;GetEffectiveRightsFromAclW=GetEffectiveRightsFromAclW@12 +;GetEffectiveRightsFromSDA +;GetEffectiveRightsFromSDW +;GetExplicitAccessRightsA +;GetExplicitAccessRightsW +;GetExplicitEntriesFromAclA=GetExplicitEntriesFromAclA@12 +;GetExplicitEntriesFromAclW=GetExplicitEntriesFromAclW@12 +;GetFileSecurityA=GetFileSecurityA@20 +;GetFileSecurityW=GetFileSecurityW@20 GetKernelObjectSecurity=GetKernelObjectSecurity@20 GetLengthSid=GetLengthSid@4 -;GetLocalManagedApplicationData -;GetLocalManagedApplications -;GetManagedApplicationCategories -;GetManagedApplications -GetMultipleTrusteeA=GetMultipleTrusteeA@4 -GetMultipleTrusteeOperationA=GetMultipleTrusteeOperationA@4 -GetMultipleTrusteeOperationW=GetMultipleTrusteeOperationW@4 -GetMultipleTrusteeW=GetMultipleTrusteeW@4 -GetNamedSecurityInfoA=GetNamedSecurityInfoA@32 -;GetNamedSecurityInfoExA -;GetNamedSecurityInfoExW -GetNamedSecurityInfoW=GetNamedSecurityInfoW@32 -GetNumberOfEventLogRecords=GetNumberOfEventLogRecords@8 -GetOldestEventLogRecord=GetOldestEventLogRecord@8 -;GetOverlappedAccessResults -GetPrivateObjectSecurity=GetPrivateObjectSecurity@20 +;GetMultipleTrusteeA=GetMultipleTrusteeA@4 +;GetMultipleTrusteeOperationA=GetMultipleTrusteeOperationA@4 +;GetMultipleTrusteeOperationW=GetMultipleTrusteeOperationW@4 +;GetMultipleTrusteeW=GetMultipleTrusteeW@4 +;GetNamedSecurityInfoA=GetNamedSecurityInfoA@32 +;GetNamedSecurityInfoW=GetNamedSecurityInfoW@32 +;GetNumberOfEventLogRecords=GetNumberOfEventLogRecords@8 +;GetOldestEventLogRecord=GetOldestEventLogRecord@8 +;GetPrivateObjectSecurity=GetPrivateObjectSecurity@20 GetSecurityDescriptorControl=GetSecurityDescriptorControl@12 GetSecurityDescriptorDacl=GetSecurityDescriptorDacl@16 GetSecurityDescriptorGroup=GetSecurityDescriptorGroup@12 GetSecurityDescriptorLength=GetSecurityDescriptorLength@4 GetSecurityDescriptorOwner=GetSecurityDescriptorOwner@12 -GetSecurityDescriptorRMControl=GetSecurityDescriptorRMControl@8 GetSecurityDescriptorSacl=GetSecurityDescriptorSacl@16 -GetSecurityInfo=GetSecurityInfo@32 -GetSecurityInfoExA=GetSecurityInfoExA@36 -GetSecurityInfoExW=GetSecurityInfoExW@36 +;GetSecurityInfo=GetSecurityInfo@32 GetServiceDisplayNameA=GetServiceDisplayNameA@16 GetServiceDisplayNameW=GetServiceDisplayNameW@16 GetServiceKeyNameA=GetServiceKeyNameA@16 @@ -288,140 +161,99 @@ GetSidLengthRequired=GetSidLengthRequired@4 GetSidSubAuthority=GetSidSubAuthority@8 GetSidSubAuthorityCount=GetSidSubAuthorityCount@4 GetTokenInformation=GetTokenInformation@20 -GetTrusteeFormA=GetTrusteeFormA@4 -GetTrusteeFormW=GetTrusteeFormW@4 -GetTrusteeNameA=GetTrusteeNameA@4 -GetTrusteeNameW=GetTrusteeNameW@4 -GetTrusteeTypeA=GetTrusteeTypeA@4 -GetTrusteeTypeW=GetTrusteeTypeW@4 -GetUserNameA=GetUserNameA@8 -GetUserNameW=GetUserNameW@8 -GetWindowsAccountDomainSid=GetWindowsAccountDomainSid@12 +;GetTrusteeNameA=GetTrusteeNameA@4 +;GetTrusteeNameW=GetTrusteeNameW@4 +;GetTrusteeTypeA=GetTrusteeTypeA@4 +;GetTrusteeTypeW=GetTrusteeTypeW@4 +;GetUserNameA=GetUserNameA@8 +;GetUserNameW=GetUserNameW@8 ;GrantAccessRightsA=GrantAccessRightsA@16 ;GrantAccessRightsW=GrantAccessRightsW@16 ;I_ScGetCurrentGroupStateW=I_ScGetCurrentGroupStateW@12 -;I_ScIsSecurityProcess -;I_ScPnPGetServiceName -;I_ScSendTSMessage ;I_ScSetServiceBitsA=I_ScSetServiceBitsA@20 ;I_ScSetServiceBitsW=I_ScSetServiceBitsW@20 -;IdentifyCodeAuthzLevelW -ImpersonateAnonymousToken=ImpersonateAnonymousToken@4 -ImpersonateLoggedOnUser=ImpersonateLoggedOnUser@4 -ImpersonateNamedPipeClient=ImpersonateNamedPipeClient@4 +;ImpersonateLoggedOnUser=ImpersonateLoggedOnUser@4 +;ImpersonateNamedPipeClient=ImpersonateNamedPipeClient@4 ImpersonateSelf=ImpersonateSelf@4 InitializeAcl=InitializeAcl@12 InitializeSecurityDescriptor=InitializeSecurityDescriptor@8 InitializeSid=InitializeSid@12 InitiateSystemShutdownA=InitiateSystemShutdownA@20 -InitiateSystemShutdownExA=InitiateSystemShutdownExA@24 -InitiateSystemShutdownExW=InitiateSystemShutdownExW@24 InitiateSystemShutdownW=InitiateSystemShutdownW@20 -;InstallApplication ;IsAccessPermittedA=IsAccessPermittedA@20 ;IsAccessPermittedW=IsAccessPermittedW@20 -IsTextUnicode=IsTextUnicode@12 -IsTokenRestricted=IsTokenRestricted@4 -IsTokenUntrusted=IsTokenUntrusted@4 -IsWellKnownSid=IsWellKnownSid@8 +;IsTextUnicode=IsTextUnicode@12 IsValidAcl=IsValidAcl@4 IsValidSecurityDescriptor=IsValidSecurityDescriptor@4 IsValidSid=IsValidSid@4 LockServiceDatabase=LockServiceDatabase@4 LogonUserA=LogonUserA@24 -LogonUserExA=LogonUserExA@40 -LogonUserExW=LogonUserExW@40 LogonUserW=LogonUserW@24 -LookupAccountNameA=LookupAccountNameA@28 -LookupAccountNameW=LookupAccountNameW@28 -LookupAccountSidA=LookupAccountSidA@28 -LookupAccountSidW=LookupAccountSidW@28 +;LookupAccountNameA=LookupAccountNameA@28 +;LookupAccountNameW=LookupAccountNameW@28 +;LookupAccountSidA=LookupAccountSidA@28 +;LookupAccountSidW=LookupAccountSidW@28 LookupPrivilegeDisplayNameA=LookupPrivilegeDisplayNameA@20 LookupPrivilegeDisplayNameW=LookupPrivilegeDisplayNameW@20 LookupPrivilegeNameA=LookupPrivilegeNameA@16 LookupPrivilegeNameW=LookupPrivilegeNameW@16 LookupPrivilegeValueA=LookupPrivilegeValueA@12 LookupPrivilegeValueW=LookupPrivilegeValueW@12 -LookupSecurityDescriptorPartsA=LookupSecurityDescriptorPartsA@28 -LookupSecurityDescriptorPartsW=LookupSecurityDescriptorPartsW@28 -LsaAddAccountRights=LsaAddAccountRights@16 +;LookupSecurityDescriptorPartsA=LookupSecurityDescriptorPartsA@28 +;LookupSecurityDescriptorPartsW=LookupSecurityDescriptorPartsW@28 +;LsaAddAccountRights=LsaAddAccountRights@16 ;LsaAddPrivilegesToAccount@8 ;LsaClearAuditLog@4 -LsaClose=LsaClose@4 +;LsaClose=LsaClose@4 ;LsaCreateAccount@16 ;LsaCreateSecret@16 ;LsaCreateTrustedDomain@16 -LsaCreateTrustedDomainEx=LsaCreateTrustedDomainEx@20 ;LsaDelete@4 -LsaDeleteTrustedDomain=LsaDeleteTrustedDomain@8 -LsaEnumerateAccountRights=LsaEnumerateAccountRights@16 +;LsaDeleteTrustedDomain=LsaDeleteTrustedDomain@8 +;LsaEnumerateAccountRights=LsaEnumerateAccountRights@16 ;LsaEnumerateAccounts@20 -LsaEnumerateAccountsWithUserRight=LsaEnumerateAccountsWithUserRight@16 +;LsaEnumerateAccountsWithUserRight=LsaEnumerateAccountsWithUserRight@16 ;LsaEnumeratePrivileges@20 ;LsaEnumeratePrivilegesOfAccount@8 -LsaEnumerateTrustedDomains=LsaEnumerateTrustedDomains@20 -LsaEnumerateTrustedDomainsEx=LsaEnumerateTrustedDomainsEx@20 -LsaFreeMemory=LsaFreeMemory@4 +;LsaEnumerateTrustedDomains=LsaEnumerateTrustedDomains@20 +;LsaFreeMemory=LsaFreeMemory@4 ;LsaGetQuotasForAccount@8 -;LsaGetRemoteUserName ;LsaGetSystemAccessAccount@8 ;LsaGetUserName@8 ;LsaICLookupNames@32 -;LsaICLookupNamesWithCreds ;LsaICLookupSids@32 -;LsaICLookupSidsWithCreds -LsaLookupNames=LsaLookupNames@20 -LsaLookupNames2=LsaLookupNames2@24 +;LsaLookupNames=LsaLookupNames@20 ;LsaLookupPrivilegeDisplayName@16 ;LsaLookupPrivilegeName@12 ;LsaLookupPrivilegeValue@12 -LsaLookupSids=LsaLookupSids@20 +;LsaLookupSids=LsaLookupSids@20 +;LsaNtStatusToWinError ;LsaOpenAccount@16 -LsaOpenPolicy=LsaOpenPolicy@16 -;LsaOpenPolicySce +;LsaOpenPolicy=LsaOpenPolicy@16 ;LsaOpenSecret@16 ;LsaOpenTrustedDomain@16 -LsaOpenTrustedDomainByName=LsaOpenTrustedDomainByName@16 -LsaQueryDomainInformationPolicy=LsaQueryDomainInformationPolicy@12 -LsaQueryForestTrustInformation=LsaQueryForestTrustInformation@12 -LsaQueryInformationPolicy=LsaQueryInformationPolicy@12 -;LsaQueryInfoTrustedDomain@12 -LsaQueryTrustedDomainInfoByName=LsaQueryTrustedDomainInfoByName@16 +;LsaQueryInfoTrustedDomain +;LsaQueryInformationPolicy=LsaQueryInformationPolicy@12 ;LsaQuerySecret@20 ;LsaQuerySecurityObject@12 -LsaQueryTrustedDomainInfo=LsaQueryTrustedDomainInfo@16 -LsaRemoveAccountRights=LsaRemoveAccountRights@20 +;LsaQueryTrustedDomainInfo=LsaQueryTrustedDomainInfo@16 +;LsaRemoveAccountRights=LsaRemoveAccountRights@20 ;LsaRemovePrivilegesFromAccount@12 ;LsaRetrievePrivateData@12 -LsaSetDomainInformationPolicy=LsaSetDomainInformationPolicy@12 -LsaSetInformationPolicy=LsaSetInformationPolicy@12 +;LsaSetInformationPolicy=LsaSetInformationPolicy@12 ;LsaSetInformationTrustedDomain@12 -LsaSetForestTrustInformation=LsaSetForestTrustInformation@20 -LsaSetTrustedDomainInfoByName=LsaSetTrustedDomainInfoByName@16 ;LsaSetQuotasForAccount@8 ;LsaSetSecret@12 ;LsaSetSecurityObject@12 ;LsaSetSystemAccessAccount@8 -LsaSetTrustedDomainInformation=LsaSetTrustedDomainInformation@16 -LsaStorePrivateData=LsaStorePrivateData@12 -LsaNtStatusToWinError=NTDLL.RtlNtStatusToDosError +;LsaSetTrustedDomainInformation=LsaSetTrustedDomainInformation@16 +;LsaStorePrivateData=LsaStorePrivateData@12 MakeAbsoluteSD=MakeAbsoluteSD@44 MakeSelfRelativeSD=MakeSelfRelativeSD@12 MapGenericMask=MapGenericMask@8 -MD4Final=MD4Final@4 -MD4Init=MD4Init@4 -MD4Update=MD4Update@12 -MD5Final=MD5Final@4 -MD5Init=MD5Init@4 -MD5Update=MD5Update@12 -;MSChapSrvChangePassword -;MSChapSrvChangePassword2 -MakeAbsoluteSD2=MakeAbsoluteSD2@8 ;NTAccessMaskToProvAccessRights=NTAccessMaskToProvAccessRights@12 -NotifyBootConfigStatus=NotifyBootConfigStatus@4 -NotifyChangeEventLog=NotifyChangeEventLog@8 -;OpenBackupEventLogA -;OpenBackupEventLogW +;NotifyBootConfigStatus=NotifyBootConfigStatus@4 +;NotifyChangeEventLog=NotifyChangeEventLog@8 ObjectCloseAuditAlarmA=ObjectCloseAuditAlarmA@12 ObjectCloseAuditAlarmW=ObjectCloseAuditAlarmW@12 ObjectDeleteAuditAlarmA=ObjectDeleteAuditAlarmA@12 @@ -430,44 +262,30 @@ ObjectOpenAuditAlarmA=ObjectOpenAuditAlarmA@48 ObjectOpenAuditAlarmW=ObjectOpenAuditAlarmW@48 ObjectPrivilegeAuditAlarmA=ObjectPrivilegeAuditAlarmA@24 ObjectPrivilegeAuditAlarmW=ObjectPrivilegeAuditAlarmW@24 -OpenBackupEventLogA=OpenBackupEventLogA@8 -OpenBackupEventLogW=OpenBackupEventLogW@8 -OpenEncryptedFileRawA=OpenEncryptedFileRawA@12 -OpenEncryptedFileRawW=OpenEncryptedFileRawW@12 -OpenEventLogA=OpenEventLogA@8 -OpenEventLogW=OpenEventLogW@8 +;OpenBackupEventLogA=OpenBackupEventLogA@8 +;OpenBackupEventLogW=OpenBackupEventLogW@8 +;OpenEventLogA=OpenEventLogA@8 +;OpenEventLogW=OpenEventLogW@8 OpenProcessToken=OpenProcessToken@12 OpenSCManagerA=OpenSCManagerA@12 OpenSCManagerW=OpenSCManagerW@12 OpenServiceA=OpenServiceA@12 OpenServiceW=OpenServiceW@12 OpenThreadToken=OpenThreadToken@16 -;OpenTraceA -;OpenTraceW PrivilegeCheck=PrivilegeCheck@12 PrivilegedServiceAuditAlarmA=PrivilegedServiceAuditAlarmA@20 PrivilegedServiceAuditAlarmW=PrivilegedServiceAuditAlarmW@20 -;ProcessIdleTasks -;ProcessTrace -;QueryAllTracesA -;QueryAllTracesW -;QueryRecoveryAgentsOnEncryptedFile +;ProvAccessRightsToNTAccessMask QueryServiceConfigA=QueryServiceConfigA@16 QueryServiceConfigW=QueryServiceConfigW@16 -QueryServiceConfig2A=QueryServiceConfig2A@20 -QueryServiceConfig2W=QueryServiceConfig2W@20 QueryServiceLockStatusA=QueryServiceLockStatusA@16 QueryServiceLockStatusW=QueryServiceLockStatusW@16 QueryServiceObjectSecurity=QueryServiceObjectSecurity@20 QueryServiceStatus=QueryServiceStatus@8 QueryServiceStatusEx=QueryServiceStatusEx@20 -;QueryTraceA -;QueryTraceW -;QueryUsersOnEncryptedFile -QueryWindows31FilesMigration=QueryWindows31FilesMigration@4 -ReadEncryptedFileRaw=ReadEncryptedFileRaw@12 -ReadEventLogA=ReadEventLogA@28 -ReadEventLogW=ReadEventLogW@28 +;QueryWindows31FilesMigration=QueryWindows31FilesMigration@4 +;ReadEventLogA=ReadEventLogA@28 +;ReadEventLogW=ReadEventLogW@28 RegCloseKey=RegCloseKey@4 RegConnectRegistryA=RegConnectRegistryA@12 RegConnectRegistryW=RegConnectRegistryW@12 @@ -479,7 +297,6 @@ RegDeleteKeyA=RegDeleteKeyA@8 RegDeleteKeyW=RegDeleteKeyW@8 RegDeleteValueA=RegDeleteValueA@8 RegDeleteValueW=RegDeleteValueW@8 -RegDisablePredefinedCache=RegDisablePredefinedCache@0 RegEnumKeyA=RegEnumKeyA@16 RegEnumKeyExA=RegEnumKeyExA@32 RegEnumKeyExW=RegEnumKeyExW@32 @@ -491,13 +308,10 @@ RegGetKeySecurity=RegGetKeySecurity@16 RegLoadKeyA=RegLoadKeyA@12 RegLoadKeyW=RegLoadKeyW@12 RegNotifyChangeKeyValue=RegNotifyChangeKeyValue@20 -RegOpenCurrentUser=RegOpenCurrentUser@8 RegOpenKeyA=RegOpenKeyA@12 RegOpenKeyExA=RegOpenKeyExA@20 RegOpenKeyExW=RegOpenKeyExW@20 RegOpenKeyW=RegOpenKeyW@12 -RegOpenUserClassesRoot=RegOpenUserClassesRoot@16 -RegOverridePredefKey=RegOverridePredefKey@8 RegQueryInfoKeyA=RegQueryInfoKeyA@48 RegQueryInfoKeyW=RegQueryInfoKeyW@48 RegQueryMultipleValuesA=RegQueryMultipleValuesA@20 @@ -511,8 +325,6 @@ RegReplaceKeyW=RegReplaceKeyW@16 RegRestoreKeyA=RegRestoreKeyA@12 RegRestoreKeyW=RegRestoreKeyW@12 RegSaveKeyA=RegSaveKeyA@12 -RegSaveKeyExA=RegSaveKeyExA@16 -RegSaveKeyExW=RegSaveKeyExW@16 RegSaveKeyW=RegSaveKeyW@12 RegSetKeySecurity=RegSetKeySecurity@12 RegSetValueA=RegSetValueA@20 @@ -521,83 +333,43 @@ RegSetValueExW=RegSetValueExW@24 RegSetValueW=RegSetValueW@20 RegUnLoadKeyA=RegUnLoadKeyA@8 RegUnLoadKeyW=RegUnLoadKeyW@8 -RegisterEventSourceA=RegisterEventSourceA@8 -RegisterEventSourceW=RegisterEventSourceW@8 -;RegisterIdleTask +;RegisterEventSourceA=RegisterEventSourceA@8 +;RegisterEventSourceW=RegisterEventSourceW@8 RegisterServiceCtrlHandlerA=RegisterServiceCtrlHandlerA@8 -RegisterServiceCtrlHandlerExA=RegisterServiceCtrlHandlerExA@12 -RegisterServiceCtrlHandlerExW=RegisterServiceCtrlHandlerExW@12 RegisterServiceCtrlHandlerW=RegisterServiceCtrlHandlerW@8 -;RegisterTraceGuidsA -;RegisterTraceGuidsW -;RemoveTraceCallback -;RemoveUsersFromEncryptedFile -ReportEventA=ReportEventA@36 -ReportEventW=ReportEventW@36 +;ReplaceAllAccessRightsA +;ReplaceAllAccessRightsW +;ReportEventA=ReportEventA@36 +;ReportEventW=ReportEventW@36 RevertToSelf=RevertToSelf@0 ;RevokeExplicitAccessRightsA=RevokeExplicitAccessRightsA@16 ;RevokeExplicitAccessRightsW=RevokeExplicitAccessRightsW@16 -;SaferCloseLevel -;SaferComputeTokenFromLevel -;SaferCreateLevel -;SaferGetLevelInformation -;SaferGetPolicyInformation -;SaferIdentifyLevel -;SaferRecordEventLogEntry -;SaferSetLevelInformation -;SaferSetPolicyInformation -;SaferiChangeRegistryScope -;SaferiCompareTokenLevels -;SaferiIsExecutableFileType -;SaferiPopulateDefaultsInRegistry -;SaferiRecordEventLogEntry -;SaferiReplaceProcessThreadTokens -;SaferiSearchMatchingHashRules ;SetAccessRightsA=SetAccessRightsA@16 ;SetAccessRightsW=SetAccessRightsW@16 SetAclInformation=SetAclInformation@16 -;SetEntriesInAccessListA -;SetEntriesInAccessListW -SetEntriesInAclA=SetEntriesInAclA@16 -SetEntriesInAclW=SetEntriesInAclW@16 -;SetEntriesInAuditListA -;SetEntriesInAuditListW -SetFileSecurityA=SetFileSecurityA@12 -SetFileSecurityW=SetFileSecurityW@12 +;SetEntriesInAclA=SetEntriesInAclA@16 +;SetEntriesInAclW=SetEntriesInAclW@16 +;SetFileSecurityA=SetFileSecurityA@12 +;SetFileSecurityW=SetFileSecurityW@12 SetKernelObjectSecurity=SetKernelObjectSecurity@12 -;SetInformationCodeAuthzLevelW -;SetInformationCodeAuthzPolicyW -SetNamedSecurityInfoA=SetNamedSecurityInfoA@28 -;SetNamedSecurityInfoExA -;SetNamedSecurityInfoExW -SetNamedSecurityInfoW=SetNamedSecurityInfoW@28 -SetPrivateObjectSecurity=SetPrivateObjectSecurity@20 -SetPrivateObjectSecurityEx=SetPrivateObjectSecurityEx@24 -SetSecurityDescriptorControl=SetSecurityDescriptorControl@12 +;SetNamedSecurityInfoA=SetNamedSecurityInfoA@28 +;SetNamedSecurityInfoW=SetNamedSecurityInfoW@28 +;SetPrivateObjectSecurity=SetPrivateObjectSecurity@20 SetSecurityDescriptorDacl=SetSecurityDescriptorDacl@16 SetSecurityDescriptorGroup=SetSecurityDescriptorGroup@12 SetSecurityDescriptorOwner=SetSecurityDescriptorOwner@12 -SetSecurityDescriptorRMControl=SetSecurityDescriptorRMControl@8 SetSecurityDescriptorSacl=SetSecurityDescriptorSacl@16 -SetSecurityInfo=SetSecurityInfo@28 -;SetSecurityInfoExA -;SetSecurityInfoExW +;SetSecurityInfo=SetSecurityInfo@28 SetServiceBits=SetServiceBits@16 SetServiceObjectSecurity=SetServiceObjectSecurity@12 SetServiceStatus=SetServiceStatus@8 SetThreadToken=SetThreadToken@8 SetTokenInformation=SetTokenInformation@16 -;SetTraceCallback -;SetUserFileEncryptionKey StartServiceA=StartServiceA@12 StartServiceCtrlDispatcherA=StartServiceCtrlDispatcherA@4 StartServiceCtrlDispatcherW=StartServiceCtrlDispatcherW@4 StartServiceW=StartServiceW@12 -;StartTraceA -;StartTraceW -;StopTraceA -;StopTraceW -SynchronizeWindows31FilesAndWindowsNTRegistry=SynchronizeWindows31FilesAndWindowsNTRegistry@16 +;SynchronizeWindows31FilesAndWindowsNTRegistry=SynchronizeWindows31FilesAndWindowsNTRegistry@16 SystemFunction001=SystemFunction001@12 SystemFunction002=SystemFunction002@12 SystemFunction003=SystemFunction003@8 @@ -633,60 +405,5 @@ SystemFunction032=SystemFunction032@8 SystemFunction033=SystemFunction033@8 SystemFunction034=SystemFunction034@8 SystemFunction035=SystemFunction035@8 -;SystemFunction036 -;SystemFunction040 -;SystemFunction041 -;TraceEvent -;TraceEventInstance -;TraceMessage -;TraceMessageVa -TreeResetNamedSecurityInfoA=TreeResetNamedSecurityInfoA@44 -TreeResetNamedSecurityInfoW=TreeResetNamedSecurityInfoW@44 -;TrusteeAccessToObjectA -;TrusteeAccessToObjectW -;UninstallApplication UnlockServiceDatabase=UnlockServiceDatabase@4 -;UnregisterIdleTask -;UnregisterTraceGuids -;UpdateTraceA -;UpdateTraceW -;WdmWmiServiceMain -;WmiCloseBlock -;WmiCloseTraceWithCursor -;WmiConvertTimestamp -;WmiDevInstToInstanceNameA -;WmiDevInstToInstanceNameW -;WmiEnumerateGuids -;WmiExecuteMethodA -;WmiExecuteMethodW -;WmiFileHandleToInstanceNameA -;WmiFileHandleToInstanceNameW -;WmiFreeBuffer -;WmiGetFirstTraceOffset -;WmiGetNextEvent -;WmiGetTraceHeader -;WmiMofEnumerateResourcesA -;WmiMofEnumerateResourcesW -;WmiNotificationRegistrationA -;WmiNotificationRegistrationW -;WmiOpenBlock -;WmiOpenTraceWithCursor -;WmiParseTraceEvent -;WmiQueryAllDataA -;WmiQueryAllDataMultipleA -;WmiQueryAllDataMultipleW -;WmiQueryAllDataW -;WmiQueryGuidInformation -;WmiQuerySingleInstanceA -;WmiQuerySingleInstanceMultipleA -;WmiQuerySingleInstanceMultipleW -;WmiQuerySingleInstanceW -;WmiReceiveNotificationsA -;WmiReceiveNotificationsW -;WmiSetSingleInstanceA -;WmiSetSingleInstanceW -;WmiSetSingleItemA -;WmiSetSingleItemW -Wow64Win32ApiEntry=Wow64Win32ApiEntry@12 -WriteEncryptedFileRaw=WriteEncryptedFileRaw@12 - +; EOF diff --git a/reactos/lib/advapi32/makefile b/reactos/lib/advapi32/makefile index 670cc47bbfd..410dda722e8 100644 --- a/reactos/lib/advapi32/makefile +++ b/reactos/lib/advapi32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.32 2004/01/20 01:40:18 ekohl Exp $ +# $Id: makefile,v 1.33 2004/02/25 14:25:10 ekohl Exp $ PATH_TO_TOP = ../.. @@ -19,10 +19,7 @@ MISC_OBJECTS = \ misc/dllmain.o \ misc/logon.o \ misc/shutdown.o \ - misc/sysfunc.o \ - misc/crstubs.o \ - misc/aclstubs.o \ - misc/stubs.o + misc/sysfunc.o REGISTRY_OBJECTS = \ reg/reg.o @@ -30,7 +27,6 @@ REGISTRY_OBJECTS = \ SECURITY_OBJECTS = \ sec/ac.o \ sec/audit.o \ - sec/lsa.o \ sec/misc.o \ sec/sec.o \ sec/sid.o diff --git a/reactos/lib/advapi32/misc/aclstubs.c b/reactos/lib/advapi32/misc/aclstubs.c deleted file mode 100644 index 74ca49a7bc2..00000000000 --- a/reactos/lib/advapi32/misc/aclstubs.c +++ /dev/null @@ -1,319 +0,0 @@ -#include <windows.h> -#include <accctrl.h> -#include <aclapi.h> -/* - * @unimplemented - */ -VOID STDCALL BuildExplicitAccessWithNameA(PEXPLICIT_ACCESS_A pExplicitAccess,LPSTR pTrusteeName,DWORD AccessPermissions,ACCESS_MODE AccessMode,DWORD Inheritance) -{ -} -/* - * @unimplemented - */ -VOID STDCALL BuildExplicitAccessWithNameW(PEXPLICIT_ACCESS_W pExplicitAccess,LPWSTR pTrusteeName,DWORD AccessPermissions,ACCESS_MODE AccessMode,DWORD Inheritance) -{ -} -/* - * @unimplemented - */ -DWORD STDCALL BuildSecurityDescriptorA(PTRUSTEE_A pOwner,PTRUSTEE_A pGroup,ULONG cCountOfAccessEntries,PEXPLICIT_ACCESS_A pListOfAccessEntries, - ULONG cCountOfAuditEntries,PEXPLICIT_ACCESS_A pListOfAuditEntries,PSECURITY_DESCRIPTOR pOldSD,PULONG pSizeNewSD,PSECURITY_DESCRIPTOR* pNewSD) -{ - return(FALSE); -} -/* - * @unimplemented - */ -DWORD STDCALL BuildSecurityDescriptorW(PTRUSTEE_W pOwner,PTRUSTEE_W pGroup,ULONG cCountOfAccessEntries,PEXPLICIT_ACCESS_W pListOfAccessEntries, - ULONG cCountOfAuditEntries,PEXPLICIT_ACCESS_W pListOfAuditEntries,PSECURITY_DESCRIPTOR pOldSD,PULONG pSizeNewSD,PSECURITY_DESCRIPTOR* pNewSD) -{ - return(FALSE); -} -/* - * @unimplemented - */ -VOID STDCALL BuildTrusteeWithNameA(PTRUSTEE_A pTrustee,LPSTR pName) -{ -} -/* - * @unimplemented - */ -VOID STDCALL BuildTrusteeWithNameW(PTRUSTEE_W pTrustee,LPWSTR pName) -{ -} -/* - * @unimplemented - */ -VOID STDCALL BuildTrusteeWithObjectsAndNameA(PTRUSTEE_A pTrustee,POBJECTS_AND_NAME_A pObjName,SE_OBJECT_TYPE ObjectType, - LPSTR ObjectTypeName,LPSTR InheritedObjectTypeName,LPSTR Name) -{ -} -/* - * @unimplemented - */ -VOID STDCALL BuildTrusteeWithObjectsAndNameW(PTRUSTEE_W pTrustee,POBJECTS_AND_NAME_W pObjName,SE_OBJECT_TYPE ObjectType, - LPWSTR ObjectTypeName,LPWSTR InheritedObjectTypeName,LPWSTR Name) -{ -} -/* - * @unimplemented - */ -VOID STDCALL BuildTrusteeWithObjectsAndSidA(PTRUSTEE_A pTrustee,POBJECTS_AND_SID pObjSid,GUID* pObjectGuid,GUID* pInheritedObjectGuid,PSID pSid) -{ -} -/* - * @unimplemented - */ -VOID STDCALL BuildTrusteeWithObjectsAndSidW(PTRUSTEE_W pTrustee,POBJECTS_AND_SID pObjSid,GUID* pObjectGuid,GUID* pInheritedObjectGuid,PSID pSid) -{ -} -/* - * @unimplemented - */ -VOID STDCALL BuildTrusteeWithSidA(PTRUSTEE_A pTrustee,PSID pSid) -{ -} -/* - * @unimplemented - */ -VOID STDCALL BuildTrusteeWithSidW(PTRUSTEE_W pTrustee,PSID pSid) -{ -} -/* - * @unimplemented - */ -DWORD STDCALL GetAuditedPermissionsFromAclA(PACL pacl,PTRUSTEE_A pTrustee,PACCESS_MASK pSuccessfulAuditedRights,PACCESS_MASK pFailedAuditRights) -{ - return(FALSE); -} -/* - * @unimplemented - */ -DWORD STDCALL GetAuditedPermissionsFromAclW(PACL pacl,PTRUSTEE_W pTrustee,PACCESS_MASK pSuccessfulAuditedRights,PACCESS_MASK pFailedAuditRights) -{ - return(FALSE); -} -/* - * @unimplemented - */ -DWORD STDCALL GetEffectiveRightsFromAclA(PACL pacl,PTRUSTEE_A pTrustee,PACCESS_MASK pAccessRights) -{ - return(FALSE); -} -/* - * @unimplemented - */ -DWORD STDCALL GetEffectiveRightsFromAclW(PACL pacl,PTRUSTEE_W pTrustee,PACCESS_MASK pAccessRights) -{ - return(FALSE); -} -/* - * @unimplemented - */ -DWORD STDCALL GetExplicitEntriesFromAclA(PACL pacl,PULONG pcCountOfExplicitEntries,PEXPLICIT_ACCESS_A* pListOfExplicitEntries) -{ - return(FALSE); -} -/* - * @unimplemented - */ -DWORD STDCALL GetExplicitEntriesFromAclW(PACL pacl,PULONG pcCountOfExplicitEntries,PEXPLICIT_ACCESS_W* pListOfExplicitEntries) -{ - return(FALSE); -} -/* - * @unimplemented - */ -DWORD STDCALL GetNamedSecurityInfoA(LPSTR pObjectName,SE_OBJECT_TYPE ObjectType,SECURITY_INFORMATION SecurityInfo, - PSID* ppsidOwner,PSID* ppsidGroup,PACL* ppDacl,PACL* ppSacl,PSECURITY_DESCRIPTOR* ppSecurityDescriptor) -{ - return(FALSE); -} -/* - * @unimplemented - */ -DWORD STDCALL GetNamedSecurityInfoW(LPWSTR pObjectName,SE_OBJECT_TYPE ObjectType,SECURITY_INFORMATION SecurityInfo, - PSID* ppsidOwner,PSID* ppsidGroup,PACL* ppDacl,PACL* ppSacl,PSECURITY_DESCRIPTOR* ppSecurityDescriptor) -{ - return(FALSE); -} -/* - * @unimplemented - */ -TRUSTEE_FORM STDCALL GetTrusteeFormA(PTRUSTEE_A pTrustee) -{ - return(FALSE); -} -/* - * @unimplemented - */ -TRUSTEE_FORM STDCALL GetTrusteeFormW(PTRUSTEE_W pTrustee) -{ - return(FALSE); -} -/* - * @unimplemented - */ -LPSTR STDCALL GetTrusteeNameA(PTRUSTEE_A pTrustee) -{ - return(FALSE); -} -/* - * @unimplemented - */ -LPWSTR STDCALL GetTrusteeNameW(PTRUSTEE_W pTrustee) -{ - return(FALSE); -} -/* - * @unimplemented - */ -TRUSTEE_TYPE STDCALL GetTrusteeTypeA(PTRUSTEE_A pTrustee) -{ - return(FALSE); -} -/* - * @unimplemented - */ -TRUSTEE_TYPE STDCALL GetTrusteeTypeW(PTRUSTEE_W pTrustee) -{ - return(FALSE); -} -/* - * @unimplemented - */ -DWORD STDCALL LookupSecurityDescriptorPartsA(PTRUSTEE_A* pOwner,PTRUSTEE_A* pGroup,PULONG cCountOfAccessEntries,PEXPLICIT_ACCESS_A* pListOfAccessEntries, - PULONG cCountOfAuditEntries,PEXPLICIT_ACCESS_A* pListOfAuditEntries,PSECURITY_DESCRIPTOR pSD) -{ - return(FALSE); -} -/* - * @unimplemented - */ -DWORD STDCALL LookupSecurityDescriptorPartsW(PTRUSTEE_W* pOwner,PTRUSTEE_W* pGroup,PULONG cCountOfAccessEntries,PEXPLICIT_ACCESS_W* pListOfAccessEntries, - PULONG cCountOfAuditEntries,PEXPLICIT_ACCESS_W* pListOfAuditEntries,PSECURITY_DESCRIPTOR pSD) -{ - return(FALSE); -} -/* - * @unimplemented - */ -DWORD STDCALL SetEntriesInAclA(ULONG cCountOfExplicitEntries,PEXPLICIT_ACCESS_A pListOfExplicitEntries,PACL OldAcl,PACL* NewAcl) -{ - return(FALSE); -} -/* - * @unimplemented - */ -DWORD STDCALL SetEntriesInAclW(ULONG cCountOfExplicitEntries,PEXPLICIT_ACCESS_W pListOfExplicitEntries,PACL OldAcl,PACL* NewAcl) -{ - return(FALSE); -} -/* - * @unimplemented - */ -DWORD STDCALL SetNamedSecurityInfoA(LPSTR pObjectName,SE_OBJECT_TYPE ObjectType,SECURITY_INFORMATION SecurityInfo,PSID psidOwner,PSID psidGroup,PACL pDacl,PACL pSacl) -{ - return(FALSE); -} -/* - * @unimplemented - */ -DWORD STDCALL SetNamedSecurityInfoW(LPWSTR pObjectName,SE_OBJECT_TYPE ObjectType,SECURITY_INFORMATION SecurityInfo,PSID psidOwner,PSID psidGroup,PACL pDacl,PACL pSacl) -{ - return(FALSE); -} -/* - * @unimplemented - */ -DWORD STDCALL SetSecurityInfo(HANDLE handle,SE_OBJECT_TYPE ObjectType,SECURITY_INFORMATION SecurityInfo,PSID psidOwner,PSID psidGroup,PACL pDacl,PACL pSacl) -{ - return(FALSE); -} -/* - * @unimplemented - */ -DWORD STDCALL GetInheritanceSourceA(LPSTR pObjectName,SE_OBJECT_TYPE ObjectType,SECURITY_INFORMATION SecurityInfo, BOOL Container,GUID ** pObjectClassGuids ,DWORD GuidCount,PACL pAcl,PFN_OBJECT_MGR_FUNCTS pfnArray OPTIONAL,PGENERIC_MAPPING pGenericMapping,PINHERITED_FROMA pInheritArray) -{ - return(FALSE); -} -/* - * @unimplemented - */ -DWORD STDCALL GetInheritanceSourceW(LPWSTR pObjectName,SE_OBJECT_TYPE ObjectType,SECURITY_INFORMATION SecurityInfo, BOOL Container,GUID ** pObjectClassGuids ,DWORD GuidCount,PACL pAcl,PFN_OBJECT_MGR_FUNCTS pfnArray OPTIONAL,PGENERIC_MAPPING pGenericMapping,PINHERITED_FROMW pInheritArray) -{ - return(FALSE); -} -/* - * @unimplemented - */ -DWORD STDCALL FreeInheritedFromArray(PINHERITED_FROMW pInheritArray,USHORT AceCnt,PFN_OBJECT_MGR_FUNCTS pfnArray) -{ - return(FALSE); -} -/* - * @unimplemented - */ -DWORD STDCALL TreeResetNamedSecurityInfoA(LPSTR pObjectName,SE_OBJECT_TYPE ObjectType,SECURITY_INFORMATION SecurityInfo,PSID pOwner,PSID pGroup,PACL pDacl,PACL pSacl,BOOL KeepExplicit,FN_PROGRESS fnProgress,PROG_INVOKE_SETTING ProgressInvokeSetting,PVOID Args) -{ - return(FALSE); -} -/* - * @unimplemented - */ -DWORD STDCALL TreeResetNamedSecurityInfoW(LPWSTR pObjectName,SE_OBJECT_TYPE ObjectType,SECURITY_INFORMATION SecurityInfo,PSID pOwner,PSID pGroup,PACL pDacl,PACL pSacl,BOOL KeepExplicit,FN_PROGRESS fnProgress,PROG_INVOKE_SETTING ProgressInvokeSetting,PVOID Args) -{ - return(FALSE); -} -/* - * @unimplemented - */ -VOID STDCALL BuildImpersonateExplicitAccessWithNameA(PEXPLICIT_ACCESS_A pExplicitAccess,LPSTR pTrusteeName,PTRUSTEE_A pTrustee,DWORD AccessPermissions,ACCESS_MODE AccessMode,DWORD Inheritance) -{ -} -/* - * @unimplemented - */ -VOID STDCALL BuildImpersonateExplicitAccessWithNameW(PEXPLICIT_ACCESS_W pExplicitAccess,LPWSTR pTrusteeName,PTRUSTEE_W pTrustee,DWORD AccessPermissions,ACCESS_MODE AccessMode,DWORD Inheritance) -{ -} -/* - * @unimplemented - */ -VOID STDCALL BuildImpersonateTrusteeA(PTRUSTEE_A pTrustee,PTRUSTEE_A pImpersonateTrustee) -{ -} -/* - * @unimplemented - */ -VOID STDCALL BuildImpersonateTrusteeW(PTRUSTEE_W pTrustee,PTRUSTEE_W pImpersonateTrustee) -{ -} -/* - * @unimplemented - */ -MULTIPLE_TRUSTEE_OPERATION STDCALL GetMultipleTrusteeOperationA(PTRUSTEE_A pTrustee) -{ - return(FALSE); -} -/* - * @unimplemented - */ -MULTIPLE_TRUSTEE_OPERATION STDCALL GetMultipleTrusteeOperationW(PTRUSTEE_W pTrustee) -{ - return(FALSE); -} -/* - * @unimplemented - */ -PTRUSTEE_A STDCALL GetMultipleTrusteeA(PTRUSTEE_A pTrustee) -{ - return(FALSE); -} -/* - * @unimplemented - */ -PTRUSTEE_W STDCALL GetMultipleTrusteeW(PTRUSTEE_W pTrustee) -{ - return(FALSE); -} diff --git a/reactos/lib/advapi32/misc/crstubs.c b/reactos/lib/advapi32/misc/crstubs.c deleted file mode 100644 index e990938c8e8..00000000000 --- a/reactos/lib/advapi32/misc/crstubs.c +++ /dev/null @@ -1,298 +0,0 @@ -#include <windows.h> -#include <wincrypt.h> -/* - * @unimplemented - */ -BOOL STDCALL CryptAcquireContextA(HCRYPTPROV *phProv, LPCSTR pszContainer, - LPCSTR pszProvider, DWORD dwProvType, - DWORD dwFlags) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptAcquireContextW (HCRYPTPROV *phProv, LPCWSTR pszContainer, - LPCWSTR pszProvider, DWORD dwProvType, DWORD dwFlags) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptGenRandom (HCRYPTPROV hProv, DWORD dwLen, BYTE *pbBuffer) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptContextAddRef (HCRYPTPROV hProv, DWORD *pdwReserved, DWORD dwFlags) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptCreateHash (HCRYPTPROV hProv, ALG_ID Algid, HCRYPTKEY hKey, - DWORD dwFlags, HCRYPTHASH *phHash) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptDecrypt (HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, - DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptDeriveKey (HCRYPTPROV hProv, ALG_ID Algid, HCRYPTHASH hBaseData, - DWORD dwFlags, HCRYPTKEY *phKey) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptDestroyHash (HCRYPTHASH hHash) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptDestroyKey (HCRYPTKEY hKey) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptDuplicateKey (HCRYPTKEY hKey, DWORD *pdwReserved, DWORD dwFlags, HCRYPTKEY *phKey) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptDuplicateHash (HCRYPTHASH hHash, DWORD *pdwReserved, - DWORD dwFlags, HCRYPTHASH *phHash) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptEncrypt (HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, - DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen, DWORD dwBufLen) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptEnumProvidersA (DWORD dwIndex, DWORD *pdwReserved, - DWORD dwFlags, DWORD *pdwProvType, LPSTR pszProvName, DWORD *pcbProvName) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptEnumProvidersW (DWORD dwIndex, DWORD *pdwReserved, - DWORD dwFlags, DWORD *pdwProvType, LPWSTR pszProvName, DWORD *pcbProvName) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptEnumProviderTypesA (DWORD dwIndex, DWORD *pdwReserved, - DWORD dwFlags, DWORD *pdwProvType, LPSTR pszTypeName, DWORD *pcbTypeName) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptEnumProviderTypesW (DWORD dwIndex, DWORD *pdwReserved, - DWORD dwFlags, DWORD *pdwProvType, LPWSTR pszTypeName, DWORD *pcbTypeName) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptExportKey (HCRYPTKEY hKey, HCRYPTKEY hExpKey, DWORD dwBlobType, - DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptGenKey (HCRYPTPROV hProv, ALG_ID Algid, DWORD dwFlags, HCRYPTKEY *phKey) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptGetKeyParam (HCRYPTKEY hKey, DWORD dwParam, BYTE *pbData, - DWORD *pdwDataLen, DWORD dwFlags) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptGetHashParam (HCRYPTHASH hHash, DWORD dwParam, BYTE *pbData, - DWORD *pdwDataLen, DWORD dwFlags) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptGetProvParam (HCRYPTPROV hProv, DWORD dwParam, BYTE *pbData, - DWORD *pdwDataLen, DWORD dwFlags) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptGetDefaultProviderA (DWORD dwProvType, DWORD *pdwReserved, - DWORD dwFlags, LPSTR pszProvName, DWORD *pcbProvName) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptGetDefaultProviderW (DWORD dwProvType, DWORD *pdwReserved, - DWORD dwFlags, LPWSTR pszProvName, DWORD *pcbProvName) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptGetUserKey (HCRYPTPROV hProv, DWORD dwKeySpec, HCRYPTKEY *phUserKey) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptHashData (HCRYPTHASH hHash, BYTE *pbData, DWORD dwDataLen, DWORD dwFlags) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptHashSessionKey (HCRYPTHASH hHash, HCRYPTKEY hKey, DWORD dwFlags) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptImportKey (HCRYPTPROV hProv, BYTE *pbData, DWORD dwDataLen, - HCRYPTKEY hPubKey, DWORD dwFlags, HCRYPTKEY *phKey) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptReleaseContext (HCRYPTPROV hProv, DWORD dwFlags) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptSignHashA (HCRYPTHASH hHash, DWORD dwKeySpec, LPCSTR sDescription, - DWORD dwFlags, BYTE *pbSignature, DWORD *pdwSigLen) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptSignHashW (HCRYPTHASH hHash, DWORD dwKeySpec, LPCWSTR sDescription, - DWORD dwFlags, BYTE *pbSignature, DWORD *pdwSigLen) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptSetHashParam (HCRYPTHASH hHash, DWORD dwParam, BYTE *pbData, DWORD dwFlags) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptSetKeyParam (HCRYPTKEY hKey, DWORD dwParam, BYTE *pbData, DWORD dwFlags) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptSetProviderA (LPCSTR pszProvName, DWORD dwProvType) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptSetProviderW (LPCWSTR pszProvName, DWORD dwProvType) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptSetProviderExA (LPCSTR pszProvName, DWORD dwProvType, DWORD *pdwReserved, DWORD dwFlags) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptSetProviderExW (LPCWSTR pszProvName, DWORD dwProvType, DWORD *pdwReserved, DWORD dwFlags) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptSetProvParam (HCRYPTPROV hProv, DWORD dwParam, BYTE *pbData, DWORD dwFlags) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptVerifySignatureA (HCRYPTHASH hHash, BYTE *pbSignature, DWORD dwSigLen, - HCRYPTKEY hPubKey, LPCSTR sDescription, DWORD dwFlags) -{ - return(FALSE); -} -/* - * @unimplemented - */ -BOOL STDCALL CryptVerifySignatureW (HCRYPTHASH hHash, BYTE *pbSignature, DWORD dwSigLen, - HCRYPTKEY hPubKey, LPCWSTR sDescription, DWORD dwFlags) -{ - return(FALSE); -} diff --git a/reactos/lib/advapi32/misc/logon.c b/reactos/lib/advapi32/misc/logon.c index d80e04a6b18..853d12e0dba 100644 --- a/reactos/lib/advapi32/misc/logon.c +++ b/reactos/lib/advapi32/misc/logon.c @@ -1,4 +1,4 @@ -/* $Id: logon.c,v 1.3 2004/01/23 10:35:52 ekohl Exp $ +/* $Id: logon.c,v 1.4 2004/02/25 14:25:10 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -124,26 +124,6 @@ CreateProcessAsUserW (HANDLE hToken, } -/* - * @unimplemented - */ -BOOL STDCALL -CreateProcessWithLogonW (LPCWSTR lpUsername, - LPCWSTR lpDomain, - LPCWSTR lpPassword, - DWORD dwLogonFlags, - LPCWSTR lpApplicationName, - LPWSTR lpCommandLine, - DWORD dwCreationFlags, - LPVOID lpEnvironment, - LPCWSTR lpCurrentDirectory, - LPSTARTUPINFOW lpStartupInfo, - LPPROCESS_INFORMATION lpProcessInformation) -{ - return FALSE; -} - - /* * @unimplemented */ @@ -393,42 +373,4 @@ LogonUserW (LPCWSTR lpszUsername, return TRUE; } - -/* - * @unimplemented - */ -BOOL STDCALL -LogonUserExA (LPCSTR lpszUsername, - LPCSTR lpszDomain, - LPCSTR lpszPassword, - DWORD dwLogonType, - DWORD dwLogonProvider, - PHANDLE phToken, - PSID *ppLogonSid, - PVOID *ppProfileBuffer, - LPDWORD pdwProfileLength, - PQUOTA_LIMITS pQuotaLimits) -{ - return FALSE; -} - - -/* - * @unimplemented - */ -BOOL STDCALL -LogonUserExW (LPCWSTR lpszUsername, - LPCWSTR lpszDomain, - LPCWSTR lpszPassword, - DWORD dwLogonType, - DWORD dwLogonProvider, - PHANDLE phToken, - PSID *ppLogonSid, - PVOID *ppProfileBuffer, - LPDWORD pdwProfileLength, - PQUOTA_LIMITS pQuotaLimits) -{ - return FALSE; -} - /* EOF */ diff --git a/reactos/lib/advapi32/misc/stubs.c b/reactos/lib/advapi32/misc/stubs.c deleted file mode 100644 index ec9c467ed3a..00000000000 --- a/reactos/lib/advapi32/misc/stubs.c +++ /dev/null @@ -1,1399 +0,0 @@ -/* - * Some of these functions may be wrong - */ - -#define NTOS_MODE_USER -#include <ntos.h> -#include <windows.h> -#include <string.h> - -/* - * @unimplemented - */ -BOOL -STDCALL -DeregisterEventSource ( - HANDLE hEventLog - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -HANDLE -STDCALL -RegisterEventSourceA ( - LPCSTR lpUNCServerName, - LPCSTR lpSourceName - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -HANDLE -STDCALL -RegisterEventSourceW ( - LPCWSTR lpUNCServerName, - LPCWSTR lpSourceName - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -ReportEventA ( - HANDLE hEventLog, - WORD wType, - WORD wCategory, - DWORD dwEventID, - PSID lpUserSid, - WORD wNumStrings, - DWORD dwDataSize, - LPCSTR *lpStrings, - LPVOID lpRawData - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -ReportEventW ( - HANDLE hEventLog, - WORD wType, - WORD wCategory, - DWORD dwEventID, - PSID lpUserSid, - WORD wNumStrings, - DWORD dwDataSize, - LPCWSTR *lpStrings, - LPVOID lpRawData - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -SetFileSecurityW ( - LPCWSTR lpFileName, - SECURITY_INFORMATION SecurityInformation, - PSECURITY_DESCRIPTOR pSecurityDescriptor - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -ChangeServiceConfig2A( - SC_HANDLE hService, - DWORD dwInfoLevel, - LPVOID lpInfo - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -QueryServiceConfig2A( - SC_HANDLE hService, - DWORD dwInfoLevel, - LPBYTE lpBuffer, - DWORD cbBufSize, - LPDWORD pcbBytesNeeded - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -SERVICE_STATUS_HANDLE -STDCALL -RegisterServiceCtrlHandlerExA( - LPCSTR lpServiceName, - LPHANDLER_FUNCTION_EX lpHandlerProc, - LPVOID lpContext - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -ChangeServiceConfig2W( - SC_HANDLE hService, - DWORD dwInfoLevel, - LPVOID lpInfo - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -QueryServiceConfig2W( - SC_HANDLE hService, - DWORD dwInfoLevel, - LPBYTE lpBuffer, - DWORD cbBufSize, - LPDWORD pcbBytesNeeded - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -SERVICE_STATUS_HANDLE -STDCALL -RegisterServiceCtrlHandlerExW( - LPCWSTR lpServiceName, - LPHANDLER_FUNCTION_EX lpHandlerProc, - LPVOID lpContext - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -AddAccessAllowedAceEx ( - PACL pAcl, - DWORD dwAceRevision, - DWORD AceFlags, - DWORD AccessMask, - PSID pSid - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -AddAccessAllowedObjectAce ( - PACL pAcl, - DWORD dwAceRevision, - DWORD AceFlags, - DWORD AccessMask, - GUID *ObjectTypeGuid, - GUID *InheritedObjectTypeGuid, - PSID pSid - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -AddAccessDeniedAceEx ( - PACL pAcl, - DWORD dwAceRevision, - DWORD AceFlags, - DWORD AccessMask, - PSID pSid - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -AddAccessDeniedObjectAce ( - PACL pAcl, - DWORD dwAceRevision, - DWORD AceFlags, - DWORD AccessMask, - GUID *ObjectTypeGuid, - GUID *InheritedObjectTypeGuid, - PSID pSid - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -AddAuditAccessAceEx( - PACL pAcl, - DWORD dwAceRevision, - DWORD AceFlags, - DWORD dwAccessMask, - PSID pSid, - BOOL bAuditSuccess, - BOOL bAuditFailure - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -AddAuditAccessObjectAce ( - PACL pAcl, - DWORD dwAceRevision, - DWORD AceFlags, - DWORD AccessMask, - GUID *ObjectTypeGuid, - GUID *InheritedObjectTypeGuid, - PSID pSid, - BOOL bAuditSuccess, - BOOL bAuditFailure - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -APIENTRY -CheckTokenMembership( - HANDLE TokenHandle, - PSID SidToCheck, - PBOOL IsMember - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -VOID -STDCALL -CloseEncryptedFileRaw( - PVOID pvContext - ) -{ -} - -/* - * @unimplemented - */ -BOOL -STDCALL -CloseEventLog ( - HANDLE hEventLog - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -ConvertToAutoInheritPrivateObjectSecurity( - PSECURITY_DESCRIPTOR ParentDescriptor, - PSECURITY_DESCRIPTOR CurrentSecurityDescriptor, - PSECURITY_DESCRIPTOR *NewSecurityDescriptor, - GUID *ObjectType, - BOOL IsDirectoryObject, - PGENERIC_MAPPING GenericMapping - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -CreatePrivateObjectSecurity ( - PSECURITY_DESCRIPTOR ParentDescriptor, - PSECURITY_DESCRIPTOR CreatorDescriptor, - PSECURITY_DESCRIPTOR * NewDescriptor, - BOOL IsDirectoryObject, - HANDLE Token, - PGENERIC_MAPPING GenericMapping - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -CreatePrivateObjectSecurityEx ( - PSECURITY_DESCRIPTOR ParentDescriptor, - PSECURITY_DESCRIPTOR CreatorDescriptor, - PSECURITY_DESCRIPTOR * NewDescriptor, - GUID *ObjectType, - BOOL IsContainerObject, - ULONG AutoInheritFlags, - HANDLE Token, - PGENERIC_MAPPING GenericMapping - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -CreatePrivateObjectSecurityWithMultipleInheritance ( - PSECURITY_DESCRIPTOR ParentDescriptor, - PSECURITY_DESCRIPTOR CreatorDescriptor, - PSECURITY_DESCRIPTOR * NewDescriptor, - GUID **ObjectTypes, - ULONG GuidCount, - BOOL IsContainerObject, - ULONG AutoInheritFlags, - HANDLE Token, - PGENERIC_MAPPING GenericMapping - ) -{ - return(FALSE); -} - - -/* - * @unimplemented - */ -BOOL -APIENTRY -CreateRestrictedToken( - HANDLE ExistingTokenHandle, - DWORD Flags, - DWORD DisableSidCount, - PSID_AND_ATTRIBUTES SidsToDisable, - DWORD DeletePrivilegeCount, - PLUID_AND_ATTRIBUTES PrivilegesToDelete, - DWORD RestrictedSidCount, - PSID_AND_ATTRIBUTES SidsToRestrict, - PHANDLE NewTokenHandle - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -CreateWellKnownSid( - WELL_KNOWN_SID_TYPE WellKnownSidType, - PSID DomainSid , - PSID pSid, - DWORD *cbSid - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -DestroyPrivateObjectSecurity ( - PSECURITY_DESCRIPTOR * ObjectDescriptor - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -EqualDomainSid( - PSID pSid1, - PSID pSid2, - BOOL *pfEqual - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -GetEventLogInformation ( - HANDLE hEventLog, - DWORD dwInfoLevel, - LPVOID lpBuffer, - DWORD cbBufSize, - LPDWORD pcbBytesNeeded - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -GetNumberOfEventLogRecords ( - HANDLE hEventLog, - PDWORD NumberOfRecords - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -GetOldestEventLogRecord ( - HANDLE hEventLog, - PDWORD OldestRecord - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -GetPrivateObjectSecurity ( - PSECURITY_DESCRIPTOR ObjectDescriptor, - SECURITY_INFORMATION SecurityInformation, - PSECURITY_DESCRIPTOR ResultantDescriptor, - DWORD DescriptorLength, - PDWORD ReturnLength - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -DWORD -STDCALL -GetSecurityDescriptorRMControl( - PSECURITY_DESCRIPTOR SecurityDescriptor, - PUCHAR RMControl - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -GetWindowsAccountDomainSid( - PSID pSid, - PSID ppDomainSid, - DWORD *cbSid - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -APIENTRY -ImpersonateAnonymousToken( - HANDLE ThreadHandle - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -ImpersonateNamedPipeClient( - HANDLE hNamedPipe - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -IsTextUnicode( - CONST VOID* lpBuffer, - int cb, - LPINT lpi - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -IsTokenRestricted( - HANDLE TokenHandle - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -IsTokenUntrusted( - HANDLE TokenHandle - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -IsWellKnownSid ( - PSID pSid, - WELL_KNOWN_SID_TYPE WellKnownSidType - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -MakeAbsoluteSD2 ( - PSECURITY_DESCRIPTOR pSelfRelativeSecurityDescriptor, - LPDWORD lpdwBufferSize - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -NotifyChangeEventLog( - HANDLE hEventLog, - HANDLE hEvent - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -DWORD -STDCALL -ReadEncryptedFileRaw( - PFE_EXPORT_FUNC pfExportCallback, - PVOID pvCallbackContext, - PVOID pvContext - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -DWORD -STDCALL -WriteEncryptedFileRaw( - PFE_IMPORT_FUNC pfImportCallback, - PVOID pvCallbackContext, - PVOID pvContext - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -SetPrivateObjectSecurity ( - SECURITY_INFORMATION SecurityInformation, - PSECURITY_DESCRIPTOR ModificationDescriptor, - PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor, - PGENERIC_MAPPING GenericMapping, - HANDLE Token - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -SetPrivateObjectSecurityEx ( - SECURITY_INFORMATION SecurityInformation, - PSECURITY_DESCRIPTOR ModificationDescriptor, - PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor, - ULONG AutoInheritFlags, - PGENERIC_MAPPING GenericMapping, - HANDLE Token - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -SetSecurityDescriptorControl ( - PSECURITY_DESCRIPTOR pSecurityDescriptor, - SECURITY_DESCRIPTOR_CONTROL ControlBitsOfInterest, - SECURITY_DESCRIPTOR_CONTROL ControlBitsToSet - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -DWORD -STDCALL -SetSecurityDescriptorRMControl( - PSECURITY_DESCRIPTOR SecurityDescriptor, - PUCHAR RMControl - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -BackupEventLogA ( - HANDLE hEventLog, - LPCSTR lpBackupFileName - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -ClearEventLogA ( - HANDLE hEventLog, - LPCSTR lpBackupFileName - ) -{ - return(FALSE); -} - - -/* - * @unimplemented - */ -BOOL -STDCALL -DecryptFileA( - LPCSTR lpFileName, - DWORD dwReserved - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -EncryptFileA( - LPCSTR lpFileName - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -FileEncryptionStatusA( - LPCSTR lpFileName, - LPDWORD lpStatus - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -GetCurrentHwProfileA ( - LPHW_PROFILE_INFOA lpHwProfileInfo - ) -{ - lpHwProfileInfo->dwDockInfo = 2 /*DOCKINFO_DOCKED*/; - strcpy(lpHwProfileInfo->szHwProfileGuid,"{12340001-1234-1234-1234-1233456789012}"); - strcpy(lpHwProfileInfo->szHwProfileName,"ReactOS Profile"); - return(TRUE); -} - -/* - * @unimplemented - */ -HANDLE -STDCALL -OpenBackupEventLogA ( - LPCSTR lpUNCServerName, - LPCSTR lpFileName - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -DWORD -STDCALL -OpenEncryptedFileRawA( - LPCSTR lpFileName, - ULONG ulFlags, - PVOID * pvContext - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -HANDLE -STDCALL -OpenEventLogA ( - LPCSTR lpUNCServerName, - LPCSTR lpSourceName - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -ReadEventLogA ( - HANDLE hEventLog, - DWORD dwReadFlags, - DWORD dwRecordOffset, - LPVOID lpBuffer, - DWORD nNumberOfBytesToRead, - DWORD *pnBytesRead, - DWORD *pnMinNumberOfBytesNeeded - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -BackupEventLogW ( - HANDLE hEventLog, - LPCWSTR lpBackupFileName - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -ClearEventLogW ( - HANDLE hEventLog, - LPCWSTR lpBackupFileName - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -DecryptFileW( - LPCWSTR lpFileName, - DWORD dwReserved - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -EncryptFileW( - LPCWSTR lpFileName - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -FileEncryptionStatusW( - LPCWSTR lpFileName, - LPDWORD lpStatus - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -GetCurrentHwProfileW ( - LPHW_PROFILE_INFOW lpHwProfileInfo - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -HANDLE -STDCALL -OpenBackupEventLogW ( - LPCWSTR lpUNCServerName, - LPCWSTR lpFileName - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -DWORD -STDCALL -OpenEncryptedFileRawW( - LPCWSTR lpFileName, - ULONG ulFlags, - PVOID * pvContext - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -HANDLE -STDCALL -OpenEventLogW ( - LPCWSTR lpUNCServerName, - LPCWSTR lpSourceName - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -ReadEventLogW ( - HANDLE hEventLog, - DWORD dwReadFlags, - DWORD dwRecordOffset, - LPVOID lpBuffer, - DWORD nNumberOfBytesToRead, - DWORD *pnBytesRead, - DWORD *pnMinNumberOfBytesNeeded - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -InitiateSystemShutdownExA(LPSTR lpMachineName,LPSTR lpMessage,DWORD dwTimeout,BOOL bForceAppsClosed,BOOL bRebootAfterShutdown,DWORD dwReason) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -InitiateSystemShutdownExW(LPWSTR lpMachineName,LPWSTR lpMessage,DWORD dwTimeout,BOOL bForceAppsClosed,BOOL bRebootAfterShutdown,DWORD dwReason) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -NotifyBootConfigStatus(BOOL BootAcceptable) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -LONG -STDCALL -RegDisablePredefinedCache(VOID) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -LONG -STDCALL -RegOpenCurrentUser(REGSAM samDesired,PHKEY phkResult) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -LONG -STDCALL -RegOpenUserClassesRoot(HANDLE hToken,DWORD dwOptions,REGSAM samDesired,PHKEY phkResult) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -LONG -STDCALL -RegOverridePredefKey (HKEY hKey,HKEY hNewHKey) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -LONG -STDCALL -RegSaveKeyExA (HKEY hKey,LPCSTR lpFile,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD Flags) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -LONG -STDCALL -RegSaveKeyExW (HKEY hKey,LPCWSTR lpFile,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD Flags) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -LONG -STDCALL -Wow64Win32ApiEntry (DWORD dwFuncNumber,DWORD dwFlag,DWORD dwRes) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -AccessCheckByType( -PSECURITY_DESCRIPTOR pSecurityDescriptor, -PSID PrincipalSelfSid, -HANDLE ClientToken, -DWORD DesiredAccess, -POBJECT_TYPE_LIST ObjectTypeList, -DWORD ObjectTypeListLength, -PGENERIC_MAPPING GenericMapping, -PPRIVILEGE_SET PrivilegeSet, -LPDWORD PrivilegeSetLength, -LPDWORD GrantedAccess, -LPBOOL AccessStatus -) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -AccessCheckByTypeResultList( -PSECURITY_DESCRIPTOR pSecurityDescriptor, -PSID PrincipalSelfSid, -HANDLE ClientToken, -DWORD DesiredAccess, -POBJECT_TYPE_LIST ObjectTypeList, -DWORD ObjectTypeListLength, -PGENERIC_MAPPING GenericMapping, -PPRIVILEGE_SET PrivilegeSet, -LPDWORD PrivilegeSetLength, -LPDWORD GrantedAccessList, -LPDWORD AccessStatusList -) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -AccessCheckByTypeAndAuditAlarmA( -LPCSTR SubsystemName, -LPVOID HandleId, -LPCSTR ObjectTypeName, -LPCSTR ObjectName, -PSECURITY_DESCRIPTOR SecurityDescriptor, -PSID PrincipalSelfSid, -DWORD DesiredAccess, -AUDIT_EVENT_TYPE AuditType, -DWORD Flags, -POBJECT_TYPE_LIST ObjectTypeList, -DWORD ObjectTypeListLength, -PGENERIC_MAPPING GenericMapping, -BOOL ObjectCreation, -LPDWORD GrantedAccess, -LPBOOL AccessStatus, -LPBOOL pfGenerateOnClose -) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -AccessCheckByTypeAndAuditAlarmW( -LPCWSTR SubsystemName, -LPVOID HandleId, -LPCWSTR ObjectTypeName, -LPCWSTR ObjectName, -PSECURITY_DESCRIPTOR SecurityDescriptor, -PSID PrincipalSelfSid, -DWORD DesiredAccess, -AUDIT_EVENT_TYPE AuditType, -DWORD Flags, -POBJECT_TYPE_LIST ObjectTypeList, -DWORD ObjectTypeListLength, -PGENERIC_MAPPING GenericMapping, -BOOL ObjectCreation, -LPDWORD GrantedAccess, -LPBOOL AccessStatus, -LPBOOL pfGenerateOnClose -) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -AccessCheckByTypeResultListAndAuditAlarmA( -LPCSTR SubsystemName, -LPVOID HandleId, -LPCSTR ObjectTypeName, -LPCSTR ObjectName, -PSECURITY_DESCRIPTOR SecurityDescriptor, -PSID PrincipalSelfSid, -DWORD DesiredAccess, -AUDIT_EVENT_TYPE AuditType, -DWORD Flags, -POBJECT_TYPE_LIST ObjectTypeList, -DWORD ObjectTypeListLength, -PGENERIC_MAPPING GenericMapping, -BOOL ObjectCreation, -LPDWORD GrantedAccess, -LPDWORD AccessStatusList, -LPBOOL pfGenerateOnClose -) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -AccessCheckByTypeResultListAndAuditAlarmW( -LPCWSTR SubsystemName, -LPVOID HandleId, -LPCWSTR ObjectTypeName, -LPCWSTR ObjectName, -PSECURITY_DESCRIPTOR SecurityDescriptor, -PSID PrincipalSelfSid, -DWORD DesiredAccess, -AUDIT_EVENT_TYPE AuditType, -DWORD Flags, -POBJECT_TYPE_LIST ObjectTypeList, -DWORD ObjectTypeListLength, -PGENERIC_MAPPING GenericMapping, -BOOL ObjectCreation, -LPDWORD GrantedAccess, -LPDWORD AccessStatusList, -LPBOOL pfGenerateOnClose -) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -AccessCheckByTypeResultListAndAuditAlarmByHandleA( -LPCSTR SubsystemName, -LPVOID HandleId, -HANDLE ClientToken, -LPCSTR ObjectTypeName, -LPCSTR ObjectName, -PSECURITY_DESCRIPTOR SecurityDescriptor, -PSID PrincipalSelfSid, -DWORD DesiredAccess, -AUDIT_EVENT_TYPE AuditType, -DWORD Flags, -POBJECT_TYPE_LIST ObjectTypeList, -DWORD ObjectTypeListLength, -PGENERIC_MAPPING GenericMapping, -BOOL ObjectCreation, -LPDWORD GrantedAccess, -LPDWORD AccessStatusList, -LPBOOL pfGenerateOnClose -) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -AccessCheckByTypeResultListAndAuditAlarmByHandleW( -LPCWSTR SubsystemName, -LPVOID HandleId, -HANDLE ClientToken, -LPCWSTR ObjectTypeName, -LPCWSTR ObjectName, -PSECURITY_DESCRIPTOR SecurityDescriptor, -PSID PrincipalSelfSid, -DWORD DesiredAccess, -AUDIT_EVENT_TYPE AuditType, -DWORD Flags, -POBJECT_TYPE_LIST ObjectTypeList, -DWORD ObjectTypeListLength, -PGENERIC_MAPPING GenericMapping, -BOOL ObjectCreation, -LPDWORD GrantedAccess, -LPDWORD AccessStatusList, -LPBOOL pfGenerateOnClose -) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -VOID STDCALL MD4Init(PMD4_CONTEXT Context) -{ -} - -/* - * @unimplemented - */ -VOID STDCALL MD4Update(PMD4_CONTEXT Context, PVOID Buffer, UINT BufferSize) -{ -} - -/* - * @unimplemented - */ -VOID STDCALL MD4Final(PMD4_CONTEXT Context) -{ -} - -/* - * @unimplemented - */ -VOID STDCALL MD5Init(PMD5_CONTEXT Context) -{ -} - -/* - * @unimplemented - */ -VOID STDCALL MD5Update(PMD5_CONTEXT Context, PVOID Buffer, UINT BufferSize) -{ -} - -/* - * @unimplemented - */ -VOID STDCALL MD5Final(PMD5_CONTEXT Context) -{ -} - -/* - * @unimplemented - */ -VOID STDCALL A_SHAInit(PSHA_CONTEXT Context) -{ -} - -/* - * @unimplemented - */ -VOID STDCALL A_SHAUpdate(PSHA_CONTEXT Context, PVOID Buffer, UINT BufferSize) -{ -} - -/* - * @unimplemented - */ -VOID STDCALL A_SHAFinal(PSHA_CONTEXT Context, PVOID Result) -{ -} - -/* - * @unimplemented - */ -BOOL STDCALL SynchronizeWindows31FilesAndWindowsNTRegistry( DWORD x1, DWORD x2, DWORD x3,DWORD x4 ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL STDCALL QueryWindows31FilesMigration( DWORD x1 ) -{ - return(FALSE); -} diff --git a/reactos/lib/advapi32/reg/reg.c b/reactos/lib/advapi32/reg/reg.c index 277c8cca6e0..ac1c5309084 100644 --- a/reactos/lib/advapi32/reg/reg.c +++ b/reactos/lib/advapi32/reg/reg.c @@ -1,4 +1,4 @@ -/* $Id: reg.c,v 1.43 2004/02/22 14:26:07 ekohl Exp $ +/* $Id: reg.c,v 1.44 2004/02/25 14:25:10 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -191,7 +191,6 @@ OpenClassesRootKey (PHANDLE KeyHandle) &Attributes); } -#undef NDEBUG static NTSTATUS OpenLocalMachineKey (PHANDLE KeyHandle) @@ -215,7 +214,6 @@ OpenLocalMachineKey (PHANDLE KeyHandle) return Status; } -#define NDEBUG static NTSTATUS OpenUsersKey (PHANDLE KeyHandle) @@ -1608,7 +1606,6 @@ RegNotifyChangeKeyValue (HKEY hKey, } - /************************************************************************ * RegOpenKeyA * @@ -2535,9 +2532,120 @@ RegReplaceKeyW (HKEY hKey, LPCWSTR lpNewFile, LPCWSTR lpOldFile) { - UNIMPLEMENTED; - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return ERROR_CALL_NOT_IMPLEMENTED; + OBJECT_ATTRIBUTES KeyObjectAttributes; + OBJECT_ATTRIBUTES NewObjectAttributes; + OBJECT_ATTRIBUTES OldObjectAttributes; + UNICODE_STRING SubKeyName; + UNICODE_STRING NewFileName; + UNICODE_STRING OldFileName; + BOOLEAN CloseRealKey; + HANDLE RealKeyHandle; + HANDLE KeyHandle; + LONG ErrorCode; + NTSTATUS Status; + + if (hKey == HKEY_PERFORMANCE_DATA) + { + return ERROR_INVALID_HANDLE; + } + + Status = MapDefaultKey (&KeyHandle, + hKey); + if (!NT_SUCCESS(Status)) + { + ErrorCode = RtlNtStatusToDosError (Status); + SetLastError (ErrorCode); + return ErrorCode; + } + + /* Open the real key */ + if (lpSubKey != NULL && *lpSubKey != (WCHAR)0) + { + RtlInitUnicodeString (&SubKeyName, + (PWSTR)lpSubKey); + InitializeObjectAttributes (&KeyObjectAttributes, + &SubKeyName, + OBJ_CASE_INSENSITIVE, + KeyHandle, + NULL); + Status = NtOpenKey (&RealKeyHandle, + KEY_ALL_ACCESS, + &KeyObjectAttributes); + if (!NT_SUCCESS(Status)) + { + ErrorCode = RtlNtStatusToDosError (Status); + SetLastError (ErrorCode); + return ErrorCode; + } + CloseRealKey = TRUE; + } + else + { + RealKeyHandle = KeyHandle; + CloseRealKey = FALSE; + } + + /* Convert new file name */ + if (!RtlDosPathNameToNtPathName_U ((LPWSTR)lpNewFile, + &NewFileName, + NULL, + NULL)) + { + if (CloseRealKey) + { + NtClose (RealKeyHandle); + } + SetLastError (ERROR_INVALID_PARAMETER); + return ERROR_INVALID_PARAMETER; + } + + InitializeObjectAttributes (&NewObjectAttributes, + &NewFileName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + /* Convert old file name */ + if (!RtlDosPathNameToNtPathName_U ((LPWSTR)lpOldFile, + &OldFileName, + NULL, + NULL)) + { + RtlFreeUnicodeString (&NewFileName); + if (CloseRealKey) + { + NtClose (RealKeyHandle); + } + SetLastError (ERROR_INVALID_PARAMETER); + return ERROR_INVALID_PARAMETER; + } + + InitializeObjectAttributes (&OldObjectAttributes, + &OldFileName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + Status = NtReplaceKey (&NewObjectAttributes, + RealKeyHandle, + &OldObjectAttributes); + + RtlFreeUnicodeString (&OldFileName); + RtlFreeUnicodeString (&NewFileName); + + if (CloseRealKey) + { + NtClose (RealKeyHandle); + } + + if (!NT_SUCCESS(Status)) + { + ErrorCode = RtlNtStatusToDosError (Status); + SetLastError (ErrorCode); + return ErrorCode; + } + + return ERROR_SUCCESS; } @@ -2649,9 +2757,9 @@ RegRestoreKeyW (HKEY hKey, * @implemented */ LONG STDCALL -RegSaveKeyA(HKEY hKey, - LPCSTR lpFile, - LPSECURITY_ATTRIBUTES lpSecurityAttributes) +RegSaveKeyA (HKEY hKey, + LPCSTR lpFile, + LPSECURITY_ATTRIBUTES lpSecurityAttributes) { UNICODE_STRING FileName; LONG ErrorCode; @@ -2695,7 +2803,7 @@ RegSaveKeyW (HKEY hKey, return ErrorCode; } - if (!RtlDosPathNameToNtPathName_U ((LPWSTR)lpFile, + if (!RtlDosPathNameToNtPathName_U ((PWSTR)lpFile, &FileName, NULL, NULL)) @@ -2820,7 +2928,7 @@ RegSetValueExA (HKEY hKey, strlen(lpValueName) != 0) { RtlCreateUnicodeStringFromAsciiz (&ValueName, - (LPSTR)lpValueName); + (PSTR)lpValueName); pValueName = (LPWSTR)ValueName.Buffer; } else @@ -2834,7 +2942,7 @@ RegSetValueExA (HKEY hKey, { RtlInitAnsiString (&AnsiString, NULL); - AnsiString.Buffer = (LPSTR)lpData; + AnsiString.Buffer = (PSTR)lpData; AnsiString.Length = cbData; AnsiString.MaximumLength = cbData; RtlAnsiStringToUnicodeString (&Data, @@ -3091,7 +3199,7 @@ RegUnLoadKeyA (HKEY hKey, * @implemented */ LONG STDCALL -RegUnLoadKeyW (HKEY hKey, +RegUnLoadKeyW (HKEY hKey, LPCWSTR lpSubKey) { OBJECT_ATTRIBUTES ObjectAttributes; diff --git a/reactos/lib/advapi32/sec/ac.c b/reactos/lib/advapi32/sec/ac.c index da2ea070f14..ebb83d7c1e9 100644 --- a/reactos/lib/advapi32/sec/ac.c +++ b/reactos/lib/advapi32/sec/ac.c @@ -1,4 +1,4 @@ -/* $Id: ac.c,v 1.8 2004/01/20 01:40:18 ekohl Exp $ +/* $Id: ac.c,v 1.9 2004/02/25 14:25:11 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -41,88 +41,6 @@ GetAclInformation ( } -#if 0 -DWORD -WINAPI -GetAuditedPermissionsFromAclA ( - IN PACL pacl, - IN PTRUSTEE_A pTrustee, - OUT PACCESS_MASK pSuccessfulAuditedRights, - OUT PACCESS_MASK pFailedAuditRights - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - -DWORD -WINAPI -GetAuditedPermissionsFromAclW ( - IN PACL pacl, - IN PTRUSTEE_W pTrustee, - OUT PACCESS_MASK pSuccessfulAuditedRights, - OUT PACCESS_MASK pFailedAuditRights - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - -DWORD -WINAPI -GetEffectiveRightsFromAclA ( - IN PACL pacl, - IN PTRUSTEE_A pTrustee, - OUT PACCESS_MASK pAccessRights - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - -DWORD -WINAPI -GetEffectiveRightsFromAclW ( - IN PACL pacl, - IN PTRUSTEE_W pTrustee, - OUT PACCESS_MASK pAccessRights - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - -DWORD -WINAPI -GetExplicitEntriesFromAclA ( - IN PACL pacl, - OUT PULONG pcCountOfExplicitEntries, - OUT PEXPLICIT_ACCESS_A * pListOfExplicitEntries - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - -DWORD -WINAPI -GetExplicitEntriesFromAclW ( - IN PACL pacl, - OUT PULONG pcCountOfExplicitEntries, - OUT PEXPLICIT_ACCESS_W * pListOfExplicitEntries - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} -#endif - - /* * @implemented */ @@ -190,37 +108,6 @@ SetAclInformation ( } -#if 0 -DWORD -WINAPI -SetEntriesInAclA ( - IN ULONG cCountOfExplicitEntries, - IN PEXPLICIT_ACCESS_A pListOfExplicitEntries, - IN PACL OldAcl, - OUT PACL * NewAcl - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - -DWORD -WINAPI -SetEntriesInAclW ( - IN ULONG cCountOfExplicitEntries, - IN PEXPLICIT_ACCESS_W pListOfExplicitEntries, - IN PACL OldAcl, - OUT PACL * NewAcl - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} -#endif - - - /* --- ACE --- */ /* diff --git a/reactos/lib/advapi32/sec/lsa.c b/reactos/lib/advapi32/sec/lsa.c index 46b94efad38..d0f2b118477 100644 --- a/reactos/lib/advapi32/sec/lsa.c +++ b/reactos/lib/advapi32/sec/lsa.c @@ -1,4 +1,4 @@ -/* $Id: lsa.c,v 1.8 2004/02/14 23:13:58 sedwards Exp $ +/* $Id: lsa.c,v 1.9 2004/02/25 14:25:11 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -28,19 +28,19 @@ * * @unimplemented */ -NTSTATUS -STDCALL -LsaOpenPolicy(PLSA_UNICODE_STRING lsaucs,PLSA_OBJECT_ATTRIBUTES lsaoa,ACCESS_MASK access,PLSA_HANDLE lsah) +NTSTATUS STDCALL +LsaOpenPolicy (PLSA_UNICODE_STRING lsaucs, + PLSA_OBJECT_ATTRIBUTES lsaoa, + ACCESS_MASK access, + PLSA_HANDLE lsah) { - DPRINT1("LsaOpenPolicy - stub\n"); - return STATUS_SUCCESS; + DPRINT1("LsaOpenPolicy - stub\n"); + return STATUS_SUCCESS; } /* * @unimplemented */ -#define SID_REVISION (1) /* Current revision - winnt.h */ - NTSTATUS STDCALL LsaQueryInformationPolicy(LSA_HANDLE lsah,POLICY_INFORMATION_CLASS pic,PVOID* Buffer) @@ -130,18 +130,16 @@ LsaQueryInformationPolicy(LSA_HANDLE lsah,POLICY_INFORMATION_CLASS pic,PVOID* Bu /* * @implemented */ -NTSTATUS -STDCALL -LsaFreeMemory(PVOID pv) +NTSTATUS STDCALL +LsaFreeMemory (PVOID pv) { - return RtlFreeHeap(RtlGetProcessHeap(), 0, pv); + return RtlFreeHeap(RtlGetProcessHeap(), 0, pv); } /* * @unimplemented */ -NTSTATUS -STDCALL +NTSTATUS STDCALL LsaClose(LSA_HANDLE ObjectHandle) { DPRINT1("(%p):LsaClose stub\n",ObjectHandle); diff --git a/reactos/lib/advapi32/sec/misc.c b/reactos/lib/advapi32/sec/misc.c index 223e05136f4..9ea41e8981d 100644 --- a/reactos/lib/advapi32/sec/misc.c +++ b/reactos/lib/advapi32/sec/misc.c @@ -1,4 +1,9 @@ -/* +/* $Id: misc.c,v 1.9 2004/02/25 14:25:11 ekohl Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * FILE: lib/advapi32/sec/misc.c + * PURPOSE: Miscellaneous security functions */ #define NTOS_MODE_USER @@ -93,13 +98,13 @@ MapGenericMask(PDWORD AccessMask, /* * @unimplemented */ -BOOL -STDCALL +BOOL STDCALL ImpersonateLoggedOnUser(HANDLE hToken) { - return FALSE; + return FALSE; } + /* * @implemented */ diff --git a/reactos/lib/advapi32/sec/sec.c b/reactos/lib/advapi32/sec/sec.c index 74a935d35cc..daffaa352ae 100644 --- a/reactos/lib/advapi32/sec/sec.c +++ b/reactos/lib/advapi32/sec/sec.c @@ -1,20 +1,18 @@ -/* +/* $Id: sec.c,v 1.18 2004/02/25 14:25:11 ekohl Exp $ + * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries * FILE: lib/advapi32/sec/sec.c - * PURPOSE: Registry functions + * PURPOSE: Security descriptor functions * PROGRAMMER: Ariadne ( ariadne@xs4all.nl) - * Steven Edwards ( Steven_Ed4153@yahoo.com ) + * Steven Edwards ( Steven_Ed4153@yahoo.com ) * Andrew Greenwood ( silverblade_uk@hotmail.com ) * UPDATE HISTORY: * Created 01/11/98 - * Added a few new stubs 6/27/03 - * Added stubs for GetSecurityInfo/Ex 8/18/03 */ #define NTOS_MODE_USER #include <windows.h> -// #include <accctrl.h> #include <ntos.h> @@ -399,130 +397,4 @@ SetSecurityDescriptorSacl ( return TRUE; } - -/* - * @unimplemented - */ -BOOL STDCALL -GetUserNameA(LPSTR lpBuffer, LPDWORD nSize) -{ - return(FALSE); -} - - -/* - * @unimplemented - */ -BOOL STDCALL -GetUserNameW(LPWSTR lpBuffer, LPDWORD nSize) -{ - return(FALSE); -} - - -/* - * @unimplemented - */ -BOOL -STDCALL -GetFileSecurityA ( - LPCSTR lpFileName, - SECURITY_INFORMATION RequestedInformation, - PSECURITY_DESCRIPTOR pSecurityDescriptor, - DWORD nLength, - LPDWORD lpnLengthNeeded - ) -{ - return(FALSE); -} - - -/* - * @unimplemented - */ -BOOL -STDCALL -GetFileSecurityW ( - LPCWSTR lpFileName, - SECURITY_INFORMATION RequestedInformation, - PSECURITY_DESCRIPTOR pSecurityDescriptor, - DWORD nLength, - LPDWORD lpnLengthNeeded - ) -{ - return(FALSE); -} - - -/* - * @unimplemented - */ -BOOL -STDCALL -SetFileSecurityA ( - LPCSTR lpFileName, - SECURITY_INFORMATION SecurityInformation, - PSECURITY_DESCRIPTOR pSecurityDescriptor - ) -{ - return(FALSE); -} - - -/* - * @unimplemented - */ -STDCALL DWORD GetSecurityInfo ( - HANDLE handle, - UINT ObjectType, // SE_OBJECT_TYPE - SECURITY_INFORMATION SecurityInfo, - PSID *ppsidOwner, - PSID *ppsidGroup, - PACL *ppDacl, - PACL *ppSacl, - PSECURITY_DESCRIPTOR *ppSecurityDescriptor - ) -{ - return FALSE; -} - - -/* - * @unimplemented - */ -STDCALL DWORD GetSecurityInfoExA( - HANDLE hObject, - UINT ObjectType, // SE_OBJECT_TYPE - SECURITY_INFORMATION SecurityInfo, - LPCSTR lpProvider, - LPCSTR lpProperty, - VOID *ppAccessList, // PACTRL_ACCESS - VOID *ppAuditList, // PACTRL_AUDIT - LPCSTR *lppOwner, - LPCSTR *lppGroup - ) -{ - return FALSE; -} - - -/* - * @unimplemented - */ -STDCALL DWORD GetSecurityInfoExW( - HANDLE hObject, - UINT ObjectType, // SE_OBJECT_TYPE - SECURITY_INFORMATION SecurityInfo, - LPCWSTR lpProvider, - LPCWSTR lpProperty, - VOID *ppAccessList, // PACTRL_ACCESS - VOID *ppAuditList, // PACTRL_AUDIT - LPWSTR *lppOwner, - LPWSTR *lppGroup - ) -{ - return FALSE; -} - - /* EOF */ diff --git a/reactos/lib/advapi32/sec/sid.c b/reactos/lib/advapi32/sec/sid.c index 7193a18f4f6..12353c848c4 100644 --- a/reactos/lib/advapi32/sec/sid.c +++ b/reactos/lib/advapi32/sec/sid.c @@ -1,4 +1,4 @@ -/* $Id: sid.c,v 1.9 2004/01/20 01:40:19 ekohl Exp $ +/* $Id: sid.c,v 1.10 2004/02/25 14:25:11 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -237,68 +237,4 @@ IsValidSid(PSID pSid) return((BOOL)RtlValidSid(pSid)); } - -/* - * @unimplemented - */ -BOOL STDCALL -LookupAccountNameA(LPCSTR lpSystemName, - LPCSTR lpAccountName, - PSID Sid, - LPDWORD cbSid, - LPSTR DomainName, - LPDWORD cbDomainName, - PSID_NAME_USE peUse) -{ - return(FALSE); -} - - -/* - * @unimplemented - */ -BOOL STDCALL -LookupAccountNameW(LPCWSTR lpSystemName, - LPCWSTR lpAccountName, - PSID Sid, - LPDWORD cbSid, - LPWSTR DomainName, - LPDWORD cbDomainName, - PSID_NAME_USE peUse) -{ - return(FALSE); -} - - -/* - * @unimplemented - */ -BOOL STDCALL -LookupAccountSidA(LPCSTR lpSystemName, - PSID Sid, - LPSTR Name, - LPDWORD cbName, - LPSTR ReferencedDomainName, - LPDWORD cbReferencedDomainName, - PSID_NAME_USE peUse) -{ - return(FALSE); -} - - -/* - * @unimplemented - */ -BOOL STDCALL -LookupAccountSidW(LPCWSTR lpSystemName, - PSID Sid, - LPWSTR Name, - LPDWORD cbName, - LPWSTR ReferencedDomainName, - LPDWORD cbReferencedDomainName, - PSID_NAME_USE peUse) -{ - return(FALSE); -} - /* EOF */ diff --git a/reactos/lib/advapi32/token/privilege.c b/reactos/lib/advapi32/token/privilege.c index e8aac245220..f290550c675 100644 --- a/reactos/lib/advapi32/token/privilege.c +++ b/reactos/lib/advapi32/token/privilege.c @@ -1,4 +1,4 @@ -/* $Id: privilege.c,v 1.5 2003/07/20 15:16:32 ekohl Exp $ +/* $Id: privilege.c,v 1.6 2004/02/25 14:25:11 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -14,174 +14,129 @@ /********************************************************************** * LookupPrivilegeValueA EXPORTED - * LookupPrivilegeValueW EXPORTED * * @implemented */ -BOOL STDCALL LookupPrivilegeValueA ( - LPCSTR lpSystemName, - LPCSTR lpName, - PLUID lpLuid - ) +BOOL STDCALL +LookupPrivilegeValueA (LPCSTR lpSystemName, + LPCSTR lpName, + PLUID lpLuid) { - BOOL rv = FALSE; - DWORD le = ERROR_SUCCESS; + UNICODE_STRING SystemName; + UNICODE_STRING Name; + BOOL Result; - ANSI_STRING SystemNameA; - UNICODE_STRING SystemNameW; - ANSI_STRING NameA; - UNICODE_STRING NameW; + /* Remote system? */ + if (lpSystemName != NULL) + { + RtlCreateUnicodeStringFromAsciiz (&SystemName, + (LPSTR)lpSystemName); + } - HANDLE ProcessHeap = GetProcessHeap (); + /* Check the privilege name is not NULL */ + if (lpName == NULL) + { + SetLastError (ERROR_INVALID_PARAMETER); + return FALSE; + } + RtlCreateUnicodeStringFromAsciiz (&Name, + (LPSTR)lpName); - /* Remote system? */ - if (NULL != lpSystemName) - { - RtlInitAnsiString ( - & SystemNameA, - (LPSTR) lpSystemName - ); - RtlAnsiStringToUnicodeString ( - & SystemNameW, - & SystemNameA, - TRUE - ); - } - /* Check the privilege name is not NULL */ - if (NULL != lpName) - { - RtlInitAnsiString ( - & NameA, - (LPSTR) lpName - ); - RtlAnsiStringToUnicodeString ( - & NameW, - & NameA, - TRUE - ); - } - else - { - SetLastError (ERROR_INVALID_PARAMETER); - return (FALSE); - } - /* - * Forward the call to the UNICODE version - * of this API. - */ - if (FALSE == (rv = LookupPrivilegeValueW ( - (lpSystemName ? SystemNameW.Buffer : NULL), - NameW.Buffer, - lpLuid - ) - ) - ) - { - le = GetLastError (); - } - /* Remote system? */ - if (NULL != lpSystemName) - { - RtlFreeHeap ( - ProcessHeap, - 0, - SystemNameW.Buffer - ); - } - /* Name */ - RtlFreeHeap ( - ProcessHeap, - 0, - NameW.Buffer - ); - /* - * Set the last error, if any reported by - * the UNICODE call. - */ - if (ERROR_SUCCESS != le) - { - SetLastError (le); - } - return (rv); + Result = LookupPrivilegeValueW ((lpSystemName != NULL) ? SystemName.Buffer : NULL, + Name.Buffer, + lpLuid); + + RtlFreeUnicodeString (&Name); + + /* Remote system? */ + if (lpSystemName != NULL) + { + RtlFreeUnicodeString (&SystemName); + } + + return Result; } -BOOL STDCALL LookupPrivilegeValueW ( - LPCWSTR lpSystemName, - LPCWSTR lpName, - PLUID lpLuid - ) +/********************************************************************** + * LookupPrivilegeValueW EXPORTED + * + * @unimplemented + */ +BOOL STDCALL +LookupPrivilegeValueW (LPCWSTR lpSystemName, + LPCWSTR lpName, + PLUID lpLuid) { - SetLastError (ERROR_CALL_NOT_IMPLEMENTED); - return (FALSE); + SetLastError (ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; } /********************************************************************** * LookupPrivilegeDisplayNameA EXPORTED + * + * @unimplemented + */ +BOOL STDCALL +LookupPrivilegeDisplayNameA (LPCSTR lpSystemName, + LPCSTR lpName, + LPSTR lpDisplayName, + LPDWORD cbDisplayName, + LPDWORD lpLanguageId) +{ + SetLastError (ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + + +/********************************************************************** * LookupPrivilegeDisplayNameW EXPORTED * * @unimplemented */ -BOOL STDCALL LookupPrivilegeDisplayNameA ( - LPCSTR lpSystemName, - LPCSTR lpName, - LPSTR lpDisplayName, - LPDWORD cbDisplayName, - LPDWORD lpLanguageId - ) +BOOL STDCALL +LookupPrivilegeDisplayNameW (LPCWSTR lpSystemName, + LPCWSTR lpName, + LPWSTR lpDisplayName, + LPDWORD cbDisplayName, + LPDWORD lpLanguageId) { - SetLastError (ERROR_CALL_NOT_IMPLEMENTED); - return (FALSE); -} - - -/* - * @unimplemented - */ -BOOL STDCALL LookupPrivilegeDisplayNameW ( - LPCWSTR lpSystemName, - LPCWSTR lpName, - LPWSTR lpDisplayName, - LPDWORD cbDisplayName, - LPDWORD lpLanguageId - ) -{ - SetLastError (ERROR_CALL_NOT_IMPLEMENTED); - return (FALSE); + SetLastError (ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; } /********************************************************************** * LookupPrivilegeNameA EXPORTED + * + * @unimplemented + */ +BOOL STDCALL +LookupPrivilegeNameA (LPCSTR lpSystemName, + PLUID lpLuid, + LPSTR lpName, + LPDWORD cbName) +{ + SetLastError (ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + + +/********************************************************************** * LookupPrivilegeNameW EXPORTED * * @unimplemented */ -BOOL STDCALL LookupPrivilegeNameA ( - LPCSTR lpSystemName, - PLUID lpLuid, - LPSTR lpName, - LPDWORD cbName - ) +BOOL STDCALL +LookupPrivilegeNameW (LPCWSTR lpSystemName, + PLUID lpLuid, + LPWSTR lpName, + LPDWORD cbName) { - SetLastError (ERROR_CALL_NOT_IMPLEMENTED); - return (FALSE); -} - -/* - * @unimplemented - */ -BOOL STDCALL LookupPrivilegeNameW ( - LPCWSTR lpSystemName, - PLUID lpLuid, - LPWSTR lpName, - LPDWORD cbName - ) -{ - SetLastError (ERROR_CALL_NOT_IMPLEMENTED); - return (FALSE); + SetLastError (ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; } diff --git a/reactos/lib/advapi32/token/token.c b/reactos/lib/advapi32/token/token.c index 316fdbcae07..2127c56d8a1 100644 --- a/reactos/lib/advapi32/token/token.c +++ b/reactos/lib/advapi32/token/token.c @@ -1,4 +1,4 @@ -/* $Id: token.c,v 1.8 2004/01/20 01:40:19 ekohl Exp $ +/* $Id: token.c,v 1.9 2004/02/25 14:25:11 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -17,23 +17,28 @@ * @implemented */ BOOL STDCALL -AdjustTokenGroups ( - HANDLE TokenHandle, +AdjustTokenGroups (HANDLE TokenHandle, BOOL ResetToDefault, PTOKEN_GROUPS NewState, DWORD BufferLength, PTOKEN_GROUPS PreviousState, - PDWORD ReturnLength - ) + PDWORD ReturnLength) { - NTSTATUS errCode; - errCode = NtAdjustGroupsToken(TokenHandle,ResetToDefault,NewState, - BufferLength, PreviousState, (PULONG)ReturnLength ); - if ( !NT_SUCCESS(errCode) ) { - SetLastError(RtlNtStatusToDosError(errCode)); - return FALSE; - } - return TRUE; + NTSTATUS Status; + + Status = NtAdjustGroupsToken (TokenHandle, + ResetToDefault, + NewState, + BufferLength, + PreviousState, + (PULONG)ReturnLength); + if (!NT_SUCCESS (Status)) + { + SetLastError (RtlNtStatusToDosError (Status)); + return FALSE; + } + + return TRUE; } @@ -41,22 +46,28 @@ AdjustTokenGroups ( * @implemented */ BOOL STDCALL -AdjustTokenPrivileges ( - HANDLE TokenHandle, +AdjustTokenPrivileges (HANDLE TokenHandle, BOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength, PTOKEN_PRIVILEGES PreviousState, - PDWORD ReturnLength - ) -{ NTSTATUS errCode; - errCode = NtAdjustPrivilegesToken(TokenHandle,DisableAllPrivileges,NewState, - BufferLength, PreviousState, (PULONG)ReturnLength ); - if ( !NT_SUCCESS(errCode) ) { - SetLastError(RtlNtStatusToDosError(errCode)); - return FALSE; - } - return TRUE; + PDWORD ReturnLength) +{ + NTSTATUS Status; + + Status = NtAdjustPrivilegesToken (TokenHandle, + DisableAllPrivileges, + NewState, + BufferLength, + PreviousState, + (PULONG)ReturnLength); + if (!NT_SUCCESS (Status)) + { + SetLastError (RtlNtStatusToDosError (Status)); + return FALSE; + } + + return TRUE; } @@ -64,22 +75,26 @@ AdjustTokenPrivileges ( * @implemented */ BOOL STDCALL -GetTokenInformation ( - HANDLE TokenHandle, +GetTokenInformation (HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, LPVOID TokenInformation, DWORD TokenInformationLength, - PDWORD ReturnLength - ) + PDWORD ReturnLength) { - NTSTATUS errCode; - errCode = NtQueryInformationToken(TokenHandle,TokenInformationClass,TokenInformation, - TokenInformationLength, (PULONG)ReturnLength); - if ( !NT_SUCCESS(errCode) ) { - SetLastError(RtlNtStatusToDosError(errCode)); - return FALSE; - } - return TRUE; + NTSTATUS Status; + + Status = NtQueryInformationToken (TokenHandle, + TokenInformationClass, + TokenInformation, + TokenInformationLength, + (PULONG)ReturnLength); + if (!NT_SUCCESS (Status)) + { + SetLastError (RtlNtStatusToDosError (Status)); + return FALSE; + } + + return TRUE; } @@ -87,21 +102,24 @@ GetTokenInformation ( * @implemented */ BOOL STDCALL -SetTokenInformation ( - HANDLE TokenHandle, +SetTokenInformation (HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, LPVOID TokenInformation, - DWORD TokenInformationLength - ) + DWORD TokenInformationLength) { - NTSTATUS errCode; - errCode = NtSetInformationToken(TokenHandle,TokenInformationClass,TokenInformation, - TokenInformationLength); - if ( !NT_SUCCESS(errCode) ) { - SetLastError(RtlNtStatusToDosError(errCode)); - return FALSE; - } - return TRUE; + NTSTATUS Status; + + Status = NtSetInformationToken (TokenHandle, + TokenInformationClass, + TokenInformation, + TokenInformationLength); + if (!NT_SUCCESS (Status)) + { + SetLastError (RtlNtStatusToDosError (Status)); + return FALSE; + } + + return TRUE; } From 2d27f8a1402f2c6363832ba81c91a59a943ee119 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Wed, 25 Feb 2004 18:12:52 +0000 Subject: [PATCH 0178/1463] - Made again usable the cursor and F1-12 keys. svn path=/trunk/; revision=8370 --- reactos/subsys/csrss/win32csr/conio.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/csrss/win32csr/conio.c b/reactos/subsys/csrss/win32csr/conio.c index 5c76ba5c138..f560c2c0a01 100644 --- a/reactos/subsys/csrss/win32csr/conio.c +++ b/reactos/subsys/csrss/win32csr/conio.c @@ -1,4 +1,4 @@ -/* $Id: conio.c,v 1.4 2004/02/19 06:59:50 arty Exp $ +/* $Id: conio.c,v 1.5 2004/02/25 18:12:52 hbirr Exp $ * * reactos/subsys/csrss/win32csr/conio.c * @@ -1140,7 +1140,7 @@ ConioGetShiftState(PBYTE KeyState) } } - if (KeyState[VK_LSHIFT] || KeyState[VK_RSHIFT] & 0x80) + if (KeyState[VK_LSHIFT] & 0x80 || KeyState[VK_RSHIFT] & 0x80) ssOut |= SHIFT_PRESSED; if (KeyState[VK_LCONTROL] & 0x80) @@ -1259,7 +1259,7 @@ ConioProcessKey(MSG *msg, PCSRSS_CONSOLE Console, BOOL TextMode) } ConInRec->InputEvent = er; - ConInRec->Fake = + ConInRec->Fake = AsciiChar && (msg->message != WM_CHAR && msg->message != WM_SYSCHAR && msg->message != WM_KEYUP && msg->message != WM_SYSKEYUP); ConInRec->NotChar = (msg->message != WM_CHAR && msg->message != WM_SYSCHAR); From fcf0872f58810edae8e169bb3372c5aae952ef96 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Wed, 25 Feb 2004 18:58:26 +0000 Subject: [PATCH 0179/1463] fixed bug #224 svn path=/trunk/; revision=8371 --- reactos/subsys/system/explorer/doxy-footer.html | 2 +- reactos/subsys/system/explorer/explorer_intres.rc | 12 ++++++++++++ reactos/subsys/system/explorer/shell/mainframe.cpp | 13 ++++++------- reactos/subsys/system/explorer/utility/window.h | 1 - 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/reactos/subsys/system/explorer/doxy-footer.html b/reactos/subsys/system/explorer/doxy-footer.html index 3c9901bd1b9..551400d4800 100644 --- a/reactos/subsys/system/explorer/doxy-footer.html +++ b/reactos/subsys/system/explorer/doxy-footer.html @@ -3,7 +3,7 @@ <tr> <td><address style="align: right;"><small> ROS Explorer Source Code Documentation -<br>generated on 23.02.2004 by <a href="http://www.doxygen.org/index.html"> +<br>generated on 24.02.2004 by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border=0> </small></address> </td> diff --git a/reactos/subsys/system/explorer/explorer_intres.rc b/reactos/subsys/system/explorer/explorer_intres.rc index 60ba1e3ca48..e307e513c07 100644 --- a/reactos/subsys/system/explorer/explorer_intres.rc +++ b/reactos/subsys/system/explorer/explorer_intres.rc @@ -35,7 +35,10 @@ BEGIN POPUP "&Prezentare" BEGIN MENUITEM "&Bara cu instrumente", ID_VIEW_TOOL_BAR + MENUITEM "&Drivebar", ID_VIEW_DRIVE_BAR, CHECKED MENUITEM "&Bara de stare", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN END POPUP "&Fereastr" BEGIN @@ -308,7 +311,10 @@ BEGIN POPUP "&Ansicht" BEGIN MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR + MENUITEM "Lauf&werkleiste", ID_VIEW_DRIVE_BAR, CHECKED MENUITEM "&Status Bar", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Vollbild\tCtrl+Shift+S", ID_VIEW_FULLSCREEN END POPUP "&Fenster" BEGIN @@ -534,7 +540,10 @@ BEGIN POPUP "&View" BEGIN MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR + MENUITEM "&Drivebar", ID_VIEW_DRIVE_BAR, CHECKED MENUITEM "&Status Bar", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN END POPUP "&Window" BEGIN @@ -879,7 +888,10 @@ BEGIN POPUP "&Affichage" BEGIN MENUITEM "Barre d'&outils", ID_VIEW_TOOL_BAR + MENUITEM "&Drivebar", ID_VIEW_DRIVE_BAR, CHECKED MENUITEM "Barre d'&閠at", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN END POPUP "&Window" BEGIN diff --git a/reactos/subsys/system/explorer/shell/mainframe.cpp b/reactos/subsys/system/explorer/shell/mainframe.cpp index 86f404984ac..36278bc2e6f 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.cpp +++ b/reactos/subsys/system/explorer/shell/mainframe.cpp @@ -46,8 +46,7 @@ MainFrame::MainFrame(HWND hwnd) _hMenuFrame = GetMenu(hwnd); _hMenuWindow = GetSubMenu(_hMenuFrame, GetMenuItemCount(_hMenuFrame)-2); - _menu_info._hMenuView = GetSubMenu(_hMenuFrame, 3); - _menu_info._hMenuOptions = GetSubMenu(_hMenuFrame, 4); + _menu_info._hMenuView = GetSubMenu(_hMenuFrame, 1); _hAccel = LoadAccelerators(g_Globals._hInstance, MAKEINTRESOURCE(IDA_EXPLORER)); @@ -87,7 +86,7 @@ MainFrame::MainFrame(HWND hwnd) IDW_TOOLBAR, 2, g_Globals._hInstance, IDB_TOOLBAR, toolbarBtns, sizeof(toolbarBtns)/sizeof(TBBUTTON), 16, 15, 16, 15, sizeof(TBBUTTON)); - CheckMenuItem(_menu_info._hMenuOptions, ID_VIEW_TOOL_BAR, MF_BYCOMMAND|MF_CHECKED); + CheckMenuItem(_menu_info._hMenuView, ID_VIEW_TOOL_BAR, MF_BYCOMMAND|MF_CHECKED); TBBUTTON drivebarBtn = {0, 0, TBSTATE_ENABLED, BTNS_SEP, {0, 0}, 0, 0}; @@ -97,7 +96,7 @@ MainFrame::MainFrame(HWND hwnd) _hdrivebar = CreateToolbarEx(hwnd, WS_CHILD|WS_VISIBLE|CCS_NOMOVEY|TBSTYLE_LIST, IDW_DRIVEBAR, 2, g_Globals._hInstance, IDB_DRIVEBAR, &drivebarBtn, 1, 16, 13, 16, 13, sizeof(TBBUTTON)); - CheckMenuItem(_menu_info._hMenuOptions, ID_VIEW_DRIVE_BAR, MF_BYCOMMAND|MF_CHECKED); + CheckMenuItem(_menu_info._hMenuView, ID_VIEW_DRIVE_BAR, MF_BYCOMMAND|MF_CHECKED); GetLogicalDriveStrings(BUFFER_LEN, _drives); @@ -208,7 +207,7 @@ MainFrame::MainFrame(HWND hwnd) hwnd, (HMENU)IDW_STATUSBAR, g_Globals._hInstance, 0);*/ _hstatusbar = CreateStatusWindow(WS_CHILD|WS_VISIBLE, 0, hwnd, IDW_STATUSBAR); - CheckMenuItem(_menu_info._hMenuOptions, ID_VIEW_STATUSBAR, MF_BYCOMMAND|MF_CHECKED); + CheckMenuItem(_menu_info._hMenuView, ID_VIEW_STATUSBAR, MF_BYCOMMAND|MF_CHECKED); } @@ -545,7 +544,7 @@ int MainFrame::Command(int id, int code) break; case ID_VIEW_FULLSCREEN: - CheckMenuItem(_menu_info._hMenuOptions, id, toggle_fullscreen()?MF_CHECKED:0); + CheckMenuItem(_menu_info._hMenuView, id, toggle_fullscreen()?MF_CHECKED:0); break; #ifdef __WINE__ @@ -813,7 +812,7 @@ void MainFrame::toggle_child(HWND hwnd, UINT cmd, HWND hchild) { BOOL vis = IsWindowVisible(hchild); - CheckMenuItem(_menu_info._hMenuOptions, cmd, vis?MF_BYCOMMAND:MF_BYCOMMAND|MF_CHECKED); + CheckMenuItem(_menu_info._hMenuView, cmd, vis?MF_BYCOMMAND:MF_BYCOMMAND|MF_CHECKED); ShowWindow(hchild, vis?SW_HIDE:SW_SHOW); diff --git a/reactos/subsys/system/explorer/utility/window.h b/reactos/subsys/system/explorer/utility/window.h index c5493be0513..cad07b198b7 100644 --- a/reactos/subsys/system/explorer/utility/window.h +++ b/reactos/subsys/system/explorer/utility/window.h @@ -269,7 +269,6 @@ struct IconWindowClass : public WindowClass struct MenuInfo { HMENU _hMenuView; - HMENU _hMenuOptions; }; #define PM_FRM_GET_MENUINFO (WM_APP+0x02) From 8932a19cd6ff687fd5b3b8aa9ddd6031918537fe Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Wed, 25 Feb 2004 19:29:12 +0000 Subject: [PATCH 0180/1463] set background brush for the short moment of displaying the background color while moving foreground windows svn path=/trunk/; revision=8373 --- reactos/subsys/system/explorer/desktop/desktop.cpp | 10 +++++++++- reactos/subsys/system/explorer/desktop/desktop.h | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/system/explorer/desktop/desktop.cpp b/reactos/subsys/system/explorer/desktop/desktop.cpp index f72af94dd5e..3b37236fae8 100644 --- a/reactos/subsys/system/explorer/desktop/desktop.cpp +++ b/reactos/subsys/system/explorer/desktop/desktop.cpp @@ -246,7 +246,15 @@ static void draw_desktop_background(HWND hwnd, HDC hdc) } -LRESULT BackgroundWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +BackgroundWindow::BackgroundWindow(HWND hwnd) + : super(hwnd) +{ + // set background brush for the short moment of displaying the + // background color while moving foreground windows + SetClassLong(hwnd, GCL_HBRBACKGROUND, COLOR_BACKGROUND+1); +} + +LRESULT BackgroundWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) { switch(nmsg) { case WM_ERASEBKGND: diff --git a/reactos/subsys/system/explorer/desktop/desktop.h b/reactos/subsys/system/explorer/desktop/desktop.h index a4b399c396c..d857836372f 100644 --- a/reactos/subsys/system/explorer/desktop/desktop.h +++ b/reactos/subsys/system/explorer/desktop/desktop.h @@ -35,7 +35,7 @@ struct BackgroundWindow : public SubclassedWindow { typedef SubclassedWindow super; - BackgroundWindow(HWND hwnd) : super(hwnd) {} + BackgroundWindow(HWND hwnd); protected: LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); From 9744443ac8bf970ddc8d561a05198f078b1ca3fd Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Wed, 25 Feb 2004 19:34:33 +0000 Subject: [PATCH 0181/1463] Remove ALL stubs which might be of questionable origin. svn path=/trunk/; revision=8375 --- reactos/lib/ntdll/def/ntdll.def | 435 +---- reactos/lib/ntdll/def/ntdll.edf | 437 +---- reactos/lib/ntdll/makefile | 5 +- reactos/lib/ntdll/stubs/.cvsignore | 3 - reactos/lib/ntdll/stubs/stubs.c | 2672 ---------------------------- 5 files changed, 68 insertions(+), 3484 deletions(-) delete mode 100644 reactos/lib/ntdll/stubs/.cvsignore delete mode 100644 reactos/lib/ntdll/stubs/stubs.c diff --git a/reactos/lib/ntdll/def/ntdll.def b/reactos/lib/ntdll/def/ntdll.def index 5906dcf43b9..05025fa015a 100644 --- a/reactos/lib/ntdll/def/ntdll.def +++ b/reactos/lib/ntdll/def/ntdll.def @@ -1,4 +1,4 @@ -; $Id: ntdll.def,v 1.116 2004/02/03 14:38:23 ekohl Exp $ +; $Id: ntdll.def,v 1.117 2004/02/25 19:34:32 ekohl Exp $ ; ; ReactOS Operating System ; @@ -17,6 +17,7 @@ CsrClientCallServer@16 CsrClientConnectToServer@0 CsrFreeCaptureBuffer@4 CsrIdentifyAlertableThread@0 +CsrIsCsrss@0 CsrNewThread@0 CsrProbeForRead@12 CsrProbeForWrite@12 @@ -32,6 +33,10 @@ DbgUiIssueRemoteBreakin@4 DbgUiRemoteBreakin@0 DbgUiWaitStateChange@8 DbgUserBreakPoint@0 +InterlockedIncrement@4 +InterlockedDecrement@4 +InterlockedExchange@8 +InterlockedCompareExchange@12 KiRaiseUserExceptionDispatcher KiUserApcDispatcher KiUserCallbackDispatcher @@ -346,10 +351,10 @@ RtlCreateEnvironment@8 RtlCreateHeap@24 RtlCreateProcessParameters@40 ;RtlCreatePropertySet -RtlCreateQueryDebugBuffer@8 +;RtlCreateQueryDebugBuffer RtlCreateRegistryKey@8 RtlCreateSecurityDescriptor@8 -RtlCreateTagHeap@16 +;RtlCreateTagHeap RtlCreateUnicodeString@8 RtlCreateUnicodeStringFromAsciiz@8 RtlCreateUserProcess@40 @@ -360,23 +365,23 @@ RtlCustomCPToUnicodeN@24 RtlDeNormalizeProcessParams@4 RtlDecompressBuffer@24 RtlDecompressFragment@32 -RtlDelete@4 +;RtlDelete RtlDeleteAce@8 RtlDeleteAtomFromAtomTable@8 RtlDeleteCriticalSection@4 -RtlDeleteElementGenericTable@8 -RtlDeleteNoSplay@8 +;RtlDeleteElementGenericTable +;RtlDeleteNoSplay RtlDeleteOwnersRanges@8 RtlDeleteRange@24 RtlDeleteRegistryValue@12 RtlDeleteResource@4 -RtlDeleteSecurityObject@4 +;RtlDeleteSecurityObject RtlDestroyAtomTable@4 RtlDestroyEnvironment@4 RtlDestroyHandleTable@4 RtlDestroyHeap@4 RtlDestroyProcessParameters@4 -RtlDestroyQueryDebugBuffer@4 +;RtlDestroyQueryDebugBuffer RtlDetermineDosPathNameType_U@4 RtlDoesFileExists_U@4 RtlDosPathNameToNtPathName_U@16 @@ -390,8 +395,8 @@ RtlEnlargedUnsignedDivide@16 RtlEnlargedUnsignedMultiply@8 RtlEnterCriticalSection@4 RtlEnumProcessHeaps@8 -RtlEnumerateGenericTable@8 -RtlEnumerateGenericTableWithoutSplaying@8 +;RtlEnumerateGenericTable +;RtlEnumerateGenericTableWithoutSplaying ;RtlEnumerateProperties RtlEqualComputerName@8 RtlEqualDomainName@8 @@ -437,12 +442,12 @@ RtlFreeUserThreadStack@8 RtlGUIDFromString@8 RtlGenerate8dot3Name@16 RtlGetAce@12 -RtlGetCallersAddress@4 +;RtlGetCallersAddress RtlGetCompressionWorkSpaceSize@12 RtlGetControlSecurityDescriptor@12 RtlGetCurrentDirectory_U@8 RtlGetDaclSecurityDescriptor@16 -RtlGetElementGenericTable@8 +;RtlGetElementGenericTable RtlGetFirstRange@12 RtlGetFullPathName_U@16 RtlGetGroupSecurityDescriptor@12 @@ -472,13 +477,13 @@ RtlInitializeBitMap@12 RtlInitializeContext@20 RtlInitializeCriticalSection@4 RtlInitializeCriticalSectionAndSpinCount@8 -RtlInitializeGenericTable@20 +;RtlInitializeGenericTable RtlInitializeHandleTable@12 RtlInitializeRangeList@4 RtlInitializeResource@4 ;RtlInitializeRXact RtlInitializeSid@12 -RtlInsertElementGenericTable@16 +;RtlInsertElementGenericTable RtlIntegerToChar@16 RtlIntegerToUnicodeString@12 RtlInvertRangeList@8 @@ -504,7 +509,7 @@ RtlLengthSid@4 RtlLocalTimeToSystemTime@8 RtlLockHeap@4 RtlLookupAtomInAtomTable@12 -RtlLookupElementGenericTable@8 +;RtlLookupElementGenericTable RtlMakeSelfRelativeSD@12 RtlMapGenericMask@8 RtlMergeRangeLists@16 @@ -513,10 +518,10 @@ RtlMultiByteToUnicodeN@20 RtlMultiByteToUnicodeSize@12 ;RtlNewInstanceSecurityObject ;RtlNewSecurityGrantedAccess -RtlNewSecurityObject@24 +;RtlNewSecurityObject RtlNormalizeProcessParams@4 RtlNtStatusToDosError@4 -RtlNumberGenericTableElements@4 +;RtlNumberGenericTableElements RtlNumberOfClearBits@4 RtlNumberOfSetBits@4 RtlOemStringToUnicodeSize@4 @@ -528,12 +533,12 @@ RtlPinAtomInAtomTable@8 RtlPrefixString@12 RtlPrefixUnicodeString@12 ;RtlPropertySetNameToGuid -RtlProtectHeap@8 +;RtlProtectHeap RtlQueryAtomInAtomTable@24 RtlQueryEnvironmentVariable_U@12 RtlQueryInformationAcl@16 ;RtlQueryProcessBackTraceInformation -RtlQueryProcessDebugInformation@12 +;RtlQueryProcessDebugInformation ;RtlQueryProcessHeapInformation ;RtlQueryProcessLockInformation ;RtlQueryProperties @@ -541,14 +546,14 @@ RtlQueryProcessDebugInformation@12 ;RtlQueryPropertySet RtlQueryRegistryValues@20 ;RtlQuerySecutityObject -RtlQueryTagHeap@20 +;RtlQueryTagHeap RtlQueryTimeZoneInformation@4 RtlRaiseException@4 RtlRaiseStatus@4 RtlRandom@4 RtlReAllocateHeap@16 -RtlRealPredecessor@4 -RtlRealSuccessor@4 +;RtlRealPredecessor +;RtlRealSuccessor RtlReleasePebLock@0 RtlReleaseResource@4 ;RtlRemoteCall @@ -578,7 +583,7 @@ RtlSetTimeZoneInformation@4 ;RtlSetUserFlagsHeap ;RtlSetUserValueHeap RtlSizeHeap@12 -RtlSplay@4 +;RtlSplay ;RtlStartRXact RtlStringFromGUID@8 RtlSubAuthorityCountSid@4 @@ -624,7 +629,7 @@ RtlValidSecurityDescriptor@4 RtlValidSid@4 RtlValidateHeap@12 RtlValidateProcessHeaps@0 -RtlWalkHeap@8 +;RtlWalkHeap RtlWriteRegistryValue@24 ;RtlZeroHeap RtlZeroMemory@8 @@ -634,8 +639,8 @@ RtlpNtMakeTemporaryKey@4 RtlpNtOpenKey@16 RtlpNtQueryValueKey@20 RtlpNtSetValueKey@16 -RtlpUnWaitCriticalSection@4 -RtlpWaitForCriticalSection@4 +;RtlpUnWaitCriticalSection +;RtlpWaitForCriticalSection RtlxAnsiStringToUnicodeSize@4 RtlxOemStringToUnicodeSize@4 RtlxUnicodeStringToAnsiSize@4 @@ -980,380 +985,4 @@ wcsstr wcstol wcstombs wcstoul -InterlockedIncrement@4 -InterlockedDecrement@4 -InterlockedExchange@8 -InterlockedCompareExchange@12 -;?Allocate@CBufferAllocator@@UAEPAXK@Z -;CsrCaptureMessageMultiUnicodeStringsInPlace -;CsrGetProcessId -DbgPrintEx -DbgPrintReturnControlC -DbgQueryDebugFilterState@8 -DbgSetDebugFilterState@12 -;DbgUiConvertStateChangeStructure -DbgUiDebugActiveProcess@4 -;DbgUiGetThreadDebugObject -;DbgUiSetThreadDebugObject -DbgUiStopDebugging@4 -;LdrAccessOutOfProcessResource -;LdrAddRefDll -LdrAlternateResourcesEnabled@0 -;LdrCreateOutOfProcessImage -;LdrDestroyOutOfProcessImage -;LdrEnumerateLoadedModules -;LdrFindCreateProcessManifest -;LdrFindResourceEx_U -LdrFlushAlternateResourceModules@0 -;LdrGetDllHandleEx -;LdrInitShimEngineDynamic -;LdrLoadAlternateResourceModule -LdrLockLoaderLock@12 -;LdrSetAppCompatDllRedirectionCallback -;LdrSetDllManifestProber -;LdrUnloadAlternateResourceModule -LdrUnlockLoaderLock@8 -;NPXEMULATORTABLE -NtAccessCheckByType@44 -NtAccessCheckByTypeAndAuditAlarm@64 -NtAccessCheckByTypeResultList@44 -NtAccessCheckByTypeResultListAndAuditAlarm@64 -NtAccessCheckByTypeResultListAndAuditAlarmByHandle@68 -;NtAddBootEntry -NtAllocateUserPhysicalPages@12 -NtAreMappedFilesTheSame@8 -;NtAssignProcessToJobObject -NtCancelDeviceWakeupRequest@4 -NtCompactKeys@8 -;NtCompareTokens -NtCompressKey@4 -;NtCreateDebugObject -NtCreateJobObject@12 -NtCreateJobSet@12 -NtCreateKeyedEvent@16 -;NtCreateProcessEx -;NtDebugActiveProcess -;NtDebugContinue -;NtDeleteBootEntry -;NtEnumerateBootEntries -;NtEnumerateSystemEnvironmentValuesEx -NtFilterToken@24 -NtFreeUserPhysicalPages@12 -NtGetDevicePowerState@8 -NtGetWriteWatch@28 -NtImpersonateAnonymousToken@4 -NtInitiatePowerAction@16 -NtIsProcessInJob@8 -NtIsSystemResumeAutomatic@0 -NtLockProductActivationKeys@8 -NtLockRegistryKey@4 -NtMakePermanentObject@4 -NtMapUserPhysicalPages@12 -NtMapUserPhysicalPagesScatter@12 -;NtModifyBootEntry -NtNotifyChangeMultipleKeys@48 -NtOpenJobObject@12 -NtOpenKeyedEvent@12 -NtOpenProcessTokenEx@16 -NtOpenThreadTokenEx@20 -NtPowerInformation@20 -;NtQueryBootEntryOrder -;NtQueryBootOptions -;NtQueryDebugFilterState -NtQueryDefaultUILanguage@4 -NtQueryInformationJobObject@20 -NtQueryInstallUILanguage@4 -NtQueryOpenSubKeys@8 -NtQueryPortInformationProcess@0 -;NtQuerySystemEnvironmentValueEx -NtReleaseKeyedEvent@16 -;NtRemoveProcessDebug -NtRenameKey@8 -NtReplyWaitReceivePortEx@20 -NtRequestDeviceWakeup@4 -NtRequestWakeupLatency@4 -NtResetWriteWatch@12 -NtResumeProcess@4 -NtSaveKeyEx@12 -NtSaveMergedKeys@12 -NtSecureConnectPort@36 -;NtSetBootEntryOrder -;NtSetBootOptions -;NtSetDebugFilterState -NtSetDefaultUILanguage@4 -;NtSetEventBoostPriority -NtSetHighWaitLowThread@0 -;NtSetInformationDebugObject -NtSetInformationJobObject@16 -NtSetLowWaitHighThread@0 -NtSetQuotaInformationFile@16 -;NtSetSystemEnvironmentValueEx -NtSetThreadExecutionState@8 -NtSetUuidSeed@4 -NtSuspendProcess@4 -NtTerminateJobObject@8 -;NtTraceEvent -;NtTranslateFilePath -NtUnloadKeyEx@8 -;NtWaitForDebugEvent -NtWaitForKeyedEvent@16 -;RtlActivateActivationContext -;RtlActivateActivationContextEx -;RtlActivateActivationContextUnsafeFast -;RtlAddAccessAllowedObjectAce -;RtlAddAccessDeniedObjectAce -;RtlAddAuditAccessAceEx -;RtlAddAuditAccessObjectAce -RtlAddRefActivationContext@4 -;RtlAddRefMemoryStream -;RtlAddVectoredExceptionHandler -;RtlAddressInSectionTable -;RtlAppendPathElement -;RtlApplicationVerifierStop -;RtlAssert2 -;RtlCancelTimer -RtlCaptureContext@4 -;RtlCaptureStackContext -;RtlCheckForOrphanedCriticalSections -;RtlCheckProcessParameters -;RtlCloneMemoryStream -;RtlCommitMemoryStream -;RtlCompareVariants -;RtlComputeImportTableHash -;RtlComputePrivatizedDllName_U -;RtlConvertPropertyToVariant -;RtlConvertToAutoInheritSecurityObject -;RtlConvertVariantToProperty -;RtlCopyMemoryStreamTo -;RtlCopyOutOfProcessMemoryStreamTo -;RtlCreateActivationContext -;RtlCreateBootStatusDataFile -;RtlCreateSystemVolumeInformationFolder -RtlCreateTimer@28 -RtlCreateTimerQueue@4 -RtlDeactivateActivationContext@8 -;RtlDeactivateActivationContextUnsafeFast -;RtlDebugPrintTimes -;RtlDefaultNpAcl -;RtlDeleteElementGenericTableAvl -RtlDeleteTimer@12 -RtlDeleteTimerQueue@4 -RtlDeleteTimerQueueEx@8 -RtlDeregisterWait@4 -RtlDeregisterWaitEx@8 -RtlDllShutdownInProgress@0 -;RtlDnsHostNameToComputerName -;RtlDosApplyFileIsolationRedirection_Ustr -;RtlDosSearchPath_Ustr -RtlDuplicateUnicodeString@12 -;RtlEnableEarlyCriticalSectionEventCreation -;RtlEnumerateGenericTableAvl -;RtlEnumerateGenericTableLikeADirectory -;RtlEnumerateGenericTableWithoutSplayingAvl -;RtlFinalReleaseOutOfProcessMemoryStream -;RtlFindActivationContextSectionGuid -;RtlFindActivationContextSectionString -RtlFindCharInUnicodeString@16 -;RtlFirstEntrySList -;RtlFlushSecureMemoryCache -;RtlFreeThreadActivationContextStack -RtlGetActiveActivationContext@4 -RtlGetCurrentPeb@0 -;RtlGetElementGenericTableAvl -;RtlGetFrame -RtlGetLastNtStatus@0 -RtlGetLastWin32Error@0 -;RtlGetLengthWithoutLastFullDosOrNtPathElement -;RtlGetLengthWithoutTrailingPathSeperators -RtlGetNativeSystemInformation@16 -;RtlGetSecurityDescriptorRMControl -;RtlGetSetBootStatusData -RtlGetVersion@4 -RtlHashUnicodeString@16 -;RtlInitMemoryStream -;RtlInitOutOfProcessMemoryStream -RtlInitUnicodeStringEx@8 -;RtlInitializeGenericTableAvl -RtlInitializeSListHead@4 -;RtlInsertElementGenericTableAvl -RtlInt64ToUnicodeString@16 -RtlInterlockedFlushSList@4 -RtlInterlockedPopEntrySList@4 -RtlInterlockedPushEntrySList@8 -;RtlInterlockedPushListSList -;RtlIpv4AddressToStringA -;RtlIpv4AddressToStringW -;RtlIpv4StringToAddressA -;RtlIpv4StringToAddressW -;RtlIpv6AddressToStringA -;RtlIpv6AddressToStringW -;RtlIpv6StringToAddressA -;RtlIpv6StringToAddressW -;RtlIsActivationContextActive -;RtlIsGenericTableEmptyAvl -;RtlIsThreadWithinLoaderCallout -;RtlLockBootStatusData -;RtlLockMemoryStreamRegion -RtlLogStackBackTrace@0 -;RtlLookupElementGenericTableAvl -;RtlMapSecurityErrorToNtStatus -;RtlMultiAppendUnicodeStringBuffer -;RtlNewSecurityObjectEx -;RtlNewSecurityObjectWithMultipleInheritance -;RtlNtPathNameToDosPathName -RtlNtStatusToDosErrorNoTeb@4 -;RtlNumberGenericTableElementsAvl -;RtlOnMappedStreamEvent -;RtlPopFrame -;RtlPushFrame -RtlQueryDepthSList@4 -RtlQueryHeapInformation@20 -RtlQueryInformationActivationContext@28 -;RtlQueryInformationActiveActivationContext -;RtlQueryInterfaceMemoryStream -;RtlQueueApcWow64Thread -RtlQueueWorkItem@12 -;RtlRandomEx -;RtlReadMemoryStream -;RtlReadOutOfProcessMemoryStream -;RtlRegisterSecureMemoryCacheCallback -RtlRegisterWait@24 -RtlReleaseActivationContext@4 -;RtlReleaseMemoryStream -;RtlRemoveVectoredExceptionHandler -RtlRestoreLastWin32Error@4 -;RtlRevertMemoryStream -;RtlSeekMemoryStream -;RtlSelfRelativeToAbsoluteSD2 -;RtlSetControlSecurityDescriptor -RtlSetCriticalSectionSpinCount@4 -RtlSetHeapInformation@16 -RtlSetIoCompletionCallback@12 -RtlSetLastWin32Error@4 -RtlSetLastWin32ErrorAndNtStatusFromNtStatus@4 -;RtlSetMemoryStreamSize -;RtlSetProcessIsCritical -;RtlSetSecurityDescriptorRMControl -;RtlSetSecurityObjectEx -;RtlSetThreadIsCritical -;RtlSetThreadPoolStartFunc -;RtlSetTimer -;RtlStatMemoryStream -;RtlTraceDatabaseAdd -;RtlTraceDatabaseCreate -;RtlTraceDatabaseDestroy -;RtlTraceDatabaseEnumerate -;RtlTraceDatabaseFind -;RtlTraceDatabaseLock -;RtlTraceDatabaseUnlock -;RtlTraceDatabaseValidate -;RtlUnhandledExceptionFilter -;RtlUnhandledExceptionFilter2 -;RtlUnlockBootStatusData -;RtlUnlockMemoryStreamRegion -RtlUpdateTimer@16 -RtlValidRelativeSecurityDescriptor@12 -;RtlValidateUnicodeString -RtlVerifyVersionInfo@16 -RtlWalkFrameChain@12 -;RtlWriteMemoryStream -RtlZombifyActivationContext@4 -;RtlpApplyLengthFunction -;RtlpEnsureBufferSize -;RtlpNotOwnerCriticalSection -VerSetConditionMask@16 -ZwAccessCheckByType@44 -ZwAccessCheckByTypeAndAuditAlarm@64 -ZwAccessCheckByTypeResultList@44 -ZwAccessCheckByTypeResultListAndAuditAlarm@64 -ZwAccessCheckByTypeResultListAndAuditAlarmByHandle@68 -;ZwAddBootEntry -ZwAllocateUserPhysicalPages@12 -ZwAreMappedFilesTheSame@8 -ZwAssignProcessToJobObject@8 -ZwCancelDeviceWakeupRequest@4 -ZwCompactKeys@8 -;ZwCompareTokens -ZwCompressKey@4 -;ZwCreateDebugObject -ZwCreateJobObject@12 -ZwCreateJobSet@12 -ZwCreateKeyedEvent@16 -;ZwCreateProcessEx -ZwCreateWaitablePort@20 -;ZwDebugActiveProcess -;ZwDebugContinue -;ZwDeleteBootEntry -;ZwEnumerateBootEntries -;ZwEnumerateSystemEnvironmentValuesEx -ZwFilterToken@24 -ZwFreeUserPhysicalPages@12 -ZwGetDevicePowerState@8 -ZwGetWriteWatch@28 -ZwImpersonateAnonymousToken@4 -ZwInitiatePowerAction@16 -ZwIsProcessInJob@8 -ZwIsSystemResumeAutomatic@0 -ZwLockProductActivationKeys@8 -ZwLockRegistryKey@4 -ZwMakePermanentObject@4 -ZwMapUserPhysicalPages@12 -ZwMapUserPhysicalPagesScatter@12 -;ZwModifyBootEntry -ZwNotifyChangeMultipleKeys@48 -ZwOpenJobObject@12 -ZwOpenKeyedEvent@12 -ZwOpenProcessTokenEx@16 -ZwOpenThreadTokenEx@20 -ZwPowerInformation@20 -;ZwQueryBootEntryOrder -;ZwQueryBootOptions -;ZwQueryDebugFilterState -ZwQueryDefaultUILanguage@4 -ZwQueryInformationJobObject@20 -ZwQueryInstallUILanguage@4 -ZwQueryOpenSubKeys@8 -ZwQueryPortInformationProcess@0 -ZwQueryQuotaInformationFile@36 -;ZwQuerySystemEnvironmentValueEx -ZwReleaseKeyedEvent@16 -;ZwRemoveProcessDebug -ZwRenameKey@8 -ZwReplyWaitReceivePortEx@20 -ZwRequestDeviceWakeup@4 -ZwRequestWakeupLatency@4 -ZwResetWriteWatch@12 -ZwResumeProcess@4 -ZwSaveKeyEx@12 -ZwSaveMergedKeys@12 -ZwSecureConnectPort@36 -;ZwSetBootEntryOrder -;ZwSetBootOptions -;ZwSetDebugFilterState -ZwSetDefaultUILanguage@4 -;ZwSetEventBoostPriority -ZwSetHighWaitLowThread@0 -;ZwSetInformationDebugObject -ZwSetInformationJobObject@16 -ZwSetLowWaitHighThread@0 -ZwSetQuotaInformationFile@16 -;ZwSetSystemEnvironmentValueEx -ZwSetThreadExecutionState@8 -ZwSetUuidSeed@4 -ZwSuspendProcess@4 -ZwTerminateJobObject@8 -;ZwTraceEvent -;ZwTranslateFilePath -ZwUnloadKeyEx@8 -;ZwWaitForDebugEvent -ZwWaitForKeyedEvent@16 -;_CIcos -;_CIlog -_CIpow -;_CIsin -;_CIsqrt -;_alldvrm -;_aulldvrm -vDbgPrintEx -vDbgPrintExWithPrefix -CsrIsCsrss@0 \ No newline at end of file +; EOF diff --git a/reactos/lib/ntdll/def/ntdll.edf b/reactos/lib/ntdll/def/ntdll.edf index 8a458300b3f..54a4885f5cf 100644 --- a/reactos/lib/ntdll/def/ntdll.edf +++ b/reactos/lib/ntdll/def/ntdll.edf @@ -1,4 +1,4 @@ -; $Id: ntdll.edf,v 1.106 2004/02/03 14:38:23 ekohl Exp $ +; $Id: ntdll.edf,v 1.107 2004/02/25 19:34:32 ekohl Exp $ ; ; ReactOS Operating System ; @@ -17,6 +17,7 @@ CsrClientCallServer=CsrClientCallServer@16 CsrClientConnectToServer=CsrClientConnectToServer@0 CsrFreeCaptureBuffer=CsrFreeCaptureBuffer@4 CsrIdentifyAlertableThread=CsrIdentifyAlertableThread@0 +CsrIsCsrss=CsrIsCsrss@0 CsrNewThread=CsrNewThread@0 CsrProbeForRead=CsrProbeForRead@12 CsrProbeForWrite=CsrProbeForWrite@12 @@ -32,6 +33,10 @@ DbgUiIssueRemoteBreakin=DbgUiIssueRemoteBreakin@4 DbgUiRemoteBreakin=DbgUiRemoteBreakin@0 DbgUiWaitStateChange=DbgUiWaitStateChange@8 DbgUserBreakPoint=DbgUserBreakPoint@0 +InterlockedIncrement=InterlockedIncrement@4 +InterlockedDecrement=InterlockedDecrement@4 +InterlockedExchange=InterlockedExchange@8 +InterlockedCompareExchange=InterlockedCompareExchange@12 KiRaiseUserExceptionDispatcher=KiRaiseUserExceptionDispatcher@0 KiUserApcDispatcher=KiUserApcDispatcher@20 KiUserCallbackDispatcher=KiUserCallbackDispatcher@12 @@ -346,10 +351,10 @@ RtlCreateEnvironment=RtlCreateEnvironment@8 RtlCreateHeap=RtlCreateHeap@24 RtlCreateProcessParameters=RtlCreateProcessParameters@40 ;RtlCreatePropertySet -RtlCreateQueryDebugBuffer=RtlCreateQueryDebugBuffer@8 +;RtlCreateQueryDebugBuffer RtlCreateRegistryKey=RtlCreateRegistryKey@8 RtlCreateSecurityDescriptor=RtlCreateSecurityDescriptor@8 -RtlCreateTagHeap=RtlCreateTagHeap@16 +;RtlCreateTagHeap RtlCreateUnicodeString=RtlCreateUnicodeString@8 RtlCreateUnicodeStringFromAsciiz=RtlCreateUnicodeStringFromAsciiz@8 RtlCreateUserProcess=RtlCreateUserProcess@40 @@ -360,23 +365,23 @@ RtlCustomCPToUnicodeN=RtlCustomCPToUnicodeN@24 RtlDeNormalizeProcessParams=RtlDeNormalizeProcessParams@4 RtlDecompressBuffer=RtlDecompressBuffer@24 RtlDecompressFragment=RtlDecompressFragment@32 -RtlDelete=RtlDelete@4 +;RtlDelete RtlDeleteAce=RtlDeleteAce@8 RtlDeleteAtomFromAtomTable=RtlDeleteAtomFromAtomTable@8 RtlDeleteCriticalSection=RtlDeleteCriticalSection@4 -RtlDeleteElementGenericTable=RtlDeleteElementGenericTable@8 -RtlDeleteNoSplay=RtlDeleteNoSplay@8 +;RtlDeleteElementGenericTable +;RtlDeleteNoSplay RtlDeleteOwnersRanges=RtlDeleteOwnersRanges@8 RtlDeleteRange=RtlDeleteRange@24 RtlDeleteRegistryValue=RtlDeleteRegistryValue@12 RtlDeleteResource=RtlDeleteResource@4 -RtlDeleteSecurityObject=RtlDeleteSecurityObject@4 +;RtlDeleteSecurityObject RtlDestroyAtomTable=RtlDestroyAtomTable@4 RtlDestroyEnvironment=RtlDestroyEnvironment@4 RtlDestroyHandleTable=RtlDestroyHandleTable@4 RtlDestroyHeap=RtlDestroyHeap@4 RtlDestroyProcessParameters=RtlDestroyProcessParameters@4 -RtlDestroyQueryDebugBuffer=RtlDestroyQueryDebugBuffer@4 +;RtlDestroyQueryDebugBuffer RtlDetermineDosPathNameType_U=RtlDetermineDosPathNameType_U@4 RtlDoesFileExists_U=RtlDoesFileExists_U@4 RtlDosPathNameToNtPathName_U=RtlDosPathNameToNtPathName_U@16 @@ -390,8 +395,8 @@ RtlEnlargedUnsignedDivide=RtlEnlargedUnsignedDivide@16 RtlEnlargedUnsignedMultiply=RtlEnlargedUnsignedMultiply@8 RtlEnterCriticalSection=RtlEnterCriticalSection@4 RtlEnumProcessHeaps=RtlEnumProcessHeaps@8 -RtlEnumerateGenericTable=RtlEnumerateGenericTable@8 -RtlEnumerateGenericTableWithoutSplaying=RtlEnumerateGenericTableWithoutSplaying@8 +;RtlEnumerateGenericTable +;RtlEnumerateGenericTableWithoutSplaying ;RtlEnumerateProperties RtlEqualComputerName=RtlEqualComputerName@8 RtlEqualDomainName=RtlEqualDomainName@8 @@ -437,12 +442,12 @@ RtlFreeUserThreadStack=RtlFreeUserThreadStack@8 RtlGUIDFromString=RtlGUIDFromString@8 RtlGenerate8dot3Name=RtlGenerate8dot3Name@16 RtlGetAce=RtlGetAce@12 -RtlGetCallersAddress=RtlGetCallersAddress@4 +;RtlGetCallersAddress RtlGetCompressionWorkSpaceSize=RtlGetCompressionWorkSpaceSize@12 RtlGetControlSecurityDescriptor=RtlGetControlSecurityDescriptor@12 RtlGetCurrentDirectory_U=RtlGetCurrentDirectory_U@8 RtlGetDaclSecurityDescriptor=RtlGetDaclSecurityDescriptor@16 -RtlGetElementGenericTable=RtlGetElementGenericTable@8 +;RtlGetElementGenericTable RtlGetFirstRange=RtlGetFirstRange@12 RtlGetFullPathName_U=RtlGetFullPathName_U@16 RtlGetGroupSecurityDescriptor=RtlGetGroupSecurityDescriptor@12 @@ -472,19 +477,19 @@ RtlInitializeBitMap=RtlInitializeBitMap@12 RtlInitializeContext=RtlInitializeContext@20 RtlInitializeCriticalSection=RtlInitializeCriticalSection@4 RtlInitializeCriticalSectionAndSpinCount=RtlInitializeCriticalSectionAndSpinCount@8 -RtlInitializeGenericTable=RtlInitializeGenericTable@20 +;RtlInitializeGenericTable RtlInitializeHandleTable=RtlInitializeHandleTable@12 RtlInitializeRangeList=RtlInitializeRangeList@4 RtlInitializeResource=RtlInitializeResource@4 ;RtlInitializeRXact RtlInitializeSid=RtlInitializeSid@12 -RtlInsertElementGenericTable=RtlInsertElementGenericTable@16 +;RtlInsertElementGenericTable RtlInt64ToUnicodeString=RtlInt64ToUnicodeString@16 RtlIntegerToChar=RtlIntegerToChar@16 RtlIntegerToUnicodeString=RtlIntegerToUnicodeString@12 RtlInvertRangeList=RtlInvertRangeList@8 RtlIsDosDeviceName_U=RtlIsDosDeviceName_U@4 -RtlIsGenericTableEmpty=RtlIsGenericTableEmpty@4 +;RtlIsGenericTableEmpty RtlIsNameLegalDOS8Dot3=RtlIsNameLegalDOS8Dot3@12 RtlIsRangeAvailable=RtlIsRangeAvailable@40 RtlIsTextUnicode=RtlIsTextUnicode@12 @@ -505,7 +510,7 @@ RtlLengthSid=RtlLengthSid@4 RtlLocalTimeToSystemTime=RtlLocalTimeToSystemTime@8 RtlLockHeap=RtlLockHeap@4 RtlLookupAtomInAtomTable=RtlLookupAtomInAtomTable@12 -RtlLookupElementGenericTable=RtlLookupElementGenericTable@8 +;RtlLookupElementGenericTable RtlMakeSelfRelativeSD=RtlMakeSelfRelativeSD@12 RtlMapGenericMask=RtlMapGenericMask@8 RtlMergeRangeLists=RtlMergeRangeLists@16 @@ -514,10 +519,10 @@ RtlMultiByteToUnicodeN=RtlMultiByteToUnicodeN@20 RtlMultiByteToUnicodeSize=RtlMultiByteToUnicodeSize@12 ;RtlNewInstanceSecurityObject ;RtlNewSecurityGrantedAccess -RtlNewSecurityObject=RtlNewSecurityObject@24 +;RtlNewSecurityObject RtlNormalizeProcessParams=RtlNormalizeProcessParams@4 RtlNtStatusToDosError=RtlNtStatusToDosError@4 -RtlNumberGenericTableElements=RtlNumberGenericTableElements@4 +;RtlNumberGenericTableElements RtlNumberOfClearBits=RtlNumberOfClearBits@4 RtlNumberOfSetBits=RtlNumberOfSetBits@4 RtlOemStringToUnicodeSize=RtlOemStringToUnicodeSize@4 @@ -529,12 +534,12 @@ RtlPinAtomInAtomTable=RtlPinAtomInAtomTable@8 RtlPrefixString=RtlPrefixString@12 RtlPrefixUnicodeString=RtlPrefixUnicodeString@12 ;RtlPropertySetNameToGuid -RtlProtectHeap=RtlProtectHeap@8 +;RtlProtectHeap RtlQueryAtomInAtomTable=RtlQueryAtomInAtomTable@24 RtlQueryEnvironmentVariable_U=RtlQueryEnvironmentVariable_U@12 RtlQueryInformationAcl=RtlQueryInformationAcl@16 ;RtlQueryProcessBackTraceInformation -RtlQueryProcessDebugInformation=RtlQueryProcessDebugInformation@12 +;RtlQueryProcessDebugInformation ;RtlQueryProcessHeapInformation ;RtlQueryProcessLockInformation ;RtlQueryProperties @@ -542,14 +547,14 @@ RtlQueryProcessDebugInformation=RtlQueryProcessDebugInformation@12 ;RtlQueryPropertySet RtlQueryRegistryValues=RtlQueryRegistryValues@20 ;RtlQuerySecutityObject -RtlQueryTagHeap=RtlQueryTagHeap@20 +;RtlQueryTagHeap RtlQueryTimeZoneInformation=RtlQueryTimeZoneInformation@4 RtlRaiseException=RtlRaiseException@4 RtlRaiseStatus=RtlRaiseStatus@4 RtlRandom=RtlRandom@4 RtlReAllocateHeap=RtlReAllocateHeap@16 -RtlRealPredecessor=RtlRealPredecessor@4 -RtlRealSuccessor=RtlRealSuccessor@4 +;RtlRealPredecessor +;RtlRealSuccessor RtlReleasePebLock=RtlReleasePebLock@0 RtlReleaseResource=RtlReleaseResource@4 ;RtlRemoteCall @@ -579,7 +584,7 @@ RtlSetTimeZoneInformation=RtlSetTimeZoneInformation@4 ;RtlSetUserFlagsHeap ;RtlSetUserValueHeap RtlSizeHeap=RtlSizeHeap@12 -RtlSplay=RtlSplay@4 +;RtlSplay ;RtlStartRXact RtlStringFromGUID=RtlStringFromGUID@8 RtlSubAuthorityCountSid=RtlSubAuthorityCountSid@4 @@ -625,7 +630,7 @@ RtlValidSecurityDescriptor=RtlValidSecurityDescriptor@4 RtlValidSid=RtlValidSid@4 RtlValidateHeap=RtlValidateHeap@12 RtlValidateProcessHeaps=RtlValidateProcessHeaps@0 -RtlWalkHeap=RtlWalkHeap@8 +;RtlWalkHeap RtlWriteRegistryValue=RtlWriteRegistryValue@24 ;RtlZeroHeap RtlZeroMemory=RtlZeroMemory@8 @@ -635,8 +640,8 @@ RtlpNtMakeTemporaryKey=RtlpNtMakeTemporaryKey@4 RtlpNtOpenKey=RtlpNtOpenKey@16 RtlpNtQueryValueKey=RtlpNtQueryValueKey@20 RtlpNtSetValueKey=RtlpNtSetValueKey@16 -RtlpUnWaitCriticalSection=RtlpUnWaitCriticalSection@4 -RtlpWaitForCriticalSection=RtlpWaitForCriticalSection@4 +;RtlpUnWaitCriticalSection +;RtlpWaitForCriticalSection RtlxAnsiStringToUnicodeSize=RtlxAnsiStringToUnicodeSize@4 RtlxOemStringToUnicodeSize=RtlxOemStringToUnicodeSize@4 RtlxUnicodeStringToAnsiSize=RtlxUnicodeStringToAnsiSize@4 @@ -854,10 +859,6 @@ ZwWriteRequestData=ZwWriteRequestData@24 ZwWriteVirtualMemory=ZwWriteVirtualMemory@20 ZwW32Call=ZwW32Call@20 ZwYieldExecution=ZwYieldExecution@0 -InterlockedIncrement=InterlockedIncrement@4 -InterlockedDecrement=InterlockedDecrement@4 -InterlockedExchange=InterlockedExchange@8 -InterlockedCompareExchange=InterlockedCompareExchange@12 __isascii __iscsym __iscsymf @@ -985,375 +986,5 @@ wcsstr wcstol wcstombs wcstoul -;?Allocate@CBufferAllocator@@UAEPAXK@Z -;CsrCaptureMessageMultiUnicodeStringsInPlace -;CsrGetProcessId -DbgPrintEx -DbgPrintReturnControlC -DbgQueryDebugFilterState=DbgQueryDebugFilterState@8 -DbgSetDebugFilterState=DbgSetDebugFilterState@12 -;DbgUiConvertStateChangeStructure -DbgUiDebugActiveProcess=DbgUiDebugActiveProcess@4 -;DbgUiGetThreadDebugObject -;DbgUiSetThreadDebugObject -DbgUiStopDebugging=DbgUiStopDebugging@4 -;LdrAccessOutOfProcessResource -;LdrAddRefDll -LdrAlternateResourcesEnabled=LdrAlternateResourcesEnabled@0 -;LdrCreateOutOfProcessImage -;LdrDestroyOutOfProcessImage -;LdrEnumerateLoadedModules -;LdrFindCreateProcessManifest -;LdrFindResourceEx_U -LdrFlushAlternateResourceModules=LdrFlushAlternateResourceModules@0 -;LdrGetDllHandleEx -;LdrInitShimEngineDynamic -;LdrLoadAlternateResourceModule -LdrLockLoaderLock=LdrLockLoaderLock@12 -;LdrSetAppCompatDllRedirectionCallback -;LdrSetDllManifestProber -;LdrUnloadAlternateResourceModule -LdrUnlockLoaderLock=LdrUnlockLoaderLock@8 -;NPXEMULATORTABLE -NtAccessCheckByType=NtAccessCheckByType@44 -NtAccessCheckByTypeAndAuditAlarm=NtAccessCheckByTypeAndAuditAlarm@64 -NtAccessCheckByTypeResultList=NtAccessCheckByTypeResultList@44 -NtAccessCheckByTypeResultListAndAuditAlarm=NtAccessCheckByTypeResultListAndAuditAlarm@64 -NtAccessCheckByTypeResultListAndAuditAlarmByHandle=NtAccessCheckByTypeResultListAndAuditAlarmByHandle@68 -;NtAddBootEntry -NtAllocateUserPhysicalPages=NtAllocateUserPhysicalPages@12 -NtAreMappedFilesTheSame=NtAreMappedFilesTheSame@8 -;NtAssignProcessToJobObject -NtCancelDeviceWakeupRequest=NtCancelDeviceWakeupRequest@4 -NtCompactKeys=NtCompactKeys@8 -;NtCompareTokens -NtCompressKey=NtCompressKey@4 -;NtCreateDebugObject -NtCreateJobObject=NtCreateJobObject@12 -NtCreateJobSet=NtCreateJobSet@12 -NtCreateKeyedEvent=NtCreateKeyedEvent@16 -;NtCreateProcessEx -;NtDebugActiveProcess -;NtDebugContinue -;NtDeleteBootEntry -;NtEnumerateBootEntries -;NtEnumerateSystemEnvironmentValuesEx -NtFilterToken=NtFilterToken@24 -NtFreeUserPhysicalPages=NtFreeUserPhysicalPages@12 -NtGetDevicePowerState=NtGetDevicePowerState@8 -NtGetWriteWatch=NtGetWriteWatch@28 -NtImpersonateAnonymousToken=NtImpersonateAnonymousToken@4 -NtInitiatePowerAction=NtInitiatePowerAction@16 -NtIsProcessInJob=NtIsProcessInJob@8 -NtIsSystemResumeAutomatic=NtIsSystemResumeAutomatic@0 -NtLockProductActivationKeys=NtLockProductActivationKeys@8 -NtLockRegistryKey=NtLockRegistryKey@4 -NtMakePermanentObject=NtMakePermanentObject@4 -NtMapUserPhysicalPages=NtMapUserPhysicalPages@12 -NtMapUserPhysicalPagesScatter=NtMapUserPhysicalPagesScatter@12 -;NtModifyBootEntry -NtNotifyChangeMultipleKeys=NtNotifyChangeMultipleKeys@48 -NtOpenJobObject=NtOpenJobObject@12 -NtOpenKeyedEvent=NtOpenKeyedEvent@12 -NtOpenProcessTokenEx=NtOpenProcessTokenEx@16 -NtOpenThreadTokenEx=NtOpenThreadTokenEx@20 -NtPowerInformation=NtPowerInformation@20 -;NtQueryBootEntryOrder -;NtQueryBootOptions -;NtQueryDebugFilterState -NtQueryDefaultUILanguage=NtQueryDefaultUILanguage@4 -NtQueryInformationJobObject=NtQueryInformationJobObject@20 -NtQueryInstallUILanguage=NtQueryInstallUILanguage@4 -NtQueryOpenSubKeys=NtQueryOpenSubKeys@8 -NtQueryPortInformationProcess=NtQueryPortInformationProcess@0 -;NtQuerySystemEnvironmentValueEx -NtReleaseKeyedEvent=NtReleaseKeyedEvent@16 -;NtRemoveProcessDebug -NtRenameKey=NtRenameKey@8 -NtReplyWaitReceivePortEx=NtReplyWaitReceivePortEx@20 -NtRequestDeviceWakeup=NtRequestDeviceWakeup@4 -NtRequestWakeupLatency=NtRequestWakeupLatency@4 -NtResetWriteWatch=NtResetWriteWatch@12 -NtResumeProcess=NtResumeProcess@4 -NtSaveKeyEx=NtSaveKeyEx@12 -NtSaveMergedKeys=NtSaveMergedKeys@12 -NtSecureConnectPort=NtSecureConnectPort@36 -;NtSetBootEntryOrder -;NtSetBootOptions -;NtSetDebugFilterState -NtSetDefaultUILanguage=NtSetDefaultUILanguage@4 -;NtSetEventBoostPriority -NtSetHighWaitLowThread=NtSetHighWaitLowThread@0 -;NtSetInformationDebugObject -NtSetInformationJobObject=NtSetInformationJobObject@16 -NtSetLowWaitHighThread=NtSetLowWaitHighThread@0 -NtSetQuotaInformationFile=NtSetQuotaInformationFile@16 -;NtSetSystemEnvironmentValueEx -NtSetThreadExecutionState=NtSetThreadExecutionState@8 -NtSetUuidSeed=NtSetUuidSeed@4 -NtSuspendProcess=NtSuspendProcess@4 -NtTerminateJobObject=NtTerminateJobObject@8 -;NtTraceEvent -;NtTranslateFilePath -NtUnloadKeyEx=NtUnloadKeyEx@8 -;NtWaitForDebugEvent -NtWaitForKeyedEvent=NtWaitForKeyedEvent@16 -;RtlActivateActivationContext -;RtlActivateActivationContextEx -;RtlActivateActivationContextUnsafeFast -;RtlAddAccessAllowedObjectAce -;RtlAddAccessDeniedObjectAce -;RtlAddAuditAccessAceEx -;RtlAddAuditAccessObjectAce -RtlAddRefActivationContext=RtlAddRefActivationContext@4 -;RtlAddRefMemoryStream -;RtlAddVectoredExceptionHandler -;RtlAddressInSectionTable -;RtlAppendPathElement -;RtlApplicationVerifierStop -;RtlAssert2 -;RtlCancelTimer -RtlCaptureContext=RtlCaptureContext@4 -;RtlCaptureStackContext -;RtlCheckForOrphanedCriticalSections -;RtlCheckProcessParameters -;RtlCloneMemoryStream -;RtlCommitMemoryStream -;RtlCompareVariants -;RtlComputeImportTableHash -;RtlComputePrivatizedDllName_U -;RtlConvertPropertyToVariant -;RtlConvertToAutoInheritSecurityObject -;RtlConvertVariantToProperty -;RtlCopyMemoryStreamTo -;RtlCopyOutOfProcessMemoryStreamTo -;RtlCreateActivationContext -;RtlCreateBootStatusDataFile -;RtlCreateSystemVolumeInformationFolder -RtlCreateTimer=RtlCreateTimer@28 -RtlCreateTimerQueue=RtlCreateTimerQueue@4 -RtlDeactivateActivationContext=RtlDeactivateActivationContext@8 -;RtlDeactivateActivationContextUnsafeFast -;RtlDebugPrintTimes -;RtlDefaultNpAcl -;RtlDeleteElementGenericTableAvl -RtlDeleteTimer=RtlDeleteTimer@12 -RtlDeleteTimerQueue=RtlDeleteTimerQueue@4 -RtlDeleteTimerQueueEx=RtlDeleteTimerQueueEx@8 -RtlDeregisterWait=RtlDeregisterWait@4 -RtlDeregisterWaitEx=RtlDeregisterWaitEx@8 -RtlDllShutdownInProgress=RtlDllShutdownInProgress@0 -;RtlDnsHostNameToComputerName -;RtlDosApplyFileIsolationRedirection_Ustr -;RtlDosSearchPath_Ustr -RtlDuplicateUnicodeString=RtlDuplicateUnicodeString@12 -;RtlEnableEarlyCriticalSectionEventCreation -;RtlEnumerateGenericTableAvl -;RtlEnumerateGenericTableLikeADirectory -;RtlEnumerateGenericTableWithoutSplayingAvl -;RtlFinalReleaseOutOfProcessMemoryStream -;RtlFindActivationContextSectionGuid -;RtlFindActivationContextSectionString -RtlFindCharInUnicodeString=RtlFindCharInUnicodeString@16 -;RtlFirstEntrySList -;RtlFlushSecureMemoryCache -;RtlFreeThreadActivationContextStack -RtlGetActiveActivationContext=RtlGetActiveActivationContext@4 -RtlGetCurrentPeb=RtlGetCurrentPeb@0 -;RtlGetElementGenericTableAvl -;RtlGetFrame -RtlGetLastNtStatus=RtlGetLastNtStatus@0 -RtlGetLastWin32Error=RtlGetLastWin32Error@0 -;RtlGetLengthWithoutLastFullDosOrNtPathElement -;RtlGetLengthWithoutTrailingPathSeperators -RtlGetNativeSystemInformation=RtlGetNativeSystemInformation@16 -;RtlGetSecurityDescriptorRMControl -;RtlGetSetBootStatusData -RtlGetVersion=RtlGetVersion@4 -RtlHashUnicodeString=RtlHashUnicodeString@16 -;RtlInitMemoryStream -;RtlInitOutOfProcessMemoryStream -RtlInitUnicodeStringEx=RtlInitUnicodeStringEx@8 -;RtlInitializeGenericTableAvl -RtlInitializeSListHead=RtlInitializeSListHead@4 -;RtlInsertElementGenericTableAvl -RtlInterlockedFlushSList=RtlInterlockedFlushSList@4 -RtlInterlockedPopEntrySList=RtlInterlockedPopEntrySList@4 -RtlInterlockedPushEntrySList=RtlInterlockedPushEntrySList@8 -;RtlInterlockedPushListSList -;RtlIpv4AddressToStringA -;RtlIpv4AddressToStringW -;RtlIpv4StringToAddressA -;RtlIpv4StringToAddressW -;RtlIpv6AddressToStringA -;RtlIpv6AddressToStringW -;RtlIpv6StringToAddressA -;RtlIpv6StringToAddressW -;RtlIsActivationContextActive -;RtlIsGenericTableEmptyAvl -;RtlIsThreadWithinLoaderCallout -;RtlLockBootStatusData -;RtlLockMemoryStreamRegion -RtlLogStackBackTrace=RtlLogStackBackTrace@0 -;RtlLookupElementGenericTableAvl -;RtlMapSecurityErrorToNtStatus -;RtlMultiAppendUnicodeStringBuffer -;RtlNewSecurityObjectEx -;RtlNewSecurityObjectWithMultipleInheritance -;RtlNtPathNameToDosPathName -RtlNtStatusToDosErrorNoTeb=RtlNtStatusToDosErrorNoTeb@4 -;RtlNumberGenericTableElementsAvl -;RtlOnMappedStreamEvent -;RtlPopFrame -;RtlPushFrame -RtlQueryDepthSList=RtlQueryDepthSList@4 -RtlQueryHeapInformation=RtlQueryHeapInformation@20 -RtlQueryInformationActivationContext=RtlQueryInformationActivationContext@28 -;RtlQueryInformationActiveActivationContext -;RtlQueryInterfaceMemoryStream -;RtlQueueApcWow64Thread -RtlQueueWorkItem=RtlQueueWorkItem@12 -;RtlRandomEx -;RtlReadMemoryStream -;RtlReadOutOfProcessMemoryStream -;RtlRegisterSecureMemoryCacheCallback -RtlRegisterWait=RtlRegisterWait@24 -RtlReleaseActivationContext=RtlReleaseActivationContext@4 -;RtlReleaseMemoryStream -;RtlRemoveVectoredExceptionHandler -RtlRestoreLastWin32Error=RtlRestoreLastWin32Error@4 -;RtlRevertMemoryStream -;RtlSeekMemoryStream -;RtlSelfRelativeToAbsoluteSD2 -;RtlSetControlSecurityDescriptor -RtlSetCriticalSectionSpinCount=RtlSetCriticalSectionSpinCount@4 -RtlSetHeapInformation=RtlSetHeapInformation@16 -RtlSetIoCompletionCallback=RtlSetIoCompletionCallback@12 -RtlSetLastWin32Error=RtlSetLastWin32Error@4 -RtlSetLastWin32ErrorAndNtStatusFromNtStatus=RtlSetLastWin32ErrorAndNtStatusFromNtStatus@4 -;RtlSetMemoryStreamSize -;RtlSetProcessIsCritical -;RtlSetSecurityDescriptorRMControl -;RtlSetSecurityObjectEx -;RtlSetThreadIsCritical -;RtlSetThreadPoolStartFunc -;RtlSetTimer -;RtlStatMemoryStream -;RtlTraceDatabaseAdd -;RtlTraceDatabaseCreate -;RtlTraceDatabaseDestroy -;RtlTraceDatabaseEnumerate -;RtlTraceDatabaseFind -;RtlTraceDatabaseLock -;RtlTraceDatabaseUnlock -;RtlTraceDatabaseValidate -;RtlUnhandledExceptionFilter -;RtlUnhandledExceptionFilter2 -;RtlUnlockBootStatusData -;RtlUnlockMemoryStreamRegion -RtlUpdateTimer=RtlUpdateTimer@16 -RtlValidRelativeSecurityDescriptor=RtlValidRelativeSecurityDescriptor@12 -;RtlValidateUnicodeString -RtlVerifyVersionInfo=RtlVerifyVersionInfo@16 -RtlWalkFrameChain=RtlWalkFrameChain@12 -;RtlWriteMemoryStream -RtlZombifyActivationContext=RtlZombifyActivationContext@4 -;RtlpApplyLengthFunction -;RtlpEnsureBufferSize -;RtlpNotOwnerCriticalSection -VerSetConditionMask=VerSetConditionMask@16 -ZwAccessCheckByType=ZwAccessCheckByType@44 -ZwAccessCheckByTypeAndAuditAlarm=ZwAccessCheckByTypeAndAuditAlarm@64 -ZwAccessCheckByTypeResultList=ZwAccessCheckByTypeResultList@44 -ZwAccessCheckByTypeResultListAndAuditAlarm=ZwAccessCheckByTypeResultListAndAuditAlarm@64 -ZwAccessCheckByTypeResultListAndAuditAlarmByHandle=ZwAccessCheckByTypeResultListAndAuditAlarmByHandle@68 -;ZwAddBootEntry -ZwAllocateUserPhysicalPages=ZwAllocateUserPhysicalPages@12 -ZwAreMappedFilesTheSame=ZwAreMappedFilesTheSame@8 -ZwAssignProcessToJobObject=ZwAssignProcessToJobObject@8 -ZwCancelDeviceWakeupRequest=ZwCancelDeviceWakeupRequest@4 -ZwCompactKeys=ZwCompactKeys@8 -;ZwCompareTokens -ZwCompressKey=ZwCompressKey@4 -;ZwCreateDebugObject -ZwCreateJobObject=ZwCreateJobObject@12 -ZwCreateJobSet=ZwCreateJobSet@12 -ZwCreateKeyedEvent=ZwCreateKeyedEvent@16 -;ZwCreateProcessEx -ZwCreateWaitablePort=ZwCreateWaitablePort@20 -;ZwDebugActiveProcess -;ZwDebugContinue -;ZwDeleteBootEntry -;ZwEnumerateBootEntries -;ZwEnumerateSystemEnvironmentValuesEx -ZwFilterToken=ZwFilterToken@24 -ZwFreeUserPhysicalPages=ZwFreeUserPhysicalPages@12 -ZwGetDevicePowerState=ZwGetDevicePowerState@8 -ZwGetWriteWatch=ZwGetWriteWatch@28 -ZwImpersonateAnonymousToken=ZwImpersonateAnonymousToken@4 -ZwInitiatePowerAction=ZwInitiatePowerAction@16 -ZwIsProcessInJob=ZwIsProcessInJob@8 -ZwIsSystemResumeAutomatic=ZwIsSystemResumeAutomatic@0 -ZwLockProductActivationKeys=ZwLockProductActivationKeys@8 -ZwLockRegistryKey=ZwLockRegistryKey@4 -ZwMakePermanentObject=ZwMakePermanentObject@4 -ZwMapUserPhysicalPages=ZwMapUserPhysicalPages@12 -ZwMapUserPhysicalPagesScatter=ZwMapUserPhysicalPagesScatter@12 -;ZwModifyBootEntry -ZwNotifyChangeMultipleKeys=ZwNotifyChangeMultipleKeys@48 -ZwOpenJobObject=ZwOpenJobObject@12 -ZwOpenKeyedEvent=ZwOpenKeyedEvent@12 -ZwOpenProcessTokenEx=ZwOpenProcessTokenEx@16 -ZwOpenThreadTokenEx=ZwOpenThreadTokenEx@20 -ZwPowerInformation=ZwPowerInformation@20 -;ZwQueryBootEntryOrder -;ZwQueryBootOptions -;ZwQueryDebugFilterState -ZwQueryDefaultUILanguage=ZwQueryDefaultUILanguage@4 -ZwQueryInformationJobObject=ZwQueryInformationJobObject@20 -ZwQueryInstallUILanguage=ZwQueryInstallUILanguage@4 -ZwQueryOpenSubKeys=ZwQueryOpenSubKeys@8 -ZwQueryPortInformationProcess=ZwQueryPortInformationProcess@0 -ZwQueryQuotaInformationFile=ZwQueryQuotaInformationFile@36 -;ZwQuerySystemEnvironmentValueEx -ZwReleaseKeyedEvent=ZwReleaseKeyedEvent@16 -;ZwRemoveProcessDebug -ZwRenameKey=ZwRenameKey@8 -ZwReplyWaitReceivePortEx=ZwReplyWaitReceivePortEx@20 -ZwRequestDeviceWakeup=ZwRequestDeviceWakeup@4 -ZwRequestWakeupLatency=ZwRequestWakeupLatency@4 -ZwResetWriteWatch=ZwResetWriteWatch@12 -ZwResumeProcess=ZwResumeProcess@4 -ZwSaveKeyEx=ZwSaveKeyEx@12 -ZwSaveMergedKeys=ZwSaveMergedKeys@12 -ZwSecureConnectPort=ZwSecureConnectPort@36 -;ZwSetBootEntryOrder -;ZwSetBootOptions -;ZwSetDebugFilterState -ZwSetDefaultUILanguage=ZwSetDefaultUILanguage@4 -;ZwSetEventBoostPriority -ZwSetHighWaitLowThread=ZwSetHighWaitLowThread@0 -;ZwSetInformationDebugObject -ZwSetInformationJobObject=ZwSetInformationJobObject@16 -ZwSetLowWaitHighThread=ZwSetLowWaitHighThread@0 -ZwSetQuotaInformationFile=ZwSetQuotaInformationFile@16 -;ZwSetSystemEnvironmentValueEx -ZwSetThreadExecutionState=ZwSetThreadExecutionState@8 -ZwSetUuidSeed=ZwSetUuidSeed@4 -ZwSuspendProcess=ZwSuspendProcess@4 -ZwTerminateJobObject=ZwTerminateJobObject@8 -;ZwTraceEvent -;ZwTranslateFilePath -ZwUnloadKeyEx=ZwUnloadKeyEx@8 -;ZwWaitForDebugEvent -ZwWaitForKeyedEvent=ZwWaitForKeyedEvent@16 -;_CIcos -;_CIlog -_CIpow -;_CIsin -;_CIsqrt -;_alldvrm -;_aulldvrm -vDbgPrintEx -vDbgPrintExWithPrefix -CsrIsCsrss=CsrIsCsrss@0 +; EOF + diff --git a/reactos/lib/ntdll/makefile b/reactos/lib/ntdll/makefile index 80773fcafde..10d50c007d8 100644 --- a/reactos/lib/ntdll/makefile +++ b/reactos/lib/ntdll/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.98 2004/02/01 20:48:05 ekohl Exp $ +# $Id: makefile,v 1.99 2004/02/25 19:34:32 ekohl Exp $ PATH_TO_TOP = ../.. @@ -155,8 +155,7 @@ TARGET_OBJECTS = \ $(RTL_OBJECTS) \ $(STDIO_OBJECTS) \ $(STDLIB_OBJECTS) \ - $(STRING_OBJECTS) \ - stubs/stubs.o + $(STRING_OBJECTS) DEP_OBJECTS = $(TARGET_OBJECTS) DEP_EXCLUDE_FILTER = napi.% diff --git a/reactos/lib/ntdll/stubs/.cvsignore b/reactos/lib/ntdll/stubs/.cvsignore deleted file mode 100644 index bd0e3dfd3ef..00000000000 --- a/reactos/lib/ntdll/stubs/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -*.d -*.o -*.sym diff --git a/reactos/lib/ntdll/stubs/stubs.c b/reactos/lib/ntdll/stubs/stubs.c deleted file mode 100644 index 49925704775..00000000000 --- a/reactos/lib/ntdll/stubs/stubs.c +++ /dev/null @@ -1,2672 +0,0 @@ -#include <msvcrt/stdlib.h> -#include <windows.h> -#include <ddk/ntddk.h> -#include <ntdll/rtl.h> - -/* - * @unimplemented - */ -PDEBUG_BUFFER STDCALL -RtlCreateQueryDebugBuffer(IN ULONG Size, - IN BOOLEAN EventPair) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -DWORD STDCALL RtlDeleteSecurityObject(DWORD x1) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlDestroyQueryDebugBuffer(IN PDEBUG_BUFFER DebugBuffer) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -VOID -STDCALL -RtlGetCallersAddress( - PVOID * CallersAddress - ) -{ -} - -/* - * @unimplemented - */ -VOID -STDCALL -RtlInitializeGenericTable ( - IN OUT PRTL_GENERIC_TABLE Table, - IN PVOID CompareRoutine, - IN PVOID AllocateRoutine, - IN PVOID FreeRoutine, - IN ULONG UserParameter - ) -{ -} - -/* - * @unimplemented - */ -PVOID -STDCALL -RtlInsertElementGenericTable ( - IN OUT PRTL_GENERIC_TABLE Table, - IN PVOID Element, - IN ULONG ElementSize, - IN ULONG Unknown4 - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOLEAN -STDCALL -RtlIsGenericTableEmpty ( - IN PRTL_GENERIC_TABLE Table - ) -{ - return(FALSE); -} -DWORD STDCALL RtlNewSecurityObject(DWORD x1,DWORD x2,DWORD x3,DWORD x4,DWORD x5,DWORD x6) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -ULONG -STDCALL -RtlNumberGenericTableElements ( - IN PRTL_GENERIC_TABLE Table - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlQueryProcessDebugInformation(IN ULONG ProcessId, - IN ULONG DebugInfoClassMask, - IN OUT PDEBUG_BUFFER DebugBuffer) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS STDCALL RtlWalkHeap( HANDLE heap, PVOID entry_ptr ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS STDCALL RtlpUnWaitCriticalSection(RTL_CRITICAL_SECTION *crit) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS STDCALL RtlpWaitForCriticalSection(RTL_CRITICAL_SECTION *crit) -{ - return(FALSE); -} - - -/* - * @unimplemented - */ -NTSTATUS STDCALL LdrLockLoaderLock(ULONG flags, ULONG *result, ULONG *magic) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS STDCALL LdrUnlockLoaderLock(ULONG flags, ULONG magic) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS STDCALL NtPowerInformation(DWORD x1,DWORD x2,DWORD x3,DWORD x4,DWORD x5) -{ - return(FALSE); -} - - -/* - * @unimplemented - */ -VOID -STDCALL -RtlCaptureContext ( - PCONTEXT ContextRecord - ) -{ -} - -/* - * @unimplemented - */ -NTSTATUS STDCALL RtlDuplicateUnicodeString( - int add_nul, - const UNICODE_STRING *source, - UNICODE_STRING *destination) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS STDCALL RtlFindCharInUnicodeString( - int flags, - const UNICODE_STRING *main_str, - const UNICODE_STRING *search_chars, - USHORT *pos) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlInitUnicodeStringEx(PUNICODE_STRING target,PCWSTR source) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -ULONGLONG -STDCALL -VerSetConditionMask( - ULONGLONG ConditionMask, - DWORD TypeMask, - BYTE Condition - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS STDCALL ZwPowerInformation(DWORD x1,DWORD x2,DWORD x3,DWORD x4,DWORD x5) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -double __cdecl _CIpow(double x,double y) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL STDCALL LdrFlushAlternateResourceModules(VOID) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL STDCALL LdrAlternateResourcesEnabled(VOID) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -ULONG -__cdecl -DbgPrintEx( - IN ULONG ComponentId, - IN ULONG Level, - IN PCH Format, - ... - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -ULONG -__cdecl -DbgPrintReturnControlC( - PCH Format, - ... - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -DbgQueryDebugFilterState( - IN ULONG ComponentId, - IN ULONG Level - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -DbgSetDebugFilterState( - IN ULONG ComponentId, - IN ULONG Level, - IN BOOL State - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtCancelDeviceWakeupRequest( - IN HANDLE Device - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtCompactKeys( - IN ULONG Count, - IN HANDLE KeyArray[] - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtCompressKey( - IN HANDLE Key - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtGetDevicePowerState( - IN HANDLE Device, - OUT DEVICE_POWER_STATE *State - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtInitiatePowerAction( - IN POWER_ACTION SystemAction, - IN SYSTEM_POWER_STATE MinSystemState, - IN ULONG Flags, - IN BOOL Asynchronous - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -NtIsSystemResumeAutomatic( - VOID - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtLockProductActivationKeys( - ULONG *pPrivateVer, - ULONG *pIsSafeMode - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtLockRegistryKey( - IN HANDLE KeyHandle - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtNotifyChangeMultipleKeys( - IN HANDLE MasterKeyHandle, - IN ULONG Count, - IN OBJECT_ATTRIBUTES SlaveObjects[], - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG CompletionFilter, - IN BOOL WatchTree, - OUT PVOID Buffer, - IN ULONG BufferSize, - IN BOOL Asynchronous - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtQueryOpenSubKeys( - IN POBJECT_ATTRIBUTES TargetKey, - OUT PULONG HandleCount - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtRenameKey( - IN HANDLE KeyHandle, - IN PUNICODE_STRING NewName - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtRequestDeviceWakeup( - IN HANDLE Device - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtRequestWakeupLatency( - IN LATENCY_TIME latency - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtSaveKeyEx( - IN HANDLE KeyHandle, - IN HANDLE FileHandle, - IN ULONG Format - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtSaveMergedKeys( - IN HANDLE HighPrecedenceKeyHandle, - IN HANDLE LowPrecedenceKeyHandle, - IN HANDLE FileHandle - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtSetThreadExecutionState( - IN EXECUTION_STATE esFlags, - OUT EXECUTION_STATE *PreviousFlags - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtUnloadKeyEx( - IN POBJECT_ATTRIBUTES TargetKey, - IN HANDLE Event OPTIONAL - ) -{ - return(FALSE); -} - - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -RtlGetVersion( - OUT PRTL_OSVERSIONINFOW lpVersionInformation - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -RtlHashUnicodeString( - IN const UNICODE_STRING *String, - IN BOOL CaseInSensitive, - IN ULONG HashAlgorithm, - OUT PULONG HashValue - ) -{ - return(FALSE); -} - - -/* - * @unimplemented - */ -BOOL -STDCALL -RtlValidRelativeSecurityDescriptor ( - IN PSECURITY_DESCRIPTOR SecurityDescriptorInput, - IN ULONG SecurityDescriptorLength, - IN SECURITY_INFORMATION RequiredInformation - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -RtlVerifyVersionInfo( - IN PRTL_OSVERSIONINFOEXW VersionInfo, - IN ULONG TypeMask, - IN ULONGLONG ConditionMask - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -ULONG -STDCALL -RtlWalkFrameChain ( - OUT PVOID *Callers, - IN ULONG Count, - IN ULONG Flags - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -ULONG -vDbgPrintEx( - IN ULONG ComponentId, - IN ULONG Level, - IN PCH Format, - va_list arglist - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -ULONG -vDbgPrintExWithPrefix( - IN PCH Prefix, - IN ULONG ComponentId, - IN ULONG Level, - IN PCH Format, - va_list arglist - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwCancelDeviceWakeupRequest( - IN HANDLE Device - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwCompactKeys( - IN ULONG Count, - IN HANDLE KeyArray[] - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwCompressKey( - IN HANDLE Key - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwGetDevicePowerState( - IN HANDLE Device, - OUT DEVICE_POWER_STATE *State - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwInitiatePowerAction( - IN POWER_ACTION SystemAction, - IN SYSTEM_POWER_STATE MinSystemState, - IN ULONG Flags, - IN BOOL Asynchronous - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOL -STDCALL -ZwIsSystemResumeAutomatic( - VOID - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwLockProductActivationKeys( - ULONG *pPrivateVer, - ULONG *pIsSafeMode - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwLockRegistryKey( - IN HANDLE KeyHandle - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwNotifyChangeMultipleKeys( - IN HANDLE MasterKeyHandle, - IN ULONG Count, - IN OBJECT_ATTRIBUTES SlaveObjects[], - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG CompletionFilter, - IN BOOL WatchTree, - OUT PVOID Buffer, - IN ULONG BufferSize, - IN BOOL Asynchronous - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwQueryOpenSubKeys( - IN POBJECT_ATTRIBUTES TargetKey, - OUT PULONG HandleCount - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwRenameKey( - IN HANDLE KeyHandle, - IN PUNICODE_STRING NewName - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwRequestDeviceWakeup( - IN HANDLE Device - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwRequestWakeupLatency( - IN LATENCY_TIME latency - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwSaveKeyEx( - IN HANDLE KeyHandle, - IN HANDLE FileHandle, - IN ULONG Format - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwSaveMergedKeys( - IN HANDLE HighPrecedenceKeyHandle, - IN HANDLE LowPrecedenceKeyHandle, - IN HANDLE FileHandle - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwSetThreadExecutionState( - IN EXECUTION_STATE esFlags, - OUT EXECUTION_STATE *PreviousFlags - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwUnloadKeyEx( - IN POBJECT_ATTRIBUTES TargetKey, - IN HANDLE Event OPTIONAL - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS STDCALL DbgUiDebugActiveProcess(HANDLE process) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS STDCALL DbgUiStopDebugging(HANDLE process) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -VOID -STDCALL -RtlInitializeSListHead ( - PSLIST_HEADER ListHead - ) -{ -} - -/* - * @unimplemented - */ -PSLIST_ENTRY -STDCALL -RtlInterlockedFlushSList ( - PSLIST_HEADER ListHead - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -PSLIST_ENTRY -STDCALL -RtlInterlockedPopEntrySList ( - PSLIST_HEADER ListHead - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -PSLIST_ENTRY -STDCALL -RtlInterlockedPushEntrySList ( - PSLIST_HEADER ListHead, - PSLIST_ENTRY ListEntry - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -USHORT -STDCALL -RtlQueryDepthSList ( - PSLIST_HEADER ListHead - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -RtlCreateTimer(HANDLE TimerQueue,PHANDLE phNewTimer, WAITORTIMERCALLBACK Callback,PVOID Parameter,DWORD DueTime,DWORD Period,ULONG Flags) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -RtlCreateTimerQueue(PHANDLE TimerQueue) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -RtlDeleteTimer(HANDLE TimerQueue,HANDLE Timer,HANDLE CompletionEvent) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -RtlUpdateTimer(HANDLE TimerQueue,HANDLE Timer,ULONG DueTime,ULONG Period) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -RtlDeleteTimerQueueEx(HANDLE TimerQueue,HANDLE CompletionEvent) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -RtlDeleteTimerQueue(HANDLE TimerQueue) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -RtlRegisterWait(PHANDLE hOutput, HANDLE hObject,WAITORTIMERCALLBACK Callback,PVOID Context,ULONG dwMilliseconds,ULONG dwFlags) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -RtlDeregisterWait( - HANDLE WaitHandle - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -RtlDeregisterWaitEx( - HANDLE WaitHandle, - HANDLE CompletionEvent - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -RtlSetHeapInformation( - HANDLE HeapHandle, - HEAP_INFORMATION_CLASS HeapInformationClass, - PVOID HeapInformation OPTIONAL, - SIZE_T HeapInformationLength OPTIONAL - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -RtlQueryHeapInformation( - HANDLE HeapHandle, - HEAP_INFORMATION_CLASS HeapInformationClass, - PVOID HeapInformation OPTIONAL, - SIZE_T HeapInformationLength OPTIONAL, - PSIZE_T ReturnLength OPTIONAL - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtCreateJobSet( - ULONG NumJob, - PJOB_SET_ARRAY UserJobSet, - ULONG Flags) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwCreateJobSet( - ULONG NumJob, - PJOB_SET_ARRAY UserJobSet, - ULONG Flags) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -VOID -STDCALL -RtlReleaseActivationContext( - HANDLE hActCtx - ) -{ -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -RtlQueryInformationActivationContext( - DWORD dwFlags, - HANDLE hActCtx, - PVOID pvSubInstance, - ULONG ulInfoClass, - PVOID pvBuffer, - SIZE_T cbBuffer OPTIONAL, - SIZE_T *pcbWrittenOrRequired OPTIONAL - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -VOID -STDCALL -RtlAddRefActivationContext( - HANDLE hActCtx - ) -{ -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -RtlGetActiveActivationContext( - HANDLE *lphActCtx) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -RtlZombifyActivationContext( - HANDLE hActCtx - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -RtlDeactivateActivationContext( - DWORD dwFlags, - ULONG_PTR ulCookie - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -ULONG -STDCALL -RtlCreateTagHeap( - IN HANDLE HeapHandle, - IN ULONG Flags, - IN PCWSTR TagName, - IN PCWSTR TagSubName - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -PRTL_SPLAY_LINKS -STDCALL -RtlDelete( - IN PRTL_SPLAY_LINKS Links - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOLEAN -STDCALL -RtlDeleteElementGenericTable( - IN PRTL_GENERIC_TABLE Table, - IN PVOID Buffer - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -VOID -STDCALL -RtlDeleteNoSplay( - IN PRTL_SPLAY_LINKS Links, - OUT PRTL_SPLAY_LINKS *Root - ) -{ -} - -/* - * @unimplemented - */ -PVOID -STDCALL -RtlEnumerateGenericTable( - IN PRTL_GENERIC_TABLE Table, - IN BOOLEAN Restart - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -PVOID -STDCALL -RtlEnumerateGenericTableWithoutSplaying( - IN PRTL_GENERIC_TABLE Table, - IN PVOID *RestartKey - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -VOID -STDCALL -RtlGetElementGenericTable( - IN PRTL_GENERIC_TABLE Table, - IN ULONG I - ) -{ -} - -/* - * @unimplemented - */ -PVOID -STDCALL -RtlLookupElementGenericTable( - IN PRTL_GENERIC_TABLE Table, - IN PVOID Buffer - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -PVOID -STDCALL -RtlProtectHeap( - IN HANDLE Heap, - IN BOOLEAN ReadOnly - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -PCWSTR -STDCALL -RtlQueryTagHeap( - IN HANDLE HeapHandle, - IN ULONG Flags, - IN USHORT TagNumber, - IN BOOLEAN ZeroInternalTagInfo, - OUT PRTL_HEAP_TAG_INFO HeapTagInfo OPTIONAL - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -PRTL_SPLAY_LINKS -STDCALL -RtlRealPredecessor( - IN PRTL_SPLAY_LINKS Links - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -PRTL_SPLAY_LINKS -STDCALL -RtlRealSuccessor( - IN PRTL_SPLAY_LINKS Links - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -PRTL_SPLAY_LINKS -STDCALL -RtlSplay( - IN PRTL_SPLAY_LINKS Links - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtAccessCheckByType( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSID PrincipalSelfSid, - IN HANDLE TokenHandle, - IN ULONG DesiredAccess, - IN POBJECT_TYPE_LIST ObjectTypeList, - IN ULONG ObjectTypeListLength, - IN PGENERIC_MAPPING GenericMapping, - IN PPRIVILEGE_SET PrivilegeSet, - IN PULONG PrivilegeSetLength, - OUT PACCESS_MASK GrantedAccess, - OUT PULONG AccessStatus - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtAccessCheckByTypeAndAuditAlarm( - IN PUNICODE_STRING SubsystemName, - IN PVOID HandleId, - IN PUNICODE_STRING ObjectTypeName, - IN PUNICODE_STRING ObjectName, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSID PrincipalSelfSid, - IN ACCESS_MASK DesiredAccess, - IN AUDIT_EVENT_TYPE AuditType, - IN ULONG Flags, - IN POBJECT_TYPE_LIST ObjectTypeList, - IN ULONG ObjectTypeListLength, - IN PGENERIC_MAPPING GenericMapping, - IN BOOLEAN ObjectCreation, - OUT PACCESS_MASK GrantedAccess, - OUT PULONG AccessStatus, - OUT PBOOLEAN GenerateOnClose - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtAccessCheckByTypeResultList( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSID PrincipalSelfSid, - IN HANDLE TokenHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_TYPE_LIST ObjectTypeList, - IN ULONG ObjectTypeListLength, - IN PGENERIC_MAPPING GenericMapping, - IN PPRIVILEGE_SET PrivilegeSet, - IN PULONG PrivilegeSetLength, - OUT PACCESS_MASK GrantedAccessList, - OUT PULONG AccessStatusList - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtAccessCheckByTypeResultListAndAuditAlarm( - IN PUNICODE_STRING SubsystemName, - IN PVOID HandleId, - IN PUNICODE_STRING ObjectTypeName, - IN PUNICODE_STRING ObjectName, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSID PrincipalSelfSid, - IN ACCESS_MASK DesiredAccess, - IN AUDIT_EVENT_TYPE AuditType, - IN ULONG Flags, - IN POBJECT_TYPE_LIST ObjectTypeList, - IN ULONG ObjectTypeListLength, - IN PGENERIC_MAPPING GenericMapping, - IN BOOLEAN ObjectCreation, - OUT PACCESS_MASK GrantedAccessList, - OUT PULONG AccessStatusList, - OUT PULONG GenerateOnClose - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtAccessCheckByTypeResultListAndAuditAlarmByHandle( - IN PUNICODE_STRING SubsystemName, - IN PVOID HandleId, - IN HANDLE TokenHandle, - IN PUNICODE_STRING ObjectTypeName, - IN PUNICODE_STRING ObjectName, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSID PrincipalSelfSid, - IN ACCESS_MASK DesiredAccess, - IN AUDIT_EVENT_TYPE AuditType, - IN ULONG Flags, - IN POBJECT_TYPE_LIST ObjectTypeList, - IN ULONG ObjectTypeListLength, - IN PGENERIC_MAPPING GenericMapping, - IN BOOLEAN ObjectCreation, - OUT PACCESS_MASK GrantedAccessList, - OUT PULONG AccessStatusList, - OUT PULONG GenerateOnClose - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtAllocateUserPhysicalPages( - IN HANDLE ProcessHandle, - IN PULONG NumberOfPages, - OUT PULONG PageFrameNumbers - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtAreMappedFilesTheSame( - IN PVOID Address1, - IN PVOID Address2 - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtCreateJobObject( - OUT PHANDLE JobHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtCreateKeyedEvent( - OUT PHANDLE KeyedEventHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - ULONG Reserved - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtFilterToken( - IN HANDLE ExistingTokenHandle, - IN ULONG Flags, - IN PTOKEN_GROUPS SidsToDisable, - IN PTOKEN_PRIVILEGES PrivilegesToDelete, - IN PTOKEN_GROUPS SidsToRestricted, - OUT PHANDLE NewTokenHandle - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtFreeUserPhysicalPages( - IN HANDLE ProcessHandle, - IN OUT PULONG NumberOfPages, - IN PULONG PageFrameNumbers - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtGetWriteWatch( - IN HANDLE ProcessHandle, - IN ULONG Flags, - IN PVOID BaseAddress, - IN ULONG RegionSize, - OUT PULONG Buffer, - IN OUT PULONG BufferEntries, - OUT PULONG Granularity - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtImpersonateAnonymousToken( - IN HANDLE ThreadHandle - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtIsProcessInJob( - IN HANDLE JobHandle, - IN HANDLE ProcessHandle - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtMakePermanentObject( - IN HANDLE Object - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtMapUserPhysicalPages( - IN PVOID BaseAddress, - IN PULONG NumberOfPages, - IN PULONG PageFrameNumbers - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtMapUserPhysicalPagesScatter( - IN PVOID *BaseAddresses, - IN PULONG NumberOfPages, - IN PULONG PageFrameNumbers - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtOpenJobObject( - OUT PHANDLE JobHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtOpenKeyedEvent( - OUT PHANDLE KeyedEventHandle, - IN PACCESS_MASK DesiredAccess, - IN PUNICODE_STRING KeyedEventName - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtOpenProcessTokenEx( - IN HANDLE ProcessHandle, - IN ACCESS_MASK DesiredAccess, - IN ULONG HandleAttributes, - OUT PHANDLE TokenHandle - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtOpenThreadTokenEx( - IN HANDLE ThreadHandle, - IN ACCESS_MASK DesiredAccess, - IN BOOLEAN OpenAsSelf, - IN ULONG HandleAttributes, - OUT PHANDLE TokenHandle - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtQueryDefaultUILanguage( - OUT PLANGID LanguageId - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtQueryInformationJobObject( - IN HANDLE JobHandle, - IN JOBOBJECTINFOCLASS JobInformationClass, - OUT PVOID JobInformation, - IN ULONG JobInformationLength, - OUT PULONG ReturnLength OPTIONAL - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtQueryInstallUILanguage( - OUT PLANGID LanguageId - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -ULONG -STDCALL -NtQueryPortInformationProcess( - VOID - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtReleaseKeyedEvent( - IN HANDLE KeyedEventHandle, - IN ULONG Requested, - IN BOOLEAN Alertable, - IN PLARGE_INTEGER Timeout OPTIONAL - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtReplyWaitReceivePortEx( - IN HANDLE PortHandle, - OUT PULONG PortIdentifier OPTIONAL, - IN PPORT_MESSAGE ReplyMessage OPTIONAL, - OUT PPORT_MESSAGE Message, - IN PLARGE_INTEGER Timeout - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtResetWriteWatch( - IN HANDLE ProcessHandle, - IN PVOID BaseAddress, - IN ULONG RegionSize - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtResumeProcess( - IN HANDLE Process - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtSecureConnectPort( - OUT PHANDLE PortHandle, - IN PUNICODE_STRING PortName, - IN PSECURITY_QUALITY_OF_SERVICE SecurityQos, - IN OUT PPORT_SECTION_WRITE WriteSection OPTIONAL, - IN PSID ServerSid OPTIONAL, - IN OUT PPORT_SECTION_READ ReadSection OPTIONAL, - OUT PULONG MaxMessageSize OPTIONAL, - IN OUT PVOID ConnectData OPTIONAL, - IN OUT PULONG ConnectDataLength OPTIONAL - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtSetDefaultUILanguage( - IN LANGID LanguageId - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtSetInformationJobObject( - IN HANDLE JobHandle, - IN JOBOBJECTINFOCLASS JobInformationClass, - IN PVOID JobInformation, - IN ULONG JobInformationLength - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtSetQuotaInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PFILE_USER_QUOTA_INFORMATION Buffer, - IN ULONG BufferLength - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtSetUuidSeed( - IN PUCHAR UuidSeed - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtSuspendProcess( - IN HANDLE Process - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtTerminateJobObject( - IN HANDLE JobHandle, - IN NTSTATUS ExitStatus - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -NtWaitForKeyedEvent( - IN HANDLE KeyedEventHandle, - IN ULONG Requested, - IN BOOLEAN Alertable, - IN PLARGE_INTEGER Timeout OPTIONAL - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -BOOLEAN -STDCALL -RtlDllShutdownInProgress( - VOID - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -PPEB -STDCALL -RtlGetCurrentPeb( - VOID - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -RtlGetLastNtStatus( - VOID - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -ULONG -STDCALL -RtlGetLastWin32Error( - VOID - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -RtlGetNativeSystemInformation( - IN SYSTEM_INFORMATION_CLASS SystemInformationClass, - IN OUT PVOID SystemInformation, - IN ULONG SystemInformationLength, - OUT PULONG ReturnLength OPTIONAL - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -USHORT -STDCALL -RtlLogStackBackTrace( - VOID - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -RtlQueueWorkItem( - LPTHREAD_START_ROUTINE Function, - PVOID Context, - ULONG Flags - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -VOID -STDCALL -RtlRestoreLastWin32Error( - IN ULONG Win32Error - ) -{ -} - -/* - * @unimplemented - */ -ULONG -STDCALL -RtlSetCriticalSectionSpinCount( - IN PRTL_CRITICAL_SECTION CriticalSection - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -RtlSetIoCompletionCallback( - IN HANDLE FileHandle, - IN POVERLAPPED_COMPLETION_ROUTINE CompletionRoutine, - IN ULONG Flags - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -VOID -STDCALL -RtlSetLastWin32Error( - IN ULONG Win32Error - ) -{ -} - -/* - * @unimplemented - */ -VOID -STDCALL -RtlSetLastWin32ErrorAndNtStatusFromNtStatus( - IN NTSTATUS NtStatus - ) -{ -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwAccessCheckByType( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSID PrincipalSelfSid, - IN HANDLE TokenHandle, - IN ULONG DesiredAccess, - IN POBJECT_TYPE_LIST ObjectTypeList, - IN ULONG ObjectTypeListLength, - IN PGENERIC_MAPPING GenericMapping, - IN PPRIVILEGE_SET PrivilegeSet, - IN PULONG PrivilegeSetLength, - OUT PACCESS_MASK GrantedAccess, - OUT PULONG AccessStatus - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwAccessCheckByTypeAndAuditAlarm( - IN PUNICODE_STRING SubsystemName, - IN PVOID HandleId, - IN PUNICODE_STRING ObjectTypeName, - IN PUNICODE_STRING ObjectName, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSID PrincipalSelfSid, - IN ACCESS_MASK DesiredAccess, - IN AUDIT_EVENT_TYPE AuditType, - IN ULONG Flags, - IN POBJECT_TYPE_LIST ObjectTypeList, - IN ULONG ObjectTypeListLength, - IN PGENERIC_MAPPING GenericMapping, - IN BOOLEAN ObjectCreation, - OUT PACCESS_MASK GrantedAccess, - OUT PULONG AccessStatus, - OUT PBOOLEAN GenerateOnClose - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwAccessCheckByTypeResultList( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSID PrincipalSelfSid, - IN HANDLE TokenHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_TYPE_LIST ObjectTypeList, - IN ULONG ObjectTypeListLength, - IN PGENERIC_MAPPING GenericMapping, - IN PPRIVILEGE_SET PrivilegeSet, - IN PULONG PrivilegeSetLength, - OUT PACCESS_MASK GrantedAccessList, - OUT PULONG AccessStatusList - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwAccessCheckByTypeResultListAndAuditAlarm( - IN PUNICODE_STRING SubsystemName, - IN PVOID HandleId, - IN PUNICODE_STRING ObjectTypeName, - IN PUNICODE_STRING ObjectName, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSID PrincipalSelfSid, - IN ACCESS_MASK DesiredAccess, - IN AUDIT_EVENT_TYPE AuditType, - IN ULONG Flags, - IN POBJECT_TYPE_LIST ObjectTypeList, - IN ULONG ObjectTypeListLength, - IN PGENERIC_MAPPING GenericMapping, - IN BOOLEAN ObjectCreation, - OUT PACCESS_MASK GrantedAccessList, - OUT PULONG AccessStatusList, - OUT PULONG GenerateOnClose - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwAccessCheckByTypeResultListAndAuditAlarmByHandle( - IN PUNICODE_STRING SubsystemName, - IN PVOID HandleId, - IN HANDLE TokenHandle, - IN PUNICODE_STRING ObjectTypeName, - IN PUNICODE_STRING ObjectName, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSID PrincipalSelfSid, - IN ACCESS_MASK DesiredAccess, - IN AUDIT_EVENT_TYPE AuditType, - IN ULONG Flags, - IN POBJECT_TYPE_LIST ObjectTypeList, - IN ULONG ObjectTypeListLength, - IN PGENERIC_MAPPING GenericMapping, - IN BOOLEAN ObjectCreation, - OUT PACCESS_MASK GrantedAccessList, - OUT PULONG AccessStatusList, - OUT PULONG GenerateOnClose - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwAllocateUserPhysicalPages( - IN HANDLE ProcessHandle, - IN PULONG NumberOfPages, - OUT PULONG PageFrameNumbers - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwAreMappedFilesTheSame( - IN PVOID Address1, - IN PVOID Address2 - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwAssignProcessToJobObject( - IN HANDLE JobHandle, - IN HANDLE ProcessHandle - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwCreateJobObject( - OUT PHANDLE JobHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwCreateKeyedEvent( - OUT PHANDLE KeyedEventHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - ULONG Reserved - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwFilterToken( - IN HANDLE ExistingTokenHandle, - IN ULONG Flags, - IN PTOKEN_GROUPS SidsToDisable, - IN PTOKEN_PRIVILEGES PrivilegesToDelete, - IN PTOKEN_GROUPS SidsToRestricted, - OUT PHANDLE NewTokenHandle - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwFreeUserPhysicalPages( - IN HANDLE ProcessHandle, - IN OUT PULONG NumberOfPages, - IN PULONG PageFrameNumbers - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwGetWriteWatch( - IN HANDLE ProcessHandle, - IN ULONG Flags, - IN PVOID BaseAddress, - IN ULONG RegionSize, - OUT PULONG Buffer, - IN OUT PULONG BufferEntries, - OUT PULONG Granularity - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwImpersonateAnonymousToken( - IN HANDLE ThreadHandle - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwIsProcessInJob( - IN HANDLE JobHandle, - IN HANDLE ProcessHandle - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwMakePermanentObject( - IN HANDLE Object - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwMapUserPhysicalPages( - IN PVOID BaseAddress, - IN PULONG NumberOfPages, - IN PULONG PageFrameNumbers - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwMapUserPhysicalPagesScatter( - IN PVOID *BaseAddresses, - IN PULONG NumberOfPages, - IN PULONG PageFrameNumbers - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwOpenJobObject( - OUT PHANDLE JobHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwOpenKeyedEvent( - OUT PHANDLE KeyedEventHandle, - IN PACCESS_MASK DesiredAccess, - IN PUNICODE_STRING KeyedEventName - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwOpenProcessTokenEx( - IN HANDLE ProcessHandle, - IN ACCESS_MASK DesiredAccess, - IN ULONG HandleAttributes, - OUT PHANDLE TokenHandle - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwOpenThreadTokenEx( - IN HANDLE ThreadHandle, - IN ACCESS_MASK DesiredAccess, - IN BOOLEAN OpenAsSelf, - IN ULONG HandleAttributes, - OUT PHANDLE TokenHandle - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwQueryDefaultUILanguage( - OUT PLANGID LanguageId - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwQueryInformationJobObject( - IN HANDLE JobHandle, - IN JOBOBJECTINFOCLASS JobInformationClass, - OUT PVOID JobInformation, - IN ULONG JobInformationLength, - OUT PULONG ReturnLength OPTIONAL - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwQueryInstallUILanguage( - OUT PLANGID LanguageId - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -ULONG -STDCALL -ZwQueryPortInformationProcess( - VOID - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwQueryQuotaInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PFILE_USER_QUOTA_INFORMATION Buffer, - IN ULONG BufferLength, - IN BOOLEAN ReturnSingleEntry, - IN PFILE_QUOTA_LIST_INFORMATION QuotaList OPTIONAL, - IN ULONG QuotaListLength, - IN PSID ResumeSid OPTIONAL, - IN BOOLEAN RestartScan - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwReleaseKeyedEvent( - IN HANDLE KeyedEventHandle, - IN ULONG Requested, - IN BOOLEAN Alertable, - IN PLARGE_INTEGER Timeout OPTIONAL - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwReplyWaitReceivePortEx( - IN HANDLE PortHandle, - OUT PULONG PortIdentifier OPTIONAL, - IN PPORT_MESSAGE ReplyMessage OPTIONAL, - OUT PPORT_MESSAGE Message, - IN PLARGE_INTEGER Timeout - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwResetWriteWatch( - IN HANDLE ProcessHandle, - IN PVOID BaseAddress, - IN ULONG RegionSize - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwResumeProcess( - IN HANDLE Process - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwSecureConnectPort( - OUT PHANDLE PortHandle, - IN PUNICODE_STRING PortName, - IN PSECURITY_QUALITY_OF_SERVICE SecurityQos, - IN OUT PPORT_SECTION_WRITE WriteSection OPTIONAL, - IN PSID ServerSid OPTIONAL, - IN OUT PPORT_SECTION_READ ReadSection OPTIONAL, - OUT PULONG MaxMessageSize OPTIONAL, - IN OUT PVOID ConnectData OPTIONAL, - IN OUT PULONG ConnectDataLength OPTIONAL - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwSetDefaultUILanguage( - IN LANGID LanguageId - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwSetInformationJobObject( - IN HANDLE JobHandle, - IN JOBOBJECTINFOCLASS JobInformationClass, - IN PVOID JobInformation, - IN ULONG JobInformationLength - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwSetQuotaInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PFILE_USER_QUOTA_INFORMATION Buffer, - IN ULONG BufferLength - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwSetUuidSeed( - IN PUCHAR UuidSeed - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwSuspendProcess( - IN HANDLE Process - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwTerminateJobObject( - IN HANDLE JobHandle, - IN NTSTATUS ExitStatus - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -ZwWaitForKeyedEvent( - IN HANDLE KeyedEventHandle, - IN ULONG Requested, - IN BOOLEAN Alertable, - IN PLARGE_INTEGER Timeout OPTIONAL - ) -{ - return(FALSE); -} From 99866ef3a0efc0450627ecfe763c30e96a13a618 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Wed, 25 Feb 2004 20:00:42 +0000 Subject: [PATCH 0182/1463] Sync Winmm with Wine-20040215 and silence some non-error messages. svn path=/trunk/; revision=8376 --- reactos/lib/winmm/.cvsignore | 1 + reactos/lib/winmm/Makefile | 47 +- reactos/lib/winmm/Makefile.in | 33 + reactos/lib/winmm/Makefile.ros | 21 + reactos/lib/winmm/Makefile.ros-template | 21 + reactos/lib/winmm/driver.c | 2 +- reactos/lib/winmm/joystick.c | 4 +- reactos/lib/winmm/lolvldrv.c | 10 +- reactos/lib/winmm/mci.c | 12 +- reactos/lib/winmm/message16.c | 2778 ++++++++++++++++++++ reactos/lib/winmm/mmsystem.c | 3175 +++++++++++++++++++++++ reactos/lib/winmm/mmsystem.spec | 176 ++ reactos/lib/winmm/playsound.c | 6 +- reactos/lib/winmm/sound.spec | 18 + reactos/lib/winmm/sound16.c | 184 ++ reactos/lib/winmm/time.c | 128 +- reactos/lib/winmm/winemm.h | 16 +- reactos/lib/winmm/winemm16.h | 59 + reactos/lib/winmm/winmm.c | 388 ++- reactos/lib/winmm/winmm.def | 181 -- reactos/lib/winmm/winmm.edf | 181 -- reactos/lib/winmm/winmm.spec | 187 ++ 22 files changed, 7050 insertions(+), 578 deletions(-) create mode 100644 reactos/lib/winmm/Makefile.in create mode 100644 reactos/lib/winmm/Makefile.ros create mode 100644 reactos/lib/winmm/Makefile.ros-template create mode 100644 reactos/lib/winmm/message16.c create mode 100644 reactos/lib/winmm/mmsystem.c create mode 100644 reactos/lib/winmm/mmsystem.spec create mode 100644 reactos/lib/winmm/sound.spec create mode 100644 reactos/lib/winmm/sound16.c create mode 100644 reactos/lib/winmm/winemm16.h delete mode 100644 reactos/lib/winmm/winmm.def delete mode 100644 reactos/lib/winmm/winmm.edf create mode 100644 reactos/lib/winmm/winmm.spec diff --git a/reactos/lib/winmm/.cvsignore b/reactos/lib/winmm/.cvsignore index a2a90a48943..b37e844ff3e 100644 --- a/reactos/lib/winmm/.cvsignore +++ b/reactos/lib/winmm/.cvsignore @@ -4,3 +4,4 @@ *.d *.sym *.map +*.spec.def \ No newline at end of file diff --git a/reactos/lib/winmm/Makefile b/reactos/lib/winmm/Makefile index 2f24a9dd4b7..da6c89451cf 100644 --- a/reactos/lib/winmm/Makefile +++ b/reactos/lib/winmm/Makefile @@ -1,51 +1,8 @@ -# $Id: makefile +# $Id: Makefile,v 1.12 2004/02/25 20:00:41 sedwards Exp $ PATH_TO_TOP = ../.. -TARGET_TYPE = dynlink - -TARGET_NAME = winmm - -TARGET_BASE = 0x777c0000 - -WINE_RC = winmm_res - -TARGET_CFLAGS = \ - -Wall \ - -fno-builtin - -# Compile definitions usage: -# __USE_W32API - Compilation with w32api headers -# __REACTOS__ - Compilation of Wine sources for ReactOS -# _WIN32_IE=0x600 - Internet Explorer 6 compatible defintions -# WINVER=0x501 - Windows XP definitions -# __need_offsetof - Force definition of macro offsetof in stddef.h -# -DEFINES = \ - -D_DISABLE_TIDENTS \ - -D__USE_W32API \ - -D__REACTOS__ \ - -D_WIN32_IE=0x600 \ - -D_WIN32_WINNT=0x501 \ - -DWINVER=0x501 - -TARGET_CFLAGS += \ - $(DEFINES) \ - -I$(PATH_TO_TOP)/include/wine - -TARGET_RCFLAGS += -D__REACTOS__ -D_WIN32_IE=0x600 -D_WIN32_WINNT=0x501 - -TARGET_SDKLIBS = libwine.a ntdll.a kernel32.a - -TARGET_OBJECTS = \ - driver.o \ - joystick.o \ - lolvldrv.o \ - mci.o \ - mmio.o \ - playsound.o \ - time.o \ - winmm.o +TARGET_TYPE = winedll include $(PATH_TO_TOP)/rules.mak diff --git a/reactos/lib/winmm/Makefile.in b/reactos/lib/winmm/Makefile.in new file mode 100644 index 00000000000..39b3c461fc8 --- /dev/null +++ b/reactos/lib/winmm/Makefile.in @@ -0,0 +1,33 @@ +EXTRADEFS = -D_WINMM_ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = winmm.dll +IMPORTS = user32 advapi32 kernel32 ntdll +ALTNAMES = mmsystem.dll sound.dll + +SPEC_SRCS16 = $(ALTNAMES:.dll=.spec) + +C_SRCS = \ + driver.c \ + joystick.c \ + lolvldrv.c \ + mci.c \ + mmio.c \ + playsound.c \ + time.c \ + winmm.c + +C_SRCS16 = \ + message16.c \ + mmsystem.c \ + sound16.c + +RC_SRCS = winmm_res.rc + +SUBDIRS = tests + +@MAKE_DLL_RULES@ + +### Dependencies: diff --git a/reactos/lib/winmm/Makefile.ros b/reactos/lib/winmm/Makefile.ros new file mode 100644 index 00000000000..83748808560 --- /dev/null +++ b/reactos/lib/winmm/Makefile.ros @@ -0,0 +1,21 @@ +# $Id: Makefile.ros,v 1.1 2004/02/25 20:00:41 sedwards Exp $ + +TARGET_NAME = winmm + +TARGET_OBJECTS = driver.o joystick.o lolvldrv.o mci.o mmio.o playsound.o time.o winmm.o + +TARGET_CFLAGS = -D_WINMM_ -D__REACTOS__ + +TARGET_SDKLIBS = user32.a advapi32.a kernel32.a ntdll.a libwine.a wine_uuid.a ntdll.a + +TARGET_BASE = 0x76160000 + +TARGET_RC_SRCS = winmm_res.rc +TARGET_RC_BINSRC = +TARGET_RC_BINARIES = + +default: all + +DEP_OBJECTS = $(TARGET_OBJECTS) + +include $(TOOLS_PATH)/depend.mk diff --git a/reactos/lib/winmm/Makefile.ros-template b/reactos/lib/winmm/Makefile.ros-template new file mode 100644 index 00000000000..ef52169c385 --- /dev/null +++ b/reactos/lib/winmm/Makefile.ros-template @@ -0,0 +1,21 @@ +# $Id: Makefile.ros-template,v 1.1 2004/02/25 20:00:41 sedwards Exp $ + +TARGET_NAME = winmm + +TARGET_OBJECTS = @C_SRCS@ + +TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ + +TARGET_SDKLIBS = @IMPORTS@ libwine.a wine_uuid.a ntdll.a + +TARGET_BASE = 0x76160000 + +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/winmm/driver.c b/reactos/lib/winmm/driver.c index 076a0e0ff6e..4a43469049a 100644 --- a/reactos/lib/winmm/driver.c +++ b/reactos/lib/winmm/driver.c @@ -389,7 +389,7 @@ LRESULT WINAPI CloseDriver(HDRVR hDrvr, LPARAM lParam1, LPARAM lParam2) DRIVER_SendMessage(lpDrv0, DRV_CLOSE, 0L, 0L); lpDrv0->d.d32.dwDriverID = 0; DRIVER_RemoveFromList(lpDrv0); - FreeLibrary(lpDrv->d.d32.hModule); + FreeLibrary(lpDrv0->d.d32.hModule); HeapFree(GetProcessHeap(), 0, lpDrv0); } FreeLibrary(lpDrv->d.d32.hModule); diff --git a/reactos/lib/winmm/joystick.c b/reactos/lib/winmm/joystick.c index e21831dc0ca..b95a91bc61f 100644 --- a/reactos/lib/winmm/joystick.c +++ b/reactos/lib/winmm/joystick.c @@ -139,7 +139,7 @@ UINT WINAPI joyGetNumDevs(void) /************************************************************************** * joyGetDevCapsA [WINMM.@] */ -MMRESULT WINAPI joyGetDevCapsA(UINT wID, LPJOYCAPSA lpCaps, UINT wSize) +MMRESULT WINAPI joyGetDevCapsA(UINT_PTR wID, LPJOYCAPSA lpCaps, UINT wSize) { if (wID >= MAXJOYSTICK) return JOYERR_PARMS; if (!JOY_LoadDriver(wID)) return MMSYSERR_NODRIVER; @@ -153,7 +153,7 @@ MMRESULT WINAPI joyGetDevCapsA(UINT wID, LPJOYCAPSA lpCaps, UINT wSize) /************************************************************************** * joyGetDevCapsW [WINMM.@] */ -MMRESULT WINAPI joyGetDevCapsW(UINT wID, LPJOYCAPSW lpCaps, UINT wSize) +MMRESULT WINAPI joyGetDevCapsW(UINT_PTR wID, LPJOYCAPSW lpCaps, UINT wSize) { JOYCAPSA jca; MMRESULT ret = joyGetDevCapsA(wID, &jca, sizeof(jca)); diff --git a/reactos/lib/winmm/lolvldrv.c b/reactos/lib/winmm/lolvldrv.c index 4246d1f0aa0..4eb6b5b7da4 100644 --- a/reactos/lib/winmm/lolvldrv.c +++ b/reactos/lib/winmm/lolvldrv.c @@ -171,8 +171,8 @@ UINT MMDRV_GetNum(UINT type) /************************************************************************** * MMDRV_Message [internal] */ -DWORD MMDRV_Message(LPWINE_MLD mld, WORD wMsg, DWORD dwParam1, - DWORD dwParam2, BOOL bFrom32) +DWORD MMDRV_Message(LPWINE_MLD mld, UINT wMsg, DWORD_PTR dwParam1, + DWORD_PTR dwParam2, BOOL bFrom32) { LPWINE_MM_DRIVER lpDrv; DWORD ret; @@ -502,7 +502,8 @@ UINT MMDRV_PhysicalFeatures(LPWINE_MLD mld, UINT uMsg, DWORD dwParam1, case DRV_QUERYDSOUNDDESC: /* Wine-specific: Retrieve DirectSound driver description*/ case DRV_QUERYDSOUNDGUID: /* Wine-specific: Retrieve DirectSound driver GUID */ return MMDRV_Message(mld, uMsg, dwParam1, dwParam2, TRUE); -#endif /* __REACTOS__ */ +#endif + default: WARN("Unknown call %04x\n", uMsg); return MMSYSERR_INVALPARAM; @@ -742,8 +743,9 @@ static BOOL MMDRV_InitFromRegistry(void) static BOOL MMDRV_InitHardcoded(void) { /* first load hardware drivers */ +#ifndef __REACTOS__ MMDRV_Install("wineoss.drv", "wineoss.drv", FALSE); - +#endif /* __REACTOS__ */ /* finish with mappers */ MMDRV_Install("wavemapper", "msacm.drv", TRUE); MMDRV_Install("midimapper", "midimap.drv", TRUE); diff --git a/reactos/lib/winmm/mci.c b/reactos/lib/winmm/mci.c index 79100505110..b22a00a9f00 100644 --- a/reactos/lib/winmm/mci.c +++ b/reactos/lib/winmm/mci.c @@ -1027,13 +1027,11 @@ DWORD WINAPI mciSendStringA(LPCSTR lpstrCommand, LPSTR lpstrRet, */ if (lpstrRet && uRetLen) *lpstrRet = '\0'; -#define STR_OF(_x) (IsBadReadPtr((char*)_x,1)?"?":(char*)(_x)) TRACE("[%d, %s, %08lx, %08lx/%s %08lx/%s %08lx/%s %08lx/%s %08lx/%s %08lx/%s]\n", wmd->wDeviceID, MCI_MessageToString(MCI_GetMessage(lpCmd)), dwFlags, - data[0], STR_OF(data[0]), data[1], STR_OF(data[1]), - data[2], STR_OF(data[2]), data[3], STR_OF(data[3]), - data[4], STR_OF(data[4]), data[5], STR_OF(data[5])); -#undef STR_OF + data[0], debugstr_a((char *)data[0]), data[1], debugstr_a((char *)data[1]), + data[2], debugstr_a((char *)data[2]), data[3], debugstr_a((char *)data[3]), + data[4], debugstr_a((char *)data[4]), data[5], debugstr_a((char *)data[5])); if (strcmp(verb, "open") == 0) { if ((dwRet = MCI_FinishOpen(wmd, (LPMCI_OPEN_PARMSA)data, dwFlags))) @@ -1157,7 +1155,7 @@ BOOL WINAPI mciFreeCommandResource(UINT uTable) /************************************************************************** * MCI_SendCommandFrom32 [internal] */ -DWORD MCI_SendCommandFrom32(UINT wDevID, UINT16 wMsg, DWORD dwParam1, DWORD dwParam2) +DWORD MCI_SendCommandFrom32(MCIDEVICEID wDevID, UINT16 wMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { DWORD dwRet = MCIERR_INVALID_DEVICE_ID; LPWINE_MCIDRIVER wmd = MCI_GetDriver(wDevID); @@ -1192,7 +1190,7 @@ DWORD MCI_SendCommandFrom32(UINT wDevID, UINT16 wMsg, DWORD dwParam1, DWORD dwPa /************************************************************************** * MCI_SendCommandFrom16 [internal] */ -DWORD MCI_SendCommandFrom16(UINT wDevID, UINT16 wMsg, DWORD dwParam1, DWORD dwParam2) +DWORD MCI_SendCommandFrom16(MCIDEVICEID wDevID, UINT16 wMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { DWORD dwRet = MCIERR_INVALID_DEVICE_ID; LPWINE_MCIDRIVER wmd = MCI_GetDriver(wDevID); diff --git a/reactos/lib/winmm/message16.c b/reactos/lib/winmm/message16.c new file mode 100644 index 00000000000..475c988d18a --- /dev/null +++ b/reactos/lib/winmm/message16.c @@ -0,0 +1,2778 @@ +/* -*- tab-width: 8; c-basic-offset: 4 -*- */ + +/* + * MMSYTEM MCI and low level mapping functions + * + * Copyright 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 + */ + +#include <string.h> +#include <stdarg.h> +#include <stdio.h> +#include <assert.h> +#include "wine/winbase16.h" +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "winver.h" +#include "wownt32.h" +#include "winemm16.h" +#include "digitalv.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(winmm); + +/************************************************************************** + * MMDRV_Callback [internal] + */ +static void MMDRV_Callback(LPWINE_MLD mld, HDRVR hDev, UINT uMsg, DWORD dwParam1, DWORD dwParam2) +{ + TRACE("CB (*%08lx)(%p %08x %08lx %08lx %08lx\n", + mld->dwCallback, hDev, uMsg, mld->dwClientInstance, dwParam1, dwParam2); + + if (!mld->bFrom32 && (mld->dwFlags & DCB_TYPEMASK) == DCB_FUNCTION) + { + WORD args[8]; + /* 16 bit func, call it */ + TRACE("Function (16 bit) !\n"); + + args[7] = HDRVR_16(hDev); + args[6] = uMsg; + args[5] = HIWORD(mld->dwClientInstance); + args[4] = LOWORD(mld->dwClientInstance); + args[3] = HIWORD(dwParam1); + args[2] = LOWORD(dwParam1); + args[1] = HIWORD(dwParam2); + args[0] = LOWORD(dwParam2); + WOWCallback16Ex( mld->dwCallback, WCB16_PASCAL, sizeof(args), args, NULL ); + } else { + DriverCallback(mld->dwCallback, mld->dwFlags, hDev, uMsg, + mld->dwClientInstance, dwParam1, dwParam2); + } +} + +/* ================================= + * A U X M A P P E R S + * ================================= */ + +/************************************************************************** + * MMDRV_Aux_Map16To32A [internal] + */ +static WINMM_MapType MMDRV_Aux_Map16To32A (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2) +{ + return WINMM_MAP_MSGERROR; +} + +/************************************************************************** + * MMDRV_Aux_UnMap16To32A [internal] + */ +static WINMM_MapType MMDRV_Aux_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret) +{ + return WINMM_MAP_MSGERROR; +} + +/************************************************************************** + * MMDRV_Aux_Map32ATo16 [internal] + */ +static WINMM_MapType MMDRV_Aux_Map32ATo16 (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2) +{ + return WINMM_MAP_MSGERROR; +} + +/************************************************************************** + * MMDRV_Aux_UnMap32ATo16 [internal] + */ +static WINMM_MapType MMDRV_Aux_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret) +{ +#if 0 + case AUXDM_GETDEVCAPS: + lpCaps->wMid = ac16.wMid; + lpCaps->wPid = ac16.wPid; + lpCaps->vDriverVersion = ac16.vDriverVersion; + strcpy(lpCaps->szPname, ac16.szPname); + lpCaps->wTechnology = ac16.wTechnology; + lpCaps->dwSupport = ac16.dwSupport; +#endif + return WINMM_MAP_MSGERROR; +} + +/************************************************************************** + * MMDRV_Aux_Callback [internal] + */ +static void CALLBACK MMDRV_Aux_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2) +{ + LPWINE_MLD mld = (LPWINE_MLD)dwInstance; + + FIXME("NIY\n"); + MMDRV_Callback(mld, hDev, uMsg, dwParam1, dwParam2); +} + +/* ================================= + * M I X E R M A P P E R S + * ================================= */ + +/************************************************************************** + * xMMDRV_Mixer_Map16To32A [internal] + */ +static WINMM_MapType MMDRV_Mixer_Map16To32A (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2) +{ + return WINMM_MAP_MSGERROR; +} + +/************************************************************************** + * MMDRV_Mixer_UnMap16To32A [internal] + */ +static WINMM_MapType MMDRV_Mixer_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret) +{ +#if 0 + MIXERCAPSA micA; + UINT ret = mixerGetDevCapsA(devid, &micA, sizeof(micA)); + + if (ret == MMSYSERR_NOERROR) { + mixcaps->wMid = micA.wMid; + mixcaps->wPid = micA.wPid; + mixcaps->vDriverVersion = micA.vDriverVersion; + strcpy(mixcaps->szPname, micA.szPname); + mixcaps->fdwSupport = micA.fdwSupport; + mixcaps->cDestinations = micA.cDestinations; + } + return ret; +#endif + return WINMM_MAP_MSGERROR; +} + +/************************************************************************** + * MMDRV_Mixer_Map32ATo16 [internal] + */ +static WINMM_MapType MMDRV_Mixer_Map32ATo16 (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2) +{ + return WINMM_MAP_MSGERROR; +} + +/************************************************************************** + * MMDRV_Mixer_UnMap32ATo16 [internal] + */ +static WINMM_MapType MMDRV_Mixer_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret) +{ + return WINMM_MAP_MSGERROR; +} + +/************************************************************************** + * MMDRV_Mixer_Callback [internal] + */ +static void CALLBACK MMDRV_Mixer_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2) +{ + LPWINE_MLD mld = (LPWINE_MLD)dwInstance; + + FIXME("NIY\n"); + MMDRV_Callback(mld, hDev, uMsg, dwParam1, dwParam2); +} + +/* ================================= + * M I D I I N M A P P E R S + * ================================= */ + +/************************************************************************** + * MMDRV_MidiIn_Map16To32A [internal] + */ +static WINMM_MapType MMDRV_MidiIn_Map16To32A (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2) +{ + return WINMM_MAP_MSGERROR; +} + +/************************************************************************** + * MMDRV_MidiIn_UnMap16To32A [internal] + */ +static WINMM_MapType MMDRV_MidiIn_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret) +{ + return WINMM_MAP_MSGERROR; +} + +/************************************************************************** + * MMDRV_MidiIn_Map32ATo16 [internal] + */ +static WINMM_MapType MMDRV_MidiIn_Map32ATo16 (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2) +{ + return WINMM_MAP_MSGERROR; +} + +/************************************************************************** + * MMDRV_MidiIn_UnMap32ATo16 [internal] + */ +static WINMM_MapType MMDRV_MidiIn_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret) +{ + return WINMM_MAP_MSGERROR; +} + +/************************************************************************** + * MMDRV_MidiIn_Callback [internal] + */ +static void CALLBACK MMDRV_MidiIn_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2) +{ + LPWINE_MLD mld = (LPWINE_MLD)dwInstance; + + switch (uMsg) { + case MIM_OPEN: + case MIM_CLOSE: + /* dwParam1 & dwParam2 are supposed to be 0, nothing to do */ + + case MIM_DATA: + case MIM_MOREDATA: + case MIM_ERROR: + /* dwParam1 & dwParam2 are are data, nothing to do */ + break; + case MIM_LONGDATA: + case MIM_LONGERROR: + /* dwParam1 points to a MidiHdr, work to be done !!! */ + if (mld->bFrom32 && !MMDRV_Is32(mld->mmdIndex)) { + /* initial map is: 32 => 16 */ + LPMIDIHDR mh16 = MapSL(dwParam1); + LPMIDIHDR mh32 = *(LPMIDIHDR*)((LPSTR)mh16 - sizeof(LPMIDIHDR)); + + dwParam1 = (DWORD)mh32; + mh32->dwFlags = mh16->dwFlags; + mh32->dwBytesRecorded = mh16->dwBytesRecorded; + if (mh32->reserved >= sizeof(MIDIHDR)) + mh32->dwOffset = mh16->dwOffset; + } else if (!mld->bFrom32 && MMDRV_Is32(mld->mmdIndex)) { + /* initial map is: 16 => 32 */ + LPMIDIHDR mh32 = (LPMIDIHDR)(dwParam1); + SEGPTR segmh16 = *(SEGPTR*)((LPSTR)mh32 - sizeof(LPMIDIHDR)); + LPMIDIHDR mh16 = MapSL(segmh16); + + dwParam1 = (DWORD)segmh16; + mh16->dwFlags = mh32->dwFlags; + mh16->dwBytesRecorded = mh32->dwBytesRecorded; + if (mh16->reserved >= sizeof(MIDIHDR)) + mh16->dwOffset = mh32->dwOffset; + } + /* else { 16 => 16 or 32 => 32, nothing to do, same struct is kept }*/ + break; + /* case MOM_POSITIONCB: */ + default: + ERR("Unknown msg %u\n", uMsg); + } + + MMDRV_Callback(mld, hDev, uMsg, dwParam1, dwParam2); +} + +/* ================================= + * M I D I O U T M A P P E R S + * ================================= */ + +/************************************************************************** + * MMDRV_MidiOut_Map16To32A [internal] + */ +static WINMM_MapType MMDRV_MidiOut_Map16To32A (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2) +{ + WINMM_MapType ret = WINMM_MAP_MSGERROR; + + switch (wMsg) { + case MODM_GETNUMDEVS: + case MODM_DATA: + case MODM_RESET: + case MODM_SETVOLUME: + ret = WINMM_MAP_OK; + break; + + case MODM_OPEN: + case MODM_CLOSE: + case MODM_GETVOLUME: + FIXME("Shouldn't be used: the corresponding 16 bit functions use the 32 bit interface\n"); + break; + + case MODM_GETDEVCAPS: + { + LPMIDIOUTCAPSA moc32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMIDIOUTCAPS16) + sizeof(MIDIOUTCAPSA)); + LPMIDIOUTCAPS16 moc16 = MapSL(*lpParam1); + + if (moc32) { + *(LPMIDIOUTCAPS16*)moc32 = moc16; + moc32 = (LPMIDIOUTCAPSA)((LPSTR)moc32 + sizeof(LPMIDIOUTCAPS16)); + *lpParam1 = (DWORD)moc32; + *lpParam2 = sizeof(MIDIOUTCAPSA); + + ret = WINMM_MAP_OKMEM; + } else { + ret = WINMM_MAP_NOMEM; + } + } + break; + case MODM_PREPARE: + { + LPMIDIHDR mh32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMIDIHDR) + sizeof(MIDIHDR)); + LPMIDIHDR mh16 = MapSL(*lpParam1); + + if (mh32) { + *(LPMIDIHDR*)mh32 = (LPMIDIHDR)*lpParam1; + mh32 = (LPMIDIHDR)((LPSTR)mh32 + sizeof(LPMIDIHDR)); + mh32->lpData = MapSL((SEGPTR)mh16->lpData); + mh32->dwBufferLength = mh16->dwBufferLength; + mh32->dwBytesRecorded = mh16->dwBytesRecorded; + mh32->dwUser = mh16->dwUser; + mh32->dwFlags = mh16->dwFlags; + /* FIXME: nothing on mh32->lpNext */ + /* could link the mh32->lpNext at this level for memory house keeping */ + mh32->dwOffset = (*lpParam2 >= sizeof(MIDIHDR)) ? ((LPMIDIHDR)mh16)->dwOffset : 0; + mh16->lpNext = mh32; /* for reuse in unprepare and write */ + /* store size of passed MIDIHDR?? structure to know if dwOffset is available or not */ + mh16->reserved = *lpParam2; + *lpParam1 = (DWORD)mh32; + *lpParam2 = sizeof(MIDIHDR); + + ret = WINMM_MAP_OKMEM; + } else { + ret = WINMM_MAP_NOMEM; + } + } + break; + case MODM_UNPREPARE: + case MODM_LONGDATA: + { + LPMIDIHDR mh16 = MapSL(*lpParam1); + LPMIDIHDR mh32 = (LPMIDIHDR)mh16->lpNext; + + *lpParam1 = (DWORD)mh32; + *lpParam2 = sizeof(MIDIHDR); + /* dwBufferLength can be reduced between prepare & write */ + if (wMsg == MODM_LONGDATA && mh32->dwBufferLength < mh16->dwBufferLength) { + ERR("Size of buffer has been increased from %ld to %ld, keeping initial value\n", + mh32->dwBufferLength, mh16->dwBufferLength); + } else + mh32->dwBufferLength = mh16->dwBufferLength; + ret = WINMM_MAP_OKMEM; + } + break; + + case MODM_CACHEPATCHES: + case MODM_CACHEDRUMPATCHES: + default: + FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2); + break; + } + return ret; +} + +/************************************************************************** + * MMDRV_MidiOut_UnMap16To32A [internal] + */ +static WINMM_MapType MMDRV_MidiOut_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret) +{ + WINMM_MapType ret = WINMM_MAP_MSGERROR; + + switch (wMsg) { + case MODM_GETNUMDEVS: + case MODM_DATA: + case MODM_RESET: + case MODM_SETVOLUME: + ret = WINMM_MAP_OK; + break; + + case MODM_OPEN: + case MODM_CLOSE: + case MODM_GETVOLUME: + FIXME("Shouldn't be used: the corresponding 16 bit functions use the 32 bit interface\n"); + break; + + case MODM_GETDEVCAPS: + { + LPMIDIOUTCAPSA moc32 = (LPMIDIOUTCAPSA)(*lpParam1); + LPMIDIOUTCAPS16 moc16 = *(LPMIDIOUTCAPS16*)((LPSTR)moc32 - sizeof(LPMIDIOUTCAPS16)); + + moc16->wMid = moc32->wMid; + moc16->wPid = moc32->wPid; + moc16->vDriverVersion = moc32->vDriverVersion; + strcpy(moc16->szPname, moc32->szPname); + moc16->wTechnology = moc32->wTechnology; + moc16->wVoices = moc32->wVoices; + moc16->wNotes = moc32->wNotes; + moc16->wChannelMask = moc32->wChannelMask; + moc16->dwSupport = moc32->dwSupport; + HeapFree(GetProcessHeap(), 0, (LPSTR)moc32 - sizeof(LPMIDIOUTCAPS16)); + ret = WINMM_MAP_OK; + } + break; + case MODM_PREPARE: + case MODM_UNPREPARE: + case MODM_LONGDATA: + { + LPMIDIHDR mh32 = (LPMIDIHDR)(*lpParam1); + LPMIDIHDR mh16 = MapSL(*(SEGPTR*)((LPSTR)mh32 - sizeof(LPMIDIHDR))); + + assert(mh16->lpNext == mh32); + mh16->dwBufferLength = mh32->dwBufferLength; + mh16->dwBytesRecorded = mh32->dwBytesRecorded; + mh16->dwUser = mh32->dwUser; + mh16->dwFlags = mh32->dwFlags; + if (mh16->reserved >= sizeof(MIDIHDR)) + mh16->dwOffset = mh32->dwOffset; + + if (wMsg == MODM_UNPREPARE && fn_ret == MMSYSERR_NOERROR) { + HeapFree(GetProcessHeap(), 0, (LPSTR)mh32 - sizeof(LPMIDIHDR)); + mh16->lpNext = 0; + } + ret = WINMM_MAP_OK; + } + break; + + case MODM_CACHEPATCHES: + case MODM_CACHEDRUMPATCHES: + default: + FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2); + break; + } + return ret; +} + +/************************************************************************** + * MMDRV_MidiOut_Map32ATo16 [internal] + */ +static WINMM_MapType MMDRV_MidiOut_Map32ATo16 (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2) +{ + WINMM_MapType ret = WINMM_MAP_MSGERROR; + + switch (wMsg) { + case MODM_CLOSE: + case MODM_GETNUMDEVS: + case MODM_DATA: + case MODM_RESET: + case MODM_SETVOLUME: + ret = WINMM_MAP_OK; + break; + case MODM_GETDEVCAPS: + { + LPMIDIOUTCAPSA moc32 = (LPMIDIOUTCAPSA)*lpParam1; + LPSTR ptr = HeapAlloc( GetProcessHeap(), 0, sizeof(LPMIDIOUTCAPSA)+sizeof(MIDIOUTCAPS16)); + + if (ptr) { + *(LPMIDIOUTCAPSA*)ptr = moc32; + ret = WINMM_MAP_OKMEM; + } else { + ret = WINMM_MAP_NOMEM; + } + *lpParam1 = (DWORD)MapLS(ptr) + sizeof(LPMIDIOUTCAPSA); + *lpParam2 = sizeof(MIDIOUTCAPS16); + } + break; + case MODM_PREPARE: + { + LPMIDIHDR mh32 = (LPMIDIHDR)*lpParam1; + LPMIDIHDR mh16; + LPVOID ptr = HeapAlloc( GetProcessHeap(), 0, + sizeof(LPMIDIHDR) + sizeof(MIDIHDR) + mh32->dwBufferLength); + + if (ptr) { + *(LPMIDIHDR*)ptr = mh32; + mh16 = (LPMIDIHDR)((LPSTR)ptr + sizeof(LPMIDIHDR)); + *lpParam1 = MapLS(mh16); + mh16->lpData = (LPSTR)*lpParam1 + sizeof(MIDIHDR); + /* data will be copied on WODM_WRITE */ + mh16->dwBufferLength = mh32->dwBufferLength; + mh16->dwBytesRecorded = mh32->dwBytesRecorded; + mh16->dwUser = mh32->dwUser; + mh16->dwFlags = mh32->dwFlags; + /* FIXME: nothing on mh32->lpNext */ + /* could link the mh32->lpNext at this level for memory house keeping */ + mh16->dwOffset = (*lpParam2 >= sizeof(MIDIHDR)) ? mh32->dwOffset : 0; + + mh32->lpNext = (LPMIDIHDR)mh16; /* for reuse in unprepare and write */ + mh32->reserved = *lpParam2; + + TRACE("mh16=%08lx mh16->lpData=%08lx mh32->buflen=%lu mh32->lpData=%08lx\n", + *lpParam1, (DWORD)mh16->lpData, + mh32->dwBufferLength, (DWORD)mh32->lpData); + *lpParam2 = sizeof(MIDIHDR); + + ret = WINMM_MAP_OKMEM; + } else { + ret = WINMM_MAP_NOMEM; + } + } + break; + case MODM_UNPREPARE: + case MODM_LONGDATA: + { + LPMIDIHDR mh32 = (LPMIDIHDR)(*lpParam1); + LPMIDIHDR mh16 = (LPMIDIHDR)mh32->lpNext; + LPSTR ptr = (LPSTR)mh16 - sizeof(LPMIDIHDR); + + assert(*(LPMIDIHDR*)ptr == mh32); + + if (wMsg == MODM_LONGDATA) + memcpy((LPSTR)mh16 + sizeof(MIDIHDR), mh32->lpData, mh32->dwBufferLength); + + *lpParam1 = MapLS(mh16); + *lpParam2 = sizeof(MIDIHDR); + TRACE("mh16=%08lx mh16->lpData=%08lx mh32->buflen=%lu mh32->lpData=%08lx\n", + *lpParam1, (DWORD)mh16->lpData, mh32->dwBufferLength, (DWORD)mh32->lpData); + + /* dwBufferLength can be reduced between prepare & write */ + if (wMsg == MODM_LONGDATA && mh16->dwBufferLength < mh32->dwBufferLength) { + ERR("Size of buffer has been increased from %ld to %ld, keeping initial value\n", + mh16->dwBufferLength, mh32->dwBufferLength); + } else + mh16->dwBufferLength = mh32->dwBufferLength; + ret = WINMM_MAP_OKMEM; + } + break; + case MODM_OPEN: + { + LPMIDIOPENDESC mod32 = (LPMIDIOPENDESC)*lpParam1; + LPVOID ptr; + LPMIDIOPENDESC16 mod16; + + /* allocated data are mapped as follows: + LPMIDIOPENDESC ptr to orig lParam1 + DWORD orig dwUser, which is a pointer to DWORD:driver dwInstance + DWORD dwUser passed to driver + MIDIOPENDESC16 mod16: openDesc passed to driver + MIDIOPENSTRMID cIds + */ + ptr = HeapAlloc( GetProcessHeap(), 0, + sizeof(LPMIDIOPENDESC) + 2*sizeof(DWORD) + sizeof(MIDIOPENDESC16) + + mod32->cIds ? (mod32->cIds - 1) * sizeof(MIDIOPENSTRMID) : 0); + + if (ptr) { + SEGPTR segptr = MapLS(ptr); + *(LPMIDIOPENDESC*)ptr = mod32; + *(LPDWORD)((char*)ptr + sizeof(LPMIDIOPENDESC)) = *lpdwUser; + mod16 = (LPMIDIOPENDESC16)((LPSTR)ptr + sizeof(LPMIDIOPENDESC) + 2*sizeof(DWORD)); + + mod16->hMidi = HMIDI_16(mod32->hMidi); + mod16->dwCallback = mod32->dwCallback; + mod16->dwInstance = mod32->dwInstance; + mod16->dnDevNode = mod32->dnDevNode; + mod16->cIds = mod32->cIds; + memcpy(&mod16->rgIds, &mod32->rgIds, mod32->cIds * sizeof(MIDIOPENSTRMID)); + + *lpParam1 = (DWORD)segptr + sizeof(LPMIDIOPENDESC) + 2*sizeof(DWORD); + *lpdwUser = (DWORD)segptr + sizeof(LPMIDIOPENDESC) + sizeof(DWORD); + + ret = WINMM_MAP_OKMEM; + } else { + ret = WINMM_MAP_NOMEM; + } + } + break; + case MODM_GETVOLUME: + case MODM_CACHEPATCHES: + case MODM_CACHEDRUMPATCHES: + default: + FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2); + break; + } + return ret; +} + +/************************************************************************** + * MMDRV_MidiOut_UnMap32ATo16 [internal] + */ +static WINMM_MapType MMDRV_MidiOut_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret) +{ + WINMM_MapType ret = WINMM_MAP_MSGERROR; + + switch (wMsg) { + case MODM_CLOSE: + case MODM_GETNUMDEVS: + case MODM_DATA: + case MODM_RESET: + case MODM_SETVOLUME: + ret = WINMM_MAP_OK; + break; + case MODM_GETDEVCAPS: + { + LPMIDIOUTCAPS16 moc16 = MapSL(*lpParam1); + LPSTR ptr = (LPSTR)moc16 - sizeof(LPMIDIOUTCAPSA); + LPMIDIOUTCAPSA moc32 = *(LPMIDIOUTCAPSA*)ptr; + + moc32->wMid = moc16->wMid; + moc32->wPid = moc16->wPid; + moc32->vDriverVersion = moc16->vDriverVersion; + strcpy(moc32->szPname, moc16->szPname); + moc32->wTechnology = moc16->wTechnology; + moc32->wVoices = moc16->wVoices; + moc32->wNotes = moc16->wNotes; + moc32->wChannelMask = moc16->wChannelMask; + moc32->dwSupport = moc16->dwSupport; + UnMapLS( *lpParam1 ); + HeapFree( GetProcessHeap(), 0, ptr ); + ret = WINMM_MAP_OK; + } + break; + case MODM_PREPARE: + case MODM_UNPREPARE: + case MODM_LONGDATA: + { + LPMIDIHDR mh16 = MapSL(*lpParam1); + LPSTR ptr = (LPSTR)mh16 - sizeof(LPMIDIHDR); + LPMIDIHDR mh32 = *(LPMIDIHDR*)ptr; + + assert(mh32->lpNext == (LPMIDIHDR)mh16); + UnMapLS( *lpParam1 ); + mh32->dwBytesRecorded = mh16->dwBytesRecorded; + mh32->dwUser = mh16->dwUser; + mh32->dwFlags = mh16->dwFlags; + + if (wMsg == MODM_UNPREPARE && fn_ret == MMSYSERR_NOERROR) { + HeapFree( GetProcessHeap(), 0, ptr ); + mh32->lpNext = 0; + } + ret = WINMM_MAP_OK; + } + break; + case MODM_OPEN: + { + LPMIDIOPENDESC16 mod16 = MapSL(*lpParam1); + LPSTR ptr = (LPSTR)mod16 - sizeof(LPMIDIOPENDESC) - 2*sizeof(DWORD); + UnMapLS( *lpParam1 ); + **(DWORD**)(ptr + sizeof(LPMIDIOPENDESC)) = *(LPDWORD)(ptr + sizeof(LPMIDIOPENDESC) + sizeof(DWORD)); + + HeapFree( GetProcessHeap(), 0, ptr ); + ret = WINMM_MAP_OK; + } + break; + case MODM_GETVOLUME: + case MODM_CACHEPATCHES: + case MODM_CACHEDRUMPATCHES: + default: + FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2); + break; + } + return ret; +} + +/************************************************************************** + * MMDRV_MidiOut_Callback [internal] + */ +static void CALLBACK MMDRV_MidiOut_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2) +{ + LPWINE_MLD mld = (LPWINE_MLD)dwInstance; + + switch (uMsg) { + case MOM_OPEN: + case MOM_CLOSE: + /* dwParam1 & dwParam2 are supposed to be 0, nothing to do */ + break; + case MOM_DONE: + if (mld->bFrom32 && !MMDRV_Is32(mld->mmdIndex)) { + /* initial map is: 32 => 16 */ + LPMIDIHDR mh16 = MapSL(dwParam1); + LPMIDIHDR mh32 = *(LPMIDIHDR*)((LPSTR)mh16 - sizeof(LPMIDIHDR)); + + dwParam1 = (DWORD)mh32; + mh32->dwFlags = mh16->dwFlags; + mh32->dwOffset = mh16->dwOffset; + if (mh32->reserved >= sizeof(MIDIHDR)) + mh32->dwOffset = mh16->dwOffset; + } else if (!mld->bFrom32 && MMDRV_Is32(mld->mmdIndex)) { + /* initial map is: 16 => 32 */ + LPMIDIHDR mh32 = (LPMIDIHDR)(dwParam1); + SEGPTR segmh16 = *(SEGPTR*)((LPSTR)mh32 - sizeof(LPMIDIHDR)); + LPMIDIHDR mh16 = MapSL(segmh16); + + dwParam1 = (DWORD)segmh16; + mh16->dwFlags = mh32->dwFlags; + if (mh16->reserved >= sizeof(MIDIHDR)) + mh16->dwOffset = mh32->dwOffset; + } + /* else { 16 => 16 or 32 => 32, nothing to do, same struct is kept }*/ + break; + /* case MOM_POSITIONCB: */ + default: + ERR("Unknown msg %u\n", uMsg); + } + + MMDRV_Callback(mld, hDev, uMsg, dwParam1, dwParam2); +} + +/* ================================= + * W A V E I N M A P P E R S + * ================================= */ + +/************************************************************************** + * MMDRV_WaveIn_Map16To32A [internal] + */ +static WINMM_MapType MMDRV_WaveIn_Map16To32A (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2) +{ + WINMM_MapType ret = WINMM_MAP_MSGERROR; + + switch (wMsg) { + case WIDM_GETNUMDEVS: + case WIDM_RESET: + case WIDM_START: + case WIDM_STOP: + ret = WINMM_MAP_OK; + break; + case WIDM_OPEN: + case WIDM_CLOSE: + FIXME("Shouldn't be used: the corresponding 16 bit functions use the 32 bit interface\n"); + break; + case WIDM_GETDEVCAPS: + { + LPWAVEINCAPSA wic32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPWAVEINCAPS16) + sizeof(WAVEINCAPSA)); + LPWAVEINCAPS16 wic16 = MapSL(*lpParam1); + + if (wic32) { + *(LPWAVEINCAPS16*)wic32 = wic16; + wic32 = (LPWAVEINCAPSA)((LPSTR)wic32 + sizeof(LPWAVEINCAPS16)); + *lpParam1 = (DWORD)wic32; + *lpParam2 = sizeof(WAVEINCAPSA); + + ret = WINMM_MAP_OKMEM; + } else { + ret = WINMM_MAP_NOMEM; + } + } + break; + case WIDM_GETPOS: + { + LPMMTIME mmt32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMMTIME16) + sizeof(MMTIME)); + LPMMTIME16 mmt16 = MapSL(*lpParam1); + + if (mmt32) { + *(LPMMTIME16*)mmt32 = mmt16; + mmt32 = (LPMMTIME)((LPSTR)mmt32 + sizeof(LPMMTIME16)); + + mmt32->wType = mmt16->wType; + *lpParam1 = (DWORD)mmt32; + *lpParam2 = sizeof(MMTIME); + + ret = WINMM_MAP_OKMEM; + } else { + ret = WINMM_MAP_NOMEM; + } + } + break; + case WIDM_PREPARE: + { + LPWAVEHDR wh32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPWAVEHDR) + sizeof(WAVEHDR)); + LPWAVEHDR wh16 = MapSL(*lpParam1); + + if (wh32) { + *(LPWAVEHDR*)wh32 = (LPWAVEHDR)*lpParam1; + wh32 = (LPWAVEHDR)((LPSTR)wh32 + sizeof(LPWAVEHDR)); + wh32->lpData = MapSL((SEGPTR)wh16->lpData); + wh32->dwBufferLength = wh16->dwBufferLength; + wh32->dwBytesRecorded = wh16->dwBytesRecorded; + wh32->dwUser = wh16->dwUser; + wh32->dwFlags = wh16->dwFlags; + wh32->dwLoops = wh16->dwLoops; + /* FIXME: nothing on wh32->lpNext */ + /* could link the wh32->lpNext at this level for memory house keeping */ + wh16->lpNext = wh32; /* for reuse in unprepare and write */ + *lpParam1 = (DWORD)wh32; + *lpParam2 = sizeof(WAVEHDR); + + ret = WINMM_MAP_OKMEM; + } else { + ret = WINMM_MAP_NOMEM; + } + } + break; + case WIDM_ADDBUFFER: + case WIDM_UNPREPARE: + { + LPWAVEHDR wh16 = MapSL(*lpParam1); + LPWAVEHDR wh32 = (LPWAVEHDR)wh16->lpNext; + + *lpParam1 = (DWORD)wh32; + *lpParam2 = sizeof(WAVEHDR); + /* dwBufferLength can be reduced between prepare & write */ + if (wMsg == WIDM_ADDBUFFER && wh32->dwBufferLength < wh16->dwBufferLength) { + ERR("Size of buffer has been increased from %ld to %ld, keeping initial value\n", + wh32->dwBufferLength, wh16->dwBufferLength); + } else + wh32->dwBufferLength = wh16->dwBufferLength; + ret = WINMM_MAP_OKMEM; + } + break; + case WIDM_MAPPER_STATUS: + /* just a single DWORD */ + *lpParam2 = (DWORD)MapSL(*lpParam2); + ret = WINMM_MAP_OK; + break; + default: + FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2); + break; + } + return ret; +} + +/************************************************************************** + * MMDRV_WaveIn_UnMap16To32A [internal] + */ +static WINMM_MapType MMDRV_WaveIn_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret) +{ + WINMM_MapType ret = WINMM_MAP_MSGERROR; + + switch (wMsg) { + case WIDM_GETNUMDEVS: + case WIDM_RESET: + case WIDM_START: + case WIDM_STOP: + case WIDM_MAPPER_STATUS: + ret = WINMM_MAP_OK; + break; + case WIDM_OPEN: + case WIDM_CLOSE: + FIXME("Shouldn't be used: the corresponding 16 bit functions use the 32 bit interface\n"); + break; + case WIDM_GETDEVCAPS: + { + LPWAVEINCAPSA wic32 = (LPWAVEINCAPSA)(*lpParam1); + LPWAVEINCAPS16 wic16 = *(LPWAVEINCAPS16*)((LPSTR)wic32 - sizeof(LPWAVEINCAPS16)); + + wic16->wMid = wic32->wMid; + wic16->wPid = wic32->wPid; + wic16->vDriverVersion = wic32->vDriverVersion; + strcpy(wic16->szPname, wic32->szPname); + wic16->dwFormats = wic32->dwFormats; + wic16->wChannels = wic32->wChannels; + HeapFree(GetProcessHeap(), 0, (LPSTR)wic32 - sizeof(LPWAVEINCAPS16)); + ret = WINMM_MAP_OK; + } + break; + case WIDM_GETPOS: + { + LPMMTIME mmt32 = (LPMMTIME)(*lpParam1); + LPMMTIME16 mmt16 = *(LPMMTIME16*)((LPSTR)mmt32 - sizeof(LPMMTIME16)); + + MMSYSTEM_MMTIME32to16(mmt16, mmt32); + HeapFree(GetProcessHeap(), 0, (LPSTR)mmt32 - sizeof(LPMMTIME16)); + ret = WINMM_MAP_OK; + } + break; + case WIDM_ADDBUFFER: + case WIDM_PREPARE: + case WIDM_UNPREPARE: + { + LPWAVEHDR wh32 = (LPWAVEHDR)(*lpParam1); + LPWAVEHDR wh16 = MapSL(*(SEGPTR*)((LPSTR)wh32 - sizeof(LPWAVEHDR))); + + assert(wh16->lpNext == wh32); + wh16->dwBufferLength = wh32->dwBufferLength; + wh16->dwBytesRecorded = wh32->dwBytesRecorded; + wh16->dwUser = wh32->dwUser; + wh16->dwFlags = wh32->dwFlags; + wh16->dwLoops = wh32->dwLoops; + + if (wMsg == WIDM_UNPREPARE && fn_ret == MMSYSERR_NOERROR) { + HeapFree(GetProcessHeap(), 0, (LPSTR)wh32 - sizeof(LPWAVEHDR)); + wh16->lpNext = 0; + } + ret = WINMM_MAP_OK; + } + break; + default: + FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2); + break; + } + return ret; +} + +/************************************************************************** + * MMDRV_WaveIn_Map32ATo16 [internal] + */ +static WINMM_MapType MMDRV_WaveIn_Map32ATo16 (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2) +{ + WINMM_MapType ret = WINMM_MAP_MSGERROR; + + switch (wMsg) { + case WIDM_CLOSE: + case WIDM_GETNUMDEVS: + case WIDM_RESET: + case WIDM_START: + case WIDM_STOP: + ret = WINMM_MAP_OK; + break; + + case WIDM_OPEN: + { + LPWAVEOPENDESC wod32 = (LPWAVEOPENDESC)*lpParam1; + int sz = sizeof(WAVEFORMATEX); + LPVOID ptr; + LPWAVEOPENDESC16 wod16; + + /* allocated data are mapped as follows: + LPWAVEOPENDESC ptr to orig lParam1 + DWORD orig dwUser, which is a pointer to DWORD:driver dwInstance + DWORD dwUser passed to driver + WAVEOPENDESC16 wod16: openDesc passed to driver + WAVEFORMATEX openDesc->lpFormat passed to driver + xxx extra bytes to WAVEFORMATEX + */ + if (wod32->lpFormat->wFormatTag != WAVE_FORMAT_PCM) { + TRACE("Allocating %u extra bytes (%d)\n", ((LPWAVEFORMATEX)wod32->lpFormat)->cbSize, wod32->lpFormat->wFormatTag); + sz += ((LPWAVEFORMATEX)wod32->lpFormat)->cbSize; + } + + ptr = HeapAlloc( GetProcessHeap(), 0, + sizeof(LPWAVEOPENDESC) + 2*sizeof(DWORD) + sizeof(WAVEOPENDESC16) + sz); + + if (ptr) { + SEGPTR seg_ptr = MapLS( ptr ); + *(LPWAVEOPENDESC*)ptr = wod32; + *(LPDWORD)((char*)ptr + sizeof(LPWAVEOPENDESC)) = *lpdwUser; + wod16 = (LPWAVEOPENDESC16)((LPSTR)ptr + sizeof(LPWAVEOPENDESC) + 2*sizeof(DWORD)); + + wod16->hWave = HWAVE_16(wod32->hWave); + wod16->lpFormat = (LPWAVEFORMATEX)(seg_ptr + sizeof(LPWAVEOPENDESC) + 2*sizeof(DWORD) + sizeof(WAVEOPENDESC16)); + memcpy(wod16 + 1, wod32->lpFormat, sz); + + wod16->dwCallback = wod32->dwCallback; + wod16->dwInstance = wod32->dwInstance; + wod16->uMappedDeviceID = wod32->uMappedDeviceID; + wod16->dnDevNode = wod32->dnDevNode; + + *lpParam1 = seg_ptr + sizeof(LPWAVEOPENDESC) + 2*sizeof(DWORD); + *lpdwUser = seg_ptr + sizeof(LPWAVEOPENDESC) + sizeof(DWORD); + + ret = WINMM_MAP_OKMEM; + } else { + ret = WINMM_MAP_NOMEM; + } + } + break; + case WIDM_PREPARE: + { + LPWAVEHDR wh32 = (LPWAVEHDR)*lpParam1; + LPWAVEHDR wh16; + LPVOID ptr = HeapAlloc( GetProcessHeap(), 0, + sizeof(LPWAVEHDR) + sizeof(WAVEHDR) + wh32->dwBufferLength); + + if (ptr) { + SEGPTR seg_ptr = MapLS( ptr ); + *(LPWAVEHDR*)ptr = wh32; + wh16 = (LPWAVEHDR)((LPSTR)ptr + sizeof(LPWAVEHDR)); + wh16->lpData = (LPSTR)seg_ptr + sizeof(LPWAVEHDR) + sizeof(WAVEHDR); + /* data will be copied on WODM_WRITE */ + wh16->dwBufferLength = wh32->dwBufferLength; + wh16->dwBytesRecorded = wh32->dwBytesRecorded; + wh16->dwUser = wh32->dwUser; + wh16->dwFlags = wh32->dwFlags; + wh16->dwLoops = wh32->dwLoops; + /* FIXME: nothing on wh32->lpNext */ + /* could link the wh32->lpNext at this level for memory house keeping */ + wh32->lpNext = wh16; /* for reuse in unprepare and write */ + TRACE("wh16=%08lx wh16->lpData=%08lx wh32->buflen=%lu wh32->lpData=%08lx\n", + seg_ptr + sizeof(LPWAVEHDR), (DWORD)wh16->lpData, + wh32->dwBufferLength, (DWORD)wh32->lpData); + *lpParam1 = seg_ptr + sizeof(LPWAVEHDR); + *lpParam2 = sizeof(WAVEHDR); + + ret = WINMM_MAP_OKMEM; + } else { + ret = WINMM_MAP_NOMEM; + } + } + break; + case WIDM_ADDBUFFER: + case WIDM_UNPREPARE: + { + LPWAVEHDR wh32 = (LPWAVEHDR)(*lpParam1); + LPWAVEHDR wh16 = wh32->lpNext; + LPSTR ptr = (LPSTR)wh16 - sizeof(LPWAVEHDR); + SEGPTR seg_ptr = MapLS( ptr ); + + assert(*(LPWAVEHDR*)ptr == wh32); + + TRACE("wh16=%08lx wh16->lpData=%08lx wh32->buflen=%lu wh32->lpData=%08lx\n", + seg_ptr + sizeof(LPWAVEHDR), (DWORD)wh16->lpData, + wh32->dwBufferLength, (DWORD)wh32->lpData); + + if (wMsg == WIDM_ADDBUFFER) + memcpy((LPSTR)wh16 + sizeof(WAVEHDR), wh32->lpData, wh32->dwBufferLength); + + *lpParam1 = seg_ptr + sizeof(LPWAVEHDR); + *lpParam2 = sizeof(WAVEHDR); + /* dwBufferLength can be reduced between prepare & write */ + if (wMsg == WIDM_ADDBUFFER && wh16->dwBufferLength < wh32->dwBufferLength) { + ERR("Size of buffer has been increased from %ld to %ld, keeping initial value\n", + wh16->dwBufferLength, wh32->dwBufferLength); + } else + wh16->dwBufferLength = wh32->dwBufferLength; + ret = WINMM_MAP_OKMEM; + } + break; + case WIDM_GETDEVCAPS: + { + LPWAVEINCAPSA wic32 = (LPWAVEINCAPSA)*lpParam1; + LPSTR ptr = HeapAlloc( GetProcessHeap(), 0 ,sizeof(LPWAVEINCAPSA) + sizeof(WAVEINCAPS16)); + + if (ptr) { + *(LPWAVEINCAPSA*)ptr = wic32; + ret = WINMM_MAP_OKMEM; + } else { + ret = WINMM_MAP_NOMEM; + } + *lpParam1 = MapLS(ptr) + sizeof(LPWAVEINCAPSA); + *lpParam2 = sizeof(WAVEINCAPS16); + } + break; + case WIDM_GETPOS: + { + LPMMTIME mmt32 = (LPMMTIME)*lpParam1; + LPSTR ptr = HeapAlloc( GetProcessHeap(), 0, sizeof(LPMMTIME) + sizeof(MMTIME16)); + LPMMTIME16 mmt16 = (LPMMTIME16)(ptr + sizeof(LPMMTIME)); + + if (ptr) { + *(LPMMTIME*)ptr = mmt32; + mmt16->wType = mmt32->wType; + ret = WINMM_MAP_OKMEM; + } else { + ret = WINMM_MAP_NOMEM; + } + *lpParam1 = MapLS(ptr) + sizeof(LPMMTIME); + *lpParam2 = sizeof(MMTIME16); + } + break; + case DRVM_MAPPER_STATUS: + { + LPDWORD p32 = (LPDWORD)*lpParam2; + *lpParam2 = MapLS(p32); + ret = WINMM_MAP_OKMEM; + } + break; + default: + FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2); + break; + } + return ret; +} + +/************************************************************************** + * MMDRV_WaveIn_UnMap32ATo16 [internal] + */ +static WINMM_MapType MMDRV_WaveIn_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret) +{ + WINMM_MapType ret = WINMM_MAP_MSGERROR; + + switch (wMsg) { + case WIDM_CLOSE: + case WIDM_GETNUMDEVS: + case WIDM_RESET: + case WIDM_START: + case WIDM_STOP: + ret = WINMM_MAP_OK; + break; + + case WIDM_OPEN: + { + LPWAVEOPENDESC16 wod16 = MapSL(*lpParam1); + LPSTR ptr = (LPSTR)wod16 - sizeof(LPWAVEOPENDESC) - 2*sizeof(DWORD); + LPWAVEOPENDESC wod32 = *(LPWAVEOPENDESC*)ptr; + + UnMapLS( *lpParam1 ); + wod32->uMappedDeviceID = wod16->uMappedDeviceID; + **(DWORD**)(ptr + sizeof(LPWAVEOPENDESC)) = *(LPDWORD)(ptr + sizeof(LPWAVEOPENDESC) + sizeof(DWORD)); + HeapFree( GetProcessHeap(), 0, ptr ); + ret = WINMM_MAP_OK; + } + break; + + case WIDM_ADDBUFFER: + case WIDM_PREPARE: + case WIDM_UNPREPARE: + { + LPWAVEHDR wh16 = MapSL(*lpParam1); + LPSTR ptr = (LPSTR)wh16 - sizeof(LPWAVEHDR); + LPWAVEHDR wh32 = *(LPWAVEHDR*)ptr; + + assert(wh32->lpNext == wh16); + wh32->dwBytesRecorded = wh16->dwBytesRecorded; + wh32->dwUser = wh16->dwUser; + wh32->dwFlags = wh16->dwFlags; + wh32->dwLoops = wh16->dwLoops; + UnMapLS( *lpParam1 ); + + if (wMsg == WIDM_UNPREPARE && fn_ret == MMSYSERR_NOERROR) { + HeapFree( GetProcessHeap(), 0, ptr ); + wh32->lpNext = 0; + } + ret = WINMM_MAP_OK; + } + break; + case WIDM_GETDEVCAPS: + { + LPWAVEINCAPS16 wic16 = MapSL(*lpParam1); + LPSTR ptr = (LPSTR)wic16 - sizeof(LPWAVEINCAPSA); + LPWAVEINCAPSA wic32 = *(LPWAVEINCAPSA*)ptr; + + wic32->wMid = wic16->wMid; + wic32->wPid = wic16->wPid; + wic32->vDriverVersion = wic16->vDriverVersion; + strcpy(wic32->szPname, wic16->szPname); + wic32->dwFormats = wic16->dwFormats; + wic32->wChannels = wic16->wChannels; + UnMapLS( *lpParam1 ); + HeapFree( GetProcessHeap(), 0, ptr ); + ret = WINMM_MAP_OK; + } + break; + case WIDM_GETPOS: + { + LPMMTIME16 mmt16 = MapSL(*lpParam1); + LPSTR ptr = (LPSTR)mmt16 - sizeof(LPMMTIME); + LPMMTIME mmt32 = *(LPMMTIME*)ptr; + + MMSYSTEM_MMTIME16to32(mmt32, mmt16); + UnMapLS( *lpParam1 ); + HeapFree( GetProcessHeap(), 0, ptr ); + ret = WINMM_MAP_OK; + } + break; + case DRVM_MAPPER_STATUS: + { + UnMapLS( *lpParam2 ); + ret = WINMM_MAP_OK; + } + break; + default: + FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2); + break; + } + return ret; +} + +/************************************************************************** + * MMDRV_WaveIn_Callback [internal] + */ +static void CALLBACK MMDRV_WaveIn_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2) +{ + LPWINE_MLD mld = (LPWINE_MLD)dwInstance; + + switch (uMsg) { + case WIM_OPEN: + case WIM_CLOSE: + /* dwParam1 & dwParam2 are supposed to be 0, nothing to do */ + break; + case WIM_DATA: + if (mld->bFrom32 && !MMDRV_Is32(mld->mmdIndex)) { + /* initial map is: 32 => 16 */ + LPWAVEHDR wh16 = MapSL(dwParam1); + LPWAVEHDR wh32 = *(LPWAVEHDR*)((LPSTR)wh16 - sizeof(LPWAVEHDR)); + + dwParam1 = (DWORD)wh32; + wh32->dwFlags = wh16->dwFlags; + wh32->dwBytesRecorded = wh16->dwBytesRecorded; + } else if (!mld->bFrom32 && MMDRV_Is32(mld->mmdIndex)) { + /* initial map is: 16 => 32 */ + LPWAVEHDR wh32 = (LPWAVEHDR)(dwParam1); + SEGPTR segwh16 = *(SEGPTR*)((LPSTR)wh32 - sizeof(LPWAVEHDR)); + LPWAVEHDR wh16 = MapSL(segwh16); + + dwParam1 = (DWORD)segwh16; + wh16->dwFlags = wh32->dwFlags; + wh16->dwBytesRecorded = wh32->dwBytesRecorded; + } + /* else { 16 => 16 or 32 => 32, nothing to do, same struct is kept }*/ + break; + default: + ERR("Unknown msg %u\n", uMsg); + } + + MMDRV_Callback(mld, hDev, uMsg, dwParam1, dwParam2); +} + +/* ================================= + * W A V E O U T M A P P E R S + * ================================= */ + +/************************************************************************** + * MMDRV_WaveOut_Map16To32A [internal] + */ +static WINMM_MapType MMDRV_WaveOut_Map16To32A (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2) +{ + WINMM_MapType ret = WINMM_MAP_MSGERROR; + + switch (wMsg) { + /* nothing to do */ + case WODM_BREAKLOOP: + case WODM_CLOSE: + case WODM_GETNUMDEVS: + case WODM_PAUSE: + case WODM_RESET: + case WODM_RESTART: + case WODM_SETPITCH: + case WODM_SETPLAYBACKRATE: + case WODM_SETVOLUME: + ret = WINMM_MAP_OK; + break; + + case WODM_GETPITCH: + case WODM_GETPLAYBACKRATE: + case WODM_GETVOLUME: + case WODM_OPEN: + FIXME("Shouldn't be used: the corresponding 16 bit functions use the 32 bit interface\n"); + break; + + case WODM_GETDEVCAPS: + { + LPWAVEOUTCAPSA woc32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPWAVEOUTCAPS16) + sizeof(WAVEOUTCAPSA)); + LPWAVEOUTCAPS16 woc16 = MapSL(*lpParam1); + + if (woc32) { + *(LPWAVEOUTCAPS16*)woc32 = woc16; + woc32 = (LPWAVEOUTCAPSA)((LPSTR)woc32 + sizeof(LPWAVEOUTCAPS16)); + *lpParam1 = (DWORD)woc32; + *lpParam2 = sizeof(WAVEOUTCAPSA); + + ret = WINMM_MAP_OKMEM; + } else { + ret = WINMM_MAP_NOMEM; + } + } + break; + case WODM_GETPOS: + { + LPMMTIME mmt32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMMTIME16) + sizeof(MMTIME)); + LPMMTIME16 mmt16 = MapSL(*lpParam1); + + if (mmt32) { + *(LPMMTIME16*)mmt32 = mmt16; + mmt32 = (LPMMTIME)((LPSTR)mmt32 + sizeof(LPMMTIME16)); + + mmt32->wType = mmt16->wType; + *lpParam1 = (DWORD)mmt32; + *lpParam2 = sizeof(MMTIME); + + ret = WINMM_MAP_OKMEM; + } else { + ret = WINMM_MAP_NOMEM; + } + } + break; + case WODM_PREPARE: + { + LPWAVEHDR wh32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPWAVEHDR) + sizeof(WAVEHDR)); + LPWAVEHDR wh16 = MapSL(*lpParam1); + + if (wh32) { + *(LPWAVEHDR*)wh32 = (LPWAVEHDR)*lpParam1; + wh32 = (LPWAVEHDR)((LPSTR)wh32 + sizeof(LPWAVEHDR)); + wh32->lpData = MapSL((SEGPTR)wh16->lpData); + wh32->dwBufferLength = wh16->dwBufferLength; + wh32->dwBytesRecorded = wh16->dwBytesRecorded; + wh32->dwUser = wh16->dwUser; + wh32->dwFlags = wh16->dwFlags; + wh32->dwLoops = wh16->dwLoops; + /* FIXME: nothing on wh32->lpNext */ + /* could link the wh32->lpNext at this level for memory house keeping */ + wh16->lpNext = wh32; /* for reuse in unprepare and write */ + *lpParam1 = (DWORD)wh32; + *lpParam2 = sizeof(WAVEHDR); + + ret = WINMM_MAP_OKMEM; + } else { + ret = WINMM_MAP_NOMEM; + } + } + break; + case WODM_UNPREPARE: + case WODM_WRITE: + { + LPWAVEHDR wh16 = MapSL(*lpParam1); + LPWAVEHDR wh32 = (LPWAVEHDR)wh16->lpNext; + + *lpParam1 = (DWORD)wh32; + *lpParam2 = sizeof(WAVEHDR); + /* dwBufferLength can be reduced between prepare & write */ + if (wMsg == WODM_WRITE && wh32->dwBufferLength < wh16->dwBufferLength) { + ERR("Size of buffer has been increased from %ld to %ld, keeping initial value\n", + wh32->dwBufferLength, wh16->dwBufferLength); + } else + wh32->dwBufferLength = wh16->dwBufferLength; + ret = WINMM_MAP_OKMEM; + } + break; + case WODM_MAPPER_STATUS: + *lpParam2 = (DWORD)MapSL(*lpParam2); + ret = WINMM_MAP_OK; + break; + default: + FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2); + break; + } + return ret; +} + +/************************************************************************** + * MMDRV_WaveOut_UnMap16To32A [internal] + */ +static WINMM_MapType MMDRV_WaveOut_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret) +{ + WINMM_MapType ret = WINMM_MAP_MSGERROR; + + switch (wMsg) { + /* nothing to do */ + case WODM_BREAKLOOP: + case WODM_CLOSE: + case WODM_GETNUMDEVS: + case WODM_PAUSE: + case WODM_RESET: + case WODM_RESTART: + case WODM_SETPITCH: + case WODM_SETPLAYBACKRATE: + case WODM_SETVOLUME: + case WODM_MAPPER_STATUS: + ret = WINMM_MAP_OK; + break; + + case WODM_GETPITCH: + case WODM_GETPLAYBACKRATE: + case WODM_GETVOLUME: + case WODM_OPEN: + FIXME("Shouldn't be used: those 16 bit functions use the 32 bit interface\n"); + break; + + case WODM_GETDEVCAPS: + { + LPWAVEOUTCAPSA woc32 = (LPWAVEOUTCAPSA)(*lpParam1); + LPWAVEOUTCAPS16 woc16 = *(LPWAVEOUTCAPS16*)((LPSTR)woc32 - sizeof(LPWAVEOUTCAPS16)); + + woc16->wMid = woc32->wMid; + woc16->wPid = woc32->wPid; + woc16->vDriverVersion = woc32->vDriverVersion; + strcpy(woc16->szPname, woc32->szPname); + woc16->dwFormats = woc32->dwFormats; + woc16->wChannels = woc32->wChannels; + woc16->dwSupport = woc32->dwSupport; + HeapFree(GetProcessHeap(), 0, (LPSTR)woc32 - sizeof(LPWAVEOUTCAPS16)); + ret = WINMM_MAP_OK; + } + break; + case WODM_GETPOS: + { + LPMMTIME mmt32 = (LPMMTIME)(*lpParam1); + LPMMTIME16 mmt16 = *(LPMMTIME16*)((LPSTR)mmt32 - sizeof(LPMMTIME16)); + + MMSYSTEM_MMTIME32to16(mmt16, mmt32); + HeapFree(GetProcessHeap(), 0, (LPSTR)mmt32 - sizeof(LPMMTIME16)); + ret = WINMM_MAP_OK; + } + break; + case WODM_PREPARE: + case WODM_UNPREPARE: + case WODM_WRITE: + { + LPWAVEHDR wh32 = (LPWAVEHDR)(*lpParam1); + LPWAVEHDR wh16 = MapSL(*(SEGPTR*)((LPSTR)wh32 - sizeof(LPWAVEHDR))); + + assert(wh16->lpNext == wh32); + wh16->dwBufferLength = wh32->dwBufferLength; + wh16->dwBytesRecorded = wh32->dwBytesRecorded; + wh16->dwUser = wh32->dwUser; + wh16->dwFlags = wh32->dwFlags; + wh16->dwLoops = wh32->dwLoops; + + if (wMsg == WODM_UNPREPARE && fn_ret == MMSYSERR_NOERROR) { + HeapFree(GetProcessHeap(), 0, (LPSTR)wh32 - sizeof(LPWAVEHDR)); + wh16->lpNext = 0; + } + ret = WINMM_MAP_OK; + } + break; + default: + FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2); + break; + } + return ret; +} + +/************************************************************************** + * MMDRV_WaveOut_Map32ATo16 [internal] + */ +static WINMM_MapType MMDRV_WaveOut_Map32ATo16 (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2) +{ + WINMM_MapType ret; + + switch (wMsg) { + /* nothing to do */ + case WODM_BREAKLOOP: + case WODM_CLOSE: + case WODM_GETNUMDEVS: + case WODM_PAUSE: + case WODM_RESET: + case WODM_RESTART: + case WODM_SETPITCH: + case WODM_SETPLAYBACKRATE: + case WODM_SETVOLUME: + ret = WINMM_MAP_OK; + break; + + case WODM_GETDEVCAPS: + { + LPWAVEOUTCAPSA woc32 = (LPWAVEOUTCAPSA)*lpParam1; + LPSTR ptr = HeapAlloc( GetProcessHeap(), 0, + sizeof(LPWAVEOUTCAPSA) + sizeof(WAVEOUTCAPS16)); + + if (ptr) { + *(LPWAVEOUTCAPSA*)ptr = woc32; + ret = WINMM_MAP_OKMEM; + } else { + ret = WINMM_MAP_NOMEM; + } + *lpParam1 = MapLS(ptr) + sizeof(LPWAVEOUTCAPSA); + *lpParam2 = sizeof(WAVEOUTCAPS16); + } + break; + case WODM_GETPITCH: + FIXME("NIY: no conversion yet\n"); + ret = WINMM_MAP_MSGERROR; + break; + case WODM_GETPLAYBACKRATE: + FIXME("NIY: no conversion yet\n"); + ret = WINMM_MAP_MSGERROR; + break; + case WODM_GETPOS: + { + LPMMTIME mmt32 = (LPMMTIME)*lpParam1; + LPSTR ptr = HeapAlloc( GetProcessHeap(), 0, sizeof(LPMMTIME) + sizeof(MMTIME16)); + LPMMTIME16 mmt16 = (LPMMTIME16)(ptr + sizeof(LPMMTIME)); + + if (ptr) { + *(LPMMTIME*)ptr = mmt32; + mmt16->wType = mmt32->wType; + ret = WINMM_MAP_OKMEM; + } else { + ret = WINMM_MAP_NOMEM; + } + *lpParam1 = MapLS(ptr) + sizeof(LPMMTIME); + *lpParam2 = sizeof(MMTIME16); + } + break; + case WODM_GETVOLUME: + FIXME("NIY: no conversion yet\n"); + ret = WINMM_MAP_MSGERROR; + break; + case WODM_OPEN: + { + LPWAVEOPENDESC wod32 = (LPWAVEOPENDESC)*lpParam1; + int sz = sizeof(WAVEFORMATEX); + LPVOID ptr; + LPWAVEOPENDESC16 wod16; + + /* allocated data are mapped as follows: + LPWAVEOPENDESC ptr to orig lParam1 + DWORD orig dwUser, which is a pointer to DWORD:driver dwInstance + DWORD dwUser passed to driver + WAVEOPENDESC16 wod16: openDesc passed to driver + WAVEFORMATEX openDesc->lpFormat passed to driver + xxx extra bytes to WAVEFORMATEX + */ + if (wod32->lpFormat->wFormatTag != WAVE_FORMAT_PCM) { + TRACE("Allocating %u extra bytes (%d)\n", ((LPWAVEFORMATEX)wod32->lpFormat)->cbSize, wod32->lpFormat->wFormatTag); + sz += ((LPWAVEFORMATEX)wod32->lpFormat)->cbSize; + } + + ptr = HeapAlloc( GetProcessHeap(), 0, + sizeof(LPWAVEOPENDESC) + 2*sizeof(DWORD) + sizeof(WAVEOPENDESC16) + sz); + + if (ptr) { + SEGPTR seg_ptr = MapLS( ptr ); + *(LPWAVEOPENDESC*)ptr = wod32; + *(LPDWORD)((char*)ptr + sizeof(LPWAVEOPENDESC)) = *lpdwUser; + wod16 = (LPWAVEOPENDESC16)((LPSTR)ptr + sizeof(LPWAVEOPENDESC) + 2*sizeof(DWORD)); + + wod16->hWave = HWAVE_16(wod32->hWave); + wod16->lpFormat = (LPWAVEFORMATEX)(seg_ptr + sizeof(LPWAVEOPENDESC) + 2*sizeof(DWORD) + sizeof(WAVEOPENDESC16)); + memcpy(wod16 + 1, wod32->lpFormat, sz); + + wod16->dwCallback = wod32->dwCallback; + wod16->dwInstance = wod32->dwInstance; + wod16->uMappedDeviceID = wod32->uMappedDeviceID; + wod16->dnDevNode = wod32->dnDevNode; + + *lpParam1 = seg_ptr + sizeof(LPWAVEOPENDESC) + 2*sizeof(DWORD); + *lpdwUser = seg_ptr + sizeof(LPWAVEOPENDESC) + sizeof(DWORD); + + ret = WINMM_MAP_OKMEM; + } else { + ret = WINMM_MAP_NOMEM; + } + } + break; + case WODM_PREPARE: + { + LPWAVEHDR wh32 = (LPWAVEHDR)*lpParam1; + LPWAVEHDR wh16; + LPVOID ptr = HeapAlloc( GetProcessHeap(), 0, + sizeof(LPWAVEHDR) + sizeof(WAVEHDR) + wh32->dwBufferLength); + + if (ptr) { + SEGPTR seg_ptr = MapLS( ptr ); + *(LPWAVEHDR*)ptr = wh32; + wh16 = (LPWAVEHDR)((LPSTR)ptr + sizeof(LPWAVEHDR)); + wh16->lpData = (LPSTR)seg_ptr + sizeof(LPWAVEHDR) + sizeof(WAVEHDR); + /* data will be copied on WODM_WRITE */ + wh16->dwBufferLength = wh32->dwBufferLength; + wh16->dwBytesRecorded = wh32->dwBytesRecorded; + wh16->dwUser = wh32->dwUser; + wh16->dwFlags = wh32->dwFlags; + wh16->dwLoops = wh32->dwLoops; + /* FIXME: nothing on wh32->lpNext */ + /* could link the wh32->lpNext at this level for memory house keeping */ + wh32->lpNext = wh16; /* for reuse in unprepare and write */ + TRACE("wh16=%08lx wh16->lpData=%08lx wh32->buflen=%lu wh32->lpData=%08lx\n", + seg_ptr + sizeof(LPWAVEHDR), (DWORD)wh16->lpData, + wh32->dwBufferLength, (DWORD)wh32->lpData); + *lpParam1 = seg_ptr + sizeof(LPWAVEHDR); + *lpParam2 = sizeof(WAVEHDR); + + ret = WINMM_MAP_OKMEM; + } else { + ret = WINMM_MAP_NOMEM; + } + } + break; + case WODM_UNPREPARE: + case WODM_WRITE: + { + LPWAVEHDR wh32 = (LPWAVEHDR)(*lpParam1); + LPWAVEHDR wh16 = wh32->lpNext; + LPSTR ptr = (LPSTR)wh16 - sizeof(LPWAVEHDR); + SEGPTR seg_ptr = MapLS( ptr ); + + assert(*(LPWAVEHDR*)ptr == wh32); + + TRACE("wh16=%08lx wh16->lpData=%08lx wh32->buflen=%lu wh32->lpData=%08lx\n", + seg_ptr + sizeof(LPWAVEHDR), (DWORD)wh16->lpData, + wh32->dwBufferLength, (DWORD)wh32->lpData); + + if (wMsg == WODM_WRITE) + memcpy((LPSTR)wh16 + sizeof(WAVEHDR), wh32->lpData, wh32->dwBufferLength); + + *lpParam1 = seg_ptr + sizeof(LPWAVEHDR); + *lpParam2 = sizeof(WAVEHDR); + /* dwBufferLength can be reduced between prepare & write */ + if (wMsg == WODM_WRITE && wh16->dwBufferLength < wh32->dwBufferLength) { + ERR("Size of buffer has been increased from %ld to %ld, keeping initial value\n", + wh16->dwBufferLength, wh32->dwBufferLength); + } else + wh16->dwBufferLength = wh32->dwBufferLength; + ret = WINMM_MAP_OKMEM; + } + break; + case DRVM_MAPPER_STATUS: + { + LPDWORD p32 = (LPDWORD)*lpParam2; + *lpParam2 = MapLS(p32); + ret = WINMM_MAP_OKMEM; + } + break; + default: + FIXME("NIY: no conversion yet\n"); + ret = WINMM_MAP_MSGERROR; + break; + } + return ret; +} + +/************************************************************************** + * MMDRV_WaveOut_UnMap32ATo16 [internal] + */ +static WINMM_MapType MMDRV_WaveOut_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret) +{ + WINMM_MapType ret; + + switch (wMsg) { + /* nothing to do */ + case WODM_BREAKLOOP: + case WODM_CLOSE: + case WODM_GETNUMDEVS: + case WODM_PAUSE: + case WODM_RESET: + case WODM_RESTART: + case WODM_SETPITCH: + case WODM_SETPLAYBACKRATE: + case WODM_SETVOLUME: + ret = WINMM_MAP_OK; + break; + + case WODM_GETDEVCAPS: + { + LPWAVEOUTCAPS16 woc16 = MapSL(*lpParam1); + LPSTR ptr = (LPSTR)woc16 - sizeof(LPWAVEOUTCAPSA); + LPWAVEOUTCAPSA woc32 = *(LPWAVEOUTCAPSA*)ptr; + + woc32->wMid = woc16->wMid; + woc32->wPid = woc16->wPid; + woc32->vDriverVersion = woc16->vDriverVersion; + strcpy(woc32->szPname, woc16->szPname); + woc32->dwFormats = woc16->dwFormats; + woc32->wChannels = woc16->wChannels; + woc32->dwSupport = woc16->dwSupport; + UnMapLS( *lpParam1 ); + HeapFree( GetProcessHeap(), 0, ptr ); + ret = WINMM_MAP_OK; + } + break; + case WODM_GETPITCH: + FIXME("NIY: no conversion yet\n"); + ret = WINMM_MAP_MSGERROR; + break; + case WODM_GETPLAYBACKRATE: + FIXME("NIY: no conversion yet\n"); + ret = WINMM_MAP_MSGERROR; + break; + case WODM_GETPOS: + { + LPMMTIME16 mmt16 = MapSL(*lpParam1); + LPSTR ptr = (LPSTR)mmt16 - sizeof(LPMMTIME); + LPMMTIME mmt32 = *(LPMMTIME*)ptr; + + MMSYSTEM_MMTIME16to32(mmt32, mmt16); + UnMapLS( *lpParam1 ); + HeapFree( GetProcessHeap(), 0, ptr ); + ret = WINMM_MAP_OK; + } + break; + case WODM_OPEN: + { + LPWAVEOPENDESC16 wod16 = MapSL(*lpParam1); + LPSTR ptr = (LPSTR)wod16 - sizeof(LPWAVEOPENDESC) - 2*sizeof(DWORD); + LPWAVEOPENDESC wod32 = *(LPWAVEOPENDESC*)ptr; + + wod32->uMappedDeviceID = wod16->uMappedDeviceID; + **(DWORD**)(ptr + sizeof(LPWAVEOPENDESC)) = *(LPDWORD)(ptr + sizeof(LPWAVEOPENDESC) + sizeof(DWORD)); + UnMapLS( *lpParam1 ); + HeapFree( GetProcessHeap(), 0, ptr ); + ret = WINMM_MAP_OK; + } + break; + case WODM_PREPARE: + case WODM_UNPREPARE: + case WODM_WRITE: + { + LPWAVEHDR wh16 = MapSL(*lpParam1); + LPSTR ptr = (LPSTR)wh16 - sizeof(LPWAVEHDR); + LPWAVEHDR wh32 = *(LPWAVEHDR*)ptr; + + assert(wh32->lpNext == wh16); + wh32->dwBytesRecorded = wh16->dwBytesRecorded; + wh32->dwUser = wh16->dwUser; + wh32->dwFlags = wh16->dwFlags; + wh32->dwLoops = wh16->dwLoops; + + UnMapLS( *lpParam1 ); + if (wMsg == WODM_UNPREPARE && fn_ret == MMSYSERR_NOERROR) { + HeapFree( GetProcessHeap(), 0, ptr ); + wh32->lpNext = 0; + } + ret = WINMM_MAP_OK; + } + break; + case WODM_GETVOLUME: + FIXME("NIY: no conversion yet\n"); + ret = WINMM_MAP_MSGERROR; + break; + case DRVM_MAPPER_STATUS: + { + UnMapLS( *lpParam2 ); + ret = WINMM_MAP_OK; + } + break; + default: + FIXME("NIY: no conversion yet\n"); + ret = WINMM_MAP_MSGERROR; + break; + } + return ret; +} + +/************************************************************************** + * MMDRV_WaveOut_Callback [internal] + */ +static void CALLBACK MMDRV_WaveOut_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2) +{ + LPWINE_MLD mld = (LPWINE_MLD)dwInstance; + + switch (uMsg) { + case WOM_OPEN: + case WOM_CLOSE: + /* dwParam1 & dwParam2 are supposed to be 0, nothing to do */ + break; + case WOM_DONE: + if (mld->bFrom32 && !MMDRV_Is32(mld->mmdIndex)) { + /* initial map is: 32 => 16 */ + LPWAVEHDR wh16 = MapSL(dwParam1); + LPWAVEHDR wh32 = *(LPWAVEHDR*)((LPSTR)wh16 - sizeof(LPWAVEHDR)); + + dwParam1 = (DWORD)wh32; + wh32->dwFlags = wh16->dwFlags; + } else if (!mld->bFrom32 && MMDRV_Is32(mld->mmdIndex)) { + /* initial map is: 16 => 32 */ + LPWAVEHDR wh32 = (LPWAVEHDR)(dwParam1); + SEGPTR segwh16 = *(SEGPTR*)((LPSTR)wh32 - sizeof(LPWAVEHDR)); + LPWAVEHDR wh16 = MapSL(segwh16); + + dwParam1 = (DWORD)segwh16; + wh16->dwFlags = wh32->dwFlags; + } + /* else { 16 => 16 or 32 => 32, nothing to do, same struct is kept }*/ + break; + default: + ERR("Unknown msg %u\n", uMsg); + } + + MMDRV_Callback(mld, hDev, uMsg, dwParam1, dwParam2); +} + +/* ================================= + * M A P P E R S H A N D L I N G + * ================================= */ + +static LRESULT MMDRV_CallMMDrvFunc16(DWORD fp16, WORD dev, WORD msg, LONG instance, + LONG lp1, LONG lp2) +{ + WORD args[8]; + DWORD ret; + + args[7] = dev; + args[6] = msg; + args[5] = HIWORD(instance); + args[4] = LOWORD(instance); + args[3] = HIWORD(lp1); + args[2] = LOWORD(lp1); + args[1] = HIWORD(lp2); + args[0] = LOWORD(lp2); + WOWCallback16Ex( fp16, WCB16_PASCAL, sizeof(args), args, &ret ); + return LOWORD(ret); +} + +/************************************************************************** + * MMDRV_GetDescription16 [internal] + */ +static BOOL MMDRV_GetDescription16(const char* fname, char* buf, int buflen) +{ + OFSTRUCT ofs; + HFILE hFile; + WORD w; + DWORD dw; + BOOL ret = FALSE; + + if ((hFile = OpenFile(fname, &ofs, OF_READ | OF_SHARE_DENY_WRITE)) == HFILE_ERROR) { + ERR("Can't open file %s (builtin driver ?)\n", fname); + return FALSE; + } + +#define E(_x) do {TRACE _x;goto theEnd;} while(0) + + if (_lread(hFile, &w, 2) != 2) E(("Can't read sig\n")); + if (w != ('Z' * 256 + 'M')) E(("Bad sig %04x\n", w)); + if (_llseek(hFile, 0x3C, SEEK_SET) < 0) E(("Can't seek to ext header offset\n")); + if (_lread(hFile, &dw, 4) != 4) E(("Can't read ext header offset\n")); + if (_llseek(hFile, dw + 0x2C, SEEK_SET) < 0) E(("Can't seek to ext header.nr table %lu\n", dw+0x2C)); + if (_lread(hFile, &dw, 4) != 4) E(("Can't read nr table offset\n")); + if (_llseek(hFile, dw, SEEK_SET) < 0) E(("Can't seek to nr table %lu\n", dw)); + if (_lread(hFile, buf, 1) != 1) E(("Can't read descr length\n")); + buflen = min((int)(unsigned)(BYTE)buf[0], buflen - 1); + if (_lread(hFile, buf, buflen) != buflen) E(("Can't read descr (%d)\n", buflen)); + buf[buflen] = '\0'; + ret = TRUE; + TRACE("Got '%s' [%d]\n", buf, buflen); +theEnd: + _lclose(hFile); + return ret; +} + +/****************************************************************** + * MMDRV_LoadMMDrvFunc16 + * + */ +unsigned MMDRV_LoadMMDrvFunc16(LPCSTR drvName, LPWINE_DRIVER d, + LPWINE_MM_DRIVER lpDrv) +{ + WINEMM_msgFunc16 func; + unsigned count = 0; + char buffer[128]; + /* + * DESCRIPTION 'wave,aux,mixer:Creative Labs Sound Blaster 16 Driver' + * The beginning of the module description indicates the driver supports + * waveform, auxiliary, and mixer devices. Use one of the following + * device-type names, followed by a colon (:) to indicate the type of + * device your driver supports. If the driver supports more than one + * type of device, separate each device-type name with a comma (,). + * + * wave for waveform audio devices + * wavemapper for wave mappers + * midi for MIDI audio devices + * midimapper for midi mappers + * aux for auxiliary audio devices + * mixer for mixer devices + */ + + if (d->d.d16.hDriver16) { + HMODULE16 hMod16 = GetDriverModuleHandle16(d->d.d16.hDriver16); + +#define AA(_h,_w,_x,_y,_z) \ + func = (WINEMM_msgFunc##_y) _z ((_h), #_x); \ + if (func != NULL) \ + { lpDrv->parts[_w].u.fnMessage##_y = func; count++; \ + TRACE("Got %d bit func '%s'\n", _y, #_x); } + +#define A(_x,_y) AA(hMod16,_x,_y,16,GetProcAddress16) + A(MMDRV_AUX, auxMessage); + A(MMDRV_MIXER, mxdMessage); + A(MMDRV_MIDIIN, midMessage); + A(MMDRV_MIDIOUT,modMessage); + A(MMDRV_WAVEIN, widMessage); + A(MMDRV_WAVEOUT,wodMessage); +#undef A +#undef AA + } + if (TRACE_ON(winmm)) { + if (MMDRV_GetDescription16(drvName, buffer, sizeof(buffer))) + TRACE("%s => %s\n", drvName, buffer); + else + TRACE("%s => No description\n", drvName); + } + + return count; +} + +/* ================================= + * M C I + * ================================= */ + +/************************************************************************** + * MCI_MapMsg16To32A [internal] + */ +static WINMM_MapType MCI_MapMsg16To32A(WORD uDevType, WORD wMsg, DWORD* lParam) +{ + if (*lParam == 0) + return WINMM_MAP_OK; + /* FIXME: to add also (with seg/linear modifications to do): + * MCI_LIST, MCI_LOAD, MCI_QUALITY, MCI_RESERVE, MCI_RESTORE, MCI_SAVE + * MCI_SETAUDIO, MCI_SETTUNER, MCI_SETVIDEO + */ + switch (wMsg) { + /* case MCI_CAPTURE */ + case MCI_CLOSE: + case MCI_CLOSE_DRIVER: + case MCI_CONFIGURE: + case MCI_COPY: + case MCI_CUE: + case MCI_CUT: + case MCI_DELETE: + case MCI_FREEZE: + case MCI_GETDEVCAPS: + /* case MCI_INDEX: */ + /* case MCI_MARK: */ + /* case MCI_MONITOR: */ + case MCI_PASTE: + case MCI_PAUSE: + case MCI_PLAY: + case MCI_PUT: + case MCI_REALIZE: + case MCI_RECORD: + case MCI_RESUME: + case MCI_SEEK: + case MCI_SET: + /* case MCI_SETTIMECODE:*/ + /* case MCI_SIGNAL:*/ + case MCI_SPIN: + case MCI_STATUS: /* FIXME: is wrong for digital video */ + case MCI_STEP: + case MCI_STOP: + /* case MCI_UNDO: */ + case MCI_UNFREEZE: + case MCI_UPDATE: + case MCI_WHERE: + *lParam = (DWORD)MapSL(*lParam); + return WINMM_MAP_OK; + case MCI_WINDOW: + /* in fact, I would also need the dwFlags... to see + * which members of lParam are effectively used + */ + *lParam = (DWORD)MapSL(*lParam); + FIXME("Current mapping may be wrong\n"); + break; + case MCI_BREAK: + { + LPMCI_BREAK_PARMS mbp32 = HeapAlloc(GetProcessHeap(), 0, sizeof(MCI_BREAK_PARMS)); + LPMCI_BREAK_PARMS16 mbp16 = MapSL(*lParam); + + if (mbp32) { + mbp32->dwCallback = mbp16->dwCallback; + mbp32->nVirtKey = mbp16->nVirtKey; + mbp32->hwndBreak = HWND_32(mbp16->hwndBreak); + } else { + return WINMM_MAP_NOMEM; + } + *lParam = (DWORD)mbp32; + } + return WINMM_MAP_OKMEM; + case MCI_ESCAPE: + { + LPMCI_VD_ESCAPE_PARMSA mvep32a = HeapAlloc(GetProcessHeap(), 0, sizeof(MCI_VD_ESCAPE_PARMSA)); + LPMCI_VD_ESCAPE_PARMS16 mvep16 = MapSL(*lParam); + + if (mvep32a) { + mvep32a->dwCallback = mvep16->dwCallback; + mvep32a->lpstrCommand = MapSL(mvep16->lpstrCommand); + } else { + return WINMM_MAP_NOMEM; + } + *lParam = (DWORD)mvep32a; + } + return WINMM_MAP_OKMEM; + case MCI_INFO: + { + LPMCI_INFO_PARMSA mip32a = HeapAlloc(GetProcessHeap(), 0, sizeof(MCI_INFO_PARMSA)); + LPMCI_INFO_PARMS16 mip16 = MapSL(*lParam); + + /* FIXME this is wrong if device is of type + * MCI_DEVTYPE_DIGITAL_VIDEO, some members are not mapped + */ + if (mip32a) { + mip32a->dwCallback = mip16->dwCallback; + mip32a->lpstrReturn = MapSL(mip16->lpstrReturn); + mip32a->dwRetSize = mip16->dwRetSize; + } else { + return WINMM_MAP_NOMEM; + } + *lParam = (DWORD)mip32a; + } + return WINMM_MAP_OKMEM; + case MCI_OPEN: + case MCI_OPEN_DRIVER: + { + LPMCI_OPEN_PARMSA mop32a = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMCI_OPEN_PARMS16) + sizeof(MCI_OPEN_PARMSA) + 2 * sizeof(DWORD)); + LPMCI_OPEN_PARMS16 mop16 = MapSL(*lParam); + + if (mop32a) { + *(LPMCI_OPEN_PARMS16*)(mop32a) = mop16; + mop32a = (LPMCI_OPEN_PARMSA)((char*)mop32a + sizeof(LPMCI_OPEN_PARMS16)); + mop32a->dwCallback = mop16->dwCallback; + mop32a->wDeviceID = mop16->wDeviceID; + mop32a->lpstrDeviceType = MapSL(mop16->lpstrDeviceType); + mop32a->lpstrElementName = MapSL(mop16->lpstrElementName); + mop32a->lpstrAlias = MapSL(mop16->lpstrAlias); + /* copy extended information if any... + * FIXME: this may seg fault if initial structure does not contain them and + * the reads after msip16 fail under LDT limits... + * NOTE: this should be split in two. First pass, while calling MCI_OPEN, and + * should not take care of extended parameters, and should be used by MCI_Open + * to fetch uDevType. When, this is known, the mapping for sending the + * MCI_OPEN_DRIVER shall be done depending on uDevType. + */ + memcpy(mop32a + 1, mop16 + 1, 2 * sizeof(DWORD)); + } else { + return WINMM_MAP_NOMEM; + } + *lParam = (DWORD)mop32a; + } + return WINMM_MAP_OKMEM; + case MCI_SYSINFO: + { + LPMCI_SYSINFO_PARMSA msip32a = HeapAlloc(GetProcessHeap(), 0, sizeof(MCI_SYSINFO_PARMSA)); + LPMCI_SYSINFO_PARMS16 msip16 = MapSL(*lParam); + + if (msip32a) { + msip32a->dwCallback = msip16->dwCallback; + msip32a->lpstrReturn = MapSL(msip16->lpstrReturn); + msip32a->dwRetSize = msip16->dwRetSize; + msip32a->dwNumber = msip16->dwNumber; + msip32a->wDeviceType = msip16->wDeviceType; + } else { + return WINMM_MAP_NOMEM; + } + *lParam = (DWORD)msip32a; + } + return WINMM_MAP_OKMEM; + case DRV_LOAD: + case DRV_ENABLE: + case DRV_OPEN: + case DRV_CLOSE: + case DRV_DISABLE: + case DRV_FREE: + case DRV_CONFIGURE: + case DRV_QUERYCONFIGURE: + case DRV_INSTALL: + case DRV_REMOVE: + case DRV_EXITSESSION: + case DRV_EXITAPPLICATION: + case DRV_POWER: + FIXME("This is a hack\n"); + return WINMM_MAP_OK; + + default: + WARN("Don't know how to map msg=%s\n", MCI_MessageToString(wMsg)); + } + return WINMM_MAP_MSGERROR; +} + +/************************************************************************** + * MCI_UnMapMsg16To32A [internal] + */ +static WINMM_MapType MCI_UnMapMsg16To32A(WORD uDevType, WORD wMsg, DWORD lParam) +{ + switch (wMsg) { + /* case MCI_CAPTURE */ + case MCI_CLOSE: + case MCI_CLOSE_DRIVER: + case MCI_CONFIGURE: + case MCI_COPY: + case MCI_CUE: + case MCI_CUT: + case MCI_DELETE: + case MCI_FREEZE: + case MCI_GETDEVCAPS: + /* case MCI_INDEX: */ + /* case MCI_MARK: */ + /* case MCI_MONITOR: */ + case MCI_PASTE: + case MCI_PAUSE: + case MCI_PLAY: + case MCI_PUT: + case MCI_REALIZE: + case MCI_RECORD: + case MCI_RESUME: + case MCI_SEEK: + case MCI_SET: + /* case MCI_SETTIMECODE:*/ + /* case MCI_SIGNAL:*/ + case MCI_SPIN: + case MCI_STATUS: + case MCI_STEP: + case MCI_STOP: + /* case MCI_UNDO: */ + case MCI_UNFREEZE: + case MCI_UPDATE: + case MCI_WHERE: + return WINMM_MAP_OK; + + case MCI_WINDOW: + /* FIXME ?? see Map function */ + return WINMM_MAP_OK; + + case MCI_BREAK: + case MCI_ESCAPE: + case MCI_INFO: + case MCI_SYSINFO: + HeapFree(GetProcessHeap(), 0, (LPVOID)lParam); + return WINMM_MAP_OK; + case MCI_OPEN: + case MCI_OPEN_DRIVER: + if (lParam) { + LPMCI_OPEN_PARMSA mop32a = (LPMCI_OPEN_PARMSA)lParam; + LPMCI_OPEN_PARMS16 mop16 = *(LPMCI_OPEN_PARMS16*)((char*)mop32a - sizeof(LPMCI_OPEN_PARMS16)); + + mop16->wDeviceID = mop32a->wDeviceID; + if (!HeapFree(GetProcessHeap(), 0, (LPVOID)(lParam - sizeof(LPMCI_OPEN_PARMS16)))) + FIXME("bad free line=%d\n", __LINE__); + } + return WINMM_MAP_OK; + case DRV_LOAD: + case DRV_ENABLE: + case DRV_OPEN: + case DRV_CLOSE: + case DRV_DISABLE: + case DRV_FREE: + case DRV_CONFIGURE: + case DRV_QUERYCONFIGURE: + case DRV_INSTALL: + case DRV_REMOVE: + case DRV_EXITSESSION: + case DRV_EXITAPPLICATION: + case DRV_POWER: + FIXME("This is a hack\n"); + return WINMM_MAP_OK; + default: + FIXME("Map/Unmap internal error on msg=%s\n", MCI_MessageToString(wMsg)); + } + return WINMM_MAP_MSGERROR; +} + +/* + * 0000 stop + * 0001 squeeze signed 4 bytes to 2 bytes *( LPINT16)D = ( INT16)*( LPINT16)S; D += 2; S += 4 + * 0010 squeeze unsigned 4 bytes to 2 bytes *(LPUINT16)D = (UINT16)*(LPUINT16)S; D += 2; S += 4 + * 0100 + * 0101 + * 0110 zero 4 bytes *(DWORD)D = 0 D += 4; S += 4 + * 0111 copy string *(LPSTR*)D = seg dup(*(LPSTR*)S) D += 4; S += 4 + * 1xxx copy xxx + 1 bytes memcpy(D, S, xxx + 1); D += xxx+1; S += xxx+1 + */ + +/************************************************************************** + * MCI_MsgMapper32To16_Create [internal] + * + * Helper for MCI_MapMsg32ATo16. + * Maps the 32 bit pointer (*ptr), of size bytes, to an allocated 16 bit + * segmented pointer. + * map contains a list of action to be performed for the mapping (see list + * above) + * if keep is TRUE, keeps track of in 32 bit ptr in allocated 16 bit area. + */ +static WINMM_MapType MCI_MsgMapper32To16_Create(void** ptr, int size16, DWORD map, BOOLEAN keep) +{ + void* lp = HeapAlloc( GetProcessHeap(), 0, (keep ? sizeof(void**) : 0) + size16 ); + LPBYTE p16, p32; + + if (!lp) { + return WINMM_MAP_NOMEM; + } + p32 = (LPBYTE)(*ptr); + if (keep) { + *(void**)lp = *ptr; + p16 = (LPBYTE)lp + sizeof(void**); + *ptr = (char*)MapLS(lp) + sizeof(void**); + } else { + p16 = lp; + *ptr = (void*)MapLS(lp); + } + + if (map == 0) { + memcpy(p16, p32, size16); + } else { + unsigned nibble; + unsigned sz; + + while (map & 0xF) { + nibble = map & 0xF; + if (nibble & 0x8) { + sz = (nibble & 7) + 1; + memcpy(p16, p32, sz); + p16 += sz; + p32 += sz; + size16 -= sz; /* DEBUG only */ + } else { + switch (nibble) { + case 0x1: + *(LPINT16)p16 = *(LPINT)p32; + p16 += sizeof(INT16); + p32 += sizeof(INT); + size16 -= sizeof(INT16); + break; + case 0x2: + *(LPUINT16)p16 = *(LPUINT)p32; + p16 += sizeof(UINT16); + p32 += sizeof(UINT); + size16 -= sizeof(UINT16); + break; + case 0x6: + *(LPDWORD)p16 = 0; + p16 += sizeof(DWORD); + p32 += sizeof(DWORD); + size16 -= sizeof(DWORD); + break; + case 0x7: + *(SEGPTR *)p16 = MapLS( *(LPSTR *)p32 ); + p16 += sizeof(SEGPTR); + p32 += sizeof(LPSTR); + size16 -= sizeof(SEGPTR); + break; + default: + FIXME("Unknown nibble for mapping (%x)\n", nibble); + } + } + map >>= 4; + } + if (size16 != 0) /* DEBUG only */ + FIXME("Mismatch between 16 bit struct size and map nibbles serie\n"); + } + return WINMM_MAP_OKMEM; +} + +/************************************************************************** + * MCI_MsgMapper32To16_Destroy [internal] + * + * Helper for MCI_UnMapMsg32ATo16. + */ +static WINMM_MapType MCI_MsgMapper32To16_Destroy(void* ptr, int size16, DWORD map, BOOLEAN kept) +{ + if (ptr) { + void* msg16 = MapSL((SEGPTR)ptr); + void* alloc; + LPBYTE p32, p16; + unsigned nibble; + + UnMapLS( (SEGPTR)ptr ); + if (kept) { + alloc = (char*)msg16 - sizeof(void**); + p32 = *(void**)alloc; + p16 = msg16; + + if (map == 0) { + memcpy(p32, p16, size16); + } else { + while (map & 0xF) { + nibble = map & 0xF; + if (nibble & 0x8) { + memcpy(p32, p16, (nibble & 7) + 1); + p16 += (nibble & 7) + 1; + p32 += (nibble & 7) + 1; + size16 -= (nibble & 7) + 1; + } else { + switch (nibble) { + case 0x1: + *(LPINT)p32 = *(LPINT16)p16; + p16 += sizeof(INT16); + p32 += sizeof(INT); + size16 -= sizeof(INT16); + break; + case 0x2: + *(LPUINT)p32 = *(LPUINT16)p16; + p16 += sizeof(UINT16); + p32 += sizeof(UINT); + size16 -= sizeof(UINT16); + break; + case 0x6: + p16 += sizeof(UINT); + p32 += sizeof(UINT); + size16 -= sizeof(UINT); + break; + case 0x7: + UnMapLS( *(SEGPTR *)p16 ); + p16 += sizeof(SEGPTR); + p32 += sizeof(char*); + size16 -= sizeof(SEGPTR); + break; + default: + FIXME("Unknown nibble for mapping (%x)\n", nibble); + } + } + map >>= 4; + } + if (size16 != 0) /* DEBUG only */ + FIXME("Mismatch between 16 bit struct size and map nibbles serie\n"); + } + } else { + alloc = msg16; + } + + HeapFree( GetProcessHeap(), 0, alloc ); + } + return WINMM_MAP_OK; +} + +/************************************************************************** + * MCI_MapMsg32ATo16 [internal] + * + * Map a 32-A bit MCI message to a 16 bit MCI message. + */ +static WINMM_MapType MCI_MapMsg32ATo16(WORD uDevType, WORD wMsg, DWORD dwFlags, DWORD* lParam) +{ + int size; + BOOLEAN keep = FALSE; + DWORD map = 0; + + if (*lParam == 0) + return WINMM_MAP_OK; + + /* FIXME: to add also (with seg/linear modifications to do): + * MCI_LIST, MCI_LOAD, MCI_QUALITY, MCI_RESERVE, MCI_RESTORE, MCI_SAVE + * MCI_SETAUDIO, MCI_SETTUNER, MCI_SETVIDEO + */ + switch (wMsg) { + case MCI_BREAK: + size = sizeof(MCI_BREAK_PARMS); + break; + /* case MCI_CAPTURE */ + case MCI_CLOSE: + case MCI_CLOSE_DRIVER: + case MCI_CONFIGURE: + size = sizeof(MCI_GENERIC_PARMS); + break; + /* case MCI_COPY: */ + case MCI_CUE: + switch (uDevType) { + case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_CUE_PARMS); break; + case MCI_DEVTYPE_VCR: /*size = sizeof(MCI_VCR_CUE_PARMS); break;*/ FIXME("NIY vcr\n"); return WINMM_MAP_NOMEM; + default: size = sizeof(MCI_GENERIC_PARMS); break; + } + break; + /* case MCI_CUT:*/ + case MCI_DELETE: + switch (uDevType) { + case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_DELETE_PARMS16); map = 0x0F1111FB; break; + case MCI_DEVTYPE_WAVEFORM_AUDIO:size = sizeof(MCI_WAVE_DELETE_PARMS); break; + default: size = sizeof(MCI_GENERIC_PARMS); break; + } + break; + /* case MCI_ESCAPE: */ + case MCI_FREEZE: + switch (uDevType) { + case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_FREEZE_PARMS); map = 0x0001111B; break; + case MCI_DEVTYPE_OVERLAY: size = sizeof(MCI_OVLY_RECT_PARMS); map = 0x0001111B; break; + default: size = sizeof(MCI_GENERIC_PARMS); break; + } + break; + case MCI_GETDEVCAPS: + keep = TRUE; + size = sizeof(MCI_GETDEVCAPS_PARMS); + break; + /* case MCI_INDEX: */ + case MCI_INFO: + { + LPMCI_INFO_PARMSA mip32a = (LPMCI_INFO_PARMSA)(*lParam); + LPMCI_INFO_PARMS16 mip16; + + switch (uDevType) { + case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_INFO_PARMS16); break; + default: size = sizeof(MCI_INFO_PARMS16); break; + } + mip16 = HeapAlloc( GetProcessHeap(), 0, size); + if (mip16) + { + mip16->dwCallback = mip32a->dwCallback; + mip16->lpstrReturn = MapLS( mip32a->lpstrReturn ); + mip16->dwRetSize = mip32a->dwRetSize; + if (uDevType == MCI_DEVTYPE_DIGITAL_VIDEO) { + ((LPMCI_DGV_INFO_PARMS16)mip16)->dwItem = ((LPMCI_DGV_INFO_PARMSA)mip32a)->dwItem; + } + } else { + return WINMM_MAP_NOMEM; + } + *lParam = MapLS(mip16); + } + return WINMM_MAP_OKMEM; + /* case MCI_MARK: */ + /* case MCI_MONITOR: */ + case MCI_OPEN: + case MCI_OPEN_DRIVER: + { + LPMCI_OPEN_PARMSA mop32a = (LPMCI_OPEN_PARMSA)(*lParam); + char* ptr = HeapAlloc( GetProcessHeap(), 0, + sizeof(LPMCI_OPEN_PARMSA) + sizeof(MCI_OPEN_PARMS16) + 2 * sizeof(DWORD)); + LPMCI_OPEN_PARMS16 mop16; + + + if (ptr) { + *(LPMCI_OPEN_PARMSA*)(ptr) = mop32a; + mop16 = (LPMCI_OPEN_PARMS16)(ptr + sizeof(LPMCI_OPEN_PARMSA)); + mop16->dwCallback = mop32a->dwCallback; + mop16->wDeviceID = mop32a->wDeviceID; + if (dwFlags & MCI_OPEN_TYPE) { + if (dwFlags & MCI_OPEN_TYPE_ID) { + /* dword "transparent" value */ + mop16->lpstrDeviceType = (SEGPTR)mop32a->lpstrDeviceType; + } else { + /* string */ + mop16->lpstrDeviceType = MapLS( mop32a->lpstrDeviceType ); + } + } else { + /* nuthin' */ + mop16->lpstrDeviceType = 0; + } + if (dwFlags & MCI_OPEN_ELEMENT) { + if (dwFlags & MCI_OPEN_ELEMENT_ID) { + mop16->lpstrElementName = (SEGPTR)mop32a->lpstrElementName; + } else { + mop16->lpstrElementName = MapLS( mop32a->lpstrElementName ); + } + } else { + mop16->lpstrElementName = 0; + } + if (dwFlags & MCI_OPEN_ALIAS) { + mop16->lpstrAlias = MapLS( mop32a->lpstrAlias ); + } else { + mop16->lpstrAlias = 0; + } + /* copy extended information if any... + * FIXME: this may seg fault if initial structure does not contain them and + * the reads after msip16 fail under LDT limits... + * NOTE: this should be split in two. First pass, while calling MCI_OPEN, and + * should not take care of extended parameters, and should be used by MCI_Open + * to fetch uDevType. When, this is known, the mapping for sending the + * MCI_OPEN_DRIVER shall be done depending on uDevType. + */ + memcpy(mop16 + 1, mop32a + 1, 2 * sizeof(DWORD)); + } else { + return WINMM_MAP_NOMEM; + } + *lParam = (LPARAM)MapLS(ptr) + sizeof(LPMCI_OPEN_PARMSA); + } + return WINMM_MAP_OKMEM; + /* case MCI_PASTE:*/ + case MCI_PAUSE: + size = sizeof(MCI_GENERIC_PARMS); + break; + case MCI_PLAY: + size = sizeof(MCI_PLAY_PARMS); + break; + case MCI_PUT: + switch (uDevType) { + case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_RECT_PARMS16); map = 0x0001111B; break; + case MCI_DEVTYPE_OVERLAY: size = sizeof(MCI_OVLY_RECT_PARMS); map = 0x0001111B; break; + default: size = sizeof(MCI_GENERIC_PARMS); break; + } + break; + case MCI_REALIZE: + size = sizeof(MCI_GENERIC_PARMS); + break; + case MCI_RECORD: + switch (uDevType) { + case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_RECORD_PARMS16); map = 0x0F1111FB; break; + case MCI_DEVTYPE_VCR: /*size = sizeof(MCI_VCR_RECORD_PARMS); break;*/FIXME("NIY vcr\n"); return WINMM_MAP_NOMEM; + default: size = sizeof(MCI_RECORD_PARMS); break; + } + break; + case MCI_RESUME: + size = sizeof(MCI_GENERIC_PARMS); + break; + case MCI_SEEK: + switch (uDevType) { + case MCI_DEVTYPE_VCR: /*size = sizeof(MCI_VCR_SEEK_PARMS); break;*/FIXME("NIY vcr\n"); return WINMM_MAP_NOMEM; + default: size = sizeof(MCI_SEEK_PARMS); break; + } + break; + case MCI_SET: + switch (uDevType) { + case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_SET_PARMS); break; + case MCI_DEVTYPE_VCR: /*size = sizeof(MCI_VCR_SET_PARMS); break;*/FIXME("NIY vcr\n"); return WINMM_MAP_NOMEM; + case MCI_DEVTYPE_SEQUENCER: size = sizeof(MCI_SEQ_SET_PARMS); break; + /* FIXME: normally the 16 and 32 bit structures are byte by byte aligned, + * so not doing anything should work... + */ + case MCI_DEVTYPE_WAVEFORM_AUDIO:size = sizeof(MCI_WAVE_SET_PARMS); break; + default: size = sizeof(MCI_SET_PARMS); break; + } + break; + case MCI_SETAUDIO: + switch (uDevType) { + case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_SETAUDIO_PARMS16);map = 0x0000077FF; break; + case MCI_DEVTYPE_VCR: /*size = sizeof(MCI_VCR_SETAUDIO_PARMS); break;*/FIXME("NIY vcr\n"); return WINMM_MAP_NOMEM; + default: size = sizeof(MCI_GENERIC_PARMS); break; + } + break; + /* case MCI_SETTIMECODE:*/ + /* case MCI_SIGNAL:*/ + case MCI_SPIN: + size = sizeof(MCI_SET_PARMS); + break; + case MCI_STATUS: + keep = TRUE; + switch (uDevType) { + /* FIXME: + * don't know if buffer for value is the one passed through lpstrDevice + * or is provided by MCI driver. + * Assuming solution 2: provided by MCI driver, so zeroing on entry + */ + case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_STATUS_PARMS16); map = 0x0B6FF; break; + case MCI_DEVTYPE_VCR: /*size = sizeof(MCI_VCR_STATUS_PARMS); break;*/FIXME("NIY vcr\n"); return WINMM_MAP_NOMEM; + default: size = sizeof(MCI_STATUS_PARMS); break; + } + break; + case MCI_STEP: + switch (uDevType) { + case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_STEP_PARMS); break; + case MCI_DEVTYPE_VCR: /*size = sizeof(MCI_VCR_STEP_PARMS); break;*/FIXME("NIY vcr\n"); return WINMM_MAP_NOMEM; + case MCI_DEVTYPE_VIDEODISC: size = sizeof(MCI_VD_STEP_PARMS); break; + default: size = sizeof(MCI_GENERIC_PARMS); break; + } + break; + case MCI_STOP: + size = sizeof(MCI_SET_PARMS); + break; + case MCI_SYSINFO: + { + LPMCI_SYSINFO_PARMSA msip32a = (LPMCI_SYSINFO_PARMSA)(*lParam); + LPMCI_SYSINFO_PARMS16 msip16; + char* ptr = HeapAlloc( GetProcessHeap(), 0, + sizeof(LPMCI_SYSINFO_PARMSA) + sizeof(MCI_SYSINFO_PARMS16) ); + + if (ptr) { + *(LPMCI_SYSINFO_PARMSA*)(ptr) = msip32a; + msip16 = (LPMCI_SYSINFO_PARMS16)(ptr + sizeof(LPMCI_SYSINFO_PARMSA)); + + msip16->dwCallback = msip32a->dwCallback; + msip16->lpstrReturn = MapLS( msip32a->lpstrReturn ); + msip16->dwRetSize = msip32a->dwRetSize; + msip16->dwNumber = msip32a->dwNumber; + msip16->wDeviceType = msip32a->wDeviceType; + } else { + return WINMM_MAP_NOMEM; + } + *lParam = (LPARAM)MapLS(ptr) + sizeof(LPMCI_SYSINFO_PARMSA); + } + return WINMM_MAP_OKMEM; + /* case MCI_UNDO: */ + case MCI_UNFREEZE: + switch (uDevType) { + case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_RECT_PARMS16); map = 0x0001111B; break; + case MCI_DEVTYPE_OVERLAY: size = sizeof(MCI_OVLY_RECT_PARMS16); map = 0x0001111B; break; + default: size = sizeof(MCI_GENERIC_PARMS); break; + } + break; + case MCI_UPDATE: + switch (uDevType) { + case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_UPDATE_PARMS16); map = 0x000B1111B; break; + default: size = sizeof(MCI_GENERIC_PARMS); break; + } + break; + case MCI_WHERE: + switch (uDevType) { + case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_RECT_PARMS16); map = 0x0001111B; keep = TRUE; break; + case MCI_DEVTYPE_OVERLAY: size = sizeof(MCI_OVLY_RECT_PARMS16); map = 0x0001111B; keep = TRUE; break; + default: size = sizeof(MCI_GENERIC_PARMS); break; + } + break; + case MCI_WINDOW: + switch (uDevType) { + case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_WINDOW_PARMS16); if (dwFlags & MCI_DGV_WINDOW_TEXT) map = 0x7FB; break; + case MCI_DEVTYPE_OVERLAY: size = sizeof(MCI_OVLY_WINDOW_PARMS16); if (dwFlags & MCI_OVLY_WINDOW_TEXT) map = 0x7FB; break; + default: size = sizeof(MCI_GENERIC_PARMS); break; + } + break; + case DRV_OPEN: + { + LPMCI_OPEN_DRIVER_PARMSA modp32a = (LPMCI_OPEN_DRIVER_PARMSA)(*lParam); + LPMCI_OPEN_DRIVER_PARMS16 modp16; + char *ptr = HeapAlloc( GetProcessHeap(), 0, + sizeof(LPMCI_OPEN_DRIVER_PARMSA) + sizeof(MCI_OPEN_DRIVER_PARMS16)); + + if (ptr) { + *(LPMCI_OPEN_DRIVER_PARMSA*)(ptr) = modp32a; + modp16 = (LPMCI_OPEN_DRIVER_PARMS16)(ptr + sizeof(LPMCI_OPEN_DRIVER_PARMSA)); + modp16->wDeviceID = modp32a->wDeviceID; + modp16->lpstrParams = MapLS( modp32a->lpstrParams ); + /* other fields are gonna be filled by the driver, don't copy them */ + } else { + return WINMM_MAP_NOMEM; + } + *lParam = (LPARAM)MapLS(ptr) + sizeof(LPMCI_OPEN_DRIVER_PARMSA); + } + return WINMM_MAP_OKMEM; + case DRV_LOAD: + case DRV_ENABLE: + case DRV_CLOSE: + case DRV_DISABLE: + case DRV_FREE: + case DRV_CONFIGURE: + case DRV_QUERYCONFIGURE: + case DRV_INSTALL: + case DRV_REMOVE: + case DRV_EXITSESSION: + case DRV_EXITAPPLICATION: + case DRV_POWER: + return WINMM_MAP_OK; + + default: + WARN("Don't know how to map msg=%s\n", MCI_MessageToString(wMsg)); + return WINMM_MAP_MSGERROR; + } + return MCI_MsgMapper32To16_Create((void**)lParam, size, map, keep); +} + +/************************************************************************** + * MCI_UnMapMsg32ATo16 [internal] + */ +static WINMM_MapType MCI_UnMapMsg32ATo16(WORD uDevType, WORD wMsg, DWORD dwFlags, DWORD lParam) +{ + int size = 0; + BOOLEAN kept = FALSE; /* there is no need to compute size when kept is FALSE */ + DWORD map = 0; + + switch (wMsg) { + case MCI_BREAK: + break; + /* case MCI_CAPTURE */ + case MCI_CLOSE: + case MCI_CLOSE_DRIVER: + case MCI_CONFIGURE: + break; + /* case MCI_COPY: */ + case MCI_CUE: + break; + /* case MCI_CUT: */ + case MCI_DELETE: + break; + /* case MCI_ESCAPE: */ + case MCI_FREEZE: + break; + case MCI_GETDEVCAPS: + kept = TRUE; + size = sizeof(MCI_GETDEVCAPS_PARMS); + break; + /* case MCI_INDEX: */ + case MCI_INFO: + { + LPMCI_INFO_PARMS16 mip16 = (LPMCI_INFO_PARMS16)MapSL(lParam); + UnMapLS( lParam ); + UnMapLS( mip16->lpstrReturn ); + HeapFree( GetProcessHeap(), 0, mip16 ); + } + return WINMM_MAP_OK; + /* case MCI_MARK: */ + /* case MCI_MONITOR: */ + case MCI_OPEN: + case MCI_OPEN_DRIVER: + if (lParam) { + LPMCI_OPEN_PARMS16 mop16 = (LPMCI_OPEN_PARMS16)MapSL(lParam); + LPMCI_OPEN_PARMSA mop32a = *(LPMCI_OPEN_PARMSA*)((char*)mop16 - sizeof(LPMCI_OPEN_PARMSA)); + UnMapLS( lParam ); + mop32a->wDeviceID = mop16->wDeviceID; + if ((dwFlags & MCI_OPEN_TYPE) && !(dwFlags & MCI_OPEN_TYPE_ID)) + UnMapLS( mop16->lpstrDeviceType ); + if ((dwFlags & MCI_OPEN_ELEMENT) && !(dwFlags & MCI_OPEN_ELEMENT_ID)) + UnMapLS( mop16->lpstrElementName ); + if (dwFlags & MCI_OPEN_ALIAS) + UnMapLS( mop16->lpstrAlias ); + HeapFree( GetProcessHeap(), 0, (char*)mop16 - sizeof(LPMCI_OPEN_PARMSA) ); + } + return WINMM_MAP_OK; + /* case MCI_PASTE:*/ + case MCI_PAUSE: + break; + case MCI_PLAY: + break; + case MCI_PUT: + break; + case MCI_REALIZE: + break; + case MCI_RECORD: + break; + case MCI_RESUME: + break; + case MCI_SEEK: + break; + case MCI_SET: + break; + case MCI_SETAUDIO: + switch (uDevType) { + case MCI_DEVTYPE_DIGITAL_VIDEO: map = 0x0000077FF; break; + case MCI_DEVTYPE_VCR: /*size = sizeof(MCI_VCR_SETAUDIO_PARMS); break;*/FIXME("NIY vcr\n"); return WINMM_MAP_NOMEM; + } + break; + /* case MCI_SETTIMECODE:*/ + /* case MCI_SIGNAL:*/ + case MCI_SPIN: + break; + case MCI_STATUS: + kept = TRUE; + switch (uDevType) { + case MCI_DEVTYPE_DIGITAL_VIDEO: + if (lParam) { + LPMCI_DGV_STATUS_PARMS16 mdsp16 = (LPMCI_DGV_STATUS_PARMS16)MapSL(lParam); + LPMCI_DGV_STATUS_PARMSA mdsp32a = *(LPMCI_DGV_STATUS_PARMSA*)((char*)mdsp16 - sizeof(LPMCI_DGV_STATUS_PARMSA)); + + UnMapLS( lParam ); + if (mdsp16) { + mdsp32a->dwReturn = mdsp16->dwReturn; + if (dwFlags & MCI_DGV_STATUS_DISKSPACE) { + TRACE("MCI_STATUS (DGV) lpstrDrive=%08lx\n", mdsp16->lpstrDrive); + TRACE("MCI_STATUS (DGV) lpstrDrive=%s\n", (LPSTR)MapSL(mdsp16->lpstrDrive)); + UnMapLS( mdsp16->lpstrDrive ); + } + HeapFree( GetProcessHeap(), 0, (char*)mdsp16 - sizeof(LPMCI_DGV_STATUS_PARMSA) ); + } else { + return WINMM_MAP_NOMEM; + } + } + return WINMM_MAP_OKMEM; + case MCI_DEVTYPE_VCR: /*size = sizeof(MCI_VCR_STATUS_PARMS); break;*/FIXME("NIY vcr\n"); return WINMM_MAP_NOMEM; + default: size = sizeof(MCI_STATUS_PARMS); break; + } + break; + case MCI_STEP: + break; + case MCI_STOP: + break; + case MCI_SYSINFO: + if (lParam) { + LPMCI_SYSINFO_PARMS16 msip16 = (LPMCI_SYSINFO_PARMS16)MapSL(lParam); + LPMCI_SYSINFO_PARMSA msip32a = *(LPMCI_SYSINFO_PARMSA*)((char*)msip16 - sizeof(LPMCI_SYSINFO_PARMSA)); + + UnMapLS( lParam ); + if (msip16) { + msip16->dwCallback = msip32a->dwCallback; + UnMapLS( msip16->lpstrReturn ); + HeapFree( GetProcessHeap(), 0, (char*)msip16 - sizeof(LPMCI_SYSINFO_PARMSA) ); + } else { + return WINMM_MAP_NOMEM; + } + } + return WINMM_MAP_OKMEM; + /* case MCI_UNDO: */ + case MCI_UNFREEZE: + break; + case MCI_UPDATE: + break; + case MCI_WHERE: + switch (uDevType) { + case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_RECT_PARMS16); map = 0x0001111B; kept = TRUE; break; + case MCI_DEVTYPE_OVERLAY: size = sizeof(MCI_OVLY_RECT_PARMS16); map = 0x0001111B; kept = TRUE; break; + default: break; + } + break; + case MCI_WINDOW: + switch (uDevType) { + case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_WINDOW_PARMS16); if (dwFlags & MCI_DGV_WINDOW_TEXT) map = 0x7666; break; + case MCI_DEVTYPE_OVERLAY: size = sizeof(MCI_OVLY_WINDOW_PARMS16); if (dwFlags & MCI_OVLY_WINDOW_TEXT) map = 0x7666; break; + default: break; + } + /* FIXME: see map function */ + break; + + case DRV_OPEN: + if (lParam) { + LPMCI_OPEN_DRIVER_PARMS16 modp16 = (LPMCI_OPEN_DRIVER_PARMS16)MapSL(lParam); + LPMCI_OPEN_DRIVER_PARMSA modp32a = *(LPMCI_OPEN_DRIVER_PARMSA*)((char*)modp16 - sizeof(LPMCI_OPEN_DRIVER_PARMSA)); + + UnMapLS( lParam ); + modp32a->wCustomCommandTable = modp16->wCustomCommandTable; + modp32a->wType = modp16->wType; + UnMapLS( modp16->lpstrParams ); + HeapFree( GetProcessHeap(), 0, (char *)modp16 - sizeof(LPMCI_OPEN_DRIVER_PARMSA) ); + } + return WINMM_MAP_OK; + case DRV_LOAD: + case DRV_ENABLE: + case DRV_CLOSE: + case DRV_DISABLE: + case DRV_FREE: + case DRV_CONFIGURE: + case DRV_QUERYCONFIGURE: + case DRV_INSTALL: + case DRV_REMOVE: + case DRV_EXITSESSION: + case DRV_EXITAPPLICATION: + case DRV_POWER: + FIXME("This is a hack\n"); + return WINMM_MAP_OK; + default: + FIXME("Map/Unmap internal error on msg=%s\n", MCI_MessageToString(wMsg)); + return WINMM_MAP_MSGERROR; + } + return MCI_MsgMapper32To16_Destroy((void*)lParam, size, map, kept); +} + +void MMDRV_Init16(void) +{ +#define A(_x,_y) MMDRV_InstallMap(_x, \ +MMDRV_##_y##_Map16To32A, MMDRV_##_y##_UnMap16To32A, \ +MMDRV_##_y##_Map32ATo16, MMDRV_##_y##_UnMap32ATo16, \ +MMDRV_##_y##_Callback) + A(MMDRV_AUX, Aux); + A(MMDRV_MIXER, Mixer); + A(MMDRV_MIDIIN, MidiIn); + A(MMDRV_MIDIOUT, MidiOut); + A(MMDRV_WAVEIN, WaveIn); + A(MMDRV_WAVEOUT, WaveOut); +#undef A + + pFnCallMMDrvFunc16 = MMDRV_CallMMDrvFunc16; + pFnLoadMMDrvFunc16 = MMDRV_LoadMMDrvFunc16; + + pFnMciMapMsg16To32A = MCI_MapMsg16To32A; + pFnMciUnMapMsg16To32A = MCI_UnMapMsg16To32A; + pFnMciMapMsg32ATo16 = MCI_MapMsg32ATo16; + pFnMciUnMapMsg32ATo16 = MCI_UnMapMsg32ATo16; +} diff --git a/reactos/lib/winmm/mmsystem.c b/reactos/lib/winmm/mmsystem.c new file mode 100644 index 00000000000..bef26db50d7 --- /dev/null +++ b/reactos/lib/winmm/mmsystem.c @@ -0,0 +1,3175 @@ +/* -*- tab-width: 8; c-basic-offset: 4 -*- */ + +/* + * MMSYTEM functions + * + * Copyright 1993 Martin Ayotte + * 1998-2003 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 + */ + +/* + * Eric POUECH : + * 99/4 added mmTask and mmThread functions support + */ + +#include <stdarg.h> +#include <string.h> + +#define NONAMELESSUNION +#define NONAMELESSSTRUCT +#include "windef.h" +#include "winbase.h" +#include "mmsystem.h" +#include "winreg.h" +#include "ntstatus.h" +#include "winternl.h" +#include "wownt32.h" +#include "winnls.h" + +#include "wine/winuser16.h" +#include "winemm16.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(mmsys); + +static WINE_MMTHREAD* WINMM_GetmmThread(HANDLE16); +static LPWINE_DRIVER DRIVER_OpenDriver16(LPCSTR, LPCSTR, LPARAM); +static LRESULT DRIVER_CloseDriver16(HDRVR16, LPARAM, LPARAM); +static LRESULT DRIVER_SendMessage16(HDRVR16, UINT, LPARAM, LPARAM); +static LRESULT MMIO_Callback16(SEGPTR, LPMMIOINFO, UINT, LPARAM, LPARAM); + +/* ################################################### + * # LIBRARY # + * ################################################### + */ + +/************************************************************************** + * DllEntryPoint (MMSYSTEM.2046) + * + * MMSYSTEM DLL entry point + * + */ +BOOL WINAPI MMSYSTEM_LibMain(DWORD fdwReason, HINSTANCE hinstDLL, WORD ds, + WORD wHeapSize, DWORD dwReserved1, WORD wReserved2) +{ + TRACE("%p 0x%lx\n", hinstDLL, fdwReason); + + switch (fdwReason) { + case DLL_PROCESS_ATTACH: + /* need to load WinMM in order to: + * - initiate correctly shared variables (WINMM_Init()) + */ + if (!GetModuleHandleA("WINMM.DLL") && !LoadLibraryA("WINMM.DLL")) + { + ERR("Could not load sibling WinMM.dll\n"); + return FALSE; + } + WINMM_IData->hWinMM16Instance = hinstDLL; + /* hook in our 16 bit function pointers */ + pFnGetMMThread16 = WINMM_GetmmThread; + pFnOpenDriver16 = DRIVER_OpenDriver16; + pFnCloseDriver16 = DRIVER_CloseDriver16; + pFnSendMessage16 = DRIVER_SendMessage16; + pFnMmioCallback16 = MMIO_Callback16; + pFnReleaseThunkLock = ReleaseThunkLock; + pFnRestoreThunkLock = RestoreThunkLock; + MMDRV_Init16(); + break; + case DLL_PROCESS_DETACH: + WINMM_IData->hWinMM16Instance = 0; + pFnGetMMThread16 = NULL; + pFnOpenDriver16 = NULL; + pFnCloseDriver16 = NULL; + pFnSendMessage16 = NULL; + pFnMmioCallback16 = NULL; + pFnReleaseThunkLock = NULL; + pFnRestoreThunkLock = NULL; + /* FIXME: add equivalent for MMDRV_Init16() */ + break; + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + break; + } + return TRUE; +} + +/************************************************************************** + * MMSYSTEM_WEP [MMSYSTEM.1] + */ +int WINAPI MMSYSTEM_WEP(HINSTANCE16 hInstance, WORD wDataSeg, + WORD cbHeapSize, LPSTR lpCmdLine) +{ + FIXME("STUB: Unloading MMSystem DLL ... hInst=%04X \n", hInstance); + return TRUE; +} + +/* ################################################### + * # PlaySound # + * ################################################### + */ + +/************************************************************************** + * PlaySound [MMSYSTEM.3] + */ +BOOL16 WINAPI PlaySound16(LPCSTR pszSound, HMODULE16 hmod, DWORD fdwSound) +{ + BOOL16 retv; + DWORD lc; + + if ((fdwSound & SND_RESOURCE) == SND_RESOURCE) + { + HGLOBAL16 handle; + HRSRC16 res; + + if (!(res = FindResource16( hmod, pszSound, "WAVE" ))) return FALSE; + if (!(handle = LoadResource16( hmod, res ))) return FALSE; + pszSound = LockResource16(handle); + fdwSound = (fdwSound & ~SND_RESOURCE) | SND_MEMORY; + /* FIXME: FreeResource16 */ + } + + ReleaseThunkLock(&lc); + retv = PlaySoundA(pszSound, 0, fdwSound); + RestoreThunkLock(lc); + + return retv; +} + +/************************************************************************** + * sndPlaySound [MMSYSTEM.2] + */ +BOOL16 WINAPI sndPlaySound16(LPCSTR lpszSoundName, UINT16 uFlags) +{ + BOOL16 retv; + DWORD lc; + + ReleaseThunkLock(&lc); + retv = sndPlaySoundA(lpszSoundName, uFlags); + RestoreThunkLock(lc); + + return retv; +} + +/* ################################################### + * # MISC # + * ################################################### + */ + +/************************************************************************** + * mmsystemGetVersion [MMSYSTEM.5] + * + */ +UINT16 WINAPI mmsystemGetVersion16(void) +{ + return mmsystemGetVersion(); +} + +/************************************************************************** + * DriverCallback [MMSYSTEM.31] + */ +BOOL16 WINAPI DriverCallback16(DWORD dwCallBack, UINT16 uFlags, HDRVR16 hDev, + WORD wMsg, DWORD dwUser, DWORD dwParam1, + DWORD dwParam2) +{ + return DriverCallback(dwCallBack, uFlags, HDRVR_32(hDev), wMsg, dwUser, dwParam1, dwParam2); +} + +/************************************************************************** + * OutputDebugStr [MMSYSTEM.30] + */ +void WINAPI OutputDebugStr16(LPCSTR str) +{ + OutputDebugStringA( str ); +} + + +/* ################################################### + * # MIXER # + * ################################################### + */ + +/************************************************************************** + * Mixer devices. New to Win95 + */ + +/************************************************************************** + * mixerGetNumDevs [MMSYSTEM.800] + */ +UINT16 WINAPI mixerGetNumDevs16(void) +{ + return MMDRV_GetNum(MMDRV_MIXER); +} + +/************************************************************************** + * mixerGetDevCaps [MMSYSTEM.801] + */ +UINT16 WINAPI mixerGetDevCaps16(UINT16 uDeviceID, LPMIXERCAPS16 lpCaps, + UINT16 uSize) +{ + MIXERCAPSA micA; + UINT ret; + + if (lpCaps == NULL) return MMSYSERR_INVALPARAM; + + ret = mixerGetDevCapsA(uDeviceID, &micA, sizeof(micA)); + if (ret == MMSYSERR_NOERROR) { + MIXERCAPS16 mic16; + mic16.wMid = micA.wMid; + mic16.wPid = micA.wPid; + mic16.vDriverVersion = micA.vDriverVersion; + strcpy(mic16.szPname, micA.szPname); + mic16.fdwSupport = micA.fdwSupport; + mic16.cDestinations = micA.cDestinations; + memcpy(lpCaps, &mic16, min(uSize, sizeof(mic16))); + } + return ret; +} + +/************************************************************************** + * mixerOpen [MMSYSTEM.802] + */ +UINT16 WINAPI mixerOpen16(LPHMIXER16 lphmix, UINT16 uDeviceID, DWORD dwCallback, + DWORD dwInstance, DWORD fdwOpen) +{ + HMIXER hmix; + UINT ret; + + ret = MIXER_Open(&hmix, uDeviceID, dwCallback, dwInstance, fdwOpen, FALSE); + if (lphmix) *lphmix = HMIXER_16(hmix); + return ret; +} + +/************************************************************************** + * mixerClose [MMSYSTEM.803] + */ +UINT16 WINAPI mixerClose16(HMIXER16 hMix) +{ + return mixerClose(HMIXER_32(hMix)); +} + +/************************************************************************** + * mixerGetID (MMSYSTEM.806) + */ +UINT16 WINAPI mixerGetID16(HMIXEROBJ16 hmix, LPUINT16 lpid, DWORD fdwID) +{ + UINT xid; + UINT ret = mixerGetID(HMIXEROBJ_32(hmix), &xid, fdwID); + + if (lpid) + *lpid = xid; + return ret; +} + +/************************************************************************** + * mixerGetControlDetails [MMSYSTEM.808] + */ +UINT16 WINAPI mixerGetControlDetails16(HMIXEROBJ16 hmix, + LPMIXERCONTROLDETAILS16 lpmcd, + DWORD fdwDetails) +{ + DWORD ret = MMSYSERR_NOTENABLED; + SEGPTR sppaDetails; + + TRACE("(%04x, %p, %08lx)\n", hmix, lpmcd, fdwDetails); + + if (lpmcd == NULL || lpmcd->cbStruct != sizeof(*lpmcd)) + return MMSYSERR_INVALPARAM; + + sppaDetails = (SEGPTR)lpmcd->paDetails; + lpmcd->paDetails = MapSL(sppaDetails); + ret = mixerGetControlDetailsA(HMIXEROBJ_32(hmix), + (LPMIXERCONTROLDETAILS)lpmcd, fdwDetails); + lpmcd->paDetails = (LPVOID)sppaDetails; + + return ret; +} + +/************************************************************************** + * mixerGetLineControls [MMSYSTEM.807] + */ +UINT16 WINAPI mixerGetLineControls16(HMIXEROBJ16 hmix, + LPMIXERLINECONTROLS16 lpmlc16, + DWORD fdwControls) +{ + MIXERLINECONTROLSA mlcA; + DWORD ret; + int i; + LPMIXERCONTROL16 lpmc16; + + TRACE("(%04x, %p, %08lx)\n", hmix, lpmlc16, fdwControls); + + if (lpmlc16 == NULL || lpmlc16->cbStruct != sizeof(*lpmlc16) || + lpmlc16->cbmxctrl != sizeof(MIXERCONTROL16)) + return MMSYSERR_INVALPARAM; + + mlcA.cbStruct = sizeof(mlcA); + mlcA.dwLineID = lpmlc16->dwLineID; + mlcA.u.dwControlID = lpmlc16->u.dwControlID; + mlcA.u.dwControlType = lpmlc16->u.dwControlType; + mlcA.cControls = lpmlc16->cControls; + mlcA.cbmxctrl = sizeof(MIXERCONTROLA); + mlcA.pamxctrl = HeapAlloc(GetProcessHeap(), 0, + mlcA.cControls * mlcA.cbmxctrl); + + ret = mixerGetLineControlsA(HMIXEROBJ_32(hmix), &mlcA, fdwControls); + + if (ret == MMSYSERR_NOERROR) { + lpmlc16->dwLineID = mlcA.dwLineID; + lpmlc16->u.dwControlID = mlcA.u.dwControlID; + lpmlc16->u.dwControlType = mlcA.u.dwControlType; + lpmlc16->cControls = mlcA.cControls; + + lpmc16 = MapSL(lpmlc16->pamxctrl); + + for (i = 0; i < mlcA.cControls; i++) { + lpmc16[i].cbStruct = sizeof(MIXERCONTROL16); + lpmc16[i].dwControlID = mlcA.pamxctrl[i].dwControlID; + lpmc16[i].dwControlType = mlcA.pamxctrl[i].dwControlType; + lpmc16[i].fdwControl = mlcA.pamxctrl[i].fdwControl; + lpmc16[i].cMultipleItems = mlcA.pamxctrl[i].cMultipleItems; + strcpy(lpmc16[i].szShortName, mlcA.pamxctrl[i].szShortName); + strcpy(lpmc16[i].szName, mlcA.pamxctrl[i].szName); + /* sizeof(lpmc16[i].Bounds) == sizeof(mlcA.pamxctrl[i].Bounds) */ + memcpy(&lpmc16[i].Bounds, &mlcA.pamxctrl[i].Bounds, + sizeof(mlcA.pamxctrl[i].Bounds)); + /* sizeof(lpmc16[i].Metrics) == sizeof(mlcA.pamxctrl[i].Metrics) */ + memcpy(&lpmc16[i].Metrics, &mlcA.pamxctrl[i].Metrics, + sizeof(mlcA.pamxctrl[i].Metrics)); + } + } + + HeapFree(GetProcessHeap(), 0, mlcA.pamxctrl); + + return ret; +} + +/************************************************************************** + * mixerGetLineInfo [MMSYSTEM.805] + */ +UINT16 WINAPI mixerGetLineInfo16(HMIXEROBJ16 hmix, LPMIXERLINE16 lpmli16, + DWORD fdwInfo) +{ + MIXERLINEA mliA; + UINT ret; + + TRACE("(%04x, %p, %08lx)\n", hmix, lpmli16, fdwInfo); + + if (lpmli16 == NULL || lpmli16->cbStruct != sizeof(*lpmli16)) + return MMSYSERR_INVALPARAM; + + mliA.cbStruct = sizeof(mliA); + switch (fdwInfo & MIXER_GETLINEINFOF_QUERYMASK) { + case MIXER_GETLINEINFOF_COMPONENTTYPE: + mliA.dwComponentType = lpmli16->dwComponentType; + break; + case MIXER_GETLINEINFOF_DESTINATION: + mliA.dwDestination = lpmli16->dwDestination; + break; + case MIXER_GETLINEINFOF_LINEID: + mliA.dwLineID = lpmli16->dwLineID; + break; + case MIXER_GETLINEINFOF_SOURCE: + mliA.dwDestination = lpmli16->dwDestination; + mliA.dwSource = lpmli16->dwSource; + break; + case MIXER_GETLINEINFOF_TARGETTYPE: + mliA.Target.dwType = lpmli16->Target.dwType; + mliA.Target.wMid = lpmli16->Target.wMid; + mliA.Target.wPid = lpmli16->Target.wPid; + mliA.Target.vDriverVersion = lpmli16->Target.vDriverVersion; + strcpy(mliA.Target.szPname, lpmli16->Target.szPname); + break; + default: + FIXME("Unsupported fdwControls=0x%08lx\n", fdwInfo); + } + + ret = mixerGetLineInfoA(HMIXEROBJ_32(hmix), &mliA, fdwInfo); + + lpmli16->dwDestination = mliA.dwDestination; + lpmli16->dwSource = mliA.dwSource; + lpmli16->dwLineID = mliA.dwLineID; + lpmli16->fdwLine = mliA.fdwLine; + lpmli16->dwUser = mliA.dwUser; + lpmli16->dwComponentType = mliA.dwComponentType; + lpmli16->cChannels = mliA.cChannels; + lpmli16->cConnections = mliA.cConnections; + lpmli16->cControls = mliA.cControls; + strcpy(lpmli16->szShortName, mliA.szShortName); + strcpy(lpmli16->szName, mliA.szName); + lpmli16->Target.dwType = mliA.Target.dwType; + lpmli16->Target.dwDeviceID = mliA.Target.dwDeviceID; + lpmli16->Target.wMid = mliA.Target.wMid; + lpmli16->Target.wPid = mliA.Target.wPid; + lpmli16->Target.vDriverVersion = mliA.Target.vDriverVersion; + strcpy(lpmli16->Target.szPname, mliA.Target.szPname); + + return ret; +} + +/************************************************************************** + * mixerSetControlDetails [MMSYSTEM.809] + */ +UINT16 WINAPI mixerSetControlDetails16(HMIXEROBJ16 hmix, + LPMIXERCONTROLDETAILS16 lpmcd, + DWORD fdwDetails) +{ + TRACE("(%04x, %p, %08lx)\n", hmix, lpmcd, fdwDetails); + return MMSYSERR_NOTENABLED; +} + +/************************************************************************** + * mixerMessage [MMSYSTEM.804] + */ +DWORD WINAPI mixerMessage16(HMIXER16 hmix, UINT16 uMsg, DWORD dwParam1, + DWORD dwParam2) +{ + return mixerMessage(HMIXER_32(hmix), uMsg, dwParam1, dwParam2); +} + +/************************************************************************** + * auxGetNumDevs [MMSYSTEM.350] + */ +UINT16 WINAPI auxGetNumDevs16(void) +{ + return MMDRV_GetNum(MMDRV_AUX); +} + +/* ################################################### + * # AUX # + * ################################################### + */ + +/************************************************************************** + * auxGetDevCaps [MMSYSTEM.351] + */ +UINT16 WINAPI auxGetDevCaps16(UINT16 uDeviceID, LPAUXCAPS16 lpCaps, UINT16 uSize) +{ + AUXCAPSA acA; + UINT ret; + + if (lpCaps == NULL) return MMSYSERR_INVALPARAM; + + ret = auxGetDevCapsA(uDeviceID, &acA, sizeof(acA)); + if (ret == MMSYSERR_NOERROR) { + AUXCAPS16 ac16; + ac16.wMid = acA.wMid; + ac16.wPid = acA.wPid; + ac16.vDriverVersion = acA.vDriverVersion; + strcpy(ac16.szPname, acA.szPname); + ac16.wTechnology = acA.wTechnology; + ac16.dwSupport = acA.dwSupport; + memcpy(lpCaps, &ac16, min(uSize, sizeof(ac16))); + } + return ret; +} + +/************************************************************************** + * auxGetVolume [MMSYSTEM.352] + */ +UINT16 WINAPI auxGetVolume16(UINT16 uDeviceID, LPDWORD lpdwVolume) +{ + LPWINE_MLD wmld; + + TRACE("(%04X, %p) !\n", uDeviceID, lpdwVolume); + + if ((wmld = MMDRV_Get((HANDLE)(ULONG_PTR)uDeviceID, MMDRV_AUX, TRUE)) == NULL) + return MMSYSERR_INVALHANDLE; + return MMDRV_Message(wmld, AUXDM_GETVOLUME, (DWORD_PTR)lpdwVolume, 0L, TRUE); +} + +/************************************************************************** + * auxSetVolume [MMSYSTEM.353] + */ +UINT16 WINAPI auxSetVolume16(UINT16 uDeviceID, DWORD dwVolume) +{ + LPWINE_MLD wmld; + + TRACE("(%04X, %lu) !\n", uDeviceID, dwVolume); + + if ((wmld = MMDRV_Get((HANDLE)(ULONG_PTR)uDeviceID, MMDRV_AUX, TRUE)) == NULL) + return MMSYSERR_INVALHANDLE; + return MMDRV_Message(wmld, AUXDM_SETVOLUME, dwVolume, 0L, TRUE); +} + +/************************************************************************** + * auxOutMessage [MMSYSTEM.354] + */ +DWORD WINAPI auxOutMessage16(UINT16 uDeviceID, UINT16 uMessage, DWORD dw1, DWORD dw2) +{ + LPWINE_MLD wmld; + + TRACE("(%04X, %04X, %08lX, %08lX)\n", uDeviceID, uMessage, dw1, dw2); + + switch (uMessage) { + case AUXDM_GETNUMDEVS: + case AUXDM_SETVOLUME: + /* no argument conversion needed */ + break; + case AUXDM_GETVOLUME: + return auxGetVolume16(uDeviceID, MapSL(dw1)); + case AUXDM_GETDEVCAPS: + return auxGetDevCaps16(uDeviceID, MapSL(dw1), dw2); + default: + TRACE("(%04x, %04x, %08lx, %08lx): unhandled message\n", + uDeviceID, uMessage, dw1, dw2); + break; + } + if ((wmld = MMDRV_Get((HANDLE)(ULONG_PTR)uDeviceID, MMDRV_AUX, TRUE)) == NULL) + return MMSYSERR_INVALHANDLE; + + return MMDRV_Message(wmld, uMessage, dw1, dw2, TRUE); +} + +/* ################################################### + * # MCI # + * ################################################### + */ + +/************************************************************************** + * mciGetErrorString [MMSYSTEM.706] + */ +BOOL16 WINAPI mciGetErrorString16(DWORD wError, LPSTR lpstrBuffer, UINT16 uLength) +{ + return mciGetErrorStringA(wError, lpstrBuffer, uLength); +} + +/************************************************************************** + * mciDriverNotify [MMSYSTEM.711] + */ +BOOL16 WINAPI mciDriverNotify16(HWND16 hWndCallBack, UINT16 wDevID, UINT16 wStatus) +{ + TRACE("(%04X, %04x, %04X)\n", hWndCallBack, wDevID, wStatus); + + return PostMessageA(HWND_32(hWndCallBack), MM_MCINOTIFY, wStatus, wDevID); +} + +/************************************************************************** + * mciGetDriverData [MMSYSTEM.708] + */ +DWORD WINAPI mciGetDriverData16(UINT16 uDeviceID) +{ + return mciGetDriverData(uDeviceID); +} + +/************************************************************************** + * mciSetDriverData [MMSYSTEM.707] + */ +BOOL16 WINAPI mciSetDriverData16(UINT16 uDeviceID, DWORD data) +{ + return mciSetDriverData(uDeviceID, data); +} + +/************************************************************************** + * mciSendCommand [MMSYSTEM.701] + */ +DWORD WINAPI mciSendCommand16(UINT16 wDevID, UINT16 wMsg, DWORD dwParam1, DWORD dwParam2) +{ + DWORD dwRet; + + TRACE("(%04X, %s, %08lX, %08lX)\n", + wDevID, MCI_MessageToString(wMsg), dwParam1, dwParam2); + + dwRet = MCI_SendCommand(wDevID, wMsg, dwParam1, dwParam2, FALSE); + dwRet = MCI_CleanUp(dwRet, wMsg, (DWORD)MapSL(dwParam2)); + TRACE("=> %ld\n", dwRet); + return dwRet; +} + +/************************************************************************** + * mciGetDeviceID [MMSYSTEM.703] + */ +UINT16 WINAPI mciGetDeviceID16(LPCSTR lpstrName) +{ + TRACE("(\"%s\")\n", lpstrName); + + return MCI_GetDriverFromString(lpstrName); +} + +/************************************************************************** + * mciSetYieldProc [MMSYSTEM.714] + */ +BOOL16 WINAPI mciSetYieldProc16(UINT16 uDeviceID, YIELDPROC16 fpYieldProc, DWORD dwYieldData) +{ + LPWINE_MCIDRIVER wmd; + + TRACE("(%u, %p, %08lx)\n", uDeviceID, fpYieldProc, dwYieldData); + + if (!(wmd = MCI_GetDriver(uDeviceID))) { + WARN("Bad uDeviceID\n"); + return FALSE; + } + + wmd->lpfnYieldProc = (YIELDPROC)fpYieldProc; + wmd->dwYieldData = dwYieldData; + wmd->bIs32 = FALSE; + + return TRUE; +} + +/************************************************************************** + * mciGetDeviceIDFromElementID [MMSYSTEM.715] + */ +UINT16 WINAPI mciGetDeviceIDFromElementID16(DWORD dwElementID, LPCSTR lpstrType) +{ + FIXME("(%lu, %s) stub\n", dwElementID, lpstrType); + return 0; +} + +/************************************************************************** + * mciGetYieldProc [MMSYSTEM.716] + */ +YIELDPROC16 WINAPI mciGetYieldProc16(UINT16 uDeviceID, DWORD* lpdwYieldData) +{ + LPWINE_MCIDRIVER wmd; + + TRACE("(%u, %p)\n", uDeviceID, lpdwYieldData); + + if (!(wmd = MCI_GetDriver(uDeviceID))) { + WARN("Bad uDeviceID\n"); + return NULL; + } + if (!wmd->lpfnYieldProc) { + WARN("No proc set\n"); + return NULL; + } + if (wmd->bIs32) { + WARN("Proc is 32 bit\n"); + return NULL; + } + return (YIELDPROC16)wmd->lpfnYieldProc; +} + +/************************************************************************** + * mciGetCreatorTask [MMSYSTEM.717] + */ +HTASK16 WINAPI mciGetCreatorTask16(UINT16 uDeviceID) +{ + LPWINE_MCIDRIVER wmd; + HTASK16 ret = 0; + + if ((wmd = MCI_GetDriver(uDeviceID))) + ret = HTASK_16(wmd->CreatorThread); + + TRACE("(%u) => %04x\n", uDeviceID, ret); + return ret; +} + +/************************************************************************** + * mciDriverYield [MMSYSTEM.710] + */ +UINT16 WINAPI mciDriverYield16(UINT16 uDeviceID) +{ + LPWINE_MCIDRIVER wmd; + UINT16 ret = 0; + + /* TRACE("(%04x)\n", uDeviceID); */ + + if (!(wmd = MCI_GetDriver(uDeviceID)) || !wmd->lpfnYieldProc || wmd->bIs32) { + UserYield16(); + } else { + ret = wmd->lpfnYieldProc(uDeviceID, wmd->dwYieldData); + } + + return ret; +} + +/* ################################################### + * # MIDI # + * ################################################### + */ + +/************************************************************************** + * midiOutGetNumDevs [MMSYSTEM.201] + */ +UINT16 WINAPI midiOutGetNumDevs16(void) +{ + return MMDRV_GetNum(MMDRV_MIDIOUT); +} + +/************************************************************************** + * midiOutGetDevCaps [MMSYSTEM.202] + */ +UINT16 WINAPI midiOutGetDevCaps16(UINT16 uDeviceID, LPMIDIOUTCAPS16 lpCaps, + UINT16 uSize) +{ + MIDIOUTCAPSA mocA; + UINT ret; + + if (lpCaps == NULL) return MMSYSERR_INVALPARAM; + + ret = midiOutGetDevCapsA(uDeviceID, &mocA, sizeof(mocA)); + if (ret == MMSYSERR_NOERROR) { + MIDIOUTCAPS16 moc16; + moc16.wMid = mocA.wMid; + moc16.wPid = mocA.wPid; + moc16.vDriverVersion = mocA.vDriverVersion; + strcpy(moc16.szPname, mocA.szPname); + moc16.wTechnology = mocA.wTechnology; + moc16.wVoices = mocA.wVoices; + moc16.wNotes = mocA.wNotes; + moc16.wChannelMask = mocA.wChannelMask; + moc16.dwSupport = mocA.dwSupport; + memcpy(lpCaps, &moc16, min(uSize, sizeof(moc16))); + } + return ret; + } + +/************************************************************************** + * midiOutGetErrorText [MMSYSTEM.203] + */ +UINT16 WINAPI midiOutGetErrorText16(UINT16 uError, LPSTR lpText, UINT16 uSize) +{ + return midiOutGetErrorTextA(uError, lpText, uSize); +} + +/************************************************************************** + * midiOutOpen [MMSYSTEM.204] + */ +UINT16 WINAPI midiOutOpen16(HMIDIOUT16* lphMidiOut, UINT16 uDeviceID, + DWORD dwCallback, DWORD dwInstance, DWORD dwFlags) +{ + HMIDIOUT hmo; + UINT ret; + + ret = MIDI_OutOpen(&hmo, uDeviceID, dwCallback, dwInstance, dwFlags, FALSE); + + if (lphMidiOut != NULL) *lphMidiOut = HMIDIOUT_16(hmo); + return ret; +} + +/************************************************************************** + * midiOutClose [MMSYSTEM.205] + */ +UINT16 WINAPI midiOutClose16(HMIDIOUT16 hMidiOut) +{ + return midiOutClose(HMIDIOUT_32(hMidiOut)); +} + +/************************************************************************** + * midiOutPrepareHeader [MMSYSTEM.206] + */ +UINT16 WINAPI midiOutPrepareHeader16(HMIDIOUT16 hMidiOut, /* [in] */ + SEGPTR lpsegMidiOutHdr, /* [???] */ + UINT16 uSize) /* [in] */ +{ + LPWINE_MLD wmld; + + TRACE("(%04X, %08lx, %d)\n", hMidiOut, lpsegMidiOutHdr, uSize); + + if ((wmld = MMDRV_Get(HMIDIOUT_32(hMidiOut), MMDRV_MIDIOUT, FALSE)) == NULL) + return MMSYSERR_INVALHANDLE; + + return MMDRV_Message(wmld, MODM_PREPARE, lpsegMidiOutHdr, uSize, FALSE); +} + +/************************************************************************** + * midiOutUnprepareHeader [MMSYSTEM.207] + */ +UINT16 WINAPI midiOutUnprepareHeader16(HMIDIOUT16 hMidiOut, /* [in] */ + SEGPTR lpsegMidiOutHdr, /* [???] */ + UINT16 uSize) /* [in] */ +{ + LPWINE_MLD wmld; + LPMIDIHDR16 lpMidiOutHdr = MapSL(lpsegMidiOutHdr); + + TRACE("(%04X, %08lx, %d)\n", hMidiOut, lpsegMidiOutHdr, uSize); + + if (!(lpMidiOutHdr->dwFlags & MHDR_PREPARED)) { + return MMSYSERR_NOERROR; + } + + if ((wmld = MMDRV_Get(HMIDIOUT_32(hMidiOut), MMDRV_MIDIOUT, FALSE)) == NULL) + return MMSYSERR_INVALHANDLE; + + return MMDRV_Message(wmld, MODM_UNPREPARE, lpsegMidiOutHdr, uSize, FALSE); +} + +/************************************************************************** + * midiOutShortMsg [MMSYSTEM.208] + */ +UINT16 WINAPI midiOutShortMsg16(HMIDIOUT16 hMidiOut, DWORD dwMsg) +{ + return midiOutShortMsg(HMIDIOUT_32(hMidiOut), dwMsg); +} + +/************************************************************************** + * midiOutLongMsg [MMSYSTEM.209] + */ +UINT16 WINAPI midiOutLongMsg16(HMIDIOUT16 hMidiOut, /* [in] */ + LPMIDIHDR16 lpsegMidiOutHdr, /* [???] NOTE: SEGPTR */ + UINT16 uSize) /* [in] */ +{ + LPWINE_MLD wmld; + + TRACE("(%04X, %p, %d)\n", hMidiOut, lpsegMidiOutHdr, uSize); + + if ((wmld = MMDRV_Get(HMIDIOUT_32(hMidiOut), MMDRV_MIDIOUT, FALSE)) == NULL) + return MMSYSERR_INVALHANDLE; + + return MMDRV_Message(wmld, MODM_LONGDATA, (DWORD_PTR)lpsegMidiOutHdr, uSize, FALSE); +} + +/************************************************************************** + * midiOutReset [MMSYSTEM.210] + */ +UINT16 WINAPI midiOutReset16(HMIDIOUT16 hMidiOut) +{ + return midiOutReset(HMIDIOUT_32(hMidiOut)); +} + +/************************************************************************** + * midiOutGetVolume [MMSYSTEM.211] + */ +UINT16 WINAPI midiOutGetVolume16(UINT16 uDeviceID, DWORD* lpdwVolume) +{ + return midiOutGetVolume(HMIDIOUT_32(uDeviceID), lpdwVolume); +} + +/************************************************************************** + * midiOutSetVolume [MMSYSTEM.212] + */ +UINT16 WINAPI midiOutSetVolume16(UINT16 uDeviceID, DWORD dwVolume) +{ + return midiOutSetVolume(HMIDIOUT_32(uDeviceID), dwVolume); +} + +/************************************************************************** + * midiOutCachePatches [MMSYSTEM.213] + */ +UINT16 WINAPI midiOutCachePatches16(HMIDIOUT16 hMidiOut, UINT16 uBank, + WORD* lpwPatchArray, UINT16 uFlags) +{ + return midiOutCachePatches(HMIDIOUT_32(hMidiOut), uBank, lpwPatchArray, + uFlags); +} + +/************************************************************************** + * midiOutCacheDrumPatches [MMSYSTEM.214] + */ +UINT16 WINAPI midiOutCacheDrumPatches16(HMIDIOUT16 hMidiOut, UINT16 uPatch, + WORD* lpwKeyArray, UINT16 uFlags) +{ + return midiOutCacheDrumPatches(HMIDIOUT_32(hMidiOut), uPatch, lpwKeyArray, uFlags); +} + +/************************************************************************** + * midiOutGetID [MMSYSTEM.215] + */ +UINT16 WINAPI midiOutGetID16(HMIDIOUT16 hMidiOut, UINT16* lpuDeviceID) +{ + LPWINE_MLD wmld; + + TRACE("(%04X, %p)\n", hMidiOut, lpuDeviceID); + + if (lpuDeviceID == NULL) return MMSYSERR_INVALPARAM; + if ((wmld = MMDRV_Get(HMIDIOUT_32(hMidiOut), MMDRV_MIDIOUT, FALSE)) == NULL) + return MMSYSERR_INVALHANDLE; + + *lpuDeviceID = wmld->uDeviceID; + return MMSYSERR_NOERROR; +} + +/************************************************************************** + * midiOutMessage [MMSYSTEM.216] + */ +DWORD WINAPI midiOutMessage16(HMIDIOUT16 hMidiOut, UINT16 uMessage, + DWORD dwParam1, DWORD dwParam2) +{ + LPWINE_MLD wmld; + + TRACE("(%04X, %04X, %08lX, %08lX)\n", hMidiOut, uMessage, dwParam1, dwParam2); + + if ((wmld = MMDRV_Get(HMIDIOUT_32(hMidiOut), MMDRV_MIDIOUT, FALSE)) == NULL) + return MMSYSERR_INVALHANDLE; + + switch (uMessage) { + case MODM_OPEN: + case MODM_CLOSE: + FIXME("can't handle OPEN or CLOSE message!\n"); + return MMSYSERR_NOTSUPPORTED; + + case MODM_GETVOLUME: + return midiOutGetVolume16(hMidiOut, MapSL(dwParam1)); + case MODM_LONGDATA: + return midiOutLongMsg16(hMidiOut, MapSL(dwParam1), dwParam2); + case MODM_PREPARE: + /* lpMidiOutHdr is still a segmented pointer for this function */ + return midiOutPrepareHeader16(hMidiOut, dwParam1, dwParam2); + case MODM_UNPREPARE: + return midiOutUnprepareHeader16(hMidiOut, dwParam1, dwParam2); + } + return MMDRV_Message(wmld, uMessage, dwParam1, dwParam2, TRUE); +} + +/************************************************************************** + * midiInGetNumDevs [MMSYSTEM.301] + */ +UINT16 WINAPI midiInGetNumDevs16(void) +{ + return MMDRV_GetNum(MMDRV_MIDIIN); +} + +/************************************************************************** + * midiInGetDevCaps [MMSYSTEM.302] + */ +UINT16 WINAPI midiInGetDevCaps16(UINT16 uDeviceID, LPMIDIINCAPS16 lpCaps, + UINT16 uSize) +{ + MIDIINCAPSA micA; + UINT ret; + + if (lpCaps == NULL) return MMSYSERR_INVALPARAM; + + ret = midiInGetDevCapsA(uDeviceID, &micA, uSize); + if (ret == MMSYSERR_NOERROR) { + MIDIINCAPS16 mic16; + mic16.wMid = micA.wMid; + mic16.wPid = micA.wPid; + mic16.vDriverVersion = micA.vDriverVersion; + strcpy(mic16.szPname, micA.szPname); + mic16.dwSupport = micA.dwSupport; + memcpy(lpCaps, &mic16, min(uSize, sizeof(mic16))); + } + return ret; +} + +/************************************************************************** + * midiInGetErrorText [MMSYSTEM.303] + */ +UINT16 WINAPI midiInGetErrorText16(UINT16 uError, LPSTR lpText, UINT16 uSize) +{ + return midiInGetErrorTextA(uError, lpText, uSize); +} + +/************************************************************************** + * midiInOpen [MMSYSTEM.304] + */ +UINT16 WINAPI midiInOpen16(HMIDIIN16* lphMidiIn, UINT16 uDeviceID, + DWORD dwCallback, DWORD dwInstance, DWORD dwFlags) +{ + HMIDIIN xhmid; + UINT ret; + + ret = MIDI_InOpen(&xhmid, uDeviceID, dwCallback, dwInstance, dwFlags, FALSE); + + if (lphMidiIn) *lphMidiIn = HMIDIIN_16(xhmid); + return ret; +} + +/************************************************************************** + * midiInClose [MMSYSTEM.305] + */ +UINT16 WINAPI midiInClose16(HMIDIIN16 hMidiIn) +{ + return midiInClose(HMIDIIN_32(hMidiIn)); +} + +/************************************************************************** + * midiInPrepareHeader [MMSYSTEM.306] + */ +UINT16 WINAPI midiInPrepareHeader16(HMIDIIN16 hMidiIn, /* [in] */ + SEGPTR lpsegMidiInHdr, /* [???] */ + UINT16 uSize) /* [in] */ +{ + LPWINE_MLD wmld; + + TRACE("(%04X, %08lx, %d)\n", hMidiIn, lpsegMidiInHdr, uSize); + + if ((wmld = MMDRV_Get(HMIDIIN_32(hMidiIn), MMDRV_MIDIIN, FALSE)) == NULL) + return MMSYSERR_INVALHANDLE; + + return MMDRV_Message(wmld, MIDM_PREPARE, lpsegMidiInHdr, uSize, FALSE); +} + +/************************************************************************** + * midiInUnprepareHeader [MMSYSTEM.307] + */ +UINT16 WINAPI midiInUnprepareHeader16(HMIDIIN16 hMidiIn, /* [in] */ + SEGPTR lpsegMidiInHdr, /* [???] */ + UINT16 uSize) /* [in] */ +{ + LPWINE_MLD wmld; + LPMIDIHDR16 lpMidiInHdr = MapSL(lpsegMidiInHdr); + + TRACE("(%04X, %08lx, %d)\n", hMidiIn, lpsegMidiInHdr, uSize); + + if (!(lpMidiInHdr->dwFlags & MHDR_PREPARED)) { + return MMSYSERR_NOERROR; + } + + if ((wmld = MMDRV_Get(HMIDIIN_32(hMidiIn), MMDRV_MIDIIN, FALSE)) == NULL) + return MMSYSERR_INVALHANDLE; + + return MMDRV_Message(wmld, MIDM_UNPREPARE, lpsegMidiInHdr, uSize, FALSE); +} + +/************************************************************************** + * midiInAddBuffer [MMSYSTEM.308] + */ +UINT16 WINAPI midiInAddBuffer16(HMIDIIN16 hMidiIn, /* [in] */ + MIDIHDR16* lpsegMidiInHdr, /* [???] NOTE: SEGPTR */ + UINT16 uSize) /* [in] */ +{ + LPWINE_MLD wmld; + + TRACE("(%04X, %p, %d)\n", hMidiIn, lpsegMidiInHdr, uSize); + + if ((wmld = MMDRV_Get(HMIDIIN_32(hMidiIn), MMDRV_MIDIIN, FALSE)) == NULL) + return MMSYSERR_INVALHANDLE; + + return MMDRV_Message(wmld, MIDM_ADDBUFFER, (DWORD_PTR)lpsegMidiInHdr, uSize, FALSE); +} + +/************************************************************************** + * midiInStart [MMSYSTEM.309] + */ +UINT16 WINAPI midiInStart16(HMIDIIN16 hMidiIn) +{ + return midiInStart(HMIDIIN_32(hMidiIn)); +} + +/************************************************************************** + * midiInStop [MMSYSTEM.310] + */ +UINT16 WINAPI midiInStop16(HMIDIIN16 hMidiIn) +{ + return midiInStop(HMIDIIN_32(hMidiIn)); +} + +/************************************************************************** + * midiInReset [MMSYSTEM.311] + */ +UINT16 WINAPI midiInReset16(HMIDIIN16 hMidiIn) +{ + return midiInReset(HMIDIIN_32(hMidiIn)); +} + +/************************************************************************** + * midiInGetID [MMSYSTEM.312] + */ +UINT16 WINAPI midiInGetID16(HMIDIIN16 hMidiIn, UINT16* lpuDeviceID) +{ + LPWINE_MLD wmld; + + TRACE("(%04X, %p)\n", hMidiIn, lpuDeviceID); + + if (lpuDeviceID == NULL) return MMSYSERR_INVALPARAM; + + if ((wmld = MMDRV_Get(HMIDIIN_32(hMidiIn), MMDRV_MIDIIN, TRUE)) == NULL) + return MMSYSERR_INVALHANDLE; + + *lpuDeviceID = wmld->uDeviceID; + + return MMSYSERR_NOERROR; +} + +/************************************************************************** + * midiInMessage [MMSYSTEM.313] + */ +DWORD WINAPI midiInMessage16(HMIDIIN16 hMidiIn, UINT16 uMessage, + DWORD dwParam1, DWORD dwParam2) +{ + LPWINE_MLD wmld; + + TRACE("(%04X, %04X, %08lX, %08lX)\n", hMidiIn, uMessage, dwParam1, dwParam2); + + switch (uMessage) { + case MIDM_OPEN: + case MIDM_CLOSE: + FIXME("can't handle OPEN or CLOSE message!\n"); + return MMSYSERR_NOTSUPPORTED; + + case MIDM_GETDEVCAPS: + return midiInGetDevCaps16(hMidiIn, MapSL(dwParam1), dwParam2); + case MIDM_PREPARE: + return midiInPrepareHeader16(hMidiIn, dwParam1, dwParam2); + case MIDM_UNPREPARE: + return midiInUnprepareHeader16(hMidiIn, dwParam1, dwParam2); + case MIDM_ADDBUFFER: + return midiInAddBuffer16(hMidiIn, MapSL(dwParam1), dwParam2); + } + + if ((wmld = MMDRV_Get(HMIDIIN_32(hMidiIn), MMDRV_MIDIIN, FALSE)) == NULL) + return MMSYSERR_INVALHANDLE; + + return MMDRV_Message(wmld, uMessage, dwParam1, dwParam2, FALSE); +} + +/************************************************************************** + * midiStreamClose [MMSYSTEM.252] + */ +MMRESULT16 WINAPI midiStreamClose16(HMIDISTRM16 hMidiStrm) +{ + return midiStreamClose(HMIDISTRM_32(hMidiStrm)); +} + +/************************************************************************** + * midiStreamOpen [MMSYSTEM.251] + */ +MMRESULT16 WINAPI midiStreamOpen16(HMIDISTRM16* phMidiStrm, LPUINT16 devid, + DWORD cMidi, DWORD dwCallback, + DWORD dwInstance, DWORD fdwOpen) +{ + HMIDISTRM hMidiStrm32; + MMRESULT ret; + UINT devid32; + + if (!phMidiStrm || !devid) + return MMSYSERR_INVALPARAM; + devid32 = *devid; + ret = MIDI_StreamOpen(&hMidiStrm32, &devid32, cMidi, dwCallback, + dwInstance, fdwOpen, FALSE); + *phMidiStrm = HMIDISTRM_16(hMidiStrm32); + *devid = devid32; + return ret; +} + +/************************************************************************** + * midiStreamOut [MMSYSTEM.254] + */ +MMRESULT16 WINAPI midiStreamOut16(HMIDISTRM16 hMidiStrm, LPMIDIHDR16 lpMidiHdr, UINT16 cbMidiHdr) +{ + return midiStreamOut(HMIDISTRM_32(hMidiStrm), (LPMIDIHDR)lpMidiHdr, + cbMidiHdr); +} + +/************************************************************************** + * midiStreamPause [MMSYSTEM.255] + */ +MMRESULT16 WINAPI midiStreamPause16(HMIDISTRM16 hMidiStrm) +{ + return midiStreamPause(HMIDISTRM_32(hMidiStrm)); +} + +/************************************************************************** + * midiStreamPosition [MMSYSTEM.253] + */ +MMRESULT16 WINAPI midiStreamPosition16(HMIDISTRM16 hMidiStrm, LPMMTIME16 lpmmt16, UINT16 cbmmt) +{ + MMTIME mmt32; + MMRESULT ret; + + if (!lpmmt16) + return MMSYSERR_INVALPARAM; + MMSYSTEM_MMTIME16to32(&mmt32, lpmmt16); + ret = midiStreamPosition(HMIDISTRM_32(hMidiStrm), &mmt32, sizeof(MMTIME)); + MMSYSTEM_MMTIME32to16(lpmmt16, &mmt32); + return ret; +} + +/************************************************************************** + * midiStreamProperty [MMSYSTEM.250] + */ +MMRESULT16 WINAPI midiStreamProperty16(HMIDISTRM16 hMidiStrm, LPBYTE lpPropData, DWORD dwProperty) +{ + return midiStreamProperty(HMIDISTRM_32(hMidiStrm), lpPropData, dwProperty); +} + +/************************************************************************** + * midiStreamRestart [MMSYSTEM.256] + */ +MMRESULT16 WINAPI midiStreamRestart16(HMIDISTRM16 hMidiStrm) +{ + return midiStreamRestart(HMIDISTRM_32(hMidiStrm)); +} + +/************************************************************************** + * midiStreamStop [MMSYSTEM.257] + */ +MMRESULT16 WINAPI midiStreamStop16(HMIDISTRM16 hMidiStrm) +{ + return midiStreamStop(HMIDISTRM_32(hMidiStrm)); +} + +/* ################################################### + * # WAVE # + * ################################################### + */ + +/************************************************************************** + * waveOutGetNumDevs [MMSYSTEM.401] + */ +UINT16 WINAPI waveOutGetNumDevs16(void) +{ + return MMDRV_GetNum(MMDRV_WAVEOUT); +} + +/************************************************************************** + * waveOutGetDevCaps [MMSYSTEM.402] + */ +UINT16 WINAPI waveOutGetDevCaps16(UINT16 uDeviceID, + LPWAVEOUTCAPS16 lpCaps, UINT16 uSize) +{ + WAVEOUTCAPSA wocA; + UINT ret; + TRACE("(%u %p %u)!\n", uDeviceID, lpCaps, uSize); + + if (lpCaps == NULL) return MMSYSERR_INVALPARAM; + + ret = waveOutGetDevCapsA(uDeviceID, &wocA, sizeof(wocA)); + if (ret == MMSYSERR_NOERROR) { + WAVEOUTCAPS16 woc16; + woc16.wMid = wocA.wMid; + woc16.wPid = wocA.wPid; + woc16.vDriverVersion = wocA.vDriverVersion; + strcpy(woc16.szPname, wocA.szPname); + woc16.dwFormats = wocA.dwFormats; + woc16.wChannels = wocA.wChannels; + woc16.dwSupport = wocA.dwSupport; + memcpy(lpCaps, &woc16, min(uSize, sizeof(woc16))); + } + return ret; +} + +/************************************************************************** + * waveOutGetErrorText [MMSYSTEM.403] + */ +UINT16 WINAPI waveOutGetErrorText16(UINT16 uError, LPSTR lpText, UINT16 uSize) +{ + return waveOutGetErrorTextA(uError, lpText, uSize); +} + +/************************************************************************** + * waveOutOpen [MMSYSTEM.404] + */ +UINT16 WINAPI waveOutOpen16(HWAVEOUT16* lphWaveOut, UINT16 uDeviceID, + const LPWAVEFORMATEX lpFormat, DWORD dwCallback, + DWORD dwInstance, DWORD dwFlags) +{ + HANDLE hWaveOut; + UINT ret; + + /* since layout of WAVEFORMATEX is the same for 16/32 bits, we directly + * call the 32 bit version + * however, we need to promote correctly the wave mapper id + * (0xFFFFFFFF and not 0x0000FFFF) + */ + ret = WAVE_Open(&hWaveOut, (uDeviceID == (UINT16)-1) ? (UINT)-1 : uDeviceID, + MMDRV_WAVEOUT, lpFormat, dwCallback, dwInstance, dwFlags, FALSE); + + if (lphWaveOut != NULL) *lphWaveOut = HWAVEOUT_16(hWaveOut); + return ret; +} + +/************************************************************************** + * waveOutClose [MMSYSTEM.405] + */ +UINT16 WINAPI waveOutClose16(HWAVEOUT16 hWaveOut) +{ + DWORD level; + UINT16 ret; + + ReleaseThunkLock(&level); + ret = waveOutClose(HWAVEOUT_32(hWaveOut)); + RestoreThunkLock(level); + return ret; +} + +/************************************************************************** + * waveOutPrepareHeader [MMSYSTEM.406] + */ +UINT16 WINAPI waveOutPrepareHeader16(HWAVEOUT16 hWaveOut, /* [in] */ + SEGPTR lpsegWaveOutHdr, /* [???] */ + UINT16 uSize) /* [in] */ +{ + LPWINE_MLD wmld; + LPWAVEHDR lpWaveOutHdr = MapSL(lpsegWaveOutHdr); + + TRACE("(%04X, %08lx, %u);\n", hWaveOut, lpsegWaveOutHdr, uSize); + + if (lpWaveOutHdr == NULL) return MMSYSERR_INVALPARAM; + + if ((wmld = MMDRV_Get(HWAVEOUT_32(hWaveOut), MMDRV_WAVEOUT, FALSE)) == NULL) + return MMSYSERR_INVALHANDLE; + + return MMDRV_Message(wmld, WODM_PREPARE, lpsegWaveOutHdr, uSize, FALSE); +} + +/************************************************************************** + * waveOutUnprepareHeader [MMSYSTEM.407] + */ +UINT16 WINAPI waveOutUnprepareHeader16(HWAVEOUT16 hWaveOut, /* [in] */ + SEGPTR lpsegWaveOutHdr, /* [???] */ + UINT16 uSize) /* [in] */ +{ + LPWINE_MLD wmld; + LPWAVEHDR lpWaveOutHdr = MapSL(lpsegWaveOutHdr); + + TRACE("(%04X, %08lx, %u);\n", hWaveOut, lpsegWaveOutHdr, uSize); + + if (!(lpWaveOutHdr->dwFlags & WHDR_PREPARED)) { + return MMSYSERR_NOERROR; + } + + if ((wmld = MMDRV_Get(HWAVEOUT_32(hWaveOut), MMDRV_WAVEOUT, FALSE)) == NULL) + return MMSYSERR_INVALHANDLE; + + return MMDRV_Message(wmld, WODM_UNPREPARE, lpsegWaveOutHdr, uSize, FALSE); +} + +/************************************************************************** + * waveOutWrite [MMSYSTEM.408] + */ +UINT16 WINAPI waveOutWrite16(HWAVEOUT16 hWaveOut, /* [in] */ + LPWAVEHDR lpsegWaveOutHdr, /* [???] NOTE: SEGPTR */ + UINT16 uSize) /* [in] */ +{ + LPWINE_MLD wmld; + + TRACE("(%04X, %p, %u);\n", hWaveOut, lpsegWaveOutHdr, uSize); + + if ((wmld = MMDRV_Get(HWAVEOUT_32(hWaveOut), MMDRV_WAVEOUT, FALSE)) == NULL) + return MMSYSERR_INVALHANDLE; + + return MMDRV_Message(wmld, WODM_WRITE, (DWORD_PTR)lpsegWaveOutHdr, uSize, FALSE); +} + +/************************************************************************** + * waveOutBreakLoop [MMSYSTEM.419] + */ +UINT16 WINAPI waveOutBreakLoop16(HWAVEOUT16 hWaveOut16) +{ + DWORD level; + UINT16 ret; + + ReleaseThunkLock(&level); + ret = waveOutBreakLoop(HWAVEOUT_32(hWaveOut16)); + RestoreThunkLock(level); + return ret; +} + +/************************************************************************** + * waveOutPause [MMSYSTEM.409] + */ +UINT16 WINAPI waveOutPause16(HWAVEOUT16 hWaveOut16) +{ + DWORD level; + UINT16 ret; + + ReleaseThunkLock(&level); + ret = waveOutPause(HWAVEOUT_32(hWaveOut16)); + RestoreThunkLock(level); + return ret; +} + +/************************************************************************** + * waveOutReset [MMSYSTEM.411] + */ +UINT16 WINAPI waveOutReset16(HWAVEOUT16 hWaveOut16) +{ + DWORD level; + UINT16 ret; + + ReleaseThunkLock(&level); + ret = waveOutReset(HWAVEOUT_32(hWaveOut16)); + RestoreThunkLock(level); + return ret; +} + +/************************************************************************** + * waveOutRestart [MMSYSTEM.410] + */ +UINT16 WINAPI waveOutRestart16(HWAVEOUT16 hWaveOut16) +{ + DWORD level; + UINT16 ret; + + ReleaseThunkLock(&level); + ret = waveOutRestart(HWAVEOUT_32(hWaveOut16)); + RestoreThunkLock(level); + return ret; +} + +/************************************************************************** + * waveOutGetPosition [MMSYSTEM.412] + */ +UINT16 WINAPI waveOutGetPosition16(HWAVEOUT16 hWaveOut, LPMMTIME16 lpTime, + UINT16 uSize) +{ + UINT ret; + MMTIME mmt; + + mmt.wType = lpTime->wType; + ret = waveOutGetPosition(HWAVEOUT_32(hWaveOut), &mmt, sizeof(mmt)); + MMSYSTEM_MMTIME32to16(lpTime, &mmt); + return ret; +} + +/************************************************************************** + * waveOutGetPitch [MMSYSTEM.413] + */ +UINT16 WINAPI waveOutGetPitch16(HWAVEOUT16 hWaveOut16, LPDWORD lpdw) +{ + return waveOutGetPitch(HWAVEOUT_32(hWaveOut16), lpdw); +} + +/************************************************************************** + * waveOutSetPitch [MMSYSTEM.414] + */ +UINT16 WINAPI waveOutSetPitch16(HWAVEOUT16 hWaveOut16, DWORD dw) +{ + return waveOutSetPitch(HWAVEOUT_32(hWaveOut16), dw); +} + +/************************************************************************** + * waveOutGetPlaybackRate [MMSYSTEM.417] + */ +UINT16 WINAPI waveOutGetPlaybackRate16(HWAVEOUT16 hWaveOut16, LPDWORD lpdw) +{ + return waveOutGetPlaybackRate(HWAVEOUT_32(hWaveOut16), lpdw); +} + +/************************************************************************** + * waveOutSetPlaybackRate [MMSYSTEM.418] + */ +UINT16 WINAPI waveOutSetPlaybackRate16(HWAVEOUT16 hWaveOut16, DWORD dw) +{ + return waveOutSetPlaybackRate(HWAVEOUT_32(hWaveOut16), dw); +} + +/************************************************************************** + * waveOutGetVolume [MMSYSTEM.415] + */ +UINT16 WINAPI waveOutGetVolume16(UINT16 devid, LPDWORD lpdw) +{ + return waveOutGetVolume(HWAVEOUT_32(devid), lpdw); +} + +/************************************************************************** + * waveOutSetVolume [MMSYSTEM.416] + */ +UINT16 WINAPI waveOutSetVolume16(UINT16 devid, DWORD dw) +{ + return waveOutSetVolume(HWAVEOUT_32(devid), dw); +} + +/************************************************************************** + * waveOutGetID [MMSYSTEM.420] + */ +UINT16 WINAPI waveOutGetID16(HWAVEOUT16 hWaveOut, UINT16* lpuDeviceID) +{ + LPWINE_MLD wmld; + + TRACE("(%04X, %p);\n", hWaveOut, lpuDeviceID); + + if (lpuDeviceID == NULL) return MMSYSERR_INVALHANDLE; + + if ((wmld = MMDRV_Get(HWAVEOUT_32(hWaveOut), MMDRV_WAVEOUT, FALSE)) == NULL) + return MMSYSERR_INVALHANDLE; + + *lpuDeviceID = wmld->uDeviceID; + return 0; +} + +/************************************************************************** + * waveOutMessage [MMSYSTEM.421] + */ +DWORD WINAPI waveOutMessage16(HWAVEOUT16 hWaveOut, UINT16 uMessage, + DWORD dwParam1, DWORD dwParam2) +{ + LPWINE_MLD wmld; + + TRACE("(%04x, %u, %ld, %ld)\n", hWaveOut, uMessage, dwParam1, dwParam2); + + if ((wmld = MMDRV_Get(HWAVEOUT_32(hWaveOut), MMDRV_WAVEOUT, FALSE)) == NULL) { + if ((wmld = MMDRV_Get(HWAVEOUT_32(hWaveOut), MMDRV_WAVEOUT, TRUE)) != NULL) { + if (uMessage == DRV_QUERYDRVENTRY || uMessage == DRV_QUERYDEVNODE) + dwParam1 = (DWORD)MapSL(dwParam1); + return MMDRV_PhysicalFeatures(wmld, uMessage, dwParam1, dwParam2); + } + return MMSYSERR_INVALHANDLE; + } + + /* from M$ KB */ + if (uMessage < DRVM_IOCTL || (uMessage >= DRVM_IOCTL_LAST && uMessage < DRVM_MAPPER)) + return MMSYSERR_INVALPARAM; + + return MMDRV_Message(wmld, uMessage, dwParam1, dwParam2, FALSE); +} + +/************************************************************************** + * waveInGetNumDevs [MMSYSTEM.501] + */ +UINT16 WINAPI waveInGetNumDevs16(void) +{ + return MMDRV_GetNum(MMDRV_WAVEIN); +} + +/************************************************************************** + * waveInGetDevCaps [MMSYSTEM.502] + */ +UINT16 WINAPI waveInGetDevCaps16(UINT16 uDeviceID, LPWAVEINCAPS16 lpCaps, + UINT16 uSize) +{ + WAVEINCAPSA wicA; + UINT ret; + + if (lpCaps == NULL) return MMSYSERR_INVALPARAM; + + ret = waveInGetDevCapsA(uDeviceID, &wicA, sizeof(wicA)); + if (ret == MMSYSERR_NOERROR) { + WAVEINCAPS16 wic16; + wic16.wMid = wicA.wMid; + wic16.wPid = wicA.wPid; + wic16.vDriverVersion = wicA.vDriverVersion; + strcpy(wic16.szPname, wicA.szPname); + wic16.dwFormats = wicA.dwFormats; + wic16.wChannels = wicA.wChannels; + memcpy(lpCaps, &wic16, min(uSize, sizeof(wic16))); + } + return ret; +} + +/************************************************************************** + * waveInGetErrorText [MMSYSTEM.503] + */ +UINT16 WINAPI waveInGetErrorText16(UINT16 uError, LPSTR lpText, UINT16 uSize) +{ + return waveInGetErrorTextA(uError, lpText, uSize); +} + +/************************************************************************** + * waveInOpen [MMSYSTEM.504] + */ +UINT16 WINAPI waveInOpen16(HWAVEIN16* lphWaveIn, UINT16 uDeviceID, + const LPWAVEFORMATEX lpFormat, DWORD dwCallback, + DWORD dwInstance, DWORD dwFlags) +{ + HANDLE hWaveIn; + UINT ret; + + /* since layout of WAVEFORMATEX is the same for 16/32 bits, we directly + * call the 32 bit version + * however, we need to promote correctly the wave mapper id + * (0xFFFFFFFF and not 0x0000FFFF) + */ + ret = WAVE_Open(&hWaveIn, (uDeviceID == (UINT16)-1) ? (UINT)-1 : uDeviceID, + MMDRV_WAVEIN, lpFormat, dwCallback, dwInstance, dwFlags, FALSE); + + if (lphWaveIn != NULL) *lphWaveIn = HWAVEIN_16(hWaveIn); + return ret; +} + +/************************************************************************** + * waveInClose [MMSYSTEM.505] + */ +UINT16 WINAPI waveInClose16(HWAVEIN16 hWaveIn) +{ + DWORD level; + UINT16 ret; + + ReleaseThunkLock(&level); + ret = waveInClose(HWAVEIN_32(hWaveIn)); + RestoreThunkLock(level); + return ret; +} + +/************************************************************************** + * waveInPrepareHeader [MMSYSTEM.506] + */ +UINT16 WINAPI waveInPrepareHeader16(HWAVEIN16 hWaveIn, /* [in] */ + SEGPTR lpsegWaveInHdr, /* [???] */ + UINT16 uSize) /* [in] */ +{ + LPWINE_MLD wmld; + LPWAVEHDR lpWaveInHdr = MapSL(lpsegWaveInHdr); + UINT16 ret; + + TRACE("(%04X, %p, %u);\n", hWaveIn, lpWaveInHdr, uSize); + + if (lpWaveInHdr == NULL) return MMSYSERR_INVALHANDLE; + if ((wmld = MMDRV_Get(HWAVEIN_32(hWaveIn), MMDRV_WAVEIN, FALSE)) == NULL) + return MMSYSERR_INVALHANDLE; + + lpWaveInHdr->dwBytesRecorded = 0; + + ret = MMDRV_Message(wmld, WIDM_PREPARE, lpsegWaveInHdr, uSize, FALSE); + return ret; +} + +/************************************************************************** + * waveInUnprepareHeader [MMSYSTEM.507] + */ +UINT16 WINAPI waveInUnprepareHeader16(HWAVEIN16 hWaveIn, /* [in] */ + SEGPTR lpsegWaveInHdr, /* [???] */ + UINT16 uSize) /* [in] */ +{ + LPWINE_MLD wmld; + LPWAVEHDR lpWaveInHdr = MapSL(lpsegWaveInHdr); + + TRACE("(%04X, %08lx, %u);\n", hWaveIn, lpsegWaveInHdr, uSize); + + if (lpWaveInHdr == NULL) return MMSYSERR_INVALPARAM; + + if (!(lpWaveInHdr->dwFlags & WHDR_PREPARED)) { + return MMSYSERR_NOERROR; + } + + if ((wmld = MMDRV_Get(HWAVEIN_32(hWaveIn), MMDRV_WAVEIN, FALSE)) == NULL) + return MMSYSERR_INVALHANDLE; + + return MMDRV_Message(wmld, WIDM_UNPREPARE, lpsegWaveInHdr, uSize, FALSE); +} + +/************************************************************************** + * waveInAddBuffer [MMSYSTEM.508] + */ +UINT16 WINAPI waveInAddBuffer16(HWAVEIN16 hWaveIn, /* [in] */ + WAVEHDR* lpsegWaveInHdr, /* [???] NOTE: SEGPTR */ + UINT16 uSize) /* [in] */ +{ + LPWINE_MLD wmld; + + TRACE("(%04X, %p, %u);\n", hWaveIn, lpsegWaveInHdr, uSize); + + if (lpsegWaveInHdr == NULL) return MMSYSERR_INVALPARAM; + if ((wmld = MMDRV_Get(HWAVEIN_32(hWaveIn), MMDRV_WAVEIN, FALSE)) == NULL) + return MMSYSERR_INVALHANDLE; + + return MMDRV_Message(wmld, WIDM_ADDBUFFER, (DWORD_PTR)lpsegWaveInHdr, uSize, FALSE); +} + +/************************************************************************** + * waveInReset [MMSYSTEM.511] + */ +UINT16 WINAPI waveInReset16(HWAVEIN16 hWaveIn16) +{ + DWORD level; + UINT16 ret; + + ReleaseThunkLock(&level); + ret = waveInReset(HWAVEIN_32(hWaveIn16)); + RestoreThunkLock(level); + return ret; +} + +/************************************************************************** + * waveInStart [MMSYSTEM.509] + */ +UINT16 WINAPI waveInStart16(HWAVEIN16 hWaveIn16) +{ + DWORD level; + UINT16 ret; + + ReleaseThunkLock(&level); + ret = waveInStart(HWAVEIN_32(hWaveIn16)); + RestoreThunkLock(level); + return ret; +} + +/************************************************************************** + * waveInStop [MMSYSTEM.510] + */ +UINT16 WINAPI waveInStop16(HWAVEIN16 hWaveIn16) +{ + DWORD level; + UINT16 ret; + + ReleaseThunkLock(&level); + ret = waveInStop(HWAVEIN_32(hWaveIn16)); + RestoreThunkLock(level); + return ret; +} + +/************************************************************************** + * waveInGetPosition [MMSYSTEM.512] + */ +UINT16 WINAPI waveInGetPosition16(HWAVEIN16 hWaveIn, LPMMTIME16 lpTime, + UINT16 uSize) +{ + UINT ret; + MMTIME mmt; + + mmt.wType = lpTime->wType; + ret = waveInGetPosition(HWAVEIN_32(hWaveIn), &mmt, sizeof(mmt)); + MMSYSTEM_MMTIME32to16(lpTime, &mmt); + return ret; +} + +/************************************************************************** + * waveInGetID [MMSYSTEM.513] + */ +UINT16 WINAPI waveInGetID16(HWAVEIN16 hWaveIn, UINT16* lpuDeviceID) +{ + LPWINE_MLD wmld; + + TRACE("(%04X, %p);\n", hWaveIn, lpuDeviceID); + + if (lpuDeviceID == NULL) return MMSYSERR_INVALHANDLE; + + if ((wmld = MMDRV_Get(HWAVEIN_32(hWaveIn), MMDRV_WAVEIN, FALSE)) == NULL) + return MMSYSERR_INVALHANDLE; + + *lpuDeviceID = wmld->uDeviceID; + return MMSYSERR_NOERROR; +} + +/************************************************************************** + * waveInMessage [MMSYSTEM.514] + */ +DWORD WINAPI waveInMessage16(HWAVEIN16 hWaveIn, UINT16 uMessage, + DWORD dwParam1, DWORD dwParam2) +{ + LPWINE_MLD wmld; + + TRACE("(%04x, %u, %ld, %ld)\n", hWaveIn, uMessage, dwParam1, dwParam2); + + if ((wmld = MMDRV_Get(HWAVEIN_32(hWaveIn), MMDRV_WAVEIN, FALSE)) == NULL) { + if ((wmld = MMDRV_Get(HWAVEIN_32(hWaveIn), MMDRV_WAVEIN, TRUE)) != NULL) { + if (uMessage == DRV_QUERYDRVENTRY || uMessage == DRV_QUERYDEVNODE) + dwParam1 = (DWORD)MapSL(dwParam1); + return MMDRV_PhysicalFeatures(wmld, uMessage, dwParam1, dwParam2); + } + return MMSYSERR_INVALHANDLE; + } + + /* from M$ KB */ + if (uMessage < DRVM_IOCTL || (uMessage >= DRVM_IOCTL_LAST && uMessage < DRVM_MAPPER)) + return MMSYSERR_INVALPARAM; + + return MMDRV_Message(wmld, uMessage, dwParam1, dwParam2, FALSE); +} + +/* ################################################### + * # TASK # + * ################################################### + */ + +/*#define USE_MM_TSK_WINE*/ + +/************************************************************************** + * mmTaskCreate [MMSYSTEM.900] + * + * Creates a 16 bit MM task. It's entry point is lpFunc, and it should be + * called upon creation with dwPmt as parameter. + */ +HINSTANCE16 WINAPI mmTaskCreate16(SEGPTR spProc, HINSTANCE16 *lphMmTask, DWORD dwPmt) +{ + HINSTANCE16 ret; + HINSTANCE16 handle; + char cmdline[16]; + DWORD showCmd = 0x40002; + LOADPARAMS16 lp; + + TRACE("(%08lx, %p, %08lx);\n", spProc, lphMmTask, dwPmt); + /* This to work requires NE modules to be started with a binary command line + * which is not currently the case. A patch exists but has never been committed. + * A workaround would be to integrate code for mmtask.tsk into Wine, but + * this requires tremendous work (starting with patching tools/build to + * create NE executables (and not only DLLs) for builtins modules. + * EP 99/04/25 + */ + FIXME("This is currently broken. It will fail\n"); + + cmdline[0] = 0x0d; + *(LPDWORD)(cmdline + 1) = (DWORD)spProc; + *(LPDWORD)(cmdline + 5) = dwPmt; + *(LPDWORD)(cmdline + 9) = 0; + + lp.hEnvironment = 0; + lp.cmdLine = MapLS(cmdline); + lp.showCmd = MapLS(&showCmd); + lp.reserved = 0; + +#ifndef USE_MM_TSK_WINE + handle = LoadModule16("c:\\windows\\system\\mmtask.tsk", &lp); +#else + handle = LoadModule16("mmtask.tsk", &lp); +#endif + if (handle < 32) { + ret = (handle) ? 1 : 2; + handle = 0; + } else { + ret = 0; + } + if (lphMmTask) + *lphMmTask = handle; + + UnMapLS( lp.cmdLine ); + UnMapLS( lp.showCmd ); + TRACE("=> 0x%04x/%d\n", handle, ret); + return ret; +} + +#ifdef USE_MM_TSK_WINE +/* C equivalent to mmtask.tsk binary content */ +void mmTaskEntryPoint16(LPSTR cmdLine, WORD di, WORD si) +{ + int len = cmdLine[0x80]; + + if (len / 2 == 6) { + void (*fpProc)(DWORD) = MapSL(*((DWORD*)(cmdLine + 1))); + DWORD dwPmt = *((DWORD*)(cmdLine + 5)); + +#if 0 + InitTask16(); /* FIXME: pmts / from context ? */ + InitApp(di); +#endif + if (SetMessageQueue16(0x40)) { + WaitEvent16(0); + if (HIWORD(fpProc)) { + OldYield16(); +/* EPP StackEnter16(); */ + (fpProc)(dwPmt); + } + } + } + OldYield16(); + OldYield16(); + OldYield16(); + ExitProcess(0); +} +#endif + +/************************************************************************** + * mmTaskBlock [MMSYSTEM.902] + */ +void WINAPI mmTaskBlock16(HINSTANCE16 WINE_UNUSED hInst) +{ + MSG msg; + + do { + GetMessageA(&msg, 0, 0, 0); + if (msg.hwnd) { + TranslateMessage(&msg); + DispatchMessageA(&msg); + } + } while (msg.message < 0x3A0); +} + +/************************************************************************** + * mmTaskSignal [MMSYSTEM.903] + */ +LRESULT WINAPI mmTaskSignal16(HTASK16 ht) +{ + TRACE("(%04x);\n", ht); + return PostThreadMessageW( HTASK_32(ht), WM_USER, 0, 0 ); +} + +/************************************************************************** + * mmGetCurrentTask [MMSYSTEM.904] + */ +HTASK16 WINAPI mmGetCurrentTask16(void) +{ + return GetCurrentTask(); +} + +/************************************************************************** + * mmTaskYield [MMSYSTEM.905] + */ +void WINAPI mmTaskYield16(void) +{ + MSG msg; + + if (PeekMessageA(&msg, 0, 0, 0, 0)) { + K32WOWYield16(); + } +} + +extern DWORD WINAPI GetProcessFlags(DWORD); + +/****************************************************************** + * WINMM_GetmmThread + * + * + */ +static WINE_MMTHREAD* WINMM_GetmmThread(HANDLE16 h) +{ + return (WINE_MMTHREAD*)MapSL( MAKESEGPTR(h, 0) ); +} + +void WINAPI WINE_mmThreadEntryPoint(DWORD); + +/************************************************************************** + * mmThreadCreate [MMSYSTEM.1120] + * + * undocumented + * Creates a MM thread, calling fpThreadAddr(dwPmt). + * dwFlags: + * bit.0 set means create a 16 bit task instead of thread calling a 16 bit proc + * bit.1 set means to open a VxD for this thread (unsupported) + */ +LRESULT WINAPI mmThreadCreate16(FARPROC16 fpThreadAddr, LPHANDLE16 lpHndl, DWORD dwPmt, DWORD dwFlags) +{ + HANDLE16 hndl; + LRESULT ret; + + TRACE("(%p, %p, %08lx, %08lx)!\n", fpThreadAddr, lpHndl, dwPmt, dwFlags); + + hndl = GlobalAlloc16(sizeof(WINE_MMTHREAD), GMEM_SHARE|GMEM_ZEROINIT); + + if (hndl == 0) { + ret = 2; + } else { + WINE_MMTHREAD* lpMMThd = WINMM_GetmmThread(hndl); + +#if 0 + /* force mmtask routines even if mmthread is required */ + /* this will work only if the patch about binary cmd line and NE tasks + * is committed + */ + dwFlags |= 1; +#endif + + lpMMThd->dwSignature = WINE_MMTHREAD_CREATED; + lpMMThd->dwCounter = 0; + lpMMThd->hThread = 0; + lpMMThd->dwThreadID = 0; + lpMMThd->fpThread = (DWORD)fpThreadAddr; + lpMMThd->dwThreadPmt = dwPmt; + lpMMThd->dwSignalCount = 0; + lpMMThd->hEvent = 0; + lpMMThd->hVxD = 0; + lpMMThd->dwStatus = 0; + lpMMThd->dwFlags = dwFlags; + lpMMThd->hTask = 0; + + if ((dwFlags & 1) == 0 && (GetProcessFlags(GetCurrentThreadId()) & 8) == 0) { + lpMMThd->hEvent = CreateEventA(0, 0, 1, 0); + + TRACE("Let's go crazy... trying new MM thread. lpMMThd=%p\n", lpMMThd); + if (lpMMThd->dwFlags & 2) { + /* as long as we don't support MM VxD in wine, we don't need + * to care about this flag + */ + /* FIXME("Don't know how to properly open VxD handles\n"); */ + /* lpMMThd->hVxD = OpenVxDHandle(lpMMThd->hEvent); */ + } + + lpMMThd->hThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)WINE_mmThreadEntryPoint, + (LPVOID)(DWORD)hndl, CREATE_SUSPENDED, &lpMMThd->dwThreadID); + if (lpMMThd->hThread == 0) { + WARN("Couldn't create thread\n"); + /* clean-up(VxDhandle...); devicedirectio... */ + if (lpMMThd->hEvent != 0) + CloseHandle(lpMMThd->hEvent); + ret = 2; + } else { + TRACE("Got a nice thread hndl=%p id=0x%08lx\n", lpMMThd->hThread, lpMMThd->dwThreadID); + ret = 0; + } + } else { + /* get WINE_mmThreadEntryPoint() + * 2047 is its ordinal in mmsystem.spec + */ + FARPROC16 fp = GetProcAddress16(GetModuleHandle16("MMSYSTEM"), (LPCSTR)2047); + + TRACE("farproc seg=0x%08lx lin=%p\n", (DWORD)fp, MapSL((SEGPTR)fp)); + + ret = (fp == 0) ? 2 : mmTaskCreate16((DWORD)fp, 0, hndl); + } + + if (ret == 0) { + if (lpMMThd->hThread && !ResumeThread(lpMMThd->hThread)) + WARN("Couldn't resume thread\n"); + + while (lpMMThd->dwStatus != 0x10) { /* test also HIWORD of dwStatus */ + UserYield16(); + } + } + } + + if (ret != 0) { + GlobalFree16(hndl); + hndl = 0; + } + + if (lpHndl) + *lpHndl = hndl; + + TRACE("ok => %ld\n", ret); + return ret; +} + +/************************************************************************** + * mmThreadSignal [MMSYSTEM.1121] + */ +void WINAPI mmThreadSignal16(HANDLE16 hndl) +{ + TRACE("(%04x)!\n", hndl); + + if (hndl) { + WINE_MMTHREAD* lpMMThd = WINMM_GetmmThread(hndl); + + lpMMThd->dwCounter++; + if (lpMMThd->hThread != 0) { + InterlockedIncrement(&lpMMThd->dwSignalCount); + SetEvent(lpMMThd->hEvent); + } else { + mmTaskSignal16(lpMMThd->hTask); + } + lpMMThd->dwCounter--; + } +} + +static void MMSYSTEM_ThreadBlock(WINE_MMTHREAD* lpMMThd) +{ + MSG msg; + DWORD ret; + + if (lpMMThd->dwThreadID != GetCurrentThreadId()) + ERR("Not called by thread itself\n"); + + for (;;) { + ResetEvent(lpMMThd->hEvent); + if (InterlockedDecrement(&lpMMThd->dwSignalCount) >= 0) + break; + InterlockedIncrement(&lpMMThd->dwSignalCount); + + TRACE("S1\n"); + + ret = MsgWaitForMultipleObjects(1, &lpMMThd->hEvent, FALSE, INFINITE, QS_ALLINPUT); + switch (ret) { + case WAIT_OBJECT_0: /* Event */ + TRACE("S2.1\n"); + break; + case WAIT_OBJECT_0 + 1: /* Msg */ + TRACE("S2.2\n"); + if (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) { + TranslateMessage(&msg); + DispatchMessageA(&msg); + } + break; + default: + WARN("S2.x unsupported ret val 0x%08lx\n", ret); + } + TRACE("S3\n"); + } +} + +/************************************************************************** + * mmThreadBlock [MMSYSTEM.1122] + */ +void WINAPI mmThreadBlock16(HANDLE16 hndl) +{ + TRACE("(%04x)!\n", hndl); + + if (hndl) { + WINE_MMTHREAD* lpMMThd = WINMM_GetmmThread(hndl); + + if (lpMMThd->hThread != 0) { + DWORD lc; + + ReleaseThunkLock(&lc); + MMSYSTEM_ThreadBlock(lpMMThd); + RestoreThunkLock(lc); + } else { + mmTaskBlock16(lpMMThd->hTask); + } + } + TRACE("done\n"); +} + +/************************************************************************** + * mmThreadIsCurrent [MMSYSTEM.1123] + */ +BOOL16 WINAPI mmThreadIsCurrent16(HANDLE16 hndl) +{ + BOOL16 ret = FALSE; + + TRACE("(%04x)!\n", hndl); + + if (hndl && mmThreadIsValid16(hndl)) { + WINE_MMTHREAD* lpMMThd = WINMM_GetmmThread(hndl); + ret = (GetCurrentThreadId() == lpMMThd->dwThreadID); + } + TRACE("=> %d\n", ret); + return ret; +} + +/************************************************************************** + * mmThreadIsValid [MMSYSTEM.1124] + */ +BOOL16 WINAPI mmThreadIsValid16(HANDLE16 hndl) +{ + BOOL16 ret = FALSE; + + TRACE("(%04x)!\n", hndl); + + if (hndl) { + WINE_MMTHREAD* lpMMThd = WINMM_GetmmThread(hndl); + + if (!IsBadWritePtr(lpMMThd, sizeof(WINE_MMTHREAD)) && + lpMMThd->dwSignature == WINE_MMTHREAD_CREATED && + IsTask16(lpMMThd->hTask)) { + lpMMThd->dwCounter++; + if (lpMMThd->hThread != 0) { + DWORD dwThreadRet; + if (GetExitCodeThread(lpMMThd->hThread, &dwThreadRet) && + dwThreadRet == STATUS_PENDING) { + ret = TRUE; + } + } else { + ret = TRUE; + } + lpMMThd->dwCounter--; + } + } + TRACE("=> %d\n", ret); + return ret; +} + +/************************************************************************** + * mmThreadGetTask [MMSYSTEM.1125] + */ +HANDLE16 WINAPI mmThreadGetTask16(HANDLE16 hndl) +{ + HANDLE16 ret = 0; + + TRACE("(%04x)\n", hndl); + + if (mmThreadIsValid16(hndl)) { + WINE_MMTHREAD* lpMMThd = WINMM_GetmmThread(hndl); + ret = lpMMThd->hTask; + } + return ret; +} + +/************************************************************************** + * __wine_mmThreadEntryPoint (MMSYSTEM.2047) + */ +void WINAPI WINE_mmThreadEntryPoint(DWORD _pmt) +{ + HANDLE16 hndl = (HANDLE16)_pmt; + WINE_MMTHREAD* lpMMThd = WINMM_GetmmThread(hndl); + + TRACE("(%04x %p)\n", hndl, lpMMThd); + + lpMMThd->hTask = LOWORD(GetCurrentTask()); + TRACE("[10-%p] setting hTask to 0x%08x\n", lpMMThd->hThread, lpMMThd->hTask); + lpMMThd->dwStatus = 0x10; + MMSYSTEM_ThreadBlock(lpMMThd); + TRACE("[20-%p]\n", lpMMThd->hThread); + lpMMThd->dwStatus = 0x20; + if (lpMMThd->fpThread) { + WOWCallback16(lpMMThd->fpThread, lpMMThd->dwThreadPmt); + } + lpMMThd->dwStatus = 0x30; + TRACE("[30-%p]\n", lpMMThd->hThread); + while (lpMMThd->dwCounter) { + Sleep(1); + /* K32WOWYield16();*/ + } + TRACE("[XX-%p]\n", lpMMThd->hThread); + /* paranoia */ + lpMMThd->dwSignature = WINE_MMTHREAD_DELETED; + /* close lpMMThread->hVxD directIO */ + if (lpMMThd->hEvent) + CloseHandle(lpMMThd->hEvent); + GlobalFree16(hndl); + TRACE("done\n"); +} + +typedef BOOL16 (WINAPI *MMCPLCALLBACK)(HWND, LPCSTR, LPCSTR, LPCSTR); + +/************************************************************************** + * mmShowMMCPLPropertySheet [MMSYSTEM.1150] + */ +BOOL16 WINAPI mmShowMMCPLPropertySheet16(HWND hWnd, LPCSTR lpStrDevice, + LPCSTR lpStrTab, LPCSTR lpStrTitle) +{ + HANDLE hndl; + BOOL16 ret = FALSE; + + TRACE("(%p \"%s\" \"%s\" \"%s\")\n", hWnd, lpStrDevice, lpStrTab, lpStrTitle); + + hndl = LoadLibraryA("MMSYS.CPL"); + if (hndl != 0) { + MMCPLCALLBACK fp = (MMCPLCALLBACK)GetProcAddress(hndl, "ShowMMCPLPropertySheet"); + if (fp != NULL) { + DWORD lc; + ReleaseThunkLock(&lc); + ret = (fp)(hWnd, lpStrDevice, lpStrTab, lpStrTitle); + RestoreThunkLock(lc); + } + FreeLibrary(hndl); + } + + return ret; +} + +/************************************************************************** + * StackEnter [MMSYSTEM.32] + */ +void WINAPI StackEnter16(void) +{ +#ifdef __i386__ + /* mmsystem.dll from Win 95 does only this: so does Wine */ + __asm__("stc"); +#endif +} + +/************************************************************************** + * StackLeave [MMSYSTEM.33] + */ +void WINAPI StackLeave16(void) +{ +#ifdef __i386__ + /* mmsystem.dll from Win 95 does only this: so does Wine */ + __asm__("stc"); +#endif +} + +/************************************************************************** + * WMMMidiRunOnce [MMSYSTEM.8] + */ +void WINAPI WMMMidiRunOnce16(void) +{ + FIXME("(), stub!\n"); +} + +/* ################################################### + * # DRIVER # + * ################################################### + */ + +/************************************************************************** + * DRIVER_MapMsg32To16 [internal] + * + * Map a 32 bit driver message to a 16 bit driver message. + */ +static WINMM_MapType DRIVER_MapMsg32To16(WORD wMsg, DWORD* lParam1, DWORD* lParam2) +{ + WINMM_MapType ret = WINMM_MAP_MSGERROR; + + switch (wMsg) { + case DRV_LOAD: + case DRV_ENABLE: + case DRV_DISABLE: + case DRV_FREE: + case DRV_QUERYCONFIGURE: + case DRV_REMOVE: + case DRV_EXITSESSION: + case DRV_EXITAPPLICATION: + case DRV_POWER: + case DRV_CLOSE: /* should be 0/0 */ + case DRV_OPEN: /* pass through */ + /* lParam1 and lParam2 are not used */ + ret = WINMM_MAP_OK; + break; + case DRV_CONFIGURE: + case DRV_INSTALL: + /* lParam1 is a handle to a window (conf) or to a driver (inst) or not used, + * lParam2 is a pointer to DRVCONFIGINFO + */ + if (*lParam2) { + LPDRVCONFIGINFO16 dci16 = HeapAlloc( GetProcessHeap(), 0, sizeof(*dci16) ); + LPDRVCONFIGINFO dci32 = (LPDRVCONFIGINFO)(*lParam2); + + if (dci16) { + LPSTR str1; + INT len; + dci16->dwDCISize = sizeof(DRVCONFIGINFO16); + + if (dci32->lpszDCISectionName) { + len = WideCharToMultiByte( CP_ACP, 0, dci32->lpszDCISectionName, -1, NULL, 0, NULL, NULL ); + str1 = HeapAlloc( GetProcessHeap(), 0, len ); + if (str1) { + WideCharToMultiByte( CP_ACP, 0, dci32->lpszDCISectionName, -1, str1, len, NULL, NULL ); + dci16->lpszDCISectionName = MapLS( str1 ); + } else { + return WINMM_MAP_NOMEM; + } + } else { + dci16->lpszDCISectionName = 0L; + } + if (dci32->lpszDCIAliasName) { + len = WideCharToMultiByte( CP_ACP, 0, dci32->lpszDCIAliasName, -1, NULL, 0, NULL, NULL ); + str1 = HeapAlloc( GetProcessHeap(), 0, len ); + if (str1) { + WideCharToMultiByte( CP_ACP, 0, dci32->lpszDCIAliasName, -1, str1, len, NULL, NULL ); + dci16->lpszDCIAliasName = MapLS( str1 ); + } else { + return WINMM_MAP_NOMEM; + } + } else { + dci16->lpszDCISectionName = 0L; + } + } else { + return WINMM_MAP_NOMEM; + } + *lParam2 = MapLS( dci16 ); + ret = WINMM_MAP_OKMEM; + } else { + ret = WINMM_MAP_OK; + } + break; + default: + if (!((wMsg >= 0x800 && wMsg < 0x900) || (wMsg >= 0x4000 && wMsg < 0x4100))) { + FIXME("Unknown message 0x%04x\n", wMsg); + } + ret = WINMM_MAP_OK; + } + return ret; +} + +/************************************************************************** + * DRIVER_UnMapMsg32To16 [internal] + * + * UnMap a 32 bit driver message to a 16 bit driver message. + */ +static WINMM_MapType DRIVER_UnMapMsg32To16(WORD wMsg, DWORD lParam1, DWORD lParam2) +{ + WINMM_MapType ret = WINMM_MAP_MSGERROR; + + switch (wMsg) { + case DRV_LOAD: + case DRV_ENABLE: + case DRV_DISABLE: + case DRV_FREE: + case DRV_QUERYCONFIGURE: + case DRV_REMOVE: + case DRV_EXITSESSION: + case DRV_EXITAPPLICATION: + case DRV_POWER: + case DRV_OPEN: + case DRV_CLOSE: + /* lParam1 and lParam2 are not used */ + break; + case DRV_CONFIGURE: + case DRV_INSTALL: + /* lParam1 is a handle to a window (or not used), lParam2 is a pointer to DRVCONFIGINFO, lParam2 */ + if (lParam2) { + LPDRVCONFIGINFO16 dci16 = MapSL(lParam2); + HeapFree( GetProcessHeap(), 0, MapSL(dci16->lpszDCISectionName) ); + HeapFree( GetProcessHeap(), 0, MapSL(dci16->lpszDCIAliasName) ); + UnMapLS( lParam2 ); + UnMapLS( dci16->lpszDCISectionName ); + UnMapLS( dci16->lpszDCIAliasName ); + HeapFree( GetProcessHeap(), 0, dci16 ); + } + ret = WINMM_MAP_OK; + break; + default: + if (!((wMsg >= 0x800 && wMsg < 0x900) || (wMsg >= 0x4000 && wMsg < 0x4100))) { + FIXME("Unknown message 0x%04x\n", wMsg); + } + ret = WINMM_MAP_OK; + } + return ret; +} + +/************************************************************************** + * DRIVER_TryOpenDriver16 [internal] + * + * Tries to load a 16 bit driver whose DLL's (module) name is lpFileName. + */ +static LPWINE_DRIVER DRIVER_OpenDriver16(LPCSTR fn, LPCSTR sn, LPARAM lParam2) +{ + LPWINE_DRIVER lpDrv = NULL; + LPCSTR cause = 0; + + TRACE("(%s, %08lX);\n", debugstr_a(sn), lParam2); + + lpDrv = HeapAlloc(GetProcessHeap(), 0, sizeof(WINE_DRIVER)); + if (lpDrv == NULL) {cause = "OOM"; goto exit;} + + /* FIXME: shall we do some black magic here on sn ? + * drivers32 => drivers + * mci32 => mci + * ... + */ + lpDrv->d.d16.hDriver16 = OpenDriver16(fn, sn, lParam2); + if (lpDrv->d.d16.hDriver16 == 0) {cause = "Not a 16 bit driver"; goto exit;} + lpDrv->dwFlags = WINE_GDF_16BIT; + + TRACE("=> %p\n", lpDrv); + return lpDrv; + exit: + HeapFree(GetProcessHeap(), 0, lpDrv); + TRACE("Unable to load 16 bit module %s: %s\n", debugstr_a(fn), cause); + return NULL; +} + +/****************************************************************** + * DRIVER_SendMessage16 + * + * + */ +static LRESULT DRIVER_SendMessage16(HDRVR16 hDrv16, UINT msg, + LPARAM lParam1, LPARAM lParam2) +{ + LRESULT ret = 0; + WINMM_MapType map; + + TRACE("Before sdm16 call hDrv=%04x wMsg=%04x p1=%08lx p2=%08lx\n", + hDrv16, msg, lParam1, lParam2); + + switch (map = DRIVER_MapMsg32To16(msg, &lParam1, &lParam2)) { + case WINMM_MAP_OKMEM: + case WINMM_MAP_OK: + ret = SendDriverMessage16(hDrv16, msg, lParam1, lParam2); + if (map == WINMM_MAP_OKMEM) + DRIVER_UnMapMsg32To16(msg, lParam1, lParam2); + default: + break; + } + return ret; +} + +/****************************************************************** + * DRIVER_CloseDriver16 + * + * + */ +static LRESULT DRIVER_CloseDriver16(HDRVR16 hDrv16, LPARAM lParam1, LPARAM lParam2) +{ + return CloseDriver16(hDrv16, lParam1, lParam2); +} + +/************************************************************************** + * DrvOpen [MMSYSTEM.1100] + */ +HDRVR16 WINAPI DrvOpen16(LPSTR lpDriverName, LPSTR lpSectionName, LPARAM lParam) +{ + return OpenDriver16(lpDriverName, lpSectionName, lParam); +} + +/************************************************************************** + * DrvClose [MMSYSTEM.1101] + */ +LRESULT WINAPI DrvClose16(HDRVR16 hDrv, LPARAM lParam1, LPARAM lParam2) +{ + return CloseDriver16(hDrv, lParam1, lParam2); +} + +/************************************************************************** + * DrvSendMessage [MMSYSTEM.1102] + */ +LRESULT WINAPI DrvSendMessage16(HDRVR16 hDrv, WORD msg, LPARAM lParam1, + LPARAM lParam2) +{ + return SendDriverMessage16(hDrv, msg, lParam1, lParam2); +} + +/************************************************************************** + * DrvGetModuleHandle [MMSYSTEM.1103] + */ +HANDLE16 WINAPI DrvGetModuleHandle16(HDRVR16 hDrv) +{ + return GetDriverModuleHandle16(hDrv); +} + +/************************************************************************** + * DrvDefDriverProc [MMSYSTEM.1104] + */ +LRESULT WINAPI DrvDefDriverProc16(DWORD dwDriverID, HDRVR16 hDrv, WORD wMsg, + DWORD dwParam1, DWORD dwParam2) +{ + return DefDriverProc16(dwDriverID, hDrv, wMsg, dwParam1, dwParam2); +} + +/************************************************************************** + * DriverProc [MMSYSTEM.6] + */ +LRESULT WINAPI DriverProc16(DWORD dwDevID, HDRVR16 hDrv, WORD wMsg, + DWORD dwParam1, DWORD dwParam2) +{ + TRACE("dwDevID=%08lx hDrv=%04x wMsg=%04x dwParam1=%08lx dwParam2=%08lx\n", + dwDevID, hDrv, wMsg, dwParam1, dwParam2); + + return DrvDefDriverProc16(dwDevID, hDrv, wMsg, dwParam1, dwParam2); +} + +/* ################################################### + * # TIME # + * ################################################### + */ + +/****************************************************************** + * MMSYSTEM_MMTIME32to16 + * + * + */ +void MMSYSTEM_MMTIME32to16(LPMMTIME16 mmt16, const MMTIME* mmt32) +{ + mmt16->wType = mmt32->wType; + /* layout of rest is the same for 32/16, + * Note: mmt16->u is 2 bytes smaller than mmt32->u, which has padding + */ + memcpy(&(mmt16->u), &(mmt32->u), sizeof(mmt16->u)); +} + +/****************************************************************** + * MMSYSTEM_MMTIME16to32 + * + * + */ +void MMSYSTEM_MMTIME16to32(LPMMTIME mmt32, const MMTIME16* mmt16) +{ + mmt32->wType = mmt16->wType; + /* layout of rest is the same for 32/16, + * Note: mmt16->u is 2 bytes smaller than mmt32->u, which has padding + */ + memcpy(&(mmt32->u), &(mmt16->u), sizeof(mmt16->u)); +} + +/************************************************************************** + * timeGetSystemTime [MMSYSTEM.601] + */ +MMRESULT16 WINAPI timeGetSystemTime16(LPMMTIME16 lpTime, UINT16 wSize) +{ + TRACE("(%p, %u);\n", lpTime, wSize); + + if (wSize >= sizeof(*lpTime)) { + lpTime->wType = TIME_MS; + TIME_MMTimeStart(); + lpTime->u.ms = WINMM_SysTimeMS; + + TRACE("=> %lu\n", lpTime->u.ms); + } + + return 0; +} + +/************************************************************************** + * timeSetEvent [MMSYSTEM.602] + */ +MMRESULT16 WINAPI timeSetEvent16(UINT16 wDelay, UINT16 wResol, LPTIMECALLBACK16 lpFunc, + DWORD dwUser, UINT16 wFlags) +{ + if (wFlags & WINE_TIMER_IS32) + WARN("Unknown windows flag... wine internally used.. ooch\n"); + + return TIME_SetEventInternal(wDelay, wResol, (LPTIMECALLBACK)lpFunc, + dwUser, wFlags & ~WINE_TIMER_IS32); +} + +/************************************************************************** + * timeKillEvent [MMSYSTEM.603] + */ +MMRESULT16 WINAPI timeKillEvent16(UINT16 wID) +{ + return timeKillEvent(wID); +} + +/************************************************************************** + * timeGetDevCaps [MMSYSTEM.604] + */ +MMRESULT16 WINAPI timeGetDevCaps16(LPTIMECAPS16 lpCaps, UINT16 wSize) +{ + TIMECAPS caps; + MMRESULT ret; + TRACE("(%p, %u) !\n", lpCaps, wSize); + + if (lpCaps == NULL) return MMSYSERR_INVALPARAM; + + ret = timeGetDevCaps(&caps, sizeof(caps)); + if (ret == MMSYSERR_NOERROR) { + TIMECAPS16 tc16; + tc16.wPeriodMin = caps.wPeriodMin; + tc16.wPeriodMax = caps.wPeriodMax; + memcpy(lpCaps, &tc16, min(wSize, sizeof(tc16))); + } + return ret; +} + +/************************************************************************** + * timeBeginPeriod [MMSYSTEM.605] + */ +MMRESULT16 WINAPI timeBeginPeriod16(UINT16 wPeriod) +{ + TRACE("(%u) !\n", wPeriod); + + return timeBeginPeriod(wPeriod); +} + +/************************************************************************** + * timeEndPeriod [MMSYSTEM.606] + */ +MMRESULT16 WINAPI timeEndPeriod16(UINT16 wPeriod) +{ + TRACE("(%u) !\n", wPeriod); + + return timeEndPeriod(wPeriod); +} + +/************************************************************************** + * mciSendString [MMSYSTEM.702] + */ +DWORD WINAPI mciSendString16(LPCSTR lpstrCommand, LPSTR lpstrRet, + UINT16 uRetLen, HWND16 hwndCallback) +{ + return mciSendStringA(lpstrCommand, lpstrRet, uRetLen, HWND_32(hwndCallback)); +} + +/************************************************************************** + * mciLoadCommandResource [MMSYSTEM.705] + */ +UINT16 WINAPI mciLoadCommandResource16(HINSTANCE16 hInst, LPCSTR resname, UINT16 type) +{ + HRSRC16 res; + HGLOBAL16 handle; + void *ptr; + + if (!(res = FindResource16( hInst, resname, (LPSTR)RT_RCDATA))) return MCI_NO_COMMAND_TABLE; + if (!(handle = LoadResource16( hInst, res ))) return MCI_NO_COMMAND_TABLE; + ptr = LockResource16(handle); + return MCI_SetCommandTable(ptr, type); + /* FIXME: FreeResource */ +} + +/************************************************************************** + * mciFreeCommandResource [MMSYSTEM.713] + */ +BOOL16 WINAPI mciFreeCommandResource16(UINT16 uTable) +{ + TRACE("(%04x)!\n", uTable); + + return mciFreeCommandResource(uTable); +} + +/* ################################################### + * # MMIO # + * ################################################### + */ + +/**************************************************************** + * MMIO_Map32To16 [INTERNAL] + */ +static LRESULT MMIO_Map32To16(DWORD wMsg, LPARAM* lp1, LPARAM* lp2) +{ + switch (wMsg) { + case MMIOM_CLOSE: + case MMIOM_SEEK: + /* nothing to do */ + break; + case MMIOM_OPEN: + case MMIOM_READ: + case MMIOM_WRITE: + case MMIOM_WRITEFLUSH: + *lp1 = MapLS( (void *)*lp1 ); + break; + case MMIOM_RENAME: + *lp1 = MapLS( (void *)*lp1 ); + *lp2 = MapLS( (void *)*lp2 ); + break; + default: + if (wMsg < MMIOM_USER) + TRACE("Not a mappable message (%ld)\n", wMsg); + } + return MMSYSERR_NOERROR; +} + +/**************************************************************** + * MMIO_UnMap32To16 [INTERNAL] + */ +static LRESULT MMIO_UnMap32To16(DWORD wMsg, LPARAM lParam1, LPARAM lParam2, + LPARAM lp1, LPARAM lp2) +{ + switch (wMsg) { + case MMIOM_CLOSE: + case MMIOM_SEEK: + /* nothing to do */ + break; + case MMIOM_OPEN: + case MMIOM_READ: + case MMIOM_WRITE: + case MMIOM_WRITEFLUSH: + UnMapLS( lp1 ); + break; + case MMIOM_RENAME: + UnMapLS( lp1 ); + UnMapLS( lp2 ); + break; + default: + if (wMsg < MMIOM_USER) + TRACE("Not a mappable message (%ld)\n", wMsg); + } + return MMSYSERR_NOERROR; +} + +/****************************************************************** + * MMIO_Callback16 + * + * + */ +static LRESULT MMIO_Callback16(SEGPTR cb16, LPMMIOINFO lpmmioinfo, UINT uMessage, + LPARAM lParam1, LPARAM lParam2) +{ + LRESULT result; + MMIOINFO16 mmioInfo16; + SEGPTR segmmioInfo16; + LPARAM lp1 = lParam1, lp2 = lParam2; + WORD args[7]; + + memset(&mmioInfo16, 0, sizeof(MMIOINFO16)); + mmioInfo16.lDiskOffset = lpmmioinfo->lDiskOffset; + mmioInfo16.adwInfo[0] = lpmmioinfo->adwInfo[0]; + mmioInfo16.adwInfo[1] = lpmmioinfo->adwInfo[1]; + mmioInfo16.adwInfo[2] = lpmmioinfo->adwInfo[2]; + mmioInfo16.adwInfo[3] = lpmmioinfo->adwInfo[3]; + /* map (lParam1, lParam2) into (lp1, lp2) 32=>16 */ + if ((result = MMIO_Map32To16(uMessage, &lp1, &lp2)) != MMSYSERR_NOERROR) + return result; + + segmmioInfo16 = MapLS(&mmioInfo16); + args[6] = HIWORD(segmmioInfo16); + args[5] = LOWORD(segmmioInfo16); + args[4] = uMessage; + args[3] = HIWORD(lp1); + args[2] = LOWORD(lp1); + args[1] = HIWORD(lp2); + args[0] = LOWORD(lp2); + WOWCallback16Ex( cb16, WCB16_PASCAL, sizeof(args), args, &result ); + UnMapLS(segmmioInfo16); + MMIO_UnMap32To16(uMessage, lParam1, lParam2, lp1, lp2); + + lpmmioinfo->lDiskOffset = mmioInfo16.lDiskOffset; + lpmmioinfo->adwInfo[0] = mmioInfo16.adwInfo[0]; + lpmmioinfo->adwInfo[1] = mmioInfo16.adwInfo[1]; + lpmmioinfo->adwInfo[2] = mmioInfo16.adwInfo[2]; + lpmmioinfo->adwInfo[3] = mmioInfo16.adwInfo[3]; + + return result; +} + +/****************************************************************** + * MMIO_ResetSegmentedData + * + */ +static LRESULT MMIO_SetSegmentedBuffer(HMMIO hmmio, SEGPTR ptr, BOOL release) +{ + LPWINE_MMIO wm; + + if ((wm = MMIO_Get(hmmio)) == NULL) + return MMSYSERR_INVALHANDLE; + if (release) UnMapLS(wm->segBuffer16); + wm->segBuffer16 = ptr; + return MMSYSERR_NOERROR; +} + +/************************************************************************** + * mmioOpen [MMSYSTEM.1210] + */ +HMMIO16 WINAPI mmioOpen16(LPSTR szFileName, MMIOINFO16* lpmmioinfo16, + DWORD dwOpenFlags) +{ + HMMIO ret; + + if (lpmmioinfo16) { + MMIOINFO mmioinfo; + + memset(&mmioinfo, 0, sizeof(mmioinfo)); + + mmioinfo.dwFlags = lpmmioinfo16->dwFlags; + mmioinfo.fccIOProc = lpmmioinfo16->fccIOProc; + mmioinfo.pIOProc = (LPMMIOPROC)lpmmioinfo16->pIOProc; + mmioinfo.cchBuffer = lpmmioinfo16->cchBuffer; + mmioinfo.pchBuffer = MapSL((DWORD)lpmmioinfo16->pchBuffer); + mmioinfo.adwInfo[0] = lpmmioinfo16->adwInfo[0]; + /* if we don't have a file name, it's likely a passed open file descriptor */ + if (!szFileName) + mmioinfo.adwInfo[0] = (DWORD)DosFileHandleToWin32Handle(mmioinfo.adwInfo[0]); + mmioinfo.adwInfo[1] = lpmmioinfo16->adwInfo[1]; + mmioinfo.adwInfo[2] = lpmmioinfo16->adwInfo[2]; + mmioinfo.adwInfo[3] = lpmmioinfo16->adwInfo[3]; + + ret = MMIO_Open(szFileName, &mmioinfo, dwOpenFlags, MMIO_PROC_16); + MMIO_SetSegmentedBuffer(mmioinfo.hmmio, (SEGPTR)lpmmioinfo16->pchBuffer, FALSE); + + lpmmioinfo16->wErrorRet = mmioinfo.wErrorRet; + lpmmioinfo16->hmmio = HMMIO_16(mmioinfo.hmmio); + } else { + ret = MMIO_Open(szFileName, NULL, dwOpenFlags, MMIO_PROC_32A); + } + return HMMIO_16(ret); +} + +/************************************************************************** + * mmioClose [MMSYSTEM.1211] + */ +MMRESULT16 WINAPI mmioClose16(HMMIO16 hmmio, UINT16 uFlags) +{ + MMIO_SetSegmentedBuffer(HMMIO_32(hmmio), (SEGPTR)NULL, TRUE); + return mmioClose(HMMIO_32(hmmio), uFlags); +} + +/************************************************************************** + * mmioRead [MMSYSTEM.1212] + */ +LONG WINAPI mmioRead16(HMMIO16 hmmio, HPSTR pch, LONG cch) +{ + return mmioRead(HMMIO_32(hmmio), pch, cch); +} + +/************************************************************************** + * mmioWrite [MMSYSTEM.1213] + */ +LONG WINAPI mmioWrite16(HMMIO16 hmmio, HPCSTR pch, LONG cch) +{ + return mmioWrite(HMMIO_32(hmmio),pch,cch); +} + +/************************************************************************** + * mmioSeek [MMSYSTEM.1214] + */ +LONG WINAPI mmioSeek16(HMMIO16 hmmio, LONG lOffset, INT16 iOrigin) +{ + return mmioSeek(HMMIO_32(hmmio), lOffset, iOrigin); +} + +/************************************************************************** + * mmioGetInfo [MMSYSTEM.1215] + */ +MMRESULT16 WINAPI mmioGetInfo16(HMMIO16 hmmio, MMIOINFO16* lpmmioinfo, UINT16 uFlags) +{ + MMIOINFO mmioinfo; + MMRESULT ret; + LPWINE_MMIO wm; + + TRACE("(0x%04x,%p,0x%08x)\n", hmmio, lpmmioinfo, uFlags); + + if ((wm = MMIO_Get(HMMIO_32(hmmio))) == NULL) + return MMSYSERR_INVALHANDLE; + + ret = mmioGetInfo(HMMIO_32(hmmio), &mmioinfo, uFlags); + if (ret != MMSYSERR_NOERROR) return ret; + + lpmmioinfo->dwFlags = mmioinfo.dwFlags; + lpmmioinfo->fccIOProc = mmioinfo.fccIOProc; + lpmmioinfo->pIOProc = (wm->ioProc->type == MMIO_PROC_16) ? + (LPMMIOPROC16)wm->ioProc->pIOProc : NULL; + lpmmioinfo->wErrorRet = mmioinfo.wErrorRet; + lpmmioinfo->hTask = HTASK_16(mmioinfo.hTask); + lpmmioinfo->cchBuffer = mmioinfo.cchBuffer; + lpmmioinfo->pchBuffer = (void*)wm->segBuffer16; + lpmmioinfo->pchNext = (void*)(wm->segBuffer16 + (mmioinfo.pchNext - mmioinfo.pchBuffer)); + lpmmioinfo->pchEndRead = (void*)(wm->segBuffer16 + (mmioinfo.pchEndRead - mmioinfo.pchBuffer)); + lpmmioinfo->pchEndWrite = (void*)(wm->segBuffer16 + (mmioinfo.pchEndWrite - mmioinfo.pchBuffer)); + lpmmioinfo->lBufOffset = mmioinfo.lBufOffset; + lpmmioinfo->lDiskOffset = mmioinfo.lDiskOffset; + lpmmioinfo->adwInfo[0] = mmioinfo.adwInfo[0]; + lpmmioinfo->adwInfo[1] = mmioinfo.adwInfo[1]; + lpmmioinfo->adwInfo[2] = mmioinfo.adwInfo[2]; + lpmmioinfo->adwInfo[3] = mmioinfo.adwInfo[3]; + lpmmioinfo->dwReserved1 = 0; + lpmmioinfo->dwReserved2 = 0; + lpmmioinfo->hmmio = HMMIO_16(mmioinfo.hmmio); + + return MMSYSERR_NOERROR; +} + +/************************************************************************** + * mmioSetInfo [MMSYSTEM.1216] + */ +MMRESULT16 WINAPI mmioSetInfo16(HMMIO16 hmmio, const MMIOINFO16* lpmmioinfo, UINT16 uFlags) +{ + MMIOINFO mmioinfo; + MMRESULT ret; + + TRACE("(0x%04x,%p,0x%08x)\n",hmmio,lpmmioinfo,uFlags); + + ret = mmioGetInfo(HMMIO_32(hmmio), &mmioinfo, 0); + if (ret != MMSYSERR_NOERROR) return ret; + + /* check if seg and lin buffers are the same */ + if (mmioinfo.cchBuffer != lpmmioinfo->cchBuffer || + mmioinfo.pchBuffer != MapSL((DWORD)lpmmioinfo->pchBuffer)) + return MMSYSERR_INVALPARAM; + + /* check pointers coherence */ + if (lpmmioinfo->pchNext < lpmmioinfo->pchBuffer || + lpmmioinfo->pchNext > lpmmioinfo->pchBuffer + lpmmioinfo->cchBuffer || + lpmmioinfo->pchEndRead < lpmmioinfo->pchBuffer || + lpmmioinfo->pchEndRead > lpmmioinfo->pchBuffer + lpmmioinfo->cchBuffer || + lpmmioinfo->pchEndWrite < lpmmioinfo->pchBuffer || + lpmmioinfo->pchEndWrite > lpmmioinfo->pchBuffer + lpmmioinfo->cchBuffer) + return MMSYSERR_INVALPARAM; + + mmioinfo.pchNext = mmioinfo.pchBuffer + (lpmmioinfo->pchNext - lpmmioinfo->pchBuffer); + mmioinfo.pchEndRead = mmioinfo.pchBuffer + (lpmmioinfo->pchEndRead - lpmmioinfo->pchBuffer); + mmioinfo.pchEndWrite = mmioinfo.pchBuffer + (lpmmioinfo->pchEndWrite - lpmmioinfo->pchBuffer); + + return mmioSetInfo(HMMIO_32(hmmio), &mmioinfo, uFlags); +} + +/************************************************************************** + * mmioSetBuffer [MMSYSTEM.1217] + */ +MMRESULT16 WINAPI mmioSetBuffer16(HMMIO16 hmmio, LPSTR pchBuffer, + LONG cchBuffer, UINT16 uFlags) +{ + MMRESULT ret = mmioSetBuffer(HMMIO_32(hmmio), MapSL((DWORD)pchBuffer), + cchBuffer, uFlags); + + if (ret == MMSYSERR_NOERROR) + MMIO_SetSegmentedBuffer(HMMIO_32(hmmio), (DWORD)pchBuffer, TRUE); + else + UnMapLS((DWORD)pchBuffer); + return ret; +} + +/************************************************************************** + * mmioFlush [MMSYSTEM.1218] + */ +MMRESULT16 WINAPI mmioFlush16(HMMIO16 hmmio, UINT16 uFlags) +{ + return mmioFlush(HMMIO_32(hmmio), uFlags); +} + +/*********************************************************************** + * mmioAdvance [MMSYSTEM.1219] + */ +MMRESULT16 WINAPI mmioAdvance16(HMMIO16 hmmio, MMIOINFO16* lpmmioinfo, UINT16 uFlags) +{ + MMIOINFO mmioinfo; + LRESULT ret; + + /* WARNING: this heavily relies on mmioAdvance implementation (for choosing which + * fields to init + */ + if (lpmmioinfo) + { + mmioinfo.pchBuffer = MapSL((DWORD)lpmmioinfo->pchBuffer); + mmioinfo.pchNext = MapSL((DWORD)lpmmioinfo->pchNext); + mmioinfo.dwFlags = lpmmioinfo->dwFlags; + mmioinfo.lBufOffset = lpmmioinfo->lBufOffset; + ret = mmioAdvance(HMMIO_32(hmmio), &mmioinfo, uFlags); + } + else + ret = mmioAdvance(HMMIO_32(hmmio), NULL, uFlags); + + if (ret != MMSYSERR_NOERROR) return ret; + + if (lpmmioinfo) + { + lpmmioinfo->dwFlags = mmioinfo.dwFlags; + lpmmioinfo->pchNext = (void*)(lpmmioinfo->pchBuffer + (mmioinfo.pchNext - mmioinfo.pchBuffer)); + lpmmioinfo->pchEndRead = (void*)(lpmmioinfo->pchBuffer + (mmioinfo.pchEndRead - mmioinfo.pchBuffer)); + lpmmioinfo->pchEndWrite = (void*)(lpmmioinfo->pchBuffer + (mmioinfo.pchEndWrite - mmioinfo.pchBuffer)); + lpmmioinfo->lBufOffset = mmioinfo.lBufOffset; + lpmmioinfo->lDiskOffset = mmioinfo.lDiskOffset; + } + + return MMSYSERR_NOERROR; +} + +/************************************************************************** + * mmioStringToFOURCC [MMSYSTEM.1220] + */ +FOURCC WINAPI mmioStringToFOURCC16(LPCSTR sz, UINT16 uFlags) +{ + return mmioStringToFOURCCA(sz, uFlags); +} + +/************************************************************************** + * mmioInstallIOProc [MMSYSTEM.1221] + */ +LPMMIOPROC16 WINAPI mmioInstallIOProc16(FOURCC fccIOProc, LPMMIOPROC16 pIOProc, + DWORD dwFlags) +{ + return (LPMMIOPROC16)MMIO_InstallIOProc(fccIOProc, (LPMMIOPROC)pIOProc, + dwFlags, MMIO_PROC_16); +} + +/************************************************************************** + * mmioSendMessage [MMSYSTEM.1222] + */ +LRESULT WINAPI mmioSendMessage16(HMMIO16 hmmio, UINT16 uMessage, + LPARAM lParam1, LPARAM lParam2) +{ + return MMIO_SendMessage(HMMIO_32(hmmio), uMessage, + lParam1, lParam2, MMIO_PROC_16); +} + +/************************************************************************** + * mmioDescend [MMSYSTEM.1223] + */ +MMRESULT16 WINAPI mmioDescend16(HMMIO16 hmmio, LPMMCKINFO lpck, + const MMCKINFO* lpckParent, UINT16 uFlags) +{ + return mmioDescend(HMMIO_32(hmmio), lpck, lpckParent, uFlags); +} + +/************************************************************************** + * mmioAscend [MMSYSTEM.1224] + */ +MMRESULT16 WINAPI mmioAscend16(HMMIO16 hmmio, MMCKINFO* lpck, UINT16 uFlags) +{ + return mmioAscend(HMMIO_32(hmmio),lpck,uFlags); +} + +/************************************************************************** + * mmioCreateChunk [MMSYSTEM.1225] + */ +MMRESULT16 WINAPI mmioCreateChunk16(HMMIO16 hmmio, MMCKINFO* lpck, UINT16 uFlags) +{ + return mmioCreateChunk(HMMIO_32(hmmio), lpck, uFlags); +} + +/************************************************************************** + * mmioRename [MMSYSTEM.1226] + */ +MMRESULT16 WINAPI mmioRename16(LPCSTR szFileName, LPCSTR szNewFileName, + MMIOINFO16* lpmmioinfo, DWORD dwRenameFlags) +{ + BOOL inst = FALSE; + MMRESULT ret; + MMIOINFO mmioinfo; + + if (lpmmioinfo != NULL && lpmmioinfo->pIOProc != NULL && + lpmmioinfo->fccIOProc == 0) { + FIXME("Can't handle this case yet\n"); + return MMSYSERR_ERROR; + } + + /* this is a bit hacky, but it'll work if we get a fourCC code or nothing. + * but a non installed ioproc without a fourcc won't do + */ + if (lpmmioinfo && lpmmioinfo->fccIOProc && lpmmioinfo->pIOProc) { + MMIO_InstallIOProc(lpmmioinfo->fccIOProc, (LPMMIOPROC)lpmmioinfo->pIOProc, + MMIO_INSTALLPROC, MMIO_PROC_16); + inst = TRUE; + } + memset(&mmioinfo, 0, sizeof(mmioinfo)); + mmioinfo.fccIOProc = lpmmioinfo->fccIOProc; + ret = mmioRenameA(szFileName, szNewFileName, &mmioinfo, dwRenameFlags); + if (inst) { + MMIO_InstallIOProc(lpmmioinfo->fccIOProc, NULL, + MMIO_REMOVEPROC, MMIO_PROC_16); + } + return ret; +} + +/* ################################################### + * # JOYSTICK # + * ################################################### + */ + +/************************************************************************** + * joyGetNumDevs [MMSYSTEM.101] + */ +UINT16 WINAPI joyGetNumDevs16(void) +{ + return joyGetNumDevs(); +} + +/************************************************************************** + * joyGetDevCaps [MMSYSTEM.102] + */ +MMRESULT16 WINAPI joyGetDevCaps16(UINT16 wID, LPJOYCAPS16 lpCaps, UINT16 wSize) +{ + JOYCAPSA jca; + MMRESULT ret = joyGetDevCapsA(wID, &jca, sizeof(jca)); + + if (ret != JOYERR_NOERROR) return ret; + lpCaps->wMid = jca.wMid; + lpCaps->wPid = jca.wPid; + strcpy(lpCaps->szPname, jca.szPname); + lpCaps->wXmin = jca.wXmin; + lpCaps->wXmax = jca.wXmax; + lpCaps->wYmin = jca.wYmin; + lpCaps->wYmax = jca.wYmax; + lpCaps->wZmin = jca.wZmin; + lpCaps->wZmax = jca.wZmax; + lpCaps->wNumButtons = jca.wNumButtons; + lpCaps->wPeriodMin = jca.wPeriodMin; + lpCaps->wPeriodMax = jca.wPeriodMax; + + if (wSize >= sizeof(JOYCAPS16)) { /* Win95 extensions ? */ + lpCaps->wRmin = jca.wRmin; + lpCaps->wRmax = jca.wRmax; + lpCaps->wUmin = jca.wUmin; + lpCaps->wUmax = jca.wUmax; + lpCaps->wVmin = jca.wVmin; + lpCaps->wVmax = jca.wVmax; + lpCaps->wCaps = jca.wCaps; + lpCaps->wMaxAxes = jca.wMaxAxes; + lpCaps->wNumAxes = jca.wNumAxes; + lpCaps->wMaxButtons = jca.wMaxButtons; + strcpy(lpCaps->szRegKey, jca.szRegKey); + strcpy(lpCaps->szOEMVxD, jca.szOEMVxD); + } + + return ret; +} + +/************************************************************************** + * joyGetPosEx [MMSYSTEM.110] + */ +MMRESULT16 WINAPI joyGetPosEx16(UINT16 wID, LPJOYINFOEX lpInfo) +{ + return joyGetPosEx(wID, lpInfo); +} + +/************************************************************************** + * joyGetPos [MMSYSTEM.103] + */ +MMRESULT16 WINAPI joyGetPos16(UINT16 wID, LPJOYINFO16 lpInfo) +{ + JOYINFO ji; + MMRESULT ret; + + TRACE("(%d, %p);\n", wID, lpInfo); + + if ((ret = joyGetPos(wID, &ji)) == JOYERR_NOERROR) { + lpInfo->wXpos = ji.wXpos; + lpInfo->wYpos = ji.wYpos; + lpInfo->wZpos = ji.wZpos; + lpInfo->wButtons = ji.wButtons; + } + return ret; +} + +/************************************************************************** + * joyGetThreshold [MMSYSTEM.104] + */ +MMRESULT16 WINAPI joyGetThreshold16(UINT16 wID, LPUINT16 lpThreshold) +{ + UINT t; + MMRESULT ret; + + ret = joyGetThreshold(wID, &t); + if (ret == JOYERR_NOERROR) + *lpThreshold = t; + return ret; +} + +/************************************************************************** + * joyReleaseCapture [MMSYSTEM.105] + */ +MMRESULT16 WINAPI joyReleaseCapture16(UINT16 wID) +{ + return joyReleaseCapture(wID); +} + +/************************************************************************** + * joySetCapture [MMSYSTEM.106] + */ +MMRESULT16 WINAPI joySetCapture16(HWND16 hWnd, UINT16 wID, UINT16 wPeriod, BOOL16 bChanged) +{ + return joySetCapture16(hWnd, wID, wPeriod, bChanged); +} + +/************************************************************************** + * joySetThreshold [MMSYSTEM.107] + */ +MMRESULT16 WINAPI joySetThreshold16(UINT16 wID, UINT16 wThreshold) +{ + return joySetThreshold16(wID,wThreshold); +} + +/************************************************************************** + * joySetCalibration [MMSYSTEM.109] + */ +MMRESULT16 WINAPI joySetCalibration16(UINT16 wID) +{ + FIXME("(%04X): stub.\n", wID); + return JOYERR_NOCANDO; +} diff --git a/reactos/lib/winmm/mmsystem.spec b/reactos/lib/winmm/mmsystem.spec new file mode 100644 index 00000000000..e260dd03a8f --- /dev/null +++ b/reactos/lib/winmm/mmsystem.spec @@ -0,0 +1,176 @@ +#1 pascal MMSYSTEM_WEP(word word word ptr) MMSYSTEM_WEP +2 pascal sndPlaySound(ptr word) sndPlaySound16 +3 pascal PlaySound(ptr word long) PlaySound16 +5 pascal mmsystemGetVersion() mmsystemGetVersion16 +6 pascal DriverProc(long word word long long) DriverProc16 +8 pascal WMMMidiRunOnce() WMMMidiRunOnce16 +30 pascal -ret16 OutputDebugStr(str) OutputDebugStr16 +31 pascal DriverCallback(long word word word long long long) DriverCallback16 +32 pascal StackEnter() StackEnter16 +33 pascal StackLeave() StackLeave16 +34 stub MMDRVINSTALL +101 pascal joyGetNumDevs() joyGetNumDevs16 +102 pascal joyGetDevCaps(word ptr word) joyGetDevCaps16 +103 pascal joyGetPos(word ptr) joyGetPos16 +104 pascal joyGetThreshold(word ptr) joyGetThreshold16 +105 pascal joyReleaseCapture(word) joyReleaseCapture16 +106 pascal joySetCapture(word word word word) joySetCapture16 +107 pascal joySetThreshold(word word) joySetThreshold16 +109 pascal joySetCalibration(word) joySetCalibration16 +110 pascal joyGetPosEx(word ptr) joyGetPosEx16 +111 stub JOYCONFIGCHANGED +201 pascal midiOutGetNumDevs() midiOutGetNumDevs16 +202 pascal midiOutGetDevCaps(word ptr word) midiOutGetDevCaps16 +203 pascal midiOutGetErrorText(word ptr word) midiOutGetErrorText16 +204 pascal midiOutOpen(ptr word long long long) midiOutOpen16 +205 pascal midiOutClose(word) midiOutClose16 +206 pascal midiOutPrepareHeader(word segptr word) midiOutPrepareHeader16 +207 pascal midiOutUnprepareHeader(word segptr word) midiOutUnprepareHeader16 +208 pascal midiOutShortMsg(word long) midiOutShortMsg16 +209 pascal midiOutLongMsg(word segptr word) midiOutLongMsg16 +210 pascal midiOutReset(word) midiOutReset16 +211 pascal midiOutGetVolume(word ptr) midiOutGetVolume16 +212 pascal midiOutSetVolume(word long) midiOutSetVolume16 +213 pascal midiOutCachePatches(word word ptr word) midiOutCachePatches16 +214 pascal midiOutCacheDrumPatches(word word ptr word) midiOutCacheDrumPatches16 +215 pascal midiOutGetID(word ptr) midiOutGetID16 +216 pascal midiOutMessage(word word long long) midiOutMessage16 +250 pascal midiStreamProperty(word ptr long) midiStreamProperty16 +251 pascal midiStreamOpen(ptr ptr long long long long) midiStreamOpen16 +252 pascal midiStreamClose(word) midiStreamClose16 +253 pascal midiStreamPosition(word ptr word) midiStreamPosition16 +254 pascal midiStreamOut(word ptr word) midiStreamOut16 +255 pascal midiStreamPause(word) midiStreamPause16 +256 pascal midiStreamRestart(word) midiStreamRestart16 +257 pascal midiStreamStop(word) midiStreamStop16 +301 pascal midiInGetNumDevs() midiInGetNumDevs16 +302 pascal midiInGetDevCaps(word ptr word) midiInGetDevCaps16 +303 pascal midiInGetErrorText(word ptr word) midiInGetErrorText16 +304 pascal midiInOpen(ptr word long long long) midiInOpen16 +305 pascal midiInClose(word) midiInClose16 +306 pascal midiInPrepareHeader(word segptr word) midiInPrepareHeader16 +307 pascal midiInUnprepareHeader(word segptr word) midiInUnprepareHeader16 +308 pascal midiInAddBuffer(word segptr word) midiInAddBuffer16 +309 pascal midiInStart(word) midiInStart16 +310 pascal midiInStop(word) midiInStop16 +311 pascal midiInReset(word) midiInReset16 +312 pascal midiInGetID(word ptr) midiInGetID16 +313 pascal midiInMessage(word word long long) midiInMessage16 +350 pascal auxGetNumDevs() auxGetNumDevs16 +351 pascal auxGetDevCaps(word ptr word) auxGetDevCaps16 +352 pascal auxGetVolume(word ptr) auxGetVolume16 +353 pascal auxSetVolume(word long) auxSetVolume16 +354 pascal auxOutMessage(word word long long) auxOutMessage16 +401 pascal waveOutGetNumDevs() waveOutGetNumDevs16 +402 pascal waveOutGetDevCaps(word ptr word) waveOutGetDevCaps16 +403 pascal waveOutGetErrorText(word ptr word) waveOutGetErrorText16 +404 pascal waveOutOpen(ptr word ptr long long long) waveOutOpen16 +405 pascal waveOutClose(word) waveOutClose16 +406 pascal waveOutPrepareHeader(word segptr word) waveOutPrepareHeader16 +407 pascal waveOutUnprepareHeader(word segptr word) waveOutUnprepareHeader16 +408 pascal waveOutWrite(word segptr word) waveOutWrite16 +409 pascal waveOutPause(word) waveOutPause16 +410 pascal waveOutRestart(word) waveOutRestart16 +411 pascal waveOutReset(word) waveOutReset16 +412 pascal waveOutGetPosition(word ptr word) waveOutGetPosition16 +413 pascal waveOutGetPitch(word ptr) waveOutGetPitch16 +414 pascal waveOutSetPitch(word long) waveOutSetPitch16 +415 pascal waveOutGetVolume(word ptr) waveOutGetVolume16 +416 pascal waveOutSetVolume(word long) waveOutSetVolume16 +417 pascal waveOutGetPlaybackRate(word ptr) waveOutGetPlaybackRate16 +418 pascal waveOutSetPlaybackRate(word long) waveOutSetPlaybackRate16 +419 pascal waveOutBreakLoop(word) waveOutBreakLoop16 +420 pascal waveOutGetID(word ptr) waveOutGetID16 +421 pascal waveOutMessage(word word long long) waveOutMessage16 +501 pascal waveInGetNumDevs() waveInGetNumDevs16 +502 pascal waveInGetDevCaps(word ptr word) waveInGetDevCaps16 +503 pascal waveInGetErrorText(word ptr word) waveInGetErrorText16 +504 pascal waveInOpen(ptr word ptr long long long) waveInOpen16 +505 pascal waveInClose(word) waveInClose16 +506 pascal waveInPrepareHeader(word segptr word) waveInPrepareHeader16 +507 pascal waveInUnprepareHeader(word segptr word) waveInUnprepareHeader16 +508 pascal waveInAddBuffer(word segptr word) waveInAddBuffer16 +509 pascal waveInStart(word) waveInStart16 +510 pascal waveInStop(word) waveInStop16 +511 pascal waveInReset(word) waveInReset16 +512 pascal waveInGetPosition(word ptr word) waveInGetPosition16 +513 pascal waveInGetID(word ptr) waveInGetID16 +514 pascal waveInMessage(word word long long) waveInMessage16 +601 pascal timeGetSystemTime(ptr word) timeGetSystemTime16 +602 pascal timeSetEvent(word word segptr long word) timeSetEvent16 +603 pascal timeKillEvent(word) timeKillEvent16 +604 pascal timeGetDevCaps(ptr word) timeGetDevCaps16 +605 pascal timeBeginPeriod(word) timeBeginPeriod16 +606 pascal timeEndPeriod(word) timeEndPeriod16 +607 pascal timeGetTime() timeGetTime +701 pascal mciSendCommand(word word long long) mciSendCommand16 +702 pascal mciSendString(str ptr word word) mciSendString16 +703 pascal mciGetDeviceID(ptr) mciGetDeviceID16 +705 pascal mciLoadCommandResource(word str word) mciLoadCommandResource16 +706 pascal mciGetErrorString(long ptr word) mciGetErrorString16 +707 pascal mciSetDriverData(word long) mciSetDriverData16 +708 pascal mciGetDriverData(word) mciGetDriverData16 +710 pascal mciDriverYield(word) mciDriverYield16 +711 pascal mciDriverNotify(word word word) mciDriverNotify16 +712 pascal mciExecute(ptr) mciExecute +713 pascal mciFreeCommandResource(word) mciFreeCommandResource16 +714 pascal mciSetYieldProc(word ptr long) mciSetYieldProc16 +715 pascal mciGetDeviceIDFromElementID(long ptr) mciGetDeviceIDFromElementID16 +716 pascal mciGetYieldProc(word ptr) mciGetYieldProc16 +717 pascal mciGetCreatorTask(word) mciGetCreatorTask16 +800 pascal mixerGetNumDevs() mixerGetNumDevs16 +801 pascal mixerGetDevCaps(word ptr word) mixerGetDevCaps16 +802 pascal mixerOpen(ptr word long long long) mixerOpen16 +803 pascal mixerClose(word) mixerClose16 +804 pascal mixerMessage(word word long long) mixerMessage16 +805 pascal mixerGetLineInfo(word ptr long) mixerGetLineInfo16 +806 pascal mixerGetID(word ptr long) mixerGetID16 +807 pascal mixerGetLineControls(word ptr long) mixerGetLineControls16 +808 pascal mixerGetControlDetails(word ptr long) mixerGetControlDetails16 +809 pascal mixerSetControlDetails(word ptr long) mixerSetControlDetails16 +900 pascal mmTaskCreate(long ptr long) mmTaskCreate16 +902 pascal mmTaskBlock(word) mmTaskBlock16 +903 pascal mmTaskSignal(word) mmTaskSignal16 +904 pascal -ret16 mmGetCurrentTask() mmGetCurrentTask16 +905 pascal mmTaskYield() mmTaskYield16 +1100 pascal DrvOpen(str str long) DrvOpen16 +1101 pascal DrvClose(word long long) DrvClose16 +1102 pascal DrvSendMessage(word word long long) DrvSendMessage16 +1103 pascal DrvGetModuleHandle(word) DrvGetModuleHandle16 +1104 pascal DrvDefDriverProc(long word word long long) DrvDefDriverProc16 +1120 pascal mmThreadCreate(segptr ptr long long) mmThreadCreate16 +1121 pascal mmThreadSignal(word) mmThreadSignal16 +1122 pascal mmThreadBlock(word) mmThreadBlock16 +1123 pascal mmThreadIsCurrent(word) mmThreadIsCurrent16 +1124 pascal mmThreadIsValid(word) mmThreadIsValid16 +1125 pascal mmThreadGetTask(word) mmThreadGetTask16 +1150 pascal mmShowMMCPLPropertySheet(word str str str) mmShowMMCPLPropertySheet16 + +1210 pascal mmioOpen(str ptr long) mmioOpen16 +1211 pascal mmioClose(word word) mmioClose16 +1212 pascal mmioRead(word ptr long) mmioRead16 +1213 pascal mmioWrite(word ptr long) mmioWrite16 +1214 pascal mmioSeek(word long word) mmioSeek16 +1215 pascal mmioGetInfo(word ptr word) mmioGetInfo16 +1216 pascal mmioSetInfo(word ptr word) mmioSetInfo16 +1217 pascal mmioSetBuffer(word segptr long word) mmioSetBuffer16 +1218 pascal mmioFlush(word word) mmioFlush16 +1219 pascal mmioAdvance(word ptr word) mmioAdvance16 +1220 pascal mmioStringToFOURCC(str word) mmioStringToFOURCC16 +1221 pascal mmioInstallIOProc(long ptr long) mmioInstallIOProc16 +1222 pascal mmioSendMessage(word word long long) mmioSendMessage16 +1223 pascal mmioDescend(word ptr ptr word) mmioDescend16 +1224 pascal mmioAscend(word ptr word) mmioAscend16 +1225 pascal mmioCreateChunk(word ptr word) mmioCreateChunk16 +1226 pascal mmioRename(ptr ptr ptr long) mmioRename16 + +#2000 stub WINMMF_THUNKDATA16 +#2001 stub RING3_DEVLOADER +#2002 stub WINMMTILEBUFFER +#2003 stub WINMMUNTILEBUFFER +#2005 stub MCIGETTHUNKTABLE +#2006 stub WINMMSL_THUNKDATA16 + +2046 pascal DllEntryPoint(long word word word long word) MMSYSTEM_LibMain +# these are Wine only exported functions. Is there another way to do it ? +2047 pascal __wine_mmThreadEntryPoint(long) WINE_mmThreadEntryPoint diff --git a/reactos/lib/winmm/playsound.c b/reactos/lib/winmm/playsound.c index 6854c65b78d..e2e928b8dc8 100644 --- a/reactos/lib/winmm/playsound.c +++ b/reactos/lib/winmm/playsound.c @@ -190,6 +190,7 @@ static void PlaySound_Free(WINE_PLAYSOUND* wps) if (WINMM_IData->lpPlaySound == NULL) SetEvent(WINMM_IData->psLastEvent); LeaveCriticalSection(&WINMM_IData->cs); if (wps->bAlloc) HeapFree(GetProcessHeap(), 0, (void*)wps->pszSound); + if (wps->hThread) CloseHandle(wps->hThread); HeapFree(GetProcessHeap(), 0, wps); } @@ -456,9 +457,12 @@ BOOL MULTIMEDIA_PlaySound(const void* pszSound, HMODULE hmod, DWORD fdwSound, BO if (fdwSound & SND_ASYNC) { DWORD id; + HANDLE handle; wps->bLoop = (fdwSound & SND_LOOP) ? TRUE : FALSE; - if (CreateThread(NULL, 0, proc_PlaySound, wps, 0, &id) != 0) + if ((handle = CreateThread(NULL, 0, proc_PlaySound, wps, 0, &id)) != 0) { + wps->hThread = handle; return TRUE; + } } else return proc_PlaySound(wps); diff --git a/reactos/lib/winmm/sound.spec b/reactos/lib/winmm/sound.spec new file mode 100644 index 00000000000..586af4064f3 --- /dev/null +++ b/reactos/lib/winmm/sound.spec @@ -0,0 +1,18 @@ +1 pascal -ret16 OpenSound() OpenSound16 +2 pascal -ret16 CloseSound() CloseSound16 +3 pascal -ret16 SetVoiceQueueSize(word word) SetVoiceQueueSize16 +4 pascal -ret16 SetVoiceNote(word word word word) SetVoiceNote16 +5 pascal -ret16 SetVoiceAccent(word word word word word) SetVoiceAccent16 +6 pascal -ret16 SetVoiceEnvelope(word word word) SetVoiceEnvelope16 +7 pascal -ret16 SetSoundNoise(word word) SetSoundNoise16 +8 pascal -ret16 SetVoiceSound(word long word) SetVoiceSound16 +9 pascal -ret16 StartSound() StartSound16 +10 pascal -ret16 StopSound() StopSound16 +11 pascal -ret16 WaitSoundState(word) WaitSoundState16 +12 pascal -ret16 SyncAllVoices() SyncAllVoices16 +13 pascal -ret16 CountVoiceNotes(word) CountVoiceNotes16 +14 pascal GetThresholdEvent() GetThresholdEvent16 +15 pascal -ret16 GetThresholdStatus() GetThresholdStatus16 +16 pascal -ret16 SetVoiceThreshold(word word) SetVoiceThreshold16 +17 pascal -ret16 DoBeep() DoBeep16 +18 stub MYOPENSOUND # W1.1, W2.0 diff --git a/reactos/lib/winmm/sound16.c b/reactos/lib/winmm/sound16.c new file mode 100644 index 00000000000..46306d8b1f0 --- /dev/null +++ b/reactos/lib/winmm/sound16.c @@ -0,0 +1,184 @@ +/* + * 16-bit sound support + * + * Copyright Robert J. Amstadt, 1993 + * + * 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 <stdarg.h> +#include <stdlib.h> +#include "windef.h" +#include "winbase.h" +#include "wine/windef16.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(sound); + +/*********************************************************************** + * OpenSound (SOUND.1) + */ +INT16 WINAPI OpenSound16(void) +{ + FIXME("(void): stub\n"); + return -1; +} + +/*********************************************************************** + * CloseSound (SOUND.2) + */ +void WINAPI CloseSound16(void) +{ + FIXME("(void): stub\n"); +} + +/*********************************************************************** + * SetVoiceQueueSize (SOUND.3) + */ +INT16 WINAPI SetVoiceQueueSize16(INT16 nVoice, INT16 nBytes) +{ + FIXME("(%d,%d): stub\n",nVoice,nBytes); + return 0; +} + +/*********************************************************************** + * SetVoiceNote (SOUND.4) + */ +INT16 WINAPI SetVoiceNote16(INT16 nVoice, INT16 nValue, INT16 nLength, + INT16 nCdots) +{ + FIXME("(%d,%d,%d,%d): stub\n",nVoice,nValue,nLength,nCdots); + return 0; +} + +/*********************************************************************** + * SetVoiceAccent (SOUND.5) + */ +INT16 WINAPI SetVoiceAccent16(INT16 nVoice, INT16 nTempo, INT16 nVolume, + INT16 nMode, INT16 nPitch) +{ + FIXME("(%d,%d,%d,%d,%d): stub\n", nVoice, nTempo, + nVolume, nMode, nPitch); + return 0; +} + +/*********************************************************************** + * SetVoiceEnvelope (SOUND.6) + */ +INT16 WINAPI SetVoiceEnvelope16(INT16 nVoice, INT16 nShape, INT16 nRepeat) +{ + FIXME("(%d,%d,%d): stub\n",nVoice,nShape,nRepeat); + return 0; +} + +/*********************************************************************** + * SetSoundNoise (SOUND.7) + */ +INT16 WINAPI SetSoundNoise16(INT16 nSource, INT16 nDuration) +{ + FIXME("(%d,%d): stub\n",nSource,nDuration); + return 0; +} + +/*********************************************************************** + * SetVoiceSound (SOUND.8) + */ +INT16 WINAPI SetVoiceSound16(INT16 nVoice, DWORD lFrequency, INT16 nDuration) +{ + FIXME("(%d, %ld, %d): stub\n",nVoice,lFrequency, nDuration); + return 0; +} + +/*********************************************************************** + * StartSound (SOUND.9) + */ +INT16 WINAPI StartSound16(void) +{ + return 0; +} + +/*********************************************************************** + * StopSound (SOUND.10) + */ +INT16 WINAPI StopSound16(void) +{ + return 0; +} + +/*********************************************************************** + * WaitSoundState (SOUND.11) + */ +INT16 WINAPI WaitSoundState16(INT16 x) +{ + FIXME("(%d): stub\n", x); + return 0; +} + +/*********************************************************************** + * SyncAllVoices (SOUND.12) + */ +INT16 WINAPI SyncAllVoices16(void) +{ + FIXME("(void): stub\n"); + return 0; +} + +/*********************************************************************** + * CountVoiceNotes (SOUND.13) + */ +INT16 WINAPI CountVoiceNotes16(INT16 x) +{ + FIXME("(%d): stub\n", x); + return 0; +} + +/*********************************************************************** + * GetThresholdEvent (SOUND.14) + */ +LPINT16 WINAPI GetThresholdEvent16(void) +{ + FIXME("(void): stub\n"); + return NULL; +} + +/*********************************************************************** + * GetThresholdStatus (SOUND.15) + */ +INT16 WINAPI GetThresholdStatus16(void) +{ + FIXME("(void): stub\n"); + return 0; +} + +/*********************************************************************** + * SetVoiceThreshold (SOUND.16) + */ +INT16 WINAPI SetVoiceThreshold16(INT16 a, INT16 b) +{ + FIXME("(%d,%d): stub\n", a, b); + return 0; +} + +/*********************************************************************** + * DoBeep (SOUND.17) + */ +void WINAPI DoBeep16(void) +{ + FIXME("(void): stub!\n"); +} + + + + diff --git a/reactos/lib/winmm/time.c b/reactos/lib/winmm/time.c index de6091871f4..ae2446172ed 100644 --- a/reactos/lib/winmm/time.c +++ b/reactos/lib/winmm/time.c @@ -42,6 +42,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(mmtime); +static HANDLE TIME_hMMTimer; +static LPWINE_TIMERENTRY TIME_TimersList; +static HANDLE TIME_hKillEvent; +DWORD WINMM_SysTimeMS; + /* * FIXME * We're using "1" as the mininum resolution to the timer, @@ -90,15 +95,18 @@ static void TIME_TriggerCallBack(LPWINE_TIMERENTRY lpTimer) */ static void CALLBACK TIME_MMSysTimeCallback(LPWINE_MM_IDATA iData) { - LPWINE_TIMERENTRY lpTimer, lpNextTimer; - DWORD delta = GetTickCount() - iData->mmSysTimeMS; +static int nSizeLpTimers; +static LPWINE_TIMERENTRY lpTimers; + + LPWINE_TIMERENTRY timer, *ptimer, *next_ptimer; + DWORD delta = GetTickCount() - WINMM_SysTimeMS; int idx; TRACE("Time delta: %ld\n", delta); while (delta >= MMSYSTIME_MININTERVAL) { delta -= MMSYSTIME_MININTERVAL; - iData->mmSysTimeMS += MMSYSTIME_MININTERVAL; + WINMM_SysTimeMS += MMSYSTIME_MININTERVAL; /* since timeSetEvent() and timeKillEvent() can be called * from 16 bit code, there are cases where win16 lock is @@ -109,48 +117,52 @@ static void CALLBACK TIME_MMSysTimeCallback(LPWINE_MM_IDATA iData) * situation). * To cope with that, we just copy the WINE_TIMERENTRY struct * that need to trigger the callback, and call it without the - * mm timer crit sect locked. The bad side of this - * implementation is that, in some cases, the callback may be - * invoked *after* a timer has been destroyed... - * EPP 99/07/13 + * mm timer crit sect locked. + * the hKillTimeEvent is used to mark the section where we + * handle the callbacks so we can do synchronous kills. + * EPP 99/07/13, updated 04/01/10 */ idx = 0; EnterCriticalSection(&iData->cs); - for (lpTimer = iData->lpTimerList; lpTimer != NULL; ) { - lpNextTimer = lpTimer->lpNext; - if (lpTimer->uCurTime < MMSYSTIME_MININTERVAL) { + for (ptimer = &TIME_TimersList; *ptimer != NULL; ) { + timer = *ptimer; + next_ptimer = &timer->lpNext; + if (timer->uCurTime < MMSYSTIME_MININTERVAL) { /* since lpTimer->wDelay is >= MININTERVAL, wCurTime value * shall be correct (>= 0) */ - lpTimer->uCurTime += lpTimer->wDelay - MMSYSTIME_MININTERVAL; - if (lpTimer->lpFunc) { - if (idx == iData->nSizeLpTimers) { - if (iData->lpTimers) - iData->lpTimers = (LPWINE_TIMERENTRY) - HeapReAlloc(GetProcessHeap(), 0, - iData->lpTimers, - ++iData->nSizeLpTimers * sizeof(WINE_TIMERENTRY)); + timer->uCurTime += timer->wDelay - MMSYSTIME_MININTERVAL; + if (timer->lpFunc) { + if (idx == nSizeLpTimers) { + if (lpTimers) + lpTimers = (LPWINE_TIMERENTRY) + HeapReAlloc(GetProcessHeap(), 0, lpTimers, + ++nSizeLpTimers * sizeof(WINE_TIMERENTRY)); else - iData->lpTimers = (LPWINE_TIMERENTRY) + lpTimers = (LPWINE_TIMERENTRY) HeapAlloc(GetProcessHeap(), 0, - ++iData->nSizeLpTimers * sizeof(WINE_TIMERENTRY)); + ++nSizeLpTimers * sizeof(WINE_TIMERENTRY)); } - iData->lpTimers[idx++] = *lpTimer; + lpTimers[idx++] = *timer; } /* TIME_ONESHOT is defined as 0 */ - if (!(lpTimer->wFlags & TIME_PERIODIC)) - timeKillEvent(lpTimer->wTimerID); + if (!(timer->wFlags & TIME_PERIODIC)) + { + /* unlink timer from timers list */ + *ptimer = *next_ptimer; + HeapFree(GetProcessHeap(), 0, timer); + } } else { - lpTimer->uCurTime -= MMSYSTIME_MININTERVAL; + timer->uCurTime -= MMSYSTIME_MININTERVAL; } - lpTimer = lpNextTimer; + ptimer = next_ptimer; } + if (TIME_hKillEvent) ResetEvent(TIME_hKillEvent); LeaveCriticalSection(&iData->cs); - while (idx > 0) { - TIME_TriggerCallBack(&iData->lpTimers[--idx]); - } + while (idx > 0) TIME_TriggerCallBack(&lpTimers[--idx]); + if (TIME_hKillEvent) SetEvent(TIME_hKillEvent); } } @@ -160,12 +172,13 @@ static void CALLBACK TIME_MMSysTimeCallback(LPWINE_MM_IDATA iData) static DWORD CALLBACK TIME_MMSysTimeThread(LPVOID arg) { LPWINE_MM_IDATA iData = (LPWINE_MM_IDATA)arg; - volatile HANDLE *pActive = (volatile HANDLE *)&iData->hMMTimer; + volatile HANDLE *pActive = (volatile HANDLE *)&TIME_hMMTimer; DWORD last_time, cur_time; #ifndef __REACTOS__ usleep(MMSYSTIME_STDINTERVAL * 1000); #endif /* __REACTOS__ */ + last_time = GetTickCount(); while (*pActive) { TIME_MMSysTimeCallback(iData); @@ -188,10 +201,10 @@ void TIME_MMTimeStart(void) * mm timers are active, but this would require to keep mmSysTimeMS up-to-date * without being incremented within the service thread callback. */ - if (!WINMM_IData->hMMTimer) { - WINMM_IData->mmSysTimeMS = GetTickCount(); - WINMM_IData->lpTimerList = NULL; - WINMM_IData->hMMTimer = CreateThread(NULL, 0, TIME_MMSysTimeThread, WINMM_IData, 0, NULL); + if (!TIME_hMMTimer) { + WINMM_SysTimeMS = GetTickCount(); + TIME_TimersList = NULL; + TIME_hMMTimer = CreateThread(NULL, 0, TIME_MMSysTimeThread, WINMM_IData, 0, NULL); } } @@ -200,9 +213,10 @@ void TIME_MMTimeStart(void) */ void TIME_MMTimeStop(void) { - if (WINMM_IData->hMMTimer) { - HANDLE hMMTimer = WINMM_IData->hMMTimer; - WINMM_IData->hMMTimer = 0; + /* FIXME: in the worst case, we're going to wait 65 seconds here :-( */ + if (TIME_hMMTimer) { + HANDLE hMMTimer = TIME_hMMTimer; + TIME_hMMTimer = 0; WaitForSingleObject(hMMTimer, INFINITE); CloseHandle(hMMTimer); } @@ -218,7 +232,7 @@ MMRESULT WINAPI timeGetSystemTime(LPMMTIME lpTime, UINT wSize) if (wSize >= sizeof(*lpTime)) { TIME_MMTimeStart(); lpTime->wType = TIME_MS; - lpTime->u.ms = WINMM_IData->mmSysTimeMS; + lpTime->u.ms = WINMM_SysTimeMS; TRACE("=> %lu\n", lpTime->u.ms); } @@ -256,12 +270,15 @@ WORD TIME_SetEventInternal(UINT wDelay, UINT wResol, EnterCriticalSection(&WINMM_IData->cs); - for (lpTimer = WINMM_IData->lpTimerList; lpTimer != NULL; lpTimer = lpTimer->lpNext) { + if ((wFlags & TIME_KILL_SYNCHRONOUS) && !TIME_hKillEvent) + TIME_hKillEvent = CreateEventW(NULL, TRUE, TRUE, NULL); + + for (lpTimer = TIME_TimersList; lpTimer != NULL; lpTimer = lpTimer->lpNext) { wNewID = max(wNewID, lpTimer->wTimerID); } - lpNewTimer->lpNext = WINMM_IData->lpTimerList; - WINMM_IData->lpTimerList = lpNewTimer; + lpNewTimer->lpNext = TIME_TimersList; + TIME_TimersList = lpNewTimer; lpNewTimer->wTimerID = wNewID + 1; LeaveCriticalSection(&WINMM_IData->cs); @@ -275,7 +292,7 @@ WORD TIME_SetEventInternal(UINT wDelay, UINT wResol, * timeSetEvent [WINMM.@] */ MMRESULT WINAPI timeSetEvent(UINT wDelay, UINT wResol, LPTIMECALLBACK lpFunc, - DWORD dwUser, UINT wFlags) + DWORD_PTR dwUser, UINT wFlags) { if (wFlags & WINE_TIMER_IS32) WARN("Unknown windows flag... wine internally used.. ooch\n"); @@ -289,31 +306,30 @@ MMRESULT WINAPI timeSetEvent(UINT wDelay, UINT wResol, LPTIMECALLBACK lpFunc, */ MMRESULT WINAPI timeKillEvent(UINT wID) { - LPWINE_TIMERENTRY* lpTimer; - MMRESULT ret = MMSYSERR_INVALPARAM; + LPWINE_TIMERENTRY lpSelf = NULL, *lpTimer; TRACE("(%u)\n", wID); EnterCriticalSection(&WINMM_IData->cs); /* remove WINE_TIMERENTRY from list */ - for (lpTimer = &WINMM_IData->lpTimerList; *lpTimer; lpTimer = &(*lpTimer)->lpNext) { + for (lpTimer = &TIME_TimersList; *lpTimer; lpTimer = &(*lpTimer)->lpNext) { if (wID == (*lpTimer)->wTimerID) { + lpSelf = *lpTimer; + /* unlink timer of id 'wID' */ + *lpTimer = (*lpTimer)->lpNext; break; } } LeaveCriticalSection(&WINMM_IData->cs); - if (*lpTimer) { - LPWINE_TIMERENTRY lpTemp = *lpTimer; - - /* unlink timer of id 'wID' */ - *lpTimer = (*lpTimer)->lpNext; - HeapFree(GetProcessHeap(), 0, lpTemp); - ret = TIMERR_NOERROR; - } else { - WARN("wID=%u is not a valid timer ID\n", wID); + if (!lpSelf) + { + WARN("wID=%u is not a valid timer ID\n", wID); + return MMSYSERR_INVALPARAM; } - - return ret; + if (lpSelf->wFlags & TIME_KILL_SYNCHRONOUS) + WaitForSingleObject(TIME_hKillEvent, INFINITE); + HeapFree(GetProcessHeap(), 0, lpSelf); + return TIMERR_NOERROR; } /************************************************************************** @@ -365,5 +381,5 @@ DWORD WINAPI timeGetTime(void) if (pFnReleaseThunkLock) pFnReleaseThunkLock(&count); TIME_MMTimeStart(); if (pFnRestoreThunkLock) pFnRestoreThunkLock(count); - return WINMM_IData->mmSysTimeMS; + return WINMM_SysTimeMS; } diff --git a/reactos/lib/winmm/winemm.h b/reactos/lib/winmm/winemm.h index 14de7f75423..1447cd1ba4d 100644 --- a/reactos/lib/winmm/winemm.h +++ b/reactos/lib/winmm/winemm.h @@ -22,10 +22,6 @@ ***************************************************************************** */ -#include "config.h" -#include "wine/port.h" -#include "wine/debug.h" - #include <stdarg.h> #include "windef.h" @@ -74,7 +70,7 @@ typedef struct tagWINE_MM_DRIVER_PART { int nIDMin; /* lower bound of global indexes for this type */ int nIDMax; /* hhigher bound of global indexes for this type */ union { - WINEMM_msgFunc32 fnMessage32; /* pointer to fonction */ + WINEMM_msgFunc32 fnMessage32; /* pointer to function */ WINEMM_msgFunc16 fnMessage16; } u; } WINE_MM_DRIVER_PART; @@ -197,6 +193,7 @@ typedef struct tagWINE_PLAYSOUND { LPCWSTR pszSound; HMODULE hMod; DWORD fdwSound; + HANDLE hThread; struct tagWINE_PLAYSOUND* lpNext; } WINE_PLAYSOUND, *LPWINE_PLAYSOUND; @@ -205,12 +202,6 @@ typedef struct tagWINE_MM_IDATA { HANDLE hWinMM32Instance; HANDLE hWinMM16Instance; CRITICAL_SECTION cs; - /* mm timer part */ - HANDLE hMMTimer; - DWORD mmSysTimeMS; - LPWINE_TIMERENTRY lpTimerList; - int nSizeLpTimers; - LPWINE_TIMERENTRY lpTimers; /* mci part */ LPWINE_MCIDRIVER lpMciDrvs; /* low level drivers (unused yet) */ @@ -246,7 +237,7 @@ DWORD MMDRV_Open(LPWINE_MLD mld, UINT wMsg, DWORD dwParam1, DWORD dwParam2); DWORD MMDRV_Close(LPWINE_MLD mld, UINT wMsg); LPWINE_MLD MMDRV_Get(HANDLE hndl, UINT type, BOOL bCanBeID); LPWINE_MLD MMDRV_GetRelated(HANDLE hndl, UINT srcType, BOOL bSrcCanBeID, UINT dstTyped); -DWORD MMDRV_Message(LPWINE_MLD mld, WORD wMsg, DWORD dwParam1, DWORD dwParam2, BOOL bFrom32); +DWORD MMDRV_Message(LPWINE_MLD mld, UINT wMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2, BOOL bFrom32); UINT MMDRV_PhysicalFeatures(LPWINE_MLD mld, UINT uMsg, DWORD dwParam1, DWORD dwParam2); BOOL MMDRV_Is32(unsigned int); void MMDRV_InstallMap(unsigned int, MMDRV_MAPFUNC, MMDRV_UNMAPFUNC, @@ -294,6 +285,7 @@ void TIME_MMTimeStop(void); /* Global variables */ extern LPWINE_MM_IDATA WINMM_IData; +extern DWORD WINMM_SysTimeMS; /* pointers to 16 bit functions (if sibling MMSYSTEM.DLL is loaded * NULL otherwise diff --git a/reactos/lib/winmm/winemm16.h b/reactos/lib/winmm/winemm16.h new file mode 100644 index 00000000000..3bb1780fecf --- /dev/null +++ b/reactos/lib/winmm/winemm16.h @@ -0,0 +1,59 @@ +/* -*- tab-width: 8; c-basic-offset: 4 -*- */ + +/***************************************************************************** + * Copyright 1998, Luiz Otavio L. Zorzella + * 1999, Eric Pouech + * + * Purpose: multimedia declarations (internal to WINMM & MMSYSTEM DLLs) + * + * 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 "winemm.h" +#include "wine/mmsystem16.h" +#include "wownt32.h" + +/* mmsystem (16 bit files) only functions */ +void MMDRV_Init16(void); +void MMSYSTEM_MMTIME16to32(LPMMTIME mmt32, const MMTIME16* mmt16); +void MMSYSTEM_MMTIME32to16(LPMMTIME16 mmt16, const MMTIME* mmt32); + +typedef LONG (*MCIPROC16)(DWORD, HDRVR16, WORD, DWORD, DWORD); + +/* HANDLE16 -> HANDLE conversions */ +#define HDRVR_32(h16) ((HDRVR)(ULONG_PTR)(h16)) +#define HMIDI_32(h16) ((HMIDI)(ULONG_PTR)(h16)) +#define HMIDIIN_32(h16) ((HMIDIIN)(ULONG_PTR)(h16)) +#define HMIDIOUT_32(h16) ((HMIDIOUT)(ULONG_PTR)(h16)) +#define HMIDISTRM_32(h16) ((HMIDISTRM)(ULONG_PTR)(h16)) +#define HMIXER_32(h16) ((HMIXER)(ULONG_PTR)(h16)) +#define HMIXEROBJ_32(h16) ((HMIXEROBJ)(ULONG_PTR)(h16)) +#define HMMIO_32(h16) ((HMMIO)(ULONG_PTR)(h16)) +#define HWAVE_32(h16) ((HWAVE)(ULONG_PTR)(h16)) +#define HWAVEIN_32(h16) ((HWAVEIN)(ULONG_PTR)(h16)) +#define HWAVEOUT_32(h16) ((HWAVEOUT)(ULONG_PTR)(h16)) + +/* HANDLE -> HANDLE16 conversions */ +#define HDRVR_16(h32) (LOWORD(h32)) +#define HMIDI_16(h32) (LOWORD(h32)) +#define HMIDIIN_16(h32) (LOWORD(h32)) +#define HMIDIOUT_16(h32) (LOWORD(h32)) +#define HMIDISTRM_16(h32) (LOWORD(h32)) +#define HMIXER_16(h32) (LOWORD(h32)) +#define HMIXEROBJ_16(h32) (LOWORD(h32)) +#define HMMIO_16(h32) (LOWORD(h32)) +#define HWAVE_16(h32) (LOWORD(h32)) +#define HWAVEIN_16(h32) (LOWORD(h32)) +#define HWAVEOUT_16(h32) (LOWORD(h32)) diff --git a/reactos/lib/winmm/winmm.c b/reactos/lib/winmm/winmm.c index f8b8e74dd82..7fe006fd468 100644 --- a/reactos/lib/winmm/winmm.c +++ b/reactos/lib/winmm/winmm.c @@ -28,15 +28,11 @@ * 99/9 added support for loadable low level drivers */ -#include "config.h" -#include "wine/port.h" - #include <stdarg.h> #include <string.h> #define NONAMELESSUNION #define NONAMELESSSTRUCT -#define NOGDI #include "windef.h" #include "winbase.h" #include "mmsystem.h" @@ -45,7 +41,7 @@ #include "winreg.h" #include "winternl.h" #include "winemm.h" -//#include "wownt32.h" +#include "wownt32.h" #include "wine/debug.h" @@ -129,10 +125,12 @@ BOOL WINMM_CheckForMMSystem(void) loaded = -1; if (h) { +#ifndef __REACTOS__ pGetModuleHandle16 = (void*)GetProcAddress(h, "GetModuleHandle16"); pLoadLibrary16 = (void*)GetProcAddress(h, "LoadLibrary16"); if (pGetModuleHandle16 && pLoadLibrary16 && (pGetModuleHandle16("MMSYSTEM.DLL") || pLoadLibrary16("MMSYSTEM.DLL"))) +#endif /* __REACTOS__ */ loaded = 1; } } @@ -236,7 +234,7 @@ UINT WINAPI mixerGetNumDevs(void) /************************************************************************** * mixerGetDevCapsA [WINMM.@] */ -UINT WINAPI mixerGetDevCapsA(UINT uDeviceID, LPMIXERCAPSA lpCaps, UINT uSize) +UINT WINAPI mixerGetDevCapsA(UINT_PTR uDeviceID, LPMIXERCAPSA lpCaps, UINT uSize) { LPWINE_MLD wmld; @@ -245,13 +243,13 @@ UINT WINAPI mixerGetDevCapsA(UINT uDeviceID, LPMIXERCAPSA lpCaps, UINT uSize) if ((wmld = MMDRV_Get((HANDLE)uDeviceID, MMDRV_MIXER, TRUE)) == NULL) return MMSYSERR_BADDEVICEID; - return MMDRV_Message(wmld, MXDM_GETDEVCAPS, (DWORD)lpCaps, uSize, TRUE); + return MMDRV_Message(wmld, MXDM_GETDEVCAPS, (DWORD_PTR)lpCaps, uSize, TRUE); } /************************************************************************** * mixerGetDevCapsW [WINMM.@] */ -UINT WINAPI mixerGetDevCapsW(UINT uDeviceID, LPMIXERCAPSW lpCaps, UINT uSize) +UINT WINAPI mixerGetDevCapsW(UINT_PTR uDeviceID, LPMIXERCAPSW lpCaps, UINT uSize) { MIXERCAPSA micA; UINT ret = mixerGetDevCapsA(uDeviceID, &micA, sizeof(micA)); @@ -270,8 +268,8 @@ UINT WINAPI mixerGetDevCapsW(UINT uDeviceID, LPMIXERCAPSW lpCaps, UINT uSize) return ret; } -UINT MIXER_Open(LPHMIXER lphMix, UINT uDeviceID, DWORD dwCallback, - DWORD dwInstance, DWORD fdwOpen, BOOL bFrom32) +UINT MIXER_Open(LPHMIXER lphMix, UINT uDeviceID, DWORD_PTR dwCallback, + DWORD_PTR dwInstance, DWORD fdwOpen, BOOL bFrom32) { HANDLE hMix; LPWINE_MLD wmld; @@ -304,8 +302,8 @@ UINT MIXER_Open(LPHMIXER lphMix, UINT uDeviceID, DWORD dwCallback, /************************************************************************** * mixerOpen [WINMM.@] */ -UINT WINAPI mixerOpen(LPHMIXER lphMix, UINT uDeviceID, DWORD dwCallback, - DWORD dwInstance, DWORD fdwOpen) +UINT WINAPI mixerOpen(LPHMIXER lphMix, UINT uDeviceID, DWORD_PTR dwCallback, + DWORD_PTR dwInstance, DWORD fdwOpen) { return MIXER_Open(lphMix, uDeviceID, dwCallback, dwInstance, fdwOpen, TRUE); } @@ -363,7 +361,7 @@ UINT WINAPI mixerGetControlDetailsA(HMIXEROBJ hmix, LPMIXERCONTROLDETAILS lpmcdA if (lpmcdA == NULL || lpmcdA->cbStruct != sizeof(*lpmcdA)) return MMSYSERR_INVALPARAM; - return MMDRV_Message(&lpwm->mld, MXDM_GETCONTROLDETAILS, (DWORD)lpmcdA, + return MMDRV_Message(&lpwm->mld, MXDM_GETCONTROLDETAILS, (DWORD_PTR)lpmcdA, fdwDetails, TRUE); } @@ -441,7 +439,7 @@ UINT WINAPI mixerGetLineControlsA(HMIXEROBJ hmix, LPMIXERLINECONTROLSA lpmlcA, if (lpmlcA == NULL || lpmlcA->cbStruct != sizeof(*lpmlcA)) return MMSYSERR_INVALPARAM; - return MMDRV_Message(&lpwm->mld, MXDM_GETLINECONTROLS, (DWORD)lpmlcA, + return MMDRV_Message(&lpwm->mld, MXDM_GETLINECONTROLS, (DWORD_PTR)lpmlcA, fdwControls, TRUE); } @@ -518,7 +516,7 @@ UINT WINAPI mixerGetLineInfoA(HMIXEROBJ hmix, LPMIXERLINEA lpmliW, DWORD fdwInfo if ((lpwm = MIXER_GetDev(hmix, fdwInfo)) == NULL) return MMSYSERR_INVALHANDLE; - return MMDRV_Message(&lpwm->mld, MXDM_GETLINEINFO, (DWORD)lpmliW, + return MMDRV_Message(&lpwm->mld, MXDM_GETLINEINFO, (DWORD_PTR)lpmliW, fdwInfo, TRUE); } @@ -601,14 +599,14 @@ UINT WINAPI mixerSetControlDetails(HMIXEROBJ hmix, LPMIXERCONTROLDETAILS lpmcdA, if ((lpwm = MIXER_GetDev(hmix, fdwDetails)) == NULL) return MMSYSERR_INVALHANDLE; - return MMDRV_Message(&lpwm->mld, MXDM_SETCONTROLDETAILS, (DWORD)lpmcdA, + return MMDRV_Message(&lpwm->mld, MXDM_SETCONTROLDETAILS, (DWORD_PTR)lpmcdA, fdwDetails, TRUE); } /************************************************************************** * mixerMessage [WINMM.@] */ -UINT WINAPI mixerMessage(HMIXER hmix, UINT uMsg, DWORD dwParam1, DWORD dwParam2) +UINT WINAPI mixerMessage(HMIXER hmix, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { LPWINE_MLD wmld; @@ -632,7 +630,7 @@ UINT WINAPI auxGetNumDevs(void) /************************************************************************** * auxGetDevCapsW [WINMM.@] */ -UINT WINAPI auxGetDevCapsW(UINT uDeviceID, LPAUXCAPSW lpCaps, UINT uSize) +UINT WINAPI auxGetDevCapsW(UINT_PTR uDeviceID, LPAUXCAPSW lpCaps, UINT uSize) { AUXCAPSA acA; UINT ret = auxGetDevCapsA(uDeviceID, &acA, sizeof(acA)); @@ -654,7 +652,7 @@ UINT WINAPI auxGetDevCapsW(UINT uDeviceID, LPAUXCAPSW lpCaps, UINT uSize) /************************************************************************** * auxGetDevCapsA [WINMM.@] */ -UINT WINAPI auxGetDevCapsA(UINT uDeviceID, LPAUXCAPSA lpCaps, UINT uSize) +UINT WINAPI auxGetDevCapsA(UINT_PTR uDeviceID, LPAUXCAPSA lpCaps, UINT uSize) { LPWINE_MLD wmld; @@ -664,7 +662,7 @@ UINT WINAPI auxGetDevCapsA(UINT uDeviceID, LPAUXCAPSA lpCaps, UINT uSize) if ((wmld = MMDRV_Get((HANDLE)uDeviceID, MMDRV_AUX, TRUE)) == NULL) return MMSYSERR_INVALHANDLE; - return MMDRV_Message(wmld, AUXDM_GETDEVCAPS, (DWORD)lpCaps, uSize, TRUE); + return MMDRV_Message(wmld, AUXDM_GETDEVCAPS, (DWORD_PTR)lpCaps, uSize, TRUE); } /************************************************************************** @@ -678,7 +676,7 @@ UINT WINAPI auxGetVolume(UINT uDeviceID, DWORD* lpdwVolume) if ((wmld = MMDRV_Get((HANDLE)uDeviceID, MMDRV_AUX, TRUE)) == NULL) return MMSYSERR_INVALHANDLE; - return MMDRV_Message(wmld, AUXDM_GETVOLUME, (DWORD)lpdwVolume, 0L, TRUE); + return MMDRV_Message(wmld, AUXDM_GETVOLUME, (DWORD_PTR)lpdwVolume, 0L, TRUE); } /************************************************************************** @@ -698,7 +696,7 @@ UINT WINAPI auxSetVolume(UINT uDeviceID, DWORD dwVolume) /************************************************************************** * auxOutMessage [WINMM.@] */ -UINT WINAPI auxOutMessage(UINT uDeviceID, UINT uMessage, DWORD dw1, DWORD dw2) +UINT WINAPI auxOutMessage(UINT uDeviceID, UINT uMessage, DWORD_PTR dw1, DWORD_PTR dw2) { LPWINE_MLD wmld; @@ -711,20 +709,19 @@ UINT WINAPI auxOutMessage(UINT uDeviceID, UINT uMessage, DWORD dw1, DWORD dw2) /************************************************************************** * mciGetErrorStringW [WINMM.@] */ -BOOL WINAPI mciGetErrorStringW(DWORD wError, LPWSTR lpstrBuffer, UINT uLength) +BOOL WINAPI mciGetErrorStringW(MCIERROR wError, LPWSTR lpstrBuffer, UINT uLength) { - LPSTR bufstr = HeapAlloc(GetProcessHeap(), 0, uLength); - BOOL ret = mciGetErrorStringA(wError, bufstr, uLength); + char bufstr[MAXERRORLENGTH]; + BOOL ret = mciGetErrorStringA(wError, bufstr, MAXERRORLENGTH); MultiByteToWideChar( CP_ACP, 0, bufstr, -1, lpstrBuffer, uLength ); - HeapFree(GetProcessHeap(), 0, bufstr); return ret; } /************************************************************************** * mciGetErrorStringA [WINMM.@] */ -BOOL WINAPI mciGetErrorStringA(DWORD dwError, LPSTR lpstrBuffer, UINT uLength) +BOOL WINAPI mciGetErrorStringA(MCIERROR dwError, LPSTR lpstrBuffer, UINT uLength) { BOOL ret = FALSE; @@ -742,18 +739,17 @@ BOOL WINAPI mciGetErrorStringA(DWORD dwError, LPSTR lpstrBuffer, UINT uLength) /************************************************************************** * mciDriverNotify [WINMM.@] */ -BOOL WINAPI mciDriverNotify(HWND hWndCallBack, UINT wDevID, UINT wStatus) +BOOL WINAPI mciDriverNotify(HWND hWndCallBack, MCIDEVICEID wDevID, UINT wStatus) { - TRACE("(%p, %04x, %04X)\n", hWndCallBack, wDevID, wStatus); - return PostMessageA(hWndCallBack, MM_MCINOTIFY, wStatus, wDevID); + return PostMessageW(hWndCallBack, MM_MCINOTIFY, wStatus, wDevID); } /************************************************************************** * mciGetDriverData [WINMM.@] */ -DWORD WINAPI mciGetDriverData(UINT uDeviceID) +DWORD WINAPI mciGetDriverData(MCIDEVICEID uDeviceID) { LPWINE_MCIDRIVER wmd; @@ -772,7 +768,7 @@ DWORD WINAPI mciGetDriverData(UINT uDeviceID) /************************************************************************** * mciSetDriverData [WINMM.@] */ -BOOL WINAPI mciSetDriverData(UINT uDeviceID, DWORD data) +BOOL WINAPI mciSetDriverData(MCIDEVICEID uDeviceID, DWORD data) { LPWINE_MCIDRIVER wmd; @@ -792,7 +788,7 @@ BOOL WINAPI mciSetDriverData(UINT uDeviceID, DWORD data) /************************************************************************** * mciSendCommandA [WINMM.@] */ -DWORD WINAPI mciSendCommandA(UINT wDevID, UINT wMsg, DWORD dwParam1, DWORD dwParam2) +DWORD WINAPI mciSendCommandA(MCIDEVICEID wDevID, UINT wMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { DWORD dwRet; @@ -805,14 +801,233 @@ DWORD WINAPI mciSendCommandA(UINT wDevID, UINT wMsg, DWORD dwParam1, DWORD dwPar return dwRet; } +inline static LPSTR strdupWtoA( LPCWSTR str ) +{ + LPSTR ret; + INT len; + + if (!str) return NULL; + len = WideCharToMultiByte( CP_ACP, 0, str, -1, NULL, 0, NULL, NULL ); + ret = HeapAlloc( GetProcessHeap(), 0, len ); + if(ret) WideCharToMultiByte( CP_ACP, 0, str, -1, ret, len, NULL, NULL ); + return ret; +} + +static int MCI_MapMsgWtoA(UINT msg, DWORD_PTR dwParam1, DWORD_PTR *dwParam2) +{ + switch(msg) + { + case MCI_CLOSE: + case MCI_PLAY: + case MCI_SEEK: + case MCI_STOP: + case MCI_PAUSE: + case MCI_GETDEVCAPS: + case MCI_SPIN: + case MCI_SET: + case MCI_STEP: + case MCI_RECORD: + case MCI_BREAK: + case MCI_SOUND: + case MCI_STATUS: + case MCI_CUE: + case MCI_REALIZE: + case MCI_PUT: + case MCI_WHERE: + case MCI_FREEZE: + case MCI_UNFREEZE: + case MCI_CUT: + case MCI_COPY: + case MCI_PASTE: + case MCI_UPDATE: + case MCI_RESUME: + case MCI_DELETE: + return 0; + + case MCI_OPEN: + { + MCI_OPEN_PARMSW *mci_openW = (MCI_OPEN_PARMSW *)*dwParam2; + MCI_OPEN_PARMSA *mci_openA; + DWORD_PTR *ptr; + + ptr = HeapAlloc(GetProcessHeap(), 0, sizeof(*mci_openA) + sizeof(DWORD_PTR)); + if (!ptr) return -1; + + *ptr++ = *dwParam2; /* save the previous pointer */ + *dwParam2 = (DWORD_PTR)ptr; + mci_openA = (MCI_OPEN_PARMSA *)ptr; + + if (dwParam1 & MCI_NOTIFY) + mci_openA->dwCallback = mci_openW->dwCallback; + + if (dwParam1 & MCI_OPEN_TYPE) + { + if (dwParam1 & MCI_OPEN_TYPE_ID) + mci_openA->lpstrDeviceType = (LPSTR)mci_openW->lpstrDeviceType; + else + mci_openA->lpstrDeviceType = strdupWtoA(mci_openW->lpstrDeviceType); + } + if (dwParam1 & MCI_OPEN_ELEMENT) + { + if (dwParam1 & MCI_OPEN_ELEMENT_ID) + mci_openA->lpstrElementName = (LPSTR)mci_openW->lpstrElementName; + else + mci_openA->lpstrElementName = strdupWtoA(mci_openW->lpstrElementName); + } + if (dwParam1 & MCI_OPEN_ALIAS) + mci_openA->lpstrAlias = strdupWtoA(mci_openW->lpstrAlias); + } + return 1; + + case MCI_WINDOW: + if (dwParam1 & MCI_ANIM_WINDOW_TEXT) + { + MCI_ANIM_WINDOW_PARMSW *mci_windowW = (MCI_ANIM_WINDOW_PARMSW *)*dwParam2; + MCI_ANIM_WINDOW_PARMSA *mci_windowA; + + mci_windowA = HeapAlloc(GetProcessHeap(), 0, sizeof(*mci_windowA)); + if (!mci_windowA) return -1; + + *dwParam2 = (DWORD_PTR)mci_windowA; + + mci_windowA->lpstrText = strdupWtoA(mci_windowW->lpstrText); + + if (dwParam1 & MCI_NOTIFY) + mci_windowA->dwCallback = mci_windowW->dwCallback; + if (dwParam1 & MCI_ANIM_WINDOW_HWND) + mci_windowA->hWnd = mci_windowW->hWnd; + if (dwParam1 & MCI_ANIM_WINDOW_STATE) + mci_windowA->nCmdShow = mci_windowW->nCmdShow; + + return 1; + } + return 0; + + case MCI_SYSINFO: + { + MCI_SYSINFO_PARMSW *mci_sysinfoW = (MCI_SYSINFO_PARMSW *)*dwParam2; + MCI_SYSINFO_PARMSA *mci_sysinfoA; + DWORD_PTR *ptr; + + ptr = HeapAlloc(GetProcessHeap(), 0, sizeof(*mci_sysinfoA) + sizeof(DWORD_PTR)); + if (!ptr) return -1; + + *ptr++ = *dwParam2; /* save the previous pointer */ + *dwParam2 = (DWORD_PTR)ptr; + mci_sysinfoA = (MCI_SYSINFO_PARMSA *)ptr; + + if (dwParam1 & MCI_NOTIFY) + mci_sysinfoA->dwCallback = mci_sysinfoW->dwCallback; + + mci_sysinfoA->dwRetSize = mci_sysinfoW->dwRetSize; /* FIXME */ + mci_sysinfoA->lpstrReturn = HeapAlloc(GetProcessHeap(), 0, mci_sysinfoA->dwRetSize); + + return 1; + } + + case MCI_INFO: + case MCI_SAVE: + case MCI_LOAD: + case MCI_ESCAPE: + default: + FIXME("Message 0x%04x needs translation\n", msg); + return -1; + } + return 0; +} + +static DWORD MCI_UnmapMsgWtoA(UINT msg, DWORD_PTR dwParam1, DWORD_PTR dwParam2, + DWORD result) +{ + switch(msg) + { + case MCI_OPEN: + { + DWORD_PTR *ptr = (DWORD_PTR *)dwParam2 - 1; + MCI_OPEN_PARMSW *mci_openW = (MCI_OPEN_PARMSW *)*ptr; + MCI_OPEN_PARMSA *mci_openA = (MCI_OPEN_PARMSA *)(ptr + 1); + + mci_openW->wDeviceID = mci_openA->wDeviceID; + + if (dwParam1 & MCI_OPEN_TYPE) + { + if (!(dwParam1 & MCI_OPEN_TYPE_ID)) + HeapFree(GetProcessHeap(), 0, mci_openA->lpstrDeviceType); + } + if (dwParam1 & MCI_OPEN_ELEMENT) + { + if (!(dwParam1 & MCI_OPEN_ELEMENT_ID)) + HeapFree(GetProcessHeap(), 0, mci_openA->lpstrElementName); + } + if (dwParam1 & MCI_OPEN_ALIAS) + HeapFree(GetProcessHeap(), 0, mci_openA->lpstrAlias); + HeapFree(GetProcessHeap(), 0, ptr); + } + break; + + case MCI_WINDOW: + if (dwParam1 & MCI_ANIM_WINDOW_TEXT) + { + MCI_ANIM_WINDOW_PARMSA *mci_windowA = (MCI_ANIM_WINDOW_PARMSA *)dwParam2; + + HeapFree(GetProcessHeap(), 0, (void *)mci_windowA->lpstrText); + HeapFree(GetProcessHeap(), 0, mci_windowA); + } + break; + + case MCI_SYSINFO: + { + DWORD_PTR *ptr = (DWORD_PTR *)dwParam2 - 1; + MCI_SYSINFO_PARMSW *mci_sysinfoW = (MCI_SYSINFO_PARMSW *)*ptr; + MCI_SYSINFO_PARMSA *mci_sysinfoA = (MCI_SYSINFO_PARMSA *)(ptr + 1); + + if (!result) + { + mci_sysinfoW->dwNumber = mci_sysinfoA->dwNumber; + mci_sysinfoW->wDeviceType = mci_sysinfoA->wDeviceType; + MultiByteToWideChar(CP_ACP, 0, + mci_sysinfoA->lpstrReturn, mci_sysinfoA->dwRetSize, + mci_sysinfoW->lpstrReturn, mci_sysinfoW->dwRetSize); + } + + HeapFree(GetProcessHeap(), 0, mci_sysinfoA->lpstrReturn); + HeapFree(GetProcessHeap(), 0, ptr); + } + break; + + default: + FIXME("Message 0x%04x needs unmapping\n", msg); + break; + } + + return result; +} + + /************************************************************************** * mciSendCommandW [WINMM.@] + * + * FIXME: we should do the things other way around, but since our + * MM subsystem is not unicode aware... */ -DWORD WINAPI mciSendCommandW(UINT wDevID, UINT wMsg, DWORD dwParam1, DWORD dwParam2) +DWORD WINAPI mciSendCommandW(MCIDEVICEID wDevID, UINT wMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { - FIXME("(%08x, %s, %08lx, %08lx): stub\n", + DWORD ret; + int mapped; + + TRACE("(%08x, %s, %08lx, %08lx)\n", wDevID, MCI_MessageToString(wMsg), dwParam1, dwParam2); - return MCIERR_UNSUPPORTED_FUNCTION; + + mapped = MCI_MapMsgWtoA(wMsg, dwParam1, &dwParam2); + if (mapped == -1) + { + FIXME("message %04x mapping failed\n", wMsg); + return MMSYSERR_NOMEM; + } + ret = mciSendCommandA(wDevID, wMsg, dwParam1, dwParam2); + if (mapped) + MCI_UnmapMsgWtoA(wMsg, dwParam1, dwParam2, ret); + return ret; } /************************************************************************** @@ -850,18 +1065,15 @@ UINT WINAPI MCI_DefYieldProc(MCIDEVICEID wDevID, DWORD data) INT16 ret; TRACE("(0x%04x, 0x%08lx)\n", wDevID, data); -#ifndef __REACTOS__ + if ((HIWORD(data) != 0 && HWND_16(GetActiveWindow()) != HIWORD(data)) || (GetAsyncKeyState(LOWORD(data)) & 1) == 0) { MyUserYield(); ret = 0; - } else -#endif - { + } else { MSG msg; - - msg.hwnd = HIWORD(data); - //msg.hwnd = HWND_32(HIWORD(data)); + + msg.hwnd = HWND_32(HIWORD(data)); while (!PeekMessageA(&msg, msg.hwnd, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE)); ret = -1; } @@ -871,7 +1083,7 @@ UINT WINAPI MCI_DefYieldProc(MCIDEVICEID wDevID, DWORD data) /************************************************************************** * mciSetYieldProc [WINMM.@] */ -BOOL WINAPI mciSetYieldProc(UINT uDeviceID, YIELDPROC fpYieldProc, DWORD dwYieldData) +BOOL WINAPI mciSetYieldProc(MCIDEVICEID uDeviceID, YIELDPROC fpYieldProc, DWORD dwYieldData) { LPWINE_MCIDRIVER wmd; @@ -904,7 +1116,7 @@ UINT WINAPI mciGetDeviceIDFromElementIDW(DWORD dwElementID, LPCWSTR lpstrType) /************************************************************************** * mciGetYieldProc [WINMM.@] */ -YIELDPROC WINAPI mciGetYieldProc(UINT uDeviceID, DWORD* lpdwYieldData) +YIELDPROC WINAPI mciGetYieldProc(MCIDEVICEID uDeviceID, DWORD* lpdwYieldData) { LPWINE_MCIDRIVER wmd; @@ -928,7 +1140,7 @@ YIELDPROC WINAPI mciGetYieldProc(UINT uDeviceID, DWORD* lpdwYieldData) /************************************************************************** * mciGetCreatorTask [WINMM.@] */ -HTASK WINAPI mciGetCreatorTask(UINT uDeviceID) +HTASK WINAPI mciGetCreatorTask(MCIDEVICEID uDeviceID) { LPWINE_MCIDRIVER wmd; HTASK ret = 0; @@ -942,7 +1154,7 @@ HTASK WINAPI mciGetCreatorTask(UINT uDeviceID) /************************************************************************** * mciDriverYield [WINMM.@] */ -UINT WINAPI mciDriverYield(UINT uDeviceID) +UINT WINAPI mciDriverYield(MCIDEVICEID uDeviceID) { LPWINE_MCIDRIVER wmd; UINT ret = 0; @@ -969,7 +1181,7 @@ UINT WINAPI midiOutGetNumDevs(void) /************************************************************************** * midiOutGetDevCapsW [WINMM.@] */ -UINT WINAPI midiOutGetDevCapsW(UINT uDeviceID, LPMIDIOUTCAPSW lpCaps, +UINT WINAPI midiOutGetDevCapsW(UINT_PTR uDeviceID, LPMIDIOUTCAPSW lpCaps, UINT uSize) { MIDIOUTCAPSA mocA; @@ -995,7 +1207,7 @@ UINT WINAPI midiOutGetDevCapsW(UINT uDeviceID, LPMIDIOUTCAPSW lpCaps, /************************************************************************** * midiOutGetDevCapsA [WINMM.@] */ -UINT WINAPI midiOutGetDevCapsA(UINT uDeviceID, LPMIDIOUTCAPSA lpCaps, +UINT WINAPI midiOutGetDevCapsA(UINT_PTR uDeviceID, LPMIDIOUTCAPSA lpCaps, UINT uSize) { LPWINE_MLD wmld; @@ -1007,7 +1219,7 @@ UINT WINAPI midiOutGetDevCapsA(UINT uDeviceID, LPMIDIOUTCAPSA lpCaps, if ((wmld = MMDRV_Get((HANDLE)uDeviceID, MMDRV_MIDIOUT, TRUE)) == NULL) return MMSYSERR_INVALHANDLE; - return MMDRV_Message(wmld, MODM_GETDEVCAPS, (DWORD)lpCaps, uSize, TRUE); + return MMDRV_Message(wmld, MODM_GETDEVCAPS, (DWORD_PTR)lpCaps, uSize, TRUE); } /************************************************************************** @@ -1088,8 +1300,8 @@ static LPWINE_MIDI MIDI_OutAlloc(HMIDIOUT* lphMidiOut, LPDWORD lpdwCallback, return lpwm; } -UINT MIDI_OutOpen(HMIDIOUT* lphMidiOut, UINT uDeviceID, DWORD dwCallback, - DWORD dwInstance, DWORD dwFlags, BOOL bFrom32) +UINT MIDI_OutOpen(LPHMIDIOUT lphMidiOut, UINT uDeviceID, DWORD_PTR dwCallback, + DWORD_PTR dwInstance, DWORD dwFlags, BOOL bFrom32) { HMIDIOUT hMidiOut; LPWINE_MIDI lpwm; @@ -1124,8 +1336,8 @@ UINT MIDI_OutOpen(HMIDIOUT* lphMidiOut, UINT uDeviceID, DWORD dwCallback, /************************************************************************** * midiOutOpen [WINMM.@] */ -UINT WINAPI midiOutOpen(HMIDIOUT* lphMidiOut, UINT uDeviceID, - DWORD dwCallback, DWORD dwInstance, DWORD dwFlags) +UINT WINAPI midiOutOpen(LPHMIDIOUT lphMidiOut, UINT uDeviceID, + DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD dwFlags) { return MIDI_OutOpen(lphMidiOut, uDeviceID, dwCallback, dwInstance, dwFlags, TRUE); } @@ -1162,7 +1374,7 @@ UINT WINAPI midiOutPrepareHeader(HMIDIOUT hMidiOut, if ((wmld = MMDRV_Get(hMidiOut, MMDRV_MIDIOUT, FALSE)) == NULL) return MMSYSERR_INVALHANDLE; - return MMDRV_Message(wmld, MODM_PREPARE, (DWORD)lpMidiOutHdr, uSize, TRUE); + return MMDRV_Message(wmld, MODM_PREPARE, (DWORD_PTR)lpMidiOutHdr, uSize, TRUE); } /************************************************************************** @@ -1182,7 +1394,7 @@ UINT WINAPI midiOutUnprepareHeader(HMIDIOUT hMidiOut, if ((wmld = MMDRV_Get(hMidiOut, MMDRV_MIDIOUT, FALSE)) == NULL) return MMSYSERR_INVALHANDLE; - return MMDRV_Message(wmld, MODM_UNPREPARE, (DWORD)lpMidiOutHdr, uSize, TRUE); + return MMDRV_Message(wmld, MODM_UNPREPARE, (DWORD_PTR)lpMidiOutHdr, uSize, TRUE); } /************************************************************************** @@ -1213,7 +1425,7 @@ UINT WINAPI midiOutLongMsg(HMIDIOUT hMidiOut, if ((wmld = MMDRV_Get(hMidiOut, MMDRV_MIDIOUT, FALSE)) == NULL) return MMSYSERR_INVALHANDLE; - return MMDRV_Message(wmld, MODM_LONGDATA, (DWORD)lpMidiOutHdr, uSize, TRUE); + return MMDRV_Message(wmld, MODM_LONGDATA, (DWORD_PTR)lpMidiOutHdr, uSize, TRUE); } /************************************************************************** @@ -1243,7 +1455,7 @@ UINT WINAPI midiOutGetVolume(HMIDIOUT hMidiOut, DWORD* lpdwVolume) if ((wmld = MMDRV_Get(hMidiOut, MMDRV_MIDIOUT, TRUE)) == NULL) return MMSYSERR_INVALHANDLE; - return MMDRV_Message(wmld, MODM_GETVOLUME, (DWORD)lpdwVolume, 0L, TRUE); + return MMDRV_Message(wmld, MODM_GETVOLUME, (DWORD_PTR)lpdwVolume, 0L, TRUE); } /************************************************************************** @@ -1303,7 +1515,7 @@ UINT WINAPI midiOutGetID(HMIDIOUT hMidiOut, UINT* lpuDeviceID) * midiOutMessage [WINMM.@] */ UINT WINAPI midiOutMessage(HMIDIOUT hMidiOut, UINT uMessage, - DWORD dwParam1, DWORD dwParam2) + DWORD_PTR dwParam1, DWORD_PTR dwParam2) { LPWINE_MLD wmld; @@ -1341,7 +1553,7 @@ UINT WINAPI midiInGetNumDevs(void) /************************************************************************** * midiInGetDevCapsW [WINMM.@] */ -UINT WINAPI midiInGetDevCapsW(UINT uDeviceID, LPMIDIINCAPSW lpCaps, UINT uSize) +UINT WINAPI midiInGetDevCapsW(UINT_PTR uDeviceID, LPMIDIINCAPSW lpCaps, UINT uSize) { MIDIINCAPSA micA; UINT ret = midiInGetDevCapsA(uDeviceID, &micA, uSize); @@ -1362,7 +1574,7 @@ UINT WINAPI midiInGetDevCapsW(UINT uDeviceID, LPMIDIINCAPSW lpCaps, UINT uSize) /************************************************************************** * midiInGetDevCapsA [WINMM.@] */ -UINT WINAPI midiInGetDevCapsA(UINT uDeviceID, LPMIDIINCAPSA lpCaps, UINT uSize) +UINT WINAPI midiInGetDevCapsA(UINT_PTR uDeviceID, LPMIDIINCAPSA lpCaps, UINT uSize) { LPWINE_MLD wmld; @@ -1373,7 +1585,7 @@ UINT WINAPI midiInGetDevCapsA(UINT uDeviceID, LPMIDIINCAPSA lpCaps, UINT uSize) if ((wmld = MMDRV_Get((HANDLE)uDeviceID, MMDRV_MIDIIN, TRUE)) == NULL) return MMSYSERR_INVALHANDLE; - return MMDRV_Message(wmld, MIDM_GETDEVCAPS, (DWORD)lpCaps, uSize, TRUE); + return MMDRV_Message(wmld, MIDM_GETDEVCAPS, (DWORD_PTR)lpCaps, uSize, TRUE); } /************************************************************************** @@ -1472,7 +1684,7 @@ UINT WINAPI midiInPrepareHeader(HMIDIIN hMidiIn, if ((wmld = MMDRV_Get(hMidiIn, MMDRV_MIDIIN, FALSE)) == NULL) return MMSYSERR_INVALHANDLE; - return MMDRV_Message(wmld, MIDM_PREPARE, (DWORD)lpMidiInHdr, uSize, TRUE); + return MMDRV_Message(wmld, MIDM_PREPARE, (DWORD_PTR)lpMidiInHdr, uSize, TRUE); } /************************************************************************** @@ -1492,7 +1704,7 @@ UINT WINAPI midiInUnprepareHeader(HMIDIIN hMidiIn, if ((wmld = MMDRV_Get(hMidiIn, MMDRV_MIDIIN, FALSE)) == NULL) return MMSYSERR_INVALHANDLE; - return MMDRV_Message(wmld, MIDM_UNPREPARE, (DWORD)lpMidiInHdr, uSize, TRUE); + return MMDRV_Message(wmld, MIDM_UNPREPARE, (DWORD_PTR)lpMidiInHdr, uSize, TRUE); } /************************************************************************** @@ -1508,7 +1720,7 @@ UINT WINAPI midiInAddBuffer(HMIDIIN hMidiIn, if ((wmld = MMDRV_Get(hMidiIn, MMDRV_MIDIIN, FALSE)) == NULL) return MMSYSERR_INVALHANDLE; - return MMDRV_Message(wmld, MIDM_ADDBUFFER, (DWORD)lpMidiInHdr, uSize, TRUE); + return MMDRV_Message(wmld, MIDM_ADDBUFFER, (DWORD_PTR)lpMidiInHdr, uSize, TRUE); } /************************************************************************** @@ -1579,7 +1791,7 @@ UINT WINAPI midiInGetID(HMIDIIN hMidiIn, UINT* lpuDeviceID) * midiInMessage [WINMM.@] */ UINT WINAPI midiInMessage(HMIDIIN hMidiIn, UINT uMessage, - DWORD dwParam1, DWORD dwParam2) + DWORD_PTR dwParam1, DWORD_PTR dwParam2) { LPWINE_MLD wmld; @@ -2269,7 +2481,7 @@ UINT WINAPI waveOutGetNumDevs(void) /************************************************************************** * waveOutGetDevCapsA [WINMM.@] */ -UINT WINAPI waveOutGetDevCapsA(UINT uDeviceID, LPWAVEOUTCAPSA lpCaps, +UINT WINAPI waveOutGetDevCapsA(UINT_PTR uDeviceID, LPWAVEOUTCAPSA lpCaps, UINT uSize) { LPWINE_MLD wmld; @@ -2281,14 +2493,14 @@ UINT WINAPI waveOutGetDevCapsA(UINT uDeviceID, LPWAVEOUTCAPSA lpCaps, if ((wmld = MMDRV_Get((HANDLE)uDeviceID, MMDRV_WAVEOUT, TRUE)) == NULL) return MMSYSERR_BADDEVICEID; - return MMDRV_Message(wmld, WODM_GETDEVCAPS, (DWORD)lpCaps, uSize, TRUE); + return MMDRV_Message(wmld, WODM_GETDEVCAPS, (DWORD_PTR)lpCaps, uSize, TRUE); } /************************************************************************** * waveOutGetDevCapsW [WINMM.@] */ -UINT WINAPI waveOutGetDevCapsW(UINT uDeviceID, LPWAVEOUTCAPSW lpCaps, +UINT WINAPI waveOutGetDevCapsW(UINT_PTR uDeviceID, LPWAVEOUTCAPSW lpCaps, UINT uSize) { WAVEOUTCAPSA wocA; @@ -2359,9 +2571,9 @@ UINT WINAPI waveOutGetErrorTextW(UINT uError, LPWSTR lpText, UINT uSize) * waveOutOpen [WINMM.@] * All the args/structs have the same layout as the win16 equivalents */ -UINT WINAPI waveOutOpen(HWAVEOUT* lphWaveOut, UINT uDeviceID, - const LPWAVEFORMATEX lpFormat, DWORD dwCallback, - DWORD dwInstance, DWORD dwFlags) +UINT WINAPI waveOutOpen(LPHWAVEOUT lphWaveOut, UINT uDeviceID, + const LPWAVEFORMATEX lpFormat, DWORD_PTR dwCallback, + DWORD_PTR dwInstance, DWORD dwFlags) { return WAVE_Open((HANDLE*)lphWaveOut, uDeviceID, MMDRV_WAVEOUT, lpFormat, dwCallback, dwInstance, dwFlags, TRUE); @@ -2402,7 +2614,7 @@ UINT WINAPI waveOutPrepareHeader(HWAVEOUT hWaveOut, if ((wmld = MMDRV_Get(hWaveOut, MMDRV_WAVEOUT, FALSE)) == NULL) return MMSYSERR_INVALHANDLE; - return MMDRV_Message(wmld, WODM_PREPARE, (DWORD)lpWaveOutHdr, uSize, TRUE); + return MMDRV_Message(wmld, WODM_PREPARE, (DWORD_PTR)lpWaveOutHdr, uSize, TRUE); } /************************************************************************** @@ -2422,7 +2634,7 @@ UINT WINAPI waveOutUnprepareHeader(HWAVEOUT hWaveOut, if ((wmld = MMDRV_Get(hWaveOut, MMDRV_WAVEOUT, FALSE)) == NULL) return MMSYSERR_INVALHANDLE; - return MMDRV_Message(wmld, WODM_UNPREPARE, (DWORD)lpWaveOutHdr, uSize, TRUE); + return MMDRV_Message(wmld, WODM_UNPREPARE, (DWORD_PTR)lpWaveOutHdr, uSize, TRUE); } /************************************************************************** @@ -2438,7 +2650,7 @@ UINT WINAPI waveOutWrite(HWAVEOUT hWaveOut, LPWAVEHDR lpWaveOutHdr, if ((wmld = MMDRV_Get(hWaveOut, MMDRV_WAVEOUT, FALSE)) == NULL) return MMSYSERR_INVALHANDLE; - return MMDRV_Message(wmld, WODM_WRITE, (DWORD)lpWaveOutHdr, uSize, TRUE); + return MMDRV_Message(wmld, WODM_WRITE, (DWORD_PTR)lpWaveOutHdr, uSize, TRUE); } /************************************************************************** @@ -2510,7 +2722,7 @@ UINT WINAPI waveOutGetPosition(HWAVEOUT hWaveOut, LPMMTIME lpTime, if ((wmld = MMDRV_Get(hWaveOut, MMDRV_WAVEOUT, FALSE)) == NULL) return MMSYSERR_INVALHANDLE; - return MMDRV_Message(wmld, WODM_GETPOS, (DWORD)lpTime, uSize, TRUE); + return MMDRV_Message(wmld, WODM_GETPOS, (DWORD_PTR)lpTime, uSize, TRUE); } /************************************************************************** @@ -2524,7 +2736,7 @@ UINT WINAPI waveOutGetPitch(HWAVEOUT hWaveOut, LPDWORD lpdw) if ((wmld = MMDRV_Get(hWaveOut, MMDRV_WAVEOUT, FALSE)) == NULL) return MMSYSERR_INVALHANDLE; - return MMDRV_Message(wmld, WODM_GETPITCH, (DWORD)lpdw, 0L, TRUE); + return MMDRV_Message(wmld, WODM_GETPITCH, (DWORD_PTR)lpdw, 0L, TRUE); } /************************************************************************** @@ -2552,7 +2764,7 @@ UINT WINAPI waveOutGetPlaybackRate(HWAVEOUT hWaveOut, LPDWORD lpdw) if ((wmld = MMDRV_Get(hWaveOut, MMDRV_WAVEOUT, FALSE)) == NULL) return MMSYSERR_INVALHANDLE; - return MMDRV_Message(wmld, WODM_GETPLAYBACKRATE, (DWORD)lpdw, 0L, TRUE); + return MMDRV_Message(wmld, WODM_GETPLAYBACKRATE, (DWORD_PTR)lpdw, 0L, TRUE); } /************************************************************************** @@ -2581,7 +2793,7 @@ UINT WINAPI waveOutGetVolume(HWAVEOUT hWaveOut, LPDWORD lpdw) if ((wmld = MMDRV_Get(hWaveOut, MMDRV_WAVEOUT, TRUE)) == NULL) return MMSYSERR_INVALHANDLE; - return MMDRV_Message(wmld, WODM_GETVOLUME, (DWORD)lpdw, 0L, TRUE); + return MMDRV_Message(wmld, WODM_GETVOLUME, (DWORD_PTR)lpdw, 0L, TRUE); } /************************************************************************** @@ -2621,7 +2833,7 @@ UINT WINAPI waveOutGetID(HWAVEOUT hWaveOut, UINT* lpuDeviceID) * waveOutMessage [WINMM.@] */ UINT WINAPI waveOutMessage(HWAVEOUT hWaveOut, UINT uMessage, - DWORD dwParam1, DWORD dwParam2) + DWORD_PTR dwParam1, DWORD_PTR dwParam2) { LPWINE_MLD wmld; @@ -2652,7 +2864,7 @@ UINT WINAPI waveInGetNumDevs(void) /************************************************************************** * waveInGetDevCapsW [WINMM.@] */ -UINT WINAPI waveInGetDevCapsW(UINT uDeviceID, LPWAVEINCAPSW lpCaps, UINT uSize) +UINT WINAPI waveInGetDevCapsW(UINT_PTR uDeviceID, LPWAVEINCAPSW lpCaps, UINT uSize) { WAVEINCAPSA wicA; UINT ret = waveInGetDevCapsA(uDeviceID, &wicA, uSize); @@ -2674,7 +2886,7 @@ UINT WINAPI waveInGetDevCapsW(UINT uDeviceID, LPWAVEINCAPSW lpCaps, UINT uSize) /************************************************************************** * waveInGetDevCapsA [WINMM.@] */ -UINT WINAPI waveInGetDevCapsA(UINT uDeviceID, LPWAVEINCAPSA lpCaps, UINT uSize) +UINT WINAPI waveInGetDevCapsA(UINT_PTR uDeviceID, LPWAVEINCAPSA lpCaps, UINT uSize) { LPWINE_MLD wmld; @@ -2685,7 +2897,7 @@ UINT WINAPI waveInGetDevCapsA(UINT uDeviceID, LPWAVEINCAPSA lpCaps, UINT uSize) if ((wmld = MMDRV_Get((HANDLE)uDeviceID, MMDRV_WAVEIN, TRUE)) == NULL) return MMSYSERR_BADDEVICEID; - return MMDRV_Message(wmld, WIDM_GETDEVCAPS, (DWORD)lpCaps, uSize, TRUE); + return MMDRV_Message(wmld, WIDM_GETDEVCAPS, (DWORD_PTR)lpCaps, uSize, TRUE); } /************************************************************************** @@ -2755,7 +2967,7 @@ UINT WINAPI waveInPrepareHeader(HWAVEIN hWaveIn, WAVEHDR* lpWaveInHdr, lpWaveInHdr->dwBytesRecorded = 0; - return MMDRV_Message(wmld, WIDM_PREPARE, (DWORD)lpWaveInHdr, uSize, TRUE); + return MMDRV_Message(wmld, WIDM_PREPARE, (DWORD_PTR)lpWaveInHdr, uSize, TRUE); } /************************************************************************** @@ -2776,7 +2988,7 @@ UINT WINAPI waveInUnprepareHeader(HWAVEIN hWaveIn, WAVEHDR* lpWaveInHdr, if ((wmld = MMDRV_Get(hWaveIn, MMDRV_WAVEIN, FALSE)) == NULL) return MMSYSERR_INVALHANDLE; - return MMDRV_Message(wmld, WIDM_UNPREPARE, (DWORD)lpWaveInHdr, uSize, TRUE); + return MMDRV_Message(wmld, WIDM_UNPREPARE, (DWORD_PTR)lpWaveInHdr, uSize, TRUE); } /************************************************************************** @@ -2793,7 +3005,7 @@ UINT WINAPI waveInAddBuffer(HWAVEIN hWaveIn, if ((wmld = MMDRV_Get(hWaveIn, MMDRV_WAVEIN, FALSE)) == NULL) return MMSYSERR_INVALHANDLE; - return MMDRV_Message(wmld, WIDM_ADDBUFFER, (DWORD)lpWaveInHdr, uSize, TRUE); + return MMDRV_Message(wmld, WIDM_ADDBUFFER, (DWORD_PTR)lpWaveInHdr, uSize, TRUE); } /************************************************************************** @@ -2854,7 +3066,7 @@ UINT WINAPI waveInGetPosition(HWAVEIN hWaveIn, LPMMTIME lpTime, if ((wmld = MMDRV_Get(hWaveIn, MMDRV_WAVEIN, FALSE)) == NULL) return MMSYSERR_INVALHANDLE; - return MMDRV_Message(wmld, WIDM_GETPOS, (DWORD)lpTime, uSize, TRUE); + return MMDRV_Message(wmld, WIDM_GETPOS, (DWORD_PTR)lpTime, uSize, TRUE); } /************************************************************************** @@ -2879,7 +3091,7 @@ UINT WINAPI waveInGetID(HWAVEIN hWaveIn, UINT* lpuDeviceID) * waveInMessage [WINMM.@] */ UINT WINAPI waveInMessage(HWAVEIN hWaveIn, UINT uMessage, - DWORD dwParam1, DWORD dwParam2) + DWORD_PTR dwParam1, DWORD_PTR dwParam2) { LPWINE_MLD wmld; diff --git a/reactos/lib/winmm/winmm.def b/reactos/lib/winmm/winmm.def deleted file mode 100644 index 945525a5acb..00000000000 --- a/reactos/lib/winmm/winmm.def +++ /dev/null @@ -1,181 +0,0 @@ -; File generated automatically from winmm.spec; do not edit! - -LIBRARY winmm.dll - -EXPORTS -PlaySoundA@12 @18 -CloseDriver@12 @2 -DefDriverProc@20 @5 -DriverCallback@28 @6 -;DrvClose@12=CloseDriver@12 @7 -;DrvDefDriverProc@20=DefDriverProc@20 @8 -;DrvGetModuleHandle@4=GetDriverModuleHandle@4 @9 -;DrvOpen@12=OpenDriverW@12 @10 -;DrvOpenA@12=OpenDriverA@12 @11 -;DrvSendMessage@16=SendDriverMessage@16 @12 -GetDriverFlags@4 @13 -GetDriverModuleHandle@4 @14 -;OpenDriver@12=OpenDriverW@12 @15 -OpenDriverA@12 @16 -;PlaySound@12=PlaySoundA@12 @17 -PlaySoundW@12 @19 -SendDriverMessage@16 @20 -auxGetDevCapsA@12 @21 -auxGetDevCapsW@12 @22 -auxGetNumDevs@0 @23 -auxGetVolume@8 @24 -auxOutMessage@16 @25 -auxSetVolume@8 @26 -joyGetDevCapsA@12 @28 -joyGetDevCapsW@12 @29 -joyGetNumDevs@0 @30 -joyGetPos@8 @31 -joyGetPosEx@8 @32 -joyGetThreshold@8 @33 -joyReleaseCapture@4 @34 -joySetCapture@16 @35 -joySetThreshold@8 @36 -mciDriverNotify@12 @37 -mciDriverYield@4 @38 -mciExecute@4 @39 -mciFreeCommandResource@4 @40 -mciGetCreatorTask@4 @41 -mciGetDeviceIDA@4 @42 -mciGetDeviceIDFromElementIDW@8 @43 -mciGetDeviceIDW@4 @44 -mciGetDriverData@4 @45 -mciGetErrorStringA@12 @46 -mciGetErrorStringW@12 @47 -mciGetYieldProc@8 @48 -mciLoadCommandResource@12 @49 -mciSendCommandA@16 @50 -mciSendCommandW@16 @51 -mciSendStringA@16 @52 -mciSendStringW@16 @53 -mciSetDriverData@8 @54 -mciSetYieldProc@12 @55 -midiInAddBuffer@12 @58 -midiInClose@4 @59 -midiInGetDevCapsA@12 @60 -midiInGetDevCapsW@12 @61 -midiInGetErrorTextA@12 @62 -midiInGetErrorTextW@12 @63 -midiInGetID@8 @64 -midiInGetNumDevs@0 @65 -midiInMessage@16 @66 -midiInOpen@20 @67 -midiInPrepareHeader@12 @68 -midiInReset@4 @69 -midiInStart@4 @70 -midiInStop@4 @71 -midiInUnprepareHeader@12 @72 -midiOutCacheDrumPatches@16 @73 -midiOutCachePatches@16 @74 -midiOutClose@4 @75 -midiOutGetDevCapsA@12 @76 -midiOutGetDevCapsW@12 @77 -midiOutGetErrorTextA@12 @78 -midiOutGetErrorTextW@12 @79 -midiOutGetID@8 @80 -midiOutGetNumDevs@0 @81 -midiOutGetVolume@8 @82 -midiOutLongMsg@12 @83 -midiOutMessage@16 @84 -midiOutOpen@20 @85 -midiOutPrepareHeader@12 @86 -midiOutReset@4 @87 -midiOutSetVolume@8 @88 -midiOutShortMsg@8 @89 -midiOutUnprepareHeader@12 @90 -midiStreamClose@4 @91 -midiStreamOpen@24 @92 -midiStreamOut@12 @93 -midiStreamPause@4 @94 -midiStreamPosition@12 @95 -midiStreamProperty@12 @96 -midiStreamRestart@4 @97 -midiStreamStop@4 @98 -mixerClose@4 @99 -mixerGetControlDetailsA@12 @100 -mixerGetControlDetailsW@12 @101 -mixerGetDevCapsA@12 @102 -mixerGetDevCapsW@12 @103 -mixerGetID@12 @104 -mixerGetLineControlsA@12 @105 -mixerGetLineControlsW@12 @106 -mixerGetLineInfoA@12 @107 -mixerGetLineInfoW@12 @108 -mixerGetNumDevs@0 @109 -mixerMessage@16 @110 -mixerOpen@20 @111 -mixerSetControlDetails@12 @112 -mmioAdvance@12 @113 -mmioAscend@12 @114 -mmioClose@8 @115 -mmioCreateChunk@12 @116 -mmioDescend@16 @117 -mmioFlush@8 @118 -mmioGetInfo@12 @119 -mmioInstallIOProcA@12 @121 -mmioInstallIOProcW@12 @122 -mmioOpenA@12 @123 -mmioOpenW@12 @124 -mmioRead@12 @125 -mmioRenameA@16 @126 -mmioRenameW@16 @127 -mmioSeek@12 @128 -mmioSendMessage@16 @129 -mmioSetBuffer@16 @130 -mmioSetInfo@12 @131 -mmioStringToFOURCCA@8 @132 -mmioStringToFOURCCW@8 @133 -mmioWrite@12 @134 -mmsystemGetVersion@0 @135 -sndPlaySoundA@8 @136 -sndPlaySoundW@8 @137 -timeBeginPeriod@4 @138 -timeEndPeriod@4 @139 -timeGetDevCaps@8 @140 -timeGetSystemTime@8 @141 -timeGetTime@0 @142 -timeKillEvent@4 @143 -timeSetEvent@20 @144 -waveInAddBuffer@12 @145 -waveInClose@4 @146 -waveInGetDevCapsA@12 @147 -waveInGetDevCapsW@12 @148 -waveInGetErrorTextA@12 @149 -waveInGetErrorTextW@12 @150 -waveInGetID@8 @151 -waveInGetNumDevs@0 @152 -waveInGetPosition@12 @153 -waveInMessage@16 @154 -waveInOpen@24 @155 -waveInPrepareHeader@12 @156 -waveInReset@4 @157 -waveInStart@4 @158 -waveInStop@4 @159 -waveInUnprepareHeader@12 @160 -waveOutBreakLoop@4 @161 -waveOutClose@4 @162 -waveOutGetDevCapsA@12 @163 -waveOutGetDevCapsW@12 @164 -waveOutGetErrorTextA@12 @165 -waveOutGetErrorTextW@12 @166 -waveOutGetID@8 @167 -waveOutGetNumDevs@0 @168 -waveOutGetPitch@8 @169 -waveOutGetPlaybackRate@8 @170 -waveOutGetPosition@12 @171 -waveOutGetVolume@8 @172 -waveOutMessage@16 @173 -waveOutOpen@24 @174 -waveOutPause@4 @175 -waveOutPrepareHeader@12 @176 -waveOutReset@4 @177 -waveOutRestart@4 @178 -waveOutSetPitch@8 @179 -waveOutSetPlaybackRate@8 @180 -waveOutSetVolume@8 @181 -waveOutUnprepareHeader@12 @182 -waveOutWrite@12 @183 diff --git a/reactos/lib/winmm/winmm.edf b/reactos/lib/winmm/winmm.edf deleted file mode 100644 index deeb8fbd075..00000000000 --- a/reactos/lib/winmm/winmm.edf +++ /dev/null @@ -1,181 +0,0 @@ -; File generated automatically from winmm.spec; do not edit! - -LIBRARY winmm.dll - -EXPORTS -PlaySoundA=PlaySoundA@12 @18 -CloseDriver=CloseDriver@12 @2 -DefDriverProc=DefDriverProc@20 @5 -DriverCallback=DriverCallback@28 @6 -DrvClose=CloseDriver@12 @7 -DrvDefDriverProc=DefDriverProc@20 @8 -DrvGetModuleHandle=GetDriverModuleHandle@4 @9 -DrvOpen=OpenDriverW@12 @10 -DrvOpenA=OpenDriverA@12 @11 -DrvSendMessage=SendDriverMessage@16 @12 -GetDriverFlags=GetDriverFlags@4 @13 -GetDriverModuleHandle=GetDriverModuleHandle@4 @14 -OpenDriver=OpenDriverW@12 @15 -OpenDriverA=OpenDriverA@12 @16 -PlaySound=PlaySoundA@12 @17 -PlaySoundW=PlaySoundW@12 @19 -SendDriverMessage=SendDriverMessage@16 @20 -auxGetDevCapsA=auxGetDevCapsA@12 @21 -auxGetDevCapsW=auxGetDevCapsW@12 @22 -auxGetNumDevs=auxGetNumDevs@0 @23 -auxGetVolume=auxGetVolume@8 @24 -auxOutMessage=auxOutMessage@16 @25 -auxSetVolume=auxSetVolume@8 @26 -joyGetDevCapsA=joyGetDevCapsA@12 @28 -joyGetDevCapsW=joyGetDevCapsW@12 @29 -joyGetNumDevs=joyGetNumDevs@0 @30 -joyGetPos=joyGetPos@8 @31 -joyGetPosEx=joyGetPosEx@8 @32 -joyGetThreshold=joyGetThreshold@8 @33 -joyReleaseCapture=joyReleaseCapture@4 @34 -joySetCapture=joySetCapture@16 @35 -joySetThreshold=joySetThreshold@8 @36 -mciDriverNotify=mciDriverNotify@12 @37 -mciDriverYield=mciDriverYield@4 @38 -mciExecute=mciExecute@4 @39 -mciFreeCommandResource=mciFreeCommandResource@4 @40 -mciGetCreatorTask=mciGetCreatorTask@4 @41 -mciGetDeviceIDA=mciGetDeviceIDA@4 @42 -mciGetDeviceIDFromElementIDW=mciGetDeviceIDFromElementIDW@8 @43 -mciGetDeviceIDW=mciGetDeviceIDW@4 @44 -mciGetDriverData=mciGetDriverData@4 @45 -mciGetErrorStringA=mciGetErrorStringA@12 @46 -mciGetErrorStringW=mciGetErrorStringW@12 @47 -mciGetYieldProc=mciGetYieldProc@8 @48 -mciLoadCommandResource=mciLoadCommandResource@12 @49 -mciSendCommandA=mciSendCommandA@16 @50 -mciSendCommandW=mciSendCommandW@16 @51 -mciSendStringA=mciSendStringA@16 @52 -mciSendStringW=mciSendStringW@16 @53 -mciSetDriverData=mciSetDriverData@8 @54 -mciSetYieldProc=mciSetYieldProc@12 @55 -midiInAddBuffer=midiInAddBuffer@12 @58 -midiInClose=midiInClose@4 @59 -midiInGetDevCapsA=midiInGetDevCapsA@12 @60 -midiInGetDevCapsW=midiInGetDevCapsW@12 @61 -midiInGetErrorTextA=midiInGetErrorTextA@12 @62 -midiInGetErrorTextW=midiInGetErrorTextW@12 @63 -midiInGetID=midiInGetID@8 @64 -midiInGetNumDevs=midiInGetNumDevs@0 @65 -midiInMessage=midiInMessage@16 @66 -midiInOpen=midiInOpen@20 @67 -midiInPrepareHeader=midiInPrepareHeader@12 @68 -midiInReset=midiInReset@4 @69 -midiInStart=midiInStart@4 @70 -midiInStop=midiInStop@4 @71 -midiInUnprepareHeader=midiInUnprepareHeader@12 @72 -midiOutCacheDrumPatches=midiOutCacheDrumPatches@16 @73 -midiOutCachePatches=midiOutCachePatches@16 @74 -midiOutClose=midiOutClose@4 @75 -midiOutGetDevCapsA=midiOutGetDevCapsA@12 @76 -midiOutGetDevCapsW=midiOutGetDevCapsW@12 @77 -midiOutGetErrorTextA=midiOutGetErrorTextA@12 @78 -midiOutGetErrorTextW=midiOutGetErrorTextW@12 @79 -midiOutGetID=midiOutGetID@8 @80 -midiOutGetNumDevs=midiOutGetNumDevs@0 @81 -midiOutGetVolume=midiOutGetVolume@8 @82 -midiOutLongMsg=midiOutLongMsg@12 @83 -midiOutMessage=midiOutMessage@16 @84 -midiOutOpen=midiOutOpen@20 @85 -midiOutPrepareHeader=midiOutPrepareHeader@12 @86 -midiOutReset=midiOutReset@4 @87 -midiOutSetVolume=midiOutSetVolume@8 @88 -midiOutShortMsg=midiOutShortMsg@8 @89 -midiOutUnprepareHeader=midiOutUnprepareHeader@12 @90 -midiStreamClose=midiStreamClose@4 @91 -midiStreamOpen=midiStreamOpen@24 @92 -midiStreamOut=midiStreamOut@12 @93 -midiStreamPause=midiStreamPause@4 @94 -midiStreamPosition=midiStreamPosition@12 @95 -midiStreamProperty=midiStreamProperty@12 @96 -midiStreamRestart=midiStreamRestart@4 @97 -midiStreamStop=midiStreamStop@4 @98 -mixerClose=mixerClose@4 @99 -mixerGetControlDetailsA=mixerGetControlDetailsA@12 @100 -mixerGetControlDetailsW=mixerGetControlDetailsW@12 @101 -mixerGetDevCapsA=mixerGetDevCapsA@12 @102 -mixerGetDevCapsW=mixerGetDevCapsW@12 @103 -mixerGetID=mixerGetID@12 @104 -mixerGetLineControlsA=mixerGetLineControlsA@12 @105 -mixerGetLineControlsW=mixerGetLineControlsW@12 @106 -mixerGetLineInfoA=mixerGetLineInfoA@12 @107 -mixerGetLineInfoW=mixerGetLineInfoW@12 @108 -mixerGetNumDevs=mixerGetNumDevs@0 @109 -mixerMessage=mixerMessage@16 @110 -mixerOpen=mixerOpen@20 @111 -mixerSetControlDetails=mixerSetControlDetails@12 @112 -mmioAdvance=mmioAdvance@12 @113 -mmioAscend=mmioAscend@12 @114 -mmioClose=mmioClose@8 @115 -mmioCreateChunk=mmioCreateChunk@12 @116 -mmioDescend=mmioDescend@16 @117 -mmioFlush=mmioFlush@8 @118 -mmioGetInfo=mmioGetInfo@12 @119 -mmioInstallIOProcA=mmioInstallIOProcA@12 @121 -mmioInstallIOProcW=mmioInstallIOProcW@12 @122 -mmioOpenA=mmioOpenA@12 @123 -mmioOpenW=mmioOpenW@12 @124 -mmioRead=mmioRead@12 @125 -mmioRenameA=mmioRenameA@16 @126 -mmioRenameW=mmioRenameW@16 @127 -mmioSeek=mmioSeek@12 @128 -mmioSendMessage=mmioSendMessage@16 @129 -mmioSetBuffer=mmioSetBuffer@16 @130 -mmioSetInfo=mmioSetInfo@12 @131 -mmioStringToFOURCCA=mmioStringToFOURCCA@8 @132 -mmioStringToFOURCCW=mmioStringToFOURCCW@8 @133 -mmioWrite=mmioWrite@12 @134 -mmsystemGetVersion=mmsystemGetVersion@0 @135 -sndPlaySoundA=sndPlaySoundA@8 @136 -sndPlaySoundW=sndPlaySoundW@8 @137 -timeBeginPeriod=timeBeginPeriod@4 @138 -timeEndPeriod=timeEndPeriod@4 @139 -timeGetDevCaps=timeGetDevCaps@8 @140 -timeGetSystemTime=timeGetSystemTime@8 @141 -timeGetTime=timeGetTime@0 @142 -timeKillEvent=timeKillEvent@4 @143 -timeSetEvent=timeSetEvent@20 @144 -waveInAddBuffer=waveInAddBuffer@12 @145 -waveInClose=waveInClose@4 @146 -waveInGetDevCapsA=waveInGetDevCapsA@12 @147 -waveInGetDevCapsW=waveInGetDevCapsW@12 @148 -waveInGetErrorTextA=waveInGetErrorTextA@12 @149 -waveInGetErrorTextW=waveInGetErrorTextW@12 @150 -waveInGetID=waveInGetID@8 @151 -waveInGetNumDevs=waveInGetNumDevs@0 @152 -waveInGetPosition=waveInGetPosition@12 @153 -waveInMessage=waveInMessage@16 @154 -waveInOpen=waveInOpen@24 @155 -waveInPrepareHeader=waveInPrepareHeader@12 @156 -waveInReset=waveInReset@4 @157 -waveInStart=waveInStart@4 @158 -waveInStop=waveInStop@4 @159 -waveInUnprepareHeader=waveInUnprepareHeader@12 @160 -waveOutBreakLoop=waveOutBreakLoop@4 @161 -waveOutClose=waveOutClose@4 @162 -waveOutGetDevCapsA=waveOutGetDevCapsA@12 @163 -waveOutGetDevCapsW=waveOutGetDevCapsW@12 @164 -waveOutGetErrorTextA=waveOutGetErrorTextA@12 @165 -waveOutGetErrorTextW=waveOutGetErrorTextW@12 @166 -waveOutGetID=waveOutGetID@8 @167 -waveOutGetNumDevs=waveOutGetNumDevs@0 @168 -waveOutGetPitch=waveOutGetPitch@8 @169 -waveOutGetPlaybackRate=waveOutGetPlaybackRate@8 @170 -waveOutGetPosition=waveOutGetPosition@12 @171 -waveOutGetVolume=waveOutGetVolume@8 @172 -waveOutMessage=waveOutMessage@16 @173 -waveOutOpen=waveOutOpen@24 @174 -waveOutPause=waveOutPause@4 @175 -waveOutPrepareHeader=waveOutPrepareHeader@12 @176 -waveOutReset=waveOutReset@4 @177 -waveOutRestart=waveOutRestart@4 @178 -waveOutSetPitch=waveOutSetPitch@8 @179 -waveOutSetPlaybackRate=waveOutSetPlaybackRate@8 @180 -waveOutSetVolume=waveOutSetVolume@8 @181 -waveOutUnprepareHeader=waveOutUnprepareHeader@12 @182 -waveOutWrite=waveOutWrite@12 @183 diff --git a/reactos/lib/winmm/winmm.spec b/reactos/lib/winmm/winmm.spec new file mode 100644 index 00000000000..dc13c46b537 --- /dev/null +++ b/reactos/lib/winmm/winmm.spec @@ -0,0 +1,187 @@ +# ordinal exports +1 stdcall @(ptr long long) PlaySoundA +3 stub @ +4 stub @ + +@ stdcall PlaySoundA(ptr long long) +@ stdcall CloseDriver(long long long) +@ stdcall DefDriverProc(long long long long long) +@ stdcall DriverCallback(long long long long long long long) +@ stdcall DrvClose(long long long) CloseDriver +@ stdcall DrvDefDriverProc(long long long long long) DefDriverProc +@ stdcall DrvGetModuleHandle(long) GetDriverModuleHandle +@ stdcall DrvOpen(wstr wstr long) OpenDriverW +@ stdcall DrvOpenA(str str long) OpenDriverA +@ stdcall DrvSendMessage(long long long long) SendDriverMessage +@ stdcall GetDriverFlags(long) +@ stdcall GetDriverModuleHandle(long) +@ stdcall OpenDriver(wstr wstr long) OpenDriverW +@ stdcall OpenDriverA(str str long) +@ stdcall PlaySound(ptr long long) PlaySoundA +@ stdcall PlaySoundW(ptr long long) +@ stdcall SendDriverMessage(long long long long) +@ stdcall auxGetDevCapsA(long ptr long) +@ stdcall auxGetDevCapsW(long ptr long) +@ stdcall auxGetNumDevs() +@ stdcall auxGetVolume(long ptr) +@ stdcall auxOutMessage(long long long long) +@ stdcall auxSetVolume(long long) +@ stub joyConfigChanged +@ stdcall joyGetDevCapsA(long ptr long) +@ stdcall joyGetDevCapsW(long ptr long) +@ stdcall joyGetNumDevs() +@ stdcall joyGetPos(long ptr) +@ stdcall joyGetPosEx(long ptr) +@ stdcall joyGetThreshold(long ptr) +@ stdcall joyReleaseCapture(long) +@ stdcall joySetCapture(long long long long) +@ stdcall joySetThreshold(long long) +@ stdcall mciDriverNotify(long long long) +@ stdcall mciDriverYield(long) +@ stdcall mciExecute(str) +@ stdcall mciFreeCommandResource(long) +@ stdcall mciGetCreatorTask(long) +@ stdcall mciGetDeviceIDA(str) +@ stdcall mciGetDeviceIDFromElementIDW(long str) +@ stdcall mciGetDeviceIDW(str) +@ stdcall mciGetDriverData(long) +@ stdcall mciGetErrorStringA(long ptr long) +@ stdcall mciGetErrorStringW(long ptr long) +@ stdcall mciGetYieldProc(long ptr) +@ stdcall mciLoadCommandResource(long wstr long) +@ stdcall mciSendCommandA(long long long long) +@ stdcall mciSendCommandW(long long long long) +@ stdcall mciSendStringA(str ptr long long) +@ stdcall mciSendStringW(wstr ptr long long) +@ stdcall mciSetDriverData(long long) +@ stdcall mciSetYieldProc(long ptr long) +@ stub midiConnect +@ stub midiDisconnect +@ stdcall midiInAddBuffer(long ptr long) +@ stdcall midiInClose(long) +@ stdcall midiInGetDevCapsA(long ptr long) +@ stdcall midiInGetDevCapsW(long ptr long) +@ stdcall midiInGetErrorTextA(long ptr long) +@ stdcall midiInGetErrorTextW(long ptr long) +@ stdcall midiInGetID(long ptr) +@ stdcall midiInGetNumDevs() +@ stdcall midiInMessage(long long long long) +@ stdcall midiInOpen(ptr long long long long) +@ stdcall midiInPrepareHeader(long ptr long) +@ stdcall midiInReset(long) +@ stdcall midiInStart(long) +@ stdcall midiInStop(long) +@ stdcall midiInUnprepareHeader(long ptr long) +@ stdcall midiOutCacheDrumPatches(long long ptr long) +@ stdcall midiOutCachePatches(long long ptr long) +@ stdcall midiOutClose(long) +@ stdcall midiOutGetDevCapsA(long ptr long) +@ stdcall midiOutGetDevCapsW(long ptr long) +@ stdcall midiOutGetErrorTextA(long ptr long) +@ stdcall midiOutGetErrorTextW(long ptr long) +@ stdcall midiOutGetID(long ptr) +@ stdcall midiOutGetNumDevs() +@ stdcall midiOutGetVolume(long ptr) +@ stdcall midiOutLongMsg(long ptr long) +@ stdcall midiOutMessage(long long long long) +@ stdcall midiOutOpen(ptr long long long long) +@ stdcall midiOutPrepareHeader(long ptr long) +@ stdcall midiOutReset(long) +@ stdcall midiOutSetVolume(long ptr) +@ stdcall midiOutShortMsg(long long) +@ stdcall midiOutUnprepareHeader(long ptr long) +@ stdcall midiStreamClose(long) +@ stdcall midiStreamOpen(ptr ptr long long long long) +@ stdcall midiStreamOut(long ptr long) +@ stdcall midiStreamPause(long) +@ stdcall midiStreamPosition(long ptr long) +@ stdcall midiStreamProperty(long ptr long) +@ stdcall midiStreamRestart(long) +@ stdcall midiStreamStop(long) +@ stdcall mixerClose(long) +@ stdcall mixerGetControlDetailsA(long ptr long) +@ stdcall mixerGetControlDetailsW(long ptr long) +@ stdcall mixerGetDevCapsA(long ptr long) +@ stdcall mixerGetDevCapsW(long ptr long) +@ stdcall mixerGetID(long ptr long) +@ stdcall mixerGetLineControlsA(long ptr long) +@ stdcall mixerGetLineControlsW(long ptr long) +@ stdcall mixerGetLineInfoA(long ptr long) +@ stdcall mixerGetLineInfoW(long ptr long) +@ stdcall mixerGetNumDevs() +@ stdcall mixerMessage(long long long long) +@ stdcall mixerOpen(ptr long long long long) +@ stdcall mixerSetControlDetails(long ptr long) +@ stdcall mmioAdvance(long ptr long) +@ stdcall mmioAscend(long ptr long) +@ stdcall mmioClose(long long) +@ stdcall mmioCreateChunk(long ptr long) +@ stdcall mmioDescend(long ptr ptr long) +@ stdcall mmioFlush(long long) +@ stdcall mmioGetInfo(long ptr long) +@ stub mmioInstallIOProc16 +@ stdcall mmioInstallIOProcA(long ptr long) +@ stdcall mmioInstallIOProcW(long ptr long) +@ stdcall mmioOpenA(str ptr long) +@ stdcall mmioOpenW(wstr ptr long) +@ stdcall mmioRead(long ptr long) +@ stdcall mmioRenameA(str str ptr long) +@ stdcall mmioRenameW(wstr wstr ptr long) +@ stdcall mmioSeek(long long long) +@ stdcall mmioSendMessage(long long long long) +@ stdcall mmioSetBuffer(long ptr long long) +@ stdcall mmioSetInfo(long ptr long) +@ stdcall mmioStringToFOURCCA(str long) +@ stdcall mmioStringToFOURCCW(wstr long) +@ stdcall mmioWrite(long ptr long) +@ stdcall mmsystemGetVersion() +@ stdcall sndPlaySoundA(ptr long) +@ stdcall sndPlaySoundW(ptr long) +@ stdcall timeBeginPeriod(long) +@ stdcall timeEndPeriod(long) +@ stdcall timeGetDevCaps(ptr long) +@ stdcall timeGetSystemTime(ptr long) +@ stdcall timeGetTime() +@ stdcall timeKillEvent(long) +@ stdcall timeSetEvent(long long ptr long long) +@ stdcall waveInAddBuffer(long ptr long) +@ stdcall waveInClose(long) +@ stdcall waveInGetDevCapsA(long ptr long) +@ stdcall waveInGetDevCapsW(long ptr long) +@ stdcall waveInGetErrorTextA(long ptr long) +@ stdcall waveInGetErrorTextW(long ptr long) +@ stdcall waveInGetID(long ptr) +@ stdcall waveInGetNumDevs() +@ stdcall waveInGetPosition(long ptr long) +@ stdcall waveInMessage(long long long long) +@ stdcall waveInOpen(ptr long ptr long long long) +@ stdcall waveInPrepareHeader(long ptr long) +@ stdcall waveInReset(long) +@ stdcall waveInStart(long) +@ stdcall waveInStop(long) +@ stdcall waveInUnprepareHeader(long ptr long) +@ stdcall waveOutBreakLoop(long) +@ stdcall waveOutClose(long) +@ stdcall waveOutGetDevCapsA(long ptr long) +@ stdcall waveOutGetDevCapsW(long ptr long) +@ stdcall waveOutGetErrorTextA(long ptr long) +@ stdcall waveOutGetErrorTextW(long ptr long) +@ stdcall waveOutGetID(long ptr) +@ stdcall waveOutGetNumDevs() +@ stdcall waveOutGetPitch(long ptr) +@ stdcall waveOutGetPlaybackRate(long ptr) +@ stdcall waveOutGetPosition(long ptr long) +@ stdcall waveOutGetVolume(long ptr) +@ stdcall waveOutMessage(long long long long) +@ stdcall waveOutOpen(ptr long ptr long long long) +@ stdcall waveOutPause(long) +@ stdcall waveOutPrepareHeader(long ptr long) +@ stdcall waveOutReset(long) +@ stdcall waveOutRestart(long) +@ stdcall waveOutSetPitch(long long) +@ stdcall waveOutSetPlaybackRate(long long) +@ stdcall waveOutSetVolume(long long) +@ stdcall waveOutUnprepareHeader(long ptr long) +@ stdcall waveOutWrite(long ptr long) +@ stub winmmf_ThunkData32 +@ stub winmmsl_ThunkData32 From 5eea69af208a40c3570343f4b2e0a927b33037b2 Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Wed, 25 Feb 2004 20:06:40 +0000 Subject: [PATCH 0183/1463] Removed stubs in icmp, iphlpv6. These are documented as being linked from iphlpapi.lib, but I made the incorrect assumption that this meant that they came from iphlpapi.dll svn path=/trunk/; revision=8377 --- reactos/lib/iphlpapi/Makefile.in | 2 - reactos/lib/iphlpapi/icmp.c | 126 --------------------------- reactos/lib/iphlpapi/icmp_reactos.c | 127 ---------------------------- reactos/lib/iphlpapi/iphlpapi.spec | 10 +-- reactos/lib/iphlpapi/iphlpv6.c | 100 ---------------------- 5 files changed, 5 insertions(+), 360 deletions(-) delete mode 100644 reactos/lib/iphlpapi/icmp.c delete mode 100644 reactos/lib/iphlpapi/icmp_reactos.c delete mode 100644 reactos/lib/iphlpapi/iphlpv6.c diff --git a/reactos/lib/iphlpapi/Makefile.in b/reactos/lib/iphlpapi/Makefile.in index 3e256027c4b..b15c34dc328 100644 --- a/reactos/lib/iphlpapi/Makefile.in +++ b/reactos/lib/iphlpapi/Makefile.in @@ -9,11 +9,9 @@ DELAYIMPORTS = EXTRALIBS = C_SRCS = \ - icmp_reactos.c \ ifenum_reactos.c \ ipstats_reactos.c \ iphlpapi_main.c \ - iphlpv6_reactos.c \ media.c \ registry.c \ resinfo_reactos.c \ diff --git a/reactos/lib/iphlpapi/icmp.c b/reactos/lib/iphlpapi/icmp.c deleted file mode 100644 index cd404213c61..00000000000 --- a/reactos/lib/iphlpapi/icmp.c +++ /dev/null @@ -1,126 +0,0 @@ -/* - * iphlpapi dll implementation -- Auxiliary icmp functions - * - * These are stubs for functions that provide a simple ICMP probing API. They - * will be operating system specific when implemented. - * - * Copyright (C) 2004 Art Yerkes - * 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 "config.h" -#include "iphlpapi_private.h" - -#include <stdarg.h> -#include <stdlib.h> -#include <sys/types.h> -#ifdef HAVE_NETINET_IN_H -# include <netinet/in.h> -#endif -#ifdef HAVE_ARPA_INET_H -# include <arpa/inet.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -# include <arpa/nameser.h> -#endif -#ifdef HAVE_RESOLV_H -# include <resolv.h> -#endif - -#include "windef.h" -#include "winbase.h" -#include "winreg.h" -#include "resinfo.h" -#include "iphlpapi.h" -#include "wine/debug.h" - -WINE_DEFAULT_DEBUG_CHANNEL(iphlpapi); - -/* - * @unimplemented - */ -DWORD -WINAPI -IcmpParseReplies( - LPVOID ReplyBuffer, - DWORD ReplySize - ) -{ - FIXME(":stub\n"); - return 0L; -} - -/* - * @unimplemented - */ -HANDLE WINAPI IcmpCreateFile( - VOID - ) -{ - FIXME(":stub\n"); - return 0L; -} - -/* - * @unimplemented - */ -BOOL WINAPI IcmpCloseHandle( - HANDLE IcmpHandle - ) -{ - FIXME(":stub\n"); - return 0L; -} - -/* - * @unimplemented - */ -DWORD WINAPI IcmpSendEcho( - HANDLE IcmpHandle, - IPAddr DestinationAddress, - LPVOID RequestData, - WORD RequestSize, - PIP_OPTION_INFORMATION RequestOptions, - LPVOID ReplyBuffer, - DWORD ReplySize, - DWORD Timeout - ) -{ - FIXME(":stub\n"); - return 0L; -} - -/* - * @unimplemented - */ -DWORD -WINAPI -IcmpSendEcho2( - HANDLE IcmpHandle, - HANDLE Event, - FARPROC ApcRoutine, - PVOID ApcContext, - IPAddr DestinationAddress, - LPVOID RequestData, - WORD RequestSize, - PIP_OPTION_INFORMATION RequestOptions, - LPVOID ReplyBuffer, - DWORD ReplySize, - DWORD Timeout - ) -{ - FIXME(":stub\n"); - return 0L; -} diff --git a/reactos/lib/iphlpapi/icmp_reactos.c b/reactos/lib/iphlpapi/icmp_reactos.c deleted file mode 100644 index 8d59ac26cda..00000000000 --- a/reactos/lib/iphlpapi/icmp_reactos.c +++ /dev/null @@ -1,127 +0,0 @@ -/* - * iphlpapi dll implementation -- Auxiliary ICMP functions. - * - * These are stubs for functions that set routing information on the target - * operating system. They are grouped here because their implementation will - * vary widely by operating system. - * - * Copyright (C) 2004 Art Yerkes - * 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 "config.h" -#include "iphlpapi_private.h" - -#include <stdarg.h> -#include <stdlib.h> -#include <sys/types.h> -#ifdef HAVE_NETINET_IN_H -# include <netinet/in.h> -#endif -#ifdef HAVE_ARPA_INET_H -# include <arpa/inet.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -# include <arpa/nameser.h> -#endif -#ifdef HAVE_RESOLV_H -# include <resolv.h> -#endif - -#include "windef.h" -#include "winbase.h" -#include "winreg.h" -#include "resinfo.h" -#include "iphlpapi.h" -#include "wine/debug.h" - -WINE_DEFAULT_DEBUG_CHANNEL(iphlpapi); - -/* - * @unimplemented - */ -DWORD -STDCALL -IcmpParseReplies( - LPVOID ReplyBuffer, - DWORD ReplySize - ) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -HANDLE STDCALL IcmpCreateFile( - VOID - ) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -BOOL STDCALL IcmpCloseHandle( - HANDLE IcmpHandle - ) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD STDCALL IcmpSendEcho( - HANDLE IcmpHandle, - IPAddr DestinationAddress, - LPVOID RequestData, - WORD RequestSize, - PIP_OPTION_INFORMATION RequestOptions, - LPVOID ReplyBuffer, - DWORD ReplySize, - DWORD Timeout - ) -{ - UNIMPLEMENTED - return 0L; -} - -/* - * @unimplemented - */ -DWORD -STDCALL -IcmpSendEcho2( - HANDLE IcmpHandle, - HANDLE Event, - FARPROC ApcRoutine, - PVOID ApcContext, - IPAddr DestinationAddress, - LPVOID RequestData, - WORD RequestSize, - PIP_OPTION_INFORMATION RequestOptions, - LPVOID ReplyBuffer, - DWORD ReplySize, - DWORD Timeout - ) -{ - UNIMPLEMENTED - return 0L; -} diff --git a/reactos/lib/iphlpapi/iphlpapi.spec b/reactos/lib/iphlpapi/iphlpapi.spec index a9797ac6689..7f74ec3a850 100644 --- a/reactos/lib/iphlpapi/iphlpapi.spec +++ b/reactos/lib/iphlpapi/iphlpapi.spec @@ -1,4 +1,4 @@ -@ stdcall AddIPAddress( long long long ptr ptr ) + 1 stdcall AddIPAddress( long long long ptr ptr ) @ stub AllocateAndGetArpEntTableFromStack @ stdcall AllocateAndGetIfTableFromStack( ptr long long long ) @ stdcall AllocateAndGetIpAddrTableFromStack( ptr long long long ) @@ -96,7 +96,6 @@ @ stub _PfSetLogBuffer@28 @ stub _PfTestPacket@20 @ stub _PfUnBindInterface@4 -@ stdcall SendARP( long long ptr ptr ) @ stub SetAdapterIpAddress @ stub SetBlockRoutes @ stdcall SetIfEntry( ptr ) @@ -107,11 +106,12 @@ @ stdcall SetIpNetEntry( ptr ) @ stub SetIpNetEntryToStack @ stub SetIpRouteEntryToStack -@ stdcall SetIpStatistics( ptr ) +110 stdcall SetIpStatistics( ptr ) @ stub SetIpStatsToStack -@ stdcall SetIpTTL( long ) +112 stdcall SetIpTTL( long ) @ stub SetProxyArpEntryToStack @ stub SetRouteWithRef @ stdcall SetTcpEntry( ptr ) @ stub SetTcpEntryToStack -@ stdcall UnenableRouter( ptr ptr ) + 99 stdcall SendARP( long long ptr ptr ) +117 stdcall UnenableRouter( ptr ptr ) diff --git a/reactos/lib/iphlpapi/iphlpv6.c b/reactos/lib/iphlpapi/iphlpv6.c deleted file mode 100644 index f624bf8678d..00000000000 --- a/reactos/lib/iphlpapi/iphlpv6.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - * iphlpapi dll implementation -- Auxiliary IPv6 stubs - * - * These are stubs for functions that provide and set IPv6 information on the - * target operating system. They are grouped here because their - * implementation will vary widely by operating system. - * - * Copyright (C) 2004 Art Yerkes - * 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 "config.h" -#include "iphlpapi_private.h" - -#include <stdarg.h> -#include <stdlib.h> -#include <sys/types.h> -#ifdef HAVE_NETINET_IN_H -# include <netinet/in.h> -#endif -#ifdef HAVE_ARPA_INET_H -# include <arpa/inet.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -# include <arpa/nameser.h> -#endif -#ifdef HAVE_RESOLV_H -# include <resolv.h> -#endif - -#include "windef.h" -#include "winbase.h" -#include "winreg.h" -#include "resinfo.h" -#include "iphlpapi.h" -#include "wine/debug.h" - -WINE_DEFAULT_DEBUG_CHANNEL(iphlpapi); - -/* - * @unimplemented - */ -HANDLE WINAPI Icmp6CreateFile( - VOID - ) -{ - FIXME(":stub\n"); - return 0L; -} - -/* - * @unimplemented - */ -DWORD -WINAPI -Icmp6SendEcho2( - HANDLE IcmpHandle, - HANDLE Event, - FARPROC ApcRoutine, - PVOID ApcContext, - struct sockaddr_in6 *SourceAddress, - struct sockaddr_in6 *DestinationAddress, - LPVOID RequestData, - WORD RequestSize, - PIP_OPTION_INFORMATION RequestOptions, - LPVOID ReplyBuffer, - DWORD ReplySize, - DWORD Timeout - ) -{ - FIXME(":stub\n"); - return 0L; -} - -/* - * @unimplemented - */ -DWORD -WINAPI -Icmp6ParseReplies( - LPVOID ReplyBuffer, - DWORD ReplySize - ) -{ - FIXME(":stub\n"); - return 0L; -} - From 07405fb46496445ff2173d4b4834e037de6db6ae Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Wed, 25 Feb 2004 20:09:39 +0000 Subject: [PATCH 0184/1463] Added a stub odbc32.dll as MFC depends on it. svn path=/trunk/; revision=8378 --- reactos/lib/odbc32/.cvsignore | 9 + reactos/lib/odbc32/Makefile.in | 13 + reactos/lib/odbc32/Makefile.ros | 21 + reactos/lib/odbc32/Makefile.ros-template | 21 + reactos/lib/odbc32/README.txt | 3 + reactos/lib/odbc32/makefile | 9 + reactos/lib/odbc32/odbc32.rc | 38 + reactos/lib/odbc32/odbc32.spec | 176 +++ reactos/lib/odbc32/proxyodbc.c | 1803 ++++++++++++++++++++++ reactos/lib/odbc32/proxyodbc.h | 131 ++ 10 files changed, 2224 insertions(+) create mode 100644 reactos/lib/odbc32/.cvsignore create mode 100644 reactos/lib/odbc32/Makefile.in create mode 100644 reactos/lib/odbc32/Makefile.ros create mode 100644 reactos/lib/odbc32/Makefile.ros-template create mode 100644 reactos/lib/odbc32/README.txt create mode 100644 reactos/lib/odbc32/makefile create mode 100644 reactos/lib/odbc32/odbc32.rc create mode 100644 reactos/lib/odbc32/odbc32.spec create mode 100644 reactos/lib/odbc32/proxyodbc.c create mode 100644 reactos/lib/odbc32/proxyodbc.h diff --git a/reactos/lib/odbc32/.cvsignore b/reactos/lib/odbc32/.cvsignore new file mode 100644 index 00000000000..d5bf780c608 --- /dev/null +++ b/reactos/lib/odbc32/.cvsignore @@ -0,0 +1,9 @@ +odbc32.dll.dbg.c +odbc32.spec.c +odbc32.spec.def +*.dll +*.o +*.sym +*.map +*.d +*.coff \ No newline at end of file diff --git a/reactos/lib/odbc32/Makefile.in b/reactos/lib/odbc32/Makefile.in new file mode 100644 index 00000000000..e912920e673 --- /dev/null +++ b/reactos/lib/odbc32/Makefile.in @@ -0,0 +1,13 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = odbc32.dll +IMPORTS = kernel32 + +C_SRCS = \ + proxyodbc.c + +@MAKE_DLL_RULES@ + +### Dependencies: diff --git a/reactos/lib/odbc32/Makefile.ros b/reactos/lib/odbc32/Makefile.ros new file mode 100644 index 00000000000..ba9d8d30902 --- /dev/null +++ b/reactos/lib/odbc32/Makefile.ros @@ -0,0 +1,21 @@ +# $Id: Makefile.ros,v 1.1 2004/02/25 20:09:39 sedwards Exp $ + +TARGET_NAME = odbc32 + +TARGET_OBJECTS = proxyodbc.o + +TARGET_CFLAGS = -D__REACTOS__ -D__WINESRC__ + +TARGET_SDKLIBS = kernel32.a libwine.a ntdll.a + +TARGET_BASE = 0x76660000 + +TARGET_RC_SRCS = +TARGET_RC_BINSRC = +TARGET_RC_BINARIES = + +default: all + +DEP_OBJECTS = $(TARGET_OBJECTS) + +include $(TOOLS_PATH)/depend.mk diff --git a/reactos/lib/odbc32/Makefile.ros-template b/reactos/lib/odbc32/Makefile.ros-template new file mode 100644 index 00000000000..3558498f02f --- /dev/null +++ b/reactos/lib/odbc32/Makefile.ros-template @@ -0,0 +1,21 @@ +# $Id: Makefile.ros-template,v 1.1 2004/02/25 20:09:39 sedwards Exp $ + +TARGET_NAME = odbc32 + +TARGET_OBJECTS = @C_SRCS@ + +TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ -D__WINESRC__ + +TARGET_SDKLIBS = @IMPORTS@ libwine.a ntdll.a + +TARGET_BASE = 0x76660000 + +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/odbc32/README.txt b/reactos/lib/odbc32/README.txt new file mode 100644 index 00000000000..8c6b0790e20 --- /dev/null +++ b/reactos/lib/odbc32/README.txt @@ -0,0 +1,3 @@ +This stub odbc32.dll is based on the WINE odbc32 implementation except ours doesnt work. +Someone will need to import Unix-ODBC in to ReactOS CVS and merge it with this implemenation. +I only created this because MFC depends on odbc32.dll \ No newline at end of file diff --git a/reactos/lib/odbc32/makefile b/reactos/lib/odbc32/makefile new file mode 100644 index 00000000000..f88ea72f920 --- /dev/null +++ b/reactos/lib/odbc32/makefile @@ -0,0 +1,9 @@ +# $Id: makefile,v 1.1 2004/02/25 20:09:39 sedwards Exp $ + +PATH_TO_TOP = ../.. + +TARGET_TYPE = winedll + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk diff --git a/reactos/lib/odbc32/odbc32.rc b/reactos/lib/odbc32/odbc32.rc new file mode 100644 index 00000000000..e218c3c1910 --- /dev/null +++ b/reactos/lib/odbc32/odbc32.rc @@ -0,0 +1,38 @@ +#include <defines.h> +#include <reactos/resource.h> + +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", "WINE IMM32 API Client DLL\0" + VALUE "FileVersion", RES_STR_FILE_VERSION + VALUE "InternalName", "imm32\0" + VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT + VALUE "OriginalFilename", "imm32.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/odbc32/odbc32.spec b/reactos/lib/odbc32/odbc32.spec new file mode 100644 index 00000000000..8c5ac336b56 --- /dev/null +++ b/reactos/lib/odbc32/odbc32.spec @@ -0,0 +1,176 @@ + 1 stdcall SQLAllocConnect(long ptr) + 2 stdcall SQLAllocEnv(ptr) + 3 stdcall SQLAllocStmt(long ptr) + 4 stdcall SQLBindCol(long long long ptr long ptr) + 5 stdcall SQLCancel(long) + 6 stdcall SQLColAttributes(long long long ptr long ptr ptr) + 7 stdcall SQLConnect(long str long str long str long) + 8 stdcall SQLDescribeCol(long long str long ptr ptr ptr ptr ptr) + 9 stdcall SQLDisconnect(long) + 10 stdcall SQLError(long long long str ptr str long ptr) + 11 stdcall SQLExecDirect(long str long) + 12 stdcall SQLExecute(long) + 13 stdcall SQLFetch(long) + 14 stdcall SQLFreeConnect(long) + 15 stdcall SQLFreeEnv(long) + 16 stdcall SQLFreeStmt(long long ) + 17 stdcall SQLGetCursorName(long str long ptr) + 18 stdcall SQLNumResultCols(long ptr) + 19 stdcall SQLPrepare(long str long) + 20 stdcall SQLRowCount(long ptr) + 21 stdcall SQLSetCursorName(long str long) + 22 stdcall SQLSetParam(long long long long long long ptr ptr) + 23 stdcall SQLTransact(long long long) + 24 stdcall SQLAllocHandle(long long ptr) + 25 stdcall SQLBindParam(long long long long long long ptr ptr) + 26 stdcall SQLCloseCursor(long) + 27 stdcall SQLColAttribute(long long long ptr long ptr ptr) + 28 stdcall SQLCopyDesc(long long) + 29 stdcall SQLEndTran(long long long) + 30 stdcall SQLFetchScroll(long long long) + 31 stdcall SQLFreeHandle(long long) + 32 stdcall SQLGetConnectAttr(long long ptr long ptr) + 33 stdcall SQLGetDescField(long long long ptr long ptr) + 34 stdcall SQLGetDescRec(long long str long ptr ptr ptr ptr ptr ptr ptr) + 35 stdcall SQLGetDiagField(long long long long ptr long ptr) + 36 stdcall SQLGetDiagRec(long long long str ptr str long ptr) + 37 stdcall SQLGetEnvAttr(long long ptr long ptr) + 38 stdcall SQLGetStmtAttr(long long ptr long ptr) + 39 stdcall SQLSetConnectAttr(long long ptr long) + 40 stdcall SQLColumns(long str long str long str long str long) + 41 stdcall SQLDriverConnect(long long str long str long str long) + 42 stdcall SQLGetConnectOption(long long ptr) + 43 stdcall SQLGetData(long long long ptr long ptr) + 44 stdcall SQLGetFunctions(long long ptr) + 45 stdcall SQLGetInfo(long long ptr long ptr) + 46 stdcall SQLGetStmtOption(long long ptr) + 47 stdcall SQLGetTypeInfo(long long) + 48 stdcall SQLParamData(long ptr) + 49 stdcall SQLPutData(long ptr long) + 50 stdcall SQLSetConnectOption(long long long) + 51 stdcall SQLSetStmtOption(long long long) + 52 stdcall SQLSpecialColumns(long long str long str long str long long long) + 53 stdcall SQLStatistics(long str long str long str long long long) + 54 stdcall SQLTables(long str long str long str long str long) + 55 stdcall SQLBrowseConnect(long str long str long ptr) + 56 stdcall SQLColumnPrivileges(long str long str long str long str long) + 57 stdcall SQLDataSources(long long str long ptr str long ptr) + 58 stdcall SQLDescribeParam(long long ptr ptr ptr ptr) + 59 stdcall SQLExtendedFetch(long long long ptr ptr) + 60 stdcall SQLForeignKeys(long str long str long str long str long str long str long) + 61 stdcall SQLMoreResults(long) + 62 stdcall SQLNativeSql(long str long str long ptr) + 63 stdcall SQLNumParams(long ptr) + 64 stdcall SQLParamOptions(long long ptr) + 65 stdcall SQLPrimaryKeys(long str long str long str long) + 66 stdcall SQLProcedureColumns(long str long str long str long str long) + 67 stdcall SQLProcedures(long str long str long str long) + 68 stdcall SQLSetPos(long long long long) + 69 stdcall SQLSetScrollOptions(long long long long) + 70 stdcall SQLTablePrivileges(long str long str long str long) + 71 stdcall SQLDrivers(long long str long ptr str long ptr) + 72 stdcall SQLBindParameter(long long long long long long long ptr long ptr) + 73 stdcall SQLSetDescField(long long long ptr long) + 74 stdcall SQLSetDescRec(long long long long long long long ptr ptr ptr) + 75 stdcall SQLSetEnvAttr(long long ptr long) + 76 stdcall SQLSetStmtAttr(long long ptr long) + 77 stdcall SQLAllocHandleStd(long long ptr) + 78 stdcall SQLBulkOperations(long long) + 79 stub CloseODBCPerfData + 80 stub CollectODBCPerfData + 81 stub CursorLibLockDbc + 82 stub CursorLibLockDesc + 83 stub CursorLibLockStmt + 84 stub ODBCGetTryWaitValue + 85 stub CursorLibTransact + 86 stub ODBSetTryWaitValue + 89 stub ODBCSharedPerfMon + 90 stub ODBCSharedVSFlag +106 stub SQLColAttributesW +107 stub SQLConnectW +108 stub SQLDescribeColW +110 stub SQLErrorW +111 stub SQLExecDirectW +117 stub SQLGetCursorNameW +119 stub SQLPrepareW +121 stub SQLSetCursorNameW +127 stub SQLColAttributeW +132 stub SQLGetConnectAttrW +133 stub SQLGetDescFieldW +134 stub SQLGetDescRecW +135 stub SQLGetDiagFieldW +136 stub SQLGetDiagRecW +138 stub SQLGetStmtAttrW +139 stub SQLSetConnectAttrW +140 stub SQLColumnsW +141 stub SQLDriverConnectW +142 stub SQLGetConnectOptionW +145 stub SQLGetInfoW +147 stub SQLGetTypeInfoW +150 stub SQLSetConnectOptionW +152 stub SQLSpecialColumnsW +153 stub SQLStatisticsW +154 stub SQLTablesW +155 stub SQLBrowseConnectW +156 stub SQLColumnPrivilegesW +157 stub SQLDataSourcesW +160 stub SQLForeignKeysW +162 stub SQLNativeSqlW +165 stub SQLPrimaryKeysW +166 stub SQLProcedureColumnsW +167 stub SQLProceduresW +170 stub SQLTablePrivilegesW +171 stub SQLDriversW +173 stub SQLSetDescFieldW +176 stub SQLSetStmtAttrW +206 stub SQLColAttributesA +207 stub SQLConnectA +208 stub SQLDescribeColA +210 stub SQLErrorA +211 stub SQLExecDirectA +217 stub SQLGetCursorNameA +219 stub SQLPrepareA +221 stub SQLSetCursorNameA +227 stub SQLColAttributeA +232 stub SQLGetConnectAttrA +233 stub SQLGetDescFieldA +234 stub SQLGetDescRecA +235 stub SQLGetDiagFieldA +236 stub SQLGetDiagRecA +238 stub SQLGetStmtAttrA +239 stub SQLSetConnectAttrA +240 stub SQLColumnsA +241 stub SQLDriverConnectA +242 stub SQLGetConnectOptionA +245 stub SQLGetInfoA +247 stub SQLGetTypeInfoA +250 stub SQLSetConnectOptionA +252 stub SQLSpecialColumnsA +253 stub SQLStatisticsA +254 stub SQLTablesA +255 stub SQLBrowseConnectA +256 stub SQLColumnPrivilegesA +257 stub SQLDataSourcesA +260 stub SQLForeignKeysA +262 stub SQLNativeSqlA +265 stub SQLPrimaryKeysA +266 stub SQLProcedureColumnsA +267 stub SQLProceduresA +270 stub SQLTablePrivilegesA +271 stub SQLDriversA +273 stub SQLSetDescFieldA +276 stub SQLSetStmtAttrA +300 stub ODBCSharedTraceFlag +301 stub ODBCQualifyFileDSNW + + + @ stub LockHandle + @ stub ODBCInternalConnectW + @ stub OpenODBCPerfData + @ stub PostComponentError + @ stub PostODBCComponentError + @ stub PostODBCError + @ stub SearchStatusCode + @ stub VFreeErrors + @ stub VRetrieveDriverErrorsRowCol + @ stub ValidateErrorQueue diff --git a/reactos/lib/odbc32/proxyodbc.c b/reactos/lib/odbc32/proxyodbc.c new file mode 100644 index 00000000000..a5f44f75dd7 --- /dev/null +++ b/reactos/lib/odbc32/proxyodbc.c @@ -0,0 +1,1803 @@ +/* + * Win32 ODBC functions + * + * Copyright 1999 Xiang Li, Corel Corporation + * + * 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 + * + * NOTES: + * Proxy ODBC driver manager. This manager delegates all ODBC + * calls to a real ODBC driver manager named by the environment + * variable LIB_ODBC_DRIVER_MANAGER, or to libodbc.so if the + * variable is not set. + * + */ + +#include "config.h" +#include "wine/port.h" + +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <assert.h> + +#include "windef.h" +#include "winbase.h" +#include "wine/debug.h" +//#include "wine/library.h" + +#include "sql.h" +#include "sqltypes.h" +#include "sqlext.h" + +#include "proxyodbc.h" + +static BOOL ODBC_LoadDriverManager(void); +static BOOL ODBC_LoadDMFunctions(void); + +WINE_DEFAULT_DEBUG_CHANNEL(odbc); + +static const DM_FUNC template_func[] = +{ + /* 00 */ { SQL_API_SQLALLOCCONNECT, "SQLAllocConnect", SQLAllocConnect, NULL }, + /* 01 */ { SQL_API_SQLALLOCENV, "SQLAllocEnv", SQLAllocEnv, NULL }, + /* 02 */ { SQL_API_SQLALLOCHANDLE, "SQLAllocHandle", SQLAllocHandle, NULL }, + /* 03 */ { SQL_API_SQLALLOCSTMT, "SQLAllocStmt", SQLAllocStmt, NULL }, + /* 04 */ { SQL_API_SQLALLOCHANDLESTD, "SQLAllocHandleStd", SQLAllocHandleStd, NULL }, + /* 05 */ { SQL_API_SQLBINDCOL, "SQLBindCol", SQLBindCol, NULL }, + /* 06 */ { SQL_API_SQLBINDPARAM, "SQLBindParam", SQLBindParam, NULL }, + /* 07 */ { SQL_API_SQLBINDPARAMETER, "SQLBindParameter", SQLBindParameter, NULL }, + /* 08 */ { SQL_API_SQLBROWSECONNECT, "SQLBrowseConnect", SQLBrowseConnect, NULL }, + /* 09 */ { SQL_API_SQLBULKOPERATIONS, "SQLBulkOperations", SQLBulkOperations, NULL }, + /* 10 */ { SQL_API_SQLCANCEL, "SQLCancel", SQLCancel, NULL }, + /* 11 */ { SQL_API_SQLCLOSECURSOR, "SQLCloseCursor", SQLCloseCursor, NULL }, + /* 12 */ { SQL_API_SQLCOLATTRIBUTE, "SQLColAttribute", SQLColAttribute, NULL }, + /* 13 */ { SQL_API_SQLCOLATTRIBUTES, "SQLColAttributes", SQLColAttributes, NULL }, + /* 14 */ { SQL_API_SQLCOLUMNPRIVILEGES, "SQLColumnPrivileges", SQLColumnPrivileges, NULL }, + /* 15 */ { SQL_API_SQLCOLUMNS, "SQLColumns", SQLColumns, NULL }, + /* 16 */ { SQL_API_SQLCONNECT, "SQLConnect", SQLConnect, NULL }, + /* 17 */ { SQL_API_SQLCOPYDESC, "SQLCopyDesc", SQLCopyDesc, NULL }, + /* 18 */ { SQL_API_SQLDATASOURCES, "SQLDataSources", SQLDataSources, NULL }, + /* 19 */ { SQL_API_SQLDESCRIBECOL, "SQLDescribeCol", SQLDescribeCol, NULL }, + /* 20 */ { SQL_API_SQLDESCRIBEPARAM, "SQLDescribeParam", SQLDescribeParam, NULL }, + /* 21 */ { SQL_API_SQLDISCONNECT, "SQLDisconnect", SQLDisconnect, NULL }, + /* 22 */ { SQL_API_SQLDRIVERCONNECT, "SQLDriverConnect", SQLDriverConnect, NULL }, + /* 23 */ { SQL_API_SQLDRIVERS, "SQLDrivers", SQLDrivers, NULL }, + /* 24 */ { SQL_API_SQLENDTRAN, "SQLEndTran", SQLEndTran, NULL }, + /* 25 */ { SQL_API_SQLERROR, "SQLError", SQLError, NULL }, + /* 26 */ { SQL_API_SQLEXECDIRECT, "SQLExecDirect", SQLExecDirect, NULL }, + /* 27 */ { SQL_API_SQLEXECUTE, "SQLExecute", SQLExecute, NULL }, + /* 28 */ { SQL_API_SQLEXTENDEDFETCH, "SQLExtendedFetch", SQLExtendedFetch, NULL }, + /* 29 */ { SQL_API_SQLFETCH, "SQLFetch", SQLFetch, NULL }, + /* 30 */ { SQL_API_SQLFETCHSCROLL, "SQLFetchScroll", SQLFetchScroll, NULL }, + /* 31 */ { SQL_API_SQLFOREIGNKEYS, "SQLForeignKeys", SQLForeignKeys, NULL }, + /* 32 */ { SQL_API_SQLFREEENV, "SQLFreeEnv", SQLFreeEnv, NULL }, + /* 33 */ { SQL_API_SQLFREEHANDLE, "SQLFreeHandle", SQLFreeHandle, NULL }, + /* 34 */ { SQL_API_SQLFREESTMT, "SQLFreeStmt", SQLFreeStmt, NULL }, + /* 35 */ { SQL_API_SQLFREECONNECT, "SQLFreeConnect", SQLFreeConnect, NULL }, + /* 36 */ { SQL_API_SQLGETCONNECTATTR, "SQLGetConnectAttr", SQLGetConnectAttr, NULL }, + /* 37 */ { SQL_API_SQLGETCONNECTOPTION, "SQLGetConnectOption", SQLGetConnectOption, NULL }, + /* 38 */ { SQL_API_SQLGETCURSORNAME, "SQLGetCursorName", SQLGetCursorName, NULL }, + /* 39 */ { SQL_API_SQLGETDATA, "SQLGetData", SQLGetData, NULL }, + /* 40 */ { SQL_API_SQLGETDESCFIELD, "SQLGetDescField", SQLGetDescField, NULL }, + /* 41 */ { SQL_API_SQLGETDESCREC, "SQLGetDescRec", SQLGetDescRec, NULL }, + /* 42 */ { SQL_API_SQLGETDIAGFIELD, "SQLGetDiagField", SQLGetDiagField, NULL }, + /* 43 */ { SQL_API_SQLGETENVATTR, "SQLGetEnvAttr", SQLGetEnvAttr, NULL }, + /* 44 */ { SQL_API_SQLGETFUNCTIONS, "SQLGetFunctions", SQLGetFunctions, NULL }, + /* 45 */ { SQL_API_SQLGETINFO, "SQLGetInfo", SQLGetInfo, NULL }, + /* 46 */ { SQL_API_SQLGETSTMTATTR, "SQLGetStmtAttr", SQLGetStmtAttr, NULL }, + /* 47 */ { SQL_API_SQLGETSTMTOPTION, "SQLGetStmtOption", SQLGetStmtOption, NULL }, + /* 48 */ { SQL_API_SQLGETTYPEINFO, "SQLGetTypeInfo", SQLGetTypeInfo, NULL }, + /* 49 */ { SQL_API_SQLMORERESULTS, "SQLMoreResults", SQLMoreResults, NULL }, + /* 50 */ { SQL_API_SQLNATIVESQL, "SQLNativeSql", SQLNativeSql, NULL }, + /* 51 */ { SQL_API_SQLNUMPARAMS, "SQLNumParams", SQLNumParams, NULL }, + /* 52 */ { SQL_API_SQLNUMRESULTCOLS, "SQLNumResultCols", SQLNumResultCols, NULL }, + /* 53 */ { SQL_API_SQLPARAMDATA, "SQLParamData", SQLParamData, NULL }, + /* 54 */ { SQL_API_SQLPARAMOPTIONS, "SQLParamOptions", SQLParamOptions, NULL }, + /* 55 */ { SQL_API_SQLPREPARE, "SQLPrepare", SQLPrepare, NULL }, + /* 56 */ { SQL_API_SQLPRIMARYKEYS, "SQLPrimaryKeys", SQLPrimaryKeys, NULL }, + /* 57 */ { SQL_API_SQLPROCEDURECOLUMNS, "SQLProcedureColumns", SQLProcedureColumns, NULL }, + /* 58 */ { SQL_API_SQLPROCEDURES, "SQLProcedures", SQLProcedures, NULL }, + /* 59 */ { SQL_API_SQLPUTDATA, "SQLPutData", SQLPutData, NULL }, + /* 60 */ { SQL_API_SQLROWCOUNT, "SQLRowCount", SQLRowCount, NULL }, + /* 61 */ { SQL_API_SQLSETCONNECTATTR, "SQLSetConnectAttr", SQLSetConnectAttr, NULL }, + /* 62 */ { SQL_API_SQLSETCONNECTOPTION, "SQLSetConnectOption", SQLSetConnectOption, NULL }, + /* 63 */ { SQL_API_SQLSETCURSORNAME, "SQLSetCursorName", SQLSetCursorName, NULL }, + /* 64 */ { SQL_API_SQLSETDESCFIELD, "SQLSetDescField", SQLSetDescField, NULL }, + /* 65 */ { SQL_API_SQLSETDESCREC, "SQLSetDescRec", SQLSetDescRec, NULL }, + /* 66 */ { SQL_API_SQLSETENVATTR, "SQLSetEnvAttr", SQLSetEnvAttr, NULL }, + /* 67 */ { SQL_API_SQLSETPARAM, "SQLSetParam", SQLSetParam, NULL }, + /* 68 */ { SQL_API_SQLSETPOS, "SQLSetPos", SQLSetPos, NULL }, + /* 69 */ { SQL_API_SQLSETSCROLLOPTIONS, "SQLSetScrollOptions", SQLSetScrollOptions, NULL }, + /* 70 */ { SQL_API_SQLSETSTMTATTR, "SQLSetStmtAttr", SQLSetStmtAttr, NULL }, + /* 71 */ { SQL_API_SQLSETSTMTOPTION, "SQLSetStmtOption", SQLSetStmtOption, NULL }, + /* 72 */ { SQL_API_SQLSPECIALCOLUMNS, "SQLSpecialColumns", SQLSpecialColumns, NULL }, + /* 73 */ { SQL_API_SQLSTATISTICS, "SQLStatistics", SQLStatistics, NULL }, + /* 74 */ { SQL_API_SQLTABLEPRIVILEGES, "SQLTablePrivileges", SQLTablePrivileges, NULL }, + /* 75 */ { SQL_API_SQLTABLES, "SQLTables", SQLTables, NULL }, + /* 76 */ { SQL_API_SQLTRANSACT, "SQLTransact", SQLTransact, NULL }, + /* 77 */ { SQL_API_SQLGETDIAGREC, "SQLGetDiagRec", SQLGetDiagRec, NULL }, +}; + +static PROXYHANDLE gProxyHandle; + +/* What is the difference between these two (dmHandle cf READY_AND_dmHandle)? When does one use one and when the other? */ + +#define CHECK_dmHandle() \ +{ \ + if (gProxyHandle.dmHandle == NULL) \ + { \ + TRACE ("Not ready\n"); \ + return SQL_ERROR; \ + } \ +} + +#define CHECK_READY_AND_dmHandle() \ +{ \ + if (!gProxyHandle.bFunctionReady || gProxyHandle.dmHandle == NULL) \ + { \ + TRACE ("Not ready\n"); \ + return SQL_ERROR; \ + } \ +} + +SQLRETURN SQLDummyFunc() +{ + TRACE("SQLDummyFunc: \n"); + return SQL_SUCCESS; +} + +/*********************************************************************** + * DllMain [Internal] Initializes the internal 'ODBC32.DLL'. + * + * PARAMS + * hinstDLL [I] handle to the DLL's instance + * fdwReason [I] + * lpvReserved [I] reserved, must be NULL + * + * RETURNS + * Success: TRUE + * Failure: FALSE + */ + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + int i; + TRACE("Initializing or Finalizing proxy ODBC: %p,%lx,%p\n", hinstDLL, fdwReason, lpvReserved); + + if (fdwReason == DLL_PROCESS_ATTACH) + { + TRACE("Loading ODBC...\n"); + DisableThreadLibraryCalls(hinstDLL); + if (ODBC_LoadDriverManager()) + ODBC_LoadDMFunctions(); + } + else if (fdwReason == DLL_PROCESS_DETACH) + { + TRACE("Unloading ODBC...\n"); + if (gProxyHandle.bFunctionReady) + { + for ( i = 0; i < NUM_SQLFUNC; i ++ ) + { + gProxyHandle.functions[i].func = SQLDummyFunc; + } + } +#ifndef __REACTOS__ + if (gProxyHandle.dmHandle) + { + wine_dlclose(gProxyHandle.dmHandle,NULL,0); + gProxyHandle.dmHandle = NULL; + } +#endif + } + + return TRUE; +} + + +/*********************************************************************** + * ODBC_LoadDriverManager [Internal] Load ODBC library. + * + * PARAMS + * + * RETURNS + * Success: TRUE + * Failure: FALSE + */ + +static BOOL ODBC_LoadDriverManager(void) +{ + const char *s = getenv("LIB_ODBC_DRIVER_MANAGER"); + char error[256]; + + TRACE("\n"); + + gProxyHandle.bFunctionReady = FALSE; + gProxyHandle.nErrorType = ERROR_LIBRARY_NOT_FOUND; + + if (s!= NULL && strlen (s) >= sizeof(gProxyHandle.dmLibName)) + { + ERR("Driver name too long (%s)\n",s); + return FALSE; + } + if (s == NULL || strlen(s) == 0) + s = "libodbc.so"; + strcpy(gProxyHandle.dmLibName, s); +#ifndef __REACTOS__ + gProxyHandle.dmHandle = wine_dlopen(gProxyHandle.dmLibName, RTLD_LAZY, error, sizeof(error)); + + if (gProxyHandle.dmHandle == NULL) /* fail to load unixODBC driver manager */ + { + WARN("failed to open library %s: %s\n", gProxyHandle.dmLibName, error); + gProxyHandle.dmLibName[0] = '\0'; + gProxyHandle.nErrorType = ERROR_LIBRARY_NOT_FOUND; + return FALSE; + } + else + { + gProxyHandle.nErrorType = ERROR_FREE; + return TRUE; + } +#else + return FALSE; +#endif +} + + +/*********************************************************************** + * ODBC_LoadDMFunctions [Internal] Populate function table. + * + * PARAMS + * + * RETURNS + * Success: TRUE + * Failure: FALSE + */ + +static BOOL ODBC_LoadDMFunctions(void) +{ + int i; + char error[256]; + + if (gProxyHandle.dmHandle == NULL) + return FALSE; +#ifndef __REACTOS__ + for ( i = 0; i < NUM_SQLFUNC; i ++ ) + { + gProxyHandle.functions[i] = template_func[i]; + gProxyHandle.functions[i].func = wine_dlsym(gProxyHandle.dmHandle, + gProxyHandle.functions[i].name, error, sizeof(error)); + + if (error[0]) + { + ERR("Failed to load function %s\n",gProxyHandle.functions[i].name); + gProxyHandle.functions[i].func = SQLDummyFunc; + } + } + + gProxyHandle.bFunctionReady = TRUE; +#endif + return TRUE; +} + + +/************************************************************************* + * SQLAllocConnect [ODBC32.001] + */ +SQLRETURN WINAPI SQLAllocConnect(SQLHENV EnvironmentHandle, SQLHDBC *ConnectionHandle) +{ + SQLRETURN ret; + TRACE("Env=%lx\n",EnvironmentHandle); + + if (!gProxyHandle.bFunctionReady || gProxyHandle.dmHandle == NULL) + { + *ConnectionHandle = SQL_NULL_HDBC; + TRACE("Not ready\n"); + return SQL_ERROR; + } + + assert(gProxyHandle.functions[SQLAPI_INDEX_SQLALLOCCONNECT].func); + ret=(gProxyHandle.functions[SQLAPI_INDEX_SQLALLOCCONNECT].func) + (EnvironmentHandle, ConnectionHandle); + TRACE("Returns ret=%d, Handle %lx\n",ret, *ConnectionHandle); + return ret; +} + + +/************************************************************************* + * SQLAllocEnv [ODBC32.002] + */ +SQLRETURN WINAPI SQLAllocEnv(SQLHENV *EnvironmentHandle) +{ + SQLRETURN ret; + TRACE("\n"); + + if (!gProxyHandle.bFunctionReady || gProxyHandle.dmHandle == NULL) + { + *EnvironmentHandle = SQL_NULL_HENV; + TRACE("Not ready\n"); + return SQL_ERROR; + } + + assert(gProxyHandle.functions[SQLAPI_INDEX_SQLALLOCENV].func); + ret=(gProxyHandle.functions[SQLAPI_INDEX_SQLALLOCENV].func) (EnvironmentHandle); + TRACE("Returns ret=%d, Env=%lx\n",ret, *EnvironmentHandle); + return ret; +} + + +/************************************************************************* + * SQLAllocHandle [ODBC32.024] + */ +SQLRETURN WINAPI SQLAllocHandle(SQLSMALLINT HandleType, SQLHANDLE InputHandle, SQLHANDLE *OutputHandle) +{ + SQLRETURN ret; + TRACE("(Type=%d, Handle=%lx)\n",HandleType,InputHandle); + + if (!gProxyHandle.bFunctionReady || gProxyHandle.dmHandle == NULL) + { + if (gProxyHandle.nErrorType == ERROR_LIBRARY_NOT_FOUND) + WARN("ProxyODBC: Can not load ODBC driver manager library.\n"); + + if (HandleType == SQL_HANDLE_ENV) + *OutputHandle = SQL_NULL_HENV; + else if (HandleType == SQL_HANDLE_DBC) + *OutputHandle = SQL_NULL_HDBC; + else if (HandleType == SQL_HANDLE_STMT) + *OutputHandle = SQL_NULL_HSTMT; + else if (HandleType == SQL_HANDLE_DESC) + *OutputHandle = SQL_NULL_HDESC; + + TRACE ("Not ready\n"); + return SQL_ERROR; + } + + assert(gProxyHandle.functions[SQLAPI_INDEX_SQLALLOCHANDLE].func); + ret=(gProxyHandle.functions[SQLAPI_INDEX_SQLALLOCHANDLE].func) + (HandleType, InputHandle, OutputHandle); + TRACE("Returns ret=%d, Handle=%lx\n",ret, *OutputHandle); + return ret; +} + + +/************************************************************************* + * SQLAllocStmt [ODBC32.003] + */ +SQLRETURN WINAPI SQLAllocStmt(SQLHDBC ConnectionHandle, SQLHSTMT *StatementHandle) +{ + SQLRETURN ret; + + TRACE("(Connection=%lx)\n",ConnectionHandle); + + if (!gProxyHandle.bFunctionReady || gProxyHandle.dmHandle == NULL) + { + *StatementHandle = SQL_NULL_HSTMT; + TRACE ("Not ready\n"); + return SQL_ERROR; + } + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLALLOCSTMT].func); + ret=(gProxyHandle.functions[SQLAPI_INDEX_SQLALLOCSTMT].func) + (ConnectionHandle, StatementHandle); + TRACE ("Returns ret=%d, Handle=%lx\n", ret, *StatementHandle); + return ret; +} + + +/************************************************************************* + * SQLAllocHandleStd [ODBC32.077] + */ +SQLRETURN WINAPI SQLAllocHandleStd( SQLSMALLINT HandleType, + SQLHANDLE InputHandle, SQLHANDLE *OutputHandle) +{ + TRACE("ProxyODBC: SQLAllocHandelStd.\n"); + + if (!gProxyHandle.bFunctionReady || gProxyHandle.dmHandle == NULL) + { + if (gProxyHandle.nErrorType == ERROR_LIBRARY_NOT_FOUND) + WARN("ProxyODBC: Can not load ODBC driver manager library.\n"); + + if (HandleType == SQL_HANDLE_ENV) + *OutputHandle = SQL_NULL_HENV; + else if (HandleType == SQL_HANDLE_DBC) + *OutputHandle = SQL_NULL_HDBC; + else if (HandleType == SQL_HANDLE_STMT) + *OutputHandle = SQL_NULL_HSTMT; + else if (HandleType == SQL_HANDLE_DESC) + *OutputHandle = SQL_NULL_HDESC; + + return SQL_ERROR; + } + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLALLOCHANDLESTD].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLALLOCHANDLESTD].func) + (HandleType, InputHandle, OutputHandle); +} + + +/************************************************************************* + * SQLBindCol [ODBC32.004] + */ +SQLRETURN WINAPI SQLBindCol(SQLHSTMT StatementHandle, + SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, + SQLPOINTER TargetValue, SQLINTEGER BufferLength, + SQLINTEGER *StrLen_or_Ind) +{ + TRACE("\n"); + + if (!gProxyHandle.bFunctionReady || gProxyHandle.dmHandle == NULL) + { + TRACE ("Not ready\n"); + return SQL_ERROR; + } + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLBINDCOL].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLBINDCOL].func) + (StatementHandle, ColumnNumber, TargetType, + TargetValue, BufferLength, StrLen_or_Ind); +} + + +/************************************************************************* + * SQLBindParam [ODBC32.025] + */ +SQLRETURN WINAPI SQLBindParam(SQLHSTMT StatementHandle, + SQLUSMALLINT ParameterNumber, SQLSMALLINT ValueType, + SQLSMALLINT ParameterType, SQLUINTEGER LengthPrecision, + SQLSMALLINT ParameterScale, SQLPOINTER ParameterValue, + SQLINTEGER *StrLen_or_Ind) +{ + TRACE("\n"); + + CHECK_READY_AND_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLBINDPARAM].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLBINDPARAM].func) + (StatementHandle, ParameterNumber, ValueType, + ParameterScale, ParameterValue, StrLen_or_Ind); +} + + +/************************************************************************* + * SQLCancel [ODBC32.005] + */ +SQLRETURN WINAPI SQLCancel(SQLHSTMT StatementHandle) +{ + TRACE("\n"); + + CHECK_READY_AND_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLCANCEL].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLCANCEL].func) (StatementHandle); +} + + +/************************************************************************* + * SQLCloseCursor [ODBC32.026] + */ +SQLRETURN WINAPI SQLCloseCursor(SQLHSTMT StatementHandle) +{ + SQLRETURN ret; + TRACE("(Handle=%lx)\n",StatementHandle); + + CHECK_READY_AND_dmHandle(); + + assert(gProxyHandle.functions[SQLAPI_INDEX_SQLCLOSECURSOR].func); + ret=(gProxyHandle.functions[SQLAPI_INDEX_SQLCLOSECURSOR].func) (StatementHandle); + TRACE("returns %d\n",ret); + return ret; +} + + +/************************************************************************* + * SQLColAttribute [ODBC32.027] + */ +SQLRETURN WINAPI SQLColAttribute (SQLHSTMT StatementHandle, + SQLUSMALLINT ColumnNumber, SQLUSMALLINT FieldIdentifier, + SQLPOINTER CharacterAttribute, SQLSMALLINT BufferLength, + SQLSMALLINT *StringLength, SQLPOINTER NumericAttribute) +{ + TRACE("\n"); + + CHECK_READY_AND_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLCOLATTRIBUTE].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLCOLATTRIBUTE].func) + (StatementHandle, ColumnNumber, FieldIdentifier, + CharacterAttribute, BufferLength, StringLength, NumericAttribute); +} + + +/************************************************************************* + * SQLColumns [ODBC32.040] + */ +SQLRETURN WINAPI SQLColumns(SQLHSTMT StatementHandle, + SQLCHAR *CatalogName, SQLSMALLINT NameLength1, + SQLCHAR *SchemaName, SQLSMALLINT NameLength2, + SQLCHAR *TableName, SQLSMALLINT NameLength3, + SQLCHAR *ColumnName, SQLSMALLINT NameLength4) +{ + TRACE("\n"); + + CHECK_READY_AND_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLCOLUMNS].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLCOLUMNS].func) + (StatementHandle, CatalogName, NameLength1, + SchemaName, NameLength2, TableName, NameLength3, ColumnName, NameLength4); +} + + +/************************************************************************* + * SQLConnect [ODBC32.007] + */ +SQLRETURN WINAPI SQLConnect(SQLHDBC ConnectionHandle, + SQLCHAR *ServerName, SQLSMALLINT NameLength1, + SQLCHAR *UserName, SQLSMALLINT NameLength2, + SQLCHAR *Authentication, SQLSMALLINT NameLength3) +{ + SQLRETURN ret; + TRACE("(Server=%.*s)\n",NameLength1, ServerName); + + CHECK_READY_AND_dmHandle(); + + strcpy(gProxyHandle.ServerName, ServerName); + strcpy(gProxyHandle.UserName, UserName); + + assert(gProxyHandle.functions[SQLAPI_INDEX_SQLCONNECT].func); + ret=(gProxyHandle.functions[SQLAPI_INDEX_SQLCONNECT].func) + (ConnectionHandle, ServerName, NameLength1, + UserName, NameLength2, Authentication, NameLength3); + + TRACE("returns %d\n",ret); + return ret; +} + + +/************************************************************************* + * SQLCopyDesc [ODBC32.028] + */ +SQLRETURN WINAPI SQLCopyDesc(SQLHDESC SourceDescHandle, SQLHDESC TargetDescHandle) +{ + TRACE("\n"); + + CHECK_READY_AND_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLCOPYDESC].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLCOPYDESC].func) + (SourceDescHandle, TargetDescHandle); +} + + +/************************************************************************* + * SQLDataSources [ODBC32.057] + */ +SQLRETURN WINAPI SQLDataSources(SQLHENV EnvironmentHandle, + SQLUSMALLINT Direction, SQLCHAR *ServerName, + SQLSMALLINT BufferLength1, SQLSMALLINT *NameLength1, + SQLCHAR *Description, SQLSMALLINT BufferLength2, + SQLSMALLINT *NameLength2) +{ + SQLRETURN ret; + + TRACE("EnvironmentHandle = %p\n", (LPVOID)EnvironmentHandle); + + if (!gProxyHandle.bFunctionReady || gProxyHandle.dmHandle == NULL) + { + ERR("Error: empty dm handle (gProxyHandle.dmHandle == NULL)\n"); + return SQL_ERROR; + } + + assert(gProxyHandle.functions[SQLAPI_INDEX_SQLDATASOURCES].func); + ret = (gProxyHandle.functions[SQLAPI_INDEX_SQLDATASOURCES].func) + (EnvironmentHandle, Direction, ServerName, + BufferLength1, NameLength1, Description, BufferLength2, NameLength2); + +#ifndef __REACTOS__ + if (TRACE_ON(odbc)) +#endif + { + TRACE("returns: %d \t", ret); + if (*NameLength1 > 0) + TRACE("DataSource = %s,", ServerName); + if (*NameLength2 > 0) + TRACE(" Description = %s", Description); + TRACE("\n"); + } + + return ret; +} + + +/************************************************************************* + * SQLDescribeCol [ODBC32.008] + */ +SQLRETURN WINAPI SQLDescribeCol(SQLHSTMT StatementHandle, + SQLUSMALLINT ColumnNumber, SQLCHAR *ColumnName, + SQLSMALLINT BufferLength, SQLSMALLINT *NameLength, + SQLSMALLINT *DataType, SQLUINTEGER *ColumnSize, + SQLSMALLINT *DecimalDigits, SQLSMALLINT *Nullable) +{ + TRACE("\n"); + + CHECK_READY_AND_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLDESCRIBECOL].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLDESCRIBECOL].func) + (StatementHandle, ColumnNumber, ColumnName, + BufferLength, NameLength, DataType, ColumnSize, DecimalDigits, Nullable); +} + + +/************************************************************************* + * SQLDisconnect [ODBC32.009] + */ +SQLRETURN WINAPI SQLDisconnect(SQLHDBC ConnectionHandle) +{ + SQLRETURN ret; + TRACE("(Handle=%lx)\n", ConnectionHandle); + + CHECK_READY_AND_dmHandle(); + + gProxyHandle.ServerName[0] = '\0'; + gProxyHandle.UserName[0] = '\0'; + + assert(gProxyHandle.functions[SQLAPI_INDEX_SQLDISCONNECT].func); + ret = (gProxyHandle.functions[SQLAPI_INDEX_SQLDISCONNECT].func) (ConnectionHandle); + TRACE("returns %d\n",ret); + return ret; +} + + +/************************************************************************* + * SQLEndTran [ODBC32.029] + */ +SQLRETURN WINAPI SQLEndTran(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT CompletionType) +{ + TRACE("\n"); + + CHECK_READY_AND_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLENDTRAN].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLENDTRAN].func) (HandleType, Handle, CompletionType); +} + + +/************************************************************************* + * SQLError [ODBC32.010] + */ +SQLRETURN WINAPI SQLError(SQLHENV EnvironmentHandle, + SQLHDBC ConnectionHandle, SQLHSTMT StatementHandle, + SQLCHAR *Sqlstate, SQLINTEGER *NativeError, + SQLCHAR *MessageText, SQLSMALLINT BufferLength, + SQLSMALLINT *TextLength) +{ + TRACE("\n"); + + CHECK_READY_AND_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLERROR].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLERROR].func) + (EnvironmentHandle, ConnectionHandle, StatementHandle, + Sqlstate, NativeError, MessageText, BufferLength, TextLength); +} + + +/************************************************************************* + * SQLExecDirect [ODBC32.011] + */ +SQLRETURN WINAPI SQLExecDirect(SQLHSTMT StatementHandle, SQLCHAR *StatementText, SQLINTEGER TextLength) +{ + TRACE("\n"); + + CHECK_READY_AND_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLEXECDIRECT].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLEXECDIRECT].func) + (StatementHandle, StatementText, TextLength); +} + + +/************************************************************************* + * SQLExecute [ODBC32.012] + */ +SQLRETURN WINAPI SQLExecute(SQLHSTMT StatementHandle) +{ + TRACE("\n"); + + CHECK_READY_AND_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLEXECUTE].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLEXECUTE].func) (StatementHandle); +} + + +/************************************************************************* + * SQLFetch [ODBC32.013] + */ +SQLRETURN WINAPI SQLFetch(SQLHSTMT StatementHandle) +{ + TRACE("\n"); + + CHECK_READY_AND_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLFETCH].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLFETCH].func) (StatementHandle); +} + + +/************************************************************************* + * SQLFetchScroll [ODBC32.030] + */ +SQLRETURN WINAPI SQLFetchScroll(SQLHSTMT StatementHandle, SQLSMALLINT FetchOrientation, SQLINTEGER FetchOffset) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLFETCHSCROLL].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLFETCHSCROLL].func) + (StatementHandle, FetchOrientation, FetchOffset); +} + + +/************************************************************************* + * SQLFreeConnect [ODBC32.014] + */ +SQLRETURN WINAPI SQLFreeConnect(SQLHDBC ConnectionHandle) +{ + SQLRETURN ret; + TRACE("(Handle=%lx)\n",ConnectionHandle); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLFREECONNECT].func); + ret=(gProxyHandle.functions[SQLAPI_INDEX_SQLFREECONNECT].func) (ConnectionHandle); + TRACE("Returns %d\n",ret); + return ret; +} + + +/************************************************************************* + * SQLFreeEnv [ODBC32.015] + */ +SQLRETURN WINAPI SQLFreeEnv(SQLHENV EnvironmentHandle) +{ + SQLRETURN ret; + TRACE("(Env=%lx)\n",EnvironmentHandle); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLFREEENV].func); + ret = (gProxyHandle.functions[SQLAPI_INDEX_SQLFREEENV].func) (EnvironmentHandle); + TRACE("Returns %d\n",ret); + return ret; +} + + +/************************************************************************* + * SQLFreeHandle [ODBC32.031] + */ +SQLRETURN WINAPI SQLFreeHandle(SQLSMALLINT HandleType, SQLHANDLE Handle) +{ + SQLRETURN ret; + TRACE("(Type=%d, Handle=%lx)\n",HandleType,Handle); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLFREEHANDLE].func); + ret = (gProxyHandle.functions[SQLAPI_INDEX_SQLFREEHANDLE].func) + (HandleType, Handle); + TRACE ("Returns %d\n",ret); + return ret; +} + + +/************************************************************************* + * SQLFreeStmt [ODBC32.016] + */ +SQLRETURN WINAPI SQLFreeStmt(SQLHSTMT StatementHandle, SQLUSMALLINT Option) +{ + SQLRETURN ret; + TRACE("(Handle %lx, Option=%d)\n",StatementHandle, Option); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLFREESTMT].func); + ret=(gProxyHandle.functions[SQLAPI_INDEX_SQLFREESTMT].func) + (StatementHandle, Option); + TRACE("Returns %d\n",ret); + return ret; +} + + +/************************************************************************* + * SQLGetConnectAttr [ODBC32.032] + */ +SQLRETURN WINAPI SQLGetConnectAttr(SQLHDBC ConnectionHandle, + SQLINTEGER Attribute, SQLPOINTER Value, + SQLINTEGER BufferLength, SQLINTEGER *StringLength) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLGETCONNECTATTR].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLGETCONNECTATTR].func) + (ConnectionHandle, Attribute, Value, + BufferLength, StringLength); +} + + +/************************************************************************* + * SQLGetConnectOption [ODBC32.042] + */ +SQLRETURN WINAPI SQLGetConnectOption(SQLHDBC ConnectionHandle, SQLUSMALLINT Option, SQLPOINTER Value) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLGETCONNECTOPTION].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLGETCONNECTOPTION].func) + (ConnectionHandle, Option, Value); +} + + +/************************************************************************* + * SQLGetCursorName [ODBC32.017] + */ +SQLRETURN WINAPI SQLGetCursorName(SQLHSTMT StatementHandle, + SQLCHAR *CursorName, SQLSMALLINT BufferLength, + SQLSMALLINT *NameLength) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLGETCURSORNAME].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLGETCURSORNAME].func) + (StatementHandle, CursorName, BufferLength, NameLength); +} + + +/************************************************************************* + * SQLGetData [ODBC32.043] + */ +SQLRETURN WINAPI SQLGetData(SQLHSTMT StatementHandle, + SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, + SQLPOINTER TargetValue, SQLINTEGER BufferLength, + SQLINTEGER *StrLen_or_Ind) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLGETDATA].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLGETDATA].func) + (StatementHandle, ColumnNumber, TargetType, + TargetValue, BufferLength, StrLen_or_Ind); +} + + +/************************************************************************* + * SQLGetDescField [ODBC32.033] + */ +SQLRETURN WINAPI SQLGetDescField(SQLHDESC DescriptorHandle, + SQLSMALLINT RecNumber, SQLSMALLINT FieldIdentifier, + SQLPOINTER Value, SQLINTEGER BufferLength, + SQLINTEGER *StringLength) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLGETDESCFIELD].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLGETDESCFIELD].func) + (DescriptorHandle, RecNumber, FieldIdentifier, + Value, BufferLength, StringLength); +} + + +/************************************************************************* + * SQLGetDescRec [ODBC32.034] + */ +SQLRETURN WINAPI SQLGetDescRec(SQLHDESC DescriptorHandle, + SQLSMALLINT RecNumber, SQLCHAR *Name, + SQLSMALLINT BufferLength, SQLSMALLINT *StringLength, + SQLSMALLINT *Type, SQLSMALLINT *SubType, + SQLINTEGER *Length, SQLSMALLINT *Precision, + SQLSMALLINT *Scale, SQLSMALLINT *Nullable) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLGETDESCREC].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLGETDESCREC].func) + (DescriptorHandle, RecNumber, Name, BufferLength, + StringLength, Type, SubType, Length, Precision, Scale, Nullable); +} + + +/************************************************************************* + * SQLGetDiagField [ODBC32.035] + */ +SQLRETURN WINAPI SQLGetDiagField(SQLSMALLINT HandleType, SQLHANDLE Handle, + SQLSMALLINT RecNumber, SQLSMALLINT DiagIdentifier, + SQLPOINTER DiagInfo, SQLSMALLINT BufferLength, + SQLSMALLINT *StringLength) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLGETDIAGFIELD].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLGETDIAGFIELD].func) + (HandleType, Handle, RecNumber, DiagIdentifier, + DiagInfo, BufferLength, StringLength); +} + + +/************************************************************************* + * SQLGetDiagRec [ODBC32.036] + */ +SQLRETURN WINAPI SQLGetDiagRec(SQLSMALLINT HandleType, SQLHANDLE Handle, + SQLSMALLINT RecNumber, SQLCHAR *Sqlstate, + SQLINTEGER *NativeError, SQLCHAR *MessageText, + SQLSMALLINT BufferLength, SQLSMALLINT *TextLength) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLGETDIAGREC].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLGETDIAGREC].func) + (HandleType, Handle, RecNumber, Sqlstate, NativeError, + MessageText, BufferLength, TextLength); +} + + +/************************************************************************* + * SQLGetEnvAttr [ODBC32.037] + */ +SQLRETURN WINAPI SQLGetEnvAttr(SQLHENV EnvironmentHandle, + SQLINTEGER Attribute, SQLPOINTER Value, + SQLINTEGER BufferLength, SQLINTEGER *StringLength) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLGETENVATTR].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLGETENVATTR].func) + (EnvironmentHandle, Attribute, Value, BufferLength, StringLength); +} + + +/************************************************************************* + * SQLGetFunctions [ODBC32.044] + */ +SQLRETURN WINAPI SQLGetFunctions(SQLHDBC ConnectionHandle, SQLUSMALLINT FunctionId, SQLUSMALLINT *Supported) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLGETFUNCTIONS].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLGETFUNCTIONS].func) + (ConnectionHandle, FunctionId, Supported); +} + + +/************************************************************************* + * SQLGetInfo [ODBC32.045] + */ +SQLRETURN WINAPI SQLGetInfo(SQLHDBC ConnectionHandle, + SQLUSMALLINT InfoType, SQLPOINTER InfoValue, + SQLSMALLINT BufferLength, SQLSMALLINT *StringLength) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLGETINFO].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLGETINFO].func) + (ConnectionHandle, InfoType, InfoValue, BufferLength, StringLength); +} + + +/************************************************************************* + * SQLGetStmtAttr [ODBC32.038] + */ +SQLRETURN WINAPI SQLGetStmtAttr(SQLHSTMT StatementHandle, + SQLINTEGER Attribute, SQLPOINTER Value, + SQLINTEGER BufferLength, SQLINTEGER *StringLength) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLGETSTMTATTR].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLGETSTMTATTR].func) + (StatementHandle, Attribute, Value, BufferLength, StringLength); +} + + +/************************************************************************* + * SQLGetStmtOption [ODBC32.046] + */ +SQLRETURN WINAPI SQLGetStmtOption(SQLHSTMT StatementHandle, SQLUSMALLINT Option, SQLPOINTER Value) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLGETSTMTOPTION].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLGETSTMTOPTION].func) + (StatementHandle, Option, Value); +} + + +/************************************************************************* + * SQLGetTypeInfo [ODBC32.047] + */ +SQLRETURN WINAPI SQLGetTypeInfo(SQLHSTMT StatementHandle, SQLSMALLINT DataType) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLGETTYPEINFO].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLGETTYPEINFO].func) + (StatementHandle, DataType); +} + + +/************************************************************************* + * SQLNumResultCols [ODBC32.018] + */ +SQLRETURN WINAPI SQLNumResultCols(SQLHSTMT StatementHandle, SQLSMALLINT *ColumnCount) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLNUMRESULTCOLS].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLNUMRESULTCOLS].func) + (StatementHandle, ColumnCount); +} + + +/************************************************************************* + * SQLParamData [ODBC32.048] + */ +SQLRETURN WINAPI SQLParamData(SQLHSTMT StatementHandle, SQLPOINTER *Value) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLPARAMDATA].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLPARAMDATA].func) + (StatementHandle, Value); +} + + +/************************************************************************* + * SQLPrepare [ODBC32.019] + */ +SQLRETURN WINAPI SQLPrepare(SQLHSTMT StatementHandle, SQLCHAR *StatementText, SQLINTEGER TextLength) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLPREPARE].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLPREPARE].func) + (StatementHandle, StatementText, TextLength); +} + + +/************************************************************************* + * SQLPutData [ODBC32.049] + */ +SQLRETURN WINAPI SQLPutData(SQLHSTMT StatementHandle, SQLPOINTER Data, SQLINTEGER StrLen_or_Ind) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLPUTDATA].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLPUTDATA].func) + (StatementHandle, Data, StrLen_or_Ind); +} + + +/************************************************************************* + * SQLRowCount [ODBC32.020] + */ +SQLRETURN WINAPI SQLRowCount(SQLHSTMT StatementHandle, SQLINTEGER *RowCount) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLROWCOUNT].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLROWCOUNT].func) + (StatementHandle, RowCount); +} + + +/************************************************************************* + * SQLSetConnectAttr [ODBC32.039] + */ +SQLRETURN WINAPI SQLSetConnectAttr(SQLHDBC ConnectionHandle, SQLINTEGER Attribute, + SQLPOINTER Value, SQLINTEGER StringLength) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLSETCONNECTATTR].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLSETCONNECTATTR].func) + (ConnectionHandle, Attribute, Value, StringLength); +} + + +/************************************************************************* + * SQLSetConnectOption [ODBC32.050] + */ +SQLRETURN WINAPI SQLSetConnectOption(SQLHDBC ConnectionHandle, SQLUSMALLINT Option, SQLUINTEGER Value) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLSETCONNECTOPTION].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLSETCONNECTOPTION].func) + (ConnectionHandle, Option, Value); +} + + +/************************************************************************* + * SQLSetCursorName [ODBC32.021] + */ +SQLRETURN WINAPI SQLSetCursorName(SQLHSTMT StatementHandle, SQLCHAR *CursorName, SQLSMALLINT NameLength) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLSETCURSORNAME].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLSETCURSORNAME].func) + (StatementHandle, CursorName, NameLength); +} + + +/************************************************************************* + * SQLSetDescField [ODBC32.073] + */ +SQLRETURN WINAPI SQLSetDescField(SQLHDESC DescriptorHandle, + SQLSMALLINT RecNumber, SQLSMALLINT FieldIdentifier, + SQLPOINTER Value, SQLINTEGER BufferLength) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLSETDESCFIELD].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLSETDESCFIELD].func) + (DescriptorHandle, RecNumber, FieldIdentifier, Value, BufferLength); +} + + +/************************************************************************* + * SQLSetDescRec [ODBC32.074] + */ +SQLRETURN WINAPI SQLSetDescRec(SQLHDESC DescriptorHandle, + SQLSMALLINT RecNumber, SQLSMALLINT Type, + SQLSMALLINT SubType, SQLINTEGER Length, + SQLSMALLINT Precision, SQLSMALLINT Scale, + SQLPOINTER Data, SQLINTEGER *StringLength, + SQLINTEGER *Indicator) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLSETDESCREC].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLSETDESCREC].func) + (DescriptorHandle, RecNumber, Type, SubType, Length, + Precision, Scale, Data, StringLength, Indicator); +} + + +/************************************************************************* + * SQLSetEnvAttr [ODBC32.075] + */ +SQLRETURN WINAPI SQLSetEnvAttr(SQLHENV EnvironmentHandle, + SQLINTEGER Attribute, SQLPOINTER Value, + SQLINTEGER StringLength) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLSETENVATTR].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLSETENVATTR].func) + (EnvironmentHandle, Attribute, Value, StringLength); +} + + +/************************************************************************* + * SQLSetParam [ODBC32.022] + */ +SQLRETURN WINAPI SQLSetParam(SQLHSTMT StatementHandle, + SQLUSMALLINT ParameterNumber, SQLSMALLINT ValueType, + SQLSMALLINT ParameterType, SQLUINTEGER LengthPrecision, + SQLSMALLINT ParameterScale, SQLPOINTER ParameterValue, + SQLINTEGER *StrLen_or_Ind) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLSETPARAM].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLSETPARAM].func) + (StatementHandle, ParameterNumber, ValueType, ParameterType, LengthPrecision, + ParameterScale, ParameterValue, StrLen_or_Ind); +} + + +/************************************************************************* + * SQLSetStmtAttr [ODBC32.076] + */ +SQLRETURN WINAPI SQLSetStmtAttr(SQLHSTMT StatementHandle, + SQLINTEGER Attribute, SQLPOINTER Value, + SQLINTEGER StringLength) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLSETSTMTATTR].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLSETSTMTATTR].func) + (StatementHandle, Attribute, Value, StringLength); +} + + +/************************************************************************* + * SQLSetStmtOption [ODBC32.051] + */ +SQLRETURN WINAPI SQLSetStmtOption(SQLHSTMT StatementHandle, SQLUSMALLINT Option, SQLUINTEGER Value) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLSETSTMTOPTION].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLSETSTMTOPTION].func) + (StatementHandle, Option, Value); +} + + +/************************************************************************* + * SQLSpecialColumns [ODBC32.052] + */ +SQLRETURN WINAPI SQLSpecialColumns(SQLHSTMT StatementHandle, + SQLUSMALLINT IdentifierType, SQLCHAR *CatalogName, + SQLSMALLINT NameLength1, SQLCHAR *SchemaName, + SQLSMALLINT NameLength2, SQLCHAR *TableName, + SQLSMALLINT NameLength3, SQLUSMALLINT Scope, + SQLUSMALLINT Nullable) +{ + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLSPECIALCOLUMNS].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLSPECIALCOLUMNS].func) + (StatementHandle, IdentifierType, CatalogName, NameLength1, SchemaName, + NameLength2, TableName, NameLength3, Scope, Nullable); +} + + +/************************************************************************* + * SQLStatistics [ODBC32.053] + */ +SQLRETURN WINAPI SQLStatistics(SQLHSTMT StatementHandle, + SQLCHAR *CatalogName, SQLSMALLINT NameLength1, + SQLCHAR *SchemaName, SQLSMALLINT NameLength2, + SQLCHAR *TableName, SQLSMALLINT NameLength3, + SQLUSMALLINT Unique, SQLUSMALLINT Reserved) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLSTATISTICS].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLSTATISTICS].func) + (StatementHandle, CatalogName, NameLength1, SchemaName, NameLength2, + TableName, NameLength3, Unique, Reserved); +} + + +/************************************************************************* + * SQLTables [ODBC32.054] + */ +SQLRETURN WINAPI SQLTables(SQLHSTMT StatementHandle, + SQLCHAR *CatalogName, SQLSMALLINT NameLength1, + SQLCHAR *SchemaName, SQLSMALLINT NameLength2, + SQLCHAR *TableName, SQLSMALLINT NameLength3, + SQLCHAR *TableType, SQLSMALLINT NameLength4) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLTABLES].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLTABLES].func) + (StatementHandle, CatalogName, NameLength1, + SchemaName, NameLength2, TableName, NameLength3, TableType, NameLength4); +} + + +/************************************************************************* + * SQLTransact [ODBC32.023] + */ +SQLRETURN WINAPI SQLTransact(SQLHENV EnvironmentHandle, SQLHDBC ConnectionHandle, + SQLUSMALLINT CompletionType) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLTRANSACT].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLTRANSACT].func) + (EnvironmentHandle, ConnectionHandle, CompletionType); +} + + +/************************************************************************* + * SQLBrowseConnect [ODBC32.055] + */ +SQLRETURN WINAPI SQLBrowseConnect( + SQLHDBC hdbc, + SQLCHAR *szConnStrIn, + SQLSMALLINT cbConnStrIn, + SQLCHAR *szConnStrOut, + SQLSMALLINT cbConnStrOutMax, + SQLSMALLINT *pcbConnStrOut) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLBROWSECONNECT].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLBROWSECONNECT].func) + (hdbc, szConnStrIn, cbConnStrIn, szConnStrOut, cbConnStrOutMax, pcbConnStrOut); +} + + +/************************************************************************* + * SQLBulkOperations [ODBC32.078] + */ +SQLRETURN WINAPI SQLBulkOperations( + SQLHSTMT StatementHandle, + SQLSMALLINT Operation) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLBULKOPERATIONS].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLBULKOPERATIONS].func) + (StatementHandle, Operation); +} + + +/************************************************************************* + * SQLColAttributes [ODBC32.006] + */ +SQLRETURN WINAPI SQLColAttributes( + SQLHSTMT hstmt, + SQLUSMALLINT icol, + SQLUSMALLINT fDescType, + SQLPOINTER rgbDesc, + SQLSMALLINT cbDescMax, + SQLSMALLINT *pcbDesc, + SQLINTEGER *pfDesc) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLCOLATTRIBUTES].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLCOLATTRIBUTES].func) + (hstmt, icol, fDescType, rgbDesc, cbDescMax, pcbDesc, pfDesc); +} + + +/************************************************************************* + * SQLColumnPrivileges [ODBC32.056] + */ +SQLRETURN WINAPI SQLColumnPrivileges( + SQLHSTMT hstmt, + SQLCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLCHAR *szTableName, + SQLSMALLINT cbTableName, + SQLCHAR *szColumnName, + SQLSMALLINT cbColumnName) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLCOLUMNPRIVILEGES].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLCOLUMNPRIVILEGES].func) + (hstmt, szCatalogName, cbCatalogName, szSchemaName, cbSchemaName, + szTableName, cbTableName, szColumnName, cbColumnName); +} + + +/************************************************************************* + * SQLDescribeParam [ODBC32.058] + */ +SQLRETURN WINAPI SQLDescribeParam( + SQLHSTMT hstmt, + SQLUSMALLINT ipar, + SQLSMALLINT *pfSqlType, + SQLUINTEGER *pcbParamDef, + SQLSMALLINT *pibScale, + SQLSMALLINT *pfNullable) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLDESCRIBEPARAM].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLDESCRIBEPARAM].func) + (hstmt, ipar, pfSqlType, pcbParamDef, pibScale, pfNullable); +} + + +/************************************************************************* + * SQLExtendedFetch [ODBC32.059] + */ +SQLRETURN WINAPI SQLExtendedFetch( + SQLHSTMT hstmt, + SQLUSMALLINT fFetchType, + SQLINTEGER irow, + SQLUINTEGER *pcrow, + SQLUSMALLINT *rgfRowStatus) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLEXTENDEDFETCH].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLEXTENDEDFETCH].func) + (hstmt, fFetchType, irow, pcrow, rgfRowStatus); +} + + +/************************************************************************* + * SQLForeignKeys [ODBC32.060] + */ +SQLRETURN WINAPI SQLForeignKeys( + SQLHSTMT hstmt, + SQLCHAR *szPkCatalogName, + SQLSMALLINT cbPkCatalogName, + SQLCHAR *szPkSchemaName, + SQLSMALLINT cbPkSchemaName, + SQLCHAR *szPkTableName, + SQLSMALLINT cbPkTableName, + SQLCHAR *szFkCatalogName, + SQLSMALLINT cbFkCatalogName, + SQLCHAR *szFkSchemaName, + SQLSMALLINT cbFkSchemaName, + SQLCHAR *szFkTableName, + SQLSMALLINT cbFkTableName) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLFOREIGNKEYS].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLFOREIGNKEYS].func) + (hstmt, szPkCatalogName, cbPkCatalogName, szPkSchemaName, cbPkSchemaName, + szPkTableName, cbPkTableName, szFkCatalogName, cbFkCatalogName, szFkSchemaName, + cbFkSchemaName, szFkTableName, cbFkTableName); +} + + +/************************************************************************* + * SQLMoreResults [ODBC32.061] + */ +SQLRETURN WINAPI SQLMoreResults(SQLHSTMT hstmt) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLMORERESULTS].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLMORERESULTS].func) (hstmt); +} + + +/************************************************************************* + * SQLNativeSql [ODBC32.062] + */ +SQLRETURN WINAPI SQLNativeSql( + SQLHDBC hdbc, + SQLCHAR *szSqlStrIn, + SQLINTEGER cbSqlStrIn, + SQLCHAR *szSqlStr, + SQLINTEGER cbSqlStrMax, + SQLINTEGER *pcbSqlStr) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLNATIVESQL].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLNATIVESQL].func) + (hdbc, szSqlStrIn, cbSqlStrIn, szSqlStr, cbSqlStrMax, pcbSqlStr); +} + + +/************************************************************************* + * SQLNumParams [ODBC32.063] + */ +SQLRETURN WINAPI SQLNumParams( + SQLHSTMT hstmt, + SQLSMALLINT *pcpar) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLNUMPARAMS].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLNUMPARAMS].func) (hstmt, pcpar); +} + + +/************************************************************************* + * SQLParamOptions [ODBC32.064] + */ +SQLRETURN WINAPI SQLParamOptions( + SQLHSTMT hstmt, + SQLUINTEGER crow, + SQLUINTEGER *pirow) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLPARAMOPTIONS].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLPARAMOPTIONS].func) (hstmt, crow, pirow); +} + + +/************************************************************************* + * SQLPrimaryKeys [ODBC32.065] + */ +SQLRETURN WINAPI SQLPrimaryKeys( + SQLHSTMT hstmt, + SQLCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLCHAR *szTableName, + SQLSMALLINT cbTableName) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLPRIMARYKEYS].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLPRIMARYKEYS].func) + (hstmt, szCatalogName, cbCatalogName, szSchemaName, cbSchemaName, + szTableName, cbTableName); +} + + +/************************************************************************* + * SQLProcedureColumns [ODBC32.066] + */ +SQLRETURN WINAPI SQLProcedureColumns( + SQLHSTMT hstmt, + SQLCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLCHAR *szProcName, + SQLSMALLINT cbProcName, + SQLCHAR *szColumnName, + SQLSMALLINT cbColumnName) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLPROCEDURECOLUMNS].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLPROCEDURECOLUMNS].func) + (hstmt, szCatalogName, cbCatalogName, szSchemaName, cbSchemaName, + szProcName, cbProcName, szColumnName, cbColumnName); +} + + +/************************************************************************* + * SQLProcedures [ODBC32.067] + */ +SQLRETURN WINAPI SQLProcedures( + SQLHSTMT hstmt, + SQLCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLCHAR *szProcName, + SQLSMALLINT cbProcName) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLPROCEDURES].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLPROCEDURES].func) + (hstmt, szCatalogName, cbCatalogName, szSchemaName, cbSchemaName, + szProcName, cbProcName); +} + + +/************************************************************************* + * SQLSetPos [ODBC32.068] + */ +SQLRETURN WINAPI SQLSetPos( + SQLHSTMT hstmt, + SQLUSMALLINT irow, + SQLUSMALLINT fOption, + SQLUSMALLINT fLock) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLSETPOS].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLSETPOS].func) + (hstmt, irow, fOption, fLock); +} + + +/************************************************************************* + * SQLTablePrivileges [ODBC32.070] + */ +SQLRETURN WINAPI SQLTablePrivileges( + SQLHSTMT hstmt, + SQLCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLCHAR *szTableName, + SQLSMALLINT cbTableName) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLTABLEPRIVILEGES].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLTABLEPRIVILEGES].func) + (hstmt, szCatalogName, cbCatalogName, szSchemaName, cbSchemaName, + szTableName, cbTableName); +} + + +/************************************************************************* + * SQLDrivers [ODBC32.071] + */ +SQLRETURN WINAPI SQLDrivers( + SQLHENV henv, + SQLUSMALLINT fDirection, + SQLCHAR *szDriverDesc, + SQLSMALLINT cbDriverDescMax, + SQLSMALLINT *pcbDriverDesc, + SQLCHAR *szDriverAttributes, + SQLSMALLINT cbDriverAttrMax, + SQLSMALLINT *pcbDriverAttr) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLDRIVERS].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLDRIVERS].func) + (henv, fDirection, szDriverDesc, cbDriverDescMax, pcbDriverDesc, + szDriverAttributes, cbDriverAttrMax, pcbDriverAttr); +} + + +/************************************************************************* + * SQLBindParameter [ODBC32.072] + */ +SQLRETURN WINAPI SQLBindParameter( + SQLHSTMT hstmt, + SQLUSMALLINT ipar, + SQLSMALLINT fParamType, + SQLSMALLINT fCType, + SQLSMALLINT fSqlType, + SQLUINTEGER cbColDef, + SQLSMALLINT ibScale, + SQLPOINTER rgbValue, + SQLINTEGER cbValueMax, + SQLINTEGER *pcbValue) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLBINDPARAMETER].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLBINDPARAMETER].func) + (hstmt, ipar, fParamType, fCType, fSqlType, cbColDef, ibScale, + rgbValue, cbValueMax, pcbValue); +} + + +/************************************************************************* + * SQLDriverConnect [ODBC32.041] + */ +SQLRETURN WINAPI SQLDriverConnect( + SQLHDBC hdbc, + SQLHWND hwnd, + SQLCHAR *conn_str_in, + SQLSMALLINT len_conn_str_in, + SQLCHAR *conn_str_out, + SQLSMALLINT conn_str_out_max, + SQLSMALLINT *ptr_conn_str_out, + SQLUSMALLINT driver_completion ) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLDRIVERCONNECT].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLDRIVERCONNECT].func) + (hdbc, hwnd, conn_str_in, len_conn_str_in, conn_str_out, + conn_str_out_max, ptr_conn_str_out, driver_completion); +} + + +/************************************************************************* + * SQLSetScrollOptions [ODBC32.069] + */ +SQLRETURN WINAPI SQLSetScrollOptions( + SQLHSTMT statement_handle, + SQLUSMALLINT f_concurrency, + SQLINTEGER crow_keyset, + SQLUSMALLINT crow_rowset ) +{ + TRACE("\n"); + + CHECK_dmHandle(); + + assert (gProxyHandle.functions[SQLAPI_INDEX_SQLSETSCROLLOPTIONS].func); + return (gProxyHandle.functions[SQLAPI_INDEX_SQLSETSCROLLOPTIONS].func) + (statement_handle, f_concurrency, crow_keyset, crow_rowset); +} + +/* End of file */ diff --git a/reactos/lib/odbc32/proxyodbc.h b/reactos/lib/odbc32/proxyodbc.h new file mode 100644 index 00000000000..e327e1b3ae5 --- /dev/null +++ b/reactos/lib/odbc32/proxyodbc.h @@ -0,0 +1,131 @@ +/* + * Copyright 1999 Xiang Li, Corel Corporation + * + * 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 _PROXYMANAGER_H +#define _PROXYMANAGER_H + +#define NUM_SQLFUNC 78 +#define ERROR_FREE 0 +#define ERROR_SQLERROR 1 +#define ERROR_LIBRARY_NOT_FOUND 2 +#define ERROR_FUNCTIONS_NOT_LOADED 3 + +#define ODBCVER 0x0351 + +typedef struct dm_func /* driver manager functions */ +{ + int ordinal; + const char *name; + void *d_func; + SQLRETURN (*func)(); +} DM_FUNC; + +typedef struct proxyhandle +{ + void *dmHandle; /* driver manager handle */ + BOOL isWindowsDriver; /* is driver a Windows version*/ + BOOL bCallbackReady; /* procs taken from Windows driver placed in driver manager as callbacks */ + BOOL bFunctionReady; + int nErrorType; + DM_FUNC functions[NUM_SQLFUNC]; /* entry point for driver manager functions */ + char driverLibName[200]; /* ODBC driver SO name */ + char dmLibName[200]; /* driver manager library name */ + char ServerName[200]; /* keep server name */ + char UserName[50]; /* keep username */ +} PROXYHANDLE; + +#define /* 00 */ SQLAPI_INDEX_SQLALLOCCONNECT 0 +#define /* 01 */ SQLAPI_INDEX_SQLALLOCENV 1 +#define /* 02 */ SQLAPI_INDEX_SQLALLOCHANDLE 2 +#define /* 03 */ SQLAPI_INDEX_SQLALLOCSTMT 3 +#define /* 04 */ SQLAPI_INDEX_SQLALLOCHANDLESTD 4 +#define /* 05 */ SQLAPI_INDEX_SQLBINDCOL 5 +#define /* 06 */ SQLAPI_INDEX_SQLBINDPARAM 6 +#define /* 07 */ SQLAPI_INDEX_SQLBINDPARAMETER 7 +#define /* 08 */ SQLAPI_INDEX_SQLBROWSECONNECT 8 +#define /* 09 */ SQLAPI_INDEX_SQLBULKOPERATIONS 9 +#define /* 10 */ SQLAPI_INDEX_SQLCANCEL 10 +#define /* 11 */ SQLAPI_INDEX_SQLCLOSECURSOR 11 +#define /* 12 */ SQLAPI_INDEX_SQLCOLATTRIBUTE 12 +#define /* 13 */ SQLAPI_INDEX_SQLCOLATTRIBUTES 13 +#define /* 14 */ SQLAPI_INDEX_SQLCOLUMNPRIVILEGES 14 +#define /* 15 */ SQLAPI_INDEX_SQLCOLUMNS 15 +#define /* 16 */ SQLAPI_INDEX_SQLCONNECT 16 +#define /* 17 */ SQLAPI_INDEX_SQLCOPYDESC 17 +#define /* 18 */ SQLAPI_INDEX_SQLDATASOURCES 18 +#define /* 19 */ SQLAPI_INDEX_SQLDESCRIBECOL 19 +#define /* 20 */ SQLAPI_INDEX_SQLDESCRIBEPARAM 20 +#define /* 21 */ SQLAPI_INDEX_SQLDISCONNECT 21 +#define /* 22 */ SQLAPI_INDEX_SQLDRIVERCONNECT 22 +#define /* 23 */ SQLAPI_INDEX_SQLDRIVERS 23 +#define /* 24 */ SQLAPI_INDEX_SQLENDTRAN 24 +#define /* 25 */ SQLAPI_INDEX_SQLERROR 25 +#define /* 26 */ SQLAPI_INDEX_SQLEXECDIRECT 26 +#define /* 27 */ SQLAPI_INDEX_SQLEXECUTE 27 +#define /* 28 */ SQLAPI_INDEX_SQLEXTENDEDFETCH 28 +#define /* 29 */ SQLAPI_INDEX_SQLFETCH 29 +#define /* 30 */ SQLAPI_INDEX_SQLFETCHSCROLL 30 +#define /* 31 */ SQLAPI_INDEX_SQLFOREIGNKEYS 31 +#define /* 32 */ SQLAPI_INDEX_SQLFREEENV 32 +#define /* 33 */ SQLAPI_INDEX_SQLFREEHANDLE 33 +#define /* 34 */ SQLAPI_INDEX_SQLFREESTMT 34 +#define /* 35 */ SQLAPI_INDEX_SQLFREECONNECT 35 +#define /* 36 */ SQLAPI_INDEX_SQLGETCONNECTATTR 36 +#define /* 37 */ SQLAPI_INDEX_SQLGETCONNECTOPTION 37 +#define /* 38 */ SQLAPI_INDEX_SQLGETCURSORNAME 38 +#define /* 39 */ SQLAPI_INDEX_SQLGETDATA 39 +#define /* 40 */ SQLAPI_INDEX_SQLGETDESCFIELD 40 +#define /* 41 */ SQLAPI_INDEX_SQLGETDESCREC 41 +#define /* 42 */ SQLAPI_INDEX_SQLGETDIAGFIELD 42 +#define /* 43 */ SQLAPI_INDEX_SQLGETENVATTR 43 +#define /* 44 */ SQLAPI_INDEX_SQLGETFUNCTIONS 44 +#define /* 45 */ SQLAPI_INDEX_SQLGETINFO 45 +#define /* 46 */ SQLAPI_INDEX_SQLGETSTMTATTR 46 +#define /* 47 */ SQLAPI_INDEX_SQLGETSTMTOPTION 47 +#define /* 48 */ SQLAPI_INDEX_SQLGETTYPEINFO 48 +#define /* 49 */ SQLAPI_INDEX_SQLMORERESULTS 49 +#define /* 50 */ SQLAPI_INDEX_SQLNATIVESQL 50 +#define /* 51 */ SQLAPI_INDEX_SQLNUMPARAMS 51 +#define /* 52 */ SQLAPI_INDEX_SQLNUMRESULTCOLS 52 +#define /* 53 */ SQLAPI_INDEX_SQLPARAMDATA 53 +#define /* 54 */ SQLAPI_INDEX_SQLPARAMOPTIONS 54 +#define /* 55 */ SQLAPI_INDEX_SQLPREPARE 55 +#define /* 56 */ SQLAPI_INDEX_SQLPRIMARYKEYS 56 +#define /* 57 */ SQLAPI_INDEX_SQLPROCEDURECOLUMNS 57 +#define /* 58 */ SQLAPI_INDEX_SQLPROCEDURES 58 +#define /* 59 */ SQLAPI_INDEX_SQLPUTDATA 59 +#define /* 60 */ SQLAPI_INDEX_SQLROWCOUNT 60 +#define /* 61 */ SQLAPI_INDEX_SQLSETCONNECTATTR 61 +#define /* 62 */ SQLAPI_INDEX_SQLSETCONNECTOPTION 62 +#define /* 63 */ SQLAPI_INDEX_SQLSETCURSORNAME 63 +#define /* 64 */ SQLAPI_INDEX_SQLSETDESCFIELD 64 +#define /* 65 */ SQLAPI_INDEX_SQLSETDESCREC 65 +#define /* 66 */ SQLAPI_INDEX_SQLSETENVATTR 66 +#define /* 67 */ SQLAPI_INDEX_SQLSETPARAM 67 +#define /* 68 */ SQLAPI_INDEX_SQLSETPOS 68 +#define /* 69 */ SQLAPI_INDEX_SQLSETSCROLLOPTIONS 69 +#define /* 70 */ SQLAPI_INDEX_SQLSETSTMTATTR 70 +#define /* 71 */ SQLAPI_INDEX_SQLSETSTMTOPTION 71 +#define /* 72 */ SQLAPI_INDEX_SQLSPECIALCOLUMNS 72 +#define /* 73 */ SQLAPI_INDEX_SQLSTATISTICS 73 +#define /* 74 */ SQLAPI_INDEX_SQLTABLEPRIVILEGES 74 +#define /* 75 */ SQLAPI_INDEX_SQLTABLES 75 +#define /* 76 */ SQLAPI_INDEX_SQLTRANSACT 76 +#define /* 77 */ SQLAPI_INDEX_SQLGETDIAGREC 77 + +#endif From de2e13a185cd6b326e7eba94c68d0b8579e39a73 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Wed, 25 Feb 2004 20:21:29 +0000 Subject: [PATCH 0185/1463] fix taksbar icons after closing previous applications svn path=/trunk/; revision=8379 --- reactos/subsys/system/explorer/taskbar/taskbar.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/system/explorer/taskbar/taskbar.cpp b/reactos/subsys/system/explorer/taskbar/taskbar.cpp index a4c1a244f1b..9c33e7ec8c4 100644 --- a/reactos/subsys/system/explorer/taskbar/taskbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/taskbar.cpp @@ -388,8 +388,18 @@ void TaskBar::Refresh() TaskBarEntry& entry = it->second; // adjust button indexes - if (entry._btn_idx > idx) + if (entry._btn_idx > idx) { --entry._btn_idx; + --entry._bmp_idx; + + TBBUTTONINFO info; + + info.cbSize = sizeof(TBBUTTONINFO); + info.dwMask = TBIF_IMAGE; + info.iImage = entry._bmp_idx; + + SendMessage(_htoolbar, TB_SETBUTTONINFO, entry._id, (LPARAM)&info); + } } } From 47306399fd2df05536c355755e31c4c0efb63f7a Mon Sep 17 00:00:00 2001 From: Casper Hornstrup <chorns@users.sourceforge.net> Date: Wed, 25 Feb 2004 20:27:56 +0000 Subject: [PATCH 0186/1463] 2004-02-25 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/net/tcpip/datalink/loopback.c: Reformat. * drivers/net/tcpip/network/neighbor.c: Ditto. * drivers/net/tcpip/tcpip/info.c: Ditto. * drivers/net/tcpip/transport/datagram/datagram.c: Cleanup. If there is an out-of-resources situation, don't transmit the datagram out of order. svn path=/trunk/; revision=8381 --- reactos/ChangeLog | 9 + reactos/drivers/net/tcpip/datalink/loopback.c | 276 ++++---- reactos/drivers/net/tcpip/network/neighbor.c | 555 ++++++++------- reactos/drivers/net/tcpip/tcpip/info.c | 351 +++++----- .../net/tcpip/transport/datagram/datagram.c | 649 ++++++++++-------- 5 files changed, 997 insertions(+), 843 deletions(-) diff --git a/reactos/ChangeLog b/reactos/ChangeLog index a6c46456e52..a2ad4d45f3b 100644 --- a/reactos/ChangeLog +++ b/reactos/ChangeLog @@ -1,3 +1,12 @@ +2004-02-25 Casper S. Hornstrup <chorns@users.sourceforge.net> + + * drivers/net/tcpip/datalink/loopback.c: Reformat. + * drivers/net/tcpip/network/neighbor.c: Ditto. + * drivers/net/tcpip/tcpip/info.c: Ditto. + * drivers/net/tcpip/transport/datagram/datagram.c: Cleanup. + If there is an out-of-resources situation, don't transmit the + datagram out of order. + 2004-02-23 Casper S. Hornstrup <chorns@users.sourceforge.net> * tools/regtests.c (KMSTUB): Correct device name. diff --git a/reactos/drivers/net/tcpip/datalink/loopback.c b/reactos/drivers/net/tcpip/datalink/loopback.c index 9172ad7c23d..2f03aa1815b 100644 --- a/reactos/drivers/net/tcpip/datalink/loopback.c +++ b/reactos/drivers/net/tcpip/datalink/loopback.c @@ -16,199 +16,215 @@ #include <routines.h> -WORK_QUEUE_ITEM LoopWorkItem; -PIP_INTERFACE Loopback = NULL; +WORK_QUEUE_ITEM LoopWorkItem; +PIP_INTERFACE Loopback = NULL; /* Indicates wether the loopback interface is currently transmitting */ -BOOLEAN LoopBusy = FALSE; +BOOLEAN LoopBusy = FALSE; /* Loopback transmit queue */ -PNDIS_PACKET LoopQueueHead = (PNDIS_PACKET)NULL; -PNDIS_PACKET LoopQueueTail = (PNDIS_PACKET)NULL; +PNDIS_PACKET LoopQueueHead = (PNDIS_PACKET)NULL; +PNDIS_PACKET LoopQueueTail = (PNDIS_PACKET)NULL; /* Spin lock for protecting loopback transmit queue */ -KSPIN_LOCK LoopLock; +KSPIN_LOCK LoopQueueLock; VOID RealTransmit( - PVOID Context) + PVOID Context) /* * FUNCTION: Transmits one or more packet(s) in loopback queue to ourselves * ARGUMENTS: - * Context = Pointer to context information (loopback interface) + * Context = Pointer to context information (loopback interface) */ { - KIRQL OldIrql; - PNDIS_PACKET NdisPacket; - PNDIS_BUFFER NdisBuffer; - IP_PACKET IPPacket; + PNDIS_PACKET NdisPacket; + PNDIS_BUFFER NdisBuffer; + IP_PACKET IPPacket; + KIRQL OldIrql; - TI_DbgPrint(MAX_TRACE, ("Called.\n")); + TI_DbgPrint(MAX_TRACE, ("Called.\n")); - KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); - KeAcquireSpinLockAtDpcLevel(&LoopLock); + KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); + KeAcquireSpinLockAtDpcLevel(&LoopQueueLock); - for (;;) { - /* Get the next packet from the queue (if any) */ - NdisPacket = LoopQueueHead; - if (!NdisPacket) - break; + while (TRUE) + { + /* Get the next packet from the queue (if any) */ + NdisPacket = LoopQueueHead; + if (!NdisPacket) + break; - TI_DbgPrint(MAX_TRACE, ("NdisPacket (0x%X)\n", NdisPacket)); + TI_DbgPrint(MAX_TRACE, ("NdisPacket (0x%X)\n", NdisPacket)); - LoopQueueHead = *(PNDIS_PACKET*)NdisPacket->u.s3.MacReserved; - KeReleaseSpinLockFromDpcLevel(&LoopLock); - IPPacket.NdisPacket = NdisPacket; + LoopQueueHead = *(PNDIS_PACKET*)NdisPacket->u.s3.MacReserved; + KeReleaseSpinLockFromDpcLevel(&LoopQueueLock); + IPPacket.NdisPacket = NdisPacket; - NdisGetFirstBufferFromPacket(NdisPacket, - &NdisBuffer, - &IPPacket.Header, - &IPPacket.ContigSize, - &IPPacket.TotalSize); - IPReceive(Context, &IPPacket); - AdjustPacket(NdisPacket, 0, PC(NdisPacket)->DLOffset); - PC(NdisPacket)->DLComplete(Context, NdisPacket, NDIS_STATUS_SUCCESS); - /* Lower IRQL for a moment to prevent starvation */ - KeLowerIrql(OldIrql); - KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); - KeAcquireSpinLockAtDpcLevel(&LoopLock); + NdisGetFirstBufferFromPacket(NdisPacket, + &NdisBuffer, + &IPPacket.Header, + &IPPacket.ContigSize, + &IPPacket.TotalSize); + IPReceive(Context, &IPPacket); + AdjustPacket(NdisPacket, 0, PC(NdisPacket)->DLOffset); + PC(NdisPacket)->DLComplete(Context, NdisPacket, NDIS_STATUS_SUCCESS); + /* Lower IRQL for a moment to prevent starvation */ + KeLowerIrql(OldIrql); + KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); + KeAcquireSpinLockAtDpcLevel(&LoopQueueLock); } - LoopBusy = FALSE; - KeReleaseSpinLockFromDpcLevel(&LoopLock); - KeLowerIrql(OldIrql); + + LoopBusy = FALSE; + KeReleaseSpinLockFromDpcLevel(&LoopQueueLock); + KeLowerIrql(OldIrql); } - VOID LoopTransmit( - PVOID Context, - PNDIS_PACKET NdisPacket, - UINT Offset, - PVOID LinkAddress, - USHORT Type) + PVOID Context, + PNDIS_PACKET NdisPacket, + UINT Offset, + PVOID LinkAddress, + USHORT Type) /* * FUNCTION: Transmits a packet * ARGUMENTS: - * Context = Pointer to context information (NULL) - * NdisPacket = Pointer to NDIS packet to send - * Offset = Offset in packet where packet data starts - * LinkAddress = Pointer to link address - * Type = LAN protocol type (unused) + * Context = Pointer to context information (NULL) + * NdisPacket = Pointer to NDIS packet to send + * Offset = Offset in packet where packet data starts + * LinkAddress = Pointer to link address + * Type = LAN protocol type (unused) */ { - PNDIS_PACKET *pNdisPacket; - KIRQL OldIrql; + PNDIS_PACKET *pNdisPacket; + KIRQL OldIrql; - TI_DbgPrint(MAX_TRACE, ("Called.\n")); + TI_DbgPrint(MAX_TRACE, ("Called.\n")); - /* NDIS send routines don't have an offset argument so we - must offset the data in upper layers and adjust the - packet here. We save the offset in the packet context - area so it can be undone before we release the packet */ - AdjustPacket(NdisPacket, Offset, 0); - PC(NdisPacket)->DLOffset = Offset; + /* NDIS send routines don't have an offset argument so we + must offset the data in upper layers and adjust the + packet here. We save the offset in the packet context + area so it can be undone before we release the packet */ + AdjustPacket(NdisPacket, Offset, 0); + PC(NdisPacket)->DLOffset = Offset; - pNdisPacket = (PNDIS_PACKET*)NdisPacket->u.s3.MacReserved; - *pNdisPacket = NULL; + pNdisPacket = (PNDIS_PACKET*)NdisPacket->u.s3.MacReserved; + *pNdisPacket = NULL; - KeAcquireSpinLock(&LoopLock, &OldIrql); + KeAcquireSpinLock(&LoopQueueLock, &OldIrql); - /* Add packet to transmit queue */ - if (LoopQueueHead) { - /* Transmit queue is not empty */ - pNdisPacket = (PNDIS_PACKET*)LoopQueueTail->u.s3.MacReserved; - *pNdisPacket = NdisPacket; - } else - /* Transmit queue is empty */ - LoopQueueHead = NdisPacket; - - LoopQueueTail = NdisPacket; - - /* If LoopTransmit is not running (or scheduled), schedule it to run */ - if (!LoopBusy) { - LoopBusy = TRUE; - ExQueueWorkItem(&LoopWorkItem, CriticalWorkQueue); + /* Add packet to transmit queue */ + if (LoopQueueHead != NULL) + { + /* Transmit queue is not empty */ + pNdisPacket = (PNDIS_PACKET*)LoopQueueTail->u.s3.MacReserved; + *pNdisPacket = NdisPacket; + } + else + { + /* Transmit queue is empty */ + LoopQueueHead = NdisPacket; } - KeReleaseSpinLock(&LoopLock, OldIrql); + LoopQueueTail = NdisPacket; + + /* If RealTransmit is not running (or scheduled to run) then schedule it to run now */ + if (!LoopBusy) + { + LoopBusy = TRUE; /* The loopback interface is now busy */ + ExQueueWorkItem(&LoopWorkItem, CriticalWorkQueue); + } + + KeReleaseSpinLock(&LoopQueueLock, OldIrql); } - NDIS_STATUS LoopRegisterAdapter( - PNDIS_STRING AdapterName, - PLAN_ADAPTER *Adapter) + PNDIS_STRING AdapterName, + PLAN_ADAPTER *Adapter) /* - * FUNCTION: Registers loopback adapter + * FUNCTION: Registers loopback adapter with the network layer * ARGUMENTS: - * AdapterName = Unused - * Adapter = Unused + * AdapterName = Unused + * Adapter = Unused * RETURNS: - * Status of operation + * Status of operation */ { - PIP_ADDRESS Address; - NDIS_STATUS Status = NDIS_STATUS_SUCCESS; + PIP_ADDRESS Address; + NDIS_STATUS Status; - TI_DbgPrint(MID_TRACE, ("Called.\n")); + Status = NDIS_STATUS_SUCCESS; - Address = AddrBuildIPv4(LOOPBACK_ADDRESS_IPv4); - if (Address) { - LLIP_BIND_INFO BindInfo; + TI_DbgPrint(MID_TRACE, ("Called.\n")); - /* Bind the adapter to IP layer */ - BindInfo.Context = NULL; - BindInfo.HeaderSize = 0; - BindInfo.MinFrameSize = 0; - BindInfo.MTU = 16384; - BindInfo.Address = NULL; - BindInfo.AddressLength = 0; - BindInfo.Transmit = LoopTransmit; + Address = AddrBuildIPv4(LOOPBACK_ADDRESS_IPv4); + if (Address != NULL) + { + LLIP_BIND_INFO BindInfo; - Loopback = IPCreateInterface(&BindInfo); - if ((Loopback) && (IPCreateNTE(Loopback, Address, 8))) { - /* Reference the interface for the NTE. The reference for - the address is just passed on to the NTE */ - ReferenceObject(Loopback); + /* Bind the adapter to network (IP) layer */ + BindInfo.Context = NULL; + BindInfo.HeaderSize = 0; + BindInfo.MinFrameSize = 0; + BindInfo.MTU = 16384; + BindInfo.Address = NULL; + BindInfo.AddressLength = 0; + BindInfo.Transmit = LoopTransmit; - IPRegisterInterface(Loopback); + Loopback = IPCreateInterface(&BindInfo); + if ((Loopback != NULL) && (IPCreateNTE(Loopback, Address, 8))) + { + /* Reference the interface for the NTE. The reference for + the address is just passed on to the NTE */ + ReferenceObject(Loopback); - ExInitializeWorkItem(&LoopWorkItem, RealTransmit, Loopback); + IPRegisterInterface(Loopback); - KeInitializeSpinLock(&LoopLock); - LoopBusy = FALSE; - } else - Status = NDIS_STATUS_RESOURCES; - } else - Status = NDIS_STATUS_RESOURCES; + ExInitializeWorkItem(&LoopWorkItem, RealTransmit, Loopback); - if (!NT_SUCCESS(Status)) - LoopUnregisterAdapter(NULL); + KeInitializeSpinLock(&LoopQueueLock); + LoopBusy = FALSE; + } + else + { + Status = NDIS_STATUS_RESOURCES; + } + } + else + { + Status = NDIS_STATUS_RESOURCES; + } - TI_DbgPrint(MAX_TRACE, ("Leaving.\n")); + if (!NT_SUCCESS(Status)) + { + LoopUnregisterAdapter(NULL); + } - return Status; + TI_DbgPrint(MAX_TRACE, ("Leaving.\n")); + + return Status; } NDIS_STATUS LoopUnregisterAdapter( - PLAN_ADAPTER Adapter) + PLAN_ADAPTER Adapter) /* - * FUNCTION: Unregisters loopback adapter + * FUNCTION: Unregisters loopback adapter with the network layer * ARGUMENTS: - * Adapter = Unused + * Adapter = Unused * RETURNS: - * Status of operation + * Status of operation * NOTES: - * Does not care wether we have registered loopback adapter + * Does not care wether we have registered loopback adapter */ { - TI_DbgPrint(MID_TRACE, ("Called.\n")); + TI_DbgPrint(MID_TRACE, ("Called.\n")); - if (Loopback) { - IPUnregisterInterface(Loopback); - IPDestroyInterface(Loopback); - Loopback = NULL; + if (Loopback != NULL) + { + IPUnregisterInterface(Loopback); + IPDestroyInterface(Loopback); + Loopback = NULL; } - TI_DbgPrint(MAX_TRACE, ("Leaving.\n")); + TI_DbgPrint(MAX_TRACE, ("Leaving.\n")); - return NDIS_STATUS_SUCCESS; + return NDIS_STATUS_SUCCESS; } - -/* EOF */ diff --git a/reactos/drivers/net/tcpip/network/neighbor.c b/reactos/drivers/net/tcpip/network/neighbor.c index d99ef28e929..cf76f3749da 100644 --- a/reactos/drivers/net/tcpip/network/neighbor.c +++ b/reactos/drivers/net/tcpip/network/neighbor.c @@ -23,69 +23,76 @@ NEIGHBOR_CACHE_TABLE NeighborCache[NB_HASHMASK + 1]; VOID FreeNCE( - PVOID Object) + PVOID Object) { - ExFreePool(Object); + ExFreePool(Object); } - VOID NCETimeout( - PNEIGHBOR_CACHE_ENTRY NCE) + PNEIGHBOR_CACHE_ENTRY NCE) /* * FUNCTION: Neighbor cache entry timeout handler * NOTES: - * The neighbor cache lock must be held + * The neighbor cache lock must be held */ { - PNDIS_PACKET NdisPacket, Next; + PNDIS_PACKET NdisPacket; + PNDIS_PACKET NextNdisPacket; - TI_DbgPrint(DEBUG_NCACHE, ("Called. NCE (0x%X).\n", NCE)); + TI_DbgPrint(DEBUG_NCACHE, ("Called. NCE (0x%X).\n", NCE)); - TI_DbgPrint(DEBUG_NCACHE, ("NCE->State is (0x%X).\n", NCE->State)); + TI_DbgPrint(DEBUG_NCACHE, ("NCE->State is (0x%X).\n", NCE->State)); - switch (NCE->State) { - case NUD_INCOMPLETE: + switch (NCE->State) + { + case NUD_INCOMPLETE: /* Retransmission timer expired */ - if (NCE->EventCount++ > MAX_MULTICAST_SOLICIT) { + if (NCE->EventCount++ > MAX_MULTICAST_SOLICIT) + { /* We have retransmitted too many times */ /* Calling IPSendComplete with cache lock held is not - a great thing to do. We don't get here very often - so maybe it's not that big a problem */ + a great thing to do. We don't get here very often + so maybe it's not that big a problem */ /* Flush packet queue */ NdisPacket = NCE->WaitQueue; - while (NdisPacket) { - Next = (PNDIS_PACKET)PC(NdisPacket)->DLComplete; - IPSendComplete((PVOID)NCE->Interface, NdisPacket, - NDIS_STATUS_REQUEST_ABORTED); - NdisPacket = Next; - } + while (NdisPacket != NULL) + { + NextNdisPacket = (PNDIS_PACKET)PC(NdisPacket)->DLComplete; + IPSendComplete((PVOID)NCE->Interface, + NdisPacket, + NDIS_STATUS_REQUEST_ABORTED); + NdisPacket = NextNdisPacket; + } NCE->WaitQueue = NULL; NCE->EventCount = 0; /* Remove route cache entries with references to this NCE. - Remember that neighbor cache lock is taken before - route cache lock */ + Remember that neighbor cache lock is acquired before the + route cache lock */ RouteInvalidateNCE(NCE); - } else + } + else + { /* Retransmit request */ NBSendSolicit(NCE); + } break; - case NUD_DELAY: + case NUD_DELAY: /* FIXME: Delayed state */ TI_DbgPrint(DEBUG_NCACHE, ("NCE delay state.\n")); break; - case NUD_PROBE: + case NUD_PROBE: /* FIXME: Probe state */ TI_DbgPrint(DEBUG_NCACHE, ("NCE probe state.\n")); break; - default: - /* Should not happen since other states don't use the event timer */ + default: + /* Should not happen since the event timer is not used in the other states */ TI_DbgPrint(MIN_TRACE, ("Invalid NCE state (%d).\n", NCE->State)); break; } @@ -111,8 +118,10 @@ VOID NBTimeout( for (NCE = NeighborCache[i].Cache; NCE != NULL; NCE = NCE->Next) { /* Check if event timer is running */ - if (NCE->EventTimer != 0) { - if (--NCE->EventTimer == 0) { + ASSERT(NCE->EventTimer >= 0); + if (NCE->EventTimer > 0) { + NCE->EventTimer--; + if (NCE->EventTimer == 0) { /* Call timeout handler for NCE */ NCETimeout(NCE); } @@ -123,396 +132,414 @@ VOID NBTimeout( } } - VOID NBStartup( - VOID) + VOID) /* * FUNCTION: Starts the neighbor cache */ { - UINT i; + UINT i; - TI_DbgPrint(DEBUG_NCACHE, ("Called.\n")); + TI_DbgPrint(DEBUG_NCACHE, ("Called.\n")); - for (i = 0; i <= NB_HASHMASK; i++) { - NeighborCache[i].Cache = NULL; - KeInitializeSpinLock(&NeighborCache[i].Lock); + for (i = 0; i <= NB_HASHMASK; i++) + { + NeighborCache[i].Cache = NULL; + KeInitializeSpinLock(&NeighborCache[i].Lock); } } - VOID NBShutdown( - VOID) + VOID) /* * FUNCTION: Shuts down the neighbor cache */ { - UINT i; - KIRQL OldIrql; - PNDIS_PACKET NdisPacket, Next; - PNEIGHBOR_CACHE_ENTRY CurNCE, NextNCE; + PNEIGHBOR_CACHE_ENTRY NextNCE; + PNEIGHBOR_CACHE_ENTRY CurNCE; + PNDIS_PACKET NextNdisPacket; + PNDIS_PACKET NdisPacket; + KIRQL OldIrql; + UINT i; - TI_DbgPrint(DEBUG_NCACHE, ("Called.\n")); + TI_DbgPrint(DEBUG_NCACHE, ("Called.\n")); - /* Remove possible entries from the cache */ - for (i = 0; i <= NB_HASHMASK; i++) { - KeAcquireSpinLock(&NeighborCache[i].Lock, &OldIrql); + /* Remove possible entries from the cache */ + for (i = 0; i <= NB_HASHMASK; i++) + { + KeAcquireSpinLock(&NeighborCache[i].Lock, &OldIrql); - CurNCE = NeighborCache[i].Cache; - while (CurNCE) { - NextNCE = CurNCE->Next; + CurNCE = NeighborCache[i].Cache; + while (CurNCE) + { + NextNCE = CurNCE->Next; - /* Remove all references from route cache */ - RouteInvalidateNCE(CurNCE); + /* Remove all references from route cache */ + RouteInvalidateNCE(CurNCE); - /* Flush wait queue */ - NdisPacket = CurNCE->WaitQueue; - while (NdisPacket) { - Next = (PNDIS_PACKET)PC(NdisPacket)->DLComplete; - FreeNdisPacket(NdisPacket); - NdisPacket = Next; + /* Flush wait queue */ + NdisPacket = CurNCE->WaitQueue; + while (NdisPacket) + { + NextNdisPacket = (PNDIS_PACKET)PC(NdisPacket)->DLComplete; + FreeNdisPacket(NdisPacket); + NdisPacket = NextNdisPacket; } #if DBG - if (CurNCE->RefCount != 1) { - TI_DbgPrint(DEBUG_REFCOUNT, ("NCE at (0x%X) has (%d) references (should be 1).\n", CurNCE, CurNCE->RefCount)); + if (CurNCE->RefCount != 1) + { + TI_DbgPrint(DEBUG_REFCOUNT, ("NCE at (0x%X) has (%d) references (should be 1).\n", CurNCE, CurNCE->RefCount)); } #endif - /* Remove reference for being alive */ - DereferenceObject(CurNCE); + /* Remove reference for being alive */ + DereferenceObject(CurNCE); - CurNCE = NextNCE; - } - NeighborCache[i].Cache = NULL; + CurNCE = NextNCE; + } - KeReleaseSpinLock(&NeighborCache[i].Lock, OldIrql); - } + NeighborCache[i].Cache = NULL; - TI_DbgPrint(MAX_TRACE, ("Leaving.\n")); + KeReleaseSpinLock(&NeighborCache[i].Lock, OldIrql); + } + + TI_DbgPrint(MAX_TRACE, ("Leaving.\n")); } - VOID NBSendSolicit( - PNEIGHBOR_CACHE_ENTRY NCE) + PNEIGHBOR_CACHE_ENTRY NCE) /* * FUNCTION: Sends a neighbor solicitation message * ARGUMENTS: - * NCE = Pointer to NCE of neighbor to solicit + * NCE = Pointer to NCE of neighbor to solicit * NOTES: - * May be called with lock held on NCE's table + * May be called with lock held on NCE's table */ { - PLIST_ENTRY CurrentEntry; - PNET_TABLE_ENTRY NTE; + PLIST_ENTRY CurrentEntry; + PNET_TABLE_ENTRY NTE; - TI_DbgPrint(DEBUG_NCACHE, ("Called. NCE (0x%X).\n", NCE)); + TI_DbgPrint(DEBUG_NCACHE, ("Called. NCE (0x%X).\n", NCE)); - if (NCE->State == NUD_INCOMPLETE) { - /* This is the first solicitation of this neighbor. Broadcast - a request for the neighbor */ + if (NCE->State == NUD_INCOMPLETE) + { + /* This is the first solicitation of this neighbor. Broadcast + a request for the neighbor */ - /* FIXME: Choose first NTE. We might want to give an NTE as argument */ - CurrentEntry = NCE->Interface->NTEListHead.Flink; - if (!IsListEmpty(CurrentEntry)) { - NTE = CONTAINING_RECORD(CurrentEntry, NET_TABLE_ENTRY, IFListEntry); - ARPTransmit(NCE->Address, NTE); - } else { - TI_DbgPrint(MIN_TRACE, ("Interface at 0x%X has zero NTE.\n", NCE->Interface)); + /* FIXME: Choose first NTE. We might want to give an NTE as argument */ + CurrentEntry = NCE->Interface->NTEListHead.Flink; + if (!IsListEmpty(CurrentEntry)) + { + NTE = CONTAINING_RECORD(CurrentEntry, NET_TABLE_ENTRY, IFListEntry); + ARPTransmit(NCE->Address, NTE); } - } else { - /* FIXME: Unicast solicitation since we have a cached address */ - TI_DbgPrint(MIN_TRACE, ("Uninplemented unicast solicitation.\n")); + else + { + TI_DbgPrint(MIN_TRACE, ("Interface at 0x%X has zero NTE.\n", NCE->Interface)); + } + } + else + { + /* FIXME: Unicast solicitation since we have a cached address */ + TI_DbgPrint(MIN_TRACE, ("Uninplemented unicast solicitation.\n")); } } - PNEIGHBOR_CACHE_ENTRY NBAddNeighbor( - PIP_INTERFACE Interface, - PIP_ADDRESS Address, - PVOID LinkAddress, - UINT LinkAddressLength, - UCHAR State) + PIP_INTERFACE Interface, + PIP_ADDRESS Address, + PVOID LinkAddress, + UINT LinkAddressLength, + UCHAR State) /* * FUNCTION: Adds a neighbor to the neighbor cache * ARGUMENTS: - * Interface = Pointer to interface - * Address = Pointer to IP address - * LinkAddress = Pointer to link address (may be NULL) - * LinkAddressLength = Length of link address - * State = State of NCE + * Interface = Pointer to interface + * Address = Pointer to IP address + * LinkAddress = Pointer to link address (may be NULL) + * LinkAddressLength = Length of link address + * State = State of NCE * RETURNS: - * Pointer to NCE, NULL there is not enough free resources + * Pointer to NCE, NULL there is not enough free resources * NOTES: - * The NCE if referenced for the caller if created. The NCE retains - * a reference to the IP address if it is created, the caller is - * responsible for providing this reference + * The NCE if referenced for the caller if created. The NCE retains + * a reference to the IP address if it is created, the caller is + * responsible for providing this reference */ { - ULONG HashValue; - KIRQL OldIrql; - PNEIGHBOR_CACHE_ENTRY NCE; + PNEIGHBOR_CACHE_ENTRY NCE; + ULONG HashValue; + KIRQL OldIrql; - TI_DbgPrint(DEBUG_NCACHE, ("Called. Interface (0x%X) Address (0x%X) " - "LinkAddress (0x%X) LinkAddressLength (%d) State (0x%X)\n", - Interface, Address, LinkAddress, LinkAddressLength, State)); + TI_DbgPrint(DEBUG_NCACHE, ("Called. Interface (0x%X) Address (0x%X) " + "LinkAddress (0x%X) LinkAddressLength (%d) State (0x%X)\n", + Interface, Address, LinkAddress, LinkAddressLength, State)); - NCE = ExAllocatePool(NonPagedPool, sizeof(NEIGHBOR_CACHE_ENTRY) + LinkAddressLength); - if (!NCE) { - TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); - return NULL; + NCE = ExAllocatePool(NonPagedPool, sizeof(NEIGHBOR_CACHE_ENTRY) + LinkAddressLength); + if (NCE == NULL) + { + TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); + return NULL; } - INIT_TAG(NCE, TAG('N','C','E',' ')); + INIT_TAG(NCE, TAG('N','C','E',' ')); - /* Initialize NCE free routine */ - NCE->Free = FreeNCE; + /* Initialize NCE free routine */ + NCE->Free = FreeNCE; - /* Reference once for beeing alive and once for the caller */ - NCE->RefCount = 2; - NCE->Interface = Interface; - NCE->Address = Address; - NCE->LinkAddressLength = LinkAddressLength; - NCE->LinkAddress = (PVOID)((ULONG_PTR)NCE + sizeof(NEIGHBOR_CACHE_ENTRY)); - if (LinkAddress) - RtlCopyMemory(NCE->LinkAddress, LinkAddress, LinkAddressLength); - NCE->State = State; - NCE->EventTimer = 0; /* Not in use */ - NCE->WaitQueue = NULL; + /* Reference once for beeing alive and once for the caller */ + NCE->RefCount = 2; + NCE->Interface = Interface; + NCE->Address = Address; + NCE->LinkAddressLength = LinkAddressLength; + NCE->LinkAddress = (PVOID)((ULONG_PTR)NCE + sizeof(NEIGHBOR_CACHE_ENTRY)); + if (LinkAddress != NULL) + { + RtlCopyMemory(NCE->LinkAddress, LinkAddress, LinkAddressLength); + } + NCE->State = State; + NCE->EventTimer = 0; /* Not in use */ + NCE->WaitQueue = NULL; - HashValue = *(PULONG)&Address->Address; - HashValue ^= HashValue >> 16; - HashValue ^= HashValue >> 8; - HashValue ^= HashValue >> 4; - HashValue &= NB_HASHMASK; + HashValue = *(PULONG)&Address->Address; + HashValue ^= HashValue >> 16; + HashValue ^= HashValue >> 8; + HashValue ^= HashValue >> 4; + HashValue &= NB_HASHMASK; - NCE->Table = &NeighborCache[HashValue]; + NCE->Table = &NeighborCache[HashValue]; - KeAcquireSpinLock(&NeighborCache[HashValue].Lock, &OldIrql); + KeAcquireSpinLock(&NeighborCache[HashValue].Lock, &OldIrql); - NCE->Next = NeighborCache[HashValue].Cache; - NeighborCache[HashValue].Cache = NCE; + NCE->Next = NeighborCache[HashValue].Cache; + NeighborCache[HashValue].Cache = NCE; - KeReleaseSpinLock(&NeighborCache[HashValue].Lock, OldIrql); + KeReleaseSpinLock(&NeighborCache[HashValue].Lock, OldIrql); - return NCE; + return NCE; } - VOID NBUpdateNeighbor( - PNEIGHBOR_CACHE_ENTRY NCE, - PVOID LinkAddress, - UCHAR State) + PNEIGHBOR_CACHE_ENTRY NCE, + PVOID LinkAddress, + UCHAR State) /* * FUNCTION: Update link address information in NCE * ARGUMENTS: - * NCE = Pointer to NCE to update - * LinkAddress = Pointer to link address - * State = State of NCE + * NCE = Pointer to NCE to update + * LinkAddress = Pointer to link address + * State = State of NCE * NOTES: - * The link address and state is updated. Any waiting packets are sent + * The link address and state is updated. Any waiting packets are sent */ { - KIRQL OldIrql; - PNDIS_PACKET Current; - PNDIS_PACKET Next; + PNDIS_PACKET Current; + PNDIS_PACKET Next; + KIRQL OldIrql; - TI_DbgPrint(DEBUG_NCACHE, ("Called. NCE (0x%X) LinkAddress (0x%X) State (0x%X).\n", NCE, LinkAddress, State)); + TI_DbgPrint(DEBUG_NCACHE, ("Called. NCE (0x%X) LinkAddress (0x%X) State (0x%X).\n", NCE, LinkAddress, State)); - KeAcquireSpinLock(&NCE->Table->Lock, &OldIrql); + KeAcquireSpinLock(&NCE->Table->Lock, &OldIrql); - RtlCopyMemory(NCE->LinkAddress, LinkAddress, NCE->LinkAddressLength); - NCE->State = State; - Current = NCE->WaitQueue; - NCE->WaitQueue = NULL; + RtlCopyMemory(NCE->LinkAddress, LinkAddress, NCE->LinkAddressLength); + NCE->State = State; + Current = NCE->WaitQueue; + NCE->WaitQueue = NULL; - KeReleaseSpinLock(&NCE->Table->Lock, OldIrql); -#if 1 - /* Send any waiting packets */ - while (Current) { - /* Our link to the next packet is broken by the - datalink layer code so we must save it here */ - Next = (PNDIS_PACKET)PC(Current)->DLComplete; - IPSendFragment(Current, NCE); - Current = Next; + KeReleaseSpinLock(&NCE->Table->Lock, OldIrql); + + /* Send any waiting packets */ + while (Current != NULL) + { + /* Our link to the next packet is broken by the + datalink layer code so we must save it here */ + Next = (PNDIS_PACKET)PC(Current)->DLComplete; + IPSendFragment(Current, NCE); + Current = Next; } -#endif } - PNEIGHBOR_CACHE_ENTRY NBLocateNeighbor( - PIP_ADDRESS Address) + PIP_ADDRESS Address) /* * FUNCTION: Locates a neighbor in the neighbor cache * ARGUMENTS: - * Address = Pointer to IP address + * Address = Pointer to IP address * RETURNS: - * Pointer to NCE, NULL if not found + * Pointer to NCE, NULL if not found * NOTES: - * If the NCE is found, it is referenced. The caller is - * responsible for dereferencing it again after use + * If the NCE is found, it is referenced. The caller is + * responsible for dereferencing it again after use */ { - UINT HashValue; - KIRQL OldIrql; - PNEIGHBOR_CACHE_ENTRY NCE; + PNEIGHBOR_CACHE_ENTRY NCE; + UINT HashValue; + KIRQL OldIrql; - TI_DbgPrint(DEBUG_NCACHE, ("Called. Address (0x%X).\n", Address)); + TI_DbgPrint(DEBUG_NCACHE, ("Called. Address (0x%X).\n", Address)); - HashValue = *(PULONG)&Address->Address; - HashValue ^= HashValue >> 16; - HashValue ^= HashValue >> 8; - HashValue ^= HashValue >> 4; - HashValue &= NB_HASHMASK; + HashValue = *(PULONG)&Address->Address; + HashValue ^= HashValue >> 16; + HashValue ^= HashValue >> 8; + HashValue ^= HashValue >> 4; + HashValue &= NB_HASHMASK; - KeAcquireSpinLock(&NeighborCache[HashValue].Lock, &OldIrql); + KeAcquireSpinLock(&NeighborCache[HashValue].Lock, &OldIrql); - NCE = NeighborCache[HashValue].Cache; + NCE = NeighborCache[HashValue].Cache; - while ((NCE) && (!AddrIsEqual(Address, NCE->Address))) - NCE = NCE->Next; + while ((NCE) && (!AddrIsEqual(Address, NCE->Address))) + { + NCE = NCE->Next; + } - if (NCE) - ReferenceObject(NCE); + if (NCE) + { + ReferenceObject(NCE); + } - KeReleaseSpinLock(&NeighborCache[HashValue].Lock, OldIrql); + KeReleaseSpinLock(&NeighborCache[HashValue].Lock, OldIrql); - TI_DbgPrint(MAX_TRACE, ("Leaving.\n")); + TI_DbgPrint(MAX_TRACE, ("Leaving.\n")); - return NCE; + return NCE; } - PNEIGHBOR_CACHE_ENTRY NBFindOrCreateNeighbor( - PIP_INTERFACE Interface, - PIP_ADDRESS Address) + PIP_INTERFACE Interface, + PIP_ADDRESS Address) /* * FUNCTION: Tries to find a neighbor and if unsuccesful, creates a new NCE * ARGUMENTS: - * Interface = Pointer to interface to use (if NCE is not found) - * Address = Pointer to IP address + * Interface = Pointer to interface to use (in case NCE is not found) + * Address = Pointer to IP address * RETURNS: - * Pointer to NCE, NULL if there is not enough free resources + * Pointer to NCE, NULL if there is not enough free resources * NOTES: - * The NCE is referenced if found or created. The caller is - * responsible for dereferencing it again after use + * The NCE is referenced if found or created. The caller is + * responsible for dereferencing it again after use */ { - PNEIGHBOR_CACHE_ENTRY NCE; + PNEIGHBOR_CACHE_ENTRY NCE; - TI_DbgPrint(DEBUG_NCACHE, ("Called. Interface (0x%X) Address (0x%X).\n", Interface, Address)); + TI_DbgPrint(DEBUG_NCACHE, ("Called. Interface (0x%X) Address (0x%X).\n", Interface, Address)); - NCE = NBLocateNeighbor(Address); - if (!NCE) { - ReferenceObject(Address); - NCE = NBAddNeighbor(Interface, Address, NULL, - Interface->AddressLength, NUD_INCOMPLETE); - NCE->EventTimer = 1; - NCE->EventCount = 0; + NCE = NBLocateNeighbor(Address); + if (NCE == NULL) + { + ReferenceObject(Address); + NCE = NBAddNeighbor(Interface, Address, NULL, + Interface->AddressLength, NUD_INCOMPLETE); + NCE->EventTimer = 1; + NCE->EventCount = 0; } - return NCE; + return NCE; } - BOOLEAN NBQueuePacket( - PNEIGHBOR_CACHE_ENTRY NCE, - PNDIS_PACKET NdisPacket) + PNEIGHBOR_CACHE_ENTRY NCE, + PNDIS_PACKET NdisPacket) /* * FUNCTION: Queues a packet on an NCE for later transmission * ARGUMENTS: - * NCE = Pointer to NCE to queue packet on - * NdisPacket = Pointer to NDIS packet to queue + * NCE = Pointer to NCE to queue packet on + * NdisPacket = Pointer to NDIS packet to queue * RETURNS: - * TRUE if the packet was successfully queued, FALSE if not + * TRUE if the packet was successfully queued, FALSE if not */ { - KIRQL OldIrql; - PKSPIN_LOCK Lock; + PKSPIN_LOCK Lock; + KIRQL OldIrql; - TI_DbgPrint(DEBUG_NCACHE, ("Called. NCE (0x%X) NdisPacket (0x%X).\n", NCE, NdisPacket)); + TI_DbgPrint(DEBUG_NCACHE, ("Called. NCE (0x%X) NdisPacket (0x%X).\n", NCE, NdisPacket)); - /* FIXME: Should we limit the number of queued packets? */ + /* FIXME: Should we limit the number of queued packets? */ - Lock = &NCE->Table->Lock; + Lock = &NCE->Table->Lock; - KeAcquireSpinLock(Lock, &OldIrql); + KeAcquireSpinLock(Lock, &OldIrql); - /* Use data link level completion handler pointer to link - queued packets together */ - PC(NdisPacket)->DLComplete = (PACKET_COMPLETION_ROUTINE)NCE->WaitQueue; - NCE->WaitQueue = NdisPacket; + /* Use data link level completion handler pointer to link + queued packets together */ + PC(NdisPacket)->DLComplete = (PACKET_COMPLETION_ROUTINE)NCE->WaitQueue; + NCE->WaitQueue = NdisPacket; - KeReleaseSpinLock(Lock, OldIrql); + KeReleaseSpinLock(Lock, OldIrql); - return TRUE; + return TRUE; } VOID NBRemoveNeighbor( - PNEIGHBOR_CACHE_ENTRY NCE) + PNEIGHBOR_CACHE_ENTRY NCE) /* * FUNCTION: Removes a neighbor from the neighbor cache * ARGUMENTS: - * NCE = Pointer to NCE to remove from cache + * NCE = Pointer to NCE to remove from cache * NOTES: - * The NCE must be in a safe state + * The NCE must be in a safe state */ { - ULONG HashValue; - KIRQL OldIrql; - PNEIGHBOR_CACHE_ENTRY *PrevNCE; - PNEIGHBOR_CACHE_ENTRY CurNCE; - PNDIS_PACKET NdisPacket, Next; + PNEIGHBOR_CACHE_ENTRY *PrevNCE; + PNEIGHBOR_CACHE_ENTRY CurNCE; + PNDIS_PACKET NextNdisPacket; + PNDIS_PACKET NdisPacket; + ULONG HashValue; + KIRQL OldIrql; - TI_DbgPrint(DEBUG_NCACHE, ("Called. NCE (0x%X).\n", NCE)); + TI_DbgPrint(DEBUG_NCACHE, ("Called. NCE (0x%X).\n", NCE)); - HashValue = *(PULONG)(&NCE->Address->Address); - HashValue ^= HashValue >> 16; - HashValue ^= HashValue >> 8; - HashValue ^= HashValue >> 4; - HashValue &= NB_HASHMASK; + HashValue = *(PULONG)(&NCE->Address->Address); + HashValue ^= HashValue >> 16; + HashValue ^= HashValue >> 8; + HashValue ^= HashValue >> 4; + HashValue &= NB_HASHMASK; - KeAcquireSpinLock(&NeighborCache[HashValue].Lock, &OldIrql); + KeAcquireSpinLock(&NeighborCache[HashValue].Lock, &OldIrql); - /* Search the list and remove the NCE from the list if found */ - for (PrevNCE = &NeighborCache[HashValue].Cache; - (CurNCE = *PrevNCE) != NULL; - PrevNCE = &CurNCE->Next) { - if (CurNCE == NCE) { - /* Found it, now unlink it from the list */ - *PrevNCE = CurNCE->Next; + /* Search the list and remove the NCE from the list if found */ + for (PrevNCE = &NeighborCache[HashValue].Cache; + (CurNCE = *PrevNCE) != NULL; + PrevNCE = &CurNCE->Next) + { + if (CurNCE == NCE) + { + /* Found it, now unlink it from the list */ + *PrevNCE = CurNCE->Next; - /* Purge wait queue */ - NdisPacket = CurNCE->WaitQueue; - while (NdisPacket) { - Next = (PNDIS_PACKET)PC(NdisPacket)->DLComplete; - FreeNdisPacket(NdisPacket); - NdisPacket = Next; + /* Purge wait queue */ + NdisPacket = CurNCE->WaitQueue; + while (NdisPacket != NULL) + { + NextNdisPacket = (PNDIS_PACKET)PC(NdisPacket)->DLComplete; + FreeNdisPacket(NdisPacket); + NdisPacket = NextNdisPacket; } - /* Remove all references from route cache */ - RouteInvalidateNCE(CurNCE); + /* Remove all references from route cache */ + RouteInvalidateNCE(CurNCE); - /* Remove reference to the address */ - DereferenceObject(CurNCE->Address); + /* Remove reference to the address */ + DereferenceObject(CurNCE->Address); #if DBG - CurNCE->RefCount--; + CurNCE->RefCount--; - if (CurNCE->RefCount != 0) { - TI_DbgPrint(DEBUG_REFCOUNT, ("NCE at (0x%X) has (%d) references (should be 0).\n", CurNCE, CurNCE->RefCount)); + if (CurNCE->RefCount != 0) + { + TI_DbgPrint(DEBUG_REFCOUNT, ("NCE at (0x%X) has (%d) references (should be 0).\n", + CurNCE, CurNCE->RefCount)); } #endif - ExFreePool(CurNCE); + ExFreePool(CurNCE); - KeReleaseSpinLock(&NeighborCache[HashValue].Lock, OldIrql); + KeReleaseSpinLock(&NeighborCache[HashValue].Lock, OldIrql); - return; + return; } } - KeReleaseSpinLock(&NeighborCache[HashValue].Lock, OldIrql); + KeReleaseSpinLock(&NeighborCache[HashValue].Lock, OldIrql); } - -/* EOF */ diff --git a/reactos/drivers/net/tcpip/tcpip/info.c b/reactos/drivers/net/tcpip/tcpip/info.c index b24c4f790a4..7a9d95156ef 100644 --- a/reactos/drivers/net/tcpip/tcpip/info.c +++ b/reactos/drivers/net/tcpip/tcpip/info.c @@ -13,81 +13,97 @@ TDI_STATUS IPTdiQueryInformationEx( - PTDI_REQUEST Request, - TDIObjectID *ID, - PNDIS_BUFFER Buffer, - PUINT BufferSize, - PVOID Context) + PTDI_REQUEST Request, + TDIObjectID *ID, + PNDIS_BUFFER Buffer, + PUINT BufferSize, + PVOID Context) /* * FUNCTION: Returns extended information about network layer * ARGUMENTS: - * Request = Pointer to TDI request structure for the request - * ID = TDI object ID - * Buffer = Pointer to buffer with data to use. - * BufferSize = Pointer to buffer with size of Buffer. On return + * Request = Pointer to TDI request structure for the request + * ID = TDI object ID + * Buffer = Pointer to buffer with data to use. + * BufferSize = Pointer to buffer with size of Buffer. On return * this is filled with number of bytes returned - * Context = Pointer to context buffer + * Context = Pointer to context buffer * RETURNS: - * Status of operation + * Status of operation */ { - PLIST_ENTRY CurrentIFEntry; - PLIST_ENTRY CurrentADEEntry; - PIP_INTERFACE CurrentIF; - PADDRESS_ENTRY CurrentADE; - IPADDR_ENTRY IpAddress; - IPSNMP_INFO SnmpInfo; - ULONG Temp; - UINT Count; - ULONG Entity; - KIRQL OldIrql; - UINT BufSize = *BufferSize; + PLIST_ENTRY CurrentIFEntry; + PLIST_ENTRY CurrentADEEntry; + PADDRESS_ENTRY CurrentADE; + PIP_INTERFACE CurrentIF; + IPADDR_ENTRY IpAddress; + IPSNMP_INFO SnmpInfo; + KIRQL OldIrql; + ULONG Entity; + ULONG Temp; + UINT Count; + UINT BufSize; - /* Make return parameters consistent every time */ - *BufferSize = 0; + BufSize = *BufferSize; - Entity = ID->toi_entity.tei_entity; - if (Entity != CL_NL_ENTITY) { - /* We can't handle this entity */ - return TDI_INVALID_PARAMETER; + /* Make return parameters consistent every time */ + *BufferSize = 0; + + Entity = ID->toi_entity.tei_entity; + if (Entity != CL_NL_ENTITY) + { + /* We can't handle this entity */ + return TDI_INVALID_PARAMETER; } - if (ID->toi_entity.tei_instance != TL_INSTANCE) - /* We only support a single instance */ - return TDI_INVALID_REQUEST; - if (ID->toi_class == INFO_CLASS_GENERIC) { - if (ID->toi_type == INFO_TYPE_PROVIDER && - ID->toi_id == ENTITY_TYPE_ID) { + if (ID->toi_entity.tei_instance != TL_INSTANCE) + { + /* Only a single instance is supported */ + return TDI_INVALID_REQUEST; + } - if (BufSize < sizeof(ULONG)) - return TDI_BUFFER_TOO_SMALL; - Temp = CL_NL_IP; + if (ID->toi_class == INFO_CLASS_GENERIC) + { + if ((ID->toi_type == INFO_TYPE_PROVIDER) && + (ID->toi_id == ENTITY_TYPE_ID)) + { + if (BufSize < sizeof(ULONG)) + { + return TDI_BUFFER_TOO_SMALL; + } - Count = CopyBufferToBufferChain(Buffer, 0, (PUCHAR)&Temp, sizeof(ULONG)); + Temp = CL_NL_IP; + Count = CopyBufferToBufferChain(Buffer, 0, (PUCHAR)&Temp, sizeof(ULONG)); - return TDI_SUCCESS; + return TDI_SUCCESS; } - return TDI_INVALID_PARAMETER; + + return TDI_INVALID_PARAMETER; } - if (ID->toi_class == INFO_CLASS_PROTOCOL) { - if (ID->toi_type != INFO_TYPE_PROVIDER) - return TDI_INVALID_PARAMETER; + if (ID->toi_class == INFO_CLASS_PROTOCOL) + { + if (ID->toi_type != INFO_TYPE_PROVIDER) + { + return TDI_INVALID_PARAMETER; + } - switch (ID->toi_id) { - case IP_MIB_ADDRTABLE_ENTRY_ID: + switch (ID->toi_id) + { + case IP_MIB_ADDRTABLE_ENTRY_ID: Temp = 0; KeAcquireSpinLock(&InterfaceListLock, &OldIrql); CurrentIFEntry = InterfaceListHead.Flink; - while (CurrentIFEntry != &InterfaceListHead) { - CurrentIF = CONTAINING_RECORD(CurrentIFEntry, IP_INTERFACE, ListEntry); + while (CurrentIFEntry != &InterfaceListHead) + { + CurrentIF = CONTAINING_RECORD(CurrentIFEntry, IP_INTERFACE, ListEntry); - if (Temp + sizeof(IPADDR_ENTRY) > BufSize) { + if (Temp + sizeof(IPADDR_ENTRY) > BufSize) + { KeReleaseSpinLock(&InterfaceListLock, OldIrql); return TDI_BUFFER_TOO_SMALL; - } + } IpAddress.Addr = 0; IpAddress.BcastAddr = 0; @@ -95,26 +111,29 @@ TDI_STATUS IPTdiQueryInformationEx( /* Locate the diffrent addresses and put them the right place */ CurrentADEEntry = CurrentIF->ADEListHead.Flink; - while (CurrentADEEntry != &CurrentIF->ADEListHead) { - CurrentADE = CONTAINING_RECORD(CurrentADEEntry, ADDRESS_ENTRY, ListEntry); + while (CurrentADEEntry != &CurrentIF->ADEListHead) + { + CurrentADE = CONTAINING_RECORD(CurrentADEEntry, ADDRESS_ENTRY, ListEntry); - switch (CurrentADE->Type) { - case ADE_UNICAST: - IpAddress.Addr = CurrentADE->Address->Address.IPv4Address; - break; - case ADE_MULTICAST: - IpAddress.BcastAddr = CurrentADE->Address->Address.IPv4Address; - break; - case ADE_ADDRMASK: - IpAddress.Mask = CurrentADE->Address->Address.IPv4Address; - break; - default: - /* Should not happen */ - TI_DbgPrint(MIN_TRACE, ("Unknown address entry type (0x%X)\n", CurrentADE->Type)); - break; - } + switch (CurrentADE->Type) + { + case ADE_UNICAST: + IpAddress.Addr = CurrentADE->Address->Address.IPv4Address; + break; + case ADE_MULTICAST: + IpAddress.BcastAddr = CurrentADE->Address->Address.IPv4Address; + break; + case ADE_ADDRMASK: + IpAddress.Mask = CurrentADE->Address->Address.IPv4Address; + break; + default: + /* Should not happen */ + TI_DbgPrint(MIN_TRACE, ("Unknown address entry type (0x%X)\n", CurrentADE->Type)); + break; + } CurrentADEEntry = CurrentADEEntry->Flink; - } + } + /* Pack the address information into IPADDR_ENTRY structure */ IpAddress.Index = 0; IpAddress.ReasmSize = 0; @@ -122,19 +141,20 @@ TDI_STATUS IPTdiQueryInformationEx( IpAddress.Pad = 0; Count = CopyBufferToBufferChain(Buffer, Temp, (PUCHAR)&IpAddress, sizeof(IPADDR_ENTRY)); - Temp += sizeof(IPADDR_ENTRY); CurrentIFEntry = CurrentIFEntry->Flink; - } + } KeReleaseSpinLock(&InterfaceListLock, OldIrql); return TDI_SUCCESS; - case IP_MIB_STATS_ID: + case IP_MIB_STATS_ID: if (BufSize < sizeof(IPSNMP_INFO)) + { return TDI_BUFFER_TOO_SMALL; + } RtlZeroMemory(&SnmpInfo, sizeof(IPSNMP_INFO)); @@ -143,161 +163,189 @@ TDI_STATUS IPTdiQueryInformationEx( KeAcquireSpinLock(&InterfaceListLock, &OldIrql); CurrentIFEntry = InterfaceListHead.Flink; - while (CurrentIFEntry != &InterfaceListHead) { - CurrentIF = CONTAINING_RECORD(CurrentIFEntry, IP_INTERFACE, ListEntry); - Count++; - CurrentIFEntry = CurrentIFEntry->Flink; - } + while (CurrentIFEntry != &InterfaceListHead) + { + CurrentIF = CONTAINING_RECORD(CurrentIFEntry, IP_INTERFACE, ListEntry); + Count++; + CurrentIFEntry = CurrentIFEntry->Flink; + } KeReleaseSpinLock(&InterfaceListLock, OldIrql); SnmpInfo.NumAddr = Count; - Count = CopyBufferToBufferChain(Buffer, 0, (PUCHAR)&SnmpInfo, sizeof(IPSNMP_INFO)); return TDI_SUCCESS; - default: + default: /* We can't handle this ID */ return TDI_INVALID_PARAMETER; } } - return TDI_INVALID_PARAMETER; + return TDI_INVALID_PARAMETER; } - TDI_STATUS InfoTdiQueryInformationEx( - PTDI_REQUEST Request, - TDIObjectID *ID, - PNDIS_BUFFER Buffer, - PUINT BufferSize, - PVOID Context) + PTDI_REQUEST Request, + TDIObjectID *ID, + PNDIS_BUFFER Buffer, + PUINT BufferSize, + PVOID Context) /* * FUNCTION: Returns extended information * ARGUMENTS: - * Request = Pointer to TDI request structure for the request - * ID = TDI object ID - * Buffer = Pointer to buffer with data to use - * BufferSize = Pointer to buffer with size of Buffer. On return - * this is filled with number of bytes returned - * Context = Pointer to context buffer + * Request = Pointer to TDI request structure for the request + * ID = TDI object ID + * Buffer = Pointer to buffer with data to use + * BufferSize = Pointer to buffer with size of Buffer. On return + * this is filled with number of bytes returned + * Context = Pointer to context buffer * RETURNS: - * Status of operation + * Status of operation */ { - PLIST_ENTRY CurrentADFEntry; - PADDRESS_FILE CurrentADF; - ADDRESS_INFO Info; - KIRQL OldIrql; - UINT Entity; - UINT Count; - UINT Size; - ULONG Temp; - UINT Offset = 0; - UINT BufSize = *BufferSize; + PLIST_ENTRY CurrentADFEntry; + PADDRESS_FILE CurrentADF; + ADDRESS_INFO Info; + KIRQL OldIrql; + UINT BufSize; + UINT Entity; + UINT Offset; + ULONG Temp; + UINT Count; + UINT Size; - /* Check wether it is a query for a list of entities */ - Entity = ID->toi_entity.tei_entity; - if (Entity == GENERIC_ENTITY) { - if (ID->toi_class != INFO_CLASS_GENERIC || - ID->toi_type != INFO_TYPE_PROVIDER || - ID->toi_id != ENTITY_LIST_ID) - return TDI_INVALID_PARAMETER; + Offset = 0; + BufSize = *BufferSize; - *BufferSize = 0; + /* Check wether it is a query for a list of entities */ + Entity = ID->toi_entity.tei_entity; + if (Entity == GENERIC_ENTITY) + { + if ((ID->toi_class != INFO_CLASS_GENERIC) || + (ID->toi_type != INFO_TYPE_PROVIDER) || + (ID->toi_id != ENTITY_LIST_ID)) + { + return TDI_INVALID_PARAMETER; + } - Size = EntityCount * sizeof(TDIEntityID); - if (BufSize < Size) - /* The buffer is too small to contain requested data */ - return TDI_BUFFER_TOO_SMALL; + *BufferSize = 0; - /* Return entity list */ - Count = CopyBufferToBufferChain(Buffer, 0, (PUCHAR)EntityList, Size); + Size = EntityCount * sizeof(TDIEntityID); + if (BufSize < Size) + { + /* The buffer is too small to contain requested data */ + return TDI_BUFFER_TOO_SMALL; + } - *BufferSize = Size; + /* Return entity list */ + Count = CopyBufferToBufferChain(Buffer, 0, (PUCHAR)EntityList, Size); - return TDI_SUCCESS; + *BufferSize = Size; + + return TDI_SUCCESS; } - if ((Entity != CL_TL_ENTITY) && (Entity != CO_TL_ENTITY)) { + if ((Entity != CL_TL_ENTITY) && (Entity != CO_TL_ENTITY)) + { /* We can't handle this entity, pass it on */ return IPTdiQueryInformationEx( - Request, ID, Buffer, BufferSize, Context); - } + Request, ID, Buffer, BufferSize, Context); + } /* Make return parameters consistent every time */ *BufferSize = 0; if (ID->toi_entity.tei_instance != TL_INSTANCE) + { /* We only support a single instance */ return TDI_INVALID_REQUEST; + } - if (ID->toi_class == INFO_CLASS_GENERIC) { - - if (ID->toi_type != INFO_TYPE_PROVIDER || - ID->toi_id != ENTITY_TYPE_ID) + if (ID->toi_class == INFO_CLASS_GENERIC) + { + if ((ID->toi_type != INFO_TYPE_PROVIDER) || + (ID->toi_id != ENTITY_TYPE_ID)) return TDI_INVALID_PARAMETER; if (BufSize < sizeof(ULONG)) + { return TDI_BUFFER_TOO_SMALL; + } if (Entity == CL_TL_ENTITY) + { Temp = CL_TL_UDP; + } else if (Entity == CO_TL_ENTITY) + { Temp = CO_TL_TCP; + } else + { return TDI_INVALID_PARAMETER; + } Count = CopyBufferToBufferChain(Buffer, 0, (PUCHAR)&Temp, sizeof(ULONG)); return TDI_SUCCESS; } - if (ID->toi_class == INFO_CLASS_PROTOCOL) { + if (ID->toi_class == INFO_CLASS_PROTOCOL) + { + if (ID->toi_type != INFO_TYPE_PROVIDER) + { + return TDI_INVALID_PARAMETER; + } - if (ID->toi_type != INFO_TYPE_PROVIDER) - return TDI_INVALID_PARAMETER; - - switch (ID->toi_id) { - case UDP_MIB_STAT_ID: + switch (ID->toi_id) + { + case UDP_MIB_STAT_ID: if (Entity != CL_TL_ENTITY) + { return TDI_INVALID_PARAMETER; + } if (BufSize < sizeof(UDPStats)) + { return TDI_BUFFER_TOO_SMALL; + } Count = CopyBufferToBufferChain(Buffer, 0, (PUCHAR)&UDPStats, sizeof(UDP_STATISTICS)); return TDI_SUCCESS; - case UDP_MIB_TABLE_ID: + case UDP_MIB_TABLE_ID: if (Entity != CL_TL_ENTITY) + { return TDI_INVALID_PARAMETER; + } Offset = 0; KeAcquireSpinLock(&AddressFileListLock, &OldIrql); CurrentADFEntry = AddressFileListHead.Flink; - while (CurrentADFEntry != &AddressFileListHead) { - CurrentADF = CONTAINING_RECORD(CurrentADFEntry, ADDRESS_FILE, ListEntry); + while (CurrentADFEntry != &AddressFileListHead) + { + CurrentADF = CONTAINING_RECORD(CurrentADFEntry, ADDRESS_FILE, ListEntry); - if (Offset + sizeof(ADDRESS_INFO) > BufSize) { + if (Offset + sizeof(ADDRESS_INFO) > BufSize) + { KeReleaseSpinLock(&AddressFileListLock, OldIrql); *BufferSize = Offset; return TDI_BUFFER_OVERFLOW; - } + } Info.LocalAddress = CurrentADF->ADE->Address->Address.IPv4Address; - Info.LocalPort = CurrentADF->Port; + Info.LocalPort = CurrentADF->Port; Count = CopyBufferToBufferChain(Buffer, Offset, (PUCHAR)&Info, sizeof(ADDRESS_INFO)); - Offset += Count; CurrentADFEntry = CurrentADFEntry->Flink; - } + } KeReleaseSpinLock(&AddressFileListLock, OldIrql); @@ -305,7 +353,7 @@ TDI_STATUS InfoTdiQueryInformationEx( return STATUS_SUCCESS; - default: + default: /* We can't handle this ID */ return TDI_INVALID_PARAMETER; } @@ -314,26 +362,23 @@ TDI_STATUS InfoTdiQueryInformationEx( return TDI_INVALID_PARAMETER; } - TDI_STATUS InfoTdiSetInformationEx( - PTDI_REQUEST Request, - TDIObjectID *ID, - PVOID Buffer, - UINT BufferSize) + PTDI_REQUEST Request, + TDIObjectID *ID, + PVOID Buffer, + UINT BufferSize) /* * FUNCTION: Sets extended information * ARGUMENTS: - * Request = Pointer to TDI request structure for the request - * ID = Pointer to TDI object ID - * Buffer = Pointer to buffer with data to use - * BufferSize = Size of Buffer + * Request = Pointer to TDI request structure for the request + * ID = Pointer to TDI object ID + * Buffer = Pointer to buffer with data to use + * BufferSize = Size of Buffer * RETURNS: - * Status of operation + * Status of operation */ { - /* FIXME: Set extended information */ + /* FIXME: Set extended information */ - return TDI_INVALID_REQUEST; + return TDI_INVALID_REQUEST; } - -/* EOF */ diff --git a/reactos/drivers/net/tcpip/transport/datagram/datagram.c b/reactos/drivers/net/tcpip/transport/datagram/datagram.c index 7c3a6892394..64d95d841c9 100644 --- a/reactos/drivers/net/tcpip/transport/datagram/datagram.c +++ b/reactos/drivers/net/tcpip/transport/datagram/datagram.c @@ -46,38 +46,46 @@ VOID DatagramWorker( KeAcquireSpinLock(&DGPendingListLock, &OldIrql1); CurrentADFEntry = DGPendingListHead.Flink; - while (CurrentADFEntry != &DGPendingListHead) { - RemoveEntryList(CurrentADFEntry); - CurrentADF = CONTAINING_RECORD(CurrentADFEntry, - ADDRESS_FILE, - ListEntry); + while (CurrentADFEntry != &DGPendingListHead) + { + RemoveEntryList(CurrentADFEntry); + CurrentADF = CONTAINING_RECORD(CurrentADFEntry, + ADDRESS_FILE, + ListEntry); - KeAcquireSpinLock(&CurrentADF->Lock, &OldIrql2); + KeAcquireSpinLock(&CurrentADF->Lock, &OldIrql2); - if (AF_IS_BUSY(CurrentADF)) { - /* The send worker function is already running so we just - set the pending send flag on the address file object */ + if (AF_IS_BUSY(CurrentADF)) + { + /* The send worker function is already running so we just + set the pending send flag on the address file object */ - AF_SET_PENDING(CurrentADF, AFF_SEND); - KeReleaseSpinLock(&CurrentADF->Lock, OldIrql2); - } else { - if (!IsListEmpty(&CurrentADF->TransmitQueue)) { - /* The transmit queue is not empty. Dequeue a send - request and process it */ + AF_SET_PENDING(CurrentADF, AFF_SEND); + KeReleaseSpinLock(&CurrentADF->Lock, OldIrql2); + } + else + { + if (!IsListEmpty(&CurrentADF->TransmitQueue)) + { + /* The transmit queue is not empty. Dequeue a send + request and process it */ - CurrentSREntry = RemoveHeadList(&CurrentADF->TransmitQueue); - CurrentSR = CONTAINING_RECORD(CurrentADFEntry, - DATAGRAM_SEND_REQUEST, - ListEntry); + CurrentSREntry = RemoveHeadList(&CurrentADF->TransmitQueue); + CurrentSR = CONTAINING_RECORD(CurrentADFEntry, + DATAGRAM_SEND_REQUEST, + ListEntry); - KeReleaseSpinLock(&CurrentADF->Lock, OldIrql2); + KeReleaseSpinLock(&CurrentADF->Lock, OldIrql2); - DGSend(CurrentADF, CurrentSR); - } else - KeReleaseSpinLock(&CurrentADF->Lock, OldIrql2); + DGSend(CurrentADF, CurrentSR); + } + else + { + KeReleaseSpinLock(&CurrentADF->Lock, OldIrql2); + } + } + CurrentADFEntry = CurrentADFEntry->Flink; } - CurrentADFEntry = CurrentADFEntry->Flink; - } KeReleaseSpinLock(&DGPendingListLock, OldIrql1); @@ -160,9 +168,12 @@ VOID DGSend( TI_DbgPrint(MAX_TRACE, ("Called.\n")); + ASSERT(SendRequest->Build); + /* Get the information we need from the address file now so we minimize the time we hold the spin lock */ KeAcquireSpinLock(&AddrFile->Lock, &OldIrql); + ASSERT(AddrFile->ADE); LocalPort = AddrFile->Port; ADE = AddrFile->ADE; ReferenceObject(ADE); @@ -170,64 +181,72 @@ VOID DGSend( /* Loop until there are no more send requests in the transmit queue or until we run out of resources */ - for (;;) { - Status = (*SendRequest->Build)(SendRequest, ADE->Address, LocalPort, &IPPacket); - if (!NT_SUCCESS(Status)) { - KeAcquireSpinLock(&AddrFile->Lock, &OldIrql); - /* An error occurred, enqueue the send request again and return */ - InsertTailList(&AddrFile->TransmitQueue, &SendRequest->ListEntry); - DereferenceObject(ADE); - KeReleaseSpinLock(&AddrFile->Lock, OldIrql); + for (;;) + { + Status = (*SendRequest->Build)(SendRequest, ADE->Address, LocalPort, &IPPacket); + if (!NT_SUCCESS(Status)) + { + KeAcquireSpinLock(&AddrFile->Lock, &OldIrql); + /* An error occurred, enqueue the send request again and return */ + InsertHeadList(&AddrFile->TransmitQueue, &SendRequest->ListEntry); + DereferenceObject(ADE); + KeReleaseSpinLock(&AddrFile->Lock, OldIrql); + + TI_DbgPrint(MIN_TRACE, ("Leaving (insufficient resources).\n")); + return; + } - TI_DbgPrint(MIN_TRACE, ("Leaving (insufficient resources).\n")); - return; - } - - /* Get a route to the destination address */ - if (RouteGetRouteToDestination(SendRequest->RemoteAddress, ADE->NTE, &RCN) == IP_SUCCESS) { - /* Set completion routine and send the packet */ - PC(IPPacket->NdisPacket)->Complete = SendDatagramComplete; - PC(IPPacket->NdisPacket)->Context = SendRequest; - if (IPSendDatagram(IPPacket, RCN) != STATUS_SUCCESS) - SendDatagramComplete( - SendRequest, + /* Get a route to the destination address */ + if (RouteGetRouteToDestination(SendRequest->RemoteAddress, ADE->NTE, &RCN) == IP_SUCCESS) + { + /* Set completion routine and send the packet */ + PC(IPPacket->NdisPacket)->Complete = SendDatagramComplete; + PC(IPPacket->NdisPacket)->Context = SendRequest; + if (IPSendDatagram(IPPacket, RCN) != STATUS_SUCCESS) + { + SendDatagramComplete(SendRequest, + IPPacket->NdisPacket, + NDIS_STATUS_REQUEST_ABORTED); + } + /* We're done with the RCN */ + DereferenceObject(RCN); + } + else + { + /* No route to destination */ + /* FIXME: Which error code should we use here? */ + TI_DbgPrint(MIN_TRACE, ("No route to destination address (0x%X).\n", + SendRequest->RemoteAddress->Address.IPv4Address)); + SendDatagramComplete(SendRequest, IPPacket->NdisPacket, NDIS_STATUS_REQUEST_ABORTED); - /* We're done with the RCN */ - DereferenceObject(RCN); - } else { - /* No route to destination */ - /* FIXME: Which error code should we use here? */ - TI_DbgPrint(MIN_TRACE, ("No route to destination address (0x%X).\n", - SendRequest->RemoteAddress->Address.IPv4Address)); - SendDatagramComplete( - SendRequest, - IPPacket->NdisPacket, - NDIS_STATUS_REQUEST_ABORTED); + } + + (*IPPacket->Free)(IPPacket); + + /* Check transmit queue for more to send */ + + KeAcquireSpinLock(&AddrFile->Lock, &OldIrql); + + if (!IsListEmpty(&AddrFile->TransmitQueue)) + { + /* Transmit queue is not empty, process one more request */ + CurrentEntry = RemoveHeadList(&AddrFile->TransmitQueue); + SendRequest = CONTAINING_RECORD(CurrentEntry, DATAGRAM_SEND_REQUEST, ListEntry); + + KeReleaseSpinLock(&AddrFile->Lock, OldIrql); + } + else + { + /* Transmit queue is empty */ + AF_CLR_PENDING(AddrFile, AFF_SEND); + DereferenceObject(ADE); + KeReleaseSpinLock(&AddrFile->Lock, OldIrql); + + TI_DbgPrint(MAX_TRACE, ("Leaving (empty queue).\n")); + return; + } } - - (*IPPacket->Free)(IPPacket); - - /* Check transmit queue for more to send */ - - KeAcquireSpinLock(&AddrFile->Lock, &OldIrql); - - if (!IsListEmpty(&AddrFile->TransmitQueue)) { - /* Transmit queue is not empty, process one more request */ - CurrentEntry = RemoveHeadList(&AddrFile->TransmitQueue); - SendRequest = CONTAINING_RECORD(CurrentEntry, DATAGRAM_SEND_REQUEST, ListEntry); - - KeReleaseSpinLock(&AddrFile->Lock, OldIrql); - } else { - /* Transmit queue is empty */ - AF_CLR_PENDING(AddrFile, AFF_SEND); - DereferenceObject(ADE); - KeReleaseSpinLock(&AddrFile->Lock, OldIrql); - - TI_DbgPrint(MAX_TRACE, ("Leaving (empty queue).\n")); - return; - } - } } @@ -264,95 +283,109 @@ VOID DGDeliverData( KeAcquireSpinLock(&AddrFile->Lock, &OldIrql); - if (AddrFile->Protocol == IPPROTO_UDP) { - DataBuffer = IPPacket->Data; - } else { - /* Give client the IP header too if it is a raw IP file object */ - DataBuffer = IPPacket->Header; - } - - if (!IsListEmpty(&AddrFile->ReceiveQueue)) { - PLIST_ENTRY CurrentEntry; - PDATAGRAM_RECEIVE_REQUEST Current; - BOOLEAN Found; - - TI_DbgPrint(MAX_TRACE, ("There is a receive request.\n")); - - /* Search receive request list to find a match */ - Found = FALSE; - CurrentEntry = AddrFile->ReceiveQueue.Flink; - while ((CurrentEntry != &AddrFile->ReceiveQueue) && (!Found)) { - Current = CONTAINING_RECORD(CurrentEntry, DATAGRAM_RECEIVE_REQUEST, ListEntry); - if (!Current->RemoteAddress) - Found = TRUE; - else if (AddrIsEqual(Address, Current->RemoteAddress)) - Found = TRUE; - - if (Found) { - /* FIXME: Maybe we should check if the buffer of this - receive request is large enough and if not, search - for another */ - - /* Remove the request from the queue */ - RemoveEntryList(&Current->ListEntry); - AddrFile->RefCount--; - break; - } - CurrentEntry = CurrentEntry->Flink; + if (AddrFile->Protocol == IPPROTO_UDP) + { + DataBuffer = IPPacket->Data; + } + else + { + /* Give client the IP header too if it is a raw IP file object */ + DataBuffer = IPPacket->Header; } - KeReleaseSpinLock(&AddrFile->Lock, OldIrql); + if (!IsListEmpty(&AddrFile->ReceiveQueue)) + { + PLIST_ENTRY CurrentEntry; + PDATAGRAM_RECEIVE_REQUEST Current; + BOOLEAN Found; + + TI_DbgPrint(MAX_TRACE, ("There is a receive request.\n")); + + /* Search receive request list to find a match */ + Found = FALSE; + CurrentEntry = AddrFile->ReceiveQueue.Flink; + while ((CurrentEntry != &AddrFile->ReceiveQueue) && (!Found)) + { + Current = CONTAINING_RECORD(CurrentEntry, DATAGRAM_RECEIVE_REQUEST, ListEntry); + if (!Current->RemoteAddress) + Found = TRUE; + else if (AddrIsEqual(Address, Current->RemoteAddress)) + Found = TRUE; + + if (Found) + { + /* FIXME: Maybe we should check if the buffer of this + receive request is large enough and if not, search + for another */ + + /* Remove the request from the queue */ + RemoveEntryList(&Current->ListEntry); + AddrFile->RefCount--; + break; + } + CurrentEntry = CurrentEntry->Flink; + } - if (Found) { - TI_DbgPrint(MAX_TRACE, ("Suitable receive request found.\n")); + KeReleaseSpinLock(&AddrFile->Lock, OldIrql); + + if (Found) + { + TI_DbgPrint(MAX_TRACE, ("Suitable receive request found.\n")); + + /* Copy the data into buffer provided by the user */ + CopyBufferToBufferChain(Current->Buffer, + 0, + DataBuffer, + DataSize); + + /* Complete the receive request */ + (*Current->Complete)(Current->Context, STATUS_SUCCESS, DataSize); + + /* Finally free the receive request */ + if (Current->RemoteAddress) + { + DereferenceObject(Current->RemoteAddress); + } + ExFreePool(Current); + } + } + else if (AddrFile->RegisteredReceiveDatagramHandler) + { + TI_DbgPrint(MAX_TRACE, ("Calling receive event handler.\n")); - /* Copy the data into buffer provided by the user */ - CopyBufferToBufferChain( - Current->Buffer, + ReceiveHandler = AddrFile->ReceiveDatagramHandler; + HandlerContext = AddrFile->ReceiveDatagramHandlerContext; + + KeReleaseSpinLock(&AddrFile->Lock, OldIrql); + + if (Address->Type == IP_ADDRESS_V4) + { + AddressLength = sizeof(IPv4_RAW_ADDRESS); + SourceAddress = &Address->Address.IPv4Address; + } + else /* (Address->Type == IP_ADDRESS_V6) */ + { + AddressLength = sizeof(IPv6_RAW_ADDRESS); + SourceAddress = Address->Address.IPv6Address; + } + + Status = (*ReceiveHandler)(HandlerContext, + AddressLength, + SourceAddress, 0, + NULL, + TDI_RECEIVE_ENTIRE_MESSAGE, + DataSize, + DataSize, + &BytesTaken, DataBuffer, - DataSize); - - /* Complete the receive request */ - (*Current->Complete)(Current->Context, STATUS_SUCCESS, DataSize); - - /* Finally free the receive request */ - if (Current->RemoteAddress) - DereferenceObject(Current->RemoteAddress); - ExFreePool(Current); + NULL); } - } else if (AddrFile->RegisteredReceiveDatagramHandler) { - TI_DbgPrint(MAX_TRACE, ("Calling receive event handler.\n")); - - ReceiveHandler = AddrFile->ReceiveDatagramHandler; - HandlerContext = AddrFile->ReceiveDatagramHandlerContext; - - KeReleaseSpinLock(&AddrFile->Lock, OldIrql); - - if (Address->Type == IP_ADDRESS_V4) { - AddressLength = sizeof(IPv4_RAW_ADDRESS); - SourceAddress = &Address->Address.IPv4Address; - } else /* (Address->Type == IP_ADDRESS_V6) */ { - AddressLength = sizeof(IPv6_RAW_ADDRESS); - SourceAddress = Address->Address.IPv6Address; + else + { + TI_DbgPrint(MAX_TRACE, ("Discarding datagram.\n")); } - Status = (*ReceiveHandler)( - HandlerContext, - AddressLength, - SourceAddress, - 0, - NULL, - TDI_RECEIVE_ENTIRE_MESSAGE, - DataSize, - DataSize, - &BytesTaken, - DataBuffer, - NULL); - } else { - TI_DbgPrint(MAX_TRACE, ("Discarding datagram.\n")); - } - TI_DbgPrint(MAX_TRACE, ("Leaving.\n")); } @@ -378,28 +411,33 @@ VOID DGCancelSendRequest( /* Search the request list for the specified request and remove it */ CurrentEntry = AddrFile->TransmitQueue.Flink; - while ((CurrentEntry != &AddrFile->TransmitQueue) && (!Found)) { - Current = CONTAINING_RECORD(CurrentEntry, DATAGRAM_SEND_REQUEST, ListEntry); - if (Context == Current->Context) { - /* We've found the request, now remove it from the queue */ - RemoveEntryList(CurrentEntry); - AddrFile->RefCount--; - Found = TRUE; - break; + while ((CurrentEntry != &AddrFile->TransmitQueue) && (!Found)) + { + Current = CONTAINING_RECORD(CurrentEntry, DATAGRAM_SEND_REQUEST, ListEntry); + if (Context == Current->Context) + { + /* We've found the request, now remove it from the queue */ + RemoveEntryList(CurrentEntry); + AddrFile->RefCount--; + Found = TRUE; + break; + } + CurrentEntry = CurrentEntry->Flink; } - CurrentEntry = CurrentEntry->Flink; - } KeReleaseSpinLock(&AddrFile->Lock, OldIrql); - if (Found) { - /* Complete the request and free its resources */ - (*Current->Complete)(Current->Context, STATUS_CANCELLED, 0); - DereferenceObject(Current->RemoteAddress); - ExFreePool(Current); - } else { - TI_DbgPrint(MID_TRACE, ("Cannot find send request.\n")); - } + if (Found) + { + /* Complete the request and free its resources */ + (*Current->Complete)(Current->Context, STATUS_CANCELLED, 0); + DereferenceObject(Current->RemoteAddress); + ExFreePool(Current); + } + else + { + TI_DbgPrint(MID_TRACE, ("Cannot find send request.\n")); + } } @@ -424,31 +462,39 @@ VOID DGCancelReceiveRequest( /* Search the request list for the specified request and remove it */ CurrentEntry = AddrFile->ReceiveQueue.Flink; - while ((CurrentEntry != &AddrFile->ReceiveQueue) && (!Found)) { - Current = CONTAINING_RECORD(CurrentEntry, DATAGRAM_RECEIVE_REQUEST, ListEntry); - if (Context == Current->Context) { - /* We've found the request, now remove it from the queue */ - RemoveEntryList(CurrentEntry); - AddrFile->RefCount--; - Found = TRUE; - break; + while ((CurrentEntry != &AddrFile->ReceiveQueue) && (!Found)) + { + Current = CONTAINING_RECORD(CurrentEntry, DATAGRAM_RECEIVE_REQUEST, ListEntry); + if (Context == Current->Context) + { + /* We've found the request, now remove it from the queue */ + RemoveEntryList(CurrentEntry); + AddrFile->RefCount--; + Found = TRUE; + break; + } + CurrentEntry = CurrentEntry->Flink; } - CurrentEntry = CurrentEntry->Flink; - } KeReleaseSpinLock(&AddrFile->Lock, OldIrql); - if (Found) { - /* Complete the request and free its resources */ - (*Current->Complete)(Current->Context, STATUS_CANCELLED, 0); - /* Remote address can be NULL if the caller wants to receive - packets sent from any address */ - if (Current->RemoteAddress) - DereferenceObject(Current->RemoteAddress); - ExFreePool(Current); - } else { - TI_DbgPrint(MID_TRACE, ("Cannot find receive request.\n")); - } + if (Found) + { + /* Complete the request and free its resources */ + (*Current->Complete)(Current->Context, STATUS_CANCELLED, 0); + + /* Remote address can be NULL if the caller wants to receive + packets sent from any address */ + if (Current->RemoteAddress) + { + DereferenceObject(Current->RemoteAddress); + } + ExFreePool(Current); + } + else + { + TI_DbgPrint(MID_TRACE, ("Cannot find receive request.\n")); + } } @@ -465,32 +511,25 @@ NTSTATUS DGTransmit( */ { KIRQL OldIrql; -CP + KeAcquireSpinLock(&AddressFile->Lock, &OldIrql); -CP - if (AF_IS_BUSY(AddressFile)) { -CP - /* Queue send request on the transmit queue */ - InsertTailList(&AddressFile->TransmitQueue, &SendRequest->ListEntry); -CP - /* Reference address file and set pending send request flag */ - ReferenceObject(AddressFile); -CP - AF_SET_PENDING(AddressFile, AFF_SEND); -CP - KeReleaseSpinLock(&AddressFile->Lock, OldIrql); -CP - TI_DbgPrint(MAX_TRACE, ("Leaving (queued).\n")); - } else { -CP - KeReleaseSpinLock(&AddressFile->Lock, OldIrql); -CP - /* Send the datagram */ - DGSend(AddressFile, SendRequest); -CP - TI_DbgPrint(MAX_TRACE, ("Leaving (pending).\n")); - } -CP + if (AF_IS_BUSY(AddressFile)) + { + /* Queue send request on the transmit queue */ + InsertTailList(&AddressFile->TransmitQueue, &SendRequest->ListEntry); + /* Reference address file and set pending send request flag */ + ReferenceObject(AddressFile); + AF_SET_PENDING(AddressFile, AFF_SEND); + KeReleaseSpinLock(&AddressFile->Lock, OldIrql); + TI_DbgPrint(MAX_TRACE, ("Leaving (queued).\n")); + } + else + { + KeReleaseSpinLock(&AddressFile->Lock, OldIrql); + /* Send the datagram */ + DGSend(AddressFile, SendRequest); + TI_DbgPrint(MAX_TRACE, ("Leaving (pending).\n")); + } return STATUS_PENDING; } @@ -523,34 +562,43 @@ NTSTATUS DGSendDatagram( KeAcquireSpinLock(&AddrFile->Lock, &OldIrql); - if (AF_IS_VALID(AddrFile)) { - /* Initialize a send request */ - Status = BuildDatagramSendRequest( - &SendRequest, - NULL, - 0, - Buffer, - DataSize, - Request->RequestNotifyObject, - Request->RequestContext, - Build, - 0); - if (NT_SUCCESS(Status)) { - Status = AddrGetAddress( - ConnInfo->RemoteAddress, - &SendRequest->RemoteAddress, - &SendRequest->RemotePort, - &AddrFile->AddrCache); - if (NT_SUCCESS(Status)) { - KeReleaseSpinLock(&AddrFile->Lock, OldIrql); - return DGTransmit(AddrFile, SendRequest); - } else { - ExFreePool(SendRequest); - } - } else - Status = STATUS_INSUFFICIENT_RESOURCES; - } else - Status = STATUS_ADDRESS_CLOSED; + if (AF_IS_VALID(AddrFile)) + { + /* Initialize a send request */ + Status = BuildDatagramSendRequest(&SendRequest, + NULL, + 0, + Buffer, + DataSize, + Request->RequestNotifyObject, + Request->RequestContext, + Build, + 0); + if (NT_SUCCESS(Status)) + { + Status = AddrGetAddress(ConnInfo->RemoteAddress, + &SendRequest->RemoteAddress, + &SendRequest->RemotePort, + &AddrFile->AddrCache); + if (NT_SUCCESS(Status)) + { + KeReleaseSpinLock(&AddrFile->Lock, OldIrql); + return DGTransmit(AddrFile, SendRequest); + } + else + { + ExFreePool(SendRequest); + } + } + else + { + Status = STATUS_INSUFFICIENT_RESOURCES; + } + } + else + { + Status = STATUS_ADDRESS_CLOSED; + } KeReleaseSpinLock(&AddrFile->Lock, OldIrql); @@ -595,50 +643,62 @@ NTSTATUS DGReceiveDatagram( KeAcquireSpinLock(&AddrFile->Lock, &OldIrql); - if (AF_IS_VALID(AddrFile)) { - ReceiveRequest = ExAllocatePool(NonPagedPool, sizeof(DATAGRAM_RECEIVE_REQUEST)); - if (ReceiveRequest) { - /* Initialize a receive request */ - - /* Extract the remote address filter from the request (if any) */ - if (((ConnInfo->RemoteAddressLength != 0)) && (ConnInfo->RemoteAddress)) { - Status = AddrGetAddress(ConnInfo->RemoteAddress, - &ReceiveRequest->RemoteAddress, - &ReceiveRequest->RemotePort, - &AddrFile->AddrCache); - if (!NT_SUCCESS(Status)) { + if (AF_IS_VALID(AddrFile)) + { + ReceiveRequest = ExAllocatePool(NonPagedPool, sizeof(DATAGRAM_RECEIVE_REQUEST)); + if (ReceiveRequest) + { + /* Initialize a receive request */ + + /* Extract the remote address filter from the request (if any) */ + if (((ConnInfo->RemoteAddressLength != 0)) && (ConnInfo->RemoteAddress)) + { + Status = AddrGetAddress(ConnInfo->RemoteAddress, + &ReceiveRequest->RemoteAddress, + &ReceiveRequest->RemotePort, + &AddrFile->AddrCache); + if (!NT_SUCCESS(Status)) + { + KeReleaseSpinLock(&AddrFile->Lock, OldIrql); + ExFreePool(ReceiveRequest); + return Status; + } + } + else + { + ReceiveRequest->RemotePort = 0; + ReceiveRequest->RemoteAddress = NULL; + } + ReceiveRequest->ReturnInfo = ReturnInfo; + ReceiveRequest->Buffer = Buffer; + /* If ReceiveLength is 0, the whole buffer is available to us */ + ReceiveRequest->BufferSize = (ReceiveLength == 0) ? + MmGetMdlByteCount(Buffer) : ReceiveLength; + ReceiveRequest->Complete = Request->RequestNotifyObject; + ReceiveRequest->Context = Request->RequestContext; + + /* Queue receive request */ + InsertTailList(&AddrFile->ReceiveQueue, &ReceiveRequest->ListEntry); + + /* Reference address file and set pending receive request flag */ + AddrFile->RefCount++; + AF_SET_PENDING(AddrFile, AFF_RECEIVE); + KeReleaseSpinLock(&AddrFile->Lock, OldIrql); - ExFreePool(ReceiveRequest); - return Status; + + TI_DbgPrint(MAX_TRACE, ("Leaving (pending).\n")); + + return STATUS_PENDING; } - } else { - ReceiveRequest->RemotePort = 0; - ReceiveRequest->RemoteAddress = NULL; - } - ReceiveRequest->ReturnInfo = ReturnInfo; - ReceiveRequest->Buffer = Buffer; - /* If ReceiveLength is 0, the whole buffer is available to us */ - ReceiveRequest->BufferSize = (ReceiveLength == 0) ? - MmGetMdlByteCount(Buffer) : ReceiveLength; - ReceiveRequest->Complete = Request->RequestNotifyObject; - ReceiveRequest->Context = Request->RequestContext; - - /* Queue receive request */ - InsertTailList(&AddrFile->ReceiveQueue, &ReceiveRequest->ListEntry); - - /* Reference address file and set pending receive request flag */ - AddrFile->RefCount++; - AF_SET_PENDING(AddrFile, AFF_RECEIVE); - - KeReleaseSpinLock(&AddrFile->Lock, OldIrql); - - TI_DbgPrint(MAX_TRACE, ("Leaving (pending).\n")); - - return STATUS_PENDING; - } else - Status = STATUS_INSUFFICIENT_RESOURCES; - } else - Status = STATUS_INVALID_ADDRESS; + else + { + Status = STATUS_INSUFFICIENT_RESOURCES; + } + } + else + { + Status = STATUS_INVALID_ADDRESS; + } KeReleaseSpinLock(&AddrFile->Lock, OldIrql); @@ -676,6 +736,3 @@ NTSTATUS DGShutdown( { return STATUS_SUCCESS; } - - -/* EOF */ From 3fa6583180b28a2b74f7aa962cf6e67947637094 Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Wed, 25 Feb 2004 20:29:15 +0000 Subject: [PATCH 0187/1463] No more ick tabs. svn path=/trunk/; revision=8382 --- reactos/lib/iphlpapi/ifenum_reactos.c | 624 ++++++++++++------------- reactos/lib/iphlpapi/iphlpapi_main.c | 22 +- reactos/lib/iphlpapi/ipstats_reactos.c | 252 +++++----- reactos/lib/iphlpapi/registry.c | 40 +- reactos/lib/iphlpapi/resinfo_reactos.c | 8 +- 5 files changed, 473 insertions(+), 473 deletions(-) diff --git a/reactos/lib/iphlpapi/ifenum_reactos.c b/reactos/lib/iphlpapi/ifenum_reactos.c index d58c0ebc905..1aba52674d3 100644 --- a/reactos/lib/iphlpapi/ifenum_reactos.c +++ b/reactos/lib/iphlpapi/ifenum_reactos.c @@ -71,22 +71,22 @@ NTSTATUS openTcpFile(PHANDLE tcpFile) { RtlInitUnicodeString( &fileName, TcpFileName ); InitializeObjectAttributes( &objectAttributes, - &fileName, - OBJ_CASE_INSENSITIVE, - NULL, - NULL ); + &fileName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL ); status = NtCreateFile( tcpFile, - SYNCHRONIZE | GENERIC_EXECUTE, - &objectAttributes, - &ioStatusBlock, - NULL, - FILE_ATTRIBUTE_NORMAL, - FILE_SHARE_READ | FILE_SHARE_WRITE, - FILE_OPEN_IF, - FILE_SYNCHRONOUS_IO_NONALERT, - 0, - 0 ); + SYNCHRONIZE | GENERIC_EXECUTE, + &objectAttributes, + &ioStatusBlock, + NULL, + FILE_ATTRIBUTE_NORMAL, + FILE_SHARE_READ | FILE_SHARE_WRITE, + FILE_OPEN_IF, + FILE_SYNCHRONOUS_IO_NONALERT, + 0, + 0 ); /* String does not need to be freed: it points to the constant * string we provided */ @@ -114,29 +114,29 @@ void closeTcpFile( HANDLE h ) { * IPInterfaceInfo */ NTSTATUS tdiGetSetOfThings( HANDLE tcpFile, - DWORD toiClass, - DWORD toiType, - DWORD toiId, - DWORD teiEntity, - DWORD fixedPart, - DWORD entrySize, - PVOID *tdiEntitySet, - PDWORD numEntries ) { + DWORD toiClass, + DWORD toiType, + DWORD toiId, + DWORD teiEntity, + DWORD fixedPart, + DWORD entrySize, + PVOID *tdiEntitySet, + PDWORD numEntries ) { TCP_REQUEST_QUERY_INFORMATION_EX req = TCP_REQUEST_QUERY_INFORMATION_INIT; PVOID entitySet = 0; NTSTATUS status = STATUS_SUCCESS; DWORD allocationSizeForEntityArray = entrySize * MAX_TDI_ENTITIES, - arraySize = entrySize * MAX_TDI_ENTITIES; + arraySize = entrySize * MAX_TDI_ENTITIES; DPRINT("TdiGetSetOfThings(tcpFile %x,toiClass %x,toiType %x,toiId %x," - "teiEntity %x,fixedPart %d,entrySize %d)\n", - (int)tcpFile, - (int)toiClass, - (int)toiType, - (int)toiId, - (int)teiEntity, - (int)fixedPart, - (int)entrySize ); + "teiEntity %x,fixedPart %d,entrySize %d)\n", + (int)tcpFile, + (int)toiClass, + (int)toiType, + (int)toiId, + (int)teiEntity, + (int)fixedPart, + (int)entrySize ); req.ID.toi_class = toiClass; req.ID.toi_type = toiType; @@ -152,61 +152,61 @@ NTSTATUS tdiGetSetOfThings( HANDLE tcpFile, * stabilizes. */ do { - assert( !entitySet ); /* We must not have an entity set allocated */ - status = DeviceIoControl( tcpFile, - IOCTL_TCP_QUERY_INFORMATION_EX, - &req, - sizeof(req), - 0, - 0, - &allocationSizeForEntityArray, - NULL ); - - if( !NT_SUCCESS(status) ) { - DPRINT("TdiGetSetOfThings() => %08x\n", (int)status); - return status; - } - - arraySize = allocationSizeForEntityArray; - entitySet = HeapAlloc( GetProcessHeap(), 0, arraySize ); - - if( !entitySet ) { - status = STATUS_INSUFFICIENT_RESOURCES; - DPRINT("TdiGetSetOfThings() => %08x\n", (int)status); - return status; - } + assert( !entitySet ); /* We must not have an entity set allocated */ + status = DeviceIoControl( tcpFile, + IOCTL_TCP_QUERY_INFORMATION_EX, + &req, + sizeof(req), + 0, + 0, + &allocationSizeForEntityArray, + NULL ); + + if( !NT_SUCCESS(status) ) { + DPRINT("TdiGetSetOfThings() => %08x\n", (int)status); + return status; + } + + arraySize = allocationSizeForEntityArray; + entitySet = HeapAlloc( GetProcessHeap(), 0, arraySize ); + + if( !entitySet ) { + status = STATUS_INSUFFICIENT_RESOURCES; + DPRINT("TdiGetSetOfThings() => %08x\n", (int)status); + return status; + } - status = DeviceIoControl( tcpFile, - IOCTL_TCP_QUERY_INFORMATION_EX, - &req, - sizeof(req), - entitySet, - arraySize, - &allocationSizeForEntityArray, - NULL ); - - /* This is why we have the loop -- we might have added an adapter */ - if( arraySize == allocationSizeForEntityArray ) - break; + status = DeviceIoControl( tcpFile, + IOCTL_TCP_QUERY_INFORMATION_EX, + &req, + sizeof(req), + entitySet, + arraySize, + &allocationSizeForEntityArray, + NULL ); + + /* This is why we have the loop -- we might have added an adapter */ + if( arraySize == allocationSizeForEntityArray ) + break; - HeapFree( GetProcessHeap(), 0, entitySet ); - entitySet = 0; + HeapFree( GetProcessHeap(), 0, entitySet ); + entitySet = 0; - if( !NT_SUCCESS(status) ) { - DPRINT("TdiGetSetOfThings() => %08x\n", (int)status); - return status; - } + if( !NT_SUCCESS(status) ) { + DPRINT("TdiGetSetOfThings() => %08x\n", (int)status); + return status; + } - DPRINT("TdiGetSetOfThings(): Array changed size: %d -> %d.\n", - arraySize, allocationSizeForEntityArray ); + DPRINT("TdiGetSetOfThings(): Array changed size: %d -> %d.\n", + arraySize, allocationSizeForEntityArray ); } while( TRUE ); /* We break if the array we received was the size we - * expected. Therefore, we got here because it wasn't */ + * expected. Therefore, we got here because it wasn't */ *numEntries = (arraySize - fixedPart) / entrySize; *tdiEntitySet = entitySet; DPRINT("TdiGetSetOfThings() => Success: %d things @ %08x\n", - (int)*numEntries, (int)entitySet); + (int)*numEntries, (int)entitySet); return STATUS_SUCCESS; } @@ -222,7 +222,7 @@ NTSTATUS tdiGetMibForIfEntity DWORD returnSize; DPRINT("TdiGetMibForIfEntity(tcpFile %x,entityId %x)\n", - (int)tcpFile, (int)ent->tei_instance); + (int)tcpFile, (int)ent->tei_instance); req.ID.toi_class = INFO_CLASS_PROTOCOL; req.ID.toi_type = INFO_TYPE_PROVIDER; @@ -230,65 +230,65 @@ NTSTATUS tdiGetMibForIfEntity req.ID.toi_entity = *ent; status = DeviceIoControl( tcpFile, - IOCTL_TCP_QUERY_INFORMATION_EX, - &req, - sizeof(req), - entry, - sizeof(*entry), - &returnSize, - NULL ); + IOCTL_TCP_QUERY_INFORMATION_EX, + &req, + sizeof(req), + entry, + sizeof(*entry), + &returnSize, + NULL ); if( !NT_SUCCESS(status) ) { - TRACE("failure: %08x\n", status); - return status; + TRACE("failure: %08x\n", status); + return status; } else TRACE("Success.\n"); DPRINT("TdiGetMibForIfEntity() => {\n" - " if_index ....................... %x\n" - " if_type ........................ %x\n" - " if_mtu ......................... %d\n" - " if_speed ....................... %x\n" - " if_physaddrlen ................. %d\n", - entry->ent.if_index, - entry->ent.if_type, - entry->ent.if_mtu, - entry->ent.if_speed, - entry->ent.if_physaddrlen); + " if_index ....................... %x\n" + " if_type ........................ %x\n" + " if_mtu ......................... %d\n" + " if_speed ....................... %x\n" + " if_physaddrlen ................. %d\n", + entry->ent.if_index, + entry->ent.if_type, + entry->ent.if_mtu, + entry->ent.if_speed, + entry->ent.if_physaddrlen); DPRINT(" if_physaddr .................... %02x:%02x:%02x:%02x:%02x:%02x\n", - " if_descr ....................... %s\n", - entry->ent.if_physaddr[0] & 0xff, - entry->ent.if_physaddr[1] & 0xff, - entry->ent.if_physaddr[2] & 0xff, - entry->ent.if_physaddr[3] & 0xff, - entry->ent.if_physaddr[4] & 0xff, - entry->ent.if_physaddr[5] & 0xff, - entry->ent.if_descr); + " if_descr ....................... %s\n", + entry->ent.if_physaddr[0] & 0xff, + entry->ent.if_physaddr[1] & 0xff, + entry->ent.if_physaddr[2] & 0xff, + entry->ent.if_physaddr[3] & 0xff, + entry->ent.if_physaddr[4] & 0xff, + entry->ent.if_physaddr[5] & 0xff, + entry->ent.if_descr); DPRINT("} status %08x\n",status); - + return status; } NTSTATUS tdiGetEntityIDSet( HANDLE tcpFile, - TDIEntityID **entitySet, - PDWORD numEntities ) { + TDIEntityID **entitySet, + PDWORD numEntities ) { NTSTATUS status = tdiGetSetOfThings( tcpFile, - INFO_CLASS_GENERIC, - INFO_TYPE_PROVIDER, - ENTITY_LIST_ID, - GENERIC_ENTITY, - 0, - sizeof(TDIEntityID), - (PVOID *)entitySet, - numEntities ); + INFO_CLASS_GENERIC, + INFO_TYPE_PROVIDER, + ENTITY_LIST_ID, + GENERIC_ENTITY, + 0, + sizeof(TDIEntityID), + (PVOID *)entitySet, + numEntities ); if( NT_SUCCESS(status) ) { - int i; + int i; - for( i = 0; i < *numEntities; i++ ) { - DPRINT("%-4d: %04x:%08x\n", - i, - (*entitySet)[i].tei_entity, - (*entitySet)[i].tei_instance ); - } + for( i = 0; i < *numEntities; i++ ) { + DPRINT("%-4d: %04x:%08x\n", + i, + (*entitySet)[i].tei_entity, + (*entitySet)[i].tei_instance ); + } } return status; @@ -296,18 +296,18 @@ NTSTATUS tdiGetEntityIDSet( HANDLE tcpFile, static BOOL isInterface( TDIEntityID *if_maybe ) { return - if_maybe->tei_entity == IF_ENTITY; + if_maybe->tei_entity == IF_ENTITY; } static BOOL isLoopback( HANDLE tcpFile, TDIEntityID *loop_maybe ) { IFEntrySafelySized entryInfo; tdiGetMibForIfEntity( tcpFile, - loop_maybe, - &entryInfo ); + loop_maybe, + &entryInfo ); return !entryInfo.ent.if_type || - entryInfo.ent.if_type == IFENT_SOFTWARE_LOOPBACK; + entryInfo.ent.if_type == IFENT_SOFTWARE_LOOPBACK; } NTSTATUS tdiGetEntityType( HANDLE tcpFile, TDIEntityID *ent, PULONG type ) { @@ -316,7 +316,7 @@ NTSTATUS tdiGetEntityType( HANDLE tcpFile, TDIEntityID *ent, PULONG type ) { DWORD returnSize; DPRINT("TdiGetEntityType(tcpFile %x,entityId %x)\n", - (DWORD)tcpFile, ent->tei_instance); + (DWORD)tcpFile, ent->tei_instance); req.ID.toi_class = INFO_CLASS_GENERIC; req.ID.toi_type = INFO_TYPE_PROVIDER; @@ -325,13 +325,13 @@ NTSTATUS tdiGetEntityType( HANDLE tcpFile, TDIEntityID *ent, PULONG type ) { req.ID.toi_entity.tei_instance = ent->tei_instance; status = DeviceIoControl( tcpFile, - IOCTL_TCP_QUERY_INFORMATION_EX, - &req, - sizeof(req), - type, - sizeof(*type), - &returnSize, - NULL ); + IOCTL_TCP_QUERY_INFORMATION_EX, + &req, + sizeof(req), + type, + sizeof(*type), + &returnSize, + NULL ); DPRINT("TdiGetEntityType() => %08x %08x\n", *type, status); @@ -339,8 +339,8 @@ NTSTATUS tdiGetEntityType( HANDLE tcpFile, TDIEntityID *ent, PULONG type ) { } static NTSTATUS getInterfaceInfoSet( HANDLE tcpFile, - IFInfo **infoSet, - PDWORD numInterfaces ) { + IFInfo **infoSet, + PDWORD numInterfaces ) { DWORD numEntities; TDIEntityID *entIDSet = 0; NTSTATUS status = tdiGetEntityIDSet( tcpFile, &entIDSet, &numEntities ); @@ -349,44 +349,44 @@ static NTSTATUS getInterfaceInfoSet( HANDLE tcpFile, int curInterf = 0, i; if( NT_SUCCESS(status) ) - infoSetInt = HeapAlloc( GetProcessHeap(), 0, - sizeof(IFInfo) * numEntities ); + infoSetInt = HeapAlloc( GetProcessHeap(), 0, + sizeof(IFInfo) * numEntities ); if( infoSetInt ) { - for( i = 0; i < numEntities; i++ ) { - if( isInterface( &entIDSet[i] ) ) { - status = tdiGetMibForIfEntity - ( tcpFile, - &entIDSet[i], - &infoSetInt[curInterf].if_info ); - if( NT_SUCCESS(status) ) { - DWORD numAddrs; - IPAddrEntry *addrs; - TDIEntityID ip_ent; - int j,k; + for( i = 0; i < numEntities; i++ ) { + if( isInterface( &entIDSet[i] ) ) { + status = tdiGetMibForIfEntity + ( tcpFile, + &entIDSet[i], + &infoSetInt[curInterf].if_info ); + if( NT_SUCCESS(status) ) { + DWORD numAddrs; + IPAddrEntry *addrs; + TDIEntityID ip_ent; + int j,k; - interfaceInfoComplete = FALSE; - for( j = 0; NT_SUCCESS(status); j++ ) { - status = getNthIpEntity( tcpFile, j, &ip_ent ); - if( NT_SUCCESS(status) ) - status = tdiGetIpAddrsForIpEntity - ( tcpFile, &ip_ent, &addrs, &numAddrs ); - for( k = 0; k < numAddrs && NT_SUCCESS(status); k++ ) { - if( addrs[k].iae_index == - infoSetInt[curInterf].if_info.ent.if_index ) { - memcpy( &infoSetInt[curInterf].ip_addr, - &addrs[k], - sizeof( addrs[k] ) ); - interfaceInfoComplete = TRUE; - break; - } - } - if( interfaceInfoComplete ) break; - } - } - if( NT_SUCCESS(status) ) curInterf++; - } - } + interfaceInfoComplete = FALSE; + for( j = 0; NT_SUCCESS(status); j++ ) { + status = getNthIpEntity( tcpFile, j, &ip_ent ); + if( NT_SUCCESS(status) ) + status = tdiGetIpAddrsForIpEntity + ( tcpFile, &ip_ent, &addrs, &numAddrs ); + for( k = 0; k < numAddrs && NT_SUCCESS(status); k++ ) { + if( addrs[k].iae_index == + infoSetInt[curInterf].if_info.ent.if_index ) { + memcpy( &infoSetInt[curInterf].ip_addr, + &addrs[k], + sizeof( addrs[k] ) ); + interfaceInfoComplete = TRUE; + break; + } + } + if( interfaceInfoComplete ) break; + } + } + if( NT_SUCCESS(status) ) curInterf++; + } + } } *infoSet = infoSetInt; @@ -406,27 +406,27 @@ static DWORD getNumInterfacesInt(BOOL onlyLoopback) status = openTcpFile( &tcpFile ); if( !NT_SUCCESS(status) ) { - DPRINT("getNumInterfaces: failed %08x\n", status ); - return 0; + DPRINT("getNumInterfaces: failed %08x\n", status ); + return 0; } status = tdiGetEntityIDSet( tcpFile, &entitySet, &numEntities ); if( !NT_SUCCESS(status) ) { - DPRINT("getNumInterfaces: failed %08x\n", status ); - return 0; + DPRINT("getNumInterfaces: failed %08x\n", status ); + return 0; } closeTcpFile( tcpFile ); for( i = 0; i < numEntities; i++ ) { - if( isInterface( &entitySet[i] ) && - (!onlyLoopback || isLoopback( tcpFile, &entitySet[i] )) ) - numInterfaces++; + if( isInterface( &entitySet[i] ) && + (!onlyLoopback || isLoopback( tcpFile, &entitySet[i] )) ) + numInterfaces++; } DPRINT("getNumInterfaces: success: %d %d %08x\n", - onlyLoopback, numInterfaces, status ); + onlyLoopback, numInterfaces, status ); tdiFreeThingSet( entitySet ); @@ -451,25 +451,25 @@ DWORD getNthInterfaceEntity( HANDLE tcpFile, DWORD index, TDIEntityID *ent ) { int i; if( !NT_SUCCESS(status) ) - return status; + return status; for( i = 0; i < numEntities; i++ ) { - if( isInterface( &entitySet[i] ) ) { - if( numInterfaces == index ) break; - else numInterfaces++; - } + if( isInterface( &entitySet[i] ) ) { + if( numInterfaces == index ) break; + else numInterfaces++; + } } DPRINT("Index %d is entity #%d - %04x:%08x\n", index, i, - entitySet[i].tei_entity, entitySet[i].tei_instance ); + entitySet[i].tei_entity, entitySet[i].tei_instance ); if( numInterfaces == index && i < numEntities ) { - memcpy( ent, &entitySet[i], sizeof(*ent) ); - tdiFreeThingSet( entitySet ); - return STATUS_SUCCESS; + memcpy( ent, &entitySet[i], sizeof(*ent) ); + tdiFreeThingSet( entitySet ); + return STATUS_SUCCESS; } else { - tdiFreeThingSet( entitySet ); - return STATUS_UNSUCCESSFUL; + tdiFreeThingSet( entitySet ); + return STATUS_UNSUCCESSFUL; } } @@ -480,17 +480,17 @@ NTSTATUS getInterfaceInfoByIndex( HANDLE tcpFile, DWORD index, IFInfo *info ) { int i; if( NT_SUCCESS(status) ) - for( i = 0; i < numInterfaces; i++ ) { - if( ifInfo[i].if_info.ent.if_index == index ) { - memcpy( info, &ifInfo[i], sizeof(*info) ); - break; - } - } + for( i = 0; i < numInterfaces; i++ ) { + if( ifInfo[i].if_info.ent.if_index == index ) { + memcpy( info, &ifInfo[i], sizeof(*info) ); + break; + } + } if( NT_SUCCESS(status) ) - return i < numInterfaces ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL; + return i < numInterfaces ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL; else - return status; + return status; } NTSTATUS getInterfaceInfoByName( HANDLE tcpFile, char *name, IFInfo *info ) { @@ -500,17 +500,17 @@ NTSTATUS getInterfaceInfoByName( HANDLE tcpFile, char *name, IFInfo *info ) { NTSTATUS status = getInterfaceInfoSet( tcpFile, &ifInfo, &numInterfaces ); if( NT_SUCCESS(status) ) - for( i = 0; i < numInterfaces; i++ ) { - if( !strcmp(ifInfo[i].if_info.ent.if_descr, name) ) { - memcpy( info, &ifInfo[i], sizeof(*info) ); - break; - } - } + for( i = 0; i < numInterfaces; i++ ) { + if( !strcmp(ifInfo[i].if_info.ent.if_descr, name) ) { + memcpy( info, &ifInfo[i], sizeof(*info) ); + break; + } + } if( NT_SUCCESS(status) ) - return i < numInterfaces ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL; + return i < numInterfaces ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL; else - return status; + return status; } /* Note that the result of this operation must be freed later */ @@ -523,17 +523,17 @@ const char *getInterfaceNameByIndex(DWORD index) NTSTATUS status = openTcpFile( &tcpFile ); if( NT_SUCCESS(status) ) { - status = getInterfaceInfoByIndex( tcpFile, index, &ifInfo ); - - if( NT_SUCCESS(status) ) { - adapter_name = ifInfo.if_info.ent.if_descr; - - interfaceName = HeapAlloc( GetProcessHeap(), 0, - strlen(adapter_name) + 1 ); - strcpy( interfaceName, adapter_name ); - - closeTcpFile( tcpFile ); - } + status = getInterfaceInfoByIndex( tcpFile, index, &ifInfo ); + + if( NT_SUCCESS(status) ) { + adapter_name = ifInfo.if_info.ent.if_descr; + + interfaceName = HeapAlloc( GetProcessHeap(), 0, + strlen(adapter_name) + 1 ); + strcpy( interfaceName, adapter_name ); + + closeTcpFile( tcpFile ); + } } return interfaceName; @@ -550,12 +550,12 @@ DWORD getInterfaceIndexByName(const char *name, PDWORD index) NTSTATUS status = openTcpFile( &tcpFile ); if( NT_SUCCESS(status) ) { - status = getInterfaceInfoByName( tcpFile, (char *)name, &ifInfo ); - - if( NT_SUCCESS(status) ) { - *index = ifInfo.if_info.ent.if_index; - closeTcpFile( tcpFile ); - } + status = getInterfaceInfoByName( tcpFile, (char *)name, &ifInfo ); + + if( NT_SUCCESS(status) ) { + *index = ifInfo.if_info.ent.if_index; + closeTcpFile( tcpFile ); + } } return status; @@ -573,30 +573,30 @@ InterfaceIndexTable *getInterfaceIndexTableInt( BOOL nonLoopbackOnly ) { status = getInterfaceInfoSet( tcpFile, &ifInfo, &numInterfaces ); if( NT_SUCCESS(status) ) { - ret = (InterfaceIndexTable *) - calloc(1, - sizeof(InterfaceIndexTable) + - (numInterfaces - 1) * sizeof(DWORD)); - - if (ret) { - ret->numAllocated = numInterfaces; - - for( i = 0; i < numInterfaces; i++ ) { - if( !nonLoopbackOnly || - !isLoopback( tcpFile, &ifInfo[i].entity_id ) ) { - ret->indexes[curInterface++] = - ifInfo[i].if_info.ent.if_index; - } - } + ret = (InterfaceIndexTable *) + calloc(1, + sizeof(InterfaceIndexTable) + + (numInterfaces - 1) * sizeof(DWORD)); + + if (ret) { + ret->numAllocated = numInterfaces; + + for( i = 0; i < numInterfaces; i++ ) { + if( !nonLoopbackOnly || + !isLoopback( tcpFile, &ifInfo[i].entity_id ) ) { + ret->indexes[curInterface++] = + ifInfo[i].if_info.ent.if_index; + } + } - ret->numIndexes = curInterface; - } - - tdiFreeThingSet( ifInfo ); + ret->numIndexes = curInterface; + } + + tdiFreeThingSet( ifInfo ); } closeTcpFile( tcpFile ); } - + return ret; } @@ -614,13 +614,13 @@ DWORD getInterfaceIPAddrByName(const char *name) } NTSTATUS getIPAddrEntryForIf(HANDLE tcpFile, - char *name, - DWORD index, - IFInfo *ifInfo) { + char *name, + DWORD index, + IFInfo *ifInfo) { NTSTATUS status = - name ? - getInterfaceInfoByName( tcpFile, name, ifInfo ) : - getInterfaceInfoByIndex( tcpFile, index, ifInfo ); + name ? + getInterfaceInfoByName( tcpFile, name, ifInfo ) : + getInterfaceInfoByIndex( tcpFile, index, ifInfo ); return status; } @@ -633,21 +633,21 @@ DWORD getAddrByIndexOrName( char *name, DWORD index, IPHLPAddrType addrType ) { status = openTcpFile( &tcpFile ); if( NT_SUCCESS(status) ) { - status = getIPAddrEntryForIf( tcpFile, name, index, &ifInfo ); - if( NT_SUCCESS(status) ) { - switch( addrType ) { - case IPAAddr: addrOut = ifInfo.ip_addr.iae_addr; break; - case IPABcast: addrOut = ifInfo.ip_addr.iae_bcastaddr; break; - case IPAMask: addrOut = ifInfo.ip_addr.iae_mask; break; - case IFMtu: addrOut = ifInfo.if_info.ent.if_mtu; break; - case IFStatus: addrOut = ifInfo.if_info.ent.if_operstatus; break; - } - } - closeTcpFile( &tcpFile ); + status = getIPAddrEntryForIf( tcpFile, name, index, &ifInfo ); + if( NT_SUCCESS(status) ) { + switch( addrType ) { + case IPAAddr: addrOut = ifInfo.ip_addr.iae_addr; break; + case IPABcast: addrOut = ifInfo.ip_addr.iae_bcastaddr; break; + case IPAMask: addrOut = ifInfo.ip_addr.iae_mask; break; + case IFMtu: addrOut = ifInfo.if_info.ent.if_mtu; break; + case IFStatus: addrOut = ifInfo.if_info.ent.if_operstatus; break; + } + } + closeTcpFile( &tcpFile ); } return addrOut; -} +} DWORD getInterfaceIPAddrByIndex(DWORD index) { return getAddrByIndexOrName( 0, index, IPAAddr ); @@ -670,24 +670,24 @@ DWORD getInterfaceMaskByIndex(DWORD index) { } void getInterfacePhysicalFromInfo( IFInfo *info, - PDWORD len, PBYTE addr, PDWORD type ) { + PDWORD len, PBYTE addr, PDWORD type ) { *len = info->if_info.ent.if_physaddrlen; memcpy( addr, info->if_info.ent.if_physaddr, *len ); *type = info->if_info.ent.if_type; } DWORD getInterfacePhysicalByName(const char *name, PDWORD len, PBYTE addr, - PDWORD type) + PDWORD type) { HANDLE tcpFile; IFInfo info; NTSTATUS status = openTcpFile( &tcpFile ); if( NT_SUCCESS(status) ) { - status = getInterfaceInfoByName( tcpFile, (char *)name, &info ); - if( NT_SUCCESS(status) ) - getInterfacePhysicalFromInfo( &info, len, addr, type ); - closeTcpFile( tcpFile ); + status = getInterfaceInfoByName( tcpFile, (char *)name, &info ); + if( NT_SUCCESS(status) ) + getInterfacePhysicalFromInfo( &info, len, addr, type ); + closeTcpFile( tcpFile ); } return status; @@ -701,10 +701,10 @@ DWORD getInterfacePhysicalByIndex(DWORD index, PDWORD len, PBYTE addr, NTSTATUS status = openTcpFile( &tcpFile ); if( NT_SUCCESS(status) ) { - status = getInterfaceInfoByIndex( tcpFile, index, &info ); - if( NT_SUCCESS(status) ) - getInterfacePhysicalFromInfo( &info, len, addr, type ); - closeTcpFile( tcpFile ); + status = getInterfaceInfoByIndex( tcpFile, index, &info ); + if( NT_SUCCESS(status) ) + getInterfacePhysicalFromInfo( &info, len, addr, type ); + closeTcpFile( tcpFile ); } return status; @@ -740,15 +740,15 @@ DWORD getInterfaceEntryByName(const char *name, PMIB_IFROW entry) DPRINT("Called.\n"); if( NT_SUCCESS(status) ) { - status = getInterfaceInfoByName( tcpFile, (char *)name, &info ); - - if( NT_SUCCESS(status) ) { - memcpy( &entry->wszName[MAX_INTERFACE_NAME_LEN], - &info.if_info, - sizeof(info.if_info) ); - } - - closeTcpFile( tcpFile ); + status = getInterfaceInfoByName( tcpFile, (char *)name, &info ); + + if( NT_SUCCESS(status) ) { + memcpy( &entry->wszName[MAX_INTERFACE_NAME_LEN], + &info.if_info, + sizeof(info.if_info) ); + } + + closeTcpFile( tcpFile ); } return status; @@ -763,15 +763,15 @@ DWORD getInterfaceEntryByIndex(DWORD index, PMIB_IFROW entry) DPRINT("Called.\n"); if( NT_SUCCESS(status) ) { - status = getInterfaceInfoByIndex( tcpFile, index, &info ); - - if( NT_SUCCESS(status) ) { - memcpy( &entry->wszName[MAX_INTERFACE_NAME_LEN], - &info.if_info, - sizeof(info.if_info) ); - } - - closeTcpFile( tcpFile ); + status = getInterfaceInfoByIndex( tcpFile, index, &info ); + + if( NT_SUCCESS(status) ) { + memcpy( &entry->wszName[MAX_INTERFACE_NAME_LEN], + &info.if_info, + sizeof(info.if_info) ); + } + + closeTcpFile( tcpFile ); } return status; @@ -794,7 +794,7 @@ DWORD createIpForwardEntryOS( PMIB_IPFORWARDROW pRoute ) { HANDLE tcpFile = INVALID_HANDLE_VALUE; NTSTATUS status = openTcpFile( &tcpFile ); TCP_REQUEST_SET_INFORMATION_EX_SAFELY_SIZED req = - TCP_REQUEST_SET_INFORMATION_INIT; + TCP_REQUEST_SET_INFORMATION_INIT; IPRouteEntry *rte; TDIEntityID id; DWORD returnSize = 0; @@ -802,35 +802,35 @@ DWORD createIpForwardEntryOS( PMIB_IPFORWARDROW pRoute ) { DPRINT("Called.\n"); if( NT_SUCCESS(status) ) - status = getNthIpEntity( tcpFile, 0, &id ); + status = getNthIpEntity( tcpFile, 0, &id ); if( NT_SUCCESS(status) ) { - req.Req.ID.toi_class = INFO_CLASS_PROTOCOL; - req.Req.ID.toi_type = INFO_TYPE_PROVIDER; - req.Req.ID.toi_id = IP_MIB_ROUTETABLE_ENTRY_ID; - req.Req.ID.toi_entity = id; - req.Req.BufferSize = sizeof(*rte); - rte = - (IPRouteEntry *)&req.Req.Buffer[0]; + req.Req.ID.toi_class = INFO_CLASS_PROTOCOL; + req.Req.ID.toi_type = INFO_TYPE_PROVIDER; + req.Req.ID.toi_id = IP_MIB_ROUTETABLE_ENTRY_ID; + req.Req.ID.toi_entity = id; + req.Req.BufferSize = sizeof(*rte); + rte = + (IPRouteEntry *)&req.Req.Buffer[0]; - rte->ire_dest = pRoute->dwForwardDest; - rte->ire_index = pRoute->dwForwardIfIndex; - rte->ire_metric = pRoute->dwForwardMetric1; - rte->ire_gw = pRoute->dwForwardNextHopAS; - rte->ire_mask = pRoute->dwForwardMask; + rte->ire_dest = pRoute->dwForwardDest; + rte->ire_index = pRoute->dwForwardIfIndex; + rte->ire_metric = pRoute->dwForwardMetric1; + rte->ire_gw = pRoute->dwForwardNextHopAS; + rte->ire_mask = pRoute->dwForwardMask; - status = DeviceIoControl( tcpFile, - IOCTL_TCP_SET_INFORMATION_EX, - &req, - sizeof(req), - NULL, - 0, - &returnSize, - NULL ); + status = DeviceIoControl( tcpFile, + IOCTL_TCP_SET_INFORMATION_EX, + &req, + sizeof(req), + NULL, + 0, + &returnSize, + NULL ); } if( tcpFile != INVALID_HANDLE_VALUE ) - closeTcpFile( tcpFile ); + closeTcpFile( tcpFile ); return status; } diff --git a/reactos/lib/iphlpapi/iphlpapi_main.c b/reactos/lib/iphlpapi/iphlpapi_main.c index 9888e845151..b25db6e20ee 100644 --- a/reactos/lib/iphlpapi/iphlpapi_main.c +++ b/reactos/lib/iphlpapi/iphlpapi_main.c @@ -620,13 +620,13 @@ DWORD WINAPI GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen) for (ndx = 0; ndx < table->numIndexes; ndx++) { PIP_ADAPTER_INFO ptr = &pAdapterInfo[ndx]; DWORD addrLen = sizeof(ptr->Address), type; - const char *ifname = - getInterfaceNameByIndex(table->indexes[ndx]); + const char *ifname = + getInterfaceNameByIndex(table->indexes[ndx]); /* on Win98 this is left empty, but whatever */ - + strncpy(ptr->AdapterName,ifname,sizeof(ptr->AdapterName)); - consumeInterfaceName(ifname); + consumeInterfaceName(ifname); ptr->AdapterName[MAX_ADAPTER_NAME_LENGTH] = '\0'; getInterfacePhysicalByIndex(table->indexes[ndx], &addrLen, ptr->Address, &type); @@ -973,7 +973,7 @@ DWORD WINAPI GetInterfaceInfo(PIP_INTERFACE_INFO pIfTable, PULONG dwOutBufLen) walker++, assigner++) *assigner = *walker; *assigner = 0; - consumeInterfaceName(name); + consumeInterfaceName(name); pIfTable->NumAdapters++; } ret = NO_ERROR; @@ -1125,7 +1125,7 @@ DWORD WINAPI GetIpForwardTable(PMIB_IPFORWARDTABLE pIpForwardTable, PULONG pdwSi DWORD ret; TRACE("pIpForwardTable %p, pdwSize %p, bOrder %ld\n", pIpForwardTable, - pdwSize, (DWORD)bOrder); + pdwSize, (DWORD)bOrder); if (!pdwSize) ret = ERROR_INVALID_PARAMETER; else { @@ -1358,11 +1358,11 @@ DWORD WINAPI GetNetworkParams(PFIXED_INFO pFixedInfo, PULONG pOutBufLen) for (i = 0, ptr = &pFixedInfo->DnsServerList; i < resInfo->riCount && ptr; i++, ptr = ptr->Next) { - struct sockaddr_in *addr_v4 = - (struct sockaddr_in *)&resInfo->riAddressList[i]; - toIPAddressString - (addr_v4->sin_addr.s_addr, - ptr->IpAddress.String); + struct sockaddr_in *addr_v4 = + (struct sockaddr_in *)&resInfo->riAddressList[i]; + toIPAddressString + (addr_v4->sin_addr.s_addr, + ptr->IpAddress.String); if (i == resInfo->riCount - 1) ptr->Next = NULL; else if (i == 0) diff --git a/reactos/lib/iphlpapi/ipstats_reactos.c b/reactos/lib/iphlpapi/ipstats_reactos.c index 4f5e6da9a0e..1651d0aeef5 100644 --- a/reactos/lib/iphlpapi/ipstats_reactos.c +++ b/reactos/lib/iphlpapi/ipstats_reactos.c @@ -68,18 +68,18 @@ BOOL isIpEntity( HANDLE tcpFile, TDIEntityID *ent ) { req.ID.toi_entity = *ent; status = - DeviceIoControl - ( tcpFile, - IOCTL_TCP_QUERY_INFORMATION_EX, - &req, - sizeof(req), - &entityType, - sizeof(entityType), - &returnedLen, - NULL ); + DeviceIoControl + ( tcpFile, + IOCTL_TCP_QUERY_INFORMATION_EX, + &req, + sizeof(req), + &entityType, + sizeof(entityType), + &returnedLen, + NULL ); DPRINT("Ent: %04x:d -> %04x\n", - ent->tei_entity, ent->tei_instance, entityType ); + ent->tei_entity, ent->tei_instance, entityType ); return NT_SUCCESS(status) && entityType == CL_NL_IP; } @@ -92,25 +92,25 @@ NTSTATUS getNthIpEntity( HANDLE tcpFile, DWORD index, TDIEntityID *ent ) { int i; if( !NT_SUCCESS(status) ) - return status; + return status; for( i = 0; i < numEntities; i++ ) { - if( isIpEntity( tcpFile, &entitySet[i] ) ) { - DPRINT("Entity %d is an IP Entity\n", i); - if( numRoutes == index ) break; - else numRoutes++; - } + if( isIpEntity( tcpFile, &entitySet[i] ) ) { + DPRINT("Entity %d is an IP Entity\n", i); + if( numRoutes == index ) break; + else numRoutes++; + } } if( numRoutes == index && i < numEntities ) { - DPRINT("Index %d is entity #%d - %04x:%08x\n", index, i, - entitySet[i].tei_entity, entitySet[i].tei_instance ); - memcpy( ent, &entitySet[i], sizeof(*ent) ); - tdiFreeThingSet( entitySet ); - return STATUS_SUCCESS; + DPRINT("Index %d is entity #%d - %04x:%08x\n", index, i, + entitySet[i].tei_entity, entitySet[i].tei_instance ); + memcpy( ent, &entitySet[i], sizeof(*ent) ); + tdiFreeThingSet( entitySet ); + return STATUS_SUCCESS; } else { - tdiFreeThingSet( entitySet ); - return STATUS_UNSUCCESSFUL; + tdiFreeThingSet( entitySet ); + return STATUS_UNSUCCESSFUL; } } @@ -123,7 +123,7 @@ NTSTATUS tdiGetMibForIpEntity memset( entry, 0, sizeof( *entry ) ); DPRINT("TdiGetMibForIpEntity(tcpFile %x,entityId %x)\n", - (DWORD)tcpFile, ent->tei_instance); + (DWORD)tcpFile, ent->tei_instance); req.ID.toi_class = INFO_CLASS_PROTOCOL; req.ID.toi_type = INFO_TYPE_PROVIDER; @@ -131,40 +131,40 @@ NTSTATUS tdiGetMibForIpEntity req.ID.toi_entity = *ent; status = DeviceIoControl( tcpFile, - IOCTL_TCP_QUERY_INFORMATION_EX, - &req, - sizeof(req), - entry, - sizeof(*entry), - &returnSize, - NULL ); + IOCTL_TCP_QUERY_INFORMATION_EX, + &req, + sizeof(req), + entry, + sizeof(*entry), + &returnSize, + NULL ); DPRINT("TdiGetMibForIpEntity() => {\n" - " ipsi_forwarding ............ %d\n" - " ipsi_defaultttl ............ %d\n" - " ipsi_inreceives ............ %d\n" - " ipsi_indelivers ............ %d\n" - " ipsi_outrequests ........... %d\n" - " ipsi_routingdiscards ....... %d\n" - " ipsi_outdiscards ........... %d\n" - " ipsi_outnoroutes ........... %d\n" - " ipsi_numif ................. %d\n" - " ipsi_numaddr ............... %d\n" - " ipsi_numroutes ............. %d\n" - "} status %08x\n", - entry->ipsi_forwarding, - entry->ipsi_defaultttl, - entry->ipsi_inreceives, - entry->ipsi_indelivers, - entry->ipsi_outrequests, - entry->ipsi_routingdiscards, - entry->ipsi_outdiscards, - entry->ipsi_outnoroutes, - entry->ipsi_numif, - entry->ipsi_numaddr, - entry->ipsi_numroutes, - status); - + " ipsi_forwarding ............ %d\n" + " ipsi_defaultttl ............ %d\n" + " ipsi_inreceives ............ %d\n" + " ipsi_indelivers ............ %d\n" + " ipsi_outrequests ........... %d\n" + " ipsi_routingdiscards ....... %d\n" + " ipsi_outdiscards ........... %d\n" + " ipsi_outnoroutes ........... %d\n" + " ipsi_numif ................. %d\n" + " ipsi_numaddr ............... %d\n" + " ipsi_numroutes ............. %d\n" + "} status %08x\n", + entry->ipsi_forwarding, + entry->ipsi_defaultttl, + entry->ipsi_inreceives, + entry->ipsi_indelivers, + entry->ipsi_outrequests, + entry->ipsi_routingdiscards, + entry->ipsi_outdiscards, + entry->ipsi_outnoroutes, + entry->ipsi_numif, + entry->ipsi_numaddr, + entry->ipsi_numroutes, + status); + return status; } @@ -173,17 +173,17 @@ NTSTATUS tdiGetRoutesForIpEntity NTSTATUS status = STATUS_SUCCESS; DPRINT("TdiGetRoutesForIpEntity(tcpFile %x,entityId %x)\n", - (DWORD)tcpFile, ent->tei_instance); + (DWORD)tcpFile, ent->tei_instance); status = tdiGetSetOfThings( tcpFile, - INFO_CLASS_PROTOCOL, - INFO_TYPE_PROVIDER, - IP_MIB_ROUTETABLE_ENTRY_ID, - ent->tei_entity, - 0, - sizeof(IPRouteEntry), - (PVOID *)routes, - numRoutes); + INFO_CLASS_PROTOCOL, + INFO_TYPE_PROVIDER, + IP_MIB_ROUTETABLE_ENTRY_ID, + ent->tei_entity, + 0, + sizeof(IPRouteEntry), + (PVOID *)routes, + numRoutes); return status; } @@ -193,17 +193,17 @@ NTSTATUS tdiGetIpAddrsForIpEntity NTSTATUS status; DPRINT("TdiGetIpAddrsForIpEntity(tcpFile %x,entityId %x)\n", - (DWORD)tcpFile, ent->tei_instance); + (DWORD)tcpFile, ent->tei_instance); status = tdiGetSetOfThings( tcpFile, - INFO_CLASS_PROTOCOL, - INFO_TYPE_PROVIDER, - IP_MIB_ADDRTABLE_ENTRY_ID, - ent->tei_entity, - 0, - sizeof(IPAddrEntry), - (PVOID *)addrs, - numAddrs ); + INFO_CLASS_PROTOCOL, + INFO_TYPE_PROVIDER, + IP_MIB_ADDRTABLE_ENTRY_ID, + ent->tei_entity, + 0, + sizeof(IPAddrEntry), + (PVOID *)addrs, + numAddrs ); return status; } @@ -389,28 +389,28 @@ DWORD getNumRoutes(void) status = openTcpFile( &tcpFile ); if( !NT_SUCCESS(status) ) { - TRACE("failure: %08x\n", (int)status ); - return 0; + TRACE("failure: %08x\n", (int)status ); + return 0; } status = tdiGetEntityIDSet( tcpFile, &entitySet, &numEntities ); if( !NT_SUCCESS(status) ) { - TRACE("failure: %08x\n", (int)status ); - return 0; + TRACE("failure: %08x\n", (int)status ); + return 0; } for( i = 0; i < numEntities; i++ ) { - if( isIpEntity( tcpFile, &entitySet[i] ) ) { - IPSNMPInfo isnmp; - memset( &isnmp, 0, sizeof( isnmp ) ); - status = tdiGetMibForIpEntity( tcpFile, &entitySet[i], &isnmp ); - if( !NT_SUCCESS(status) ) { - tdiFreeThingSet( entitySet ); - return status; - } - numRoutes += isnmp.ipsi_numroutes; - } + if( isIpEntity( tcpFile, &entitySet[i] ) ) { + IPSNMPInfo isnmp; + memset( &isnmp, 0, sizeof( isnmp ) ); + status = tdiGetMibForIpEntity( tcpFile, &entitySet[i], &isnmp ); + if( !NT_SUCCESS(status) ) { + tdiFreeThingSet( entitySet ); + return status; + } + numRoutes += isnmp.ipsi_numroutes; + } } TRACE("numRoutes: %d\n", (int)numRoutes); @@ -424,11 +424,11 @@ VOID HexDump( PCHAR Data, DWORD Len ) { int i; for( i = 0; i < Len; i++ ) { - if( !(i & 0xf) ) { - if( i ) fprintf(stderr,"\n"); - fprintf(stderr,"%08x:", i); - } - fprintf( stderr, " %02x", Data[i] & 0xff ); + if( !(i & 0xf) ) { + if( i ) fprintf(stderr,"\n"); + fprintf(stderr,"%08x:", i); + } + fprintf( stderr, " %02x", Data[i] & 0xff ); } fprintf(stderr,"\n"); } @@ -444,55 +444,55 @@ RouteTable *getRouteTable(void) int i; if( !NT_SUCCESS(status) ) - return 0; + return 0; out_route_table = HeapAlloc( GetProcessHeap(), 0, - sizeof(RouteTable) + - (sizeof(RouteEntry) * (numRoutes - 1)) ); + sizeof(RouteTable) + + (sizeof(RouteEntry) * (numRoutes - 1)) ); out_route_table->numRoutes = numRoutes; for( i = 0; routesAdded < numRoutes; i++ ) { - int j; - IPRouteEntry *route_set; + int j; + IPRouteEntry *route_set; - getNthIpEntity( tcpFile, i, &ent ); - tdiGetMibForIpEntity( tcpFile, &ent, &snmpInfo ); + getNthIpEntity( tcpFile, i, &ent ); + tdiGetMibForIpEntity( tcpFile, &ent, &snmpInfo ); - DPRINT( "%d routes in instance %d\n", snmpInfo.ipsi_numroutes, i ); + DPRINT( "%d routes in instance %d\n", snmpInfo.ipsi_numroutes, i ); - if( !route_set ) { - closeTcpFile( tcpFile ); - HeapFree( GetProcessHeap(), 0, out_route_table ); - return 0; - } + if( !route_set ) { + closeTcpFile( tcpFile ); + HeapFree( GetProcessHeap(), 0, out_route_table ); + return 0; + } - tdiGetRoutesForIpEntity( tcpFile, &ent, &route_set, &numRoutes ); + tdiGetRoutesForIpEntity( tcpFile, &ent, &route_set, &numRoutes ); - DPRINT("Route set returned\n"); + DPRINT("Route set returned\n"); #if 0 - HexDump( route_set, - sizeof( IPRouteEntry ) * - snmpInfo.ipsi_numroutes ); + HexDump( route_set, + sizeof( IPRouteEntry ) * + snmpInfo.ipsi_numroutes ); #endif - for( j = 0; j < snmpInfo.ipsi_numroutes; j++ ) { - int routeNum = j + routesAdded; - out_route_table->routes[routeNum].dest = - route_set[j].ire_dest; - out_route_table->routes[routeNum].mask = - route_set[j].ire_mask; - out_route_table->routes[routeNum].gateway = - route_set[j].ire_gw; - out_route_table->routes[routeNum].ifIndex = - route_set[j].ire_index; - out_route_table->routes[routeNum].metric = - route_set[j].ire_metric; - } + for( j = 0; j < snmpInfo.ipsi_numroutes; j++ ) { + int routeNum = j + routesAdded; + out_route_table->routes[routeNum].dest = + route_set[j].ire_dest; + out_route_table->routes[routeNum].mask = + route_set[j].ire_mask; + out_route_table->routes[routeNum].gateway = + route_set[j].ire_gw; + out_route_table->routes[routeNum].ifIndex = + route_set[j].ire_index; + out_route_table->routes[routeNum].metric = + route_set[j].ire_metric; + } - if( route_set ) tdiFreeThingSet( route_set ); + if( route_set ) tdiFreeThingSet( route_set ); - routesAdded += snmpInfo.ipsi_numroutes; + routesAdded += snmpInfo.ipsi_numroutes; } return out_route_table; diff --git a/reactos/lib/iphlpapi/registry.c b/reactos/lib/iphlpapi/registry.c index 614bbdec492..20ed619680d 100644 --- a/reactos/lib/iphlpapi/registry.c +++ b/reactos/lib/iphlpapi/registry.c @@ -7,17 +7,17 @@ int GetLongestChildKeyName( HANDLE RegHandle ) { DWORD MaxAdapterName; Status = RegQueryInfoKeyA(RegHandle, - NULL, - NULL, - NULL, - NULL, - &MaxAdapterName, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL); + NULL, + NULL, + NULL, + NULL, + &MaxAdapterName, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL); if (Status == ERROR_SUCCESS) return MaxAdapterName + 1; else @@ -25,13 +25,13 @@ int GetLongestChildKeyName( HANDLE RegHandle ) { } LONG OpenChildKeyRead( HANDLE RegHandle, - PCHAR ChildKeyName, - PHKEY ReturnHandle ) { + PCHAR ChildKeyName, + PHKEY ReturnHandle ) { return RegOpenKeyExA( RegHandle, - ChildKeyName, - 0, - KEY_READ, - ReturnHandle ); + ChildKeyName, + 0, + KEY_READ, + ReturnHandle ); } /* @@ -52,7 +52,7 @@ PCHAR GetNthChildKeyName( HANDLE RegHandle, DWORD n ) { ValueLen = MaxAdapterName; Value = (PCHAR)HeapAlloc( GetProcessHeap(), 0, MaxAdapterName ); Status = RegEnumKeyExA( RegHandle, n, Value, &ValueLen, - NULL, NULL, NULL, NULL ); + NULL, NULL, NULL, NULL ); if (Status != ERROR_SUCCESS) return 0; else { @@ -70,12 +70,12 @@ PCHAR QueryRegistryValueString( HANDLE RegHandle, PCHAR ValueName ) { DWORD ReturnedSize = 0; if (RegQueryValueExA( RegHandle, ValueName, NULL, NULL, NULL, - &ReturnedSize ) != 0) + &ReturnedSize ) != 0) return 0; else { Name = malloc( (ReturnedSize + 1) * sizeof(WCHAR) ); RegQueryValueExA( RegHandle, ValueName, NULL, NULL, (PVOID)Name, - &ReturnedSize ); + &ReturnedSize ); Name[ReturnedSize] = 0; return Name; } diff --git a/reactos/lib/iphlpapi/resinfo_reactos.c b/reactos/lib/iphlpapi/resinfo_reactos.c index 39f6aaf14ae..a880a7172d9 100644 --- a/reactos/lib/iphlpapi/resinfo_reactos.c +++ b/reactos/lib/iphlpapi/resinfo_reactos.c @@ -50,11 +50,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(iphlpapi); PIPHLP_RES_INFO getResInfo() { PIPHLP_RES_INFO InfoPtr = - (PIPHLP_RES_INFO)HeapAlloc( GetProcessHeap(), 0, - sizeof(PIPHLP_RES_INFO) ); + (PIPHLP_RES_INFO)HeapAlloc( GetProcessHeap(), 0, + sizeof(PIPHLP_RES_INFO) ); if( InfoPtr ) { - InfoPtr->riCount = 0; - InfoPtr->riAddressList = (LPSOCKADDR)0; + InfoPtr->riCount = 0; + InfoPtr->riAddressList = (LPSOCKADDR)0; } return InfoPtr; From 4903d69f542bc2d115bca83cdb21dbc34988c1b8 Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Wed, 25 Feb 2004 20:35:31 +0000 Subject: [PATCH 0188/1463] Added iphlpapi_private, which used to be ipprivate. Renamed to better go with wine scheme. svn path=/trunk/; revision=8383 --- reactos/lib/iphlpapi/iphlpapi_private.h | 119 ++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 reactos/lib/iphlpapi/iphlpapi_private.h diff --git a/reactos/lib/iphlpapi/iphlpapi_private.h b/reactos/lib/iphlpapi/iphlpapi_private.h new file mode 100644 index 00000000000..b57270ac430 --- /dev/null +++ b/reactos/lib/iphlpapi/iphlpapi_private.h @@ -0,0 +1,119 @@ +#ifndef IPPRIVATE_H +#define IPPRIVATE_H + +#define NtCurrentTeb NtXCurrentTeb + +#include <stdarg.h> +#include <stdlib.h> +#include <sys/types.h> +#ifdef HAVE_NETINET_IN_H +# include <netinet/in.h> +#endif +#ifdef HAVE_ARPA_INET_H +# include <arpa/inet.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +# include <arpa/nameser.h> +#endif +#ifdef HAVE_RESOLV_H +# include <resolv.h> +#endif + +#define NTOS_MODE_USER +#include <ntos.h> +#include <ddk/ntddk.h> +#include <rosrtl/string.h> +#include <ntdll/rtl.h> +#include <net/miniport.h> +#include <winsock2.h> +#include <nspapi.h> +#include <iptypes.h> +#include "iphlpapi.h" +#include "resinfo.h" +#include "wine/debug.h" + +#include "net/tdiinfo.h" +#include "tcpioctl.h" + +#ifndef ETH_ALEN +#define ETH_ALEN 6 +#endif + +#ifndef INADDR_NONE +#define INADDR_NONE (~0U) +#endif + +#ifndef IFENT_SOFTWARE_LOOPBACK +#define IFENT_SOFTWARE_LOOPBACK 24 /* This is an SNMP constant from rfc1213 */ +#endif/*IFENT_SOFTWARE_LOOPBACK*/ + +#define INDEX_IS_LOOPBACK 0x00800000 + +/* Type declarations */ + +#ifndef IFNAMSIZ +#define IFNAMSIZ 0x20 +#endif/*IFNAMSIZ*/ + +#define TCP_REQUEST_QUERY_INFORMATION_INIT { { { 0 } } } +#define TCP_REQUEST_SET_INFORMATION_INIT { { 0 } } + +/* No caddr_t in reactos headers */ +typedef char *caddr_t; + +typedef union _IFEntrySafelySized { + CHAR MaxSize[sizeof(DWORD) + + sizeof(IFEntry) + + MAX_ADAPTER_DESCRIPTION_LENGTH + 1]; + IFEntry ent; +} IFEntrySafelySized; + +typedef union _TCP_REQUEST_SET_INFORMATION_EX_SAFELY_SIZED { + CHAR MaxSize[sizeof(TCP_REQUEST_SET_INFORMATION_EX) - 1 + + sizeof(IPRouteEntry)]; + TCP_REQUEST_SET_INFORMATION_EX Req; +} TCP_REQUEST_SET_INFORMATION_EX_SAFELY_SIZED, + *PTCP_REQUEST_SET_INFORMATION_EX_SAFELY_SIZED; + +/* Encapsulates information about an interface */ +typedef struct _IFInfo { + TDIEntityID entity_id; + IFEntrySafelySized if_info; + IPAddrEntry ip_addr; +} IFInfo; + +typedef enum _IPHLPAddrType { + IPAAddr, IPABcast, IPAMask, IFMtu, IFStatus +} IPHLPAddrType; + +/** Prototypes **/ +NTSTATUS openTcpFile(PHANDLE tcpFile); +VOID closeTcpFile(HANDLE tcpFile); +NTSTATUS tdiGetEntityIDSet( HANDLE tcpFile, TDIEntityID **entitySet, + PDWORD numEntities ); +NTSTATUS tdiGetSetOfThings( HANDLE tcpFile, DWORD toiClass, DWORD toiType, + DWORD toiId, DWORD teiEntity, DWORD fixedPart, + DWORD entrySize, PVOID *tdiEntitySet, + PDWORD numEntries ); +VOID tdiFreeThingSet( PVOID things ); +NTSTATUS getNthIpEntity( HANDLE tcpFile, DWORD index, TDIEntityID *ent ); +NTSTATUS tdiGetIpAddrsForIpEntity( HANDLE tcpFile, TDIEntityID *ent, + IPAddrEntry **addrs, PDWORD numAddrs ); + +int GetLongestChildKeyName( HANDLE RegHandle ); +LONG OpenChildKeyRead( HANDLE RegHandle, + PCHAR ChildKeyName, + PHKEY ReturnHandle ); +PCHAR GetNthChildKeyName( HANDLE RegHandle, DWORD n ); +void ConsumeChildKeyName( PCHAR Name ); +PCHAR QueryRegistryValueString( HANDLE RegHandle, PCHAR ValueName ); +void ConsumeRegValueString( PCHAR NameServer ); + +#include <w32api.h> +/* This is here until we switch to version 2.5 of the mingw headers */ +#if (__W32API_MAJOR_VERSION < 2 || __W32API_MINOR_VERSION < 5) +BOOL WINAPI +GetComputerNameExA(COMPUTER_NAME_FORMAT,LPSTR,LPDWORD); +#endif + +#endif/*IPPRIVATE_H*/ From 6811934f2aec33aea853f38a875df859b3ebe7b9 Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Wed, 25 Feb 2004 21:41:31 +0000 Subject: [PATCH 0189/1463] For now, I changed the _WIN32_WINNT level in iphlpapi_private.h. This will probably need to be changed. svn path=/trunk/; revision=8384 --- reactos/lib/iphlpapi/ifenum_reactos.c | 2 +- reactos/lib/iphlpapi/iphlpapi_private.h | 4 ++-- reactos/lib/iphlpapi/iphlpapiextra.h | 11 ----------- 3 files changed, 3 insertions(+), 14 deletions(-) delete mode 100644 reactos/lib/iphlpapi/iphlpapiextra.h diff --git a/reactos/lib/iphlpapi/ifenum_reactos.c b/reactos/lib/iphlpapi/ifenum_reactos.c index 1aba52674d3..554e4e00cae 100644 --- a/reactos/lib/iphlpapi/ifenum_reactos.c +++ b/reactos/lib/iphlpapi/ifenum_reactos.c @@ -76,7 +76,7 @@ NTSTATUS openTcpFile(PHANDLE tcpFile) { NULL, NULL ); - status = NtCreateFile( tcpFile, + status = ZwCreateFile( tcpFile, SYNCHRONIZE | GENERIC_EXECUTE, &objectAttributes, &ioStatusBlock, diff --git a/reactos/lib/iphlpapi/iphlpapi_private.h b/reactos/lib/iphlpapi/iphlpapi_private.h index b57270ac430..8d957f0d830 100644 --- a/reactos/lib/iphlpapi/iphlpapi_private.h +++ b/reactos/lib/iphlpapi/iphlpapi_private.h @@ -19,8 +19,8 @@ # include <resolv.h> #endif -#define NTOS_MODE_USER -#include <ntos.h> +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x500 #include <ddk/ntddk.h> #include <rosrtl/string.h> #include <ntdll/rtl.h> diff --git a/reactos/lib/iphlpapi/iphlpapiextra.h b/reactos/lib/iphlpapi/iphlpapiextra.h deleted file mode 100644 index 3aa0ae4d8c0..00000000000 --- a/reactos/lib/iphlpapi/iphlpapiextra.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _IPHLPAPIEXTRA_H -#define _IPHLPAPIEXTRA_H - -#include <w32api.h> -/* This is here until we switch to version 2.5 of the mingw headers */ -#if (__W32API_MAJOR_VERSION < 2 || __W32API_MINOR_VERSION < 5) -BOOL WINAPI -GetComputerNameExA(COMPUTER_NAME_FORMAT,LPSTR,LPDWORD); -#endif - -#endif/*_IPHLPAPIEXTRA_H*/ From 4f12cc2e75eee727f3486171bac34129b3ed1009 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Wed, 25 Feb 2004 22:34:57 +0000 Subject: [PATCH 0190/1463] Removed Makefile.ros as it is autogenerated. svn path=/trunk/; revision=8385 --- reactos/lib/odbc32/.cvsignore | 1 + reactos/lib/odbc32/Makefile.ros | 21 --------------------- reactos/lib/winmm/.cvsignore | 1 + reactos/lib/winmm/Makefile.ros | 21 --------------------- 4 files changed, 2 insertions(+), 42 deletions(-) delete mode 100644 reactos/lib/odbc32/Makefile.ros delete mode 100644 reactos/lib/winmm/Makefile.ros diff --git a/reactos/lib/odbc32/.cvsignore b/reactos/lib/odbc32/.cvsignore index d5bf780c608..d121dbaa519 100644 --- a/reactos/lib/odbc32/.cvsignore +++ b/reactos/lib/odbc32/.cvsignore @@ -1,3 +1,4 @@ +Makefile.ros odbc32.dll.dbg.c odbc32.spec.c odbc32.spec.def diff --git a/reactos/lib/odbc32/Makefile.ros b/reactos/lib/odbc32/Makefile.ros deleted file mode 100644 index ba9d8d30902..00000000000 --- a/reactos/lib/odbc32/Makefile.ros +++ /dev/null @@ -1,21 +0,0 @@ -# $Id: Makefile.ros,v 1.1 2004/02/25 20:09:39 sedwards Exp $ - -TARGET_NAME = odbc32 - -TARGET_OBJECTS = proxyodbc.o - -TARGET_CFLAGS = -D__REACTOS__ -D__WINESRC__ - -TARGET_SDKLIBS = kernel32.a libwine.a ntdll.a - -TARGET_BASE = 0x76660000 - -TARGET_RC_SRCS = -TARGET_RC_BINSRC = -TARGET_RC_BINARIES = - -default: all - -DEP_OBJECTS = $(TARGET_OBJECTS) - -include $(TOOLS_PATH)/depend.mk diff --git a/reactos/lib/winmm/.cvsignore b/reactos/lib/winmm/.cvsignore index b37e844ff3e..1e1bd93e31e 100644 --- a/reactos/lib/winmm/.cvsignore +++ b/reactos/lib/winmm/.cvsignore @@ -1,3 +1,4 @@ +Makefile.ros *.coff *.dll *.o diff --git a/reactos/lib/winmm/Makefile.ros b/reactos/lib/winmm/Makefile.ros deleted file mode 100644 index 83748808560..00000000000 --- a/reactos/lib/winmm/Makefile.ros +++ /dev/null @@ -1,21 +0,0 @@ -# $Id: Makefile.ros,v 1.1 2004/02/25 20:00:41 sedwards Exp $ - -TARGET_NAME = winmm - -TARGET_OBJECTS = driver.o joystick.o lolvldrv.o mci.o mmio.o playsound.o time.o winmm.o - -TARGET_CFLAGS = -D_WINMM_ -D__REACTOS__ - -TARGET_SDKLIBS = user32.a advapi32.a kernel32.a ntdll.a libwine.a wine_uuid.a ntdll.a - -TARGET_BASE = 0x76160000 - -TARGET_RC_SRCS = winmm_res.rc -TARGET_RC_BINSRC = -TARGET_RC_BINARIES = - -default: all - -DEP_OBJECTS = $(TARGET_OBJECTS) - -include $(TOOLS_PATH)/depend.mk From 1816da4b7acddd69446ef5213ffbfb5f47dd4cfd Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Wed, 25 Feb 2004 22:36:53 +0000 Subject: [PATCH 0191/1463] Fix building Lsass svn path=/trunk/; revision=8386 --- reactos/subsys/system/lsass/lsass.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/system/lsass/lsass.c b/reactos/subsys/system/lsass/lsass.c index 836ea22c875..a218ff854e8 100644 --- a/reactos/subsys/system/lsass/lsass.c +++ b/reactos/subsys/system/lsass/lsass.c @@ -1,4 +1,4 @@ -/* $Id: lsass.c,v 1.1 2001/07/24 10:18:05 ekohl Exp $ +/* $Id: lsass.c,v 1.2 2004/02/25 22:36:53 sedwards Exp $ * * reactos/services/lsass/lsass.c * @@ -46,8 +46,8 @@ DisplayString( LPCWSTR lpwString ) /* Native image's entry point */ -void -NtProcessStartup( PSTARTUP_ARGUMENT StartupArgument ) +VOID STDCALL +NtProcessStartup(PPEB Peb) { DisplayString( L"Local Security Authority Subsystem:\n" ); DisplayString( L"\tInitializing...\n" ); From 427c8aeb8f0a909970cc892c8540a12c7c8b76cf Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Wed, 25 Feb 2004 22:56:49 +0000 Subject: [PATCH 0192/1463] rebar control for desktop bar svn path=/trunk/; revision=8387 --- .../subsys/system/explorer/doc/changes.txt | 1 + .../system/explorer/taskbar/desktopbar.cpp | 52 +++++++++++++++++-- .../system/explorer/taskbar/desktopbar.h | 1 + .../system/explorer/taskbar/quicklaunch.cpp | 4 +- .../system/explorer/taskbar/taskbar.cpp | 7 +-- 5 files changed, 55 insertions(+), 10 deletions(-) diff --git a/reactos/subsys/system/explorer/doc/changes.txt b/reactos/subsys/system/explorer/doc/changes.txt index 2ad53d9a8f5..5c9be3f46fc 100644 --- a/reactos/subsys/system/explorer/doc/changes.txt +++ b/reactos/subsys/system/explorer/doc/changes.txt @@ -65,3 +65,4 @@ If you search for more information, look into the CVS repository. 16.02.2004 m. fuchs lean explorer version without additional bells and whistles -> see CVS branch "lean-explorer" 23.02.2004 m. fuchs start menu navigation using first characters of entry names fixes for leaking GDI handles +25.02.2004 m. fuchs rebar control for desktop bar diff --git a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp index 759d7d2fc9d..abfdade55a6 100644 --- a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp @@ -103,6 +103,44 @@ LRESULT DesktopBar::Init(LPCREATESTRUCT pcs) _hwndQuickLaunch = QuickLaunchBar::Create(_hwnd); + // create rebar window to manage task and quick launch bar +#ifndef _NO_REBAR + _hwndrebar = CreateWindowEx(WS_EX_TOOLWINDOW, REBARCLASSNAME, NULL, + WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN| + RBS_VARHEIGHT|RBS_AUTOSIZE|RBS_DBLCLKTOGGLE| //|RBS_REGISTERDROP + CCS_NODIVIDER|CCS_NOPARENTALIGN, + 0, 0, 0, 0, _hwnd, 0, g_Globals._hInstance, 0); + + REBARBANDINFO rbBand; + + rbBand.cbSize = sizeof(REBARBANDINFO); + rbBand.fMask = RBBIM_TEXT|RBBIM_STYLE|RBBIM_CHILD|RBBIM_CHILDSIZE|RBBIM_SIZE; +#ifndef RBBS_HIDETITLE // missing in MinGW headers as of 25.02.2004 +#define RBBS_HIDETITLE 0x400 +#endif + rbBand.fStyle = RBBS_CHILDEDGE|RBBS_GRIPPERALWAYS|RBBS_HIDETITLE; + + rbBand.cxMinChild = 0; + rbBand.cyMinChild = 0; + rbBand.cyChild = 0; + rbBand.cyMaxChild = 0; + rbBand.cyIntegral = DESKTOPBARBAR_HEIGHT; + + rbBand.lpText = TEXT("Quicklaunchbar"); + rbBand.hwndChild = _hwndQuickLaunch; + rbBand.cxMinChild = 0; + rbBand.cyMinChild = HIWORD(SendMessage(_hwndQuickLaunch, TB_GETBUTTONSIZE, 0, 0)) + 2; + rbBand.cx = 250; + SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand); + + rbBand.lpText = TEXT("Taskbar"); + rbBand.hwndChild = _hwndTaskBar; + rbBand.cxMinChild = 0; + rbBand.cyMinChild = ClientRect(_hwndTaskBar).bottom + 2; + rbBand.cx = 200; //pcs->cx-TASKBAR_LEFT-quicklaunch_width-(notifyarea_width+1); + SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand); +#endif + RegisterHotkeys(); // notify all top level windows about the successfully created desktop bar @@ -204,15 +242,19 @@ void DesktopBar::Resize(int cx, int cy) HDWP hdwp = BeginDeferWindowPos(3); - if (_hwndTaskBar) - DeferWindowPos(hdwp, _hwndTaskBar, 0, TASKBAR_LEFT+quicklaunch_width, 0, cx-TASKBAR_LEFT-quicklaunch_width-(notifyarea_width+1), cy, SWP_NOZORDER|SWP_NOACTIVATE); + if (_hwndrebar) + DeferWindowPos(hdwp, _hwndrebar, 0, TASKBAR_LEFT, 0, cx-TASKBAR_LEFT-(notifyarea_width+1), cy, SWP_NOZORDER|SWP_NOACTIVATE); + else { + if (_hwndQuickLaunch) + DeferWindowPos(hdwp, _hwndQuickLaunch, 0, TASKBAR_LEFT, 1, quicklaunch_width, cy-2, SWP_NOZORDER|SWP_NOACTIVATE); + + if (_hwndTaskBar) + DeferWindowPos(hdwp, _hwndTaskBar, 0, TASKBAR_LEFT+quicklaunch_width, 0, cx-TASKBAR_LEFT-quicklaunch_width-(notifyarea_width+1), cy, SWP_NOZORDER|SWP_NOACTIVATE); + } if (_hwndNotify) DeferWindowPos(hdwp, _hwndNotify, 0, cx-(notifyarea_width+1), 1, notifyarea_width, cy-2, SWP_NOZORDER|SWP_NOACTIVATE); - if (_hwndQuickLaunch) - DeferWindowPos(hdwp, _hwndQuickLaunch, 0, TASKBAR_LEFT, 1, quicklaunch_width, cy-2, SWP_NOZORDER|SWP_NOACTIVATE); - EndDeferWindowPos(hdwp); WindowRect rect(_hwnd); diff --git a/reactos/subsys/system/explorer/taskbar/desktopbar.h b/reactos/subsys/system/explorer/taskbar/desktopbar.h index 64222c8052f..06a8271e41a 100644 --- a/reactos/subsys/system/explorer/taskbar/desktopbar.h +++ b/reactos/subsys/system/explorer/taskbar/desktopbar.h @@ -92,6 +92,7 @@ protected: WindowHandle _hwndTaskBar; WindowHandle _hwndNotify; WindowHandle _hwndQuickLaunch; + WindowHandle _hwndrebar; struct StartMenuRoot* _startMenuRoot; }; diff --git a/reactos/subsys/system/explorer/taskbar/quicklaunch.cpp b/reactos/subsys/system/explorer/taskbar/quicklaunch.cpp index 8c411cdbc65..89b59f276c7 100644 --- a/reactos/subsys/system/explorer/taskbar/quicklaunch.cpp +++ b/reactos/subsys/system/explorer/taskbar/quicklaunch.cpp @@ -65,7 +65,6 @@ QuickLaunchBar::QuickLaunchBar(HWND hwnd) SetWindowStyle(hwndToolTip, GetWindowStyle(hwndToolTip)|TTS_ALWAYSTIP); - // delay refresh to some time later PostMessage(hwnd, PM_REFRESH, 0, 0); } @@ -81,7 +80,8 @@ HWND QuickLaunchBar::Create(HWND hwndParent) ClientRect clnt(hwndParent); HWND hwnd = CreateToolbarEx(hwndParent, - WS_CHILD|WS_VISIBLE|CCS_NODIVIDER|CCS_NORESIZE| + WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN| + CCS_TOP|CCS_NODIVIDER|CCS_NOPARENTALIGN|CCS_NORESIZE| TBSTYLE_TOOLTIPS|TBSTYLE_WRAPABLE|TBSTYLE_FLAT, IDW_QUICKLAUNCHBAR, 0, 0, 0, NULL, 0, 0, 0, 16, 16, sizeof(TBBUTTON)); diff --git a/reactos/subsys/system/explorer/taskbar/taskbar.cpp b/reactos/subsys/system/explorer/taskbar/taskbar.cpp index 9c33e7ec8c4..b3e3189947c 100644 --- a/reactos/subsys/system/explorer/taskbar/taskbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/taskbar.cpp @@ -72,7 +72,8 @@ HWND TaskBar::Create(HWND hwndParent) ClientRect clnt(hwndParent); return Window::Create(WINDOW_CREATOR(TaskBar), 0, - BtnWindowClass(CLASSNAME_TASKBAR), TITLE_TASKBAR, WS_CHILD|WS_VISIBLE, + BtnWindowClass(CLASSNAME_TASKBAR), TITLE_TASKBAR, + WS_CHILD|WS_VISIBLE | CCS_TOP|CCS_NODIVIDER|CCS_NORESIZE, TASKBAR_LEFT, 0, clnt.right-TASKBAR_LEFT-(NOTIFYAREA_WIDTH_DEF+1), clnt.bottom, hwndParent); } @@ -82,8 +83,8 @@ LRESULT TaskBar::Init(LPCREATESTRUCT pcs) return 1; _htoolbar = CreateToolbarEx(_hwnd, - WS_CHILD|WS_VISIBLE|CCS_NODIVIDER|CCS_TOP| - TBSTYLE_LIST|TBSTYLE_TOOLTIPS|TBSTYLE_WRAPABLE, + WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN| + CCS_TOP|CCS_NODIVIDER | TBSTYLE_LIST|TBSTYLE_TOOLTIPS|TBSTYLE_WRAPABLE, IDW_TASKTOOLBAR, 0, 0, 0, NULL, 0, 0, 0, 16, 16, sizeof(TBBUTTON)); SendMessage(_htoolbar, TB_SETBUTTONWIDTH, 0, MAKELONG(80,160)); From 2ef4c4f1ad0b78bf80cb2861f33d6d36d71d09a1 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Wed, 25 Feb 2004 23:12:39 +0000 Subject: [PATCH 0193/1463] Fixed error introduced by removing the stubs. Created new file hwprofiles.c for GetCurrentHwProfileA svn path=/trunk/; revision=8388 --- reactos/lib/advapi32/advapi32.def | 4 ++-- reactos/lib/advapi32/advapi32.edf | 4 ++-- reactos/lib/advapi32/makefile | 3 ++- reactos/lib/advapi32/misc/hwprofiles.c | 30 ++++++++++++++++++++++++++ 4 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 reactos/lib/advapi32/misc/hwprofiles.c diff --git a/reactos/lib/advapi32/advapi32.def b/reactos/lib/advapi32/advapi32.def index e7363fdf0ba..a7a25f70ab7 100644 --- a/reactos/lib/advapi32/advapi32.def +++ b/reactos/lib/advapi32/advapi32.def @@ -1,4 +1,4 @@ -; $Id: advapi32.def,v 1.12 2004/02/25 14:25:10 ekohl Exp $ +; $Id: advapi32.def,v 1.13 2004/02/25 23:12:38 sedwards Exp $ ; ; advapi32.def ; @@ -124,7 +124,7 @@ GetAclInformation@16 ;GetAuditedPermissionsFromAclW@16 ;GetAuditedPermissionsFromSDA ;GetAuditedPermissionsFromSDW -;GetCurrentHwProfileA@4 +GetCurrentHwProfileA@4 ;GetCurrentHwProfileW@4 ;GetEffectiveAccessRightsA ;GetEffectiveAccessRightsW diff --git a/reactos/lib/advapi32/advapi32.edf b/reactos/lib/advapi32/advapi32.edf index 3af35f98bd3..308896e352a 100644 --- a/reactos/lib/advapi32/advapi32.edf +++ b/reactos/lib/advapi32/advapi32.edf @@ -1,4 +1,4 @@ -; $Id: advapi32.edf,v 1.28 2004/02/25 14:25:10 ekohl Exp $ +; $Id: advapi32.edf,v 1.29 2004/02/25 23:12:38 sedwards Exp $ ; ; advapi32.edf ; @@ -120,7 +120,7 @@ GetAclInformation=GetAclInformation@16 ;GetAuditedPermissionsFromAclW=GetAuditedPermissionsFromAclW@16 ;GetAuditedPermissionsFromSDA ;GetAuditedPermissionsFromSDW -;GetCurrentHwProfileA=GetCurrentHwProfileA@4 +GetCurrentHwProfileA=GetCurrentHwProfileA@4 ;GetCurrentHwProfileW=GetCurrentHwProfileW@4 ;GetEffectiveAccessRightsA ;GetEffectiveAccessRightsW diff --git a/reactos/lib/advapi32/makefile b/reactos/lib/advapi32/makefile index 410dda722e8..9af2602f9fc 100644 --- a/reactos/lib/advapi32/makefile +++ b/reactos/lib/advapi32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.33 2004/02/25 14:25:10 ekohl Exp $ +# $Id: makefile,v 1.34 2004/02/25 23:12:39 sedwards Exp $ PATH_TO_TOP = ../.. @@ -17,6 +17,7 @@ TARGET_BASE = 0x77DB0000 MISC_OBJECTS = \ misc/dllmain.o \ + misc/hwprofiles.o \ misc/logon.o \ misc/shutdown.o \ misc/sysfunc.o diff --git a/reactos/lib/advapi32/misc/hwprofiles.c b/reactos/lib/advapi32/misc/hwprofiles.c new file mode 100644 index 00000000000..f0f18713442 --- /dev/null +++ b/reactos/lib/advapi32/misc/hwprofiles.c @@ -0,0 +1,30 @@ +/* $Id: hwprofiles.c,v 1.1 2004/02/25 23:12:39 sedwards Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * FILE: lib/advapi32/misc/sysfun.c + * PURPOSE: advapi32.dll Hardware Functions + * PROGRAMMER: Steven Edwards + * UPDATE HISTORY: + * 20042502 + */ +#include <debug.h> +#include <windows.h> + +/****************************************************************************** + * GetCurrentHwProfileA [ADVAPI32.@] + * + * Get the current hardware profile. + * + * PARAMS + * pInfo [O] Destination for hardware profile information. + * + * RETURNS + * Success: TRUE. pInfo is updated with the hardware profile details. + * Failure: FALSE. + */ +BOOL STDCALL GetCurrentHwProfileA(LPHW_PROFILE_INFOA pInfo) +{ + DPRINT("GetCurrentHwProfileA stub\n"); + return 1; +} From 22d250a711af3975db1a70dfd50a1dd78ff93305 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Wed, 25 Feb 2004 23:13:37 +0000 Subject: [PATCH 0194/1463] Forgot to commit this. svn path=/trunk/; revision=8389 --- reactos/include/wine/wownt32.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/reactos/include/wine/wownt32.h b/reactos/include/wine/wownt32.h index 04fc96a105b..bf221ff69bc 100644 --- a/reactos/include/wine/wownt32.h +++ b/reactos/include/wine/wownt32.h @@ -25,5 +25,9 @@ #define HWND_16(h32) (LOWORD(h32)) #endif +#ifndef HWND_32 +#define HWND_32(h16) ((HWND) (ULONG_PTR)(h16)) +#endif + #endif /* _WOWNT32_H_ */ From 8a3a4af5330359755d594ab5aa9e336cf920849a Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Wed, 25 Feb 2004 23:33:42 +0000 Subject: [PATCH 0195/1463] - Initialize/delete the lock of a screen buffer. svn path=/trunk/; revision=8390 --- reactos/subsys/csrss/win32csr/conio.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/csrss/win32csr/conio.c b/reactos/subsys/csrss/win32csr/conio.c index f560c2c0a01..55e8559ffb5 100644 --- a/reactos/subsys/csrss/win32csr/conio.c +++ b/reactos/subsys/csrss/win32csr/conio.c @@ -1,4 +1,4 @@ -/* $Id: conio.c,v 1.5 2004/02/25 18:12:52 hbirr Exp $ +/* $Id: conio.c,v 1.6 2004/02/25 23:33:42 hbirr Exp $ * * reactos/subsys/csrss/win32csr/conio.c * @@ -130,6 +130,7 @@ CsrInitConsoleScreenBuffer(PCSRSS_CONSOLE Console, { return STATUS_INSUFFICIENT_RESOURCES; } + RtlInitializeCriticalSection(&Buffer->Header.Lock); ConioInitScreenBuffer(Console, Buffer); /* initialize buffer to be empty with default attributes */ for (Buffer->CurrentY = 0 ; Buffer->CurrentY < Buffer->MaxY; Buffer->CurrentY++) @@ -874,6 +875,7 @@ VOID STDCALL ConioDeleteScreenBuffer(Object_t *Object) { PCSRSS_SCREEN_BUFFER Buffer = (PCSRSS_SCREEN_BUFFER) Object; + RtlDeleteCriticalSection(&Buffer->Header.Lock); HeapFree(Win32CsrApiHeap, 0, Buffer->Buffer); HeapFree(Win32CsrApiHeap, 0, Buffer); } From 6645e904c749e508cdcd7d436fd279af54c3c1d0 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Wed, 25 Feb 2004 23:50:28 +0000 Subject: [PATCH 0196/1463] Added Winehq2ros.patch for winmm svn path=/trunk/; revision=8391 --- reactos/lib/winmm/winehq2ros.patch | 68 ++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 reactos/lib/winmm/winehq2ros.patch diff --git a/reactos/lib/winmm/winehq2ros.patch b/reactos/lib/winmm/winehq2ros.patch new file mode 100644 index 00000000000..44c2764e0eb --- /dev/null +++ b/reactos/lib/winmm/winehq2ros.patch @@ -0,0 +1,68 @@ +diff -u /c/source/wine/dlls/winmm/lolvldrv.c winmm/lolvldrv.c +--- /c/source/wine/dlls/winmm/lolvldrv.c Wed Feb 25 18:47:36 2004 ++++ winmm/lolvldrv.c Tue Feb 17 01:15:52 2004 +@@ -497,10 +497,12 @@ + case DRV_QUERYDEVICEINTERFACESIZE: + return MMDRV_Message(mld, uMsg, dwParam1, dwParam2, TRUE); + ++#ifdef __WINESRC__ + case DRV_QUERYDSOUNDIFACE: /* Wine-specific: Retrieve DirectSound interface */ + case DRV_QUERYDSOUNDDESC: /* Wine-specific: Retrieve DirectSound driver description*/ + case DRV_QUERYDSOUNDGUID: /* Wine-specific: Retrieve DirectSound driver GUID */ + return MMDRV_Message(mld, uMsg, dwParam1, dwParam2, TRUE); ++#endif + + default: + WARN("Unknown call %04x\n", uMsg); +@@ -741,8 +743,9 @@ + static BOOL MMDRV_InitHardcoded(void) + { + /* first load hardware drivers */ ++#ifndef __REACTOS__ + MMDRV_Install("wineoss.drv", "wineoss.drv", FALSE); +- ++#endif /* __REACTOS__ */ + /* finish with mappers */ + MMDRV_Install("wavemapper", "msacm.drv", TRUE); + MMDRV_Install("midimapper", "midimap.drv", TRUE); + +diff -u /c/source/wine/dlls/winmm/time.c winmm/time.c +--- /c/source/wine/dlls/winmm/time.c Mon Jan 12 16:03:10 2004 ++++ winmm/time.c Sun Feb 15 16:55:10 2004 +@@ -175,14 +175,19 @@ + volatile HANDLE *pActive = (volatile HANDLE *)&TIME_hMMTimer; + DWORD last_time, cur_time; + ++#ifndef __REACTOS__ + usleep(MMSYSTIME_STDINTERVAL * 1000); ++#endif /* __REACTOS__ */ ++ + last_time = GetTickCount(); + while (*pActive) { + TIME_MMSysTimeCallback(iData); + cur_time = GetTickCount(); + while (last_time < cur_time) + last_time += MMSYSTIME_STDINTERVAL; ++#ifndef __REACTOS__ + usleep((last_time - cur_time) * 1000); ++#endif /* __REACTOS__ */ + } + return 0; + } + +diff -u /c/source/wine/dlls/winmm/winmm.c winmm/winmm.c +--- /c/source/wine/dlls/winmm/winmm.c Wed Feb 25 14:28:52 2004 ++++ winmm/winmm.c Sun Feb 15 22:58:58 2004 +@@ -125,10 +125,12 @@ + loaded = -1; + if (h) + { ++#ifndef __REACTOS__ + pGetModuleHandle16 = (void*)GetProcAddress(h, "GetModuleHandle16"); + pLoadLibrary16 = (void*)GetProcAddress(h, "LoadLibrary16"); + if (pGetModuleHandle16 && pLoadLibrary16 && + (pGetModuleHandle16("MMSYSTEM.DLL") || pLoadLibrary16("MMSYSTEM.DLL"))) ++#endif /* __REACTOS__ */ + loaded = 1; + } + } From 23cc7e88c1626d8236e63fe59afe61e30df95ad6 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Wed, 25 Feb 2004 23:54:13 +0000 Subject: [PATCH 0197/1463] Added stubs for GetFileSecurityA, SetFileSecurityA and GetUserName based on Winehq sources to get Dependancy Walker working again. svn path=/trunk/; revision=8392 --- reactos/lib/advapi32/advapi32.def | 7 ++--- reactos/lib/advapi32/advapi32.edf | 8 +++--- reactos/lib/advapi32/sec/misc.c | 24 ++++++++++++++++- reactos/lib/advapi32/sec/sec.c | 45 ++++++++++++++++++++++++++++++- 4 files changed, 75 insertions(+), 9 deletions(-) diff --git a/reactos/lib/advapi32/advapi32.def b/reactos/lib/advapi32/advapi32.def index a7a25f70ab7..772a26557b0 100644 --- a/reactos/lib/advapi32/advapi32.def +++ b/reactos/lib/advapi32/advapi32.def @@ -1,4 +1,4 @@ -; $Id: advapi32.def,v 1.13 2004/02/25 23:12:38 sedwards Exp $ +; $Id: advapi32.def,v 1.14 2004/02/25 23:54:12 sedwards Exp $ ; ; advapi32.def ; @@ -136,7 +136,7 @@ GetCurrentHwProfileA@4 ;GetExplicitAccessRightsW ;GetExplicitEntriesFromAclA@12 ;GetExplicitEntriesFromAclW@12 -;GetFileSecurityA@20 +GetFileSecurityA@20 ;GetFileSecurityW@20 GetKernelObjectSecurity@20 GetLengthSid@4 @@ -169,7 +169,7 @@ GetTokenInformation@20 ;GetTrusteeNameW@4 ;GetTrusteeTypeA@4 ;GetTrusteeTypeW@4 -;GetUserNameA@8 +GetUserNameA@8 ;GetUserNameW@8 ;GrantAccessRightsA@16 ;GrantAccessRightsW@16 @@ -352,6 +352,7 @@ RevertToSelf@0 SetAclInformation@16 ;SetEntriesInAclA@16 ;SetEntriesInAclW@16 +SetFileSecurityA@20 SetKernelObjectSecurity@12 ;SetNamedSecurityInfoA@28 ;SetNamedSecurityInfoW@28 diff --git a/reactos/lib/advapi32/advapi32.edf b/reactos/lib/advapi32/advapi32.edf index 308896e352a..221b0efc3e7 100644 --- a/reactos/lib/advapi32/advapi32.edf +++ b/reactos/lib/advapi32/advapi32.edf @@ -1,4 +1,4 @@ -; $Id: advapi32.edf,v 1.29 2004/02/25 23:12:38 sedwards Exp $ +; $Id: advapi32.edf,v 1.30 2004/02/25 23:54:12 sedwards Exp $ ; ; advapi32.edf ; @@ -132,7 +132,7 @@ GetCurrentHwProfileA=GetCurrentHwProfileA@4 ;GetExplicitAccessRightsW ;GetExplicitEntriesFromAclA=GetExplicitEntriesFromAclA@12 ;GetExplicitEntriesFromAclW=GetExplicitEntriesFromAclW@12 -;GetFileSecurityA=GetFileSecurityA@20 +GetFileSecurityA=GetFileSecurityA@20 ;GetFileSecurityW=GetFileSecurityW@20 GetKernelObjectSecurity=GetKernelObjectSecurity@20 GetLengthSid=GetLengthSid@4 @@ -165,7 +165,7 @@ GetTokenInformation=GetTokenInformation@20 ;GetTrusteeNameW=GetTrusteeNameW@4 ;GetTrusteeTypeA=GetTrusteeTypeA@4 ;GetTrusteeTypeW=GetTrusteeTypeW@4 -;GetUserNameA=GetUserNameA@8 +GetUserNameA=GetUserNameA@8 ;GetUserNameW=GetUserNameW@8 ;GrantAccessRightsA=GrantAccessRightsA@16 ;GrantAccessRightsW=GrantAccessRightsW@16 @@ -349,7 +349,7 @@ RevertToSelf=RevertToSelf@0 SetAclInformation=SetAclInformation@16 ;SetEntriesInAclA=SetEntriesInAclA@16 ;SetEntriesInAclW=SetEntriesInAclW@16 -;SetFileSecurityA=SetFileSecurityA@12 +SetFileSecurityA=SetFileSecurityA@12 ;SetFileSecurityW=SetFileSecurityW@12 SetKernelObjectSecurity=SetKernelObjectSecurity@12 ;SetNamedSecurityInfoA=SetNamedSecurityInfoA@28 diff --git a/reactos/lib/advapi32/sec/misc.c b/reactos/lib/advapi32/sec/misc.c index 9ea41e8981d..6f7b1f7eed6 100644 --- a/reactos/lib/advapi32/sec/misc.c +++ b/reactos/lib/advapi32/sec/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.9 2004/02/25 14:25:11 ekohl Exp $ +/* $Id: misc.c,v 1.10 2004/02/25 23:54:13 sedwards Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -6,6 +6,7 @@ * PURPOSE: Miscellaneous security functions */ +#include <debug.h> #define NTOS_MODE_USER #include <ntos.h> #include <windows.h> @@ -144,5 +145,26 @@ RevertToSelf(VOID) return(TRUE); } + +/****************************************************************************** + * GetUserNameA [ADVAPI32.@] + * + * Get the current user name. + * + * PARAMS + * lpszName [O] Destination for the user name. + * lpSize [I/O] Size of lpszName. + * + * RETURNS + * Success: The length of the user name, including terminating NUL. + * Failure: ERROR_MORE_DATA if *lpSize is too small. + */ +BOOL STDCALL +GetUserNameA( LPSTR lpszName, LPDWORD lpSize ) +{ + DPRINT1("GetUserNameA - Unimplemented\n"); + return 1; +} + /* EOF */ diff --git a/reactos/lib/advapi32/sec/sec.c b/reactos/lib/advapi32/sec/sec.c index daffaa352ae..7937b602e5f 100644 --- a/reactos/lib/advapi32/sec/sec.c +++ b/reactos/lib/advapi32/sec/sec.c @@ -1,4 +1,4 @@ -/* $Id: sec.c,v 1.18 2004/02/25 14:25:11 ekohl Exp $ +/* $Id: sec.c,v 1.19 2004/02/25 23:54:13 sedwards Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -11,10 +11,41 @@ * Created 01/11/98 */ +#include <debug.h> #define NTOS_MODE_USER #include <windows.h> #include <ntos.h> +/****************************************************************************** + * GetFileSecurityA [ADVAPI32.@] + * + * Obtains Specified information about the security of a file or directory. + * + * PARAMS + * lpFileName [I] Name of the file to get info for + * RequestedInformation [I] SE_ flags from "winnt.h" + * pSecurityDescriptor [O] Destination for security information + * nLength [I] Length of pSecurityDescriptor + * lpnLengthNeeded [O] Destination for length of returned security information + * + * RETURNS + * Success: TRUE. pSecurityDescriptor contains the requested information. + * Failure: FALSE. lpnLengthNeeded contains the required space to return the info. + * + * NOTES + * The information returned is constrained by the callers access rights and + * privileges. + */ +BOOL WINAPI +GetFileSecurityA( LPCSTR lpFileName, + SECURITY_INFORMATION RequestedInformation, + PSECURITY_DESCRIPTOR pSecurityDescriptor, + DWORD nLength, LPDWORD lpnLengthNeeded ) +{ + DPRINT("GetFileSecurityW : stub\n"); + return TRUE; +} + /* * @implemented @@ -289,6 +320,18 @@ MakeSelfRelativeSD ( return TRUE; } +/****************************************************************************** + * SetFileSecurityA [ADVAPI32.@] + * Sets the security of a file or directory + */ +BOOL STDCALL SetFileSecurityA( LPCSTR lpFileName, + SECURITY_INFORMATION RequestedInformation, + PSECURITY_DESCRIPTOR pSecurityDescriptor) +{ + DPRINT("SetFileSecurityA : stub\n"); + return TRUE; +} + /* * @implemented From 8e76a54705d33674ec8c32a1557c3ea6932d9565 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Thu, 26 Feb 2004 00:33:09 +0000 Subject: [PATCH 0198/1463] Added stub of IsTextUnicode to get notepad working again...... .....The next time someone submits copyrighted code and it makes it in to CVS the contributor and the person that committed it are going to get a visit from me. svn path=/trunk/; revision=8393 --- reactos/lib/advapi32/advapi32.def | 4 ++-- reactos/lib/advapi32/advapi32.edf | 4 ++-- reactos/lib/advapi32/makefile | 5 +++-- reactos/lib/advapi32/misc/text.c | 17 +++++++++++++++++ 4 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 reactos/lib/advapi32/misc/text.c diff --git a/reactos/lib/advapi32/advapi32.def b/reactos/lib/advapi32/advapi32.def index 772a26557b0..44b87c8c4b1 100644 --- a/reactos/lib/advapi32/advapi32.def +++ b/reactos/lib/advapi32/advapi32.def @@ -1,4 +1,4 @@ -; $Id: advapi32.def,v 1.14 2004/02/25 23:54:12 sedwards Exp $ +; $Id: advapi32.def,v 1.15 2004/02/26 00:33:09 sedwards Exp $ ; ; advapi32.def ; @@ -186,7 +186,7 @@ InitiateSystemShutdownA@20 InitiateSystemShutdownW@20 ;IsAccessPermittedA@20 ;IsAccessPermittedW@20 -;IsTextUnicode@12 +IsTextUnicode@12 IsValidAcl@4 IsValidSecurityDescriptor@4 IsValidSid@4 diff --git a/reactos/lib/advapi32/advapi32.edf b/reactos/lib/advapi32/advapi32.edf index 221b0efc3e7..0868b8af518 100644 --- a/reactos/lib/advapi32/advapi32.edf +++ b/reactos/lib/advapi32/advapi32.edf @@ -1,4 +1,4 @@ -; $Id: advapi32.edf,v 1.30 2004/02/25 23:54:12 sedwards Exp $ +; $Id: advapi32.edf,v 1.31 2004/02/26 00:33:09 sedwards Exp $ ; ; advapi32.edf ; @@ -182,7 +182,7 @@ InitiateSystemShutdownA=InitiateSystemShutdownA@20 InitiateSystemShutdownW=InitiateSystemShutdownW@20 ;IsAccessPermittedA=IsAccessPermittedA@20 ;IsAccessPermittedW=IsAccessPermittedW@20 -;IsTextUnicode=IsTextUnicode@12 +IsTextUnicode=IsTextUnicode@12 IsValidAcl=IsValidAcl@4 IsValidSecurityDescriptor=IsValidSecurityDescriptor@4 IsValidSid=IsValidSid@4 diff --git a/reactos/lib/advapi32/makefile b/reactos/lib/advapi32/makefile index 9af2602f9fc..8b4ceeb5026 100644 --- a/reactos/lib/advapi32/makefile +++ b/reactos/lib/advapi32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.34 2004/02/25 23:12:39 sedwards Exp $ +# $Id: makefile,v 1.35 2004/02/26 00:33:09 sedwards Exp $ PATH_TO_TOP = ../.. @@ -20,7 +20,8 @@ MISC_OBJECTS = \ misc/hwprofiles.o \ misc/logon.o \ misc/shutdown.o \ - misc/sysfunc.o + misc/sysfunc.o \ + misc/text.o REGISTRY_OBJECTS = \ reg/reg.o diff --git a/reactos/lib/advapi32/misc/text.c b/reactos/lib/advapi32/misc/text.c new file mode 100644 index 00000000000..bd120f9d06d --- /dev/null +++ b/reactos/lib/advapi32/misc/text.c @@ -0,0 +1,17 @@ +/* $Id: text.c,v 1.1 2004/02/26 00:33:09 sedwards Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * FILE: lib/advapi32/misc/text.c + * PURPOSE: advapi32.dll Text Functions + * PROGRAMMER: Steven Edwards + * UPDATE HISTORY: + * 20042502 + */ +#include <windows.h> + +BOOL STDCALL IsTextUnicode(CONST VOID* pbuffer, int cb, LPINT lpi) +{ + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return 0; +} From d36d4e1f21cb69905b583801c522325e12d82bb7 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Thu, 26 Feb 2004 01:42:21 +0000 Subject: [PATCH 0199/1463] Updated for Winmm changes. svn path=/trunk/; revision=8394 --- reactos/doc/README.WINE | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/reactos/doc/README.WINE b/reactos/doc/README.WINE index 725f565f03a..9672be1fa45 100644 --- a/reactos/doc/README.WINE +++ b/reactos/doc/README.WINE @@ -4,7 +4,8 @@ The ReactOS Project shares quite a bit of code with the WINE project. This document should provide a compleate reference for all of the locations in the ReactOS source tree where code is shared between the -two projects. +two projects. If you find something is missing from this documentation +please add it. If you find that a function in ReactOS that is not implemented properly and is based on WINE sources, check the latest Winehq CVS and see if @@ -12,7 +13,6 @@ it has been fixed there. If so, please submit a patch to ros-kernel@reactos.com. Otherwise please send a patch to both wine-patches@winehq.com and ros-kernel@reactos.com - When porting a dll from WINE to ReactOS please take a look at how comctl32 has been imported. We start by creating a makefile that has a target defined like so: @@ -35,18 +35,19 @@ The following shared libraries are a 100% port from Winehq sourcs. reactos/lib/cabinet reactos/lib/comctl32 # Synced to Wine-20040121 reactos/lib/comdlg32 -reactos/lib/imagehlp #Out of sync +reactos/lib/imagehlp # Out of sync reactos/lib/imm32 +reactos/lib/msvideo # Syned to WINE-20040213 reactos/lib/msvcrt20 reactos/lib/mpr # Imported 20040201 reactos/lib/ole32 # Synced to Wine-20040121 reactos/lib/richedit # Synced 20040201 -reactos/lib/rpcrt4 #Out of date In need of new merge +reactos/lib/rpcrt4 # Out of date+Hack. In need of new merge reactos/lib/shell32 # 2004/01/22: Heavy syncing in progress reactos/lib/shlwapi # Synced to Wine-20040121 -reactos/lib/twain #Out of sync -reactos/lib/unicode #make this go away. -reactos/lib/winmm #Out of sync +reactos/lib/twain # Out of sync +reactos/lib/unicode # make this go away. +reactos/lib/winmm # Syned to WINE-20040213 ReactOS shares the following programs with Winehq. reactos/subsys/system/regedit #Out of sync @@ -64,4 +65,3 @@ reactos/lib/user32/windows/mdi.c reactos/lib/gdi32/objects/linedda.c reactos/lib/kernel32/misc/errormsg.c reactos/lib/msvcrt/wine/* - C++ exception handing - From cf035ffc0372943a0cb79cc0641e05d4cae0d55d Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Thu, 26 Feb 2004 02:01:13 +0000 Subject: [PATCH 0200/1463] Imported Olepro32 from WINE CVS-20040225....... ...I really want to get MFC working. svn path=/trunk/; revision=8395 --- reactos/lib/olepro32/.cvsignore | 20 +++++++ reactos/lib/olepro32/Makefile | 9 +++ reactos/lib/olepro32/Makefile.in | 12 ++++ reactos/lib/olepro32/Makefile.ros-template | 21 +++++++ reactos/lib/olepro32/README | 9 +++ reactos/lib/olepro32/olepro32.rc | 28 +++++++++ reactos/lib/olepro32/olepro32.spec | 11 ++++ reactos/lib/olepro32/olepro32stubs.c | 68 ++++++++++++++++++++++ 8 files changed, 178 insertions(+) create mode 100644 reactos/lib/olepro32/.cvsignore create mode 100644 reactos/lib/olepro32/Makefile create mode 100644 reactos/lib/olepro32/Makefile.in create mode 100644 reactos/lib/olepro32/Makefile.ros-template create mode 100644 reactos/lib/olepro32/README create mode 100644 reactos/lib/olepro32/olepro32.rc create mode 100644 reactos/lib/olepro32/olepro32.spec create mode 100644 reactos/lib/olepro32/olepro32stubs.c diff --git a/reactos/lib/olepro32/.cvsignore b/reactos/lib/olepro32/.cvsignore new file mode 100644 index 00000000000..9edd5cbe53b --- /dev/null +++ b/reactos/lib/olepro32/.cvsignore @@ -0,0 +1,20 @@ +*.coff +*.dll +*.d +*.a +*.o +*.sym +*.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 diff --git a/reactos/lib/olepro32/Makefile b/reactos/lib/olepro32/Makefile new file mode 100644 index 00000000000..5dbab8ecb97 --- /dev/null +++ b/reactos/lib/olepro32/Makefile @@ -0,0 +1,9 @@ +# $Id: Makefile,v 1.1 2004/02/26 02:01:13 sedwards Exp $ + +PATH_TO_TOP = ../.. + +TARGET_TYPE = winedll + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk diff --git a/reactos/lib/olepro32/Makefile.in b/reactos/lib/olepro32/Makefile.in new file mode 100644 index 00000000000..280fd841b05 --- /dev/null +++ b/reactos/lib/olepro32/Makefile.in @@ -0,0 +1,12 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = olepro32.dll +IMPORTS = oleaut32 + +C_SRCS = olepro32stubs.c + +@MAKE_DLL_RULES@ + +### Dependencies: diff --git a/reactos/lib/olepro32/Makefile.ros-template b/reactos/lib/olepro32/Makefile.ros-template new file mode 100644 index 00000000000..833e09a6af2 --- /dev/null +++ b/reactos/lib/olepro32/Makefile.ros-template @@ -0,0 +1,21 @@ +# $Id: Makefile.ros-template,v 1.1 2004/02/26 02:01:13 sedwards Exp $ + +TARGET_NAME = olepro32 + +TARGET_OBJECTS = @C_SRCS@ + +TARGET_CFLAGS = @EXTRADEFS@ + +TARGET_SDKLIBS = @IMPORTS@ libwine.a wine_uuid.a ntdll.a oleaut32.a + +TARGET_BASE = 0x77a50000 + +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/olepro32/README b/reactos/lib/olepro32/README new file mode 100644 index 00000000000..1c505f2781e --- /dev/null +++ b/reactos/lib/olepro32/README @@ -0,0 +1,9 @@ +29Nov99 +Sean Langley + +This library (OLEPRO32.DLL) is basically a sub-set of what is in OLEAUT32.DLL. +The main difference under Win32 is that OLEPRO32.DLL can be used +as a type library. There are two functions in this DLL which are already +implemented in Wine. They are OleCreateFontIndirect, and OleTranslateColor. +The spec file for both of these functions points to the functions in the +OLEAUT32.DLL. diff --git a/reactos/lib/olepro32/olepro32.rc b/reactos/lib/olepro32/olepro32.rc new file mode 100644 index 00000000000..77792217952 --- /dev/null +++ b/reactos/lib/olepro32/olepro32.rc @@ -0,0 +1,28 @@ +/* Language neutral resources. + * + * Copyright 2003 Stefan Leichter + * + * 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 WINE_FILEDESCRIPTION_STR "Wine Cabinet File API" +#define WINE_FILENAME_STR "cabinet.dll" +#define WINE_FILEVERSION 5,0,2147,1 +#define WINE_FILEVERSION_STR "5.0.2147.1" + +#define WINE_PRODUCTVERSION 5,0,2147,1 +#define WINE_PRODUCTVERSION_STR "5.0" + +#include "wine/wine_common_ver.rc" diff --git a/reactos/lib/olepro32/olepro32.spec b/reactos/lib/olepro32/olepro32.spec new file mode 100644 index 00000000000..240c283c936 --- /dev/null +++ b/reactos/lib/olepro32/olepro32.spec @@ -0,0 +1,11 @@ +248 stdcall OleIconToCursor(long long) oleaut32.OleIconToCursor +249 stdcall OleCreatePropertyFrameIndirect(ptr) oleaut32.OleCreatePropertyFrameIndirect +250 stdcall OleCreatePropertyFrame(ptr long long ptr long ptr long ptr ptr long ptr) oleaut32.OleCreatePropertyFrame +251 stdcall OleLoadPicture(ptr long long ptr ptr) oleaut32.OleLoadPicture +252 stdcall OleCreatePictureIndirect(ptr ptr long ptr) oleaut32.OleCreatePictureIndirect +253 stdcall OleCreateFontIndirect(ptr ptr ptr) oleaut32.OleCreateFontIndirect +254 stdcall OleTranslateColor(long long long) oleaut32.OleTranslateColor +@ stdcall -private DllCanUnloadNow() OLEPRO32_DllCanUnloadNow +@ stdcall -private DllGetClassObject( ptr ptr ptr ) OLEPRO32_DllGetClassObject +@ stdcall -private DllRegisterServer() OLEPRO32_DllRegisterServer +@ stdcall -private DllUnregisterServer() OLEPRO32_DllUnregisterServer diff --git a/reactos/lib/olepro32/olepro32stubs.c b/reactos/lib/olepro32/olepro32stubs.c new file mode 100644 index 00000000000..762839bc5d8 --- /dev/null +++ b/reactos/lib/olepro32/olepro32stubs.c @@ -0,0 +1,68 @@ +/* + * OlePro32 Stubs + * + * Copyright 1999 Corel Corporation + * + * Sean Langley + * + * 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 <stdarg.h> + +#include "wine/debug.h" +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "ole2.h" + +WINE_DEFAULT_DEBUG_CHANNEL(ole); + +/*********************************************************************** + * DllUnregisterServer (OLEPRO32.258) + */ +HRESULT WINAPI OLEPRO32_DllUnregisterServer() +{ + FIXME("not implemented (olepro32.dll) \n"); + return S_OK; +} + +/*********************************************************************** + * DllRegisterServer (OLEPRO32.257) + */ +HRESULT WINAPI OLEPRO32_DllRegisterServer() +{ + FIXME("not implemented (olepro32.dll) \n"); + return S_OK; +} + +/*********************************************************************** + * DllCanUnloadNow (OLEPRO32.255) + */ +HRESULT WINAPI OLEPRO32_DllCanUnloadNow( ) +{ + FIXME("not implemented (olepro32.dll) \n"); + return S_OK; +} + +/*********************************************************************** + * DllGetClassObject (OLEPRO32.256) + */ +HRESULT WINAPI OLEPRO32_DllGetClassObject( REFCLSID rclsid, REFIID riid, LPVOID* ppv ) +{ + FIXME("not implemented (olepro32.dll) \n"); + return S_OK; +} From b35af5f50f1f72756b11615a3d60da2f65464b39 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Thu, 26 Feb 2004 12:23:29 +0000 Subject: [PATCH 0201/1463] Removed all forwarded exports to MSVCRT because a process must not load MSVCRT and CRTDLL at the same time. svn path=/trunk/; revision=8396 --- reactos/lib/crtdll/crtdll.def | 64 ++++++++++++++-------------- reactos/lib/crtdll/ctype/isctype.c | 15 +------ reactos/lib/crtdll/makefile | 55 +++++++++++++----------- reactos/lib/crtdll/misc/GetArgs.c | 41 +++++++++--------- reactos/lib/crtdll/misc/amsg.c | 6 +-- reactos/lib/crtdll/stdlib/wcstomb.c | 13 +----- reactos/lib/crtdll/string/strerror.c | 6 --- 7 files changed, 88 insertions(+), 112 deletions(-) diff --git a/reactos/lib/crtdll/crtdll.def b/reactos/lib/crtdll/crtdll.def index 001cdfe4023..40cc3cfb512 100644 --- a/reactos/lib/crtdll/crtdll.def +++ b/reactos/lib/crtdll/crtdll.def @@ -19,9 +19,9 @@ ; DISCLAMED. This includes but is not limited to warrenties of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ; -; $Revision: 1.18 $ -; $Author: weiden $ -; $Date: 2003/08/26 12:28:53 $ +; $Revision: 1.19 $ +; $Author: ekohl $ +; $Date: 2004/02/26 12:23:29 $ ; ; These three functions appear to be name mangled in some way, so GCC is ; probably not going to be able to use them in any case. @@ -69,7 +69,7 @@ __argv_dll __dllonexit __doserrno __fpecode -__isascii=NTDLL.__isascii +__isascii __iscsym=NTDLL.__iscsym __iscsymf=NTDLL.__iscsymf __mb_cur_max_dll @@ -179,7 +179,7 @@ _hypot _initterm _iob _isatty -_isctype=MSVCRT._isctype +_isctype _ismbbalnum _ismbbalpha _ismbbgraph @@ -326,19 +326,19 @@ _statusfp _strcmpi=NTDLL._strcmpi _strdate _strdec -_strdup=MSVCRT._strdup -_strerror=MSVCRT._strerror +_strdup +_strerror _stricmp=NTDLL._stricmp -_stricoll=MSVCRT._stricoll +_stricoll _strinc _strlwr=NTDLL._strlwr _strncnt _strnextc _strnicmp=NTDLL._strnicmp _strninc -_strnset=MSVCRT._strnset -_strrev=MSVCRT._strrev -_strset=MSVCRT._strset +_strnset +_strrev +_strset _strspnp _strtime _strupr=NTDLL._strupr @@ -434,31 +434,31 @@ getchar getenv gets gmtime -is_wctype=MSVCRT.is_wctype -isalnum=NTDLL.isalnum +is_wctype +isalnum isalpha=NTDLL.isalpha -iscntrl=NTDLL.iscntrl +iscntrl isdigit=NTDLL.isdigit -isgraph=NTDLL.isgraph +isgraph isleadbyte islower=NTDLL.islower -isprint=NTDLL.isprint -ispunct=NTDLL.ispunct +isprint +ispunct isspace=NTDLL.isspace -isupper=NTDLL.isupper -iswalnum=MSVCRT.iswalnum +isupper +iswalnum iswalpha=NTDLL.iswalpha -iswascii=MSVCRT.iswascii -iswcntrl=MSVCRT.iswcntrl -iswctype=MSVCRT.iswctype -iswdigit=MSVCRT.iswdigit -iswgraph=MSVCRT.iswgraph -iswlower=MSVCRT.iswlower -iswprint=MSVCRT.iswprint -iswpunct=MSVCRT.iswpunct +iswascii +iswcntrl +iswctype +iswdigit +iswgraph +iswlower +iswprint +iswpunct iswspace=NTDLL.iswspace -iswupper=MSVCRT.iswupper -iswxdigit=MSVCRT.iswxdigit +iswupper +iswxdigit isxdigit=NTDLL.isxdigit labs ldexp @@ -506,10 +506,10 @@ sscanf strcat strchr strcmp -strcoll=MSVCRT.strcoll +strcoll strcpy strcspn -strerror=MSVCRT.strerror +strerror strftime strlen strncat @@ -523,7 +523,7 @@ strtod strtok strtol strtoul -strxfrm=MSVCRT.strxfrm +strxfrm swprintf swscanf system diff --git a/reactos/lib/crtdll/ctype/isctype.c b/reactos/lib/crtdll/ctype/isctype.c index 948889ef842..2629ccfb9b0 100644 --- a/reactos/lib/crtdll/ctype/isctype.c +++ b/reactos/lib/crtdll/ctype/isctype.c @@ -10,39 +10,26 @@ unsigned short *_pwctype_dll = _ctype + 1; /* * @implemented - * - * this function is now forwarded to MSVCRT._isctype to reduce code duplication */ -#if 0 int _isctype(unsigned int c, int ctypeFlags) { return (_pctype_dll[(unsigned char)(c & 0xFF)] & ctypeFlags); } -#endif /* * @implemented - * - * this function is now forwarded to MSVCRT.iswctype to reduce code duplication */ -#if 0 int iswctype(wint_t wc, wctype_t wctypeFlags) { return (_pwctype_dll[(unsigned char)(wc & 0xFF)] & wctypeFlags); } -#endif -// obsolete /* * @implemented - * - * this function is now forwarded to MSVCRT.is_wctype to reduce code duplication */ -#if 0 -int is_wctype(wint_t wc, wctype_t wctypeFlags) +int is_wctype(wint_t wc, wctype_t wctypeFlags) { return (_pwctype_dll[(unsigned char)(wc & 0xFF)] & wctypeFlags); } -#endif /* EOF */ diff --git a/reactos/lib/crtdll/makefile b/reactos/lib/crtdll/makefile index c1dd314e959..5c596be696d 100644 --- a/reactos/lib/crtdll/makefile +++ b/reactos/lib/crtdll/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.62 2003/11/14 17:13:30 weiden Exp $ +# $Id: makefile,v 1.63 2004/02/26 12:23:29 ekohl Exp $ PATH_TO_TOP = ../.. @@ -12,7 +12,7 @@ TARGET_NAME = crtdll TARGET_BASE = 0x77630000 -TARGET_LFLAGS = -nostartfiles +TARGET_LFLAGS = -nostartfiles -nostdlib TARGET_CFLAGS = -D_MSVCRT_LIB_ -Werror -Wall @@ -21,6 +21,8 @@ TARGET_CFLAGS += -D_DISABLE_TIDENTS TARGET_SDKLIBS = string.a kernel32.a ntdll.a +TARGET_GCCLIBS = gcc + TARGET_OBJECTS = $(TARGET_NAME).o TARGET_CLEAN = \ @@ -68,21 +70,21 @@ CONIO_OBJECTS = \ CTYPE_OBJECTS = \ $(PATH_TO_MSVCRT)/ctype/ctype.o \ - ctype/isctype.o + $(PATH_TO_MSVCRT)/ctype/isalnum.o \ + $(PATH_TO_MSVCRT)/ctype/isascii.o \ + $(PATH_TO_MSVCRT)/ctype/iscntrl.o \ + ctype/isctype.o \ + $(PATH_TO_MSVCRT)/ctype/isgraph.o \ + $(PATH_TO_MSVCRT)/ctype/isprint.o \ + $(PATH_TO_MSVCRT)/ctype/ispunct.o \ + $(PATH_TO_MSVCRT)/ctype/isupper.o # REMOVED CTYPE ENTRIES: -# $(PATH_TO_MSVCRT)/ctype/isalnum.o \ # $(PATH_TO_MSVCRT)/ctype/isalpha.o \ -# $(PATH_TO_MSVCRT)/ctype/isascii.o \ -# $(PATH_TO_MSVCRT)/ctype/iscntrl.o \ # $(PATH_TO_MSVCRT)/ctype/iscsym.o \ # $(PATH_TO_MSVCRT)/ctype/isdigit.o \ -# $(PATH_TO_MSVCRT)/ctype/isgraph.o \ # $(PATH_TO_MSVCRT)/ctype/islower.o \ -# $(PATH_TO_MSVCRT)/ctype/isprint.o \ -# $(PATH_TO_MSVCRT)/ctype/ispunct.o \ # $(PATH_TO_MSVCRT)/ctype/isspace.o \ -# $(PATH_TO_MSVCRT)/ctype/isupper.o \ # $(PATH_TO_MSVCRT)/ctype/isxdigit.o \ # $(PATH_TO_MSVCRT)/ctype/toascii.o \ # $(PATH_TO_MSVCRT)/ctype/tolower.o \ @@ -397,26 +399,27 @@ STDLIB_OBJECTS = \ $(PATH_TO_MSVCRT)/stdlib/strtol.o \ $(PATH_TO_MSVCRT)/stdlib/strtoul.o \ $(PATH_TO_MSVCRT)/stdlib/swab.o \ - $(PATH_TO_MSVCRT)/stdlib/wcstomb.o \ - + $(PATH_TO_MSVCRT)/stdlib/wcstod.o \ + stdlib/wcstomb.o + STRING_OBJECTS = \ string/lasttok.o \ - $(PATH_TO_MSVCRT)/string/strtok.o \ - string/str_old.o \ + $(PATH_TO_MSVCRT)/string/strcoll.o \ + $(PATH_TO_MSVCRT)/string/strdup.o \ string/strerror.o \ + $(PATH_TO_MSVCRT)/string/strrev.o \ + $(PATH_TO_MSVCRT)/string/strset.o \ + $(PATH_TO_MSVCRT)/string/strtok.o \ + $(PATH_TO_MSVCRT)/string/strxfrm.o +# string/str_old.o \ # $(PATH_TO_MSVCRT)/string/memicmp.o \ -# $(PATH_TO_MSVCRT)/string/strcoll.o \ -# $(PATH_TO_MSVCRT)/string/strdup.o \ # $(PATH_TO_MSVCRT)/string/stricmp.o \ # $(PATH_TO_MSVCRT)/string/strlwr.o \ # $(PATH_TO_MSVCRT)/string/strnicmp.o \ # $(PATH_TO_MSVCRT)/string/strpbrk.o \ -# $(PATH_TO_MSVCRT)/string/strrev.o \ -# $(PATH_TO_MSVCRT)/string/strset.o \ # $(PATH_TO_MSVCRT)/string/strstr.o \ # $(PATH_TO_MSVCRT)/string/strupr.o \ -# $(PATH_TO_MSVCRT)/string/strxfrm.o SYS_STAT_OBJECTS = \ sys_stat/fstat.o \ @@ -441,28 +444,28 @@ TIME_OBJECTS = \ $(PATH_TO_MSVCRT)/time/strdate.o \ $(PATH_TO_MSVCRT)/time/strftime.o \ $(PATH_TO_MSVCRT)/time/strtime.o \ - time/tz_vars.o \ + time/tz_vars.o WSTRING_OBJECTS = \ + wchar/wlasttok.o \ + wchar/wcscoll.o \ + $(PATH_TO_MSVCRT)/wstring/wcsdup.o \ + $(PATH_TO_MSVCRT)/wstring/wcsrev.o \ + $(PATH_TO_MSVCRT)/wstring/wcsset.o \ $(PATH_TO_MSVCRT)/wstring/wcstok.o \ - wchar/wlasttok.o + $(PATH_TO_MSVCRT)/wstring/wcsxfrm.o -# wchar/wcscoll.o \ # wchar/wcstod.o \ # wchar/wcstok.o \ # wchar/wcstol.o \ # wchar/wtoi.o \ # $(PATH_TO_MSVCRT)/wstring/wcscspn.o \ -# $(PATH_TO_MSVCRT)/wstring/wcsdup.o \ # $(PATH_TO_MSVCRT)/wstring/wcsicmp.o \ # $(PATH_TO_MSVCRT)/wstring/wcslwr.o \ # $(PATH_TO_MSVCRT)/wstring/wcspbrk.o \ -# $(PATH_TO_MSVCRT)/wstring/wcsrev.o \ -# $(PATH_TO_MSVCRT)/wstring/wcsset.o \ # $(PATH_TO_MSVCRT)/wstring/wcsspn.o \ # $(PATH_TO_MSVCRT)/wstring/wcsstr.o \ # $(PATH_TO_MSVCRT)/wstring/wcsupr.o \ -# $(PATH_TO_MSVCRT)/wstring/wcsxfrm.o \ # wchar/wcstombs.o \ # $(PATH_TO_MSVCRT)/wstring/wcsnicmp.o diff --git a/reactos/lib/crtdll/misc/GetArgs.c b/reactos/lib/crtdll/misc/GetArgs.c index 10fcaf92fee..d48f4ad58e0 100644 --- a/reactos/lib/crtdll/misc/GetArgs.c +++ b/reactos/lib/crtdll/misc/GetArgs.c @@ -4,11 +4,11 @@ char *_pgmptr_dll; -char *_acmdln_dll; -unsigned int _commode_dll; -unsigned int _winmajor_dll; +char *_acmdln_dll; +unsigned int _commode_dll; +unsigned int _winmajor_dll; unsigned int _winminor_dll; -unsigned int _winver_dll; +unsigned int _winver_dll; unsigned int _osmajor_dll; @@ -28,21 +28,22 @@ char *xargv[1024]; char **__argv = xargv; int __argc = 0; -int *__argc_dll = &__argc; -char ***__argv_dll = &__argv; +int *__argc_dll = &__argc; +char ***__argv_dll = &__argv; #undef _environ char **_environ; #undef _environ_dll -char *** _environ_dll = &_environ; +char *** _environ_dll = &_environ; static int envAlloced = 0; - - -int BlockEnvToEnviron() + + +int BlockEnvToEnviron(void) { -char * ptr; -int i; + char * ptr; + int i; + if (!envAlloced) { envAlloced = 50; @@ -90,13 +91,13 @@ int __GetMainArgs(int *argc,char ***argv,char ***env,int flag) afterlastspace=0; __argc=0; - while (_acmdln_dll[i]) + while (_acmdln_dll[i]) { - if (_acmdln_dll[i]==' ') + if (_acmdln_dll[i]==' ') { __argc++; _acmdln_dll[i]='\0'; - __argv[__argc-1] = strdup(_acmdln_dll + afterlastspace); + __argv[__argc-1] = _strdup(_acmdln_dll + afterlastspace); _acmdln_dll[i]=' '; i++; while (_acmdln_dll[i]==' ') @@ -113,19 +114,19 @@ int __GetMainArgs(int *argc,char ***argv,char ***env,int flag) { __argc++; _acmdln_dll[i]='\0'; - __argv[__argc-1] = strdup(_acmdln_dll+afterlastspace); + __argv[__argc-1] = _strdup(_acmdln_dll+afterlastspace); } HeapValidate(GetProcessHeap(),0,NULL); if( BlockEnvToEnviron() ) return FALSE; - _environ_dll = &_environ; - + _environ_dll = &_environ; + *argc = __argc; *argv = __argv; *env = _environ; - - _pgmptr_dll = strdup((char *)argv[0]); + + _pgmptr_dll = _strdup((char *)argv[0]); return 0; } diff --git a/reactos/lib/crtdll/misc/amsg.c b/reactos/lib/crtdll/misc/amsg.c index b024c6e5c73..1b4a7b7588d 100644 --- a/reactos/lib/crtdll/misc/amsg.c +++ b/reactos/lib/crtdll/misc/amsg.c @@ -16,7 +16,7 @@ */ int _aexit_rtn_dll(int exitcode) { - _exit(exitcode); + _exit(exitcode); } /* @@ -24,7 +24,7 @@ int _aexit_rtn_dll(int exitcode) */ void _amsg_exit(int errnum) { - fprintf(stderr,strerror(errnum)); - _aexit_rtn_dll(-1); + fprintf(stderr,strerror(errnum)); + _aexit_rtn_dll(-1); } diff --git a/reactos/lib/crtdll/stdlib/wcstomb.c b/reactos/lib/crtdll/stdlib/wcstomb.c index 92462e0facf..41eab0a08d4 100644 --- a/reactos/lib/crtdll/stdlib/wcstomb.c +++ b/reactos/lib/crtdll/stdlib/wcstomb.c @@ -21,7 +21,8 @@ #include <msvcrt/errno.h> #include <msvcrt/wchar.h> -#include <msvcrt/internal/file.h> + +#include "libc/file.h" #ifndef EILSEQ #define EILSEQ EINVAL @@ -79,22 +80,12 @@ __wcrtomb (char *s, wchar_t wc) char fake[1]; size_t written = 0; - - if (s == NULL) { s = fake; wc = L'\0'; } - /* Store the UTF8 representation of WC. */ - if (wc < 0 || wc > 0x7fffffff) - { - /* This is no correct ISO 10646 character. */ - __set_errno (EILSEQ); - return (size_t) -1; - } - if (wc < 0x80) { /* It's a one byte sequence. */ diff --git a/reactos/lib/crtdll/string/strerror.c b/reactos/lib/crtdll/string/strerror.c index b4cc6a7e904..30830f7295b 100644 --- a/reactos/lib/crtdll/string/strerror.c +++ b/reactos/lib/crtdll/string/strerror.c @@ -63,9 +63,7 @@ int* _sys_nerr_dll = &__sys_nerr; /* * @implemented * - * this function is now forwarded to MSVCRT.strerror to reduce code duplication */ -#if 0 char *strerror(int errnum) { static char ebuf[40]; /* 64-bit number + slop */ @@ -96,14 +94,11 @@ char *strerror(int errnum) return ebuf; } -#endif /* * @implemented * - * this function is now forwarded to MSVCRT._strerror to reduce code duplication */ -#if 0 char *_strerror(const char *s) { if ( s == NULL ) @@ -111,4 +106,3 @@ char *_strerror(const char *s) return strerror(atoi(s)); } -#endif From 3c84f18b661bfad528a973bcc2c04b1efdd3d9d4 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Thu, 26 Feb 2004 12:29:15 +0000 Subject: [PATCH 0202/1463] Remove obsolete files. svn path=/trunk/; revision=8397 --- reactos/apps/tests/gditest/.cvsignore | 6 - reactos/apps/tests/gditest/gditest.c | 347 ------------------------ reactos/apps/tests/gditest/makefile | 23 -- reactos/subsys/system/gstart/.cvsignore | 6 - reactos/subsys/system/gstart/Makefile | 23 -- reactos/subsys/system/gstart/gstart.c | 89 ------ reactos/subsys/system/gstart/gstart.rc | 38 --- 7 files changed, 532 deletions(-) delete mode 100644 reactos/apps/tests/gditest/.cvsignore delete mode 100644 reactos/apps/tests/gditest/gditest.c delete mode 100644 reactos/apps/tests/gditest/makefile delete mode 100644 reactos/subsys/system/gstart/.cvsignore delete mode 100644 reactos/subsys/system/gstart/Makefile delete mode 100644 reactos/subsys/system/gstart/gstart.c delete mode 100644 reactos/subsys/system/gstart/gstart.rc diff --git a/reactos/apps/tests/gditest/.cvsignore b/reactos/apps/tests/gditest/.cvsignore deleted file mode 100644 index d63774a7353..00000000000 --- a/reactos/apps/tests/gditest/.cvsignore +++ /dev/null @@ -1,6 +0,0 @@ -*.o -*.d -*.exe -*.coff -*.sym -*.map diff --git a/reactos/apps/tests/gditest/gditest.c b/reactos/apps/tests/gditest/gditest.c deleted file mode 100644 index 4b6888f8826..00000000000 --- a/reactos/apps/tests/gditest/gditest.c +++ /dev/null @@ -1,347 +0,0 @@ -/* - * gditest - dec 26, 2001 -- gditest bug fix by Richard Campbell - */ - -#include <windows.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> - -extern BOOL STDCALL GdiDllInitialize(HANDLE hInstance, DWORD Event, LPVOID Reserved); - -void __stdcall Background (HDC Desktop) -{ - HPEN Pen; - int x, y; - - Pen = CreatePen(PS_SOLID, 1, RGB(64, 64, 128)); - - SelectObject (Desktop, Pen); - - MoveToEx (Desktop, 0, 0, NULL); - LineTo (Desktop, 640, 480); - for (y = 479, x = 0; x < 640; x+=42) - { - MoveToEx (Desktop, 0, 0, NULL); - LineTo (Desktop, x, y); - } - for (y = 0, x = 639; y < 480; y+=42) - { - MoveToEx (Desktop, 0, 0, NULL); - LineTo (Desktop, x, y); - } -} - -void gditest( void ){ - HDC Desktop, MyDC, DC24; - HPEN RedPen, GreenPen, BluePen, WhitePen; - HBITMAP MyBitmap, DIB24; - HFONT hf, tf; - BITMAPINFOHEADER BitInf; - BITMAPINFO BitPalInf; - HRGN hRgn1, hRgn2, hRgn3; - HBRUSH BlueBrush, DefBrush; - - // Set up a DC called Desktop that accesses DISPLAY - Desktop = CreateDCA("DISPLAY", NULL, NULL, NULL); - if (Desktop == NULL){ - printf("Can't create desktop\n"); - return; - } - - // Background - Background (Desktop); - - -//ei - BlueBrush = CreateSolidBrush( RGB(0, 0, 0xff) ); - DefBrush = SelectObject( Desktop, BlueBrush ); - - hRgn1 = CreateRectRgn( 1, 2, 100, 101 ); - hRgn2 = CreateRectRgn( 10, 20, 150, 151 ); - hRgn3 = CreateRectRgn( 1, 1, 1, 1); - CombineRgn( hRgn3, hRgn1, hRgn2, RGN_XOR ); - - PaintRgn( Desktop, hRgn3 ); - SelectObject( Desktop, DefBrush ); - DeleteObject( BlueBrush ); - - // Create a blue pen and select it into the DC - BluePen = CreatePen(PS_SOLID, 8, RGB(0, 0, 0xff)); - SelectObject(Desktop, BluePen); - - // Draw a shape on the DC - MoveToEx(Desktop, 50, 50, NULL); - LineTo(Desktop, 200, 60); - LineTo(Desktop, 200, 300); - LineTo(Desktop, 50, 50); - MoveToEx(Desktop, 50, 50, NULL); - LineTo(Desktop, 200, 50); - - WhitePen = CreatePen(PS_SOLID, 3, RGB(0xff, 0xff, 0xff)); - SelectObject(Desktop, WhitePen); - - MoveToEx(Desktop, 20, 70, NULL); - LineTo(Desktop, 500, 70); - MoveToEx(Desktop, 70, 20, NULL); - LineTo(Desktop, 70, 150); - - // Test font support - GreenPen = CreatePen(PS_SOLID, 3, RGB(0, 0xff, 0)); - RedPen = CreatePen(PS_SOLID, 3, RGB(0xff, 0, 0)); - - hf = CreateFontA(24, 0, 0, TA_BASELINE, FW_NORMAL, FALSE, FALSE, FALSE, - ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, - DEFAULT_QUALITY, FIXED_PITCH|FF_DONTCARE, "Helmet"); - SelectObject(Desktop, hf); - SetTextColor(Desktop, RGB(0xff, 0, 0)); - TextOutA(Desktop, 70, 70, "React", 5); - SetTextColor(Desktop, RGB(0, 0xff, 0)); - TextOutA(Desktop, 140, 70, "OS", 2); - - tf = CreateFontA(14, 0, 0, TA_BASELINE, FW_NORMAL, FALSE, FALSE, FALSE, - ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, - DEFAULT_QUALITY, FIXED_PITCH|FF_DONTCARE, "Timmons"); - SelectObject(Desktop, tf); - SetTextColor(Desktop, RGB(0xff, 0xff, 0xff)); - TextOutA(Desktop, 70, 90, "This is a test of ReactOS text, using the FreeType 2 library!", 61); - - // TEST 1: Copy from the VGA into a device compatible DC, draw on it, then blt it to the VGA again - MyDC = CreateCompatibleDC(Desktop); - MyBitmap = CreateCompatibleBitmap(Desktop, 151, 251); - SelectObject(MyDC, MyBitmap); - BitBlt(MyDC, 0, 0, 151, 251, Desktop, 50, 50, SRCCOPY); // can we say 151, 251 since bottom corner is not inclusive? - - SelectObject(MyDC, GreenPen); - Rectangle(MyDC, 10, 10, 50, 50); - - // TEST 2: Copy from the device compatible DC into a 24BPP bitmap, draw on it, then blt to the VGA again - BitInf.biSize = sizeof(BITMAPINFOHEADER); - BitInf.biWidth = 152; - BitInf.biHeight = -252; // it's top down (since BI_RGB is used, the sign is operative of direction) - BitInf.biPlanes = 1; - BitInf.biBitCount = 24; - BitInf.biCompression = BI_RGB; - BitInf.biSizeImage = 0; - BitInf.biXPelsPerMeter = 0; - BitInf.biYPelsPerMeter = 0; - BitInf.biClrUsed = 0; - BitInf.biClrImportant = 0; - BitPalInf.bmiHeader = BitInf; - DIB24 = (HBITMAP) CreateDIBSection(NULL, &BitPalInf, DIB_RGB_COLORS, NULL, NULL, 0); - DC24 = CreateCompatibleDC(NULL); - SelectObject(DC24, DIB24); - - BitBlt(DC24, 0, 0, 101, 201, MyDC, 0, 0, SRCCOPY); - SelectObject(DC24, RedPen); - Rectangle(DC24, 80, 90, 100, 110); - MoveToEx(DC24, 80, 90, NULL); - LineTo(DC24, 100, 110); - BitBlt(Desktop, 200, 200, 110, 120, DC24, 0, 0, SRCCOPY); - - Sleep( 10000 ); // fixme delay only 10000 (for 10 seconds) - // Free up everything - DeleteDC(Desktop); - DeleteDC(MyDC); -} - -void DumpRgnData( HRGN hRgn ) -{ - int size, ret, i; - LPRGNDATA rgnData; - - size = GetRegionData( hRgn, 0, NULL ); - if( size == 0 ){ - printf("GetRegionData returned 0\n"); - return; - } - rgnData = (LPRGNDATA) malloc( size ); - ret = GetRegionData( hRgn, size, rgnData ); - if( ret == 0 ){ - printf("GetRegionData( hRgn, size, rgnData ) returned 0\n"); - return; - } - printf("Bounds: left=%lu top=%lu right=%lu bottom=%lu, count: %lu, type: %lu\n\n", - rgnData->rdh.rcBound.left, rgnData->rdh.rcBound.top, rgnData->rdh.rcBound.right, rgnData->rdh.rcBound.bottom, - rgnData->rdh.nCount, rgnData->rdh.iType); - printf("Rects:\t i \t left \t top \t right \t bottom\n"); - for ( i = 0; i < rgnData->rdh.nCount; i++ ) { - PRECT pr = (PRECT) rgnData->Buffer + i; - printf("\t %d \t %lu \t %lu \t %lu \t %lu\n", i, pr->left, pr->top, pr->right, pr->bottom ); - } - printf("\n"); -} - -void rgntest( void ) -{ - HRGN hRgn1, hRgn2, hRgn3; - RECT Rect; - int i; - - hRgn1 = CreateRectRgn( 1, 2, 100, 101 ); - if( hRgn1 == NULL ) { - printf("Failed at hRgn1 = CreateRectRgn( 1, 2, 100, 101 )\n"); - return; - } - i = GetRgnBox( hRgn1, &Rect ); - if( i==0 ){ - printf("Failed GetRgnBox( hRgn1, &Rect )\n"); - return; - } - printf("GetRgnBox( hRgn1, &Rect ): i=%d, left=%lu top=%lu right=%lu bottom=%lu\n\n", - i, Rect.left, Rect.top, Rect.right, Rect.bottom ); - - DumpRgnData( hRgn1 ); - - hRgn2 = CreateRectRgn( 51, 53, 150, 152 ); - if( hRgn2 == NULL ) { - printf("Failed at hRgn2 = CreateRectRgn( 51, 53, 150, 152 )\n"); - return; - } - i = GetRgnBox( hRgn2, &Rect ); - if( i==0 ){ - printf("Failed GetRgnBox( hRgn2, &Rect )\n"); - return; - } - printf("GetRgnBox( hRgn2, &Rect ): i=%d, left=%lu top=%lu right=%lu bottom=%lu\n\n", - i, Rect.left, Rect.top, Rect.right, Rect.bottom ); - - DumpRgnData( hRgn2 ); - - if( EqualRgn( hRgn1, hRgn2 ) == TRUE ){ - printf("\t hRgn1, hRgn2 are equal\n"); - } - else{ - printf("\t hRgn1, hRgn2 are NOT equal\n\n"); - } - - i = OffsetRgn(hRgn1,50,51); - if( i==ERROR ){ - printf("Failed OffsetRgn(hRgn1,50,51)\n"); - return; - } - - i = GetRgnBox( hRgn1, &Rect ); - if( i==0 ){ - printf("Failed GetRgnBox( hRgn1, &Rect )\n"); - return; - } - printf("After offset\nGetRgnBox( hRgn1, &Rect ): i=%d, left=%lu top=%lu right=%lu bottom=%lu\n\n", - i, Rect.left, Rect.top, Rect.right, Rect.bottom ); - - if( EqualRgn( hRgn1, hRgn2 ) == TRUE ){ - printf("\t hRgn1, hRgn2 are equal after offset\n"); - } - else{ - printf("\t hRgn1, hRgn2 are NOT equal after offset!\n\n"); - } - - i = SetRectRgn(hRgn1, 10, 11, 110, 111 ); - if( i==0 ){ - printf("Failed SetRectRgn(hRgn1... )\n"); - return; - } - i = GetRgnBox( hRgn1, &Rect ); - if( i==0 ){ - printf("Failed GetRgnBox( hRgn1, &Rect )\n"); - return; - } - printf("after SetRectRgn(hRgn1, 10, 11, 110, 111 ):\n i=%d, left=%lu top=%lu right=%lu bottom=%lu\n\n", - i, Rect.left, Rect.top, Rect.right, Rect.bottom ); - - hRgn3 = CreateRectRgn( 1, 1, 1, 1); - i = CombineRgn( hRgn3, hRgn1, hRgn2, RGN_AND ); - if( i==ERROR ){ - printf("Fail: CombineRgn( hRgn3, hRgn1, hRgn2, RGN_AND ). LastError: %lu\n", GetLastError()); - return; - } - - if( GetRgnBox( hRgn3, &Rect )==0 ){ - printf("Failed GetRgnBox( hRgn1, &Rect )\n"); - return; - } - printf("After CombineRgn( hRgn3, hRgn1, hRgn2, RGN_AND ): \nGetRgnBox( hRgn3, &Rect ): CR_i=%d, left=%lu top=%lu right=%lu bottom=%lu\n\n", - i, Rect.left, Rect.top, Rect.right, Rect.bottom ); - DumpRgnData( hRgn3 ); - - i = CombineRgn( hRgn3, hRgn1, hRgn2, RGN_OR ); - if( i==ERROR ){ - printf("Fail: CombineRgn( hRgn3, hRgn1, hRgn2, RGN_OR ). LastError: %lu\n", GetLastError()); - return; - } - - if( GetRgnBox( hRgn3, &Rect )==0 ){ - printf("Failed GetRgnBox( hRgn1, &Rect )\n"); - return; - } - printf("After CombineRgn( hRgn3, hRgn1, hRgn2, RGN_OR ): \nGetRgnBox( hRgn3, &Rect ): CR_i=%d, left=%lu top=%lu right=%lu bottom=%lu\n\n", - i, Rect.left, Rect.top, Rect.right, Rect.bottom ); - DumpRgnData( hRgn3 ); - - i = CombineRgn( hRgn3, hRgn1, hRgn2, RGN_DIFF ); - if( i==ERROR ){ - printf("Fail: CombineRgn( hRgn3, hRgn1, hRgn2, RGN_DIFF ). LastError: %lu\n", GetLastError()); - return; - } - - if( GetRgnBox( hRgn3, &Rect )==0 ){ - printf("Failed GetRgnBox( hRgn1, &Rect )\n"); - return; - } - printf("After CombineRgn( hRgn3, hRgn1, hRgn2, RGN_DIFF ): \nGetRgnBox( hRgn3, &Rect ): CR_i=%d, left=%lu top=%lu right=%lu bottom=%lu\n\n", - i, Rect.left, Rect.top, Rect.right, Rect.bottom ); - DumpRgnData( hRgn3 ); - - i = CombineRgn( hRgn3, hRgn1, hRgn2, RGN_XOR ); - if( i==ERROR ){ - printf("Fail: CombineRgn( hRgn3, hRgn1, hRgn2, RGN_XOR ). LastError: %lu\n", GetLastError()); - return; - } - - if( GetRgnBox( hRgn3, &Rect )==0 ){ - printf("Failed GetRgnBox( hRgn3, &Rect )\n"); - return; - } - printf("After CombineRgn( hRgn3, hRgn1, hRgn2, RGN_XOR ): \nGetRgnBox( hRgn3, &Rect ): CR_i=%d, left=%lu top=%lu right=%lu bottom=%lu\n\n", - i, Rect.left, Rect.top, Rect.right, Rect.bottom ); - DumpRgnData( hRgn3 ); - - i = CombineRgn( hRgn1, hRgn3, hRgn2, RGN_COPY ); - if( i==ERROR ){ - printf("Fail: CombineRgn( hRgn1, hRgn3, hRgn2, RGN_COPY ). LastError: %lu\n", GetLastError()); - return; - } - - if( GetRgnBox( hRgn1, &Rect )==0 ){ - printf("Failed GetRgnBox( hRgn1, &Rect )\n"); - return; - } - printf("After CombineRgn( hRgn1, hRgn3, hRgn2, RGN_COPY ): \nGetRgnBox( hRgn1, &Rect ): CR_i=%u, left=%lu top=%lu right=%lu bottom=%lu\n\n", - i, Rect.left, Rect.top, Rect.right, Rect.bottom ); - DumpRgnData( hRgn1 ); - - - DeleteObject( hRgn1 ); - DeleteObject( hRgn2 ); - DeleteObject( hRgn3 ); - printf("region test finished\n"); -} - -int main (int argc, char* argv[]) -{ - printf("Entering GDITest..\n"); - printf("use gditest for older tests\n"); - printf("use gditest 1 for region test\n"); - - GdiDllInitialize (NULL, DLL_PROCESS_ATTACH, NULL); - if( argc < 2 ) - gditest(); - else { - if( !strncmp( argv[1], "1", 1 ) ) { - rgntest(); - } - } - - return 0; -} diff --git a/reactos/apps/tests/gditest/makefile b/reactos/apps/tests/gditest/makefile deleted file mode 100644 index 3502a25c01b..00000000000 --- a/reactos/apps/tests/gditest/makefile +++ /dev/null @@ -1,23 +0,0 @@ -# $Id: makefile,v 1.9 2003/11/14 17:13:17 weiden Exp $ - -PATH_TO_TOP = ../../.. - -TARGET_NORC = yes - -TARGET_TYPE = program - -TARGET_APPTYPE = console - -TARGET_NAME = gditest - -TARGET_SDKLIBS = kernel32.a gdi32.a - -TARGET_OBJECTS = $(TARGET_NAME).o - -TARGET_CFLAGS = -Wall -Werror - -include $(PATH_TO_TOP)/rules.mak - -include $(TOOLS_PATH)/helper.mk - -# EOF diff --git a/reactos/subsys/system/gstart/.cvsignore b/reactos/subsys/system/gstart/.cvsignore deleted file mode 100644 index f11780de771..00000000000 --- a/reactos/subsys/system/gstart/.cvsignore +++ /dev/null @@ -1,6 +0,0 @@ -*.coff -*.exe -*.d -*.o -*.sym -*.map diff --git a/reactos/subsys/system/gstart/Makefile b/reactos/subsys/system/gstart/Makefile deleted file mode 100644 index fe5b07057e8..00000000000 --- a/reactos/subsys/system/gstart/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -# $Id: Makefile,v 1.2 2003/11/14 17:13:32 weiden Exp $ - -PATH_TO_TOP = ../../.. - -TARGET_TYPE = program - -TARGET_APPTYPE = console - -TARGET_NAME = gstart - -TARGET_INSTALLDIR = system32 - -TARGET_SDKLIBS = user32.a gdi32.a ntdll.a kernel32.a - -TARGET_OBJECTS = $(TARGET_NAME).o - -TARGET_CFLAGS = -Wall -Werror - -include $(PATH_TO_TOP)/rules.mak - -include $(TOOLS_PATH)/helper.mk - -# EOF diff --git a/reactos/subsys/system/gstart/gstart.c b/reactos/subsys/system/gstart/gstart.c deleted file mode 100644 index 452b24391a1..00000000000 --- a/reactos/subsys/system/gstart/gstart.c +++ /dev/null @@ -1,89 +0,0 @@ -/* $Id: gstart.c,v 1.3 2002/09/08 10:23:47 chorns Exp $ - * - * PROJECT : ReactOS Operating System - * DESCRIPTION: ReactOS GUI Startup - * LICENSE : See top level directory - * - */ -#define NTOS_MODE_USER -#include <ntos.h> -#include <windows.h> -#include <stdarg.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <ctype.h> - -int ExecuteProcess(char* name, char* cmdline) -{ - PROCESS_INFORMATION ProcessInformation; - STARTUPINFO StartupInfo; - BOOL ret; - CHAR fullname[260]; - PCHAR p; - - /* append '.exe' if needed */ - strcpy (fullname, name); - p = strrchr (fullname, '.'); - if ((p == NULL) || (_stricmp (p, ".exe") != 0)) - { - strcat (fullname, ".exe"); - } - - memset(&StartupInfo, 0, sizeof(StartupInfo)); - StartupInfo.cb = sizeof (STARTUPINFO); - StartupInfo.lpTitle = name; - if( cmdline && *cmdline ) - *(cmdline-1) = ' '; - ret = CreateProcessA(fullname, - name, - NULL, - NULL, - FALSE, - 0, - NULL, - NULL, - &StartupInfo, - &ProcessInformation); - if (ret) - { - WaitForSingleObject(ProcessInformation.hProcess, INFINITE); - CloseHandle(ProcessInformation.hProcess); - CloseHandle(ProcessInformation.hThread); - } - return(ret); -} - -int main(int argc, char* argv[]) -{ - HDC Desktop; - HBRUSH Pen; - - GdiDllInitialize (NULL, DLL_PROCESS_ATTACH, NULL); - - /* Set up a DC called Desktop that accesses DISPLAY */ - Desktop = CreateDCA("DISPLAY", NULL, NULL, NULL); - if (Desktop == NULL) - { - return 1; - } - - Pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 255)); - SelectObject(Desktop, Pen); - Rectangle(Desktop, 0, 0, 640, 480); - - if (argc > 1) - { - ExecuteProcess(argv[1], ""); - } - else - { - Sleep(50); - } - - DeleteDC(Desktop); - - return(0); -} - -/* EOF */ diff --git a/reactos/subsys/system/gstart/gstart.rc b/reactos/subsys/system/gstart/gstart.rc deleted file mode 100644 index 8d01c9487a8..00000000000 --- a/reactos/subsys/system/gstart/gstart.rc +++ /dev/null @@ -1,38 +0,0 @@ -#include <defines.h> -#include <reactos/resource.h> - -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", "ReactOS GUI Startup\0" - VALUE "FileVersion", RES_STR_FILE_VERSION - VALUE "InternalName", "gstart\0" - VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT - VALUE "OriginalFilename", "gstart.exe\0" - VALUE "ProductName", RES_STR_PRODUCT_NAME - VALUE "ProductVersion", RES_STR_PRODUCT_VERSION - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - From 30830340a83c1a6b041b60bfe5b32e1b3580d2e0 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Thu, 26 Feb 2004 13:45:44 +0000 Subject: [PATCH 0203/1463] - Support for RBBS_HIDETITLE style. svn path=/trunk/; revision=8399 --- reactos/lib/comctl32/rebar.c | 7 ++++--- reactos/w32api/include/commctrl.h | 4 ++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/reactos/lib/comctl32/rebar.c b/reactos/lib/comctl32/rebar.c index f53da410a60..d349d5d0385 100644 --- a/reactos/lib/comctl32/rebar.c +++ b/reactos/lib/comctl32/rebar.c @@ -985,7 +985,7 @@ REBAR_CalcHorzBand (REBAR_INFO *infoPtr, UINT rstart, UINT rend, BOOL notify) } /* text is visible */ - if (lpBand->fStatus & HAS_TEXT) { + if ((lpBand->fStatus & HAS_TEXT) && !(lpBand->fStyle & RBBS_HIDETITLE)) { lpBand->fDraw |= DRAW_TEXT; lpBand->rcCapText.right = max(lpBand->rcCapText.left, lpBand->rcCapText.right-REBAR_POST_TEXT); @@ -1131,7 +1131,7 @@ REBAR_CalcVertBand (REBAR_INFO *infoPtr, UINT rstart, UINT rend, BOOL notify) } /* text is visible */ - if (lpBand->fStatus & HAS_TEXT) { + if ((lpBand->fStatus & HAS_TEXT) && !(lpBand->fStyle & RBBS_HIDETITLE)) { lpBand->fDraw |= DRAW_TEXT; lpBand->rcCapText.bottom = max(lpBand->rcCapText.top, lpBand->rcCapText.bottom); @@ -2030,7 +2030,8 @@ REBAR_ValidateBand (REBAR_INFO *infoPtr, REBAR_BAND *lpBand) } /* text is visible */ - if ((lpBand->fMask & RBBIM_TEXT) && (lpBand->lpText)) { + if ((lpBand->fMask & RBBIM_TEXT) && (lpBand->lpText) && + !(lpBand->fStyle & RBBS_HIDETITLE)) { HDC hdc = GetDC (0); HFONT hOldFont = SelectObject (hdc, infoPtr->hFont); SIZE size; diff --git a/reactos/w32api/include/commctrl.h b/reactos/w32api/include/commctrl.h index 3c15dffa5d8..6917cb26ab3 100644 --- a/reactos/w32api/include/commctrl.h +++ b/reactos/w32api/include/commctrl.h @@ -1596,6 +1596,10 @@ extern "C" { #define RBBS_HIDDEN 8 #define RBBS_NOVERT 16 #define RBBS_FIXEDBMP 32 +#if (_WIN32_IE >= 0x0501) +#define RBBS_HIDETITLE 0x400 +#define RBBS_TOPALIGN 0x800 +#endif /* _WIN32_IE >= 0x0501 */ #define RBBIM_STYLE 1 #define RBBIM_COLORS 2 #define RBBIM_TEXT 4 From 803e8a4b0ffcf2c4a785a9717c0ace62df6972c0 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Thu, 26 Feb 2004 16:16:18 +0000 Subject: [PATCH 0204/1463] - Removed IsTextUnicode stub and replaced it with forwarding to NTDLL.RtlIsTextUnicode. svn path=/trunk/; revision=8400 --- reactos/lib/advapi32/advapi32.edf | 4 ++-- reactos/lib/advapi32/makefile | 3 +-- reactos/lib/advapi32/misc/text.c | 17 ----------------- 3 files changed, 3 insertions(+), 21 deletions(-) delete mode 100644 reactos/lib/advapi32/misc/text.c diff --git a/reactos/lib/advapi32/advapi32.edf b/reactos/lib/advapi32/advapi32.edf index 0868b8af518..d8b6cfad136 100644 --- a/reactos/lib/advapi32/advapi32.edf +++ b/reactos/lib/advapi32/advapi32.edf @@ -1,4 +1,4 @@ -; $Id: advapi32.edf,v 1.31 2004/02/26 00:33:09 sedwards Exp $ +; $Id: advapi32.edf,v 1.32 2004/02/26 16:16:17 navaraf Exp $ ; ; advapi32.edf ; @@ -182,7 +182,7 @@ InitiateSystemShutdownA=InitiateSystemShutdownA@20 InitiateSystemShutdownW=InitiateSystemShutdownW@20 ;IsAccessPermittedA=IsAccessPermittedA@20 ;IsAccessPermittedW=IsAccessPermittedW@20 -IsTextUnicode=IsTextUnicode@12 +IsTextUnicode=NTDLL.RtlIsTextUnicode@12 IsValidAcl=IsValidAcl@4 IsValidSecurityDescriptor=IsValidSecurityDescriptor@4 IsValidSid=IsValidSid@4 diff --git a/reactos/lib/advapi32/makefile b/reactos/lib/advapi32/makefile index 8b4ceeb5026..b24c4dd1016 100644 --- a/reactos/lib/advapi32/makefile +++ b/reactos/lib/advapi32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.35 2004/02/26 00:33:09 sedwards Exp $ +# $Id: makefile,v 1.36 2004/02/26 16:16:18 navaraf Exp $ PATH_TO_TOP = ../.. @@ -21,7 +21,6 @@ MISC_OBJECTS = \ misc/logon.o \ misc/shutdown.o \ misc/sysfunc.o \ - misc/text.o REGISTRY_OBJECTS = \ reg/reg.o diff --git a/reactos/lib/advapi32/misc/text.c b/reactos/lib/advapi32/misc/text.c deleted file mode 100644 index bd120f9d06d..00000000000 --- a/reactos/lib/advapi32/misc/text.c +++ /dev/null @@ -1,17 +0,0 @@ -/* $Id: text.c,v 1.1 2004/02/26 00:33:09 sedwards Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS system libraries - * FILE: lib/advapi32/misc/text.c - * PURPOSE: advapi32.dll Text Functions - * PROGRAMMER: Steven Edwards - * UPDATE HISTORY: - * 20042502 - */ -#include <windows.h> - -BOOL STDCALL IsTextUnicode(CONST VOID* pbuffer, int cb, LPINT lpi) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} From 86275a897fed0d55c644dbbb01d95454816f472d Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Thu, 26 Feb 2004 16:19:17 +0000 Subject: [PATCH 0205/1463] - Modified import library order to link to snprintf from MSVCRT and not NTDLL. The one in NTDLL doesn't support '%f' parsing and so it caused the "%f KB" texts in Explorer instead of real file size. svn path=/trunk/; revision=8401 --- reactos/lib/shlwapi/Makefile.ros-template | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/shlwapi/Makefile.ros-template b/reactos/lib/shlwapi/Makefile.ros-template index 50743c4bbfa..3ac99d3d78e 100644 --- a/reactos/lib/shlwapi/Makefile.ros-template +++ b/reactos/lib/shlwapi/Makefile.ros-template @@ -1,4 +1,4 @@ -# $Id: Makefile.ros-template,v 1.3 2004/02/19 21:19:27 gvg Exp $ +# $Id: Makefile.ros-template,v 1.4 2004/02/26 16:19:17 navaraf Exp $ TARGET_NAME = shlwapi @@ -7,7 +7,7 @@ TARGET_OBJECTS = @C_SRCS@ TARGET_CFLAGS = -D__REACTOS__ @EXTRADEFS@ # FIXME: we don't do delayed imports yet so oleaut32.a is listed explicitly -TARGET_SDKLIBS = @IMPORTS@ oleaut32.a libwine.a wine_uuid.a ntdll.a libwine_unicode.a +TARGET_SDKLIBS = @IMPORTS@ msvcrt.a oleaut32.a libwine.a wine_uuid.a libwine_unicode.a ntdll.a TARGET_NORC = yes From 8098620a78042149ac1406aadac5545fc2a244d7 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Thu, 26 Feb 2004 18:54:52 +0000 Subject: [PATCH 0206/1463] - Corrected EiAllocatePool prototype. - Corrected debug message in MmIsUsablePage. svn path=/trunk/; revision=8402 --- reactos/ntoskrnl/mm/freelist.c | 2 +- reactos/ntoskrnl/mm/pool.c | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/reactos/ntoskrnl/mm/freelist.c b/reactos/ntoskrnl/mm/freelist.c index 19c4913e455..c764a574647 100644 --- a/reactos/ntoskrnl/mm/freelist.c +++ b/reactos/ntoskrnl/mm/freelist.c @@ -718,7 +718,7 @@ MmIsUsablePage(PHYSICAL_ADDRESS PhysicalAddress) { ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE; - DPRINT("MmGetReferenceCountPage(PhysicalAddress %x)\n", PhysicalAddress); + DPRINT("MmIsUsablePage(PhysicalAddress %x)\n", PhysicalAddress); if (PhysicalAddress.u.LowPart == 0) { diff --git a/reactos/ntoskrnl/mm/pool.c b/reactos/ntoskrnl/mm/pool.c index 5f0442a6cd2..05321286819 100644 --- a/reactos/ntoskrnl/mm/pool.c +++ b/reactos/ntoskrnl/mm/pool.c @@ -1,4 +1,4 @@ -/* $Id: pool.c,v 1.26 2003/12/30 18:52:05 fireball Exp $ +/* $Id: pool.c,v 1.27 2004/02/26 18:54:52 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -23,11 +23,7 @@ /* FUNCTIONS ***************************************************************/ -#if defined(__GNUC__) -PVOID STDCALL STATIC -#else STATIC PVOID STDCALL -#endif EiAllocatePool(POOL_TYPE PoolType, ULONG NumberOfBytes, ULONG Tag, From d96346dede2589d42a9a74cbc26dd24c5fb44c86 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Thu, 26 Feb 2004 19:29:55 +0000 Subject: [PATCH 0207/1463] - Marked a cache segment as page out in progress to prevent from recursive calls to MmPageOutPhysicalAddress. - This fixes bug #220. svn path=/trunk/; revision=8403 --- reactos/ntoskrnl/cc/view.c | 7 +++++-- reactos/ntoskrnl/include/internal/cc.h | 4 +++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/cc/view.c b/reactos/ntoskrnl/cc/view.c index c9ba56ff38d..b4fa04963ca 100644 --- a/reactos/ntoskrnl/cc/view.c +++ b/reactos/ntoskrnl/cc/view.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: view.c,v 1.71 2003/12/31 05:33:03 jfilby Exp $ +/* $Id: view.c,v 1.72 2004/02/26 19:29:55 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/cc/view.c @@ -270,13 +270,14 @@ CcRosTrimCache(ULONG Target, ULONG Priority, PULONG NrFreed) } else { - if (last != current && current->MappedCount > 0 && !current->Dirty) + if (last != current && current->MappedCount > 0 && !current->Dirty && !current->PageOut) { ULONG i; NTSTATUS Status; current->ReferenceCount++; last = current; + current->PageOut = TRUE; KeReleaseSpinLock(¤t->Bcb->BcbLock, oldIrql); ExReleaseFastMutex(&ViewLock); for (i = 0; i < current->Bcb->CacheSegmentSize / PAGE_SIZE; i++) @@ -292,6 +293,7 @@ CcRosTrimCache(ULONG Target, ULONG Priority, PULONG NrFreed) ExAcquireFastMutex(&ViewLock); KeAcquireSpinLock(¤t->Bcb->BcbLock, &oldIrql); current->ReferenceCount--; + current->PageOut = FALSE; KeReleaseSpinLock(¤t->Bcb->BcbLock, oldIrql); current_entry = ¤t->CacheSegmentLRUListEntry; continue; @@ -505,6 +507,7 @@ CcRosCreateCacheSegment(PBCB Bcb, current = ExAllocateFromNPagedLookasideList(&CacheSegLookasideList); current->Valid = FALSE; current->Dirty = FALSE; + current->PageOut = FALSE; current->FileOffset = ROUND_DOWN(FileOffset, Bcb->CacheSegmentSize); current->Bcb = Bcb; current->MappedCount = 0; diff --git a/reactos/ntoskrnl/include/internal/cc.h b/reactos/ntoskrnl/include/internal/cc.h index 86c1b5252c7..5dc6c3e3d1c 100644 --- a/reactos/ntoskrnl/include/internal/cc.h +++ b/reactos/ntoskrnl/include/internal/cc.h @@ -1,6 +1,6 @@ #ifndef __INCLUDE_INTERNAL_CC_H #define __INCLUDE_INTERNAL_CC_H -/* $Id: cc.h,v 1.18 2003/06/27 21:28:30 hbirr Exp $ */ +/* $Id: cc.h,v 1.19 2004/02/26 19:29:55 hbirr Exp $ */ #include <ddk/ntifs.h> @@ -31,6 +31,8 @@ typedef struct _CACHE_SEGMENT BOOLEAN Valid; /* Are the contents of the cache segment data newer than those on disk. */ BOOLEAN Dirty; + /* Page out in progress */ + BOOLEAN PageOut; ULONG MappedCount; /* Entry in the list of segments for this BCB. */ LIST_ENTRY BcbSegmentListEntry; From c22f36b23a85842aa328db06642f97a28806b320 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Thu, 26 Feb 2004 19:47:39 +0000 Subject: [PATCH 0208/1463] resize taskbar buttons according to number of running applications svn path=/trunk/; revision=8404 --- reactos/subsys/system/explorer/doxy-footer.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/subsys/system/explorer/doxy-footer.html b/reactos/subsys/system/explorer/doxy-footer.html index 551400d4800..3508d65713a 100644 --- a/reactos/subsys/system/explorer/doxy-footer.html +++ b/reactos/subsys/system/explorer/doxy-footer.html @@ -3,7 +3,7 @@ <tr> <td><address style="align: right;"><small> ROS Explorer Source Code Documentation -<br>generated on 24.02.2004 by <a href="http://www.doxygen.org/index.html"> +<br>generated on 26.02.2004 by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border=0> </small></address> </td> From fbd78a5a3a318c692442f93dc9d13514d0db274d Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Thu, 26 Feb 2004 19:47:39 +0000 Subject: [PATCH 0209/1463] resize taskbar buttons according to number of running applications svn path=/trunk/; revision=8405 --- reactos/subsys/system/explorer/taskbar/desktopbar.cpp | 2 +- reactos/subsys/system/explorer/taskbar/quicklaunch.cpp | 1 + reactos/subsys/system/explorer/taskbar/taskbar.h | 4 ++++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp index abfdade55a6..73f5c574b4a 100644 --- a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp @@ -126,7 +126,7 @@ LRESULT DesktopBar::Init(LPCREATESTRUCT pcs) rbBand.cyMaxChild = 0; rbBand.cyIntegral = DESKTOPBARBAR_HEIGHT; - rbBand.lpText = TEXT("Quicklaunchbar"); + rbBand.lpText = TEXT("Quicklaunch"); rbBand.hwndChild = _hwndQuickLaunch; rbBand.cxMinChild = 0; rbBand.cyMinChild = HIWORD(SendMessage(_hwndQuickLaunch, TB_GETBUTTONSIZE, 0, 0)) + 2; diff --git a/reactos/subsys/system/explorer/taskbar/quicklaunch.cpp b/reactos/subsys/system/explorer/taskbar/quicklaunch.cpp index 89b59f276c7..eb11c642d0b 100644 --- a/reactos/subsys/system/explorer/taskbar/quicklaunch.cpp +++ b/reactos/subsys/system/explorer/taskbar/quicklaunch.cpp @@ -65,6 +65,7 @@ QuickLaunchBar::QuickLaunchBar(HWND hwnd) SetWindowStyle(hwndToolTip, GetWindowStyle(hwndToolTip)|TTS_ALWAYSTIP); + // delay refresh to some time later PostMessage(hwnd, PM_REFRESH, 0, 0); } diff --git a/reactos/subsys/system/explorer/taskbar/taskbar.h b/reactos/subsys/system/explorer/taskbar/taskbar.h index d630e44423b..b99c7bf8249 100644 --- a/reactos/subsys/system/explorer/taskbar/taskbar.h +++ b/reactos/subsys/system/explorer/taskbar/taskbar.h @@ -38,6 +38,9 @@ #define TASKBAR_LEFT 70 //#define TASKBAR_AT_TOP +#define TASKBUTTONWIDTH_MIN 38 +#define TASKBUTTONWIDTH_MAX 160 + #define IDW_TASKTOOLBAR 100 @@ -92,4 +95,5 @@ protected: static BOOL CALLBACK EnumWndProc(HWND hwnd, LPARAM lparam); void Refresh(); + void ResizeButtons(); }; From 15eee1ef2637cc9a1d8b45d6e1426b5424583c4d Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Thu, 26 Feb 2004 19:47:39 +0000 Subject: [PATCH 0210/1463] resize taskbar buttons according to number of running applications svn path=/trunk/; revision=8406 --- .../system/explorer/taskbar/taskbar.cpp | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/system/explorer/taskbar/taskbar.cpp b/reactos/subsys/system/explorer/taskbar/taskbar.cpp index b3e3189947c..de120247324 100644 --- a/reactos/subsys/system/explorer/taskbar/taskbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/taskbar.cpp @@ -87,7 +87,7 @@ LRESULT TaskBar::Init(LPCREATESTRUCT pcs) CCS_TOP|CCS_NODIVIDER | TBSTYLE_LIST|TBSTYLE_TOOLTIPS|TBSTYLE_WRAPABLE, IDW_TASKTOOLBAR, 0, 0, 0, NULL, 0, 0, 0, 16, 16, sizeof(TBBUTTON)); - SendMessage(_htoolbar, TB_SETBUTTONWIDTH, 0, MAKELONG(80,160)); + SendMessage(_htoolbar, TB_SETBUTTONWIDTH, 0, MAKELONG(TASKBUTTONWIDTH_MIN,TASKBUTTONWIDTH_MAX)); //SendMessage(_htoolbar, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_MIXEDBUTTONS); //SendMessage(_htoolbar, TB_SETDRAWTEXTFLAGS, DT_CENTER|DT_VCENTER, DT_CENTER|DT_VCENTER); //SetWindowFont(_htoolbar, GetStockFont(ANSI_VAR_FONT), FALSE); @@ -321,7 +321,7 @@ BOOL CALLBACK TaskBar::EnumWndProc(HWND hwnd, LPARAM lparam) entry._btn_idx = SendMessage(pThis->_htoolbar, TB_BUTTONCOUNT, 0, 0); SendMessage(pThis->_htoolbar, TB_INSERTBUTTON, entry._btn_idx, (LPARAM)&btn); - SendMessage(pThis->_htoolbar, TB_AUTOSIZE, 0, 0); ///@todo useless? + pThis->ResizeButtons(); } else { // refresh attributes of existing buttons if (btn.fsState != entry._fsState) @@ -419,7 +419,7 @@ void TaskBar::Refresh() } } - SendMessage(_htoolbar, TB_AUTOSIZE, 0, 0); ///@todo useless? + ResizeButtons(); } } @@ -431,3 +431,19 @@ TaskBarMap::iterator TaskBarMap::find_id(int id) return end(); } + +void TaskBar::ResizeButtons() +{ + int btns = _map.size(); + + if (btns > 0) { + int width = ClientRect(_hwnd).right / btns; + if (width < TASKBUTTONWIDTH_MIN) + width = TASKBUTTONWIDTH_MIN; + else if (width > TASKBUTTONWIDTH_MAX) + width = TASKBUTTONWIDTH_MAX; + + SendMessage(_htoolbar, TB_SETBUTTONWIDTH, 0, MAKELONG(TASKBUTTONWIDTH_MIN,width)); +// SendMessage(_htoolbar, TB_AUTOSIZE, 0, 0); + } +} From 8fe7e083b31a496bdd4a328b78ca4e276592bdfb Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Thu, 26 Feb 2004 20:20:44 +0000 Subject: [PATCH 0211/1463] fix foreground window handling when clicking on notification area icons svn path=/trunk/; revision=8407 --- .../system/explorer/taskbar/traynotify.cpp | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index 10eee1a68d7..8d8670c3f70 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -185,17 +185,21 @@ LRESULT NotifyArea::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) // Notify the message if the owner is still alive if (IsWindow(entry._hWnd)) { - // allow SetForegroundWindow() in Client Process - DWORD processId; - GetWindowThreadProcessId(entry._hWnd, &processId); + if (nmsg == WM_MOUSEMOVE) // avoid to call blocking SendMessage() for merely moving the mouse over icons + PostMessage(entry._hWnd, entry._uCallbackMessage, entry._uID, nmsg); + else { + // allow SetForegroundWindow() in client process + DWORD processId; + GetWindowThreadProcessId(entry._hWnd, &processId); - // bind dynamically to AllowSetForegroundWindow() to be compatible to WIN98 - static DynamicFct<BOOL(WINAPI*)(DWORD dwProcessId)> AllowSetForegroundWindow(TEXT("USER32"), "AllowSetForegroundWindow"); + // bind dynamically to AllowSetForegroundWindow() to be compatible to WIN98 + static DynamicFct<BOOL(WINAPI*)(DWORD dwProcessId)> AllowSetForegroundWindow(TEXT("USER32"), "AllowSetForegroundWindow"); - if (AllowSetForegroundWindow) - (*AllowSetForegroundWindow)(processId); + if (AllowSetForegroundWindow) + (*AllowSetForegroundWindow)(processId); - PostMessage(entry._hWnd, entry._uCallbackMessage, entry._uID, nmsg); + SendMessage(entry._hWnd, entry._uCallbackMessage, entry._uID, nmsg); + } } else if (_icon_map.erase(entry)) // delete icons without valid owner window Refresh(); From 75f575e7ddf2fc6fd7b870cc2fac0919b32565be Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Thu, 26 Feb 2004 20:20:44 +0000 Subject: [PATCH 0212/1463] fix foreground window handling when clicking on notification area icons svn path=/trunk/; revision=8408 --- .../system/explorer/taskbar/taskbar.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/reactos/subsys/system/explorer/taskbar/taskbar.cpp b/reactos/subsys/system/explorer/taskbar/taskbar.cpp index de120247324..f71150386ea 100644 --- a/reactos/subsys/system/explorer/taskbar/taskbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/taskbar.cpp @@ -87,7 +87,7 @@ LRESULT TaskBar::Init(LPCREATESTRUCT pcs) CCS_TOP|CCS_NODIVIDER | TBSTYLE_LIST|TBSTYLE_TOOLTIPS|TBSTYLE_WRAPABLE, IDW_TASKTOOLBAR, 0, 0, 0, NULL, 0, 0, 0, 16, 16, sizeof(TBBUTTON)); - SendMessage(_htoolbar, TB_SETBUTTONWIDTH, 0, MAKELONG(TASKBUTTONWIDTH_MIN,TASKBUTTONWIDTH_MAX)); + SendMessage(_htoolbar, TB_SETBUTTONWIDTH, 0, MAKELONG(TASKBUTTONWIDTH_MAX,TASKBUTTONWIDTH_MAX)); //SendMessage(_htoolbar, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_MIXEDBUTTONS); //SendMessage(_htoolbar, TB_SETDRAWTEXTFLAGS, DT_CENTER|DT_VCENTER, DT_CENTER|DT_VCENTER); //SetWindowFont(_htoolbar, GetStockFont(ANSI_VAR_FONT), FALSE); @@ -321,6 +321,7 @@ BOOL CALLBACK TaskBar::EnumWndProc(HWND hwnd, LPARAM lparam) entry._btn_idx = SendMessage(pThis->_htoolbar, TB_BUTTONCOUNT, 0, 0); SendMessage(pThis->_htoolbar, TB_INSERTBUTTON, entry._btn_idx, (LPARAM)&btn); + pThis->ResizeButtons(); } else { // refresh attributes of existing buttons @@ -437,13 +438,15 @@ void TaskBar::ResizeButtons() int btns = _map.size(); if (btns > 0) { - int width = ClientRect(_hwnd).right / btns; - if (width < TASKBUTTONWIDTH_MIN) - width = TASKBUTTONWIDTH_MIN; - else if (width > TASKBUTTONWIDTH_MAX) - width = TASKBUTTONWIDTH_MAX; + int bar_width = ClientRect(_hwnd).right; + int btn_width = bar_width / btns; - SendMessage(_htoolbar, TB_SETBUTTONWIDTH, 0, MAKELONG(TASKBUTTONWIDTH_MIN,width)); -// SendMessage(_htoolbar, TB_AUTOSIZE, 0, 0); + if (btn_width < TASKBUTTONWIDTH_MIN) + btn_width = TASKBUTTONWIDTH_MIN; + else if (btn_width > TASKBUTTONWIDTH_MAX) + btn_width = TASKBUTTONWIDTH_MAX; + + SendMessage(_htoolbar, TB_SETBUTTONWIDTH, 0, MAKELONG(btn_width,btn_width)); + SendMessage(_htoolbar, TB_AUTOSIZE, 0, 0); } } From 2e8d0a55b2032b9d2479455e8b1e874e2741812e Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Thu, 26 Feb 2004 20:26:11 +0000 Subject: [PATCH 0213/1463] docu update svn path=/trunk/; revision=8410 --- reactos/subsys/system/explorer/doc/TODO.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/reactos/subsys/system/explorer/doc/TODO.txt b/reactos/subsys/system/explorer/doc/TODO.txt index 4f079c3f76a..4011180f249 100644 --- a/reactos/subsys/system/explorer/doc/TODO.txt +++ b/reactos/subsys/system/explorer/doc/TODO.txt @@ -14,7 +14,6 @@ - command line in explorer windows - hide CVS subdirectories, may be even implement a CVS managment plugin - printer and RAS connection icons in desktop notification area -- make task buttons smaller when running many applications - use multi threading for launching of programs and filling start menu subdirectories - close start start menu when resizing explorer bar - adjust already open windows of all running applications when resizing explorer bar @@ -33,7 +32,7 @@ as it doesn't have a way to configure them. (missing configuration dialogs) - Unterdr點ken des Taskbar-Kontext-Men黶 黚er Taskbar Buttons -- Vollbildfenster suchen -> Taskleiste ausblenden [Ist WS_EX_TOPMOST 黚erhaupt notwendig?] +- Vollbildfenster suchen -> Taskleiste ausblenden - Fenster-Aktivierung nach Desktop-Umschaltung - Desktop-Manager: Speicherung der Verteilung von Applikations-Fenstern auf die verschiedenen Desktops; Desktop-Namen - neuer Startmen-Eintrag: "Filemanager" neben "Explore" -> Anzeige von C: und D: From 907d42478eb6e1cbba065d6af2b59b3fcdf35798 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Thu, 26 Feb 2004 20:38:32 +0000 Subject: [PATCH 0214/1463] avoid displaying context menu for application button _and_ desktop bar at the same time svn path=/trunk/; revision=8411 --- reactos/subsys/system/explorer/doc/TODO.txt | 1 - reactos/subsys/system/explorer/taskbar/taskbar.cpp | 9 ++++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/system/explorer/doc/TODO.txt b/reactos/subsys/system/explorer/doc/TODO.txt index 4011180f249..09c6839088f 100644 --- a/reactos/subsys/system/explorer/doc/TODO.txt +++ b/reactos/subsys/system/explorer/doc/TODO.txt @@ -31,7 +31,6 @@ Yes, ROS epxlorer doesn't read many settings from the registry currently, as it doesn't have a way to configure them. (missing configuration dialogs) -- Unterdr點ken des Taskbar-Kontext-Men黶 黚er Taskbar Buttons - Vollbildfenster suchen -> Taskleiste ausblenden - Fenster-Aktivierung nach Desktop-Umschaltung - Desktop-Manager: Speicherung der Verteilung von Applikations-Fenstern auf die verschiedenen Desktops; Desktop-Namen diff --git a/reactos/subsys/system/explorer/taskbar/taskbar.cpp b/reactos/subsys/system/explorer/taskbar/taskbar.cpp index f71150386ea..fedca72d766 100644 --- a/reactos/subsys/system/explorer/taskbar/taskbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/taskbar.cpp @@ -113,6 +113,13 @@ LRESULT TaskBar::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) case WM_TIMER: Refresh(); return 0; + + case WM_CONTEXTMENU: { + Point pt(lparam); + ScreenToClient(_htoolbar, &pt); + if ((HWND)wparam==_htoolbar && SendMessage(_htoolbar, TB_HITTEST, 0, (LPARAM)&pt)>0) + break; // avoid displaying context menu for application button _and_ desktop bar at the same time + goto def;} /* //#define PM_SHELLHOOK_NOTIFY (WM_APP+0x10) @@ -130,7 +137,7 @@ LRESULT TaskBar::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) Refresh(); break;} */ - default: + default: def: return super::WndProc(nmsg, wparam, lparam); } From 9bcc74655cceabcf555d992caf339cdd33bf97d7 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Thu, 26 Feb 2004 21:20:50 +0000 Subject: [PATCH 0215/1463] include explorer windows in desktop switching svn path=/trunk/; revision=8413 --- reactos/subsys/system/explorer/desktop/desktop.cpp | 9 ++------- reactos/subsys/system/explorer/explorer.cpp | 9 ++++----- reactos/subsys/system/explorer/globals.h | 3 +++ reactos/subsys/system/explorer/utility/window.cpp | 2 +- 4 files changed, 10 insertions(+), 13 deletions(-) diff --git a/reactos/subsys/system/explorer/desktop/desktop.cpp b/reactos/subsys/system/explorer/desktop/desktop.cpp index 3b37236fae8..a307c3bd6ab 100644 --- a/reactos/subsys/system/explorer/desktop/desktop.cpp +++ b/reactos/subsys/system/explorer/desktop/desktop.cpp @@ -162,14 +162,9 @@ static BOOL CALLBACK DesktopEnumFct(HWND hwnd, LPARAM lparam) { WindowSet& windows = *(WindowSet*)lparam; - if (IsWindowVisible(hwnd)) { - DWORD pid; - - GetWindowThreadProcessId(hwnd, &pid); - - if (pid != GetCurrentProcessId()) + if (IsWindowVisible(hwnd)) + if (hwnd!=g_Globals._hwndDesktopBar && hwnd!=g_Globals._hwndDesktop) windows.insert(hwnd); - } return TRUE; } diff --git a/reactos/subsys/system/explorer/explorer.cpp b/reactos/subsys/system/explorer/explorer.cpp index a39a2e8482b..de8c4e1257c 100644 --- a/reactos/subsys/system/explorer/explorer.cpp +++ b/reactos/subsys/system/explorer/explorer.cpp @@ -66,6 +66,7 @@ ExplorerGlobals::ExplorerGlobals() #endif _hwndDesktopBar = 0; _hwndShellView = 0; + _hwndDesktop = 0; } @@ -687,14 +688,12 @@ int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdL // initialize COM and OLE before creating the desktop window OleInit usingCOM; - HWND hwndDesktop = 0; - if (startup_desktop) { g_Globals._desktops.init(); - hwndDesktop = DesktopWindow::Create(); + g_Globals._hwndDesktop = DesktopWindow::Create(); #ifdef _USE_HDESK - g_Globals._desktops.get_current_Desktop()->_hwndDesktop = hwndDesktop; + g_Globals._desktops.get_current_Desktop()->_hwndDesktop = g_Globals._hwndDesktop; #endif if (autostart) { @@ -709,7 +708,7 @@ int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdL lpCmdLine[_tcslen(lpCmdLine)-1] = '\0'; } - if (hwndDesktop) + if (g_Globals._hwndDesktop) g_Globals._desktop_mode = true; int ret = explorer_main(hInstance, lpCmdLine, nShowCmd); diff --git a/reactos/subsys/system/explorer/globals.h b/reactos/subsys/system/explorer/globals.h index d5339cc39f4..aff1290747b 100644 --- a/reactos/subsys/system/explorer/globals.h +++ b/reactos/subsys/system/explorer/globals.h @@ -196,7 +196,9 @@ struct Desktops : public vector<DesktopRef> void init(); void SwitchToDesktop(int idx); +#ifdef _USE_HDESK DesktopRef& get_current_Desktop() {return (*this)[_current_desktop];} +#endif int _current_desktop; }; @@ -227,6 +229,7 @@ extern struct ExplorerGlobals HWND _hwndDesktopBar; HWND _hwndShellView; + HWND _hwndDesktop; Desktops _desktops; } g_Globals; diff --git a/reactos/subsys/system/explorer/utility/window.cpp b/reactos/subsys/system/explorer/utility/window.cpp index 1a3d6d1bfad..793414709a6 100644 --- a/reactos/subsys/system/explorer/utility/window.cpp +++ b/reactos/subsys/system/explorer/utility/window.cpp @@ -1057,7 +1057,7 @@ LRESULT FlatButton::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) if (IsWindowEnabled(_hwnd)) { DWORD pid_foreground; - HWND hwnd_foreground = GetForegroundWindow(); //@@ vielleicht besser 黚er WM_ACTIVATEAPP-Abfrage + HWND hwnd_foreground = GetForegroundWindow(); //@@ may be better look for WM_ACTIVATEAPP ? GetWindowThreadProcessId(hwnd_foreground, &pid_foreground); if (GetCurrentProcessId() == pid_foreground) { From 11562074f25bda07721b250344ff66593d198979 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Thu, 26 Feb 2004 21:52:26 +0000 Subject: [PATCH 0216/1463] disable start menu entries for non-existing folders svn path=/trunk/; revision=8416 --- .../system/explorer/taskbar/startmenu.cpp | 17 ++++++++++++++--- .../subsys/system/explorer/taskbar/startmenu.h | 4 ++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/reactos/subsys/system/explorer/taskbar/startmenu.cpp b/reactos/subsys/system/explorer/taskbar/startmenu.cpp index 611f0cc4396..fe77f92fad8 100644 --- a/reactos/subsys/system/explorer/taskbar/startmenu.cpp +++ b/reactos/subsys/system/explorer/taskbar/startmenu.cpp @@ -1009,7 +1009,7 @@ void StartMenu::CreateSubmenu(int id, LPCTSTR title, CREATORFUNC_INFO creator) CreateSubmenu(id, StartMenuFolders(), title, creator); } -void StartMenu::CreateSubmenu(int id, int folder_id, LPCTSTR title, CREATORFUNC_INFO creator) +bool StartMenu::CreateSubmenu(int id, int folder_id, LPCTSTR title, CREATORFUNC_INFO creator) { try { SpecialFolderPath folder(folder_id, _hwnd); @@ -1018,12 +1018,17 @@ void StartMenu::CreateSubmenu(int id, int folder_id, LPCTSTR title, CREATORFUNC_ new_folders.push_back(folder); CreateSubmenu(id, new_folders, title, creator); + + return true; } catch(COMException&) { // ignore Exception and don't display anything + CloseOtherSubmenus(id); + _buttons[GetSelectionIndex()]._enabled = false; // disable entries for non-existing folders + return false; } } -void StartMenu::CreateSubmenu(int id, int folder_id1, int folder_id2, LPCTSTR title, CREATORFUNC_INFO creator) +bool StartMenu::CreateSubmenu(int id, int folder_id1, int folder_id2, LPCTSTR title, CREATORFUNC_INFO creator) { StartMenuFolders new_folders; @@ -1037,8 +1042,14 @@ void StartMenu::CreateSubmenu(int id, int folder_id1, int folder_id2, LPCTSTR ti } catch(COMException&) { } - if (!new_folders.empty()) + if (!new_folders.empty()) { CreateSubmenu(id, new_folders, title, creator); + return true; + } else { + CloseOtherSubmenus(id); + _buttons[GetSelectionIndex()]._enabled = false; // disable entries for non-existing folders + return false; + } } void StartMenu::CreateSubmenu(int id, const StartMenuFolders& new_folders, LPCTSTR title, CREATORFUNC_INFO creator) diff --git a/reactos/subsys/system/explorer/taskbar/startmenu.h b/reactos/subsys/system/explorer/taskbar/startmenu.h index 4cea212148e..b24ac2c1712 100644 --- a/reactos/subsys/system/explorer/taskbar/startmenu.h +++ b/reactos/subsys/system/explorer/taskbar/startmenu.h @@ -279,8 +279,8 @@ protected: bool CloseSubmenus() {return CloseOtherSubmenus();} bool CloseOtherSubmenus(int id=0); void CreateSubmenu(int id, LPCTSTR title, CREATORFUNC_INFO creator=s_def_creator); - void CreateSubmenu(int id, int folder, LPCTSTR title, CREATORFUNC_INFO creator=s_def_creator); - void CreateSubmenu(int id, int folder1, int folder2, LPCTSTR title, CREATORFUNC_INFO creator=s_def_creator); + bool CreateSubmenu(int id, int folder, LPCTSTR title, CREATORFUNC_INFO creator=s_def_creator); + bool CreateSubmenu(int id, int folder1, int folder2, LPCTSTR title, CREATORFUNC_INFO creator=s_def_creator); void CreateSubmenu(int id, const StartMenuFolders& new_folders, LPCTSTR title, CREATORFUNC_INFO creator=s_def_creator); void ActivateEntry(int id, const ShellEntrySet& entries); virtual void CloseStartMenu(int id=0); From 5469cad92649d537a2d5c22aebae1b27ab0fe1d0 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Thu, 26 Feb 2004 22:23:55 +0000 Subject: [PATCH 0217/1463] fixed crashes that could be caused by the thread cleanup routine when destroying windows from different threads svn path=/trunk/; revision=8418 --- reactos/subsys/win32k/include/cursoricon.h | 4 +- reactos/subsys/win32k/include/prop.h | 6 + reactos/subsys/win32k/include/window.h | 14 +- reactos/subsys/win32k/include/winpos.h | 2 +- reactos/subsys/win32k/misc/object.c | 5 +- reactos/subsys/win32k/ntuser/msgqueue.c | 32 +++-- reactos/subsys/win32k/ntuser/vis.c | 11 +- reactos/subsys/win32k/ntuser/window.c | 148 +++++++++++++++------ reactos/subsys/win32k/ntuser/winpos.c | 109 +++++++-------- reactos/subsys/win32k/objects/cursoricon.c | 8 +- 10 files changed, 215 insertions(+), 124 deletions(-) diff --git a/reactos/subsys/win32k/include/cursoricon.h b/reactos/subsys/win32k/include/cursoricon.h index c9b5a0e307b..412b60c782a 100644 --- a/reactos/subsys/win32k/include/cursoricon.h +++ b/reactos/subsys/win32k/include/cursoricon.h @@ -19,10 +19,12 @@ typedef struct _CURICON_OBJECT HCURSOR FASTCALL IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, BOOL ForceChange); BOOL FASTCALL IntSetupCurIconHandles(PWINSTATION_OBJECT WinStaObject); PCURICON_OBJECT FASTCALL IntGetCurIconObject(PWINSTATION_OBJECT WinStaObject, HANDLE Handle); -VOID FASTCALL IntReleaseCurIconObject(PCURICON_OBJECT Object); PCURICON_OBJECT FASTCALL IntCreateCurIconHandle(PWINSTATION_OBJECT WinStaObject); VOID FASTCALL IntCleanupCurIcons(struct _EPROCESS *Process, PW32PROCESS Win32Process); +#define IntReleaseCurIconObject(CurIconObj) \ + ObmDereferenceObject(CurIconObj) + #define IntLockProcessCursorIcons(W32Process) \ ExAcquireFastMutex(&W32Process->CursorIconListLock) diff --git a/reactos/subsys/win32k/include/prop.h b/reactos/subsys/win32k/include/prop.h index 99bedb233bd..14806633f9f 100644 --- a/reactos/subsys/win32k/include/prop.h +++ b/reactos/subsys/win32k/include/prop.h @@ -8,6 +8,12 @@ typedef struct _PROPERTY ATOM Atom; } PROPERTY, *PPROPERTY; +BOOL FASTCALL +IntSetProp(PWINDOW_OBJECT Wnd, ATOM Atom, HANDLE Data); + +PPROPERTY FASTCALL +IntGetProp(PWINDOW_OBJECT WindowObject, ATOM Atom); + #define IntLockWindowProperties(Window) \ ExAcquireFastMutex(&Window->PropListLock) diff --git a/reactos/subsys/win32k/include/window.h b/reactos/subsys/win32k/include/window.h index 9f316a67030..9a8ee46c634 100644 --- a/reactos/subsys/win32k/include/window.h +++ b/reactos/subsys/win32k/include/window.h @@ -72,9 +72,9 @@ typedef struct _WINDOW_OBJECT struct _WINDOW_OBJECT* PrevSibling; /* Entry in the list of thread windows. */ LIST_ENTRY ThreadListEntry; - /* Pointer to the parent window. */ + /* Handle to the parent window. */ HANDLE Parent; - /* Pointer to the owner window. */ + /* Handle to the owner window. */ HANDLE Owner; /* DC Entries (DCE) */ PDCE Dce; @@ -93,6 +93,7 @@ typedef struct _WINDOW_OBJECT PETHREAD OwnerThread; HWND hWndLastPopup; /* handle to last active popup window (wine doesn't use pointer, for unk. reason)*/ PINTERNALPOS InternalPos; + ULONG Status; } WINDOW_OBJECT; /* PWINDOW_OBJECT already declared at top of file */ /* Window flags. */ @@ -102,6 +103,9 @@ typedef struct _WINDOW_OBJECT #define WINDOWOBJECT_NEED_INTERNALPAINT (0x00000008) #define WINDOWOBJECT_RESTOREMAX (0x00000020) +#define WINDOWSTATUS_DESTROYING (0x1) +#define WINDOWSTATUS_DESTROYED (0x2) + #define IntIsDesktopWindow(WndObj) \ (WndObj->Parent == NULL) @@ -167,12 +171,6 @@ IntIsWindowVisible (HWND hWnd); BOOL FASTCALL IntIsChildWindow (HWND Parent, HWND Child); -BOOL FASTCALL -IntSetProp(PWINDOW_OBJECT Wnd, ATOM Atom, HANDLE Data); - -PPROPERTY FASTCALL -IntGetProp(PWINDOW_OBJECT WindowObject, ATOM Atom); - VOID FASTCALL IntUnlinkWindow(PWINDOW_OBJECT Wnd); diff --git a/reactos/subsys/win32k/include/winpos.h b/reactos/subsys/win32k/include/winpos.h index 0113b37c48b..f2428db1b14 100644 --- a/reactos/subsys/win32k/include/winpos.h +++ b/reactos/subsys/win32k/include/winpos.h @@ -20,7 +20,7 @@ WinPosSetWindowPos(HWND Wnd, HWND WndInsertAfter, INT x, INT y, INT cx, BOOLEAN FASTCALL WinPosShowWindow(HWND Wnd, INT Cmd); USHORT FASTCALL -WinPosWindowFromPoint(PWINDOW_OBJECT ScopeWin, BOOL SendProcHitTests, POINT *WinPoint, +WinPosWindowFromPoint(PWINDOW_OBJECT ScopeWin, BOOL SendHitTestMessage, POINT *WinPoint, PWINDOW_OBJECT* Window); VOID FASTCALL WinPosActivateOtherWindow(PWINDOW_OBJECT Window); diff --git a/reactos/subsys/win32k/misc/object.c b/reactos/subsys/win32k/misc/object.c index e5985b13097..7e5211670e6 100644 --- a/reactos/subsys/win32k/misc/object.c +++ b/reactos/subsys/win32k/misc/object.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: object.c,v 1.10 2004/02/24 13:27:03 weiden Exp $ +/* $Id: object.c,v 1.11 2004/02/26 22:23:54 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -31,7 +31,6 @@ #include <ddk/ntddk.h> #include <include/object.h> -#include <include/window.h> #define NDEBUG #include <debug.h> @@ -289,7 +288,6 @@ ObmDereferenceObject(PVOID ObjectBody) ObjectHeader = BODY_TO_HEADER(ObjectBody); ObjectHeader->RefCount--; - ObmpPerformRetentionChecks(ObjectHeader); } @@ -312,7 +310,6 @@ ObmReferenceObjectByPointer(PVOID ObjectBody, { return STATUS_INVALID_PARAMETER; } - ObjectHeader->RefCount++; return STATUS_SUCCESS; diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index 1a83f53e431..81785553a16 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.72 2004/02/24 15:56:52 weiden Exp $ +/* $Id: msgqueue.c,v 1.73 2004/02/26 22:23:54 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -255,7 +255,12 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, Msg == WM_RBUTTONDOWN || Msg == WM_XBUTTONDOWN) { - USHORT Hit = WinPosWindowFromPoint(ScopeWin, FALSE, &Message->Msg.pt, &Window); + *HitTest = WinPosWindowFromPoint(ScopeWin, !FromGlobalQueue, &Message->Msg.pt, &Window); + if(Window && FromGlobalQueue && (PsGetWin32Thread()->MessageQueue == Window->MessageQueue)) + { + *HitTest = IntSendMessage(Window->Self, WM_NCHITTEST, 0, + MAKELONG(Message->Msg.pt.x, Message->Msg.pt.y)); + } /* **Make sure that we have a window that is not already in focus */ @@ -263,9 +268,9 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, { if(Window->Self != IntGetFocusWindow()) { - SpareLParam = MAKELONG(Hit, Msg); + SpareLParam = MAKELONG(*HitTest, Msg); - if(Hit != (USHORT)HTTRANSPARENT) + if(*HitTest != (USHORT)HTTRANSPARENT) { Result = IntSendMessage(Window->Self, WM_MOUSEACTIVATE, (WPARAM)NtUserGetParent(Window->Self), (LPARAM)SpareLParam); @@ -297,7 +302,6 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, return(FALSE); } } - IntReleaseWindowObject(Window); } } @@ -309,20 +313,32 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, if(Msg == WM_MOUSEWHEEL) { *HitTest = HTCLIENT; + if(Window) + IntReleaseWindowObject(Window); Window = IntGetWindowObject(IntGetFocusWindow()); } else { - *HitTest = WinPosWindowFromPoint(ScopeWin, FALSE, &Message->Msg.pt, &Window); if(!Window) { - /* change the cursor on desktop background */ - IntLoadDefaultCursors(TRUE); + *HitTest = WinPosWindowFromPoint(ScopeWin, !FromGlobalQueue, &Message->Msg.pt, &Window); + if(Window && FromGlobalQueue && (PsGetWin32Thread()->MessageQueue == Window->MessageQueue)) + { + *HitTest = IntSendMessage(Window->Self, WM_NCHITTEST, 0, + MAKELONG(Message->Msg.pt.x, Message->Msg.pt.y)); + } + if(!Window) + { + /* change the cursor on desktop background */ + IntLoadDefaultCursors(TRUE); + } } } } else { + if(Window) + IntReleaseWindowObject(Window); Window = IntGetWindowObject(CaptureWin); *HitTest = HTCLIENT; } diff --git a/reactos/subsys/win32k/ntuser/vis.c b/reactos/subsys/win32k/ntuser/vis.c index 9335da8c4e8..402264cb284 100644 --- a/reactos/subsys/win32k/ntuser/vis.c +++ b/reactos/subsys/win32k/ntuser/vis.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: vis.c,v 1.20 2004/02/24 01:30:57 weiden Exp $ + * $Id: vis.c,v 1.21 2004/02/26 22:23:54 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -144,12 +144,11 @@ VIS_WindowLayoutChanged( NtGdiOffsetRgn(Temp, Window->WindowRect.left - Parent->ClientRect.left, Window->WindowRect.top - Parent->ClientRect.top); - } - IntRedrawWindow(Parent, NULL, Temp, - RDW_FRAME | RDW_ERASE | RDW_INVALIDATE | - RDW_ALLCHILDREN); - if(Parent) + IntRedrawWindow(Parent, NULL, Temp, + RDW_FRAME | RDW_ERASE | RDW_INVALIDATE | + RDW_ALLCHILDREN); IntReleaseWindowObject(Parent); + } NtGdiDeleteObject(Temp); } diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 6bad046cb90..8bf3d91f4b8 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.193 2004/02/24 15:56:52 weiden Exp $ +/* $Id: window.c,v 1.194 2004/02/26 22:23:54 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -289,11 +289,25 @@ static LRESULT IntDestroyWindow(PWINDOW_OBJECT Window, HWND *ChildHandle; PWINDOW_OBJECT Child; PMENU_OBJECT Menu; + BOOL BelongsToThreadData; - if (! IntWndBelongsToThread(Window, ThreadData)) - { - return 0; - } + ASSERT(Window); + + IntLockThreadWindows(Window->OwnerThread->Win32Thread); + if(Window->Status & WINDOWSTATUS_DESTROYING) + { + IntUnLockThreadWindows(Window->OwnerThread->Win32Thread); + DPRINT("Tried to call IntDestroyWindow() twice\n"); + return 0; + } + Window->Status |= WINDOWSTATUS_DESTROYING; + /* remove the window already at this point from the thread window list so we + don't get into trouble when destroying the thread windows while we're still + in IntDestroyWindow() */ + RemoveEntryList(&Window->ThreadListEntry); + IntUnLockThreadWindows(Window->OwnerThread->Win32Thread); + + BelongsToThreadData = IntWndBelongsToThread(Window, ThreadData); if(SendMessages) { @@ -309,15 +323,13 @@ static LRESULT IntDestroyWindow(PWINDOW_OBJECT Window, { if ((Child = IntGetWindowObject(*ChildHandle))) { - if(IntWndBelongsToThread(Child, ThreadData)) + if(!IntWndBelongsToThread(Child, ThreadData)) { - IntDestroyWindow(Child, ProcessData, ThreadData, SendMessages); + /* send WM_DESTROY messages to windows not belonging to the same thread */ + IntSendDestroyMsg(Child->Self); } else - { - IntSendDestroyMsg(Child->Self); - IntDestroyWindow(Child, ProcessData, Child->OwnerThread->Win32Thread, FALSE); - } + IntDestroyWindow(Child, ProcessData, ThreadData, SendMessages); IntReleaseWindowObject(Child); } } @@ -329,7 +341,7 @@ static LRESULT IntDestroyWindow(PWINDOW_OBJECT Window, /* * Clear the update region to make sure no WM_PAINT messages will be * generated for this window while processing the WM_NCDESTROY. - */ + */ IntRedrawWindow(Window, NULL, 0, RDW_VALIDATE | RDW_NOFRAME | RDW_NOERASE | RDW_NOINTERNALPAINT | RDW_NOCHILDREN); @@ -337,7 +349,8 @@ static LRESULT IntDestroyWindow(PWINDOW_OBJECT Window, /* * Send the WM_NCDESTROY to the window being destroyed. */ - IntSendMessage(Window->Self, WM_NCDESTROY, 0, 0); + if(BelongsToThreadData) + IntSendMessage(Window->Self, WM_NCDESTROY, 0, 0); } /* reset shell window handles */ @@ -349,7 +362,7 @@ static LRESULT IntDestroyWindow(PWINDOW_OBJECT Window, if (Window->Self == ProcessData->WindowStation->ShellListView) ProcessData->WindowStation->ShellListView = NULL; } - + /* Unregister hot keys */ UnregisterWindowHotKeys (Window); @@ -389,17 +402,22 @@ static LRESULT IntDestroyWindow(PWINDOW_OBJECT Window, #endif IntUnlinkWindow(Window); - - IntLockThreadWindows(ThreadData); - RemoveEntryList(&Window->ThreadListEntry); - IntUnLockThreadWindows(ThreadData); + + IntReferenceWindowObject(Window); + ObmCloseHandle(ProcessData->WindowStation->HandleTable, Window->Self); IntDestroyScrollBar(Window, SB_VERT); IntDestroyScrollBar(Window, SB_HORZ); + IntLockThreadWindows(Window->OwnerThread->Win32Thread); + Window->Status |= WINDOWSTATUS_DESTROYED; + /* don't remove the WINDOWSTATUS_DESTROYING bit */ + IntUnLockThreadWindows(Window->OwnerThread->Win32Thread); + ObmDereferenceObject(Window->Class); Window->Class = NULL; - ObmCloseHandle(ProcessData->WindowStation->HandleTable, Window->Self); + + IntReleaseWindowObject(Window); return 0; } @@ -475,30 +493,57 @@ IntSetMenu( VOID FASTCALL DestroyThreadWindows(struct _ETHREAD *Thread) { - PLIST_ENTRY LastHead; + PLIST_ENTRY Current; PW32PROCESS Win32Process; PW32THREAD Win32Thread; PWINDOW_OBJECT Window; + HWND *List, *phWnd; + ULONG Cnt = 0; Win32Thread = Thread->Win32Thread; Win32Process = Thread->ThreadsProcess->Win32Process; + IntLockThreadWindows(Win32Thread); - LastHead = NULL; - while (Win32Thread->WindowListHead.Flink != &(Win32Thread->WindowListHead) && - Win32Thread->WindowListHead.Flink != LastHead) + Current = Win32Thread->WindowListHead.Flink; + while (Current != &(Win32Thread->WindowListHead)) + { + Cnt++; + Current = Current->Flink; + } + + if(Cnt > 0) + { + List = ExAllocatePool(PagedPool, (Cnt + 1) * sizeof(HANDLE)); + if(!List) { - LastHead = Win32Thread->WindowListHead.Flink; - Window = CONTAINING_RECORD(Win32Thread->WindowListHead.Flink, WINDOW_OBJECT, ThreadListEntry); + DPRINT("Not enough memory to allocate window handle list\n"); IntUnLockThreadWindows(Win32Thread); - WinPosShowWindow(Window->Self, SW_HIDE); - IntDestroyWindow(Window, Win32Process, Win32Thread, FALSE); - IntLockThreadWindows(Win32Thread); + return; } - if (Win32Thread->WindowListHead.Flink == LastHead) + phWnd = List; + Current = Win32Thread->WindowListHead.Flink; + while (Current != &(Win32Thread->WindowListHead)) { - /* Window at head of list was not removed, should never happen, infinite loop */ - KEBUGCHECK(0); + Window = CONTAINING_RECORD(Current, WINDOW_OBJECT, ThreadListEntry); + *phWnd = Window->Self; + phWnd++; + Current = Current->Flink; } + IntUnLockThreadWindows(Win32Thread); + *phWnd = NULL; + + for(phWnd = List; *phWnd; phWnd++) + { + if((Window = IntGetWindowObject(*phWnd))) + { + IntDestroyWindow(Window, Win32Process, Win32Thread, FALSE); + IntReleaseWindowObject(Window); + } + } + ExFreePool(List); + return; + } + IntUnLockThreadWindows(Win32Thread); } @@ -655,11 +700,23 @@ IntGetSystemMenu(PWINDOW_OBJECT WindowObject, BOOL bRevert, BOOL RetMenu) BOOL FASTCALL IntIsChildWindow(HWND Parent, HWND Child) { - PWINDOW_OBJECT BaseWindow = IntGetWindowObject(Child); - PWINDOW_OBJECT Window = BaseWindow; + PWINDOW_OBJECT Window; + PWINDOW_OBJECT BaseWindow; - while (Window != NULL && Window->Style & WS_CHILD) + if(!(BaseWindow = IntGetWindowObject(Child))) { + return FALSE; + } + + Window = BaseWindow; + while (Window) + { + if(!(Window->Style & WS_CHILD)) + { + if(Window != BaseWindow) + IntReleaseWindowObject(Window); + break; + } if (Window->Self == Parent) { if(Window != BaseWindow) @@ -1512,8 +1569,15 @@ NtUserCreateWindowEx(DWORD dwExStyle, /* link the window into the parent's child list */ if ((dwStyle & (WS_CHILD|WS_MAXIMIZE)) == WS_CHILD) { + PWINDOW_OBJECT PrevSibling; + IntLockRelatives(ParentWindow); + if((PrevSibling = ParentWindow->LastChild)) + IntReferenceWindowObject(PrevSibling); + IntUnLockRelatives(ParentWindow); /* link window as bottom sibling */ - IntLinkWindow(WindowObject, ParentWindow, ParentWindow->LastChild /*prev sibling*/); + IntLinkWindow(WindowObject, ParentWindow, PrevSibling /*prev sibling*/); + if(PrevSibling) + IntReleaseWindowObject(PrevSibling); } else { @@ -1711,7 +1775,7 @@ NtUserDestroyWindow(HWND Wnd) { return TRUE; } - + /* Recursively destroy owned windows */ if (! isChild) { @@ -1734,11 +1798,19 @@ NtUserDestroyWindow(HWND Wnd) { continue; } + if(Child->Self == Wnd) + { + IntReleaseWindowObject(Child); + continue; + } + IntLockRelatives(Child); if (Child->Parent != Window->Self) { + IntUnLockRelatives(Child); IntReleaseWindowObject(Child); continue; } + IntUnLockRelatives(Child); if (IntWndBelongsToThread(Child, PsGetWin32Thread())) { IntReleaseWindowObject(Child); @@ -1746,10 +1818,12 @@ NtUserDestroyWindow(HWND Wnd) GotOne = TRUE; continue; } + IntLockRelatives(Child); if (Child->Owner != NULL) { Child->Owner = NULL; } + IntUnLockRelatives(Child); IntReleaseWindowObject(Child); } ExFreePool(Children); @@ -1760,7 +1834,7 @@ NtUserDestroyWindow(HWND Wnd) } } } - + if (!IntIsWindow(Wnd)) { return TRUE; diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index d0a541d2573..041b87de0e3 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.100 2004/02/24 15:56:53 weiden Exp $ +/* $Id: winpos.c,v 1.101 2004/02/26 22:23:55 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -82,7 +82,7 @@ IntGetClientOrigin(HWND hWnd, LPPOINT Point) { PWINDOW_OBJECT WindowObject; - WindowObject = IntGetWindowObject(hWnd); + WindowObject = IntGetWindowObject((hWnd ? hWnd : IntGetDesktopWindow())); if (WindowObject == NULL) { Point->x = Point->y = 0; @@ -102,8 +102,20 @@ NtUserGetClientOrigin(HWND hWnd, LPPOINT Point) POINT pt; NTSTATUS Status; + if(!Point) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return FALSE; + } + Ret = IntGetClientOrigin(hWnd, &pt); + if(!Ret) + { + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + return FALSE; + } + Status = MmCopyToCaller(Point, &pt, sizeof(POINT)); if(!NT_SUCCESS(Status)) { @@ -122,45 +134,48 @@ NtUserGetClientOrigin(HWND hWnd, LPPOINT Point) VOID FASTCALL WinPosActivateOtherWindow(PWINDOW_OBJECT Window) { - PWINDOW_OBJECT Child, Wnd = Window; - HWND *List, *phWnd; - + PWINDOW_OBJECT Wnd, Old; + 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(IntIsDesktopWindow(Wnd)) + + if((List = IntWinListChildren(Wnd))) { - IntReleaseWindowObject(Wnd); - IntSetFocusMessageQueue(NULL); - return; - } - if((List = IntWinListChildren(Window))) - { - for(phWnd = List; *phWnd; ++phWnd) + for(phWnd = List; *phWnd; phWnd++) { - if(*phWnd == Window->Self) + PWINDOW_OBJECT Child; + + if((*phWnd) == Window->Self) { continue; } - Child = IntGetWindowObject(*phWnd); - if(Child) + if((Child = IntGetWindowObject(*phWnd))) { if(IntSetForegroundWindow(Child)) { - IntReleaseWindowObject(Child); ExFreePool(List); + IntReleaseWindowObject(Wnd); + IntReleaseWindowObject(Child); return; } IntReleaseWindowObject(Child); @@ -169,6 +184,7 @@ WinPosActivateOtherWindow(PWINDOW_OBJECT Window) ExFreePool(List); } } + IntReleaseWindowObject(Wnd); } VOID STATIC FASTCALL @@ -1276,8 +1292,8 @@ WinPosShowWindow(HWND Wnd, INT Cmd) return(WasVisible); } -BOOL STATIC FASTCALL -WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, BOOL SendProcHitTests, POINT *Point, +VOID STATIC FASTCALL +WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, BOOL SendHitTestMessage, POINT *Point, PWINDOW_OBJECT* Window, USHORT *HitTest) { PWINDOW_OBJECT Current; @@ -1293,29 +1309,27 @@ WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, BOOL SendProcHitTests, POINT *Poin } if (Current->Style & WS_VISIBLE && - ((!(Current->Style & WS_DISABLED)) || - (Current->Style & (WS_CHILD | WS_POPUP)) != WS_CHILD) && - (Point->x >= Current->WindowRect.left && + (!(Current->Style & WS_DISABLED) || (Current->Style & (WS_CHILD | WS_POPUP)) != WS_CHILD) && + (Point->x >= Current->WindowRect.left && Point->x < Current->WindowRect.right && Point->y >= Current->WindowRect.top && Point->y < Current->WindowRect.bottom)) /* FIXME - check if Point is in window region */ { - if(*Window) - { - IntReleaseWindowObject(*Window); - } - *Window = Current; + if(*Window) + { + IntReleaseWindowObject(*Window); + } + *Window = Current; if(Current->Style & WS_DISABLED) { *HitTest = HTERROR; - ExFreePool(List); - return TRUE; + ExFreePool(List); + return; } - if((SendProcHitTests && - (Current->OwnerThread->ThreadsProcess == PsGetCurrentProcess())) || + if(SendHitTestMessage && (Current->MessageQueue == PsGetWin32Thread()->MessageQueue)) { *HitTest = IntSendMessage(Current->Self, WM_NCHITTEST, 0, @@ -1335,31 +1349,22 @@ WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, BOOL SendProcHitTests, POINT *Poin Point->y >= Current->ClientRect.top && Point->y < Current->ClientRect.bottom) { - USHORT ChildHitTest; - if(WinPosSearchChildren(Current, SendProcHitTests, Point, Window, &ChildHitTest)) - { - *HitTest = ChildHitTest; - ExFreePool(List); - return TRUE; - } + WinPosSearchChildren(Current, SendHitTestMessage, Point, Window, HitTest); + ExFreePool(List); + return; } ExFreePool(List); - return TRUE; + return; } IntReleaseWindowObject(Current); } ExFreePool(List); } - - if((*Window) == NULL) - HitTest = HTNOWHERE; - - return FALSE; } USHORT FASTCALL -WinPosWindowFromPoint(PWINDOW_OBJECT ScopeWin, BOOL SendProcHitTests, POINT *WinPoint, +WinPosWindowFromPoint(PWINDOW_OBJECT ScopeWin, BOOL SendHitTestMessage, POINT *WinPoint, PWINDOW_OBJECT* Window) { HWND DesktopWindowHandle; @@ -1382,19 +1387,19 @@ WinPosWindowFromPoint(PWINDOW_OBJECT ScopeWin, BOOL SendProcHitTests, POINT *Win /* Translate the point to the space of the scope window. */ DesktopWindowHandle = IntGetDesktopWindow(); - if((DesktopWindow = IntGetWindowObject(DesktopWindowHandle))) + if((DesktopWindowHandle != ScopeWin->Self) && + (DesktopWindow = IntGetWindowObject(DesktopWindowHandle))) { Point.x += ScopeWin->ClientRect.left - DesktopWindow->ClientRect.left; Point.y += ScopeWin->ClientRect.top - DesktopWindow->ClientRect.top; IntReleaseWindowObject(DesktopWindow); } - if(WinPosSearchChildren(ScopeWin, SendProcHitTests, &Point, Window, &HitTest)) - { - return HitTest; - } + HitTest = HTNOWHERE; + + WinPosSearchChildren(ScopeWin, SendHitTestMessage, &Point, Window, &HitTest); - return HTNOWHERE; + return ((*Window) ? HitTest : HTNOWHERE); } BOOL diff --git a/reactos/subsys/win32k/objects/cursoricon.c b/reactos/subsys/win32k/objects/cursoricon.c index 13823645022..1262bb846c2 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.48 2004/02/24 13:27:03 weiden Exp $ */ +/* $Id: cursoricon.c,v 1.49 2004/02/26 22:23:55 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -61,12 +61,6 @@ IntGetCurIconObject(PWINSTATION_OBJECT WinStaObject, HANDLE Handle) return Object; } -VOID FASTCALL -IntReleaseCurIconObject(PCURICON_OBJECT Object) -{ - ObmDereferenceObject(Object); -} - HBITMAP FASTCALL IntCopyBitmap(HBITMAP bmp) { From 326e51489112ac391fe637c58cc27b286ec0e9bf Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Thu, 26 Feb 2004 22:45:50 +0000 Subject: [PATCH 0218/1463] rebar control for cabinet windows svn path=/trunk/; revision=8419 --- .../system/explorer/shell/mainframe.cpp | 104 +++++++++++++++--- .../subsys/system/explorer/shell/mainframe.h | 2 + .../system/explorer/taskbar/desktopbar.cpp | 2 +- 3 files changed, 89 insertions(+), 19 deletions(-) diff --git a/reactos/subsys/system/explorer/shell/mainframe.cpp b/reactos/subsys/system/explorer/shell/mainframe.cpp index 36278bc2e6f..feae501b333 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.cpp +++ b/reactos/subsys/system/explorer/shell/mainframe.cpp @@ -82,8 +82,11 @@ MainFrame::MainFrame(HWND hwnd) {12, ID_STOP, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, }; - _htoolbar = CreateToolbarEx(hwnd, WS_CHILD|WS_VISIBLE, - IDW_TOOLBAR, 2, g_Globals._hInstance, IDB_TOOLBAR, toolbarBtns, + _htoolbar = CreateToolbarEx(hwnd, +#ifndef _NO_REBAR + CCS_NOPARENTALIGN|CCS_NORESIZE| +#endif + WS_CHILD|WS_VISIBLE, IDW_TOOLBAR, 2, g_Globals._hInstance, IDB_TOOLBAR, toolbarBtns, sizeof(toolbarBtns)/sizeof(TBBUTTON), 16, 15, 16, 15, sizeof(TBBUTTON)); CheckMenuItem(_menu_info._hMenuView, ID_VIEW_TOOL_BAR, MF_BYCOMMAND|MF_CHECKED); @@ -93,7 +96,11 @@ MainFrame::MainFrame(HWND hwnd) int btn = 1; PTSTR p; - _hdrivebar = CreateToolbarEx(hwnd, WS_CHILD|WS_VISIBLE|CCS_NOMOVEY|TBSTYLE_LIST, + _hdrivebar = CreateToolbarEx(hwnd, +#ifndef _NO_REBAR + CCS_NOPARENTALIGN|CCS_NORESIZE| +#endif + WS_CHILD|WS_VISIBLE|CCS_NOMOVEY|TBSTYLE_LIST, IDW_DRIVEBAR, 2, g_Globals._hInstance, IDB_DRIVEBAR, &drivebarBtn, 1, 16, 13, 16, 13, sizeof(TBBUTTON)); CheckMenuItem(_menu_info._hMenuView, ID_VIEW_DRIVE_BAR, MF_BYCOMMAND|MF_CHECKED); @@ -185,6 +192,47 @@ MainFrame::MainFrame(HWND hwnd) } + // create rebar window to manage toolbar and drivebar +#ifndef _NO_REBAR + _hwndrebar = CreateWindowEx(WS_EX_TOOLWINDOW, REBARCLASSNAME, NULL, + WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN| + RBS_VARHEIGHT|RBS_AUTOSIZE|RBS_DBLCLKTOGGLE| + CCS_NODIVIDER|CCS_NOPARENTALIGN, + 0, 0, 0, 0, _hwnd, 0, g_Globals._hInstance, 0); + + int btn_hgt = HIWORD(SendMessage(_htoolbar, TB_GETBUTTONSIZE, 0, 0)); + + REBARBANDINFO rbBand; + + rbBand.cbSize = sizeof(REBARBANDINFO); + rbBand.fMask = RBBIM_TEXT|RBBIM_STYLE|RBBIM_CHILD|RBBIM_CHILDSIZE|RBBIM_SIZE; +#ifndef RBBS_HIDETITLE // missing in MinGW headers as of 25.02.2004 +#define RBBS_HIDETITLE 0x400 +#endif + rbBand.fStyle = RBBS_CHILDEDGE|RBBS_GRIPPERALWAYS|RBBS_HIDETITLE; //|RBBS_BREAK + + rbBand.cxMinChild = 0; + rbBand.cyMinChild = 0; + rbBand.cyChild = 0; + rbBand.cyMaxChild = 0; + rbBand.cyIntegral = btn_hgt; + + rbBand.lpText = NULL;//TEXT("Toolbar"); + rbBand.hwndChild = _htoolbar; + rbBand.cxMinChild = 0; + rbBand.cyMinChild = btn_hgt + 4; + rbBand.cx = 280; + SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand); + + rbBand.lpText = NULL;//TEXT("Drivebar"); + rbBand.hwndChild = _hdrivebar; + rbBand.cxMinChild = 0; + rbBand.cyMinChild = btn_hgt + 4; + rbBand.cx = 400; + SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand); +#endif + + #ifdef _DEBUG // address & command bar WindowCanvas canvas(hwnd); @@ -342,6 +390,11 @@ LRESULT MainFrame::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) return FALSE;} + case WM_SHOWWINDOW: + if (wparam) // trigger child resizing after window creation - now we can succesfully call IsWindowVisible() + resize_frame_rect(ClientRect(_hwnd)); + goto def; + case WM_CLOSE: DestroyWindow(_hwnd); g_Globals._hMainWnd = 0; @@ -426,7 +479,7 @@ LRESULT MainFrame::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) SendMessage(_hstatusbar, SB_SETTEXT, 0, lparam); break; - default: + default: def: #ifndef _NO_MDI return DefFrameProc(_hwnd, _hmdiclient, nmsg, wparam, lparam); #else @@ -667,22 +720,37 @@ int MainFrame::Command(int id, int code) } +int MainFrame::Notify(int id, NMHDR* pnmh) +{ + if (pnmh->code == RBN_AUTOSIZE) + resize_frame_rect(ClientRect(_hwnd)); + + return 0; +} + + void MainFrame::resize_frame_rect(PRECT prect) { - if (IsWindowVisible(_htoolbar)) { - SendMessage(_htoolbar, WM_SIZE, 0, 0); - ClientRect rt(_htoolbar); - prect->top = rt.bottom+3; -// prect->bottom -= rt.bottom+3; - } + if (_hwndrebar) { + int height = ClientRect(_hwndrebar).bottom; + MoveWindow(_hwndrebar, prect->left, prect->top, prect->right-prect->left, height, TRUE); + prect->top += height; + } else { + if (IsWindowVisible(_htoolbar)) { + SendMessage(_htoolbar, WM_SIZE, 0, 0); + ClientRect rt(_htoolbar); + prect->top = rt.bottom+3; + // prect->bottom -= rt.bottom+3; + } - if (IsWindowVisible(_hdrivebar)) { - SendMessage(_hdrivebar, WM_SIZE, 0, 0); - ClientRect rt(_hdrivebar); - int new_top = --prect->top + rt.bottom+3; - MoveWindow(_hdrivebar, 0, prect->top, rt.right, new_top, TRUE); - prect->top = new_top; -// prect->bottom -= rt.bottom+2; + if (IsWindowVisible(_hdrivebar)) { + SendMessage(_hdrivebar, WM_SIZE, 0, 0); + ClientRect rt(_hdrivebar); + int new_top = --prect->top + rt.bottom+3; + MoveWindow(_hdrivebar, 0, prect->top, rt.right, new_top, TRUE); + prect->top = new_top; + // prect->bottom -= rt.bottom+2; + } } if (IsWindowVisible(_hstatusbar)) { @@ -704,7 +772,7 @@ void MainFrame::resize_frame_rect(PRECT prect) } #ifndef _NO_MDI - MoveWindow(_hmdiclient, prect->left-1,prect->top-1,prect->right-prect->left+2,prect->bottom-prect->top+1, TRUE); + MoveWindow(_hmdiclient, prect->left-1, prect->top-1, prect->right-prect->left+2, prect->bottom-prect->top+1, TRUE); #endif } diff --git a/reactos/subsys/system/explorer/shell/mainframe.h b/reactos/subsys/system/explorer/shell/mainframe.h index 3a58759aa79..f0b18b4bc8d 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.h +++ b/reactos/subsys/system/explorer/shell/mainframe.h @@ -54,6 +54,7 @@ protected: #endif WindowHandle _hstatusbar; + WindowHandle _hwndrebar; WindowHandle _htoolbar; WindowHandle _hdrivebar; WindowHandle _haddressedit; @@ -67,6 +68,7 @@ protected: protected: LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); int Command(int id, int code); + int Notify(int id, NMHDR* pnmh); void toggle_child(HWND hwnd, UINT cmd, HWND hchild); bool activate_drive_window(LPCTSTR path); diff --git a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp index 73f5c574b4a..c546c838493 100644 --- a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp @@ -124,7 +124,7 @@ LRESULT DesktopBar::Init(LPCREATESTRUCT pcs) rbBand.cyMinChild = 0; rbBand.cyChild = 0; rbBand.cyMaxChild = 0; - rbBand.cyIntegral = DESKTOPBARBAR_HEIGHT; + rbBand.cyIntegral = DESKTOPBARBAR_HEIGHT; //@@ OK? rbBand.lpText = TEXT("Quicklaunch"); rbBand.hwndChild = _hwndQuickLaunch; From 02708b901783a69f591b3e05ff1b5aa1cd490c6e Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Thu, 26 Feb 2004 22:52:05 +0000 Subject: [PATCH 0219/1463] minor fixes svn path=/trunk/; revision=8420 --- reactos/lib/user32/windows/window.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/reactos/lib/user32/windows/window.c b/reactos/lib/user32/windows/window.c index 18bb95fb406..00665eb8aac 100644 --- a/reactos/lib/user32/windows/window.c +++ b/reactos/lib/user32/windows/window.c @@ -1,4 +1,4 @@ -/* $Id: window.c,v 1.99 2004/02/22 23:40:58 gvg Exp $ +/* $Id: window.c,v 1.100 2004/02/26 22:52:05 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -1375,8 +1375,14 @@ MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints) LONG XMove, YMove; ULONG i; - NtUserGetClientOrigin(hWndFrom, &FromOffset); - NtUserGetClientOrigin(hWndTo, &ToOffset); + if(!NtUserGetClientOrigin(hWndFrom, &FromOffset)) + { + return 0; + } + if(!NtUserGetClientOrigin(hWndTo, &ToOffset)) + { + return 0; + } XMove = FromOffset.x - ToOffset.x; YMove = FromOffset.y - ToOffset.y; @@ -1395,7 +1401,7 @@ MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints) BOOL STDCALL ScreenToClient(HWND hWnd, LPPOINT lpPoint) { - return(MapWindowPoints(NULL, hWnd, lpPoint, 1)); + return(MapWindowPoints(NULL, hWnd, lpPoint, 1) != 0); } @@ -1405,7 +1411,7 @@ ScreenToClient(HWND hWnd, LPPOINT lpPoint) BOOL STDCALL ClientToScreen(HWND hWnd, LPPOINT lpPoint) { - return (MapWindowPoints( hWnd, NULL, lpPoint, 1 )); + return (MapWindowPoints( hWnd, NULL, lpPoint, 1 ) != 0); } From 49d24c174d60b706ed12d18af3b529c9f3453a24 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Fri, 27 Feb 2004 00:11:58 +0000 Subject: [PATCH 0220/1463] fixed missing window dereference svn path=/trunk/; revision=8421 --- reactos/subsys/win32k/ntuser/window.c | 96 +++++++++++++++------------ 1 file changed, 55 insertions(+), 41 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 8bf3d91f4b8..7fd3b184bb1 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.194 2004/02/26 22:23:54 weiden Exp $ +/* $Id: window.c,v 1.195 2004/02/27 00:11:58 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -496,8 +496,7 @@ DestroyThreadWindows(struct _ETHREAD *Thread) PLIST_ENTRY Current; PW32PROCESS Win32Process; PW32THREAD Win32Thread; - PWINDOW_OBJECT Window; - HWND *List, *phWnd; + PWINDOW_OBJECT *List, *pWnd; ULONG Cnt = 0; Win32Thread = Thread->Win32Thread; @@ -513,32 +512,29 @@ DestroyThreadWindows(struct _ETHREAD *Thread) if(Cnt > 0) { - List = ExAllocatePool(PagedPool, (Cnt + 1) * sizeof(HANDLE)); + List = ExAllocatePool(PagedPool, (Cnt + 1) * sizeof(PWINDOW_OBJECT)); if(!List) { DPRINT("Not enough memory to allocate window handle list\n"); IntUnLockThreadWindows(Win32Thread); return; } - phWnd = List; + pWnd = List; Current = Win32Thread->WindowListHead.Flink; while (Current != &(Win32Thread->WindowListHead)) { - Window = CONTAINING_RECORD(Current, WINDOW_OBJECT, ThreadListEntry); - *phWnd = Window->Self; - phWnd++; + *pWnd = CONTAINING_RECORD(Current, WINDOW_OBJECT, ThreadListEntry); + IntReferenceWindowObject(*pWnd); + pWnd++; Current = Current->Flink; } IntUnLockThreadWindows(Win32Thread); - *phWnd = NULL; + *pWnd = NULL; - for(phWnd = List; *phWnd; phWnd++) + for(pWnd = List; *pWnd; pWnd++) { - if((Window = IntGetWindowObject(*phWnd))) - { - IntDestroyWindow(Window, Win32Process, Win32Thread, FALSE); - IntReleaseWindowObject(Window); - } + IntDestroyWindow(*pWnd, Win32Process, Win32Thread, FALSE); + IntReleaseWindowObject(*pWnd); } ExFreePool(List); return; @@ -700,8 +696,7 @@ IntGetSystemMenu(PWINDOW_OBJECT WindowObject, BOOL bRevert, BOOL RetMenu) BOOL FASTCALL IntIsChildWindow(HWND Parent, HWND Child) { - PWINDOW_OBJECT Window; - PWINDOW_OBJECT BaseWindow; + PWINDOW_OBJECT BaseWindow, Window, Old; if(!(BaseWindow = IntGetWindowObject(Child))) { @@ -724,9 +719,10 @@ IntIsChildWindow(HWND Parent, HWND Child) IntReleaseWindowObject(BaseWindow); return(TRUE); } - if(Window != BaseWindow) - IntReleaseWindowObject(Window); + Old = Window; Window = IntGetParentObject(Window); + if(Old != BaseWindow) + IntReleaseWindowObject(Old); } IntReleaseWindowObject(BaseWindow); @@ -736,29 +732,47 @@ IntIsChildWindow(HWND Parent, HWND Child) BOOL FASTCALL IntIsWindowVisible(HWND hWnd) { - PWINDOW_OBJECT BaseWindow = IntGetWindowObject(hWnd); - PWINDOW_OBJECT Window = BaseWindow; - BOOLEAN Result = FALSE; + PWINDOW_OBJECT BaseWindow, Window, Old; - while (Window != NULL && Window->Style & WS_CHILD) + if(!(BaseWindow = IntGetWindowObject(hWnd))) { - if (!(Window->Style & WS_VISIBLE)) - { + return FALSE; + } + + Window = BaseWindow; + while(Window) + { + if(!(Window->Style & WS_CHILD)) + { + break; + } + if(!(Window->Style & WS_VISIBLE)) + { if(Window != BaseWindow) IntReleaseWindowObject(Window); - IntReleaseWindowObject(BaseWindow); - return(FALSE); - } + IntReleaseWindowObject(BaseWindow); + return FALSE; + } + Old = Window; + Window = IntGetParentObject(Window); + if(Old != BaseWindow) + IntReleaseWindowObject(Old); + } + + if(Window) + { + if(Window->Style & WS_VISIBLE) + { + if(Window != BaseWindow) + IntReleaseWindowObject(Window); + IntReleaseWindowObject(BaseWindow); + return TRUE; + } if(Window != BaseWindow) IntReleaseWindowObject(Window); - Window = IntGetParentObject(Window); - } - if (Window != NULL && Window->Style & WS_VISIBLE) - { - Result = TRUE; } IntReleaseWindowObject(BaseWindow); - return(Result); + return FALSE; } @@ -960,7 +974,7 @@ IntUnlinkWindow(PWINDOW_OBJECT Wnd) if (Wnd->PrevSibling) Wnd->PrevSibling->NextSibling = Wnd->NextSibling; else if (WndParent && WndParent->FirstChild == Wnd) WndParent->FirstChild = Wnd->NextSibling; - //else if (parent->first_unlinked == win) parent->first_unlinked = Wnd->NextSibling; + if(WndParent) { IntUnLockRelatives(WndParent); @@ -2129,20 +2143,20 @@ NtUserGetClientRect(HWND hWnd, LPRECT Rect) PWINDOW_OBJECT WindowObject; RECT SafeRect; - if (!(WindowObject = IntGetWindowObject(hWnd))) + if(!(WindowObject = IntGetWindowObject(hWnd))) { SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return FALSE; } IntGetClientRect(WindowObject, &SafeRect); - - if (! NT_SUCCESS(MmCopyToCaller(Rect, &SafeRect, sizeof(RECT)))) + IntReleaseWindowObject(WindowObject); + + if(!NT_SUCCESS(MmCopyToCaller(Rect, &SafeRect, sizeof(RECT)))) { - return(FALSE); + return FALSE; } - - return(TRUE); + return TRUE; } From f917dbbe8c2897f3cb22d01da68dd28c581a0c7e Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Fri, 27 Feb 2004 01:05:45 +0000 Subject: [PATCH 0221/1463] fixed missing window dereference svn path=/trunk/; revision=8422 --- reactos/subsys/win32k/ntuser/window.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 7fd3b184bb1..544e2fb074e 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.195 2004/02/27 00:11:58 weiden Exp $ +/* $Id: window.c,v 1.196 2004/02/27 01:05:45 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -281,9 +281,9 @@ static void IntSendDestroyMsg(HWND Wnd) * Destroy storage associated to a window. "Internals" p.358 */ static LRESULT IntDestroyWindow(PWINDOW_OBJECT Window, - PW32PROCESS ProcessData, - PW32THREAD ThreadData, - BOOLEAN SendMessages) + PW32PROCESS ProcessData, + PW32THREAD ThreadData, + BOOLEAN SendMessages) { HWND *Children; HWND *ChildHandle; @@ -1851,6 +1851,7 @@ NtUserDestroyWindow(HWND Wnd) if (!IntIsWindow(Wnd)) { + IntReleaseWindowObject(Window); return TRUE; } From a9ecd3580c591ce59e038bb02f43349f94e7f063 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 27 Feb 2004 05:50:56 +0000 Subject: [PATCH 0222/1463] - Fixed RtlNtStatusToDosErrorNoTeb. svn path=/trunk/; revision=8423 --- reactos/ntoskrnl/rtl/error.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/rtl/error.c b/reactos/ntoskrnl/rtl/error.c index 9bc78eae827..25c7024d978 100644 --- a/reactos/ntoskrnl/rtl/error.c +++ b/reactos/ntoskrnl/rtl/error.c @@ -1,4 +1,4 @@ -/* $Id: error.c,v 1.9 2003/07/11 01:23:15 royce Exp $ +/* $Id: error.c,v 1.10 2004/02/27 05:50:56 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -881,10 +881,10 @@ RtlNtStatusToDosErrorNoTeb(IN NTSTATUS Status) while (Table->Start) { - if (Status < (NTSTATUS) Table->Start) + if ((ULONG)Status < Table->Start) break; - if (Status < (NTSTATUS) Table->End) + if ((ULONG)Status < Table->End) { DWORD ret = Table->Table[Status - Table->Start]; if (!ret) From dc750f77e524660123792389b3acdad94e16a1f1 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Fri, 27 Feb 2004 10:01:49 +0000 Subject: [PATCH 0223/1463] fixed a few gdi leaks svn path=/trunk/; revision=8424 --- reactos/apps/tests/winhello/winhello.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/reactos/apps/tests/winhello/winhello.c b/reactos/apps/tests/winhello/winhello.c index 9f138811eba..e55df9d5446 100644 --- a/reactos/apps/tests/winhello/winhello.c +++ b/reactos/apps/tests/winhello/winhello.c @@ -484,7 +484,7 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) ); temp = _sntprintf ( text, sizeof(text)/sizeof(*text), _T("Horizontal: %d"), Scrollparameter.nPos ); TextOut(hDC,200,100,text,strlen(text)); - + ReleaseDC(hWnd, hDC); return 0; } @@ -560,7 +560,7 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) ); temp = _sntprintf ( text, sizeof(text)/sizeof(*text), _T("Vertical: %d"), Scrollparameter.nPos ); TextOut(hDC,400,100,text,strlen(text)); - + ReleaseDC(hWnd, hDC); return 0; } @@ -644,9 +644,6 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) case WM_PAINT: hDC = BeginPaint(hWnd, &ps); - EndPaint(hWnd, &ps); - //SelectObject(hDC, tf); - hDC = GetDC(hWnd); TextOut(hDC, 10, 10, "Hello World from ReactOS!", strlen("Hello World from ReactOS!")); TextOut(hDC, 10, 80, "Press Ctrl+C or Ctrl+Alt+F1 to test Hotkey support.", @@ -657,7 +654,6 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) sprintf(sir, "%lu,%lu,%lu,%lu ", wir.left, wir.top, wir.right, wir.bottom); TextOut(hDC, 10, 30, spr, 20); TextOut(hDC, 10, 50, sir, 20); - ReleaseDC ( hWnd, hDC ); /* Draw "Hello, World" in the middle of the upper * half of the window. */ From b1acedcbee3bef6c407350d32fc68d6b09224959 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Fri, 27 Feb 2004 10:08:21 +0000 Subject: [PATCH 0224/1463] don't lock the screen dc if it's NULL svn path=/trunk/; revision=8425 --- reactos/subsys/win32k/objects/cursoricon.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/objects/cursoricon.c b/reactos/subsys/win32k/objects/cursoricon.c index 1262bb846c2..6d8e4c0ad70 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.49 2004/02/26 22:23:55 weiden Exp $ */ +/* $Id: cursoricon.c,v 1.50 2004/02/27 10:08:21 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -107,6 +107,7 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, PSURFOBJ soMask = NULL, soColor = NULL; PXLATEOBJ XlateObj = NULL; RECTL PointerRect; + HDC Screen; CurInfo = &WinStaObject->SystemCursor; OldCursor = CurInfo->CurrentCursorObject; @@ -121,8 +122,12 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, } { + if(!(Screen = IntGetScreenDC())) + { + return (HCURSOR)0; + } /* FIXME use the desktop's HDC instead of using ScreenDeviceContext */ - PDC dc = DC_LockDc(IntGetScreenDC()); + PDC dc = DC_LockDc(Screen); if (!dc) { @@ -132,7 +137,7 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, SurfObj = (PSURFOBJ)AccessUserObject((ULONG) dc->Surface); SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) dc->Surface); DevInfo = dc->DevInfo; - DC_UnlockDc(IntGetScreenDC()); + DC_UnlockDc(Screen); } if (!NewCursor && (CurInfo->CurrentCursorObject || ForceChange)) From 8219d9801e79837c5796f046eb10258022241cb9 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Fri, 27 Feb 2004 17:35:42 +0000 Subject: [PATCH 0225/1463] - Initialize/delete the lock of a console. - Count the correct number of input events in CsrGetNumberOfConsoleInputEvents. svn path=/trunk/; revision=8426 --- reactos/subsys/csrss/win32csr/conio.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/reactos/subsys/csrss/win32csr/conio.c b/reactos/subsys/csrss/win32csr/conio.c index 55e8559ffb5..be38eb9b878 100644 --- a/reactos/subsys/csrss/win32csr/conio.c +++ b/reactos/subsys/csrss/win32csr/conio.c @@ -1,4 +1,4 @@ -/* $Id: conio.c,v 1.6 2004/02/25 23:33:42 hbirr Exp $ +/* $Id: conio.c,v 1.7 2004/02/27 17:35:42 hbirr Exp $ * * reactos/subsys/csrss/win32csr/conio.c * @@ -177,9 +177,11 @@ CsrInitConsole(PCSRSS_CONSOLE Console) Console->ActiveEvent = CreateEventW(&SecurityAttributes, FALSE, FALSE, NULL); if (NULL == Console->ActiveEvent) { + RtlFreeUnicodeString(&Console->Title); return STATUS_UNSUCCESSFUL; } Console->PrivateData = NULL; + RtlInitializeCriticalSection(&Console->Header.Lock); GuiMode = DtbgIsDesktopVisible(); if (! GuiMode) { @@ -195,6 +197,8 @@ CsrInitConsole(PCSRSS_CONSOLE Console) Status = GuiInitConsole(Console); if (! NT_SUCCESS(Status)) { + RtlFreeUnicodeString(&Console->Title); + RtlDeleteCriticalSection(&Console->Header.Lock); CloseHandle(Console->ActiveEvent); return Status; } @@ -203,12 +207,16 @@ CsrInitConsole(PCSRSS_CONSOLE Console) NewBuffer = HeapAlloc(Win32CsrApiHeap, 0, sizeof(CSRSS_SCREEN_BUFFER)); if (NULL == NewBuffer) { + RtlFreeUnicodeString(&Console->Title); + RtlDeleteCriticalSection(&Console->Header.Lock); CloseHandle(Console->ActiveEvent); return STATUS_INSUFFICIENT_RESOURCES; } Status = CsrInitConsoleScreenBuffer(Console, NewBuffer); if (! NT_SUCCESS(Status)) { + RtlFreeUnicodeString(&Console->Title); + RtlDeleteCriticalSection(&Console->Header.Lock); CloseHandle(Console->ActiveEvent); HeapFree(Win32CsrApiHeap, 0, NewBuffer); return Status; @@ -917,6 +925,7 @@ ConioDeleteConsole(Object_t *Object) ConioCleanupConsole(Console); CloseHandle(Console->ActiveEvent); + RtlDeleteCriticalSection(&Console->Header.Lock); RtlFreeUnicodeString(&Console->Title); HeapFree(Win32CsrApiHeap, 0, Console); } @@ -2521,6 +2530,7 @@ CSR_API(CsrGetNumberOfConsoleInputEvents) PCSRSS_CONSOLE Console; PLIST_ENTRY CurrentItem; DWORD NumEvents; + ConsoleInput *Input; DPRINT("CsrGetNumberOfConsoleInputEvents\n"); @@ -2533,18 +2543,18 @@ CSR_API(CsrGetNumberOfConsoleInputEvents) return Reply->Status = Status; } - CurrentItem = &Console->InputEvents; + CurrentItem = Console->InputEvents.Flink; NumEvents = 0; /* If there are any events ... */ - if (CurrentItem->Flink != CurrentItem) + while (CurrentItem != &Console->InputEvents) { - do + Input = CONTAINING_RECORD(CurrentItem, ConsoleInput, ListEntry); + CurrentItem = CurrentItem->Flink; + if (!Input->Fake) { - CurrentItem = CurrentItem->Flink; - ++NumEvents; - } - while (CurrentItem != &Console->InputEvents); + NumEvents++; + } } ConioUnlockConsole(Console); From b48c6953d03f3933c943ac0c127c6556d052bd41 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Fri, 27 Feb 2004 22:21:32 +0000 Subject: [PATCH 0226/1463] minor fix to SetParent() svn path=/trunk/; revision=8427 --- reactos/subsys/win32k/ntuser/window.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 544e2fb074e..af5f1e1cf07 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.196 2004/02/27 01:05:45 weiden Exp $ +/* $Id: window.c,v 1.197 2004/02/27 22:21:32 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -872,7 +872,10 @@ IntSetParent(PWINDOW_OBJECT Wnd, PWINDOW_OBJECT WndNewParent) HWND hWnd, hWndNewParent, hWndOldParent; BOOL WasVisible; BOOL MenuChanged; - + + ASSERT(Wnd); + ASSERT(WndNewParent); + hWnd = Wnd->Self; hWndNewParent = WndNewParent->Self; @@ -908,8 +911,6 @@ IntSetParent(PWINDOW_OBJECT Wnd, PWINDOW_OBJECT WndNewParent) } } - if(WndOldParent) - IntReleaseWindowObject(WndOldParent); /* * SetParent additionally needs to make hwnd the topmost window * in the x-order and send the expected WM_WINDOWPOSCHANGING and @@ -927,7 +928,19 @@ IntSetParent(PWINDOW_OBJECT Wnd, PWINDOW_OBJECT WndNewParent) * Validate that the old parent still exist, since it migth have been * destroyed during the last callbacks to user-mode */ - return !IntIsWindow(hWndOldParent) ? NULL : WndOldParent; + if(WndOldParent) + { + if(!IntIsWindow(WndOldParent->Self)) + { + IntReleaseWindowObject(WndOldParent); + return NULL; + } + + /* don't dereference the window object here, it must be done by the caller + of IntSetParent() */ + return WndOldParent; + } + return NULL; } BOOL FASTCALL @@ -2311,6 +2324,7 @@ NtUserSetParent(HWND hWndChild, HWND hWndNewParent) if (!(Wnd = IntGetWindowObject(hWndChild))) { + IntReleaseWindowObject(WndParent); SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return NULL; } @@ -2320,6 +2334,7 @@ NtUserSetParent(HWND hWndChild, HWND hWndNewParent) if (WndOldParent) { hWndOldParent = WndOldParent->Self; + IntReleaseWindowObject(WndOldParent); } IntReleaseWindowObject(Wnd); From 9187c6f65412c2bfdf0fd6291e36ed9c7929d066 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Fri, 27 Feb 2004 22:39:39 +0000 Subject: [PATCH 0227/1463] Removed and moved some internal headers for the WINE CxxFrameHandler Adapted the WINE implemenetation of __UnDName[Ex] Enabled all of the stubs needed for MFC. svn path=/trunk/; revision=8428 --- reactos/lib/msvcrt/README.txt | 2 +- reactos/lib/msvcrt/locale/locale.c | 12 + reactos/lib/msvcrt/msvcrt.def | 24 +- reactos/lib/msvcrt/stdio/vfscanf.c | 12 +- reactos/lib/msvcrt/wine/cppexcept.c | 2 +- reactos/lib/msvcrt/wine/{msvcrt => }/ctype.h | 0 reactos/lib/msvcrt/wine/data.c | 4 +- reactos/lib/msvcrt/wine/{msvcrt => }/eh.h | 0 reactos/lib/msvcrt/wine/main.c | 52 ++- reactos/lib/msvcrt/wine/msvcrt.h | 4 +- reactos/lib/msvcrt/wine/msvcrt/conio.h | 67 --- reactos/lib/msvcrt/wine/msvcrt/crtdbg.h | 107 ----- reactos/lib/msvcrt/wine/msvcrt/direct.h | 78 ---- reactos/lib/msvcrt/wine/msvcrt/dirent.h | 1 - reactos/lib/msvcrt/wine/msvcrt/dos.h | 49 --- reactos/lib/msvcrt/wine/msvcrt/errno.h | 133 ------ reactos/lib/msvcrt/wine/msvcrt/fcntl.h | 50 --- reactos/lib/msvcrt/wine/msvcrt/io.h | 197 --------- reactos/lib/msvcrt/wine/msvcrt/limits.h | 17 - reactos/lib/msvcrt/wine/msvcrt/locale.h | 103 ----- reactos/lib/msvcrt/wine/msvcrt/malloc.h | 90 ---- reactos/lib/msvcrt/wine/msvcrt/math.h | 12 - reactos/lib/msvcrt/wine/msvcrt/mbctype.h | 57 --- reactos/lib/msvcrt/wine/msvcrt/mbstring.h | 133 ------ reactos/lib/msvcrt/wine/msvcrt/search.h | 63 --- reactos/lib/msvcrt/wine/msvcrt/setjmp.h | 81 ---- reactos/lib/msvcrt/wine/msvcrt/share.h | 42 -- reactos/lib/msvcrt/wine/msvcrt/stddef.h | 74 ---- reactos/lib/msvcrt/wine/msvcrt/stdio.h | 283 ------------- reactos/lib/msvcrt/wine/msvcrt/sys/locking.h | 32 -- reactos/lib/msvcrt/wine/msvcrt/sys/stat.h | 160 ------- reactos/lib/msvcrt/wine/msvcrt/sys/timeb.h | 68 --- reactos/lib/msvcrt/wine/msvcrt/sys/types.h | 74 ---- reactos/lib/msvcrt/wine/msvcrt/sys/unistd.h | 1 - reactos/lib/msvcrt/wine/msvcrt/sys/utime.h | 75 ---- reactos/lib/msvcrt/wine/msvcrt/time.h | 119 ------ reactos/lib/msvcrt/wine/msvcrt/unistd.h | 2 - reactos/lib/msvcrt/wine/msvcrt/wchar.h | 395 ------------------ reactos/lib/msvcrt/wine/msvcrt/wctype.h | 101 ----- .../lib/msvcrt/wine/{msvcrt => }/process.h | 0 reactos/lib/msvcrt/wine/{msvcrt => }/stdlib.h | 0 reactos/lib/msvcrt/wine/{msvcrt => }/string.h | 0 reactos/lib/msvcrt/wine/thread.c | 2 +- 43 files changed, 71 insertions(+), 2707 deletions(-) rename reactos/lib/msvcrt/wine/{msvcrt => }/ctype.h (100%) rename reactos/lib/msvcrt/wine/{msvcrt => }/eh.h (100%) delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/conio.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/crtdbg.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/direct.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/dirent.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/dos.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/errno.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/fcntl.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/io.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/limits.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/locale.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/malloc.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/math.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/mbctype.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/mbstring.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/search.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/setjmp.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/share.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/stddef.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/stdio.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/sys/locking.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/sys/stat.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/sys/timeb.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/sys/types.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/sys/unistd.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/sys/utime.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/time.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/unistd.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/wchar.h delete mode 100644 reactos/lib/msvcrt/wine/msvcrt/wctype.h rename reactos/lib/msvcrt/wine/{msvcrt => }/process.h (100%) rename reactos/lib/msvcrt/wine/{msvcrt => }/stdlib.h (100%) rename reactos/lib/msvcrt/wine/{msvcrt => }/string.h (100%) diff --git a/reactos/lib/msvcrt/README.txt b/reactos/lib/msvcrt/README.txt index 231da987d84..eabb82b7ef0 100644 --- a/reactos/lib/msvcrt/README.txt +++ b/reactos/lib/msvcrt/README.txt @@ -15,5 +15,5 @@ Convert all C++ style comments to C style comments. ???? WINE Port Notes: -Remove the internal headers in msvcrt/wine/msvcrt +More cleanup Disable of remove duplicate code. (When in doubt check the def) diff --git a/reactos/lib/msvcrt/locale/locale.c b/reactos/lib/msvcrt/locale/locale.c index 3a92887f24d..e4b6cf60be2 100644 --- a/reactos/lib/msvcrt/locale/locale.c +++ b/reactos/lib/msvcrt/locale/locale.c @@ -164,3 +164,15 @@ void _setmbcp(int cp) DPRINT1("_setmbcp - stub\n"); return; } + + +/********************************************************************* + * __lc_collate_cp (MSVCRT.@) + * + * @unimplemented + */ +void __lc_collate_cp(int cp) +{ +DPRINT1("__lc_collate_cp - stub\n"); +return; +} diff --git a/reactos/lib/msvcrt/msvcrt.def b/reactos/lib/msvcrt/msvcrt.def index 74b7b691f57..79d36d8f0be 100644 --- a/reactos/lib/msvcrt/msvcrt.def +++ b/reactos/lib/msvcrt/msvcrt.def @@ -1,4 +1,4 @@ -; $Id: msvcrt.def,v 1.30 2004/02/24 15:42:06 vizzini Exp $ +; $Id: msvcrt.def,v 1.31 2004/02/27 22:39:37 sedwards Exp $ ; ; ReactOS MSVCRT Compatibility Library ; @@ -86,11 +86,11 @@ _CItan _CItanh _CxxThrowException _EH_prolog -;_Getdays -;_Getmonths -;_Gettnames +_Getdays +_Getmonths +_Gettnames _HUGE DATA -;_Strftime +_Strftime _XcptFilter ;__CxxCallUnwindDtor __CxxDetectRethrow @@ -108,9 +108,9 @@ __RTtypeid=MSVCRT___RTtypeid __argc DATA __argv DATA ;__badioinfo -;__crtCompareStringA +__crtCompareStringA ;=NTDLL.RtlCompareString ;__crtGetLocaleInfoW -;__crtLCMapStringA +__crtLCMapStringA __dllonexit __doserrno __fpecode @@ -119,9 +119,9 @@ __initenv DATA __isascii __iscsym __iscsymf -;__lc_codepage -;__lc_collate_cp -;__lc_handle +__lc_codepage +__lc_collate_cp +__lc_handle ;__lconv_init __mb_cur_max DATA __p___argc @@ -156,14 +156,14 @@ __p__winver __pioinfo ;__pxcptinfoptrs __set_app_type -;__setlc_active +__setlc_active __setusermatherr __threadhandle __threadid __toascii __unDName ;__unDNameEx -;__unguarded_readlc_active +__unguarded_readlc_active ;__wargv __wgetmainargs ;__winitenv diff --git a/reactos/lib/msvcrt/stdio/vfscanf.c b/reactos/lib/msvcrt/stdio/vfscanf.c index 488f00ae100..8bd49b7d001 100644 --- a/reactos/lib/msvcrt/stdio/vfscanf.c +++ b/reactos/lib/msvcrt/stdio/vfscanf.c @@ -16,9 +16,8 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -//#include <stdarg.h> -#include <msvcrt/stdarg.h> // robd -#include <msvcrt/crttypes.h> // robd +#include <msvcrt/stdarg.h> +#include <msvcrt/crttypes.h> #include <msvcrt/errno.h> #include <limits.h> @@ -29,10 +28,13 @@ #include <msvcrt/wchar.h> #include <msvcrt/malloc.h> #include <msvcrt/mbstring.h> -#ifndef __USE_W32API +#include <msvcrt/internal/stdio.h> + +#ifdef __USE_W32API +int __set_errno(int err); +#else #include <msvcrt/internal/file.h> #endif -#include <msvcrt/internal/stdio.h> /* The internal entry points for `strtoX' take an extra flag argument saying whether or not to parse locale-dependent number grouping. */ diff --git a/reactos/lib/msvcrt/wine/cppexcept.c b/reactos/lib/msvcrt/wine/cppexcept.c index 3e9f759b8e3..3fa97148f3b 100644 --- a/reactos/lib/msvcrt/wine/cppexcept.c +++ b/reactos/lib/msvcrt/wine/cppexcept.c @@ -303,7 +303,7 @@ inline static void *call_catch_block( PEXCEPTION_RECORD rec, cxx_exception_frame /* setup an exception block for nested exceptions */ //nested_frame.frame.Handler = catch_function_nested_handler; - nested_frame.frame.handler = catch_function_nested_handler; //ros + nested_frame.frame.handler = catch_function_nested_handler; nested_frame.prev_rec = thread_data->exc_record; nested_frame.cxx_frame = frame; nested_frame.descr = descr; diff --git a/reactos/lib/msvcrt/wine/msvcrt/ctype.h b/reactos/lib/msvcrt/wine/ctype.h similarity index 100% rename from reactos/lib/msvcrt/wine/msvcrt/ctype.h rename to reactos/lib/msvcrt/wine/ctype.h diff --git a/reactos/lib/msvcrt/wine/data.c b/reactos/lib/msvcrt/wine/data.c index 313b07bd45c..676c8e88cd2 100644 --- a/reactos/lib/msvcrt/wine/data.c +++ b/reactos/lib/msvcrt/wine/data.c @@ -24,8 +24,8 @@ #include <math.h> #include "msvcrt.h" -#include "msvcrt/stdlib.h" -#include "msvcrt/string.h" +#include "stdlib.h" +#include "string.h" //#include "wine/library.h" #include "wine/unicode.h" diff --git a/reactos/lib/msvcrt/wine/msvcrt/eh.h b/reactos/lib/msvcrt/wine/eh.h similarity index 100% rename from reactos/lib/msvcrt/wine/msvcrt/eh.h rename to reactos/lib/msvcrt/wine/eh.h diff --git a/reactos/lib/msvcrt/wine/main.c b/reactos/lib/msvcrt/wine/main.c index c29f9158e9c..528b95963d4 100644 --- a/reactos/lib/msvcrt/wine/main.c +++ b/reactos/lib/msvcrt/wine/main.c @@ -54,6 +54,11 @@ static inline BOOL msvcrt_init_tls(void); static inline BOOL msvcrt_free_tls(void); //const char* msvcrt_get_reason(DWORD reason) WINE_UNUSED; +typedef void* (*MSVCRT_malloc_func)(MSVCRT_size_t); + +char* MSVCRT___unDName(char *,const char*,int,MSVCRT_malloc_func,MSVCRT_free_func,unsigned short int); +char* MSVCRT___unDNameEx(char *,const char*,int,MSVCRT_malloc_func,MSVCRT_free_func,void *,unsigned short int); + #if 0 /* __REACTOS__ */ /********************************************************************* @@ -148,58 +153,65 @@ void MSVCRT_I10_OUTPUT(void) } /********************************************************************* - * __unDName (MSVCRT.@) + * __unDNameEx (MSVCRT.@) * * Demangle a C++ identifier. * * PARAMS - * unknown [I] Not yet determined + * OutStr [O] If not NULL, the place to put the demangled string * mangled [I] Mangled name of the function - * unknown2 [I] Not yet determined + * OutStrLen[I] Length of OutStr * memget [I] Function to allocate memory with * memfree [I] Function to free memory with + * unknown [?] Unknown, possibly a call back * flags [I] Flags determining demangled format * * RETURNS * Success: A string pointing to the unmangled name, allocated with memget. * Failure: NULL. */ -char* MSVCRT___unDName(int unknown, const char* mangled, int unknown2, +char* MSVCRT___unDNameEx(char * OutStr, const char* mangled, int OutStrLen, MSVCRT_malloc_func memget, MSVCRT_free_func memfree, - unsigned int flags) + void * unknown, + unsigned short int flags) { - char* ret; - - FIXME("(%d,%s,%d,%p,%p,%x) stub!\n", unknown, mangled, unknown2, memget, memfree, flags); + FIXME("(%p,%s,%d,%p,%p,%p,%x) stub!\n", + OutStr, mangled, OutStrLen, memget, memfree, unknown, flags); /* FIXME: The code in tools/winebuild/msmangle.c is pretty complete and * could be used here. */ /* Experimentation reveals the following flag meanings when set: - * 0x0001 - Dont show __ in calling convention - * 0x0002 - Dont show calling convention at all - * 0x0004 - Dont show function/method return value + * 0x0001 - Don't show __ in calling convention + * 0x0002 - Don't show calling convention at all + * 0x0004 - Don't show function/method return value * 0x0010 - Same as 0x1 - * 0x0080 - Dont show access specifier (public/protected/private) - * 0x0200 - Dont show static specifier + * 0x0080 - Don't show access specifier (public/protected/private) + * 0x0200 - Don't show static specifier * 0x0800 - Unknown, passed by type_info::name() * 0x1000 - Only report the variable/class name * 0x2000 - Unknown, passed by type_info::name() */ /* Duplicate the mangled name; for comparisons it doesn't matter anyway */ - ret = memget(strlen(mangled) + 1); - strcpy(ret, mangled); - return ret; + if( OutStr == NULL) { + OutStrLen = strlen(mangled) + 1; + OutStr = memget( OutStrLen); + } + strncpy( OutStr, mangled, OutStrLen); + return OutStr; } /********************************************************************* - * __unDNameEx (MSVCRT.@) - * Function not really understood but needed to make the DLL work + * __unDName (MSVCRT.@) */ -char* MSVCRT___unDNameEx(void) +char* MSVCRT___unDName(char * OutStr, const char* mangled, int OutStrLen, + MSVCRT_malloc_func memget, + MSVCRT_free_func memfree, + unsigned short int flags) { - return NULL; + return MSVCRT___unDNameEx( OutStr, mangled, OutStrLen, memget, memfree, + NULL, flags); } diff --git a/reactos/lib/msvcrt/wine/msvcrt.h b/reactos/lib/msvcrt/wine/msvcrt.h index dd1f877b07b..d6ae272a5d9 100644 --- a/reactos/lib/msvcrt/wine/msvcrt.h +++ b/reactos/lib/msvcrt/wine/msvcrt.h @@ -29,7 +29,7 @@ #include "winnls.h" #include "msvcrt/string.h" -#include "msvcrt/eh.h" +#include "eh.h" /* TLS data */ extern DWORD MSVCRT_tls_index; @@ -72,7 +72,9 @@ int MSVCRT__set_new_mode(int mode); void* MSVCRT_operator_new(unsigned long size); void MSVCRT_operator_delete(void*); +#ifndef __REACTOS__ typedef void* (*MSVCRT_malloc_func)(MSVCRT_size_t); +#endif typedef void (*MSVCRT_free_func)(void*); #ifndef __REACTOS__ extern char* MSVCRT___unDName(int,const char*,int,MSVCRT_malloc_func,MSVCRT_free_func,unsigned int); diff --git a/reactos/lib/msvcrt/wine/msvcrt/conio.h b/reactos/lib/msvcrt/wine/msvcrt/conio.h deleted file mode 100644 index 086659f244b..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/conio.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Console I/O definitions - * - * Derived from the mingw header written by Colin Peters. - * Modified for Wine use by Jon Griffiths and Francois Gouget. - * This file is in the public domain. - */ -#ifndef __WINE_CONIO_H -#define __WINE_CONIO_H -#ifndef __WINE_USE_MSVCRT -#define __WINE_USE_MSVCRT -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -char* _cgets(char*); -int _cprintf(const char*,...); -int _cputs(const char*); -int _cscanf(const char*,...); -int _getch(void); -int _getche(void); -int _kbhit(void); -int _putch(int); -int _ungetch(int); - -#ifdef _M_IX86 -int _inp(unsigned short); -unsigned long _inpd(unsigned short); -unsigned short _inpw(unsigned short); -int _outp(unsigned short, int); -unsigned long _outpd(unsigned short, unsigned long); -unsigned short _outpw(unsigned short, unsigned short); -#endif - -#ifdef __cplusplus -} -#endif - - -#ifndef USE_MSVCRT_PREFIX -static inline char* cgets(char* str) { return _cgets(str); } -static inline int cputs(const char* str) { return _cputs(str); } -static inline int getch(void) { return _getch(); } -static inline int getche(void) { return _getche(); } -static inline int kbhit(void) { return _kbhit(); } -static inline int putch(int c) { return _putch(c); } -static inline int ungetch(int c) { return _ungetch(c); } -#ifdef _M_IX86 -static inline int inp(unsigned short i) { return _inp(i); } -static inline unsigned short inpw(unsigned short i) { return _inpw(i); } -static inline int outp(unsigned short i, int j) { return _outp(i, j); } -static inline unsigned short outpw(unsigned short i, unsigned short j) { return _outpw(i, j); } -#endif - -#ifdef __GNUC__ -extern int cprintf(const char*,...) __attribute__((alias("_cprintf"),format(printf,1,2))); -extern int cscanf(const char*,...) __attribute__((alias("_cscanf"),format(scanf,1,2))); -#else -#define cprintf _cprintf -#define cscanf _cscanf -#endif /* __GNUC__ */ - -#endif /* USE_MSVCRT_PREFIX */ - -#endif /* __WINE_CONIO_H */ diff --git a/reactos/lib/msvcrt/wine/msvcrt/crtdbg.h b/reactos/lib/msvcrt/wine/msvcrt/crtdbg.h deleted file mode 100644 index d8320832276..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/crtdbg.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Debug API - * - * Copyright 2001 Francois Gouget. - * - * 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_CRTDBG_H_ -#define __WINE_CRTDBG_H_ -#ifndef __WINE_USE_MSVCRT -#define __WINE_USE_MSVCRT -#endif - -/* The debug API is not implemented in Winelib. - * Redirect everything to the regular APIs. - */ - -#define _CRT_WARN 0 -#define _CRT_ERROR 1 -#define _CRT_ASSERT 2 -#define _CRT_ERRCNT 3 - -#define _FREE_BLOCK 0 -#define _NORMAL_BLOCK 1 -#define _CRT_BLOCK 2 -#define _IGNORE_BLOCK 3 -#define _CLIENT_BLOCK 4 -#define _MAX_BLOCKS 5 - - -typedef struct _CrtMemState -{ - struct _CrtMemBlockHeader* pBlockHeader; - unsigned long lCounts[_MAX_BLOCKS]; - unsigned long lSizes[_MAX_BLOCKS]; - unsigned long lHighWaterCount; - unsigned long lTotalCount; -} _CrtMemState; - - -#ifndef _DEBUG - -#define _ASSERT(expr) ((void)0) -#define _ASSERTE(expr) ((void)0) -#define _CrtDbgBreak() ((void)0) - -#else /* _DEBUG */ - -#include <assert.h> -#define _ASSERT(expr) assert(expr) -#define _ASSERTE(expr) assert(expr) -#if defined(__GNUC__) && defined(__i386__) -#define _CrtDbgBreak() __asm__ ("\tint $0x3\n") -#else -#define _CrtDbgBreak() ((void)0) -#endif - -#endif /* _DEBUG */ - -#define _CrtCheckMemory() ((int)1) -#define _CrtDbgReport(...) ((int)0) -#define _CrtDoForAllClientObjects(f,c) ((void)0) -#define _CrtDumpMemoryLeaks() ((int)0) -#define _CrtIsMemoryBlock(p,s,r,f,l) ((int)1) -#define _CrtIsValidHeapPointer(p) ((int)1) -#define _CrtIsValidPointer(p,s,a) ((int)1) -#define _CrtMemCheckpoint(s) ((void)0) -#define _CrtMemDifference(s1,s2,s3) ((int)0) -#define _CrtMemDumpAllObjectsSince(s) ((void)0) -#define _CrtMemDumpStatistics(s) ((void)0) -#define _CrtSetAllocHook(f) ((void)0) -#define _CrtSetBreakAlloc(a) ((long)0) -#define _CrtSetDbgFlag(f) ((int)0) -#define _CrtSetDumpClient(f) ((void)0) -#define _CrtSetReportMode(t,m) ((int)0) - -#define _RPT0(t,m) -#define _RPT1(t,m,p1) -#define _RPT2(t,m,p1,p2) -#define _RPT3(t,m,p1,p2,p3) -#define _RPT4(t,m,p1,p2,p3,p4) -#define _RPTF0(t,m) -#define _RPTF1(t,m,p1) -#define _RPTF2(t,m,p1,p2) -#define _RPTF3(t,m,p1,p2,p3) -#define _RPTF4(t,m,p1,p2,p3,p4) - - -#define _malloc_dbg(s,t,f,l) malloc(s) -#define _calloc_dbg(c,s,t,f,l) calloc(c,s) -#define _expand_dbg(p,s,t,f,l) _expand(p,s) -#define _free_dbg(p,t) free(p) -#define _realloc_dbg(p,s,t,f,l) realloc(p,s) - -#endif /* __WINE_CRTDBG_H */ diff --git a/reactos/lib/msvcrt/wine/msvcrt/direct.h b/reactos/lib/msvcrt/wine/msvcrt/direct.h deleted file mode 100644 index d266fe4320a..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/direct.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Path and directory definitions - * - * Derived from the mingw header written by Colin Peters. - * Modified for Wine use by Jon Griffiths and Francois Gouget. - * This file is in the public domain. - */ -#ifndef __WINE_DIRECT_H -#define __WINE_DIRECT_H -#ifndef __WINE_USE_MSVCRT -#define __WINE_USE_MSVCRT -#endif - -#ifndef MSVCRT -# ifdef USE_MSVCRT_PREFIX -# define MSVCRT(x) MSVCRT_##x -# else -# define MSVCRT(x) x -# endif -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef MSVCRT_WCHAR_T_DEFINED -#define MSVCRT_WCHAR_T_DEFINED -#ifndef __cplusplus -typedef unsigned short MSVCRT(wchar_t); -#endif -#endif - -#ifndef MSVCRT_SIZE_T_DEFINED -typedef unsigned int MSVCRT(size_t); -#define MSVCRT_SIZE_T_DEFINED -#endif - -#ifndef MSVCRT_DISKFREE_T_DEFINED -#define MSVCRT_DISKFREE_T_DEFINED -struct _diskfree_t { - unsigned int total_clusters; - unsigned int avail_clusters; - unsigned int sectors_per_cluster; - unsigned int bytes_per_sector; -}; -#endif /* MSVCRT_DISKFREE_T_DEFINED */ - -int _chdir(const char*); -int _chdrive(int); -char* _getcwd(char*,int); -char* _getdcwd(int,char*,int); -int _getdrive(void); -unsigned long _getdrives(void); -int _mkdir(const char*); -int _rmdir(const char*); - -#ifndef MSVCRT_WDIRECT_DEFINED -#define MSVCRT_WDIRECT_DEFINED -int _wchdir(const MSVCRT(wchar_t)*); -MSVCRT(wchar_t)* _wgetcwd(MSVCRT(wchar_t)*,int); -MSVCRT(wchar_t)* _wgetdcwd(int,MSVCRT(wchar_t)*,int); -int _wmkdir(const MSVCRT(wchar_t)*); -int _wrmdir(const MSVCRT(wchar_t)*); -#endif /* MSVCRT_WDIRECT_DEFINED */ - -#ifdef __cplusplus -} -#endif - - -#ifndef USE_MSVCRT_PREFIX -static inline int chdir(const char* newdir) { return _chdir(newdir); } -static inline char* getcwd(char * buf, int size) { return _getcwd(buf, size); } -static inline int mkdir(const char* newdir) { return _mkdir(newdir); } -static inline int rmdir(const char* dir) { return _rmdir(dir); } -#endif /* USE_MSVCRT_PREFIX */ - -#endif /* __WINE_DIRECT_H */ diff --git a/reactos/lib/msvcrt/wine/msvcrt/dirent.h b/reactos/lib/msvcrt/wine/msvcrt/dirent.h deleted file mode 100644 index 5e0428005ce..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/dirent.h +++ /dev/null @@ -1 +0,0 @@ -#include <direct.h> diff --git a/reactos/lib/msvcrt/wine/msvcrt/dos.h b/reactos/lib/msvcrt/wine/msvcrt/dos.h deleted file mode 100644 index 4664ae393a1..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/dos.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * DOS definitions - * - * Derived from the mingw header written by Colin Peters. - * Modified for Wine use by Jon Griffiths and Francois Gouget. - * This file is in the public domain. - */ -#ifndef __WINE_DOS_H -#define __WINE_DOS_H -#ifndef __WINE_USE_MSVCRT -#define __WINE_USE_MSVCRT -#endif - -/* The following are also defined in io.h */ -#define _A_NORMAL 0x00000000 -#define _A_RDONLY 0x00000001 -#define _A_HIDDEN 0x00000002 -#define _A_SYSTEM 0x00000004 -#define _A_VOLID 0x00000008 -#define _A_SUBDIR 0x00000010 -#define _A_ARCH 0x00000020 - -#ifndef MSVCRT_DISKFREE_T_DEFINED -#define MSVCRT_DISKFREE_T_DEFINED -struct _diskfree_t { - unsigned int total_clusters; - unsigned int avail_clusters; - unsigned int sectors_per_cluster; - unsigned int bytes_per_sector; -}; -#endif /* MSVCRT_DISKFREE_T_DEFINED */ - - -#ifdef __cplusplus -extern "C" { -#endif - -unsigned int _getdiskfree(unsigned int, struct _diskfree_t *); - -#ifdef __cplusplus -} -#endif - - -#ifndef USE_MSVCRT_PREFIX -#define diskfree_t _diskfree_t -#endif /* USE_MSVCRT_PREFIX */ - -#endif /* __WINE_DOS_H */ diff --git a/reactos/lib/msvcrt/wine/msvcrt/errno.h b/reactos/lib/msvcrt/wine/msvcrt/errno.h deleted file mode 100644 index 4c117e04dcc..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/errno.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright 2001 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 - */ - -#ifndef __WINE_ERRNO_H -#define __WINE_ERRNO_H -#ifndef __WINE_USE_MSVCRT -#define __WINE_USE_MSVCRT -#endif - -#ifndef MSVCRT -# ifdef USE_MSVCRT_PREFIX -# define MSVCRT(x) MSVCRT_##x -# else -# define MSVCRT(x) x -# endif -#endif - -#ifdef USE_MSVCRT_PREFIX - -# define MSVCRT_EPERM 1 -# define MSVCRT_ENOENT 2 -# define MSVCRT_ESRCH 3 -# define MSVCRT_EINTR 4 -# define MSVCRT_EIO 5 -# define MSVCRT_ENXIO 6 -# define MSVCRT_E2BIG 7 -# define MSVCRT_ENOEXEC 8 -# define MSVCRT_EBADF 9 -# define MSVCRT_ECHILD 10 -# define MSVCRT_EAGAIN 11 -# define MSVCRT_ENOMEM 12 -# define MSVCRT_EACCES 13 -# define MSVCRT_EFAULT 14 -# define MSVCRT_EBUSY 16 -# define MSVCRT_EEXIST 17 -# define MSVCRT_EXDEV 18 -# define MSVCRT_ENODEV 19 -# define MSVCRT_ENOTDIR 20 -# define MSVCRT_EISDIR 21 -# define MSVCRT_EINVAL 22 -# define MSVCRT_ENFILE 23 -# define MSVCRT_EMFILE 24 -# define MSVCRT_ENOTTY 25 -# define MSVCRT_EFBIG 27 -# define MSVCRT_ENOSPC 28 -# define MSVCRT_ESPIPE 29 -# define MSVCRT_EROFS 30 -# define MSVCRT_EMLINK 31 -# define MSVCRT_EPIPE 32 -# define MSVCRT_EDOM 33 -# define MSVCRT_ERANGE 34 -# define MSVCRT_EDEADLK 36 -# define MSVCRT_EDEADLOCK MSVCRT_EDEADLK -# define MSVCRT_ENAMETOOLONG 38 -# define MSVCRT_ENOLCK 39 -# define MSVCRT_ENOSYS 40 -# define MSVCRT_ENOTEMPTY 41 - -#else /* USE_MSVCRT_PREFIX */ - -# define EPERM 1 -# define ENOENT 2 -# define ESRCH 3 -# define EINTR 4 -# define EIO 5 -# define ENXIO 6 -# define E2BIG 7 -# define ENOEXEC 8 -# define EBADF 9 -# define ECHILD 10 -# define EAGAIN 11 -# define ENOMEM 12 -# define EACCES 13 -# define EFAULT 14 -# define EBUSY 16 -# define EEXIST 17 -# define EXDEV 18 -# define ENODEV 19 -# define ENOTDIR 20 -# define EISDIR 21 -# define EINVAL 22 -# define ENFILE 23 -# define EMFILE 24 -# define ENOTTY 25 -# define EFBIG 27 -# define ENOSPC 28 -# define ESPIPE 29 -# define EROFS 30 -# define EMLINK 31 -# define EPIPE 32 -# define EDOM 33 -# define ERANGE 34 -# define EDEADLK 36 -# define EDEADLOCK EDEADLK -# define ENAMETOOLONG 38 -# define ENOLCK 39 -# define ENOSYS 40 -# define ENOTEMPTY 41 - -#endif /* USE_MSVCRT_PREFIX */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int* MSVCRT(_errno)(void); - -#ifdef __cplusplus -} -#endif - -#ifndef USE_MSVCRT_PREFIX -# define errno (*_errno()) -#else -# define MSVCRT_errno (*MSVCRT__errno()) -#endif - -#endif /* __WINE_ERRNO_H */ diff --git a/reactos/lib/msvcrt/wine/msvcrt/fcntl.h b/reactos/lib/msvcrt/wine/msvcrt/fcntl.h deleted file mode 100644 index 38c436c5759..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/fcntl.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * File definitions - * - * Derived from the mingw header written by Colin Peters. - * Modified for Wine use by Jon Griffiths and Francois Gouget. - * This file is in the public domain. - */ -#ifndef __WINE_FCNTL_H -#define __WINE_FCNTL_H -#ifndef __WINE_USE_MSVCRT -#define __WINE_USE_MSVCRT -#endif - -#define _O_RDONLY 0 -#define _O_WRONLY 1 -#define _O_RDWR 2 -#define _O_ACCMODE (_O_RDONLY|_O_WRONLY|_O_RDWR) -#define _O_APPEND 0x0008 -#define _O_RANDOM 0x0010 -#define _O_SEQUENTIAL 0x0020 -#define _O_TEMPORARY 0x0040 -#define _O_NOINHERIT 0x0080 -#define _O_CREAT 0x0100 -#define _O_TRUNC 0x0200 -#define _O_EXCL 0x0400 -#define _O_SHORT_LIVED 0x1000 -#define _O_TEXT 0x4000 -#define _O_BINARY 0x8000 -#define _O_RAW _O_BINARY - - -#ifndef USE_MSVCRT_PREFIX -#define O_RDONLY _O_RDONLY -#define O_WRONLY _O_WRONLY -#define O_RDWR _O_RDWR -#define O_ACCMODE _O_ACCMODE -#define O_APPEND _O_APPEND -#define O_RANDOM _O_RANDOM -#define O_SEQENTIAL _O_SEQUENTIAL -#define O_TEMPORARY _O_TEMPORARY -#define O_NOINHERIT _O_NOINHERIT -#define O_CREAT _O_CREAT -#define O_TRUNC _O_TRUNC -#define O_EXCL _O_EXCL -#define O_TEXT _O_TEXT -#define O_BINARY _O_BINARY -#define O_RAW _O_BINARY -#endif /* USE_MSVCRT_PREFIX */ - -#endif /* __WINE_FCNTL_H */ diff --git a/reactos/lib/msvcrt/wine/msvcrt/io.h b/reactos/lib/msvcrt/wine/msvcrt/io.h deleted file mode 100644 index e3c91e533a8..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/io.h +++ /dev/null @@ -1,197 +0,0 @@ -/* - * System I/O definitions. - * - * Derived from the mingw header written by Colin Peters. - * Modified for Wine use by Jon Griffiths and Francois Gouget. - * This file is in the public domain. - */ -#ifndef __WINE_IO_H -#define __WINE_IO_H -#ifndef __WINE_USE_MSVCRT -#define __WINE_USE_MSVCRT -#endif - -#ifndef MSVCRT -# ifdef USE_MSVCRT_PREFIX -# define MSVCRT(x) MSVCRT_##x -# else -# define MSVCRT(x) x -# endif -#endif - -#ifndef MSVCRT_WCHAR_T_DEFINED -#define MSVCRT_WCHAR_T_DEFINED -#ifndef __cplusplus -typedef unsigned short MSVCRT(wchar_t); -#endif -#endif - -#ifndef _MSC_VER -# ifndef __int64 -# define __int64 long long -# endif -#endif - -/* The following are also defined in dos.h */ -#define _A_NORMAL 0x00000000 -#define _A_RDONLY 0x00000001 -#define _A_HIDDEN 0x00000002 -#define _A_SYSTEM 0x00000004 -#define _A_VOLID 0x00000008 -#define _A_SUBDIR 0x00000010 -#define _A_ARCH 0x00000020 - -#ifndef MSVCRT_TIME_T_DEFINED -typedef long MSVCRT(time_t); -#define MSVCRT_TIME_T_DEFINED -#endif - -#ifndef MSVCRT_FSIZE_T_DEFINED -typedef unsigned long _fsize_t; -#define MSVCRT_FSIZE_T_DEFINED -#endif - -#ifndef MSVCRT_FINDDATA_T_DEFINED -#define MSVCRT_FINDDATA_T_DEFINED -struct _finddata_t -{ - unsigned attrib; - MSVCRT(time_t) time_create; - MSVCRT(time_t) time_access; - MSVCRT(time_t) time_write; - _fsize_t size; - char name[260]; -}; - -struct _finddatai64_t -{ - unsigned attrib; - MSVCRT(time_t) time_create; - MSVCRT(time_t) time_access; - MSVCRT(time_t) time_write; - __int64 size; - char name[260]; -}; -#endif /* MSVCRT_FINDDATA_T_DEFINED */ - -#ifndef MSVCRT_WFINDDATA_T_DEFINED -#define MSVCRT_WFINDDATA_T_DEFINED -struct _wfinddata_t { - unsigned attrib; - MSVCRT(time_t) time_create; - MSVCRT(time_t) time_access; - MSVCRT(time_t) time_write; - _fsize_t size; - MSVCRT(wchar_t) name[260]; -}; - -struct _wfinddatai64_t { - unsigned attrib; - MSVCRT(time_t) time_create; - MSVCRT(time_t) time_access; - MSVCRT(time_t) time_write; - __int64 size; - MSVCRT(wchar_t) name[260]; -}; -#endif /* MSVCRT_WFINDDATA_T_DEFINED */ - -#ifdef __cplusplus -extern "C" { -#endif - -int _access(const char*,int); -int _chmod(const char*,int); -int _chsize(int,long); -int _close(int); -int _commit(int); -int _creat(const char*,int); -int _dup(int); -int _dup2(int,int); -int _eof(int); -__int64 _filelengthi64(int); -long _filelength(int); -int _findclose(long); -long _findfirst(const char*,struct _finddata_t*); -long _findfirsti64(const char*, struct _finddatai64_t*); -int _findnext(long,struct _finddata_t*); -int _findnexti64(long, struct _finddatai64_t*); -long _get_osfhandle(int); -int _isatty(int); -int _locking(int,int,long); -long _lseek(int,long,int); -__int64 _lseeki64(int,__int64,int); -char* _mktemp(char*); -int _open(const char*,int,...); -int _open_osfhandle(long,int); -int _pipe(int*,unsigned int,int); -int _read(int,void*,unsigned int); -int _setmode(int,int); -int _sopen(const char*,int,int,...); -long _tell(int); -__int64 _telli64(int); -int _umask(int); -int _unlink(const char*); -int _write(int,const void*,unsigned int); - -int MSVCRT(remove)(const char*); -int MSVCRT(rename)(const char*,const char*); - -#ifndef MSVCRT_WIO_DEFINED -#define MSVCRT_WIO_DEFINED -int _waccess(const MSVCRT(wchar_t)*,int); -int _wchmod(const MSVCRT(wchar_t)*,int); -int _wcreat(const MSVCRT(wchar_t)*,int); -long _wfindfirst(const MSVCRT(wchar_t)*,struct _wfinddata_t*); -long _wfindfirsti64(const MSVCRT(wchar_t)*, struct _wfinddatai64_t*); -int _wfindnext(long,struct _wfinddata_t*); -int _wfindnexti64(long, struct _wfinddatai64_t*); -MSVCRT(wchar_t)*_wmktemp(MSVCRT(wchar_t)*); -int _wopen(const MSVCRT(wchar_t)*,int,...); -int _wrename(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*); -int _wsopen(const MSVCRT(wchar_t)*,int,int,...); -int _wunlink(const MSVCRT(wchar_t)*); -#endif /* MSVCRT_WIO_DEFINED */ - -#ifdef __cplusplus -} -#endif - - -#ifndef USE_MSVCRT_PREFIX -static inline int access(const char* path, int mode) { return _access(path, mode); } -static inline int chmod(const char* path, int mode) { return _chmod(path, mode); } -static inline int chsize(int fd, long size) { return _chsize(fd, size); } -static inline int close(int fd) { return _close(fd); } -static inline int creat(const char* path, int mode) { return _creat(path, mode); } -static inline int dup(int od) { return _dup(od); } -static inline int dup2(int od, int nd) { return _dup2(od, nd); } -static inline int eof(int fd) { return _eof(fd); } -static inline long filelength(int fd) { return _filelength(fd); } -static inline int isatty(int fd) { return _isatty(fd); } -static inline int locking(int fd, int mode, long size) { return _locking(fd, mode, size); } -static inline long lseek(int fd, long off, int where) { return _lseek(fd, off, where); } -static inline char* mktemp(char* pat) { return _mktemp(pat); } -static inline int read(int fd, void* buf, unsigned int size) { return _read(fd, buf, size); } -static inline int setmode(int fd, int mode) { return _setmode(fd, mode); } -static inline long tell(int fd) { return _tell(fd); } -#ifndef MSVCRT_UMASK_DEFINED -static inline int umask(int fd) { return _umask(fd); } -#define MSVCRT_UMASK_DEFINED -#endif -#ifndef MSVCRT_UNLINK_DEFINED -static inline int unlink(const char* path) { return _unlink(path); } -#define MSVCRT_UNLINK_DEFINED -#endif -static inline int write(int fd, const void* buf, unsigned int size) { return _write(fd, buf, size); } - -#ifdef __GNUC__ -extern int open(const char*,int,...) __attribute__((alias("_open"))); -extern int sopen(const char*,int,int,...) __attribute__((alias("_sopen"))); -#else -#define open _open -#define sopen _sopen -#endif /* __GNUC__ */ - -#endif /* USE _MSVCRT_PREFIX */ - -#endif /* __WINE_IO_H */ diff --git a/reactos/lib/msvcrt/wine/msvcrt/limits.h b/reactos/lib/msvcrt/wine/msvcrt/limits.h deleted file mode 100644 index fa310a532f3..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/limits.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef __WINE_LIMITS_H -#define __WINE_LIMITS_H - -#define INT_MAX 2147483647 -#define INT_MIN (-2147483648) -#define SHRT_MAX 32767 -#define SHRT_MIN (-32768) - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* __WINE_LIMITS_H */ diff --git a/reactos/lib/msvcrt/wine/msvcrt/locale.h b/reactos/lib/msvcrt/wine/msvcrt/locale.h deleted file mode 100644 index 89ef220a436..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/locale.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Locale definitions - * - * Copyright 2000 Francois Gouget. - * - * 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_LOCALE_H -#define __WINE_LOCALE_H -#ifndef __WINE_USE_MSVCRT -#define __WINE_USE_MSVCRT -#endif - -#ifndef MSVCRT -# ifdef USE_MSVCRT_PREFIX -# define MSVCRT(x) MSVCRT_##x -# else -# define MSVCRT(x) x -# endif -#endif - -#ifndef MSVCRT_WCHAR_T_DEFINED -#define MSVCRT_WCHAR_T_DEFINED -#ifndef __cplusplus -typedef unsigned short MSVCRT(wchar_t); -#endif -#endif - -#ifdef USE_MSVCRT_PREFIX -#define MSVCRT_LC_ALL 0 -#define MSVCRT_LC_COLLATE 1 -#define MSVCRT_LC_CTYPE 2 -#define MSVCRT_LC_MONETARY 3 -#define MSVCRT_LC_NUMERIC 4 -#define MSVCRT_LC_TIME 5 -#define MSVCRT_LC_MIN MSVCRT_LC_ALL -#define MSVCRT_LC_MAX MSVCRT_LC_TIME -#else -#define LC_ALL 0 -#define LC_COLLATE 1 -#define LC_CTYPE 2 -#define LC_MONETARY 3 -#define LC_NUMERIC 4 -#define LC_TIME 5 -#define LC_MIN LC_ALL -#define LC_MAX LC_TIME -#endif /* USE_MSVCRT_PREFIX */ - -#ifndef MSVCRT_LCONV_DEFINED -#define MSVCRT_LCONV_DEFINED -struct MSVCRT(lconv) -{ - char* decimal_point; - char* thousands_sep; - char* grouping; - char* int_curr_symbol; - char* currency_symbol; - char* mon_decimal_point; - char* mon_thousands_sep; - char* mon_grouping; - char* positive_sign; - char* negative_sign; - char int_frac_digits; - char frac_digits; - char p_cs_precedes; - char p_sep_by_space; - char n_cs_precedes; - char n_sep_by_space; - char p_sign_posn; - char n_sign_posn; -}; -#endif /* MSVCRT_LCONV_DEFINED */ - - -#ifdef __cplusplus -extern "C" { -#endif - -char* MSVCRT(setlocale)(int,const char*); -struct MSVCRT(lconv)* MSVCRT(localeconv)(void); - -#ifndef MSVCRT_WLOCALE_DEFINED -#define MSVCRT_WLOCALE_DEFINED -MSVCRT(wchar_t)* _wsetlocale(int,const MSVCRT(wchar_t)*); -#endif /* MSVCRT_WLOCALE_DEFINED */ - -#ifdef __cplusplus -} -#endif - -#endif /* __WINE_LOCALE_H */ diff --git a/reactos/lib/msvcrt/wine/msvcrt/malloc.h b/reactos/lib/msvcrt/wine/msvcrt/malloc.h deleted file mode 100644 index 83e62b88899..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/malloc.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Heap definitions - * - * Copyright 2001 Francois Gouget. - * - * 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_MALLOC_H -#define __WINE_MALLOC_H -#ifndef __WINE_USE_MSVCRT -#define __WINE_USE_MSVCRT -#endif - -#ifndef MSVCRT -# ifdef USE_MSVCRT_PREFIX -# define MSVCRT(x) MSVCRT_##x -# else -# define MSVCRT(x) x -# endif -#endif - -/* heap function constants */ -#define _HEAPEMPTY -1 -#define _HEAPOK -2 -#define _HEAPBADBEGIN -3 -#define _HEAPBADNODE -4 -#define _HEAPEND -5 -#define _HEAPBADPTR -6 - -#define _FREEENTRY 0 -#define _USEDENTRY 1 - - -#ifndef MSVCRT_SIZE_T_DEFINED -typedef unsigned int MSVCRT(size_t); -#define MSVCRT_SIZE_T_DEFINED -#endif - -#ifndef MSVCRT_HEAPINFO_DEFINED -#define MSVCRT_HEAPINFO_DEFINED -typedef struct _heapinfo -{ - int* _pentry; - MSVCRT(size_t) _size; - int _useflag; -} _HEAPINFO; -#endif /* MSVCRT_HEAPINFO_DEFINED */ - -#ifdef __cplusplus -extern "C" { -#endif - -void* _expand(void*,MSVCRT(size_t)); -int _heapadd(void*,MSVCRT(size_t)); -int _heapchk(void); -int _heapmin(void); -int _heapset(unsigned int); -MSVCRT(size_t) _heapused(MSVCRT(size_t)*,MSVCRT(size_t)*); -int _heapwalk(_HEAPINFO*); -MSVCRT(size_t) _msize(void*); - -void* MSVCRT(calloc)(MSVCRT(size_t),MSVCRT(size_t)); -void MSVCRT(free)(void*); -void* MSVCRT(malloc)(MSVCRT(size_t)); -void* MSVCRT(realloc)(void*,MSVCRT(size_t)); - -#ifdef __cplusplus -} -#endif - -#ifndef USE_MSVCRT_PREFIX -# ifdef __GNUC__ -# define _alloca(x) __builtin_alloca((x)) -# define alloca(x) __builtin_alloca((x)) -# endif -#endif /* USE_MSVCRT_PREFIX */ - -#endif /* __WINE_MALLOC_H */ diff --git a/reactos/lib/msvcrt/wine/msvcrt/math.h b/reactos/lib/msvcrt/wine/msvcrt/math.h deleted file mode 100644 index 0cba867a3ee..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/math.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef __WINE_MATH_H -#define __WINE_MATH_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* __WINE_MATH_H */ diff --git a/reactos/lib/msvcrt/wine/msvcrt/mbctype.h b/reactos/lib/msvcrt/wine/msvcrt/mbctype.h deleted file mode 100644 index 5b569de2608..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/mbctype.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Multibyte char definitions - * - * Copyright 2001 Francois Gouget. - * - * 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_MBCTYPE_H -#define __WINE_MBCTYPE_H -#ifndef __WINE_USE_MSVCRT -#define __WINE_USE_MSVCRT -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -unsigned char* __p__mbctype(void); -#define _mbctype (__p__mbctype()) - -int _getmbcp(void); -int _ismbbalnum(unsigned int); -int _ismbbalpha(unsigned int); -int _ismbbgraph(unsigned int); -int _ismbbkalnum(unsigned int); -int _ismbbkana(unsigned int); -int _ismbbkprint(unsigned int); -int _ismbbkpunct(unsigned int); -int _ismbbprint(unsigned int); -int _ismbbpunct(unsigned int); -int _setmbcp(int); - -#ifndef MSVCRT_MBLEADTRAIL_DEFINED -#define MSVCRT_MBLEADTRAIL_DEFINED -int _ismbblead(unsigned int); -int _ismbbtrail(unsigned int); -int _ismbslead(const unsigned char*,const unsigned char*); -int _ismbstrail(const unsigned char*,const unsigned char*); -#endif /* MSVCRT_MBLEADTRAIL_DEFINED */ - -#ifdef __cplusplus -} -#endif - -#endif /* __WINE_MBCTYPE_H */ diff --git a/reactos/lib/msvcrt/wine/msvcrt/mbstring.h b/reactos/lib/msvcrt/wine/msvcrt/mbstring.h deleted file mode 100644 index 17f60cd0919..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/mbstring.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Multibyte string definitions - * - * Copyright 2001 Francois Gouget. - * - * 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_MBSTRING_H -#define __WINE_MBSTRING_H -#ifndef __WINE_USE_MSVCRT -#define __WINE_USE_MSVCRT -#endif - -#ifndef MSVCRT -# ifdef USE_MSVCRT_PREFIX -# define MSVCRT(x) MSVCRT_##x -# else -# define MSVCRT(x) x -# endif -#endif - -#ifndef MSVCRT_SIZE_T_DEFINED -typedef unsigned int MSVCRT(size_t); -#define MSVCRT_SIZE_T_DEFINED -#endif - -#ifndef MSVCRT_NLSCMP_DEFINED -#define _NLSCMPERROR ((unsigned int)0x7fffffff) -#define MSVCRT_NLSCMP_DEFINED -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -int _ismbcalnum(unsigned int); -int _ismbcalpha(unsigned int); -int _ismbcdigit(unsigned int); -int _ismbcgraph(unsigned int); -int _ismbchira(unsigned int); -int _ismbckata(unsigned int); -int _ismbcl0(unsigned int); -int _ismbcl1(unsigned int); -int _ismbcl2(unsigned int); -int _ismbclegal(unsigned int); -int _ismbclower(unsigned int); -int _ismbcprint(unsigned int); -int _ismbcpunct(unsigned int); -int _ismbcspace(unsigned int); -int _ismbcsymbol(unsigned int); -int _ismbcupper(unsigned int); -unsigned int _mbbtombc(unsigned int); -int _mbbtype(unsigned char,int); -#define _mbccmp(_cpc1,_cpc2) _mbsncmp((_cpc1),(_cpc2),1) -void _mbccpy(unsigned char*,const unsigned char*); -unsigned int _mbcjistojms(unsigned int); -unsigned int _mbcjmstojis(unsigned int); -MSVCRT(size_t) _mbclen(const unsigned char*); -unsigned int _mbctohira(unsigned int); -unsigned int _mbctokata(unsigned int); -unsigned int _mbctolower(unsigned int); -unsigned int _mbctombb(unsigned int); -unsigned int _mbctoupper(unsigned int); -int _mbsbtype(const unsigned char*,MSVCRT(size_t)); -unsigned char* _mbscat(unsigned char*,const unsigned char*); -unsigned char* _mbschr(const unsigned char*,unsigned int); -int _mbscmp(const unsigned char*,const unsigned char*); -int _mbscoll(const unsigned char*,const unsigned char*); -unsigned char* _mbscpy(unsigned char*,const unsigned char*); -MSVCRT(size_t) _mbscspn(const unsigned char*,const unsigned char*); -unsigned char* _mbsdec(const unsigned char*,const unsigned char*); -unsigned char* _mbsdup(const unsigned char*); -int _mbsicmp(const unsigned char*,const unsigned char*); -int _mbsicoll(const unsigned char*,const unsigned char*); -unsigned char* _mbsinc(const unsigned char*); -MSVCRT(size_t) _mbslen(const unsigned char*); -unsigned char* _mbslwr(unsigned char*); -unsigned char* _mbsnbcat(unsigned char*,const unsigned char*,MSVCRT(size_t)); -int _mbsnbcmp(const unsigned char*,const unsigned char*,MSVCRT(size_t)); -int _mbsnbcoll(const unsigned char*,const unsigned char*,MSVCRT(size_t)); -MSVCRT(size_t) _mbsnbcnt(const unsigned char*,MSVCRT(size_t)); -unsigned char* _mbsnbcpy(unsigned char*,const unsigned char* -,MSVCRT(size_t)); -int _mbsnbicmp(const unsigned char*,const unsigned char*,MSVCRT(size_t)); -int _mbsnbicoll(const unsigned char*,const unsigned char*,MSVCRT(size_t)); -unsigned char* _mbsnbset(unsigned char*,unsigned int,MSVCRT(size_t)) -; -unsigned char* _mbsncat(unsigned char*,const unsigned char*, - MSVCRT(size_t)); -MSVCRT(size_t) _mbsnccnt(const unsigned char*,MSVCRT(size_t)); -int _mbsncmp(const unsigned char*,const unsigned char*,MSVCRT(size_t)); -int _mbsncoll(const unsigned char*,const unsigned char*,MSVCRT(size_t)); -unsigned char* _mbsncpy(unsigned char*,const unsigned char*,MSVCRT(size_t)); -unsigned int _mbsnextc (const unsigned char*); -int _mbsnicmp(const unsigned char*,const unsigned char*,MSVCRT(size_t)); -int _mbsnicoll(const unsigned char*,const unsigned char*,MSVCRT(size_t)); -unsigned char* _mbsninc(const unsigned char*,MSVCRT(size_t)); -unsigned char* _mbsnset(unsigned char*,unsigned int,MSVCRT(size_t)); -unsigned char* _mbspbrk(const unsigned char*,const unsigned char*); -unsigned char* _mbsrchr(const unsigned char*,unsigned int); -unsigned char* _mbsrev(unsigned char*); -unsigned char* _mbsset(unsigned char*,unsigned int); -MSVCRT(size_t) _mbsspn(const unsigned char*,const unsigned char*); -unsigned char* _mbsspnp(const unsigned char*,const unsigned char*); -unsigned char* _mbsstr(const unsigned char*,const unsigned char*); -unsigned char* _mbstok(unsigned char*,const unsigned char*); -unsigned char* _mbsupr(unsigned char*); - -#ifndef MSVCRT_MBLEADTRAIL_DEFINED -#define MSVCRT_MBLEADTRAIL_DEFINED -int _ismbblead(unsigned int); -int _ismbbtrail(unsigned int); -int _ismbslead(const unsigned char*,const unsigned char*); -int _ismbstrail(const unsigned char*,const unsigned char*); -#endif /* MSVCRT_MBLEADTRAIL_DEFINED */ - -#ifdef __cplusplus -} -#endif - -#endif /* __WINE_MBSTRING_H */ diff --git a/reactos/lib/msvcrt/wine/msvcrt/search.h b/reactos/lib/msvcrt/wine/msvcrt/search.h deleted file mode 100644 index 2c617faa69c..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/search.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Heap definitions - * - * Copyright 2001 Francois Gouget. - * - * 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_SEARCH_H -#define __WINE_SEARCH_H -#ifndef __WINE_USE_MSVCRT -#define __WINE_USE_MSVCRT -#endif - -#ifndef MSVCRT -# ifdef USE_MSVCRT_PREFIX -# define MSVCRT(x) MSVCRT_##x -# else -# define MSVCRT(x) x -# endif -#endif - -#ifndef MSVCRT_SIZE_T_DEFINED -typedef unsigned int MSVCRT(size_t); -#define MSVCRT_SIZE_T_DEFINED -#endif - - -#ifdef __cplusplus -extern "C" { -#endif - -void* _lfind(const void*,const void*,unsigned int*,unsigned int, - int (*)(const void*,const void*)); -void* _lsearch(const void*,void*,unsigned int*,unsigned int, - int (*)(const void*,const void*)); -void* MSVCRT(bsearch)(const void*,const void*,MSVCRT(size_t),MSVCRT(size_t), - int (*)(const void*,const void*)); -void MSVCRT(qsort)(void*,MSVCRT(size_t),MSVCRT(size_t), - int (*)(const void*,const void*)); - -#ifdef __cplusplus -} -#endif - - -#ifndef USE_MSVCRT_PREFIX -static inline void* lfind(const void* match, const void* start, unsigned int* array_size, unsigned int elem_size, int (*cf)(const void*,const void*)) { return _lfind(match, start, array_size, elem_size, cf); } -static inline void* lsearch(const void* match, void* start, unsigned int* array_size, unsigned int elem_size, int (*cf)(const void*,const void*) ) { return _lsearch(match, start, array_size, elem_size, cf); } -#endif /* USE_MSVCRT_PREFIX */ - -#endif /* __WINE_SEARCH_H */ diff --git a/reactos/lib/msvcrt/wine/msvcrt/setjmp.h b/reactos/lib/msvcrt/wine/msvcrt/setjmp.h deleted file mode 100644 index a03b05d6f2e..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/setjmp.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Setjmp/Longjmp definitions - * - * Copyright 2001 Francois Gouget. - * - * 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_SETJMP_H -#define __WINE_SETJMP_H -#ifndef __WINE_USE_MSVCRT -#define __WINE_USE_MSVCRT -#endif - -#ifndef MSVCRT -# ifdef USE_MSVCRT_PREFIX -# define MSVCRT(x) MSVCRT_##x -# else -# define MSVCRT(x) x -# endif -#endif - - -#ifdef __i386__ - -typedef struct __JUMP_BUFFER -{ - unsigned long Ebp; - unsigned long Ebx; - unsigned long Edi; - unsigned long Esi; - unsigned long Esp; - unsigned long Eip; - unsigned long Registration; - unsigned long TryLevel; - /* Start of new struct members */ - unsigned long Cookie; - unsigned long UnwindFunc; - unsigned long UnwindData[6]; -} _JUMP_BUFFER; - -#endif /* __i386__ */ - -#ifndef USE_MSVCRT_PREFIX -#define _JBLEN 16 -#define _JBTYPE int -typedef _JBTYPE jmp_buf[_JBLEN]; -#else -#define MSVCRT__JBLEN 16 -#define MSVCRT__JBTYPE int -typedef MSVCRT__JBTYPE MSVCRT_jmp_buf[MSVCRT__JBLEN]; -#endif - - -#ifdef __cplusplus -extern "C" { -#endif - -int MSVCRT(_setjmp)(MSVCRT(jmp_buf)); -int MSVCRT(longjmp)(MSVCRT(jmp_buf),int); - -#ifdef __cplusplus -} -#endif - -#ifndef USE_MSVCRT_PREFIX -#define setjmp _setjmp -#endif - -#endif /* __WINE_SETJMP_H */ diff --git a/reactos/lib/msvcrt/wine/msvcrt/share.h b/reactos/lib/msvcrt/wine/msvcrt/share.h deleted file mode 100644 index 4da88fe1c86..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/share.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * share.h - * - * Constants for file sharing functions. - * - * Derived from the Mingw32 header written by Colin Peters. - * Modified for Wine use by Bill Medland - * This file is in the public domain. - * - * Original header contained the following - * - * 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 - * DISCLAMED. This includes but is not limited to warranties of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - */ - -#ifndef __WINE_SHARE_H -#define __WINE_SHARE_H -#ifndef __WINE_USE_MSVCRT -#define __WINE_USE_MSVCRT -#endif - -#define SH_COMPAT 0x00 /* Compatibility */ -#define SH_DENYRW 0x10 /* Deny read/write */ -#define SH_DENYWR 0x20 /* Deny write */ -#define SH_DENYRD 0x30 /* Deny read */ -#define SH_DENYNO 0x40 /* Deny nothing */ - -#define _SH_COMPAT SH_COMPAT -#define _SH_DENYRW SH_DENYRW -#define _SH_DENYWR SH_DENYWR -#define _SH_DENYRD SH_DENYRD -#define _SH_DENYNO SH_DENYNO - -#endif /* __WINE_SHARE_H_ */ diff --git a/reactos/lib/msvcrt/wine/msvcrt/stddef.h b/reactos/lib/msvcrt/wine/msvcrt/stddef.h deleted file mode 100644 index 94af46ec2d7..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/stddef.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Time definitions - * - * Copyright 2000 Francois Gouget. - * - * 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_STDDEF_H -#define __WINE_STDDEF_H -#ifndef __WINE_USE_MSVCRT -#define __WINE_USE_MSVCRT -#endif - -#ifndef MSVCRT -# ifdef USE_MSVCRT_PREFIX -# define MSVCRT(x) MSVCRT_##x -# else -# define MSVCRT(x) x -# endif -#endif - -#ifndef MSVCRT_WCHAR_T_DEFINED -#define MSVCRT_WCHAR_T_DEFINED -#ifndef __cplusplus -typedef unsigned short MSVCRT(wchar_t); -#endif -#endif - -#ifndef MSVCRT_PTRDIFF_T_DEFINED -typedef int ptrdiff_t; -#define MSVCRT_PTRDIFF_T_DEFINED -#endif - -#ifndef MSVCRT_SIZE_T_DEFINED -typedef unsigned int MSVCRT(size_t); -#define MSVCRT_SIZE_T_DEFINED -#endif - -#ifndef NULL -#ifdef __cplusplus -#define NULL 0 -#else -#define NULL ((void *)0) -#endif -#endif - -#define offsetof(s,m) (size_t)&(((s*)NULL)->m) - - -#ifdef __cplusplus -extern "C" { -#endif - -unsigned long __threadid(); -unsigned long __threadhandle(); -#define _threadid (__threadid()) - -#ifdef __cplusplus -} -#endif - -#endif /* __WINE_STDDEF_H */ diff --git a/reactos/lib/msvcrt/wine/msvcrt/stdio.h b/reactos/lib/msvcrt/wine/msvcrt/stdio.h deleted file mode 100644 index e4f5dba61ae..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/stdio.h +++ /dev/null @@ -1,283 +0,0 @@ -/* - * Standard I/O definitions. - * - * Derived from the mingw header written by Colin Peters. - * Modified for Wine use by Jon Griffiths and Francois Gouget. - * This file is in the public domain. - */ -#ifndef __WINE_STDIO_H -#define __WINE_STDIO_H -#ifndef __WINE_USE_MSVCRT -#define __WINE_USE_MSVCRT -#endif - -#ifndef RC_INVOKED -#include <stdarg.h> -#endif - -#ifndef MSVCRT -# ifdef USE_MSVCRT_PREFIX -# define MSVCRT(x) MSVCRT_##x -# else -# define MSVCRT(x) x -# endif -#endif - -/* file._flag flags */ -#ifndef USE_MSVCRT_PREFIX -#define _IOREAD 0x0001 -#define _IOWRT 0x0002 -#define _IOMYBUF 0x0008 -#define _IOEOF 0x0010 -#define _IOERR 0x0020 -#define _IOSTRG 0x0040 -#define _IORW 0x0080 -#define _IOAPPEND 0x0200 -#else -#define MSVCRT__IOREAD 0x0001 -#define MSVCRT__IOWRT 0x0002 -#define MSVCRT__IOMYBUF 0x0008 -#define MSVCRT__IOEOF 0x0010 -#define MSVCRT__IOERR 0x0020 -#define MSVCRT__IOSTRG 0x0040 -#define MSVCRT__IORW 0x0080 -#define MSVCRT__IOAPPEND 0x0200 -#endif /* USE_MSVCRT_PREFIX */ - -#ifndef NULL -#ifdef __cplusplus -#define NULL 0 -#else -#define NULL ((void *)0) -#endif -#endif - -#ifndef USE_MSVCRT_PREFIX - -#define STDIN_FILENO 0 -#define STDOUT_FILENO 1 -#define STDERR_FILENO 2 - -/* more file._flag flags, but these conflict with Unix */ -#define _IOFBF 0x0000 -#define _IONBF 0x0004 -#define _IOLBF 0x0040 - -#define EOF (-1) -#define FILENAME_MAX 260 -#define TMP_MAX 0x7fff -#define FOPEN_MAX 20 -#define L_tmpnam 260 - -#define BUFSIZ 512 - -#ifndef SEEK_SET -#define SEEK_SET 0 -#define SEEK_CUR 1 -#define SEEK_END 2 -#endif - -#else - -/* more file._flag flags, but these conflict with Unix */ -#define MSVCRT__IOFBF 0x0000 -#define MSVCRT__IONBF 0x0004 -#define MSVCRT__IOLBF 0x0040 - -#define MSVCRT_FILENAME_MAX 260 -#define MSVCRT_TMP_MAX 0x7fff - -#define MSVCRT_EOF (-1) - -#define MSVCRT_BUFSIZ 512 - -#endif /* USE_MSVCRT_PREFIX */ - -#ifndef MSVCRT_FILE_DEFINED -#define MSVCRT_FILE_DEFINED -typedef struct MSVCRT(_iobuf) -{ - char* _ptr; - int _cnt; - char* _base; - int _flag; - int _file; - int _charbuf; - int _bufsiz; - char* _tmpfname; -} MSVCRT(FILE); -#endif /* MSVCRT_FILE_DEFINED */ - -#ifndef MSVCRT_FPOS_T_DEFINED -typedef long MSVCRT(fpos_t); -#define MSVCRT_FPOS_T_DEFINED -#endif - -#ifndef MSVCRT_SIZE_T_DEFINED -typedef unsigned int MSVCRT(size_t); -#define MSVCRT_SIZE_T_DEFINED -#endif - -#ifndef MSVCRT_WCHAR_T_DEFINED -#define MSVCRT_WCHAR_T_DEFINED -#ifndef __cplusplus -typedef unsigned short MSVCRT(wchar_t); -#endif -#endif - -#ifndef MSVCRT_WCTYPE_T_DEFINED -typedef MSVCRT(wchar_t) MSVCRT(wint_t); -typedef MSVCRT(wchar_t) MSVCRT(wctype_t); -#define MSVCRT_WCTYPE_T_DEFINED -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef MSVCRT_STDIO_DEFINED -MSVCRT(FILE)* MSVCRT(__p__iob)(void); -#define _iob (__p__iob()) -#endif /* MSVCRT_STDIO_DEFINED */ - -#ifndef USE_MSVCRT_PREFIX -#define stdin (_iob+STDIN_FILENO) -#define stdout (_iob+STDOUT_FILENO) -#define stderr (_iob+STDERR_FILENO) -#endif /* USE_MSVCRT_PREFIX */ - -#ifndef MSVCRT_STDIO_DEFINED -#define MSVCRT_STDIO_DEFINED -int _fcloseall(void); -//MSVCRT(FILE)* _fdopen(int,const char*); -int _fgetchar(void); -//int _filbuf(MSVCRT(FILE*)); -//int _fileno(MSVCRT(FILE)*); -//int _flsbuf(int,MSVCRT(FILE)*); -int _flushall(void); -int _fputchar(int); -MSVCRT(FILE)* _fsopen(const char*,const char*,int); -int _getmaxstdio(void); -//int _getw(MSVCRT(FILE)*); -//int _pclose(MSVCRT(FILE)*); -//MSVCRT(FILE)* _popen(const char*,const char*); -//int _putw(int,MSVCRT(FILE)*); -int _rmtmp(void); -int _setmaxstdio(int); -int _snprintf(char*,MSVCRT(size_t),const char*,...); -char* _tempnam(const char*,const char*); -int _unlink(const char*); -int _vsnprintf(char*,MSVCRT(size_t),const char*,va_list); - -void MSVCRT(clearerr)(MSVCRT(FILE)*); -int MSVCRT(fclose)(MSVCRT(FILE)*); -int MSVCRT(feof)(MSVCRT(FILE)*); -int MSVCRT(ferror)(MSVCRT(FILE)*); -int MSVCRT(fflush)(MSVCRT(FILE)*); -int MSVCRT(fgetc)(MSVCRT(FILE)*); -int MSVCRT(fgetpos)(MSVCRT(FILE)*,MSVCRT(fpos_t)*); -char* MSVCRT(fgets)(char*,int,MSVCRT(FILE)*); -MSVCRT(FILE)* MSVCRT(fopen)(const char*,const char*); -int MSVCRT(fprintf)(MSVCRT(FILE)*,const char*,...); -int MSVCRT(fputc)(int,MSVCRT(FILE)*); -int MSVCRT(fputs)(const char*,MSVCRT(FILE)*); -MSVCRT(size_t) MSVCRT(fread)(void*,MSVCRT(size_t),MSVCRT(size_t),MSVCRT(FILE)*); -MSVCRT(FILE)* MSVCRT(freopen)(const char*,const char*,MSVCRT(FILE)*); -int MSVCRT(fscanf)(MSVCRT(FILE)*,const char*,...); -int MSVCRT(fseek)(MSVCRT(FILE)*,long,int); -int MSVCRT(fsetpos)(MSVCRT(FILE)*,MSVCRT(fpos_t)*); -long MSVCRT(ftell)(MSVCRT(FILE)*); -MSVCRT(size_t) MSVCRT(fwrite)(const void*,MSVCRT(size_t),MSVCRT(size_t),MSVCRT(FILE)*); -int MSVCRT(getc)(MSVCRT(FILE)*); -int MSVCRT(getchar)(void); -char* MSVCRT(gets)(char*); -void MSVCRT(perror)(const char*); -int MSVCRT(printf)(const char*,...); -int MSVCRT(putc)(int,MSVCRT(FILE)*); -int MSVCRT(putchar)(int); -int MSVCRT(puts)(const char*); -int MSVCRT(remove)(const char*); -int MSVCRT(rename)(const char*,const char*); -void MSVCRT(rewind)(MSVCRT(FILE)*); -int MSVCRT(scanf)(const char*,...); -void MSVCRT(setbuf)(MSVCRT(FILE)*,char*); -int MSVCRT(setvbuf)(MSVCRT(FILE)*,char*,int,MSVCRT(size_t)); -int MSVCRT(sprintf)(char*,const char*,...); -int MSVCRT(sscanf)(const char*,const char*,...); -MSVCRT(FILE)* MSVCRT(tmpfile)(void); -char* MSVCRT(tmpnam)(char*); -int MSVCRT(ungetc)(int,MSVCRT(FILE)*); -int MSVCRT(vfprintf)(MSVCRT(FILE)*,const char*,va_list); -int MSVCRT(vprintf)(const char*,va_list); -int MSVCRT(vsprintf)(char*,const char*,va_list); - -#ifndef MSVCRT_WSTDIO_DEFINED -#define MSVCRT_WSTDIO_DEFINED -MSVCRT(wint_t) _fgetwchar(void); -MSVCRT(wint_t) _fputwchar(MSVCRT(wint_t)); -MSVCRT(wchar_t)*_getws(MSVCRT(wchar_t)*); -int _putws(const MSVCRT(wchar_t)*); -int _snwprintf(MSVCRT(wchar_t)*,MSVCRT(size_t),const MSVCRT(wchar_t)*,...); -int _vsnwprintf(MSVCRT(wchar_t)*,MSVCRT(size_t),const MSVCRT(wchar_t)*,va_list); -//MSVCRT(FILE)* _wfdopen(int,const MSVCRT(wchar_t)*); -//MSVCRT(FILE)* _wfopen(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*); -//MSVCRT(FILE)* _wfreopen(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,MSVCRT(FILE)*); -//MSVCRT(FILE)* _wfsopen(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,int); -void _wperror(const MSVCRT(wchar_t)*); -//MSVCRT(FILE)* _wpopen(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*); -int _wremove(const MSVCRT(wchar_t)*); -MSVCRT(wchar_t)*_wtempnam(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*); -MSVCRT(wchar_t)*_wtmpnam(MSVCRT(wchar_t)*); - -MSVCRT(wint_t) MSVCRT(fgetwc)(MSVCRT(FILE)*); -MSVCRT(wchar_t)*MSVCRT(fgetws)(MSVCRT(wchar_t)*,int,MSVCRT(FILE)*); -MSVCRT(wint_t) MSVCRT(fputwc)(MSVCRT(wint_t),MSVCRT(FILE)*); -int MSVCRT(fputws)(const MSVCRT(wchar_t)*,MSVCRT(FILE)*); -int MSVCRT(fwprintf)(MSVCRT(FILE)*,const MSVCRT(wchar_t)*,...); -int MSVCRT(fputws)(const MSVCRT(wchar_t)*,MSVCRT(FILE)*); -int MSVCRT(fwscanf)(MSVCRT(FILE)*,const MSVCRT(wchar_t)*,...); -MSVCRT(wint_t) MSVCRT(getwc)(MSVCRT(FILE)*); -MSVCRT(wint_t) MSVCRT(getwchar)(void); -MSVCRT(wchar_t)*MSVCRT(getws)(MSVCRT(wchar_t)*); -MSVCRT(wint_t) MSVCRT(putwc)(MSVCRT(wint_t),MSVCRT(FILE)*); -MSVCRT(wint_t) MSVCRT(putwchar)(MSVCRT(wint_t)); -int MSVCRT(putws)(const MSVCRT(wchar_t)*); -int MSVCRT(swprintf)(MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,...); -int MSVCRT(swscanf)(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,...); -MSVCRT(wint_t) MSVCRT(ungetwc)(MSVCRT(wint_t),MSVCRT(FILE)*); -int MSVCRT(vfwprintf)(MSVCRT(FILE)*,const MSVCRT(wchar_t)*,va_list); -int MSVCRT(vswprintf)(MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,va_list); -int MSVCRT(vwprintf)(const MSVCRT(wchar_t)*,va_list); -int MSVCRT(wprintf)(const MSVCRT(wchar_t)*,...); -int MSVCRT(wscanf)(const MSVCRT(wchar_t)*,...); -#endif /* MSVCRT_WSTDIO_DEFINED */ - -#endif /* MSVCRT_STDIO_DEFINED */ - -#ifdef __cplusplus -} -#endif - - -#ifndef USE_MSVCRT_PREFIX -static inline MSVCRT(FILE)* fdopen(int fd, const char *mode) { return _fdopen(fd, mode); } -static inline int fgetchar(void) { return _fgetchar(); } -static inline int fileno(MSVCRT(FILE)* file) { return _fileno(file); } -static inline int fputchar(int c) { return _fputchar(c); } -static inline int pclose(MSVCRT(FILE)* file) { return _pclose(file); } -static inline MSVCRT(FILE)* popen(const char* command, const char* mode) { return _popen(command, mode); } -static inline char* tempnam(const char *dir, const char *prefix) { return _tempnam(dir, prefix); } -#ifndef MSVCRT_UNLINK_DEFINED -static inline int unlink(const char* path) { return _unlink(path); } -#define MSVCRT_UNLINK_DEFINED -#endif -static inline int vsnprintf(char *buffer, size_t size, const char *format, va_list args) { return _vsnprintf(buffer,size,format,args); } - -static inline MSVCRT(wint_t) fgetwchar(void) { return _fgetwchar(); } -static inline MSVCRT(wint_t) fputwchar(MSVCRT(wint_t) wc) { return _fputwchar(wc); } -static inline int getw(MSVCRT(FILE)* file) { return _getw(file); } -static inline int putw(int val, MSVCRT(FILE)* file) { return _putw(val, file); } -static inline MSVCRT(FILE)* wpopen(const MSVCRT(wchar_t)* command,const MSVCRT(wchar_t)* mode) { return _wpopen(command, mode); } -#endif /* USE_MSVCRT_PREFIX */ - -#endif /* __WINE_STDIO_H */ diff --git a/reactos/lib/msvcrt/wine/msvcrt/sys/locking.h b/reactos/lib/msvcrt/wine/msvcrt/sys/locking.h deleted file mode 100644 index c1cff3ec31e..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/sys/locking.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * _locking constants - * - * Copyright 2002 Bill Medland - * - * 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_SYS_LOCKING_H__ -#define __WINE_SYS_LOCKING_H__ -#ifndef __WINE_USE_MSVCRT -#define __WINE_USE_MSVCRT -#endif - -#define _LK_UNLCK 0 -#define _LK_LOCK 1 -#define _LK_NBLCK 2 -#define _LK_RLCK 3 -#define _LK_NBRLCK 4 - -#endif /* __WINE_SYS_LOCKING_H__ : Do not place anything after this #endif */ diff --git a/reactos/lib/msvcrt/wine/msvcrt/sys/stat.h b/reactos/lib/msvcrt/wine/msvcrt/sys/stat.h deleted file mode 100644 index a64e57bbaba..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/sys/stat.h +++ /dev/null @@ -1,160 +0,0 @@ -/* - * _stat() definitions - * - * Derived from the mingw header written by Colin Peters. - * Modified for Wine use by Jon Griffiths and Francois Gouget. - * This file is in the public domain. - */ -#ifndef __WINE_SYS_STAT_H -#define __WINE_SYS_STAT_H -#ifndef __WINE_USE_MSVCRT -#define __WINE_USE_MSVCRT -#endif - -#include <sys/types.h> - -#ifndef MSVCRT -# ifdef USE_MSVCRT_PREFIX -# define MSVCRT(x) MSVCRT_##x -# else -# define MSVCRT(x) x -# endif -#endif - -#ifndef MSVCRT_WCHAR_T_DEFINED -#define MSVCRT_WCHAR_T_DEFINED -#ifndef __cplusplus -typedef unsigned short MSVCRT(wchar_t); -#endif -#endif - -#ifndef _MSC_VER -# ifndef __int64 -# define __int64 long long -# endif -#endif - -#ifndef MSVCRT_DEV_T_DEFINED -typedef unsigned int _dev_t; -#define MSVCRT_DEV_T_DEFINED -#endif - -#ifndef MSVCRT_INO_T_DEFINED -typedef unsigned short _ino_t; -#define MSVCRT_INO_T_DEFINED -#endif - -#ifndef MSVCRT_TIME_T_DEFINED -typedef long MSVCRT(time_t); -#define MSVCRT_TIME_T_DEFINED -#endif - -#ifndef MSVCRT_OFF_T_DEFINED -typedef int MSVCRT(_off_t); -#define MSVCRT_OFF_T_DEFINED -#endif - -#define _S_IEXEC 0x0040 -#define _S_IWRITE 0x0080 -#define _S_IREAD 0x0100 -#define _S_IFIFO 0x1000 -#define _S_IFCHR 0x2000 -#define _S_IFDIR 0x4000 -#define _S_IFREG 0x8000 -#define _S_IFMT 0xF000 - -/* for FreeBSD */ -#undef st_atime -#undef st_ctime -#undef st_mtime - -#ifndef MSVCRT_STAT_DEFINED -#define MSVCRT_STAT_DEFINED - -struct _stat { - _dev_t st_dev; - _ino_t st_ino; - unsigned short st_mode; - short st_nlink; - short st_uid; - short st_gid; - _dev_t st_rdev; - MSVCRT(_off_t) st_size; - MSVCRT(time_t) st_atime; - MSVCRT(time_t) st_mtime; - MSVCRT(time_t) st_ctime; -}; - -struct MSVCRT(stat) { - _dev_t st_dev; - _ino_t st_ino; - unsigned short st_mode; - short st_nlink; - short st_uid; - short st_gid; - _dev_t st_rdev; - MSVCRT(_off_t) st_size; - MSVCRT(time_t) st_atime; - MSVCRT(time_t) st_mtime; - MSVCRT(time_t) st_ctime; -}; - -struct _stati64 { - _dev_t st_dev; - _ino_t st_ino; - unsigned short st_mode; - short st_nlink; - short st_uid; - short st_gid; - _dev_t st_rdev; - __int64 st_size; - MSVCRT(time_t) st_atime; - MSVCRT(time_t) st_mtime; - MSVCRT(time_t) st_ctime; -}; -#endif /* MSVCRT_STAT_DEFINED */ - -#ifdef __cplusplus -extern "C" { -#endif - -int MSVCRT(_fstat)(int,struct _stat*); -int MSVCRT(_stat)(const char*,struct _stat*); -int _fstati64(int,struct _stati64*); -int _stati64(const char*,struct _stati64*); -int _umask(int); - -#ifndef MSVCRT_WSTAT_DEFINED -#define MSVCRT_WSTAT_DEFINED -int _wstat(const MSVCRT(wchar_t)*,struct _stat*); -int _wstati64(const MSVCRT(wchar_t)*,struct _stati64*); -#endif /* MSVCRT_WSTAT_DEFINED */ - -#ifdef __cplusplus -} -#endif - - -#ifndef USE_MSVCRT_PREFIX -#define S_IFMT _S_IFMT -#define S_IFDIR _S_IFDIR -#define S_IFCHR _S_IFCHR -#define S_IFREG _S_IFREG -#define S_IREAD _S_IREAD -#define S_IWRITE _S_IWRITE -#define S_IEXEC _S_IEXEC - -#define S_ISCHR(m) (((m)&_S_IFMT) == _S_IFCHR) -#define S_ISDIR(m) (((m)&_S_IFMT) == _S_IFDIR) -#define S_ISFIFO(m) (((m)&_S_IFMT) == _S_IFIFO) -#define S_ISREG(m) (((m)&_S_IFMT) == _S_IFREG) - -static inline int fstat(int fd, struct stat* ptr) { return _fstat(fd, (struct _stat*)ptr); } -static inline int stat(const char* path, struct stat* ptr) { return _stat(path, (struct _stat*)ptr); } -#ifndef MSVCRT_UMASK_DEFINED -static inline int umask(int fd) { return _umask(fd); } -#define MSVCRT_UMASK_DEFINED -#endif -#endif /* USE_MSVCRT_PREFIX */ - -#endif /* __WINE_SYS_STAT_H */ diff --git a/reactos/lib/msvcrt/wine/msvcrt/sys/timeb.h b/reactos/lib/msvcrt/wine/msvcrt/sys/timeb.h deleted file mode 100644 index 5bae7873178..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/sys/timeb.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Path and directory definitions - * - * Copyright 2000 Francois Gouget. - * - * 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_SYS_TIMEB_H -#define __WINE_SYS_TIMEB_H -#ifndef __WINE_USE_MSVCRT -#define __WINE_USE_MSVCRT -#endif - -#ifndef MSVCRT -# ifdef USE_MSVCRT_PREFIX -# define MSVCRT(x) MSVCRT_##x -# else -# define MSVCRT(x) x -# endif -#endif - -#ifndef MSVCRT_TIME_T_DEFINED -typedef long MSVCRT(time_t); -#define MSVCRT_TIME_T_DEFINED -#endif - -#ifndef MSVCRT_TIMEB_DEFINED -#define MSVCRT_TIMEB_DEFINED -struct _timeb -{ - MSVCRT(time_t) time; - unsigned short millitm; - short timezone; - short dstflag; -}; -#endif /* MSVCRT_TIMEB_DEFINED */ - - -#ifdef __cplusplus -extern "C" { -#endif - -void _ftime(struct _timeb*); - -#ifdef __cplusplus -} -#endif - - -#ifndef USE_MSVCRT_PREFIX -#define timeb _timeb - -static inline void ftime(struct _timeb* ptr) { return _ftime(ptr); } -#endif /* USE_MSVCRT_PREFIX */ - -#endif /* __WINE_SYS_TIMEB_H */ diff --git a/reactos/lib/msvcrt/wine/msvcrt/sys/types.h b/reactos/lib/msvcrt/wine/msvcrt/sys/types.h deleted file mode 100644 index 0e8eee96c32..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/sys/types.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * _stat() definitions - * - * Copyright 2000 Francois Gouget. - * - * 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_SYS_TYPES_H -#define __WINE_SYS_TYPES_H -#ifndef __WINE_USE_MSVCRT -#define __WINE_USE_MSVCRT -#endif - -#ifndef MSVCRT -# ifdef USE_MSVCRT_PREFIX -# define MSVCRT(x) MSVCRT_##x -# else -# define MSVCRT(x) x -# endif -#endif - -#ifndef MSVCRT_DEV_T_DEFINED -typedef unsigned int _dev_t; -#define MSVCRT_DEV_T_DEFINED -#endif - -#ifndef MSVCRT_INO_T_DEFINED -typedef unsigned short _ino_t; -#define MSVCRT_INO_T_DEFINED -#endif - -#ifndef MSVCRT_MODE_T_DEFINED -typedef unsigned short _mode_t; -#define MSVCRT_MODE_T_DEFINED -#endif - -#ifndef MSVCRT_OFF_T_DEFINED -typedef int MSVCRT(_off_t); -#define MSVCRT_OFF_T_DEFINED -#endif - -#ifndef MSVCRT_TIME_T_DEFINED -typedef long MSVCRT(time_t); -#define MSVCRT_TIME_T_DEFINED -#endif - -#ifndef USE_MSVCRT_PREFIX -#ifndef MSVCRT_BSD_TYPES_DEFINED -typedef unsigned char u_char; -typedef unsigned short u_short; -typedef unsigned int u_int; -typedef unsigned long u_long; -#define MSVCRT_BSD_TYPES_DEFINED -#endif - -#define dev_t _dev_t -#define ino_t _ino_t -#define mode_t _mode_t -#define off_t _off_t -#endif /* USE_MSVCRT_PREFIX */ - -#endif /* __WINE_SYS_TYPES_H */ diff --git a/reactos/lib/msvcrt/wine/msvcrt/sys/unistd.h b/reactos/lib/msvcrt/wine/msvcrt/sys/unistd.h deleted file mode 100644 index 1e823fbd53c..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/sys/unistd.h +++ /dev/null @@ -1 +0,0 @@ -#include <unistd.h> diff --git a/reactos/lib/msvcrt/wine/msvcrt/sys/utime.h b/reactos/lib/msvcrt/wine/msvcrt/sys/utime.h deleted file mode 100644 index ae72df96416..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/sys/utime.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Path and directory definitions - * - * Copyright 2000 Francois Gouget. - * - * 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_SYS_UTIME_H -#define __WINE_SYS_UTIME_H -#ifndef __WINE_USE_MSVCRT -#define __WINE_USE_MSVCRT -#endif - -#ifndef MSVCRT -# ifdef USE_MSVCRT_PREFIX -# define MSVCRT(x) MSVCRT_##x -# else -# define MSVCRT(x) x -# endif -#endif - -#ifndef MSVCRT_WCHAR_T_DEFINED -#define MSVCRT_WCHAR_T_DEFINED -#ifndef __cplusplus -typedef unsigned short MSVCRT(wchar_t); -#endif -#endif - -#ifndef MSVCRT_TIME_T_DEFINED -typedef long MSVCRT(time_t); -#define MSVCRT_TIME_T_DEFINED -#endif - -#ifndef MSVCRT_UTIMBUF_DEFINED -#define MSVCRT_UTIMBUF_DEFINED -struct _utimbuf -{ - MSVCRT(time_t) actime; - MSVCRT(time_t) modtime; -}; -#endif /* MSVCRT_UTIMBUF_DEFINED */ - -#ifdef __cplusplus -extern "C" { -#endif - -int _futime(int,struct _utimbuf*); -int _utime(const char*,struct _utimbuf*); - -int _wutime(const MSVCRT(wchar_t)*,struct _utimbuf*); - -#ifdef __cplusplus -} -#endif - - -#ifndef USE_MSVCRT_PREFIX -#define utimbuf _utimbuf - -static inline int utime(const char* path, struct _utimbuf* buf) { return _utime(path, buf); } -#endif /* USE_MSVCRT_PREFIX */ - -#endif /* __WINE_SYS_UTIME_H */ diff --git a/reactos/lib/msvcrt/wine/msvcrt/time.h b/reactos/lib/msvcrt/wine/msvcrt/time.h deleted file mode 100644 index b6f654ae7ce..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/time.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Time definitions - * - * Copyright 2000 Francois Gouget. - * - * 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_TIME_H -#define __WINE_TIME_H -#ifndef __WINE_USE_MSVCRT -#define __WINE_USE_MSVCRT -#endif - -#ifndef MSVCRT -# ifdef USE_MSVCRT_PREFIX -# define MSVCRT(x) MSVCRT_##x -# else -# define MSVCRT(x) x -# endif -#endif - -#ifndef MSVCRT_WCHAR_T_DEFINED -#define MSVCRT_WCHAR_T_DEFINED -#ifndef __cplusplus -typedef unsigned short MSVCRT(wchar_t); -#endif -#endif - -#ifndef MSVCRT_SIZE_T_DEFINED -typedef unsigned int MSVCRT(size_t); -#define MSVCRT_SIZE_T_DEFINED -#endif - -#ifndef MSVCRT_TIME_T_DEFINED -typedef long MSVCRT(time_t); -#define MSVCRT_TIME_T_DEFINED -#endif - -#ifndef MSVCRT_CLOCK_T_DEFINED -typedef long MSVCRT(clock_t); -#define MSVCRT_CLOCK_T_DEFINED -#endif - -#ifndef NULL -#ifdef __cplusplus -#define NULL 0 -#else -#define NULL ((void *)0) -#endif -#endif - -#ifndef CLOCKS_PER_SEC -#define CLOCKS_PER_SEC 1000 -#endif - -#ifndef MSVCRT_TM_DEFINED -#define MSVCRT_TM_DEFINED -struct MSVCRT(tm) { - int tm_sec; - int tm_min; - int tm_hour; - int tm_mday; - int tm_mon; - int tm_year; - int tm_wday; - int tm_yday; - int tm_isdst; -}; -#endif /* MSVCRT_TM_DEFINED */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* FIXME: Must do something for _daylight, _dstbias, _timezone, _tzname */ - - -unsigned _getsystime(struct MSVCRT(tm)*); -unsigned _setsystime(struct MSVCRT(tm)*,unsigned); -char* _strdate(char*); -char* _strtime(char*); -void _tzset(void); - -char* MSVCRT(asctime)(const struct MSVCRT(tm)*); -MSVCRT(clock_t) MSVCRT(clock)(void); -char* MSVCRT(ctime)(const MSVCRT(time_t)*); -double MSVCRT(difftime)(MSVCRT(time_t),MSVCRT(time_t)); -struct MSVCRT(tm)* MSVCRT(gmtime)(const MSVCRT(time_t)*); -struct MSVCRT(tm)* MSVCRT(localtime)(const MSVCRT(time_t)*); -MSVCRT(time_t) MSVCRT(mktime)(struct MSVCRT(tm)*); -size_t MSVCRT(strftime)(char*,size_t,const char*,const struct MSVCRT(tm)*); -MSVCRT(time_t) MSVCRT(time)(MSVCRT(time_t)*); - -#ifndef MSVCRT_WTIME_DEFINED -#define MSVCRT_WTIME_DEFINED -MSVCRT(wchar_t)*_wasctime(const struct MSVCRT(tm)*); -MSVCRT(size_t) wcsftime(MSVCRT(wchar_t)*,MSVCRT(size_t),const MSVCRT(wchar_t)*,const struct MSVCRT(tm)*); -MSVCRT(wchar_t)*_wctime(const MSVCRT(time_t)*); -MSVCRT(wchar_t)*_wstrdate(MSVCRT(wchar_t)*); -MSVCRT(wchar_t)*_wstrtime(MSVCRT(wchar_t)*); -#endif /* MSVCRT_WTIME_DEFINED */ - -#ifdef __cplusplus -} -#endif - -#endif /* __WINE_TIME_H */ diff --git a/reactos/lib/msvcrt/wine/msvcrt/unistd.h b/reactos/lib/msvcrt/wine/msvcrt/unistd.h deleted file mode 100644 index eca5c5ebccf..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/unistd.h +++ /dev/null @@ -1,2 +0,0 @@ -#include <io.h> -#include <process.h> diff --git a/reactos/lib/msvcrt/wine/msvcrt/wchar.h b/reactos/lib/msvcrt/wine/msvcrt/wchar.h deleted file mode 100644 index ae6e5309773..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/wchar.h +++ /dev/null @@ -1,395 +0,0 @@ -/* - * Unicode definitions - * - * Derived from the mingw header written by Colin Peters. - * Modified for Wine use by Jon Griffiths and Francois Gouget. - * This file is in the public domain. - */ -#ifndef __WINE_WCHAR_H -#define __WINE_WCHAR_H -#ifndef __WINE_USE_MSVCRT -#define __WINE_USE_MSVCRT -#endif - -#include <stdarg.h> - -#ifndef MSVCRT -# ifdef USE_MSVCRT_PREFIX -# define MSVCRT(x) MSVCRT_##x -# else -# define MSVCRT(x) x -# endif -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef MSVCRT_WCHAR_T_DEFINED -#define MSVCRT_WCHAR_T_DEFINED -#ifndef __cplusplus -typedef unsigned short MSVCRT(wchar_t); -#endif -#endif - -#ifndef NULL -#ifdef __cplusplus -#define NULL 0 -#else -#define NULL ((void *)0) -#endif -#endif - -#define WCHAR_MIN 0 -#define WCHAR_MAX ((MSVCRT(wchar_t))-1) - -typedef int MSVCRT(mbstate_t); - -#ifndef MSVCRT_SIZE_T_DEFINED -typedef unsigned int MSVCRT(size_t); -#define MSVCRT_SIZE_T_DEFINED -#endif - -#ifndef MSVCRT_WCTYPE_T_DEFINED -typedef MSVCRT(wchar_t) MSVCRT(wint_t); -typedef MSVCRT(wchar_t) MSVCRT(wctype_t); -#define MSVCRT_WCTYPE_T_DEFINED -#endif - -#ifndef _MSC_VER -# ifndef __int64 -# define __int64 long long -# endif -#endif - -#ifndef USE_MSVCRT_PREFIX -# ifndef WEOF -# define WEOF (wint_t)(0xFFFF) -# endif -#else -# ifndef MSVCRT_WEOF -# define MSVCRT_WEOF (MSVCRT_wint_t)(0xFFFF) -# endif -#endif /* USE_MSVCRT_PREFIX */ - -#ifndef MSVCRT_FSIZE_T_DEFINED -typedef unsigned long _fsize_t; -#define MSVCRT_FSIZE_T_DEFINED -#endif - -#ifndef MSVCRT_DEV_T_DEFINED -typedef unsigned int _dev_t; -#define MSVCRT_DEV_T_DEFINED -#endif - -#ifndef MSVCRT_INO_T_DEFINED -typedef unsigned short _ino_t; -#define MSVCRT_INO_T_DEFINED -#endif - -#ifndef MSVCRT_OFF_T_DEFINED -typedef int MSVCRT(_off_t); -#define MSVCRT_OFF_T_DEFINED -#endif - -#ifndef MSVCRT_TIME_T_DEFINED -typedef long MSVCRT(time_t); -#define MSVCRT_TIME_T_DEFINED -#endif - -#ifndef MSVCRT_TM_DEFINED -#define MSVCRT_TM_DEFINED -struct MSVCRT(tm) { - int tm_sec; - int tm_min; - int tm_hour; - int tm_mday; - int tm_mon; - int tm_year; - int tm_wday; - int tm_yday; - int tm_isdst; -}; -#endif /* MSVCRT_TM_DEFINED */ - -#ifndef MSVCRT_FILE_DEFINED -#define MSVCRT_FILE_DEFINED -typedef struct MSVCRT(_iobuf) -{ - char* _ptr; - int _cnt; - char* _base; - int _flag; - int _file; - int _charbuf; - int _bufsiz; - char* _tmpfname; -} MSVCRT(FILE); -#endif /* MSVCRT_FILE_DEFINED */ - -#ifndef MSVCRT_WFINDDATA_T_DEFINED -#define MSVCRT_WFINDDATA_T_DEFINED - -struct _wfinddata_t { - unsigned attrib; - MSVCRT(time_t) time_create; - MSVCRT(time_t) time_access; - MSVCRT(time_t) time_write; - _fsize_t size; - MSVCRT(wchar_t) name[260]; -}; - -struct _wfinddatai64_t { - unsigned attrib; - MSVCRT(time_t) time_create; - MSVCRT(time_t) time_access; - MSVCRT(time_t) time_write; - __int64 size; - MSVCRT(wchar_t) name[260]; -}; - -#endif /* MSVCRT_WFINDDATA_T_DEFINED */ - -#ifndef MSVCRT_STAT_DEFINED -#define MSVCRT_STAT_DEFINED - -struct _stat { - _dev_t st_dev; - _ino_t st_ino; - unsigned short st_mode; - short st_nlink; - short st_uid; - short st_gid; - _dev_t st_rdev; - MSVCRT(_off_t) st_size; - MSVCRT(time_t) st_atime; - MSVCRT(time_t) st_mtime; - MSVCRT(time_t) st_ctime; -}; - -struct _stati64 { - _dev_t st_dev; - _ino_t st_ino; - unsigned short st_mode; - short st_nlink; - short st_uid; - short st_gid; - _dev_t st_rdev; - __int64 st_size; - MSVCRT(time_t) st_atime; - MSVCRT(time_t) st_mtime; - MSVCRT(time_t) st_ctime; -}; -#endif /* MSVCRT_STAT_DEFINED */ - -/* ASCII char classification table - binary compatible */ -#define _UPPER 0x0001 /* C1_UPPER */ -#define _LOWER 0x0002 /* C1_LOWER */ -#define _DIGIT 0x0004 /* C1_DIGIT */ -#define _SPACE 0x0008 /* C1_SPACE */ -#define _PUNCT 0x0010 /* C1_PUNCT */ -#define _CONTROL 0x0020 /* C1_CNTRL */ -#define _BLANK 0x0040 /* C1_BLANK */ -#define _HEX 0x0080 /* C1_XDIGIT */ -#define _LEADBYTE 0x8000 -#define _ALPHA (0x0100|_UPPER|_LOWER) /* (C1_ALPHA|_UPPER|_LOWER) */ - -#ifndef MSVCRT_WCTYPE_DEFINED -#define MSVCRT_WCTYPE_DEFINED -int MSVCRT(is_wctype)(MSVCRT(wint_t),MSVCRT(wctype_t)); -int MSVCRT(isleadbyte)(int); -int MSVCRT(iswalnum)(MSVCRT(wint_t)); -int MSVCRT(iswalpha)(MSVCRT(wint_t)); -int MSVCRT(iswascii)(MSVCRT(wint_t)); -int MSVCRT(iswcntrl)(MSVCRT(wint_t)); -int MSVCRT(iswctype)(MSVCRT(wint_t),MSVCRT(wctype_t)); -int MSVCRT(iswdigit)(MSVCRT(wint_t)); -int MSVCRT(iswgraph)(MSVCRT(wint_t)); -int MSVCRT(iswlower)(MSVCRT(wint_t)); -int MSVCRT(iswprint)(MSVCRT(wint_t)); -int MSVCRT(iswpunct)(MSVCRT(wint_t)); -int MSVCRT(iswspace)(MSVCRT(wint_t)); -int MSVCRT(iswupper)(MSVCRT(wint_t)); -int MSVCRT(iswxdigit)(MSVCRT(wint_t)); -MSVCRT(wchar_t) MSVCRT(towlower)(MSVCRT(wchar_t)); -MSVCRT(wchar_t) MSVCRT(towupper)(MSVCRT(wchar_t)); -#endif /* MSVCRT_WCTYPE_DEFINED */ - -#ifndef MSVCRT_WDIRECT_DEFINED -#define MSVCRT_WDIRECT_DEFINED -int _wchdir(const MSVCRT(wchar_t)*); -MSVCRT(wchar_t)* _wgetcwd(MSVCRT(wchar_t)*,int); -MSVCRT(wchar_t)* _wgetdcwd(int,MSVCRT(wchar_t)*,int); -int _wmkdir(const MSVCRT(wchar_t)*); -int _wrmdir(const MSVCRT(wchar_t)*); -#endif /* MSVCRT_WDIRECT_DEFINED */ - -#ifndef MSVCRT_WIO_DEFINED -#define MSVCRT_WIO_DEFINED -int _waccess(const MSVCRT(wchar_t)*,int); -int _wchmod(const MSVCRT(wchar_t)*,int); -int _wcreat(const MSVCRT(wchar_t)*,int); -long _wfindfirst(const MSVCRT(wchar_t)*,struct _wfinddata_t*); -long _wfindfirsti64(const MSVCRT(wchar_t)*, struct _wfinddatai64_t*); -int _wfindnext(long,struct _wfinddata_t*); -int _wfindnexti64(long, struct _wfinddatai64_t*); -MSVCRT(wchar_t)*_wmktemp(MSVCRT(wchar_t)*); -int _wopen(const MSVCRT(wchar_t)*,int,...); -int _wrename(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*); -int _wsopen(const MSVCRT(wchar_t)*,int,int,...); -int _wunlink(const MSVCRT(wchar_t)*); -#endif /* MSVCRT_WIO_DEFINED */ - -#ifndef MSVCRT_WLOCALE_DEFINED -#define MSVCRT_WLOCALE_DEFINED -MSVCRT(wchar_t)* _wsetlocale(int,const MSVCRT(wchar_t)*); -#endif /* MSVCRT_WLOCALE_DEFINED */ - -#ifndef MSVCRT_WPROCESS_DEFINED -#define MSVCRT_WPROCESS_DEFINED -int _wexecl(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,...); -int _wexecle(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,...); -int _wexeclp(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,...); -int _wexeclpe(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,...); -int _wexecv(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)* const *); -int _wexecve(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)* const *,const MSVCRT(wchar_t)* const *); -int _wexecvp(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)* const *); -int _wexecvpe(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)* const *,const MSVCRT(wchar_t)* const *); -int _wspawnl(int,const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,...); -int _wspawnle(int,const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,...); -int _wspawnlp(int,const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,...); -int _wspawnlpe(int,const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,...); -int _wspawnv(int,const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)* const *); -int _wspawnve(int,const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)* const *,const MSVCRT(wchar_t)* const *); -int _wspawnvp(int,const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)* const *); -int _wspawnvpe(int,const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)* const *,const MSVCRT(wchar_t)* const *); -int _wsystem(const MSVCRT(wchar_t)*); -#endif /* MSVCRT_WPROCESS_DEFINED */ - -#ifndef MSVCRT_WSTAT_DEFINED -#define MSVCRT_WSTAT_DEFINED -int _wstat(const MSVCRT(wchar_t)*,struct _stat*); -int _wstati64(const MSVCRT(wchar_t)*,struct _stati64*); -#endif /* MSVCRT_WSTAT_DEFINED */ - -#ifndef MSVCRT_WSTDIO_DEFINED -#define MSVCRT_WSTDIO_DEFINED -MSVCRT(wint_t) _fgetwchar(void); -MSVCRT(wint_t) _fputwchar(MSVCRT(wint_t)); -MSVCRT(wchar_t)*_getws(MSVCRT(wchar_t)*); -int _putws(const MSVCRT(wchar_t)*); -int _snwprintf(MSVCRT(wchar_t)*,MSVCRT(size_t),const MSVCRT(wchar_t)*,...); -int _vsnwprintf(MSVCRT(wchar_t)*,MSVCRT(size_t),const MSVCRT(wchar_t)*,va_list); -MSVCRT(FILE)* _wfdopen(int,const MSVCRT(wchar_t)*); -MSVCRT(FILE)* _wfopen(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*); -MSVCRT(FILE)* _wfreopen(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,MSVCRT(FILE)*); -MSVCRT(FILE)* _wfsopen(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,int); -void _wperror(const MSVCRT(wchar_t)*); -MSVCRT(FILE)* _wpopen(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*); -int _wremove(const MSVCRT(wchar_t)*); -MSVCRT(wchar_t)*_wtempnam(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*); -MSVCRT(wchar_t)*_wtmpnam(MSVCRT(wchar_t)*); - -MSVCRT(wint_t) MSVCRT(fgetwc)(MSVCRT(FILE)*); -MSVCRT(wchar_t)*MSVCRT(fgetws)(MSVCRT(wchar_t)*,int,MSVCRT(FILE)*); -MSVCRT(wint_t) MSVCRT(fputwc)(MSVCRT(wint_t),MSVCRT(FILE)*); -int MSVCRT(fputws)(const MSVCRT(wchar_t)*,MSVCRT(FILE)*); -int MSVCRT(fwprintf)(MSVCRT(FILE)*,const MSVCRT(wchar_t)*,...); -int MSVCRT(fputws)(const MSVCRT(wchar_t)*,MSVCRT(FILE)*); -int MSVCRT(fwscanf)(MSVCRT(FILE)*,const MSVCRT(wchar_t)*,...); -MSVCRT(wint_t) MSVCRT(getwc)(MSVCRT(FILE)*); -MSVCRT(wint_t) MSVCRT(getwchar)(void); -MSVCRT(wchar_t)*MSVCRT(getws)(MSVCRT(wchar_t)*); -MSVCRT(wint_t) MSVCRT(putwc)(MSVCRT(wint_t),MSVCRT(FILE)*); -MSVCRT(wint_t) MSVCRT(putwchar)(MSVCRT(wint_t)); -int MSVCRT(putws)(const MSVCRT(wchar_t)*); -int MSVCRT(swprintf)(MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,...); -int MSVCRT(swscanf)(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,...); -MSVCRT(wint_t) MSVCRT(ungetwc)(MSVCRT(wint_t),MSVCRT(FILE)*); -int MSVCRT(vfwprintf)(MSVCRT(FILE)*,const MSVCRT(wchar_t)*,va_list); -int MSVCRT(vswprintf)(MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,va_list); -int MSVCRT(vwprintf)(const MSVCRT(wchar_t)*,va_list); -int MSVCRT(wprintf)(const MSVCRT(wchar_t)*,...); -int MSVCRT(wscanf)(const MSVCRT(wchar_t)*,...); -#endif /* MSVCRT_WSTDIO_DEFINED */ - -#ifndef MSVCRT_WSTDLIB_DEFINED -#define MSVCRT_WSTDLIB_DEFINED -MSVCRT(wchar_t)*_itow(int,MSVCRT(wchar_t)*,int); -MSVCRT(wchar_t)*_i64tow(__int64,MSVCRT(wchar_t)*,int); -MSVCRT(wchar_t)*_ltow(long,MSVCRT(wchar_t)*,int); -MSVCRT(wchar_t)*_ui64tow(unsigned __int64,MSVCRT(wchar_t)*,int); -MSVCRT(wchar_t)*_ultow(unsigned long,MSVCRT(wchar_t)*,int); -MSVCRT(wchar_t)*_wfullpath(MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,size_t); -MSVCRT(wchar_t)*_wgetenv(const MSVCRT(wchar_t)*); -void _wmakepath(MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*); -void _wperror(const MSVCRT(wchar_t)*); -int _wputenv(const MSVCRT(wchar_t)*); -void _wsearchenv(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,MSVCRT(wchar_t)*); -void _wsplitpath(const MSVCRT(wchar_t)*,MSVCRT(wchar_t)*,MSVCRT(wchar_t)*,MSVCRT(wchar_t)*,MSVCRT(wchar_t)*); -int _wsystem(const MSVCRT(wchar_t)*); -int _wtoi(const MSVCRT(wchar_t)*); -__int64 _wtoi64(const MSVCRT(wchar_t)*); -long _wtol(const MSVCRT(wchar_t)*); - -MSVCRT(size_t) MSVCRT(mbstowcs)(MSVCRT(wchar_t)*,const char*,MSVCRT(size_t)); -int MSVCRT(mbtowc)(MSVCRT(wchar_t)*,const char*,MSVCRT(size_t)); -double MSVCRT(wcstod)(const MSVCRT(wchar_t)*,MSVCRT(wchar_t)**); -long MSVCRT(wcstol)(const MSVCRT(wchar_t)*,MSVCRT(wchar_t)**,int); -MSVCRT(size_t) MSVCRT(wcstombs)(char*,const MSVCRT(wchar_t)*,MSVCRT(size_t)); -unsigned long MSVCRT(wcstoul)(const MSVCRT(wchar_t)*,MSVCRT(wchar_t)**,int); -int MSVCRT(wctomb)(char*,MSVCRT(wchar_t)); -#endif /* MSVCRT_WSTDLIB_DEFINED */ - -#ifndef MSVCRT_WSTRING_DEFINED -#define MSVCRT_WSTRING_DEFINED -MSVCRT(wchar_t)*_wcsdup(const MSVCRT(wchar_t)*); -int _wcsicmp(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*); -int _wcsicoll(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*); -MSVCRT(wchar_t)*_wcslwr(MSVCRT(wchar_t)*); -int _wcsnicmp(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,MSVCRT(size_t)); -MSVCRT(wchar_t)*_wcsnset(MSVCRT(wchar_t)*,MSVCRT(wchar_t),MSVCRT(size_t)); -MSVCRT(wchar_t)*_wcsrev(MSVCRT(wchar_t)*); -MSVCRT(wchar_t)*_wcsset(MSVCRT(wchar_t)*,MSVCRT(wchar_t)); -MSVCRT(wchar_t)*_wcsupr(MSVCRT(wchar_t)*); - -MSVCRT(wchar_t)*MSVCRT(wcscat)(MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*); -MSVCRT(wchar_t)*MSVCRT(wcschr)(const MSVCRT(wchar_t)*,MSVCRT(wchar_t)); -int MSVCRT(wcscmp)(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*); -int MSVCRT(wcscoll)(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*); -MSVCRT(wchar_t)*MSVCRT(wcscpy)(MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*); -MSVCRT(size_t) MSVCRT(wcscspn)(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*); -MSVCRT(size_t) MSVCRT(wcslen)(const MSVCRT(wchar_t)*); -MSVCRT(wchar_t)*MSVCRT(wcsncat)(MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,MSVCRT(size_t)); -int MSVCRT(wcsncmp)(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,MSVCRT(size_t)); -MSVCRT(wchar_t)*MSVCRT(wcsncpy)(MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,MSVCRT(size_t)); -MSVCRT(wchar_t)*MSVCRT(wcspbrk)(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*); -MSVCRT(wchar_t)*MSVCRT(wcsrchr)(const MSVCRT(wchar_t)*,MSVCRT(wchar_t) wcFor); -MSVCRT(size_t) MSVCRT(wcsspn)(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*); -MSVCRT(wchar_t)*MSVCRT(wcsstr)(const MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*); -MSVCRT(wchar_t)*MSVCRT(wcstok)(MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*); -MSVCRT(size_t) MSVCRT(wcsxfrm)(MSVCRT(wchar_t)*,const MSVCRT(wchar_t)*,MSVCRT(size_t)); -#endif /* MSVCRT_WSTRING_DEFINED */ - -#ifndef MSVCRT_WTIME_DEFINED -#define MSVCRT_WTIME_DEFINED -MSVCRT(wchar_t)*_wasctime(const struct MSVCRT(tm)*); -MSVCRT(size_t) wcsftime(MSVCRT(wchar_t)*,MSVCRT(size_t),const MSVCRT(wchar_t)*,const struct MSVCRT(tm)*); -MSVCRT(wchar_t)*_wctime(const MSVCRT(time_t)*); -MSVCRT(wchar_t)*_wstrdate(MSVCRT(wchar_t)*); -MSVCRT(wchar_t)*_wstrtime(MSVCRT(wchar_t)*); -#endif /* MSVCRT_WTIME_DEFINED */ - -MSVCRT(wchar_t) btowc(int); -MSVCRT(size_t) mbrlen(const char *,MSVCRT(size_t),MSVCRT(mbstate_t)*); -MSVCRT(size_t) mbrtowc(MSVCRT(wchar_t)*,const char*,MSVCRT(size_t),MSVCRT(mbstate_t)*); -MSVCRT(size_t) mbsrtowcs(MSVCRT(wchar_t)*,const char**,MSVCRT(size_t),MSVCRT(mbstate_t)*); -MSVCRT(size_t) wcrtomb(char*,MSVCRT(wchar_t),MSVCRT(mbstate_t)*); -MSVCRT(size_t) wcsrtombs(char*,const MSVCRT(wchar_t)**,MSVCRT(size_t),MSVCRT(mbstate_t)*); -int wctob(MSVCRT(wint_t)); - -#ifdef __cplusplus -} -#endif - -#endif /* __WINE_WCHAR_H */ diff --git a/reactos/lib/msvcrt/wine/msvcrt/wctype.h b/reactos/lib/msvcrt/wine/msvcrt/wctype.h deleted file mode 100644 index fc0fdd106c2..00000000000 --- a/reactos/lib/msvcrt/wine/msvcrt/wctype.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Unicode definitions - * - * Copyright 2000 Francois Gouget. - * - * 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_WCTYPE_H -#define __WINE_WCTYPE_H -#ifndef __WINE_USE_MSVCRT -#define __WINE_USE_MSVCRT -#endif - -#ifndef MSVCRT -# ifdef USE_MSVCRT_PREFIX -# define MSVCRT(x) MSVCRT_##x -# else -# define MSVCRT(x) x -# endif -#endif - -#ifndef MSVCRT_WCHAR_T_DEFINED -#define MSVCRT_WCHAR_T_DEFINED -#ifndef __cplusplus -typedef unsigned short MSVCRT(wchar_t); -#endif -#endif - -/* ASCII char classification table - binary compatible */ -#define _UPPER 0x0001 /* C1_UPPER */ -#define _LOWER 0x0002 /* C1_LOWER */ -#define _DIGIT 0x0004 /* C1_DIGIT */ -#define _SPACE 0x0008 /* C1_SPACE */ -#define _PUNCT 0x0010 /* C1_PUNCT */ -#define _CONTROL 0x0020 /* C1_CNTRL */ -#define _BLANK 0x0040 /* C1_BLANK */ -#define _HEX 0x0080 /* C1_XDIGIT */ -#define _LEADBYTE 0x8000 -#define _ALPHA (0x0100|_UPPER|_LOWER) /* (C1_ALPHA|_UPPER|_LOWER) */ - -#ifndef USE_MSVCRT_PREFIX -# ifndef WEOF -# define WEOF (wint_t)(0xFFFF) -# endif -#else -# ifndef MSVCRT_WEOF -# define MSVCRT_WEOF (MSVCRT_wint_t)(0xFFFF) -# endif -#endif /* USE_MSVCRT_PREFIX */ - -#ifndef MSVCRT_WCTYPE_T_DEFINED -typedef MSVCRT(wchar_t) MSVCRT(wint_t); -typedef MSVCRT(wchar_t) MSVCRT(wctype_t); -#define MSVCRT_WCTYPE_T_DEFINED -#endif - -/* FIXME: there's something to do with __p__pctype and __p__pwctype */ - - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef MSVCRT_WCTYPE_DEFINED -#define MSVCRT_WCTYPE_DEFINED -int MSVCRT(is_wctype)(MSVCRT(wint_t),MSVCRT(wctype_t)); -int MSVCRT(isleadbyte)(int); -int MSVCRT(iswalnum)(MSVCRT(wint_t)); -int MSVCRT(iswalpha)(MSVCRT(wint_t)); -int MSVCRT(iswascii)(MSVCRT(wint_t)); -int MSVCRT(iswcntrl)(MSVCRT(wint_t)); -int MSVCRT(iswctype)(MSVCRT(wint_t),MSVCRT(wctype_t)); -int MSVCRT(iswdigit)(MSVCRT(wint_t)); -int MSVCRT(iswgraph)(MSVCRT(wint_t)); -int MSVCRT(iswlower)(MSVCRT(wint_t)); -int MSVCRT(iswprint)(MSVCRT(wint_t)); -int MSVCRT(iswpunct)(MSVCRT(wint_t)); -int MSVCRT(iswspace)(MSVCRT(wint_t)); -int MSVCRT(iswupper)(MSVCRT(wint_t)); -int MSVCRT(iswxdigit)(MSVCRT(wint_t)); -MSVCRT(wchar_t) MSVCRT(towlower)(MSVCRT(wchar_t)); -MSVCRT(wchar_t) MSVCRT(towupper)(MSVCRT(wchar_t)); -#endif /* MSVCRT_WCTYPE_DEFINED */ - -#ifdef __cplusplus -} -#endif - -#endif /* __WINE_WCTYPE_H */ diff --git a/reactos/lib/msvcrt/wine/msvcrt/process.h b/reactos/lib/msvcrt/wine/process.h similarity index 100% rename from reactos/lib/msvcrt/wine/msvcrt/process.h rename to reactos/lib/msvcrt/wine/process.h diff --git a/reactos/lib/msvcrt/wine/msvcrt/stdlib.h b/reactos/lib/msvcrt/wine/stdlib.h similarity index 100% rename from reactos/lib/msvcrt/wine/msvcrt/stdlib.h rename to reactos/lib/msvcrt/wine/stdlib.h diff --git a/reactos/lib/msvcrt/wine/msvcrt/string.h b/reactos/lib/msvcrt/wine/string.h similarity index 100% rename from reactos/lib/msvcrt/wine/msvcrt/string.h rename to reactos/lib/msvcrt/wine/string.h diff --git a/reactos/lib/msvcrt/wine/thread.c b/reactos/lib/msvcrt/wine/thread.c index d1158b40eea..ee266122195 100644 --- a/reactos/lib/msvcrt/wine/thread.c +++ b/reactos/lib/msvcrt/wine/thread.c @@ -22,7 +22,7 @@ #include "msvcrt.h" #include "msvcrt/malloc.h" -#include "msvcrt/process.h" +#include "process.h" #include "wine/debug.h" From 82cff84c9ae79c1b7ea4f2ef24f56b7e584084ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Fri, 27 Feb 2004 23:11:32 +0000 Subject: [PATCH 0228/1463] Use *NameLength before overwriting it svn path=/trunk/; revision=8429 --- reactos/ntoskrnl/rtl/atom.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/rtl/atom.c b/reactos/ntoskrnl/rtl/atom.c index 5add7778d7e..d4589f31e84 100644 --- a/reactos/ntoskrnl/rtl/atom.c +++ b/reactos/ntoskrnl/rtl/atom.c @@ -1,4 +1,4 @@ -/* $Id: atom.c,v 1.8 2003/12/07 10:31:21 navaraf Exp $ +/* $Id: atom.c,v 1.9 2004/02/27 23:11:32 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -641,13 +641,14 @@ RtlQueryAtomInAtomTable(IN PRTL_ATOM_TABLE AtomTable, if (NameLength != NULL) { - *NameLength = AtomEntry->Name.Length; if (AtomName != NULL && *NameLength >= AtomEntry->Name.Length) { + *NameLength = AtomEntry->Name.Length; memcpy(AtomName, AtomEntry->Name.Buffer, AtomEntry->Name.Length); } else { + *NameLength = AtomEntry->Name.Length; RtlpUnlockAtomTable(AtomTable); return STATUS_BUFFER_TOO_SMALL; } From 9ece8f94518bd82deb96441b80b811eca3e36379 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sat, 28 Feb 2004 00:44:28 +0000 Subject: [PATCH 0229/1463] don't hold more than one WM_MOUSEMOVE message at the same time in the message queue svn path=/trunk/; revision=8430 --- reactos/subsys/win32k/include/msgqueue.h | 2 + reactos/subsys/win32k/ntuser/msgqueue.c | 86 +++++++++++++++++++----- 2 files changed, 72 insertions(+), 16 deletions(-) diff --git a/reactos/subsys/win32k/include/msgqueue.h b/reactos/subsys/win32k/include/msgqueue.h index ae43ea642c7..8b354847158 100644 --- a/reactos/subsys/win32k/include/msgqueue.h +++ b/reactos/subsys/win32k/include/msgqueue.h @@ -51,6 +51,8 @@ typedef struct _USER_MESSAGE_QUEUE FAST_MUTEX HardwareLock; /* Lock for the queue. */ FAST_MUTEX Lock; + /* Pointer to the current WM_MOUSEMOVE message */ + PUSER_MESSAGE MouseMoveMsg; /* True if a WM_QUIT message is pending. */ BOOLEAN QuitPosted; /* The quit exit code. */ diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index 81785553a16..cbc38e4ec0d 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.73 2004/02/26 22:23:54 weiden Exp $ +/* $Id: msgqueue.c,v 1.74 2004/02/28 00:44:28 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -242,8 +242,9 @@ BOOL STATIC STDCALL MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, PUSER_MESSAGE Message, BOOL Remove, PBOOL Freed, PWINDOW_OBJECT ScopeWin, PUSHORT HitTest, - PPOINT ScreenPoint, PBOOL MouseClick, BOOL FromGlobalQueue) + PPOINT ScreenPoint, BOOL FromGlobalQueue) { + PUSER_MESSAGE_QUEUE ThreadQueue; USHORT Msg = Message->Msg.message; PWINDOW_OBJECT CaptureWin, Window = NULL; POINT Point; @@ -349,8 +350,9 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, *Freed = TRUE; return(FALSE); } - - if (Window->MessageQueue != PsGetWin32Thread()->MessageQueue) + + ThreadQueue = PsGetWin32Thread()->MessageQueue; + if (Window->MessageQueue != ThreadQueue) { if (! FromGlobalQueue) { @@ -359,17 +361,38 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, * to move it to a different queue, perhaps because a new window * was created which now covers the screen area previously taken * by another window. To move it, we need to take it out of the - * old queue. Note that we're already holding the lock mutes of the + * old queue. Note that we're already holding the lock mutexes of the * old queue */ RemoveEntryList(&Message->ListEntry); + + /* remove the pointer for the current WM_MOUSEMOVE message in case we + just removed it */ + if(ThreadQueue->MouseMoveMsg == Message) + { + ThreadQueue->MouseMoveMsg = NULL; + } } IntLockHardwareMessageQueue(Window->MessageQueue); - InsertTailList(&Window->MessageQueue->HardwareMessagesListHead, - &Message->ListEntry); + if((Message->Msg.message == WM_MOUSEMOVE) && Window->MessageQueue->MouseMoveMsg) + { + /* we do not hold more than one WM_MOUSEMOVE message in the queue */ + Window->MessageQueue->MouseMoveMsg->Msg = Message->Msg; + ExFreePool(Message); + *Freed = TRUE; + } + else + { + InsertTailList(&Window->MessageQueue->HardwareMessagesListHead, + &Message->ListEntry); + if(Message->Msg.message == WM_MOUSEMOVE) + { + Window->MessageQueue->MouseMoveMsg = Message; + } + *Freed = FALSE; + } IntUnLockHardwareMessageQueue(Window->MessageQueue); KeSetEvent(&Window->MessageQueue->NewMessages, IO_NO_INCREMENT, FALSE); IntReleaseWindowObject(Window); - *Freed = FALSE; return(FALSE); } @@ -377,12 +400,26 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, !IntIsChildWindow(hWnd, Window->Self)) { IntLockHardwareMessageQueue(Window->MessageQueue); - InsertTailList(&Window->MessageQueue->HardwareMessagesListHead, - &Message->ListEntry); + if((Message->Msg.message == WM_MOUSEMOVE) && Window->MessageQueue->MouseMoveMsg) + { + /* we do not hold more than one WM_MOUSEMOVE message in the queue */ + Window->MessageQueue->MouseMoveMsg->Msg = Message->Msg; + ExFreePool(Message); + *Freed = TRUE; + } + else + { + InsertTailList(&Window->MessageQueue->HardwareMessagesListHead, + &Message->ListEntry); + if(Message->Msg.message == WM_MOUSEMOVE) + { + Window->MessageQueue->MouseMoveMsg = Message; + } + *Freed = FALSE; + } IntUnLockHardwareMessageQueue(Window->MessageQueue); KeSetEvent(&Window->MessageQueue->NewMessages, IO_NO_INCREMENT, FALSE); IntReleaseWindowObject(Window); - *Freed = FALSE; return(FALSE); } @@ -452,7 +489,6 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, USHORT HitTest; POINT ScreenPoint; BOOL Accept, Freed; - BOOL MouseClick; PLIST_ENTRY CurrentEntry; PWINDOW_OBJECT DesktopWindow; PVOID WaitObjects[2]; @@ -493,12 +529,16 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, Accept = MsqTranslateMouseMessage(hWnd, FilterLow, FilterHigh, Current, Remove, &Freed, DesktopWindow, &HitTest, - &ScreenPoint, &MouseClick, FALSE); + &ScreenPoint, FALSE); if (Accept) { if (Remove) { RemoveEntryList(&Current->ListEntry); + if(MessageQueue->MouseMoveMsg == Current) + { + MessageQueue->MouseMoveMsg = NULL; + } } IntUnLockHardwareMessageQueue(MessageQueue); IntUnLockSystemHardwareMessageQueueLock(FALSE); @@ -560,7 +600,7 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, Accept = MsqTranslateMouseMessage(hWnd, FilterLow, FilterHigh, Current, Remove, &Freed, DesktopWindow, &HitTest, - &ScreenPoint, &MouseClick, TRUE); + &ScreenPoint, TRUE); if (Accept) { /* Check for no more messages in the system queue. */ @@ -579,8 +619,22 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, if (!Remove) { IntLockHardwareMessageQueue(MessageQueue); - InsertTailList(&MessageQueue->HardwareMessagesListHead, - &Current->ListEntry); + if((Current->Msg.message == WM_MOUSEMOVE) && MessageQueue->MouseMoveMsg) + { + /* we do not hold more than one WM_MOUSEMOVE message in the queue */ + MessageQueue->MouseMoveMsg->Msg = Current->Msg; + *Message = MessageQueue->MouseMoveMsg; + ExFreePool(Current); + } + else + { + InsertTailList(&MessageQueue->HardwareMessagesListHead, + &Current->ListEntry); + if(Current->Msg.message == WM_MOUSEMOVE) + { + MessageQueue->MouseMoveMsg = Current; + } + } IntUnLockHardwareMessageQueue(MessageQueue); } IntUnLockSystemHardwareMessageQueueLock(FALSE); From 44c383eeefc51e8aa87d10a10fe27bc2a3b3fe7f Mon Sep 17 00:00:00 2001 From: Richard Campbell <betam4x@gmail.com> Date: Sat, 28 Feb 2004 03:02:08 +0000 Subject: [PATCH 0230/1463] temporary workaround for a font issue in win32k...negative font heights aren't handled properly. svn path=/trunk/; revision=8431 --- reactos/lib/user32/misc/desktop.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/reactos/lib/user32/misc/desktop.c b/reactos/lib/user32/misc/desktop.c index 84aeef7927d..5c5f753b319 100644 --- a/reactos/lib/user32/misc/desktop.c +++ b/reactos/lib/user32/misc/desktop.c @@ -1,4 +1,4 @@ -/* $Id: desktop.c,v 1.29 2004/02/16 07:25:01 rcampbell Exp $ +/* $Id: desktop.c,v 1.30 2004/02/28 03:02:08 rcampbell Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -15,7 +15,7 @@ #include <rosrtl/devmode.h> #include <rosrtl/logfont.h> #include <malloc.h> - +#include <math.h> /* * @implemented @@ -99,6 +99,12 @@ BOOL IntGetFontMetricSetting(LPCWSTR lpKey, PLOGFONTW font) { if ( RegQueryValueExW(hKey, lpKey, NULL, &dwType, (LPBYTE)font, &dwSize) == ERROR_SUCCESS ) bRet = TRUE; + + if (font->lfHeight < 0) + { + DbgPrint("WARNING! WARNING! WARNING! Ugly hack alert: ROS doesn't handle pixel sizes for fonts correctly. As a result we must convert to point sizes.\n"); + font->lfHeight = abs(font->lfHeight); + } } RegCloseKey(hKey); @@ -127,7 +133,7 @@ SystemParametersInfoW(UINT uiAction, IntGetFontMetricSetting(L"SmCaptionFont", &pMetrics.lfSmCaptionFont); IntGetFontMetricSetting(L"MenuFont", &pMetrics.lfMenuFont); IntGetFontMetricSetting(L"StatusFont", &pMetrics.lfStatusFont); - IntGetFontMetricSetting(L"MessageFont", &pMetrics.lfStatusFont); + IntGetFontMetricSetting(L"MessageFont", &pMetrics.lfMessageFont); IntGetFontMetricSetting(L"IconFont", &IconFont); pMetrics.iBorderWidth = 1; @@ -160,6 +166,7 @@ SystemParametersInfoW(UINT uiAction, { return FALSE; } + DbgPrint("FontName: %S, Size: %i\n",pMetrics.lfMessageFont.lfFaceName, pMetrics.lfMessageFont.lfHeight); memcpy(pvParam, (PVOID)&pMetrics, sizeof(NONCLIENTMETRICSW)); return TRUE; } From ae26b09eb5f4150fd851ae6136667a00b2dc1e9a Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sat, 28 Feb 2004 10:28:09 +0000 Subject: [PATCH 0231/1463] implemented 'minimize all' feature svn path=/trunk/; revision=8433 --- .../system/explorer/desktop/desktop.cpp | 34 +++++++++++++++++-- reactos/subsys/system/explorer/globals.h | 4 +++ .../system/explorer/taskbar/desktopbar.cpp | 4 ++- 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/system/explorer/desktop/desktop.cpp b/reactos/subsys/system/explorer/desktop/desktop.cpp index a307c3bd6ab..5e1ebca9edd 100644 --- a/reactos/subsys/system/explorer/desktop/desktop.cpp +++ b/reactos/subsys/system/explorer/desktop/desktop.cpp @@ -158,7 +158,7 @@ int DesktopThread::Run() #else // _USE_HDESK -static BOOL CALLBACK DesktopEnumFct(HWND hwnd, LPARAM lparam) +static BOOL CALLBACK SwitchDesktopEnumFct(HWND hwnd, LPARAM lparam) { WindowSet& windows = *(WindowSet*)lparam; @@ -181,7 +181,7 @@ void Desktops::SwitchToDesktop(int idx) WindowSet& windows = old_desktop._windows; windows.clear(); - EnumWindows(DesktopEnumFct, (LPARAM)&windows); + EnumWindows(SwitchDesktopEnumFct, (LPARAM)&windows); // hide all windows we found for(WindowSet::iterator it=windows.begin(); it!=windows.end(); ++it) @@ -199,6 +199,36 @@ void Desktops::SwitchToDesktop(int idx) #endif // _USE_HDESK +static BOOL CALLBACK MinimizeDesktopEnumFct(HWND hwnd, LPARAM lparam) +{ + list<MinimizeStruct>& minimized = *(list<MinimizeStruct>*)lparam; + + if (IsWindowVisible(hwnd)) + if (hwnd!=g_Globals._hwndDesktopBar && hwnd!=g_Globals._hwndDesktop) + if (!IsIconic(hwnd)) { + minimized.push_back(MinimizeStruct(hwnd, GetWindowStyle(hwnd))); + ShowWindowAsync(hwnd, SW_MINIMIZE); + } + + return TRUE; +} + + /// minimize/restore all windows on the desktop +void Desktops::ToggleMinimize() +{ + list<MinimizeStruct>& minimized = (*this)[_current_desktop]._minimized; + + if (minimized.empty()) { + EnumWindows(MinimizeDesktopEnumFct, (LPARAM)&minimized); + } else { + for(list<MinimizeStruct>::const_iterator it=minimized.begin(); it!=minimized.end(); ++it) + ShowWindowAsync(it->first, it->second&WS_MAXIMIZE? SW_MAXIMIZE: SW_RESTORE); + + minimized.clear(); + } +} + + BOOL IsAnyDesktopRunning() { HINSTANCE hUser32 = GetModuleHandle(TEXT("user32")); diff --git a/reactos/subsys/system/explorer/globals.h b/reactos/subsys/system/explorer/globals.h index aff1290747b..d46154429b3 100644 --- a/reactos/subsys/system/explorer/globals.h +++ b/reactos/subsys/system/explorer/globals.h @@ -177,9 +177,12 @@ protected: #else +typedef pair<HWND, DWORD> MinimizeStruct; + struct Desktop { set<HWND> _windows; + list<MinimizeStruct> _minimized; }; typedef Desktop DesktopRef; @@ -195,6 +198,7 @@ struct Desktops : public vector<DesktopRef> void init(); void SwitchToDesktop(int idx); + void ToggleMinimize(); #ifdef _USE_HDESK DesktopRef& get_current_Desktop() {return (*this)[_current_desktop];} diff --git a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp index c546c838493..0b041e30834 100644 --- a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp @@ -131,7 +131,9 @@ LRESULT DesktopBar::Init(LPCREATESTRUCT pcs) rbBand.cxMinChild = 0; rbBand.cyMinChild = HIWORD(SendMessage(_hwndQuickLaunch, TB_GETBUTTONSIZE, 0, 0)) + 2; rbBand.cx = 250; +LOG(TEXT("before RB_INSERTBAND")); SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand); +LOG(TEXT("after RB_INSERTBAND")); rbBand.lpText = TEXT("Taskbar"); rbBand.hwndChild = _hwndTaskBar; @@ -280,7 +282,7 @@ int DesktopBar::Command(int id, int code) break; case ID_MINIMIZE_ALL: - ; ///@todo minimize/restore all windows on the desktop + g_Globals._desktops.ToggleMinimize(); break; case ID_EXPLORE: From 0b2f62bcf5f37d61ea15836ba0e6d7c3908106d5 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sat, 28 Feb 2004 10:57:01 +0000 Subject: [PATCH 0232/1463] another foreground window fix for clicks on notification icons svn path=/trunk/; revision=8434 --- reactos/subsys/system/explorer/taskbar/traynotify.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index 8d8670c3f70..7b2de60d63f 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -185,7 +185,13 @@ LRESULT NotifyArea::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) // Notify the message if the owner is still alive if (IsWindow(entry._hWnd)) { - if (nmsg == WM_MOUSEMOVE) // avoid to call blocking SendMessage() for merely moving the mouse over icons + if (nmsg == WM_MOUSEMOVE || // avoid to call blocking SendMessage() for merely moving the mouse over icons + nmsg == WM_LBUTTONDOWN || // Some programs need PostMessage() instead of SendMessage(). + nmsg == WM_MBUTTONDOWN || // So call SendMessage() only for BUTTONUP and BLCLK messages +#ifdef WM_XBUTTONDOWN + nmsg == WM_XBUTTONDOWN || +#endif + nmsg == WM_RBUTTONDOWN) PostMessage(entry._hWnd, entry._uCallbackMessage, entry._uID, nmsg); else { // allow SetForegroundWindow() in client process From bba7724b2d628200a5fcc269336044666a2a37b7 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Sat, 28 Feb 2004 11:30:59 +0000 Subject: [PATCH 0233/1463] Complete user profile creation. Add LoadUserProfileW() stub. svn path=/trunk/; revision=8436 --- reactos/lib/userenv/profile.c | 25 +++- reactos/lib/userenv/registry.c | 250 +++++++++++++++++++++++++++++++- reactos/lib/userenv/userenv.def | 1 + reactos/lib/userenv/userenv.edf | 1 + 4 files changed, 273 insertions(+), 4 deletions(-) diff --git a/reactos/lib/userenv/profile.c b/reactos/lib/userenv/profile.c index 1ea655aad8e..d7d927a5a4c 100644 --- a/reactos/lib/userenv/profile.c +++ b/reactos/lib/userenv/profile.c @@ -1,4 +1,4 @@ -/* $Id: profile.c,v 1.4 2004/01/23 10:39:22 ekohl Exp $ +/* $Id: profile.c,v 1.5 2004/02/28 11:30:59 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -90,6 +90,7 @@ CreateUserProfileW (PSID Sid, HKEY hKey; NTSTATUS Status; + DPRINT ("CreateUserProfileW() called\n"); if (RegOpenKeyExW (HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList", @@ -269,6 +270,8 @@ CreateUserProfileW (PSID Sid, RtlFreeUnicodeString (&SidString); + DPRINT ("CreateUserProfileW() done\n"); + return TRUE; } @@ -507,4 +510,24 @@ GetUserProfileDirectoryW (HANDLE hToken, return GetDefaultUserProfileDirectoryW (lpProfileDir, lpcchSize); } + +BOOL WINAPI +LoadUserProfileW (HANDLE hToken, + LPPROFILEINFOW lpProfileInfo) +{ + + /* Check profile info */ + if (lpProfileInfo->dwSize != sizeof(PROFILEINFOW) || + lpProfileInfo->lpUserName == NULL || + lpProfileInfo->lpUserName[0] == 0) + { + SetLastError (ERROR_INVALID_PARAMETER); + return FALSE; + } + + /* FIXME: load the profile */ + + return TRUE; +} + /* EOF */ diff --git a/reactos/lib/userenv/registry.c b/reactos/lib/userenv/registry.c index 814d8bb2e91..65f9ec99ebe 100644 --- a/reactos/lib/userenv/registry.c +++ b/reactos/lib/userenv/registry.c @@ -1,4 +1,4 @@ -/* $Id: registry.c,v 1.1 2004/01/16 15:31:53 ekohl Exp $ +/* $Id: registry.c,v 1.2 2004/02/28 11:30:59 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -16,11 +16,255 @@ /* FUNCTIONS ***************************************************************/ -BOOL -CreateUserHive (LPCWSTR lpKeyName) +static BOOL +CopyKey (HKEY hDstKey, + HKEY hSrcKey) { + FILETIME LastWrite; + DWORD dwSubKeys; + DWORD dwValues; + DWORD dwType; + DWORD dwMaxSubKeyNameLength; + DWORD dwSubKeyNameLength; + DWORD dwMaxValueNameLength; + DWORD dwValueNameLength; + DWORD dwMaxValueLength; + DWORD dwValueLength; + DWORD dwDisposition; + DWORD i; + LPWSTR lpNameBuffer; + LPBYTE lpDataBuffer; + HKEY hDstSubKey; + HKEY hSrcSubKey; + + DPRINT ("CopyKey() called \n"); + + if (RegQueryInfoKey (hSrcKey, + NULL, + NULL, + NULL, + &dwSubKeys, + &dwMaxSubKeyNameLength, + NULL, + &dwValues, + &dwMaxValueNameLength, + &dwMaxValueLength, + NULL, + NULL)) + { + DPRINT1("Error: %lu\n", GetLastError ()); + return FALSE; + } + + DPRINT ("dwSubKeys %lu\n", dwSubKeys); + DPRINT ("dwMaxSubKeyNameLength %lu\n", dwMaxSubKeyNameLength); + DPRINT ("dwValues %lu\n", dwValues); + DPRINT ("dwMaxValueNameLength %lu\n", dwMaxValueNameLength); + DPRINT ("dwMaxValueLength %lu\n", dwMaxValueLength); + + /* Copy subkeys */ + if (dwSubKeys != 0) + { + lpNameBuffer = HeapAlloc (GetProcessHeap (), + 0, + dwMaxSubKeyNameLength * sizeof(WCHAR)); + if (lpNameBuffer == NULL) + { + DPRINT1("Buffer allocation failed\n"); + return FALSE; + } + + for (i = 0; i < dwSubKeys; i++) + { + dwSubKeyNameLength = dwMaxSubKeyNameLength; + if (RegEnumKeyExW (hSrcKey, + i, + lpNameBuffer, + &dwSubKeyNameLength, + NULL, + NULL, + NULL, + &LastWrite)) + { + DPRINT1("Subkey enumeration failed (Error %lu)\n", GetLastError()); + HeapFree (GetProcessHeap (), + 0, + lpNameBuffer); + return FALSE; + } + + if (RegCreateKeyExW (hDstKey, + lpNameBuffer, + 0, + NULL, + REG_OPTION_NON_VOLATILE, + KEY_WRITE, + NULL, + &hDstSubKey, + &dwDisposition)) + { + DPRINT1("Subkey creation failed (Error %lu)\n", GetLastError()); + HeapFree (GetProcessHeap (), + 0, + lpNameBuffer); + return FALSE; + } + + if (RegOpenKeyExW (hSrcKey, + lpNameBuffer, + 0, + KEY_READ, + &hSrcSubKey)) + { + DPRINT1("Error: %lu\n", GetLastError()); + RegCloseKey (hDstSubKey); + HeapFree (GetProcessHeap (), + 0, + lpNameBuffer); + return FALSE; + } + + if (!CopyKey (hDstSubKey, + hSrcSubKey)) + { + DPRINT1("Error: %lu\n", GetLastError()); + RegCloseKey (hSrcSubKey); + RegCloseKey (hDstSubKey); + HeapFree (GetProcessHeap (), + 0, + lpNameBuffer); + return FALSE; + } + + RegCloseKey (hSrcSubKey); + RegCloseKey (hDstSubKey); + } + + HeapFree (GetProcessHeap (), + 0, + lpNameBuffer); + } + + /* Copy values */ + if (dwValues != 0) + { + lpNameBuffer = HeapAlloc (GetProcessHeap (), + 0, + dwMaxValueNameLength * sizeof(WCHAR)); + if (lpNameBuffer == NULL) + { + DPRINT1("Buffer allocation failed\n"); + return FALSE; + } + + lpDataBuffer = HeapAlloc (GetProcessHeap (), + 0, + dwMaxValueLength); + if (lpDataBuffer == NULL) + { + DPRINT1("Buffer allocation failed\n"); + HeapFree (GetProcessHeap (), + 0, + lpNameBuffer); + return FALSE; + } + + for (i = 0; i < dwValues; i++) + { + dwValueNameLength = dwMaxValueNameLength; + dwValueLength = dwMaxValueLength; + if (RegEnumValueW (hSrcKey, + i, + lpNameBuffer, + &dwValueNameLength, + NULL, + &dwType, + lpDataBuffer, + &dwValueLength)) + { + DPRINT1("Error: %lu\n", GetLastError()); + HeapFree (GetProcessHeap (), + 0, + lpDataBuffer); + HeapFree (GetProcessHeap (), + 0, + lpNameBuffer); + return FALSE; + } + + if (RegSetValueEx (hDstKey, + lpNameBuffer, + 0, + dwType, + lpDataBuffer, + dwValueLength)) + { + DPRINT1("Error: %lu\n", GetLastError()); + HeapFree (GetProcessHeap (), + 0, + lpDataBuffer); + HeapFree (GetProcessHeap (), + 0, + lpNameBuffer); + return FALSE; + } + } + + HeapFree (GetProcessHeap (), + 0, + lpDataBuffer); + + HeapFree (GetProcessHeap (), + 0, + lpNameBuffer); + } + + DPRINT ("CopyKey() done \n"); return TRUE; } + +BOOL +CreateUserHive (LPCWSTR lpKeyName) +{ + HKEY hDefaultKey; + HKEY hUserKey; + BOOL bResult; + + DPRINT ("CreateUserHive(%S) called\n", lpKeyName); + + + if (RegOpenKeyExW (HKEY_USERS, + L".Default", + 0, + KEY_READ, + &hDefaultKey)) + { + DPRINT1("Error: %lu\n", GetLastError()); + return FALSE; + } + + if (RegOpenKeyExW (HKEY_USERS, + lpKeyName, + 0, + KEY_ALL_ACCESS, + &hUserKey)) + { + DPRINT1("Error: %lu\n", GetLastError()); + RegCloseKey (hDefaultKey); + return FALSE; + } + + bResult = CopyKey (hUserKey, + hDefaultKey); + + RegCloseKey (hUserKey); + RegCloseKey (hDefaultKey); + + DPRINT ("CreateUserHive() done\n"); + + return bResult; +} + /* EOF */ diff --git a/reactos/lib/userenv/userenv.def b/reactos/lib/userenv/userenv.def index 76a7161dc9f..7a44c804dea 100644 --- a/reactos/lib/userenv/userenv.def +++ b/reactos/lib/userenv/userenv.def @@ -6,4 +6,5 @@ GetDefaultUserProfileDirectoryW@8 GetProfilesDirectoryW@8 GetUserProfileDirectoryW@12 CreateUserProfileW@8 +LoadUserProfileW@8 ;EOF diff --git a/reactos/lib/userenv/userenv.edf b/reactos/lib/userenv/userenv.edf index b2db3b48664..806a4469c11 100644 --- a/reactos/lib/userenv/userenv.edf +++ b/reactos/lib/userenv/userenv.edf @@ -6,4 +6,5 @@ GetDefaultUserProfileDirectoryW=GetDefaultUserProfileDirectoryW@8 GetProfilesDirectoryW=GetProfilesDirectoryW@8 GetUserProfileDirectoryW=GetUserProfileDirectoryW@12 CreateUserProfileW=CreateUserProfileW@8 +LoadUserProfileW=LoadUserProfileW@8 ;EOF From 9399bfa9f2af5fdd77bba1b577adc3aa7280c8f0 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sat, 28 Feb 2004 13:45:33 +0000 Subject: [PATCH 0234/1463] remember last foreground window when switching desktops svn path=/trunk/; revision=8438 --- reactos/subsys/system/explorer/doc/changes.txt | 1 + reactos/subsys/system/explorer/globals.h | 1 + reactos/subsys/system/explorer/taskbar/taskbar.h | 3 +++ 3 files changed, 5 insertions(+) diff --git a/reactos/subsys/system/explorer/doc/changes.txt b/reactos/subsys/system/explorer/doc/changes.txt index 5c9be3f46fc..b686e73ee29 100644 --- a/reactos/subsys/system/explorer/doc/changes.txt +++ b/reactos/subsys/system/explorer/doc/changes.txt @@ -66,3 +66,4 @@ If you search for more information, look into the CVS repository. 23.02.2004 m. fuchs start menu navigation using first characters of entry names fixes for leaking GDI handles 25.02.2004 m. fuchs rebar control for desktop bar +28.02.2004 m. fuchs "minimize all" functionality diff --git a/reactos/subsys/system/explorer/globals.h b/reactos/subsys/system/explorer/globals.h index d46154429b3..8e0c80eba4f 100644 --- a/reactos/subsys/system/explorer/globals.h +++ b/reactos/subsys/system/explorer/globals.h @@ -182,6 +182,7 @@ typedef pair<HWND, DWORD> MinimizeStruct; struct Desktop { set<HWND> _windows; + WindowHandle _hwndForeground; list<MinimizeStruct> _minimized; }; typedef Desktop DesktopRef; diff --git a/reactos/subsys/system/explorer/taskbar/taskbar.h b/reactos/subsys/system/explorer/taskbar/taskbar.h index b99c7bf8249..9f0d831fed9 100644 --- a/reactos/subsys/system/explorer/taskbar/taskbar.h +++ b/reactos/subsys/system/explorer/taskbar/taskbar.h @@ -45,6 +45,9 @@ #define IDW_TASKTOOLBAR 100 +#define PM_GET_LAST_ACTIVE (WM_APP+0x1D) + + /// internal task bar button management entry struct TaskBarEntry { From fd2602afbbed974e7f78f38aacc5d3f2533c8756 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sat, 28 Feb 2004 13:45:33 +0000 Subject: [PATCH 0235/1463] remember last foreground window when switching desktops svn path=/trunk/; revision=8439 --- reactos/subsys/system/explorer/desktop/desktop.cpp | 4 ++++ reactos/subsys/system/explorer/doc/TODO.txt | 5 ++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/system/explorer/desktop/desktop.cpp b/reactos/subsys/system/explorer/desktop/desktop.cpp index 5e1ebca9edd..5c076101b85 100644 --- a/reactos/subsys/system/explorer/desktop/desktop.cpp +++ b/reactos/subsys/system/explorer/desktop/desktop.cpp @@ -182,6 +182,7 @@ void Desktops::SwitchToDesktop(int idx) windows.clear(); EnumWindows(SwitchDesktopEnumFct, (LPARAM)&windows); + old_desktop._hwndForeground = (HWND)SendMessage(g_Globals._hwndDesktopBar, PM_GET_LAST_ACTIVE, 0, 0); // hide all windows we found for(WindowSet::iterator it=windows.begin(); it!=windows.end(); ++it) @@ -191,6 +192,9 @@ void Desktops::SwitchToDesktop(int idx) for(WindowSet::iterator it=desktop._windows.begin(); it!=desktop._windows.end(); ++it) ShowWindowAsync(*it, SW_SHOW); + if (desktop._hwndForeground) + SetForegroundWindow(desktop._hwndForeground); + desktop._windows.clear(); _current_desktop = idx; diff --git a/reactos/subsys/system/explorer/doc/TODO.txt b/reactos/subsys/system/explorer/doc/TODO.txt index 09c6839088f..3cf8312da65 100644 --- a/reactos/subsys/system/explorer/doc/TODO.txt +++ b/reactos/subsys/system/explorer/doc/TODO.txt @@ -21,18 +21,17 @@ - implement more than one column for very crowded start menus - Execute selected programs with additional command line options ("Run" dialog with pre-filled edit field) -- autostart doesn't on NT4 ? +- autostart doesn't work on NT4 ? - Startmenu: You can't close the start menu with pressing Win-key You can open the start menu with pressing Win-key, but can't close with another hit of Win-key. - Despite of settings, the clock's always shown I set my Win-Exp to hide the clock shown in the taskbar, but the ROS-Exp ignores the setting and always shows the clock. - Yes, ROS epxlorer doesn't read many settings from the registry currently, + Yes, ROS explorer doesn't read many settings from the registry currently, as it doesn't have a way to configure them. (missing configuration dialogs) - Vollbildfenster suchen -> Taskleiste ausblenden -- Fenster-Aktivierung nach Desktop-Umschaltung - Desktop-Manager: Speicherung der Verteilung von Applikations-Fenstern auf die verschiedenen Desktops; Desktop-Namen - neuer Startmen-Eintrag: "Filemanager" neben "Explore" -> Anzeige von C: und D: From 44f3f0d4a0e5803e0d19d92d65fede9f0ff909f3 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sat, 28 Feb 2004 13:49:53 +0000 Subject: [PATCH 0236/1463] remember last foreground window when switching desktops svn path=/trunk/; revision=8440 --- reactos/subsys/system/explorer/desktop/desktop.cpp | 1 + reactos/subsys/system/explorer/taskbar/desktopbar.cpp | 5 +++++ reactos/subsys/system/explorer/taskbar/taskbar.cpp | 3 +++ 3 files changed, 9 insertions(+) diff --git a/reactos/subsys/system/explorer/desktop/desktop.cpp b/reactos/subsys/system/explorer/desktop/desktop.cpp index 5c076101b85..e836331a63d 100644 --- a/reactos/subsys/system/explorer/desktop/desktop.cpp +++ b/reactos/subsys/system/explorer/desktop/desktop.cpp @@ -38,6 +38,7 @@ #include "desktop.h" #include "../taskbar/desktopbar.h" +#include "../taskbar/taskbar.h" // for PM_GET_LAST_ACTIVE #include "../shell/mainframe.h" // for MainFrame::OpenShellFolders() diff --git a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp index 0b041e30834..7eb1c1792d5 100644 --- a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp @@ -228,6 +228,11 @@ LRESULT DesktopBar::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) PopupMenu(IDM_DESKTOPBAR).TrackPopupMenu(_hwnd, MAKEPOINTS(lparam)); break; + case PM_GET_LAST_ACTIVE: + if (_hwndTaskBar) + return SendMessage(_hwndTaskBar, nmsg, wparam, lparam); + break; + default: def: return super::WndProc(nmsg, wparam, lparam); } diff --git a/reactos/subsys/system/explorer/taskbar/taskbar.cpp b/reactos/subsys/system/explorer/taskbar/taskbar.cpp index fedca72d766..7bdbacd741e 100644 --- a/reactos/subsys/system/explorer/taskbar/taskbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/taskbar.cpp @@ -137,6 +137,9 @@ LRESULT TaskBar::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) Refresh(); break;} */ + case PM_GET_LAST_ACTIVE: + return (LRESULT)(HWND)_last_foreground_wnd; + default: def: return super::WndProc(nmsg, wparam, lparam); } From 3d260251a8564765650b5da80b7dab4453c47153 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sat, 28 Feb 2004 14:26:40 +0000 Subject: [PATCH 0237/1463] Command line option "-install" to replace previously installed shell application svn path=/trunk/; revision=8441 --- .../subsys/system/explorer/doxy-footer.html | 2 +- reactos/subsys/system/explorer/explorer.cpp | 52 +++++++++++++++++-- 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/reactos/subsys/system/explorer/doxy-footer.html b/reactos/subsys/system/explorer/doxy-footer.html index 3508d65713a..e6d0fc2383f 100644 --- a/reactos/subsys/system/explorer/doxy-footer.html +++ b/reactos/subsys/system/explorer/doxy-footer.html @@ -3,7 +3,7 @@ <tr> <td><address style="align: right;"><small> ROS Explorer Source Code Documentation -<br>generated on 26.02.2004 by <a href="http://www.doxygen.org/index.html"> +<br>generated on 28.02.2004 by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border=0> </small></address> </td> diff --git a/reactos/subsys/system/explorer/explorer.cpp b/reactos/subsys/system/explorer/explorer.cpp index de8c4e1257c..081083c8a23 100644 --- a/reactos/subsys/system/explorer/explorer.cpp +++ b/reactos/subsys/system/explorer/explorer.cpp @@ -620,11 +620,53 @@ int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdL { CONTEXT("WinMain()"); - // create desktop window and task bar only, if there is no other shell and we are - // the first explorer instance - BOOL startup_desktop = !IsAnyDesktopRunning(); + BOOL any_desktop_running = IsAnyDesktopRunning(); - bool autostart = true; + BOOL startup_desktop; + + // command line option "-install" to replace previous shell application with ROS Explorer + if (_tcsstr(lpCmdLine,TEXT("-install"))) { + // install ROS Explorer into the registry + TCHAR path[MAX_PATH]; + + int l = GetModuleFileName(0, path, MAX_PATH); + if (l) { + HKEY hkey; + + if (!RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), &hkey)) { + + ///@todo save previous shell application in config file + + RegSetValueEx(hkey, TEXT("Shell"), 0, REG_SZ, (LPBYTE)path, l*sizeof(TCHAR)); + RegCloseKey(hkey); + } + } + + HWND shellWindow = GetShellWindow(); + + if (shellWindow) { + DWORD pid; + + // terminate shell process for NT like systems + GetWindowThreadProcessId(shellWindow, &pid); + HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); + + // On Win 9x it's sufficient to destroy the shell window. + DestroyWindow(shellWindow); + + if (TerminateProcess(hProcess, 0)) + WaitForSingleObject(hProcess, INFINITE); + + CloseHandle(hProcess); + } + + startup_desktop = TRUE; + } else + // create desktop window and task bar only, if there is no other shell and we are + // the first explorer instance + startup_desktop = !any_desktop_running; + + bool autostart = !any_desktop_running; // disable autostart if the SHIFT key is pressed if (GetAsyncKeyState(VK_SHIFT) < 0) @@ -646,6 +688,8 @@ int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdL if (_tcsstr(lpCmdLine,TEXT("-noautostart"))) autostart = false; + else if (_tcsstr(lpCmdLine,TEXT("-autostart"))) + autostart = true; #ifndef __WINE__ if (_tcsstr(lpCmdLine,TEXT("-console"))) { From 0f584fd41066fbbaaed48bf31fe6240b7942f392 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sat, 28 Feb 2004 14:47:12 +0000 Subject: [PATCH 0238/1463] new TODO entries svn path=/trunk/; revision=8442 --- reactos/subsys/system/explorer/doc/TODO.txt | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/system/explorer/doc/TODO.txt b/reactos/subsys/system/explorer/doc/TODO.txt index 3cf8312da65..1b1e26401b9 100644 --- a/reactos/subsys/system/explorer/doc/TODO.txt +++ b/reactos/subsys/system/explorer/doc/TODO.txt @@ -1,5 +1,6 @@ - read "DESCRIPT.ION" files to display file descriptions - tool tip texts for notification icons +- hiding of notification icons - context menus for quick launch bar - detect display mode changes and adjust desktop bar size - handling of full screen applications @@ -18,7 +19,7 @@ - close start start menu when resizing explorer bar - adjust already open windows of all running applications when resizing explorer bar - implement blink effect in task bar for SetForegoundWindow() requests -- implement more than one column for very crowded start menus +- implement more than one column or scrolling in start menus for very crowded start menus - Execute selected programs with additional command line options ("Run" dialog with pre-filled edit field) - autostart doesn't work on NT4 ? @@ -35,3 +36,20 @@ - Desktop-Manager: Speicherung der Verteilung von Applikations-Fenstern auf die verschiedenen Desktops; Desktop-Namen - neuer Startmen-Eintrag: "Filemanager" neben "Explore" -> Anzeige von C: und D: +> When minimizing window such as Sleipnir; a popular +> IE-based tab browser in Japan: +> http://www20.pos.to/~sleipnir/software/sleipnir/index.html +> the window'll not stored into the notification area but just minimized; instead of the setting. +> This might be a problem of application which doesn't handle the event, but it works under MS-explorer. +> I tested on 1.42JA, but I also tested and it reproduced on 1.41EN. +> The setting are: Tools->Sleipnir Options->System Tray->turn both settings on +> When you click the minimize button on the top-right of the window, it +> minimizes successfully into SysTray, but on the other hand, when you minimize the +> window by clicking the taskbutton, it minimizes but doesn't go into SysTray. + +> mIRC doesn't expect to be on two desktops at the same time. +> There may be a internal variables, which say: "I am minimized or not." and +> "I am visible or not." So I will have to adjust desktop switching in a +> way, that applications are either visible or not - but not mixed between two +> different desktops. + From d6fd3dcb34b67207c61cdda41731317dd5fb0cb4 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 28 Feb 2004 15:12:28 +0000 Subject: [PATCH 0239/1463] - Add a notice about import library order. svn path=/trunk/; revision=8443 --- reactos/lib/shlwapi/Makefile.ros-template | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/lib/shlwapi/Makefile.ros-template b/reactos/lib/shlwapi/Makefile.ros-template index 3ac99d3d78e..484eebff1a1 100644 --- a/reactos/lib/shlwapi/Makefile.ros-template +++ b/reactos/lib/shlwapi/Makefile.ros-template @@ -1,4 +1,4 @@ -# $Id: Makefile.ros-template,v 1.4 2004/02/26 16:19:17 navaraf Exp $ +# $Id: Makefile.ros-template,v 1.5 2004/02/28 15:12:28 navaraf Exp $ TARGET_NAME = shlwapi @@ -7,6 +7,8 @@ TARGET_OBJECTS = @C_SRCS@ TARGET_CFLAGS = -D__REACTOS__ @EXTRADEFS@ # FIXME: we don't do delayed imports yet so oleaut32.a is listed explicitly +# NOTE: msvcrt.a must be listed before ntdll.a, because sprintf that is +# exported from ntdll doesn't support printing of float types (%f) TARGET_SDKLIBS = @IMPORTS@ msvcrt.a oleaut32.a libwine.a wine_uuid.a libwine_unicode.a ntdll.a TARGET_NORC = yes From 9b3df405d12b78361e5853c4c1fbdfac7e588509 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 28 Feb 2004 15:12:37 +0000 Subject: [PATCH 0240/1463] - NtQueryKey should return STATUS_BUFFER_TOO_SMALL and not STATUS_BUFFER_OVERFLOW. svn path=/trunk/; revision=8444 --- reactos/ntoskrnl/cm/ntfunc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/cm/ntfunc.c b/reactos/ntoskrnl/cm/ntfunc.c index 8f4a83555e3..a605e72073c 100644 --- a/reactos/ntoskrnl/cm/ntfunc.c +++ b/reactos/ntoskrnl/cm/ntfunc.c @@ -944,7 +944,7 @@ NtQueryKey(IN HANDLE KeyHandle, if (Length < *ResultLength) { - Status = STATUS_BUFFER_OVERFLOW; + Status = STATUS_BUFFER_TOO_SMALL; } else { @@ -968,7 +968,7 @@ NtQueryKey(IN HANDLE KeyHandle, if (Length < *ResultLength) { - Status = STATUS_BUFFER_OVERFLOW; + Status = STATUS_BUFFER_TOO_SMALL; } else { @@ -1005,7 +1005,7 @@ NtQueryKey(IN HANDLE KeyHandle, if (Length < *ResultLength) { - Status = STATUS_BUFFER_OVERFLOW; + Status = STATUS_BUFFER_TOO_SMALL; } else { From 44cb45b5704fc14cf03754f61a2309b4ecbbbe8f Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 28 Feb 2004 15:12:49 +0000 Subject: [PATCH 0241/1463] - Fixed RtlNtStatusToDosErrorNoTeb problems caused by mixing signed and unsigned integers. svn path=/trunk/; revision=8445 --- reactos/lib/ntdll/rtl/error.c | 8 ++++---- reactos/ntoskrnl/rtl/error.c | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/reactos/lib/ntdll/rtl/error.c b/reactos/lib/ntdll/rtl/error.c index c597bfdadbd..68c76e9bc67 100644 --- a/reactos/lib/ntdll/rtl/error.c +++ b/reactos/lib/ntdll/rtl/error.c @@ -1,4 +1,4 @@ -/* $Id: error.c,v 1.14 2003/08/22 13:45:34 ea Exp $ +/* $Id: error.c,v 1.15 2004/02/28 15:12:49 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -872,12 +872,12 @@ RtlNtStatusToDosErrorNoTeb(NTSTATUS Status) while (Table->Start) { - if (Status < Table->Start) + if ((ULONG)Status < Table->Start) break; - if (Status < Table->End) + if ((ULONG)Status < Table->End) { - DWORD ret = Table->Table[Status - Table->Start]; + DWORD ret = Table->Table[(ULONG)Status - Table->Start]; if (!ret) ret = Status; /* 0 means 1:1 mapping */ else if (ret == ERROR_MR_MID_NOT_FOUND) diff --git a/reactos/ntoskrnl/rtl/error.c b/reactos/ntoskrnl/rtl/error.c index 25c7024d978..dd40bf640bb 100644 --- a/reactos/ntoskrnl/rtl/error.c +++ b/reactos/ntoskrnl/rtl/error.c @@ -1,4 +1,4 @@ -/* $Id: error.c,v 1.10 2004/02/27 05:50:56 navaraf Exp $ +/* $Id: error.c,v 1.11 2004/02/28 15:12:49 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -886,7 +886,7 @@ RtlNtStatusToDosErrorNoTeb(IN NTSTATUS Status) if ((ULONG)Status < Table->End) { - DWORD ret = Table->Table[Status - Table->Start]; + DWORD ret = Table->Table[(ULONG)Status - Table->Start]; if (!ret) ret = Status; /* 0 means 1:1 mapping */ else if (ret == ERROR_MR_MID_NOT_FOUND) From a5248aa7bc37f4c9bff3deeb8e327f8fe4b896d8 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sat, 28 Feb 2004 15:14:38 +0000 Subject: [PATCH 0242/1463] desktop switching: allow applications to be visible only on one desktop svn path=/trunk/; revision=8446 --- .../system/explorer/desktop/desktop.cpp | 15 ++++++++++- reactos/subsys/system/explorer/doc/TODO.txt | 26 +++---------------- 2 files changed, 18 insertions(+), 23 deletions(-) diff --git a/reactos/subsys/system/explorer/desktop/desktop.cpp b/reactos/subsys/system/explorer/desktop/desktop.cpp index e836331a63d..b2901092d73 100644 --- a/reactos/subsys/system/explorer/desktop/desktop.cpp +++ b/reactos/subsys/system/explorer/desktop/desktop.cpp @@ -182,10 +182,18 @@ void Desktops::SwitchToDesktop(int idx) WindowSet& windows = old_desktop._windows; windows.clear(); + + // collect window handles of all other desktops + WindowSet other_wnds; + for(const_iterator it1=begin(); it1!=end(); ++it1) + for(WindowSet::const_iterator it2=it1->_windows.begin(); it2!=it1->_windows.end(); ++it2) + other_wnds.insert(*it2); + EnumWindows(SwitchDesktopEnumFct, (LPARAM)&windows); + old_desktop._hwndForeground = (HWND)SendMessage(g_Globals._hwndDesktopBar, PM_GET_LAST_ACTIVE, 0, 0); - // hide all windows we found + // hide all windows of the previous desktop for(WindowSet::iterator it=windows.begin(); it!=windows.end(); ++it) ShowWindowAsync(*it, SW_HIDE); @@ -196,6 +204,11 @@ void Desktops::SwitchToDesktop(int idx) if (desktop._hwndForeground) SetForegroundWindow(desktop._hwndForeground); + // remove the window handles of the other desktops from what we found on the previous desktop + for(WindowSet::const_iterator it=other_wnds.begin(); it!=other_wnds.end(); ++it) + windows.erase(*it); + + // We don't need to store the window handles of what's now visible the now current desktop. desktop._windows.clear(); _current_desktop = idx; diff --git a/reactos/subsys/system/explorer/doc/TODO.txt b/reactos/subsys/system/explorer/doc/TODO.txt index 1b1e26401b9..728840c64f6 100644 --- a/reactos/subsys/system/explorer/doc/TODO.txt +++ b/reactos/subsys/system/explorer/doc/TODO.txt @@ -21,8 +21,11 @@ - implement blink effect in task bar for SetForegoundWindow() requests - implement more than one column or scrolling in start menus for very crowded start menus - Execute selected programs with additional command line options ("Run" dialog with pre-filled edit field) - +- switch background images with desktop switcher +- Desktop Manager: Desktop Names; Speicherung der Verteilung von Applikations-Fenstern auf die verschiedenen Desktops -> config file - autostart doesn't work on NT4 ? +- hide desktop bar when showing full screen applications +- new start menu entry "Filemanager" close to "Explore" -> display C: and D: drive in MDI window - Startmenu: You can't close the start menu with pressing Win-key You can open the start menu with pressing Win-key, but can't close with another hit of Win-key. @@ -32,24 +35,3 @@ Yes, ROS explorer doesn't read many settings from the registry currently, as it doesn't have a way to configure them. (missing configuration dialogs) -- Vollbildfenster suchen -> Taskleiste ausblenden -- Desktop-Manager: Speicherung der Verteilung von Applikations-Fenstern auf die verschiedenen Desktops; Desktop-Namen -- neuer Startmen-Eintrag: "Filemanager" neben "Explore" -> Anzeige von C: und D: - -> When minimizing window such as Sleipnir; a popular -> IE-based tab browser in Japan: -> http://www20.pos.to/~sleipnir/software/sleipnir/index.html -> the window'll not stored into the notification area but just minimized; instead of the setting. -> This might be a problem of application which doesn't handle the event, but it works under MS-explorer. -> I tested on 1.42JA, but I also tested and it reproduced on 1.41EN. -> The setting are: Tools->Sleipnir Options->System Tray->turn both settings on -> When you click the minimize button on the top-right of the window, it -> minimizes successfully into SysTray, but on the other hand, when you minimize the -> window by clicking the taskbutton, it minimizes but doesn't go into SysTray. - -> mIRC doesn't expect to be on two desktops at the same time. -> There may be a internal variables, which say: "I am minimized or not." and -> "I am visible or not." So I will have to adjust desktop switching in a -> way, that applications are either visible or not - but not mixed between two -> different desktops. - From 6a84f09c2edfb3fb7d4a34afa66552cef5042355 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sat, 28 Feb 2004 16:05:33 +0000 Subject: [PATCH 0243/1463] compatibility fix for "Sleipnir" web browser: minimizing by clicks on taskbar svn path=/trunk/; revision=8448 --- .../subsys/system/explorer/taskbar/taskbar.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/reactos/subsys/system/explorer/taskbar/taskbar.cpp b/reactos/subsys/system/explorer/taskbar/taskbar.cpp index 7bdbacd741e..5027c0c2ec4 100644 --- a/reactos/subsys/system/explorer/taskbar/taskbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/taskbar.cpp @@ -201,19 +201,22 @@ int TaskBar::Notify(int id, NMHDR* pnmh) void TaskBar::ActivateApp(TaskBarMap::iterator it, bool can_minimize) { HWND hwnd = it->first; + bool minimize_it = can_minimize && (hwnd==GetForegroundWindow() || hwnd==_last_foreground_wnd); - if (can_minimize && (hwnd==GetForegroundWindow() || hwnd==_last_foreground_wnd)) { - PostMessage(hwnd, WM_SYSCOMMAND, SC_MINIMIZE, 0); - _last_foreground_wnd = 0; - } else { - // switch to selected application window + // switch to selected application window + if (!minimize_it) if (IsIconic(hwnd)) PostMessage(hwnd, WM_SYSCOMMAND, SC_RESTORE, 0); - SetForegroundWindow(hwnd); + // In case minimize_it is true, we _have_ to switch to the app before + // posting SW_MINIMIZE to be compatible with some applications (e.g. "Sleipnir") + SetForegroundWindow(hwnd); + if (minimize_it) { + PostMessage(hwnd, WM_SYSCOMMAND, SC_MINIMIZE, 0); + _last_foreground_wnd = 0; + } else _last_foreground_wnd = hwnd; - } Refresh(); } From d0cec9c1cd61e5edaed0f0ff50cb1d29ca9100de Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sat, 28 Feb 2004 16:41:55 +0000 Subject: [PATCH 0244/1463] - fix for restoring applications using task bar buttons - project file maintainancement - docu update svn path=/trunk/; revision=8451 --- reactos/subsys/system/explorer/doc/changes.txt | 1 + reactos/subsys/system/explorer/taskbar/taskbar.cpp | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/system/explorer/doc/changes.txt b/reactos/subsys/system/explorer/doc/changes.txt index b686e73ee29..7715b521dce 100644 --- a/reactos/subsys/system/explorer/doc/changes.txt +++ b/reactos/subsys/system/explorer/doc/changes.txt @@ -67,3 +67,4 @@ If you search for more information, look into the CVS repository. fixes for leaking GDI handles 25.02.2004 m. fuchs rebar control for desktop bar 28.02.2004 m. fuchs "minimize all" functionality + various fixes for notification icons, task bar and desktop switching diff --git a/reactos/subsys/system/explorer/taskbar/taskbar.cpp b/reactos/subsys/system/explorer/taskbar/taskbar.cpp index 5027c0c2ec4..6eb73ab042b 100644 --- a/reactos/subsys/system/explorer/taskbar/taskbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/taskbar.cpp @@ -201,7 +201,9 @@ int TaskBar::Notify(int id, NMHDR* pnmh) void TaskBar::ActivateApp(TaskBarMap::iterator it, bool can_minimize) { HWND hwnd = it->first; - bool minimize_it = can_minimize && (hwnd==GetForegroundWindow() || hwnd==_last_foreground_wnd); + + bool minimize_it = can_minimize && !IsIconic(hwnd) && + (hwnd==GetForegroundWindow() || hwnd==_last_foreground_wnd); // switch to selected application window if (!minimize_it) From c3d638c3a813204148c4c83f8757f8f8bcab01ad Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sat, 28 Feb 2004 16:41:55 +0000 Subject: [PATCH 0245/1463] - fix for restoring applications using task bar buttons - project file maintainancement - docu update svn path=/trunk/; revision=8452 --- reactos/subsys/system/explorer/explorer.dsp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/reactos/subsys/system/explorer/explorer.dsp b/reactos/subsys/system/explorer/explorer.dsp index 47e3fe33c8f..dc8f647bce4 100644 --- a/reactos/subsys/system/explorer/explorer.dsp +++ b/reactos/subsys/system/explorer/explorer.dsp @@ -697,6 +697,9 @@ SOURCE=.\dialogs\settings.cpp SOURCE=.\dialogs\settings.h # End Source File # End Group +# Begin Group "main" + +# PROP Default_Filter "" # Begin Source File SOURCE=.\buildno.h @@ -721,5 +724,6 @@ SOURCE=.\globals.h SOURCE=".\i386-stub-win32.c" # End Source File +# End Group # End Target # End Project From 6332ecc1cd66f70bff4b59e732e90ff2989d8788 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 28 Feb 2004 16:54:22 +0000 Subject: [PATCH 0246/1463] - Fixed the MSVCRT compiling error. svn path=/trunk/; revision=8453 --- reactos/lib/msvcrt/msvcrt.def | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reactos/lib/msvcrt/msvcrt.def b/reactos/lib/msvcrt/msvcrt.def index 79d36d8f0be..314b8dbfb23 100644 --- a/reactos/lib/msvcrt/msvcrt.def +++ b/reactos/lib/msvcrt/msvcrt.def @@ -1,4 +1,4 @@ -; $Id: msvcrt.def,v 1.31 2004/02/27 22:39:37 sedwards Exp $ +; $Id: msvcrt.def,v 1.32 2004/02/28 16:54:22 navaraf Exp $ ; ; ReactOS MSVCRT Compatibility Library ; @@ -119,9 +119,9 @@ __initenv DATA __isascii __iscsym __iscsymf -__lc_codepage +;__lc_codepage __lc_collate_cp -__lc_handle +;__lc_handle ;__lconv_init __mb_cur_max DATA __p___argc @@ -156,14 +156,14 @@ __p__winver __pioinfo ;__pxcptinfoptrs __set_app_type -__setlc_active +;__setlc_active __setusermatherr __threadhandle __threadid __toascii __unDName ;__unDNameEx -__unguarded_readlc_active +;__unguarded_readlc_active ;__wargv __wgetmainargs ;__winitenv From f7a2461d14955d1348e1d461c0c92dbf15895e22 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sat, 28 Feb 2004 18:10:03 +0000 Subject: [PATCH 0247/1463] - "up" button (no functionality yet) - moved extra functions into new "special" toolbar svn path=/trunk/; revision=8456 --- reactos/subsys/system/explorer/explorer.h | 7 +- .../subsys/system/explorer/explorer_intres.h | 4 +- .../subsys/system/explorer/explorer_intres.rc | 4 + .../subsys/system/explorer/res/toolbar.bmp | Bin 1678 -> 1798 bytes .../system/explorer/shell/filechild.cpp | 9 + .../system/explorer/shell/mainframe.cpp | 186 ++++++++++-------- .../subsys/system/explorer/shell/mainframe.h | 1 + .../system/explorer/shell/shellbrowser.cpp | 9 + .../subsys/system/explorer/shell/webchild.cpp | 4 + 9 files changed, 143 insertions(+), 81 deletions(-) diff --git a/reactos/subsys/system/explorer/explorer.h b/reactos/subsys/system/explorer/explorer.h index 6148f265787..31c69f1acac 100644 --- a/reactos/subsys/system/explorer/explorer.h +++ b/reactos/subsys/system/explorer/explorer.h @@ -39,9 +39,10 @@ #define IDW_STATUSBAR 0x100 #define IDW_TOOLBAR 0x101 -#define IDW_DRIVEBAR 0x102 -#define IDW_ADDRESSBAR 0x103 -#define IDW_COMMANDBAR 0x104 +#define IDW_EXTRABAR 0x102 +#define IDW_DRIVEBAR 0x103 +#define IDW_ADDRESSBAR 0x104 +#define IDW_COMMANDBAR 0x105 #define IDW_FIRST_CHILD 0xC000 /*0x200*/ diff --git a/reactos/subsys/system/explorer/explorer_intres.h b/reactos/subsys/system/explorer/explorer_intres.h index 870b0fb030a..7613ac5e9df 100644 --- a/reactos/subsys/system/explorer/explorer_intres.h +++ b/reactos/subsys/system/explorer/explorer_intres.h @@ -95,6 +95,7 @@ #define ID_VIEW_STATUSBAR 503 #define ID_VIEW_DRIVE_BAR 507 #define ID_VIEW_TOOL_BAR 508 +#define ID_VIEW_EXTRA_BAR 509 #define IDC_ROS_EXPLORER 1000 #define IDC_ICON_ALIGN_0 1002 #define IDC_ICON_ALIGN_1 1003 @@ -138,6 +139,7 @@ #define ID_EXPLORE 40011 #define ID_SWITCH_DESKTOP_1 50000 #define ID_TASKMGR 40012 +#define ID_BROWSE_UP 40013 #define ID_WINDOW_NEW 0xE130 #define ID_WINDOW_ARRANGE 0xE131 #define ID_WINDOW_CASCADE 0xE132 @@ -155,7 +157,7 @@ #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 161 -#define _APS_NEXT_COMMAND_VALUE 40013 +#define _APS_NEXT_COMMAND_VALUE 40014 #define _APS_NEXT_CONTROL_VALUE 1003 #define _APS_NEXT_SYMED_VALUE 101 #endif diff --git a/reactos/subsys/system/explorer/explorer_intres.rc b/reactos/subsys/system/explorer/explorer_intres.rc index e307e513c07..772eb8d750b 100644 --- a/reactos/subsys/system/explorer/explorer_intres.rc +++ b/reactos/subsys/system/explorer/explorer_intres.rc @@ -35,6 +35,7 @@ BEGIN POPUP "&Prezentare" BEGIN MENUITEM "&Bara cu instrumente", ID_VIEW_TOOL_BAR + MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR MENUITEM "&Drivebar", ID_VIEW_DRIVE_BAR, CHECKED MENUITEM "&Bara de stare", ID_VIEW_STATUSBAR MENUITEM SEPARATOR @@ -311,6 +312,7 @@ BEGIN POPUP "&Ansicht" BEGIN MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR + MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR MENUITEM "Lauf&werkleiste", ID_VIEW_DRIVE_BAR, CHECKED MENUITEM "&Status Bar", ID_VIEW_STATUSBAR MENUITEM SEPARATOR @@ -540,6 +542,7 @@ BEGIN POPUP "&View" BEGIN MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR + MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR MENUITEM "&Drivebar", ID_VIEW_DRIVE_BAR, CHECKED MENUITEM "&Status Bar", ID_VIEW_STATUSBAR MENUITEM SEPARATOR @@ -888,6 +891,7 @@ BEGIN POPUP "&Affichage" BEGIN MENUITEM "Barre d'&outils", ID_VIEW_TOOL_BAR + MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR MENUITEM "&Drivebar", ID_VIEW_DRIVE_BAR, CHECKED MENUITEM "Barre d'&閠at", ID_VIEW_STATUSBAR MENUITEM SEPARATOR diff --git a/reactos/subsys/system/explorer/res/toolbar.bmp b/reactos/subsys/system/explorer/res/toolbar.bmp index 632b1ec6750950d9aecb0a43ab66d2685e362799..7e88726f33b3373e5ae7fb30815aea586298d583 100644 GIT binary patch delta 174 zcmeC<ZR1mR@?~RZ0E03hsR6_ffS4bM85vlBBm={QiOMS{9^jaGCI(1O)?iF$EibR= zXrJ7}m<?pPxU^6H!kEocUhchRax_y8P{?~r`{W}`*=%4|`D9(@EHD$OWh#j2;=Ki^ u=P!uqy?ZxMZ7NGPOUdrt9+S_o<gkEso3Q3Gm3T~^&6)?Yl9R0!NC5!wMmiJ# delta 98 zcmZqU>*G~+^6g_|0E03hsR6_nfS4bM85vlBBm;xQMCFweuf$BYU`(I9oH1jvI8(;t ob|C%^#Ocf#ldl7@J4?po?JSv-HCQty&tT1*%*mE9xst6F01aCjDF6Tf diff --git a/reactos/subsys/system/explorer/shell/filechild.cpp b/reactos/subsys/system/explorer/shell/filechild.cpp index ddb78ac00f9..b3e596f8123 100644 --- a/reactos/subsys/system/explorer/shell/filechild.cpp +++ b/reactos/subsys/system/explorer/shell/filechild.cpp @@ -439,6 +439,15 @@ LRESULT FileChildWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) activate_entry(pane, _hwnd); break;} + case ID_BROWSE_BACK: + break;//@todo + + case ID_BROWSE_FORWARD: + break;//@todo + + case ID_BROWSE_UP: + break;//@todo + default: return pane->command(LOWORD(wparam)); } diff --git a/reactos/subsys/system/explorer/shell/mainframe.cpp b/reactos/subsys/system/explorer/shell/mainframe.cpp index feae501b333..3b7ae322ad1 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.cpp +++ b/reactos/subsys/system/explorer/shell/mainframe.cpp @@ -64,7 +64,9 @@ MainFrame::MainFrame(HWND hwnd) #endif TBBUTTON toolbarBtns[] = { +#ifdef _NO_REBAR {0, 0, 0, BTNS_SEP, {0, 0}, 0, 0}, +#endif {0, ID_WINDOW_NEW, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, {1, ID_WINDOW_CASCADE, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, {2, ID_WINDOW_TILE_HORZ, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, @@ -76,106 +78,115 @@ MainFrame::MainFrame(HWND hwnd) {0, 0, 0, BTNS_SEP, {0, 0}, 0, 0}, {7, ID_BROWSE_BACK, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, {8, ID_BROWSE_FORWARD, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, - {9, ID_BROWSE_HOME, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, - {10, ID_BROWSE_SEARCH, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, - {11, ID_REFRESH, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, - {12, ID_STOP, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, + {9, ID_BROWSE_UP, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, + {10, ID_BROWSE_HOME, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, + {11, ID_BROWSE_SEARCH, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, + {12, ID_REFRESH, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, + {13, ID_STOP, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, }; _htoolbar = CreateToolbarEx(hwnd, #ifndef _NO_REBAR CCS_NOPARENTALIGN|CCS_NORESIZE| #endif - WS_CHILD|WS_VISIBLE, IDW_TOOLBAR, 2, g_Globals._hInstance, IDB_TOOLBAR, toolbarBtns, - sizeof(toolbarBtns)/sizeof(TBBUTTON), 16, 15, 16, 15, sizeof(TBBUTTON)); + WS_CHILD|WS_VISIBLE, IDW_TOOLBAR, 2, g_Globals._hInstance, IDB_TOOLBAR, + toolbarBtns, sizeof(toolbarBtns)/sizeof(TBBUTTON), + 16, 15, 16, 15, sizeof(TBBUTTON)); CheckMenuItem(_menu_info._hMenuView, ID_VIEW_TOOL_BAR, MF_BYCOMMAND|MF_CHECKED); + TBBUTTON extraBtns = {0, 0, TBSTATE_ENABLED, BTNS_SEP, {0, 0}, 0, 0}; + +#ifndef _NO_REBAR + _hextrabar = CreateToolbarEx(hwnd, + CCS_NOPARENTALIGN|CCS_NORESIZE| + WS_CHILD|WS_VISIBLE|CCS_NOMOVEY|TBSTYLE_LIST, + IDW_EXTRABAR, 2, g_Globals._hInstance, IDB_DRIVEBAR, NULL, 0, + 16, 13, 16, 13, sizeof(TBBUTTON)); +#else + _hextrabar = CreateToolbarEx(hwnd, + WS_CHILD|WS_VISIBLE|CCS_NOMOVEY|TBSTYLE_LIST, + IDW_EXTRABAR, 2, g_Globals._hInstance, IDB_DRIVEBAR, &extraBtns, 1, + 16, 13, 16, 13, sizeof(TBBUTTON)); +#endif + + CheckMenuItem(_menu_info._hMenuView, ID_VIEW_EXTRA_BAR, MF_BYCOMMAND|MF_CHECKED); + + + extraBtns.fsStyle = BTNS_BUTTON; + +#ifdef __WINE__ + // insert unix file system button + extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("/\0")); + extraBtns.idCommand = ID_DRIVE_UNIX_FS; + SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns); +#endif + + // insert explorer window button + extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("Explore\0")); + extraBtns.idCommand = ID_DRIVE_DESKTOP; + SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns); + + // insert shell namespace button + extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("Shell\0")); + extraBtns.idCommand = ID_DRIVE_SHELL_NS; + SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns); + + // insert web control button + extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("Web\0")); + extraBtns.idCommand = ID_WEB_WINDOW; + SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns); + +#define W_VER_NT 0 + if ((HIWORD(GetVersion())>>14) == W_VER_NT) { + // insert NT object namespace button + extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("NT Obj\0")); + extraBtns.idCommand = ID_DRIVE_NTOBJ_NS; + SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns); + } + + // insert Registry button + extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("Reg.\0")); + extraBtns.idCommand = ID_DRIVE_REGISTRY; + SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns); + +#ifdef _DEBUG + // insert FAT direct file system access button + extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("FAT\0")); + extraBtns.idCommand = ID_DRIVE_FAT; + SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns); +#endif + + TBBUTTON drivebarBtn = {0, 0, TBSTATE_ENABLED, BTNS_SEP, {0, 0}, 0, 0}; - int btn = 1; PTSTR p; - _hdrivebar = CreateToolbarEx(hwnd, #ifndef _NO_REBAR + _hdrivebar = CreateToolbarEx(hwnd, CCS_NOPARENTALIGN|CCS_NORESIZE| -#endif WS_CHILD|WS_VISIBLE|CCS_NOMOVEY|TBSTYLE_LIST, - IDW_DRIVEBAR, 2, g_Globals._hInstance, IDB_DRIVEBAR, &drivebarBtn, - 1, 16, 13, 16, 13, sizeof(TBBUTTON)); + IDW_DRIVEBAR, 2, g_Globals._hInstance, IDB_DRIVEBAR, NULL, 0, + 16, 13, 16, 13, sizeof(TBBUTTON)); +#else + _hdrivebar = CreateToolbarEx(hwnd, + WS_CHILD|WS_VISIBLE|CCS_NOMOVEY|TBSTYLE_LIST, + IDW_DRIVEBAR, 2, g_Globals._hInstance, IDB_DRIVEBAR, &drivebarBtn, 1, + 16, 13, 16, 13, sizeof(TBBUTTON)); +#endif + CheckMenuItem(_menu_info._hMenuView, ID_VIEW_DRIVE_BAR, MF_BYCOMMAND|MF_CHECKED); GetLogicalDriveStrings(BUFFER_LEN, _drives); - drivebarBtn.fsStyle = BTNS_BUTTON; - -#ifdef __WINE__ - // insert unix file system button - SendMessage(_hdrivebar, TB_ADDSTRING, 0, (LPARAM)TEXT("/\0")); - - drivebarBtn.idCommand = ID_DRIVE_UNIX_FS; - SendMessage(_hdrivebar, TB_INSERTBUTTON, btn++, (LPARAM)&drivebarBtn); - ++drivebarBtn.iString; -#endif - - // insert explorer window button - SendMessage(_hdrivebar, TB_ADDSTRING, 0, (LPARAM)TEXT("Explore\0")); - - drivebarBtn.idCommand = ID_DRIVE_DESKTOP; - SendMessage(_hdrivebar, TB_INSERTBUTTON, btn++, (LPARAM)&drivebarBtn); - ++drivebarBtn.iString; - - // insert shell namespace button - SendMessage(_hdrivebar, TB_ADDSTRING, 0, (LPARAM)TEXT("Shell\0")); - - drivebarBtn.idCommand = ID_DRIVE_SHELL_NS; - SendMessage(_hdrivebar, TB_INSERTBUTTON, btn++, (LPARAM)&drivebarBtn); - ++drivebarBtn.iString; - -#define W_VER_NT 0 - if ((HIWORD(GetVersion())>>14) == W_VER_NT) { - // insert NT object namespace button - SendMessage(_hdrivebar, TB_ADDSTRING, 0, (LPARAM)TEXT("NT Obj\0")); - - drivebarBtn.idCommand = ID_DRIVE_NTOBJ_NS; - SendMessage(_hdrivebar, TB_INSERTBUTTON, btn++, (LPARAM)&drivebarBtn); - ++drivebarBtn.iString; - } - - // insert Registry button - SendMessage(_hdrivebar, TB_ADDSTRING, 0, (LPARAM)TEXT("Reg.\0")); - - drivebarBtn.idCommand = ID_DRIVE_REGISTRY; - SendMessage(_hdrivebar, TB_INSERTBUTTON, btn++, (LPARAM)&drivebarBtn); - ++drivebarBtn.iString; - -#ifdef _DEBUG - // insert FAT direct file system access button - SendMessage(_hdrivebar, TB_ADDSTRING, 0, (LPARAM)TEXT("FAT\0")); - - drivebarBtn.idCommand = ID_DRIVE_FAT; - SendMessage(_hdrivebar, TB_INSERTBUTTON, btn++, (LPARAM)&drivebarBtn); - ++drivebarBtn.iString; -#endif - - // insert web control button - SendMessage(_hdrivebar, TB_ADDSTRING, 0, (LPARAM)TEXT("Web\0")); - - drivebarBtn.idCommand = ID_WEB_WINDOW; - SendMessage(_hdrivebar, TB_INSERTBUTTON, btn++, (LPARAM)&drivebarBtn); - ++drivebarBtn.iString; - // register windows drive root strings SendMessage(_hdrivebar, TB_ADDSTRING, 0, (LPARAM)_drives); + drivebarBtn.fsStyle = BTNS_BUTTON; drivebarBtn.idCommand = ID_DRIVE_FIRST; for(p=_drives; *p; ) { - // insert drive letter - TCHAR b[3] = {tolower(*p)}; - SendMessage(_hdrivebar, TB_ADDSTRING, 0, (LPARAM)b); - switch(GetDriveType(p)) { case DRIVE_REMOVABLE: drivebarBtn.iBitmap = 1; break; case DRIVE_CDROM: drivebarBtn.iBitmap = 3; break; @@ -184,7 +195,7 @@ MainFrame::MainFrame(HWND hwnd) default:/*DRIVE_FIXED*/ drivebarBtn.iBitmap = 2; } - SendMessage(_hdrivebar, TB_INSERTBUTTON, btn++, (LPARAM)&drivebarBtn); + SendMessage(_hdrivebar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&drivebarBtn); ++drivebarBtn.idCommand; ++drivebarBtn.iString; @@ -209,7 +220,7 @@ MainFrame::MainFrame(HWND hwnd) #ifndef RBBS_HIDETITLE // missing in MinGW headers as of 25.02.2004 #define RBBS_HIDETITLE 0x400 #endif - rbBand.fStyle = RBBS_CHILDEDGE|RBBS_GRIPPERALWAYS|RBBS_HIDETITLE; //|RBBS_BREAK + rbBand.fStyle = RBBS_CHILDEDGE|RBBS_GRIPPERALWAYS|RBBS_HIDETITLE; rbBand.cxMinChild = 0; rbBand.cyMinChild = 0; @@ -221,10 +232,18 @@ MainFrame::MainFrame(HWND hwnd) rbBand.hwndChild = _htoolbar; rbBand.cxMinChild = 0; rbBand.cyMinChild = btn_hgt + 4; - rbBand.cx = 280; + rbBand.cx = 284; SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand); - rbBand.lpText = NULL;//TEXT("Drivebar"); + rbBand.lpText = TEXT("Extras"); + rbBand.hwndChild = _hextrabar; + rbBand.cxMinChild = 0; + rbBand.cyMinChild = btn_hgt + 4; + rbBand.cx = 284; + SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand); + + rbBand.fStyle |= RBBS_BREAK; + rbBand.lpText = TEXT("Drives"); rbBand.hwndChild = _hdrivebar; rbBand.cxMinChild = 0; rbBand.cyMinChild = btn_hgt + 4; @@ -571,6 +590,10 @@ int MainFrame::Command(int id, int code) toggle_child(_hwnd, id, _htoolbar); break; + case ID_VIEW_EXTRA_BAR: + toggle_child(_hwnd, id, _hextrabar); + break; + case ID_VIEW_DRIVE_BAR: toggle_child(_hwnd, id, _hdrivebar); break; @@ -743,6 +766,15 @@ void MainFrame::resize_frame_rect(PRECT prect) // prect->bottom -= rt.bottom+3; } + if (IsWindowVisible(_hextrabar)) { + SendMessage(_hextrabar, WM_SIZE, 0, 0); + ClientRect rt(_hextrabar); + int new_top = --prect->top + rt.bottom+3; + MoveWindow(_hextrabar, 0, prect->top, rt.right, new_top, TRUE); + prect->top = new_top; + // prect->bottom -= rt.bottom+2; + } + if (IsWindowVisible(_hdrivebar)) { SendMessage(_hdrivebar, WM_SIZE, 0, 0); ClientRect rt(_hdrivebar); diff --git a/reactos/subsys/system/explorer/shell/mainframe.h b/reactos/subsys/system/explorer/shell/mainframe.h index f0b18b4bc8d..48d46b2db48 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.h +++ b/reactos/subsys/system/explorer/shell/mainframe.h @@ -56,6 +56,7 @@ protected: WindowHandle _hstatusbar; WindowHandle _hwndrebar; WindowHandle _htoolbar; + WindowHandle _hextrabar; WindowHandle _hdrivebar; WindowHandle _haddressedit; WindowHandle _hcommandedit; diff --git a/reactos/subsys/system/explorer/shell/shellbrowser.cpp b/reactos/subsys/system/explorer/shell/shellbrowser.cpp index fe1c9fd3838..3e4e23fbdaa 100644 --- a/reactos/subsys/system/explorer/shell/shellbrowser.cpp +++ b/reactos/subsys/system/explorer/shell/shellbrowser.cpp @@ -421,6 +421,15 @@ LRESULT ShellBrowserChild::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) ShellBrowserChild::create(_create_info); break;} + case ID_BROWSE_BACK: + break;//@todo + + case ID_BROWSE_FORWARD: + break;//@todo + + case ID_BROWSE_UP: + break;//@todo + default: return FALSE; } diff --git a/reactos/subsys/system/explorer/shell/webchild.cpp b/reactos/subsys/system/explorer/shell/webchild.cpp index ab797235a79..959d03329c6 100644 --- a/reactos/subsys/system/explorer/shell/webchild.cpp +++ b/reactos/subsys/system/explorer/shell/webchild.cpp @@ -247,6 +247,10 @@ LRESULT WebChildWindow::WndProc(UINT message, WPARAM wparam, LPARAM lparam) hr = _control->GoForward(); break; + case ID_BROWSE_UP: + ///@todo + break; + case ID_BROWSE_HOME: hr = _control->GoHome(); break; From 6f1017c15b88065565ad8bd775995373aa656882 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sat, 28 Feb 2004 19:16:54 +0000 Subject: [PATCH 0248/1463] merge WineHQ commits svn path=/trunk/; revision=8457 --- reactos/lib/oleaut32/safearray.c | 4 +- reactos/lib/oleaut32/typelib2.c | 673 +++++++++++++++++++++++++++++-- reactos/lib/oleaut32/varformat.c | 8 +- reactos/lib/shell32/regsvr.c | 7 + reactos/lib/shell32/shellpath.c | 17 + reactos/lib/shell32/shlfileop.c | 4 + reactos/lib/shell32/systray.c | 2 + 7 files changed, 667 insertions(+), 48 deletions(-) diff --git a/reactos/lib/oleaut32/safearray.c b/reactos/lib/oleaut32/safearray.c index b809a7859c7..8e80e5c6286 100644 --- a/reactos/lib/oleaut32/safearray.c +++ b/reactos/lib/oleaut32/safearray.c @@ -33,9 +33,7 @@ #include "config.h" -#ifdef HAVE_STRING_H -# include <string.h> -#endif +#include <string.h> #include <stdarg.h> #include <stdio.h> #include "windef.h" diff --git a/reactos/lib/oleaut32/typelib2.c b/reactos/lib/oleaut32/typelib2.c index c6648e7c12d..f1c03411d77 100644 --- a/reactos/lib/oleaut32/typelib2.c +++ b/reactos/lib/oleaut32/typelib2.c @@ -86,6 +86,36 @@ WINE_DEFAULT_DEBUG_CHANNEL(typelib2); * METHODS */ +/****************************************************************************** + * ITypeLib2 {OLEAUT32} + * + * NOTES + * The ITypeLib2 interface provides an interface whereby one may query MSFT + * format type library (.tlb) files. + * + * This interface inherits from ITypeLib, and can be freely cast back and + * forth between an ITypeLib and an ITypeLib2 on local clients. This + * dispensation applies only to ITypeLib objects obtained on MSFT format type + * libraries (those made through CreateTypeLib2). + * + * METHODS + */ + +/****************************************************************************** + * ITypeInfo2 {OLEAUT32} + * + * NOTES + * The ITypeInfo2 interface provides an interface whereby one may query type + * information stored in MSFT format type library (.tlb) files. + * + * This interface inherits from ITypeInfo, and can be freely cast back and + * forth between an ITypeInfo and an ITypeInfo2 on local clients. This + * dispensation applies only to ITypeInfo objects obtained on MSFT format type + * libraries (those made through CreateTypeLib2). + * + * METHODS + */ + /*================== Implementation Structures ===================================*/ enum MSFT_segment_index { @@ -137,6 +167,9 @@ typedef struct tagICreateTypeLib2Impl struct tagICreateTypeInfo2Impl *last_typeinfo; } ICreateTypeLib2Impl; +#define _ITypeLib2_Offset(impl) ((int)(&(((impl*)0)->lpVtblTypeLib2))) +#define ICOM_THIS_From_ITypeLib2(impl, iface) impl* This = (impl*)(((char*)iface)-_ITypeLib2_Offset(impl)) + typedef struct tagICreateTypeInfo2Impl { ICOM_VFIELD(ICreateTypeInfo2); @@ -181,7 +214,7 @@ static void ctl2_init_header( This->typelib_header.posguid = -1; This->typelib_header.lcid = 0x0409; /* or do we use the current one? */ This->typelib_header.lcid2 = 0x0409; - This->typelib_header.varflags = 0x41; + This->typelib_header.varflags = 0x40; This->typelib_header.version = 0; This->typelib_header.flags = 0; This->typelib_header.nrtypeinfos = 0; @@ -274,7 +307,7 @@ static int ctl2_find_name( static int ctl2_encode_name( ICreateTypeLib2Impl *This, /* [I] The typelib to operate against (used for LCID only). */ WCHAR *name, /* [I] The name string to encode. */ - char **result) /* [O] A pointer to a pointer to recieve the encoded name. */ + char **result) /* [O] A pointer to a pointer to receive the encoded name. */ { int length; static char converted_name[0x104]; @@ -318,7 +351,7 @@ static int ctl2_encode_name( static int ctl2_encode_string( ICreateTypeLib2Impl *This, /* [I] The typelib to operate against (not used?). */ WCHAR *string, /* [I] The string to encode. */ - char **result) /* [O] A pointer to a pointer to recieve the encoded string. */ + char **result) /* [O] A pointer to a pointer to receive the encoded string. */ { int length; static char converted_string[0x104]; @@ -656,6 +689,89 @@ static int ctl2_alloc_importfile( return offset; } +/**************************************************************************** + * ctl2_alloc_custdata + * + * Allocates and initializes a "custom data" value in a type library. + * + * RETURNS + * + * Success: The offset of the new custdata. + * Failure: + * + * -1: Out of memory. + * -2: Unable to encode VARIANT data (typically a bug). + */ +static int ctl2_alloc_custdata( + ICreateTypeLib2Impl *This, /* [I] The type library in which to encode the value. */ + VARIANT *pVarVal) /* [I] The value to encode. */ +{ + int offset; + + TRACE("(%p,%p(%d))\n",This,pVarVal,V_VT(pVarVal)); + + switch (V_VT(pVarVal)) { + case VT_UI4: + offset = ctl2_alloc_segment(This, MSFT_SEG_CUSTDATA, 8, 0); + if (offset == -1) return offset; + + *((unsigned short *)&This->typelib_segment_data[MSFT_SEG_CUSTDATA][offset]) = VT_UI4; + *((unsigned long *)&This->typelib_segment_data[MSFT_SEG_CUSTDATA][offset+2]) = V_UI4(pVarVal); + break; + + default: + FIXME("Unknown variable encoding vt %d.\n", V_VT(pVarVal)); + return -2; + } + + return offset; +} + +/**************************************************************************** + * ctl2_set_custdata + * + * Adds a custom data element to an object in a type library. + * + * RETURNS + * + * Success: S_OK. + * Failure: One of E_INVALIDARG or E_OUTOFMEMORY. + */ +static HRESULT ctl2_set_custdata( + ICreateTypeLib2Impl *This, /* [I] The type library to store the custom data in. */ + REFGUID guid, /* [I] The GUID used as a key to retrieve the custom data. */ + VARIANT *pVarVal, /* [I] The custom data itself. */ + int *offset) /* [I/O] The list of custom data to prepend to. */ +{ + MSFT_GuidEntry guidentry; + int dataoffset; + int guidoffset; + int custoffset; + int *custdata; + + guidentry.guid = *guid; + + guidentry.unk10 = -1; + guidentry.unk14 = -1; + + guidoffset = ctl2_alloc_guid(This, &guidentry); + if (guidoffset == -1) return E_OUTOFMEMORY; + dataoffset = ctl2_alloc_custdata(This, pVarVal); + if (dataoffset == -1) return E_OUTOFMEMORY; + if (dataoffset == -2) return E_INVALIDARG; + + custoffset = ctl2_alloc_segment(This, MSFT_SEG_CUSTDATAGUID, 12, 0); + if (custoffset == -1) return E_OUTOFMEMORY; + + custdata = (int *)&This->typelib_segment_data[MSFT_SEG_CUSTDATAGUID][custoffset]; + custdata[0] = guidoffset; + custdata[1] = dataoffset; + custdata[2] = *offset; + *offset = custoffset; + + return S_OK; +} + /**************************************************************************** * ctl2_encode_typedesc * @@ -699,6 +815,17 @@ static int ctl2_encode_typedesc( *alignment = 1; break; + case VT_INT: + *encoded_tdesc = 0x80000000 | (VT_I4 << 16) | VT_INT; + if ((This->typelib_header.varflags & 0x0f) == SYS_WIN16) { + *width = 2; + *alignment = 2; + } else { + *width = 4; + *alignment = 4; + } + break; + case VT_UINT: *encoded_tdesc = 0x80000000 | (VT_UI4 << 16) | VT_UINT; if ((This->typelib_header.varflags & 0x0f) == SYS_WIN16) { @@ -711,6 +838,8 @@ static int ctl2_encode_typedesc( break; case VT_UI2: + case VT_I2: + case VT_BOOL: *encoded_tdesc = default_tdesc; *width = 2; *alignment = 2; @@ -718,6 +847,7 @@ static int ctl2_encode_typedesc( case VT_I4: case VT_UI4: + case VT_R4: case VT_ERROR: case VT_BSTR: case VT_HRESULT: @@ -726,6 +856,12 @@ static int ctl2_encode_typedesc( *alignment = 4; break; + case VT_CY: + *encoded_tdesc = default_tdesc; + *width = 8; + *alignment = 4; /* guess? */ + break; + case VT_VOID: *encoded_tdesc = 0x80000000 | (VT_EMPTY << 16) | tdesc->vt; *width = 0; @@ -859,6 +995,31 @@ static int ctl2_encode_typedesc( return 0; } +/**************************************************************************** + * ctl2_find_nth_reference + * + * Finds a reference by index into the linked list of reference records. + * + * RETURNS + * + * Success: Offset of the desired reference record. + * Failure: -1. + */ +static int ctl2_find_nth_reference( + ICreateTypeLib2Impl *This, /* [I] The type library in which to search. */ + int offset, /* [I] The starting offset of the reference list. */ + int index) /* [I] The index of the reference to find. */ +{ + MSFT_RefRecord *ref; + + for (; index && (offset != -1); index--) { + ref = (MSFT_RefRecord *)&This->typelib_segment_data[MSFT_SEG_REFERENCES][offset]; + offset = ref->onext; + } + + return offset; +} + /*================== ICreateTypeInfo2 Implementation ===================================*/ /****************************************************************************** @@ -1102,13 +1263,12 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddRefTypeInfo( if (container == (ITypeLib *)&This->typelib->lpVtblTypeLib2) { *phRefType = This->typelib->typelib_typeinfo_offsets[index]; - This->typelib->ref--; /* FIXME: no vtbl yet. */ - return S_OK; } else { FIXME("(%p,%p,%p), pTInfo from different typelib.\n", iface, pTInfo, phRefType); - ITypeLib_Release(container); - return S_OK; } + + ITypeLib_Release(container); + return S_OK; } /****************************************************************************** @@ -1205,8 +1365,63 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddImplType( UINT index, HREFTYPE hRefType) { - FIXME("(%p,%d,%ld), stub!\n", iface, index, hRefType); - return E_OUTOFMEMORY; + ICOM_THIS(ICreateTypeInfo2Impl, iface); + + TRACE("(%p,%d,%ld)\n", iface, index, hRefType); + + if ((This->typeinfo->typekind & 15) == TKIND_COCLASS) { + int offset; + MSFT_RefRecord *ref; + + if (index == 0) { + if (This->typeinfo->datatype1 != -1) return TYPE_E_ELEMENTNOTFOUND; + + offset = ctl2_alloc_segment(This->typelib, MSFT_SEG_REFERENCES, sizeof(MSFT_RefRecord), 0); + if (offset == -1) return E_OUTOFMEMORY; + + This->typeinfo->datatype1 = offset; + } else { + int lastoffset; + + lastoffset = ctl2_find_nth_reference(This->typelib, This->typeinfo->datatype1, index - 1); + if (lastoffset == -1) return TYPE_E_ELEMENTNOTFOUND; + + ref = (MSFT_RefRecord *)&This->typelib->typelib_segment_data[MSFT_SEG_REFERENCES][lastoffset]; + if (ref->onext != -1) return TYPE_E_ELEMENTNOTFOUND; + + offset = ctl2_alloc_segment(This->typelib, MSFT_SEG_REFERENCES, sizeof(MSFT_RefRecord), 0); + if (offset == -1) return E_OUTOFMEMORY; + + ref->onext = offset; + } + + ref = (MSFT_RefRecord *)&This->typelib->typelib_segment_data[MSFT_SEG_REFERENCES][offset]; + + ref->reftype = hRefType; + ref->flags = 0; + ref->oCustData = -1; + ref->onext = -1; + } else if ((This->typeinfo->typekind & 15) == TKIND_DISPATCH) { + FIXME("dispatch case unhandled.\n"); + } else if ((This->typeinfo->typekind & 15) == TKIND_INTERFACE) { + if (This->typeinfo->cImplTypes) { + return (index == 1)? TYPE_E_BADMODULEKIND: TYPE_E_ELEMENTNOTFOUND; + } + + if (index != 0) return TYPE_E_ELEMENTNOTFOUND; + + This->typeinfo->cImplTypes++; + + /* hacked values for IDispatch only, and maybe only for stdole. */ + This->typeinfo->cbSizeVft += 0x0c; /* hack */ + This->typeinfo->datatype1 = hRefType; + This->typeinfo->datatype2 = (3 << 16) | 1; /* ? */ + } else { + FIXME("AddImplType unsupported on typekind %d\n", This->typeinfo->typekind & 15); + return E_OUTOFMEMORY; + } + + return S_OK; } /****************************************************************************** @@ -1219,8 +1434,23 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetImplTypeFlags( UINT index, INT implTypeFlags) { - FIXME("(%p,%d,0x%x), stub!\n", iface, index, implTypeFlags); - return E_OUTOFMEMORY; + ICOM_THIS(ICreateTypeInfo2Impl, iface); + int offset; + MSFT_RefRecord *ref; + + TRACE("(%p,%d,0x%x)\n", iface, index, implTypeFlags); + + if ((This->typeinfo->typekind & 15) != TKIND_COCLASS) { + return TYPE_E_BADMODULEKIND; + } + + offset = ctl2_find_nth_reference(This->typelib, This->typeinfo->datatype1, index); + if (offset == -1) return TYPE_E_ELEMENTNOTFOUND; + + ref = (MSFT_RefRecord *)&This->typelib->typelib_segment_data[MSFT_SEG_REFERENCES][offset]; + ref->flags = implTypeFlags; + + return S_OK; } /****************************************************************************** @@ -1232,8 +1462,39 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetAlignment( ICreateTypeInfo2* iface, WORD cbAlignment) { - FIXME("(%p,%d), stub!\n", iface, cbAlignment); - return E_OUTOFMEMORY; + ICOM_THIS(ICreateTypeInfo2Impl, iface); + + TRACE("(%p,%d)\n", iface, cbAlignment); + + if (!cbAlignment) return E_INVALIDARG; + if (cbAlignment > 16) return E_INVALIDARG; + + This->typeinfo->typekind &= ~0xffc0; + This->typeinfo->typekind |= cbAlignment << 6; + + /* FIXME: There's probably some way to simplify this. */ + switch (This->typeinfo->typekind & 15) { + case TKIND_ALIAS: + default: + break; + + case TKIND_ENUM: + case TKIND_INTERFACE: + case TKIND_DISPATCH: + case TKIND_COCLASS: + if (cbAlignment > 4) cbAlignment = 4; + break; + + case TKIND_RECORD: + case TKIND_MODULE: + case TKIND_UNION: + cbAlignment = 1; + break; + } + + This->typeinfo->typekind |= cbAlignment << 11; + + return S_OK; } /****************************************************************************** @@ -2560,34 +2821,34 @@ static ICreateTypeInfo2 *ICreateTypeInfo2_Constructor(ICreateTypeLib2Impl *typel pCreateTypeInfo2Impl->typeinfo = typeinfo; - if (tkind == TKIND_ENUM) { - typeinfo->typekind |= TKIND_ENUM | 0x2120; + typeinfo->typekind |= tkind | 0x20; + ICreateTypeInfo2_SetAlignment((ICreateTypeInfo2 *)pCreateTypeInfo2Impl, 4); + + switch (tkind) { + case TKIND_ENUM: + case TKIND_INTERFACE: + case TKIND_DISPATCH: + case TKIND_COCLASS: typeinfo->size = 4; - } else if (tkind == TKIND_RECORD) { - typeinfo->typekind |= TKIND_RECORD | 0x0920; + break; + + case TKIND_RECORD: + case TKIND_UNION: typeinfo->size = 0; - } else if (tkind == TKIND_MODULE) { - typeinfo->typekind |= TKIND_MODULE | 0x0920; + break; + + case TKIND_MODULE: typeinfo->size = 2; - } else if (tkind == TKIND_INTERFACE) { - typeinfo->typekind |= TKIND_INTERFACE | 0x2120; - typeinfo->size = 4; - } else if (tkind == TKIND_DISPATCH) { - typeinfo->typekind |= TKIND_DISPATCH | 0x2120; - typeinfo->size = 4; - } else if (tkind == TKIND_COCLASS) { - typeinfo->typekind |= TKIND_COCLASS | 0x2120; - typeinfo->size = 4; - } else if (tkind == TKIND_ALIAS) { - typeinfo->typekind |= TKIND_ALIAS | 0x2120; - typeinfo->size = -0x75; /* ??? */ - } else if (tkind == TKIND_UNION) { - typeinfo->typekind |= TKIND_UNION | 0x0920; - typeinfo->size = 0; - } else { + break; + + case TKIND_ALIAS: + typeinfo->size = -0x75; + break; + + default: FIXME("(%s,%d), unrecognized typekind %d\n", debugstr_w(szName), tkind, tkind); - typeinfo->typekind |= tkind; typeinfo->size = 0xdeadbeef; + break; } if (typelib->last_typeinfo) typelib->last_typeinfo->next_typeinfo = pCreateTypeInfo2Impl; @@ -2624,7 +2885,7 @@ static HRESULT WINAPI ICreateTypeLib2_fnQueryInterface( *ppvObject = This; } else if (IsEqualIID(riid, &IID_ITypeLib) || IsEqualIID(riid, &IID_ITypeLib2)) { - FIXME("QI for ITypeLib interfaces not supported yet.\n"); + *ppvObject = &This->lpVtblTypeLib2; } if(*ppvObject) @@ -2944,6 +3205,7 @@ static HRESULT WINAPI ICreateTypeLib2_fnSaveAllChanges(ICreateTypeLib2 * iface) filepos += ctl2_finalize_segment(This, filepos, MSFT_SEG_GUID); filepos += ctl2_finalize_segment(This, filepos, MSFT_SEG_IMPORTINFO); filepos += ctl2_finalize_segment(This, filepos, MSFT_SEG_IMPORTFILES); + filepos += ctl2_finalize_segment(This, filepos, MSFT_SEG_REFERENCES); filepos += ctl2_finalize_segment(This, filepos, MSFT_SEG_NAMEHASH); filepos += ctl2_finalize_segment(This, filepos, MSFT_SEG_NAME); filepos += ctl2_finalize_segment(This, filepos, MSFT_SEG_STRING); @@ -2962,6 +3224,7 @@ static HRESULT WINAPI ICreateTypeLib2_fnSaveAllChanges(ICreateTypeLib2 * iface) if (!ctl2_write_segment(This, hFile, MSFT_SEG_GUID )) return retval; if (!ctl2_write_segment(This, hFile, MSFT_SEG_IMPORTINFO )) return retval; if (!ctl2_write_segment(This, hFile, MSFT_SEG_IMPORTFILES )) return retval; + if (!ctl2_write_segment(This, hFile, MSFT_SEG_REFERENCES )) return retval; if (!ctl2_write_segment(This, hFile, MSFT_SEG_NAMEHASH )) return retval; if (!ctl2_write_segment(This, hFile, MSFT_SEG_NAME )) return retval; if (!ctl2_write_segment(This, hFile, MSFT_SEG_STRING )) return retval; @@ -3012,8 +3275,11 @@ static HRESULT WINAPI ICreateTypeLib2_fnSetCustData( REFGUID guid, /* [I] The GUID used as a key to retrieve the custom data. */ VARIANT *pVarVal) /* [I] The custom data itself. */ { - FIXME("(%p,%s,%p), stub!\n", iface, debugstr_guid(guid), pVarVal); - return E_OUTOFMEMORY; + ICOM_THIS(ICreateTypeLib2Impl, iface); + + TRACE("(%p,%s,%p)\n", iface, debugstr_guid(guid), pVarVal); + + return ctl2_set_custdata(This, guid, pVarVal, &This->typelib_header.CustomDataOffset); } /****************************************************************************** @@ -3052,6 +3318,307 @@ static HRESULT WINAPI ICreateTypeLib2_fnSetHelpStringDll( return E_OUTOFMEMORY; } +/*================== ITypeLib2 Implementation ===================================*/ + +/****************************************************************************** + * ITypeLib2_QueryInterface {OLEAUT32} + * + * See IUnknown_QueryInterface. + */ +static HRESULT WINAPI ITypeLib2_fnQueryInterface(ITypeLib2 * iface, REFIID riid, LPVOID * ppv) +{ + ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); + + return ICreateTypeLib2_QueryInterface((ICreateTypeLib2 *)This, riid, ppv); +} + +/****************************************************************************** + * ITypeLib2_AddRef {OLEAUT32} + * + * See IUnknown_AddRef. + */ +static ULONG WINAPI ITypeLib2_fnAddRef(ITypeLib2 * iface) +{ + ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); + + return ICreateTypeLib2_AddRef((ICreateTypeLib2 *)This); +} + +/****************************************************************************** + * ITypeLib2_Release {OLEAUT32} + * + * See IUnknown_Release. + */ +static ULONG WINAPI ITypeLib2_fnRelease(ITypeLib2 * iface) +{ + ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); + + return ICreateTypeLib2_Release((ICreateTypeLib2 *)This); +} + +/****************************************************************************** + * ITypeLib2_GetTypeInfoCount {OLEAUT32} + * + * See ITypeLib_GetTypeInfoCount. + */ +static UINT WINAPI ITypeLib2_fnGetTypeInfoCount( + ITypeLib2 * iface) +{ +/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */ + + FIXME("(%p), stub!\n", iface); + + return 0; +} + +/****************************************************************************** + * ITypeLib2_GetTypeInfo {OLEAUT32} + * + * See ITypeLib_GetTypeInfo. + */ +static HRESULT WINAPI ITypeLib2_fnGetTypeInfo( + ITypeLib2 * iface, + UINT index, + ITypeInfo** ppTInfo) +{ +/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */ + + FIXME("(%p,%d,%p), stub!\n", iface, index, ppTInfo); + + return E_OUTOFMEMORY; +} + +/****************************************************************************** + * ITypeLib2_GetTypeInfoType {OLEAUT32} + * + * See ITypeLib_GetTypeInfoType. + */ +static HRESULT WINAPI ITypeLib2_fnGetTypeInfoType( + ITypeLib2 * iface, + UINT index, + TYPEKIND* pTKind) +{ +/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */ + + FIXME("(%p,%d,%p), stub!\n", iface, index, pTKind); + + return E_OUTOFMEMORY; +} + +/****************************************************************************** + * ITypeLib2_GetTypeInfoOfGuid {OLEAUT32} + * + * See ITypeLib_GetTypeInfoOfGuid. + */ +static HRESULT WINAPI ITypeLib2_fnGetTypeInfoOfGuid( + ITypeLib2 * iface, + REFGUID guid, + ITypeInfo** ppTinfo) +{ +/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */ + + FIXME("(%p,%s,%p), stub!\n", iface, debugstr_guid(guid), ppTinfo); + + return E_OUTOFMEMORY; +} + +/****************************************************************************** + * ITypeLib2_GetLibAttr {OLEAUT32} + * + * See ITypeLib_GetLibAttr. + */ +static HRESULT WINAPI ITypeLib2_fnGetLibAttr( + ITypeLib2 * iface, + TLIBATTR** ppTLibAttr) +{ +/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */ + + FIXME("(%p,%p), stub!\n", iface, ppTLibAttr); + + return E_OUTOFMEMORY; +} + +/****************************************************************************** + * ITypeLib2_GetTypeComp {OLEAUT32} + * + * See ITypeLib_GetTypeComp. + */ +static HRESULT WINAPI ITypeLib2_fnGetTypeComp( + ITypeLib2 * iface, + ITypeComp** ppTComp) +{ +/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */ + + FIXME("(%p,%p), stub!\n", iface, ppTComp); + + return E_OUTOFMEMORY; +} + +/****************************************************************************** + * ITypeLib2_GetDocumentation {OLEAUT32} + * + * See ITypeLib_GetDocumentation. + */ +static HRESULT WINAPI ITypeLib2_fnGetDocumentation( + ITypeLib2 * iface, + INT index, + BSTR* pBstrName, + BSTR* pBstrDocString, + DWORD* pdwHelpContext, + BSTR* pBstrHelpFile) +{ +/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */ + + FIXME("(%p,%d,%p,%p,%p,%p), stub!\n", iface, index, pBstrName, pBstrDocString, pdwHelpContext, pBstrHelpFile); + + return E_OUTOFMEMORY; +} + +/****************************************************************************** + * ITypeLib2_IsName {OLEAUT32} + * + * See ITypeLib_IsName. + */ +static HRESULT WINAPI ITypeLib2_fnIsName( + ITypeLib2 * iface, + LPOLESTR szNameBuf, + ULONG lHashVal, + BOOL* pfName) +{ +/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */ + + FIXME("(%p,%s,%lx,%p), stub!\n", iface, debugstr_w(szNameBuf), lHashVal, pfName); + + return E_OUTOFMEMORY; +} + +/****************************************************************************** + * ITypeLib2_FindName {OLEAUT32} + * + * See ITypeLib_FindName. + */ +static HRESULT WINAPI ITypeLib2_fnFindName( + ITypeLib2 * iface, + LPOLESTR szNameBuf, + ULONG lHashVal, + ITypeInfo** ppTInfo, + MEMBERID* rgMemId, + USHORT* pcFound) +{ +/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */ + + FIXME("(%p,%s,%lx,%p,%p,%p), stub!\n", iface, debugstr_w(szNameBuf), lHashVal, ppTInfo, rgMemId, pcFound); + + return E_OUTOFMEMORY; +} + +/****************************************************************************** + * ITypeLib2_ReleaseTLibAttr {OLEAUT32} + * + * See ITypeLib_ReleaseTLibAttr. + */ +static void WINAPI ITypeLib2_fnReleaseTLibAttr( + ITypeLib2 * iface, + TLIBATTR* pTLibAttr) +{ +/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */ + + FIXME("(%p,%p), stub!\n", iface, pTLibAttr); +} + +/****************************************************************************** + * ICreateTypeLib2_GetCustData {OLEAUT32} + * + * Retrieves a custom data value stored on a type library. + * + * RETURNS + * + * Success: S_OK + * Failure: E_OUTOFMEMORY or E_INVALIDARG. + */ +static HRESULT WINAPI ITypeLib2_fnGetCustData( + ITypeLib2 * iface, /* [I] The type library in which to find the custom data. */ + REFGUID guid, /* [I] The GUID under which the custom data is stored. */ + VARIANT* pVarVal) /* [O] The custom data. */ +{ +/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */ + + FIXME("(%p,%s,%p), stub!\n", iface, debugstr_guid(guid), pVarVal); + + return E_OUTOFMEMORY; +} + +/****************************************************************************** + * ICreateTypeLib2_GetLibStatistics {OLEAUT32} + * + * Retrieves some statistics about names in a type library, supposedly for + * hash table optimization purposes. + * + * RETURNS + * + * Success: S_OK + * Failure: E_OUTOFMEMORY or E_INVALIDARG. + */ +static HRESULT WINAPI ITypeLib2_fnGetLibStatistics( + ITypeLib2 * iface, /* [I] The type library to get statistics about. */ + ULONG* pcUniqueNames, /* [O] The number of unique names in the type library. */ + ULONG* pcchUniqueNames) /* [O] The number of changed (?) characters in names in the type library. */ +{ +/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */ + + FIXME("(%p,%p,%p), stub!\n", iface, pcUniqueNames, pcchUniqueNames); + + return E_OUTOFMEMORY; +} + +/****************************************************************************** + * ICreateTypeLib2_GetDocumentation2 {OLEAUT32} + * + * Obtain locale-aware help string information. + * + * RETURNS + * + * Success: S_OK + * Failure: STG_E_INSUFFICIENTMEMORY or E_INVALIDARG. + */ +static HRESULT WINAPI ITypeLib2_fnGetDocumentation2( + ITypeLib2 * iface, + INT index, + LCID lcid, + BSTR* pbstrHelpString, + DWORD* pdwHelpStringContext, + BSTR* pbstrHelpStringDll) +{ +/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */ + + FIXME("(%p,%d,%ld,%p,%p,%p), stub!\n", iface, index, lcid, pbstrHelpString, pdwHelpStringContext, pbstrHelpStringDll); + + return E_OUTOFMEMORY; +} + +/****************************************************************************** + * ICreateTypeLib2_GetAllCustData {OLEAUT32} + * + * Retrieve all of the custom data for a type library. + * + * RETURNS + * + * Success: S_OK + * Failure: E_OUTOFMEMORY or E_INVALIDARG. + */ +static HRESULT WINAPI ITypeLib2_fnGetAllCustData( + ITypeLib2 * iface, /* [I] The type library in which to find the custom data. */ + CUSTDATA* pCustData) /* [O] The structure in which to place the custom data. */ +{ +/* ICOM_THIS_From_ITypeLib2(ICreateTypeLib2Impl, iface); */ + + FIXME("(%p,%p), stub!\n", iface, pCustData); + + return E_OUTOFMEMORY; +} + + +/*================== ICreateTypeLib2 & ITypeLib2 VTABLEs And Creation ===================================*/ static ICOM_VTABLE(ICreateTypeLib2) ctypelib2vt = { @@ -3078,6 +3645,31 @@ static ICOM_VTABLE(ICreateTypeLib2) ctypelib2vt = ICreateTypeLib2_fnSetHelpStringDll }; +static ICOM_VTABLE(ITypeLib2) typelib2vt = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + + ITypeLib2_fnQueryInterface, + ITypeLib2_fnAddRef, + ITypeLib2_fnRelease, + + ITypeLib2_fnGetTypeInfoCount, + ITypeLib2_fnGetTypeInfo, + ITypeLib2_fnGetTypeInfoType, + ITypeLib2_fnGetTypeInfoOfGuid, + ITypeLib2_fnGetLibAttr, + ITypeLib2_fnGetTypeComp, + ITypeLib2_fnGetDocumentation, + ITypeLib2_fnIsName, + ITypeLib2_fnFindName, + ITypeLib2_fnReleaseTLibAttr, + + ITypeLib2_fnGetCustData, + ITypeLib2_fnGetLibStatistics, + ITypeLib2_fnGetDocumentation2, + ITypeLib2_fnGetAllCustData, +}; + static ICreateTypeLib2 *ICreateTypeLib2_Constructor(SYSKIND syskind, LPCOLESTR szFile) { ICreateTypeLib2Impl *pCreateTypeLib2Impl; @@ -3098,6 +3690,8 @@ static ICreateTypeLib2 *ICreateTypeLib2_Constructor(SYSKIND syskind, LPCOLESTR s ctl2_init_header(pCreateTypeLib2Impl); ctl2_init_segdir(pCreateTypeLib2Impl); + pCreateTypeLib2Impl->typelib_header.varflags |= syskind; + /* * The following two calls return an offset or -1 if out of memory. We * specifically need an offset of 0, however, so... @@ -3112,6 +3706,7 @@ static ICreateTypeLib2 *ICreateTypeLib2_Constructor(SYSKIND syskind, LPCOLESTR s memset(pCreateTypeLib2Impl->typelib_namehash_segment, 0xff, 0x200); pCreateTypeLib2Impl->lpVtbl = &ctypelib2vt; + pCreateTypeLib2Impl->lpVtblTypeLib2 = &typelib2vt; pCreateTypeLib2Impl->ref = 1; if (failed) { diff --git a/reactos/lib/oleaut32/varformat.c b/reactos/lib/oleaut32/varformat.c index c23c7d9a503..2f19ca87a1b 100644 --- a/reactos/lib/oleaut32/varformat.c +++ b/reactos/lib/oleaut32/varformat.c @@ -26,12 +26,8 @@ #include "config.h" -#ifdef HAVE_STRING_H -# include <string.h> -#endif -#ifdef HAVE_STDLIB_H -# include <stdlib.h> -#endif +#include <string.h> +#include <stdlib.h> #include <stdarg.h> #include <stdio.h> diff --git a/reactos/lib/shell32/regsvr.c b/reactos/lib/shell32/regsvr.c index c8599a67840..396a377b28c 100644 --- a/reactos/lib/shell32/regsvr.c +++ b/reactos/lib/shell32/regsvr.c @@ -28,6 +28,7 @@ #include "winerror.h" #include "ole2.h" +#include "shlguid.h" #include "wine/debug.h" @@ -475,6 +476,12 @@ static struct regsvr_coclass const coclass_list[] = { "shell32.dll", "Apartment" }, + { &CLSID_MyComputer, + "My Computer", + NULL, + "shell32.dll", + "Apartment" + }, { &CLSID_Shortcut, "Shortcut", NULL, diff --git a/reactos/lib/shell32/shellpath.c b/reactos/lib/shell32/shellpath.c index a28a35ea87c..8d8521479e2 100644 --- a/reactos/lib/shell32/shellpath.c +++ b/reactos/lib/shell32/shellpath.c @@ -966,6 +966,21 @@ static const CSIDL_DATA CSIDL_Data[] = NULL, NULL }, + { /* unassigned 32 */ + 0, 0, + NULL, + NULL + }, + { /* unassigned 33 */ + 0, 0, + NULL, + NULL + }, + { /* unassigned 34 */ + 0, 0, + NULL, + NULL + }, { /* CSIDL_COMMON_MUSIC */ 9, HKLM, "CommonMusic", @@ -1020,6 +1035,8 @@ static const CSIDL_DATA CSIDL_Data[] = #undef HKCU #undef HKLM +/**********************************************************************/ + HRESULT WINAPI SHGetFolderPathW( HWND hwndOwner, int csidl, diff --git a/reactos/lib/shell32/shlfileop.c b/reactos/lib/shell32/shlfileop.c index 3ee8823d20e..21956669373 100644 --- a/reactos/lib/shell32/shlfileop.c +++ b/reactos/lib/shell32/shlfileop.c @@ -248,6 +248,8 @@ static DWORD SHNotifyCreateDirectoryA(LPCSTR path, LPSECURITY_ATTRIBUTES sec) return SHNotifyCreateDirectoryW(wPath, sec); } +/**********************************************************************/ + static DWORD SHNotifyCreateDirectoryW(LPCWSTR path, LPSECURITY_ATTRIBUTES sec) { TRACE("(%s, %p)\n", debugstr_w(path), sec); @@ -273,6 +275,8 @@ static DWORD SHNotifyCreateDirectoryW(LPCWSTR path, LPSECURITY_ATTRIBUTES sec) return GetLastError(); } +/**********************************************************************/ + BOOL WINAPI Win32CreateDirectoryAW(LPCVOID path, LPSECURITY_ATTRIBUTES sec) { if (SHELL_OsIsUnicode()) diff --git a/reactos/lib/shell32/systray.c b/reactos/lib/shell32/systray.c index 9c6a81ecbda..55d0403883e 100644 --- a/reactos/lib/shell32/systray.c +++ b/reactos/lib/shell32/systray.c @@ -246,6 +246,8 @@ void SYSTRAY_ItemSetMessage(SystrayItem *ptrayItem, UINT uCallbackMessage) void SYSTRAY_ItemSetIcon(SystrayItem *ptrayItem, HICON hIcon) { + if(ptrayItem->notifyIcon.hIcon) + DestroyIcon(ptrayItem->notifyIcon.hIcon); ptrayItem->notifyIcon.hIcon = CopyIcon(hIcon); InvalidateRect(ptrayItem->hWnd, NULL, TRUE); } From d7b74d7460d63591f7b3fab85d6bf4fa8912bb16 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sat, 28 Feb 2004 20:14:33 +0000 Subject: [PATCH 0249/1463] move '#undef UNTERFACE' behind interface definitions svn path=/trunk/; revision=8458 --- reactos/include/wine/objidl.h | 74 +++++++++++++++---------------- reactos/lib/shell32/shellfolder.h | 1 - reactos/w32api/include/docobj.h | 8 ++-- reactos/w32api/include/exdisp.h | 8 ++-- reactos/w32api/include/intshcut.h | 2 +- reactos/w32api/include/mshtml.h | 16 +++---- reactos/w32api/include/oaidl.h | 24 +++++----- reactos/w32api/include/objidl.h | 74 +++++++++++++++---------------- reactos/w32api/include/ocidl.h | 74 +++++++++++++++---------------- reactos/w32api/include/oleacc.h | 2 +- reactos/w32api/include/oledlg.h | 2 +- reactos/w32api/include/oleidl.h | 38 ++++++++-------- reactos/w32api/include/richole.h | 4 +- reactos/w32api/include/servprov.h | 2 +- reactos/w32api/include/shlobj.h | 54 +++++++++++----------- reactos/w32api/include/unknwn.h | 4 +- reactos/w32api/include/vfw.h | 8 ++-- 17 files changed, 195 insertions(+), 200 deletions(-) diff --git a/reactos/include/wine/objidl.h b/reactos/include/wine/objidl.h index 48a62abeecc..848e5cf6fb2 100644 --- a/reactos/include/wine/objidl.h +++ b/reactos/include/wine/objidl.h @@ -440,7 +440,6 @@ DECLARE_ENUMERATOR_(IEnumMoniker,interface IMoniker*); DECLARE_ENUMERATOR_(IEnumUnknown,IUnknown*); EXTERN_C const IID IID_ISequentialStream; -#undef INTERFACE #define INTERFACE ISequentialStream DECLARE_INTERFACE_(ISequentialStream,IUnknown) { @@ -450,9 +449,9 @@ DECLARE_INTERFACE_(ISequentialStream,IUnknown) STDMETHOD(Read)(THIS_ void*,ULONG,ULONG*) PURE; STDMETHOD(Write)(THIS_ void const*,ULONG,ULONG*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IStream; -#undef INTERFACE #define INTERFACE IStream DECLARE_INTERFACE_(IStream,ISequentialStream) { @@ -471,9 +470,9 @@ DECLARE_INTERFACE_(IStream,ISequentialStream) STDMETHOD(Stat)(THIS_ STATSTG*,DWORD) PURE; STDMETHOD(Clone)(THIS_ LPSTREAM*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IMarshal; -#undef INTERFACE #define INTERFACE IMarshal DECLARE_INTERFACE_(IMarshal,IUnknown) { @@ -487,9 +486,9 @@ DECLARE_INTERFACE_(IMarshal,IUnknown) STDMETHOD(ReleaseMarshalData) (THIS_ IStream*) PURE; STDMETHOD(DisconnectObject) (THIS_ DWORD) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IStdMarshalInfo; -#undef INTERFACE #define INTERFACE IStdMarshalInfo DECLARE_INTERFACE_(IStdMarshalInfo,IUnknown) { @@ -498,9 +497,9 @@ DECLARE_INTERFACE_(IStdMarshalInfo,IUnknown) STDMETHOD_(ULONG,Release)(THIS) PURE; STDMETHOD(GetClassForHandler)(THIS_ DWORD,PVOID,CLSID*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IMalloc; -#undef INTERFACE #define INTERFACE IMalloc DECLARE_INTERFACE_(IMalloc,IUnknown) { @@ -514,9 +513,9 @@ DECLARE_INTERFACE_(IMalloc,IUnknown) STDMETHOD_(int,DidAlloc)(THIS_ void*) PURE; STDMETHOD_(void,HeapMinimize)(THIS) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IMallocSpy; -#undef INTERFACE #define INTERFACE IMallocSpy DECLARE_INTERFACE_(IMallocSpy,IUnknown) { @@ -536,9 +535,9 @@ DECLARE_INTERFACE_(IMallocSpy,IUnknown) STDMETHOD_(void,PreHeapMinimize)(THIS) PURE; STDMETHOD_(void,PostHeapMinimize)(THIS) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IMessageFilter; -#undef INTERFACE #define INTERFACE IMessageFilter DECLARE_INTERFACE_(IMessageFilter,IUnknown) { @@ -549,9 +548,9 @@ DECLARE_INTERFACE_(IMessageFilter,IUnknown) STDMETHOD_(DWORD,RetryRejectedCall)(THIS_ HTASK,DWORD,DWORD) PURE; STDMETHOD_(DWORD,MessagePending)(THIS_ HTASK,DWORD,DWORD) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IPersist; -#undef INTERFACE #define INTERFACE IPersist DECLARE_INTERFACE_(IPersist,IUnknown) { @@ -560,9 +559,9 @@ DECLARE_INTERFACE_(IPersist,IUnknown) STDMETHOD_(ULONG,Release)(THIS) PURE; STDMETHOD(GetClassID)(THIS_ CLSID*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IPersistStream; -#undef INTERFACE #define INTERFACE IPersistStream DECLARE_INTERFACE_(IPersistStream,IPersist) { @@ -575,9 +574,9 @@ DECLARE_INTERFACE_(IPersistStream,IPersist) STDMETHOD(Save)(THIS_ IStream*,BOOL) PURE; STDMETHOD(GetSizeMax)(THIS_ PULARGE_INTEGER) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IRunningObjectTable; -#undef INTERFACE #define INTERFACE IRunningObjectTable DECLARE_INTERFACE_(IRunningObjectTable,IUnknown) { @@ -592,9 +591,9 @@ DECLARE_INTERFACE_(IRunningObjectTable,IUnknown) STDMETHOD(GetTimeOfLastChange)(THIS_ LPMONIKER,LPFILETIME) PURE; STDMETHOD(EnumRunning)(THIS_ IEnumMoniker**) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IBindCtx; -#undef INTERFACE #define INTERFACE IBindCtx DECLARE_INTERFACE_(IBindCtx,IUnknown) { @@ -612,9 +611,9 @@ DECLARE_INTERFACE_(IBindCtx,IUnknown) STDMETHOD(EnumObjectParam)(THIS_ IEnumString**) PURE; STDMETHOD(RevokeObjectParam)(THIS_ LPOLESTR) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IMoniker; -#undef INTERFACE #define INTERFACE IMoniker DECLARE_INTERFACE_(IMoniker,IPersistStream) { @@ -642,9 +641,9 @@ DECLARE_INTERFACE_(IMoniker,IPersistStream) STDMETHOD(ParseDisplayName)(THIS_ IBindCtx*,IMoniker*,LPOLESTR,ULONG*,IMoniker**) PURE; STDMETHOD(IsSystemMoniker)(THIS_ PDWORD) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IPersistStorage; -#undef INTERFACE #define INTERFACE IPersistStorage DECLARE_INTERFACE_(IPersistStorage,IPersist) { @@ -659,9 +658,9 @@ DECLARE_INTERFACE_(IPersistStorage,IPersist) STDMETHOD(SaveCompleted)(THIS_ LPSTORAGE) PURE; STDMETHOD(HandsOffStorage)(THIS) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IPersistFile; -#undef INTERFACE #define INTERFACE IPersistFile DECLARE_INTERFACE_(IPersistFile,IPersist) { @@ -675,9 +674,9 @@ DECLARE_INTERFACE_(IPersistFile,IPersist) STDMETHOD(SaveCompleted)(THIS_ LPCOLESTR) PURE; STDMETHOD(GetCurFile)(THIS_ LPOLESTR*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IAdviseSink; -#undef INTERFACE #define INTERFACE IAdviseSink DECLARE_INTERFACE_(IAdviseSink,IUnknown) { @@ -690,9 +689,9 @@ DECLARE_INTERFACE_(IAdviseSink,IUnknown) STDMETHOD_(void,OnSave)(THIS) PURE; STDMETHOD_(void,OnClose)(THIS) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IAdviseSink2; -#undef INTERFACE #define INTERFACE IAdviseSink2 DECLARE_INTERFACE_(IAdviseSink2,IAdviseSink) { @@ -706,9 +705,9 @@ DECLARE_INTERFACE_(IAdviseSink2,IAdviseSink) STDMETHOD_(void,OnClose)(THIS) PURE; STDMETHOD_(void,OnLinkSrcChange)(THIS_ IMoniker*); }; +#undef INTERFACE EXTERN_C const IID IID_IDataObject; -#undef INTERFACE #define INTERFACE IDataObject DECLARE_INTERFACE_(IDataObject,IUnknown) { @@ -725,9 +724,9 @@ DECLARE_INTERFACE_(IDataObject,IUnknown) STDMETHOD(DUnadvise)(THIS_ DWORD) PURE; STDMETHOD(EnumDAdvise)(THIS_ IEnumSTATDATA**) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IDataAdviseHolder; -#undef INTERFACE #define INTERFACE IDataAdviseHolder DECLARE_INTERFACE_(IDataAdviseHolder,IUnknown) { @@ -739,9 +738,9 @@ DECLARE_INTERFACE_(IDataAdviseHolder,IUnknown) STDMETHOD(EnumAdvise)(THIS_ IEnumSTATDATA**) PURE; STDMETHOD(SendOnDataChange)(THIS_ IDataObject*,DWORD,DWORD) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IStorage; -#undef INTERFACE #define INTERFACE IStorage DECLARE_INTERFACE_(IStorage,IUnknown) { @@ -764,9 +763,9 @@ DECLARE_INTERFACE_(IStorage,IUnknown) STDMETHOD(SetStateBits)(THIS_ DWORD,DWORD) PURE; STDMETHOD(Stat)(THIS_ STATSTG*,DWORD) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IRootStorage; -#undef INTERFACE #define INTERFACE IRootStorage DECLARE_INTERFACE_(IRootStorage,IPersist) { @@ -775,9 +774,9 @@ DECLARE_INTERFACE_(IRootStorage,IPersist) STDMETHOD_(ULONG,Release)(THIS) PURE; STDMETHOD(SwitchToFile)(THIS_ LPOLESTR) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IRpcChannelBuffer; -#undef INTERFACE #define INTERFACE IRpcChannelBuffer DECLARE_INTERFACE_(IRpcChannelBuffer,IUnknown) { @@ -790,9 +789,9 @@ DECLARE_INTERFACE_(IRpcChannelBuffer,IUnknown) STDMETHOD(GetDestCtx)(THIS_ PDWORD,PVOID*) PURE; STDMETHOD(IsConnected)(THIS) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IRpcProxyBuffer; -#undef INTERFACE #define INTERFACE IRpcProxyBuffer DECLARE_INTERFACE_(IRpcProxyBuffer,IUnknown) { @@ -803,9 +802,9 @@ DECLARE_INTERFACE_(IRpcProxyBuffer,IUnknown) STDMETHOD_(void,Disconnect)(THIS) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IRpcStubBuffer; -#undef INTERFACE #define INTERFACE IRpcStubBuffer DECLARE_INTERFACE_(IRpcStubBuffer,IUnknown) { @@ -820,9 +819,9 @@ DECLARE_INTERFACE_(IRpcStubBuffer,IUnknown) STDMETHOD(DebugServerQueryInterface)(THIS_ PVOID*) PURE; STDMETHOD(DebugServerRelease)(THIS_ PVOID) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IPSFactoryBuffer; -#undef INTERFACE #define INTERFACE IPSFactoryBuffer DECLARE_INTERFACE_(IPSFactoryBuffer,IUnknown) { @@ -832,9 +831,9 @@ DECLARE_INTERFACE_(IPSFactoryBuffer,IUnknown) STDMETHOD(CreateProxy)(THIS_ LPUNKNOWN,REFIID,LPRPCPROXYBUFFER*,PVOID*) PURE; STDMETHOD(CreateStub)(THIS_ REFIID,LPUNKNOWN,LPRPCSTUBBUFFER*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_ILockBytes; -#undef INTERFACE #define INTERFACE ILockBytes DECLARE_INTERFACE_(ILockBytes,IUnknown) { @@ -849,9 +848,9 @@ DECLARE_INTERFACE_(ILockBytes,IUnknown) STDMETHOD(UnlockRegion)(THIS_ ULARGE_INTEGER,ULARGE_INTEGER,DWORD) PURE; STDMETHOD(Stat)(THIS_ STATSTG*,DWORD) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IExternalConnection; -#undef INTERFACE #define INTERFACE IExternalConnection DECLARE_INTERFACE_(IExternalConnection,IUnknown) { @@ -861,9 +860,9 @@ DECLARE_INTERFACE_(IExternalConnection,IUnknown) STDMETHOD(AddConnection)(THIS_ DWORD,DWORD) PURE; STDMETHOD(ReleaseConnection)(THIS_ DWORD,DWORD,BOOL) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IRunnableObject; -#undef INTERFACE #define INTERFACE IRunnableObject DECLARE_INTERFACE_(IRunnableObject,IUnknown) { @@ -876,9 +875,9 @@ DECLARE_INTERFACE_(IRunnableObject,IUnknown) STDMETHOD(LockRunning)(THIS_ BOOL,BOOL) PURE; STDMETHOD(SetContainedObject)(THIS_ BOOL) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IROTData; -#undef INTERFACE #define INTERFACE IROTData DECLARE_INTERFACE_(IROTData,IUnknown) { @@ -887,9 +886,9 @@ DECLARE_INTERFACE_(IROTData,IUnknown) STDMETHOD_(ULONG,Release)(THIS) PURE; STDMETHOD(GetComparisonData)(THIS_ PVOID,ULONG,PULONG) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IChannelHook; -#undef INTERFACE #define INTERFACE IChannelHook DECLARE_INTERFACE_(IChannelHook,IUnknown) { @@ -903,9 +902,9 @@ DECLARE_INTERFACE_(IChannelHook,IUnknown) STDMETHOD_(void,ServerGetSize)(THIS_ REFGUID,REFIID,HRESULT,PULONG) PURE; STDMETHOD_(void,ServerFillBuffer)(THIS_ REFGUID,REFIID,PULONG,PVOID,HRESULT) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IPropertyStorage; -#undef INTERFACE #define INTERFACE IPropertyStorage DECLARE_INTERFACE_(IPropertyStorage,IUnknown) { @@ -925,9 +924,9 @@ DECLARE_INTERFACE_(IPropertyStorage,IUnknown) STDMETHOD(Stat)(THIS_ STATPROPSTG*) PURE; STDMETHOD(SetTimes)(THIS_ FILETIME const*,FILETIME const*,FILETIME const*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IPropertySetStorage; -#undef INTERFACE #define INTERFACE IPropertySetStorage DECLARE_INTERFACE_(IPropertySetStorage,IUnknown) { @@ -939,9 +938,9 @@ DECLARE_INTERFACE_(IPropertySetStorage,IUnknown) STDMETHOD(Delete)(THIS_ REFFMTID) PURE; STDMETHOD(Enum)(THIS_ IEnumSTATPROPSETSTG**) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IClientSecurity; -#undef INTERFACE #define INTERFACE IClientSecurity DECLARE_INTERFACE_(IClientSecurity,IUnknown) { @@ -952,9 +951,9 @@ DECLARE_INTERFACE_(IClientSecurity,IUnknown) STDMETHOD(SetBlanket)(THIS_ PVOID,DWORD,DWORD,LPWSTR,DWORD,DWORD,RPC_AUTH_IDENTITY_HANDLE*,DWORD) PURE; STDMETHOD(CopyProxy)(THIS_ LPUNKNOWN,LPUNKNOWN*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IServerSecurity; -#undef INTERFACE #define INTERFACE IServerSecurity DECLARE_INTERFACE_(IServerSecurity,IUnknown) { @@ -966,9 +965,9 @@ DECLARE_INTERFACE_(IServerSecurity,IUnknown) STDMETHOD(RevertToSelf)(THIS) PURE; STDMETHOD(IsImpersonating)(THIS) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IClassActivator; -#undef INTERFACE #define INTERFACE IClassActivator DECLARE_INTERFACE_(IClassActivator,IUnknown) { @@ -977,9 +976,9 @@ DECLARE_INTERFACE_(IClassActivator,IUnknown) STDMETHOD_(ULONG,Release)(THIS) PURE; STDMETHOD(GetClassObject)(THIS_ REFCLSID,DWORD,LCID,REFIID,PVOID*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IFillLockBytes; -#undef INTERFACE #define INTERFACE IFillLockBytes DECLARE_INTERFACE_(IFillLockBytes,IUnknown) { @@ -991,9 +990,9 @@ DECLARE_INTERFACE_(IFillLockBytes,IUnknown) STDMETHOD(SetFillSize)(THIS_ ULARGE_INTEGER) PURE; STDMETHOD(Terminate)(THIS_ BOOL) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IProgressNotify; -#undef INTERFACE #define INTERFACE IProgressNotify DECLARE_INTERFACE_(IProgressNotify,IUnknown) { @@ -1002,9 +1001,9 @@ DECLARE_INTERFACE_(IProgressNotify,IUnknown) STDMETHOD_(ULONG,Release)(THIS) PURE; STDMETHOD(OnProgress)(THIS_ DWORD,DWORD,BOOL,BOOL) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_ILayoutStorage; -#undef INTERFACE #define INTERFACE ILayoutStorage DECLARE_INTERFACE_(ILayoutStorage,IUnknown) { @@ -1016,6 +1015,7 @@ DECLARE_INTERFACE_(ILayoutStorage,IUnknown) STDMETHOD(EndMonitor)(THIS) PURE; STDMETHOD(ReLayoutDocfile)(THIS_ OLECHAR*) PURE; }; +#undef INTERFACE HRESULT STDMETHODCALLTYPE IMarshal_GetUnmarshalClass_Proxy(IMarshal*,REFIID,void*,DWORD,void*,DWORD,CLSID*); void STDMETHODCALLTYPE IMarshal_GetUnmarshalClass_Stub(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,PDWORD); diff --git a/reactos/lib/shell32/shellfolder.h b/reactos/lib/shell32/shellfolder.h index fd1b80f12ab..8c8901e4c57 100644 --- a/reactos/lib/shell32/shellfolder.h +++ b/reactos/lib/shell32/shellfolder.h @@ -39,7 +39,6 @@ typedef struct ISFHelper ISFHelper, *LPISFHELPER; * ISFHelper interface */ -#undef INTERFACE #define INTERFACE ISFHelper #define ISFHelper_METHODS \ IUnknown_METHODS \ diff --git a/reactos/w32api/include/docobj.h b/reactos/w32api/include/docobj.h index 27055dd845e..43a72782dc2 100644 --- a/reactos/w32api/include/docobj.h +++ b/reactos/w32api/include/docobj.h @@ -78,7 +78,6 @@ EXTERN_C const IID IID_IEnumOleDocumentViews; EXTERN_C const IID IID_IPrint; EXTERN_C const IID IID_IOleDocumentView; -#undef INTERFACE #define INTERFACE IOleDocumentView DECLARE_INTERFACE_(IOleDocumentView,IUnknown) { @@ -100,11 +99,11 @@ DECLARE_INTERFACE_(IOleDocumentView,IUnknown) STDMETHOD(ApplyViewState)(THIS_ IStream*) PURE; STDMETHOD(Clone)(THIS_ LPOLEINPLACESITE,IOleDocumentView**) PURE; }; +#undef INTERFACE DECLARE_ENUMERATOR_(IEnumOleDocumentViews,IOleDocumentView); EXTERN_C const IID IID_IOleDocument; -#undef INTERFACE #define INTERFACE IOleDocument DECLARE_INTERFACE_(IOleDocument,IUnknown) { @@ -116,9 +115,9 @@ DECLARE_INTERFACE_(IOleDocument,IUnknown) STDMETHOD(GetDocMiscStatus)(THIS_ DWORD*) PURE; STDMETHOD(EnumViews)(THIS_ LPENUMOLEDOCUMENTVIEWS*,IOleDocumentView**) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IOleCommandTarget; -#undef INTERFACE #define INTERFACE IOleCommandTarget DECLARE_INTERFACE_(IOleCommandTarget,IUnknown) { @@ -129,9 +128,9 @@ DECLARE_INTERFACE_(IOleCommandTarget,IUnknown) STDMETHOD(QueryStatus)(THIS_ const GUID*,ULONG,OLECMD*,OLECMDTEXT*) PURE; STDMETHOD(Exec)(THIS_ const GUID*,DWORD,DWORD,VARIANTARG*,VARIANTARG*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IOleDocumentSite; -#undef INTERFACE #define INTERFACE IOleDocumentSite DECLARE_INTERFACE_(IOleDocumentSite,IUnknown) { @@ -141,6 +140,7 @@ DECLARE_INTERFACE_(IOleDocumentSite,IUnknown) STDMETHOD(ActivateMe)(THIS_ IOleDocumentView*) PURE; }; +#undef INTERFACE #ifdef __cplusplus } diff --git a/reactos/w32api/include/exdisp.h b/reactos/w32api/include/exdisp.h index 9e747df1119..0656c063b82 100644 --- a/reactos/w32api/include/exdisp.h +++ b/reactos/w32api/include/exdisp.h @@ -24,7 +24,6 @@ typedef enum { } BrowserNavConstants; EXTERN_C const IID IID_IWebBrowser; -#undef INTERFACE #define INTERFACE IWebBrowser DECLARE_INTERFACE_(IWebBrowser,IDispatch) { @@ -62,9 +61,9 @@ DECLARE_INTERFACE_(IWebBrowser,IDispatch) STDMETHOD(get_LocationURL)(THIS_ BSTR*) PURE; STDMETHOD(get_Busy)(THIS_ VARIANT_BOOL*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IWebBrowserApp; -#undef INTERFACE #define INTERFACE IWebBrowserApp DECLARE_INTERFACE_(IWebBrowserApp,IWebBrowser) { @@ -123,9 +122,9 @@ DECLARE_INTERFACE_(IWebBrowserApp,IWebBrowser) STDMETHOD(get_FullScreen)(THIS_ VARIANT_BOOL*) PURE; STDMETHOD(put_FullScreen)(THIS_ VARIANT_BOOL) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IWebBrowser2; -#undef INTERFACE #define INTERFACE IWebBrowser2 DECLARE_INTERFACE_(IWebBrowser2,IWebBrowserApp) { @@ -204,11 +203,11 @@ DECLARE_INTERFACE_(IWebBrowser2,IWebBrowserApp) STDMETHOD(get_Resizable)(THIS_ VARIANT_BOOL*) PURE; STDMETHOD(put_Resizable)(THIS_ VARIANT_BOOL) PURE; }; +#undef INTERFACE #define STDDISP(m) STDMETHOD_(void,m) EXTERN_C const IID DIID_DWebBrowserEvents2; -#undef INTERFACE #define INTERFACE DWebBrowserEvents2 DECLARE_INTERFACE_(DWebBrowserEvents2,IDispatch) { @@ -248,6 +247,7 @@ DECLARE_INTERFACE_(DWebBrowserEvents2,IDispatch) STDDISP(SetSecureLockIcon)(THIS_ long) PURE; STDDISP(FileDownload)(THIS_ VARIANT_BOOL*) PURE; }; +#undef INTERFACE #undef STDDISP diff --git a/reactos/w32api/include/intshcut.h b/reactos/w32api/include/intshcut.h index e4c87cd1073..9742ff917e0 100644 --- a/reactos/w32api/include/intshcut.h +++ b/reactos/w32api/include/intshcut.h @@ -45,7 +45,6 @@ typedef struct urlinvokecommandinfo { } URLINVOKECOMMANDINFO,*PURLINVOKECOMMANDINFO; typedef const URLINVOKECOMMANDINFO CURLINVOKECOMMANDINFO; typedef const URLINVOKECOMMANDINFO *PCURLINVOKECOMMANDINFO; -#undef INTERFACE #define INTERFACE IUniformResourceLocator DECLARE_INTERFACE_(IUniformResourceLocator,IUnknown) { @@ -56,6 +55,7 @@ DECLARE_INTERFACE_(IUniformResourceLocator,IUnknown) STDMETHOD(GetURL)(THIS_ PSTR*) PURE; STDMETHOD(InvokeCommand)(THIS_ PURLINVOKECOMMANDINFO) PURE; }; +#undef INTERFACE typedef IUniformResourceLocator *PIUniformResourceLocator; typedef const IUniformResourceLocator CIUniformResourceLocator; typedef const IUniformResourceLocator *PCIUniformResourceLocator; diff --git a/reactos/w32api/include/mshtml.h b/reactos/w32api/include/mshtml.h index 40115e9517a..281ce928dc2 100644 --- a/reactos/w32api/include/mshtml.h +++ b/reactos/w32api/include/mshtml.h @@ -22,7 +22,6 @@ typedef interface IHTMLLinkElement *LPHTMLLINKELEMENT; typedef interface IHTMLImgElement *LPHTMLIMGELEMENT; EXTERN_C const IID IID_IHTMLLinkElement; -#undef INTERFACE #define INTERFACE IHTMLLinkElement DECLARE_INTERFACE_(IHTMLLinkElement,IDispatch) { @@ -55,9 +54,9 @@ DECLARE_INTERFACE_(IHTMLLinkElement,IDispatch) STDMETHOD(put_media)(THIS_ BSTR) PURE; STDMETHOD(get_media)(THIS_ BSTR*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IHTMLImgElement; -#undef INTERFACE #define INTERFACE IHTMLImgElement DECLARE_INTERFACE_(IHTMLImgElement,IDispatch) { @@ -118,9 +117,9 @@ DECLARE_INTERFACE_(IHTMLImgElement,IDispatch) STDMETHOD(put_start)(THIS_ BSTR) PURE; STDMETHOD(get_start)(THIS_ BSTR*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IHTMLElementCollection; -#undef INTERFACE #define INTERFACE IHTMLElementCollection DECLARE_INTERFACE_(IHTMLElementCollection,IDispatch) { @@ -139,10 +138,10 @@ DECLARE_INTERFACE_(IHTMLElementCollection,IDispatch) STDMETHOD(item)(THIS_ VARIANT,VARIANT,IDispatch**) PURE; STDMETHOD(tags)(THIS_ VARIANT,IDispatch**) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IHTMLDocument; -#undef INTERFACE #define INTERFACE IHTMLDocument DECLARE_INTERFACE_(IHTMLDocument,IDispatch) { @@ -156,9 +155,9 @@ DECLARE_INTERFACE_(IHTMLDocument,IDispatch) STDMETHOD(get_Script)(THIS_ IDispatch**) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IHTMLDocument2; -#undef INTERFACE #define INTERFACE IHTMLDocument2 DECLARE_INTERFACE_(IHTMLDocument2,IHTMLDocument) { @@ -281,9 +280,9 @@ DECLARE_INTERFACE_(IHTMLDocument2,IHTMLDocument) STDMETHOD(toString)(THIS_ BSTR*) PURE; STDMETHOD(createStyleSheet)(THIS_ BSTR,long,LPHTMLSTYLESHEET*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IHTMLSelectionObject; -#undef INTERFACE #define INTERFACE IHTMLSelectionObject DECLARE_INTERFACE_(IHTMLSelectionObject,IDispatch) { @@ -300,9 +299,9 @@ DECLARE_INTERFACE_(IHTMLSelectionObject,IDispatch) STDMETHOD(clear)(THIS) PURE; STDMETHOD(type)(THIS_ BSTR*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IHTMLTxtRange; -#undef INTERFACE #define INTERFACE IHTMLTxtRange DECLARE_INTERFACE_(IHTMLTxtRange,IDispatch) { @@ -345,9 +344,9 @@ DECLARE_INTERFACE_(IHTMLTxtRange,IDispatch) STDMETHOD(execCommand)(THIS_ BSTR,VARIANT_BOOL,VARIANT,VARIANT_BOOL*) PURE; STDMETHOD(execCommandShowHelp)(THIS_ BSTR,VARIANT_BOOL*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IHTMLElement; -#undef INTERFACE #define INTERFACE IHTMLElement DECLARE_INTERFACE_(IHTMLElement,IDispatch) { @@ -447,6 +446,7 @@ DECLARE_INTERFACE_(IHTMLElement,IDispatch) STDMETHOD(get_children)(THIS_ IDispatch**) PURE; STDMETHOD(get_all)(THIS_ IDispatch**) PURE; }; +#undef INTERFACE #ifdef __cplusplus } diff --git a/reactos/w32api/include/oaidl.h b/reactos/w32api/include/oaidl.h index 06c4116ab52..037022a54ac 100644 --- a/reactos/w32api/include/oaidl.h +++ b/reactos/w32api/include/oaidl.h @@ -457,7 +457,6 @@ typedef union tagBINDPTR { LPTYPECOMP lptcomp; } BINDPTR,*LPBINDPTR; -#undef INTERFACE #define INTERFACE IDispatch DECLARE_INTERFACE_(IDispatch,IUnknown) { @@ -469,8 +468,8 @@ DECLARE_INTERFACE_(IDispatch,IUnknown) STDMETHOD(GetIDsOfNames)(THIS_ REFIID,LPOLESTR*,UINT,LCID,DISPID*) PURE; STDMETHOD(Invoke)(THIS_ DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*) PURE; }; - #undef INTERFACE + #define INTERFACE IEnumVARIANT DECLARE_INTERFACE_(IEnumVARIANT,IUnknown) { @@ -482,8 +481,8 @@ DECLARE_INTERFACE_(IEnumVARIANT,IUnknown) STDMETHOD(Reset)(THIS) PURE; STDMETHOD(Clone)(THIS_ IEnumVARIANT**) PURE; }; - #undef INTERFACE + #define INTERFACE ITypeComp DECLARE_INTERFACE_(ITypeComp,IUnknown) { @@ -493,8 +492,8 @@ DECLARE_INTERFACE_(ITypeComp,IUnknown) STDMETHOD(Bind)(THIS_ LPOLESTR,ULONG,WORD,LPTYPEINFO*,DESCKIND*,LPBINDPTR) PURE; STDMETHOD(BindType)(THIS_ LPOLESTR,ULONG,LPTYPEINFO*,LPTYPECOMP*) PURE; }; - #undef INTERFACE + #define INTERFACE ITypeInfo DECLARE_INTERFACE_(ITypeInfo,IUnknown) { @@ -521,8 +520,8 @@ DECLARE_INTERFACE_(ITypeInfo,IUnknown) STDMETHOD_(void,ReleaseFuncDesc)(THIS_ LPFUNCDESC) PURE; STDMETHOD_(void,ReleaseVarDesc)(THIS_ LPVARDESC) PURE; }; - #undef INTERFACE + #define INTERFACE ITypeInfo2 DECLARE_INTERFACE_(ITypeInfo2,ITypeInfo) { @@ -564,8 +563,8 @@ DECLARE_INTERFACE_(ITypeInfo2,ITypeInfo) STDMETHOD(GetAllVarCustData)(THIS_ UINT,CUSTDATA*) PURE; STDMETHOD(GetAllImplTypeCustData)(THIS_ UINT,CUSTDATA*) PURE; }; - #undef INTERFACE + #define INTERFACE ITypeLib DECLARE_INTERFACE_(ITypeLib,IUnknown) { @@ -583,8 +582,8 @@ DECLARE_INTERFACE_(ITypeLib,IUnknown) STDMETHOD(FindName)(THIS_ LPOLESTR,ULONG,ITypeInfo**,MEMBERID*,USHORT*) PURE; STDMETHOD_(void,ReleaseTLibAttr)(THIS_ TLIBATTR*) PURE; }; - #undef INTERFACE + #define INTERFACE ITypeLib2 DECLARE_INTERFACE_(ITypeLib2,ITypeLib) { @@ -606,9 +605,9 @@ DECLARE_INTERFACE_(ITypeLib2,ITypeLib) STDMETHOD(GetDocumentation2)(THIS_ INT,LCID,BSTR*,DWORD*,BSTR*) PURE; STDMETHOD(GetAllCustData)(THIS_ CUSTDATA*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IErrorInfo; -#undef INTERFACE #define INTERFACE IErrorInfo DECLARE_INTERFACE_(IErrorInfo, IUnknown) { @@ -621,6 +620,7 @@ DECLARE_INTERFACE_(IErrorInfo, IUnknown) STDMETHOD(GetHelpFile)(THIS_ BSTR*) PURE; STDMETHOD(GetHelpContext)(THIS_ DWORD*) PURE; }; +#undef INTERFACE #ifdef COBJMACROS #define IErrorInfo_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) @@ -634,7 +634,6 @@ DECLARE_INTERFACE_(IErrorInfo, IUnknown) #endif EXTERN_C const IID IID_ICreateErrorInfo; -#undef INTERFACE #define INTERFACE ICreateErrorInfo DECLARE_INTERFACE_(ICreateErrorInfo, IUnknown) { @@ -647,9 +646,9 @@ DECLARE_INTERFACE_(ICreateErrorInfo, IUnknown) STDMETHOD(SetHelpFile)(THIS_ LPOLESTR) PURE; STDMETHOD(SetHelpContext)(THIS_ DWORD) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_ISupportErrorInfo; -#undef INTERFACE #define INTERFACE ISupportErrorInfo DECLARE_INTERFACE_(ISupportErrorInfo, IUnknown) { @@ -658,9 +657,9 @@ DECLARE_INTERFACE_(ISupportErrorInfo, IUnknown) STDMETHOD_(ULONG,Release)(THIS) PURE; STDMETHOD(InterfaceSupportsErrorInfo)(THIS_ REFIID) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IRecordInfo; -#undef INTERFACE #define INTERFACE IRecordInfo DECLARE_INTERFACE_(IRecordInfo, IUnknown) { @@ -684,9 +683,9 @@ DECLARE_INTERFACE_(IRecordInfo, IUnknown) STDMETHOD(RecordCreateCopy)(THIS_ PVOID,PVOID*) PURE; STDMETHOD(RecordDestroy )(THIS_ PVOID) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_ITypeMarshal; -#undef INTERFACE #define INTERFACE ITypeMarshal DECLARE_INTERFACE_(ITypeMarshal, IUnknown) { @@ -698,6 +697,7 @@ DECLARE_INTERFACE_(ITypeMarshal, IUnknown) STDMETHOD(Unmarshal)(THIS_ PVOID,DWORD,ULONG,BYTE*,ULONG*) PURE; STDMETHOD(Free)(THIS_ PVOID) PURE; }; +#undef INTERFACE #ifdef __cplusplus } diff --git a/reactos/w32api/include/objidl.h b/reactos/w32api/include/objidl.h index 5dd99fdbb8b..52dc143ee29 100644 --- a/reactos/w32api/include/objidl.h +++ b/reactos/w32api/include/objidl.h @@ -425,7 +425,6 @@ DECLARE_ENUMERATOR_(IEnumMoniker,interface IMoniker*); DECLARE_ENUMERATOR_(IEnumUnknown,IUnknown*); EXTERN_C const IID IID_ISequentialStream; -#undef INTERFACE #define INTERFACE ISequentialStream DECLARE_INTERFACE_(ISequentialStream,IUnknown) { @@ -437,7 +436,6 @@ DECLARE_INTERFACE_(ISequentialStream,IUnknown) }; EXTERN_C const IID IID_IStream; -#undef INTERFACE #define INTERFACE IStream DECLARE_INTERFACE_(IStream,ISequentialStream) { @@ -456,9 +454,9 @@ DECLARE_INTERFACE_(IStream,ISequentialStream) STDMETHOD(Stat)(THIS_ STATSTG*,DWORD) PURE; STDMETHOD(Clone)(THIS_ LPSTREAM*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IMarshal; -#undef INTERFACE #define INTERFACE IMarshal DECLARE_INTERFACE_(IMarshal,IUnknown) { @@ -474,7 +472,6 @@ DECLARE_INTERFACE_(IMarshal,IUnknown) }; EXTERN_C const IID IID_IStdMarshalInfo; -#undef INTERFACE #define INTERFACE IStdMarshalInfo DECLARE_INTERFACE_(IStdMarshalInfo,IUnknown) { @@ -483,9 +480,9 @@ DECLARE_INTERFACE_(IStdMarshalInfo,IUnknown) STDMETHOD_(ULONG,Release)(THIS) PURE; STDMETHOD(GetClassForHandler)(THIS_ DWORD,PVOID,CLSID*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IMalloc; -#undef INTERFACE #define INTERFACE IMalloc DECLARE_INTERFACE_(IMalloc,IUnknown) { @@ -499,9 +496,9 @@ DECLARE_INTERFACE_(IMalloc,IUnknown) STDMETHOD_(int,DidAlloc)(THIS_ void*) PURE; STDMETHOD_(void,HeapMinimize)(THIS) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IMallocSpy; -#undef INTERFACE #define INTERFACE IMallocSpy DECLARE_INTERFACE_(IMallocSpy,IUnknown) { @@ -521,9 +518,9 @@ DECLARE_INTERFACE_(IMallocSpy,IUnknown) STDMETHOD_(void,PreHeapMinimize)(THIS) PURE; STDMETHOD_(void,PostHeapMinimize)(THIS) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IMessageFilter; -#undef INTERFACE #define INTERFACE IMessageFilter DECLARE_INTERFACE_(IMessageFilter,IUnknown) { @@ -534,9 +531,9 @@ DECLARE_INTERFACE_(IMessageFilter,IUnknown) STDMETHOD_(DWORD,RetryRejectedCall)(THIS_ HTASK,DWORD,DWORD) PURE; STDMETHOD_(DWORD,MessagePending)(THIS_ HTASK,DWORD,DWORD) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IPersist; -#undef INTERFACE #define INTERFACE IPersist DECLARE_INTERFACE_(IPersist,IUnknown) { @@ -545,9 +542,9 @@ DECLARE_INTERFACE_(IPersist,IUnknown) STDMETHOD_(ULONG,Release)(THIS) PURE; STDMETHOD(GetClassID)(THIS_ CLSID*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IPersistStream; -#undef INTERFACE #define INTERFACE IPersistStream DECLARE_INTERFACE_(IPersistStream,IPersist) { @@ -560,9 +557,9 @@ DECLARE_INTERFACE_(IPersistStream,IPersist) STDMETHOD(Save)(THIS_ IStream*,BOOL) PURE; STDMETHOD(GetSizeMax)(THIS_ PULARGE_INTEGER) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IRunningObjectTable; -#undef INTERFACE #define INTERFACE IRunningObjectTable DECLARE_INTERFACE_(IRunningObjectTable,IUnknown) { @@ -577,9 +574,9 @@ DECLARE_INTERFACE_(IRunningObjectTable,IUnknown) STDMETHOD(GetTimeOfLastChange)(THIS_ LPMONIKER,LPFILETIME) PURE; STDMETHOD(EnumRunning)(THIS_ IEnumMoniker**) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IBindCtx; -#undef INTERFACE #define INTERFACE IBindCtx DECLARE_INTERFACE_(IBindCtx,IUnknown) { @@ -597,9 +594,9 @@ DECLARE_INTERFACE_(IBindCtx,IUnknown) STDMETHOD(EnumObjectParam)(THIS_ IEnumString**) PURE; STDMETHOD(RevokeObjectParam)(THIS_ LPOLESTR) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IMoniker; -#undef INTERFACE #define INTERFACE IMoniker DECLARE_INTERFACE_(IMoniker,IPersistStream) { @@ -627,9 +624,9 @@ DECLARE_INTERFACE_(IMoniker,IPersistStream) STDMETHOD(ParseDisplayName)(THIS_ IBindCtx*,IMoniker*,LPOLESTR,ULONG*,IMoniker**) PURE; STDMETHOD(IsSystemMoniker)(THIS_ PDWORD) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IPersistStorage; -#undef INTERFACE #define INTERFACE IPersistStorage DECLARE_INTERFACE_(IPersistStorage,IPersist) { @@ -644,9 +641,9 @@ DECLARE_INTERFACE_(IPersistStorage,IPersist) STDMETHOD(SaveCompleted)(THIS_ LPSTORAGE) PURE; STDMETHOD(HandsOffStorage)(THIS) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IPersistFile; -#undef INTERFACE #define INTERFACE IPersistFile DECLARE_INTERFACE_(IPersistFile,IPersist) { @@ -660,9 +657,9 @@ DECLARE_INTERFACE_(IPersistFile,IPersist) STDMETHOD(SaveCompleted)(THIS_ LPCOLESTR) PURE; STDMETHOD(GetCurFile)(THIS_ LPOLESTR*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IAdviseSink; -#undef INTERFACE #define INTERFACE IAdviseSink DECLARE_INTERFACE_(IAdviseSink,IUnknown) { @@ -675,9 +672,9 @@ DECLARE_INTERFACE_(IAdviseSink,IUnknown) STDMETHOD_(void,OnSave)(THIS) PURE; STDMETHOD_(void,OnClose)(THIS) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IAdviseSink2; -#undef INTERFACE #define INTERFACE IAdviseSink2 DECLARE_INTERFACE_(IAdviseSink2,IAdviseSink) { @@ -691,9 +688,9 @@ DECLARE_INTERFACE_(IAdviseSink2,IAdviseSink) STDMETHOD_(void,OnClose)(THIS) PURE; STDMETHOD_(void,OnLinkSrcChange)(THIS_ IMoniker*); }; +#undef INTERFACE EXTERN_C const IID IID_IDataObject; -#undef INTERFACE #define INTERFACE IDataObject DECLARE_INTERFACE_(IDataObject,IUnknown) { @@ -710,9 +707,9 @@ DECLARE_INTERFACE_(IDataObject,IUnknown) STDMETHOD(DUnadvise)(THIS_ DWORD) PURE; STDMETHOD(EnumDAdvise)(THIS_ IEnumSTATDATA**) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IDataAdviseHolder; -#undef INTERFACE #define INTERFACE IDataAdviseHolder DECLARE_INTERFACE_(IDataAdviseHolder,IUnknown) { @@ -724,9 +721,9 @@ DECLARE_INTERFACE_(IDataAdviseHolder,IUnknown) STDMETHOD(EnumAdvise)(THIS_ IEnumSTATDATA**) PURE; STDMETHOD(SendOnDataChange)(THIS_ IDataObject*,DWORD,DWORD) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IStorage; -#undef INTERFACE #define INTERFACE IStorage DECLARE_INTERFACE_(IStorage,IUnknown) { @@ -749,9 +746,9 @@ DECLARE_INTERFACE_(IStorage,IUnknown) STDMETHOD(SetStateBits)(THIS_ DWORD,DWORD) PURE; STDMETHOD(Stat)(THIS_ STATSTG*,DWORD) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IRootStorage; -#undef INTERFACE #define INTERFACE IRootStorage DECLARE_INTERFACE_(IRootStorage,IPersist) { @@ -760,9 +757,9 @@ DECLARE_INTERFACE_(IRootStorage,IPersist) STDMETHOD_(ULONG,Release)(THIS) PURE; STDMETHOD(SwitchToFile)(THIS_ LPOLESTR) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IRpcChannelBuffer; -#undef INTERFACE #define INTERFACE IRpcChannelBuffer DECLARE_INTERFACE_(IRpcChannelBuffer,IUnknown) { @@ -775,9 +772,9 @@ DECLARE_INTERFACE_(IRpcChannelBuffer,IUnknown) STDMETHOD(GetDestCtx)(THIS_ PDWORD,PVOID*) PURE; STDMETHOD(IsConnected)(THIS) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IRpcProxyBuffer; -#undef INTERFACE #define INTERFACE IRpcProxyBuffer DECLARE_INTERFACE_(IRpcProxyBuffer,IUnknown) { @@ -788,9 +785,9 @@ DECLARE_INTERFACE_(IRpcProxyBuffer,IUnknown) STDMETHOD_(void,Disconnect)(THIS) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IRpcStubBuffer; -#undef INTERFACE #define INTERFACE IRpcStubBuffer DECLARE_INTERFACE_(IRpcStubBuffer,IUnknown) { @@ -805,9 +802,9 @@ DECLARE_INTERFACE_(IRpcStubBuffer,IUnknown) STDMETHOD(DebugServerQueryInterface)(THIS_ PVOID*) PURE; STDMETHOD(DebugServerRelease)(THIS_ PVOID) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IPSFactoryBuffer; -#undef INTERFACE #define INTERFACE IPSFactoryBuffer DECLARE_INTERFACE_(IPSFactoryBuffer,IUnknown) { @@ -817,10 +814,10 @@ DECLARE_INTERFACE_(IPSFactoryBuffer,IUnknown) STDMETHOD(CreateProxy)(THIS_ LPUNKNOWN,REFIID,LPRPCPROXYBUFFER*,PVOID*) PURE; STDMETHOD(CreateStub)(THIS_ REFIID,LPUNKNOWN,LPRPCSTUBBUFFER*) PURE; }; +#undef INTERFACE typedef interface IPSFactoryBuffer *LPPSFACTORYBUFFER; EXTERN_C const IID IID_ILockBytes; -#undef INTERFACE #define INTERFACE ILockBytes DECLARE_INTERFACE_(ILockBytes,IUnknown) { @@ -835,9 +832,9 @@ DECLARE_INTERFACE_(ILockBytes,IUnknown) STDMETHOD(UnlockRegion)(THIS_ ULARGE_INTEGER,ULARGE_INTEGER,DWORD) PURE; STDMETHOD(Stat)(THIS_ STATSTG*,DWORD) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IExternalConnection; -#undef INTERFACE #define INTERFACE IExternalConnection DECLARE_INTERFACE_(IExternalConnection,IUnknown) { @@ -847,9 +844,9 @@ DECLARE_INTERFACE_(IExternalConnection,IUnknown) STDMETHOD(AddConnection)(THIS_ DWORD,DWORD) PURE; STDMETHOD(ReleaseConnection)(THIS_ DWORD,DWORD,BOOL) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IRunnableObject; -#undef INTERFACE #define INTERFACE IRunnableObject DECLARE_INTERFACE_(IRunnableObject,IUnknown) { @@ -862,9 +859,9 @@ DECLARE_INTERFACE_(IRunnableObject,IUnknown) STDMETHOD(LockRunning)(THIS_ BOOL,BOOL) PURE; STDMETHOD(SetContainedObject)(THIS_ BOOL) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IROTData; -#undef INTERFACE #define INTERFACE IROTData DECLARE_INTERFACE_(IROTData,IUnknown) { @@ -873,9 +870,9 @@ DECLARE_INTERFACE_(IROTData,IUnknown) STDMETHOD_(ULONG,Release)(THIS) PURE; STDMETHOD(GetComparisonData)(THIS_ PVOID,ULONG,PULONG) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IChannelHook; -#undef INTERFACE #define INTERFACE IChannelHook DECLARE_INTERFACE_(IChannelHook,IUnknown) { @@ -889,9 +886,9 @@ DECLARE_INTERFACE_(IChannelHook,IUnknown) STDMETHOD_(void,ServerGetSize)(THIS_ REFGUID,REFIID,HRESULT,PULONG) PURE; STDMETHOD_(void,ServerFillBuffer)(THIS_ REFGUID,REFIID,PULONG,PVOID,HRESULT) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IPropertyStorage; -#undef INTERFACE #define INTERFACE IPropertyStorage DECLARE_INTERFACE_(IPropertyStorage,IUnknown) { @@ -911,9 +908,9 @@ DECLARE_INTERFACE_(IPropertyStorage,IUnknown) STDMETHOD(Stat)(THIS_ STATPROPSTG*) PURE; STDMETHOD(SetTimes)(THIS_ FILETIME const*,FILETIME const*,FILETIME const*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IPropertySetStorage; -#undef INTERFACE #define INTERFACE IPropertySetStorage DECLARE_INTERFACE_(IPropertySetStorage,IUnknown) { @@ -925,9 +922,9 @@ DECLARE_INTERFACE_(IPropertySetStorage,IUnknown) STDMETHOD(Delete)(THIS_ REFFMTID) PURE; STDMETHOD(Enum)(THIS_ IEnumSTATPROPSETSTG**) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IClientSecurity; -#undef INTERFACE #define INTERFACE IClientSecurity DECLARE_INTERFACE_(IClientSecurity,IUnknown) { @@ -938,9 +935,9 @@ DECLARE_INTERFACE_(IClientSecurity,IUnknown) STDMETHOD(SetBlanket)(THIS_ PVOID,DWORD,DWORD,LPWSTR,DWORD,DWORD,RPC_AUTH_IDENTITY_HANDLE*,DWORD) PURE; STDMETHOD(CopyProxy)(THIS_ LPUNKNOWN,LPUNKNOWN*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IServerSecurity; -#undef INTERFACE #define INTERFACE IServerSecurity DECLARE_INTERFACE_(IServerSecurity,IUnknown) { @@ -952,9 +949,9 @@ DECLARE_INTERFACE_(IServerSecurity,IUnknown) STDMETHOD(RevertToSelf)(THIS) PURE; STDMETHOD(IsImpersonating)(THIS) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IClassActivator; -#undef INTERFACE #define INTERFACE IClassActivator DECLARE_INTERFACE_(IClassActivator,IUnknown) { @@ -963,9 +960,9 @@ DECLARE_INTERFACE_(IClassActivator,IUnknown) STDMETHOD_(ULONG,Release)(THIS) PURE; STDMETHOD(GetClassObject)(THIS_ REFCLSID,DWORD,LCID,REFIID,PVOID*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IFillLockBytes; -#undef INTERFACE #define INTERFACE IFillLockBytes DECLARE_INTERFACE_(IFillLockBytes,IUnknown) { @@ -977,9 +974,9 @@ DECLARE_INTERFACE_(IFillLockBytes,IUnknown) STDMETHOD(SetFillSize)(THIS_ ULARGE_INTEGER) PURE; STDMETHOD(Terminate)(THIS_ BOOL) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IProgressNotify; -#undef INTERFACE #define INTERFACE IProgressNotify DECLARE_INTERFACE_(IProgressNotify,IUnknown) { @@ -988,9 +985,9 @@ DECLARE_INTERFACE_(IProgressNotify,IUnknown) STDMETHOD_(ULONG,Release)(THIS) PURE; STDMETHOD(OnProgress)(THIS_ DWORD,DWORD,BOOL,BOOL) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_ILayoutStorage; -#undef INTERFACE #define INTERFACE ILayoutStorage DECLARE_INTERFACE_(ILayoutStorage,IUnknown) { @@ -1002,9 +999,9 @@ DECLARE_INTERFACE_(ILayoutStorage,IUnknown) STDMETHOD(EndMonitor)(THIS) PURE; STDMETHOD(ReLayoutDocfile)(THIS_ OLECHAR*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IGlobalInterfaceTable; -#undef INTERFACE #define INTERFACE IGlobalInterfaceTable DECLARE_INTERFACE_(IGlobalInterfaceTable,IUnknown) { @@ -1015,6 +1012,7 @@ DECLARE_INTERFACE_(IGlobalInterfaceTable,IUnknown) STDMETHOD(RevokeInterfaceFromGlobal)(THIS_ DWORD) PURE; STDMETHOD(GetInterfaceFromGlobal)(THIS_ DWORD,REFIID,void**) PURE; }; +#undef INTERFACE #ifdef COBJMACROS #define IGlobalInterfaceTable_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) diff --git a/reactos/w32api/include/ocidl.h b/reactos/w32api/include/ocidl.h index 3dbfac2965b..d608d719abf 100644 --- a/reactos/w32api/include/ocidl.h +++ b/reactos/w32api/include/ocidl.h @@ -139,7 +139,6 @@ typedef struct tagPROPPAGEINFO { } PROPPAGEINFO,*LPPROPPAGEINFO; EXTERN_C const IID IID_IOleControl; -#undef INTERFACE #define INTERFACE IOleControl DECLARE_INTERFACE_(IOleControl,IUnknown) { @@ -151,9 +150,9 @@ DECLARE_INTERFACE_(IOleControl,IUnknown) STDMETHOD(OnAmbientPropertyChange)(THIS_ DISPID) PURE; STDMETHOD(FreezeEvents)(THIS_ BOOL) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IOleControlSite; -#undef INTERFACE #define INTERFACE IOleControlSite DECLARE_INTERFACE_(IOleControlSite,IUnknown) { @@ -168,6 +167,7 @@ DECLARE_INTERFACE_(IOleControlSite,IUnknown) STDMETHOD(OnFocus)(THIS_ BOOL) PURE; STDMETHOD(ShowPropertyFrame)(THIS) PURE; }; +#undef INTERFACE #ifdef COBJMACROS #define IOleControlSite_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) @@ -183,7 +183,6 @@ DECLARE_INTERFACE_(IOleControlSite,IUnknown) #endif EXTERN_C const IID IID_ISimpleFrameSite; -#undef INTERFACE #define INTERFACE ISimpleFrameSite DECLARE_INTERFACE_(ISimpleFrameSite,IUnknown) { @@ -193,9 +192,9 @@ DECLARE_INTERFACE_(ISimpleFrameSite,IUnknown) STDMETHOD(PreMessageFilter)(THIS_ HWND,UINT,WPARAM,LPARAM,LRESULT*,PDWORD) PURE; STDMETHOD(PostMessageFilter)(THIS_ HWND,UINT,WPARAM,LPARAM,LRESULT*,DWORD) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IErrorLog; -#undef INTERFACE #define INTERFACE IErrorLog DECLARE_INTERFACE_(IErrorLog,IUnknown) { @@ -204,9 +203,9 @@ DECLARE_INTERFACE_(IErrorLog,IUnknown) STDMETHOD_(ULONG,Release)(THIS) PURE; STDMETHOD(AddError)(THIS_ LPCOLESTR,LPEXCEPINFO) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IPropertyBag; -#undef INTERFACE #define INTERFACE IPropertyBag DECLARE_INTERFACE_(IPropertyBag,IUnknown) { @@ -216,9 +215,9 @@ DECLARE_INTERFACE_(IPropertyBag,IUnknown) STDMETHOD(Read)(THIS_ LPCOLESTR,LPVARIANT,LPERRORLOG) PURE; STDMETHOD(Write)(THIS_ LPCOLESTR,LPVARIANT) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IPropertyBag2; -#undef INTERFACE #define INTERFACE IPropertyBag2 DECLARE_INTERFACE_(IPropertyBag2,IUnknown) { @@ -231,9 +230,9 @@ DECLARE_INTERFACE_(IPropertyBag2,IUnknown) STDMETHOD(GetPropertyInfo)(THIS_ ULONG,ULONG,PROPBAG2*,ULONG*) PURE; STDMETHOD(LoadObject)(THIS_ LPCOLESTR,DWORD,IUnknown*,LPERRORLOG) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IPersistPropertyBag; -#undef INTERFACE #define INTERFACE IPersistPropertyBag DECLARE_INTERFACE_(IPersistPropertyBag,IPersist) { @@ -245,6 +244,7 @@ DECLARE_INTERFACE_(IPersistPropertyBag,IPersist) STDMETHOD(Load)(THIS_ LPPROPERTYBAG,LPERRORLOG) PURE; STDMETHOD(Save)(THIS_ LPPROPERTYBAG,BOOL,BOOL) PURE; }; +#undef INTERFACE #ifdef COBJMACROS #define IPersistPropertyBag_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) @@ -257,7 +257,6 @@ DECLARE_INTERFACE_(IPersistPropertyBag,IPersist) #endif EXTERN_C const IID IID_IPersistPropertyBag2; -#undef INTERFACE #define INTERFACE IPersistPropertyBag2 DECLARE_INTERFACE_(IPersistPropertyBag2,IPersist) { @@ -270,6 +269,7 @@ DECLARE_INTERFACE_(IPersistPropertyBag2,IPersist) STDMETHOD(Save)(THIS_ LPPROPERTYBAG2,BOOL,BOOL) PURE; STDMETHOD(IsDirty)(THIS) PURE; }; +#undef INTERFACE #ifdef COBJMACROS #define IPersistPropertyBag2_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) @@ -283,7 +283,6 @@ DECLARE_INTERFACE_(IPersistPropertyBag2,IPersist) #endif EXTERN_C const IID IID_IPersistStreamInit; -#undef INTERFACE #define INTERFACE IPersistStreamInit DECLARE_INTERFACE_(IPersistStreamInit,IPersist) { @@ -297,9 +296,9 @@ DECLARE_INTERFACE_(IPersistStreamInit,IPersist) STDMETHOD(GetSizeMax)(THIS_ PULARGE_INTEGER) PURE; STDMETHOD(InitNew)(THIS) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IPersistMemory; -#undef INTERFACE #define INTERFACE IPersistMemory DECLARE_INTERFACE_(IPersistMemory,IPersist) { @@ -313,9 +312,9 @@ DECLARE_INTERFACE_(IPersistMemory,IPersist) STDMETHOD(GetSizeMax)(THIS_ PULONG) PURE; STDMETHOD(InitNew)(THIS) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IPropertyNotifySink; -#undef INTERFACE #define INTERFACE IPropertyNotifySink DECLARE_INTERFACE_(IPropertyNotifySink,IUnknown) { @@ -325,6 +324,7 @@ DECLARE_INTERFACE_(IPropertyNotifySink,IUnknown) STDMETHOD(OnChanged)(THIS_ DISPID) PURE; STDMETHOD(OnRequestEdit)(THIS_ DISPID) PURE; }; +#undef INTERFACE #ifdef COBJMACROS #define IPropertyNotifySink_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) @@ -335,7 +335,6 @@ DECLARE_INTERFACE_(IPropertyNotifySink,IUnknown) #endif EXTERN_C const IID IID_IProvideClassInfo; -#undef INTERFACE #define INTERFACE IProvideClassInfo DECLARE_INTERFACE_(IProvideClassInfo,IUnknown) { @@ -344,9 +343,9 @@ DECLARE_INTERFACE_(IProvideClassInfo,IUnknown) STDMETHOD_(ULONG,Release)(THIS) PURE; STDMETHOD(GetClassInfo)(THIS_ LPTYPEINFO*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IProvideClassInfo2; -#undef INTERFACE #define INTERFACE IProvideClassInfo2 DECLARE_INTERFACE_(IProvideClassInfo2,IProvideClassInfo) { @@ -356,9 +355,9 @@ DECLARE_INTERFACE_(IProvideClassInfo2,IProvideClassInfo) STDMETHOD(GetClassInfo)(THIS_ LPTYPEINFO*) PURE; STDMETHOD(GetGUID)(THIS_ DWORD,GUID*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IConnectionPointContainer; -#undef INTERFACE #define INTERFACE IConnectionPointContainer DECLARE_INTERFACE_(IConnectionPointContainer,IUnknown) { @@ -368,6 +367,7 @@ DECLARE_INTERFACE_(IConnectionPointContainer,IUnknown) STDMETHOD(EnumConnectionPoints)(THIS_ LPENUMCONNECTIONPOINTS*) PURE; STDMETHOD(FindConnectionPoint)(THIS_ REFIID,LPCONNECTIONPOINT*) PURE; }; +#undef INTERFACE #ifdef COBJMACROS #define IConnectionPointContainer_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) @@ -378,7 +378,6 @@ DECLARE_INTERFACE_(IConnectionPointContainer,IUnknown) #endif EXTERN_C const IID IID_IEnumConnectionPoints; -#undef INTERFACE #define INTERFACE IEnumConnectionPoints DECLARE_INTERFACE_(IEnumConnectionPoints,IUnknown) { @@ -390,9 +389,9 @@ DECLARE_INTERFACE_(IEnumConnectionPoints,IUnknown) STDMETHOD(Reset)(THIS) PURE; STDMETHOD(Clone)(THIS_ LPENUMCONNECTIONPOINTS*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IConnectionPoint; -#undef INTERFACE #define INTERFACE IConnectionPoint DECLARE_INTERFACE_(IConnectionPoint,IUnknown) { @@ -405,6 +404,7 @@ DECLARE_INTERFACE_(IConnectionPoint,IUnknown) STDMETHOD(Unadvise)(THIS_ DWORD) PURE; STDMETHOD(EnumConnections)(THIS_ LPENUMCONNECTIONS*) PURE; }; +#undef INTERFACE #ifdef COBJMACROS #define IConnectionPoint_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) @@ -418,7 +418,6 @@ DECLARE_INTERFACE_(IConnectionPoint,IUnknown) #endif EXTERN_C const IID IID_IEnumConnections; -#undef INTERFACE #define INTERFACE IEnumConnections DECLARE_INTERFACE_(IEnumConnections,IUnknown) { @@ -430,6 +429,7 @@ DECLARE_INTERFACE_(IEnumConnections,IUnknown) STDMETHOD(Reset)(THIS) PURE; STDMETHOD(Clone)(THIS_ LPENUMCONNECTIONS*) PURE; }; +#undef INTERFACE #ifdef COBJMACROS #define IEnumConnections_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) @@ -442,7 +442,6 @@ DECLARE_INTERFACE_(IEnumConnections,IUnknown) #endif EXTERN_C const IID IID_IClassFactory2; -#undef INTERFACE #define INTERFACE IClassFactory2 DECLARE_INTERFACE_(IClassFactory2,IClassFactory) { @@ -455,9 +454,9 @@ DECLARE_INTERFACE_(IClassFactory2,IClassFactory) STDMETHOD(RequestLicKey)(THIS_ DWORD,BSTR*) PURE; STDMETHOD(CreateInstanceLic)(THIS_ LPUNKNOWN,LPUNKNOWN,REFIID,BSTR,PVOID*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_ISpecifyPropertyPages; -#undef INTERFACE #define INTERFACE ISpecifyPropertyPages DECLARE_INTERFACE_(ISpecifyPropertyPages,IUnknown) { @@ -466,9 +465,9 @@ DECLARE_INTERFACE_(ISpecifyPropertyPages,IUnknown) STDMETHOD_(ULONG,Release)(THIS) PURE; STDMETHOD(GetPages)(THIS_ CAUUID*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IPerPropertyBrowsing; -#undef INTERFACE #define INTERFACE IPerPropertyBrowsing DECLARE_INTERFACE_(IPerPropertyBrowsing,IUnknown) { @@ -480,9 +479,9 @@ DECLARE_INTERFACE_(IPerPropertyBrowsing,IUnknown) STDMETHOD(GetPredefinedStrings)(THIS_ DISPID,CALPOLESTR*,CADWORD*) PURE; STDMETHOD(GetPredefinedValue)(THIS_ DISPID,DWORD,VARIANT*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IPropertyPageSite; -#undef INTERFACE #define INTERFACE IPropertyPageSite DECLARE_INTERFACE_(IPropertyPageSite,IUnknown) { @@ -494,9 +493,9 @@ DECLARE_INTERFACE_(IPropertyPageSite,IUnknown) STDMETHOD(GetPageContainer)(THIS_ LPUNKNOWN*) PURE; STDMETHOD(TranslateAccelerator)(THIS_ LPMSG) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IPropertyPage; -#undef INTERFACE #define INTERFACE IPropertyPage DECLARE_INTERFACE_(IPropertyPage,IUnknown) { @@ -515,9 +514,9 @@ DECLARE_INTERFACE_(IPropertyPage,IUnknown) STDMETHOD(Help)(THIS_ LPCOLESTR) PURE; STDMETHOD(TranslateAccelerator)(THIS_ LPMSG) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IPropertyPage2; -#undef INTERFACE #define INTERFACE IPropertyPage2 DECLARE_INTERFACE_(IPropertyPage2,IPropertyPage) { @@ -537,9 +536,9 @@ DECLARE_INTERFACE_(IPropertyPage2,IPropertyPage) STDMETHOD(TranslateAccelerator)(THIS_ LPMSG) PURE; STDMETHOD(EditProperty)(THIS_ DISPID) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IFont; -#undef INTERFACE #define INTERFACE IFont DECLARE_INTERFACE_(IFont,IUnknown) { @@ -571,9 +570,9 @@ DECLARE_INTERFACE_(IFont,IUnknown) STDMETHOD(ReleaseHfont)(THIS_ HFONT) PURE; STDMETHOD(SetHdc)(THIS_ HDC) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IFontDisp; -#undef INTERFACE #define INTERFACE IFontDisp DECLARE_INTERFACE_(IFontDisp,IDispatch) { @@ -585,9 +584,9 @@ DECLARE_INTERFACE_(IFontDisp,IDispatch) STDMETHOD(GetIDsOfNames)(THIS_ REFIID,LPOLESTR*,UINT,LCID,DISPID*) PURE; STDMETHOD(Invoke)(THIS_ DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IPicture; -#undef INTERFACE #define INTERFACE IPicture DECLARE_INTERFACE_(IPicture,IUnknown) { @@ -609,9 +608,9 @@ DECLARE_INTERFACE_(IPicture,IUnknown) STDMETHOD(SaveAsFile)(THIS_ LPSTREAM,BOOL,LONG*) PURE; STDMETHOD(get_Attributes)(THIS_ PDWORD) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IPictureDisp; -#undef INTERFACE #define INTERFACE IPictureDisp DECLARE_INTERFACE_(IPictureDisp,IDispatch) { @@ -623,9 +622,9 @@ DECLARE_INTERFACE_(IPictureDisp,IDispatch) STDMETHOD(GetIDsOfNames)(THIS_ REFIID,LPOLESTR*,UINT,LCID,DISPID*) PURE; STDMETHOD(Invoke)(THIS_ DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IOleInPlaceSiteEx; -#undef INTERFACE #define INTERFACE IOleInPlaceSiteEx DECLARE_INTERFACE_(IOleInPlaceSiteEx,IOleInPlaceSite) { @@ -648,9 +647,9 @@ DECLARE_INTERFACE_(IOleInPlaceSiteEx,IOleInPlaceSite) STDMETHOD(OnInPlaceDeactivateEx)(THIS_ BOOL) PURE; STDMETHOD(RequestUIActivate)(THIS) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IObjectWithSite; -#undef INTERFACE #define INTERFACE IObjectWithSite DECLARE_INTERFACE_(IObjectWithSite,IUnknown) { @@ -660,9 +659,9 @@ DECLARE_INTERFACE_(IObjectWithSite,IUnknown) STDMETHOD(SetSite)(THIS_ IUnknown*) PURE; STDMETHOD(GetSite)(THIS_ REFIID, void**) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IOleInPlaceSiteWindowless; -#undef INTERFACE #define INTERFACE IOleInPlaceSiteWindowless DECLARE_INTERFACE_(IOleInPlaceSiteWindowless,IOleInPlaceSiteEx) { @@ -699,9 +698,9 @@ DECLARE_INTERFACE_(IOleInPlaceSiteWindowless,IOleInPlaceSiteEx) STDMETHOD(AdjustRect)(THIS_ LPCRECT) PURE; STDMETHOD(OnDefWindowMessage)(THIS_ UINT,WPARAM,LPARAM,LRESULT*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IAdviseSinkEx; -#undef INTERFACE #define INTERFACE IAdviseSinkEx DECLARE_INTERFACE_(IAdviseSinkEx,IUnknown) { @@ -715,9 +714,9 @@ DECLARE_INTERFACE_(IAdviseSinkEx,IUnknown) STDMETHOD_(void,OnClose)(THIS) PURE; STDMETHOD(OnViewStatusChange)(THIS_ DWORD) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IPointerInactive; -#undef INTERFACE #define INTERFACE IPointerInactive DECLARE_INTERFACE_(IPointerInactive,IUnknown) { @@ -728,9 +727,9 @@ DECLARE_INTERFACE_(IPointerInactive,IUnknown) STDMETHOD(OnInactiveMouseMove)(THIS_ LPCRECT,LONG,LONG,DWORD) PURE; STDMETHOD(OnInactiveSetCursor)(THIS_ LPCRECT,LONG,LONG,DWORD,BOOL) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IOleUndoUnit; -#undef INTERFACE #define INTERFACE IOleUndoUnit DECLARE_INTERFACE_(IOleUndoUnit,IUnknown) { @@ -742,9 +741,9 @@ DECLARE_INTERFACE_(IOleUndoUnit,IUnknown) STDMETHOD(GetUnitType)(THIS_ CLSID*,LONG*) PURE; STDMETHOD(OnNextAdd)(THIS) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IOleParentUndoUnit; -#undef INTERFACE #define INTERFACE IOleParentUndoUnit DECLARE_INTERFACE_(IOleParentUndoUnit,IOleUndoUnit) { @@ -761,9 +760,9 @@ DECLARE_INTERFACE_(IOleParentUndoUnit,IOleUndoUnit) STDMETHOD(FindUnit)(THIS_ IOleUndoUnit*) PURE; STDMETHOD(GetParentState)(THIS_ DWORD*) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IEnumOleUndoUnits; -#undef INTERFACE #define INTERFACE IEnumOleUndoUnits DECLARE_INTERFACE_(IEnumOleUndoUnits,IUnknown) { @@ -775,9 +774,9 @@ DECLARE_INTERFACE_(IEnumOleUndoUnits,IUnknown) STDMETHOD(Reset)(THIS) PURE; STDMETHOD(Clone)(THIS_ IEnumOleUndoUnits**) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IOleUndoManager; -#undef INTERFACE #define INTERFACE IOleUndoManager DECLARE_INTERFACE_(IOleUndoManager,IUnknown) { @@ -797,9 +796,9 @@ DECLARE_INTERFACE_(IOleUndoManager,IUnknown) STDMETHOD(GetLastRedoDescription)(THIS_ BSTR*) PURE; STDMETHOD(Enable)(THIS_ BOOL) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IQuickActivate; -#undef INTERFACE #define INTERFACE IQuickActivate DECLARE_INTERFACE_(IQuickActivate,IUnknown) { @@ -810,6 +809,7 @@ DECLARE_INTERFACE_(IQuickActivate,IUnknown) STDMETHOD(SetContentExtent)(THIS_ LPSIZEL) PURE; STDMETHOD(GetContentExtent)(THIS_ LPSIZEL) PURE; }; +#undef INTERFACE #ifdef __cplusplus } diff --git a/reactos/w32api/include/oleacc.h b/reactos/w32api/include/oleacc.h index e78949820f8..c1a2825a167 100644 --- a/reactos/w32api/include/oleacc.h +++ b/reactos/w32api/include/oleacc.h @@ -149,7 +149,6 @@ typedef enum tagSELFLAG EXTERN_C const IID LIBID_Accessibility; EXTERN_C const IID IID_IAccessible; -#undef INTERFACE #define INTERFACE IAccessible DECLARE_INTERFACE_(IAccessible, IDispatch) { @@ -185,6 +184,7 @@ DECLARE_INTERFACE_(IAccessible, IDispatch) STDMETHOD(put_accName)(THIS_ VARIANT, BSTR) PURE; STDMETHOD(put_accValue)(THIS_ VARIANT, BSTR) PURE; }; +#undef INTERFACE typedef IAccessible* LPACCESSIBLE; STDAPI AccessibleChildren(IAccessible*,LONG,LONG,VARIANT*,LONG*); diff --git a/reactos/w32api/include/oledlg.h b/reactos/w32api/include/oledlg.h index 11dd88b9f1e..30f999e9e05 100644 --- a/reactos/w32api/include/oledlg.h +++ b/reactos/w32api/include/oledlg.h @@ -417,7 +417,6 @@ typedef struct tagOLEUIPASTESPECIALA { HGLOBAL hMetaPict; SIZEL sizel; } OLEUIPASTESPECIALA,*POLEUIPASTESPECIALA,*LPOLEUIPASTESPECIALA; -#undef INTERFACE #define INTERFACE IOleUILinkContainerW DECLARE_INTERFACE_(IOleUILinkContainerW, IUnknown) { @@ -433,6 +432,7 @@ DECLARE_INTERFACE_(IOleUILinkContainerW, IUnknown) STDMETHOD(UpdateLink) (THIS_ DWORD,BOOL,BOOL) PURE; STDMETHOD(CancelLink) (THIS_ DWORD) PURE; }; +#undef INTERFACE typedef IOleUILinkContainerW *LPOLEUILINKCONTAINERW; #undef INTERFACE #define INTERFACE IOleUILinkContainerA diff --git a/reactos/w32api/include/oleidl.h b/reactos/w32api/include/oleidl.h index 0043c878fe8..e5962cfd673 100644 --- a/reactos/w32api/include/oleidl.h +++ b/reactos/w32api/include/oleidl.h @@ -94,7 +94,6 @@ DECLARE_ENUMERATOR(OLEVERB); typedef IEnumOLEVERB IEnumOleVerb; EXTERN_C const IID IID_IParseDisplayName; -#undef INTERFACE #define INTERFACE IParseDisplayName DECLARE_INTERFACE_(IParseDisplayName,IUnknown) { @@ -103,6 +102,7 @@ DECLARE_INTERFACE_(IParseDisplayName,IUnknown) STDMETHOD_(ULONG,Release)(THIS) PURE; STDMETHOD(ParseDisplayName)(THIS_ IBindCtx*,LPOLESTR,ULONG*,IMoniker**) PURE; }; +#undef INTERFACE #ifdef COBJMACROS #define IParseDisplayName_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) @@ -112,7 +112,6 @@ DECLARE_INTERFACE_(IParseDisplayName,IUnknown) #endif EXTERN_C const IID IID_IOleContainer; -#undef INTERFACE #define INTERFACE IOleContainer DECLARE_INTERFACE_(IOleContainer,IParseDisplayName) { @@ -123,9 +122,9 @@ DECLARE_INTERFACE_(IOleContainer,IParseDisplayName) STDMETHOD(EnumObjects)(THIS_ DWORD,IEnumUnknown**) PURE; STDMETHOD(LockContainer)(THIS_ BOOL) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IOleItemContainer; -#undef INTERFACE #define INTERFACE IOleItemContainer DECLARE_INTERFACE_(IOleItemContainer,IOleContainer) { @@ -139,6 +138,7 @@ DECLARE_INTERFACE_(IOleItemContainer,IOleContainer) STDMETHOD(GetObjectStorage)(THIS_ LPOLESTR,IBindCtx*,REFIID,void**) PURE; STDMETHOD(IsRunning)(THIS_ LPOLESTR) PURE; }; +#undef INTERFACE #ifdef COBJMACROS #define IOleItemContainer_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) @@ -153,7 +153,6 @@ DECLARE_INTERFACE_(IOleItemContainer,IOleContainer) #endif EXTERN_C const IID IID_IOleClientSite; -#undef INTERFACE #define INTERFACE IOleClientSite DECLARE_INTERFACE_(IOleClientSite,IUnknown) { @@ -167,6 +166,7 @@ DECLARE_INTERFACE_(IOleClientSite,IUnknown) STDMETHOD(OnShowWindow)(THIS_ BOOL) PURE; STDMETHOD(RequestNewObjectLayout)(THIS) PURE; }; +#undef INTERFACE #ifdef COBJMACROS #define IOleClientSite_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) @@ -181,7 +181,6 @@ DECLARE_INTERFACE_(IOleClientSite,IUnknown) #endif EXTERN_C const IID IID_IOleObject; -#undef INTERFACE #define INTERFACE IOleObject DECLARE_INTERFACE_(IOleObject,IUnknown) { @@ -210,6 +209,7 @@ DECLARE_INTERFACE_(IOleObject,IUnknown) STDMETHOD(GetMiscStatus)(THIS_ DWORD,PDWORD) PURE; STDMETHOD(SetColorScheme)(THIS_ LPLOGPALETTE) PURE; }; +#undef INTERFACE #ifdef COBJMACROS #define IOleObject_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) @@ -239,7 +239,6 @@ DECLARE_INTERFACE_(IOleObject,IUnknown) #endif EXTERN_C const IID IID_IOleWindow; -#undef INTERFACE #define INTERFACE IOleWindow DECLARE_INTERFACE_(IOleWindow,IUnknown) { @@ -249,6 +248,7 @@ DECLARE_INTERFACE_(IOleWindow,IUnknown) STDMETHOD(GetWindow)(THIS_ HWND*) PURE; STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL) PURE; }; +#undef INTERFACE #ifdef COBJMACROS #define IOleWindow_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) @@ -259,7 +259,6 @@ DECLARE_INTERFACE_(IOleWindow,IUnknown) #endif EXTERN_C const IID IID_IOleInPlaceUIWindow; -#undef INTERFACE #define INTERFACE IOleInPlaceUIWindow DECLARE_INTERFACE_(IOleInPlaceUIWindow,IOleWindow) { @@ -273,9 +272,9 @@ DECLARE_INTERFACE_(IOleInPlaceUIWindow,IOleWindow) STDMETHOD(SetBorderSpace)(THIS_ LPCBORDERWIDTHS) PURE; STDMETHOD(SetActiveObject)(THIS_ LPOLEINPLACEACTIVEOBJECT,LPCOLESTR) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IOleInPlaceObject; -#undef INTERFACE #define INTERFACE IOleInPlaceObject DECLARE_INTERFACE_(IOleInPlaceObject,IOleWindow) { @@ -289,9 +288,9 @@ DECLARE_INTERFACE_(IOleInPlaceObject,IOleWindow) STDMETHOD(SetObjectRects)(THIS_ LPCRECT,LPCRECT) PURE; STDMETHOD(ReactivateAndUndo)(THIS) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IOleInPlaceActiveObject; -#undef INTERFACE #define INTERFACE IOleInPlaceActiveObject DECLARE_INTERFACE_(IOleInPlaceActiveObject,IOleWindow) { @@ -306,9 +305,9 @@ DECLARE_INTERFACE_(IOleInPlaceActiveObject,IOleWindow) STDMETHOD(ResizeBorder)(THIS_ LPCRECT,LPOLEINPLACEUIWINDOW,BOOL) PURE; STDMETHOD(EnableModeless)(THIS_ BOOL) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IOleInPlaceFrame; -#undef INTERFACE #define INTERFACE IOleInPlaceFrame DECLARE_INTERFACE_(IOleInPlaceFrame,IOleInPlaceUIWindow) { @@ -328,6 +327,7 @@ DECLARE_INTERFACE_(IOleInPlaceFrame,IOleInPlaceUIWindow) STDMETHOD(EnableModeless)(THIS_ BOOL) PURE; STDMETHOD(TranslateAccelerator)(THIS_ LPMSG,WORD) PURE; }; +#undef INTERFACE #ifdef COBJMACROS #define IOleInPlaceFrame_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) @@ -348,7 +348,6 @@ DECLARE_INTERFACE_(IOleInPlaceFrame,IOleInPlaceUIWindow) #endif EXTERN_C const IID IID_IOleInPlaceSite; -#undef INTERFACE #define INTERFACE IOleInPlaceSite DECLARE_INTERFACE_(IOleInPlaceSite,IOleWindow) { @@ -368,9 +367,9 @@ DECLARE_INTERFACE_(IOleInPlaceSite,IOleWindow) STDMETHOD(DeactivateAndUndo)(THIS) PURE; STDMETHOD(OnPosRectChange)(THIS_ LPCRECT) PURE; }; +#undef INTERFACE EXTERN_C const IID IID_IOleAdviseHolder; -#undef INTERFACE #define INTERFACE IOleAdviseHolder DECLARE_INTERFACE_(IOleAdviseHolder,IUnknown) { @@ -384,6 +383,7 @@ DECLARE_INTERFACE_(IOleAdviseHolder,IUnknown) STDMETHOD(SendOnSave)(THIS) PURE; STDMETHOD(SendOnClose)(THIS) PURE; }; +#undef INTERFACE #ifdef COBJMACROS #define IOleAdviseHolder_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) @@ -398,7 +398,6 @@ DECLARE_INTERFACE_(IOleAdviseHolder,IUnknown) #endif EXTERN_C const IID IID_IDropSource; -#undef INTERFACE #define INTERFACE IDropSource DECLARE_INTERFACE_(IDropSource,IUnknown) { @@ -408,6 +407,7 @@ DECLARE_INTERFACE_(IDropSource,IUnknown) STDMETHOD(QueryContinueDrag)(THIS_ BOOL,DWORD) PURE; STDMETHOD(GiveFeedback)(THIS_ DWORD) PURE; }; +#undef INTERFACE #ifdef COBJMACROS #define IDropSource_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) @@ -418,7 +418,6 @@ DECLARE_INTERFACE_(IDropSource,IUnknown) #endif EXTERN_C const IID IID_IDropTarget; -#undef INTERFACE #define INTERFACE IDropTarget DECLARE_INTERFACE_(IDropTarget,IUnknown) { @@ -430,6 +429,7 @@ DECLARE_INTERFACE_(IDropTarget,IUnknown) STDMETHOD(DragLeave)(THIS) PURE; STDMETHOD(Drop)(THIS_ LPDATAOBJECT,DWORD,POINTL,PDWORD) PURE; }; +#undef INTERFACE #ifdef COBJMACROS #define IDropTarget_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) @@ -443,7 +443,6 @@ DECLARE_INTERFACE_(IDropTarget,IUnknown) typedef BOOL(CALLBACK *__IView_pfncont)(DWORD); EXTERN_C const IID IID_IViewObject; -#undef INTERFACE #define INTERFACE IViewObject DECLARE_INTERFACE_(IViewObject,IUnknown) { @@ -457,6 +456,7 @@ DECLARE_INTERFACE_(IViewObject,IUnknown) STDMETHOD(SetAdvise)(THIS_ DWORD,DWORD,IAdviseSink*) PURE; STDMETHOD(GetAdvise)(THIS_ PDWORD,PDWORD,IAdviseSink**) PURE; }; +#undef INTERFACE #ifdef COBJMACROS #define IViewObject_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) @@ -471,7 +471,6 @@ DECLARE_INTERFACE_(IViewObject,IUnknown) #endif EXTERN_C const IID IID_IViewObject2; -#undef INTERFACE #define INTERFACE IViewObject2 DECLARE_INTERFACE_(IViewObject2,IViewObject) { @@ -486,6 +485,7 @@ DECLARE_INTERFACE_(IViewObject2,IViewObject) STDMETHOD(GetAdvise)(THIS_ PDWORD,PDWORD,IAdviseSink**) PURE; STDMETHOD(GetExtent)(THIS_ DWORD,LONG,DVTARGETDEVICE*,LPSIZEL) PURE; }; +#undef INTERFACE #ifdef COBJMACROS #define IViewObject2_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) @@ -501,7 +501,6 @@ DECLARE_INTERFACE_(IViewObject2,IViewObject) #endif EXTERN_C const IID IID_IOleCache; -#undef INTERFACE #define INTERFACE IOleCache DECLARE_INTERFACE_(IOleCache,IUnknown) { @@ -514,6 +513,7 @@ DECLARE_INTERFACE_(IOleCache,IUnknown) STDMETHOD(InitCache)(THIS_ LPDATAOBJECT); STDMETHOD(SetData)(THIS_ FORMATETC*,STGMEDIUM*,BOOL); }; +#undef INTERFACE #ifdef COBJMACROS #define IOleCache_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) @@ -527,7 +527,6 @@ DECLARE_INTERFACE_(IOleCache,IUnknown) #endif EXTERN_C const IID IID_IOleCache2; -#undef INTERFACE #define INTERFACE IOleCache2 DECLARE_INTERFACE_(IOleCache2,IOleCache) { @@ -542,6 +541,7 @@ DECLARE_INTERFACE_(IOleCache2,IOleCache) STDMETHOD(UpdateCache)(THIS_ LPDATAOBJECT,DWORD,LPVOID) PURE; STDMETHOD(DiscardCache)(THIS_ DWORD) PURE; }; +#undef INTERFACE #ifdef COBJMACROS #define IOleCache2_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) @@ -557,7 +557,6 @@ DECLARE_INTERFACE_(IOleCache2,IOleCache) #endif EXTERN_C const IID IID_IOleCacheControl; -#undef INTERFACE #define INTERFACE IOleCacheControl DECLARE_INTERFACE_(IOleCacheControl,IUnknown) { @@ -567,6 +566,7 @@ DECLARE_INTERFACE_(IOleCacheControl,IUnknown) STDMETHOD(OnRun)(THIS_ LPDATAOBJECT) PURE; STDMETHOD(OnStop)(THIS) PURE; }; +#undef INTERFACE #ifdef __cplusplus } diff --git a/reactos/w32api/include/richole.h b/reactos/w32api/include/richole.h index da2e336f867..48dc13abc52 100644 --- a/reactos/w32api/include/richole.h +++ b/reactos/w32api/include/richole.h @@ -54,7 +54,6 @@ typedef struct _reobject { DWORD dwUser; } REOBJECT; -#undef INTERFACE #define INTERFACE IRichEditOle DECLARE_INTERFACE_(IRichEditOle, IUnknown) { @@ -78,9 +77,9 @@ DECLARE_INTERFACE_(IRichEditOle, IUnknown) STDMETHOD(GetClipboardData)(THIS_ CHARRANGE*,DWORD,LPDATAOBJECT*) PURE; STDMETHOD(ImportDataObject)(THIS_ LPDATAOBJECT,CLIPFORMAT,HGLOBAL) PURE; }; +#undef INTERFACE typedef IRichEditOle *LPRICHEDITOLE; -#undef INTERFACE #define INTERFACE IRichEditOleCallback DECLARE_INTERFACE_(IRichEditOleCallback, IUnknown) { @@ -98,6 +97,7 @@ DECLARE_INTERFACE_(IRichEditOleCallback, IUnknown) STDMETHOD(GetDragDropEffect) (THIS_ BOOL,DWORD,PDWORD) PURE; STDMETHOD(GetContextMenu) (THIS_ WORD,LPOLEOBJECT,CHARRANGE*,HMENU*) PURE; }; +#undef INTERFACE typedef IRichEditOleCallback FAR * LPRICHEDITOLECALLBACK; #endif #pragma pack(pop) diff --git a/reactos/w32api/include/servprov.h b/reactos/w32api/include/servprov.h index 4905d69e495..76661026b31 100644 --- a/reactos/w32api/include/servprov.h +++ b/reactos/w32api/include/servprov.h @@ -10,7 +10,6 @@ extern "C" { #endif EXTERN_C const IID IID_IServiceProvider; -#undef INTERFACE #define INTERFACE IServiceProvider DECLARE_INTERFACE_(IServiceProvider,IUnknown) { @@ -19,6 +18,7 @@ DECLARE_INTERFACE_(IServiceProvider,IUnknown) STDMETHOD_(ULONG,Release)(THIS) PURE; STDMETHOD(QueryService)(THIS_ REFGUID,REFIID,void**) PURE; }; +#undef INTERFACE #ifdef COBJMACROS #define IServiceProvider_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) diff --git a/reactos/w32api/include/shlobj.h b/reactos/w32api/include/shlobj.h index 2243bd4dcef..52a1e4fcf4c 100644 --- a/reactos/w32api/include/shlobj.h +++ b/reactos/w32api/include/shlobj.h @@ -530,7 +530,6 @@ typedef IEnumIDList *LPENUMIDLIST; #define IEnumIDList_Clone(T,a) (T)->lpVtbl->Clone(T,a) #endif -#undef INTERFACE #define INTERFACE IContextMenu DECLARE_INTERFACE_(IContextMenu,IUnknown) { @@ -552,7 +551,6 @@ typedef IContextMenu *LPCONTEXTMENU; #define IContextMenu_GetCommandString(T,a,b,c,d,e) (T)->lpVtbl->GetCommandString(T,a,b,c,d,e) #endif -#undef INTERFACE #define INTERFACE IContextMenu2 DECLARE_INTERFACE_(IContextMenu2,IContextMenu) { @@ -564,6 +562,7 @@ DECLARE_INTERFACE_(IContextMenu2,IContextMenu) STDMETHOD(GetCommandString)(THIS_ UINT,UINT,PUINT,LPSTR,UINT) PURE; STDMETHOD(HandleMenuMsg)(THIS_ UINT,WPARAM,LPARAM) PURE; }; +#undef INTERFACE typedef IContextMenu2 *LPCONTEXTMENU2; #if (_WIN32_IE >= 0x0500) @@ -623,7 +622,6 @@ typedef enum { #define IContextMenu2_HandleMenuMsg(T,a,b,c) (T)->lpVtbl->HandleMenuMsg(T,a,b,c) #endif -#undef INTERFACE #define INTERFACE IColumnProvider DECLARE_INTERFACE_(IColumnProvider,IUnknown) { @@ -634,9 +632,9 @@ DECLARE_INTERFACE_(IColumnProvider,IUnknown) STDMETHOD(GetColumnInfo)(THIS_ DWORD,SHCOLUMNINFO*) PURE; STDMETHOD(GetItemData)(THIS_ LPCSHCOLUMNID,LPCSHCOLUMNDATA,VARIANT*) PURE; }; +#undef INTERFACE #endif /* _WIN32_IE >= 0x0500 */ -#undef INTERFACE #define INTERFACE IQueryInfo DECLARE_INTERFACE_(IQueryInfo,IUnknown) { @@ -646,8 +644,8 @@ DECLARE_INTERFACE_(IQueryInfo,IUnknown) STDMETHOD(GetInfoTip)(THIS_ DWORD,WCHAR**) PURE; STDMETHOD(GetInfoFlags)(THIS_ DWORD*) PURE; }; - #undef INTERFACE + #define INTERFACE IShellExtInit DECLARE_INTERFACE_(IShellExtInit, IUnknown) { @@ -656,9 +654,9 @@ DECLARE_INTERFACE_(IShellExtInit, IUnknown) STDMETHOD_(ULONG,Release)(THIS) PURE; STDMETHOD(Initialize)(THIS_ LPCITEMIDLIST,LPDATAOBJECT,HKEY) PURE; }; +#undef INTERFACE typedef IShellExtInit *LPSHELLEXTINIT; -#undef INTERFACE #define INTERFACE IShellPropSheetExt DECLARE_INTERFACE_(IShellPropSheetExt, IUnknown) { @@ -668,9 +666,9 @@ DECLARE_INTERFACE_(IShellPropSheetExt, IUnknown) STDMETHOD(AddPages)(THIS_ LPFNADDPROPSHEETPAGE,LPARAM) PURE; STDMETHOD(ReplacePage)(THIS_ UINT,LPFNADDPROPSHEETPAGE,LPARAM) PURE; }; +#undef INTERFACE typedef IShellPropSheetExt *LPSHELLPROPSHEETEXT; -#undef INTERFACE #define INTERFACE IExtractIconA DECLARE_INTERFACE_(IExtractIconA, IUnknown) { @@ -680,6 +678,7 @@ DECLARE_INTERFACE_(IExtractIconA, IUnknown) STDMETHOD(GetIconLocation)(THIS_ UINT,LPSTR,UINT,int*,PUINT) PURE; STDMETHOD(Extract)(THIS_ LPCSTR,UINT,HICON*,HICON*,UINT) PURE; }; +#undef INTERFACE typedef IExtractIconA *LPEXTRACTICONA; #ifdef COBJMACROS @@ -690,7 +689,6 @@ typedef IExtractIconA *LPEXTRACTICONA; #define IExtractIconA_Extract(T,a,b,c,d,e) (T)->lpVtbl->Extract(T,a,b,c,d,e) #endif -#undef INTERFACE #define INTERFACE IExtractIconW DECLARE_INTERFACE_(IExtractIconW, IUnknown) { @@ -700,6 +698,7 @@ DECLARE_INTERFACE_(IExtractIconW, IUnknown) STDMETHOD(GetIconLocation)(THIS_ UINT,LPWSTR,UINT,int*,PUINT) PURE; STDMETHOD(Extract)(THIS_ LPCWSTR,UINT,HICON*,HICON*,UINT) PURE; }; +#undef INTERFACE typedef IExtractIconW *LPEXTRACTICONW; #ifdef COBJMACROS @@ -718,7 +717,6 @@ typedef IExtractIconW *LPEXTRACTICONW; #define LPEXTRACTICON LPEXTRACTICONA #endif -#undef INTERFACE #define INTERFACE IShellLinkA DECLARE_INTERFACE_(IShellLinkA, IUnknown) { @@ -744,6 +742,7 @@ DECLARE_INTERFACE_(IShellLinkA, IUnknown) STDMETHOD(Resolve)(THIS_ HWND,DWORD) PURE; STDMETHOD(SetPath)(THIS_ LPCSTR) PURE; }; +#undef INTERFACE #ifdef COBJMACROS #define IShellLinkA_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) @@ -769,7 +768,6 @@ DECLARE_INTERFACE_(IShellLinkA, IUnknown) #define IShellLinkA_SetPath(T,a) (T)->lpVtbl->SetPath(T,a) #endif -#undef INTERFACE #define INTERFACE IShellLinkW DECLARE_INTERFACE_(IShellLinkW, IUnknown) { @@ -795,6 +793,7 @@ DECLARE_INTERFACE_(IShellLinkW, IUnknown) STDMETHOD(Resolve)(THIS_ HWND,DWORD) PURE; STDMETHOD(SetPath)(THIS_ LPCWSTR) PURE; }; +#undef INTERFACE #ifdef COBJMACROS #define IShellLinkW_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) @@ -820,7 +819,6 @@ DECLARE_INTERFACE_(IShellLinkW, IUnknown) #define IShellLinkW_SetPath(T,a) (T)->lpVtbl->SetPath(T,a) #endif -#undef INTERFACE #define INTERFACE IShellFolder DECLARE_INTERFACE_(IShellFolder, IUnknown) { @@ -838,6 +836,7 @@ DECLARE_INTERFACE_(IShellFolder, IUnknown) STDMETHOD(GetDisplayNameOf)(THIS_ LPCITEMIDLIST,DWORD,LPSTRRET) PURE; STDMETHOD(SetNameOf)(THIS_ HWND,LPCITEMIDLIST,LPCOLESTR,DWORD,LPITEMIDLIST*) PURE; }; +#undef INTERFACE typedef IShellFolder *LPSHELLFOLDER; #ifdef COBJMACROS @@ -861,7 +860,6 @@ typedef IShellFolder *LPSHELLFOLDER; DECLARE_ENUMERATOR_(IEnumExtraSearch,LPEXTRASEARCH); typedef IEnumExtraSearch *LPENUMEXTRASEARCH; -#undef INTERFACE #define INTERFACE IShellFolder2 DECLARE_INTERFACE_(IShellFolder2, IShellFolder) { @@ -886,6 +884,7 @@ DECLARE_INTERFACE_(IShellFolder2, IShellFolder) STDMETHOD(GetDetailsOf)(THIS_ LPCITEMIDLIST,UINT,SHELLDETAILS*) PURE; STDMETHOD(MapColumnToSCID)(THIS_ UINT,SHCOLUMNID*) PURE; }; +#undef INTERFACE typedef IShellFolder2 *LPSHELLFOLDER2; #ifdef COBJMACROS @@ -912,7 +911,6 @@ typedef IShellFolder2 *LPSHELLFOLDER2; #endif #endif /* _WIN32_IE >= 0x0500 */ -#undef INTERFACE #define INTERFACE ICopyHook DECLARE_INTERFACE_(ICopyHook, IUnknown) { @@ -921,9 +919,9 @@ DECLARE_INTERFACE_(ICopyHook, IUnknown) STDMETHOD_(ULONG,Release)(THIS) PURE; STDMETHOD_(UINT,CopyCallback)(THIS_ HWND,UINT,UINT,LPCSTR,DWORD,LPCSTR,DWORD) PURE; }; +#undef INTERFACE typedef ICopyHook *LPCOPYHOOK; -#undef INTERFACE #define INTERFACE IFileViewerSite DECLARE_INTERFACE(IFileViewerSite) { @@ -933,9 +931,9 @@ DECLARE_INTERFACE(IFileViewerSite) STDMETHOD(SetPinnedWindow)(THIS_ HWND) PURE; STDMETHOD(GetPinnedWindow)(THIS_ HWND*) PURE; }; +#undef INTERFACE typedef IFileViewerSite *LPFILEVIEWERSITE; -#undef INTERFACE #define INTERFACE IFileViewer DECLARE_INTERFACE(IFileViewer) { @@ -946,9 +944,9 @@ DECLARE_INTERFACE(IFileViewer) STDMETHOD(Show)(THIS_ LPFVSHOWINFO) PURE; STDMETHOD(PrintTo)(THIS_ LPSTR,BOOL) PURE; }; +#undef INTERFACE typedef IFileViewer *LPFILEVIEWER; -#undef INTERFACE #define INTERFACE IFileSystemBindData DECLARE_INTERFACE_(IFileSystemBindData, IUnknown) { @@ -958,8 +956,8 @@ DECLARE_INTERFACE_(IFileSystemBindData, IUnknown) STDMETHOD(SetFindData)(THIS_ const WIN32_FIND_DATAW*) PURE; STDMETHOD(GetFindData)(THIS_ WIN32_FIND_DATAW*) PURE; }; - #undef INTERFACE + #define INTERFACE IPersistFolder DECLARE_INTERFACE_(IPersistFolder,IPersist) { @@ -969,6 +967,7 @@ DECLARE_INTERFACE_(IPersistFolder,IPersist) STDMETHOD(GetClassID)(THIS_ CLSID*) PURE; STDMETHOD(Initialize)(THIS_ LPCITEMIDLIST) PURE; }; +#undef INTERFACE typedef IPersistFolder *LPPERSISTFOLDER; #ifdef COBJMACROS @@ -981,7 +980,6 @@ typedef IPersistFolder *LPPERSISTFOLDER; #if (_WIN32_IE >= 0x0400 || _WIN32_WINNT >= 0x0500) -#undef INTERFACE #define INTERFACE IPersistFolder2 DECLARE_INTERFACE_(IPersistFolder2,IPersistFolder) { @@ -992,6 +990,7 @@ DECLARE_INTERFACE_(IPersistFolder2,IPersistFolder) STDMETHOD(Initialize)(THIS_ LPCITEMIDLIST) PURE; STDMETHOD(GetCurFolder)(THIS_ LPITEMIDLIST*) PURE; }; +#undef INTERFACE typedef IPersistFolder2 *LPPERSISTFOLDER2; #ifdef COBJMACROS @@ -1007,7 +1006,6 @@ typedef IPersistFolder2 *LPPERSISTFOLDER2; #if (_WIN32_IE >= 0x0500) -#undef INTERFACE #define INTERFACE IPersistFolder3 DECLARE_INTERFACE_(IPersistFolder3,IPersistFolder2) { @@ -1020,6 +1018,7 @@ DECLARE_INTERFACE_(IPersistFolder3,IPersistFolder2) STDMETHOD(InitializeEx)(THIS_ IBindCtx*,LPCITEMIDLIST,const PERSIST_FOLDER_TARGET_INFO*) PURE; STDMETHOD(GetFolderTargetInfo)(THIS_ PERSIST_FOLDER_TARGET_INFO*) PURE; }; +#undef INTERFACE typedef IPersistFolder3 *LPPERSISTFOLDER3; #ifdef COBJMACROS @@ -1038,7 +1037,6 @@ typedef IPersistFolder3 *LPPERSISTFOLDER3; typedef interface IShellBrowser *LPSHELLBROWSER; typedef interface IShellView *LPSHELLVIEW; -#undef INTERFACE #define INTERFACE IShellBrowser DECLARE_INTERFACE_(IShellBrowser,IOleWindow) { @@ -1061,6 +1059,7 @@ DECLARE_INTERFACE_(IShellBrowser,IOleWindow) STDMETHOD(OnViewWindowActive)(THIS_ LPSHELLVIEW) PURE; STDMETHOD(SetToolbarItems)(THIS_ LPTBBUTTON,UINT,UINT) PURE; }; +#undef INTERFACE #ifdef COBJMACROS #define IShellBrowser_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) @@ -1083,7 +1082,6 @@ DECLARE_INTERFACE_(IShellBrowser,IOleWindow) #define IShellBrowser_SetToolbarItems(T,a,b,c) (T)->lpVtbl->SetToolbarItems(T,a,b,c) #endif -#undef INTERFACE #define INTERFACE IShellView DECLARE_INTERFACE_(IShellView,IOleWindow) { @@ -1108,6 +1106,7 @@ DECLARE_INTERFACE_(IShellView,IOleWindow) STDMETHOD(SelectItem)(THIS_ LPCITEMIDLIST,UINT) PURE; STDMETHOD(GetItemObject)(THIS_ UINT,REFIID,PVOID*) PURE; }; +#undef INTERFACE #ifdef COBJMACROS #define IShellView_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) @@ -1132,7 +1131,6 @@ DECLARE_INTERFACE_(IShellView,IOleWindow) #define IShellView_GetItemObject(T,a,b,c) (T)->lpVtbl->GetItemObject(T,a,b,c) #endif -#undef INTERFACE #define INTERFACE ICommDlgBrowser DECLARE_INTERFACE_(ICommDlgBrowser,IUnknown) { @@ -1143,6 +1141,7 @@ DECLARE_INTERFACE_(ICommDlgBrowser,IUnknown) STDMETHOD(OnStateChange)(THIS_ IShellView*,ULONG) PURE; STDMETHOD(IncludeObject)(THIS_ IShellView*,LPCITEMIDLIST) PURE; }; +#undef INTERFACE typedef ICommDlgBrowser *LPCOMMDLGBROWSER; #ifdef COBJMACROS @@ -1164,7 +1163,6 @@ typedef struct _SV2CVW2_PARAMS { SHELLVIEWID const *pvid; HWND hwndView; } SV2CVW2_PARAMS,*LPSV2CVW2_PARAMS; -#undef INTERFACE #define INTERFACE IShellView2 DECLARE_INTERFACE_(IShellView2,IShellView) { @@ -1192,8 +1190,8 @@ DECLARE_INTERFACE_(IShellView2,IShellView) STDMETHOD(GetView)(THIS_ SHELLVIEWID*,ULONG) PURE; STDMETHOD(CreateViewWindow2)(THIS_ LPSV2CVW2_PARAMS) PURE; }; - #undef INTERFACE + #define INTERFACE IShellExecuteHookA DECLARE_INTERFACE_(IShellExecuteHookA,IUnknown) { @@ -1203,6 +1201,7 @@ DECLARE_INTERFACE_(IShellExecuteHookA,IUnknown) STDMETHOD(Execute)(THIS_ LPSHELLEXECUTEINFOA) PURE; }; #undef INTERFACE + #define INTERFACE IShellExecuteHookW DECLARE_INTERFACE_(IShellExecuteHookW,IUnknown) { @@ -1211,8 +1210,8 @@ DECLARE_INTERFACE_(IShellExecuteHookW,IUnknown) STDMETHOD_(ULONG,Release)(THIS) PURE; STDMETHOD(Execute)(THIS_ LPSHELLEXECUTEINFOW) PURE; }; - #undef INTERFACE + #define INTERFACE IShellIcon DECLARE_INTERFACE_(IShellIcon,IUnknown) { @@ -1221,6 +1220,7 @@ DECLARE_INTERFACE_(IShellIcon,IUnknown) STDMETHOD_(ULONG,Release)(THIS) PURE; STDMETHOD(GetIconOf)(THIS_ LPCITEMIDLIST,UINT,PINT) PURE; }; +#undef INTERFACE typedef IShellIcon *LPSHELLICON; typedef struct { @@ -1312,7 +1312,6 @@ typedef struct } SHDRAGIMAGE, *LPSHDRAGIMAGE; #pragma pack(pop) -#undef INTERFACE #define INTERFACE IDragSourceHelper DECLARE_INTERFACE_(IDragSourceHelper, IUnknown) { @@ -1322,8 +1321,8 @@ DECLARE_INTERFACE_(IDragSourceHelper, IUnknown) STDMETHOD (InitializeFromBitmap)(THIS_ LPSHDRAGIMAGE pshdi, IDataObject* pDataObject) PURE; STDMETHOD (InitializeFromWindow)(THIS_ HWND hwnd, POINT* ppt, IDataObject* pDataObject) PURE; }; - #undef INTERFACE + #define INTERFACE IDropTargetHelper DECLARE_INTERFACE_(IDropTargetHelper, IUnknown) { @@ -1336,6 +1335,7 @@ DECLARE_INTERFACE_(IDropTargetHelper, IUnknown) STDMETHOD (Drop)(THIS_ IDataObject* pDataObject, POINT* ppt, DWORD dwEffect) PURE; STDMETHOD (Show)(THIS_ BOOL fShow) PURE; }; +#undef INTERFACE #endif /* _WIN32_IE >= 0x0500 */ void WINAPI SHAddToRecentDocs(UINT,PCVOID); diff --git a/reactos/w32api/include/unknwn.h b/reactos/w32api/include/unknwn.h index 20a75afc545..4a8c3fc4712 100644 --- a/reactos/w32api/include/unknwn.h +++ b/reactos/w32api/include/unknwn.h @@ -20,7 +20,6 @@ EXTERN_C const IID IID_IUnknown; EXTERN_C const IID IID_IClassFactory; #ifndef __IUnknown_INTERFACE_DEFINED__ #define __IUnknown_INTERFACE_DEFINED__ -#undef INTERFACE #define INTERFACE IUnknown DECLARE_INTERFACE(IUnknown) { @@ -28,11 +27,11 @@ DECLARE_INTERFACE(IUnknown) STDMETHOD_(ULONG,AddRef)(THIS) PURE; STDMETHOD_(ULONG,Release)(THIS) PURE; }; +#undef INTERFACE typedef IUnknown *LPUNKNOWN; #endif #ifndef __IClassFactory_INTERFACE_DEFINED__ #define __IClassFactory_INTERFACE_DEFINED__ -#undef INTERFACE #define INTERFACE IClassFactory DECLARE_INTERFACE_(IClassFactory,IUnknown) { @@ -42,6 +41,7 @@ DECLARE_INTERFACE_(IClassFactory,IUnknown) STDMETHOD(CreateInstance)(THIS_ LPUNKNOWN,REFIID,PVOID*) PURE; STDMETHOD(LockServer)(THIS_ BOOL) PURE; }; +#undef INTERFACE typedef IClassFactory *LPCLASSFACTORY; #endif HRESULT STDMETHODCALLTYPE IUnknown_QueryInterface_Proxy(IUnknown*,REFIID,void**); diff --git a/reactos/w32api/include/vfw.h b/reactos/w32api/include/vfw.h index cce5e3126db..b151c713ab5 100644 --- a/reactos/w32api/include/vfw.h +++ b/reactos/w32api/include/vfw.h @@ -642,7 +642,6 @@ DEFINE_AVIGUID(IID_IGetFrame,0x00020023,0,0); DEFINE_AVIGUID(IID_IAVIEditStream,0x00020024,0,0); DEFINE_AVIGUID(CLSID_AVIFile,0x00020000,0,0); -#undef INTERFACE #define INTERFACE IAVIStream DECLARE_INTERFACE_(IAVIStream, IUnknown) { @@ -663,7 +662,6 @@ DECLARE_INTERFACE_(IAVIStream, IUnknown) }; typedef IAVIStream *PAVISTREAM; -#undef INTERFACE #define INTERFACE IAVIStreaming DECLARE_INTERFACE_(IAVIStreaming, IUnknown) { @@ -673,9 +671,9 @@ DECLARE_INTERFACE_(IAVIStreaming, IUnknown) STDMETHOD(Begin)(THIS_ LONG,LONG,LONG) PURE; STDMETHOD(End)(THIS) PURE; }; +#undef INTERFACE typedef IAVIStreaming *PAVISTREAMING; -#undef INTERFACE #define INTERFACE IAVIEditStream DECLARE_INTERFACE_(IAVIEditStream, IUnknown) { @@ -690,7 +688,6 @@ DECLARE_INTERFACE_(IAVIEditStream, IUnknown) }; typedef IAVIEditStream *PAVIEDITSTREAM; -#undef INTERFACE #define INTERFACE IAVIFile DECLARE_INTERFACE_(IAVIFile, IUnknown) { @@ -705,9 +702,9 @@ DECLARE_INTERFACE_(IAVIFile, IUnknown) STDMETHOD(EndRecord)(THIS) PURE; STDMETHOD(DeleteStream)(THIS_ DWORD,LONG) PURE; }; +#undef INTERFACE typedef IAVIFile *PAVIFILE; -#undef INTERFACE #define INTERFACE IGetFrame DECLARE_INTERFACE_(IGetFrame, IUnknown) { @@ -719,6 +716,7 @@ DECLARE_INTERFACE_(IGetFrame, IUnknown) STDMETHOD(End)(THIS) PURE; STDMETHOD(SetFormat)(THIS_ LPBITMAPINFOHEADER,LPVOID,INT,INT,INT,INT) PURE; }; +#undef INTERFACE typedef IGetFrame *PGETFRAME; #endif /* !defined (__OBJC__) */ From f54363658fa3fb777cd3996f450c411354a05dd0 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sat, 28 Feb 2004 21:16:55 +0000 Subject: [PATCH 0250/1463] added ability to cache gdi objects so they don't have to be allocated and deallocated all the time. it is disabled by default but could perhaps speed up the gui a bit. svn path=/trunk/; revision=8459 --- reactos/subsys/win32k/objects/gdiobj.c | 145 +++++++++++++++++++++++-- 1 file changed, 136 insertions(+), 9 deletions(-) diff --git a/reactos/subsys/win32k/objects/gdiobj.c b/reactos/subsys/win32k/objects/gdiobj.c index e79f779784b..8e9f2824dbf 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.60 2004/02/19 21:12:10 weiden Exp $ + * $Id: gdiobj.c,v 1.61 2004/02/28 21:16:55 weiden Exp $ * */ @@ -43,6 +43,10 @@ #define NDEBUG #include <win32k/debug1.h> + +/* enable/disable GDI object caching */ +#define GDI_CACHE_OBJECTS 0 + /*! Size of the GDI handle table * http://www.windevnet.com/documents/s=7290/wdj9902b/9902b.htm * gdi handle table can hold 0x4000 handles @@ -85,9 +89,66 @@ typedef struct _GDI_HANDLE_TABLE { WORD wTableSize; WORD AllocationHint; + #if GDI_CACHE_OBJECTS + ULONG ObjHdrSize; + PGDIOBJHDR *CachedObjects; + #endif PGDIOBJHDR Handles[1]; } GDI_HANDLE_TABLE, *PGDI_HANDLE_TABLE; +#if GDI_CACHE_OBJECTS + +#define N_OBJ_TYPES 16 + +typedef struct +{ + ULONG Type; + ULONG Size; +} GDI_OBJ_SIZE; + +typedef struct _GDI_DONTCARE +{ + PVOID Data; +} GDI_DONTCARE, *PGDI_DONTCARE; + +const +GDI_OBJ_SIZE ObjSizes[N_OBJ_TYPES] = +{ + {GDI_OBJECT_TYPE_DC, sizeof(DC)}, + {GDI_OBJECT_TYPE_DCE, sizeof(DCE)}, + {GDI_OBJECT_TYPE_PALETTE, sizeof(PALGDI)}, + {GDI_OBJECT_TYPE_FONT, sizeof(TEXTOBJ)}, + {GDI_OBJECT_TYPE_BRUSH, sizeof(BRUSHOBJ)}, + {GDI_OBJECT_TYPE_PEN, sizeof(PENOBJ)}, + {GDI_OBJECT_TYPE_REGION, sizeof(ROSRGNDATA)}, + {GDI_OBJECT_TYPE_BITMAP, sizeof(BITMAPOBJ)}, +/* + {GDI_OBJECT_TYPE_DIRECTDRAW, sizeof(DD_DIRECTDRAW)}, + {GDI_OBJECT_TYPE_DD_SURFACE, sizeof(DD_SURFACE)}, +*/ + {GDI_OBJECT_TYPE_DONTCARE, sizeof(GDI_DONTCARE)}, + {GDI_OBJECT_TYPE_EXTPEN, 0}, + {GDI_OBJECT_TYPE_METADC, 0}, + {GDI_OBJECT_TYPE_METAFILE, 0}, + {GDI_OBJECT_TYPE_ENHMETAFILE, 0}, + {GDI_OBJECT_TYPE_ENHMETADC, 0}, + {GDI_OBJECT_TYPE_MEMDC, 0}, + {GDI_OBJECT_TYPE_EMF, 0} +}; + +ULONG FASTCALL +GDI_MaxGdiObjHeaderSize(VOID) +{ + ULONG i, Size; + for(i = 0, Size = 0; i < N_OBJ_TYPES; i++) + { + Size = max(Size, ObjSizes[i].Size); + } + return Size; +} + +#endif + /* GDI stock objects */ static LOGBRUSH WhiteBrush = @@ -166,17 +227,24 @@ static PGDI_HANDLE_TABLE FASTCALL GDIOBJ_iAllocHandleTable (WORD Size) { PGDI_HANDLE_TABLE handleTable; + ULONG MemSize; + +#if GDI_CACHE_OBJECTS + MemSize = sizeof(GDI_HANDLE_TABLE) + sizeof(PGDIOBJ) * (Size << 1); +#else + MemSize = sizeof(GDI_HANDLE_TABLE) + sizeof(PGDIOBJ) * Size; +#endif /* prevent APC delivery for the *FastMutexUnsafe calls */ const KIRQL PrevIrql = KfRaiseIrql(APC_LEVEL); ExAcquireFastMutexUnsafe (&HandleTableMutex); - handleTable = ExAllocatePoolWithTag(PagedPool, - sizeof(GDI_HANDLE_TABLE) + - sizeof(PGDIOBJ) * Size, TAG_GDIHNDTBLE); + handleTable = ExAllocatePoolWithTag(PagedPool, MemSize, TAG_GDIHNDTBLE); ASSERT( handleTable ); - memset (handleTable, - 0, - sizeof(GDI_HANDLE_TABLE) + sizeof(PGDIOBJ) * Size); + memset (handleTable, 0, MemSize); +#if GDI_CACHE_OBJECTS + handleTable->CachedObjects = &handleTable->Handles[Size]; + handleTable->ObjHdrSize = sizeof(GDIOBJHDR) + GDI_MaxGdiObjHeaderSize(); +#endif handleTable->wTableSize = Size; handleTable->AllocationHint = 1; ExReleaseFastMutexUnsafe (&HandleTableMutex); @@ -252,23 +320,63 @@ GDIOBJ_AllocObj(WORD Size, DWORD ObjectType, GDICLEANUPPROC CleanupProc) PW32PROCESS W32Process; PGDIOBJHDR newObject; WORD Index; +#if GDI_CACHE_OBJECTS + PGDIOBJHDR *CachedObject; +#endif ExAcquireFastMutex(&HandleTableMutex); Index = GDIOBJ_iGetNextOpenHandleIndex (); if (0 == Index) { + ExReleaseFastMutex(&HandleTableMutex); DPRINT1("Out of GDI handles\n"); return NULL; } +#if GDI_CACHE_OBJECTS + CachedObject = (PGDIOBJHDR*)(HandleTable->CachedObjects + Index); + if(!(newObject = *CachedObject)) + { + /* allocate new gdi object */ + newObject = ExAllocatePoolWithTag(PagedPool, HandleTable->ObjHdrSize, TAG_GDIOBJ); + if(!newObject) + { + ExReleaseFastMutex(&HandleTableMutex); + DPRINT1("GDIOBJ_AllocObj: failed\n"); + return NULL; + } + RtlZeroMemory(newObject, HandleTable->ObjHdrSize); + *CachedObject = newObject; + } + /* Zero the memory when destroying the object */ + if(ObjectType == GDI_OBJECT_TYPE_DONTCARE) + { + PVOID *Data; + PGDI_DONTCARE dc; + + Data = ExAllocatePoolWithTag(PagedPool, sizeof(PVOID) + Size, TAG_GDIOBJ); + if(!Data) + { + ExReleaseFastMutex(&HandleTableMutex); + DPRINT1("GDIOBJ_AllocObj failed: %d bytes for GDI_OBJECT_TYPE_DONTCARE\n", Size + sizeof(PVOID)); + return NULL; + } + dc = (PGDI_DONTCARE)((PCHAR)newObject + sizeof(GDIOBJHDR)); + RtlZeroMemory((PVOID)(Data + 1), Size); + ((PGDI_DONTCARE)((PCHAR)newObject + sizeof(GDIOBJHDR)))->Data = Data; + *Data = newObject; + } +#else DPRINT("GDIOBJ_AllocObj: handle: %d, size: %d, type: 0x%08x\n", Index, Size, ObjectType); newObject = ExAllocatePoolWithTag(PagedPool, Size + sizeof (GDIOBJHDR), TAG_GDIOBJ); if (newObject == NULL) { + ExReleaseFastMutex(&HandleTableMutex); DPRINT1("GDIOBJ_AllocObj: failed\n"); return NULL; } RtlZeroMemory (newObject, Size + sizeof(GDIOBJHDR)); +#endif newObject->wTableIndex = Index; @@ -280,7 +388,7 @@ GDIOBJ_AllocObj(WORD Size, DWORD ObjectType, GDICLEANUPPROC CleanupProc) newObject->lockline = 0; ExInitializeFastMutex(&newObject->Lock); HandleTable->Handles[Index] = newObject; - ExReleaseFastMutexUnsafe (&HandleTableMutex); + ExReleaseFastMutex(&HandleTableMutex); W32Process = PsGetCurrentProcess()->Win32Process; if(W32Process) @@ -347,8 +455,19 @@ GDIOBJ_FreeObj(HGDIOBJ hObj, DWORD ObjectType, DWORD Flag) Obj = (PGDIOBJ)((PCHAR)objectHeader + sizeof(GDIOBJHDR)); bRet = (*(objectHeader->CleanupProc))(Obj); } - +#if GDI_CACHE_OBJECTS + if(GDI_MAGIC_TO_TYPE(objectHeader->Magic) == GDI_OBJECT_TYPE_DONTCARE) + { + PGDI_DONTCARE dc = (PGDI_DONTCARE)((PCHAR)objectHeader + sizeof(GDIOBJHDR)); + if(dc->Data) + { + ExFreePool(dc->Data); + } + RtlZeroMemory(objectHeader, HandleTable->ObjHdrSize); + } +#else ExFreePool(objectHeader); +#endif HandleTable->Handles[GDI_HANDLE_GET_INDEX(hObj)] = NULL; W32Process = PsGetCurrentProcess()->Win32Process; @@ -648,7 +767,15 @@ GDIOBJ_LockObjDbg (const char* file, int line, HGDIOBJ hObj, DWORD ObjectType) ObjHdr->lockline = line; } +#if GDI_CACHE_OBJECTS + if(GDI_MAGIC_TO_TYPE(ObjHdr->Magic) != GDI_OBJECT_TYPE_DONTCARE) + { + return (PGDIOBJ)((PCHAR)ObjHdr + sizeof(GDIOBJHDR)); + } + return (PGDIOBJ)((PVOID)(((PGDI_DONTCARE)((PCHAR)ObjHdr + sizeof(GDIOBJHDR)))->Data) + 1); +#else return (PGDIOBJ)((PCHAR)ObjHdr + sizeof(GDIOBJHDR)); +#endif } #endif//GDIOBJ_LockObj From 504a0756cfbdc42f26d55a77fb8c29d37e274693 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 28 Feb 2004 22:26:34 +0000 Subject: [PATCH 0251/1463] - Fixed the definition of IsTextUnicode. svn path=/trunk/; revision=8460 --- reactos/lib/advapi32/advapi32.edf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/advapi32/advapi32.edf b/reactos/lib/advapi32/advapi32.edf index d8b6cfad136..1332741d31b 100644 --- a/reactos/lib/advapi32/advapi32.edf +++ b/reactos/lib/advapi32/advapi32.edf @@ -1,4 +1,4 @@ -; $Id: advapi32.edf,v 1.32 2004/02/26 16:16:17 navaraf Exp $ +; $Id: advapi32.edf,v 1.33 2004/02/28 22:26:34 navaraf Exp $ ; ; advapi32.edf ; @@ -182,7 +182,7 @@ InitiateSystemShutdownA=InitiateSystemShutdownA@20 InitiateSystemShutdownW=InitiateSystemShutdownW@20 ;IsAccessPermittedA=IsAccessPermittedA@20 ;IsAccessPermittedW=IsAccessPermittedW@20 -IsTextUnicode=NTDLL.RtlIsTextUnicode@12 +IsTextUnicode=NTDLL.RtlIsTextUnicode IsValidAcl=IsValidAcl@4 IsValidSecurityDescriptor=IsValidSecurityDescriptor@4 IsValidSid=IsValidSid@4 From 56aef8d72dc3990e70dcd753bd38ccaa2e1e5cde Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sat, 28 Feb 2004 23:33:15 +0000 Subject: [PATCH 0252/1463] preparations for SDI code merge svn path=/trunk/; revision=8462 --- .../system/explorer/desktop/desktop.cpp | 2 +- .../system/explorer/shell/filechild.cpp | 52 +++++++++++-------- .../subsys/system/explorer/shell/filechild.h | 1 + .../system/explorer/shell/mainframe.cpp | 2 +- .../system/explorer/shell/shellbrowser.cpp | 50 ++++++++++-------- .../system/explorer/shell/shellbrowser.h | 2 + .../subsys/system/explorer/shell/webchild.cpp | 8 +++ .../subsys/system/explorer/shell/webchild.h | 2 + .../subsys/system/explorer/utility/window.h | 1 + 9 files changed, 76 insertions(+), 44 deletions(-) diff --git a/reactos/subsys/system/explorer/desktop/desktop.cpp b/reactos/subsys/system/explorer/desktop/desktop.cpp index b2901092d73..b944718001d 100644 --- a/reactos/subsys/system/explorer/desktop/desktop.cpp +++ b/reactos/subsys/system/explorer/desktop/desktop.cpp @@ -338,7 +338,7 @@ HWND DesktopWindow::Create() int height = GetSystemMetrics(SM_CYSCREEN); HWND hwndDesktop = Window::Create(WINDOW_CREATOR(DesktopWindow), - WS_EX_TOOLWINDOW, wcDesktop, TEXT("Program Manager"), WS_POPUP|WS_VISIBLE|WS_CLIPCHILDREN, + WS_EX_TOOLWINDOW, wcDesktop, TEXT("Program Manager"), WS_POPUP|WS_VISIBLE, //|WS_CLIPCHILDREN for SDI frames 0, 0, width, height, 0); // work around to display desktop bar in Wine diff --git a/reactos/subsys/system/explorer/shell/filechild.cpp b/reactos/subsys/system/explorer/shell/filechild.cpp index b3e596f8123..e1ddb0db808 100644 --- a/reactos/subsys/system/explorer/shell/filechild.cpp +++ b/reactos/subsys/system/explorer/shell/filechild.cpp @@ -95,6 +95,35 @@ WebChildWndInfo::WebChildWndInfo(HWND hmdiclient, LPCTSTR url) } +BOOL CALLBACK ExecuteDialog::WndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + static struct ExecuteDialog* dlg; + + switch(nmsg) { + case WM_INITDIALOG: + dlg = (struct ExecuteDialog*) lparam; + return 1; + + case WM_COMMAND: { + int id = (int)wparam; + + if (id == IDOK) { + GetWindowText(GetDlgItem(hwnd, 201), dlg->cmd, MAX_PATH); + dlg->cmdshow = Button_GetState(GetDlgItem(hwnd,214))&BST_CHECKED? + SW_SHOWMINIMIZED: SW_SHOWNORMAL; + EndDialog(hwnd, id); + } else if (id == IDCANCEL) + EndDialog(hwnd, id); + + return 1;} + } + + return 0; +} + + + // FileChildWindow + FileChildWindow::FileChildWindow(HWND hwnd, const FileChildWndInfo& info) : ChildWindow(hwnd, info) { @@ -615,28 +644,9 @@ int FileChildWindow::Notify(int id, NMHDR* pnmh) } -BOOL CALLBACK ExecuteDialog::WndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam) +void FileChildWindow::jump_to(void* path) { - static struct ExecuteDialog* dlg; - switch(nmsg) { - case WM_INITDIALOG: - dlg = (struct ExecuteDialog*) lparam; - return 1; +//@@ - case WM_COMMAND: { - int id = (int)wparam; - - if (id == IDOK) { - GetWindowText(GetDlgItem(hwnd, 201), dlg->cmd, MAX_PATH); - dlg->cmdshow = Button_GetState(GetDlgItem(hwnd,214))&BST_CHECKED? - SW_SHOWMINIMIZED: SW_SHOWNORMAL; - EndDialog(hwnd, id); - } else if (id == IDCANCEL) - EndDialog(hwnd, id); - - return 1;} - } - - return 0; } diff --git a/reactos/subsys/system/explorer/shell/filechild.h b/reactos/subsys/system/explorer/shell/filechild.h index d510606986c..f4d17f64274 100644 --- a/reactos/subsys/system/explorer/shell/filechild.h +++ b/reactos/subsys/system/explorer/shell/filechild.h @@ -100,6 +100,7 @@ protected: int Notify(int id, NMHDR* pnmh); virtual void resize_children(int cx, int cy); + virtual void jump_to(void* path); void scan_entry(Entry* entry, HWND hwnd); diff --git a/reactos/subsys/system/explorer/shell/mainframe.cpp b/reactos/subsys/system/explorer/shell/mainframe.cpp index 3b7ae322ad1..a532b62c3ff 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.cpp +++ b/reactos/subsys/system/explorer/shell/mainframe.cpp @@ -487,7 +487,7 @@ LRESULT MainFrame::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) // FileChildWindow::create(_hmdiclient, create_info); return (LRESULT)ShellBrowserChild::create(create_info); } - break;} + return TRUE;} // success case PM_GET_CONTROLWINDOW: if (wparam == FCW_STATUS) diff --git a/reactos/subsys/system/explorer/shell/shellbrowser.cpp b/reactos/subsys/system/explorer/shell/shellbrowser.cpp index 3e4e23fbdaa..9052c506c54 100644 --- a/reactos/subsys/system/explorer/shell/shellbrowser.cpp +++ b/reactos/subsys/system/explorer/shell/shellbrowser.cpp @@ -87,6 +87,26 @@ LRESULT ShellBrowserChild::Init(LPCREATESTRUCT pcs) // _himlLarge = (HIMAGELIST)SHGetFileInfo(TEXT("C:\\"), 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX|SHGFI_LARGEICON); + const String& root_name = GetDesktopFolder().get_name(_create_info._root_shell_path, SHGDN_FORPARSING); + + _root._drive_type = DRIVE_UNKNOWN; + lstrcpy(_root._volname, root_name); // most of the time "Desktop" + _root._fs_flags = 0; + lstrcpy(_root._fs, TEXT("Desktop")); + +//@@ _root._entry->read_tree(shell_info._root_shell_path.get_folder(), info._shell_path, SORT_NAME/*_sortOrder*/); + +/*@todo + we should call read_tree() here to iterate through the hierarchy and open all folders from shell_info._root_shell_path to shell_info._shell_path + -> see FileChildWindow::FileChildWindow() +*/ + _root._entry = new ShellDirectory(GetDesktopFolder(), _create_info._root_shell_path, _hwnd); + _root._entry->read_directory(); + + /* already filled by ShellDirectory constructor + lstrcpy(_root._entry->_data.cFileName, TEXT("Desktop")); */ + + // create explorer treeview if (_create_info._open_mode & OWM_EXPLORE) _left_hwnd = CreateWindowEx(0, WC_TREEVIEW, NULL, @@ -112,26 +132,6 @@ void ShellBrowserChild::InitializeTree() TreeView_SetImageList(_left_hwnd, _himlSmall, TVSIL_NORMAL); TreeView_SetScrollTime(_left_hwnd, 100); - const String& root_name = GetDesktopFolder().get_name(_create_info._root_shell_path, SHGDN_FORPARSING); - - _root._drive_type = DRIVE_UNKNOWN; - lstrcpy(_root._volname, root_name); // most of the time "Desktop" - _root._fs_flags = 0; - lstrcpy(_root._fs, TEXT("Desktop")); - -//@@ _root._entry->read_tree(shell_info._root_shell_path.get_folder(), info._shell_path, SORT_NAME/*_sortOrder*/); - -/*@todo - we should call read_tree() here to iterate through the hierarchy and open all folders from shell_info._root_shell_path to shell_info._shell_path - -> see FileChildWindow::FileChildWindow() -*/ - _root._entry = new ShellDirectory(GetDesktopFolder(), _create_info._root_shell_path, _hwnd); - _root._entry->read_directory(); - - /* already filled by ShellDirectory constructor - lstrcpy(_root._entry->_data.cFileName, TEXT("Desktop")); */ - - TV_ITEM tvItem; tvItem.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN; @@ -460,7 +460,7 @@ HRESULT ShellBrowserChild::OnDefaultCommand(LPIDA pida) { CONTEXT("ShellBrowserChild::OnDefaultCommand()"); - if (pida->cidl>=1) { + if (pida->cidl >= 1) { if (_left_hwnd) { // explorer mode if (_last_sel) { ShellDirectory* parent = (ShellDirectory*)TreeView_GetItemData(_left_hwnd, _last_sel); @@ -521,3 +521,11 @@ bool ShellBrowserChild::expand_folder(ShellDirectory* entry) return false; } + + +void ShellBrowserChild::jump_to(void* path) +{ + +//@@ + +} diff --git a/reactos/subsys/system/explorer/shell/shellbrowser.h b/reactos/subsys/system/explorer/shell/shellbrowser.h index 4b8fec06966..0df72a068c7 100644 --- a/reactos/subsys/system/explorer/shell/shellbrowser.h +++ b/reactos/subsys/system/explorer/shell/shellbrowser.h @@ -125,6 +125,8 @@ protected: int InsertSubitems(HTREEITEM hParentItem, Entry* entry, IShellFolder* pParentFolder); bool InitDragDrop(); + virtual void jump_to(void* path); + HRESULT OnDefaultCommand(LPIDA pida); void OnTreeGetDispInfo(int idCtrl, LPNMHDR pnmh); diff --git a/reactos/subsys/system/explorer/shell/webchild.cpp b/reactos/subsys/system/explorer/shell/webchild.cpp index 959d03329c6..e53acbe0a4a 100644 --- a/reactos/subsys/system/explorer/shell/webchild.cpp +++ b/reactos/subsys/system/explorer/shell/webchild.cpp @@ -286,3 +286,11 @@ LRESULT WebChildWindow::WndProc(UINT message, WPARAM wparam, LPARAM lparam) return 0; } + + +void WebChildWindow::jump_to(void* path) +{ + +//@@ + +} diff --git a/reactos/subsys/system/explorer/shell/webchild.h b/reactos/subsys/system/explorer/shell/webchild.h index 207b5b640c3..25e7dbbb5e4 100644 --- a/reactos/subsys/system/explorer/shell/webchild.h +++ b/reactos/subsys/system/explorer/shell/webchild.h @@ -1075,4 +1075,6 @@ protected: auto_ptr<EventConnector> _connector; LRESULT WndProc(UINT message, WPARAM wparam, LPARAM lparam); + + virtual void jump_to(void* path); }; diff --git a/reactos/subsys/system/explorer/utility/window.h b/reactos/subsys/system/explorer/utility/window.h index cad07b198b7..62edba0ab57 100644 --- a/reactos/subsys/system/explorer/utility/window.h +++ b/reactos/subsys/system/explorer/utility/window.h @@ -293,6 +293,7 @@ protected: LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); virtual void resize_children(int cx, int cy); + virtual void jump_to(void* path) = 0; protected: MenuInfo*_menu_info; From fc1748325facd47585dba2fc5a20f23e8224114d Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sun, 29 Feb 2004 11:19:21 +0000 Subject: [PATCH 0253/1463] - Implemented ScsiPortGetPhysicalAddress for Srb buffers. svn path=/trunk/; revision=8463 --- reactos/drivers/storage/scsiport/scsiport.c | 47 +++++++++++++++++++-- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/reactos/drivers/storage/scsiport/scsiport.c b/reactos/drivers/storage/scsiport/scsiport.c index f6fb031fbde..49efe04bca6 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.46 2004/02/01 16:02:35 ekohl Exp $ +/* $Id: scsiport.c,v 1.47 2004/02/29 11:19:21 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -413,8 +413,10 @@ ScsiPortGetPhysicalAddress(IN PVOID HwDeviceExtension, { PSCSI_PORT_DEVICE_EXTENSION DeviceExtension; SCSI_PHYSICAL_ADDRESS PhysicalAddress; + SCSI_PHYSICAL_ADDRESS NextPhysicalAddress; ULONG BufferLength = 0; ULONG Offset; + PVOID EndAddress; DPRINT("ScsiPortGetPhysicalAddress(%p %p %p %p)\n", HwDeviceExtension, Srb, VirtualAddress, Length); @@ -446,9 +448,46 @@ ScsiPortGetPhysicalAddress(IN PVOID HwDeviceExtension, } else { - /* FIXME */ - DPRINT1("Srb != NULL is not implemented yet!\n"); - UNIMPLEMENTED; + EndAddress = Srb->DataBuffer + Srb->DataTransferLength; + if (VirtualAddress == NULL) + { + VirtualAddress = Srb->DataBuffer; + } + else if (VirtualAddress < Srb->DataBuffer || VirtualAddress >= EndAddress) + { + PhysicalAddress.QuadPart = 0LL; + return PhysicalAddress; + } + + PhysicalAddress = MmGetPhysicalAddress(VirtualAddress); + if (PhysicalAddress.QuadPart == 0LL) + { + return PhysicalAddress; + } + + Offset = (ULONG_PTR)VirtualAddress & (PAGE_SIZE - 1); +#if 1 + /* + * FIXME: + * MmGetPhysicalAddress doesn't return the offset within the page. + * We must set the correct offset. + */ + PhysicalAddress.u.LowPart = (PhysicalAddress.u.LowPart & ~(PAGE_SIZE - 1)) + Offset; +#endif + BufferLength += PAGE_SIZE - Offset; + while (VirtualAddress + BufferLength < EndAddress) + { + NextPhysicalAddress = MmGetPhysicalAddress(VirtualAddress + BufferLength); + if (PhysicalAddress.QuadPart + (ULONGLONG)BufferLength != NextPhysicalAddress.QuadPart) + { + break; + } + BufferLength += PAGE_SIZE; + } + if (VirtualAddress + BufferLength >= EndAddress) + { + BufferLength = EndAddress - VirtualAddress; + } } *Length = BufferLength; From 9a5bc1ce4338bb4752d680e584dca38c69314085 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sun, 29 Feb 2004 11:21:58 +0000 Subject: [PATCH 0254/1463] - Don't retry, if the request fails with SRB_STATUS_INVALID_REQUEST. svn path=/trunk/; revision=8464 --- reactos/drivers/storage/class2/class2.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/reactos/drivers/storage/class2/class2.c b/reactos/drivers/storage/class2/class2.c index 707611d4e0a..8f50e9334fb 100644 --- a/reactos/drivers/storage/class2/class2.c +++ b/reactos/drivers/storage/class2/class2.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: class2.c,v 1.48 2004/02/10 16:22:56 navaraf Exp $ +/* $Id: class2.c,v 1.49 2004/02/29 11:21:58 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1228,6 +1228,11 @@ ScsiClassInterpretSenseInfo(IN PDEVICE_OBJECT DeviceObject, Retry = FALSE; break; + case SRB_STATUS_INVALID_REQUEST: + *Status = STATUS_INVALID_DEVICE_REQUEST; + Retry = FALSE; + break; + default: DPRINT1("SCSI error (SRB status: %x)\n", SRB_STATUS(Srb->SrbStatus)); From e5185d34b3495e1f747a7e8fe564f525f7c2ac9e Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 29 Feb 2004 11:34:40 +0000 Subject: [PATCH 0255/1463] - Removed the incorrect implementations of Device Interface functions. - Added verified implementation of IoGetDeviceInterfaces written by Matthew Brace and fixed by me. svn path=/trunk/; revision=8465 --- reactos/ntoskrnl/io/deviface.c | 659 +++++++++++++++++++++++---------- 1 file changed, 459 insertions(+), 200 deletions(-) diff --git a/reactos/ntoskrnl/io/deviface.c b/reactos/ntoskrnl/io/deviface.c index 1e9a064be70..2411c40cff2 100644 --- a/reactos/ntoskrnl/io/deviface.c +++ b/reactos/ntoskrnl/io/deviface.c @@ -6,247 +6,506 @@ * PROGRAMMER: Filip Navara (xnavara@volny.cz) * Matthew Brace (ismarc@austin.rr.com) * UPDATE HISTORY: - * 22/09/2003 FiN Created + * 22/09/2003 FiN Created */ /* INCLUDES ******************************************************************/ #include <ddk/ntddk.h> -#include <reactos/bugcodes.h> -#include <internal/io.h> -#include <internal/po.h> -#include <internal/ldr.h> -#include <internal/module.h> - -//#define NDEBUG -#include <internal/debug.h> - #include <ole32/guiddef.h> #ifdef DEFINE_GUID -DEFINE_GUID(GUID_CLASS_COMPORT, 0x86e0d1e0L, 0x8089, 0x11d0, 0x9c, 0xe4, 0x08, 0x00, 0x3e, 0x30, 0x1f, 0x73); DEFINE_GUID(GUID_SERENUM_BUS_ENUMERATOR, 0x4D36E978L, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); -#endif // DEFINE_GUID - +#endif +#define NDEBUG +#include <internal/debug.h> /* FUNCTIONS *****************************************************************/ /* - * @implemented - * - * returns a key to a specific device interface + * @unimplemented */ -NTSTATUS -STDCALL + +NTSTATUS STDCALL IoOpenDeviceInterfaceRegistryKey( - IN PUNICODE_STRING SymbolicLinkName, - IN ACCESS_MASK DesiredAccess, - OUT PHANDLE DeviceInterfaceKey) + IN PUNICODE_STRING SymbolicLinkName, + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE DeviceInterfaceKey) { - NTSTATUS Status; - POBJECT_ATTRIBUTES ObjectAttributes; - - InitializeObjectAttributes( ObjectAttributes, - SymbolicLinkName, - OBJ_CASE_INSENSITIVE, - NULL, - NULL ); - - Status = ZwOpenKey( DeviceInterfaceKey, - DesiredAccess, - ObjectAttributes ); - - if( !NT_SUCCESS( Status ) ) - { - DPRINT( "ZwOpenKey() failed" ); - return Status; - } - - return STATUS_SUCCESS; + return STATUS_NOT_IMPLEMENTED; } /* - * @implemented + * @unimplemented */ -NTSTATUS -STDCALL + +NTSTATUS STDCALL IoGetDeviceInterfaceAlias( - IN PUNICODE_STRING SymbolicLinkName, - IN CONST GUID *AliasInterfaceClassGuid, - OUT PUNICODE_STRING AliasSymbolicLinkName) + IN PUNICODE_STRING SymbolicLinkName, + IN CONST GUID *AliasInterfaceClassGuid, + OUT PUNICODE_STRING AliasSymbolicLinkName) { - PUNICODE_STRING GuidString; - PUNICODE_STRING BaseKeyName; - PUNICODE_STRING AliasKeyName; - PUNICODE_STRING bipName; - PUNICODE_STRING InLinkName; - - PHANDLE InterfaceKey; - BOOLEAN CaseInsensitive = TRUE; - - PKEY_FULL_INFORMATION fip; - PKEY_BASIC_INFORMATION bip; - - PWCHAR pdest; - - LONG status; - NTSTATUS Status; - - ULONG Size; - ULONG i = 0; - - PWCHAR BaseKeyString = L"\\HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Class\\"; - PWCHAR BaseInterfaceString = L"\\HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Services\\"; - - - status = RtlStringFromGUID( AliasInterfaceClassGuid, GuidString ); - if( !status ) - { - DPRINT( "RtlStringFromGUID() Failed.\n" ); - return STATUS_INVALID_HANDLE; - } - RtlInitUnicodeString( BaseKeyName, BaseKeyString ); - RtlInitUnicodeString( AliasKeyName, BaseInterfaceString ); - - BaseKeyName->MaximumLength += sizeof( GuidString ); - RtlAppendUnicodeStringToString( BaseKeyName, GuidString ); - - Status = IoOpenDeviceInterfaceRegistryKey( BaseKeyName, - GENERIC_READ, - InterfaceKey); - - if( !NT_SUCCESS( Status ) ) - { - DPRINT( "IoGetDeviceInterfaceKey() failed.\n" ); - return Status; - } - - Status = ZwQueryKey( InterfaceKey, - KeyFullInformation, - NULL, - 0, - &Size ); - - if( !NT_SUCCESS( Status) ) - { - DPRINT( "ZwQueryKey() failed.\n" ); - return Status; - } - - fip = (PKEY_FULL_INFORMATION) ExAllocatePool(PagedPool, Size); - - ZwQueryKey( InterfaceKey, - KeyFullInformation, - fip, - Size, - &Size ); - - while( i < fip->SubKeys ) - { - i++; - ZwEnumerateKey( InterfaceKey, - i, - KeyBasicInformation, - NULL, - 0, - &Size ); - bip = (PKEY_BASIC_INFORMATION) ExAllocatePool(PagedPool, Size); - - ZwEnumerateKey( InterfaceKey, - i, - KeyBasicInformation, - bip, - Size, - &Size ); - //check bip->Name - RtlInitUnicodeString( bipName, NULL ); - RtlInitUnicodeString( InLinkName, NULL ); - - bipName->Length = wcslen(bip->Name); - bipName->MaximumLength = wcslen(bip->Name); - bipName->Buffer = bip->Name; - - AliasKeyName->MaximumLength += sizeof(bipName); - RtlAppendUnicodeStringToString( AliasKeyName, bipName ); - - pdest = wcsstr( SymbolicLinkName->Buffer, L"Services\\" ); - - InLinkName->Length = wcslen(pdest); - InLinkName->MaximumLength = wcslen(pdest); - InLinkName->Buffer = pdest; - - status = 1; - status = RtlCompareUnicodeString( bipName, - InLinkName, - CaseInsensitive ); - - if( status == 0 ) - { - AliasSymbolicLinkName = AliasKeyName; - return STATUS_SUCCESS; - } - - - ExFreePool(bip); - } - - ExFreePool(fip); - - return STATUS_INVALID_HANDLE; + return STATUS_NOT_IMPLEMENTED; } /* - * @unimplemented + * IoGetDeviceInterfaces + * + * Returns a list of device interfaces of a particular device interface class. + * + * Parameters + * InterfaceClassGuid + * Points to a class GUID specifying the device interface class. + * + * PhysicalDeviceObject + * Points to an optional PDO that narrows the search to only the + * device interfaces of the device represented by the PDO. + * + * Flags + * Specifies flags that modify the search for device interfaces. The + * DEVICE_INTERFACE_INCLUDE_NONACTIVE flag specifies that the list of + * returned symbolic links should contain also disabled device + * interfaces in addition to the enabled ones. + * + * SymbolicLinkList + * Points to a character pointer that is filled in on successful return + * with a list of unicode strings identifying the device interfaces + * that match the search criteria. The newly allocated buffer contains + * a list of symbolic link names. Each unicode string in the list is + * null-terminated; the end of the whole list is marked by an additional + * NULL. The caller is responsible for freeing the buffer (ExFreePool) + * when it is no longer needed. + * If no device interfaces match the search criteria, this routine + * returns STATUS_SUCCESS and the string contains a single NULL + * character. + * + * Status + * @implemented + * + * The parameters PhysicalDeviceObject and Flags aren't correctly + * processed. Rest of the cases was tested under Windows(R) XP and + * the function worked correctly. */ -NTSTATUS -STDCALL + +NTSTATUS STDCALL IoGetDeviceInterfaces( - IN CONST GUID *InterfaceClassGuid, - IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL, - IN ULONG Flags, - OUT PWSTR *SymbolicLinkList) + IN CONST GUID *InterfaceClassGuid, + IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL, + IN ULONG Flags, + OUT PWSTR *SymbolicLinkList) { - DPRINT("IoGetDeviceInterfaces called (UNIMPLEMENTED)\n"); - return STATUS_NOT_IMPLEMENTED; + PWCHAR BaseKeyString = L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\DeviceClasses\\"; + PWCHAR BaseInterfaceString = L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\"; + UNICODE_STRING GuidString; + UNICODE_STRING BaseKeyName; + UNICODE_STRING AliasKeyName; + UNICODE_STRING SymbolicLink; + UNICODE_STRING SubKeyName; + UNICODE_STRING SymbolicLinkKeyName; + UNICODE_STRING TempString; + HANDLE InterfaceKey; + HANDLE SubKey; + HANDLE SymbolicLinkKey; + PKEY_FULL_INFORMATION fip; + PKEY_BASIC_INFORMATION bip; + PKEY_VALUE_PARTIAL_INFORMATION vpip; + PWCHAR SymLinkList = NULL; + ULONG SymLinkListSize; + NTSTATUS Status; + ULONG Size = 0; + ULONG i = 0; + OBJECT_ATTRIBUTES ObjectAttributes; + + Status = RtlStringFromGUID(InterfaceClassGuid, &GuidString); + if (!NT_SUCCESS(Status)) + { + DPRINT("RtlStringFromGUID() Failed.\n"); + return STATUS_INVALID_HANDLE; + } + + RtlInitUnicodeString(&AliasKeyName, BaseInterfaceString); + RtlInitUnicodeString(&SymbolicLink, L"SymbolicLink"); + BaseKeyName.Length = wcslen(BaseKeyString) * sizeof(WCHAR); + BaseKeyName.MaximumLength = BaseKeyName.Length + (38 * sizeof(WCHAR)); + BaseKeyName.Buffer = ExAllocatePool( + NonPagedPool, + BaseKeyName.MaximumLength); + assert(BaseKeyName.Buffer != NULL); + wcscpy(BaseKeyName.Buffer, BaseKeyString); + RtlAppendUnicodeStringToString(&BaseKeyName, &GuidString); + + if (PhysicalDeviceObject) + { + WCHAR GuidBuffer[32]; + UNICODE_STRING PdoGuidString; + + RtlFreeUnicodeString(&BaseKeyName); + + IoGetDeviceProperty( + PhysicalDeviceObject, + DevicePropertyClassGuid, + sizeof(GuidBuffer), + GuidBuffer, + &Size); + + RtlInitUnicodeString(&PdoGuidString, GuidBuffer); + if (RtlCompareUnicodeString(&GuidString, &PdoGuidString, TRUE)) + { + DPRINT("Inconsistent Guid's asked for in IoGetDeviceInterfaces()\n"); + return STATUS_INVALID_HANDLE; + } + + DPRINT("IoGetDeviceInterfaces() called with PDO, not implemented.\n"); + return STATUS_NOT_IMPLEMENTED; + } + else + { + InitializeObjectAttributes( + &ObjectAttributes, + &BaseKeyName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + Status = ZwOpenKey( + &InterfaceKey, + KEY_READ, + &ObjectAttributes); + + if (!NT_SUCCESS(Status)) + { + DPRINT("ZwOpenKey() Failed. (0x%X)\n", Status); + RtlFreeUnicodeString(&BaseKeyName); + return Status; + } + + Status = ZwQueryKey( + InterfaceKey, + KeyFullInformation, + NULL, + 0, + &Size); + + if (Status != STATUS_BUFFER_TOO_SMALL) + { + DPRINT("ZwQueryKey() Failed. (0x%X)\n", Status); + RtlFreeUnicodeString(&BaseKeyName); + ZwClose(InterfaceKey); + return Status; + } + + fip = (PKEY_FULL_INFORMATION)ExAllocatePool(NonPagedPool, Size); + assert(fip != NULL); + + Status = ZwQueryKey( + InterfaceKey, + KeyFullInformation, + fip, + Size, + &Size); + + if (!NT_SUCCESS(Status)) + { + DPRINT("ZwQueryKey() Failed. (0x%X)\n", Status); + ExFreePool(fip); + RtlFreeUnicodeString(&BaseKeyName); + ZwClose(InterfaceKey); + return Status; + } + + for (; i < fip->SubKeys; i++) + { + Status = ZwEnumerateKey( + InterfaceKey, + i, + KeyBasicInformation, + NULL, + 0, + &Size); + + if (Status != STATUS_BUFFER_TOO_SMALL) + { + DPRINT("ZwEnumerateKey() Failed. (0x%X)\n", Status); + ExFreePool(fip); + if (SymLinkList != NULL) + ExFreePool(SymLinkList); + RtlFreeUnicodeString(&BaseKeyName); + ZwClose(InterfaceKey); + return Status; + } + + bip = (PKEY_BASIC_INFORMATION)ExAllocatePool(NonPagedPool, Size); + assert(bip != NULL); + + Status = ZwEnumerateKey( + InterfaceKey, + i, + KeyBasicInformation, + bip, + Size, + &Size); + + if (!NT_SUCCESS(Status)) + { + DPRINT("ZwEnumerateKey() Failed. (0x%X)\n", Status); + ExFreePool(fip); + ExFreePool(bip); + if (SymLinkList != NULL) + ExFreePool(SymLinkList); + RtlFreeUnicodeString(&BaseKeyName); + ZwClose(InterfaceKey); + return Status; + } + + SubKeyName.Length = 0; + SubKeyName.MaximumLength = BaseKeyName.Length + bip->NameLength + sizeof(WCHAR); + SubKeyName.Buffer = ExAllocatePool(NonPagedPool, SubKeyName.MaximumLength); + assert(SubKeyName.Buffer != NULL); + TempString.Length = TempString.MaximumLength = bip->NameLength; + TempString.Buffer = bip->Name; + RtlCopyUnicodeString(&SubKeyName, &BaseKeyName); + RtlAppendUnicodeToString(&SubKeyName, L"\\"); + RtlAppendUnicodeStringToString(&SubKeyName, &TempString); + + ExFreePool(bip); + + InitializeObjectAttributes( + &ObjectAttributes, + &SubKeyName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + Status = ZwOpenKey( + &SubKey, + KEY_READ, + &ObjectAttributes); + + if (!NT_SUCCESS(Status)) + { + DPRINT("ZwOpenKey() Failed. (0x%X)\n", Status); + ExFreePool(fip); + if (SymLinkList != NULL) + ExFreePool(SymLinkList); + RtlFreeUnicodeString(&SubKeyName); + RtlFreeUnicodeString(&BaseKeyName); + ZwClose(InterfaceKey); + return Status; + } + + Status = ZwEnumerateKey( + SubKey, + 0, + KeyBasicInformation, + NULL, + 0, + &Size); + + if (Status != STATUS_BUFFER_TOO_SMALL) + { + DPRINT("ZwEnumerateKey() Failed. (0x%X)\n", Status); + ExFreePool(fip); + if (SymLinkList != NULL) + ExFreePool(SymLinkList); + RtlFreeUnicodeString(&SubKeyName); + RtlFreeUnicodeString(&BaseKeyName); + ZwClose(SubKey); + ZwClose(InterfaceKey); + return Status; + } + + bip = (PKEY_BASIC_INFORMATION)ExAllocatePool(NonPagedPool, Size); + assert(bip != NULL); + + Status = ZwEnumerateKey( + SubKey, + 0, + KeyBasicInformation, + bip, + Size, + &Size); + + if (!NT_SUCCESS(Status)) + { + DPRINT("ZwEnumerateKey() Failed. (0x%X)\n", Status); + ExFreePool(fip); + ExFreePool(bip); + if (SymLinkList != NULL) + ExFreePool(SymLinkList); + RtlFreeUnicodeString(&SubKeyName); + RtlFreeUnicodeString(&BaseKeyName); + ZwClose(SubKey); + ZwClose(InterfaceKey); + return Status; + } + + SymbolicLinkKeyName.Length = 0; + SymbolicLinkKeyName.MaximumLength = SubKeyName.Length + bip->NameLength + sizeof(WCHAR); + SymbolicLinkKeyName.Buffer = ExAllocatePool(NonPagedPool, SymbolicLinkKeyName.MaximumLength); + assert(SymbolicLinkKeyName.Buffer != NULL); + TempString.Length = TempString.MaximumLength = bip->NameLength; + TempString.Buffer = bip->Name; + RtlCopyUnicodeString(&SymbolicLinkKeyName, &SubKeyName); + RtlAppendUnicodeToString(&SymbolicLinkKeyName, L"\\"); + RtlAppendUnicodeStringToString(&SymbolicLinkKeyName, &TempString); + + ExFreePool(bip); + + InitializeObjectAttributes( + &ObjectAttributes, + &SymbolicLinkKeyName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + Status = ZwOpenKey( + &SymbolicLinkKey, + KEY_READ, + &ObjectAttributes); + + if (!NT_SUCCESS(Status)) + { + DPRINT("ZwOpenKey() Failed. (0x%X)\n", Status); + ExFreePool(fip); + if (SymLinkList != NULL) + ExFreePool(SymLinkList); + RtlFreeUnicodeString(&SymbolicLinkKeyName); + RtlFreeUnicodeString(&SubKeyName); + RtlFreeUnicodeString(&BaseKeyName); + ZwClose(SubKey); + ZwClose(InterfaceKey); + return Status; + } + + Status = ZwQueryValueKey( + SymbolicLinkKey, + &SymbolicLink, + KeyValuePartialInformation, + NULL, + 0, + &Size); + + if (Status != STATUS_BUFFER_TOO_SMALL) + { + DPRINT("ZwQueryValueKey() Failed. (0x%X)\n", Status); + ExFreePool(fip); + if (SymLinkList != NULL) + ExFreePool(SymLinkList); + RtlFreeUnicodeString(&SymbolicLinkKeyName); + RtlFreeUnicodeString(&SubKeyName); + RtlFreeUnicodeString(&BaseKeyName); + ZwClose(SymbolicLinkKey); + ZwClose(SubKey); + ZwClose(InterfaceKey); + return Status; + } + + vpip = (PKEY_VALUE_PARTIAL_INFORMATION)ExAllocatePool(NonPagedPool, Size); + assert(vpip != NULL); + + Status = ZwQueryValueKey( + SymbolicLinkKey, + &SymbolicLink, + KeyValuePartialInformation, + vpip, + Size, + &Size); + + if (!NT_SUCCESS(Status)) + { + ExFreePool(fip); + ExFreePool(vpip); + if (SymLinkList != NULL) + ExFreePool(SymLinkList); + RtlFreeUnicodeString(&SymbolicLinkKeyName); + RtlFreeUnicodeString(&SubKeyName); + RtlFreeUnicodeString(&BaseKeyName); + ZwClose(SymbolicLinkKey); + ZwClose(SubKey); + ZwClose(InterfaceKey); + return Status; + } + + /* Put the name in the string here */ + if (SymLinkList == NULL) + { + SymLinkListSize = vpip->DataLength; + SymLinkList = ExAllocatePool(NonPagedPool, SymLinkListSize + sizeof(WCHAR)); + assert(SymLinkList != NULL); + RtlCopyMemory(SymLinkList, vpip->Data, vpip->DataLength); + SymLinkList[vpip->DataLength / sizeof(WCHAR)] = 0; + SymLinkList[1] = '?'; + } + else + { + PWCHAR OldSymLinkList; + ULONG OldSymLinkListSize; + PWCHAR SymLinkListPtr; + + OldSymLinkList = SymLinkList; + OldSymLinkListSize = SymLinkListSize; + SymLinkListSize += vpip->DataLength; + SymLinkList = ExAllocatePool(NonPagedPool, SymLinkListSize + sizeof(WCHAR)); + assert(SymLinkList != NULL); + RtlCopyMemory(SymLinkList, OldSymLinkList, OldSymLinkListSize); + ExFreePool(OldSymLinkList); + SymLinkListPtr = SymLinkList + (OldSymLinkListSize / sizeof(WCHAR)); + RtlCopyMemory(SymLinkListPtr, vpip->Data, vpip->DataLength); + SymLinkListPtr[vpip->DataLength / sizeof(WCHAR)] = 0; + SymLinkListPtr[1] = '?'; + } + + RtlFreeUnicodeString(&SymbolicLinkKeyName); + RtlFreeUnicodeString(&SubKeyName); + ZwClose(SymbolicLinkKey); + ZwClose(SubKey); + ExFreePool(vpip); + } + + if (SymLinkList != NULL) + SymLinkList[SymLinkListSize / sizeof(WCHAR)] = 0; + *SymbolicLinkList = SymLinkList; + + RtlFreeUnicodeString(&BaseKeyName); + ZwClose(InterfaceKey); + ExFreePool(fip); + } + + return STATUS_SUCCESS; } /* * @unimplemented */ -NTSTATUS -STDCALL + +NTSTATUS STDCALL IoRegisterDeviceInterface( - IN PDEVICE_OBJECT PhysicalDeviceObject, - IN CONST GUID *InterfaceClassGuid, - IN PUNICODE_STRING ReferenceString OPTIONAL, - OUT PUNICODE_STRING SymbolicLinkName) + IN PDEVICE_OBJECT PhysicalDeviceObject, + IN CONST GUID *InterfaceClassGuid, + IN PUNICODE_STRING ReferenceString OPTIONAL, + OUT PUNICODE_STRING SymbolicLinkName) { - PWCHAR KeyNameString = L"\\Device\\Serenum"; + PWCHAR KeyNameString = L"\\Device\\Serenum"; - DPRINT("IoRegisterDeviceInterface called (UNIMPLEMENTED)\n"); - if (IsEqualGUID(InterfaceClassGuid, (LPGUID)&GUID_SERENUM_BUS_ENUMERATOR)) - { - RtlInitUnicodeString(SymbolicLinkName, KeyNameString); - return STATUS_SUCCESS; - } - return STATUS_INVALID_DEVICE_REQUEST; -// return STATUS_NOT_IMPLEMENTED; + DPRINT("IoRegisterDeviceInterface called (UNIMPLEMENTED)\n"); + if (IsEqualGUID(InterfaceClassGuid, (LPGUID)&GUID_SERENUM_BUS_ENUMERATOR)) + { + RtlInitUnicodeString(SymbolicLinkName, KeyNameString); + return STATUS_SUCCESS; + } + + return STATUS_INVALID_DEVICE_REQUEST; } /* * @unimplemented */ -NTSTATUS -STDCALL -IoSetDeviceInterfaceState( - IN PUNICODE_STRING SymbolicLinkName, - IN BOOLEAN Enable) -{ - DPRINT("IoSetDeviceInterfaceState called (UNIMPLEMENTED)\n"); - return STATUS_SUCCESS; -// return STATUS_OBJECT_NAME_EXISTS; -// return STATUS_OBJECT_NAME_NOT_FOUND; -// return STATUS_NOT_IMPLEMENTED; +NTSTATUS STDCALL +IoSetDeviceInterfaceState( + IN PUNICODE_STRING SymbolicLinkName, + IN BOOLEAN Enable) +{ + return STATUS_NOT_IMPLEMENTED; } /* EOF */ From e7a65678bd3d8eea5f62746567d4326c35d56cdb Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 29 Feb 2004 11:34:42 +0000 Subject: [PATCH 0256/1463] - Fixed GDI handle leak. svn path=/trunk/; revision=8466 --- reactos/subsys/win32k/ntuser/painting.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/ntuser/painting.c b/reactos/subsys/win32k/ntuser/painting.c index 051d8c8eaa2..818181c9c17 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.74 2004/02/24 13:27:03 weiden Exp $ + * $Id: painting.c,v 1.75 2004/02/29 11:34:42 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -332,6 +332,7 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags) { NtGdiCombineRgn(Window->NCUpdateRegion, Window->NCUpdateRegion, hRgnNonClient, RGN_OR); + NtGdiDeleteObject(hRgnNonClient); } NtGdiDeleteObject(hRgnWindow); From ad9ce1d94e1bc1979ab77213a5c8b557bb29a111 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sun, 29 Feb 2004 11:51:49 +0000 Subject: [PATCH 0257/1463] - Protected the callback stack list with a spinlock. svn path=/trunk/; revision=8467 --- reactos/ntoskrnl/ps/w32call.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/ps/w32call.c b/reactos/ntoskrnl/ps/w32call.c index b1b88de6bbf..790be48204d 100644 --- a/reactos/ntoskrnl/ps/w32call.c +++ b/reactos/ntoskrnl/ps/w32call.c @@ -1,4 +1,4 @@ -/* $Id: w32call.c,v 1.11 2003/12/31 05:33:04 jfilby Exp $ +/* $Id: w32call.c,v 1.12 2004/02/29 11:51:49 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -52,6 +52,7 @@ typedef struct LIST_ENTRY ListEntry; } NTW32CALL_CALLBACK_STACK, *PNTW32CALL_CALLBACK_STACK; +KSPIN_LOCK CallbackStackListLock; static LIST_ENTRY CallbackStackListHead; /* FUNCTIONS ***************************************************************/ @@ -60,6 +61,7 @@ VOID INIT_FUNCTION PsInitialiseW32Call(VOID) { InitializeListHead(&CallbackStackListHead); + KeInitializeSpinLock(&CallbackStackListLock); } NTSTATUS STDCALL @@ -244,8 +246,10 @@ NtW32Call (IN ULONG RoutineIndex, /* Set up the new kernel and user environment. */ StackSize = (ULONG)((char*)Thread->Tcb.StackBase - Thread->Tcb.StackLimit); + KeAcquireSpinLock(&CallbackStackListLock, &oldIrql); if (IsListEmpty(&CallbackStackListHead)) { + KeReleaseSpinLock(&CallbackStackListLock, oldIrql); NewStack = PsAllocateCallbackStack(StackSize); AssignedStack = ExAllocatePool(NonPagedPool, sizeof(NTW32CALL_CALLBACK_STACK)); @@ -256,6 +260,7 @@ NtW32Call (IN ULONG RoutineIndex, PLIST_ENTRY StackEntry; StackEntry = RemoveHeadList(&CallbackStackListHead); + KeReleaseSpinLock(&CallbackStackListLock, oldIrql); AssignedStack = CONTAINING_RECORD(StackEntry, NTW32CALL_CALLBACK_STACK, ListEntry); NewStack = AssignedStack->BaseAddress; @@ -293,8 +298,10 @@ NtW32Call (IN ULONG RoutineIndex, * The callback return will have already restored most of the state we * modified. */ - KeLowerIrql(PASSIVE_LEVEL); + KeLowerIrql(DISPATCH_LEVEL); + KeAcquireSpinLockAtDpcLevel(&CallbackStackListLock); InsertTailList(&CallbackStackListHead, &AssignedStack->ListEntry); + KeReleaseSpinLock(&CallbackStackListLock, PASSIVE_LEVEL); return(CallbackStatus); } From 9adec1e712696c8f106fd791792563882221a5b5 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 29 Feb 2004 12:03:23 +0000 Subject: [PATCH 0258/1463] - correct parameter type from LPDISPATCH* to LPDISPATCH - define V_U... macros svn path=/trunk/; revision=8468 --- reactos/w32api/include/oleauto.h | 34 +++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/reactos/w32api/include/oleauto.h b/reactos/w32api/include/oleauto.h index d28067c7af1..3da356c4663 100644 --- a/reactos/w32api/include/oleauto.h +++ b/reactos/w32api/include/oleauto.h @@ -42,11 +42,16 @@ #define V_UI1(X) V_UNION(X,bVal) #define V_UI1REF(X) V_UNION(X,pbVal) #define V_I2(X) V_UNION(X,iVal) +#define V_UI2(X) V_UNION(X,uiVal) #define V_I2REF(X) V_UNION(X,piVal) #define V_I4(X) V_UNION(X,lVal) +#define V_UI4(X) V_UNION(X,ulVal) #define V_I4REF(X) V_UNION(X,plVal) +#define V_UI4REF(X) V_UNION(X,pulVal) #define V_I8(X) V_UNION(X,hVal) +#define V_UI8(X) V_UNION(X,uhVal) #define V_I8REF(X) V_UNION(X,phVal) +#define V_UI8REF(X) V_UNION(X,puhVal) #define V_R4(X) V_UNION(X,fltVal) #define V_R4REF(X) V_UNION(X,pfltVal) #define V_R8(X) V_UNION(X,dblVal) @@ -80,6 +85,17 @@ #define V_DECIMAL(X) V_UNION(X,decVal) #define V_DECIMALREF(X) V_UNION(X,pdecVal) #define V_I1(X) V_UNION(X,cVal) +#ifdef _WIN64 +#define V_INT_PTR(X) V_I8(X) +#define V_UINT_PTR(X) V_UI8(X) +#define V_INT_PTRREF(X) V_I8REF(X) +#define V_UINT_PTRREF(X) V_UI8REF(X) +#else +#define V_INT_PTR(X) V_I4(X) +#define V_UINT_PTR(X) V_UI4(X) +#define V_INT_PTRREF(X) V_I4REF(X) +#define V_UINT_PTRREF(X) V_UI4REF(X) +#endif #include <oaidl.h> @@ -152,7 +168,7 @@ WINOLEAUTAPI VarUI1FromR8(double,unsigned char*); WINOLEAUTAPI VarUI1FromCy(CY,unsigned char*); WINOLEAUTAPI VarUI1FromDate(DATE,unsigned char*); WINOLEAUTAPI VarUI1FromStr(OLECHAR*,LCID,unsigned long,unsigned char*); -WINOLEAUTAPI VarUI1FromDisp(LPDISPATCH*,LCID,unsigned char*); +WINOLEAUTAPI VarUI1FromDisp(LPDISPATCH,LCID,unsigned char*); WINOLEAUTAPI VarUI1FromBool(VARIANT_BOOL,unsigned char*); WINOLEAUTAPI VarI2FromUI1(unsigned char,short*); WINOLEAUTAPI VarI2FromI4(long,short*); @@ -161,7 +177,7 @@ WINOLEAUTAPI VarI2FromR8(double,short*); WINOLEAUTAPI VarI2FromCy(CY cyIn,short*); WINOLEAUTAPI VarI2FromDate(DATE,short*); WINOLEAUTAPI VarI2FromStr(OLECHAR*,LCID,unsigned long,short*); -WINOLEAUTAPI VarI2FromDisp(LPDISPATCH*,LCID,short*); +WINOLEAUTAPI VarI2FromDisp(LPDISPATCH,LCID,short*); WINOLEAUTAPI VarI2FromBool(VARIANT_BOOL,short*); WINOLEAUTAPI VarI4FromUI1(unsigned char,long*); WINOLEAUTAPI VarI4FromI2(short,long*); @@ -170,7 +186,7 @@ WINOLEAUTAPI VarI4FromR8(double,long*); WINOLEAUTAPI VarI4FromCy(CY,long*); WINOLEAUTAPI VarI4FromDate(DATE,long*); WINOLEAUTAPI VarI4FromStr(OLECHAR*,LCID,unsigned long,long*); -WINOLEAUTAPI VarI4FromDisp(LPDISPATCH*,LCID,long*); +WINOLEAUTAPI VarI4FromDisp(LPDISPATCH,LCID,long*); WINOLEAUTAPI VarI4FromBool(VARIANT_BOOL,long*); WINOLEAUTAPI VarR4FromUI1(unsigned char,float*); WINOLEAUTAPI VarR4FromI2(short,float*); @@ -179,7 +195,7 @@ WINOLEAUTAPI VarR4FromR8(double,float*); WINOLEAUTAPI VarR4FromCy(CY,float*); WINOLEAUTAPI VarR4FromDate(DATE,float*); WINOLEAUTAPI VarR4FromStr(OLECHAR*,LCID,unsigned long,float*); -WINOLEAUTAPI VarR4FromDisp(LPDISPATCH*,LCID,float*); +WINOLEAUTAPI VarR4FromDisp(LPDISPATCH,LCID,float*); WINOLEAUTAPI VarR4FromBool(VARIANT_BOOL,float*); WINOLEAUTAPI VarR8FromUI1(unsigned char,double*); WINOLEAUTAPI VarR8FromI2(short,double*); @@ -188,7 +204,7 @@ WINOLEAUTAPI VarR8FromR4(float,double*); WINOLEAUTAPI VarR8FromCy(CY,double*); WINOLEAUTAPI VarR8FromDate(DATE,double*); WINOLEAUTAPI VarR8FromStr(OLECHAR*,LCID,unsigned long,double*); -WINOLEAUTAPI VarR8FromDisp(LPDISPATCH*,LCID,double*); +WINOLEAUTAPI VarR8FromDisp(LPDISPATCH,LCID,double*); WINOLEAUTAPI VarR8FromBool(VARIANT_BOOL,double*); WINOLEAUTAPI VarR8FromDec(DECIMAL*,double*); WINOLEAUTAPI VarDateFromUI1(unsigned char,DATE*); @@ -198,7 +214,7 @@ WINOLEAUTAPI VarDateFromR4(float,DATE*); WINOLEAUTAPI VarDateFromR8(double,DATE*); WINOLEAUTAPI VarDateFromCy(CY,DATE*); WINOLEAUTAPI VarDateFromStr(OLECHAR*,LCID,unsigned long,DATE*); -WINOLEAUTAPI VarDateFromDisp(LPDISPATCH*,LCID,DATE*); +WINOLEAUTAPI VarDateFromDisp(LPDISPATCH,LCID,DATE*); WINOLEAUTAPI VarDateFromBool(VARIANT_BOOL,DATE*); WINOLEAUTAPI VarCyFromUI1(unsigned char,CY*); WINOLEAUTAPI VarCyFromI2(short,CY*); @@ -207,7 +223,7 @@ WINOLEAUTAPI VarCyFromR4(float,CY*); WINOLEAUTAPI VarCyFromR8(double,CY*); WINOLEAUTAPI VarCyFromDate(DATE,CY*); WINOLEAUTAPI VarCyFromStr(OLECHAR*,LCID,unsigned long,CY*); -WINOLEAUTAPI VarCyFromDisp(LPDISPATCH*,LCID,CY*); +WINOLEAUTAPI VarCyFromDisp(LPDISPATCH,LCID,CY*); WINOLEAUTAPI VarCyFromBool(VARIANT_BOOL,CY*); WINOLEAUTAPI VarBstrFromUI1(unsigned char,LCID,unsigned long,BSTR*); WINOLEAUTAPI VarBstrFromI2(short,LCID,unsigned long,BSTR*); @@ -216,7 +232,7 @@ WINOLEAUTAPI VarBstrFromR4(float,LCID,unsigned long,BSTR*); WINOLEAUTAPI VarBstrFromR8(double,LCID,unsigned long,BSTR*); WINOLEAUTAPI VarBstrFromCy(CY,LCID,unsigned long,BSTR*); WINOLEAUTAPI VarBstrFromDate(DATE,LCID,unsigned long,BSTR*); -WINOLEAUTAPI VarBstrFromDisp(LPDISPATCH*,LCID,unsigned long,BSTR*); +WINOLEAUTAPI VarBstrFromDisp(LPDISPATCH,LCID,unsigned long,BSTR*); WINOLEAUTAPI VarBstrFromBool(VARIANT_BOOL,LCID,unsigned long,BSTR*); WINOLEAUTAPI VarBoolFromUI1(unsigned char,VARIANT_BOOL*); WINOLEAUTAPI VarBoolFromI2(short,VARIANT_BOOL*); @@ -226,7 +242,7 @@ WINOLEAUTAPI VarBoolFromR8(double,VARIANT_BOOL*); WINOLEAUTAPI VarBoolFromDate(DATE,VARIANT_BOOL*); WINOLEAUTAPI VarBoolFromCy(CY,VARIANT_BOOL*); WINOLEAUTAPI VarBoolFromStr(OLECHAR*,LCID,unsigned long,VARIANT_BOOL*); -WINOLEAUTAPI VarBoolFromDisp(LPDISPATCH*,LCID,VARIANT_BOOL*); +WINOLEAUTAPI VarBoolFromDisp(LPDISPATCH,LCID,VARIANT_BOOL*); WINOLEAUTAPI VarDecFromR8(double,DECIMAL*); WINOLEAUTAPI_(ULONG) LHashValOfNameSysA(SYSKIND,LCID,const char*); WINOLEAUTAPI_(ULONG) LHashValOfNameSys(SYSKIND,LCID,const OLECHAR*); From e38d6f00f75ddd43977733d45f44fc6f8e7a2909 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 29 Feb 2004 12:03:30 +0000 Subject: [PATCH 0259/1463] - correct definition of VT_INT_PTR and VT_UINT_PTR svn path=/trunk/; revision=8469 --- reactos/w32api/include/wtypes.h | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/reactos/w32api/include/wtypes.h b/reactos/w32api/include/wtypes.h index 612b8dc9790..85d1851a8fb 100644 --- a/reactos/w32api/include/wtypes.h +++ b/reactos/w32api/include/wtypes.h @@ -118,18 +118,11 @@ enum VARENUM { VT_EMPTY,VT_NULL,VT_I2,VT_I4,VT_R4,VT_R8,VT_CY,VT_DATE,VT_BSTR,VT_DISPATCH, VT_ERROR,VT_BOOL,VT_VARIANT,VT_UNKNOWN,VT_DECIMAL,VT_I1=16,VT_UI1,VT_UI2,VT_UI4,VT_I8, VT_UI8,VT_INT,VT_UINT,VT_VOID,VT_HRESULT,VT_PTR,VT_SAFEARRAY,VT_CARRAY,VT_USERDEFINED, - VT_LPSTR,VT_LPWSTR,VT_RECORD=36,VT_FILETIME=64,VT_BLOB,VT_STREAM,VT_STORAGE,VT_STREAMED_OBJECT, + VT_LPSTR,VT_LPWSTR,VT_RECORD=36,VT_INT_PTR=37,VT_UINT_PTR=38,VT_FILETIME=64,VT_BLOB,VT_STREAM,VT_STORAGE,VT_STREAMED_OBJECT, VT_STORED_OBJECT,VT_BLOB_OBJECT,VT_CF,VT_CLSID,VT_BSTR_BLOB=0xfff,VT_VECTOR=0x1000, VT_ARRAY=0x2000,VT_BYREF=0x4000,VT_RESERVED=0x8000,VT_ILLEGAL= 0xffff,VT_ILLEGALMASKED=0xfff, VT_TYPEMASK=0xfff }; -#ifdef _WIN64 -#define VT_INT_PTR VT_I8 -#define VT_UINT_PTR VT_UI8 -#else -#define VT_INT_PTR VT_I4 -#define VT_UINT_PTR VT_UI4 -#endif typedef struct _BYTE_SIZEDARR { unsigned long clSize; From 655457493ca4b8db8ebbf5f11aa96c46af10dd83 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 29 Feb 2004 12:05:33 +0000 Subject: [PATCH 0260/1463] remove FIXMEs using corrected W32API headers svn path=/trunk/; revision=8470 --- reactos/lib/oleaut32/oleaut.c | 4 ++-- reactos/lib/oleaut32/oleaut32.spec | 16 ++++++++-------- reactos/lib/oleaut32/ros-mingw-fixes.h | 4 ---- reactos/lib/oleaut32/safearray.c | 2 -- reactos/lib/oleaut32/variant.c | 18 ------------------ reactos/lib/oleaut32/vartype.c | 18 ------------------ 6 files changed, 10 insertions(+), 52 deletions(-) diff --git a/reactos/lib/oleaut32/oleaut.c b/reactos/lib/oleaut32/oleaut.c index 4e43bb6447a..94d6f0747ed 100644 --- a/reactos/lib/oleaut32/oleaut.c +++ b/reactos/lib/oleaut32/oleaut.c @@ -102,7 +102,7 @@ HMODULE OLEAUT32_hModule = NULL; * calculated by lstrlenW(), since it returns the length that was used to * allocate the string by SysAllocStringLen(). */ -unsigned/*FIXME: wrong return type of SysStringLen() in MinGW header */ +unsigned/*FIXME: wrong return type of SysStringLen() in WINE header */ int WINAPI SysStringLen(BSTR str) { DWORD* bufferPointer; @@ -133,7 +133,7 @@ int WINAPI SysStringLen(BSTR str) * NOTES * See SysStringLen(), BSTR(). */ -unsigned/*FIXME: wrong return type of SysStringLen() in MinGW header */ +unsigned/*FIXME: wrong return type of SysStringLen() in WINE header */ int WINAPI SysStringByteLen(BSTR str) { DWORD* bufferPointer; diff --git a/reactos/lib/oleaut32/oleaut32.spec b/reactos/lib/oleaut32/oleaut32.spec index f44046e339c..6c713b755a7 100644 --- a/reactos/lib/oleaut32/oleaut32.spec +++ b/reactos/lib/oleaut32/oleaut32.spec @@ -52,7 +52,7 @@ 52 stdcall VarI2FromCy(long long ptr) 53 stdcall VarI2FromDate(double ptr) 54 stdcall VarI2FromStr(wstr long long ptr) -#55 stdcall VarI2FromDisp(ptr long ptr) +55 stdcall VarI2FromDisp(ptr long ptr) 56 stdcall VarI2FromBool(long ptr) #57 stdcall SafeArraySetIID(ptr ptr) 58 stdcall VarI4FromUI1(long ptr) @@ -62,7 +62,7 @@ 62 stdcall VarI4FromCy(long long ptr) 63 stdcall VarI4FromDate(double ptr) 64 stdcall VarI4FromStr(wstr long long ptr) -#65 stdcall VarI4FromDisp(ptr long ptr) +65 stdcall VarI4FromDisp(ptr long ptr) 66 stdcall VarI4FromBool(long ptr) #67 stdcall SafeArrayGetIID(ptr ptr) 68 stdcall VarR4FromUI1(long ptr) @@ -72,7 +72,7 @@ 72 stdcall VarR4FromCy(long long ptr) 73 stdcall VarR4FromDate(double ptr) 74 stdcall VarR4FromStr(wstr long long ptr) -#75 stdcall VarR4FromDisp(ptr long ptr) +75 stdcall VarR4FromDisp(ptr long ptr) 76 stdcall VarR4FromBool(long ptr) #77 stdcall SafeArrayGetVartype(ptr ptr) 78 stdcall VarR8FromUI1(long ptr) @@ -82,7 +82,7 @@ 82 stdcall VarR8FromCy(long long ptr) 83 stdcall VarR8FromDate(double ptr) 84 stdcall VarR8FromStr(wstr long long ptr) -#85 stdcall VarR8FromDisp(ptr long ptr) +85 stdcall VarR8FromDisp(ptr long ptr) 86 stdcall VarR8FromBool(long ptr) #87 stdcall VarFormat(ptr ptr long long long ptr) 88 stdcall VarDateFromUI1(long ptr) @@ -92,7 +92,7 @@ 92 stdcall VarDateFromR8(double ptr) 93 stdcall VarDateFromCy(long long ptr) #94 stdcall VarDateFromStr(wstr long long ptr) -#95 stdcall VarDateFromDisp(ptr long ptr) +95 stdcall VarDateFromDisp(ptr long ptr) 96 stdcall VarDateFromBool(long ptr) #97 stdcall VarFormatDateTime(ptr long long ptr) 98 stdcall VarCyFromUI1(long ptr) @@ -102,7 +102,7 @@ 102 stdcall VarCyFromR8(double ptr) 103 stdcall VarCyFromDate(double ptr) 104 stdcall VarCyFromStr(wstr long long ptr) -#105 stdcall VarCyFromDisp(ptr long ptr) +105 stdcall VarCyFromDisp(ptr long ptr) 106 stdcall VarCyFromBool(long ptr) #107 stdcall VarFormatNumber(ptr long long long long long ptr) 108 stdcall VarBstrFromUI1(long long long ptr) @@ -123,7 +123,7 @@ 123 stdcall VarBoolFromDate(double ptr) 124 stdcall VarBoolFromCy(long long ptr) 125 stdcall VarBoolFromStr(wstr long long ptr) -#126 stdcall VarBoolFromDisp(ptr long ptr) +126 stdcall VarBoolFromDisp(ptr long ptr) #127 stdcall VarFormatCurrency(ptr long long long long long ptr) 128 stub VarWeekdayName # stdcall (long long long long ptr) 129 stub VarMonthName # stdcall (long long long ptr) @@ -134,7 +134,7 @@ 134 stdcall VarUI1FromCy(long long ptr) 135 stdcall VarUI1FromDate(double ptr) 136 stdcall VarUI1FromStr(wstr long long ptr) -#137 stdcall VarUI1FromDisp(ptr long ptr) +137 stdcall VarUI1FromDisp(ptr long ptr) 138 stdcall VarUI1FromBool(long ptr) #139 stdcall VarFormatFromTokens (ptr ptr ptr long ptr long) #140 stdcall VarTokenizeFormatString (ptr ptr long long long long ptr) diff --git a/reactos/lib/oleaut32/ros-mingw-fixes.h b/reactos/lib/oleaut32/ros-mingw-fixes.h index a0c02c8e7a3..87fd141ff22 100644 --- a/reactos/lib/oleaut32/ros-mingw-fixes.h +++ b/reactos/lib/oleaut32/ros-mingw-fixes.h @@ -38,10 +38,6 @@ HRESULT WINAPI VarDecNeg(const DECIMAL*,DECIMAL*); #define VAR_CALENDAR_THAI ((DWORD)0x00000080) #define VAR_CALENDAR_GREGORIAN ((DWORD)0x00000100) -#define V_UI2(X) V_UNION(X, uiVal) -#define V_UI4(X) V_UNION(X, ulVal) -#define V_UI8(X) V_UNION(X, ullVal) - #endif diff --git a/reactos/lib/oleaut32/safearray.c b/reactos/lib/oleaut32/safearray.c index 8e80e5c6286..7d841bb0c84 100644 --- a/reactos/lib/oleaut32/safearray.c +++ b/reactos/lib/oleaut32/safearray.c @@ -123,10 +123,8 @@ static DWORD SAFEARRAY_GetVTSize(VARTYPE vt) case VT_UI8: return sizeof(LONG64); case VT_INT: case VT_UINT: return sizeof(INT); -#ifndef __REACTOS__ /*FIXME: wrong definition of VT_INT_PTR in MinGW headers */ case VT_INT_PTR: case VT_UINT_PTR: return sizeof(UINT_PTR); -#endif case VT_CY: return sizeof(CY); case VT_DATE: return sizeof(DATE); case VT_BSTR: return sizeof(BSTR); diff --git a/reactos/lib/oleaut32/variant.c b/reactos/lib/oleaut32/variant.c index 1f0754e1aa0..ef432d6748b 100644 --- a/reactos/lib/oleaut32/variant.c +++ b/reactos/lib/oleaut32/variant.c @@ -198,9 +198,7 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, #ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ case VT_DECIMAL: return VarI2FromDec(&V_DECIMAL(ps), &V_I2(pd)); #endif -#ifndef __REACTOS__ /*FIXME: wrong declaration of VarI2FromDisp() in MinGW header */ case VT_DISPATCH: return VarI2FromDisp(V_DISPATCH(ps), lcid, &V_I2(pd)); -#endif case VT_BSTR: return VarI2FromStr(V_BSTR(ps), lcid, dwFlags, &V_I2(pd)); } break; @@ -226,9 +224,7 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, #ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ case VT_DECIMAL: return VarI4FromDec(&V_DECIMAL(ps), &V_I4(pd)); #endif -#ifndef __REACTOS__ /*FIXME: wrong declaration of VarI4FromDisp() in MinGW header */ case VT_DISPATCH: return VarI4FromDisp(V_DISPATCH(ps), lcid, &V_I4(pd)); -#endif case VT_BSTR: return VarI4FromStr(V_BSTR(ps), lcid, dwFlags, &V_I4(pd)); } break; @@ -254,9 +250,7 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, #ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ case VT_DECIMAL: return VarUI1FromDec(&V_DECIMAL(ps), &V_UI1(pd)); #endif -#ifndef __REACTOS__ /*FIXME: wrong declaration of VarUI1FromDisp() in MinGW header */ case VT_DISPATCH: return VarUI1FromDisp(V_DISPATCH(ps), lcid, &V_UI1(pd)); -#endif case VT_BSTR: return VarUI1FromStr(V_BSTR(ps), lcid, dwFlags, &V_UI1(pd)); } break; @@ -357,9 +351,7 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, #ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ case VT_DECIMAL: return VarI8FromDec(&V_DECIMAL(ps), &V_I8(pd)); #endif -#ifndef __REACTOS__ /*FIXME: wrong declaration of VarI8FromDisp() in MinGW header */ case VT_DISPATCH: return VarI8FromDisp(V_DISPATCH(ps), lcid, &V_I8(pd)); -#endif case VT_BSTR: return VarI8FromStr(V_BSTR(ps), lcid, dwFlags, &V_I8(pd)); } break; @@ -386,9 +378,7 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, #ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ case VT_DECIMAL: return VarR4FromDec(&V_DECIMAL(ps), &V_R4(pd)); #endif -#ifndef __REACTOS__ /*FIXME: wrong declaration of VarR4FromDisp() in MinGW header */ case VT_DISPATCH: return VarR4FromDisp(V_DISPATCH(ps), lcid, &V_R4(pd)); -#endif case VT_BSTR: return VarR4FromStr(V_BSTR(ps), lcid, dwFlags, &V_R4(pd)); } break; @@ -414,9 +404,7 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, #ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ case VT_DECIMAL: return VarR8FromDec(&V_DECIMAL(ps), &V_R8(pd)); #endif -#ifndef __REACTOS__ /*FIXME: wrong declaration of VarR8FromDisp() in MinGW header */ case VT_DISPATCH: return VarR8FromDisp(V_DISPATCH(ps), lcid, &V_R8(pd)); -#endif case VT_BSTR: return VarR8FromStr(V_BSTR(ps), lcid, dwFlags, &V_R8(pd)); } break; @@ -442,9 +430,7 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, #ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ case VT_DECIMAL: return VarDateFromDec(&V_DECIMAL(ps), &V_DATE(pd)); #endif -#ifndef __REACTOS__ /*FIXME: wrong declaration of VarDateFromDisp() in MinGW header */ case VT_DISPATCH: return VarDateFromDisp(V_DISPATCH(ps), lcid, &V_DATE(pd)); -#endif #ifndef __REACTOS__ /*FIXME: no date funtions yet */ case VT_BSTR: return VarDateFromStr(V_BSTR(ps), lcid, dwFlags, &V_DATE(pd)); #endif @@ -472,9 +458,7 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, #ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ case VT_DECIMAL: return VarBoolFromDec(&V_DECIMAL(ps), &V_BOOL(pd)); #endif -#ifndef __REACTOS__ /*FIXME: wrong declaration of VarBoolFromDisp() in MinGW header */ case VT_DISPATCH: return VarBoolFromDisp(V_DISPATCH(ps), lcid, &V_BOOL(pd)); -#endif case VT_BSTR: return VarBoolFromStr(V_BSTR(ps), lcid, dwFlags, &V_BOOL(pd)); } break; @@ -532,9 +516,7 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_DECIMAL: return VarCyFromDec(&V_DECIMAL(ps), &V_CY(pd)); #endif -#ifndef __REACTOS__ /*FIXME: wrong declaration of VarCyFromDisp() in MinGW header */ case VT_DISPATCH: return VarCyFromDisp(V_DISPATCH(ps), lcid, &V_CY(pd)); -#endif case VT_BSTR: return VarCyFromStr(V_BSTR(ps), lcid, dwFlags, &V_CY(pd)); } break; diff --git a/reactos/lib/oleaut32/vartype.c b/reactos/lib/oleaut32/vartype.c index 6b6c95a8afc..299f5c57351 100644 --- a/reactos/lib/oleaut32/vartype.c +++ b/reactos/lib/oleaut32/vartype.c @@ -69,9 +69,7 @@ static inline void VARIANT_CopyData(const VARIANT *srcVar, VARTYPE vt, void *pOu case VT_UI8: memcpy(pOut, &V_UI8(srcVar), sizeof (LONG64)); #endif break; -#ifndef __REACTOS__ /*FIXME: wrong definition of VT_INT_PTR in MinGW headers */ case VT_INT_PTR: memcpy(pOut, &V_INT_PTR(srcVar), sizeof (INT_PTR)); break; -#endif case VT_DECIMAL: memcpy(pOut, &V_DECIMAL(srcVar), sizeof (DECIMAL)); break; default: FIXME("VT_ type %d unhandled, please report!\n", vt); @@ -600,7 +598,6 @@ HRESULT WINAPI VarUI1FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, BYTE* pbO return _VarUI1FromStr(strIn, lcid, dwFlags, pbOut); } -#ifndef __REACTOS__ /*FIXME: wrong declaration of VarUI1FromDisp() in MinGW header */ /************************************************************************ * VarUI1FromDisp (OLEAUT32.137) * @@ -621,7 +618,6 @@ HRESULT WINAPI VarUI1FromDisp(IDispatch* pdispIn, LCID lcid, BYTE* pbOut) { return _VarUI1FromDisp(pdispIn, lcid, pbOut); } -#endif /************************************************************************ * VarUI1FromBool (OLEAUT32.138) @@ -905,7 +901,6 @@ HRESULT WINAPI VarI2FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, SHORT* psO return _VarI2FromStr(strIn, lcid, dwFlags, psOut); } -#ifndef __REACTOS__ /*FIXME: wrong declaration of VarI2FromDisp() in MinGW header */ /************************************************************************ * VarI2FromDisp (OLEAUT32.55) * @@ -926,7 +921,6 @@ HRESULT WINAPI VarI2FromDisp(IDispatch* pdispIn, LCID lcid, SHORT* psOut) { return _VarI2FromDisp(pdispIn, lcid, psOut); } -#endif /************************************************************************ * VarI2FromBool (OLEAUT32.56) @@ -1501,7 +1495,6 @@ HRESULT WINAPI VarI4FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, LONG *piOu return _VarI4FromStr(strIn, lcid, dwFlags, piOut); } -#ifndef __REACTOS__ /*FIXME: wrong declaration of VarI4FromDisp() in MinGW header */ /************************************************************************ * VarI4FromDisp (OLEAUT32.65) * @@ -1522,7 +1515,6 @@ HRESULT WINAPI VarI4FromDisp(IDispatch* pdispIn, LCID lcid, LONG *piOut) { return _VarI4FromDisp(pdispIn, lcid, piOut); } -#endif /************************************************************************ * VarI4FromBool (OLEAUT32.66) @@ -2744,12 +2736,10 @@ HRESULT WINAPI VarR4FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, float *pFl * DISP_E_OVERFLOW, if the value will not fit in the destination * DISP_E_TYPEMISMATCH, if the type cannot be converted */ -#ifndef __REACTOS__ /*FIXME: wrong declaration of VarR4FromDisp() in MinGW header */ HRESULT WINAPI VarR4FromDisp(IDispatch* pdispIn, LCID lcid, float *pFltOut) { return _VarR4FromDisp(pdispIn, lcid, pFltOut); } -#endif /************************************************************************ * VarR4FromBool (OLEAUT32.76) @@ -3069,12 +3059,10 @@ HRESULT WINAPI VarR8FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, double *pD * DISP_E_OVERFLOW, if the value will not fit in the destination * DISP_E_TYPEMISMATCH, if the type cannot be converted */ -#ifndef __REACTOS__ /*FIXME: wrong declaration of VarUI1FromDisp() in MinGW header */ HRESULT WINAPI VarR8FromDisp(IDispatch* pdispIn, LCID lcid, double *pDblOut) { return _VarR8FromDisp(pdispIn, lcid, pDblOut); } -#endif /************************************************************************ * VarR8FromBool (OLEAUT32.86) @@ -3494,12 +3482,10 @@ HRESULT WINAPI VarCyFromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, CY* pCyOut * DISP_E_OVERFLOW, if the value will not fit in the destination * DISP_E_TYPEMISMATCH, if the type cannot be converted */ -#ifndef __REACTOS__ /*FIXME: wrong declaration of VarCyFromDisp() in MinGW header */ HRESULT WINAPI VarCyFromDisp(IDispatch* pdispIn, LCID lcid, CY* pCyOut) { return _VarCyFromDisp(pdispIn, lcid, pCyOut); } -#endif /************************************************************************ @@ -5080,12 +5066,10 @@ VarBoolFromStr_CheckLocalised: * DISP_E_OVERFLOW, if the value will not fit in the destination * DISP_E_TYPEMISMATCH, if the type cannot be converted */ -#ifndef __REACTOS__ /*FIXME: wrong declaration of VarBoolFromDisp() in MinGW header */ HRESULT WINAPI VarBoolFromDisp(IDispatch* pdispIn, LCID lcid, VARIANT_BOOL *pBoolOut) { return _VarBoolFromDisp(pdispIn, lcid, pBoolOut); } -#endif /************************************************************************ * VarBoolFromI1 (OLEAUT32.233) @@ -5931,12 +5915,10 @@ HRESULT WINAPI VarDateFromR8(double dblIn, DATE* pdateOut) * DISP_E_OVERFLOW, if the value will not fit in the destination * DISP_E_TYPEMISMATCH, if the type cannot be converted */ -#ifndef __REACTOS__ /*FIXME: wrong declaration of VarDateFromDisp() in MinGW header */ HRESULT WINAPI VarDateFromDisp(IDispatch* pdispIn, LCID lcid, DATE* pdateOut) { return _VarDateFromDisp(pdispIn, lcid, pdateOut); } -#endif /****************************************************************************** * VarDateFromBool (OLEAUT32.96) From 035924f082081cfca4c4fc31b157bab22ca8e99d Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 29 Feb 2004 12:11:43 +0000 Subject: [PATCH 0261/1463] declare missing COLOR_... constants svn path=/trunk/; revision=8471 --- reactos/w32api/include/winuser.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/reactos/w32api/include/winuser.h b/reactos/w32api/include/winuser.h index 2c094c5db55..879860f47e7 100644 --- a/reactos/w32api/include/winuser.h +++ b/reactos/w32api/include/winuser.h @@ -837,6 +837,9 @@ extern "C" { #define COLOR_WINDOW 5 #define COLOR_WINDOWFRAME 6 #define COLOR_WINDOWTEXT 8 +#define COLOR_HOTLIGHT 26 +#define COLOR_GRADIENTACTIVECAPTION 27 +#define COLOR_GRADIENTINACTIVECAPTION 28 #define CTLCOLOR_MSGBOX 0 #define CTLCOLOR_EDIT 1 #define CTLCOLOR_LISTBOX 2 From a4a8e435ed36369bd81d2bb1715174c81fd6e0a5 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 29 Feb 2004 12:12:18 +0000 Subject: [PATCH 0262/1463] remove FIXMEs using corrected W32API headers svn path=/trunk/; revision=8472 --- reactos/lib/oleaut32/oleaut.c | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/reactos/lib/oleaut32/oleaut.c b/reactos/lib/oleaut32/oleaut.c index 94d6f0747ed..dde48f041a9 100644 --- a/reactos/lib/oleaut32/oleaut.c +++ b/reactos/lib/oleaut32/oleaut.c @@ -48,16 +48,6 @@ static BOOL BSTR_bCache = TRUE; /* Cache allocations to minimise alloc calls? */ HMODULE OLEAUT32_hModule = NULL; -#ifndef COLOR_GRADIENTINACTIVECAPTION -/*FIXME There are missing some constants in MinGW: */ -#if(WINVER >= 0x0500) -#define COLOR_HOTLIGHT 26 -#define COLOR_GRADIENTACTIVECAPTION 27 -#define COLOR_GRADIENTINACTIVECAPTION 28 -#endif /* WINVER >= 0x0500 */ -#endif - - /****************************************************************************** * BSTR {OLEAUT32} * From 72986b727d1d44bddf4658c93cf94d5c1e268d13 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sun, 29 Feb 2004 12:26:09 +0000 Subject: [PATCH 0263/1463] - Rewrote parts of the capability detection code. svn path=/trunk/; revision=8473 --- reactos/drivers/storage/cdrom/cdrom.c | 285 +++++++++++++++++++++++--- 1 file changed, 252 insertions(+), 33 deletions(-) diff --git a/reactos/drivers/storage/cdrom/cdrom.c b/reactos/drivers/storage/cdrom/cdrom.c index 8306f73f71c..12a08e44348 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.26 2003/11/13 14:18:26 ekohl Exp $ +/* $Id: cdrom.c,v 1.27 2004/02/29 12:26:09 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -37,6 +37,7 @@ #include <ddk/scsi.h> #include <ddk/class2.h> #include <ddk/ntddscsi.h> +#include <ntos/minmax.h> #define NDEBUG #include <debug.h> @@ -50,7 +51,6 @@ typedef struct _ERROR_RECOVERY_DATA6 { MODE_PARAMETER_HEADER Header; - MODE_PARAMETER_BLOCK BlockDescriptor; MODE_READ_RECOVERY_PAGE ReadRecoveryPage; } ERROR_RECOVERY_DATA6, *PERROR_RECOVERY_DATA6; @@ -58,10 +58,20 @@ typedef struct _ERROR_RECOVERY_DATA6 typedef struct _ERROR_RECOVERY_DATA10 { MODE_PARAMETER_HEADER10 Header; - MODE_PARAMETER_BLOCK BlockDescriptor; MODE_READ_RECOVERY_PAGE ReadRecoveryPage; } ERROR_RECOVERY_DATA10, *PERROR_RECOVERY_DATA10; +typedef struct _MODE_CAPABILITIES_DATA6 +{ + MODE_PARAMETER_HEADER Header; + MODE_CAPABILITIES_PAGE2 CababilitiesPage; +} MODE_CAPABILITIES_DATA6, *PMODE_CAPABILITIES_DATA6; + +typedef struct _MODE_CAPABILITIES_DATA10 +{ + MODE_PARAMETER_HEADER10 Header; + MODE_CAPABILITIES_PAGE2 CababilitiesPage; +} MODE_CAPABILITIES_DATA10, *PMODE_CAPABILITIES_DATA10; typedef struct _CDROM_DATA { @@ -69,12 +79,6 @@ typedef struct _CDROM_DATA BOOLEAN RawAccess; USHORT XaFlags; - union - { - ERROR_RECOVERY_DATA6 Data6; - ERROR_RECOVERY_DATA10 Data10; - } RecoveryData; - } CDROM_DATA, *PCDROM_DATA; /* CDROM_DATA.XaFlags */ @@ -440,12 +444,10 @@ CdromClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT DiskDeviceObject; PCDROM_DATA CdromData; CHAR NameBuffer[80]; -#if 0 SCSI_REQUEST_BLOCK Srb; PUCHAR Buffer; ULONG Length; PCDB Cdb; -#endif NTSTATUS Status; DPRINT("CdromClassCreateDeviceObject() called\n"); @@ -591,10 +593,7 @@ CdromClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, CdromData->XaFlags |= XA_USE_6_BYTE; /* Read 'error recovery page' to get additional drive capabilities */ -#if 0 - Length = sizeof(MODE_READ_RECOVERY_PAGE) + - MODE_BLOCK_DESC_LENGTH + - MODE_HEADER_LENGTH; + Length = sizeof(MODE_READ_RECOVERY_PAGE) + MODE_HEADER_LENGTH; RtlZeroMemory (&Srb, sizeof(SCSI_REQUEST_BLOCK)); @@ -607,8 +606,10 @@ CdromClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, Cdb->MODE_SENSE.AllocationLength = (UCHAR)Length; Buffer = ExAllocatePool (NonPagedPool, - sizeof(MODE_READ_RECOVERY_PAGE) + - MODE_BLOCK_DESC_LENGTH + MODE_HEADER_LENGTH10); + max(sizeof(ERROR_RECOVERY_DATA6), + max(sizeof(ERROR_RECOVERY_DATA10), + max(sizeof(MODE_CAPABILITIES_DATA6), + sizeof(MODE_CAPABILITIES_DATA10))))); if (Buffer == NULL) { DPRINT1("Allocating recovery page buffer failed!\n"); @@ -620,16 +621,15 @@ CdromClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, Buffer, Length, FALSE); + if (!NT_SUCCESS (Status)) { DPRINT("MODE_SENSE(6) failed\n"); /* Try the 10 byte version */ - Length = sizeof(MODE_READ_RECOVERY_PAGE) + - MODE_BLOCK_DESC_LENGTH + - MODE_HEADER_LENGTH10; + Length = sizeof(MODE_READ_RECOVERY_PAGE) + MODE_HEADER_LENGTH10; - RtlZeroMemory (&Srb, + RtlZeroMemory (&Srb, sizeof(SCSI_REQUEST_BLOCK)); Srb.CdbLength = 10; Srb.TimeOutValue = DiskDeviceExtension->TimeOutValue; @@ -638,13 +638,14 @@ CdromClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, Cdb->MODE_SENSE10.OperationCode = SCSIOP_MODE_SENSE10; Cdb->MODE_SENSE10.PageCode = 0x01; Cdb->MODE_SENSE10.AllocationLength[0] = (UCHAR)(Length >> 8); - Cdb->MODE_SENSE10.AllocationLength[1] = (UCHAR)(Length && 0xFF); + Cdb->MODE_SENSE10.AllocationLength[1] = (UCHAR)(Length & 0xFF); Status = ScsiClassSendSrbSynchronous (DiskDeviceObject, &Srb, Buffer, Length, FALSE); + if (Status == STATUS_DATA_OVERRUN) { DPRINT1("Data overrun\n"); @@ -654,12 +655,6 @@ CdromClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, else if (NT_SUCCESS (Status)) { DPRINT("Use 10 byte commands\n"); - RtlCopyMemory (&CdromData->RecoveryData.Data10.Header, - Buffer, - sizeof (ERROR_RECOVERY_DATA10)); - CdromData->RecoveryData.Data10.Header.ModeDataLength[0] = 0; - CdromData->RecoveryData.Data10.Header.ModeDataLength[1] = 0; - CdromData->XaFlags &= XA_USE_6_BYTE; CdromData->XaFlags |= XA_USE_10_BYTE; } @@ -672,13 +667,237 @@ CdromClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, else { DPRINT("Use 6 byte commands\n"); - RtlCopyMemory (&CdromData->RecoveryData.Data6.Header, - Buffer, - sizeof (ERROR_RECOVERY_DATA6)); - CdromData->RecoveryData.Data6.Header.ModeDataLength = 0; } - ExFreePool (Buffer); + + /* Read 'capabilities & mechanical status page' to get additional drive capabilities */ + Length = sizeof(MODE_READ_RECOVERY_PAGE) + MODE_HEADER_LENGTH; + + if (!(CdromData->XaFlags & XA_NOT_SUPPORTED)) + { + RtlZeroMemory (&Srb, sizeof(SCSI_REQUEST_BLOCK)); + Srb.CdbLength = 10; + Srb.TimeOutValue = DiskDeviceExtension->TimeOutValue; + Cdb = (PCDB)Srb.Cdb; + + if (CdromData->XaFlags & XA_USE_10_BYTE) + { + /* Try the 10 byte version */ + Length = sizeof(MODE_CAPABILITIES_PAGE2) + MODE_HEADER_LENGTH10; + + Cdb->MODE_SENSE10.OperationCode = SCSIOP_MODE_SENSE10; + Cdb->MODE_SENSE10.PageCode = 0x2a; + Cdb->MODE_SENSE10.AllocationLength[0] = (UCHAR)(Length >> 8); + Cdb->MODE_SENSE10.AllocationLength[1] = (UCHAR)(Length & 0xFF); + } + else + { + Length = sizeof(MODE_CAPABILITIES_PAGE2) + MODE_HEADER_LENGTH; + + Cdb->MODE_SENSE.OperationCode = SCSIOP_MODE_SENSE; + Cdb->MODE_SENSE.PageCode = 0x2a; + Cdb->MODE_SENSE.AllocationLength = (UCHAR)Length; + } + Status = ScsiClassSendSrbSynchronous (DiskDeviceObject, + &Srb, + Buffer, + Length, + FALSE); + if (NT_SUCCESS (Status)) + { +#if 0 + PMODE_CAPABILITIES_PAGE2 CapabilitiesData; + if (CdromData->XaFlags & XA_USE_10_BYTE) + { + CapabilitiesData = (PMODE_CAPABILITIES_PAGE2)(Buffer + sizeof(MODE_PARAMETER_HEADER10)); + } + else + { + CapabilitiesData = (PMODE_CAPABILITIES_PAGE2)(Buffer + sizeof(MODE_PARAMETER_HEADER)); + } + + DbgPrint("Capabilities for '%s':\n", NameBuffer); + if (CapabilitiesData->Reserved2[0] & 0x20) + { + DbgPrint(" Drive supports reading of DVD-RAM discs\n"); + } + if (CapabilitiesData->Reserved2[0] & 0x10) + { + DbgPrint(" Drive supports reading of DVD-R discs\n"); + } + if (CapabilitiesData->Reserved2[0] & 0x08) + { + DbgPrint(" Drive supports reading of DVD-ROM discs\n"); + } + if (CapabilitiesData->Reserved2[0] & 0x04) + { + DbgPrint(" Drive supports reading CD-R discs with addressing method 2\n"); + } + if (CapabilitiesData->Reserved2[0] & 0x02) + { + DbgPrint(" Drive can read from CD-R/W (CD-E) discs (orange book, part III)\n"); + } + if (CapabilitiesData->Reserved2[0] & 0x01) + { + DbgPrint(" Drive supports read from CD-R discs (orange book, part II)\n"); + } + DPRINT("CapabilitiesData.Reserved2[1] %x\n", CapabilitiesData->Reserved2[1]); + if (CapabilitiesData->Reserved2[1] & 0x01) + { + DbgPrint(" Drive can write to CD-R discs (orange book, part II)\n"); + } + if (CapabilitiesData->Reserved2[1] & 0x02) + { + DbgPrint(" Drive can write to CD-R/W (CD-E) discs (orange book, part III)\n"); + } + if (CapabilitiesData->Reserved2[1] & 0x04) + { + DbgPrint(" Drive can fake writes\n"); + } + if (CapabilitiesData->Reserved2[1] & 0x10) + { + DbgPrint(" Drive can write DVD-R discs\n"); + } + if (CapabilitiesData->Reserved2[1] & 0x20) + { + DbgPrint(" Drive can write DVD-RAM discs\n"); + } + DPRINT("CapabilitiesData.Capabilities[0] %x\n", CapabilitiesData->Capabilities[0]); + if (CapabilitiesData->Capabilities[0] & 0x01) + { + DbgPrint(" Drive supports audio play operations\n"); + } + if (CapabilitiesData->Capabilities[0] & 0x02) + { + DbgPrint(" Drive can deliver a composite audio/video data stream\n"); + } + if (CapabilitiesData->Capabilities[0] & 0x04) + { + DbgPrint(" Drive supports digital output on port 1\n"); + } + if (CapabilitiesData->Capabilities[0] & 0x08) + { + DbgPrint(" Drive supports digital output on port 2\n"); + } + if (CapabilitiesData->Capabilities[0] & 0x10) + { + DbgPrint(" Drive can read mode 2, form 1 (XA) data\n"); + } + if (CapabilitiesData->Capabilities[0] & 0x20) + { + DbgPrint(" Drive can read mode 2, form 2 data\n"); + } + if (CapabilitiesData->Capabilities[0] & 0x40) + { + DbgPrint(" Drive can read multisession discs\n"); + } + DPRINT("CapabilitiesData.Capabilities[1] %x\n", CapabilitiesData->Capabilities[1]); + if (CapabilitiesData->Capabilities[1] & 0x01) + { + DbgPrint(" Drive can read Red Book audio data\n"); + } + if (CapabilitiesData->Capabilities[1] & 0x02) + { + DbgPrint(" Drive can continue a read cdda operation from a loss of streaming\n"); + } + if (CapabilitiesData->Capabilities[1] & 0x04) + { + DbgPrint(" Subchannel reads can return combined R-W information\n"); + } + if (CapabilitiesData->Capabilities[1] & 0x08) + { + DbgPrint(" R-W data will be returned deinterleaved and error corrected\n"); + } + if (CapabilitiesData->Capabilities[1] & 0x10) + { + DbgPrint(" Drive supports C2 error pointers\n"); + } + if (CapabilitiesData->Capabilities[1] & 0x20) + { + DbgPrint(" Drive can return International Standard Recording Code info\n"); + } + if (CapabilitiesData->Capabilities[1] & 0x40) + { + DbgPrint(" Drive can return Media Catalog Number (UPC) info\n"); + } + DPRINT("CapabilitiesData.Capabilities[2] %x\n", CapabilitiesData->Capabilities[2]); + if (CapabilitiesData->Capabilities[2] & 0x01) + { + DbgPrint(" Drive can lock the door\n"); + } + if (CapabilitiesData->Capabilities[2] & 0x02) + { + DbgPrint(" The door is locked\n"); + } + if (CapabilitiesData->Capabilities[2] & 0x04) + { + } + if (CapabilitiesData->Capabilities[2] & 0x08) + { + DbgPrint(" Drive can eject a disc or changer cartridge\n"); + } + if (CapabilitiesData->Capabilities[2] & 0x10) + { + DbgPrint(" Drive supports C2 error pointers\n"); + } + switch (CapabilitiesData->Capabilities[2] >> 5) + { + case 0: + DbgPrint(" Drive use a caddy type loading mechanism\n"); + break; + case 1: + DbgPrint(" Drive use a tray type loading mechanism\n"); + break; + case 2: + DbgPrint(" Drive use a pop-up type loading mechanism\n"); + break; + case 4: + DbgPrint(" Drive is a changer with individually changeable discs\n"); + break; + case 5: + DbgPrint(" Drive is a changer with cartridge mechanism\n"); + break; + } + DPRINT("CapabilitiesData.Capabilities[3] %x\n", CapabilitiesData->Capabilities[3]); + if (CapabilitiesData->Capabilities[3] & 0x01) + { + DbgPrint(" Audio level for each channel can be controlled independently\n"); + } + if (CapabilitiesData->Capabilities[3] & 0x02) + { + DbgPrint(" Audio for each channel can be muted independently\n"); + } + if (CapabilitiesData->Capabilities[3] & 0x04) + { + DbgPrint(" Changer can report exact contents of slots\n"); + } + if (CapabilitiesData->Capabilities[3] & 0x08) + { + DbgPrint(" Drive supports software slot selection\n"); + } + DbgPrint(" Maximum speed is %d kB/s\n", + (CapabilitiesData->MaximumSpeedSupported[0] << 8) + | CapabilitiesData->MaximumSpeedSupported[1]); + DbgPrint(" Current speed is %d kB/s\n", + (CapabilitiesData->CurrentSpeed[0] << 8) + | CapabilitiesData->CurrentSpeed[1]); + DbgPrint(" Number of discrete volume levels is %d\n", + (CapabilitiesData->Reserved3 << 8) + | CapabilitiesData->NumberVolumeLevels); + DbgPrint(" Buffer size is %d kB\n", + (CapabilitiesData->BufferSize[0] << 8) + | CapabilitiesData->BufferSize[1]); #endif + } + else + { + DPRINT("XA not supported\n"); + CdromData->XaFlags |= XA_NOT_SUPPORTED; + } + + } + + + ExFreePool (Buffer); /* Initialize device timer */ IoInitializeTimer(DiskDeviceObject, From b859b0b5db12112e8838931bfc89424290b52178 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sun, 29 Feb 2004 12:27:52 +0000 Subject: [PATCH 0264/1463] - Started implementation of busmaster dma. - Splited the interrupt handlers. - Don't handle 6 byte mode sense requests. svn path=/trunk/; revision=8474 --- reactos/drivers/storage/atapi/atapi.c | 1035 +++++++++++++++++-------- reactos/drivers/storage/atapi/atapi.h | 13 + 2 files changed, 715 insertions(+), 333 deletions(-) diff --git a/reactos/drivers/storage/atapi/atapi.c b/reactos/drivers/storage/atapi/atapi.c index 3b7d4e64f8e..6abf89be1a8 100644 --- a/reactos/drivers/storage/atapi/atapi.c +++ b/reactos/drivers/storage/atapi/atapi.c @@ -1,6 +1,6 @@ /* * ReactOS kernel - * Copyright (C) 2001, 2002 ReactOS Team + * Copyright (C) 2001, 2002, 2003, 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 @@ -16,13 +16,14 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: atapi.c,v 1.45 2003/11/13 14:17:51 ekohl Exp $ +/* $Id: atapi.c,v 1.46 2004/02/29 12:27:52 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS ATAPI miniport driver - * FILE: services/storage/atapi/atapi.c + * FILE: drivers/storage/atapi/atapi.c * PURPOSE: ATAPI miniport driver * PROGRAMMERS: Eric Kohl (ekohl@rz-online.de) + * Hartmut Birr * REVISIONS: * 09-09-2001 Created */ @@ -43,6 +44,7 @@ #define ENABLE_PCI #define ENABLE_NATIVE_PCI #define ENABLE_ISA +//#define ENABLE_DMA // ------------------------------------------------------------------------- @@ -50,6 +52,7 @@ #include <ddk/srb.h> #include <ddk/scsi.h> #include <ddk/ntddscsi.h> +#include <ntos/kefuncs.h> #include "atapi.h" @@ -61,6 +64,14 @@ // ------------------------------------------------------- File Static Data +#ifdef ENABLE_DMA +typedef struct _PRD +{ + ULONG PhysAddress; + ULONG Length; +} PRD, *PPRD; +#endif + // ATAPI_MINIPORT_EXTENSION // // DESCRIPTION: @@ -81,12 +92,19 @@ typedef struct _ATAPI_MINIPORT_EXTENSION ULONG ControlPortBase; ULONG BusMasterRegisterBase; - BOOLEAN ExpectingInterrupt; PSCSI_REQUEST_BLOCK CurrentSrb; - PUCHAR DataBuffer; ULONG DataTransferLength; + + BOOLEAN FASTCALL (*Handler)(IN struct _ATAPI_MINIPORT_EXTENSION* DevExt); +#ifdef ENABLE_DMA + BOOL UseDma; + ULONG PRDCount; + ULONG PRDMaxCount; + PPRD PRDTable; + SCSI_PHYSICAL_ADDRESS PRDTablePhysicalAddress; +#endif } ATAPI_MINIPORT_EXTENSION, *PATAPI_MINIPORT_EXTENSION; /* DeviceFlags */ @@ -96,6 +114,7 @@ typedef struct _ATAPI_MINIPORT_EXTENSION #define DEVICE_DWORD_IO 0x00000008 #define DEVICE_48BIT_ADDRESS 0x00000010 #define DEVICE_MEDIA_STATUS 0x00000020 +#define DEVICE_DMA_CMD 0x00000040 typedef struct _UNIT_EXTENSION @@ -135,21 +154,21 @@ PCI_NATIVE_CONTROLLER const PciNativeController[] = // don't waste space #pragma alloc_text(init, DriverEntry) -#pragma alloc_text(init, IDECreateController) -#pragma alloc_text(init, IDEPolledRead) // make the PASSIVE_LEVEL routines pageable, so that they don't // waste nonpaged memory -#pragma alloc_text(page, IDEShutdown) -#pragma alloc_text(page, IDEDispatchOpenClose) -#pragma alloc_text(page, IDEDispatchRead) -#pragma alloc_text(page, IDEDispatchWrite) - #endif /* ALLOC_PRAGMA */ // ---------------------------------------------------- Forward Declarations +#ifdef ENABLE_DMA +static BOOLEAN +AtapiInitDma(PATAPI_MINIPORT_EXTENSION DevExt, + PSCSI_REQUEST_BLOCK Srb, + BYTE cmd); +#endif + static ULONG STDCALL AtapiFindCompatiblePciController(PVOID DeviceExtension, PVOID HwContext, @@ -185,9 +204,31 @@ static BOOLEAN STDCALL AtapiStartIo(IN PVOID DeviceExtension, IN PSCSI_REQUEST_BLOCK Srb); +static VOID +AtapiExecuteCommand(PATAPI_MINIPORT_EXTENSION DevExt, + BYTE command, + BOOLEAN FASTCALL (*Handler)(PATAPI_MINIPORT_EXTENSION)); + static BOOLEAN STDCALL AtapiInterrupt(IN PVOID DeviceExtension); +static BOOLEAN FASTCALL +AtapiNoDataInterrupt(PATAPI_MINIPORT_EXTENSION DevExt); + +static BOOLEAN FASTCALL +AtapiPacketInterrupt(IN PATAPI_MINIPORT_EXTENSION DevExt); + +static BOOLEAN FASTCALL +AtapiReadInterrupt(IN PATAPI_MINIPORT_EXTENSION DevExt); + +#ifdef ENABLE_DMA +static BOOLEAN FASTCALL +AtapiDmaInterrupt(IN PATAPI_MINIPORT_EXTENSION DevExt); +#endif + +static BOOLEAN FASTCALL +AtapiWriteInterrupt(IN PATAPI_MINIPORT_EXTENSION DevExt); + static BOOLEAN AtapiFindDevices(PATAPI_MINIPORT_EXTENSION DeviceExtension, PPORT_CONFIGURATION_INFORMATION ConfigInfo); @@ -309,9 +350,10 @@ DriverEntry(IN PDRIVER_OBJECT DriverObject, InitData.MapBuffers = TRUE; - /* Search the PCI bus for compatibility mode ide controllers */ #ifdef ENABLE_PCI + InitData.NeedPhysicalAddresses = TRUE; + InitData.HwFindAdapter = AtapiFindCompatiblePciController; InitData.NumberOfAccessRanges = 3; InitData.AdapterInterfaceType = PCIBus; @@ -331,6 +373,7 @@ DriverEntry(IN PDRIVER_OBJECT DriverObject, /* Search the PCI bus for all ide controllers */ #ifdef ENABLE_NATIVE_PCI + InitData.NeedPhysicalAddresses = TRUE; InitData.HwFindAdapter = AtapiFindNativePciController; InitData.NumberOfAccessRanges = 3; @@ -387,7 +430,9 @@ AtapiClaimHwResources(PATAPI_MINIPORT_EXTENSION DevExt, { SCSI_PHYSICAL_ADDRESS IoAddress; PVOID IoBase; - +#ifdef ENABLE_DMA + ULONG Length; +#endif IoAddress = ScsiPortConvertUlongToPhysicalAddress(CommandPortBase); IoBase = ScsiPortGetDeviceBase((PVOID)DevExt, InterfaceType, @@ -399,6 +444,7 @@ AtapiClaimHwResources(PATAPI_MINIPORT_EXTENSION DevExt, { return FALSE; } + DevExt->Handler = NULL; DevExt->CommandPortBase = (ULONG)IoBase; ConfigInfo->AccessRanges[0].RangeStart = IoAddress; ConfigInfo->AccessRanges[0].RangeLength = 8; @@ -439,9 +485,35 @@ AtapiClaimHwResources(PATAPI_MINIPORT_EXTENSION DevExt, ScsiPortFreeDeviceBase((PVOID)DevExt, (PVOID)DevExt->ControlPortBase); return FALSE; } + DevExt->BusMasterRegisterBase = (ULONG)IoBase; ConfigInfo->AccessRanges[2].RangeStart = IoAddress; ConfigInfo->AccessRanges[2].RangeLength = 8; ConfigInfo->AccessRanges[2].RangeInMemory = FALSE; +#ifdef ENABLE_DMA +// ConfigInfo->DmaChannel = SP_UNINITIALIZED_VALUE; +// ConfigInfo->DmaPort = SP_UNINITIALIZED_VALUE; + ConfigInfo->DmaWidth = Width32Bits; + ConfigInfo->DmaSpeed = Compatible; +// ConfigInfo->ScatterGather = TRUE; + ConfigInfo->Master = TRUE; +// ConfigInfo->NumberOfPhysicalBreaks = + + DevExt->PRDMaxCount = PAGE_SIZE / sizeof(PRD); + DevExt->PRDTable = ScsiPortGetUncachedExtension(DevExt, ConfigInfo, sizeof(PRD) * DevExt->PRDMaxCount); + if (DevExt->PRDTable != NULL) + { + DevExt->PRDTablePhysicalAddress = ScsiPortGetPhysicalAddress(DevExt, NULL, DevExt->PRDTable, &Length); + } + if (DevExt->PRDTable == NULL || + DevExt->PRDTablePhysicalAddress.QuadPart == 0LL || + Length < sizeof(PRD) * DevExt->PRDMaxCount) + { + ScsiPortFreeDeviceBase((PVOID)DevExt, (PVOID)DevExt->CommandPortBase); + ScsiPortFreeDeviceBase((PVOID)DevExt, (PVOID)DevExt->ControlPortBase); + ScsiPortFreeDeviceBase((PVOID)DevExt, (PVOID)DevExt->BusMasterRegisterBase); + return FALSE; + } +#endif } ConfigInfo->BusInterruptLevel = InterruptVector; ConfigInfo->BusInterruptVector = InterruptVector; @@ -888,246 +960,44 @@ AtapiStartIo(IN PVOID DeviceExtension, return(TRUE); } - static BOOLEAN STDCALL AtapiInterrupt(IN PVOID DeviceExtension) { PATAPI_MINIPORT_EXTENSION DevExt; - PSCSI_REQUEST_BLOCK Srb; - ULONG CommandPortBase; - ULONG ControlPortBase; - UCHAR DeviceStatus; - BOOLEAN IsLastBlock; - BOOLEAN IsAtapi; - ULONG Retries; - PUCHAR TargetAddress; - ULONG TransferSize; - ULONG JunkSize; - USHORT Junk; - - DPRINT("AtapiInterrupt() called!\n"); - + BYTE Status; DevExt = (PATAPI_MINIPORT_EXTENSION)DeviceExtension; - CommandPortBase = DevExt->CommandPortBase; - ControlPortBase = DevExt->ControlPortBase; - - if (DevExt->ExpectingInterrupt == FALSE) + if (DevExt->Handler == NULL) { - DeviceStatus = IDEReadStatus(CommandPortBase); - DPRINT("AtapiInterrupt(): Unexpected interrupt (port=%x)\n", CommandPortBase); - return(FALSE); + Status = IDEReadAltStatus(DevExt->ControlPortBase); + if ((Status & (IDE_SR_DRDY|IDE_SR_BUSY|IDE_SR_ERR|IDE_SR_DRQ)) != IDE_SR_DRDY) + { + static ULONG Count = 0; + Count++; + DPRINT1("Unexpected Interrupt, CommandPort=%04x, Status=%02x, Count=%ld\n", + DevExt->CommandPortBase, Status, Count); + } + return FALSE; } - - /* check if it was our irq */ - if ((DeviceStatus = IDEReadAltStatus(ControlPortBase)) & IDE_SR_BUSY) - { - ScsiPortStallExecution(1); - if ((DeviceStatus = IDEReadAltStatus(ControlPortBase) & IDE_SR_BUSY)) - { - DPRINT("AtapiInterrupt(): Unexpected interrupt (port=%x)\n", CommandPortBase); - return(FALSE); - } - } - - Srb = DevExt->CurrentSrb; - DPRINT("Srb: %p\n", Srb); - - DPRINT("CommandPortBase: %lx ControlPortBase: %lx\n", CommandPortBase, ControlPortBase); - - IsAtapi = (DevExt->DeviceFlags[Srb->TargetId] & DEVICE_ATAPI); - DPRINT("IsAtapi == %s\n", (IsAtapi) ? "TRUE" : "FALSE"); - - IsLastBlock = FALSE; - - DeviceStatus = IDEReadStatus(CommandPortBase); - DPRINT("DeviceStatus: %x\n", DeviceStatus); - - if ((DeviceStatus & IDE_SR_ERR) && - (Srb->Cdb[0] != SCSIOP_REQUEST_SENSE)) +#ifdef ENABLE_DMA + if (DevExt->UseDma) { - /* Report error condition */ - Srb->SrbStatus = SRB_STATUS_ERROR; - IsLastBlock = TRUE; + Status = IDEReadDMAStatus(DevExt->BusMasterRegisterBase); + if (!(Status & 0x04)) + { + return FALSE; + } } else - { - if (Srb->SrbFlags & SRB_FLAGS_DATA_IN) - { - DPRINT("Read data\n"); - - /* Update controller/device state variables */ - TargetAddress = DevExt->DataBuffer; - - if (IsAtapi) - { - TransferSize = IDEReadCylinderLow(CommandPortBase); - TransferSize += IDEReadCylinderHigh(CommandPortBase) << 8; - } - else - { - TransferSize = DevExt->TransferSize[Srb->TargetId]; - } - - DPRINT("TransferLength: %lu\n", Srb->DataTransferLength); - DPRINT("TransferSize: %lu\n", TransferSize); - - if (DevExt->DataTransferLength <= TransferSize) - { - JunkSize = TransferSize - DevExt->DataTransferLength; - TransferSize = DevExt->DataTransferLength; - -#ifndef NDEBUG - if (JunkSize > 0) - { - DPRINT1("Junk data: %lu bytes\n", JunkSize); - } #endif - - DevExt->DataTransferLength = 0; - IsLastBlock = TRUE; - } - else - { - DevExt->DataTransferLength -= TransferSize; - IsLastBlock = FALSE; - } - DevExt->DataBuffer += TransferSize; - DPRINT("IsLastBlock == %s\n", (IsLastBlock) ? "TRUE" : "FALSE"); - - /* Wait for DRQ assertion */ - for (Retries = 0; Retries < IDE_MAX_DRQ_RETRIES && - !(IDEReadStatus(CommandPortBase) & IDE_SR_DRQ); - Retries++) - { - KeStallExecutionProcessor(10); - } - - /* Copy the block of data */ - if (DevExt->DeviceFlags[Srb->TargetId] & DEVICE_DWORD_IO) - { - IDEReadBlock32(CommandPortBase, - TargetAddress, - TransferSize); - } - else - { - IDEReadBlock(CommandPortBase, - TargetAddress, - TransferSize); - } - - /* check DRQ */ - if (IsLastBlock) - { - /* Read remaining junk from device */ - while (JunkSize > 0) - { - IDEReadBlock(CommandPortBase, - &Junk, - 2); - JunkSize -= 2; - } - - for (Retries = 0; Retries < IDE_MAX_BUSY_RETRIES && - (IDEReadStatus(CommandPortBase) & IDE_SR_BUSY); - Retries++) - { - KeStallExecutionProcessor(10); - } - - /* Check for data overrun */ - while (IDEReadStatus(CommandPortBase) & IDE_SR_DRQ) - { - DPRINT1("AtapiInterrupt(): reading overrun data!\n"); - IDEReadWord(CommandPortBase); - } - } - - Srb->SrbStatus = SRB_STATUS_SUCCESS; - } - else if (Srb->SrbFlags & SRB_FLAGS_DATA_OUT) - { - DPRINT("Write data\n"); - - if (DevExt->DataTransferLength == 0) - { - /* Check for data overrun */ - if (DeviceStatus & IDE_SR_DRQ) - { - /* FIXME: Handle error! */ - /* This can occure if the irq is shared with an other and if the - ide controller has a write buffer. We have write the last sectors - and the other device has a irq before ours. The isr is called but - we haven't a interrupt. The controller writes the sector buffer - and the status register shows DRQ because the write is not ended. */ - DPRINT("AtapiInterrupt(): data overrun error!\n"); - } - IsLastBlock = TRUE; - } - else - { - /* Update DevExt data */ - TransferSize = DevExt->TransferSize[Srb->TargetId]; - if (DevExt->DataTransferLength < TransferSize) - { - TransferSize = DevExt->DataTransferLength; - } - - TargetAddress = DevExt->DataBuffer; - DevExt->DataBuffer += TransferSize; - DevExt->DataTransferLength -= TransferSize; - - /* Write the sector */ - if (DevExt->DeviceFlags[Srb->TargetId] & DEVICE_DWORD_IO) - { - IDEWriteBlock32(CommandPortBase, - TargetAddress, - TransferSize); - } - else - { - IDEWriteBlock(CommandPortBase, - TargetAddress, - TransferSize); - } - } - - Srb->SrbStatus = SRB_STATUS_SUCCESS; - } - else - { - DPRINT("Unspecified transfer direction!\n"); - Srb->SrbStatus = SRB_STATUS_SUCCESS; - IsLastBlock = TRUE; - } - } - - - if (Srb->SrbStatus == SRB_STATUS_ERROR) { - Srb->SrbStatus = AtapiErrorToScsi(DeviceExtension, - Srb); + Status = IDEReadAltStatus(DevExt->ControlPortBase); + if (Status & IDE_SR_BUSY) + { + return FALSE; + } } - - - /* complete this packet */ - if (IsLastBlock) - { - DevExt->ExpectingInterrupt = FALSE; - - ScsiPortNotification(RequestComplete, - DeviceExtension, - Srb); - - ScsiPortNotification(NextRequest, - DeviceExtension, - NULL); - } - - DPRINT("AtapiInterrupt() done!\n"); - - return(TRUE); + return DevExt->Handler(DevExt); } // ---------------------------------------------------- Discardable statics @@ -1203,7 +1073,7 @@ AtapiFindDevices(PATAPI_MINIPORT_EXTENSION DeviceExtension, continue; } - IDEWriteCommand(CommandPortBase, IDE_CMD_RESET); + AtapiExecuteCommand(DeviceExtension, IDE_CMD_RESET, NULL); for (Retries = 0; Retries < 20000; Retries++) { @@ -1267,12 +1137,23 @@ AtapiFindDevices(PATAPI_MINIPORT_EXTENSION DeviceExtension, DeviceExtension->TransferSize[UnitNumber] *= (DeviceExtension->DeviceParams[UnitNumber].RWMultCurrent & 0xff); DeviceExtension->DeviceFlags[UnitNumber] |= DEVICE_MULTI_SECTOR_CMD; } - + if (DeviceExtension->DeviceParams[UnitNumber].SupportedFeatures83 & 0x0400 && + DeviceExtension->DeviceParams[UnitNumber].EnabledFeatures86 & 0x0400) + { + DeviceExtension->DeviceFlags[UnitNumber] |= DEVICE_48BIT_ADDRESS; + } if (DeviceExtension->DeviceParams[UnitNumber].DWordIo) { DeviceExtension->DeviceFlags[UnitNumber] |= DEVICE_DWORD_IO; } - +#ifdef ENABLE_DMA + if ((DeviceExtension->DeviceParams[UnitNumber].TMFieldsValid & 0x0004) && + ((DeviceExtension->DeviceParams[UnitNumber].MultiDmaModes & 0x0700) || + (DeviceExtension->DeviceParams[UnitNumber].UltraDmaModes & 0xFF00))) + { + DeviceExtension->DeviceFlags[UnitNumber] |= DEVICE_DMA_CMD; + } +#endif DeviceFound = TRUE; } else @@ -1331,6 +1212,7 @@ AtapiIdentifyDevice(IN ULONG CommandPort, OUT PIDE_DRIVE_IDENTIFY DrvParms) { LONG i; + ULONG mode; /* Get the Drive Identify block from drive or die */ if (AtapiPolledRead(CommandPort, @@ -1344,7 +1226,7 @@ AtapiIdentifyDevice(IN ULONG CommandPort, (Atapi ? IDE_CMD_IDENT_ATAPI_DRV : IDE_CMD_IDENT_ATA_DRV), (PUCHAR)DrvParms) == FALSE) { - DPRINT("IDEPolledRead() failed\n"); + DPRINT("AtapiPolledRead() failed\n"); return FALSE; } @@ -1385,6 +1267,27 @@ AtapiIdentifyDevice(IN ULONG CommandPort, DrvParms->TMSectorCountHi, DrvParms->TMSectorCountLo, (ULONG)((DrvParms->TMSectorCountHi << 16) + DrvParms->TMSectorCountLo)); + if (DrvParms->TMFieldsValid & 0x0004) + { + if ((DrvParms->UltraDmaModes >> 8) && (DrvParms->UltraDmaModes & 0xff)) + { + mode = 7; + while (!(DrvParms->UltraDmaModes & (0x0100 << mode))) + { + mode--; + } + DPRINT("Ultra DMA mode %d is selected\n", mode); + } + else if ((DrvParms->MultiDmaModes >> 8) & (DrvParms->MultiDmaModes & 0x07)) + { + mode = 2; + while(!(DrvParms->MultiDmaModes & (0x01 << mode))) + { + mode--; + } + DPRINT("Multi DMA mode %d is selected\n", mode); + } + } if (! Atapi && 0 != (DrvParms->Capabilities & IDE_DRID_LBA_SUPPORTED)) { @@ -1669,6 +1572,12 @@ AtapiSendAtapiCommand(IN PATAPI_MINIPORT_EXTENSION DeviceExtension, return(SRB_STATUS_NO_DEVICE); } + if (Srb->Cdb[0] == SCSIOP_MODE_SENSE) + { + Srb->SrbStatus = SRB_STATUS_INVALID_REQUEST; + return (SRB_STATUS_INVALID_REQUEST); + } + DPRINT("AtapiSendAtapiCommand(): TargetId: %lu\n", Srb->TargetId); @@ -1681,6 +1590,8 @@ AtapiSendAtapiCommand(IN PATAPI_MINIPORT_EXTENSION DeviceExtension, DeviceExtension->DataTransferLength = Srb->DataTransferLength; DeviceExtension->CurrentSrb = Srb; + DPRINT("BufferAddress %x, BufferLength %d\n", Srb->DataBuffer, Srb->DataTransferLength); + /* Wait for BUSY to clear */ for (Retries = 0; Retries < IDE_MAX_BUSY_RETRIES; Retries++) { @@ -1744,7 +1655,7 @@ AtapiSendAtapiCommand(IN PATAPI_MINIPORT_EXTENSION DeviceExtension, IDEWriteCylinderLow(DeviceExtension->CommandPortBase, ByteCountLow); /* Issue command to drive */ - IDEWriteCommand(DeviceExtension->CommandPortBase, IDE_CMD_PACKET); + AtapiExecuteCommand(DeviceExtension, IDE_CMD_PACKET, AtapiPacketInterrupt); /* Wait for DRQ to assert */ for (Retries = 0; Retries < IDE_MAX_BUSY_RETRIES; Retries++) @@ -1762,7 +1673,6 @@ AtapiSendAtapiCommand(IN PATAPI_MINIPORT_EXTENSION DeviceExtension, { case SCSIOP_FORMAT_UNIT: case SCSIOP_MODE_SELECT: - case SCSIOP_MODE_SENSE: AtapiScsiSrbToAtapi (Srb); break; } @@ -1775,8 +1685,6 @@ AtapiSendAtapiCommand(IN PATAPI_MINIPORT_EXTENSION DeviceExtension, (PUSHORT)Srb->Cdb, CdbSize); - DeviceExtension->ExpectingInterrupt = TRUE; - DPRINT("AtapiSendAtapiCommand() done\n"); return(SRB_STATUS_PENDING); @@ -1993,6 +1901,7 @@ AtapiReadWrite(PATAPI_MINIPORT_EXTENSION DeviceExtension, UCHAR Command; ULONG Retries; UCHAR Status; + BOOLEAN FASTCALL (*Handler)(PATAPI_MINIPORT_EXTENSION DevExt); DPRINT("AtapiReadWrite() called!\n"); DPRINT("SCSIOP_WRITE: TargetId: %lu\n", @@ -2034,16 +1943,6 @@ AtapiReadWrite(PATAPI_MINIPORT_EXTENSION DeviceExtension, CylinderHigh = StartingSector >> 8; } - - if (Srb->SrbFlags & SRB_FLAGS_DATA_IN) - { - Command = (DeviceExtension->DeviceFlags[Srb->TargetId] & DEVICE_MULTI_SECTOR_CMD) ? IDE_CMD_READ_MULTIPLE : IDE_CMD_READ; - } - else - { - Command = (DeviceExtension->DeviceFlags[Srb->TargetId] & DEVICE_MULTI_SECTOR_CMD) ? IDE_CMD_WRITE_MULTIPLE : IDE_CMD_WRITE; - } - if (DrvHead & IDE_DH_LBA) { DPRINT("%s:BUS=%04x:DRV=%d:LBA=1:BLK=%08d:SC=%02x:CM=%02x\n", @@ -2125,57 +2024,90 @@ AtapiReadWrite(PATAPI_MINIPORT_EXTENSION DeviceExtension, IDEWriteCylinderLow(DeviceExtension->CommandPortBase, CylinderLow); IDEWriteDriveHead(DeviceExtension->CommandPortBase, IDE_DH_FIXED | DrvHead); - /* Indicate expecting an interrupt. */ - DeviceExtension->ExpectingInterrupt = TRUE; - - /* Issue command to drive */ - IDEWriteCommand(DeviceExtension->CommandPortBase, Command); - - /* Write data block */ - if (Srb->SrbFlags & SRB_FLAGS_DATA_OUT) +#ifdef ENABLE_DMA + if (DeviceExtension->PRDTable && + DeviceExtension->DeviceFlags[Srb->TargetId] & DEVICE_DMA_CMD) { - PUCHAR TargetAddress; - ULONG TransferSize; - - /* Wait for controller ready */ - for (Retries = 0; Retries < IDE_MAX_WRITE_RETRIES; Retries++) - { - BYTE Status = IDEReadStatus(DeviceExtension->CommandPortBase); - if (!(Status & IDE_SR_BUSY) || (Status & IDE_SR_ERR)) - { - break; - } - KeStallExecutionProcessor(10); - } - if (Retries >= IDE_MAX_WRITE_RETRIES) - { - DPRINT1("Drive is BUSY for too long after sending write command\n"); - return(SRB_STATUS_BUSY); - } - - /* Update DeviceExtension data */ - TransferSize = DeviceExtension->TransferSize[Srb->TargetId]; - if (DeviceExtension->DataTransferLength < TransferSize) - { - TransferSize = DeviceExtension->DataTransferLength; - } - - TargetAddress = DeviceExtension->DataBuffer; - DeviceExtension->DataBuffer += TransferSize; - DeviceExtension->DataTransferLength -= TransferSize; - - /* Write data block */ - if (DeviceExtension->DeviceFlags[Srb->TargetId] & DEVICE_DWORD_IO) - { - IDEWriteBlock32(DeviceExtension->CommandPortBase, - TargetAddress, - TransferSize); + DeviceExtension->UseDma = AtapiInitDma(DeviceExtension, Srb, Srb->SrbFlags & SRB_FLAGS_DATA_IN ? 1 << 3 : 0); + } + if (DeviceExtension->UseDma) + { + Handler = AtapiDmaInterrupt; + Command = Srb->SrbFlags & SRB_FLAGS_DATA_IN ? IDE_CMD_READ_DMA : IDE_CMD_WRITE_DMA; + } + else +#endif + { + Handler = Srb->SrbFlags & SRB_FLAGS_DATA_IN ? AtapiReadInterrupt : AtapiWriteInterrupt; + if (DeviceExtension->DeviceFlags[Srb->TargetId] & DEVICE_MULTI_SECTOR_CMD) + { + Command = Srb->SrbFlags & SRB_FLAGS_DATA_IN ? IDE_CMD_READ_MULTIPLE : IDE_CMD_WRITE_MULTIPLE; } else - { - IDEWriteBlock(DeviceExtension->CommandPortBase, - TargetAddress, - TransferSize); + { + Command = Srb->SrbFlags & SRB_FLAGS_DATA_IN ? IDE_CMD_READ : IDE_CMD_WRITE; + } + } + + AtapiExecuteCommand(DeviceExtension, Command, Handler); + +#ifdef ENABLE_DMA + if (DeviceExtension->UseDma) + { + BYTE DmaCommand; + /* start DMA */ + DmaCommand = IDEReadDMACommand(DeviceExtension->BusMasterRegisterBase); + IDEWriteDMACommand(DeviceExtension->BusMasterRegisterBase, DmaCommand|0x01); + } + else +#endif + { + if (Srb->SrbFlags & SRB_FLAGS_DATA_OUT) + { + /* Write data block */ + PUCHAR TargetAddress; + ULONG TransferSize; + + /* Wait for controller ready */ + for (Retries = 0; Retries < IDE_MAX_WRITE_RETRIES; Retries++) + { + BYTE Status = IDEReadStatus(DeviceExtension->CommandPortBase); + if (!(Status & IDE_SR_BUSY) || (Status & IDE_SR_ERR)) + { + break; + } + ScsiPortStallExecution(10); + } + if (Retries >= IDE_MAX_WRITE_RETRIES) + { + DPRINT1("Drive is BUSY for too long after sending write command\n"); + return(SRB_STATUS_BUSY); + } + + /* Update DeviceExtension data */ + TransferSize = DeviceExtension->TransferSize[Srb->TargetId]; + if (DeviceExtension->DataTransferLength < TransferSize) + { + TransferSize = DeviceExtension->DataTransferLength; + } + + TargetAddress = DeviceExtension->DataBuffer; + DeviceExtension->DataBuffer += TransferSize; + DeviceExtension->DataTransferLength -= TransferSize; + + /* Write data block */ + if (DeviceExtension->DeviceFlags[Srb->TargetId] & DEVICE_DWORD_IO) + { + IDEWriteBlock32(DeviceExtension->CommandPortBase, + TargetAddress, + TransferSize); + } + else + { + IDEWriteBlock(DeviceExtension->CommandPortBase, + TargetAddress, + TransferSize); + } } } @@ -2221,7 +2153,7 @@ AtapiFlushCache(PATAPI_MINIPORT_EXTENSION DeviceExtension, ScsiPortStallExecution(10); /* Issue command to drive */ - IDEWriteCommand(DeviceExtension->CommandPortBase, IDE_CMD_FLUSH_CACHE); + AtapiExecuteCommand(DeviceExtension, IDE_CMD_FLUSH_CACHE, AtapiNoDataInterrupt); /* Wait for controller ready */ for (Retries = 0; Retries < IDE_MAX_WRITE_RETRIES; Retries++) @@ -2231,17 +2163,15 @@ AtapiFlushCache(PATAPI_MINIPORT_EXTENSION DeviceExtension, { break; } - KeStallExecutionProcessor(10); + ScsiPortStallExecution(10); } if (Retries >= IDE_MAX_WRITE_RETRIES) { DPRINT1("Drive is BUSY for too long after sending write command\n"); + DeviceExtension->Handler = NULL; return(SRB_STATUS_BUSY); } - /* Indicate expecting an interrupt. */ - DeviceExtension->ExpectingInterrupt = TRUE; - DPRINT("AtapiFlushCache() done!\n"); /* Wait for interrupt. */ @@ -2293,7 +2223,7 @@ AtapiTestUnitReady(PATAPI_MINIPORT_EXTENSION DeviceExtension, ScsiPortStallExecution(10); /* Issue command to drive */ - IDEWriteCommand(DeviceExtension->CommandPortBase, IDE_CMD_GET_MEDIA_STATUS); + AtapiExecuteCommand(DeviceExtension, IDE_CMD_GET_MEDIA_STATUS, AtapiNoDataInterrupt); /* Wait for controller ready */ for (Retries = 0; Retries < IDE_MAX_WRITE_RETRIES; Retries++) @@ -2303,11 +2233,12 @@ AtapiTestUnitReady(PATAPI_MINIPORT_EXTENSION DeviceExtension, { break; } - KeStallExecutionProcessor(10); + ScsiPortStallExecution(10); } if (Retries >= IDE_MAX_WRITE_RETRIES) { DPRINT1("Drive is BUSY for too long after sending write command\n"); + DeviceExtension->Handler = NULL; return(SRB_STATUS_BUSY); } @@ -2319,17 +2250,19 @@ AtapiTestUnitReady(PATAPI_MINIPORT_EXTENSION DeviceExtension, CHECKPOINT1; /* Handle write protection 'error' */ Srb->SrbStatus = SRB_STATUS_SUCCESS; + DeviceExtension->Handler = NULL; return(SRB_STATUS_SUCCESS); } else { CHECKPOINT1; /* Indicate expecting an interrupt. */ - DeviceExtension->ExpectingInterrupt = TRUE; return(SRB_STATUS_PENDING); } } + DeviceExtension->Handler = NULL; + DPRINT1("AtapiTestUnitReady() done!\n"); Srb->SrbStatus = SRB_STATUS_SUCCESS; @@ -2493,26 +2426,462 @@ AtapiScsiSrbToAtapi (PSCSI_REQUEST_BLOCK Srb) AtapiModeSelect->ParameterListLengthLsb = Length; } break; - - case SCSIOP_MODE_SENSE: - { - PATAPI_MODE_SENSE12 AtapiModeSense; - UCHAR PageCode; - UCHAR Length; - - AtapiModeSense = (PATAPI_MODE_SENSE12)Srb->Cdb; - PageCode = ((PCDB)Srb->Cdb)->MODE_SENSE.PageCode; - Length = ((PCDB)Srb->Cdb)->MODE_SENSE.AllocationLength; - - RtlZeroMemory (Srb->Cdb, - MAXIMUM_CDB_SIZE); - AtapiModeSense->OperationCode = ATAPI_MODE_SENSE; - AtapiModeSense->PageCode = PageCode; - AtapiModeSense->ParameterListLengthMsb = 0; - AtapiModeSense->ParameterListLengthLsb = Length; - } - break; } } +static VOID FASTCALL +AtapiCompleteRequest(PATAPI_MINIPORT_EXTENSION DevExt, + UCHAR SrbStatus) +{ + PSCSI_REQUEST_BLOCK Srb; + Srb = DevExt->CurrentSrb; + + DPRINT("AtapiCompleteRequest(DevExt %x, SrbStatus %x)\n", DevExt, SrbStatus); + + Srb->SrbStatus = SrbStatus; + if (SrbStatus != SRB_STATUS_SUCCESS) + { + Srb->SrbStatus = AtapiErrorToScsi((PVOID)DevExt, Srb); + } + DevExt->Handler = NULL; + ScsiPortNotification(RequestComplete, (PVOID)DevExt, Srb); + ScsiPortNotification(NextRequest, (PVOID)DevExt, NULL); +} + +static BOOLEAN FASTCALL +AtapiPacketInterrupt(PATAPI_MINIPORT_EXTENSION DevExt) +{ + PSCSI_REQUEST_BLOCK Srb; + BYTE Status; + BYTE IntReason; + ULONG TransferSize; + ULONG JunkSize; + BOOL IsLastBlock; + PBYTE TargetAddress; + ULONG Retries; + BYTE SrbStatus; + BYTE Error; + BYTE SensKey; + + DPRINT("AtapiPacketInterrupt()\n"); + + Srb = DevExt->CurrentSrb; + + Status = IDEReadStatus(DevExt->CommandPortBase); + DPRINT("DriveStatus: %x\n", Status); + + if (Status & (IDE_SR_BUSY|IDE_SR_ERR)) + { + if (Status & IDE_SR_ERR) + { + Error = IDEReadError(DevExt->CommandPortBase); + SensKey = Error >> 4; + DPRINT("DriveError: %x, SenseKey: %x\n", Error, SensKey); + } + + AtapiCompleteRequest(DevExt, SRB_STATUS_ERROR); + DPRINT("AtapiPacketInterrupt() done\n"); + return TRUE; + } + + IntReason = IDEReadSectorCount(DevExt->CommandPortBase); + TransferSize = IDEReadCylinderLow(DevExt->CommandPortBase); + TransferSize += IDEReadCylinderHigh(DevExt->CommandPortBase) << 8; + + if (!(Status & IDE_SR_DRQ)) + { + if (DevExt->DataTransferLength > 0) + { + DPRINT1("AtapiPacketInterrupt: data underrun (%d bytes), command was %02x\n", + DevExt->DataTransferLength, Srb->Cdb[0]); + SrbStatus = SRB_STATUS_ERROR; + } + else + { + SrbStatus = SRB_STATUS_SUCCESS; + } + AtapiCompleteRequest(DevExt, SrbStatus); + DPRINT("AtapiPacketInterrupt() done\n"); + return TRUE; + } + + TargetAddress = DevExt->DataBuffer; + + if (Srb->SrbFlags & SRB_FLAGS_DATA_IN) + { + DPRINT("read data\n"); + if (DevExt->DataTransferLength <= TransferSize) + { + JunkSize = TransferSize - DevExt->DataTransferLength; + TransferSize = DevExt->DataTransferLength; + + DevExt->DataTransferLength = 0; + IsLastBlock = TRUE; + } + else + { + DevExt->DataTransferLength -= TransferSize; + IsLastBlock = FALSE; + } + + DPRINT("TargetAddress %x, TransferSize %d\n", TargetAddress, TransferSize); + + DevExt->DataBuffer += TransferSize; + + IDEReadBlock(DevExt->CommandPortBase, TargetAddress, TransferSize); + + /* check DRQ */ + if (IsLastBlock) + { + /* Read remaining junk from device */ + while (JunkSize > 0) + { + IDEReadWord(DevExt->CommandPortBase); + JunkSize -= 2; + } + + for (Retries = 0; Retries < IDE_MAX_BUSY_RETRIES && (IDEReadStatus(DevExt->CommandPortBase) & IDE_SR_BUSY); Retries++) + { + ScsiPortStallExecution(10); + } + + /* Check for data overrun */ + while (IDEReadStatus(DevExt->CommandPortBase) & IDE_SR_DRQ) + { + DPRINT1("AtapiInterrupt(): reading overrun data!\n"); + IDEReadWord(DevExt->CommandPortBase); + } + } + + SrbStatus = SRB_STATUS_SUCCESS; + } + else if (Srb->SrbFlags & SRB_FLAGS_DATA_OUT) + { + DPRINT("write data\n"); + TransferSize = DevExt->TransferSize[Srb->TargetId]; + if (DevExt->DataTransferLength < TransferSize) + { + TransferSize = DevExt->DataTransferLength; + } + + TargetAddress = DevExt->DataBuffer; + + DPRINT1("TargetAddress %x, TransferSize %x\n", TargetAddress, TransferSize); + + DevExt->DataBuffer += TransferSize; + DevExt->DataTransferLength -= TransferSize; + + /* Write the sector */ + IDEWriteBlock(DevExt->CommandPortBase, TargetAddress, TransferSize); + SrbStatus = SRB_STATUS_SUCCESS; + IsLastBlock = FALSE; + } + else + { + DPRINT("Unspecified transfer direction!\n"); + SrbStatus = SRB_STATUS_SUCCESS; + IsLastBlock = TRUE; + } + if (IsLastBlock) + { + AtapiCompleteRequest(DevExt, SrbStatus); + } + DPRINT("AtapiPacketInterrupt() done\n"); + return TRUE; +} + +static BOOLEAN FASTCALL +AtapiNoDataInterrupt(PATAPI_MINIPORT_EXTENSION DevExt) +{ + BYTE Status; + + DPRINT1("AtapiNoDataInterrupt()\n"); + + Status = IDEReadStatus(DevExt->CommandPortBase); + AtapiCompleteRequest(DevExt, + (Status & (IDE_SR_DRDY|IDE_SR_BUSY|IDE_SR_ERR|IDE_SR_DRQ)) == IDE_SR_DRDY ? SRB_STATUS_SUCCESS : SRB_STATUS_ERROR); + + DPRINT1("AtapiNoDatanterrupt() done!\n"); + return TRUE; +} + +#ifdef ENABLE_DMA +static BOOLEAN FASTCALL +AtapiDmaInterrupt(PATAPI_MINIPORT_EXTENSION DevExt) +{ + BYTE DmaCommand; + BYTE DmaStatus; + BYTE Status; + + DPRINT("AtapiDmaInterrupt()\n"); + + DevExt->UseDma = FALSE; + /* stop DMA */ + DmaCommand = IDEReadDMACommand(DevExt->BusMasterRegisterBase); + IDEWriteDMACommand(DevExt->BusMasterRegisterBase, DmaCommand & 0xfe); + /* get DMA status */ + DmaStatus = IDEReadDMAStatus(DevExt->BusMasterRegisterBase); + /* clear the INTR & ERROR bits */ + IDEWriteDMAStatus(DevExt->BusMasterRegisterBase, DmaStatus | 0x06); + + /* read the drive status */ + Status = IDEReadStatus(DevExt->CommandPortBase); + if ((Status & (IDE_SR_DRDY|IDE_SR_BUSY|IDE_SR_ERR|IDE_SR_WERR|IDE_SR_DRQ)) == IDE_SR_DRDY && + (DmaStatus & 0x07) == 4) + { + AtapiCompleteRequest(DevExt, SRB_STATUS_SUCCESS); + DPRINT("AtapiDmaInterrupt() done\n"); + return TRUE; + } + DPRINT1("Status %x\n", Status); + DPRINT1("%x\n", DmaStatus); + AtapiCompleteRequest(DevExt, SRB_STATUS_ERROR); + DPRINT1("AtapiDmaReadInterrupt() done\n"); + return TRUE; +} +#endif + +static BOOLEAN FASTCALL +AtapiReadInterrupt(PATAPI_MINIPORT_EXTENSION DevExt) +{ + PSCSI_REQUEST_BLOCK Srb; + UCHAR DeviceStatus; + BOOLEAN IsLastBlock; + PUCHAR TargetAddress; + ULONG TransferSize; + + DPRINT("AtapiReadInterrupt() called!\n"); + + Srb = DevExt->CurrentSrb; + + DeviceStatus = IDEReadStatus(DevExt->CommandPortBase); + if ((DeviceStatus & (IDE_SR_DRQ|IDE_SR_BUSY|IDE_SR_ERR)) != IDE_SR_DRQ) + { + if (DeviceStatus & (IDE_SR_ERR|IDE_SR_DRQ)) + { + AtapiCompleteRequest(DevExt, SRB_STATUS_ERROR); + DPRINT("AtapiReadInterrupt() done!\n"); + return TRUE; + } + DPRINT("AtapiReadInterrupt() done!\n"); + return FALSE; + } + + DPRINT("CommandPortBase: %lx ControlPortBase: %lx\n", DevExt->CommandPortBase, DevExt->ControlPortBase); + + /* Update controller/device state variables */ + TargetAddress = DevExt->DataBuffer; + TransferSize = DevExt->TransferSize[Srb->TargetId]; + + DPRINT("TransferLength: %lu\n", Srb->DataTransferLength); + DPRINT("TransferSize: %lu\n", TransferSize); + + if (DevExt->DataTransferLength <= TransferSize) + { + TransferSize = DevExt->DataTransferLength; + DevExt->DataTransferLength = 0; + IsLastBlock = TRUE; + } + else + { + DevExt->DataTransferLength -= TransferSize; + IsLastBlock = FALSE; + } + DevExt->DataBuffer += TransferSize; + DPRINT("IsLastBlock == %s\n", (IsLastBlock) ? "TRUE" : "FALSE"); + + /* Copy the block of data */ + if (DevExt->DeviceFlags[Srb->TargetId] & DEVICE_DWORD_IO) + { + IDEReadBlock32(DevExt->CommandPortBase, TargetAddress, TransferSize); + } + else + { + IDEReadBlock(DevExt->CommandPortBase, TargetAddress, TransferSize); + } + + if (IsLastBlock) + { + AtapiCompleteRequest(DevExt, SRB_STATUS_SUCCESS); + } + + DPRINT("AtapiReadInterrupt() done!\n"); + + return(TRUE); +} + +static BOOLEAN FASTCALL +AtapiWriteInterrupt(IN PATAPI_MINIPORT_EXTENSION DevExt) +{ + PSCSI_REQUEST_BLOCK Srb; + UCHAR DeviceStatus; + BOOLEAN IsLastBlock; + PUCHAR TargetAddress; + ULONG TransferSize; + + DPRINT("AtapiWriteInterrupt() called!\n"); + + DeviceStatus = IDEReadStatus(DevExt->CommandPortBase); + if ((DeviceStatus & (IDE_SR_DRDY|IDE_SR_BUSY|IDE_SR_ERR|IDE_SR_WERR)) != IDE_SR_DRDY) + { + if (DeviceStatus & (IDE_SR_DRDY|IDE_SR_ERR|IDE_SR_WERR)) + { + AtapiCompleteRequest(DevExt, SRB_STATUS_ERROR); + DPRINT("AtapiWriteInterrupt() done!\n"); + return TRUE; + } + DPRINT("AtapiWriteInterrupt() done!\n"); + return FALSE; + } + else + { + Srb = DevExt->CurrentSrb; + TransferSize = DevExt->TransferSize[Srb->TargetId]; + if (DevExt->DataTransferLength < TransferSize) + { + TransferSize = DevExt->DataTransferLength; + } + if (TransferSize > 0 && (DeviceStatus & IDE_SR_DRQ)) + { + IsLastBlock = FALSE; + TargetAddress = DevExt->DataBuffer; + DevExt->DataBuffer += TransferSize; + DevExt->DataTransferLength -= TransferSize; + + DPRINT("TransferLength: %lu\n", Srb->DataTransferLength); + DPRINT("TransferSize: %lu\n", TransferSize); + /* Write the sector */ + if (DevExt->DeviceFlags[Srb->TargetId] & DEVICE_DWORD_IO) + { + IDEWriteBlock32(DevExt->CommandPortBase, TargetAddress, TransferSize); + } + else + { + IDEWriteBlock(DevExt->CommandPortBase, TargetAddress, TransferSize); + } + } + else if (DeviceStatus & IDE_SR_DRQ) + { + DPRINT("AtapiWriteInterrupt(): data overrun error!\n"); + IsLastBlock = TRUE; + } + else if (TransferSize > 0 && !(DeviceStatus & IDE_SR_DRQ)) + { + DPRINT1("%d !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n", TransferSize); + IsLastBlock = TRUE; + } + else + { + IsLastBlock = TRUE; + } + if (IsLastBlock) + { + AtapiCompleteRequest(DevExt, SRB_STATUS_SUCCESS); + } + DPRINT("AtapiWriteInterrupt() done!\n"); + return TRUE; + } +} + +static VOID +AtapiExecuteCommand(PATAPI_MINIPORT_EXTENSION DevExt, + BYTE command, + BOOLEAN FASTCALL (*Handler)(PATAPI_MINIPORT_EXTENSION)) +{ + if (DevExt->Handler != NULL) + { + DPRINT1("DevExt->Handler is already set!!\n"); + } + DevExt->Handler = Handler; + IDEWriteCommand(DevExt->CommandPortBase, command); + ScsiPortStallExecution(1); +} + +#ifdef ENABLE_DMA +static BOOLEAN +AtapiInitDma(PATAPI_MINIPORT_EXTENSION DevExt, + PSCSI_REQUEST_BLOCK Srb, + BYTE cmd) +{ + PVOID StartAddress; + PVOID EndAddress; + PPRD PRDEntry = DevExt->PRDTable; + SCSI_PHYSICAL_ADDRESS PhysicalAddress; + ULONG Length; + ULONG tmpLength; + BYTE Status; + + DPRINT("AtapiInitDma()\n"); + + StartAddress = Srb->DataBuffer; + EndAddress = StartAddress + Srb->DataTransferLength; + DevExt->PRDCount = 0; + + while (StartAddress < EndAddress) + { + PhysicalAddress = ScsiPortGetPhysicalAddress(DevExt, Srb, StartAddress, &Length); + if (PhysicalAddress.QuadPart == 0LL || Length == 0) + { + return FALSE; + } + + while (Length) + { + /* calculate the length up to the next 64k boundary */ + tmpLength = 0x10000 - (PhysicalAddress.u.LowPart & 0xffff); + if (tmpLength > Length) + { + tmpLength = Length; + } + DevExt->PRDCount++; + if (DevExt->PRDCount > DevExt->PRDMaxCount) + { + return FALSE; + } + if (tmpLength == 0x10000) + { + /* Some dirty controllers cannot handle 64k transfers. We split a 64k transfer in two 32k. */ + tmpLength = 0x8000; + DPRINT("PRD Nr. %d VirtualAddress %08x PhysicalAddress %08x, Length %04x\n", + DevExt->PRDCount - 1, StartAddress, PhysicalAddress.u.LowPart, tmpLength); + PRDEntry->PhysAddress = PhysicalAddress.u.LowPart; + PRDEntry->Length = tmpLength; + PRDEntry++; + DevExt->PRDCount++; + if (DevExt->PRDCount > DevExt->PRDMaxCount) + { + return FALSE; + } + PhysicalAddress.u.LowPart += tmpLength; + StartAddress += tmpLength; + Length -= tmpLength; + PRDEntry->PhysAddress = PhysicalAddress.u.LowPart; + } + DPRINT("PRD Nr. %d VirtualAddress %08x PhysicalAddress %08x, Length %04x\n", + DevExt->PRDCount - 1, StartAddress, PhysicalAddress.u.LowPart, tmpLength); + PRDEntry->PhysAddress = PhysicalAddress.u.LowPart; + PRDEntry->Length = tmpLength; + PRDEntry++; + StartAddress += tmpLength; + PhysicalAddress.u.LowPart += tmpLength; + Length -= tmpLength; + } + } + /* set the end marker in the last PRD */ + PRDEntry--; + PRDEntry->Length |= 0x80000000; + /* enable the busmaster transfers for the drive */ + Status = IDEReadDMAStatus(DevExt->BusMasterRegisterBase); + IDEWriteDMAStatus(DevExt->BusMasterRegisterBase, (Status & ~0x06) | (Srb->TargetId ? 0x40 : 0x20)); + /* set the PDR table */ + IDEWritePRDTable(DevExt->BusMasterRegisterBase, DevExt->PRDTablePhysicalAddress.u.LowPart); + /* write the DMA command */ + IDEWriteDMACommand(DevExt->BusMasterRegisterBase, cmd); + /* reset the status and interrupt bit */ + Status = IDEReadDMAStatus(DevExt->BusMasterRegisterBase); + IDEWriteDMAStatus(DevExt->BusMasterRegisterBase, Status | 0x06); + return TRUE; +} +#endif + /* EOF */ diff --git a/reactos/drivers/storage/atapi/atapi.h b/reactos/drivers/storage/atapi/atapi.h index f179d413c52..50ca08ad0eb 100644 --- a/reactos/drivers/storage/atapi/atapi.h +++ b/reactos/drivers/storage/atapi/atapi.h @@ -58,6 +58,7 @@ extern "C" { #define IDE_REG_STATUS 0x0007 #define IDE_SR_BUSY 0x80 #define IDE_SR_DRDY 0x40 +#define IDE_SR_WERR 0x20 #define IDE_SR_DRQ 0x08 #define IDE_SR_ERR 0x01 #define IDE_REG_COMMAND 0x0007 @@ -71,6 +72,8 @@ extern "C" { #define IDE_CMD_PACKET 0xA0 #define IDE_CMD_READ_MULTIPLE 0xC4 #define IDE_CMD_WRITE_MULTIPLE 0xC5 +#define IDE_CMD_READ_DMA 0xC8 +#define IDE_CMD_WRITE_DMA 0xCA #define IDE_CMD_FLUSH_CACHE 0xE7 #define IDE_CMD_FLUSH_CACHE_EXT 0xEA #define IDE_CMD_IDENT_ATA_DRV 0xEC @@ -109,6 +112,16 @@ extern "C" { (ScsiPortReadPortUchar((PUCHAR)((Address) + IDE_REG_STATUS))) #define IDEWriteCommand(Address, Data) \ (ScsiPortWritePortUchar((PUCHAR)((Address) + IDE_REG_COMMAND), (Data))) +#define IDEReadDMACommand(Address) \ + (ScsiPortReadPortUchar((PUCHAR)((Address)))) +#define IDEWriteDMACommand(Address, Data) \ + (ScsiPortWritePortUchar((PUCHAR)((Address)), (Data))) +#define IDEReadDMAStatus(Address) \ + (ScsiPortReadPortUchar((PUCHAR)((Address) + 2))) +#define IDEWriteDMAStatus(Address, Data) \ + (ScsiPortWritePortUchar((PUCHAR)((Address) + 2), (Data))) +#define IDEWritePRDTable(Address, Data) \ + (ScsiPortWritePortUlong((PULONG)((Address) + 4), (Data))) // From 5666895041454ba19dc821136074835ee32c1c4c Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 29 Feb 2004 12:53:39 +0000 Subject: [PATCH 0265/1463] move missing oleaut32 declarations from ros-mingw-fixes.h into W32API headers svn path=/trunk/; revision=8475 --- reactos/include/basetsd.h | 6 +- reactos/lib/oleaut32/ros-mingw-fixes.h | 312 ------------------------- reactos/lib/oleaut32/variant.h | 7 - reactos/w32api/include/oaidl.h | 15 ++ reactos/w32api/include/oleauto.h | 271 +++++++++++++++++++++ 5 files changed, 289 insertions(+), 322 deletions(-) diff --git a/reactos/include/basetsd.h b/reactos/include/basetsd.h index 8e85e9b984e..9a01081ef38 100644 --- a/reactos/include/basetsd.h +++ b/reactos/include/basetsd.h @@ -1,5 +1,5 @@ -#ifndef _BASETSD_H -#define _BASETSD_H +#ifndef _ROS_BASETSD_H +#define _ROS_BASETSD_H #if __GNUC__ >=3 #pragma GCC system_header #endif @@ -138,4 +138,4 @@ typedef unsigned __int64 UINT64, *PUINT64; #endif /* !__USE_W32API */ -#endif /* _BASETSD_H */ +#endif /* _ROS_BASETSD_H */ diff --git a/reactos/lib/oleaut32/ros-mingw-fixes.h b/reactos/lib/oleaut32/ros-mingw-fixes.h index 87fd141ff22..68cfdcd40ed 100644 --- a/reactos/lib/oleaut32/ros-mingw-fixes.h +++ b/reactos/lib/oleaut32/ros-mingw-fixes.h @@ -3,315 +3,3 @@ #undef V_DECIMAL #define V_DECIMAL(X) (X->__VARIANT_NAME_1.decVal) -HRESULT WINAPI VarI1FromR8(DOUBLE,signed char*); -HRESULT WINAPI VarI8FromR8(DOUBLE,LONG64*); -HRESULT WINAPI VarUI4FromR8(DOUBLE,ULONG*); -HRESULT WINAPI VarUI2FromR8(DOUBLE,USHORT*); -HRESULT WINAPI VarI8FromDec(DECIMAL *pdecIn,LONG64*); -HRESULT WINAPI VarUI4FromCy(CY,ULONG*); -HRESULT WINAPI VarUI8FromR8(DOUBLE,ULONG64*); -HRESULT WINAPI VarDecFromI4(LONG,DECIMAL*); -HRESULT WINAPI VarDecFromUI4(ULONG,DECIMAL*); -HRESULT WINAPI VarDecNeg(const DECIMAL*,DECIMAL*); - -/* missing constants in MinGW headers */ -#ifndef VARCMP_LT -#define VARCMP_LT 0 -#define VARCMP_EQ 1 -#define VARCMP_GT 2 -#define VARCMP_NULL 3 -#endif - -#ifndef VAR_LOCALBOOL - -#define VAR_LOCALBOOL 0x10 - -#define LOCALE_USE_NLS 0x10000000 - -#define VARIANT_NOUSEROVERRIDE 0x04 -#define VARIANT_CALENDAR_HIJRI 0x08 -#define VARIANT_CALENDAR_THAI 0x20 -#define VARIANT_CALENDAR_GREGORIAN 0x40 -#define VARIANT_USE_NLS 0x80 - -#define VAR_CALENDAR_HIJRI ((DWORD)0x00000008) -#define VAR_CALENDAR_THAI ((DWORD)0x00000080) -#define VAR_CALENDAR_GREGORIAN ((DWORD)0x00000100) - -#endif - - -/* copied from wine/include/oleauto.h: */ -HRESULT WINAPI VarUI1FromI2(SHORT,BYTE*); -HRESULT WINAPI VarUI1FromI4(LONG,BYTE*); -HRESULT WINAPI VarUI1FromI8(LONG64,BYTE*); -HRESULT WINAPI VarUI1FromR4(FLOAT,BYTE*); -HRESULT WINAPI VarUI1FromR8(DOUBLE,BYTE*); -HRESULT WINAPI VarUI1FromDate(DATE,BYTE*); -HRESULT WINAPI VarUI1FromBool(VARIANT_BOOL,BYTE*); -HRESULT WINAPI VarUI1FromI1(signed char,BYTE*); -HRESULT WINAPI VarUI1FromUI2(USHORT,BYTE*); -HRESULT WINAPI VarUI1FromUI4(ULONG,BYTE*); -HRESULT WINAPI VarUI1FromUI8(ULONG64,BYTE*); -HRESULT WINAPI VarUI1FromStr(OLECHAR*,LCID,ULONG,BYTE*); -HRESULT WINAPI VarUI1FromCy(CY,BYTE*); -HRESULT WINAPI VarUI1FromDec(DECIMAL*,BYTE*); -//HRESULT WINAPI VarUI1FromDisp(IDispatch*,LCID,BYTE*); - -HRESULT WINAPI VarI2FromUI1(BYTE,SHORT*); -HRESULT WINAPI VarI2FromI4(LONG,SHORT*); -HRESULT WINAPI VarI2FromI8(LONG64,SHORT*); -HRESULT WINAPI VarI2FromR4(FLOAT,SHORT*); -HRESULT WINAPI VarI2FromR8(DOUBLE,SHORT*); -HRESULT WINAPI VarI2FromDate(DATE,SHORT*); -HRESULT WINAPI VarI2FromBool(VARIANT_BOOL,SHORT*); -HRESULT WINAPI VarI2FromI1(signed char,SHORT*); -HRESULT WINAPI VarI2FromUI2(USHORT,SHORT*); -HRESULT WINAPI VarI2FromUI4(ULONG,SHORT*); -HRESULT WINAPI VarI2FromUI8(ULONG64,SHORT*); -HRESULT WINAPI VarI2FromStr(OLECHAR*,LCID,ULONG,SHORT*); -HRESULT WINAPI VarI2FromCy(CY,SHORT*); -HRESULT WINAPI VarI2FromDec(DECIMAL*,SHORT*); -//HRESULT WINAPI VarI2FromDisp(IDispatch*,LCID,SHORT*); - -HRESULT WINAPI VarI4FromUI1(BYTE,LONG*); -HRESULT WINAPI VarI4FromI2(SHORT,LONG*); -HRESULT WINAPI VarI4FromI8(LONG64,LONG*); -HRESULT WINAPI VarI4FromR4(FLOAT,LONG*); -HRESULT WINAPI VarI4FromR8(DOUBLE,LONG*); -HRESULT WINAPI VarI4FromDate(DATE,LONG*); -HRESULT WINAPI VarI4FromBool(VARIANT_BOOL,LONG*); -HRESULT WINAPI VarI4FromI1(signed char,LONG*); -HRESULT WINAPI VarI4FromUI2(USHORT,LONG*); -HRESULT WINAPI VarI4FromUI4(ULONG,LONG*); -HRESULT WINAPI VarI4FromUI8(ULONG64,LONG*); -HRESULT WINAPI VarI4FromStr(OLECHAR*,LCID,ULONG,LONG*); -HRESULT WINAPI VarI4FromCy(CY,LONG*); -HRESULT WINAPI VarI4FromDec(DECIMAL*,LONG*); -//HRESULT WINAPI VarI4FromDisp(IDispatch*,LCID,LONG*); - -HRESULT WINAPI VarI8FromUI1(BYTE,LONG64*); -HRESULT WINAPI VarI8FromI2(SHORT,LONG64*); -HRESULT WINAPI VarI8FromI4(LONG,LONG64*); -HRESULT WINAPI VarI8FromR4(FLOAT,LONG64*); -HRESULT WINAPI VarI8FromR8(DOUBLE,LONG64*); -HRESULT WINAPI VarI8FromDate(DATE,LONG64*); -HRESULT WINAPI VarI8FromStr(OLECHAR*,LCID,ULONG,LONG64*); -HRESULT WINAPI VarI8FromBool(VARIANT_BOOL,LONG64*); -HRESULT WINAPI VarI8FromI1(signed char,LONG64*); -HRESULT WINAPI VarI8FromUI2(USHORT,LONG64*); -HRESULT WINAPI VarI8FromUI4(ULONG,LONG64*); -HRESULT WINAPI VarI8FromUI8(ULONG64,LONG64*); -HRESULT WINAPI VarI8FromDec(DECIMAL *pdecIn,LONG64*); -HRESULT WINAPI VarI8FromInt(INT intIn,LONG64*); -HRESULT WINAPI VarI8FromCy(CY,LONG64*); -//HRESULT WINAPI VarI8FromDisp(IDispatch*,LCID,LONG64*); - -HRESULT WINAPI VarR4FromUI1(BYTE,FLOAT*); -HRESULT WINAPI VarR4FromI2(SHORT,FLOAT*); -HRESULT WINAPI VarR4FromI4(LONG,FLOAT*); -HRESULT WINAPI VarR4FromI8(LONG64,FLOAT*); -HRESULT WINAPI VarR4FromR8(DOUBLE,FLOAT*); -HRESULT WINAPI VarR4FromDate(DATE,FLOAT*); -HRESULT WINAPI VarR4FromBool(VARIANT_BOOL,FLOAT*); -HRESULT WINAPI VarR4FromI1(signed char,FLOAT*); -HRESULT WINAPI VarR4FromUI2(USHORT,FLOAT*); -HRESULT WINAPI VarR4FromUI4(ULONG,FLOAT*); -HRESULT WINAPI VarR4FromUI8(ULONG64,FLOAT*); -HRESULT WINAPI VarR4FromStr(OLECHAR*,LCID,ULONG,FLOAT*); -HRESULT WINAPI VarR4FromCy(CY,FLOAT*); -HRESULT WINAPI VarR4FromDec(DECIMAL*,FLOAT*); -//HRESULT WINAPI VarR4FromDisp(IDispatch*,LCID,FLOAT*); - -HRESULT WINAPI VarR8FromUI1(BYTE,double*); -HRESULT WINAPI VarR8FromI2(SHORT,double*); -HRESULT WINAPI VarR8FromI4(LONG,double*); -HRESULT WINAPI VarR8FromI8(LONG64,double*); -HRESULT WINAPI VarR8FromR4(FLOAT,double*); -HRESULT WINAPI VarR8FromDate(DATE,double*); -HRESULT WINAPI VarR8FromBool(VARIANT_BOOL,double*); -HRESULT WINAPI VarR8FromI1(signed char,double*); -HRESULT WINAPI VarR8FromUI2(USHORT,double*); -HRESULT WINAPI VarR8FromUI4(ULONG,double*); -HRESULT WINAPI VarR8FromUI8(ULONG64,double*); -HRESULT WINAPI VarR8FromStr(OLECHAR*,LCID,ULONG,double*); -HRESULT WINAPI VarR8FromCy(CY,double*); -HRESULT WINAPI VarR8FromDec(DECIMAL*,double*); -//HRESULT WINAPI VarR8FromDisp(IDispatch*,LCID,double*); - -HRESULT WINAPI VarDateFromUI1(BYTE,DATE*); -HRESULT WINAPI VarDateFromI2(SHORT,DATE*); -HRESULT WINAPI VarDateFromI4(LONG,DATE*); -HRESULT WINAPI VarDateFromI8(LONG64,DATE*); -HRESULT WINAPI VarDateFromR4(FLOAT,DATE*); -HRESULT WINAPI VarDateFromR8(DOUBLE,DATE*); -HRESULT WINAPI VarDateFromStr(OLECHAR*,LCID,ULONG,DATE*); -HRESULT WINAPI VarDateFromI1(signed char,DATE*); -HRESULT WINAPI VarDateFromUI2(USHORT,DATE*); -HRESULT WINAPI VarDateFromUI4(ULONG,DATE*); -HRESULT WINAPI VarDateFromUI8(ULONG64,DATE*); -HRESULT WINAPI VarDateFromBool(VARIANT_BOOL,DATE*); -HRESULT WINAPI VarDateFromCy(CY,DATE*); -HRESULT WINAPI VarDateFromDec(DECIMAL*,DATE*); -//HRESULT WINAPI VarDateFromDisp(IDispatch*,LCID,DATE*); - -HRESULT WINAPI VarCyFromUI1(BYTE,CY*); -HRESULT WINAPI VarCyFromI2(SHORT sIn,CY*); -HRESULT WINAPI VarCyFromI4(LONG,CY*); -HRESULT WINAPI VarCyFromI8(LONG64,CY*); -HRESULT WINAPI VarCyFromR4(FLOAT,CY*); -HRESULT WINAPI VarCyFromR8(DOUBLE,CY*); -HRESULT WINAPI VarCyFromDate(DATE,CY*); -HRESULT WINAPI VarCyFromStr(OLECHAR*,LCID,ULONG,CY*); -HRESULT WINAPI VarCyFromBool(VARIANT_BOOL,CY*); -HRESULT WINAPI VarCyFromI1(signed char,CY*); -HRESULT WINAPI VarCyFromUI2(USHORT,CY*); -HRESULT WINAPI VarCyFromUI4(ULONG,CY*); -HRESULT WINAPI VarCyFromUI8(ULONG64,CY*); -HRESULT WINAPI VarCyFromDec(DECIMAL*,CY*); -HRESULT WINAPI VarCyFromStr(OLECHAR*,LCID,ULONG,CY*); -//HRESULT WINAPI VarCyFromDisp(IDispatch*,LCID,CY*); - -HRESULT WINAPI VarBstrFromUI1(BYTE,LCID,ULONG,BSTR*); -HRESULT WINAPI VarBstrFromI2(SHORT,LCID,ULONG,BSTR*); -HRESULT WINAPI VarBstrFromI4(LONG,LCID,ULONG,BSTR*); -HRESULT WINAPI VarBstrFromI8(LONG64,LCID,ULONG,BSTR*); -HRESULT WINAPI VarBstrFromR4(FLOAT,LCID,ULONG,BSTR*); -HRESULT WINAPI VarBstrFromR8(DOUBLE,LCID,ULONG,BSTR*); -HRESULT WINAPI VarBstrFromDate(DATE,LCID,ULONG,BSTR*); -HRESULT WINAPI VarBstrFromBool(VARIANT_BOOL,LCID,ULONG,BSTR*); -HRESULT WINAPI VarBstrFromI1(signed char,LCID,ULONG,BSTR*); -HRESULT WINAPI VarBstrFromUI2(USHORT,LCID,ULONG,BSTR*); -HRESULT WINAPI VarBstrFromUI8(ULONG64,LCID,ULONG,BSTR*); -HRESULT WINAPI VarBstrFromUI4(ULONG,LCID,ULONG,BSTR*); -HRESULT WINAPI VarBstrFromCy(CY,LCID,ULONG,BSTR*); -HRESULT WINAPI VarBstrFromDec(DECIMAL*,LCID,ULONG,BSTR*); -//HRESULT WINAPI VarBstrFromDisp(IDispatch*,LCID,ULONG,BSTR*); - -HRESULT WINAPI VarBoolFromUI1(BYTE,VARIANT_BOOL*); -HRESULT WINAPI VarBoolFromI2(SHORT,VARIANT_BOOL*); -HRESULT WINAPI VarBoolFromI4(LONG,VARIANT_BOOL*); -HRESULT WINAPI VarBoolFromI8(LONG64,VARIANT_BOOL*); -HRESULT WINAPI VarBoolFromR4(FLOAT,VARIANT_BOOL*); -HRESULT WINAPI VarBoolFromR8(DOUBLE,VARIANT_BOOL*); -HRESULT WINAPI VarBoolFromDate(DATE,VARIANT_BOOL*); -HRESULT WINAPI VarBoolFromStr(OLECHAR*,LCID,ULONG,VARIANT_BOOL*); -HRESULT WINAPI VarBoolFromI1(signed char,VARIANT_BOOL*); -HRESULT WINAPI VarBoolFromUI2(USHORT,VARIANT_BOOL*); -HRESULT WINAPI VarBoolFromUI4(ULONG,VARIANT_BOOL*); -HRESULT WINAPI VarBoolFromUI8(ULONG64,VARIANT_BOOL*); -HRESULT WINAPI VarBoolFromCy(CY,VARIANT_BOOL*); -HRESULT WINAPI VarBoolFromDec(DECIMAL*,VARIANT_BOOL*); -//HRESULT WINAPI VarBoolFromDisp(IDispatch*,LCID,VARIANT_BOOL*); - -HRESULT WINAPI VarI1FromUI1(BYTE,signed char*); -HRESULT WINAPI VarI1FromI2(SHORT,signed char*); -HRESULT WINAPI VarI1FromI4(LONG,signed char*); -HRESULT WINAPI VarI1FromI8(LONG64,signed char*); -HRESULT WINAPI VarI1FromR4(FLOAT,signed char*); -HRESULT WINAPI VarI1FromR8(DOUBLE,signed char*); -HRESULT WINAPI VarI1FromDate(DATE,signed char*); -HRESULT WINAPI VarI1FromStr(OLECHAR*,LCID,ULONG,signed char*); -HRESULT WINAPI VarI1FromBool(VARIANT_BOOL,signed char*); -HRESULT WINAPI VarI1FromUI2(USHORT,signed char*); -HRESULT WINAPI VarI1FromUI4(ULONG,signed char*); -HRESULT WINAPI VarI1FromUI8(ULONG64,signed char*); -HRESULT WINAPI VarI1FromCy(CY,signed char*); -HRESULT WINAPI VarI1FromDec(DECIMAL*,signed char*); -HRESULT WINAPI VarI1FromDisp(IDispatch*,LCID,signed char*); - -HRESULT WINAPI VarUI2FromUI1(BYTE,USHORT*); -HRESULT WINAPI VarUI2FromI2(SHORT,USHORT*); -HRESULT WINAPI VarUI2FromI4(LONG,USHORT*); -HRESULT WINAPI VarUI2FromI8(LONG64,USHORT*); -HRESULT WINAPI VarUI2FromR4(FLOAT,USHORT*); -HRESULT WINAPI VarUI2FromR8(DOUBLE,USHORT*); -HRESULT WINAPI VarUI2FromDate(DATE,USHORT*); -HRESULT WINAPI VarUI2FromStr(OLECHAR*,LCID,ULONG,USHORT*); -HRESULT WINAPI VarUI2FromBool(VARIANT_BOOL,USHORT*); -HRESULT WINAPI VarUI2FromI1(signed char,USHORT*); -HRESULT WINAPI VarUI2FromUI4(ULONG,USHORT*); -HRESULT WINAPI VarUI2FromUI8(ULONG64,USHORT*); -HRESULT WINAPI VarUI2FromCy(CY,USHORT*); -HRESULT WINAPI VarUI2FromDec(DECIMAL*,USHORT*); -HRESULT WINAPI VarUI2FromDisp(IDispatch*,LCID,USHORT*); - -HRESULT WINAPI VarUI4FromStr(OLECHAR*,LCID,ULONG,ULONG*); -HRESULT WINAPI VarUI4FromUI1(BYTE,ULONG*); -HRESULT WINAPI VarUI4FromI2(SHORT,ULONG*); -HRESULT WINAPI VarUI4FromI4(LONG,ULONG*); -HRESULT WINAPI VarUI4FromI8(LONG64,ULONG*); -HRESULT WINAPI VarUI4FromR4(FLOAT,ULONG*); -HRESULT WINAPI VarUI4FromR8(DOUBLE,ULONG*); -HRESULT WINAPI VarUI4FromDate(DATE,ULONG*); -HRESULT WINAPI VarUI4FromBool(VARIANT_BOOL,ULONG*); -HRESULT WINAPI VarUI4FromI1(signed char,ULONG*); -HRESULT WINAPI VarUI4FromUI2(USHORT,ULONG*); -HRESULT WINAPI VarUI4FromUI8(ULONG64,ULONG*); -HRESULT WINAPI VarUI4FromCy(CY,ULONG*); -HRESULT WINAPI VarUI4FromDec(DECIMAL*,ULONG*); -HRESULT WINAPI VarUI4FromDisp(IDispatch*,LCID,ULONG*); - -HRESULT WINAPI VarUI8FromUI1(BYTE,ULONG64*); -HRESULT WINAPI VarUI8FromI2(SHORT,ULONG64*); -HRESULT WINAPI VarUI8FromI4(LONG,ULONG64*); -HRESULT WINAPI VarUI8FromI8(LONG64,ULONG64*); -HRESULT WINAPI VarUI8FromR4(FLOAT,ULONG64*); -HRESULT WINAPI VarUI8FromR8(DOUBLE,ULONG64*); -HRESULT WINAPI VarUI8FromDate(DATE,ULONG64*); -HRESULT WINAPI VarUI8FromStr(OLECHAR*,LCID,ULONG,ULONG64*); -HRESULT WINAPI VarUI8FromBool(VARIANT_BOOL,ULONG64*); -HRESULT WINAPI VarUI8FromI1(signed char,ULONG64*); -HRESULT WINAPI VarUI8FromUI2(USHORT,ULONG64*); -HRESULT WINAPI VarUI8FromUI4(ULONG,ULONG64*); -HRESULT WINAPI VarUI8FromDec(DECIMAL*,ULONG64*); -HRESULT WINAPI VarUI8FromInt(INT,ULONG64*); -HRESULT WINAPI VarUI8FromCy(CY,ULONG64*); -//HRESULT WINAPI VarUI8FromDisp(IDispatch*,LCID,ULONG64*); - -HRESULT WINAPI VarDecFromUI1(BYTE,DECIMAL*); -HRESULT WINAPI VarDecFromI2(SHORT,DECIMAL*); -HRESULT WINAPI VarDecFromI4(LONG,DECIMAL*); -HRESULT WINAPI VarDecFromI8(LONG64,DECIMAL*); -HRESULT WINAPI VarDecFromR4(FLOAT,DECIMAL*); -HRESULT WINAPI VarDecFromR8(DOUBLE,DECIMAL*); -HRESULT WINAPI VarDecFromDate(DATE,DECIMAL*); -HRESULT WINAPI VarDecFromStr(OLECHAR*,LCID,ULONG,DECIMAL*); -HRESULT WINAPI VarDecFromBool(VARIANT_BOOL,DECIMAL*); -HRESULT WINAPI VarDecFromI1(signed char,DECIMAL*); -HRESULT WINAPI VarDecFromUI2(USHORT,DECIMAL*); -HRESULT WINAPI VarDecFromUI4(ULONG,DECIMAL*); -HRESULT WINAPI VarDecFromUI8(ULONG64,DECIMAL*); -HRESULT WINAPI VarDecFromCy(CY,DECIMAL*); -HRESULT WINAPI VarDecFromDisp(IDispatch*,LCID,DECIMAL*); - -//#define FADF_AUTO (0x1) -//#define FADF_STATIC (0x2) -//#define FADF_EMBEDDED (0x4) -//#define FADF_FIXEDSIZE (0x10) -#define FADF_RECORD (0x20) -#define FADF_HAVEIID (0x40) -#define FADF_HAVEVARTYPE (0x80) -//#define FADF_BSTR (0x100) -//#define FADF_UNKNOWN (0x200) -//#define FADF_DISPATCH (0x400) -//#define FADF_VARIANT (0x800) -//#define FADF_RESERVED (0xf008) -#define FADF_DATADELETED (0x1000) -#define FADF_CREATEVECTOR (0x2000) - -HRESULT WINAPI SafeArrayAllocDescriptorEx(VARTYPE,UINT,SAFEARRAY**); -SAFEARRAY* WINAPI SafeArrayCreateVector(VARTYPE,LONG,UINT); -HRESULT WINAPI SafeArrayGetVartype(SAFEARRAY*,VARTYPE*); -HRESULT WINAPI SafeArraySetRecordInfo(SAFEARRAY*,IRecordInfo*); -HRESULT WINAPI SafeArrayGetRecordInfo(SAFEARRAY*,IRecordInfo**); -HRESULT WINAPI SafeArraySetIID(SAFEARRAY*,REFGUID); -HRESULT WINAPI SafeArrayGetIID(SAFEARRAY*,GUID*); - -#define IDispatch_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDispatch_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDispatch_Release(p) (p)->lpVtbl->Release(p) -#define IDispatch_GetTypeInfoCount(p,a) (p)->lpVtbl->GetTypeInfoCount(p,a) -#define IDispatch_GetTypeInfo(p,a,b,c) (p)->lpVtbl->GetTypeInfo(p,a,b,c) -#define IDispatch_GetIDsOfNames(p,a,b,c,d,e) (p)->lpVtbl->GetIDsOfNames(p,a,b,c,d,e) -#define IDispatch_Invoke(p,a,b,c,d,e,f,g,h) (p)->lpVtbl->Invoke(p,a,b,c,d,e,f,g,h) diff --git a/reactos/lib/oleaut32/variant.h b/reactos/lib/oleaut32/variant.h index 749cb3c479b..377939232ad 100644 --- a/reactos/lib/oleaut32/variant.h +++ b/reactos/lib/oleaut32/variant.h @@ -25,13 +25,6 @@ #include <math.h> -#ifdef __REACTOS__ /* FIXME */ -#define __int64 long long -typedef __int64 LONG64; -typedef unsigned __int64 ULONG64; -#endif - - /* Get just the type from a variant pointer */ #define V_TYPE(v) (V_VT((v)) & VT_TYPEMASK) diff --git a/reactos/w32api/include/oaidl.h b/reactos/w32api/include/oaidl.h index 037022a54ac..0f19f085bb0 100644 --- a/reactos/w32api/include/oaidl.h +++ b/reactos/w32api/include/oaidl.h @@ -31,11 +31,16 @@ extern "C" { #define FADF_STATIC (2) #define FADF_EMBEDDED (4) #define FADF_FIXEDSIZE (16) +#define FADF_RECORD (32) +#define FADF_HAVEIID (64) +#define FADF_HAVEVARTYPE (128) #define FADF_BSTR (256) #define FADF_UNKNOWN (512) #define FADF_DISPATCH (1024) #define FADF_VARIANT (2048) #define FADF_RESERVED (0xf0e8) +#define FADF_DATADELETED (0x1000) +#define FADF_CREATEVECTOR (0x2000) #define PARAMFLAG_NONE (0) #define PARAMFLAG_FIN (1) #define PARAMFLAG_FOUT (2) @@ -470,6 +475,16 @@ DECLARE_INTERFACE_(IDispatch,IUnknown) }; #undef INTERFACE +#ifdef COBJMACROS +#define IDispatch_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDispatch_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDispatch_Release(p) (p)->lpVtbl->Release(p) +#define IDispatch_GetTypeInfoCount(p,a) (p)->lpVtbl->GetTypeInfoCount(p,a) +#define IDispatch_GetTypeInfo(p,a,b,c) (p)->lpVtbl->GetTypeInfo(p,a,b,c) +#define IDispatch_GetIDsOfNames(p,a,b,c,d,e) (p)->lpVtbl->GetIDsOfNames(p,a,b,c,d,e) +#define IDispatch_Invoke(p,a,b,c,d,e,f,g,h) (p)->lpVtbl->Invoke(p,a,b,c,d,e,f,g,h) +#endif + #define INTERFACE IEnumVARIANT DECLARE_INTERFACE_(IEnumVARIANT,IUnknown) { diff --git a/reactos/w32api/include/oleauto.h b/reactos/w32api/include/oleauto.h index 3da356c4663..0b87e3201bc 100644 --- a/reactos/w32api/include/oleauto.h +++ b/reactos/w32api/include/oleauto.h @@ -97,6 +97,25 @@ #define V_UINT_PTRREF(X) V_UI4REF(X) #endif +#define VARCMP_LT 0 +#define VARCMP_EQ 1 +#define VARCMP_GT 2 +#define VARCMP_NULL 3 + +#define VAR_LOCALBOOL 0x10 + +#define LOCALE_USE_NLS 0x10000000 + +#define VARIANT_NOUSEROVERRIDE 0x04 +#define VARIANT_CALENDAR_HIJRI 0x08 +#define VARIANT_CALENDAR_THAI 0x20 +#define VARIANT_CALENDAR_GREGORIAN 0x40 +#define VARIANT_USE_NLS 0x80 + +#define VAR_CALENDAR_HIJRI 0x08 +#define VAR_CALENDAR_THAI 0x80 +#define VAR_CALENDAR_GREGORIAN 0x100 + #include <oaidl.h> typedef enum tagREGKIND { @@ -155,6 +174,12 @@ WINOLEAUTAPI SafeArrayPutElement(SAFEARRAY*,long*,void*); WINOLEAUTAPI SafeArrayCopy(SAFEARRAY*,SAFEARRAY**); WINOLEAUTAPI SafeArrayPtrOfIndex(SAFEARRAY*,long*,void**); WINOLEAUTAPI_(SAFEARRAY*) SafeArrayCreateVector(VARTYPE,LONG,UINT); +WINOLEAUTAPI SafeArrayAllocDescriptorEx(VARTYPE,UINT,SAFEARRAY**); +WINOLEAUTAPI SafeArrayGetVartype(SAFEARRAY*,VARTYPE*); +WINOLEAUTAPI SafeArraySetRecordInfo(SAFEARRAY*,IRecordInfo*); +WINOLEAUTAPI SafeArrayGetRecordInfo(SAFEARRAY*,IRecordInfo**); +WINOLEAUTAPI SafeArraySetIID(SAFEARRAY*,REFGUID); +WINOLEAUTAPI SafeArrayGetIID(SAFEARRAY*,GUID*); WINOLEAUTAPI_(void) VariantInit(VARIANTARG*); WINOLEAUTAPI VariantClear(VARIANTARG*); WINOLEAUTAPI VariantCopy(VARIANTARG*,VARIANTARG*); @@ -272,6 +297,252 @@ WINOLEAUTAPI VarAdd(LPVARIANT, LPVARIANT, LPVARIANT); WINOLEAUTAPI VarSub(LPVARIANT, LPVARIANT, LPVARIANT); WINOLEAUTAPI VarMul(LPVARIANT, LPVARIANT, LPVARIANT); WINOLEAUTAPI VarDiv(LPVARIANT, LPVARIANT, LPVARIANT); + +WINOLEAUTAPI VarUI1FromI2(SHORT,BYTE*); +WINOLEAUTAPI VarUI1FromI4(LONG,BYTE*); +WINOLEAUTAPI VarUI1FromI8(LONG64,BYTE*); +WINOLEAUTAPI VarUI1FromR4(FLOAT,BYTE*); +WINOLEAUTAPI VarUI1FromR8(DOUBLE,BYTE*); +WINOLEAUTAPI VarUI1FromDate(DATE,BYTE*); +WINOLEAUTAPI VarUI1FromBool(VARIANT_BOOL,BYTE*); +WINOLEAUTAPI VarUI1FromI1(signed char,BYTE*); +WINOLEAUTAPI VarUI1FromUI2(USHORT,BYTE*); +WINOLEAUTAPI VarUI1FromUI4(ULONG,BYTE*); +WINOLEAUTAPI VarUI1FromUI8(ULONG64,BYTE*); +WINOLEAUTAPI VarUI1FromStr(OLECHAR*,LCID,ULONG,BYTE*); +WINOLEAUTAPI VarUI1FromCy(CY,BYTE*); +WINOLEAUTAPI VarUI1FromDec(DECIMAL*,BYTE*); +WINOLEAUTAPI VarUI1FromDisp(IDispatch*,LCID,BYTE*); + +WINOLEAUTAPI VarI2FromUI1(BYTE,SHORT*); +WINOLEAUTAPI VarI2FromI4(LONG,SHORT*); +WINOLEAUTAPI VarI2FromI8(LONG64,SHORT*); +WINOLEAUTAPI VarI2FromR4(FLOAT,SHORT*); +WINOLEAUTAPI VarI2FromR8(DOUBLE,SHORT*); +WINOLEAUTAPI VarI2FromDate(DATE,SHORT*); +WINOLEAUTAPI VarI2FromBool(VARIANT_BOOL,SHORT*); +WINOLEAUTAPI VarI2FromI1(signed char,SHORT*); +WINOLEAUTAPI VarI2FromUI2(USHORT,SHORT*); +WINOLEAUTAPI VarI2FromUI4(ULONG,SHORT*); +WINOLEAUTAPI VarI2FromUI8(ULONG64,SHORT*); +WINOLEAUTAPI VarI2FromStr(OLECHAR*,LCID,ULONG,SHORT*); +WINOLEAUTAPI VarI2FromCy(CY,SHORT*); +WINOLEAUTAPI VarI2FromDec(DECIMAL*,SHORT*); +WINOLEAUTAPI VarI2FromDisp(IDispatch*,LCID,SHORT*); + +WINOLEAUTAPI VarI4FromUI1(BYTE,LONG*); +WINOLEAUTAPI VarI4FromI2(SHORT,LONG*); +WINOLEAUTAPI VarI4FromI8(LONG64,LONG*); +WINOLEAUTAPI VarI4FromR4(FLOAT,LONG*); +WINOLEAUTAPI VarI4FromR8(DOUBLE,LONG*); +WINOLEAUTAPI VarI4FromDate(DATE,LONG*); +WINOLEAUTAPI VarI4FromBool(VARIANT_BOOL,LONG*); +WINOLEAUTAPI VarI4FromI1(signed char,LONG*); +WINOLEAUTAPI VarI4FromUI2(USHORT,LONG*); +WINOLEAUTAPI VarI4FromUI4(ULONG,LONG*); +WINOLEAUTAPI VarI4FromUI8(ULONG64,LONG*); +WINOLEAUTAPI VarI4FromStr(OLECHAR*,LCID,ULONG,LONG*); +WINOLEAUTAPI VarI4FromCy(CY,LONG*); +WINOLEAUTAPI VarI4FromDec(DECIMAL*,LONG*); +WINOLEAUTAPI VarI4FromDisp(IDispatch*,LCID,LONG*); + +WINOLEAUTAPI VarI8FromUI1(BYTE,LONG64*); +WINOLEAUTAPI VarI8FromI2(SHORT,LONG64*); +WINOLEAUTAPI VarI8FromI4(LONG,LONG64*); +WINOLEAUTAPI VarI8FromR4(FLOAT,LONG64*); +WINOLEAUTAPI VarI8FromR8(DOUBLE,LONG64*); +WINOLEAUTAPI VarI8FromDate(DATE,LONG64*); +WINOLEAUTAPI VarI8FromStr(OLECHAR*,LCID,ULONG,LONG64*); +WINOLEAUTAPI VarI8FromBool(VARIANT_BOOL,LONG64*); +WINOLEAUTAPI VarI8FromI1(signed char,LONG64*); +WINOLEAUTAPI VarI8FromUI2(USHORT,LONG64*); +WINOLEAUTAPI VarI8FromUI4(ULONG,LONG64*); +WINOLEAUTAPI VarI8FromUI8(ULONG64,LONG64*); +WINOLEAUTAPI VarI8FromDec(DECIMAL *pdecIn,LONG64*); +WINOLEAUTAPI VarI8FromInt(INT intIn,LONG64*); +WINOLEAUTAPI VarI8FromCy(CY,LONG64*); +WINOLEAUTAPI VarI8FromDisp(IDispatch*,LCID,LONG64*); + +WINOLEAUTAPI VarR4FromUI1(BYTE,FLOAT*); +WINOLEAUTAPI VarR4FromI2(SHORT,FLOAT*); +WINOLEAUTAPI VarR4FromI4(LONG,FLOAT*); +WINOLEAUTAPI VarR4FromI8(LONG64,FLOAT*); +WINOLEAUTAPI VarR4FromR8(DOUBLE,FLOAT*); +WINOLEAUTAPI VarR4FromDate(DATE,FLOAT*); +WINOLEAUTAPI VarR4FromBool(VARIANT_BOOL,FLOAT*); +WINOLEAUTAPI VarR4FromI1(signed char,FLOAT*); +WINOLEAUTAPI VarR4FromUI2(USHORT,FLOAT*); +WINOLEAUTAPI VarR4FromUI4(ULONG,FLOAT*); +WINOLEAUTAPI VarR4FromUI8(ULONG64,FLOAT*); +WINOLEAUTAPI VarR4FromStr(OLECHAR*,LCID,ULONG,FLOAT*); +WINOLEAUTAPI VarR4FromCy(CY,FLOAT*); +WINOLEAUTAPI VarR4FromDec(DECIMAL*,FLOAT*); +WINOLEAUTAPI VarR4FromDisp(IDispatch*,LCID,FLOAT*); + +WINOLEAUTAPI VarR8FromUI1(BYTE,double*); +WINOLEAUTAPI VarR8FromI2(SHORT,double*); +WINOLEAUTAPI VarR8FromI4(LONG,double*); +WINOLEAUTAPI VarR8FromI8(LONG64,double*); +WINOLEAUTAPI VarR8FromR4(FLOAT,double*); +WINOLEAUTAPI VarR8FromDate(DATE,double*); +WINOLEAUTAPI VarR8FromBool(VARIANT_BOOL,double*); +WINOLEAUTAPI VarR8FromI1(signed char,double*); +WINOLEAUTAPI VarR8FromUI2(USHORT,double*); +WINOLEAUTAPI VarR8FromUI4(ULONG,double*); +WINOLEAUTAPI VarR8FromUI8(ULONG64,double*); +WINOLEAUTAPI VarR8FromStr(OLECHAR*,LCID,ULONG,double*); +WINOLEAUTAPI VarR8FromCy(CY,double*); +WINOLEAUTAPI VarR8FromDec(DECIMAL*,double*); +WINOLEAUTAPI VarR8FromDisp(IDispatch*,LCID,double*); + +WINOLEAUTAPI VarDateFromUI1(BYTE,DATE*); +WINOLEAUTAPI VarDateFromI2(SHORT,DATE*); +WINOLEAUTAPI VarDateFromI4(LONG,DATE*); +WINOLEAUTAPI VarDateFromI8(LONG64,DATE*); +WINOLEAUTAPI VarDateFromR4(FLOAT,DATE*); +WINOLEAUTAPI VarDateFromR8(DOUBLE,DATE*); +WINOLEAUTAPI VarDateFromStr(OLECHAR*,LCID,ULONG,DATE*); +WINOLEAUTAPI VarDateFromI1(signed char,DATE*); +WINOLEAUTAPI VarDateFromUI2(USHORT,DATE*); +WINOLEAUTAPI VarDateFromUI4(ULONG,DATE*); +WINOLEAUTAPI VarDateFromUI8(ULONG64,DATE*); +WINOLEAUTAPI VarDateFromBool(VARIANT_BOOL,DATE*); +WINOLEAUTAPI VarDateFromCy(CY,DATE*); +WINOLEAUTAPI VarDateFromDec(DECIMAL*,DATE*); +WINOLEAUTAPI VarDateFromDisp(IDispatch*,LCID,DATE*); + +WINOLEAUTAPI VarCyFromUI1(BYTE,CY*); +WINOLEAUTAPI VarCyFromI2(SHORT sIn,CY*); +WINOLEAUTAPI VarCyFromI4(LONG,CY*); +WINOLEAUTAPI VarCyFromI8(LONG64,CY*); +WINOLEAUTAPI VarCyFromR4(FLOAT,CY*); +WINOLEAUTAPI VarCyFromR8(DOUBLE,CY*); +WINOLEAUTAPI VarCyFromDate(DATE,CY*); +WINOLEAUTAPI VarCyFromStr(OLECHAR*,LCID,ULONG,CY*); +WINOLEAUTAPI VarCyFromBool(VARIANT_BOOL,CY*); +WINOLEAUTAPI VarCyFromI1(signed char,CY*); +WINOLEAUTAPI VarCyFromUI2(USHORT,CY*); +WINOLEAUTAPI VarCyFromUI4(ULONG,CY*); +WINOLEAUTAPI VarCyFromUI8(ULONG64,CY*); +WINOLEAUTAPI VarCyFromDec(DECIMAL*,CY*); +WINOLEAUTAPI VarCyFromStr(OLECHAR*,LCID,ULONG,CY*); +WINOLEAUTAPI VarCyFromDisp(IDispatch*,LCID,CY*); + +WINOLEAUTAPI VarBstrFromUI1(BYTE,LCID,ULONG,BSTR*); +WINOLEAUTAPI VarBstrFromI2(SHORT,LCID,ULONG,BSTR*); +WINOLEAUTAPI VarBstrFromI4(LONG,LCID,ULONG,BSTR*); +WINOLEAUTAPI VarBstrFromI8(LONG64,LCID,ULONG,BSTR*); +WINOLEAUTAPI VarBstrFromR4(FLOAT,LCID,ULONG,BSTR*); +WINOLEAUTAPI VarBstrFromR8(DOUBLE,LCID,ULONG,BSTR*); +WINOLEAUTAPI VarBstrFromDate(DATE,LCID,ULONG,BSTR*); +WINOLEAUTAPI VarBstrFromBool(VARIANT_BOOL,LCID,ULONG,BSTR*); +WINOLEAUTAPI VarBstrFromI1(signed char,LCID,ULONG,BSTR*); +WINOLEAUTAPI VarBstrFromUI2(USHORT,LCID,ULONG,BSTR*); +WINOLEAUTAPI VarBstrFromUI8(ULONG64,LCID,ULONG,BSTR*); +WINOLEAUTAPI VarBstrFromUI4(ULONG,LCID,ULONG,BSTR*); +WINOLEAUTAPI VarBstrFromCy(CY,LCID,ULONG,BSTR*); +WINOLEAUTAPI VarBstrFromDec(DECIMAL*,LCID,ULONG,BSTR*); +WINOLEAUTAPI VarBstrFromDisp(IDispatch*,LCID,ULONG,BSTR*); + +WINOLEAUTAPI VarBoolFromUI1(BYTE,VARIANT_BOOL*); +WINOLEAUTAPI VarBoolFromI2(SHORT,VARIANT_BOOL*); +WINOLEAUTAPI VarBoolFromI4(LONG,VARIANT_BOOL*); +WINOLEAUTAPI VarBoolFromI8(LONG64,VARIANT_BOOL*); +WINOLEAUTAPI VarBoolFromR4(FLOAT,VARIANT_BOOL*); +WINOLEAUTAPI VarBoolFromR8(DOUBLE,VARIANT_BOOL*); +WINOLEAUTAPI VarBoolFromDate(DATE,VARIANT_BOOL*); +WINOLEAUTAPI VarBoolFromStr(OLECHAR*,LCID,ULONG,VARIANT_BOOL*); +WINOLEAUTAPI VarBoolFromI1(signed char,VARIANT_BOOL*); +WINOLEAUTAPI VarBoolFromUI2(USHORT,VARIANT_BOOL*); +WINOLEAUTAPI VarBoolFromUI4(ULONG,VARIANT_BOOL*); +WINOLEAUTAPI VarBoolFromUI8(ULONG64,VARIANT_BOOL*); +WINOLEAUTAPI VarBoolFromCy(CY,VARIANT_BOOL*); +WINOLEAUTAPI VarBoolFromDec(DECIMAL*,VARIANT_BOOL*); +WINOLEAUTAPI VarBoolFromDisp(IDispatch*,LCID,VARIANT_BOOL*); + +WINOLEAUTAPI VarI1FromUI1(BYTE,signed char*); +WINOLEAUTAPI VarI1FromI2(SHORT,signed char*); +WINOLEAUTAPI VarI1FromI4(LONG,signed char*); +WINOLEAUTAPI VarI1FromI8(LONG64,signed char*); +WINOLEAUTAPI VarI1FromR4(FLOAT,signed char*); +WINOLEAUTAPI VarI1FromR8(DOUBLE,signed char*); +WINOLEAUTAPI VarI1FromDate(DATE,signed char*); +WINOLEAUTAPI VarI1FromStr(OLECHAR*,LCID,ULONG,signed char*); +WINOLEAUTAPI VarI1FromBool(VARIANT_BOOL,signed char*); +WINOLEAUTAPI VarI1FromUI2(USHORT,signed char*); +WINOLEAUTAPI VarI1FromUI4(ULONG,signed char*); +WINOLEAUTAPI VarI1FromUI8(ULONG64,signed char*); +WINOLEAUTAPI VarI1FromCy(CY,signed char*); +WINOLEAUTAPI VarI1FromDec(DECIMAL*,signed char*); +WINOLEAUTAPI VarI1FromDisp(IDispatch*,LCID,signed char*); + +WINOLEAUTAPI VarUI2FromUI1(BYTE,USHORT*); +WINOLEAUTAPI VarUI2FromI2(SHORT,USHORT*); +WINOLEAUTAPI VarUI2FromI4(LONG,USHORT*); +WINOLEAUTAPI VarUI2FromI8(LONG64,USHORT*); +WINOLEAUTAPI VarUI2FromR4(FLOAT,USHORT*); +WINOLEAUTAPI VarUI2FromR8(DOUBLE,USHORT*); +WINOLEAUTAPI VarUI2FromDate(DATE,USHORT*); +WINOLEAUTAPI VarUI2FromStr(OLECHAR*,LCID,ULONG,USHORT*); +WINOLEAUTAPI VarUI2FromBool(VARIANT_BOOL,USHORT*); +WINOLEAUTAPI VarUI2FromI1(signed char,USHORT*); +WINOLEAUTAPI VarUI2FromUI4(ULONG,USHORT*); +WINOLEAUTAPI VarUI2FromUI8(ULONG64,USHORT*); +WINOLEAUTAPI VarUI2FromCy(CY,USHORT*); +WINOLEAUTAPI VarUI2FromDec(DECIMAL*,USHORT*); +WINOLEAUTAPI VarUI2FromDisp(IDispatch*,LCID,USHORT*); + +WINOLEAUTAPI VarUI4FromStr(OLECHAR*,LCID,ULONG,ULONG*); +WINOLEAUTAPI VarUI4FromUI1(BYTE,ULONG*); +WINOLEAUTAPI VarUI4FromI2(SHORT,ULONG*); +WINOLEAUTAPI VarUI4FromI4(LONG,ULONG*); +WINOLEAUTAPI VarUI4FromI8(LONG64,ULONG*); +WINOLEAUTAPI VarUI4FromR4(FLOAT,ULONG*); +WINOLEAUTAPI VarUI4FromR8(DOUBLE,ULONG*); +WINOLEAUTAPI VarUI4FromDate(DATE,ULONG*); +WINOLEAUTAPI VarUI4FromBool(VARIANT_BOOL,ULONG*); +WINOLEAUTAPI VarUI4FromI1(signed char,ULONG*); +WINOLEAUTAPI VarUI4FromUI2(USHORT,ULONG*); +WINOLEAUTAPI VarUI4FromUI8(ULONG64,ULONG*); +WINOLEAUTAPI VarUI4FromCy(CY,ULONG*); +WINOLEAUTAPI VarUI4FromDec(DECIMAL*,ULONG*); +WINOLEAUTAPI VarUI4FromDisp(IDispatch*,LCID,ULONG*); + +WINOLEAUTAPI VarUI8FromUI1(BYTE,ULONG64*); +WINOLEAUTAPI VarUI8FromI2(SHORT,ULONG64*); +WINOLEAUTAPI VarUI8FromI4(LONG,ULONG64*); +WINOLEAUTAPI VarUI8FromI8(LONG64,ULONG64*); +WINOLEAUTAPI VarUI8FromR4(FLOAT,ULONG64*); +WINOLEAUTAPI VarUI8FromR8(DOUBLE,ULONG64*); +WINOLEAUTAPI VarUI8FromDate(DATE,ULONG64*); +WINOLEAUTAPI VarUI8FromStr(OLECHAR*,LCID,ULONG,ULONG64*); +WINOLEAUTAPI VarUI8FromBool(VARIANT_BOOL,ULONG64*); +WINOLEAUTAPI VarUI8FromI1(signed char,ULONG64*); +WINOLEAUTAPI VarUI8FromUI2(USHORT,ULONG64*); +WINOLEAUTAPI VarUI8FromUI4(ULONG,ULONG64*); +WINOLEAUTAPI VarUI8FromDec(DECIMAL*,ULONG64*); +WINOLEAUTAPI VarUI8FromInt(INT,ULONG64*); +WINOLEAUTAPI VarUI8FromCy(CY,ULONG64*); +WINOLEAUTAPI VarUI8FromDisp(IDispatch*,LCID,ULONG64*); + +WINOLEAUTAPI VarDecFromUI1(BYTE,DECIMAL*); +WINOLEAUTAPI VarDecFromI2(SHORT,DECIMAL*); +WINOLEAUTAPI VarDecFromI4(LONG,DECIMAL*); +WINOLEAUTAPI VarDecFromI8(LONG64,DECIMAL*); +WINOLEAUTAPI VarDecFromR4(FLOAT,DECIMAL*); +WINOLEAUTAPI VarDecFromR8(DOUBLE,DECIMAL*); +WINOLEAUTAPI VarDecFromDate(DATE,DECIMAL*); +WINOLEAUTAPI VarDecFromStr(OLECHAR*,LCID,ULONG,DECIMAL*); +WINOLEAUTAPI VarDecFromBool(VARIANT_BOOL,DECIMAL*); +WINOLEAUTAPI VarDecFromI1(signed char,DECIMAL*); +WINOLEAUTAPI VarDecFromUI2(USHORT,DECIMAL*); +WINOLEAUTAPI VarDecFromUI4(ULONG,DECIMAL*); +WINOLEAUTAPI VarDecFromUI8(ULONG64,DECIMAL*); +WINOLEAUTAPI VarDecFromCy(CY,DECIMAL*); +WINOLEAUTAPI VarDecFromDisp(IDispatch*,LCID,DECIMAL*); + +WINOLEAUTAPI VarDecNeg(const DECIMAL*,DECIMAL*); + #pragma pack(pop) #endif From a836674b958b56a70d997c1d3b43c0fc4bfcf486 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 29 Feb 2004 13:23:45 +0000 Subject: [PATCH 0266/1463] added VARAINT union members llVal and ullVal svn path=/trunk/; revision=8476 --- reactos/lib/oleaut32/ros-mingw-fixes.h | 5 ----- reactos/lib/oleaut32/safearray.c | 5 ----- reactos/lib/oleaut32/variant.c | 6 +++--- reactos/lib/oleaut32/vartype.c | 4 +++- reactos/w32api/include/oaidl.h | 4 ++++ reactos/w32api/include/oleauto.h | 4 ++-- 6 files changed, 12 insertions(+), 16 deletions(-) delete mode 100644 reactos/lib/oleaut32/ros-mingw-fixes.h diff --git a/reactos/lib/oleaut32/ros-mingw-fixes.h b/reactos/lib/oleaut32/ros-mingw-fixes.h deleted file mode 100644 index 68cfdcd40ed..00000000000 --- a/reactos/lib/oleaut32/ros-mingw-fixes.h +++ /dev/null @@ -1,5 +0,0 @@ - -/* problems with decVal member of VARIANT union in MinGW headers */ -#undef V_DECIMAL -#define V_DECIMAL(X) (X->__VARIANT_NAME_1.decVal) - diff --git a/reactos/lib/oleaut32/safearray.c b/reactos/lib/oleaut32/safearray.c index 7d841bb0c84..c0ebe274ff4 100644 --- a/reactos/lib/oleaut32/safearray.c +++ b/reactos/lib/oleaut32/safearray.c @@ -46,11 +46,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(ole); -#ifdef __REACTOS__ /*FIXME*/ -#include "ros-mingw-fixes.h" -#endif - - /************************************************************************ * SafeArray {OLEAUT32} * diff --git a/reactos/lib/oleaut32/variant.c b/reactos/lib/oleaut32/variant.c index ef432d6748b..ab475a0fd1f 100644 --- a/reactos/lib/oleaut32/variant.c +++ b/reactos/lib/oleaut32/variant.c @@ -44,7 +44,9 @@ #ifdef __REACTOS__ /*FIXME*/ -#include "ros-mingw-fixes.h" +/* problems with decVal member of VARIANT union in MinGW headers */ +#undef V_DECIMAL +#define V_DECIMAL(X) (X->__VARIANT_NAME_1.decVal) #endif @@ -541,10 +543,8 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_UI1: return VarDecFromUI1(V_UI1(ps), &V_DECIMAL(pd)); case VT_UI2: return VarDecFromUI2(V_UI2(ps), &V_DECIMAL(pd)); case VT_UI4: return VarDecFromUI4(V_UI4(ps), &V_DECIMAL(pd)); -#ifndef __REACTOS__ /*FIXME: hVal missing in VARIANT union of MinGW header */ case VT_I8: return VarDecFromI8(V_I8(ps), &V_DECIMAL(pd)); case VT_UI8: return VarDecFromUI8(V_UI8(ps), &V_DECIMAL(pd)); -#endif case VT_R4: return VarDecFromR4(V_R4(ps), &V_DECIMAL(pd)); case VT_R8: return VarDecFromR8(V_R8(ps), &V_DECIMAL(pd)); case VT_DATE: return VarDecFromDate(V_DATE(ps), &V_DECIMAL(pd)); diff --git a/reactos/lib/oleaut32/vartype.c b/reactos/lib/oleaut32/vartype.c index 299f5c57351..6d0c9757650 100644 --- a/reactos/lib/oleaut32/vartype.c +++ b/reactos/lib/oleaut32/vartype.c @@ -31,7 +31,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(ole); #ifdef __REACTOS__ /*FIXME*/ -#include "ros-mingw-fixes.h" +/* problems with decVal member of VARIANT union in MinGW headers */ +#undef V_DECIMAL +#define V_DECIMAL(X) (X->__VARIANT_NAME_1.decVal) #endif diff --git a/reactos/w32api/include/oaidl.h b/reactos/w32api/include/oaidl.h index 0f19f085bb0..d35b061df36 100644 --- a/reactos/w32api/include/oaidl.h +++ b/reactos/w32api/include/oaidl.h @@ -197,6 +197,7 @@ typedef struct tagVARIANT { WORD wReserved3; _ANONYMOUS_UNION union { long lVal; + LONGLONG llVal; unsigned char bVal; short iVal; float fltVal; @@ -228,6 +229,7 @@ typedef struct tagVARIANT { CHAR cVal; USHORT uiVal; ULONG ulVal; + ULONGLONG ullVal; INT intVal; UINT uintVal; DECIMAL *pdecVal; @@ -256,6 +258,7 @@ typedef struct _wireVARIANT { USHORT wReserved3; _ANONYMOUS_UNION union { LONG lVal; + LONGLONG llVal; BYTE bVal; SHORT iVal; FLOAT fltVal; @@ -286,6 +289,7 @@ typedef struct _wireVARIANT { CHAR cVal; USHORT uiVal; ULONG ulVal; + ULONGLONG ullVal; INT intVal; UINT uintVal; DECIMAL decVal; diff --git a/reactos/w32api/include/oleauto.h b/reactos/w32api/include/oleauto.h index 0b87e3201bc..93ff6450ba5 100644 --- a/reactos/w32api/include/oleauto.h +++ b/reactos/w32api/include/oleauto.h @@ -48,8 +48,8 @@ #define V_UI4(X) V_UNION(X,ulVal) #define V_I4REF(X) V_UNION(X,plVal) #define V_UI4REF(X) V_UNION(X,pulVal) -#define V_I8(X) V_UNION(X,hVal) -#define V_UI8(X) V_UNION(X,uhVal) +#define V_I8(X) V_UNION(X,llVal) +#define V_UI8(X) V_UNION(X,ullVal) #define V_I8REF(X) V_UNION(X,phVal) #define V_UI8REF(X) V_UNION(X,puhVal) #define V_R4(X) V_UNION(X,fltVal) From 099d7698c34e3f33449439fcdc8d9ffbf845dca2 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 29 Feb 2004 13:30:08 +0000 Subject: [PATCH 0267/1463] remove FIXMEs and re-enable disabled code svn path=/trunk/; revision=8477 --- reactos/lib/oleaut32/variant.c | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/reactos/lib/oleaut32/variant.c b/reactos/lib/oleaut32/variant.c index ab475a0fd1f..8b9d984c5fb 100644 --- a/reactos/lib/oleaut32/variant.c +++ b/reactos/lib/oleaut32/variant.c @@ -162,10 +162,8 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_UI1: return VarI1FromUI1(V_UI1(ps), &V_I1(pd)); case VT_UI2: return VarI1FromUI2(V_UI2(ps), &V_I1(pd)); case VT_UI4: return VarI1FromUI4(V_UI4(ps), &V_I1(pd)); -#ifndef __REACTOS__ /*FIXME: hVal and ullVal missing in VARIANT union of MinGW header of MinGW header */ case VT_I8: return VarI1FromI8(V_I8(ps), &V_I1(pd)); case VT_UI8: return VarI1FromUI8(V_UI8(ps), &V_I1(pd)); -#endif case VT_R4: return VarI1FromR4(V_R4(ps), &V_I1(pd)); case VT_R8: return VarI1FromR8(V_R8(ps), &V_I1(pd)); case VT_DATE: return VarI1FromDate(V_DATE(ps), &V_I1(pd)); @@ -188,10 +186,8 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_UI1: return VarI2FromUI1(V_UI1(ps), &V_I2(pd)); case VT_UI2: return VarI2FromUI2(V_UI2(ps), &V_I2(pd)); case VT_UI4: return VarI2FromUI4(V_UI4(ps), &V_I2(pd)); -#ifndef __REACTOS__ /*FIXME: hVal and ullVal missing in VARIANT union of MinGW header of MinGW header */ case VT_I8: return VarI2FromI8(V_I8(ps), &V_I2(pd)); case VT_UI8: return VarI2FromUI8(V_UI8(ps), &V_I2(pd)); -#endif case VT_R4: return VarI2FromR4(V_R4(ps), &V_I2(pd)); case VT_R8: return VarI2FromR8(V_R8(ps), &V_I2(pd)); case VT_DATE: return VarI2FromDate(V_DATE(ps), &V_I2(pd)); @@ -214,10 +210,8 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_UI1: return VarI4FromUI1(V_UI1(ps), &V_I4(pd)); case VT_UI2: return VarI4FromUI2(V_UI2(ps), &V_I4(pd)); case VT_UI4: return VarI4FromUI4(V_UI4(ps), &V_I4(pd)); -#ifndef __REACTOS__ /*FIXME: hVal and ullVal missing in VARIANT union of MinGW header of MinGW header */ case VT_I8: return VarI4FromI8(V_I8(ps), &V_I4(pd)); case VT_UI8: return VarI4FromUI8(V_UI8(ps), &V_I4(pd)); -#endif case VT_R4: return VarI4FromR4(V_R4(ps), &V_I4(pd)); case VT_R8: return VarI4FromR8(V_R8(ps), &V_I4(pd)); case VT_DATE: return VarI4FromDate(V_DATE(ps), &V_I4(pd)); @@ -240,10 +234,8 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_I4: return VarUI1FromI4(V_I4(ps), &V_UI1(pd)); case VT_UI2: return VarUI1FromUI2(V_UI2(ps), &V_UI1(pd)); case VT_UI4: return VarUI1FromUI4(V_UI4(ps), &V_UI1(pd)); -#ifndef __REACTOS__ /*FIXME: hVal and ullVal missing in VARIANT union of MinGW header of MinGW header */ case VT_I8: return VarUI1FromI8(V_I8(ps), &V_UI1(pd)); case VT_UI8: return VarUI1FromUI8(V_UI8(ps), &V_UI1(pd)); -#endif case VT_R4: return VarUI1FromR4(V_R4(ps), &V_UI1(pd)); case VT_R8: return VarUI1FromR8(V_R8(ps), &V_UI1(pd)); case VT_DATE: return VarUI1FromDate(V_DATE(ps), &V_UI1(pd)); @@ -266,10 +258,8 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_I4: return VarUI2FromI4(V_I4(ps), &V_UI2(pd)); case VT_UI1: return VarUI2FromUI1(V_UI1(ps), &V_UI2(pd)); case VT_UI4: return VarUI2FromUI4(V_UI4(ps), &V_UI2(pd)); -#ifndef __REACTOS__ /*FIXME: hVal and ullVal missing in VARIANT union of MinGW header of MinGW header */ case VT_I8: return VarUI4FromI8(V_I8(ps), &V_UI4(pd)); case VT_UI8: return VarUI4FromUI8(V_UI8(ps), &V_UI4(pd)); -#endif case VT_R4: return VarUI2FromR4(V_R4(ps), &V_UI2(pd)); case VT_R8: return VarUI2FromR8(V_R8(ps), &V_UI2(pd)); case VT_DATE: return VarUI2FromDate(V_DATE(ps), &V_UI2(pd)); @@ -292,10 +282,8 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_I4: return VarUI4FromI4(V_I4(ps), &V_UI4(pd)); case VT_UI1: return VarUI4FromUI1(V_UI1(ps), &V_UI4(pd)); case VT_UI2: return VarUI4FromUI2(V_UI2(ps), &V_UI4(pd)); -#ifndef __REACTOS__ /*FIXME: hVal and ullVal missing in VARIANT union of MinGW header of MinGW header */ case VT_I8: return VarUI4FromI8(V_I8(ps), &V_UI4(pd)); case VT_UI8: return VarUI4FromUI8(V_UI8(ps), &V_UI4(pd)); -#endif case VT_R4: return VarUI4FromR4(V_R4(ps), &V_UI4(pd)); case VT_R8: return VarUI4FromR8(V_R8(ps), &V_UI4(pd)); case VT_DATE: return VarUI4FromDate(V_DATE(ps), &V_UI4(pd)); @@ -309,7 +297,6 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, } break; -#ifndef __REACTOS__ /*FIXME: hVal and ullVal missing in VARIANT union of MinGW header of MinGW header */ case VT_UI8: switch (vtFrom) { @@ -357,7 +344,6 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_BSTR: return VarI8FromStr(V_BSTR(ps), lcid, dwFlags, &V_I8(pd)); } break; -#endif case VT_R4: switch (vtFrom) @@ -369,10 +355,8 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_UI1: return VarR4FromUI1(V_UI1(ps), &V_R4(pd)); case VT_UI2: return VarR4FromUI2(V_UI2(ps), &V_R4(pd)); case VT_UI4: return VarR4FromUI4(V_UI4(ps), &V_R4(pd)); -#ifndef __REACTOS__ /*FIXME: hVal and ullVal missing in VARIANT union of MinGW header of MinGW header */ case VT_I8: return VarR4FromI8(V_I8(ps), &V_R4(pd)); case VT_UI8: return VarR4FromUI8(V_UI8(ps), &V_R4(pd)); -#endif case VT_R8: return VarR4FromR8(V_R8(ps), &V_R4(pd)); case VT_DATE: return VarR4FromDate(V_DATE(ps), &V_R4(pd)); case VT_BOOL: return VarR4FromBool(V_BOOL(ps), &V_R4(pd)); @@ -395,10 +379,8 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_UI1: return VarR8FromUI1(V_UI1(ps), &V_R8(pd)); case VT_UI2: return VarR8FromUI2(V_UI2(ps), &V_R8(pd)); case VT_UI4: return VarR8FromUI4(V_UI4(ps), &V_R8(pd)); -#ifndef __REACTOS__ /*FIXME: hVal and ullVal missing in VARIANT union of MinGW header of MinGW header */ case VT_I8: return VarR8FromI8(V_I8(ps), &V_R8(pd)); case VT_UI8: return VarR8FromUI8(V_UI8(ps), &V_R8(pd)); -#endif case VT_R4: return VarR8FromR4(V_R4(ps), &V_R8(pd)); case VT_DATE: return VarR8FromDate(V_DATE(ps), &V_R8(pd)); case VT_BOOL: return VarR8FromBool(V_BOOL(ps), &V_R8(pd)); @@ -421,10 +403,8 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_UI1: return VarDateFromUI1(V_UI1(ps), &V_DATE(pd)); case VT_UI2: return VarDateFromUI2(V_UI2(ps), &V_DATE(pd)); case VT_UI4: return VarDateFromUI4(V_UI4(ps), &V_DATE(pd)); -#ifndef __REACTOS__ /*FIXME: hVal and ullVal missing in VARIANT union of MinGW header of MinGW header */ case VT_I8: return VarDateFromI8(V_I8(ps), &V_DATE(pd)); case VT_UI8: return VarDateFromUI8(V_UI8(ps), &V_DATE(pd)); -#endif case VT_R4: return VarDateFromR4(V_R4(ps), &V_DATE(pd)); case VT_R8: return VarDateFromR8(V_R8(ps), &V_DATE(pd)); case VT_BOOL: return VarDateFromBool(V_BOOL(ps), &V_DATE(pd)); @@ -449,10 +429,8 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_UI1: return VarBoolFromUI1(V_UI1(ps), &V_BOOL(pd)); case VT_UI2: return VarBoolFromUI2(V_UI2(ps), &V_BOOL(pd)); case VT_UI4: return VarBoolFromUI4(V_UI4(ps), &V_BOOL(pd)); -#ifndef __REACTOS__ /*FIXME: hVal and ullVal missing in VARIANT union of MinGW header of MinGW header */ case VT_I8: return VarBoolFromI8(V_I8(ps), &V_BOOL(pd)); case VT_UI8: return VarBoolFromUI8(V_UI8(ps), &V_BOOL(pd)); -#endif case VT_R4: return VarBoolFromR4(V_R4(ps), &V_BOOL(pd)); case VT_R8: return VarBoolFromR8(V_R8(ps), &V_BOOL(pd)); case VT_DATE: return VarBoolFromDate(V_DATE(ps), &V_BOOL(pd)); @@ -481,10 +459,8 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_UI1: return VarBstrFromUI1(V_UI1(ps), lcid, dwFlags, &V_BSTR(pd)); case VT_UI2: return VarBstrFromUI2(V_UI2(ps), lcid, dwFlags, &V_BSTR(pd)); case VT_UI4: return VarBstrFromUI4(V_UI4(ps), lcid, dwFlags, &V_BSTR(pd)); -#ifndef __REACTOS__ /*FIXME: hVal and ullVal missing in VARIANT union of MinGW header of MinGW header */ case VT_I8: return VarBstrFromI8(V_I8(ps), lcid, dwFlags, &V_BSTR(pd)); case VT_UI8: return VarBstrFromUI8(V_UI8(ps), lcid, dwFlags, &V_BSTR(pd)); -#endif case VT_R4: return VarBstrFromR4(V_R4(ps), lcid, dwFlags, &V_BSTR(pd)); case VT_R8: return VarBstrFromR8(V_R8(ps), lcid, dwFlags, &V_BSTR(pd)); case VT_DATE: return VarBstrFromDate(V_DATE(ps), lcid, dwFlags, &V_BSTR(pd)); @@ -506,10 +482,8 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_UI1: return VarCyFromUI1(V_UI1(ps), &V_CY(pd)); case VT_UI2: return VarCyFromUI2(V_UI2(ps), &V_CY(pd)); case VT_UI4: return VarCyFromUI4(V_UI4(ps), &V_CY(pd)); -#ifndef __REACTOS__ /*FIXME: hVal and ullVal missing in VARIANT union of MinGW header of MinGW header */ case VT_I8: return VarCyFromI8(V_I8(ps), &V_CY(pd)); case VT_UI8: return VarCyFromUI8(V_UI8(ps), &V_CY(pd)); -#endif case VT_R4: return VarCyFromR4(V_R4(ps), &V_CY(pd)); case VT_R8: return VarCyFromR8(V_R8(ps), &V_CY(pd)); case VT_DATE: return VarCyFromDate(V_DATE(ps), &V_CY(pd)); @@ -2111,14 +2085,12 @@ HRESULT WINAPI VarNumFromParseNum(NUMPARSE *pNumprs, BYTE *rgbDig, V_I4(pVarDst) = -ul64; return S_OK; } -#ifndef __REACTOS__ /*FIXME: hVal missing in VARIANT union of MinGW header */ else if (dwVtBits & VTBIT_I8 && ul64 <= (ULONGLONG)I8_MAX + 1) { V_VT(pVarDst) = VT_I8; V_I8(pVarDst) = -ul64; return S_OK; } -#endif else if ((dwVtBits & REAL_VTBITS) == VTBIT_DECIMAL) { /* Decimal is only output choice left - fast path */ @@ -2169,14 +2141,12 @@ HRESULT WINAPI VarNumFromParseNum(NUMPARSE *pNumprs, BYTE *rgbDig, V_UI4(pVarDst) = ul64; return S_OK; } -#ifndef __REACTOS__ /*FIXME: hVal missing in VARIANT union of MinGW header */ else if (dwVtBits & VTBIT_I8 && ul64 <= I8_MAX) { V_VT(pVarDst) = VT_I8; V_I8(pVarDst) = ul64; return S_OK; } -#endif else if (dwVtBits & VTBIT_UI8) { V_VT(pVarDst) = VT_UI8; From 01e0ab2cafe0f452b40a25943a03f53dc0acd14a Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 29 Feb 2004 13:52:18 +0000 Subject: [PATCH 0268/1463] * include/oleauto.h (struct NUMPARSE, NUMPRS_...): add declarations for struct NUMPARSE * include/oleauto.h (VarParseNumFromStr, VarNumFromParseNum): add function declarations svn path=/trunk/; revision=8478 --- reactos/w32api/include/oleauto.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/reactos/w32api/include/oleauto.h b/reactos/w32api/include/oleauto.h index 93ff6450ba5..b505f1a848d 100644 --- a/reactos/w32api/include/oleauto.h +++ b/reactos/w32api/include/oleauto.h @@ -116,6 +116,23 @@ #define VAR_CALENDAR_THAI 0x80 #define VAR_CALENDAR_GREGORIAN 0x100 +#define NUMPRS_LEADING_WHITE 0x00001 +#define NUMPRS_TRAILING_WHITE 0x00002 +#define NUMPRS_LEADING_PLUS 0x00004 +#define NUMPRS_TRAILING_PLUS 0x00008 +#define NUMPRS_LEADING_MINUS 0x00010 +#define NUMPRS_TRAILING_MINUS 0x00020 +#define NUMPRS_HEX_OCT 0x00040 +#define NUMPRS_PARENS 0x00080 +#define NUMPRS_DECIMAL 0x00100 +#define NUMPRS_THOUSANDS 0x00200 +#define NUMPRS_CURRENCY 0x00400 +#define NUMPRS_EXPONENT 0x00800 +#define NUMPRS_USE_ALL 0x01000 +#define NUMPRS_STD 0x01FFF +#define NUMPRS_NEG 0x10000 +#define NUMPRS_INEXACT 0x20000 + #include <oaidl.h> typedef enum tagREGKIND { @@ -142,6 +159,15 @@ typedef struct tagINTERFACEDATA { UINT cMembers; } INTERFACEDATA,*LPINTERFACEDATA; +typedef struct { + int cDig; + unsigned long dwInFlags; + unsigned long dwOutFlags; + int cchUsed; + int nBaseShift; + int nPwr10; +} NUMPARSE; + WINOLEAUTAPI_(BSTR) SysAllocString(const OLECHAR*); WINOLEAUTAPI_(int) SysReAllocString(BSTR*,const OLECHAR*); WINOLEAUTAPI_(BSTR) SysAllocStringLen(const OLECHAR*,unsigned int); @@ -292,6 +318,8 @@ WINOLEAUTAPI CreateErrorInfo(LPCREATEERRORINFO*); WINOLEAUTAPI_(unsigned long) OaBuildVersion(void); WINOLEAUTAPI VectorFromBstr (BSTR, SAFEARRAY **); WINOLEAUTAPI BstrFromVector (SAFEARRAY *, BSTR *); +WINOLEAUTAPI VarParseNumFromStr(OLECHAR*,LCID,ULONG,NUMPARSE*,BYTE*); +WINOLEAUTAPI VarNumFromParseNum(NUMPARSE*,BYTE*,ULONG,VARIANT*); WINOLEAUTAPI VarAdd(LPVARIANT, LPVARIANT, LPVARIANT); WINOLEAUTAPI VarSub(LPVARIANT, LPVARIANT, LPVARIANT); From 3b611039453a7102f8bad2a2b58d059911541fdb Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 29 Feb 2004 14:11:02 +0000 Subject: [PATCH 0269/1463] define DISP_E_DIVBYZERO svn path=/trunk/; revision=8479 --- reactos/w32api/include/winerror.h | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/w32api/include/winerror.h b/reactos/w32api/include/winerror.h index 42e8bce99e7..0a3193cdfdc 100644 --- a/reactos/w32api/include/winerror.h +++ b/reactos/w32api/include/winerror.h @@ -2096,6 +2096,7 @@ #define DISP_E_PARAMNOTOPTIONAL ((HRESULT)0x8002000FL) #define DISP_E_BADCALLEE ((HRESULT)0x80020010L) #define DISP_E_NOTACOLLECTION ((HRESULT)0x80020011L) +#define DISP_E_DIVBYZERO ((HRESULT)0x80020012L) #define TYPE_E_BUFFERTOOSMALL ((HRESULT)0x80028016L) #define TYPE_E_INVDATAREAD ((HRESULT)0x80028018L) #define TYPE_E_UNSUPFORMAT ((HRESULT)0x80028019L) From 6ac5583cf14f41f7d098c0c6dfb13d153199df5c Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 29 Feb 2004 14:12:38 +0000 Subject: [PATCH 0270/1463] - define struct UDATE - define VTBIT_... constants - define missing VAR_... constants - declare functions VarDateFromUdate, VarDateFromUdateEx, VarUdateFromDate svn path=/trunk/; revision=8480 --- reactos/w32api/include/oleauto.h | 34 ++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/reactos/w32api/include/oleauto.h b/reactos/w32api/include/oleauto.h index b505f1a848d..92d2e57535d 100644 --- a/reactos/w32api/include/oleauto.h +++ b/reactos/w32api/include/oleauto.h @@ -16,6 +16,13 @@ #define VARIANT_LOCALBOOL 0x08 #define VAR_TIMEVALUEONLY 0x0001 #define VAR_DATEVALUEONLY 0x0002 +#define VAR_VALIDDATE 0x0004 +#define VAR_CALENDAR_HIJRI 0x0008 +#define VAR_LOCALBOOL 0x0010 +#define VAR_FORMAT_NOSUBSTITUTE 0x0020 +#define VAR_FOURDIGITYEARS 0x0040 +#define VAR_CALENDAR_THAI 0x0080 +#define VAR_CALENDAR_GREGORIAN 0x0100 #define MEMBERID_NIL DISPID_UNKNOWN #define ID_DEFAULTINST (-2) #define DISPATCH_METHOD 1 @@ -102,8 +109,6 @@ #define VARCMP_GT 2 #define VARCMP_NULL 3 -#define VAR_LOCALBOOL 0x10 - #define LOCALE_USE_NLS 0x10000000 #define VARIANT_NOUSEROVERRIDE 0x04 @@ -112,10 +117,6 @@ #define VARIANT_CALENDAR_GREGORIAN 0x40 #define VARIANT_USE_NLS 0x80 -#define VAR_CALENDAR_HIJRI 0x08 -#define VAR_CALENDAR_THAI 0x80 -#define VAR_CALENDAR_GREGORIAN 0x100 - #define NUMPRS_LEADING_WHITE 0x00001 #define NUMPRS_TRAILING_WHITE 0x00002 #define NUMPRS_LEADING_PLUS 0x00004 @@ -133,6 +134,19 @@ #define NUMPRS_NEG 0x10000 #define NUMPRS_INEXACT 0x20000 +#define VTBIT_I1 (1<<VT_I1) +#define VTBIT_UI1 (1<<VT_UI1) +#define VTBIT_I2 (1<<VT_I2) +#define VTBIT_UI2 (1<<VT_UI2) +#define VTBIT_I4 (1<<VT_I4) +#define VTBIT_UI4 (1<<VT_UI4) +#define VTBIT_I8 (1<<VT_I8) +#define VTBIT_UI8 (1<<VT_UI8) +#define VTBIT_R4 (1<<VT_R4) +#define VTBIT_R8 (1<<VT_R8) +#define VTBIT_CY (1<<VT_CY) +#define VTBIT_DECIMAL (1<<VT_DECIMAL) + #include <oaidl.h> typedef enum tagREGKIND { @@ -159,6 +173,11 @@ typedef struct tagINTERFACEDATA { UINT cMembers; } INTERFACEDATA,*LPINTERFACEDATA; +typedef struct { + SYSTEMTIME st; + USHORT wDayOfYear; +} UDATE; + typedef struct { int cDig; unsigned long dwInFlags; @@ -180,6 +199,9 @@ WINOLEAUTAPI_(int) DosDateTimeToVariantTime(unsigned short,unsigned short,double WINOLEAUTAPI_(int) VariantTimeToDosDateTime(double,unsigned short*,unsigned short*); WINOLEAUTAPI_(int) VariantTimeToSystemTime(double,LPSYSTEMTIME); WINOLEAUTAPI_(int) SystemTimeToVariantTime(LPSYSTEMTIME, double*); +WINOLEAUTAPI VarDateFromUdate(UDATE*,ULONG,DATE*); +WINOLEAUTAPI VarDateFromUdateEx(UDATE*,LCID,ULONG,DATE*); +WINOLEAUTAPI VarUdateFromDate(DATE,ULONG,UDATE*); WINOLEAUTAPI SafeArrayAllocDescriptor(unsigned int,SAFEARRAY**); WINOLEAUTAPI SafeArrayAllocData(SAFEARRAY*); WINOLEAUTAPI_(SAFEARRAY*) SafeArrayCreate(VARTYPE,unsigned int,SAFEARRAYBOUND*); From bb2bc91e3c7753dbdf2fbdfdd3476c331ee0b192 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 29 Feb 2004 14:16:27 +0000 Subject: [PATCH 0271/1463] declare VARIANT manipulation functions svn path=/trunk/; revision=8481 --- reactos/w32api/include/oleauto.h | 47 ++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/reactos/w32api/include/oleauto.h b/reactos/w32api/include/oleauto.h index 92d2e57535d..feeb18c988b 100644 --- a/reactos/w32api/include/oleauto.h +++ b/reactos/w32api/include/oleauto.h @@ -591,7 +591,54 @@ WINOLEAUTAPI VarDecFromUI8(ULONG64,DECIMAL*); WINOLEAUTAPI VarDecFromCy(CY,DECIMAL*); WINOLEAUTAPI VarDecFromDisp(IDispatch*,LCID,DECIMAL*); +WINOLEAUTAPI VarR4CmpR8(float,double); +WINOLEAUTAPI VarR8Pow(double,double,double*); +WINOLEAUTAPI VarR8Round(double,int,double*); +WINOLEAUTAPI VarDecAbs(const DECIMAL*,DECIMAL*); +WINOLEAUTAPI VarDecAdd(const DECIMAL*,const DECIMAL*,DECIMAL*); +WINOLEAUTAPI VarDecCmp(const DECIMAL*,const DECIMAL*); +WINOLEAUTAPI VarDecCmpR8(const DECIMAL*,DOUBLE); +WINOLEAUTAPI VarDecDiv(const DECIMAL*,const DECIMAL*,DECIMAL*); +WINOLEAUTAPI VarDecFix(const DECIMAL*,DECIMAL*); +WINOLEAUTAPI VarDecInt(const DECIMAL*,DECIMAL*); +WINOLEAUTAPI VarDecMul(const DECIMAL*,const DECIMAL*,DECIMAL*); WINOLEAUTAPI VarDecNeg(const DECIMAL*,DECIMAL*); +WINOLEAUTAPI VarDecRound(const DECIMAL*,int,DECIMAL*); +WINOLEAUTAPI VarDecSub(const DECIMAL*,const DECIMAL*,DECIMAL*); +WINOLEAUTAPI VarCyAbs(const CY,CY*); +WINOLEAUTAPI VarCyAdd(const CY,const CY,CY*); +WINOLEAUTAPI VarCyCmp(const CY,const CY); +WINOLEAUTAPI VarCyCmpR8(const CY,DOUBLE); +WINOLEAUTAPI VarCyFix(const CY,CY*); +WINOLEAUTAPI VarCyInt(const CY,CY*); +WINOLEAUTAPI VarCyMul(const CY,CY,CY*); +WINOLEAUTAPI VarCyMulI4(const CY,LONG,CY*); +WINOLEAUTAPI VarCyMulI8(const CY,LONG64,CY*); +WINOLEAUTAPI VarCyNeg(const CY,CY*); +WINOLEAUTAPI VarCyRound(const CY,INT,CY*); +WINOLEAUTAPI VarCySub(const CY,const CY,CY*); +WINOLEAUTAPI VarAdd(LPVARIANT,LPVARIANT,LPVARIANT); +WINOLEAUTAPI VarAnd(LPVARIANT,LPVARIANT,LPVARIANT); +WINOLEAUTAPI VarCat(LPVARIANT,LPVARIANT,LPVARIANT); +WINOLEAUTAPI VarDiv(LPVARIANT,LPVARIANT,LPVARIANT); +WINOLEAUTAPI VarEqv(LPVARIANT,LPVARIANT,LPVARIANT); +WINOLEAUTAPI VarIdiv(LPVARIANT,LPVARIANT,LPVARIANT); +WINOLEAUTAPI VarImp(LPVARIANT,LPVARIANT,LPVARIANT); +WINOLEAUTAPI VarMod(LPVARIANT,LPVARIANT,LPVARIANT); +WINOLEAUTAPI VarMul(LPVARIANT,LPVARIANT,LPVARIANT); +WINOLEAUTAPI VarOr(LPVARIANT,LPVARIANT,LPVARIANT); +WINOLEAUTAPI VarPow(LPVARIANT,LPVARIANT,LPVARIANT); +WINOLEAUTAPI VarSub(LPVARIANT,LPVARIANT,LPVARIANT); +WINOLEAUTAPI VarXor(LPVARIANT,LPVARIANT,LPVARIANT); +WINOLEAUTAPI VarAbs(LPVARIANT,LPVARIANT); +WINOLEAUTAPI VarFix(LPVARIANT,LPVARIANT); +WINOLEAUTAPI VarInt(LPVARIANT,LPVARIANT); +WINOLEAUTAPI VarNeg(LPVARIANT,LPVARIANT); +WINOLEAUTAPI VarNot(LPVARIANT,LPVARIANT); +WINOLEAUTAPI VarRound(LPVARIANT,int,LPVARIANT); +WINOLEAUTAPI VarCmp(LPVARIANT,LPVARIANT,LCID,ULONG); +WINOLEAUTAPI VarBstrCmp(BSTR,BSTR,LCID,ULONG); +WINOLEAUTAPI VarBstrCat(BSTR,BSTR,BSTR*); #pragma pack(pop) From efa31a77fb8aff6301bca25de70afb70a6de50ff Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 29 Feb 2004 14:19:05 +0000 Subject: [PATCH 0272/1463] remove FIXMEs and enable now compiling functions svn path=/trunk/; revision=8482 --- reactos/lib/oleaut32/oleaut32.spec | 10 +++++----- reactos/lib/oleaut32/variant.c | 10 ++++++---- reactos/lib/oleaut32/vartype.c | 2 -- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/reactos/lib/oleaut32/oleaut32.spec b/reactos/lib/oleaut32/oleaut32.spec index 6c713b755a7..6d1699551d5 100644 --- a/reactos/lib/oleaut32/oleaut32.spec +++ b/reactos/lib/oleaut32/oleaut32.spec @@ -10,8 +10,8 @@ 10 stdcall VariantCopy(ptr ptr) 11 stdcall VariantCopyInd(ptr ptr) 12 stdcall VariantChangeType(ptr ptr long long) -#13 stdcall VariantTimeToDosDateTime(double ptr ptr) -#14 stdcall DosDateTimeToVariantTime(long long ptr) +13 stdcall VariantTimeToDosDateTime(double ptr ptr) +14 stdcall DosDateTimeToVariantTime(long long ptr) #15 stdcall SafeArrayCreate(long long ptr) #16 stdcall SafeArrayDestroy(ptr) #17 stdcall SafeArrayGetDim(ptr) @@ -310,7 +310,7 @@ 315 stdcall VarR8Pow(double double ptr) 316 stdcall VarR4CmpR8(long double) 317 stdcall VarR8Round(double long ptr) -#318 stdcall VarCat(ptr ptr ptr) +318 stdcall VarCat(ptr ptr ptr) 319 stub VarDateFromUdateEx # stdcall (ptr long long ptr) #320 stdcall -private DllRegisterServer() OLEAUT32_DllRegisterServer #321 stdcall -private DllUnregisterServer() OLEAUT32_DllUnregisterServer @@ -320,8 +320,8 @@ 326 stub GetVarConversionLocaleSetting 327 stdcall SetOaNoCache() 329 stdcall VarCyMulI8(long long long long ptr) -#330 stdcall VarDateFromUdate(ptr long ptr) -#331 stdcall VarUdateFromDate(double long ptr) +330 stdcall VarDateFromUdate(ptr long ptr) +331 stdcall VarUdateFromDate(double long ptr) 332 stub GetAltMonthNames 333 stdcall VarI8FromUI1(long long) 334 stdcall VarI8FromI2(long long) diff --git a/reactos/lib/oleaut32/variant.c b/reactos/lib/oleaut32/variant.c index 8b9d984c5fb..dd6ac52aca1 100644 --- a/reactos/lib/oleaut32/variant.c +++ b/reactos/lib/oleaut32/variant.c @@ -1126,8 +1126,6 @@ static inline double VARIANT_JulianFromDMY(USHORT year, USHORT month, USHORT day #define DOS_DATE(d,m,y) (d | (m << 5) | ((y-1980) << 9)) #define DOS_TIME(h,m,s) ((s >> 1) | (m << 5) | (h << 11)) -#ifndef __REACTOS__ /*FIXME: disabled for now */ - /* Roll a date forwards or backwards to correct it */ static HRESULT VARIANT_RollUdate(UDATE *lpUd) { @@ -2091,6 +2089,7 @@ HRESULT WINAPI VarNumFromParseNum(NUMPARSE *pNumprs, BYTE *rgbDig, V_I8(pVarDst) = -ul64; return S_OK; } +#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO64 */ else if ((dwVtBits & REAL_VTBITS) == VTBIT_DECIMAL) { /* Decimal is only output choice left - fast path */ @@ -2100,6 +2099,7 @@ HRESULT WINAPI VarNumFromParseNum(NUMPARSE *pNumprs, BYTE *rgbDig, DEC_LO64(&V_DECIMAL(pVarDst)) = -ul64; return S_OK; } +#endif } } else if (!bOverflow) @@ -2153,6 +2153,7 @@ HRESULT WINAPI VarNumFromParseNum(NUMPARSE *pNumprs, BYTE *rgbDig, V_UI8(pVarDst) = ul64; return S_OK; } +#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO64 */ else if ((dwVtBits & REAL_VTBITS) == VTBIT_DECIMAL) { /* Decimal is only output choice left - fast path */ @@ -2162,6 +2163,7 @@ HRESULT WINAPI VarNumFromParseNum(NUMPARSE *pNumprs, BYTE *rgbDig, DEC_LO64(&V_DECIMAL(pVarDst)) = ul64; return S_OK; } +#endif } } @@ -2256,6 +2258,7 @@ HRESULT WINAPI VarNumFromParseNum(NUMPARSE *pNumprs, BYTE *rgbDig, } } +#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO64 */ if (dwVtBits & VTBIT_DECIMAL) { int i; @@ -2313,6 +2316,7 @@ VarNumFromParseNum_DecOverflow: V_VT(pVarDst) = VT_DECIMAL; return S_OK; } +#endif return DISP_E_OVERFLOW; /* No more output choices */ } @@ -3740,5 +3744,3 @@ HRESULT WINAPI VarPow(LPVARIANT left, LPVARIANT right, LPVARIANT result) V_R8(result) = pow(V_R8(&dl),V_R8(&dr)); return S_OK; } - -#endif /*FIXME*/ diff --git a/reactos/lib/oleaut32/vartype.c b/reactos/lib/oleaut32/vartype.c index 6d0c9757650..c166b37ce3e 100644 --- a/reactos/lib/oleaut32/vartype.c +++ b/reactos/lib/oleaut32/vartype.c @@ -85,7 +85,6 @@ HRESULT VARIANT_NumberFromBstr(OLECHAR* pStrIn, LCID lcid, ULONG ulFlags, { VARIANTARG dstVar; HRESULT hRet; -#ifndef __REACTOS__ /*FIXME: missing NUMPARSE in MinGW */ NUMPARSE np; BYTE rgb[1024]; @@ -102,7 +101,6 @@ HRESULT VARIANT_NumberFromBstr(OLECHAR* pStrIn, LCID lcid, ULONG ulFlags, if (SUCCEEDED(hRet)) VARIANT_CopyData(&dstVar, vt, pOut); } -#endif return hRet; } From 4f35ba6289ba1df915591250ad1cd63be4a2f153 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 29 Feb 2004 14:22:52 +0000 Subject: [PATCH 0273/1463] declare ITypeInfo_... COBJ macros svn path=/trunk/; revision=8483 --- reactos/w32api/include/oaidl.h | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/reactos/w32api/include/oaidl.h b/reactos/w32api/include/oaidl.h index d35b061df36..8dab43cd632 100644 --- a/reactos/w32api/include/oaidl.h +++ b/reactos/w32api/include/oaidl.h @@ -541,6 +541,31 @@ DECLARE_INTERFACE_(ITypeInfo,IUnknown) }; #undef INTERFACE +#ifdef COBJMACROS +#define ITypeInfo_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define ITypeInfo_AddRef(p) (p)->lpVtbl->AddRef(p) +#define ITypeInfo_Release(p) (p)->lpVtbl->Release(p) +#define ITypeInfo_GetTypeAttr(p,a) (p)->lpVtbl->GetTypeAttr(p,a) +#define ITypeInfo_GetTypeComp(p,a) (p)->lpVtbl->GetTypeComp(p,a) +#define ITypeInfo_GetFuncDesc(p,a,b) (p)->lpVtbl->GetFuncDesc(p,a,b) +#define ITypeInfo_GetVarDesc(p,a,b) (p)->lpVtbl->GetVarDesc(p,a,b) +#define ITypeInfo_GetNames(p,a,b,c,d) (p)->lpVtbl->GetNames(p,a,b,c,d) +#define ITypeInfo_GetRefTypeOfImplType(p,a,b) (p)->lpVtbl->GetRefTypeOfImplType(p,a,b) +#define ITypeInfo_GetImplTypeFlags(p,a,b) (p)->lpVtbl->GetImplTypeFlags(p,a,b) +#define ITypeInfo_GetIDsOfNames(p,a,b,c) (p)->lpVtbl->GetIDsOfNames(p,a,b,c) +#define ITypeInfo_Invoke(p,a,b,c,d,e,f,g) (p)->lpVtbl->Invoke(p,a,b,c,d,e,f,g) +#define ITypeInfo_GetDocumentation(p,a,b,c,d,e) (p)->lpVtbl->GetDocumentation(p,a,b,c,d,e) +#define ITypeInfo_GetDllEntry(p,a,b,c,d,e) (p)->lpVtbl->GetDllEntry(p,a,b,c,d,e) +#define ITypeInfo_GetRefTypeInfo(p,a,b) (p)->lpVtbl->GetRefTypeInfo(p,a,b) +#define ITypeInfo_AddressOfMember(p,a,b,c) (p)->lpVtbl->AddressOfMember(p,a,b,c) +#define ITypeInfo_CreateInstance(p,a,b,c) (p)->lpVtbl->CreateInstance(p,a,b,c) +#define ITypeInfo_GetMops(p,a,b) (p)->lpVtbl->GetMops(p,a,b) +#define ITypeInfo_GetContainingTypeLib(p,a,b) (p)->lpVtbl->GetContainingTypeLib(p,a,b) +#define ITypeInfo_ReleaseTypeAttr(p,a) (p)->lpVtbl->ReleaseTypeAttr(p,a) +#define ITypeInfo_ReleaseFuncDesc(p,a) (p)->lpVtbl->ReleaseFuncDesc(p,a) +#define ITypeInfo_ReleaseVarDesc(p,a) (p)->lpVtbl->ReleaseVarDesc(p,a) +#endif + #define INTERFACE ITypeInfo2 DECLARE_INTERFACE_(ITypeInfo2,ITypeInfo) { From f685bba74e7de307dbe4317690eda9d89c905ec4 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 29 Feb 2004 14:48:12 +0000 Subject: [PATCH 0274/1463] enable dispatch.c and varformat.c svn path=/trunk/; revision=8484 --- reactos/lib/oleaut32/Makefile.in | 6 +- reactos/lib/oleaut32/Makefile.ros-template | 4 +- reactos/lib/oleaut32/oleaut32.spec | 68 +++++++++++----------- reactos/lib/oleaut32/vartype.c | 2 - 4 files changed, 39 insertions(+), 41 deletions(-) diff --git a/reactos/lib/oleaut32/Makefile.in b/reactos/lib/oleaut32/Makefile.in index f0fb2c5f42e..98cfca28b71 100644 --- a/reactos/lib/oleaut32/Makefile.in +++ b/reactos/lib/oleaut32/Makefile.in @@ -17,19 +17,19 @@ C_SRCS = \ oleaut.c \ stubs.c \ variant.c \ - vartype.c + vartype.c \ + dispatch.c \ + varformat.c # regsvr.c \ # safearray.c \ # olefont.c \ # olepicture.c \ -# dispatch.c \ # tmarshal.c \ # usrmarshal.c \ # oaidl_p.c \ # typelib.c \ # typelib2.c \ -# varformat.c \ C_SRCS16 = \ ole2disp.c \ diff --git a/reactos/lib/oleaut32/Makefile.ros-template b/reactos/lib/oleaut32/Makefile.ros-template index 6b2c4af773a..98bd13dbc15 100644 --- a/reactos/lib/oleaut32/Makefile.ros-template +++ b/reactos/lib/oleaut32/Makefile.ros-template @@ -1,4 +1,4 @@ -# $Id: Makefile.ros-template,v 1.1 2004/02/07 18:53:58 mf Exp $ +# $Id: Makefile.ros-template,v 1.2 2004/02/29 14:48:12 mf Exp $ TARGET_NAME = oleaut32 @@ -6,7 +6,7 @@ TARGET_OBJECTS = @C_SRCS@ TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ -TARGET_SDKLIBS = @IMPORTS@ winmm.a libwine.a wine_uuid.a ntdll.a +TARGET_SDKLIBS = @IMPORTS@ winmm.a libwine.a wine_uuid.a libwine_unicode.a ntdll.a TARGET_BASE = 0x76160000 diff --git a/reactos/lib/oleaut32/oleaut32.spec b/reactos/lib/oleaut32/oleaut32.spec index 6d1699551d5..97b5177a9e5 100644 --- a/reactos/lib/oleaut32/oleaut32.spec +++ b/reactos/lib/oleaut32/oleaut32.spec @@ -25,14 +25,14 @@ #25 stdcall SafeArrayGetElement(ptr ptr ptr) #26 stdcall SafeArrayPutElement(ptr ptr ptr) #27 stdcall SafeArrayCopy(ptr ptr) -#28 stdcall DispGetParam(ptr long long ptr ptr) -#29 stdcall DispGetIDsOfNames(ptr ptr long ptr) -#30 stdcall DispInvoke(ptr ptr long long ptr ptr ptr ptr) -#31 stdcall CreateDispTypeInfo(ptr long ptr) -#32 stdcall CreateStdDispatch(ptr ptr ptr ptr) -#33 stdcall RegisterActiveObject(ptr ptr long ptr) -#34 stdcall RevokeActiveObject(long ptr) -#35 stdcall GetActiveObject(ptr ptr ptr) +28 stdcall DispGetParam(ptr long long ptr ptr) +29 stdcall DispGetIDsOfNames(ptr ptr long ptr) +30 stdcall DispInvoke(ptr ptr long long ptr ptr ptr ptr) +31 stdcall CreateDispTypeInfo(ptr long ptr) +32 stdcall CreateStdDispatch(ptr ptr ptr ptr) +33 stdcall RegisterActiveObject(ptr ptr long ptr) +34 stdcall RevokeActiveObject(long ptr) +35 stdcall GetActiveObject(ptr ptr ptr) #36 stdcall SafeArrayAllocDescriptor(long ptr) #37 stdcall SafeArrayAllocData(ptr) #38 stdcall SafeArrayDestroyDescriptor(ptr) @@ -43,8 +43,8 @@ #43 stdcall SafeArrayCreateVectorEx(long long long ptr) #44 stdcall SafeArraySetRecordInfo(ptr ptr) #45 stdcall SafeArrayGetRecordInfo(ptr ptr) -#46 stdcall VarParseNumFromStr(wstr long long ptr ptr) -#47 stdcall VarNumFromParseNum(ptr ptr long ptr) +46 stdcall VarParseNumFromStr(wstr long long ptr ptr) +47 stdcall VarNumFromParseNum(ptr ptr long ptr) 48 stdcall VarI2FromUI1(long ptr) 49 stdcall VarI2FromI4(long ptr) 50 stdcall VarI2FromR4(long ptr) @@ -84,17 +84,17 @@ 84 stdcall VarR8FromStr(wstr long long ptr) 85 stdcall VarR8FromDisp(ptr long ptr) 86 stdcall VarR8FromBool(long ptr) -#87 stdcall VarFormat(ptr ptr long long long ptr) +87 stdcall VarFormat(ptr ptr long long long ptr) 88 stdcall VarDateFromUI1(long ptr) 89 stdcall VarDateFromI2(long ptr) 90 stdcall VarDateFromI4(long ptr) 91 stdcall VarDateFromR4(long ptr) 92 stdcall VarDateFromR8(double ptr) 93 stdcall VarDateFromCy(long long ptr) -#94 stdcall VarDateFromStr(wstr long long ptr) +94 stdcall VarDateFromStr(wstr long long ptr) 95 stdcall VarDateFromDisp(ptr long ptr) 96 stdcall VarDateFromBool(long ptr) -#97 stdcall VarFormatDateTime(ptr long long ptr) +97 stdcall VarFormatDateTime(ptr long long ptr) 98 stdcall VarCyFromUI1(long ptr) 99 stdcall VarCyFromI2(long ptr) 100 stdcall VarCyFromI4(long ptr) @@ -104,7 +104,7 @@ 104 stdcall VarCyFromStr(wstr long long ptr) 105 stdcall VarCyFromDisp(ptr long ptr) 106 stdcall VarCyFromBool(long ptr) -#107 stdcall VarFormatNumber(ptr long long long long long ptr) +107 stdcall VarFormatNumber(ptr long long long long long ptr) 108 stdcall VarBstrFromUI1(long long long ptr) 109 stdcall VarBstrFromI2(long long long ptr) 110 stdcall VarBstrFromI4(long long long ptr) @@ -114,7 +114,7 @@ 114 stdcall VarBstrFromDate(double long long ptr) 115 stub VarBstrFromDisp 116 stdcall VarBstrFromBool(long long long ptr) -#117 stdcall VarFormatPercent(ptr long long long long long ptr) +117 stdcall VarFormatPercent(ptr long long long long long ptr) 118 stdcall VarBoolFromUI1(long ptr) 119 stdcall VarBoolFromI2(long ptr) 120 stdcall VarBoolFromI4(long ptr) @@ -124,7 +124,7 @@ 124 stdcall VarBoolFromCy(long long ptr) 125 stdcall VarBoolFromStr(wstr long long ptr) 126 stdcall VarBoolFromDisp(ptr long ptr) -#127 stdcall VarFormatCurrency(ptr long long long long long ptr) +127 stdcall VarFormatCurrency(ptr long long long long long ptr) 128 stub VarWeekdayName # stdcall (long long long long ptr) 129 stub VarMonthName # stdcall (long long long ptr) 130 stdcall VarUI1FromI2(long ptr) @@ -136,11 +136,11 @@ 136 stdcall VarUI1FromStr(wstr long long ptr) 137 stdcall VarUI1FromDisp(ptr long ptr) 138 stdcall VarUI1FromBool(long ptr) -#139 stdcall VarFormatFromTokens (ptr ptr ptr long ptr long) -#140 stdcall VarTokenizeFormatString (ptr ptr long long long long ptr) -#141 stdcall VarAdd(ptr ptr ptr) -#142 stdcall VarAnd(ptr ptr ptr) -#143 stdcall VarDiv(ptr ptr ptr) +139 stdcall VarFormatFromTokens (ptr ptr ptr long ptr long) +140 stdcall VarTokenizeFormatString (ptr ptr long long long long ptr) +141 stdcall VarAdd(ptr ptr ptr) +142 stdcall VarAnd(ptr ptr ptr) +143 stdcall VarDiv(ptr ptr ptr) 144 stub OACreateTypeLib2 #146 stdcall DispCallFunc(ptr long long long long ptr ptr ptr) 147 stdcall VariantChangeTypeEx(ptr ptr long long long) @@ -150,11 +150,11 @@ 152 stub VarEqv # stdcall (ptr ptr ptr) 153 stub VarIdiv # stdcall (ptr ptr ptr) 154 stub VarImp # stdcall (ptr ptr ptr) -#155 stdcall VarMod(ptr ptr ptr) -#156 stdcall VarMul(ptr ptr ptr) -#157 stdcall VarOr(ptr ptr ptr) -#158 stdcall VarPow(ptr ptr ptr) -#159 stdcall VarSub(ptr ptr ptr) +155 stdcall VarMod(ptr ptr ptr) +156 stdcall VarMul(ptr ptr ptr) +157 stdcall VarOr(ptr ptr ptr) +158 stdcall VarPow(ptr ptr ptr) +159 stdcall VarSub(ptr ptr ptr) #160 stdcall CreateTypeLib(long wstr ptr) #161 stdcall LoadTypeLib (wstr ptr) #162 stdcall LoadRegTypeLib (ptr long long long ptr) @@ -163,15 +163,15 @@ 165 stdcall LHashValOfNameSys(long long wstr) 166 stdcall LHashValOfNameSysA(long long str) 167 stub VarXor # stdcall (ptr ptr ptr) -#168 stdcall VarAbs(ptr ptr) -#169 stdcall VarFix(ptr ptr) +168 stdcall VarAbs(ptr ptr) +169 stdcall VarFix(ptr ptr) 170 stdcall OaBuildVersion() 171 stub ClearCustData -#172 stdcall VarInt(ptr ptr) -#173 stdcall VarNeg(ptr ptr) -#174 stdcall VarNot(ptr ptr) +172 stdcall VarInt(ptr ptr) +173 stdcall VarNeg(ptr ptr) +174 stdcall VarNot(ptr ptr) 175 stub VarRound # stdcall (ptr long ptr) -#176 stdcall VarCmp(ptr ptr long long) +176 stdcall VarCmp(ptr ptr long long) #177 stdcall VarDecAdd(ptr ptr ptr) 178 stdcall VarDecDiv(ptr ptr ptr) #179 stdcall VarDecMul(ptr ptr ptr) @@ -179,8 +179,8 @@ #181 stdcall VarDecSub(ptr ptr ptr) 182 stdcall VarDecAbs(ptr ptr) #183 stdcall LoadTypeLibEx (wstr long ptr) -#184 stdcall SystemTimeToVariantTime(ptr ptr) -#185 stdcall VariantTimeToSystemTime(double ptr) +184 stdcall SystemTimeToVariantTime(ptr ptr) +185 stdcall VariantTimeToSystemTime(double ptr) #186 stdcall UnRegisterTypeLib (ptr long long long long) 187 stdcall VarDecFix(ptr ptr) 188 stdcall VarDecInt(ptr ptr) diff --git a/reactos/lib/oleaut32/vartype.c b/reactos/lib/oleaut32/vartype.c index c166b37ce3e..b0bf7fc165d 100644 --- a/reactos/lib/oleaut32/vartype.c +++ b/reactos/lib/oleaut32/vartype.c @@ -6195,7 +6195,6 @@ VARIANT_MakeDate_OK: * the date is invalid in that format, in which the most compatible format * that produces a valid date will be used. */ -#ifndef __REACTOS__ /*FIXME: no SystemTimeToVariantTime() yet */ HRESULT WINAPI VarDateFromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, DATE* pdateOut) { static const USHORT ParseDateTokens[] = @@ -6525,7 +6524,6 @@ HRESULT WINAPI VarDateFromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, DATE* pd SysFreeString(tokens[i]); return hRet; } -#endif /****************************************************************************** * VarDateFromI1 (OLEAUT32.221) From e6d1d240142325d60be1b5d0d0cc8f6d03fe3bae Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 29 Feb 2004 15:06:34 +0000 Subject: [PATCH 0275/1463] remove LOG output svn path=/trunk/; revision=8485 --- reactos/subsys/system/explorer/taskbar/desktopbar.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp index 7eb1c1792d5..59ffce98f04 100644 --- a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp @@ -131,9 +131,7 @@ LRESULT DesktopBar::Init(LPCREATESTRUCT pcs) rbBand.cxMinChild = 0; rbBand.cyMinChild = HIWORD(SendMessage(_hwndQuickLaunch, TB_GETBUTTONSIZE, 0, 0)) + 2; rbBand.cx = 250; -LOG(TEXT("before RB_INSERTBAND")); SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand); -LOG(TEXT("after RB_INSERTBAND")); rbBand.lpText = TEXT("Taskbar"); rbBand.hwndChild = _hwndTaskBar; From 3834b079e5deade49eb9f54da96a165918b1aef5 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 29 Feb 2004 15:27:51 +0000 Subject: [PATCH 0276/1463] remove more FIXMEs svn path=/trunk/; revision=8486 --- reactos/lib/oleaut32/typelib.c | 2 -- reactos/lib/oleaut32/vartype.c | 6 ------ 2 files changed, 8 deletions(-) diff --git a/reactos/lib/oleaut32/typelib.c b/reactos/lib/oleaut32/typelib.c index 54561331d9b..167cbbb1bfe 100644 --- a/reactos/lib/oleaut32/typelib.c +++ b/reactos/lib/oleaut32/typelib.c @@ -1248,7 +1248,6 @@ void dump_Variant(VARIANT * pvar) case VT_BSTR: TRACE(",%s", debugstr_w(V_BSTR(pvar))); break; case VT_CY: TRACE(",0x%08lx,0x%08lx", V_CY(pvar).s.Hi, V_CY(pvar).s.Lo); break; -#ifndef __REACTOS /*FIXME*/ case VT_DATE: if(!VariantTimeToSystemTime(V_DATE(pvar), &st)) TRACE(",<invalid>"); @@ -1256,7 +1255,6 @@ void dump_Variant(VARIANT * pvar) TRACE(",%04d/%02d/%02d %02d:%02d:%02d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); break; -#endif case VT_ERROR: case VT_VOID: case VT_USERDEFINED: diff --git a/reactos/lib/oleaut32/vartype.c b/reactos/lib/oleaut32/vartype.c index b0bf7fc165d..fd8f46b1933 100644 --- a/reactos/lib/oleaut32/vartype.c +++ b/reactos/lib/oleaut32/vartype.c @@ -51,25 +51,19 @@ static inline void VARIANT_CopyData(const VARIANT *srcVar, VARTYPE vt, void *pOu case VT_UI1: memcpy(pOut, &V_UI1(srcVar), sizeof(BYTE)); break; case VT_BOOL: case VT_I2: -#ifndef __REACTOS__ /*FIXME*/ case VT_UI2: memcpy(pOut, &V_UI2(srcVar), sizeof(SHORT)); -#endif break; case VT_R4: case VT_INT: case VT_I4: case VT_UINT: -#ifndef __REACTOS__ /*FIXME*/ case VT_UI4: memcpy(pOut, &V_UI4(srcVar), sizeof (LONG)); -#endif break; case VT_R8: case VT_DATE: case VT_CY: case VT_I8: -#ifndef __REACTOS__ /*FIXME*/ case VT_UI8: memcpy(pOut, &V_UI8(srcVar), sizeof (LONG64)); -#endif break; case VT_INT_PTR: memcpy(pOut, &V_INT_PTR(srcVar), sizeof (INT_PTR)); break; case VT_DECIMAL: memcpy(pOut, &V_DECIMAL(srcVar), sizeof (DECIMAL)); break; From ed3857e1b1167941fb6d20afc17129c084137ca7 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 29 Feb 2004 15:36:10 +0000 Subject: [PATCH 0277/1463] enable SafeArray...() functions svn path=/trunk/; revision=8487 --- reactos/lib/oleaut32/Makefile.in | 8 ++-- reactos/lib/oleaut32/oleaut32.spec | 62 +++++++++++++++--------------- reactos/lib/oleaut32/variant.c | 6 --- reactos/lib/oleaut32/vartype.c | 4 -- reactos/w32api/include/oaidl.h | 22 +++++++++++ 5 files changed, 57 insertions(+), 45 deletions(-) diff --git a/reactos/lib/oleaut32/Makefile.in b/reactos/lib/oleaut32/Makefile.in index 98cfca28b71..396577d8226 100644 --- a/reactos/lib/oleaut32/Makefile.in +++ b/reactos/lib/oleaut32/Makefile.in @@ -13,16 +13,16 @@ SPEC_SRCS16 = $(ALTNAMES:.dll=.spec) C_SRCS = \ connpt.c \ + dispatch.c \ hash.c \ oleaut.c \ stubs.c \ + safearray.c \ + varformat.c \ variant.c \ - vartype.c \ - dispatch.c \ - varformat.c + vartype.c # regsvr.c \ -# safearray.c \ # olefont.c \ # olepicture.c \ # tmarshal.c \ diff --git a/reactos/lib/oleaut32/oleaut32.spec b/reactos/lib/oleaut32/oleaut32.spec index 97b5177a9e5..c45b2277263 100644 --- a/reactos/lib/oleaut32/oleaut32.spec +++ b/reactos/lib/oleaut32/oleaut32.spec @@ -12,19 +12,19 @@ 12 stdcall VariantChangeType(ptr ptr long long) 13 stdcall VariantTimeToDosDateTime(double ptr ptr) 14 stdcall DosDateTimeToVariantTime(long long ptr) -#15 stdcall SafeArrayCreate(long long ptr) -#16 stdcall SafeArrayDestroy(ptr) -#17 stdcall SafeArrayGetDim(ptr) -#18 stdcall SafeArrayGetElemsize(ptr) -#19 stdcall SafeArrayGetUBound(ptr long long) -#20 stdcall SafeArrayGetLBound(ptr long long) -#21 stdcall SafeArrayLock(ptr) -#22 stdcall SafeArrayUnlock(ptr) -#23 stdcall SafeArrayAccessData(ptr ptr) -#24 stdcall SafeArrayUnaccessData(ptr) -#25 stdcall SafeArrayGetElement(ptr ptr ptr) -#26 stdcall SafeArrayPutElement(ptr ptr ptr) -#27 stdcall SafeArrayCopy(ptr ptr) +15 stdcall SafeArrayCreate(long long ptr) +16 stdcall SafeArrayDestroy(ptr) +17 stdcall SafeArrayGetDim(ptr) +18 stdcall SafeArrayGetElemsize(ptr) +19 stdcall SafeArrayGetUBound(ptr long long) +20 stdcall SafeArrayGetLBound(ptr long long) +21 stdcall SafeArrayLock(ptr) +22 stdcall SafeArrayUnlock(ptr) +23 stdcall SafeArrayAccessData(ptr ptr) +24 stdcall SafeArrayUnaccessData(ptr) +25 stdcall SafeArrayGetElement(ptr ptr ptr) +26 stdcall SafeArrayPutElement(ptr ptr ptr) +27 stdcall SafeArrayCopy(ptr ptr) 28 stdcall DispGetParam(ptr long long ptr ptr) 29 stdcall DispGetIDsOfNames(ptr ptr long ptr) 30 stdcall DispInvoke(ptr ptr long long ptr ptr ptr ptr) @@ -33,16 +33,16 @@ 33 stdcall RegisterActiveObject(ptr ptr long ptr) 34 stdcall RevokeActiveObject(long ptr) 35 stdcall GetActiveObject(ptr ptr ptr) -#36 stdcall SafeArrayAllocDescriptor(long ptr) -#37 stdcall SafeArrayAllocData(ptr) -#38 stdcall SafeArrayDestroyDescriptor(ptr) -#39 stdcall SafeArrayDestroyData(ptr) -#40 stdcall SafeArrayRedim(ptr ptr) -#41 stdcall SafeArrayAllocDescriptorEx(long long ptr) -#42 stdcall SafeArrayCreateEx(long long ptr ptr) -#43 stdcall SafeArrayCreateVectorEx(long long long ptr) -#44 stdcall SafeArraySetRecordInfo(ptr ptr) -#45 stdcall SafeArrayGetRecordInfo(ptr ptr) +36 stdcall SafeArrayAllocDescriptor(long ptr) +37 stdcall SafeArrayAllocData(ptr) +38 stdcall SafeArrayDestroyDescriptor(ptr) +39 stdcall SafeArrayDestroyData(ptr) +40 stdcall SafeArrayRedim(ptr ptr) +41 stdcall SafeArrayAllocDescriptorEx(long long ptr) +42 stdcall SafeArrayCreateEx(long long ptr ptr) +43 stdcall SafeArrayCreateVectorEx(long long long ptr) +44 stdcall SafeArraySetRecordInfo(ptr ptr) +45 stdcall SafeArrayGetRecordInfo(ptr ptr) 46 stdcall VarParseNumFromStr(wstr long long ptr ptr) 47 stdcall VarNumFromParseNum(ptr ptr long ptr) 48 stdcall VarI2FromUI1(long ptr) @@ -54,7 +54,7 @@ 54 stdcall VarI2FromStr(wstr long long ptr) 55 stdcall VarI2FromDisp(ptr long ptr) 56 stdcall VarI2FromBool(long ptr) -#57 stdcall SafeArraySetIID(ptr ptr) +57 stdcall SafeArraySetIID(ptr ptr) 58 stdcall VarI4FromUI1(long ptr) 59 stdcall VarI4FromI2(long ptr) 60 stdcall VarI4FromR4(long ptr) @@ -64,7 +64,7 @@ 64 stdcall VarI4FromStr(wstr long long ptr) 65 stdcall VarI4FromDisp(ptr long ptr) 66 stdcall VarI4FromBool(long ptr) -#67 stdcall SafeArrayGetIID(ptr ptr) +67 stdcall SafeArrayGetIID(ptr ptr) 68 stdcall VarR4FromUI1(long ptr) 69 stdcall VarR4FromI2(long ptr) 70 stdcall VarR4FromI4(long ptr) @@ -74,7 +74,7 @@ 74 stdcall VarR4FromStr(wstr long long ptr) 75 stdcall VarR4FromDisp(ptr long ptr) 76 stdcall VarR4FromBool(long ptr) -#77 stdcall SafeArrayGetVartype(ptr ptr) +77 stdcall SafeArrayGetVartype(ptr ptr) 78 stdcall VarR8FromUI1(long ptr) 79 stdcall VarR8FromI2(long ptr) 80 stdcall VarR8FromI4(long ptr) @@ -144,7 +144,7 @@ 144 stub OACreateTypeLib2 #146 stdcall DispCallFunc(ptr long long long long ptr ptr ptr) 147 stdcall VariantChangeTypeEx(ptr ptr long long long) -#148 stdcall SafeArrayPtrOfIndex(ptr ptr ptr) +148 stdcall SafeArrayPtrOfIndex(ptr ptr ptr) 149 stdcall SysStringByteLen(ptr) 150 stdcall SysAllocStringByteLen(ptr long) 152 stub VarEqv # stdcall (ptr ptr ptr) @@ -383,10 +383,10 @@ #401 stdcall OleLoadPictureEx(ptr long long long long long long ptr) 402 stub OleLoadPictureFileEx 410 stdcall -private DllCanUnloadNow() OLEAUT32_DllCanUnloadNow -#411 stdcall SafeArrayCreateVector(long long long) -#412 stdcall SafeArrayCopyData(ptr ptr) -#413 stdcall VectorFromBstr(ptr ptr) -#414 stdcall BstrFromVector(ptr ptr) +411 stdcall SafeArrayCreateVector(long long long) +412 stdcall SafeArrayCopyData(ptr ptr) +413 stdcall VectorFromBstr(ptr ptr) +414 stdcall BstrFromVector(ptr ptr) 415 stdcall OleIconToCursor(long long) 416 stdcall OleCreatePropertyFrameIndirect(ptr) 417 stdcall OleCreatePropertyFrame(ptr long long ptr long ptr long ptr ptr long ptr) diff --git a/reactos/lib/oleaut32/variant.c b/reactos/lib/oleaut32/variant.c index dd6ac52aca1..c748de20905 100644 --- a/reactos/lib/oleaut32/variant.c +++ b/reactos/lib/oleaut32/variant.c @@ -413,9 +413,7 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_DECIMAL: return VarDateFromDec(&V_DECIMAL(ps), &V_DATE(pd)); #endif case VT_DISPATCH: return VarDateFromDisp(V_DISPATCH(ps), lcid, &V_DATE(pd)); -#ifndef __REACTOS__ /*FIXME: no date funtions yet */ case VT_BSTR: return VarDateFromStr(V_BSTR(ps), lcid, dwFlags, &V_DATE(pd)); -#endif } break; @@ -559,7 +557,6 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, return res; } -#ifndef __REACTOS__ /*FIXME: no safearray yet */ /* Coerce to/from an array */ static inline HRESULT VARIANT_CoerceArray(VARIANTARG* pd, VARIANTARG* ps, VARTYPE vt) { @@ -574,7 +571,6 @@ static inline HRESULT VARIANT_CoerceArray(VARIANTARG* pd, VARIANTARG* ps, VARTYP return DISP_E_TYPEMISMATCH; } -#endif /****************************************************************************** * Check if a variants type is valid. @@ -1044,11 +1040,9 @@ HRESULT WINAPI VariantChangeTypeEx(VARIANTARG* pvargDest, VARIANTARG* pvargSrc, if (SUCCEEDED(res)) { -#ifndef __REACTOS__ /*FIXME: no safearray yet */ if (V_ISARRAY(&vTmp) || (vt & VT_ARRAY)) res = VARIANT_CoerceArray(pvargDest, &vTmp, vt); else -#endif res = VARIANT_Coerce(pvargDest, lcid, wFlags, &vTmp, vt); if (SUCCEEDED(res)) diff --git a/reactos/lib/oleaut32/vartype.c b/reactos/lib/oleaut32/vartype.c index fd8f46b1933..e445720f7a6 100644 --- a/reactos/lib/oleaut32/vartype.c +++ b/reactos/lib/oleaut32/vartype.c @@ -5444,11 +5444,7 @@ HRESULT WINAPI VarBstrFromDate(DATE dateIn, LCID lcid, ULONG dwFlags, BSTR* pbst TRACE("(%g,0x%08lx,0x%08lx,%p)\n", dateIn, lcid, dwFlags, pbstrOut); -#ifndef __REACTOS__ /*FIXME: no VariantTimeToSystemTime() yet */ if (!pbstrOut || !VariantTimeToSystemTime(dateIn, &st)) -#else - if (!pbstrOut) -#endif return E_INVALIDARG; *pbstrOut = NULL; diff --git a/reactos/w32api/include/oaidl.h b/reactos/w32api/include/oaidl.h index 8dab43cd632..be5aa151e4d 100644 --- a/reactos/w32api/include/oaidl.h +++ b/reactos/w32api/include/oaidl.h @@ -729,6 +729,28 @@ DECLARE_INTERFACE_(IRecordInfo, IUnknown) }; #undef INTERFACE +#ifdef COBJMACROS +#define IRecordInfo_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IRecordInfo_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IRecordInfo_Release(p) (p)->lpVtbl->Release(p) +#define IRecordInfo_RecordInit(p,a) (p)->lpVtbl->RecordInit(p,a) +#define IRecordInfo_RecordClear(p,a) (p)->lpVtbl->RecordClear(p,a) +#define IRecordInfo_RecordCopy(p,a,b) (p)->lpVtbl->RecordCopy(p,a,b) +#define IRecordInfo_GetGuid(p,a) (p)->lpVtbl->GetGuid(p,a) +#define IRecordInfo_GetName(p,a) (p)->lpVtbl->GetName(p,a) +#define IRecordInfo_GetSize(p,a) (p)->lpVtbl->GetSize(p,a) +#define IRecordInfo_GetTypeInfo(p,a) (p)->lpVtbl->GetTypeInfo(p,a) +#define IRecordInfo_GetField(p,a,b,c) (p)->lpVtbl->GetField(p,a,b,c) +#define IRecordInfo_GetFieldNoCopy(p,a,b,c,d) (p)->lpVtbl->GetFieldNoCopy(p,a,b,c,d) +#define IRecordInfo_PutField(p,a,b,c,d) (p)->lpVtbl->PutField(p,a,b,c,d) +#define IRecordInfo_PutFieldNoCopy(p,a,b,c,d) (p)->lpVtbl->PutFieldNoCopy(p,a,b,c,d) +#define IRecordInfo_GetFieldNames(p,a,b) (p)->lpVtbl->GetFieldNames(p,a,b) +#define IRecordInfo_IsMatchingType(p,a) (p)->lpVtbl->IsMatchingType(p,a) +#define IRecordInfo_RecordCreate(p) (p)->lpVtbl->RecordCreate(p) +#define IRecordInfo_RecordCreateCopy(p,a,b) (p)->lpVtbl->RecordCreateCopy(p,a,b) +#define IRecordInfo_RecordDestroy(p,a) (p)->lpVtbl->RecordDestroy(p,a) +#endif + EXTERN_C const IID IID_ITypeMarshal; #define INTERFACE ITypeMarshal DECLARE_INTERFACE_(ITypeMarshal, IUnknown) From 146314a91a562e512740fd3e1f1ce827565c241b Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 29 Feb 2004 16:24:54 +0000 Subject: [PATCH 0278/1463] fix DECIMAL macros and enable DECIMAL processing functions svn path=/trunk/; revision=8488 --- reactos/lib/oleaut32/oleaut32.spec | 60 +++++++++++++++--------------- reactos/lib/oleaut32/variant.c | 51 ------------------------- reactos/lib/oleaut32/variant.h | 8 ++-- reactos/lib/oleaut32/vartype.c | 59 ----------------------------- reactos/w32api/include/oleauto.h | 6 ++- reactos/w32api/include/wtypes.h | 10 ++++- 6 files changed, 49 insertions(+), 145 deletions(-) diff --git a/reactos/lib/oleaut32/oleaut32.spec b/reactos/lib/oleaut32/oleaut32.spec index c45b2277263..5a2b1a1cd13 100644 --- a/reactos/lib/oleaut32/oleaut32.spec +++ b/reactos/lib/oleaut32/oleaut32.spec @@ -172,11 +172,11 @@ 174 stdcall VarNot(ptr ptr) 175 stub VarRound # stdcall (ptr long ptr) 176 stdcall VarCmp(ptr ptr long long) -#177 stdcall VarDecAdd(ptr ptr ptr) +177 stdcall VarDecAdd(ptr ptr ptr) 178 stdcall VarDecDiv(ptr ptr ptr) -#179 stdcall VarDecMul(ptr ptr ptr) +179 stdcall VarDecMul(ptr ptr ptr) #180 stdcall CreateTypeLib2(long wstr ptr) -#181 stdcall VarDecSub(ptr ptr ptr) +181 stdcall VarDecSub(ptr ptr ptr) 182 stdcall VarDecAbs(ptr ptr) #183 stdcall LoadTypeLibEx (wstr long ptr) 184 stdcall SystemTimeToVariantTime(ptr ptr) @@ -185,60 +185,60 @@ 187 stdcall VarDecFix(ptr ptr) 188 stdcall VarDecInt(ptr ptr) 189 stdcall VarDecNeg(ptr ptr) -#190 stdcall VarDecFromUI1(long ptr) -#191 stdcall VarDecFromI2(long ptr) -#192 stdcall VarDecFromI4(long ptr) +190 stdcall VarDecFromUI1(long ptr) +191 stdcall VarDecFromI2(long ptr) +192 stdcall VarDecFromI4(long ptr) 193 stdcall VarDecFromR4(long ptr) 194 stdcall VarDecFromR8(double ptr) 195 stdcall VarDecFromDate(double ptr) -#196 stdcall VarDecFromCy(long long ptr) +196 stdcall VarDecFromCy(long long ptr) 197 stdcall VarDecFromStr(wstr long long ptr) 198 stdcall VarDecFromDisp(ptr long ptr) -#199 stdcall VarDecFromBool(long ptr) +199 stdcall VarDecFromBool(long ptr) 200 stdcall GetErrorInfo(long ptr) ole32.GetErrorInfo 201 stdcall SetErrorInfo(long ptr) ole32.SetErrorInfo 202 stdcall CreateErrorInfo(ptr) ole32.CreateErrorInfo 203 stdcall VarDecRound(ptr long ptr) -#204 stdcall VarDecCmp(ptr ptr) +204 stdcall VarDecCmp(ptr ptr) 205 stdcall VarI2FromI1(long ptr) 206 stdcall VarI2FromUI2(long ptr) 207 stdcall VarI2FromUI4(long ptr) -#208 stdcall VarI2FromDec(ptr ptr) -#209 stdcall VarI4FromI1(long ptr) +208 stdcall VarI2FromDec(ptr ptr) +209 stdcall VarI4FromI1(long ptr) 210 stdcall VarI4FromUI2(long ptr) 211 stdcall VarI4FromUI4(long ptr) -#212 stdcall VarI4FromDec(ptr ptr) +212 stdcall VarI4FromDec(ptr ptr) 213 stdcall VarR4FromI1(long ptr) 214 stdcall VarR4FromUI2(long ptr) 215 stdcall VarR4FromUI4(long ptr) -#216 stdcall VarR4FromDec(ptr ptr) +216 stdcall VarR4FromDec(ptr ptr) 217 stdcall VarR8FromI1(long ptr) 218 stdcall VarR8FromUI2(long ptr) 219 stdcall VarR8FromUI4(long ptr) -#220 stdcall VarR8FromDec(ptr ptr) +220 stdcall VarR8FromDec(ptr ptr) 221 stdcall VarDateFromI1(long ptr) 222 stdcall VarDateFromUI2(long ptr) 223 stdcall VarDateFromUI4(long ptr) -#224 stdcall VarDateFromDec(ptr ptr) +224 stdcall VarDateFromDec(ptr ptr) 225 stdcall VarCyFromI1(long ptr) 226 stdcall VarCyFromUI2(long ptr) 227 stdcall VarCyFromUI4(long ptr) -#228 stdcall VarCyFromDec(ptr ptr) +228 stdcall VarCyFromDec(ptr ptr) 229 stdcall VarBstrFromI1(long long long ptr) 230 stdcall VarBstrFromUI2(long long long ptr) 231 stdcall VarBstrFromUI4(long long long ptr) -#232 stdcall VarBstrFromDec(ptr long long ptr) +232 stdcall VarBstrFromDec(ptr long long ptr) 233 stdcall VarBoolFromI1(long ptr) 234 stdcall VarBoolFromUI2(long ptr) 235 stdcall VarBoolFromUI4(long ptr) -#236 stdcall VarBoolFromDec(ptr ptr) +236 stdcall VarBoolFromDec(ptr ptr) 237 stdcall VarUI1FromI1(long ptr) 238 stdcall VarUI1FromUI2(long ptr) 239 stdcall VarUI1FromUI4(long ptr) -#240 stdcall VarUI1FromDec(ptr ptr) -#241 stdcall VarDecFromI1(long ptr) -#242 stdcall VarDecFromUI2(long ptr) -#243 stdcall VarDecFromUI4(long ptr) +240 stdcall VarUI1FromDec(ptr ptr) +241 stdcall VarDecFromI1(long ptr) +242 stdcall VarDecFromUI2(long ptr) +243 stdcall VarDecFromUI4(long ptr) 244 stdcall VarI1FromUI1(long ptr) 245 stdcall VarI1FromI2(long ptr) 246 stdcall VarI1FromI4(long ptr) @@ -251,7 +251,7 @@ 253 stdcall VarI1FromBool(long ptr) 254 stdcall VarI1FromUI2(long ptr) 255 stdcall VarI1FromUI4(long ptr) -#256 stdcall VarI1FromDec(ptr ptr) +256 stdcall VarI1FromDec(ptr ptr) 257 stdcall VarUI2FromUI1(long ptr) 258 stdcall VarUI2FromI2(long ptr) 259 stdcall VarUI2FromI4(long ptr) @@ -264,7 +264,7 @@ 266 stdcall VarUI2FromBool(long ptr) 267 stdcall VarUI2FromI1(long ptr) 268 stdcall VarUI2FromUI4(long ptr) -#269 stdcall VarUI2FromDec(ptr ptr) +269 stdcall VarUI2FromDec(ptr ptr) 270 stdcall VarUI4FromUI1(long ptr) 271 stdcall VarUI4FromI2(long ptr) 272 stdcall VarUI4FromI4(long ptr) @@ -277,7 +277,7 @@ 279 stdcall VarUI4FromBool(long ptr) 280 stdcall VarUI4FromI1(long ptr) 281 stdcall VarUI4FromUI2(long ptr) -#282 stdcall VarUI4FromDec(ptr ptr) +282 stdcall VarUI4FromDec(ptr ptr) #283 stdcall BSTR_UserSize(ptr long ptr) #284 stdcall BSTR_UserMarshal(ptr ptr ptr) #285 stdcall BSTR_UserUnmarshal(ptr ptr ptr) @@ -293,7 +293,7 @@ 295 stub LPSAFEARRAY_Size 296 stub LPSAFEARRAY_Marshal 297 stub LPSAFEARRAY_Unmarshal -#298 stdcall VarDecCmpR8(ptr double) +298 stdcall VarDecCmpR8(ptr double) 299 stdcall VarCyAdd(long long long long ptr) 303 stdcall VarCyMul(long long long long ptr) 304 stdcall VarCyMulI4(long long long ptr) @@ -335,7 +335,7 @@ 342 stdcall VarI8FromI1(long long) 343 stdcall VarI8FromUI2(long long) 344 stdcall VarI8FromUI4(long long) -#345 stdcall VarI8FromDec(ptr ptr) +345 stdcall VarI8FromDec(ptr ptr) 346 stdcall VarI2FromI8(long long ptr) 347 stdcall VarI2FromUI8(long long ptr) 348 stdcall VarI4FromI8(long long ptr) @@ -354,8 +354,8 @@ 371 stdcall VarBoolFromUI8(long long ptr) 372 stdcall VarUI1FromI8(long long ptr) 373 stdcall VarUI1FromUI8(long long ptr) -#374 stdcall VarDecFromI8(long long ptr) -#375 stdcall VarDecFromUI8(long long ptr) +374 stdcall VarDecFromI8(long long ptr) +375 stdcall VarDecFromUI8(long long ptr) 376 stdcall VarI1FromI8(long long ptr) 377 stdcall VarI1FromUI8(long long ptr) 378 stdcall VarUI2FromI8(long long ptr) @@ -413,4 +413,4 @@ 438 stdcall VarUI8FromI1(long ptr) 439 stdcall VarUI8FromUI2(long ptr) 440 stdcall VarUI8FromUI4(long ptr) -#441 stdcall VarUI8FromDec(long ptr) +441 stdcall VarUI8FromDec(long ptr) diff --git a/reactos/lib/oleaut32/variant.c b/reactos/lib/oleaut32/variant.c index c748de20905..45997f9ac1c 100644 --- a/reactos/lib/oleaut32/variant.c +++ b/reactos/lib/oleaut32/variant.c @@ -43,13 +43,6 @@ #include "variant.h" -#ifdef __REACTOS__ /*FIXME*/ -/* problems with decVal member of VARIANT union in MinGW headers */ -#undef V_DECIMAL -#define V_DECIMAL(X) (X->__VARIANT_NAME_1.decVal) -#endif - - WINE_DEFAULT_DEBUG_CHANNEL(ole); const char* wine_vtypes[VT_CLSID] = @@ -169,9 +162,7 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_DATE: return VarI1FromDate(V_DATE(ps), &V_I1(pd)); case VT_BOOL: return VarI1FromBool(V_BOOL(ps), &V_I1(pd)); case VT_CY: return VarI1FromCy(V_CY(ps), &V_I1(pd)); -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ case VT_DECIMAL: return VarI1FromDec(&V_DECIMAL(ps), &V_I1(pd) ); -#endif case VT_DISPATCH: return VarI1FromDisp(V_DISPATCH(ps), lcid, &V_I1(pd) ); case VT_BSTR: return VarI1FromStr(V_BSTR(ps), lcid, dwFlags, &V_I1(pd) ); } @@ -193,9 +184,7 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_DATE: return VarI2FromDate(V_DATE(ps), &V_I2(pd)); case VT_BOOL: return VarI2FromBool(V_BOOL(ps), &V_I2(pd)); case VT_CY: return VarI2FromCy(V_CY(ps), &V_I2(pd)); -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ case VT_DECIMAL: return VarI2FromDec(&V_DECIMAL(ps), &V_I2(pd)); -#endif case VT_DISPATCH: return VarI2FromDisp(V_DISPATCH(ps), lcid, &V_I2(pd)); case VT_BSTR: return VarI2FromStr(V_BSTR(ps), lcid, dwFlags, &V_I2(pd)); } @@ -217,9 +206,7 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_DATE: return VarI4FromDate(V_DATE(ps), &V_I4(pd)); case VT_BOOL: return VarI4FromBool(V_BOOL(ps), &V_I4(pd)); case VT_CY: return VarI4FromCy(V_CY(ps), &V_I4(pd)); -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ case VT_DECIMAL: return VarI4FromDec(&V_DECIMAL(ps), &V_I4(pd)); -#endif case VT_DISPATCH: return VarI4FromDisp(V_DISPATCH(ps), lcid, &V_I4(pd)); case VT_BSTR: return VarI4FromStr(V_BSTR(ps), lcid, dwFlags, &V_I4(pd)); } @@ -241,9 +228,7 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_DATE: return VarUI1FromDate(V_DATE(ps), &V_UI1(pd)); case VT_BOOL: return VarUI1FromBool(V_BOOL(ps), &V_UI1(pd)); case VT_CY: return VarUI1FromCy(V_CY(ps), &V_UI1(pd)); -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ case VT_DECIMAL: return VarUI1FromDec(&V_DECIMAL(ps), &V_UI1(pd)); -#endif case VT_DISPATCH: return VarUI1FromDisp(V_DISPATCH(ps), lcid, &V_UI1(pd)); case VT_BSTR: return VarUI1FromStr(V_BSTR(ps), lcid, dwFlags, &V_UI1(pd)); } @@ -265,9 +250,7 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_DATE: return VarUI2FromDate(V_DATE(ps), &V_UI2(pd)); case VT_BOOL: return VarUI2FromBool(V_BOOL(ps), &V_UI2(pd)); case VT_CY: return VarUI2FromCy(V_CY(ps), &V_UI2(pd)); -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ case VT_DECIMAL: return VarUI2FromDec(&V_DECIMAL(ps), &V_UI2(pd)); -#endif case VT_DISPATCH: return VarUI2FromDisp(V_DISPATCH(ps), lcid, &V_UI2(pd)); case VT_BSTR: return VarUI2FromStr(V_BSTR(ps), lcid, dwFlags, &V_UI2(pd)); } @@ -289,9 +272,7 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_DATE: return VarUI4FromDate(V_DATE(ps), &V_UI4(pd)); case VT_BOOL: return VarUI4FromBool(V_BOOL(ps), &V_UI4(pd)); case VT_CY: return VarUI4FromCy(V_CY(ps), &V_UI4(pd)); -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ case VT_DECIMAL: return VarUI4FromDec(&V_DECIMAL(ps), &V_UI4(pd)); -#endif case VT_DISPATCH: return VarUI4FromDisp(V_DISPATCH(ps), lcid, &V_UI4(pd)); case VT_BSTR: return VarUI4FromStr(V_BSTR(ps), lcid, dwFlags, &V_UI4(pd)); } @@ -313,9 +294,7 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_DATE: return VarUI8FromDate(V_DATE(ps), &V_UI8(pd)); case VT_BOOL: return VarUI8FromBool(V_BOOL(ps), &V_UI8(pd)); case VT_CY: return VarUI8FromCy(V_CY(ps), &V_UI8(pd)); -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ case VT_DECIMAL: return VarUI8FromDec(&V_DECIMAL(ps), &V_UI8(pd)); -#endif case VT_DISPATCH: return VarUI8FromDisp(V_DISPATCH(ps), lcid, &V_UI8(pd)); case VT_BSTR: return VarUI8FromStr(V_BSTR(ps), lcid, dwFlags, &V_UI8(pd)); } @@ -337,9 +316,7 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_DATE: return VarI8FromDate(V_DATE(ps), &V_I8(pd)); case VT_BOOL: return VarI8FromBool(V_BOOL(ps), &V_I8(pd)); case VT_CY: return VarI8FromCy(V_CY(ps), &V_I8(pd)); -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ case VT_DECIMAL: return VarI8FromDec(&V_DECIMAL(ps), &V_I8(pd)); -#endif case VT_DISPATCH: return VarI8FromDisp(V_DISPATCH(ps), lcid, &V_I8(pd)); case VT_BSTR: return VarI8FromStr(V_BSTR(ps), lcid, dwFlags, &V_I8(pd)); } @@ -361,9 +338,7 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_DATE: return VarR4FromDate(V_DATE(ps), &V_R4(pd)); case VT_BOOL: return VarR4FromBool(V_BOOL(ps), &V_R4(pd)); case VT_CY: return VarR4FromCy(V_CY(ps), &V_R4(pd)); -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ case VT_DECIMAL: return VarR4FromDec(&V_DECIMAL(ps), &V_R4(pd)); -#endif case VT_DISPATCH: return VarR4FromDisp(V_DISPATCH(ps), lcid, &V_R4(pd)); case VT_BSTR: return VarR4FromStr(V_BSTR(ps), lcid, dwFlags, &V_R4(pd)); } @@ -385,9 +360,7 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_DATE: return VarR8FromDate(V_DATE(ps), &V_R8(pd)); case VT_BOOL: return VarR8FromBool(V_BOOL(ps), &V_R8(pd)); case VT_CY: return VarR8FromCy(V_CY(ps), &V_R8(pd)); -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ case VT_DECIMAL: return VarR8FromDec(&V_DECIMAL(ps), &V_R8(pd)); -#endif case VT_DISPATCH: return VarR8FromDisp(V_DISPATCH(ps), lcid, &V_R8(pd)); case VT_BSTR: return VarR8FromStr(V_BSTR(ps), lcid, dwFlags, &V_R8(pd)); } @@ -409,9 +382,7 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_R8: return VarDateFromR8(V_R8(ps), &V_DATE(pd)); case VT_BOOL: return VarDateFromBool(V_BOOL(ps), &V_DATE(pd)); case VT_CY: return VarDateFromCy(V_CY(ps), &V_DATE(pd)); -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ case VT_DECIMAL: return VarDateFromDec(&V_DECIMAL(ps), &V_DATE(pd)); -#endif case VT_DISPATCH: return VarDateFromDisp(V_DISPATCH(ps), lcid, &V_DATE(pd)); case VT_BSTR: return VarDateFromStr(V_BSTR(ps), lcid, dwFlags, &V_DATE(pd)); } @@ -433,9 +404,7 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_R8: return VarBoolFromR8(V_R8(ps), &V_BOOL(pd)); case VT_DATE: return VarBoolFromDate(V_DATE(ps), &V_BOOL(pd)); case VT_CY: return VarBoolFromCy(V_CY(ps), &V_BOOL(pd)); -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ case VT_DECIMAL: return VarBoolFromDec(&V_DECIMAL(ps), &V_BOOL(pd)); -#endif case VT_DISPATCH: return VarBoolFromDisp(V_DISPATCH(ps), lcid, &V_BOOL(pd)); case VT_BSTR: return VarBoolFromStr(V_BSTR(ps), lcid, dwFlags, &V_BOOL(pd)); } @@ -463,9 +432,7 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_R8: return VarBstrFromR8(V_R8(ps), lcid, dwFlags, &V_BSTR(pd)); case VT_DATE: return VarBstrFromDate(V_DATE(ps), lcid, dwFlags, &V_BSTR(pd)); case VT_CY: return VarBstrFromCy(V_CY(ps), lcid, dwFlags, &V_BSTR(pd)); -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ case VT_DECIMAL: return VarBstrFromDec(&V_DECIMAL(ps), lcid, dwFlags, &V_BSTR(pd)); -#endif /* case VT_DISPATCH: return VarBstrFromDisp(V_DISPATCH(ps), lcid, dwFlags, &V_BSTR(pd)); */ } break; @@ -486,10 +453,8 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_R8: return VarCyFromR8(V_R8(ps), &V_CY(pd)); case VT_DATE: return VarCyFromDate(V_DATE(ps), &V_CY(pd)); case VT_BOOL: return VarCyFromBool(V_BOOL(ps), &V_CY(pd)); -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ case VT_DECIMAL: return VarCyFromDec(&V_DECIMAL(ps), &V_CY(pd)); -#endif case VT_DISPATCH: return VarCyFromDisp(V_DISPATCH(ps), lcid, &V_CY(pd)); case VT_BSTR: return VarCyFromStr(V_BSTR(ps), lcid, dwFlags, &V_CY(pd)); } @@ -499,7 +464,6 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, switch (vtFrom) { case VT_EMPTY: -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_MID32 */ case VT_BOOL: DEC_SIGNSCALE(&V_DECIMAL(pd)) = SIGNSCALE(DECIMAL_POS,0); DEC_HI32(&V_DECIMAL(pd)) = 0; @@ -523,7 +487,6 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, case VT_CY: return VarDecFromCy(V_CY(pd), &V_DECIMAL(ps)); case VT_DISPATCH: return VarDecFromDisp(V_DISPATCH(ps), lcid, &V_DECIMAL(ps)); case VT_BSTR: return VarDecFromStr(V_BSTR(ps), lcid, dwFlags, &V_DECIMAL(pd)); -#endif } break; @@ -640,14 +603,12 @@ HRESULT WINAPI VariantClear(VARIANTARG* pVarg) { if (!V_ISBYREF(pVarg)) { -#ifndef __REACTOS__ /*FIXME: no safearray yet */ if (V_ISARRAY(pVarg) || V_VT(pVarg) == VT_SAFEARRAY) { if (V_ARRAY(pVarg)) hres = SafeArrayDestroy(V_ARRAY(pVarg)); } else -#endif if (V_VT(pVarg) == VT_BSTR) { if (V_BSTR(pVarg)) @@ -763,14 +724,12 @@ HRESULT WINAPI VariantCopy(VARIANTARG* pvargDest, VARIANTARG* pvargSrc) if (!V_ISBYREF(pvargSrc)) { -#ifndef __REACTOS__ /*FIXME: no safearray yet */ if (V_ISARRAY(pvargSrc)) { if (V_ARRAY(pvargSrc)) hres = SafeArrayCopy(V_ARRAY(pvargSrc), &V_ARRAY(pvargDest)); } else -#endif if (V_VT(pvargSrc) == VT_BSTR) { if (V_BSTR(pvargSrc)) @@ -900,14 +859,12 @@ HRESULT WINAPI VariantCopyInd(VARIANT* pvargDest, VARIANTARG* pvargSrc) } } -#ifndef __REACTOS__ /*FIXME: no safearray yet */ if (V_ISARRAY(pSrc)) { /* Native doesn't check that *V_ARRAYREF(pSrc) is valid */ hres = SafeArrayCopy(*V_ARRAYREF(pSrc), &V_ARRAY(pvargDest)); } else -#endif if (V_VT(pSrc) == (VT_BSTR|VT_BYREF)) { /* Native doesn't check that *V_BSTRREF(pSrc) is valid */ @@ -2083,7 +2040,6 @@ HRESULT WINAPI VarNumFromParseNum(NUMPARSE *pNumprs, BYTE *rgbDig, V_I8(pVarDst) = -ul64; return S_OK; } -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO64 */ else if ((dwVtBits & REAL_VTBITS) == VTBIT_DECIMAL) { /* Decimal is only output choice left - fast path */ @@ -2093,7 +2049,6 @@ HRESULT WINAPI VarNumFromParseNum(NUMPARSE *pNumprs, BYTE *rgbDig, DEC_LO64(&V_DECIMAL(pVarDst)) = -ul64; return S_OK; } -#endif } } else if (!bOverflow) @@ -2147,7 +2102,6 @@ HRESULT WINAPI VarNumFromParseNum(NUMPARSE *pNumprs, BYTE *rgbDig, V_UI8(pVarDst) = ul64; return S_OK; } -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO64 */ else if ((dwVtBits & REAL_VTBITS) == VTBIT_DECIMAL) { /* Decimal is only output choice left - fast path */ @@ -2157,7 +2111,6 @@ HRESULT WINAPI VarNumFromParseNum(NUMPARSE *pNumprs, BYTE *rgbDig, DEC_LO64(&V_DECIMAL(pVarDst)) = ul64; return S_OK; } -#endif } } @@ -2252,7 +2205,6 @@ HRESULT WINAPI VarNumFromParseNum(NUMPARSE *pNumprs, BYTE *rgbDig, } } -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO64 */ if (dwVtBits & VTBIT_DECIMAL) { int i; @@ -2310,7 +2262,6 @@ VarNumFromParseNum_DecOverflow: V_VT(pVarDst) = VT_DECIMAL; return S_OK; } -#endif return DISP_E_OVERFLOW; /* No more output choices */ } @@ -3443,7 +3394,6 @@ HRESULT WINAPI VarNot(LPVARIANT pVarIn, LPVARIANT pVarOut) case VT_BOOL: case VT_I2: V_I2(pVarOut) = ~V_I2(pVarIn); break; case VT_UI2: V_UI2(pVarOut) = ~V_UI2(pVarIn); break; -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ case VT_DECIMAL: hRet = VarI4FromDec(&V_DECIMAL(pVarIn), &V_I4(&varIn)); if (FAILED(hRet)) @@ -3451,7 +3401,6 @@ HRESULT WINAPI VarNot(LPVARIANT pVarIn, LPVARIANT pVarOut) pVarIn = &varIn; V_VT(pVarOut) = VT_I4; /* Fall through ... */ -#endif case VT_INT: case VT_I4: V_I4(pVarOut) = ~V_I4(pVarIn); break; case VT_UINT: diff --git a/reactos/lib/oleaut32/variant.h b/reactos/lib/oleaut32/variant.h index 377939232ad..e096f8e8c3e 100644 --- a/reactos/lib/oleaut32/variant.h +++ b/reactos/lib/oleaut32/variant.h @@ -82,13 +82,15 @@ extern const char* wine_vflags[]; #endif /* Macros for getting at a DECIMAL's parts */ +#ifndef DEC_LO64 #define DEC_SIGN(d) ((d)->u.s.sign) #define DEC_SCALE(d) ((d)->u.s.scale) #define DEC_SIGNSCALE(d) ((d)->u.signscale) #define DEC_HI32(d) ((d)->Hi32) -#define DEC_MID32(d) ((d)->u1.s1.Mid32) -#define DEC_LO32(d) ((d)->u1.s1.Lo32) -#define DEC_LO64(d) ((d)->u1.Lo64) +#define DEC_MID32(d) ((d)->DUMMYUNIONNAME2.DUMMYSTRUCTNAME2.Mid32) +#define DEC_LO32(d) ((d)->DUMMYUNIONNAME2.DUMMYSTRUCTNAME2.Lo32) +#define DEC_LO64(d) ((d)->DUMMYUNIONNAME2.Lo64) +#endif #define DEC_MAX_SCALE 28 /* Maximum scale for a decimal */ diff --git a/reactos/lib/oleaut32/vartype.c b/reactos/lib/oleaut32/vartype.c index e445720f7a6..e40318a9b8e 100644 --- a/reactos/lib/oleaut32/vartype.c +++ b/reactos/lib/oleaut32/vartype.c @@ -30,13 +30,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(ole); -#ifdef __REACTOS__ /*FIXME*/ -/* problems with decVal member of VARIANT union in MinGW headers */ -#undef V_DECIMAL -#define V_DECIMAL(X) (X->__VARIANT_NAME_1.decVal) -#endif - - extern HMODULE OLEAUT32_hModule; static const WCHAR szFloatFormatW[] = { '%','.','7','G','\0' }; @@ -388,7 +381,6 @@ HRESULT WINAPI VarI1FromUI4(ULONG ulIn, signed char* pcOut) * Failure: E_INVALIDARG, if the source value is invalid * DISP_E_OVERFLOW, if the value will not fit in the destination */ -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_MID32 */ HRESULT WINAPI VarI1FromDec(DECIMAL *pdecIn, signed char* pcOut) { LONG64 i64; @@ -400,7 +392,6 @@ HRESULT WINAPI VarI1FromDec(DECIMAL *pdecIn, signed char* pcOut) hRet = _VarI1FromI8(i64, pcOut); return hRet; } -#endif /************************************************************************ * VarI1FromI8 (OLEAUT32.376) @@ -701,7 +692,6 @@ HRESULT WINAPI VarUI1FromUI4(ULONG ulIn, BYTE* pbOut) * Failure: E_INVALIDARG, if the source value is invalid * DISP_E_OVERFLOW, if the value will not fit in the destination */ -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_MID32 */ HRESULT WINAPI VarUI1FromDec(DECIMAL *pdecIn, BYTE* pbOut) { LONG64 i64; @@ -713,7 +703,6 @@ HRESULT WINAPI VarUI1FromDec(DECIMAL *pdecIn, BYTE* pbOut) hRet = _VarUI1FromI8(i64, pbOut); return hRet; } -#endif /************************************************************************ * VarUI1FromI8 (OLEAUT32.372) @@ -1000,7 +989,6 @@ HRESULT WINAPI VarI2FromUI4(ULONG ulIn, SHORT* psOut) * Failure: E_INVALIDARG, if the source value is invalid * DISP_E_OVERFLOW, if the value will not fit in the destination */ -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO64 */ HRESULT WINAPI VarI2FromDec(DECIMAL *pdecIn, SHORT* psOut) { LONG64 i64; @@ -1012,7 +1000,6 @@ HRESULT WINAPI VarI2FromDec(DECIMAL *pdecIn, SHORT* psOut) hRet = _VarI2FromI8(i64, psOut); return hRet; } -#endif /************************************************************************ * VarI2FromI8 (OLEAUT32.346) @@ -1299,7 +1286,6 @@ HRESULT WINAPI VarUI2FromUI4(ULONG ulIn, USHORT* pusOut) * Failure: E_INVALIDARG, if the source value is invalid * DISP_E_OVERFLOW, if the value will not fit in the destination */ -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_MID32 */ HRESULT WINAPI VarUI2FromDec(DECIMAL *pdecIn, USHORT* pusOut) { LONG64 i64; @@ -1311,7 +1297,6 @@ HRESULT WINAPI VarUI2FromDec(DECIMAL *pdecIn, USHORT* pusOut) hRet = _VarUI2FromI8(i64, pusOut); return hRet; } -#endif /************************************************************************ * VarUI2FromI8 (OLEAUT32.378) @@ -1593,7 +1578,6 @@ HRESULT WINAPI VarI4FromUI4(ULONG ulIn, LONG *piOut) * Failure: E_INVALIDARG, if pdecIn is invalid * DISP_E_OVERFLOW, if the value will not fit in the destination */ -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_MID32 */ HRESULT WINAPI VarI4FromDec(DECIMAL *pdecIn, LONG *piOut) { LONG64 i64; @@ -1605,7 +1589,6 @@ HRESULT WINAPI VarI4FromDec(DECIMAL *pdecIn, LONG *piOut) hRet = _VarI4FromI8(i64, piOut); return hRet; } -#endif /************************************************************************ * VarI4FromI8 (OLEAUT32.348) @@ -1888,7 +1871,6 @@ HRESULT WINAPI VarUI4FromUI2(USHORT usIn, ULONG *pulOut) * Failure: E_INVALIDARG, if pdecIn is invalid * DISP_E_OVERFLOW, if the value will not fit in the destination */ -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_MID32 */ HRESULT WINAPI VarUI4FromDec(DECIMAL *pdecIn, ULONG *pulOut) { LONG64 i64; @@ -1900,7 +1882,6 @@ HRESULT WINAPI VarUI4FromDec(DECIMAL *pdecIn, ULONG *pulOut) hRet = _VarUI4FromI8(i64, pulOut); return hRet; } -#endif /************************************************************************ * VarUI4FromI8 (OLEAUT32.425) @@ -2214,7 +2195,6 @@ HRESULT WINAPI VarI8FromUI4(ULONG ulIn, LONG64* pi64Out) * Failure: E_INVALIDARG, if the source value is invalid * DISP_E_OVERFLOW, if the value will not fit in the destination */ -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_MID32 */ HRESULT WINAPI VarI8FromDec(DECIMAL *pdecIn, LONG64* pi64Out) { if (!DEC_SCALE(pdecIn)) @@ -2244,7 +2224,6 @@ HRESULT WINAPI VarI8FromDec(DECIMAL *pdecIn, LONG64* pi64Out) return hRet; } } -#endif /************************************************************************ * VarI8FromUI8 (OLEAUT32.427) @@ -2551,7 +2530,6 @@ HRESULT WINAPI VarUI8FromUI4(ULONG ulIn, ULONG64* pui64Out) * with DISP_E_OVERFLOW. This bug has been fixed in Wine's implementation * (use VarAbs() on pDecIn first if you really want this behaviour). */ -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO64 */ HRESULT WINAPI VarUI8FromDec(DECIMAL *pdecIn, ULONG64* pui64Out) { if (!DEC_SCALE(pdecIn)) @@ -2584,7 +2562,6 @@ HRESULT WINAPI VarUI8FromDec(DECIMAL *pdecIn, ULONG64* pui64Out) return hRet; } } -#endif /* R4 */ @@ -2825,7 +2802,6 @@ HRESULT WINAPI VarR4FromUI4(ULONG ulIn, float *pFltOut) * Success: S_OK. * Failure: E_INVALIDARG, if the source value is invalid. */ -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO64 */ HRESULT WINAPI VarR4FromDec(DECIMAL* pDecIn, float *pFltOut) { BYTE scale = DEC_SCALE(pDecIn); @@ -2852,7 +2828,6 @@ HRESULT WINAPI VarR4FromDec(DECIMAL* pDecIn, float *pFltOut) *pFltOut = (double)DEC_LO64(pDecIn) / (double)divisor + highPart; return S_OK; } -#endif /************************************************************************ @@ -3148,7 +3123,6 @@ HRESULT WINAPI VarR8FromUI4(ULONG ulIn, double *pDblOut) * Success: S_OK. * Failure: E_INVALIDARG, if the source value is invalid. */ -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO64 */ HRESULT WINAPI VarR8FromDec(DECIMAL* pDecIn, double *pDblOut) { BYTE scale = DEC_SCALE(pDecIn); @@ -3174,7 +3148,6 @@ HRESULT WINAPI VarR8FromDec(DECIMAL* pDecIn, double *pDblOut) *pDblOut = (double)DEC_LO64(pDecIn) / divisor + highPart; return S_OK; } -#endif /************************************************************************ * VarR8FromI8 (OLEAUT32.362) @@ -3581,7 +3554,6 @@ HRESULT WINAPI VarCyFromUI4(ULONG ulIn, CY* pCyOut) * DISP_E_OVERFLOW, if the value will not fit in the destination * DISP_E_TYPEMISMATCH, if the type cannot be converted */ -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO64 */ HRESULT WINAPI VarCyFromDec(DECIMAL* pdecIn, CY* pCyOut) { DECIMAL rounded; @@ -3604,7 +3576,6 @@ HRESULT WINAPI VarCyFromDec(DECIMAL* pdecIn, CY* pCyOut) } return hRet; } -#endif /************************************************************************ * VarCyFromI8 (OLEAUT32.366) @@ -3972,7 +3943,6 @@ HRESULT WINAPI VarCyMulI8(const CY cyLeft, LONG64 llRight, CY* pCyOut) * RETURNS * S_OK. */ -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO64 */ HRESULT WINAPI VarDecFromUI1(BYTE bIn, DECIMAL* pDecOut) { return _VarDecFromUI1(bIn, pDecOut); @@ -3994,7 +3964,6 @@ HRESULT WINAPI VarDecFromI2(SHORT sIn, DECIMAL* pDecOut) { return _VarDecFromI2(sIn, pDecOut); } -#endif /************************************************************************ * VarDecFromI4 (OLEAUT32.192) @@ -4008,7 +3977,6 @@ HRESULT WINAPI VarDecFromI2(SHORT sIn, DECIMAL* pDecOut) * RETURNS * S_OK. */ -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_MID32 */ HRESULT WINAPI VarDecFromI4(LONG lIn, DECIMAL* pDecOut) { DEC_HI32(pDecOut) = 0; @@ -4026,7 +3994,6 @@ HRESULT WINAPI VarDecFromI4(LONG lIn, DECIMAL* pDecOut) } return S_OK; } -#endif /************************************************************************ * VarDecFromR4 (OLEAUT32.193) @@ -4097,7 +4064,6 @@ HRESULT WINAPI VarDecFromDate(DATE dateIn, DECIMAL* pDecOut) * RETURNS * S_OK. */ -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO64 */ HRESULT WINAPI VarDecFromCy(CY cyIn, DECIMAL* pDecOut) { DEC_HI32(pDecOut) = 0; @@ -4116,7 +4082,6 @@ HRESULT WINAPI VarDecFromCy(CY cyIn, DECIMAL* pDecOut) } return S_OK; } -#endif /************************************************************************ @@ -4173,7 +4138,6 @@ HRESULT WINAPI VarDecFromDisp(IDispatch* pdispIn, LCID lcid, DECIMAL* pDecOut) * NOTES * The value is converted to either 0 (if bIn is FALSE) or -1 (TRUE). */ -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_MID32 */ HRESULT WINAPI VarDecFromBool(VARIANT_BOOL bIn, DECIMAL* pDecOut) { DEC_HI32(pDecOut) = 0; @@ -4224,7 +4188,6 @@ HRESULT WINAPI VarDecFromUI2(USHORT usIn, DECIMAL* pDecOut) { return _VarDecFromUI2(usIn, pDecOut); } -#endif /************************************************************************ * VarDecFromUI4 (OLEAUT32.243) @@ -4238,7 +4201,6 @@ HRESULT WINAPI VarDecFromUI2(USHORT usIn, DECIMAL* pDecOut) * RETURNS * S_OK. */ -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_MID32 */ HRESULT WINAPI VarDecFromUI4(ULONG ulIn, DECIMAL* pDecOut) { DEC_SIGNSCALE(pDecOut) = SIGNSCALE(DECIMAL_POS,0); @@ -4247,7 +4209,6 @@ HRESULT WINAPI VarDecFromUI4(ULONG ulIn, DECIMAL* pDecOut) DEC_LO32(pDecOut) = ulIn; return S_OK; } -#endif /************************************************************************ * VarDecFromI8 (OLEAUT32.374) @@ -4261,7 +4222,6 @@ HRESULT WINAPI VarDecFromUI4(ULONG ulIn, DECIMAL* pDecOut) * RETURNS * S_OK. */ -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO64 */ HRESULT WINAPI VarDecFromI8(LONG64 llIn, DECIMAL* pDecOut) { PULARGE_INTEGER pLi = (PULARGE_INTEGER)&llIn; @@ -4282,7 +4242,6 @@ HRESULT WINAPI VarDecFromI8(LONG64 llIn, DECIMAL* pDecOut) } return S_OK; } -#endif /************************************************************************ * VarDecFromUI8 (OLEAUT32.375) @@ -4296,7 +4255,6 @@ HRESULT WINAPI VarDecFromI8(LONG64 llIn, DECIMAL* pDecOut) * RETURNS * S_OK. */ -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO64 */ HRESULT WINAPI VarDecFromUI8(ULONG64 ullIn, DECIMAL* pDecOut) { DEC_SIGNSCALE(pDecOut) = SIGNSCALE(DECIMAL_POS,0); @@ -4304,9 +4262,7 @@ HRESULT WINAPI VarDecFromUI8(ULONG64 ullIn, DECIMAL* pDecOut) DEC_LO64(pDecOut) = ullIn; return S_OK; } -#endif -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ /* Make two DECIMALS the same scale; used by math functions below */ static HRESULT VARIANT_DecScale(const DECIMAL** ppDecLeft, const DECIMAL** ppDecRight, @@ -4352,7 +4308,6 @@ static HRESULT VARIANT_DecScale(const DECIMAL** ppDecLeft, DEC_SCALE(pDecOut) += scaleAmount; /* Set the new scale */ return hRet; } -#endif /* Add two unsigned 32 bit values with overflow */ static ULONG VARIANT_Add(ULONG ulLeft, ULONG ulRight, ULONG* pulHigh) @@ -4398,7 +4353,6 @@ static ULONG VARIANT_Mul(ULONG ulLeft, ULONG ulRight, ULONG* pulHigh) return ul64.u.LowPart; } -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO64 */ /* Compare two decimals that have the same scale */ static inline int VARIANT_DecCmp(const DECIMAL *pDecLeft, const DECIMAL *pDecRight) { @@ -4409,7 +4363,6 @@ static inline int VARIANT_DecCmp(const DECIMAL *pDecLeft, const DECIMAL *pDecRig return 0; return 1; } -#endif /************************************************************************ * VarDecAdd (OLEAUT32.177) @@ -4425,7 +4378,6 @@ static inline int VARIANT_DecCmp(const DECIMAL *pDecLeft, const DECIMAL *pDecRig * Success: S_OK. * Failure: DISP_E_OVERFLOW, if the value will not fit in the destination */ -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ HRESULT WINAPI VarDecAdd(const DECIMAL* pDecLeft, const DECIMAL* pDecRight, DECIMAL* pDecOut) { HRESULT hRet; @@ -4496,7 +4448,6 @@ VarDecAdd_AsPositive: } return hRet; } -#endif /************************************************************************ * VarDecDiv (OLEAUT32.178) @@ -4532,7 +4483,6 @@ HRESULT WINAPI VarDecDiv(const DECIMAL* pDecLeft, const DECIMAL* pDecRight, DECI * Success: S_OK. * Failure: DISP_E_OVERFLOW, if the value will not fit in the destination */ -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ HRESULT WINAPI VarDecMul(const DECIMAL* pDecLeft, const DECIMAL* pDecRight, DECIMAL* pDecOut) { /* FIXME: This only allows multiplying by a fixed integer <= 0xffffffff */ @@ -4594,7 +4544,6 @@ HRESULT WINAPI VarDecSub(const DECIMAL* pDecLeft, const DECIMAL* pDecRight, DECI VarDecNeg(pDecRight, &decRight); return VarDecAdd(pDecLeft, &decRight, pDecOut); } -#endif /************************************************************************ * VarDecAbs (OLEAUT32.182) @@ -4739,7 +4688,6 @@ HRESULT WINAPI VarDecRound(const DECIMAL* pDecIn, int cDecimals, DECIMAL* pDecOu * is less than, equal to or greater than pDecRight respectively. * Failure: DISP_E_OVERFLOW, if overflow occurs during the comparason */ -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ HRESULT WINAPI VarDecCmp(const DECIMAL* pDecLeft, const DECIMAL* pDecRight) { HRESULT hRet; @@ -4789,7 +4737,6 @@ HRESULT WINAPI VarDecCmpR8(const DECIMAL* pDecLeft, double dblRight) return hRet; } -#endif /* BOOL */ @@ -5129,7 +5076,6 @@ HRESULT WINAPI VarBoolFromUI4(ULONG ulIn, VARIANT_BOOL *pBoolOut) * Success: S_OK. * Failure: E_INVALIDARG, if pDecIn is invalid. */ -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO32 */ HRESULT WINAPI VarBoolFromDec(DECIMAL* pDecIn, VARIANT_BOOL *pBoolOut) { if (DEC_SCALE(pDecIn) > DEC_MAX_SCALE || (DEC_SIGN(pDecIn) & ~DECIMAL_NEG)) @@ -5141,7 +5087,6 @@ HRESULT WINAPI VarBoolFromDec(DECIMAL* pDecIn, VARIANT_BOOL *pBoolOut) *pBoolOut = VARIANT_FALSE; return S_OK; } -#endif /************************************************************************ * VarBoolFromI8 (OLEAUT32.370) @@ -5650,7 +5595,6 @@ HRESULT WINAPI VarBstrFromUI4(ULONG ulIn, LCID lcid, ULONG dwFlags, BSTR* pbstrO * Failure: E_INVALIDARG, if pbstrOut is invalid. * E_OUTOFMEMORY, if memory allocation fails. */ -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_LO64 */ HRESULT WINAPI VarBstrFromDec(DECIMAL* pDecIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut) { if (!pbstrOut) @@ -5673,7 +5617,6 @@ HRESULT WINAPI VarBstrFromDec(DECIMAL* pDecIn, LCID lcid, ULONG dwFlags, BSTR* p FIXME("semi-stub\n"); return E_INVALIDARG; } -#endif /************************************************************************ * VarBstrFromI8 (OLEAUT32.370) @@ -6578,12 +6521,10 @@ HRESULT WINAPI VarDateFromUI4(ULONG ulIn, DATE* pdateOut) * RETURNS * S_OK. */ -#ifndef __REACTOS__ /*FIXME: problems with MinGW and DEC_MID32 */ HRESULT WINAPI VarDateFromDec(DECIMAL *pdecIn, DATE* pdateOut) { return _VarDateFromDec(pdecIn, pdateOut); } -#endif /****************************************************************************** * VarDateFromI8 (OLEAUT32.364) diff --git a/reactos/w32api/include/oleauto.h b/reactos/w32api/include/oleauto.h index feeb18c988b..e6c19f25a3a 100644 --- a/reactos/w32api/include/oleauto.h +++ b/reactos/w32api/include/oleauto.h @@ -89,7 +89,11 @@ #define V_ARRAY(X) V_UNION(X,parray) #define V_ARRAYREF(X) V_UNION(X,pparray) #define V_BYREF(X) V_UNION(X,byref) -#define V_DECIMAL(X) V_UNION(X,decVal) +#if (__STDC__ && !defined(_FORCENAMELESSUNION)) || defined(NONAMELESSUNION) +#define V_DECIMAL(X) ((X)->n1.decVal) +#else +#define V_DECIMAL(X) ((X)->decVal) +#endif #define V_DECIMALREF(X) V_UNION(X,pdecVal) #define V_I1(X) V_UNION(X,cVal) #ifdef _WIN64 diff --git a/reactos/w32api/include/wtypes.h b/reactos/w32api/include/wtypes.h index 85d1851a8fb..1c6a1acf343 100644 --- a/reactos/w32api/include/wtypes.h +++ b/reactos/w32api/include/wtypes.h @@ -11,11 +11,19 @@ extern "C" { #endif +#define DEC_SIGN(d) ((d)->u.s.sign) +#define DEC_SCALE(d) ((d)->u.s.scale) +#define DEC_SIGNSCALE(d) ((d)->u.signscale) +#define DEC_HI32(d) ((d)->Hi32) +#define DEC_MID32(d) ((d)->DUMMYUNIONNAME2.DUMMYSTRUCTNAME2.Mid32) +#define DEC_LO32(d) ((d)->DUMMYUNIONNAME2.DUMMYSTRUCTNAME2.Lo32) +#define DEC_LO64(d) ((d)->DUMMYUNIONNAME2.Lo64) + #define IID_NULL GUID_NULL #define CLSID_NULL GUID_NULL #define CBPCLIPDATA(d) ((d).cbSize-sizeof((d).ulClipFmt)) #define DECIMAL_NEG ((BYTE)0x80) -#define DECIMAL_SETZERO(d) {(d).Lo64=(d).Hi32=(d).signscale=0;} +#define DECIMAL_SETZERO(d) {DEC_LO64(d)=DEC_HI32(d)=DEC_SIGNSCALE(d)=0;} #define ROTFLAGS_REGISTRATIONKEEPSALIVE 0x01 #define ROTFLAGS_ALLOWANYCLIENT 0x02 From 8a5a082170665a8a2b0113aa78dd98b8785d5f98 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 29 Feb 2004 16:37:23 +0000 Subject: [PATCH 0279/1463] merge WineHQ commits svn path=/trunk/; revision=8489 --- reactos/lib/oleaut32/oleaut32.spec | 2 +- reactos/lib/oleaut32/variant.c | 146 +++++++++++++++++++++++++++-- reactos/lib/oleaut32/vartype.c | 18 +--- 3 files changed, 142 insertions(+), 24 deletions(-) diff --git a/reactos/lib/oleaut32/oleaut32.spec b/reactos/lib/oleaut32/oleaut32.spec index 5a2b1a1cd13..1fcb940fb27 100644 --- a/reactos/lib/oleaut32/oleaut32.spec +++ b/reactos/lib/oleaut32/oleaut32.spec @@ -170,7 +170,7 @@ 172 stdcall VarInt(ptr ptr) 173 stdcall VarNeg(ptr ptr) 174 stdcall VarNot(ptr ptr) -175 stub VarRound # stdcall (ptr long ptr) +175 stdcall VarRound(ptr long ptr) 176 stdcall VarCmp(ptr ptr long long) 177 stdcall VarDecAdd(ptr ptr ptr) 178 stdcall VarDecDiv(ptr ptr ptr) diff --git a/reactos/lib/oleaut32/variant.c b/reactos/lib/oleaut32/variant.c index 45997f9ac1c..8370650b349 100644 --- a/reactos/lib/oleaut32/variant.c +++ b/reactos/lib/oleaut32/variant.c @@ -24,12 +24,8 @@ #include "config.h" -#ifdef HAVE_STRING_H -# include <string.h> -#endif -#ifdef HAVE_STDLIB_H -# include <stdlib.h> -#endif +#include <string.h> +#include <stdlib.h> #include <stdarg.h> #define NONAMELESSUNION @@ -42,7 +38,6 @@ #include "winerror.h" #include "variant.h" - WINE_DEFAULT_DEBUG_CHANNEL(ole); const char* wine_vtypes[VT_CLSID] = @@ -1441,7 +1436,7 @@ HRESULT WINAPI VarUdateFromDate(DATE dateIn, ULONG dwFlags, UDATE *lpUdate) #define GET_NUMBER_TEXT(fld,name) \ buff[0] = 0; \ - if (!GetLocaleInfoW(lcid, lctype|fld, buff, sizeof(WCHAR) * 2)) \ + if (!GetLocaleInfoW(lcid, lctype|fld, buff, 2)) \ WARN("buffer too small for " #fld "\n"); \ else \ if (buff[0]) lpChars->name = buff[0]; \ @@ -1464,7 +1459,7 @@ void VARIANT_GetLocalisedNumberChars(VARIANT_NUMBER_CHARS *lpChars, LCID lcid, D /* Local currency symbols are often 2 characters */ lpChars->cCurrencyLocal2 = '\0'; - switch(GetLocaleInfoW(lcid, lctype|LOCALE_SCURRENCY, buff, sizeof(WCHAR) * 4)) + switch(GetLocaleInfoW(lcid, lctype|LOCALE_SCURRENCY, buff, sizeof(buff)/sizeof(WCHAR))) { case 3: lpChars->cCurrencyLocal2 = buff[1]; /* Fall through */ case 2: lpChars->cCurrencyLocal = buff[0]; @@ -2497,6 +2492,7 @@ HRESULT WINAPI VarAnd(LPVARIANT left, LPVARIANT right, LPVARIANT result) case VT_UI2 : lVal = V_UNION(left,uiVal); resT=VT_I4; break; case VT_UI4 : lVal = V_UNION(left,ulVal); resT=VT_I4; break; case VT_UINT : lVal = V_UNION(left,ulVal); resT=VT_I4; break; + case VT_BOOL : rVal = V_UNION(left,boolVal); resT=VT_I4; break; default: lOk = FALSE; } @@ -2510,6 +2506,7 @@ HRESULT WINAPI VarAnd(LPVARIANT left, LPVARIANT right, LPVARIANT result) case VT_UI2 : rVal = V_UNION(right,uiVal); resT=VT_I4; break; case VT_UI4 : rVal = V_UNION(right,ulVal); resT=VT_I4; break; case VT_UINT : rVal = V_UNION(right,ulVal); resT=VT_I4; break; + case VT_BOOL : rVal = V_UNION(right,boolVal); resT=VT_I4; break; default: rOk = FALSE; } @@ -2944,6 +2941,7 @@ HRESULT WINAPI VarOr(LPVARIANT left, LPVARIANT right, LPVARIANT result) case VT_UI2 : lVal = V_UNION(left,uiVal); resT=VT_I4; break; case VT_UI4 : lVal = V_UNION(left,ulVal); resT=VT_I4; break; case VT_UINT : lVal = V_UNION(left,ulVal); resT=VT_I4; break; + case VT_BOOL : lVal = V_UNION(left,boolVal); resT=VT_I4; break; default: lOk = FALSE; } @@ -2957,6 +2955,7 @@ HRESULT WINAPI VarOr(LPVARIANT left, LPVARIANT right, LPVARIANT result) case VT_UI2 : rVal = V_UNION(right,uiVal); resT=VT_I4; break; case VT_UI4 : rVal = V_UNION(right,ulVal); resT=VT_I4; break; case VT_UINT : rVal = V_UNION(right,ulVal); resT=VT_I4; break; + case VT_BOOL : rVal = V_UNION(right,boolVal); resT=VT_I4; break; default: rOk = FALSE; } @@ -3446,6 +3445,135 @@ HRESULT WINAPI VarNot(LPVARIANT pVarIn, LPVARIANT pVarOut) return hRet; } +/********************************************************************** + * VarRound [OLEAUT32.175] + * + * Perform a round operation on a variant. + * + * PARAMS + * pVarIn [I] Source variant + * deci [I] Number of decimals to round to + * pVarOut [O] Destination for converted value + * + * RETURNS + * Success: S_OK. pVarOut contains the converted value. + * Failure: An HRESULT error code indicating the error. + * + * NOTES + * - Floating point values are rounded to the desired number of decimals. + * - Some integer types are just copied to the return variable. + * - Some other integer types are not handled and fail. + */ +HRESULT WINAPI VarRound(LPVARIANT pVarIn, int deci, LPVARIANT pVarOut) +{ + VARIANT varIn; + HRESULT hRet = S_OK; + float factor; + + TRACE("(%p->(%s%s),%d)\n", pVarIn, debugstr_VT(pVarIn), debugstr_VF(pVarIn), deci); + + switch (V_VT(pVarIn)) + { + /* cases that fail on windows */ + case VT_I1: + case VT_I8: + case VT_UI2: + case VT_UI4: + hRet = DISP_E_BADVARTYPE; + break; + + /* cases just copying in to out */ + case VT_UI1: + V_VT(pVarOut) = V_VT(pVarIn); + V_UI1(pVarOut) = V_UI1(pVarIn); + break; + case VT_I2: + V_VT(pVarOut) = V_VT(pVarIn); + V_I2(pVarOut) = V_I2(pVarIn); + break; + case VT_I4: + V_VT(pVarOut) = V_VT(pVarIn); + V_I4(pVarOut) = V_I4(pVarIn); + break; + case VT_NULL: + V_VT(pVarOut) = V_VT(pVarIn); + /* value unchanged */ + break; + + /* cases that change type */ + case VT_EMPTY: + V_VT(pVarOut) = VT_I2; + V_I2(pVarOut) = 0; + break; + case VT_BOOL: + V_VT(pVarOut) = VT_I2; + V_I2(pVarOut) = V_BOOL(pVarIn); + break; + case VT_BSTR: + hRet = VarR8FromStr(V_BSTR(pVarIn), LOCALE_USER_DEFAULT, 0, &V_R8(&varIn)); + if (FAILED(hRet)) + break; + V_VT(&varIn)=VT_R8; + pVarIn = &varIn; + /* Fall through ... */ + + /* cases we need to do math */ + case VT_R8: + if (V_R8(pVarIn)>0) { + V_R8(pVarOut)=floor(V_R8(pVarIn)*pow(10, deci)+0.5)/pow(10, deci); + } else { + V_R8(pVarOut)=ceil(V_R8(pVarIn)*pow(10, deci)-0.5)/pow(10, deci); + } + V_VT(pVarOut) = V_VT(pVarIn); + break; + case VT_R4: + if (V_R4(pVarIn)>0) { + V_R4(pVarOut)=floor(V_R4(pVarIn)*pow(10, deci)+0.5)/pow(10, deci); + } else { + V_R4(pVarOut)=ceil(V_R4(pVarIn)*pow(10, deci)-0.5)/pow(10, deci); + } + V_VT(pVarOut) = V_VT(pVarIn); + break; + case VT_DATE: + if (V_DATE(pVarIn)>0) { + V_DATE(pVarOut)=floor(V_DATE(pVarIn)*pow(10, deci)+0.5)/pow(10, deci); + } else { + V_DATE(pVarOut)=ceil(V_DATE(pVarIn)*pow(10, deci)-0.5)/pow(10, deci); + } + V_VT(pVarOut) = V_VT(pVarIn); + break; + case VT_CY: + if (deci>3) + factor=1; + else + factor=pow(10, 4-deci); + + if (V_CY(pVarIn).int64>0) { + V_CY(pVarOut).int64=floor(V_CY(pVarIn).int64/factor)*factor; + } else { + V_CY(pVarOut).int64=ceil(V_CY(pVarIn).int64/factor)*factor; + } + V_VT(pVarOut) = V_VT(pVarIn); + break; + + /* cases we don't know yet */ + default: + FIXME("unimplemented part, V_VT(pVarIn) == 0x%X, deci == %d\n", + V_VT(pVarIn) & VT_TYPEMASK, deci); + hRet = DISP_E_BADVARTYPE; + } + + if (FAILED(hRet)) + V_VT(pVarOut) = VT_EMPTY; + + TRACE("returning 0x%08lx (%s%s),%f\n", hRet, debugstr_VT(pVarOut), + debugstr_VF(pVarOut), (V_VT(pVarOut) == VT_R4) ? V_R4(pVarOut) : + (V_VT(pVarOut) == VT_R8) ? V_R8(pVarOut) : 0); + + return hRet; +} + + /********************************************************************** * VarMod [OLEAUT32.154] * diff --git a/reactos/lib/oleaut32/vartype.c b/reactos/lib/oleaut32/vartype.c index e40318a9b8e..219a7b7d977 100644 --- a/reactos/lib/oleaut32/vartype.c +++ b/reactos/lib/oleaut32/vartype.c @@ -29,7 +29,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(ole); - extern HMODULE OLEAUT32_hModule; static const WCHAR szFloatFormatW[] = { '%','.','7','G','\0' }; @@ -44,20 +43,17 @@ static inline void VARIANT_CopyData(const VARIANT *srcVar, VARTYPE vt, void *pOu case VT_UI1: memcpy(pOut, &V_UI1(srcVar), sizeof(BYTE)); break; case VT_BOOL: case VT_I2: - case VT_UI2: memcpy(pOut, &V_UI2(srcVar), sizeof(SHORT)); - break; + case VT_UI2: memcpy(pOut, &V_UI2(srcVar), sizeof(SHORT)); break; case VT_R4: case VT_INT: case VT_I4: case VT_UINT: - case VT_UI4: memcpy(pOut, &V_UI4(srcVar), sizeof (LONG)); - break; + case VT_UI4: memcpy(pOut, &V_UI4(srcVar), sizeof (LONG)); break; case VT_R8: case VT_DATE: case VT_CY: case VT_I8: - case VT_UI8: memcpy(pOut, &V_UI8(srcVar), sizeof (LONG64)); - break; + case VT_UI8: memcpy(pOut, &V_UI8(srcVar), sizeof (LONG64)); break; case VT_INT_PTR: memcpy(pOut, &V_INT_PTR(srcVar), sizeof (INT_PTR)); break; case VT_DECIMAL: memcpy(pOut, &V_DECIMAL(srcVar), sizeof (DECIMAL)); break; default: @@ -1761,7 +1757,6 @@ HRESULT WINAPI VarUI4FromCy(CY cyIn, ULONG *pulOut) return _VarUI4FromR8(d, pulOut); } - /************************************************************************ * VarUI4FromStr (OLEAUT32.277) * @@ -2015,7 +2010,6 @@ HRESULT WINAPI VarI8FromR8(double dblIn, LONG64* pi64Out) return S_OK; } - /************************************************************************ * VarI8FromCy (OLEAUT32.337) * @@ -2829,7 +2823,6 @@ HRESULT WINAPI VarR4FromDec(DECIMAL* pDecIn, float *pFltOut) return S_OK; } - /************************************************************************ * VarR4FromI8 (OLEAUT32.360) * @@ -3454,7 +3447,6 @@ HRESULT WINAPI VarCyFromDisp(IDispatch* pdispIn, LCID lcid, CY* pCyOut) return _VarCyFromDisp(pdispIn, lcid, pCyOut); } - /************************************************************************ * VarCyFromBool (OLEAUT32.106) * @@ -4083,7 +4075,6 @@ HRESULT WINAPI VarDecFromCy(CY cyIn, DECIMAL* pDecOut) return S_OK; } - /************************************************************************ * VarDecFromStr (OLEAUT32.197) * @@ -4710,7 +4701,6 @@ HRESULT WINAPI VarDecCmp(const DECIMAL* pDecLeft, const DECIMAL* pDecRight) return hRet; } - /************************************************************************ * VarDecCmpR8 (OLEAUT32.298) * @@ -5248,7 +5238,7 @@ HRESULT WINAPI VarBstrFromI4(LONG lIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut) if (lIn < 0) { - ul64 = -lIn; + ul64 = (ULONG)-lIn; dwFlags |= VAR_NEGATIVE; } return VARIANT_BstrFromUInt(ul64, lcid, dwFlags, pbstrOut); From bc297296d26484f61bb702975eb6dbaa9bd8c790 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 29 Feb 2004 16:48:02 +0000 Subject: [PATCH 0280/1463] fix SafeArrayCreateVectorEx() svn path=/trunk/; revision=8490 --- reactos/lib/oleaut32/safearray.c | 4 ++-- reactos/w32api/include/oleauto.h | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/reactos/lib/oleaut32/safearray.c b/reactos/lib/oleaut32/safearray.c index c0ebe274ff4..696b192bc1d 100644 --- a/reactos/lib/oleaut32/safearray.c +++ b/reactos/lib/oleaut32/safearray.c @@ -655,7 +655,7 @@ SAFEARRAY* WINAPI SafeArrayCreateEx(VARTYPE vt, UINT cDims, SAFEARRAYBOUND *rgsa * NOTES * See SafeArray. */ -SAFEARRAY* WINAPI SafeArrayCreateVector(VARTYPE vt, LONG lLbound, UINT cElements) /*MF: was ULONG */ +SAFEARRAY* WINAPI SafeArrayCreateVector(VARTYPE vt, LONG lLbound, UINT cElements) { TRACE("(%d->%s,%ld,%ld\n", vt, debugstr_vt(vt), lLbound, cElements); @@ -683,7 +683,7 @@ SAFEARRAY* WINAPI SafeArrayCreateVector(VARTYPE vt, LONG lLbound, UINT cElements * NOTES * See SafeArray. */ -SAFEARRAY* WINAPI SafeArrayCreateVectorEx(VARTYPE vt, LONG lLbound, ULONG cElements, LPVOID pvExtra) +SAFEARRAY* WINAPI SafeArrayCreateVectorEx(VARTYPE vt, LONG lLbound, UINT cElements, LPVOID pvExtra) { ULONG ulSize; IRecordInfo* iRecInfo = (IRecordInfo*)pvExtra; diff --git a/reactos/w32api/include/oleauto.h b/reactos/w32api/include/oleauto.h index e6c19f25a3a..7c2f364a026 100644 --- a/reactos/w32api/include/oleauto.h +++ b/reactos/w32api/include/oleauto.h @@ -226,6 +226,7 @@ WINOLEAUTAPI SafeArrayPutElement(SAFEARRAY*,long*,void*); WINOLEAUTAPI SafeArrayCopy(SAFEARRAY*,SAFEARRAY**); WINOLEAUTAPI SafeArrayPtrOfIndex(SAFEARRAY*,long*,void**); WINOLEAUTAPI_(SAFEARRAY*) SafeArrayCreateVector(VARTYPE,LONG,UINT); +WINOLEAUTAPI_(SAFEARRAY*) SafeArrayCreateVectorEx(VARTYPE,LONG,UINT,LPVOID); WINOLEAUTAPI SafeArrayAllocDescriptorEx(VARTYPE,UINT,SAFEARRAY**); WINOLEAUTAPI SafeArrayGetVartype(SAFEARRAY*,VARTYPE*); WINOLEAUTAPI SafeArraySetRecordInfo(SAFEARRAY*,IRecordInfo*); From 7bb59c906f05b7fe5e9b83069a476ec6921ebc33 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 29 Feb 2004 17:43:41 +0000 Subject: [PATCH 0281/1463] - Fix for race condition that should never happen. svn path=/trunk/; revision=8491 --- reactos/subsys/win32k/ntuser/vis.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/vis.c b/reactos/subsys/win32k/ntuser/vis.c index 402264cb284..e22433d4877 100644 --- a/reactos/subsys/win32k/ntuser/vis.c +++ b/reactos/subsys/win32k/ntuser/vis.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: vis.c,v 1.21 2004/02/26 22:23:54 weiden Exp $ + * $Id: vis.c,v 1.22 2004/02/29 17:43:41 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -87,7 +87,7 @@ VIS_ComputeVisibleRegion( { IntLockRelatives(CurrentWindow); CurrentSibling = CurrentWindow->FirstChild; - while (CurrentSibling != PreviousWindow) + while (CurrentSibling != NULL && CurrentSibling != PreviousWindow) { if (CurrentSibling->Style & WS_VISIBLE) { From 772d5765b7f080759c456a04110e8e375a428a38 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sun, 29 Feb 2004 22:01:21 +0000 Subject: [PATCH 0282/1463] - Fixed the returned values for a data underrun. - Fixed the write count in packet interrupts. svn path=/trunk/; revision=8492 --- reactos/drivers/storage/atapi/atapi.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/reactos/drivers/storage/atapi/atapi.c b/reactos/drivers/storage/atapi/atapi.c index 6abf89be1a8..0248cf2dcfa 100644 --- a/reactos/drivers/storage/atapi/atapi.c +++ b/reactos/drivers/storage/atapi/atapi.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: atapi.c,v 1.46 2004/02/29 12:27:52 hbirr Exp $ +/* $Id: atapi.c,v 1.47 2004/02/29 22:01:21 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS ATAPI miniport driver @@ -2439,10 +2439,15 @@ AtapiCompleteRequest(PATAPI_MINIPORT_EXTENSION DevExt, DPRINT("AtapiCompleteRequest(DevExt %x, SrbStatus %x)\n", DevExt, SrbStatus); Srb->SrbStatus = SrbStatus; - if (SrbStatus != SRB_STATUS_SUCCESS) + if (SrbStatus == SRB_STATUS_ERROR) { Srb->SrbStatus = AtapiErrorToScsi((PVOID)DevExt, Srb); } + else if (SrbStatus == SRB_STATUS_DATA_OVERRUN) + { + Srb->DataTransferLength -= DevExt->DataTransferLength; + } + DevExt->Handler = NULL; ScsiPortNotification(RequestComplete, (PVOID)DevExt, Srb); ScsiPortNotification(NextRequest, (PVOID)DevExt, NULL); @@ -2494,7 +2499,7 @@ AtapiPacketInterrupt(PATAPI_MINIPORT_EXTENSION DevExt) { DPRINT1("AtapiPacketInterrupt: data underrun (%d bytes), command was %02x\n", DevExt->DataTransferLength, Srb->Cdb[0]); - SrbStatus = SRB_STATUS_ERROR; + SrbStatus = SRB_STATUS_DATA_OVERRUN; } else { @@ -2558,7 +2563,6 @@ AtapiPacketInterrupt(PATAPI_MINIPORT_EXTENSION DevExt) else if (Srb->SrbFlags & SRB_FLAGS_DATA_OUT) { DPRINT("write data\n"); - TransferSize = DevExt->TransferSize[Srb->TargetId]; if (DevExt->DataTransferLength < TransferSize) { TransferSize = DevExt->DataTransferLength; @@ -2566,7 +2570,7 @@ AtapiPacketInterrupt(PATAPI_MINIPORT_EXTENSION DevExt) TargetAddress = DevExt->DataBuffer; - DPRINT1("TargetAddress %x, TransferSize %x\n", TargetAddress, TransferSize); + DPRINT("TargetAddress %x, TransferSize %x\n", TargetAddress, TransferSize); DevExt->DataBuffer += TransferSize; DevExt->DataTransferLength -= TransferSize; @@ -2595,13 +2599,13 @@ AtapiNoDataInterrupt(PATAPI_MINIPORT_EXTENSION DevExt) { BYTE Status; - DPRINT1("AtapiNoDataInterrupt()\n"); + DPRINT("AtapiNoDataInterrupt()\n"); Status = IDEReadStatus(DevExt->CommandPortBase); AtapiCompleteRequest(DevExt, (Status & (IDE_SR_DRDY|IDE_SR_BUSY|IDE_SR_ERR|IDE_SR_DRQ)) == IDE_SR_DRDY ? SRB_STATUS_SUCCESS : SRB_STATUS_ERROR); - DPRINT1("AtapiNoDatanterrupt() done!\n"); + DPRINT("AtapiNoDatanterrupt() done!\n"); return TRUE; } From f4ae5098ccb88428e7d91db4c48a5d4ef76d829c Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes <hardon@online.no> Date: Mon, 1 Mar 2004 00:50:56 +0000 Subject: [PATCH 0283/1463] speedup listing items in the treeview svn path=/trunk/; revision=8493 --- reactos/subsys/system/regedit/treeview.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/system/regedit/treeview.c b/reactos/subsys/system/regedit/treeview.c index 55311ccbca2..7f622fd92ca 100644 --- a/reactos/subsys/system/regedit/treeview.c +++ b/reactos/subsys/system/regedit/treeview.c @@ -117,7 +117,12 @@ static HTREEITEM AddEntryToTree(HWND hwndTV, HTREEITEM hParent, LPTSTR label, HK tvi.cChildren = dwChildren; tvi.lParam = (LPARAM)hKey; tvins.u.item = tvi; - tvins.hInsertAfter = (HTREEITEM)(hKey ? TVI_LAST : TVI_SORT); + /* + * Inserting items at front is faster then inserting to back. + * Sorting after inserting each item is painfully slow... + * -Gunnar + */ + tvins.hInsertAfter = TVI_FIRST;//(HTREEITEM)(hKey ? TVI_LAST : TVI_SORT); tvins.hParent = hParent; return TreeView_InsertItem(hwndTV, &tvins); } @@ -151,6 +156,8 @@ static BOOL InitTreeViewItems(HWND hwndTV, LPTSTR pHostName) if (!AddEntryToTree(hwndTV, hRoot, _T("HKEY_USERS"), HKEY_USERS, 1)) return FALSE; if (!AddEntryToTree(hwndTV, hRoot, _T("HKEY_CURRENT_CONFIG"), HKEY_CURRENT_CONFIG, 1)) return FALSE; + SendMessage(hwndTV, TVM_SORTCHILDREN, 0, hRoot); + /* expand and select host name */ TreeView_Expand(hwndTV, hRoot, TVE_EXPAND); TreeView_Select(hwndTV, hRoot, TVGN_CARET); @@ -242,6 +249,9 @@ BOOL OnTreeExpanding(HWND hwndTV, NMTREEVIEW* pnmtv) printf("dwSubCount=%ld, Name=%s\n", dwSubCount, Name); AddEntryToTree(hwndTV, pnmtv->itemNew.hItem, Name, NULL, dwSubCount); } + + SendMessage(hwndTV, TVM_SORTCHILDREN, 0, pnmtv->itemNew.hItem); + RegCloseKey(hNewKey); HeapFree(GetProcessHeap(), 0, Name); From 92215102c2bcad711690effe11ec3a3e88da4eb3 Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes <hardon@online.no> Date: Mon, 1 Mar 2004 01:07:37 +0000 Subject: [PATCH 0284/1463] fix root keys sort order svn path=/trunk/; revision=8494 --- reactos/subsys/system/regedit/treeview.c | 25 +++++++++--------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/reactos/subsys/system/regedit/treeview.c b/reactos/subsys/system/regedit/treeview.c index 7f622fd92ca..bc4cf004aa5 100644 --- a/reactos/subsys/system/regedit/treeview.c +++ b/reactos/subsys/system/regedit/treeview.c @@ -104,7 +104,7 @@ LPCTSTR GetItemPath(HWND hwndTV, HTREEITEM hItem, HKEY* phRootKey) return pathBuffer; } -static HTREEITEM AddEntryToTree(HWND hwndTV, HTREEITEM hParent, LPTSTR label, HKEY hKey, DWORD dwChildren) +static HTREEITEM AddEntryToTree(HWND hwndTV, HTREEITEM hParent, LPTSTR label, HKEY hKey, DWORD dwChildren, HTREEITEM insAfter ) { TVITEM tvi; TVINSERTSTRUCT tvins; @@ -117,12 +117,7 @@ static HTREEITEM AddEntryToTree(HWND hwndTV, HTREEITEM hParent, LPTSTR label, HK tvi.cChildren = dwChildren; tvi.lParam = (LPARAM)hKey; tvins.u.item = tvi; - /* - * Inserting items at front is faster then inserting to back. - * Sorting after inserting each item is painfully slow... - * -Gunnar - */ - tvins.hInsertAfter = TVI_FIRST;//(HTREEITEM)(hKey ? TVI_LAST : TVI_SORT); + tvins.hInsertAfter = insAfter; tvins.hParent = hParent; return TreeView_InsertItem(hwndTV, &tvins); } @@ -150,13 +145,11 @@ static BOOL InitTreeViewItems(HWND hwndTV, LPTSTR pHostName) /* Add the item to the tree view control. */ if (!(hRoot = TreeView_InsertItem(hwndTV, &tvins))) return FALSE; - if (!AddEntryToTree(hwndTV, hRoot, _T("HKEY_CLASSES_ROOT"), HKEY_CLASSES_ROOT, 1)) return FALSE; - if (!AddEntryToTree(hwndTV, hRoot, _T("HKEY_CURRENT_USER"), HKEY_CURRENT_USER, 1)) return FALSE; - if (!AddEntryToTree(hwndTV, hRoot, _T("HKEY_LOCAL_MACHINE"), HKEY_LOCAL_MACHINE, 1)) return FALSE; - if (!AddEntryToTree(hwndTV, hRoot, _T("HKEY_USERS"), HKEY_USERS, 1)) return FALSE; - if (!AddEntryToTree(hwndTV, hRoot, _T("HKEY_CURRENT_CONFIG"), HKEY_CURRENT_CONFIG, 1)) return FALSE; - - SendMessage(hwndTV, TVM_SORTCHILDREN, 0, hRoot); + if (!AddEntryToTree(hwndTV, hRoot, _T("HKEY_CLASSES_ROOT"), HKEY_CLASSES_ROOT, 1, TVI_LAST)) return FALSE; + if (!AddEntryToTree(hwndTV, hRoot, _T("HKEY_CURRENT_USER"), HKEY_CURRENT_USER, 1, TVI_LAST)) return FALSE; + if (!AddEntryToTree(hwndTV, hRoot, _T("HKEY_LOCAL_MACHINE"), HKEY_LOCAL_MACHINE, 1, TVI_LAST)) return FALSE; + if (!AddEntryToTree(hwndTV, hRoot, _T("HKEY_USERS"), HKEY_USERS, 1, TVI_LAST)) return FALSE; + if (!AddEntryToTree(hwndTV, hRoot, _T("HKEY_CURRENT_CONFIG"), HKEY_CURRENT_CONFIG, 1, TVI_LAST)) return FALSE; /* expand and select host name */ TreeView_Expand(hwndTV, hRoot, TVE_EXPAND); @@ -247,10 +240,10 @@ BOOL OnTreeExpanding(HWND hwndTV, NMTREEVIEW* pnmtv) } if (errCode != ERROR_SUCCESS) dwSubCount = 0; printf("dwSubCount=%ld, Name=%s\n", dwSubCount, Name); - AddEntryToTree(hwndTV, pnmtv->itemNew.hItem, Name, NULL, dwSubCount); + AddEntryToTree(hwndTV, pnmtv->itemNew.hItem, Name, NULL, dwSubCount, TVI_FIRST); } - SendMessage(hwndTV, TVM_SORTCHILDREN, 0, pnmtv->itemNew.hItem); + SendMessage(hwndTV, TVM_SORTCHILDREN, 0, (LPARAM)pnmtv->itemNew.hItem); RegCloseKey(hNewKey); HeapFree(GetProcessHeap(), 0, Name); From b5647b11fd053f33887d0e939e46220904565708 Mon Sep 17 00:00:00 2001 From: Vizzini <vizzini@plasmic.com> Date: Mon, 1 Mar 2004 06:37:26 +0000 Subject: [PATCH 0285/1463] First import of in-progress floppy driver replacement. Still needs some debugging and feature improvements, and the kernel needs a bit of work to get this driver loading on ReactOS. svn path=/trunk/; revision=8495 --- reactos/drivers/storage/floppy/GNUmakefile | 34 + reactos/drivers/storage/floppy/Makefile | 32 + reactos/drivers/storage/floppy/SOURCES | 30 + reactos/drivers/storage/floppy/csqrtns.c | 171 +++ reactos/drivers/storage/floppy/csqrtns.h | 59 ++ reactos/drivers/storage/floppy/floppy.c | 1121 ++++++++++++++++++++ reactos/drivers/storage/floppy/floppy.h | 145 +++ reactos/drivers/storage/floppy/floppy.rc | 62 ++ reactos/drivers/storage/floppy/hardware.c | 1117 +++++++++++++++++++ reactos/drivers/storage/floppy/hardware.h | 336 ++++++ reactos/drivers/storage/floppy/ioctl.c | 250 +++++ reactos/drivers/storage/floppy/ioctl.h | 31 + reactos/drivers/storage/floppy/readwrite.c | 710 +++++++++++++ reactos/drivers/storage/floppy/readwrite.h | 32 + 14 files changed, 4130 insertions(+) create mode 100644 reactos/drivers/storage/floppy/GNUmakefile create mode 100644 reactos/drivers/storage/floppy/Makefile create mode 100644 reactos/drivers/storage/floppy/SOURCES create mode 100644 reactos/drivers/storage/floppy/csqrtns.c create mode 100644 reactos/drivers/storage/floppy/csqrtns.h create mode 100644 reactos/drivers/storage/floppy/floppy.c create mode 100644 reactos/drivers/storage/floppy/floppy.h create mode 100644 reactos/drivers/storage/floppy/floppy.rc create mode 100644 reactos/drivers/storage/floppy/hardware.c create mode 100644 reactos/drivers/storage/floppy/hardware.h create mode 100644 reactos/drivers/storage/floppy/ioctl.c create mode 100644 reactos/drivers/storage/floppy/ioctl.h create mode 100644 reactos/drivers/storage/floppy/readwrite.c create mode 100644 reactos/drivers/storage/floppy/readwrite.h diff --git a/reactos/drivers/storage/floppy/GNUmakefile b/reactos/drivers/storage/floppy/GNUmakefile new file mode 100644 index 00000000000..0b774a5d644 --- /dev/null +++ b/reactos/drivers/storage/floppy/GNUmakefile @@ -0,0 +1,34 @@ +# ReactOS Floppy Driver +# Copyright (C) 2004, Vizzini (vizzini@plasmic.com) +# +# 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 Floppy Driver +# FILE: GNUMakefile +# PURPOSE: Makefile for ReactOS build system +# PROGRAMMER: Vizzini (vizzini@plasmic.com) +# REVISIONS: +# 15-Feb-2004 vizzini - Created/ + +PATH_TO_TOP = ../../.. +TARGET_TYPE = driver +TARGET_NAME = floppy +TARGET_CFLAGS = -Wall -Werror +TARGET_OBJECTS = floppy.o csqrtns.o hardware.o readwrite.o ioctl.o +TARGET_DDKLIBS = csq.a + +include $(PATH_TO_TOP)/rules.mak +include $(TOOLS_PATH)/helper.mk + diff --git a/reactos/drivers/storage/floppy/Makefile b/reactos/drivers/storage/floppy/Makefile new file mode 100644 index 00000000000..7fea2396cea --- /dev/null +++ b/reactos/drivers/storage/floppy/Makefile @@ -0,0 +1,32 @@ +# ReactOS Floppy Driver +# Copyright (C) 2004, Vizzini (vizzini@plasmic.com) +# +# 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 Floppy Driver +# FILE: Makefile +# PURPOSE: Makefile for Microsoft DDK build system +# PROGRAMMER: Vizzini (vizzini@plasmic.com) +# REVISIONS: +# 15-Feb-2004 vizzini - Created/ +# +# MAKEFILE for ARTICLE +# +# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source +# file to this component. This file merely indirects to the real make file +# that is shared by all the driver components of the Windows NT DDK +# + +!INCLUDE $(NTMAKEENV)\makefile.def diff --git a/reactos/drivers/storage/floppy/SOURCES b/reactos/drivers/storage/floppy/SOURCES new file mode 100644 index 00000000000..3c1e43ac684 --- /dev/null +++ b/reactos/drivers/storage/floppy/SOURCES @@ -0,0 +1,30 @@ +# ReactOS Floppy Driver +# Copyright (C) 2004, Vizzini (vizzini@plasmic.com) +# +# 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 Floppy Driver +# FILE: SOURCES +# PURPOSE: SOURCES file for Microsoft DDK build system +# PROGRAMMER: Vizzini (vizzini@plasmic.com) +# REVISIONS: +# 15-Feb-2004 vizzini - Created/ + +TARGETNAME=floppy +TARGETTYPE=DRIVER +TARGETPATH=obj +TARGETLIBS= $(DDK_LIB_PATH)\csq.lib +SOURCES= floppy.c csqrtns.c hardware.c readwrite.c ioctl.c +MSC_WARNING_LEVEL=/W3 /WX diff --git a/reactos/drivers/storage/floppy/csqrtns.c b/reactos/drivers/storage/floppy/csqrtns.c new file mode 100644 index 00000000000..69c7c82643a --- /dev/null +++ b/reactos/drivers/storage/floppy/csqrtns.c @@ -0,0 +1,171 @@ +/* + * ReactOS Floppy Driver + * Copyright (C) 2004, Vizzini (vizzini@plasmic.com) + * + * 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 Floppy Driver + * FILE: csqrtns.c + * PURPOSE: Cancel-safe queue routines + * PROGRAMMER: Vizzini (vizzini@plasmic.com) + * REVISIONS: + * 15-Feb-2004 vizzini - Created + * NOTES: + * - These functions provide the callbacks for the CSQ routines. + * They will be called automatically by the IoCsqXxx() routines. + * This driver uses the CSQ in the standard way. In addition to + * queuing and de-queuing IRPs, the InsertIrp routine releases + * a semaphore every time an IRP is queued, allowing a queue management + * thread to properly drain the queue. + * - Note that the semaphore can get ahead of the number of IRPs in the + * queue if any are canceled; the queue management thread that de-queues + * IRPs is coded with that in mind. + * - For more information, see the csqtest driver in the ReactOS tree, + * or the cancel sample in recent (3790+) Microsoft DDKs. + * - Many of these routines are called at DISPATCH_LEVEL, due to the fact + * that my lock choice is a spin lock. + */ + +#include <ntddk.h> + +#include "floppy.h" +#include "csqrtns.h" + +/* Global CSQ struct that the CSQ functions initialize and use */ +IO_CSQ Csq; + +/* List and lock for the actual IRP queue */ +LIST_ENTRY IrpQueue; +KSPIN_LOCK IrpQueueLock; +KSEMAPHORE QueueSemaphore; + +/* + * CSQ Callbacks + */ + + +VOID NTAPI CsqRemoveIrp(PIO_CSQ Csq, + PIRP Irp) +/* + * FUNCTION: Remove an IRP from the queue + * ARGUMENTS: + * Csq: Pointer to CSQ context structure + * Irp: Pointer to the IRP to remove from the queue + * NOTES: + * - Called under the protection of the queue lock + */ +{ + KdPrint(("CSQ: Removing IRP 0x%x\n", Irp)); + RemoveEntryList(&Irp->Tail.Overlay.ListEntry); +} + + +PIRP NTAPI CsqPeekNextIrp(PIO_CSQ Csq, + PIRP Irp, + PVOID PeekContext) +/* + * FUNCTION: Remove the next IRP from the queue + * ARGUMENTS: + * Csq: Pointer to CSQ context structure + * Irp: Pointer to a starting IRP in the queue (i.e. start search here) + * PeekContext: Unused + * RETURNS: + * Pointer to an IRP that is next in line to be removed, if one can be found + * NOTES: + * - This does *not* remove the IRP from the queue; it merely returns a pointer. + * - Called under the protection of the queue lock + */ +{ + KdPrint(("CSQ: Peeking for next IRP\n")); + + if(Irp) + return CONTAINING_RECORD(&Irp->Tail.Overlay.ListEntry.Flink, IRP, Tail.Overlay.ListEntry); + + if(IsListEmpty(&IrpQueue)) + return NULL; + + return CONTAINING_RECORD(IrpQueue.Flink, IRP, Tail.Overlay.ListEntry); +} + + +VOID NTAPI CsqAcquireLock(PIO_CSQ Csq, + PKIRQL Irql) +/* + * FUNCTION: Acquire the queue lock + * ARGUMENTS: + * Csq: Pointer to CSQ context structure + * Irql: Pointer to a variable to store the old irql into + */ +{ + KdPrint(("CSQ: Acquiring spin lock\n")); + KeAcquireSpinLock(&IrpQueueLock, Irql); +} + + +VOID NTAPI CsqReleaseLock(PIO_CSQ Csq, + KIRQL Irql) +/* + * FUNCTION: Release the queue lock + * ARGUMENTS: + * Csq: Pointer to CSQ context structure + * Irql: IRQL to lower to on release + */ +{ + KdPrint(("CSQ: Releasing spin lock\n")); + KeReleaseSpinLock(&IrpQueueLock, Irql); +} + + +VOID NTAPI CsqCompleteCanceledIrp(PIO_CSQ Csq, + PIRP Irp) +/* + * FUNCTION: Complete a canceled IRP + * ARGUMENTS: + * Csq: Pointer to CSQ context structure + * Irp: IRP to complete + * NOTES: + * - Perhaps we should complete with something besides NO_INCREMENT + * - MS misspelled CANCELLED... sigh... + */ +{ + KdPrint(("CSQ: Canceling irp 0x%x\n", Irp)); + Irp->IoStatus.Status = STATUS_CANCELLED; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, IO_NO_INCREMENT); +} + + +VOID NTAPI CsqInsertIrp(PIO_CSQ Csq, + PIRP Irp) +/* + * FUNCTION: Queue an IRP + * ARGUMENTS: + * Csq: Unused + * Irp: IRP to add to the queue + * NOTES: + * - Called under the protection of the queue lock + * - Releases the semaphore for each queued packet, which is how + * the queue management thread knows that there might be + * an IRP in the queue + * - Note that the semaphore will get released more times than + * the queue management thread will have IRPs to process, given + * that at least one IRP is canceled at some point + */ +{ + KdPrint(("CSQ: Inserting IRP 0x%x\n", Irp)); + InsertTailList(&IrpQueue, &Irp->Tail.Overlay.ListEntry); + KeReleaseSemaphore(&QueueSemaphore, 0, 1, FALSE); +} + diff --git a/reactos/drivers/storage/floppy/csqrtns.h b/reactos/drivers/storage/floppy/csqrtns.h new file mode 100644 index 00000000000..80dc11b62b9 --- /dev/null +++ b/reactos/drivers/storage/floppy/csqrtns.h @@ -0,0 +1,59 @@ +/* + * ReactOS Floppy Driver + * Copyright (C) 2004, Vizzini (vizzini@plasmic.com) + * + * 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 Floppy Driver + * FILE: csqrtns.h + * PURPOSE: Header for Cancel-safe queue routines + * PROGRAMMER: Vizzini (vizzini@plasmic.com) + * REVISIONS: + * 15-Feb-2004 vizzini - Created + */ + +#ifdef _MSC_VER +#include <csq.h> +#else +#include <ddk/csq.h> +#endif + +/* + * CSQ Stuff + */ +extern IO_CSQ Csq; +extern LIST_ENTRY IrpQueue; +extern KSPIN_LOCK IrpQueueLock; +extern KSEMAPHORE QueueSemaphore; + +VOID NTAPI CsqInsertIrp(PIO_CSQ Csq, + PIRP Irp); + +VOID NTAPI CsqRemoveIrp(PIO_CSQ Csq, + PIRP Irp); + +PIRP NTAPI CsqPeekNextIrp(PIO_CSQ Csq, + PIRP Irp, + PVOID PeekContext); + +VOID NTAPI CsqAcquireLock(PIO_CSQ Csq, + PKIRQL Irql); + +VOID NTAPI CsqReleaseLock(PIO_CSQ Csq, + KIRQL Irql); + +VOID NTAPI CsqCompleteCanceledIrp(PIO_CSQ Csq, + PIRP Irp); + diff --git a/reactos/drivers/storage/floppy/floppy.c b/reactos/drivers/storage/floppy/floppy.c new file mode 100644 index 00000000000..5153b0eda09 --- /dev/null +++ b/reactos/drivers/storage/floppy/floppy.c @@ -0,0 +1,1121 @@ +/* + * ReactOS Floppy Driver + * Copyright (C) 2004, Vizzini (vizzini@plasmic.com) + * + * 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 Floppy Driver + * FILE: floppy.c + * PURPOSE: Main floppy driver routines + * PROGRAMMER: Vizzini (vizzini@plasmic.com) + * REVISIONS: + * 15-Feb-2004 vizzini - Created + * NOTES: + * + * ---- General to-do items ---- + * TODO: Clean up properly on failed init + * TODO: Add arc-path support so we can boot from the floppy + * TODO: Fix all these stupid STATUS_UNSUCCESSFUL return values + * TODO: Think about IO_NO_INCREMENT + * TODO: Figure out why CreateClose isn't called any more on XP. Seems to correspond + * with the driver not being unloadable. Does it have to do with cleanup? + * TODO: Consider using the built-in device object pointer in the stack location + * rather than the context area + * TODO: Think about StopDpcQueued -- could be a race; too tired atm to tell + * + * ---- Support for proper media detection ---- + * TODO: Handle MFM flag + * TODO: Un-hardcode the data rate from various places + * TODO: Proper media detection (right now we're hardcoded to 1.44) + * TODO: Media detection based on sector 1 + * + * ---- Support for normal floppy hardware ---- + * TODO: Support the three primary types of controller + * TODO: Figure out thinkpad compatibility (I've heard rumors of weirdness with them) + * + * ---- Support for non-ISA and/or non-slave-dma controllers, if they exist ---- + * TODO: Find controllers on non-ISA buses + * TODO: Think about making the interrupt shareable + * TODO: Support bus-master controllers. PCI will break ATM. + */ + +#include <ntddk.h> + +#include "floppy.h" +#include "hardware.h" +#include "csqrtns.h" +#include "ioctl.h" +#include "readwrite.h" + +/* + * Global controller info structures. Each controller gets one. Since the system + * will probably have only one, with four being a very unlikely maximum, a static + * global array is easiest to deal with. + */ +CONTROLLER_INFO gControllerInfo[MAX_CONTROLLERS]; +ULONG gNumberOfControllers = 0; + +/* Queue thread management */ +KEVENT QueueThreadTerminate; +PVOID ThreadObject; + +/* ISR DPC */ +KDPC Dpc; + + +static VOID NTAPI MotorStopDpcFunc(PKDPC Dpc, + PVOID DeferredContext, + PVOID SystemArgument1, + PVOID SystemArgument2) +/* + * FUNCTION: Stop the floppy motor + * ARGUMENTS: + * Dpc: DPC object that's going off + * DeferredContext: called with DRIVE_INFO for drive to turn off + * SystemArgument1: unused + * SystemArgument2: unused + * NOTES: + * - Must set an event to let other threads know we're done turning off the motor + * - Called back at DISPATCH_LEVEL + */ +{ + PCONTROLLER_INFO ControllerInfo = (PCONTROLLER_INFO)DeferredContext; + + ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); + ASSERT(ControllerInfo); + + KdPrint(("floppy: MotorStopDpcFunc called\n")); + + HwTurnOffMotor(ControllerInfo); + ControllerInfo->StopDpcQueued = FALSE; + KeSetEvent(&ControllerInfo->MotorStoppedEvent, IO_NO_INCREMENT, FALSE); +} + + +VOID NTAPI StartMotor(PDRIVE_INFO DriveInfo) +/* + * FUNCTION: Start the motor, taking into account proper handling of the timer race + * ARGUMENTS: + * DriveInfo: drive to start + * NOTES: + * - Never call HwTurnOnMotor() directly + * - This protocol manages a race between the cancel timer and the requesting thread. + * You wouldn't want to turn on the motor and then cancel the timer, because the + * cancel dpc might fire in the meantime, and that'd un-do what you just did. If you + * cancel the timer first, but KeCancelTimer returns false, the dpc is already running, + * so you have to wait until the dpc is completly done running, or else you'll race + * with the turner-offer + * - PAGED_CODE because we wait + */ +{ + PAGED_CODE(); + ASSERT(DriveInfo); + + KdPrint(("floppy: StartMotor called\n")); + + if(DriveInfo->ControllerInfo->StopDpcQueued && + !KeCancelTimer(&DriveInfo->ControllerInfo->MotorTimer)) + { + /* Motor turner-offer is already running; wait for it to finish */ + KeWaitForSingleObject(&DriveInfo->ControllerInfo->MotorStoppedEvent, Executive, KernelMode, FALSE, NULL); + DriveInfo->ControllerInfo->StopDpcQueued = FALSE; + } + + HwTurnOnMotor(DriveInfo); +} + + +VOID NTAPI StopMotor(PCONTROLLER_INFO ControllerInfo) +/* + * FUNCTION: Stop all motors on the controller + * ARGUMENTS: + * DriveInfo: Drive to stop + * NOTES: + * - Never call HwTurnOffMotor() directly + * - This manages the timer cancelation race (see StartMotor for details). + * All we have to do is set up a timer. + */ +{ + LARGE_INTEGER StopTime; + + ASSERT(ControllerInfo); + + KdPrint(("floppy: StopMotor called\n")); + + /* one relative second, in 100-ns units */ + StopTime.QuadPart = 10000000; + StopTime.QuadPart *= -1; + + KeClearEvent(&ControllerInfo->MotorStoppedEvent); + KeSetTimer(&ControllerInfo->MotorTimer, StopTime, &ControllerInfo->MotorStopDpc); + ControllerInfo->StopDpcQueued = TRUE; +} + + +VOID NTAPI WaitForControllerInterrupt(PCONTROLLER_INFO ControllerInfo) +/* + * FUNCTION: Wait for the controller to interrupt, and then clear the event + * ARGUMENTS: + * ControllerInfo: Controller to wait for + * NOTES: + * - There is a small chance that an unexpected or spurious interrupt could + * be lost with this clear/wait/clear scheme used in this driver. This is + * deemed to be an acceptable risk due to the unlikeliness of the scenario, + * and the fact that it'll probably work fine next time. + * - PAGED_CODE because it waits + */ +{ + PAGED_CODE(); + ASSERT(ControllerInfo); + + KeWaitForSingleObject(&ControllerInfo->SynchEvent, Executive, KernelMode, FALSE, NULL); + KeClearEvent(&ControllerInfo->SynchEvent); +} + + +static NTSTATUS NTAPI CreateClose(PDEVICE_OBJECT DeviceObject, + PIRP Irp) +/* + * FUNCTION: Dispatch function called for Create and Close IRPs + * ARGUMENTS: + * DeviceObject: DeviceObject that is the target of the IRP + * Irp: IRP to process + * RETURNS: + * STATUS_SUCCESS in all cases + * NOTES: + * - The Microsoft sample drivers tend to return FILE_OPENED in Information, so I do too. + * - No reason to fail the device open + * - No state to track, so this routine is easy + * - Can be called <= DISPATCH_LEVEL + * + * TODO: Figure out why this isn't getting called any more, and remove the ASSERT once that happens + */ +{ + KdPrint(("floppy: CreateClose called\n")); + + ASSERT(0); + + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = FILE_OPENED; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return STATUS_SUCCESS; +} + + +static NTSTATUS NTAPI Recalibrate(PDRIVE_INFO DriveInfo) +/* + * FUNCTION: Start the recalibration process + * ARGUMENTS: + * DriveInfo: Pointer to the driveinfo struct associated with the targeted drive + * RETURNS: + * STATUS_SUCCESS on successful starting of the process + * STATUS_UNSUCCESSFUL if it fails + * NOTES: + * - Sometimes you have to do two recalibrations, particularly if the disk has <80 tracks. + * - PAGED_CODE because we wait + */ +{ + NTSTATUS Status; + ULONG i; + + PAGED_CODE(); + ASSERT(DriveInfo); + + /* first turn on the motor */ + /* Must stop after every start, prior to return */ + StartMotor(DriveInfo); + + /* set the data rate */ + KdPrint(("floppy: FIXME: UN-HARDCODE DATA RATE\n")); + HwSetDataRate(DriveInfo->ControllerInfo, 0); + + /* clear the event just in case the last call forgot */ + KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); + + /* sometimes you have to do this twice */ + for(i = 0; i < 2; i++) + { + /* Send the command */ + Status = HwRecalibrate(DriveInfo); + if(Status != STATUS_SUCCESS) + { + KdPrint(("floppy: Recalibrate: HwRecalibrate returned error\n")); + continue; + } + + WaitForControllerInterrupt(DriveInfo->ControllerInfo); + + /* Get the results */ + Status = HwRecalibrateResult(DriveInfo->ControllerInfo); + if(Status != STATUS_SUCCESS) + { + KdPrint(("floppy: Recalibrate: HwRecalibrateResult returned error\n")); + break; + } + } + + KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); + + /* Must stop after every start, prior to return */ + StopMotor(DriveInfo->ControllerInfo); + + return Status; +} + + +NTSTATUS NTAPI ResetChangeFlag(PDRIVE_INFO DriveInfo) +/* + * FUNCTION: Reset the drive's change flag (as reflected in the DIR) + * ARGUMENTS: + * DriveInfo: the drive to reset + * RETURNS: + * STATUS_SUCCESS if the changeline is cleared + * STATUS_NO_MEDIA_IN_DEVICE if the changeline cannot be cleared + * STATUS_IO_DEVICE_ERROR if the controller cannot be communicated with + * NOTES: + * - Change reset procedure: recalibrate, seek 1, seek 0 + * - If the line is still set after that, there's clearly no disk in the + * drive, so we return STATUS_NO_MEDIA_IN_DEVICE + * - PAGED_CODE because we wait + */ +{ + BOOLEAN DiskChanged; + + PAGED_CODE(); + ASSERT(DriveInfo); + + KdPrint(("floppy: ResetChangeFlag called\n")); + + /* Try to recalibrate. We don't care if it works. */ + Recalibrate(DriveInfo); + + /* clear spurious interrupts in prep for seeks */ + KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); + + /* Seek to 1 */ + if(HwSeek(DriveInfo, 1) != STATUS_SUCCESS) + { + KdPrint(("floppy: ResetChangeFlag(): HwSeek failed; returning STATUS_IO_DEVICE_ERROR\n")); + return STATUS_IO_DEVICE_ERROR; + } + + WaitForControllerInterrupt(DriveInfo->ControllerInfo); + + HwSenseInterruptStatus(DriveInfo->ControllerInfo); + + /* Seek back to 0 */ + if(HwSeek(DriveInfo, 1) != STATUS_SUCCESS) + { + KdPrint(("floppy: ResetChangeFlag(): HwSeek failed; returning STATUS_IO_DEVICE_ERROR\n")); + return STATUS_IO_DEVICE_ERROR; + } + + WaitForControllerInterrupt(DriveInfo->ControllerInfo); + + HwSenseInterruptStatus(DriveInfo->ControllerInfo); + + /* Check the change bit */ + if(HwDiskChanged(DriveInfo, &DiskChanged) != STATUS_SUCCESS) + { + KdPrint(("floppy: ResetChangeFlag(): HwDiskChagned failed; returning STATUS_IO_DEVICE_ERROR\n")); + return STATUS_IO_DEVICE_ERROR; + } + + /* if the change flag is still set, there's probably no media in the drive. */ + if(DiskChanged) + return STATUS_NO_MEDIA_IN_DEVICE; + + /* else we're done! */ + return STATUS_SUCCESS; +} + + +static VOID NTAPI Unload(PDRIVER_OBJECT DriverObject) +/* + * FUNCTION: Unload the driver from memory + * ARGUMENTS: + * DriverObject - The driver that is being unloaded + * + * TODO: Delete ARC links + */ +{ + ULONG i,j; + + PAGED_CODE(); + + KdPrint(("floppy: unloading\n")); + + KeSetEvent(&QueueThreadTerminate, 0, FALSE); + KeWaitForSingleObject(ThreadObject, Executive, KernelMode, FALSE, 0); + ObDereferenceObject(ThreadObject); + + for(i = 0; i < gNumberOfControllers; i++) + { + if(!gControllerInfo[i].Populated) + continue; + + for(j = 0; j < gControllerInfo[i].NumberOfDrives; j++) + { + if(gControllerInfo[i].DriveInfo[j].DeviceObject) + { + UNICODE_STRING Link; + RtlInitUnicodeString(&Link, gControllerInfo[i].DriveInfo[j].SymLinkBuffer); + IoDeleteSymbolicLink(&Link); + IoDeleteDevice(gControllerInfo[i].DriveInfo[j].DeviceObject); + } + } + + IoDisconnectInterrupt(gControllerInfo[i].InterruptObject); + + /* Power down the controller */ + HwPowerOff(&gControllerInfo[i]); + } +} + + +static NTSTATUS NTAPI ConfigCallback(PVOID Context, + PUNICODE_STRING PathName, + INTERFACE_TYPE BusType, + ULONG BusNumber, + PKEY_VALUE_FULL_INFORMATION *BusInformation, + CONFIGURATION_TYPE ControllerType, + ULONG ControllerNumber, + PKEY_VALUE_FULL_INFORMATION *ControllerInformation, + CONFIGURATION_TYPE PeripheralType, + ULONG PeripheralNumber, + PKEY_VALUE_FULL_INFORMATION *PeripheralInformation) +/* + * FUNCTION: Callback to IoQueryDeviceDescription, which tells us about our controllers + * ARGUMENTS: + * Context: Unused + * PathName: Unused + * BusType: Type of the bus that our controller is on + * BusNumber: Number of the bus that our controller is on + * BusInformation: Unused + * ControllerType: Unused + * ControllerNumber: Number of the controller that we're adding + * ControllerInformation: Full configuration information for our controller + * PeripheralType: Unused + * PeripheralNumber: Unused + * PeripheralInformation: Full configuration information for each drive on our controller + * RETURNS: + * STATUS_SUCCESS in all cases + * NOTES: + * - The only documentation I've found about the contents of these structures is + * from the various Microsoft floppy samples and from the DDK headers. They're + * very vague, though, so I'm only mostly sure that this stuff is correct, as + * the MS samples do things completely differently than I have done them. Seems + * to work in my VMWare, though. + * - Basically, the function gets all of the information (port, dma, irq) about the + * controller, and then loops through all of the drives presented in PeripheralInformation. + * - Each controller has a CONTROLLER_INFO created for it, and each drive has a DRIVE_INFO. + * - Device objects are created for each drive (not controller), as that's the targeted + * device in the eyes of the rest of the OS. Each DRIVE_INFO points to a single CONTROLLER_INFO. + * - We only support up to four controllers in the whole system, each of which supports up to four + * drives. + */ +{ + PKEY_VALUE_FULL_INFORMATION ControllerFullDescriptor = ControllerInformation[IoQueryDeviceConfigurationData]; + PCM_FULL_RESOURCE_DESCRIPTOR ControllerResourceDescriptor = (PCM_FULL_RESOURCE_DESCRIPTOR)((PCHAR)ControllerFullDescriptor + + ControllerFullDescriptor->DataOffset); + + PKEY_VALUE_FULL_INFORMATION PeripheralFullDescriptor = PeripheralInformation[IoQueryDeviceConfigurationData]; + PCM_FULL_RESOURCE_DESCRIPTOR PeripheralResourceDescriptor = (PCM_FULL_RESOURCE_DESCRIPTOR)((PCHAR)PeripheralFullDescriptor + + PeripheralFullDescriptor->DataOffset); + + PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor; + PCM_FLOPPY_DEVICE_DATA FloppyDeviceData; + UCHAR i; + + PAGED_CODE(); + + KdPrint(("floppy: ConfigCallback called with ControllerNumber %d\n", ControllerNumber)); + + gControllerInfo[gNumberOfControllers].ControllerNumber = ControllerNumber; + gControllerInfo[gNumberOfControllers].InterfaceType = BusType; + gControllerInfo[gNumberOfControllers].BusNumber = BusNumber; + + /* Get controller interrupt level/vector, dma channel, and port base */ + for(i = 0; i < ControllerResourceDescriptor->PartialResourceList.Count; i++) + { + KeInitializeEvent(&gControllerInfo[gNumberOfControllers].SynchEvent, NotificationEvent, FALSE); + + PartialDescriptor = &ControllerResourceDescriptor->PartialResourceList.PartialDescriptors[i]; + + if(PartialDescriptor->Type == CmResourceTypeInterrupt) + { + gControllerInfo[gNumberOfControllers].Level = PartialDescriptor->u.Interrupt.Level; + gControllerInfo[gNumberOfControllers].Vector = PartialDescriptor->u.Interrupt.Vector; + + if(PartialDescriptor->Flags & CM_RESOURCE_INTERRUPT_LATCHED) + gControllerInfo[gNumberOfControllers].InterruptMode = Latched; + else + gControllerInfo[gNumberOfControllers].InterruptMode = LevelSensitive; + } + + else if(PartialDescriptor->Type == CmResourceTypePort) + { + PHYSICAL_ADDRESS TranslatedAddress; + ULONG AddressSpace = 0x1; /* I/O Port Range */ + + if(!HalTranslateBusAddress(BusType, BusNumber, PartialDescriptor->u.Port.Start, &AddressSpace, &TranslatedAddress)) + ASSERT(0); + + if(AddressSpace == 0) + gControllerInfo[gNumberOfControllers].BaseAddress = MmMapIoSpace(TranslatedAddress, 8, FALSE); // symbolic constant? + else + gControllerInfo[gNumberOfControllers].BaseAddress = (PUCHAR)TranslatedAddress.u.LowPart; + } + + else if(PartialDescriptor->Type == CmResourceTypeDma) + gControllerInfo[gNumberOfControllers].Dma = PartialDescriptor->u.Dma.Channel; + } + + /* Start with 0 drives, then go looking */ + gControllerInfo[gNumberOfControllers].NumberOfDrives = 0; + + /* learn about drives attached to controller */ + for(i = 0; i < PeripheralResourceDescriptor->PartialResourceList.Count; i++) + { + PDRIVE_INFO DriveInfo = &gControllerInfo[gNumberOfControllers].DriveInfo[i]; + + PartialDescriptor = &PeripheralResourceDescriptor->PartialResourceList.PartialDescriptors[i]; + + if(PartialDescriptor->Type != CmResourceTypeDeviceSpecific) + continue; + + FloppyDeviceData = (PCM_FLOPPY_DEVICE_DATA)(PartialDescriptor + 1); + + DriveInfo->ControllerInfo = &gControllerInfo[gNumberOfControllers]; + DriveInfo->UnitNumber = i; + + DriveInfo->FloppyDeviceData.MaxDensity = FloppyDeviceData->MaxDensity; + DriveInfo->FloppyDeviceData.MountDensity = FloppyDeviceData->MountDensity; + DriveInfo->FloppyDeviceData.StepRateHeadUnloadTime = FloppyDeviceData->StepRateHeadUnloadTime; + DriveInfo->FloppyDeviceData.HeadLoadTime = FloppyDeviceData->HeadLoadTime; + DriveInfo->FloppyDeviceData.MotorOffTime = FloppyDeviceData->MotorOffTime; + DriveInfo->FloppyDeviceData.SectorLengthCode = FloppyDeviceData->SectorLengthCode; + DriveInfo->FloppyDeviceData.SectorPerTrack = FloppyDeviceData->SectorPerTrack; + DriveInfo->FloppyDeviceData.ReadWriteGapLength = FloppyDeviceData->ReadWriteGapLength; + DriveInfo->FloppyDeviceData.FormatGapLength = FloppyDeviceData->FormatGapLength; + DriveInfo->FloppyDeviceData.FormatFillCharacter = FloppyDeviceData->FormatFillCharacter; + DriveInfo->FloppyDeviceData.HeadSettleTime = FloppyDeviceData->HeadSettleTime; + DriveInfo->FloppyDeviceData.MotorSettleTime = FloppyDeviceData->MotorSettleTime; + DriveInfo->FloppyDeviceData.MaximumTrackValue = FloppyDeviceData->MaximumTrackValue; + DriveInfo->FloppyDeviceData.DataTransferLength = FloppyDeviceData->DataTransferLength; + + /* Once it's all set up, acknowledge its existance in the controller info object */ + gControllerInfo[gNumberOfControllers].NumberOfDrives++; + } + + gControllerInfo[gNumberOfControllers].Populated = TRUE; + gNumberOfControllers++; + + return STATUS_SUCCESS; +} + + +static BOOLEAN NTAPI Isr(PKINTERRUPT Interrupt, + PVOID ServiceContext) +/* + * FUNCTION: Interrupt service routine for the controllers + * ARGUMENTS: + * Interrupt: Interrupt object representing the interrupt that occured + * ServiceContext: Pointer to the ControllerInfo object that caused the interrupt + * RETURNS: + * TRUE in all cases (see notes) + * NOTES: + * - We should always be the target of the interrupt, being an edge-triggered ISA interrupt, but + * this won't be the case with a level-sensitive system like PCI + * - Note that it probably doesn't matter if the interrupt isn't dismissed, as it's edge-triggered. + * It probably won't keep re-interrupting. + * - There are two different ways to dismiss a floppy interrupt. If the command has a result phase + * (see intel datasheet), you dismiss the interrupt by reading the first data byte. If it does + * not, you dismiss the interrupt by doing a Sense Interrupt command. Again, because it's edge- + * triggered, this is safe to not do here, as we can just wait for the DPC. + * - Either way, we don't want to do this here. The controller shouldn't interrupt again, so we'll + * schedule a DPC to take care of it. + * TODO: + * - This driver really cannot shrare interrupts, as I don't know how to conclusively say + * whether it was our controller that interrupted or not. I just have to assume that any time + * my ISR gets called, it was my board that called it. Dumb design, yes, but it goes back to + * the semantics of ISA buses. That, and I don't know much about ISA drivers. :-) + * UPDATE: The high bit of Status Register A seems to work on non-AT controllers. + * - Called at DIRQL + */ +{ + PCONTROLLER_INFO ControllerInfo = (PCONTROLLER_INFO)ServiceContext; + + ASSERT(ControllerInfo); + + KdPrint(("floppy: ISR called\n")); + + /* + * Due to the stupidity of the drive/controller relationship on the floppy drive, only one device object + * can have an active interrupt pending. Due to the nature of these IRPs, though, there will only ever + * be one thread expecting an interrupt at a time, and furthermore, Interrupts (outside of spurious ones) + * won't ever happen unless a thread is expecting them. Therefore, all we have to do is signal an event + * and we're done. Queue a DPC and leave. + */ + KeInsertQueueDpc(&ControllerInfo->Dpc, NULL, NULL); + + return TRUE; +} + + +VOID NTAPI DpcForIsr(PKDPC Dpc, + PVOID Context, + PVOID SystemArgument1, + PVOID SystemArgument2) +/* + * FUNCTION: This DPC gets queued by every ISR. Does the real per-interrupt work. + * ARGUMENTS: + * Dpc: Pointer to the DPC object that represents our function + * DeviceObject: Device that this DPC is running for + * Irp: Unused + * Context: Pointer to our ControllerInfo struct + * NOTES: + * - This function just kicks off whatever the SynchEvent is and returns. We depend on + * the thing that caused the drive to interrupt to handle the work of clearing the interrupt. + * This enables us to get back to PASSIVE_LEVEL and not hog system time on a really stupid, + * slow, screwed-up piece of hardare. + * - If nothing is waiting for us to set the event, the interrupt is effectively lost and will + * never be dismissed. I wonder if this will become a problem. + * - Called at DISPATCH_LEVEL + */ +{ + PCONTROLLER_INFO ControllerInfo = (PCONTROLLER_INFO)Context; + + ASSERT(ControllerInfo); + + KdPrint(("floppy: DpcForIsr called\n")); + + KeSetEvent(&ControllerInfo->SynchEvent, IO_NO_INCREMENT, FALSE); +} + + +static NTSTATUS NTAPI InitController(PCONTROLLER_INFO ControllerInfo) +/* + * FUNCTION: Initialize a newly-found controller + * ARGUMENTS: + * ControllerInfo: pointer to the controller to be initialized + * RETURNS: + * STATUS_SUCCESS if the controller is successfully initialized + * STATUS_UNSUCCESSFUL otherwise + */ +{ + int i; + UCHAR HeadLoadTime; + UCHAR HeadUnloadTime; + UCHAR StepRateTime; + + PAGED_CODE(); + ASSERT(ControllerInfo); + + KdPrint(("floppy: InitController called with Controller 0x%x\n", ControllerInfo)); + + KeClearEvent(&ControllerInfo->SynchEvent); + + //HwDumpRegisters(ControllerInfo); + + KdPrint(("floppy: InitController: resetting the controller\n")); + + /* Reset the controller */ + if(HwReset(ControllerInfo) != STATUS_SUCCESS) + { + KdPrint(("floppy: InitController: unable to reset controller\n")); + return STATUS_UNSUCCESSFUL; + } + + //HwDumpRegisters(ControllerInfo); + + KdPrint(("floppy: InitController: setting data rate\n")); + + /* Set data rate */ + if(HwSetDataRate(ControllerInfo, DRSR_DSEL_500KBPS) != STATUS_SUCCESS) + { + KdPrint(("floppy: InitController: unable to set data rate\n")); + return STATUS_UNSUCCESSFUL; + } + + KdPrint(("floppy: InitController: waiting for initial interrupt\n")); + + /* Wait for an interrupt */ + WaitForControllerInterrupt(ControllerInfo); + + /* Reset means you have to clear each of the four interrupts (one per drive) */ + for(i = 0; i < MAX_DRIVES_PER_CONTROLLER; i++) + { + KdPrint(("floppy: InitController: Sensing interrupt %d\n", i)); + //HwDumpRegisters(ControllerInfo); + + if(HwSenseInterruptStatus(ControllerInfo) != STATUS_SUCCESS) + { + KdPrint(("floppy: InitController: Unable to clear interrupt 0x%x\n", i)); + return STATUS_UNSUCCESSFUL; + } + } + + KdPrint(("floppy: InitController: done sensing interrupts\n")); + + //HwDumpRegisters(ControllerInfo); + + /* Next, see if we have the right version to do implied seek */ + if(HwGetVersion(ControllerInfo) != VERSION_ENHANCED) + { + KdPrint(("floppy: InitController: enhanced version not supported; disabling implied seeks\n")); + ControllerInfo->ImpliedSeeks = FALSE; + ControllerInfo->Model30 = FALSE; + } + else + { + /* If so, set that up -- all defaults below except first TRUE for EIS */ + if(HwConfigure(ControllerInfo, TRUE, TRUE, FALSE, 0, 0) != STATUS_SUCCESS) + { + KdPrint(("floppy: InitController: unable to set up implied seek\n")); + ControllerInfo->ImpliedSeeks = FALSE; + } + else + { + KdPrint(("floppy: InitController: implied seeks set!\n")); + ControllerInfo->ImpliedSeeks = TRUE; + } + + ControllerInfo->Model30 = TRUE; + } + + /* Specify */ + KdPrint(("FLOPPY: FIXME: Figure out speed\n")); + HeadLoadTime = SPECIFY_HLT_500K; + HeadUnloadTime = SPECIFY_HUT_500K; + StepRateTime = SPECIFY_SRT_500K; + + KdPrint(("floppy: InitController: issuing specify command to controller\n")); + + /* Don't disable DMA --> enable dma (dumb & confusing) */ + if(HwSpecify(ControllerInfo, HeadLoadTime, HeadUnloadTime, StepRateTime, FALSE) != STATUS_SUCCESS) + { + KdPrint(("floppy: InitController: unable to specify options\n")); + return STATUS_UNSUCCESSFUL; + } + + //HwDumpRegisters(ControllerInfo); + + /* Init the stop stuff */ + KeInitializeDpc(&ControllerInfo->MotorStopDpc, MotorStopDpcFunc, ControllerInfo); + KeInitializeTimer(&ControllerInfo->MotorTimer); + KeInitializeEvent(&ControllerInfo->MotorStoppedEvent, SynchronizationEvent, FALSE); + ControllerInfo->StopDpcQueued = FALSE; + + /* Recalibrate each drive on the controller (depends on StartMotor, which depends on the timer stuff above) */ + /* TODO: Handle failure of one or more drives */ + for(i = 0; i < ControllerInfo->NumberOfDrives; i++) + { + KdPrint(("floppy: InitController: recalibrating drive 0x%x on controller 0x%x\n", i, ControllerInfo)); + + if(Recalibrate(&ControllerInfo->DriveInfo[i]) != STATUS_SUCCESS) + { + KdPrint(("floppy: InitController: unable to recalibrate drive\n")); + return STATUS_UNSUCCESSFUL; + } + } + + //HwDumpRegisters(ControllerInfo); + + KdPrint(("floppy: InitController: done initializing; returning STATUS_SUCCESS\n")); + + return STATUS_SUCCESS; +} + + +static BOOLEAN NTAPI AddControllers(PDRIVER_OBJECT DriverObject) +/* + * FUNCTION: Called on initialization to find our controllers and build device and controller objects for them + * ARGUMENTS: + * DriverObject: Our driver's DriverObject (so we can create devices against it) + * RETURNS: + * FALSE if we can't allocate a device, adapter, or interrupt object, or if we fail to find any controllers + * TRUE otherwise (i.e. we have at least one fully-configured controller) + * NOTES: + * - Currently we only support ISA buses. + * - BUG: Windows 2000 seems to clobber the response from the IoQueryDeviceDescription callback, so now we + * just test a boolean value in the first object to see if it was completely populated. The same value + * is tested for each controller before we build device objects for it. + * TODO: + * - Figure out a workable interrupt-sharing scheme and un-hardcode FALSE in IoConnectInterrupt + * - Add support for non-ISA buses, by looping through all of the bus types looking for floppy controllers + * - Report resource usage to the HAL + * - Add ARC path support + * - Think more about error handling; atm most errors abort the start of the driver + */ +{ + INTERFACE_TYPE InterfaceType = Isa; + CONFIGURATION_TYPE ControllerType = DiskController; + CONFIGURATION_TYPE PeripheralType = FloppyDiskPeripheral; + KAFFINITY Affinity; + DEVICE_DESCRIPTION DeviceDescription; + UCHAR i; + UCHAR j; + + PAGED_CODE(); + + /* Find our controllers on all ISA buses */ + IoQueryDeviceDescription(&InterfaceType, 0, &ControllerType, 0, &PeripheralType, 0, ConfigCallback, 0); + + /* + * w2k breaks the return val from ConfigCallback, so we have to hack around it, rather than just + * looking for a return value from ConfigCallback + */ + if(!gControllerInfo[0].Populated) + { + KdPrint(("floppy: AddControllers: failed to get controller info from registry\n")); + return FALSE; + } + + /* Now that we have a controller, set it up with the system */ + for(i = 0; i < gNumberOfControllers; i++) + { + /* 0: Report resource usage to the kernel, to make sure they aren't assigned to anyone else */ + /* XXX do me baby */ + + /* 1: Set up interrupt */ + gControllerInfo[i].MappedVector = HalGetInterruptVector(gControllerInfo[i].InterfaceType, gControllerInfo[i].BusNumber, + gControllerInfo[i].Level, gControllerInfo[i].Vector, + &gControllerInfo[i].MappedLevel, &Affinity); + + /* Must set up the DPC before we connect the interrupt */ + KeInitializeDpc(&gControllerInfo[i].Dpc, DpcForIsr, &gControllerInfo[i]); + + KdPrint(("floppy: Connecting interrupt %d to controller%d (object 0x%x)\n", gControllerInfo[i].MappedVector, + i, &gControllerInfo[i])); + + /* NOTE: We cannot share our interrupt, even on level-triggered buses. See Isr() for details. */ + if(IoConnectInterrupt(&gControllerInfo[i].InterruptObject, Isr, &gControllerInfo[i], 0, gControllerInfo[i].MappedVector, + gControllerInfo[i].MappedLevel, gControllerInfo[i].MappedLevel, gControllerInfo[i].InterruptMode, + FALSE, Affinity, 0) != STATUS_SUCCESS) + { + KdPrint(("floppy: AddControllers: unable to connect interrupt\n")); + return FALSE; + } + + /* 2: Set up DMA */ + + memset(&DeviceDescription, 0, sizeof(DeviceDescription)); + DeviceDescription.Version = DEVICE_DESCRIPTION_VERSION; + DeviceDescription.Master = (gControllerInfo[i].InterfaceType == PCIBus ? TRUE : FALSE); /* guessing if not pci not master */ + DeviceDescription.DmaChannel = gControllerInfo[i].Dma; + DeviceDescription.InterfaceType = gControllerInfo[i].InterfaceType; + DeviceDescription.BusNumber = gControllerInfo[i].BusNumber; + + if(gControllerInfo[i].InterfaceType == PCIBus) + { + DeviceDescription.Dma32BitAddresses = TRUE; + DeviceDescription.DmaWidth = Width32Bits; + } + else + /* DMA 0,1,2,3 are 8-bit; 4,5,6,7 are 16-bit (4 is chain i think) */ + DeviceDescription.DmaWidth = gControllerInfo[i].Dma > 3 ? Width16Bits: Width8Bits; + + gControllerInfo[i].AdapterObject = HalGetAdapter(&DeviceDescription, &gControllerInfo[i].MapRegisters); + + if(!gControllerInfo[i].AdapterObject) + { + KdPrint(("floppy: AddControllers: unable to allocate an adapter object\n")); + IoDisconnectInterrupt(gControllerInfo[i].InterruptObject); + return FALSE; + } + + /* 2b: Initialize the new controller */ + if(InitController(&gControllerInfo[i]) != STATUS_SUCCESS) + { + KdPrint(("floppy: AddControllers():Unable to set up controller %d - initialization failed\n", i)); + ASSERT(0); /* FIXME: clean up properly */ + continue; + } + + /* 3: per-drive setup */ + for(j = 0; j < gControllerInfo[i].NumberOfDrives; j++) + { + WCHAR DeviceNameBuf[MAX_DEVICE_NAME]; + UNICODE_STRING DeviceName; + UNICODE_STRING LinkName; + UCHAR DriveNumber; + + KdPrint(("floppy: AddControllers(): Configuring drive %d on controller %d\n", i, j)); + + /* + * 3a: create a device object for the drive + * Controllers and drives are 0-based, so the combos are: + * 0: 0,0 + * 1: 0,1 + * 2: 0,2 + * 3: 0,3 + * 4: 1,0 + * 5: 1,1 + * ... + * 14: 3,2 + * 15: 3,3 + */ + DriveNumber = i*4 + j; + + swprintf(DeviceNameBuf, L"\\Device\\Floppy%d", DriveNumber); + RtlInitUnicodeString(&DeviceName, DeviceNameBuf); + + if(IoCreateDevice(DriverObject, sizeof(PVOID), &DeviceName, + FILE_DEVICE_DISK, FILE_REMOVABLE_MEDIA | FILE_FLOPPY_DISKETTE, FALSE, + &gControllerInfo[i].DriveInfo[j].DeviceObject) != STATUS_SUCCESS) + { + KdPrint(("floppy: AddControllers: unable to register a Device object\n")); + IoDisconnectInterrupt(gControllerInfo[i].InterruptObject); + return FALSE; + } + + KdPrint(("floppy: AddControllers: New device: %S (0x%x)\n", DeviceNameBuf, gControllerInfo[i].DriveInfo[j].DeviceObject)); + + /* 3c: Set flags up */ + gControllerInfo[i].DriveInfo[j].DeviceObject->Flags |= DO_DIRECT_IO; + + /* 3d: Create a symlink */ + swprintf(gControllerInfo[i].DriveInfo[j].SymLinkBuffer, L"\\DosDevices\\%c:", DriveNumber + 'A'); + RtlInitUnicodeString(&LinkName, gControllerInfo[i].DriveInfo[j].SymLinkBuffer); + if(IoCreateSymbolicLink(&LinkName, &DeviceName) != STATUS_SUCCESS) + { + KdPrint(("floppy: AddControllers: Unable to create a symlink for drive %d\n", DriveNumber)); + IoDisconnectInterrupt(gControllerInfo[i].InterruptObject); + // delete devices too? + return FALSE; + } + + /* 3e: Set up the DPC */ + IoInitializeDpcRequest(gControllerInfo[i].DriveInfo[j].DeviceObject, DpcForIsr); + + /* 3f: Point the device extension at our DriveInfo struct */ + gControllerInfo[i].DriveInfo[j].DeviceObject->DeviceExtension = &gControllerInfo[i].DriveInfo[j]; + + /* 3g: neat comic strip */ + + /* 3h: set the initial media type to unknown */ + memset(&gControllerInfo[i].DriveInfo[j].DiskGeometry, 0, sizeof(DISK_GEOMETRY)); + gControllerInfo[i].DriveInfo[j].DiskGeometry.MediaType = Unknown; + } + } + + KdPrint(("floppy: AddControllers: --------------------------------------------> finished adding controllers\n")); + + return TRUE; +} + + +VOID NTAPI SignalMediaChanged(PDEVICE_OBJECT DeviceObject, + PIRP Irp) +/* + * FUNCTION: Process an IRP when the media has changed, and possibly notify the user + * ARGUMENTS: + * DeviceObject: DeviceObject associated with the IRP + * Irp: IRP that we're failing due to change + * NOTES: + * - This procedure is documented in the DDK by "Notifying the File System of Possible Media Changes", + * "IoSetHardErrorOrVerifyDevice", and by "Responding to Check-Verify Requests from the File System". + * - Callable at <= DISPATCH_LEVEL + */ +{ + PDRIVE_INFO DriveInfo = DeviceObject->DeviceExtension; + + KdPrint(("floppy: SignalMediaChanged called\n")); + + DriveInfo->DiskChangeCount++; + + /* If volume is not mounted, do NOT set verify and return STATUS_IO_DEVICE_ERROR */ + if(!(DeviceObject->Vpb->Flags & VPB_MOUNTED)) + { + Irp->IoStatus.Status = STATUS_IO_DEVICE_ERROR; + Irp->IoStatus.Information = 0; + return; + } + + /* Notify the filesystem that it will need to verify the volume */ + DeviceObject->Flags |= DO_VERIFY_VOLUME; + Irp->IoStatus.Status = STATUS_VERIFY_REQUIRED; + Irp->IoStatus.Information = 0; + + /* + * If this is a user-based, threaded request, let the IO manager know to pop up a box asking + * the user to supply the correct media, but only if the error (which we just picked out above) + * is deemed by the IO manager to be "user induced". The reason we don't just unconditionally + * call IoSetHardError... is because MS might change the definition of "user induced" some day, + * and we don't want to have to remember to re-code this. + */ + if(Irp->Tail.Overlay.Thread && IoIsErrorUserInduced(Irp->IoStatus.Status)) + IoSetHardErrorOrVerifyDevice(Irp, DeviceObject); +} + + +VOID NTAPI QueueThread(PVOID Context) +/* + * FUNCTION: Thread that manages the queue and dispatches any queued requests + * ARGUMENTS: + * Context: unused + */ +{ + PIRP Irp; + PIO_STACK_LOCATION Stack; + PDEVICE_OBJECT DeviceObject; + PVOID Objects[2]; + + PAGED_CODE(); + + Objects[0] = &QueueSemaphore; + Objects[1] = &QueueThreadTerminate; + + for(;;) + { + KeWaitForMultipleObjects(2, Objects, WaitAny, Executive, KernelMode, FALSE, NULL, NULL); + + if(KeReadStateEvent(&QueueThreadTerminate)) + { + KdPrint(("floppy: QueueThread terminating\n")); + return; + } + + KdPrint(("floppy: QueueThread: servicing an IRP\n")); + + Irp = IoCsqRemoveNextIrp(&Csq, 0); + + /* we won't get an irp if it was canceled */ + if(!Irp) + { + KdPrint(("floppy: QueueThread: IRP queue empty\n")); + continue; + } + + DeviceObject = (PDEVICE_OBJECT)Irp->Tail.Overlay.DriverContext[0]; + + ASSERT(DeviceObject); + + Stack = IoGetCurrentIrpStackLocation(Irp); + + /* Decide what to do with the IRP */ + switch(Stack->MajorFunction) + { + case IRP_MJ_READ: + case IRP_MJ_WRITE: + ReadWritePassive(DeviceObject->DeviceExtension, Irp); + break; + + case IRP_MJ_DEVICE_CONTROL: + DeviceIoctlPassive(DeviceObject->DeviceExtension, Irp); + break; + + default: + KdPrint(("floppy: QueueThread(): Unrecognized irp: mj: 0x%x\n", Stack->MajorFunction)); + Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + } + } +} + + +NTSTATUS NTAPI DriverEntry(PDRIVER_OBJECT DriverObject, + PUNICODE_STRING RegistryPath) +/* + * FUNCTION: Entry-point for the driver + * ARGUMENTS: + * DriverObject: Our driver object + * RegistryPath: Unused + * RETURNS: + * STATUS_SUCCESS on successful initialization of at least one drive + * STATUS_NO_SUCH_DEVICE if we didn't find even one drive + * STATUS_UNSUCCESSFUL otherwise + */ +{ + HANDLE ThreadHandle; + + /* + * Set up dispatch routines + */ + DriverObject->MajorFunction[IRP_MJ_CREATE] = (PDRIVER_DISPATCH)CreateClose; + DriverObject->MajorFunction[IRP_MJ_CLOSE] = (PDRIVER_DISPATCH)CreateClose; + DriverObject->MajorFunction[IRP_MJ_READ] = (PDRIVER_DISPATCH)ReadWrite; + DriverObject->MajorFunction[IRP_MJ_WRITE] = (PDRIVER_DISPATCH)ReadWrite; + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = (PDRIVER_DISPATCH)DeviceIoctl; + + DriverObject->DriverUnload = Unload; + + /* + * We depend on some zeroes in these structures. I know this is supposed to be + * initialized to 0 by the complier but this makes me feel beter. + */ + memset(&gControllerInfo, 0, sizeof(gControllerInfo)); + + /* + * Set up queue. This routine cannot fail (trust me, I wrote it). + */ + IoCsqInitialize(&Csq, CsqInsertIrp, CsqRemoveIrp, CsqPeekNextIrp, + CsqAcquireLock, CsqReleaseLock, CsqCompleteCanceledIrp); + + /* + * ...and its lock + */ + KeInitializeSpinLock(&IrpQueueLock); + + /* + * ...and the queue list itself + */ + InitializeListHead(&IrpQueue); + + /* + * The queue is counted by a semaphore. The queue management thread + * blocks on this semaphore, so if requests come in faster than the queue + * thread can handle them, the semaphore count goes up. + */ + KeInitializeSemaphore(&QueueSemaphore, 0, 0x7fffffff); + + /* + * Create the queue processing thread. Save its handle in the global variable + * ThreadHandle so we can wait on its termination during Unload. + */ + if(PsCreateSystemThread(&ThreadHandle, 0, 0, 0, 0, QueueThread, 0) != STATUS_SUCCESS) + { + KdPrint(("floppy: Unable to create system thread; failing init\n")); + return STATUS_UNSUCCESSFUL; + } + + if(ObReferenceObjectByHandle(ThreadHandle, STANDARD_RIGHTS_ALL, NULL, KernelMode, &ThreadObject, NULL) != STATUS_SUCCESS) + { + KdPrint(("floppy: Unable to reference returned thread handle; failing init\n")); + return STATUS_UNSUCCESSFUL; + } + + ZwClose(ThreadHandle); + + /* + * Event to terminate that thread + */ + KeInitializeEvent(&QueueThreadTerminate, NotificationEvent, FALSE); + + /* + * Start the device discovery proces. In theory, this should return STATUS_SUCCESS if + * it finds even one drive attached to one controller. In practice, the AddControllers + * routine doesn't handle all of the errors right just yet. FIXME. + */ + if(!AddControllers(DriverObject)) + return STATUS_NO_SUCH_DEVICE; + + return STATUS_SUCCESS; +} + diff --git a/reactos/drivers/storage/floppy/floppy.h b/reactos/drivers/storage/floppy/floppy.h new file mode 100644 index 00000000000..da3fbe0c8b4 --- /dev/null +++ b/reactos/drivers/storage/floppy/floppy.h @@ -0,0 +1,145 @@ +/* + * ReactOS Floppy Driver + * Copyright (C) 2004, Vizzini (vizzini@plasmic.com) + * + * 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 Floppy Driver + * FILE: floppy.h + * PURPOSE: Header for Main floppy driver routines + * PROGRAMMER: Vizzini (vizzini@plasmic.com) + * REVISIONS: + * 15-Feb-2004 vizzini - Created + */ + +#define MAX_DEVICE_NAME 255 +#define MAX_ARC_PATH_LEN 255 +#define MAX_DRIVES_PER_CONTROLLER 4 +#define MAX_CONTROLLERS 4 + +#ifdef _MSC_VER +/* MS doesn't prototype this but the w2k kernel exports it */ +int _cdecl swprintf(const WCHAR *, ...); + +/* need ioctls in ddk build mode */ +#include <ntdddisk.h> +#endif + +/* missing from ros headers */ +/* TODO: fix this right */ +#ifndef KdPrint +#define KdPrint(x) DbgPrint x +#endif + +#ifndef ASSERT +#define ASSERT(x) { if(!(x)) __asm__("int $3\n"); } +#endif + +#ifndef assert +#define assert(x) ASSERT(x) +#endif + +#ifndef PAGED_CODE +#define PAGED_CODE() {ASSERT(KeGetCurrentIrql() < DISPATCH_LEVEL);} +#endif + +struct _CONTROLLER_INFO; + +typedef struct _DRIVE_INFO +{ + struct _CONTROLLER_INFO *ControllerInfo; + UCHAR UnitNumber; /* 0,1,2,3 */ + LARGE_INTEGER MotorStartTime; + PDEVICE_OBJECT DeviceObject; + CM_FLOPPY_DEVICE_DATA FloppyDeviceData; + DISK_GEOMETRY DiskGeometry; + UCHAR BytesPerSectorCode; + WCHAR SymLinkBuffer[MAX_DEVICE_NAME]; + ULONG DiskChangeCount; +} DRIVE_INFO, *PDRIVE_INFO; + +typedef struct _CONTROLLER_INFO +{ + BOOLEAN Populated; + ULONG ControllerNumber; + INTERFACE_TYPE InterfaceType; + ULONG BusNumber; + ULONG Level; + KIRQL MappedLevel; + ULONG Vector; + ULONG MappedVector; + KINTERRUPT_MODE InterruptMode; + PUCHAR BaseAddress; + ULONG Dma; + ULONG MapRegisters; + PVOID MapRegisterBase; + BOOLEAN Master; + KEVENT SynchEvent; + KDPC Dpc; + PKINTERRUPT InterruptObject; + PADAPTER_OBJECT AdapterObject; + UCHAR NumberOfDrives; + BOOLEAN ImpliedSeeks; + DRIVE_INFO DriveInfo[MAX_DRIVES_PER_CONTROLLER]; + PDRIVE_INFO CurrentDrive; + BOOLEAN Model30; + KEVENT MotorStoppedEvent; + KTIMER MotorTimer; + KDPC MotorStopDpc; + BOOLEAN StopDpcQueued; +} CONTROLLER_INFO, *PCONTROLLER_INFO; + +NTSTATUS NTAPI ReadWrite(PDEVICE_OBJECT DeviceObject, + PIRP Irp); + +VOID NTAPI QueueThread(PVOID Context); + +extern KEVENT QueueThreadTerminate; + +NTSTATUS NTAPI DriverEntry(PDRIVER_OBJECT DriverObject, + PUNICODE_STRING RegistryPath); + +VOID NTAPI SignalMediaChanged(PDEVICE_OBJECT DeviceObject, + PIRP Irp); + +/* + * MEDIA TYPES + * + * This table was found at http://www.nondot.org/sabre/os/files/Disk/FloppyMediaIDs.txt. + * Thanks to raster@indirect.com for this information. + * + * Format Size Cyls Heads Sec/Trk FATs Sec/FAT Sec/Root Media + * 160K 5 1/4 40 1 8 2 ? ? FE + * 180K 5 1/4 40 1 9 2 ? 4 FC + * 320K 5 1/4 40 2 8 2 ? ? FF + * 360K 5 1/4 40 2 9 2 4 7 FD + * 1.2M 5 1/4 80 2 15 2 14 14 F9 + * 720K 3 1/2 80 2 9 2 6 7 F9 + * 1.44M 3 1/2 80 2 18 2 18 14 F0 + */ + +#define GEOMETRY_144_MEDIATYPE F3_1Pt44_512 +#define GEOMETRY_144_CYLINDERS 80 +#define GEOMETRY_144_TRACKSPERCYLINDER 2 +#define GEOMETRY_144_SECTORSPERTRACK 18 +#define GEOMETRY_144_BYTESPERSECTOR 512 + +VOID NTAPI WaitForControllerInterrupt(PCONTROLLER_INFO ControllerInfo); + +NTSTATUS NTAPI ResetChangeFlag(PDRIVE_INFO DriveInfo); + +VOID NTAPI StartMotor(PDRIVE_INFO DriveInfo); +VOID NTAPI StopMotor(PCONTROLLER_INFO ControllerInfo); + diff --git a/reactos/drivers/storage/floppy/floppy.rc b/reactos/drivers/storage/floppy/floppy.rc new file mode 100644 index 00000000000..ed51fb042c0 --- /dev/null +++ b/reactos/drivers/storage/floppy/floppy.rc @@ -0,0 +1,62 @@ +/* + * ReactOS Floppy Driver + * Copyright (C) 2004, Vizzini (vizzini@plasmic.com) + * + * 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 Floppy Driver + * FILE: floppy.rc + * PURPOSE: Resrouce definition file + * PROGRAMMER: Vizzini (vizzini@plasmic.com) + * REVISIONS: + * 15-Feb-2004 vizzini - Created + */ +#include <defines.h> +#include <reactos/resource.h> + +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", "Floppy Disk Controller Driver\0" + VALUE "FileVersion", "0.0.0\0" + VALUE "InternalName", "floppy\0" + VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT + VALUE "OriginalFilename", "floppy.sys\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/drivers/storage/floppy/hardware.c b/reactos/drivers/storage/floppy/hardware.c new file mode 100644 index 00000000000..da4d67bad3e --- /dev/null +++ b/reactos/drivers/storage/floppy/hardware.c @@ -0,0 +1,1117 @@ +/* + * ReactOS Floppy Driver + * Copyright (C) 2004, Vizzini (vizzini@plasmic.com) + * + * 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 Floppy Driver + * FILE: hardware.c + * PURPOSE: FDC Hardware control routines + * PROGRAMMER: Vizzini (vizzini@plasmic.com) + * REVISIONS: + * 15-Feb-2004 vizzini - Created + * NOTES: + * - Many of these functions are based directly on information from the + * Intel datasheet for their enhanced floppy controller. Send_Byte and + * Get_Byte are direct C implementations of their flowcharts, and the + * read/write routine and others are loose adaptations of their charts. + * - These routines are generally designed to be small, atomic operations. They + * do not wait for interrupts, deal with DMA, or do any other Windows- + * specific things, unless they have to. + * - If you compare this to Microsoft samples or to the old ReactOS driver, + * or even to the linux driver, you will notice a big difference: we use + * a system thread to drain the queue. This is because it's illegal to block + * in a dispatch routine, unless you're a top-level driver (which we absolutely + * are not). One big reason is that we may be called at raised IRQL, at which + * it's illegal to block. The floppy controller is a *dumb* piece of hardware, + * too - it is slow and difficult to deal with. The solution is to do all + * of the blocking and servicing of the controller in a dedicated worker + * thread. + * - Some information taken from Intel 82077AA data sheet (order #290166-007) + * + * TODO: Fix all of the stupid STATUS_UNSUCCESSFUL return codes + * TODO: ATM the constants defined in hardware.h *might* be shifted to line up + * with the bit position in the register, or they *might not*. This should + * all be converted to standardize on absolute values or shifts. + * I prefer bit fields, but they break endianness. + * TODO: Figure out the right delays in Send_Byte and Get_Byte + */ + +#include <ntddk.h> + +#include "floppy.h" +#include "hardware.h" + +/* + * Global variable that tracks the amount of time we've + * been waiting on the controller + */ +static ULONG TimeIncrement = 0; + + +/* + * Hardware Support Routines + */ + + +static BOOLEAN NTAPI ReadyForWrite(PCONTROLLER_INFO ControllerInfo) +/* + * FUNCTION: Determine of the controller is ready to accept a byte on the FIFO + * ARGUMENTS: + * ControllerInfo: Info structure for the FDC we're testing + * RETURNS: + * TRUE if the controller can accept a byte right now + * FALSE otherwise + * NOTES: + * - it is necessary to check both that the FIFO is set to "outbound" + * and that the "ready for i/o" bit is set. + */ +{ + UCHAR Status = READ_PORT_UCHAR(ControllerInfo->BaseAddress + MAIN_STATUS_REGISTER); + + PAGED_CODE(); + + if((Status & MSR_IO_DIRECTION)) /* 0 for out */ + { + //KdPrint(("floppy: ReadyForWrite returning false due to incorrect FIFO direction; Status = 0x%x\n", Status)); + //HwDumpRegisters(ControllerInfo); + return FALSE; + } + + if(!(Status & MSR_DATA_REG_READY_FOR_IO)) + { + //KdPrint(("floppy: ReadyForWrite returning false due to MSR Not ready for I/O; Status = 0x%x\n", Status)); + //HwDumpRegisters(ControllerInfo); + return FALSE; + } + + return TRUE; +} + + +static BOOLEAN NTAPI ReadyForRead(PCONTROLLER_INFO ControllerInfo) +/* + * FUNCTION: Determine of the controller is ready to read a byte on the FIFO + * ARGUMENTS: + * ControllerInfo: Info structure for the FDC we're testing + * RETURNS: + * TRUE if the controller can read a byte right now + * FALSE otherwise + * NOTES: + * - it is necessary to check both that the FIFO is set to "inbound" + * and that the "ready for i/o" bit is set. + */ +{ + UCHAR Status = READ_PORT_UCHAR(ControllerInfo->BaseAddress + MAIN_STATUS_REGISTER); + + PAGED_CODE(); + + if(!(Status & MSR_IO_DIRECTION)) /* Read = 1 */ + { +// KdPrint(("floppy: ReadyForRead returning FALSE due to incorrect FIFO direction; Status 0x%x\n", Status)); +// HwDumpRegisters(ControllerInfo); + return FALSE; + } + + if(!(Status & MSR_DATA_REG_READY_FOR_IO)) + { +// KdPrint(("floppy: ReadyForRead returning FALSE due to MSR Not ready for I/O\n; Status 0x%x", Status)); +// HwDumpRegisters(ControllerInfo); + return FALSE; + } + + return TRUE; +} + + +static NTSTATUS NTAPI Send_Byte(PCONTROLLER_INFO ControllerInfo, + UCHAR Byte) +/* + * FUNCTION: Send a byte from the host to the controller's FIFO + * ARGUMENTS: + * ControllerInfo: Info structure for the controller we're writing to + * Offset: Offset over the controller's base address that we're writing to + * Byte: Byte to write to the bus + * RETURNS: + * STATUS_SUCCESS if the byte was written successfully + * STATUS_UNSUCCESSFUL if not + * NOTES: + * - Function designed after flowchart in intel datasheet + * - 250us max delay. Note that this is exactly 5 times longer + * than Microsoft recommends stalling the processor + * - Remember that we can be interrupted here, so this might + * take much more wall clock time than 250us + * - PAGED_CODE, because we spin for more than the Microsoft-recommended + * maximum. + * - This function is necessary because sometimes the FIFO reacts slowly + * and isn't yet ready to read or write the next byte + */ +{ + LARGE_INTEGER StartingTickCount; + LARGE_INTEGER CurrentTickCount; + PUCHAR Address; + + //KdPrint(("floppy: Send_Byte called to write 0x%x at offset 0x%x\n", Byte, Offset)); + + PAGED_CODE(); + + Address = ControllerInfo->BaseAddress + FIFO; + + if(!TimeIncrement) + TimeIncrement = KeQueryTimeIncrement(); + + StartingTickCount.QuadPart = 0; + + for(;;) + { + if(!ReadyForWrite(ControllerInfo)) + { + ULONG64 ElapsedTicks; + ULONG64 TimeUnits; + + /* If this is the first time through... */ + if(!StartingTickCount.QuadPart) + { + KeQueryTickCount(&StartingTickCount); + continue; + } + + /* Otherwise, only do this for 250 us == 2500 100ns units */ + KeQueryTickCount(&CurrentTickCount); + ElapsedTicks = CurrentTickCount.QuadPart - StartingTickCount.QuadPart; + TimeUnits = ElapsedTicks * TimeIncrement; + + //KdPrint(("floppy: Send_Byte: failed to write; elapsed time %d\n", TimeUnits)); + + if(TimeUnits > 25000000) + break; + + continue; + } + + WRITE_PORT_UCHAR(Address, Byte); + return STATUS_SUCCESS; + } + + KdPrint(("floppy: Send_Byte: timed out trying to write\n")); + HwDumpRegisters(ControllerInfo); + return STATUS_UNSUCCESSFUL; +} + + +static NTSTATUS NTAPI Get_Byte(PCONTROLLER_INFO ControllerInfo, + PUCHAR Byte) +/* + * FUNCTION: Read a byte from the controller to the host + * ARGUMENTS: + * ControllerInfo: Info structure for the controller we're reading from + * Offset: Offset over the controller's base address that we're reading from + * Byte: Byte to read from the bus + * RETURNS: + * STATUS_SUCCESS if the byte was read successfully + * STATUS_UNSUCCESSFUL if not + * NOTES: + * - Function designed after flowchart in intel datasheet + * - 250us max delay. Note that this is exactly 5 times longer + * than Microsoft recommends stalling the processor + * - Remember that we can be interrupted here, so this might + * take much more wall clock time than 250us + * - PAGED_CODE because we spin for longer than Microsoft recommends + */ +{ + LARGE_INTEGER StartingTickCount; + LARGE_INTEGER CurrentTickCount; + PUCHAR Address; + + PAGED_CODE(); + + Address = ControllerInfo->BaseAddress + FIFO; + + if(!TimeIncrement) + TimeIncrement = KeQueryTimeIncrement(); + + StartingTickCount.QuadPart = 0; + + for(;;) + { + if(!ReadyForRead(ControllerInfo)) + { + ULONG64 ElapsedTicks; + ULONG64 TimeUnits; + + /* if this is the first time through, start the timer */ + if(!StartingTickCount.QuadPart) + { + KeQueryTickCount(&StartingTickCount); + continue; + } + + /* Otherwise, only do this for 250 us == 2500 100ns units */ + KeQueryTickCount(&CurrentTickCount); + ElapsedTicks = CurrentTickCount.QuadPart - StartingTickCount.QuadPart; + TimeUnits = ElapsedTicks * TimeIncrement; + + //KdPrint(("floppy: Get_Byte: failed to read; elapsed time %d\n", TimeUnits)); + + if(TimeUnits > 25000000) + break; + + continue; + } + + *Byte = READ_PORT_UCHAR(Address); + + //KdPrint(("floppy: Get_Byte read 0x%x from offset 0x%x\n", *Byte, Offset)); + + return STATUS_SUCCESS; + } + + KdPrint(("floppy: Get_Byte: timed out trying to read\n")); + HwDumpRegisters(ControllerInfo); + return STATUS_UNSUCCESSFUL; +} + + +NTSTATUS NTAPI HwSetDataRate(PCONTROLLER_INFO ControllerInfo, + UCHAR DataRate) +/* + * FUNCTION: Set the data rte on a controller + * ARGUMENTS: + * ControllerInfo: Controller whose rate is being set + * DataRate: Data rate code to set the controller to + * RETURNS: + * STATUS_SUCCESS + */ +{ + KdPrint(("floppy: HwSetDataRate called; writing rate code 0x%x to offset 0x%x\n", DataRate, DATA_RATE_SELECT_REGISTER)); + + WRITE_PORT_UCHAR(ControllerInfo->BaseAddress + DATA_RATE_SELECT_REGISTER, DataRate); + + return STATUS_SUCCESS; +} + + +NTSTATUS NTAPI HwTurnOffMotor(PCONTROLLER_INFO ControllerInfo) +/* + * FUNCTION: Turn off all motors + * ARGUMENTS: + * DriveInfo: drive to turn off + * RETURNS: + * STATUS_SUCCESS if the motor is successfully turned off + * NOTES: + * - Don't call this routine directly unless you've thought about it + * and read the source to StartMotor() and StopMotor(). + * - Called at DISPATCH_LEVEL + */ +{ + KdPrint(("floppy: HwTurnOffMotor: writing byte 0x%x to offset 0x%x\n", DOR_FDC_ENABLE|DOR_DMA_IO_INTERFACE_ENABLE)); + + WRITE_PORT_UCHAR(ControllerInfo->BaseAddress + DIGITAL_OUTPUT_REGISTER, DOR_FDC_ENABLE|DOR_DMA_IO_INTERFACE_ENABLE); + + return STATUS_SUCCESS; +} + + +NTSTATUS NTAPI HwTurnOnMotor(PDRIVE_INFO DriveInfo) +/* + * FUNCTION: Turn on the motor on the selected drive + * ARGUMENTS: + * DriveInfo: drive to turn on + * RETURNS: + * STATUS_SUCCESS if the motor is successfully turned on + * STATUS_UNSUCCESSFUL otherwise + * NOTES: + * - Doesn't interrupt + */ +{ + PCONTROLLER_INFO ControllerInfo = DriveInfo->ControllerInfo; + UCHAR Unit = DriveInfo->UnitNumber; + UCHAR Buffer; + + //KdPrint(("floppy: HwTurnOnMotor called; setting unit 0x%x to data rate 0x%x\n", Unit, DataRate)); + + PAGED_CODE(); + + /* turn on motor */ + Buffer = Unit; + + Buffer |= DOR_FDC_ENABLE; + Buffer |= DOR_DMA_IO_INTERFACE_ENABLE; + + if(Unit == 0) + Buffer |= DOR_FLOPPY_MOTOR_ON_A; + else if (Unit == 1) + Buffer |= DOR_FLOPPY_MOTOR_ON_B; + else if (Unit == 2) + Buffer |= DOR_FLOPPY_MOTOR_ON_C; + else if (Unit == 3) + Buffer |= DOR_FLOPPY_MOTOR_ON_D; + + KdPrint(("floppy: HwTurnOnMotor: writing byte 0x%x to offset 0x%x\n", Buffer, DIGITAL_OUTPUT_REGISTER)); + WRITE_PORT_UCHAR(ControllerInfo->BaseAddress + DIGITAL_OUTPUT_REGISTER, Buffer); + + return STATUS_SUCCESS; +} + + +NTSTATUS NTAPI HwSenseDriveStatus(PDRIVE_INFO DriveInfo) +/* + * FUNCTION: Start a sense status command + * ARGUMENTS: + * DriveInfo: Drive to inquire about + * RETURNS: + * STATUS_SUCCESS if the command is successfully queued to the controller + * STATUS_UNSUCCESSFUL if not + * NOTES: + * - Generates an interrupt + * - hard-wired to head 0 + */ +{ + UCHAR Buffer[2]; + int i; + + PAGED_CODE(); + + KdPrint(("floppy: HwSenseDriveStatus called\n")); + + Buffer[0] = COMMAND_SENSE_DRIVE_STATUS; + Buffer[1] = DriveInfo->UnitNumber; /* hard-wired to head 0 for now */ + + for(i = 0; i < 2; i++) + if(Send_Byte(DriveInfo->ControllerInfo, Buffer[i]) != STATUS_SUCCESS) + { + KdPrint(("floppy: HwSenseDriveStatus: failed to write FIFO\n")); + return STATUS_UNSUCCESSFUL; + } + + return STATUS_SUCCESS; +} + + +NTSTATUS NTAPI HwReadWriteData(PCONTROLLER_INFO ControllerInfo, + BOOLEAN Read, + UCHAR Unit, + UCHAR Cylinder, + UCHAR Head, + UCHAR Sector, + UCHAR BytesPerSector, + UCHAR EndOfTrack, + UCHAR Gap3Length, + UCHAR DataLength) +/* + * FUNCTION: Read or write data to the drive + * ARGUMENTS: + * ControllerInfo: controller to target the read/write request to + * Read: TRUE if the device should be read; FALSE if written + * Unit: Drive number to target + * Cylinder: cylinder to start the read on + * Head: head to start the read on + * Sector: sector to start the read on (1-based!) + * BytesPerSector: sector size constant (hardware.h) + * EndOfTrack: Marks the last sector number to read/write on the track + * Gap3Length: Gap length for the operation + * DataLength: Bytes to read, *unless* BytesPerSector is specified + * RETURNS: + * STATUS_SUCCESS if the operation was successfully queued to the controller + * STATUS_UNSUCCESSFUL otherwise + * NOTES: + * - Generates an interrupt + */ +{ + UCHAR Buffer[9]; + int i; + + PAGED_CODE(); + + //KdPrint(("floppy: HwReadWriteData called\n")); + + /* Shouldn't be using DataLength in this driver */ + ASSERT(DataLength == 0xff); + + /* Build the command to send */ + if(Read) + Buffer[0] = COMMAND_READ_DATA; + else + Buffer[0] = COMMAND_WRITE_DATA; + + Buffer[0] |= READ_DATA_MFM | READ_DATA_MT | READ_DATA_SK; + + Buffer[1] = (Head << COMMAND_HEAD_NUMBER_SHIFT) | Unit; + Buffer[2] = Cylinder; + Buffer[3] = Head; + Buffer[4] = Sector; + Buffer[5] = BytesPerSector; + Buffer[6] = EndOfTrack; + Buffer[7] = Gap3Length; + Buffer[8] = DataLength; + + /* Send the command */ + for(i = 0; i < 9; i++) + { + KdPrint(("floppy: HwReadWriteData: Sending a command byte to the FIFO: 0x%x\n", Buffer[i])); + + if(Send_Byte(ControllerInfo, Buffer[i]) != STATUS_SUCCESS) + { + KdPrint(("HwReadWriteData: Unable to write to the FIFO\n")); + return STATUS_UNSUCCESSFUL; + } + } + + //KdPrint(("floppy: HwReadWriteData: returning STATUS_SUCCESS\n")); + return STATUS_SUCCESS; +} + + +NTSTATUS NTAPI HwRecalibrateResult(PCONTROLLER_INFO ControllerInfo) +/* + * FUNCTION: Get the result of a recalibrate command + * ARGUMENTS: + * ControllerInfo: controller to query + * RETURNS: + * STATUS_SUCCESS if the recalibratewas a success + * STATUS_UNSUCCESSFUL otherwise + * NOTES: + * - This function tests the error conditions itself, and boils the + * whole thing down to a single SUCCESS or FAILURE result + * - Called post-interrupt; does not interrupt + * TODO + * - handle much more status + */ +{ + UCHAR Buffer[2]; + int i; + + PAGED_CODE(); + + //KdPrint(("floppy: HwRecalibrateResult called\n")); + + if(Send_Byte(ControllerInfo, COMMAND_SENSE_INTERRUPT_STATUS) != STATUS_SUCCESS) + { + KdPrint(("floppy: HwRecalibrateResult: Unable to write the controller\n")); + return STATUS_UNSUCCESSFUL; + } + + for(i = 0; i < 2; i++) + if(Get_Byte(ControllerInfo, &Buffer[i]) != STATUS_SUCCESS) + { + KdPrint(("floppy: HwRecalibrateResult: unable to read FIFO\n")); + return STATUS_UNSUCCESSFUL; + } + + /* Validate that it did what we told it to */ + KdPrint(("floppy: HwRecalibrateResult results: ST0: 0x%x PCN: 0x%x\n", Buffer[0], Buffer[1])); + + /* + * Buffer[0] = ST0 + * Buffer[1] = PCN + */ + + /* Is the PCN 0? */ + if(Buffer[1] != 0) + { + KdPrint(("floppy: HwRecalibrateResult: PCN not 0\n")); + return STATUS_UNSUCCESSFUL; + } + + /* test seek complete */ + if((Buffer[0] & SR0_SEEK_COMPLETE) != SR0_SEEK_COMPLETE) + { + KdPrint(("floppy: HwRecalibrateResult: Failed to complete the seek\n")); + return STATUS_UNSUCCESSFUL; + } + + /* Is the equipment check flag set? Could be no disk in drive... */ + if((Buffer[0] & SR0_EQUIPMENT_CHECK) == SR0_EQUIPMENT_CHECK) + KdPrint(("floppy: HwRecalibrateResult: Seeked to track 0 successfully, but EC is set; returning STATUS_SUCCESS anyway\n")); + + return STATUS_SUCCESS; +} + + +NTSTATUS NTAPI HwReadWriteResult(PCONTROLLER_INFO ControllerInfo) +/* + * FUNCTION: Get the result of a read or write from the controller + * ARGUMENTS: + * ControllerInfo: controller to query + * RETURNS: + * STATUS_SUCCESS if the read/write was a success + * STATUS_UNSUCCESSFUL otherwise + * NOTES: + * - This function tests the error conditions itself, and boils the + * whole thing down to a single SUCCESS or FAILURE result + * - Called post-interrupt; does not interrupt + * TODO + * - handle much more status + */ +{ + UCHAR Buffer[7]; + int i; + + //KdPrint(("floppy: HwReadWriteResult called\n")); + + PAGED_CODE(); + + for(i = 0; i < 7; i++) + if(Get_Byte(ControllerInfo, &Buffer[i]) != STATUS_SUCCESS) + { + KdPrint(("floppy: HwReadWriteResult: unable to read fifo\n")); + return STATUS_UNSUCCESSFUL; + } + + /* Validate that it did what we told it to */ + KdPrint(("floppy: HwReadWriteResult results: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", Buffer[0], Buffer[1], Buffer[2], Buffer[3], + Buffer[4], Buffer[5], Buffer[6])); + + /* Last command successful? */ + if((Buffer[0] & SR0_LAST_COMMAND_STATUS) != SR0_LCS_SUCCESS) + return STATUS_UNSUCCESSFUL; + + return STATUS_SUCCESS; +} + + +NTSTATUS NTAPI HwRecalibrate(PDRIVE_INFO DriveInfo) +/* + * FUNCTION: Start a recalibration of a drive + * ARGUMENTS: + * DriveInfo: Drive to recalibrate + * RETURNS: + * STATUS_SUCCESS if the command was successfully queued to the controller + * STATUS_UNSUCCESSFUL otherwise + * NOTES: + * - Generates an interrupt + */ +{ + PCONTROLLER_INFO ControllerInfo = DriveInfo->ControllerInfo; + UCHAR Unit = DriveInfo->UnitNumber; + UCHAR Buffer[2]; + int i; + + KdPrint(("floppy: HwRecalibrate called\n")); + + PAGED_CODE(); + + Buffer[0] = COMMAND_RECALIBRATE; + Buffer[1] = Unit; + + for(i = 0; i < 2; i++) + if(Send_Byte(ControllerInfo, Buffer[i]) != STATUS_SUCCESS) + { + KdPrint(("floppy: HwRecalibrate: unable to write FIFO\n")); + return STATUS_UNSUCCESSFUL; + } + + return STATUS_SUCCESS; +} + + +NTSTATUS NTAPI HwSenseInterruptStatus(PCONTROLLER_INFO ControllerInfo) +/* + * FUNCTION: Send a sense interrupt status command to a controller + * ARGUMENTS: + * ControllerInfo: controller to queue the command to + * RETURNS: + * STATUS_SUCCESS if the command is queued successfully + * STATUS_UNSUCCESSFUL if not + */ +{ + UCHAR Buffer[2]; + int i; + + PAGED_CODE(); + + //KdPrint(("floppy: HwSenseInterruptStatus called\n")); + + if(Send_Byte(ControllerInfo, COMMAND_SENSE_INTERRUPT_STATUS) != STATUS_SUCCESS) + { + KdPrint(("floppy: HwSenseInterruptStatus: failed to write controller\n")); + return STATUS_UNSUCCESSFUL; + } + + for(i = 0; i < 2; i++) + { + if(Get_Byte(ControllerInfo, &Buffer[i]) != STATUS_SUCCESS) + { + KdPrint(("floppy: HwSenseInterruptStatus: failed to read controller\n")); + return STATUS_UNSUCCESSFUL; + } + } + + KdPrint(("floppy: HwSenseInterruptStatus returned 0x%x 0x%x\n", Buffer[0], Buffer[1])); + + return STATUS_SUCCESS; +} + + +NTSTATUS NTAPI HwReadId(PDRIVE_INFO DriveInfo, UCHAR Head) +/* + * FUNCTION: Issue a read id command to the drive + * ARGUMENTS: + * DriveInfo: Drive to read id from + * Head: Head to read the ID from + * RETURNS: + * STATUS_SUCCESS if the command is queued + * STATUS_UNSUCCESSFUL otherwise + * NOTES: + * - Generates an interrupt + */ +{ + UCHAR Buffer[2]; + int i; + + KdPrint(("floppy: HwReadId called\n")); + + PAGED_CODE(); + + Buffer[0] = COMMAND_READ_ID | READ_ID_MFM; + Buffer[1] = (Head << COMMAND_HEAD_NUMBER_SHIFT) | DriveInfo->UnitNumber; + + for(i = 0; i < 2; i++) + if(Send_Byte(DriveInfo->ControllerInfo, Buffer[i]) != STATUS_SUCCESS) + { + KdPrint(("floppy: HwReadId: unable to send bytes to fifo\n")); + return STATUS_UNSUCCESSFUL; + } + + return STATUS_SUCCESS; +} + + +NTSTATUS NTAPI HwFormatTrack(PCONTROLLER_INFO ControllerInfo, + UCHAR Unit, + UCHAR Head, + UCHAR BytesPerSector, + UCHAR SectorsPerTrack, + UCHAR Gap3Length, + UCHAR FillerPattern) +/* + * FUNCTION: Format a track + * ARGUMENTS: + * ControllerInfo: controller to target with the request + * Unit: drive to format on + * Head: head to format on + * BytesPerSector: constant from hardware.h to select density + * SectorsPerTrack: sectors per track + * Gap3Length: gap length to use during format + * FillerPattern: pattern to write into the data portion of sectors + * RETURNS: + * STATUS_SUCCESS if the command is successfully queued + * STATUS_UNSUCCESSFUL otherwise + */ +{ + UCHAR Buffer[6]; + int i; + + KdPrint(("floppy: HwFormatTrack called\n")); + + PAGED_CODE(); + + Buffer[0] = COMMAND_FORMAT_TRACK; + Buffer[1] = (Head << COMMAND_HEAD_NUMBER_SHIFT) | Unit; + Buffer[2] = BytesPerSector; + Buffer[3] = SectorsPerTrack; + Buffer[4] = Gap3Length; + Buffer[5] = FillerPattern; + + for(i = 0; i < 6; i++) + if(Send_Byte(ControllerInfo, Buffer[i]) != STATUS_SUCCESS) + { + KdPrint(("floppy: HwFormatTrack: unable to send bytes to floppy\n")); + return STATUS_UNSUCCESSFUL; + } + + return STATUS_SUCCESS; +} + + +NTSTATUS NTAPI HwSeek(PDRIVE_INFO DriveInfo, + UCHAR Cylinder) +/* + * FUNCTION: Seek the heads to a particular cylinder + * ARGUMENTS: + * DriveInfo: Drive to seek + * Cylinder: cylinder to move to + * RETURNS: + * STATUS_SUCCESS if the command is successfully sent + * STATUS_UNSUCCESSFUL otherwise + * NOTES: + * - Generates an interrupt + */ +{ + LARGE_INTEGER Delay; + UCHAR Buffer[3]; + int i; + + KdPrint(("floppy: HwSeek called for cyl 0x%x\n", Cylinder)); + + PAGED_CODE(); + + Buffer[0] = COMMAND_SEEK; + Buffer[1] = DriveInfo->UnitNumber; + Buffer[2] = Cylinder; + + for(i = 0; i < 3; i++) + if(Send_Byte(DriveInfo->ControllerInfo, Buffer[i]) != STATUS_SUCCESS) + { + KdPrint(("floppy: HwSeek: failed to write fifo\n")); + return STATUS_UNSUCCESSFUL; + } + + /* Wait for the head to settle */ + Delay.QuadPart = 10 * 1000; + Delay.QuadPart *= -1; + Delay.QuadPart *= DriveInfo->FloppyDeviceData.HeadSettleTime; + + KeDelayExecutionThread(KernelMode, FALSE, &Delay); + + return STATUS_SUCCESS; +} + + +NTSTATUS NTAPI HwConfigure(PCONTROLLER_INFO ControllerInfo, + BOOLEAN EIS, + BOOLEAN EFIFO, + BOOLEAN POLL, + UCHAR FIFOTHR, + UCHAR PRETRK) +/* + * FUNCTION: Sends configuration to the drive + * ARGUMENTS: + * ControllerInfo: controller to target with the request + * EIS: Enable implied seek + * EFIFO: Enable advanced fifo + * POLL: Enable polling + * FIFOTHR: fifo threshold + * PRETRK: precomp (see intel datasheet) + * RETURNS: + * STATUS_SUCCESS if the command is successfully sent + * STATUS_UNSUCCESSFUL otherwise + * NOTES: + * - No interrupt + */ +{ + UCHAR Buffer[4]; + int i; + + KdPrint(("floppy: HwConfigure called\n")); + + PAGED_CODE(); + + Buffer[0] = COMMAND_CONFIGURE; + Buffer[1] = 0; + Buffer[2] = (EIS * CONFIGURE_EIS) + (EFIFO * CONFIGURE_EFIFO) + (POLL * CONFIGURE_POLL) + (FIFOTHR); + Buffer[3] = PRETRK; + + for(i = 0; i < 4; i++) + if(Send_Byte(ControllerInfo, Buffer[i]) != STATUS_SUCCESS) + { + KdPrint(("floppy: HwConfigure: failed to write the fifo\n")); + return STATUS_UNSUCCESSFUL; + } + + return STATUS_SUCCESS; +} + + +NTSTATUS NTAPI HwGetVersion(PCONTROLLER_INFO ControllerInfo) +/* + * FUNCTION: Gets the version of the controller + * ARGUMENTS: + * ControllerInfo: controller to target with the request + * ConfigValue: Configuration value to send to the drive (see header) + * RETURNS: + * Version number returned by the command, or + * 0 on failure + * NOTE: + * - This command doesn't interrupt, so we go right to reading after + * we issue the command + */ +{ + UCHAR Buffer; + + PAGED_CODE(); + + if(Send_Byte(ControllerInfo, COMMAND_VERSION) != STATUS_SUCCESS) + { + KdPrint(("floppy: HwGetVersion: unable to write fifo\n")); + return STATUS_UNSUCCESSFUL;; + } + + if(Get_Byte(ControllerInfo, &Buffer) != STATUS_SUCCESS) + { + KdPrint(("floppy: HwGetVersion: unable to write fifo\n")); + return STATUS_UNSUCCESSFUL; + } + + KdPrint(("floppy: HwGetVersion returning version 0x%x\n", Buffer)); + + return Buffer; +} + +NTSTATUS NTAPI HwDiskChanged(PDRIVE_INFO DriveInfo, + PBOOLEAN DiskChanged) +/* + * FUNCTION: Detect whether the hardware has sensed a disk change + * ARGUMENTS: + * DriveInfo: pointer to the drive that we are to check + * DiskChanged: boolean that is set with whether or not the controller thinks there has been a disk change + * RETURNS: + * STATUS_SUCCESS if the drive is successfully queried + * NOTES: + * - Does not interrupt. + * - Guessing a bit at the Model30 stuff + */ +{ + UCHAR Buffer; + PCONTROLLER_INFO ControllerInfo = (PCONTROLLER_INFO) DriveInfo->ControllerInfo; + + Buffer = READ_PORT_UCHAR(ControllerInfo->BaseAddress + DIGITAL_INPUT_REGISTER); + + KdPrint(("floppy: HwDiskChanged: read 0x%x from DIR\n", Buffer)); + + if(ControllerInfo->Model30) + { + if(!(Buffer & DIR_DISKETTE_CHANGE)) + { + KdPrint(("floppy: HdDiskChanged - Model30 - returning TRUE\n")); + *DiskChanged = TRUE; + } + else + { + KdPrint(("floppy: HdDiskChanged - Model30 - returning FALSE\n")); + *DiskChanged = FALSE; + } + } + else + { + if(Buffer & DIR_DISKETTE_CHANGE) + { + KdPrint(("floppy: HdDiskChanged - PS2 - returning TRUE\n")); + *DiskChanged = TRUE; + } + else + { + KdPrint(("floppy: HdDiskChanged - PS2 - returning FALSE\n")); + *DiskChanged = FALSE; + } + } + + return STATUS_SUCCESS; +} + +NTSTATUS NTAPI HwSenseDriveStatusResult(PCONTROLLER_INFO ControllerInfo, + PUCHAR Status) +/* + * FUNCTION: Get the result of a sense drive status command + * ARGUMENTS: + * ControllerInfo: controller to query + * Status: Status from the drive sense command + * RETURNS: + * STATUS_SUCCESS if we can successfully read the status + * STATUS_UNSUCCESSFUL otherwise + * NOTES: + * - Called post-interrupt; does not interrupt + */ +{ + PAGED_CODE(); + + if(Get_Byte(ControllerInfo, Status) != STATUS_SUCCESS) + { + KdPrint(("floppy: HwSenseDriveStatus: unable to read fifo\n")); + return STATUS_UNSUCCESSFUL; + } + + KdPrint(("floppy: HwSenseDriveStatusResult: ST3: 0x%x\n", *Status)); + + return STATUS_SUCCESS; +} + + +NTSTATUS NTAPI HwReadIdResult(PCONTROLLER_INFO ControllerInfo, + PUCHAR CurCylinder, + PUCHAR CurHead) +/* + * FUNCTION: Get the result of a read id command + * ARGUMENTS: + * ControllerInfo: controller to query + * CurCylinder: Returns the cylinder that we're at + * CurHead: Returns the head that we're at + * RETURNS: + * STATUS_SUCCESS if the read id was a success + * STATUS_UNSUCCESSFUL otherwise + * NOTES: + * - This function tests the error conditions itself, and boils the + * whole thing down to a single SUCCESS or FAILURE result + * - Called post-interrupt; does not interrupt + * TODO + * - handle much more status + */ +{ + UCHAR Buffer[7] = {0,0,0,0,0,0,0}; + int i; + + PAGED_CODE(); + + for(i = 0; i < 7; i++) + if(Get_Byte(ControllerInfo, &Buffer[i]) != STATUS_SUCCESS) + { + KdPrint(("floppy: ReadIdResult(): can't read from the controller\n")); + return STATUS_UNSUCCESSFUL; + } + + /* Validate that it did what we told it to */ + KdPrint(("floppy: ReadId results: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", Buffer[0], Buffer[1], Buffer[2], Buffer[3], + Buffer[4], Buffer[5], Buffer[6])); + + /* Last command successful? */ + if((Buffer[0] & SR0_LAST_COMMAND_STATUS) != SR0_LCS_SUCCESS) + { + KdPrint(("floppy: ReadId didn't return last command success\n")); + return STATUS_UNSUCCESSFUL; + } + + /* ID mark found? */ + if(Buffer[1] & SR1_CANNOT_FIND_ID_ADDRESS) + { + KdPrint(("floppy: ReadId didn't find an address mark\n")); + return STATUS_UNSUCCESSFUL; + } + + if(CurCylinder) + *CurCylinder = Buffer[3]; + + if(CurHead) + *CurHead = Buffer[4]; + + return STATUS_SUCCESS; +} + + +NTSTATUS NTAPI HwSpecify(PCONTROLLER_INFO ControllerInfo, + UCHAR HeadLoadTime, + UCHAR HeadUnloadTime, + UCHAR StepRateTime, + BOOLEAN NonDma) +/* + * FUNCTION: Set up timing and DMA mode for the controller + * ARGUMENTS: + * ControllerInfo: Controller to set up + * HeadLoadTime: Head load time (see data sheet for details) + * HeadUnloadTime: Head unload time + * StepRateTime: Step rate time + * NonDma: TRUE to disable DMA mode + * RETURNS: + * STATUS_SUCCESS if the contrller is successfully programmed + * STATUS_UNSUCCESSFUL if not + * NOTES: + * - Does not interrupt + * + * TODO: Figure out timings + */ +{ + UCHAR Buffer[3]; + int i; + + Buffer[0] = COMMAND_SPECIFY; + /* + Buffer[1] = (StepRateTime << 4) + HeadUnloadTime; + Buffer[2] = (HeadLoadTime << 1) + (NonDma ? 1 : 0); + */ + Buffer[1] = 0xd1; + Buffer[2] = 0x2; + + //KdPrint(("HwSpecify: sending 0x%x 0x%x 0x%x to FIFO\n", Buffer[0], Buffer[1], Buffer[2])); + KdPrint(("FLOPPY: HWSPECIFY: FIXME - sending 0x3 0xd1 0x2 to FIFO\n")); + + for(i = 0; i < 3; i++) + if(Send_Byte(ControllerInfo, Buffer[i]) != STATUS_SUCCESS) + { + KdPrint(("floppy: HwSpecify: unable to write to controller\n")); + return STATUS_UNSUCCESSFUL; + } + + return STATUS_SUCCESS; +} + + +NTSTATUS NTAPI HwReset(PCONTROLLER_INFO ControllerInfo) +/* + * FUNCTION: Reset the controller + * ARGUMENTS: + * ControllerInfo: controller to reset + * RETURNS: + * STATUS_SUCCESS in all cases + * NOTES: + * - Generates an interrupt that must be serviced four times (one per drive) + */ +{ + KdPrint(("floppy: HwReset called\n")); + + /* Write the reset bit in the DRSR */ + WRITE_PORT_UCHAR(ControllerInfo->BaseAddress + DATA_RATE_SELECT_REGISTER, DRSR_SW_RESET); + + /* Check for the reset bit in the DOR and set it if necessary (see Intel doc) */ + if(!(READ_PORT_UCHAR(ControllerInfo->BaseAddress + DIGITAL_OUTPUT_REGISTER) & DOR_RESET)) + { + HwDumpRegisters(ControllerInfo); + KdPrint(("floppy: HwReset: Setting Enable bit\n")); + WRITE_PORT_UCHAR(ControllerInfo->BaseAddress + DIGITAL_OUTPUT_REGISTER, DOR_DMA_IO_INTERFACE_ENABLE|DOR_RESET); + HwDumpRegisters(ControllerInfo); + + if(!(READ_PORT_UCHAR(ControllerInfo->BaseAddress + DIGITAL_OUTPUT_REGISTER) & DOR_RESET)) + { + KdPrint(("floppy: HwReset: failed to set the DOR enable bit!\n")); + HwDumpRegisters(ControllerInfo); + return STATUS_UNSUCCESSFUL; + } + } + + return STATUS_SUCCESS; +} + + +NTSTATUS NTAPI HwPowerOff(PCONTROLLER_INFO ControllerInfo) +/* + * FUNCTION: Power down a controller + * ARGUMENTS: + * ControllerInfo: Controller to power down + * RETURNS: + * STATUS_SUCCESS + * NOTES: + * - Wake up with a hardware reset + */ +{ + KdPrint(("floppy: HwPowerOff called on controller 0x%x\n", ControllerInfo)); + + WRITE_PORT_UCHAR(ControllerInfo->BaseAddress + DATA_RATE_SELECT_REGISTER, DRSR_POWER_DOWN); + + return STATUS_SUCCESS; +} + +VOID NTAPI HwDumpRegisters(PCONTROLLER_INFO ControllerInfo) +/* + * FUNCTION: Dump all readable registers from the floppy controller + * ARGUMENTS: + * ControllerInfo: Controller to dump registers from + */ +{ + KdPrint(("floppy: STATUS: ")); + KdPrint(("STATUS_REGISTER_A = 0x%x ", READ_PORT_UCHAR(ControllerInfo->BaseAddress + STATUS_REGISTER_A))); + KdPrint(("STATUS_REGISTER_B = 0x%x ", READ_PORT_UCHAR(ControllerInfo->BaseAddress + STATUS_REGISTER_B))); + KdPrint(("DIGITAL_OUTPUT_REGISTER = 0x%x ", READ_PORT_UCHAR(ControllerInfo->BaseAddress + DIGITAL_OUTPUT_REGISTER))); + KdPrint(("MAIN_STATUS_REGISTER =0x%x ", READ_PORT_UCHAR(ControllerInfo->BaseAddress + MAIN_STATUS_REGISTER))); + KdPrint(("DIGITAL_INPUT_REGISTER = 0x%x\n", READ_PORT_UCHAR(ControllerInfo->BaseAddress + DIGITAL_INPUT_REGISTER))); +} + diff --git a/reactos/drivers/storage/floppy/hardware.h b/reactos/drivers/storage/floppy/hardware.h new file mode 100644 index 00000000000..7d110d9ee81 --- /dev/null +++ b/reactos/drivers/storage/floppy/hardware.h @@ -0,0 +1,336 @@ +/* + * ReactOS Floppy Driver + * Copyright (C) 2004, Vizzini (vizzini@plasmic.com) + * + * 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 Floppy Driver + * FILE: hardware.h + * PURPOSE: Header for FDC control routines + * PROGRAMMER: Vizzini (vizzini@plasmic.com) + * REVISIONS: + * 15-Feb-2004 vizzini - Created + * + * NOTES: + * - Baesd on http://www.nondot.org/sabre/os/files/Disk/FLOPPY.TXT + * - Some information taken from Intel 82077AA data sheet (order #290166-007) + * - Some definitions are PS/2-Specific; others include the original NEC PD765 + * - Other information gathered from the comments in the NT 3.5 floppy driver + * + * TODO: + * - Convert these numbers to 100% absolute values; eliminate bit positions + * in favor of shifts or bitfields + */ + +#define FLOPPY_DEFAULT_IRQ 0x6 + +/* Register offsets from base address (usually 0x3f8) */ +#define STATUS_REGISTER_A 0x0 /* Read; PS/2 Only */ +#define STATUS_REGISTER_B 0x1 /* Read; PS/2 Only */ +#define DIGITAL_OUTPUT_REGISTER 0x2 /* Read/Write */ +#define TAPE_DRIVE_REGISTER 0x3 /* Read/Write */ +#define MAIN_STATUS_REGISTER 0x4 /* Read */ +#define DATA_RATE_SELECT_REGISTER 0x4 /* Write */ +#define FIFO 0x5 /* Read/Write */ +#define RESERVED_REGISTER 0x6 /* Reserved */ +#define DIGITAL_INPUT_REGISTER 0x7 /* Read; PS/2 Only */ +#define CONFIGURATION_CONTROL_REGISTER 0x7 /* Write; PS/2 Only */ + +/* STATUS_REGISTER_A */ +#define DSRA_DIRECTION 0x1 +#define DSRA_WRITE_PROTECT 0x2 +#define DSRA_INDEX 0x4 +#define DSRA_HEAD_1_SELECT 0x8 +#define DSRA_TRACK_0 0x10 +#define DSRA_STEP 0x20 +#define DSRA_SECOND_DRIVE_INSTALLED 0x40 +#define DSRA_INTERRUPT_PENDING 0x80 + +/* STATUS_REGISTER_B */ +#define DSRB_MOTOR_ENABLE_0 0x1 +#define DSRB_MOTOR_ENABLE_1 0x2 +#define DSRB_WRITE_ENABLE 0x4 +#define DSRB_READ_DATA 0x8 +#define DSRB_WRTITE_DATA 0x10 +#define DSRB_DRIVE_SELECT 0x20 + +/* DIGITAL_OUTPUT_REGISTER */ +#define DOR_FLOPPY_DRIVE_SELECT 0x3 /* Covers 2 bits, defined below */ +#define DOR_FDC_ENABLE 0x4 /* from the website */ +#define DOR_RESET 0x4 /* from the Intel guide; 0 = resetting, 1 = enabled */ +#define DOR_DMA_IO_INTERFACE_ENABLE 0x8 /* Reserved on PS/2 */ +#define DOR_FLOPPY_MOTOR_ON_A 0x10 +#define DOR_FLOPPY_MOTOR_ON_B 0x20 +#define DOR_FLOPPY_MOTOR_ON_C 0x40 /* Reserved on PS/2 */ +#define DOR_FLOPPY_MOTOR_ON_D 0x80 /* Reserved on PS/2 */ + +/* DOR_FLOPPY_DRIVE_SELECT */ +#define DOR_FLOPPY_DRIVE_SELECT_A 0x0 +#define DOR_FLOPPY_DRIVE_SELECT_B 0x1 +#define DOR_FLOPPY_DRIVE_SELECT_C 0x2 /* Reserved on PS/2 */ +#define DOR_FLOPPY_DRIVE_SELECT_D 0x3 /* Reserved on PS/2 */ + +/* MAIN_STATUS_REGISTER */ +#define MSR_FLOPPY_BUSY_0 0x1 +#define MSR_FLOPPY_BUSY_1 0x2 +#define MSR_FLOPPY_BUSY_2 0x4 /* Reserved on PS/2 */ +#define MSR_FLOPPY_BUSY_3 0x8 /* Reserved on PS/2 */ +#define MSR_READ_WRITE_IN_PROGRESS 0x10 +#define MSR_NON_DMA_MODE 0x20 +#define MSR_IO_DIRECTION 0x40 /* Determines meaning of Command Status Registers */ +#define MSR_DATA_REG_READY_FOR_IO 0x80 + +/* DATA_RATE_SELECT_REGISTER */ +#define DRSR_DSEL 0x3 /* covers two bits as defined below */ +#define DRSR_PRECOMP 0x1c /* covers three bits as defined below */ +#define DRSR_MBZ 0x20 +#define DRSR_POWER_DOWN 0x40 +#define DRSR_SW_RESET 0x80 + +/* DRSR_DSEL */ +#define DRSR_DSEL_500KBPS 0x0 +#define DRSR_DSEL_300KBPS 0x1 +#define DRSR_DSEL_250KBPS 0x2 +#define DRSR_DSEL_1MBPS 0x3 + +/* STATUS_REGISTER_0 */ +#define SR0_UNIT_SELECTED_AT_INTERRUPT 0x3 /* Covers two bits as defined below */ +#define SR0_HEAD_NUMBER_AT_INTERRUPT 0x4 /* Values defined below */ +#define SR0_NOT_READY_ON_READ_WRITE 0x8 /* Unused in PS/2 */ +#define SR0_SS_ACCESS_TO_HEAD_1 0x8 /* Unused in PS/2 */ +#define SR0_EQUIPMENT_CHECK 0x10 +#define SR0_SEEK_COMPLETE 0x20 +#define SR0_LAST_COMMAND_STATUS 0xC0 /* Covers two bits as defined below */ + +/* SR0_UNIT_SELECTED_AT_INTERRUPT */ +#define SR0_UNIT_SELECTED_A 0x0 +#define SR0_UNIT_SELECTED_B 0x1 +#define SR0_UNIT_SELECTED_C 0x2 +#define SR0_UNIT_SELECTED_D 0x3 +#define SR0_PS2_UNIT_SELECTED_A 0x1 /* PS/2 uses only two drives: A = 01b B = 10b */ +#define SR0_PST_UNIT_SELECTED_B 0x2 + +/* SR0_HEAD_NUMBER_AT_INTERRUPT */ +#define SR0_HEAD_0 0x0 +#define SR0_HEAD_1 0x1 + +/* SR0_LAST_COMMAND_STATUS */ +#define SR0_LCS_SUCCESS 0x0 +#define SR0_LCS_TERMINATED_ABNORMALLY 0x40 +#define SR0_LCS_INVALID_COMMAND_ISSUED 0x80 +#define SR0_LCS_READY_SIGNAL_CHANGED 0xc0 /* Reserved on PS/2; a/k/a abnormal termination due to polling */ + +/* STATUS_REGISTER_1 */ +#define SR1_CANNOT_FIND_ID_ADDRESS 0x1 /* Mimics SR2_WRONG_CYLINDER_DETECTED */ +#define SR1_WRITE_PROTECT_DETECTED 0x2 +#define SR1_CANNOT_FIND_SECTOR_ID 0x4 +#define SR1_OVERRUN 0x10 +#define SR1_CRC_ERROR 0x20 +#define SR1_END_OF_CYLINDER 0x80 + +/* STATUS_REGISTER_2 */ +#define SR2_MISSING_ADDRESS_MARK 0x1 +#define SR2_BAD_CYLINDER 0x2 +#define SR2_SCAN_COMMAND_FAILED 0x4 +#define SR2_SCAN_COMMAND_EQUAL 0x8 +#define SR2_WRONG_CYLINDER_DETECTED 0x10 /* Mimics SR1_CANNOT_FIND_ID_ADDRESS */ +#define SR2_CRC_ERROR_IN_SECTOR_DATA 0x20 +#define SR2_SECTOR_WITH_DELETED_DATA 0x40 + +/* STATUS_REGISTER_3 */ +#define SR3_UNIT_SELECTED 0x3 /* Covers two bits; defined below */ +#define SR3_SIDE_HEAD_SELECT_STATUS 0x4 /* Values defined below */ +#define SR3_TWO_SIDED_STATUS_SIGNAL 0x8 +#define SR3_TRACK_ZERO_STATUS_SIGNAL 0x10 +#define SR3_READY_STATUS_SIGNAL 0x20 +#define SR3_WRITE_PROTECT_STATUS_SIGNAL 0x40 +#define SR3_FAULT_STATUS_SIGNAL 0x80 + +/* SR3_UNIT_SELECTED */ +#define SR3_UNIT_SELECTED_A 0x0 +#define SR3_UNIT_SELECTED_B 0x1 +#define SR3_UNIT_SELECTED_C 0x2 +#define SR3_UNIT_SELECTED_D 0x3 + +/* SR3_SIDE_HEAD_SELECT_STATUS */ +#define SR3_SHSS_HEAD_0 0x0 +#define SR3_SHSS_HEAD_1 0x1 + +/* DIGITAL_INPUT_REGISTER */ +#define DIR_HIGH_DENSITY_SELECT 0x1 +#define DIR_DISKETTE_CHANGE 0x80 + +/* CONFIGURATION_CONTROL_REGISTER */ +#define CCR_DRC 0x3 /* Covers two bits, defined below */ +#define CCR_DRC_0 0x1 +#define CCR_DRC_1 0x2 + +/* CCR_DRC */ +#define CCR_DRC_500000 0x0 +#define CCR_DRC_250000 0x2 + +/* Commands */ +#define COMMAND_READ_TRACK 0x2 +#define COMMAND_SPECIFY 0x3 +#define COMMAND_SENSE_DRIVE_STATUS 0x4 +#define COMMAND_WRITE_DATA 0x5 +#define COMMAND_READ_DATA 0x6 +#define COMMAND_RECALIBRATE 0x7 +#define COMMAND_SENSE_INTERRUPT_STATUS 0x8 +#define COMMAND_WRITE_DELETED_DATA 0x9 +#define COMMAND_READ_ID 0xA +#define COMMAND_READ_DELETED_DATA 0xC +#define COMMAND_FORMAT_TRACK 0xD +#define COMMAND_SEEK 0xF +#define COMMAND_VERSION 0x10 +#define COMMAND_SCAN_EQUAL 0x11 +#define COMMAND_CONFIGURE 0x13 +#define COMMAND_SCAN_LOW_OR_EQUAL 0x19 +#define COMMAND_SCAN_HIGH_OR_EQUAL 0x1D + +/* COMMAND_READ_DATA constants */ +#define READ_DATA_DS0 0x1 +#define READ_DATA_DS1 0x2 +#define READ_DATA_HDS 0x4 +#define READ_DATA_SK 0x20 +#define READ_DATA_MFM 0x40 +#define READ_DATA_MT 0x80 + +/* COMMAND_READ_ID constants */ +#define READ_ID_MFM 0x40 + +/* COMMAND_SPECIFY constants */ +#define SPECIFY_HLT_1M 0x10 /* 16ms; based on intel data sheet */ +#define SPECIFY_HLT_500K 0x8 /* 16ms; based on intel data sheet */ +#define SPECIFY_HLT_300K 0x6 /* 16ms; based on intel data sheet */ +#define SPECIFY_HLT_250K 0x4 /* 16ms; based on intel data sheet */ +#define SPECIFY_HUT_1M 0x0 /* Need to figure out these eight values; 0 is max */ +#define SPECIFY_HUT_500K 0x0 +#define SPECIFY_HUT_300K 0x0 +#define SPECIFY_HUT_250K 0x0 +#define SPECIFY_SRT_1M 0x0 +#define SPECIFY_SRT_500K 0x0 +#define SPECIFY_SRT_300K 0x0 +#define SPECIFY_SRT_250K 0x0 + +/* Command byte 1 constants */ +#define COMMAND_UNIT_SELECT 0x3 /* Covers two bits; defined below */ +#define COMMAND_UNIT_SELECT_0 0x1 +#define COMMAND_UNIT_SELECT_1 0x2 +#define COMMAND_HEAD_NUMBER 0x4 +#define COMMAND_HEAD_NUMBER_SHIFT 0x2 + +/* COMMAND_VERSION */ +#define VERSION_ENHANCED 0x90 + +/* COMMAND_UNIT_SELECT */ +#define CUS_UNIT_0 0x0 +#define CUS_UNIT_1 0x1 + +/* COMMAND_CONFIGURE constants */ +#define CONFIGURE_FIFOTHR 0xf +#define CONFIGURE_POLL 0x10 +#define CONFIGURE_EFIFO 0x20 +#define CONFIGURE_EIS 0x40 +#define CONFIGURE_PRETRK 0xff + +/* Command Head Number Constants */ +#define COMMAND_HEAD_0 0x0 +#define COMMAND_HEAD_1 0x1 + +/* Bytes per sector constants */ +#define HW_128_BYTES_PER_SECTOR 0x0 +#define HW_256_BYTES_PER_SECTOR 0x1 +#define HW_512_BYTES_PER_SECTOR 0x2 +#define HW_1024_BYTES_PER_SECTOR 0x3 + +/* + * FUNCTIONS + */ +NTSTATUS NTAPI HwTurnOnMotor(PDRIVE_INFO DriveInfo); + +NTSTATUS NTAPI HwSenseDriveStatus(PDRIVE_INFO DriveInfo); + +NTSTATUS NTAPI HwReadWriteData(PCONTROLLER_INFO ControllerInfo, + BOOLEAN Read, + UCHAR Unit, + UCHAR Cylinder, + UCHAR Head, + UCHAR Sector, + UCHAR BytesPerSector, + UCHAR EndOfTrack, + UCHAR Gap3Length, + UCHAR DataLength); + +NTSTATUS NTAPI HwRecalibrate(PDRIVE_INFO DriveInfo); + +NTSTATUS NTAPI HwSenseInterruptStatus(PCONTROLLER_INFO ControllerInfo); + +NTSTATUS NTAPI HwReadId(PDRIVE_INFO DriveInfo, + UCHAR Head); + +NTSTATUS NTAPI HwFormatTrack(PCONTROLLER_INFO ControllerInfo, + UCHAR Unit, + UCHAR Head, + UCHAR BytesPerSector, + UCHAR SectorsPerTrack, + UCHAR Gap3Length, + UCHAR FillerPattern); + +NTSTATUS NTAPI HwSeek(PDRIVE_INFO DriveInfo, + UCHAR Cylinder); + +NTSTATUS NTAPI HwReadWriteResult(PCONTROLLER_INFO ControllerInfo); + +NTSTATUS NTAPI HwGetVersion(PCONTROLLER_INFO ControllerInfo); + +NTSTATUS NTAPI HwConfigure(PCONTROLLER_INFO ControllerInfo, + BOOLEAN EIS, + BOOLEAN EFIFO, + BOOLEAN POLL, + UCHAR FIFOTHR, + UCHAR PRETRK) ; + +NTSTATUS NTAPI HwRecalibrateResult(PCONTROLLER_INFO ControllerInfo); + +NTSTATUS NTAPI HwDiskChanged(PDRIVE_INFO DriveInfo, + PBOOLEAN DiskChanged); + +NTSTATUS NTAPI HwSenseDriveStatusResult(PCONTROLLER_INFO ControllerInfo, + PUCHAR Status); + +NTSTATUS NTAPI HwSpecify(PCONTROLLER_INFO ControllerInfo, + UCHAR HeadLoadTime, + UCHAR HeadUnloadTime, + UCHAR StepRateTime, + BOOLEAN NonDma); + +NTSTATUS NTAPI HwReadIdResult(PCONTROLLER_INFO ControllerInfo, + PUCHAR CurCylinder, + PUCHAR CurHead); + +NTSTATUS NTAPI HwSetDataRate(PCONTROLLER_INFO ControllerInfo, + UCHAR DataRate); + +NTSTATUS NTAPI HwRecalibrateResult(PCONTROLLER_INFO ControllerInfo); + +NTSTATUS NTAPI HwReset(PCONTROLLER_INFO Controller); + +NTSTATUS NTAPI HwPowerOff(PCONTROLLER_INFO ControllerInfo); + +VOID NTAPI HwDumpRegisters(PCONTROLLER_INFO ControllerInfo); + +NTSTATUS NTAPI HwTurnOffMotor(PCONTROLLER_INFO ControllerInfo); + diff --git a/reactos/drivers/storage/floppy/ioctl.c b/reactos/drivers/storage/floppy/ioctl.c new file mode 100644 index 00000000000..1cdc0f791e2 --- /dev/null +++ b/reactos/drivers/storage/floppy/ioctl.c @@ -0,0 +1,250 @@ +/* + * ReactOS Floppy Driver + * Copyright (C) 2004, Vizzini (vizzini@plasmic.com) + * + * 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 Floppy Driver + * FILE: ioctl.c + * PURPOSE: IOCTL Routines + * PROGRAMMER: Vizzini (vizzini@plasmic.com) + * REVISIONS: + * 15-Feb-2004 vizzini - Created + * NOTES: + * - All IOCTL documentation taken from the DDK + * - This driver tries to support all of the IOCTLs that the DDK floppy + * sample does + * + * TODO: Add support to GET_MEDIA_TYPES for non-1.44 disks + * TODO: Implement format + */ + +#include <ntddk.h> + +#include "floppy.h" +#include "hardware.h" +#include "csqrtns.h" +#include "ioctl.h" + + +NTSTATUS NTAPI DeviceIoctl(PDEVICE_OBJECT DeviceObject, + PIRP Irp) +/* + * FUNCTION: Queue IOCTL IRPs + * ARGUMENTS: + * DeviceObject: DeviceObject that is the target of the IRP + * Irp: IRP to process + * RETURNS: + * STATUS_SUCCESS in all cases, so far + * NOTES: + * - We can't just service these immediately because, even though some + * are able to run at DISPATCH, they'll get out of sync with other + * read/write or ioctl irps. + */ +{ + ASSERT(DeviceObject); + ASSERT(Irp); + + Irp->Tail.Overlay.DriverContext[0] = DeviceObject; + IoCsqInsertIrp(&Csq, Irp, NULL); + + return STATUS_PENDING; +} + + +VOID NTAPI DeviceIoctlPassive(PDRIVE_INFO DriveInfo, + PIRP Irp) +/* + * FUNCTION: Handlees IOCTL requests at PASSIVE_LEVEL + * ARGUMENTS: + * DriveInfo: Drive that the IOCTL is directed at + * Irp: IRP with the request in it + */ +{ + PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp); + ULONG OutputLength = Stack->Parameters.DeviceIoControl.OutputBufferLength; + PVOID OutputBuffer = Irp->AssociatedIrp.SystemBuffer; + ULONG Code = Stack->Parameters.DeviceIoControl.IoControlCode; + BOOLEAN DiskChanged; + + KdPrint(("floppy: DeviceIoctl called\n")); + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + + /* + * First the non-change-sensitive ioctls + */ + if(Code == IOCTL_DISK_GET_MEDIA_TYPES) + { + PDISK_GEOMETRY Geometry = OutputBuffer; + KdPrint(("floppy: IOCTL_DISK_GET_MEDIA_TYPES Called\n")); + + if(OutputLength < sizeof(DISK_GEOMETRY)) + { + KdPrint(("floppy: IOCTL_DISK_GET_MEDIA_TYPES: insufficient buffer; returning STATUS_INVALID_PARAMETER\n")); + Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return; + } + + /* + * for now, this driver only supports 3.5" HD media + */ + Geometry->MediaType = F3_1Pt44_512; + Geometry->Cylinders.QuadPart = 80; + Geometry->TracksPerCylinder = 2 * 18; + Geometry->SectorsPerTrack = 18; + Geometry->BytesPerSector = 512; + + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = sizeof(DISK_GEOMETRY); + KdPrint(("floppy: Ioctl: completing with STATUS_SUCCESS\n")); + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return; + } + + /* + * Now, check to see if the volume needs to be verified. If so, + * return STATUS_VERIFY_REQUIRED. + * + * NOTE: This code, which is outside of the switch and if/else blocks, + * will implicity catch and correctly service IOCTL_DISK_CHECK_VERIFY. + * Therefore if we see one below in the switch, we can return STATUS_SUCCESS + * immediately. + */ + if(DriveInfo->DeviceObject->Flags & DO_VERIFY_VOLUME && !(DriveInfo->DeviceObject->Flags & SL_OVERRIDE_VERIFY_VOLUME)) + { + KdPrint(("floppy: DeviceIoctl(): completing with STATUS_VERIFY_REQUIRED\n")); + Irp->IoStatus.Status = STATUS_VERIFY_REQUIRED; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return; + } + + /* + * Check the change line, and if it's set, return + */ + if(HwDiskChanged(DriveInfo, &DiskChanged) != STATUS_SUCCESS) + { + KdPrint(("floppy: DeviceIoctl(): unable to sense disk change; completing with STATUS_UNSUCCESSFUL\n")); + Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return; + } + + if(DiskChanged) + { + KdPrint(("floppy: DeviceIoctl(): detected disk changed; signalling media change and completing\n")); + SignalMediaChanged(DriveInfo->DeviceObject, Irp); + + /* + * Just guessing here - I have a choice of returning NO_MEDIA or VERIFY_REQUIRED. If there's + * really no disk in the drive, I'm thinking I can save time by just reporting that fact, rather + * than forcing windows to ask me twice. If this doesn't work, we'll need to split this up and + * handle the CHECK_VERIFY IOCTL separately. + */ + if(ResetChangeFlag(DriveInfo) == STATUS_NO_MEDIA_IN_DEVICE) + Irp->IoStatus.Status = STATUS_NO_MEDIA_IN_DEVICE; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return; + } + + switch(Code) + { + case IOCTL_DISK_IS_WRITABLE: + { + UCHAR Status; + + KdPrint(("floppy: IOCTL_DISK_IS_WRITABLE Called\n")); + + /* This IRP always has 0 information */ + Irp->IoStatus.Information = 0; + + if(HwSenseDriveStatus(DriveInfo) != STATUS_SUCCESS) + { + KdPrint(("floppy: IoctlDiskIsWritable(): unable to sense drive status\n")); + Irp->IoStatus.Status = STATUS_IO_DEVICE_ERROR; + break; + } + + /* Now, read the drive's status back */ + if(HwSenseDriveStatusResult(DriveInfo->ControllerInfo, &Status) != STATUS_SUCCESS) + { + KdPrint(("floppy: IoctlDiskIsWritable(): unable to read drive status result\n")); + Irp->IoStatus.Status = STATUS_IO_DEVICE_ERROR; + break; + } + + /* Check to see if the write flag is set. */ + if(Status & SR3_WRITE_PROTECT_STATUS_SIGNAL) + { + KdPrint(("floppy: IOCTL_DISK_IS_WRITABLE: disk is write protected\n")); + Irp->IoStatus.Status = STATUS_MEDIA_WRITE_PROTECTED; + } + else + Irp->IoStatus.Status = STATUS_SUCCESS; + } + break; + + 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); + break; + + case IOCTL_DISK_GET_DRIVE_GEOMETRY: + { + KdPrint(("floppy: IOCTL_DISK_GET_DRIVE_GEOMETRY Called\n")); + if(OutputLength < sizeof(DISK_GEOMETRY)) + { + Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; + break; + } + + /* This still works right even if DriveInfo->DiskGeometry->MediaType = Unknown */ + memcpy(OutputBuffer, &DriveInfo->DiskGeometry, sizeof(DISK_GEOMETRY)); + Irp->IoStatus.Information = sizeof(DISK_GEOMETRY); + break; + } + + case IOCTL_DISK_FORMAT_TRACKS: + case IOCTL_DISK_FORMAT_TRACKS_EX: + KdPrint(("floppy: Format called; not supported yet\n")); + break; + + case IOCTL_DISK_GET_PARTITION_INFO: + KdPrint(("floppy: IOCTL_DISK_GET_PARTITION_INFO Called; not supported\n")); + Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; + Irp->IoStatus.Information = 0; + break; + + default: + KdPrint(("floppy: UNKNOWN IOCTL CODE: 0x%x\n", Code)); + Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; + Irp->IoStatus.Information = 0; + break; + } + + KdPrint(("floppy: ioctl: completing with status 0x%x\n", Irp->IoStatus.Status)); + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return; +} + diff --git a/reactos/drivers/storage/floppy/ioctl.h b/reactos/drivers/storage/floppy/ioctl.h new file mode 100644 index 00000000000..935894a7804 --- /dev/null +++ b/reactos/drivers/storage/floppy/ioctl.h @@ -0,0 +1,31 @@ +/* + * ReactOS Floppy Driver + * Copyright (C) 2004, Vizzini (vizzini@plasmic.com) + * + * 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 Floppy Driver + * FILE: ioctl.h + * PURPOSE: Header for IOCTL routines + * PROGRAMMER: Vizzini (vizzini@plasmic.com) + * REVISIONS: + * 15-Feb-2004 vizzini - Created + */ + +NTSTATUS NTAPI DeviceIoctl(PDEVICE_OBJECT DeviceObject, + PIRP Irp); + +VOID NTAPI DeviceIoctlPassive(PDRIVE_INFO DriveInfo, + PIRP Irp); diff --git a/reactos/drivers/storage/floppy/readwrite.c b/reactos/drivers/storage/floppy/readwrite.c new file mode 100644 index 00000000000..dc05b6dc42b --- /dev/null +++ b/reactos/drivers/storage/floppy/readwrite.c @@ -0,0 +1,710 @@ +/* + * ReactOS Floppy Driver + * Copyright (C) 2004, Vizzini (vizzini@plasmic.com) + * + * 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 Floppy Driver + * FILE: readwrite.c + * PURPOSE: Read/Write handler routines + * PROGRAMMER: Vizzini (vizzini@plasmic.com) + * REVISIONS: + * 15-Feb-2004 vizzini - Created + * NOTES: + * + * READ/WRITE PROCESS + * + * This process is extracted from the Intel datasheet for the floppy controller. + * + * - Turn on the motor and set turnoff time + * - Program the drive's data rate + * - Seek + * - Read ID + * - Set up DMA + * - Send read/write command to FDC + * - Read result bytes + * + * This is mostly implemented in one big function, which watis on the SynchEvent + * as many times as necessary to get through the process. See ReadWritePassive() for + * more details. + * + * NOTES: + * - Currently doesn't support partial-sector transfers, which is really just a failing + * of RWComputeCHS. I've never seen Windows send a partial-sector request, though, so + * this may not be a bad thing. Should be looked into, regardless. + * + * TODO: Handle split reads and writes across multiple map registers + * TODO: Break up ReadWritePassive and handle errors better + * TODO: Figure out data rate issues + * TODO: I think RWComputeCHS is bugified + * TODO: Media type detection + * TODO: Figure out perf issue - waiting after call to read/write for about a second each time + * TODO: Figure out specify timings + */ +#include <ntddk.h> + +#include "floppy.h" +#include "csqrtns.h" +#include "hardware.h" +#include "readwrite.h" + + +static IO_ALLOCATION_ACTION NTAPI MapRegisterCallback(PDEVICE_OBJECT DeviceObject, + PIRP Irp, + PVOID MapRegisterBase, + PVOID Context) +/* + * FUNCTION: Acquire map registers in prep for DMA + * ARGUMENTS: + * DeviceObject: unused + * Irp: unused + * MapRegisterBase: returned to blocked thread via a member var + * Context: contains a pointer to the right ControllerInfo + * struct + * RETURNS: + * KeepObject, because that's what the DDK says to do + */ +{ + PCONTROLLER_INFO ControllerInfo = (PCONTROLLER_INFO)Context; + + KdPrint(("floppy: MapRegisterCallback Called\n")); + + ControllerInfo->MapRegisterBase = MapRegisterBase; + KeSetEvent(&ControllerInfo->SynchEvent, 0, FALSE); + + return KeepObject; /* FIXME: Should be something else if we find a bus master */ +} + + +NTSTATUS NTAPI ReadWrite(PDEVICE_OBJECT DeviceObject, + PIRP Irp) +/* + * FUNCTION: Dispatch routine called for read or write IRPs + * ARGUMENTS: + * RETURNS: + * STATUS_PENDING if the IRP is queued + * STATUS_INVALID_PARAMETER if IRP is set up wrong + * NOTES: + * - This function validates arguments to the IRP and then queues it + * - Note that this function is implicitly serialized by the queue logic. Only + * one of these at a time is active in the system, no matter how many processors + * and threads we have. + * - This function stores the DeviceObject in the IRP's context area before dropping + * it onto the irp queue + */ +{ + PIO_STACK_LOCATION Stack; + KdPrint(("floppy: ReadWrite called\n")); + + ASSERT(DeviceObject); + ASSERT(Irp); + + Stack = IoGetCurrentIrpStackLocation(Irp); + + if(!Irp->MdlAddress) + { + KdPrint(("floppy: ReadWrite(): MDL not found in IRP - Completing with STATUS_INVALID_PARAMETER\n")); + Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_INVALID_PARAMETER; + } + + /* + * Queue the irp to the thread. + * The de-queue thread will look in DriverContext[0] for the Device Object. + */ + Irp->Tail.Overlay.DriverContext[0] = DeviceObject; + IoCsqInsertIrp(&Csq, Irp, NULL); + + return STATUS_PENDING; +} + + +static VOID NTAPI RWFreeAdapterChannel(PADAPTER_OBJECT AdapterObject) +/* + * FUNCTION: Free the adapter DMA channel that we allocated + * ARGUMENTS: + * AdapterObject: the object with the map registers to free + * NOTES: + * - This function is primarily needed because IoFreeAdapterChannel wants to + * be called at DISPATCH_LEVEL + */ +{ + KIRQL Irql; + + ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL); + + KeRaiseIrql(DISPATCH_LEVEL, &Irql); + IoFreeAdapterChannel(AdapterObject); + KeLowerIrql(Irql); +} + + +static NTSTATUS NTAPI RWDetermineMediaType(PDRIVE_INFO DriveInfo) +/* + * FUNCTION: Determine the media type of the disk in the drive and fill in the geometry + * ARGUMENTS: + * DriveInfo: drive to look at + * RETURNS: + * STATUS_SUCCESS if the media was recognized and the geometry struct was filled in + * STATUS_UNRECOGNIZED_MEDIA if not + * STATUS_UNSUCCESSFUL if the controller can't be talked to + * NOTES: + * - Expects the motor to already be running + * - Currently only supports 1.44MB 3.5" disks + * - PAGED_CODE because it waits + * TODO: + * - Support more disk types + */ +{ + UCHAR HeadLoadTime; + UCHAR HeadUnloadTime; + UCHAR StepRateTime; + + PAGED_CODE(); + + KdPrint(("floppy: RWDetermineMediaType called\n")); + + /* + * This algorithm assumes that a 1.44MB floppy is in the drive. If it's not, + * it works backwards until the read works. Note that only 1.44 has been tested + * at all. + */ + + do + { + /* Program data rate */ + if(HwSetDataRate(DriveInfo->ControllerInfo, DRSR_DSEL_500KBPS) != STATUS_SUCCESS) + { + KdPrint(("floppy: RWDetermineMediaType(): unable to set data rate\n")); + return STATUS_UNSUCCESSFUL; + } + + /* Specify */ + HeadLoadTime = SPECIFY_HLT_500K; + HeadUnloadTime = SPECIFY_HUT_500K; + StepRateTime = SPECIFY_SRT_500K; + + /* Don't disable DMA --> enable dma (dumb & confusing) */ + if(HwSpecify(DriveInfo->ControllerInfo, HeadLoadTime, HeadUnloadTime, StepRateTime, FALSE) != STATUS_SUCCESS) + { + KdPrint(("floppy: RWDetermineMediaType(): specify failed\n")); + return STATUS_UNSUCCESSFUL; + } + + /* clear any spurious interrupts in preparation for recalibrate */ + KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); + + /* Recalibrate --> head over first track */ + /* FIXME: should be done in a loop? */ + if(HwRecalibrate(DriveInfo) != STATUS_SUCCESS) + { + KdPrint(("floppy: RWDetermineMediaType(): Recalibrate failed\n")); + return STATUS_UNSUCCESSFUL; + } + + /* Wait for the recalibrate to finish */ + WaitForControllerInterrupt(DriveInfo->ControllerInfo); + + if(HwRecalibrateResult(DriveInfo->ControllerInfo) != STATUS_SUCCESS) + { + KdPrint(("floppy: RWDetermineMediaType(): RecalibrateResult failed\n")); + return STATUS_UNSUCCESSFUL; + } + + /* clear any spurious interrupts */ + KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); + + /* Try to read an ID */ + if(HwReadId(DriveInfo, 0) != STATUS_SUCCESS) /* read the first ID we find, from head 0 */ + { + KdPrint(("floppy: RWDetermineMediaType(): ReadId failed\n")); + return STATUS_UNSUCCESSFUL; /* if we can't even write to the controller, it's hopeless */ + } + + /* Wait for the recalibrate to finish */ + WaitForControllerInterrupt(DriveInfo->ControllerInfo); + + if(HwReadIdResult(DriveInfo->ControllerInfo, NULL, NULL) != STATUS_SUCCESS) + { + KdPrint(("floppy: RWDetermineMediaType(): ReadIdResult failed; continuing\n")); + continue; + } + + /* Found the media; populate the geometry now */ + KdPrint(("FIXME: Hardcoded media type!\n")); + KdPrint(("floppy: RWDetermineMediaType(): Found 1.44 media; returning success\n")); + DriveInfo->DiskGeometry.MediaType = GEOMETRY_144_MEDIATYPE; + DriveInfo->DiskGeometry.Cylinders.QuadPart = GEOMETRY_144_CYLINDERS; + DriveInfo->DiskGeometry.TracksPerCylinder = GEOMETRY_144_TRACKSPERCYLINDER; + DriveInfo->DiskGeometry.SectorsPerTrack = GEOMETRY_144_SECTORSPERTRACK; + DriveInfo->DiskGeometry.BytesPerSector = GEOMETRY_144_BYTESPERSECTOR; + DriveInfo->BytesPerSectorCode = HW_512_BYTES_PER_SECTOR; + return STATUS_SUCCESS; + } + while(FALSE); + + KdPrint(("floppy: RWDetermineMediaType(): failed to find media\n")); + return STATUS_UNRECOGNIZED_MEDIA; +} + + +static NTSTATUS NTAPI RWSeekToCylinder(PDRIVE_INFO DriveInfo, + UCHAR Cylinder) +/* + * FUNCTION: Seek a particular drive to a particular track + * ARGUMENTS: + * DriveInfo: Drive to seek + * Cylinder: track to seek to + * RETURNS: + * STATUS_SUCCESS if the head was successfully seeked + * STATUS_UNSUCCESSFUL if not + * NOTES: + * - PAGED_CODE because it blocks + */ +{ + UCHAR CurCylinder; + + PAGED_CODE(); + + /* Clear any spurious interrupts */ + KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); + + /* queue seek command */ + if(HwSeek(DriveInfo, Cylinder) != STATUS_SUCCESS) + { + KdPrint(("floppy: RWSeekToTrack(): unable to seek\n")); + return STATUS_UNSUCCESSFUL; + } + + WaitForControllerInterrupt(DriveInfo->ControllerInfo); + + if(HwSenseInterruptStatus(DriveInfo->ControllerInfo) != STATUS_SUCCESS) + { + KdPrint(("floppy: RWSeekToTrack(): unable to get seek results\n")); + return STATUS_UNSUCCESSFUL; + } + + /* read ID mark from head 0 to verify */ + if(HwReadId(DriveInfo, 0) != STATUS_SUCCESS) + { + KdPrint(("floppy: RWSeekToTrack(): unable to queue ReadId\n")); + return STATUS_UNSUCCESSFUL; + } + + WaitForControllerInterrupt(DriveInfo->ControllerInfo); + + if(HwReadIdResult(DriveInfo->ControllerInfo, &CurCylinder, NULL) != STATUS_SUCCESS) + { + KdPrint(("floppy: RWSeekToTrack(): unable to get ReadId result\n")); + return STATUS_UNSUCCESSFUL; + } + + if(CurCylinder != Cylinder) + { + KdPrint(("floppy: RWSeekToTrack(): Seeek to track failed; current cylinder is 0x%x\n", CurCylinder)); + return STATUS_UNSUCCESSFUL; + } + + return STATUS_SUCCESS; +} + + +static NTSTATUS NTAPI RWComputeCHS(PDRIVE_INFO IN DriveInfo, + ULONG IN DiskByteOffset, + PUCHAR OUT Cylinder, + PUCHAR OUT Head, + PUCHAR OUT Sector) +/* + * FUNCTION: Compute the CHS from the absolute byte offset on disk + * ARGUMENTS: + * DriveInfo: Drive to compute on + * DiskByteOffset: Absolute offset on disk of the starting byte + * Cylinder: Cylinder that the byte is on + * Head: Head that the byte is on + * Sector: Sector that the byte is on + * RETURNS: + * STATUS_SUCCESS if CHS are determined correctly + * STATUS_UNSUCCESSFUL otherwise + * NOTES: + * - Lots of ugly typecasts here + * - Sectors are 1-based! + * - FIXME: I think this routine is still bugified a bit + */ +{ + ULONG AbsoluteSector; + UCHAR SectorsPerCylinder = (UCHAR)DriveInfo->DiskGeometry.SectorsPerTrack * (UCHAR)DriveInfo->DiskGeometry.TracksPerCylinder; + + KdPrint(("floppy: RWComputeCHS: Called with offset 0x%x\n", DiskByteOffset)); + + /* First calculate the 1-based "absolute sector" based on the byte offset */ + ASSERT(!(DiskByteOffset % DriveInfo->DiskGeometry.BytesPerSector)); /* FIXME: Only handle full sector transfers atm */ + AbsoluteSector = DiskByteOffset / DriveInfo->DiskGeometry.BytesPerSector; /* Num full sectors */ + + /* Cylinder number is floor(AbsoluteSector / SectorsPerCylinder) */ + *Cylinder = (CHAR)(AbsoluteSector / SectorsPerCylinder); + + /* Head number is 1 if the sector within the cylinder > SectorsPerTrack; 0 otherwise */ + *Head = AbsoluteSector % SectorsPerCylinder > DriveInfo->DiskGeometry.SectorsPerTrack ? 1 : 0; + + /* + * Sector number is the sector within the cylinder if on head 0; that minus SectorsPerTrack if it's on head 1 + * (lots of casts to placate msvc). 1-based! + */ + *Sector = ((UCHAR)(AbsoluteSector % SectorsPerCylinder) + 1) - ((*Head) * (UCHAR)DriveInfo->DiskGeometry.SectorsPerTrack); + + KdPrint(("floppy: RWComputeCHS: offset 0x%x is c:0x%x h:0x%x s:0x%x\n", DiskByteOffset, *Cylinder, *Head, *Sector)); + + return STATUS_SUCCESS; +} + + +VOID NTAPI ReadWritePassive(PDRIVE_INFO DriveInfo, + PIRP Irp) +/* + * FUNCTION: Handle the first phase of a read or write IRP + * ARGUMENTS: + * DeviceObject: DeviceObject that is the target of the IRP + * Irp: IRP to process + * RETURNS: + * STATUS_VERIFY_REQUIRED if the media has changed and we need the filesystems to re-synch + * STATUS_SUCCESS otherwise + * NOTES: + * - Must be called at PASSIVE_LEVEL + * - This function is about 250 lines longer than I wanted it to be. Sorry. + * + * DETAILS: + * This routine manages the whole process of servicing a read or write request. It goes like this: + * 1) Check the DO_VERIFY_VOLUME flag and return if it's set + * 2) Check the disk change line and notify the OS if it's set and return + * 3) Detect the media if we haven't already + * 4) Set up DiskByteOffset, Length, and WriteToDevice parameters + * 5) Get DMA map registers + * 6) Then, in a loop for each track, until all bytes are transferred: + * a) Compute the current CHS to set the read/write head to + * b) Seek to that spot + * c) Compute the last sector to transfer on that track + * d) Map the transfer through DMA + * e) Send the read or write command to the controller + * f) Read the results of the command + */ +{ + PDEVICE_OBJECT DeviceObject = DriveInfo->DeviceObject; + PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp); + BOOLEAN WriteToDevice; + ULONG Length; + ULONG DiskByteOffset; + KIRQL OldIrql; + NTSTATUS Status; + BOOLEAN DiskChanged; + ULONG_PTR TransferByteOffset; + + PAGED_CODE(); + + KdPrint(("floppy: ReadWritePassive called to %s 0x%x bytes from offset 0x%x\n", + (Stack->MajorFunction == IRP_MJ_READ ? "read" : "write"), + (Stack->MajorFunction == IRP_MJ_READ ? Stack->Parameters.Read.Length : Stack->Parameters.Write.Length), + (Stack->MajorFunction == IRP_MJ_READ ? Stack->Parameters.Read.ByteOffset.u.LowPart : + Stack->Parameters.Write.ByteOffset.u.LowPart))); + + /* Default return codes */ + Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + Irp->IoStatus.Information = 0; + + /* + * Check to see if the volume needs to be verified. If so, + * we can get out of here quickly. + */ + if(DeviceObject->Flags & DO_VERIFY_VOLUME && !(DeviceObject->Flags & SL_OVERRIDE_VERIFY_VOLUME)) + { + KdPrint(("floppy: ReadWritePassive(): DO_VERIFY_VOLUME set; Completing with STATUS_VERIFY_REQUIRED\n")); + Irp->IoStatus.Status = STATUS_VERIFY_REQUIRED; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return; + } + + /* + * Check the change line, and if it's set, return + */ + if(HwDiskChanged(DeviceObject->DeviceExtension, &DiskChanged) != STATUS_SUCCESS) + { + KdPrint(("floppy: ReadWritePassive(): unable to detect disk change; Completing with STATUS_UNSUCCESSFUL\n")); + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return; + } + + if(DiskChanged) + { + KdPrint(("floppy: ReadWritePhase1(): signalling media changed; Completing with STATUS_MEDIA_CHANGED\n")); + + /* The following call sets IoStatus.Status and IoStatus.Information */ + SignalMediaChanged(DeviceObject, Irp); + + /* + * Guessing at something... see ioctl.c for more info + */ + if(ResetChangeFlag(DriveInfo) == STATUS_NO_MEDIA_IN_DEVICE) + Irp->IoStatus.Status = STATUS_NO_MEDIA_IN_DEVICE; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return; + } + + /* Start the motor and set the initial data rate */ + StartMotor(DriveInfo); + + /* + * Figure out the media type, if we don't know it already + */ + if(DriveInfo->DiskGeometry.MediaType == Unknown) + { + if(RWDetermineMediaType(DriveInfo) != STATUS_SUCCESS) + { + KdPrint(("floppy: ReadWritePassive(): unable to determine media type; completing with STATUS_UNSUCCESSFUL\n")); + IoCompleteRequest(Irp, IO_NO_INCREMENT); + StopMotor(DriveInfo->ControllerInfo); + return; + } + + if(DriveInfo->DiskGeometry.MediaType == Unknown) + { + KdPrint(("floppy: ReadWritePassive(): Unknown media in drive; completing with STATUS_UNRECOGNIZED_MEDIA\n")); + Irp->IoStatus.Status = STATUS_UNRECOGNIZED_MEDIA; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + StopMotor(DriveInfo->ControllerInfo); + return; + } + } + + /* Set up parameters for read or write */ + if(Stack->MajorFunction == IRP_MJ_READ) + { + if(Stack->Parameters.Read.Length > PAGE_SIZE * DriveInfo->ControllerInfo->MapRegisters) + { + KdPrint(("floppy: ReadWritePassive(): unable to transfer; would have to split\n")); + ASSERT(0); + } + Length = Stack->Parameters.Read.Length; + DiskByteOffset = Stack->Parameters.Read.ByteOffset.u.LowPart; + WriteToDevice = FALSE; + } + else + { + if(Stack->Parameters.Write.Length > PAGE_SIZE * DriveInfo->ControllerInfo->MapRegisters) + { + KdPrint(("floppy: ReadWritePassive(): unable to transfer; would have to split\n")); + ASSERT(0); + } + Length = Stack->Parameters.Write.Length; + DiskByteOffset = Stack->Parameters.Write.ByteOffset.u.LowPart; + WriteToDevice = TRUE; + } + + /* + * Set up DMA transfer + * + * This is as good of a place as any to document something that used to confuse me + * greatly (and I even wrote some of the kernel's DMA code, so if it confuses me, it + * probably confuses at least a couple of other people too). + * + * MmGetMdlVirtualAddress() returns the virtal address, as mapped in the buffer's original + * process context, of the MDL. In other words: say you start with a buffer at address X, then + * you build an MDL out of that buffer called Mdl. If you call MmGetMdlVirtualAddress(Mdl), it + * will return X. + * + * There are two parameters that the function looks at to produce X again, given the MDL: the + * first is the StartVa, which is the base virtual address of the page that the buffer starts + * in. If your buffer's virtual address is 0x12345678, StartVa will be 0x12345000, assuming 4K pages + * (which is (almost) always the case on x86). Note well: this address is only valid in the + * process context that you initially built the MDL from. The physical pages that make up + * the MDL might perhaps be mapped in other process contexts too (or even in the system space, + * above 0x80000000 (default; 0xc0000000 on current ReactOS or /3GB Windows)), but it will + * (possibly) be mapped at a different address. + * + * The second parameter is the ByteOffset. Given an original buffer address of 0x12345678, + * the ByteOffset would be 0x678. Because MDLs can only describe full pages (and therefore + * StartVa always points to the start address of a page), the ByteOffset must be used to + * find the real start of the buffer. + * + * In general, if you add the StartVa and ByteOffset together, you get back your original + * buffer pointer, which you are free to use if you're sure you're in the right process + * context. You could tell by accessing the (hidden and not-to-be-used) Process member of + * the MDL, but in general, if you have to ask whether or not you are in the right context, + * then you shouldn't be using this address for anything anyway. There are also security implications + * (big ones, really, I wouldn't kid about this) to directly accessing a user's buffer by VA, so + * Don't Do That. + * + * There is a somewhat weird but very common use of the virtual address associated with a MDL + * that pops up often in the context of DMA. DMA APIs (particularly MapTransfer()) need to + * know where the memory is that they should DMA into and out of. This memory is described + * by a MDL. The controller eventually needs to know a physical address on the host side, + * which is generally a 32-bit linear address (on x86), and not just a page address. Therefore, + * the DMA APIs look at the ByteOffset field of the MDL to reconstruct the real address that + * should be programmed into the DMA controller. + * + * It is often the case that a transfer needs to be broken down over more than one DMA operation, + * particularly when it is a big transfer and the HAL doesn't give you enough map registers + * to map the whole thing at once. Therefore, the APIs need a way to tell how far into the MDL + * they should look to transfer the next chunk of bytes. Now, Microsoft could have designed + * MapTransfer to take a "MDL offset" argument, starting with 0, for how far into the buffer to + * start, but it didn't. Instead, MapTransfer asks for the virtual address of the MDL as an "index" into + * the MDL. The way it computes how far into the page to start the transfer is by masking off all but + * the bottom 12 bits (on x86) of the number you supply as the CurrentVa and using *that* as the + * ByteOffset instead of the one in the MDL. (OK, this varies a bit by OS and version, but this + * is the effect). + * + * In other words, you get a number back from MmGetMdlVirtualAddress that represents the start of your + * buffer, and you pass it to the first MapTransfer call. Then, for each successive operation + * on the same buffer, you increment that address to point to the next spot in the MDL that + * you want to DMA to/from. The fact that the virtual address you're manipulating is probably not + * mapped into the process context that you're running in is irrelevant, since it's only being + * used to index into the MDL. + */ + + /* Get map registers for DMA */ + KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); + Status = IoAllocateAdapterChannel(DriveInfo->ControllerInfo->AdapterObject, DeviceObject, + DriveInfo->ControllerInfo->MapRegisters, MapRegisterCallback, DriveInfo->ControllerInfo); + KeLowerIrql(OldIrql); + + if(Status != STATUS_SUCCESS) + { + KdPrint(("floppy: ReadWritePassive(): unable allocate an adapter channel; completing with STATUS_UNSUCCESSFUL\n")); + IoCompleteRequest(Irp, IO_NO_INCREMENT); + StopMotor(DriveInfo->ControllerInfo); + return ; + } + + /* + * Read from (or write to) the device + * + * This has to be called in a loop, as you can only transfer data to/from a single track at + * a time. + */ + + TransferByteOffset = 0; + while(TransferByteOffset < Length) + { + UCHAR Cylinder; + UCHAR Head; + UCHAR StartSector; + ULONG CurrentTransferBytes; + UCHAR CurrentTransferSectors; + + KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); + + /* + * Compute starting CHS + */ + if(RWComputeCHS(DriveInfo, DiskByteOffset+TransferByteOffset, &Cylinder, &Head, &StartSector) != STATUS_SUCCESS) + { + KdPrint(("floppy: ReadWritePassive(): unable to compute CHS; completing with STATUS_UNSUCCESSFUL\n")); + RWFreeAdapterChannel(DriveInfo->ControllerInfo->AdapterObject); + IoCompleteRequest(Irp, IO_NO_INCREMENT); + StopMotor(DriveInfo->ControllerInfo); + return; + } + + /* + * Seek to the right track + */ + if(!DriveInfo->ControllerInfo->ImpliedSeeks) + { + if(RWSeekToCylinder(DriveInfo, Cylinder) != STATUS_SUCCESS) + { + KdPrint(("floppy: ReadWritePassive(): unable to seek; completing with STATUS_UNSUCCESSFUL\n")); + RWFreeAdapterChannel(DriveInfo->ControllerInfo->AdapterObject); + IoCompleteRequest(Irp, IO_NO_INCREMENT); + StopMotor(DriveInfo->ControllerInfo); + return ; + } + } + + /* + * Compute last sector + * + * We can only ask for a transfer up to the end of the track. Then we have to re-seek and do more. + * TODO: Support the MT bit + */ + if( (DriveInfo->DiskGeometry.SectorsPerTrack - StartSector) < Length / DriveInfo->DiskGeometry.BytesPerSector) + CurrentTransferSectors = (UCHAR)DriveInfo->DiskGeometry.SectorsPerTrack - StartSector; + else + CurrentTransferSectors = (UCHAR)(Length / DriveInfo->DiskGeometry.BytesPerSector); + + CurrentTransferBytes = CurrentTransferSectors * DriveInfo->DiskGeometry.BytesPerSector; + + /* set up this round's dma operation */ + /* param 2 is ReadOperation --> opposite of WriteToDevice that IoMapTransfer takes. BAD MS. */ + KeFlushIoBuffers(Irp->MdlAddress, !WriteToDevice, TRUE); + + IoMapTransfer(DriveInfo->ControllerInfo->AdapterObject, Irp->MdlAddress, + DriveInfo->ControllerInfo->MapRegisterBase, + (PUCHAR)((ULONG_PTR)MmGetMdlVirtualAddress(Irp->MdlAddress) + TransferByteOffset), + &CurrentTransferBytes, WriteToDevice); + + /* + * Read or Write + */ + KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); + + /* Issue the read/write command to the controller. Note that it expects the opposite of WriteToDevice. */ + if(HwReadWriteData(DriveInfo->ControllerInfo, !WriteToDevice, DriveInfo->UnitNumber, Cylinder, Head, StartSector, + DriveInfo->BytesPerSectorCode, StartSector + CurrentTransferSectors, 0, 0xff) != STATUS_SUCCESS) + { + KdPrint(("floppy: ReadWritePassive(): HwReadWriteData returned failure; unable to read; completing with STATUS_UNSUCCESSFUL\n")); + RWFreeAdapterChannel(DriveInfo->ControllerInfo->AdapterObject); + IoCompleteRequest(Irp, IO_NO_INCREMENT); + StopMotor(DriveInfo->ControllerInfo); + return ; + } + + KdPrint(("floppy: ReadWritePassive(): HwReadWriteData returned -- waiting on event\n")); + + /* + * At this point, we block and wait for an interrupt + * FIXME: this seems to take too long + */ + WaitForControllerInterrupt(DriveInfo->ControllerInfo); + + /* Read is complete; flush & free adapter channel */ + IoFlushAdapterBuffers(DriveInfo->ControllerInfo->AdapterObject, Irp->MdlAddress, + DriveInfo->ControllerInfo->MapRegisterBase, + MmGetMdlVirtualAddress(Irp->MdlAddress), + CurrentTransferBytes, WriteToDevice); + + /* Read the results from the drive */ + if(HwReadWriteResult(DriveInfo->ControllerInfo) != STATUS_SUCCESS) + { + KdPrint(("floppy: ReadWritePassive(): HwReadWriteResult returned failure; unable to read; completing with STATUS_UNSUCCESSFUL\n")); + HwDumpRegisters(DriveInfo->ControllerInfo); + RWFreeAdapterChannel(DriveInfo->ControllerInfo->AdapterObject); + IoCompleteRequest(Irp, IO_NO_INCREMENT); + StopMotor(DriveInfo->ControllerInfo); + return ; + } + + TransferByteOffset += CurrentTransferBytes; + } + + RWFreeAdapterChannel(DriveInfo->ControllerInfo->AdapterObject); + + /* That's all folks! */ + KdPrint(("floppy: ReadWritePassive(): success; Completing with STATUS_SUCCESS\n")); + Irp->IoStatus.Status = STATUS_SUCCESS; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + StopMotor(DriveInfo->ControllerInfo); +} + diff --git a/reactos/drivers/storage/floppy/readwrite.h b/reactos/drivers/storage/floppy/readwrite.h new file mode 100644 index 00000000000..3a296bcc2c2 --- /dev/null +++ b/reactos/drivers/storage/floppy/readwrite.h @@ -0,0 +1,32 @@ +/* + * ReactOS Floppy Driver + * Copyright (C) 2004, Vizzini (vizzini@plasmic.com) + * + * 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 Floppy Driver + * FILE: readwrite.h + * PURPOSE: Header for read/write routines + * PROGRAMMER: Vizzini (vizzini@plasmic.com) + * REVISIONS: + * 15-Feb-2004 vizzini - Created + */ + + +NTSTATUS NTAPI ReadWrite(PDEVICE_OBJECT DeviceObject, + PIRP Irp); + +VOID NTAPI ReadWritePassive(PDRIVE_INFO DriveInfo, PIRP Irp); + From 279a889834b48ad6d83402780ae412e2464fc58f Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Mon, 1 Mar 2004 19:25:33 +0000 Subject: [PATCH 0286/1463] - Fixed IntGdiExtEscape. Patch by Anich Gregor. svn path=/trunk/; revision=8496 --- reactos/subsys/win32k/objects/print.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/objects/print.c b/reactos/subsys/win32k/objects/print.c index c9d09acf7b1..7010775dc71 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.14 2004/02/19 21:12:10 weiden Exp $ */ +/* $Id: print.c,v 1.15 2004/03/01 19:25:33 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> @@ -25,6 +25,7 @@ #include <win32k/dc.h> #include <include/error.h> #include <include/tags.h> +#include <include/object.h> #include <internal/safe.h> #define NDEBUG @@ -86,10 +87,12 @@ IntGdiExtEscape( INT OutSize, LPSTR OutData) { + PSURFOBJ Surface = (PSURFOBJ)AccessUserObject((ULONG)dc->Surface); + if ( NULL == dc->DriverFunctions.Escape ) { return IntEngExtEscape( - dc->Surface, + Surface, Escape, InSize, (PVOID)InData, @@ -99,7 +102,7 @@ IntGdiExtEscape( else { return dc->DriverFunctions.Escape( - dc->Surface, + Surface, Escape, InSize, (PVOID)InData, From a7c8c741c346eebd7e4c1e34479f8895bfeece67 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Mon, 1 Mar 2004 19:36:21 +0000 Subject: [PATCH 0287/1463] - OpenGL bug fixes and cleanup. Patch by Anich Gregor. svn path=/trunk/; revision=8497 --- reactos/lib/opengl32/opengl32.c | 112 +++++----- reactos/lib/opengl32/opengl32.h | 30 ++- reactos/lib/opengl32/wgl.c | 353 ++++++++++++++++++++++---------- 3 files changed, 330 insertions(+), 165 deletions(-) diff --git a/reactos/lib/opengl32/opengl32.c b/reactos/lib/opengl32/opengl32.c index ac35879d643..4ce8e046d44 100644 --- a/reactos/lib/opengl32/opengl32.c +++ b/reactos/lib/opengl32/opengl32.c @@ -1,4 +1,4 @@ -/* $Id: opengl32.c,v 1.15 2004/02/12 23:56:15 royce Exp $ +/* $Id: opengl32.c,v 1.16 2004/03/01 19:36:20 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -17,14 +17,6 @@ #include <string.h> #include "opengl32.h" -#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 */ -} EXTDRIVERINFO; - /* function prototypes */ /*static BOOL OPENGL32_LoadDrivers();*/ static void OPENGL32_AppendICD( GLDRIVERDATA *icd ); @@ -54,9 +46,7 @@ OPENGL32_ThreadDetach() GetLastError() ); } - dispatchTable = NtCurrentTeb()->glTable; - if (dispatchTable != NULL) { if (!HeapFree( GetProcessHeap(), 0, dispatchTable )) @@ -66,6 +56,56 @@ OPENGL32_ThreadDetach() } +static +void +OPENGL32_ProcessDetach() +{ + GLDRIVERDATA *icd, *icd2; + GLDCDATA *dcdata, *dcdata2; + GLRC *glrc, *glrc2; + + /* free lists */ + for (dcdata = OPENGL32_processdata.dcdata_list; dcdata != NULL;) + { + dcdata2 = dcdata; + dcdata = dcdata->next; + if (!HeapFree( GetProcessHeap(), 0, dcdata )) + DBGPRINT( "Warning: HeapFree() on DCDATA 0x%08x failed (%d)", + dcdata, GetLastError() ); + } + + for (glrc = OPENGL32_processdata.glrc_list; glrc != NULL;) + { + glrc2 = glrc; + glrc = glrc->next; + if (!HeapFree( GetProcessHeap(), 0, glrc )) + DBGPRINT( "Warning: HeapFree() on GLRC 0x%08x failed (%d)", + glrc, GetLastError() ); + } + + for (icd = OPENGL32_processdata.driver_list; icd != NULL;) + { + icd2 = icd; + icd = icd->next; + if (!HeapFree( GetProcessHeap(), 0, icd )) + DBGPRINT( "Warning: HeapFree() on DRIVERDATA 0x%08x failed (%d)", + icd, GetLastError() ); + } + + /* free mutexes */ + if (OPENGL32_processdata.driver_mutex != NULL) + CloseHandle( OPENGL32_processdata.driver_mutex ); + if (OPENGL32_processdata.glrc_mutex != NULL) + CloseHandle( OPENGL32_processdata.glrc_mutex ); + if (OPENGL32_processdata.dcdata_mutex != NULL) + CloseHandle( OPENGL32_processdata.dcdata_mutex ); + + /* free TLS */ + if (OPENGL32_tls != 0xffffffff) + TlsFree(OPENGL32_tls); +} + + BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD Reason, LPVOID Reserved) @@ -84,33 +124,41 @@ DllMain(HINSTANCE hInstance, DWORD Reason, LPVOID Reserved) * initialization or a call to LoadLibrary. */ case DLL_PROCESS_ATTACH: + DBGTRACE( "Process attach" ); OPENGL32_tls = TlsAlloc(); if ( 0xFFFFFFFF == OPENGL32_tls ) return FALSE; memset( &OPENGL32_processdata, 0, sizeof (OPENGL32_processdata) ); - /* create driver & glrc list mutex */ + /* 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() ); - TlsFree( OPENGL32_tls ); + 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() ); - CloseHandle( OPENGL32_processdata.driver_mutex ); - TlsFree( OPENGL32_tls ); + 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) ); @@ -146,18 +194,16 @@ DllMain(HINSTANCE hInstance, DWORD Reason, LPVOID Reserved) /* The thread of the attached process terminates. */ case DLL_THREAD_DETACH: + DBGTRACE( "Thread detach" ); /* Release the allocated memory for this thread.*/ OPENGL32_ThreadDetach(); break; /* DLL unload due to process termination or FreeLibrary. */ case DLL_PROCESS_DETACH: + DBGTRACE( "Process detach" ); OPENGL32_ThreadDetach(); - - /* FIXME: free resources (driver list, glrc list) */ - CloseHandle( OPENGL32_processdata.driver_mutex ); - CloseHandle( OPENGL32_processdata.glrc_mutex ); - TlsFree(OPENGL32_tls); + OPENGL32_ProcessDetach(); break; } return TRUE; @@ -382,32 +428,6 @@ OPENGL32_UnloadDriver( GLDRIVERDATA *icd ) } -/* FUNCTION: Load ICD from HDC (shared ICD data) - * RETURNS: GLDRIVERDATA pointer on success, NULL otherwise. - * NOTES: Make sure the handle you pass in is one for a DC! - * Increases the refcount of the ICD - use - * OPENGL32_UnloadICD to release the ICD. - */ -GLDRIVERDATA *OPENGL32_LoadICDForHDC( HDC hdc ) -{ - DWORD dwInput = 0; - LONG ret; - EXTDRIVERINFO info; - - /* get driver name */ - ret = ExtEscape( hdc, EXT_GET_DRIVERINFO, sizeof (dwInput), (LPCSTR)&dwInput, - sizeof (EXTDRIVERINFO), (LPSTR)&info ); - if (ret < 0) - { - DBGPRINT( "Warning: ExtEscape to get the drivername failed!!! (%d)", GetLastError() ); - return 0; - } - - /* load driver (or get a reference) */ - return OPENGL32_LoadICD( info.driver_name ); -} - - /* FUNCTION: Load ICD (shared ICD data) * RETURNS: GLDRIVERDATA pointer on success, NULL otherwise. */ diff --git a/reactos/lib/opengl32/opengl32.h b/reactos/lib/opengl32/opengl32.h index fee6b96418b..808aa88a8c7 100644 --- a/reactos/lib/opengl32/opengl32.h +++ b/reactos/lib/opengl32/opengl32.h @@ -1,4 +1,4 @@ -/* $Id: opengl32.h,v 1.14 2004/02/12 23:56:15 royce Exp $ +/* $Id: opengl32.h,v 1.15 2004/03/01 19:36:21 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -28,6 +28,7 @@ extern "C" { # 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 */ #endif /* !NDEBUG */ /* debug macros */ @@ -54,6 +55,10 @@ ULONG DbgPrint(PCH Format,...); # endif #endif +#ifdef DEBUG_OPENGL32_TRACE +# define DBGTRACE( args... ) DBGPRINT( args ) +#endif + /* function/data attributes */ #define EXPORT __declspec(dllexport) #ifdef _MSC_VER @@ -129,7 +134,7 @@ typedef struct tagGLDRIVERDATA struct tagGLDRIVERDATA *next; /* next ICD -- linked list */ } GLDRIVERDATA; -/* Out private OpenGL context (saved in TLS) */ +/* Our private OpenGL context (stored in TLS) */ typedef struct tagGLRC { GLDRIVERDATA *icd; /* driver used for this context */ @@ -142,15 +147,26 @@ typedef struct tagGLRC struct tagGLRC *next; /* linked list */ } GLRC; +/* 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 */ + + struct tagGLDCDATA *next; /* linked list */ +} GLDCDATA; + + /* 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 */ - HDC cachedHdc; /* cached HDC from last SetPixelFormat */ - INT cachedFormat; /* cached format from last SetPixelFormat */ + 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 */ @@ -164,7 +180,7 @@ extern GLPROCESSDATA OPENGL32_processdata; #define OPENGL32_threaddata ((GLTHREADDATA *)TlsGetValue( OPENGL32_tls )) /* function prototypes */ -GLDRIVERDATA *OPENGL32_LoadICDForHDC( HDC hdc ); +/*GLDRIVERDATA *OPENGL32_LoadICDForHDC( HDC hdc );*/ GLDRIVERDATA *OPENGL32_LoadICD( LPCWSTR driver ); BOOL OPENGL32_UnloadICD( GLDRIVERDATA *icd ); DWORD OPENGL32_RegEnumDrivers( DWORD idx, LPWSTR name, LPDWORD cName ); diff --git a/reactos/lib/opengl32/wgl.c b/reactos/lib/opengl32/wgl.c index 76bc7286be5..5c7d5d1ccc6 100644 --- a/reactos/lib/opengl32/wgl.c +++ b/reactos/lib/opengl32/wgl.c @@ -21,12 +21,22 @@ extern "C" { #define UNIMPLEMENTED DBGPRINT( "UNIMPLEMENTED" ) #endif//_MSC_VER + +#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 */ +} EXTDRIVERINFO; + + /* FUNCTION: Append OpenGL Rendering Context (GLRC) to list * ARGUMENTS: [IN] glrc: GLRC to append to list */ static void -WGL_AppendContext( GLRC *glrc ) +ROSGL_AppendContext( GLRC *glrc ) { /* synchronize */ if (WaitForSingleObject( OPENGL32_processdata.glrc_mutex, INFINITE ) == @@ -57,7 +67,7 @@ WGL_AppendContext( GLRC *glrc ) */ static void -WGL_RemoveContext( GLRC *glrc ) +ROSGL_RemoveContext( GLRC *glrc ) { /* synchronize */ if (WaitForSingleObject( OPENGL32_processdata.glrc_mutex, INFINITE ) == @@ -89,12 +99,55 @@ WGL_RemoveContext( GLRC *glrc ) DBGPRINT( "Error: ReleaseMutex() failed (%d)", GetLastError() ); } + +/* FUNCTION: Create a new GL Context (GLRC) and append it to the list + * RETURNS: Pointer to new GLRC on success; NULL on failure + */ +static +GLRC * +ROSGL_NewContext() +{ + GLRC *glrc; + + /* allocate GLRC */ + glrc = (GLRC*)HeapAlloc( GetProcessHeap(), + HEAP_ZERO_MEMORY | HEAP_GENERATE_EXCEPTIONS, sizeof (GLRC) ); + + /* append to list */ + ROSGL_AppendContext( glrc ); + + return glrc; +} + + +/* 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 + */ +static +BOOL +ROSGL_DeleteContext( GLRC *glrc ) +{ + /* unload icd */ + if (glrc->icd != NULL) + OPENGL32_UnloadICD( glrc->icd ); + + /* remove from list */ + ROSGL_RemoveContext( glrc ); + + /* free memory */ + HeapFree( GetProcessHeap(), 0, glrc ); + + return TRUE; +} + + /* FUNCTION: Check wether a GLRC is in the list * ARGUMENTS: [IN] glrc: GLRC to remove from list */ static BOOL -WGL_ContainsContext( GLRC *glrc ) +ROSGL_ContainsContext( GLRC *glrc ) { GLRC *p; @@ -122,16 +175,119 @@ WGL_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 + */ +static +GLDCDATA * +ROSGL_GetPrivateDCData( HDC hdc ) +{ + GLDCDATA *data; + + /* synchronize */ + if (WaitForSingleObject( OPENGL32_processdata.dcdata_mutex, INFINITE ) == + WAIT_FAILED) + { + DBGPRINT( "Error: WaitForSingleObject() failed (%d)", GetLastError() ); + return NULL; /* FIXME: do we have to expect such an error and handle it? */ + } + + /* look for data in list */ + data = OPENGL32_processdata.dcdata_list; + while (data != NULL) + { + if (data->hdc == hdc) /* found */ + break; + data = data->next; + } + + /* allocate new data if not found in list */ + if (data == NULL) + { + data = HeapAlloc( GetProcessHeap(), + HEAP_ZERO_MEMORY | HEAP_GENERATE_EXCEPTIONS, + sizeof (GLDCDATA) ); + if (data == NULL) + { + DBGPRINT( "Error: HeapAlloc() failed (%d)", GetLastError() ); + } + else + { + data->hdc = hdc; + + /* append data to list */ + if (OPENGL32_processdata.dcdata_list == NULL) + OPENGL32_processdata.dcdata_list = data; + else + { + GLDCDATA *p = OPENGL32_processdata.dcdata_list; + while (p->next != NULL) + p = p->next; + p->next = data; + } + } + } + + /* release mutex */ + if (!ReleaseMutex( OPENGL32_processdata.dcdata_mutex )) + DBGPRINT( "Error: ReleaseMutex() failed (%d)", GetLastError() ); + + return data; +} + + +/* 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! + */ +static +GLDRIVERDATA * +ROSGL_ICDForHDC( HDC hdc ) +{ + GLDCDATA *dcdata; + + dcdata = ROSGL_GetPrivateDCData( hdc ); + if (dcdata == NULL) + return NULL; + + if (dcdata->icd == NULL) +#if 1 + { + DWORD dwInput = 0; + LONG ret; + EXTDRIVERINFO info; + + /* get driver name */ + ret = ExtEscape( hdc, EXT_GET_DRIVERINFO, sizeof (dwInput), (LPCSTR)&dwInput, + sizeof (EXTDRIVERINFO), (LPSTR)&info ); + if (ret < 0) + { + DBGPRINT( "Warning: ExtEscape to get the drivername failed!!! (%d)", GetLastError() ); + return 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 - can - * be multiple times for one DrvSetContext call. + * 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?) */ DWORD CALLBACK -WGL_SetContextCallBack( const ICDTable *table ) +ROSGL_SetContextCallBack( const ICDTable *table ) { /* UINT i;*/ TEB *teb; @@ -211,26 +367,27 @@ rosglChoosePixelFormat( HDC hdc, CONST PIXELFORMATDESCRIPTOR *pfd ) const DWORD compareFlags = PFD_DRAW_TO_WINDOW | PFD_DRAW_TO_BITMAP | PFD_SUPPORT_GDI | PFD_SUPPORT_OPENGL; + DBGTRACE( "Called!" ); + /* load ICD */ - icd = OPENGL32_LoadICDForHDC( hdc ); + icd = ROSGL_ICDForHDC( hdc ); if (icd == NULL) return 0; /* check input */ if (pfd->nSize != sizeof (PIXELFORMATDESCRIPTOR) || pfd->nVersion != 1) { - OPENGL32_UnloadICD( icd ); SetLastError( 0 ); /* FIXME: use appropriate errorcode */ return 0; } - /* get number of formats -- FIXME: use 1 or 0 as index? */ - icdNumFormats = icd->DrvDescribePixelFormat( hdc, 0, - sizeof (PIXELFORMATDESCRIPTOR), NULL ); + /* get number of formats */ +// __asm__( "int $3" ); + icdNumFormats = icd->DrvDescribePixelFormat( hdc, 1, + sizeof (PIXELFORMATDESCRIPTOR), &icdPfd ); if (icdNumFormats == 0) { DBGPRINT( "Error: DrvDescribePixelFormat failed (%d)", GetLastError() ); - OPENGL32_UnloadICD( icd ); return 0; } DBGPRINT( "Info: Enumerating %d pixelformats", icdNumFormats ); @@ -281,7 +438,6 @@ rosglChoosePixelFormat( HDC hdc, CONST PIXELFORMATDESCRIPTOR *pfd ) if (best == 0) SetLastError( 0 ); /* FIXME: set appropriate error */ - OPENGL32_UnloadICD( icd ); DBGPRINT( "Info: Suggesting pixelformat %d", best ); return best; @@ -302,12 +458,12 @@ rosglCopyContext( HGLRC hsrc, HGLRC hdst, UINT mask ) GLRC *dst = (GLRC *)hdst; /* check glrcs */ - if (!WGL_ContainsContext( src )) + if (!ROSGL_ContainsContext( src )) { DBGPRINT( "Error: src GLRC not found!" ); return FALSE; /* FIXME: SetLastError() */ } - if (!WGL_ContainsContext( dst )) + if (!ROSGL_ContainsContext( dst )) { DBGPRINT( "Error: dst GLRC not found!" ); return FALSE; /* FIXME: SetLastError() */ @@ -335,10 +491,6 @@ HGLRC APIENTRY rosglCreateLayerContext( HDC hdc, int layer ) { -/* LONG ret; - WCHAR driver[256]; - DWORD dw, size;*/ - GLDRIVERDATA *icd = NULL; GLRC *glrc; HGLRC drvHglrc = NULL; @@ -349,57 +501,13 @@ rosglCreateLayerContext( HDC hdc, int layer ) return NULL; } */ - /* allocate our GLRC */ - glrc = (GLRC*)HeapAlloc( GetProcessHeap(), - HEAP_ZERO_MEMORY | HEAP_GENERATE_EXCEPTIONS, sizeof (GLRC) ); + /* create new GLRC */ + glrc = ROSGL_NewContext(); if (glrc == NULL) return NULL; -#if 0 /* old code */ - /* try to find an ICD */ - for (dw = 0; drvHglrc == NULL; dw++) /* enumerate values */ - { - size = sizeof (driver) / sizeof (driver[0]); - ret = OPENGL32_RegEnumDrivers( dw, driver, &size ); - if (ret != ERROR_SUCCESS) - break; - - icd = OPENGL32_LoadICD( driver ); - if (icd == NULL) /* try next ICD */ - continue; - - if (icd->DrvCreateLayerContext) - drvHglrc = icd->DrvCreateLayerContext( hdc, layer ); - if (drvHglrc == NULL) - { - if (layer == 0) - drvHglrc = icd->DrvCreateContext( hdc ); - else - DBGPRINT( "Warning: CreateLayerContext not supported by ICD!" ); - } - if (drvHglrc == NULL) /* try next ICD */ - { - DBGPRINT( "Info: DrvCreateContext (driver = %ws) failed: %d", - icd->driver_name, GetLastError() ); - OPENGL32_UnloadICD( icd ); - continue; - } - - /* the ICD was loaded successfully and we got a HGLRC in drvHglrc */ - break; - } - - if (drvHglrc == NULL || icd == NULL) /* no ICD was found */ - { - /* FIXME: fallback to mesa */ - DBGPRINT( "Error: No working ICD found!" ); - HeapFree( GetProcessHeap(), 0, glrc ); - return NULL; - } -#endif /* unused */ - /* load ICD */ - icd = OPENGL32_LoadICDForHDC( hdc ); + icd = ROSGL_ICDForHDC( hdc ); if (icd == NULL) { DBGPRINT( "Couldn't get ICD by HDC :-(" ); @@ -422,8 +530,7 @@ rosglCreateLayerContext( HDC hdc, int layer ) { /* FIXME: fallback to mesa? */ DBGPRINT( "Error: DrvCreate[Layer]Context failed! (%d)", GetLastError() ); - OPENGL32_UnloadICD( icd ); - HeapFree( GetProcessHeap(), 0, glrc ); + ROSGL_DeleteContext( glrc ); return NULL; } @@ -431,9 +538,6 @@ rosglCreateLayerContext( HDC hdc, int layer ) glrc->hglrc = drvHglrc; glrc->icd = icd; - /* append glrc to context list */ - WGL_AppendContext( glrc ); - return (HGLRC)glrc; } @@ -461,7 +565,7 @@ rosglDeleteContext( HGLRC hglrc ) GLRC *glrc = (GLRC *)hglrc; /* check if we know about this context */ - if (!WGL_ContainsContext( glrc )) + if (!ROSGL_ContainsContext( glrc )) { DBGPRINT( "Error: hglrc not found!" ); return FALSE; /* FIXME: SetLastError() */ @@ -485,38 +589,41 @@ rosglDeleteContext( HGLRC hglrc ) } /* free resources */ - OPENGL32_UnloadICD( glrc->icd ); - WGL_RemoveContext( glrc ); - HeapFree( GetProcessHeap(), 0, glrc ); - - return TRUE; + return ROSGL_DeleteContext( glrc ); } BOOL APIENTRY rosglDescribeLayerPlane( HDC hdc, int iPixelFormat, int iLayerPlane, - UINT nBytes, LPLAYERPLANEDESCRIPTOR plpd ) + UINT nBytes, LPLAYERPLANEDESCRIPTOR plpd ) { UNIMPLEMENTED; return FALSE; } +/* 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 + */ int APIENTRY rosglDescribePixelFormat( HDC hdc, int iFormat, UINT nBytes, - LPPIXELFORMATDESCRIPTOR pfd ) + LPPIXELFORMATDESCRIPTOR pfd ) { int ret = 0; - GLDRIVERDATA *icd = OPENGL32_LoadICDForHDC( hdc ); + GLDRIVERDATA *icd = ROSGL_ICDForHDC( hdc ); if (icd != NULL) { ret = icd->DrvDescribePixelFormat( hdc, iFormat, nBytes, pfd ); if (ret == 0) DBGPRINT( "Error: DrvDescribePixelFormat(format=%d) failed (%d)", iFormat, GetLastError() ); - OPENGL32_UnloadICD( icd ); } /* FIXME: implement own functionality? */ @@ -553,24 +660,33 @@ rosglGetCurrentDC() int APIENTRY rosglGetLayerPaletteEntries( HDC hdc, int iLayerPlane, int iStart, - int cEntries, COLORREF *pcr ) + int cEntries, COLORREF *pcr ) { UNIMPLEMENTED; return 0; } +/* 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 + */ int WINAPI rosglGetPixelFormat( HDC hdc ) { - if (OPENGL32_processdata.cachedHdc == hdc) - return OPENGL32_processdata.cachedFormat; + GLDCDATA *dcdata; - /* FIXME: create real implementation of this function */ - DBGPRINT( "Warning: Pixel format not cached, returning 0" ); + DBGTRACE( "Called!" ); - return 0; + dcdata = ROSGL_GetPrivateDCData( hdc ); + if (dcdata == NULL) + { + DBGPRINT( "Error: ROSGL_GetPrivateDCData failed!" ); + return 0; + } + + return dcdata->pixel_format; } @@ -654,7 +770,7 @@ rosglMakeCurrent( HDC hdc, HGLRC hglrc ) } /* check if we know about this glrc */ - if (!WGL_ContainsContext( glrc )) + if (!ROSGL_ContainsContext( glrc )) { DBGPRINT( "Error: hglrc not found!" ); return FALSE; /* FIXME: SetLastError() */ @@ -671,7 +787,7 @@ rosglMakeCurrent( HDC hdc, HGLRC hglrc ) if (glrc->hglrc != NULL) { icdTable = glrc->icd->DrvSetContext( hdc, glrc->hglrc, - WGL_SetContextCallBack ); + ROSGL_SetContextCallBack ); if (icdTable == NULL) { DBGPRINT( "Error: DrvSetContext failed (%d)\n", GetLastError() ); @@ -689,13 +805,10 @@ rosglMakeCurrent( HDC hdc, HGLRC hglrc ) OPENGL32_threaddata->glrc = glrc; } - WGL_SetContextCallBack( icdTable ); - - if (icdTable != NULL) - if (WGL_SetContextCallBack( icdTable ) != ERROR_SUCCESS) - { - DBGPRINT( "Warning: WGL_SetContextCallBack failed!" ); - } + if (ROSGL_SetContextCallBack( icdTable ) != ERROR_SUCCESS) + { + DBGPRINT( "Warning: ROSGL_SetContextCallBack failed!" ); + } return TRUE; } @@ -713,34 +826,52 @@ rosglRealizeLayerPalette( HDC hdc, int iLayerPlane, BOOL bRealize ) int APIENTRY rosglSetLayerPaletteEntries( HDC hdc, int iLayerPlane, int iStart, - int cEntries, CONST COLORREF *pcr ) + int cEntries, CONST COLORREF *pcr ) { UNIMPLEMENTED; return 0; } +/* 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 + */ BOOL WINAPI rosglSetPixelFormat( HDC hdc, int iFormat, CONST PIXELFORMATDESCRIPTOR *pfd ) { GLDRIVERDATA *icd; + GLDCDATA *dcdata; - icd = OPENGL32_LoadICDForHDC( hdc ); + DBGTRACE( "Called!" ); + + /* load ICD */ + icd = ROSGL_ICDForHDC( hdc ); if (icd == NULL) + { + DBGPRINT( "Warning: ICDForHDC() failed" ); return FALSE; + } + /* call ICD */ if (!icd->DrvSetPixelFormat( hdc, iFormat, pfd )) { DBGPRINT( "Warning: DrvSetPixelFormat(format=%d) failed (%d)", iFormat, GetLastError() ); - OPENGL32_UnloadICD( icd ); return FALSE; } - OPENGL32_processdata.cachedHdc = hdc; - OPENGL32_processdata.cachedFormat = iFormat; - OPENGL32_UnloadICD( icd ); + /* store format in private DC data */ + dcdata = ROSGL_GetPrivateDCData( hdc ); + if (dcdata == NULL) + { + DBGPRINT( "Error: ROSGL_GetPrivateDCData() failed!" ); + return FALSE; + } + dcdata->pixel_format = iFormat; return TRUE; } @@ -749,7 +880,7 @@ 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: TRUR on success, FALSE on failure + * RETURNS: TRUE on success, FALSE on failure */ BOOL APIENTRY @@ -759,12 +890,12 @@ rosglShareLists( HGLRC hglrc1, HGLRC hglrc2 ) GLRC *glrc2 = (GLRC *)hglrc2; /* check glrcs */ - if (!WGL_ContainsContext( glrc1 )) + if (!ROSGL_ContainsContext( glrc1 )) { DBGPRINT( "Error: hglrc1 not found!" ); return FALSE; /* FIXME: SetLastError() */ } - if (!WGL_ContainsContext( glrc2 )) + if (!ROSGL_ContainsContext( glrc2 )) { DBGPRINT( "Error: hglrc2 not found!" ); return FALSE; /* FIXME: SetLastError() */ @@ -790,16 +921,14 @@ BOOL APIENTRY rosglSwapBuffers( HDC hdc ) { - GLDRIVERDATA *icd = OPENGL32_LoadICDForHDC( hdc ); + GLDRIVERDATA *icd = ROSGL_ICDForHDC( hdc ); if (icd != NULL) { if (!icd->DrvSwapBuffers( hdc )) { DBGPRINT( "Error: DrvSwapBuffers failed (%d)", GetLastError() ); - OPENGL32_UnloadICD( icd ); return FALSE; } - OPENGL32_UnloadICD( icd ); return TRUE; } @@ -838,8 +967,8 @@ rosglUseFontBitmapsW( HDC hdc, DWORD first, DWORD count, DWORD listBase ) BOOL APIENTRY rosglUseFontOutlinesA( HDC hdc, DWORD first, DWORD count, DWORD listBase, - FLOAT deviation, FLOAT extrusion, int format, - LPGLYPHMETRICSFLOAT lpgmf ) + FLOAT deviation, FLOAT extrusion, int format, + GLYPHMETRICSFLOAT *pgmf ) { UNIMPLEMENTED; return FALSE; @@ -849,8 +978,8 @@ rosglUseFontOutlinesA( HDC hdc, DWORD first, DWORD count, DWORD listBase, BOOL APIENTRY rosglUseFontOutlinesW( HDC hdc, DWORD first, DWORD count, DWORD listBase, - FLOAT deviation, FLOAT extrusion, int format, - LPGLYPHMETRICSFLOAT lpgmf ) + FLOAT deviation, FLOAT extrusion, int format, + GLYPHMETRICSFLOAT *pgmf ) { UNIMPLEMENTED; return FALSE; From 93a1911cc6f576a97772cd55af09d7cfc6308f65 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Mon, 1 Mar 2004 22:12:57 +0000 Subject: [PATCH 0288/1463] correct SafeArrayCreateVector[Ex]() parameter types svn path=/trunk/; revision=8498 --- reactos/lib/oleaut32/safearray.c | 4 ++-- reactos/w32api/include/oleauto.h | 7 ++++--- reactos/w32api/include/wtypes.h | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/reactos/lib/oleaut32/safearray.c b/reactos/lib/oleaut32/safearray.c index 696b192bc1d..8f2e140160d 100644 --- a/reactos/lib/oleaut32/safearray.c +++ b/reactos/lib/oleaut32/safearray.c @@ -655,7 +655,7 @@ SAFEARRAY* WINAPI SafeArrayCreateEx(VARTYPE vt, UINT cDims, SAFEARRAYBOUND *rgsa * NOTES * See SafeArray. */ -SAFEARRAY* WINAPI SafeArrayCreateVector(VARTYPE vt, LONG lLbound, UINT cElements) +SAFEARRAY* WINAPI SafeArrayCreateVector(VARTYPE vt, LONG lLbound, ULONG cElements) { TRACE("(%d->%s,%ld,%ld\n", vt, debugstr_vt(vt), lLbound, cElements); @@ -683,7 +683,7 @@ SAFEARRAY* WINAPI SafeArrayCreateVector(VARTYPE vt, LONG lLbound, UINT cElements * NOTES * See SafeArray. */ -SAFEARRAY* WINAPI SafeArrayCreateVectorEx(VARTYPE vt, LONG lLbound, UINT cElements, LPVOID pvExtra) +SAFEARRAY* WINAPI SafeArrayCreateVectorEx(VARTYPE vt, LONG lLbound, ULONG cElements, LPVOID pvExtra) { ULONG ulSize; IRecordInfo* iRecInfo = (IRecordInfo*)pvExtra; diff --git a/reactos/w32api/include/oleauto.h b/reactos/w32api/include/oleauto.h index 7c2f364a026..cdd26daa888 100644 --- a/reactos/w32api/include/oleauto.h +++ b/reactos/w32api/include/oleauto.h @@ -96,6 +96,7 @@ #endif #define V_DECIMALREF(X) V_UNION(X,pdecVal) #define V_I1(X) V_UNION(X,cVal) + #ifdef _WIN64 #define V_INT_PTR(X) V_I8(X) #define V_UINT_PTR(X) V_UI8(X) @@ -225,8 +226,8 @@ WINOLEAUTAPI SafeArrayGetElement(SAFEARRAY*,long*,void*); WINOLEAUTAPI SafeArrayPutElement(SAFEARRAY*,long*,void*); WINOLEAUTAPI SafeArrayCopy(SAFEARRAY*,SAFEARRAY**); WINOLEAUTAPI SafeArrayPtrOfIndex(SAFEARRAY*,long*,void**); -WINOLEAUTAPI_(SAFEARRAY*) SafeArrayCreateVector(VARTYPE,LONG,UINT); -WINOLEAUTAPI_(SAFEARRAY*) SafeArrayCreateVectorEx(VARTYPE,LONG,UINT,LPVOID); +WINOLEAUTAPI_(SAFEARRAY*) SafeArrayCreateVector(VARTYPE,LONG,ULONG); +WINOLEAUTAPI_(SAFEARRAY*) SafeArrayCreateVectorEx(VARTYPE,LONG,ULONG,LPVOID); WINOLEAUTAPI SafeArrayAllocDescriptorEx(VARTYPE,UINT,SAFEARRAY**); WINOLEAUTAPI SafeArrayGetVartype(SAFEARRAY*,VARTYPE*); WINOLEAUTAPI SafeArraySetRecordInfo(SAFEARRAY*,IRecordInfo*); @@ -596,6 +597,7 @@ WINOLEAUTAPI VarDecFromUI8(ULONG64,DECIMAL*); WINOLEAUTAPI VarDecFromCy(CY,DECIMAL*); WINOLEAUTAPI VarDecFromDisp(IDispatch*,LCID,DECIMAL*); +WINOLEAUTAPI VarDecNeg(const DECIMAL*,DECIMAL*); WINOLEAUTAPI VarR4CmpR8(float,double); WINOLEAUTAPI VarR8Pow(double,double,double*); WINOLEAUTAPI VarR8Round(double,int,double*); @@ -607,7 +609,6 @@ WINOLEAUTAPI VarDecDiv(const DECIMAL*,const DECIMAL*,DECIMAL*); WINOLEAUTAPI VarDecFix(const DECIMAL*,DECIMAL*); WINOLEAUTAPI VarDecInt(const DECIMAL*,DECIMAL*); WINOLEAUTAPI VarDecMul(const DECIMAL*,const DECIMAL*,DECIMAL*); -WINOLEAUTAPI VarDecNeg(const DECIMAL*,DECIMAL*); WINOLEAUTAPI VarDecRound(const DECIMAL*,int,DECIMAL*); WINOLEAUTAPI VarDecSub(const DECIMAL*,const DECIMAL*,DECIMAL*); WINOLEAUTAPI VarCyAbs(const CY,CY*); diff --git a/reactos/w32api/include/wtypes.h b/reactos/w32api/include/wtypes.h index 1c6a1acf343..ca0c2be49a0 100644 --- a/reactos/w32api/include/wtypes.h +++ b/reactos/w32api/include/wtypes.h @@ -11,7 +11,7 @@ extern "C" { #endif -#define DEC_SIGN(d) ((d)->u.s.sign) +#define DEC_SIGN(d) ((d)->u.s.sign) #define DEC_SCALE(d) ((d)->u.s.scale) #define DEC_SIGNSCALE(d) ((d)->u.signscale) #define DEC_HI32(d) ((d)->Hi32) From 7be7923e1a536890787c4a693d3d2c94b7f02a72 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Mon, 1 Mar 2004 22:41:52 +0000 Subject: [PATCH 0289/1463] remove superflous dllmain.c file svn path=/trunk/; revision=8499 --- reactos/lib/oleaut32/dllmain.c | 37 ---------------------------------- 1 file changed, 37 deletions(-) delete mode 100644 reactos/lib/oleaut32/dllmain.c diff --git a/reactos/lib/oleaut32/dllmain.c b/reactos/lib/oleaut32/dllmain.c deleted file mode 100644 index f1990adef4c..00000000000 --- a/reactos/lib/oleaut32/dllmain.c +++ /dev/null @@ -1,37 +0,0 @@ -/* $Id: dllmain.c,v 1.1 2001/07/16 01:45:43 rex Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS system libraries - * FILE: lib/oldaut32/misc/dllmain.c - * PURPOSE: Library main function - * PROGRAMMER: Rex Jolliff (rex@lvcablemodem.com) - */ - -#include <ddk/ntddk.h> -#include <windows.h> - -#define NDEBUG -#include <debug.h> - -INT STDCALL -DllMain(PVOID hinstDll, - ULONG dwReason, - PVOID reserved) -{ - DPRINT("OLEAUT32: DllMain() called\n"); - - switch (dwReason) - { - case DLL_PROCESS_ATTACH: - break; - - case DLL_PROCESS_DETACH: - break; - } - - DPRINT("OLEAUT32: DllMain() done\n"); - - return TRUE; -} - - From 897ccf0b0873f6dfd45911233f9a64114c6e0a4b Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Mon, 1 Mar 2004 22:45:23 +0000 Subject: [PATCH 0290/1463] resolve SysStringLen FIXME svn path=/trunk/; revision=8500 --- reactos/lib/oleaut32/oleaut.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/reactos/lib/oleaut32/oleaut.c b/reactos/lib/oleaut32/oleaut.c index dde48f041a9..eb1298b9202 100644 --- a/reactos/lib/oleaut32/oleaut.c +++ b/reactos/lib/oleaut32/oleaut.c @@ -92,8 +92,7 @@ HMODULE OLEAUT32_hModule = NULL; * calculated by lstrlenW(), since it returns the length that was used to * allocate the string by SysAllocStringLen(). */ -unsigned/*FIXME: wrong return type of SysStringLen() in WINE header */ -int WINAPI SysStringLen(BSTR str) +UINT WINAPI SysStringLen(BSTR str) { DWORD* bufferPointer; @@ -123,8 +122,7 @@ int WINAPI SysStringLen(BSTR str) * NOTES * See SysStringLen(), BSTR(). */ -unsigned/*FIXME: wrong return type of SysStringLen() in WINE header */ -int WINAPI SysStringByteLen(BSTR str) +UINT WINAPI SysStringByteLen(BSTR str) { DWORD* bufferPointer; From 43a529f49b31f7c88d54d8307ed9348a4918d535 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Mon, 1 Mar 2004 22:57:20 +0000 Subject: [PATCH 0291/1463] - declare IPicture OBJC macros - enable olepicture.c svn path=/trunk/; revision=8501 --- reactos/lib/oleaut32/Makefile.in | 2 +- reactos/lib/oleaut32/oleaut32.spec | 6 +++--- reactos/lib/oleaut32/olepicture.c | 2 -- reactos/lib/oleaut32/variant.c | 9 +++------ reactos/w32api/include/ocidl.h | 20 ++++++++++++++++++++ 5 files changed, 27 insertions(+), 12 deletions(-) diff --git a/reactos/lib/oleaut32/Makefile.in b/reactos/lib/oleaut32/Makefile.in index 396577d8226..6924283821d 100644 --- a/reactos/lib/oleaut32/Makefile.in +++ b/reactos/lib/oleaut32/Makefile.in @@ -16,6 +16,7 @@ C_SRCS = \ dispatch.c \ hash.c \ oleaut.c \ + olepicture.c \ stubs.c \ safearray.c \ varformat.c \ @@ -24,7 +25,6 @@ C_SRCS = \ # regsvr.c \ # olefont.c \ -# olepicture.c \ # tmarshal.c \ # usrmarshal.c \ # oaidl_p.c \ diff --git a/reactos/lib/oleaut32/oleaut32.spec b/reactos/lib/oleaut32/oleaut32.spec index 1fcb940fb27..5455a3dada3 100644 --- a/reactos/lib/oleaut32/oleaut32.spec +++ b/reactos/lib/oleaut32/oleaut32.spec @@ -380,7 +380,7 @@ 397 stub UserMSG_to_local 398 stub UserMSG_free_inst 399 stub UserMSG_free_local -#401 stdcall OleLoadPictureEx(ptr long long long long long long ptr) +401 stdcall OleLoadPictureEx(ptr long long long long long long ptr) 402 stub OleLoadPictureFileEx 410 stdcall -private DllCanUnloadNow() OLEAUT32_DllCanUnloadNow 411 stdcall SafeArrayCreateVector(long long long) @@ -390,8 +390,8 @@ 415 stdcall OleIconToCursor(long long) 416 stdcall OleCreatePropertyFrameIndirect(ptr) 417 stdcall OleCreatePropertyFrame(ptr long long ptr long ptr long ptr ptr long ptr) -#418 stdcall OleLoadPicture(ptr long long ptr ptr) -#419 stdcall OleCreatePictureIndirect(ptr ptr long ptr) +418 stdcall OleLoadPicture(ptr long long ptr ptr) +419 stdcall OleCreatePictureIndirect(ptr ptr long ptr) #420 stdcall OleCreateFontIndirect(ptr ptr ptr) 421 stdcall OleTranslateColor(long long long) 422 stub OleLoadPictureFile diff --git a/reactos/lib/oleaut32/olepicture.c b/reactos/lib/oleaut32/olepicture.c index a7eeeca6d10..e86bb63bf29 100644 --- a/reactos/lib/oleaut32/olepicture.c +++ b/reactos/lib/oleaut32/olepicture.c @@ -1105,7 +1105,6 @@ static HRESULT WINAPI OLEPictureImpl_Load(IPersistStream* iface,IStream*pStm) { hr = S_OK; break; } -#ifndef __REACTOS__ /*FIXME: missing CURSORICONFILEDIR */ case 0x0000: { /* ICON , first word is dwReserved */ HICON hicon; CURSORICONFILEDIR *cifd = (CURSORICONFILEDIR*)xbuf; @@ -1160,7 +1159,6 @@ static HRESULT WINAPI OLEPictureImpl_Load(IPersistStream* iface,IStream*pStm) { } break; } -#endif default: { int i; diff --git a/reactos/lib/oleaut32/variant.c b/reactos/lib/oleaut32/variant.c index 8370650b349..fba3b8169e8 100644 --- a/reactos/lib/oleaut32/variant.c +++ b/reactos/lib/oleaut32/variant.c @@ -603,8 +603,7 @@ HRESULT WINAPI VariantClear(VARIANTARG* pVarg) if (V_ARRAY(pVarg)) hres = SafeArrayDestroy(V_ARRAY(pVarg)); } - else - if (V_VT(pVarg) == VT_BSTR) + else if (V_VT(pVarg) == VT_BSTR) { if (V_BSTR(pVarg)) SysFreeString(V_BSTR(pVarg)); @@ -724,8 +723,7 @@ HRESULT WINAPI VariantCopy(VARIANTARG* pvargDest, VARIANTARG* pvargSrc) if (V_ARRAY(pvargSrc)) hres = SafeArrayCopy(V_ARRAY(pvargSrc), &V_ARRAY(pvargDest)); } - else - if (V_VT(pvargSrc) == VT_BSTR) + else if (V_VT(pvargSrc) == VT_BSTR) { if (V_BSTR(pvargSrc)) { @@ -859,8 +857,7 @@ HRESULT WINAPI VariantCopyInd(VARIANT* pvargDest, VARIANTARG* pvargSrc) /* Native doesn't check that *V_ARRAYREF(pSrc) is valid */ hres = SafeArrayCopy(*V_ARRAYREF(pSrc), &V_ARRAY(pvargDest)); } - else - if (V_VT(pSrc) == (VT_BSTR|VT_BYREF)) + else if (V_VT(pSrc) == (VT_BSTR|VT_BYREF)) { /* Native doesn't check that *V_BSTRREF(pSrc) is valid */ V_BSTR(pvargDest) = SysAllocStringByteLen((char*)*V_BSTRREF(pSrc), SysStringByteLen(*V_BSTRREF(pSrc))); diff --git a/reactos/w32api/include/ocidl.h b/reactos/w32api/include/ocidl.h index d608d719abf..742d6db5fe2 100644 --- a/reactos/w32api/include/ocidl.h +++ b/reactos/w32api/include/ocidl.h @@ -610,6 +610,26 @@ DECLARE_INTERFACE_(IPicture,IUnknown) }; #undef INTERFACE +#ifdef COBJMACROS +#define IPicture_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IPicture_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IPicture_Release(p) (p)->lpVtbl->Release(p) +#define IPicture_get_Handle(p,a) (p)->lpVtbl->get_Handle(p,a) +#define IPicture_get_hPal(p,a) (p)->lpVtbl->get_hPal(p,a) +#define IPicture_get_Type(p,a) (p)->lpVtbl->get_Type(p,a) +#define IPicture_get_Width(p,a) (p)->lpVtbl->get_Width(p,a) +#define IPicture_get_Height(p,a) (p)->lpVtbl->get_Height(p,a) +#define IPicture_Render(p,a,b,c,d,e,f,g,h,i,j) (p)->lpVtbl->Render(p,a,b,c,d,e,f,g,h,i,j) +#define IPicture_set_hPal(p,a) (p)->lpVtbl->set_hPal(p,a) +#define IPicture_get_CurDC(p,a) (p)->lpVtbl->get_CurDC(p,a) +#define IPicture_SelectPicture(p,a,b,c) (p)->lpVtbl->SelectPicture(p,a,b,c) +#define IPicture_get_KeepOriginalFormat(p,a) (p)->lpVtbl->get_KeepOriginalFormat(p,a) +#define IPicture_put_KeepOriginalFormat(p,a) (p)->lpVtbl->put_KeepOriginalFormat(p,a) +#define IPicture_PictureChanged(p) (p)->lpVtbl->PictureChanged(p) +#define IPicture_SaveAsFile(p,a,b,c) (p)->lpVtbl->SaveAsFile(p,a,b,c) +#define IPicture_get_Attributes(p,a) (p)->lpVtbl->get_Attributes(p,a) +#endif + EXTERN_C const IID IID_IPictureDisp; #define INTERFACE IPictureDisp DECLARE_INTERFACE_(IPictureDisp,IDispatch) From 636e39eb03ab3133049b0664591446604a9da4ce Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Mon, 1 Mar 2004 23:27:02 +0000 Subject: [PATCH 0292/1463] Imported WineCalc by James Briggs. svn path=/trunk/; revision=8502 --- rosapps/calc/En.rc | 155 ++ rosapps/calc/Es.rc | 155 ++ rosapps/calc/Fr.rc | 155 ++ rosapps/calc/It.rc | 155 ++ rosapps/calc/Nl.rc | 155 ++ rosapps/calc/Pt.rc | 155 ++ rosapps/calc/Ru.rc | 155 ++ rosapps/calc/Si.rc | 156 ++ rosapps/calc/button.c | 219 --- rosapps/calc/button.h | 44 - rosapps/calc/calc.rc | 388 +--- rosapps/calc/dialog.c | 93 + rosapps/calc/dialog.h | 24 + rosapps/calc/main.c | 266 --- rosapps/calc/main.h | 52 - rosapps/calc/makefile | 20 +- rosapps/calc/resource.h | 180 +- rosapps/calc/rsrc.rc | 33 + rosapps/calc/settings.c | 115 -- rosapps/calc/settings.h | 44 - rosapps/calc/stats.c | 131 ++ rosapps/calc/stats.h | 24 + rosapps/calc/winecalc.c | 3785 +++++++++++++++++++++++++++++++++++++++ rosapps/calc/winecalc.h | 364 ++++ 24 files changed, 5762 insertions(+), 1261 deletions(-) create mode 100644 rosapps/calc/En.rc create mode 100644 rosapps/calc/Es.rc create mode 100644 rosapps/calc/Fr.rc create mode 100644 rosapps/calc/It.rc create mode 100644 rosapps/calc/Nl.rc create mode 100644 rosapps/calc/Pt.rc create mode 100644 rosapps/calc/Ru.rc create mode 100644 rosapps/calc/Si.rc delete mode 100644 rosapps/calc/button.c delete mode 100644 rosapps/calc/button.h create mode 100644 rosapps/calc/dialog.c create mode 100644 rosapps/calc/dialog.h delete mode 100644 rosapps/calc/main.c delete mode 100644 rosapps/calc/main.h create mode 100644 rosapps/calc/rsrc.rc delete mode 100644 rosapps/calc/settings.c delete mode 100644 rosapps/calc/settings.h create mode 100644 rosapps/calc/stats.c create mode 100644 rosapps/calc/stats.h create mode 100644 rosapps/calc/winecalc.c create mode 100644 rosapps/calc/winecalc.h diff --git a/rosapps/calc/En.rc b/rosapps/calc/En.rc new file mode 100644 index 00000000000..7aa9134a5b2 --- /dev/null +++ b/rosapps/calc/En.rc @@ -0,0 +1,155 @@ +/* + * WineCalc (En.rc) + * + * Copyright 2003 James Briggs + * + * 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 "windows.h" +#include "resource.h" +#include "winecalc.h" + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +STRINGTABLE DISCARDABLE +{ + IDS_APPNAME, "GNU Calculator" + + IDS_COPYRIGHT1, "GNU Calculator 5.0. Licensed under LGPL 2" + IDS_COPYRIGHT2 "Copyright 2003, James Briggs" + IDS_COPYRIGHT3 "San Jose, California, USA" + IDS_COPYRIGHT4 "james@ActionMessage.com" + IDS_COPYRIGHT5 "http://www.ActionMessage.com/winecalc/" + + IDS_BTN_BACKSPACE, "Backspace" + IDS_BTN_CLEAR_ENTRY, "CE" + IDS_BTN_CLEAR_ALL, "C" + IDS_BTN_MEM_CLEAR, "MC" + IDS_BTN_MEM_RECALL, "MR" + IDS_BTN_MEM_STORE, "MS" + IDS_BTN_MEM_PLUS, "M+" + IDS_BTN_MEM_STATUS_M, "M" + IDS_BTN_SQRT, "sqrt" + IDS_ERR_INVALID_INPUT, "Invalid input for function." + IDS_ERR_DIVIDE_BY_ZERO, "Cannot divide by zero." + IDS_ERR_UNDEFINED, "Result of function is undefined." +} + +MAIN_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIMS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Degrees\tF2", ID_CALC_MS_DEGREES + MENUITEM "Radians\tF3", ID_CALC_MS_RADIANS + MENUITEM "Grads\tF4", ID_CALC_MS_GRADS + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIWS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Qword\tF12", ID_CALC_WS_QWORD + MENUITEM "Dword\tF2", ID_CALC_WS_DWORD + MENUITEM "Word\tF3", ID_CALC_WS_WORD + MENUITEM "Byte\tF4", ID_CALC_WS_BYTE + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +MAIN_MENU ACCELERATORS +BEGIN + VK_F1, IDV_HELP, VIRTKEY +END + +DLG_ABOUT DIALOG 12,0,120,82 +CAPTION "About GNU winecalc" +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +BEGIN + DEFPUSHBUTTON "OK", IDOK, 42, 60, 30, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +WHATS_THIS_MENU MENU DISCARDABLE +{ + POPUP "" { + MENUITEM "What's This?", IDM_WHATS_THIS + } +} + +DLG_STATS DIALOG 12,0,125,78 +CAPTION "Statistics Box" +FONT 9, "Tahoma" +STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE +BEGIN + DEFPUSHBUTTON "&RET", ID_STATS_RET, 4, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&LOAD", ID_STATS_LOAD, 34, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&CD" ID_STATS_CD, 64, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "C&AD", ID_STATS_CAD, 94, 52, 25, 13, WS_TABSTOP | WS_GROUP +END diff --git a/rosapps/calc/Es.rc b/rosapps/calc/Es.rc new file mode 100644 index 00000000000..29a8ab828f4 --- /dev/null +++ b/rosapps/calc/Es.rc @@ -0,0 +1,155 @@ +/* + * WineCalc (Es.rc) + * + * Copyright 2003 James Briggs + * + * 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 "windows.h" +#include "resource.h" +#include "winecalc.h" + +LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +{ + IDS_APPNAME, "GNU Calculator" + + IDS_COPYRIGHT1, "GNU Calculator 5.0. Licensed under LGPL 2" + IDS_COPYRIGHT2 "Copyright 2003, James Briggs" + IDS_COPYRIGHT3 "San Jose, California, USA" + IDS_COPYRIGHT4 "james@ActionMessage.com" + IDS_COPYRIGHT5 "http://www.ActionMessage.com/winecalc/" + + IDS_BTN_BACKSPACE, "Backspace" + IDS_BTN_CLEAR_ENTRY, "CE" + IDS_BTN_CLEAR_ALL, "C" + IDS_BTN_MEM_CLEAR, "MC" + IDS_BTN_MEM_RECALL, "MR" + IDS_BTN_MEM_STORE, "MS" + IDS_BTN_MEM_PLUS, "M+" + IDS_BTN_MEM_STATUS_M, "M" + IDS_BTN_SQRT, "sqrt" + IDS_ERR_INVALID_INPUT, "Invalid input for function." + IDS_ERR_DIVIDE_BY_ZERO, "Cannot divide by zero." + IDS_ERR_UNDEFINED, "Result of function is undefined." +} + +MAIN_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIMS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Degrees\tF2", ID_CALC_MS_DEGREES + MENUITEM "Radians\tF3", ID_CALC_MS_RADIANS + MENUITEM "Grads\tF4", ID_CALC_MS_GRADS + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIWS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Qword\tF12", ID_CALC_WS_QWORD + MENUITEM "Dword\tF2", ID_CALC_WS_DWORD + MENUITEM "Word\tF3", ID_CALC_WS_WORD + MENUITEM "Byte\tF4", ID_CALC_WS_BYTE + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +MAIN_MENU ACCELERATORS +BEGIN + VK_F1, IDV_HELP, VIRTKEY +END + +WHATS_THIS_MENU MENU DISCARDABLE +{ + POPUP "" { + MENUITEM "What's This?", IDM_WHATS_THIS + } +} + +DLG_ABOUT DIALOG 12,0,120,82 +CAPTION "About GNU winecalc" +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +BEGIN + DEFPUSHBUTTON "OK", IDOK, 42, 60, 30, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +DLG_STATS DIALOG 12,0,125,78 +CAPTION "Statistics Box" +FONT 9, "Tahoma" +STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE +BEGIN + DEFPUSHBUTTON "&RET", ID_STATS_RET, 4, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&LOAD", ID_STATS_LOAD, 34, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&CD" ID_STATS_CD, 64, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "C&AD", ID_STATS_CAD, 94, 52, 25, 13, WS_TABSTOP | WS_GROUP +END diff --git a/rosapps/calc/Fr.rc b/rosapps/calc/Fr.rc new file mode 100644 index 00000000000..44e6858bb2f --- /dev/null +++ b/rosapps/calc/Fr.rc @@ -0,0 +1,155 @@ +/* + * WineCalc (Fr.rc) + * + * Copyright 2003 James Briggs + * + * 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 "windows.h" +#include "resource.h" +#include "winecalc.h" + +LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +{ + IDS_APPNAME, "GNU Calculator" + + IDS_COPYRIGHT1, "GNU Calculator 5.0. Licensed under LGPL 2" + IDS_COPYRIGHT2 "Copyright 2003, James Briggs" + IDS_COPYRIGHT3 "San Jose, California, USA" + IDS_COPYRIGHT4 "james@ActionMessage.com" + IDS_COPYRIGHT5 "http://www.ActionMessage.com/winecalc/" + + IDS_BTN_BACKSPACE, "Backspace" + IDS_BTN_CLEAR_ENTRY, "CE" + IDS_BTN_CLEAR_ALL, "C" + IDS_BTN_MEM_CLEAR, "MC" + IDS_BTN_MEM_RECALL, "MR" + IDS_BTN_MEM_STORE, "MS" + IDS_BTN_MEM_PLUS, "M+" + IDS_BTN_MEM_STATUS_M, "M" + IDS_BTN_SQRT, "sqrt" + IDS_ERR_INVALID_INPUT, "Invalid input for function." + IDS_ERR_DIVIDE_BY_ZERO, "Cannot divide by zero." + IDS_ERR_UNDEFINED, "Result of function is undefined." +} + +MAIN_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIMS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Degrees\tF2", ID_CALC_MS_DEGREES + MENUITEM "Radians\tF3", ID_CALC_MS_RADIANS + MENUITEM "Grads\tF4", ID_CALC_MS_GRADS + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIWS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Qword\tF12", ID_CALC_WS_QWORD + MENUITEM "Dword\tF2", ID_CALC_WS_DWORD + MENUITEM "Word\tF3", ID_CALC_WS_WORD + MENUITEM "Byte\tF4", ID_CALC_WS_BYTE + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +MAIN_MENU ACCELERATORS +BEGIN + VK_F1, IDV_HELP, VIRTKEY +END + +WHATS_THIS_MENU MENU DISCARDABLE +{ + POPUP "" { + MENUITEM "What's This?", IDM_WHATS_THIS + } +} + +DLG_ABOUT DIALOG 12,0,120,82 +CAPTION "About GNU winecalc" +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +BEGIN + DEFPUSHBUTTON "OK", IDOK, 42, 60, 30, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +DLG_STATS DIALOG 12,0,125,78 +CAPTION "Statistics Box" +FONT 9, "Tahoma" +STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE +BEGIN + DEFPUSHBUTTON "&RET", ID_STATS_RET, 4, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&LOAD", ID_STATS_LOAD, 34, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&CD" ID_STATS_CD, 64, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "C&AD", ID_STATS_CAD, 94, 52, 25, 13, WS_TABSTOP | WS_GROUP +END diff --git a/rosapps/calc/It.rc b/rosapps/calc/It.rc new file mode 100644 index 00000000000..c269516d61c --- /dev/null +++ b/rosapps/calc/It.rc @@ -0,0 +1,155 @@ +/* + * WineCalc (It.rc) + * + * Copyright 2003 James Briggs + * + * 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 "windows.h" +#include "resource.h" +#include "winecalc.h" + +LANGUAGE LANG_ITALIAN, SUBLANG_DEFAULT + +STRINGTABLE DISCARDABLE +{ + IDS_APPNAME, "GNU Calculator" + + IDS_COPYRIGHT1, "GNU Calculator 5.0. Licensed under LGPL 2" + IDS_COPYRIGHT2 "Copyright 2003, James Briggs" + IDS_COPYRIGHT3 "San Jose, California, USA" + IDS_COPYRIGHT4 "james@ActionMessage.com" + IDS_COPYRIGHT5 "http://www.ActionMessage.com/winecalc/" + + IDS_BTN_BACKSPACE, "Backspace" + IDS_BTN_CLEAR_ENTRY, "CE" + IDS_BTN_CLEAR_ALL, "C" + IDS_BTN_MEM_CLEAR, "MC" + IDS_BTN_MEM_RECALL, "MR" + IDS_BTN_MEM_STORE, "MS" + IDS_BTN_MEM_PLUS, "M+" + IDS_BTN_MEM_STATUS_M, "M" + IDS_BTN_SQRT, "sqrt" + IDS_ERR_INVALID_INPUT, "Invalid input for function." + IDS_ERR_DIVIDE_BY_ZERO, "Cannot divide by zero." + IDS_ERR_UNDEFINED, "Result of function is undefined." +} + +MAIN_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIMS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Degrees\tF2", ID_CALC_MS_DEGREES + MENUITEM "Radians\tF3", ID_CALC_MS_RADIANS + MENUITEM "Grads\tF4", ID_CALC_MS_GRADS + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIWS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Qword\tF12", ID_CALC_WS_QWORD + MENUITEM "Dword\tF2", ID_CALC_WS_DWORD + MENUITEM "Word\tF3", ID_CALC_WS_WORD + MENUITEM "Byte\tF4", ID_CALC_WS_BYTE + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +MAIN_MENU ACCELERATORS +BEGIN + VK_F1, IDV_HELP, VIRTKEY +END + +WHATS_THIS_MENU MENU DISCARDABLE +{ + POPUP "" { + MENUITEM "What's This?", IDM_WHATS_THIS + } +} + +DLG_ABOUT DIALOG 12,0,120,82 +CAPTION "About GNU winecalc" +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +BEGIN + DEFPUSHBUTTON "OK", IDOK, 42, 60, 30, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +DLG_STATS DIALOG 12,0,125,78 +CAPTION "Statistics Box" +FONT 9, "Tahoma" +STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE +BEGIN + DEFPUSHBUTTON "&RET", ID_STATS_RET, 4, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&LOAD", ID_STATS_LOAD, 34, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&CD" ID_STATS_CD, 64, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "C&AD", ID_STATS_CAD, 94, 52, 25, 13, WS_TABSTOP | WS_GROUP +END diff --git a/rosapps/calc/Nl.rc b/rosapps/calc/Nl.rc new file mode 100644 index 00000000000..cf4cfb088b5 --- /dev/null +++ b/rosapps/calc/Nl.rc @@ -0,0 +1,155 @@ +/* + * WineCalc (Nl.rc) + * + * Copyright 2003 James Briggs + * + * 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 "windows.h" +#include "resource.h" +#include "winecalc.h" + +LANGUAGE LANG_DUTCH, SUBLANG_DEFAULT + +STRINGTABLE DISCARDABLE +{ + IDS_APPNAME, "GNU Calculator" + + IDS_COPYRIGHT1, "GNU Calculator 5.0. Licensed under LGPL 2" + IDS_COPYRIGHT2 "Copyright 2003, James Briggs" + IDS_COPYRIGHT3 "San Jose, California, USA" + IDS_COPYRIGHT4 "james@ActionMessage.com" + IDS_COPYRIGHT5 "http://www.ActionMessage.com/winecalc/" + + IDS_BTN_BACKSPACE, "Backspace" + IDS_BTN_CLEAR_ENTRY, "CE" + IDS_BTN_CLEAR_ALL, "C" + IDS_BTN_MEM_CLEAR, "MC" + IDS_BTN_MEM_RECALL, "MR" + IDS_BTN_MEM_STORE, "MS" + IDS_BTN_MEM_PLUS, "M+" + IDS_BTN_MEM_STATUS_M, "M" + IDS_BTN_SQRT, "sqrt" + IDS_ERR_INVALID_INPUT, "Invalid input for function." + IDS_ERR_DIVIDE_BY_ZERO, "Cannot divide by zero." + IDS_ERR_UNDEFINED, "Result of function is undefined." +} + +MAIN_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIMS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Degrees\tF2", ID_CALC_MS_DEGREES + MENUITEM "Radians\tF3", ID_CALC_MS_RADIANS + MENUITEM "Grads\tF4", ID_CALC_MS_GRADS + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIWS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Qword\tF12", ID_CALC_WS_QWORD + MENUITEM "Dword\tF2", ID_CALC_WS_DWORD + MENUITEM "Word\tF3", ID_CALC_WS_WORD + MENUITEM "Byte\tF4", ID_CALC_WS_BYTE + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +MAIN_MENU ACCELERATORS +BEGIN + VK_F1, IDV_HELP, VIRTKEY +END + +WHATS_THIS_MENU MENU DISCARDABLE +{ + POPUP "" { + MENUITEM "What's This?", IDM_WHATS_THIS + } +} + +DLG_ABOUT DIALOG 12,0,120,82 +CAPTION "About GNU winecalc" +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +BEGIN + DEFPUSHBUTTON "OK", IDOK, 42, 60, 30, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +DLG_STATS DIALOG 12,0,125,78 +CAPTION "Statistics Box" +FONT 9, "Tahoma" +STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE +BEGIN + DEFPUSHBUTTON "&RET", ID_STATS_RET, 4, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&LOAD", ID_STATS_LOAD, 34, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&CD" ID_STATS_CD, 64, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "C&AD", ID_STATS_CAD, 94, 52, 25, 13, WS_TABSTOP | WS_GROUP +END diff --git a/rosapps/calc/Pt.rc b/rosapps/calc/Pt.rc new file mode 100644 index 00000000000..2a76f5e132f --- /dev/null +++ b/rosapps/calc/Pt.rc @@ -0,0 +1,155 @@ +/* + * WineCalc (Pt.rc) + * + * Copyright 2003 James Briggs + * + * 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 "windows.h" +#include "resource.h" +#include "winecalc.h" + +LANGUAGE LANG_PORTUGUESE, SUBLANG_DEFAULT + +STRINGTABLE DISCARDABLE +{ + IDS_APPNAME, "GNU Calculator" + + IDS_COPYRIGHT1, "GNU Calculator 5.0. Licensed under LGPL 2" + IDS_COPYRIGHT2 "Copyright 2003, James Briggs" + IDS_COPYRIGHT3 "San Jose, California, USA" + IDS_COPYRIGHT4 "james@ActionMessage.com" + IDS_COPYRIGHT5 "http://www.ActionMessage.com/winecalc/" + + IDS_BTN_BACKSPACE, "Backspace" + IDS_BTN_CLEAR_ENTRY, "CE" + IDS_BTN_CLEAR_ALL, "C" + IDS_BTN_MEM_CLEAR, "MC" + IDS_BTN_MEM_RECALL, "MR" + IDS_BTN_MEM_STORE, "MS" + IDS_BTN_MEM_PLUS, "M+" + IDS_BTN_MEM_STATUS_M, "M" + IDS_BTN_SQRT, "sqrt" + IDS_ERR_INVALID_INPUT, "Invalid input for function." + IDS_ERR_DIVIDE_BY_ZERO, "Cannot divide by zero." + IDS_ERR_UNDEFINED, "Result of function is undefined." +} + +MAIN_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIMS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Degrees\tF2", ID_CALC_MS_DEGREES + MENUITEM "Radians\tF3", ID_CALC_MS_RADIANS + MENUITEM "Grads\tF4", ID_CALC_MS_GRADS + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIWS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Qword\tF12", ID_CALC_WS_QWORD + MENUITEM "Dword\tF2", ID_CALC_WS_DWORD + MENUITEM "Word\tF3", ID_CALC_WS_WORD + MENUITEM "Byte\tF4", ID_CALC_WS_BYTE + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +MAIN_MENU ACCELERATORS +BEGIN + VK_F1, IDV_HELP, VIRTKEY +END + +WHATS_THIS_MENU MENU DISCARDABLE +{ + POPUP "" { + MENUITEM "What's This?", IDM_WHATS_THIS + } +} + +DLG_ABOUT DIALOG 12,0,120,82 +CAPTION "About GNU winecalc" +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +BEGIN + DEFPUSHBUTTON "OK", IDOK, 42, 60, 30, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +DLG_STATS DIALOG 12,0,125,78 +CAPTION "Statistics Box" +FONT 9, "Tahoma" +STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE +BEGIN + DEFPUSHBUTTON "&RET", ID_STATS_RET, 4, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&LOAD", ID_STATS_LOAD, 34, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&CD" ID_STATS_CD, 64, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "C&AD", ID_STATS_CAD, 94, 52, 25, 13, WS_TABSTOP | WS_GROUP +END diff --git a/rosapps/calc/Ru.rc b/rosapps/calc/Ru.rc new file mode 100644 index 00000000000..2b5315f8141 --- /dev/null +++ b/rosapps/calc/Ru.rc @@ -0,0 +1,155 @@ +/* + * WineCalc (Ru.rc) + * + * Copyright 2003 James Briggs + * + * 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 "windows.h" +#include "resource.h" +#include "winecalc.h" + +LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT + +STRINGTABLE DISCARDABLE +{ + IDS_APPNAME, "GNU Calculator" + + IDS_COPYRIGHT1, "GNU Calculator 5.0. Licensed under LGPL 2" + IDS_COPYRIGHT2 "Copyright 2003, James Briggs" + IDS_COPYRIGHT3 "San Jose, California, USA" + IDS_COPYRIGHT4 "james@ActionMessage.com" + IDS_COPYRIGHT5 "http://www.ActionMessage.com/winecalc/" + + IDS_BTN_BACKSPACE, "Backspace" + IDS_BTN_CLEAR_ENTRY, "CE" + IDS_BTN_CLEAR_ALL, "C" + IDS_BTN_MEM_CLEAR, "MC" + IDS_BTN_MEM_RECALL, "MR" + IDS_BTN_MEM_STORE, "MS" + IDS_BTN_MEM_PLUS, "M+" + IDS_BTN_MEM_STATUS_M, "M" + IDS_BTN_SQRT, "sqrt" + IDS_ERR_INVALID_INPUT, "Invalid input for function." + IDS_ERR_DIVIDE_BY_ZERO, "Cannot divide by zero." + IDS_ERR_UNDEFINED, "Result of function is undefined." +} + +MAIN_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIMS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Degrees\tF2", ID_CALC_MS_DEGREES + MENUITEM "Radians\tF3", ID_CALC_MS_RADIANS + MENUITEM "Grads\tF4", ID_CALC_MS_GRADS + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIWS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Qword\tF12", ID_CALC_WS_QWORD + MENUITEM "Dword\tF2", ID_CALC_WS_DWORD + MENUITEM "Word\tF3", ID_CALC_WS_WORD + MENUITEM "Byte\tF4", ID_CALC_WS_BYTE + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +MAIN_MENU ACCELERATORS +BEGIN + VK_F1, IDV_HELP, VIRTKEY +END + +WHATS_THIS_MENU MENU DISCARDABLE +{ + POPUP "" { + MENUITEM "What's This?", IDM_WHATS_THIS + } +} + +DLG_ABOUT DIALOG 12,0,120,82 +CAPTION "About GNU winecalc" +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +BEGIN + DEFPUSHBUTTON "OK", IDOK, 42, 60, 30, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +DLG_STATS DIALOG 12,0,125,78 +CAPTION "Statistics Box" +FONT 9, "Tahoma" +STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE +BEGIN + DEFPUSHBUTTON "&RET", ID_STATS_RET, 4, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&LOAD", ID_STATS_LOAD, 34, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&CD" ID_STATS_CD, 64, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "C&AD", ID_STATS_CAD, 94, 52, 25, 13, WS_TABSTOP | WS_GROUP +END diff --git a/rosapps/calc/Si.rc b/rosapps/calc/Si.rc new file mode 100644 index 00000000000..970c71847d5 --- /dev/null +++ b/rosapps/calc/Si.rc @@ -0,0 +1,156 @@ +/* + * WineCalc (Si.rc) + * + * Copyright 2003 James Briggs + * + * 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 "windows.h" +#include "resource.h" +#include "winecalc.h" + +LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT + +STRINGTABLE DISCARDABLE +{ + IDS_APPNAME, "GNU Calculator" + + IDS_COPYRIGHT1, "GNU Calculator 5.0. Licensed under LGPL 2" + IDS_COPYRIGHT2 "Copyright 2003, James Briggs" + IDS_COPYRIGHT3 "San Jose, California, USA" + IDS_COPYRIGHT4 "james@ActionMessage.com" + IDS_COPYRIGHT5 "http://www.ActionMessage.com/winecalc/" + + IDS_BTN_BACKSPACE, "Backspace" + IDS_BTN_CLEAR_ENTRY, "CE" + IDS_BTN_CLEAR_ALL, "C" + IDS_BTN_MEM_CLEAR, "MC" + IDS_BTN_MEM_RECALL, "MR" + IDS_BTN_MEM_STORE, "MS" + IDS_BTN_MEM_PLUS, "M+" + IDS_BTN_MEM_STATUS_M, "M" + IDS_BTN_SQRT, "sqrt" + IDS_ERR_INVALID_INPUT, "Invalid input for function." + IDS_ERR_DIVIDE_BY_ZERO, "Cannot divide by zero." + IDS_ERR_UNDEFINED, "Result of function is undefined." +} + +MAIN_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIMS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Degrees\tF2", ID_CALC_MS_DEGREES + MENUITEM "Radians\tF3", ID_CALC_MS_RADIANS + MENUITEM "Grads\tF4", ID_CALC_MS_GRADS + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIWS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Qword\tF12", ID_CALC_WS_QWORD + MENUITEM "Dword\tF2", ID_CALC_WS_DWORD + MENUITEM "Word\tF3", ID_CALC_WS_WORD + MENUITEM "Byte\tF4", ID_CALC_WS_BYTE + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +MAIN_MENU ACCELERATORS +BEGIN + VK_F1, IDV_HELP, VIRTKEY +END + +WHATS_THIS_MENU MENU DISCARDABLE +{ + POPUP "" { + MENUITEM "What's This?", IDM_WHATS_THIS + } +} + + +DLG_ABOUT DIALOG 12,0,120,82 +CAPTION "About GNU winecalc" +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +BEGIN + DEFPUSHBUTTON "OK", IDOK, 42, 60, 30, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +DLG_STATS DIALOG 12,0,125,78 +CAPTION "Statistics Box" +FONT 9, "Tahoma" +STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE +BEGIN + DEFPUSHBUTTON "&RET", ID_STATS_RET, 4, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&LOAD", ID_STATS_LOAD, 34, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&CD" ID_STATS_CD, 64, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "C&AD", ID_STATS_CAD, 94, 52, 25, 13, WS_TABSTOP | WS_GROUP +END diff --git a/rosapps/calc/button.c b/rosapps/calc/button.c deleted file mode 100644 index f66572e13e0..00000000000 --- a/rosapps/calc/button.c +++ /dev/null @@ -1,219 +0,0 @@ -/* - * ReactOS calc - * - * button.c - * - * Copyright (C) 2002 Robert Dickenson <robd@reactos.org> - * - * 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. - */ - -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers -#include <windows.h> -#include <tchar.h> - -#include "resource.h" -#include "button.h" - - -COLORREF text_colour; -COLORREF background_colour; -COLORREF disabled_background_colour; -COLORREF light; -COLORREF highlight; -COLORREF shadow; -COLORREF dark_shadow; - -const COLORREF CLR_BTN_WHITE = RGB(255, 255, 255); -const COLORREF CLR_BTN_BLACK = RGB(0, 0, 0); -const COLORREF CLR_BTN_DGREY = RGB(128, 128, 128); -const COLORREF CLR_BTN_GREY = RGB(192, 192, 192); -const COLORREF CLR_BTN_LLGREY = RGB(223, 223, 223); - -const int BUTTON_IN = 0x01; -const int BUTTON_OUT = 0x02; -const int BUTTON_BLACK_BORDER = 0x04; - - -void InitColours(void) -{ -// text_colour = GetSysColor(COLOR_BTNTEXT); - text_colour = RGB(255,0,0); - - background_colour = GetSysColor(COLOR_BTNFACE); - disabled_background_colour = background_colour; - light = GetSysColor(COLOR_3DLIGHT); - highlight = GetSysColor(COLOR_BTNHIGHLIGHT); - shadow = GetSysColor(COLOR_BTNSHADOW); - dark_shadow = GetSysColor(COLOR_3DDKSHADOW); -} - -static void FillSolidRect(HDC hDC, int x, int y, int cx, int cy, COLORREF clr) -{ - RECT rect; - - SetBkColor(hDC, clr); - rect.left = x; - rect.top = y; - rect.right = x + cx; - rect.bottom = y + cy; - ExtTextOut(hDC, 0, 0, ETO_OPAQUE, &rect, NULL, 0, NULL); -} - -void Draw3dRect(HDC hDC, int x, int y, int cx, int cy, COLORREF clrTopLeft, COLORREF clrBottomRight) -{ - FillSolidRect(hDC, x, y, cx - 1, 1, clrTopLeft); - FillSolidRect(hDC, x, y, 1, cy - 1, clrTopLeft); - FillSolidRect(hDC, x + cx, y, -1, cy, clrBottomRight); - FillSolidRect(hDC, x, y + cy, cx, -1, clrBottomRight); -} - - -void DrawFilledRect(HDC hdc, LPRECT r, COLORREF colour) -{ - HBRUSH hBrush; - - hBrush = CreateSolidBrush(colour); - FillRect(hdc, r, hBrush); -} - -void DrawLine(HDC hdc, long sx, long sy, long ex, long ey, COLORREF colour) -{ - HPEN new_pen; - HPEN old_pen; - - new_pen = CreatePen(PS_SOLID, 1, colour); - old_pen = SelectObject(hdc, &new_pen); - MoveToEx(hdc, sx, sy, NULL); - LineTo(hdc, ex, ey); - SelectObject(hdc, old_pen); - DeleteObject(new_pen); -} - -void DrawFrame(HDC hdc, RECT r, int state) -{ - COLORREF colour; - - if (state & BUTTON_BLACK_BORDER) { - colour = CLR_BTN_BLACK; - DrawLine(hdc, r.left, r.top, r.right, r.top, colour); // Across top - DrawLine(hdc, r.left, r.top, r.left, r.bottom, colour); // Down left - DrawLine(hdc, r.left, r.bottom - 1, r.right, r.bottom - 1, colour); // Across bottom - DrawLine(hdc, r.right - 1, r.top, r.right - 1, r.bottom, colour); // Down right - InflateRect(&r, -1, -1); - } - if (state & BUTTON_OUT) { - colour = highlight; - DrawLine(hdc, r.left, r.top, r.right, r.top, colour); // Across top - DrawLine(hdc, r.left, r.top, r.left, r.bottom, colour); // Down left - colour = dark_shadow; - DrawLine(hdc, r.left, r.bottom - 1, r.right, r.bottom - 1, colour); // Across bottom - DrawLine(hdc, r.right - 1, r.top, r.right - 1, r.bottom, colour); // Down right - InflateRect(&r, -1, -1); - colour = light; - DrawLine(hdc, r.left, r.top, r.right, r.top, colour); // Across top - DrawLine(hdc, r.left, r.top, r.left, r.bottom, colour); // Down left - colour = shadow; - DrawLine(hdc, r.left, r.bottom - 1, r.right, r.bottom - 1, colour); // Across bottom - DrawLine(hdc, r.right - 1, r.top, r.right - 1, r.bottom, colour); // Down right - } - if (state & BUTTON_IN) { - colour = dark_shadow; - DrawLine(hdc, r.left, r.top, r.right, r.top, colour); // Across top - DrawLine(hdc, r.left, r.top, r.left, r.bottom, colour); // Down left - DrawLine(hdc, r.left, r.bottom - 1, r.right, r.bottom - 1, colour); // Across bottom - DrawLine(hdc, r.right - 1, r.top, r.right - 1, r.bottom, colour); // Down right - InflateRect(&r, -1, -1); - colour = shadow; - DrawLine(hdc, r.left, r.top, r.right, r.top, colour); // Across top - DrawLine(hdc, r.left, r.top, r.left, r.bottom, colour); // Down left - DrawLine(hdc, r.left, r.bottom - 1, r.right, r.bottom - 1, colour); // Across bottom - DrawLine(hdc, r.right - 1, r.top, r.right - 1, r.bottom, colour); // Down right - } -} - -void DrawButtonText(HDC hdc, LPRECT r, LPCTSTR Buf, COLORREF text_colour) -{ - COLORREF previous_colour; - - previous_colour = SetTextColor(hdc, text_colour); - SetBkMode(hdc, TRANSPARENT); - DrawText(hdc, Buf, _tcslen(Buf), r, DT_CENTER | DT_VCENTER | DT_SINGLELINE); - SetTextColor(hdc, previous_colour); -} - -#define bufSize 512 - -void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) -{ - HDC hdc; - RECT focus_rect, button_rect, offset_button_rect; - UINT state; - TCHAR buffer[bufSize]; - - hdc = lpDrawItemStruct->hDC; - state = lpDrawItemStruct->itemState; - - CopyRect(&focus_rect, &lpDrawItemStruct->rcItem); - CopyRect(&button_rect, &lpDrawItemStruct->rcItem); - - // Set the focus rectangle to just past the border decoration - focus_rect.left += 4; - focus_rect.right -= 4; - focus_rect.top += 4; - focus_rect.bottom -= 4; - - // Retrieve the button's caption - GetWindowText(lpDrawItemStruct->hwndItem, buffer, bufSize); - - if (state & ODS_DISABLED) { - DrawFilledRect(hdc, &button_rect, disabled_background_colour); - } else { - DrawFilledRect(hdc, &button_rect, background_colour); - } - - if (state & ODS_SELECTED) { - DrawFrame(hdc, button_rect, BUTTON_IN); - } else { - if ((state & ODS_DEFAULT) || (state & ODS_FOCUS)) { - DrawFrame(hdc, button_rect, BUTTON_OUT | BUTTON_BLACK_BORDER); - } else { - DrawFrame(hdc, button_rect, BUTTON_OUT); - } - } - - if (state & ODS_DISABLED) { - offset_button_rect = button_rect; - OffsetRect(&offset_button_rect, 1, 1); - DrawButtonText(hdc, &offset_button_rect, buffer, CLR_BTN_WHITE); - DrawButtonText(hdc, &button_rect, buffer, CLR_BTN_DGREY); - } else { - if (lpDrawItemStruct->CtlID >= ID_RED_START && lpDrawItemStruct->CtlID <= ID_RED_FINISH) { - DrawButtonText(hdc, &button_rect, buffer, RGB(255,0,0)); - } else - if (lpDrawItemStruct->CtlID >= ID_PURPLE_START && lpDrawItemStruct->CtlID <= ID_PURPLE_FINISH) { - DrawButtonText(hdc, &button_rect, buffer, RGB(0,128,128)); - } else - if (lpDrawItemStruct->CtlID >= ID_BLUE_START && lpDrawItemStruct->CtlID <= ID_BLUE_FINISH) { - DrawButtonText(hdc, &button_rect, buffer, RGB(0,0,255)); - } else { - DrawButtonText(hdc, &button_rect, buffer, text_colour); - } - } - - if (state & ODS_FOCUS) { - DrawFocusRect(lpDrawItemStruct->hDC, (LPRECT)&focus_rect); - } -} diff --git a/rosapps/calc/button.h b/rosapps/calc/button.h deleted file mode 100644 index a0ff5dc62b0..00000000000 --- a/rosapps/calc/button.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * ReactOS calc - * - * button.h - * - * Copyright (C) 2002 Robert Dickenson <robd@reactos.org> - * - * 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. - */ - -#ifndef __BUTTON_H__ -#define __BUTTON_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - - -void InitColours(void); -void Draw3dRect(HDC hDC, int x, int y, int cx, int cy, COLORREF clrTopLeft, COLORREF clrBottomRight); -void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); - - -#ifdef __cplusplus -}; -#endif - -#endif // __BUTTON_H__ diff --git a/rosapps/calc/calc.rc b/rosapps/calc/calc.rc index 2ef1a7628fc..27069ea06d3 100644 --- a/rosapps/calc/calc.rc +++ b/rosapps/calc/calc.rc @@ -1,388 +1,6 @@ +/* Do not Make changes here */ + #include <windows.h> #include <reactos/resource.h> -//Microsoft Developer Studio generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#define APSTUDIO_HIDDEN_SYMBOLS -#include "windows.h" -#undef APSTUDIO_HIDDEN_SYMBOLS -#include "resource.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (Australia) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENA) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_AUS -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDR_CALC_STANDARD MENU DISCARDABLE -BEGIN - POPUP "&Edit" - BEGIN - MENUITEM "&Copy\tCtrl+C", ID_EDIT_COPY - MENUITEM "&Paste\tCtrl+V", ID_EDIT_PASTE - END - POPUP "&View" - BEGIN - MENUITEM "S&tandard", ID_VIEW_STANDARD, CHECKED - MENUITEM "&Scientific", ID_VIEW_SCIENTIFIC - MENUITEM SEPARATOR - MENUITEM "D&igit grouping", ID_VIEW_DIGIT_GROUPING - END - POPUP "&Help" - BEGIN - MENUITEM "&Help Topics", ID_HELP_TOPICS - MENUITEM SEPARATOR - MENUITEM "&About Calculator", ID_HELP_ABOUT - END -END - -IDR_CALC_SCIENTIFIC MENU DISCARDABLE -BEGIN - POPUP "&Edit" - BEGIN - MENUITEM "&Copy\tCtrl+C", ID_EDIT_COPY - MENUITEM "&Paste\tCtrl+V", ID_EDIT_PASTE - END - POPUP "&View" - BEGIN - MENUITEM "S&tandard", ID_VIEW_STANDARD - MENUITEM "&Scientific", ID_VIEW_SCIENTIFIC, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Hex\tF5", ID_VIEW_HEX - MENUITEM "&Decimal\tF6", ID_VIEW_DECIMAL - MENUITEM "&Octal\tF7", ID_VIEW_OCTAL - MENUITEM "&Binary\tF8", ID_VIEW_BINARY - MENUITEM SEPARATOR - MENUITEM "D&egrees\tF2", ID_VIEW_DEGREES - MENUITEM "&Radians\tF3", ID_VIEW_RADIANS - MENUITEM "&Grads\tF4", ID_VIEW_GRADS - MENUITEM SEPARATOR - MENUITEM "D&igit grouping", ID_VIEW_DIGIT_GROUPING - END - POPUP "&Help" - BEGIN - MENUITEM "&Help Topics", ID_HELP_TOPICS - MENUITEM SEPARATOR - MENUITEM "&About Scientific Calculator", ID_HELP_ABOUT - END -END - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_STANDARD DIALOG DISCARDABLE 0, 0, 170, 126 -STYLE DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "ReactOS Calculator" -MENU IDR_CALC_STANDARD -FONT 8, "MS Sans Serif" -BEGIN - CONTROL "M+",IDC_MPLUS,"Button",BS_OWNERDRAW,5,106, - 23,16 - CONTROL "MS",IDC_MS,"Button",BS_OWNERDRAW,5,85,23, - 16 - CONTROL "MR",IDC_MR,"Button",BS_OWNERDRAW,5,65,23, - 16 - CONTROL "MC",IDC_MC,"Button",BS_OWNERDRAW,5,45,23, - 16 - CONTROL "0",IDC_0,"Button",BS_OWNERDRAW,37,106,23, - 16 - CONTROL "1",IDC_1,"Button",BS_OWNERDRAW,37,85,23,16 - CONTROL "4",IDC_4,"Button",BS_OWNERDRAW,37,65,23,16 - CONTROL "7",IDC_7,"Button",BS_OWNERDRAW,37,45,23,16 - CONTROL "+/-",IDC_PLUSMINUS,"Button",BS_OWNERDRAW, - 63,106,23,16 - CONTROL "2",IDC_2,"Button",BS_OWNERDRAW,63,85,23,16 - CONTROL "5",IDC_5,"Button",BS_OWNERDRAW,63,65,23,16 - CONTROL "8",IDC_8,"Button",BS_OWNERDRAW,63,45,23,16 - CONTROL ".",IDC_DECPOINT,"Button",BS_OWNERDRAW,89, - 106,23,16 - CONTROL "3",IDC_3,"Button",BS_OWNERDRAW,89,85,23,16 - CONTROL "6",IDC_6,"Button",BS_OWNERDRAW,89,65,23,16 - CONTROL "9",IDC_9,"Button",BS_OWNERDRAW,89,45,23,16 - CONTROL "+",IDC_PLUS,"Button",BS_OWNERDRAW,115,106, - 23,16 - CONTROL "-",IDC_MINUS,"Button",BS_OWNERDRAW,115,85, - 23,16 - CONTROL "*",IDC_MULTIPLY,"Button",BS_OWNERDRAW,115, - 65,23,16 - CONTROL "/",IDC_DIVIDE,"Button",BS_OWNERDRAW,115,45, - 23,16 - CONTROL "=",IDC_EQUALS,"Button",BS_OWNERDRAW,142, - 106,23,16 - CONTROL "1/x",IDC_INVERT,"Button",BS_OWNERDRAW,142, - 85,23,16 - CONTROL "%",IDC_PERCENT,"Button",BS_OWNERDRAW,142, - 65,23,16 - CONTROL "sqrt",IDC_SQRT,"Button",BS_OWNERDRAW,142, - 45,23,16 - CONTROL "C",IDC_CLEAR,"Button",BS_OWNERDRAW,126,23, - 39,16 - CONTROL "CE",IDC_CE,"Button",BS_OWNERDRAW,83,23,39, - 16 - CONTROL "Backspace",IDC_BSPACE,"Button",BS_OWNERDRAW,38,23,41,16 - CTEXT "M",IDC_MEMTEXT,7,23,19,16,SS_CENTERIMAGE | SS_SUNKEN - EDITTEXT IDC_RESULT,7,0,157,15,ES_RIGHT | ES_AUTOHSCROLL -END - -IDD_SCIENTIFIC DIALOG DISCARDABLE 0, 0, 313, 161 -STYLE DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Scientific Calculator" -MENU IDR_CALC_SCIENTIFIC -FONT 8, "MS Sans Serif" -BEGIN - CONTROL "M+",IDC_MPLUS,"Button",BS_OWNERDRAW,122, - 121,23,16 - CONTROL "MS",IDC_MS,"Button",BS_OWNERDRAW,122,101, - 23,16 - CONTROL "MR",IDC_MR,"Button",BS_OWNERDRAW,122,81,23, - 16 - CONTROL "MC",IDC_MC,"Button",BS_OWNERDRAW,122,61,23, - 16 - CONTROL "0",IDC_0,"Button",BS_OWNERDRAW,156,121,23, - 16 - CONTROL "1",IDC_1,"Button",BS_OWNERDRAW,156,101,23, - 16 - CONTROL "4",IDC_4,"Button",BS_OWNERDRAW,156,81,23, - 16 - CONTROL "7",IDC_7,"Button",BS_OWNERDRAW,156,61,23, - 16 - CONTROL "+/-",IDC_PLUSMINUS,"Button",BS_OWNERDRAW, - 182,121,23,16 - CONTROL "2",IDC_2,"Button",BS_OWNERDRAW,182,101,23, - 16 - CONTROL "5",IDC_5,"Button",BS_OWNERDRAW,182,81,23, - 16 - CONTROL "8",IDC_8,"Button",BS_OWNERDRAW,182,61,23, - 16 - CONTROL ".",IDC_DECPOINT,"Button",BS_OWNERDRAW,208, - 121,23,16 - CONTROL "3",IDC_3,"Button",BS_OWNERDRAW,208,101,23, - 16 - CONTROL "6",IDC_6,"Button",BS_OWNERDRAW,208,81,23, - 16 - CONTROL "9",IDC_9,"Button",BS_OWNERDRAW,208,61,23, - 16 - CONTROL "+",IDC_PLUS,"Button",BS_OWNERDRAW,234,121, - 23,16 - CONTROL "-",IDC_MINUS,"Button",BS_OWNERDRAW,234,101, - 23,16 - CONTROL "*",IDC_MULTIPLY,"Button",BS_OWNERDRAW,234, - 81,23,16 - CONTROL "/",IDC_DIVIDE,"Button",BS_OWNERDRAW,234,61, - 23,16 - CONTROL "=",IDC_EQUALS,"Button",BS_OWNERDRAW,260, - 121,23,16 - CONTROL "Lsh",IDC_LSH,"Button",BS_OWNERDRAW,260,101, - 23,16 - CONTROL "Or",IDC_OR,"Button",BS_OWNERDRAW,260,81,23, - 16 - CONTROL "Mod",IDC_MOD,"Button",BS_OWNERDRAW,260,61, - 23,16 - CONTROL "C",IDC_CLEAR,"Button",BS_OWNERDRAW,268,38, - 41,16 - CONTROL "CE",IDC_CE,"Button",BS_OWNERDRAW,224,38,40, - 16 - CONTROL "Backspace",IDC_BSPACE,"Button",BS_OWNERDRAW,178,38,42,16 - CTEXT "M",IDC_MEMTEXT,123,38,19,16,SS_CENTERIMAGE | SS_SUNKEN - CONTROL "Int",IDC_INT,"Button",BS_OWNERDRAW,286,121, - 23,16 - CONTROL "Not",IDC_NOT,"Button",BS_OWNERDRAW,286,101, - 23,16 - CONTROL "Xor",IDC_XOR,"Button",BS_OWNERDRAW,286,81, - 23,16 - CONTROL "And",IDC_AND,"Button",BS_OWNERDRAW,286,61, - 23,16 - CONTROL "pi",IDC_PI,"Button",BS_OWNERDRAW,122,142, - 23,16 - CONTROL "A",IDC_A,"Button",BS_OWNERDRAW,156,142,23, - 16 - CONTROL "B",IDC_B,"Button",BS_OWNERDRAW,182,142,23, - 16 - CONTROL "C",IDC_C,"Button",BS_OWNERDRAW,208,142,23, - 16 - CONTROL "D",IDC_D,"Button",BS_OWNERDRAW,234,142,23, - 16 - CONTROL "E",IDC_E,"Button",BS_OWNERDRAW,260,142,23, - 16 - CONTROL "F",IDC_F,"Button",BS_OWNERDRAW,286,142,23, - 16 - CONTROL "cos",IDC_COS,"Button",BS_OWNERDRAW,37,121, - 23,16 - CONTROL "sin",IDC_SIN,"Button",BS_OWNERDRAW,37,101, - 23,16 - CONTROL "dms",IDC_DMS,"Button",BS_OWNERDRAW,37,81, - 23,16 - CONTROL "F-E",IDC_FE,"Button",BS_OWNERDRAW,37,61,23, - 16 - CONTROL "x^3",IDC_CUBE,"Button",BS_OWNERDRAW,63,121, - 23,16 - CONTROL "x^y",IDC_POWER,"Button",BS_OWNERDRAW,63, - 101,23,16 - CONTROL "Exp",IDC_EXP,"Button",BS_OWNERDRAW,63,81, - 23,16 - CONTROL "(",IDC_OPENBKT,"Button",BS_OWNERDRAW,63,61, - 23,16 - CONTROL "n!",IDC_BANG,"Button",BS_OWNERDRAW,89,121, - 23,16 - CONTROL "log",IDC_LOG,"Button",BS_OWNERDRAW,89,101, - 23,16 - CONTROL "ln",IDC_LN,"Button",BS_OWNERDRAW,89,81,23, - 16 - CONTROL ")",IDC_CLOSEBK,"Button",BS_OWNERDRAW,89,61, - 23,16 - CONTROL "tan",IDC_TAN,"Button",BS_OWNERDRAW,37,142, - 23,16 - CONTROL "x^2",IDC_SQUARE,"Button",BS_OWNERDRAW,63, - 142,23,16 - CONTROL "1/x",IDC_INVERT,"Button",BS_OWNERDRAW,89, - 142,23,16 - CONTROL "s",IDC_S,"Button",BS_OWNERDRAW,4,121,23,16 - CONTROL "Sum",IDC_SUM,"Button",BS_OWNERDRAW,4,101, - 23,16 - CONTROL "Ave",IDC_AVE,"Button",BS_OWNERDRAW,4,81,23, - 16 - CONTROL "Sta",IDC_STA,"Button",BS_OWNERDRAW,4,61,23, - 16 - CONTROL "Dat",IDC_DAT,"Button",BS_OWNERDRAW,4,142, - 23,16 - CTEXT "9",IDC_BKTTEXT,91,38,19,16,SS_CENTERIMAGE | SS_SUNKEN - GROUPBOX "",IDC_INVHYP,6,34,80,22,WS_GROUP - CONTROL "Inv",IDC_INV,"Button",BS_AUTOCHECKBOX,9,42,26,10 - CONTROL "Hyp",IDC_HYP,"Button",BS_AUTOCHECKBOX,47,41,29,10 - GROUPBOX "",IDC_BASE,6,13,141,22,WS_GROUP - CONTROL "Hex",IDC_HEX,"Button",BS_AUTORADIOBUTTON,8,21,29,10 - CONTROL "Dec",IDC_DEC,"Button",BS_AUTORADIOBUTTON,42,21,29,10 - CONTROL "Oct",IDC_OCT,"Button",BS_AUTORADIOBUTTON,76,21,27,10 - CONTROL "Bin",IDC_BIN,"Button",BS_AUTORADIOBUTTON,109,21,26,10 - GROUPBOX "",IDC_UNITS,150,13,160,22,WS_GROUP - CONTROL "Degrees",IDC_DEGREES,"Button",BS_AUTORADIOBUTTON,152,21, - 43,10 - CONTROL "Radians",IDC_RADIANS,"Button",BS_AUTORADIOBUTTON,204,21, - 42,10 - CONTROL "Grads",IDC_GRADS,"Button",BS_AUTORADIOBUTTON,255,21,35, - 10 - EDITTEXT IDC_RESULT,6,0,303,15,ES_RIGHT | ES_AUTOHSCROLL -END - - -#ifndef _MAC -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -(1) VERSIONINFO - FILEVERSION 0,0,19,147 - PRODUCTVERSION 0,0,19,0 - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x40004L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "Comments", "Absolutely no warranties whatsoever - Use at your own risk\0" - VALUE "CompanyName", "ReactOS Development Team\0" - VALUE "FileDescription", "ReactOS Calculator by Robert Dickenson\0" - VALUE "FileVersion", "1, 0, 0, 1\0" - VALUE "InternalName", "calc\0" - VALUE "LegalCopyright", "Copyright 2002 Robert Dickenson\0" - VALUE "LegalTrademarks", "\0" - VALUE "OriginalFilename", "calc.exe\0" - VALUE "PrivateBuild", "\0" - VALUE "ProductName", "ReactOS Operating System\0" - VALUE "ProductVersion", "0.0.19\0" - VALUE "SpecialBuild", "Non-versioned Development Beta Release\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0xc09, 1200 - END -END - -#endif // !_MAC - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_APP_TITLE "ReactOS Calculator" - IDS_APP_REG_KEY "\\Calculator" - IDS_APP_REG_PATH "Software\\ReactWare" -END - -#endif // English (Australia) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - +#include "rsrc.rc" diff --git a/rosapps/calc/dialog.c b/rosapps/calc/dialog.c new file mode 100644 index 00000000000..b658d0db116 --- /dev/null +++ b/rosapps/calc/dialog.c @@ -0,0 +1,93 @@ +/* + * WineCalc (dialog.c) + * + * Copyright 2003 James Briggs + * + * 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 <windows.h> +#include "dialog.h" +#include "resource.h" +#include "winecalc.h" + +extern HINSTANCE hInstance; + +BOOL CALLBACK AboutDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + HDC hdc; + PAINTSTRUCT ps; + + switch( uMsg ) { + + case WM_INITDIALOG: + SendMessage (hDlg, WM_SETFONT, (UINT)GetStockObject(DEFAULT_GUI_FONT), TRUE); + return TRUE; + + case WM_COMMAND: + switch(LOWORD(wParam)) { + case IDOK: + EndDialog( hDlg, 0 ); + return TRUE; + } + break; + + case WM_PAINT: + { + HDC hMemDC; + HFONT hFont; + HFONT hFontOrg; + + char c1[CALC_BUF_SIZE]; + char c2[CALC_BUF_SIZE]; + char c3[CALC_BUF_SIZE]; + char c4[CALC_BUF_SIZE]; + char c5[CALC_BUF_SIZE]; + + hdc = BeginPaint( hDlg, &ps ); + + hMemDC = CreateCompatibleDC( hdc ); + + LoadString( hInstance, IDS_COPYRIGHT1, c1, sizeof(c1)); + LoadString( hInstance, IDS_COPYRIGHT2, c2, sizeof(c2)); + LoadString( hInstance, IDS_COPYRIGHT3, c3, sizeof(c3)); + LoadString( hInstance, IDS_COPYRIGHT4, c4, sizeof(c4)); + LoadString( hInstance, IDS_COPYRIGHT5, c5, sizeof(c5)); + + hFont = GetStockObject(DEFAULT_GUI_FONT); + hFontOrg = SelectObject(hdc, hFont); + + SetBkMode(hdc, TRANSPARENT); + + TextOut(hdc, 10, 10, c1, strlen(c1)); + TextOut(hdc, 10, 35, c2, strlen(c2)); + TextOut(hdc, 10, 50, c3, strlen(c3)); + TextOut(hdc, 10, 75, c4, strlen(c4)); + TextOut(hdc, 10, 90, c5, strlen(c5)); + + SelectObject(hdc, hFontOrg); + + DeleteDC( hMemDC ); + EndPaint( hDlg, &ps ); + + return 0; + } + case WM_CLOSE: + EndDialog( hDlg, TRUE ); + return 0; + } + return FALSE; +} + diff --git a/rosapps/calc/dialog.h b/rosapps/calc/dialog.h new file mode 100644 index 00000000000..a588259e6c0 --- /dev/null +++ b/rosapps/calc/dialog.h @@ -0,0 +1,24 @@ +/* + * WineCalc (dialog.h) + * + * Copyright 2003 James Briggs + * + * 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 + */ + +BOOL CALLBACK AboutDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); + + + diff --git a/rosapps/calc/main.c b/rosapps/calc/main.c deleted file mode 100644 index 56602eb8093..00000000000 --- a/rosapps/calc/main.c +++ /dev/null @@ -1,266 +0,0 @@ -/* - * ReactOS calc - * - * calc.c - * - * Copyright (C) 2002 Robert Dickenson <robd@reactos.org> - * - * 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. - */ - -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers -#include <windows.h> -#include <shellapi.h> -#include <tchar.h> - -#include "main.h" -#include "button.h" -#include "settings.h" - - -// Global Variables: -HINSTANCE hInst; -HWND hDlgWnd; -TCHAR szTitle[MAX_LOADSTRING]; -CALC_TYPES CalcType; -HACCEL hAccel; - -BOOL bDigitGrouping = FALSE; - -/*TODO: Figure out why we are copying MFC map style programming. -** This pattern is difficult to maintain. -*/ -#define BEGIN_CMD_MAP(a) switch(##a) { -#define CMD_MAP_ENTRY(a, b) case a: b(); break; -#define END_CMD_MAP(a) } - - -BOOL OnCreate(HWND hWnd) -{ - HMENU hMenu; - HMENU hViewMenu; - - hMenu = GetMenu(hDlgWnd); - hViewMenu = GetSubMenu(hMenu, ID_MENU_VIEW); - if (bDigitGrouping) { - CheckMenuItem(hViewMenu, ID_VIEW_DIGIT_GROUPING, MF_BYCOMMAND|MF_CHECKED); - } - - //SendMessage(hDlgWnd, WM_SETICON, ICON_BIG, (LPARAM)LoadIcon(hInst, MAKEINTRESOURCE(IDI_CALC))); - - // Initialize the Windows Common Controls DLL - //InitCommonControls(); - - return TRUE; -} - -void OnEditCopy(void) -{ - SendMessage(GetDlgItem(hDlgWnd, IDC_RESULT), WM_COMMAND, MAKELONG(ID_EDIT_COPY, 0), 0); -} - -void OnEditPaste(void) -{ - SendMessage(GetDlgItem(hDlgWnd, IDC_RESULT), WM_COMMAND, MAKELONG(ID_EDIT_PASTE, 0), 0); -} - -void OnViewStandard(void) -{ - CalcType = STANDARD; - DestroyWindow(hDlgWnd); -} - -void OnViewScientific(void) -{ - CalcType = SCIENTIFIC; - DestroyWindow(hDlgWnd); -} - -void OnViewDigitGrouping(void) -{ - HMENU hMenu = GetMenu(hDlgWnd); - HMENU hViewMenu = GetSubMenu(hMenu, ID_MENU_VIEW); - bDigitGrouping = !bDigitGrouping; - if (bDigitGrouping) { - CheckMenuItem(hViewMenu, ID_VIEW_DIGIT_GROUPING, MF_BYCOMMAND|MF_CHECKED); - } else { - CheckMenuItem(hViewMenu, ID_VIEW_DIGIT_GROUPING, MF_BYCOMMAND|MF_UNCHECKED); - } -} - -void OnViewHex(void) -{ -} - -void OnViewDecimal(void) -{ -} - -void OnViewOctal(void) -{ -} - -void OnViewBinary(void) -{ -} - -void OnViewDegrees(void) -{ -} - -void OnViewRadians(void) -{ -} - -void OnViewGrads(void) -{ -} - -void OnHelpTopics(void) -{ - WinHelp(hDlgWnd, _T("calc"), HELP_CONTENTS, 0); -} - -void OnHelpAbout(void) -{ - ShellAbout(hDlgWnd, _T("ReactOS Calculator"), _T(""), LoadIcon(hInst, MAKEINTRESOURCE(IDI_CALC))); -} - -void OnButtonClick(int ButtonID) -{ -} -// Message handler for dialog box. -LRESULT CALLBACK CalcWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch (message) { - case WM_INITDIALOG: - hDlgWnd = hDlg; - InitColours(); - return OnCreate(hDlg); - - case WM_DRAWITEM: - DrawItem((LPDRAWITEMSTRUCT)lParam); - return TRUE; - - case WM_COMMAND: - if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { - EndDialog(hDlg, LOWORD(wParam)); - return TRUE; - } - - if (HIWORD(wParam) == BN_CLICKED) { - switch (LOWORD(wParam)) { - OnButtonClick(LOWORD(wParam)); - //case IDC_OWNERDRAW: -// // application-defined processing -// break; - } - } - - //BEGIN_CMD_MAP( LOWORD(wParam) ) - switch (LOWORD(wParam)) - { - CMD_MAP_ENTRY(ID_EDIT_COPY, OnEditCopy) - CMD_MAP_ENTRY(ID_EDIT_PASTE, OnEditPaste) - CMD_MAP_ENTRY(ID_VIEW_STANDARD, OnViewStandard) - CMD_MAP_ENTRY(ID_VIEW_SCIENTIFIC, OnViewScientific) - CMD_MAP_ENTRY(ID_VIEW_DIGIT_GROUPING, OnViewDigitGrouping) - CMD_MAP_ENTRY(ID_VIEW_HEX, OnViewHex) - CMD_MAP_ENTRY(ID_VIEW_DECIMAL, OnViewDecimal) - CMD_MAP_ENTRY(ID_VIEW_OCTAL, OnViewOctal) - CMD_MAP_ENTRY(ID_VIEW_BINARY, OnViewBinary) - CMD_MAP_ENTRY(ID_VIEW_DEGREES, OnViewDegrees) - CMD_MAP_ENTRY(ID_VIEW_RADIANS, OnViewRadians) - CMD_MAP_ENTRY(ID_VIEW_GRADS, OnViewGrads) - CMD_MAP_ENTRY(ID_HELP_TOPICS, OnHelpTopics) - CMD_MAP_ENTRY(ID_HELP_ABOUT, OnHelpAbout) - } - //END_CMD_MAP(0) - break; -/* - case WM_KEYUP: - case WM_KEYDOWN: - { - MSG msg; - msg.hwnd = hDlg; - msg.message = message; - msg.wParam = wParam; - msg.lParam = lParam; -// msg.time; -// msg.pt; - if (TranslateAccelerator(hDlg, hAccel, &msg)) return 0; - } - break; - */ - case WM_NOTIFY: - { - int idctrl; - LPNMHDR pnmh; - idctrl = (int)wParam; - pnmh = (LPNMHDR)lParam; -/* - if ((pnmh->hwndFrom == hTabWnd) && - (pnmh->idFrom == IDC_TAB) && - (pnmh->code == TCN_SELCHANGE)) - { - _OnTabWndSelChange(); - } - */ - } - break; - - case WM_DESTROY: - WinHelp(hDlgWnd, _T("regedit"), HELP_QUIT, 0); - return DefWindowProc(hDlg, message, wParam, lParam); - } - return 0; -} - -int APIENTRY WinMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpCmdLine, - int nCmdShow) -{ - CALC_TYPES CurrentCalcType; - - // Initialize global variables - hInst = hInstance; - LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); - - // Load our settings from the registry - LoadSettings(); - - hAccel = LoadAccelerators(hInstance, (LPCTSTR)IDR_ACCELERATOR); - - do { - CurrentCalcType = CalcType; - switch (CalcType) { - case HP42S: - break; - case SCIENTIFIC: - DialogBox(hInst, (LPCTSTR)IDD_SCIENTIFIC, NULL, (DLGPROC)CalcWndProc); - break; - case STANDARD: - default: - DialogBox(hInst, (LPCTSTR)IDD_STANDARD, NULL, (DLGPROC)CalcWndProc); - break; - } - } while (CalcType != CurrentCalcType); - - // Save our settings to the registry - SaveSettings(); - return 0; -} - diff --git a/rosapps/calc/main.h b/rosapps/calc/main.h deleted file mode 100644 index a5cd366fa4a..00000000000 --- a/rosapps/calc/main.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * ReactOS calc - * - * main.h - * - * Copyright (C) 2002 Robert Dickenson <robd@reactos.org> - * - * 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. - */ - -#ifndef __MAIN_H__ -#define __MAIN_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - - -#include "resource.h" - - -#define MAX_LOADSTRING 100 - -typedef enum _CALC_TYPES { STANDARD, SCIENTIFIC, HP42S, OTHER } CALC_TYPES; - -extern HINSTANCE hInst; -extern HWND hDlgWnd; -extern TCHAR szTitle[]; -extern CALC_TYPES CalcType; - - -#ifdef __cplusplus -}; -#endif - -#endif // __MAIN_H__ diff --git a/rosapps/calc/makefile b/rosapps/calc/makefile index 75dcaa63476..db10c265268 100644 --- a/rosapps/calc/makefile +++ b/rosapps/calc/makefile @@ -6,25 +6,15 @@ PATH_TO_TOP = ../../reactos -WINE_MODE = yes - -WINE_RC = calc - TARGET_TYPE = program TARGET_APPTYPE = windows TARGET_NAME = calc -WINE_INCLUDE = ./ +TARGET_CFLAGS = -D__USE_W32API -D_WIN32_IE=0x0501 -TARGET_CFLAGS = -D__USE_W32API - -#TARGET_CFLAGS = -I$(TEST_ROOT) -DDBG -DUNICODE -D_UNICODE - -BASE_CFLAGS = -D_WIN32_IE=0x0400 - -RCFLAGS = -D_WIN32_IE=0x0400 +TARGET_RCFLAGS = -D__USE_W32API -D_WIN32_IE=0x0501 TARGET_SDKLIBS = \ kernel32.a \ @@ -34,9 +24,9 @@ TARGET_SDKLIBS = \ TARGET_GCCLIBS = comctl32 TARGET_OBJECTS = \ - settings.o \ - button.o \ - main.o + dialog.o \ + stats.o \ + winecalc.o include $(PATH_TO_TOP)/rules.mak diff --git a/rosapps/calc/resource.h b/rosapps/calc/resource.h index 4ff8f6c49c5..9938d36fd97 100644 --- a/rosapps/calc/resource.h +++ b/rosapps/calc/resource.h @@ -1,130 +1,68 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Developer Studio generated include file. -// Used by calc.rc -// -#define ID_MENU_EDIT 0 -#define ID_MENU_VIEW 1 -#define ID_MENU_HELP 2 -#define IDI_CALC 100 -#define IDD_STANDARD 101 -#define IDD_SCIENTIFIC 102 -#define IDR_CALC_STANDARD 103 -#define IDR_CALC_SCIENTIFIC 104 -#define IDS_APP_TITLE 105 -#define IDR_ACCELERATOR 106 -#define IDS_APP_REG_KEY 107 -#define IDS_APP_REG_PATH 108 +/* + * WineCalc (resource.h) + * + * Copyright 2003 James Briggs + * + * 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 ID_EDIT_COPY 0xE122 -#define ID_EDIT_PASTE 0xE125 +/* menus */ -#define ID_BLUE_START 1000 -#define IDC_0 1000 -#define IDC_1 1001 -#define IDC_3 1002 -#define IDC_2 1003 -#define IDC_4 1004 -#define IDC_5 1005 -#define IDC_6 1006 -#define IDC_7 1007 -#define IDC_8 1008 -#define IDC_9 1009 -#define IDC_A 1010 -#define IDC_B 1011 -#define IDC_C 1012 -#define IDC_D 1013 -#define IDC_E 1014 -#define IDC_F 1015 -#define IDC_PLUSMINUS 1020 -#define IDC_DECPOINT 1021 -#define IDC_PERCENT 1022 -#define IDC_SQRT 1023 -#define IDC_PI 1024 -#define IDC_S 1025 -#define IDC_SUM 1026 -#define IDC_AVE 1027 -#define IDC_STA 1028 -#define IDC_DAT 1029 -#define ID_BLUE_FINISH 1029 +#define IDM_COPY 1001 +#define IDM_PASTE 1002 +#define IDM_MODE_STANDARD 1003 +#define IDM_MODE_SCIENTIFIC 1004 +#define IDM_DIGIT_GROUPING 1005 +#define IDM_HELP_TOPICS 1006 +#define IDM_ABOUT 1007 +#define IDM_SEPARATOR1 1008 +#define IDM_SEPARATOR2 1009 +#define IDM_SEPARATOR3 1010 +#define IDM_WHATS_THIS 1011 -#define ID_RED_START 1036 -#define IDC_PLUS 1036 -#define IDC_MINUS 1037 -#define IDC_MULTIPLY 1038 -#define IDC_DIVIDE 1039 -#define IDC_MPLUS 1040 -#define IDC_MS 1041 -#define IDC_MR 1042 -#define IDC_MC 1043 -#define IDC_EQUALS 1046 -#define IDC_LSH 1047 -#define IDC_OR 1048 -#define IDC_MOD 1049 -#define IDC_CLEAR 1050 -#define IDC_CE 1051 -#define IDC_BSPACE 1052 -#define IDC_INT 1053 -#define IDC_NOT 1054 -#define IDC_XOR 1055 -#define IDC_AND 1056 -#define ID_RED_FINISH 1056 +/* strings */ -#define ID_PURPLE_START 1057 -#define IDC_COS 1058 -#define IDC_SIN 1059 -#define IDC_DMS 1060 -#define IDC_FE 1061 -#define IDC_CUBE 1062 -#define IDC_POWER 1063 -#define IDC_EXP 1064 -#define IDC_OPENBKT 1065 -#define IDC_BANG 1066 -#define IDC_LOG 1067 -#define IDC_LN 1068 -#define IDC_CLOSEBK 1069 -#define IDC_TAN 1070 -#define IDC_SQUARE 1071 -#define IDC_INVERT 1072 -#define ID_PURPLE_FINISH 1072 +#define IDS_APPNAME 1100 -#define IDC_INV 1078 -#define IDC_HYP 1079 -#define IDC_HEX 1080 -#define IDC_DEC 1081 -#define IDC_OCT 1082 -#define IDC_BIN 1083 -#define IDC_DEGREES 1084 -#define IDC_RADIANS 1085 -#define IDC_GRADS 1086 -#define IDC_RESULT 1087 +#define IDS_BTN_BACKSPACE 1101 +#define IDS_BTN_CLEAR_ENTRY 1102 +#define IDS_BTN_CLEAR_ALL 1103 +#define IDS_BTN_MEM_CLEAR 1104 +#define IDS_BTN_MEM_RECALL 1105 +#define IDS_BTN_MEM_STORE 1106 +#define IDS_BTN_MEM_PLUS 1107 +#define IDS_BTN_MEM_STATUS_M 1108 +#define IDS_BTN_SQRT 1109 -#define IDC_MEMTEXT 1090 -#define IDC_UNITS 1091 -#define IDC_BASE 1092 -#define IDC_INVHYP 1093 -#define IDC_BKTTEXT 1094 +#define IDS_ERR_INVALID_INPUT 1120 +#define IDS_ERR_DIVIDE_BY_ZERO 1121 +#define IDS_ERR_UNDEFINED 1122 -#define ID_VIEW_STANDARD 40003 -#define ID_VIEW_SCIENTIFIC 40004 -#define ID_VIEW_DIGIT_GROUPING 40005 -#define ID_VIEW_HEX 40006 -#define ID_VIEW_DECIMAL 40007 -#define ID_VIEW_OCTAL 40008 -#define ID_VIEW_BINARY 40009 -#define ID_VIEW_DEGREES 40010 -#define ID_VIEW_RADIANS 40011 -#define ID_VIEW_GRADS 40012 -#define ID_HELP_TOPICS 40013 -#define ID_HELP_ABOUT 40014 +#define IDS_COPYRIGHT1 1130 +#define IDS_COPYRIGHT2 1131 +#define IDS_COPYRIGHT3 1132 +#define IDS_COPYRIGHT4 1133 +#define IDS_COPYRIGHT5 1134 +/* keys */ -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 109 -#define _APS_NEXT_COMMAND_VALUE 40015 -#define _APS_NEXT_CONTROL_VALUE 1095 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif +#define IDV_HELP 103 + +/* stats dialog */ + +#define ID_STATS_RET 3000 +#define ID_STATS_LOAD 3001 +#define ID_STATS_CD 3002 +#define ID_STATS_CAD 3003 diff --git a/rosapps/calc/rsrc.rc b/rosapps/calc/rsrc.rc new file mode 100644 index 00000000000..53f73bfffb5 --- /dev/null +++ b/rosapps/calc/rsrc.rc @@ -0,0 +1,33 @@ +/* + * WineCalc (rsrc.rc) + * + * Copyright 2003 James Briggs + * + * 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 <windows.h> +#include "resource.h" + +#include "En.rc" +#include "Es.rc" +#include "Fr.rc" +#include "It.rc" +#include "Nl.rc" +#include "Pt.rc" +#include "Ru.rc" +#include "Si.rc" + +LANGUAGE LANG_NEUTRAL,SUBLANG_NEUTRAL diff --git a/rosapps/calc/settings.c b/rosapps/calc/settings.c deleted file mode 100644 index 2827643336b..00000000000 --- a/rosapps/calc/settings.c +++ /dev/null @@ -1,115 +0,0 @@ -/* - * ReactOS calc - * - * settings.c - * - * Copyright (C) 2002 Robert Dickenson <robd@reactos.org> - * - * 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. - */ - -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers -#include <windows.h> -#include <tchar.h> -#include <assert.h> -#define ASSERT assert - -#include "main.h" -#include "settings.h" - - -BOOL CheckResult(LONG error) -{ - if (error != ERROR_SUCCESS) { - PTSTR msg; - if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, - 0, error, MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), (PTSTR)&msg, 0, NULL)) - MessageBox(NULL, msg, szTitle, MB_ICONERROR | MB_OK); - else - MessageBox(NULL, _T("Error"), szTitle, MB_ICONERROR | MB_OK); - LocalFree(msg); - return FALSE; - } - return TRUE; -} - -static BOOL CreateRegistryPath(LPTSTR szRegPath, int nMaxLen) -{ - LPTSTR pRegPath = szRegPath; - - // Initialise registry path string from application PATH and KEY resources - int nLength = LoadString(hInst, IDS_APP_REG_PATH, szRegPath, nMaxLen); - nLength += LoadString(hInst, IDS_APP_REG_KEY, szRegPath + nLength, nMaxLen - nLength); - ASSERT(nLength < (nMaxLen - 1)); - szRegPath[nLength] = _T('\\'); - - // walk the registry path string creating the tree if required - while ((pRegPath = _tcschr(pRegPath, _T('\\')))) { - LONG result; - HKEY hKey = NULL; - *pRegPath = _T('\0'); - // Open (or create) the key - result = RegCreateKeyEx(HKEY_CURRENT_USER, szRegPath, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL); - if (!CheckResult(result)) return FALSE; - RegCloseKey(hKey); - *pRegPath = _T('\\'); - pRegPath = pRegPath + 1; - } - szRegPath[nLength] = _T('\0'); - return TRUE; -} - -void LoadSettings(void) -{ - TCHAR szRegPath[MAX_LOADSTRING]; - - HKEY hKey; - DWORD dwSize; - LONG result; - - if (!CreateRegistryPath(szRegPath, MAX_LOADSTRING)) return; - - // Open the key - result = RegOpenKeyEx(HKEY_CURRENT_USER, szRegPath, 0, KEY_READ, &hKey); - if (!CheckResult(result)) return; - - // Read the settings - dwSize = sizeof(CALC_TYPES); - result = RegQueryValueEx(hKey, _T("Preferences"), NULL, NULL, (LPBYTE)&CalcType, &dwSize); - - // Close the key - RegCloseKey(hKey); -} - -void SaveSettings(void) -{ - TCHAR szRegPath[MAX_LOADSTRING]; - HKEY hKey = NULL; - LONG result; - - if (!CreateRegistryPath(szRegPath, MAX_LOADSTRING)) return; - - // Open the key - result = RegOpenKeyEx(HKEY_CURRENT_USER, szRegPath, 0, KEY_WRITE, &hKey); - if (!CheckResult(result)) return; - - // Save the settings - result = RegSetValueEx(hKey, _T("Preferences"), 0, REG_DWORD, (LPBYTE)&CalcType, sizeof(CALC_TYPES)); - if (!CheckResult(result)) goto abort; - -abort: - // Close the key - RegCloseKey(hKey); -} diff --git a/rosapps/calc/settings.h b/rosapps/calc/settings.h deleted file mode 100644 index c062130c425..00000000000 --- a/rosapps/calc/settings.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * ReactOS calc - * - * settings.h - * - * Copyright (C) 2002 Robert Dickenson <robd@reactos.org> - * - * 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. - */ - -#ifndef __SETTINGS_H__ -#define __SETTINGS_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - - -BOOL CheckResult(LONG error); -void LoadSettings(void); -void SaveSettings(void); - - -#ifdef __cplusplus -}; -#endif - -#endif // __SETTINGS_H__ diff --git a/rosapps/calc/stats.c b/rosapps/calc/stats.c new file mode 100644 index 00000000000..cb6cb60c97e --- /dev/null +++ b/rosapps/calc/stats.c @@ -0,0 +1,131 @@ +/* + * WineCalc (stats.c) + * + * Copyright 2003 James Briggs + * + * 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 <stdio.h> // sprintf + +#include <windows.h> + +#include "stats.h" +#include "resource.h" +#include "winecalc.h" + + HWND hWndListBox; + + extern CALC calc; + extern HWND hWndDlgStats; + +BOOL CALLBACK StatsDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + HDC hdc; + PAINTSTRUCT ps; + + + switch( uMsg ) { + + case WM_INITDIALOG: + hWndListBox = CreateWindow( + "LISTBOX", // pointer to registered class name + "Listbox", // pointer to window name + WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_BORDER | LBS_NOINTEGRALHEIGHT, // window style + 6, // horizontal position of window + 6, // vertical position of window + 208, // window width + 66, // window height + hDlg, // handle to parent or owner window + NULL, // handle to menu or child-window identifier + NULL, // handle to application instance + NULL // pointer to window-creation data + ); + + ShowWindow(hWndListBox, SW_SHOW); + + SendMessage (hWndListBox, WM_SETFONT, (UINT)GetStockObject(DEFAULT_GUI_FONT), TRUE); + + // SetFocus(hWndDlgStats); + + return TRUE; + + case WM_COMMAND: + switch( LOWORD( wParam ) ) { + + case ID_STATS_RET: + SetFocus(GetParent(hDlg)); + return 0; + + case ID_STATS_LOAD: + { + int i; + + i = SendMessage(hWndListBox, LB_GETCURSEL, 0, 0); + SendMessage(hWndListBox, LB_GETTEXT, i, (LPARAM)calc.buffer); + calc_buffer_display(&calc); + } + return 0; + + case ID_STATS_CD: + { + int i; + + i = SendMessage(hWndListBox, LB_GETCURSEL, 0, 0); + SendMessage(hWndListBox, LB_DELETESTRING, i, 0); + InvalidateRect(hDlg,NULL,TRUE); + UpdateWindow(hDlg); + } + return 0; + + case ID_STATS_CAD: + SendMessage(hWndListBox, LB_RESETCONTENT, 0, 0); + InvalidateRect(hDlg,NULL,TRUE); + UpdateWindow(hDlg); + return 0; + } + break; + + case WM_PAINT: + { + char s[CALC_BUF_SIZE]; + int lb_count; + HFONT hFont; + HFONT hFontOrg; + + hdc = BeginPaint( hDlg, &ps ); + hFont = GetStockObject(DEFAULT_GUI_FONT); + hFontOrg = SelectObject(hdc, hFont); + + lb_count = SendMessage(hWndListBox, LB_GETCOUNT, 0, 0); + sprintf(s, "n=%d", lb_count); + + SetBkMode(hdc, TRANSPARENT); + TextOut(hdc, 98, 121, s, strlen(s)); + SelectObject(hdc, hFontOrg); + EndPaint( hDlg, &ps ); + + return 0; + } + case WM_CLOSE: + hWndDlgStats = 0; // invalidate stats dialog + SendMessage(GetParent(hDlg), WM_CHAR, '\x13', 1); // disable stats related calculator buttons + DestroyWindow( hDlg ); + + return 0; + } + return FALSE; +} + diff --git a/rosapps/calc/stats.h b/rosapps/calc/stats.h new file mode 100644 index 00000000000..8ce6135ba39 --- /dev/null +++ b/rosapps/calc/stats.h @@ -0,0 +1,24 @@ +/* + * WineCalc (stats.h) + * + * Copyright 2003 James Briggs + * + * 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 + */ + +BOOL CALLBACK StatsDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); + + + diff --git a/rosapps/calc/winecalc.c b/rosapps/calc/winecalc.c new file mode 100644 index 00000000000..cc046a59fc9 --- /dev/null +++ b/rosapps/calc/winecalc.c @@ -0,0 +1,3785 @@ +/* + * WineCalc (winecalc.c) + * + * Copyright 2003 James Briggs + * + * 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 <stdio.h> // sprintf +#include <math.h> + +#include <windows.h> +// #include <commctrl.h> + +#include "winecalc.h" +#include "dialog.h" +#include "stats.h" +#include "resource.h" + +// lame M$ math library doesn't support hyp functions +//#ifdef _MSC_VER +#define atanh(X) atan(X) +#define asinh(X) asin(X) +#define acosh(X) acos(X) +//#endif + +// How winecalc works +// +// 1. In the original calculator, numbers are "extended precision". +// We emulate with calcfloat (calcfloat floating point) for now. +// Note that recent M$ compilers 5.0 and later do not implement double float, +// and do not support 80-bit numbers. Max width is 64-bits. +// +// 2. 4 temp areas: +// +// i) current edit buffer value for keystrokes +// ii) computed value area for last computation +// iii) memory area for MR, MC, MS, M+ +// iv) formatted display buffer +// +// 3. Memory Store works off current buffer, not value +// +// 4. display limit is 32 numbers plus 10 commas plus one period = 43 characters +// +// 5. original calc is better called SciCalc and saves settings in win.ini: +// +// [SciCalc] +// layout=1 (0 = scientific mode, 1 = basic mode) +// UseSep=1 (0 = no digits separator, 1 = enable digits separator) +// +// 6. Window Menus +// +// The menus know their own states, so we don't need to track them +// When switching to Standard Calculator Mode, number base is changed to Decimal and Trig Mode to Degrees, +// but Word Size Mode is unchanged +// +// 7. It would be nice to add command line parsing for batch files +// + +// various display error messages + +static char err_invalid [CALC_BUF_SIZE]; +static char err_divide_by_zero [CALC_BUF_SIZE]; +static char err_undefined [CALC_BUF_SIZE]; + +// calculator state is kept here + +CALC calc; + +static RECT rFiller; + +static int keys[CALC_NS_COUNT]['f'+1]; // note: sparse array + +// map from button press to calc[] index +// 0, ... 9, A, B, C, D, E, F,FE,DMS,SIN,COS,TAN,EXP, PI +static const int h[] = { + 0, 0, 33, 34, 21, 22, 23, 10, 11, 12, 54, 55, 56 ,57, 58 ,59, 6, 17, 28, 39, 50, 18, 53 }; + +// enable status of various buttons on sci mode depending on number base +static const int btn_toggle[CALC_NS_COUNT][TOGGLE_COUNT] = +// 0, ... 9, A, B, C, D, E, F,FE,DMS,SIN,COS,TAN,EXP,PI +{ + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0 } +}; + +static int hms[] = { 64, 65, 66 }; +static int hws[] = { 69, 70, 71, 72 }; + +static int sta[] = { 16, 27, 38, 49 }; + +static HMENU menus[3]; + +static char appname[40]; + +static int debug; + +int parse(int wParam, int lParam); + +HWND hWndDlgStats; + +extern HWND hWndListBox; + +HINSTANCE hInstance; + +int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdline, int cmdshow ) +{ + MSG msg; + WNDCLASS wc; + HWND hWnd; + HACCEL haccel; + + char s[CALC_BUF_SIZE]; + int r; + + hInstance = hInst; + + r = GetProfileString("SciCalc", + "layout", + "0", + s, + CALC_BUF_SIZE + ); + + calc.sciMode = atoi(s); + + if (calc.sciMode != 0 && + calc.sciMode != 1) + calc.sciMode = 1; // Standard Mode + + r = GetProfileString("SciCalc", + "UseSep", + "0", + s, + CALC_BUF_SIZE + ); + + calc.digitGrouping = atoi(s); + + if (calc.digitGrouping != 0 && + calc.digitGrouping != 1) + calc.digitGrouping = 1; + + calc.new = 1; // initialize struct values + + if (!LoadString( hInst, IDS_APPNAME, appname, sizeof(appname))) + exit(1); + if (!LoadString( hInst, IDS_ERR_INVALID_INPUT, err_invalid, sizeof(err_invalid))) + exit(1); + if (!LoadString( hInst, IDS_ERR_DIVIDE_BY_ZERO, err_divide_by_zero, sizeof(err_divide_by_zero))) + exit(1); + if (!LoadString( hInst, IDS_ERR_UNDEFINED, err_undefined, sizeof(err_undefined))) + exit(1); + + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.lpfnWndProc = MainProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = hInst; + wc.hIcon = LoadIcon( hInst, appname ); + wc.hCursor = LoadCursor( NULL, IDI_APPLICATION ); + wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1); + wc.lpszMenuName = NULL; + wc.lpszClassName = appname; + + if (!RegisterClass(&wc)) exit(1); + + hWnd = CreateWindow( appname, + appname, + WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX, + CW_USEDEFAULT, + CW_USEDEFAULT, + calc.sciMode ? CALC_STANDARD_WIDTH : CALC_SCIENTIFIC_WIDTH, + calc.sciMode ? CALC_STANDARD_HEIGHT : CALC_SCIENTIFIC_HEIGHT, + NULL, + NULL, + hInst, + NULL ); + + if (!hWnd) + exit(1); + + ShowWindow( hWnd, cmdshow ); + UpdateWindow( hWnd ); + + if (!(haccel = LoadAccelerators(hInst, "MAIN_MENU"))) + exit(1); + + while( GetMessage(&msg, NULL, 0, 0) ) { + if (hWndDlgStats == 0 || !IsDialogMessage(hWndDlgStats, &msg)) { + if (!TranslateAccelerator( hWnd, haccel, &msg )) { + TranslateMessage( &msg ); + DispatchMessage( &msg ); + } + } + } + + return msg.wParam; +} + +LRESULT WINAPI MainProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + HDC hdc; + PAINTSTRUCT ps; + + switch (msg) { + + case WM_CREATE: + calc.hInst = ((LPCREATESTRUCT) lParam)->hInstance; + calc.hWnd = hWnd; + + InitLuts(); + InitCalc( &calc ); + InitMenus(calc.hInst); + + if (calc.sciMode) + SetMenu(hWnd, menus[MENU_STD]); + else + SetMenu(hWnd, menus[MENU_SCIMS]); + + calc_buffer_display(&calc); + + return 0; + + case WM_PAINT: + { + HDC hMemDC; + + hdc = BeginPaint( hWnd, &ps ); + hMemDC = CreateCompatibleDC( hdc ); + + DrawCalc( hdc, hMemDC, &ps, &calc ); + + DeleteDC( hMemDC ); + EndPaint( hWnd, &ps ); + + return 0; + } + + case WM_MOVE: + calc.pos.x = (unsigned) LOWORD(lParam); + calc.pos.y = (unsigned) HIWORD(lParam); + return 0; + + case WM_DESTROY: + { + int r; + char s[CALC_BUF_SIZE]; + + sprintf(s, "%d", calc.sciMode); + r = WriteProfileString("SciCalc", "layout", s); + + sprintf(s, "%d", calc.digitGrouping); + r = WriteProfileString("SciCalc", "UseSep", s); + } + + DestroyCalc( &calc ); + PostQuitMessage( 0 ); + return 0; + + case WM_KEYDOWN: + switch (wParam) { + + case VK_F1: + calc.next = 1; + MessageBox(hWnd, "No Help Available", "Windows Help", MB_OK); + return 0; + + case VK_F2: // DWORD + + calc.next = 1; + if (!calc.sciMode) { + if (calc.numBase == NBASE_DECIMAL) + SendMessage(hWnd, WM_COMMAND, ID_CALC_MS_DEGREES, lParam); + else + SendMessage(hWnd, WM_COMMAND, ID_CALC_WS_DWORD, lParam); + } + return 0; + + case VK_F3: // WORD + + calc.next = 1; + if (!calc.sciMode) { + if (calc.numBase == NBASE_DECIMAL) + SendMessage(hWnd, WM_COMMAND, ID_CALC_MS_RADIANS, lParam); + else + SendMessage(hWnd, WM_COMMAND, ID_CALC_WS_WORD, lParam); + } + return 0; + + case VK_F4: // Byte + + // Grad + calc.next = 1; + if (!calc.sciMode) { + if (calc.numBase == NBASE_DECIMAL) + SendMessage(hWnd, WM_COMMAND, ID_CALC_MS_GRADS, lParam); + else + SendMessage(hWnd, WM_COMMAND, ID_CALC_WS_BYTE, lParam); + } + return 0; + + case VK_F5: // Hex + + calc.next = 1; + if (!calc.sciMode) + SendMessage(hWnd, WM_COMMAND, ID_CALC_NS_HEX, lParam); + return 0; + + case VK_F6: // Decimal + + calc.next = 1; + if (!calc.sciMode) + SendMessage(hWnd, WM_COMMAND, ID_CALC_NS_DEC, lParam); + return 0; + + case VK_F7: // Octal + + calc.next = 1; + if (!calc.sciMode) + SendMessage(hWnd, WM_COMMAND, ID_CALC_NS_OCT, lParam); + return 0; + + case VK_F8: // Binary + + calc.next = 1; + if (!calc.sciMode) + SendMessage(hWnd, WM_COMMAND, ID_CALC_NS_BIN, lParam); + return 0; + + case VK_F12: // QWORD + + calc.next = 1; + if (!calc.sciMode) + SendMessage(hWnd, WM_COMMAND, ID_CALC_WS_QWORD, lParam); + return 0; + + case VK_F9: // +/- + + if (!calc.sciMode) + SendMessage(hWnd, WM_CHAR, 'Z', lParam); + return 0; + + case VK_INSERT: // Dat + calc.next = 1; + SendMessage(hWndListBox, LB_INSERTSTRING, -1, (LPARAM)calc.buffer); + InvalidateRect(hWndDlgStats, NULL, TRUE); // update list count at bottom edge of dialog + UpdateWindow(hWndDlgStats); + return 0; + + case VK_DELETE: + + calc.next = 1; + calc.buffer[0] = '\0'; + calc_buffer_display(&calc); + return 0; + + default: + break; + } + + return 0; + + case WM_CHAR: + if (debug) + show_debug(&calc, "Start WM_CHAR", wParam, lParam); + + switch (wParam) { + + case '\x13': // Ctrl+S Sta Statistics + + if (hWndDlgStats) { // Statistics Box already displayed, focus but don't create another one + // SetFocus(hWndDlgStats); + // SendMessage(hWndDlgStats, WM_SETFOCUS, 0, 0); + } + else { + int i; + + if (lParam == 1) { + for (i=0;i<4;i++) + EnableWindow((HWND)calc.cb[sta[i]].hBtn, FALSE); + } + else { + for (i=0;i<4;i++) + EnableWindow((HWND)calc.cb[sta[i]].hBtn, TRUE); + + hWndDlgStats = CreateDialog( // modeless dialog + calc.hInst, // handle to application instance + "DLG_STATS", // identifies dialog box template name + hWnd, // handle to owner window + StatsDlgProc); // pointer to dialog box procedure + + if (!hWndDlgStats) + exit(1); + + SendMessage(hWndDlgStats, WM_SETFOCUS, 0, 0); + } + } + + break; + + case '\x01': // Ctrl+A Ave Statistics + case '\x04': // Ctrl+D s Standard Deviation Statistics + case '\x14': // Ctrl+T Sum Statistics + { + int i; + int n; + + char s[CALC_BUF_SIZE]; + double val = 0L; + double avg = 0L; + double total = 0L; + double x[1024]; + + // This is all lame. Here we are querying the list control for items and calculating the total. + // We should have an array of intermediate results to work with to avoid roundoff errors, etc. + + n = SendMessage(hWndListBox, LB_GETCOUNT, 0, 0); + + for (i=0;i<n;i++) { + SendMessage(hWndListBox, LB_GETTEXT, i, (LPARAM)s); + val = calc_atof(s,calc.numBase); + total += val; + x[i] = val; + } + + if (LOWORD(wParam) != '\x14') // not sum only + avg = total / n; + + if (LOWORD(wParam == '\x04')) { // standard deviation is sqrt(sum( xbar - x )^2 / (n-1)) + val = 0L; + + for (i=0;i<n;i++) + val += pow(x[i] - avg, 2); + + if (calc.invMode) + total = sqrt(val / n); // complete population + else + total = sqrt(val / (n - 1)); // sample of population + } + + if (LOWORD(wParam) == '\x01') // average or mean + total = avg; + + calc_ftoa(&calc, total, s); + strcpy(calc.buffer, s); + calc_buffer_display(&calc); + } + + break; + + case '\x03': // Ctrl+C Copy + { + int i; + int len; + char *s; + HGLOBAL hGlobalMemory; + PSTR pGlobalMemory; + + if (!(len = strlen(calc.display))) + return 0; + + if (!(hGlobalMemory = GlobalAlloc(GHND, len + 1))) + return 0; + + if (!(pGlobalMemory = GlobalLock(hGlobalMemory))) + return 0; + + if (!(s = calc.display)) + return 0; + + for (i = 0; i < len; i++) + *pGlobalMemory++ = *s++; + + GlobalUnlock(hGlobalMemory); // call GetLastError() for exception handling + + if (!OpenClipboard(hWnd)) + return 0; + + if (!EmptyClipboard()) + return 0; + + if (!SetClipboardData(CF_TEXT, hGlobalMemory)) + return 0; + + if (!CloseClipboard()) + return 0; + } + break; + + case '\x16': // Ctrl+V Paste + { + char *s; + int c; + int cmd = 0; + int size = 0; + int i = 0; + HGLOBAL hGlobalMemory; + PSTR pGlobalMemory; + + if (IsClipboardFormatAvailable(CF_TEXT)) { + if (!OpenClipboard(hWnd)) + return 0; + + if (!(hGlobalMemory = GetClipboardData(CF_TEXT))) + return 0; + + if (!(size = GlobalSize(hGlobalMemory))) + return 0; + + if (!(s = (char *)malloc(size))) + return 0; + + if (!(pGlobalMemory = GlobalLock(hGlobalMemory))) + return 0; + + strcpy(s, pGlobalMemory); + + GlobalUnlock(hGlobalMemory); + + if (!CloseClipboard()) + return 0; + + // calc paste protocol + // + // :c clear memory WM_CHAR, 0x0c + // :e enable scientific notation WM_CHAR, 'v' + // :m store display in memory WM_CHAR, 0x0d + // :p add display to memory WM_CHAR, 0x10 + // :q clear current calculation WM_CHAR, '\x1b' + // :r read memory into display WM_CHAR, 0x12 + // \ Dat WM_CHAR, VK_INSERT + // + // parse the pasted data, validate and SendMessage it one character at a time. + // it would appear wincalc does it this way (slow), although very slow appearing on Wine. + + while ((c = *s++) && (i++ < size)) { + if (c == ':') { + cmd = 1; + } + else if (c == '\\') { + SendMessage(hWnd, WM_KEYDOWN, VK_INSERT, lParam); + } + else { + if (cmd) { + cmd = 0; + + switch(c) { + case 'c': // clear memory + + case 'C': + SendMessage(hWnd, WM_CHAR, 0x0c, lParam); + break; + case 'e': // enable scientific notation + + case 'E': + SendMessage(hWnd, WM_CHAR, 'v', lParam); + break; + case 'm': // store display in memory + + case 'M': + SendMessage(hWnd, WM_CHAR, 0x0d, NUMBER_OF_THE_BEAST); + break; + case 'p': // add display to memory + + case 'P': + SendMessage(hWnd, WM_CHAR, 0x10, lParam); + break; + case 'q': // clear current calculation + + case 'Q': + SendMessage(hWnd, WM_CHAR, '\x1b', lParam); + break; + case 'r': // read memory into display + + case 'R': + SendMessage(hWnd, WM_CHAR, 0x12, lParam); + break; + default: // just eat it but complain + + MessageBeep(0); + break; + } + } + else { + if ((calc.numBase == NBASE_HEX) && + ((c >= '0' && c <= '9') || + (c >= 'a' && c <= 'f') || + (c >= 'A' && c <= 'F'))) { + + SendMessage(hWnd, WM_CHAR, c, lParam); + } + else if ((calc.numBase == NBASE_DECIMAL) && + (c >= '0' && c <= '9')) { + SendMessage(hWnd, WM_CHAR, c, lParam); + } + else if ((calc.numBase == NBASE_OCTAL) && + (c >= '0' && c <= '7')) { + SendMessage(hWnd, WM_CHAR, c, lParam); + } + else if ((calc.numBase == NBASE_BINARY) && + (c == '0' || c == '1')) { + SendMessage(hWnd, WM_CHAR, c, lParam); + } + else if (c == '.' || c == ',' || + c == 'e' || c == 'E' || + c == '+' || c == '-') { + SendMessage(hWnd, WM_CHAR, c, lParam); + } + else if (c == ' ' || // eat harmless trash here + c == ';' || + c == ':') { + ; // noop + } + else { // extra spicy trash gets noticed + + MessageBeep(0); // uh, beeps can get annoying. maybe rate limit. + } + } + } + } + } + } + + break; + default: + { + int ret = parse(wParam, lParam); + } + } // switch WM_CHAR + + calc_buffer_display(&calc); + return 0; + + case WM_COMMAND: + switch(LOWORD(wParam)) { + + case IDM_COPY: + SendMessage(hWnd, WM_CHAR, '\x03', lParam); + return 0; + + case IDM_PASTE: + SendMessage(hWnd, WM_CHAR, '\x16', lParam); + return 0; + + case IDM_MODE_STANDARD: + if (!calc.sciMode) { + int i; + RECT lpRect; + + calc.sciMode = 1; + calc.trigMode = TRIGMODE_DEGREES; + calc.numBase = NBASE_DECIMAL; + + EnableWindow(hWnd, FALSE); + + + for (i=1;i<COUNT_MENUS;i++) { + if (calc.numBase != ID_CALC_NS_DEC) { + CheckMenuItem(menus[i], ID_CALC_NS_HEX, MF_UNCHECKED); + CheckMenuItem(menus[i], ID_CALC_NS_DEC, MF_CHECKED); + CheckMenuItem(menus[i], ID_CALC_NS_OCT, MF_UNCHECKED); + CheckMenuItem(menus[i], ID_CALC_NS_BIN, MF_UNCHECKED); + } + } + + for (i=1;i<COUNT_MENUS;i++) { + CheckMenuItem(menus[i], ID_CALC_MS_DEGREES, MF_CHECKED); + CheckMenuItem(menus[i], ID_CALC_MS_RADIANS, MF_UNCHECKED); + CheckMenuItem(menus[i], ID_CALC_MS_GRADS, MF_UNCHECKED); + } + + SetMenu(hWnd, menus[MENU_STD]); + + // SendMessage(hWnd, WM_SIZE, SIZE_RESTORED, CALC_STANDARD_WIDTH | (CALC_STANDARD_HEIGHT << 8)); + GetWindowRect(hWnd, &lpRect); + MoveWindow(hWnd, lpRect.left, lpRect.top, CALC_STANDARD_WIDTH, CALC_STANDARD_HEIGHT, TRUE); + DestroyCalc(&calc); + InitCalc(&calc); + + EnableWindow(hWnd, TRUE); + + } + return 0; + + case IDM_MODE_SCIENTIFIC: + if (calc.sciMode) { + RECT lpRect; + calc.sciMode = 0; + + EnableWindow(hWnd, FALSE); + + SetMenu(hWnd, menus[MENU_SCIMS]); + + GetWindowRect(hWnd, &lpRect); + MoveWindow(hWnd, lpRect.left, lpRect.top, CALC_SCIENTIFIC_WIDTH, CALC_SCIENTIFIC_HEIGHT, TRUE); + DestroyCalc(&calc); + InitCalc(&calc); + + if (calc.invMode) + SendMessage(calc.cb[67].hBtn, BM_SETCHECK, TRUE, 0); + + if (calc.hypMode) + SendMessage(calc.cb[68].hBtn, BM_SETCHECK, TRUE, 0); + + EnableWindow(hWnd, TRUE); + + } + return 0; + + case IDM_DIGIT_GROUPING: + { + int i; + int n; + + calc.digitGrouping = !calc.digitGrouping; + + n = (calc.digitGrouping ? MF_CHECKED : MF_UNCHECKED); + + for (i=0;i<COUNT_MENUS;i++) + CheckMenuItem(menus[i], IDM_DIGIT_GROUPING, n); + + calc_buffer_display(&calc); + } + return 0; + + case IDM_HELP_TOPICS: + MessageBox(hWnd, "No Help Available", "Windows Help", MB_OK); + return 0; + + case IDM_ABOUT: + DialogBox( calc.hInst, "DLG_ABOUT", hWnd, AboutDlgProc ); + return 0; + + case ID_CALC_NS_HEX: + case ID_CALC_NS_DEC: + case ID_CALC_NS_OCT: + case ID_CALC_NS_BIN: + { + int i; + int w = LOWORD(wParam); + + if (w == ID_CALC_NS_HEX) { + if (calc.numBase == NBASE_HEX) + return 0; + else + calc.numBase = NBASE_HEX; + } + else if (w == ID_CALC_NS_DEC) { + if (calc.numBase == NBASE_DECIMAL) + return 0; + else + calc.numBase = NBASE_DECIMAL; + } + else if (w == ID_CALC_NS_OCT) { + if (calc.numBase == NBASE_OCTAL) + return 0; + else + calc.numBase = NBASE_OCTAL; + } + else if (w == ID_CALC_NS_BIN) { + if (calc.numBase == NBASE_BINARY) + return 0; + else + calc.numBase = NBASE_BINARY; + } + + for (i=0;i<CALC_NS_COUNT;i++) + SendMessage(calc.cb[60+i].hBtn, BM_SETCHECK, w == (ID_CALC_NS_HEX + i) ? 1 : 0, 0); + + for (i=2;i<TOGGLE_COUNT;i++) { // skip 0 and 1, always valid + if (btn_toggle[w - ID_CALC_NS_HEX ][i]) { + if (!IsWindowEnabled((HWND)calc.cb[h[i]].hBtn)) + EnableWindow((HWND)calc.cb[h[i]].hBtn, TRUE); + + } + else { + if (IsWindowEnabled((HWND)calc.cb[h[i]].hBtn)) + EnableWindow((HWND)calc.cb[h[i]].hBtn, FALSE); + } + } + + if (w == ID_CALC_NS_DEC) { + for (i=0;i<CALC_WS_COUNT;i++) { + if (IsWindowEnabled((HWND)calc.cb[hws[i]].hBtn)) { + ShowWindow((HWND)calc.cb[hws[i]].hBtn, SW_HIDE); + EnableWindow((HWND)calc.cb[hws[i]].hBtn, FALSE); + } + } + for (i=0;i<CALC_MS_COUNT;i++) { + if (!IsWindowEnabled((HWND)calc.cb[hms[i]].hBtn)) { + ShowWindow((HWND)calc.cb[hms[i]].hBtn, SW_SHOWNORMAL); + EnableWindow((HWND)calc.cb[hms[i]].hBtn, TRUE); + } + } + } + else { + for (i=0;i<CALC_MS_COUNT;i++) { + if (IsWindowEnabled((HWND)calc.cb[hms[i]].hBtn)) { + ShowWindow((HWND)calc.cb[hms[i]].hBtn, SW_HIDE); + EnableWindow((HWND)calc.cb[hms[i]].hBtn, FALSE); + } + } + for (i=0;i<CALC_WS_COUNT;i++) { + if (!IsWindowEnabled((HWND)calc.cb[hws[i]].hBtn)) { + ShowWindow((HWND)calc.cb[hws[i]].hBtn, SW_SHOWNORMAL); + EnableWindow((HWND)calc.cb[hws[i]].hBtn, TRUE); + } + } + } + + CheckMenuItem(menus[i], ID_CALC_MS_DEGREES, MF_CHECKED); + + for (i=1;i<COUNT_MENUS;i++) { // skip the simple Standard calculator mode + CheckMenuItem(menus[i], ID_CALC_NS_HEX, (w == ID_CALC_NS_HEX ? MF_CHECKED : MF_UNCHECKED) ); + CheckMenuItem(menus[i], ID_CALC_NS_DEC, (w == ID_CALC_NS_DEC ? MF_CHECKED : MF_UNCHECKED) ); + CheckMenuItem(menus[i], ID_CALC_NS_OCT, (w == ID_CALC_NS_OCT ? MF_CHECKED : MF_UNCHECKED) ); + CheckMenuItem(menus[i], ID_CALC_NS_BIN, (w == ID_CALC_NS_BIN ? MF_CHECKED : MF_UNCHECKED) ); + } + + if (wParam == ID_CALC_NS_DEC) { + SetMenu(hWnd, menus[MENU_SCIMS]); + + } + else { + calc.displayMode = 0; + SetMenu(hWnd, menus[MENU_SCIWS]); + } + } + calc_buffer_display(&calc); + + break; + + case ID_CALC_MS_DEGREES: + case ID_CALC_MS_RADIANS: + case ID_CALC_MS_GRADS: + { + int i; + int w = LOWORD(wParam); + + if (w == ID_CALC_MS_DEGREES) + calc.trigMode = TRIGMODE_DEGREES; + else if (w == ID_CALC_MS_RADIANS) + calc.trigMode = TRIGMODE_RADIANS; + else if (w == ID_CALC_MS_GRADS) + calc.trigMode = TRIGMODE_GRADS; + else + return 0; + + for (i=0;i<CALC_MS_COUNT;i++) + SendMessage(calc.cb[64+i].hBtn, BM_SETCHECK, w == (ID_CALC_MS_DEGREES + i) ? 1 : 0, 0); + + for (i=1;i<COUNT_MENUS;i++) { // skip the simple Standard calculator mode + CheckMenuItem(menus[i], ID_CALC_MS_DEGREES, (wParam == ID_CALC_MS_DEGREES) ? MF_CHECKED : MF_UNCHECKED); + CheckMenuItem(menus[i], ID_CALC_MS_RADIANS, (wParam == ID_CALC_MS_RADIANS) ? MF_CHECKED : MF_UNCHECKED); + CheckMenuItem(menus[i], ID_CALC_MS_GRADS, (wParam == ID_CALC_MS_GRADS) ? MF_CHECKED : MF_UNCHECKED); + } + } + + SetFocus(hWnd); + return 0; + + case ID_CALC_WS_QWORD: + case ID_CALC_WS_DWORD: + case ID_CALC_WS_WORD: + case ID_CALC_WS_BYTE: + { + int i; + int w = LOWORD(wParam); + + calc.wordSize = w; + + for (i=0;i<CALC_WS_COUNT;i++) + SendMessage(calc.cb[69+i].hBtn, BM_SETCHECK, LOWORD(wParam) == (ID_CALC_WS_QWORD + i) ? 1 : 0, 0); + + for (i=1; i<COUNT_MENUS; i++) { // skip the simple Standard calculator mode + CheckMenuItem(menus[i], ID_CALC_WS_QWORD, (w == ID_CALC_WS_QWORD ? MF_CHECKED : MF_UNCHECKED) ); + CheckMenuItem(menus[i], ID_CALC_WS_DWORD, (w == ID_CALC_WS_DWORD ? MF_CHECKED : MF_UNCHECKED) ); + CheckMenuItem(menus[i], ID_CALC_WS_WORD, (w == ID_CALC_WS_WORD ? MF_CHECKED : MF_UNCHECKED) ); + CheckMenuItem(menus[i], ID_CALC_WS_BYTE, (w == ID_CALC_WS_BYTE ? MF_CHECKED : MF_UNCHECKED) ); + } + } + + SetFocus(hWnd); + return 0; + + case ID_CALC_CB_INV: + if (calc.invMode) + calc.invMode = 0; + else + calc.invMode = 1; + + SendMessage(calc.cb[67].hBtn, BM_SETCHECK, calc.invMode ? TRUE : FALSE, 0); + SetFocus(hWnd); + return 0; + + case ID_CALC_CB_HYP: + if (calc.hypMode) + calc.hypMode = 0; + else + calc.hypMode = 1; + + SendMessage(calc.cb[68].hBtn, BM_SETCHECK, calc.hypMode ? TRUE : FALSE, 0); + SetFocus(hWnd); + return 0; + + default: + if (HIWORD(wParam) == BN_CLICKED) { + + if (calc.err && + LOWORD(wParam) != ID_CALC_CLEAR_ENTRY && + LOWORD(wParam) != ID_CALC_CLEAR_ALL) { + + MessageBeep(0); + return 0; + } + else { + calc.err = 0; + } + + switch (LOWORD(wParam)) { + + case ID_CALC_ZERO: + case ID_CALC_ONE: + case ID_CALC_TWO: + case ID_CALC_THREE: + case ID_CALC_FOUR: + case ID_CALC_FIVE: + case ID_CALC_SIX: + case ID_CALC_SEVEN: + case ID_CALC_EIGHT: + case ID_CALC_NINE: + SendMessage(hWnd, WM_CHAR, LOWORD(wParam)+'0' , lParam); + break; + + case ID_CALC_A: + SendMessage(hWnd, WM_CHAR, 'a', lParam); + break; + + case ID_CALC_B: + SendMessage(hWnd, WM_CHAR, 'b', lParam); + break; + + case ID_CALC_C: + SendMessage(hWnd, WM_CHAR, 'c', lParam); + break; + + case ID_CALC_D: + SendMessage(hWnd, WM_CHAR, 'd', lParam); + break; + + case ID_CALC_E: + SendMessage(hWnd, WM_CHAR, 'e', lParam); + break; + + case ID_CALC_F: + SendMessage(hWnd, WM_CHAR, 'f', lParam); + break; + + case ID_CALC_DECIMAL: + SendMessage(hWnd, WM_CHAR, '.', lParam); + break; + + case ID_CALC_BACKSPACE: + SendMessage(hWnd, WM_CHAR, '\b', lParam); + break; + + case ID_CALC_CLEAR_ENTRY: + SendMessage(hWnd, WM_KEYDOWN, VK_DELETE , lParam); + break; + + case ID_CALC_CLEAR_ALL: + SendMessage(hWnd, WM_CHAR, '\x1b', lParam); + break; + + case ID_CALC_MEM_CLEAR: + SendMessage(hWnd, WM_CHAR, 0x0c, lParam); + break; + + case ID_CALC_MEM_RECALL: + SendMessage(hWnd, WM_CHAR, 0x12, lParam); + break; + + case ID_CALC_MEM_STORE: + SendMessage(hWnd, WM_CHAR, 0x0d, NUMBER_OF_THE_BEAST); // trying to tell between Return and Ctrl+M + break; + + case ID_CALC_MEM_PLUS: + SendMessage(hWnd, WM_CHAR, 0x10, lParam); + break; + + case ID_CALC_SQRT: + SendMessage(hWnd, WM_CHAR, '?', lParam); // this is not a wincalc keystroke + break; + + case ID_CALC_SQUARE: + SendMessage(hWnd, WM_CHAR, '@', lParam); + break; + + case ID_CALC_PI: + SendMessage(hWnd, WM_CHAR, 'p', lParam); + break; + + case ID_CALC_LN: + SendMessage(hWnd, WM_CHAR, 'n', lParam); + break; + + case ID_CALC_LOG10: + SendMessage(hWnd, WM_CHAR, 'l', lParam); + break; + + case ID_CALC_CUBE: + SendMessage(hWnd, WM_CHAR, '#', lParam); + break; + + case ID_CALC_POWER: + SendMessage(hWnd, WM_CHAR, 'y', lParam); + break; + + case ID_CALC_SIN: + SendMessage(hWnd, WM_CHAR, 's', lParam); + break; + + case ID_CALC_COS: + SendMessage(hWnd, WM_CHAR, 'o', lParam); + break; + + case ID_CALC_TAN: + SendMessage(hWnd, WM_CHAR, 't', lParam); + break; + + case ID_CALC_LSH: + SendMessage(hWnd, WM_CHAR, '<', lParam); + break; + + case ID_CALC_NOT: + SendMessage(hWnd, WM_CHAR, '~', lParam); + break; + + case ID_CALC_AND: + SendMessage(hWnd, WM_CHAR, '&', lParam); + break; + + case ID_CALC_OR: + SendMessage(hWnd, WM_CHAR, '|', lParam); + break; + + case ID_CALC_XOR: + SendMessage(hWnd, WM_CHAR, '^', lParam); + break; + + case ID_CALC_INT: + SendMessage(hWnd, WM_CHAR, ';', lParam); + break; + + case ID_CALC_FACTORIAL: + SendMessage(hWnd, WM_CHAR, '!', lParam); + break; + + case ID_CALC_RECIPROCAL: + SendMessage(hWnd, WM_CHAR, 'r', lParam); + break; + + case ID_CALC_SIGN: + SendMessage(hWnd, WM_KEYDOWN, VK_F9, lParam); + break; + + case ID_CALC_PLUS: + SendMessage(hWnd, WM_CHAR, '+', lParam); + break; + + case ID_CALC_MINUS: + SendMessage(hWnd, WM_CHAR, '-', lParam); + break; + + case ID_CALC_MULTIPLY: + SendMessage(hWnd, WM_CHAR, '*', lParam); + break; + + case ID_CALC_DIVIDE: + SendMessage(hWnd, WM_CHAR, '/', lParam); + break; + + case ID_CALC_EQUALS: + SendMessage(hWnd, WM_CHAR, '=', lParam); + break; + + case ID_CALC_PERCENT: + SendMessage(hWnd, WM_CHAR, '%', lParam); + break; + + case ID_CALC_EXP: + SendMessage(hWnd, WM_CHAR, 'x', lParam); + break; + + case ID_CALC_FE: + SendMessage(hWnd, WM_CHAR, 'v', lParam); + break; + + case ID_CALC_LEFTPAREN: + SendMessage(hWnd, WM_CHAR, '(', lParam); + break; + + case ID_CALC_RIGHTPAREN: + SendMessage(hWnd, WM_CHAR, ')', lParam); + break; + + case ID_CALC_MOD: + SendMessage(hWnd, WM_CHAR, '%', lParam); + break; + + case ID_CALC_DAT: + SendMessage(hWnd, WM_KEYDOWN, VK_INSERT, lParam); + break; + + case ID_CALC_AVE: + SendMessage(hWnd, WM_CHAR, '\x01', lParam); // Ctrl+A + break; + + case ID_CALC_S: + SendMessage(hWnd, WM_CHAR, '\x04', lParam); // Ctrl+D + break; + + case ID_CALC_STA: + SendMessage(hWnd, WM_CHAR, '\x13', lParam); // Ctrl+S + break; + + case ID_CALC_SUM: + SendMessage(hWnd, WM_CHAR, '\x14', lParam); // Ctrl+T + break; + + case ID_CALC_DMS: + SendMessage(hWnd, WM_CHAR, 'm', lParam); + break; + + default: + break; + + } // button message switch + + + SetFocus(hWnd); + + if (debug) + show_debug(&calc, "After WM_CHAR", wParam, lParam); + + return 0; + + } // if BN_CLICKED + } // WM_COMMAND switch + } // Main Message switch + return( DefWindowProc( hWnd, msg, wParam, lParam )); +} // MainProc + +void InitLuts(void) +{ + int i; + + // initialize keys lut for validating keystrokes in various number bases + + for (i='0';i<='9';i++) { + keys[NBASE_HEX][i] = 1; + keys[NBASE_DECIMAL][i] = 1; + + if (i <= '7') + keys[NBASE_OCTAL][i] = 1; + + if (i <= '1') + keys[NBASE_BINARY][i] = 1; + } + + for (i='a';i<='f';i++) + keys[NBASE_HEX][i] = 1; + + for (i='A';i<='F';i++) + keys[NBASE_HEX][i] = 1; +} + +void InitMenus(HINSTANCE hInst) +{ + if (!(menus[MENU_STD] = LoadMenu(hInst,"MAIN_MENU"))) + exit(1); + + if (!(menus[MENU_SCIMS] = LoadMenu(hInst,"SCIMS_MENU"))) + exit(1); + + if (!(menus[MENU_SCIWS] = LoadMenu(hInst,"SCIWS_MENU"))) + exit(1); + + CheckMenuItem(menus[MENU_STD], IDM_MODE_STANDARD, MF_CHECKED); + if (calc.digitGrouping) { + CheckMenuItem(menus[MENU_STD], IDM_DIGIT_GROUPING, MF_CHECKED); + CheckMenuItem(menus[MENU_SCIMS], IDM_DIGIT_GROUPING, MF_CHECKED); + CheckMenuItem(menus[MENU_SCIWS], IDM_DIGIT_GROUPING, MF_CHECKED); + } + + calc_setmenuitem_radio(menus[MENU_STD], IDM_MODE_STANDARD); + calc_setmenuitem_radio(menus[MENU_STD], IDM_MODE_SCIENTIFIC); + + + calc_setmenuitem_radio(menus[MENU_SCIMS], IDM_MODE_STANDARD); + calc_setmenuitem_radio(menus[MENU_SCIMS], IDM_MODE_SCIENTIFIC); + + calc_setmenuitem_radio(menus[MENU_SCIMS], ID_CALC_NS_HEX); + calc_setmenuitem_radio(menus[MENU_SCIMS], ID_CALC_NS_DEC); + calc_setmenuitem_radio(menus[MENU_SCIMS], ID_CALC_NS_OCT); + calc_setmenuitem_radio(menus[MENU_SCIMS], ID_CALC_NS_BIN); + + calc_setmenuitem_radio(menus[MENU_SCIMS], ID_CALC_MS_DEGREES); + calc_setmenuitem_radio(menus[MENU_SCIMS], ID_CALC_MS_RADIANS); + calc_setmenuitem_radio(menus[MENU_SCIMS], ID_CALC_MS_GRADS); + CheckMenuItem(menus[MENU_SCIMS], IDM_MODE_SCIENTIFIC, MF_CHECKED); + CheckMenuItem(menus[MENU_SCIMS], ID_CALC_NS_DEC, MF_CHECKED); + CheckMenuItem(menus[MENU_SCIMS], ID_CALC_MS_DEGREES, MF_CHECKED); + + + calc_setmenuitem_radio(menus[MENU_SCIWS], IDM_MODE_STANDARD); + calc_setmenuitem_radio(menus[MENU_SCIWS], IDM_MODE_SCIENTIFIC); + + calc_setmenuitem_radio(menus[MENU_SCIWS], ID_CALC_NS_HEX); + calc_setmenuitem_radio(menus[MENU_SCIWS], ID_CALC_NS_DEC); + calc_setmenuitem_radio(menus[MENU_SCIWS], ID_CALC_NS_OCT); + calc_setmenuitem_radio(menus[MENU_SCIWS], ID_CALC_NS_BIN); + + calc_setmenuitem_radio(menus[MENU_SCIWS], ID_CALC_WS_QWORD); + calc_setmenuitem_radio(menus[MENU_SCIWS], ID_CALC_WS_DWORD); + calc_setmenuitem_radio(menus[MENU_SCIWS], ID_CALC_WS_WORD); + calc_setmenuitem_radio(menus[MENU_SCIWS], ID_CALC_WS_BYTE); + CheckMenuItem(menus[MENU_SCIWS], IDM_MODE_SCIENTIFIC, MF_CHECKED); + CheckMenuItem(menus[MENU_SCIWS], ID_CALC_NS_DEC, MF_CHECKED); + CheckMenuItem(menus[MENU_SCIWS], ID_CALC_WS_QWORD, MF_CHECKED); +} + +void InitCalc (CALC *calc) +{ + int n; + int skipx; + int skipy; + int top_button; + + HINSTANCE hInst = calc->hInst; + HFONT hFont = GetStockObject(DEFAULT_GUI_FONT); + + calc->trigMode = TRIGMODE_DEGREES; + calc->numBase = NBASE_DECIMAL; + calc->init = 1; + + if (calc->new) { + calc->new = 0; + calc->value = 0; + calc->memory = 0; + calc->displayMode = 0; + calc->buffer[0] = '\0'; + strcpy(calc->display, "0."); + + calc->err = 0; + calc->next = '\0'; + + calc->wordSize = WORDSIZE_QWORD; + calc->invMode = 0; + calc->hypMode = 0; + } + + if (calc->sciMode) { + calc->numButtons = CALC_BUTTONS_STANDARD; + + // Row 1 (top) + + skipx = MARGIN_LEFT; + skipy = CALC_STANDARD_MARGIN_TOP + CALC_EDIT_HEIGHT; + + calc->cb[0].id = 0; + strcpy(calc->cb[0].label,"FILLER"); + calc->cb[0].color = CALC_COLOR_BLUE; + calc->cb[0].r.left = skipx + 4; + calc->cb[0].r.top = skipy + 2; + calc->cb[0].r.right = skipx + SZ_FILLER_X - 2; + calc->cb[0].r.bottom = skipy + SZ_FILLER_Y - 2; + calc->cb[0].enable = 1; + + skipx = SZ_FILLER_X + MARGIN_STANDARD_BIG_X + 11; + + calc->cb[1].id = ID_CALC_BACKSPACE; + LoadString( hInst, IDS_BTN_BACKSPACE, calc->cb[1].label, sizeof(calc->cb[1].label)); + calc->cb[1].color = CALC_COLOR_RED; + calc->cb[1].r.left = skipx; + calc->cb[1].r.top = skipy; + calc->cb[1].r.right = SZ_BIGBTN_X; + calc->cb[1].r.bottom = SZ_BIGBTN_Y; + calc->cb[1].enable = 1; + + skipx += SZ_BIGBTN_X + MARGIN_SMALL_X; + + calc->cb[2].id = ID_CALC_CLEAR_ENTRY; + LoadString( hInst, IDS_BTN_CLEAR_ENTRY, calc->cb[2].label, sizeof(calc->cb[2].label)); + calc->cb[2].color = CALC_COLOR_RED; + calc->cb[2].r.left = skipx; + calc->cb[2].r.top = skipy; + calc->cb[2].r.right = SZ_BIGBTN_X; + calc->cb[2].r.bottom = SZ_BIGBTN_Y; + calc->cb[2].enable = 1; + + skipx += SZ_BIGBTN_X + MARGIN_SMALL_X; + + calc->cb[3].id = ID_CALC_CLEAR_ALL; + LoadString( hInst, IDS_BTN_CLEAR_ALL, calc->cb[3].label, sizeof(calc->cb[3].label)); + calc->cb[3].color = CALC_COLOR_RED; + calc->cb[3].r.left = skipx; + calc->cb[3].r.top = skipy; + calc->cb[3].r.right = SZ_BIGBTN_X; + calc->cb[3].r.bottom = SZ_BIGBTN_Y; + calc->cb[3].enable = 1; + + // Row 2 + + skipx = MARGIN_LEFT; + skipy += SZ_BIGBTN_Y + MARGIN_BIG_Y; + + calc->cb[4].id = ID_CALC_MEM_CLEAR; + LoadString( hInst, IDS_BTN_MEM_CLEAR, calc->cb[4].label, sizeof(calc->cb[4].label)); + calc->cb[4].color = CALC_COLOR_RED; + calc->cb[4].r.left = skipx; + calc->cb[4].r.top = skipy; + calc->cb[4].r.right = SZ_MEDBTN_X; + calc->cb[4].r.bottom = SZ_MEDBTN_Y; + calc->cb[4].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_STANDARD_BIG_X; + + calc->cb[5].id = ID_CALC_SEVEN; + strcpy(calc->cb[5].label,"7"); + calc->cb[5].color = CALC_COLOR_BLUE; + calc->cb[5].r.left = skipx; + calc->cb[5].r.top = skipy; + calc->cb[5].r.right = SZ_MEDBTN_X; + calc->cb[5].r.bottom = SZ_MEDBTN_Y; + calc->cb[5].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[6].id = ID_CALC_EIGHT; + strcpy(calc->cb[6].label,"8"); + calc->cb[6].color = CALC_COLOR_BLUE; + calc->cb[6].r.left = skipx; + calc->cb[6].r.top = skipy; + calc->cb[6].r.right = SZ_MEDBTN_X; + calc->cb[6].r.bottom = SZ_MEDBTN_Y; + calc->cb[6].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[7].id = ID_CALC_NINE; + strcpy(calc->cb[7].label,"9"); + calc->cb[7].color = CALC_COLOR_BLUE; + calc->cb[7].r.left = skipx; + calc->cb[7].r.top = skipy; + calc->cb[7].r.right = SZ_MEDBTN_X; + calc->cb[7].r.bottom = SZ_MEDBTN_Y; + calc->cb[7].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[8].id = ID_CALC_DIVIDE; + strcpy(calc->cb[8].label,"/"); + calc->cb[8].color = CALC_COLOR_RED; + calc->cb[8].r.left = skipx; + calc->cb[8].r.top = skipy; + calc->cb[8].r.right = SZ_MEDBTN_X; + calc->cb[8].r.bottom = SZ_MEDBTN_Y; + calc->cb[8].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[9].id = ID_CALC_SQRT; + LoadString( hInst, IDS_BTN_SQRT, calc->cb[9].label, sizeof(calc->cb[9].label)); + calc->cb[9].color = CALC_COLOR_BLUE; + calc->cb[9].r.left = skipx; + calc->cb[9].r.top = skipy; + calc->cb[9].r.right = SZ_MEDBTN_X; + calc->cb[9].r.bottom = SZ_MEDBTN_Y; + calc->cb[9].enable = 1; + + // Row 3 + + skipx = MARGIN_LEFT; + skipy += SZ_MEDBTN_Y + MARGIN_SMALL_Y; + + calc->cb[10].id = ID_CALC_MEM_RECALL; + LoadString( hInst, IDS_BTN_MEM_RECALL, calc->cb[10].label, sizeof(calc->cb[10].label)); + calc->cb[10].color = CALC_COLOR_RED; + calc->cb[10].r.left = skipx; + calc->cb[10].r.top = skipy; + calc->cb[10].r.right = SZ_MEDBTN_X; + calc->cb[10].r.bottom = SZ_MEDBTN_Y; + calc->cb[10].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_STANDARD_BIG_X; + + calc->cb[11].id = ID_CALC_FOUR; + strcpy(calc->cb[11].label,"4"); + calc->cb[11].color = CALC_COLOR_BLUE; + calc->cb[11].r.left = skipx; + calc->cb[11].r.top = skipy; + calc->cb[11].r.right = SZ_MEDBTN_X; + calc->cb[11].r.bottom = SZ_MEDBTN_Y; + calc->cb[11].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[12].id = ID_CALC_FIVE; + strcpy(calc->cb[12].label,"5"); + calc->cb[12].color = CALC_COLOR_BLUE; + calc->cb[12].r.left = skipx; + calc->cb[12].r.top = skipy; + calc->cb[12].r.right = SZ_MEDBTN_X; + calc->cb[12].r.bottom = SZ_MEDBTN_Y; + calc->cb[12].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[13].id = ID_CALC_SIX; + strcpy(calc->cb[13].label,"6"); + calc->cb[13].color = CALC_COLOR_BLUE; + calc->cb[13].r.left = skipx; + calc->cb[13].r.top = skipy; + calc->cb[13].r.right = SZ_MEDBTN_X; + calc->cb[13].r.bottom = SZ_MEDBTN_Y; + calc->cb[13].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[14].id = ID_CALC_MULTIPLY; + strcpy(calc->cb[14].label,"*"); + calc->cb[14].color = CALC_COLOR_RED; + calc->cb[14].r.left = skipx; + calc->cb[14].r.top = skipy; + calc->cb[14].r.right = SZ_MEDBTN_X; + calc->cb[14].r.bottom = SZ_MEDBTN_Y; + calc->cb[14].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[15].id = ID_CALC_PERCENT; + strcpy(calc->cb[15].label,"%"); + calc->cb[15].color = CALC_COLOR_BLUE; + calc->cb[15].r.left = skipx; + calc->cb[15].r.top = skipy; + calc->cb[15].r.right = SZ_MEDBTN_X; + calc->cb[15].r.bottom = SZ_MEDBTN_Y; + calc->cb[15].enable = 1; + + // Row 4 + + skipx = MARGIN_LEFT; + skipy += SZ_MEDBTN_Y + MARGIN_SMALL_Y; + + calc->cb[16].id = ID_CALC_MEM_STORE; + LoadString( hInst, IDS_BTN_MEM_STORE, calc->cb[16].label, sizeof(calc->cb[16].label)); + calc->cb[16].color = CALC_COLOR_RED; + calc->cb[16].r.left = skipx; + calc->cb[16].r.top = skipy; + calc->cb[16].r.right = SZ_MEDBTN_X; + calc->cb[16].r.bottom = SZ_MEDBTN_Y; + calc->cb[16].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_STANDARD_BIG_X; + + calc->cb[17].id = ID_CALC_ONE; + strcpy(calc->cb[17].label,"1"); + calc->cb[17].color = CALC_COLOR_BLUE; + calc->cb[17].r.left = skipx; + calc->cb[17].r.top = skipy; + calc->cb[17].r.right = SZ_MEDBTN_X; + calc->cb[17].r.bottom = SZ_MEDBTN_Y; + calc->cb[17].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[18].id = ID_CALC_TWO; + strcpy(calc->cb[18].label,"2"); + calc->cb[18].color = CALC_COLOR_BLUE; + calc->cb[18].r.left = skipx; + calc->cb[18].r.top = skipy; + calc->cb[18].r.right = SZ_MEDBTN_X; + calc->cb[18].r.bottom = SZ_MEDBTN_Y; + calc->cb[18].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[19].id = ID_CALC_THREE; + strcpy(calc->cb[19].label,"3"); + calc->cb[19].color = CALC_COLOR_BLUE; + calc->cb[19].r.left = skipx; + calc->cb[19].r.top = skipy; + calc->cb[19].r.right = SZ_MEDBTN_X; + calc->cb[19].r.bottom = SZ_MEDBTN_Y; + calc->cb[19].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[20].id = ID_CALC_MINUS; + strcpy(calc->cb[20].label,"-"); + calc->cb[20].color = CALC_COLOR_RED; + calc->cb[20].r.left = skipx; + calc->cb[20].r.top = skipy; + calc->cb[20].r.right = SZ_MEDBTN_X; + calc->cb[20].r.bottom = SZ_MEDBTN_Y; + calc->cb[20].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[21].id = ID_CALC_RECIPROCAL; + strcpy(calc->cb[21].label,"1/x"); + calc->cb[21].color = CALC_COLOR_RED; + calc->cb[21].r.left = skipx; + calc->cb[21].r.top = skipy; + calc->cb[21].r.right = SZ_MEDBTN_X; + calc->cb[21].r.bottom = SZ_MEDBTN_Y; + calc->cb[21].enable = 1; + + // Row 5 (bottom) + + skipx = MARGIN_LEFT; + skipy += SZ_MEDBTN_Y + MARGIN_SMALL_Y; + + calc->cb[22].id = ID_CALC_MEM_PLUS; + LoadString( hInst, IDS_BTN_MEM_PLUS, calc->cb[22].label, sizeof(calc->cb[22].label)); + calc->cb[22].color = CALC_COLOR_RED; + calc->cb[22].r.left = skipx; + calc->cb[22].r.top = skipy; + calc->cb[22].r.right = SZ_MEDBTN_X; + calc->cb[22].r.bottom = SZ_MEDBTN_Y; + calc->cb[22].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_STANDARD_BIG_X; + + calc->cb[23].id = ID_CALC_ZERO; + strcpy(calc->cb[23].label,"0"); + calc->cb[23].color = CALC_COLOR_BLUE; + calc->cb[23].r.left = skipx; + calc->cb[23].r.top = skipy; + calc->cb[23].r.right = SZ_MEDBTN_X; + calc->cb[23].r.bottom = SZ_MEDBTN_Y; + calc->cb[23].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[24].id = ID_CALC_SIGN; + strcpy(calc->cb[24].label,"+/-"); + calc->cb[24].color = CALC_COLOR_RED; + calc->cb[24].r.left = skipx; + calc->cb[24].r.top = skipy; + calc->cb[24].r.right = SZ_MEDBTN_X; + calc->cb[24].r.bottom = SZ_MEDBTN_Y; + calc->cb[24].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[25].id = ID_CALC_DECIMAL; + strcpy(calc->cb[25].label,"."); + calc->cb[25].color = CALC_COLOR_BLUE; + calc->cb[25].r.left = skipx; + calc->cb[25].r.top = skipy; + calc->cb[25].r.right = SZ_MEDBTN_X; + calc->cb[25].r.bottom = SZ_MEDBTN_Y; + calc->cb[25].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[26].id = ID_CALC_PLUS; + strcpy(calc->cb[26].label,"+"); + calc->cb[26].color = CALC_COLOR_RED; + calc->cb[26].r.left = skipx; + calc->cb[26].r.top = skipy; + calc->cb[26].r.right = SZ_MEDBTN_X; + calc->cb[26].r.bottom = SZ_MEDBTN_Y; + calc->cb[26].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[27].id = ID_CALC_EQUALS; + strcpy(calc->cb[27].label,"="); + calc->cb[27].color = CALC_COLOR_RED; + calc->cb[27].r.left = skipx; + calc->cb[27].r.top = skipy; + calc->cb[27].r.right = SZ_MEDBTN_X; + calc->cb[27].r.bottom = SZ_MEDBTN_Y; + calc->cb[27].enable = 1; + } + else { + calc->numButtons = CALC_BUTTONS_SCIENTIFIC; + + // Row 1 (top) + + skipx = MARGIN_LEFT; + skipy = CALC_SCIENTIFIC_MARGIN_TOP + CALC_EDIT_HEIGHT - 1; + + calc->cb[0].id = 0; + strcpy(calc->cb[0].label,"FILLER"); + calc->cb[0].color = CALC_COLOR_BLUE; + calc->cb[0].r.left = skipx + 4 * SZ_MEDBTN_X + 2 * SZ_SPACER_X + 2 * MARGIN_SMALL_X + 12; + calc->cb[0].r.top = skipy; + calc->cb[0].r.right = skipx + 4 * SZ_MEDBTN_X + 2 * SZ_SPACER_X + 2 * MARGIN_SMALL_X + SZ_FILLER_X + 4; + calc->cb[0].r.bottom = skipy + SZ_FILLER_Y - 6; + calc->cb[0].enable = 1; + + calc->cb[1].id = 0; + strcpy(calc->cb[1].label,"FILLER"); + calc->cb[1].color = CALC_COLOR_BLUE; + calc->cb[1].r.left = skipx + 3 * SZ_MEDBTN_X + SZ_SPACER_X + 2 * MARGIN_SMALL_X + 8; + calc->cb[1].r.top = skipy; + calc->cb[1].r.right = skipx + 3 * SZ_MEDBTN_X + SZ_SPACER_X + 2 * MARGIN_SMALL_X + SZ_FILLER_X + 0; + calc->cb[1].r.bottom = skipy + SZ_FILLER_Y - 6; + calc->cb[1].enable = 1; + + skipx += SZ_FILLER_X + MARGIN_SMALL_X; + + skipx = MARGIN_BIG_X; + + calc->cb[2].id = ID_CALC_BACKSPACE; + LoadString( hInst, IDS_BTN_BACKSPACE, calc->cb[2].label, sizeof(calc->cb[2].label)); + calc->cb[2].color = CALC_COLOR_RED; + calc->cb[2].r.left = skipx; + calc->cb[2].r.top = skipy; + calc->cb[2].r.right = SZ_BIGBTN_X; + calc->cb[2].r.bottom = SZ_BIGBTN_Y; + calc->cb[2].enable = 1; + + skipx += SZ_BIGBTN_X + MARGIN_SMALL_X; + + calc->cb[3].id = ID_CALC_CLEAR_ENTRY; + LoadString( hInst, IDS_BTN_CLEAR_ENTRY, calc->cb[3].label, sizeof(calc->cb[3].label)); + calc->cb[3].color = CALC_COLOR_RED; + calc->cb[3].r.left = skipx; + calc->cb[3].r.top = skipy; + calc->cb[3].r.right = SZ_BIGBTN_X; + calc->cb[3].r.bottom = SZ_BIGBTN_Y; + calc->cb[3].enable = 1; + + skipx += SZ_BIGBTN_X + MARGIN_SMALL_X; + + calc->cb[4].id = ID_CALC_CLEAR_ALL; + LoadString( hInst, IDS_BTN_CLEAR_ALL, calc->cb[4].label, sizeof(calc->cb[4].label)); + calc->cb[4].color = CALC_COLOR_RED; + calc->cb[4].r.left = skipx; + calc->cb[4].r.top = skipy; + calc->cb[4].r.right = SZ_BIGBTN_X; + calc->cb[4].r.bottom = SZ_BIGBTN_Y; + calc->cb[4].enable = 1; + + // Row 2 + + skipx = MARGIN_LEFT; + skipy += SZ_MEDBTN_Y + MARGIN_SMALL_Y; + + calc->cb[5].id = ID_CALC_STA; + strcpy(calc->cb[5].label,"Sta"); + calc->cb[5].color = CALC_COLOR_GRAY; + calc->cb[5].r.left = skipx; + calc->cb[5].r.top = skipy; + calc->cb[5].r.right = SZ_MEDBTN_X; + calc->cb[5].r.bottom = SZ_MEDBTN_Y; + calc->cb[5].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[6].id = ID_CALC_FE; + strcpy(calc->cb[6].label,"F-E"); + calc->cb[6].color = CALC_COLOR_MAGENTA; + calc->cb[6].r.left = skipx; + calc->cb[6].r.top = skipy; + calc->cb[6].r.right = SZ_MEDBTN_X; + calc->cb[6].r.bottom = SZ_MEDBTN_Y; + calc->cb[6].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[7].id = ID_CALC_LEFTPAREN; + strcpy(calc->cb[7].label,"("); + calc->cb[7].color = CALC_COLOR_MAGENTA; + calc->cb[7].r.left = skipx; + calc->cb[7].r.top = skipy; + calc->cb[7].r.right = SZ_MEDBTN_X; + calc->cb[7].r.bottom = SZ_MEDBTN_Y; + calc->cb[7].enable = 0; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[8].id = ID_CALC_RIGHTPAREN; + strcpy(calc->cb[8].label,")"); + calc->cb[8].color = CALC_COLOR_MAGENTA; + calc->cb[8].r.left = skipx; + calc->cb[8].r.top = skipy; + calc->cb[8].r.right = SZ_MEDBTN_X; + calc->cb[8].r.bottom = SZ_MEDBTN_Y; + calc->cb[8].enable = 0; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[9].id = ID_CALC_MEM_CLEAR; + LoadString( hInst, IDS_BTN_MEM_CLEAR, calc->cb[9].label, sizeof(calc->cb[9].label)); + calc->cb[9].color = CALC_COLOR_RED; + calc->cb[9].r.left = skipx; + calc->cb[9].r.top = skipy; + calc->cb[9].r.right = SZ_MEDBTN_X; + calc->cb[9].r.bottom = SZ_MEDBTN_Y; + calc->cb[9].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[10].id = ID_CALC_SEVEN; + strcpy(calc->cb[10].label,"7"); + calc->cb[10].color = CALC_COLOR_BLUE; + calc->cb[10].r.left = skipx; + calc->cb[10].r.top = skipy; + calc->cb[10].r.right = SZ_MEDBTN_X; + calc->cb[10].r.bottom = SZ_MEDBTN_Y; + calc->cb[10].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[11].id = ID_CALC_EIGHT; + strcpy(calc->cb[11].label,"8"); + calc->cb[11].color = CALC_COLOR_BLUE; + calc->cb[11].r.left = skipx; + calc->cb[11].r.top = skipy; + calc->cb[11].r.right = SZ_MEDBTN_X; + calc->cb[11].r.bottom = SZ_MEDBTN_Y; + calc->cb[11].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[12].id = ID_CALC_NINE; + strcpy(calc->cb[12].label,"9"); + calc->cb[12].color = CALC_COLOR_BLUE; + calc->cb[12].r.left = skipx; + calc->cb[12].r.top = skipy; + calc->cb[12].r.right = SZ_MEDBTN_X; + calc->cb[12].r.bottom = SZ_MEDBTN_Y; + calc->cb[12].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[13].id = ID_CALC_DIVIDE; + strcpy(calc->cb[13].label,"/"); + calc->cb[13].color = CALC_COLOR_RED; + calc->cb[13].r.left = skipx; + calc->cb[13].r.top = skipy; + calc->cb[13].r.right = SZ_MEDBTN_X; + calc->cb[13].r.bottom = SZ_MEDBTN_Y; + calc->cb[13].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[14].id = ID_CALC_MOD; + strcpy(calc->cb[14].label,"Mod"); + calc->cb[14].color = CALC_COLOR_RED; + calc->cb[14].r.left = skipx; + calc->cb[14].r.top = skipy; + calc->cb[14].r.right = SZ_MEDBTN_X; + calc->cb[14].r.bottom = SZ_MEDBTN_Y; + calc->cb[14].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[15].id = ID_CALC_AND; + strcpy(calc->cb[15].label,"And"); + calc->cb[15].color = CALC_COLOR_RED; + calc->cb[15].r.left = skipx; + calc->cb[15].r.top = skipy; + calc->cb[15].r.right = SZ_MEDBTN_X; + calc->cb[15].r.bottom = SZ_MEDBTN_Y; + calc->cb[15].enable = 1; + + // Row 3 + + skipx = MARGIN_LEFT; + skipy += SZ_MEDBTN_Y + MARGIN_SMALL_Y; + + calc->cb[16].id = ID_CALC_AVE; + strcpy(calc->cb[16].label,"Ave"); + calc->cb[16].color = CALC_COLOR_GRAY; + calc->cb[16].r.left = skipx; + calc->cb[16].r.top = skipy; + calc->cb[16].r.right = SZ_MEDBTN_X; + calc->cb[16].r.bottom = SZ_MEDBTN_Y; + calc->cb[16].enable = 0; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[17].id = ID_CALC_DMS; + strcpy(calc->cb[17].label,"dms"); + calc->cb[17].color = CALC_COLOR_MAGENTA; + calc->cb[17].r.left = skipx; + calc->cb[17].r.top = skipy; + calc->cb[17].r.right = SZ_MEDBTN_X; + calc->cb[17].r.bottom = SZ_MEDBTN_Y; + calc->cb[17].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[18].id = ID_CALC_EXP; + strcpy(calc->cb[18].label,"Exp"); + calc->cb[18].color = CALC_COLOR_MAGENTA; + calc->cb[18].r.left = skipx; + calc->cb[18].r.top = skipy; + calc->cb[18].r.right = SZ_MEDBTN_X; + calc->cb[18].r.bottom = SZ_MEDBTN_Y; + calc->cb[18].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[19].id = ID_CALC_LN; + strcpy(calc->cb[19].label,"ln"); + calc->cb[19].color = CALC_COLOR_MAGENTA; + calc->cb[19].r.left = skipx; + calc->cb[19].r.top = skipy; + calc->cb[19].r.right = SZ_MEDBTN_X; + calc->cb[19].r.bottom = SZ_MEDBTN_Y; + calc->cb[19].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[20].id = ID_CALC_MEM_RECALL; + strcpy(calc->cb[20].label,"MR"); + calc->cb[20].color = CALC_COLOR_RED; + calc->cb[20].r.left = skipx; + calc->cb[20].r.top = skipy; + calc->cb[20].r.right = SZ_MEDBTN_X; + calc->cb[20].r.bottom = SZ_MEDBTN_Y; + calc->cb[20].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[21].id = ID_CALC_FOUR; + strcpy(calc->cb[21].label,"4"); + calc->cb[21].color = CALC_COLOR_BLUE; + calc->cb[21].r.left = skipx; + calc->cb[21].r.top = skipy; + calc->cb[21].r.right = SZ_MEDBTN_X; + calc->cb[21].r.bottom = SZ_MEDBTN_Y; + calc->cb[21].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[22].id = ID_CALC_FIVE; + strcpy(calc->cb[22].label,"5"); + calc->cb[22].color = CALC_COLOR_BLUE; + calc->cb[22].r.left = skipx; + calc->cb[22].r.top = skipy; + calc->cb[22].r.right = SZ_MEDBTN_X; + calc->cb[22].r.bottom = SZ_MEDBTN_Y; + calc->cb[22].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[23].id = ID_CALC_SIX; + strcpy(calc->cb[23].label,"6"); + calc->cb[23].color = CALC_COLOR_BLUE; + calc->cb[23].r.left = skipx; + calc->cb[23].r.top = skipy; + calc->cb[23].r.right = SZ_MEDBTN_X; + calc->cb[23].r.bottom = SZ_MEDBTN_Y; + calc->cb[23].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[24].id = ID_CALC_MULTIPLY; + strcpy(calc->cb[24].label,"*"); + calc->cb[24].color = CALC_COLOR_RED; + calc->cb[24].r.left = skipx; + calc->cb[24].r.top = skipy; + calc->cb[24].r.right = SZ_MEDBTN_X; + calc->cb[24].r.bottom = SZ_MEDBTN_Y; + calc->cb[24].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[25].id = ID_CALC_OR; + strcpy(calc->cb[25].label,"Or"); + calc->cb[25].color = CALC_COLOR_RED; + calc->cb[25].r.left = skipx; + calc->cb[25].r.top = skipy; + calc->cb[25].r.right = SZ_MEDBTN_X; + calc->cb[25].r.bottom = SZ_MEDBTN_Y; + calc->cb[25].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[26].id = ID_CALC_XOR; + strcpy(calc->cb[26].label,"Xor"); + calc->cb[26].color = CALC_COLOR_RED; + calc->cb[26].r.left = skipx; + calc->cb[26].r.top = skipy; + calc->cb[26].r.right = SZ_MEDBTN_X; + calc->cb[26].r.bottom = SZ_MEDBTN_Y; + calc->cb[26].enable = 1; + + // Row 4 + + skipx = MARGIN_LEFT; + skipy += SZ_MEDBTN_Y + MARGIN_SMALL_Y; + + calc->cb[27].id = ID_CALC_SUM; + strcpy(calc->cb[27].label,"Sum"); + calc->cb[27].color = CALC_COLOR_GRAY; + calc->cb[27].r.left = skipx ; + calc->cb[27].r.top = skipy; + calc->cb[27].r.right = SZ_MEDBTN_X; + calc->cb[27].r.bottom = SZ_MEDBTN_Y; + calc->cb[27].enable = 0; + + skipx += MARGIN_SMALL_X + SZ_MEDBTN_X + SZ_SPACER_X; + + calc->cb[28].id = ID_CALC_SIN; + strcpy(calc->cb[28].label,"sin"); + calc->cb[28].color = CALC_COLOR_MAGENTA; + calc->cb[28].r.left = skipx; + calc->cb[28].r.top = skipy; + calc->cb[28].r.right = SZ_MEDBTN_X; + calc->cb[28].r.bottom = SZ_MEDBTN_Y; + calc->cb[28].enable = 1; + + skipx += MARGIN_SMALL_X + SZ_MEDBTN_X; + + calc->cb[29].id = ID_CALC_POWER ; + strcpy(calc->cb[29].label,"x^y"); + calc->cb[29].color = CALC_COLOR_MAGENTA; + calc->cb[29].r.left = skipx; + calc->cb[29].r.top = skipy; + calc->cb[29].r.right = SZ_MEDBTN_X; + calc->cb[29].r.bottom = SZ_MEDBTN_Y; + calc->cb[29].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[30].id = ID_CALC_LOG10; + strcpy(calc->cb[30].label,"log"); + calc->cb[30].color = CALC_COLOR_MAGENTA; + calc->cb[30].r.left = skipx; + calc->cb[30].r.top = skipy; + calc->cb[30].r.right = SZ_MEDBTN_X; + calc->cb[30].r.bottom = SZ_MEDBTN_Y; + calc->cb[30].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[31].id = ID_CALC_MEM_STORE; + LoadString( hInst, IDS_BTN_MEM_STORE, calc->cb[31].label, sizeof(calc->cb[31].label)); + calc->cb[31].color = CALC_COLOR_RED; + calc->cb[31].r.left = skipx; + calc->cb[31].r.top = skipy; + calc->cb[31].r.right = SZ_MEDBTN_X; + calc->cb[31].r.bottom = SZ_MEDBTN_Y; + calc->cb[31].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[32].id = ID_CALC_ONE; + strcpy(calc->cb[32].label,"1"); + calc->cb[32].color = CALC_COLOR_BLUE; + calc->cb[32].r.left = skipx; + calc->cb[32].r.top = skipy; + calc->cb[32].r.right = SZ_MEDBTN_X; + calc->cb[32].r.bottom = SZ_MEDBTN_Y; + calc->cb[32].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[33].id = ID_CALC_TWO; + strcpy(calc->cb[33].label,"2"); + calc->cb[33].color = CALC_COLOR_BLUE; + calc->cb[33].r.left = skipx; + calc->cb[33].r.top = skipy; + calc->cb[33].r.right = SZ_MEDBTN_X; + calc->cb[33].r.bottom = SZ_MEDBTN_Y; + calc->cb[33].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[34].id = ID_CALC_THREE; + strcpy(calc->cb[34].label,"3"); + calc->cb[34].color = CALC_COLOR_BLUE; + calc->cb[34].r.left = skipx; + calc->cb[34].r.top = skipy; + calc->cb[34].r.right = SZ_MEDBTN_X; + calc->cb[34].r.bottom = SZ_MEDBTN_Y; + calc->cb[34].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[35].id = ID_CALC_MINUS; + strcpy(calc->cb[35].label,"-"); + calc->cb[35].color = CALC_COLOR_RED; + calc->cb[35].r.left = skipx; + calc->cb[35].r.top = skipy; + calc->cb[35].r.right = SZ_MEDBTN_X; + calc->cb[35].r.bottom = SZ_MEDBTN_Y; + calc->cb[35].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[36].id = ID_CALC_LSH; + strcpy(calc->cb[36].label,"Lsh"); + calc->cb[36].color = CALC_COLOR_RED; + calc->cb[36].r.left = skipx; + calc->cb[36].r.top = skipy; + calc->cb[36].r.right = SZ_MEDBTN_X; + calc->cb[36].r.bottom = SZ_MEDBTN_Y; + calc->cb[36].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[37].id = ID_CALC_NOT; + strcpy(calc->cb[37].label,"Not"); + calc->cb[37].color = CALC_COLOR_RED; + calc->cb[37].r.left = skipx; + calc->cb[37].r.top = skipy; + calc->cb[37].r.right = SZ_MEDBTN_X; + calc->cb[37].r.bottom = SZ_MEDBTN_Y; + calc->cb[37].enable = 1; + + // Row 5 (bottom) + + skipx = MARGIN_LEFT; + skipy += SZ_MEDBTN_Y + MARGIN_SMALL_Y; + + calc->cb[38].id = ID_CALC_S; + strcpy(calc->cb[38].label,"s"); + calc->cb[38].color = CALC_COLOR_GRAY; + calc->cb[38].r.left = skipx; + calc->cb[38].r.top = skipy; + calc->cb[38].r.right = SZ_MEDBTN_X; + calc->cb[38].r.bottom = SZ_MEDBTN_Y; + calc->cb[38].enable = 0; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[39].id = ID_CALC_COS; + strcpy(calc->cb[39].label,"cos"); + calc->cb[39].color = CALC_COLOR_MAGENTA; + calc->cb[39].r.left = skipx; + calc->cb[39].r.top = skipy; + calc->cb[39].r.right = SZ_MEDBTN_X; + calc->cb[39].r.bottom = SZ_MEDBTN_Y; + calc->cb[39].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[40].id = ID_CALC_CUBE; + strcpy(calc->cb[40].label,"x^3"); + calc->cb[40].color = CALC_COLOR_MAGENTA; + calc->cb[40].r.left = skipx; + calc->cb[40].r.top = skipy; + calc->cb[40].r.right = SZ_MEDBTN_X; + calc->cb[40].r.bottom = SZ_MEDBTN_Y; + calc->cb[40].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[41].id = ID_CALC_FACTORIAL; + strcpy(calc->cb[41].label,"n!"); + calc->cb[41].color = CALC_COLOR_MAGENTA; + calc->cb[41].r.left = skipx; + calc->cb[41].r.top = skipy; + calc->cb[41].r.right = SZ_MEDBTN_X; + calc->cb[41].r.bottom = SZ_MEDBTN_Y; + calc->cb[41].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[42].id = ID_CALC_MEM_PLUS; + LoadString( hInst, IDS_BTN_MEM_PLUS, calc->cb[42].label, sizeof(calc->cb[42].label)); + calc->cb[42].color = CALC_COLOR_RED; + calc->cb[42].r.left = skipx; + calc->cb[42].r.top = skipy; + calc->cb[42].r.right = SZ_MEDBTN_X; + calc->cb[42].r.bottom = SZ_MEDBTN_Y; + calc->cb[42].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[43].id = ID_CALC_ZERO; + strcpy(calc->cb[43].label,"0"); + calc->cb[43].color = CALC_COLOR_BLUE; + calc->cb[43].r.left = skipx; + calc->cb[43].r.top = skipy; + calc->cb[43].r.right = SZ_MEDBTN_X; + calc->cb[43].r.bottom = SZ_MEDBTN_Y; + calc->cb[43].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[44].id = ID_CALC_SIGN; + strcpy(calc->cb[44].label,"+/-"); + calc->cb[44].color = CALC_COLOR_RED; + calc->cb[44].r.left = skipx; + calc->cb[44].r.top = skipy; + calc->cb[44].r.right = SZ_MEDBTN_X; + calc->cb[44].r.bottom = SZ_MEDBTN_Y; + calc->cb[44].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[45].id = ID_CALC_DECIMAL; + strcpy(calc->cb[45].label,"."); + calc->cb[45].color = CALC_COLOR_BLUE; + calc->cb[45].r.left = skipx; + calc->cb[45].r.top = skipy; + calc->cb[45].r.right = SZ_MEDBTN_X; + calc->cb[45].r.bottom = SZ_MEDBTN_Y; + calc->cb[45].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[46].id = ID_CALC_PLUS; + strcpy(calc->cb[46].label,"+"); + calc->cb[46].color = CALC_COLOR_RED; + calc->cb[46].r.left = skipx; + calc->cb[46].r.top = skipy; + calc->cb[46].r.right = SZ_MEDBTN_X; + calc->cb[46].r.bottom = SZ_MEDBTN_Y; + calc->cb[46].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[47].id = ID_CALC_EQUALS; + strcpy(calc->cb[47].label,"="); + calc->cb[47].color = CALC_COLOR_RED; + calc->cb[47].r.left = skipx; + calc->cb[47].r.top = skipy; + calc->cb[47].r.right = SZ_MEDBTN_X; + calc->cb[47].r.bottom = SZ_MEDBTN_Y; + calc->cb[47].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[48].id = ID_CALC_INT; + strcpy(calc->cb[48].label,"Int"); + calc->cb[48].color = CALC_COLOR_RED; + calc->cb[48].r.left = skipx; + calc->cb[48].r.top = skipy; + calc->cb[48].r.right = SZ_MEDBTN_X; + calc->cb[48].r.bottom = SZ_MEDBTN_Y; + calc->cb[48].enable = 1; + + + // Row 6 + + skipx = MARGIN_LEFT; + skipy += SZ_MEDBTN_Y + MARGIN_SMALL_Y; + + calc->cb[49].id = ID_CALC_DAT; + strcpy(calc->cb[49].label,"Dat"); + calc->cb[49].color = CALC_COLOR_GRAY; + calc->cb[49].r.left = skipx; + calc->cb[49].r.top = skipy; + calc->cb[49].r.right = SZ_MEDBTN_X; + calc->cb[49].r.bottom = SZ_MEDBTN_Y; + calc->cb[49].enable = 0; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[50].id = ID_CALC_TAN; + strcpy(calc->cb[50].label,"tan"); + calc->cb[50].color = CALC_COLOR_MAGENTA; + calc->cb[50].r.left = skipx; + calc->cb[50].r.top = skipy; + calc->cb[50].r.right = SZ_MEDBTN_X; + calc->cb[50].r.bottom = SZ_MEDBTN_Y; + calc->cb[50].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[51].id = ID_CALC_SQUARE; + strcpy(calc->cb[51].label,"x^2"); + calc->cb[51].color = CALC_COLOR_MAGENTA; + calc->cb[51].r.left = skipx; + calc->cb[51].r.top = skipy; + calc->cb[51].r.right = SZ_MEDBTN_X; + calc->cb[51].r.bottom = SZ_MEDBTN_Y; + calc->cb[51].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[52].id = ID_CALC_RECIPROCAL; + strcpy(calc->cb[52].label,"1/x"); + calc->cb[52].color = CALC_COLOR_MAGENTA; + calc->cb[52].r.left = skipx; + calc->cb[52].r.top = skipy; + calc->cb[52].r.right = SZ_MEDBTN_X; + calc->cb[52].r.bottom = SZ_MEDBTN_Y; + calc->cb[52].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[53].id = ID_CALC_PI; + strcpy(calc->cb[53].label,"pi"); + calc->cb[53].color = CALC_COLOR_BLUE; + calc->cb[53].r.left = skipx; + calc->cb[53].r.top = skipy; + calc->cb[53].r.right = SZ_MEDBTN_X; + calc->cb[53].r.bottom = SZ_MEDBTN_Y; + calc->cb[53].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[54].id = ID_CALC_A; + strcpy(calc->cb[54].label,"A"); + calc->cb[54].color = CALC_COLOR_GRAY; + calc->cb[54].r.left = skipx; + calc->cb[54].r.top = skipy; + calc->cb[54].r.right = SZ_MEDBTN_X; + calc->cb[54].r.bottom = SZ_MEDBTN_Y; + calc->cb[54].enable = 0; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[55].id = ID_CALC_B; + strcpy(calc->cb[55].label,"B"); + calc->cb[55].color = CALC_COLOR_GRAY; + calc->cb[55].r.left = skipx; + calc->cb[55].r.top = skipy; + calc->cb[55].r.right = SZ_MEDBTN_X; + calc->cb[55].r.bottom = SZ_MEDBTN_Y; + calc->cb[55].enable = 0; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[56].id = ID_CALC_C; + strcpy(calc->cb[56].label,"C"); + calc->cb[56].color = CALC_COLOR_GRAY; + calc->cb[56].r.left = skipx; + calc->cb[56].r.top = skipy; + calc->cb[56].r.right = SZ_MEDBTN_X; + calc->cb[56].r.bottom = SZ_MEDBTN_Y; + calc->cb[56].enable = 0; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[57].id = ID_CALC_D; + strcpy(calc->cb[57].label,"D"); + calc->cb[57].color = CALC_COLOR_GRAY; + calc->cb[57].r.left = skipx; + calc->cb[57].r.top = skipy; + calc->cb[57].r.right = SZ_MEDBTN_X; + calc->cb[57].r.bottom = SZ_MEDBTN_Y; + calc->cb[57].enable = 0; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[58].id = ID_CALC_E; + strcpy(calc->cb[58].label,"E"); + calc->cb[58].color = CALC_COLOR_GRAY; + calc->cb[58].r.left = skipx; + calc->cb[58].r.top = skipy; + calc->cb[58].r.right = SZ_MEDBTN_X; + calc->cb[58].r.bottom = SZ_MEDBTN_Y; + calc->cb[58].enable = 0; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[59].id = ID_CALC_F; + strcpy(calc->cb[59].label,"F"); + calc->cb[59].color = CALC_COLOR_GRAY; + calc->cb[59].r.left = skipx; + calc->cb[59].r.top = skipy; + calc->cb[59].r.right = SZ_MEDBTN_X; + calc->cb[59].r.bottom = SZ_MEDBTN_Y; + calc->cb[59].enable = 0; + + // Buttons + + calc->cb[60].id = ID_CALC_NS_HEX; + strcpy(calc->cb[60].label,"Hex"); + calc->cb[60].color = CALC_COLOR_GRAY; + calc->cb[60].r.left = CALC_NS_HEX_LEFT; + calc->cb[60].r.top = CALC_NS_HEX_TOP; + calc->cb[60].r.right = SZ_RADIO_NS_X; + calc->cb[60].r.bottom = SZ_RADIO_NS_Y; + calc->cb[60].enable = 1; + + calc->cb[61].id = ID_CALC_NS_DEC; + strcpy(calc->cb[61].label,"Dec"); + calc->cb[61].color = CALC_COLOR_GRAY; + calc->cb[61].r.left = CALC_NS_DEC_LEFT; + calc->cb[61].r.top = CALC_NS_DEC_TOP; + calc->cb[61].r.right = SZ_RADIO_NS_X; + calc->cb[61].r.bottom = SZ_RADIO_NS_Y; + calc->cb[61].enable = 1; + + calc->cb[62].id = ID_CALC_NS_OCT; + strcpy(calc->cb[62].label,"Oct"); + calc->cb[62].color = CALC_COLOR_GRAY; + calc->cb[62].r.left = CALC_NS_OCT_LEFT; + calc->cb[62].r.top = CALC_NS_OCT_TOP; + calc->cb[62].r.right = SZ_RADIO_NS_X; + calc->cb[62].r.bottom = SZ_RADIO_NS_Y; + calc->cb[62].enable = 1; + + calc->cb[63].id = ID_CALC_NS_BIN; + strcpy(calc->cb[63].label,"Bin"); + calc->cb[63].color = CALC_COLOR_GRAY; + calc->cb[63].r.left = CALC_NS_BIN_LEFT; + calc->cb[63].r.top = CALC_NS_BIN_TOP; + calc->cb[63].r.right = SZ_RADIO_NS_X; + calc->cb[63].r.bottom = SZ_RADIO_NS_Y; + calc->cb[63].enable = 1; + + calc->cb[64].id = ID_CALC_MS_DEGREES; + strcpy(calc->cb[64].label,"Degrees"); + calc->cb[64].color = CALC_COLOR_GRAY; + calc->cb[64].r.left = CALC_MS_DEGREES_LEFT; + calc->cb[64].r.top = CALC_MS_DEGREES_TOP; + calc->cb[64].r.right = SZ_RADIO_MS_X; + calc->cb[64].r.bottom = SZ_RADIO_MS_Y; + calc->cb[64].enable = 1; + + calc->cb[65].id = ID_CALC_MS_RADIANS; + strcpy(calc->cb[65].label,"Radians"); + calc->cb[65].color = CALC_COLOR_GRAY; + calc->cb[65].r.left = CALC_MS_RADIANS_LEFT; + calc->cb[65].r.top = CALC_MS_RADIANS_TOP; + calc->cb[65].r.right = SZ_RADIO_MS_X; + calc->cb[65].r.bottom = SZ_RADIO_MS_Y; + calc->cb[65].enable = 1; + + calc->cb[66].id = ID_CALC_MS_GRADS; + strcpy(calc->cb[66].label,"Grads"); + calc->cb[66].color = CALC_COLOR_GRAY; + calc->cb[66].r.left = CALC_MS_GRADS_LEFT; + calc->cb[66].r.top = CALC_MS_GRADS_TOP; + calc->cb[66].r.right = SZ_RADIO_MS_X; + calc->cb[66].r.bottom = SZ_RADIO_MS_Y; + calc->cb[66].enable = 1; + + calc->cb[67].id = ID_CALC_CB_INV; + strcpy(calc->cb[67].label,"Inv"); + calc->cb[67].color = CALC_COLOR_GRAY; + calc->cb[67].r.left = CALC_CB_INV_LEFT; + calc->cb[67].r.top = CALC_CB_INV_TOP; + calc->cb[67].r.right = SZ_RADIO_CB_X; + calc->cb[67].r.bottom = SZ_RADIO_CB_Y; + calc->cb[67].enable = 1; + + calc->cb[68].id = ID_CALC_CB_HYP; + strcpy(calc->cb[68].label,"Hyp"); + calc->cb[68].color = CALC_COLOR_GRAY; + calc->cb[68].r.left = CALC_CB_HYP_LEFT; + calc->cb[68].r.top = CALC_CB_HYP_TOP; + calc->cb[68].r.right = SZ_RADIO_CB_X; + calc->cb[68].r.bottom = SZ_RADIO_CB_Y; + calc->cb[68].enable = 1; + + calc->cb[69].id = ID_CALC_WS_QWORD; + strcpy(calc->cb[69].label,"Qword"); + calc->cb[69].color = CALC_COLOR_GRAY; + calc->cb[69].r.left = CALC_WS_QWORD_LEFT; + calc->cb[69].r.top = CALC_WS_QWORD_TOP; + calc->cb[69].r.right = SZ_RADIO_WS_X; + calc->cb[69].r.bottom = SZ_RADIO_WS_Y; + calc->cb[69].enable = 1; + + calc->cb[70].id = ID_CALC_WS_DWORD; + strcpy(calc->cb[70].label,"Dword"); + calc->cb[70].color = CALC_COLOR_GRAY; + calc->cb[70].r.left = CALC_WS_DWORD_LEFT; + calc->cb[70].r.top = CALC_WS_DWORD_TOP; + calc->cb[70].r.right = SZ_RADIO_WS_X; + calc->cb[70].r.bottom = SZ_RADIO_WS_Y; + calc->cb[70].enable = 1; + + calc->cb[71].id = ID_CALC_WS_WORD; + strcpy(calc->cb[71].label,"Word"); + calc->cb[71].color = CALC_COLOR_GRAY; + calc->cb[71].r.left = CALC_WS_WORD_LEFT; + calc->cb[71].r.top = CALC_WS_WORD_TOP; + calc->cb[71].r.right = SZ_RADIO_WS_X; + calc->cb[71].r.bottom = SZ_RADIO_WS_Y; + calc->cb[71].enable = 1; + + calc->cb[72].id = ID_CALC_WS_BYTE; + strcpy(calc->cb[72].label,"Byte"); + calc->cb[72].color = CALC_COLOR_GRAY; + calc->cb[72].r.left = CALC_WS_BYTE_LEFT; + calc->cb[72].r.top = CALC_WS_BYTE_TOP; + calc->cb[72].r.right = SZ_RADIO_WS_X; + calc->cb[72].r.bottom = SZ_RADIO_WS_Y; + calc->cb[72].enable = 1; + } + + // preload clip region for filler squares + + if (calc->sciMode) { + n = 1; + + rFiller.left = calc->cb[0].r.left; + rFiller.top = calc->cb[0].r.top; + rFiller.right = calc->cb[0].r.right; + rFiller.bottom = calc->cb[0].r.bottom; + } + else { + n = 2; + + rFiller.left = calc->cb[1].r.left; + rFiller.top = calc->cb[1].r.top; + rFiller.right = calc->cb[0].r.right; + rFiller.bottom = calc->cb[0].r.bottom; + } + + top_button = calc->numButtons - 1; + if (!calc->sciMode) + top_button -= CALC_NS_COUNT + CALC_MS_COUNT + CALC_CB_COUNT + CALC_WS_COUNT; + + for (; n <= top_button; n++) { + ; + + calc->cb[n].hBtn = CreateWindow( + "BUTTON", + calc->cb[n].label, + WS_VISIBLE | WS_CHILD | WS_BORDER | BS_CENTER | BS_VCENTER | BS_TEXT | + (calc->cb[n].enable ? 0 : WS_DISABLED), // BS_FLAT + calc->cb[n].r.left, + calc->cb[n].r.top, + calc->cb[n].r.right, + calc->cb[n].r.bottom, + calc->hWnd, + (HMENU)calc->cb[n].id, + calc->hInst, + NULL + ); + + if (!calc->cb[n].hBtn) + exit(1); + + SendMessage(calc->cb[n].hBtn, WM_SETFONT, (WPARAM)hFont, TRUE); + } + + if (!calc->sciMode) { + top_button += CALC_NS_COUNT; + for (; n<=top_button; n++) { + int j = ID_CALC_NS_HEX + n - top_button + CALC_NS_COUNT - 1; + calc->cb[n].hBtn = CreateWindow( + "BUTTON", + calc->cb[n].label, + WS_VISIBLE | WS_CHILD | BS_LEFT | BS_VCENTER | BS_TEXT | BS_RADIOBUTTON, + CALC_NS_OFFSET_X + calc->cb[n].r.left, + CALC_NS_OFFSET_Y + calc->cb[n].r.top, + calc->cb[n].r.right, + calc->cb[n].r.bottom, + calc->hWnd, + (HMENU)(j), + calc->hInst, + NULL + ); + + if (!calc->cb[n].hBtn) + exit(1); + + SendMessage(calc->cb[n].hBtn, WM_SETFONT, (WPARAM)hFont, TRUE); + } + + top_button += CALC_MS_COUNT; + + for (; n<=top_button; n++) { + calc->cb[n].hBtn = CreateWindow( + "BUTTON", + calc->cb[n].label, + WS_VISIBLE | WS_CHILD | BS_LEFT | BS_VCENTER | BS_TEXT | BS_RADIOBUTTON, + CALC_MS_OFFSET_X + calc->cb[n].r.left, + CALC_MS_OFFSET_Y + calc->cb[n].r.top, + calc->cb[n].r.right, + calc->cb[n].r.bottom, + calc->hWnd, + (HMENU)(ID_CALC_MS_DEGREES + n - top_button + CALC_MS_COUNT - 1), + calc->hInst, + NULL + ); + + if (!calc->cb[n].hBtn) + exit(1); + + SendMessage(calc->cb[n].hBtn, WM_SETFONT, (WPARAM)hFont, TRUE); + } + + top_button += CALC_CB_COUNT; + + for (; n<=top_button; n++) { + calc->cb[n].hBtn = CreateWindow( + "BUTTON", + calc->cb[n].label, + WS_VISIBLE | WS_CHILD | BS_LEFT | BS_VCENTER | BS_TEXT | BS_CHECKBOX, + CALC_CB_OFFSET_X + calc->cb[n].r.left, + CALC_CB_OFFSET_Y + calc->cb[n].r.top, + calc->cb[n].r.right, + calc->cb[n].r.bottom, + calc->hWnd, + (HMENU)(ID_CALC_CB_INV + n - top_button + CALC_CB_COUNT - 1), + calc->hInst, + NULL + ); + + if (!calc->cb[n].hBtn) + exit(1); + + SendMessage(calc->cb[n].hBtn, WM_SETFONT, (WPARAM)hFont, TRUE); + } + + top_button += CALC_WS_COUNT; + + for (; n<=top_button; n++) { + calc->cb[n].hBtn = CreateWindow( + "BUTTON", + calc->cb[n].label, + WS_CHILD | BS_LEFT | BS_VCENTER | BS_TEXT | BS_RADIOBUTTON, + CALC_WS_OFFSET_X + calc->cb[n].r.left, + CALC_WS_OFFSET_Y + calc->cb[n].r.top, + calc->cb[n].r.right, + calc->cb[n].r.bottom, + calc->hWnd, + (HMENU)(ID_CALC_WS_QWORD + n - top_button + CALC_WS_COUNT - 1), + calc->hInst, + NULL + ); + + if (!calc->cb[n].hBtn) + exit(1); + + EnableWindow(calc->cb[n].hBtn, FALSE); + SendMessage(calc->cb[n].hBtn, WM_SETFONT, (WPARAM)hFont, TRUE); + } + + // set sci defaults + + SendMessage(calc->cb[61].hBtn, BM_SETCHECK, 1, 0); // decimal + SendMessage(calc->cb[64].hBtn, BM_SETCHECK, 1, 0); // degrees + SendMessage(calc->cb[69].hBtn, BM_SETCHECK, 1, 0); // qword + } +} + +void DrawCalcRect (HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, CALC *calc, int object) +{ + POINT pt; + HPEN hPenGray; + HPEN hPenBlack; + HPEN hPenWhite; + HPEN hPenOrg; + + int WDISPLAY_LEFT; + int WDISPLAY_TOP; + int WDISPLAY_RIGHT; + int WDISPLAY_BOTTOM; + + if (!calc->sciMode) { + WDISPLAY_LEFT = WDISPLAY_SCIENTIFIC_LEFT; + WDISPLAY_TOP = WDISPLAY_SCIENTIFIC_TOP; + WDISPLAY_RIGHT = WDISPLAY_SCIENTIFIC_RIGHT; + WDISPLAY_BOTTOM = WDISPLAY_SCIENTIFIC_BOTTOM; + } + else { + WDISPLAY_LEFT = WDISPLAY_STANDARD_LEFT; + WDISPLAY_TOP = WDISPLAY_STANDARD_TOP; + WDISPLAY_RIGHT = WDISPLAY_STANDARD_RIGHT; + WDISPLAY_BOTTOM = WDISPLAY_STANDARD_BOTTOM; + } + + // never delete the active pen! + + // Gray Pen + + hPenGray = CreatePen(PS_SOLID, 1, RGB(CALC_GRAY,CALC_GRAY,CALC_GRAY)); + hPenBlack = CreatePen(PS_SOLID, 1, RGB(0,0,0)); + hPenWhite = CreatePen(PS_SOLID, 1, RGB(255,255,255)); + + hPenOrg = SelectObject(hdc, hPenGray); + + MoveToEx(hdc, + calc->cb[object].r.left, + calc->cb[object].r.bottom, + &pt); + + LineTo(hdc, calc->cb[object].r.left, calc->cb[object].r.top); + LineTo(hdc, calc->cb[object].r.right, calc->cb[object].r.top); + + // Black Pen + + SelectObject(hdc, hPenBlack); + + MoveToEx(hdc, + calc->cb[object].r.right-2, + calc->cb[object].r.top+1, + &pt); + + LineTo(hdc, calc->cb[object].r.left+1, calc->cb[object].r.top+1); + LineTo(hdc, calc->cb[object].r.left+1, calc->cb[object].r.bottom-1); + + SelectObject(hdc, hPenBlack); + + MoveToEx(hdc, + WDISPLAY_LEFT - 1, + WDISPLAY_BOTTOM, + &pt); + + LineTo(hdc, WDISPLAY_LEFT - 1, WDISPLAY_TOP - 1); + LineTo(hdc, WDISPLAY_RIGHT + 1, WDISPLAY_TOP - 1); + + SelectObject(hdc, hPenGray); + + MoveToEx(hdc, + WDISPLAY_RIGHT + 1, + WDISPLAY_TOP - 2, + &pt); + + LineTo(hdc, WDISPLAY_LEFT - 2, WDISPLAY_TOP - 2); + LineTo(hdc, WDISPLAY_LEFT - 2, WDISPLAY_BOTTOM + 1); + + // White Pen + + SelectObject(hdc, hPenWhite); + + MoveToEx(hdc, + calc->cb[object].r.left, + calc->cb[object].r.bottom, + &pt); + + LineTo(hdc, calc->cb[object].r.right, calc->cb[object].r.bottom); + LineTo(hdc, calc->cb[object].r.right, calc->cb[object].r.top); + + SelectObject(hdc, hPenOrg); + DeleteObject(hPenGray); + DeleteObject(hPenBlack); + DeleteObject(hPenWhite); +} + +void DrawCalcRectSci(HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, CALC *calc, RECT *r) +{ + POINT pt; + HPEN hPen; + HPEN hPenOrg; + + // never delete the active pen! + + // White Pen + + hPen = CreatePen(PS_SOLID, 1, RGB(255,255,255)); + hPenOrg = SelectObject(hdc, hPen); + + MoveToEx(hdc, + r->left + 1, + r->bottom + 1, + &pt); + + LineTo(hdc, r->left + 1, r->top + 1); + LineTo(hdc, r->right + 1, r->top + 1); + LineTo(hdc, r->right + 1, r->bottom + 1); + LineTo(hdc, r->left + 1, r->bottom + 1); + + SelectObject(hdc, hPenOrg); + DeleteObject(hPen); + + // Black Pen + + hPen = CreatePen(PS_SOLID, 1, RGB(CALC_GRAY,CALC_GRAY,CALC_GRAY)); + hPenOrg = SelectObject(hdc, hPen); + + MoveToEx(hdc, + r->left, + r->bottom, + &pt); + + LineTo(hdc, r->left, r->top); + LineTo(hdc, r->right, r->top); + LineTo(hdc, r->right, r->bottom); + LineTo(hdc, r->left, r->bottom); + + SelectObject(hdc, hPenOrg); + DeleteObject(hPen); +} + +static RECT scirect1 = { + WDISPLAY_SCIENTIFIC_LEFT - 2, + WDISPLAY_SCIENTIFIC_TOP + 25, + WDISPLAY_SCIENTIFIC_LEFT + 202, + WDISPLAY_SCIENTIFIC_TOP + 51 +}; + +static RECT scirect2 = { + WDISPLAY_SCIENTIFIC_LEFT + 205, + WDISPLAY_SCIENTIFIC_TOP + 25, + WDISPLAY_SCIENTIFIC_RIGHT, + WDISPLAY_SCIENTIFIC_TOP + 51 +}; + +static RECT scirect3 = { + WDISPLAY_SCIENTIFIC_LEFT - 2, + WDISPLAY_SCIENTIFIC_TOP + 57, + WDISPLAY_SCIENTIFIC_LEFT + 102, + WDISPLAY_SCIENTIFIC_TOP + 81 +}; + +void DrawCalc (HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, CALC *calc) +{ + char s[CALC_BUF_SIZE]; + + scirect1.right = calc->cb[0].r.right + 2; + scirect2.left = calc->cb[0].r.right + 5; + scirect3.right = calc->cb[1].r.left - 10; + + DrawCalcRect (hdc, hMemDC, ps, calc, 0); + + if (!calc->sciMode) { + DrawCalcRect (hdc, hMemDC, ps, calc, 1); + DrawCalcRectSci(hdc, hMemDC, ps, calc, &scirect1); + DrawCalcRectSci(hdc, hMemDC, ps, calc, &scirect2); + DrawCalcRectSci(hdc, hMemDC, ps, calc, &scirect3); + } + + LoadString(calc->hInst, IDS_BTN_MEM_STATUS_M, s, sizeof(s)); + + DrawCalcText(hdc, hMemDC, ps, calc, 0, s); +} + +void DrawCalcText (HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, CALC *calc, int object, char *s) +{ + POINT pt; + HFONT hFont; + HFONT hFontOrg; + HPEN hPen; + HPEN hPenOrg; + + char s2[CALC_BUF_SIZE]; + + int WDISPLAY_LEFT; + int WDISPLAY_TOP; + int WDISPLAY_RIGHT; + int WDISPLAY_BOTTOM; + + if (!calc->sciMode) { + WDISPLAY_LEFT = WDISPLAY_SCIENTIFIC_LEFT; + WDISPLAY_TOP = WDISPLAY_SCIENTIFIC_TOP; + WDISPLAY_RIGHT = WDISPLAY_SCIENTIFIC_RIGHT; + WDISPLAY_BOTTOM = WDISPLAY_SCIENTIFIC_BOTTOM; + } + else { + WDISPLAY_LEFT = WDISPLAY_STANDARD_LEFT; + WDISPLAY_TOP = WDISPLAY_STANDARD_TOP; + WDISPLAY_RIGHT = WDISPLAY_STANDARD_RIGHT; + WDISPLAY_BOTTOM = WDISPLAY_STANDARD_BOTTOM; + } + + // DEFAULT_GUI_FONT is Tahoma on 2000 and XP? + // SYSTEM_FONT is MS Sans Serif? + + hFont = GetStockObject(DEFAULT_GUI_FONT); + + hFontOrg = SelectObject(hdc, hFont); + + if (calc->memory) { + SetBkMode(hdc, TRANSPARENT); + + TextOut(hdc, + calc->cb[object].r.left + 9, + calc->cb[object].r.top + 7, + s, + strlen(s) + ); + + SetBkMode(hdc, OPAQUE); + } + + if (calc->paren) { + sprintf(s2, "(=%d",calc->paren); + + SetBkMode(hdc, TRANSPARENT); + + SetTextAlign(hdc, TA_CENTER); + + TextOut(hdc, + calc->cb[object+1].r.left + 13, + calc->cb[object+1].r.top + 6, + s2, + strlen(s2) + ); + + SetBkMode(hdc, OPAQUE); + } + + hPen = CreatePen(PS_SOLID, 1, RGB(255,255,255)); + hPenOrg = SelectObject(hdc, hPen); + + MoveToEx(hdc, + WDISPLAY_LEFT - 1, + WDISPLAY_BOTTOM + 1, + &pt + ); + + LineTo(hdc, WDISPLAY_RIGHT + 1, WDISPLAY_BOTTOM + 1); + LineTo(hdc, WDISPLAY_RIGHT + 1, WDISPLAY_TOP - 2); + + Rectangle(hdc, WDISPLAY_LEFT, WDISPLAY_TOP, WDISPLAY_RIGHT, WDISPLAY_BOTTOM); + + SelectObject(hdc, hPenOrg); + DeleteObject(hPen); + + SetBkMode(hdc, TRANSPARENT); + + SetTextAlign(hdc, TA_RIGHT); + + TextOut(hdc, + WDISPLAY_RIGHT - 4, + WDISPLAY_TOP + 1, + calc->display, + strlen(calc->display) + ); + + SelectObject(hdc, hFontOrg); +} + +void DestroyCalc (CALC *calc) +{ + int i; + + for (i=0;i<calc->numButtons;i++) + DestroyWindow(calc->cb[i].hBtn); +} + +void calc_buffer_format(CALC *calc) { + char *p; + int n; + int flag = 0; + int point = 0; + + // calc_buffer_format: enforce buffer content rules + // + // disallow more than one point (beep) + // remove leading zeros + // remove trailing zeros after point (sprintf can cause this) + // remove trailing points + // chop at 32 digits. Though there could also be a point, and 10 separator characters. + + p = calc->buffer; + while (*p) { + if (*p++ == '.') + point++; + } + + if (point > 1) { + calc->buffer[strlen(calc->buffer)-1] = '\0'; + MessageBeep(0); + } + + if (point) { + p = calc->buffer; + n = strlen(p) - 1; + while (*(p+n) && + *(p+n) != '.' && + *(p+n) == '0') { + calc->buffer[n] = '\0'; + n--; + } + } + + // remove leading zeros + + p = calc->buffer; + while (*p) { + if (*p != '0') + break; + p++; + } + + // remove trailing points + + n = strlen(p); + + while (n) { + if (*(p+n-1) == '.') { + if (flag) { + *(p + n) = '\0'; + } + else { + flag = 1; + } + n--; + } + else { + break; + } + } + + // if (!*p) + // strcpy(p, "0"); + + // chop at 32 digits + if (flag) + *(p+33) = '\0'; + else + *(p+32) = '\0'; + + n = 0; + while (*p) + *(calc->buffer + n++) = *(p++); + *(calc->buffer + n) = '\0'; +} + +void calc_buffer_display(CALC *calc) { + char *p; + char s[CALC_BUF_SIZE]; + char r[CALC_BUF_SIZE] = "0"; + int point=0; + calcfloat real; + + switch (calc->numBase) { + case NBASE_HEX: + real = calc_atof(calc->buffer, calc->numBase); + sprintf(calc->display, "%x", (long)real); + break; + + case NBASE_OCTAL: + sprintf(calc->display, "%o", calc->buffer); + break; + + case NBASE_BINARY: + sprintf(calc->display, "%x", calc->buffer); + break; + + case NBASE_DECIMAL: + calc_buffer_format(calc); + + if (calc->displayMode) { + if (!strcmp(calc->buffer, "0") || !calc->buffer[0]) { + strcpy(calc->display, "0.e+0"); + } + else { + int i = 0; + int lz = 0; + calcfloat r; + int exp = 0; + + r = calc_atof(calc->buffer, calc->numBase); + sprintf(s, FMT_DESC_EXP, r); + // remove leading zeros in exponent + p = s; + while (*p) { + if (*p == 'e') { // starting exponent parsing + + exp = 1; + } + else if (exp) { // inside exponent, and haven't seen a digit, so could be a leading zero + + if (*p == '0') + lz = 1; + } + + if (exp && (*p != 'e') && (*p != '0') && (*p != '+') && (*p != '-')) { + exp = 0; + lz = 0; + } + + if (!lz) + calc->display[i++] = *p; + + p++; + } + + if (calc->display[i-1] == '+') // all trailing zeros + + calc->display[i++] = '0'; + + calc->display[i] = 0; + } + } + else { + // calc_buffer_display: display buffer after formatting + // + // if digitGrouping, embed separators + // add point if missing + // display + + strcpy(s,calc->buffer); + p = s; + + while (*p) { + if (*p++ == '.') + point = 1; + } + + if (!*s) + strcpy(s, "0"); + + if (calc->digitGrouping) + calc_sep(s); + + if (!point && calc->numBase == NBASE_DECIMAL) + strcat(s, "."); + + if (*s == '.') { + strcat(r, s); + strcpy(calc->display, r); + } + else { + strcpy(calc->display, s); + } + } + } + InvalidateRect(calc->hWnd, NULL, FALSE); + UpdateWindow(calc->hWnd); +} + +char *calc_sep(char *s) +{ + char c; + char *p; + int n; + int x = 1; + int i = 0; + int point = 0; + char r[CALC_BUF_SIZE]; + + n = strlen(s); + + if (!*s) + return s; + + p = s; + + // need to handle leading minus sign! + + // see if there is a point character + + while (*p) { + if (*p++ == '.') { + point = p - s; + break; + } + } + + // if there is a point character, skip over decimal places + + if (point) { + i = n - point + 1; + n = point - 1; + strcpy(r, s); + strrev(r); + } + + // commify the integer part now + + while (c = *(s + --n)) { + r[i++] = c; + if (x++ % 3 == 0) + r[i++] = ','; + if (n == -1) + break; + } + + if (r[i-1] == ',') + r[--i] = '\0'; + else + r[i] = '\0'; + + strcpy(s, strrev(r)); + + return s; +} + +long factorial(long n) +{ + if (n <= 1L) + return 1L; + + return n * factorial(n - 1); +} + +void calc_setmenuitem_radio(HMENU hMenu, UINT id) +{ + MENUITEMINFO menuItem; + + menuItem.fMask = MIIM_FTYPE; + menuItem.fType = MFT_STRING | MFT_RADIOCHECK; + // menuItem.fState = MFS_ENABLED; + // menuItem.wID = id; + // menuItem.hSubMenu = NULL; + // menuItem.hbmpChecked = NULL; + // menuItem.hbmpUnchecked = NULL; + // menuItem.dwItemData = 0; + // menuItem.dwTypeData = "Hex\tF5"; + // menuItem.cch = sizeof("Hex\tF5"); + menuItem.cbSize = sizeof(MENUITEMINFO); + + SetMenuItemInfo(hMenu, id, FALSE, &menuItem); +} + +calcfloat calc_convert_to_radians(CALC *calc) +{ + calcfloat r = calc_atof(calc->buffer, calc->numBase); + + if (calc->trigMode == TRIGMODE_RADIANS) + return r; + if (calc->trigMode == TRIGMODE_DEGREES) + return r * CONST_PI / 180; + else if (calc->trigMode == TRIGMODE_GRADS) + return r * CONST_PI / 200; // 90 degrees == 100 grads + + return 0L; +} + +calcfloat calc_convert_from_radians(CALC *calc) +{ + calcfloat r = calc_atof(calc->buffer, calc->numBase); + + if (calc->trigMode == TRIGMODE_RADIANS) + return r; + if (calc->trigMode == TRIGMODE_DEGREES) + return r * 180 / CONST_PI; + else if (calc->trigMode == TRIGMODE_GRADS) + return r * 200 / CONST_PI; // 90 degrees == 100 grads + + return 0L; +} + +void show_debug(CALC *calc, char *title, long w, long l) +{ + char s[1024]; + + sprintf(s, + + "wParam = (%c) %d:%d, %x:%xh\n \ +lParam = %d:%d, %x:%x\n \ +value = %.32g\n \ +memory = %.32g\n \ +buffer = \"%s\"\n \ +display = \"%s\"\n \ +numBase = %d\n \ +trigMode = %d\n \ +wordSize = %d\n \ +invMode = %d\n \ +hypMode = %d\n \ +oper = (%c)\n", + + LOWORD(w), + LOWORD(w), + HIWORD(w), + LOWORD(w), + HIWORD(w), + LOWORD(l), + HIWORD(l), + LOWORD(l), + HIWORD(l), + calc->value, + calc->memory, + calc->buffer, + calc->display, + calc->numBase, + calc->trigMode, + calc->wordSize, + calc->invMode, + calc->hypMode, + calc->oper + ); + + MessageBox(calc->hWnd, s, title, MB_OK); +} + +calcfloat calc_atof(char *s, int base) +{ + // converts from another base to decimal calcfloat + + switch (base) { + case NBASE_DECIMAL: + return CALC_ATOF(s); + case NBASE_HEX: + return (calcfloat)strtol(s, NULL, 16); + case NBASE_OCTAL: + return (calcfloat)strtol(s, NULL, 8); + case NBASE_BINARY: + return (calcfloat)strtol(s, NULL, 2); + default: + break; + } + + return 0L; +} + +void calc_ftoa(CALC *calc, calcfloat r, char *buf) +{ + // converts from decimal calcfloat to another base + + switch (calc->numBase) { + case NBASE_DECIMAL: + sprintf(buf, FMT_DESC_FLOAT, r); + break; + case NBASE_HEX: + sprintf(buf, "%lX", (long)r); + break; + case NBASE_OCTAL: + sprintf(buf, "%lo", (long)r); + break; + case NBASE_BINARY: // 911 - need routine here + + break; + default: + break; + } +} + +int parse(int wParam, int lParam) +{ + switch (wParam) { + case '\b': // backspace + + if (calc.buffer[0]) + calc.buffer[strlen(calc.buffer)-1] = '\0'; + break; + + case '\x1b': // ESC + + calc.next = 1; + calc.buffer[0] = '\0'; + calc.value = 0; + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + { + char s22[CALC_BUF_SIZE]; + char w = (char)LOWORD(wParam); + + if (!keys[calc.numBase][w]) { + MessageBeep(0); + return 0; + } + + if (calc.next) { // user first digit indicates new buffer needed after previous UI event + calc.next = 0; + calc.buffer[0] = '\0'; + } + calc.newenter = 1; + + sprintf(s22,"%c", w); + strcat(calc.buffer, s22); + } + break; + + case '.': + case ',': // 911 - need to handle this, i18n + + if (calc.numBase == NBASE_DECIMAL) { + if (calc.next) { // first digit indicates new buffer needed after previous UI event + calc.next = 0; + calc.buffer[0] = '\0'; + } + + strcat(calc.buffer, "."); + } + else { + MessageBeep(0); + return 0; + } + break; + + case 'x': + case 'X': // exp, e(1)=2.718 + + if (calc.numBase == NBASE_DECIMAL) { + calc.next = 1; + calc.value = exp(calc_atof(calc.buffer, calc.numBase)); + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value); + } + else { + MessageBeep(0); + return 0; + } + break; + + case 'l': + case 'L': + calc.next = 1; + if (calc_atof(calc.buffer, calc.numBase) == 0.0L) { + strcpy(calc.buffer, err_invalid); + } + else { + calc.value = log10(calc_atof(calc.buffer, calc.numBase)); + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value); + } + break; + + case 'N': + case 'n': // ln is natural logarithm + + calc.next = 1; + if (calc_atof(calc.buffer, calc.numBase) == 0.0L) { + strcpy(calc.buffer, err_invalid); + } + else { + calc.value = log(calc_atof(calc.buffer, calc.numBase)); + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value); + } + break; + + case 'p': + case 'P': + if (calc.numBase == NBASE_DECIMAL) { + calc.next = 1; + sprintf(calc.buffer, FMT_DESC_FLOAT, CONST_PI); + } + else { + MessageBeep(0); + return 0; + } + break; + + case '\x0c': // Ctrl+L MC (only need to invalid rectangle if wasn't already zero, no need to update display) + + calc.next = 1; + if (calc.memory) { + calc.memory = 0.0; + InvalidateRect(calc.hWnd, &rFiller, TRUE); + UpdateWindow(calc.hWnd); + } + + return 0; + break; + + case '\x12': // Ctrl+R MR (value doesn't change, so no invalid rectangle. but display is updated.) + + calc.next = 1; + if (calc.memory != calc_atof(calc.buffer, calc.numBase)) + sprintf(calc.buffer,FMT_DESC_FLOAT,calc.memory); + else + return 0; + break; + + case '\x10': // Ctrl+P M+ (need to invalidate rectangle in many cases but not display) + + calc.next = 1; + InvalidateRect(calc.hWnd, &rFiller, TRUE); + calc.memory += calc_atof(calc.buffer, calc.numBase); + return 0; + break; + + case '\x0d': // Ctrl+M MS (only need to invalid rectangle if was zero and now not, + + // or was not zero and now is, not display) + calc.next = 1; + { + int x = GetKeyState(VK_CONTROL); + + if (x < 0 || lParam == NUMBER_OF_THE_BEAST) { + if ((!calc.memory && calc_atof(calc.buffer, calc.numBase)) || + (calc.memory && !calc_atof(calc.buffer, calc.numBase))) { + + calc.memory = calc_atof(calc.buffer, calc.numBase); + InvalidateRect(calc.hWnd, &rFiller, FALSE); + UpdateWindow(calc.hWnd); + } + else { + calc.memory = calc_atof(calc.buffer, calc.numBase); + } + } + return 0; + } + break; + + // fall through for Enter processing ... but there is a bug here in Ctrl+M vs. Return + case '=': + { + calcfloat r = calc.operand; + + if (calc.newenter) { + calc.newenter = 0; + calc.operand = calc_atof(calc.buffer, calc.numBase); + r = calc_atof(calc.buffer, calc.numBase); // convert buffer from whatever base to decimal real + } + + if (calc.oper == '+') { + calc.value += r; + } + else if (calc.oper == '-') { + calc.value -= r; + } + else if (calc.oper == '*') { + calc.value *= r; + } + else if (calc.oper == '%') { + calc.value = (long)calc.value % (long)r; + } + else if (calc.oper == '/') { + if (!calc_atof(calc.buffer, calc.numBase)) { + strcpy(calc.buffer, err_undefined); + calc.err = 1; + } + else { + calc.value /= r; + } + } + else if (calc.oper == '&') { + calc.value = (calcfloat)((long)calc.value & (long)r); + } + else if (calc.oper == '|') { + calc.value = (calcfloat)((long)calc.value | (long)r); + } + else if (calc.oper == '^') { + calc.value = (calcfloat)((long)calc.value ^ (long)r); + } + else if (calc.oper == 'y') { + calc.value = (calcfloat)pow(calc.value, r); + } + else if (calc.oper == '<') { + if (calc.invMode) + calc.value = (calcfloat)((long)calc.value >> (long)calc_atof(calc.buffer, calc.numBase)); + else + calc.value = (calcfloat)((long)calc.value << (long)calc_atof(calc.buffer, calc.numBase)); + } + else { // must have been a gratuitous user = + + calc.value = calc_atof(calc.buffer, calc.numBase); + } + + calc_ftoa(&calc, calc.value, calc.buffer); + + if (!calc.next) + // calc.value = r; + calc.next = 1; + } + break; + + case 'R': + case 'r': // 1/x + + calc.next = 1; + if (calc_atof(calc.buffer, calc.numBase) == 0) { + calc.err = 1; + strcpy(calc.buffer, err_divide_by_zero); + } + else { + calc.value = 1/calc_atof(calc.buffer, calc.numBase); + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); + } + break; + + case '@': // ^2 - sqrt in standard mode, squared in sci mode + + calc.next = 1; + calc.value = calc_atof(calc.buffer, calc.numBase); + + if (!calc.sciMode) + calc.value *= calc.value; + else + calc.value = sqrt(calc.value); + + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); + break; + + case '#': // ^3 + + calc.next = 1; + calc.value = calc_atof(calc.buffer, calc.numBase); + calc.value *= calc.value * calc.value; + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); + break; + + case 'Y': + case 'y': // x^y + + calc.next = 1; + calc.value = calc_atof(calc.buffer, calc.numBase); + calc.oper = 'y'; + calc.next = 1; + break; + + case '<': // Lsh + + calc.next = 1; + calc.value = calc_atof(calc.buffer, calc.numBase); + calc.oper = '<'; + calc.next = 1; + break; + + case ';': // INT + + calc.next = 1; + calc.value = (long)calc_atof(calc.buffer, calc.numBase); + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); + break; + + case '!': // factorial, need to use gamma function for reals t^(z-1)*e^t dt + + calc.next = 1; + calc.value = calc_atof(calc.buffer, calc.numBase); + calc.value = (calcfloat)factorial((long)calc.value); + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); + break; + + case '&': // bitwise and + + calc.oper = '&'; + calc.next = 1; + calc.value = calc_atof(calc.buffer, calc.numBase); + break; + + case '|': // bitwise or + + calc.oper = '|'; + calc.next = 1; + calc.value = calc_atof(calc.buffer, calc.numBase); + break; + + case '^': // bitwise xor + + calc.oper = '^'; + calc.next = 1; + calc.value = calc_atof(calc.buffer, calc.numBase); + break; + + case '~': // bitwise not + + calc.next = 1; + calc.value = ~ (long) calc_atof(calc.buffer, calc.numBase); + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); + break; + + case '+': + calc.operand = calc_atof(calc.buffer, calc.numBase); + calc.value += calc.operand; + calc_ftoa(&calc, calc.value, calc.buffer); + calc.oper = '+'; + calc.newenter = 1; + calc.next = 1; + break; + + case '-': + if (calc.init) { + calc.init = 0; + calc.operand = calc_atof(calc.buffer, calc.numBase); + calc.value = calc.operand; + } + else { + calc.value -= calc.operand; + calc_ftoa(&calc, calc.value, calc.buffer); + } + + calc.oper = '-'; + calc.newenter = 1; + calc.next = 1; + break; + + case '*': + if (calc.init) { + calc.init = 0; + calc.operand = calc_atof(calc.buffer, calc.numBase); + calc.value = calc.operand; + } + else { + calc.value *= calc.operand; + calc_ftoa(&calc, calc.value, calc.buffer); + } + calc.oper = '*'; + calc.newenter = 1; + calc.next = 1; + break; + + case '/': + if (calc.init) { + calc.init = 0; + calc.operand = calc_atof(calc.buffer, calc.numBase); + calc.value = calc.operand; + } + else { + calc.value /= calc.operand; + calc_ftoa(&calc, calc.value, calc.buffer); + } + calc.oper = '/'; + calc.newenter = 1; + calc.next = 1; + break; + + case '%': + if (!calc.sciMode) { + if (calc.init) { + calc.init = 0; + calc.operand = calc_atof(calc.buffer, calc.numBase); + calc.value = calc.operand; + } + else { + calc.value = (long)atof(calc.buffer) % (long)calc.operand; + calc_ftoa(&calc, calc.value, calc.buffer); + } + } + else { + calcfloat r; + r = calc_atof(calc.buffer, calc.numBase); + calc.next = 1; + sprintf(calc.buffer, FMT_DESC_FLOAT, r * calc.value / (calcfloat)100.0); + } + + calc.oper = '%'; + calc.newenter = 1; + calc.next = 1; + break; + + case 'O': // cos + + case 'o': + if (calc.numBase == NBASE_DECIMAL) { + + calcfloat r; + calc.next = 1; + r = calc_convert_to_radians(&calc); + if (calc.hypMode && calc.invMode) + calc.value = acosh(r); + else if (calc.invMode) + calc.value = acos(r); + else if (calc.hypMode) + calc.value = cosh(r); + else + calc.value = cos(calc_atof(calc.buffer, calc.numBase)); + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); + } + else { + MessageBeep(0); + return 0; + } + break; + + case 'S': // sin + + case 's': + if (calc.numBase == NBASE_DECIMAL) { + + calcfloat r = calc_convert_to_radians(&calc); + calc.next = 1; + if (calc.hypMode && calc.invMode) + calc.value = asinh(r); + else if (calc.invMode) + calc.value = asin(r); + else if (calc.hypMode) + calc.value = sinh(r); + else + calc.value = sin(r); + + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); + } + else { + MessageBeep(0); + return 0; + } + break; + + case 'T': // tan + + case 't': + if (calc.numBase == NBASE_DECIMAL) { + calcfloat r = calc_convert_to_radians(&calc); + calc.next = 1; + if (calc.hypMode && calc.invMode) + calc.value = atanh(r); + else if (calc.invMode) + calc.value = atan(r); + else if (calc.hypMode) + calc.value = tanh(r); + else + calc.value = tan(r); + + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); + } + else { + MessageBeep(0); + return 0; + } + break; + + case 'M': // dms = Degrees Minutes Seconds + + case 'm': + if (calc.numBase == NBASE_DECIMAL) { + calcfloat r2; + calcfloat r = calc_atof(calc.buffer, calc.numBase); + calc.next = 1; + r2 = r - (long)r; + + r = (long)r + r2 * 0.6; // multiply by 60 and divide by 100 + calc.value = r; + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); + } + else { + MessageBeep(0); + return 0; + } + break; + + case 'V': // toggle scientic notation like 1.e+2 or 100 + + case 'v': + calc.displayMode = !calc.displayMode; + break; + +// non-standard keystrokes ... + + case '?': + + calc.next = 1; + if (calc_atof(calc.buffer, calc.numBase) < 0) { + calc.err = 1; + strcpy(calc.buffer, err_invalid); + } + else { + calc.value = sqrt(calc_atof(calc.buffer, calc.numBase)); + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); + } + break; + + case 'Z': // +/- + + { + char s[CALC_BUF_SIZE] = "-"; + + if (!strcmp(calc.buffer, "0")) + return 0; + + if (calc.buffer[0] == '-') + strcpy(s, calc.buffer+1); + else + strcpy(s+1, calc.buffer); + + strcpy(calc.buffer, s); + } + break; + + case 'G': // debug mode + + case 'g': + calc.next = 1; + debug = !debug; + break; + + default: + MessageBeep(0); + return 0; + break; + } + + return 0; +} + +/* + case WM_CONTEXTMENU: // need to subclass control and just call WinHelp! + WinHelp((HWND) wParam, "c:/windows/help/calc.hlp", HELP_CONTEXTMENU, (DWORD)(LPVOID)2); + return 0; + } +*/ diff --git a/rosapps/calc/winecalc.h b/rosapps/calc/winecalc.h new file mode 100644 index 00000000000..9e19d639dc9 --- /dev/null +++ b/rosapps/calc/winecalc.h @@ -0,0 +1,364 @@ +/* + * WineCalc (winecalc.h) + * + * Copyright 2003 James Briggs + * + * 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 + */ + +////////////////////////////////////////////////////////////////// + +// numerics are defined here for easier porting + +typedef double calcfloat; +#define FMT_DESC_FLOAT "%.32g" +#define FMT_DESC_EXP "%.32e" + +#define CALC_ATOF(x) atof(x) + +#define CONST_PI 3.1415926535897932384626433832795 + +///////////////////////////////////////////////////////////////// + +#define CALC_BUF_SIZE 128 + +// statistics dialog dimensions + +#define CALC_STA_X 235 +#define CALC_STA_Y 180 + +// sentinel for differentiating Return from Ctrl+M events + +#define NUMBER_OF_THE_BEAST 666 + +#define CALC_COLOR_BLUE 0 +#define CALC_COLOR_RED 1 +#define CALC_COLOR_GRAY 2 +#define CALC_COLOR_MAGENTA 3 + +// gray hilite on rectangle owner-drawn controls RGB(CALC_GRAY, CALC_GRAY, CALC_GRAY) + +#define CALC_GRAY 132 + +// count of buttons needing special toggle states depending on number base + +#define TOGGLE_COUNT 23 + +// there are 3 window menus, standard, decimal measurement system and word size menus + +#define COUNT_MENUS 3 +#define MENU_STD 0 +#define MENU_SCIMS 1 +#define MENU_SCIWS 2 + +// count of buttons + +#define CALC_BUTTONS_STANDARD 28 +#define CALC_BUTTONS_SCIENTIFIC 73 + +// winecalc window outer dimensions + +#define CALC_STANDARD_WIDTH 260 +#define CALC_STANDARD_HEIGHT 252 +#define CALC_SCIENTIFIC_WIDTH 480 +#define CALC_SCIENTIFIC_HEIGHT 310 + +// winecalc private ids for events + +#define ID_CALC_ZERO 0 +#define ID_CALC_ONE 1 +#define ID_CALC_TWO 2 +#define ID_CALC_THREE 3 +#define ID_CALC_FOUR 4 +#define ID_CALC_FIVE 5 +#define ID_CALC_SIX 6 +#define ID_CALC_SEVEN 7 +#define ID_CALC_EIGHT 8 +#define ID_CALC_NINE 9 +#define ID_CALC_BACKSPACE 20 +#define ID_CALC_CLEAR_ENTRY 21 +#define ID_CALC_CLEAR_ALL 22 +#define ID_CALC_MEM_CLEAR 23 +#define ID_CALC_DIVIDE 24 +#define ID_CALC_SQRT 25 +#define ID_CALC_MEM_RECALL 26 +#define ID_CALC_MULTIPLY 27 +#define ID_CALC_PERCENT 28 +#define ID_CALC_MEM_STORE 29 +#define ID_CALC_MINUS 30 +#define ID_CALC_RECIPROCAL 31 +#define ID_CALC_MEM_PLUS 32 +#define ID_CALC_SIGN 33 +#define ID_CALC_DECIMAL 34 +#define ID_CALC_PLUS 35 +#define ID_CALC_EQUALS 36 +#define ID_CALC_STA 37 +#define ID_CALC_FE 38 +#define ID_CALC_LEFTPAREN 39 +#define ID_CALC_RIGHTPAREN 40 +#define ID_CALC_MOD 41 +#define ID_CALC_AND 42 +#define ID_CALC_OR 43 +#define ID_CALC_XOR 44 +#define ID_CALC_SUM 45 +#define ID_CALC_SIN 46 +#define ID_CALC_LOG10 47 +#define ID_CALC_LSH 48 +#define ID_CALC_NOT 49 +#define ID_CALC_S 50 +#define ID_CALC_COS 52 +#define ID_CALC_FACTORIAL 53 +#define ID_CALC_INT 54 +#define ID_CALC_DAT 55 +#define ID_CALC_TAN 56 +#define ID_CALC_SQUARE 57 +#define ID_CALC_A 58 +#define ID_CALC_B 59 +#define ID_CALC_C 60 +#define ID_CALC_D 61 +#define ID_CALC_E 62 +#define ID_CALC_F 63 +#define ID_CALC_AVE 64 +#define ID_CALC_DMS 65 +#define ID_CALC_EXP 66 +#define ID_CALC_LN 67 +#define ID_CALC_PI 68 +#define ID_CALC_CUBE 69 +#define ID_CALC_POWER 51 + +// Number System Radio Buttons + +#define CALC_NS_COUNT 4 +#define ID_CALC_NS_HEX 2000 +#define ID_CALC_NS_DEC 2001 +#define ID_CALC_NS_OCT 2002 +#define ID_CALC_NS_BIN 2003 + +#define NBASE_DECIMAL 0 +#define NBASE_BINARY 1 +#define NBASE_OCTAL 2 +#define NBASE_HEX 3 + +#define CALC_NS_OFFSET_X 15 +#define CALC_NS_OFFSET_Y 37 + +#define SZ_RADIO_NS_X 50 +#define SZ_RADIO_NS_Y 15 + +#define CALC_NS_HEX_LEFT 0 +#define CALC_NS_HEX_TOP 0 + +#define CALC_NS_DEC_LEFT 50 +#define CALC_NS_DEC_TOP 0 + +#define CALC_NS_OCT_LEFT 98 +#define CALC_NS_OCT_TOP 0 + +#define CALC_NS_BIN_LEFT 148 +#define CALC_NS_BIN_TOP 0 + +// Measurement System Radio Buttons + +#define CALC_MS_COUNT 3 +#define ID_CALC_MS_DEGREES 2010 +#define ID_CALC_MS_RADIANS 2011 +#define ID_CALC_MS_GRADS 2012 + +#define TRIGMODE_DEGREES 0 +#define TRIGMODE_RADIANS 1 +#define TRIGMODE_GRADS 2 + +#define CALC_MS_OFFSET_X 225 +#define CALC_MS_OFFSET_Y 37 + +#define SZ_RADIO_MS_X 75 +#define SZ_RADIO_MS_Y 15 + +#define CALC_MS_DEGREES_LEFT 0 +#define CALC_MS_DEGREES_TOP 0 + +#define CALC_MS_RADIANS_LEFT 82 +#define CALC_MS_RADIANS_TOP 0 + +#define CALC_MS_GRADS_LEFT 162 +#define CALC_MS_GRADS_TOP 0 + +// Inv and Hyp Checkboxes + +#define CALC_CB_COUNT 2 +#define ID_CALC_CB_INV 2020 +#define ID_CALC_CB_HYP 2021 + +#define WORDSIZE_BYTE 1 +#define WORDSIZE_WORD 2 +#define WORDSIZE_DWORD 4 +#define WORDSIZE_QWORD 8 + +#define CALC_CB_OFFSET_X 15 +#define CALC_CB_OFFSET_Y 58 + +#define CALC_CB_INV_LEFT 0 +#define CALC_CB_INV_TOP 10 + +#define SZ_RADIO_CB_X 50 +#define SZ_RADIO_CB_Y 14 + +#define CALC_CB_HYP_LEFT 58 +#define CALC_CB_HYP_TOP 10 + +// Word Size Radio Buttons + +#define CALC_WS_COUNT 4 +#define ID_CALC_WS_QWORD 2030 +#define ID_CALC_WS_DWORD 2031 +#define ID_CALC_WS_WORD 2032 +#define ID_CALC_WS_BYTE 2033 + +#define CALC_WS_OFFSET_X CALC_MS_OFFSET_X +#define CALC_WS_OFFSET_Y CALC_MS_OFFSET_Y + +#define CALC_WS_QWORD_LEFT 0 +#define CALC_WS_QWORD_TOP 0 + +#define CALC_WS_DWORD_LEFT 57 +#define CALC_WS_DWORD_TOP 0 + +#define CALC_WS_WORD_LEFT 120 +#define CALC_WS_WORD_TOP 0 + +#define CALC_WS_BYTE_LEFT 175 +#define CALC_WS_BYTE_TOP 0 + +#define SZ_RADIO_WS_X 50 +#define SZ_RADIO_WS_Y 15 + +// drawing offsets + +#define CALC_EDIT_HEIGHT 20 + +#define SZ_FILLER_X 32 +#define SZ_FILLER_Y 30 + +#define SZ_BIGBTN_X 62 +#define SZ_BIGBTN_Y 30 + +#define SZ_MEDBTN_X 36 +#define SZ_MEDBTN_Y 30 + +#define MARGIN_LEFT 7 +#define MARGIN_SMALL_X 3 +#define MARGIN_SMALL_Y 3 +#define MARGIN_BIG_X 274 +#define MARGIN_STANDARD_BIG_X 11 +#define MARGIN_BIG_Y 6 + +#define SZ_SPACER_X 11 + +// winecalc results display area + +#define WDISPLAY_STANDARD_LEFT MARGIN_LEFT + 4 +#define WDISPLAY_STANDARD_TOP 5 +#define WDISPLAY_STANDARD_RIGHT 244 +#define WDISPLAY_STANDARD_BOTTOM 24 +#define CALC_STANDARD_MARGIN_TOP 16 + +#define WDISPLAY_SCIENTIFIC_LEFT MARGIN_LEFT + 4 +#define WDISPLAY_SCIENTIFIC_TOP 5 +#define WDISPLAY_SCIENTIFIC_RIGHT 465 +#define WDISPLAY_SCIENTIFIC_BOTTOM 24 +#define CALC_SCIENTIFIC_MARGIN_TOP 44 + +typedef struct tagCalcBtn { + int id; // private id + HWND hBtn; // button child window handle + char label[80]; // text on buttonface + int color; // text color + RECT r; // location + int enable; // 1 = control enbabled, 0 = disabled +} +CALCBTN; + +typedef struct tagPos { + int x; + int y; +} +POS; + +typedef struct tagCalc { + HINSTANCE hInst; // this HINSTANCE + HWND hWnd; // main window's HWND + + POS pos; + int numButtons; // standard = 28, scientific = more + + char buffer [CALC_BUF_SIZE]; // current keyboard buffer + char display[CALC_BUF_SIZE]; // display buffer before output + + calcfloat value; // most recent computer value + calcfloat memory; // most recent stored memory value from display buffer + int paren; // current parentheses level + + int sciMode; // standard = 1, scientific = 0 + int displayMode; // 0 = float, 1 = scientific exponential notation like 1.0e+10 + + char oper; // most recent operator pushed + calcfloat operand; // most recent operand pushed + int newenter; // track multiple = + int next; // binary operation flag + int err; // errror status for divide by zero, infinity, etc. + int init; // starting buffer + + int digitGrouping; // no separators = 0, separators = 1 + + int trigMode; // degrees = 0, radians = 1, grads = 2 + int numBase; // 10 = decimal, 2 = binary, 8 = octal, 16 = hex + int wordSize; // 1 = byte, 2 = word, 4 = dword, 8 = qword + int invMode; // INV mode 0 = off, 1 = on + int hypMode; // HYP mode 0 = off, 1 = on + + int new; // first time 0 = false, 1 = true + CALCBTN cb[80]; // enough buttons for standard or scientific mode +} +CALC; + +BOOL CALLBACK AboutDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); +LRESULT WINAPI MainProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); + +void InitLuts(void); +void InitMenus(HINSTANCE hInst); + +void InitCalc (CALC *calc); +void DestroyCalc (CALC *calc); + +void calc_buffer_format(CALC *calc); +void calc_buffer_display(CALC *calc); +char *calc_sep(char *s); + +void DrawCalcText (HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, CALC *calc, int object, char *s); +void CalcRect (HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, CALC *calc, int object); +void DrawCalcRectSci(HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, CALC *calc, RECT *r); +void DrawCalc (HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, CALC *calc); + +void calc_setmenuitem_radio(HMENU hMenu, UINT id); + +void show_debug(CALC *calc, char *title, long wParam, long lParam); + +calcfloat calc_atof(char *s, int base); +void calc_ftoa(CALC *calc, calcfloat r, char *buf); +long factorial(long n); + +calcfloat calc_convert_to_radians(CALC *calc); +calcfloat calc_convert_from_radians(CALC *calc); + From 9cd5e17f9f466f4659f1260bf013e5fc48689de1 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Tue, 2 Mar 2004 10:25:59 +0000 Subject: [PATCH 0293/1463] fix NAMELESSUNION support for struct DECIMAL svn path=/trunk/; revision=8503 --- reactos/lib/oleaut32/Makefile.in | 2 +- reactos/lib/oleaut32/variant.c | 2 +- reactos/w32api/include/oaidl.h | 2 +- reactos/w32api/include/oleauto.h | 10 +++++----- reactos/w32api/include/wtypes.h | 19 ++++++++++++++----- 5 files changed, 22 insertions(+), 13 deletions(-) diff --git a/reactos/lib/oleaut32/Makefile.in b/reactos/lib/oleaut32/Makefile.in index 6924283821d..35fbc6c4bdf 100644 --- a/reactos/lib/oleaut32/Makefile.in +++ b/reactos/lib/oleaut32/Makefile.in @@ -17,8 +17,8 @@ C_SRCS = \ hash.c \ oleaut.c \ olepicture.c \ - stubs.c \ safearray.c \ + stubs.c \ varformat.c \ variant.c \ vartype.c diff --git a/reactos/lib/oleaut32/variant.c b/reactos/lib/oleaut32/variant.c index fba3b8169e8..2a1832ce4e5 100644 --- a/reactos/lib/oleaut32/variant.c +++ b/reactos/lib/oleaut32/variant.c @@ -2204,7 +2204,7 @@ HRESULT WINAPI VarNumFromParseNum(NUMPARSE *pNumprs, BYTE *rgbDig, ULONG64 tmp; DECIMAL* pDec = &V_DECIMAL(pVarDst); - DECIMAL_SETZERO(pDec); + DECIMAL_SETZERO(*pDec); DEC_LO32(pDec) = 0; if (pNumprs->dwOutFlags & NUMPRS_NEG) diff --git a/reactos/w32api/include/oaidl.h b/reactos/w32api/include/oaidl.h index be5aa151e4d..538a527ebc4 100644 --- a/reactos/w32api/include/oaidl.h +++ b/reactos/w32api/include/oaidl.h @@ -7,7 +7,7 @@ #ifdef __cplusplus extern "C" { #endif -#ifdef NONAMELESSUNION +#if (__STDC__ && !defined(_FORCENAMELESSUNION)) || defined(NONAMELESSUNION) #define __VARIANT_NAME_1 n1 #define __VARIANT_NAME_2 n2 #define __VARIANT_NAME_3 n3 diff --git a/reactos/w32api/include/oleauto.h b/reactos/w32api/include/oleauto.h index cdd26daa888..2a69b41d177 100644 --- a/reactos/w32api/include/oleauto.h +++ b/reactos/w32api/include/oleauto.h @@ -22,7 +22,7 @@ #define VAR_FORMAT_NOSUBSTITUTE 0x0020 #define VAR_FOURDIGITYEARS 0x0040 #define VAR_CALENDAR_THAI 0x0080 -#define VAR_CALENDAR_GREGORIAN 0x0100 +#define VAR_CALENDAR_GREGORIAN 0x0100 #define MEMBERID_NIL DISPID_UNKNOWN #define ID_DEFAULTINST (-2) #define DISPATCH_METHOD 1 @@ -34,9 +34,9 @@ #define IsHashValCompatible(h1,h2) ((BOOL)((0x00ff0000&(h1))==(0x00ff0000&(h2)))) #define ACTIVEOBJECT_STRONG 0 #define ACTIVEOBJECT_WEAK 1 -#ifdef NONAMELESSUNION -#define V_UNION(X,Y) ((X)->n1.n2.n3.Y) -#define V_VT(X) ((X)->n1.n2.vt) +#if __STDC__ || defined(NONAMELESSUNION) +#define V_UNION(X,Y) ((X)->__VARIANT_NAME_1.__VARIANT_NAME_2.__VARIANT_NAME_3.Y) +#define V_VT(X) ((X)->__VARIANT_NAME_1.__VARIANT_NAME_2.vt) #else #define V_UNION(X,Y) ((X)->Y) #define V_VT(X) ((X)->vt) @@ -90,7 +90,7 @@ #define V_ARRAYREF(X) V_UNION(X,pparray) #define V_BYREF(X) V_UNION(X,byref) #if (__STDC__ && !defined(_FORCENAMELESSUNION)) || defined(NONAMELESSUNION) -#define V_DECIMAL(X) ((X)->n1.decVal) +#define V_DECIMAL(X) ((X)->__VARIANT_NAME_1.decVal) #else #define V_DECIMAL(X) ((X)->decVal) #endif diff --git a/reactos/w32api/include/wtypes.h b/reactos/w32api/include/wtypes.h index ca0c2be49a0..326964273eb 100644 --- a/reactos/w32api/include/wtypes.h +++ b/reactos/w32api/include/wtypes.h @@ -11,19 +11,28 @@ extern "C" { #endif -#define DEC_SIGN(d) ((d)->u.s.sign) -#define DEC_SCALE(d) ((d)->u.s.scale) -#define DEC_SIGNSCALE(d) ((d)->u.signscale) -#define DEC_HI32(d) ((d)->Hi32) +#ifdef NONAMELESSUNION +#define DEC_SIGN(d) ((d)->DUMMYUNIONNAME.DUMMYSTRUCTNAME.sign) +#define DEC_SCALE(d) ((d)->DUMMYUNIONNAME.DUMMYSTRUCTNAME.scale) +#define DEC_SIGNSCALE(d) ((d)->DUMMYUNIONNAME.signscale) #define DEC_MID32(d) ((d)->DUMMYUNIONNAME2.DUMMYSTRUCTNAME2.Mid32) #define DEC_LO32(d) ((d)->DUMMYUNIONNAME2.DUMMYSTRUCTNAME2.Lo32) #define DEC_LO64(d) ((d)->DUMMYUNIONNAME2.Lo64) +#else +#define DEC_SIGN(d) ((d)->sign) +#define DEC_SCALE(d) ((d)->scale) +#define DEC_SIGNSCALE(d) ((d)->signscale) +#define DEC_MID32(d) ((d)->Mid32) +#define DEC_LO32(d) ((d)->Lo32) +#define DEC_LO64(d) ((d)->Lo64) +#endif +#define DEC_HI32(d) ((d)->Hi32) #define IID_NULL GUID_NULL #define CLSID_NULL GUID_NULL #define CBPCLIPDATA(d) ((d).cbSize-sizeof((d).ulClipFmt)) #define DECIMAL_NEG ((BYTE)0x80) -#define DECIMAL_SETZERO(d) {DEC_LO64(d)=DEC_HI32(d)=DEC_SIGNSCALE(d)=0;} +#define DECIMAL_SETZERO(d) {DEC_LO64(&d)=DEC_HI32(&d)=DEC_SIGNSCALE(&d)=0;} #define ROTFLAGS_REGISTRATIONKEEPSALIVE 0x01 #define ROTFLAGS_ALLOWANYCLIENT 0x02 From d6e2c152dda8c6e0e467aea49967cb126b7452a2 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Tue, 2 Mar 2004 10:30:38 +0000 Subject: [PATCH 0294/1463] merge WineHQ commit svn path=/trunk/; revision=8504 --- reactos/lib/shell32/shlexec.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/reactos/lib/shell32/shlexec.c b/reactos/lib/shell32/shlexec.c index d25e156004a..eb36c0f47e3 100644 --- a/reactos/lib/shell32/shlexec.c +++ b/reactos/lib/shell32/shlexec.c @@ -1219,7 +1219,7 @@ BOOL WINAPI ShellExecuteExW32 (LPSHELLEXECUTEINFOW psei, SHELL_ExecuteW32 execfu } else if (PathIsURLW((LPWSTR)lpFile)) /* File not found, check for URL */ { - static const WCHAR wszShell[] = {'\\','s','h','e','l','l',0}; + static const WCHAR wszShell[] = {'\\','s','h','e','l','l','\\',0}; static const WCHAR wCommand[] = {'\\','c','o','m','m','a','n','d',0}; LPWSTR lpstrRes; INT iSize; @@ -1346,16 +1346,14 @@ BOOL WINAPI ShellExecuteExA (LPSHELLEXECUTEINFOA sei) ret = ShellExecuteExW32 (&seiW, SHELL_ExecuteW); + sei->hInstApp = seiW.hInstApp; + if (wVerb) SHFree(wVerb); if (wFile) SHFree(wFile); if (wParameters) SHFree(wParameters); if (wDirectory) SHFree(wDirectory); if (wClass) SHFree(wClass); - sei->hInstApp = seiW.hInstApp; - - TRACE("ShellExecuteExW(): ret=%d\n", ret); - return ret; } From 71853e115b9b8c5c4db59f67ed1215f711efb53f Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Tue, 2 Mar 2004 16:49:22 +0000 Subject: [PATCH 0295/1463] 2004-03-02 Filip Navara <xnavara@volny.cz> * include/ddk/scsi.h: Replace ASSERT with assert. * include/ddk/video.h: Ditto. * include/ddk/winddk.h: Ditto. Remove the lower case assert macro. * include/ddk/tdi.h: Correct packing. svn path=/trunk/; revision=8505 --- reactos/w32api/include/ddk/scsi.h | 2 +- reactos/w32api/include/ddk/tdi.h | 502 ++++++++++++++-------------- reactos/w32api/include/ddk/video.h | 2 +- reactos/w32api/include/ddk/winddk.h | 10 +- 4 files changed, 255 insertions(+), 261 deletions(-) diff --git a/reactos/w32api/include/ddk/scsi.h b/reactos/w32api/include/ddk/scsi.h index 727ba6c3e4a..2042eb1ad67 100644 --- a/reactos/w32api/include/ddk/scsi.h +++ b/reactos/w32api/include/ddk/scsi.h @@ -1685,7 +1685,7 @@ typedef union _TWO_BYTE { break; \ } \ } \ - assert(_val != 32); \ + ASSERT(_val != 32); \ (Bit) = _val; \ } diff --git a/reactos/w32api/include/ddk/tdi.h b/reactos/w32api/include/ddk/tdi.h index 46d01a29941..0a48b41a2f6 100644 --- a/reactos/w32api/include/ddk/tdi.h +++ b/reactos/w32api/include/ddk/tdi.h @@ -31,14 +31,11 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #include "ntddtdi.h" #include "tdistat.h" #include "netpnp.h" - /* Basic types */ typedef LONG TDI_STATUS; @@ -70,181 +67,6 @@ typedef struct _TDI_REQUEST_STATUS { ULONG BytesTransferred; } TDI_REQUEST_STATUS, *PTDI_REQUEST_STATUS; -typedef struct _TA_ADDRESS { - USHORT AddressLength; - USHORT AddressType; - UCHAR Address[1]; -} TA_ADDRESS, *PTA_ADDRESS; - -#define TDI_ADDRESS_TYPE_UNSPEC 0 -#define TDI_ADDRESS_TYPE_UNIX 1 -#define TDI_ADDRESS_TYPE_IP 2 -#define TDI_ADDRESS_TYPE_IMPLINK 3 -#define TDI_ADDRESS_TYPE_PUP 4 -#define TDI_ADDRESS_TYPE_CHAOS 5 -#define TDI_ADDRESS_TYPE_NS 6 -#define TDI_ADDRESS_TYPE_IPX 6 -#define TDI_ADDRESS_TYPE_NBS 7 -#define TDI_ADDRESS_TYPE_ECMA 8 -#define TDI_ADDRESS_TYPE_DATAKIT 9 -#define TDI_ADDRESS_TYPE_CCITT 10 -#define TDI_ADDRESS_TYPE_SNA 11 -#define TDI_ADDRESS_TYPE_DECnet 12 -#define TDI_ADDRESS_TYPE_DLI 13 -#define TDI_ADDRESS_TYPE_LAT 14 -#define TDI_ADDRESS_TYPE_HYLINK 15 -#define TDI_ADDRESS_TYPE_APPLETALK 16 -#define TDI_ADDRESS_TYPE_NETBIOS 17 -#define TDI_ADDRESS_TYPE_8022 18 -#define TDI_ADDRESS_TYPE_OSI_TSAP 19 -#define TDI_ADDRESS_TYPE_NETONE 20 -#define TDI_ADDRESS_TYPE_VNS 21 -#define TDI_ADDRESS_TYPE_NETBIOS_EX 22 -#define TDI_ADDRESS_TYPE_IP6 23 -#define TDI_ADDRESS_TYPE_NETBIOS_UNICODE_EX 24 - -#define TdiTransportAddress "TransportAddress" -#define TdiConnectionContext "ConnectionContext" -#define TDI_TRANSPORT_ADDRESS_LENGTH (sizeof(TdiTransportAddress) - 1) -#define TDI_CONNECTION_CONTEXT_LENGTH (sizeof(TdiConnectionContext) - 1) - -typedef struct _TRANSPORT_ADDRESS { - LONG TAAddressCount; - TA_ADDRESS Address[1]; -} TRANSPORT_ADDRESS, *PTRANSPORT_ADDRESS; - -typedef struct _TDI_ADDRESS_INFO { - ULONG ActivityCount; - TRANSPORT_ADDRESS Address; -} TDI_ADDRESS_INFO, *PTDI_ADDRESS_INFO; - -typedef struct _TDI_ACTION_HEADER { - ULONG TransportId; - USHORT ActionCode; - USHORT Reserved; -} TDI_ACTION_HEADER, *PTDI_ACTION_HEADER; - -typedef struct _TDI_ADDRESS_8022 { - UCHAR MACAddress[6]; -} TDI_ADDRESS_8022, *PTDI_ADDRESS_8022; - -#define TDI_ADDRESS_LENGTH_8022 sizeof(TDI_ADDRESS_8022); - -typedef struct _TDI_ADDRESS_APPLETALK { - USHORT Network; - UCHAR Node; - UCHAR Socket; -} TDI_ADDRESS_APPLETALK, *PTDI_ADDRESS_APPLETALK; - -#define TDI_ADDRESS_LENGTH_APPLETALK sizeof(TDI_ADDRESS_APPLETALK) - -typedef struct _TDI_ADDRESS_IP { - USHORT sin_port; - ULONG in_addr; - UCHAR sin_zero[8]; -} TDI_ADDRESS_IP, *PTDI_ADDRESS_IP; - -#define TDI_ADDRESS_LENGTH_IP sizeof(TDI_ADDRESS_IP) - -typedef struct _TDI_ADDRESS_IPX { - ULONG NetworkAddress; - UCHAR NodeAddress[6]; - USHORT Socket; -} TDI_ADDRESS_IPX, *PTDI_ADDRESS_IPX; - -#define TDI_ADDRESS_LENGTH_IPX sizeof(TDI_ADDRESS_IPX) - -/* TDI_ADDRESS_NETBIOS.NetbiosNameType constants */ -#define TDI_ADDRESS_NETBIOS_TYPE_UNIQUE 0x0000 -#define TDI_ADDRESS_NETBIOS_TYPE_GROUP 0x0001 -#define TDI_ADDRESS_NETBIOS_TYPE_QUICK_UNIQUE 0x0002 -#define TDI_ADDRESS_NETBIOS_TYPE_QUICK_GROUP 0x0003 - -typedef struct _TDI_ADDRESS_NETBIOS { - USHORT NetbiosNameType; - UCHAR NetbiosName[16]; -} TDI_ADDRESS_NETBIOS, *PTDI_ADDRESS_NETBIOS; - -#define TDI_ADDRESS_LENGTH_NETBIOS sizeof(TDI_ADDRESS_NETBIOS) - -typedef struct _TDI_ADDRESS_NETBIOS_EX { - UCHAR EndpointName[16]; - TDI_ADDRESS_NETBIOS NetbiosAddress; -} TDI_ADDRESS_NETBIOS_EX, *PTDI_ADDRESS_NETBIOS_EX; - -#define TDI_ADDRESS_LENGTH_NETBIOS_EX sizeof(TDI_ADDRESS_NETBIOS_EX) - -/* TDI_ADDRESS_NETONE.NetoneNameType constants */ -#define TDI_ADDRESS_NETONE_TYPE_UNIQUE 0x0000 -#define TDI_ADDRESS_NETONE_TYPE_ROTORED 0x0001 - -typedef struct _TDI_ADDRESS_NETONE { - USHORT NetoneNameType; - UCHAR NetoneName[20]; -} TDI_ADDRESS_NETONE, *PTDI_ADDRESS_NETONE; - -#define TDI_ADDRESS_LENGTH_NETONE sizeof(TDI_ADDRESS_NETONE) - -typedef struct _TDI_ADDRESS_NS -{ - ULONG NetworkAddress; - UCHAR NodeAddress[6]; - USHORT Socket; -} TDI_ADDRESS_NS, *PTDI_ADDRESS_NS; - -#define TDI_ADDRESS_LENGTH_NS sizeof(TDI_ADDRESS_NS) - -#define ISO_MAX_ADDR_LENGTH 64 - -/* TDI_ADDRESS_OSI_TSAP.tp_addr_type constants */ -#define ISO_HIERARCHICAL 0 -#define ISO_NON_HIERARCHICAL 1 - -typedef struct _TDI_ADDRESS_OSI_TSAP { - USHORT tp_addr_type; - USHORT tp_taddr_len; - USHORT tp_tsel_len; - UCHAR tp_addr[ISO_MAX_ADDR_LENGTH]; -} TDI_ADDRESS_OSI_TSAP, *PTDI_ADDRESS_OSI_TSAP; - -#define TDI_ADDRESS_LENGTH_OSI_TSAP sizeof(TDI_ADDRESS_OSI_TSAP) - -typedef struct _TDI_ADDRESS_VNS { - UCHAR net_address[4]; - UCHAR subnet_addr[2]; - UCHAR port[2]; - UCHAR hops; - UCHAR filler[5]; -} TDI_ADDRESS_VNS, *PTDI_ADDRESS_VNS; - -#define TDI_ADDRESS_LENGTH_VNS sizeof(TDI_ADDRESS_VNS) - -typedef struct _TDI_ADDRESS_IP6 { - USHORT sin6_port; - ULONG sin6_flowinfo; - USHORT sin6_addr[8]; - ULONG sin6_scope_id; -} TDI_ADDRESS_IP6, *PTDI_ADDRESS_IP6; - -#define TDI_ADDRESS_LENGTH_IP6 sizeof(TDI_ADDRESS_IP6) - -enum eNameBufferType { - NBT_READONLY = 0, - NBT_WRITEONLY, - NBT_READWRITE, - NBT_WRITTEN -}; - -typedef struct _TDI_ADDRESS_NETBIOS_UNICODE_EX { - USHORT NetbiosNameType; - enum eNameBufferType NameBufferType; - UNICODE_STRING EndpointName; - UNICODE_STRING RemoteName; - WCHAR EndpointBuffer[17]; - WCHAR RemoteNameBuffer[1]; -} TDI_ADDRESS_NETBIOS_UNICODE_EX, *PTDI_ADDRESS_NETBIOS_UNICODE_EX; - - typedef struct _TDI_CONNECT_REQUEST { TDI_REQUEST Request; PTDI_CONNECTION_INFORMATION RequestConnectionInformation; @@ -356,7 +178,6 @@ typedef union _TDI_REQUEST_TYPE { TDI_REQUEST_SET_INFORMATION TdiSetInformation; } TDI_REQUEST_TYPE, *PTDI_REQUEST_TYPE; - /* Query information types */ /* Generic query info types that must be supported by all transports */ @@ -375,79 +196,6 @@ typedef union _TDI_REQUEST_TYPE { #define TDI_QUERY_SESSION_STATUS 0x00000200 #define TDI_QUERY_FIND_NAME 0x00000300 -typedef struct _TA_APPLETALK_ADDR { - LONG TAAddressCount; - struct _AddrAtalk { - USHORT AddressLength; - USHORT AddressType; - TDI_ADDRESS_APPLETALK Address[1]; - } Address[1]; -} TA_APPLETALK_ADDRESS, *PTA_APPLETALK_ADDRESS; - -typedef struct _TA_ADDRESS_IP { - LONG TAAddressCount; - struct _AddrIp { - USHORT AddressLength; - USHORT AddressType; - TDI_ADDRESS_IP Address[1]; - } Address[1]; -} TA_ADDRESS_IP, *PTA_ADDRESS_IP; - -typedef struct _TA_ADDRESS_IPX { - LONG TAAddressCount; - struct _AddrIpx { - USHORT AddressLength; - USHORT AddressType; - TDI_ADDRESS_IPX Address[1]; - } Address[1]; -} TA_IPX_ADDRESS, *PTA_IPX_ADDRESS; - -typedef struct _TA_NETBIOS_ADDRESS { - LONG TAAddressCount; - struct _Addr{ - USHORT AddressLength; - USHORT AddressType; - TDI_ADDRESS_NETBIOS Address[1]; - } Address[1]; -} TA_NETBIOS_ADDRESS, *PTA_NETBIOS_ADDRESS; - -typedef struct _TA_ADDRESS_NS { - LONG TAAddressCount; - struct _AddrNs { - USHORT AddressLength; - USHORT AddressType; - TDI_ADDRESS_NS Address[1]; - } Address[1]; -} TA_NS_ADDRESS, *PTA_NS_ADDRESS; - -typedef struct _TA_ADDRESS_VNS { - LONG TAAddressCount; - struct _AddrVns { - USHORT AddressLength; - USHORT AddressType; - TDI_ADDRESS_VNS Address[1]; - } Address[1]; -} TA_VNS_ADDRESS, *PTA_VNS_ADDRESS; - -typedef struct _TA_ADDRESS_IP6 { - LONG TAAddressCount; - struct _AddrIp6 { - USHORT AddressLength; - USHORT AddressType; - TDI_ADDRESS_IP6 Address[1]; - } Address [1]; -} TA_IP6_ADDRESS, *PTA_IP6_ADDRESS; - -typedef struct _TA_ADDRESS_NETBIOS_UNICODE_EX { - LONG TAAddressCount; - struct _AddrNetbiosWCharEx { - USHORT AddressLength; - USHORT AddressType; - TDI_ADDRESS_NETBIOS_UNICODE_EX Address[1]; - } Address [1]; -} TA_NETBIOS_UNICODE_EX_ADDRESS, *PTA_NETBIOS_UNICODE_EX_ADDRESS; - - /* Structures used for TdiQueryInformation and TdiSetInformation */ typedef struct _TDI_ENDPOINT_INFO { @@ -588,7 +336,255 @@ typedef struct _TDI_REQUEST_ASSOCIATE { #define NDIS_PACKET_POOL_TAG_FOR_NBF 'bPDN' #define NDIS_PACKET_POOL_TAG_FOR_APPLETALK 'aPDN' -#pragma pack(pop) +typedef struct _TA_ADDRESS { + USHORT AddressLength; + USHORT AddressType; + UCHAR Address[1]; +} TA_ADDRESS, *PTA_ADDRESS; + +#define TDI_ADDRESS_TYPE_UNSPEC 0 +#define TDI_ADDRESS_TYPE_UNIX 1 +#define TDI_ADDRESS_TYPE_IP 2 +#define TDI_ADDRESS_TYPE_IMPLINK 3 +#define TDI_ADDRESS_TYPE_PUP 4 +#define TDI_ADDRESS_TYPE_CHAOS 5 +#define TDI_ADDRESS_TYPE_NS 6 +#define TDI_ADDRESS_TYPE_IPX 6 +#define TDI_ADDRESS_TYPE_NBS 7 +#define TDI_ADDRESS_TYPE_ECMA 8 +#define TDI_ADDRESS_TYPE_DATAKIT 9 +#define TDI_ADDRESS_TYPE_CCITT 10 +#define TDI_ADDRESS_TYPE_SNA 11 +#define TDI_ADDRESS_TYPE_DECnet 12 +#define TDI_ADDRESS_TYPE_DLI 13 +#define TDI_ADDRESS_TYPE_LAT 14 +#define TDI_ADDRESS_TYPE_HYLINK 15 +#define TDI_ADDRESS_TYPE_APPLETALK 16 +#define TDI_ADDRESS_TYPE_NETBIOS 17 +#define TDI_ADDRESS_TYPE_8022 18 +#define TDI_ADDRESS_TYPE_OSI_TSAP 19 +#define TDI_ADDRESS_TYPE_NETONE 20 +#define TDI_ADDRESS_TYPE_VNS 21 +#define TDI_ADDRESS_TYPE_NETBIOS_EX 22 +#define TDI_ADDRESS_TYPE_IP6 23 +#define TDI_ADDRESS_TYPE_NETBIOS_UNICODE_EX 24 + +#define TdiTransportAddress "TransportAddress" +#define TdiConnectionContext "ConnectionContext" +#define TDI_TRANSPORT_ADDRESS_LENGTH (sizeof(TdiTransportAddress) - 1) +#define TDI_CONNECTION_CONTEXT_LENGTH (sizeof(TdiConnectionContext) - 1) + +typedef struct _TRANSPORT_ADDRESS { + LONG TAAddressCount; + TA_ADDRESS Address[1]; +} TRANSPORT_ADDRESS, *PTRANSPORT_ADDRESS; + +typedef struct _TDI_ACTION_HEADER { + ULONG TransportId; + USHORT ActionCode; + USHORT Reserved; +} TDI_ACTION_HEADER, *PTDI_ACTION_HEADER; + +typedef struct _TDI_ADDRESS_INFO { + ULONG ActivityCount; + TRANSPORT_ADDRESS Address; +} TDI_ADDRESS_INFO, *PTDI_ADDRESS_INFO; + +#include "pshpack1.h" + +typedef struct _TDI_ADDRESS_8022 { + UCHAR MACAddress[6]; +} TDI_ADDRESS_8022, *PTDI_ADDRESS_8022; + +#define TDI_ADDRESS_LENGTH_8022 sizeof(TDI_ADDRESS_8022); + +typedef struct _TDI_ADDRESS_APPLETALK { + USHORT Network; + UCHAR Node; + UCHAR Socket; +} TDI_ADDRESS_APPLETALK, *PTDI_ADDRESS_APPLETALK; + +#define TDI_ADDRESS_LENGTH_APPLETALK sizeof(TDI_ADDRESS_APPLETALK) + +typedef struct _TDI_ADDRESS_IP { + USHORT sin_port; + ULONG in_addr; + UCHAR sin_zero[8]; +} TDI_ADDRESS_IP, *PTDI_ADDRESS_IP; + +#define TDI_ADDRESS_LENGTH_IP sizeof(TDI_ADDRESS_IP) + +typedef struct _TDI_ADDRESS_IPX { + ULONG NetworkAddress; + UCHAR NodeAddress[6]; + USHORT Socket; +} TDI_ADDRESS_IPX, *PTDI_ADDRESS_IPX; + +#define TDI_ADDRESS_LENGTH_IPX sizeof(TDI_ADDRESS_IPX) + +/* TDI_ADDRESS_NETBIOS.NetbiosNameType constants */ +#define TDI_ADDRESS_NETBIOS_TYPE_UNIQUE 0x0000 +#define TDI_ADDRESS_NETBIOS_TYPE_GROUP 0x0001 +#define TDI_ADDRESS_NETBIOS_TYPE_QUICK_UNIQUE 0x0002 +#define TDI_ADDRESS_NETBIOS_TYPE_QUICK_GROUP 0x0003 + +typedef struct _TDI_ADDRESS_NETBIOS { + USHORT NetbiosNameType; + UCHAR NetbiosName[16]; +} TDI_ADDRESS_NETBIOS, *PTDI_ADDRESS_NETBIOS; + +#define TDI_ADDRESS_LENGTH_NETBIOS sizeof(TDI_ADDRESS_NETBIOS) + +typedef struct _TDI_ADDRESS_NETBIOS_EX { + UCHAR EndpointName[16]; + TDI_ADDRESS_NETBIOS NetbiosAddress; +} TDI_ADDRESS_NETBIOS_EX, *PTDI_ADDRESS_NETBIOS_EX; + +#define TDI_ADDRESS_LENGTH_NETBIOS_EX sizeof(TDI_ADDRESS_NETBIOS_EX) + +/* TDI_ADDRESS_NETONE.NetoneNameType constants */ +#define TDI_ADDRESS_NETONE_TYPE_UNIQUE 0x0000 +#define TDI_ADDRESS_NETONE_TYPE_ROTORED 0x0001 + +typedef struct _TDI_ADDRESS_NETONE { + USHORT NetoneNameType; + UCHAR NetoneName[20]; +} TDI_ADDRESS_NETONE, *PTDI_ADDRESS_NETONE; + +#define TDI_ADDRESS_LENGTH_NETONE sizeof(TDI_ADDRESS_NETONE) + +typedef struct _TDI_ADDRESS_NS +{ + ULONG NetworkAddress; + UCHAR NodeAddress[6]; + USHORT Socket; +} TDI_ADDRESS_NS, *PTDI_ADDRESS_NS; + +#define TDI_ADDRESS_LENGTH_NS sizeof(TDI_ADDRESS_NS) + +#define ISO_MAX_ADDR_LENGTH 64 + +/* TDI_ADDRESS_OSI_TSAP.tp_addr_type constants */ +#define ISO_HIERARCHICAL 0 +#define ISO_NON_HIERARCHICAL 1 + +typedef struct _TDI_ADDRESS_OSI_TSAP { + USHORT tp_addr_type; + USHORT tp_taddr_len; + USHORT tp_tsel_len; + UCHAR tp_addr[ISO_MAX_ADDR_LENGTH]; +} TDI_ADDRESS_OSI_TSAP, *PTDI_ADDRESS_OSI_TSAP; + +#define TDI_ADDRESS_LENGTH_OSI_TSAP sizeof(TDI_ADDRESS_OSI_TSAP) + +typedef struct _TDI_ADDRESS_VNS { + UCHAR net_address[4]; + UCHAR subnet_addr[2]; + UCHAR port[2]; + UCHAR hops; + UCHAR filler[5]; +} TDI_ADDRESS_VNS, *PTDI_ADDRESS_VNS; + +#define TDI_ADDRESS_LENGTH_VNS sizeof(TDI_ADDRESS_VNS) + +typedef struct _TDI_ADDRESS_IP6 { + USHORT sin6_port; + ULONG sin6_flowinfo; + USHORT sin6_addr[8]; + ULONG sin6_scope_id; +} TDI_ADDRESS_IP6, *PTDI_ADDRESS_IP6; + +#define TDI_ADDRESS_LENGTH_IP6 sizeof(TDI_ADDRESS_IP6) + +enum eNameBufferType { + NBT_READONLY = 0, + NBT_WRITEONLY, + NBT_READWRITE, + NBT_WRITTEN +}; + +typedef struct _TDI_ADDRESS_NETBIOS_UNICODE_EX { + USHORT NetbiosNameType; + enum eNameBufferType NameBufferType; + UNICODE_STRING EndpointName; + UNICODE_STRING RemoteName; + WCHAR EndpointBuffer[17]; + WCHAR RemoteNameBuffer[1]; +} TDI_ADDRESS_NETBIOS_UNICODE_EX, *PTDI_ADDRESS_NETBIOS_UNICODE_EX; + +typedef struct _TA_APPLETALK_ADDR { + LONG TAAddressCount; + struct _AddrAtalk { + USHORT AddressLength; + USHORT AddressType; + TDI_ADDRESS_APPLETALK Address[1]; + } Address[1]; +} TA_APPLETALK_ADDRESS, *PTA_APPLETALK_ADDRESS; + +typedef struct _TA_ADDRESS_IP { + LONG TAAddressCount; + struct _AddrIp { + USHORT AddressLength; + USHORT AddressType; + TDI_ADDRESS_IP Address[1]; + } Address[1]; +} TA_IP_ADDRESS, *PTA_IP_ADDRESS; + +typedef struct _TA_ADDRESS_IPX { + LONG TAAddressCount; + struct _AddrIpx { + USHORT AddressLength; + USHORT AddressType; + TDI_ADDRESS_IPX Address[1]; + } Address[1]; +} TA_IPX_ADDRESS, *PTA_IPX_ADDRESS; + +typedef struct _TA_NETBIOS_ADDRESS { + LONG TAAddressCount; + struct _Addr{ + USHORT AddressLength; + USHORT AddressType; + TDI_ADDRESS_NETBIOS Address[1]; + } Address[1]; +} TA_NETBIOS_ADDRESS, *PTA_NETBIOS_ADDRESS; + +typedef struct _TA_ADDRESS_NS { + LONG TAAddressCount; + struct _AddrNs { + USHORT AddressLength; + USHORT AddressType; + TDI_ADDRESS_NS Address[1]; + } Address[1]; +} TA_NS_ADDRESS, *PTA_NS_ADDRESS; + +typedef struct _TA_ADDRESS_VNS { + LONG TAAddressCount; + struct _AddrVns { + USHORT AddressLength; + USHORT AddressType; + TDI_ADDRESS_VNS Address[1]; + } Address[1]; +} TA_VNS_ADDRESS, *PTA_VNS_ADDRESS; + +typedef struct _TA_ADDRESS_IP6 { + LONG TAAddressCount; + struct _AddrIp6 { + USHORT AddressLength; + USHORT AddressType; + TDI_ADDRESS_IP6 Address[1]; + } Address [1]; +} TA_IP6_ADDRESS, *PTA_IP6_ADDRESS; + +typedef struct _TA_ADDRESS_NETBIOS_UNICODE_EX { + LONG TAAddressCount; + struct _AddrNetbiosWCharEx { + USHORT AddressLength; + USHORT AddressType; + TDI_ADDRESS_NETBIOS_UNICODE_EX Address[1]; + } Address [1]; +} TA_NETBIOS_UNICODE_EX_ADDRESS, *PTA_NETBIOS_UNICODE_EX_ADDRESS; + +#include "poppack.h" #ifdef __cplusplus } diff --git a/reactos/w32api/include/ddk/video.h b/reactos/w32api/include/ddk/video.h index c4d4be87924..68a496a625c 100644 --- a/reactos/w32api/include/ddk/video.h +++ b/reactos/w32api/include/ddk/video.h @@ -95,7 +95,7 @@ typedef HW_DMA_RETURN if (VideoPortGetCurrentIrql() > 1 /* APC_LEVEL */) \ { \ VideoPortDebugPrint(Error, "Video: Pageable code called at IRQL %d\n", VideoPortGetCurrentIrql() ); \ - assert(FALSE); \ + ASSERT(FALSE); \ } #else diff --git a/reactos/w32api/include/ddk/winddk.h b/reactos/w32api/include/ddk/winddk.h index b90fe12e818..bda8b5318d9 100644 --- a/reactos/w32api/include/ddk/winddk.h +++ b/reactos/w32api/include/ddk/winddk.h @@ -3992,8 +3992,6 @@ RtlAssert( #endif /* DBG */ -#define assert ASSERT - /* ** Driver support routines @@ -5551,7 +5549,7 @@ ExVerifySuite( #define PAGED_CODE() { \ if (KeGetCurrentIrql() > APC_LEVEL) { \ KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \ - assert(FALSE); \ + ASSERT(FALSE); \ } \ } @@ -6764,7 +6762,7 @@ IoReuseIrp( _InvokeOnCancel) \ { \ PIO_STACK_LOCATION _IrpSp; \ - assert(_InvokeOnSuccess || _InvokeOnError || _InvokeOnCancel ? \ + ASSERT(_InvokeOnSuccess || _InvokeOnError || _InvokeOnCancel ? \ _CompletionRoutine != NULL : TRUE); \ _IrpSp = IoGetNextIrpStackLocation(_Irp); \ _IrpSp->CompletionRoutine = (PIO_COMPLETION_ROUTINE)(_CompletionRoutine); \ @@ -8008,10 +8006,10 @@ MmUnsecureVirtualMemory( #define MmPrepareMdlForReuse(_Mdl) \ { \ if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \ - assert(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \ + ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \ MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \ } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \ - assert(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \ + ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \ } \ } From 7d8bd23d04a9a57e65d787b7d7c187f73fe799a7 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Tue, 2 Mar 2004 17:16:04 +0000 Subject: [PATCH 0296/1463] assert -> ASSERT svn path=/trunk/; revision=8506 --- reactos/lib/rosrtl/thread/create.c | 4 ++-- reactos/lib/rosrtl/thread/stack.c | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/reactos/lib/rosrtl/thread/create.c b/reactos/lib/rosrtl/thread/create.c index 1783afe8b6a..04a357f9c77 100644 --- a/reactos/lib/rosrtl/thread/create.c +++ b/reactos/lib/rosrtl/thread/create.c @@ -1,4 +1,4 @@ -/* $Id: create.c,v 1.5 2003/08/07 03:32:00 royce Exp $ +/* $Id: create.c,v 1.6 2004/03/02 17:16:04 navaraf Exp $ */ /* */ @@ -85,7 +85,7 @@ RtlRosCreateUserThread /* failure */ l_Fail: - assert(!NT_SUCCESS(nErrCode)); + ASSERT(!NT_SUCCESS(nErrCode)); /* deallocate the stack */ RtlRosDeleteStack(ProcessHandle, &usUserStack); diff --git a/reactos/lib/rosrtl/thread/stack.c b/reactos/lib/rosrtl/thread/stack.c index ab28ea697a3..76f1aedd3af 100644 --- a/reactos/lib/rosrtl/thread/stack.c +++ b/reactos/lib/rosrtl/thread/stack.c @@ -1,4 +1,4 @@ -/* $Id: stack.c,v 1.5 2003/12/30 13:06:54 hbirr Exp $ +/* $Id: stack.c,v 1.6 2004/03/02 17:16:04 navaraf Exp $ */ /* */ @@ -125,8 +125,8 @@ NTSTATUS NTAPI RtlRosCreateStack /* failure */ if(!NT_SUCCESS(nErrCode)) goto l_Cleanup; - assert((*StackReserve - *StackCommit) >= PAGE_SIZE); - assert((*StackReserve - *StackCommit) % PAGE_SIZE == 0); + ASSERT((*StackReserve - *StackCommit) >= PAGE_SIZE); + ASSERT((*StackReserve - *StackCommit) % PAGE_SIZE == 0); pGuardBase = (PUCHAR)(UserStack->ExpandableStackLimit) - PAGE_SIZE; @@ -159,7 +159,7 @@ l_Cleanup: /* failure */ l_Fail: - assert(!NT_SUCCESS(nErrCode)); + ASSERT(!NT_SUCCESS(nErrCode)); return nErrCode; } From 5eed2db5ae3d5b0318466f41e835f8be983ef8d3 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Tue, 2 Mar 2004 17:20:36 +0000 Subject: [PATCH 0297/1463] Added import definitions for KefAcquireSpinLockAtDpcLevel and KefReleaseSpinLockFromDpcLevel. svn path=/trunk/; revision=8507 --- reactos/ntoskrnl/ntoskrnl.def | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/ntoskrnl.def b/reactos/ntoskrnl/ntoskrnl.def index e87dddeaeeb..9b0b0c3c1f6 100644 --- a/reactos/ntoskrnl/ntoskrnl.def +++ b/reactos/ntoskrnl/ntoskrnl.def @@ -1,4 +1,4 @@ -; $Id: ntoskrnl.def,v 1.174 2004/02/03 14:23:29 ekohl Exp $ +; $Id: ntoskrnl.def,v 1.175 2004/03/02 17:20:36 navaraf Exp $ ; ; reactos/ntoskrnl/ntoskrnl.def ; @@ -472,8 +472,8 @@ KeTickCount DATA KeWaitForMultipleObjects@32 KeWaitForMutexObject@20 KeWaitForSingleObject@20 -;@KefAcquireSpinLockAtDpcLevel -;@KefReleaseSpinLockFromDpcLevel +@KefAcquireSpinLockAtDpcLevel@4=KefAcquireSpinLockAtDpcLevel +@KefReleaseSpinLockFromDpcLevel@4=KefReleaseSpinLockFromDpcLevel ;Kei386EoiHelper @KiAcquireSpinLock@4 ;KiBugCheckData DATA From daaf2a72b81e4bb156bf7bcfcc21fa5ee07ef1ff Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Tue, 2 Mar 2004 18:18:15 +0000 Subject: [PATCH 0298/1463] - Build AFD, TCPIP and TDI with w32api headers. - Removed the old TDI headers from include/net. svn path=/trunk/; revision=8508 --- reactos/drivers/net/afd/afd/opnclose.c | 7 +- reactos/drivers/net/afd/afd/tdi.c | 48 + reactos/drivers/net/afd/include/afd.h | 7 +- reactos/drivers/net/afd/makefile | 4 +- reactos/drivers/net/ndis/include/ndissys.h | 15 +- reactos/drivers/net/ndis/ndis/50gone.c | 2 + reactos/drivers/net/ndis/ndis/main.c | 5 +- reactos/drivers/net/tcpip/datalink/lan.c | 6 +- reactos/drivers/net/tcpip/include/address.h | 3 +- reactos/drivers/net/tcpip/include/info.h | 4 + reactos/drivers/net/tcpip/include/ip.h | 2 + reactos/drivers/net/tcpip/include/tcpip.h | 6 +- reactos/drivers/net/tcpip/makefile | 4 +- reactos/drivers/net/tcpip/tcpip/address.c | 2 +- reactos/drivers/net/tcpip/tcpip/dispatch.c | 67 +- reactos/drivers/net/tcpip/tcpip/routines.c | 2 +- reactos/drivers/net/tdi/tdi/dereg.c | 4 +- reactos/drivers/net/tdi/tdi/handler.c | 4 +- reactos/drivers/net/tdi/tdi/stubs.c | 4 +- reactos/include/net/miniport.h | 851 -------------- reactos/include/net/ndis.h | 7 +- reactos/include/net/netevent.h | 42 - reactos/include/net/netpnp.h | 73 -- reactos/include/net/ntddtdi.h | 66 -- reactos/include/net/tdi.h | 641 ---------- reactos/include/net/tdiinfo.h | 253 ---- reactos/include/net/tdikrnl.h | 1173 ------------------- reactos/include/net/tdistat.h | 83 -- reactos/include/tcpmisc.h | 96 ++ reactos/lib/iphlpapi/ifenum_reactos.c | 2 +- reactos/lib/iphlpapi/iphlpapi_private.h | 6 +- reactos/lib/msafd/include/msafd.h | 2 +- 32 files changed, 257 insertions(+), 3234 deletions(-) delete mode 100644 reactos/include/net/miniport.h delete mode 100644 reactos/include/net/netevent.h delete mode 100644 reactos/include/net/netpnp.h delete mode 100644 reactos/include/net/ntddtdi.h delete mode 100644 reactos/include/net/tdi.h delete mode 100644 reactos/include/net/tdiinfo.h delete mode 100644 reactos/include/net/tdikrnl.h delete mode 100644 reactos/include/net/tdistat.h create mode 100644 reactos/include/tcpmisc.h diff --git a/reactos/drivers/net/afd/afd/opnclose.c b/reactos/drivers/net/afd/afd/opnclose.c index 57527360d09..f3bb929d8e2 100644 --- a/reactos/drivers/net/afd/afd/opnclose.c +++ b/reactos/drivers/net/afd/afd/opnclose.c @@ -143,8 +143,13 @@ AfdCreate( FCB->HelperContext = SocketInfo->HelperContext; FCB->NotificationEvents = SocketInfo->NotificationEvents; - if (RtlCreateUnicodeString(&FCB->TdiDeviceName, SocketInfo->TdiDeviceName.Buffer)) { + FCB->TdiDeviceName.Length = 0; + FCB->TdiDeviceName.MaximumLength = SocketInfo->TdiDeviceName.MaximumLength; + FCB->TdiDeviceName.Buffer = ExAllocatePool( + NonPagedPool, + FCB->TdiDeviceName.MaximumLength); + if (FCB->TdiDeviceName.Buffer) { RtlCopyUnicodeString(&FCB->TdiDeviceName, &SocketInfo->TdiDeviceName); AFD_DbgPrint(MAX_TRACE, ("TDI device name is (%wZ).\n", &FCB->TdiDeviceName)); diff --git a/reactos/drivers/net/afd/afd/tdi.c b/reactos/drivers/net/afd/afd/tdi.c index 6b69bf9a6a2..ad5602cc550 100644 --- a/reactos/drivers/net/afd/afd/tdi.c +++ b/reactos/drivers/net/afd/afd/tdi.c @@ -585,6 +585,54 @@ NTSTATUS TdiQueryDeviceControl( } +NTSTATUS TdiQueryInformation( + PFILE_OBJECT FileObject, + LONG QueryType, + PMDL MdlBuffer) +/* + * FUNCTION: Query for information + * ARGUMENTS: + * FileObject = Pointer to file object + * QueryType = Query type + * MdlBuffer = Pointer to MDL buffer specific for query type + * RETURNS: + * Status of operation + */ +{ + PDEVICE_OBJECT DeviceObject; + IO_STATUS_BLOCK Iosb; + NTSTATUS Status; + KEVENT Event; + PIRP Irp; + + DeviceObject = IoGetRelatedDeviceObject(FileObject); + + KeInitializeEvent(&Event, NotificationEvent, FALSE); + + Irp = TdiBuildInternalDeviceControlIrp(IOCTL_TCP_QUERY_INFORMATION, /* Sub function */ + DeviceObject, /* Device object */ + ConnectionObject, /* File object */ + &Event, /* Event */ + &Iosb); /* Status */ + if (!Irp) { + return STATUS_INSUFFICIENT_RESOURCES; + } + + TdiBuildQueryInformation( + Irp, + DeviceObject, + FileObject, + NULL, + NULL, + QueryType, + MdlBuffer); + + Status = TdiCall(Irp, DeviceObject, &Event, &Iosb); + + return Status; +} + + NTSTATUS TdiQueryInformationEx( PFILE_OBJECT FileObject, ULONG Entity, diff --git a/reactos/drivers/net/afd/include/afd.h b/reactos/drivers/net/afd/include/afd.h index b685487c261..3c1fcb3cf83 100644 --- a/reactos/drivers/net/afd/include/afd.h +++ b/reactos/drivers/net/afd/include/afd.h @@ -10,11 +10,14 @@ #include <winsock2.h> #include <ddk/ntddk.h> #include <ddk/ntifs.h> -#include <net/tdikrnl.h> -#include <net/tdiinfo.h> +#include <ddk/tdiinfo.h> +#include <ddk/tdikrnl.h> #include <afd/shared.h> #include <debug.h> +#define IP_MIB_STATS_ID 1 +#define IP_MIB_ADDRTABLE_ENTRY_ID 0x102 + /* Forward declarations */ struct _AFDFCB; diff --git a/reactos/drivers/net/afd/makefile b/reactos/drivers/net/afd/makefile index ee35ce2bf9b..5503939ca1b 100644 --- a/reactos/drivers/net/afd/makefile +++ b/reactos/drivers/net/afd/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.9 2004/02/07 04:50:44 arty Exp $ +# $Id: makefile,v 1.10 2004/03/02 18:18:13 navaraf Exp $ PATH_TO_TOP = ../../.. @@ -6,7 +6,7 @@ TARGET_TYPE = driver TARGET_NAME = afd -TARGET_CFLAGS = -I./include -DDBG -Werror -Wall +TARGET_CFLAGS = -I./include -DDBG -D__USE_W32API -Werror -Wall TARGET_OBJECTS = \ afd/afd.o \ diff --git a/reactos/drivers/net/ndis/include/ndissys.h b/reactos/drivers/net/ndis/include/ndissys.h index 40828718c31..80bd1158031 100644 --- a/reactos/drivers/net/ndis/include/ndissys.h +++ b/reactos/drivers/net/ndis/include/ndissys.h @@ -19,25 +19,12 @@ #include <ndis.h> #else /* _MSC_VER */ #include <ddk/ntddk.h> +#include <ddk/xfilter.h> #include <net/ndis.h> #endif /* _MSC_VER */ #include <debug.h> - -#ifndef _MSC_VER -/* FIXME: The following should be moved to ntddk.h */ - -/* - * ULONG MmGetMdlByteCount( - * IN PMDL Mdl) - */ -#define MmGetMdlByteCount(Mdl) \ - ((Mdl)->ByteCount) - -#endif - - /* Exported functions */ #ifdef _MSC_VER #define EXPORT __declspec(dllexport) diff --git a/reactos/drivers/net/ndis/ndis/50gone.c b/reactos/drivers/net/ndis/ndis/50gone.c index 59520699893..b9d27cfe2d9 100644 --- a/reactos/drivers/net/ndis/ndis/50gone.c +++ b/reactos/drivers/net/ndis/ndis/50gone.c @@ -451,6 +451,8 @@ NdisSetupDmaTransfer( } +#undef NdisUpdateSharedMemory + /* * @unimplemented */ diff --git a/reactos/drivers/net/ndis/ndis/main.c b/reactos/drivers/net/ndis/ndis/main.c index ff0d94b8938..53d6ebf6a99 100644 --- a/reactos/drivers/net/ndis/ndis/main.c +++ b/reactos/drivers/net/ndis/ndis/main.c @@ -89,10 +89,7 @@ NdisWriteErrorLogEntry( IN NDIS_HANDLE NdisAdapterHandle, IN NDIS_ERROR_CODE ErrorCode, IN ULONG NumberOfErrorValues, - IN ULONG ERROR_LOG_MAXIMUM_SIZE) -/* IN ULONG ...) - * ERROR_LOG_MAXIMUM_SIZE = ... in MSDN - */ + ...) /* * FUNCTION: Write a syslog error * ARGUMENTS: diff --git a/reactos/drivers/net/tcpip/datalink/lan.c b/reactos/drivers/net/tcpip/datalink/lan.c index f418b08076c..24a84d0fd6a 100644 --- a/reactos/drivers/net/tcpip/datalink/lan.c +++ b/reactos/drivers/net/tcpip/datalink/lan.c @@ -1037,9 +1037,9 @@ NTSTATUS LANRegisterProtocol( ProtChars.CloseAdapterCompleteHandler = ProtocolCloseAdapterComplete; ProtChars.ResetCompleteHandler = ProtocolResetComplete; ProtChars.RequestCompleteHandler = ProtocolRequestComplete; - ProtChars.u2.SendCompleteHandler = ProtocolSendComplete; - ProtChars.u3.TransferDataCompleteHandler = ProtocolTransferDataComplete; - ProtChars.u4.ReceiveHandler = ProtocolReceive; + ProtChars.SendCompleteHandler = ProtocolSendComplete; + ProtChars.TransferDataCompleteHandler = ProtocolTransferDataComplete; + ProtChars.ReceiveHandler = ProtocolReceive; ProtChars.ReceiveCompleteHandler = ProtocolReceiveComplete; ProtChars.StatusHandler = ProtocolStatus; ProtChars.StatusCompleteHandler = ProtocolStatusComplete; diff --git a/reactos/drivers/net/tcpip/include/address.h b/reactos/drivers/net/tcpip/include/address.h index 555c95af356..d3febb8f9e5 100644 --- a/reactos/drivers/net/tcpip/include/address.h +++ b/reactos/drivers/net/tcpip/include/address.h @@ -73,8 +73,7 @@ PADDRESS_FILE AddrSearchFirst( PADDRESS_FILE AddrSearchNext( PAF_SEARCH SearchContext); -ULONG inet_addr( - PCSTR AddrString); +unsigned long PASCAL inet_addr(const char*); #endif /* __ADDRESS_H */ diff --git a/reactos/drivers/net/tcpip/include/info.h b/reactos/drivers/net/tcpip/include/info.h index a1b4f679ac4..948d13787a7 100644 --- a/reactos/drivers/net/tcpip/include/info.h +++ b/reactos/drivers/net/tcpip/include/info.h @@ -45,9 +45,13 @@ typedef struct IPADDR_ENTRY { } IPADDR_ENTRY, *PIPADDR_ENTRY; #define IP_MIB_STATS_ID 1 +#ifndef IP_MIB_ADDRTABLE_ENTRY_ID #define IP_MIB_ADDRTABLE_ENTRY_ID 0x102 +#endif +#ifndef MAX_PHYSADDR_SIZE #define MAX_PHYSADDR_SIZE 8 +#endif /* Only UDP is supported */ diff --git a/reactos/drivers/net/tcpip/include/ip.h b/reactos/drivers/net/tcpip/include/ip.h index 7c8be7189a4..e7e6983ad90 100644 --- a/reactos/drivers/net/tcpip/include/ip.h +++ b/reactos/drivers/net/tcpip/include/ip.h @@ -184,7 +184,9 @@ typedef VOID (*IP_PROTOCOL_HANDLER)( #define LOOPBACK_ADDRMASK_IPv4 ((IPv4_RAW_ADDRESS)DH2N(0xFFFFFF00)) /* Protocol definitions */ +#ifndef IPPROTO_RAW #define IPPROTO_RAW 0 /* Raw IP */ +#endif #define IPPROTO_ICMP 1 /* Internet Control Message Protocol */ #define IPPROTO_IGMP 2 /* Internet Group Management Protocol */ #define IPPROTO_TCP 6 /* Transmission Control Protocol */ diff --git a/reactos/drivers/net/tcpip/include/tcpip.h b/reactos/drivers/net/tcpip/include/tcpip.h index 20876f50ebe..6a4de2ccdf9 100644 --- a/reactos/drivers/net/tcpip/include/tcpip.h +++ b/reactos/drivers/net/tcpip/include/tcpip.h @@ -23,9 +23,9 @@ #include <tdiinfo.h> #else #include <ddk/ntddk.h> -#include <net/ndis.h> -#include <net/tdikrnl.h> -#include <net/tdiinfo.h> +#include <ddk/ndis.h> +#include <ddk/tdikrnl.h> +#include <ddk/tdiinfo.h> #endif #include <debug.h> diff --git a/reactos/drivers/net/tcpip/makefile b/reactos/drivers/net/tcpip/makefile index 3e85e8fe05d..2a501cb50c9 100644 --- a/reactos/drivers/net/tcpip/makefile +++ b/reactos/drivers/net/tcpip/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.14 2004/02/22 09:59:17 chorns Exp $ +# $Id: makefile,v 1.15 2004/03/02 18:18:14 navaraf Exp $ PATH_TO_TOP = ../../.. @@ -8,7 +8,7 @@ TARGET_TYPE = export_driver TARGET_NAME = tcpip -TARGET_CFLAGS = -I./include -DDBG=1 -DNDIS40 +TARGET_CFLAGS = -I./include -DDBG=1 -DNDIS40 -D__USE_W32API TARGET_DDKLIBS = ndis.a diff --git a/reactos/drivers/net/tcpip/tcpip/address.c b/reactos/drivers/net/tcpip/tcpip/address.c index 96962d59fec..76f032fb9d2 100644 --- a/reactos/drivers/net/tcpip/tcpip/address.c +++ b/reactos/drivers/net/tcpip/tcpip/address.c @@ -414,7 +414,7 @@ PADDRESS_FILE AddrSearchNext( return NULL; } -ULONG inet_addr(PCSTR AddrString) +unsigned long PASCAL inet_addr(const char *AddrString) /* * Convert an ansi string dotted-quad address to a ulong * NOTES: diff --git a/reactos/drivers/net/tcpip/tcpip/dispatch.c b/reactos/drivers/net/tcpip/tcpip/dispatch.c index 7e91f53770e..c3cfd162e6f 100644 --- a/reactos/drivers/net/tcpip/tcpip/dispatch.c +++ b/reactos/drivers/net/tcpip/tcpip/dispatch.c @@ -444,9 +444,74 @@ NTSTATUS DispTdiDisconnect( * Status of operation */ { + PTDI_REQUEST_KERNEL_QUERY_INFORMATION Parameters; + PTRANSPORT_CONTEXT TranContext; + PIO_STACK_LOCATION IrpSp; + TI_DbgPrint(DEBUG_IRP, ("Called.\n")); - return STATUS_NOT_IMPLEMENTED; + IrpSp = IoGetCurrentIrpStackLocation(Irp); + Parameters = (PTDI_REQUEST_KERNEL_QUERY_INFORMATION)&IrpSp->Parameters; + + TranContext = IrpSp->FileObject->FsContext; + if (!TranContext) { + TI_DbgPrint(MID_TRACE, ("Bad transport context.\n")); + return STATUS_INVALID_CONNECTION; + } + + switch (Parameters->QueryType) + { + case TDI_QUERY_ADDRESS_INFO: + { + PTDI_ADDRESS_INFO AddressInfo; + PADDRESS_FILE AddrFile; + PTA_IP_ADDRESS Address; + + AddressInfo = (PTDI_ADDRESS_INFO)MmGetSystemAddressForMdl(Irp->MdlAddress); + + switch ((ULONG)IrpSp->FileObject->FsContext2) { + case TDI_TRANSPORT_ADDRESS_FILE: + AddrFile = (PADDRESS_FILE)TranContext->Handle.AddressHandle; + break; + + case TDI_CONNECTION_FILE: + AddrFile = ((PCONNECTION_ENDPOINT)TranContext->Handle.ConnectionContext)->AddressFile; + break; + + default: + TI_DbgPrint(MIN_TRACE, ("Invalid transport context\n")); + return STATUS_INVALID_PARAMETER; + } + + if (!AddrFile) { + TI_DbgPrint(MID_TRACE, ("No address file object.\n")); + return STATUS_INVALID_PARAMETER; + } + + if (MmGetMdlByteCount(Irp->MdlAddress) < + (sizeof(TDI_ADDRESS_INFO) + sizeof(TDI_ADDRESS_IP))) { + TI_DbgPrint(MID_TRACE, ("MDL buffer too small.\n")); + return STATUS_BUFFER_OVERFLOW; + } + + /* FIXME: Is this count really the one we should return? */ + AddressInfo->ActivityCount = AddrFile->RefCount; + + Address = (PTA_IP_ADDRESS)&AddressInfo->Address; + Address->TAAddressCount = 1; + Address->Address[0].AddressLength = TDI_ADDRESS_LENGTH_IP; + Address->Address[0].AddressType = TDI_ADDRESS_TYPE_IP; + Address->Address[0].Address[0].sin_port = AddrFile->Port; + Address->Address[0].Address[0].in_addr = AddrFile->ADE->Address->Address.IPv4Address; + RtlZeroMemory( + &Address->Address[0].Address[0].sin_zero, + sizeof(Address->Address[0].Address[0].sin_zero)); + + return STATUS_SUCCESS; + } + } + + return STATUS_NOT_IMPLEMENTED; } diff --git a/reactos/drivers/net/tcpip/tcpip/routines.c b/reactos/drivers/net/tcpip/tcpip/routines.c index b786a6c7a53..a45223ec1c4 100644 --- a/reactos/drivers/net/tcpip/tcpip/routines.c +++ b/reactos/drivers/net/tcpip/tcpip/routines.c @@ -341,7 +341,7 @@ UINT CopyPacketToBufferChain( return 0; /* Skip SrcOffset bytes in the source packet */ - NdisGetFirstBufferFromPacket(SrcPacket, &SrcBuffer, (PVOID)&SrcData, &SrcSize, &Total); + NdisGetFirstBufferFromPacket(SrcPacket, &SrcBuffer, &SrcData, &SrcSize, &Total); if (SkipToOffset(SrcBuffer, SrcOffset, &SrcData, &SrcSize) == -1) return 0; diff --git a/reactos/drivers/net/tdi/tdi/dereg.c b/reactos/drivers/net/tdi/tdi/dereg.c index 946ca883c79..db43cf6e91c 100644 --- a/reactos/drivers/net/tdi/tdi/dereg.c +++ b/reactos/drivers/net/tdi/tdi/dereg.c @@ -1,8 +1,8 @@ -/* $Id: dereg.c,v 1.7 2004/01/28 20:55:50 ekohl Exp $ +/* $Id: dereg.c,v 1.8 2004/03/02 18:18:14 navaraf Exp $ * */ #include <ddk/ntddk.h> -#include <net/tdi.h> +#include <ddk/tdi.h> /* De-/Register Action IDs for TdiDeRegister */ diff --git a/reactos/drivers/net/tdi/tdi/handler.c b/reactos/drivers/net/tdi/tdi/handler.c index cb3d35fe2be..439f8a55db2 100644 --- a/reactos/drivers/net/tdi/tdi/handler.c +++ b/reactos/drivers/net/tdi/tdi/handler.c @@ -1,9 +1,9 @@ -/* $Id: handler.c,v 1.6 2004/01/28 20:55:50 ekohl Exp $ +/* $Id: handler.c,v 1.7 2004/03/02 18:18:14 navaraf Exp $ * * DESCRIPTION: Default TDI event handlers. */ #include <ddk/ntddk.h> -#include <net/tdi.h> +#include <ddk/tdi.h> /* diff --git a/reactos/drivers/net/tdi/tdi/stubs.c b/reactos/drivers/net/tdi/tdi/stubs.c index 3c212b8f272..0ae3de6ca31 100644 --- a/reactos/drivers/net/tdi/tdi/stubs.c +++ b/reactos/drivers/net/tdi/tdi/stubs.c @@ -1,9 +1,9 @@ -/* $Id: stubs.c,v 1.8 2004/01/28 20:55:50 ekohl Exp $ +/* $Id: stubs.c,v 1.9 2004/03/02 18:18:14 navaraf Exp $ * */ #include <ddk/ntddk.h> -#include <net/tdi.h> +#include <ddk/tdi.h> /* * @unimplemented diff --git a/reactos/include/net/miniport.h b/reactos/include/net/miniport.h deleted file mode 100644 index 68622921ba6..00000000000 --- a/reactos/include/net/miniport.h +++ /dev/null @@ -1,851 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS NDIS library - * FILE: include/net/miniport.h - * PURPOSE: Type definitions available only to NDIS miniport drivers - */ -#if 0 -#ifndef __MINIPORT_H -#define __MINIPORT_H - -#ifdef _MSC_VER -#include <ntstatus.h> -#else /* _MSC_VER */ -#include <ddk/status.h> -#endif /* _MSC_VER */ - -/* Base types */ - -#define IN -#define OUT -#define OPTIONAL - -#define ANYSIZE_ARRAY 1 - -#define CONST const - -#ifdef _MSC_VER - -#ifdef i386 -#define STDCALL _stdcall -#define CDECL _cdecl -#else /* i386 */ -#define STDCALL -#define CDECL -#endif /* i386 */ - -#else /* _MSC_VER */ - -#ifdef i386 -#define STDCALL __attribute__ ((stdcall)) -#define CDECL __attribute__ ((cdecl)) -#else /* i386 */ -#define STDCALL -#define CDECL -#endif /* i386 */ - -#endif /* _MSC_VER */ - -typedef void VOID, *PVOID; -typedef char CHAR, *PCHAR; -typedef unsigned char UCHAR, *PUCHAR; -typedef short SHORT, *PSHORT; -typedef unsigned short USHORT, *PUSHORT; -typedef long LONG,*PLONG; -typedef unsigned long ULONG,*PULONG; -typedef double DOUBLE, *PDOUBLE; -typedef struct _QUAD { - double DoNotUseThisField; -} QUAD,*PQUAD; -typedef QUAD UQUAD, *PUQUAD; -typedef signed int INT, *PINT; -typedef unsigned int UINT, *PUINT; -typedef double LONGLONG, *PLONGLONG; -typedef double ULONGLONG, *PULONGLONG; - -typedef UCHAR BOOLEAN, *PBOOLEAN; -typedef ULONG DWORD, *PDWORD; - -/* Cardinal types */ -typedef CHAR CCHAR, *PCCHAR; -typedef SHORT CSHORT, *PCSHORT; -typedef ULONG CLONG, *PCLONG; - -/* UNICODE (wide character) types */ -#ifndef __cplusplus -typedef short unsigned int wchar_t; -#endif /* __cplusplus */ -typedef wchar_t WCHAR; -typedef WCHAR *PWCHAR; -typedef WCHAR *LPWCH, *PWCH; -typedef CONST WCHAR *LPCWCH, *PCWCH; -typedef WCHAR *NWPSTR; -typedef WCHAR *LPWSTR, *PWSTR; -typedef CONST WCHAR *LPCWSTR, *PCWSTR; - -/* ANSI (multi-byte character) types */ -typedef CHAR *LPCH, *PCH; -typedef CONST CHAR *LPCCH, *PCCH; -typedef CHAR *NPSTR; -typedef CHAR *LPSTR, *PSTR; -typedef CONST CHAR *LPCSTR, *PCSTR; - -/* Neutral ANSI/UNICODE types */ -#ifdef UNICODE - -typedef WCHAR TCHAR, *PTCHAR; -typedef WCHAR TUCHAR, *PTUCHAR; - -typedef LPWSTR LPTCH, PTCH; -typedef LPWSTR PTSTR, LPTSTR; -typedef LPCWSTR LPCTSTR; -typedef LPWSTR LP; -#define _TEXT(string) L##string -#define _T(string) L##string - -#else /* UNICODE */ - -typedef CHAR TCHAR, *PTCHAR; -typedef UCHAR TUCHAR, *PTUCHAR; - -typedef LPSTR LPTCH, PTCH; -typedef LPSTR PTSTR, LPTSTR; -typedef LPCSTR LPCTSTR; -#define _TEXT(string) string -#define _T(string) string - -#endif /* UNICODE */ - -#define TEXT(string) __TEXT(string) - - -typedef union _LARGE_INTEGER { - struct { - ULONG LowPart; - LONG HighPart; - }; - struct { - ULONG LowPart; - LONG HighPart; - } u; - LONGLONG QuadPart; -} LARGE_INTEGER; - -typedef LARGE_INTEGER *PLARGE_INTEGER; - -typedef union _ULARGE_INTEGER { - struct { - ULONG LowPart; - ULONG HighPart; - }; - struct { - ULONG LowPart; - ULONG HighPart; - } u; - ULONGLONG QuadPart; -} ULARGE_INTEGER; - -typedef ULARGE_INTEGER *PULARGE_INTEGER; - - -typedef LARGE_INTEGER PHYSICAL_ADDRESS, *PPHYSICAL_ADDRESS; - - - -/* NT status type and macros for checking status */ -typedef LONG NTSTATUS; -typedef NTSTATUS *PNTSTATUS; - -#ifdef _MSC_VER -#define NT_SUCCESS(Status) ((ULONG)(Status) >= 0) -#endif /* _MSC_VER */ -#define NT_INFORMATION(Status) ((ULONG)(Status) >> 30 == 1) -#define NT_WARNING(Status) ((ULONG)(Status) >> 30 == 2) -#define NT_ERROR(Status) ((ULONG)(Status) >> 30 == 3) - -#define APPLICATION_ERROR_MASK 0x20000000 -#define ERROR_SEVERITY_SUCCESS 0x00000000 -#define ERROR_SEVERITY_INFORMATIONAL 0x40000000 -#define ERROR_SEVERITY_WARNING 0x80000000 -#define ERROR_SEVERITY_ERROR 0xC0000000 - - - -/* Basic constants */ - -#define FALSE 0 -#define TRUE 1 - -#define NULL ((PVOID)0) - - - -/* Counted strings */ - -typedef struct _STRING -{ - USHORT Length; - USHORT MaximumLength; - PCHAR Buffer; -} STRING, *PSTRING; - -typedef STRING ANSI_STRING, *PANSI_STRING; -typedef STRING OEM_STRING, *POEM_STRING; - -#define ANSI_NULL ((CHAR)0) - -typedef struct _CSTRING -{ - USHORT Length; - USHORT MaximumLength; - CONST CHAR *Buffer; -} CSTRING, *PCSTRING; - -typedef CSTRING CANSI_STRING, *PCANSI_STRING; - - -typedef struct _UNICODE_STRING -{ - USHORT Length; - USHORT MaximumLength; - PWSTR Buffer; -} UNICODE_STRING, *PUNICODE_STRING; - -typedef struct _CUNICODE_STRING -{ - USHORT Length; - USHORT MaximumLength; - CONST PWSTR Buffer; -} CUNICODE_STRING, *PCUNICODE_STRING; - -#define UNICODE_NULL ((WCHAR)0) - - - -/* Linked lists */ - -typedef struct _LIST_ENTRY -{ - struct _LIST_ENTRY *Flink; - struct _LIST_ENTRY *Blink; -} LIST_ENTRY, *PLIST_ENTRY; - -typedef struct _SINGLE_LIST_ENTRY -{ - struct _SINGLE_LIST_ENTRY *Next; -} SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY; - - -/* - * VOID InitializeListHead( - * PLIST_ENTRY ListHead); - */ -#define InitializeListHead(ListHead) \ -{ \ - (ListHead)->Flink = (ListHead); \ - (ListHead)->Blink = (ListHead); \ -} - - -/* - * VOID InsertHeadList( - * LIST_ENTRY ListHead, - * PLIST_ENTRY Entry); - */ -#define InsertHeadList(ListHead, ListEntry) \ -{ \ - PLIST_ENTRY OldFlink; \ - OldFlink = (ListHead)->Flink; \ - (ListEntry)->Flink = OldFlink; \ - (ListEntry)->Blink = (ListHead); \ - OldFlink->Blink = (ListEntry); \ - (ListHead)->Flink = (ListEntry); \ -} - - -/* - * VOID InsertTailList( - * PLIST_ENTRY ListHead, - * PLIST_ENTRY Entry); - */ -#define InsertTailList(ListHead, ListEntry) \ -{ \ - PLIST_ENTRY OldBlink; \ - OldBlink = (ListHead)->Blink; \ - (ListEntry)->Flink = (ListHead); \ - (ListEntry)->Blink = OldBlink; \ - OldBlink->Flink = (ListEntry); \ - (ListHead)->Blink = (ListEntry); \ -} - -/* - * BOOLEAN IsListEmpty( - * PLIST_ENTRY ListHead); - */ -#define IsListEmpty(ListHead) \ - ((ListHead)->Flink == (ListHead)) - - -/* - * PSINGLE_LIST_ENTRY PopEntryList( - * PSINGLE_LIST_ENTRY ListHead); - */ -#define PopEntryList(ListHead) \ - (ListHead)->Next; \ -{ \ - PSINGLE_LIST_ENTRY FirstEntry; \ - \ - FirstEntry = (ListHead)->Next; \ - if (FirstEntry != NULL) \ - { \ - (ListHead)->Next = FirstEntry->Next; \ - } \ -} - - -/* - * VOID PushEntryList( - * PSINGLE_LIST_ENTRY ListHead, - * PSINGLE_LIST_ENTRY Entry); - */ -#define PushEntryList(ListHead, Entry) \ - (Entry)->Next = (ListHead)->Next; \ - (ListHead)->Next = (Entry) - - -/* - * VOID RemoveEntryList( - * PLIST_ENTRY Entry); - */ -#define RemoveEntryList(ListEntry) \ -{ \ - PLIST_ENTRY OldFlink; \ - PLIST_ENTRY OldBlink; \ - OldFlink = (ListEntry)->Flink; \ - OldBlink = (ListEntry)->Blink; \ - OldFlink->Blink = OldBlink; \ - OldBlink->Flink = OldFlink; \ -} - - -/* - * PLIST_ENTRY RemoveHeadList( - * PLIST_ENTRY ListHead); - */ -#define RemoveHeadList(ListHead) \ - (ListHead)->Flink; \ -{ \ - RemoveEntryList((ListHead)->Flink) \ -} - - -/* - * PLIST_ENTRY RemoveTailList( - * PLIST_ENTRY ListHead); - */ -#define RemoveTailList(ListHead) \ - (ListHead)->Blink; \ -{ \ - RemoveEntryList((ListHead)->Blink) \ -} - - -/* Hardware */ - -typedef UCHAR KIRQL, *PKIRQL; - -typedef struct _KSPIN_LOCK -{ - ULONG Lock; -} KSPIN_LOCK, *PKSPIN_LOCK; - - -typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT; -typedef struct _DEVICE_OBJECT *PDEVICE_OBJECT; -typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT; -typedef struct _FILE_OBJECT *PFILE_OBJECT; - -typedef struct _KINTERRUPT *PKINTERRUPT; - - -/* Memory Descriptor List */ -typedef struct _MDL { - struct _MDL *Next; - CSHORT Size; - CSHORT MdlFlags; - struct _EPROCESS *Process; - PVOID MappedSystemVa; - PVOID StartVa; - ULONG ByteCount; - ULONG ByteOffset; -} MDL, *PMDL; - -#define MDL_MAPPED_TO_SYSTEM_VA 0x0001 -#define MDL_PAGES_LOCKED 0x0002 -#define MDL_SOURCE_IS_NONPAGED_POOL 0x0004 -#define MDL_ALLOCATED_FIXED_SIZE 0x0008 -#define MDL_PARTIAL 0x0010 -#define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020 -#define MDL_IO_PAGE_READ 0x0040 -#define MDL_WRITE_OPERATION 0x0080 -#define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100 -#define MDL_LOCK_HELD 0x0200 -#define MDL_PHYSICAL_VIEW 0x0400 -#define MDL_IO_SPACE 0x0800 -#define MDL_NETWORK_HEADER 0x1000 -#define MDL_MAPPING_CAN_FAIL 0x2000 -#define MDL_ALLOCATED_MUST_SUCCEED 0x4000 - - -#define MDL_MAPPING_FLAGS (MDL_MAPPED_TO_SYSTEM_VA | \ - MDL_PAGES_LOCKED | \ - MDL_SOURCE_IS_NONPAGED_POOL | \ - MDL_PARTIAL_HAS_BEEN_MAPPED | \ - MDL_PARENT_MAPPED_SYSTEM_VA | \ - MDL_LOCK_HELD | \ - MDL_SYSTEM_VA | \ - MDL_IO_SPACE ) - - -typedef struct _DISPATCHER_HEADER -{ - UCHAR Type; - UCHAR Absolute; - UCHAR Size; - UCHAR Inserted; - LONG SignalState; - LIST_ENTRY WaitListHead; -} DISPATCHER_HEADER; - -typedef struct _KEVENT -{ - DISPATCHER_HEADER Header; -} KEVENT, *PKEVENT; - - -typedef struct _KTIMER -{ - DISPATCHER_HEADER Header; - ULARGE_INTEGER DueTime; - LIST_ENTRY TimerListEntry; - struct _KDPC *Dpc; - LONG Period; -} KTIMER, *PKTIMER; - - -typedef enum _KDPC_IMPORTANCE -{ - LowImportance, - MediumImportance, - HighImportance -} KDPC_IMPORTANCE; - -/* Forward declaration */ -struct _KDPC; - -typedef VOID (*PKDEFERRED_ROUTINE)( - IN struct _KDPC *Dpc, - IN PVOID DeferredContext, - IN PVOID SystemArgument1, - IN PVOID SystemArgument2); - -/* Deferred Procedure Call */ - -typedef struct _KDPC { - CSHORT Type; - UCHAR Number; - UCHAR Importance; - LIST_ENTRY DpcListEntry; - PKDEFERRED_ROUTINE DeferredRoutine; - PVOID DeferredContext; - PVOID SystemArgument1; - PVOID SystemArgument2; - PULONG Lock; -} KDPC, *PKDPC; - - -typedef enum _INTERFACE_TYPE -{ - InterfaceTypeUndefined = -1, - Internal, - Isa, - Eisa, - MicroChannel, - TurboChannel, - PCIBus, - VMEBus, - NuBus, - PCMCIABus, - CBus, - MPIBus, - MPSABus, - ProcessorInternal, - InternalPowerBus, - PNPISABus, - MaximumInterfaceType -} INTERFACE_TYPE, *PINTERFACE_TYPE; - - -typedef enum _DMA_WIDTH -{ - Width8Bits, - Width16Bits, - Width32Bits, - MaximumDmaWidth -} DMA_WIDTH, *PDMA_WIDTH; - -typedef enum _DMA_SPEED -{ - Compatible, - TypeA, - TypeB, - TypeC, - TypeF, - MaximumDmaSpeed -} DMA_SPEED, *PDMA_SPEED; - - -typedef enum _KINTERRUPT_MODE -{ - LevelSensitive, - Latched -} KINTERRUPT_MODE; - - -typedef struct _DMA_CONFIGURATION_BYTE0 -{ - UCHAR Channel:3; - UCHAR Reserved:3; - UCHAR Shared:1; - UCHAR MoreEntries:1; -} DMA_CONFIGURATION_BYTE0; - -typedef struct _DMA_CONFIGURATION_BYTE1 -{ - UCHAR Reserved0:2; - UCHAR TransferSize:2; - UCHAR Timing:2; - UCHAR Reserved1:2; -} DMA_CONFIGURATION_BYTE1; - - -typedef struct _CM_MCA_POS_DATA -{ - USHORT AdapterId; - UCHAR PosData1; - UCHAR PosData2; - UCHAR PosData3; - UCHAR PosData4; -} CM_MCA_POS_DATA, *PCM_MCA_POS_DATA; - -typedef struct _EISA_MEMORY_TYPE -{ - UCHAR ReadWrite:1; - UCHAR Cached:1; - UCHAR Reserved0:1; - UCHAR Type:2; - UCHAR Shared:1; - UCHAR Reserved1:1; - UCHAR MoreEntries:1; -} EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE; - -typedef struct _EISA_MEMORY_CONFIGURATION -{ - EISA_MEMORY_TYPE ConfigurationByte; - UCHAR DataSize; - USHORT AddressLowWord; - UCHAR AddressHighByte; - USHORT MemorySize; -} EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION; - - -typedef struct _EISA_IRQ_DESCRIPTOR -{ - UCHAR Interrupt:4; - UCHAR Reserved:1; - UCHAR LevelTriggered:1; - UCHAR Shared:1; - UCHAR MoreEntries:1; -} EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR; - -typedef struct _EISA_IRQ_CONFIGURATION -{ - EISA_IRQ_DESCRIPTOR ConfigurationByte; - UCHAR Reserved; -} EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION; - -typedef struct _EISA_DMA_CONFIGURATION -{ - DMA_CONFIGURATION_BYTE0 ConfigurationByte0; - DMA_CONFIGURATION_BYTE1 ConfigurationByte1; -} EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION; - - -typedef struct _EISA_PORT_DESCRIPTOR -{ - UCHAR NumberPorts:5; - UCHAR Reserved:1; - UCHAR Shared:1; - UCHAR MoreEntries:1; -} EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR; - -typedef struct _EISA_PORT_CONFIGURATION -{ - EISA_PORT_DESCRIPTOR Configuration; - USHORT PortAddress; -} EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION; - -typedef struct _CM_EISA_SLOT_INFORMATION -{ - UCHAR ReturnCode; - UCHAR ReturnFlags; - UCHAR MajorRevision; - UCHAR MinorRevision; - USHORT Checksum; - UCHAR NumberFunctions; - UCHAR FunctionInformation; - ULONG CompressedId; -} CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION; - -typedef struct _CM_EISA_FUNCTION_INFORMATION -{ - ULONG CompressedId; - UCHAR IdSlotFlags1; - UCHAR IdSlotFlags2; - UCHAR MinorRevision; - UCHAR MajorRevision; - UCHAR Selections[26]; - UCHAR FunctionFlags; - UCHAR TypeString[80]; - EISA_MEMORY_CONFIGURATION EisaMemory[9]; - EISA_IRQ_CONFIGURATION EisaIrq[7]; - EISA_DMA_CONFIGURATION EisaDma[4]; - EISA_PORT_CONFIGURATION EisaPort[20]; - UCHAR InitializationData[60]; -} CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION; - - -typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR -{ - UCHAR Type; - UCHAR ShareDisposition; - USHORT Flags; - union { - struct { - PHYSICAL_ADDRESS Start; - ULONG Length; - } Generic; - - struct { - PHYSICAL_ADDRESS Start; - ULONG Length; - } Port; - - struct { - ULONG Level; - ULONG Vector; - ULONG Affinity; - } Interrupt; - - struct { - PHYSICAL_ADDRESS Start; - ULONG Length; - } Memory; - - struct { - ULONG Channel; - ULONG Port; - ULONG Reserved1; - } Dma; - - struct { - ULONG Data[3]; - } DevicePrivate; - - struct { - ULONG Start; - ULONG Length; - ULONG Reserved; - } BusNumber; - - struct { - ULONG DataSize; - ULONG Reserved1; - ULONG Reserved2; - } DeviceSpecificData; - } u; -} CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR; - -typedef struct _CM_PARTIAL_RESOURCE_LIST -{ - USHORT Version; - USHORT Revision; - ULONG Count; - CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1]; -} CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST; - -typedef struct _CM_FULL_RESOURCE_DESCRIPTOR -{ - INTERFACE_TYPE InterfaceType; - ULONG BusNumber; - CM_PARTIAL_RESOURCE_LIST PartialResourceList; -} CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR; - -typedef struct _CM_RESOURCE_LIST -{ - ULONG Count; - CM_FULL_RESOURCE_DESCRIPTOR List[1]; -} CM_RESOURCE_LIST, *PCM_RESOURCE_LIST; - - - -/* Operating System services */ - -/* Debugging */ - -ULONG CDECL DbgPrint( - PCH Format, - ...); - -#ifdef DBG - -VOID -STDCALL -RtlAssert( - PVOID FailedAssertion, - PVOID FileName, - ULONG LineNumber, - PCHAR Message); - -#define ASSERT(exp) \ - if (!(exp)) \ - RtlAssert(#exp, __FILE__, __LINE__, NULL) - -#define ASSERTMSG(msg, exp) \ - if (!(exp)) \ - RtlAssert(#exp, __FILE__, __LINE__, msg) - -#else /* DBG */ - -#define ASSERT(exp) -#define ASSERTMSG(msg, exp) - -#endif /* DBG */ - - -/* Runtime library */ - -#define RtlEqualMemory(Destination,Source,Length) (!memcmp((Destination), (Source), (Length))) -#define RtlMoveMemory(Destination,Source,Length) memmove((Destination), (Source), (Length)) -#define RtlCopyMemory(Destination,Source,Length) memcpy((Destination), (Source), (Length)) -#define RtlFillMemory(Destination,Length,Fill) memset((Destination), (Fill),(Length)) -#define RtlZeroMemory(Destination,Length) memset((Destination), 0, (Length)) - - -/* Core kernel functions */ - -VOID -STDCALL -KeStallExecutionProcessor( - ULONG MicroSeconds); - - -/* I/O functions */ - -VOID -STDCALL -READ_PORT_BUFFER_UCHAR( - PUCHAR Port, - PUCHAR Value, - ULONG Count); - -VOID -STDCALL -READ_PORT_BUFFER_ULONG( - PULONG Port, - PULONG Value, - ULONG Count); - -VOID -STDCALL -READ_PORT_BUFFER_USHORT( - PUSHORT Port, - PUSHORT Value, - ULONG Count); - -UCHAR -STDCALL -READ_PORT_UCHAR( - PUCHAR Port); - -ULONG -STDCALL -READ_PORT_ULONG( - PULONG Port); - -USHORT -STDCALL -READ_PORT_USHORT( - PUSHORT Port); - -VOID -STDCALL -WRITE_PORT_BUFFER_UCHAR( - PUCHAR Port, - PUCHAR Value, - ULONG Count); - -VOID -STDCALL -WRITE_PORT_BUFFER_ULONG( - PULONG Port, - PULONG Value, - ULONG Count); - -VOID -STDCALL -WRITE_PORT_BUFFER_USHORT( - PUSHORT Port, - PUSHORT Value, - ULONG Count); - -VOID -STDCALL -WRITE_PORT_UCHAR( - PUCHAR Port, - UCHAR Value); - -VOID -STDCALL -WRITE_PORT_ULONG( - PULONG Port, - ULONG Value); - -VOID -STDCALL -WRITE_PORT_USHORT( - PUSHORT Port, - USHORT Value); - -VOID -STDCALL -WRITE_REGISTER_UCHAR( - PUCHAR Register, - UCHAR Value); - -VOID -STDCALL -WRITE_REGISTER_ULONG( - PULONG Register, - ULONG Value); - -VOID -STDCALL -WRITE_REGISTER_USHORT( - PUSHORT Register, - USHORT Value); - -#endif /* __MINIPORT_H */ - -/* EOF */ -#endif diff --git a/reactos/include/net/ndis.h b/reactos/include/net/ndis.h index 4b1fedf9e4a..79d2fdb043e 100644 --- a/reactos/include/net/ndis.h +++ b/reactos/include/net/ndis.h @@ -52,7 +52,7 @@ extern "C" { #include "ntddk.h" #include "ntddndis.h" -#include "netpnp.h" +#include <ddk/netpnp.h> #ifdef NDIS50 #undef NDIS40 @@ -2626,10 +2626,7 @@ NdisWriteErrorLogEntry( IN NDIS_HANDLE NdisAdapterHandle, IN NDIS_ERROR_CODE ErrorCode, IN ULONG NumberOfErrorValues, - IN ULONG ERROR_LOG_MAXIMUM_SIZE); -/* IN ULONG ...); - * ERROR_LOG_MAXIMUM_SIZE = ... in MSDN - */ + ...); /* * VOID diff --git a/reactos/include/net/netevent.h b/reactos/include/net/netevent.h deleted file mode 100644 index 0cf66e03217..00000000000 --- a/reactos/include/net/netevent.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * netevent.h - * - * Network events - * - * This file is part of the w32api package. - * - * Contributors: - * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> - * - * 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 __NETEVENT_H -#define __NETEVENT_H - -#if __GNUC__ >=3 -#pragma GCC system_header -#endif - -#define EVENT_TRANSPORT_REGISTER_FAILED 0xC000232CL - -#define EVENT_TRANSPORT_ADAPTER_NOT_FOUND 0xC000232EL - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* __NETEVENT_H */ diff --git a/reactos/include/net/netpnp.h b/reactos/include/net/netpnp.h deleted file mode 100644 index 32f305d0323..00000000000 --- a/reactos/include/net/netpnp.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * netpnp.h - * - * Network Plug and Play event support - * - * This file is part of the w32api package. - * - * Contributors: - * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> - * - * 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 __NETPNP_H -#define __NETPNP_H - -#if __GNUC__ >=3 -#pragma GCC system_header -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#pragma pack(push,4) - -typedef enum _NET_PNP_EVENT_CODE { - NetEventSetPower, - NetEventQueryPower, - NetEventQueryRemoveDevice, - NetEventCancelRemoveDevice, - NetEventReconfigure, - NetEventBindList, - NetEventBindsComplete, - NetEventPnPCapabilities, - NetEventMaximum -} NET_PNP_EVENT_CODE, *PNET_PNP_EVENT_CODE; - -typedef struct _NET_PNP_EVENT { - NET_PNP_EVENT_CODE NetEvent; - PVOID Buffer; - ULONG BufferLength; - ULONG_PTR NdisReserved[4]; - ULONG_PTR TransportReserved[4]; - ULONG_PTR TdiReserved[4]; - ULONG_PTR TdiClientReserved[4]; -} NET_PNP_EVENT, *PNET_PNP_EVENT; - -typedef enum _NET_DEVICE_POWER_STATE { - NetDeviceStateUnspecified, - NetDeviceStateD0, - NetDeviceStateD1, - NetDeviceStateD2, - NetDeviceStateD3, - NetDeviceStateMaximum -} NET_DEVICE_POWER_STATE, *PNET_DEVICE_POWER_STATE; - -#pragma pack(pop) - -#ifdef __cplusplus -} -#endif - -#endif /* __NETPNP_H */ diff --git a/reactos/include/net/ntddtdi.h b/reactos/include/net/ntddtdi.h deleted file mode 100644 index 5ff5ad0643f..00000000000 --- a/reactos/include/net/ntddtdi.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * ntddtdi.h - * - * TDI IOCTL interface - * - * This file is part of the w32api package. - * - * Contributors: - * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> - * - * 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 __NTDDTDI_H -#define __NTDDTDI_H - -#if __GNUC__ >=3 -#pragma GCC system_header -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#pragma pack(push,4) - -#include "ntddk.h" - - -#define DD_TDI_DEVICE_NAME "\\Device\\UNKNOWN" -#define DD_TDI_DEVICE_NAME_U L"\\Device\\UNKNOWN" - -#define _TDI_CONTROL_CODE(Request, Method) \ - CTL_CODE(FILE_DEVICE_TRANSPORT, Request, Method, FILE_ANY_ACCESS) - -#define IOCTL_TDI_ACCEPT _TDI_CONTROL_CODE(0, METHOD_BUFFERED) -#define IOCTL_TDI_CONNECT _TDI_CONTROL_CODE(1, METHOD_BUFFERED) -#define IOCTL_TDI_DISCONNECT _TDI_CONTROL_CODE(2, METHOD_BUFFERED) -#define IOCTL_TDI_LISTEN _TDI_CONTROL_CODE(3, METHOD_BUFFERED) -#define IOCTL_TDI_QUERY_INFORMATION _TDI_CONTROL_CODE(4, METHOD_OUT_DIRECT) -#define IOCTL_TDI_RECEIVE _TDI_CONTROL_CODE(5, METHOD_OUT_DIRECT) -#define IOCTL_TDI_RECEIVE_DATAGRAM _TDI_CONTROL_CODE(6, METHOD_OUT_DIRECT) -#define IOCTL_TDI_SEND _TDI_CONTROL_CODE(7, METHOD_IN_DIRECT) -#define IOCTL_TDI_SEND_DATAGRAM _TDI_CONTROL_CODE(8, METHOD_IN_DIRECT) -#define IOCTL_TDI_SET_EVENT_HANDLER _TDI_CONTROL_CODE(9, METHOD_BUFFERED) -#define IOCTL_TDI_SET_INFORMATION _TDI_CONTROL_CODE(10, METHOD_IN_DIRECT) -#define IOCTL_TDI_ASSOCIATE_ADDRESS _TDI_CONTROL_CODE(11, METHOD_BUFFERED) -#define IOCTL_TDI_DISASSOCIATE_ADDRESS _TDI_CONTROL_CODE(12, METHOD_BUFFERED) -#define IOCTL_TDI_ACTION _TDI_CONTROL_CODE(13, METHOD_OUT_DIRECT) - -#pragma pack(pop) - -#ifdef __cplusplus -} -#endif - -#endif /* __NTDDTDI_H */ diff --git a/reactos/include/net/tdi.h b/reactos/include/net/tdi.h deleted file mode 100644 index f667fe7c423..00000000000 --- a/reactos/include/net/tdi.h +++ /dev/null @@ -1,641 +0,0 @@ -/* - * tdi.h - * - * TDI user mode definitions - * - * This file is part of the w32api package. - * - * Contributors: - * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> - * - * 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 __TDI_H -#define __TDI_H - -#if __GNUC__ >=3 -#pragma GCC system_header -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#pragma pack(push,4) - -#include "ntddk.h" -#include "ntddtdi.h" -#include "tdistat.h" -#include "netpnp.h" - -/* FIXME: Missed some definitions in ntddk.h */ - -/* Could be defined elsewhere - * #ifndef INT - * typedef signed int INT, *PINT; - * #endif - */ - - -/* TDI transport driver dispatch routines */ - -NTSTATUS TdiDispatchCleanup( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp); - -NTSTATUS TdiDispatchClose( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp); - -NTSTATUS TdiDispatchCreate( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp); - -NTSTATUS TdiDispatchDeviceControl( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PIO_STACK_LOCATION IrpSp); - -BOOLEAN TdiDispatchFastDeviceControl( - IN PFILE_OBJECT FileObject, - IN BOOLEAN Wait, - IN PVOID InputBuffer, - IN ULONG InputBufferLength, - IN OUT PVOID OutputBuffer, - IN ULONG OutputBufferLength, - IN ULONG IoControlCode, - OUT PIO_STATUS_BLOCK IoStatus); - -NTSTATUS TdiDispatchInternalDeviceControl( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp); - - - -/* Basic types */ - -typedef LONG TDI_STATUS; -typedef PVOID CONNECTION_CONTEXT; - -typedef struct _TDI_CONNECTION_INFORMATION { - LONG UserDataLength; - PVOID UserData; - LONG OptionsLength; - PVOID Options; - LONG RemoteAddressLength; - PVOID RemoteAddress; -} TDI_CONNECTION_INFORMATION, *PTDI_CONNECTION_INFORMATION; - -typedef struct _TDI_REQUEST { - union { - HANDLE AddressHandle; - CONNECTION_CONTEXT ConnectionContext; - HANDLE ControlChannel; - } Handle; - PVOID RequestNotifyObject; - PVOID RequestContext; - TDI_STATUS TdiStatus; -} TDI_REQUEST, *PTDI_REQUEST; - -typedef struct _TDI_REQUEST_STATUS { - TDI_STATUS Status; - PVOID RequestContext; - ULONG BytesTransferred; -} TDI_REQUEST_STATUS, *PTDI_REQUEST_STATUS; - -typedef struct _TA_ADDRESS { - USHORT AddressLength; - USHORT AddressType; - UCHAR Address[1]; -} TA_ADDRESS, *PTA_ADDRESS; - -#define TDI_ADDRESS_TYPE_UNSPEC 0 -#define TDI_ADDRESS_TYPE_UNIX 1 -#define TDI_ADDRESS_TYPE_IP 2 -#define TDI_ADDRESS_TYPE_IMPLINK 3 -#define TDI_ADDRESS_TYPE_PUP 4 -#define TDI_ADDRESS_TYPE_CHAOS 5 -#define TDI_ADDRESS_TYPE_NS 6 -#define TDI_ADDRESS_TYPE_IPX 6 -#define TDI_ADDRESS_TYPE_NBS 7 -#define TDI_ADDRESS_TYPE_ECMA 8 -#define TDI_ADDRESS_TYPE_DATAKIT 9 -#define TDI_ADDRESS_TYPE_CCITT 10 -#define TDI_ADDRESS_TYPE_SNA 11 -#define TDI_ADDRESS_TYPE_DECnet 12 -#define TDI_ADDRESS_TYPE_DLI 13 -#define TDI_ADDRESS_TYPE_LAT 14 -#define TDI_ADDRESS_TYPE_HYLINK 15 -#define TDI_ADDRESS_TYPE_APPLETALK 16 -#define TDI_ADDRESS_TYPE_NETBIOS 17 -#define TDI_ADDRESS_TYPE_8022 18 -#define TDI_ADDRESS_TYPE_OSI_TSAP 19 -#define TDI_ADDRESS_TYPE_NETONE 20 -#define TDI_ADDRESS_TYPE_VNS 21 -#define TDI_ADDRESS_TYPE_NETBIOS_EX 22 -#define TDI_ADDRESS_TYPE_IP6 23 -#define TDI_ADDRESS_TYPE_NETBIOS_UNICODE_EX 24 - -#define TdiTransportAddress "TransportAddress" -#define TdiConnectionContext "ConnectionContext" -#define TDI_TRANSPORT_ADDRESS_LENGTH (sizeof(TdiTransportAddress) - 1) -#define TDI_CONNECTION_CONTEXT_LENGTH (sizeof(TdiConnectionContext) - 1) -#define TDI_ADDRESS_HEADER_LEN (2 * sizeof(USHORT)) - -typedef struct _TRANSPORT_ADDRESS { - LONG TAAddressCount; - TA_ADDRESS Address[1]; -} TRANSPORT_ADDRESS, *PTRANSPORT_ADDRESS; - -typedef struct _TDI_ADDRESS_INFO { - ULONG ActivityCount; - TRANSPORT_ADDRESS Address; -} TDI_ADDRESS_INFO, *PTDI_ADDRESS_INFO; - -typedef struct _TDI_ACTION_HEADER { - ULONG TransportId; - USHORT ActionCode; - USHORT Reserved; -} TDI_ACTION_HEADER, *PTDI_ACTION_HEADER; - -typedef struct _TDI_ADDRESS_8022 { - UCHAR MACAddress[6]; -} TDI_ADDRESS_8022, *PTDI_ADDRESS_8022; - -#define TDI_ADDRESS_LENGTH_8022 sizeof(TDI_ADDRESS_8022); - -typedef struct _TDI_ADDRESS_APPLETALK { - USHORT Network; - UCHAR Node; - UCHAR Socket; -} TDI_ADDRESS_APPLETALK, *PTDI_ADDRESS_APPLETALK; - -#define TDI_ADDRESS_LENGTH_APPLETALK sizeof(TDI_ADDRESS_APPLETALK) - -typedef struct _TDI_ADDRESS_IP { - USHORT sin_port; - ULONG in_addr; - UCHAR sin_zero[8]; -} TDI_ADDRESS_IP, *PTDI_ADDRESS_IP; - -#define TDI_ADDRESS_LENGTH_IP sizeof(TDI_ADDRESS_IP) - -typedef struct _TDI_ADDRESS_IPX { - ULONG NetworkAddress; - UCHAR NodeAddress[6]; - USHORT Socket; -} TDI_ADDRESS_IPX, *PTDI_ADDRESS_IPX; - -#define TDI_ADDRESS_LENGTH_IPX sizeof(TDI_ADDRESS_IPX) - -/* TDI_ADDRESS_NETBIOS.NetbiosNameType constants */ -#define TDI_ADDRESS_NETBIOS_TYPE_UNIQUE 0x0000 -#define TDI_ADDRESS_NETBIOS_TYPE_GROUP 0x0001 -#define TDI_ADDRESS_NETBIOS_TYPE_QUICK_UNIQUE 0x0002 -#define TDI_ADDRESS_NETBIOS_TYPE_QUICK_GROUP 0x0003 - -typedef struct _TDI_ADDRESS_NETBIOS { - USHORT NetbiosNameType; - UCHAR NetbiosName[16]; -} TDI_ADDRESS_NETBIOS, *PTDI_ADDRESS_NETBIOS; - -#define TDI_ADDRESS_LENGTH_NETBIOS sizeof(TDI_ADDRESS_NETBIOS) - -typedef struct _TDI_ADDRESS_NETBIOS_EX { - UCHAR EndpointName[16]; - TDI_ADDRESS_NETBIOS NetbiosAddress; -} TDI_ADDRESS_NETBIOS_EX, *PTDI_ADDRESS_NETBIOS_EX; - -#define TDI_ADDRESS_LENGTH_NETBIOS_EX sizeof(TDI_ADDRESS_NETBIOS_EX) - -/* TDI_ADDRESS_NETONE.NetoneNameType constants */ -#define TDI_ADDRESS_NETONE_TYPE_UNIQUE 0x0000 -#define TDI_ADDRESS_NETONE_TYPE_ROTORED 0x0001 - -typedef struct _TDI_ADDRESS_NETONE { - USHORT NetoneNameType; - UCHAR NetoneName[20]; -} TDI_ADDRESS_NETONE, *PTDI_ADDRESS_NETONE; - -#define TDI_ADDRESS_LENGTH_NETONE sizeof(TDI_ADDRESS_NETONE) - -typedef struct _TDI_ADDRESS_NS -{ - ULONG NetworkAddress; - UCHAR NodeAddress[6]; - USHORT Socket; -} TDI_ADDRESS_NS, *PTDI_ADDRESS_NS; - -#define TDI_ADDRESS_LENGTH_NS sizeof(TDI_ADDRESS_NS) - -#define ISO_MAX_ADDR_LENGTH 64 - -/* TDI_ADDRESS_OSI_TSAP.tp_addr_type constants */ -#define ISO_HIERARCHICAL 0 -#define ISO_NON_HIERARCHICAL 1 - -typedef struct _TDI_ADDRESS_OSI_TSAP { - USHORT tp_addr_type; - USHORT tp_taddr_len; - USHORT tp_tsel_len; - UCHAR tp_addr[ISO_MAX_ADDR_LENGTH]; -} TDI_ADDRESS_OSI_TSAP, *PTDI_ADDRESS_OSI_TSAP; - -#define TDI_ADDRESS_LENGTH_OSI_TSAP sizeof(TDI_ADDRESS_OSI_TSAP) - -typedef struct _TDI_ADDRESS_VNS { - UCHAR net_address[4]; - UCHAR subnet_addr[2]; - UCHAR port[2]; - UCHAR hops; - UCHAR filler[5]; -} TDI_ADDRESS_VNS, *PTDI_ADDRESS_VNS; - -#define TDI_ADDRESS_LENGTH_VNS sizeof(TDI_ADDRESS_VNS) - -typedef struct _TDI_ADDRESS_IP6 { - USHORT sin6_port; - ULONG sin6_flowinfo; - USHORT sin6_addr[8]; - ULONG sin6_scope_id; -} TDI_ADDRESS_IP6, *PTDI_ADDRESS_IP6; - -#define TDI_ADDRESS_LENGTH_IP6 sizeof(TDI_ADDRESS_IP6) - -enum eNameBufferType { - NBT_READONLY = 0, - NBT_WRITEONLY, - NBT_READWRITE, - NBT_WRITTEN -}; - -typedef struct _TDI_ADDRESS_NETBIOS_UNICODE_EX { - USHORT NetbiosNameType; - enum eNameBufferType NameBufferType; - UNICODE_STRING EndpointName; - UNICODE_STRING RemoteName; - WCHAR EndpointBuffer[17]; - WCHAR RemoteNameBuffer[1]; -} TDI_ADDRESS_NETBIOS_UNICODE_EX, *PTDI_ADDRESS_NETBIOS_UNICODE_EX; - - -typedef struct _TDI_CONNECT_REQUEST { - TDI_REQUEST Request; - PTDI_CONNECTION_INFORMATION RequestConnectionInformation; - PTDI_CONNECTION_INFORMATION ReturnConnectionInformation; - LARGE_INTEGER Timeout; -} TDI_REQUEST_CONNECT, *PTDI_REQUEST_CONNECT; - -typedef struct _TDI_REQUEST_ACCEPT { - TDI_REQUEST Request; - PTDI_CONNECTION_INFORMATION RequestConnectionInformation; - PTDI_CONNECTION_INFORMATION ReturnConnectionInformation; -} TDI_REQUEST_ACCEPT, *PTDI_REQUEST_ACCEPT; - -typedef struct _TDI_REQUEST_LISTEN { - TDI_REQUEST Request; - PTDI_CONNECTION_INFORMATION RequestConnectionInformation; - PTDI_CONNECTION_INFORMATION ReturnConnectionInformation; - USHORT ListenFlags; -} TDI_REQUEST_LISTEN, *PTDI_REQUEST_LISTEN; - -typedef struct _TDI_DISCONNECT_REQUEST { - TDI_REQUEST Request; - LARGE_INTEGER Timeout; -} TDI_REQUEST_DISCONNECT, *PTDI_REQUEST_DISCONNECT; - -typedef struct _TDI_REQUEST_SEND { - TDI_REQUEST Request; - USHORT SendFlags; -} TDI_REQUEST_SEND, *PTDI_REQUEST_SEND; - -typedef struct _TDI_REQUEST_RECEIVE { - TDI_REQUEST Request; - USHORT ReceiveFlags; -} TDI_REQUEST_RECEIVE, *PTDI_REQUEST_RECEIVE; - -typedef struct _TDI_REQUEST_SEND_DATAGRAM { - TDI_REQUEST Request; - PTDI_CONNECTION_INFORMATION SendDatagramInformation; -} TDI_REQUEST_SEND_DATAGRAM, *PTDI_REQUEST_SEND_DATAGRAM; - -typedef struct _TDI_REQUEST_RECEIVE_DATAGRAM { - TDI_REQUEST Request; - PTDI_CONNECTION_INFORMATION ReceiveDatagramInformation; - PTDI_CONNECTION_INFORMATION ReturnInformation; - USHORT ReceiveFlags; -} TDI_REQUEST_RECEIVE_DATAGRAM, *PTDI_REQUEST_RECEIVE_DATAGRAM; - -typedef struct _TDI_REQUEST_SET_EVENT { - TDI_REQUEST Request; - LONG EventType; - PVOID EventHandler; - PVOID EventContext; -} TDI_REQUEST_SET_EVENT_HANDLER, *PTDI_REQUEST_SET_EVENT_HANDLER; - -#define TDI_RECEIVE_BROADCAST 0x00000004 -#define TDI_RECEIVE_MULTICAST 0x00000008 -#define TDI_RECEIVE_PARTIAL 0x00000010 -#define TDI_RECEIVE_NORMAL 0x00000020 -#define TDI_RECEIVE_EXPEDITED 0x00000040 -#define TDI_RECEIVE_PEEK 0x00000080 -#define TDI_RECEIVE_NO_RESPONSE_EXP 0x00000100 -#define TDI_RECEIVE_COPY_LOOKAHEAD 0x00000200 -#define TDI_RECEIVE_ENTIRE_MESSAGE 0x00000400 -#define TDI_RECEIVE_AT_DISPATCH_LEVEL 0x00000800 -#define TDI_RECEIVE_CONTROL_INFO 0x00001000 - -/* Listen flags */ -#define TDI_QUERY_ACCEPT 0x00000001 - -/* Options used for both SendOptions and ReceiveIndicators */ -#define TDI_SEND_EXPEDITED 0x0020 -#define TDI_SEND_PARTIAL 0x0040 -#define TDI_SEND_NO_RESPONSE_EXPECTED 0x0080 -#define TDI_SEND_NON_BLOCKING 0x0100 -#define TDI_SEND_AND_DISCONNECT 0x0200 - -/* Disconnect Flags */ -#define TDI_DISCONNECT_WAIT 0x0001 -#define TDI_DISCONNECT_ABORT 0x0002 -#define TDI_DISCONNECT_RELEASE 0x0004 - -/* TdiRequest structure for TdiQueryInformation request */ -typedef struct _TDI_REQUEST_QUERY_INFORMATION { - TDI_REQUEST Request; - ULONG QueryType; - PTDI_CONNECTION_INFORMATION RequestConnectionInformation; -} TDI_REQUEST_QUERY_INFORMATION, *PTDI_REQUEST_QUERY_INFORMATION; - -/* TdiRequest structure for TdiSetInformation request */ -typedef struct _TDI_REQUEST_SET_INFORMATION { - TDI_REQUEST Request; - ULONG SetType; - PTDI_CONNECTION_INFORMATION RequestConnectionInformation; -} TDI_REQUEST_SET_INFORMATION, *PTDI_REQUEST_SET_INFORMATION; - -typedef TDI_REQUEST_SET_INFORMATION TDI_REQ_SET_INFORMATION, *PTDI_REQ_SET_INFORMATION; - -typedef union _TDI_REQUEST_TYPE { - TDI_REQUEST_ACCEPT TdiAccept; - TDI_REQUEST_CONNECT TdiConnect; - TDI_REQUEST_DISCONNECT TdiDisconnect; - TDI_REQUEST_LISTEN TdiListen; - TDI_REQUEST_QUERY_INFORMATION TdiQueryInformation; - TDI_REQUEST_RECEIVE TdiReceive; - TDI_REQUEST_RECEIVE_DATAGRAM TdiReceiveDatagram; - TDI_REQUEST_SEND TdiSend; - TDI_REQUEST_SEND_DATAGRAM TdiSendDatagram; - TDI_REQUEST_SET_EVENT_HANDLER TdiSetEventHandler; - TDI_REQUEST_SET_INFORMATION TdiSetInformation; -} TDI_REQUEST_TYPE, *PTDI_REQUEST_TYPE; - - -/* Query information types */ - -/* Generic query info types that must be supported by all transports */ -#define TDI_QUERY_BROADCAST_ADDRESS 0x00000001 -#define TDI_QUERY_PROVIDER_INFO 0x00000002 -#define TDI_QUERY_ADDRESS_INFO 0x00000003 -#define TDI_QUERY_CONNECTION_INFO 0x00000004 -#define TDI_QUERY_PROVIDER_STATISTICS 0x00000005 -#define TDI_QUERY_DATAGRAM_INFO 0x00000006 -#define TDI_QUERY_DATA_LINK_ADDRESS 0x00000007 -#define TDI_QUERY_NETWORK_ADDRESS 0x00000008 -#define TDI_QUERY_MAX_DATAGRAM_INFO 0x00000009 - -/* Netbios specific query information types */ -#define TDI_QUERY_ADAPTER_STATUS 0x00000100 -#define TDI_QUERY_SESSION_STATUS 0x00000200 -#define TDI_QUERY_FIND_NAME 0x00000300 - -typedef struct _TA_APPLETALK_ADDR { - LONG TAAddressCount; - struct _AddrAtalk { - USHORT AddressLength; - USHORT AddressType; - TDI_ADDRESS_APPLETALK Address[1]; - } Address[1]; -} TA_APPLETALK_ADDRESS, *PTA_APPLETALK_ADDRESS; - -typedef struct _TA_ADDRESS_IP { - LONG TAAddressCount; - struct _AddrIp { - USHORT AddressLength; - USHORT AddressType; - TDI_ADDRESS_IP Address[1]; - } Address[1]; -} TA_IP_ADDRESS, *PTA_IP_ADDRESS; - -typedef struct _TA_ADDRESS_IPX { - LONG TAAddressCount; - struct _AddrIpx { - USHORT AddressLength; - USHORT AddressType; - TDI_ADDRESS_IPX Address[1]; - } Address[1]; -} TA_IPX_ADDRESS, *PTA_IPX_ADDRESS; - -typedef struct _TA_NETBIOS_ADDRESS { - LONG TAAddressCount; - struct _Addr{ - USHORT AddressLength; - USHORT AddressType; - TDI_ADDRESS_NETBIOS Address[1]; - } Address[1]; -} TA_NETBIOS_ADDRESS, *PTA_NETBIOS_ADDRESS; - -typedef struct _TA_ADDRESS_NS { - LONG TAAddressCount; - struct _AddrNs { - USHORT AddressLength; - USHORT AddressType; - TDI_ADDRESS_NS Address[1]; - } Address[1]; -} TA_NS_ADDRESS, *PTA_NS_ADDRESS; - -typedef struct _TA_ADDRESS_VNS { - LONG TAAddressCount; - struct _AddrVns { - USHORT AddressLength; - USHORT AddressType; - TDI_ADDRESS_VNS Address[1]; - } Address[1]; -} TA_VNS_ADDRESS, *PTA_VNS_ADDRESS; - -typedef struct _TA_ADDRESS_IP6 { - LONG TAAddressCount; - struct _AddrIp6 { - USHORT AddressLength; - USHORT AddressType; - TDI_ADDRESS_IP6 Address[1]; - } Address [1]; -} TA_IP6_ADDRESS, *PTA_IP6_ADDRESS; - -typedef struct _TA_ADDRESS_NETBIOS_UNICODE_EX { - LONG TAAddressCount; - struct _AddrNetbiosWCharEx { - USHORT AddressLength; - USHORT AddressType; - TDI_ADDRESS_NETBIOS_UNICODE_EX Address[1]; - } Address [1]; -} TA_NETBIOS_UNICODE_EX_ADDRESS, *PTA_NETBIOS_UNICODE_EX_ADDRESS; - - -/* Structures used for TdiQueryInformation and TdiSetInformation */ - -typedef struct _TDI_ENDPOINT_INFO { - ULONG State; - ULONG Event; - ULONG TransmittedTsdus; - ULONG ReceivedTsdus; - ULONG TransmissionErrors; - ULONG ReceiveErrors; - ULONG MinimumLookaheadData; - ULONG MaximumLookaheadData; - ULONG PriorityLevel; - ULONG SecurityLevel; - ULONG SecurityCompartment; -} TDI_ENDPOINT_INFO, *PTDI_ENDPOINT_INFO; - -typedef struct _TDI_CONNECTION_INFO { - ULONG State; - ULONG Event; - ULONG TransmittedTsdus; - ULONG ReceivedTsdus; - ULONG TransmissionErrors; - ULONG ReceiveErrors; - LARGE_INTEGER Throughput; - LARGE_INTEGER Delay; - ULONG SendBufferSize; - ULONG ReceiveBufferSize; - BOOLEAN Unreliable; -} TDI_CONNECTION_INFO, *PTDI_CONNECTION_INFO; - -typedef struct _TDI_DATAGRAM_INFO { - ULONG MaximumDatagramBytes; - ULONG MaximumDatagramCount; -} TDI_DATAGRAM_INFO, *PTDI_DATAGRAM_INFO; - -typedef struct _TDI_MAX_DATAGRAM_INFO { - ULONG MaxDatagramSize; -} TDI_MAX_DATAGRAM_INFO, *PTDI_MAX_DATAGRAM_INFO; - -typedef struct _TDI_PROVIDER_INFO { - ULONG Version; - ULONG MaxSendSize; - ULONG MaxConnectionUserData; - ULONG MaxDatagramSize; - ULONG ServiceFlags; - ULONG MinimumLookaheadData; - ULONG MaximumLookaheadData; - ULONG NumberOfResources; - LARGE_INTEGER StartTime; -} TDI_PROVIDER_INFO, *PTDI_PROVIDER_INFO; - -#define TDI_SERVICE_CONNECTION_MODE 0x00000001 -#define TDI_SERVICE_ORDERLY_RELEASE 0x00000002 -#define TDI_SERVICE_CONNECTIONLESS_MODE 0x00000004 -#define TDI_SERVICE_ERROR_FREE_DELIVERY 0x00000008 -#define TDI_SERVICE_SECURITY_LEVEL 0x00000010 -#define TDI_SERVICE_BROADCAST_SUPPORTED 0x00000020 -#define TDI_SERVICE_MULTICAST_SUPPORTED 0x00000040 -#define TDI_SERVICE_DELAYED_ACCEPTANCE 0x00000080 -#define TDI_SERVICE_EXPEDITED_DATA 0x00000100 -#define TDI_SERVICE_INTERNAL_BUFFERING 0x00000200 -#define TDI_SERVICE_ROUTE_DIRECTED 0x00000400 -#define TDI_SERVICE_NO_ZERO_LENGTH 0x00000800 -#define TDI_SERVICE_POINT_TO_POINT 0x00001000 -#define TDI_SERVICE_MESSAGE_MODE 0x00002000 -#define TDI_SERVICE_HALF_DUPLEX 0x00004000 -#define TDI_SERVICE_DGRAM_CONNECTION 0x00008000 -#define TDI_SERVICE_FORCE_ACCESS_CHECK 0x00010000 -#define TDI_SERVICE_SEND_AND_DISCONNECT 0x00020000 -#define TDI_SERVICE_DIRECT_ACCEPT 0x00040000 -#define TDI_SERVICE_ACCEPT_LOCAL_ADDR 0x00080000 - -typedef struct _TDI_PROVIDER_RESOURCE_STATS { - ULONG ResourceId; - ULONG MaximumResourceUsed; - ULONG AverageResourceUsed; - ULONG ResourceExhausted; -} TDI_PROVIDER_RESOURCE_STATS, *PTDI_PROVIDER_RESOURCE_STATS; - -typedef struct _TDI_PROVIDER_STATISTICS { - ULONG Version; - ULONG OpenConnections; - ULONG ConnectionsAfterNoRetry; - ULONG ConnectionsAfterRetry; - ULONG LocalDisconnects; - ULONG RemoteDisconnects; - ULONG LinkFailures; - ULONG AdapterFailures; - ULONG SessionTimeouts; - ULONG CancelledConnections; - ULONG RemoteResourceFailures; - ULONG LocalResourceFailures; - ULONG NotFoundFailures; - ULONG NoListenFailures; - ULONG DatagramsSent; - LARGE_INTEGER DatagramBytesSent; - ULONG DatagramsReceived; - LARGE_INTEGER DatagramBytesReceived; - ULONG PacketsSent; - ULONG PacketsReceived; - ULONG DataFramesSent; - LARGE_INTEGER DataFrameBytesSent; - ULONG DataFramesReceived; - LARGE_INTEGER DataFrameBytesReceived; - ULONG DataFramesResent; - LARGE_INTEGER DataFrameBytesResent; - ULONG DataFramesRejected; - LARGE_INTEGER DataFrameBytesRejected; - ULONG ResponseTimerExpirations; - ULONG AckTimerExpirations; - ULONG MaximumSendWindow; - ULONG AverageSendWindow; - ULONG PiggybackAckQueued; - ULONG PiggybackAckTimeouts; - LARGE_INTEGER WastedPacketSpace; - ULONG WastedSpacePackets; - ULONG NumberOfResources; - TDI_PROVIDER_RESOURCE_STATS ResourceStats[1]; -} TDI_PROVIDER_STATISTICS, *PTDI_PROVIDER_STATISTICS; - -#define TDI_EVENT_CONNECT 0 -#define TDI_EVENT_DISCONNECT 1 -#define TDI_EVENT_ERROR 2 -#define TDI_EVENT_RECEIVE 3 -#define TDI_EVENT_RECEIVE_DATAGRAM 4 -#define TDI_EVENT_RECEIVE_EXPEDITED 5 -#define TDI_EVENT_SEND_POSSIBLE 6 - -typedef struct _TDI_REQUEST_ASSOCIATE { - TDI_REQUEST Request; - HANDLE AddressHandle; -} TDI_REQUEST_ASSOCIATE_ADDRESS, *PTDI_REQUEST_ASSOCIATE_ADDRESS; - -#define NDIS_PACKET_POOL_TAG_FOR_NWLNKIPX 'iPDN' -#define NDIS_PACKET_POOL_TAG_FOR_NWLNKSPX 'sPDN' -#define NDIS_PACKET_POOL_TAG_FOR_NWLNKNB 'nPDN' -#define NDIS_PACKET_POOL_TAG_FOR_TCPIP 'tPDN' -#define NDIS_PACKET_POOL_TAG_FOR_NBF 'bPDN' -#define NDIS_PACKET_POOL_TAG_FOR_APPLETALK 'aPDN' - -#pragma pack(pop) - -#ifdef __cplusplus -} -#endif - -#endif /* __TDI_H */ diff --git a/reactos/include/net/tdiinfo.h b/reactos/include/net/tdiinfo.h deleted file mode 100644 index c9e4ac040ba..00000000000 --- a/reactos/include/net/tdiinfo.h +++ /dev/null @@ -1,253 +0,0 @@ -/* - * tdiinfo.h - * - * TDI set and query information interface - * - * This file is part of the w32api package. - * - * Contributors: - * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> - * - * 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 __TDIINFO_H -#define __TDIINFO_H - -#if __GNUC__ >=3 -#pragma GCC system_header -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#pragma pack(push,4) - -#include "ntddk.h" - -#ifndef TDI_SUCCESS -#define TDI_SUCCESS 0 -#endif/*TDI_SUCCESS*/ - -typedef struct TDIEntityID { - ULONG tei_entity; - ULONG tei_instance; -} TDIEntityID; - -#define MAX_TDI_ENTITIES 512 -#define INVALID_ENTITY_INSTANCE -1 -#define GENERIC_ENTITY 0 -#define ENTITY_LIST_ID 0 -#define ENTITY_TYPE_ID 1 - -#define AT_ENTITY 0x280 -#define CL_NL_ENTITY 0x301 -#define CL_TL_ENTITY 0x401 -#define CO_NL_ENTITY 0x300 -#define CO_TL_ENTITY 0x400 -#define ER_ENTITY 0x380 -#define IF_ENTITY 0x200 - -#define AT_ARP 0x280 -#define AT_NULL 0x282 -#define CL_TL_NBF 0x401 -#define CL_TL_UDP 0x403 -#define CL_NL_IPX 0x301 -#define CL_NL_IP 0x303 -#define CO_TL_NBF 0x400 -#define CO_TL_SPX 0x402 -#define CO_TL_TCP 0x404 -#define CO_TL_SPP 0x406 -#define ER_ICMP 0x380 -#define IF_GENERIC 0x200 -#define IF_MIB 0x202 - -/* ID to use for requesting an IFEntry for an interface */ -#define IF_MIB_STATS_ID 1 - -/* ID to use for requesting an IPSNMPInfo for an interface */ -#define IP_MIB_STATS_ID 1 /* Hmm. I'm not sure I like this */ - -/* ID to use for requesting the route table */ -#define IP_MIB_ROUTETABLE_ENTRY_ID 0x101 -#define IP_MIB_ADDRTABLE_ENTRY_ID 102 - -/* TDIObjectID.toi_class constants */ -#define INFO_CLASS_GENERIC 0x100 -#define INFO_CLASS_PROTOCOL 0x200 -#define INFO_CLASS_IMPLEMENTATION 0x300 - -/* TDIObjectID.toi_type constants */ -#define INFO_TYPE_PROVIDER 0x100 -#define INFO_TYPE_ADDRESS_OBJECT 0x200 -#define INFO_TYPE_CONNECTION 0x300 - -typedef struct _TDIObjectID { - TDIEntityID toi_entity; - ULONG toi_class; - ULONG toi_type; - ULONG toi_id; -} TDIObjectID; - -#define MAX_PHYSADDR_SIZE 010 - -/* Basic interface information like from SIOCGIF* */ -/* 0x5c bytes without description tail */ -typedef struct _IFEntry { - ULONG if_index; - ULONG if_type; - ULONG if_mtu; - ULONG if_speed; - ULONG if_physaddrlen; - UCHAR if_physaddr[MAX_PHYSADDR_SIZE]; - ULONG if_adminstatus; - ULONG if_operstatus; - ULONG if_lastchange; - ULONG if_inoctets; - ULONG if_inucastpkts; - ULONG if_innucastpkts; - ULONG if_indiscards; - ULONG if_inerrors; - ULONG if_inunknownprotos; - ULONG if_outoctets; - ULONG if_outucastpkts; - ULONG if_outnucastpkts; - ULONG if_outdiscards; - ULONG if_outerrors; - ULONG if_outqlen; - ULONG if_descrlen; - UCHAR if_descr[1]; -} IFEntry; - -/* Control information like from /proc/sys/net/ipv4/... */ -/* 0x58 bytes */ -#if 1 -typedef struct _IPSNMPInfo { - ULONG ipsi_index; - ULONG ipsi_forwarding; - ULONG ipsi_defaultttl; - ULONG ipsi_inreceives; - ULONG ipsi_inhdrerrors; - ULONG ipsi_inaddrerrors; - ULONG ipsi_inunknownprotos; - ULONG ipsi_indiscards; - ULONG ipsi_indelivers; - ULONG ipsi_outrequests; - ULONG ipsi_routingdiscards; - ULONG ipsi_outdiscards; - ULONG ipsi_outnoroutes; - ULONG ipsi_reasmtimeout; - ULONG ipsi_reasmreqds; - ULONG ipsi_reasmoks; - ULONG ipsi_reasmfails; - ULONG ipsi_fragoks; - ULONG ipsi_fragfails; - ULONG ipsi_fragcreates; - ULONG ipsi_numif; - ULONG ipsi_numaddr; - ULONG ipsi_numroutes; -} IPSNMPInfo; -#else -typedef struct _IPSNMPInfo { - ULONG ipsi_forwarding; - ULONG ipsi_defaultttl; - ULONG ipsi_inreceives; - ULONG ipsi_inhdrerrors; - ULONG ipsi_inaddrerrors; - ULONG ipsi_inunknownprotos; - ULONG ipsi_indiscards; - ULONG ipsi_indelivers; - ULONG ipsi_outrequests; - ULONG ipsi_routingdiscards; - ULONG ipsi_outdiscards; - ULONG ipsi_outnoroutes; - ULONG ipsi_reasmtimeout; - ULONG ipsi_reasmreqds; - ULONG ipsi_reasmoks; - ULONG ipsi_reasmfails; - ULONG ipsi_fragoks; - ULONG ipsi_fragfails; - ULONG ipsi_fragcreates; - ULONG ipsi_numif; - ULONG ipsi_numaddr; - ULONG ipsi_numroutes; -} IPSNMPInfo; -#endif - -// BEGIN ORIGINAL SOURCE INFORMATION -- -// Gets ip info for the current interface list. - -// Tom Sanfilippo -// tsanfilippo@earthlink.net -// December 12, 1999 - -// Thanks are due to Thomas F. Divine <tdivine@pcausa.com> -// for pointing out the updated wshsmple in the NT4DDK. -// The headers in that sample allowed the input parameters -// to finally be discovered. -// END ORIGINAL SOURCE INFORMATION -- - -typedef struct _IPRouteEntry { - ULONG ire_dest; - ULONG ire_index; //matches if_index in IFEntry and iae_index in IPAddrEntry - ULONG ire_metric; - ULONG ire_unk1; //?? - ULONG ire_unk2; //?? - ULONG ire_unk3; //?? - ULONG ire_gw; - ULONG ire_unk4; //?? - ULONG ire_unk5; //?? - ULONG ire_unk6; //?? - ULONG ire_mask; - ULONG ire_unk7; //?? - ULONG ire_unk8; //?? -} IPRouteEntry; - -typedef struct _IPAddrEntry { - ULONG iae_addr; - ULONG iae_index; - ULONG iae_mask; - ULONG iae_bcastaddr; - ULONG iae_reasmsize; - ULONG iae_context; - ULONG iae_pad; -} IPAddrEntry; - -#define CONTEXT_SIZE 16 -#define MAX_ADAPTER_DESCRIPTION_LENGTH 64 /* guess */ - -typedef struct _TCP_REQUEST_QUERY_INFORMATION_EX { - TDIObjectID ID; - UCHAR Context[CONTEXT_SIZE]; -} TCP_REQUEST_QUERY_INFORMATION_EX, *PTCP_REQUEST_QUERY_INFORMATION_EX; - -#if defined(_WIN64) -typedef struct _TCP_REQUEST_QUERY_INFORMATION_EX32 { - TDIObjectID ID; - ULONG32 Context[CONTEXT_SIZE / sizeof(ULONG32)]; -} TCP_REQUEST_QUERY_INFORMATION_EX32, *PTCP_REQUEST_QUERY_INFORMATION_EX32; -#endif /* _WIN64 */ - -typedef struct _TCP_REQUEST_SET_INFORMATION_EX { - TDIObjectID ID; - UINT BufferSize; - UCHAR Buffer[1]; -} TCP_REQUEST_SET_INFORMATION_EX, *PTCP_REQUEST_SET_INFORMATION_EX; - -#pragma pack(pop) - -#ifdef __cplusplus -} -#endif - -#endif /* __TDIINFO_H */ diff --git a/reactos/include/net/tdikrnl.h b/reactos/include/net/tdikrnl.h deleted file mode 100644 index 2d2c52ace71..00000000000 --- a/reactos/include/net/tdikrnl.h +++ /dev/null @@ -1,1173 +0,0 @@ -/* - * tdikrnl.h - * - * TDI kernel mode definitions - * - * This file is part of the w32api package. - * - * Contributors: - * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> - * - * 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 __TDIKRNL_H -#define __TDIKRNL_H - -#if __GNUC__ >=3 -#pragma GCC system_header -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#pragma pack(push,4) - -#include "ntddk.h" -#include "tdi.h" - -#ifndef STDCALL -#define STDCALL -#endif -#define DDKAPI STDCALL - -#if defined(_TDI_) -// #define TDIKRNLAPI DECLSPEC_EXPORT - #define TDIKRNLAPI -#else -// #define TDIKRNLAPI DECLSPEC_IMPORT - #define TDIKRNLAPI -#endif - - -typedef struct _TDI_REQUEST_KERNEL { - ULONG RequestFlags; - PTDI_CONNECTION_INFORMATION RequestConnectionInformation; - PTDI_CONNECTION_INFORMATION ReturnConnectionInformation; - PVOID RequestSpecific; -} TDI_REQUEST_KERNEL, *PTDI_REQUEST_KERNEL; - -/* Request codes */ -#define TDI_ASSOCIATE_ADDRESS 0x01 -#define TDI_DISASSOCIATE_ADDRESS 0x02 -#define TDI_CONNECT 0x03 -#define TDI_LISTEN 0x04 -#define TDI_ACCEPT 0x05 -#define TDI_DISCONNECT 0x06 -#define TDI_SEND 0x07 -#define TDI_RECEIVE 0x08 -#define TDI_SEND_DATAGRAM 0x09 -#define TDI_RECEIVE_DATAGRAM 0x0A -#define TDI_SET_EVENT_HANDLER 0x0B -#define TDI_QUERY_INFORMATION 0x0C -#define TDI_SET_INFORMATION 0x0D -#define TDI_ACTION 0x0E - -#define TDI_DIRECT_SEND 0x27 -#define TDI_DIRECT_SEND_DATAGRAM 0x29 - -#define TDI_TRANSPORT_ADDRESS_FILE 1 -#define TDI_CONNECTION_FILE 2 -#define TDI_CONTROL_CHANNEL_FILE 3 - -/* Internal TDI IOCTLS */ -#define IOCTL_TDI_QUERY_DIRECT_SEND_HANDLER _TDI_CONTROL_CODE(0x80, METHOD_NEITHER) -#define IOCTL_TDI_QUERY_DIRECT_SENDDG_HANDLER _TDI_CONTROL_CODE(0x81, METHOD_NEITHER) - -/* TdiAssociateAddress */ -typedef struct _TDI_REQUEST_KERNEL_ASSOCIATE { - HANDLE AddressHandle; -} TDI_REQUEST_KERNEL_ASSOCIATE, *PTDI_REQUEST_KERNEL_ASSOCIATE; - -/* TdiDisassociateAddress */ -typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_DISASSOCIATE, - *PTDI_REQUEST_KERNEL_DISASSOCIATE; - -/* TdiAccept */ -typedef struct _TDI_REQUEST_KERNEL_ACCEPT { - PTDI_CONNECTION_INFORMATION RequestConnectionInformation; - PTDI_CONNECTION_INFORMATION ReturnConnectionInformation; -} TDI_REQUEST_KERNEL_ACCEPT, *PTDI_REQUEST_KERNEL_ACCEPT; - -/* TdiConnect */ -typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_CONNECT, - *PTDI_REQUEST_KERNEL_CONNECT; - -/* TdiDisconnect */ -typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_DISCONNECT, - *PTDI_REQUEST_KERNEL_DISCONNECT; - -/* TdiListen */ -typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_LISTEN, - *PTDI_REQUEST_KERNEL_LISTEN; - -/* TdiReceive */ -typedef struct _TDI_REQUEST_KERNEL_RECEIVE { - ULONG ReceiveLength; - ULONG ReceiveFlags; -} TDI_REQUEST_KERNEL_RECEIVE, *PTDI_REQUEST_KERNEL_RECEIVE; - -/* TdiReceiveDatagram */ -typedef struct _TDI_REQUEST_KERNEL_RECEIVEDG { - ULONG ReceiveLength; - PTDI_CONNECTION_INFORMATION ReceiveDatagramInformation; - PTDI_CONNECTION_INFORMATION ReturnDatagramInformation; - ULONG ReceiveFlags; -} TDI_REQUEST_KERNEL_RECEIVEDG, *PTDI_REQUEST_KERNEL_RECEIVEDG; - -/* TdiSend */ -typedef struct _TDI_REQUEST_KERNEL_SEND { - ULONG SendLength; - ULONG SendFlags; -} TDI_REQUEST_KERNEL_SEND, *PTDI_REQUEST_KERNEL_SEND; - -/* TdiSendDatagram */ -typedef struct _TDI_REQUEST_KERNEL_SENDDG { - ULONG SendLength; - PTDI_CONNECTION_INFORMATION SendDatagramInformation; -} TDI_REQUEST_KERNEL_SENDDG, *PTDI_REQUEST_KERNEL_SENDDG; - -/* TdiSetEventHandler */ -typedef struct _TDI_REQUEST_KERNEL_SET_EVENT { - LONG EventType; - PVOID EventHandler; - PVOID EventContext; -} TDI_REQUEST_KERNEL_SET_EVENT, *PTDI_REQUEST_KERNEL_SET_EVENT; - -/* TdiQueryInformation */ -typedef struct _TDI_REQUEST_KERNEL_QUERY_INFO { - LONG QueryType; - PTDI_CONNECTION_INFORMATION RequestConnectionInformation; -} TDI_REQUEST_KERNEL_QUERY_INFORMATION, *PTDI_REQUEST_KERNEL_QUERY_INFORMATION; - -/* TdiSetInformation */ -typedef struct _TDI_REQUEST_KERNEL_SET_INFO { - LONG SetType; - PTDI_CONNECTION_INFORMATION RequestConnectionInformation; -} TDI_REQUEST_KERNEL_SET_INFORMATION, *PTDI_REQUEST_KERNEL_SET_INFORMATION; - - -/* Event types */ -#define TDI_EVENT_CONNECT 0 -#define TDI_EVENT_DISCONNECT 1 -#define TDI_EVENT_ERROR 2 -#define TDI_EVENT_RECEIVE 3 -#define TDI_EVENT_RECEIVE_DATAGRAM 4 -#define TDI_EVENT_RECEIVE_EXPEDITED 5 -#define TDI_EVENT_SEND_POSSIBLE 6 -#define TDI_EVENT_CHAINED_RECEIVE 7 -#define TDI_EVENT_CHAINED_RECEIVE_DATAGRAM 8 -#define TDI_EVENT_CHAINED_RECEIVE_EXPEDITED 9 -#define TDI_EVENT_ERROR_EX 10 - -typedef NTSTATUS -(*PTDI_IND_CONNECT)( - IN PVOID TdiEventContext, - IN LONG RemoteAddressLength, - IN PVOID RemoteAddress, - IN LONG UserDataLength, - IN PVOID UserData, - IN LONG OptionsLength, - IN PVOID Options, - OUT CONNECTION_CONTEXT *ConnectionContext, - OUT PIRP *AcceptIrp); - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiDefaultConnectHandler( - IN PVOID TdiEventContext, - IN LONG RemoteAddressLength, - IN PVOID RemoteAddress, - IN LONG UserDataLength, - IN PVOID UserData, - IN LONG OptionsLength, - IN PVOID Options, - OUT CONNECTION_CONTEXT *ConnectionContext, - OUT PIRP *AcceptIrp); - -typedef NTSTATUS -(*PTDI_IND_DISCONNECT)( - IN PVOID TdiEventContext, - IN CONNECTION_CONTEXT ConnectionContext, - IN LONG DisconnectDataLength, - IN PVOID DisconnectData, - IN LONG DisconnectInformationLength, - IN PVOID DisconnectInformation, - IN ULONG DisconnectFlags); - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiDefaultDisconnectHandler( - IN PVOID TdiEventContext, - IN CONNECTION_CONTEXT ConnectionContext, - IN LONG DisconnectDataLength, - IN PVOID DisconnectData, - IN LONG DisconnectInformationLength, - IN PVOID DisconnectInformation, - IN ULONG DisconnectFlags); - -typedef NTSTATUS -(*PTDI_IND_ERROR)( - IN PVOID TdiEventContext, - IN NTSTATUS Status); - -typedef NTSTATUS DDKAPI -(*PTDI_IND_ERROR_EX)( - IN PVOID TdiEventContext, - IN NTSTATUS Status, - IN PVOID Buffer); - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiDefaultErrorHandler( - IN PVOID TdiEventContext, - IN NTSTATUS Status); - -typedef NTSTATUS -(*PTDI_IND_RECEIVE)( - IN PVOID TdiEventContext, - IN CONNECTION_CONTEXT ConnectionContext, - IN ULONG ReceiveFlags, - IN ULONG BytesIndicated, - IN ULONG BytesAvailable, - OUT ULONG *BytesTaken, - IN PVOID Tsdu, - OUT PIRP *IoRequestPacket); - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiDefaultReceiveHandler( - IN PVOID TdiEventContext, - IN CONNECTION_CONTEXT ConnectionContext, - IN ULONG ReceiveFlags, - IN ULONG BytesIndicated, - IN ULONG BytesAvailable, - OUT ULONG *BytesTaken, - IN PVOID Tsdu, - OUT PIRP *IoRequestPacket); - -typedef NTSTATUS -(*PTDI_IND_RECEIVE_DATAGRAM)( - IN PVOID TdiEventContext, - IN LONG SourceAddressLength, - IN PVOID SourceAddress, - IN LONG OptionsLength, - IN PVOID Options, - IN ULONG ReceiveDatagramFlags, - IN ULONG BytesIndicated, - IN ULONG BytesAvailable, - OUT ULONG *BytesTaken, - IN PVOID Tsdu, - OUT PIRP *IoRequestPacket); - -TDIKRNLAPI -NTSTATUS DDKAPI -TdiDefaultRcvDatagramHandler( - IN PVOID TdiEventContext, - IN LONG SourceAddressLength, - IN PVOID SourceAddress, - IN LONG OptionsLength, - IN PVOID Options, - IN ULONG ReceiveDatagramFlags, - IN ULONG BytesIndicated, - IN ULONG BytesAvailable, - OUT ULONG *BytesTaken, - IN PVOID Tsdu, - OUT PIRP *IoRequestPacket); - -typedef NTSTATUS -(*PTDI_IND_RECEIVE_EXPEDITED)( - IN PVOID TdiEventContext, - IN CONNECTION_CONTEXT ConnectionContext, - IN ULONG ReceiveFlags, - IN ULONG BytesIndicated, - IN ULONG BytesAvailable, - OUT ULONG *BytesTaken, - IN PVOID Tsdu, - OUT PIRP *IoRequestPacket); - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiDefaultRcvExpeditedHandler( - IN PVOID TdiEventContext, - IN CONNECTION_CONTEXT ConnectionContext, - IN ULONG ReceiveFlags, - IN ULONG BytesIndicated, - IN ULONG BytesAvailable, - OUT ULONG *BytesTaken, - IN PVOID Tsdu, - OUT PIRP *IoRequestPacket); - -typedef NTSTATUS -(*PTDI_IND_CHAINED_RECEIVE)( - IN PVOID TdiEventContext, - IN CONNECTION_CONTEXT ConnectionContext, - IN ULONG ReceiveFlags, - IN ULONG ReceiveLength, - IN ULONG StartingOffset, - IN PMDL Tsdu, - IN PVOID TsduDescriptor); - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiDefaultChainedReceiveHandler( - IN PVOID TdiEventContext, - IN CONNECTION_CONTEXT ConnectionContext, - IN ULONG ReceiveFlags, - IN ULONG ReceiveLength, - IN ULONG StartingOffset, - IN PMDL Tsdu, - IN PVOID TsduDescriptor); - -typedef NTSTATUS -(*PTDI_IND_CHAINED_RECEIVE_DATAGRAM)( - IN PVOID TdiEventContext, - IN LONG SourceAddressLength, - IN PVOID SourceAddress, - IN LONG OptionsLength, - IN PVOID Options, - IN ULONG ReceiveDatagramFlags, - IN ULONG ReceiveDatagramLength, - IN ULONG StartingOffset, - IN PMDL Tsdu, - IN PVOID TsduDescriptor); - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiDefaultChainedRcvDatagramHandler( - IN PVOID TdiEventContext, - IN LONG SourceAddressLength, - IN PVOID SourceAddress, - IN LONG OptionsLength, - IN PVOID Options, - IN ULONG ReceiveDatagramFlags, - IN ULONG ReceiveDatagramLength, - IN ULONG StartingOffset, - IN PMDL Tsdu, - IN PVOID TsduDescriptor); - -typedef NTSTATUS -(*PTDI_IND_CHAINED_RECEIVE_EXPEDITED)( - IN PVOID TdiEventContext, - IN CONNECTION_CONTEXT ConnectionContext, - IN ULONG ReceiveFlags, - IN ULONG ReceiveLength, - IN ULONG StartingOffset, - IN PMDL Tsdu, - IN PVOID TsduDescriptor); - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiDefaultChainedRcvExpeditedHandler( - IN PVOID TdiEventContext, - IN CONNECTION_CONTEXT ConnectionContext, - IN ULONG ReceiveFlags, - IN ULONG ReceiveLength, - IN ULONG StartingOffset, - IN PMDL Tsdu, - IN PVOID TsduDescriptor); - -typedef NTSTATUS -(*PTDI_IND_SEND_POSSIBLE)( - IN PVOID TdiEventContext, - IN PVOID ConnectionContext, - IN ULONG BytesAvailable); - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiDefaultSendPossibleHandler( - IN PVOID TdiEventContext, - IN PVOID ConnectionContext, - IN ULONG BytesAvailable); - - - -/* Macros and functions to build IRPs */ - -#define TdiBuildBaseIrp( \ - bIrp, bDevObj, bFileObj, bCompRoutine, bContxt, bIrpSp, bMinor) \ -{ \ - bIrpSp->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; \ - bIrpSp->MinorFunction = (bMinor); \ - bIrpSp->DeviceObject = (bDevObj); \ - bIrpSp->FileObject = (bFileObj); \ - if (bCompRoutine) \ - IoSetCompletionRoutine(bIrp, bCompRoutine, bContxt, TRUE, TRUE, TRUE) \ - else \ - IoSetCompletionRoutine(bIrp, NULL, NULL, FALSE, FALSE, FALSE); \ -} - -/* - * VOID - * TdiBuildAccept( - * IN PIRP Irp, - * IN PDEVICE_OBJECT DevObj, - * IN PFILE_OBJECT FileObj, - * IN PVOID CompRoutine, - * IN PVOID Contxt, - * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo, - * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo); - */ -#define TdiBuildAccept( \ - Irp, DevObj, FileObj, CompRoutine, Contxt, \ - RequestConnectionInfo, ReturnConnectionInfo) \ - { \ - PTDI_REQUEST_KERNEL_ACCEPT _Request; \ - PIO_STACK_LOCATION _IrpSp; \ - \ - _IrpSp = IoGetNextIrpStackLocation(Irp); \ - \ - TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ - Contxt, _IrpSp, TDI_ACCEPT); \ - \ - _Request = (PTDI_REQUEST_KERNEL_ACCEPT)&_IrpSp->Parameters; \ - _Request->RequestConnectionInformation = (RequestConnectionInfo); \ - _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \ -} - -/* - * VOID - * TdiBuildAction( - * IN PIRP Irp, - * IN PDEVICE_OBJECT DevObj, - * IN PFILE_OBJECT FileObj, - * IN PVOID CompRoutine, - * IN PVOID Contxt, - * IN PMDL MdlAddr); - */ -#define TdiBuildAction( \ - Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr) \ -{ \ - PIO_STACK_LOCATION _IrpSp; \ - \ - _IrpSp = IoGetNextIrpStackLocation(Irp); \ - \ - TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ - Contxt, _IrpSp, TDI_ACTION); \ - \ - (Irp)->MdlAddress = (MdlAddr); \ -} - -/* - * VOID - * TdiBuildAssociateAddress( - * IN PIRP Irp, - * IN PDEVICE_OBJECT DevObj, - * IN PFILE_OBJECT FileObj, - * IN PVOID CompRoutine, - * IN PVOID Contxt, - * IN HANDLE AddrHandle); - */ -#define TdiBuildAssociateAddress( \ - Irp, DevObj, FileObj, CompRoutine, Contxt, AddrHandle) \ -{ \ - PTDI_REQUEST_KERNEL_ASSOCIATE _Request; \ - PIO_STACK_LOCATION _IrpSp; \ - \ - _IrpSp = IoGetNextIrpStackLocation(Irp); \ - \ - TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ - Contxt, _IrpSp, TDI_ASSOCIATE_ADDRESS); \ - \ - _Request = (PTDI_REQUEST_KERNEL_ASSOCIATE)&_IrpSp->Parameters; \ - _Request->AddressHandle = (HANDLE)(AddrHandle); \ -} - -/* - * VOID - * TdiBuildConnect( - * IN PIRP Irp, - * IN PDEVICE_OBJECT DevObj, - * IN PFILE_OBJECT FileObj, - * IN PVOID CompRoutine, - * IN PVOID Contxt, - * IN PLARGE_INTEGER Time, - * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo, - * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo); - */ -#define TdiBuildConnect( \ - Irp, DevObj, FileObj, CompRoutine, Contxt, \ - Time, RequestConnectionInfo, ReturnConnectionInfo) \ -{ \ - PTDI_REQUEST_KERNEL _Request; \ - PIO_STACK_LOCATION _IrpSp; \ - \ - _IrpSp = IoGetNextIrpStackLocation(Irp); \ - \ - TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ - Contxt, _IrpSp, TDI_CONNECT); \ - \ - _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters; \ - _Request->RequestConnectionInformation = (RequestConnectionInfo); \ - _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \ - _Request->RequestSpecific = (PVOID)(Time); \ -} - -/* - * VOID - * TdiBuildDisassociateAddress( - * IN PIRP Irp, - * IN PDEVICE_OBJECT DevObj, - * IN PFILE_OBJECT FileObj, - * IN PVOID CompRoutine, - * IN PVOID Contxt); - */ -#define TdiBuildDisassociateAddress( \ - Irp, DevObj, FileObj, CompRoutine, Contxt) \ -{ \ - PIO_STACK_LOCATION _IrpSp; \ - \ - _IrpSp = IoGetNextIrpStackLocation(Irp); \ - \ - TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ - Contxt, _IrpSp, TDI_DISASSOCIATE_ADDRESS); \ -} - -/* - * VOID - * TdiBuildDisconnect( - * IN PIRP Irp, - * IN PDEVICE_OBJECT DevObj, - * IN PFILE_OBJECT FileObj, - * IN PVOID CompRoutine, - * IN PVOID Contxt, - * IN PLARGE_INTEGER Time, - * IN PULONG Flags, - * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo, - * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo); - */ -#define TdiBuildDisconnect( \ - Irp, DevObj, FileObj, CompRoutine, Contxt, Time, \ - Flags, RequestConnectionInfo, ReturnConnectionInfo) \ -{ \ - PTDI_REQUEST_KERNEL _Request; \ - PIO_STACK_LOCATION _IrpSp; \ - \ - _IrpSp = IoGetNextIrpStackLocation(Irp); \ - \ - TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ - Contxt, _IrpSp, TDI_DISCONNECT); \ - \ - _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters; \ - _Request->RequestConnectionInformation = (RequestConnectionInfo); \ - _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \ - _Request->RequestSpecific = (PVOID)(Time); \ - _Request->RequestFlags = (Flags); \ -} - -/* - * PIRP - * TdiBuildInternalDeviceControlIrp( - * IN CCHAR IrpSubFunction, - * IN PDEVICE_OBJECT DeviceObject, - * IN PFILE_OBJECT FileObject, - * IN PKEVENT Event, - * IN PIO_STATUS_BLOCK IoStatusBlock); - */ -#define TdiBuildInternalDeviceControlIrp( \ - IrpSubFunction, DeviceObject, \ - FileObject, Event, IoStatusBlock) \ - IoBuildDeviceIoControlRequest( \ - 0x00000003, DeviceObject, \ - NULL, 0, NULL, 0, \ - TRUE, Event, IoStatusBlock) - -/* - * VOID - * TdiBuildListen( - * IN PIRP Irp, - * IN PDEVICE_OBJECT DevObj, - * IN PFILE_OBJECT FileObj, - * IN PVOID CompRoutine, - * IN PVOID Contxt, - * IN ULONG Flags, - * IN PTDI_CONNECTION_INFORMATION RequestConnectionInfo, - * OUT PTDI_CONNECTION_INFORMATION ReturnConnectionInfo); - */ -#define TdiBuildListen( \ - Irp, DevObj, FileObj, CompRoutine, Contxt, \ - Flags, RequestConnectionInfo, ReturnConnectionInfo) \ -{ \ - PTDI_REQUEST_KERNEL _Request; \ - PIO_STACK_LOCATION _IrpSp; \ - \ - _IrpSp = IoGetNextIrpStackLocation(Irp); \ - \ - TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ - Contxt, _IrpSp, TDI_LISTEN); \ - \ - _Request = (PTDI_REQUEST_KERNEL)&_IrpSp->Parameters; \ - _Request->RequestConnectionInformation = (RequestConnectionInfo); \ - _Request->ReturnConnectionInformation = (ReturnConnectionInfo); \ - _Request->RequestFlags = (Flags); \ -} - -TDIKRNLAPI -VOID -DDKAPI -TdiBuildNetbiosAddress( - IN PUCHAR NetbiosName, - IN BOOLEAN IsGroupName, - IN OUT PTA_NETBIOS_ADDRESS NetworkName); - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiBuildNetbiosAddressEa( - IN PUCHAR Buffer, - IN BOOLEAN IsGroupName, - IN PUCHAR NetbiosName); - -/* - * VOID - * TdiBuildQueryInformation( - * IN PIRP Irp, - * IN PDEVICE_OBJECT DevObj, - * IN PFILE_OBJECT FileObj, - * IN PVOID CompRoutine, - * IN PVOID Contxt, - * IN UINT QType, - * IN PMDL MdlAddr); - */ -#define TdiBuildQueryInformation( \ - Irp, DevObj, FileObj, CompRoutine, Contxt, QType, MdlAddr) \ -{ \ - PTDI_REQUEST_KERNEL_QUERY_INFORMATION _Request; \ - PIO_STACK_LOCATION _IrpSp; \ - \ - _IrpSp = IoGetNextIrpStackLocation(Irp); \ - \ - TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ - Contxt, _IrpSp, TDI_QUERY_INFORMATION); \ - \ - _Request = (PTDI_REQUEST_KERNEL_QUERY_INFORMATION)&_IrpSp->Parameters; \ - _Request->RequestConnectionInformation = NULL; \ - _Request->QueryType = (ULONG)(QType); \ - (Irp)->MdlAddress = (MdlAddr); \ -} - -/* - * VOID - * TdiBuildReceive( - * IN PIRP Irp, - * IN PDEVICE_OBJECT DevObj, - * IN PFILE_OBJECT FileObj, - * IN PVOID CompRoutine, - * IN PVOID Contxt, - * IN PMDL MdlAddr, - * IN ULONG InFlags, - * IN ULONG ReceiveLen); - */ -#define TdiBuildReceive( \ - Irp, DevObj, FileObj, CompRoutine, Contxt, \ - MdlAddr, InFlags, ReceiveLen) \ -{ \ - PTDI_REQUEST_KERNEL_RECEIVE _Request; \ - PIO_STACK_LOCATION _IrpSp; \ - \ - _IrpSp = IoGetNextIrpStackLocation(Irp); \ - \ - TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ - Contxt, _IrpSp, TDI_RECEIVE); \ - \ - _Request = (PTDI_REQUEST_KERNEL_RECEIVE)&_IrpSp->Parameters; \ - _Request->ReceiveFlags = (InFlags); \ - _Request->ReceiveLength = (ReceiveLen); \ - (Irp)->MdlAddress = (MdlAddr); \ -} - -/* - * VOID - * TdiBuildReceiveDatagram( - * IN PIRP Irp, - * IN PDEVICE_OBJECT DevObj, - * IN PFILE_OBJECT FileObj, - * IN PVOID CompRoutine, - * IN PVOID Contxt, - * IN PMDL MdlAddr, - * IN ULONG ReceiveLen, - * IN PTDI_CONNECTION_INFORMATION ReceiveDatagramInfo, - * OUT PTDI_CONNECTION_INFORMATION ReturnInfo, - * ULONG InFlags); - */ -#define TdiBuildReceiveDatagram( \ - Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr, \ - ReceiveLen, ReceiveDatagramInfo, ReturnInfo, InFlags) \ -{ \ - PTDI_REQUEST_KERNEL_RECEIVEDG _Request; \ - PIO_STACK_LOCATION _IrpSp; \ - \ - _IrpSp = IoGetNextIrpStackLocation(Irp); \ - \ - TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ - Contxt, _IrpSp, TDI_RECEIVE_DATAGRAM); \ - \ - _Request = (PTDI_REQUEST_KERNEL_RECEIVEDG)&_IrpSp->Parameters; \ - _Request->ReceiveDatagramInformation = (ReceiveDatagramInfo); \ - _Request->ReturnDatagramInformation = (ReturnInfo); \ - _Request->ReceiveLength = (ReceiveLen); \ - _Request->ReceiveFlags = (InFlags); \ - (Irp)->MdlAddress = (MdlAddr); \ -} - -/* - * VOID - * TdiBuildSend( - * IN PIRP Irp, - * IN PDEVICE_OBJECT DevObj, - * IN PFILE_OBJECT FileObj, - * IN PVOID CompRoutine, - * IN PVOID Contxt, - * IN PMDL MdlAddr, - * IN ULONG InFlags, - * IN ULONG SendLen); - */ -#define TdiBuildSend( \ - Irp, DevObj, FileObj, CompRoutine, Contxt, \ - MdlAddr, InFlags, SendLen) \ -{ \ - PTDI_REQUEST_KERNEL_SEND _Request; \ - PIO_STACK_LOCATION _IrpSp; \ - \ - _IrpSp = IoGetNextIrpStackLocation(Irp); \ - \ - TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ - Contxt, _IrpSp, TDI_SEND); \ - \ - _Request = (PTDI_REQUEST_KERNEL_SEND)&_IrpSp->Parameters; \ - _Request->SendFlags = (InFlags); \ - _Request->SendLength = (SendLen); \ - (Irp)->MdlAddress = (MdlAddr); \ -} - -/* - * VOID - * TdiBuildSendDatagram( - * IN PIRP Irp, - * IN PDEVICE_OBJECT DevObj, - * IN PFILE_OBJECT FileObj, - * IN PVOID CompRoutine, - * IN PVOID Contxt, - * IN PMDL MdlAddr, - * IN ULONG SendLen, - * IN PTDI_CONNECTION_INFORMATION SendDatagramInfo); - */ -#define TdiBuildSendDatagram( \ - Irp, DevObj, FileObj, CompRoutine, Contxt, \ - MdlAddr, SendLen, SendDatagramInfo) \ -{ \ - PTDI_REQUEST_KERNEL_SENDDG _Request; \ - PIO_STACK_LOCATION _IrpSp; \ - \ - _IrpSp = IoGetNextIrpStackLocation(Irp); \ - \ - TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ - Contxt, _IrpSp, TDI_SEND_DATAGRAM); \ - \ - _Request = (PTDI_REQUEST_KERNEL_SENDDG)&_IrpSp->Parameters; \ - _Request->SendDatagramInformation = (SendDatagramInfo); \ - _Request->SendLength = (SendLen); \ - (Irp)->MdlAddress = (MdlAddr); \ -} - -/* - * VOID - * TdiBuildSetEventHandler( - * IN PIRP Irp, - * IN PDEVICE_OBJECT DevObj, - * IN PFILE_OBJECT FileObj, - * IN PVOID CompRoutine, - * IN PVOID Contxt, - * IN INT InEventType, - * IN PVOID InEventHandler, - * IN PVOID InEventContext); - */ -#define TdiBuildSetEventHandler( \ - Irp, DevObj, FileObj, CompRoutine, Contxt, \ - InEventType, InEventHandler, InEventContext) \ -{ \ - PTDI_REQUEST_KERNEL_SET_EVENT _Request; \ - PIO_STACK_LOCATION _IrpSp; \ - \ - _IrpSp = IoGetNextIrpStackLocation(Irp); \ - \ - TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ - Contxt, _IrpSp, TDI_SET_EVENT_HANDLER); \ - \ - _Request = (PTDI_REQUEST_KERNEL_SET_EVENT)&_IrpSp->Parameters; \ - _Request->EventType = (InEventType); \ - _Request->EventHandler = (PVOID)(InEventHandler); \ - _Request->EventContext = (PVOID)(InEventContext); \ -} - -/* - * VOID - * TdiBuildSetInformation( - * IN PIRP Irp, - * IN PDEVICE_OBJECT DevObj, - * IN PFILE_OBJECT FileObj, - * IN PVOID CompRoutine, - * IN PVOID Contxt, - * IN UINT SType, - * IN PMDL MdlAddr); - */ -#define TdiBuildSetInformation( \ - Irp, DevObj, FileObj, CompRoutine, Contxt, SType, MdlAddr) \ -{ \ - PTDI_REQUEST_KERNEL_SET_INFORMATION _Request; \ - PIO_STACK_LOCATION _IrpSp; \ - \ - _IrpSp = IoGetNextIrpStackLocation(Irp); \ - \ - TdiBuildBaseIrp(Irp, DevObj, FileObj, CompRoutine, \ - Contxt, _IrpSp, TDI_SET_INFORMATION); \ - \ - _Request = (PTDI_REQUEST_KERNEL_SET_INFORMATION)&_IrpSp->Parameters; \ - _Request->RequestConnectionInformation = NULL; \ - _Request->SetType = (ULONG)(SType); \ - (Irp)->MdlAddress = (MdlAddr); \ -} - -/* TDI20_CLIENT_INTERFACE_INFO.TdiVersion constants */ -#define TDI_CURRENT_MAJOR_VERSION 2 -#define TDI_CURRENT_MINOR_VERSION 0 - -#define TDI_CURRENT_VERSION ((TDI_CURRENT_MINOR_VERSION) << 8 \ - | (TDI_CURRENT_MAJOR_VERSION)) - -#define TDI_VERSION_ONE 0x0001 - -typedef enum _TDI_PNP_OPCODE { - TDI_PNP_OP_MIN, - TDI_PNP_OP_ADD, - TDI_PNP_OP_DEL, - TDI_PNP_OP_UPDATE, - TDI_PNP_OP_PROVIDERREADY, - TDI_PNP_OP_NETREADY, - TDI_PNP_OP_ADD_IGNORE_BINDING, - TDI_PNP_OP_DELETE_IGNORE_BINDING, - TDI_PNP_OP_MAX -} TDI_PNP_OPCODE; - -/* TDI_PNP_CONTEXT.ContextType */ -#define TDI_PNP_CONTEXT_TYPE_IF_NAME 0x1 -#define TDI_PNP_CONTEXT_TYPE_IF_ADDR 0x2 -#define TDI_PNP_CONTEXT_TYPE_PDO 0x3 -#define TDI_PNP_CONTEXT_TYPE_FIRST_OR_LAST_IF 0x4 - -typedef struct _TDI_PNP_CONTEXT { - USHORT ContextSize; - USHORT ContextType; - UCHAR ContextData[1]; -} TDI_PNP_CONTEXT, *PTDI_PNP_CONTEXT; - -typedef VOID DDKAPI -(*TDI_ADD_ADDRESS_HANDLER)( - IN PTA_ADDRESS Address); - -typedef VOID DDKAPI -(*TDI_ADD_ADDRESS_HANDLER_V2)( - IN PTA_ADDRESS Address, - IN PUNICODE_STRING DeviceName, - IN PTDI_PNP_CONTEXT Context); - -typedef VOID DDKAPI -(*TDI_BINDING_HANDLER)( - IN TDI_PNP_OPCODE PnPOpcode, - IN PUNICODE_STRING DeviceName, - IN PWSTR MultiSZBindList); - -typedef VOID DDKAPI -(*TDI_BIND_HANDLER)( - IN PUNICODE_STRING DeviceName); - -typedef VOID DDKAPI -(*TDI_DEL_ADDRESS_HANDLER)( - IN PTA_ADDRESS Address); - -typedef VOID DDKAPI -(*TDI_DEL_ADDRESS_HANDLER_V2)( - IN PTA_ADDRESS Address, - IN PUNICODE_STRING DeviceName, - IN PTDI_PNP_CONTEXT Context); - -typedef NTSTATUS DDKAPI -(*TDI_PNP_POWER_HANDLER)( - IN PUNICODE_STRING DeviceName, - IN PNET_PNP_EVENT PowerEvent, - IN PTDI_PNP_CONTEXT Context1, - IN PTDI_PNP_CONTEXT Context2); - -typedef VOID DDKAPI -(*TDI_UNBIND_HANDLER)( - IN PUNICODE_STRING DeviceName); - -typedef VOID DDKAPI -(*ProviderPnPPowerComplete)( - IN PNET_PNP_EVENT NetEvent, - IN NTSTATUS ProviderStatus); - -typedef struct _TDI20_CLIENT_INTERFACE_INFO { - _ANONYMOUS_UNION union { - _ANONYMOUS_STRUCT struct { - UCHAR MajorTdiVersion; - UCHAR MinorTdiVersion; - } DUMMYSTRUCTNAME; - USHORT TdiVersion; - } DUMMYUNIONNAME; - USHORT Unused; - PUNICODE_STRING ClientName; - TDI_PNP_POWER_HANDLER PnPPowerHandler; - _ANONYMOUS_UNION union { - TDI_BINDING_HANDLER BindingHandler; - _ANONYMOUS_STRUCT struct { - TDI_BIND_HANDLER BindHandler; - TDI_UNBIND_HANDLER UnBindHandler; - } DUMMYSTRUCTNAME; - }DUMMYUNIONNAME2; - _ANONYMOUS_UNION union { - _ANONYMOUS_STRUCT struct { - TDI_ADD_ADDRESS_HANDLER_V2 AddAddressHandlerV2; - TDI_DEL_ADDRESS_HANDLER_V2 DelAddressHandlerV2; - } DUMMYSTRUCTNAME; - _ANONYMOUS_STRUCT struct { - TDI_ADD_ADDRESS_HANDLER AddAddressHandler; - TDI_DEL_ADDRESS_HANDLER DelAddressHandler; - } DUMMYSTRUCTNAME2; - } DUMMYUNIONNAME3; -} TDI20_CLIENT_INTERFACE_INFO, *PTDI20_CLIENT_INTERFACE_INFO; - -typedef TDI20_CLIENT_INTERFACE_INFO TDI_CLIENT_INTERFACE_INFO; -typedef TDI_CLIENT_INTERFACE_INFO *PTDI_CLIENT_INTERFACE_INFO; - - -/* TDI functions */ - -/* - * VOID - * TdiCompleteRequest( - * IN PIRP Irp, - * IN NTSTATUS Status); - */ -#define TdiCompleteRequest(Irp, Status) \ -{ \ - (Irp)->IoStatus.Status = (Status); \ - IoCompleteRequest((Irp), IO_NETWORK_INCREMENT); \ -} - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiCopyBufferToMdl( - IN PVOID SourceBuffer, - IN ULONG SourceOffset, - IN ULONG SourceBytesToCopy, - IN PMDL DestinationMdlChain, - IN ULONG DestinationOffset, - IN PULONG BytesCopied); - -/* - * VOID - * TdiCopyLookaheadData( - * IN PVOID Destination, - * IN PVOID Source, - * IN ULONG Length, - * IN ULONG ReceiveFlags); - */ -#define TdiCopyLookaheadData(Destination, Source, Length, ReceiveFlags) \ - RtlCopyMemory(Destination, Source, Length) - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiCopyMdlChainToMdlChain ( - IN PMDL SourceMdlChain, - IN ULONG SourceOffset, - IN PMDL DestinationMdlChain, - IN ULONG DestinationOffset, - OUT PULONG BytesCopied); - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiCopyMdlToBuffer( - IN PMDL SourceMdlChain, - IN ULONG SourceOffset, - IN PVOID DestinationBuffer, - IN ULONG DestinationOffset, - IN ULONG DestinationBufferSize, - OUT PULONG BytesCopied); - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiDeregisterAddressChangeHandler( - IN HANDLE BindingHandle); - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiDeregisterDeviceObject( - IN HANDLE DevRegistrationHandle); - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiDeregisterNetAddress( - IN HANDLE AddrRegistrationHandle); - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiDeregisterPnPHandlers( - IN HANDLE BindingHandle); - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiDeregisterProvider( - IN HANDLE ProviderHandle); - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiEnumerateAddresses( - IN HANDLE BindingHandle); - -TDIKRNLAPI -VOID -DDKAPI -TdiInitialize( - VOID); - -TDIKRNLAPI -VOID -DDKAPI -TdiMapBuffer( - IN PMDL MdlChain); - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiMapUserRequest( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PIO_STACK_LOCATION IrpSp); - -TDIKRNLAPI -BOOLEAN -DDKAPI -TdiMatchPdoWithChainedReceiveContext( - IN PVOID TsduDescriptor, - IN PVOID PDO); - -TDIKRNLAPI -VOID -DDKAPI -TdiPnPPowerComplete( - IN HANDLE BindingHandle, - IN PNET_PNP_EVENT PowerEvent, - IN NTSTATUS Status); - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiPnPPowerRequest( - IN PUNICODE_STRING DeviceName, - IN PNET_PNP_EVENT PowerEvent, - IN PTDI_PNP_CONTEXT Context1, - IN PTDI_PNP_CONTEXT Context2, - IN ProviderPnPPowerComplete ProtocolCompletionHandler); - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiProviderReady( - IN HANDLE ProviderHandle); - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiRegisterAddressChangeHandler( - IN TDI_ADD_ADDRESS_HANDLER AddHandler, - IN TDI_DEL_ADDRESS_HANDLER DeleteHandler, - OUT HANDLE *BindingHandle); - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiRegisterDeviceObject( - IN PUNICODE_STRING DeviceName, - OUT HANDLE *DevRegistrationHandle); - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiRegisterNetAddress( - IN PTA_ADDRESS Address, - IN PUNICODE_STRING DeviceName, - IN PTDI_PNP_CONTEXT Context, - OUT HANDLE *AddrRegistrationHandle); - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiRegisterNotificationHandler( - IN TDI_BIND_HANDLER BindHandler, - IN TDI_UNBIND_HANDLER UnbindHandler, - OUT HANDLE *BindingHandle); - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiRegisterPnPHandlers( - IN PTDI_CLIENT_INTERFACE_INFO ClientInterfaceInfo, - IN ULONG InterfaceInfoSize, - OUT HANDLE *BindingHandle); - -TDIKRNLAPI -NTSTATUS -DDKAPI -TdiRegisterProvider( - IN PUNICODE_STRING ProviderName, - OUT HANDLE *ProviderHandle); - -TDIKRNLAPI -VOID -DDKAPI -TdiReturnChainedReceives( - IN PVOID *TsduDescriptors, - IN ULONG NumberOfTsdus); - -TDIKRNLAPI -VOID -DDKAPI -TdiUnmapBuffer( - IN PMDL MdlChain); - -#pragma pack(pop) - -#ifdef __cplusplus -} -#endif - -#endif /* __TDIKRNL_H */ diff --git a/reactos/include/net/tdistat.h b/reactos/include/net/tdistat.h deleted file mode 100644 index f0588d2579a..00000000000 --- a/reactos/include/net/tdistat.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * tdistat.h - * - * TDI status codes - * - * This file is part of the w32api package. - * - * Contributors: - * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> - * - * 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 __TDISTAT_H -#define __TDISTAT_H - -#if __GNUC__ >=3 -#pragma GCC system_header -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#define TDI_SUCCESS STATUS_SUCCESS -#define TDI_NO_RESOURCES STATUS_INSUFFICIENT_RESOURCES -#define TDI_ADDR_IN_USE STATUS_ADDRESS_ALREADY_EXISTS -#define TDI_BAD_ADDR STATUS_INVALID_ADDRESS_COMPONENT -#define TDI_NO_FREE_ADDR STATUS_TOO_MANY_ADDRESSES -#define TDI_ADDR_INVALID STATUS_INVALID_ADDRESS -#define TDI_ADDR_DELETED STATUS_ADDRESS_CLOSED -#define TDI_BUFFER_OVERFLOW STATUS_BUFFER_OVERFLOW -#define TDI_BAD_EVENT_TYPE STATUS_INVALID_PARAMETER -#define TDI_BAD_OPTION STATUS_INVALID_PARAMETER -#define TDI_CONN_REFUSED STATUS_CONNECTION_REFUSED -#define TDI_INVALID_CONNECTION STATUS_CONNECTION_INVALID -#define TDI_ALREADY_ASSOCIATED STATUS_ADDRESS_ALREADY_ASSOCIATED -#define TDI_NOT_ASSOCIATED STATUS_ADDRESS_NOT_ASSOCIATED -#define TDI_CONNECTION_ACTIVE STATUS_CONNECTION_ACTIVE -#define TDI_CONNECTION_ABORTED STATUS_CONNECTION_ABORTED -#define TDI_CONNECTION_RESET STATUS_CONNECTION_RESET -#define TDI_TIMED_OUT STATUS_IO_TIMEOUT -#define TDI_GRACEFUL_DISC STATUS_GRACEFUL_DISCONNECT -#define TDI_NOT_ACCEPTED STATUS_DATA_NOT_ACCEPTED -#define TDI_MORE_PROCESSING STATUS_MORE_PROCESSING_REQUIRED -#define TDI_INVALID_STATE STATUS_INVALID_DEVICE_STATE -#define TDI_INVALID_PARAMETER STATUS_INVALID_PARAMETER -#define TDI_DEST_NET_UNREACH STATUS_NETWORK_UNREACHABLE -#define TDI_DEST_HOST_UNREACH STATUS_HOST_UNREACHABLE -#define TDI_DEST_UNREACHABLE TDI_DEST_HOST_UNREACH -#define TDI_DEST_PROT_UNREACH STATUS_PROTOCOL_UNREACHABLE -#define TDI_DEST_PORT_UNREACH STATUS_PORT_UNREACHABLE -#define TDI_INVALID_QUERY STATUS_INVALID_DEVICE_REQUEST -#define TDI_REQ_ABORTED STATUS_REQUEST_ABORTED -#define TDI_BUFFER_TOO_SMALL STATUS_BUFFER_TOO_SMALL -#define TDI_CANCELLED STATUS_CANCELLED -#define TDI_BUFFER_TOO_BIG STATUS_INVALID_BUFFER_SIZE -#define TDI_INVALID_REQUEST STATUS_INVALID_DEVICE_REQUEST -#define TDI_PENDING STATUS_PENDING -#define TDI_ITEM_NOT_FOUND STATUS_OBJECT_NAME_NOT_FOUND - -#define TDI_STATUS_BAD_VERSION 0xC0010004L -#define TDI_STATUS_BAD_CHARACTERISTICS 0xC0010005L - -#define TDI_OPTION_EOL 0 - -#define TDI_ADDRESS_OPTION_REUSE 1 -#define TDI_ADDRESS_OPTION_DHCP 2 - -#ifdef __cplusplus -} -#endif - -#endif /* __TDISTAT_H */ diff --git a/reactos/include/tcpmisc.h b/reactos/include/tcpmisc.h new file mode 100644 index 00000000000..ce9c7fad8ab --- /dev/null +++ b/reactos/include/tcpmisc.h @@ -0,0 +1,96 @@ +#ifndef TCPMISC_H +#define TCPMISC_H + +#define IF_MIB_STATS_ID 1 +#define MAX_PHYSADDR_SIZE 8 +#define MAX_IFDESCR_LEN 256 + +/* ID to use for requesting an IFEntry for an interface */ +#define IF_MIB_STATS_ID 1 + +/* ID to use for requesting an IPSNMPInfo for an interface */ +#define IP_MIB_STATS_ID 1 + +/* ID to use for requesting the route table */ +#define IP_MIB_ROUTETABLE_ENTRY_ID 0x101 +#define IP_MIB_ADDRTABLE_ENTRY_ID 102 + +typedef struct IFEntry { + ULONG if_index; + ULONG if_type; + ULONG if_mtu; + ULONG if_speed; + ULONG if_physaddrlen; + UCHAR if_physaddr[MAX_PHYSADDR_SIZE]; + ULONG if_adminstatus; + ULONG if_operstatus; + ULONG if_lastchange; + ULONG if_inoctets; + ULONG if_inucastpkts; + ULONG if_innucastpkts; + ULONG if_indiscards; + ULONG if_inerrors; + ULONG if_inunknownprotos; + ULONG if_outoctets; + ULONG if_outucastpkts; + ULONG if_outnucastpkts; + ULONG if_outdiscards; + ULONG if_outerrors; + ULONG if_outqlen; + ULONG if_descrlen; + UCHAR if_descr[1]; +} IFEntry; + +typedef struct _IPRouteEntry { + ULONG ire_dest; + ULONG ire_index; //matches if_index in IFEntry and iae_index in IPAddrEntry + ULONG ire_metric; + ULONG ire_unk1; //?? + ULONG ire_unk2; //?? + ULONG ire_unk3; //?? + ULONG ire_gw; + ULONG ire_unk4; //?? + ULONG ire_unk5; //?? + ULONG ire_unk6; //?? + ULONG ire_mask; + ULONG ire_unk7; //?? + ULONG ire_unk8; //?? +} IPRouteEntry; + +typedef struct _IPAddrEntry { + ULONG iae_addr; + ULONG iae_index; + ULONG iae_mask; + ULONG iae_bcastaddr; + ULONG iae_reasmsize; + ULONG iae_context; + ULONG iae_pad; +} IPAddrEntry; + +typedef struct _IPSNMPInfo { + ULONG ipsi_index; + ULONG ipsi_forwarding; + ULONG ipsi_defaultttl; + ULONG ipsi_inreceives; + ULONG ipsi_inhdrerrors; + ULONG ipsi_inaddrerrors; + ULONG ipsi_inunknownprotos; + ULONG ipsi_indiscards; + ULONG ipsi_indelivers; + ULONG ipsi_outrequests; + ULONG ipsi_routingdiscards; + ULONG ipsi_outdiscards; + ULONG ipsi_outnoroutes; + ULONG ipsi_reasmtimeout; + ULONG ipsi_reasmreqds; + ULONG ipsi_reasmoks; + ULONG ipsi_reasmfails; + ULONG ipsi_fragoks; + ULONG ipsi_fragfails; + ULONG ipsi_fragcreates; + ULONG ipsi_numif; + ULONG ipsi_numaddr; + ULONG ipsi_numroutes; +} IPSNMPInfo; + +#endif /* TCPMISC_H */ diff --git a/reactos/lib/iphlpapi/ifenum_reactos.c b/reactos/lib/iphlpapi/ifenum_reactos.c index 554e4e00cae..92a83b9f1f9 100644 --- a/reactos/lib/iphlpapi/ifenum_reactos.c +++ b/reactos/lib/iphlpapi/ifenum_reactos.c @@ -152,7 +152,7 @@ NTSTATUS tdiGetSetOfThings( HANDLE tcpFile, * stabilizes. */ do { - assert( !entitySet ); /* We must not have an entity set allocated */ + ASSERT( !entitySet ); /* We must not have an entity set allocated */ status = DeviceIoControl( tcpFile, IOCTL_TCP_QUERY_INFORMATION_EX, &req, diff --git a/reactos/lib/iphlpapi/iphlpapi_private.h b/reactos/lib/iphlpapi/iphlpapi_private.h index 8d957f0d830..dbe089015b3 100644 --- a/reactos/lib/iphlpapi/iphlpapi_private.h +++ b/reactos/lib/iphlpapi/iphlpapi_private.h @@ -23,8 +23,8 @@ #define _WIN32_WINNT 0x500 #include <ddk/ntddk.h> #include <rosrtl/string.h> -#include <ntdll/rtl.h> -#include <net/miniport.h> +#include <ddk/miniport.h> +#include <tcpmisc.h> #include <winsock2.h> #include <nspapi.h> #include <iptypes.h> @@ -32,7 +32,7 @@ #include "resinfo.h" #include "wine/debug.h" -#include "net/tdiinfo.h" +#include "ddk/tdiinfo.h" #include "tcpioctl.h" #ifndef ETH_ALEN diff --git a/reactos/lib/msafd/include/msafd.h b/reactos/lib/msafd/include/msafd.h index ad66fc34a49..6e18d4998dd 100644 --- a/reactos/lib/msafd/include/msafd.h +++ b/reactos/lib/msafd/include/msafd.h @@ -14,7 +14,7 @@ #include <wsahelp.h> #include <winsock2.h> #include <ws2spi.h> -#include <net/tdi.h> +#include <ddk/tdi.h> #include <afd/shared.h> #include <debug.h> From 7885dac1812e66f44b7b8ba435c7e1b94ca4f9ad Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Tue, 2 Mar 2004 20:06:49 +0000 Subject: [PATCH 0299/1463] netevent.h -> ddk/netevent.h svn path=/trunk/; revision=8509 --- reactos/include/net/ndis.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/include/net/ndis.h b/reactos/include/net/ndis.h index 79d2fdb043e..20ef8f21d16 100644 --- a/reactos/include/net/ndis.h +++ b/reactos/include/net/ndis.h @@ -238,7 +238,7 @@ KeStallExecutionProcessor( ULONG MicroSeconds); -#include "netevent.h" +#include <ddk/netevent.h> #include "ndisoid.h" #include "ntddndis.h" From 3ee20ff27709220923ea6d72e8cb467aadb709c2 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Tue, 2 Mar 2004 20:29:16 +0000 Subject: [PATCH 0300/1463] - Be a bit more specific in the dependencies for the regression tests. svn path=/trunk/; revision=8510 --- reactos/tools/helper.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/tools/helper.mk b/reactos/tools/helper.mk index 16f2631e3b7..40725759b21 100644 --- a/reactos/tools/helper.mk +++ b/reactos/tools/helper.mk @@ -1,4 +1,4 @@ -# $Id: helper.mk,v 1.56 2004/02/22 18:53:38 dwelch Exp $ +# $Id: helper.mk,v 1.57 2004/03/02 20:29:16 dwelch Exp $ # # Helper makefile for ReactOS modules # Variables this makefile accepts: @@ -943,7 +943,7 @@ $(MK_RC_BINARIES): $(TARGET_RC_BINSRC) $(MK_RESOURCE): $(MK_RC_BINARIES) endif -$(REGTEST_TARGETS): tests/tests/* $(REGTESTS) +$(REGTEST_TARGETS): tests/tests/*.c $(REGTESTS) ifeq ($(MK_MODE),user) $(REGTESTS) ./tests/tests ./tests/_regtests.c ./tests/Makefile.tests -u ./tests/_rtstub.c $(MAKE) -C tests TARGET_REGTESTS=no all From 018e7a5fe75c61c4f57163ac235978a3041fdef7 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Tue, 2 Mar 2004 21:07:35 +0000 Subject: [PATCH 0301/1463] Oops. svn path=/trunk/; revision=8511 --- reactos/tools/helper.mk | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/reactos/tools/helper.mk b/reactos/tools/helper.mk index 40725759b21..9c4b5c5449b 100644 --- a/reactos/tools/helper.mk +++ b/reactos/tools/helper.mk @@ -1,4 +1,4 @@ -# $Id: helper.mk,v 1.57 2004/03/02 20:29:16 dwelch Exp $ +# $Id: helper.mk,v 1.58 2004/03/02 21:07:35 dwelch Exp $ # # Helper makefile for ReactOS modules # Variables this makefile accepts: @@ -943,7 +943,9 @@ $(MK_RC_BINARIES): $(TARGET_RC_BINSRC) $(MK_RESOURCE): $(MK_RC_BINARIES) endif -$(REGTEST_TARGETS): tests/tests/*.c $(REGTESTS) +REGTEST_TESTS = $(wildcard tests/tests/*.c) + +$(REGTEST_TARGETS): $(REGTEST_TESTS) $(REGTESTS) ifeq ($(MK_MODE),user) $(REGTESTS) ./tests/tests ./tests/_regtests.c ./tests/Makefile.tests -u ./tests/_rtstub.c $(MAKE) -C tests TARGET_REGTESTS=no all From 12090241ffb0d8a2e06be1c4a2a79c963721b0bb Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Tue, 2 Mar 2004 22:36:18 +0000 Subject: [PATCH 0302/1463] - Make dependency files depend on generated headers. svn path=/trunk/; revision=8512 --- reactos/ntoskrnl/Makefile | 12 ++++++------ reactos/tools/depend.mk | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/reactos/ntoskrnl/Makefile b/reactos/ntoskrnl/Makefile index 4e44a12fb14..73e607e5880 100644 --- a/reactos/ntoskrnl/Makefile +++ b/reactos/ntoskrnl/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.115 2004/02/24 23:51:38 dwelch Exp $ +# $Id: Makefile,v 1.116 2004/03/02 22:36:17 dwelch Exp $ # # ReactOS Operating System # @@ -69,9 +69,8 @@ TARGETNAME := ntoskrnl OBJECTS_PATH = objects -all: \ - $(OBJECTS_PATH) \ - bugcodes.rc \ +all: $(OBJECTS_PATH) \ + bugcodes.rc $(PATH_TO_TOP)/include/reactos/bugcodes.h \ $(TARGETNAME).nostrip.exe \ $(TARGETNAME).exe \ $(TARGETNAME).sym \ @@ -376,6 +375,7 @@ TAG_OBJECTS := $(join $(dir $(DEP_OBJECTS)),$(patsubst %.o, .%.TAG, $(notdir $(D # Include automatic dependancy tracking # DEP_EXCLUDE_FILTER := ex/napi.% nt/zw.% +GENERATED_HEADER_FILES := $(PATH_TO_TOP)/include/reactos/bugcodes.h include $(PATH_TO_TOP)/tools/depend.mk @@ -682,7 +682,7 @@ $(TARGETNAME).o: $(OBJECTS) -o $(TARGETNAME).o \ $(OBJECTS) -bugcodes.rc: ntoskrnl.mc +$(PATH_TO_TOP)/include/reactos/bugcodes.h bugcodes.rc: ntoskrnl.mc $(MC) \ -H $(PATH_TO_TOP)/include/reactos/bugcodes.h \ -o bugcodes.rc \ @@ -704,7 +704,7 @@ clean: lpc/*.o kd/*.o $(TARGETNAME).o junk.tmp base.tmp temp.exp \ $(TARGETNAME).exe $(TARGETNAME).nostrip.exe $(TARGETNAME).sym ntoskrnl.map \ $(TARGETNAME).coff bugcodes.rc msg?????.bin $(DEP_FILES) \ - $(TAG_OBJECTS) + $(TAG_OBJECTS) $(PATH_TO_TOP)/include/reactos/bugcodes.h .PHONY: clean diff --git a/reactos/tools/depend.mk b/reactos/tools/depend.mk index 64cf053ecc3..bb39f948d65 100644 --- a/reactos/tools/depend.mk +++ b/reactos/tools/depend.mk @@ -19,20 +19,20 @@ else DEPENDS_PATH := $(PATH_TO_TOP)/tools endif -.%.d: %.c $(PATH_TO_TOP)/tools/depends$(EXE_POSTFIX) +.%.d: %.c $(PATH_TO_TOP)/tools/depends$(EXE_POSTFIX) $(GENERATED_HEADER_FILES) $(CC) $(CFLAGS) -M $< | $(DEPENDS_PATH)$(SEP)depends$(EXE_POSTFIX) $(@D) $@ -.%.d: %.cc $(PATH_TO_TOP)/tools/depends$(EXE_POSTFIX) +.%.d: %.cc $(PATH_TO_TOP)/tools/depends$(EXE_POSTFIX) $(GENERATED_HEADER_FILES) $(CC) $(CFLAGS) -M $< | $(DEPENDS_PATH)$(SEP)depends$(EXE_POSTFIX) $(@D) $@ -.%.d: %.cpp $(PATH_TO_TOP)/tools/depends$(EXE_POSTFIX) +.%.d: %.cpp $(PATH_TO_TOP)/tools/depends$(EXE_POSTFIX) $(GENERATED_HEADER_FILES) $(CC) $(CFLAGS) -M $< | $(DEPENDS_PATH)$(SEP)depends$(EXE_POSTFIX) $(@D) $@ -.%.d: %.s $(PATH_TO_TOP)/tools/depends$(EXE_POSTFIX) +.%.d: %.s $(PATH_TO_TOP)/tools/depends$(EXE_POSTFIX) $(GENERATED_HEADER_FILES) $(CC) $(CFLAGS) -M $< | $(DEPENDS_PATH)$(SEP)depends$(EXE_POSTFIX) $(@D) $@ -.%.d: %.S $(PATH_TO_TOP)/tools/depends$(EXE_POSTFIX) +.%.d: %.S $(PATH_TO_TOP)/tools/depends$(EXE_POSTFIX) $(GENERATED_HEADER_FILES) $(CC) $(CFLAGS) -M $< | $(DEPENDS_PATH)$(SEP)depends$(EXE_POSTFIX) $(@D) $@ -.%.d: %.asm $(PATH_TO_TOP)/tools/depends$(EXE_POSTFIX) +.%.d: %.asm $(PATH_TO_TOP)/tools/depends$(EXE_POSTFIX) $(GENERATED_HEADER_FILES) $(NASM_CMD) $< | $(DEPENDS_PATH)$(SEP)depends$(EXE_POSTFIX) $(@D) $@ From 287ae5791431934c35ca6d0d1953d4f9e0bccd12 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Wed, 3 Mar 2004 03:43:40 +0000 Subject: [PATCH 0303/1463] Removed paint and wordpad dummy files svn path=/trunk/; revision=8513 --- reactos/apps/dist/paint/dummyfile | 0 reactos/apps/dist/wordpad/dummyfile | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 reactos/apps/dist/paint/dummyfile delete mode 100644 reactos/apps/dist/wordpad/dummyfile diff --git a/reactos/apps/dist/paint/dummyfile b/reactos/apps/dist/paint/dummyfile deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/reactos/apps/dist/wordpad/dummyfile b/reactos/apps/dist/wordpad/dummyfile deleted file mode 100644 index e69de29bb2d..00000000000 From 2a6974f3557e9ea9322ce412a97b60f760146b6a Mon Sep 17 00:00:00 2001 From: Royce Mitchell III <royce3@ev1.net> Date: Wed, 3 Mar 2004 04:09:20 +0000 Subject: [PATCH 0304/1463] patch by m-t: small patch to improve compatibility. svn path=/trunk/; revision=8514 --- reactos/subsys/win32k/objects/fillshap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/objects/fillshap.c b/reactos/subsys/win32k/objects/fillshap.c index 4b77c936e58..56e304f1533 100644 --- a/reactos/subsys/win32k/objects/fillshap.c +++ b/reactos/subsys/win32k/objects/fillshap.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: fillshap.c,v 1.41 2004/02/19 21:12:10 weiden Exp $ */ +/* $Id: fillshap.c,v 1.42 2004/03/03 04:09:20 royce Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> @@ -279,9 +279,9 @@ NtGdiEllipse( HPenToBrushObj(&PenBrush, dc->w.hPen); nLeftRect += dc->w.DCOrgX; - nRightRect += dc->w.DCOrgX; + nRightRect += dc->w.DCOrgX - 1; nTopRect += dc->w.DCOrgY; - nBottomRect += dc->w.DCOrgY; + nBottomRect += dc->w.DCOrgY - 1; RadiusX = max((nRightRect - nLeftRect) >> 1, 1); RadiusY = max((nBottomRect - nTopRect) >> 1, 1); From c2923708cdea885da7d970f9e3251c3dd88ab33c Mon Sep 17 00:00:00 2001 From: Royce Mitchell III <royce3@ev1.net> Date: Wed, 3 Mar 2004 06:33:58 +0000 Subject: [PATCH 0305/1463] patch by m-t and myself: fixes RoundRect compatibility issue. svn path=/trunk/; revision=8515 --- reactos/subsys/win32k/objects/fillshap.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/reactos/subsys/win32k/objects/fillshap.c b/reactos/subsys/win32k/objects/fillshap.c index 56e304f1533..47d5f1bd262 100644 --- a/reactos/subsys/win32k/objects/fillshap.c +++ b/reactos/subsys/win32k/objects/fillshap.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: fillshap.c,v 1.42 2004/03/03 04:09:20 royce Exp $ */ +/* $Id: fillshap.c,v 1.43 2004/03/03 06:33:58 royce Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> @@ -1079,13 +1079,14 @@ IntRoundRect( int top, int right, int bottom, - int xradius, - int yradius) + int xCurveDiameter, + int yCurveDiameter) { SURFOBJ *SurfObj; BRUSHOBJ PenBrush, *PenBrushObj, *FillBrushObj; RECTL RectBounds; int i, col, row, width, height, x1, x1start, x2, x2start, y1, y2; + int xradius, yradius; //float aspect_square; long a_square, b_square, two_a_square, two_b_square, @@ -1097,8 +1098,12 @@ IntRoundRect( ASSERT ( dc ); // caller's responsibility to set this up if ( PATH_IsPathOpen(dc->w.path) ) - return PATH_RoundRect ( dc, left, top, right, bottom, xradius, yradius ); + return PATH_RoundRect ( dc, left, top, right, bottom, + xCurveDiameter, yCurveDiameter ); + xradius = xCurveDiameter >> 1; + yradius = yCurveDiameter >> 1; + left += dc->w.DCOrgX; right += dc->w.DCOrgX; top += dc->w.DCOrgY; From 8a70e9b5a5536ec29cfc89ba9526f921db7413b7 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Wed, 3 Mar 2004 19:11:20 +0000 Subject: [PATCH 0306/1463] Working on Making ReactOS run Windows CE apps........ Dont expect much yet. this is a work in progress. svn path=/trunk/; revision=8517 --- reactos/lib/coredll/Makefile | 19 + reactos/lib/coredll/coredll.def | 1405 ++++++++++++++++++++++++++++ reactos/lib/coredll/coredll.rc | 38 + reactos/lib/coredll/coredll_main.c | 29 + 4 files changed, 1491 insertions(+) create mode 100644 reactos/lib/coredll/Makefile create mode 100644 reactos/lib/coredll/coredll.def create mode 100644 reactos/lib/coredll/coredll.rc create mode 100644 reactos/lib/coredll/coredll_main.c diff --git a/reactos/lib/coredll/Makefile b/reactos/lib/coredll/Makefile new file mode 100644 index 00000000000..0643ca69d63 --- /dev/null +++ b/reactos/lib/coredll/Makefile @@ -0,0 +1,19 @@ + +PATH_TO_TOP = ../.. + +TARGET_TYPE = dynlink + +TARGET_NAME = coredll + +TARGET_BASE=0x73D80000 + +# require os code to explicitly request A/W version of structs/functions +TARGET_CFLAGS += -D_DISABLE_TIDENTS -Wall -Werror + +TARGET_SDKLIBS = ntdll.a kernel32.a + +TARGET_OBJECTS = coredll_main.o + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk diff --git a/reactos/lib/coredll/coredll.def b/reactos/lib/coredll/coredll.def new file mode 100644 index 00000000000..bdb9061ee44 --- /dev/null +++ b/reactos/lib/coredll/coredll.def @@ -0,0 +1,1405 @@ +LIBRARY COREDLL.dll +EXPORTS +;??0exception@std@@QAE@ABV01@@Z @1572 +;??0exception@std@@QAE@PBD@Z @1571 +;??0exception@std@@QAE@XZ @1570 +;??0type_info@@AAE@ABV0@@Z @1568 +;??1exception@std@@UAE@XZ @1574 +;??1type_info@@UAE@XZ @1562 +;??2@YAPAXI@Z @1095 +;??2@YAPAXIABUnothrow_t@std@@@Z @1646 +;??3@YAXPAX@Z @1094 +;??3@YAXPAXABUnothrow_t@std@@@Z @1662 +;??4exception@std@@QAEAAV01@ABV01@@Z @1573 +;??4type_info@@AAEAAV0@ABV0@@Z @1569 +;??8type_info@@QBEHABV0@@Z @1563 +;??9type_info@@QBEHABV0@@Z @1564 +;??_7exception@std@@6B@ @1579 +;??_7type_info@@6B@ @1580 +;??_L@YGXPAXIHP6EX0@Z1@Z @1576 +;??_M@YGXPAXIHP6EX0@Z@Z @1578 +;??_N@YGXPAXIHP6EX0@Z1@Z @1577 +;??_U@YAPAXI@Z @1456 +;??_U@YAPAXIABUnothrow_t@std@@@Z @1661 +;??_V@YAXPAX@Z @1457 +;??_V@YAXPAXABUnothrow_t@std@@@Z @1663 +;?DefaultImcGet@@YAKXZ @1218 +;?DefaultImeWndGet@@YAPAUHWND__@@XZ @1219 +;?ImmGetUIClassName@@YAPAGXZ @1223 +;?ImmProcessKey@@YAKPAUHWND__@@IJKI@Z @1220 +;?ImmSetActiveContext@@YAHPAUHWND__@@KH@Z @806 +;?ImmTranslateMessage@@YAHPAUHWND__@@IIJHIIPAH@Z @1221 +;?_Nomemory@std@@YAXXZ @1660 +;?_Xlen@std@@YAXXZ @1658 +;?_Xran@std@@YAXXZ @1659 +;?__set_inconsistency@@YAP6AXXZP6AXXZ@Z @1555 +;?_inconsistency@@YAXXZ @1558 +;?_query_new_handler@@YAP6AHI@ZXZ @1618 +;?_query_new_mode@@YAHXZ @1649 +;?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z @1650 +;?_set_new_mode@@YAHH@Z @1648 +;?before@type_info@@QBEHABV1@@Z @1565 +;?name@type_info@@QBEPBDXZ @1566 +;?nothrow@std@@3Unothrow_t@1@B @1647 +;?raw_name@type_info@@QBEPBDXZ @1567 +;?set_new_handler@@YAP6AXXZP6AXXZ@Z @1619 +;?set_terminate@std@@YAP6AXXZP6AXXZ@Z @1552 +;?set_unexpected@std@@YAP6AXXZP6AXXZ@Z @1553 +;?terminate@std@@YAXXZ @1556 +;?unexpected@std@@YAXXZ @1557 +;?what@exception@std@@UBEPBDXZ @1575 +;_AAFS_CloseAllFileHandles @655 +_AFS_CreateDirectoryW @644 +;_AFS_CreateFileW @648 +;_AFS_DeleteFileW @649 +;_AFS_FindFirstChangeNotificationW @1685 +;_AFS_FindFirstFileW @651 +;_AFS_GetDiskFreeSpace @656 +;_AFS_GetFileAttributesW @646 +;_AFS_MoveFileW @650 +;_AFS_NotifyMountedFS @657 +;_AFS_PrestoChangoFileName @654 +;_AFS_RegisterFileSystemFunction @652 +;_AFS_RemoveDirectoryW @645 +;_AFS_SetFileAttributesW @647 +;_AFS_Unmount @643 +;_AbortDoc @955 +;_AccessibilitySoundSentryEvent @1540 +;_ActivateDevice @1179 +;_ActivateDeviceEx @1494 +;_ActivateService @1508 +;_AddEventAccess @558 +;_AddFontResourceW @893 +;_AddTrackedItem @578 +;_AdjustWindowRectEx @887 +;_AdvertiseInterface @1687 +;_AllKeys @1453 +;_AllocPhysMem @1486 +;_AppendMenuW @842 +;_AttachDebugger @157 +;_AudioUpdateFromRegistry @376 +;_BatteryDrvrGetLevels @297 +;_BatteryDrvrSupportsChangeNotification @298 +;_BatteryGetLifeTimeInfo @713 +;_BatteryNotifyOfTimeChange @714 +;_BeginDeferWindowPos @1157 +;_BeginPaint @260 +;_BinaryCompress @593 +;_BinaryDecompress @594 +;_BitBlt @903 +;_BringWindowToTop @275 +;_CacheSync @577 +;_CallNextHookEx @1204 +;_CallWindowProcW @285 +;_CechangeDatabaseLCID @340 +;_CeclearUserNotification @474 +;_CecreateDatabase @315 +;_CecreateDatabaseEx @1190 +;_CecreateDatabaseEx2 @1468 +;_CeDeleteDatabase @318 +;_CeDeleteDatabaseEx @1193 +;_CeDeleteRecord @320 +;_CeEnumDBVolumes @1165 +;_CeEventHasOccurred @479 +;_CeFindFirstDatabase @313 +;_CeFindFirstDatabaseEx @1196 +;_CeFindNextDatabase @314 +;_CeFindNextDatabaseEx @1189 +;_CeFlushDBVol @1217 +;_CeFreeNotification @1226 +;_CeGenRandom @1601 +;_CeGetCallerTrust @1395 +;_CeGetCurrentTrust @1357 +;_CeGetDBInformationByHandle @1473 +;_CeGetRandomSeed @1443 +;_CeGetThreadPriority @622 +;_CeGetThreadQuantum @1245 +;_CeGetUserNotification @1354 +;_CeGetUserNotificationHandles @1353 +;_CeGetUserNotificationPreferences @478 +;_CeHandleAppNotifications @477 +_CeLogData @1451 +_CeLogGetZones @1681 +_CeLogReSync @1467 +_CeLogSetZones @1452 +_CeMapArgumentArray @1446 +_CeModuleJit @53 +_CeMountDBVol @1164 +_CeOidGetInfo @312 +_CeOidGetInfoEx @1195 +_CeOidGetInfoEx2 @1472 +_CeOpenDatabase @317 +_CeOpenDatabaseEx @1192 +_CeOpenDatabaseEx2 @1469 +_CeReadRecordProps @321 +_CeReadRecordPropsEx @1194 +_CeRegisterFileSystemNotification @331 +_CeRemoveFontResource @894 +_CeResyncFilesys @1425 +_CeRunAppAtEvent @476 +_CeRunAppAtTime @475 +_CeSeekDatabase @319 +_CeSeekDatabaseEx @1470 +_CeSetDatabaseInfo @316 +_CeSetDatabaseInfoEx @1191 +_CeSetDatabaseInfoEx2 @1471 +_CeSetExtendedPdata @1455 +_CeSetThreadPriority @621 +_CeSetThreadQuantum @1244 +_CeSetUserNotification @473 +_CeSetUserNotificationEx @1352 +_CeUnmountDBVol @1197 +_CeWriteRecordProps @322 +_ChangeDisplaySettingsEx @1611 +_CharLowerBuffW @222 +_CharLowerW @221 +_CharNextW @226 +_CharPrevW @225 +_CharUpperBuffW @223 +_CharUpperW @224 +_CheckMenuItem @848 +_CheckMenuRadioItem @849 +_CheckPassword @182 +_CheckRadioButton @684 +_ChildWindowFromPoint @253 +_ClearCommBreak @107 +_ClearCommError @108 +_ClientToScreen @254 +_ClipCursor @731 +_CloseAllDeviceHandles @244 +_CloseAllFileHandles @242 +_CloseAllServiceHandles @1511 +_CloseClipboard @669 +_CloseEnhMetaFile @956 +_CloseHandle @553 +_CloseMsgQueue @1533 +_CloseProcOE @589 +_ComThreadBaseFunc @1240 +_CombineRgn @968 +_CompactAllHeaps @54 +_CompareFileTime @18 +_CompareStringW @198 +_ConnectDebugger @633 +_ContinueDebugEvent @504 +_ConvertDefaultLocale @210 +_ConvertThreadToFiber @1480 +_CopyFileW @164 +_CopyRect @96 +_CountClipboardFormats @674 +_CreateAPIHandle @636 +_CreateAPISet @559 +_CreateAcceleratorTableW @92 +_CreateBitmap @901 +_CreateBitmapFromPointer @946 +_CreateCaret @658 +_CreateCompatibleBitmap @902 +_CreateCompatibleDC @910 +_CreateCrit @616 +_CreateCursor @722 +_CreateDCW @909 +_CreateDIBPatternBrushPt @929 +_CreateDIBSection @90 +_CreateDeviceHandle @245 +_CreateDialogIndirectParamW @688 +_CreateDirectoryW @160 +_CreateEnhMetaFileW @957 +_CreateEventW @495 +_CreateFiber @1483 +_CreateFileForMapping @552 +_CreateFileForMappingW @1167 +_CreateFileMappingW @548 +_CreateFileW @168 +_CreateFontIndirectW @895 +_CreateIconIndirect @723 +_CreateLocaleView @1466 +_CreateMenu @851 +_CreateMsgQueue @1529 +_CreateMutexW @555 +_CreatePalette @947 +_CreatePatternBrush @925 +_CreatePen @926 +_CreatePenIndirect @930 +_CreatePopupMenu @852 +_CreateProcessW @493 +_CreateRectRgn @980 +_CreateRectRgnIndirect @969 +_CreateSemaphoreW @1238 +_CreateServiceHandle @1512 +_CreateSolidBrush @931 +_CreateStaticMapping @1539 +_CreateThread @492 +_CreateWindowExW @246 +_CryptAcquireContextW @126 +_CryptContextAddRef @154 +_CryptCreateHash @137 +_CryptDecrypt @136 +_CryptDeriveKey @129 +_CryptDestroyHash @140 +_CryptDestroyKey @130 +_CryptDuplicateHash @156 +_CryptDuplicateKey @155 +_CryptEncrypt @135 +_CryptEnumProviderTypesW @152 +_CryptEnumProvidersW @153 +_CryptExportKey @133 +_CryptGenKey @128 +_CryptGenRandom @143 +_CryptGetDefaultProviderW @151 +_CryptGetHashParam @146 +_CryptGetKeyParam @132 +_CryptGetProvParam @148 +_CryptGetUserKey @144 +_CryptHashData @139 +_CryptHashSessionKey @138 +_CryptImportKey @134 +_CryptProtectData @1599 +_CryptReleaseContext @127 +_CryptSetHashParam @147 +_CryptSetKeyParam @131 +_CryptSetProvParam @149 +_CryptSetProviderExW @150 +_CryptSetProviderW @145 +_CryptSignHashW @141 +_CryptUnprotectData @1600 +_CryptVerifySignatureW @142 +_DBCanonicalize @233 +_DDKReg_GetIsrInfo @1669 +_DDKReg_GetPciInfo @1670 +_DDKReg_GetWindowInfo @1668 +;_DeactivateDevice @1180 +;_DebugActiveProcess @505 +;_DebugNotify @642 +;_DefDlgProcW @689 +;_DefWindowProcW @264 +;_DeferWindowPos @1158 +;_DeleteAndRenameFile @183 +;_DeleteCriticalSection @3 +;_DeleteDC @911 +;_DeleteEnhMetaFile @958 +;_DeleteFiber @1484 +;_DeleteFileW @165 +;_DeleteMenu @850 +;_DeleteObject @912 +;_DeleteTrackedItem @579 +;_DeregisterAFS @335 +;_DeregisterAFSName @339 +;_DeregisterDevice @236 +;_DeregisterService @1510 +;_DestroyAcceleratorTable @93 +;_DestroyCaret @659 +;_DestroyCursor @724 +;_DestroyIcon @725 +;_DestroyMenu @844 +;_DestroyWindow @265 +;_DeviceIoControl @179 +;_DevicePowerNotify @1588 +;_DialogBoxIndirectParamW @690 +;_DisableCaretSystemWide @666 +;_DisableThreadLibraryCalls @1232 +;_DispatchMessageW @859 +;_DrawEdge @932 +;_DrawFocusRect @933 +;_DrawFrameControl @987 +;_DrawIconEx @726 +;_DrawMenuBar @856 +;_DrawTextW @945 +;_DumpFileSystemHeap @341 +;_DumpKCallProfile @510 +;_DuplicateHandle @1535 +;_Ellipse @934 +;_EmptyClipboard @677 +;_EnableCaretSystemWide @667 +;_EnableEUDC @986 +;_EnableHardwareKeyboard @825 +;_EnableMenuItem @847 +;_EnableWindow @287 +;_EndDeferWindowPos @1159 +;_EndDialog @691 +;_EndDoc @959 +;_EndPage @960 +;_EndPaint @261 +;_EnterCriticalSection @4 +;_EnumCalendarInfoW @206 +;_EnumClipboardFormats @675 +;_EnumDateFormatsW @208 +;_EnumDevices @124 +;_EnumDisplayMonitors @1526 +;_EnumFontFamiliesW @965 +;_EnumFontsW @966 +;_EnumPnpIds @123 +;_EnumPropsEx @1500 +;_EnumServices @1517 +;_EnumSystemCodePagesW @220 +;_EnumSystemLocalesW @219 +;_EnumTimeFormatsW @207 +;_EnumWindows @291 +;_EqualRect @97 +;_EqualRgn @91 +;_EscapeCommFunction @109 +;_EventModify @494 +;_ExcludeClipRect @970 +;_ExitThread @6 +;_ExtCreateRegion @1617 +;_ExtEscape @1182 +;_ExtTextOutW @896 +;_ExtractIconExW @727 +;_ExtractResource @573 +;_FileSystemPowerFunction @241 +;_FileTimeToLocalFileTime @21 +;_FileTimeToSystemTime @20 +;_FillRect @935 +;_FillRgn @927 +;_FilterTrackedItem @585 +;_FindClose @180 +;_FindCloseChangeNotification @1684 +;_FindFirstChangeNotificationW @1682 +;_FindFirstFileExW @1235 +;_FindFirstFileW @167 +;_FindNextChangeNotification @1683 +;_FindNextFileW @181 +;_FindResource @531 +;_FindResourceW @532 +;_FindWindowW @286 +;_FlushFileBuffers @175 +;_FlushInstructionCache @508 +;_FlushViewOfFile @551 +;_FlushViewOfFileMaybe @1215 +;_FoldStringW @218 +;_ForcePageout @540 +;_FormatMessageW @234 +;_FreeIntChainHandler @1476 +;_FreeLibrary @529 +;_FreeLibraryAndExitThread @1216 +;_FreePhysMem @1487 +;_GetACP @186 +;_GetAPIAddress @32 +;_GetActiveWindow @706 +;_GetAssociatedMenu @300 +;_GetAsyncKeyState @826 +;_GetAsyncShiftFlags @834 +;_GetBkColor @913 +;_GetBkMode @914 +;_GetCPInfo @188 +;_GetCRTFlags @1228 +;_GetCRTStorageEx @1227 +;_GetCallerProcess @607 +;_GetCallerProcessIndex @641 +;_GetCapture @707 +;_GetCaretBlinkTime @665 +;_GetCaretPos @663 +;_GetCharWidth32 @1664 +;_GetClassInfoW @878 +;_GetClassLong @881 +;_GetClassLongW @879 +;_GetClassNameW @283 +;_GetClientRect @249 +;_GetClipBox @971 +;_GetClipCursor @732 +;_GetClipRgn @972 +;_GetClipboardData @672 +;_GetClipboardDataAlloc @681 +;_GetClipboardFormatNameW @676 +;_GetClipboardOwner @670 +;_GetCommMask @110 +;_GetCommModemStatus @111 +;_GetCommProperties @112 +;_GetCommState @113 +;_GetCommTimeouts @114 +;_GetCommandLineW @1231 +;_GetCurrencyFormatW @205 +;_GetCurrentFT @29 +;_GetCurrentFiber @1481 +;_GetCurrentObject @915 +;_GetCurrentPermissions @612 +;_GetCurrentPositionEx @1653 +;_GetCursor @733 +;_GetCursorPos @734 +;_GetDC @262 +;_GetDCEx @1185 +;_GetDIBColorTable @1665 +;_GetDateFormatW @203 +;_GetDesktopWindow @1397 +;_GetDeviceByIndex @1236 +;_GetDeviceCaps @916 +;_GetDeviceKeys @125 +;_GetDevicePower @1679 +;_GetDialogBaseUnits @694 +;_GetDiskFreeSpaceExW @184 +;_GetDlgCtrlID @693 +;_GetDlgItem @692 +;_GetDlgItemInt @695 +;_GetDlgItemTextW @687 +;_GetDoubleClickTime @888 +;_GetEventData @1527 +;_GetExitCodeProcess @519 +;_GetExitCodeThread @518 +;_GetFSHeapInfo @603 +;_GetFiberData @1482 +;_GetFileAttributesExW @1237 +;_GetFileAttributesW @166 +;_GetFileInformationByHandle @174 +;_GetFileSize @172 +;_GetFileTime @176 +;_GetFileVersionInfoSizeW @1461 +;_GetFileVersionInfoW @1460 +;_GetFocus @705 +;_GetForegroundInfo @1224 +;_GetForegroundKeyboardTarget @1225 +;_GetForegroundWindow @701 +;_GetHeapSnapshot @52 +;_GetIdleTime @608 +;_GetKPhys @581 +;_GetKeyState @860 +;_GetKeyboardLayout @1229 +;_GetKeyboardLayoutNameW @1160 +;_GetKeyboardStatus @827 +;_GetKeyboardTarget @711 +;_GetLastError @516 +;_GetLocalTime @23 +;_GetLocaleInfoW @200 +;_GetMenuItemInfoW @854 +;_GetMessagePos @862 +;_GetMessageQueueReadyTimeStamp @1477 +;_GetMessageSource @872 +;_GetMessageW @861 +;_GetMessageWNoWait @863 +;_GetModuleFileNameW @537 +;_GetModuleHandleW @1177 +;_GetMonitorInfo @1525 +;_GetMouseMovePoints @820 +;_GetMsgQueueInfo @1532 +;_GetNearestColor @952 +;_GetNearestPaletteIndex @948 +;_GetNextDlgGroupItem @697 +;_GetNextDlgTabItem @696 +;_GetNumberFormatW @204 +;_GetOEMCP @187 +;_GetObjectType @917 +;_GetObjectW @918 +;_GetOpenClipboardWindow @680 +;_GetOpenFileNameW @488 +;_GetOwnerProcess @606 +;_GetPaletteEntries @949 +;_GetParent @269 +;_GetPasswordActive @239 +;_GetPasswordStatus @1538 +;_GetPixel @936 +;_GetPriorityClipboardFormat @679 +;_GetPrivateCallbacks @1400 +;_GetProcAddrBits @602 +;_GetProcAddressA @1230 +;_GetProcAddressW @530 +;_GetProcFromPtr @600 +;_GetProcName @624 +;_GetProcessHeap @50 +;_GetProcessIndexFromID @640 +;_GetProcessVersion @536 +;_GetProp @1498 +;_GetQueueStatus @1420 +;_GetRealTime @570 +;_GetRegionData @973 +;_GetRgnBox @974 +;_GetRomFileBytes @576 +;_GetRomFileInfo @575 +;_GetSaveFileNameW @489 +;_GetScrollInfo @282 +;_GetServiceByIndex @1513 +;_GetServiceHandle @1518 +;_GetStdioPathW @1149 +;_GetStockObject @919 +;_GetStoreInformation @323 +;_GetStringTypeExW @217 +;_GetStringTypeW @216 +;_GetSubMenu @855 +;_GetSysColor @889 +;_GetSysColorBrush @937 +;_GetSystemDefaultLCID @213 +;_GetSystemDefaultLangID @211 +;_GetSystemInfo @542 +;_GetSystemMemoryDivision @336 +;_GetSystemMetrics @885 +;_GetSystemPaletteEntries @950 +;_GetSystemPowerState @1581 +;_GetSystemPowerStatusEx @715 +;_GetSystemPowerStatusEx2 @1358 +;_GetSystemTime @25 +;_GetTempFileNameW @1234 +;_GetTempPathW @162 +;_GetTextAlign @1655 +;_GetTextColor @920 +;_GetTextExtentExPointW @897 +;_GetTextFaceW @967 +;_GetTextMetricsW @898 +;_GetThreadContext @1148 +;_GetThreadPriority @515 +;_GetThreadTimes @1186 +;_GetTickCount @535 +;_GetTimeFormatW @202 +;_GetTimeZoneInformation @27 +;_GetUpdateRect @274 +;_GetUpdateRgn @273 +;_GetUserDefaultLCID @215 +;_GetUserDefaultLangID @212 +;_GetUserDirectory @1686 +;_GetUserNameExW @1503 +;_GetVersionEx @17 +;_GetVersionExW @717 +;_GetWindow @251 +;_GetWindowDC @270 +;_GetWindowLongW @259 +;_GetWindowRect @248 +;_GetWindowRgn @1399 +;_GetWindowTextLengthW @276 +;_GetWindowTextW @257 +;_GetWindowTextWDirect @1454 +;_GetWindowThreadProcessId @292 +;_GiveKPhys @582 +;_GlobalAddAtomW @1519 +;_GlobalDeleteAtom @1520 +;_GlobalFindAtomW @1521 +;_GlobalMemoryStatus @88 +;_GwesPowerOffSystem @296 +;_HeapAlloc @46 +;_HeapCreate @44 +;_HeapDestroy @45 +;_HeapFree @49 +;_HeapReAlloc @47 +;_HeapSize @48 +;_HeapValidate @51 +;_HideCaret @660 +_ImageList_Add @738 +_ImageList_AddMasked @739 +_ImageList_BeginDrag @740 +_ImageList_Copy @767 +_ImageList_CopyDitherImage @741 +_ImageList_Create @742 +_ImageList_Destroy @743 +_ImageList_DragEnter @744 +_ImageList_DragLeave @745 +_ImageList_DragMove @746 +_ImageList_DragShowNolock @747 +_ImageList_Draw @748 +_ImageList_DrawEx @749 +_ImageList_DrawIndirect @750 +_ImageList_Duplicate @768 +_ImageList_EndDrag @751 +_ImageList_GetBkColor @752 +_ImageList_GetDragImage @753 +_ImageList_GetIcon @754 +_ImageList_GetIconSize @755 +_ImageList_GetImageCount @756 +_ImageList_GetImageInfo @757 +_ImageList_LoadImage @758 +_ImageList_Merge @759 +_ImageList_Remove @760 +_ImageList_Replace @761 +_ImageList_ReplaceIcon @762 +_ImageList_SetBkColor @763 +_ImageList_SetDragCursorImage @764 +_ImageList_SetIconSize @765 +_ImageList_SetImageCount @769 +_ImageList_SetOverlayImage @766 +_ImmAssociateContext @770 +_ImmAssociateContextEx @1205 +_ImmConfigureIMEW @771 +_ImmCreateContext @1198 +_ImmCreateIMCC @772 +_ImmDestroyContext @1199 +_ImmDestroyIMCC @773 +_ImmDisableIME @1206 +_ImmEnableIME @1541 +_ImmEnumRegisterWordW @774 +_ImmEscapeW @775 +_ImmGenerateMessage @776 +_ImmGetCandidateListCountW @778 +_ImmGetCandidateListW @777 +_ImmGetCandidateWindow @779 +_ImmGetCompositionFontW @780 +_ImmGetCompositionStringW @781 +_ImmGetCompositionWindow @782 +_ImmGetContext @783 +_ImmGetConversionListW @784 +_ImmGetConversionStatus @785 +_ImmGetDefaultIMEWnd @786 +_ImmGetDescriptionW @787 +_ImmGetGuideLineW @788 +_ImmGetHotKey @813 +_ImmGetIMCCLockCount @789 +_ImmGetIMCCSize @790 +_ImmGetIMCLockCount @791 +_ImmGetIMEFileNameW @1207 +_ImmGetImeMenuItemsW @1211 +_ImmGetOpenStatus @792 +_ImmGetProperty @793 +_ImmGetRegisterWordStyleW @794 +_ImmGetStatusWindowPos @1200 +_ImmGetVirtualKey @1210 +_ImmIsIME @1209 +_ImmIsUIMessageW @796 +_ImmLockIMC @797 +_ImmLockIMCC @798 +_ImmNotifyIME @800 +_ImmReSizeIMCC @801 +_ImmRegisterWordW @802 +_ImmReleaseContext @803 +_ImmRequestMessageW @1242 +_ImmSIPanelState @804 +_ImmSetCandidateWindow @807 +_ImmSetCompositionFontW @808 +_ImmSetCompositionStringW @809 +_ImmSetCompositionWindow @810 +_ImmSetConversionStatus @811 +_ImmSetHotKey @812 +_ImmSetImeWndIMC @1222 +_ImmSetOpenStatus @814 +_ImmSetStatusWindowPos @815 +_ImmSimulateHotKey @816 +_ImmUnlockIMC @817 +_ImmUnlockIMCC @818 +_ImmUnregisterWordW @819 +_InSendMessage @1419 +_InflateRect @98 +_InitLocale @8 +_InitializeCriticalSection @2 +_InputDebugCharW @595 +_InsertMenuW @841 +_InterruptDisable @629 +_InterruptDone @628 +_InterruptInitialize @627 +_IntersectClipRect @975 +_IntersectRect @99 +_InvalidateRect @250 +_InvalidateRgn @1615 +_IsAPIReady @30 +_IsBadCodePtr @521 +_IsBadPtr @601 +_IsBadReadPtr @522 +_IsBadWritePtr @523 +_IsChild @277 +_IsClipboardFormatAvailable @678 +_IsDBCSLeadByte @191 +_IsDBCSLeadByteEx @192 +_IsDialogMessageW @698 +_IsEncryptionPermitted @613 +_IsExiting @159 +_IsPrimaryThread @610 +_IsProcessDying @1213 +_IsRectEmpty @100 +_IsSystemFile @1680 +_IsValidCodePage @185 +_IsValidLocale @209 +_IsWindow @271 +_IsWindowEnabled @288 +_IsWindowVisible @886 +_KernExtractIcons @574 +_KernelIoControl @557 +_KernelLibIoControl @1489 +_KeybdGetDeviceInfo @828 +_KeybdInitStates @829 +_KeybdVKeyToUnicode @830 +_KillAllOtherThreads @605 +_KillTimer @876 +_LCMapStringW @199 +_LeaveCritSec @597 +_LeaveCriticalSection @5 +_LineTo @1652 +_LoadAcceleratorsW @94 +_LoadAnimatedCursor @1493 +_LoadBitmapW @873 +_LoadCursorW @683 +_LoadDriver @626 +_LoadFSD @237 +_LoadFSDEx @1421 +_LoadIconW @728 +_LoadImageW @730 +_LoadIntChainHandler @1475 +_LoadKernelLibrary @1671 +_LoadLibraryExW @1241 +_LoadLibraryW @528 +_LoadMenuW @846 +_LoadResource @533 +_LoadStringW @874 +_LocalAlloc @33 +_LocalAllocInProcess @41 +_LocalFileTimeToFileTime @22 +_LocalFree @36 +_LocalFreeInProcess @42 +_LocalReAlloc @34 +_LocalSize @35 +_LocalSizeInProcess @43 +_LockPages @1161 +_MainThreadBaseFunc @14 +_MapCallerPtr @1602 +_MapDialogRect @699 +_MapPtrToProcWithSize @1603 +_MapPtrToProcess @598 +_MapPtrUnsecure @599 +_MapViewOfFile @549 +_MapVirtualKeyW @831 +_MapWindowPoints @284 +_MaskBlt @904 +_MessageBeep @857 +_MessageBoxW @858 +_MonitorFromPoint @1522 +_MonitorFromRect @1523 +_MonitorFromWindow @1524 +_MoveFileW @163 +_MoveToEx @1651 +_MoveWindow @272 +_MsgWaitForMultipleObjectsEx @871 +_MultiByteToWideChar @196 +_NKDbgPrintfW @545 +_NKTerminateThread @623 +_NKvDbgPrintfW @568 +_NLedGetDeviceInfo @839 +_NLedSetDevice @840 +_NotifyForceCleanboot @513 +_NotifyWinUserSystem @716 +_OffsetRect @101 +_OffsetRgn @976 +_OpenClipboard @668 +_OpenDeviceKey @1396 +_OpenEventW @1496 +_OpenMsgQueue @1536 +_OpenProcess @509 +_OtherThreadsRunning @604 +_OutputDebugStringW @541 +_PPSHRestart @638 +_PSLNotify @7 +_PatBlt @938 +_PeekMessageW @864 +_PegClearUserNotification @468 +_PegCreateDatabase @304 +_PegDeleteDatabase @307 +_PegDeleteRecord @309 +_PegFindFirstDatabase @302 +_PegFindNextDatabase @303 +_PegGetUserNotificationPreferences @472 +_PegHandleAppNotifications @471 +_PegOidGetInfo @301 +_PegOpenDatabase @306 +_PegReadRecordProps @310 +_PegRemoveFontResource @899 +_PegRunAppAtEvent @470 +_PegRunAppAtTime @469 +_PegSeekDatabase @308 +_PegSetDatabaseInfo @305 +_PegSetUserNotification @467 +_PegWriteRecordProps @311 +_PerformCallBack4 @1448 +_PlayEnhMetaFile @961 +_PlaySoundW @378 +_Polygon @939 +_Polyline @940 +_PostKeybdMessage @832 +_PostMessageW @865 +_PostQuitMessage @866 +_PostThreadMessageW @290 +_PowerOffSystem @617 +_PrintTrackedItem @580 +_ProcessDetachAllDLLs @572 +_ProfileStart @82 +_ProfileStop @83 +_ProfileSyscall @569 +_PtInRect @102 +_PtInRegion @977 +_PurgeComm @115 +_QASetWindowsJournalHook @821 +_QAUnhookWindowsJournalHook @822 +_QueryAPISetID @490 +_QueryInstructionSet @1677 +_QueryPerformanceCounter @538 +_QueryPerformanceFrequency @539 +_RaiseException @543 +_Random @80 +_ReadFile @170 +_ReadFileWithSeek @243 +_ReadMsgQueue @1530 +_ReadProcessMemory @506 +_ReadRegistryFromOEM @1153 +_RealizePalette @953 +_RectInRegion @978 +_RectVisible @981 +_Rectangle @941 +_RectangleAnimation @294 +_RedrawWindow @1672 +_RefreshKernelAlarm @587 +_RegCloseKey @455 +_RegCopyFile @465 +_RegCreateKeyExW @456 +_RegDeleteKeyW @457 +_RegDeleteValueW @458 +_RegEnumKeyExW @460 +_RegEnumValueW @459 +_RegFlushKey @1152 +_RegOpenKeyExW @461 +_RegOpenProcessKey @1542 +_RegQueryInfoKeyW @462 +_RegQueryValueExW @463 +_RegReplaceKey @1479 +_RegRestoreFile @466 +_RegSaveKey @1478 +_RegSetValueExW @464 +_RegisterAFSEx @1490 +_RegisterAFSName @338 +_RegisterAPISet @635 +_RegisterClassW @95 +_RegisterClassWStub @883 +_RegisterClipboardFormatW @673 +_RegisterDbgZones @546 +_RegisterDesktop @1507 +_RegisterDevice @235 +_RegisterHotKey @835 +_RegisterPowerRelationship @1609 +_RegisterSIPanel @293 +_RegisterService @1509 +_RegisterTaskBar @892 +_RegisterTaskBarEx @1506 +_RegisterTrackedItem @584 +_RegisterWindowMessageW @891 +_ReleaseCapture @709 +_ReleaseDC @263 +_ReleaseMutex @556 +_ReleasePowerRelationship @1610 +_ReleasePowerRequirement @1584 +_ReleaseSemaphore @1239 +_RemoteHeapAlloc @1604 +_RemoteHeapFree @1606 +_RemoteHeapReAlloc @1605 +_RemoteHeapSize @1607 +_RemoteLocalAlloc @37 +_RemoteLocalFree @40 +_RemoteLocalReAlloc @38 +_RemoteLocalSize @39 +_RemoveDirectoryW @161 +_RemoveFontResourceW @900 +_RemoveMenu @843 +_RemoveProp @1499 +_RequestDeviceNotifications @1504 +_RequestPowerNotifications @1585 +_ResourceCreateList @1612 +_ResourceRelease @1614 +_ResourceRequest @1613 +_RestoreDC @907 +_ResumeThread @500 +_RoundRect @942 +_SHAddToRecentDocs @483 +_SHCreateExplorerInstance @1163 +_SHCreateShortcut @484 +_SHCreateShortcutEx @1488 +_SHGetFileInfo @482 +_SHGetShortcutTarget @485 +_SHGetSpecialFolderPath @295 +_SHLoadDIBitmap @487 +_SHShowOutOfMemory @486 +_SaveDC @908 +_ScreenToClient @255 +_ScrollDC @985 +_ScrollWindowEx @289 +_SelectClipRgn @979 +_SelectObject @921 +_SelectPalette @954 +_SendDlgItemMessageW @685 +_SendInput @823 +_SendMessageTimeout @1495 +_SendMessageW @868 +_SendNotifyMessageW @869 +_ServiceAddPort @1515 +_ServiceIoControl @1514 +_ServiceUnbindPorts @1516 +_SetACP @189 +_SetAbortProc @962 +_SetActiveWindow @703 +_SetAssociatedMenu @299 +_SetBkColor @922 +_SetBkMode @923 +_SetBrushOrgEx @943 +_SetCapture @708 +_SetCaretBlinkTime @664 +_SetCaretPos @662 +_SetClassLong @882 +_SetClassLongW @880 +_SetCleanRebootFlag @615 +_SetClipboardData @671 +_SetCommBreak @116 +_SetCommMask @117 +_SetCommState @118 +_SetCommTimeouts @119 +_SetCurrentUser @1501 +_SetCursor @682 +_SetCursorPos @736 +_SetDIBColorTable @1666 +_SetDaylightTime @547 +_SetDbgZone @618 +_SetDevicePower @1678 +_SetDlgItemInt @700 +_SetDlgItemTextW @686 +_SetEndOfFile @178 +_SetEventData @1528 +_SetExceptionHandler @583 +_SetFileAttributesW @169 +_SetFilePointer @173 +_SetFileTime @177 +_SetFocus @704 +_SetForegroundWindow @702 +_SetGwesOOMEvent @590 +_SetGwesPowerHandler @632 +_SetHandleOwner @625 +_SetHardwareWatch @634 +_SetInterruptEvent @158 +_SetKMode @630 +_SetKernelAlarm @586 +_SetKeyboardTarget @710 +_SetLastError @517 +_SetLocalTime @24 +_SetLocaleInfoW @201 +_SetLowestScheduledPriority @609 +_SetMenuItemInfoW @853 +_SetOEMCP @190 +_SetOOMEvent @1462 +_SetObjectOwner @984 +_SetPaletteEntries @951 +_SetParent @268 +_SetPassword @238 +_SetPasswordActive @240 +_SetPasswordStatus @1537 +_SetPixel @944 +_SetPowerOffHandler @631 +_SetPowerRequirement @1583 +_SetProcPermissions @611 +_SetProp @1497 +_SetROP2 @928 +_SetRealTime @571 +_SetRect @103 +_SetRectEmpty @104 +_SetRectRgn @982 +_SetScrollInfo @279 +_SetScrollPos @280 +_SetScrollRange @281 +_SetStdioPathW @1150 +_SetSysColors @890 +_SetSystemDefaultLCID @214 +_SetSystemMemoryDivision @337 +_SetSystemPowerState @1582 +_SetSystemTime @26 +_SetTextAlign @1654 +_SetTextColor @924 +_SetThreadContext @502 +_SetThreadPriority @514 +_SetTimeZoneBias @614 +_SetTimeZoneInformation @28 +_SetTimer @875 +_SetUserData @1502 +_SetViewportOrgEx @983 +_SetWDevicePowerHandler @1178 +_SetWindowLongW @258 +_SetWindowPos @247 +_SetWindowRgn @1398 +_SetWindowTextW @256 +_SetWindowsHookExW @1202 +_SetupComm @120 +_ShellExecuteEx @480 +_ShellModalEnd @712 +_Shell_NotifyIcon @481 +_ShowCaret @661 +_ShowCursor @737 +_ShowWindow @266 +_SignalStarted @639 +_SizeofResource @534 +_Sleep @496 +_SleepTillTick @1534 +_StartDocW @963 +_StartPage @964 +_StopDeviceNotifications @1505 +_StopPowerNotifications @1586 +_StretchBlt @905 +_StretchDIBits @1667 +_StringCompress @591 +_StringDecompress @592 +_SubtractRect @105 +_SuspendThread @499 +_SwitchToFiber @1485 +_SystemIdleTimerReset @837 +_SystemMemoryLow @720 +_SystemParametersInfoW @89 +_SystemStarted @1 +_SystemTimeToFileTime @19 +_THCreateSnapshot @511 +_THGrow @512 +_TakeCritSec @596 +_TerminateProcess @544 +_TerminateThread @491 +_ThreadAttachAllDLLs @561 +_ThreadBaseFunc @13 +_ThreadDetachAllDLLs @562 +_ThreadExceptionExit @1474 +_TlsCall @520 +_TlsGetValue @15 +_TlsSetValue @16 +_TouchCalibrate @877 +_TrackPopupMenuEx @845 +_TranslateAcceleratorW @838 +_TranslateCharsetInfo @1166 +_TranslateMessage @870 +_TransmitCommChar @121 +_TransparentImage @906 +_TryEnterCriticalSection @1233 +_TurnOffProfiling @620 +_TurnOnProfiling @619 +_U_rclose @567 +_U_rlseek @566 +_U_ropen @563 +_U_rread @564 +_U_rwrite @565 +_UnhookWindowsHookEx @1203 +_UnionRect @106 +_UnlockPages @1162 +_UnmapViewOfFile @550 +_UnregisterClassW @884 +_UnregisterFunc1 @1156 +_UnregisterHotKey @836 +_UpdateNLSInfo @1447 +_UpdateWindow @267 +_ValidateRect @278 +_ValidateRgn @1616 +_VerQueryValueW @1459 +_VerifyAPIHandle @637 +_VirtualAlloc @524 +_VirtualCopy @560 +_VirtualFree @525 +_VirtualProtect @526 +_VirtualQuery @527 +_WNetAddConnection3W @444 +_WNetCancelConnection2W @445 +_WNetCloseEnum @453 +_WNetConnectionDialog1W @446 +_WNetDisconnectDialog @447 +_WNetDisconnectDialog1W @448 +_WNetEnumResourceW @454 +_WNetGetConnectionW @449 +_WNetGetUniversalNameW @450 +_WNetGetUserW @451 +_WNetOpenEnumW @452 +_WaitCommEvent @122 +_WaitForDebugEvent @503 +_WaitForMultipleObjects @498 +_WaitForSingleObject @497 +_WideCharToMultiByte @197 +_WindowFromPoint @252 +_WriteDebugLED @1155 +_WriteFile @171 +_WriteFileWithSeek @718 +_WriteMsgQueue @1531 +_WriteProcessMemory @507 +_WriteRegistryToOEM @1154 +__CIacos @2020 +__CIasin @2019 +__CIatan @2021 +__CIatan2 @2022 +__CIcos @2017 +__CIcosh @2024 +__CIexp @2015 +__CIfmod @2026 +__CIlog @2013 +__CIlog10 @2014 +__CIpow @2012 +__CIsin @2016 +__CIsinh @2023 +__CIsqrt @2011 +__CItan @2018 +__CItanh @2025 +__CxxThrowException@8 @1551 +__EH_prolog @1620 +__HUGE @1181 +__InitStdioLib @1151 +__XcptFilter @1645 +___CxxFrameHandler @1550 +___RTCastToVoid @1559 +___RTDynamicCast @1561 +___RTtypeid @1560 +___abnormal_termination @86 +___strgtold12 @1089 +__alldiv @2001 +__allmul @2002 +__alloca_probe @2010 +__allrem @2003 +__allshl @2005 +__allshr @2004 +__atodbl @996 +__atoflt @997 +__atoi64 @1418 +__aulldiv @2006 +__aullrem @2008 +__aullshr @2007 +__cabs @998 +__chgsign @1000 +__chkstk @2009 +__clearfp @1001 +__controlfp @1002 +__copysign @1003 +__ecvt @1008 +__except_handler3 @84 +__fcloseall @1119 +__fcvt @1011 +__fileno @1124 +__finite @1012 +__fload @2027 +__fltused @1093 +__flushall @1123 +__fpclass @1015 +__fpieee_flt @1016 +__fpreset @1017 +__frnd @1020 +__fsqrt @1021 +__ftol @2028 +__gcvt @1022 +__getstdfilex @1100 +__getws @1138 +__hypot @1023 +__inp @2029 +__inpd @2031 +__inpw @2030 +__isctype @1417 +__isnan @1024 +__itoa @1025 +__itow @1026 +__j0 @1027 +__j1 @1028 +__jn @1029 +__ld12tod @1087 +__ld12tof @1088 +__local_unwind2 @85 +__logb @1035 +__lrotl @1037 +__lrotr @1038 +__ltoa @1039 +__ltow @1040 +__memccpy @1042 +__memicmp @1045 +__msize @1049 +__nextafter @1050 +__outp @2032 +__outpd @2034 +__outpw @2033 +__purecall @1092 +__putws @1139 +__rotl @1055 +__rotr @1056 +__scalb @1057 +__setjmp3 @2000 +__setmode @1187 +__snprintf @729 +__snwprintf @1096 +__statusfp @1062 +__strdup @1409 +__stricmp @1410 +__strlwr @1415 +__strnicmp @1411 +__strnset @1412 +__strrev @1413 +__strset @1414 +__strupr @1416 +__swab @1074 +__ultoa @1079 +__ultow @1080 +__vsnprintf @1147 +__vsnwprintf @1132 +__wcsdup @74 +__wcsicmp @230 +__wcslwr @231 +__wcsnicmp @229 +__wcsnset @67 +__wcsrev @70 +__wcsset @71 +__wcsupr @232 +__wfdopen @1117 +__wfopen @1145 +__wfreopen @1201 +__wtol @78 +__wtoll @79 +__y0 @1084 +__y1 @1085 +__yn @1086 +_abs @988 +_acos @989 +_asin @990 +_atan @991 +_atan2 @992 +_atof @995 +_atoi @993 +_atol @994 +_calloc @1346 +_ceil @999 +_clearerr @1127 +_cos @1004 +_cosh @1005 +_difftime @1006 +_div @1007 +_exp @1009 +_fabs @1010 +_fclose @1118 +_feof @1125 +_ferror @1126 +_fflush @1122 +_fgetc @1108 +_fgetpos @1128 +_fgets @1109 +_fgetwc @1140 +_fgetws @1143 +_floor @1013 +_fmod @1014 +_fopen @1113 +_fprintf @1115 +_fputc @1110 +_fputs @1111 +_fputwc @1141 +_fputws @1144 +_fread @1120 +_free @1018 +_frexp @1019 +_fscanf @1114 +_fseek @1130 +_fsetpos @1129 +_ftell @1131 +_fwprintf @867 +_fwrite @1121 +_fwscanf @735 +_getchar @1104 +_gets @1106 +_getwchar @1136 +_iswctype @193 +_keybd_event @833 +_labs @1030 +_ldexp @1031 +_ldiv @1032 +_log @1033 +_log10 @1034 +_longjmp @1036 +_lstrcmpW @227 +_lstrcmpiW @228 +_malloc @1041 +_mbstowcs @76 +_memchr @31 +_memcmp @1043 +_memcpy @1044 +_memmove @1046 +_memset @1047 +_mixerClose @1598 +_mixerGetControlDetails @1589 +_mixerGetDevCaps @1591 +_mixerGetID @1590 +_mixerGetLineControls @1592 +_mixerGetLineInfo @1593 +_mixerGetNumDevs @1594 +_mixerMessage @1596 +_mixerOpen @1595 +_mixerSetControlDetails @1597 +_modf @1048 +_mouse_event @824 +_pow @1051 +_printf @1102 +_putchar @1105 +_puts @1107 +_putwchar @1137 +_qsort @1052 +_rand @1053 +_realloc @1054 +_scanf @1101 +_setvbuf @1608 +_sin @1058 +_sinh @1059 +_sndPlaySoundW @377 +_sprintf @719 +_sqrt @1060 +_srand @1061 +_sscanf @653 +_strcat @1063 +_strchr @1064 +_strcmp @1065 +_strcpy @1066 +_strcspn @1067 +_strlen @1068 +_strncat @1069 +_strncmp @1070 +_strncpy @1071 +;_strpbrk @1406 +;_strrchr @1407 +;_strspn @1408 +;_strstr @1072 +;_strtod @1403 +;_strtok @1073 +;_strtol @1404 +;_strtoul @1405 +;_swprintf @1097 +;_swscanf @1098 +;_tan @1075 +;_tanh @1076 +;_tolower @1090 +;_toupper @1091 +;_towlower @194 +;_towupper @195 +;_ungetc @1112 +;_ungetwc @1142 +;_vfprintf @1116 +;_vfwprintf @721 +;_vprintf @1103 +;_vsprintf @1146 +;_vswprintf @1099 +;_vwprintf @1135 +;_waveInAddBuffer @406 +;_waveInClose @403 +;_waveInGetDevCaps @401 +;_waveInGetErrorText @402 +;_waveInGetID @411 +;_waveInGetNumDevs @400 +;_waveInGetPosition @410 +;_waveInMessage @412 +;_waveInOpen @413 +;_waveInPrepareHeader @404 +;_waveInReset @409 +;_waveInStart @407 +;_waveInStop @408 +;_waveInUnprepareHeader @405 +;_waveOutBreakLoop @391 +;_waveOutClose @384 +;_waveOutGetDevCaps @380 +;_waveOutGetErrorText @383 +;_waveOutGetID @397 +;_waveOutGetNumDevs @379 +;_waveOutGetPitch @393 +;_waveOutGetPlaybackRate @395 +;_waveOutGetPosition @392 +;_waveOutGetVolume @381 +;_waveOutMessage @398 +;_waveOutOpen @399 +;_waveOutPause @388 +;_waveOutPrepareHeader @385 +;_waveOutReset @390 +;_waveOutRestart @389 +;_waveOutSetPitch @394 +;_waveOutSetPlaybackRate @396 +;_waveOutSetVolume @382 +;_waveOutUnprepareHeader @386 +;_waveOutWrite @387 +;_wcscat @58 +;_wcschr @59 +;_wcscmp @60 +;_wcscpy @61 +;_wcscspn @62 +;_wcslen @63 +;_wcsncat @64 +;_wcsncmp @65 +;_wcsncpy @66 +;_wcspbrk @68 +;_wcsrchr @69 +;_wcsspn @72 +;_wcsstr @73 +;_wcstod @1081 +;_wcstok @77 +;_wcstol @1082 +;_wcstombs @75 +;_wcstoul @1083 +;_wprintf @1134 +;_wscanf @1133 +;_wsprintfW @56 +;_wvsprintfW @57 diff --git a/reactos/lib/coredll/coredll.rc b/reactos/lib/coredll/coredll.rc new file mode 100644 index 00000000000..a8cca81fe9e --- /dev/null +++ b/reactos/lib/coredll/coredll.rc @@ -0,0 +1,38 @@ +#include <defines.h> +#include <reactos/resource.h> + +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", "ReactOS WinCE Compatiblity Layer\0" + VALUE "FileVersion", RES_STR_FILE_VERSION + VALUE "InternalName", "coredll\0" + VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT + VALUE "OriginalFilename", "coredll.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/coredll/coredll_main.c b/reactos/lib/coredll/coredll_main.c new file mode 100644 index 00000000000..17880a8374e --- /dev/null +++ b/reactos/lib/coredll/coredll_main.c @@ -0,0 +1,29 @@ +/* + * ReactOS-CE Core OS Dll + * + * Copyright 2004 Steven Edwards + * + * 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 "windows.h" + +BOOL STDCALL +DllMain(HANDLE hDll, + DWORD dwReason, + LPVOID lpReserved) +{ + return TRUE; +} From 18f3babce6faddcc04e0d2c021ddcda7573a1c2f Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Wed, 3 Mar 2004 19:26:58 +0000 Subject: [PATCH 0307/1463] merge Wine commit about: Modified files: dlls/shell32 : shlexec.c Log message: Martin Fuchs <martin-fuchs@gmx.net> Fix buffer length usage for RegQueryValueW() calls at various places. Patch: http://cvs.winehq.org/patch.py?id=11331 svn path=/trunk/; revision=8518 --- reactos/lib/shell32/shlexec.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/reactos/lib/shell32/shlexec.c b/reactos/lib/shell32/shlexec.c index eb36c0f47e3..5e59d51e182 100644 --- a/reactos/lib/shell32/shlexec.c +++ b/reactos/lib/shell32/shlexec.c @@ -451,14 +451,16 @@ static UINT SHELL_FindExecutableByOperation(LPCWSTR lpPath, LPCWSTR lpFile, LPCW strcatW(filetype, lpOperation); strcatW(filetype, wCommand); - if (RegQueryValueW(HKEY_CLASSES_ROOT, filetype, command, &commandlen) == ERROR_SUCCESS) + if (RegQueryValueW(HKEY_CLASSES_ROOT, filetype, command, + &commandlen) == ERROR_SUCCESS) { commandlen /= sizeof(WCHAR); if (key) strcpyW(key, filetype); #if 0 - LPSTR tmp; - char param[256]; - LONG paramlen = 256; + LPWSTR tmp; + WCHAR param[256]; + LONG paramlen = sizeof(param); + static const WCHAR wSpace[] = {' ',0}; /* FIXME: it seems all Windows version don't behave the same here. * the doc states that this ddeexec information can be found after @@ -467,14 +469,15 @@ static UINT SHELL_FindExecutableByOperation(LPCWSTR lpPath, LPCWSTR lpFile, LPCW */ /* Get the parameters needed by the application from the associated ddeexec key */ - tmp = strstr(filetype, "command"); + tmp = strstrW(filetype, wCommand); tmp[0] = '\0'; - strcat(filetype, "ddeexec"); - - if (RegQueryValueA(HKEY_CLASSES_ROOT, filetype, param, ¶mlen) == ERROR_SUCCESS) + strcatW(filetype, wDdeexec); + if (RegQueryValueW(HKEY_CLASSES_ROOT, filetype, param, + ¶mlen) == ERROR_SUCCESS) { - strcat(command, " "); - strcat(command, param); + paramlen /= sizeof(WCHAR); + strcatW(command, wSpace); + strcatW(command, param); commandlen += paramlen; } #endif @@ -511,7 +514,7 @@ UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, WCHAR *extension = NULL; /* pointer to file extension */ WCHAR wtmpext[5]; /* local copy to mung as we please */ WCHAR filetype[256]; /* registry name for this filetype */ - LONG filetypelen = 256; /* length of above */ + LONG filetypelen = sizeof(filetype); /* length of above */ WCHAR command[256]; /* command from registry */ WCHAR wBuffer[256]; /* Used to GetProfileString */ UINT retval = 31; /* default - 'No association was found' */ @@ -652,7 +655,6 @@ UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, if (retval > 32) break; } - RegCloseKey(hkey); } } @@ -748,7 +750,7 @@ static unsigned dde_connect(WCHAR * key, WCHAR* start, WCHAR* ddeexec, unsigned ret = 31; strcpyW(endkey, wApplication); - applen = sizeof(app); /* buffer length for RegQueryValueW() is in bytes! */ + applen = sizeof(app); if (RegQueryValueW(HKEY_CLASSES_ROOT, key, app, &applen) != ERROR_SUCCESS) { FIXME("default app name NIY %s\n", debugstr_w(key)); @@ -833,8 +835,6 @@ static UINT execute_from_key(LPWSTR key, LPCWSTR lpFile, void *env, LPCWSTR szCo WCHAR param[256]; LONG paramlen = sizeof(param); - cmdlen /= sizeof(WCHAR); - param[0] = '\0'; /* Get the parameters needed by the application @@ -851,6 +851,7 @@ static UINT execute_from_key(LPWSTR key, LPCWSTR lpFile, void *env, LPCWSTR szCo else { /* Is there a replace() function anywhere? */ + cmdlen /= sizeof(WCHAR); cmd[cmdlen] = '\0'; SHELL_ArgifyW(param, sizeof(param)/sizeof(WCHAR), cmd, lpFile, psei->lpIDList, szCommandline); retval = execfunc(param, env, FALSE, psei, psei_out); From 556bf3a4efa3d9ff278789898296b3636c197051 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Wed, 3 Mar 2004 20:11:31 +0000 Subject: [PATCH 0308/1463] new cmdlen parameter for SHELL_FindExecutablebyOperation() svn path=/trunk/; revision=8519 --- reactos/lib/shell32/shlexec.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/reactos/lib/shell32/shlexec.c b/reactos/lib/shell32/shlexec.c index 5e59d51e182..4e9a62354eb 100644 --- a/reactos/lib/shell32/shlexec.c +++ b/reactos/lib/shell32/shlexec.c @@ -440,12 +440,10 @@ end: return found; } -static UINT SHELL_FindExecutableByOperation(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, LPWSTR key, LPWSTR filetype, LPWSTR command) +static UINT SHELL_FindExecutableByOperation(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, LPWSTR key, LPWSTR filetype, LPWSTR command, LONG commandlen) { static const WCHAR wCommand[] = {'\\','c','o','m','m','a','n','d',0}; - LONG commandlen = 256*sizeof(WCHAR); /* This is the most DOS can handle :) */ - /* Looking for ...buffer\shell\<verb>\command */ strcatW(filetype, wszShell); strcatW(filetype, lpOperation); @@ -621,6 +619,7 @@ UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, { filetypelen /= sizeof(WCHAR); filetype[filetypelen] = '\0'; + TRACE("File type: %s\n", debugstr_w(filetype)); } } @@ -630,14 +629,14 @@ UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, { /* pass the operation string to SHELL_FindExecutableByOperation() */ filetype[filetypelen] = '\0'; - retval = SHELL_FindExecutableByOperation(lpPath, lpFile, lpOperation, key, filetype, command); + retval = SHELL_FindExecutableByOperation(lpPath, lpFile, lpOperation, key, filetype, command, sizeof(command)); } else { WCHAR operation[MAX_PATH]; HKEY hkey; - /* Looking for ...buffer\shell\lpOperation\command */ + /* Looking for ...buffer\shell\<operation>\command */ strcatW(filetype, wszShell); /* enumerate the operation subkeys in the registry and search for one with an associated command */ @@ -650,7 +649,7 @@ UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, break; filetype[filetypelen] = '\0'; - retval = SHELL_FindExecutableByOperation(lpPath, lpFile, operation, key, filetype, command); + retval = SHELL_FindExecutableByOperation(lpPath, lpFile, operation, key, filetype, command, sizeof(command)); if (retval > 32) break; @@ -1236,7 +1235,7 @@ BOOL WINAPI ShellExecuteExW32 (LPSHELLEXECUTEINFOW psei, SHELL_ExecuteW32 execfu strncpyW(wszProtocol, lpFile, iSize); wszProtocol[iSize] = '\0'; strcatW(wszProtocol, wszShell); - strcatW(wszProtocol, sei_tmp.lpVerb? sei_tmp.lpVerb: wszOpen); /*FIXME: enumerate registry subkeys - compare with the loop into SHELL_FindExecutable() */ + strcatW(wszProtocol, sei_tmp.lpVerb? sei_tmp.lpVerb: wszOpen); strcatW(wszProtocol, wCommand); /* Remove File Protocol from lpFile */ From d39b5e77aa891a66fa7d1cac745103330835bc3f Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Wed, 3 Mar 2004 20:29:51 +0000 Subject: [PATCH 0309/1463] add opened files to the "recent documents" list svn path=/trunk/; revision=8520 --- reactos/subsys/system/explorer/doxy-footer.html | 2 +- reactos/subsys/system/explorer/shell/entries.cpp | 3 +++ reactos/subsys/system/explorer/shell/shellbrowser.cpp | 9 ++++++++- reactos/subsys/system/explorer/shell/shellfs.cpp | 3 +++ 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/system/explorer/doxy-footer.html b/reactos/subsys/system/explorer/doxy-footer.html index e6d0fc2383f..9eedeb9fbfb 100644 --- a/reactos/subsys/system/explorer/doxy-footer.html +++ b/reactos/subsys/system/explorer/doxy-footer.html @@ -3,7 +3,7 @@ <tr> <td><address style="align: right;"><small> ROS Explorer Source Code Documentation -<br>generated on 28.02.2004 by <a href="http://www.doxygen.org/index.html"> +<br>generated on 01.03.2004 by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border=0> </small></address> </td> diff --git a/reactos/subsys/system/explorer/shell/entries.cpp b/reactos/subsys/system/explorer/shell/entries.cpp index dcf89d8bf56..94f927c5887 100644 --- a/reactos/subsys/system/explorer/shell/entries.cpp +++ b/reactos/subsys/system/explorer/shell/entries.cpp @@ -404,6 +404,9 @@ BOOL Entry::launch_entry(HWND hwnd, UINT nCmdShow) if (!get_path(cmd)) return FALSE; + // add path to the recent file list + SHAddToRecentDocs(SHARD_PATH, cmd); + // start program, open document... return launch_file(hwnd, cmd, nCmdShow); } diff --git a/reactos/subsys/system/explorer/shell/shellbrowser.cpp b/reactos/subsys/system/explorer/shell/shellbrowser.cpp index 9052c506c54..a2c67edfa9b 100644 --- a/reactos/subsys/system/explorer/shell/shellbrowser.cpp +++ b/reactos/subsys/system/explorer/shell/shellbrowser.cpp @@ -523,7 +523,14 @@ bool ShellBrowserChild::expand_folder(ShellDirectory* entry) } -void ShellBrowserChild::jump_to(void* path) +void ShellBrowserChild::jump_to(LPCTSTR path) +{ + ///@todo implement "file://", ... parsing + jump_to(ShellPath(path)); +} + + +void ShellBrowserChild::jump_to(LPCITEMIDLIST pidl) { //@@ diff --git a/reactos/subsys/system/explorer/shell/shellfs.cpp b/reactos/subsys/system/explorer/shell/shellfs.cpp index f3c6c943a36..6d24f4ce184 100644 --- a/reactos/subsys/system/explorer/shell/shellfs.cpp +++ b/reactos/subsys/system/explorer/shell/shellfs.cpp @@ -190,6 +190,9 @@ BOOL ShellEntry::launch_entry(HWND hwnd, UINT nCmdShow) ShellPath shell_path = create_absolute_pidl(); shexinfo.lpIDList = &*shell_path; + // add PIDL to the recent file list + SHAddToRecentDocs(SHARD_PIDL, shexinfo.lpIDList); + BOOL ret = TRUE; if (!ShellExecuteEx(&shexinfo)) { From 30f3bfac23e1bd4cdff4f96a400831b6c0388e9d Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Wed, 3 Mar 2004 20:29:52 +0000 Subject: [PATCH 0310/1463] add opened files to the "recent documents" list svn path=/trunk/; revision=8522 --- reactos/subsys/system/explorer/taskbar/startmenu.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/reactos/subsys/system/explorer/taskbar/startmenu.cpp b/reactos/subsys/system/explorer/taskbar/startmenu.cpp index fe77f92fad8..972d5842a2b 100644 --- a/reactos/subsys/system/explorer/taskbar/startmenu.cpp +++ b/reactos/subsys/system/explorer/taskbar/startmenu.cpp @@ -1125,6 +1125,9 @@ void StartMenu::ActivateEntry(int id, const ShellEntrySet& entries) shexinfo.lpIDList = &*shell_path; + // add PIDL to the recent file list + SHAddToRecentDocs(SHARD_PIDL, shexinfo.lpIDList); + if (!ShellExecuteEx(&shexinfo)) display_error(hparent, GetLastError()); From f4ce2a5433d816f644f9dd331fefa99411efbe6d Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Wed, 3 Mar 2004 20:33:21 +0000 Subject: [PATCH 0311/1463] correct jump_to() functions svn path=/trunk/; revision=8523 --- reactos/subsys/system/explorer/shell/filechild.cpp | 2 +- reactos/subsys/system/explorer/shell/filechild.h | 2 +- reactos/subsys/system/explorer/shell/shellbrowser.h | 3 ++- reactos/subsys/system/explorer/shell/webchild.cpp | 2 +- reactos/subsys/system/explorer/shell/webchild.h | 2 +- reactos/subsys/system/explorer/utility/window.h | 2 +- 6 files changed, 7 insertions(+), 6 deletions(-) diff --git a/reactos/subsys/system/explorer/shell/filechild.cpp b/reactos/subsys/system/explorer/shell/filechild.cpp index e1ddb0db808..eb0b572d9a2 100644 --- a/reactos/subsys/system/explorer/shell/filechild.cpp +++ b/reactos/subsys/system/explorer/shell/filechild.cpp @@ -644,7 +644,7 @@ int FileChildWindow::Notify(int id, NMHDR* pnmh) } -void FileChildWindow::jump_to(void* path) +void FileChildWindow::jump_to(LPCTSTR path) { //@@ diff --git a/reactos/subsys/system/explorer/shell/filechild.h b/reactos/subsys/system/explorer/shell/filechild.h index f4d17f64274..8f038900247 100644 --- a/reactos/subsys/system/explorer/shell/filechild.h +++ b/reactos/subsys/system/explorer/shell/filechild.h @@ -100,7 +100,7 @@ protected: int Notify(int id, NMHDR* pnmh); virtual void resize_children(int cx, int cy); - virtual void jump_to(void* path); + virtual void jump_to(LPCTSTR path); void scan_entry(Entry* entry, HWND hwnd); diff --git a/reactos/subsys/system/explorer/shell/shellbrowser.h b/reactos/subsys/system/explorer/shell/shellbrowser.h index 0df72a068c7..7ff89de3e2f 100644 --- a/reactos/subsys/system/explorer/shell/shellbrowser.h +++ b/reactos/subsys/system/explorer/shell/shellbrowser.h @@ -125,7 +125,8 @@ protected: int InsertSubitems(HTREEITEM hParentItem, Entry* entry, IShellFolder* pParentFolder); bool InitDragDrop(); - virtual void jump_to(void* path); + virtual void jump_to(LPCTSTR path); + void jump_to(LPCITEMIDLIST pidl); HRESULT OnDefaultCommand(LPIDA pida); diff --git a/reactos/subsys/system/explorer/shell/webchild.cpp b/reactos/subsys/system/explorer/shell/webchild.cpp index e53acbe0a4a..f6e6dc74159 100644 --- a/reactos/subsys/system/explorer/shell/webchild.cpp +++ b/reactos/subsys/system/explorer/shell/webchild.cpp @@ -288,7 +288,7 @@ LRESULT WebChildWindow::WndProc(UINT message, WPARAM wparam, LPARAM lparam) } -void WebChildWindow::jump_to(void* path) +void WebChildWindow::jump_to(LPCTSTR path) { //@@ diff --git a/reactos/subsys/system/explorer/shell/webchild.h b/reactos/subsys/system/explorer/shell/webchild.h index 25e7dbbb5e4..fb7174d40c2 100644 --- a/reactos/subsys/system/explorer/shell/webchild.h +++ b/reactos/subsys/system/explorer/shell/webchild.h @@ -1076,5 +1076,5 @@ protected: LRESULT WndProc(UINT message, WPARAM wparam, LPARAM lparam); - virtual void jump_to(void* path); + virtual void jump_to(LPCTSTR path); }; diff --git a/reactos/subsys/system/explorer/utility/window.h b/reactos/subsys/system/explorer/utility/window.h index 62edba0ab57..02d7b90f13c 100644 --- a/reactos/subsys/system/explorer/utility/window.h +++ b/reactos/subsys/system/explorer/utility/window.h @@ -293,7 +293,7 @@ protected: LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); virtual void resize_children(int cx, int cy); - virtual void jump_to(void* path) = 0; + virtual void jump_to(LPCTSTR path) = 0; protected: MenuInfo*_menu_info; From 2bb6230071fb5c9a86f90748a0602f0a2ea5cb3f Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Wed, 3 Mar 2004 23:27:27 +0000 Subject: [PATCH 0312/1463] Created a Edf file. Commented the rest of the functions out pending my testing of the WinCE MessageBox app tonight. svn path=/trunk/; revision=8524 --- reactos/lib/coredll/coredll.def | 1804 +++++++++++++++---------------- reactos/lib/coredll/coredll.edf | 1405 ++++++++++++++++++++++++ 2 files changed, 2307 insertions(+), 902 deletions(-) create mode 100644 reactos/lib/coredll/coredll.edf diff --git a/reactos/lib/coredll/coredll.def b/reactos/lib/coredll/coredll.def index bdb9061ee44..72554d4a696 100644 --- a/reactos/lib/coredll/coredll.def +++ b/reactos/lib/coredll/coredll.def @@ -118,154 +118,154 @@ _AFS_CreateDirectoryW @644 ;_CeGetUserNotificationHandles @1353 ;_CeGetUserNotificationPreferences @478 ;_CeHandleAppNotifications @477 -_CeLogData @1451 -_CeLogGetZones @1681 -_CeLogReSync @1467 -_CeLogSetZones @1452 -_CeMapArgumentArray @1446 -_CeModuleJit @53 -_CeMountDBVol @1164 -_CeOidGetInfo @312 -_CeOidGetInfoEx @1195 -_CeOidGetInfoEx2 @1472 -_CeOpenDatabase @317 -_CeOpenDatabaseEx @1192 -_CeOpenDatabaseEx2 @1469 -_CeReadRecordProps @321 -_CeReadRecordPropsEx @1194 -_CeRegisterFileSystemNotification @331 -_CeRemoveFontResource @894 -_CeResyncFilesys @1425 -_CeRunAppAtEvent @476 -_CeRunAppAtTime @475 -_CeSeekDatabase @319 -_CeSeekDatabaseEx @1470 -_CeSetDatabaseInfo @316 -_CeSetDatabaseInfoEx @1191 -_CeSetDatabaseInfoEx2 @1471 -_CeSetExtendedPdata @1455 -_CeSetThreadPriority @621 -_CeSetThreadQuantum @1244 -_CeSetUserNotification @473 -_CeSetUserNotificationEx @1352 -_CeUnmountDBVol @1197 -_CeWriteRecordProps @322 -_ChangeDisplaySettingsEx @1611 -_CharLowerBuffW @222 -_CharLowerW @221 -_CharNextW @226 -_CharPrevW @225 -_CharUpperBuffW @223 -_CharUpperW @224 -_CheckMenuItem @848 -_CheckMenuRadioItem @849 -_CheckPassword @182 -_CheckRadioButton @684 -_ChildWindowFromPoint @253 -_ClearCommBreak @107 -_ClearCommError @108 -_ClientToScreen @254 -_ClipCursor @731 -_CloseAllDeviceHandles @244 -_CloseAllFileHandles @242 -_CloseAllServiceHandles @1511 -_CloseClipboard @669 -_CloseEnhMetaFile @956 -_CloseHandle @553 -_CloseMsgQueue @1533 -_CloseProcOE @589 -_ComThreadBaseFunc @1240 -_CombineRgn @968 -_CompactAllHeaps @54 -_CompareFileTime @18 -_CompareStringW @198 -_ConnectDebugger @633 -_ContinueDebugEvent @504 -_ConvertDefaultLocale @210 -_ConvertThreadToFiber @1480 -_CopyFileW @164 -_CopyRect @96 -_CountClipboardFormats @674 -_CreateAPIHandle @636 -_CreateAPISet @559 -_CreateAcceleratorTableW @92 -_CreateBitmap @901 -_CreateBitmapFromPointer @946 -_CreateCaret @658 -_CreateCompatibleBitmap @902 -_CreateCompatibleDC @910 -_CreateCrit @616 -_CreateCursor @722 -_CreateDCW @909 -_CreateDIBPatternBrushPt @929 -_CreateDIBSection @90 -_CreateDeviceHandle @245 -_CreateDialogIndirectParamW @688 -_CreateDirectoryW @160 -_CreateEnhMetaFileW @957 -_CreateEventW @495 -_CreateFiber @1483 -_CreateFileForMapping @552 -_CreateFileForMappingW @1167 -_CreateFileMappingW @548 -_CreateFileW @168 -_CreateFontIndirectW @895 -_CreateIconIndirect @723 -_CreateLocaleView @1466 -_CreateMenu @851 -_CreateMsgQueue @1529 -_CreateMutexW @555 -_CreatePalette @947 -_CreatePatternBrush @925 -_CreatePen @926 -_CreatePenIndirect @930 -_CreatePopupMenu @852 -_CreateProcessW @493 -_CreateRectRgn @980 -_CreateRectRgnIndirect @969 -_CreateSemaphoreW @1238 -_CreateServiceHandle @1512 -_CreateSolidBrush @931 -_CreateStaticMapping @1539 -_CreateThread @492 -_CreateWindowExW @246 -_CryptAcquireContextW @126 -_CryptContextAddRef @154 -_CryptCreateHash @137 -_CryptDecrypt @136 -_CryptDeriveKey @129 -_CryptDestroyHash @140 -_CryptDestroyKey @130 -_CryptDuplicateHash @156 -_CryptDuplicateKey @155 -_CryptEncrypt @135 -_CryptEnumProviderTypesW @152 -_CryptEnumProvidersW @153 -_CryptExportKey @133 -_CryptGenKey @128 -_CryptGenRandom @143 -_CryptGetDefaultProviderW @151 -_CryptGetHashParam @146 -_CryptGetKeyParam @132 -_CryptGetProvParam @148 -_CryptGetUserKey @144 -_CryptHashData @139 -_CryptHashSessionKey @138 -_CryptImportKey @134 -_CryptProtectData @1599 -_CryptReleaseContext @127 -_CryptSetHashParam @147 -_CryptSetKeyParam @131 -_CryptSetProvParam @149 -_CryptSetProviderExW @150 -_CryptSetProviderW @145 -_CryptSignHashW @141 -_CryptUnprotectData @1600 -_CryptVerifySignatureW @142 -_DBCanonicalize @233 -_DDKReg_GetIsrInfo @1669 -_DDKReg_GetPciInfo @1670 -_DDKReg_GetWindowInfo @1668 +;_CeLogData @1451 +;_CeLogGetZones @1681 +;_CeLogReSync @1467 +;_CeLogSetZones @1452 +;_CeMapArgumentArray @1446 +;_CeModuleJit @53 +;_CeMountDBVol @1164 +;_CeOidGetInfo @312 +;_CeOidGetInfoEx @1195 +;_CeOidGetInfoEx2 @1472 +;_CeOpenDatabase @317 +;_CeOpenDatabaseEx @1192 +;_CeOpenDatabaseEx2 @1469 +;_CeReadRecordProps @321 +;_CeReadRecordPropsEx @1194 +;_CeRegisterFileSystemNotification @331 +;_CeRemoveFontResource @894 +;_CeResyncFilesys @1425 +;_CeRunAppAtEvent @476 +;_CeRunAppAtTime @475 +;_CeSeekDatabase @319 +;_CeSeekDatabaseEx @1470 +;_CeSetDatabaseInfo @316 +;_CeSetDatabaseInfoEx @1191 +;_CeSetDatabaseInfoEx2 @1471 +;_CeSetExtendedPdata @1455 +;_CeSetThreadPriority @621 +;_CeSetThreadQuantum @1244 +;_CeSetUserNotification @473 +;_CeSetUserNotificationEx @1352 +;_CeUnmountDBVol @1197 +;_CeWriteRecordProps @322 +;_ChangeDisplaySettingsEx @1611 +;_CharLowerBuffW @222 +;_CharLowerW @221 +;_CharNextW @226 +;_CharPrevW @225 +;_CharUpperBuffW @223 +;_CharUpperW @224 +;_CheckMenuItem @848 +;_CheckMenuRadioItem @849 +;_CheckPassword @182 +;_CheckRadioButton @684 +;_ChildWindowFromPoint @253 +;_ClearCommBreak @107 +;_ClearCommError @108 +;_ClientToScreen @254 +;_ClipCursor @731 +;_CloseAllDeviceHandles @244 +;_CloseAllFileHandles @242 +;_CloseAllServiceHandles @1511 +;_CloseClipboard @669 +;_CloseEnhMetaFile @956 +;_CloseHandle @553 +;_CloseMsgQueue @1533 +;_CloseProcOE @589 +;_ComThreadBaseFunc @1240 +;_CombineRgn @968 +;_CompactAllHeaps @54 +;_CompareFileTime @18 +;_CompareStringW @198 +;_ConnectDebugger @633 +;_ContinueDebugEvent @504 +;_ConvertDefaultLocale @210 +;_ConvertThreadToFiber @1480 +;_CopyFileW @164 +;_CopyRect @96 +;_CountClipboardFormats @674 +;_CreateAPIHandle @636 +;_CreateAPISet @559 +;_CreateAcceleratorTableW @92 +;_CreateBitmap @901 +;_CreateBitmapFromPointer @946 +;_CreateCaret @658 +;_CreateCompatibleBitmap @902 +;_CreateCompatibleDC @910 +;_CreateCrit @616 +;_CreateCursor @722 +;_CreateDCW @909 +;_CreateDIBPatternBrushPt @929 +;_CreateDIBSection @90 +;_CreateDeviceHandle @245 +;_CreateDialogIndirectParamW @688 +;_CreateDirectoryW @160 +;_CreateEnhMetaFileW @957 +;_CreateEventW @495 +;_CreateFiber @1483 +;_CreateFileForMapping @552 +;_CreateFileForMappingW @1167 +;_CreateFileMappingW @548 +;_CreateFileW @168 +;_CreateFontIndirectW @895 +;_CreateIconIndirect @723 +;_CreateLocaleView @1466 +;_CreateMenu @851 +;_CreateMsgQueue @1529 +;_CreateMutexW @555 +;_CreatePalette @947 +;_CreatePatternBrush @925 +;_CreatePen @926 +;_CreatePenIndirect @930 +;_CreatePopupMenu @852 +;_CreateProcessW @493 +;_CreateRectRgn @980 +;_CreateRectRgnIndirect @969 +;_CreateSemaphoreW @1238 +;_CreateServiceHandle @1512 +;_CreateSolidBrush @931 +;_CreateStaticMapping @1539 +;_CreateThread @492 +;_CreateWindowExW @246 +;_CryptAcquireContextW @126 +;_CryptContextAddRef @154 +;_CryptCreateHash @137 +;_CryptDecrypt @136 +;_CryptDeriveKey @129 +;_CryptDestroyHash @140 +;_CryptDestroyKey @130 +;_CryptDuplicateHash @156 +;_CryptDuplicateKey @155 +;_CryptEncrypt @135 +;_CryptEnumProviderTypesW @152 +;_CryptEnumProvidersW @153 +;_CryptExportKey @133 +;_CryptGenKey @128 +;_CryptGenRandom @143 +;_CryptGetDefaultProviderW @151 +;_CryptGetHashParam @146 +;_CryptGetKeyParam @132 +;_CryptGetProvParam @148 +;_CryptGetUserKey @144 +;_CryptHashData @139 +;_CryptHashSessionKey @138 +;_CryptImportKey @134 +;_CryptProtectData @1599 +;_CryptReleaseContext @127 +;_CryptSetHashParam @147 +;_CryptSetKeyParam @131 +;_CryptSetProvParam @149 +;_CryptSetProviderExW @150 +;_CryptSetProviderW @145 +;_CryptSignHashW @141 +;_CryptUnprotectData @1600 +;_CryptVerifySignatureW @142 +;_DBCanonicalize @233 +;_DDKReg_GetIsrInfo @1669 +;_DDKReg_GetPciInfo @1670 +;_DDKReg_GetWindowInfo @1668 ;_DeactivateDevice @1180 ;_DebugActiveProcess @505 ;_DebugNotify @642 @@ -567,761 +567,761 @@ _DDKReg_GetWindowInfo @1668 ;_HeapSize @48 ;_HeapValidate @51 ;_HideCaret @660 -_ImageList_Add @738 -_ImageList_AddMasked @739 -_ImageList_BeginDrag @740 -_ImageList_Copy @767 -_ImageList_CopyDitherImage @741 -_ImageList_Create @742 -_ImageList_Destroy @743 -_ImageList_DragEnter @744 -_ImageList_DragLeave @745 -_ImageList_DragMove @746 -_ImageList_DragShowNolock @747 -_ImageList_Draw @748 -_ImageList_DrawEx @749 -_ImageList_DrawIndirect @750 -_ImageList_Duplicate @768 -_ImageList_EndDrag @751 -_ImageList_GetBkColor @752 -_ImageList_GetDragImage @753 -_ImageList_GetIcon @754 -_ImageList_GetIconSize @755 -_ImageList_GetImageCount @756 -_ImageList_GetImageInfo @757 -_ImageList_LoadImage @758 -_ImageList_Merge @759 -_ImageList_Remove @760 -_ImageList_Replace @761 -_ImageList_ReplaceIcon @762 -_ImageList_SetBkColor @763 -_ImageList_SetDragCursorImage @764 -_ImageList_SetIconSize @765 -_ImageList_SetImageCount @769 -_ImageList_SetOverlayImage @766 -_ImmAssociateContext @770 -_ImmAssociateContextEx @1205 -_ImmConfigureIMEW @771 -_ImmCreateContext @1198 -_ImmCreateIMCC @772 -_ImmDestroyContext @1199 -_ImmDestroyIMCC @773 -_ImmDisableIME @1206 -_ImmEnableIME @1541 -_ImmEnumRegisterWordW @774 -_ImmEscapeW @775 -_ImmGenerateMessage @776 -_ImmGetCandidateListCountW @778 -_ImmGetCandidateListW @777 -_ImmGetCandidateWindow @779 -_ImmGetCompositionFontW @780 -_ImmGetCompositionStringW @781 -_ImmGetCompositionWindow @782 -_ImmGetContext @783 -_ImmGetConversionListW @784 -_ImmGetConversionStatus @785 -_ImmGetDefaultIMEWnd @786 -_ImmGetDescriptionW @787 -_ImmGetGuideLineW @788 -_ImmGetHotKey @813 -_ImmGetIMCCLockCount @789 -_ImmGetIMCCSize @790 -_ImmGetIMCLockCount @791 -_ImmGetIMEFileNameW @1207 -_ImmGetImeMenuItemsW @1211 -_ImmGetOpenStatus @792 -_ImmGetProperty @793 -_ImmGetRegisterWordStyleW @794 -_ImmGetStatusWindowPos @1200 -_ImmGetVirtualKey @1210 -_ImmIsIME @1209 -_ImmIsUIMessageW @796 -_ImmLockIMC @797 -_ImmLockIMCC @798 -_ImmNotifyIME @800 -_ImmReSizeIMCC @801 -_ImmRegisterWordW @802 -_ImmReleaseContext @803 -_ImmRequestMessageW @1242 -_ImmSIPanelState @804 -_ImmSetCandidateWindow @807 -_ImmSetCompositionFontW @808 -_ImmSetCompositionStringW @809 -_ImmSetCompositionWindow @810 -_ImmSetConversionStatus @811 -_ImmSetHotKey @812 -_ImmSetImeWndIMC @1222 -_ImmSetOpenStatus @814 -_ImmSetStatusWindowPos @815 -_ImmSimulateHotKey @816 -_ImmUnlockIMC @817 -_ImmUnlockIMCC @818 -_ImmUnregisterWordW @819 -_InSendMessage @1419 -_InflateRect @98 -_InitLocale @8 -_InitializeCriticalSection @2 -_InputDebugCharW @595 -_InsertMenuW @841 -_InterruptDisable @629 -_InterruptDone @628 -_InterruptInitialize @627 -_IntersectClipRect @975 -_IntersectRect @99 -_InvalidateRect @250 -_InvalidateRgn @1615 -_IsAPIReady @30 -_IsBadCodePtr @521 -_IsBadPtr @601 -_IsBadReadPtr @522 -_IsBadWritePtr @523 -_IsChild @277 -_IsClipboardFormatAvailable @678 -_IsDBCSLeadByte @191 -_IsDBCSLeadByteEx @192 -_IsDialogMessageW @698 -_IsEncryptionPermitted @613 -_IsExiting @159 -_IsPrimaryThread @610 -_IsProcessDying @1213 -_IsRectEmpty @100 -_IsSystemFile @1680 -_IsValidCodePage @185 -_IsValidLocale @209 -_IsWindow @271 -_IsWindowEnabled @288 -_IsWindowVisible @886 -_KernExtractIcons @574 -_KernelIoControl @557 -_KernelLibIoControl @1489 -_KeybdGetDeviceInfo @828 -_KeybdInitStates @829 -_KeybdVKeyToUnicode @830 -_KillAllOtherThreads @605 -_KillTimer @876 -_LCMapStringW @199 -_LeaveCritSec @597 -_LeaveCriticalSection @5 -_LineTo @1652 -_LoadAcceleratorsW @94 -_LoadAnimatedCursor @1493 -_LoadBitmapW @873 -_LoadCursorW @683 -_LoadDriver @626 -_LoadFSD @237 -_LoadFSDEx @1421 -_LoadIconW @728 -_LoadImageW @730 -_LoadIntChainHandler @1475 -_LoadKernelLibrary @1671 -_LoadLibraryExW @1241 -_LoadLibraryW @528 -_LoadMenuW @846 -_LoadResource @533 -_LoadStringW @874 -_LocalAlloc @33 -_LocalAllocInProcess @41 -_LocalFileTimeToFileTime @22 +;_ImageList_Add @738 +;_ImageList_AddMasked @739 +;_ImageList_BeginDrag @740 +;_ImageList_Copy @767 +;_ImageList_CopyDitherImage @741 +;_ImageList_Create @742 +;_ImageList_Destroy @743 +;_ImageList_DragEnter @744 +;_ImageList_DragLeave @745 +;_ImageList_DragMove @746 +;_ImageList_DragShowNolock @747 +;_ImageList_Draw @748 +;_ImageList_DrawEx @749 +;_ImageList_DrawIndirect @750 +;_ImageList_Duplicate @768 +;_ImageList_EndDrag @751 +;_ImageList_GetBkColor @752 +;_ImageList_GetDragImage @753 +;_ImageList_GetIcon @754 +;_ImageList_GetIconSize @755 +;_ImageList_GetImageCount @756 +;_ImageList_GetImageInfo @757 +;_ImageList_LoadImage @758 +;_ImageList_Merge @759 +;_ImageList_Remove @760 +;_ImageList_Replace @761 +;_ImageList_ReplaceIcon @762 +;_ImageList_SetBkColor @763 +;_ImageList_SetDragCursorImage @764 +;_ImageList_SetIconSize @765 +;_ImageList_SetImageCount @769 +;_ImageList_SetOverlayImage @766 +;_ImmAssociateContext @770 +;_ImmAssociateContextEx @1205 +;_ImmConfigureIMEW @771 +;_ImmCreateContext @1198 +;_ImmCreateIMCC @772 +;_ImmDestroyContext @1199 +;_ImmDestroyIMCC @773 +;_ImmDisableIME @1206 +;_ImmEnableIME @1541 +;_ImmEnumRegisterWordW @774 +;_ImmEscapeW @775 +;_ImmGenerateMessage @776 +;_ImmGetCandidateListCountW @778 +;_ImmGetCandidateListW @777 +;_ImmGetCandidateWindow @779 +;_ImmGetCompositionFontW @780 +;_ImmGetCompositionStringW @781 +;_ImmGetCompositionWindow @782 +;_ImmGetContext @783 +;_ImmGetConversionListW @784 +;_ImmGetConversionStatus @785 +;_ImmGetDefaultIMEWnd @786 +;_ImmGetDescriptionW @787 +;_ImmGetGuideLineW @788 +;_ImmGetHotKey @813 +;_ImmGetIMCCLockCount @789 +;_ImmGetIMCCSize @790 +;_ImmGetIMCLockCount @791 +;_ImmGetIMEFileNameW @1207 +;_ImmGetImeMenuItemsW @1211 +;_ImmGetOpenStatus @792 +;_ImmGetProperty @793 +;_ImmGetRegisterWordStyleW @794 +;_ImmGetStatusWindowPos @1200 +;_ImmGetVirtualKey @1210 +;_ImmIsIME @1209 +;_ImmIsUIMessageW @796 +;_ImmLockIMC @797 +;_ImmLockIMCC @798 +;_ImmNotifyIME @800 +;_ImmReSizeIMCC @801 +;_ImmRegisterWordW @802 +;_ImmReleaseContext @803 +;_ImmRequestMessageW @1242 +;_ImmSIPanelState @804 +;_ImmSetCandidateWindow @807 +;_ImmSetCompositionFontW @808 +;_ImmSetCompositionStringW @809 +;_ImmSetCompositionWindow @810 +;_ImmSetConversionStatus @811 +;_ImmSetHotKey @812 +;_ImmSetImeWndIMC @1222 +;_ImmSetOpenStatus @814 +;_ImmSetStatusWindowPos @815 +;_ImmSimulateHotKey @816 +;_ImmUnlockIMC @817 +;_ImmUnlockIMCC @818 +;_ImmUnregisterWordW @819 +;_InSendMessage @1419 +;_InflateRect @98 +;_InitLocale @8 +;_InitializeCriticalSection @2 +;_InputDebugCharW @595 +;_InsertMenuW @841 +;_InterruptDisable @629 +;_InterruptDone @628 +;_InterruptInitialize @627 +;_IntersectClipRect @975 +;_IntersectRect @99 +;_InvalidateRect @250 +;_InvalidateRgn @1615 +;_IsAPIReady @30 +;_IsBadCodePtr @521 +;_IsBadPtr @601 +;_IsBadReadPtr @522 +;_IsBadWritePtr @523 +;_IsChild @277 +;_IsClipboardFormatAvailable @678 +;_IsDBCSLeadByte @191 +;_IsDBCSLeadByteEx @192 +;_IsDialogMessageW @698 +;_IsEncryptionPermitted @613 +;_IsExiting @159 +;_IsPrimaryThread @610 +;_IsProcessDying @1213 +;_IsRectEmpty @100 +;_IsSystemFile @1680 +;_IsValidCodePage @185 +;_IsValidLocale @209 +;_IsWindow @271 +;_IsWindowEnabled @288 +;_IsWindowVisible @886 +;_KernExtractIcons @574 +;_KernelIoControl @557 +;_KernelLibIoControl @1489 +;_KeybdGetDeviceInfo @828 +;_KeybdInitStates @829 +;_KeybdVKeyToUnicode @830 +;_KillAllOtherThreads @605 +;_KillTimer @876 +;_LCMapStringW @199 +;_LeaveCritSec @597 +;_LeaveCriticalSection @5 +;_LineTo @1652 +;_LoadAcceleratorsW @94 +;_LoadAnimatedCursor @1493 +;_LoadBitmapW @873 +;_LoadCursorW @683 +;_LoadDriver @626 +;_LoadFSD @237 +;_LoadFSDEx @1421 +;_LoadIconW @728 +;_LoadImageW @730 +;_LoadIntChainHandler @1475 +;_LoadKernelLibrary @1671 +;_LoadLibraryExW @1241 +;_LoadLibraryW @528 +;_LoadMenuW @846 +;_LoadResource @533 +;_LoadStringW @874 +;_LocalAlloc @33 +;_LocalAllocInProcess @41 +;_LocalFileTimeToFileTime @22 _LocalFree @36 -_LocalFreeInProcess @42 -_LocalReAlloc @34 -_LocalSize @35 -_LocalSizeInProcess @43 -_LockPages @1161 -_MainThreadBaseFunc @14 -_MapCallerPtr @1602 -_MapDialogRect @699 -_MapPtrToProcWithSize @1603 -_MapPtrToProcess @598 -_MapPtrUnsecure @599 -_MapViewOfFile @549 -_MapVirtualKeyW @831 -_MapWindowPoints @284 -_MaskBlt @904 -_MessageBeep @857 -_MessageBoxW @858 -_MonitorFromPoint @1522 -_MonitorFromRect @1523 -_MonitorFromWindow @1524 -_MoveFileW @163 -_MoveToEx @1651 -_MoveWindow @272 -_MsgWaitForMultipleObjectsEx @871 -_MultiByteToWideChar @196 -_NKDbgPrintfW @545 -_NKTerminateThread @623 -_NKvDbgPrintfW @568 -_NLedGetDeviceInfo @839 -_NLedSetDevice @840 -_NotifyForceCleanboot @513 -_NotifyWinUserSystem @716 -_OffsetRect @101 -_OffsetRgn @976 -_OpenClipboard @668 -_OpenDeviceKey @1396 -_OpenEventW @1496 -_OpenMsgQueue @1536 -_OpenProcess @509 -_OtherThreadsRunning @604 -_OutputDebugStringW @541 -_PPSHRestart @638 -_PSLNotify @7 -_PatBlt @938 -_PeekMessageW @864 -_PegClearUserNotification @468 -_PegCreateDatabase @304 -_PegDeleteDatabase @307 -_PegDeleteRecord @309 -_PegFindFirstDatabase @302 -_PegFindNextDatabase @303 -_PegGetUserNotificationPreferences @472 -_PegHandleAppNotifications @471 -_PegOidGetInfo @301 -_PegOpenDatabase @306 -_PegReadRecordProps @310 -_PegRemoveFontResource @899 -_PegRunAppAtEvent @470 -_PegRunAppAtTime @469 -_PegSeekDatabase @308 -_PegSetDatabaseInfo @305 -_PegSetUserNotification @467 -_PegWriteRecordProps @311 -_PerformCallBack4 @1448 -_PlayEnhMetaFile @961 -_PlaySoundW @378 -_Polygon @939 -_Polyline @940 -_PostKeybdMessage @832 -_PostMessageW @865 -_PostQuitMessage @866 -_PostThreadMessageW @290 -_PowerOffSystem @617 -_PrintTrackedItem @580 -_ProcessDetachAllDLLs @572 -_ProfileStart @82 -_ProfileStop @83 -_ProfileSyscall @569 -_PtInRect @102 -_PtInRegion @977 -_PurgeComm @115 -_QASetWindowsJournalHook @821 -_QAUnhookWindowsJournalHook @822 -_QueryAPISetID @490 -_QueryInstructionSet @1677 -_QueryPerformanceCounter @538 -_QueryPerformanceFrequency @539 -_RaiseException @543 -_Random @80 -_ReadFile @170 -_ReadFileWithSeek @243 -_ReadMsgQueue @1530 -_ReadProcessMemory @506 -_ReadRegistryFromOEM @1153 -_RealizePalette @953 -_RectInRegion @978 -_RectVisible @981 -_Rectangle @941 -_RectangleAnimation @294 -_RedrawWindow @1672 -_RefreshKernelAlarm @587 -_RegCloseKey @455 -_RegCopyFile @465 -_RegCreateKeyExW @456 -_RegDeleteKeyW @457 -_RegDeleteValueW @458 -_RegEnumKeyExW @460 -_RegEnumValueW @459 -_RegFlushKey @1152 -_RegOpenKeyExW @461 -_RegOpenProcessKey @1542 -_RegQueryInfoKeyW @462 -_RegQueryValueExW @463 -_RegReplaceKey @1479 -_RegRestoreFile @466 -_RegSaveKey @1478 -_RegSetValueExW @464 -_RegisterAFSEx @1490 -_RegisterAFSName @338 -_RegisterAPISet @635 -_RegisterClassW @95 -_RegisterClassWStub @883 -_RegisterClipboardFormatW @673 -_RegisterDbgZones @546 -_RegisterDesktop @1507 -_RegisterDevice @235 -_RegisterHotKey @835 -_RegisterPowerRelationship @1609 -_RegisterSIPanel @293 -_RegisterService @1509 -_RegisterTaskBar @892 -_RegisterTaskBarEx @1506 -_RegisterTrackedItem @584 -_RegisterWindowMessageW @891 -_ReleaseCapture @709 -_ReleaseDC @263 -_ReleaseMutex @556 -_ReleasePowerRelationship @1610 -_ReleasePowerRequirement @1584 -_ReleaseSemaphore @1239 -_RemoteHeapAlloc @1604 -_RemoteHeapFree @1606 -_RemoteHeapReAlloc @1605 -_RemoteHeapSize @1607 -_RemoteLocalAlloc @37 -_RemoteLocalFree @40 -_RemoteLocalReAlloc @38 -_RemoteLocalSize @39 -_RemoveDirectoryW @161 -_RemoveFontResourceW @900 -_RemoveMenu @843 -_RemoveProp @1499 -_RequestDeviceNotifications @1504 -_RequestPowerNotifications @1585 -_ResourceCreateList @1612 -_ResourceRelease @1614 -_ResourceRequest @1613 -_RestoreDC @907 -_ResumeThread @500 -_RoundRect @942 -_SHAddToRecentDocs @483 -_SHCreateExplorerInstance @1163 -_SHCreateShortcut @484 -_SHCreateShortcutEx @1488 -_SHGetFileInfo @482 -_SHGetShortcutTarget @485 -_SHGetSpecialFolderPath @295 -_SHLoadDIBitmap @487 -_SHShowOutOfMemory @486 -_SaveDC @908 -_ScreenToClient @255 -_ScrollDC @985 -_ScrollWindowEx @289 -_SelectClipRgn @979 -_SelectObject @921 -_SelectPalette @954 -_SendDlgItemMessageW @685 -_SendInput @823 -_SendMessageTimeout @1495 -_SendMessageW @868 -_SendNotifyMessageW @869 -_ServiceAddPort @1515 -_ServiceIoControl @1514 -_ServiceUnbindPorts @1516 -_SetACP @189 -_SetAbortProc @962 -_SetActiveWindow @703 -_SetAssociatedMenu @299 -_SetBkColor @922 -_SetBkMode @923 -_SetBrushOrgEx @943 -_SetCapture @708 -_SetCaretBlinkTime @664 -_SetCaretPos @662 -_SetClassLong @882 -_SetClassLongW @880 -_SetCleanRebootFlag @615 -_SetClipboardData @671 -_SetCommBreak @116 -_SetCommMask @117 -_SetCommState @118 -_SetCommTimeouts @119 -_SetCurrentUser @1501 -_SetCursor @682 -_SetCursorPos @736 -_SetDIBColorTable @1666 -_SetDaylightTime @547 -_SetDbgZone @618 -_SetDevicePower @1678 -_SetDlgItemInt @700 -_SetDlgItemTextW @686 -_SetEndOfFile @178 -_SetEventData @1528 -_SetExceptionHandler @583 -_SetFileAttributesW @169 -_SetFilePointer @173 -_SetFileTime @177 -_SetFocus @704 -_SetForegroundWindow @702 -_SetGwesOOMEvent @590 -_SetGwesPowerHandler @632 -_SetHandleOwner @625 -_SetHardwareWatch @634 -_SetInterruptEvent @158 -_SetKMode @630 -_SetKernelAlarm @586 -_SetKeyboardTarget @710 -_SetLastError @517 -_SetLocalTime @24 -_SetLocaleInfoW @201 -_SetLowestScheduledPriority @609 -_SetMenuItemInfoW @853 -_SetOEMCP @190 -_SetOOMEvent @1462 -_SetObjectOwner @984 -_SetPaletteEntries @951 -_SetParent @268 -_SetPassword @238 -_SetPasswordActive @240 -_SetPasswordStatus @1537 -_SetPixel @944 -_SetPowerOffHandler @631 -_SetPowerRequirement @1583 -_SetProcPermissions @611 -_SetProp @1497 -_SetROP2 @928 -_SetRealTime @571 -_SetRect @103 -_SetRectEmpty @104 -_SetRectRgn @982 -_SetScrollInfo @279 -_SetScrollPos @280 -_SetScrollRange @281 -_SetStdioPathW @1150 -_SetSysColors @890 -_SetSystemDefaultLCID @214 -_SetSystemMemoryDivision @337 -_SetSystemPowerState @1582 -_SetSystemTime @26 -_SetTextAlign @1654 -_SetTextColor @924 -_SetThreadContext @502 -_SetThreadPriority @514 -_SetTimeZoneBias @614 -_SetTimeZoneInformation @28 -_SetTimer @875 -_SetUserData @1502 -_SetViewportOrgEx @983 -_SetWDevicePowerHandler @1178 -_SetWindowLongW @258 -_SetWindowPos @247 -_SetWindowRgn @1398 -_SetWindowTextW @256 -_SetWindowsHookExW @1202 -_SetupComm @120 -_ShellExecuteEx @480 -_ShellModalEnd @712 -_Shell_NotifyIcon @481 -_ShowCaret @661 -_ShowCursor @737 -_ShowWindow @266 -_SignalStarted @639 -_SizeofResource @534 -_Sleep @496 -_SleepTillTick @1534 -_StartDocW @963 -_StartPage @964 -_StopDeviceNotifications @1505 -_StopPowerNotifications @1586 -_StretchBlt @905 -_StretchDIBits @1667 -_StringCompress @591 -_StringDecompress @592 -_SubtractRect @105 -_SuspendThread @499 -_SwitchToFiber @1485 -_SystemIdleTimerReset @837 -_SystemMemoryLow @720 -_SystemParametersInfoW @89 -_SystemStarted @1 -_SystemTimeToFileTime @19 -_THCreateSnapshot @511 -_THGrow @512 -_TakeCritSec @596 -_TerminateProcess @544 -_TerminateThread @491 -_ThreadAttachAllDLLs @561 -_ThreadBaseFunc @13 -_ThreadDetachAllDLLs @562 -_ThreadExceptionExit @1474 -_TlsCall @520 -_TlsGetValue @15 -_TlsSetValue @16 -_TouchCalibrate @877 -_TrackPopupMenuEx @845 -_TranslateAcceleratorW @838 -_TranslateCharsetInfo @1166 -_TranslateMessage @870 -_TransmitCommChar @121 -_TransparentImage @906 -_TryEnterCriticalSection @1233 -_TurnOffProfiling @620 -_TurnOnProfiling @619 -_U_rclose @567 -_U_rlseek @566 -_U_ropen @563 -_U_rread @564 -_U_rwrite @565 -_UnhookWindowsHookEx @1203 -_UnionRect @106 -_UnlockPages @1162 -_UnmapViewOfFile @550 -_UnregisterClassW @884 -_UnregisterFunc1 @1156 -_UnregisterHotKey @836 -_UpdateNLSInfo @1447 -_UpdateWindow @267 -_ValidateRect @278 -_ValidateRgn @1616 -_VerQueryValueW @1459 -_VerifyAPIHandle @637 -_VirtualAlloc @524 -_VirtualCopy @560 -_VirtualFree @525 -_VirtualProtect @526 -_VirtualQuery @527 -_WNetAddConnection3W @444 -_WNetCancelConnection2W @445 -_WNetCloseEnum @453 -_WNetConnectionDialog1W @446 -_WNetDisconnectDialog @447 -_WNetDisconnectDialog1W @448 -_WNetEnumResourceW @454 -_WNetGetConnectionW @449 -_WNetGetUniversalNameW @450 -_WNetGetUserW @451 -_WNetOpenEnumW @452 -_WaitCommEvent @122 -_WaitForDebugEvent @503 -_WaitForMultipleObjects @498 -_WaitForSingleObject @497 -_WideCharToMultiByte @197 -_WindowFromPoint @252 -_WriteDebugLED @1155 -_WriteFile @171 -_WriteFileWithSeek @718 -_WriteMsgQueue @1531 -_WriteProcessMemory @507 -_WriteRegistryToOEM @1154 -__CIacos @2020 -__CIasin @2019 -__CIatan @2021 -__CIatan2 @2022 -__CIcos @2017 -__CIcosh @2024 -__CIexp @2015 -__CIfmod @2026 -__CIlog @2013 -__CIlog10 @2014 -__CIpow @2012 -__CIsin @2016 -__CIsinh @2023 -__CIsqrt @2011 -__CItan @2018 -__CItanh @2025 -__CxxThrowException@8 @1551 -__EH_prolog @1620 -__HUGE @1181 -__InitStdioLib @1151 -__XcptFilter @1645 -___CxxFrameHandler @1550 -___RTCastToVoid @1559 -___RTDynamicCast @1561 -___RTtypeid @1560 -___abnormal_termination @86 -___strgtold12 @1089 -__alldiv @2001 -__allmul @2002 -__alloca_probe @2010 -__allrem @2003 -__allshl @2005 -__allshr @2004 -__atodbl @996 -__atoflt @997 -__atoi64 @1418 -__aulldiv @2006 -__aullrem @2008 -__aullshr @2007 -__cabs @998 -__chgsign @1000 -__chkstk @2009 -__clearfp @1001 -__controlfp @1002 -__copysign @1003 -__ecvt @1008 -__except_handler3 @84 -__fcloseall @1119 -__fcvt @1011 -__fileno @1124 -__finite @1012 -__fload @2027 -__fltused @1093 -__flushall @1123 -__fpclass @1015 -__fpieee_flt @1016 -__fpreset @1017 -__frnd @1020 -__fsqrt @1021 -__ftol @2028 -__gcvt @1022 -__getstdfilex @1100 -__getws @1138 -__hypot @1023 -__inp @2029 -__inpd @2031 -__inpw @2030 -__isctype @1417 -__isnan @1024 -__itoa @1025 -__itow @1026 -__j0 @1027 -__j1 @1028 -__jn @1029 -__ld12tod @1087 -__ld12tof @1088 -__local_unwind2 @85 -__logb @1035 -__lrotl @1037 -__lrotr @1038 -__ltoa @1039 -__ltow @1040 -__memccpy @1042 -__memicmp @1045 -__msize @1049 -__nextafter @1050 -__outp @2032 -__outpd @2034 -__outpw @2033 -__purecall @1092 -__putws @1139 -__rotl @1055 -__rotr @1056 -__scalb @1057 -__setjmp3 @2000 -__setmode @1187 -__snprintf @729 -__snwprintf @1096 -__statusfp @1062 -__strdup @1409 -__stricmp @1410 -__strlwr @1415 -__strnicmp @1411 -__strnset @1412 -__strrev @1413 -__strset @1414 -__strupr @1416 -__swab @1074 -__ultoa @1079 -__ultow @1080 -__vsnprintf @1147 -__vsnwprintf @1132 -__wcsdup @74 -__wcsicmp @230 -__wcslwr @231 -__wcsnicmp @229 -__wcsnset @67 -__wcsrev @70 -__wcsset @71 -__wcsupr @232 -__wfdopen @1117 -__wfopen @1145 -__wfreopen @1201 -__wtol @78 -__wtoll @79 -__y0 @1084 -__y1 @1085 -__yn @1086 -_abs @988 -_acos @989 -_asin @990 -_atan @991 -_atan2 @992 -_atof @995 -_atoi @993 -_atol @994 -_calloc @1346 -_ceil @999 -_clearerr @1127 -_cos @1004 -_cosh @1005 -_difftime @1006 -_div @1007 -_exp @1009 -_fabs @1010 -_fclose @1118 -_feof @1125 -_ferror @1126 -_fflush @1122 -_fgetc @1108 -_fgetpos @1128 -_fgets @1109 -_fgetwc @1140 -_fgetws @1143 -_floor @1013 -_fmod @1014 -_fopen @1113 -_fprintf @1115 -_fputc @1110 -_fputs @1111 -_fputwc @1141 -_fputws @1144 -_fread @1120 -_free @1018 -_frexp @1019 -_fscanf @1114 -_fseek @1130 -_fsetpos @1129 -_ftell @1131 -_fwprintf @867 -_fwrite @1121 -_fwscanf @735 -_getchar @1104 -_gets @1106 -_getwchar @1136 -_iswctype @193 -_keybd_event @833 -_labs @1030 -_ldexp @1031 -_ldiv @1032 -_log @1033 -_log10 @1034 -_longjmp @1036 -_lstrcmpW @227 -_lstrcmpiW @228 -_malloc @1041 -_mbstowcs @76 -_memchr @31 -_memcmp @1043 -_memcpy @1044 -_memmove @1046 -_memset @1047 -_mixerClose @1598 -_mixerGetControlDetails @1589 -_mixerGetDevCaps @1591 -_mixerGetID @1590 -_mixerGetLineControls @1592 -_mixerGetLineInfo @1593 -_mixerGetNumDevs @1594 -_mixerMessage @1596 -_mixerOpen @1595 -_mixerSetControlDetails @1597 -_modf @1048 -_mouse_event @824 -_pow @1051 -_printf @1102 -_putchar @1105 -_puts @1107 -_putwchar @1137 -_qsort @1052 -_rand @1053 -_realloc @1054 -_scanf @1101 -_setvbuf @1608 -_sin @1058 -_sinh @1059 -_sndPlaySoundW @377 -_sprintf @719 -_sqrt @1060 -_srand @1061 -_sscanf @653 -_strcat @1063 -_strchr @1064 -_strcmp @1065 -_strcpy @1066 -_strcspn @1067 -_strlen @1068 -_strncat @1069 -_strncmp @1070 -_strncpy @1071 +;_LocalFreeInProcess @42 +;_LocalReAlloc @34 +;_LocalSize @35 +;_LocalSizeInProcess @43 +;_LockPages @1161 +;_MainThreadBaseFunc @14 +;_MapCallerPtr @1602 +;_MapDialogRect @699 +;_MapPtrToProcWithSize @1603 +;_MapPtrToProcess @598 +;_MapPtrUnsecure @599 +;_MapViewOfFile @549 +;_MapVirtualKeyW @831 +;_MapWindowPoints @284 +;_MaskBlt @904 +;_MessageBeep @857 +;_MessageBoxW @858 +;_MonitorFromPoint @1522 +;_MonitorFromRect @1523 +;_MonitorFromWindow @1524 +;_MoveFileW @163 +;_MoveToEx @1651 +;_MoveWindow @272 +;_MsgWaitForMultipleObjectsEx @871 +;_MultiByteToWideChar @196 +;_NKDbgPrintfW @545 +;_NKTerminateThread @623 +;_NKvDbgPrintfW @568 +;_NLedGetDeviceInfo @839 +;_NLedSetDevice @840 +;_NotifyForceCleanboot @513 +;_NotifyWinUserSystem @716 +;_OffsetRect @101 +;_OffsetRgn @976 +;_OpenClipboard @668 +;_OpenDeviceKey @1396 +;_OpenEventW @1496 +;_OpenMsgQueue @1536 +;_OpenProcess @509 +;_OtherThreadsRunning @604 +;_OutputDebugStringW @541 +;_PPSHRestart @638 +;_PSLNotify @7 +;_PatBlt @938 +;_PeekMessageW @864 +;_PegClearUserNotification @468 +;_PegCreateDatabase @304 +;_PegDeleteDatabase @307 +;_PegDeleteRecord @309 +;_PegFindFirstDatabase @302 +;_PegFindNextDatabase @303 +;_PegGetUserNotificationPreferences @472 +;_PegHandleAppNotifications @471 +;_PegOidGetInfo @301 +;_PegOpenDatabase @306 +;_PegReadRecordProps @310 +;_PegRemoveFontResource @899 +;_PegRunAppAtEvent @470 +;_PegRunAppAtTime @469 +;_PegSeekDatabase @308 +;_PegSetDatabaseInfo @305 +;_PegSetUserNotification @467 +;_PegWriteRecordProps @311 +;_PerformCallBack4 @1448 +;_PlayEnhMetaFile @961 +;_PlaySoundW @378 +;_Polygon @939 +;_Polyline @940 +;_PostKeybdMessage @832 +;_PostMessageW @865 +;_PostQuitMessage @866 +;_PostThreadMessageW @290 +;_PowerOffSystem @617 +;_PrintTrackedItem @580 +;_ProcessDetachAllDLLs @572 +;_ProfileStart @82 +;_ProfileStop @83 +;_ProfileSyscall @569 +;_PtInRect @102 +;_PtInRegion @977 +;_PurgeComm @115 +;_QASetWindowsJournalHook @821 +;_QAUnhookWindowsJournalHook @822 +;_QueryAPISetID @490 +;_QueryInstructionSet @1677 +;_QueryPerformanceCounter @538 +;_QueryPerformanceFrequency @539 +;_RaiseException @543 +;_Random @80 +;_ReadFile @170 +;_ReadFileWithSeek @243 +;_ReadMsgQueue @1530 +;_ReadProcessMemory @506 +;_ReadRegistryFromOEM @1153 +;_RealizePalette @953 +;_RectInRegion @978 +;_RectVisible @981 +;_Rectangle @941 +;_RectangleAnimation @294 +;_RedrawWindow @1672 +;_RefreshKernelAlarm @587 +;_RegCloseKey @455 +;_RegCopyFile @465 +;_RegCreateKeyExW @456 +;_RegDeleteKeyW @457 +;_RegDeleteValueW @458 +;_RegEnumKeyExW @460 +;_RegEnumValueW @459 +;_RegFlushKey @1152 +;_RegOpenKeyExW @461 +;_RegOpenProcessKey @1542 +;_RegQueryInfoKeyW @462 +;_RegQueryValueExW @463 +;_RegReplaceKey @1479 +;_RegRestoreFile @466 +;_RegSaveKey @1478 +;_RegSetValueExW @464 +;_RegisterAFSEx @1490 +;_RegisterAFSName @338 +;_RegisterAPISet @635 +;_RegisterClassW @95 +;_RegisterClassWStub @883 +;_RegisterClipboardFormatW @673 +;_RegisterDbgZones @546 +;_RegisterDesktop @1507 +;_RegisterDevice @235 +;_RegisterHotKey @835 +;_RegisterPowerRelationship @1609 +;_RegisterSIPanel @293 +;_RegisterService @1509 +;_RegisterTaskBar @892 +;_RegisterTaskBarEx @1506 +;_RegisterTrackedItem @584 +;_RegisterWindowMessageW @891 +;_ReleaseCapture @709 +;_ReleaseDC @263 +;_ReleaseMutex @556 +;_ReleasePowerRelationship @1610 +;_ReleasePowerRequirement @1584 +;_ReleaseSemaphore @1239 +;_RemoteHeapAlloc @1604 +;_RemoteHeapFree @1606 +;_RemoteHeapReAlloc @1605 +;_RemoteHeapSize @1607 +;_RemoteLocalAlloc @37 +;_RemoteLocalFree @40 +;_RemoteLocalReAlloc @38 +;_RemoteLocalSize @39 +;_RemoveDirectoryW @161 +;_RemoveFontResourceW @900 +;_RemoveMenu @843 +;_RemoveProp @1499 +;_RequestDeviceNotifications @1504 +;_RequestPowerNotifications @1585 +;_ResourceCreateList @1612 +;_ResourceRelease @1614 +;_ResourceRequest @1613 +;_RestoreDC @907 +;_ResumeThread @500 +;_RoundRect @942 +;_SHAddToRecentDocs @483 +;_SHCreateExplorerInstance @1163 +;_SHCreateShortcut @484 +;_SHCreateShortcutEx @1488 +;_SHGetFileInfo @482 +;_SHGetShortcutTarget @485 +;_SHGetSpecialFolderPath @295 +;_SHLoadDIBitmap @487 +;_SHShowOutOfMemory @486 +;_SaveDC @908 +;_ScreenToClient @255 +;_ScrollDC @985 +;_ScrollWindowEx @289 +;_SelectClipRgn @979 +;_SelectObject @921 +;_SelectPalette @954 +;_SendDlgItemMessageW @685 +;_SendInput @823 +;_SendMessageTimeout @1495 +;_SendMessageW @868 +;_SendNotifyMessageW @869 +;_ServiceAddPort @1515 +;_ServiceIoControl @1514 +;_ServiceUnbindPorts @1516 +;_SetACP @189 +;_SetAbortProc @962 +;_SetActiveWindow @703 +;_SetAssociatedMenu @299 +;_SetBkColor @922 +;_SetBkMode @923 +;_SetBrushOrgEx @943 +;_SetCapture @708 +;_SetCaretBlinkTime @664 +;_SetCaretPos @662 +;_SetClassLong @882 +;_SetClassLongW @880 +;_SetCleanRebootFlag @615 +;_SetClipboardData @671 +;_SetCommBreak @116 +;_SetCommMask @117 +;_SetCommState @118 +;_SetCommTimeouts @119 +;_SetCurrentUser @1501 +;_SetCursor @682 +;_SetCursorPos @736 +;_SetDIBColorTable @1666 +;_SetDaylightTime @547 +;_SetDbgZone @618 +;_SetDevicePower @1678 +;_SetDlgItemInt @700 +;_SetDlgItemTextW @686 +;_SetEndOfFile @178 +;_SetEventData @1528 +;_SetExceptionHandler @583 +;_SetFileAttributesW @169 +;_SetFilePointer @173 +;_SetFileTime @177 +;_SetFocus @704 +;_SetForegroundWindow @702 +;_SetGwesOOMEvent @590 +;_SetGwesPowerHandler @632 +;_SetHandleOwner @625 +;_SetHardwareWatch @634 +;_SetInterruptEvent @158 +;_SetKMode @630 +;_SetKernelAlarm @586 +;_SetKeyboardTarget @710 +;_SetLastError @517 +;_SetLocalTime @24 +;_SetLocaleInfoW @201 +;_SetLowestScheduledPriority @609 +;_SetMenuItemInfoW @853 +;_SetOEMCP @190 +;_SetOOMEvent @1462 +;_SetObjectOwner @984 +;_SetPaletteEntries @951 +;_SetParent @268 +;_SetPassword @238 +;_SetPasswordActive @240 +;_SetPasswordStatus @1537 +;_SetPixel @944 +;_SetPowerOffHandler @631 +;_SetPowerRequirement @1583 +;_SetProcPermissions @611 +;_SetProp @1497 +;_SetROP2 @928 +;_SetRealTime @571 +;_SetRect @103 +;_SetRectEmpty @104 +;_SetRectRgn @982 +;_SetScrollInfo @279 +;_SetScrollPos @280 +;_SetScrollRange @281 +;_SetStdioPathW @1150 +;_SetSysColors @890 +;_SetSystemDefaultLCID @214 +;_SetSystemMemoryDivision @337 +;_SetSystemPowerState @1582 +;_SetSystemTime @26 +;_SetTextAlign @1654 +;_SetTextColor @924 +;_SetThreadContext @502 +;_SetThreadPriority @514 +;_SetTimeZoneBias @614 +;_SetTimeZoneInformation @28 +;_SetTimer @875 +;_SetUserData @1502 +;_SetViewportOrgEx @983 +;_SetWDevicePowerHandler @1178 +;_SetWindowLongW @258 +;_SetWindowPos @247 +;_SetWindowRgn @1398 +;_SetWindowTextW @256 +;_SetWindowsHookExW @1202 +;_SetupComm @120 +;_ShellExecuteEx @480 +;_ShellModalEnd @712 +;_Shell_NotifyIcon @481 +;_ShowCaret @661 +;_ShowCursor @737 +;_ShowWindow @266 +;_SignalStarted @639 +;_SizeofResource @534 +;_Sleep @496 +;_SleepTillTick @1534 +;_StartDocW @963 +;_StartPage @964 +;_StopDeviceNotifications @1505 +;_StopPowerNotifications @1586 +;_StretchBlt @905 +;_StretchDIBits @1667 +;_StringCompress @591 +;_StringDecompress @592 +;_SubtractRect @105 +;_SuspendThread @499 +;_SwitchToFiber @1485 +;_SystemIdleTimerReset @837 +;_SystemMemoryLow @720 +;_SystemParametersInfoW @89 +;_SystemStarted @1 +;_SystemTimeToFileTime @19 +;_THCreateSnapshot @511 +;_THGrow @512 +;_TakeCritSec @596 +;_TerminateProcess @544 +;_TerminateThread @491 +;_ThreadAttachAllDLLs @561 +;_ThreadBaseFunc @13 +;_ThreadDetachAllDLLs @562 +;_ThreadExceptionExit @1474 +;_TlsCall @520 +;_TlsGetValue @15 +;_TlsSetValue @16 +;_TouchCalibrate @877 +;_TrackPopupMenuEx @845 +;_TranslateAcceleratorW @838 +;_TranslateCharsetInfo @1166 +;_TranslateMessage @870 +;_TransmitCommChar @121 +;_TransparentImage @906 +;_TryEnterCriticalSection @1233 +;_TurnOffProfiling @620 +;_TurnOnProfiling @619 +;_U_rclose @567 +;_U_rlseek @566 +;_U_ropen @563 +;_U_rread @564 +;_U_rwrite @565 +;_UnhookWindowsHookEx @1203 +;_UnionRect @106 +;_UnlockPages @1162 +;_UnmapViewOfFile @550 +;_UnregisterClassW @884 +;_UnregisterFunc1 @1156 +;_UnregisterHotKey @836 +;_UpdateNLSInfo @1447 +;_UpdateWindow @267 +;_ValidateRect @278 +;_ValidateRgn @1616 +;_VerQueryValueW @1459 +;_VerifyAPIHandle @637 +;_VirtualAlloc @524 +;_VirtualCopy @560 +;_VirtualFree @525 +;_VirtualProtect @526 +;_VirtualQuery @527 +;_WNetAddConnection3W @444 +;_WNetCancelConnection2W @445 +;_WNetCloseEnum @453 +;_WNetConnectionDialog1W @446 +;_WNetDisconnectDialog @447 +;_WNetDisconnectDialog1W @448 +;_WNetEnumResourceW @454 +;_WNetGetConnectionW @449 +;_WNetGetUniversalNameW @450 +;_WNetGetUserW @451 +;_WNetOpenEnumW @452 +;_WaitCommEvent @122 +;_WaitForDebugEvent @503 +;_WaitForMultipleObjects @498 +;_WaitForSingleObject @497 +;_WideCharToMultiByte @197 +;_WindowFromPoint @252 +;_WriteDebugLED @1155 +;_WriteFile @171 +;_WriteFileWithSeek @718 +;_WriteMsgQueue @1531 +;_WriteProcessMemory @507 +;_WriteRegistryToOEM @1154 +;__CIacos @2020 +;__CIasin @2019 +;__CIatan @2021 +;__CIatan2 @2022 +;__CIcos @2017 +;__CIcosh @2024 +;__CIexp @2015 +;__CIfmod @2026 +;__CIlog @2013 +;__CIlog10 @2014 +;__CIpow @2012 +;__CIsin @2016 +;__CIsinh @2023 +;__CIsqrt @2011 +;__CItan @2018 +;__CItanh @2025 +;__CxxThrowException@8 @1551 +;__EH_prolog @1620 +;__HUGE @1181 +;__InitStdioLib @1151 +__XcptFilter @1645 +;___CxxFrameHandler @1550 +;___RTCastToVoid @1559 +;___RTDynamicCast @1561 +;___RTtypeid @1560 +;___abnormal_termination @86 +;___strgtold12 @1089 +;__alldiv @2001 +;__allmul @2002 +;__alloca_probe @2010 +;__allrem @2003 +;__allshl @2005 +;__allshr @2004 +;__atodbl @996 +;__atoflt @997 +;__atoi64 @1418 +;__aulldiv @2006 +;__aullrem @2008 +;__aullshr @2007 +;__cabs @998 +;__chgsign @1000 +;__chkstk @2009 +;__clearfp @1001 +;__controlfp @1002 +;__copysign @1003 +;__ecvt @1008 +__except_handler3 @84 +;__fcloseall @1119 +;__fcvt @1011 +;__fileno @1124 +;__finite @1012 +;__fload @2027 +;__fltused @1093 +;__flushall @1123 +;__fpclass @1015 +;__fpieee_flt @1016 +;__fpreset @1017 +;__frnd @1020 +;__fsqrt @1021 +;__ftol @2028 +;__gcvt @1022 +;__getstdfilex @1100 +;__getws @1138 +;__hypot @1023 +;__inp @2029 +;__inpd @2031 +;__inpw @2030 +;__isctype @1417 +;__isnan @1024 +;__itoa @1025 +;__itow @1026 +;__j0 @1027 +;__j1 @1028 +;__jn @1029 +;__ld12tod @1087 +;__ld12tof @1088 +;__local_unwind2 @85 +;__logb @1035 +;__lrotl @1037 +;__lrotr @1038 +;__ltoa @1039 +;__ltow @1040 +;__memccpy @1042 +;__memicmp @1045 +;__msize @1049 +;__nextafter @1050 +;__outp @2032 +;__outpd @2034 +;__outpw @2033 +;__purecall @1092 +;__putws @1139 +;__rotl @1055 +;__rotr @1056 +;__scalb @1057 +;__setjmp3 @2000 +;__setmode @1187 +;__snprintf @729 +;__snwprintf @1096 +;__statusfp @1062 +;__strdup @1409 +;__stricmp @1410 +;__strlwr @1415 +;__strnicmp @1411 +;__strnset @1412 +;__strrev @1413 +;__strset @1414 +;__strupr @1416 +;__swab @1074 +;__ultoa @1079 +;__ultow @1080 +;__vsnprintf @1147 +;__vsnwprintf @1132 +;__wcsdup @74 +;__wcsicmp @230 +;__wcslwr @231 +;__wcsnicmp @229 +;__wcsnset @67 +;__wcsrev @70 +;__wcsset @71 +;__wcsupr @232 +;__wfdopen @1117 +;__wfopen @1145 +;__wfreopen @1201 +;__wtol @78 +;__wtoll @79 +;__y0 @1084 +;__y1 @1085 +;__yn @1086 +;_abs @988 +;_acos @989 +;_asin @990 +;_atan @991 +;_atan2 @992 +;_atof @995 +;_atoi @993 +;_atol @994 +;_calloc @1346 +;_ceil @999 +;_clearerr @1127 +;_cos @1004 +;_cosh @1005 +;_difftime @1006 +;_div @1007 +;_exp @1009 +;_fabs @1010 +;_fclose @1118 +;_feof @1125 +;_ferror @1126 +;_fflush @1122 +;_fgetc @1108 +;_fgetpos @1128 +;_fgets @1109 +;_fgetwc @1140 +;_fgetws @1143 +;_floor @1013 +;_fmod @1014 +;_fopen @1113 +;_fprintf @1115 +;_fputc @1110 +;_fputs @1111 +;_fputwc @1141 +;_fputws @1144 +;_fread @1120 +;_free @1018 +;_frexp @1019 +;_fscanf @1114 +;_fseek @1130 +;_fsetpos @1129 +;_ftell @1131 +;_fwprintf @867 +;_fwrite @1121 +;_fwscanf @735 +;_getchar @1104 +;_gets @1106 +;_getwchar @1136 +;_iswctype @193 +;_keybd_event @833 +;_labs @1030 +;_ldexp @1031 +;_ldiv @1032 +;_log @1033 +;_log10 @1034 +;_longjmp @1036 +;_lstrcmpW @227 +;_lstrcmpiW @228 +;_malloc @1041 +;_mbstowcs @76 +;_memchr @31 +;_memcmp @1043 +;_memcpy @1044 +;_memmove @1046 +;_memset @1047 +;_mixerClose @1598 +;_mixerGetControlDetails @1589 +;_mixerGetDevCaps @1591 +;_mixerGetID @1590 +;_mixerGetLineControls @1592 +;_mixerGetLineInfo @1593 +;_mixerGetNumDevs @1594 +;_mixerMessage @1596 +;_mixerOpen @1595 +;_mixerSetControlDetails @1597 +;_modf @1048 +;_mouse_event @824 +;_pow @1051 +;_printf @1102 +;_putchar @1105 +;_puts @1107 +;_putwchar @1137 +;_qsort @1052 +;_rand @1053 +;_realloc @1054 +;_scanf @1101 +;_setvbuf @1608 +;_sin @1058 +;_sinh @1059 +;_sndPlaySoundW @377 +;_sprintf @719 +;_sqrt @1060 +;_srand @1061 +;_sscanf @653 +;_strcat @1063 +;_strchr @1064 +;_strcmp @1065 +;_strcpy @1066 +;_strcspn @1067 +;_strlen @1068 +;_strncat @1069 +;_strncmp @1070 +;_strncpy @1071 ;_strpbrk @1406 ;_strrchr @1407 ;_strspn @1408 diff --git a/reactos/lib/coredll/coredll.edf b/reactos/lib/coredll/coredll.edf new file mode 100644 index 00000000000..d97ee8f8fba --- /dev/null +++ b/reactos/lib/coredll/coredll.edf @@ -0,0 +1,1405 @@ +LIBRARY COREDLL.dll +EXPORTS +;??0exception@std@@QAE@ABV01@@Z @1572 +;??0exception@std@@QAE@PBD@Z @1571 +;??0exception@std@@QAE@XZ @1570 +;??0type_info@@AAE@ABV0@@Z @1568 +;??1exception@std@@UAE@XZ @1574 +;??1type_info@@UAE@XZ @1562 +;??2@YAPAXI@Z @1095 +;??2@YAPAXIABUnothrow_t@std@@@Z @1646 +;??3@YAXPAX@Z @1094 +;??3@YAXPAXABUnothrow_t@std@@@Z @1662 +;??4exception@std@@QAEAAV01@ABV01@@Z @1573 +;??4type_info@@AAEAAV0@ABV0@@Z @1569 +;??8type_info@@QBEHABV0@@Z @1563 +;??9type_info@@QBEHABV0@@Z @1564 +;??_7exception@std@@6B@ @1579 +;??_7type_info@@6B@ @1580 +;??_L@YGXPAXIHP6EX0@Z1@Z @1576 +;??_M@YGXPAXIHP6EX0@Z@Z @1578 +;??_N@YGXPAXIHP6EX0@Z1@Z @1577 +;??_U@YAPAXI@Z @1456 +;??_U@YAPAXIABUnothrow_t@std@@@Z @1661 +;??_V@YAXPAX@Z @1457 +;??_V@YAXPAXABUnothrow_t@std@@@Z @1663 +;?DefaultImcGet@@YAKXZ @1218 +;?DefaultImeWndGet@@YAPAUHWND__@@XZ @1219 +;?ImmGetUIClassName@@YAPAGXZ @1223 +;?ImmProcessKey@@YAKPAUHWND__@@IJKI@Z @1220 +;?ImmSetActiveContext@@YAHPAUHWND__@@KH@Z @806 +;?ImmTranslateMessage@@YAHPAUHWND__@@IIJHIIPAH@Z @1221 +;?_Nomemory@std@@YAXXZ @1660 +;?_Xlen@std@@YAXXZ @1658 +;?_Xran@std@@YAXXZ @1659 +;?__set_inconsistency@@YAP6AXXZP6AXXZ@Z @1555 +;?_inconsistency@@YAXXZ @1558 +;?_query_new_handler@@YAP6AHI@ZXZ @1618 +;?_query_new_mode@@YAHXZ @1649 +;?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z @1650 +;?_set_new_mode@@YAHH@Z @1648 +;?before@type_info@@QBEHABV1@@Z @1565 +;?name@type_info@@QBEPBDXZ @1566 +;?nothrow@std@@3Unothrow_t@1@B @1647 +;?raw_name@type_info@@QBEPBDXZ @1567 +;?set_new_handler@@YAP6AXXZP6AXXZ@Z @1619 +;?set_terminate@std@@YAP6AXXZP6AXXZ@Z @1552 +;?set_unexpected@std@@YAP6AXXZP6AXXZ@Z @1553 +;?terminate@std@@YAXXZ @1556 +;?unexpected@std@@YAXXZ @1557 +;?what@exception@std@@UBEPBDXZ @1575 +;_AAFS_CloseAllFileHandles @655 +_AFS_CreateDirectoryW =_AFS_CreateDirectoryW @644 +;_AFS_CreateFileW @648 +;_AFS_DeleteFileW @649 +;_AFS_FindFirstChangeNotificationW @1685 +;_AFS_FindFirstFileW @651 +;_AFS_GetDiskFreeSpace @656 +;_AFS_GetFileAttributesW @646 +;_AFS_MoveFileW @650 +;_AFS_NotifyMountedFS @657 +;_AFS_PrestoChangoFileName @654 +;_AFS_RegisterFileSystemFunction @652 +;_AFS_RemoveDirectoryW @645 +;_AFS_SetFileAttributesW @647 +;_AFS_Unmount @643 +;_AbortDoc @955 +;_AccessibilitySoundSentryEvent @1540 +;_ActivateDevice @1179 +;_ActivateDeviceEx @1494 +;_ActivateService @1508 +;_AddEventAccess @558 +;_AddFontResourceW @893 +;_AddTrackedItem @578 +;_AdjustWindowRectEx @887 +;_AdvertiseInterface @1687 +;_AllKeys @1453 +;_AllocPhysMem @1486 +;_AppendMenuW @842 +;_AttachDebugger @157 +;_AudioUpdateFromRegistry @376 +;_BatteryDrvrGetLevels @297 +;_BatteryDrvrSupportsChangeNotification @298 +;_BatteryGetLifeTimeInfo @713 +;_BatteryNotifyOfTimeChange @714 +;_BeginDeferWindowPos @1157 +;_BeginPaint @260 +;_BinaryCompress @593 +;_BinaryDecompress @594 +;_BitBlt @903 +;_BringWindowToTop @275 +;_CacheSync @577 +;_CallNextHookEx @1204 +;_CallWindowProcW @285 +;_CechangeDatabaseLCID @340 +;_CeclearUserNotification @474 +;_CecreateDatabase @315 +;_CecreateDatabaseEx @1190 +;_CecreateDatabaseEx2 @1468 +;_CeDeleteDatabase @318 +;_CeDeleteDatabaseEx @1193 +;_CeDeleteRecord @320 +;_CeEnumDBVolumes @1165 +;_CeEventHasOccurred @479 +;_CeFindFirstDatabase @313 +;_CeFindFirstDatabaseEx @1196 +;_CeFindNextDatabase @314 +;_CeFindNextDatabaseEx @1189 +;_CeFlushDBVol @1217 +;_CeFreeNotification @1226 +;_CeGenRandom @1601 +;_CeGetCallerTrust @1395 +;_CeGetCurrentTrust @1357 +;_CeGetDBInformationByHandle @1473 +;_CeGetRandomSeed @1443 +;_CeGetThreadPriority @622 +;_CeGetThreadQuantum @1245 +;_CeGetUserNotification @1354 +;_CeGetUserNotificationHandles @1353 +;_CeGetUserNotificationPreferences @478 +;_CeHandleAppNotifications @477 +;_CeLogData @1451 +;_CeLogGetZones @1681 +;_CeLogReSync @1467 +;_CeLogSetZones @1452 +;_CeMapArgumentArray @1446 +;_CeModuleJit @53 +;_CeMountDBVol @1164 +;_CeOidGetInfo @312 +;_CeOidGetInfoEx @1195 +;_CeOidGetInfoEx2 @1472 +;_CeOpenDatabase @317 +;_CeOpenDatabaseEx @1192 +;_CeOpenDatabaseEx2 @1469 +;_CeReadRecordProps @321 +;_CeReadRecordPropsEx @1194 +;_CeRegisterFileSystemNotification @331 +;_CeRemoveFontResource @894 +;_CeResyncFilesys @1425 +;_CeRunAppAtEvent @476 +;_CeRunAppAtTime @475 +;_CeSeekDatabase @319 +;_CeSeekDatabaseEx @1470 +;_CeSetDatabaseInfo @316 +;_CeSetDatabaseInfoEx @1191 +;_CeSetDatabaseInfoEx2 @1471 +;_CeSetExtendedPdata @1455 +;_CeSetThreadPriority @621 +;_CeSetThreadQuantum @1244 +;_CeSetUserNotification @473 +;_CeSetUserNotificationEx @1352 +;_CeUnmountDBVol @1197 +;_CeWriteRecordProps @322 +;_ChangeDisplaySettingsEx @1611 +;_CharLowerBuffW @222 +;_CharLowerW @221 +;_CharNextW @226 +;_CharPrevW @225 +;_CharUpperBuffW @223 +;_CharUpperW @224 +;_CheckMenuItem @848 +;_CheckMenuRadioItem @849 +;_CheckPassword @182 +;_CheckRadioButton @684 +;_ChildWindowFromPoint @253 +;_ClearCommBreak @107 +;_ClearCommError @108 +;_ClientToScreen @254 +;_ClipCursor @731 +;_CloseAllDeviceHandles @244 +;_CloseAllFileHandles @242 +;_CloseAllServiceHandles @1511 +;_CloseClipboard @669 +;_CloseEnhMetaFile @956 +;_CloseHandle @553 +;_CloseMsgQueue @1533 +;_CloseProcOE @589 +;_ComThreadBaseFunc @1240 +;_CombineRgn @968 +;_CompactAllHeaps @54 +;_CompareFileTime @18 +;_CompareStringW @198 +;_ConnectDebugger @633 +;_ContinueDebugEvent @504 +;_ConvertDefaultLocale @210 +;_ConvertThreadToFiber @1480 +;_CopyFileW @164 +;_CopyRect @96 +;_CountClipboardFormats @674 +;_CreateAPIHandle @636 +;_CreateAPISet @559 +;_CreateAcceleratorTableW @92 +;_CreateBitmap @901 +;_CreateBitmapFromPointer @946 +;_CreateCaret @658 +;_CreateCompatibleBitmap @902 +;_CreateCompatibleDC @910 +;_CreateCrit @616 +;_CreateCursor @722 +;_CreateDCW @909 +;_CreateDIBPatternBrushPt @929 +;_CreateDIBSection @90 +;_CreateDeviceHandle @245 +;_CreateDialogIndirectParamW @688 +;_CreateDirectoryW @160 +;_CreateEnhMetaFileW @957 +;_CreateEventW @495 +;_CreateFiber @1483 +;_CreateFileForMapping @552 +;_CreateFileForMappingW @1167 +;_CreateFileMappingW @548 +;_CreateFileW @168 +;_CreateFontIndirectW @895 +;_CreateIconIndirect @723 +;_CreateLocaleView @1466 +;_CreateMenu @851 +;_CreateMsgQueue @1529 +;_CreateMutexW @555 +;_CreatePalette @947 +;_CreatePatternBrush @925 +;_CreatePen @926 +;_CreatePenIndirect @930 +;_CreatePopupMenu @852 +;_CreateProcessW @493 +;_CreateRectRgn @980 +;_CreateRectRgnIndirect @969 +;_CreateSemaphoreW @1238 +;_CreateServiceHandle @1512 +;_CreateSolidBrush @931 +;_CreateStaticMapping @1539 +;_CreateThread @492 +;_CreateWindowExW @246 +;_CryptAcquireContextW @126 +;_CryptContextAddRef @154 +;_CryptCreateHash @137 +;_CryptDecrypt @136 +;_CryptDeriveKey @129 +;_CryptDestroyHash @140 +;_CryptDestroyKey @130 +;_CryptDuplicateHash @156 +;_CryptDuplicateKey @155 +;_CryptEncrypt @135 +;_CryptEnumProviderTypesW @152 +;_CryptEnumProvidersW @153 +;_CryptExportKey @133 +;_CryptGenKey @128 +;_CryptGenRandom @143 +;_CryptGetDefaultProviderW @151 +;_CryptGetHashParam @146 +;_CryptGetKeyParam @132 +;_CryptGetProvParam @148 +;_CryptGetUserKey @144 +;_CryptHashData @139 +;_CryptHashSessionKey @138 +;_CryptImportKey @134 +;_CryptProtectData @1599 +;_CryptReleaseContext @127 +;_CryptSetHashParam @147 +;_CryptSetKeyParam @131 +;_CryptSetProvParam @149 +;_CryptSetProviderExW @150 +;_CryptSetProviderW @145 +;_CryptSignHashW @141 +;_CryptUnprotectData @1600 +;_CryptVerifySignatureW @142 +;_DBCanonicalize @233 +;_DDKReg_GetIsrInfo @1669 +;_DDKReg_GetPciInfo @1670 +;_DDKReg_GetWindowInfo @1668 +;_DeactivateDevice @1180 +;_DebugActiveProcess @505 +;_DebugNotify @642 +;_DefDlgProcW @689 +;_DefWindowProcW @264 +;_DeferWindowPos @1158 +;_DeleteAndRenameFile @183 +;_DeleteCriticalSection @3 +;_DeleteDC @911 +;_DeleteEnhMetaFile @958 +;_DeleteFiber @1484 +;_DeleteFileW @165 +;_DeleteMenu @850 +;_DeleteObject @912 +;_DeleteTrackedItem @579 +;_DeregisterAFS @335 +;_DeregisterAFSName @339 +;_DeregisterDevice @236 +;_DeregisterService @1510 +;_DestroyAcceleratorTable @93 +;_DestroyCaret @659 +;_DestroyCursor @724 +;_DestroyIcon @725 +;_DestroyMenu @844 +;_DestroyWindow @265 +;_DeviceIoControl @179 +;_DevicePowerNotify @1588 +;_DialogBoxIndirectParamW @690 +;_DisableCaretSystemWide @666 +;_DisableThreadLibraryCalls @1232 +;_DispatchMessageW @859 +;_DrawEdge @932 +;_DrawFocusRect @933 +;_DrawFrameControl @987 +;_DrawIconEx @726 +;_DrawMenuBar @856 +;_DrawTextW @945 +;_DumpFileSystemHeap @341 +;_DumpKCallProfile @510 +;_DuplicateHandle @1535 +;_Ellipse @934 +;_EmptyClipboard @677 +;_EnableCaretSystemWide @667 +;_EnableEUDC @986 +;_EnableHardwareKeyboard @825 +;_EnableMenuItem @847 +;_EnableWindow @287 +;_EndDeferWindowPos @1159 +;_EndDialog @691 +;_EndDoc @959 +;_EndPage @960 +;_EndPaint @261 +;_EnterCriticalSection @4 +;_EnumCalendarInfoW @206 +;_EnumClipboardFormats @675 +;_EnumDateFormatsW @208 +;_EnumDevices @124 +;_EnumDisplayMonitors @1526 +;_EnumFontFamiliesW @965 +;_EnumFontsW @966 +;_EnumPnpIds @123 +;_EnumPropsEx @1500 +;_EnumServices @1517 +;_EnumSystemCodePagesW @220 +;_EnumSystemLocalesW @219 +;_EnumTimeFormatsW @207 +;_EnumWindows @291 +;_EqualRect @97 +;_EqualRgn @91 +;_EscapeCommFunction @109 +;_EventModify @494 +;_ExcludeClipRect @970 +;_ExitThread @6 +;_ExtCreateRegion @1617 +;_ExtEscape @1182 +;_ExtTextOutW @896 +;_ExtractIconExW @727 +;_ExtractResource @573 +;_FileSystemPowerFunction @241 +;_FileTimeToLocalFileTime @21 +;_FileTimeToSystemTime @20 +;_FillRect @935 +;_FillRgn @927 +;_FilterTrackedItem @585 +;_FindClose @180 +;_FindCloseChangeNotification @1684 +;_FindFirstChangeNotificationW @1682 +;_FindFirstFileExW @1235 +;_FindFirstFileW @167 +;_FindNextChangeNotification @1683 +;_FindNextFileW @181 +;_FindResource @531 +;_FindResourceW @532 +;_FindWindowW @286 +;_FlushFileBuffers @175 +;_FlushInstructionCache @508 +;_FlushViewOfFile @551 +;_FlushViewOfFileMaybe @1215 +;_FoldStringW @218 +;_ForcePageout @540 +;_FormatMessageW @234 +;_FreeIntChainHandler @1476 +;_FreeLibrary @529 +;_FreeLibraryAndExitThread @1216 +;_FreePhysMem @1487 +;_GetACP @186 +;_GetAPIAddress @32 +;_GetActiveWindow @706 +;_GetAssociatedMenu @300 +;_GetAsyncKeyState @826 +;_GetAsyncShiftFlags @834 +;_GetBkColor @913 +;_GetBkMode @914 +;_GetCPInfo @188 +;_GetCRTFlags @1228 +;_GetCRTStorageEx @1227 +;_GetCallerProcess @607 +;_GetCallerProcessIndex @641 +;_GetCapture @707 +;_GetCaretBlinkTime @665 +;_GetCaretPos @663 +;_GetCharWidth32 @1664 +;_GetClassInfoW @878 +;_GetClassLong @881 +;_GetClassLongW @879 +;_GetClassNameW @283 +;_GetClientRect @249 +;_GetClipBox @971 +;_GetClipCursor @732 +;_GetClipRgn @972 +;_GetClipboardData @672 +;_GetClipboardDataAlloc @681 +;_GetClipboardFormatNameW @676 +;_GetClipboardOwner @670 +;_GetCommMask @110 +;_GetCommModemStatus @111 +;_GetCommProperties @112 +;_GetCommState @113 +;_GetCommTimeouts @114 +;_GetCommandLineW @1231 +;_GetCurrencyFormatW @205 +;_GetCurrentFT @29 +;_GetCurrentFiber @1481 +;_GetCurrentObject @915 +;_GetCurrentPermissions @612 +;_GetCurrentPositionEx @1653 +;_GetCursor @733 +;_GetCursorPos @734 +;_GetDC @262 +;_GetDCEx @1185 +;_GetDIBColorTable @1665 +;_GetDateFormatW @203 +;_GetDesktopWindow @1397 +;_GetDeviceByIndex @1236 +;_GetDeviceCaps @916 +;_GetDeviceKeys @125 +;_GetDevicePower @1679 +;_GetDialogBaseUnits @694 +;_GetDiskFreeSpaceExW @184 +;_GetDlgCtrlID @693 +;_GetDlgItem @692 +;_GetDlgItemInt @695 +;_GetDlgItemTextW @687 +;_GetDoubleClickTime @888 +;_GetEventData @1527 +;_GetExitCodeProcess @519 +;_GetExitCodeThread @518 +;_GetFSHeapInfo @603 +;_GetFiberData @1482 +;_GetFileAttributesExW @1237 +;_GetFileAttributesW @166 +;_GetFileInformationByHandle @174 +;_GetFileSize @172 +;_GetFileTime @176 +;_GetFileVersionInfoSizeW @1461 +;_GetFileVersionInfoW @1460 +;_GetFocus @705 +;_GetForegroundInfo @1224 +;_GetForegroundKeyboardTarget @1225 +;_GetForegroundWindow @701 +;_GetHeapSnapshot @52 +;_GetIdleTime @608 +;_GetKPhys @581 +;_GetKeyState @860 +;_GetKeyboardLayout @1229 +;_GetKeyboardLayoutNameW @1160 +;_GetKeyboardStatus @827 +;_GetKeyboardTarget @711 +;_GetLastError @516 +;_GetLocalTime @23 +;_GetLocaleInfoW @200 +;_GetMenuItemInfoW @854 +;_GetMessagePos @862 +;_GetMessageQueueReadyTimeStamp @1477 +;_GetMessageSource @872 +;_GetMessageW @861 +;_GetMessageWNoWait @863 +;_GetModuleFileNameW @537 +;_GetModuleHandleW @1177 +;_GetMonitorInfo @1525 +;_GetMouseMovePoints @820 +;_GetMsgQueueInfo @1532 +;_GetNearestColor @952 +;_GetNearestPaletteIndex @948 +;_GetNextDlgGroupItem @697 +;_GetNextDlgTabItem @696 +;_GetNumberFormatW @204 +;_GetOEMCP @187 +;_GetObjectType @917 +;_GetObjectW @918 +;_GetOpenClipboardWindow @680 +;_GetOpenFileNameW @488 +;_GetOwnerProcess @606 +;_GetPaletteEntries @949 +;_GetParent @269 +;_GetPasswordActive @239 +;_GetPasswordStatus @1538 +;_GetPixel @936 +;_GetPriorityClipboardFormat @679 +;_GetPrivateCallbacks @1400 +;_GetProcAddrBits @602 +;_GetProcAddressA @1230 +;_GetProcAddressW @530 +;_GetProcFromPtr @600 +;_GetProcName @624 +;_GetProcessHeap @50 +;_GetProcessIndexFromID @640 +;_GetProcessVersion @536 +;_GetProp @1498 +;_GetQueueStatus @1420 +;_GetRealTime @570 +;_GetRegionData @973 +;_GetRgnBox @974 +;_GetRomFileBytes @576 +;_GetRomFileInfo @575 +;_GetSaveFileNameW @489 +;_GetScrollInfo @282 +;_GetServiceByIndex @1513 +;_GetServiceHandle @1518 +;_GetStdioPathW @1149 +;_GetStockObject @919 +;_GetStoreInformation @323 +;_GetStringTypeExW @217 +;_GetStringTypeW @216 +;_GetSubMenu @855 +;_GetSysColor @889 +;_GetSysColorBrush @937 +;_GetSystemDefaultLCID @213 +;_GetSystemDefaultLangID @211 +;_GetSystemInfo @542 +;_GetSystemMemoryDivision @336 +;_GetSystemMetrics @885 +;_GetSystemPaletteEntries @950 +;_GetSystemPowerState @1581 +;_GetSystemPowerStatusEx @715 +;_GetSystemPowerStatusEx2 @1358 +;_GetSystemTime @25 +;_GetTempFileNameW @1234 +;_GetTempPathW @162 +;_GetTextAlign @1655 +;_GetTextColor @920 +;_GetTextExtentExPointW @897 +;_GetTextFaceW @967 +;_GetTextMetricsW @898 +;_GetThreadContext @1148 +;_GetThreadPriority @515 +;_GetThreadTimes @1186 +;_GetTickCount @535 +;_GetTimeFormatW @202 +;_GetTimeZoneInformation @27 +;_GetUpdateRect @274 +;_GetUpdateRgn @273 +;_GetUserDefaultLCID @215 +;_GetUserDefaultLangID @212 +;_GetUserDirectory @1686 +;_GetUserNameExW @1503 +;_GetVersionEx @17 +;_GetVersionExW @717 +;_GetWindow @251 +;_GetWindowDC @270 +;_GetWindowLongW @259 +;_GetWindowRect @248 +;_GetWindowRgn @1399 +;_GetWindowTextLengthW @276 +;_GetWindowTextW @257 +;_GetWindowTextWDirect @1454 +;_GetWindowThreadProcessId @292 +;_GiveKPhys @582 +;_GlobalAddAtomW @1519 +;_GlobalDeleteAtom @1520 +;_GlobalFindAtomW @1521 +;_GlobalMemoryStatus @88 +;_GwesPowerOffSystem @296 +;_HeapAlloc @46 +;_HeapCreate @44 +;_HeapDestroy @45 +;_HeapFree @49 +;_HeapReAlloc @47 +;_HeapSize @48 +;_HeapValidate @51 +;_HideCaret @660 +;_ImageList_Add @738 +;_ImageList_AddMasked @739 +;_ImageList_BeginDrag @740 +;_ImageList_Copy @767 +;_ImageList_CopyDitherImage @741 +;_ImageList_Create @742 +;_ImageList_Destroy @743 +;_ImageList_DragEnter @744 +;_ImageList_DragLeave @745 +;_ImageList_DragMove @746 +;_ImageList_DragShowNolock @747 +;_ImageList_Draw @748 +;_ImageList_DrawEx @749 +;_ImageList_DrawIndirect @750 +;_ImageList_Duplicate @768 +;_ImageList_EndDrag @751 +;_ImageList_GetBkColor @752 +;_ImageList_GetDragImage @753 +;_ImageList_GetIcon @754 +;_ImageList_GetIconSize @755 +;_ImageList_GetImageCount @756 +;_ImageList_GetImageInfo @757 +;_ImageList_LoadImage @758 +;_ImageList_Merge @759 +;_ImageList_Remove @760 +;_ImageList_Replace @761 +;_ImageList_ReplaceIcon @762 +;_ImageList_SetBkColor @763 +;_ImageList_SetDragCursorImage @764 +;_ImageList_SetIconSize @765 +;_ImageList_SetImageCount @769 +;_ImageList_SetOverlayImage @766 +;_ImmAssociateContext @770 +;_ImmAssociateContextEx @1205 +;_ImmConfigureIMEW @771 +;_ImmCreateContext @1198 +;_ImmCreateIMCC @772 +;_ImmDestroyContext @1199 +;_ImmDestroyIMCC @773 +;_ImmDisableIME @1206 +;_ImmEnableIME @1541 +;_ImmEnumRegisterWordW @774 +;_ImmEscapeW @775 +;_ImmGenerateMessage @776 +;_ImmGetCandidateListCountW @778 +;_ImmGetCandidateListW @777 +;_ImmGetCandidateWindow @779 +;_ImmGetCompositionFontW @780 +;_ImmGetCompositionStringW @781 +;_ImmGetCompositionWindow @782 +;_ImmGetContext @783 +;_ImmGetConversionListW @784 +;_ImmGetConversionStatus @785 +;_ImmGetDefaultIMEWnd @786 +;_ImmGetDescriptionW @787 +;_ImmGetGuideLineW @788 +;_ImmGetHotKey @813 +;_ImmGetIMCCLockCount @789 +;_ImmGetIMCCSize @790 +;_ImmGetIMCLockCount @791 +;_ImmGetIMEFileNameW @1207 +;_ImmGetImeMenuItemsW @1211 +;_ImmGetOpenStatus @792 +;_ImmGetProperty @793 +;_ImmGetRegisterWordStyleW @794 +;_ImmGetStatusWindowPos @1200 +;_ImmGetVirtualKey @1210 +;_ImmIsIME @1209 +;_ImmIsUIMessageW @796 +;_ImmLockIMC @797 +;_ImmLockIMCC @798 +;_ImmNotifyIME @800 +;_ImmReSizeIMCC @801 +;_ImmRegisterWordW @802 +;_ImmReleaseContext @803 +;_ImmRequestMessageW @1242 +;_ImmSIPanelState @804 +;_ImmSetCandidateWindow @807 +;_ImmSetCompositionFontW @808 +;_ImmSetCompositionStringW @809 +;_ImmSetCompositionWindow @810 +;_ImmSetConversionStatus @811 +;_ImmSetHotKey @812 +;_ImmSetImeWndIMC @1222 +;_ImmSetOpenStatus @814 +;_ImmSetStatusWindowPos @815 +;_ImmSimulateHotKey @816 +;_ImmUnlockIMC @817 +;_ImmUnlockIMCC @818 +;_ImmUnregisterWordW @819 +;_InSendMessage @1419 +;_InflateRect @98 +;_InitLocale @8 +;_InitializeCriticalSection @2 +;_InputDebugCharW @595 +;_InsertMenuW @841 +;_InterruptDisable @629 +;_InterruptDone @628 +;_InterruptInitialize @627 +;_IntersectClipRect @975 +;_IntersectRect @99 +;_InvalidateRect @250 +;_InvalidateRgn @1615 +;_IsAPIReady @30 +;_IsBadCodePtr @521 +;_IsBadPtr @601 +;_IsBadReadPtr @522 +;_IsBadWritePtr @523 +;_IsChild @277 +;_IsClipboardFormatAvailable @678 +;_IsDBCSLeadByte @191 +;_IsDBCSLeadByteEx @192 +;_IsDialogMessageW @698 +;_IsEncryptionPermitted @613 +;_IsExiting @159 +;_IsPrimaryThread @610 +;_IsProcessDying @1213 +;_IsRectEmpty @100 +;_IsSystemFile @1680 +;_IsValidCodePage @185 +;_IsValidLocale @209 +;_IsWindow @271 +;_IsWindowEnabled @288 +;_IsWindowVisible @886 +;_KernExtractIcons @574 +;_KernelIoControl @557 +;_KernelLibIoControl @1489 +;_KeybdGetDeviceInfo @828 +;_KeybdInitStates @829 +;_KeybdVKeyToUnicode @830 +;_KillAllOtherThreads @605 +;_KillTimer @876 +;_LCMapStringW @199 +;_LeaveCritSec @597 +;_LeaveCriticalSection @5 +;_LineTo @1652 +;_LoadAcceleratorsW @94 +;_LoadAnimatedCursor @1493 +;_LoadBitmapW @873 +;_LoadCursorW @683 +;_LoadDriver @626 +;_LoadFSD @237 +;_LoadFSDEx @1421 +;_LoadIconW @728 +;_LoadImageW @730 +;_LoadIntChainHandler @1475 +;_LoadKernelLibrary @1671 +;_LoadLibraryExW @1241 +;_LoadLibraryW @528 +;_LoadMenuW @846 +;_LoadResource @533 +;_LoadStringW @874 +;_LocalAlloc @33 +;_LocalAllocInProcess @41 +;_LocalFileTimeToFileTime @22 +;_LocalFree @36 +;_LocalFreeInProcess @42 +;_LocalReAlloc @34 +;_LocalSize @35 +;_LocalSizeInProcess @43 +;_LockPages @1161 +;_MainThreadBaseFunc @14 +;_MapCallerPtr @1602 +;_MapDialogRect @699 +;_MapPtrToProcWithSize @1603 +;_MapPtrToProcess @598 +;_MapPtrUnsecure @599 +;_MapViewOfFile @549 +;_MapVirtualKeyW @831 +;_MapWindowPoints @284 +;_MaskBlt @904 +;_MessageBeep @857 +;_MessageBoxW @858 +;_MonitorFromPoint @1522 +;_MonitorFromRect @1523 +;_MonitorFromWindow @1524 +;_MoveFileW @163 +;_MoveToEx @1651 +;_MoveWindow @272 +;_MsgWaitForMultipleObjectsEx @871 +;_MultiByteToWideChar @196 +;_NKDbgPrintfW @545 +;_NKTerminateThread @623 +;_NKvDbgPrintfW @568 +;_NLedGetDeviceInfo @839 +;_NLedSetDevice @840 +;_NotifyForceCleanboot @513 +;_NotifyWinUserSystem @716 +;_OffsetRect @101 +;_OffsetRgn @976 +;_OpenClipboard @668 +;_OpenDeviceKey @1396 +;_OpenEventW @1496 +;_OpenMsgQueue @1536 +;_OpenProcess @509 +;_OtherThreadsRunning @604 +;_OutputDebugStringW @541 +;_PPSHRestart @638 +;_PSLNotify @7 +;_PatBlt @938 +;_PeekMessageW @864 +;_PegClearUserNotification @468 +;_PegCreateDatabase @304 +;_PegDeleteDatabase @307 +;_PegDeleteRecord @309 +;_PegFindFirstDatabase @302 +;_PegFindNextDatabase @303 +;_PegGetUserNotificationPreferences @472 +;_PegHandleAppNotifications @471 +;_PegOidGetInfo @301 +;_PegOpenDatabase @306 +;_PegReadRecordProps @310 +;_PegRemoveFontResource @899 +;_PegRunAppAtEvent @470 +;_PegRunAppAtTime @469 +;_PegSeekDatabase @308 +;_PegSetDatabaseInfo @305 +;_PegSetUserNotification @467 +;_PegWriteRecordProps @311 +;_PerformCallBack4 @1448 +;_PlayEnhMetaFile @961 +;_PlaySoundW @378 +;_Polygon @939 +;_Polyline @940 +;_PostKeybdMessage @832 +;_PostMessageW @865 +;_PostQuitMessage @866 +;_PostThreadMessageW @290 +;_PowerOffSystem @617 +;_PrintTrackedItem @580 +;_ProcessDetachAllDLLs @572 +;_ProfileStart @82 +;_ProfileStop @83 +;_ProfileSyscall @569 +;_PtInRect @102 +;_PtInRegion @977 +;_PurgeComm @115 +;_QASetWindowsJournalHook @821 +;_QAUnhookWindowsJournalHook @822 +;_QueryAPISetID @490 +;_QueryInstructionSet @1677 +;_QueryPerformanceCounter @538 +;_QueryPerformanceFrequency @539 +;_RaiseException @543 +;_Random @80 +;_ReadFile @170 +;_ReadFileWithSeek @243 +;_ReadMsgQueue @1530 +;_ReadProcessMemory @506 +;_ReadRegistryFromOEM @1153 +;_RealizePalette @953 +;_RectInRegion @978 +;_RectVisible @981 +;_Rectangle @941 +;_RectangleAnimation @294 +;_RedrawWindow @1672 +;_RefreshKernelAlarm @587 +;_RegCloseKey @455 +;_RegCopyFile @465 +;_RegCreateKeyExW @456 +;_RegDeleteKeyW @457 +;_RegDeleteValueW @458 +;_RegEnumKeyExW @460 +;_RegEnumValueW @459 +;_RegFlushKey @1152 +;_RegOpenKeyExW @461 +;_RegOpenProcessKey @1542 +;_RegQueryInfoKeyW @462 +;_RegQueryValueExW @463 +;_RegReplaceKey @1479 +;_RegRestoreFile @466 +;_RegSaveKey @1478 +;_RegSetValueExW @464 +;_RegisterAFSEx @1490 +;_RegisterAFSName @338 +;_RegisterAPISet @635 +;_RegisterClassW @95 +;_RegisterClassWStub @883 +;_RegisterClipboardFormatW @673 +;_RegisterDbgZones @546 +;_RegisterDesktop @1507 +;_RegisterDevice @235 +;_RegisterHotKey @835 +;_RegisterPowerRelationship @1609 +;_RegisterSIPanel @293 +;_RegisterService @1509 +;_RegisterTaskBar @892 +;_RegisterTaskBarEx @1506 +;_RegisterTrackedItem @584 +;_RegisterWindowMessageW @891 +;_ReleaseCapture @709 +;_ReleaseDC @263 +;_ReleaseMutex @556 +;_ReleasePowerRelationship @1610 +;_ReleasePowerRequirement @1584 +;_ReleaseSemaphore @1239 +;_RemoteHeapAlloc @1604 +;_RemoteHeapFree @1606 +;_RemoteHeapReAlloc @1605 +;_RemoteHeapSize @1607 +;_RemoteLocalAlloc @37 +;_RemoteLocalFree @40 +;_RemoteLocalReAlloc @38 +;_RemoteLocalSize @39 +;_RemoveDirectoryW @161 +;_RemoveFontResourceW @900 +;_RemoveMenu @843 +;_RemoveProp @1499 +;_RequestDeviceNotifications @1504 +;_RequestPowerNotifications @1585 +;_ResourceCreateList @1612 +;_ResourceRelease @1614 +;_ResourceRequest @1613 +;_RestoreDC @907 +;_ResumeThread @500 +;_RoundRect @942 +;_SHAddToRecentDocs @483 +;_SHCreateExplorerInstance @1163 +;_SHCreateShortcut @484 +;_SHCreateShortcutEx @1488 +;_SHGetFileInfo @482 +;_SHGetShortcutTarget @485 +;_SHGetSpecialFolderPath @295 +;_SHLoadDIBitmap @487 +;_SHShowOutOfMemory @486 +;_SaveDC @908 +;_ScreenToClient @255 +;_ScrollDC @985 +;_ScrollWindowEx @289 +;_SelectClipRgn @979 +;_SelectObject @921 +;_SelectPalette @954 +;_SendDlgItemMessageW @685 +;_SendInput @823 +;_SendMessageTimeout @1495 +;_SendMessageW @868 +;_SendNotifyMessageW @869 +;_ServiceAddPort @1515 +;_ServiceIoControl @1514 +;_ServiceUnbindPorts @1516 +;_SetACP @189 +;_SetAbortProc @962 +;_SetActiveWindow @703 +;_SetAssociatedMenu @299 +;_SetBkColor @922 +;_SetBkMode @923 +;_SetBrushOrgEx @943 +;_SetCapture @708 +;_SetCaretBlinkTime @664 +;_SetCaretPos @662 +;_SetClassLong @882 +;_SetClassLongW @880 +;_SetCleanRebootFlag @615 +;_SetClipboardData @671 +;_SetCommBreak @116 +;_SetCommMask @117 +;_SetCommState @118 +;_SetCommTimeouts @119 +;_SetCurrentUser @1501 +;_SetCursor @682 +;_SetCursorPos @736 +;_SetDIBColorTable @1666 +;_SetDaylightTime @547 +;_SetDbgZone @618 +;_SetDevicePower @1678 +;_SetDlgItemInt @700 +;_SetDlgItemTextW @686 +;_SetEndOfFile @178 +;_SetEventData @1528 +;_SetExceptionHandler @583 +;_SetFileAttributesW @169 +;_SetFilePointer @173 +;_SetFileTime @177 +;_SetFocus @704 +;_SetForegroundWindow @702 +;_SetGwesOOMEvent @590 +;_SetGwesPowerHandler @632 +;_SetHandleOwner @625 +;_SetHardwareWatch @634 +;_SetInterruptEvent @158 +;_SetKMode @630 +;_SetKernelAlarm @586 +;_SetKeyboardTarget @710 +;_SetLastError @517 +;_SetLocalTime @24 +;_SetLocaleInfoW @201 +;_SetLowestScheduledPriority @609 +;_SetMenuItemInfoW @853 +;_SetOEMCP @190 +;_SetOOMEvent @1462 +;_SetObjectOwner @984 +;_SetPaletteEntries @951 +;_SetParent @268 +;_SetPassword @238 +;_SetPasswordActive @240 +;_SetPasswordStatus @1537 +;_SetPixel @944 +;_SetPowerOffHandler @631 +;_SetPowerRequirement @1583 +;_SetProcPermissions @611 +;_SetProp @1497 +;_SetROP2 @928 +;_SetRealTime @571 +;_SetRect @103 +;_SetRectEmpty @104 +;_SetRectRgn @982 +;_SetScrollInfo @279 +;_SetScrollPos @280 +;_SetScrollRange @281 +;_SetStdioPathW @1150 +;_SetSysColors @890 +;_SetSystemDefaultLCID @214 +;_SetSystemMemoryDivision @337 +;_SetSystemPowerState @1582 +;_SetSystemTime @26 +;_SetTextAlign @1654 +;_SetTextColor @924 +;_SetThreadContext @502 +;_SetThreadPriority @514 +;_SetTimeZoneBias @614 +;_SetTimeZoneInformation @28 +;_SetTimer @875 +;_SetUserData @1502 +;_SetViewportOrgEx @983 +;_SetWDevicePowerHandler @1178 +;_SetWindowLongW @258 +;_SetWindowPos @247 +;_SetWindowRgn @1398 +;_SetWindowTextW @256 +;_SetWindowsHookExW @1202 +;_SetupComm @120 +;_ShellExecuteEx @480 +;_ShellModalEnd @712 +;_Shell_NotifyIcon @481 +;_ShowCaret @661 +;_ShowCursor @737 +;_ShowWindow @266 +;_SignalStarted @639 +;_SizeofResource @534 +;_Sleep @496 +;_SleepTillTick @1534 +;_StartDocW @963 +;_StartPage @964 +;_StopDeviceNotifications @1505 +;_StopPowerNotifications @1586 +;_StretchBlt @905 +;_StretchDIBits @1667 +;_StringCompress @591 +;_StringDecompress @592 +;_SubtractRect @105 +;_SuspendThread @499 +;_SwitchToFiber @1485 +;_SystemIdleTimerReset @837 +;_SystemMemoryLow @720 +;_SystemParametersInfoW @89 +;_SystemStarted @1 +;_SystemTimeToFileTime @19 +;_THCreateSnapshot @511 +;_THGrow @512 +;_TakeCritSec @596 +;_TerminateProcess @544 +;_TerminateThread @491 +;_ThreadAttachAllDLLs @561 +;_ThreadBaseFunc @13 +;_ThreadDetachAllDLLs @562 +;_ThreadExceptionExit @1474 +;_TlsCall @520 +;_TlsGetValue @15 +;_TlsSetValue @16 +;_TouchCalibrate @877 +;_TrackPopupMenuEx @845 +;_TranslateAcceleratorW @838 +;_TranslateCharsetInfo @1166 +;_TranslateMessage @870 +;_TransmitCommChar @121 +;_TransparentImage @906 +;_TryEnterCriticalSection @1233 +;_TurnOffProfiling @620 +;_TurnOnProfiling @619 +;_U_rclose @567 +;_U_rlseek @566 +;_U_ropen @563 +;_U_rread @564 +;_U_rwrite @565 +;_UnhookWindowsHookEx @1203 +;_UnionRect @106 +;_UnlockPages @1162 +;_UnmapViewOfFile @550 +;_UnregisterClassW @884 +;_UnregisterFunc1 @1156 +;_UnregisterHotKey @836 +;_UpdateNLSInfo @1447 +;_UpdateWindow @267 +;_ValidateRect @278 +;_ValidateRgn @1616 +;_VerQueryValueW @1459 +;_VerifyAPIHandle @637 +;_VirtualAlloc @524 +;_VirtualCopy @560 +;_VirtualFree @525 +;_VirtualProtect @526 +;_VirtualQuery @527 +;_WNetAddConnection3W @444 +;_WNetCancelConnection2W @445 +;_WNetCloseEnum @453 +;_WNetConnectionDialog1W @446 +;_WNetDisconnectDialog @447 +;_WNetDisconnectDialog1W @448 +;_WNetEnumResourceW @454 +;_WNetGetConnectionW @449 +;_WNetGetUniversalNameW @450 +;_WNetGetUserW @451 +;_WNetOpenEnumW @452 +;_WaitCommEvent @122 +;_WaitForDebugEvent @503 +;_WaitForMultipleObjects @498 +;_WaitForSingleObject @497 +;_WideCharToMultiByte @197 +;_WindowFromPoint @252 +;_WriteDebugLED @1155 +;_WriteFile @171 +;_WriteFileWithSeek @718 +;_WriteMsgQueue @1531 +;_WriteProcessMemory @507 +;_WriteRegistryToOEM @1154 +;__CIacos @2020 +;__CIasin @2019 +;__CIatan @2021 +;__CIatan2 @2022 +;__CIcos @2017 +;__CIcosh @2024 +;__CIexp @2015 +;__CIfmod @2026 +;__CIlog @2013 +;__CIlog10 @2014 +;__CIpow @2012 +;__CIsin @2016 +;__CIsinh @2023 +;__CIsqrt @2011 +;__CItan @2018 +;__CItanh @2025 +;__CxxThrowException@8 @1551 +;__EH_prolog @1620 +;__HUGE @1181 +;__InitStdioLib @1151 +;__XcptFilter @1645 +;___CxxFrameHandler @1550 +;___RTCastToVoid @1559 +;___RTDynamicCast @1561 +;___RTtypeid @1560 +;___abnormal_termination @86 +;___strgtold12 @1089 +;__alldiv @2001 +;__allmul @2002 +;__alloca_probe @2010 +;__allrem @2003 +;__allshl @2005 +;__allshr @2004 +;__atodbl @996 +;__atoflt @997 +;__atoi64 @1418 +;__aulldiv @2006 +;__aullrem @2008 +;__aullshr @2007 +;__cabs @998 +;__chgsign @1000 +;__chkstk @2009 +;__clearfp @1001 +;__controlfp @1002 +;__copysign @1003 +;__ecvt @1008 +;__except_handler3 @84 +;__fcloseall @1119 +;__fcvt @1011 +;__fileno @1124 +;__finite @1012 +;__fload @2027 +;__fltused @1093 +;__flushall @1123 +;__fpclass @1015 +;__fpieee_flt @1016 +;__fpreset @1017 +;__frnd @1020 +;__fsqrt @1021 +;__ftol @2028 +;__gcvt @1022 +;__getstdfilex @1100 +;__getws @1138 +;__hypot @1023 +;__inp @2029 +;__inpd @2031 +;__inpw @2030 +;__isctype @1417 +;__isnan @1024 +;__itoa @1025 +;__itow @1026 +;__j0 @1027 +;__j1 @1028 +;__jn @1029 +;__ld12tod @1087 +;__ld12tof @1088 +;__local_unwind2 @85 +;__logb @1035 +;__lrotl @1037 +;__lrotr @1038 +;__ltoa @1039 +;__ltow @1040 +;__memccpy @1042 +;__memicmp @1045 +;__msize @1049 +;__nextafter @1050 +;__outp @2032 +;__outpd @2034 +;__outpw @2033 +;__purecall @1092 +;__putws @1139 +;__rotl @1055 +;__rotr @1056 +;__scalb @1057 +;__setjmp3 @2000 +;__setmode @1187 +;__snprintf @729 +;__snwprintf @1096 +;__statusfp @1062 +;__strdup @1409 +;__stricmp @1410 +;__strlwr @1415 +;__strnicmp @1411 +;__strnset @1412 +;__strrev @1413 +;__strset @1414 +;__strupr @1416 +;__swab @1074 +;__ultoa @1079 +;__ultow @1080 +;__vsnprintf @1147 +;__vsnwprintf @1132 +;__wcsdup @74 +;__wcsicmp @230 +;__wcslwr @231 +;__wcsnicmp @229 +;__wcsnset @67 +;__wcsrev @70 +;__wcsset @71 +;__wcsupr @232 +;__wfdopen @1117 +;__wfopen @1145 +;__wfreopen @1201 +;__wtol @78 +;__wtoll @79 +;__y0 @1084 +;__y1 @1085 +;__yn @1086 +;_abs @988 +;_acos @989 +;_asin @990 +;_atan @991 +;_atan2 @992 +;_atof @995 +;_atoi @993 +;_atol @994 +;_calloc @1346 +;_ceil @999 +;_clearerr @1127 +;_cos @1004 +;_cosh @1005 +;_difftime @1006 +;_div @1007 +;_exp @1009 +;_fabs @1010 +;_fclose @1118 +;_feof @1125 +;_ferror @1126 +;_fflush @1122 +;_fgetc @1108 +;_fgetpos @1128 +;_fgets @1109 +;_fgetwc @1140 +;_fgetws @1143 +;_floor @1013 +;_fmod @1014 +;_fopen @1113 +;_fprintf @1115 +;_fputc @1110 +;_fputs @1111 +;_fputwc @1141 +;_fputws @1144 +;_fread @1120 +;_free @1018 +;_frexp @1019 +;_fscanf @1114 +;_fseek @1130 +;_fsetpos @1129 +;_ftell @1131 +;_fwprintf @867 +;_fwrite @1121 +;_fwscanf @735 +;_getchar @1104 +;_gets @1106 +;_getwchar @1136 +;_iswctype @193 +;_keybd_event @833 +;_labs @1030 +;_ldexp @1031 +;_ldiv @1032 +;_log @1033 +;_log10 @1034 +;_longjmp @1036 +;_lstrcmpW @227 +;_lstrcmpiW @228 +;_malloc @1041 +;_mbstowcs @76 +;_memchr @31 +;_memcmp @1043 +;_memcpy @1044 +;_memmove @1046 +;_memset @1047 +;_mixerClose @1598 +;_mixerGetControlDetails @1589 +;_mixerGetDevCaps @1591 +;_mixerGetID @1590 +;_mixerGetLineControls @1592 +;_mixerGetLineInfo @1593 +;_mixerGetNumDevs @1594 +;_mixerMessage @1596 +;_mixerOpen @1595 +;_mixerSetControlDetails @1597 +;_modf @1048 +;_mouse_event @824 +;_pow @1051 +;_printf @1102 +;_putchar @1105 +;_puts @1107 +;_putwchar @1137 +;_qsort @1052 +;_rand @1053 +;_realloc @1054 +;_scanf @1101 +;_setvbuf @1608 +;_sin @1058 +;_sinh @1059 +;_sndPlaySoundW @377 +;_sprintf @719 +;_sqrt @1060 +;_srand @1061 +;_sscanf @653 +;_strcat @1063 +;_strchr @1064 +;_strcmp @1065 +;_strcpy @1066 +;_strcspn @1067 +;_strlen @1068 +;_strncat @1069 +;_strncmp @1070 +;_strncpy @1071 +;_strpbrk @1406 +;_strrchr @1407 +;_strspn @1408 +;_strstr @1072 +;_strtod @1403 +;_strtok @1073 +;_strtol @1404 +;_strtoul @1405 +;_swprintf @1097 +;_swscanf @1098 +;_tan @1075 +;_tanh @1076 +;_tolower @1090 +;_toupper @1091 +;_towlower @194 +;_towupper @195 +;_ungetc @1112 +;_ungetwc @1142 +;_vfprintf @1116 +;_vfwprintf @721 +;_vprintf @1103 +;_vsprintf @1146 +;_vswprintf @1099 +;_vwprintf @1135 +;_waveInAddBuffer @406 +;_waveInClose @403 +;_waveInGetDevCaps @401 +;_waveInGetErrorText @402 +;_waveInGetID @411 +;_waveInGetNumDevs @400 +;_waveInGetPosition @410 +;_waveInMessage @412 +;_waveInOpen @413 +;_waveInPrepareHeader @404 +;_waveInReset @409 +;_waveInStart @407 +;_waveInStop @408 +;_waveInUnprepareHeader @405 +;_waveOutBreakLoop @391 +;_waveOutClose @384 +;_waveOutGetDevCaps @380 +;_waveOutGetErrorText @383 +;_waveOutGetID @397 +;_waveOutGetNumDevs @379 +;_waveOutGetPitch @393 +;_waveOutGetPlaybackRate @395 +;_waveOutGetPosition @392 +;_waveOutGetVolume @381 +;_waveOutMessage @398 +;_waveOutOpen @399 +;_waveOutPause @388 +;_waveOutPrepareHeader @385 +;_waveOutReset @390 +;_waveOutRestart @389 +;_waveOutSetPitch @394 +;_waveOutSetPlaybackRate @396 +;_waveOutSetVolume @382 +;_waveOutUnprepareHeader @386 +;_waveOutWrite @387 +;_wcscat @58 +;_wcschr @59 +;_wcscmp @60 +;_wcscpy @61 +;_wcscspn @62 +;_wcslen @63 +;_wcsncat @64 +;_wcsncmp @65 +;_wcsncpy @66 +;_wcspbrk @68 +;_wcsrchr @69 +;_wcsspn @72 +;_wcsstr @73 +;_wcstod @1081 +;_wcstok @77 +;_wcstol @1082 +;_wcstombs @75 +;_wcstoul @1083 +;_wprintf @1134 +;_wscanf @1133 +;_wsprintfW @56 +;_wvsprintfW @57 From 07892f4f36c8e93081f6a4198c8c31b8ced35a5b Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Thu, 4 Mar 2004 00:07:03 +0000 Subject: [PATCH 0313/1463] - Don't zero memory allocated by ExAllocatePool. - Fix font enumeration algorithm to not depend on zeroed memory. (Harmut Birr) svn path=/trunk/; revision=8525 --- reactos/ntoskrnl/io/buildirp.c | 12 +++++- reactos/ntoskrnl/io/irp.c | 3 +- reactos/ntoskrnl/mm/aspace.c | 3 +- reactos/ntoskrnl/mm/npool.c | 4 +- reactos/ntoskrnl/mm/pagefile.c | 30 +++++++++++--- reactos/ntoskrnl/mm/ppool.c | 5 +-- reactos/ntoskrnl/mm/section.c | 12 +++++- reactos/ntoskrnl/mm/slab.c | 3 +- reactos/ntoskrnl/ob/object.c | 3 +- reactos/subsys/win32k/objects/text.c | 58 ++++++++++++++++++---------- 10 files changed, 95 insertions(+), 38 deletions(-) diff --git a/reactos/ntoskrnl/io/buildirp.c b/reactos/ntoskrnl/io/buildirp.c index 7aecbb897a7..41abe6ab5a9 100644 --- a/reactos/ntoskrnl/io/buildirp.c +++ b/reactos/ntoskrnl/io/buildirp.c @@ -1,4 +1,4 @@ -/* $Id: buildirp.c,v 1.38 2003/12/30 18:52:04 fireball Exp $ +/* $Id: buildirp.c,v 1.39 2004/03/04 00:07:00 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -259,6 +259,13 @@ IoBuildDeviceIoControlRequest(ULONG IoControlCode, RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, InputBuffer, InputBufferLength); + RtlZeroMemory(Irp->AssociatedIrp.SystemBuffer + InputBufferLength, + BufferLength - InputBufferLength); + } + else + { + RtlZeroMemory(Irp->AssociatedIrp.SystemBuffer, + BufferLength); } Irp->UserBuffer = OutputBuffer; break; @@ -273,12 +280,13 @@ IoBuildDeviceIoControlRequest(ULONG IoControlCode, ExAllocatePoolWithTag(NonPagedPool,OutputBufferLength, TAG_SYS_BUF); - if (Irp->AssociatedIrp.SystemBuffer == NULL) { IoFreeIrp(Irp); return(NULL); } + + RtlZeroMemory(Irp->AssociatedIrp.SystemBuffer, OutputBufferLength); Irp->UserBuffer = OutputBuffer; } diff --git a/reactos/ntoskrnl/io/irp.c b/reactos/ntoskrnl/io/irp.c index ddd1a2a7f90..d720f007cce 100644 --- a/reactos/ntoskrnl/io/irp.c +++ b/reactos/ntoskrnl/io/irp.c @@ -1,4 +1,4 @@ -/* $Id: irp.c,v 1.57 2003/12/31 14:16:18 hbirr Exp $ +/* $Id: irp.c,v 1.58 2004/03/04 00:07:00 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -200,6 +200,7 @@ IoAllocateIrp(CCHAR StackSize, return(NULL); } + RtlZeroMemory(Irp, IoSizeOfIrp(StackSize)); IoInitializeIrp(Irp, IoSizeOfIrp(StackSize), StackSize); diff --git a/reactos/ntoskrnl/mm/aspace.c b/reactos/ntoskrnl/mm/aspace.c index 0e599859a1f..c2df1d76790 100644 --- a/reactos/ntoskrnl/mm/aspace.c +++ b/reactos/ntoskrnl/mm/aspace.c @@ -1,4 +1,4 @@ -/* $Id: aspace.c,v 1.15 2003/10/12 17:05:48 hbirr Exp $ +/* $Id: aspace.c,v 1.16 2004/03/04 00:07:01 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -88,6 +88,7 @@ MmInitializeAddressSpace(PEPROCESS Process, AddressSpace->PageTableRefCountTable = ExAllocatePoolWithTag(NonPagedPool, 768 * sizeof(USHORT), TAG_PTRC); + RtlZeroMemory(AddressSpace->PageTableRefCountTable, 768 * sizeof(USHORT)); AddressSpace->PageTableRefCountTableSize = 768; } else diff --git a/reactos/ntoskrnl/mm/npool.c b/reactos/ntoskrnl/mm/npool.c index d50d805c39e..4e4d651e04e 100644 --- a/reactos/ntoskrnl/mm/npool.c +++ b/reactos/ntoskrnl/mm/npool.c @@ -1,4 +1,4 @@ -/* $Id: npool.c,v 1.81 2004/02/07 16:37:23 hbirr Exp $ +/* $Id: npool.c,v 1.82 2004/03/04 00:07:01 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1633,7 +1633,7 @@ ExAllocateNonPagedPoolWithTag(ULONG Type, ULONG Size, ULONG Tag, PVOID Caller) #endif KeReleaseSpinLock(&MmNpoolLock, oldIrql); block = block_to_address(best); - memset(block,0,Size); +/* RtlZeroMemory(block, Size);*/ return(block); #endif /* WHOLE_PAGE_ALLOCATIONS */ } diff --git a/reactos/ntoskrnl/mm/pagefile.c b/reactos/ntoskrnl/mm/pagefile.c index 3200ec79631..e205f72c9cb 100644 --- a/reactos/ntoskrnl/mm/pagefile.c +++ b/reactos/ntoskrnl/mm/pagefile.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: pagefile.c,v 1.41 2003/12/30 18:52:05 fireball Exp $ +/* $Id: pagefile.c,v 1.42 2004/03/04 00:07:01 navaraf Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/pagefile.c @@ -453,6 +453,22 @@ MmAllocSwapPage(VOID) return(0); } +STATIC PRETRIEVEL_DESCRIPTOR_LIST FASTCALL +MmAllocRetrievelDescriptorList(ULONG Pairs) +{ + ULONG Size; + PRETRIEVEL_DESCRIPTOR_LIST RetDescList; + + Size = sizeof(RETRIEVEL_DESCRIPTOR_LIST) + Pairs * sizeof(MAPPING_PAIR); + RetDescList = ExAllocatePool(NonPagedPool, Size); + if (RetDescList) + { + RtlZeroMemory(RetDescList, Size); + } + + return RetDescList; +} + NTSTATUS STDCALL MmDumpToPagingFile(ULONG BugCode, ULONG BugCodeParameter1, @@ -716,7 +732,6 @@ NtCreatePagingFile(IN PUNICODE_STRING FileName, PPAGINGFILE PagingFile; KIRQL oldIrql; ULONG AllocMapSize; - ULONG Size; FILE_FS_SIZE_INFORMATION FsSizeInformation; PRETRIEVEL_DESCRIPTOR_LIST RetDescList; PRETRIEVEL_DESCRIPTOR_LIST CurrentRetDescList; @@ -726,6 +741,7 @@ NtCreatePagingFile(IN PUNICODE_STRING FileName, ULONG ExtentCount; ULONG MaxVcn; ULONG Count; + ULONG Size; DPRINT("NtCreatePagingFile(FileName %wZ, InitialSize %I64d)\n", FileName, InitialSize->QuadPart); @@ -801,8 +817,7 @@ NtCreatePagingFile(IN PUNICODE_STRING FileName, return(Status); } - Size = sizeof(RETRIEVEL_DESCRIPTOR_LIST) + PAIRS_PER_RUN * sizeof(MAPPING_PAIR); - CurrentRetDescList = RetDescList = ExAllocatePool(NonPagedPool, Size); + CurrentRetDescList = RetDescList = MmAllocRetrievelDescriptorList(PAIRS_PER_RUN); if (CurrentRetDescList == NULL) { @@ -845,7 +860,7 @@ NtCreatePagingFile(IN PUNICODE_STRING FileName, ExtentCount += CurrentRetDescList->RetrievalPointers.NumberOfPairs; if ((ULONG)CurrentRetDescList->RetrievalPointers.Pair[CurrentRetDescList->RetrievalPointers.NumberOfPairs-1].Vcn < MaxVcn) { - CurrentRetDescList->Next = ExAllocatePool(NonPagedPool, Size); + CurrentRetDescList->Next = MmAllocRetrievelDescriptorList(PAIRS_PER_RUN); if (CurrentRetDescList->Next == NULL) { while (RetDescList) @@ -881,6 +896,8 @@ NtCreatePagingFile(IN PUNICODE_STRING FileName, return(STATUS_NO_MEMORY); } + RtlZeroMemory(PagingFile, sizeof(*PagingFile)); + PagingFile->FileObject = FileObject; PagingFile->MaximumSize.QuadPart = MaximumSize->QuadPart; PagingFile->CurrentSize.QuadPart = InitialSize->QuadPart; @@ -924,6 +941,9 @@ NtCreatePagingFile(IN PUNICODE_STRING FileName, return(STATUS_NO_MEMORY); } + RtlZeroMemory(PagingFile->AllocMap, AllocMapSize * sizeof(ULONG)); + RtlZeroMemory(PagingFile->RetrievalPointers, Size); + Count = 0; PagingFile->RetrievalPointers->NumberOfPairs = ExtentCount; PagingFile->RetrievalPointers->StartVcn = RetDescList->RetrievalPointers.StartVcn; diff --git a/reactos/ntoskrnl/mm/ppool.c b/reactos/ntoskrnl/mm/ppool.c index 45ce5492777..137bec2669b 100644 --- a/reactos/ntoskrnl/mm/ppool.c +++ b/reactos/ntoskrnl/mm/ppool.c @@ -1,4 +1,4 @@ -/* $Id: ppool.c,v 1.25 2004/02/15 19:03:29 hbirr Exp $ +/* $Id: ppool.c,v 1.26 2004/03/04 00:07:02 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -406,8 +406,7 @@ ExAllocatePagedPoolWithTag (IN POOL_TYPE PoolType, ExReleaseFastMutex(&MmPagedPoolLock); BlockAddress = block_to_address ( NewBlock ); - - memset(BlockAddress, 0, NumberOfBytes); +/* RtlZeroMemory(BlockAddress, NumberOfBytes);*/ #if MM_PPOOL_REDZONE_BYTES NewBlock->UserSize = NumberOfBytes; diff --git a/reactos/ntoskrnl/mm/section.c b/reactos/ntoskrnl/mm/section.c index 98cb0f298e6..d08dbff15ee 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.144 2004/01/31 00:16:55 hbirr Exp $ +/* $Id: section.c,v 1.145 2004/03/04 00:07:02 navaraf Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/section.c @@ -2328,9 +2328,13 @@ MmCreatePageFileSection(PHANDLE SectionHandle, Segment->FileOffset = 0; Segment->Protection = SectionPageProtection; Segment->Attributes = AllocationAttributes; - Segment->Length = MaximumSize.u.LowPart; + Segment->RawLength = MaximumSize.u.LowPart; + Segment->Length = PAGE_ROUND_UP(MaximumSize.u.LowPart); Segment->Flags = MM_PAGEFILE_SEGMENT; Segment->WriteCopy = FALSE; + RtlZeroMemory(&Segment->PageDirectory, sizeof(SECTION_PAGE_DIRECTORY)); + Segment->VirtualAddress = 0; + Segment->Characteristics = 0; ObDereferenceObject(Section); return(STATUS_SUCCESS); } @@ -2564,6 +2568,7 @@ MmCreateDataFileSection(PHANDLE SectionHandle, Segment->Length = PAGE_ROUND_UP(Segment->RawLength); } Segment->VirtualAddress = NULL; + RtlZeroMemory(&Segment->PageDirectory, sizeof(SECTION_PAGE_DIRECTORY)); } else { @@ -2888,7 +2893,9 @@ MmCreateImageSection(PHANDLE SectionHandle, SectionSegments[0].ReferenceCount = 1; SectionSegments[0].VirtualAddress = 0; SectionSegments[0].WriteCopy = TRUE; + SectionSegments[0].Attributes = 0; ExInitializeFastMutex(&SectionSegments[0].Lock); + RtlZeroMemory(&SectionSegments[0].PageDirectory, sizeof(SECTION_PAGE_DIRECTORY)); for (i = 1; i < NrSegments; i++) { SectionSegments[i].FileOffset = ImageSections[i-1].PointerToRawData; @@ -2950,6 +2957,7 @@ MmCreateImageSection(PHANDLE SectionHandle, SectionSegments[i].ReferenceCount = 1; SectionSegments[i].VirtualAddress = (PVOID)ImageSections[i-1].VirtualAddress; ExInitializeFastMutex(&SectionSegments[i].Lock); + RtlZeroMemory(&SectionSegments[i].PageDirectory, sizeof(SECTION_PAGE_DIRECTORY)); } if (0 != InterlockedCompareExchange((PLONG)&FileObject->SectionObjectPointer->ImageSectionObject, (LONG)ImageSectionObject, 0)) diff --git a/reactos/ntoskrnl/mm/slab.c b/reactos/ntoskrnl/mm/slab.c index 19f83f7d4ff..e34233df690 100644 --- a/reactos/ntoskrnl/mm/slab.c +++ b/reactos/ntoskrnl/mm/slab.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: slab.c,v 1.10 2003/12/30 18:52:05 fireball Exp $ +/* $Id: slab.c,v 1.11 2004/03/04 00:07:02 navaraf Exp $ * * COPYRIGHT: See COPYING in the top directory * PROJECT: ReactOS kernel @@ -93,6 +93,7 @@ ExCreateSlabCache(PUNICODE_STRING Name, ULONG Size, ULONG Align, Slab->ObjectSize = ObjectSize + AlignSize; Slab->ObjectsPerPage = (PAGE_SIZE - sizeof(SLAB_CACHE_PAGE)) / Slab->ObjectSize; + Slab->FirstFreePage = NULL; InitializeListHead(&Slab->PageListHead); KeInitializeSpinLock(&Slab->SlabLock); diff --git a/reactos/ntoskrnl/ob/object.c b/reactos/ntoskrnl/ob/object.c index 6e8b3990eb0..efc49b0751d 100644 --- a/reactos/ntoskrnl/ob/object.c +++ b/reactos/ntoskrnl/ob/object.c @@ -1,4 +1,4 @@ -/* $Id: object.c,v 1.74 2004/01/31 16:52:47 ekohl Exp $ +/* $Id: object.c,v 1.75 2004/03/04 00:07:02 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -377,6 +377,7 @@ ObCreateObject (IN KPROCESSOR_MODE ObjectAttributesAccessMode OPTIONAL, Type->Tag); if (Header == NULL) return STATUS_INSUFFICIENT_RESOURCES; + RtlZeroMemory(Header, OBJECT_ALLOC_SIZE(ObjectSize)); /* Initialize the object header */ Header->HandleCount = 0; diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index d8c44b7e09b..cf8bcff99de 100644 --- a/reactos/subsys/win32k/objects/text.c +++ b/reactos/subsys/win32k/objects/text.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: text.c,v 1.78 2004/02/24 13:27:03 weiden Exp $ */ +/* $Id: text.c,v 1.79 2004/03/04 00:07:03 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -253,6 +253,7 @@ BOOL FASTCALL InitFontSupport(VOID) PFILE_DIRECTORY_INFORMATION iFileData; PVOID pBuff; BOOLEAN bRestartScan = TRUE; + BOOLEAN Result = FALSE; InitializeListHead(&FontListHead); ExInitializeFastMutex(&FontListLock); @@ -281,13 +282,22 @@ BOOL FASTCALL InitFontSupport(VOID) { while(1) { - iFileData = NULL; + if (bRestartScan) + { pBuff = ExAllocatePool(NonPagedPool,0x4000); + if (pBuff == NULL) + { + break; + } RtlInitUnicodeString(&cchFilename,0); cchFilename.MaximumLength = 0x1000; cchFilename.Buffer = ExAllocatePoolWithTag(PagedPool,cchFilename.MaximumLength, TAG_STRING); - - cchFilename.Length = 0; + if (cchFilename.Buffer == NULL) + { + ExFreePool(pBuff); + break; + } + } Status = NtQueryDirectoryFile( hDirectory, NULL, @@ -297,33 +307,41 @@ BOOL FASTCALL InitFontSupport(VOID) pBuff, 0x4000, FileDirectoryInformation, - TRUE, + FALSE, &cchSearchPattern, bRestartScan ); - iFileData = (PFILE_DIRECTORY_INFORMATION)pBuff; - - RtlAppendUnicodeToString(&cchFilename, cchDir.Buffer); - RtlAppendUnicodeToString(&cchFilename, iFileData->FileName); - RtlAppendUnicodeToString(&cchFilename, L"\0"); - if( !NT_SUCCESS(Status) || Status == STATUS_NO_MORE_FILES ) - break; - - IntGdiAddFontResource(&cchFilename, 0); + { ExFreePool(pBuff); ExFreePool(cchFilename.Buffer); + break; + } bRestartScan = FALSE; + iFileData = (PFILE_DIRECTORY_INFORMATION)pBuff; + while(1) + { + UNICODE_STRING tmpString; + tmpString.Buffer = iFileData->FileName; + tmpString.Length = tmpString.MaximumLength = iFileData->FileNameLength; + RtlCopyUnicodeString(&cchFilename, &cchDir); + RtlAppendUnicodeStringToString(&cchFilename, &tmpString); + cchFilename.Buffer[cchFilename.Length / sizeof(WCHAR)] = 0; + if (0 != IntGdiAddFontResource(&cchFilename, 0)) + { + Result = TRUE; + } + if (iFileData->NextEntryOffset == 0) + { + break; + } + iFileData = (PVOID)iFileData + iFileData->NextEntryOffset; + } } - ExFreePool(cchFilename.Buffer); - ExFreePool(pBuff); - ZwClose(hDirectory); - - return TRUE; } } ZwClose(hDirectory); - return FALSE; + return Result; } static NTSTATUS STDCALL From 3c737e0e68d68c2bebeb78939f00c63dfa403eee Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes <hardon@online.no> Date: Thu, 4 Mar 2004 01:29:24 +0000 Subject: [PATCH 0314/1463] disable apc's for work items svn path=/trunk/; revision=8526 --- reactos/drivers/fs/vfat/misc.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/reactos/drivers/fs/vfat/misc.c b/reactos/drivers/fs/vfat/misc.c index c7489da54e0..22261325a0e 100644 --- a/reactos/drivers/fs/vfat/misc.c +++ b/reactos/drivers/fs/vfat/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.11 2003/10/11 17:51:56 hbirr Exp $ +/* $Id: misc.c,v 1.12 2004/03/04 01:29:24 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -135,10 +135,12 @@ NTSTATUS STDCALL VfatBuildRequest ( DPRINT1("Vfat is entered at irql = %d\n", KeGetCurrentIrql()); } Status = VfatDispatchRequest (IrpContext); + if (KeGetCurrentIrql() <= PASSIVE_LEVEL) { FsRtlExitFileSystem(); } + } return Status; } @@ -191,7 +193,9 @@ VOID STDCALL VfatDoRequest (PVOID IrpContext) { InterlockedDecrement(&QueueCount); DPRINT ("VfatDoRequest (IrpContext %x), MajorFunction %x, %d\n", IrpContext, ((PVFAT_IRP_CONTEXT)IrpContext)->MajorFunction, QueueCount); + FsRtlEnterFileSystem(); VfatDispatchRequest((PVFAT_IRP_CONTEXT)IrpContext); + FsRtlExitFileSystem(); } From cdd8158e28708d1b11e5bcba907bd1571b9eb3b5 Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes <hardon@online.no> Date: Thu, 4 Mar 2004 01:30:00 +0000 Subject: [PATCH 0315/1463] cleanup svn path=/trunk/; revision=8527 --- reactos/subsys/win32k/ntuser/timer.c | 228 ++++++--------------------- 1 file changed, 44 insertions(+), 184 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/timer.c b/reactos/subsys/win32k/ntuser/timer.c index eaf61232b88..55b5138067b 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.24 2004/02/24 13:27:03 weiden Exp $ +/* $Id: timer.c,v 1.25 2004/03/04 01:30:00 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -48,15 +48,14 @@ /* GLOBALS *******************************************************************/ -//windows 2000 has room for 32768 handle-less timers -#define NUM_HANDLE_LESS_TIMERS 1024 +//windows 2000 has room for 32768 window-less timers +#define NUM_WINDOW_LESS_TIMERS 1024 static FAST_MUTEX Mutex; static LIST_ENTRY TimerListHead; -static LIST_ENTRY SysTimerListHead; static KTIMER Timer; -static RTL_BITMAP HandleLessTimersBitMap; -static PVOID HandleLessTimersBitMapBuffer; +static RTL_BITMAP WindowLessTimersBitMap; +static PVOID WindowLessTimersBitMapBuffer; static ULONG HintIndex = 0; static HANDLE MsgTimerThreadHandle; static CLIENT_ID MsgTimerThreadId; @@ -74,21 +73,19 @@ static CLIENT_ID MsgTimerThreadId; //return true if the new timer became the first entry //must hold mutex while calling this BOOL FASTCALL -IntInsertTimerAscendingOrder(PMSG_TIMER_ENTRY NewTimer, BOOL SysTimer) +IntInsertTimerAscendingOrder(PMSG_TIMER_ENTRY NewTimer) { - PLIST_ENTRY ListHead; - - ListHead = SysTimer ? &SysTimerListHead : &TimerListHead; - InsertAscendingList(ListHead, + InsertAscendingList(&TimerListHead, MSG_TIMER_ENTRY, ListEntry, NewTimer, Timeout.QuadPart); - return IsFirstEntry(ListHead, &NewTimer->ListEntry); + return IsFirstEntry(&TimerListHead, &NewTimer->ListEntry); } + //must hold mutex while calling this PMSG_TIMER_ENTRY FASTCALL IntRemoveTimer(HWND hWnd, UINT_PTR IDEvent, HANDLE ThreadID, BOOL SysTimer) @@ -96,40 +93,20 @@ IntRemoveTimer(HWND hWnd, UINT_PTR IDEvent, HANDLE ThreadID, BOOL SysTimer) PMSG_TIMER_ENTRY MsgTimer; PLIST_ENTRY EnumEntry; - if(!SysTimer) + //remove timer if already in the queue + EnumEntry = TimerListHead.Flink; + while (EnumEntry != &TimerListHead) { - //remove timer if already in the queue - EnumEntry = TimerListHead.Flink; - while (EnumEntry != &TimerListHead) - { - MsgTimer = CONTAINING_RECORD(EnumEntry, MSG_TIMER_ENTRY, ListEntry); - EnumEntry = EnumEntry->Flink; + MsgTimer = CONTAINING_RECORD(EnumEntry, MSG_TIMER_ENTRY, ListEntry); + EnumEntry = EnumEntry->Flink; - if (MsgTimer->Msg.hwnd == hWnd && - MsgTimer->Msg.wParam == (WPARAM)IDEvent && - MsgTimer->ThreadID == ThreadID) - { - RemoveEntryList(&MsgTimer->ListEntry); - return MsgTimer; - } - } - } - else - { - //remove timer if already in the queue - EnumEntry = SysTimerListHead.Flink; - while (EnumEntry != &SysTimerListHead) + if (MsgTimer->Msg.hwnd == hWnd && + MsgTimer->Msg.wParam == (WPARAM)IDEvent && + MsgTimer->ThreadID == ThreadID && + (MsgTimer->Msg.message == WM_SYSTIMER) == SysTimer) { - MsgTimer = CONTAINING_RECORD(EnumEntry, MSG_TIMER_ENTRY, ListEntry); - EnumEntry = EnumEntry->Flink; - - if (MsgTimer->Msg.hwnd == hWnd && - MsgTimer->Msg.wParam == (WPARAM)IDEvent && - MsgTimer->ThreadID == ThreadID) - { - RemoveEntryList(&MsgTimer->ListEntry); - return MsgTimer; - } + RemoveEntryList(&MsgTimer->ListEntry); + return MsgTimer; } } @@ -138,7 +115,7 @@ IntRemoveTimer(HWND hWnd, UINT_PTR IDEvent, HANDLE ThreadID, BOOL SysTimer) /* - * NOTE: It doesn't kill timers. It just removes them from the list. + * NOTE: It doesn't kill the timer. It just removes them from the list. */ VOID FASTCALL RemoveTimersThread(HANDLE ThreadID) @@ -148,19 +125,6 @@ RemoveTimersThread(HANDLE ThreadID) IntLockTimerList; - EnumEntry = SysTimerListHead.Flink; - while (EnumEntry != &SysTimerListHead) - { - MsgTimer = CONTAINING_RECORD(EnumEntry, MSG_TIMER_ENTRY, ListEntry); - EnumEntry = EnumEntry->Flink; - - if (MsgTimer->ThreadID == ThreadID) - { - RemoveEntryList(&MsgTimer->ListEntry); - ExFreePool(MsgTimer); - } - } - EnumEntry = TimerListHead.Flink; while (EnumEntry != &TimerListHead) { @@ -171,7 +135,7 @@ RemoveTimersThread(HANDLE ThreadID) { if (MsgTimer->Msg.hwnd == NULL) { - RtlClearBits(&HandleLessTimersBitMap, ((UINT_PTR)MsgTimer->Msg.wParam) - 1, 1); + RtlClearBits(&WindowLessTimersBitMap, ((UINT_PTR)MsgTimer->Msg.wParam) - 1, 1); } RemoveEntryList(&MsgTimer->ListEntry); @@ -182,13 +146,13 @@ RemoveTimersThread(HANDLE ThreadID) IntUnLockTimerList; } + UINT_PTR FASTCALL IntSetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc, BOOL SystemTimer) { ULONG Index; - PMSG_TIMER_ENTRY MsgTimer2, MsgTimer = NULL; + PMSG_TIMER_ENTRY MsgTimer = NULL; PMSG_TIMER_ENTRY NewTimer; - PLIST_ENTRY EnumEntry; LARGE_INTEGER CurrentTime; PWINDOW_OBJECT WindowObject; HANDLE ThreadID; @@ -200,8 +164,8 @@ IntSetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc, B if((hWnd == NULL) && !SystemTimer) { - /* find a free, handle-less timer id */ - Index = RtlFindClearBitsAndSet(&HandleLessTimersBitMap, 1, HintIndex); + /* find a free, window-less timer id */ + Index = RtlFindClearBitsAndSet(&WindowLessTimersBitMap, 1, HintIndex); if(Index == (ULONG) -1) { @@ -285,47 +249,10 @@ IntSetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc, B Ret = nIDEvent; // FIXME - return lpTimerProc if it's not a system timer - if(SystemTimer) + if(IntInsertTimerAscendingOrder(NewTimer)) { - if(IntInsertTimerAscendingOrder(NewTimer, TRUE)) - { - EnumEntry = TimerListHead.Flink; - if(EnumEntry != &TimerListHead) - { - MsgTimer2 = CONTAINING_RECORD(EnumEntry, MSG_TIMER_ENTRY, ListEntry); - if (NewTimer->Timeout.QuadPart < MsgTimer2->Timeout.QuadPart) - { - /* new timer is first in queue and expires first */ - KeSetTimer(&Timer, NewTimer->Timeout, NULL); - } - } - else - { - /* new timer is first in queue and expires first */ - KeSetTimer(&Timer, NewTimer->Timeout, NULL); - } - } - } - else - { - if(IntInsertTimerAscendingOrder(NewTimer, FALSE)) - { - EnumEntry = SysTimerListHead.Flink; - if(EnumEntry != &SysTimerListHead) - { - MsgTimer2 = CONTAINING_RECORD(EnumEntry, MSG_TIMER_ENTRY, ListEntry); - if (NewTimer->Timeout.QuadPart < MsgTimer2->Timeout.QuadPart) - { - /* new timer is first in queue and expires first */ - KeSetTimer(&Timer, NewTimer->Timeout, NULL); - } - } - else - { - /* new timer is first in queue and expires first */ - KeSetTimer(&Timer, NewTimer->Timeout, NULL); - } - } + /* new timer is first in queue and expires first */ + KeSetTimer(&Timer, NewTimer->Timeout, NULL); } IntUnLockTimerList; @@ -333,6 +260,7 @@ IntSetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc, B return Ret; } + BOOL FASTCALL IntKillTimer(HWND hWnd, UINT_PTR uIDEvent, BOOL SystemTimer) { @@ -341,10 +269,10 @@ IntKillTimer(HWND hWnd, UINT_PTR uIDEvent, BOOL SystemTimer) IntLockTimerList; - /* handle-less timer? */ + /* window-less timer? */ if((hWnd == NULL) && !SystemTimer) { - if(!RtlAreBitsSet(&HandleLessTimersBitMap, uIDEvent - 1, 1)) + if(!RtlAreBitsSet(&WindowLessTimersBitMap, uIDEvent - 1, 1)) { IntUnLockTimerList; /* bit was not set */ @@ -352,7 +280,7 @@ IntKillTimer(HWND hWnd, UINT_PTR uIDEvent, BOOL SystemTimer) return FALSE; } - RtlClearBits(&HandleLessTimersBitMap, uIDEvent - 1, 1); + RtlClearBits(&WindowLessTimersBitMap, uIDEvent - 1, 1); } else { @@ -397,7 +325,7 @@ TimerThreadMain(PVOID StartContext) NTSTATUS Status; LARGE_INTEGER CurrentTime; PLIST_ENTRY EnumEntry; - PMSG_TIMER_ENTRY MsgTimer, MsgTimer2; + PMSG_TIMER_ENTRY MsgTimer; PETHREAD Thread; PETHREAD *ThreadsToDereference; ULONG ThreadsToDereferenceCount, ThreadsToDereferencePos, i; @@ -432,16 +360,6 @@ TimerThreadMain(PVOID StartContext) break; } - for (EnumEntry = SysTimerListHead.Flink; - EnumEntry != &SysTimerListHead; - EnumEntry = EnumEntry->Flink) - { - MsgTimer = CONTAINING_RECORD(EnumEntry, MSG_TIMER_ENTRY, ListEntry); - if (CurrentTime.QuadPart >= MsgTimer->Timeout.QuadPart) - ++ThreadsToDereferenceCount; - else - break; - } ThreadsToDereference = (PETHREAD *)ExAllocatePoolWithTag( NonPagedPool, ThreadsToDereferenceCount * sizeof(PETHREAD), TAG_TIMERTD); @@ -473,12 +391,13 @@ TimerThreadMain(PVOID StartContext) ++ThreadsToDereferencePos; //set up next periodic timeout + //FIXME: is this calculation really necesary (and correct)? -Gunnar do { MsgTimer->Timeout.QuadPart += (MsgTimer->Period * 10000); } while (MsgTimer->Timeout.QuadPart <= CurrentTime.QuadPart); - IntInsertTimerAscendingOrder(MsgTimer, FALSE); + IntInsertTimerAscendingOrder(MsgTimer); } else { @@ -487,75 +406,17 @@ TimerThreadMain(PVOID StartContext) } - EnumEntry = SysTimerListHead.Flink; - while (EnumEntry != &SysTimerListHead) - { - MsgTimer2 = CONTAINING_RECORD(EnumEntry, MSG_TIMER_ENTRY, ListEntry); - - if (CurrentTime.QuadPart >= MsgTimer2->Timeout.QuadPart) - { - EnumEntry = EnumEntry->Flink; - - RemoveEntryList(&MsgTimer2->ListEntry); - - /* - * FIXME: 1) Find a faster way of getting the thread message queue? (lookup by id is slow) - */ - - if (!NT_SUCCESS(PsLookupThreadByThreadId(MsgTimer2->ThreadID, &Thread))) - { - ExFreePool(MsgTimer2); - continue; - } - - MsqPostMessage(((PW32THREAD)Thread->Win32Thread)->MessageQueue, MsqCreateMessage(&MsgTimer2->Msg)); - - ThreadsToDereference[ThreadsToDereferencePos] = Thread; - ++ThreadsToDereferencePos; - - //set up next periodic timeout - do - { - MsgTimer2->Timeout.QuadPart += (MsgTimer2->Period * 10000); - } - while (MsgTimer2->Timeout.QuadPart <= CurrentTime.QuadPart); - IntInsertTimerAscendingOrder(MsgTimer2, TRUE); - } - else - { - break; - } - } //set up next timeout from first entry (if any) if (!IsListEmpty(&TimerListHead)) { MsgTimer = CONTAINING_RECORD( TimerListHead.Flink, MSG_TIMER_ENTRY, ListEntry); - if(!IsListEmpty(&SysTimerListHead)) - { - MsgTimer2 = CONTAINING_RECORD( SysTimerListHead.Flink, MSG_TIMER_ENTRY, ListEntry); - if(MsgTimer->Timeout.QuadPart <= MsgTimer2->Timeout.QuadPart) - KeSetTimer(&Timer, MsgTimer->Timeout, NULL); - else - KeSetTimer(&Timer, MsgTimer2->Timeout, NULL); - } - else - { - KeSetTimer(&Timer, MsgTimer->Timeout, NULL); - } + KeSetTimer(&Timer, MsgTimer->Timeout, NULL); } else { - if(!IsListEmpty(&SysTimerListHead)) - { - MsgTimer2 = CONTAINING_RECORD( SysTimerListHead.Flink, MSG_TIMER_ENTRY, ListEntry); - KeSetTimer(&Timer, MsgTimer2->Timeout, NULL); - } - else - { - /* Reinitialize the timer, this reset the state of the timer event on which we wait */ - KeInitializeTimer(&Timer); - } + /* cancel timer, this reset the state of the timer event on which we wait */ + KeCancelTimer(&Timer); } IntUnLockTimerList; @@ -573,20 +434,19 @@ InitTimerImpl(VOID) NTSTATUS Status; ULONG BitmapBytes; - BitmapBytes = ROUND_UP(NUM_HANDLE_LESS_TIMERS, sizeof(ULONG) * 8) / 8; + BitmapBytes = ROUND_UP(NUM_WINDOW_LESS_TIMERS, sizeof(ULONG) * 8) / 8; InitializeListHead(&TimerListHead); - InitializeListHead(&SysTimerListHead); KeInitializeTimer(&Timer); ExInitializeFastMutex(&Mutex); - HandleLessTimersBitMapBuffer = ExAllocatePoolWithTag(PagedPool, BitmapBytes, TAG_TIMERBMP); - RtlInitializeBitMap(&HandleLessTimersBitMap, - HandleLessTimersBitMapBuffer, + WindowLessTimersBitMapBuffer = ExAllocatePoolWithTag(PagedPool, BitmapBytes, TAG_TIMERBMP); + RtlInitializeBitMap(&WindowLessTimersBitMap, + WindowLessTimersBitMapBuffer, BitmapBytes * 8); //yes we need this, since ExAllocatePool isn't supposed to zero out allocated memory - RtlClearAllBits(&HandleLessTimersBitMap); + RtlClearAllBits(&WindowLessTimersBitMap); Status = PsCreateSystemThread(&MsgTimerThreadHandle, THREAD_ALL_ACCESS, From 856035ab098500a4aafe46bdac58eefa7249fb46 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III <royce3@ev1.net> Date: Thu, 4 Mar 2004 01:50:26 +0000 Subject: [PATCH 0316/1463] NtGdiPolygon simplification svn path=/trunk/; revision=8528 --- reactos/subsys/win32k/objects/fillshap.c | 58 ++++++++++-------------- 1 file changed, 23 insertions(+), 35 deletions(-) diff --git a/reactos/subsys/win32k/objects/fillshap.c b/reactos/subsys/win32k/objects/fillshap.c index 47d5f1bd262..09b52bfa761 100644 --- a/reactos/subsys/win32k/objects/fillshap.c +++ b/reactos/subsys/win32k/objects/fillshap.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: fillshap.c,v 1.43 2004/03/03 06:33:58 royce Exp $ */ +/* $Id: fillshap.c,v 1.44 2004/03/04 01:50:26 royce Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> @@ -830,7 +830,6 @@ extern BOOL FillPolygon(PDC dc, #endif -//This implementation is blatantly ripped off from NtGdiRectangle BOOL STDCALL NtGdiPolygon(HDC hDC, @@ -840,45 +839,34 @@ NtGdiPolygon(HDC hDC, DC *dc; LPPOINT Safept; NTSTATUS Status; - BOOL Ret; + BOOL Ret = FALSE; - dc = DC_LockDc(hDC); - if(!dc) + if ( Count < 2 ) { - SetLastWin32Error(ERROR_INVALID_HANDLE); - return FALSE; - } - - if(Count >= 2) - { - Safept = ExAllocatePoolWithTag(NonPagedPool, sizeof(POINT) * Count, TAG_SHAPE); - if(!Safept) - { - DC_UnlockDc(hDC); - SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; - } - - Status = MmCopyFromCaller(Safept, UnsafePoints, sizeof(POINT) * Count); - if(!NT_SUCCESS(Status)) - { - ExFreePool(Safept); - DC_UnlockDc(hDC); - SetLastNtError(Status); - return FALSE; - } - } - else - { - DC_UnlockDc(hDC); SetLastWin32Error(ERROR_INVALID_PARAMETER); return FALSE; } - Ret = IntGdiPolygon(dc, Safept, Count); - - ExFreePool(Safept); - DC_UnlockDc(hDC); + dc = DC_LockDc(hDC); + if(!dc) + SetLastWin32Error(ERROR_INVALID_HANDLE); + else + { + Safept = ExAllocatePoolWithTag(NonPagedPool, sizeof(POINT) * Count, TAG_SHAPE); + if(!Safept) + SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); + else + { + Status = MmCopyFromCaller(Safept, UnsafePoints, sizeof(POINT) * Count); + if(!NT_SUCCESS(Status)) + SetLastNtError(Status); + else + Ret = IntGdiPolygon(dc, Safept, Count); + + ExFreePool(Safept); + } + DC_UnlockDc(hDC); + } return Ret; } From b6c0920b600499205fa94d6c9020239274e5dc5d Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Thu, 4 Mar 2004 18:24:29 +0000 Subject: [PATCH 0317/1463] Get a simple WinCE x86 MessageBox program to load. svn path=/trunk/; revision=8529 --- reactos/lib/coredll/coredll.def | 6 +++--- reactos/lib/coredll/coredll.edf | 12 ++++++------ reactos/lib/coredll/coredll_main.c | 10 ++++++++++ 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/reactos/lib/coredll/coredll.def b/reactos/lib/coredll/coredll.def index 72554d4a696..0cc8779f7c4 100644 --- a/reactos/lib/coredll/coredll.def +++ b/reactos/lib/coredll/coredll.def @@ -49,7 +49,7 @@ EXPORTS ;?unexpected@std@@YAXXZ @1557 ;?what@exception@std@@UBEPBDXZ @1575 ;_AAFS_CloseAllFileHandles @655 -_AFS_CreateDirectoryW @644 +;_AFS_CreateDirectoryW @644 ;_AFS_CreateFileW @648 ;_AFS_DeleteFileW @649 ;_AFS_FindFirstChangeNotificationW @1685 @@ -739,7 +739,7 @@ _LocalFree @36 ;_MapWindowPoints @284 ;_MaskBlt @904 ;_MessageBeep @857 -;_MessageBoxW @858 +_MessageBoxW @858 ;_MonitorFromPoint @1522 ;_MonitorFromRect @1523 ;_MonitorFromWindow @1524 @@ -1117,7 +1117,7 @@ __XcptFilter @1645 ;___RTCastToVoid @1559 ;___RTDynamicCast @1561 ;___RTtypeid @1560 -;___abnormal_termination @86 +___abnormal_termination @86 ;___strgtold12 @1089 ;__alldiv @2001 ;__allmul @2002 diff --git a/reactos/lib/coredll/coredll.edf b/reactos/lib/coredll/coredll.edf index d97ee8f8fba..c896c4727ce 100644 --- a/reactos/lib/coredll/coredll.edf +++ b/reactos/lib/coredll/coredll.edf @@ -49,7 +49,7 @@ EXPORTS ;?unexpected@std@@YAXXZ @1557 ;?what@exception@std@@UBEPBDXZ @1575 ;_AAFS_CloseAllFileHandles @655 -_AFS_CreateDirectoryW =_AFS_CreateDirectoryW @644 +;_AFS_CreateDirectoryW =_AFS_CreateDirectoryW @644 ;_AFS_CreateFileW @648 ;_AFS_DeleteFileW @649 ;_AFS_FindFirstChangeNotificationW @1685 @@ -722,7 +722,7 @@ _AFS_CreateDirectoryW =_AFS_CreateDirectoryW @644 ;_LocalAlloc @33 ;_LocalAllocInProcess @41 ;_LocalFileTimeToFileTime @22 -;_LocalFree @36 +_LocalFree=kernel32.LocalFree @36 ;_LocalFreeInProcess @42 ;_LocalReAlloc @34 ;_LocalSize @35 @@ -739,7 +739,7 @@ _AFS_CreateDirectoryW =_AFS_CreateDirectoryW @644 ;_MapWindowPoints @284 ;_MaskBlt @904 ;_MessageBeep @857 -;_MessageBoxW @858 +_MessageBoxW=user32.MessageBoxW @858 ;_MonitorFromPoint @1522 ;_MonitorFromRect @1523 ;_MonitorFromWindow @1524 @@ -1112,12 +1112,12 @@ _AFS_CreateDirectoryW =_AFS_CreateDirectoryW @644 ;__EH_prolog @1620 ;__HUGE @1181 ;__InitStdioLib @1151 -;__XcptFilter @1645 +__XcptFilter=msvcrt._XcptFilter @1645 ;___CxxFrameHandler @1550 ;___RTCastToVoid @1559 ;___RTDynamicCast @1561 ;___RTtypeid @1560 -;___abnormal_termination @86 +___abnormal_termination=msvcrt._abnormal_termination @86 ;___strgtold12 @1089 ;__alldiv @2001 ;__allmul @2002 @@ -1138,7 +1138,7 @@ _AFS_CreateDirectoryW =_AFS_CreateDirectoryW @644 ;__controlfp @1002 ;__copysign @1003 ;__ecvt @1008 -;__except_handler3 @84 +__except_handler3=msvcrt._except_handler3 @84 ;__fcloseall @1119 ;__fcvt @1011 ;__fileno @1124 diff --git a/reactos/lib/coredll/coredll_main.c b/reactos/lib/coredll/coredll_main.c index 17880a8374e..36170490ae9 100644 --- a/reactos/lib/coredll/coredll_main.c +++ b/reactos/lib/coredll/coredll_main.c @@ -16,6 +16,16 @@ * 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: + * ATM this is just a dummy forwarding dll for the WinCE API to Win32 API + * When you exit a simple WinCE app on Windows or on ReactOS it causes + * a program error or unhandled exception probl'y because we dont handle + * threading and process attaching/detaching like we should here. + * + * There will be some parts of the WinCE API that cant just be forwarded to + * the Win32 API as paramater names or types may differ. In that case you will + * need to copy the Win32 implementation and make the needed changes. */ #include "windows.h" From 1849adaa6b8cdf0b2ae8661b0d61743f2f2af32f Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Thu, 4 Mar 2004 18:45:16 +0000 Subject: [PATCH 0318/1463] CVS maintaince svn path=/trunk/; revision=8530 --- reactos/drivers/storage/floppy/.cvsignore | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 reactos/drivers/storage/floppy/.cvsignore diff --git a/reactos/drivers/storage/floppy/.cvsignore b/reactos/drivers/storage/floppy/.cvsignore new file mode 100644 index 00000000000..85b76b3c678 --- /dev/null +++ b/reactos/drivers/storage/floppy/.cvsignore @@ -0,0 +1,8 @@ +base.tmp +junk.tmp +temp.exp +*.coff +*.o +*.sys +*.sym +*.map From eab00ba2a1926555f6703d3dbee65e24236fdd60 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Thu, 4 Mar 2004 18:49:58 +0000 Subject: [PATCH 0319/1463] - Changed Video Mode setting routines to directly modify VGA registers instead on relying on Int 0x10 services. - Removed unused code. svn path=/trunk/; revision=8531 --- reactos/drivers/video/miniport/vga/initvga.c | 206 +++++++++--------- reactos/drivers/video/miniport/vga/makefile | 5 +- reactos/drivers/video/miniport/vga/vgavideo.c | 94 -------- reactos/drivers/video/miniport/vga/vgavideo.h | 54 ++--- 4 files changed, 122 insertions(+), 237 deletions(-) delete mode 100644 reactos/drivers/video/miniport/vga/vgavideo.c diff --git a/reactos/drivers/video/miniport/vga/initvga.c b/reactos/drivers/video/miniport/vga/initvga.c index 7de39809f5b..32ee1c338ca 100644 --- a/reactos/drivers/video/miniport/vga/initvga.c +++ b/reactos/drivers/video/miniport/vga/initvga.c @@ -1,129 +1,119 @@ #include <ntddk.h> -#include <rosrtl/string.h> #include "vgavideo.h" #define NDEBUG #include <debug.h> -void outxay(PUSHORT ad, UCHAR x, UCHAR y) +static VGA_REGISTERS Mode12Regs = { - USHORT xy = (x << 8) + y; - - VideoPortWritePortUshort(ad, xy); -} - -void setMode(VideoMode mode) -{ - unsigned char x; - - VideoPortWritePortUchar((PUCHAR)MISC, mode.Misc); - VideoPortWritePortUchar((PUCHAR)STATUS, 0); - VideoPortWritePortUchar((PUCHAR)FEATURE, mode.Feature); - - for(x=0; x<5; x++) - { - outxay((PUSHORT)SEQ, mode.Seq[x], x); - } - - VideoPortWritePortUshort((PUSHORT)CRTC, 0x11); - VideoPortWritePortUshort((PUSHORT)CRTC, (mode.Crtc[0x11] & 0x7f)); - - for(x=0; x<25; x++) - { - outxay((PUSHORT)CRTC, mode.Crtc[x], x); - } - - for(x=0; x<9; x++) - { - outxay((PUSHORT)GRAPHICS, mode.Gfx[x], x); - } - - x=VideoPortReadPortUchar((PUCHAR)FEATURE); - - for(x=0; x<21; x++) - { - VideoPortWritePortUchar((PUCHAR)ATTRIB, x); - VideoPortWritePortUchar((PUCHAR)ATTRIB, mode.Attrib[x]); - } - - x=VideoPortReadPortUchar((PUCHAR)STATUS); - - VideoPortWritePortUchar((PUCHAR)ATTRIB, 0x20); -} - -VideoMode Mode12 = { - 0xa000, 0xe3, 0x00, - - {0x03, 0x01, 0x0f, 0x00, 0x06 }, - - {0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0x0b, 0x3e, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x59, 0xea, 0x8c, 0xdf, 0x28, 0x00, 0xe7, 0x04, 0xe3, - 0xff}, - - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff}, - - {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, - 0x0c, 0x0d, 0x0e, 0x0f, 0x81, 0x00, 0x0f, 0x00, 0x00} + /* CRT Controller Registers */ + {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x59, 0xEA, 0x8C, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xE3}, + /* Attribute Controller Registers */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, + 0x0C, 0x0D, 0x0E, 0x0F, 0x81, 0x00, 0x0F, 0x00, 0x00}, + /* Graphics Controller Registers */ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0x0F, 0xFF}, + /* Sequencer Registers */ + {0x03, 0x01, 0x0F, 0x00, 0x06}, + /* Misc Output Register */ + 0xE3 }; -void InitVGAMode() +VGA_REGISTERS TextModeRegs; + +STATIC VOID FASTCALL +vgaSaveRegisters(PVGA_REGISTERS Registers) { - int i; - VIDEO_X86_BIOS_ARGUMENTS vxba; - VP_STATUS vps; - - // FIXME: Use Vidport to map the memory properly - vidmem = (char *)(0xd0000000 + 0xa0000); - memset(&vxba, 0, sizeof(vxba)); - vxba.Eax = 0x0012; - vps = VideoPortInt10(NULL, &vxba); + int i; - // Get VGA registers into the correct state (mainly for setting up the palette registers correctly) - setMode(Mode12); + for (i = 0; i < sizeof(Registers->CRT); i++) + { + VideoPortWritePortUchar(CRTC, i); + Registers->CRT[i] = VideoPortReadPortUchar(CRTCDATA); + } - // Get the VGA into the mode we want to work with - WRITE_PORT_UCHAR((PUCHAR)GRA_I,0x08); // Set - WRITE_PORT_UCHAR((PUCHAR)GRA_D,0); // the MASK - WRITE_PORT_USHORT((PUSHORT)GRA_I,0x0205); // write mode = 2 (bits 0,1) read mode = 0 (bit 3) - i = READ_REGISTER_UCHAR(vidmem); // Update bit buffer - WRITE_REGISTER_UCHAR(vidmem, 0); // Write the pixel - WRITE_PORT_UCHAR((PUCHAR)GRA_I,0x08); - WRITE_PORT_UCHAR((PUCHAR)GRA_D,0xff); + for (i = 0; i < sizeof(Registers->Attribute); i++) + { + VideoPortReadPortUchar(STATUS); + VideoPortWritePortUchar(ATTRIB, i); + Registers->Attribute[i] = VideoPortReadPortUchar(ATTRIBREAD); + } - // Zero out video memory (clear a possibly trashed screen) - RtlZeroMemory(vidmem, 64000); + for (i = 0; i < sizeof(Registers->Graphics); i++) + { + VideoPortWritePortUchar(GRAPHICS, i); + Registers->Graphics[i] = VideoPortReadPortUchar(GRAPHICSDATA); + } - vgaPreCalc(); + for (i = 0; i < sizeof(Registers->Sequencer); i++) + { + VideoPortWritePortUchar(SEQ, i); + Registers->Sequencer[i] = VideoPortReadPortUchar(SEQDATA); + } + + Registers->Misc = VideoPortReadPortUchar(MISC); } -VOID VGAResetDevice(OUT PSTATUS_BLOCK StatusBlock) +STATIC VOID FASTCALL +vgaSetRegisters(PVGA_REGISTERS Registers) { - HANDLE Event; - OBJECT_ATTRIBUTES Attr; - UNICODE_STRING Name = ROS_STRING_INITIALIZER(L"\\TextConsoleRefreshEvent"); - NTSTATUS Status; - VIDEO_X86_BIOS_ARGUMENTS vxba; - VP_STATUS vps; - ULONG ThreadRelease = 1; - - CHECKPOINT; - Event = 0; + int i; - memset(&vxba, 0, sizeof(vxba)); - vxba.Eax = 0x0003; - vps = VideoPortInt10(NULL, &vxba); - memset(&vxba, 0, sizeof(vxba)); - vxba.Eax = 0x1112; - vps = VideoPortInt10(NULL, &vxba); - InitializeObjectAttributes( &Attr, &Name, 0, 0, 0 ); - Status = ZwOpenEvent( &Event, STANDARD_RIGHTS_ALL, &Attr ); - if( !NT_SUCCESS( Status ) ) - DbgPrint( "VGA: Failed to open refresh event\n" ); - else { - ZwSetEvent( Event, &ThreadRelease ); - ZwClose( Event ); - } + /* Update misc output register */ + VideoPortWritePortUchar(MISC, Registers->Misc); + + /* Synchronous reset on */ + VideoPortWritePortUchar(SEQ, 0x00); + VideoPortWritePortUchar(SEQDATA, 0x01); + + /* Write sequencer registers */ + for (i = 1; i < sizeof(Registers->Sequencer); i++) + { + VideoPortWritePortUchar(SEQ, i); + VideoPortWritePortUchar(SEQDATA, Registers->Sequencer[i]); + } + + /* Synchronous reset off */ + VideoPortWritePortUchar(SEQ, 0x00); + VideoPortWritePortUchar(SEQDATA, 0x03); + + /* Deprotect CRT registers 0-7 */ + VideoPortWritePortUchar(CRTC, 0x11); + VideoPortWritePortUchar(CRTCDATA, Registers->CRT[0x11] & 0x7f); + + /* Write CRT registers */ + for (i = 0; i < sizeof(Registers->CRT); i++) + { + VideoPortWritePortUchar(CRTC, i); + VideoPortWritePortUchar(CRTCDATA, Registers->CRT[i]); + } + + /* Write graphics controller registers */ + for (i = 0; i < sizeof(Registers->Graphics); i++) + { + VideoPortWritePortUchar(GRAPHICS, i); + VideoPortWritePortUchar(GRAPHICSDATA, Registers->Graphics[i]); + } + + /* Write attribute controller registers */ + for (i = 0; i < sizeof(Registers->Attribute); i++) + { + VideoPortReadPortUchar(STATUS); + VideoPortWritePortUchar(ATTRIB, i); + VideoPortWritePortUchar(ATTRIB, Registers->Attribute[i]); + } } +VOID +InitVGAMode() +{ + vgaSaveRegisters(&TextModeRegs); + vgaSetRegisters(&Mode12Regs); +} - +VOID +VGAResetDevice(OUT PSTATUS_BLOCK StatusBlock) +{ + vgaSetRegisters(&TextModeRegs); +} diff --git a/reactos/drivers/video/miniport/vga/makefile b/reactos/drivers/video/miniport/vga/makefile index 6d643647e95..ca8becdd80d 100644 --- a/reactos/drivers/video/miniport/vga/makefile +++ b/reactos/drivers/video/miniport/vga/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.1 2004/01/10 14:39:21 navaraf Exp $ +# $Id: makefile,v 1.2 2004/03/04 18:49:58 navaraf Exp $ PATH_TO_TOP = ../../../.. @@ -12,8 +12,7 @@ TARGET_CFLAGS = -Werror -Wall TARGET_OBJECTS = \ initvga.o \ - vgamp.o \ - vgavideo.o + vgamp.o include $(PATH_TO_TOP)/rules.mak diff --git a/reactos/drivers/video/miniport/vga/vgavideo.c b/reactos/drivers/video/miniport/vga/vgavideo.c deleted file mode 100644 index 7020e660426..00000000000 --- a/reactos/drivers/video/miniport/vga/vgavideo.c +++ /dev/null @@ -1,94 +0,0 @@ -#include "vgavideo.h" - -div_t div(int num, int denom) -{ - div_t r; - if (num > 0 && denom < 0) { - num = -num; - denom = -denom; - } - r.quot = num / denom; - r.rem = num % denom; - if (num < 0 && denom > 0) - { - if (r.rem > 0) - { - r.quot++; - r.rem -= denom; - } - } - return r; -} - -int mod(int num, int denom) -{ - div_t dvt = div(num, denom); - return dvt.rem; -} - -VOID vgaPreCalc() -{ - ULONG j; - - startmasks[1] = 127; - startmasks[2] = 63; - startmasks[3] = 31; - startmasks[4] = 15; - startmasks[5] = 7; - startmasks[6] = 3; - startmasks[7] = 1; - startmasks[8] = 255; - - endmasks[0] = 128; - endmasks[1] = 192; - endmasks[2] = 224; - endmasks[3] = 240; - endmasks[4] = 248; - endmasks[5] = 252; - endmasks[6] = 254; - endmasks[7] = 255; - endmasks[8] = 255; - - for(j=0; j<80; j++) - { - maskbit[j*8] = 128; - maskbit[j*8+1] = 64; - maskbit[j*8+2] = 32; - maskbit[j*8+3] = 16; - maskbit[j*8+4] = 8; - maskbit[j*8+5] = 4; - maskbit[j*8+6] = 2; - maskbit[j*8+7] = 1; - - bit8[j*8] = 7; - bit8[j*8+1] = 6; - bit8[j*8+2] = 5; - bit8[j*8+3] = 4; - bit8[j*8+4] = 3; - bit8[j*8+5] = 2; - bit8[j*8+6] = 1; - bit8[j*8+7] = 0; - } - for(j=0; j<480; j++) - { - y80[j] = j*80; - } - for(j=0; j<640; j++) - { - xconv[j] = j >> 3; - } -} - -void vgaSetWriteMode(char mode) -{ - VideoPortWritePortUchar((PUCHAR)GRA_I, 0x03); - VideoPortWritePortUchar((PUCHAR)GRA_D, mode); -} - -void vgaSetColor(int cindex, int red, int green, int blue) -{ - VideoPortWritePortUchar((PUCHAR)0x03c8, cindex); - VideoPortWritePortUchar((PUCHAR)0x03c9, red); - VideoPortWritePortUchar((PUCHAR)0x03c9, green); - VideoPortWritePortUchar((PUCHAR)0x03c9, blue); -} diff --git a/reactos/drivers/video/miniport/vga/vgavideo.h b/reactos/drivers/video/miniport/vga/vgavideo.h index 4fd64e3ed34..27fce45dedb 100644 --- a/reactos/drivers/video/miniport/vga/vgavideo.h +++ b/reactos/drivers/video/miniport/vga/vgavideo.h @@ -6,36 +6,26 @@ #define VGA_OR 16 #define VGA_XOR 24 -//This is in mingw standard headers -//typedef struct { int quot, rem; } div_t; +#define MISC (PUCHAR)0x3c2 +#define SEQ (PUCHAR)0x3c4 +#define SEQDATA (PUCHAR)0x3c5 +#define CRTC (PUCHAR)0x3d4 +#define CRTCDATA (PUCHAR)0x3d5 +#define GRAPHICS (PUCHAR)0x3ce +#define GRAPHICSDATA (PUCHAR)0x3cf +#define ATTRIB (PUCHAR)0x3c0 +#define ATTRIBREAD (PUCHAR)0x3c1 +#define STATUS (PUCHAR)0x3da +#define PELMASK (PUCHAR)0x3c6 +#define PELINDEX (PUCHAR)0x3c8 +#define PELDATA (PUCHAR)0x3c9 +#define FEATURE (PUCHAR)0x3da -int maskbit[640], y80[480], xconv[640], bit8[640], startmasks[8], endmasks[8]; - -char* vidmem; - -#define MISC 0x3c2 -#define SEQ 0x3c4 -#define CRTC 0x3d4 -#define GRAPHICS 0x3ce -#define FEATURE 0x3da -#define ATTRIB 0x3c0 -#define STATUS 0x3da - -#define SEQ_I 0x3C4 /* Sequencer Index */ -#define SEQ_D 0x3C5 /* Sequencer Data Register */ - -#define GRA_I 0x3CE /* Graphics Controller Index */ -#define GRA_D 0x3CF /* Graphics Controller Data Register */ - - -typedef struct _VideoMode { - unsigned short VidSeg; - unsigned char Misc; - unsigned char Feature; - unsigned short Seq[6]; - unsigned short Crtc[25]; - unsigned short Gfx[9]; - unsigned char Attrib[21]; -} VideoMode; - -VOID vgaPreCalc(); +typedef struct _VGA_REGISTERS +{ + UCHAR CRT[24]; + UCHAR Attribute[21]; + UCHAR Graphics[9]; + UCHAR Sequencer[5]; + UCHAR Misc; +} VGA_REGISTERS, *PVGA_REGISTERS; From 499908b04f0a4e3ec5ddcf041b35f57feacfeb26 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Thu, 4 Mar 2004 18:51:58 +0000 Subject: [PATCH 0320/1463] - Implemented VideoPortEnableInterrupt and VideoPortDisableInterrupt. svn path=/trunk/; revision=8532 --- reactos/drivers/video/videoprt/Makefile | 8 ++- reactos/drivers/video/videoprt/interrupt.c | 73 ++++++++++++++++++++++ reactos/drivers/video/videoprt/videoprt.c | 34 ++-------- 3 files changed, 83 insertions(+), 32 deletions(-) create mode 100644 reactos/drivers/video/videoprt/interrupt.c diff --git a/reactos/drivers/video/videoprt/Makefile b/reactos/drivers/video/videoprt/Makefile index 377e9880a8e..01f031c07a3 100644 --- a/reactos/drivers/video/videoprt/Makefile +++ b/reactos/drivers/video/videoprt/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.1 2004/01/19 15:56:53 navaraf Exp $ +# $Id: Makefile,v 1.2 2004/03/04 18:51:58 navaraf Exp $ PATH_TO_TOP = ../../.. @@ -8,7 +8,11 @@ TARGET_NAME = videoprt TARGET_CFLAGS += -Wall -Werror -D__USE_W32API -I$(PATH_TO_TOP)/ntoskrnl/include -TARGET_OBJECTS = videoprt.o int10.o services.o +TARGET_OBJECTS = \ + int10.o \ + interrupt.o \ + videoprt.o \ + services.o include $(PATH_TO_TOP)/rules.mak diff --git a/reactos/drivers/video/videoprt/interrupt.c b/reactos/drivers/video/videoprt/interrupt.c new file mode 100644 index 00000000000..248ae5e7fbf --- /dev/null +++ b/reactos/drivers/video/videoprt/interrupt.c @@ -0,0 +1,73 @@ +/* + * VideoPort driver + * + * Copyright (C) 2002, 2003, 2004 ReactOS Team + * + * 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; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Id: interrupt.c,v 1.1 2004/03/04 18:51:58 navaraf Exp $ + */ + +#include "videoprt.h" + +/* + * @implemented + */ + +VP_STATUS STDCALL +VideoPortEnableInterrupt(IN PVOID HwDeviceExtension) +{ + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + BOOLEAN Status; + + DPRINT("VideoPortEnableInterrupt\n"); + + DeviceExtension = CONTAINING_RECORD( + HwDeviceExtension, + VIDEO_PORT_DEVICE_EXTENSION, + MiniPortDeviceExtension); + + Status = HalEnableSystemInterrupt( + DeviceExtension->InterruptVector, + 0, + DeviceExtension->InterruptLevel); + + return Status ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL; +} + +/* + * @implemented + */ + +VP_STATUS STDCALL +VideoPortDisableInterrupt(IN PVOID HwDeviceExtension) +{ + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + BOOLEAN Status; + + DPRINT("VideoPortDisableInterrupt\n"); + + DeviceExtension = CONTAINING_RECORD( + HwDeviceExtension, + VIDEO_PORT_DEVICE_EXTENSION, + MiniPortDeviceExtension); + + Status = HalDisableSystemInterrupt( + DeviceExtension->InterruptVector, + 0); + + return Status ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL; +} diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index 56e9ee09dc7..3cd5e90506d 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.4 2004/02/25 05:38:33 jimtabor Exp $ + * $Id: videoprt.c,v 1.5 2004/03/04 18:51:58 navaraf Exp $ */ #include "videoprt.h" @@ -76,32 +76,6 @@ VideoPortDebugPrint(IN VIDEO_DEBUG_LEVEL DebugPrintLevel, } -/* - * @unimplemented - */ -VP_STATUS -STDCALL -VideoPortDisableInterrupt(IN PVOID HwDeviceExtension) -{ - DPRINT("VideoPortDisableInterrupt\n"); - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; -} - - -/* - * @unimplemented - */ -VP_STATUS -STDCALL -VideoPortEnableInterrupt(IN PVOID HwDeviceExtension) -{ - DPRINT("VideoPortEnableInterrupt\n"); - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; -} - - /* * @implemented */ @@ -720,9 +694,9 @@ VideoPortMapBankedMemory(IN PVOID HwDeviceExtension, IN PBANKED_SECTION_ROUTINE BankRoutine, IN PVOID Context) { - DPRINT("VideoPortMapBankedMemory\n"); - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + DPRINT("VideoPortMapBankedMemory\n"); + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; } From 5c30d2cc66b26f9e251ebe952dd52e2a2e50dece Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Thu, 4 Mar 2004 18:54:21 +0000 Subject: [PATCH 0321/1463] Added a stub implementation of commctrl.dll for WinCE support svn path=/trunk/; revision=8533 --- reactos/lib/commctrl/Makefile | 19 ++++++++ reactos/lib/commctrl/commctrl.def | 60 ++++++++++++++++++++++++ reactos/lib/commctrl/commctrl.edf | 60 ++++++++++++++++++++++++ reactos/lib/commctrl/commctrl.rc | 38 ++++++++++++++++ reactos/lib/commctrl/commctrl_main.c | 68 ++++++++++++++++++++++++++++ 5 files changed, 245 insertions(+) create mode 100644 reactos/lib/commctrl/Makefile create mode 100644 reactos/lib/commctrl/commctrl.def create mode 100644 reactos/lib/commctrl/commctrl.edf create mode 100644 reactos/lib/commctrl/commctrl.rc create mode 100644 reactos/lib/commctrl/commctrl_main.c diff --git a/reactos/lib/commctrl/Makefile b/reactos/lib/commctrl/Makefile new file mode 100644 index 00000000000..c1a29b85932 --- /dev/null +++ b/reactos/lib/commctrl/Makefile @@ -0,0 +1,19 @@ + +PATH_TO_TOP = ../.. + +TARGET_TYPE = dynlink + +TARGET_NAME = commctrl + +TARGET_BASE=0x75e60000 + +# require os code to explicitly request A/W version of structs/functions +TARGET_CFLAGS += -D_DISABLE_TIDENTS -Wall -Werror + +TARGET_SDKLIBS = ntdll.a kernel32.a + +TARGET_OBJECTS = commctrl_main.o + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk diff --git a/reactos/lib/commctrl/commctrl.def b/reactos/lib/commctrl/commctrl.def new file mode 100644 index 00000000000..bd6fd868192 --- /dev/null +++ b/reactos/lib/commctrl/commctrl.def @@ -0,0 +1,60 @@ +LIBRARY commctrl.dll +EXPORTS +;Header_Init@@YAHPAUHINSTANCE__@@@Z +;ListView_Init@@YAHPAUHINSTANCE__@@@Z +;TV_Init@@YAHPAUHINSTANCE__@@@Z +;_CenterWindow @35 +;_CommandBands_AddAdornments @39 +;_CommandBands_AddBands @37 +;_CommandBands_Create @36 +;_CommandBands_GetCommandBar @38 +;_CommandBands_GetRestoreInformation @41 +;_CommandBands_Show @40 +_CommandBar_AddAdornments @10 +;_CommandBar_AddBitmap @5 +;_CommandBar_AlignAdornments @44 +_CommandBar_Create @3 +;_CommandBar_DrawMenuBar @43 +;_CommandBar_GetItemWindow @11 +;_CommandBar_GetMenu @9 +;_CommandBar_Height @12 +;_CommandBar_InsertComboBox @6 +;_CommandBar_InsertControl @7 +_CommandBar_InsertMenubar @8 +;_CommandBar_InsertMenubarEx @42 +_CommandBar_Show @4 +;_CreatePropertySheetPageW @19 +;_CreateStatusWindowW @17 +;_CreateToolbar @15 +;_CreateToolbarEx @16 +;_CreateUpDownControl @14 +;_DPA_Destroy @31 +;_DPA_GetPtr @32 +;_DSA_Create @23 +;_DSA_DeleteAllItems @30 +;_DSA_DeleteItem @29 +;_DSA_Destroy @24 +;_DSA_DestroyCallback @57 +;_DSA_GetItem @25 +;_DSA_GetItemPtr @26 +;_DSA_InsertItem @27 +;_DSA_SetItem @28 +;_DestroyPropertySheetPage @20 +;_DrawStatusTextW @21 +;InitCapEdit +;_InitCommonControls @1 +;_InitCommonControlsEx @2 +;InitDateClasses +;InitProgressClass +;InitReBarClass +;InitStatusClass +;InitToolTipsClass +;InitToolbarClass +;InitTrackBar +;InitUpDownClass +;_InvertRect @22 +;_IsCommandBarMessage @13 +;_PropertySheetW @18 +;_StrToIntW @34 +;_Str_SetPtrW @33 +;Tab_Init diff --git a/reactos/lib/commctrl/commctrl.edf b/reactos/lib/commctrl/commctrl.edf new file mode 100644 index 00000000000..bd6fd868192 --- /dev/null +++ b/reactos/lib/commctrl/commctrl.edf @@ -0,0 +1,60 @@ +LIBRARY commctrl.dll +EXPORTS +;Header_Init@@YAHPAUHINSTANCE__@@@Z +;ListView_Init@@YAHPAUHINSTANCE__@@@Z +;TV_Init@@YAHPAUHINSTANCE__@@@Z +;_CenterWindow @35 +;_CommandBands_AddAdornments @39 +;_CommandBands_AddBands @37 +;_CommandBands_Create @36 +;_CommandBands_GetCommandBar @38 +;_CommandBands_GetRestoreInformation @41 +;_CommandBands_Show @40 +_CommandBar_AddAdornments @10 +;_CommandBar_AddBitmap @5 +;_CommandBar_AlignAdornments @44 +_CommandBar_Create @3 +;_CommandBar_DrawMenuBar @43 +;_CommandBar_GetItemWindow @11 +;_CommandBar_GetMenu @9 +;_CommandBar_Height @12 +;_CommandBar_InsertComboBox @6 +;_CommandBar_InsertControl @7 +_CommandBar_InsertMenubar @8 +;_CommandBar_InsertMenubarEx @42 +_CommandBar_Show @4 +;_CreatePropertySheetPageW @19 +;_CreateStatusWindowW @17 +;_CreateToolbar @15 +;_CreateToolbarEx @16 +;_CreateUpDownControl @14 +;_DPA_Destroy @31 +;_DPA_GetPtr @32 +;_DSA_Create @23 +;_DSA_DeleteAllItems @30 +;_DSA_DeleteItem @29 +;_DSA_Destroy @24 +;_DSA_DestroyCallback @57 +;_DSA_GetItem @25 +;_DSA_GetItemPtr @26 +;_DSA_InsertItem @27 +;_DSA_SetItem @28 +;_DestroyPropertySheetPage @20 +;_DrawStatusTextW @21 +;InitCapEdit +;_InitCommonControls @1 +;_InitCommonControlsEx @2 +;InitDateClasses +;InitProgressClass +;InitReBarClass +;InitStatusClass +;InitToolTipsClass +;InitToolbarClass +;InitTrackBar +;InitUpDownClass +;_InvertRect @22 +;_IsCommandBarMessage @13 +;_PropertySheetW @18 +;_StrToIntW @34 +;_Str_SetPtrW @33 +;Tab_Init diff --git a/reactos/lib/commctrl/commctrl.rc b/reactos/lib/commctrl/commctrl.rc new file mode 100644 index 00000000000..a8cca81fe9e --- /dev/null +++ b/reactos/lib/commctrl/commctrl.rc @@ -0,0 +1,38 @@ +#include <defines.h> +#include <reactos/resource.h> + +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", "ReactOS WinCE Compatiblity Layer\0" + VALUE "FileVersion", RES_STR_FILE_VERSION + VALUE "InternalName", "coredll\0" + VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT + VALUE "OriginalFilename", "coredll.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/commctrl/commctrl_main.c b/reactos/lib/commctrl/commctrl_main.c new file mode 100644 index 00000000000..eb2710b6fed --- /dev/null +++ b/reactos/lib/commctrl/commctrl_main.c @@ -0,0 +1,68 @@ +/* + * ReactOS-CE Common Controls + * + * Copyright 2004 Steven Edwards + * + * 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: + * ATM this is just a dummy forwarding dll for the WinCE API to Win32 API + * When you exit a simple WinCE app on Windows or on ReactOS it causes + * a program error or unhandled exception probl'y because we dont handle + * threading and process attaching/detaching like we should here. + * + * There will be some parts of the WinCE API that cant just be forwarded to + * the Win32 API as paramater names or types may differ. In that case you will + * need to copy the Win32 implementation and make the needed changes. + */ + +#include <debug.h> +#include "windows.h" + +BOOL STDCALL +DllMain(HANDLE hDll, + DWORD dwReason, + LPVOID lpReserved) +{ + return TRUE; +} + +BOOL STDCALL +_CommandBar_Create() +{ +DPRINT1("CommandBar_Create called\n"); + return TRUE; +} + +BOOL STDCALL +_CommandBar_Show() +{ +DPRINT1("CommandBar_Show called\n"); + return TRUE; +} + +BOOL STDCALL +_CommandBar_InsertMenubar() +{ +DPRINT1("CommandBar_InsertMenubar called\n"); + return TRUE; +} + +BOOL STDCALL +_CommandBar_AddAdornments() +{ +DPRINT1("CommandBar_AddAdornments called\n"); + return TRUE; +} From a2f24f38dc587c94c759ddc6cea95e54e1e36bd6 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Thu, 4 Mar 2004 18:55:09 +0000 Subject: [PATCH 0322/1463] - Cleaned up the Boot Video driver. - Replaced most of the magic numbers by defines. - Changed the video mode setting to directly program the VGA registers instead of using Ke386CallBios. - Properly map the video memory. svn path=/trunk/; revision=8534 --- reactos/drivers/dd/bootvid/bootvid.c | 1087 +++++++++----------- reactos/drivers/dd/bootvid/bootvid.h | 124 +++ reactos/drivers/dd/bootvid/pixelsup_i386.S | 27 +- 3 files changed, 599 insertions(+), 639 deletions(-) create mode 100644 reactos/drivers/dd/bootvid/bootvid.h diff --git a/reactos/drivers/dd/bootvid/bootvid.c b/reactos/drivers/dd/bootvid/bootvid.c index 0cf803914e4..43fc854ac46 100644 --- a/reactos/drivers/dd/bootvid/bootvid.c +++ b/reactos/drivers/dd/bootvid/bootvid.c @@ -1,12 +1,24 @@ -/* $Id: bootvid.c,v 1.6 2004/02/10 16:22:55 navaraf Exp $ +/* + * ReactOS Boot video driver * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: ntoskrnl/inbv/bootvid.c - * PURPOSE: Boot video support - * PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net) - * UPDATE HISTORY: - * 12-07-2003 CSH Created + * Copyright (C) 2003 Casper S. Hornstroup + * Copyright (C) 2004 Filip Navara + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Id: bootvid.c,v 1.7 2004/03/04 18:55:08 navaraf Exp $ */ /* INCLUDES ******************************************************************/ @@ -15,801 +27,622 @@ #include <ddk/ntbootvid.h> #include <reactos/resource.h> #include <rosrtl/string.h> +#include "bootvid.h" -#include "../../../ntoskrnl/include/internal/v86m.h" - -/*#define NDEBUG*/ +#define NDEBUG #include <debug.h> -#define RT_BITMAP 2 - -typedef struct tagRGBQUAD { - unsigned char rgbBlue; - unsigned char rgbGreen; - unsigned char rgbRed; - unsigned char rgbReserved; -} RGBQUAD, *PRGBQUAD; - -typedef long FXPT2DOT30; - -typedef struct tagCIEXYZ { - FXPT2DOT30 ciexyzX; - FXPT2DOT30 ciexyzY; - FXPT2DOT30 ciexyzZ; -} CIEXYZ; -typedef CIEXYZ * LPCIEXYZ; - -typedef struct tagCIEXYZTRIPLE { - CIEXYZ ciexyzRed; - CIEXYZ ciexyzGreen; - CIEXYZ ciexyzBlue; -} CIEXYZTRIPLE; -typedef CIEXYZTRIPLE *LPCIEXYZTRIPLE; - -typedef struct { - DWORD bV5Size; - LONG bV5Width; - LONG bV5Height; - WORD bV5Planes; - WORD bV5BitCount; - DWORD bV5Compression; - DWORD bV5SizeImage; - LONG bV5XPelsPerMeter; - LONG bV5YPelsPerMeter; - DWORD bV5ClrUsed; - DWORD bV5ClrImportant; - DWORD bV5RedMask; - DWORD bV5GreenMask; - DWORD bV5BlueMask; - DWORD bV5AlphaMask; - DWORD bV5CSType; - CIEXYZTRIPLE bV5Endpoints; - DWORD bV5GammaRed; - DWORD bV5GammaGreen; - DWORD bV5GammaBlue; - DWORD bV5Intent; - DWORD bV5ProfileData; - DWORD bV5ProfileSize; - DWORD bV5Reserved; -} BITMAPV5HEADER, *PBITMAPV5HEADER; - - -#define MISC 0x3c2 -#define SEQ 0x3c4 -#define CRTC 0x3d4 -#define GRAPHICS 0x3ce -#define FEATURE 0x3da -#define ATTRIB 0x3c0 -#define STATUS 0x3da - -typedef struct { - ULONG r; - ULONG g; - ULONG b; -} FADER_PALETTE_ENTRY; - -/* In pixelsups.S */ -extern VOID -InbvPutPixels(int x, int y, unsigned long c); - /* GLOBALS *******************************************************************/ -char *vidmem; +/* + * NOTE: + * This is based on SvgaLib 640x480x16 mode definition with the + * following changes: + * - Graphics: Data Rotate (Index 3) + * Set to zero to indicate that the data written to video memory by + * CPU should be processed unmodified. + * - Graphics: Mode Register (index 5) + * Set to Write Mode 2 and Read Mode 0. + */ + +static VGA_REGISTERS Mode12Regs = +{ + /* CRT Controller Registers */ + {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xEA, 0x8C, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xE3}, + /* Attribute Controller Registers */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, + 0x0C, 0x0D, 0x0E, 0x0F, 0x81, 0x00, 0x0F, 0x00, 0x00}, + /* Graphics Controller Registers */ + {0x00, 0x0F, 0x00, 0x00, 0x00, 0x02, 0x05, 0x0F, 0xFF}, + /* Sequencer Registers */ + {0x03, 0x01, 0x0F, 0x00, 0x06}, + /* Misc Output Register */ + 0xE3 +}; + +PUCHAR VideoMemory; /* Must be 4 bytes per entry */ long maskbit[640]; -long y80[480]; static HANDLE BitmapThreadHandle; static CLIENT_ID BitmapThreadId; -static BOOLEAN BitmapIsDrawn; static PUCHAR BootimageBitmap; -static BOOLEAN InGraphicsMode = FALSE; /* DATA **********************************************************************/ -static BOOLEAN VideoAddressSpaceInitialized = FALSE; -static PVOID NonBiosBaseAddress; static PDRIVER_OBJECT BootVidDriverObject = NULL; /* FUNCTIONS *****************************************************************/ -static BOOLEAN +STATIC BOOLEAN FASTCALL InbvFindBootimage() { - PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry; - LDR_RESOURCE_INFO ResourceInfo; - NTSTATUS Status; - PVOID BaseAddress = BootVidDriverObject->DriverStart; - ULONG Size; + PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry; + LDR_RESOURCE_INFO ResourceInfo; + NTSTATUS Status; + PVOID BaseAddress = BootVidDriverObject->DriverStart; + ULONG Size; - ResourceInfo.Type = RT_BITMAP; - ResourceInfo.Name = IDB_BOOTIMAGE; - ResourceInfo.Language = 0x09; + ResourceInfo.Type = RT_BITMAP; + ResourceInfo.Name = IDB_BOOTIMAGE; + ResourceInfo.Language = 0x09; - Status = LdrFindResource_U(BaseAddress, - &ResourceInfo, - RESOURCE_DATA_LEVEL, - &ResourceDataEntry); - if (!NT_SUCCESS(Status)) - { + Status = LdrFindResource_U( + BaseAddress, + &ResourceInfo, + RESOURCE_DATA_LEVEL, + &ResourceDataEntry); + + if (!NT_SUCCESS(Status)) + { DPRINT("LdrFindResource_U() failed with status 0x%.08x\n", Status); return FALSE; - } + } - Status = LdrAccessResource(BaseAddress, - ResourceDataEntry, - (PVOID*)&BootimageBitmap, - &Size); - if (!NT_SUCCESS(Status)) - { + Status = LdrAccessResource( + BaseAddress, + ResourceDataEntry, + (PVOID*)&BootimageBitmap, + &Size); + + if (!NT_SUCCESS(Status)) + { DPRINT("LdrAccessResource() failed with status 0x%.08x\n", Status); return FALSE; - } - - return TRUE; -} - - -static BOOLEAN -InbvInitializeVideoAddressSpace(VOID) -{ - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING PhysMemName; - NTSTATUS Status; - HANDLE PhysMemHandle; - PVOID BaseAddress; - LARGE_INTEGER Offset; - ULONG ViewSize; - CHAR IVT[1024]; - CHAR BDA[256]; - PVOID start = (PVOID)0x0; - - /* - * Open the physical memory section - */ - RtlRosInitUnicodeStringFromLiteral(&PhysMemName, L"\\Device\\PhysicalMemory"); - InitializeObjectAttributes(&ObjectAttributes, - &PhysMemName, - 0, - NULL, - NULL); - Status = ZwOpenSection(&PhysMemHandle, SECTION_ALL_ACCESS, - &ObjectAttributes); - if (!NT_SUCCESS(Status)) - { - DPRINT("Couldn't open \\Device\\PhysicalMemory\n"); - return FALSE; - } - - /* - * Map the BIOS and device registers into the address space - */ - Offset.QuadPart = 0xa0000; - ViewSize = 0x100000 - 0xa0000; - BaseAddress = (PVOID)0xa0000; - Status = NtMapViewOfSection(PhysMemHandle, - NtCurrentProcess(), - &BaseAddress, - 0, - 8192, - &Offset, - &ViewSize, - ViewUnmap, - 0, - PAGE_EXECUTE_READWRITE); - if (!NT_SUCCESS(Status)) - { - DPRINT("Couldn't map physical memory (%x)\n", Status); - NtClose(PhysMemHandle); - return FALSE; - } - NtClose(PhysMemHandle); - if (BaseAddress != (PVOID)0xa0000) - { - DPRINT("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 - */ - NonBiosBaseAddress = (PVOID)0x1; - ViewSize = 0xa0000 - 0x1000; - Status = NtAllocateVirtualMemory(NtCurrentProcess(), - &NonBiosBaseAddress, - 0, - &ViewSize, - MEM_COMMIT, - PAGE_EXECUTE_READWRITE); - if (!NT_SUCCESS(Status)) - { - DPRINT("Failed to allocate virtual memory (Status %x)\n", Status); - return FALSE; - } - if (NonBiosBaseAddress != (PVOID)0x0) - { - DPRINT("Failed to allocate virtual memory at right address " - "(was %x)\n", NonBiosBaseAddress); - return FALSE; - } - - /* - * Get the real mode IVT from the kernel - */ - Status = NtVdmControl(0, IVT); - if (!NT_SUCCESS(Status)) - { - DPRINT("NtVdmControl failed (status %x)\n", Status); - return FALSE; - } - - /* - * Copy the real mode IVT into the right place - */ - memcpy(start, IVT, 1024); - - /* - * Get the BDA from the kernel - */ - Status = NtVdmControl(1, BDA); - if (!NT_SUCCESS(Status)) - { - DPRINT("NtVdmControl failed (status %x)\n", Status); - return FALSE; - } - - /* - * Copy the BDA into the right place - */ - memcpy((PVOID)0x400, BDA, 256); + } return TRUE; } -static BOOLEAN -InbvDeinitializeVideoAddressSpace(VOID) +STATIC BOOLEAN FASTCALL +InbvMapVideoMemory(VOID) { - ULONG RegionSize; - PUCHAR ViewBase; + PHYSICAL_ADDRESS PhysicalAddress; - RegionSize = 0xa0000 - 0x1000; - NtFreeVirtualMemory(NtCurrentProcess(), - &NonBiosBaseAddress, - &RegionSize, - MEM_RELEASE); + PhysicalAddress.QuadPart = 0xA0000; + VideoMemory = MmMapIoSpace(PhysicalAddress, 0x10000, FALSE); - ViewBase = (PUCHAR) 0xa0000; - ZwUnmapViewOfSection(NtCurrentProcess(), ViewBase); - - return TRUE; + return VideoMemory != NULL; } -static VOID +STATIC BOOLEAN FASTCALL +InbvUnmapVideoMemory(VOID) +{ + MmUnmapIoSpace(VideoMemory, 0x10000); + return TRUE; +} + + +STATIC VOID FASTCALL vgaPreCalc() { - ULONG j; + ULONG j; - for(j = 0; j < 80; j++) - { - maskbit[j * 8 + 0] = 128; - maskbit[j * 8 + 1] = 64; - maskbit[j * 8 + 2] = 32; - maskbit[j * 8 + 3] = 16; - maskbit[j * 8 + 4] = 8; - maskbit[j * 8 + 5] = 4; - maskbit[j * 8 + 6] = 2; - maskbit[j * 8 + 7] = 1; - } - for(j = 0; j < 480; j++) - { - y80[j] = j * 80; /* 80 = 640 / 8 = Number of bytes per scanline */ - } + for (j = 0; j < 80; j++) + { + maskbit[j * 8 + 0] = 128; + maskbit[j * 8 + 1] = 64; + maskbit[j * 8 + 2] = 32; + maskbit[j * 8 + 3] = 16; + maskbit[j * 8 + 4] = 8; + maskbit[j * 8 + 5] = 4; + maskbit[j * 8 + 6] = 2; + maskbit[j * 8 + 7] = 1; + } +} + + +STATIC VOID FASTCALL +vgaSetRegisters(PVGA_REGISTERS Registers) +{ + int i; + + /* Update misc output register */ + WRITE_PORT_UCHAR(MISC, Registers->Misc); + + /* Synchronous reset on */ + WRITE_PORT_UCHAR(SEQ, 0x00); + WRITE_PORT_UCHAR(SEQDATA, 0x01); + + /* Write sequencer registers */ + for (i = 1; i < sizeof(Registers->Sequencer); i++) + { + WRITE_PORT_UCHAR(SEQ, i); + WRITE_PORT_UCHAR(SEQDATA, Registers->Sequencer[i]); + } + + /* Synchronous reset off */ + WRITE_PORT_UCHAR(SEQ, 0x00); + WRITE_PORT_UCHAR(SEQDATA, 0x03); + + /* Deprotect CRT registers 0-7 */ + WRITE_PORT_UCHAR(CRTC, 0x11); + WRITE_PORT_UCHAR(CRTCDATA, Registers->CRT[0x11] & 0x7f); + + /* Write CRT registers */ + for (i = 0; i < sizeof(Registers->CRT); i++) + { + WRITE_PORT_UCHAR(CRTC, i); + WRITE_PORT_UCHAR(CRTCDATA, Registers->CRT[i]); + } + + /* Write graphics controller registers */ + for (i = 0; i < sizeof(Registers->Graphics); i++) + { + WRITE_PORT_UCHAR(GRAPHICS, i); + WRITE_PORT_UCHAR(GRAPHICSDATA, Registers->Graphics[i]); + } + + /* Write attribute controller registers */ + for (i = 0; i < sizeof(Registers->Attribute); i++) + { + READ_PORT_UCHAR(STATUS); + WRITE_PORT_UCHAR(ATTRIB, i); + WRITE_PORT_UCHAR(ATTRIB, Registers->Attribute[i]); + } } static VOID InbvInitVGAMode(VOID) { - KV86M_REGISTERS Regs; - NTSTATUS Status; - ULONG i; + /* Zero out video memory (clear a possibly trashed screen) */ + RtlZeroMemory(VideoMemory, 0x10000); - vidmem = (char *)(0xd0000000 + 0xa0000); - memset(&Regs, 0, sizeof(Regs)); - Regs.Eax = 0x0012; - Status = Ke386CallBios(0x10, &Regs); - assert(NT_SUCCESS(Status)); + vgaSetRegisters(&Mode12Regs); - /* Get VGA registers into the correct state */ - /* Reset the internal flip-flop. */ - (VOID)READ_PORT_UCHAR((PUCHAR)FEATURE); - /* Write the 16 palette registers. */ - for (i = 0; i < 16; i++) - { - WRITE_PORT_UCHAR((PUCHAR)ATTRIB, i); - WRITE_PORT_UCHAR((PUCHAR)ATTRIB, i); - } - /* Write the mode control register - graphics mode; 16 color DAC. */ - WRITE_PORT_UCHAR((PUCHAR)ATTRIB, 0x10); - WRITE_PORT_UCHAR((PUCHAR)ATTRIB, 0x81); - /* Write the color select register - select first 16 DAC registers. */ - WRITE_PORT_UCHAR((PUCHAR)ATTRIB, 0x14); - WRITE_PORT_UCHAR((PUCHAR)ATTRIB, 0x00); + /* Set the PEL mask. */ + WRITE_PORT_UCHAR(PELMASK, 0xff); - /* Get the VGA into the mode we want to work with */ - WRITE_PORT_UCHAR((PUCHAR)0x3ce,0x08); /* Set */ - WRITE_PORT_UCHAR((PUCHAR)0x3cf,0); /* the MASK */ - WRITE_PORT_USHORT((PUSHORT)0x3ce,0x0205); /* write mode = 2 (bits 0,1) read mode = 0 (bit 3) */ - (UCHAR) READ_REGISTER_UCHAR(vidmem); /* Update bit buffer */ - WRITE_REGISTER_UCHAR(vidmem, 0); /* Write the pixel */ - WRITE_PORT_UCHAR((PUCHAR)0x3ce,0x08); - WRITE_PORT_UCHAR((PUCHAR)0x3cf,0xff); - - /* Set the PEL mask. */ - WRITE_PORT_UCHAR((PUCHAR)0x3c6, 0xff); - - /* Zero out video memory (clear a possibly trashed screen) */ - RtlZeroMemory(vidmem, 64000); - - vgaPreCalc(); + vgaPreCalc(); } -BOOL -STDCALL +BOOL STDCALL VidResetDisplay(VOID) { - /* - We are only using standard VGA facilities so we can rely on the HAL 'int10mode3' - reset to cleanup the hardware state. - */ - InGraphicsMode = FALSE; + /* + * We are only using standard VGA facilities so we can rely on the + * HAL 'int10mode3' reset to cleanup the hardware state. + */ - return FALSE; + return FALSE; } -VOID -STDCALL +VOID STDCALL VidCleanUp(VOID) { - /* - We are only using standard VGA facilities so we can rely on the HAL 'int10mode3' - reset to cleanup the hardware state. - */ - InGraphicsMode = FALSE; + InbvUnmapVideoMemory(); } -static __inline__ VOID -InbvSetColor(int cindex, unsigned char red, unsigned char green, unsigned char blue) +STATIC VOID FASTCALL +InbvSetColor(INT Index, UCHAR Red, UCHAR Green, UCHAR Blue) { - red = (red * 63) / 255; - green = (green * 63) / 255; - blue = (blue * 63) / 255; - - WRITE_PORT_UCHAR((PUCHAR)0x03c8, cindex); - (VOID)READ_PORT_UCHAR((PUCHAR)FEATURE); - (VOID)READ_PORT_UCHAR((PUCHAR)FEATURE); - WRITE_PORT_UCHAR((PUCHAR)0x03c9, red); - (VOID)READ_PORT_UCHAR((PUCHAR)FEATURE); - (VOID)READ_PORT_UCHAR((PUCHAR)FEATURE); - WRITE_PORT_UCHAR((PUCHAR)0x03c9, green); - (VOID)READ_PORT_UCHAR((PUCHAR)FEATURE); - (VOID)READ_PORT_UCHAR((PUCHAR)FEATURE); - WRITE_PORT_UCHAR((PUCHAR)0x03c9, blue); - (VOID)READ_PORT_UCHAR((PUCHAR)FEATURE); - (VOID)READ_PORT_UCHAR((PUCHAR)FEATURE); + WRITE_PORT_UCHAR(PELINDEX, Index); + WRITE_PORT_UCHAR(PELDATA, Red >> 2); + WRITE_PORT_UCHAR(PELDATA, Green >> 2); + WRITE_PORT_UCHAR(PELDATA, Blue >> 2); } -static __inline__ VOID +STATIC VOID FASTCALL InbvSetBlackPalette() { - register ULONG r = 0; + register ULONG r = 0; - /* Disable screen and enable palette access. */ - (VOID)READ_PORT_UCHAR((PUCHAR)FEATURE); - WRITE_PORT_UCHAR((PUCHAR)0x3c0, 0x00); - for (r = 0; r < 16; r++) - { + /* Disable screen and enable palette access. */ + READ_PORT_UCHAR(STATUS); + WRITE_PORT_UCHAR(ATTRIB, 0x00); + + for (r = 0; r < 16; r++) + { InbvSetColor(r, 0, 0, 0); - } - /* Enable screen and enable palette access. */ - (VOID)READ_PORT_UCHAR((PUCHAR)FEATURE); - WRITE_PORT_UCHAR((PUCHAR)0x3c0, 0x20); + } + + /* Enable screen and enable palette access. */ + READ_PORT_UCHAR(STATUS); + WRITE_PORT_UCHAR(ATTRIB, 0x20); } -static VOID +STATIC VOID FASTCALL InbvDisplayBitmap(ULONG Width, ULONG Height, PCHAR ImageData) { - ULONG j,k,y; - register ULONG i; - register ULONG x; - register ULONG c; + ULONG j, k, y; + register ULONG i; + register ULONG x; + register ULONG c; - k = 0; - for (y = 0; y < Height; y++) - { + k = 0; + for (y = 0; y < Height; y++) + { for (j = 0; j < 8; j++) - { - x = j; + { + x = j; - /* - * Loop through the line and process every 8th pixel. - * This way we can get a way with using the same bit mask - * for several pixels and thus not need to do as much I/O - * communication. - */ - while (x < 640) + /* + * Loop through the line and process every 8th pixel. + * This way we can get a way with using the same bit mask + * for several pixels and thus not need to do as much I/O + * communication. + */ + while (x < 640) + { + c = 0; + + if (x < Width) { - c = 0; - - if (x < Width) - { - c = ImageData[k + x]; - for (i = 1; i < 4; i++) - { - if (x + i*8 < Width) - { - c |= (ImageData[k + x + i * 8] << i * 8); - } - } - } - - InbvPutPixels(x, 479 - y, c); - x += 8*4; + c = ImageData[k + x]; + for (i = 1; i < 4; i++) + { + if (x + i * 8 < Width) + { + c |= (ImageData[k + x + i * 8] << i * 8); + } + } } - } + + InbvPutPixels(x, 479 - y, c); + x += 8 * 4; + } + } k += Width; - } + } } -static VOID +STATIC VOID FASTCALL InbvDisplayCompressedBitmap() { - PBITMAPV5HEADER bminfo; - ULONG i,j,k; - ULONG x,y; - ULONG curx,cury; - ULONG bfOffBits; - ULONG clen; - PCHAR ImageData; + PBITMAPV5HEADER bminfo; + ULONG i,j,k; + ULONG x,y; + ULONG curx,cury; + ULONG bfOffBits; + ULONG clen; + PCHAR ImageData; - bminfo = (PBITMAPV5HEADER) &BootimageBitmap[0]; - DPRINT("bV5Size = %d\n", bminfo->bV5Size); - DPRINT("bV5Width = %d\n", bminfo->bV5Width); - DPRINT("bV5Height = %d\n", bminfo->bV5Height); - DPRINT("bV5Planes = %d\n", bminfo->bV5Planes); - DPRINT("bV5BitCount = %d\n", bminfo->bV5BitCount); - DPRINT("bV5Compression = %d\n", bminfo->bV5Compression); - DPRINT("bV5SizeImage = %d\n", bminfo->bV5SizeImage); - DPRINT("bV5XPelsPerMeter = %d\n", bminfo->bV5XPelsPerMeter); - DPRINT("bV5YPelsPerMeter = %d\n", bminfo->bV5YPelsPerMeter); - DPRINT("bV5ClrUsed = %d\n", bminfo->bV5ClrUsed); - DPRINT("bV5ClrImportant = %d\n", bminfo->bV5ClrImportant); + bminfo = (PBITMAPV5HEADER) &BootimageBitmap[0]; + DPRINT("bV5Size = %d\n", bminfo->bV5Size); + DPRINT("bV5Width = %d\n", bminfo->bV5Width); + DPRINT("bV5Height = %d\n", bminfo->bV5Height); + DPRINT("bV5Planes = %d\n", bminfo->bV5Planes); + DPRINT("bV5BitCount = %d\n", bminfo->bV5BitCount); + DPRINT("bV5Compression = %d\n", bminfo->bV5Compression); + DPRINT("bV5SizeImage = %d\n", bminfo->bV5SizeImage); + DPRINT("bV5XPelsPerMeter = %d\n", bminfo->bV5XPelsPerMeter); + DPRINT("bV5YPelsPerMeter = %d\n", bminfo->bV5YPelsPerMeter); + DPRINT("bV5ClrUsed = %d\n", bminfo->bV5ClrUsed); + DPRINT("bV5ClrImportant = %d\n", bminfo->bV5ClrImportant); - bfOffBits = bminfo->bV5Size + bminfo->bV5ClrUsed * sizeof(RGBQUAD); - DPRINT("bfOffBits = %d\n", bfOffBits); - DPRINT("size of color indices = %d\n", bminfo->bV5ClrUsed * sizeof(RGBQUAD)); - DPRINT("first byte of data = %d\n", BootimageBitmap[bfOffBits]); + bfOffBits = bminfo->bV5Size + bminfo->bV5ClrUsed * sizeof(RGBQUAD); + DPRINT("bfOffBits = %d\n", bfOffBits); + DPRINT("size of color indices = %d\n", bminfo->bV5ClrUsed * sizeof(RGBQUAD)); + DPRINT("first byte of data = %d\n", BootimageBitmap[bfOffBits]); - InbvSetBlackPalette(); + InbvSetBlackPalette(); - ImageData = ExAllocatePool(NonPagedPool, bminfo->bV5Width * bminfo->bV5Height); - RtlZeroMemory(ImageData, bminfo->bV5Width * bminfo->bV5Height); + ImageData = ExAllocatePool(NonPagedPool, bminfo->bV5Width * bminfo->bV5Height); + RtlZeroMemory(ImageData, bminfo->bV5Width * bminfo->bV5Height); - /* - * ImageData has 1 pixel per byte. - * bootimage has 2 pixels per byte. - */ + /* + * ImageData has 1 pixel per byte. + * bootimage has 2 pixels per byte. + */ - if (bminfo->bV5Compression == 2) - { + if (bminfo->bV5Compression == 2) + { k = 0; j = 0; while ((j < bminfo->bV5SizeImage) && (k < (ULONG) (bminfo->bV5Width * bminfo->bV5Height))) - { - unsigned char b; + { + unsigned char b; - clen = BootimageBitmap[bfOffBits + j]; - j++; + clen = BootimageBitmap[bfOffBits + j]; + j++; - if (clen > 0) + if (clen > 0) + { + /* Encoded mode */ + + b = BootimageBitmap[bfOffBits + j]; + j++; + + for (i = 0; i < (clen / 2); i++) { - /* Encoded mode */ + ImageData[k] = (b & 0xf0) >> 4; + k++; + ImageData[k] = b & 0xf; + k++; + } + if ((clen & 1) > 0) + { + ImageData[k] = (b & 0xf0) >> 4; + k++; + } + } + else + { + /* Absolute mode */ + b = BootimageBitmap[bfOffBits + j]; + j++; - b = BootimageBitmap[bfOffBits + j]; - j++; + if (b == 0) + { + /* End of line */ + } + else if (b == 1) + { + /* End of image */ + break; + } + else if (b == 2) + { + x = BootimageBitmap[bfOffBits + j]; + j++; + y = BootimageBitmap[bfOffBits + j]; + j++; + curx = k % bminfo->bV5Width; + cury = k / bminfo->bV5Width; + k = (cury + y) * bminfo->bV5Width + (curx + x); + } + else + { + if ((j & 1) > 0) + { + DPRINT("Unaligned copy!\n"); + } - for (i = 0; i < (clen / 2); i++) - { + clen = b; + for (i = 0; i < (clen / 2); i++) + { + b = BootimageBitmap[bfOffBits + j]; + j++; + ImageData[k] = (b & 0xf0) >> 4; k++; ImageData[k] = b & 0xf; k++; - } - if ((clen & 1) > 0) - { - ImageData[k] = (b & 0xf0) >> 4; - k++; - } - } - else - { - /* Absolute mode */ - b = BootimageBitmap[bfOffBits + j]; - j++; - - if (b == 0) - { - /* End of line */ - } - else if (b == 1) - { - /* End of image */ - break; - } - else if (b == 2) - { - x = BootimageBitmap[bfOffBits + j]; + } + if ((clen & 1) > 0) + { + b = BootimageBitmap[bfOffBits + j]; j++; - y = BootimageBitmap[bfOffBits + j]; - j++; - curx = k % bminfo->bV5Width; - cury = k / bminfo->bV5Width; - k = (cury + y) * bminfo->bV5Width + (curx + x); - } - else - { - if ((j & 1) > 0) - { - DPRINT("Unaligned copy!\n"); - } - - clen = b; - for (i = 0; i < (clen / 2); i++) - { - b = BootimageBitmap[bfOffBits + j]; - j++; - - ImageData[k] = (b & 0xf0) >> 4; - k++; - ImageData[k] = b & 0xf; - k++; - } - if ((clen & 1) > 0) - { - b = BootimageBitmap[bfOffBits + j]; - j++; - ImageData[k] = (b & 0xf0) >> 4; - k++; - } - /* Word align */ - j += (j & 1); - } + ImageData[k] = (b & 0xf0) >> 4; + k++; + } + /* Word align */ + j += (j & 1); } - } + } + } InbvDisplayBitmap(bminfo->bV5Width, bminfo->bV5Height, ImageData); - } - else - { + } + else + { DbgPrint("Warning boot image need to be compressed using RLE4\n"); - } + } - ExFreePool(ImageData); + ExFreePool(ImageData); } -#define PALETTE_FADE_STEPS 20 -#define PALETTE_FADE_TIME 20 * 10000 /* 20ms */ - -static VOID +STATIC VOID FASTCALL InbvFadeUpPalette() { - PBITMAPV5HEADER bminfo; - PRGBQUAD Palette; - ULONG i; - unsigned char r,g,b; - register ULONG c; - LARGE_INTEGER Interval; - FADER_PALETTE_ENTRY FaderPalette[16]; - FADER_PALETTE_ENTRY FaderPaletteDelta[16]; + PBITMAPV5HEADER bminfo; + PRGBQUAD Palette; + ULONG i; + unsigned char r, g, b; + register ULONG c; + LARGE_INTEGER Interval; + FADER_PALETTE_ENTRY FaderPalette[16]; + FADER_PALETTE_ENTRY FaderPaletteDelta[16]; - RtlZeroMemory(&FaderPalette, sizeof(FaderPalette)); - RtlZeroMemory(&FaderPaletteDelta, sizeof(FaderPaletteDelta)); + RtlZeroMemory(&FaderPalette, sizeof(FaderPalette)); + RtlZeroMemory(&FaderPaletteDelta, sizeof(FaderPaletteDelta)); - bminfo = (PBITMAPV5HEADER) &BootimageBitmap[0]; //sizeof(BITMAPFILEHEADER)]; - Palette = (PRGBQUAD) &BootimageBitmap[/* sizeof(BITMAPFILEHEADER) + */ bminfo->bV5Size]; + bminfo = (PBITMAPV5HEADER)&BootimageBitmap[0]; + Palette = (PRGBQUAD)&BootimageBitmap[bminfo->bV5Size]; - for (i = 0; i < 16; i++) - { + for (i = 0; i < 16; i++) + { if (i < bminfo->bV5ClrUsed) - { - FaderPaletteDelta[i].r = ((Palette[i].rgbRed << 8) / PALETTE_FADE_STEPS); - FaderPaletteDelta[i].g = ((Palette[i].rgbGreen << 8) / PALETTE_FADE_STEPS); - FaderPaletteDelta[i].b = ((Palette[i].rgbBlue << 8) / PALETTE_FADE_STEPS); - } - } + { + FaderPaletteDelta[i].r = ((Palette[i].rgbRed << 8) / PALETTE_FADE_STEPS); + FaderPaletteDelta[i].g = ((Palette[i].rgbGreen << 8) / PALETTE_FADE_STEPS); + FaderPaletteDelta[i].b = ((Palette[i].rgbBlue << 8) / PALETTE_FADE_STEPS); + } + } - for (i = 0; i < PALETTE_FADE_STEPS; i++) - { + for (i = 0; i < PALETTE_FADE_STEPS; i++) + { /* Disable screen and enable palette access. */ - (VOID)READ_PORT_UCHAR((PUCHAR)FEATURE); - WRITE_PORT_UCHAR((PUCHAR)0x3c0, 0x00); + READ_PORT_UCHAR(STATUS); + WRITE_PORT_UCHAR(ATTRIB, 0x00); + for (c = 0; c < bminfo->bV5ClrUsed; c++) - { - /* Add the delta */ - FaderPalette[c].r += FaderPaletteDelta[c].r; - FaderPalette[c].g += FaderPaletteDelta[c].g; - FaderPalette[c].b += FaderPaletteDelta[c].b; + { + /* Add the delta */ + FaderPalette[c].r += FaderPaletteDelta[c].r; + FaderPalette[c].g += FaderPaletteDelta[c].g; + FaderPalette[c].b += FaderPaletteDelta[c].b; - /* Get the integer values */ - r = FaderPalette[c].r >> 8; - g = FaderPalette[c].g >> 8; - b = FaderPalette[c].b >> 8; + /* Get the integer values */ + r = FaderPalette[c].r >> 8; + g = FaderPalette[c].g >> 8; + b = FaderPalette[c].b >> 8; - /* Don't go too far */ - if (r > Palette[c].rgbRed) + /* Don't go too far */ + if (r > Palette[c].rgbRed) r = Palette[c].rgbRed; - if (g > Palette[c].rgbGreen) + if (g > Palette[c].rgbGreen) g = Palette[c].rgbGreen; - if (b > Palette[c].rgbBlue) + if (b > Palette[c].rgbBlue) b = Palette[c].rgbBlue; - /* Update the hardware */ - InbvSetColor(c, r, g, b); - } + /* Update the hardware */ + InbvSetColor(c, r, g, b); + } + /* Enable screen and disable palette access. */ - (VOID)READ_PORT_UCHAR((PUCHAR)FEATURE); - WRITE_PORT_UCHAR((PUCHAR)0x3c0, 0x20); + READ_PORT_UCHAR(STATUS); + WRITE_PORT_UCHAR(ATTRIB, 0x20); + /* Wait for a bit. */ Interval.QuadPart = -PALETTE_FADE_TIME; KeDelayExecutionThread(KernelMode, FALSE, &Interval); - } + } } -static VOID STDCALL + +STATIC VOID STDCALL InbvBitmapThreadMain(PVOID Ignored) { - if (InbvFindBootimage()) - { + if (InbvFindBootimage()) + { InbvDisplayCompressedBitmap(); InbvFadeUpPalette(); - } - else - { + } + else + { DbgPrint("Warning: Cannot find boot image\n"); - } - - BitmapIsDrawn = TRUE; + } } -BOOLEAN -STDCALL -VidIsBootDriverInstalled(VOID) -{ - return InGraphicsMode; -} - - -BOOLEAN -STDCALL +STATIC BOOLEAN STDCALL VidInitialize(VOID) { - NTSTATUS Status; + NTSTATUS Status; - if (!VideoAddressSpaceInitialized) - { - InbvInitializeVideoAddressSpace(); - } - - InbvInitVGAMode(); - - InGraphicsMode = TRUE; - - BitmapIsDrawn = FALSE; + InbvMapVideoMemory(); + InbvInitVGAMode(); - Status = PsCreateSystemThread(&BitmapThreadHandle, - THREAD_ALL_ACCESS, - NULL, - NULL, - &BitmapThreadId, - InbvBitmapThreadMain, - NULL); - if (!NT_SUCCESS(Status)) - { + Status = PsCreateSystemThread( + &BitmapThreadHandle, + THREAD_ALL_ACCESS, + NULL, + NULL, + &BitmapThreadId, + InbvBitmapThreadMain, + NULL); + + if (!NT_SUCCESS(Status)) + { return FALSE; - } - NtClose(BitmapThreadHandle); + } - InbvDeinitializeVideoAddressSpace(); - VideoAddressSpaceInitialized = FALSE; + NtClose(BitmapThreadHandle); - return TRUE; + return TRUE; } + NTSTATUS STDCALL VidDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { - PIO_STACK_LOCATION piosStack = IoGetCurrentIrpStackLocation(Irp); - NTSTATUS nErrCode; - NTBOOTVID_FUNCTION_TABLE* FunctionTable; + PIO_STACK_LOCATION IrpSp; + NTSTATUS Status; + NTBOOTVID_FUNCTION_TABLE* FunctionTable; - nErrCode = STATUS_SUCCESS; + IrpSp = IoGetCurrentIrpStackLocation(Irp); + Status = STATUS_SUCCESS; - switch(piosStack->MajorFunction) - { - /* opening and closing handles to the device */ + switch(IrpSp->MajorFunction) + { + /* Opening and closing handles to the device */ case IRP_MJ_CREATE: case IRP_MJ_CLOSE: - break; + break; - case IRP_MJ_DEVICE_CONTROL: - switch (piosStack->Parameters.DeviceIoControl.IoControlCode) - { - case IOCTL_BOOTVID_INITIALIZE: - VidInitialize(); - FunctionTable = (NTBOOTVID_FUNCTION_TABLE*) - Irp->AssociatedIrp.SystemBuffer; - FunctionTable->ResetDisplay = VidResetDisplay; - break; - case IOCTL_BOOTVID_CLEANUP: - VidCleanUp(); - break; - default: - nErrCode = STATUS_NOT_IMPLEMENTED; - break; - } - break; + case IRP_MJ_DEVICE_CONTROL: + switch (IrpSp->Parameters.DeviceIoControl.IoControlCode) + { + case IOCTL_BOOTVID_INITIALIZE: + VidInitialize(); + FunctionTable = (NTBOOTVID_FUNCTION_TABLE *) + Irp->AssociatedIrp.SystemBuffer; + FunctionTable->ResetDisplay = VidResetDisplay; + break; - /* unsupported operations */ + case IOCTL_BOOTVID_CLEANUP: + VidCleanUp(); + break; + + default: + Status = STATUS_NOT_IMPLEMENTED; + break; + } + break; + + /* Unsupported operations */ default: - nErrCode = STATUS_NOT_IMPLEMENTED; - } + Status = STATUS_NOT_IMPLEMENTED; + } - Irp->IoStatus.Status = nErrCode; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); - return nErrCode; + return Status; } NTSTATUS STDCALL DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) { - PDEVICE_OBJECT BootVidDevice; - UNICODE_STRING DeviceName; - NTSTATUS Status; + PDEVICE_OBJECT BootVidDevice; + UNICODE_STRING DeviceName; + NTSTATUS Status; - BootVidDriverObject = DriverObject; + BootVidDriverObject = DriverObject; - /* register driver routines */ - DriverObject->MajorFunction[IRP_MJ_CLOSE] = VidDispatch; - DriverObject->MajorFunction[IRP_MJ_CREATE] = VidDispatch; - DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = VidDispatch; - DriverObject->DriverUnload = NULL; + /* Register driver routines */ + DriverObject->MajorFunction[IRP_MJ_CLOSE] = VidDispatch; + DriverObject->MajorFunction[IRP_MJ_CREATE] = VidDispatch; + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = VidDispatch; + DriverObject->DriverUnload = NULL; - /* create device */ - RtlRosInitUnicodeStringFromLiteral(&DeviceName, L"\\Device\\BootVid"); + DriverObject->Flags |= DO_BUFFERED_IO; - Status = IoCreateDevice(DriverObject, 0, &DeviceName, FILE_DEVICE_BOOTVID, - 0, FALSE, &BootVidDevice); - if (! NT_SUCCESS(Status)) - { - return Status; - } + /* Create device */ + RtlRosInitUnicodeStringFromLiteral(&DeviceName, L"\\Device\\BootVid"); - BootVidDevice->Flags |= DO_BUFFERED_IO; + Status = IoCreateDevice( + DriverObject, + 0, + &DeviceName, + FILE_DEVICE_BOOTVID, + 0, + FALSE, + &BootVidDevice); - return Status; + return Status; } diff --git a/reactos/drivers/dd/bootvid/bootvid.h b/reactos/drivers/dd/bootvid/bootvid.h new file mode 100644 index 00000000000..4610fcf4e8f --- /dev/null +++ b/reactos/drivers/dd/bootvid/bootvid.h @@ -0,0 +1,124 @@ +/* + * ReactOS Boot video driver + * + * Copyright (C) 2003 Casper S. Hornstroup + * Copyright (C) 2004 Filip Navara + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Id: bootvid.h,v 1.1 2004/03/04 18:55:09 navaraf Exp $ + */ + +#ifndef _BOOTVID_H +#define _BOOTVID_H + +#define PALETTE_FADE_STEPS 20 +#define PALETTE_FADE_TIME 20 * 10000 /* 20ms */ + +/* + * Windows Bitmap structures + */ + +#define RT_BITMAP 2 + +typedef struct tagRGBQUAD +{ + unsigned char rgbBlue; + unsigned char rgbGreen; + unsigned char rgbRed; + unsigned char rgbReserved; +} RGBQUAD, *PRGBQUAD; + +typedef long FXPT2DOT30; + +typedef struct tagCIEXYZ +{ + FXPT2DOT30 ciexyzX; + FXPT2DOT30 ciexyzY; + FXPT2DOT30 ciexyzZ; +} CIEXYZ, *LPCIEXYZ; + +typedef struct tagCIEXYZTRIPLE +{ + CIEXYZ ciexyzRed; + CIEXYZ ciexyzGreen; + CIEXYZ ciexyzBlue; +} CIEXYZTRIPLE, *LPCIEXYZTRIPLE; + +typedef struct { + DWORD bV5Size; + LONG bV5Width; + LONG bV5Height; + WORD bV5Planes; + WORD bV5BitCount; + DWORD bV5Compression; + DWORD bV5SizeImage; + LONG bV5XPelsPerMeter; + LONG bV5YPelsPerMeter; + DWORD bV5ClrUsed; + DWORD bV5ClrImportant; + DWORD bV5RedMask; + DWORD bV5GreenMask; + DWORD bV5BlueMask; + DWORD bV5AlphaMask; + DWORD bV5CSType; + CIEXYZTRIPLE bV5Endpoints; + DWORD bV5GammaRed; + DWORD bV5GammaGreen; + DWORD bV5GammaBlue; + DWORD bV5Intent; + DWORD bV5ProfileData; + DWORD bV5ProfileSize; + DWORD bV5Reserved; +} BITMAPV5HEADER, *PBITMAPV5HEADER; + +/* + * Private driver structures + */ + +typedef struct { + ULONG r; + ULONG g; + ULONG b; +} FADER_PALETTE_ENTRY; + +typedef struct _VGA_REGISTERS +{ + UCHAR CRT[24]; + UCHAR Attribute[21]; + UCHAR Graphics[9]; + UCHAR Sequencer[5]; + UCHAR Misc; +} VGA_REGISTERS, *PVGA_REGISTERS; + +/* VGA registers */ +#define MISC (PUCHAR)0x3c2 +#define SEQ (PUCHAR)0x3c4 +#define SEQDATA (PUCHAR)0x3c5 +#define CRTC (PUCHAR)0x3d4 +#define CRTCDATA (PUCHAR)0x3d5 +#define GRAPHICS (PUCHAR)0x3ce +#define GRAPHICSDATA (PUCHAR)0x3cf +#define ATTRIB (PUCHAR)0x3c0 +#define STATUS (PUCHAR)0x3da +#define PELMASK (PUCHAR)0x3c6 +#define PELINDEX (PUCHAR)0x3c8 +#define PELDATA (PUCHAR)0x3c9 + +/* In pixelsups.S */ +extern VOID +InbvPutPixels(int x, int y, unsigned long c); + +#endif /* _BOOTVID_H */ diff --git a/reactos/drivers/dd/bootvid/pixelsup_i386.S b/reactos/drivers/dd/bootvid/pixelsup_i386.S index 72efbb008ce..95f42537c1a 100644 --- a/reactos/drivers/dd/bootvid/pixelsup_i386.S +++ b/reactos/drivers/dd/bootvid/pixelsup_i386.S @@ -1,4 +1,4 @@ -/* $Id: pixelsup_i386.S,v 1.1 2003/08/24 12:11:13 dwelch Exp $ +/* $Id: pixelsup_i386.S,v 1.2 2004/03/04 18:55:09 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -52,44 +52,47 @@ _InbvPutPixels: .nomask: /* Compute offset in video memory and put it in EBX - offset = (x >> 3) + y80[y]; */ + offset = (x >> 3) + (y << 4) + (y << 6); */ movl 0xC(%ebp), %esi /* y */ - movl _y80(,%esi, 4), %ebx + movl %esi, %ebx + shll $0x6, %ebx + shll $0x4, %esi + addl %esi, %ebx movl 0x8(%ebp), %eax /* x */ shrl $0x3, %eax addl %eax, %ebx /* Latch first byte - (UCHAR) READ_REGISTER_UCHAR(vidmem + offset+0); */ - movl (_vidmem), %esi + (UCHAR) READ_REGISTER_UCHAR(VideoMemory + offset+0); */ + movl (_VideoMemory), %esi addl %ebx, %esi movb 0x0(%esi), %bl /* Write color index for first pixel - *((PUCHAR)(vidmem + offset+0)) = (c >> 0*8) & 0xff; */ + *((PUCHAR)(VideoMemory + offset+0)) = (c >> 0*8) & 0xff; */ movl 0x10(%ebp), %eax movb %al, 0x0(%esi) /* Latch second byte - (UCHAR) READ_REGISTER_UCHAR(vidmem + offset+1); */ + (UCHAR) READ_REGISTER_UCHAR(VideoMemory + offset+1); */ movb 0x1(%esi), %bl /* Write color index for second pixel - *((PUCHAR)(vidmem + offset+1)) = (c >> 1*8) & 0xff; */ + *((PUCHAR)(VideoMemory + offset+1)) = (c >> 1*8) & 0xff; */ shrl $0x8, %eax movb %al, 0x1(%esi) /* Latch third byte - (UCHAR) READ_REGISTER_UCHAR(vidmem + offset+2); */ + (UCHAR) READ_REGISTER_UCHAR(VideoMemory + offset+2); */ movb 0x2(%esi), %bl /* Write color index for third pixel - *((PUCHAR)(vidmem + offset+2)) = (c >> 2*8) & 0xff; */ + *((PUCHAR)(VideoMemory + offset+2)) = (c >> 2*8) & 0xff; */ shrl $0x8, %eax movb %al, 0x2(%esi) /* Latch fourth byte - (UCHAR) READ_REGISTER_UCHAR(vidmem + offset+3); */ + (UCHAR) READ_REGISTER_UCHAR(VideoMemory + offset+3); */ movb 0x3(%esi), %bl /* Write color index for fourth pixel - *((PUCHAR)(vidmem + offset+3)) = (c >> 3*8) & 0xff; */ + *((PUCHAR)(VideoMemory + offset+3)) = (c >> 3*8) & 0xff; */ shrl $0x8, %eax movb %al, 0x3(%esi) From 5bc9888562688d9c4c484a541974461c0bb65a07 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Thu, 4 Mar 2004 18:55:44 +0000 Subject: [PATCH 0323/1463] Enable the rest of the stubs needed to get Hello-WinCE working. No the hello world app still doesnt work. Only the messagebox app works. svn path=/trunk/; revision=8535 --- reactos/lib/coredll/coredll.def | 54 ++++++++++++++++----------------- reactos/lib/coredll/coredll.edf | 54 ++++++++++++++++----------------- 2 files changed, 54 insertions(+), 54 deletions(-) diff --git a/reactos/lib/coredll/coredll.def b/reactos/lib/coredll/coredll.def index 0cc8779f7c4..0d5b5615874 100644 --- a/reactos/lib/coredll/coredll.def +++ b/reactos/lib/coredll/coredll.def @@ -83,7 +83,7 @@ EXPORTS ;_BatteryGetLifeTimeInfo @713 ;_BatteryNotifyOfTimeChange @714 ;_BeginDeferWindowPos @1157 -;_BeginPaint @260 +_BeginPaint @260 ;_BinaryCompress @593 ;_BinaryDecompress @594 ;_BitBlt @903 @@ -228,7 +228,7 @@ EXPORTS ;_CreateSolidBrush @931 ;_CreateStaticMapping @1539 ;_CreateThread @492 -;_CreateWindowExW @246 +_CreateWindowExW @246 ;_CryptAcquireContextW @126 ;_CryptContextAddRef @154 ;_CryptCreateHash @137 @@ -270,7 +270,7 @@ EXPORTS ;_DebugActiveProcess @505 ;_DebugNotify @642 ;_DefDlgProcW @689 -;_DefWindowProcW @264 +_DefWindowProcW @264 ;_DeferWindowPos @1158 ;_DeleteAndRenameFile @183 ;_DeleteCriticalSection @3 @@ -290,19 +290,19 @@ EXPORTS ;_DestroyCursor @724 ;_DestroyIcon @725 ;_DestroyMenu @844 -;_DestroyWindow @265 +_DestroyWindow @265 ;_DeviceIoControl @179 ;_DevicePowerNotify @1588 -;_DialogBoxIndirectParamW @690 +_DialogBoxIndirectParamW @690 ;_DisableCaretSystemWide @666 ;_DisableThreadLibraryCalls @1232 -;_DispatchMessageW @859 +_DispatchMessageW @859 ;_DrawEdge @932 ;_DrawFocusRect @933 ;_DrawFrameControl @987 ;_DrawIconEx @726 ;_DrawMenuBar @856 -;_DrawTextW @945 +_DrawTextW @945 ;_DumpFileSystemHeap @341 ;_DumpKCallProfile @510 ;_DuplicateHandle @1535 @@ -314,10 +314,10 @@ EXPORTS ;_EnableMenuItem @847 ;_EnableWindow @287 ;_EndDeferWindowPos @1159 -;_EndDialog @691 +_EndDialog @691 ;_EndDoc @959 ;_EndPage @960 -;_EndPaint @261 +_EndPaint @261 ;_EnterCriticalSection @4 ;_EnumCalendarInfoW @206 ;_EnumClipboardFormats @675 @@ -358,7 +358,7 @@ EXPORTS ;_FindNextChangeNotification @1683 ;_FindNextFileW @181 ;_FindResource @531 -;_FindResourceW @532 +_FindResourceW @532 ;_FindWindowW @286 ;_FlushFileBuffers @175 ;_FlushInstructionCache @508 @@ -392,7 +392,7 @@ EXPORTS ;_GetClassLong @881 ;_GetClassLongW @879 ;_GetClassNameW @283 -;_GetClientRect @249 +_GetClientRect @249 ;_GetClipBox @971 ;_GetClipCursor @732 ;_GetClipRgn @972 @@ -461,7 +461,7 @@ EXPORTS ;_GetMessagePos @862 ;_GetMessageQueueReadyTimeStamp @1477 ;_GetMessageSource @872 -;_GetMessageW @861 +_GetMessageW @861 ;_GetMessageWNoWait @863 ;_GetModuleFileNameW @537 ;_GetModuleHandleW @1177 @@ -480,7 +480,7 @@ EXPORTS ;_GetOpenFileNameW @488 ;_GetOwnerProcess @606 ;_GetPaletteEntries @949 -;_GetParent @269 +_GetParent @269 ;_GetPasswordActive @239 ;_GetPasswordStatus @1538 ;_GetPixel @936 @@ -506,7 +506,7 @@ EXPORTS ;_GetServiceByIndex @1513 ;_GetServiceHandle @1518 ;_GetStdioPathW @1149 -;_GetStockObject @919 +_GetStockObject @919 ;_GetStoreInformation @323 ;_GetStringTypeExW @217 ;_GetStringTypeW @216 @@ -547,7 +547,7 @@ EXPORTS ;_GetWindow @251 ;_GetWindowDC @270 ;_GetWindowLongW @259 -;_GetWindowRect @248 +_GetWindowRect @248 ;_GetWindowRgn @1399 ;_GetWindowTextLengthW @276 ;_GetWindowTextW @257 @@ -703,22 +703,22 @@ EXPORTS ;_LeaveCritSec @597 ;_LeaveCriticalSection @5 ;_LineTo @1652 -;_LoadAcceleratorsW @94 +_LoadAcceleratorsW @94 ;_LoadAnimatedCursor @1493 ;_LoadBitmapW @873 ;_LoadCursorW @683 ;_LoadDriver @626 ;_LoadFSD @237 ;_LoadFSDEx @1421 -;_LoadIconW @728 +_LoadIconW @728 ;_LoadImageW @730 ;_LoadIntChainHandler @1475 ;_LoadKernelLibrary @1671 ;_LoadLibraryExW @1241 ;_LoadLibraryW @528 ;_LoadMenuW @846 -;_LoadResource @533 -;_LoadStringW @874 +_LoadResource @533 +_LoadStringW @874 ;_LocalAlloc @33 ;_LocalAllocInProcess @41 ;_LocalFileTimeToFileTime @22 @@ -793,7 +793,7 @@ _MessageBoxW @858 ;_Polyline @940 ;_PostKeybdMessage @832 ;_PostMessageW @865 -;_PostQuitMessage @866 +_PostQuitMessage @866 ;_PostThreadMessageW @290 ;_PowerOffSystem @617 ;_PrintTrackedItem @580 @@ -843,7 +843,7 @@ _MessageBoxW @858 ;_RegisterAFSEx @1490 ;_RegisterAFSName @338 ;_RegisterAPISet @635 -;_RegisterClassW @95 +_RegisterClassW @95 ;_RegisterClassWStub @883 ;_RegisterClipboardFormatW @673 ;_RegisterDbgZones @546 @@ -993,7 +993,7 @@ _MessageBoxW @858 ;_SetViewportOrgEx @983 ;_SetWDevicePowerHandler @1178 ;_SetWindowLongW @258 -;_SetWindowPos @247 +_SetWindowPos @247 ;_SetWindowRgn @1398 ;_SetWindowTextW @256 ;_SetWindowsHookExW @1202 @@ -1003,7 +1003,7 @@ _MessageBoxW @858 ;_Shell_NotifyIcon @481 ;_ShowCaret @661 ;_ShowCursor @737 -;_ShowWindow @266 +_ShowWindow @266 ;_SignalStarted @639 ;_SizeofResource @534 ;_Sleep @496 @@ -1038,9 +1038,9 @@ _MessageBoxW @858 ;_TlsSetValue @16 ;_TouchCalibrate @877 ;_TrackPopupMenuEx @845 -;_TranslateAcceleratorW @838 +_TranslateAcceleratorW @838 ;_TranslateCharsetInfo @1166 -;_TranslateMessage @870 +_TranslateMessage @870 ;_TransmitCommChar @121 ;_TransparentImage @906 ;_TryEnterCriticalSection @1233 @@ -1059,7 +1059,7 @@ _MessageBoxW @858 ;_UnregisterFunc1 @1156 ;_UnregisterHotKey @836 ;_UpdateNLSInfo @1447 -;_UpdateWindow @267 +_UpdateWindow @267 ;_ValidateRect @278 ;_ValidateRgn @1616 ;_VerQueryValueW @1459 @@ -1386,7 +1386,7 @@ __except_handler3 @84 ;_wcscmp @60 ;_wcscpy @61 ;_wcscspn @62 -;_wcslen @63 +_wcslen @63 ;_wcsncat @64 ;_wcsncmp @65 ;_wcsncpy @66 diff --git a/reactos/lib/coredll/coredll.edf b/reactos/lib/coredll/coredll.edf index c896c4727ce..0d18aad248f 100644 --- a/reactos/lib/coredll/coredll.edf +++ b/reactos/lib/coredll/coredll.edf @@ -83,7 +83,7 @@ EXPORTS ;_BatteryGetLifeTimeInfo @713 ;_BatteryNotifyOfTimeChange @714 ;_BeginDeferWindowPos @1157 -;_BeginPaint @260 +_BeginPaint=user32.BeginPaint @260 ;_BinaryCompress @593 ;_BinaryDecompress @594 ;_BitBlt @903 @@ -228,7 +228,7 @@ EXPORTS ;_CreateSolidBrush @931 ;_CreateStaticMapping @1539 ;_CreateThread @492 -;_CreateWindowExW @246 +_CreateWindowExW=user32.CreateWindowExW @246 ;_CryptAcquireContextW @126 ;_CryptContextAddRef @154 ;_CryptCreateHash @137 @@ -270,7 +270,7 @@ EXPORTS ;_DebugActiveProcess @505 ;_DebugNotify @642 ;_DefDlgProcW @689 -;_DefWindowProcW @264 +_DefWindowProcW=user32.DefWindowProcW @264 ;_DeferWindowPos @1158 ;_DeleteAndRenameFile @183 ;_DeleteCriticalSection @3 @@ -290,19 +290,19 @@ EXPORTS ;_DestroyCursor @724 ;_DestroyIcon @725 ;_DestroyMenu @844 -;_DestroyWindow @265 +_DestroyWindow=user32.DestroyWindow @265 ;_DeviceIoControl @179 ;_DevicePowerNotify @1588 -;_DialogBoxIndirectParamW @690 +_DialogBoxIndirectParamW=user32.DialogBoxIndirectParamW @690 ;_DisableCaretSystemWide @666 ;_DisableThreadLibraryCalls @1232 -;_DispatchMessageW @859 +_DispatchMessageW=user32.DispatchMessageW @859 ;_DrawEdge @932 ;_DrawFocusRect @933 ;_DrawFrameControl @987 ;_DrawIconEx @726 ;_DrawMenuBar @856 -;_DrawTextW @945 +_DrawTextW=user32.DrawTextW @945 ;_DumpFileSystemHeap @341 ;_DumpKCallProfile @510 ;_DuplicateHandle @1535 @@ -314,10 +314,10 @@ EXPORTS ;_EnableMenuItem @847 ;_EnableWindow @287 ;_EndDeferWindowPos @1159 -;_EndDialog @691 +_EndDialog=user32.EndDialog @691 ;_EndDoc @959 ;_EndPage @960 -;_EndPaint @261 +_EndPaint=user32.EndPaint @261 ;_EnterCriticalSection @4 ;_EnumCalendarInfoW @206 ;_EnumClipboardFormats @675 @@ -358,7 +358,7 @@ EXPORTS ;_FindNextChangeNotification @1683 ;_FindNextFileW @181 ;_FindResource @531 -;_FindResourceW @532 +_FindResourceW=kernel32.FindResourceW @532 ;_FindWindowW @286 ;_FlushFileBuffers @175 ;_FlushInstructionCache @508 @@ -392,7 +392,7 @@ EXPORTS ;_GetClassLong @881 ;_GetClassLongW @879 ;_GetClassNameW @283 -;_GetClientRect @249 +_GetClientRect=user32.GetClientRect @249 ;_GetClipBox @971 ;_GetClipCursor @732 ;_GetClipRgn @972 @@ -461,7 +461,7 @@ EXPORTS ;_GetMessagePos @862 ;_GetMessageQueueReadyTimeStamp @1477 ;_GetMessageSource @872 -;_GetMessageW @861 +_GetMessageW=user32.GetMessageW @861 ;_GetMessageWNoWait @863 ;_GetModuleFileNameW @537 ;_GetModuleHandleW @1177 @@ -480,7 +480,7 @@ EXPORTS ;_GetOpenFileNameW @488 ;_GetOwnerProcess @606 ;_GetPaletteEntries @949 -;_GetParent @269 +_GetParent=user32.GetParent @269 ;_GetPasswordActive @239 ;_GetPasswordStatus @1538 ;_GetPixel @936 @@ -506,7 +506,7 @@ EXPORTS ;_GetServiceByIndex @1513 ;_GetServiceHandle @1518 ;_GetStdioPathW @1149 -;_GetStockObject @919 +_GetStockObject=gdi32.GetStockObject @919 ;_GetStoreInformation @323 ;_GetStringTypeExW @217 ;_GetStringTypeW @216 @@ -547,7 +547,7 @@ EXPORTS ;_GetWindow @251 ;_GetWindowDC @270 ;_GetWindowLongW @259 -;_GetWindowRect @248 +_GetWindowRect=user32.GetWindowRect @248 ;_GetWindowRgn @1399 ;_GetWindowTextLengthW @276 ;_GetWindowTextW @257 @@ -703,22 +703,22 @@ EXPORTS ;_LeaveCritSec @597 ;_LeaveCriticalSection @5 ;_LineTo @1652 -;_LoadAcceleratorsW @94 +_LoadAcceleratorsW=user32.LoadAcceleratorsW @94 ;_LoadAnimatedCursor @1493 ;_LoadBitmapW @873 ;_LoadCursorW @683 ;_LoadDriver @626 ;_LoadFSD @237 ;_LoadFSDEx @1421 -;_LoadIconW @728 +_LoadIconW=user32.LoadIconW @728 ;_LoadImageW @730 ;_LoadIntChainHandler @1475 ;_LoadKernelLibrary @1671 ;_LoadLibraryExW @1241 ;_LoadLibraryW @528 ;_LoadMenuW @846 -;_LoadResource @533 -;_LoadStringW @874 +_LoadResource=kernel32.LoadResource @533 +_LoadStringW=user32.LoadStringW @874 ;_LocalAlloc @33 ;_LocalAllocInProcess @41 ;_LocalFileTimeToFileTime @22 @@ -793,7 +793,7 @@ _MessageBoxW=user32.MessageBoxW @858 ;_Polyline @940 ;_PostKeybdMessage @832 ;_PostMessageW @865 -;_PostQuitMessage @866 +_PostQuitMessage=user32.PostQuitMessage @866 ;_PostThreadMessageW @290 ;_PowerOffSystem @617 ;_PrintTrackedItem @580 @@ -843,7 +843,7 @@ _MessageBoxW=user32.MessageBoxW @858 ;_RegisterAFSEx @1490 ;_RegisterAFSName @338 ;_RegisterAPISet @635 -;_RegisterClassW @95 +_RegisterClassW=user32.RegisterClassW @95 ;_RegisterClassWStub @883 ;_RegisterClipboardFormatW @673 ;_RegisterDbgZones @546 @@ -993,7 +993,7 @@ _MessageBoxW=user32.MessageBoxW @858 ;_SetViewportOrgEx @983 ;_SetWDevicePowerHandler @1178 ;_SetWindowLongW @258 -;_SetWindowPos @247 +_SetWindowPos=user32.SetWindowPos @247 ;_SetWindowRgn @1398 ;_SetWindowTextW @256 ;_SetWindowsHookExW @1202 @@ -1003,7 +1003,7 @@ _MessageBoxW=user32.MessageBoxW @858 ;_Shell_NotifyIcon @481 ;_ShowCaret @661 ;_ShowCursor @737 -;_ShowWindow @266 +_ShowWindow=user32.ShowWindow @266 ;_SignalStarted @639 ;_SizeofResource @534 ;_Sleep @496 @@ -1038,9 +1038,9 @@ _MessageBoxW=user32.MessageBoxW @858 ;_TlsSetValue @16 ;_TouchCalibrate @877 ;_TrackPopupMenuEx @845 -;_TranslateAcceleratorW @838 +_TranslateAcceleratorW=user32.TranslateAcceleratorW @838 ;_TranslateCharsetInfo @1166 -;_TranslateMessage @870 +_TranslateMessage=user32.TranslateMessage @870 ;_TransmitCommChar @121 ;_TransparentImage @906 ;_TryEnterCriticalSection @1233 @@ -1059,7 +1059,7 @@ _MessageBoxW=user32.MessageBoxW @858 ;_UnregisterFunc1 @1156 ;_UnregisterHotKey @836 ;_UpdateNLSInfo @1447 -;_UpdateWindow @267 +_UpdateWindow=user32.UpdateWindow @267 ;_ValidateRect @278 ;_ValidateRgn @1616 ;_VerQueryValueW @1459 @@ -1386,7 +1386,7 @@ __except_handler3=msvcrt._except_handler3 @84 ;_wcscmp @60 ;_wcscpy @61 ;_wcscspn @62 -;_wcslen @63 +_wcslen=msvcrt.wcslen @63 ;_wcsncat @64 ;_wcsncmp @65 ;_wcsncpy @66 From 0d2b52fb767c2005b15d122f3f8ec42f5489013a Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Thu, 4 Mar 2004 19:00:44 +0000 Subject: [PATCH 0324/1463] Added .cvsignore I forgot about. svn path=/trunk/; revision=8536 --- reactos/lib/commctrl/.cvsignore | 8 ++++++++ reactos/lib/coredll/.cvsignore | 8 ++++++++ 2 files changed, 16 insertions(+) create mode 100644 reactos/lib/commctrl/.cvsignore create mode 100644 reactos/lib/coredll/.cvsignore diff --git a/reactos/lib/commctrl/.cvsignore b/reactos/lib/commctrl/.cvsignore new file mode 100644 index 00000000000..9103a525d39 --- /dev/null +++ b/reactos/lib/commctrl/.cvsignore @@ -0,0 +1,8 @@ +*.coff +*.dll +*.d +*.a +*.o +*.sym +*.map +*.tmp diff --git a/reactos/lib/coredll/.cvsignore b/reactos/lib/coredll/.cvsignore new file mode 100644 index 00000000000..9103a525d39 --- /dev/null +++ b/reactos/lib/coredll/.cvsignore @@ -0,0 +1,8 @@ +*.coff +*.dll +*.d +*.a +*.o +*.sym +*.map +*.tmp From 318a90741d72a285fe673caaff307127bc5edc4b Mon Sep 17 00:00:00 2001 From: Casper Hornstrup <chorns@users.sourceforge.net> Date: Thu, 4 Mar 2004 20:45:39 +0000 Subject: [PATCH 0325/1463] 2004-03-04 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/net/tcpip/tcpip/i386: New directory. * drivers/net/tcpip/tcpip/i386/checksum.S: New file. * drivers/net/tcpip/notes.txt: New file. * drivers/net/afd/afd/dispatch.c (AfdDispCompleteListen): Signal ACCEPT network event. (AfdDispEventSelect): Reference event handle. * drivers/net/afd/afd/tdi.c (TdiListen): Remove unused event. Move Iosb and RequestConnectionInfo to AFD_LISTEN_REQUEST structure. * drivers/net/afd/include/afd.h (AFDFCB): Replace EventObjects with EventObject of type PKEVENT. * drivers/net/tcpip/makefile (ARCH_OBJECTS): New variable. (TARGET_OBJECTS): Add ARCH_OBJECTS. * drivers/net/tcpip/include/address.h (AddrCloneAddress): New prototype. * drivers/net/tcpip/include/checksum.h (ChecksumFold, csum_partial): New prototype. (TCPv4Checksum): New macro. (CorrectChecksum): Rename to IPv4CorrectChecksum. (TCPv4CorrectChecksum): New macro. * drivers/net/tcpip/include/ip.h (IPv4_DF_MASK): New constant. * drivers/net/tcpip/include/tcp.h (TCP_XXX): Correct constants. (TCPCreateSegment, TCPFreeSegment, TCPAddSegment): Prototype. * drivers/net/tcpip/include/titypes.h (TCP_SEND_REQUEST): Add SequenceNumber and AckNumber. (TCP_SEGMENT): New structure. (CONNECTION_ENDPOINT): Add ListenRequest and ReceivedSegments. * drivers/net/tcpip/network/transmit.c (SendFragments): Release memory for Data on failure. * drivers/net/tcpip/tcpip/address.c (AddrCloneAddress): New function. * drivers/net/tcpip/tcpip/checksum.c (ChecksumFold): Factor out folding from ChecksumCompute. * drivers/net/tcpip/tcpip/dispatch.c (DispTdiListen): Support asynchronous operation. * drivers/net/tcpip/tcpip/fileobjs.c (FileOpenAddress): Don't cast to PTDI_ADDRESS_IP. Initialize ReceivedSegments. * drivers/net/tcpip/tcpip/routines.c (DisplayIPHeader): New function. (DisplayIPPacket): Call DisplayIPHeader(). (DisplayTCPHeader): Change format strings. * drivers/net/tcpip/transport/tcp/tcp.c (IPIdentification, TCPSegmentList): Add. (TCPCreateSegment, TCPFreeSegment, TCPAddSegment, TCPBuildAndTransmitSendRequest2, TCPiSelectISS, TCPiReceiveListen, TCPiReceiveSynSent, TCPiReceiveSynReceived, TCPiReceiveData): New function. (TCPiBuildPacket): Build segment. (TCPStartup): Initialize TCPSegmentList. (TCPShutdown): Cleanup TCPSegmentList. svn path=/trunk/; revision=8537 --- reactos/ChangeLog | 50 + reactos/drivers/net/afd/afd/dispatch.c | 62 +- reactos/drivers/net/afd/afd/tdi.c | 39 +- reactos/drivers/net/afd/include/afd.h | 6 +- reactos/drivers/net/tcpip/include/address.h | 3 + reactos/drivers/net/tcpip/include/checksum.h | 29 +- reactos/drivers/net/tcpip/include/ip.h | 9 +- reactos/drivers/net/tcpip/include/tcp.h | 63 +- reactos/drivers/net/tcpip/include/titypes.h | 26 +- reactos/drivers/net/tcpip/makefile | 6 +- reactos/drivers/net/tcpip/network/icmp.c | 2 +- reactos/drivers/net/tcpip/network/receive.c | 2 +- reactos/drivers/net/tcpip/network/transmit.c | 6 +- reactos/drivers/net/tcpip/notes.txt | 27 + reactos/drivers/net/tcpip/tcpip/address.c | 27 +- reactos/drivers/net/tcpip/tcpip/checksum.c | 47 +- reactos/drivers/net/tcpip/tcpip/dispatch.c | 58 +- reactos/drivers/net/tcpip/tcpip/fileobjs.c | 7 +- .../drivers/net/tcpip/tcpip/i386/checksum.S | 249 ++++ reactos/drivers/net/tcpip/tcpip/routines.c | 65 +- reactos/drivers/net/tcpip/transport/tcp/tcp.c | 1134 +++++++++++++---- reactos/lib/msafd/include/msafd.h | 7 + reactos/lib/msafd/misc/dllmain.c | 62 +- 23 files changed, 1577 insertions(+), 409 deletions(-) create mode 100644 reactos/drivers/net/tcpip/notes.txt create mode 100644 reactos/drivers/net/tcpip/tcpip/i386/checksum.S diff --git a/reactos/ChangeLog b/reactos/ChangeLog index a2ad4d45f3b..df43974f9f6 100644 --- a/reactos/ChangeLog +++ b/reactos/ChangeLog @@ -1,3 +1,53 @@ +2004-03-04 Casper S. Hornstrup <chorns@users.sourceforge.net> + + * drivers/net/tcpip/tcpip/i386: New directory. + * drivers/net/tcpip/tcpip/i386/checksum.S: New file. + * drivers/net/tcpip/notes.txt: New file. + * drivers/net/afd/afd/dispatch.c (AfdDispCompleteListen): Signal ACCEPT + network event. + (AfdDispEventSelect): Reference event handle. + * drivers/net/afd/afd/tdi.c (TdiListen): Remove unused event. + Move Iosb and RequestConnectionInfo to AFD_LISTEN_REQUEST structure. + * drivers/net/afd/include/afd.h (AFDFCB): Replace EventObjects with + EventObject of type PKEVENT. + * drivers/net/tcpip/makefile (ARCH_OBJECTS): New variable. + (TARGET_OBJECTS): Add ARCH_OBJECTS. + * drivers/net/tcpip/include/address.h (AddrCloneAddress): New prototype. + * drivers/net/tcpip/include/checksum.h (ChecksumFold, csum_partial): New + prototype. + (TCPv4Checksum): New macro. + (CorrectChecksum): Rename to IPv4CorrectChecksum. + (TCPv4CorrectChecksum): New macro. + * drivers/net/tcpip/include/ip.h (IPv4_DF_MASK): New constant. + * drivers/net/tcpip/include/tcp.h (TCP_XXX): Correct constants. + (TCPCreateSegment, TCPFreeSegment, TCPAddSegment): Prototype. + * drivers/net/tcpip/include/titypes.h (TCP_SEND_REQUEST): Add SequenceNumber + and AckNumber. + (TCP_SEGMENT): New structure. + (CONNECTION_ENDPOINT): Add ListenRequest and ReceivedSegments. + * drivers/net/tcpip/network/transmit.c (SendFragments): Release memory + for Data on failure. + * drivers/net/tcpip/tcpip/address.c (AddrCloneAddress): New function. + * drivers/net/tcpip/tcpip/checksum.c (ChecksumFold): Factor out folding + from ChecksumCompute. + * drivers/net/tcpip/tcpip/dispatch.c (DispTdiListen): Support asynchronous + operation. + * drivers/net/tcpip/tcpip/fileobjs.c (FileOpenAddress): Don't cast to + PTDI_ADDRESS_IP. + Initialize ReceivedSegments. + * drivers/net/tcpip/tcpip/routines.c (DisplayIPHeader): New function. + (DisplayIPPacket): Call DisplayIPHeader(). + (DisplayTCPHeader): Change format strings. + * drivers/net/tcpip/transport/tcp/tcp.c (IPIdentification, + TCPSegmentList): Add. + (TCPCreateSegment, TCPFreeSegment, TCPAddSegment, + TCPBuildAndTransmitSendRequest2, TCPiSelectISS, TCPiReceiveListen, + TCPiReceiveSynSent, TCPiReceiveSynReceived, TCPiReceiveData): New + function. + (TCPiBuildPacket): Build segment. + (TCPStartup): Initialize TCPSegmentList. + (TCPShutdown): Cleanup TCPSegmentList. + 2004-02-25 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/net/tcpip/datalink/loopback.c: Reformat. diff --git a/reactos/drivers/net/afd/afd/dispatch.c b/reactos/drivers/net/afd/afd/dispatch.c index d7cfdc2e708..f1dd9dcf33f 100644 --- a/reactos/drivers/net/afd/afd/dispatch.c +++ b/reactos/drivers/net/afd/afd/dispatch.c @@ -139,9 +139,25 @@ AfdDispCompleteListen( { PAFD_LISTEN_REQUEST ListenRequest = (PAFD_LISTEN_REQUEST) Context; - AFD_DbgPrint(MAX_TRACE, ("Called. ListenRequest (0x%X).\n", ListenRequest)); + /* FIXME: Protect ListenRequest->Fcb->ListenRequestQueue */ + RemoveEntryList(&ListenRequest->ListEntry); - AFD_DbgPrint(MAX_TRACE, ("Fcb (0x%X).\n", ListenRequest->Fcb)); + AFD_DbgPrint(MAX_TRACE, ("Completed ListenRequest at (0x%X).\n", ListenRequest)); + + if (NT_SUCCESS(ListenRequest->Iosb.Status)) + { + if (ListenRequest->Fcb->EventObject != NULL) + { + /* FIXME: Protect ListenRequest->Fcb */ + ListenRequest->Fcb->NetworkEvents.lNetworkEvents |= FD_ACCEPT; + ListenRequest->Fcb->NetworkEvents.iErrorCode[FD_ACCEPT_BIT] = NO_ERROR; + KeSetEvent(ListenRequest->Fcb->EventObject, EVENT_INCREMENT, FALSE); + } + } + + ExFreePool(ListenRequest->RequestConnectionInfo); + ListenRequest->RequestConnectionInfo = NULL; + ExFreePool(ListenRequest); return STATUS_SUCCESS; } @@ -197,14 +213,14 @@ NTSTATUS AfdDispListen( if (NT_SUCCESS(Status)) { - ListenRequest = ExAllocateFromNPagedLookasideList(&ListenRequestLookasideList); + ListenRequest = ExAllocateFromNPagedLookasideList(&ListenRequestLookasideList); if (ListenRequest != NULL) { ListenRequest->Fcb = FCB; /* FIXME: Protect ListenRequestQueue */ InsertTailList(&FCB->ListenRequestQueue, &ListenRequest->ListEntry); - Status = TdiListen(FCB->TdiConnectionObject, AfdDispCompleteListen, ListenRequest); + Status = TdiListen(ListenRequest, AfdDispCompleteListen, ListenRequest); if ((Status == STATUS_PENDING) || NT_SUCCESS(Status)) { if (Status != STATUS_PENDING) @@ -630,8 +646,8 @@ NTSTATUS AfdDispEventSelect( UINT OutputBufferLength; PFILE_REQUEST_EVENTSELECT Request; PFILE_REPLY_EVENTSELECT Reply; + PKEVENT Event; PAFDFCB FCB; - ULONG i; InputBufferLength = IrpSp->Parameters.DeviceIoControl.InputBufferLength; OutputBufferLength = IrpSp->Parameters.DeviceIoControl.OutputBufferLength; @@ -644,20 +660,32 @@ NTSTATUS AfdDispEventSelect( Request = (PFILE_REQUEST_EVENTSELECT)Irp->AssociatedIrp.SystemBuffer; Reply = (PFILE_REPLY_EVENTSELECT)Irp->AssociatedIrp.SystemBuffer; - FCB->NetworkEvents.lNetworkEvents = Request->lNetworkEvents; - for (i = 0; i < FD_MAX_EVENTS; i++) { - if ((Request->lNetworkEvents & (1 << i)) > 0) { - FCB->EventObjects[i] = Request->hEventObject; - } else { - /* The effect of any previous call to this function is cancelled */ - FCB->EventObjects[i] = (WSAEVENT)0; - } - } + /* FIXME: Need to ObDereferenceObject(FCB->EventObject) this somewhere */ + Status = ObReferenceObjectByHandle( + Request->hEventObject, + 0, + ExEventObjectType, + UserMode, + (PVOID*)&Event, + NULL); + if (NT_SUCCESS(Status)) { + FCB->NetworkEvents.lNetworkEvents = Request->lNetworkEvents; + FCB->EventObject = Event; + Reply->Status = NO_ERROR; + Status = STATUS_SUCCESS; + } + else + { + AFD_DbgPrint(MID_TRACE, ("Bad event handle (0x%X).\n", Status)); - Reply->Status = NO_ERROR; - Status = STATUS_SUCCESS; - } else + Reply->Status = WSAEINVAL; + Status = STATUS_SUCCESS; + } + } + else + { Status = STATUS_INVALID_PARAMETER; + } AFD_DbgPrint(MAX_TRACE, ("Status (0x%X).\n", Status)); diff --git a/reactos/drivers/net/afd/afd/tdi.c b/reactos/drivers/net/afd/afd/tdi.c index ad5602cc550..a2c6d8258f2 100644 --- a/reactos/drivers/net/afd/afd/tdi.c +++ b/reactos/drivers/net/afd/afd/tdi.c @@ -199,6 +199,7 @@ NTSTATUS TdiOpenAddressFileIPv4( EaInfo->EaValueLength = sizeof(TA_IP_ADDRESS); Address = (PTA_IP_ADDRESS)(EaInfo->EaName + TDI_TRANSPORT_ADDRESS_LENGTH + 1); /* 0-terminated */ TdiBuildAddressIPv4(Address, Name); + Status = TdiOpenDevice(DeviceName, EaLength, EaInfo, @@ -414,13 +415,13 @@ NTSTATUS TdiAssociateAddressFile( NTSTATUS TdiListen( - PFILE_OBJECT ConnectionObject, + PAFD_LISTEN_REQUEST ListenRequest, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext) /* * FUNCTION: Listen on a connection endpoint for a connection request from a remote peer * ARGUMENTS: - * ConnectionObject = Pointer to connection endpoint file object + * ListenRequest = Pointer to listen request object * CompletionRoutine = Routine to be called when IRP is completed * CompletionContext = Context for CompletionRoutine * RETURNS: @@ -428,35 +429,34 @@ NTSTATUS TdiListen( * May return STATUS_PENDING */ { - PTDI_CONNECTION_INFORMATION RequestConnectionInfo; - //PTDI_CONNECTION_INFORMATION ReturnConnectionInfo; + PFILE_OBJECT ConnectionObject; PDEVICE_OBJECT DeviceObject; - IO_STATUS_BLOCK Iosb; NTSTATUS Status; - KEVENT Event; PIRP Irp; AFD_DbgPrint(MAX_TRACE, ("Called\n")); + ConnectionObject = ListenRequest->Fcb->TdiConnectionObject; assert(ConnectionObject); DeviceObject = IoGetRelatedDeviceObject(ConnectionObject); - Status = TdiBuildNullConnectionInfo(&RequestConnectionInfo, TDI_ADDRESS_TYPE_IP); + Status = TdiBuildNullConnectionInfo(&ListenRequest->RequestConnectionInfo, + TDI_ADDRESS_TYPE_IP); if (!NT_SUCCESS(Status)) - return Status; - - KeInitializeEvent(&Event, NotificationEvent, FALSE); + return Status; Irp = TdiBuildInternalDeviceControlIrp(TDI_LISTEN, /* Sub function */ DeviceObject, /* Device object */ ConnectionObject, /* File object */ - &Event, /* Event */ - &Iosb); /* Status */ - if (!Irp) { - ExFreePool(RequestConnectionInfo); - return STATUS_INSUFFICIENT_RESOURCES; - } + NULL, /* Event */ + &ListenRequest->Iosb); /* Status */ + if (Irp == NULL) + { + ExFreePool(ListenRequest->RequestConnectionInfo); + ListenRequest->RequestConnectionInfo = NULL; + return STATUS_INSUFFICIENT_RESOURCES; + } TdiBuildListen(Irp, /* IRP */ DeviceObject, /* Device object */ @@ -464,13 +464,10 @@ NTSTATUS TdiListen( CompletionRoutine, /* Completion routine */ CompletionContext, /* Completion routine context */ 0, /* Flags */ - RequestConnectionInfo, /* Request connection information */ + ListenRequest->RequestConnectionInfo, /* Request connection information */ NULL /* ReturnConnectionInfo */); /* Return connection information */ - Status = TdiCall(Irp, DeviceObject, NULL /* Don't wait for completion */, &Iosb); - - ExFreePool(RequestConnectionInfo); - //ExFreePool(ReturnConnectionInfo); + Status = TdiCall(Irp, DeviceObject, NULL /* Don't wait for completion */, &ListenRequest->Iosb); return Status; } diff --git a/reactos/drivers/net/afd/include/afd.h b/reactos/drivers/net/afd/include/afd.h index 3c1fcb3cf83..c73c45a6568 100644 --- a/reactos/drivers/net/afd/include/afd.h +++ b/reactos/drivers/net/afd/include/afd.h @@ -75,7 +75,7 @@ typedef struct _AFDFCB { LIST_ENTRY ListenRequestQueue; /* For WSAEventSelect() */ WSANETWORKEVENTS NetworkEvents; - WSAEVENT EventObjects[FD_MAX_EVENTS]; + PKEVENT EventObject; } AFDFCB, *PAFDFCB; /* Socket states */ @@ -99,6 +99,8 @@ typedef struct _AFD_READ_REQUEST { typedef struct _AFD_LISTEN_REQUEST { LIST_ENTRY ListEntry; PAFDFCB Fcb; + PTDI_CONNECTION_INFORMATION RequestConnectionInfo; + IO_STATUS_BLOCK Iosb; } AFD_LISTEN_REQUEST, *PAFD_LISTEN_REQUEST; typedef struct IPSNMP_INFO { @@ -363,7 +365,7 @@ NTSTATUS TdiAssociateAddressFile( PFILE_OBJECT ConnectionObject); NTSTATUS TdiListen( - PFILE_OBJECT ConnectionObject, + PAFD_LISTEN_REQUEST Request, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext); diff --git a/reactos/drivers/net/tcpip/include/address.h b/reactos/drivers/net/tcpip/include/address.h index d3febb8f9e5..c93b6772115 100644 --- a/reactos/drivers/net/tcpip/include/address.h +++ b/reactos/drivers/net/tcpip/include/address.h @@ -61,6 +61,9 @@ BOOLEAN AddrIsEqualIPv4( PIP_ADDRESS AddrBuildIPv4( IPv4_RAW_ADDRESS Address); +PIP_ADDRESS AddrCloneAddress( + PIP_ADDRESS Address); + PADDRESS_ENTRY AddrLocateADEv4( IPv4_RAW_ADDRESS Address); diff --git a/reactos/drivers/net/tcpip/include/checksum.h b/reactos/drivers/net/tcpip/include/checksum.h index e23c0a5a81d..2157c50f797 100644 --- a/reactos/drivers/net/tcpip/include/checksum.h +++ b/reactos/drivers/net/tcpip/include/checksum.h @@ -8,20 +8,39 @@ #define __CHECKSUM_H +ULONG ChecksumFold( + ULONG Sum); + ULONG ChecksumCompute( PVOID Data, UINT Count, ULONG Seed); -#define IPv4Checksum(Data, Count, Seed)(ChecksumCompute(Data, Count, Seed)) +unsigned int +csum_partial( + const unsigned char * buff, + int len, + unsigned int sum); + +#define IPv4Checksum(Data, Count, Seed)(~ChecksumFold(ChecksumCompute(Data, Count, Seed))) +#define TCPv4Checksum(Data, Count, Seed)(~ChecksumFold(csum_partial(Data, Count, Seed))) +//#define TCPv4Checksum(Data, Count, Seed)(~ChecksumFold(ChecksumCompute(Data, Count, Seed))) /* * Macro to check for a correct checksum - * BOOLEAN CorrectChecksum(PVOID Data, UINT Count) + * BOOLEAN IPv4CorrectChecksum(PVOID Data, UINT Count) */ -#define CorrectChecksum(Data, Count) \ +#define IPv4CorrectChecksum(Data, Count) \ (BOOLEAN)(IPv4Checksum(Data, Count, 0) == DH2N(0x0000FFFF)) -#endif /* __CHECKSUM_H */ +/* + * Macro to check for a correct checksum + * BOOLEAN TCPv4CorrectChecksum(PTCPv4_PSEUDO_HEADER TcpPseudoHeader, + * PVOID Data, UINT Count) + */ +#define TCPv4CorrectChecksum(TcpPseudoHeader, Data, Count) \ + (BOOLEAN)(TCPv4Checksum(Data, Count, \ + TCPv4Checksum(TcpPseudoHeader, sizeof(TCPv4_PSEUDO_HEADER), \ + 0)) == DH2N(0x0000FFFF)) -/* EOF */ +#endif /* __CHECKSUM_H */ diff --git a/reactos/drivers/net/tcpip/include/ip.h b/reactos/drivers/net/tcpip/include/ip.h index e7e6983ad90..81670ac507a 100644 --- a/reactos/drivers/net/tcpip/include/ip.h +++ b/reactos/drivers/net/tcpip/include/ip.h @@ -49,8 +49,9 @@ typedef struct IPv4_HEADER { IPv4_RAW_ADDRESS DstAddr; /* Destination Address */ } IPv4_HEADER, *PIPv4_HEADER; -#define IPv4_FRAGOFS_MASK 0x1FFF -#define IPv4_MF_MASK 0x2000 +#define IPv4_FRAGOFS_MASK 0x1FFF /* Fragment offset mask (host byte order) */ +#define IPv4_MF_MASK 0x2000 /* More fragments (host byte order) */ +#define IPv4_DF_MASK 0x4000 /* Don't fragment (host byte order) */ #define IPv4_MAX_HEADER_SIZE 60 /* Packet completion handler prototype */ @@ -60,7 +61,7 @@ typedef VOID (*PACKET_COMPLETION_ROUTINE)( NDIS_STATUS NdisStatus); /* Structure for an IP packet */ -typedef struct IP_PACKET { +typedef struct _IP_PACKET { DEFINE_TAG ULONG RefCount; /* Reference count for this object */ OBJECT_FREE_ROUTINE Free; /* Routine used to free resources for the object */ @@ -81,7 +82,7 @@ typedef struct IP_PACKET { /* Packet context */ -typedef struct PACKET_CONTEXT { +typedef struct _PACKET_CONTEXT { PACKET_COMPLETION_ROUTINE Complete; /* Transport level completion handler */ PVOID Context; /* Context information for handler */ PACKET_COMPLETION_ROUTINE DLComplete; /* Data link level completion handler. Also diff --git a/reactos/drivers/net/tcpip/include/tcp.h b/reactos/drivers/net/tcpip/include/tcp.h index edadae3a364..949dee73950 100644 --- a/reactos/drivers/net/tcpip/include/tcp.h +++ b/reactos/drivers/net/tcpip/include/tcp.h @@ -7,27 +7,26 @@ #ifndef __TCP_H #define __TCP_H - /* TCPv4 header structure */ -typedef struct TCP_HEADER { - USHORT SourcePort; /* Source port */ - USHORT DestPort; /* Destination port */ - USHORT SeqNum; /* Sequence number */ - USHORT AckNum; /* Acknowledgment number */ - UCHAR DataOfs; /* Data offset (leftmost 4 bits) */ - UCHAR Flags; /* Control bits (rightmost 6 bits) */ - USHORT Window; /* Maximum acceptable receive window */ - USHORT Checksum; /* Checksum of segment */ - USHORT Urgent; /* Pointer to urgent data */ -} __attribute__((packed)) TCP_HEADER, *PTCP_HEADER; +typedef struct TCPv4_HEADER { + USHORT SourcePort; /* Source port */ + USHORT DestinationPort; /* Destination port */ + ULONG SequenceNumber; /* Sequence number */ + ULONG AckNumber; /* Acknowledgement number */ + UCHAR DataOffset; /* Data offset; 32-bit words (leftmost 4 bits) */ + UCHAR Flags; /* Control bits (rightmost 6 bits) */ + USHORT Window; /* Maximum acceptable receive window */ + USHORT Checksum; /* Checksum of segment */ + USHORT Urgent; /* Pointer to urgent data */ +} __attribute__((packed)) TCPv4_HEADER, *PTCPv4_HEADER; /* TCPv4 header flags */ -#define TCP_URG 0x04 -#define TCP_ACK 0x08 -#define TCP_PSH 0x10 -#define TCP_RST 0x20 -#define TCP_SYN 0x40 -#define TCP_FIN 0x80 +#define TCP_URG 0x20 +#define TCP_ACK 0x10 +#define TCP_PSH 0x08 +#define TCP_RST 0x04 +#define TCP_SYN 0x02 +#define TCP_FIN 0x01 #define TCPOPT_END_OF_LIST 0x0 @@ -38,13 +37,13 @@ typedef struct TCP_HEADER { /* TCPv4 pseudo header */ -typedef struct TCP_PSEUDO_HEADER { - ULONG SourceAddress; /* Source address */ - ULONG DestAddress; /* Destination address */ - UCHAR Zero; /* Reserved */ - UCHAR Protocol; /* Protocol */ - USHORT TCPLength; /* Size of TCP segment */ -} __attribute__((packed)) TCP_PSEUDO_HEADER, *PTCP_PSEUDO_HEADER; +typedef struct TCPv4_PSEUDO_HEADER { + ULONG SourceAddress; /* Source address */ + ULONG DestinationAddress; /* Destination address */ + UCHAR Zero; /* Reserved */ + UCHAR Protocol; /* Protocol */ + USHORT TCPLength; /* Size of TCP segment */ +} __attribute__((packed)) TCPv4_PSEUDO_HEADER, *PTCPv4_PSEUDO_HEADER; /* Retransmission timeout constants */ @@ -72,6 +71,18 @@ typedef struct TCP_PSEUDO_HEADER { #define SRF_FIN TCP_FIN +PTCP_SEGMENT TCPCreateSegment( + PIP_PACKET IPPacket, + ULONG SequenceNumber, + ULONG SegmentLength); + +VOID TCPFreeSegment( + PTCP_SEGMENT Segment); + +VOID TCPAddSegment( + PCONNECTION_ENDPOINT Connection, + PTCP_SEGMENT Segment); + inline NTSTATUS TCPBuildSendRequest( PTCP_SEND_REQUEST *SendRequest, PDATAGRAM_SEND_REQUEST *DGSendRequest, @@ -113,5 +124,3 @@ NTSTATUS TCPShutdown( VOID); #endif /* __TCP_H */ - -/* EOF */ diff --git a/reactos/drivers/net/tcpip/include/titypes.h b/reactos/drivers/net/tcpip/include/titypes.h index 88be6127689..b2cbfc3b90c 100644 --- a/reactos/drivers/net/tcpip/include/titypes.h +++ b/reactos/drivers/net/tcpip/include/titypes.h @@ -266,6 +266,8 @@ typedef struct _TCP_SEND_REQUEST { PVOID Context; /* Pointer to context information */ PVOID ProtocolContext; /* Protocol specific context */ ULONG Flags; /* Protocol specific flags */ + ULONG SequenceNumber; /* Sequence number (network byte order) */ + ULONG AckNumber; /* Acknowledgement number (network byte order) */ } TCP_SEND_REQUEST, *PTCP_SEND_REQUEST; #define InitializeTCPSendRequest( \ @@ -296,6 +298,15 @@ typedef enum { } CONNECTION_STATE, *PCONNECTION_STATE; +/* Structure for an TCP segment */ +typedef struct _TCP_SEGMENT { + LIST_ENTRY ListEntry; + PIP_PACKET IPPacket; /* Pointer to IP packet */ + ULONG SequenceNumber; /* Sequence number of first byte in segment */ + ULONG Length; /* Number of bytes in segment */ +} TCP_SEGMENT, *PTCP_SEGMENT; + + /* Transport connection context structure A.K.A. Transmission Control Block (TCB) in TCP terminology. The FileObject->FsContext2 field holds a pointer to this structure */ @@ -324,14 +335,21 @@ typedef struct _CONNECTION_ENDPOINT { ULONG SendISS; /* Initial send sequence number */ /* Receive sequence variables */ - ULONG RecvNext; /* Sequence number of last data block received */ - ULONG RecvWindow; /* Maximum allowed number of octets in a segment */ - ULONG RecvUrgentPointer; /* Sequence number of start of urgent data */ - ULONG RecvIRS; /* Initial receive sequence number */ + ULONG ReceiveNext; /* Sequence number of last data block received */ + 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 */ /* Statistics for computing the retransmission timeout */ ULONG TimestampSend; /* Timestamp when sending a segment */ ULONG TimestampAck; /* Timestamp when receiving acknowledgment */ + + /* Requests */ + PTDI_REQUEST ListenRequest; /* Queued listen request */ + + /* Queues */ + LIST_ENTRY ReceivedSegments; + } CONNECTION_ENDPOINT, *PCONNECTION_ENDPOINT; diff --git a/reactos/drivers/net/tcpip/makefile b/reactos/drivers/net/tcpip/makefile index 2a501cb50c9..1453a369a79 100644 --- a/reactos/drivers/net/tcpip/makefile +++ b/reactos/drivers/net/tcpip/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.15 2004/03/02 18:18:14 navaraf Exp $ +# $Id: makefile,v 1.16 2004/03/04 20:45:38 chorns Exp $ PATH_TO_TOP = ../../.. @@ -34,6 +34,7 @@ TCP_OBJECTS = transport/tcp/tcp.o transport/tcp/tcpcore.o \ transport/tcp/tcp_input.o transport/tcp/tcp_ipv4.o \ transport/tcp/tcp_output.o transport/tcp/tcp_timer.o UDP_OBJECTS = transport/udp/udp.o +ARCH_OBJECTS = tcpip/i386/checksum.o TARGET_OBJECTS = \ $(TCPIP_OBJECTS) \ @@ -42,7 +43,8 @@ TARGET_OBJECTS = \ $(DATAGRAM_OBJECTS) \ $(RAWIP_OBJECTS) \ $(TCP_OBJECTS) \ - $(UDP_OBJECTS) + $(UDP_OBJECTS) \ + $(ARCH_OBJECTS) include $(PATH_TO_TOP)/rules.mak diff --git a/reactos/drivers/net/tcpip/network/icmp.c b/reactos/drivers/net/tcpip/network/icmp.c index f45bb49300d..c5855cea471 100644 --- a/reactos/drivers/net/tcpip/network/icmp.c +++ b/reactos/drivers/net/tcpip/network/icmp.c @@ -182,7 +182,7 @@ VOID ICMPReceive( TI_DbgPrint(DEBUG_ICMP, ("Checksum (0x%X).\n", ICMPHeader->Checksum)); /* Checksum ICMP header and data */ - if (!CorrectChecksum(IPPacket->Data, IPPacket->TotalSize - IPPacket->HeaderSize)) { + if (!IPv4CorrectChecksum(IPPacket->Data, IPPacket->TotalSize - IPPacket->HeaderSize)) { TI_DbgPrint(DEBUG_ICMP, ("Bad ICMP checksum.\n")); /* Discard packet */ return; diff --git a/reactos/drivers/net/tcpip/network/receive.c b/reactos/drivers/net/tcpip/network/receive.c index 4704ea7eb34..8e57493e7eb 100644 --- a/reactos/drivers/net/tcpip/network/receive.c +++ b/reactos/drivers/net/tcpip/network/receive.c @@ -552,7 +552,7 @@ VOID IPv4Receive( } /* Checksum IPv4 header */ - if (!CorrectChecksum(IPPacket->Header, IPPacket->HeaderSize)) { + if (!IPv4CorrectChecksum(IPPacket->Header, IPPacket->HeaderSize)) { TI_DbgPrint(MIN_TRACE, ("Datagram received with bad checksum. Checksum field (0x%X)\n", WN2H(((PIPv4_HEADER)IPPacket->Header)->Checksum))); /* Discard packet */ diff --git a/reactos/drivers/net/tcpip/network/transmit.c b/reactos/drivers/net/tcpip/network/transmit.c index b650a547971..80e561fb222 100644 --- a/reactos/drivers/net/tcpip/network/transmit.c +++ b/reactos/drivers/net/tcpip/network/transmit.c @@ -104,13 +104,13 @@ NTSTATUS SendFragments( IPPacket, NCE, PathMTU)); IFC = ExAllocatePool(NonPagedPool, sizeof(IPFRAGMENT_CONTEXT)); - if (!IFC) + if (IFC == NULL) return STATUS_INSUFFICIENT_RESOURCES; /* We allocate a buffer for a PathMTU sized packet and reuse it for all fragments */ Data = ExAllocatePool(NonPagedPool, MaxLLHeaderSize + PathMTU); - if (!IFC->Header) { + if (Data == NULL) { ExFreePool(IFC); return STATUS_INSUFFICIENT_RESOURCES; } @@ -118,7 +118,7 @@ NTSTATUS SendFragments( /* Allocate NDIS packet */ NdisAllocatePacket(&NdisStatus, &IFC->NdisPacket, GlobalPacketPool); if (NdisStatus != NDIS_STATUS_SUCCESS) { - //ExFreePool(Data); // RobD - why are we trying to free this here?, not allocated yet! + ExFreePool(Data); ExFreePool(IFC); return STATUS_INSUFFICIENT_RESOURCES; } diff --git a/reactos/drivers/net/tcpip/notes.txt b/reactos/drivers/net/tcpip/notes.txt new file mode 100644 index 00000000000..242d649039c --- /dev/null +++ b/reactos/drivers/net/tcpip/notes.txt @@ -0,0 +1,27 @@ + +RFC 791 - Internet Protocol +http://www.faqs.org/rfcs/rfc791.html + +RFC 792 - Internet Control Message Protocol +http://www.faqs.org/rfcs/rfc792.html + +RFC 793 - Transmission Control Protocol +http://www.faqs.org/rfcs/rfc793.html + +RFC 826 - Ethernet Address Resolution Protocol +http://www.faqs.org/rfcs/rfc826.html + +RFC 1122 - Requirements for Internet Hosts - Communication Layers +http://www.faqs.org/rfcs/rfc1122.html + +RFC 1123 - Requirements for Internet Hosts - Application and Support +http://www.faqs.org/rfcs/rfc1123.html + +RFC 2398 - Some Testing Tools for TCP Implementors +http://www.faqs.org/rfcs/rfc2398.html + +RFC 2525 - Known TCP Implementation Problems +http://www.faqs.org/rfcs/rfc2525.html + +RFC 2581 - TCP Congestion Control +http://www.faqs.org/rfcs/rfc2581.html \ No newline at end of file diff --git a/reactos/drivers/net/tcpip/tcpip/address.c b/reactos/drivers/net/tcpip/tcpip/address.c index 76f032fb9d2..252f6ddd387 100644 --- a/reactos/drivers/net/tcpip/tcpip/address.c +++ b/reactos/drivers/net/tcpip/tcpip/address.c @@ -289,7 +289,7 @@ BOOLEAN AddrIsEqualIPv4( /* * FUNCTION: Build an IPv4 style address * ARGUMENTS: - * Address = Raw IPv4 address + * Address = Raw IPv4 address (network byte order) * RETURNS: * Pointer to IP address structure, NULL if there was not enough free * non-paged memory @@ -300,7 +300,7 @@ PIP_ADDRESS AddrBuildIPv4( PIP_ADDRESS IPAddress; IPAddress = ExAllocatePool(NonPagedPool, sizeof(IP_ADDRESS)); - if (IPAddress) { + if (IPAddress != NULL) { IPAddress->RefCount = 1; IPAddress->Type = IP_ADDRESS_V4; IPAddress->Address.IPv4Address = Address; @@ -311,6 +311,29 @@ PIP_ADDRESS AddrBuildIPv4( } +/* + * FUNCTION: Clone an IP address + * ARGUMENTS: + * IPAddress = Pointer to IP address + * RETURNS: + * Pointer to new IP address structure, NULL if there was not enough free + * non-paged memory + */ +PIP_ADDRESS AddrCloneAddress( + PIP_ADDRESS Address) +{ + if (Address->Type == IP_ADDRESS_V4) + { + return AddrBuildIPv4(Address->Address.IPv4Address); + } + else + { + TI_DbgPrint(MIN_TRACE, ("Cannot clone IPv6 address.\n")); + return NULL; + } +} + + /* * FUNCTION: Locates and returns an address entry using IPv4 adress as argument * ARGUMENTS: diff --git a/reactos/drivers/net/tcpip/tcpip/checksum.c b/reactos/drivers/net/tcpip/tcpip/checksum.c index 72c08e8fa5d..d39a3a8830d 100644 --- a/reactos/drivers/net/tcpip/tcpip/checksum.c +++ b/reactos/drivers/net/tcpip/tcpip/checksum.c @@ -12,10 +12,22 @@ #include <checksum.h> +ULONG ChecksumFold( + ULONG Sum) +{ + /* Fold 32-bit sum to 16 bits */ + while (Sum >> 16) + { + Sum = (Sum & 0xFFFF) + (Sum >> 16); + } + + return Sum; +} + ULONG ChecksumCompute( - PVOID Data, - UINT Count, - ULONG Seed) + PVOID Data, + UINT Count, + ULONG Seed) /* * FUNCTION: Calculate checksum of a buffer * ARGUMENTS: @@ -26,25 +38,20 @@ ULONG ChecksumCompute( * Checksum of buffer */ { - /* FIXME: This should be done in assembler */ + register ULONG Sum = Seed; - register ULONG Sum = Seed; - - while (Count > 1) { - Sum += *(PUSHORT)Data; - Count -= 2; - (ULONG_PTR)Data += 2; + while (Count > 1) + { + Sum += *(PUSHORT)Data; + Count -= 2; + (ULONG_PTR)Data += 2; } - /* Add left-over byte, if any */ - if (Count > 0) - Sum += *(PUCHAR)Data; + /* Add left-over byte, if any */ + if (Count > 0) + { + Sum += *(PUCHAR)Data; + } - /* Fold 32-bit sum to 16 bits */ - while (Sum >> 16) - Sum = (Sum & 0xFFFF) + (Sum >> 16); - - return ~Sum; + return Sum; } - -/* EOF */ diff --git a/reactos/drivers/net/tcpip/tcpip/dispatch.c b/reactos/drivers/net/tcpip/tcpip/dispatch.c index c3cfd162e6f..9f846f90b6a 100644 --- a/reactos/drivers/net/tcpip/tcpip/dispatch.c +++ b/reactos/drivers/net/tcpip/tcpip/dispatch.c @@ -529,8 +529,9 @@ NTSTATUS DispTdiListen( PTDI_REQUEST_KERNEL Parameters; PTRANSPORT_CONTEXT TranContext; PIO_STACK_LOCATION IrpSp; - TDI_REQUEST Request; + PTDI_REQUEST Request; NTSTATUS Status; + KIRQL OldIrql; TI_DbgPrint(DEBUG_IRP, ("Called.\n")); @@ -539,28 +540,51 @@ NTSTATUS DispTdiListen( /* Get associated connection endpoint file object. Quit if none exists */ TranContext = IrpSp->FileObject->FsContext; - if (!TranContext) { - TI_DbgPrint(MID_TRACE, ("Bad transport context.\n")); - return STATUS_INVALID_CONNECTION; - } + if (TranContext == NULL) + { + TI_DbgPrint(MID_TRACE, ("Bad transport context.\n")); + return STATUS_INVALID_CONNECTION; + } Connection = (PCONNECTION_ENDPOINT)TranContext->Handle.ConnectionContext; - if (!Connection) { - TI_DbgPrint(MID_TRACE, ("No connection endpoint file object.\n")); - return STATUS_INVALID_CONNECTION; - } + if (Connection == NULL) + { + TI_DbgPrint(MID_TRACE, ("No connection endpoint file object.\n")); + return STATUS_INVALID_CONNECTION; + } Parameters = (PTDI_REQUEST_KERNEL)&IrpSp->Parameters; - /* Initialize a connect request */ - Request.Handle.ConnectionContext = TranContext->Handle.ConnectionContext; - Request.RequestNotifyObject = DispDataRequestComplete; - Request.RequestContext = Irp; + /* Initialize a listen request */ + Request = (PTDI_REQUEST) ExAllocatePool(NonPagedPool, sizeof(TDI_REQUEST)); + if (Request == NULL) + { + return STATUS_NO_MEMORY; + } - Status = TCPListen( - &Request, - Parameters->RequestConnectionInformation, - Parameters->ReturnConnectionInformation); + Status = DispPrepareIrpForCancel(TranContext, Irp, NULL); + if (NT_SUCCESS(Status)) + { + Request->Handle.ConnectionContext = TranContext->Handle.ConnectionContext; + Request->RequestNotifyObject = DispDataRequestComplete; + Request->RequestContext = Irp; + + Status = TCPListen( + Request, + Parameters->RequestConnectionInformation, + Parameters->ReturnConnectionInformation); + if (Status != STATUS_PENDING) + { + IoAcquireCancelSpinLock(&OldIrql); + IoSetCancelRoutine(Irp, NULL); + IoReleaseCancelSpinLock(OldIrql); + } + } + + if (Status != STATUS_PENDING) + { + ExFreePool(Request); + } return Status; } diff --git a/reactos/drivers/net/tcpip/tcpip/fileobjs.c b/reactos/drivers/net/tcpip/tcpip/fileobjs.c index a46e1e5c845..0a80d685bcc 100644 --- a/reactos/drivers/net/tcpip/tcpip/fileobjs.c +++ b/reactos/drivers/net/tcpip/tcpip/fileobjs.c @@ -296,13 +296,13 @@ NTSTATUS FileOpenAddress( switch (Protocol) { case IPPROTO_TCP: /* FIXME: If specified port is 0, a port is chosen dynamically */ - AddrFile->Port = ((PTDI_ADDRESS_IP)Address->Address)->sin_port; + AddrFile->Port = Address->Address[0].Address[0].sin_port; AddrFile->Send = TCPSendDatagram; break; case IPPROTO_UDP: /* FIXME: If specified port is 0, a port is chosen dynamically */ - AddrFile->Port = ((PTDI_ADDRESS_IP)Address->Address)->sin_port; + AddrFile->Port = Address->Address[0].Address[0].sin_port; AddrFile->Send = UDPSendDatagram; break; @@ -449,6 +449,9 @@ NTSTATUS FileOpenConnection( /* Save client context pointer */ Connection->ClientContext = ClientContext; + /* Initialize receive queue */ + InitializeListHead(&Connection->ReceivedSegments); + /* Return connection endpoint file object */ Request->Handle.ConnectionContext = Connection; diff --git a/reactos/drivers/net/tcpip/tcpip/i386/checksum.S b/reactos/drivers/net/tcpip/tcpip/i386/checksum.S new file mode 100644 index 00000000000..468b85e7ad6 --- /dev/null +++ b/reactos/drivers/net/tcpip/tcpip/i386/checksum.S @@ -0,0 +1,249 @@ +/* + * INET An implementation of the TCP/IP protocol suite for the LINUX + * operating system. INET is implemented using the BSD Socket + * interface as the means of communication with the user level. + * + * IP/TCP/UDP checksumming routines + * + * Authors: Jorge Cwik, <jorge@laser.satlink.net> + * Arnt Gulbrandsen, <agulbra@nvg.unit.no> + * Tom May, <ftom@netcom.com> + * Pentium Pro/II routines: + * Alexander Kjeldaas <astor@guardian.no> + * Finn Arne Gangstad <finnag@guardian.no> + * Lots of code moved from tcp.c and ip.c; see those files + * for more names. + * + * Changes: Ingo Molnar, converted csum_partial_copy() to 2.1 exception + * handling. + * Andi Kleen, add zeroing on error + * converted to pure assembler + * + * 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. + */ + +/* + * computes a partial checksum, e.g. for TCP/UDP fragments + */ + +/* +unsigned int csum_partial(const unsigned char * buff, int len, unsigned int sum) + */ + +.text +.align 4 +.globl _csum_partial + +#ifndef CONFIG_X86_USE_PPRO_CHECKSUM + + /* + * Experiments with Ethernet and SLIP connections show that buff + * is aligned on either a 2-byte or 4-byte boundary. We get at + * least a twofold speedup on 486 and Pentium if it is 4-byte aligned. + * Fortunately, it is easy to convert 2-byte alignment to 4-byte + * alignment for the unrolled loop. + */ +_csum_partial: + pushl %esi + pushl %ebx + movl 20(%esp),%eax # Function arg: unsigned int sum + movl 16(%esp),%ecx # Function arg: int len + movl 12(%esp),%esi # Function arg: unsigned char *buff + testl $3, %esi # Check alignment. + jz 2f # Jump if alignment is ok. + testl $1, %esi # Check alignment. + jz 10f # Jump if alignment is boundary of 2bytes. + + # buf is odd + dec %ecx + jl 8f + movzbl (%esi), %ebx + adcl %ebx, %eax + roll $8, %eax + inc %esi + testl $2, %esi + jz 2f +10: + subl $2, %ecx # Alignment uses up two bytes. + jae 1f # Jump if we had at least two bytes. + addl $2, %ecx # ecx was < 2. Deal with it. + jmp 4f +1: movw (%esi), %bx + addl $2, %esi + addw %bx, %ax + adcl $0, %eax +2: + movl %ecx, %edx + shrl $5, %ecx + jz 2f + testl %esi, %esi +1: movl (%esi), %ebx + adcl %ebx, %eax + movl 4(%esi), %ebx + adcl %ebx, %eax + movl 8(%esi), %ebx + adcl %ebx, %eax + movl 12(%esi), %ebx + adcl %ebx, %eax + movl 16(%esi), %ebx + adcl %ebx, %eax + movl 20(%esi), %ebx + adcl %ebx, %eax + movl 24(%esi), %ebx + adcl %ebx, %eax + movl 28(%esi), %ebx + adcl %ebx, %eax + lea 32(%esi), %esi + dec %ecx + jne 1b + adcl $0, %eax +2: movl %edx, %ecx + andl $0x1c, %edx + je 4f + shrl $2, %edx # This clears CF +3: adcl (%esi), %eax + lea 4(%esi), %esi + dec %edx + jne 3b + adcl $0, %eax +4: andl $3, %ecx + jz 7f + cmpl $2, %ecx + jb 5f + movw (%esi),%cx + leal 2(%esi),%esi + je 6f + shll $16,%ecx +5: movb (%esi),%cl +6: addl %ecx,%eax + adcl $0, %eax +7: + testl $1, 12(%esp) + jz 8f + roll $8, %eax +8: + popl %ebx + popl %esi + ret + +#else + +/* Version for PentiumII/PPro */ + +csum_partial: + pushl %esi + pushl %ebx + movl 20(%esp),%eax # Function arg: unsigned int sum + movl 16(%esp),%ecx # Function arg: int len + movl 12(%esp),%esi # Function arg: const unsigned char *buf + + testl $3, %esi + jnz 25f +10: + movl %ecx, %edx + movl %ecx, %ebx + andl $0x7c, %ebx + shrl $7, %ecx + addl %ebx,%esi + shrl $2, %ebx + negl %ebx + lea 45f(%ebx,%ebx,2), %ebx + testl %esi, %esi + jmp *%ebx + + # Handle 2-byte-aligned regions +20: addw (%esi), %ax + lea 2(%esi), %esi + adcl $0, %eax + jmp 10b +25: + testl $1, %esi + jz 30f + # buf is odd + dec %ecx + jl 90f + movzbl (%esi), %ebx + addl %ebx, %eax + adcl $0, %eax + roll $8, %eax + inc %esi + testl $2, %esi + jz 10b + +30: subl $2, %ecx + ja 20b + je 32f + addl $2, %ecx + jz 80f + movzbl (%esi),%ebx # csumming 1 byte, 2-aligned + addl %ebx, %eax + adcl $0, %eax + jmp 80f +32: + addw (%esi), %ax # csumming 2 bytes, 2-aligned + adcl $0, %eax + jmp 80f + +40: + addl -128(%esi), %eax + adcl -124(%esi), %eax + adcl -120(%esi), %eax + adcl -116(%esi), %eax + adcl -112(%esi), %eax + adcl -108(%esi), %eax + adcl -104(%esi), %eax + adcl -100(%esi), %eax + adcl -96(%esi), %eax + adcl -92(%esi), %eax + adcl -88(%esi), %eax + adcl -84(%esi), %eax + adcl -80(%esi), %eax + adcl -76(%esi), %eax + adcl -72(%esi), %eax + adcl -68(%esi), %eax + adcl -64(%esi), %eax + adcl -60(%esi), %eax + adcl -56(%esi), %eax + adcl -52(%esi), %eax + adcl -48(%esi), %eax + adcl -44(%esi), %eax + adcl -40(%esi), %eax + adcl -36(%esi), %eax + adcl -32(%esi), %eax + adcl -28(%esi), %eax + adcl -24(%esi), %eax + adcl -20(%esi), %eax + adcl -16(%esi), %eax + adcl -12(%esi), %eax + adcl -8(%esi), %eax + adcl -4(%esi), %eax +45: + lea 128(%esi), %esi + adcl $0, %eax + dec %ecx + jge 40b + movl %edx, %ecx +50: andl $3, %ecx + jz 80f + + # Handle the last 1-3 bytes without jumping + notl %ecx # 1->2, 2->1, 3->0, higher bits are masked + movl $0xffffff,%ebx # by the shll and shrl instructions + shll $3,%ecx + shrl %cl,%ebx + andl -128(%esi),%ebx # esi is 4-aligned so should be ok + addl %ebx,%eax + adcl $0,%eax +80: + testl $1, 12(%esp) + jz 90f + roll $8, %eax +90: + popl %ebx + popl %esi + ret + +#endif diff --git a/reactos/drivers/net/tcpip/tcpip/routines.c b/reactos/drivers/net/tcpip/tcpip/routines.c index a45223ec1c4..64bf343bff4 100644 --- a/reactos/drivers/net/tcpip/tcpip/routines.c +++ b/reactos/drivers/net/tcpip/tcpip/routines.c @@ -480,6 +480,33 @@ UINT ResizePacket( #ifdef DBG +static VOID DisplayIPHeader( + PUCHAR Header, + UINT Length) +{ + /* FIXME: IPv4 only */ + PIPv4_HEADER IPHeader = (PIPv4_HEADER)Header; + + DbgPrint("IPv4 header:\n"); + DbgPrint("VerIHL: 0x%x (version 0x%x, length %d 32-bit words)\n", + IPHeader->VerIHL, (IPHeader->VerIHL & 0xF0) >> 4, IPHeader->VerIHL & 0x0F); + DbgPrint(" Tos: %d\n", IPHeader->Tos); + DbgPrint(" TotalLength: %d\n", WN2H(IPHeader->TotalLength)); + DbgPrint(" Id: %d\n", WN2H(IPHeader->Id)); + DbgPrint(" FlagsFragOfs: 0x%x (offset 0x%x)\n", WN2H(IPHeader->FlagsFragOfs), WN2H(IPHeader->FlagsFragOfs) & IPv4_FRAGOFS_MASK); + if ((WN2H(IPHeader->FlagsFragOfs) & IPv4_DF_MASK) > 0) DbgPrint(" IPv4_DF - Don't fragment\n"); + if ((WN2H(IPHeader->FlagsFragOfs) & IPv4_MF_MASK) > 0) DbgPrint(" IPv4_MF - More fragments\n"); + DbgPrint(" Ttl: %d\n", IPHeader->Ttl); + DbgPrint(" Protocol: %d\n", IPHeader->Protocol); + DbgPrint(" Checksum: 0x%x\n", WN2H(IPHeader->Checksum)); + DbgPrint(" SrcAddr: %d.%d.%d.%d\n", + ((IPHeader->SrcAddr >> 0) & 0xFF), ((IPHeader->SrcAddr >> 8) & 0xFF), + ((IPHeader->SrcAddr >> 16) & 0xFF), ((IPHeader->SrcAddr >> 24) & 0xFF)); + DbgPrint(" DstAddr: %d.%d.%d.%d\n", + ((IPHeader->DstAddr >> 0) & 0xFF), ((IPHeader->DstAddr >> 8) & 0xFF), + ((IPHeader->DstAddr >> 16) & 0xFF), ((IPHeader->DstAddr >> 24) & 0xFF)); +} + VOID DisplayIPPacket( PIP_PACKET IPPacket) { @@ -488,6 +515,7 @@ VOID DisplayIPPacket( UINT Length; PNDIS_BUFFER Buffer; PNDIS_BUFFER NextBuffer; + PUCHAR CharBuffer; if ((DebugTraceLevel & (DEBUG_BUFFER | DEBUG_IP)) != (DEBUG_BUFFER | DEBUG_IP)) { return; @@ -528,6 +556,19 @@ VOID DisplayIPPacket( } DbgPrint("\n"); } + + if (IPPacket->NdisPacket) { + NdisQueryPacket(IPPacket->NdisPacket, NULL, NULL, NULL, &Length); + Length -= MaxLLHeaderSize; + CharBuffer = ExAllocatePool(NonPagedPool, Length); + Length = CopyPacketToBuffer(CharBuffer, IPPacket->NdisPacket, MaxLLHeaderSize, Length); + DisplayIPHeader(CharBuffer, Length); + ExFreePool(CharBuffer); + } else { + CharBuffer = IPPacket->Header; + Length = IPPacket->ContigSize; + DisplayIPHeader(CharBuffer, Length); + } } @@ -537,32 +578,31 @@ static VOID DisplayTCPHeader( { /* FIXME: IPv4 only */ PIPv4_HEADER IPHeader = (PIPv4_HEADER)Header; - PTCP_HEADER TCPHeader; + PTCPv4_HEADER TCPHeader; if (IPHeader->Protocol != IPPROTO_TCP) { DbgPrint("This is not a TCP datagram. Protocol is %d\n", IPHeader->Protocol); return; } - DbgPrint("VerIHL: 0x%x\n", IPHeader->VerIHL); - TCPHeader = (PTCP_HEADER)((PUCHAR)IPHeader + (IPHeader->VerIHL & 0x0F) * 4); + TCPHeader = (PTCPv4_HEADER)((PUCHAR)IPHeader + (IPHeader->VerIHL & 0x0F) * 4); DbgPrint("TCP header:\n"); DbgPrint(" SourcePort: %d\n", WN2H(TCPHeader->SourcePort)); - DbgPrint(" DestPort: %d\n", WN2H(TCPHeader->DestPort)); - DbgPrint(" SeqNum: %d\n", WN2H(TCPHeader->SeqNum)); - DbgPrint(" AckNum: %d\n", WN2H(TCPHeader->AckNum)); - DbgPrint(" DataOfs: %d (%d)\n", TCPHeader->DataOfs, TCPHeader->DataOfs & 0x0F); + DbgPrint(" DestinationPort: %d\n", WN2H(TCPHeader->DestinationPort)); + DbgPrint(" SequenceNumber: 0x%x\n", DN2H(TCPHeader->SequenceNumber)); + DbgPrint(" AckNumber: 0x%x\n", DN2H(TCPHeader->AckNumber)); + DbgPrint(" DataOffset: 0x%x (0x%x) 32-bit words\n", TCPHeader->DataOffset, TCPHeader->DataOffset >> 4); DbgPrint(" Flags: 0x%x (0x%x)\n", TCPHeader->Flags, TCPHeader->Flags & 0x3F); if ((TCPHeader->Flags & TCP_URG) > 0) DbgPrint(" TCP_URG - Urgent Pointer field significant\n"); - if ((TCPHeader->Flags & TCP_ACK) > 0) DbgPrint(" TCP_ACK - Acknowledgment field significant\n"); + if ((TCPHeader->Flags & TCP_ACK) > 0) DbgPrint(" TCP_ACK - Acknowledgement field significant\n"); if ((TCPHeader->Flags & TCP_PSH) > 0) DbgPrint(" TCP_PSH - Push Function\n"); if ((TCPHeader->Flags & TCP_RST) > 0) DbgPrint(" TCP_RST - Reset the connection\n"); if ((TCPHeader->Flags & TCP_SYN) > 0) DbgPrint(" TCP_SYN - Synchronize sequence numbers\n"); if ((TCPHeader->Flags & TCP_FIN) > 0) DbgPrint(" TCP_FIN - No more data from sender\n"); - DbgPrint(" Window: %d\n", WN2H(TCPHeader->Window)); - DbgPrint(" Checksum: %d\n", WN2H(TCPHeader->Checksum)); - DbgPrint(" Urgent: %d\n", WN2H(TCPHeader->Urgent)); + DbgPrint(" Window: 0x%x\n", WN2H(TCPHeader->Window)); + DbgPrint(" Checksum: 0x%x\n", WN2H(TCPHeader->Checksum)); + DbgPrint(" Urgent: 0x%x\n", WN2H(TCPHeader->Urgent)); } @@ -592,8 +632,9 @@ VOID DisplayTCPPacket( if (IPPacket->NdisPacket) { NdisQueryPacket(IPPacket->NdisPacket, NULL, NULL, NULL, &Length); + Length -= MaxLLHeaderSize; Buffer = ExAllocatePool(NonPagedPool, Length); - Length = CopyPacketToBuffer(Buffer, IPPacket->NdisPacket, 0, Length); + Length = CopyPacketToBuffer(Buffer, IPPacket->NdisPacket, MaxLLHeaderSize, Length); DisplayTCPHeader(Buffer, Length); ExFreePool(Buffer); } else { diff --git a/reactos/drivers/net/tcpip/transport/tcp/tcp.c b/reactos/drivers/net/tcpip/transport/tcp/tcp.c index deacb35368b..2de651ec2b0 100644 --- a/reactos/drivers/net/tcpip/transport/tcp/tcp.c +++ b/reactos/drivers/net/tcpip/transport/tcp/tcp.c @@ -12,36 +12,159 @@ #include <pool.h> #include <address.h> #include <datagram.h> +#include <checksum.h> #include <routines.h> static BOOLEAN TCPInitialized = FALSE; +static LONG IPIdentification = 0; +static NPAGED_LOOKASIDE_LIST TCPSegmentList; + + +PTCP_SEGMENT TCPCreateSegment( + PIP_PACKET IPPacket, + ULONG SequenceNumber, + ULONG SegmentLength) +/* + * FUNCTION: Creates a TCP segment object + * ARGUMENTS: + * IPPacket = Pointer to IP packet containing segment data + * SequenceNumber = Sequence number of first byte in the segment + * SegmentLength = Number of bytes in the segment + * RETURNS: + * Pointer to the created TCP segment. NULL if there was not enough free resources. + */ +{ + PTCP_SEGMENT Segment; + + ASSERT(IPPacket); + + Segment = ExAllocateFromNPagedLookasideList(&TCPSegmentList); + if (Segment == NULL) + return NULL; + + Segment->IPPacket = IPPacket; + Segment->SequenceNumber = SequenceNumber; + Segment->Length = SegmentLength; + + TI_DbgPrint(DEBUG_TCP, ("Created TCP segment (SequenceNumber %d, Length %d)\n", + Segment->SequenceNumber, Segment->Length)); + + return Segment; +} + + +VOID TCPFreeSegment( + PTCP_SEGMENT Segment) +/* + * FUNCTION: Frees a TCP segment object + * ARGUMENTS: + * Segment = Pointer to an TCP segment structure + */ +{ + ASSERT(Segment); + + ExFreeToNPagedLookasideList(&TCPSegmentList, Segment); +} + + +VOID TCPAddSegment( + PCONNECTION_ENDPOINT Connection, + PTCP_SEGMENT Segment) +/* + * FUNCTION: Adds a TCP segment object to the receive queue of a connection + * ARGUMENTS: + * Connection = Pointer to connection endpoint + * Segment = Pointer to TCP segment object + * RETURNS: + * Nothing. + */ +{ + PLIST_ENTRY CurrentEntry; + PLIST_ENTRY NextEntry; + PTCP_SEGMENT Current; + + ASSERT(Connection); + ASSERT(Segment); + + /* FIXME: Handle sequence number wraparound */ + + /* If all segments arrive in-order then all segments will be put last in the + receive queue when they arrive */ + + if (IsListEmpty(&Connection->ReceivedSegments)) + { + /* This is the first segment received since the connection was created + or since all data is delivered to the client */ + InsertTailList(&Connection->ReceivedSegments, &Segment->ListEntry); + return; + } + + CurrentEntry = Connection->ReceivedSegments.Blink; + Current = CONTAINING_RECORD(CurrentEntry, TCP_SEGMENT, ListEntry); + if (Segment->SequenceNumber >= Current->SequenceNumber) + { + /* This segment has the highest sequence number yet received since the + connection was created */ + InsertTailList(&Connection->ReceivedSegments, &Segment->ListEntry); + return; + } + + + TI_DbgPrint(MIN_TRACE, ("FIXME: Cannot handle segments that arrive out-of-order.\n")); + +#if 0 + do + { + if (SequenceNumber + Length...) + { + } + + CurrentEntry = CurrentEntry->Blink; + Current = CONTAINING_RECORD(CurrentEntry, TCP_SEGMENT, ListEntry); + } + while (CurrentEntry != &Connection->ReceivedSegments); +#endif +} NTSTATUS TCPiAddHeaderIPv4( PDATAGRAM_SEND_REQUEST SendRequest, + PCONNECTION_ENDPOINT Connection, PIP_ADDRESS LocalAddress, USHORT LocalPort, - PIP_PACKET IPPacket) + PIP_PACKET IPPacket, + PTCPv4_HEADER *pTcpHeader, + PULONG pTcpHeaderLength) /* * FUNCTION: Adds an IPv4 and TCP header to an IP packet * ARGUMENTS: - * SendRequest = Pointer to send request - * LocalAddress = Pointer to our local address - * LocalPort = The port we send this segment from - * IPPacket = Pointer to IP packet + * SendRequest = Pointer to send request + * Connection = Pointer to connection endpoint + * LocalAddress = Pointer to our local address + * LocalPort = The port we send this segment from + * IPPacket = Pointer to IP packet + * TcpHeader = Address of pointer to TCPv4 header (out) + * pTcpHeaderLength = Address of buffer for length of TCP header * RETURNS: * Status of operation */ { PIPv4_HEADER IPHeader; - PTCP_HEADER TCPHeader; + PTCPv4_HEADER TCPHeader; PVOID Header; ULONG BufferSize; NDIS_STATUS NdisStatus; PNDIS_BUFFER HeaderBuffer; + PTCP_SEND_REQUEST TcpSendRequest = (PTCP_SEND_REQUEST)SendRequest->Context; - BufferSize = MaxLLHeaderSize + sizeof(IPv4_HEADER) + sizeof(TCP_HEADER); + ASSERT(SendRequest); + ASSERT(Connection); + ASSERT(LocalAddress); + ASSERT(IPPacket); + ASSERT(pTcpHeader); + + BufferSize = MaxLLHeaderSize + sizeof(IPv4_HEADER) + sizeof(TCPv4_HEADER); Header = ExAllocatePool(NonPagedPool, BufferSize); if (!Header) return STATUS_INSUFFICIENT_RESOURCES; @@ -61,7 +184,8 @@ NTSTATUS TCPiAddHeaderIPv4( /* Chain header at front of NDIS packet */ NdisChainBufferAtFront(IPPacket->NdisPacket, HeaderBuffer); - + + IPPacket->ContigSize = BufferSize; IPPacket->Header = (PVOID)((ULONG_PTR)Header + MaxLLHeaderSize); IPPacket->HeaderSize = 20; @@ -74,7 +198,7 @@ NTSTATUS TCPiAddHeaderIPv4( /* Length of header and data */ IPHeader->TotalLength = WH2N((USHORT)IPPacket->TotalSize); /* Identification */ - IPHeader->Id = 0; + IPHeader->Id = WH2N((USHORT)InterlockedIncrement(&IPIdentification)); /* One fragment at offset 0 */ IPHeader->FlagsFragOfs = 0; /* Time-to-Live is 128 */ @@ -89,18 +213,23 @@ NTSTATUS TCPiAddHeaderIPv4( IPHeader->DstAddr = SendRequest->RemoteAddress->Address.IPv4Address; /* Build TCP header */ - TCPHeader = (PTCP_HEADER)((ULONG_PTR)IPHeader + sizeof(IPv4_HEADER)); + TCPHeader = (PTCPv4_HEADER)((ULONG_PTR)IPHeader + sizeof(IPv4_HEADER)); /* Port values are already big-endian values */ - TCPHeader->SourcePort = LocalPort; - TCPHeader->DestPort = SendRequest->RemotePort; - TCPHeader->SeqNum = 0; - TCPHeader->AckNum = 0; - TCPHeader->DataOfs = 0; - TCPHeader->Flags = SendRequest->Flags; - TCPHeader->Window = 0; + TCPHeader->SourcePort = LocalPort; + TCPHeader->DestinationPort = SendRequest->RemotePort; + /* TcpSendRequest->SequenceNumber is already a big-endian value */ + TCPHeader->SequenceNumber = TcpSendRequest->SequenceNumber; + /* TcpSendRequest->AckNumber is already a big-endian value */ + TCPHeader->AckNumber = ((SendRequest->Flags & SRF_ACK) > 0) ? TcpSendRequest->AckNumber : 0; + TCPHeader->DataOffset = (sizeof(TCPv4_HEADER) / 4) << 4; + TCPHeader->Flags = SendRequest->Flags; + TCPHeader->Window = 0; /* FIXME: Calculate TCP checksum and put it in TCP header */ - TCPHeader->Checksum = 0; - TCPHeader->Urgent = 0; + TCPHeader->Checksum = 0; + TCPHeader->Urgent = 0; + + *pTcpHeader = TCPHeader; + *pTcpHeaderLength = sizeof(TCPv4_HEADER); return STATUS_SUCCESS; } @@ -121,7 +250,7 @@ NTSTATUS TCPiBuildPacket( * RETURNS: * Status of operation * NOTES: - * The ProcotolContext field in the send request structure (pointed to + * The Context field in the send request structure (pointed to * by the Context field) contains a pointer to the CONNECTION_ENDPOINT * structure for the connection */ @@ -129,19 +258,32 @@ NTSTATUS TCPiBuildPacket( NTSTATUS Status; PIP_PACKET Packet; NDIS_STATUS NdisStatus; - PDATAGRAM_SEND_REQUEST SendRequest = (PDATAGRAM_SEND_REQUEST)Context; + PDATAGRAM_SEND_REQUEST SendRequest; + PCONNECTION_ENDPOINT Connection; + ULONG Checksum; + TCPv4_PSEUDO_HEADER TcpPseudoHeader; + PTCPv4_HEADER TcpHeader; + ULONG TcpHeaderLength; + + ASSERT(LocalAddress); + ASSERT(IPPacket); TI_DbgPrint(MAX_TRACE, ("Called.\n")); + SendRequest = (PDATAGRAM_SEND_REQUEST)Context; + ASSERT(SendRequest); + Connection = (PCONNECTION_ENDPOINT)SendRequest->Context; + ASSERT(Connection); + /* Prepare packet */ - /* FIXME: Assumes IPv4*/ + /* FIXME: Assumes IPv4 */ Packet = IPCreatePacket(IP_ADDRESS_V4); - if (!Packet) + if (Packet == NULL) return STATUS_INSUFFICIENT_RESOURCES; Packet->TotalSize = sizeof(IPv4_HEADER) + - sizeof(TCP_HEADER) + + sizeof(TCPv4_HEADER) + SendRequest->BufferSize; /* Allocate NDIS packet */ @@ -153,7 +295,8 @@ NTSTATUS TCPiBuildPacket( switch (SendRequest->RemoteAddress->Type) { case IP_ADDRESS_V4: - Status = TCPiAddHeaderIPv4(SendRequest, LocalAddress, LocalPort, Packet); + Status = TCPiAddHeaderIPv4(SendRequest, Connection, LocalAddress, + LocalPort, Packet, &TcpHeader, &TcpHeaderLength); break; case IP_ADDRESS_V6: /* FIXME: Support IPv6 */ @@ -169,10 +312,40 @@ NTSTATUS TCPiBuildPacket( return Status; } - /* Chain data after header */ - NdisChainBufferAtBack(Packet->NdisPacket, SendRequest->Buffer); + /* Build pseudo TCP header which is used to prevent misrouted segments */ + TcpPseudoHeader.SourceAddress = LocalAddress->Address.IPv4Address; + TcpPseudoHeader.DestinationAddress = SendRequest->RemoteAddress->Address.IPv4Address; + TcpPseudoHeader.Zero = 0; + TcpPseudoHeader.Protocol = IPPROTO_TCP; + /* Length of TCP header and segment data */ + TcpPseudoHeader.TCPLength = WH2N(TcpHeaderLength + SendRequest->BufferSize); + Checksum = TCPv4Checksum((PUCHAR)&TcpPseudoHeader, sizeof(TCPv4_PSEUDO_HEADER), 0); - //DISPLAY_IP_PACKET(Packet); + /* Add checksum for TCP header */ + Checksum = TCPv4Checksum((PUCHAR)TcpHeader, TcpHeaderLength, ~Checksum); + + /* Chain data after header if it exists */ + if (SendRequest->Buffer != NULL) + { + PVOID Data; + UINT Size; + PNDIS_BUFFER NdisBuffer = SendRequest->Buffer; + NdisChainBufferAtBack(Packet->NdisPacket, NdisBuffer); + /* Add checksum for segment data */ + /* FIXME: Verify that there is no problem for chained buffers with an odd length */ + while (NdisBuffer != NULL) + { + NdisQueryBuffer(NdisBuffer, &Data, &Size); + DbgPrint("Checksum7:(%d bytes)\n", Size); + Checksum = TCPv4Checksum(Data, Size, ~Checksum); + NdisGetNextBuffer(NdisBuffer, &NdisBuffer); + } + } + + TcpHeader->Checksum = Checksum; + DbgPrint("Checksum8: (0x%x)\n", Checksum); + + DISPLAY_TCP_PACKET(Packet); *IPPacket = Packet; @@ -196,14 +369,19 @@ VOID TCPiSendRequestComplete( PVOID CompleteContext; PTCP_SEND_REQUEST SendRequest = (PTCP_SEND_REQUEST)Context; + TI_DbgPrint(MAX_TRACE, ("Called.\n")); + Complete = SendRequest->Complete; CompleteContext = SendRequest->Context; ExFreePool(SendRequest); - TI_DbgPrint(MAX_TRACE, ("Calling completion routine.\n")); + if (Complete != NULL) + { + TI_DbgPrint(MAX_TRACE, ("Calling completion routine.\n")); - /* Call upper level completion routine */ - (*Complete)(CompleteContext, Status, Count); + /* Call upper level completion routine */ + (*Complete)(CompleteContext, Status, Count); + } TI_DbgPrint(MAX_TRACE, ("Leaving.\n")); } @@ -237,7 +415,7 @@ inline NTSTATUS TCPBuildSendRequest( * Connection = Connection endpoint * Complete = Completion routine * Context = Pointer to context information - * Buffer = Pointer to NDIS buffer to send + * Buffer = Pointer to NDIS buffer to send (optional) * BufferSize = Size of Buffer * Flags = Protocol specific flags * RETURNS: @@ -247,6 +425,9 @@ inline NTSTATUS TCPBuildSendRequest( PDATAGRAM_SEND_REQUEST DGSendReq; NTSTATUS Status; + ASSERT(SendRequest); + ASSERT(Connection); + Status = BuildTCPSendRequest( SendRequest, Complete, @@ -261,7 +442,8 @@ inline NTSTATUS TCPBuildSendRequest( Connection->RemotePort, /* Port of remote peer */ Buffer, /* Buffer */ BufferSize, /* Size of buffer */ - TCPiSendRequestComplete, /* Completion function */ + (DATAGRAM_COMPLETION_ROUTINE) + TCPiSendRequestComplete, /* Completion function */ *SendRequest, /* Context for completion function */ TCPiBuildPacket, /* Packet build function */ Flags); /* Protocol specific flags */ @@ -288,9 +470,9 @@ inline NTSTATUS TCPBuildAndTransmitSendRequest( * FUNCTION: Allocates and intializes a TCP send request * ARGUMENTS: * Connection = Connection endpoint - * Complete = Completion routine + * Complete = Completion routine (optional) * Context = Pointer to context information - * Buffer = Pointer to NDIS buffer to send + * Buffer = Pointer to NDIS buffer to send (optional) * BufferSize = Size of Buffer * Flags = Protocol specific flags * RETURNS: @@ -301,6 +483,10 @@ inline NTSTATUS TCPBuildAndTransmitSendRequest( PTCP_SEND_REQUEST TCPSendRequest; NTSTATUS Status; + ASSERT(Connection); + + TI_DbgPrint(MAX_TRACE, ("Called.\n")); + Status = TCPBuildSendRequest( &TCPSendRequest, &DGSendRequest, @@ -326,6 +512,67 @@ inline NTSTATUS TCPBuildAndTransmitSendRequest( } +inline NTSTATUS TCPBuildAndTransmitSendRequest2( + PCONNECTION_ENDPOINT Connection, + DATAGRAM_COMPLETION_ROUTINE Complete, + PVOID Context, + PNDIS_BUFFER Buffer, + DWORD BufferSize, + ULONG Flags, + ULONG SequenceNumber, + ULONG AckNumber) +/* + * FUNCTION: Allocates and intializes a TCP send request + * ARGUMENTS: + * Connection = Connection endpoint + * Complete = Completion routine (optional) + * Context = Pointer to context information + * Buffer = Pointer to NDIS buffer to send + * BufferSize = Size of Buffer + * Flags = Protocol specific flags + * SequenceNumber = Sequence number (host byte order) + * AckNumber = Acknowledgement number (host byte order) + * RETURNS: + * Status of operation + */ +{ + PDATAGRAM_SEND_REQUEST DGSendRequest; + PTCP_SEND_REQUEST TCPSendRequest; + NTSTATUS Status; + + ASSERT(Connection); + + TI_DbgPrint(MAX_TRACE, ("Called.\n")); + + Status = TCPBuildSendRequest( + &TCPSendRequest, + &DGSendRequest, + Connection, /* Connection endpoint */ + Complete, /* Completion routine */ + Context, /* Completion routine context */ + Buffer, /* Buffer */ + BufferSize, /* Size of buffer */ + Flags); /* Protocol specific flags */ + if (!NT_SUCCESS(Status)) + return Status; + + /* Set extra information and convert to network byte order if necessary */ + TCPSendRequest->SequenceNumber = DH2N(SequenceNumber); + TCPSendRequest->AckNumber = DH2N(AckNumber); + + Status = DGTransmit( + Connection->AddressFile, + DGSendRequest); + if (!NT_SUCCESS(Status)) { + ExFreePool(DGSendRequest); + ExFreePool(TCPSendRequest); + return Status; + } + + return STATUS_SUCCESS; +} + + NTSTATUS TCPConnect( PTDI_REQUEST Request, PTDI_CONNECTION_INFORMATION ConnInfo, @@ -335,7 +582,7 @@ NTSTATUS TCPConnect( * ARGUMENTS: * Request = Pointer to TDI request * ConnInfo = Pointer to connection information - * ReturnInfo = Pointer to structure for return information + * ReturnInfo = Pointer to structure for return information (optional) * RETURNS: * Status of operation * NOTES: @@ -353,6 +600,9 @@ NTSTATUS TCPConnect( PVOID DataBuffer; ULONG Size; + ASSERT(Request); + ASSERT(ConnInfo); + TI_DbgPrint(MID_TRACE, ("Called.\n")); Connection = Request->Handle.ConnectionContext; @@ -427,7 +677,7 @@ NTSTATUS TCPListen( * ARGUMENTS: * Request = Pointer to TDI request * ConnInfo = Pointer to connection information - * ReturnInfo = Pointer to structure for return information + * ReturnInfo = Pointer to structure for return information (optional) * RETURNS: * Status of operation * NOTES: @@ -441,6 +691,9 @@ NTSTATUS TCPListen( NTSTATUS Status; KIRQL OldIrql; + ASSERT(Request); + ASSERT(ConnInfo); + TI_DbgPrint(MID_TRACE, ("Called.\n")); Connection = Request->Handle.ConnectionContext; @@ -453,8 +706,9 @@ NTSTATUS TCPListen( return STATUS_UNSUCCESSFUL; } - Connection->LocalAddress = Connection->AddressFile->ADE->Address; - Connection->LocalPort = Connection->AddressFile->Port; + Connection->LocalAddress = Connection->AddressFile->ADE->Address; + Connection->LocalPort = Connection->AddressFile->Port; + Connection->ListenRequest = Request; TI_DbgPrint(MIN_TRACE, ("Connection->LocalAddress (%s).\n", A2S(Connection->LocalAddress))); TI_DbgPrint(MIN_TRACE, ("Connection->LocalPort (%d).\n", Connection->LocalPort)); @@ -488,22 +742,510 @@ NTSTATUS TCPSendDatagram( * Status of operation */ { + ASSERT(Request); + ASSERT(ConnInfo); + ASSERT(Buffer); + return STATUS_SUCCESS; } -static VOID TCPiReceive( +static inline ULONG TCPiSelectISS( + PCONNECTION_ENDPOINT Connection) +{ + ASSERT(Connection); + + TI_DbgPrint(MIN_TRACE, ("Select ISS.\n")); + return 0x10000; +} + + +static inline VOID TCPiReceiveListen( PADDRESS_FILE AddrFile, PIP_PACKET IPPacket, - PTCP_HEADER TCPHeader) + PTCPv4_HEADER TCPHeader) +{ + ASSERT(AddrFile); + ASSERT(IPPacket); + ASSERT(TCPHeader); + + /* FIXME: Protect AddrFile->Connection */ + + if ((TCPHeader->Flags & TCP_RST) > 0) + { + /* Discard */ + TI_DbgPrint(DEBUG_TCP, ("Discard.\n")); + return; + } + + if ((TCPHeader->Flags & TCP_ACK) > 0) + { + /* FIXME: Send RST (if no RST) + <SEQ=SEG.ACK><CTL=RST> */ + TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); + return; + } + + if ((TCPHeader->Flags & TCP_SYN) > 0) + { + PCONNECTION_ENDPOINT Connection = AddrFile->Connection; + register UCHAR DelayedControls; + register NTSTATUS Status; + + /* FIXME: If the SEG.PRC is greater than the TCB.PRC then if allowed by + the user and the system set TCB.PRC<-SEG.PRC, if not allowed + send a reset and return. */ + if (FALSE) + { + /* FIXME: Send RST (if no RST) + * <SEQ=SEG.ACK><CTL=RST> + */ + TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); + return; + } + + /* Set RCV.NXT to SEG.SEQ+1, IRS is set to SEG.SEQ and any other + control or text should be queued for processing later. ISS + should be selected and a SYN segment sent of the form: + + <SEQ=ISS><ACK=RCV.NXT><CTL=SYN,ACK> + + SND.NXT is set to ISS+1 and SND.UNA to ISS. The connection + state should be changed to SYN-RECEIVED. Note that any other + incoming control or data (combined with SYN) will be processed + in the SYN-RECEIVED state, but processing of SYN and ACK should + not be repeated. If the listen was not fully specified (i.e., + the foreign socket was not fully specified), then the + unspecified fields should be filled in now. + */ + TI_DbgPrint(DEBUG_TCP, ("Go to ctSynReceived connection state.\n")); + + Connection->RemotePort = TCPHeader->SourcePort; + /* FIXME: IPv4 only */ + Connection->RemoteAddress = AddrCloneAddress(&IPPacket->SrcAddr); + if (Connection->RemoteAddress == NULL) + { + /* FIXME: Send RST (if no RST) + * <SEQ=SEG.ACK><CTL=RST> + */ + TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); + return; + } + + Connection->ReceiveNext = DN2H(TCPHeader->SequenceNumber) + 1; + Connection->ReceiveIRS = DN2H(TCPHeader->SequenceNumber); + Connection->State = ctSynReceived; + + Connection->SendISS = TCPiSelectISS(Connection); + Connection->SendNext = Connection->SendISS + 1; + Connection->SendUnacknowledged = Connection->SendISS; + + DelayedControls = TCPHeader->Flags & (~(TCP_SYN | TCP_ACK)); + if (DelayedControls > 0) + { + TI_DbgPrint(MIN_TRACE, ("FIXME: Queue controls (0x%x) for later processing.\n", DelayedControls)); + } + + TI_DbgPrint(MIN_TRACE, ("IPPacket->HeaderSize: %d\n", IPPacket->HeaderSize)); + TI_DbgPrint(MIN_TRACE, ("TCPHeader->DataOffset: %d\n", TCPHeader->DataOffset)); + TI_DbgPrint(MIN_TRACE, ("IPPacket->TotalSize: %d\n", IPPacket->TotalSize)); + + if (IPPacket->HeaderSize + (TCPHeader->DataOffset & 0x0F) > IPPacket->TotalSize) + { + TI_DbgPrint(MIN_TRACE, ("FIXME: Queue segment data (%d bytes) for later processing.\n", + (IPPacket->HeaderSize + (TCPHeader->DataOffset & 0x0F)) - IPPacket->TotalSize)); + } + + /* Issue SYN/ACK segment */ + Status = TCPBuildAndTransmitSendRequest2( + Connection, /* Connection endpoint */ + NULL, /* Completion routine */ + NULL, /* Completion routine context */ + NULL, /* Buffer */ + 0, /* Size of buffer */ + SRF_SYN | SRF_ACK, /* Protocol specific flags */ + Connection->SendISS, /* Sequence number */ + Connection->ReceiveNext); /* Acknowledgement number */ + if (!NT_SUCCESS(Status)) + { + /* FIXME: Send RST (if no RST) + * <SEQ=SEG.ACK><CTL=RST> + */ + TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); + return; + } + + ASSERT(Connection->ListenRequest != NULL); + + TI_DbgPrint(DEBUG_TCP, ("Completing listen request at %p.\n", Connection->ListenRequest)); + + /* Complete the listen request */ + (*((DATAGRAM_COMPLETION_ROUTINE)Connection->ListenRequest->RequestNotifyObject))( + Connection->ListenRequest->RequestContext, + STATUS_SUCCESS, + 0); + return; + } + + /* Discard the segment as it is invalid */ + TI_DbgPrint(DEBUG_TCP, ("Discard.\n")); +} + + +static inline VOID TCPiReceiveSynSent( + PADDRESS_FILE AddrFile, + PIP_PACKET IPPacket, + PTCPv4_HEADER TCPHeader) +{ + ASSERT(AddrFile); + ASSERT(IPPacket); + ASSERT(TCPHeader); + + /* FIXME: Protect AddrFile->Connection */ + + if ((TCPHeader->Flags & TCP_ACK) > 0) + { + /* FIXME: If SEG.ACK =< ISS, or SEG.ACK > SND.NXT, send a reset (unless + the RST bit is set, if so drop the segment and return) + <SEQ=SEG.ACK><CTL=RST> */ + TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); + return; + } + + /* FIXME: If SND.UNA =< SEG.ACK =< SND.NXT then the ACK is acceptable. */ + + if ((TCPHeader->Flags & TCP_RST) > 0) + { + if (TRUE /* ACK is acceptable */) + { + AddrFile->Connection->State = ctClosed; + /* FIXME: Signal client */ + TI_DbgPrint(MIN_TRACE, ("FIXME: Signal client.\n")); + } + else + { + /* Discard segment */ + TI_DbgPrint(DEBUG_TCP, ("Discard.\n")); + } + return; + } + + /* FIXME: If the security/compartment in the segment does not exactly + match the security/compartment in the TCB */ + if (FALSE) + { + if ((TCPHeader->Flags & TCP_ACK) > 0) + { + /* FIXME: Send RST (if no RST) + <SEQ=SEG.ACK><CTL=RST> */ + TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); + } + else + { + /* FIXME: Send RST (if no RST) + <SEQ=0><ACK=SEG.SEQ+SEG.LEN><CTL=RST,ACK> */ + TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); + } + return; + } + + if ((TCPHeader->Flags & TCP_ACK) > 0) + { + /* FIXME: If the precedence in the segment does not match the precedence in the TCB */ + if (FALSE) + { + /* FIXME: Send RST (if no RST) + <SEQ=SEG.ACK><CTL=RST> */ + TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); + return; + } + else + { + /* FIXME: If the precedence in the segment is higher than the precedence + in the TCB then if allowed by the user and the system raise + the precedence in the TCB to that in the segment, if not + allowed to raise the prec then send a reset. */ + if (FALSE) + { + /* FIXME: Send RST (if no RST) + <SEQ=0><ACK=SEG.SEQ+SEG.LEN><CTL=RST,ACK> */ + TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); + return; + } + else + { + /* Continue */ + } + } + TI_DbgPrint(MIN_TRACE, ("?.\n")); + return; /* ??? */ + } + + /* The ACK is ok, or there is no ACK, and it the segment did not contain a RST */ + + if ((TCPHeader->Flags & TCP_SYN) > 0) + { + /* FIXME: The security/compartment and precedence are acceptable */ + if (TRUE) + { + PCONNECTION_ENDPOINT Connection = AddrFile->Connection; + register NTSTATUS Status; + + /* FIXME: RCV.NXT is set to SEG.SEQ+1, IRS is set to + SEG.SEQ. SND.UNA should be advanced to equal SEG.ACK (if there + is an ACK), and any segments on the retransmission queue which + are thereby acknowledged should be removed. + + If SND.UNA > ISS (our SYN has been ACKed), change the connection + state to ESTABLISHED, form an ACK segment + + <SEQ=SND.NXT><ACK=RCV.NXT><CTL=ACK> + + Data or controls which were queued for + transmission may be included. If there are other controls or + text in the segment then continue processing at the sixth step + below where the URG bit is checked, otherwise return. + + Otherwise enter SYN-RECEIVED, form a SYN,ACK segment + + <SEQ=ISS><ACK=RCV.NXT><CTL=SYN,ACK> + + and send it. If there are other controls or text in the + segment, queue them for processing after the ESTABLISHED state + has been reached, return. */ + + Connection->ReceiveNext = DN2H(TCPHeader->SequenceNumber) + 1; + Connection->ReceiveIRS = DN2H(TCPHeader->SequenceNumber); + + if ((TCPHeader->Flags & TCP_ACK) > 0) + { + /* FIXME: Remove any outstanding segments on the retransmission queue that is acknowledged by this */ + TI_DbgPrint(MIN_TRACE, ("FIXME: Maybe remove outstanding segments on the retransmission queue.\n")); + Connection->SendUnacknowledged = TCPHeader->AckNumber; + } + + if (Connection->SendUnacknowledged > Connection->SendISS) + { + TI_DbgPrint(DEBUG_TCP, ("Go to ctEstablished connection state.\n")); + Connection->State = ctEstablished; + + TI_DbgPrint(MIN_TRACE, ("FIXME: Controls or segment data queued for transmission may be sent.\n")); + + /* Issue ACK segment */ + Status = TCPBuildAndTransmitSendRequest2( + Connection, /* Connection endpoint */ + NULL, /* Completion routine */ + NULL, /* Completion routine context */ + NULL, /* Buffer */ + 0, /* Size of buffer */ + SRF_ACK, /* Protocol specific flags */ + Connection->SendNext, /* Sequence number */ + Connection->ReceiveNext); /* Acknowledgement number */ + if (!NT_SUCCESS(Status)) + { + /* FIXME: Send RST (if no RST) + * <SEQ=SEG.ACK><CTL=RST> + */ + TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); + return; + } + } + else + { + TI_DbgPrint(MIN_TRACE, ("Go to ctSynReceived connection state.\n")); + Connection->State = ctSynReceived; + + TI_DbgPrint(MIN_TRACE, ("FIXME: Controls or segment data queued for transmission may be sent.\n")); + + /* Issue SYN/ACK segment */ + Status = TCPBuildAndTransmitSendRequest2( + Connection, /* Connection endpoint */ + NULL, /* Completion routine */ + NULL, /* Completion routine context */ + NULL, /* Buffer */ + 0, /* Size of buffer */ + SRF_SYN | SRF_ACK, /* Protocol specific flags */ + Connection->SendISS, /* Sequence number */ + Connection->ReceiveNext); /* Acknowledgement number */ + if (!NT_SUCCESS(Status)) + { + /* FIXME: Send RST (if no RST) + * <SEQ=SEG.ACK><CTL=RST> + */ + TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); + return; + } + } + } + else + { + /* FIXME: What happens here? */ + } + } + + /* FIXME: Send RST (if no RST) + <SEQ=SEG.ACK><CTL=RST> */ + TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); +} + +/* + * Returns TRUE if processing should be continued, FALSE if not + */ +static inline BOOLEAN TCPiReceiveSynReceived( + PADDRESS_FILE AddrFile, + PIP_PACKET IPPacket, + PTCPv4_HEADER TCPHeader) +{ + PCONNECTION_ENDPOINT Connection = AddrFile->Connection; + + ASSERT(AddrFile); + ASSERT(IPPacket); + ASSERT(TCPHeader); + + /* FIXME: Protect AddrFile->Connection */ + + /* FIXME: If SND.UNA =< SEG.ACK =< SND.NXT then enter ESTABLISHED state + and continue processing. + + If the segment acknowledgment is not acceptable, form a + reset segment, + + <SEQ=SEG.ACK><CTL=RST> + + and send it. */ + + if ((Connection->SendUnacknowledged <= DN2H(TCPHeader->AckNumber)) + && (DN2H(TCPHeader->AckNumber) <= Connection->SendNext)) + { + Connection->State = ctEstablished; + TI_DbgPrint(DEBUG_TCP, ("Go to ctEstablished connection state.\n")); + return TRUE; + } + + /* FIXME: Send RST (if no RST) + <SEQ=SEG.ACK><CTL=RST> */ + TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); + + return FALSE; +} + + +static inline VOID TCPiReceiveData( + PADDRESS_FILE AddrFile, + PIP_PACKET IPPacket, + PTCPv4_HEADER TCPHeader, + ULONG Payload) +{ + PCONNECTION_ENDPOINT Connection = AddrFile->Connection; + PTCP_SEGMENT Segment; + NTSTATUS Status; + ULONG Acknowledged; + + ASSERT(AddrFile); + ASSERT(IPPacket); + ASSERT(TCPHeader); + + TI_DbgPrint(DEBUG_TCP, ("Called (Payload %d bytes).\n", Payload)); + + /* FIXME: Protect AddrFile->Connection */ + + /* FIXME: Once in the ESTABLISHED state, it is possible to deliver segment + text to user RECEIVE buffers. Text from segments can be moved + into buffers until either the buffer is full or the segment is + empty. If the segment empties and carries an PUSH flag, then + the user is informed, when the buffer is returned, that a PUSH + has been received. + + When the TCP takes responsibility for delivering the data to the + user it must also acknowledge the receipt of the data. + + Once the TCP takes responsibility for the data it advances + RCV.NXT over the data accepted, and adjusts RCV.WND as + apporopriate to the current buffer availability. The total of + RCV.NXT and RCV.WND should not be reduced. + + Please note the window management suggestions in section 3.7. + + Send an acknowledgment of the form: + + <SEQ=SND.NXT><ACK=RCV.NXT><CTL=ACK> + + This acknowledgment should be piggybacked on a segment being + transmitted if possible without incurring undue delay. */ + + /* FIXME: If the segment is not expected, drop the segment + + A segment is judged to occupy a portion of valid receive sequence + space if + + RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND + + or + + RCV.NXT =< SEG.SEQ+SEG.LEN-1 < RCV.NXT+RCV.WND + */ + + Segment = TCPCreateSegment(IPPacket, + DN2H(TCPHeader->SequenceNumber), + Payload); + if (Segment == NULL) + { + /* FIXME: Send RST (if no RST) + * <SEQ=SEG.ACK><CTL=RST> + */ + TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); + return; + } + + TCPAddSegment(Connection, Segment /*, &Acknowledged */); + + //Connection->ReceiveNext += ; + + /* Issue ACK segment */ + Status = TCPBuildAndTransmitSendRequest2( + Connection, /* Connection endpoint */ + NULL, /* Completion routine */ + NULL, /* Completion routine context */ + NULL, /* Buffer */ + 0, /* Size of buffer */ + SRF_ACK, /* Protocol specific flags */ + Connection->SendNext, /* Sequence number */ + Connection->ReceiveNext); /* Acknowledgement number */ + if (!NT_SUCCESS(Status)) + { + /* FIXME: Send RST (if no RST) + * <SEQ=SEG.ACK><CTL=RST> + */ + TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); + return; + } + + if ((TCPHeader->Flags & TCP_PSH) > 0) + { + TI_DbgPrint(MIN_TRACE, ("FIXME: Handle PUSH flag.\n")); + } + + TI_DbgPrint(MAX_TRACE, ("\n")); +} + + +static inline VOID TCPiReceive( + PADDRESS_FILE AddrFile, + PIP_PACKET IPPacket, + PTCPv4_HEADER TCPHeader, + ULONG Payload) { register CONNECTION_STATE State; + ASSERT(AddrFile); + ASSERT(IPPacket); + ASSERT(TCPHeader); + if (AddrFile->Connection == NULL || AddrFile->Connection->State == ctClosed) { if ((TCPHeader->Flags & TCP_RST) == 0) { - /* FIXME: Send RST + /* FIXME: Send RST (if no RST) * If the ACK bit is off, sequence number zero is used, * * <SEQ=0><ACK=SEG.SEQ+SEG.LEN><CTL=RST,ACK> @@ -514,181 +1256,19 @@ static VOID TCPiReceive( */ TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); } + TI_DbgPrint(DEBUG_TCP, ("Discard.\n")); return; } if (AddrFile->Connection->State == ctListen) { - if ((TCPHeader->Flags & TCP_RST) > 0) - { - /* Discard */ - return; - } - - if ((TCPHeader->Flags & TCP_ACK) > 0) - { - /* FIXME: Send RST - <SEQ=SEG.ACK><CTL=RST> */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); - return; - } - - if ((TCPHeader->Flags & TCP_SYN) > 0) - { - /* FIXME: If the SEG.PRC is greater than the TCB.PRC then if allowed by - the user and the system set TCB.PRC<-SEG.PRC, if not allowed - send a reset and return. */ - if (FALSE) - { - /* FIXME: Send RST - * <SEQ=SEG.ACK><CTL=RST> - */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); - return; - } - - /* Set RCV.NXT to SEG.SEQ+1, IRS is set to SEG.SEQ and any other - control or text should be queued for processing later. ISS - should be selected and a SYN segment sent of the form: - - <SEQ=ISS><ACK=RCV.NXT><CTL=SYN,ACK> - - SND.NXT is set to ISS+1 and SND.UNA to ISS. The connection - state should be changed to SYN-RECEIVED. Note that any other - incoming control or data (combined with SYN) will be processed - in the SYN-RECEIVED state, but processing of SYN and ACK should - not be repeated. If the listen was not fully specified (i.e., - the foreign socket was not fully specified), then the - unspecified fields should be filled in now. - */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Go to ctSynReceived connection state.\n")); - return; - } - - /* Discard the segment as it is invalid */ + TCPiReceiveListen(AddrFile, IPPacket, TCPHeader); return; } if (AddrFile->Connection->State == ctSynSent) { - if ((TCPHeader->Flags & TCP_ACK) > 0) - { - /* FIXME: If SEG.ACK =< ISS, or SEG.ACK > SND.NXT, send a reset (unless - the RST bit is set, if so drop the segment and return) - <SEQ=SEG.ACK><CTL=RST> */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); - return; - } - - /* FIXME: If SND.UNA =< SEG.ACK =< SND.NXT then the ACK is acceptable. */ - - if ((TCPHeader->Flags & TCP_RST) > 0) - { - if (TRUE /* ACK is acceptable */) - { - AddrFile->Connection->State = ctClosed; - /* FIXME: Signal client */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Signal client.\n")); - } - else - { - /* Discard segment */ - } - return; - } - - /* FIXME: If the security/compartment in the segment does not exactly - match the security/compartment in the TCB */ - if (FALSE) - { - if ((TCPHeader->Flags & TCP_ACK) > 0) - { - /* FIXME: Send RST - <SEQ=SEG.ACK><CTL=RST> */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); - } - else - { - /* FIXME: Send RST - <SEQ=0><ACK=SEG.SEQ+SEG.LEN><CTL=RST,ACK> */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); - } - return; - } - - if ((TCPHeader->Flags & TCP_ACK) > 0) - { - /* FIXME: If the precedence in the segment does not match the precedence in the TCB */ - if (FALSE) - { - /* FIXME: Send RST - <SEQ=SEG.ACK><CTL=RST> */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); - return; - } - else - { - /* FIXME: If the precedence in the segment is higher than the precedence - in the TCB then if allowed by the user and the system raise - the precedence in the TCB to that in the segment, if not - allowed to raise the prec then send a reset. */ - if (FALSE) - { - /* FIXME: Send RST - <SEQ=0><ACK=SEG.SEQ+SEG.LEN><CTL=RST,ACK> */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); - return; - } - else - { - /* Continue */ - } - } - return; - } - - /* The ACK is ok, or there is no ACK, and it the segment did not contain a RST */ - - if ((TCPHeader->Flags & TCP_SYN) > 0) - { - /* FIXME: The security/compartment and precedence are acceptable */ - if (TRUE) - { - /* FIXME: RCV.NXT is set to SEG.SEQ+1, IRS is set to - SEG.SEQ. SND.UNA should be advanced to equal SEG.ACK (if there - is an ACK), and any segments on the retransmission queue which - are thereby acknowledged should be removed. - - If SND.UNA > ISS (our SYN has been ACKed), change the connection - state to ESTABLISHED, form an ACK segment - - <SEQ=SND.NXT><ACK=RCV.NXT><CTL=ACK> - - Data or controls which were queued for - transmission may be included. If there are other controls or - text in the segment then continue processing at the sixth step - below where the URG bit is checked, otherwise return. - - Otherwise enter SYN-RECEIVED, form a SYN,ACK segment - - <SEQ=ISS><ACK=RCV.NXT><CTL=SYN,ACK> - - and send it. If there are other controls or text in the - segment, queue them for processing after the ESTABLISHED state - has been reached, return. */ - - TI_DbgPrint(MIN_TRACE, ("FIXME: Maybe go to ctEstablished connection state.\n")); - } - else - { - /* FIXME: What happens here? */ - } - } - - /* FIXME: Send RST - <SEQ=SEG.ACK><CTL=RST> */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); - return; + TCPiReceiveSynSent(AddrFile, IPPacket, TCPHeader); } State = AddrFile->Connection->State; @@ -774,9 +1354,9 @@ static VOID TCPiReceive( || State == ctTimeWait) { AddrFile->Connection->State = ctClosed; + TI_DbgPrint(DEBUG_TCP, ("Go to ctClosed connection state.\n")); return; } - } /* FIXME: check security and precedence */ @@ -786,6 +1366,7 @@ static VOID TCPiReceive( /* FIXME: If the security/compartment and precedence in the segment do not exactly match the security/compartment and precedence in the TCB then send a reset, and return. */ + TI_DbgPrint(MIN_TRACE, ("FIXME: Check security/compartment and precedence.\n")); } if (AddrFile->Connection->State == ctSynReceived) @@ -797,6 +1378,7 @@ static VOID TCPiReceive( flushed. Users should also receive an unsolicited general "connection reset" signal. Enter the CLOSED state, delete the TCB, and return. */ + TI_DbgPrint(MIN_TRACE, ("FIXME: Check security/compartment and precedence.\n")); } /* Note the previous check is placed following the sequence check to prevent @@ -834,28 +1416,24 @@ static VOID TCPiReceive( if ((TCPHeader->Flags & TCP_ACK) == 0) { /* Discard the segment */ + TI_DbgPrint(DEBUG_TCP, ("Discard.\n")); return; } if (AddrFile->Connection->State == ctSynReceived) { - /* FIXME: If SND.UNA =< SEG.ACK =< SND.NXT then enter ESTABLISHED state - and continue processing. - - If the segment acknowledgment is not acceptable, form a - reset segment, - - <SEQ=SEG.ACK><CTL=RST> - - and send it. */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Maybe go to ctEstablished connection state.\n")); - return; + if (TCPiReceiveSynReceived(AddrFile, IPPacket, TCPHeader) == FALSE) + { + return; + } } State = AddrFile->Connection->State; if (State == ctEstablished || State == ctCloseWait) { + PCONNECTION_ENDPOINT Connection = AddrFile->Connection; + /* FIXME: If SND.UNA < SEG.ACK =< SND.NXT then, set SND.UNA <- SEG.ACK. Any segments on the retransmission queue which are thereby entirely acknowledged are removed. Users should receive @@ -876,7 +1454,33 @@ static VOID TCPiReceive( SND.WND, and that SND.WL2 records the acknowledgment number of the last segment used to update SND.WND. The check here prevents using old segments to update the window. */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Maybe send ACK.\n")); + + if ((Connection->SendUnacknowledged <= DN2H(TCPHeader->AckNumber)) + && (DN2H(TCPHeader->AckNumber) <= Connection->SendNext)) + { + TI_DbgPrint(MIN_TRACE, ("FIXME: Maybe remove segments on retransmission queue.\n")); + Connection->SendUnacknowledged = DN2H(TCPHeader->AckNumber); + } + + if ((Connection->SendUnacknowledged < DN2H(TCPHeader->AckNumber)) + && (DN2H(TCPHeader->AckNumber) <= Connection->SendNext)) + { + TI_DbgPrint(MIN_TRACE, ("FIXME: Update send window.\n")); + } + + if ((Connection->SendWL1 < DN2H(TCPHeader->SequenceNumber)) + || (Connection->SendWL1 == (DN2H(TCPHeader->SequenceNumber)) + && (Connection->SendWL2 <= (DN2H(TCPHeader->AckNumber))))) + { + TI_DbgPrint(DEBUG_TCP, ("Updating SendWindow, SendWL1 and SendWL2.\n")); + Connection->SendWindow = DN2H(TCPHeader->Window); + Connection->SendWL1 = DN2H(TCPHeader->SequenceNumber); + Connection->SendWL2 = DN2H(TCPHeader->AckNumber); + } + + /* Process any available data in the segment */ + TCPiReceiveData(AddrFile, IPPacket, TCPHeader, Payload); + return; } @@ -958,30 +1562,8 @@ static VOID TCPiReceive( || State == ctFinWait1 || State == ctFinWait2) { - /* FIXME: Once in the ESTABLISHED state, it is possible to deliver segment - text to user RECEIVE buffers. Text from segments can be moved - into buffers until either the buffer is full or the segment is - empty. If the segment empties and carries an PUSH flag, then - the user is informed, when the buffer is returned, that a PUSH - has been received. - - When the TCP takes responsibility for delivering the data to the - user it must also acknowledge the receipt of the data. - - Once the TCP takes responsibility for the data it advances - RCV.NXT over the data accepted, and adjusts RCV.WND as - apporopriate to the current buffer availability. The total of - RCV.NXT and RCV.WND should not be reduced. - - Please note the window management suggestions in section 3.7. - - Send an acknowledgment of the form: - - <SEQ=SND.NXT><ACK=RCV.NXT><CTL=ACK> - - This acknowledgment should be piggybacked on a segment being - transmitted if possible without incurring undue delay. */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Handle data.\n")); + /* Process any available data in the segment */ + TCPiReceiveData(AddrFile, IPPacket, TCPHeader, Payload); return; } @@ -1006,6 +1588,7 @@ static VOID TCPiReceive( || State == ctSynSent) { /* Discard segment */ + TI_DbgPrint(DEBUG_TCP, ("Discard.\n")); return; } @@ -1024,6 +1607,7 @@ static VOID TCPiReceive( case ctEstablished: { /* FIXME: Enter ctClosed state */ + TI_DbgPrint(MIN_TRACE, ("FIXME: Go to ctClosed connection state.\n")); break; } case ctFinWait1: @@ -1031,12 +1615,14 @@ static VOID TCPiReceive( /* FIXME: If our FIN has been ACKed (perhaps in this segment), then enter TIME-WAIT, start the time-wait timer, turn off the other timers; otherwise enter the CLOSING state. */ + TI_DbgPrint(MIN_TRACE, ("FIXME: Maybe go to ctClosing connection state.\n")); break; } case ctFinWait2: { /* FIXME: Enter the TIME-WAIT state. Start the time-wait timer, turn off the other timers. */ + TI_DbgPrint(MIN_TRACE, ("FIXME: Go to ctTimeWait connection state.\n")); break; } case ctCloseWait: @@ -1048,8 +1634,9 @@ static VOID TCPiReceive( } case ctTimeWait: { - /* Remain in ctTimeWait connection state. Restart the 2 MSL time-wait + /* FIXME: Remain in ctTimeWait connection state. Restart the 2 MSL time-wait timeout */ + TI_DbgPrint(MIN_TRACE, ("FIXME: Restart the 2 MSL time-wait timeout.\n")); return; } default: @@ -1057,6 +1644,7 @@ static VOID TCPiReceive( return; } } + TI_DbgPrint(MIN_TRACE, ("Return.\n")); return; } } @@ -1077,9 +1665,14 @@ VOID TCPReceive( AF_SEARCH SearchContext; PIPv4_HEADER IPv4Header; PADDRESS_FILE AddrFile; - PTCP_HEADER TCPHeader; + PTCPv4_HEADER TCPHeader; PIP_ADDRESS DstAddress; UINT DataSize, i; + TCPv4_PSEUDO_HEADER TcpPseudoHeader; + KIRQL OldIrql; + + ASSERT(NTE); + ASSERT(IPPacket); TI_DbgPrint(MAX_TRACE, ("Called.\n")); @@ -1104,9 +1697,25 @@ VOID TCPReceive( DISPLAY_TCP_PACKET(IPPacket); - TCPHeader = (PTCP_HEADER)IPPacket->Data; + TCPHeader = (PTCPv4_HEADER)IPPacket->Data; - /* FIXME: Calculate and validate TCP checksum */ +#if 0 + /* Build pseudo TCP header which is used to prevent misrouted segments */ + TcpPseudoHeader.SourceAddress = IPPacket->SrcAddr.Address.IPv4Address; + TcpPseudoHeader.DestinationAddress = IPPacket->DstAddr.Address.IPv4Address;; + TcpPseudoHeader.Zero = 0; + TcpPseudoHeader.Protocol = 0; + /* Length of TCP header and segment data */ + TcpPseudoHeader.TCPLength = IPv4Header->TotalLength; + + /* Checksum TCP header and segment data */ + if (!TCPCorrectChecksum(&TcpPseudoHeader, IPPacket->Header, IPPacket->TotalSize)) { + TI_DbgPrint(MIN_TRACE, ("Segment received with bad checksum. Checksum field (0x%X)\n", + WN2H(TCPHeader->Checksum))); + /* Discard packet */ + return; + } +#endif /* FIXME: Sanity checks */ @@ -1115,14 +1724,28 @@ VOID TCPReceive( found, drop the packet */ AddrFile = AddrSearchFirst(DstAddress, - TCPHeader->DestPort, + TCPHeader->DestinationPort, IPPROTO_TCP, &SearchContext); if (AddrFile) { + ULONG TotalLength; + ULONG DataOffset; + ULONG Payload; + + TotalLength = WN2H(IPv4Header->TotalLength); + DataOffset = (TCPHeader->DataOffset & 0xF0) >> (4 << 2); /* Left-most 4 bits (in 32-bit words)*/ + Payload = TotalLength - DataOffset; + + TI_DbgPrint(DEBUG_TCP, ("TotalLength %d, DataOffset %d (%d bytes payload)\n", + TotalLength, DataOffset, Payload)); + /* There can be only one client */ TI_DbgPrint(MID_TRACE, ("Found address file object for IPv4 TCP datagram to address (0x%X).\n", DN2H(DstAddress->Address.IPv4Address))); - TCPiReceive(AddrFile, IPPacket, TCPHeader); + /* FIXME: Slow but effective synchronization */ + KeAcquireSpinLock(&AddrFile->Connection->Lock, &OldIrql); + TCPiReceive(AddrFile, IPPacket, TCPHeader, Payload); + KeReleaseSpinLock(&AddrFile->Connection->Lock, OldIrql); } else { /* There are no open address files that will take this datagram */ /* FIXME: IPv4 only */ @@ -1149,6 +1772,15 @@ NTSTATUS TCPStartup( /* Register this protocol with IP layer */ IPRegisterProtocol(IPPROTO_TCP, TCPReceive); + ExInitializeNPagedLookasideList( + &TCPSegmentList, /* Lookaside list */ + NULL, /* Allocate routine */ + NULL, /* Free routine */ + 0, /* Flags */ + sizeof(TCP_SEGMENT), /* Size of each entry */ + TAG('T','C','P','S'), /* Tag */ + 0); /* Depth */ + TCPInitialized = TRUE; return STATUS_SUCCESS; @@ -1169,6 +1801,8 @@ NTSTATUS TCPShutdown( /* Deregister this protocol with IP layer */ IPRegisterProtocol(IPPROTO_TCP, NULL); + ExDeleteNPagedLookasideList(&TCPSegmentList); + TCPInitialized = FALSE; return STATUS_SUCCESS; diff --git a/reactos/lib/msafd/include/msafd.h b/reactos/lib/msafd/include/msafd.h index 6e18d4998dd..d7bfd1bcfe7 100644 --- a/reactos/lib/msafd/include/msafd.h +++ b/reactos/lib/msafd/include/msafd.h @@ -18,6 +18,13 @@ #include <afd/shared.h> #include <debug.h> +/*typedef _MSAFD_LISTEN_REQUEST +{ + LIST_ENTRY ListEntry; + HANDLE Socket; +} MSAFD_LISTEN_REQUEST, *PMSAFD_LISTEN_REQUEST;*/ + + extern HANDLE GlobalHeap; extern WSPUPCALLTABLE Upcalls; extern LPWPUCOMPLETEOVERLAPPEDREQUEST lpWPUCompleteOverlappedRequest; diff --git a/reactos/lib/msafd/misc/dllmain.c b/reactos/lib/msafd/misc/dllmain.c index 9f23b9291fd..feab9fef992 100644 --- a/reactos/lib/msafd/misc/dllmain.c +++ b/reactos/lib/msafd/misc/dllmain.c @@ -23,6 +23,9 @@ DWORD DebugTraceLevel = MIN_TRACE; /* To make the linker happy */ VOID STDCALL KeBugCheck (ULONG BugCheckCode) {} +/* FIXME: Protect me */ +static LIST_ENTRY MsAfdListenRequests; /* Queue of listen reqests */ + HANDLE GlobalHeap; WSPUPCALLTABLE Upcalls; @@ -358,6 +361,7 @@ WSPListen( * 0, or SOCKET_ERROR if the socket could not be bound */ { + //PAFD_LISTEN_REQUEST MsafdRequest; FILE_REQUEST_LISTEN Request; FILE_REPLY_LISTEN Reply; IO_STATUS_BLOCK Iosb; @@ -365,28 +369,38 @@ WSPListen( AFD_DbgPrint(MAX_TRACE, ("s (0x%X) backlog (%d).\n", s, backlog)); +/* MsafdRequest = (PMSAFD_LISTEN_REQUEST)HeapAlloc( + GlobalHeap, 0, sizeof(MSAFD_LISTEN_REQUEST)); + if (MsafdRequest == NULL) + { + AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); + *lpErrno = WSAENOBUFS; + return SOCKET_ERROR; + }*/ + Request.Backlog = backlog; Status = NtDeviceIoControlFile( (HANDLE)s, NULL, - NULL, - NULL, - &Iosb, - IOCTL_AFD_LISTEN, - &Request, - sizeof(FILE_REQUEST_LISTEN), - &Reply, - sizeof(FILE_REPLY_LISTEN)); - if (Status == STATUS_PENDING) { - AFD_DbgPrint(MAX_TRACE, ("Waiting on transport.\n")); - /* FIXME: Wait only for blocking sockets */ - Status = NtWaitForSingleObject((HANDLE)s, FALSE, NULL); - } - - if (!NT_SUCCESS(Status)) { + NULL, + NULL, + &Iosb, + IOCTL_AFD_LISTEN, + &Request, + sizeof(FILE_REQUEST_LISTEN), + &Reply, + sizeof(FILE_REPLY_LISTEN)); + if (Status == STATUS_PENDING) + { + //AFD_DbgPrint(MAX_TRACE, ("Waiting on transport.\n")); + //InsertTailList(&MsAfdListenRequests, &MsafdRequest->ListEntry); + } + else if (!NT_SUCCESS(Status)) + { + //HeapFree(GlobalHeap, 0, MsafdRequest); *lpErrno = Reply.Status; - return SOCKET_ERROR; + return SOCKET_ERROR; } return 0; @@ -841,10 +855,13 @@ WSPStartup( */ { HMODULE hWS2_32; - INT Status; + NTSTATUS Status; + INT Error; AFD_DbgPrint(MAX_TRACE, ("wVersionRequested (0x%X) \n", wVersionRequested)); + Status = NO_ERROR; + EnterCriticalSection(&InitCriticalSection); Upcalls = UpcallTable; @@ -859,17 +876,22 @@ WSPStartup( lpWPUCompleteOverlappedRequest = (LPWPUCOMPLETEOVERLAPPEDREQUEST) GetProcAddress(hWS2_32, "WPUCompleteOverlappedRequest"); if (lpWPUCompleteOverlappedRequest != NULL) { - Status = NO_ERROR; StartupCount++; + } else { + AFD_DbgPrint(MIN_TRACE, ("GetProcAddress() failed for WPUCompleteOverlappedRequest\n")); + CloseCommandChannel(); + Error = WSASYSNOTREADY; } } else { AFD_DbgPrint(MIN_TRACE, ("GetModuleHandle() failed for ws2_32.dll\n")); + CloseCommandChannel(); + Error = WSASYSNOTREADY; } } else { AFD_DbgPrint(MIN_TRACE, ("Cannot open afd.sys\n")); + Error = WSASYSNOTREADY; } } else { - Status = NO_ERROR; StartupCount++; } @@ -969,6 +991,8 @@ DllMain(HANDLE hInstDll, InitializeCriticalSection(&InitCriticalSection); + InitializeListHead(&MsAfdListenRequests); + GlobalHeap = GetProcessHeap(); CreateHelperDLLDatabase(); From 72eafe158304e73324221dc223285dd7489598c0 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Thu, 4 Mar 2004 21:12:11 +0000 Subject: [PATCH 0326/1463] new result buffer length parameter for SHELL_FindExecutable() svn path=/trunk/; revision=8538 --- reactos/lib/shell32/shell32_main.h | 2 +- reactos/lib/shell32/shelllink.c | 2 +- reactos/lib/shell32/shlexec.c | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/reactos/lib/shell32/shell32_main.h b/reactos/lib/shell32/shell32_main.h index 33f52cbb575..41c8ab77de2 100644 --- a/reactos/lib/shell32/shell32_main.h +++ b/reactos/lib/shell32/shell32_main.h @@ -240,7 +240,7 @@ typedef UINT (*SHELL_ExecuteW32)(const WCHAR *lpCmd, void *env, BOOL shWait, BOOL WINAPI ShellExecuteExW32(LPSHELLEXECUTEINFOW psei, SHELL_ExecuteW32 execfunc); UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, - LPWSTR lpResult, LPWSTR key, void **env, LPITEMIDLIST pidl, LPCWSTR args); + 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); diff --git a/reactos/lib/shell32/shelllink.c b/reactos/lib/shell32/shelllink.c index 70e6539ece3..47a1d75e6a3 100644 --- a/reactos/lib/shell32/shelllink.c +++ b/reactos/lib/shell32/shelllink.c @@ -671,7 +671,7 @@ static HRESULT WINAPI IPersistStream_fnSave( *exePath = '\0'; if (This->sPath) - SHELL_FindExecutable(NULL, This->sPath, wOpen, exePath, NULL, NULL, NULL, NULL); + SHELL_FindExecutable(NULL, This->sPath, wOpen, exePath, MAX_PATH, NULL, NULL, NULL, NULL); /* if there's no PIDL, generate one */ if( ! This->pPidl ) diff --git a/reactos/lib/shell32/shlexec.c b/reactos/lib/shell32/shlexec.c index 4e9a62354eb..ab2a0552cb0 100644 --- a/reactos/lib/shell32/shlexec.c +++ b/reactos/lib/shell32/shlexec.c @@ -503,7 +503,7 @@ static UINT SHELL_FindExecutableByOperation(LPCWSTR lpPath, LPCWSTR lpFile, LPCW * on the operation) */ UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, - LPWSTR lpResult, LPWSTR key, void **env, LPITEMIDLIST pidl, LPCWSTR args) + LPWSTR lpResult, int resultLen, LPWSTR key, void **env, LPITEMIDLIST pidl, LPCWSTR args) { static const WCHAR wWindows[] = {'w','i','n','d','o','w','s',0}; static const WCHAR wPrograms[] = {'p','r','o','g','r','a','m','s',0}; @@ -660,7 +660,7 @@ UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, if (retval > 32) { - SHELL_ArgifyW(lpResult, MAX_PATH, command, xlpFile, pidl, args); + SHELL_ArgifyW(lpResult, resultLen, command, xlpFile, pidl, args); /* Remove double quotation marks and command line arguments */ if (*lpResult == '"') @@ -908,7 +908,7 @@ HINSTANCE WINAPI FindExecutableW(LPCWSTR lpFile, LPCWSTR lpDirectory, LPWSTR lpR SetCurrentDirectoryW(lpDirectory); } - retval = SHELL_FindExecutable(lpDirectory, lpFile, wszOpen, lpResult, NULL, NULL, NULL, NULL); + retval = SHELL_FindExecutable(lpDirectory, lpFile, wszOpen, lpResult, MAX_PATH, NULL, NULL, NULL, NULL); TRACE("returning %s\n", debugstr_w(lpResult)); if (lpDirectory) @@ -1187,7 +1187,7 @@ BOOL WINAPI ShellExecuteExW32 (LPSHELLEXECUTEINFOW psei, SHELL_ExecuteW32 execfu /* Else, try to find the executable */ buffer[0] = '\0'; - retval = SHELL_FindExecutable(*sei_tmp.lpDirectory? sei_tmp.lpDirectory: NULL, lpFile, sei_tmp.lpVerb, buffer, wszProtocol, &env, sei_tmp.lpIDList, sei_tmp.lpParameters); + retval = SHELL_FindExecutable(*sei_tmp.lpDirectory? sei_tmp.lpDirectory: NULL, lpFile, sei_tmp.lpVerb, buffer, 1024, wszProtocol, &env, sei_tmp.lpIDList, sei_tmp.lpParameters); if (retval > 32) /* Found */ { From 45a3ee5da7d8b3e74e64d104840f76953cf90055 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Thu, 4 Mar 2004 23:01:19 +0000 Subject: [PATCH 0327/1463] - Reenable the screen after setting the mode. svn path=/trunk/; revision=8539 --- reactos/drivers/video/miniport/vga/initvga.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/reactos/drivers/video/miniport/vga/initvga.c b/reactos/drivers/video/miniport/vga/initvga.c index 32ee1c338ca..b01aa64b246 100644 --- a/reactos/drivers/video/miniport/vga/initvga.c +++ b/reactos/drivers/video/miniport/vga/initvga.c @@ -103,6 +103,9 @@ vgaSetRegisters(PVGA_REGISTERS Registers) VideoPortWritePortUchar(ATTRIB, i); VideoPortWritePortUchar(ATTRIB, Registers->Attribute[i]); } + + /* Renable screen. */ + VideoPortWritePortUchar(ATTRIB, 0x20); } VOID From c77f9d0572d74be42e967c6fbb678d3899ba1111 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Thu, 4 Mar 2004 23:11:43 +0000 Subject: [PATCH 0328/1463] - Fix for crash on gui exit caused by trying to free an uninitialized variable. svn path=/trunk/; revision=8540 --- reactos/drivers/video/displays/vga/main/enable.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/reactos/drivers/video/displays/vga/main/enable.c b/reactos/drivers/video/displays/vga/main/enable.c index f3e353f53be..b871fdc65a9 100644 --- a/reactos/drivers/video/displays/vga/main/enable.c +++ b/reactos/drivers/video/displays/vga/main/enable.c @@ -1,9 +1,9 @@ /* * entry.c * - * $Revision: 1.1 $ - * $Author: navaraf $ - * $Date: 2004/01/10 14:39:20 $ + * $Revision: 1.2 $ + * $Author: dwelch $ + * $Date: 2004/03/04 23:11:43 $ * */ @@ -487,6 +487,9 @@ DrvEnableSurface(IN DHPDEV PDev) pdsurf->Scan0 = ppdev->fbScreen; pdsurf->BitmapStart = ppdev->fbScreen; pdsurf->StartBmp = ppdev->fbScreen; + pdsurf->BankInfo = NULL; + pdsurf->BankInfo2RW = NULL; + pdsurf->BankBufferPlane0 = NULL; /* pdsurf->Conv = &ConvertBuffer[0]; */ From 876b2d6ed6073819941f97188aeda9ecd4ecbc95 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Thu, 4 Mar 2004 23:14:01 +0000 Subject: [PATCH 0329/1463] - Make the install depend on the targets to be installed (I don't know how anyone could service without this). svn path=/trunk/; revision=8541 --- reactos/tools/helper.mk | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/tools/helper.mk b/reactos/tools/helper.mk index 9c4b5c5449b..fe2cd7f2247 100644 --- a/reactos/tools/helper.mk +++ b/reactos/tools/helper.mk @@ -1,4 +1,4 @@ -# $Id: helper.mk,v 1.58 2004/03/02 21:07:35 dwelch Exp $ +# $Id: helper.mk,v 1.59 2004/03/04 23:14:01 dwelch Exp $ # # Helper makefile for ReactOS modules # Variables this makefile accepts: @@ -899,13 +899,13 @@ else # MK_MODE ifeq ($(INSTALL_SYMBOLS),yes) -install: $(SUBDIRS:%=%_install) +install: $(SUBDIRS:%=%_install) $(MK_FULLNAME) $(MK_BASENAME).sym -$(CP) $(MK_FULLNAME) $(INSTALL_DIR)/$(MK_INSTALLDIR)/$(MK_FULLNAME) -$(CP) $(MK_BASENAME).sym $(INSTALL_DIR)/symbols/$(MK_BASENAME).sym else # INSTALL_SYMBOLS -install: $(SUBDIRS:%=%_install) +install: $(SUBDIRS:%=%_install) $(MK_FULLNAME) -$(CP) $(MK_FULLNAME) $(INSTALL_DIR)/$(MK_INSTALLDIR)/$(MK_FULLNAME) endif # INSTALL_SYMBOLS From 7963bf353589d06eb1badba7e3673b58968ad2a6 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Thu, 4 Mar 2004 23:26:36 +0000 Subject: [PATCH 0330/1463] CVS maintaince svn path=/trunk/; revision=8542 --- reactos/lib/iphlpapi/.cvsignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/lib/iphlpapi/.cvsignore b/reactos/lib/iphlpapi/.cvsignore index 02319febd95..e1b2a86dc6b 100644 --- a/reactos/lib/iphlpapi/.cvsignore +++ b/reactos/lib/iphlpapi/.cvsignore @@ -16,4 +16,6 @@ temp.exp *.plg *.bak *.map -*.tmp \ No newline at end of file +*.tmp +Makefile.ros +iphlpapi.spec.def From 1f2169eb293cf1d4265f57334431ae968c9a5a35 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 5 Mar 2004 00:48:11 +0000 Subject: [PATCH 0331/1463] 2004-04-04 Filip Navara <xnavara@volny.cz> * drivers/net/afd/afd/dispatch.c (AfdDispGetName): Implement. * drivers/net/afd/include/afd.h (TdiQueryInformation): Declare. * drivers/net/tcpip/tcpip/dispatch.c (DispTdiQueryInformation): Partially implement for TDI_QUERY_ADDRESS_INFO request. * drivers/net/tcpip/transport/tcp/tcp.c (TCPiBuildPacket): Don't use variable name NdisBuffer, because it causes conficts. svn path=/trunk/; revision=8543 --- reactos/drivers/net/afd/afd/dispatch.c | 42 +++++++++++- reactos/drivers/net/afd/include/afd.h | 5 ++ reactos/drivers/net/tcpip/tcpip/dispatch.c | 67 ++++++++++++++++++- reactos/drivers/net/tcpip/transport/tcp/tcp.c | 16 +++-- 4 files changed, 121 insertions(+), 9 deletions(-) diff --git a/reactos/drivers/net/afd/afd/dispatch.c b/reactos/drivers/net/afd/afd/dispatch.c index f1dd9dcf33f..20fc516989e 100644 --- a/reactos/drivers/net/afd/afd/dispatch.c +++ b/reactos/drivers/net/afd/afd/dispatch.c @@ -969,6 +969,9 @@ NTSTATUS AfdDispGetName( PFILE_REPLY_GETNAME Reply; PAFDFCB FCB; PFILE_OBJECT FileObject; + PMDL Mdl; + PTDI_ADDRESS_INFO AddressInfoBuffer; + ULONG AddressInfoSize; AFD_DbgPrint(MIN_TRACE, ("\n")); @@ -996,9 +999,42 @@ NTSTATUS AfdDispGetName( FileObject = FCB->TdiAddressObject; } - /* FIXME: Implement */ - /* Make a TDI_QUERY_INFORMATION call to underlying TDI transport driver */ - Status = STATUS_UNSUCCESSFUL; + AddressInfoSize = sizeof(TDI_ADDRESS_INFO) + sizeof(TDI_ADDRESS_IP); + AddressInfoBuffer = ExAllocatePool(NonPagedPool, AddressInfoSize); + + Mdl = IoAllocateMdl( + AddressInfoBuffer, /* Virtual address of buffer */ + AddressInfoSize, /* Length of buffer */ + FALSE, /* Not secondary */ + FALSE, /* Don't charge quota */ + NULL); /* Don't use IRP */ + + if (!Mdl) { + ExFreePool(AddressInfoBuffer); + return STATUS_INSUFFICIENT_RESOURCES; + } + + MmBuildMdlForNonPagedPool(Mdl); + + Status = TdiQueryInformation( + FileObject, + TDI_QUERY_ADDRESS_INFO, + Mdl); + + if (NT_SUCCESS(Status)) { + Reply->Name.sa_family = AddressInfoBuffer->Address.Address[0].AddressType; + + RtlCopyMemory( + Reply->Name.sa_data, + AddressInfoBuffer->Address.Address[0].Address, + sizeof(Reply->Name.sa_data)); + + Reply->NameSize = sizeof(Reply->Name.sa_family) + + AddressInfoBuffer->Address.Address[0].AddressLength; + } + + IoFreeMdl(Mdl); + ExFreePool(AddressInfoBuffer); } AFD_DbgPrint(MAX_TRACE, ("Status (0x%X).\n", Status)); diff --git a/reactos/drivers/net/afd/include/afd.h b/reactos/drivers/net/afd/include/afd.h index c73c45a6568..f556ec076c1 100644 --- a/reactos/drivers/net/afd/include/afd.h +++ b/reactos/drivers/net/afd/include/afd.h @@ -375,6 +375,11 @@ NTSTATUS TdiSetEventHandler( PVOID Handler, PVOID Context); +NTSTATUS TdiQueryInformation( + PFILE_OBJECT FileObject, + LONG QueryType, + PMDL MdlBuffer); + NTSTATUS TdiQueryDeviceControl( PFILE_OBJECT FileObject, ULONG IoControlCode, diff --git a/reactos/drivers/net/tcpip/tcpip/dispatch.c b/reactos/drivers/net/tcpip/tcpip/dispatch.c index 9f846f90b6a..084cec61f54 100644 --- a/reactos/drivers/net/tcpip/tcpip/dispatch.c +++ b/reactos/drivers/net/tcpip/tcpip/dispatch.c @@ -602,9 +602,74 @@ NTSTATUS DispTdiQueryInformation( * Status of operation */ { + PTDI_REQUEST_KERNEL_QUERY_INFORMATION Parameters; + PTRANSPORT_CONTEXT TranContext; + PIO_STACK_LOCATION IrpSp; + TI_DbgPrint(DEBUG_IRP, ("Called.\n")); - return STATUS_NOT_IMPLEMENTED; + IrpSp = IoGetCurrentIrpStackLocation(Irp); + Parameters = (PTDI_REQUEST_KERNEL_QUERY_INFORMATION)&IrpSp->Parameters; + + TranContext = IrpSp->FileObject->FsContext; + if (!TranContext) { + TI_DbgPrint(MID_TRACE, ("Bad transport context.\n")); + return STATUS_INVALID_CONNECTION; + } + + switch (Parameters->QueryType) + { + case TDI_QUERY_ADDRESS_INFO: + { + PTDI_ADDRESS_INFO AddressInfo; + PADDRESS_FILE AddrFile; + PTA_IP_ADDRESS Address; + + AddressInfo = (PTDI_ADDRESS_INFO)MmGetSystemAddressForMdl(Irp->MdlAddress); + + switch ((ULONG)IrpSp->FileObject->FsContext2) { + case TDI_TRANSPORT_ADDRESS_FILE: + AddrFile = (PADDRESS_FILE)TranContext->Handle.AddressHandle; + break; + + case TDI_CONNECTION_FILE: + AddrFile = ((PCONNECTION_ENDPOINT)TranContext->Handle.ConnectionContext)->AddressFile; + break; + + default: + TI_DbgPrint(MIN_TRACE, ("Invalid transport context\n")); + return STATUS_INVALID_PARAMETER; + } + + if (!AddrFile) { + TI_DbgPrint(MID_TRACE, ("No address file object.\n")); + return STATUS_INVALID_PARAMETER; + } + + if (MmGetMdlByteCount(Irp->MdlAddress) < + (sizeof(TDI_ADDRESS_INFO) + sizeof(TDI_ADDRESS_IP))) { + TI_DbgPrint(MID_TRACE, ("MDL buffer too small.\n")); + return STATUS_BUFFER_OVERFLOW; + } + + /* FIXME: Is this count really the one we should return? */ + AddressInfo->ActivityCount = AddrFile->RefCount; + + Address = (PTA_IP_ADDRESS)&AddressInfo->Address; + Address->TAAddressCount = 1; + Address->Address[0].AddressLength = TDI_ADDRESS_LENGTH_IP; + Address->Address[0].AddressType = TDI_ADDRESS_TYPE_IP; + Address->Address[0].Address[0].sin_port = AddrFile->Port; + Address->Address[0].Address[0].in_addr = AddrFile->ADE->Address->Address.IPv4Address; + RtlZeroMemory( + &Address->Address[0].Address[0].sin_zero, + sizeof(Address->Address[0].Address[0].sin_zero)); + + return STATUS_SUCCESS; + } + } + + return STATUS_NOT_IMPLEMENTED; } diff --git a/reactos/drivers/net/tcpip/transport/tcp/tcp.c b/reactos/drivers/net/tcpip/transport/tcp/tcp.c index 2de651ec2b0..66596c0b6cb 100644 --- a/reactos/drivers/net/tcpip/transport/tcp/tcp.c +++ b/reactos/drivers/net/tcpip/transport/tcp/tcp.c @@ -329,16 +329,22 @@ NTSTATUS TCPiBuildPacket( { PVOID Data; UINT Size; - PNDIS_BUFFER NdisBuffer = SendRequest->Buffer; - NdisChainBufferAtBack(Packet->NdisPacket, NdisBuffer); + /* + * NOTE: + * Don't name the variable NdisBuffer, because that's internal name + * used by the NdisChainBufferAtBack macro and it's the easiest way + * how to achieve an elegant crash. + */ + PNDIS_BUFFER _NdisBuffer = SendRequest->Buffer; + NdisChainBufferAtBack(Packet->NdisPacket, _NdisBuffer); /* Add checksum for segment data */ /* FIXME: Verify that there is no problem for chained buffers with an odd length */ - while (NdisBuffer != NULL) + while (_NdisBuffer != NULL) { - NdisQueryBuffer(NdisBuffer, &Data, &Size); + NdisQueryBuffer(_NdisBuffer, &Data, &Size); DbgPrint("Checksum7:(%d bytes)\n", Size); Checksum = TCPv4Checksum(Data, Size, ~Checksum); - NdisGetNextBuffer(NdisBuffer, &NdisBuffer); + NdisGetNextBuffer(_NdisBuffer, &_NdisBuffer); } } From a57c52276eb6d6706f75586e3026053f133666d0 Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Fri, 5 Mar 2004 04:50:01 +0000 Subject: [PATCH 0332/1463] route add and route delete now work on real windows with our iphlpapi. svn path=/trunk/; revision=8544 --- reactos/include/tcpmisc.h | 22 +-- reactos/lib/iphlpapi/Makefile.in | 2 +- reactos/lib/iphlpapi/ifenum_reactos.c | 89 ++++-------- reactos/lib/iphlpapi/iphlpapi_private.h | 5 + reactos/lib/iphlpapi/ipstats_reactos.c | 6 +- reactos/lib/iphlpapi/route_reactos.c | 173 ++++++++++++++++++++++++ 6 files changed, 221 insertions(+), 76 deletions(-) create mode 100644 reactos/lib/iphlpapi/route_reactos.c diff --git a/reactos/include/tcpmisc.h b/reactos/include/tcpmisc.h index ce9c7fad8ab..612741b3199 100644 --- a/reactos/include/tcpmisc.h +++ b/reactos/include/tcpmisc.h @@ -13,7 +13,7 @@ /* ID to use for requesting the route table */ #define IP_MIB_ROUTETABLE_ENTRY_ID 0x101 -#define IP_MIB_ADDRTABLE_ENTRY_ID 102 +#define IP_MIB_ADDRTABLE_ENTRY_ID 0x102 typedef struct IFEntry { ULONG if_index; @@ -41,20 +41,22 @@ typedef struct IFEntry { UCHAR if_descr[1]; } IFEntry; +// As in the mib from RFC 1213 + typedef struct _IPRouteEntry { ULONG ire_dest; ULONG ire_index; //matches if_index in IFEntry and iae_index in IPAddrEntry - ULONG ire_metric; - ULONG ire_unk1; //?? - ULONG ire_unk2; //?? - ULONG ire_unk3; //?? + ULONG ire_metric1; + ULONG ire_metric2; + ULONG ire_metric3; + ULONG ire_metric4; ULONG ire_gw; - ULONG ire_unk4; //?? - ULONG ire_unk5; //?? - ULONG ire_unk6; //?? + ULONG ire_type; + ULONG ire_proto; + ULONG ire_age; ULONG ire_mask; - ULONG ire_unk7; //?? - ULONG ire_unk8; //?? + ULONG ire_metric5; + ULONG ire_info; } IPRouteEntry; typedef struct _IPAddrEntry { diff --git a/reactos/lib/iphlpapi/Makefile.in b/reactos/lib/iphlpapi/Makefile.in index b15c34dc328..c604c52508a 100644 --- a/reactos/lib/iphlpapi/Makefile.in +++ b/reactos/lib/iphlpapi/Makefile.in @@ -15,7 +15,7 @@ C_SRCS = \ media.c \ registry.c \ resinfo_reactos.c \ - route.c + route_reactos.c RC_SRCS = iphlpapi.rc RC_BINSRC = iphlpapi.rc diff --git a/reactos/lib/iphlpapi/ifenum_reactos.c b/reactos/lib/iphlpapi/ifenum_reactos.c index 92a83b9f1f9..ed5286d911d 100644 --- a/reactos/lib/iphlpapi/ifenum_reactos.c +++ b/reactos/lib/iphlpapi/ifenum_reactos.c @@ -359,6 +359,7 @@ static NTSTATUS getInterfaceInfoSet( HANDLE tcpFile, ( tcpFile, &entIDSet[i], &infoSetInt[curInterf].if_info ); + DPRINT("tdiGetMibForIfEntity: %08x\n", status); if( NT_SUCCESS(status) ) { DWORD numAddrs; IPAddrEntry *addrs; @@ -366,25 +367,22 @@ static NTSTATUS getInterfaceInfoSet( HANDLE tcpFile, int j,k; interfaceInfoComplete = FALSE; - for( j = 0; NT_SUCCESS(status); j++ ) { - status = getNthIpEntity( tcpFile, j, &ip_ent ); - if( NT_SUCCESS(status) ) - status = tdiGetIpAddrsForIpEntity - ( tcpFile, &ip_ent, &addrs, &numAddrs ); - for( k = 0; k < numAddrs && NT_SUCCESS(status); k++ ) { - if( addrs[k].iae_index == - infoSetInt[curInterf].if_info.ent.if_index ) { - memcpy( &infoSetInt[curInterf].ip_addr, - &addrs[k], - sizeof( addrs[k] ) ); - interfaceInfoComplete = TRUE; - break; - } - } - if( interfaceInfoComplete ) break; - } + status = getNthIpEntity( tcpFile, 0, &ip_ent ); + if( NT_SUCCESS(status) ) + status = tdiGetIpAddrsForIpEntity + ( tcpFile, &ip_ent, &addrs, &numAddrs ); + for( k = 0; k < numAddrs && NT_SUCCESS(status); k++ ) { + DPRINT("ADDR %d: index %d (target %d)\n", k, addrs[k].iae_index, infoSetInt[curInterf].if_info.ent.if_index); + if( addrs[k].iae_index == + infoSetInt[curInterf].if_info.ent.if_index ) { + memcpy( &infoSetInt[curInterf].ip_addr, + &addrs[k], + sizeof( addrs[k] ) ); + curInterf++; + break; + } + } } - if( NT_SUCCESS(status) ) curInterf++; } } } @@ -572,6 +570,11 @@ InterfaceIndexTable *getInterfaceIndexTableInt( BOOL nonLoopbackOnly ) { if( NT_SUCCESS(status) ) { status = getInterfaceInfoSet( tcpFile, &ifInfo, &numInterfaces ); + DPRINT("InterfaceInfoSet: %08x, %04x:%08x\n", + status, + ifInfo->entity_id.tei_entity, + ifInfo->entity_id.tei_instance); + if( NT_SUCCESS(status) ) { ret = (InterfaceIndexTable *) calloc(1, @@ -580,14 +583,17 @@ InterfaceIndexTable *getInterfaceIndexTableInt( BOOL nonLoopbackOnly ) { if (ret) { ret->numAllocated = numInterfaces; + DPRINT("NumInterfaces = %d\n", numInterfaces); for( i = 0; i < numInterfaces; i++ ) { + DPRINT("Examining interface %d\n", i); if( !nonLoopbackOnly || !isLoopback( tcpFile, &ifInfo[i].entity_id ) ) { + DPRINT("Interface %d matches (%d)\n", i, curInterface); ret->indexes[curInterface++] = ifInfo[i].if_info.ent.if_index; } - } + } ret->numIndexes = curInterface; } @@ -789,48 +795,3 @@ char *toIPAddressString(unsigned int addr, char string[16]) } return string; } - -DWORD createIpForwardEntryOS( PMIB_IPFORWARDROW pRoute ) { - HANDLE tcpFile = INVALID_HANDLE_VALUE; - NTSTATUS status = openTcpFile( &tcpFile ); - TCP_REQUEST_SET_INFORMATION_EX_SAFELY_SIZED req = - TCP_REQUEST_SET_INFORMATION_INIT; - IPRouteEntry *rte; - TDIEntityID id; - DWORD returnSize = 0; - - DPRINT("Called.\n"); - - if( NT_SUCCESS(status) ) - status = getNthIpEntity( tcpFile, 0, &id ); - - if( NT_SUCCESS(status) ) { - req.Req.ID.toi_class = INFO_CLASS_PROTOCOL; - req.Req.ID.toi_type = INFO_TYPE_PROVIDER; - req.Req.ID.toi_id = IP_MIB_ROUTETABLE_ENTRY_ID; - req.Req.ID.toi_entity = id; - req.Req.BufferSize = sizeof(*rte); - rte = - (IPRouteEntry *)&req.Req.Buffer[0]; - - rte->ire_dest = pRoute->dwForwardDest; - rte->ire_index = pRoute->dwForwardIfIndex; - rte->ire_metric = pRoute->dwForwardMetric1; - rte->ire_gw = pRoute->dwForwardNextHopAS; - rte->ire_mask = pRoute->dwForwardMask; - - status = DeviceIoControl( tcpFile, - IOCTL_TCP_SET_INFORMATION_EX, - &req, - sizeof(req), - NULL, - 0, - &returnSize, - NULL ); - } - - if( tcpFile != INVALID_HANDLE_VALUE ) - closeTcpFile( tcpFile ); - - return status; -} diff --git a/reactos/lib/iphlpapi/iphlpapi_private.h b/reactos/lib/iphlpapi/iphlpapi_private.h index dbe089015b3..729a19815a2 100644 --- a/reactos/lib/iphlpapi/iphlpapi_private.h +++ b/reactos/lib/iphlpapi/iphlpapi_private.h @@ -116,4 +116,9 @@ BOOL WINAPI GetComputerNameExA(COMPUTER_NAME_FORMAT,LPSTR,LPDWORD); #endif +#ifdef FORCE_DEBUG +#undef DPRINT +#define DPRINT(fmt,x...) DbgPrint("%s:%d:%s: " fmt, __FILE__, __LINE__, __FUNCTION__, ## x) +#endif + #endif/*IPPRIVATE_H*/ diff --git a/reactos/lib/iphlpapi/ipstats_reactos.c b/reactos/lib/iphlpapi/ipstats_reactos.c index 1651d0aeef5..9526000e43d 100644 --- a/reactos/lib/iphlpapi/ipstats_reactos.c +++ b/reactos/lib/iphlpapi/ipstats_reactos.c @@ -446,6 +446,8 @@ RouteTable *getRouteTable(void) if( !NT_SUCCESS(status) ) return 0; + DPRINT("GETTING ROUTE TABLE\n"); + out_route_table = HeapAlloc( GetProcessHeap(), 0, sizeof(RouteTable) + (sizeof(RouteEntry) * (numRoutes - 1)) ); @@ -487,7 +489,7 @@ RouteTable *getRouteTable(void) out_route_table->routes[routeNum].ifIndex = route_set[j].ire_index; out_route_table->routes[routeNum].metric = - route_set[j].ire_metric; + route_set[j].ire_metric1; } if( route_set ) tdiFreeThingSet( route_set ); @@ -495,6 +497,8 @@ RouteTable *getRouteTable(void) routesAdded += snmpInfo.ipsi_numroutes; } + DPRINT("Return: %08x, %08x\n", status, out_route_table); + return out_route_table; } diff --git a/reactos/lib/iphlpapi/route_reactos.c b/reactos/lib/iphlpapi/route_reactos.c new file mode 100644 index 00000000000..0fdf0c57d1d --- /dev/null +++ b/reactos/lib/iphlpapi/route_reactos.c @@ -0,0 +1,173 @@ +/* + * iphlpapi dll implementation -- Setting and storing route information + * + * These are stubs for functions that set routing information on the target + * operating system. They are grouped here because their implementation will + * vary widely by operating system. + * + * Copyright (C) 2004 Art Yerkes + * 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 "config.h" +#include "iphlpapi_private.h" + +#include <stdarg.h> +#include <stdlib.h> +#include <sys/types.h> +#ifdef HAVE_NETINET_IN_H +# include <netinet/in.h> +#endif +#ifdef HAVE_ARPA_INET_H +# include <arpa/inet.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +# include <arpa/nameser.h> +#endif +#ifdef HAVE_RESOLV_H +# include <resolv.h> +#endif + +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "resinfo.h" +#include "iphlpapi.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(iphlpapi); + +DWORD createIpForwardEntry( PMIB_IPFORWARDROW pRoute ) { + HANDLE tcpFile = INVALID_HANDLE_VALUE; + NTSTATUS status = openTcpFile( &tcpFile ); + TCP_REQUEST_SET_INFORMATION_EX_SAFELY_SIZED req = + TCP_REQUEST_SET_INFORMATION_INIT; + IPRouteEntry *rte; + TDIEntityID id; + DWORD returnSize = 0; + + DPRINT("Called.\n"); + + if( NT_SUCCESS(status) ) + status = getNthIpEntity( tcpFile, 0, &id ); + + if( NT_SUCCESS(status) ) { + req.Req.ID.toi_class = INFO_CLASS_PROTOCOL; + req.Req.ID.toi_type = INFO_TYPE_PROVIDER; + req.Req.ID.toi_id = IP_MIB_ROUTETABLE_ENTRY_ID; + req.Req.ID.toi_entity = id; + req.Req.BufferSize = sizeof(*rte); + rte = + (IPRouteEntry *)&req.Req.Buffer[0]; + + // dwForwardPolicy + // dwForwardNextHopAS + rte->ire_dest = pRoute->dwForwardDest; + rte->ire_mask = pRoute->dwForwardMask; + rte->ire_gw = pRoute->dwForwardNextHop; + rte->ire_index = pRoute->dwForwardIfIndex; + rte->ire_type = pRoute->dwForwardType; + rte->ire_proto = pRoute->dwForwardProto; + rte->ire_age = pRoute->dwForwardAge; + rte->ire_metric1 = pRoute->dwForwardMetric1; + rte->ire_metric2 = pRoute->dwForwardMetric2; + rte->ire_metric3 = pRoute->dwForwardMetric3; + rte->ire_metric4 = pRoute->dwForwardMetric4; + rte->ire_metric5 = pRoute->dwForwardMetric5; + + status = DeviceIoControl( tcpFile, + IOCTL_TCP_SET_INFORMATION_EX, + &req, + sizeof(req), + NULL, + 0, + &returnSize, + NULL ); + } + + if( tcpFile != INVALID_HANDLE_VALUE ) + closeTcpFile( tcpFile ); + + DPRINT("Returning: %08x (IOCTL was %08x)\n", status, IOCTL_TCP_SET_INFORMATION_EX); + + if( NT_SUCCESS(status) ) + return NO_ERROR; + else + return status; +} + +DWORD setIpForwardEntry( PMIB_IPFORWARDROW pRoute ) { + FIXME(":stub\n"); + return (DWORD) 0; +} + +DWORD deleteIpForwardEntry( PMIB_IPFORWARDROW pRoute ) { + HANDLE tcpFile = INVALID_HANDLE_VALUE; + NTSTATUS status = openTcpFile( &tcpFile ); + TCP_REQUEST_SET_INFORMATION_EX_SAFELY_SIZED req = + TCP_REQUEST_SET_INFORMATION_INIT; + IPRouteEntry *rte; + TDIEntityID id; + DWORD returnSize = 0; + + DPRINT("Called.\n"); + + if( NT_SUCCESS(status) ) + status = getNthIpEntity( tcpFile, 0, &id ); + + if( NT_SUCCESS(status) ) { + req.Req.ID.toi_class = INFO_CLASS_PROTOCOL; + req.Req.ID.toi_type = INFO_TYPE_PROVIDER; + req.Req.ID.toi_id = IP_MIB_ROUTETABLE_ENTRY_ID; + req.Req.ID.toi_entity = id; + req.Req.BufferSize = sizeof(*rte); + rte = + (IPRouteEntry *)&req.Req.Buffer[0]; + + // dwForwardPolicy + // dwForwardNextHopAS + rte->ire_dest = pRoute->dwForwardDest; + rte->ire_mask = INADDR_NONE; + rte->ire_gw = pRoute->dwForwardNextHop; + rte->ire_index = pRoute->dwForwardIfIndex; + rte->ire_type = 2; /*pRoute->dwForwardType;*/ + rte->ire_proto = pRoute->dwForwardProto; + rte->ire_age = pRoute->dwForwardAge; + rte->ire_metric1 = pRoute->dwForwardMetric1; + rte->ire_metric2 = INADDR_NONE; + rte->ire_metric3 = INADDR_NONE; + rte->ire_metric4 = INADDR_NONE; + rte->ire_metric5 = INADDR_NONE; + + status = DeviceIoControl( tcpFile, + IOCTL_TCP_SET_INFORMATION_EX, + &req, + sizeof(req), + NULL, + 0, + &returnSize, + NULL ); + } + + if( tcpFile != INVALID_HANDLE_VALUE ) + closeTcpFile( tcpFile ); + + DPRINT("Returning: %08x (IOCTL was %08x)\n", status, IOCTL_TCP_SET_INFORMATION_EX); + + if( NT_SUCCESS(status) ) + return NO_ERROR; + else + return status; +} From 35cd217de408e78afe2b7f414fb6a908a13564fc Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Fri, 5 Mar 2004 09:02:42 +0000 Subject: [PATCH 0333/1463] - Changed the check for determining if the drawing destination is the screen or not. - Fixed the order of calls to MouseSafetyOnDrawEnd in some functions. svn path=/trunk/; revision=8545 --- reactos/subsys/win32k/eng/copybits.c | 20 ++++++++++---------- reactos/subsys/win32k/eng/mouse.c | 13 +++++++------ reactos/subsys/win32k/eng/transblt.c | 6 +++--- reactos/subsys/win32k/objects/dc.c | 12 +++++++++++- 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/reactos/subsys/win32k/eng/copybits.c b/reactos/subsys/win32k/eng/copybits.c index 5ac9cf6d079..6ccbeffcde6 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.21 2004/02/24 13:27:02 weiden Exp $ +/* $Id: copybits.c,v 1.22 2004/03/05 09:02:41 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -48,7 +48,8 @@ EngCopyBits(SURFOBJ *Dest, POINTL *SourcePoint) { BOOLEAN ret; - SURFGDI *DestGDI, *SourceGDI; + PSURFGDI DestGDI = (PSURFGDI)AccessInternalObjectFromUserObject(Dest), + SourceGDI = (PSURFGDI)AccessInternalObjectFromUserObject(Source); BYTE clippingType; RECTL rclTmp; POINTL ptlTmp; @@ -79,8 +80,8 @@ EngCopyBits(SURFOBJ *Dest, ret = DestGDI->CopyBits(Dest, Source, Clip, ColorTranslation, DestRect, SourcePoint); IntUnLockGDIDriver(DestGDI); - MouseSafetyOnDrawEnd(Source, SourceGDI); MouseSafetyOnDrawEnd(Dest, DestGDI); + MouseSafetyOnDrawEnd(Source, SourceGDI); return ret; } @@ -97,8 +98,8 @@ EngCopyBits(SURFOBJ *Dest, ret = SourceGDI->CopyBits(Dest, Source, Clip, ColorTranslation, DestRect, SourcePoint); IntUnLockGDIDriver(DestGDI); - MouseSafetyOnDrawEnd(Source, SourceGDI); MouseSafetyOnDrawEnd(Dest, DestGDI); + MouseSafetyOnDrawEnd(Source, SourceGDI); return ret; } @@ -109,8 +110,8 @@ EngCopyBits(SURFOBJ *Dest, NULL, Clip, ColorTranslation, DestRect, SourcePoint, NULL, NULL, NULL, 0); - MouseSafetyOnDrawEnd(Source, SourceGDI); MouseSafetyOnDrawEnd(Dest, DestGDI); + MouseSafetyOnDrawEnd(Source, SourceGDI); return ret; } @@ -131,8 +132,8 @@ EngCopyBits(SURFOBJ *Dest, case DC_TRIVIAL: DestGDI->DIB_BitBlt(Dest, Source, DestGDI, SourceGDI, DestRect, SourcePoint, NULL, NULL, ColorTranslation, SRCCOPY); - MouseSafetyOnDrawEnd(Source, SourceGDI); MouseSafetyOnDrawEnd(Dest, DestGDI); + MouseSafetyOnDrawEnd(Source, SourceGDI); return(TRUE); @@ -145,8 +146,8 @@ EngCopyBits(SURFOBJ *Dest, DestGDI->DIB_BitBlt(Dest, Source, DestGDI, SourceGDI, &rclTmp, &ptlTmp, NULL, NULL, ColorTranslation, SRCCOPY); - MouseSafetyOnDrawEnd(Source, SourceGDI); MouseSafetyOnDrawEnd(Dest, DestGDI); + MouseSafetyOnDrawEnd(Source, SourceGDI); return(TRUE); @@ -178,15 +179,14 @@ EngCopyBits(SURFOBJ *Dest, } while(EnumMore); - MouseSafetyOnDrawEnd(Source, SourceGDI); - MouseSafetyOnDrawEnd(Dest, DestGDI); + MouseSafetyOnDrawEnd(Source, SourceGDI); return(TRUE); } - MouseSafetyOnDrawEnd(Source, SourceGDI); MouseSafetyOnDrawEnd(Dest, DestGDI); + MouseSafetyOnDrawEnd(Source, SourceGDI); return FALSE; } diff --git a/reactos/subsys/win32k/eng/mouse.c b/reactos/subsys/win32k/eng/mouse.c index 16c09ed385d..4b8ee94375a 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.62 2004/02/24 13:27:02 weiden Exp $ +/* $Id: mouse.c,v 1.63 2004/03/05 09:02:41 hbirr Exp $ * * PROJECT: ReactOS kernel * PURPOSE: Mouse @@ -53,6 +53,10 @@ /* FUNCTIONS *****************************************************************/ +BOOL FASTCALL +IntIsPrimarSurface(PSURFGDI SurfGDI); + + BOOL FASTCALL IntCheckClipCursor(LONG *x, LONG *y, PSYSTEM_CURSORINFO CurInfo) { @@ -109,9 +113,7 @@ MouseSafetyOnDrawStart(PSURFOBJ SurfObj, PSURFGDI SurfGDI, LONG HazardX1, ObDereferenceObject(InputWindowStation); return(FALSE); } - - - if (SurfObj->iType != STYPE_DEVICE || MouseEnabled == FALSE) + if (!IntIsPrimarSurface(SurfGDI) || MouseEnabled == FALSE) { ObDereferenceObject(InputWindowStation); return(FALSE); @@ -199,8 +201,7 @@ MouseSafetyOnDrawEnd(PSURFOBJ SurfObj, PSURFGDI SurfGDI) } MouseEnabled = CurInfo->Enabled && CurInfo->ShowingCursor; - - if (SurfObj->iType != STYPE_DEVICE || MouseEnabled == FALSE) + if (!IntIsPrimarSurface(SurfGDI) || MouseEnabled == FALSE) { ExReleaseFastMutex(&CurInfo->CursorMutex); ObDereferenceObject(InputWindowStation); diff --git a/reactos/subsys/win32k/eng/transblt.c b/reactos/subsys/win32k/eng/transblt.c index 5caab776e47..36809670fd2 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.11 2004/02/24 13:27:02 weiden Exp $ +/* $Id: transblt.c,v 1.12 2004/03/05 09:02:42 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -102,8 +102,8 @@ EngTransparentBlt(PSURFOBJ Dest, TransparentColor, Reserved); IntUnLockGDIDriver(DestGDI); - MouseSafetyOnDrawEnd(Source, SourceGDI); MouseSafetyOnDrawEnd(Dest, DestGDI); + MouseSafetyOnDrawEnd(Source, SourceGDI); if(EngDeleteSurface(hTemp) == FALSE) { @@ -116,8 +116,8 @@ EngTransparentBlt(PSURFOBJ Dest, // Simulate a transparent blt - MouseSafetyOnDrawEnd(Source, SourceGDI); MouseSafetyOnDrawEnd(Dest, DestGDI); + MouseSafetyOnDrawEnd(Source, SourceGDI); return TRUE; } diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index b709d7d6d39..19fa36ca070 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.121 2004/02/19 21:12:10 weiden Exp $ +/* $Id: dc.c,v 1.122 2004/03/05 09:02:42 hbirr Exp $ * * DC.C - Device context functions * @@ -2072,4 +2072,14 @@ DC_SetOwnership(HDC hDC, PEPROCESS Owner) } } +BOOL FASTCALL +IntIsPrimarSurface(PSURFGDI SurfGDI) +{ + if (PrimarySurface.Handle == NULL) + { + return FALSE; + } + return SurfGDI == (PSURFGDI)AccessInternalObject((ULONG) PrimarySurface.Handle) ? TRUE : FALSE; +} + /* EOF */ From 30264d875a041c0c3dcb4b9a69db8c868afdd62c Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Fri, 5 Mar 2004 11:31:59 +0000 Subject: [PATCH 0334/1463] - Made it possible to allocate a pageop only if no other pageop for the given address exist. - Try to pageout a page only if no other access to the page exist. - Gave a free page only to the next waiting request (in MmReleasePageMemoryConsumer), if sufficient free pages are available. svn path=/trunk/; revision=8546 --- reactos/ntoskrnl/include/internal/mm.h | 2 +- reactos/ntoskrnl/mm/anonmem.c | 4 +-- reactos/ntoskrnl/mm/balance.c | 11 +++--- reactos/ntoskrnl/mm/pageop.c | 14 ++++++-- reactos/ntoskrnl/mm/rmap.c | 46 +++++--------------------- reactos/ntoskrnl/mm/section.c | 6 ++-- 6 files changed, 32 insertions(+), 51 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index b58a80dfbcf..028d2158138 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -445,7 +445,7 @@ MmReleasePageOp(PMM_PAGEOP PageOp); PMM_PAGEOP MmGetPageOp(PMEMORY_AREA MArea, ULONG Pid, PVOID Address, - PMM_SECTION_SEGMENT Segment, ULONG Offset, ULONG OpType); + PMM_SECTION_SEGMENT Segment, ULONG Offset, ULONG OpType, BOOL First); PMM_PAGEOP MmCheckForPageOp(PMEMORY_AREA MArea, ULONG Pid, PVOID Address, PMM_SECTION_SEGMENT Segment, ULONG Offset); diff --git a/reactos/ntoskrnl/mm/anonmem.c b/reactos/ntoskrnl/mm/anonmem.c index ada600cd796..edb0990f8a4 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.24 2003/12/31 05:33:03 jfilby Exp $ +/* $Id: anonmem.c,v 1.25 2004/03/05 11:31:59 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/anonmem.c @@ -287,7 +287,7 @@ MmNotPresentFaultVirtualMemory(PMADDRESS_SPACE AddressSpace, */ PageOp = MmGetPageOp(MemoryArea, (ULONG)MemoryArea->Process->UniqueProcessId, (PVOID)PAGE_ROUND_DOWN(Address), NULL, 0, - MM_PAGEOP_PAGEIN); + MM_PAGEOP_PAGEIN, FALSE); if (PageOp == NULL) { DPRINT1("MmGetPageOp failed"); diff --git a/reactos/ntoskrnl/mm/balance.c b/reactos/ntoskrnl/mm/balance.c index b5582e7eb61..75ee583e9fd 100644 --- a/reactos/ntoskrnl/mm/balance.c +++ b/reactos/ntoskrnl/mm/balance.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: balance.c,v 1.25 2003/12/30 18:52:05 fireball Exp $ +/* $Id: balance.c,v 1.26 2004/03/05 11:31:59 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/balance.c @@ -111,6 +111,7 @@ MmReleasePageMemoryConsumer(ULONG Consumer, PHYSICAL_ADDRESS Page) PMM_ALLOCATION_REQUEST Request; PLIST_ENTRY Entry; KIRQL oldIrql; + ULONG OldAvailable; #if defined(__GNUC__) if (Page.QuadPart == 0LL) @@ -126,8 +127,8 @@ MmReleasePageMemoryConsumer(ULONG Consumer, PHYSICAL_ADDRESS Page) if (MmGetReferenceCountPage(Page) == 1) { InterlockedDecrement((LONG *)&MiMemoryConsumers[Consumer].PagesUsed); - InterlockedIncrement((LONG *)&MiNrAvailablePages); - if (IsListEmpty(&AllocationListHead)) + OldAvailable = InterlockedIncrement((LONG *)&MiNrAvailablePages); + if (IsListEmpty(&AllocationListHead) || OldAvailable + 1 < MiMinimumAvailablePages) { KeReleaseSpinLock(&AllocationListLock, oldIrql); MmDereferencePage(Page); @@ -349,7 +350,7 @@ MiBalancerThread(PVOID Unused) { /* MiBalancerEvent */ CHECKPOINT; - while (MiNrAvailablePages < MiMinimumAvailablePages) + while (MiNrAvailablePages < MiMinimumAvailablePages + 5) { for (i = 0; i < MC_MAXIMUM; i++) { @@ -370,7 +371,7 @@ MiBalancerThread(PVOID Unused) else if (Status == STATUS_SUCCESS + 1) { /* MiBalancerTimer */ - ShouldRun = MiNrAvailablePages < MiMinimumAvailablePages ? TRUE : FALSE; + ShouldRun = MiNrAvailablePages < MiMinimumAvailablePages + 5 ? TRUE : FALSE; for (i = 0; i < MC_MAXIMUM; i++) { if (MiMemoryConsumers[i].Trim != NULL) diff --git a/reactos/ntoskrnl/mm/pageop.c b/reactos/ntoskrnl/mm/pageop.c index c0854bdb971..5e57dea8445 100644 --- a/reactos/ntoskrnl/mm/pageop.c +++ b/reactos/ntoskrnl/mm/pageop.c @@ -1,4 +1,4 @@ -/* $Id: pageop.c,v 1.18 2003/10/12 17:05:48 hbirr Exp $ +/* $Id: pageop.c,v 1.19 2004/03/05 11:31:59 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -134,7 +134,7 @@ MmCheckForPageOp(PMEMORY_AREA MArea, ULONG Pid, PVOID Address, PMM_PAGEOP MmGetPageOp(PMEMORY_AREA MArea, ULONG Pid, PVOID Address, - PMM_SECTION_SEGMENT Segment, ULONG Offset, ULONG OpType) + PMM_SECTION_SEGMENT Segment, ULONG Offset, ULONG OpType, BOOL First) /* * FUNCTION: Get a page operation descriptor corresponding to * the memory area and either the segment, offset pair or the @@ -191,7 +191,14 @@ MmGetPageOp(PMEMORY_AREA MArea, ULONG Pid, PVOID Address, */ if (PageOp != NULL) { - PageOp->ReferenceCount++; + if (First) + { + PageOp = NULL; + } + else + { + PageOp->ReferenceCount++; + } KeReleaseSpinLock(&MmPageOpHashTableLock, oldIrql); return(PageOp); } @@ -203,6 +210,7 @@ MmGetPageOp(PMEMORY_AREA MArea, ULONG Pid, PVOID Address, if (PageOp == NULL) { KeReleaseSpinLock(&MmPageOpHashTableLock, oldIrql); + KEBUGCHECK(0); return(NULL); } diff --git a/reactos/ntoskrnl/mm/rmap.c b/reactos/ntoskrnl/mm/rmap.c index f8f1ff7ded5..9fe184c5151 100644 --- a/reactos/ntoskrnl/mm/rmap.c +++ b/reactos/ntoskrnl/mm/rmap.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: rmap.c,v 1.26 2003/12/30 18:52:05 fireball Exp $ +/* $Id: rmap.c,v 1.27 2004/03/05 11:31:59 hbirr Exp $ * * COPYRIGHT: See COPYING in the top directory * PROJECT: ReactOS kernel @@ -140,24 +140,11 @@ MmWritePagePhysicalAddress(PHYSICAL_ADDRESS PhysicalAddress) */ PageOp = MmGetPageOp(MemoryArea, 0, 0, MemoryArea->Data.SectionData.Segment, - Offset, MM_PAGEOP_PAGEOUT); + Offset, MM_PAGEOP_PAGEOUT, TRUE); + if (PageOp == NULL) { - DPRINT1("MmGetPageOp failed\n"); - KEBUGCHECK(0); - } - - - if (PageOp->Thread != PsGetCurrentThread()) - { - MmUnlockAddressSpace(AddressSpace); - Status = KeWaitForSingleObject(&PageOp->CompletionEvent, - 0, - KernelMode, - FALSE, - NULL); - KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); - MmReleasePageOp(PageOp); + MmUnlockAddressSpace(AddressSpace); if (Address < (PVOID)KERNEL_BASE) { ObDereferenceObject(Process); @@ -179,11 +166,10 @@ MmWritePagePhysicalAddress(PHYSICAL_ADDRESS PhysicalAddress) else if (Type == MEMORY_AREA_VIRTUAL_MEMORY) { PageOp = MmGetPageOp(MemoryArea, Address < (PVOID)KERNEL_BASE ? Process->UniqueProcessId : 0, - Address, NULL, 0, MM_PAGEOP_PAGEOUT); + Address, NULL, 0, MM_PAGEOP_PAGEOUT, TRUE); - if (PageOp->Thread != PsGetCurrentThread()) + if (PageOp == NULL) { - MmReleasePageOp(PageOp); MmUnlockAddressSpace(AddressSpace); if (Address < (PVOID)KERNEL_BASE) { @@ -278,16 +264,9 @@ MmPageOutPhysicalAddress(PHYSICAL_ADDRESS PhysicalAddress) */ PageOp = MmGetPageOp(MemoryArea, 0, 0, MemoryArea->Data.SectionData.Segment, - Offset, MM_PAGEOP_PAGEOUT); + Offset, MM_PAGEOP_PAGEOUT, TRUE); if (PageOp == NULL) { - DPRINT1("MmGetPageOp failed\n"); - KEBUGCHECK(0); - } - - if (PageOp->Thread != PsGetCurrentThread()) - { - MmReleasePageOp(PageOp); MmUnlockAddressSpace(AddressSpace); if (Address < (PVOID)KERNEL_BASE) { @@ -310,17 +289,10 @@ MmPageOutPhysicalAddress(PHYSICAL_ADDRESS PhysicalAddress) else if (Type == MEMORY_AREA_VIRTUAL_MEMORY) { PageOp = MmGetPageOp(MemoryArea, Address < (PVOID)KERNEL_BASE ? Process->UniqueProcessId : 0, - Address, NULL, 0, MM_PAGEOP_PAGEOUT); - if (PageOp->Thread != PsGetCurrentThread()) + Address, NULL, 0, MM_PAGEOP_PAGEOUT, TRUE); + if (PageOp == NULL) { MmUnlockAddressSpace(AddressSpace); - Status = KeWaitForSingleObject(&PageOp->CompletionEvent, - 0, - KernelMode, - FALSE, - NULL); - KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); - MmReleasePageOp(PageOp); if (Address < (PVOID)KERNEL_BASE) { ObDereferenceObject(Process); diff --git a/reactos/ntoskrnl/mm/section.c b/reactos/ntoskrnl/mm/section.c index d08dbff15ee..6f1a8fac688 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.145 2004/03/04 00:07:02 navaraf Exp $ +/* $Id: section.c,v 1.146 2004/03/05 11:31:59 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/section.c @@ -673,7 +673,7 @@ MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace, /* * Get or create a page operation descriptor */ - PageOp = MmGetPageOp(MemoryArea, 0, 0, Segment, Offset, MM_PAGEOP_PAGEIN); + PageOp = MmGetPageOp(MemoryArea, 0, 0, Segment, Offset, MM_PAGEOP_PAGEIN, FALSE); if (PageOp == NULL) { DPRINT1("MmGetPageOp failed\n"); @@ -1274,7 +1274,7 @@ MmAccessFaultSectionView(PMADDRESS_SPACE AddressSpace, * Get or create a pageop */ PageOp = MmGetPageOp(MemoryArea, 0, 0, Segment, Offset, - MM_PAGEOP_ACCESSFAULT); + MM_PAGEOP_ACCESSFAULT, FALSE); if (PageOp == NULL) { DPRINT1("MmGetPageOp failed\n"); From f1d20bbf5422079fa632e56743854f2ccf329c10 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 6 Mar 2004 01:22:04 +0000 Subject: [PATCH 0335/1463] 2004-03-06 Filip Navara <xnavara@volny.cz> * drivers/video/videoprt/int10.c (VideoPortInt10): Print more debug informations. * drivers/video/videoprt/videoprt.c (VideoPortInitialize): Prevent conflicts when more miniport drivers are loaded. (VideoPortGetDeviceBase, VideoPortMapMemory, InternalMapMemory): Change way of reporting error to prevent reporting error when the resources were successfully mapped. (VideoPortDDCMonitorHelper): Add stub. (VidDispatchDeviceControl): Allocate memory from NonPagedPool. Add debug messages. * drivers/video/videoprt/videoprt.def (VideoPortDDCMonitorHelper): Add export. * drivers/video/videoprt/videoprt.edf (VideoPortDDCMonitorHelper): Ditto. * include/ddk/winddi.h (ENG_SYSTEM_ATTRIBUTE): Declare. * include/win32k/driver.h (DRIVER_FindMPDriver): Change declaration. * subsys/win32k/eng/surface.c (EngModifySurface): Implement. * subsys/win32k/misc/driver.c (DRIVER_FindMPDriver): Modify to open specific miniport driver depending on parameter. * subsys/win32k/objects/dc.c (GetRegistryPath): Add parameter to specify display driver number. (FindDriverFileNames): Ditto. (SetupDevMode): Ditto. (IntCreateDC): Correct DPRINT. (IntCreatePrimarySurface): Change to try more miniport drivers before giving up. * subsys/win32k/stubs/stubs.c (HeapVidMemAllocAligned, VidMemFree, EngDitherColor, EngQuerySystemAttribute): Add stubs. * subsys/win32k/win32k.edf (EngDitherColor, EngQuerySystemAttribute, HeapVidMemAllocAligned, VidMemFree, EngModifySurface): Add exports. * subsys/win32k/win32k.def: Ditto. svn path=/trunk/; revision=8547 --- reactos/drivers/video/videoprt/int10.c | 9 +- reactos/drivers/video/videoprt/videoprt.c | 180 +++++++--- reactos/drivers/video/videoprt/videoprt.def | 3 +- reactos/drivers/video/videoprt/videoprt.edf | 3 +- reactos/drivers/video/videoprt/videoprt.h | 7 +- reactos/include/ddk/winddi.h | 7 + reactos/include/win32k/driver.h | 2 +- reactos/subsys/win32k/eng/surface.c | 38 +- reactos/subsys/win32k/misc/driver.c | 8 +- reactos/subsys/win32k/objects/dc.c | 370 +++++++++++--------- reactos/subsys/win32k/stubs/stubs.c | 64 ++++ reactos/subsys/win32k/win32k.def | 7 +- reactos/subsys/win32k/win32k.edf | 7 +- 13 files changed, 472 insertions(+), 233 deletions(-) diff --git a/reactos/drivers/video/videoprt/int10.c b/reactos/drivers/video/videoprt/int10.c index 34efdef34af..87121980c26 100644 --- a/reactos/drivers/video/videoprt/int10.c +++ b/reactos/drivers/video/videoprt/int10.c @@ -18,7 +18,7 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: int10.c,v 1.2 2004/02/22 22:19:42 navaraf Exp $ + * $Id: int10.c,v 1.3 2004/03/06 01:22:02 navaraf Exp $ */ #include "videoprt.h" @@ -56,12 +56,19 @@ VideoPortInt10( } memset(&Regs, 0, sizeof(Regs)); + DPRINT("- Input register Eax: %x\n", BiosArguments->Eax); Regs.Eax = BiosArguments->Eax; + DPRINT("- Input register Ebx: %x\n", BiosArguments->Ebx); Regs.Ebx = BiosArguments->Ebx; + DPRINT("- Input register Ecx: %x\n", BiosArguments->Ecx); Regs.Ecx = BiosArguments->Ecx; + DPRINT("- Input register Edx: %x\n", BiosArguments->Edx); Regs.Edx = BiosArguments->Edx; + DPRINT("- Input register Esi: %x\n", BiosArguments->Esi); Regs.Esi = BiosArguments->Esi; + DPRINT("- Input register Edi: %x\n", BiosArguments->Edi); Regs.Edi = BiosArguments->Edi; + DPRINT("- Input register Ebp: %x\n", BiosArguments->Ebp); Regs.Ebp = BiosArguments->Ebp; Status = Ke386CallBios(0x10, &Regs); diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index 3cd5e90506d..8d8a4f35e68 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.5 2004/03/04 18:51:58 navaraf Exp $ + * $Id: videoprt.c,v 1.6 2004/03/06 01:22:02 navaraf Exp $ */ #include "videoprt.h" @@ -155,7 +155,7 @@ VideoPortGetDeviceBase(IN PVOID HwDeviceExtension, VIDEO_PORT_DEVICE_EXTENSION, MiniPortDeviceExtension); - return InternalMapMemory(DeviceExtension, IoAddress, NumberOfUchars, InIoSpace); + return InternalMapMemory(DeviceExtension, IoAddress, NumberOfUchars, InIoSpace, NULL); } @@ -208,8 +208,11 @@ VideoPortGetAccessRanges(IN PVOID HwDeviceExtension, if (0 == NumRequestedResources && PCIBus == DeviceExtension->AdapterInterfaceType) { - DPRINT("Looking for VendorId 0x%04x DeviceId 0x%04x\n", (int)*((USHORT *) VendorId), - (int)*((USHORT *) DeviceId)); + if (DeviceId != NULL && VendorId != NULL) + { + DPRINT("Looking for VendorId 0x%04x DeviceId 0x%04x\n", (int)*((USHORT *) VendorId), + (int)*((USHORT *) DeviceId)); + } FoundDevice = FALSE; PciSlotNumber.u.AsULONG = *Slot; for (FunctionNumber = 0; ! FoundDevice && FunctionNumber < 8; FunctionNumber++) @@ -220,11 +223,15 @@ VideoPortGetAccessRanges(IN PVOID HwDeviceExtension, PciSlotNumber.u.AsULONG,&Config, 0, sizeof(PCI_COMMON_CONFIG))) { - DPRINT("Slot 0x%02x (Device %d Function %d) VendorId 0x%04x DeviceId 0x%04x\n", - PciSlotNumber.u.AsULONG, PciSlotNumber.u.bits.DeviceNumber, - PciSlotNumber.u.bits.FunctionNumber, Config.VendorID, Config.DeviceID); - FoundDevice = (Config.VendorID == *((USHORT *) VendorId) && - Config.DeviceID == *((USHORT *) DeviceId)); + if (DeviceId != NULL && VendorId != NULL) + { + DPRINT("Slot 0x%02x (Device %d Function %d) VendorId 0x%04x DeviceId 0x%04x\n", + PciSlotNumber.u.AsULONG, PciSlotNumber.u.bits.DeviceNumber, + PciSlotNumber.u.bits.FunctionNumber, Config.VendorID, Config.DeviceID); + } + + FoundDevice = (VendorId == NULL || Config.VendorID == *((USHORT *) VendorId)) && + (DeviceId == NULL || Config.DeviceID == *((USHORT *) DeviceId)); } } if (! FoundDevice) @@ -451,7 +458,7 @@ VideoPortInitialize(IN PVOID Context1, IN PVOID HwContext) { PUNICODE_STRING RegistryPath; - UCHAR Again; + UCHAR Again = FALSE; WCHAR DeviceBuffer[20]; WCHAR SymlinkBuffer[20]; WCHAR DeviceVideoBuffer[20]; @@ -460,7 +467,7 @@ VideoPortInitialize(IN PVOID Context1, PDEVICE_OBJECT MPDeviceObject; VIDEO_PORT_CONFIG_INFO ConfigInfo; PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - ULONG DeviceNumber = 0; + ULONG DisplayNumber; UNICODE_STRING DeviceName; UNICODE_STRING SymlinkName; ULONG MaxBus; @@ -468,30 +475,59 @@ VideoPortInitialize(IN PVOID Context1, KIRQL IRQL; KAFFINITY Affinity; ULONG InterruptVector; + OBJECT_ATTRIBUTES Obj; + HANDLE ObjHandle; DPRINT("VideoPortInitialize\n"); RegistryPath = (PUNICODE_STRING) Context2; - /* Build Dispatch table from passed data */ + /* Build Dispatch table from passed data */ MPDriverObject->DriverStartIo = (PDRIVER_STARTIO) HwInitializationData->HwStartIO; - /* Create a unicode device name */ + /* Find the first free device number */ + for (DisplayNumber = 0;;) + { + swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DisplayNumber + 1); + RtlInitUnicodeString(&SymlinkName, SymlinkBuffer); + InitializeObjectAttributes(&Obj, &SymlinkName, 0, NULL, NULL); + Status = ZwOpenSymbolicLinkObject(&ObjHandle, GENERIC_READ, &Obj); + if (NT_SUCCESS(Status)) + { + ZwClose(ObjHandle); + DisplayNumber++; + continue; + } + else if (Status == STATUS_NOT_FOUND || Status == STATUS_UNSUCCESSFUL) + { + break; + } + else + { + return Status; + } + } + + DPRINT("- DisplayNumber: %d\n", DisplayNumber); + Again = FALSE; + do { - swprintf(DeviceBuffer, L"\\Device\\Video%lu", DeviceNumber); + /* Create a unicode device name. */ + swprintf(DeviceBuffer, L"\\Device\\Video%lu", DisplayNumber); RtlInitUnicodeString(&DeviceName, DeviceBuffer); - /* Create the device */ - Status = IoCreateDevice(MPDriverObject, - HwInitializationData->HwDeviceExtensionSize + - sizeof(VIDEO_PORT_DEVICE_EXTENSION), - &DeviceName, - FILE_DEVICE_VIDEO, - 0, - TRUE, - &MPDeviceObject); + /* Create the device. */ + Status = IoCreateDevice( + MPDriverObject, + HwInitializationData->HwDeviceExtensionSize + + sizeof(VIDEO_PORT_DEVICE_EXTENSION), + &DeviceName, + FILE_DEVICE_VIDEO, + 0, + TRUE, + &MPDeviceObject); if (!NT_SUCCESS(Status)) { DPRINT("IoCreateDevice call failed with status 0x%08x\n", Status); @@ -518,8 +554,8 @@ VideoPortInitialize(IN PVOID Context1, DeviceExtension->RegistryPath.Buffer = ExAllocatePoolWithTag(PagedPool, MaxLen, TAG_VIDEO_PORT); - swprintf(DeviceExtension->RegistryPath.Buffer, L"%s\\Device%d", - RegistryPath->Buffer, DeviceNumber); + swprintf(DeviceExtension->RegistryPath.Buffer, L"%s\\Device0", + RegistryPath->Buffer); DeviceExtension->RegistryPath.Length = wcslen(DeviceExtension->RegistryPath.Buffer) * sizeof(WCHAR); @@ -569,14 +605,14 @@ VideoPortInitialize(IN PVOID Context1, DPRINT("Found adapter\n"); /* create symbolic link "\??\DISPLAYx" */ - swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DeviceNumber+1); + swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DisplayNumber + 1); RtlInitUnicodeString (&SymlinkName, SymlinkBuffer); IoCreateSymbolicLink (&SymlinkName, &DeviceName); /* Add entry to DEVICEMAP\VIDEO key in registry */ - swprintf(DeviceVideoBuffer, L"\\Device\\Video%d", DeviceNumber); + swprintf(DeviceVideoBuffer, L"\\Device\\Video%d", DisplayNumber); RtlWriteRegistryValue(RTL_REGISTRY_DEVICEMAP, L"VIDEO", DeviceVideoBuffer, @@ -632,7 +668,7 @@ VideoPortInitialize(IN PVOID Context1, return Status; } } - DeviceNumber++; + DisplayNumber++; } while (Again); @@ -712,6 +748,7 @@ VideoPortMapMemory(IN PVOID HwDeviceExtension, OUT PVOID *VirtualAddress) { PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + NTSTATUS Status; DPRINT("VideoPortMapMemory\n"); @@ -719,9 +756,9 @@ VideoPortMapMemory(IN PVOID HwDeviceExtension, VIDEO_PORT_DEVICE_EXTENSION, MiniPortDeviceExtension); *VirtualAddress = InternalMapMemory(DeviceExtension, PhysicalAddress, - *Length, *InIoSpace); + *Length, *InIoSpace, &Status); - return NULL == *VirtualAddress ? STATUS_NO_MEMORY : STATUS_SUCCESS; + return Status; } @@ -1133,7 +1170,7 @@ VidDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject, DeviceExtension = DeviceObject->DeviceExtension; /* Translate the IRP to a VRP */ - vrp = ExAllocatePool(PagedPool, sizeof(VIDEO_REQUEST_PACKET)); + vrp = ExAllocatePool(NonPagedPool, sizeof(VIDEO_REQUEST_PACKET)); if (NULL == vrp) { return STATUS_NO_MEMORY; @@ -1141,6 +1178,8 @@ VidDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject, vrp->StatusBlock = (PSTATUS_BLOCK) &(Irp->IoStatus); vrp->IoControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode; + DPRINT("- IoControlCode: %x\n", vrp->IoControlCode); + /* We're assuming METHOD_BUFFERED */ vrp->InputBuffer = Irp->AssociatedIrp.SystemBuffer; vrp->InputBufferLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength; @@ -1153,6 +1192,8 @@ VidDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject, /* Free the VRP */ ExFreePool(vrp); + DPRINT("- Returned status: %x\n", Irp->IoStatus.Status); + IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; @@ -1162,7 +1203,8 @@ PVOID STDCALL InternalMapMemory(IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension, IN PHYSICAL_ADDRESS IoAddress, IN ULONG NumberOfUchars, - IN UCHAR InIoSpace) + IN UCHAR InIoSpace, + OUT NTSTATUS *Status) { PHYSICAL_ADDRESS TranslatedAddress; PVIDEO_PORT_ADDRESS_MAPPING AddressMapping; @@ -1187,6 +1229,10 @@ InternalMapMemory(IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension, NumberOfUchars <= AddressMapping->NumberOfUchars) { AddressMapping->MappingCount++; + if (Status) + { + *Status = STATUS_SUCCESS; + } return AddressMapping->MappedAddress; } Entry = Entry->Flink; @@ -1199,35 +1245,62 @@ InternalMapMemory(IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension, IoAddress, &AddressSpace, &TranslatedAddress) == FALSE) - return NULL; + { + if (Status) + { + *Status = STATUS_NO_MEMORY; + } + return NULL; + } /* i/o space */ if (AddressSpace != 0) { - assert(0 == TranslatedAddress.u.HighPart); - return (PVOID) TranslatedAddress.u.LowPart; + assert(0 == TranslatedAddress.u.HighPart); + if (Status) + { + *Status = STATUS_SUCCESS; + } + return (PVOID) TranslatedAddress.u.LowPart; } MappedAddress = MmMapIoSpace(TranslatedAddress, NumberOfUchars, FALSE); - AddressMapping = ExAllocatePoolWithTag(PagedPool, - sizeof(VIDEO_PORT_ADDRESS_MAPPING), - TAG_VIDEO_PORT); - if (AddressMapping == NULL) - return MappedAddress; + if (MappedAddress) + { + if (Status) + { + *Status = STATUS_SUCCESS; + } - AddressMapping->MappedAddress = MappedAddress; - AddressMapping->NumberOfUchars = NumberOfUchars; - AddressMapping->IoAddress = IoAddress; - AddressMapping->SystemIoBusNumber = DeviceExtension->SystemIoBusNumber; - AddressMapping->MappingCount = 1; + AddressMapping = ExAllocatePoolWithTag(PagedPool, + sizeof(VIDEO_PORT_ADDRESS_MAPPING), + TAG_VIDEO_PORT); + if (AddressMapping == NULL) + return MappedAddress; - InsertHeadList(&DeviceExtension->AddressMappingListHead, - &AddressMapping->List); + AddressMapping->MappedAddress = MappedAddress; + AddressMapping->NumberOfUchars = NumberOfUchars; + AddressMapping->IoAddress = IoAddress; + AddressMapping->SystemIoBusNumber = DeviceExtension->SystemIoBusNumber; + AddressMapping->MappingCount = 1; - return MappedAddress; + InsertHeadList(&DeviceExtension->AddressMappingListHead, + &AddressMapping->List); + + return MappedAddress; + } + else + { + if (Status) + { + *Status = STATUS_NO_MEMORY; + } + + return NULL; + } } VOID STDCALL @@ -1261,3 +1334,14 @@ InternalUnmapMemory(IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension, Entry = Entry->Flink; } } + +BOOLEAN STDCALL +VideoPortDDCMonitorHelper( + PVOID HwDeviceExtension, + /*PI2C_FNC_TABLE*/PVOID I2CFunctions, + PUCHAR pEdidBuffer, + ULONG EdidBufferSize + ) +{ + return FALSE; +} diff --git a/reactos/drivers/video/videoprt/videoprt.def b/reactos/drivers/video/videoprt/videoprt.def index 361457e1490..2d4ff5a9105 100644 --- a/reactos/drivers/video/videoprt/videoprt.def +++ b/reactos/drivers/video/videoprt/videoprt.def @@ -1,10 +1,11 @@ -; $Id: videoprt.def,v 1.2 2004/02/25 02:59:55 jimtabor Exp $ +; $Id: videoprt.def,v 1.3 2004/03/06 01:22:02 navaraf Exp $ ; ; vidport.def - export definition file for ReactOS ; EXPORTS ReturnCsrssAddress VideoPortCompareMemory@12 +VideoPortDDCMonitorHelper@16 VideoPortDebugPrint VideoPortDisableInterrupt@4 VideoPortEnableInterrupt@4 diff --git a/reactos/drivers/video/videoprt/videoprt.edf b/reactos/drivers/video/videoprt/videoprt.edf index 47e9cfb65bc..6c6bbbfdd3b 100644 --- a/reactos/drivers/video/videoprt/videoprt.edf +++ b/reactos/drivers/video/videoprt/videoprt.edf @@ -1,10 +1,11 @@ -; $Id: videoprt.edf,v 1.2 2004/02/25 03:05:27 jimtabor Exp $ +; $Id: videoprt.edf,v 1.3 2004/03/06 01:22:02 navaraf Exp $ ; ; vidport.def - export definition file for ReactOS ; EXPORTS VideoPortCompareMemory=NTOSKRNL.RtlCompareMemory VideoPortAllocatePool=VideoPortAllocatePool@16 +VideoPortDDCMonitorHelper=VideoPortDDCMonitorHelper@16 VideoPortDebugPrint VideoPortDisableInterrupt=VideoPortDisableInterrupt@4 VideoPortEnableInterrupt=VideoPortEnableInterrupt@4 diff --git a/reactos/drivers/video/videoprt/videoprt.h b/reactos/drivers/video/videoprt/videoprt.h index ec69dfa91f6..b9f5e92cd1d 100644 --- a/reactos/drivers/video/videoprt/videoprt.h +++ b/reactos/drivers/video/videoprt/videoprt.h @@ -18,7 +18,7 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: videoprt.h,v 1.1 2004/01/19 15:56:53 navaraf Exp $ + * $Id: videoprt.h,v 1.2 2004/03/06 01:22:02 navaraf Exp $ */ #ifndef VIDEOPRT_H @@ -86,9 +86,10 @@ VidDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); PVOID STDCALL InternalMapMemory( IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension, - IN PHYSICAL_ADDRESS IoAddress, + IN PHYSICAL_ADDRESS IoAddress, IN ULONG NumberOfUchars, - IN UCHAR InIoSpace); + IN UCHAR InIoSpace, + OUT NTSTATUS *Status); VOID STDCALL InternalUnmapMemory( diff --git a/reactos/include/ddk/winddi.h b/reactos/include/ddk/winddi.h index d6d40fdf533..deb43990caf 100644 --- a/reactos/include/ddk/winddi.h +++ b/reactos/include/ddk/winddi.h @@ -867,6 +867,13 @@ typedef struct _ENG_TIME_FIELDS USHORT usWeekday; } ENG_TIME_FIELDS, *PENG_TIME_FIELDS; +typedef enum _ENG_SYSTEM_ATTRIBUTE { + EngProcessorFeature = 1, + EngNumberOfProcessors, + EngOptimumAvailableUserMemory, + EngOptimumAvailableSystemMemory, +} ENG_SYSTEM_ATTRIBUTE; + typedef struct _LINEATTRS { FLONG fl; diff --git a/reactos/include/win32k/driver.h b/reactos/include/win32k/driver.h index 06485fbe2d8..9a7d7aa604e 100644 --- a/reactos/include/win32k/driver.h +++ b/reactos/include/win32k/driver.h @@ -162,7 +162,7 @@ typedef struct _DRIVER_FUNCTIONS BOOL DRIVER_RegisterDriver(LPCWSTR Name, PGD_ENABLEDRIVER EnableDriver); PGD_ENABLEDRIVER DRIVER_FindDDIDriver(LPCWSTR Name); -PFILE_OBJECT DRIVER_FindMPDriver(LPCWSTR Name); +PFILE_OBJECT DRIVER_FindMPDriver(ULONG DisplayNumber); BOOL DRIVER_BuildDDIFunctions(PDRVENABLEDATA DED, PDRIVER_FUNCTIONS DF); BOOL DRIVER_UnregisterDriver(LPCWSTR Name); diff --git a/reactos/subsys/win32k/eng/surface.c b/reactos/subsys/win32k/eng/surface.c index 45b98f52bf3..9ced7dcd2eb 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.32 2004/02/14 22:24:54 navaraf Exp $ +/* $Id: surface.c,v 1.33 2004/03/06 01:22:03 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -477,6 +477,42 @@ EngAssociateSurface(IN HSURF Surface, return TRUE; } +/* + * @implemented + */ +BOOL STDCALL +EngModifySurface( + IN HSURF hsurf, + IN HDEV hdev, + IN FLONG flHooks, + IN FLONG flSurface, + IN DHSURF dhsurf, + OUT VOID *pvScan0, + IN LONG lDelta, + IN VOID *pvReserved) +{ + SURFOBJ *pso; + + pso = EngLockSurface(hsurf); + if (pso == NULL) + { + return FALSE; + } + + if (!EngAssociateSurface(hsurf, hdev, flHooks)) + { + return FALSE; + } + + pso->dhsurf = dhsurf; + pso->lDelta = lDelta; + pso->pvScan0 = pvScan0; + + EngUnlockSurface(pso); + + return TRUE; +} + /* * @implemented */ diff --git a/reactos/subsys/win32k/misc/driver.c b/reactos/subsys/win32k/misc/driver.c index 8bc4753b8dd..c87e80a013b 100644 --- a/reactos/subsys/win32k/misc/driver.c +++ b/reactos/subsys/win32k/misc/driver.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: driver.c,v 1.36 2004/02/22 12:06:43 weiden Exp $ +/* $Id: driver.c,v 1.37 2004/03/06 01:22:03 navaraf Exp $ * * GDI Driver support routines * (mostly swiped from Wine) @@ -236,16 +236,18 @@ BOOL DRIVER_BuildDDIFunctions(PDRVENABLEDATA DED, typedef VP_STATUS (*PMP_DRIVERENTRY)(PVOID, PVOID); -PFILE_OBJECT DRIVER_FindMPDriver(LPCWSTR Name) +PFILE_OBJECT DRIVER_FindMPDriver(ULONG DisplayNumber) { OBJECT_ATTRIBUTES ObjectAttributes; + WCHAR DeviceNameBuffer[20]; UNICODE_STRING DeviceName; IO_STATUS_BLOCK Iosb; HANDLE DisplayHandle; NTSTATUS Status; PFILE_OBJECT VideoFileObject; - RtlRosInitUnicodeStringFromLiteral(&DeviceName, L"\\??\\DISPLAY1"); + swprintf(DeviceNameBuffer, L"\\??\\DISPLAY%d", DisplayNumber + 1); + RtlInitUnicodeString(&DeviceName, DeviceNameBuffer); InitializeObjectAttributes(&ObjectAttributes, &DeviceName, 0, diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index 19fa36ca070..04f4abe3288 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.122 2004/03/05 09:02:42 hbirr Exp $ +/* $Id: dc.c,v 1.123 2004/03/06 01:22:03 navaraf Exp $ * * DC.C - Device context functions * @@ -239,15 +239,17 @@ NtGdiCreateCompatableDC(HDC hDC) } static BOOL FASTCALL -GetRegistryPath(PUNICODE_STRING RegistryPath) +GetRegistryPath(PUNICODE_STRING RegistryPath, ULONG DisplayNumber) { RTL_QUERY_REGISTRY_TABLE QueryTable[2]; + WCHAR DeviceNameBuffer[20]; NTSTATUS Status; + swprintf(DeviceNameBuffer, L"\\Device\\Video%d", DisplayNumber); RtlInitUnicodeString(RegistryPath, NULL); RtlZeroMemory(QueryTable, sizeof(QueryTable)); QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED | RTL_QUERY_REGISTRY_DIRECT; - QueryTable[0].Name = L"\\Device\\Video0"; + QueryTable[0].Name = DeviceNameBuffer; QueryTable[0].EntryContext = RegistryPath; Status = RtlQueryRegistryValues(RTL_REGISTRY_DEVICEMAP, @@ -257,7 +259,7 @@ GetRegistryPath(PUNICODE_STRING RegistryPath) NULL); if (! NT_SUCCESS(Status)) { - DPRINT1("No \\Device\\Video0 value in DEVICEMAP\\VIDEO found\n"); + DPRINT1("No \\Device\\Video%d value in DEVICEMAP\\VIDEO found\n", DisplayNumber); return FALSE; } @@ -267,13 +269,13 @@ GetRegistryPath(PUNICODE_STRING RegistryPath) } static BOOL FASTCALL -FindDriverFileNames(PUNICODE_STRING DriverFileNames) +FindDriverFileNames(PUNICODE_STRING DriverFileNames, ULONG DisplayNumber) { RTL_QUERY_REGISTRY_TABLE QueryTable[2]; UNICODE_STRING RegistryPath; NTSTATUS Status; - if (! GetRegistryPath(&RegistryPath)) + if (! GetRegistryPath(&RegistryPath, DisplayNumber)) { DPRINT("GetRegistryPath failed\n"); return FALSE; @@ -350,7 +352,7 @@ DevModeCallback(IN PWSTR ValueName, } static BOOL FASTCALL -SetupDevMode(PDEVMODEW DevMode) +SetupDevMode(PDEVMODEW DevMode, ULONG DisplayNumber) { static WCHAR RegistryMachineSystem[] = L"\\REGISTRY\\MACHINE\\SYSTEM\\"; static WCHAR CurrentControlSet[] = L"CURRENTCONTROLSET\\"; @@ -363,7 +365,7 @@ SetupDevMode(PDEVMODEW DevMode) RTL_QUERY_REGISTRY_TABLE QueryTable[2]; NTSTATUS Status; - if (! GetRegistryPath(&RegistryPath)) + if (! GetRegistryPath(&RegistryPath, DisplayNumber)) { DPRINT("GetRegistryPath failed\n"); return FALSE; @@ -464,187 +466,208 @@ SetupDevMode(PDEVMODEW DevMode) BOOL FASTCALL IntCreatePrimarySurface() { - PGD_ENABLEDRIVER GDEnableDriver; - DRVENABLEDATA DED; - PSURFOBJ SurfObj; - PSURFGDI SurfGDI; - UNICODE_STRING DriverFileNames; - PWSTR CurrentName; - BOOL GotDriver; - BOOL DoDefault; + PGD_ENABLEDRIVER GDEnableDriver; + DRVENABLEDATA DED; + PSURFOBJ SurfObj; + PSURFGDI SurfGDI; + UNICODE_STRING DriverFileNames; + PWSTR CurrentName; + BOOL GotDriver; + BOOL DoDefault; + ULONG DisplayNumber; - RtlZeroMemory(&PrimarySurface, sizeof(PrimarySurface)); + for (DisplayNumber = 0; ; DisplayNumber++) + { + DPRINT("Trying to load display driver no. %d\n", DisplayNumber); - ExInitializeFastMutex(&PrimarySurface.DriverLock); + RtlZeroMemory(&PrimarySurface, sizeof(PrimarySurface)); + ExInitializeFastMutex(&PrimarySurface.DriverLock); - /* Open the miniport driver */ - if ((PrimarySurface.VideoFileObject = DRIVER_FindMPDriver(L"DISPLAY")) == NULL) - { - DPRINT1("FindMPDriver failed\n"); - return FALSE; - } + PrimarySurface.VideoFileObject = DRIVER_FindMPDriver(DisplayNumber); - /* Retrieve DDI driver names from registry */ - RtlInitUnicodeString(&DriverFileNames, NULL); - if (! FindDriverFileNames(&DriverFileNames)) - { - DPRINT1("FindDriverFileNames failed\n"); - return FALSE; - } + /* Open the miniport driver */ + if (PrimarySurface.VideoFileObject == NULL) + { + DPRINT1("FindMPDriver failed\n"); + return FALSE; + } - /* DriverFileNames may be a list of drivers in REG_SZ_MULTI format, scan all of - them until a good one found */ - CurrentName = DriverFileNames.Buffer; - GotDriver = FALSE; - while (! GotDriver && CurrentName < DriverFileNames.Buffer + DriverFileNames.Length) - { - /* Get the DDI driver's entry point */ - GDEnableDriver = DRIVER_FindDDIDriver(CurrentName); - if (NULL == GDEnableDriver) - { - DPRINT("FindDDIDriver failed for %S\n", CurrentName); - } + /* Retrieve DDI driver names from registry */ + RtlInitUnicodeString(&DriverFileNames, NULL); + if (!FindDriverFileNames(&DriverFileNames, DisplayNumber)) + { + DPRINT1("FindDriverFileNames failed\n"); + /* return FALSE; */ + continue; + } + + /* + * DriverFileNames may be a list of drivers in REG_SZ_MULTI format, + * scan all of them until a good one found. + */ + CurrentName = DriverFileNames.Buffer; + GotDriver = FALSE; + while (!GotDriver && + CurrentName < DriverFileNames.Buffer + DriverFileNames.Length) + { + /* Get the DDI driver's entry point */ + GDEnableDriver = DRIVER_FindDDIDriver(CurrentName); + if (NULL == GDEnableDriver) + { + DPRINT("FindDDIDriver failed for %S\n", CurrentName); + } + else + { + /* Call DDI driver's EnableDriver function */ + RtlZeroMemory(&DED, sizeof(DED)); + + if (! GDEnableDriver(DDI_DRIVER_VERSION, sizeof(DED), &DED)) + { + DPRINT("DrvEnableDriver failed for %S\n", CurrentName); + } + else + { + GotDriver = TRUE; + } + } + + if (! GotDriver) + { + /* Skip to the next name but never get past the Unicode string */ + while (L'\0' != *CurrentName && + CurrentName < DriverFileNames.Buffer + DriverFileNames.Length) + { + CurrentName++; + } + if (CurrentName < DriverFileNames.Buffer + DriverFileNames.Length) + { + CurrentName++; + } + } + } + + RtlFreeUnicodeString(&DriverFileNames); + + if (!GotDriver) + { + ObDereferenceObject(PrimarySurface.VideoFileObject); + DPRINT1("No suitable DDI driver found\n"); + /* return FALSE; */ + continue; + } + + DPRINT("Display driver %S loaded\n", CurrentName); + + DPRINT("Building DDI Functions\n"); + + /* Construct DDI driver function dispatch table */ + if (!DRIVER_BuildDDIFunctions(&DED, &PrimarySurface.DriverFunctions)) + { + ObDereferenceObject(PrimarySurface.VideoFileObject); + DPRINT1("BuildDDIFunctions failed\n"); + return FALSE; + } + + /* Allocate a phyical device handle from the driver */ + if (SetupDevMode(&PrimarySurface.DMW, DisplayNumber)) + { + PrimarySurface.PDev = PrimarySurface.DriverFunctions.EnablePDev( + &PrimarySurface.DMW, + L"", + HS_DDI_MAX, + PrimarySurface.FillPatterns, + sizeof(PrimarySurface.GDIInfo), + (ULONG *) &PrimarySurface.GDIInfo, + sizeof(PrimarySurface.DevInfo), + &PrimarySurface.DevInfo, + NULL, + L"", + (HANDLE) (PrimarySurface.VideoFileObject->DeviceObject)); + DoDefault = (NULL == PrimarySurface.PDev); + if (DoDefault) + { + DPRINT1("DrvEnablePDev with registry parameters failed\n"); + } + } else - { - /* Call DDI driver's EnableDriver function */ - RtlZeroMemory(&DED, sizeof(DED)); + { + DoDefault = TRUE; + } - if (! GDEnableDriver(DDI_DRIVER_VERSION, sizeof(DED), &DED)) - { - DPRINT("DrvEnableDriver failed for %S\n", CurrentName); - } - else - { - GotDriver = TRUE; - } - } - - if (! GotDriver) - { - /* Skip to the next name but never get past the Unicode string */ - while (L'\0' != *CurrentName && - CurrentName < DriverFileNames.Buffer + DriverFileNames.Length) - { - CurrentName++; - } - if (CurrentName < DriverFileNames.Buffer + DriverFileNames.Length) - { - CurrentName++; - } - } - } - RtlFreeUnicodeString(&DriverFileNames); - if (! GotDriver) - { - ObDereferenceObject(PrimarySurface.VideoFileObject); - DPRINT1("No suitable DDI driver found\n"); - return FALSE; - } - - DPRINT("Display driver %S loaded\n", CurrentName); - - DPRINT("Building DDI Functions\n"); - - /* Construct DDI driver function dispatch table */ - if (! DRIVER_BuildDDIFunctions(&DED, &PrimarySurface.DriverFunctions)) - { - ObDereferenceObject(PrimarySurface.VideoFileObject); - DPRINT1("BuildDDIFunctions failed\n"); - return FALSE; - } - - /* Allocate a phyical device handle from the driver */ - if (SetupDevMode(&PrimarySurface.DMW)) - { - PrimarySurface.PDev = - PrimarySurface.DriverFunctions.EnablePDev(&PrimarySurface.DMW, - L"", - HS_DDI_MAX, - PrimarySurface.FillPatterns, - sizeof(PrimarySurface.GDIInfo), - (ULONG *) &PrimarySurface.GDIInfo, - sizeof(PrimarySurface.DevInfo), - &PrimarySurface.DevInfo, - NULL, - L"", - (HANDLE) (PrimarySurface.VideoFileObject->DeviceObject)); - DoDefault = (NULL == PrimarySurface.PDev); if (DoDefault) - { - DPRINT1("DrvEnablePDev with registry parameters failed\n"); - } - } - else - { - DoDefault = TRUE; - } + { + RtlZeroMemory(&(PrimarySurface.DMW), sizeof(DEVMODEW)); + PrimarySurface.PDev = PrimarySurface.DriverFunctions.EnablePDev( + &PrimarySurface.DMW, + L"", + HS_DDI_MAX, + PrimarySurface.FillPatterns, + sizeof(PrimarySurface.GDIInfo), + (ULONG *) &PrimarySurface.GDIInfo, + sizeof(PrimarySurface.DevInfo), + &PrimarySurface.DevInfo, + NULL, + L"", + (HANDLE) (PrimarySurface.VideoFileObject->DeviceObject)); - if (DoDefault) - { - RtlZeroMemory(&(PrimarySurface.DMW), sizeof(DEVMODEW)); - PrimarySurface.PDev = - PrimarySurface.DriverFunctions.EnablePDev(&PrimarySurface.DMW, - L"", - HS_DDI_MAX, - PrimarySurface.FillPatterns, - sizeof(PrimarySurface.GDIInfo), - (ULONG *) &PrimarySurface.GDIInfo, - sizeof(PrimarySurface.DevInfo), - &PrimarySurface.DevInfo, - NULL, - L"", - (HANDLE) (PrimarySurface.VideoFileObject->DeviceObject)); + if (NULL == PrimarySurface.PDev) + { + ObDereferenceObject(PrimarySurface.VideoFileObject); + DPRINT1("DrvEnablePDEV with default parameters failed\n"); + DPRINT1("Perhaps DDI driver doesn't match miniport driver?\n"); + /* return FALSE; */ + continue; + } + } - if (NULL == PrimarySurface.PDev) - { - ObDereferenceObject(PrimarySurface.VideoFileObject); - DPRINT1("DrvEnablePDEV with default parameters failed\n"); - DPRINT1("Perhaps DDI driver doesn't match miniport driver?\n"); - return FALSE; - } - } + if (0 == PrimarySurface.GDIInfo.ulLogPixelsX) + { + DPRINT("Adjusting GDIInfo.ulLogPixelsX\n"); + PrimarySurface.GDIInfo.ulLogPixelsX = 96; + } + if (0 == PrimarySurface.GDIInfo.ulLogPixelsY) + { + DPRINT("Adjusting GDIInfo.ulLogPixelsY\n"); + PrimarySurface.GDIInfo.ulLogPixelsY = 96; + } - if (0 == PrimarySurface.GDIInfo.ulLogPixelsX) - { - DPRINT("Adjusting GDIInfo.ulLogPixelsX\n"); - PrimarySurface.GDIInfo.ulLogPixelsX = 96; - } - if (0 == PrimarySurface.GDIInfo.ulLogPixelsY) - { - DPRINT("Adjusting GDIInfo.ulLogPixelsY\n"); - PrimarySurface.GDIInfo.ulLogPixelsY = 96; - } + DPRINT("calling completePDev\n"); - DPRINT("calling completePDev\n"); + /* Complete initialization of the physical device */ + PrimarySurface.DriverFunctions.CompletePDev( + PrimarySurface.PDev, + &PrimarySurface); - /* Complete initialization of the physical device */ - PrimarySurface.DriverFunctions.CompletePDev(PrimarySurface.PDev, - &PrimarySurface); + DPRINT("calling DRIVER_ReferenceDriver\n"); - DPRINT("calling DRIVER_ReferenceDriver\n"); + DRIVER_ReferenceDriver(L"DISPLAY"); - DRIVER_ReferenceDriver(L"DISPLAY"); + DPRINT("calling EnableSurface\n"); - DPRINT("calling EnableSurface\n"); + /* Enable the drawing surface */ + PrimarySurface.Handle = + PrimarySurface.DriverFunctions.EnableSurface(PrimarySurface.PDev); + if (NULL == PrimarySurface.Handle) + { +/* PrimarySurface.DriverFunctions.AssertMode(PrimarySurface.PDev, FALSE);*/ + PrimarySurface.DriverFunctions.DisablePDev(PrimarySurface.PDev); + ObDereferenceObject(PrimarySurface.VideoFileObject); + DPRINT1("DrvEnableSurface failed\n"); + /* return FALSE; */ + continue; + } - /* Enable the drawing surface */ - PrimarySurface.Handle = - PrimarySurface.DriverFunctions.EnableSurface(PrimarySurface.PDev); - if (NULL == PrimarySurface.Handle) - { - ObDereferenceObject(PrimarySurface.VideoFileObject); - DPRINT1("DrvEnableSurface failed\n"); - return FALSE; - } + SurfObj = (PSURFOBJ)AccessUserObject((ULONG) PrimarySurface.Handle); + SurfObj->dhpdev = PrimarySurface.PDev; + SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) PrimarySurface.Handle); + IntShowDesktop( + IntGetActiveDesktop(), + SurfGDI->SurfObj.sizlBitmap.cx, + SurfGDI->SurfObj.sizlBitmap.cy); + break; + } - SurfObj = (PSURFOBJ)AccessUserObject((ULONG) PrimarySurface.Handle); - SurfObj->dhpdev = PrimarySurface.PDev; - SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) PrimarySurface.Handle); - IntShowDesktop(IntGetActiveDesktop(), - SurfGDI->SurfObj.sizlBitmap.cx, - SurfGDI->SurfObj.sizlBitmap.cy); - - return TRUE; + return TRUE; } VOID FASTCALL @@ -704,7 +727,10 @@ IntGdiCreateDC(PUNICODE_STRING Driver, return NtGdiCreateCompatableDC(hDC); } - DPRINT("NAME: %S\n", Driver); // FIXME: Should not crash if NULL + if (Driver != NULL && Driver->Buffer != NULL) + { + DPRINT("NAME: %S\n", Driver->Buffer); // FIXME: Should not crash if NULL + } /* Allocate a DC object */ if ((hNewDC = DC_AllocDC(Driver)) == NULL) diff --git a/reactos/subsys/win32k/stubs/stubs.c b/reactos/subsys/win32k/stubs/stubs.c index a9704f04308..5d417d2f1c0 100644 --- a/reactos/subsys/win32k/stubs/stubs.c +++ b/reactos/subsys/win32k/stubs/stubs.c @@ -1235,3 +1235,67 @@ STUB(FLOATOBJ_AddFloatObj) STUB(FLOATOBJ_DivFloatObj) STUB(FLOATOBJ_MulFloatObj) STUB(FLOATOBJ_SubFloatObj) + +/* + * @unimplemented + */ +ULONG STDCALL +EngDitherColor( + IN HDEV hdev, + IN ULONG iMode, + IN ULONG rgb, + OUT ULONG *pul) +{ + return DCR_SOLID; +} + +/* + * @unimplemented + */ +BOOL STDCALL +EngQuerySystemAttribute( + IN ENG_SYSTEM_ATTRIBUTE CapNum, + OUT PDWORD pCapability) +{ + switch (CapNum) + { + case EngNumberOfProcessors: + *pCapability = 1; + return TRUE; + + case EngProcessorFeature: + *pCapability = 0; + return TRUE; + + default: + break; + } + + return FALSE; +} + +/* + * @unimplemented + */ +FLATPTR STDCALL +HeapVidMemAllocAligned( + IN VIDEOMEMORY *lpVidMem, + IN DWORD dwWidth, + IN DWORD dwHeight, + IN /*LPSURFACEALIGNMENT*/LPVOID lpAlignment, + OUT LPLONG lpNewPitch) +{ + UNIMPLEMENTED; + return 0; +} + +/* + * @unimplemented + */ +VOID STDCALL +VidMemFree( + IN LPVMEMHEAP pvmh, + IN FLATPTR ptr) +{ + UNIMPLEMENTED; +} diff --git a/reactos/subsys/win32k/win32k.def b/reactos/subsys/win32k/win32k.def index 2c86a4371a6..98eb30c5812 100644 --- a/reactos/subsys/win32k/win32k.def +++ b/reactos/subsys/win32k/win32k.def @@ -1,4 +1,4 @@ -; $Id: win32k.def,v 1.24 2004/02/11 19:26:51 weiden Exp $ +; $Id: win32k.def,v 1.25 2004/03/06 01:22:04 navaraf Exp $ ; ; win32k.def ; @@ -41,6 +41,7 @@ EngDeleteSemaphore@4 EngDeleteSurface@4 EngDeleteWnd@4 EngDeviceIoControl@28 +EngDitherColor@16 EngEnumForms@24 EngEraseSurface@12 EngFillPath@28 @@ -73,6 +74,7 @@ EngMapEvent@20 EngMapFontFile@12 EngMapModule@8 EngMarkBandingSurface@4 +EngModifySurface@32 EngMovePointer@16 EngMulDiv@12 EngMultiByteToUnicodeN@20 @@ -84,6 +86,7 @@ EngQueryLocalTime@4 EngQueryPalette@16 EngQueryPerformanceCounter@4 EngQueryPerformanceFrequency@4 +EngQuerySystemAttribute@8 EngReleaseSemaphore@4 EngRestoreFloatingPointState@4 EngSaveFloatingPointState@8 @@ -142,6 +145,7 @@ FONTOBJ_pifi@4 FONTOBJ_pvTrueTypeFontFile@8 FONTOBJ_pxoGetXform@4 FONTOBJ_vGetInfo@12 +HeapVidMemAllocAligned@20 HT_ComputeRGBGammaTable@24 HT_Get8BPPFormatPalette PALOBJ_cGetColors@16 @@ -165,6 +169,7 @@ RtlUpcaseUnicodeToMultiByteN@20 STROBJ_bEnum@12 STROBJ_dwGetCodePage@4 STROBJ_vEnumStart@4 +VidMemFree@8 Win32kInitialize@0 WNDOBJ_bEnum@12 WNDOBJ_cEnumStart@16 diff --git a/reactos/subsys/win32k/win32k.edf b/reactos/subsys/win32k/win32k.edf index 99a4e0c82d2..eb50ffdf9e2 100644 --- a/reactos/subsys/win32k/win32k.edf +++ b/reactos/subsys/win32k/win32k.edf @@ -1,4 +1,4 @@ -; $Id: win32k.edf,v 1.20 2004/02/11 19:26:51 weiden Exp $ +; $Id: win32k.edf,v 1.21 2004/03/06 01:22:04 navaraf Exp $ ; ; win32k.def ; @@ -41,6 +41,7 @@ EngDeleteSemaphore=EngDeleteSemaphore@4 EngDeleteSurface=EngDeleteSurface@4 EngDeleteWnd=EngDeleteWnd@4 EngDeviceIoControl=EngDeviceIoControl@28 +EngDitherColor=EngDitherColor@16 EngEnumForms=EngEnumForms@24 EngEraseSurface=EngEraseSurface@12 EngFillPath=EngFillPath@28 @@ -73,6 +74,7 @@ EngMapEvent=EngMapEvent@20 EngMapFontFile=EngMapFontFile@12 EngMapModule=EngMapModule@8 EngMarkBandingSurface=EngMarkBandingSurface@4 +EngModifySurface=EngModifySurface@32 EngMovePointer=EngMovePointer@16 EngMulDiv=EngMulDiv@12 EngMultiByteToUnicodeN=EngMultiByteToUnicodeN@20 @@ -84,6 +86,7 @@ EngQueryLocalTime=EngQueryLocalTime@4 EngQueryPalette=EngQueryPalette@16 EngQueryPerformanceCounter=EngQueryPerformanceCounter@4 EngQueryPerformanceFrequency=EngQueryPerformanceFrequency@4 +EngQuerySystemAttribute=EngQuerySystemAttribute@8 EngReleaseSemaphore=EngReleaseSemaphore@4 EngRestoreFloatingPointState=EngRestoreFloatingPointState@4 EngSaveFloatingPointState=EngSaveFloatingPointState@8 @@ -143,6 +146,7 @@ FONTOBJ_pifi=FONTOBJ_pifi@4 FONTOBJ_pvTrueTypeFontFile=FONTOBJ_pvTrueTypeFontFile@8 FONTOBJ_pxoGetXform=FONTOBJ_pxoGetXform@4 FONTOBJ_vGetInfo=FONTOBJ_vGetInfo@12 +HeapVidMemAllocAligned=HeapVidMemAllocAligned@20 HT_ComputeRGBGammaTable=HT_ComputeRGBGammaTable@24 HT_Get8BPPFormatPalette=HT_Get8BPPFormatPalette@16 PALOBJ_cGetColors=PALOBJ_cGetColors@16 @@ -166,6 +170,7 @@ RtlUpcaseUnicodeToMultiByteN=NTOSKRNL.RtlUpcaseUnicodeToMultiByteN STROBJ_bEnum=STROBJ_bEnum@12 STROBJ_dwGetCodePage=STROBJ_dwGetCodePage@4 STROBJ_vEnumStart=STROBJ_vEnumStart@4 +VidMemFree=VidMemFree@8 Win32kInitialize=Win32kInitialize@0 WNDOBJ_bEnum=WNDOBJ_bEnum@12 WNDOBJ_cEnumStart=WNDOBJ_cEnumStart@16 From fa714393ca0eeccddd257b3d19cf5bb21e079274 Mon Sep 17 00:00:00 2001 From: James Tabor <james.tabor@reactos.org> Date: Sat, 6 Mar 2004 08:39:06 +0000 Subject: [PATCH 0336/1463] Started VideoPortGetAgpServices, Allocate and ReleaseBuffer. svn path=/trunk/; revision=8548 --- reactos/drivers/video/videoprt/services.c | 16 +++++++++- reactos/drivers/video/videoprt/videoprt.c | 35 +++++++++++++++++++-- reactos/drivers/video/videoprt/videoprt.def | 5 ++- reactos/drivers/video/videoprt/videoprt.edf | 5 ++- 4 files changed, 56 insertions(+), 5 deletions(-) diff --git a/reactos/drivers/video/videoprt/services.c b/reactos/drivers/video/videoprt/services.c index 987dacf81a2..67dd27eed72 100644 --- a/reactos/drivers/video/videoprt/services.c +++ b/reactos/drivers/video/videoprt/services.c @@ -18,7 +18,7 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: services.c,v 1.1 2004/01/19 15:56:53 navaraf Exp $ + * $Id: services.c,v 1.2 2004/03/06 08:39:06 jimtabor Exp $ */ #include "videoprt.h" @@ -73,3 +73,17 @@ VideoPortQueryServices( return STATUS_UNSUCCESSFUL; } + + +BOOLEAN +STDCALL +VideoPortGetAgpServices(IN PVOID HwDeviceExtension, + IN PVIDEO_PORT_AGP_SERVICES AgpServices) +{ + + DPRINT("VideoPortGetAgpServices\n"); + UNIMPLEMENTED; + return FALSE; +} + + diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index 8d8a4f35e68..0dc6ff6693a 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.6 2004/03/06 01:22:02 navaraf Exp $ + * $Id: videoprt.c,v 1.7 2004/03/06 08:39:06 jimtabor Exp $ */ #include "videoprt.h" @@ -399,7 +399,7 @@ VideoPortGetVgaStatus(IN PVOID HwDeviceExtension, { PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - DPRINT("VideoPortGetVgaStatus = %S \n", VgaStatus); + DPRINT1("VideoPortGetVgaStatus = %S \n", VgaStatus); DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, VIDEO_PORT_DEVICE_EXTENSION, @@ -407,11 +407,14 @@ VideoPortGetVgaStatus(IN PVOID HwDeviceExtension, if(KeGetCurrentIrql() == PASSIVE_LEVEL) { + DPRINT1("VideoPortGetVgaStatus1 = %S \n", VgaStatus); + if ( PCIBus == DeviceExtension->AdapterInterfaceType) { /* VgaStatus 0 == VGA not enabled, 1 == VGA enabled. */ + DPRINT1("VideoPortGetVgaStatus2 = %S \n", VgaStatus); /* Assumed for now */ @@ -420,6 +423,8 @@ VideoPortGetVgaStatus(IN PVOID HwDeviceExtension, return STATUS_SUCCESS; } } + DPRINT1("VideoPortGetVgaStatus3 = %S \n", VgaStatus); + return ERROR_INVALID_FUNCTION; } @@ -1345,3 +1350,29 @@ VideoPortDDCMonitorHelper( { return FALSE; } + + +VP_STATUS +STDCALL +VideoPortAllocateBuffer(IN PVOID HwDeviceExtension, + IN ULONG Size, + OUT PVOID *Buffer) +{ + DPRINT("VideoPortAllocateBuffer\n"); + + Buffer = ExAllocatePool (PagedPool, Size) ; + return STATUS_SUCCESS; + +} + +VOID +STDCALL +VideoPortReleaseBuffer( IN PVOID HwDeviceExtension, + IN PVOID Ptr) +{ + DPRINT("VideoPortReleaseBuffer\n"); + + ExFreePool(Ptr); +} + + diff --git a/reactos/drivers/video/videoprt/videoprt.def b/reactos/drivers/video/videoprt/videoprt.def index 2d4ff5a9105..b8aef5ba2b0 100644 --- a/reactos/drivers/video/videoprt/videoprt.def +++ b/reactos/drivers/video/videoprt/videoprt.def @@ -1,15 +1,17 @@ -; $Id: videoprt.def,v 1.3 2004/03/06 01:22:02 navaraf Exp $ +; $Id: videoprt.def,v 1.4 2004/03/06 08:39:06 jimtabor Exp $ ; ; vidport.def - export definition file for ReactOS ; EXPORTS ReturnCsrssAddress +VideoPortAllocateBuffer@12 VideoPortCompareMemory@12 VideoPortDDCMonitorHelper@16 VideoPortDebugPrint VideoPortDisableInterrupt@4 VideoPortEnableInterrupt@4 VideoPortFreeDeviceBase@8 +VideoPortGetAgpServices@8 VideoPortGetBusData@24 VideoPortGetCurrentIrql@0 VideoPortGetDeviceBase@20 @@ -35,6 +37,7 @@ VideoPortReadRegisterUlong@4 VideoPortReadRegisterBufferUchar@12 VideoPortReadRegisterBufferUshort@12 VideoPortReadRegisterBufferUlong@12 +VideoPortReleaseBuffer@8 VideoPortScanRom@16 VideoPortSetBusData@24 VideoPortSetRegistryParameters@16 diff --git a/reactos/drivers/video/videoprt/videoprt.edf b/reactos/drivers/video/videoprt/videoprt.edf index 6c6bbbfdd3b..515d6b1ebfb 100644 --- a/reactos/drivers/video/videoprt/videoprt.edf +++ b/reactos/drivers/video/videoprt/videoprt.edf @@ -1,9 +1,10 @@ -; $Id: videoprt.edf,v 1.3 2004/03/06 01:22:02 navaraf Exp $ +; $Id: videoprt.edf,v 1.4 2004/03/06 08:39:06 jimtabor Exp $ ; ; vidport.def - export definition file for ReactOS ; EXPORTS VideoPortCompareMemory=NTOSKRNL.RtlCompareMemory +VideoPortAllocateBuffer=VideoPortAllocateBuffer@12 VideoPortAllocatePool=VideoPortAllocatePool@16 VideoPortDDCMonitorHelper=VideoPortDDCMonitorHelper@16 VideoPortDebugPrint @@ -12,6 +13,7 @@ VideoPortEnableInterrupt=VideoPortEnableInterrupt@4 VideoPortFreeDeviceBase=VideoPortFreeDeviceBase@8 VideoPortFreePool=VideoPortFreePool@8 VideoPortGetBusData=VideoPortGetBusData@24 +VideoPortGetAgpServices=VideoPortGetAgpServices@8 VideoPortGetCurrentIrql=VideoPortGetCurrentIrql@0 VideoPortGetDeviceBase=VideoPortGetDeviceBase@20 VideoPortGetDeviceData=VideoPortGetDeviceData@16 @@ -38,6 +40,7 @@ VideoPortReadRegisterUlong=NTOSKRNL.READ_REGISTER_ULONG VideoPortReadRegisterBufferUchar=NTOSKRNL.READ_REGISTER_BUFFER_UCHAR VideoPortReadRegisterBufferUshort=NTOSKRNL.READ_REGISTER_BUFFER_USHORT VideoPortReadRegisterBufferUlong=NTOSKRNL.READ_REGISTER_BUFFER_ULONG +VideoPortReleaseBuffer=VideoPortReleaseBuffer@8 VideoPortScanRom=VideoPortScanRom@16 VideoPortSetBusData=VideoPortSetBusData@24 VideoPortSetRegistryParameters=VideoPortSetRegistryParameters@16 From c3d3178f3e132d86c5f5adc9944be73b776718ad Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 6 Mar 2004 20:32:06 +0000 Subject: [PATCH 0337/1463] - Corrected processing import directories to handle case when executable imports the same DLL more times. svn path=/trunk/; revision=8549 --- reactos/lib/ntdll/ldr/utils.c | 201 ++++++++++++++++++---------------- 1 file changed, 105 insertions(+), 96 deletions(-) diff --git a/reactos/lib/ntdll/ldr/utils.c b/reactos/lib/ntdll/ldr/utils.c index 73be02d112e..9a13ab00d9a 100644 --- a/reactos/lib/ntdll/ldr/utils.c +++ b/reactos/lib/ntdll/ldr/utils.c @@ -1,4 +1,4 @@ -/* $Id: utils.c,v 1.82 2004/01/31 23:53:45 gvg Exp $ +/* $Id: utils.c,v 1.83 2004/03/06 20:32:06 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1416,118 +1416,125 @@ LdrpGetOrLoadModule(PWCHAR SerachPath, } static NTSTATUS -LdrpProcessImportDirectory(PLDR_MODULE Module, - PLDR_MODULE ImportedModule, - PCHAR ImportedName) +LdrpProcessImportDirectory( + PLDR_MODULE Module, + PLDR_MODULE ImportedModule, + PIMAGE_IMPORT_MODULE_DIRECTORY ImportModuleDirectory, + PCHAR ImportedName) { - PIMAGE_IMPORT_MODULE_DIRECTORY ImportModuleDirectory; NTSTATUS Status; PVOID* ImportAddressList; PULONG FunctionNameList; - DWORD pName; - WORD pHint; PVOID IATBase; ULONG OldProtect; ULONG Ordinal; ULONG IATSize; - PCHAR Name; - DPRINT("LdrpProcessImportDirectory(%x '%wZ', %x '%wZ', %x '%s')\n", - Module, &Module->BaseDllName, ImportedModule, - &ImportedModule->BaseDllName, ImportedName, ImportedName); + DPRINT("LdrpProcessImportDirectory(%x '%wZ', '%s')\n", + Module, &Module->BaseDllName, ImportedName); - ImportModuleDirectory = (PIMAGE_IMPORT_MODULE_DIRECTORY) - RtlImageDirectoryEntryToData(Module->BaseAddress, - TRUE, - IMAGE_DIRECTORY_ENTRY_IMPORT, - NULL); if (ImportModuleDirectory == NULL) { - return STATUS_UNSUCCESSFUL; + PCHAR Name; + + ImportModuleDirectory = (PIMAGE_IMPORT_MODULE_DIRECTORY) + RtlImageDirectoryEntryToData(Module->BaseAddress, + TRUE, + IMAGE_DIRECTORY_ENTRY_IMPORT, + NULL); + if (ImportModuleDirectory == NULL) + { + return STATUS_UNSUCCESSFUL; + } + + while (ImportModuleDirectory->dwRVAModuleName) + { + Name = (PCHAR)Module->BaseAddress + ImportModuleDirectory->dwRVAModuleName; + if (0 == _stricmp(Name, ImportedName)) + { + break; + } + ImportModuleDirectory++; + } + + if (ImportModuleDirectory->dwRVAModuleName == 0) + { + return STATUS_UNSUCCESSFUL; + } } - while (ImportModuleDirectory->dwRVAModuleName) + /* Get the import address list. */ + ImportAddressList = (PVOID *)(Module->BaseAddress + ImportModuleDirectory->dwRVAFunctionAddressList); + + /* Get the list of functions to import. */ + if (ImportModuleDirectory->dwRVAFunctionNameList != 0) { - Name = (PCHAR)Module->BaseAddress + ImportModuleDirectory->dwRVAModuleName; - if (0 == _stricmp(Name, ImportedName)) - { + FunctionNameList = (PULONG) (Module->BaseAddress + ImportModuleDirectory->dwRVAFunctionNameList); + } + else + { + FunctionNameList = (PULONG)(Module->BaseAddress + ImportModuleDirectory->dwRVAFunctionAddressList); + } - /* Get the import address list. */ - ImportAddressList = (PVOID *)(Module->BaseAddress + ImportModuleDirectory->dwRVAFunctionAddressList); + /* Get the size of IAT. */ + IATSize = 0; + while (FunctionNameList[IATSize] != 0L) + { + IATSize++; + } - /* Get the list of functions to import. */ - if (ImportModuleDirectory->dwRVAFunctionNameList != 0) - { - FunctionNameList = (PULONG) (Module->BaseAddress + ImportModuleDirectory->dwRVAFunctionNameList); - } - else - { - FunctionNameList = (PULONG)(Module->BaseAddress + ImportModuleDirectory->dwRVAFunctionAddressList); - } - - /* Get the size of IAT. */ - IATSize = 0; - while (FunctionNameList[IATSize] != 0L) - { - IATSize++; - } - - /* Unprotect the region we are about to write into. */ - IATBase = (PVOID)ImportAddressList; - Status = NtProtectVirtualMemory(NtCurrentProcess(), - IATBase, - IATSize * sizeof(PVOID*), - PAGE_READWRITE, - &OldProtect); - if (!NT_SUCCESS(Status)) + /* Unprotect the region we are about to write into. */ + IATBase = (PVOID)ImportAddressList; + Status = NtProtectVirtualMemory(NtCurrentProcess(), + IATBase, + IATSize * sizeof(PVOID*), + PAGE_READWRITE, + &OldProtect); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to unprotect IAT.\n"); + return(Status); + } + + /* Walk through function list and fixup addresses. */ + while (*FunctionNameList != 0L) + { + if ((*FunctionNameList) & 0x80000000) + { + Ordinal = (*FunctionNameList) & 0x7fffffff; + *ImportAddressList = LdrGetExportByOrdinal(ImportedModule->BaseAddress, Ordinal); + } + else + { + IMAGE_IMPORT_BY_NAME *pe_name; + pe_name = RVA(Module->BaseAddress, *FunctionNameList); + *ImportAddressList = LdrGetExportByName(ImportedModule->BaseAddress, pe_name->Name, pe_name->Hint); + if ((*ImportAddressList) == NULL) { - DPRINT1("Failed to unprotect IAT.\n"); - return(Status); + DPRINT1("Failed to import %s\n", pe_name->Name); + return STATUS_UNSUCCESSFUL; } - - /* Walk through function list and fixup addresses. */ - - while (*FunctionNameList != 0L) - { - if ((*FunctionNameList) & 0x80000000) - { - Ordinal = (*FunctionNameList) & 0x7fffffff; - *ImportAddressList = LdrGetExportByOrdinal(ImportedModule->BaseAddress, Ordinal); - } - else - { - pName = (DWORD) (Module->BaseAddress + *FunctionNameList + 2); - pHint = *(PWORD)(Module->BaseAddress + *FunctionNameList); + } + ImportAddressList++; + FunctionNameList++; + } - *ImportAddressList = LdrGetExportByName(ImportedModule->BaseAddress, (PUCHAR)pName, pHint); - if ((*ImportAddressList) == NULL) - { - DPRINT1("Failed to import %s\n", pName); - return STATUS_UNSUCCESSFUL; - } - } - ImportAddressList++; - FunctionNameList++; - } - - /* Protect the region we are about to write into. */ - Status = NtProtectVirtualMemory(NtCurrentProcess(), - IATBase, - IATSize * sizeof(PVOID*), - OldProtect, - &OldProtect); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to protect IAT.\n"); - return(Status); - } - } - ImportModuleDirectory++; + /* Protect the region we are about to write into. */ + Status = NtProtectVirtualMemory(NtCurrentProcess(), + IATBase, + IATSize * sizeof(PVOID*), + OldProtect, + &OldProtect); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to protect IAT.\n"); + return(Status); } return STATUS_SUCCESS; } + NTSTATUS LdrpAdjustImportDirectory(PLDR_MODULE Module, PLDR_MODULE ImportedModule, PUCHAR ImportedName) @@ -1726,7 +1733,7 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL, { TRACE_LDR("%wZ has stale binding to %wZ\n", &Module->BaseDllName, &ImportedModule->BaseDllName); - Status = LdrpProcessImportDirectory(Module, ImportedModule, ImportedName); + Status = LdrpProcessImportDirectory(Module, ImportedModule, NULL, ImportedName); if (!NT_SUCCESS(Status)) { DPRINT1("failed to import %s\n", ImportedName); @@ -1787,7 +1794,7 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL, if (WrongForwarder || ImportedModule->Flags & IMAGE_NOT_AT_BASE) { - Status = LdrpProcessImportDirectory(Module, ImportedModule, ImportedName); + Status = LdrpProcessImportDirectory(Module, ImportedModule, NULL, ImportedName); if (!NT_SUCCESS(Status)) { DPRINT1("failed to import %s\n", ImportedName); @@ -1813,7 +1820,7 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL, */ TRACE_LDR("Stale BIND %s from %wZ\n", ImportedName, &Module->BaseDllName); - Status = LdrpProcessImportDirectory(Module, ImportedModule, ImportedName); + Status = LdrpProcessImportDirectory(Module, ImportedModule, NULL, ImportedName); if (!NT_SUCCESS(Status)) { DPRINT1("faild to import %s\n", ImportedName); @@ -1844,13 +1851,14 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL, DPRINT1("failed to load %s\n", ImportedName); return Status; } - if (Module == ImportedModule) - { - LdrpDecrementLoadCount(Module, FALSE); - } + if (Module == ImportedModule) + { + LdrpDecrementLoadCount(Module, FALSE); + } + TRACE_LDR("Initializing imports for %wZ from %s\n", &Module->BaseDllName, ImportedName); - Status = LdrpProcessImportDirectory(Module, ImportedModule, ImportedName); + Status = LdrpProcessImportDirectory(Module, ImportedModule, ImportModuleDirectoryCurrent, ImportedName); if (!NT_SUCCESS(Status)) { DPRINT1("failed to import %s\n", ImportedName); @@ -1859,6 +1867,7 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL, ImportModuleDirectoryCurrent++; } } + if (TlsDirectory && TlsSize > 0) { LdrpAcquireTlsSlot(Module, TlsSize, FALSE); From 957b8562453a61ab5ffa10288356153ae40d2a78 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Sat, 6 Mar 2004 22:21:20 +0000 Subject: [PATCH 0338/1463] - Added stub implementations of MmAllocatePagesForMdl, MmFreePagesFromMdl and MmMapLockedPagesSpecifyCache. svn path=/trunk/; revision=8550 --- reactos/ntoskrnl/mm/mdl.c | 30 +++++++++++++++++++++++++++++- reactos/ntoskrnl/ntoskrnl.def | 5 ++++- reactos/ntoskrnl/ntoskrnl.edf | 5 ++++- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/mm/mdl.c b/reactos/ntoskrnl/mm/mdl.c index cf270b87c2a..6bf976ebbc6 100644 --- a/reactos/ntoskrnl/mm/mdl.c +++ b/reactos/ntoskrnl/mm/mdl.c @@ -1,4 +1,4 @@ -/* $Id: mdl.c,v 1.58 2004/02/15 17:04:52 hbirr Exp $ +/* $Id: mdl.c,v 1.59 2004/03/06 22:21:20 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -523,6 +523,34 @@ MmMapMemoryDumpMdl (PVOID Unknown0) UNIMPLEMENTED; } +PMDL STDCALL +MmAllocatePagesForMdl ( IN PHYSICAL_ADDRESS LowAddress, + IN PHYSICAL_ADDRESS HighAddress, + IN PHYSICAL_ADDRESS SkipBytes, + IN SIZE_T Totalbytes ) +{ + DPRINT1("MmAllocatePagesForMdl(): Unimplemented.\n"); + return(NULL); +} + +VOID STDCALL +MmFreePagesFromMdl ( IN PMDL Mdl ) +{ + DPRINT1("MmFreePagesFromMdl(): Unimplemented.\n"); +} + +PVOID STDCALL +MmMapLockedPagesSpecifyCache ( IN PMDL Mdl, + IN KPROCESSOR_MODE AccessMode, + IN MEMORY_CACHING_TYPE CacheType, + IN PVOID BaseAddress, + IN ULONG BugCheckOnFailure, + IN ULONG Priority ) +{ + DPRINT1("MmMapLockedPagesSpecifyCache(): Ignoring extra parameters.\n"); + return MmMapLockedPages (Mdl, AccessMode); +} + /* EOF */ diff --git a/reactos/ntoskrnl/ntoskrnl.def b/reactos/ntoskrnl/ntoskrnl.def index 9b0b0c3c1f6..5f9122073b9 100644 --- a/reactos/ntoskrnl/ntoskrnl.def +++ b/reactos/ntoskrnl/ntoskrnl.def @@ -1,4 +1,4 @@ -; $Id: ntoskrnl.def,v 1.175 2004/03/02 17:20:36 navaraf Exp $ +; $Id: ntoskrnl.def,v 1.176 2004/03/06 22:21:20 dwelch Exp $ ; ; reactos/ntoskrnl/ntoskrnl.def ; @@ -502,6 +502,7 @@ MmAllocateContiguousAlignedMemory@36 MmAllocateContiguousMemory@12 MmAllocateContiguousMemorySpecifyCache@32 MmAllocateNonCachedMemory@4 +MmAllocatePagesForMdl@28 MmBuildMdlForNonPagedPool@4 MmCanFileBeTruncated@8 MmCopyFromCaller@12 @@ -515,6 +516,7 @@ MmForceSectionClosed@8 MmFreeContiguousMemory@4 MmFreeContiguousMemorySpecifyCache@12 MmFreeNonCachedMemory@8 +MmFreePagesFromMdl@4 MmGetPhysicalAddress@4 MmGrowKernelStack@4 MmHighestUserAddress DATA @@ -527,6 +529,7 @@ MmLockPagableImageSection@4=MmLockPagableDataSection@4 MmLockPagableSectionByHandle@4 MmMapIoSpace@16 MmMapLockedPages@8 +MmMapLockedPagesSpecifyCache@24 MmMapMemoryDumpMdl@4 MmMapVideoDisplay@16 MmMapViewInSystemSpace@12 diff --git a/reactos/ntoskrnl/ntoskrnl.edf b/reactos/ntoskrnl/ntoskrnl.edf index 2aaf8808919..a87d8766e5e 100644 --- a/reactos/ntoskrnl/ntoskrnl.edf +++ b/reactos/ntoskrnl/ntoskrnl.edf @@ -1,4 +1,4 @@ -; $Id: ntoskrnl.edf,v 1.161 2004/02/03 14:23:29 ekohl Exp $ +; $Id: ntoskrnl.edf,v 1.162 2004/03/06 22:21:20 dwelch Exp $ ; ; reactos/ntoskrnl/ntoskrnl.def ; @@ -503,6 +503,7 @@ MmAllocateContiguousAlignedMemory=MmAllocateContiguousAlignedMemory@36 MmAllocateContiguousMemory=MmAllocateContiguousMemory@12 MmAllocateContiguousMemorySpecifyCache=MmAllocateContiguousMemorySpecifyCache@32 MmAllocateNonCachedMemory=MmAllocateNonCachedMemory@4 +MmAllocatePagesForMdl=MmAllocatePagesForMdl@28 MmBuildMdlForNonPagedPool=MmBuildMdlForNonPagedPool@4 MmCanFileBeTruncated=MmCanFileBeTruncated@8 MmCopyFromCaller=MmCopyFromCaller@12 @@ -516,6 +517,7 @@ MmForceSectionClosed=MmForceSectionClosed@8 MmFreeContiguousMemory=MmFreeContiguousMemory@4 MmFreeContiguousMemorySpecifyCache=MmFreeContiguousMemorySpecifyCache@12 MmFreeNonCachedMemory=MmFreeNonCachedMemory@8 +MmFreePagesFromMdl=MmFreePagesFromMdl@4 MmGetPhysicalAddress=MmGetPhysicalAddress@4 MmGrowKernelStack=MmGrowKernelStack@4 MmHighestUserAddress DATA @@ -528,6 +530,7 @@ MmLockPagableImageSection=MmLockPagableDataSection@4 MmLockPagableSectionByHandle=MmLockPagableSectionByHandle@4 MmMapIoSpace=MmMapIoSpace@16 MmMapLockedPages=MmMapLockedPages@8 +MmMapLockedPagesSpecifyCache=MmMapLockedPagesSpecifyCache@24 MmMapMemoryDumpMdl=MmMapMemoryDumpMdl@4 MmMapVideoDisplay=MmMapVideoDisplay@16 MmMapViewInSystemSpace=MmMapViewInSystemSpace@12 From b041530f2d29f08c7b50d7090bf01fd8aa9f9e49 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Sat, 6 Mar 2004 22:24:14 +0000 Subject: [PATCH 0339/1463] - Removed some unnecessary DbgPrints from the fatal exception path; ignore the breakpoint in the tail of KeBugCheckEx/KeBugCheckWithTf if no debugger is connected. svn path=/trunk/; revision=8551 --- reactos/ntoskrnl/ke/bug.c | 10 +++++----- reactos/ntoskrnl/ke/catch.c | 8 ++++---- reactos/ntoskrnl/ke/i386/brkpoint.c | 10 ++++++++++ reactos/ntoskrnl/ke/i386/exp.c | 22 ++++++++++++++++------ 4 files changed, 35 insertions(+), 15 deletions(-) diff --git a/reactos/ntoskrnl/ke/bug.c b/reactos/ntoskrnl/ke/bug.c index c0cf57474e2..c7dc5c22a86 100644 --- a/reactos/ntoskrnl/ke/bug.c +++ b/reactos/ntoskrnl/ke/bug.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: bug.c,v 1.41 2003/12/30 18:52:04 fireball Exp $ +/* $Id: bug.c,v 1.42 2004/03/06 22:24:13 dwelch Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/bug.c @@ -163,11 +163,11 @@ KeBugCheckWithTf(ULONG BugCheckCode, { #if defined(__GNUC__) __asm__("sti\n\t"); - DbgBreakPoint(); + DbgBreakPointNoBugCheck(); __asm__("cli\n\t"); #elif defined(_MSC_VER) __asm sti - DbgBreakPoint(); + DbgBreakPointNoBugCheck(); __asm cli #else #error Unknown compiler for inline assembler @@ -293,11 +293,11 @@ KeBugCheckEx(ULONG BugCheckCode, { #if defined(__GNUC__) __asm__("sti\n\t"); - DbgBreakPoint(); + DbgBreakPointNoBugCheck(); __asm__("cli\n\t"); #elif defined(_MSC_VER) __asm sti - DbgBreakPoint(); + DbgBreakPointNoBugCheck(); __asm cli #else #error Unknown compiler for inline assembler diff --git a/reactos/ntoskrnl/ke/catch.c b/reactos/ntoskrnl/ke/catch.c index f6c35a2c94f..e715b1bf85f 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.39 2003/12/30 18:52:04 fireball Exp $ +/* $Id: catch.c,v 1.40 2004/03/06 22:24:13 dwelch Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/catch.c @@ -163,9 +163,9 @@ KiDispatchException(PEXCEPTION_RECORD ExceptionRecord, if (Value != ExceptionContinueExecution || 0 != (ExceptionRecord->ExceptionFlags & EXCEPTION_NONCONTINUABLE)) { - DbgPrint("ExceptionRecord->ExceptionAddress = 0x%x\n", - ExceptionRecord->ExceptionAddress ); - KEBUGCHECKWITHTF(KMODE_EXCEPTION_NOT_HANDLED, 0, 0, 0, 0, Tf); + DPRINT("ExceptionRecord->ExceptionAddress = 0x%x\n", + ExceptionRecord->ExceptionAddress ); + KeBugCheckWithTf(KMODE_EXCEPTION_NOT_HANDLED, 0, 0, 0, 0, Tf); } } } diff --git a/reactos/ntoskrnl/ke/i386/brkpoint.c b/reactos/ntoskrnl/ke/i386/brkpoint.c index eea7b63ca32..150648c53a5 100644 --- a/reactos/ntoskrnl/ke/i386/brkpoint.c +++ b/reactos/ntoskrnl/ke/i386/brkpoint.c @@ -46,6 +46,16 @@ DbgBreakPoint(VOID) #endif } +/* + * @implemented + */ +#if defined(__GNUC__) +__asm__(".globl _DbgBreakPointNoBugCheck@0\n\t" + "_DbgBreakPointNoBugCheck@0:\n\t" + "int $3\n\t" + "ret\n\t"); +#endif + /* * @implemented */ diff --git a/reactos/ntoskrnl/ke/i386/exp.c b/reactos/ntoskrnl/ke/i386/exp.c index 0645581eed6..5ce3880ce5f 100644 --- a/reactos/ntoskrnl/ke/i386/exp.c +++ b/reactos/ntoskrnl/ke/i386/exp.c @@ -288,8 +288,8 @@ KiDoubleFaultHandler(VOID) OldTss->Fs, OldTss->Gs); DbgPrint("EAX: %.8x EBX: %.8x ECX: %.8x\n", OldTss->Eax, OldTss->Ebx, OldTss->Ecx); - DbgPrint("EDX: %.8x EBP: %.8x ESI: %.8x\n", OldTss->Edx, OldTss->Ebp, - OldTss->Esi); + 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) { @@ -307,7 +307,6 @@ KiDoubleFaultHandler(VOID) } if ((OldTss->Cs & 0xffff) == KERNEL_CS) { - DbgPrint("ESP %x\n", Esp0); if (PsGetCurrentThread() != NULL) { StackLimit = (ULONG)PsGetCurrentThread()->Tcb.StackBase; @@ -468,7 +467,8 @@ 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\n", Tf->Edx, Tf->Ebp, Tf->Esi); + 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) { @@ -481,8 +481,6 @@ KiDumpTrapFrame(PKTRAP_FRAME Tf, ULONG Parameter1, ULONG Parameter2) } } - DbgPrint("ESP %x\n", Esp0); - if (PsGetCurrentThread() != NULL) { StackLimit = (ULONG)PsGetCurrentThread()->Tcb.StackBase; @@ -594,6 +592,18 @@ KiTrapHandler(PKTRAP_FRAME Tf, ULONG ExceptionNr) } } + /* + * Check for a breakpoint that was only for the attention of the debugger. + */ + if (ExceptionNr == 3 && Tf->Eip == ((ULONG)DbgBreakPointNoBugCheck) + 1) + { + /* + EIP is already adjusted by the processor to point to the instruction + after the breakpoint. + */ + return(0); + } + /* * Handle user exceptions differently */ From 30aec6e5f7cf26499b344c73aa207b8a6fdd41ce Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Sat, 6 Mar 2004 22:25:22 +0000 Subject: [PATCH 0340/1463] - Added stubs for some of the new w2k/xp functions. svn path=/trunk/; revision=8552 --- reactos/drivers/video/videoprt/videoprt.c | 298 +++++++++++++++++++- reactos/drivers/video/videoprt/videoprt.def | 19 +- reactos/drivers/video/videoprt/videoprt.edf | 22 +- reactos/drivers/video/videoprt/videoprt.h | 5 +- 4 files changed, 338 insertions(+), 6 deletions(-) diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index 0dc6ff6693a..f6614c062c5 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.7 2004/03/06 08:39:06 jimtabor Exp $ + * $Id: videoprt.c,v 1.8 2004/03/06 22:25:22 dwelch Exp $ */ #include "videoprt.h" @@ -26,6 +26,15 @@ BOOLEAN CsrssInitialized = FALSE; PEPROCESS Csrss = NULL; PVIDEO_PORT_DEVICE_EXTENSION ResetDisplayParametersDeviceExtension = NULL; +static PVOID RomImageBuffer = NULL; + +VOID STDCALL STATIC +VideoPortDeferredRoutine( + IN PKDPC Dpc, + IN PVOID DeferredContext, + IN PVOID SystemArgument1, + IN PVOID SystemArgument2 + ); // ------------------------------------------------------- Public Interface @@ -554,6 +563,8 @@ VideoPortInitialize(IN PVOID Context1, DeviceExtension->HwResetHw = HwInitializationData->HwResetHw; DeviceExtension->AdapterInterfaceType = HwInitializationData->AdapterInterfaceType; DeviceExtension->SystemIoBusNumber = 0; + KeInitializeDpc(&DeviceExtension->DpcObject, VideoPortDeferredRoutine, + (PVOID)DeviceExtension); MaxLen = (wcslen(RegistryPath->Buffer) + 10) * sizeof(WCHAR); DeviceExtension->RegistryPath.MaximumLength = MaxLen; DeviceExtension->RegistryPath.Buffer = ExAllocatePoolWithTag(PagedPool, @@ -584,9 +595,12 @@ VideoPortInitialize(IN PVOID Context1, ConfigInfo.SystemIoBusNumber = DeviceExtension->SystemIoBusNumber; ConfigInfo.InterruptMode = (PCIBus == DeviceExtension->AdapterInterfaceType) ? LevelSensitive : Latched; + ConfigInfo.DriverRegistryPath = RegistryPath->Buffer; /* Call HwFindAdapter entry point */ /* FIXME: Need to figure out what string to pass as param 3 */ + DPRINT("HwFindAdapter %X Context2 %X\n", + HwInitializationData->HwFindAdapter, Context2); Status = HwInitializationData->HwFindAdapter(&DeviceExtension->MiniPortDeviceExtension, Context2, NULL, @@ -1376,3 +1390,285 @@ VideoPortReleaseBuffer( IN PVOID HwDeviceExtension, } +VP_STATUS +STDCALL +VideoPortEnumerateChildren ( IN PVOID HwDeviceExtension, + IN PVOID Reserved ) +{ + DPRINT1("VideoPortEnumerateChildren(): Unimplemented.\n"); + return STATUS_SUCCESS; +} + +PVOID +STDCALL +VideoPortGetRomImage ( IN PVOID HwDeviceExtension, + IN PVOID Unused1, + IN ULONG Unused2, + IN ULONG Length ) +{ + DPRINT("VideoPortGetRomImage(HwDeviceExtension 0x%X Length 0x%X)\n", + HwDeviceExtension, Length); + + /* If the length is zero then free the existing buffer. */ + if (Length == 0) + { + if (RomImageBuffer != NULL) + { + ExFreePool(RomImageBuffer); + RomImageBuffer = NULL; + } + return NULL; + } + else + { + PEPROCESS CallingProcess, PrevAttachedProcess; + + /* + The DDK says we shouldn't use the legacy C000 method but get the + rom base address from the corresponding pci or acpi register but + lets ignore that and use C000 anyway. CSRSS has already mapped the + bios area into memory so we'll copy from there. + */ + CallingProcess = PsGetCurrentProcess(); + if (CallingProcess != Csrss) + { + if (NULL != PsGetCurrentThread()->OldProcess) + { + PrevAttachedProcess = CallingProcess; + KeDetachProcess(); + } + else + { + PrevAttachedProcess = NULL; + } + KeAttachProcess(Csrss); + } + + /* + Copy the bios. + */ + Length = min(Length, 0x10000); + if (RomImageBuffer != NULL) + { + ExFreePool(RomImageBuffer); + } + RomImageBuffer = ExAllocatePool(PagedPool, Length); + if (RomImageBuffer == NULL) + { + return(NULL); + } + RtlCopyMemory(RomImageBuffer, (PUCHAR)0xC0000, Length); + + /* + Detach from csrss if we attached. + */ + if (CallingProcess != Csrss) + { + KeDetachProcess(); + if (NULL != PrevAttachedProcess) + { + KeAttachProcess(PrevAttachedProcess); + } + } + + return(RomImageBuffer); + } +} + +VOID +STDCALL +STATIC +VideoPortDeferredRoutine ( IN PKDPC Dpc, + IN PVOID DeferredContext, + IN PVOID SystemArgument1, + IN PVOID SystemArgument2 ) +{ + PVOID HwDeviceExtension = + ((PVIDEO_PORT_DEVICE_EXTENSION)DeferredContext)->MiniPortDeviceExtension; + ((PMINIPORT_DPC_ROUTINE)SystemArgument1)(HwDeviceExtension, SystemArgument2); +} + +BOOLEAN +STDCALL +VideoPortQueueDpc ( IN PVOID HwDeviceExtension, + IN PMINIPORT_DPC_ROUTINE CallbackRoutine, + IN PVOID Context ) +{ + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + + DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, + VIDEO_PORT_DEVICE_EXTENSION, + MiniPortDeviceExtension); + return KeInsertQueueDpc(&DeviceExtension->DpcObject, + (PVOID)CallbackRoutine, + (PVOID)Context); +} + +PVOID +STDCALL +VideoPortGetAssociatedDeviceExtension ( IN PVOID DeviceObject ) +{ + DPRINT1("VideoPortGetAssociatedDeviceExtension(): Unimplemented.\n"); + return(NULL); +} + +PVOID +STDCALL +VideoPortAllocateCommonBuffer ( IN PVOID HwDeviceExtension, + IN PVP_DMA_ADAPTER VpDmaAdapter, + IN ULONG DesiredLength, + OUT PPHYSICAL_ADDRESS LogicalAddress, + IN BOOLEAN CacheEnabled, + PVOID Reserved ) +{ + DPRINT1("VideoPortAllocateCommonBuffer(): Unimplemented.\n"); + return(NULL); +} + +VOID +STDCALL +VideoPortReleaseCommonBuffer ( IN PVOID HwDeviceExtension, + IN PVP_DMA_ADAPTER VpDmaAdapter, + IN ULONG Length, + IN PHYSICAL_ADDRESS LogicalAddress, + IN PVOID VirtualAddress, + IN BOOLEAN CacheEnabled ) +{ + DPRINT1("VideoPortReleaseCommonBuffer(): Unimplemented.\n"); +} + +VP_STATUS +STDCALL +VideoPortCreateSecondaryDisplay ( IN PVOID HwDeviceExtension, + IN OUT PVOID *SecondaryDeviceExtension, + IN ULONG Flag ) +{ + DPRINT1("VideoPortCreateSecondaryDisplay(): Unimplemented.\n"); + return STATUS_UNSUCCESSFUL; +} + +PVP_DMA_ADAPTER +STDCALL +VideoPortGetDmaAdapter ( IN PVOID HwDeviceExtension, + IN PVP_DEVICE_DESCRIPTION VpDeviceExtension ) +{ + DPRINT1("VideoPortGetDmaAdapter(): Unimplemented.\n"); + return NULL; +} + +VP_STATUS +STDCALL +VideoPortGetVersion ( IN PVOID HwDeviceExtension, + IN OUT PVPOSVERSIONINFO VpOsVersionInfo ) +{ + DPRINT1("VideoPortGetVersion(): Unimplemented.\n"); + return STATUS_UNSUCCESSFUL; +} + +PVOID +STDCALL +VideoPortLockBuffer ( IN PVOID HwDeviceExtension, + IN PVOID BaseAddress, + IN ULONG Length, + IN VP_LOCK_OPERATION Operation ) +{ + DPRINT1("VideoPortLockBuffer(): Unimplemented.\n"); + return NULL; +} + +VOID +STDCALL +VideoPortUnlockBuffer ( IN PVOID HwDeviceExtension, + IN PVOID Mdl ) +{ + DPRINT1("VideoPortUnlockBuffer(): Unimplemented.\n"); +} + +VP_STATUS +STDCALL +VideoPortCreateEvent ( IN PVOID HwDeviceExtension, + IN ULONG EventFlag, + IN PVOID Unused, + OUT PEVENT *Event) +{ + EVENT_TYPE Type; + (*Event) = ExAllocatePoolWithTag(NonPagedPool, sizeof(KEVENT), + TAG_VIDEO_PORT); + if ((*Event) == NULL) + { + return STATUS_NO_MEMORY; + } + if (EventFlag & NOTIFICATION_EVENT) + { + Type = NotificationEvent; + } + else + { + Type = SynchronizationEvent; + } + KeInitializeEvent((PKEVENT)*Event, Type, EventFlag & INITIAL_EVENT_SIGNALED); + return STATUS_SUCCESS; +} + +VP_STATUS +STDCALL +VideoPortDeleteEvent ( IN PVOID HwDeviceExtension, + IN PEVENT Event) +{ + ExFreePool(Event); + return STATUS_SUCCESS; +} + +LONG +STDCALL +VideoPortSetEvent ( IN PVOID HwDeviceExtension, + IN PEVENT Event ) +{ + return KeSetEvent((PKEVENT)Event, IO_NO_INCREMENT, FALSE); +} + +VOID +STDCALL +VideoPortClearEvent ( IN PVOID HwDeviceExtension, + IN PEVENT Event ) +{ + KeClearEvent((PKEVENT)Event); +} + +VP_STATUS +STDCALL +VideoPortWaitForSingleObject ( IN PVOID HwDeviceExtension, + IN PVOID Object, + IN PLARGE_INTEGER Timeout OPTIONAL ) +{ + return KeWaitForSingleObject(Object, + Executive, + KernelMode, + FALSE, + Timeout); +} + +BOOLEAN +STDCALL +VideoPortCheckForDeviceExistence ( IN PVOID HwDeviceExtension, + IN USHORT VendorId, + IN USHORT DeviceId, + IN UCHAR RevisionId, + IN USHORT SubVendorId, + IN USHORT SubSystemId, + IN ULONG Flags ) +{ + DPRINT1("VideoPortCheckForDeviceExistence(): Unimplemented.\n"); + return TRUE; +} + +VP_STATUS +STDCALL +VideoPortRegisterBugcheckCallback ( IN PVOID HwDeviceExtension, + IN ULONG BugcheckCode, + IN PVOID Callback, + IN ULONG BugcheckDataSize ) +{ + DPRINT1("VideoPortRegisterBugcheckCallback(): Unimplemented.\n"); + return STATUS_UNSUCCESSFUL; +} diff --git a/reactos/drivers/video/videoprt/videoprt.def b/reactos/drivers/video/videoprt/videoprt.def index b8aef5ba2b0..f0aaeb090f5 100644 --- a/reactos/drivers/video/videoprt/videoprt.def +++ b/reactos/drivers/video/videoprt/videoprt.def @@ -1,30 +1,42 @@ -; $Id: videoprt.def,v 1.4 2004/03/06 08:39:06 jimtabor Exp $ +; $Id: videoprt.def,v 1.5 2004/03/06 22:25:22 dwelch Exp $ ; ; vidport.def - export definition file for ReactOS ; EXPORTS ReturnCsrssAddress VideoPortAllocateBuffer@12 +VideoPortAllocateCommonBuffer@24 +VideoPortClearEvent@8 VideoPortCompareMemory@12 +VideoPortCreateEvent@16 +VideoPortCreateSecondaryDisplay@12 VideoPortDDCMonitorHelper@16 VideoPortDebugPrint +VideoPortDeleteEvent@8 VideoPortDisableInterrupt@4 VideoPortEnableInterrupt@4 +VideoPortEnumerateChildren@8 VideoPortFreeDeviceBase@8 VideoPortGetAgpServices@8 +VideoPortGetAssociatedDeviceExtension@4 VideoPortGetBusData@24 VideoPortGetCurrentIrql@0 VideoPortGetDeviceBase@20 VideoPortGetDeviceData@16 +VideoPortGetDmaAdapter@8 VideoPortGetAccessRanges@32 VideoPortGetRegistryParameters@20 +VideoPortGetRomImage@16 +VideoPortGetVersion@8 VideoPortGetVgaStatus@8 VideoPortInitialize@16 VideoPortInt10@8 +VideoPortLockBuffer@16 VideoPortLogError@16 VideoPortMapBankedMemory@40 VideoPortMapMemory@24 VideoPortMoveMemory@12 +VideoPortQueueDpc@12 VideoPortReadPortUchar@4 VideoPortReadPortUshort@4 VideoPortReadPortUlong@4 @@ -37,17 +49,22 @@ VideoPortReadRegisterUlong@4 VideoPortReadRegisterBufferUchar@12 VideoPortReadRegisterBufferUshort@12 VideoPortReadRegisterBufferUlong@12 +VideoPortRegisterBugcheckCallback@16 VideoPortReleaseBuffer@8 +VideoPortReleaseCommonBuffer@28 VideoPortScanRom@16 VideoPortSetBusData@24 +VideoPortSetEvent@8 VideoPortSetRegistryParameters@16 VideoPortSetTrappedEmulatorPorts@12 VideoPortStallExecution@4 VideoPortStartTimer@4 VideoPortStopTimer@4 VideoPortSynchronizeExecution@16 +VideoPortUnlockBuffer@8 VideoPortUnmapMemory@12 VideoPortVerifyAccessRanges@12 +VideoPortWaitForSingleObject@12 VideoPortWritePortUchar@8 VideoPortWritePortUshort@8 VideoPortWritePortUlong@8 diff --git a/reactos/drivers/video/videoprt/videoprt.edf b/reactos/drivers/video/videoprt/videoprt.edf index 515d6b1ebfb..b881aa281c0 100644 --- a/reactos/drivers/video/videoprt/videoprt.edf +++ b/reactos/drivers/video/videoprt/videoprt.edf @@ -1,33 +1,46 @@ -; $Id: videoprt.edf,v 1.4 2004/03/06 08:39:06 jimtabor Exp $ +; $Id: videoprt.edf,v 1.5 2004/03/06 22:25:22 dwelch Exp $ ; ; vidport.def - export definition file for ReactOS ; EXPORTS -VideoPortCompareMemory=NTOSKRNL.RtlCompareMemory VideoPortAllocateBuffer=VideoPortAllocateBuffer@12 +VideoPortAllocateCommonBuffer=VideoPortAllocateCommonBuffer@24 VideoPortAllocatePool=VideoPortAllocatePool@16 +VideoPortCompareMemory=NTOSKRNL.RtlCompareMemory +VideoPortClearEvent=VideoPortClearEvent@8 +VideoPortCreateEvent=VideoPortCreateEvent@16 +VideoPortCreateSecondaryDisplay=VideoPortCreateSecondaryDisplay@12 VideoPortDDCMonitorHelper=VideoPortDDCMonitorHelper@16 VideoPortDebugPrint +VideoPortDeleteEvent=VideoPortDeleteEvent@8 VideoPortDisableInterrupt=VideoPortDisableInterrupt@4 VideoPortEnableInterrupt=VideoPortEnableInterrupt@4 +VideoPortEnumerateChildren=VideoPortEnumerateChildren@8 VideoPortFreeDeviceBase=VideoPortFreeDeviceBase@8 VideoPortFreePool=VideoPortFreePool@8 VideoPortGetBusData=VideoPortGetBusData@24 VideoPortGetAgpServices=VideoPortGetAgpServices@8 +VideoPortGetAssociatedDeviceExtension=VideoPortGetAssociatedDeviceExtension@4 VideoPortGetCurrentIrql=VideoPortGetCurrentIrql@0 VideoPortGetDeviceBase=VideoPortGetDeviceBase@20 VideoPortGetDeviceData=VideoPortGetDeviceData@16 +VideoPortGetDmaAdapter=VideoPortGetDmaAdapter@8 VideoPortGetAccessRanges=VideoPortGetAccessRanges@32 VideoPortGetRegistryParameters=VideoPortGetRegistryParameters@20 +VideoPortGetRomImage=VideoPortGetRomImage@16 +VideoPortGetVersion=VideoPortGetVersion@8 VideoPortGetVgaStatus=VideoPortGetVgaStatus@8 VideoPortInitialize=VideoPortInitialize@16 VideoPortInt10=VideoPortInt10@8 +VideoPortInterlockedExchange=NTOSKRNL.InterlockedExchange +VideoPortLockBuffer=VideoPortLockBuffer@16 VideoPortLogError=VideoPortLogError@16 VideoPortMapBankedMemory=VideoPortMapBankedMemory@40 VideoPortMapMemory=VideoPortMapMemory@24 VideoPortMoveMemory=NTOSKRNL.RtlMoveMemory VideoPortQueryServices=VideoPortQueryServices@12 VideoPortQuerySystemTime=NTOSKRNL.KeQuerySystemTime +VideoPortQueueDpc=VideoPortQueueDpc@12 VideoPortReadPortUchar=HAL.READ_PORT_UCHAR VideoPortReadPortUshort=HAL.READ_PORT_USHORT VideoPortReadPortUlong=HAL.READ_PORT_ULONG @@ -40,17 +53,22 @@ VideoPortReadRegisterUlong=NTOSKRNL.READ_REGISTER_ULONG VideoPortReadRegisterBufferUchar=NTOSKRNL.READ_REGISTER_BUFFER_UCHAR VideoPortReadRegisterBufferUshort=NTOSKRNL.READ_REGISTER_BUFFER_USHORT VideoPortReadRegisterBufferUlong=NTOSKRNL.READ_REGISTER_BUFFER_ULONG +VideoPortRegisterBugcheckCallBack=VideoPortRegisterBugcheckCallback@16 VideoPortReleaseBuffer=VideoPortReleaseBuffer@8 +VideoPortReleaseCommonBuffer=VideoPortReleaseCommonBuffer@28 VideoPortScanRom=VideoPortScanRom@16 VideoPortSetBusData=VideoPortSetBusData@24 +VideoPortSetEvent=VideoPortSetEvent@8 VideoPortSetRegistryParameters=VideoPortSetRegistryParameters@16 VideoPortSetTrappedEmulatorPorts=VideoPortSetTrappedEmulatorPorts@12 VideoPortStallExecution=HAL.KeStallExecutionProcessor VideoPortStartTimer=VideoPortStartTimer@4 VideoPortStopTimer=VideoPortStopTimer@4 VideoPortSynchronizeExecution=VideoPortSynchronizeExecution@16 +VideoPortUnlockBuffer=VideoPortUnlockBuffer@8 VideoPortUnmapMemory=VideoPortUnmapMemory@12 VideoPortVerifyAccessRanges=VideoPortVerifyAccessRanges@12 +VideoPortWaitForSingleObject=VideoPortWaitForSingleObject@12 VideoPortWritePortUchar=HAL.WRITE_PORT_UCHAR VideoPortWritePortUshort=HAL.WRITE_PORT_USHORT VideoPortWritePortUlong=HAL.WRITE_PORT_ULONG diff --git a/reactos/drivers/video/videoprt/videoprt.h b/reactos/drivers/video/videoprt/videoprt.h index b9f5e92cd1d..b4e11553b06 100644 --- a/reactos/drivers/video/videoprt/videoprt.h +++ b/reactos/drivers/video/videoprt/videoprt.h @@ -18,7 +18,7 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: videoprt.h,v 1.2 2004/03/06 01:22:02 navaraf Exp $ + * $Id: videoprt.h,v 1.3 2004/03/06 22:25:22 dwelch Exp $ */ #ifndef VIDEOPRT_H @@ -28,7 +28,7 @@ #include <ddk/video.h> #include <ddk/ntddvdeo.h> #include "internal/ps.h" -#define NDEBUG +/*#define NDEBUG*/ #include <debug.h> /* @@ -71,6 +71,7 @@ typedef struct _VIDEO_PORT_DEVICE_EXTENSTION INTERFACE_TYPE AdapterInterfaceType; ULONG SystemIoBusNumber; UNICODE_STRING RegistryPath; + KDPC DpcObject; UCHAR MiniPortDeviceExtension[1]; /* must be the last entry */ } VIDEO_PORT_DEVICE_EXTENSION, *PVIDEO_PORT_DEVICE_EXTENSION; From 1f3378866b65f2b2e6e6ac156bb052134ceb9e86 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Sat, 6 Mar 2004 22:26:05 +0000 Subject: [PATCH 0341/1463] - Forgot this file. svn path=/trunk/; revision=8553 --- reactos/ntoskrnl/include/internal/ke.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/reactos/ntoskrnl/include/internal/ke.h b/reactos/ntoskrnl/include/internal/ke.h index ff2a3b9a64e..8dae2890189 100644 --- a/reactos/ntoskrnl/include/internal/ke.h +++ b/reactos/ntoskrnl/include/internal/ke.h @@ -40,6 +40,9 @@ VOID KeSetGdtSelector(ULONG Entry, ULONG Value1, ULONG Value2); struct _KTHREAD; +VOID STDCALL +DbgBreakPointNoBugCheck(VOID); + VOID STDCALL KeRescheduleThread(); VOID KiUpdateSystemTime (KIRQL oldIrql, ULONG Eip); From de9089e707873af8eae01c627546391faf282639 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Sat, 6 Mar 2004 22:27:55 +0000 Subject: [PATCH 0342/1463] - Added padding to align VIDEO_PORT_CONFIG_INFO.VdmPhysicalVideoMemoryAddress and subsequent members the same as visualc. svn path=/trunk/; revision=8554 --- reactos/w32api/include/ddk/video.h | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/w32api/include/ddk/video.h b/reactos/w32api/include/ddk/video.h index 68a496a625c..39122bf63be 100644 --- a/reactos/w32api/include/ddk/video.h +++ b/reactos/w32api/include/ddk/video.h @@ -169,6 +169,7 @@ typedef struct _VIDEO_PORT_CONFIG_INFO { ULONG NumEmulatorAccessEntries; PEMULATOR_ACCESS_ENTRY EmulatorAccessEntries; ULONG_PTR EmulatorAccessEntriesContext; + PVOID Reserved0; PHYSICAL_ADDRESS VdmPhysicalVideoMemoryAddress; ULONG VdmPhysicalVideoMemoryLength; ULONG HardwareStateSize; From a30e1be179d1eb77727cb6aff279303a81a25c07 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sat, 6 Mar 2004 23:09:23 +0000 Subject: [PATCH 0343/1463] - Initialized the win32k timer as SynchronizationTimer. A notification timer is always signaled after the first hit. - Possible this does fix more timer related problems. svn path=/trunk/; revision=8555 --- reactos/subsys/win32k/ntuser/timer.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/timer.c b/reactos/subsys/win32k/ntuser/timer.c index 55b5138067b..213c22862fa 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.25 2004/03/04 01:30:00 gdalsnes Exp $ +/* $Id: timer.c,v 1.26 2004/03/06 23:09:23 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -413,11 +413,6 @@ TimerThreadMain(PVOID StartContext) MsgTimer = CONTAINING_RECORD( TimerListHead.Flink, MSG_TIMER_ENTRY, ListEntry); KeSetTimer(&Timer, MsgTimer->Timeout, NULL); } - else - { - /* cancel timer, this reset the state of the timer event on which we wait */ - KeCancelTimer(&Timer); - } IntUnLockTimerList; @@ -437,7 +432,7 @@ InitTimerImpl(VOID) BitmapBytes = ROUND_UP(NUM_WINDOW_LESS_TIMERS, sizeof(ULONG) * 8) / 8; InitializeListHead(&TimerListHead); - KeInitializeTimer(&Timer); + KeInitializeTimerEx(&Timer, SynchronizationTimer); ExInitializeFastMutex(&Mutex); WindowLessTimersBitMapBuffer = ExAllocatePoolWithTag(PagedPool, BitmapBytes, TAG_TIMERBMP); From 75c10128512eab96657e957e02d63e6f04b2d545 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" <hackbunny@reactos.org> Date: Sun, 7 Mar 2004 03:15:20 +0000 Subject: [PATCH 0344/1463] Fiber test application. It's a simulation of the Windows NT scheduling algorithm, complete with priority levels, real-time priorities and starvation prevention. Lacks pre-emption, waiting and boosts svn path=/trunk/; revision=8556 --- reactos/apps/tests/fiber/.cvsignore | 6 + reactos/apps/tests/fiber/Makefile | 23 ++ reactos/apps/tests/fiber/fiber.c | 397 ++++++++++++++++++++++++++++ 3 files changed, 426 insertions(+) create mode 100644 reactos/apps/tests/fiber/.cvsignore create mode 100644 reactos/apps/tests/fiber/Makefile create mode 100644 reactos/apps/tests/fiber/fiber.c diff --git a/reactos/apps/tests/fiber/.cvsignore b/reactos/apps/tests/fiber/.cvsignore new file mode 100644 index 00000000000..d63774a7353 --- /dev/null +++ b/reactos/apps/tests/fiber/.cvsignore @@ -0,0 +1,6 @@ +*.o +*.d +*.exe +*.coff +*.sym +*.map diff --git a/reactos/apps/tests/fiber/Makefile b/reactos/apps/tests/fiber/Makefile new file mode 100644 index 00000000000..faa18af96aa --- /dev/null +++ b/reactos/apps/tests/fiber/Makefile @@ -0,0 +1,23 @@ +# $Id: Makefile,v 1.1 2004/03/07 03:15:20 hyperion Exp $ + +PATH_TO_TOP = ../../.. + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = console + +TARGET_NAME = fiber + +TARGET_SDKLIBS = kernel32.a + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_CFLAGS = -Wall -Werror -D__USE_W32API + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/reactos/apps/tests/fiber/fiber.c b/reactos/apps/tests/fiber/fiber.c new file mode 100644 index 00000000000..385b80fbfef --- /dev/null +++ b/reactos/apps/tests/fiber/fiber.c @@ -0,0 +1,397 @@ +/* $Id: fiber.c,v 1.1 2004/03/07 03:15:20 hyperion Exp $ +*/ + +#include <assert.h> +#include <stdlib.h> +#include <stdio.h> +#include <time.h> +#include <tchar.h> +#include <windows.h> + +#ifndef InitializeListHead +#define InitializeListHead(PLH__) ((PLH__)->Flink = (PLH__)->Blink = (PLH__)) +#endif + +#ifndef IsListEmpty +#define IsListEmpty(PLH__) ((PLH__)->Flink == (PVOID)(PLH__)) +#endif + +#ifndef RemoveEntryList + +#define RemoveEntryList(PLE__) \ +{ \ + PLIST_ENTRY pleBack__ = (PLIST_ENTRY)((PLE__)->Blink); \ + PLIST_ENTRY pleForward__ = (PLIST_ENTRY)((PLE__)->Flink); \ + \ + pleBack__->Flink = pleForward__; \ + pleForward__->Blink = pleBack__; \ +} + +#endif + +#ifndef InsertTailList + +#define InsertTailList(PLH__, PLE__) \ +{ \ + PLIST_ENTRY pleListHead__ = (PLH__); \ + PLIST_ENTRY pleBlink__ = (PLIST_ENTRY)((PLH__)->Blink); \ + \ + (PLE__)->Flink = pleListHead__; \ + (PLE__)->Blink = pleBlink__; \ + pleBlink__->Flink = (PLE__); \ + pleListHead__->Blink = (PLE__); \ +} + +#endif + +#ifndef RemoveHeadList + +#define RemoveHeadList(PLH__) \ + (PLIST_ENTRY)((PLH__)->Flink); \ + RemoveEntryList((PLIST_ENTRY)((PLH__)->Flink)); + +#endif + +#define FIBERTEST_COUNT 500 + +struct FiberData +{ + unsigned nMagic; + unsigned nId; + unsigned nPrio; + unsigned nRealPrio; + PVOID pFiber; + LIST_ENTRY leQueue; + int nTickQueued; + int nBoost; + struct FiberData * pfdPrev; + int bExitPrev; +}; + +static LIST_ENTRY a_leQueues[32]; +static unsigned nTick = 0; +static struct FiberData * pfdLastStarveScan = NULL; + +void Fbt_Create(int); +void Fbt_Exit(void); +void Fbt_Yield(void); + +struct FiberData * Fbt_GetCurrent(void); +unsigned Fbt_GetCurrentId(void); +VOID CALLBACK Fbt_Startup(PVOID); +void Fbt_Dispatch(struct FiberData *, int); +void Fbt_AfterSwitch(struct FiberData *); + +void DoStuff(void); + +struct FiberData * Fbt_GetCurrent(VOID) +{ + return GetFiberData(); +} + +unsigned Fbt_GetCurrentId(VOID) +{ + return Fbt_GetCurrent()->nId; +} + +void Fbt_Yield(VOID) +{ + struct FiberData * pfdCur; + + pfdCur = Fbt_GetCurrent(); + + if(pfdCur->nBoost > 1) + { + -- pfdCur->nBoost; + + if(!pfdCur->nBoost) + pfdCur->nPrio = pfdCur->nRealPrio; + } + else if((rand() % 100) > 50 - (45 * pfdCur->nPrio) / 32) + Fbt_Dispatch(pfdCur, 0); +} + +void Fbt_AfterSwitch(struct FiberData * pfdCur) +{ + struct FiberData * pfdPrev; + + pfdPrev = pfdCur->pfdPrev; + + if(pfdPrev) + { + if(pfdCur->bExitPrev) + { + if(pfdLastStarveScan == pfdPrev) + pfdLastStarveScan = 0; + + DeleteFiber(pfdPrev->pFiber); + free(pfdPrev); + } + else + { + pfdPrev->nTickQueued = nTick; + + if(pfdPrev->nBoost) + { + pfdPrev->nBoost = 0; + pfdPrev->nPrio = pfdPrev->nRealPrio; + } + + InsertTailList + ( + &a_leQueues[pfdPrev->nPrio], + &pfdPrev->leQueue + ); + } + } +} + +VOID CALLBACK Fbt_Startup(PVOID pParam) +{ + assert(pParam == GetFiberData()); + Fbt_AfterSwitch(pParam); + DoStuff(); + Fbt_Exit(); +} + +void Fbt_Dispatch(struct FiberData * pfdCur, int bExit) +{ + UCHAR i; + UCHAR n; + struct FiberData * pfdNext; + + assert(pfdCur == GetFiberData()); + + ++ nTick; + + if(nTick % 10 == 0) + { + int j; + int k; + int b; + int bResume; + PLIST_ENTRY ple; + + bResume = 0; + i = 0; + + if(pfdLastStarveScan) + { + unsigned nPrio; + + nPrio = pfdLastStarveScan->nPrio; + + if(IsListEmpty(&pfdLastStarveScan->leQueue)) + i = nPrio; + else if(pfdLastStarveScan->leQueue.Flink == &a_leQueues[nPrio]) + i = nPrio + 1; + else + { + ple = pfdLastStarveScan->leQueue.Flink; + bResume = 1; + } + + if(i >= 15) + i = 0; + } + + for(j = 0, k = 0, b = 0; j < 16 && k < 15 && b < 10; ++ j) + { + unsigned nDiff; + + if(!bResume) + { + int nQueue; + + nQueue = (k + i) % 15; + + if(IsListEmpty(&a_leQueues[nQueue])) + { + ++ k; + continue; + } + + ple = (PLIST_ENTRY)a_leQueues[nQueue].Flink; + } + else + bResume = 0; + + pfdLastStarveScan = CONTAINING_RECORD(ple, struct FiberData, leQueue); + assert(pfdLastStarveScan->nMagic == 0x12345678); + assert(pfdLastStarveScan != pfdCur); + + if(nTick > pfdLastStarveScan->nTickQueued) + nDiff = nTick - pfdLastStarveScan->nTickQueued; + else + nDiff = pfdLastStarveScan->nTickQueued - nTick; + + if(nDiff > 30) + { + ++ b; + + pfdLastStarveScan->nBoost = 2; + pfdLastStarveScan->nRealPrio = pfdLastStarveScan->nPrio; + pfdLastStarveScan->nPrio = 15; + + RemoveEntryList(&pfdLastStarveScan->leQueue); + InsertTailList(&a_leQueues[15], &pfdLastStarveScan->leQueue); + } + } + } + + pfdNext = NULL; + + if(bExit) + n = 1; + else + n = pfdCur->nPrio + 1; + + for(i = 32; i >= n; -- i) + { + PLIST_ENTRY pleNext; + + if(IsListEmpty(&a_leQueues[i - 1])) + continue; + + pleNext = RemoveHeadList(&a_leQueues[i - 1]); + InitializeListHead(pleNext); + + pfdNext = CONTAINING_RECORD(pleNext, struct FiberData, leQueue); + assert(pfdNext->pFiber != GetCurrentFiber()); + assert(pfdNext->nMagic == 0x12345678); + break; + } + + if(pfdNext) + { + pfdNext->pfdPrev = pfdCur; + pfdNext->bExitPrev = bExit; + + SwitchToFiber(pfdNext->pFiber); + + Fbt_AfterSwitch(pfdCur); + } + else if(bExit) + { + PVOID pCurFiber; + + if(pfdLastStarveScan == pfdCur) + pfdLastStarveScan = NULL; + + pCurFiber = pfdCur->pFiber; + free(pfdCur); + DeleteFiber(pCurFiber); + } +} + +void Fbt_Exit(VOID) +{ + Fbt_Dispatch(GetFiberData(), 1); +} + +void Fbt_CreateFiber(int bInitial) +{ + PVOID pFiber; + struct FiberData * pData; + static int s_bFiberPrioSeeded = 0; + static LONG s_nFiberIdSeed = 0; + + pData = malloc(sizeof(struct FiberData)); + + assert(pData); + + if(bInitial) + pFiber = ConvertThreadToFiber(pData); + else + pFiber = CreateFiber(0, Fbt_Startup, pData); + + if(!s_bFiberPrioSeeded) + { + unsigned nFiberPrioSeed; + time_t tCurTime; + + tCurTime = time(NULL); + memcpy(&nFiberPrioSeed, &tCurTime, sizeof(nFiberPrioSeed)); + srand(nFiberPrioSeed); + s_bFiberPrioSeeded = 1; + } + + assert(pFiber); + + pData->nMagic = 0x12345678; + pData->nId = InterlockedIncrement(&s_nFiberIdSeed); + pData->nPrio = rand() % 32; + pData->pFiber = pFiber; + pData->nTickQueued = 0; + pData->nBoost = 0; + pData->nRealPrio = pData->nPrio; + pData->pfdPrev = NULL; + pData->bExitPrev = 0; + + if(bInitial) + { + InitializeListHead(&pData->leQueue); + } + else + { + InsertTailList + ( + &a_leQueues[pData->nPrio], + &pData->leQueue + ); + } +} + +void DoStuff(void) +{ + unsigned i; + unsigned n; + unsigned nId; + + n = rand() % 1000; + nId = Fbt_GetCurrentId(); + + _ftprintf(stderr, _T("[%u] BEGIN\n"), nId); + + for(i = 0; i < n; ++ i) + { + unsigned j; + unsigned m; + + _ftprintf(stderr, _T("[%u] [%u/%u]\n"), nId, i + 1, n); + + m = rand() % 1000; + + for(j = 0; j < m; ++ j) + Sleep(0); + + Fbt_Yield(); + } + + _ftprintf(stderr, _T("[%u] END\n"), nId); +} + +int _tmain(int argc, _TCHAR const * const * argv) +{ + unsigned i; + unsigned nFibers; + + if(argc > 1) + nFibers = _tcstoul(argv[1], 0, NULL); + else + nFibers = FIBERTEST_COUNT; + + for(i = 0; i < 32; ++ i) + { + InitializeListHead(&a_leQueues[i]); + } + + for(i = 0; i < nFibers; ++ i) + Fbt_CreateFiber(i == 0); + + Fbt_Startup(GetFiberData()); + + return 0; +} + +/* EOF */ From cdf117484b4c543178fcacb50e4ebc979c7a46e6 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" <hackbunny@reactos.org> Date: Sun, 7 Mar 2004 03:48:47 +0000 Subject: [PATCH 0345/1463] Added fiber test svn path=/trunk/; revision=8557 --- reactos/apps/tests/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/apps/tests/Makefile b/reactos/apps/tests/Makefile index 3db6e33c24a..0946f37fc3c 100644 --- a/reactos/apps/tests/Makefile +++ b/reactos/apps/tests/Makefile @@ -15,7 +15,7 @@ mktime mstest multithrdwin multiwin mutex nptest patblt primitives pteb \ regtest sectest sertest shaptest shm statst statst2 stretchblt suspend \ tcpsvr terminate txtscale thread thread_msg tokentest user32 vmtest \ winhello wm_erasebkgnd wm_paint eventpair threadwait popupmenu \ -map_dup_inherit p_dup_handle apc2 enhmetafile dirdlg guithreadinfo +map_dup_inherit p_dup_handle apc2 enhmetafile dirdlg guithreadinfo fiber # Build failure: # kernel32 From 7682e4ce8049adbe7c61e72179ddbd0740d48e3c Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" <hackbunny@reactos.org> Date: Sun, 7 Mar 2004 04:00:39 +0000 Subject: [PATCH 0346/1463] Fiber switching code fixed svn path=/trunk/; revision=8558 --- reactos/lib/kernel32/thread/i386/fiber.S | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/kernel32/thread/i386/fiber.S b/reactos/lib/kernel32/thread/i386/fiber.S index 33e30b7ee9d..dac8c543933 100644 --- a/reactos/lib/kernel32/thread/i386/fiber.S +++ b/reactos/lib/kernel32/thread/i386/fiber.S @@ -1,4 +1,4 @@ -/* $Id: fiber.S,v 1.2 2003/06/09 22:39:48 hyperion Exp $ +/* $Id: fiber.S,v 1.3 2004/03/07 04:00:39 hyperion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -78,7 +78,7 @@ l_NoFloatSave: movl 0x2C(%eax), %edi /* edi = Fiber->Edi */ testb $1, 0x14(%eax) - jz l_NoFloatSave + jz l_NoFloatRestore /* restore the floating point context */ /* TODO */ From ff81e5e1b064a8f248cc881a85e2fede9d8a0440 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Sun, 7 Mar 2004 04:38:41 +0000 Subject: [PATCH 0347/1463] - Use an event rather than a semaphore to wake up the thread that writes debug output to disk. Avoids bugchecking if the number of debug prints before the thread wakes up exceeds the semaphore limit. svn path=/trunk/; revision=8559 --- reactos/ntoskrnl/kd/dlog.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/reactos/ntoskrnl/kd/dlog.c b/reactos/ntoskrnl/kd/dlog.c index 25885006691..b4bab1637ac 100644 --- a/reactos/ntoskrnl/kd/dlog.c +++ b/reactos/ntoskrnl/kd/dlog.c @@ -1,4 +1,4 @@ -/* $Id: dlog.c,v 1.11 2004/01/05 14:28:20 weiden Exp $ +/* $Id: dlog.c,v 1.12 2004/03/07 04:38:41 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -31,7 +31,7 @@ static ULONG DebugLogOverflow; static HANDLE DebugLogThreadHandle; static CLIENT_ID DebugLogThreadCid; static HANDLE DebugLogFile; -static KSEMAPHORE DebugLogSem; +static KEVENT DebugLogEvent; /* FUNCTIONS *****************************************************************/ @@ -43,7 +43,7 @@ DebugLogInit(VOID) DebugLogEnd = 0; DebugLogOverflow = 0; DebugLogCount = 0; - KeInitializeSemaphore(&DebugLogSem, 0, 255); + KeInitializeEvent(&DebugLogEvent, NotificationEvent, FALSE); } VOID STDCALL @@ -56,11 +56,13 @@ DebugLogThreadMain(PVOID Context) for (;;) { - KeWaitForSingleObject(&DebugLogSem, + LARGE_INTEGER TimeOut; + TimeOut.QuadPart = -5000000; /* Half a second. */ + KeWaitForSingleObject(&DebugLogEvent, 0, KernelMode, FALSE, - NULL); + &TimeOut); KeAcquireSpinLock(&DebugLogLock, &oldIrql); while (DebugLogCount > 0) { @@ -103,6 +105,7 @@ DebugLogThreadMain(PVOID Context) } KeAcquireSpinLock(&DebugLogLock, &oldIrql); } + KeResetEvent(&DebugLogEvent); KeReleaseSpinLock(&DebugLogLock, oldIrql); } } @@ -167,7 +170,7 @@ DebugLogWrite(PCH String) KeReleaseSpinLock(&DebugLogLock, oldIrql); if (oldIrql < DISPATCH_LEVEL) { - KeReleaseSemaphore(&DebugLogSem, IO_NO_INCREMENT, 1, FALSE); + KeSetEvent(&DebugLogEvent, IO_NO_INCREMENT, FALSE); } return; } @@ -184,7 +187,7 @@ DebugLogWrite(PCH String) KeReleaseSpinLock(&DebugLogLock, oldIrql); if (oldIrql < DISPATCH_LEVEL) { - KeReleaseSemaphore(&DebugLogSem, IO_NO_INCREMENT, 1, FALSE); + KeSetEvent(&DebugLogEvent, IO_NO_INCREMENT, FALSE); } return; } @@ -195,7 +198,7 @@ DebugLogWrite(PCH String) if (oldIrql < DISPATCH_LEVEL) { - KeReleaseSemaphore(&DebugLogSem, IO_NO_INCREMENT, 1, FALSE); + KeSetEvent(&DebugLogEvent, IO_NO_INCREMENT, FALSE); } } From 75860969fefbc8ba7a2bede8c19552fcbe7314f4 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Sun, 7 Mar 2004 04:43:55 +0000 Subject: [PATCH 0348/1463] - Added an implemention of VideoPortGetProcAddress - ati2mtag calls VideoPortGetAccessRanges with *DeviceId == 0 so treat that as matching an device id. - Return STATUS_SUCCESS from VideoPortSetTrappedEmulatorPorts even though the data is ignored. svn path=/trunk/; revision=8560 --- reactos/drivers/video/videoprt/videoprt.c | 162 ++++++++++++++++---- reactos/drivers/video/videoprt/videoprt.def | 3 +- reactos/drivers/video/videoprt/videoprt.edf | 3 +- reactos/drivers/video/videoprt/videoprt.h | 4 +- 4 files changed, 141 insertions(+), 31 deletions(-) diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index f6614c062c5..354b386a9fd 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.8 2004/03/06 22:25:22 dwelch Exp $ + * $Id: videoprt.c,v 1.9 2004/03/07 04:43:55 dwelch Exp $ */ #include "videoprt.h" @@ -35,6 +35,9 @@ VideoPortDeferredRoutine( IN PVOID SystemArgument1, IN PVOID SystemArgument2 ); +PVOID STDCALL +VideoPortGetProcAddress(IN PVOID HwDeviceExtension, + IN PUCHAR FunctionName); // ------------------------------------------------------- Public Interface @@ -199,7 +202,6 @@ VideoPortGetAccessRanges(IN PVOID HwDeviceExtension, IN PULONG Slot) { PCI_SLOT_NUMBER PciSlotNumber; - BOOLEAN FoundDevice; ULONG FunctionNumber; PCI_COMMON_CONFIG Config; PCM_RESOURCE_LIST AllocatedResources; @@ -208,49 +210,82 @@ VideoPortGetAccessRanges(IN PVOID HwDeviceExtension, CM_FULL_RESOURCE_DESCRIPTOR *FullList; CM_PARTIAL_RESOURCE_DESCRIPTOR *Descriptor; PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + USHORT VendorIdToFind; + USHORT DeviceIdToFind; DPRINT("VideoPortGetAccessRanges\n"); + if (VendorId != NULL) + { + VendorIdToFind = *(PUSHORT)VendorId; + } + else + { + VendorIdToFind = 0; + } + if (DeviceId != NULL) + { + DeviceIdToFind = *(PUSHORT)DeviceId; + } + else + { + DeviceIdToFind = 0; + } + DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, VIDEO_PORT_DEVICE_EXTENSION, MiniPortDeviceExtension); - if (0 == NumRequestedResources && PCIBus == DeviceExtension->AdapterInterfaceType) + if (0 == NumRequestedResources && + PCIBus == DeviceExtension->AdapterInterfaceType) { - if (DeviceId != NULL && VendorId != NULL) - { - DPRINT("Looking for VendorId 0x%04x DeviceId 0x%04x\n", (int)*((USHORT *) VendorId), - (int)*((USHORT *) DeviceId)); - } - FoundDevice = FALSE; + DPRINT("Looking for VendorId 0x%04x DeviceId 0x%04x\n", + VendorIdToFind, DeviceIdToFind); + PciSlotNumber.u.AsULONG = *Slot; - for (FunctionNumber = 0; ! FoundDevice && FunctionNumber < 8; FunctionNumber++) + + /* + Search for the device id and vendor id on this bus. + */ + for (FunctionNumber = 0; FunctionNumber < 8; FunctionNumber++) { + ULONG ReturnedLength; PciSlotNumber.u.bits.FunctionNumber = FunctionNumber; - if (sizeof(PCI_COMMON_CONFIG) == - HalGetBusDataByOffset(PCIConfiguration, DeviceExtension->SystemIoBusNumber, - PciSlotNumber.u.AsULONG,&Config, 0, - sizeof(PCI_COMMON_CONFIG))) + ReturnedLength = HalGetBusData(PCIConfiguration, + DeviceExtension->SystemIoBusNumber, + PciSlotNumber.u.AsULONG, + &Config, + sizeof(PCI_COMMON_CONFIG)); + if (sizeof(PCI_COMMON_CONFIG) == ReturnedLength) { if (DeviceId != NULL && VendorId != NULL) { - DPRINT("Slot 0x%02x (Device %d Function %d) VendorId 0x%04x DeviceId 0x%04x\n", - PciSlotNumber.u.AsULONG, PciSlotNumber.u.bits.DeviceNumber, - PciSlotNumber.u.bits.FunctionNumber, Config.VendorID, Config.DeviceID); + DPRINT("Slot 0x%02x (Device %d Function %d) VendorId 0x%04x " + "DeviceId 0x%04x\n", + PciSlotNumber.u.AsULONG, + PciSlotNumber.u.bits.DeviceNumber, + PciSlotNumber.u.bits.FunctionNumber, Config.VendorID, + Config.DeviceID); } - FoundDevice = (VendorId == NULL || Config.VendorID == *((USHORT *) VendorId)) && - (DeviceId == NULL || Config.DeviceID == *((USHORT *) DeviceId)); + if ((VendorIdToFind == 0 || Config.VendorID == VendorIdToFind) && + (DeviceIdToFind == 0 || Config.DeviceID == DeviceIdToFind)) + { + break; + } } } - if (! FoundDevice) + if (FunctionNumber == 8) { + DPRINT("Didn't find device.\n"); return STATUS_UNSUCCESSFUL; } + Status = HalAssignSlotResources(NULL, NULL, NULL, NULL, DeviceExtension->AdapterInterfaceType, DeviceExtension->SystemIoBusNumber, - PciSlotNumber.u.AsULONG, &AllocatedResources); + PciSlotNumber.u.AsULONG, + &AllocatedResources); if (! NT_SUCCESS(Status)) { return Status; @@ -316,7 +351,7 @@ VideoPortGetAccessRanges(IN PVOID HwDeviceExtension, } else { - UNIMPLEMENTED + UNIMPLEMENTED } return STATUS_SUCCESS; @@ -596,11 +631,11 @@ VideoPortInitialize(IN PVOID Context1, ConfigInfo.InterruptMode = (PCIBus == DeviceExtension->AdapterInterfaceType) ? LevelSensitive : Latched; ConfigInfo.DriverRegistryPath = RegistryPath->Buffer; + ConfigInfo.VideoPortGetProcAddress = VideoPortGetProcAddress; /* Call HwFindAdapter entry point */ /* FIXME: Need to figure out what string to pass as param 3 */ - DPRINT("HwFindAdapter %X Context2 %X\n", - HwInitializationData->HwFindAdapter, Context2); + DPRINT("FindAdapter %X\n", HwInitializationData->HwFindAdapter); Status = HwInitializationData->HwFindAdapter(&DeviceExtension->MiniPortDeviceExtension, Context2, NULL, @@ -608,7 +643,7 @@ VideoPortInitialize(IN PVOID Context1, &Again); if (NO_ERROR != Status) { - DPRINT("HwFindAdapter call failed with error %d\n", Status); + DPRINT("HwFindAdapter call failed with error %X\n", Status); DeviceExtension->SystemIoBusNumber++; } } @@ -875,8 +910,8 @@ VideoPortSetTrappedEmulatorPorts(IN PVOID HwDeviceExtension, IN PVIDEO_ACCESS_RANGE AccessRange) { DPRINT("VideoPortSetTrappedEmulatorPorts\n"); - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + /* Should store the ranges in the device extension for use by ntvdm. */ + return STATUS_SUCCESS; } @@ -1672,3 +1707,76 @@ VideoPortRegisterBugcheckCallback ( IN PVOID HwDeviceExtension, DPRINT1("VideoPortRegisterBugcheckCallback(): Unimplemented.\n"); return STATUS_UNSUCCESSFUL; } + +PVOID +STDCALL +VideoPortImageDirectoryEntryToData ( PVOID BaseAddress, + ULONG Directory ) +{ + 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; + + return (PVOID)(BaseAddress + Va); +} + +PVOID STDCALL +VideoPortGetProcAddress(IN PVOID HwDeviceExtension, + IN PUCHAR FunctionName) +{ + SYSTEM_LOAD_IMAGE GdiDriverInfo; + PVOID BaseAddress; + PIMAGE_EXPORT_DIRECTORY ExportDir; + PUSHORT OrdinalPtr; + PULONG NamePtr; + PULONG AddressPtr; + ULONG i = 0; + NTSTATUS Status; + + DPRINT("VideoPortGetProcAddress(%s)\n", FunctionName); + + RtlInitUnicodeString(&GdiDriverInfo.ModuleName, L"videoprt"); + Status = ZwSetSystemInformation(SystemLoadImage, &GdiDriverInfo, + sizeof(SYSTEM_LOAD_IMAGE)); + if (!NT_SUCCESS(Status)) + { + DPRINT("Couldn't get our own module handle?\n"); + return NULL; + } + + BaseAddress = GdiDriverInfo.ModuleBase; + + /* Get the pointer to the export directory */ + ExportDir = (PIMAGE_EXPORT_DIRECTORY) + VideoPortImageDirectoryEntryToData (BaseAddress, + IMAGE_DIRECTORY_ENTRY_EXPORT); + + /* search by name */ + AddressPtr = (PULONG) + ((ULONG_PTR)BaseAddress + (ULONG_PTR)ExportDir->AddressOfFunctions); + OrdinalPtr = (PUSHORT) + ((ULONG_PTR)BaseAddress + (ULONG_PTR)ExportDir->AddressOfNameOrdinals); + NamePtr = (PULONG) + ((ULONG_PTR)BaseAddress + (ULONG_PTR)ExportDir->AddressOfNames); + for (i = 0; i < ExportDir->NumberOfNames; i++, NamePtr++, OrdinalPtr++) + { + if (!_strnicmp(FunctionName, (char*)(BaseAddress + *NamePtr), + strlen(FunctionName))) + { + return (PVOID)((ULONG_PTR)BaseAddress + + (ULONG_PTR)AddressPtr[*OrdinalPtr]); + } + } + DPRINT("VideoPortGetProcAddress: Can't resolve symbol %s\n", FunctionName); + return(NULL); +} diff --git a/reactos/drivers/video/videoprt/videoprt.def b/reactos/drivers/video/videoprt/videoprt.def index f0aaeb090f5..6812d2bf548 100644 --- a/reactos/drivers/video/videoprt/videoprt.def +++ b/reactos/drivers/video/videoprt/videoprt.def @@ -1,4 +1,4 @@ -; $Id: videoprt.def,v 1.5 2004/03/06 22:25:22 dwelch Exp $ +; $Id: videoprt.def,v 1.6 2004/03/07 04:43:55 dwelch Exp $ ; ; vidport.def - export definition file for ReactOS ; @@ -6,6 +6,7 @@ EXPORTS ReturnCsrssAddress VideoPortAllocateBuffer@12 VideoPortAllocateCommonBuffer@24 +VideoPortCheckForDeviceExistence@28 VideoPortClearEvent@8 VideoPortCompareMemory@12 VideoPortCreateEvent@16 diff --git a/reactos/drivers/video/videoprt/videoprt.edf b/reactos/drivers/video/videoprt/videoprt.edf index b881aa281c0..d9c7977ea5b 100644 --- a/reactos/drivers/video/videoprt/videoprt.edf +++ b/reactos/drivers/video/videoprt/videoprt.edf @@ -1,4 +1,4 @@ -; $Id: videoprt.edf,v 1.5 2004/03/06 22:25:22 dwelch Exp $ +; $Id: videoprt.edf,v 1.6 2004/03/07 04:43:55 dwelch Exp $ ; ; vidport.def - export definition file for ReactOS ; @@ -6,6 +6,7 @@ EXPORTS VideoPortAllocateBuffer=VideoPortAllocateBuffer@12 VideoPortAllocateCommonBuffer=VideoPortAllocateCommonBuffer@24 VideoPortAllocatePool=VideoPortAllocatePool@16 +VideoPortCheckForDeviceExistence=VideoPortCheckForDeviceExistence@28 VideoPortCompareMemory=NTOSKRNL.RtlCompareMemory VideoPortClearEvent=VideoPortClearEvent@8 VideoPortCreateEvent=VideoPortCreateEvent@16 diff --git a/reactos/drivers/video/videoprt/videoprt.h b/reactos/drivers/video/videoprt/videoprt.h index b4e11553b06..5b581cb0acd 100644 --- a/reactos/drivers/video/videoprt/videoprt.h +++ b/reactos/drivers/video/videoprt/videoprt.h @@ -18,7 +18,7 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: videoprt.h,v 1.3 2004/03/06 22:25:22 dwelch Exp $ + * $Id: videoprt.h,v 1.4 2004/03/07 04:43:55 dwelch Exp $ */ #ifndef VIDEOPRT_H @@ -28,7 +28,7 @@ #include <ddk/video.h> #include <ddk/ntddvdeo.h> #include "internal/ps.h" -/*#define NDEBUG*/ +#define NDEBUG #include <debug.h> /* From 4a88989b856452825841d3a14fd09e01a6275e0d Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Sun, 7 Mar 2004 04:44:41 +0000 Subject: [PATCH 0349/1463] - Added an implementation of LdrFindImageProcAddress. svn path=/trunk/; revision=8561 --- reactos/subsys/win32k/ldr/loader.c | 22 +++++++++++++++++++++- reactos/subsys/win32k/stubs/stubs.c | 15 --------------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/reactos/subsys/win32k/ldr/loader.c b/reactos/subsys/win32k/ldr/loader.c index 2fd0973ec29..8e2fe162268 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.13 2003/11/24 14:19:52 gvg Exp $ +/* $Id: loader.c,v 1.14 2004/03/07 04:44:41 dwelch Exp $ * */ @@ -90,6 +90,26 @@ LdrGetProcedureAddress (IN PVOID BaseAddress, return STATUS_PROCEDURE_NOT_FOUND; } +PVOID STDCALL +EngFindImageProcAddress(IN HANDLE Module, + IN LPSTR ProcName) +{ + PVOID Function; + NTSTATUS Status; + ANSI_STRING ProcNameString; + RtlInitAnsiString(&ProcNameString, ProcName); + Status = LdrGetProcedureAddress(Module, + &ProcNameString, + 0, + &Function); + if (!NT_SUCCESS(Status)) + { + return(NULL); + } + return(Function); +} + + /* * @implemented */ diff --git a/reactos/subsys/win32k/stubs/stubs.c b/reactos/subsys/win32k/stubs/stubs.c index 5d417d2f1c0..f8be6b7bc4c 100644 --- a/reactos/subsys/win32k/stubs/stubs.c +++ b/reactos/subsys/win32k/stubs/stubs.c @@ -257,21 +257,6 @@ EngFillPath ( return FALSE; } -/* - * @unimplemented - */ -PVOID -STDCALL -EngFindImageProcAddress( - IN HANDLE hModule, - IN LPSTR lpProcName - ) -{ - // www.osr.com/ddk/graphics/gdifncs_0oiw.htm - UNIMPLEMENTED; - return NULL; -} - /* * @unimplemented */ From fceb231b0e419fcaf8ba880a7ea6a91d6a8702b3 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 7 Mar 2004 11:59:10 +0000 Subject: [PATCH 0350/1463] - Fixed RtlFormatCurrentUserKeyPath and it's use. - Fill correctly all members of the returned device object in IoCreateDevice. - Don't bug check in loader when export isn't found, only report it and don't load the module. - If we know a module path while loading, use it for searching for the import modules. - Modified LdrpBuildModuleBaseName to not strip the extension from file name, because the files 's3legacy.dll' and 's3legacy.sys' are otherwise treated as the same files and wrong module is loaded. svn path=/trunk/; revision=8562 --- reactos/ntoskrnl/cm/rtlfunc.c | 5 +-- reactos/ntoskrnl/io/device.c | 7 +++- reactos/ntoskrnl/ldr/loader.c | 66 ++++++++++++++++++++--------------- 3 files changed, 46 insertions(+), 32 deletions(-) diff --git a/reactos/ntoskrnl/cm/rtlfunc.c b/reactos/ntoskrnl/cm/rtlfunc.c index 6b2adedcc00..ae19f6fd4ee 100644 --- a/reactos/ntoskrnl/cm/rtlfunc.c +++ b/reactos/ntoskrnl/cm/rtlfunc.c @@ -83,6 +83,7 @@ RtlpGetRegistryHandle(ULONG RelativeTo, Status = RtlFormatCurrentUserKeyPath(&KeyName); if (!NT_SUCCESS(Status)) return(Status); + RtlAppendUnicodeToString(&KeyName, L"\\"); break; /* ReactOS specific */ @@ -212,8 +213,8 @@ NTSTATUS STDCALL RtlFormatCurrentUserKeyPath(IN OUT PUNICODE_STRING KeyPath) { /* FIXME: !!! */ - RtlCreateUnicodeString(KeyPath, - L"\\Registry\\User\\.Default"); + KeyPath->Length = 0; + RtlAppendUnicodeToString(KeyPath, L"\\Registry\\User\\.Default"); return(STATUS_SUCCESS); } diff --git a/reactos/ntoskrnl/io/device.c b/reactos/ntoskrnl/io/device.c index 21832420907..a8509e5b7cd 100644 --- a/reactos/ntoskrnl/io/device.c +++ b/reactos/ntoskrnl/io/device.c @@ -1,4 +1,4 @@ -/* $Id: device.c,v 1.65 2003/12/15 17:50:23 ekohl Exp $ +/* $Id: device.c,v 1.66 2004/03/07 11:59:10 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -717,10 +717,15 @@ IoCreateDevice(PDRIVER_OBJECT DriverObject, DeviceExtensionSize); } + CreatedDeviceObject->Size = sizeof(DEVICE_OBJECT) + DeviceExtensionSize; + CreatedDeviceObject->ReferenceCount = 1; CreatedDeviceObject->AttachedDevice = NULL; CreatedDeviceObject->DeviceType = DeviceType; CreatedDeviceObject->StackSize = 1; CreatedDeviceObject->AlignmentRequirement = 1; + CreatedDeviceObject->Characteristics = DeviceCharacteristics; + CreatedDeviceObject->Timer = NULL; + CreatedDeviceObject->Vpb = NULL; KeInitializeDeviceQueue(&CreatedDeviceObject->DeviceQueue); KeInitializeEvent(&CreatedDeviceObject->DeviceLock, diff --git a/reactos/ntoskrnl/ldr/loader.c b/reactos/ntoskrnl/ldr/loader.c index a51b6226b2b..b6b38ca5eb5 100644 --- a/reactos/ntoskrnl/ldr/loader.c +++ b/reactos/ntoskrnl/ldr/loader.c @@ -1,4 +1,4 @@ -/* $Id: loader.c,v 1.139 2004/01/05 14:28:21 weiden Exp $ +/* $Id: loader.c,v 1.140 2004/03/07 11:59:10 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -401,7 +401,7 @@ LdrLoadModule(PUNICODE_STRING Filename, &Module); if (!NT_SUCCESS(Status)) { - CPRINT("Could not process module"); + CPRINT("Could not process module\n"); ExFreePool(ModuleLoadBase); return(Status); } @@ -672,9 +672,7 @@ static VOID LdrpBuildModuleBaseName(PUNICODE_STRING BaseName, PUNICODE_STRING FullName) { - UNICODE_STRING Name; PWCHAR p; - PWCHAR q; DPRINT("LdrpBuildModuleBaseName()\n"); DPRINT("FullName %wZ\n", FullName); @@ -691,18 +689,7 @@ LdrpBuildModuleBaseName(PUNICODE_STRING BaseName, DPRINT("p %S\n", p); - RtlCreateUnicodeString(&Name, p); - - q = wcschr(Name.Buffer, L'.'); - if (q != NULL) - { - *q = (WCHAR)0; - } - - DPRINT("p %S\n", p); - - RtlCreateUnicodeString(BaseName, Name.Buffer); - RtlFreeUnicodeString(&Name); + RtlCreateUnicodeString(BaseName, p); } @@ -873,7 +860,7 @@ LdrPEProcessModule(PVOID ModuleLoadBase, WORD Hint; UNICODE_STRING ModuleName; UNICODE_STRING NameString; - WCHAR NameBuffer[60]; + WCHAR NameBuffer[PATH_MAX]; MODULE_TEXT_SECTION* ModuleTextSection; NTSTATUS Status; KIRQL Irql; @@ -938,12 +925,7 @@ LdrPEProcessModule(PVOID ModuleLoadBase, CPRINT("Failed to allocate a virtual section for driver\n"); return STATUS_UNSUCCESSFUL; } -#if 0 DbgPrint("DriverBase for %wZ: %x\n", FileName, DriverBase); -#else - DbgPrint("DriverBase for %wZ", FileName); - DbgPrint(": %x\n", DriverBase); -#endif CHECKPOINT; /* Copy headers over */ memcpy(DriverBase, ModuleLoadBase, PEOptionalHeader->SizeOfHeaders); @@ -1076,11 +1058,34 @@ LdrPEProcessModule(PVOID ModuleLoadBase, LibraryModuleObject = LdrGetModuleObject(&ModuleName); if (LibraryModuleObject == NULL) { - DPRINT("Module '%wZ' not loaded yet\n", &ModuleName); - wcscpy(NameBuffer, L"\\SystemRoot\\system32\\drivers\\"); - wcscat(NameBuffer, ModuleName.Buffer); - RtlInitUnicodeString(&NameString, NameBuffer); - Status = LdrLoadModule(&NameString, &LibraryModuleObject); + PWCHAR PathEnd; + ULONG PathLength; + + PathEnd = wcsrchr(FileName->Buffer, L'\\'); + if (PathEnd != NULL) + { + PathLength = (PathEnd - FileName->Buffer + 1) * sizeof(WCHAR); + RtlCopyMemory( + NameBuffer, + FileName->Buffer, + PathLength); + RtlCopyMemory( + NameBuffer + (PathLength / sizeof(WCHAR)), + ModuleName.Buffer, + ModuleName.Length); + NameString.Buffer = NameBuffer; + NameString.MaximumLength = + NameString.Length = PathLength + ModuleName.Length; + Status = LdrLoadModule(&NameString, &LibraryModuleObject); + } + else + { + DPRINT("Module '%wZ' not loaded yet\n", &ModuleName); + wcscpy(NameBuffer, L"\\SystemRoot\\system32\\drivers\\"); + wcscat(NameBuffer, ModuleName.Buffer); + RtlInitUnicodeString(&NameString, NameBuffer); + Status = LdrLoadModule(&NameString, &LibraryModuleObject); + } if (!NT_SUCCESS(Status)) { wcscpy(NameBuffer, L"\\SystemRoot\\system32\\"); @@ -1133,11 +1138,15 @@ LdrPEProcessModule(PVOID ModuleLoadBase, *ImportAddressList = LdrGetExportAddress(LibraryModuleObject, pName, Hint); + if (*ImportAddressList == NULL) + { + return STATUS_PROCEDURE_NOT_FOUND; + } } else { CPRINT("Unresolved kernel symbol: %s\n", pName); - return STATUS_UNSUCCESSFUL; + return STATUS_PROCEDURE_NOT_FOUND; } ImportAddressList++; FunctionNameList++; @@ -1565,7 +1574,6 @@ LdrPEGetExportAddress(PMODULE_OBJECT ModuleObject, DbgPrint("Export not found for %d:%s\n", Hint, Name != NULL ? Name : "(Ordinal)"); - KEBUGCHECK(0); } return(ExportAddress); From 5c13959830460efaa483a13031595431aff2a757 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 7 Mar 2004 11:59:43 +0000 Subject: [PATCH 0351/1463] - Moved the loading of font names from user32.dll to win32k.sys. - Moved the window metrics values from hivesys.inf to hivedef.inf. - In case of failure of getting the font values from registry, use default values. - Removed user32.dll dependency on advapi32.dll. - Removed the "UGLY HACK" code, because it really isn't true that ReactOS doesn't handle fonts with negative height. svn path=/trunk/; revision=8563 --- reactos/bootdata/hivedef.inf | 27 ++++++++++ reactos/bootdata/hivesys.inf | 28 ---------- reactos/lib/user32/Makefile | 4 +- reactos/lib/user32/misc/desktop.c | 78 +--------------------------- reactos/subsys/win32k/ntuser/misc.c | 80 ++++++++++++++++++++++++++++- 5 files changed, 110 insertions(+), 107 deletions(-) diff --git a/reactos/bootdata/hivedef.inf b/reactos/bootdata/hivedef.inf index f7df7f7cfcc..cf6dd3ce7c6 100644 --- a/reactos/bootdata/hivedef.inf +++ b/reactos/bootdata/hivedef.inf @@ -64,4 +64,31 @@ HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WINXP", HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WINXP","BuildNumber",0x00010001,0x00000A28 HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WINXP","PlatformId",0x00010001,0x00000002 +; GUI Setup + +HKCU, "Control Panel\Desktop\WindowMetrics","CaptionFont",0x00000001,f5,ff,ff,ff,00,00,00,\ +00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,42,00,69,00,74,00,73,00,74,\ +00,72,00,65,00,61,00,6d,00,20,00,56,00,65,00,72,00,61,00,20,00,53,00,61,00,6e,00,73,00,00,\ +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 +HKCU, "Control Panel\Desktop\WindowMetrics","IconFont",0x00000001,f5,ff,ff,ff,00,00,00,00,\ +00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,42,00,69,00,74,00,73,00,74,00,\ +72,00,65,00,61,00,6d,00,20,00,56,00,65,00,72,00,61,00,20,00,53,00,61,00,6e,00,73,00,00,00,\ +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 +HKCU, "Control Panel\Desktop\WindowMetrics","MenuFont",0x00000001,f5,ff,ff,ff,00,00,00,00,\ +00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,42,00,69,00,74,00,73,00,74,00,\ +72,00,65,00,61,00,6d,00,20,00,56,00,65,00,72,00,61,00,20,00,53,00,61,00,6e,00,73,00,00,00,\ +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 +HKCU, "Control Panel\Desktop\WindowMetrics","MessageFont",0x00000001,f5,ff,ff,ff,00,00,00,\ +00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,42,00,69,00,74,00,73,00,74,\ +00,72,00,65,00,61,00,6d,00,20,00,56,00,65,00,72,00,61,00,20,00,53,00,61,00,6e,00,73,00,00,\ +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 +HKCU, "Control Panel\Desktop\WindowMetrics","SmCaptionFont",0x00000001,f5,ff,ff,ff,00,00,\ +00,00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,42,00,69,00,74,00,73,00,\ +74,00,72,00,65,00,61,00,6d,00,20,00,56,00,65,00,72,00,61,00,20,00,53,00,61,00,6e,00,73,00,\ +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 +HKCU, "Control Panel\Desktop\WindowMetrics","IconFont",0x00000001,f5,ff,ff,ff,00,00,00,00,\ +00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,42,00,69,00,74,00,73,00,74,00,\ +72,00,65,00,61,00,6d,00,20,00,56,00,65,00,72,00,61,00,20,00,53,00,61,00,6e,00,73,00,00,00,\ +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 + ; EOF diff --git a/reactos/bootdata/hivesys.inf b/reactos/bootdata/hivesys.inf index 10b8009b39f..9912e56e5d6 100644 --- a/reactos/bootdata/hivesys.inf +++ b/reactos/bootdata/hivesys.inf @@ -555,34 +555,6 @@ HKLM,"SYSTEM\Setup","SetupType",0x00010001,0x00000000 HKLM,"SYSTEM\Setup","SystemPartition",0x00000000,"\Device\Harddisk0\Partition1" HKLM,"SYSTEM\Setup","SystemSetupInProgress",0x00010001,0x00000000 -; GUI Setup - -HKCU, "Control Panel\Desktop\WindowMetrics","CaptionFont",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,42,00,69,00,74,00,73,00,74,\ -00,72,00,65,00,61,00,6d,00,20,00,56,00,65,00,72,00,61,00,20,00,53,00,61,00,6e,00,73,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU, "Control Panel\Desktop\WindowMetrics","IconFont",0x00000001,f5,ff,ff,ff,00,00,00,00,\ -00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,42,00,69,00,74,00,73,00,74,00,\ -72,00,65,00,61,00,6d,00,20,00,56,00,65,00,72,00,61,00,20,00,53,00,61,00,6e,00,73,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU, "Control Panel\Desktop\WindowMetrics","MenuFont",0x00000001,f5,ff,ff,ff,00,00,00,00,\ -00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,42,00,69,00,74,00,73,00,74,00,\ -72,00,65,00,61,00,6d,00,20,00,56,00,65,00,72,00,61,00,20,00,53,00,61,00,6e,00,73,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU, "Control Panel\Desktop\WindowMetrics","MessageFont",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,42,00,69,00,74,00,73,00,74,\ -00,72,00,65,00,61,00,6d,00,20,00,56,00,65,00,72,00,61,00,20,00,53,00,61,00,6e,00,73,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU, "Control Panel\Desktop\WindowMetrics","SmCaptionFont",0x00000001,f5,ff,ff,ff,00,00,\ -00,00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,42,00,69,00,74,00,73,00,\ -74,00,72,00,65,00,61,00,6d,00,20,00,56,00,65,00,72,00,61,00,20,00,53,00,61,00,6e,00,73,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU, "Control Panel\Desktop\WindowMetrics","IconFont",0x00000001,f5,ff,ff,ff,00,00,00,00,\ -00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,42,00,69,00,74,00,73,00,74,00,\ -72,00,65,00,61,00,6d,00,20,00,56,00,65,00,72,00,61,00,20,00,53,00,61,00,6e,00,73,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 - - ; ----------------------------- KJS Init ---------------------------- HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","kjsinit",0x00010000,\ "function init(v) { var rk = '\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Kdb'; eval(System.regread(rk,v)); } for( i = 1; i <= 40; i++ ) { init((new Number(i)).toString()); }" diff --git a/reactos/lib/user32/Makefile b/reactos/lib/user32/Makefile index 3a19ccb6c3f..89d361c97a1 100644 --- a/reactos/lib/user32/Makefile +++ b/reactos/lib/user32/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.35 2004/02/16 01:30:38 rcampbell Exp $ +# $Id: Makefile,v 1.36 2004/03/07 11:59:43 navaraf Exp $ PATH_TO_TOP = ../.. @@ -8,7 +8,7 @@ TARGET_NAME = user32 TARGET_BASE = 0x77e70000 -TARGET_SDKLIBS = libwine.a ntdll.a kernel32.a gdi32.a rosrtl.a advapi32.a +TARGET_SDKLIBS = libwine.a ntdll.a kernel32.a gdi32.a rosrtl.a TARGET_CFLAGS = \ -I./include \ diff --git a/reactos/lib/user32/misc/desktop.c b/reactos/lib/user32/misc/desktop.c index 5c5f753b319..51915bdc1ae 100644 --- a/reactos/lib/user32/misc/desktop.c +++ b/reactos/lib/user32/misc/desktop.c @@ -1,4 +1,4 @@ -/* $Id: desktop.c,v 1.30 2004/02/28 03:02:08 rcampbell Exp $ +/* $Id: desktop.c,v 1.31 2004/03/07 11:59:43 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -89,28 +89,6 @@ SystemParametersInfoA(UINT uiAction, } -BOOL IntGetFontMetricSetting(LPCWSTR lpKey, PLOGFONTW font) -{ - HKEY hKey; - DWORD dwType = REG_BINARY; - DWORD dwSize = sizeof(LOGFONTW); - BOOL bRet = FALSE; - if ( RegOpenKeyExW(HKEY_CURRENT_USER, L"Control Panel\\Desktop\\WindowMetrics", 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS ) - { - if ( RegQueryValueExW(hKey, lpKey, NULL, &dwType, (LPBYTE)font, &dwSize) == ERROR_SUCCESS ) - bRet = TRUE; - - if (font->lfHeight < 0) - { - DbgPrint("WARNING! WARNING! WARNING! Ugly hack alert: ROS doesn't handle pixel sizes for fonts correctly. As a result we must convert to point sizes.\n"); - font->lfHeight = abs(font->lfHeight); - } - } - - RegCloseKey(hKey); - return bRet; -} - /* * @implemented */ @@ -120,59 +98,7 @@ SystemParametersInfoW(UINT uiAction, PVOID pvParam, UINT fWinIni) { - static LOGFONTW IconFont; - static NONCLIENTMETRICSW pMetrics; - static BOOL bInitialized = FALSE; - - if (!bInitialized) - { - ZeroMemory(&IconFont, sizeof(LOGFONTW)); - ZeroMemory(&pMetrics, sizeof(NONCLIENTMETRICSW)); - - IntGetFontMetricSetting(L"CaptionFont", &pMetrics.lfCaptionFont); - IntGetFontMetricSetting(L"SmCaptionFont", &pMetrics.lfSmCaptionFont); - IntGetFontMetricSetting(L"MenuFont", &pMetrics.lfMenuFont); - IntGetFontMetricSetting(L"StatusFont", &pMetrics.lfStatusFont); - IntGetFontMetricSetting(L"MessageFont", &pMetrics.lfMessageFont); - IntGetFontMetricSetting(L"IconFont", &IconFont); - - pMetrics.iBorderWidth = 1; - pMetrics.iScrollWidth = NtUserGetSystemMetrics(SM_CXVSCROLL); - pMetrics.iScrollHeight = NtUserGetSystemMetrics(SM_CYHSCROLL); - pMetrics.iCaptionWidth = NtUserGetSystemMetrics(SM_CXSIZE); - pMetrics.iCaptionHeight = NtUserGetSystemMetrics(SM_CYSIZE); - pMetrics.iSmCaptionWidth = NtUserGetSystemMetrics(SM_CXSMSIZE); - pMetrics.iSmCaptionHeight = NtUserGetSystemMetrics(SM_CYSMSIZE); - pMetrics.iMenuWidth = NtUserGetSystemMetrics(SM_CXMENUSIZE); - pMetrics.iMenuHeight = NtUserGetSystemMetrics(SM_CYMENUSIZE); - pMetrics.cbSize = sizeof(LPNONCLIENTMETRICSW); - - bInitialized = TRUE; - } - switch(uiAction) - { - - case SPI_GETICONTITLELOGFONT: - { - memcpy(pvParam, (PVOID)&IconFont, sizeof(LOGFONTW)); - return TRUE; - } - case SPI_GETNONCLIENTMETRICS: - { - /* FIXME: Is this windows default behavior? */ - LPNONCLIENTMETRICSW lpMetrics = (LPNONCLIENTMETRICSW)pvParam; - if ( lpMetrics->cbSize != sizeof(NONCLIENTMETRICSW) || - uiParam != sizeof(NONCLIENTMETRICSW )) - { - return FALSE; - } - DbgPrint("FontName: %S, Size: %i\n",pMetrics.lfMessageFont.lfFaceName, pMetrics.lfMessageFont.lfHeight); - memcpy(pvParam, (PVOID)&pMetrics, sizeof(NONCLIENTMETRICSW)); - return TRUE; - } - default: - return NtUserSystemParametersInfo(uiAction, uiParam, pvParam, fWinIni); - } + return NtUserSystemParametersInfo(uiAction, uiParam, pvParam, fWinIni); } diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index 81ef4209fa6..e718e99e698 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.53 2004/02/19 21:12:09 weiden Exp $ +/* $Id: misc.c,v 1.54 2004/03/07 11:59:43 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -442,6 +442,36 @@ NtUserGetThreadState( return 0; } +VOID FASTCALL +IntGetFontMetricSetting(LPWSTR lpValueName, PLOGFONTW font) +{ + RTL_QUERY_REGISTRY_TABLE QueryTable[2]; + NTSTATUS Status; + static LOGFONTW DefaultFont = { + 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, + 0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, + L"Bitstream Vera Sans" + }; + + RtlZeroMemory(&QueryTable, sizeof(QueryTable)); + + QueryTable[0].Name = lpValueName; + QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; + QueryTable[0].EntryContext = font; + + Status = RtlQueryRegistryValues( + RTL_REGISTRY_USER, + L"Control Panel\\Desktop\\WindowMetrics", + QueryTable, + NULL, + NULL); + + if (!NT_SUCCESS(Status)) + { + RtlCopyMemory(font, &DefaultFont, sizeof(LOGFONTW)); + } +} + /* * @implemented */ @@ -456,7 +486,37 @@ NtUserSystemParametersInfo( static BOOL GradientCaptions = TRUE; NTSTATUS Status; PWINSTATION_OBJECT WinStaObject; + + static BOOL bInitialized = FALSE; + static LOGFONTW IconFont; + static NONCLIENTMETRICSW pMetrics; + if (!bInitialized) + { + ZeroMemory(&IconFont, sizeof(LOGFONTW)); + ZeroMemory(&pMetrics, sizeof(NONCLIENTMETRICSW)); + + IntGetFontMetricSetting(L"CaptionFont", &pMetrics.lfCaptionFont); + IntGetFontMetricSetting(L"SmCaptionFont", &pMetrics.lfSmCaptionFont); + IntGetFontMetricSetting(L"MenuFont", &pMetrics.lfMenuFont); + IntGetFontMetricSetting(L"StatusFont", &pMetrics.lfStatusFont); + IntGetFontMetricSetting(L"MessageFont", &pMetrics.lfMessageFont); + IntGetFontMetricSetting(L"IconFont", &IconFont); + + pMetrics.iBorderWidth = 1; + pMetrics.iScrollWidth = NtUserGetSystemMetrics(SM_CXVSCROLL); + pMetrics.iScrollHeight = NtUserGetSystemMetrics(SM_CYHSCROLL); + pMetrics.iCaptionWidth = NtUserGetSystemMetrics(SM_CXSIZE); + pMetrics.iCaptionHeight = NtUserGetSystemMetrics(SM_CYSIZE); + pMetrics.iSmCaptionWidth = NtUserGetSystemMetrics(SM_CXSMSIZE); + pMetrics.iSmCaptionHeight = NtUserGetSystemMetrics(SM_CYSMSIZE); + pMetrics.iMenuWidth = NtUserGetSystemMetrics(SM_CXMENUSIZE); + pMetrics.iMenuHeight = NtUserGetSystemMetrics(SM_CYMENUSIZE); + pMetrics.cbSize = sizeof(LPNONCLIENTMETRICSW); + + bInitialized = TRUE; + } + switch(uiAction) { case SPI_SETDOUBLECLKWIDTH: @@ -594,6 +654,24 @@ NtUserSystemParametersInfo( } return TRUE; } + case SPI_GETICONTITLELOGFONT: + { + MmCopyToCaller(pvParam, (PVOID)&IconFont, sizeof(LOGFONTW)); + return TRUE; + } + case SPI_GETNONCLIENTMETRICS: + { + /* FIXME: Is this windows default behavior? */ + LPNONCLIENTMETRICSW lpMetrics = (LPNONCLIENTMETRICSW)pvParam; + if ( lpMetrics->cbSize != sizeof(NONCLIENTMETRICSW) || + uiParam != sizeof(NONCLIENTMETRICSW )) + { + return FALSE; + } + DPRINT("FontName: %S, Size: %i\n",pMetrics.lfMessageFont.lfFaceName, pMetrics.lfMessageFont.lfHeight); + MmCopyToCaller(pvParam, (PVOID)&pMetrics, sizeof(NONCLIENTMETRICSW)); + return TRUE; + } } return FALSE; } From 27ea3725e5acd2a1c8dc33d20987810b7d53c483 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Sun, 7 Mar 2004 12:42:10 +0000 Subject: [PATCH 0352/1463] - .cvsignore update. svn path=/trunk/; revision=8564 --- reactos/tools/bin2res/.cvsignore | 1 + reactos/tools/wine2ros/.cvsignore | 1 + 2 files changed, 2 insertions(+) diff --git a/reactos/tools/bin2res/.cvsignore b/reactos/tools/bin2res/.cvsignore index d63774a7353..10a92e98653 100644 --- a/reactos/tools/bin2res/.cvsignore +++ b/reactos/tools/bin2res/.cvsignore @@ -4,3 +4,4 @@ *.coff *.sym *.map +bin2res diff --git a/reactos/tools/wine2ros/.cvsignore b/reactos/tools/wine2ros/.cvsignore index 8331c0f8277..efc670360c1 100644 --- a/reactos/tools/wine2ros/.cvsignore +++ b/reactos/tools/wine2ros/.cvsignore @@ -6,3 +6,4 @@ *.sym *.map *.tmp +wine2ros From bd277c512bb4ebac6ad73cfb9eba366281dbcab6 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Sun, 7 Mar 2004 12:49:27 +0000 Subject: [PATCH 0353/1463] - Added stubs for EngAlphaBlend and EngControlSprites. svn path=/trunk/; revision=8565 --- reactos/subsys/win32k/stubs/xpstubs.c | 25 +++++++++++++++++++++++++ reactos/subsys/win32k/win32k.def | 4 +++- reactos/subsys/win32k/win32k.edf | 4 +++- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/stubs/xpstubs.c b/reactos/subsys/win32k/stubs/xpstubs.c index 32117c9c22f..07f7d318246 100644 --- a/reactos/subsys/win32k/stubs/xpstubs.c +++ b/reactos/subsys/win32k/stubs/xpstubs.c @@ -17,6 +17,31 @@ typedef PVOID EVENT, *PEVENT; +BOOL +STDCALL +EngAlphaBlend( + IN SURFOBJ *psoDest, + IN SURFOBJ *psoSrc, + IN CLIPOBJ *pco, + IN XLATEOBJ *pxlo, + IN RECTL *prclDest, + IN RECTL *prclSrc, + IN BLENDOBJ *pBlendObj) +{ + UNIMPLEMENTED; + return FALSE; +} + +BOOL +STDCALL +EngControlSprites( + IN WNDOBJ *pwo, + IN FLONG fl) +{ + UNIMPLEMENTED; + return FALSE; +} + BOOL STDCALL EngCreateEvent ( OUT PEVENT *ppEvent ) diff --git a/reactos/subsys/win32k/win32k.def b/reactos/subsys/win32k/win32k.def index 98eb30c5812..0780e196a44 100644 --- a/reactos/subsys/win32k/win32k.def +++ b/reactos/subsys/win32k/win32k.def @@ -1,4 +1,4 @@ -; $Id: win32k.def,v 1.25 2004/03/06 01:22:04 navaraf Exp $ +; $Id: win32k.def,v 1.26 2004/03/07 12:49:27 dwelch Exp $ ; ; win32k.def ; @@ -12,6 +12,7 @@ BRUSHOBJ_ulGetBrushColor@4 CLIPOBJ_bEnum@12 CLIPOBJ_cEnumStart@20 CLIPOBJ_ppoGetPath@4 +EngAlphaBlend@28 EngAcquireSemaphore@4 EngAllocMem@12 EngAllocUserMem@8 @@ -19,6 +20,7 @@ EngAssociateSurface@12 EngBitBlt@44 EngCheckAbort@4 EngComputeGlyphSet@12 +EngControlSprites@8 EngCopyBits@24 EngCreateBitmap@24 EngCreateClip@0 diff --git a/reactos/subsys/win32k/win32k.edf b/reactos/subsys/win32k/win32k.edf index eb50ffdf9e2..489b4e3cb3c 100644 --- a/reactos/subsys/win32k/win32k.edf +++ b/reactos/subsys/win32k/win32k.edf @@ -1,4 +1,4 @@ -; $Id: win32k.edf,v 1.21 2004/03/06 01:22:04 navaraf Exp $ +; $Id: win32k.edf,v 1.22 2004/03/07 12:49:27 dwelch Exp $ ; ; win32k.def ; @@ -15,10 +15,12 @@ CLIPOBJ_ppoGetPath=CLIPOBJ_ppoGetPath@4 EngAcquireSemaphore=EngAcquireSemaphore@4 EngAllocMem=EngAllocMem@12 EngAllocUserMem=EngAllocUserMem@8 +EngAlphaBlend=EngAlphaBlend@28 EngAssociateSurface=EngAssociateSurface@12 EngBitBlt=EngBitBlt@44 EngCheckAbort=EngCheckAbort@4 EngComputeGlyphSet=EngComputeGlyphSet@12 +EngControlSprites=EngControlSprites@8 EngCopyBits=EngCopyBits@24 EngCreateBitmap=EngCreateBitmap@24 EngCreateClip=EngCreateClip@0 From 39078ad02747d40757b51a57f4f3a7e8cede5a30 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 7 Mar 2004 14:33:13 +0000 Subject: [PATCH 0354/1463] - Correct base addresses. svn path=/trunk/; revision=8566 --- reactos/lib/netapi32/Makefile.ros-template | 4 ++-- reactos/lib/oleaut32/Makefile.ros-template | 4 ++-- reactos/lib/winmm/Makefile.ros-template | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/reactos/lib/netapi32/Makefile.ros-template b/reactos/lib/netapi32/Makefile.ros-template index 835e3fdbd29..e5f77377503 100644 --- a/reactos/lib/netapi32/Makefile.ros-template +++ b/reactos/lib/netapi32/Makefile.ros-template @@ -1,4 +1,4 @@ -# $Id: Makefile.ros-template,v 1.1 2004/02/10 16:57:23 sedwards Exp $ +# $Id: Makefile.ros-template,v 1.2 2004/03/07 14:33:13 navaraf Exp $ TARGET_NAME = netapi32 @@ -8,7 +8,7 @@ TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ TARGET_SDKLIBS = @IMPORTS@ libwine.a ntdll.a -TARGET_BASE = 0x76160000 +TARGET_BASE = 0x71C00000 TARGET_RC_SRCS = @RC_SRCS@ TARGET_RC_BINSRC = @RC_BINSRC@ diff --git a/reactos/lib/oleaut32/Makefile.ros-template b/reactos/lib/oleaut32/Makefile.ros-template index 98bd13dbc15..d1d72c52409 100644 --- a/reactos/lib/oleaut32/Makefile.ros-template +++ b/reactos/lib/oleaut32/Makefile.ros-template @@ -1,4 +1,4 @@ -# $Id: Makefile.ros-template,v 1.2 2004/02/29 14:48:12 mf Exp $ +# $Id: Makefile.ros-template,v 1.3 2004/03/07 14:33:13 navaraf Exp $ TARGET_NAME = oleaut32 @@ -8,7 +8,7 @@ TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ TARGET_SDKLIBS = @IMPORTS@ winmm.a libwine.a wine_uuid.a libwine_unicode.a ntdll.a -TARGET_BASE = 0x76160000 +TARGET_BASE = 0x76260000 TARGET_RC_SRCS = @RC_SRCS@ TARGET_RC_BINSRC = @RC_BINSRC@ diff --git a/reactos/lib/winmm/Makefile.ros-template b/reactos/lib/winmm/Makefile.ros-template index ef52169c385..ab57c63d688 100644 --- a/reactos/lib/winmm/Makefile.ros-template +++ b/reactos/lib/winmm/Makefile.ros-template @@ -1,4 +1,4 @@ -# $Id: Makefile.ros-template,v 1.1 2004/02/25 20:00:41 sedwards Exp $ +# $Id: Makefile.ros-template,v 1.2 2004/03/07 14:33:13 navaraf Exp $ TARGET_NAME = winmm @@ -8,7 +8,7 @@ TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ TARGET_SDKLIBS = @IMPORTS@ libwine.a wine_uuid.a ntdll.a -TARGET_BASE = 0x76160000 +TARGET_BASE = 0x777c0000 TARGET_RC_SRCS = @RC_SRCS@ TARGET_RC_BINSRC = @RC_BINSRC@ From 796f34f5ff99c3c11b14a54735a0140b191b4196 Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Sun, 7 Mar 2004 17:48:41 +0000 Subject: [PATCH 0355/1463] David Welch turned me on to the right way to solve the cygwin fork section map problem. This fixes map_dup_inherit. svn path=/trunk/; revision=8567 --- reactos/ntoskrnl/mm/anonmem.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/anonmem.c b/reactos/ntoskrnl/mm/anonmem.c index edb0990f8a4..d01162cd205 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.25 2004/03/05 11:31:59 hbirr Exp $ +/* $Id: anonmem.c,v 1.26 2004/03/07 17:48:41 arty Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/anonmem.c @@ -613,6 +613,19 @@ NtAllocateVirtualMemory(IN HANDLE ProcessHandle, DPRINT("NtAllocateVirtualMemory() = %x\n",Status); return(Status); } + else if (MemoryArea != NULL && MemoryArea->Length >= RegionSize) + { + Status = + MmAlterRegion(AddressSpace, + MemoryArea->BaseAddress, + &MemoryArea->Data.SectionData.RegionListHead, + BaseAddress, RegionSize, + Type, Protect, MmModifyAttributes); + MmUnlockAddressSpace(AddressSpace); + ObDereferenceObject(Process); + DPRINT("NtAllocateVirtualMemory() = %x\n",Status); + return(Status); + } else if (MemoryArea != NULL) { MmUnlockAddressSpace(AddressSpace); From ce4344ab2ca9ac403198e98764d88b17536fd695 Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Sun, 7 Mar 2004 18:06:29 +0000 Subject: [PATCH 0356/1463] Added waiting on console handles. We use a thread to poll for input availability. svn path=/trunk/; revision=8568 --- reactos/lib/kernel32/synch/wait.c | 83 +++++++++++++++++++++++++++---- 1 file changed, 72 insertions(+), 11 deletions(-) diff --git a/reactos/lib/kernel32/synch/wait.c b/reactos/lib/kernel32/synch/wait.c index 247bb02de97..7086470a466 100644 --- a/reactos/lib/kernel32/synch/wait.c +++ b/reactos/lib/kernel32/synch/wait.c @@ -1,4 +1,4 @@ -/* $Id: wait.c,v 1.27 2004/01/23 21:16:04 ekohl Exp $ +/* $Id: wait.c,v 1.28 2004/03/07 18:06:29 arty Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -19,6 +19,39 @@ /* FUNCTIONS ****************************************************************/ +/* + * Thread that waits for a console handle. Console handles only fire when + * they're readable. + */ + +DWORD STDCALL WaitForConsoleHandleThread( PVOID ConHandle ) { + DWORD AmtRead = 0; + INPUT_RECORD Buffer[1]; + do { + PeekConsoleInputA( ConHandle, Buffer, 1, &AmtRead ); + if( !AmtRead ) Sleep( 100 ); + } while( AmtRead == 0 ); + + return 0; +} + +/* + * Return a waitable object given a console handle + */ +DWORD GetWaiterForConsoleHandle( HANDLE ConHandle, PHANDLE Waitable ) { + DWORD ThreadId; + HANDLE WaitableHandle = CreateThread( 0, + 0, + WaitForConsoleHandleThread, + ConHandle, + 0, + &ThreadId ); + + *Waitable = WaitableHandle; + + return WaitableHandle ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL; +} + /* * @implemented */ @@ -43,6 +76,7 @@ WaitForSingleObjectEx(HANDLE hHandle, PLARGE_INTEGER TimePtr; LARGE_INTEGER Time; NTSTATUS Status; + BOOL CloseWaitHandle = FALSE; /* Get real handle */ switch ((ULONG)hHandle) @@ -65,9 +99,12 @@ WaitForSingleObjectEx(HANDLE hHandle, { if (VerifyConsoleIoHandle(hHandle)) { - DPRINT1("Console handles are not supported yet!\n"); - SetLastError(ERROR_INVALID_HANDLE); - return WAIT_FAILED; + Status = GetWaiterForConsoleHandle( hHandle, &hHandle ); + if (!NT_SUCCESS(Status)) + { + SetLastErrorByStatus (Status); + return FALSE; + } } } @@ -84,6 +121,10 @@ WaitForSingleObjectEx(HANDLE hHandle, Status = NtWaitForSingleObject(hHandle, (BOOLEAN) bAlertable, TimePtr); + + if (CloseWaitHandle) + NtClose(hHandle); + if (Status == STATUS_TIMEOUT) { return WAIT_TIMEOUT; @@ -130,12 +171,15 @@ WaitForMultipleObjectsEx(DWORD nCount, PLARGE_INTEGER TimePtr; LARGE_INTEGER Time; PHANDLE HandleBuffer; - DWORD i; + DWORD i,j; NTSTATUS Status; + PBOOL FreeThisHandle; DPRINT("nCount %lu\n", nCount); - HandleBuffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, nCount * sizeof(HANDLE)); + HandleBuffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, nCount * (sizeof(HANDLE) + sizeof(BOOL)) ); + FreeThisHandle = (PBOOL)(&HandleBuffer[nCount]); + if (HandleBuffer == NULL) { SetLastError(ERROR_NOT_ENOUGH_MEMORY); @@ -144,6 +188,7 @@ WaitForMultipleObjectsEx(DWORD nCount, for (i = 0; i < nCount; i++) { + FreeThisHandle[i] = FALSE; switch ((DWORD)lpHandles[i]) { case STD_INPUT_HANDLE: @@ -167,11 +212,23 @@ WaitForMultipleObjectsEx(DWORD nCount, if (IsConsoleHandle(HandleBuffer[i])) { if (VerifyConsoleIoHandle(HandleBuffer[i])) - { - DPRINT1("Console handles are not supported yet!\n"); - RtlFreeHeap(RtlGetProcessHeap(), 0, HandleBuffer); - SetLastError(ERROR_INVALID_HANDLE); - return FALSE; + { + Status = GetWaiterForConsoleHandle( HandleBuffer[i], + &HandleBuffer[i] ); + if (!NT_SUCCESS(Status)) + { + /* We'll leak some handles unless we close the already + created handles */ + for (j = 0; j < i; j++) + if (FreeThisHandle[j]) + NtClose(HandleBuffer[j]); + + SetLastErrorByStatus (Status); + RtlFreeHeap(GetProcessHeap(),0,HandleBuffer); + return FALSE; + } + + FreeThisHandle[i] = TRUE; } } } @@ -192,6 +249,10 @@ WaitForMultipleObjectsEx(DWORD nCount, (BOOLEAN)bAlertable, TimePtr); + for (i = 0; i < nCount; i++) + if (FreeThisHandle[i]) + NtClose(HandleBuffer[i]); + RtlFreeHeap(RtlGetProcessHeap(), 0, HandleBuffer); if (Status == STATUS_TIMEOUT) From ec2daabaf96ae8baa8a42acb5d23968afb38354a Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sun, 7 Mar 2004 19:48:45 +0000 Subject: [PATCH 0357/1463] - Changed the dma capability detection code. - Enabled DMA transfers by default. - Implemented DMA transfer for atapi devices (CD rom drives). svn path=/trunk/; revision=8569 --- reactos/drivers/storage/atapi/atapi.c | 174 +++++++++++++++++++++++--- 1 file changed, 160 insertions(+), 14 deletions(-) diff --git a/reactos/drivers/storage/atapi/atapi.c b/reactos/drivers/storage/atapi/atapi.c index 0248cf2dcfa..bef1f976b66 100644 --- a/reactos/drivers/storage/atapi/atapi.c +++ b/reactos/drivers/storage/atapi/atapi.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: atapi.c,v 1.47 2004/02/29 22:01:21 hbirr Exp $ +/* $Id: atapi.c,v 1.48 2004/03/07 19:48:45 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS ATAPI miniport driver @@ -44,7 +44,7 @@ #define ENABLE_PCI #define ENABLE_NATIVE_PCI #define ENABLE_ISA -//#define ENABLE_DMA +#define ENABLE_DMA // ------------------------------------------------------------------------- @@ -222,6 +222,9 @@ static BOOLEAN FASTCALL AtapiReadInterrupt(IN PATAPI_MINIPORT_EXTENSION DevExt); #ifdef ENABLE_DMA +static BOOLEAN FASTCALL +AtapiDmaPacketInterrupt(IN PATAPI_MINIPORT_EXTENSION DevExt); + static BOOLEAN FASTCALL AtapiDmaInterrupt(IN PATAPI_MINIPORT_EXTENSION DevExt); #endif @@ -493,10 +496,13 @@ AtapiClaimHwResources(PATAPI_MINIPORT_EXTENSION DevExt, // ConfigInfo->DmaChannel = SP_UNINITIALIZED_VALUE; // ConfigInfo->DmaPort = SP_UNINITIALIZED_VALUE; ConfigInfo->DmaWidth = Width32Bits; - ConfigInfo->DmaSpeed = Compatible; -// ConfigInfo->ScatterGather = TRUE; +// ConfigInfo->DmaSpeed = Compatible; + ConfigInfo->ScatterGather = TRUE; ConfigInfo->Master = TRUE; -// ConfigInfo->NumberOfPhysicalBreaks = + ConfigInfo->NumberOfPhysicalBreaks = 0x10000 / PAGE_SIZE + 1; + ConfigInfo->Dma32BitAddresses = TRUE; + ConfigInfo->NeedPhysicalAddresses = TRUE; + ConfigInfo->MapBuffers = TRUE; DevExt->PRDMaxCount = PAGE_SIZE / sizeof(PRD); DevExt->PRDTable = ScsiPortGetUncachedExtension(DevExt, ConfigInfo, sizeof(PRD) * DevExt->PRDMaxCount); @@ -1002,6 +1008,55 @@ AtapiInterrupt(IN PVOID DeviceExtension) // ---------------------------------------------------- Discardable statics +#ifdef ENABLE_DMA +static BOOLEAN +AtapiConfigDma(PATAPI_MINIPORT_EXTENSION DeviceExtension, ULONG UnitNumber) +{ + BOOLEAN Result = FALSE; + BYTE Status; + + if (UnitNumber < 2) + { + if (DeviceExtension->PRDTable) + { + if (DeviceExtension->DeviceParams[UnitNumber].Capabilities & IDE_DRID_DMA_SUPPORTED) + { + if ((DeviceExtension->DeviceParams[UnitNumber].TMFieldsValid & 0x0004) && + (DeviceExtension->DeviceParams[UnitNumber].UltraDmaModes & 0x7F00)) + { + Result = TRUE; + } + else if (DeviceExtension->DeviceParams[UnitNumber].TMFieldsValid & 0x0002) + { + if ((DeviceExtension->DeviceParams[UnitNumber].MultiDmaModes & 0x0404) == 0x0404) + { + Result = TRUE; + } +#if 0 + /* FIXME: + * should we support single mode dma ? + */ + else if ((DeviceExtension->DeviceParams[UnitNumber].DmaModes & 0x0404) == 0x0404) + { + Result = TRUE; + } +#endif + } + Status = IDEReadDMAStatus(DeviceExtension->BusMasterRegisterBase); + if (Result) + { + IDEWriteDMAStatus(DeviceExtension->BusMasterRegisterBase, Status | (UnitNumber ? 0x40 : 0x20)); + } + else + { + IDEWriteDMAStatus(DeviceExtension->BusMasterRegisterBase, Status & (UnitNumber ? ~0x40 : ~0x20)); + } + } + } + } + return Result; +} +#endif /********************************************************************** * NAME INTERNAL @@ -1111,6 +1166,12 @@ AtapiFindDevices(PATAPI_MINIPORT_EXTENSION DeviceExtension, DeviceExtension->DeviceFlags[UnitNumber] |= DEVICE_ATAPI; DeviceExtension->TransferSize[UnitNumber] = DeviceExtension->DeviceParams[UnitNumber].BytesPerSector; +#ifdef ENABLE_DMA + if (AtapiConfigDma(DeviceExtension, UnitNumber)) + { + DeviceExtension->DeviceFlags[UnitNumber] |= DEVICE_DMA_CMD; + } +#endif DeviceFound = TRUE; } else @@ -1147,11 +1208,9 @@ AtapiFindDevices(PATAPI_MINIPORT_EXTENSION DeviceExtension, DeviceExtension->DeviceFlags[UnitNumber] |= DEVICE_DWORD_IO; } #ifdef ENABLE_DMA - if ((DeviceExtension->DeviceParams[UnitNumber].TMFieldsValid & 0x0004) && - ((DeviceExtension->DeviceParams[UnitNumber].MultiDmaModes & 0x0700) || - (DeviceExtension->DeviceParams[UnitNumber].UltraDmaModes & 0xFF00))) + if (AtapiConfigDma(DeviceExtension, UnitNumber)) { - DeviceExtension->DeviceFlags[UnitNumber] |= DEVICE_DMA_CMD; + DeviceExtension->DeviceFlags[UnitNumber] |= DEVICE_DMA_CMD; } #endif DeviceFound = TRUE; @@ -1636,6 +1695,18 @@ AtapiSendAtapiCommand(IN PATAPI_MINIPORT_EXTENSION DeviceExtension, } #endif +#ifdef ENABLE_DMA + if ((DeviceExtension->DeviceFlags[Srb->TargetId] & DEVICE_DMA_CMD) && + (Srb->Cdb[0] == SCSIOP_READ || Srb->Cdb[0] == SCSIOP_WRITE)) + { + DeviceExtension->UseDma = AtapiInitDma(DeviceExtension, Srb, Srb->SrbFlags & SRB_FLAGS_DATA_IN ? 1 << 3 : 0); + } + else + { + DeviceExtension->UseDma = FALSE; + } +#endif + if (DeviceExtension->DataTransferLength < 0x10000) { ByteCountLow = (UCHAR)(DeviceExtension->DataTransferLength & 0xFF); @@ -1648,14 +1719,27 @@ AtapiSendAtapiCommand(IN PATAPI_MINIPORT_EXTENSION DeviceExtension, } /* Set feature register */ +#ifdef ENABLE_DMA + IDEWritePrecomp(DeviceExtension->CommandPortBase, DeviceExtension->UseDma ? 1 : 0); +#else IDEWritePrecomp(DeviceExtension->CommandPortBase, 0); +#endif /* Set command packet length */ IDEWriteCylinderHigh(DeviceExtension->CommandPortBase, ByteCountHigh); IDEWriteCylinderLow(DeviceExtension->CommandPortBase, ByteCountLow); /* Issue command to drive */ - AtapiExecuteCommand(DeviceExtension, IDE_CMD_PACKET, AtapiPacketInterrupt); +#ifdef ENABLE_DMA + if (DeviceExtension->UseDma) + { + AtapiExecuteCommand(DeviceExtension, IDE_CMD_PACKET, AtapiDmaPacketInterrupt); + } + else +#endif + { + AtapiExecuteCommand(DeviceExtension, IDE_CMD_PACKET, AtapiPacketInterrupt); + } /* Wait for DRQ to assert */ for (Retries = 0; Retries < IDE_MAX_BUSY_RETRIES; Retries++) @@ -1685,6 +1769,15 @@ AtapiSendAtapiCommand(IN PATAPI_MINIPORT_EXTENSION DeviceExtension, (PUSHORT)Srb->Cdb, CdbSize); +#ifdef ENABLE_DMA + if (DeviceExtension->UseDma) + { + BYTE DmaCommand; + /* start DMA */ + DmaCommand = IDEReadDMACommand(DeviceExtension->BusMasterRegisterBase); + IDEWriteDMACommand(DeviceExtension->BusMasterRegisterBase, DmaCommand|0x01); + } +#endif DPRINT("AtapiSendAtapiCommand() done\n"); return(SRB_STATUS_PENDING); @@ -1837,6 +1930,8 @@ AtapiInquiry(PATAPI_MINIPORT_EXTENSION DeviceExtension, ((PUCHAR)DeviceParams->FirmwareRev)[i+1]; } + InquiryData->AdditionalLength = 31; + DPRINT("VendorId: '%.20s'\n", InquiryData->VendorId); Srb->SrbStatus = SRB_STATUS_SUCCESS; @@ -2453,6 +2548,60 @@ AtapiCompleteRequest(PATAPI_MINIPORT_EXTENSION DevExt, ScsiPortNotification(NextRequest, (PVOID)DevExt, NULL); } +#ifdef ENABLE_DMA +static BOOLEAN FASTCALL +AtapiDmaPacketInterrupt(PATAPI_MINIPORT_EXTENSION DevExt) +{ + BYTE SrbStatus; + BYTE DmaCommand; + BYTE DmaStatus; + BYTE Status; + BYTE Error; + BYTE SensKey; + + DPRINT("AtapiPacketDmaInterrupt\n"); + + DevExt->UseDma = FALSE; + + /* stop DMA */ + DmaCommand = IDEReadDMACommand(DevExt->BusMasterRegisterBase); + IDEWriteDMACommand(DevExt->BusMasterRegisterBase, DmaCommand & 0xfe); + /* get DMA status */ + DmaStatus = IDEReadDMAStatus(DevExt->BusMasterRegisterBase); + /* clear the INTR & ERROR bits */ + IDEWriteDMAStatus(DevExt->BusMasterRegisterBase, DmaStatus | 0x06); + + Status = IDEReadStatus(DevExt->CommandPortBase); + DPRINT("DriveStatus: %x\n", Status); + + if (Status & (IDE_SR_BUSY|IDE_SR_ERR)) + { + if (Status & IDE_SR_ERR) + { + Error = IDEReadError(DevExt->CommandPortBase); + SensKey = Error >> 4; + DPRINT("DriveError: %x, SenseKey: %x\n", Error, SensKey); + } + SrbStatus = SRB_STATUS_ERROR; + } + else + { + if ((DmaStatus & 0x07) != 0x04) + { + DPRINT("DmaStatus: %02x\n", DmaStatus); + SrbStatus = SRB_STATUS_ERROR; + } + else + { + SrbStatus = STATUS_SUCCESS; + } + } + AtapiCompleteRequest(DevExt, SrbStatus); + DPRINT("AtapiDmaPacketInterrupt() done\n"); + return TRUE; +} +#endif + static BOOLEAN FASTCALL AtapiPacketInterrupt(PATAPI_MINIPORT_EXTENSION DevExt) { @@ -2460,7 +2609,7 @@ AtapiPacketInterrupt(PATAPI_MINIPORT_EXTENSION DevExt) BYTE Status; BYTE IntReason; ULONG TransferSize; - ULONG JunkSize; + ULONG JunkSize = 0; BOOL IsLastBlock; PBYTE TargetAddress; ULONG Retries; @@ -2874,9 +3023,6 @@ AtapiInitDma(PATAPI_MINIPORT_EXTENSION DevExt, /* set the end marker in the last PRD */ PRDEntry--; PRDEntry->Length |= 0x80000000; - /* enable the busmaster transfers for the drive */ - Status = IDEReadDMAStatus(DevExt->BusMasterRegisterBase); - IDEWriteDMAStatus(DevExt->BusMasterRegisterBase, (Status & ~0x06) | (Srb->TargetId ? 0x40 : 0x20)); /* set the PDR table */ IDEWritePRDTable(DevExt->BusMasterRegisterBase, DevExt->PRDTablePhysicalAddress.u.LowPart); /* write the DMA command */ From 68ddb0bcdde54e643b37d1a173abb463bcac6cea Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sun, 7 Mar 2004 19:53:08 +0000 Subject: [PATCH 0358/1463] - Pre initialized the resulting transfer length for requests which are split. svn path=/trunk/; revision=8570 --- reactos/drivers/storage/class2/class2.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/reactos/drivers/storage/class2/class2.c b/reactos/drivers/storage/class2/class2.c index 8f50e9334fb..ad384a26d83 100644 --- a/reactos/drivers/storage/class2/class2.c +++ b/reactos/drivers/storage/class2/class2.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: class2.c,v 1.49 2004/02/29 11:21:58 hbirr Exp $ +/* $Id: class2.c,v 1.50 2004/03/07 19:53:08 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -2134,6 +2134,10 @@ ScsiClassSplitRequest(IN PDEVICE_OBJECT DeviceObject, /* Initialize transfer data for first request */ Offset = CurrentStack->Parameters.Read.ByteOffset; TransferLength = CurrentStack->Parameters.Read.Length; + + /* Set the result length */ + Irp->IoStatus.Information = TransferLength; + DataLength = MaximumBytes; RequestCount = ROUND_UP(TransferLength, MaximumBytes) / MaximumBytes; From ef908e75fd41df55921569a20de23ccf88cb9841 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sun, 7 Mar 2004 19:59:37 +0000 Subject: [PATCH 0359/1463] - Initialized the object tag to prevent the tag 0xcccccccc. svn path=/trunk/; revision=8571 --- reactos/ntoskrnl/cm/registry.c | 3 ++- reactos/ntoskrnl/nt/evtpair.c | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/cm/registry.c b/reactos/ntoskrnl/cm/registry.c index 1ef39d93d93..0ce45fc2418 100644 --- a/reactos/ntoskrnl/cm/registry.c +++ b/reactos/ntoskrnl/cm/registry.c @@ -1,4 +1,4 @@ -/* $Id: registry.c,v 1.121 2004/02/07 17:30:14 hbirr Exp $ +/* $Id: registry.c,v 1.122 2004/03/07 19:59:36 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -260,6 +260,7 @@ CmInitializeRegistry(VOID) /* Initialize the Key object type */ CmiKeyType = ExAllocatePool(NonPagedPool, sizeof(OBJECT_TYPE)); assert(CmiKeyType); + CmiKeyType->Tag = TAG('R', 'e', 'g', 'K'); CmiKeyType->TotalObjects = 0; CmiKeyType->TotalHandles = 0; CmiKeyType->MaxObjects = LONG_MAX; diff --git a/reactos/ntoskrnl/nt/evtpair.c b/reactos/ntoskrnl/nt/evtpair.c index 1f02ae381ed..b06fbc79b5f 100644 --- a/reactos/ntoskrnl/nt/evtpair.c +++ b/reactos/ntoskrnl/nt/evtpair.c @@ -1,4 +1,4 @@ -/* $Id: evtpair.c,v 1.20 2003/12/30 18:52:05 fireball Exp $ +/* $Id: evtpair.c,v 1.21 2004/03/07 19:59:37 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -71,7 +71,7 @@ NtInitializeEventPairImplementation(VOID) ExEventPairObjectType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE)); RtlCreateUnicodeString(&ExEventPairObjectType->TypeName, L"EventPair"); - + ExEventPairObjectType->Tag = TAG('E', 'v', 'P', 'a'); ExEventPairObjectType->MaxObjects = ULONG_MAX; ExEventPairObjectType->MaxHandles = ULONG_MAX; ExEventPairObjectType->TotalObjects = 0; From 783cbe07183dd8fd985eb41cb951d374282b2900 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sun, 7 Mar 2004 20:03:43 +0000 Subject: [PATCH 0360/1463] - Fixed the handling for ctrl and alt keys. svn path=/trunk/; revision=8572 --- reactos/subsys/csrss/win32csr/conio.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/reactos/subsys/csrss/win32csr/conio.c b/reactos/subsys/csrss/win32csr/conio.c index be38eb9b878..04ae9423b9c 100644 --- a/reactos/subsys/csrss/win32csr/conio.c +++ b/reactos/subsys/csrss/win32csr/conio.c @@ -1,4 +1,4 @@ -/* $Id: conio.c,v 1.7 2004/02/27 17:35:42 hbirr Exp $ +/* $Id: conio.c,v 1.8 2004/03/07 20:03:43 hbirr Exp $ * * reactos/subsys/csrss/win32csr/conio.c * @@ -1155,14 +1155,14 @@ ConioGetShiftState(PBYTE KeyState) ssOut |= SHIFT_PRESSED; if (KeyState[VK_LCONTROL] & 0x80) - ssOut |= RIGHT_CTRL_PRESSED; - else if (KeyState[VK_RCONTROL] & 0x80) ssOut |= LEFT_CTRL_PRESSED; + if (KeyState[VK_RCONTROL] & 0x80) + ssOut |= RIGHT_CTRL_PRESSED; if (KeyState[VK_LMENU] & 0x80) - ssOut |= RIGHT_ALT_PRESSED; - else if (KeyState[VK_RMENU] & 0x80) ssOut |= LEFT_ALT_PRESSED; + if (KeyState[VK_RMENU] & 0x80) + ssOut |= RIGHT_ALT_PRESSED; return ssOut; } @@ -2427,7 +2427,7 @@ CSR_API(CsrReadConsoleOutputChar) Reply->Header.DataSize = Reply->Header.MessageSize - sizeof(LPC_MESSAGE); ReadBuffer = Reply->Data.ReadConsoleOutputCharReply.String; - Status = ConioLockScreenBuffer(ProcessData, Request->Data.ReadConsoleOutputCharRequest.ConsoleHandle, Buff); + Status = ConioLockScreenBuffer(ProcessData, Request->Data.ReadConsoleOutputCharRequest.ConsoleHandle, &Buff); if (! NT_SUCCESS(Status)) { return Reply->Status = Status; From 61ae1aa5151a1ce26187832099ef2838103577a9 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" <hackbunny@reactos.org> Date: Sun, 7 Mar 2004 20:07:05 +0000 Subject: [PATCH 0361/1463] - Added comments to the fiber test, plus minor fixes - Fixed NT_TIB structure to be compatible with w32api - Fixed fiber support in kernel32.dll. Now the correct argument is passed to fiber startup routines svn path=/trunk/; revision=8573 --- reactos/apps/tests/fiber/Makefile | 4 +- reactos/apps/tests/fiber/fiber.c | 83 +++++++++++++++++++----- reactos/include/funcs.h | 2 +- reactos/include/napi/teb.h | 2 +- reactos/lib/kernel32/thread/fiber.c | 14 ++-- reactos/lib/kernel32/thread/i386/fiber.S | 4 +- 6 files changed, 78 insertions(+), 31 deletions(-) diff --git a/reactos/apps/tests/fiber/Makefile b/reactos/apps/tests/fiber/Makefile index faa18af96aa..1e3a7d6c980 100644 --- a/reactos/apps/tests/fiber/Makefile +++ b/reactos/apps/tests/fiber/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.1 2004/03/07 03:15:20 hyperion Exp $ +# $Id: Makefile,v 1.2 2004/03/07 20:07:04 hyperion Exp $ PATH_TO_TOP = ../../.. @@ -10,8 +10,6 @@ TARGET_APPTYPE = console TARGET_NAME = fiber -TARGET_SDKLIBS = kernel32.a - TARGET_OBJECTS = $(TARGET_NAME).o TARGET_CFLAGS = -Wall -Werror -D__USE_W32API diff --git a/reactos/apps/tests/fiber/fiber.c b/reactos/apps/tests/fiber/fiber.c index 385b80fbfef..bc325400b90 100644 --- a/reactos/apps/tests/fiber/fiber.c +++ b/reactos/apps/tests/fiber/fiber.c @@ -1,10 +1,12 @@ -/* $Id: fiber.c,v 1.1 2004/03/07 03:15:20 hyperion Exp $ +/* $Id: fiber.c,v 1.2 2004/03/07 20:07:04 hyperion Exp $ */ #include <assert.h> -#include <stdlib.h> +#include <limits.h> #include <stdio.h> +#include <stdlib.h> #include <time.h> + #include <tchar.h> #include <windows.h> @@ -62,14 +64,14 @@ struct FiberData unsigned nRealPrio; PVOID pFiber; LIST_ENTRY leQueue; - int nTickQueued; + int nQuantumQueued; int nBoost; struct FiberData * pfdPrev; int bExitPrev; }; static LIST_ENTRY a_leQueues[32]; -static unsigned nTick = 0; +static unsigned nQuantum = 0; static struct FiberData * pfdLastStarveScan = NULL; void Fbt_Create(int); @@ -100,7 +102,7 @@ void Fbt_Yield(VOID) pfdCur = Fbt_GetCurrent(); - if(pfdCur->nBoost > 1) + if(pfdCur->nBoost) { -- pfdCur->nBoost; @@ -117,8 +119,10 @@ void Fbt_AfterSwitch(struct FiberData * pfdCur) pfdPrev = pfdCur->pfdPrev; + /* The previous fiber left some homework for us */ if(pfdPrev) { + /* Kill the predecessor */ if(pfdCur->bExitPrev) { if(pfdLastStarveScan == pfdPrev) @@ -127,16 +131,20 @@ void Fbt_AfterSwitch(struct FiberData * pfdCur) DeleteFiber(pfdPrev->pFiber); free(pfdPrev); } + /* Enqueue the previous fiber in the correct ready queue */ else { - pfdPrev->nTickQueued = nTick; + /* Remember the quantum in which the previous fiber was queued */ + pfdPrev->nQuantumQueued = nQuantum; + /* Disable the anti-starvation boost */ if(pfdPrev->nBoost) { pfdPrev->nBoost = 0; pfdPrev->nPrio = pfdPrev->nRealPrio; } + /* Enqueue the previous fiber */ InsertTailList ( &a_leQueues[pfdPrev->nPrio], @@ -162,9 +170,11 @@ void Fbt_Dispatch(struct FiberData * pfdCur, int bExit) assert(pfdCur == GetFiberData()); - ++ nTick; + ++ nQuantum; - if(nTick % 10 == 0) + /* Every ten quantums check for starving threads */ + /* FIXME: this implementation of starvation prevention isn't that great */ + if(nQuantum % 10 == 0) { int j; int k; @@ -175,34 +185,53 @@ void Fbt_Dispatch(struct FiberData * pfdCur, int bExit) bResume = 0; i = 0; + /* Pick up from where we left last time */ if(pfdLastStarveScan) { unsigned nPrio; nPrio = pfdLastStarveScan->nPrio; + /* The last fiber we scanned for starvation isn't queued anymore */ if(IsListEmpty(&pfdLastStarveScan->leQueue)) + /* Scan the ready queue for its priority */ i = nPrio; + /* Last fiber for its priority level */ else if(pfdLastStarveScan->leQueue.Flink == &a_leQueues[nPrio]) + /* Scan the ready queue for the next priority level */ i = nPrio + 1; + /* Scan the next fiber in the ready queue */ else { + i = nPrio; ple = pfdLastStarveScan->leQueue.Flink; bResume = 1; } + /* Priority levels 15-31 are never checked for starvation */ if(i >= 15) + { + if(bResume) + bResume = 0; + i = 0; + } } + /* + Scan at most 16 threads, in the priority range 0-14, applying in total at + most 10 boosts. This loop scales O(1) + */ for(j = 0, k = 0, b = 0; j < 16 && k < 15 && b < 10; ++ j) { unsigned nDiff; + /* No previous state to resume from */ if(!bResume) { int nQueue; - + + /* Get the first element in the current queue */ nQueue = (k + i) % 15; if(IsListEmpty(&a_leQueues[nQueue])) @@ -216,23 +245,29 @@ void Fbt_Dispatch(struct FiberData * pfdCur, int bExit) else bResume = 0; + /* Get the current fiber */ pfdLastStarveScan = CONTAINING_RECORD(ple, struct FiberData, leQueue); assert(pfdLastStarveScan->nMagic == 0x12345678); assert(pfdLastStarveScan != pfdCur); - if(nTick > pfdLastStarveScan->nTickQueued) - nDiff = nTick - pfdLastStarveScan->nTickQueued; + /* Calculate the number of quantums the fiber has been in the queue */ + if(nQuantum > pfdLastStarveScan->nQuantumQueued) + nDiff = nQuantum - pfdLastStarveScan->nQuantumQueued; else - nDiff = pfdLastStarveScan->nTickQueued - nTick; + nDiff = UINT_MAX - pfdLastStarveScan->nQuantumQueued + nQuantum; + /* The fiber has been ready for more than 30 quantums: it's starving */ if(nDiff > 30) { + /* Plus one boost applied */ ++ b; - pfdLastStarveScan->nBoost = 2; + /* Apply the boost */ + pfdLastStarveScan->nBoost = 1; pfdLastStarveScan->nRealPrio = pfdLastStarveScan->nPrio; pfdLastStarveScan->nPrio = 15; + /* Re-enqueue the fiber in the correct priority queue */ RemoveEntryList(&pfdLastStarveScan->leQueue); InsertTailList(&a_leQueues[15], &pfdLastStarveScan->leQueue); } @@ -241,40 +276,53 @@ void Fbt_Dispatch(struct FiberData * pfdCur, int bExit) pfdNext = NULL; + /* This fiber is going to die: scan all ready queues */ if(bExit) n = 1; + /* + Scan only ready queues for priorities greater than or equal to the priority of + the current thread (round-robin) + */ else n = pfdCur->nPrio + 1; + /* This loop scales O(1) */ for(i = 32; i >= n; -- i) { PLIST_ENTRY pleNext; + /* No fiber ready for this priority level */ if(IsListEmpty(&a_leQueues[i - 1])) continue; + /* Get the next ready fiber */ pleNext = RemoveHeadList(&a_leQueues[i - 1]); InitializeListHead(pleNext); - pfdNext = CONTAINING_RECORD(pleNext, struct FiberData, leQueue); assert(pfdNext->pFiber != GetCurrentFiber()); assert(pfdNext->nMagic == 0x12345678); break; } + /* Next fiber chosen */ if(pfdNext) { + /* Give some homework to the next fiber */ pfdNext->pfdPrev = pfdCur; pfdNext->bExitPrev = bExit; - + + /* Switch to the next fiber */ SwitchToFiber(pfdNext->pFiber); - + + /* Complete the switch back to this fiber */ Fbt_AfterSwitch(pfdCur); } + /* No next fiber, and current fiber exiting */ else if(bExit) { PVOID pCurFiber; + /* Delete the current fiber. This kills the thread and stops the simulation */ if(pfdLastStarveScan == pfdCur) pfdLastStarveScan = NULL; @@ -282,6 +330,7 @@ void Fbt_Dispatch(struct FiberData * pfdCur, int bExit) free(pfdCur); DeleteFiber(pCurFiber); } + /* No next fiber: continue running the current one */ } void Fbt_Exit(VOID) @@ -322,7 +371,7 @@ void Fbt_CreateFiber(int bInitial) pData->nId = InterlockedIncrement(&s_nFiberIdSeed); pData->nPrio = rand() % 32; pData->pFiber = pFiber; - pData->nTickQueued = 0; + pData->nQuantumQueued = 0; pData->nBoost = 0; pData->nRealPrio = pData->nPrio; pData->pfdPrev = NULL; diff --git a/reactos/include/funcs.h b/reactos/include/funcs.h index e52aa0dc63b..f650e836578 100644 --- a/reactos/include/funcs.h +++ b/reactos/include/funcs.h @@ -11485,7 +11485,7 @@ void STDCALL DeleteFiber(LPVOID lpFiber); void STDCALL SwitchToFiber(LPVOID lpFiber); -#define GetFiberData() *(LPVOID *)(((PNT_TIB)NtCurrentTeb())->Fib.FiberData) +#define GetFiberData() *(LPVOID *)(((PNT_TIB)NtCurrentTeb())->FiberData) WINBOOL STDCALL RegisterServicesProcess(DWORD ServicesProcessId); diff --git a/reactos/include/napi/teb.h b/reactos/include/napi/teb.h index af474a174b6..646eb04fe62 100644 --- a/reactos/include/napi/teb.h +++ b/reactos/include/napi/teb.h @@ -56,7 +56,7 @@ typedef struct _NT_TIB { union { PVOID FiberData; /* 10h */ ULONG Version; /* 10h */ - } Fib; + }; PVOID ArbitraryUserPointer; /* 14h */ struct _NT_TIB *Self; /* 18h */ } NT_TIB, *PNT_TIB; diff --git a/reactos/lib/kernel32/thread/fiber.c b/reactos/lib/kernel32/thread/fiber.c index 1e53309c503..5d10b43fd82 100644 --- a/reactos/lib/kernel32/thread/fiber.c +++ b/reactos/lib/kernel32/thread/fiber.c @@ -1,4 +1,4 @@ -/* $Id: fiber.c,v 1.9 2004/01/23 21:16:04 ekohl Exp $ +/* $Id: fiber.c,v 1.10 2004/03/07 20:07:05 hyperion Exp $ * * FILE: lib/kernel32/thread/fiber.c * @@ -60,8 +60,8 @@ BOOL WINAPI ConvertFiberToThread(void) pTeb->IsFiber = FALSE; /* free the fiber */ - if(pTeb->Tib.Fib.FiberData != NULL) - RtlFreeHeap(pTeb->Peb->ProcessHeap, 0, pTeb->Tib.Fib.FiberData); + if(pTeb->Tib.FiberData != NULL) + RtlFreeHeap(pTeb->Peb->ProcessHeap, 0, pTeb->Tib.FiberData); /* success */ return TRUE; @@ -86,7 +86,7 @@ LPVOID WINAPI ConvertThreadToFiberEx(LPVOID lpParameter, DWORD dwFlags) PFIBER pfCurFiber; /* the current thread is already a fiber */ - if(pTeb->IsFiber && pTeb->Tib.Fib.FiberData) return pTeb->Tib.Fib.FiberData; + if(pTeb->IsFiber && pTeb->Tib.FiberData) return pTeb->Tib.FiberData; /* allocate the fiber */ pfCurFiber = (PFIBER)RtlAllocateHeap(pTeb->Peb->ProcessHeap, 0, sizeof(FIBER)); @@ -108,7 +108,7 @@ LPVOID WINAPI ConvertThreadToFiberEx(LPVOID lpParameter, DWORD dwFlags) pfCurFiber->DeallocationStack = pTeb->DeallocationStack; /* associate the fiber to the current thread */ - pTeb->Tib.Fib.FiberData = pfCurFiber; + pTeb->Tib.FiberData = pfCurFiber; pTeb->IsFiber = TRUE; /* success */ @@ -265,7 +265,7 @@ void WINAPI DeleteFiber(LPVOID lpFiber) RtlFreeHeap(pTeb->Peb->ProcessHeap, 0, lpFiber); /* the fiber is deleting itself: let the system deallocate the stack */ - if(pTeb->Tib.Fib.FiberData == lpFiber) ExitThread(1); + if(pTeb->Tib.FiberData == lpFiber) ExitThread(1); /* deallocate the stack */ NtFreeVirtualMemory @@ -288,7 +288,7 @@ __declspec(noreturn) extern void WINAPI ThreadStartup __declspec(noreturn) void WINAPI FiberStartup(PVOID lpStartAddress) { /* FIXME? this should be pretty accurate */ - ThreadStartup(lpStartAddress, NtCurrentTeb()->Tib.Fib.FiberData); + ThreadStartup(lpStartAddress, GetFiberData()); } /* EOF */ diff --git a/reactos/lib/kernel32/thread/i386/fiber.S b/reactos/lib/kernel32/thread/i386/fiber.S index dac8c543933..2de9a127c39 100644 --- a/reactos/lib/kernel32/thread/i386/fiber.S +++ b/reactos/lib/kernel32/thread/i386/fiber.S @@ -1,4 +1,4 @@ -/* $Id: fiber.S,v 1.3 2004/03/07 04:00:39 hyperion Exp $ +/* $Id: fiber.S,v 1.4 2004/03/07 20:07:05 hyperion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -25,7 +25,7 @@ _SwitchToFiber@4: movl %fs:0x18, %ecx /* Teb = NtCurrentTeb() */ /* get the current fiber */ - movl 0x10(%ecx), %eax /* Fiber = Teb->Tib.Fib.FiberData */ + movl 0x10(%ecx), %eax /* Fiber = Teb->Tib.FiberData */ /* store the volatile context of the current fiber */ movl 0x0(%ecx), %edx From fa397a0e33376ac14ac2d8a3ca0ec1a8f2f39bb7 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sun, 7 Mar 2004 20:12:13 +0000 Subject: [PATCH 0362/1463] - Added a disk speed test utility. svn path=/trunk/; revision=8574 --- reactos/apps/tests/diskspeed/.cvsignore | 6 + reactos/apps/tests/diskspeed/diskspeed.c | 165 +++++++++++++++++++++++ reactos/apps/tests/diskspeed/makefile | 23 ++++ 3 files changed, 194 insertions(+) create mode 100644 reactos/apps/tests/diskspeed/.cvsignore create mode 100644 reactos/apps/tests/diskspeed/diskspeed.c create mode 100644 reactos/apps/tests/diskspeed/makefile diff --git a/reactos/apps/tests/diskspeed/.cvsignore b/reactos/apps/tests/diskspeed/.cvsignore new file mode 100644 index 00000000000..d63774a7353 --- /dev/null +++ b/reactos/apps/tests/diskspeed/.cvsignore @@ -0,0 +1,6 @@ +*.o +*.d +*.exe +*.coff +*.sym +*.map diff --git a/reactos/apps/tests/diskspeed/diskspeed.c b/reactos/apps/tests/diskspeed/diskspeed.c new file mode 100644 index 00000000000..d19f8c0f344 --- /dev/null +++ b/reactos/apps/tests/diskspeed/diskspeed.c @@ -0,0 +1,165 @@ +/* + * Copyright (C) 2004 ReactOS Team + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS diskspeed.exe + * FILE: apps/tests/diskspeed/diskspeed.c + * PURPOSE: Determines disk transfer rates + * PROGRAMMER: Hartmut Birr + */ + +#include <windows.h> +#include <stdio.h> +#include <stdlib.h> +#include <ddk/ntddk.h> +#include <ddk/ntddscsi.h> +#include <ddk/scsi.h> + +BOOL GetInquiryData(HANDLE hDevice, PINQUIRYDATA InquiryData) +{ + BOOL Result; + DWORD dwReturned; + SCSI_ADDRESS ScsiAddress; + PSCSI_ADAPTER_BUS_INFO AdapterInfo; + PSCSI_INQUIRY_DATA InquiryBuffer; + BYTE Buffer[4096]; + int i; + + Result = DeviceIoControl(hDevice, + IOCTL_SCSI_GET_ADDRESS, + NULL, + 0, + &ScsiAddress, + sizeof(ScsiAddress), + &dwReturned, + FALSE); + if (Result == FALSE) + { + return FALSE; + } + Result = DeviceIoControl(hDevice, + IOCTL_SCSI_GET_INQUIRY_DATA, + NULL, + 0, + Buffer, + sizeof(Buffer), + &dwReturned, + FALSE); + if (Result) + { + AdapterInfo = (PSCSI_ADAPTER_BUS_INFO)Buffer; + for (i = 0; i < AdapterInfo->NumberOfBuses; i++) + { + InquiryBuffer = (PSCSI_INQUIRY_DATA) (Buffer + AdapterInfo->BusData[i].InquiryDataOffset); + if (AdapterInfo->BusData[i].InquiryDataOffset) + { + while (1) + { + if (InquiryBuffer->PathId == ScsiAddress.PathId && + InquiryBuffer->TargetId == ScsiAddress.TargetId && + InquiryBuffer->Lun == ScsiAddress.Lun) + { + memcpy(InquiryData, InquiryBuffer->InquiryData, sizeof(INQUIRYDATA)); + return TRUE; + } + if (InquiryBuffer->NextInquiryDataOffset == 0) + { + break; + } + InquiryBuffer = (PSCSI_INQUIRY_DATA) (Buffer + InquiryBuffer->NextInquiryDataOffset); + } + } + } + } + return FALSE; +} + + + +int main(void) +{ + HANDLE hDevice; + OVERLAPPED ov; + + PBYTE Buffer; + DWORD Start; + DWORD dwReturned; + DWORD dwReadTotal; + DWORD Size; + BOOL Result; + ULONG Drive; + CHAR Name[20]; + + INQUIRYDATA InquiryData; + + + Drive = 0; + while (1) + { + sprintf(Name, "\\\\.\\PHYSICALDRIVE%ld", Drive); + hDevice = CreateFile(Name, + GENERIC_READ, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + 0, + NULL); + if (hDevice == INVALID_HANDLE_VALUE) + { + if (Drive > 0) + { + VirtualFree(Buffer, 512 * 1024, MEM_RELEASE); + } + else + { + printf("Cannot open '%s'\n", Name); + } + break; + } + if (Drive == 0) + { + printf("Transfer Size (kB) 1 2 4 8 16 32 64 128 256\n"); + printf("Transfer Rate (MB/s)\n"); + printf("-------------------------------------------------------------------------------\n"); + + Buffer = VirtualAlloc(NULL, 512 * 1024, MEM_COMMIT, PAGE_READWRITE); + } + Result = GetInquiryData(hDevice, &InquiryData); + if (Result) + { + printf("%.24s ", InquiryData.VendorId); + } + else + { + printf("Disk %ld ", Drive + 1); + } + Size = 1024; + memset(&ov, 0, sizeof(OVERLAPPED)); + while (Size <= 256 * 1024) + { + memset(Buffer, 0, Size); + dwReadTotal = 0; + + Start = GetTickCount() + 2000; + while (Start > GetTickCount()) + { + Result = ReadFile(hDevice, Buffer, Size, &dwReturned, &ov); + if (Result) + { + dwReadTotal += dwReturned; + ov.Offset += dwReturned; + } + } + dwReadTotal /= 2048; + printf("%3ld.%ld ", dwReadTotal / 1024, (dwReadTotal % 1024) * 10 / 1024); + Size *= 2; + } + printf("\n"); + CloseHandle(hDevice); + Drive++; + } + printf("\n"); + + + return 0; +} diff --git a/reactos/apps/tests/diskspeed/makefile b/reactos/apps/tests/diskspeed/makefile new file mode 100644 index 00000000000..ead30091079 --- /dev/null +++ b/reactos/apps/tests/diskspeed/makefile @@ -0,0 +1,23 @@ +# $Id: makefile,v 1.1 2004/03/07 20:12:13 hbirr Exp $ + +PATH_TO_TOP = ../../.. + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = console + +TARGET_NAME = diskspeed + +TARGET_SDKLIBS = kernel32.a + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_CFLAGS = -Wall -Werror + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF From 877788b63b623dafb9012e7677d93d7e8f8cf68a Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 7 Mar 2004 20:31:53 +0000 Subject: [PATCH 0363/1463] - Call create process notify routines from NtCreateProcess. - Protect PiProcessNotifyRoutine by a spinlock. - Started PsSetLoadImageNotifyRoutine implementation, it just registers the callback, but doesn't call it. svn path=/trunk/; revision=8575 --- reactos/include/ddk/pstypes.h | 23 ++++++++++++ reactos/ntoskrnl/ntoskrnl.def | 3 +- reactos/ntoskrnl/ntoskrnl.edf | 3 +- reactos/ntoskrnl/ps/process.c | 66 ++++++++++++++++++++++++++++++++++- 4 files changed, 92 insertions(+), 3 deletions(-) diff --git a/reactos/include/ddk/pstypes.h b/reactos/include/ddk/pstypes.h index 301376014f3..aa949040123 100644 --- a/reactos/include/ddk/pstypes.h +++ b/reactos/include/ddk/pstypes.h @@ -23,6 +23,22 @@ struct _KTHREAD; typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD; +typedef struct _IMAGE_INFO { + union { + ULONG Properties; + struct { + ULONG ImageAddressingMode : 8; + ULONG SystemModeImage : 1; + ULONG ImageMappedToAllPids : 1; + ULONG Reserved : 22; + }; + }; + PVOID ImageBase; + ULONG ImageSelector; + ULONG ImageSize; + ULONG ImageSectionNumber; +} IMAGE_INFO, *PIMAGE_INFO; + typedef VOID STDCALL_FUNC (*PKSTART_ROUTINE)(PVOID StartContext); @@ -36,6 +52,11 @@ typedef VOID STDCALL_FUNC HANDLE ThreadId, BOOLEAN Create); +typedef VOID STDCALL_FUNC +(*PLOAD_IMAGE_NOTIFY_ROUTINE)(PUNICODE_STRING FullImageName, + HANDLE ProcessId, + PIMAGE_INFO ImageInfo); + typedef NTSTATUS STDCALL_FUNC (*PW32_PROCESS_CALLBACK)(struct _EPROCESS *Process, BOOLEAN Create); @@ -59,4 +80,6 @@ struct _KPROCESS; #define HIGH_PRIORITY (31) #define MAXIMUM_PRIORITY (32) +#define IMAGE_ADDRESSING_MODE_32BIT (3) + #endif /* __INCLUDE_DDK_PSTYPES_H */ diff --git a/reactos/ntoskrnl/ntoskrnl.def b/reactos/ntoskrnl/ntoskrnl.def index 5f9122073b9..ecedab6c9e6 100644 --- a/reactos/ntoskrnl/ntoskrnl.def +++ b/reactos/ntoskrnl/ntoskrnl.def @@ -1,4 +1,4 @@ -; $Id: ntoskrnl.def,v 1.176 2004/03/06 22:21:20 dwelch Exp $ +; $Id: ntoskrnl.def,v 1.177 2004/03/07 20:31:53 navaraf Exp $ ; ; reactos/ntoskrnl/ntoskrnl.def ; @@ -672,6 +672,7 @@ PsRevertToSelf@0 PsSetCreateProcessNotifyRoutine@8 PsSetCreateThreadNotifyRoutine@4 ;PsSetLegoNotifyRoutine@4 +PsSetLoadImageNotifyRoutine@4 ;PsSetProcessPriorityByClass@8 PsTerminateSystemThread@4 PsThreadType DATA diff --git a/reactos/ntoskrnl/ntoskrnl.edf b/reactos/ntoskrnl/ntoskrnl.edf index a87d8766e5e..b6376860b5b 100644 --- a/reactos/ntoskrnl/ntoskrnl.edf +++ b/reactos/ntoskrnl/ntoskrnl.edf @@ -1,4 +1,4 @@ -; $Id: ntoskrnl.edf,v 1.162 2004/03/06 22:21:20 dwelch Exp $ +; $Id: ntoskrnl.edf,v 1.163 2004/03/07 20:31:53 navaraf Exp $ ; ; reactos/ntoskrnl/ntoskrnl.def ; @@ -673,6 +673,7 @@ PsRevertToSelf=PsRevertToSelf@0 PsSetCreateProcessNotifyRoutine=PsSetCreateProcessNotifyRoutine@8 PsSetCreateThreadNotifyRoutine=PsSetCreateThreadNotifyRoutine@4 ;PsSetLegoNotifyRoutine +PsSetLoadImageNotifyRoutine=PsSetLoadImageNotifyRoutine@4 ;PsSetProcessPriorityByClass PsTerminateSystemThread=PsTerminateSystemThread@4 PsThreadType DATA diff --git a/reactos/ntoskrnl/ps/process.c b/reactos/ntoskrnl/ps/process.c index d8fed84dac6..44c7ace077a 100644 --- a/reactos/ntoskrnl/ps/process.c +++ b/reactos/ntoskrnl/ps/process.c @@ -1,4 +1,4 @@ -/* $Id: process.c,v 1.124 2004/01/05 14:28:21 weiden Exp $ +/* $Id: process.c,v 1.125 2004/03/07 20:31:53 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -53,9 +53,15 @@ static GENERIC_MAPPING PiProcessMapping = {PROCESS_READ, PROCESS_ALL_ACCESS}; #define MAX_PROCESS_NOTIFY_ROUTINE_COUNT 8 +#define MAX_LOAD_IMAGE_NOTIFY_ROUTINE_COUNT 8 + +static KSPIN_LOCK PsNotifyListLock; static PCREATE_PROCESS_NOTIFY_ROUTINE PiProcessNotifyRoutine[MAX_PROCESS_NOTIFY_ROUTINE_COUNT]; +static PLOAD_IMAGE_NOTIFY_ROUTINE +PiLoadImageNotifyRoutine[MAX_LOAD_IMAGE_NOTIFY_ROUTINE_COUNT]; + typedef struct { @@ -268,6 +274,10 @@ PsInitProcessManagment(VOID) InitializeListHead(&PsProcessListHead); KeInitializeSpinLock(&PsProcessListLock); + KeInitializeSpinLock(&PsNotifyListLock); + + RtlZeroMemory(PiProcessNotifyRoutine, sizeof(PiProcessNotifyRoutine)); + RtlZeroMemory(PiLoadImageNotifyRoutine, sizeof(PiLoadImageNotifyRoutine)); /* * Initialize the system process @@ -913,6 +923,8 @@ NtCreateProcess(OUT PHANDLE ProcessHandle, &Message); } #endif + + PspRunCreateProcessNotifyRoutines(Process, TRUE); ObDereferenceObject(Process); ObDereferenceObject(ParentProcess); @@ -1572,10 +1584,13 @@ PspRunCreateProcessNotifyRoutines ULONG i; HANDLE ProcessId = (HANDLE)CurrentProcess->UniqueProcessId; HANDLE ParentId = CurrentProcess->InheritedFromUniqueProcessId; + KIRQL oldIrql; + KeAcquireSpinLock(&PsNotifyListLock, &oldIrql); for(i = 0; i < MAX_PROCESS_NOTIFY_ROUTINE_COUNT; ++ i) if(PiProcessNotifyRoutine[i]) PiProcessNotifyRoutine[i](ParentId, ProcessId, Create); + KeReleaseSpinLock(&PsNotifyListLock, oldIrql); } /* @@ -1586,7 +1601,9 @@ PsSetCreateProcessNotifyRoutine(IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine, IN BOOLEAN Remove) { ULONG i; + KIRQL oldIrql; + KeAcquireSpinLock(&PsNotifyListLock, &oldIrql); if (Remove) { for(i=0;i<MAX_PROCESS_NOTIFY_ROUTINE_COUNT;i++) @@ -1598,6 +1615,7 @@ PsSetCreateProcessNotifyRoutine(IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine, } } + KeReleaseSpinLock(&PsNotifyListLock, oldIrql); return(STATUS_SUCCESS); } @@ -1611,6 +1629,8 @@ PsSetCreateProcessNotifyRoutine(IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine, } } + KeReleaseSpinLock(&PsNotifyListLock, oldIrql); + if (i == MAX_PROCESS_NOTIFY_ROUTINE_COUNT) { return STATUS_INSUFFICIENT_RESOURCES; @@ -1619,4 +1639,48 @@ PsSetCreateProcessNotifyRoutine(IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine, return STATUS_SUCCESS; } +VOID STDCALL +PspRunLoadImageNotifyRoutines( + PUNICODE_STRING FullImageName, + HANDLE ProcessId, + PIMAGE_INFO ImageInfo) +{ + ULONG i; + KIRQL oldIrql; + + KeAcquireSpinLock(&PsNotifyListLock, &oldIrql); + for (i = 0; i < MAX_PROCESS_NOTIFY_ROUTINE_COUNT; ++ i) + if (PiLoadImageNotifyRoutine[i]) + PiLoadImageNotifyRoutine[i](FullImageName, ProcessId, ImageInfo); + KeReleaseSpinLock(&PsNotifyListLock, oldIrql); +} + +/* + * @implemented + */ +NTSTATUS STDCALL +PsSetLoadImageNotifyRoutine(IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine) +{ + ULONG i; + KIRQL oldIrql; + + KeAcquireSpinLock(&PsNotifyListLock, &oldIrql); + for (i = 0; i < MAX_LOAD_IMAGE_NOTIFY_ROUTINE_COUNT; i++) + { + if (PiLoadImageNotifyRoutine[i] == NULL) + { + PiLoadImageNotifyRoutine[i] = NotifyRoutine; + break; + } + } + KeReleaseSpinLock(&PsNotifyListLock, oldIrql); + + if (i == MAX_PROCESS_NOTIFY_ROUTINE_COUNT) + { + return STATUS_INSUFFICIENT_RESOURCES; + } + + return STATUS_SUCCESS; +} + /* EOF */ From 8aad97315177acd15b4ed5e3947722a5d8757df3 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 7 Mar 2004 20:33:25 +0000 Subject: [PATCH 0364/1463] - Changed DbgPrint to DPRINT in DriverEntry. svn path=/trunk/; revision=8576 --- reactos/drivers/fs/ms/msfs.c | 4 ++-- reactos/drivers/fs/np/npfs.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/drivers/fs/ms/msfs.c b/reactos/drivers/fs/ms/msfs.c index 8ca52639ba5..6ad125c4c1c 100644 --- a/reactos/drivers/fs/ms/msfs.c +++ b/reactos/drivers/fs/ms/msfs.c @@ -1,4 +1,4 @@ -/* $Id: msfs.c,v 1.7 2004/02/10 16:22:56 navaraf Exp $ +/* $Id: msfs.c,v 1.8 2004/03/07 20:33:25 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -27,7 +27,7 @@ DriverEntry(PDRIVER_OBJECT DriverObject, UNICODE_STRING DeviceName; NTSTATUS Status; - DbgPrint("Mailslot FSD 0.0.1\n"); + DPRINT("Mailslot FSD 0.0.1\n"); DriverObject->Flags = 0; DriverObject->MajorFunction[IRP_MJ_CREATE] = MsfsCreate; diff --git a/reactos/drivers/fs/np/npfs.c b/reactos/drivers/fs/np/npfs.c index ebfceb7ce3f..3a2f20e2ab4 100644 --- a/reactos/drivers/fs/np/npfs.c +++ b/reactos/drivers/fs/np/npfs.c @@ -1,4 +1,4 @@ -/* $Id: npfs.c,v 1.8 2004/02/10 16:22:56 navaraf Exp $ +/* $Id: npfs.c,v 1.9 2004/03/07 20:33:25 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -26,7 +26,7 @@ DriverEntry(PDRIVER_OBJECT DriverObject, UNICODE_STRING DeviceName; NTSTATUS Status; - DbgPrint("Named Pipe FSD 0.0.2\n"); + DPRINT("Named Pipe FSD 0.0.2\n"); DriverObject->MajorFunction[IRP_MJ_CREATE] = NpfsCreate; DriverObject->MajorFunction[IRP_MJ_CREATE_NAMED_PIPE] = From 84269ab2d2262195bdeb1dc354e7c2780e75327f Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 7 Mar 2004 20:38:17 +0000 Subject: [PATCH 0365/1463] - Fixed MapWindowPoints for NULL window handles. svn path=/trunk/; revision=8577 --- reactos/lib/user32/windows/window.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/reactos/lib/user32/windows/window.c b/reactos/lib/user32/windows/window.c index 00665eb8aac..04d63eb9595 100644 --- a/reactos/lib/user32/windows/window.c +++ b/reactos/lib/user32/windows/window.c @@ -1,4 +1,4 @@ -/* $Id: window.c,v 1.100 2004/02/26 22:52:05 weiden Exp $ +/* $Id: window.c,v 1.101 2004/03/07 20:38:17 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -1375,10 +1375,19 @@ MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints) LONG XMove, YMove; ULONG i; + if (hWndFrom == NULL) + { + FromOffset.x = FromOffset.y = 0; + } else if(!NtUserGetClientOrigin(hWndFrom, &FromOffset)) { return 0; } + + if (hWndTo == NULL) + { + ToOffset.x = ToOffset.y = 0; + } else if(!NtUserGetClientOrigin(hWndTo, &ToOffset)) { return 0; From 11897d4d87270aa73e99b4921140abd0ba108f91 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sun, 7 Mar 2004 21:00:11 +0000 Subject: [PATCH 0366/1463] - Implemented double buffering for a console windows. Currently the second buffer is a memory bitmap. All screen buffer updates does also write to the bitmap and the screen is updated by invalidating the update region. The previous version has released the screen buffer lock while scrolling up. It is not possible to release the lock while a write to the screen buffer is in progress. If the text output routines are faster, we should change the second buffer from a bitmap to character array. svn path=/trunk/; revision=8578 --- reactos/subsys/csrss/win32csr/guiconsole.c | 172 +++++++++++++-------- reactos/subsys/csrss/win32csr/guiconsole.h | 4 +- 2 files changed, 111 insertions(+), 65 deletions(-) diff --git a/reactos/subsys/csrss/win32csr/guiconsole.c b/reactos/subsys/csrss/win32csr/guiconsole.c index 8a0c57088ea..17f72435c89 100644 --- a/reactos/subsys/csrss/win32csr/guiconsole.c +++ b/reactos/subsys/csrss/win32csr/guiconsole.c @@ -1,4 +1,4 @@ -/* $Id: guiconsole.c,v 1.10 2004/02/04 00:05:46 gvg Exp $ +/* $Id: guiconsole.c,v 1.11 2004/03/07 21:00:11 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -29,6 +29,9 @@ typedef struct GUI_CONSOLE_DATA_TAG PWCHAR LineBuffer; BOOL CursorBlinkOn; BOOL ForceCursorOff; + CRITICAL_SECTION Lock; + HDC MemoryDC; + HBITMAP MemoryBitmap; } GUI_CONSOLE_DATA, *PGUI_CONSOLE_DATA; #ifndef WM_APP @@ -37,8 +40,6 @@ typedef struct GUI_CONSOLE_DATA_TAG #define PM_CREATE_CONSOLE (WM_APP + 1) #define PM_DESTROY_CONSOLE (WM_APP + 2) -#define PM_COPY_REGION (WM_APP + 100) - #define CURSOR_BLINK_TIME 500 static BOOL Initialized = FALSE; @@ -62,8 +63,9 @@ GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create) HDC Dc; HFONT OldFont; TEXTMETRICW Metrics; + NTSTATUS Status; - GuiData = HeapAlloc(Win32CsrApiHeap, 0, + GuiData = HeapAlloc(Win32CsrApiHeap, HEAP_ZERO_MEMORY, sizeof(GUI_CONSOLE_DATA) + (Console->Size.X + 1) * sizeof(WCHAR)); if (NULL == GuiData) @@ -71,6 +73,15 @@ GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create) DPRINT1("GuiConsoleNcCreate: HeapAlloc failed\n"); return FALSE; } + + Status = RtlInitializeCriticalSection(&GuiData->Lock); + if (!NT_SUCCESS(Status)) + { + DPRINT1("RtlInitializeCriticalSection failed, Status=%x\n", Status); + HeapFree(Win32CsrApiHeap, 0, GuiData); + return FALSE; + } + GuiData->LineBuffer = (PWCHAR)(GuiData + 1); GuiData->Font = CreateFontW(12, 0, 0, TA_BASELINE, FW_NORMAL, @@ -81,6 +92,7 @@ GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create) if (NULL == GuiData->Font) { DPRINT1("GuiConsoleNcCreate: CreateFont failed\n"); + RtlDeleteCriticalSection(&GuiData->Lock); HeapFree(Win32CsrApiHeap, 0, GuiData); return FALSE; } @@ -88,6 +100,8 @@ GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create) if (NULL == Dc) { DPRINT1("GuiConsoleNcCreate: GetDC failed\n"); + DeleteObject(GuiData->Font); + RtlDeleteCriticalSection(&GuiData->Lock); HeapFree(Win32CsrApiHeap, 0, GuiData); return FALSE; } @@ -96,6 +110,8 @@ GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create) { DPRINT1("GuiConsoleNcCreate: SelectObject failed\n"); ReleaseDC(hWnd, Dc); + DeleteObject(GuiData->Font); + RtlDeleteCriticalSection(&GuiData->Lock); HeapFree(Win32CsrApiHeap, 0, GuiData); return FALSE; } @@ -104,12 +120,23 @@ GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create) DPRINT1("GuiConsoleNcCreate: GetTextMetrics failed\n"); SelectObject(Dc, OldFont); ReleaseDC(hWnd, Dc); + DeleteObject(GuiData->Font); + RtlDeleteCriticalSection(&GuiData->Lock); HeapFree(Win32CsrApiHeap, 0, GuiData); return FALSE; } GuiData->CharWidth = Metrics.tmMaxCharWidth; GuiData->CharHeight = Metrics.tmHeight + Metrics.tmExternalLeading; SelectObject(Dc, OldFont); + + GuiData->MemoryDC = CreateCompatibleDC(Dc); + GuiData->MemoryBitmap = CreateCompatibleBitmap(Dc, + Console->Size.X * GuiData->CharWidth, + Console->Size.Y * GuiData->CharHeight); + DeleteObject(SelectObject(GuiData->MemoryDC, GuiData->MemoryBitmap)); + DeleteObject(SelectObject(GuiData->MemoryDC, GuiData->Font)); + + ReleaseDC(hWnd, Dc); GuiData->CursorBlinkOn = TRUE; GuiData->ForceCursorOff = FALSE; @@ -161,17 +188,15 @@ GuiConsoleGetLogicalCursorPos(PCSRSS_SCREEN_BUFFER Buff, ULONG *CursorX, ULONG * } } -static VOID FASTCALL -GuiConsoleHandlePaint(HWND hWnd) +VOID FASTCALL +GuiConsoleUpdateBitmap(HWND hWnd, RECT rc) { - PAINTSTRUCT Ps; - HDC Dc; PCSRSS_CONSOLE Console; PGUI_CONSOLE_DATA GuiData; PCSRSS_SCREEN_BUFFER Buff; - unsigned TopLine, BottomLine, LeftChar, RightChar; - unsigned Line, Char, Start; - HFONT OldFont; + HDC Dc; + ULONG TopLine, BottomLine, LeftChar, RightChar; + ULONG Line, Char, Start; PBYTE From; PWCHAR To; BYTE LastAttribute, Attribute; @@ -182,23 +207,24 @@ GuiConsoleHandlePaint(HWND hWnd) if (NULL != Console && NULL != GuiData && NULL != Console->ActiveBuffer) { Buff = Console->ActiveBuffer; - EnterCriticalSection(&(Buff->Header.Lock)); - - Dc = BeginPaint(hWnd, &Ps); - if (Ps.rcPaint.right <= Ps.rcPaint.left || Ps.rcPaint.bottom <= Ps.rcPaint.top) + EnterCriticalSection(&Buff->Header.Lock); + Dc = GetDC(hWnd); + if (rc.right <= rc.left || rc.bottom <= rc.top) { - EndPaint(hWnd, &Ps); - LeaveCriticalSection(&(Buff->Header.Lock)); + ReleaseDC(hWnd, Dc); + LeaveCriticalSection(&Buff->Header.Lock); return; } - OldFont = SelectObject(Dc, GuiData->Font); - TopLine = Ps.rcPaint.top / GuiData->CharHeight; - BottomLine = (Ps.rcPaint.bottom + (GuiData->CharHeight - 1)) / GuiData->CharHeight - 1; - LeftChar = Ps.rcPaint.left / GuiData->CharWidth; - RightChar = (Ps.rcPaint.right + (GuiData->CharWidth - 1)) / GuiData->CharWidth - 1; + EnterCriticalSection(&GuiData->Lock); + + TopLine = rc.top / GuiData->CharHeight; + BottomLine = (rc.bottom + (GuiData->CharHeight - 1)) / GuiData->CharHeight - 1; + LeftChar = rc.left / GuiData->CharWidth; + RightChar = (rc.right + (GuiData->CharWidth - 1)) / GuiData->CharWidth - 1; LastAttribute = Buff->Buffer[(TopLine * Buff->MaxX + LeftChar) * 2 + 1]; - GuiConsoleSetTextColors(Dc, LastAttribute); + GuiConsoleSetTextColors(GuiData->MemoryDC, LastAttribute); + for (Line = TopLine; Line <= BottomLine; Line++) { if (Line + Buff->ShowY < Buff->MaxY) @@ -217,14 +243,14 @@ GuiConsoleHandlePaint(HWND hWnd) { if (*(From + 1) != Attribute) { - TextOutW(Dc, Start * GuiData->CharWidth, Line * GuiData->CharHeight, + TextOutW(GuiData->MemoryDC, Start * GuiData->CharWidth, Line * GuiData->CharHeight, GuiData->LineBuffer, Char - Start); Start = Char; To = GuiData->LineBuffer; Attribute = *(From + 1); if (Attribute != LastAttribute) { - GuiConsoleSetTextColors(Dc, Attribute); + GuiConsoleSetTextColors(GuiData->MemoryDC, Attribute); LastAttribute = Attribute; } } @@ -233,12 +259,10 @@ GuiConsoleHandlePaint(HWND hWnd) To++; From += 2; } - TextOutW(Dc, Start * GuiData->CharWidth, Line * GuiData->CharHeight, + TextOutW(GuiData->MemoryDC, Start * GuiData->CharWidth, Line * GuiData->CharHeight, GuiData->LineBuffer, RightChar - Start + 1); } - SelectObject(Dc, OldFont); - if (Buff->CursorInfo.bVisible && GuiData->CursorBlinkOn &&! GuiData->ForceCursorOff) { @@ -253,22 +277,47 @@ GuiConsoleHandlePaint(HWND hWnd) } From = Buff->Buffer + (Buff->CurrentY * Buff->MaxX + Buff->CurrentX) * 2 + 1; CursorBrush = CreateSolidBrush(GuiConsoleRGBFromAttribute(*From)); - OldBrush = SelectObject(Dc, CursorBrush); - PatBlt(Dc, CursorX * GuiData->CharWidth, + OldBrush = SelectObject(GuiData->MemoryDC, CursorBrush); + PatBlt(GuiData->MemoryDC, CursorX * GuiData->CharWidth, CursorY * GuiData->CharHeight + (GuiData->CharHeight - CursorHeight), GuiData->CharWidth, CursorHeight, PATCOPY); - SelectObject(Dc, OldBrush); + SelectObject(GuiData->MemoryDC, OldBrush); DeleteObject(CursorBrush); } } - EndPaint(hWnd, &Ps); - LeaveCriticalSection(&(Buff->Header.Lock)); + LeaveCriticalSection(&GuiData->Lock); + ReleaseDC(hWnd, Dc); + LeaveCriticalSection(&Buff->Header.Lock); + InvalidateRect(hWnd, &rc, FALSE); + } + +} + +VOID FASTCALL +GuiConsoleHandlePaint(HWND hWnd) +{ + PAINTSTRUCT Ps; + HDC Dc; + PCSRSS_CONSOLE Console; + PGUI_CONSOLE_DATA GuiData; + + GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); + if (NULL != Console && NULL != GuiData) + { + EnterCriticalSection(&GuiData->Lock); + Dc = BeginPaint (hWnd, &Ps); + BitBlt(Dc, Ps.rcPaint.left, Ps.rcPaint.top, + Ps.rcPaint.right - Ps.rcPaint.left + 1, + Ps.rcPaint.bottom - Ps.rcPaint.top + 1, GuiData->MemoryDC, + Ps.rcPaint.left, Ps.rcPaint.top, SRCCOPY); + EndPaint (hWnd, &Ps); + LeaveCriticalSection(&GuiData->Lock); } else { - Dc = BeginPaint(hWnd, &Ps); - EndPaint(hWnd, &Ps); + Dc = BeginPaint (hWnd, &Ps); + EndPaint (hWnd, &Ps); } } @@ -288,25 +337,6 @@ GuiConsoleHandleKey(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) ConioProcessKey(&Message, Console, FALSE); } -static VOID FASTCALL -GuiConsoleHandleCopyRegion(HWND hWnd, PRECT Source, PRECT Dest) -{ - RECT ClientRect, ScrollRect; - PGUI_CONSOLE_DATA GuiData; - PCSRSS_CONSOLE Console; - - GetClientRect(hWnd, &ClientRect); - GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); - ScrollRect.left = min(Source->left, Dest->left) * GuiData->CharWidth; - ScrollRect.top = min(Source->top, Dest->top) * GuiData->CharHeight; - ScrollRect.right = max(Source->right, Dest->right) * GuiData->CharWidth; - ScrollRect.bottom = max(Source->bottom, Dest->bottom) * GuiData->CharHeight; - ScrollWindow(hWnd, - (Dest->left - Source->left) * GuiData->CharWidth, - (Dest->top - Source->top) * GuiData->CharHeight, - &ScrollRect, &ClientRect); -} - static VOID FASTCALL GuiIntDrawRegion(PGUI_CONSOLE_DATA GuiData, HWND Wnd, RECT *Region) { @@ -317,7 +347,7 @@ GuiIntDrawRegion(PGUI_CONSOLE_DATA GuiData, HWND Wnd, RECT *Region) RegionRect.right = (Region->right + 1) * GuiData->CharWidth; RegionRect.bottom = (Region->bottom + 1) * GuiData->CharHeight; - InvalidateRect(Wnd, &RegionRect, FALSE); + GuiConsoleUpdateBitmap(Wnd, RegionRect); } static VOID STDCALL @@ -371,7 +401,7 @@ GuiWriteStream(PCSRSS_CONSOLE Console, RECT *Region, UINT CursorStartX, UINT Cur Dest.right = Console->Size.X - 1; Dest.bottom = Region->top - 1; - GuiConsoleCopyRegion(Console, &Source, &Dest); + GuiConsoleCopyRegion(Console->hWindow, &Source, &Dest); } GuiIntDrawRegion(GuiData, Console->hWindow, Region); @@ -467,6 +497,8 @@ GuiConsoleHandleNcDestroy(HWND hWnd) GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); KillTimer(hWnd, 1); Console->PrivateData = NULL; + DeleteDC(GuiData->MemoryDC); + RtlDeleteCriticalSection(&GuiData->Lock); HeapFree(Win32CsrApiHeap, 0, GuiData); } @@ -496,9 +528,6 @@ GuiConsoleWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) GuiConsoleHandleTimer(hWnd); Result = 0; break; - case PM_COPY_REGION: - GuiConsoleHandleCopyRegion(hWnd, (PRECT) wParam, (PRECT) lParam); - break; case WM_CLOSE: GuiConsoleHandleClose(hWnd); Result = 0; @@ -744,6 +773,7 @@ GuiInitConsole(PCSRSS_CONSOLE Console) DPRINT1("Win32Csr: Failed to create graphics console thread. Expect problems\n"); return STATUS_UNSUCCESSFUL; } + SetThreadPriority(ThreadHandle, THREAD_PRIORITY_HIGHEST); CloseHandle(ThreadHandle); WaitForSingleObject(GraphicsStartupEvent, INFINITE); @@ -762,13 +792,29 @@ GuiInitConsole(PCSRSS_CONSOLE Console) } VOID STDCALL -GuiConsoleCopyRegion(PCSRSS_CONSOLE Console, +GuiConsoleCopyRegion(HWND hWnd, RECT *Source, RECT *Dest) { - LeaveCriticalSection(&(Console->ActiveBuffer->Header.Lock)); - SendMessageW(Console->hWindow, PM_COPY_REGION, (WPARAM) Source, (LPARAM) Dest); - EnterCriticalSection(&(Console->ActiveBuffer->Header.Lock)); + RECT ScrollRect; + PGUI_CONSOLE_DATA GuiData; + PCSRSS_CONSOLE Console; + + + GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); + + ScrollRect.left = Dest->left * GuiData->CharWidth; + ScrollRect.right = (Dest->right + 1) * GuiData->CharWidth; + ScrollRect.top = Dest->top * GuiData->CharHeight; + ScrollRect.bottom = (Dest->bottom + 1) * GuiData->CharHeight; + EnterCriticalSection(&GuiData->Lock); + BitBlt(GuiData->MemoryDC, ScrollRect.left, ScrollRect.top, + ScrollRect.right - ScrollRect.left, ScrollRect.bottom - ScrollRect.top, + GuiData->MemoryDC, Source->left * GuiData->CharWidth, Source->top * GuiData->CharHeight, SRCCOPY); + + LeaveCriticalSection(&GuiData->Lock); + + InvalidateRect(hWnd, &ScrollRect, FALSE); } /* EOF */ diff --git a/reactos/subsys/csrss/win32csr/guiconsole.h b/reactos/subsys/csrss/win32csr/guiconsole.h index 578ab6625a4..440a0b24e83 100644 --- a/reactos/subsys/csrss/win32csr/guiconsole.h +++ b/reactos/subsys/csrss/win32csr/guiconsole.h @@ -1,4 +1,4 @@ -/* $Id: guiconsole.h,v 1.2 2004/01/11 17:31:16 gvg Exp $ +/* $Id: guiconsole.h,v 1.3 2004/03/07 21:00:11 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -10,7 +10,7 @@ extern NTSTATUS FASTCALL GuiInitConsole(PCSRSS_CONSOLE Console); extern VOID STDCALL GuiConsoleDrawRegion(PCSRSS_CONSOLE Console, SMALL_RECT Region); -extern VOID STDCALL GuiConsoleCopyRegion(PCSRSS_CONSOLE Console, +extern VOID STDCALL GuiConsoleCopyRegion(HWND hWnd, RECT *Source, RECT *Dest); extern VOID STDCALL GuiConsoleChangeTitle(PCSRSS_CONSOLE Console); From c0b4d77eb9b4424c73631f015a869ed7e46c67aa Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 7 Mar 2004 21:09:08 +0000 Subject: [PATCH 0367/1463] - Removed the spinlock I added in my last patch, it's wrong! svn path=/trunk/; revision=8579 --- reactos/ntoskrnl/ps/process.c | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/reactos/ntoskrnl/ps/process.c b/reactos/ntoskrnl/ps/process.c index 44c7ace077a..e29f69536f2 100644 --- a/reactos/ntoskrnl/ps/process.c +++ b/reactos/ntoskrnl/ps/process.c @@ -1,4 +1,4 @@ -/* $Id: process.c,v 1.125 2004/03/07 20:31:53 navaraf Exp $ +/* $Id: process.c,v 1.126 2004/03/07 21:09:08 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -55,8 +55,6 @@ static GENERIC_MAPPING PiProcessMapping = {PROCESS_READ, #define MAX_PROCESS_NOTIFY_ROUTINE_COUNT 8 #define MAX_LOAD_IMAGE_NOTIFY_ROUTINE_COUNT 8 -static KSPIN_LOCK PsNotifyListLock; - static PCREATE_PROCESS_NOTIFY_ROUTINE PiProcessNotifyRoutine[MAX_PROCESS_NOTIFY_ROUTINE_COUNT]; static PLOAD_IMAGE_NOTIFY_ROUTINE @@ -274,7 +272,6 @@ PsInitProcessManagment(VOID) InitializeListHead(&PsProcessListHead); KeInitializeSpinLock(&PsProcessListLock); - KeInitializeSpinLock(&PsNotifyListLock); RtlZeroMemory(PiProcessNotifyRoutine, sizeof(PiProcessNotifyRoutine)); RtlZeroMemory(PiLoadImageNotifyRoutine, sizeof(PiLoadImageNotifyRoutine)); @@ -1584,13 +1581,10 @@ PspRunCreateProcessNotifyRoutines ULONG i; HANDLE ProcessId = (HANDLE)CurrentProcess->UniqueProcessId; HANDLE ParentId = CurrentProcess->InheritedFromUniqueProcessId; - KIRQL oldIrql; - KeAcquireSpinLock(&PsNotifyListLock, &oldIrql); for(i = 0; i < MAX_PROCESS_NOTIFY_ROUTINE_COUNT; ++ i) if(PiProcessNotifyRoutine[i]) PiProcessNotifyRoutine[i](ParentId, ProcessId, Create); - KeReleaseSpinLock(&PsNotifyListLock, oldIrql); } /* @@ -1601,9 +1595,7 @@ PsSetCreateProcessNotifyRoutine(IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine, IN BOOLEAN Remove) { ULONG i; - KIRQL oldIrql; - KeAcquireSpinLock(&PsNotifyListLock, &oldIrql); if (Remove) { for(i=0;i<MAX_PROCESS_NOTIFY_ROUTINE_COUNT;i++) @@ -1615,7 +1607,6 @@ PsSetCreateProcessNotifyRoutine(IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine, } } - KeReleaseSpinLock(&PsNotifyListLock, oldIrql); return(STATUS_SUCCESS); } @@ -1629,8 +1620,6 @@ PsSetCreateProcessNotifyRoutine(IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine, } } - KeReleaseSpinLock(&PsNotifyListLock, oldIrql); - if (i == MAX_PROCESS_NOTIFY_ROUTINE_COUNT) { return STATUS_INSUFFICIENT_RESOURCES; @@ -1646,13 +1635,10 @@ PspRunLoadImageNotifyRoutines( PIMAGE_INFO ImageInfo) { ULONG i; - KIRQL oldIrql; - KeAcquireSpinLock(&PsNotifyListLock, &oldIrql); for (i = 0; i < MAX_PROCESS_NOTIFY_ROUTINE_COUNT; ++ i) if (PiLoadImageNotifyRoutine[i]) PiLoadImageNotifyRoutine[i](FullImageName, ProcessId, ImageInfo); - KeReleaseSpinLock(&PsNotifyListLock, oldIrql); } /* @@ -1662,9 +1648,7 @@ NTSTATUS STDCALL PsSetLoadImageNotifyRoutine(IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine) { ULONG i; - KIRQL oldIrql; - KeAcquireSpinLock(&PsNotifyListLock, &oldIrql); for (i = 0; i < MAX_LOAD_IMAGE_NOTIFY_ROUTINE_COUNT; i++) { if (PiLoadImageNotifyRoutine[i] == NULL) @@ -1673,7 +1657,6 @@ PsSetLoadImageNotifyRoutine(IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine) break; } } - KeReleaseSpinLock(&PsNotifyListLock, oldIrql); if (i == MAX_PROCESS_NOTIFY_ROUTINE_COUNT) { From 0e200b6f991b2efafb84ec8b48c880df02025688 Mon Sep 17 00:00:00 2001 From: Andrew Greenwood <silverblade@reactos.org> Date: Sun, 7 Mar 2004 22:13:51 +0000 Subject: [PATCH 0368/1463] * Fixed co-ordinate translation for windows that have been moved, adjusting the co-ordinates to take into account the window captions. NOTE: Menu item tracking is still broken for windows that have been moved. Eg, if you move a window, click on a menu, then move the mouse pointer over another item, the new menu will NOT open unless you click. svn path=/trunk/; revision=8580 --- reactos/lib/user32/windows/menu.c | 39 +++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/reactos/lib/user32/windows/menu.c b/reactos/lib/user32/windows/menu.c index fe85317d018..7775916875c 100644 --- a/reactos/lib/user32/windows/menu.c +++ b/reactos/lib/user32/windows/menu.c @@ -21,7 +21,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: menu.c,v 1.51 2004/02/23 20:10:01 gvg Exp $ +/* $Id: menu.c,v 1.52 2004/03/07 22:13:51 silverblade Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/menu.c @@ -48,6 +48,7 @@ #include "../controls/controls.h" #define NDEBUG +//#define DBG #include <debug.h> /* internal popup menu window messages */ @@ -435,7 +436,7 @@ MenuDrawMenuItem(HWND Wnd, PROSMENUINFO MenuInfo, HWND WndOwner, HDC Dc, dis.hDC = Dc; dis.rcItem = Item->Rect; DPRINT("Ownerdraw: owner=%p itemID=%d, itemState=%d, itemAction=%d, " - "hwndItem=%p, hdc=%p, rcItem={%ld,%ld,%ld,%ld}\n", hwndOwner, + "hwndItem=%p, hdc=%p, rcItem={%ld,%ld,%ld,%ld}\n", WndOwner, dis.itemID, dis.itemState, dis.itemAction, dis.hwndItem, dis.hDC, dis.rcItem.left, dis.rcItem.top, dis.rcItem.right, dis.rcItem.bottom); @@ -443,8 +444,8 @@ MenuDrawMenuItem(HWND Wnd, PROSMENUINFO MenuInfo, HWND WndOwner, HDC Dc, /* Fall through to draw popup-menu arrow */ } - DPRINT("rect={%ld,%ld,%ld,%ld}\n", Item->rect.left, Item->rect.top, - Item->rect.right, Item->rect.bottom); +// DPRINT("rect={%ld,%ld,%ld,%ld}\n", Item->rect.left, Item->rect.top, +// Item->rect.right, Item->rect.bottom); if (MenuBar && 0 != (Item->fType & MF_SEPARATOR)) { @@ -1887,7 +1888,7 @@ MenuMoveSelection(HWND WndOwner, PROSMENUINFO MenuInfo, INT Offset) INT i; ROSMENUITEMINFO ItemInfo; - DPRINT("hwnd=%x menu=%x off=0x%04x\n", WndOwner, MenuInfo, offset); + DPRINT("hwnd=%x menu=%x off=0x%04x\n", WndOwner, MenuInfo, Offset); MenuInitRosMenuItemInfo(&ItemInfo); if (NO_SELECTED_ITEM != MenuInfo->FocusedItem) @@ -2339,12 +2340,16 @@ MenuPtMenu(HMENU Menu, POINT Pt) ROSMENUITEMINFO ItemInfo; HMENU Ret = NULL; INT Ht; - + if (! MenuGetRosMenuInfo(&MenuInfo, Menu)) { return NULL; } +// ScreenToClient(MenuInfo.Wnd, &Pt); + + DPRINT("MenuPtMenu X %d Y %d\n", Pt.x, Pt.y); + /* try subpopup first (if any) */ if (NO_SELECTED_ITEM != MenuInfo.FocusedItem) { @@ -2365,6 +2370,9 @@ MenuPtMenu(HMENU Menu, POINT Pt) /* check the current window (avoiding WM_HITTEST) */ Ht = DefWndNCHitTest(MenuInfo.Wnd, Pt); + + DPRINT("Hit test == %d\n", Ht); + if (0 != (MenuInfo.Flags & MF_POPUP )) { if (HTNOWHERE != Ht && HTERROR != Ht) @@ -2996,6 +3004,7 @@ MenuTrackMenu(HMENU Menu, UINT Flags, INT x, INT y, Mt.CurrentMenu = Menu; Mt.TopMenu = Menu; Mt.OwnerWnd = Wnd; + Mt.Pt.x = x; Mt.Pt.y = y; @@ -3345,7 +3354,7 @@ MenuTrackMenu(HMENU Menu, UINT Flags, INT x, INT y, static BOOL FASTCALL MenuExitTracking(HWND Wnd) { - DPRINT("hwnd=%p\n", hWnd); + DPRINT("hwnd=%p\n", Wnd); SendMessageW(Wnd, WM_EXITMENULOOP, 0, 0); ShowCaret(0); @@ -3359,21 +3368,27 @@ MenuTrackMouseMenuBar(HWND Wnd, ULONG Ht, POINT Pt) HMENU Menu = (HTSYSMENU == Ht) ? NtUserGetSystemMenu(Wnd, FALSE) : GetMenu(Wnd); UINT Flags = TPM_ENTERIDLEEX | TPM_BUTTONDOWN | TPM_LEFTALIGN | TPM_LEFTBUTTON; - DPRINT("wnd=%p ht=0x%04x (%ld,%ld)\n", Wnd, Ht, pt.x, pt.y); + DPRINT("wnd=%p ht=0x%04x (%ld,%ld)\n", Wnd, Ht, Pt.x, Pt.y); if (IsMenu(Menu)) { + DPRINT("Is a menu\n"); /* map point to parent client coordinates */ HWND Parent = GetAncestor(Wnd, GA_PARENT ); - if (Parent != GetDesktopWindow()) - { - ScreenToClient(Parent, &Pt); - } +// if (Parent != GetDesktopWindow()) // this doesn't work? +// { + MapWindowPoints(Parent, Wnd, &Pt, 1); + Pt.y += (GetSystemMetrics(SM_CYCAPTION)-1) * 2; // is this ok? +// ScreenToClient(Wnd, &Pt); // wnd = parent + DPRINT("MapWindowPoints == %d %d\n", Pt.x, Pt.y); +// } +// else DPRINT("Is desktop window\n"); MenuInitTracking(Wnd, Menu, FALSE, Flags); MenuTrackMenu(Menu, Flags, Pt.x, Pt.y, Wnd, NULL); MenuExitTracking(Wnd); } + else DPRINT("Is NOT a menu\n"); } From 2f224f7360ed6facdb3c76aa7435b35ee820961f Mon Sep 17 00:00:00 2001 From: James Tabor <james.tabor@reactos.org> Date: Mon, 8 Mar 2004 04:09:02 +0000 Subject: [PATCH 0369/1463] Change NonPagedPool for AllocateBuffer and implemented GetVersion for David Welch. svn path=/trunk/; revision=8581 --- reactos/drivers/video/videoprt/videoprt.c | 32 ++++++++++++++++++----- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index 354b386a9fd..0d0edf337c1 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.9 2004/03/07 04:43:55 dwelch Exp $ + * $Id: videoprt.c,v 1.10 2004/03/08 04:09:02 jimtabor Exp $ */ #include "videoprt.h" @@ -1400,26 +1400,31 @@ VideoPortDDCMonitorHelper( return FALSE; } - +/* + * @implemented + */ VP_STATUS STDCALL VideoPortAllocateBuffer(IN PVOID HwDeviceExtension, IN ULONG Size, OUT PVOID *Buffer) { - DPRINT("VideoPortAllocateBuffer\n"); + DPRINT("VideoPortAllocateBuffer()\n"); - Buffer = ExAllocatePool (PagedPool, Size) ; + Buffer = ExAllocatePool (NonPagedPool, Size) ; return STATUS_SUCCESS; } +/* + * @implemented + */ VOID STDCALL VideoPortReleaseBuffer( IN PVOID HwDeviceExtension, IN PVOID Ptr) { - DPRINT("VideoPortReleaseBuffer\n"); + DPRINT("VideoPortReleaseBuffer()\n"); ExFreePool(Ptr); } @@ -1591,12 +1596,27 @@ VideoPortGetDmaAdapter ( IN PVOID HwDeviceExtension, return NULL; } + +/* + * @implemented + */ VP_STATUS STDCALL VideoPortGetVersion ( IN PVOID HwDeviceExtension, IN OUT PVPOSVERSIONINFO VpOsVersionInfo ) { - DPRINT1("VideoPortGetVersion(): Unimplemented.\n"); +PPEB Peb; + + DPRINT1("VideoPortGetVersion()\n"); + + Peb = NtCurrentPeb(); + + VpOsVersionInfo->MajorVersion = Peb->OSMajorVersion; + VpOsVersionInfo->MinorVersion = Peb->OSMinorVersion; + VpOsVersionInfo->BuildNumber = Peb->OSBuildNumber; + VpOsVersionInfo->ServicePackMajor = Peb->SPMajorVersion; + VpOsVersionInfo->ServicePackMinor = Peb->SPMinorVersion; + return STATUS_UNSUCCESSFUL; } From 8311b47fe462b2617a301ef64774e79f1834ff06 Mon Sep 17 00:00:00 2001 From: James Tabor <james.tabor@reactos.org> Date: Mon, 8 Mar 2004 04:41:20 +0000 Subject: [PATCH 0370/1463] Finish changes to VideoPortGetVersion svn path=/trunk/; revision=8582 --- reactos/drivers/video/videoprt/videoprt.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index 0d0edf337c1..e144dca997e 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.10 2004/03/08 04:09:02 jimtabor Exp $ + * $Id: videoprt.c,v 1.11 2004/03/08 04:41:20 jimtabor Exp $ */ #include "videoprt.h" @@ -1605,18 +1605,24 @@ STDCALL VideoPortGetVersion ( IN PVOID HwDeviceExtension, IN OUT PVPOSVERSIONINFO VpOsVersionInfo ) { -PPEB Peb; - + PPEB Peb; + DPRINT1("VideoPortGetVersion()\n"); - + if(KeGetCurrentIrql() == PASSIVE_LEVEL) + { + if(VpOsVersionInfo->Size >= sizeof(VPOSVERSIONINFO)) + { Peb = NtCurrentPeb(); - VpOsVersionInfo->MajorVersion = Peb->OSMajorVersion; VpOsVersionInfo->MinorVersion = Peb->OSMinorVersion; VpOsVersionInfo->BuildNumber = Peb->OSBuildNumber; VpOsVersionInfo->ServicePackMajor = Peb->SPMajorVersion; VpOsVersionInfo->ServicePackMinor = Peb->SPMinorVersion; - + return STATUS_SUCCESS; + } + else + return ERROR_INVALID_PARAMETER; + } return STATUS_UNSUCCESSFUL; } From 16473a5114c166952703a1c5000648746ba44005 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Mon, 8 Mar 2004 07:04:57 +0000 Subject: [PATCH 0371/1463] - Implemented event services. svn path=/trunk/; revision=8583 --- reactos/subsys/win32k/eng/event.c | 116 ++++++++++++++++++++++++++ reactos/subsys/win32k/makefile | 4 +- reactos/subsys/win32k/stubs/xpstubs.c | 64 -------------- 3 files changed, 118 insertions(+), 66 deletions(-) create mode 100644 reactos/subsys/win32k/eng/event.c diff --git a/reactos/subsys/win32k/eng/event.c b/reactos/subsys/win32k/eng/event.c new file mode 100644 index 00000000000..c04235e6886 --- /dev/null +++ b/reactos/subsys/win32k/eng/event.c @@ -0,0 +1,116 @@ +/* + * 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: event.c,v 1.1 2004/03/08 07:04:56 dwelch Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * PURPOSE: Win32k event functions + * FILE: subsys/win32k/eng/event.c + * PROGRAMER: Jason Filby + * REVISION HISTORY: + * 2/10/1999: Created + */ + +#include <ddk/winddi.h> +#include <ddk/ntddk.h> +#include <include/eng.h> +#include <include/inteng.h> +#include <include/tags.h> + +#define NDEBUG +#include <win32k/debug1.h> + +BOOL +STDCALL +EngCreateEvent ( OUT PEVENT *Event ) +{ + (*Event) = ExAllocatePool(NonPagedPool, sizeof(TAG_DRIVER)); + if ((*Event) == NULL) + { + return FALSE; + } + KeInitializeEvent((PKEVENT)(*Event), SynchronizationEvent, FALSE); + return TRUE; +} + +BOOL +STDCALL +EngDeleteEvent ( IN PEVENT Event) +{ + ExFreePool(Event); + return TRUE; +} + +PEVENT +STDCALL +EngMapEvent(IN HDEV Dev, + IN HANDLE UserObject, + IN PVOID Reserved1, + IN PVOID Reserved2, + IN PVOID Reserved3) +{ + NTSTATUS Status; + PKEVENT Event; + + Status = ObReferenceObjectByHandle(UserObject, + EVENT_MODIFY_STATE, + ExEventObjectType, + KernelMode, + (PVOID*)&Event, + NULL); + if (!NT_SUCCESS(Status)) + { + return NULL; + } + return (PEVENT)Event; +} + +LONG +STDCALL +EngSetEvent ( IN PEVENT Event ) +{ + return KeSetEvent((PKEVENT)Event, IO_NO_INCREMENT, FALSE); +} + +BOOL +STDCALL +EngUnmapEvent ( IN PEVENT Event ) +{ + ObDereferenceObject((PVOID)Event); + return TRUE; +} + +BOOL +STDCALL +EngWaitForSingleObject (IN PEVENT Event, + IN PLARGE_INTEGER TimeOut) +{ + NTSTATUS Status; + + Status = KeWaitForSingleObject(Event, + Executive, + KernelMode, + FALSE, + TimeOut); + if (Status != STATUS_SUCCESS) + { + return FALSE; + } + return TRUE; +} diff --git a/reactos/subsys/win32k/makefile b/reactos/subsys/win32k/makefile index 1a52e0eddfe..9bb1da04d55 100644 --- a/reactos/subsys/win32k/makefile +++ b/reactos/subsys/win32k/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.94 2004/02/24 01:30:57 weiden Exp $ +# $Id: makefile,v 1.95 2004/03/08 07:04:56 dwelch Exp $ PATH_TO_TOP = ../.. @@ -42,7 +42,7 @@ 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/gradient.o + eng/gradient.o eng/event.o MAIN_OBJECTS = main/dllmain.o main/svctabm.o diff --git a/reactos/subsys/win32k/stubs/xpstubs.c b/reactos/subsys/win32k/stubs/xpstubs.c index 07f7d318246..d7920ad7844 100644 --- a/reactos/subsys/win32k/stubs/xpstubs.c +++ b/reactos/subsys/win32k/stubs/xpstubs.c @@ -15,8 +15,6 @@ #define STUB(x) void x(void) { DbgPrint("WIN32K: Stub for %s\n", #x); } -typedef PVOID EVENT, *PEVENT; - BOOL STDCALL EngAlphaBlend( @@ -42,65 +40,3 @@ EngControlSprites( return FALSE; } -BOOL -STDCALL -EngCreateEvent ( OUT PEVENT *ppEvent ) -{ - // www.osr.com/ddk/graphics/gdifncs_1civ.htm - UNIMPLEMENTED; - return FALSE; -} - -BOOL -STDCALL -EngDeleteEvent ( IN PEVENT pEvent) -{ - // www.osr.com/ddk/graphics/gdifncs_6qp3.htm - UNIMPLEMENTED; - return FALSE; -} - -PEVENT -STDCALL -EngMapEvent( - IN HDEV hDev, - IN HANDLE hUserObject, - IN PVOID Reserved1, - IN PVOID Reserved2, - IN PVOID Reserved3 - ) -{ - // www.osr.com/ddk/graphics/gdifncs_3pnr.htm - UNIMPLEMENTED; - return FALSE; -} - -LONG -STDCALL -EngSetEvent ( IN PEVENT pEvent ) -{ - // www.osr.com/ddk/graphics/gdifncs_6p0n.htm - UNIMPLEMENTED; - return 0; -} - -BOOL -STDCALL -EngUnmapEvent ( IN PEVENT pEvent ) -{ - // www.osr.com/ddk/graphics/gdifncs_5m7b.htm - UNIMPLEMENTED; - return FALSE; -} - -BOOL -STDCALL -EngWaitForSingleObject ( - IN PEVENT pEvent, - IN PLARGE_INTEGER pTimeOut - ) -{ - // www.osr.com/ddk/graphics/gdifncs_4n53.htm - UNIMPLEMENTED; - return FALSE; -} From 6c8ead7315943ffd99293ff895fe03e6aca06f05 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Mon, 8 Mar 2004 07:41:27 +0000 Subject: [PATCH 0372/1463] - Added a definition for PEVENT. svn path=/trunk/; revision=8584 --- reactos/include/ddk/winddi.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/include/ddk/winddi.h b/reactos/include/ddk/winddi.h index deb43990caf..05ea9db6d87 100644 --- a/reactos/include/ddk/winddi.h +++ b/reactos/include/ddk/winddi.h @@ -34,6 +34,8 @@ typedef DWORD PTRDIFF; #endif +typedef struct _ENG_EVENT *PEVENT; + #define DM_SPECVERSION 0x0320 #define DDI_DRIVER_VERSION_NT4 0x20000 From 17ad90f8d0b873d8d8d193ac1989377b27ef2ed6 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Mon, 8 Mar 2004 08:05:27 +0000 Subject: [PATCH 0373/1463] - Implement RtlGetVersion. - Rewrite VideoPortGetVersion using RtlGetVersion. - Added debugging messages to InternalMapMemory. - Changed VideoPortAllocateBuffer back to PagedPool. svn path=/trunk/; revision=8585 --- reactos/drivers/video/videoprt/videoprt.c | 44 ++++++++-------- reactos/drivers/video/videoprt/videoprt.h | 4 +- reactos/ntoskrnl/Makefile | 3 +- reactos/ntoskrnl/ntoskrnl.def | 3 +- reactos/ntoskrnl/ntoskrnl.edf | 3 +- reactos/ntoskrnl/rtl/version.c | 63 +++++++++++++++++++++++ 6 files changed, 94 insertions(+), 26 deletions(-) create mode 100644 reactos/ntoskrnl/rtl/version.c diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index e144dca997e..8e74b316d1f 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.11 2004/03/08 04:41:20 jimtabor Exp $ + * $Id: videoprt.c,v 1.12 2004/03/08 08:05:26 navaraf Exp $ */ #include "videoprt.h" @@ -1266,6 +1266,9 @@ InternalMapMemory(IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension, PVOID MappedAddress; PLIST_ENTRY Entry; + DPRINT("- IoAddress: %lx\n", IoAddress.u.LowPart); + DPRINT("- NumberOfUchars: %lx\n", NumberOfUchars); + DPRINT("- InIoSpace: %c\n", InIoSpace); if (0 != (InIoSpace & VIDEO_MEMORY_SPACE_P6CACHE)) { DPRINT("VIDEO_MEMORY_SPACE_P6CACHE not supported, turning off\n"); @@ -1411,7 +1414,7 @@ VideoPortAllocateBuffer(IN PVOID HwDeviceExtension, { DPRINT("VideoPortAllocateBuffer()\n"); - Buffer = ExAllocatePool (NonPagedPool, Size) ; + Buffer = ExAllocatePool(PagedPool, Size); return STATUS_SUCCESS; } @@ -1605,25 +1608,24 @@ STDCALL VideoPortGetVersion ( IN PVOID HwDeviceExtension, IN OUT PVPOSVERSIONINFO VpOsVersionInfo ) { - PPEB Peb; - - DPRINT1("VideoPortGetVersion()\n"); - if(KeGetCurrentIrql() == PASSIVE_LEVEL) - { - if(VpOsVersionInfo->Size >= sizeof(VPOSVERSIONINFO)) - { - Peb = NtCurrentPeb(); - VpOsVersionInfo->MajorVersion = Peb->OSMajorVersion; - VpOsVersionInfo->MinorVersion = Peb->OSMinorVersion; - VpOsVersionInfo->BuildNumber = Peb->OSBuildNumber; - VpOsVersionInfo->ServicePackMajor = Peb->SPMajorVersion; - VpOsVersionInfo->ServicePackMinor = Peb->SPMinorVersion; - return STATUS_SUCCESS; - } - else - return ERROR_INVALID_PARAMETER; - } - return STATUS_UNSUCCESSFUL; + RTL_OSVERSIONINFOEXW Version; + + Version.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW); + if (VpOsVersionInfo->Size >= sizeof(VPOSVERSIONINFO)) + { + if (NT_SUCCESS(RtlGetVersion((PRTL_OSVERSIONINFOW)&Version))) + { + VpOsVersionInfo->MajorVersion = Version.dwMajorVersion; + VpOsVersionInfo->MinorVersion = Version.dwMinorVersion; + VpOsVersionInfo->BuildNumber = Version.dwBuildNumber; + VpOsVersionInfo->ServicePackMajor = Version.wServicePackMajor; + VpOsVersionInfo->ServicePackMinor = Version.wServicePackMinor; + return STATUS_SUCCESS; + } + return STATUS_UNSUCCESSFUL; + } + + return ERROR_INVALID_PARAMETER; } PVOID diff --git a/reactos/drivers/video/videoprt/videoprt.h b/reactos/drivers/video/videoprt/videoprt.h index 5b581cb0acd..4d358afacc6 100644 --- a/reactos/drivers/video/videoprt/videoprt.h +++ b/reactos/drivers/video/videoprt/videoprt.h @@ -18,7 +18,7 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: videoprt.h,v 1.4 2004/03/07 04:43:55 dwelch Exp $ + * $Id: videoprt.h,v 1.5 2004/03/08 08:05:26 navaraf Exp $ */ #ifndef VIDEOPRT_H @@ -28,7 +28,7 @@ #include <ddk/video.h> #include <ddk/ntddvdeo.h> #include "internal/ps.h" -#define NDEBUG +/* #define NDEBUG */ #include <debug.h> /* diff --git a/reactos/ntoskrnl/Makefile b/reactos/ntoskrnl/Makefile index 73e607e5880..3ec1c62db62 100644 --- a/reactos/ntoskrnl/Makefile +++ b/reactos/ntoskrnl/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.116 2004/03/02 22:36:17 dwelch Exp $ +# $Id: Makefile,v 1.117 2004/03/08 08:05:27 navaraf Exp $ # # ReactOS Operating System # @@ -121,6 +121,7 @@ OBJECTS_RTL = \ rtl/time.o \ rtl/timezone.o \ rtl/unicode.o \ + rtl/version.o \ rtl/wstring.o \ rtl/capture.o diff --git a/reactos/ntoskrnl/ntoskrnl.def b/reactos/ntoskrnl/ntoskrnl.def index ecedab6c9e6..55ad8d0c3d7 100644 --- a/reactos/ntoskrnl/ntoskrnl.def +++ b/reactos/ntoskrnl/ntoskrnl.def @@ -1,4 +1,4 @@ -; $Id: ntoskrnl.def,v 1.177 2004/03/07 20:31:53 navaraf Exp $ +; $Id: ntoskrnl.def,v 1.178 2004/03/08 08:05:27 navaraf Exp $ ; ; reactos/ntoskrnl/ntoskrnl.def ; @@ -777,6 +777,7 @@ RtlGetDefaultCodePage@8 ;RtlGetElementGenericTable RtlGetGroupSecurityDescriptor@12 RtlGetOwnerSecurityDescriptor@12 +RtlGetVersion@4 RtlImageNtHeader@4 RtlImageDirectoryEntryToData@16 RtlInitAnsiString@8 diff --git a/reactos/ntoskrnl/ntoskrnl.edf b/reactos/ntoskrnl/ntoskrnl.edf index b6376860b5b..689c7077100 100644 --- a/reactos/ntoskrnl/ntoskrnl.edf +++ b/reactos/ntoskrnl/ntoskrnl.edf @@ -1,4 +1,4 @@ -; $Id: ntoskrnl.edf,v 1.163 2004/03/07 20:31:53 navaraf Exp $ +; $Id: ntoskrnl.edf,v 1.164 2004/03/08 08:05:27 navaraf Exp $ ; ; reactos/ntoskrnl/ntoskrnl.def ; @@ -778,6 +778,7 @@ RtlGetDefaultCodePage=RtlGetDefaultCodePage@8 ;RtlGetElementGenericTable RtlGetGroupSecurityDescriptor=RtlGetGroupSecurityDescriptor@12 RtlGetOwnerSecurityDescriptor=RtlGetOwnerSecurityDescriptor@12 +RtlGetVersion=RtlGetVersion@4 RtlImageNtHeader=RtlImageNtHeader@4 RtlImageDirectoryEntryToData=RtlImageDirectoryEntryToData@16 RtlInitAnsiString=RtlInitAnsiString@8 diff --git a/reactos/ntoskrnl/rtl/version.c b/reactos/ntoskrnl/rtl/version.c new file mode 100644 index 00000000000..0f483fd527b --- /dev/null +++ b/reactos/ntoskrnl/rtl/version.c @@ -0,0 +1,63 @@ +/* + * 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: version.c,v 1.1 2004/03/08 08:05:27 navaraf Exp $ + * + * PROJECT: ReactOS kernel + * PURPOSE: Runtime code + * FILE: ntoskrnl/rtl/version.c + * PROGRAMER: Filip Navara + */ + +/* INCLUDES *****************************************************************/ + +#define __USE_W32API +#include <ddk/ntddk.h> +#include <internal/safe.h> + +/* FUNCTIONS ****************************************************************/ + +NTSTATUS STDCALL +RtlGetVersion(RTL_OSVERSIONINFOW *Info) +{ + PWCHAR CSDString = L"Service Pack 6"; + + if (Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOW) || + Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW)) + { + Info->dwMajorVersion = 4; + Info->dwMinorVersion = 0; + Info->dwBuildNumber = 1381; + Info->dwPlatformId = VER_PLATFORM_WIN32_NT; + MmCopyToCaller(Info->szCSDVersion, CSDString, sizeof(CSDString)); + if (Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW)) + { + RTL_OSVERSIONINFOEXW *InfoEx = (RTL_OSVERSIONINFOEXW *)Info; + InfoEx->wServicePackMajor = 6; + InfoEx->wServicePackMinor = 0; + InfoEx->wSuiteMask = 0; + InfoEx->wProductType = VER_NT_WORKSTATION; + } + + return STATUS_SUCCESS; + } + + return STATUS_INVALID_PARAMETER; +} + +/* EOF */ From 11cc5733d38ed1db93bdcfe3037b077c3d358f30 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Mon, 8 Mar 2004 08:51:26 +0000 Subject: [PATCH 0374/1463] Return unique IndexNumber. Minor cleanup. svn path=/trunk/; revision=8586 --- reactos/drivers/fs/cdfs/cdfs.h | 28 ++++++-- reactos/drivers/fs/cdfs/fcb.c | 20 ++++-- reactos/drivers/fs/cdfs/finfo.c | 116 ++++++++++++++++++-------------- reactos/drivers/fs/cdfs/fsctl.c | 5 +- reactos/drivers/fs/cdfs/misc.c | 12 ++-- 5 files changed, 113 insertions(+), 68 deletions(-) diff --git a/reactos/drivers/fs/cdfs/cdfs.h b/reactos/drivers/fs/cdfs/cdfs.h index 46b4c54b069..e9553cce93d 100644 --- a/reactos/drivers/fs/cdfs/cdfs.h +++ b/reactos/drivers/fs/cdfs/cdfs.h @@ -41,7 +41,11 @@ struct _DIR_RECORD typedef struct _DIR_RECORD DIR_RECORD, *PDIR_RECORD; - +/* DIR_RECORD.FileFlags */ +#define FILE_FLAG_HIDDEN 0x01 +#define FILE_FLAG_DIRECTORY 0x02 +#define FILE_FLAG_SYSTEM 0x04 +#define FILE_FLAG_READONLY 0x10 /* Volume Descriptor header*/ @@ -182,12 +186,13 @@ typedef struct _FCB ULONG DirIndex; + LARGE_INTEGER IndexNumber; /* HighPart: Parent directory start sector */ + /* LowPart: Directory record offset in the parent directory file */ + LONG RefCount; ULONG Flags; DIR_RECORD Entry; - - } FCB, *PFCB; @@ -312,15 +317,26 @@ CdfsMakeRootFCB(PDEVICE_EXTENSION Vcb); PFCB CdfsOpenRootFCB(PDEVICE_EXTENSION Vcb); - +NTSTATUS +CdfsMakeFCBFromDirEntry(PVCB Vcb, + PFCB DirectoryFCB, + PWSTR LongName, + PWSTR ShortName, + PDIR_RECORD Record, + ULONG DirectorySector, + ULONG DirectoryOffset, + PFCB * fileFCB); NTSTATUS CdfsAttachFCBToFileObject(PDEVICE_EXTENSION Vcb, PFCB Fcb, PFILE_OBJECT FileObject); - - +NTSTATUS +CdfsDirFindFile(PDEVICE_EXTENSION DeviceExt, + PFCB DirectoryFcb, + PWSTR FileToFind, + PFCB *FoundFCB); NTSTATUS CdfsGetFCBForFile(PDEVICE_EXTENSION Vcb, diff --git a/reactos/drivers/fs/cdfs/fcb.c b/reactos/drivers/fs/cdfs/fcb.c index 64000dfd4e3..2d5246b405f 100644 --- a/reactos/drivers/fs/cdfs/fcb.c +++ b/reactos/drivers/fs/cdfs/fcb.c @@ -1,6 +1,6 @@ /* * ReactOS kernel - * Copyright (C) 2002 ReactOS Team + * Copyright (C) 2002, 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 @@ -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: fcb.c,v 1.17 2004/01/28 20:52:21 ekohl Exp $ +/* $Id: fcb.c,v 1.18 2004/03/08 08:51:26 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -111,8 +111,7 @@ CdfsDestroyFCB(PFCB Fcb) BOOLEAN CdfsFCBIsDirectory(PFCB Fcb) { -// return(Fcb->entry.Attrib & FILE_ATTRIBUTE_DIRECTORY); - return(Fcb->Entry.FileFlags & 0x02); + return(Fcb->Entry.FileFlags & FILE_FLAG_DIRECTORY); } @@ -268,7 +267,8 @@ CdfsMakeRootFCB(PDEVICE_EXTENSION Vcb) Fcb->Entry.DataLengthL = Vcb->CdInfo.RootSize; Fcb->Entry.ExtentLocationL = Vcb->CdInfo.RootStart; - Fcb->Entry.FileFlags = 0x02; // FILE_ATTRIBUTE_DIRECTORY; + Fcb->Entry.FileFlags = FILE_FLAG_DIRECTORY; + Fcb->IndexNumber.QuadPart = 0LL; Fcb->RefCount = 1; Fcb->DirIndex = 0; Fcb->RFCB.FileSize.QuadPart = Vcb->CdInfo.RootSize; @@ -342,6 +342,8 @@ CdfsMakeFCBFromDirEntry(PVCB Vcb, PWSTR LongName, PWSTR ShortName, PDIR_RECORD Record, + ULONG DirectorySector, + ULONG DirectoryOffset, PFCB * fileFCB) { WCHAR pathName[MAX_PATH]; @@ -388,6 +390,8 @@ CdfsMakeFCBFromDirEntry(PVCB Vcb, { CdfsFCBInitializeCache(Vcb, rcFCB); } + rcFCB->IndexNumber.u.HighPart = DirectorySector; + rcFCB->IndexNumber.u.LowPart = DirectoryOffset; rcFCB->RefCount++; CdfsAddFCBToTable(Vcb, rcFCB); *fileFCB = rcFCB; @@ -507,7 +511,9 @@ CdfsDirFindFile(PDEVICE_EXTENSION DeviceExt, Record->RecordLength, Record->ExtAttrRecordLength, Record->FileIdLength); CdfsGetDirEntryName(DeviceExt, Record, Name); - DPRINT("Name '%S'\n", Name); + DPRINT ("Name '%S'\n", Name); + DPRINT ("Sector %lu\n", DirectoryFcb->Entry.ExtentLocationL); + DPRINT ("Offset %lu\n", Offset); RtlInitUnicodeString(&LongName, Name); ShortName.Length = 0; @@ -542,6 +548,8 @@ CdfsDirFindFile(PDEVICE_EXTENSION DeviceExt, Name, ShortNameBuffer, Record, + DirectoryFcb->Entry.ExtentLocationL, + Offset, FoundFCB); CcUnpinData(Context); diff --git a/reactos/drivers/fs/cdfs/finfo.c b/reactos/drivers/fs/cdfs/finfo.c index f1e13be47f2..e81889a308f 100644 --- a/reactos/drivers/fs/cdfs/finfo.c +++ b/reactos/drivers/fs/cdfs/finfo.c @@ -1,6 +1,6 @@ /* * ReactOS kernel - * Copyright (C) 2002 ReactOS Team + * Copyright (C) 2002, 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 @@ -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: finfo.c,v 1.8 2003/09/20 20:31:57 weiden Exp $ +/* $Id: finfo.c,v 1.9 2004/03/08 08:51:26 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -39,14 +39,14 @@ /* FUNCTIONS ****************************************************************/ +/* + * FUNCTION: Retrieve the standard file information + */ static NTSTATUS CdfsGetStandardInformation(PFCB Fcb, PDEVICE_OBJECT DeviceObject, PFILE_STANDARD_INFORMATION StandardInfo, PULONG BufferLength) -/* - * FUNCTION: Retrieve the standard file information - */ { DPRINT("CdfsGetStandardInformation() called\n"); @@ -71,6 +71,9 @@ CdfsGetStandardInformation(PFCB Fcb, } +/* + * FUNCTION: Retrieve the file position information + */ static NTSTATUS CdfsGetPositionInformation(PFILE_OBJECT FileObject, PFILE_POSITION_INFORMATION PositionInfo, @@ -92,6 +95,9 @@ CdfsGetPositionInformation(PFILE_OBJECT FileObject, } +/* + * FUNCTION: Retrieve the basic file information + */ static NTSTATUS CdfsGetBasicInformation(PFILE_OBJECT FileObject, PFCB Fcb, @@ -122,15 +128,15 @@ CdfsGetBasicInformation(PFILE_OBJECT FileObject, } +/* + * FUNCTION: Retrieve the file name information + */ static NTSTATUS CdfsGetNameInformation(PFILE_OBJECT FileObject, PFCB Fcb, PDEVICE_OBJECT DeviceObject, PFILE_NAME_INFORMATION NameInfo, PULONG BufferLength) -/* - * FUNCTION: Retrieve the file name information - */ { ULONG NameLength; @@ -155,6 +161,9 @@ CdfsGetNameInformation(PFILE_OBJECT FileObject, } +/* + * FUNCTION: Retrieve the internal file information + */ static NTSTATUS CdfsGetInternalInformation(PFCB Fcb, PFILE_INTERNAL_INFORMATION InternalInfo, @@ -168,8 +177,7 @@ CdfsGetInternalInformation(PFCB Fcb, if (*BufferLength < sizeof(FILE_INTERNAL_INFORMATION)) return(STATUS_BUFFER_OVERFLOW); - /* FIXME: get a real index, that can be used in a create operation */ - InternalInfo->IndexNumber.QuadPart = 0; + InternalInfo->IndexNumber.QuadPart = Fcb->IndexNumber.QuadPart; *BufferLength -= sizeof(FILE_INTERNAL_INFORMATION); @@ -177,13 +185,13 @@ CdfsGetInternalInformation(PFCB Fcb, } +/* + * FUNCTION: Retrieve the file network open information + */ static NTSTATUS CdfsGetNetworkOpenInformation(PFCB Fcb, PFILE_NETWORK_OPEN_INFORMATION NetworkInfo, PULONG BufferLength) -/* - * FUNCTION: Retrieve the file network open information - */ { assert(NetworkInfo); assert(Fcb); @@ -210,14 +218,14 @@ CdfsGetNetworkOpenInformation(PFCB Fcb, } +/* + * FUNCTION: Retrieve all file information + */ static NTSTATUS CdfsGetAllInformation(PFILE_OBJECT FileObject, PFCB Fcb, PFILE_ALL_INFORMATION Info, PULONG BufferLength) -/* - * FUNCTION: Retrieve the all file information - */ { ULONG NameLength; @@ -245,11 +253,10 @@ CdfsGetAllInformation(PFILE_OBJECT FileObject, Info->StandardInformation.EndOfFile = Fcb->RFCB.FileSize; Info->StandardInformation.NumberOfLinks = 0; Info->StandardInformation.DeletePending = FALSE; - Info->StandardInformation.Directory = Fcb->Entry.FileFlags & 0x02 ? TRUE : FALSE; + Info->StandardInformation.Directory = Fcb->Entry.FileFlags & FILE_FLAG_DIRECTORY ? TRUE : FALSE; /* Internal Information */ - /* FIXME: get a real index, that can be used in a create operation */ - Info->InternalInformation.IndexNumber.QuadPart = 0; + Info->InternalInformation.IndexNumber.QuadPart = Fcb->IndexNumber.QuadPart; /* EA Information */ Info->EaInformation.EaSize = 0; @@ -277,26 +284,13 @@ CdfsGetAllInformation(PFILE_OBJECT FileObject, return STATUS_SUCCESS; } -static NTSTATUS -CdfsSetPositionInformation(PFILE_OBJECT FileObject, - PFILE_POSITION_INFORMATION PositionInfo) -{ - DPRINT ("CdfsSetPositionInformation()\n"); - DPRINT ("PositionInfo %x\n", PositionInfo); - DPRINT ("Setting position %d\n", PositionInfo->CurrentByteOffset.u.LowPart); - memcpy (&FileObject->CurrentByteOffset, &PositionInfo->CurrentByteOffset, - sizeof (LARGE_INTEGER)); - - return (STATUS_SUCCESS); -} - -NTSTATUS STDCALL -CdfsQueryInformation(PDEVICE_OBJECT DeviceObject, - PIRP Irp) /* * FUNCTION: Retrieve the specified file information */ +NTSTATUS STDCALL +CdfsQueryInformation(PDEVICE_OBJECT DeviceObject, + PIRP Irp) { FILE_INFORMATION_CLASS FileInformationClass; PIO_STACK_LOCATION Stack; @@ -374,6 +368,7 @@ CdfsQueryInformation(PDEVICE_OBJECT DeviceObject, default: DPRINT("Unimplemented information class %u\n", FileInformationClass); Status = STATUS_NOT_SUPPORTED; + break; } Irp->IoStatus.Status = Status; @@ -388,12 +383,32 @@ CdfsQueryInformation(PDEVICE_OBJECT DeviceObject, return(Status); } + +/* + * FUNCTION: Set the file position information + */ +static NTSTATUS +CdfsSetPositionInformation(PFILE_OBJECT FileObject, + PFILE_POSITION_INFORMATION PositionInfo) +{ + DPRINT ("CdfsSetPositionInformation()\n"); + + DPRINT ("PositionInfo %x\n", PositionInfo); + DPRINT ("Setting position %I64u\n", PositionInfo->CurrentByteOffset.QuadPart); + + FileObject->CurrentByteOffset.QuadPart = + PositionInfo->CurrentByteOffset.QuadPart; + + return STATUS_SUCCESS; +} + + +/* + * FUNCTION: Set the specified file information + */ NTSTATUS STDCALL CdfsSetInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp) -/* - * FUNCTION: Retrieve the specified file information - */ { FILE_INFORMATION_CLASS FileInformationClass; PIO_STACK_LOCATION Stack; @@ -414,16 +429,19 @@ CdfsSetInformation(PDEVICE_OBJECT DeviceObject, switch (FileInformationClass) { - case FilePositionInformation: - Status = CdfsSetPositionInformation(FileObject, - SystemBuffer); - break; - case FileBasicInformation: - case FileRenameInformation: - Status = STATUS_NOT_IMPLEMENTED; - break; - default: - Status = STATUS_NOT_SUPPORTED; + case FilePositionInformation: + Status = CdfsSetPositionInformation(FileObject, + SystemBuffer); + break; + + case FileBasicInformation: + case FileRenameInformation: + Status = STATUS_NOT_IMPLEMENTED; + break; + + default: + Status = STATUS_NOT_SUPPORTED; + break; } Irp->IoStatus.Status = Status; @@ -431,7 +449,7 @@ CdfsSetInformation(PDEVICE_OBJECT DeviceObject, IoCompleteRequest(Irp, IO_NO_INCREMENT); - return(Status); + return Status; } /* EOF */ diff --git a/reactos/drivers/fs/cdfs/fsctl.c b/reactos/drivers/fs/cdfs/fsctl.c index ade30d8ca45..7257cf7c172 100644 --- a/reactos/drivers/fs/cdfs/fsctl.c +++ b/reactos/drivers/fs/cdfs/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.17 2003/11/13 15:25:08 ekohl Exp $ +/* $Id: fsctl.c,v 1.18 2004/03/08 08:51:26 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -95,6 +95,9 @@ CdfsGetPVDData(PUCHAR Buffer, DPRINT("VolumeSize: %lu\n", Pvd->VolumeSpaceSizeL); DPRINT("RootStart: %lu\n", Pvd->RootDirRecord.ExtentLocationL); DPRINT("RootSize: %lu\n", Pvd->RootDirRecord.DataLengthL); + DPRINT("PathTableSize: %lu\n", Pvd->PathTableSizeL); + DPRINT("PathTablePos: %lu\n", Pvd->LPathTablePos); + DPRINT("OptPathTablePos: %lu\n", Pvd->LOptPathTablePos); #if 0 DbgPrint("******** PVD **********\n"); diff --git a/reactos/drivers/fs/cdfs/misc.c b/reactos/drivers/fs/cdfs/misc.c index 7d9d2f36e2a..ba13bcc2bc1 100644 --- a/reactos/drivers/fs/cdfs/misc.c +++ b/reactos/drivers/fs/cdfs/misc.c @@ -1,6 +1,6 @@ /* * ReactOS kernel - * Copyright (C) 2002 ReactOS Team + * Copyright (C) 2002, 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 @@ -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 2002/10/03 18:28:22 sedwards Exp $ +/* $Id: misc.c,v 1.6 2004/03/08 08:51:26 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -128,10 +128,10 @@ CdfsFileFlagsToAttributes(PFCB Fcb, /* FIXME: Fix attributes */ *FileAttributes = // FILE_ATTRIBUTE_READONLY | - (Fcb->Entry.FileFlags & 0x01) ? FILE_ATTRIBUTE_HIDDEN : 0 | - (Fcb->Entry.FileFlags & 0x02) ? FILE_ATTRIBUTE_DIRECTORY : 0 | - (Fcb->Entry.FileFlags & 0x04) ? FILE_ATTRIBUTE_SYSTEM : 0 | - (Fcb->Entry.FileFlags & 0x10) ? FILE_ATTRIBUTE_READONLY : 0; + (Fcb->Entry.FileFlags & FILE_FLAG_HIDDEN) ? FILE_ATTRIBUTE_HIDDEN : 0 | + (Fcb->Entry.FileFlags & FILE_FLAG_DIRECTORY) ? FILE_ATTRIBUTE_DIRECTORY : 0 | + (Fcb->Entry.FileFlags & FILE_FLAG_SYSTEM) ? FILE_ATTRIBUTE_SYSTEM : 0 | + (Fcb->Entry.FileFlags & FILE_FLAG_READONLY) ? FILE_ATTRIBUTE_READONLY : 0; } /* EOF */ From 9183e287b192ea3558558d5baf5b17d47bc921d1 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Mon, 8 Mar 2004 09:45:19 +0000 Subject: [PATCH 0375/1463] new bug reports in TODO list svn path=/trunk/; revision=8587 --- reactos/subsys/system/explorer/desktop/desktop.cpp | 5 ++--- reactos/subsys/system/explorer/doc/TODO.txt | 8 ++++++++ reactos/subsys/system/explorer/taskbar/startmenu.cpp | 2 +- reactos/subsys/system/explorer/taskbar/startmenu.h | 2 ++ 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/reactos/subsys/system/explorer/desktop/desktop.cpp b/reactos/subsys/system/explorer/desktop/desktop.cpp index b944718001d..b3b86f33a1f 100644 --- a/reactos/subsys/system/explorer/desktop/desktop.cpp +++ b/reactos/subsys/system/explorer/desktop/desktop.cpp @@ -175,11 +175,9 @@ void Desktops::SwitchToDesktop(int idx) if (_current_desktop == idx) return; - Desktop& desktop = (*this)[idx]; - - // save currently visible application windows Desktop& old_desktop = (*this)[_current_desktop]; WindowSet& windows = old_desktop._windows; + Desktop& desktop = (*this)[idx]; windows.clear(); @@ -189,6 +187,7 @@ void Desktops::SwitchToDesktop(int idx) for(WindowSet::const_iterator it2=it1->_windows.begin(); it2!=it1->_windows.end(); ++it2) other_wnds.insert(*it2); + // save currently visible application windows EnumWindows(SwitchDesktopEnumFct, (LPARAM)&windows); old_desktop._hwndForeground = (HWND)SendMessage(g_Globals._hwndDesktopBar, PM_GET_LAST_ACTIVE, 0, 0); diff --git a/reactos/subsys/system/explorer/doc/TODO.txt b/reactos/subsys/system/explorer/doc/TODO.txt index 728840c64f6..286a87e1570 100644 --- a/reactos/subsys/system/explorer/doc/TODO.txt +++ b/reactos/subsys/system/explorer/doc/TODO.txt @@ -35,3 +35,11 @@ Yes, ROS explorer doesn't read many settings from the registry currently, as it doesn't have a way to configure them. (missing configuration dialogs) +- Wenn man in der Toolbar auf "NT Obj." klickt und dann mit der rechten + Maustaste in die TreeView klickt, gibt es eine COM Exeption "Falscher Parameter". + Wenn man das 鰂ter macht crasht das Programm. + +- Es scheint ein paar GDI-Leaks in deinem Programm zu geben + Wenn man ein neues MDI Fenster 鰂fnet und dann wieder schlie遲, werden + einige GDI-Objekte nicht wieder gel鰏cht + diff --git a/reactos/subsys/system/explorer/taskbar/startmenu.cpp b/reactos/subsys/system/explorer/taskbar/startmenu.cpp index 972d5842a2b..922a086e593 100644 --- a/reactos/subsys/system/explorer/taskbar/startmenu.cpp +++ b/reactos/subsys/system/explorer/taskbar/startmenu.cpp @@ -1869,6 +1869,6 @@ void RecentStartMenu::AddEntries() } dir.sort_directory(SORT_DATE); - AddShellEntries(dir, 16, smd._subfolders); ///@todo read max. count of entries from registry + AddShellEntries(dir, RECENT_DOCS_COUNT, smd._subfolders); } } diff --git a/reactos/subsys/system/explorer/taskbar/startmenu.h b/reactos/subsys/system/explorer/taskbar/startmenu.h index b24ac2c1712..b8a563cd4dc 100644 --- a/reactos/subsys/system/explorer/taskbar/startmenu.h +++ b/reactos/subsys/system/explorer/taskbar/startmenu.h @@ -409,6 +409,8 @@ protected: }; +#define RECENT_DOCS_COUNT 20 ///@todo read max. count of entries from registry + /// "Recent Files" sub-start menu struct RecentStartMenu : public StartMenu { From 0c76856d9c88a41f59a7edb1a3491c6da6de1e40 Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Mon, 8 Mar 2004 10:20:18 +0000 Subject: [PATCH 0376/1463] More support for IOCTL_TCP_QUERY/SET_INFORMATION_EX Connected ControlChannel handle type. Allowed empty EaInfo in create -> ControlChannel. Added TDI entity for interfaces. Fixed IPSnmpInfo interface number report. Fixed returned buffer size report in DispTdiQueryInformationExComplete Added IPROUTE_ENTRY struct. What works: tcpquery lists three entities, two builtin and one IF_ENTITY tcpquery -i reports 1 interface and 1 address for me (addr=127.0.0.1) TODO: Type information for each entity (only two builtin entities are supported now) Interface info out (IFEntry) Route info in/out (IPRouteEntry) svn path=/trunk/; revision=8588 --- reactos/drivers/net/tcpip/datalink/lan.c | 2 +- reactos/drivers/net/tcpip/include/info.h | 19 ++++++ reactos/drivers/net/tcpip/include/route.h | 2 +- reactos/drivers/net/tcpip/include/tcpip.h | 1 + reactos/drivers/net/tcpip/network/route.c | 17 +++++ reactos/drivers/net/tcpip/tcpip/dispatch.c | 2 +- reactos/drivers/net/tcpip/tcpip/fileobjs.c | 55 +++++++++++++++- reactos/drivers/net/tcpip/tcpip/info.c | 77 ++++++++++++++++++++-- reactos/drivers/net/tcpip/tcpip/main.c | 40 +++++++---- 9 files changed, 193 insertions(+), 22 deletions(-) diff --git a/reactos/drivers/net/tcpip/datalink/lan.c b/reactos/drivers/net/tcpip/datalink/lan.c index 24a84d0fd6a..08169ead95a 100644 --- a/reactos/drivers/net/tcpip/datalink/lan.c +++ b/reactos/drivers/net/tcpip/datalink/lan.c @@ -593,7 +593,7 @@ VOID LANTransmit( VOID BindAdapter( PLAN_ADAPTER Adapter, - PNDIS_STRING RegistryPath) + PNDIS_STRING RegistryPath) /* * FUNCTION: Binds a LAN adapter to IP layer * ARGUMENTS: diff --git a/reactos/drivers/net/tcpip/include/info.h b/reactos/drivers/net/tcpip/include/info.h index 948d13787a7..2e9631bea3e 100644 --- a/reactos/drivers/net/tcpip/include/info.h +++ b/reactos/drivers/net/tcpip/include/info.h @@ -44,10 +44,29 @@ typedef struct IPADDR_ENTRY { USHORT Pad; } IPADDR_ENTRY, *PIPADDR_ENTRY; +typedef struct IPROUTE_ENTRY { + ULONG Dest; + ULONG Index; //matches if_index in IFEntry and iae_index in IPAddrEntry + ULONG Metric1; + ULONG Metric2; + ULONG Metric3; + ULONG Metric4; + ULONG Gw; + ULONG Type; + ULONG Proto; + ULONG Age; + ULONG Mask; + ULONG Metric5; + ULONG Info; +} IPROUTE_ENTRY, *PIPROUTE_ENTRY; + #define IP_MIB_STATS_ID 1 #ifndef IP_MIB_ADDRTABLE_ENTRY_ID #define IP_MIB_ADDRTABLE_ENTRY_ID 0x102 #endif +#ifndef IP_MIB_ROUTETABLE_ENTRY_ID +#define IP_MIB_ROUTETABLE_ENTRY_ID 0x103 +#endif #ifndef MAX_PHYSADDR_SIZE #define MAX_PHYSADDR_SIZE 8 diff --git a/reactos/drivers/net/tcpip/include/route.h b/reactos/drivers/net/tcpip/include/route.h index 79cd0ec8ac0..4eb9ff3c1f7 100644 --- a/reactos/drivers/net/tcpip/include/route.h +++ b/reactos/drivers/net/tcpip/include/route.h @@ -11,9 +11,9 @@ #include <address.h> #include <router.h> #include <pool.h> +#include <info.h> #include <arp.h> - /* Route Cache Node structure. * The primary purpose of the RCN is to cache selected source and * next-hop addresses. The routing cache is implemented as a binary diff --git a/reactos/drivers/net/tcpip/include/tcpip.h b/reactos/drivers/net/tcpip/include/tcpip.h index 6a4de2ccdf9..69efcd6215a 100644 --- a/reactos/drivers/net/tcpip/include/tcpip.h +++ b/reactos/drivers/net/tcpip/include/tcpip.h @@ -122,6 +122,7 @@ extern LIST_ENTRY AddressFileListHead; extern KSPIN_LOCK AddressFileListLock; extern NDIS_HANDLE GlobalPacketPool; extern NDIS_HANDLE GlobalBufferPool; +extern KSPIN_LOCK EntityListLock; extern TDIEntityID *EntityList; extern ULONG EntityCount; extern UDP_STATISTICS UDPStats; diff --git a/reactos/drivers/net/tcpip/network/route.c b/reactos/drivers/net/tcpip/network/route.c index e980f44ef69..12618287c3b 100644 --- a/reactos/drivers/net/tcpip/network/route.c +++ b/reactos/drivers/net/tcpip/network/route.c @@ -699,4 +699,21 @@ VOID RouteInvalidateNCE( KeReleaseSpinLock(&RouteCacheLock, OldIrql); } +NTSTATUS +RouteFriendlyAddRoute( PIPROUTE_ENTRY ire ) { + PNET_TABLE_ENTRY Nte; + PNEIGHBOR_CACHE_ENTRY Nce; + PIP_INTERFACE If; + IP_ADDRESS Dest; + KIRQL OldIrql; + + + /* Find IF */ + KeAcquireSpinLock(&InterfaceListLock, &OldIrql); + //RouteAddRouteToDestination(&Dest,Nte,If,Nce); + KeReleaseSpinLock(&InterfaceListLock, OldIrql); + + return STATUS_SUCCESS; +} + /* EOF */ diff --git a/reactos/drivers/net/tcpip/tcpip/dispatch.c b/reactos/drivers/net/tcpip/tcpip/dispatch.c index 084cec61f54..cec2fb22ef5 100644 --- a/reactos/drivers/net/tcpip/tcpip/dispatch.c +++ b/reactos/drivers/net/tcpip/tcpip/dispatch.c @@ -1022,7 +1022,7 @@ VOID DispTdiQueryInformationExComplete( MmUnlockPages(QueryContext->OutputMdl); IoFreeMdl(QueryContext->OutputMdl); - QueryContext->Irp->IoStatus.Information = Count; + QueryContext->Irp->IoStatus.Information = ByteCount; QueryContext->Irp->IoStatus.Status = Status; ExFreePool(QueryContext); diff --git a/reactos/drivers/net/tcpip/tcpip/fileobjs.c b/reactos/drivers/net/tcpip/tcpip/fileobjs.c index 0a80d685bcc..d912a56db25 100644 --- a/reactos/drivers/net/tcpip/tcpip/fileobjs.c +++ b/reactos/drivers/net/tcpip/tcpip/fileobjs.c @@ -38,6 +38,18 @@ VOID AddrFileFree( } +VOID ControlChannelFree( + PVOID Object) +/* + * FUNCTION: Frees an address file object + * ARGUMENTS: + * Object = Pointer to address file object to free + */ +{ + ExFreePool(Object); +} + + VOID DeleteAddress( PADDRESS_FILE AddrFile) /* @@ -536,9 +548,39 @@ NTSTATUS FileCloseConnection( * Status of operation */ NTSTATUS FileOpenControlChannel( - PTDI_REQUEST Request) + PTDI_REQUEST Request) { - return STATUS_NOT_IMPLEMENTED; + PCONTROL_CHANNEL ControlChannel; + TI_DbgPrint(MID_TRACE, ("Called.\n")); + + ControlChannel = ExAllocatePool(NonPagedPool, sizeof(*ControlChannel)); + + if (!ControlChannel) { + TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); + return STATUS_INSUFFICIENT_RESOURCES; + } + + RtlZeroMemory(ControlChannel, sizeof(CONTROL_CHANNEL)); + + /* Make sure address is a local unicast address or 0 */ + + /* Locate address entry. If specified address is 0, a random address is chosen */ + + /* Initialize receive and transmit queues */ + InitializeListHead(&ControlChannel->ListEntry); + + /* Initialize spin lock that protects the address file object */ + KeInitializeSpinLock(&ControlChannel->Lock); + + /* Reference the object */ + ControlChannel->RefCount = 1; + + /* Return address file object */ + Request->Handle.ControlChannel = ControlChannel; + + TI_DbgPrint(MAX_TRACE, ("Leaving.\n")); + + return STATUS_SUCCESS; } @@ -552,7 +594,14 @@ NTSTATUS FileOpenControlChannel( NTSTATUS FileCloseControlChannel( PTDI_REQUEST Request) { - return STATUS_NOT_IMPLEMENTED; + PCONTROL_CHANNEL ControlChannel = Request->Handle.ControlChannel; + KIRQL OldIrql; + NTSTATUS Status = STATUS_SUCCESS; + + ExFreePool(ControlChannel); + Request->Handle.ControlChannel = NULL; + + return Status; } /* EOF */ diff --git a/reactos/drivers/net/tcpip/tcpip/info.c b/reactos/drivers/net/tcpip/tcpip/info.c index 7a9d95156ef..04e91815d45 100644 --- a/reactos/drivers/net/tcpip/tcpip/info.c +++ b/reactos/drivers/net/tcpip/tcpip/info.c @@ -158,6 +158,21 @@ TDI_STATUS IPTdiQueryInformationEx( RtlZeroMemory(&SnmpInfo, sizeof(IPSNMP_INFO)); + /* Count number of interfaces */ + Count = 0; + KeAcquireSpinLock(&InterfaceListLock, &OldIrql); + + CurrentIFEntry = InterfaceListHead.Flink; + while (CurrentIFEntry != &InterfaceListHead) + { + Count++; + CurrentIFEntry = CurrentIFEntry->Flink; + } + + KeReleaseSpinLock(&InterfaceListLock, OldIrql); + + SnmpInfo.NumIf = Count; + /* Count number of addresses */ Count = 0; KeAcquireSpinLock(&InterfaceListLock, &OldIrql); @@ -205,8 +220,12 @@ TDI_STATUS InfoTdiQueryInformationEx( * Status of operation */ { + PLIST_ENTRY CurrentIFEntry; + PLIST_ENTRY CurrentADEEntry; PLIST_ENTRY CurrentADFEntry; PADDRESS_FILE CurrentADF; + PADDRESS_ENTRY CurrentADE; + PIP_INTERFACE CurrentIF; ADDRESS_INFO Info; KIRQL OldIrql; UINT BufSize; @@ -215,6 +234,7 @@ TDI_STATUS InfoTdiQueryInformationEx( ULONG Temp; UINT Count; UINT Size; + TDIEntityID EntityId; Offset = 0; BufSize = *BufferSize; @@ -230,18 +250,44 @@ TDI_STATUS InfoTdiQueryInformationEx( return TDI_INVALID_PARAMETER; } - *BufferSize = 0; + /* Count Adapters */ + KeAcquireSpinLock(&InterfaceListLock, &OldIrql); + + CurrentIFEntry = InterfaceListHead.Flink; + Count = EntityCount; + + while( CurrentIFEntry != &InterfaceListHead ) { + Count++; + CurrentIFEntry = CurrentIFEntry->Flink; + } + + KeReleaseSpinLock(&InterfaceListLock, OldIrql); + + Size = Count * sizeof(TDIEntityID); + *BufferSize = Size; - Size = EntityCount * sizeof(TDIEntityID); if (BufSize < Size) { /* The buffer is too small to contain requested data */ return TDI_BUFFER_TOO_SMALL; } + DbgPrint("About to copy %d TDIEntityIDs (%d bytes) to user\n", + Count, Size); + + KeAcquireSpinLock(&EntityListLock, &OldIrql); + + /* Update entity list */ + for( Temp = EntityCount; Temp < Count; Temp++ ) { + EntityList[Temp].tei_entity = IF_ENTITY; + EntityList[Temp].tei_instance = Temp - EntityCount; + } + /* Return entity list */ Count = CopyBufferToBufferChain(Buffer, 0, (PUCHAR)EntityList, Size); + KeReleaseSpinLock(&EntityListLock, OldIrql); + *BufferSize = Size; return TDI_SUCCESS; @@ -378,7 +424,30 @@ TDI_STATUS InfoTdiSetInformationEx( * Status of operation */ { - /* FIXME: Set extended information */ + switch( ID->toi_class ) { + case INFO_CLASS_PROTOCOL: + switch( ID->toi_type ) { + case INFO_TYPE_PROVIDER: + switch( ID->toi_id ) { + case IP_MIB_ROUTETABLE_ENTRY_ID: + if( ID->toi_entity.tei_entity == CL_NL_ENTITY && + ID->toi_entity.tei_instance == TL_INSTANCE && + BufferSize >= sizeof(IPROUTE_ENTRY) ) { + /* Add route -- buffer is an IPRouteEntry */ + PIPROUTE_ENTRY ire = (PIPROUTE_ENTRY)Buffer; + RouteFriendlyAddRoute( ire ); + } else { + return TDI_INVALID_PARAMETER; + /* In my experience, we are being over + protective compared to windows */ + } + break; + } + break; + } + break; + } - return TDI_INVALID_REQUEST; + return TDI_INVALID_PARAMETER; } + diff --git a/reactos/drivers/net/tcpip/tcpip/main.c b/reactos/drivers/net/tcpip/tcpip/main.c index 7f43f8466cf..c530e6e74cf 100644 --- a/reactos/drivers/net/tcpip/tcpip/main.c +++ b/reactos/drivers/net/tcpip/tcpip/main.c @@ -19,7 +19,7 @@ #include <rosrtl/string.h> #ifdef DBG -DWORD DebugTraceLevel = MIN_TRACE; +DWORD DebugTraceLevel = 0x7fffffff; #endif /* DBG */ PDEVICE_OBJECT TCPDeviceObject = NULL; @@ -28,8 +28,10 @@ PDEVICE_OBJECT IPDeviceObject = NULL; PDEVICE_OBJECT RawIPDeviceObject = NULL; NDIS_HANDLE GlobalPacketPool = NULL; NDIS_HANDLE GlobalBufferPool = NULL; +KSPIN_LOCK EntityListLock; TDIEntityID *EntityList = NULL; ULONG EntityCount = 0; +ULONG EntityMax = 0; UDP_STATISTICS UDPStats; @@ -165,10 +167,14 @@ NTSTATUS TiCreateFileObject( EaInfo = Irp->AssociatedIrp.SystemBuffer; CP /* Parameter check */ + /* No EA information means that we're opening for SET/QUERY_INFORMATION + * style calls. */ +#if 0 if (!EaInfo) { TI_DbgPrint(MIN_TRACE, ("No EA information in IRP.\n")); return STATUS_INVALID_PARAMETER; } +#endif CP /* Allocate resources here. We release them again if something failed */ Context = ExAllocatePool(NonPagedPool, sizeof(TRANSPORT_CONTEXT)); @@ -186,9 +192,11 @@ CP Request.RequestContext = Irp; CP /* Branch to the right handler */ - if ((EaInfo->EaNameLength == TDI_TRANSPORT_ADDRESS_LENGTH) && - (RtlCompareMemory(&EaInfo->EaName, TdiTransportAddress, - TDI_TRANSPORT_ADDRESS_LENGTH) == TDI_TRANSPORT_ADDRESS_LENGTH)) { + if (EaInfo && + (EaInfo->EaNameLength == TDI_TRANSPORT_ADDRESS_LENGTH) && + (RtlCompareMemory + (&EaInfo->EaName, TdiTransportAddress, + TDI_TRANSPORT_ADDRESS_LENGTH) == TDI_TRANSPORT_ADDRESS_LENGTH)) { /* This is a request to open an address */ CP @@ -232,9 +240,12 @@ CP Context->Handle.AddressHandle = Request.Handle.AddressHandle; } CP - } else if ((EaInfo->EaNameLength == TDI_CONNECTION_CONTEXT_LENGTH) && - (RtlCompareMemory(&EaInfo->EaName, TdiConnectionContext, - TDI_CONNECTION_CONTEXT_LENGTH) == TDI_CONNECTION_CONTEXT_LENGTH)) { + } else if (EaInfo && + (EaInfo->EaNameLength == TDI_CONNECTION_CONTEXT_LENGTH) && + (RtlCompareMemory + (&EaInfo->EaName, TdiConnectionContext, + TDI_CONNECTION_CONTEXT_LENGTH) == + TDI_CONNECTION_CONTEXT_LENGTH)) { /* This is a request to open a connection endpoint */ CP /* Parameter checks */ @@ -264,10 +275,11 @@ CP } } else { /* This is a request to open a control connection */ - - TI_DbgPrint(MIN_TRACE, ("Control connections are not implemented yet\n")); - - Status = STATUS_NOT_IMPLEMENTED; + Status = FileOpenControlChannel(&Request); + if (NT_SUCCESS(Status)) { + IrpSp->FileObject->FsContext2 = (PVOID)TDI_CONTROL_CHANNEL_FILE; + Context->Handle.ControlChannel = Request.Handle.ControlChannel; + } } if (!NT_SUCCESS(Status)) @@ -594,10 +606,12 @@ TiDispatch( /* See if this request is TCP/IP specific */ switch (IrpSp->Parameters.DeviceIoControl.IoControlCode) { case IOCTL_TCP_QUERY_INFORMATION_EX: + TI_DbgPrint(MIN_TRACE, ("TCP_QUERY_INFORMATION_EX\n")); Status = DispTdiQueryInformationEx(Irp, IrpSp); break; case IOCTL_TCP_SET_INFORMATION_EX: + TI_DbgPrint(MIN_TRACE, ("TCP_SET_INFORMATION_EX\n")); Status = DispTdiSetInformationEx(Irp, IrpSp); break; @@ -813,7 +827,8 @@ DriverEntry( } /* Setup network layer and transport layer entities */ - EntityList = ExAllocatePool(NonPagedPool, sizeof(TDIEntityID) * 2); + KeInitializeSpinLock(&EntityListLock); + EntityList = ExAllocatePool(NonPagedPool, sizeof(TDIEntityID) * MAX_TDI_ENTITIES ); if (!NT_SUCCESS(Status)) { TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); TiUnload(DriverObject); @@ -825,6 +840,7 @@ DriverEntry( EntityList[1].tei_entity = CL_TL_ENTITY; EntityList[1].tei_instance = 0; EntityCount = 2; + EntityMax = MAX_TDI_ENTITIES; /* Use direct I/O */ IPDeviceObject->Flags |= DO_DIRECT_IO; From 246677c52f569b7667386cd1911393c01f98efd3 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Mon, 8 Mar 2004 14:20:14 +0000 Subject: [PATCH 0377/1463] little fixes svn path=/trunk/; revision=8589 --- reactos/lib/cpl/cplsample/cplsample.c | 4 ++-- reactos/lib/cpl/cplsample/cplsample.rc | 6 +++--- reactos/lib/cpl/cplsample/resource.h | 10 ++++++++++ 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/reactos/lib/cpl/cplsample/cplsample.c b/reactos/lib/cpl/cplsample/cplsample.c index f9fd5fec49f..19ad938163f 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.1 2004/02/05 19:17:11 weiden Exp $ +/* $Id: cplsample.c,v 1.2 2004/03/08 14:20:14 weiden Exp $ * * PROJECT: ReactOS Sample Control Panel * FILE: lib/cpl/cplsample/cplsample.c @@ -148,7 +148,7 @@ Applet1(VOID) ZeroMemory(&psh, sizeof(PROPSHEETHEADER)); psh.dwSize = sizeof(PROPSHEETHEADER); - psh.dwFlags = PSH_PROPSHEETPAGE | PSH_USECALLBACK; + psh.dwFlags = PSH_PROPSHEETPAGE | PSH_USECALLBACK | PSH_PROPTITLE; psh.hwndParent = NULL; psh.hInstance = hApplet; psh.u1.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDC_CPLICON_1)); diff --git a/reactos/lib/cpl/cplsample/cplsample.rc b/reactos/lib/cpl/cplsample/cplsample.rc index c9b57fbb94a..8cef83e2255 100644 --- a/reactos/lib/cpl/cplsample/cplsample.rc +++ b/reactos/lib/cpl/cplsample/cplsample.rc @@ -39,7 +39,7 @@ END IDC_CPLICON_1 ICON "resources/cpl_icon1.ico" -IDD_PROPPAGE1 DIALOGEX 0, 0, 235, 156 +IDD_PROPPAGE1 DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Property Page 1" FONT 8, "MS Shell Dlg", 0, 0, 0x0 @@ -47,7 +47,7 @@ BEGIN LTEXT "Property Page 1",-1,73,74,90,8 END -IDD_PROPPAGE2 DIALOGEX 0, 0, 235, 156 +IDD_PROPPAGE2 DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Property Page 2" FONT 8, "MS Shell Dlg", 0, 0, 0x0 @@ -55,7 +55,7 @@ BEGIN LTEXT "Property Page 2",-1,73,74,90,8 END -IDD_PROPPAGE3 DIALOGEX 0, 0, 235, 156 +IDD_PROPPAGE3 DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Property Page 3" FONT 8, "MS Shell Dlg", 0, 0, 0x0 diff --git a/reactos/lib/cpl/cplsample/resource.h b/reactos/lib/cpl/cplsample/resource.h index bf0cd213f79..6194cae0563 100644 --- a/reactos/lib/cpl/cplsample/resource.h +++ b/reactos/lib/cpl/cplsample/resource.h @@ -1,6 +1,16 @@ #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 IDC_CPLICON_1 1 #define IDD_PROPPAGE1 100 From 06f1206cf2233cc097cd3fe9a71ca6a6d4161b4d Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Mon, 8 Mar 2004 14:22:30 +0000 Subject: [PATCH 0378/1463] - Fixed DPRINT. svn path=/trunk/; revision=8590 --- reactos/ntoskrnl/rtl/version.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/rtl/version.c b/reactos/ntoskrnl/rtl/version.c index 0f483fd527b..86008195986 100644 --- a/reactos/ntoskrnl/rtl/version.c +++ b/reactos/ntoskrnl/rtl/version.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: version.c,v 1.1 2004/03/08 08:05:27 navaraf Exp $ +/* $Id: version.c,v 1.2 2004/03/08 14:22:30 navaraf Exp $ * * PROJECT: ReactOS kernel * PURPOSE: Runtime code @@ -35,7 +35,7 @@ NTSTATUS STDCALL RtlGetVersion(RTL_OSVERSIONINFOW *Info) { - PWCHAR CSDString = L"Service Pack 6"; + WCHAR CSDString[] = L"Service Pack 6"; if (Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOW) || Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW)) @@ -44,7 +44,7 @@ RtlGetVersion(RTL_OSVERSIONINFOW *Info) Info->dwMinorVersion = 0; Info->dwBuildNumber = 1381; Info->dwPlatformId = VER_PLATFORM_WIN32_NT; - MmCopyToCaller(Info->szCSDVersion, CSDString, sizeof(CSDString)); + RtlCopyMemory(Info->szCSDVersion, CSDString, sizeof(CSDString)); if (Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW)) { RTL_OSVERSIONINFOEXW *InfoEx = (RTL_OSVERSIONINFOEXW *)Info; From e63f7f9cd047750ccea37f5d933958d629dd0386 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Mon, 8 Mar 2004 14:24:47 +0000 Subject: [PATCH 0379/1463] added basic skeleton for the system control panel svn path=/trunk/; revision=8591 --- reactos/lib/cpl/Makefile | 2 +- reactos/lib/cpl/sysdm/.cvsignore | 8 + reactos/lib/cpl/sysdm/Makefile | 47 ++++++ reactos/lib/cpl/sysdm/advanced.c | 49 ++++++ reactos/lib/cpl/sysdm/computer.c | 49 ++++++ reactos/lib/cpl/sysdm/general.c | 131 +++++++++++++++ reactos/lib/cpl/sysdm/hardware.c | 82 ++++++++++ reactos/lib/cpl/sysdm/resource.h | 38 +++++ reactos/lib/cpl/sysdm/resources/applet.ico | Bin 0 -> 1398 bytes reactos/lib/cpl/sysdm/resources/devmgr.ico | Bin 0 -> 10278 bytes reactos/lib/cpl/sysdm/resources/gpl.txt | Bin 0 -> 36690 bytes reactos/lib/cpl/sysdm/sysdm.c | 176 +++++++++++++++++++++ reactos/lib/cpl/sysdm/sysdm.def | 6 + reactos/lib/cpl/sysdm/sysdm.edf | 6 + reactos/lib/cpl/sysdm/sysdm.h | 20 +++ reactos/lib/cpl/sysdm/sysdm.rc | 93 +++++++++++ 16 files changed, 706 insertions(+), 1 deletion(-) create mode 100644 reactos/lib/cpl/sysdm/.cvsignore create mode 100644 reactos/lib/cpl/sysdm/Makefile create mode 100644 reactos/lib/cpl/sysdm/advanced.c create mode 100644 reactos/lib/cpl/sysdm/computer.c create mode 100644 reactos/lib/cpl/sysdm/general.c create mode 100644 reactos/lib/cpl/sysdm/hardware.c create mode 100644 reactos/lib/cpl/sysdm/resource.h create mode 100644 reactos/lib/cpl/sysdm/resources/applet.ico create mode 100644 reactos/lib/cpl/sysdm/resources/devmgr.ico create mode 100644 reactos/lib/cpl/sysdm/resources/gpl.txt create mode 100644 reactos/lib/cpl/sysdm/sysdm.c create mode 100644 reactos/lib/cpl/sysdm/sysdm.def create mode 100644 reactos/lib/cpl/sysdm/sysdm.edf create mode 100644 reactos/lib/cpl/sysdm/sysdm.h create mode 100644 reactos/lib/cpl/sysdm/sysdm.rc diff --git a/reactos/lib/cpl/Makefile b/reactos/lib/cpl/Makefile index 86bc514ee4d..2356eca12a6 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 = +CONTROL_PANELS = sysdm all: $(CONTROL_PANELS) diff --git a/reactos/lib/cpl/sysdm/.cvsignore b/reactos/lib/cpl/sysdm/.cvsignore new file mode 100644 index 00000000000..ee6046a948c --- /dev/null +++ b/reactos/lib/cpl/sysdm/.cvsignore @@ -0,0 +1,8 @@ +*.coff +*.cpl +*.d +*.a +*.o +*.sym +*.map +*.tmp diff --git a/reactos/lib/cpl/sysdm/Makefile b/reactos/lib/cpl/sysdm/Makefile new file mode 100644 index 00000000000..a4640c9451f --- /dev/null +++ b/reactos/lib/cpl/sysdm/Makefile @@ -0,0 +1,47 @@ +# $Id: Makefile,v 1.1 2004/03/08 14:24:47 weiden Exp $ + +PATH_TO_TOP = ../../.. + +TARGET_TYPE = dynlink + +TARGET_EXTENSION = .cpl + +TARGET_NAME = sysdm + +TARGET_INSTALLDIR = system32 + +TARGET_BASE = 0x58760000 + +TARGET_CFLAGS = \ + -I./include \ + -DUNICODE \ + -D_UNICODE \ + -D__REACTOS__ \ + -Wall \ + -Werror \ + -fno-builtin + +TARGET_LFLAGS = -nostartfiles + +TARGET_SDKLIBS = kernel32.a user32.a comctl32.a + +TARGET_GCCLIBS = gcc + +TARGET_PCH = + +TARGET_CLEAN = + +TARGET_OBJECTS = sysdm.o general.o computer.o hardware.o advanced.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/sysdm/advanced.c b/reactos/lib/cpl/sysdm/advanced.c new file mode 100644 index 00000000000..8cd77a88735 --- /dev/null +++ b/reactos/lib/cpl/sysdm/advanced.c @@ -0,0 +1,49 @@ +/* + * 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: advanced.c,v 1.1 2004/03/08 14:24:47 weiden 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 <windows.h> +#include <stdlib.h> +#include "resource.h" +#include "sysdm.h" + +/* Property page dialog callback */ +BOOL CALLBACK +AdvancedPageProc( + HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam +) +{ + switch(uMsg) + { + case WM_INITDIALOG: + break; + } + return FALSE; +} + diff --git a/reactos/lib/cpl/sysdm/computer.c b/reactos/lib/cpl/sysdm/computer.c new file mode 100644 index 00000000000..f2ea1c6c248 --- /dev/null +++ b/reactos/lib/cpl/sysdm/computer.c @@ -0,0 +1,49 @@ +/* + * 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: computer.c,v 1.1 2004/03/08 14:24:47 weiden 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 <windows.h> +#include <stdlib.h> +#include "resource.h" +#include "sysdm.h" + +/* Property page dialog callback */ +BOOL CALLBACK +ComputerPageProc( + HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam +) +{ + switch(uMsg) + { + case WM_INITDIALOG: + break; + } + return FALSE; +} + diff --git a/reactos/lib/cpl/sysdm/general.c b/reactos/lib/cpl/sysdm/general.c new file mode 100644 index 00000000000..50889de8b41 --- /dev/null +++ b/reactos/lib/cpl/sysdm/general.c @@ -0,0 +1,131 @@ +/* + * 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/03/08 14:24:47 weiden Exp $ + * + * PROJECT: ReactOS System Control Panel + * FILE: lib/cpl/system/general.c + * PURPOSE: General System Information + * PROGRAMMER: Thomas Weidenmueller (w3seek@users.sourceforge.net) + * UPDATE HISTORY: + * 03-04-2004 Created + */ +#include <windows.h> +#include <stdlib.h> +#include "resource.h" +#include "sysdm.h" + +void +ShowLastWin32Error(HWND hWndOwner) +{ + LPWSTR 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, + NULL)) + { + return; + } + + MessageBox(hWndOwner, lpMsg, NULL, MB_OK | MB_ICONERROR); + + LocalFree((LPVOID)lpMsg); +} + +typedef struct +{ + HWND hDlg; +} OSITINFO, *POSITINFO; + +DWORD WINAPI +ObtainSystemInformationThread(POSITINFO posit) +{ + HRSRC hResInfo; + HGLOBAL hResMem; + WCHAR *LicenseText; + + /* wait a bit */ + Sleep(100); + + /* load license from resource */ + if(!(hResInfo = FindResource(hApplet, MAKEINTRESOURCE(RC_LICENSE), + MAKEINTRESOURCE(RTDATA))) || + !(hResMem = LoadResource(hApplet, hResInfo)) || + !(LicenseText = LockResource(hResMem))) + { + ShowLastWin32Error(posit->hDlg); + goto LoadSystemInfo; + } + /* insert the license into the edit control (unicode!) */ + SetDlgItemText(posit->hDlg, IDC_LICENSEMEMO, LicenseText); + SendDlgItemMessage(posit->hDlg, IDC_LICENSEMEMO, EM_SETSEL, 0, 0); + + LoadSystemInfo: + /* FIXME */ + /*free:*/ + HeapFree(GetProcessHeap(), 0, posit); + + return 0; +} + +/* Property page dialog callback */ +BOOL CALLBACK +GeneralPageProc( + HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam +) +{ + switch(uMsg) + { + case WM_INITDIALOG: + { + HANDLE Thread; + DWORD ThreadId; + POSITINFO posit; + + posit = (POSITINFO)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(OSITINFO)); + if(!posit) + { + ShowLastWin32Error(hwndDlg); + return FALSE; + } + posit->hDlg = hwndDlg; + Thread = CreateThread(NULL, + 0, + (LPTHREAD_START_ROUTINE)ObtainSystemInformationThread, + (PVOID)posit, + 0, + &ThreadId); + if(Thread) + { + CloseHandle(Thread); + return FALSE; + } + + break; + } + } + return FALSE; +} + diff --git a/reactos/lib/cpl/sysdm/hardware.c b/reactos/lib/cpl/sysdm/hardware.c new file mode 100644 index 00000000000..ef329b3b299 --- /dev/null +++ b/reactos/lib/cpl/sysdm/hardware.c @@ -0,0 +1,82 @@ +/* + * 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: hardware.c,v 1.1 2004/03/08 14:24:47 weiden Exp $ + * + * PROJECT: ReactOS System Control Panel + * FILE: lib/cpl/system/hardware.c + * PURPOSE: Hardware devices + * PROGRAMMER: Thomas Weidenmueller (w3seek@users.sourceforge.net) + * UPDATE HISTORY: + * 03-04-2004 Created + */ +#include <windows.h> +#include <stdlib.h> +#include "resource.h" +#include "sysdm.h" + +typedef WINBOOL (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"))) + { + return FALSE; + } + if(!(DevMgrExec = (PDEVMGREXEC)GetProcAddress(hDll, "DeviceManager_ExecuteW"))) + { + FreeLibrary(hDll); + return FALSE; + } + /* run the Device Manager */ + Ret = DevMgrExec(hWndParent, hApplet, NULL /* ??? */, SW_SHOW); + FreeLibrary(hDll); + return Ret; +} + +/* Property page dialog callback */ +BOOL CALLBACK +HardwarePageProc( + HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam +) +{ + switch(uMsg) + { + case WM_INITDIALOG: + break; + case WM_COMMAND: + switch(LOWORD(wParam)) + { + case IDC_DEVMGR: + if(!LaunchDeviceManager(hwndDlg)) + { + /* FIXME */ + } + break; + } + break; + } + return FALSE; +} + diff --git a/reactos/lib/cpl/sysdm/resource.h b/reactos/lib/cpl/sysdm/resource.h new file mode 100644 index 00000000000..c6650a917d9 --- /dev/null +++ b/reactos/lib/cpl/sysdm/resource.h @@ -0,0 +1,38 @@ +#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 RC_LICENSE 101 +#define RTDATA 300 + +#define IDI_CPLSYSTEM 100 +#define IDI_DEVMGR 101 + +#define IDD_PROPPAGEGENERAL 100 +#define IDD_PROPPAGECOMPUTER 101 +#define IDD_PROPPAGEHARDWARE 102 +#define IDD_PROPPAGEADVANCED 103 + +#define IDS_CPLSYSTEMNAME 1001 +#define IDS_CPLSYSTEMDESCRIPTION 2001 + +/* controls */ +#define IDC_LICENSEMEMO 101 +#define IDC_PROCESSORMANUFACTURER 102 +#define IDC_PROCESSOR 103 +#define IDC_PROCESSORSPEED 104 +#define IDC_SYSTEMMEMORY 105 +#define IDC_DEVMGR 106 +#define IDC_ICON1 201 + +#endif /* __CPL_RESOURCE_H */ + +/* EOF */ diff --git a/reactos/lib/cpl/sysdm/resources/applet.ico b/reactos/lib/cpl/sysdm/resources/applet.ico new file mode 100644 index 0000000000000000000000000000000000000000..3eae16df58c7f5b9a6b80827d788f7416afccbda GIT binary patch literal 1398 zcmds1v2MaJ5Pcy?>6oosVPx#onJ?g5x|yL8-r%#mb?JxX50cHi7sup4K?u<bsV_O- zJ)bW=TbBb0lvpln>N%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)<n7>;RO1DVO`5*Ex${7*rzT$k>q>YY}5t123;JHup-7leVI7nk`P|W&Ys_ z_r*N>-jMqObGQP}o<J9SK(9E`e5fx}>F-9>st~smS_|yFs$V?oA+Ep34wa~LO!6G5 MKQVRI!ab7Xj@&-27XSbN literal 0 HcmV?d00001 diff --git a/reactos/lib/cpl/sysdm/resources/devmgr.ico b/reactos/lib/cpl/sysdm/resources/devmgr.ico new file mode 100644 index 0000000000000000000000000000000000000000..283fe4e087bfd21e572c8487cd2aa953c126f721 GIT binary patch literal 10278 zcmeI2PiP#;6^EZJWv4?-WGmpy3|P@2v2V`y$$Rn|Uq$xfv-je@4VVzn91QA{H8%x? z82XZ3M6x15x%jNZEQB25-rQ_oVi*u)!8EK4JF8(6w(`AK-90@$J)_vk=CXP-)z$Ut z{rUB)>Z&&-i7d%Gvc7(adPQVeBodKJmwfxy5^Z=lZuoZmj>sp7t*;C6feZqXpZq}k z^Y#x#{_!K#_wD$5$Zv>T!zL<ni(-DL<$_+CC>G%>aqKIu+{$1upw<p&UvW<FD14Nq zm$|gFwH1qS&8ZK?vWt?Z9p`#|3C2O(x3Bi7Ks;WxZ$Nt-OVIbt)z}*dPJ6k{-uCHk zPlD55{B&#Ufx-yXL2#=6dMdnw{k-ilSUY#G)tG)!$((kyU7>zY8%1xwAM9v**Bir0 zZ1TI?xyfFv-Lm`3J4Qb*+7D8r|6TiUHGB1T-Jijd(!T|#-`_3pO`gXDHSk76->4YF z?Ytcn5ur^GuTr%TWY)?O_cEXiCuNEIvYc@LuSr?ve)UbuH|Q|)R$VMtannfG;POh? zJ5bF3xKUD>^zeP_`5&OGRLmcc**qWj9|SEW<|!{ytn)>K*<)Ur4)aOpYcF8lewn7d zn08rbdHc>C<1-{$n*ptL6k>75@4f3jeScHrBY654AIV_pXOu5wxFmOmOJB-xnfvAU z-W@K#zd2--hReT|6Y8;!+8omO-JpC(DdV?7qmknOE`E(Rr<gY7@KSjhi%F<;<)yUA z-0Kr&rg>ahZ*)qJS#+G+LZN(#y}VzRdi^*!9j{J4&g9*x8rqKC<TF+~HXu_9;=G|# zpjH)j{DP!_rWPce<6&#p>H1ZJwCzrN#t%+6SmBIR%tFBvW9W|s-(sOYVAma3AQtld zvrMjIZ)YafJ2_vCRjIG*D&&zF7P|!b`{0-4{1Jc?`*pPrw3n~1@V6&mh=N8<DL8%L zS5~`D@%@UY*FT^0Eg1h<9Q@8P8@D&*o682je&F=FQXQ9aF6d2Ve4F|8m$;Y@5=_Z& zmHbN9VGiN~Ms0?|XQF*0+kW|y)m*Mv7j;KdA}1>-&Tj^JJ<RKqydLK@dzuk@)uhIb zwHs>oGxOsHc^xmP!NuOk4*377f3x(~{suYDq1FR&8mQG3aT=(r7r8XkHQ4KvTNKTE zjoxDa8T@@9Cx87!R#sLd2m-ly@uFP5d|9qsxgwoTM>aM#<ofmNa`*0C+1%We+qZAa z&6_tRe(2<b51jm3o{P&;`OEV!<oV~H%dh_MC!mCsh>}oJ-wfe}@IrW@@)%JSiQq@v zMDQc{5qwok;3x1C8VURaK9!{KQ}`+T6h;c)(RQ?5YMw)`A;v=tg(!vO<K~`A2!;?0 zAs9k17$h)+U<knwf*}Nh!30AHh7b%P7(y@@bTEWq2*D77Ap}F{;DI9qN2oZ+{Xu0Y zBCZiwBCteYu}20=g!2eT5k@1hSQzMxxQW0LfyKfCjtCqPI3jRF;IL4EBLYJNh6oHA zx(FN*7$PvF_Ddx7A;gdW(6;bubU=mg1UU;ez7sGdI8AVnfGNRuLT7^S1m6k1Z8*#~ zeEcW)Pw=lpl;A%hHVGIKFeJo5hmEM%)5D?Ws>4VOQv9W0OTm%i&xTfU5Q7vPsp8<l zY`9TM!IFX{1w@KNn*v}-QA`nHjitcX>7rN|lN2ne#>24aY|v4F2L=ZQ2L=ZQ2L=ZQ zn@(Uz!QjB)z>tCgGZf^(;K1O(;J|=s3Vbj)FgP$c066@o7;`8(gd%K2v?Fjhv#m0b z{8)Z3_wL;j)?#_|=#e~r{8*koeJW3$JdqbKUdYRrFXj07SYEw)C9hw<mhpHjC;xQv zyN^E>l4hc-?|@d=vzFS`rnVN-UPJd<#+%>CtY@!*);gNAcQTdOYtPbJOL>LBs3lqb zJ5s6$v|GY=)R8t{6)pr6!yXnU0^D~bD`*}@wb05&tu-&uZXX>T8R$+Yf8sSG>*gUY zT)5yR^ucrLcDuft{)Z1Q<R%dCA<3%!vq2b*D*fEfQmeF|yP2-K-B#gW)K{GZfkGqu zN*`{DFg~%LeN_iI?VSGoDQeI3-#<7w*e^c&&HWRR#{NV4y-1_};eiR5lLr06&z^l& z2sG+H8$By6yp6v1zi*G(pntzgv;D=a@pZkw9{yUtWNn-Al}lC*z72BLo*G>m{{1Xw zz~q%EfmoNGKX9WnMYFZ3^9M~eNHdn|h1{$-gZNg@A8z3PLj_gjFW;xpNb%g?&*%Az zrd8+p%X$7nj`1DLUmBN-`OL{Cn#+`{W#dgZvs6fP0yI^HoMJw8k@mfoMW{knS<+{2 zyIHF}@>_%DQz&G4duGE>Mz^v}SbpUdG(T!CU7tvqV^#2o<_N2iDqIv)ULiGGuPco5 zgk`b9RG`)V84vA~LH0YIqDXkM(NT+hEvIroG;JmF_RywK$ny+Gn&P$dk1Do~%3hxf zRuV#e=C8jd<?|mZQz)UgI-RvH9}nN2ptP+j5Eneyr*qUHl&VmXFKidJYE%?D-J1QG z$x~x6KP&dh{m!7hDf=a`c{kmzDpY!#Qqqb`0H9EnU-aT=wy6qJ@{O;6XCiM3HThad z%BE&plVsQ{>5F!sQ;!B3&6S_Zk;}#cd7thUX|u2Q=gVvEnNyi-A1stF#C>f_XUeOO z+>a?N!c(ztDkv<rpC|dH9t!jA*M%+jULc=at*R}wf4~odn($)$DqdAEK#TAn9-2a_ zb4GmpkC;;024cbU9v<?e1`nS6xGju--9B&@$A22Xi7&uo(V4(8@kRElKba=?bK^Pp zji2-WzKJ|b`h02^+k0g};Wt^ivCQ14LRHr8Gh6s|@t-9WX5<@wvz0pxHzt36{!SRa z&2#)gZhx59cK*)UnVrAGn?rj3eu=V9DSyB6cZ+6<&wsyi)*7ClzuW2e`T09%;@`dV z_u2-~wIjUzG+LJpwx_Imp3WA)FO)rL=N~=KW>eTJKlv6k*_^zGGBa0osMyCc_8Z?` zA+6bO6+2SaUU>$i+U6wnpwhOjyVACOw`_A<@2PyiVi&`kJEnZ9Zau|R1J=o5wQw@& N|L<l}pY{JY{|34uZ#w`0 literal 0 HcmV?d00001 diff --git a/reactos/lib/cpl/sysdm/resources/gpl.txt b/reactos/lib/cpl/sysdm/resources/gpl.txt new file mode 100644 index 0000000000000000000000000000000000000000..86ed154a2d2821b30f0faff3e888df147ca1e776 GIT binary patch literal 36690 zcmchgTaz5eafRnqj_`ljz>A;=ks>MULR+B-00c<LAOQnQQhXDxBrFhsaS??-Z#%#K z<}j;zdKL@H;Xo{QXQsO<FDFlCWp(%b&wu}H_p{x}{@<s&FLqzn-=FTT)?Zh5w|AFz zH|q7RdiQeub$xfGUiq6N?$j~=y!)pbp~rBnuXYc2FLp0?k9W^@PwSkIcE7Cu|FnBu zuO8N4AMQS`e;+PqGr~!Y{A~Ap_omKzy!&?d-R@Prcd_36#s28u*YS*zGf#Hc>ez?N zXm{$|M|H*zySvMKeD-Xa>p{KqYA*$6U$6P^@7`bLjn?P;{hONqWOrKgeP41uS?0Y} zzwg#~4;RVq)Qpd7HuU>-{rg~f_i{<{vfjlGNbq^tlo>xLn|!$Zd$0cI=-(~xe_2+& zw3qMd?r$~Pi?Rx5Gw$OW>!jxA-S3y#nD0To#|$SWi&i`-xt=cXKUmIrRmVTx-75)| z&vEbVt@HhlXFjgcUhZedri}aDe%2@T8(p8)5y<kO=DJ@ae!sl;YSGRakmI{Wf^X}b zr{zy1$D_*sw9e$!-Ll`4`um3(;lbW3!BZpZ*5cE<HP5}p?i?Xz@W*$HEVFFb=uwUP zqJDp0zp?*G{l7*@(DI<h0IT0FR&Hy)DhdC(jDL5*)|(myU%al7k>JrH8L~gCdE$eY zi|$~vz0mg1i?2#sP;j}%(`!#l#uqgovVs%r&aoYnSRTJ)HDdDhVh?<REH_I2(K}ii z>*H~-FyiFfIvedl37<1lG{bgA*1PJJ^N?q4?e})?)l6XY`<hj&zFaKH+|hP@RuGes z+pl6rT;cE6HKUxPWkCiuK$cJIlVi4n&t}Wrt@t9sjfHr%anx~v<k$ALI;psw@x{zr zJoNLDY8#D4tX9G^V1q~j31Ino{r{{`ir>K75A_M?Mvl8>0geRqj1LohU;m6d#zY>h zG)APhy12+r9MAI|*KM0&x3m(6NF(Qn!h59~^2F~!Ilj2J=m+b8{&(>lnh`$_%Np<r zx#MK_P0jtfe&4Tm$wl!m<ImRV2$(JXavzb;Y9w<9vNQJAi*Fbe4nu#q8GK_&__L9_ z#x_yzS>Yj~?os``sDJU2Xvio=BxlN@$bqaPSa04eZ9&Vs*bc-*ieqeeEN;oLVGrbi z`SEo}^(=iNYCAKT!4i9KvmrG?GMyazqT++O<^Nzz6v_~P+gl6o;~~9{FF5MELQVL0 z)a;~e`fy>`$9wJYCzghFjW;ZZ-?4tshBRirR}13TbIQOXaeLm3H0O{+&KgyjUp|C0 zuq86$W9<p*u?!dkNe@f+5vgnR|66?;D>LtGm%lDpWQ15U5`)&DK$hZck^OQNNvF%P z&P)W~A5euoyDl^ujT~ej^IBsRZ@~q|MruH8&>D!5dnM6>#UAL04vg9;g@NFTXs6}X zXOt?I4}ZU0SfJ0s7G^wTGb5v!<INh%GN)xNv_P7(^f8aWtek~sT6VntqTac?_q1a? zUo<2SpgDOC>xhq3O_6#;D~LIN%tos<KEb#VGLCJX#^{e0TO-rVv}97O^>Fw1(kC@I zqs`--UqXCAOo8onZe?7uE3s?#MSC+Z)-slmCl+H2xZAZr?Du`mVf9HRJhLL+xL@xY zq10irFg5WuDjK^;lR3h-vi~<_C$e47+%YlNTSl?^y%{nbx+~kmA7$R=G|xqrZ7x)z zOAFRJep)ivmg+y+T0=MH!7}R{?7|E=j%aMwQHsZPB$A8~IV0%n8ZCZ)8^f3l7@0YL zSmw5}cwUnHYrT81R&CT5S#kBek@Bz_!m{!xl3uJ8AS1xZX8pDiGmA3fbFAw@CGQ|v zFok`B23Dru)+}JC*NHDn>a4}(r^x-w#cJD8qpZIw2|+p)a7U<CKh$xy`K6Kr&!KrD zh59IQ*EOqE@y!2`SUIp1`F7-gR{TT`HlNoPGxuR{Bo^}z_q8ZClk4eAki8ilzT_2F z?Q_(ZxPWo^j0y~#P&Z{I1u~;2XLw}lpG3;ot1w2c*ICDLlNs9s@HOjH>S%pH^&V{= zE>=g<SnhfK1qM8e<M0SM6q(wJ@GiP-bCWinBTtKh%9&42mUm>lwwInF!p#D#xv2-h zD-wZ~*;i<Qjv~VjfQ-O-<abaBlaChZRTJ7!*~zNuJfPpBdM|Yb7HRu~_faw=n%7r9 zucH~`dCd%7y1tn4f9*%@o|G177=40?Xx6Jbtp$3Rfw5f!;cueWH4fvvDh;qrqhLf9 zQsZ~e$FE{d9!#~H$f0I`R?^!2&_i_3=-v<)V=N%oA!A@QtZj{HKIBL-HrJG+Pw*q7 zQJ3RMSN7=jtTgNDWz^-QG#`0UPGBS|1o_ko((K14bfJu5Ei<pBm5=|4EoNl}s>M!A z68$7|gmH}TMAC?OW_2|{MBz8E#+aiW#lqT8WA46JXRUR`L*bY;lgXlut*ioM@SuOT z9pf3hT7E|GY2gqVu#ELeD*4XM=+WrJmmLo+Ych_$z-osWni(I<jGV{1A|pF)`iCv^ z*o#hA;a&ULtnBG6(gFXxdLt**k^N%#N&UXEySe;zy*|CZ{LQD=>aW}TPj6Mf;d&kO z=@RXq)ZcgN*xU8{a&^&jR*(33oy$?z>gP($lOxcbA0+u;!6BZI8*WV4$9r2HE75hx zFJhq?l33(DdKP1KA=f1S?4%LZqR8lD^z^_%fJ|hRZP!Lrd{36xAQoPh>~Bh&u}4ho z$ZFv35F>C8mg$_GxaN1GQXWDUt@bYcki@;%zfj%Qku5GPz9ly8URy&EAJ%cOpt&+W z=(UDC(`>Id;(=rcWAbEoVek#z`Z0sI)@$jE8~BD?0V5KT=o0?Hvh!Ky<IYc3L$I<j zXC{xF^jlLgZTlHi{7{uLvM{#{liUWM>U%XFF*xHc*a)VMNevRQW%EP#I`q$M1@w7Q zcvU-A9`S^>8tYxK-pqqVWxQ0zcJ8rtR^a##$r}Y7Z&-xmz&zQG{3_lq?mk<jLQ-lX zvN=*>qxBqNN-fIq<e1k>WHCGW9h*@zlY!uTyTPrAGR8w-BJl(Ajxq0rlGe`Z)soRl ze$FV2q+Ddd2c-esg<uyHGrlVpMneLAF4buGk4k{w_9WVJA|A^%=ETQ&vdM9e;!k7@ zw;>BC6eD9@iAB|H=3qKxA{6GzXxg5YSJwjQ{&E?e)!EE5SQB4?Tx58$MA_3if2>{( zBUg!%-L-aizL0<9l|+)#S;3M`VYps_uV+CX=UH2ZiqtyPP7J<7%fvC&>-Y{UERF$} z*qofwymE}?n13Dn7Z=N5TWl#GS(_RAc1B`7_?n}@L8>$J)%ooFi#<}mUYJxXhEHd9 zV>~n)CBq`FGS+LQwWZxz1^XQtQ~@6@XzBirSrRL=ZyrwC&X^~AERTHWnH^>03UszK zRVDV{?(#4*+NA>l{#cEr--WNiAAV3uq-DKIZfF0PPoFRNa}8j`VPWm+$Vecj*kyr} zUzhGwxS~%^W(KMu(9HjjmodoH%nI6BLxN;FD0+lUDUZ$8JT_J&SzoU(S4NS?3I=wj z4~yQQMue`r2k;1cqaZpNB&=X{9-cvlaXviI7Q+YWDVc-#Y>T<{2pOY~Gb-<ujffX~ z8F|qOJ08l7JkdCPsrL5B;o@W6_tYLn)nP=y5$&5kc1t5Ap)!*-lL=$F_2?aChp`0$ zv!mpS7T@%mCh|Tn>%J*_St&fJBjUBlnjXDg0hdZQYSt``4vDAK!(%Lnpy%bY)B(&B zkFULx=z?#}u;Si`q@xb{@gB8EYu6gLjbNgWHkqjF1rVb2$T|A0U!R9}KpkfUb#sM> zjkInU25-Oz(SUlVt^D>JvqnbyW7I;FGyB%sgzTPug|^6H1(|A-->kgGdOD~|HD>OB zpYN<Z=oM6Vi_@%D&c~!!)V{1d><(r4C5UCc00ShGqiyg;4;%~d10wi$cc}_HhO+ZP z?VLVDG#f1=+drz&>5<4|tPePk&Z@j^b%H;wCsM0nS<V_Iv4@MSdY@Ux=wa-}yWHnW zZ<Hcz7MZ=4?2rq`vF13zD)-J|mEgM(dMNQW)<n^q)xbcXj}1oKP<^lhR}Z3#BVY)u zZLbP;=yiXhP_FHDVf=P>-I%l0ag?NI)WYNiu&4YW;8^#|dINSEwb8@m#P~PNomE)x ztg%~U7a{14G~uQ5#Uqk$<)A|x++T1o_xTT_z`CWo18Bnzn6XJDU?r+o;sj>p8Xu9$ zJNQ!8F#lMCQTvRR$7)u>R=!xgv&~lAhGF|mV+_QIgLMs^4rSPIoPS%&T*DPaiV9b4 z%qEhE1J=g!0-3J&F3od}9^4r>cB!x*wi;#OHCD#oFbVaUYY4{4nwr1qA9FPSZ&jH3 z<9s#Y-ARVAjvHgQ;{u!DU(tP--!CpWq0<Aey9Yh@));H%z`5d{ZE{%QvEmnJqlEIh zegD)cAat9p;?XtAJJv=iJo<PB0<|p>np4*|<HK-~kKTNCn&Ai58D8}=)?Z*It03$> zN;9wb->)&)1HQV{PE_m3jO-1&4vx0B3ajH)d&Cl2Jz3_`uVR*!!5FtNAgkn24z8&& zONtsXF>?g=b;Pk633j*f-W)(q=uEU;kB_n(*DzQmYQe*Ql^$@eTp=HiQl2dv{U+w+ z=XBvNQ8AC4$Yt(y#EJNMU318}t?O1^(bMoYv)jpmAMi12OLru(^H^IWLu1Lf8|Ojt zR511l@EH9js*$(#V(e!I`_xIWlG&1x(SsbWbl8AQL4Q*D;|DM@_9()985y0-i)etv z(E<H98=Hs%_GG~{I^=rEWEqaw%93LQ8x?qqC}1=`^$M~eecP*E0gEJuKInXv{B{;I z(ftwwXK5}XE-#U31!69B2IM$v4v@n2OIY(zUT04&5)7>?9kinErGueeJtAv~j#;E} zt+ySk*f^gYN<FSE`#5G#1=-i~h`xEQ_NAHxEyu9n$XJC;E)F<0*RFuN)D>e#0p2Hf zgK*a89LK7b`Q4cuIRGg{x{Ra`)o4T{b|HU+LApzn_~_l&v3@4HxB`a?(-jS4$OdZ2 zjN}Ak3gmaac)FhzN%$llP7K6b$r#ou%{AI~MpiWF9u%yc`)rghD|72d>MiUfrul3> zUVDZO)CXy`IM$aVv4x#CJFSjKmy1lNF4^C31vcxYHq55i{$As8#VzlHl31gqYhA&j z*M~eAj(i)+dwqj^>0uICNC1ygXN2ovJG3|Quw=&`K8Keh<6H-{$FDC(xl@7-jXL~q zuaFtoC1O<|vT{sN1s=zEh&-KP&MOr<zO7$I-Gjd9jl8hXG5$H*244M!jX0m{PuRhd z8$mSE@Cj&SM)%4Xli81Zk`efnvCJWJ#l#&3;H<9*Va%Yh{W*4JkR_h%{hN4zPsHlF zPUJj(s26{|**EL{Sa{`7vk~hvj@lb<^8voHa_D;du%qNPiC72S?(P0_k9BJZq9gW) zVTl8;fJz-CKV$cCmRN2pBiz}~Anu8w59=qk_-Oe%{Vi8`^t!BM(z~(3N{;XDmh}U1 zsNAXUd4;68end1J>uFsoEnRDqneBjM%`pO^VUB|%<ageoj|B$3_8R|+KGsa+ab7>H zJES-YCP-Zw<ba;--4}RbtOwQ^c?(Ne?L6LDqhnqXo#iE&4@Azf2wIG0G$#tp4zAOz zeT{Ck9j|7y-V{G$$BkUV86tbMmz}rs_|C{dn$BR%Za*Cha}@+t#wekf!_QQ0paBfv zL9cjAXX(vyM6O#ka~|%H$RN}VT}#;6NX3JcYM#CptZ#pWS)Ctzrki8ViX7ljIjt7f zdluOtBf}<&gVPy%hnVV|rIhrg=(!jJqgURB`0k>N+=_N*#nCJuN5WKiPJ2_Gj#3<I z;L7W#Ma9{SwH*tiH2<GbVIT55Q4vN11Hpqeks5_<!5-CjuU}ooX!(rN@ic1gF<ajF zDgJ)H{7pVQ{V^L8wQ>fl;jZV%)uSBtS92#a$jdbii9TYDexM!KRH2-ARwa@w*5lb5 z(srW+hgOW`=#$L-qklX%cjdO#pOr(}W5f|CAS;^*<*6R!PVu_?#pC|sz2%JL?!zw5 zv7FYcJee7OXOE0rf^5_Xqjj>^jSZWjsX=7A9NTrVUd8_K(O(zss0PRG(E6G$u}Y2* zXV+?U>QJq<T@7VMEGTxG6=&^{CA>9jDmGi=ZLS+_=01nIyk1xsi&?QS2kRp53A4+B zOs;g%#k~Szn3-5>5jk2G6c|sB>RqB9^kaWMVTSY!dM6FtdxrRe8k&qt=M?F>0>I9( z#<+ru{iqp69ztfkjs)a4?KK`TqhQNZdi1lJnR_C<?hCnPGQ0KO+p9gE)Mt!?1-kdk z8Lc0C3Ws-xZgCybQ~zn>tn|?*`wwO>y~7NAmemWIqCHmR+_@KgY`%-j7-)glSbKxz z8C&9;y9Bf2f?tvgSiLm^L~r8hKNl$)@gUBQ05V=It*j5+@pb*rRWC1=<Gd3jUPU7L z*wtcJ@W{e7KAfkwwaLpuFgRc@$1~>&Ig)PSfW8DZfN{ZJ)G$PXp4HZozx6^E>_}I_ zzJ8dJItX2|uXxt%V^07*4}F*D64Bcl=(S^OH*tcOT+7*)X|5Mp=%WU$z5A-U+N^uj za5Q7lrQ-=2*hnN3^|C}qhPf-Xb#R;=0_$wC@^%?w%NezJN8MV+J~F-6mQ9@EYnh0c zXYRLIzsKB)bTrQ0B4UT5c(RSJ+=1>|Klor(1gpvd$Pu)GEYJvBn2Y$tYyY-ofeFDV zOmP^g+X!h4QcL~IX2&87mHE-NGpDN->I$#4>&`64iOxgYX8pqNxx;}CMy?Gj^B%R4 z2+it+T50SKtSkEME)BX~DoeRT>?)ARwF}z4A*`6r;}{R;wZKo&Uv9?=xkHQD!jDK~ zzV{9_m{m5Ue&G}Mz+g$QhcZ5UjkxaZp3h>)bC@r)a}hMB-_72$z0$)vR}^_hBZS(( z=RnED9m`pFw4BI71Z??M<ZGeewxuy{h{g3?Rx<wDYQ&xysUyo8VXULqRzPRG0^3=q zP_0p!J*n4;Z~6;(m3Wz>@HbNw&J2O~!k+xq>=6D2#o-*Znmd$O9Oic3pkln2t(hnc z?=0lIV|A0~be#fs88=?r60VIew|0BNawD@CKluAy7$i|=hBjM)ukCwVa-ZbsQWYsR zwoGk{4fO$XxH>~q>ZD{ovntt-yW7V#AG5<8!Q%P6q@9%rFI$7z;b1N#8SRw3dW>!J zx%gi*?$}e#^}dY68tm9k0us!;?Q>M(VP?c<uBu>pKXC=cs?th25rEH9>utw%dIwmO zm~2)=maLlMb5||iIUMdJ@|0@yt+q8T$*$Up(GM{fJ8I`c4<N}g8+%Sxh@k4ww#FEv z@I#jR?GkfWOF#F2k=z}VSXvgqX5ItRPklQkN%nKF3)vzvZAs)9NVDbb%zzB@vn_}j zb_%xhlgForWQ4658O|iTQ`NT=SaG~pdp=7W&(+elCqd+)7c<jggjnD7?g(?Vw^JjS zKh(!n>K5jV?r&-YpWNY{9bpLk%f3OFNFR|uxcbhO8#80W_<Uw7P~Msx`sU^C=k>X( ziE($eBM|G18JTBKu<EiKK+aJPJot2<y`s-nzRFGr8D-u%LXPwsL6Ft!R*nRn);6&3 z+&NGEF?wZ-Mdm#FyCt@`)<-T04)q!K=Q<|jgRR0)>3HjplUn_97v8r^RAQgtN=Dk= z!KGq=p*S92qBm$)|M99sF&d6a#CC;hJwQ#O*Duycd^+9%I93Vc%vPEp8zjNs$g+jl zWI)bnbb<qC4HsQ3E&&<AX?(_*u@@S#Ub7Ft9xn)8>x?9=W$JKx0*sCIWNa)5GR-xq zeDKz`9*yxWe1HRG2WeyGMjlrscCM1o4q57_%`7K?#U9x!z4RyZALb+Uv_7>emHD{h zh&=JKMneyxj(tLU;~<FZuF=A^g1#d!vqGdQ<!Y8OLw4n@br>0W=E}0yC|fAC;$zhG zhK|kGK7hs4D>3I4KXX(nKk`s>qi-T$+g|$jkm1FYQL8tul|`@%e&2cq6;h4ygbdiP zSHR|0EKjUNuC9K;D>?2>jgNQU)SfUrKs*@PhdRtXp<~*lN=#kEamguJrI{I$g;N2A zOPSdt^4t-vfd>yiV|+A8&qJ?_zQj6_7S<4bUeP^bo-wr78prG`Faj)u<-nQipW|!6 z9?dJ(k|EFxOJ|iP7pt+7b@lPne9*bZs7_SOcQp|ObKOhc>3l9nn{TxW_8<4B^$IaM zW>R)el4(1B@j=T$rY0iUk7Vrv*2%%t1YApFcirsQp0rBj_&G1ex7+d~wHXiY*K1Z# z<5ixcN9DHJ7R?4?nEqHSv^@hT@o5<_1IJ)-Wz98S+ZvDe<6d9zX2wVqM_=y7c`;OM zZ}X=djU;)FQKP><8><14?y7I(8|oFk-x|S4#9{art-F%Lzj%&(&}TcV`4S)D_wgDC zqK$FXO#FbP^g!lOb8o!XTBCv7&CIbL*-I~O+fi+h%9!YV5cf#pb*hM2&dkt!%3Sj` zCdVUt+*JVk;EhPhHMr<+Erj%}$iz3uwodK4wC>k?>%4$o=`xTn(uMfE-nHV#gZNSF zbPtOxM+_kW_iqySGB0+G7qNybLGy(+XYCxjP*d4Ax3c$MP<?zJOA*D$z<49`^V(cG z+Ay&P?_!IQJ%~x=rcwcYTC-y}eT2i@$4p|ecY#2l8A1%cE-Rw<sQvhSuV0lWWF%wB z<FE`|sD<q4P}wHpxSzbaCtX?4`0d^*%yx(`S#6EOwGD%TF|KE8as*hT2AQ$N4C~5q ztlC9@9s<ui1q=jszB;XUx1-m06LUz=T+W_Ap7f1ASTps285Qm!FOg@6CuML<vNL+P zhce~|^Y&R4pqOP&bO&KFSikQaH};xZMYg{5S$_ZHTCgMJ(0jq3*3a``vLfjDkYnzb zBuhm);uA*GepnO~;|FqbsuH4t>}_WUy{JaPHo9WRa1FLJYB)wD`x#@*cd7N9oWs>$ zFcG77mPZ;!nR_jVV|k}lKjA60W$(AiJo;vBldep(`j(%NB$YkPC+gu0cZ5X0@eYUO z+8M5QlQ*8!vB!PM`G-%+ajoYQcE+ggD*DhjSkKiM{t?~B=T+BnEf6$xb<E81CMys= zkzWpH@AU<<gGnva*A(!Kbg+JX8FkFw<m6mGm)M`9MgC@1YaMb1^12dC>}}i9j4y|B zCj`C{t;q^Gp9=rMP;2o17AEG{{dm#qw2me2uGI{#pYGIXbG~OqC+3ho(HwMj#`b9; zjKkg{wh8JU>=O0lUAp~VJwoQfJKAGrf=}y6voxzQn4$Md*ZVVbKLKQ-Q*xKD_2Qix z#d_qJB(SWzg~X6NYA?WRYTyqM<`Y)*OwXo0sZ{WDa`LP%n77W5|EUwfe0KaZ1DQfz z!vg4oOvbb0gV$)noOUCqt(wumpQ{e89T_Y1?vT&&F+b<$3S8oeT#~pnwz*popZjX< zQ{-Yjgau#x7(-dL9dbRI_0>aM86|Tw?^?QX<W$(lP(N3pS=VHAF(MD9I=E1}QcWTe zb-#SSmcr-TrH9v*W}=e((a|Ed=}5Al$rV(wT8?*?x9`0m)tt>bZe-83wajZCrDjw= z$Mj+?lt{B)BZ|$6ku_|AEa&5kaOiRWgRb>myCWWmk@H~zsg9w6$cxXyVAgZ#^Ta}H zE9Q!~cd^g;zwcz`<`4Hzv$O{idBKbv8`Kij>)c{@je1B1ILqQ-(6PpvIcq=cD5toO zAvUd5V7BH1IB;AyWn}_iBnFTsyBs6e$&mOZS#IQR*>qfY=v~$cWJq>f)93H1pznqh zcj-wUuF%#iR3+c4{Ql7hI9tO+)FEQFzeR@C8dqUjJCX0OGr!HHy{fP#8?V5`6R}z1 zL_6KA$S1#L9hdyvIT0pcR-Ve(cNfjJ$+O_UEo_pz$L!vD@x@XljGYOyxK)T<G@gIg zC{9-v=|J3gWkMfCt%43gu@;&u8krs>$%>+!N)ap0G7)j$Ht&0`E2eo3bBM0)G$=dI zN@iAmcn0s!N>2ZMQBSz#n{qDIQ*il4xi9Ma{BM3dmSgxHG`w`Vo~OVwaQP0jtM&S{ zt}x>Ftvc^!JyDmlKd;w3Q+NG6bf45a*XoF?%NaN8Z=Tls*)l87{{^Ft$1xe>xNLc* z@3st%hF<yn>h90=H{XhPTJPSfzj$^q&k5#Tq`O>NbCubx`sa7(U8?tPEYjSl_rKm( z5{z`E-o3Sq^z~wcFBW^<taq@;?K&14pa)ME=BdHX!IOuvHP0L7Ny0pbxMk$&#XO&w zPd}}Zko2>9??%bTs94n}9sjD{y<M+*Ms&i1jC!?>#LxQWt9pm?d!DtwF4UQfjm#J7 zH`1fY&E<*6huC0V{D&;q?BDBnp1+LMukO!9US9oqkphXZ$0vI`@!9pVzn12G&SjJ< zrR|sXTHElh&t*QT&(Ky}={aqBTJP&`(KwI0mR{?q0XF))q`JLFBG|y^*BAd21+h2S z#U^~~BAW184_vCh+wxaRcCdned@JMa`v2ylxh&UcWUlM=Iex+4cgl*)rsvS9{q-L; z65sTQ1fxu%SV{QaLafJldM9(Oy=`>H$9(@5epbFad#{7I%-=}r2oJKD4QySjpDT+- zU)5iD!%@}fPK}S9GosJwCNd%`+TEyE*cTnJF;+xdaC3VHim%j<Pwqx0Y=`BsBIEEs z5d@1x8lDE;yeF6WbUa29Q=k;7Wri>7H!-i5842s_sq?W!WVy63B7CPU@u;)T@sBQe zLklFP-o^#kI0!Tfx3~cN!BET%LU`RzG;b`)C$Z|`Q_)A?t??vxY%waabaSyS(vm%l z-sV+t9;_s$J}F6&mb`GM(1cuAZsvyOpZWRm%yp-b0S2zuC^rUfkqM1+@YbmD+fwnh zNbpS1J<7tIMyp6fvasYFb;*&=z|m`FQTH5oELtyaYJN5+B9)`xDCtD9(xD9;7tQ-M z-ccv`2pgDlM6dE+DT~5s=Ch2EIq(&hM<eFo9M2}RB2)aVP0*OQB08Eu9VN(yXBml{ zfK<#$<~e39wI++g8IiNOF45Jof?PAA?<`l=G%FCb%!y`HEOSnd6?(+hhWMhw!7kVr ztAe0U7B({<&KfC=KI0n+#!RH<Eyaw?X1TGpLkqtdA$G$qZ~x8&<lv{P#Luci^_!rc zEjsib?dj6Tb5(Y_)W@#YT-|+B=UEkhQJ*owt*U6#^X16Q1v}5HPO5Fz!gMXz5n>HK zcbu|1B<52c_nMV=Uezb|Sd_;#ME5No*5_W)WLJXfABnu8k5x$T%B!Q}q#w~8i~9@D z<bCFGS0h(Uc%IjVX5VD&qTBcKs9r-MJMx^hrWjX}=@noFY?ZyGV^^neL@Y-)g1_Ba zT=)9zDIzgzAUxNY!*{1Oqn#AjJ^F;sabFATntH1j<u1KDTQ6&zwUtNASgTyGW6~|; z$`hUj5bwp-hqHTiDw4)iuJ`C#q@Ty0mz`SHRiKyM7S?s%5f|xLwdrH7O<{ibyv3|t zJUgJg^JbW{cPo0GD<;>^4rH|*|Fm2!32Q`T^jeed1=^2u|E{f~{Vy!No4M0)q2^&X zK+I%DB92I~TZ7-DJDB4&c8MkXo{7<$@ey7ZQ!{SB&L8SCXKoqvVfw&5%iI_88+Ev= z&CdHMxzCZoH^=~+pik_Kt(qOu0epY=$0gp7ihoz?_}Nlieed_4|Dk-!m@n!awP-n< zW$Yd~F0q`kPs@fz{j5`44Eti?_4*!Egy-BlJ}bWEKP{8pknvjhQ6`T)jD75%xQ`9v z_x>KAciA^_m#O)4?)Z)}WuBkXsha!M>(1&&Wyd)e%)4lC7+ua$nu~kfXn!JN?6-5p zE0!kOk9WEcBj9aV$o@z7J9}5SV*@Ur7wJ1AzO%EGE}H!#Bi0H#sLbwAs;1Ppsh!rH zBKv{hMkXSr%tBB1av%>KLiU)+d=KjNn&<SxXy>=B%-vh~zgd^xDXC($`AH-{4cqB) z5@m8E?34Ypb>_tK-_()ZU2u%g8HFq~KE<Ou#%mP+6sbqs(=&vT5ARIf;wuo~Zn3;i z)Ew`qACKZuf@_OCxMBqqyI0G&*GsDVReA9DZ+0Ko|J0mf3lH8}q7F-O1beO^lTUtK z|2|mWy<B6H6VZ^PSZm^g59-PJ^g2JRt9n0Nj{e>9J}a6_3kM(}KbLA2IGI@Y3I{Tz zUZ-}8#Q23MATqjowkEJHB3i=a_OhvWtt6;<xHJ9!GLP2}aXq2C4esAkku;lFKZh^3 zvr6Z3svIPR6|uuybs{@=1i{cqN$wP#)=G1ZC$f1)fXo9*u#;5+7BH`LtwoK8B(kM{ zn_)(&kjcBn51;+@X`Rj8M&3`{b<~>Ue_JR)yR$NR@;K{@R1$|7e8lIm+3~G=A?{q@ z3)Xy>3qy2r`Hs1(^_#Wfc6Xa-3V+P3fo<RH`TZ|@Ux2C~>i!@x5DxEbV!R$-Jz$yC zOu=FH%Gl+3QW#MqW(V;w(N;Fn$D@tLDuReyUnvEm!9}jbK=W-4?=N>iZCj<$kJccN z@A{x>H4Ye`8tF-WqAuW^xxwJtj%|(c6X&0~*;huj^SZ-N)Dn4lE(;bRYPa`A-{o49 z_e);-1=O=>!pej-DLz!!Ee+$<>=>cFYZKSP+6K-cFT-l?>GjnWv82_%Ys7c4oPNbd zR7FbedZp_GWWiFzvy#47N5U%ii&yZJ`5xK021B%YwaI(M*DwvdoAoc6$o-tF4Um84 z#Kz7y%e<U5uBSkaJkOfAxtfuZb+{YEmC?nL7T?6;eV?YauB)kWC5tvMmTw+VyU2+p zcmfZyaNPzTc5G`)Jx(;jdpy-ce%@NyWv{%iBxlYGbw=VT*qLpUIgy3684=9xHb~Al zuYR`3Pt3_P=7_%c2G3(dnY~dOmR)~O30}YkTvNuJ$S`JnFa-aYDP^J73r{oKlll$H z*6X&;eCf@YfwuKWZ{qDQ)ra27G~AQv{c~UxmQVgf4k8|FF%wdO9odKP#v<B?T~-UJ zl&}$gRJT9XImsiR)!#$`=QLuG?GH7E{$~dG0AHB7PRoX7J*tR5F1F;Eke8MiKn8Yp zKdvijKVBk_@#b@|{;g$9W+4~ZPjmdQ>OC-lo%lH|8;F8;;WRr&TFHt6+o7q~c!I3M zYfX5M+BEU9j%&{%Um=;e=6_Zn)LrAZ)})7+EBdXW&Kg;d$}sd8tdo!l>%&>R>nzyN zvBbyN6^d116YHa1FO2K6WZu~>%=5HR5nCM7vadUX={wtw^@$OHt!C-XI9*lhU;hu| zwtlSXM2M9FJr(p%=1H7ob#h~})JetJ*grs;TXnAYINq;uI3C1#J-9xmqNE2y?h=>G LqJ;DDM$Z2NjI)W( literal 0 HcmV?d00001 diff --git a/reactos/lib/cpl/sysdm/sysdm.c b/reactos/lib/cpl/sysdm/sysdm.c new file mode 100644 index 00000000000..08ab7509ff8 --- /dev/null +++ b/reactos/lib/cpl/sysdm/sysdm.c @@ -0,0 +1,176 @@ +/* + * 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: sysdm.c,v 1.1 2004/03/08 14:24:47 weiden 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 <windows.h> +#include <stdlib.h> +#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 */ +APPLET Applets[NUM_APPLETS] = +{ + {IDI_CPLSYSTEM, 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->u1.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[4]; + 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.u1.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; + + InitPropSheetPage(&psp[0], IDD_PROPPAGEGENERAL, GeneralPageProc); + InitPropSheetPage(&psp[1], IDD_PROPPAGECOMPUTER, ComputerPageProc); + InitPropSheetPage(&psp[2], IDD_PROPPAGEHARDWARE, HardwarePageProc); + InitPropSheetPage(&psp[3], IDD_PROPPAGEADVANCED, AdvancedPageProc); + + 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/sysdm/sysdm.def b/reactos/lib/cpl/sysdm/sysdm.def new file mode 100644 index 00000000000..1ed84314984 --- /dev/null +++ b/reactos/lib/cpl/sysdm/sysdm.def @@ -0,0 +1,6 @@ +LIBRARY cplsample.cpl + +EXPORTS +CPlApplet@16 + +; EOF diff --git a/reactos/lib/cpl/sysdm/sysdm.edf b/reactos/lib/cpl/sysdm/sysdm.edf new file mode 100644 index 00000000000..47e146aa470 --- /dev/null +++ b/reactos/lib/cpl/sysdm/sysdm.edf @@ -0,0 +1,6 @@ +LIBRARY cplsample.cpl + +EXPORTS +CPlApplet=CPlApplet@16 + +; EOF diff --git a/reactos/lib/cpl/sysdm/sysdm.h b/reactos/lib/cpl/sysdm/sysdm.h new file mode 100644 index 00000000000..0640f5fd283 --- /dev/null +++ b/reactos/lib/cpl/sysdm/sysdm.h @@ -0,0 +1,20 @@ +#ifndef __CPL_SYSDM_H +#define __CPL_SYSDM_H + +typedef LONG (CALLBACK *APPLET_PROC)(VOID); + +typedef struct +{ + int idIcon; + int idName; + int idDescription; + APPLET_PROC AppletProc; +} APPLET, *PAPPLET; + +extern HINSTANCE hApplet; + +void ShowLastWin32Error(HWND hWndOwner); + +#endif /* __CPL_SYSDM_H */ + +/* EOF */ diff --git a/reactos/lib/cpl/sysdm/sysdm.rc b/reactos/lib/cpl/sysdm/sysdm.rc new file mode 100644 index 00000000000..64a2fba81c6 --- /dev/null +++ b/reactos/lib/cpl/sysdm/sysdm.rc @@ -0,0 +1,93 @@ +#include <reactos/resource.h> +#include <defines.h> +#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 System Control Panel\0" + VALUE "FileVersion", RES_STR_FILE_VERSION + VALUE "InternalName", "sysdm\0" + VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT + VALUE "OriginalFilename", "sysdm.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_CPLSYSTEM ICON "resources/applet.ico" +IDI_DEVMGR ICON "resources/devmgr.ico" +RC_LICENSE RTDATA "resources/gpl.txt" + +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 + LTEXT "Operating System",-1,SYSTEM_COLUMN,LABELLINE(2),PROPSHEETWIDTH-SYSTEM_COLUMN-PROPSHEETPADDING,8 + LTEXT RES_STR_PRODUCT_NAME,-1,SYSTEM_COLUMN+PROPSHEETPADDING,LABELLINE(3),PROPSHEETWIDTH-SYSTEM_COLUMN-PROPSHEETPADDING,8 + LTEXT "Version " RES_STR_PRODUCT_VERSION,-1,SYSTEM_COLUMN+PROPSHEETPADDING,LABELLINE(4),PROPSHEETWIDTH-SYSTEM_COLUMN-PROPSHEETPADDING,8 + + LTEXT "Computer",-1,SYSTEM_COLUMN,LABELLINE(6),PROPSHEETWIDTH-SYSTEM_COLUMN-PROPSHEETPADDING,8 + LTEXT "",IDC_PROCESSORMANUFACTURER,SYSTEM_COLUMN+PROPSHEETPADDING,LABELLINE(7),PROPSHEETWIDTH-SYSTEM_COLUMN-PROPSHEETPADDING,8 + LTEXT "",IDC_PROCESSOR,SYSTEM_COLUMN+PROPSHEETPADDING,LABELLINE(8),PROPSHEETWIDTH-SYSTEM_COLUMN-PROPSHEETPADDING,8 + LTEXT "",IDC_PROCESSORSPEED,SYSTEM_COLUMN+PROPSHEETPADDING,LABELLINE(9),PROPSHEETWIDTH-SYSTEM_COLUMN-PROPSHEETPADDING,8 + LTEXT "",IDC_SYSTEMMEMORY,SYSTEM_COLUMN+PROPSHEETPADDING,LABELLINE(10),PROPSHEETWIDTH-SYSTEM_COLUMN-PROPSHEETPADDING,8 + + EDITTEXT IDC_LICENSEMEMO,PROPSHEETPADDING,LABELLINE(13),PROPSHEETWIDTH-(2*PROPSHEETPADDING),PROPSHEETHEIGHT-LABELLINE(13)-PROPSHEETPADDING,ES_LEFT|WS_TABSTOP|WS_BORDER|WS_VSCROLL|WS_HSCROLL|WS_GROUP|ES_MULTILINE|ES_READONLY +END + +IDD_PROPPAGECOMPUTER DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Computer Name" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + /* LTEXT "Property Page 2",-1,73,74,90,8 */ +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 + 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 +END + +IDD_PROPPAGEADVANCED DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT +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 */ +END + +STRINGTABLE +BEGIN + IDS_CPLSYSTEMNAME "System" + IDS_CPLSYSTEMDESCRIPTION "See information about your computer and change various system and hardware settings." +END From a8d7de6a74320a861cc11309757eaf5dee862414 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Mon, 8 Mar 2004 14:31:49 +0000 Subject: [PATCH 0380/1463] - Fixed DPRINT. svn path=/trunk/; revision=8592 --- reactos/drivers/video/videoprt/videoprt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index 8e74b316d1f..2d9b8a235d4 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.12 2004/03/08 08:05:26 navaraf Exp $ + * $Id: videoprt.c,v 1.13 2004/03/08 14:31:49 navaraf Exp $ */ #include "videoprt.h" @@ -1268,7 +1268,7 @@ InternalMapMemory(IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension, DPRINT("- IoAddress: %lx\n", IoAddress.u.LowPart); DPRINT("- NumberOfUchars: %lx\n", NumberOfUchars); - DPRINT("- InIoSpace: %c\n", InIoSpace); + DPRINT("- InIoSpace: %x\n", InIoSpace); if (0 != (InIoSpace & VIDEO_MEMORY_SPACE_P6CACHE)) { DPRINT("VIDEO_MEMORY_SPACE_P6CACHE not supported, turning off\n"); From 41a343503933a15176f39a836e80fe67afd8bca1 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Mon, 8 Mar 2004 18:09:05 +0000 Subject: [PATCH 0381/1463] Get MSYS and a few others working again.... svn path=/trunk/; revision=8593 --- reactos/lib/advapi32/advapi32.def | 14 ++++----- reactos/lib/advapi32/advapi32.edf | 14 ++++----- reactos/lib/advapi32/makefile | 3 +- reactos/lib/advapi32/sec/lsa.c | 21 ++++++++++++- reactos/lib/advapi32/sec/misc.c | 50 +++++++++++++++++++++++++++---- 5 files changed, 81 insertions(+), 21 deletions(-) diff --git a/reactos/lib/advapi32/advapi32.def b/reactos/lib/advapi32/advapi32.def index 44b87c8c4b1..390bfcda831 100644 --- a/reactos/lib/advapi32/advapi32.def +++ b/reactos/lib/advapi32/advapi32.def @@ -1,4 +1,4 @@ -; $Id: advapi32.def,v 1.15 2004/02/26 00:33:09 sedwards Exp $ +; $Id: advapi32.def,v 1.16 2004/03/08 18:09:04 sedwards Exp $ ; ; advapi32.def ; @@ -170,7 +170,7 @@ GetTokenInformation@20 ;GetTrusteeTypeA@4 ;GetTrusteeTypeW@4 GetUserNameA@8 -;GetUserNameW@8 +GetUserNameW@8 ;GrantAccessRightsA@16 ;GrantAccessRightsW@16 ;I_ScGetCurrentGroupStateW@12 @@ -208,7 +208,7 @@ LookupPrivilegeValueW@12 ;LsaAddAccountRights@16 ;LsaAddPrivilegesToAccount@8 ;LsaClearAuditLog@4 -;LsaClose@4 +LsaClose@4 ;LsaCreateAccount@16 ;LsaCreateSecret@16 ;LsaCreateTrustedDomain@16 @@ -220,7 +220,7 @@ LookupPrivilegeValueW@12 ;LsaEnumeratePrivileges@20 ;LsaEnumeratePrivilegesOfAccount@8 ;LsaEnumerateTrustedDomains@20 -;LsaFreeMemory@4 +LsaFreeMemory@4 ;LsaGetQuotasForAccount@8 ;LsaGetSystemAccessAccount@8 ;LsaGetUserName@8 @@ -231,13 +231,13 @@ LookupPrivilegeValueW@12 ;LsaLookupPrivilegeName@12 ;LsaLookupPrivilegeValue@12 ;LsaLookupSids@20 -;LsaNtStatusToWinError@4 +LsaNtStatusToWinError@4 ;LsaOpenAccount@16 -;LsaOpenPolicy@16 +LsaOpenPolicy@16 ;LsaOpenSecret@16 ;LsaOpenTrustedDomain@16 ;LsaQueryInfoTrustedDomain -;LsaQueryInformationPolicy@12 +LsaQueryInformationPolicy@12 ;LsaQuerySecret@20 ;LsaQuerySecurityObject@12 ;LsaQueryTrustedDomainInfo@16 diff --git a/reactos/lib/advapi32/advapi32.edf b/reactos/lib/advapi32/advapi32.edf index 1332741d31b..10df2e3281f 100644 --- a/reactos/lib/advapi32/advapi32.edf +++ b/reactos/lib/advapi32/advapi32.edf @@ -1,4 +1,4 @@ -; $Id: advapi32.edf,v 1.33 2004/02/28 22:26:34 navaraf Exp $ +; $Id: advapi32.edf,v 1.34 2004/03/08 18:09:05 sedwards Exp $ ; ; advapi32.edf ; @@ -166,7 +166,7 @@ GetTokenInformation=GetTokenInformation@20 ;GetTrusteeTypeA=GetTrusteeTypeA@4 ;GetTrusteeTypeW=GetTrusteeTypeW@4 GetUserNameA=GetUserNameA@8 -;GetUserNameW=GetUserNameW@8 +GetUserNameW=GetUserNameW@8 ;GrantAccessRightsA=GrantAccessRightsA@16 ;GrantAccessRightsW=GrantAccessRightsW@16 ;I_ScGetCurrentGroupStateW=I_ScGetCurrentGroupStateW@12 @@ -204,7 +204,7 @@ LookupPrivilegeValueW=LookupPrivilegeValueW@12 ;LsaAddAccountRights=LsaAddAccountRights@16 ;LsaAddPrivilegesToAccount@8 ;LsaClearAuditLog@4 -;LsaClose=LsaClose@4 +LsaClose=LsaClose@4 ;LsaCreateAccount@16 ;LsaCreateSecret@16 ;LsaCreateTrustedDomain@16 @@ -216,7 +216,7 @@ LookupPrivilegeValueW=LookupPrivilegeValueW@12 ;LsaEnumeratePrivileges@20 ;LsaEnumeratePrivilegesOfAccount@8 ;LsaEnumerateTrustedDomains=LsaEnumerateTrustedDomains@20 -;LsaFreeMemory=LsaFreeMemory@4 +LsaFreeMemory=LsaFreeMemory@4 ;LsaGetQuotasForAccount@8 ;LsaGetSystemAccessAccount@8 ;LsaGetUserName@8 @@ -227,13 +227,13 @@ LookupPrivilegeValueW=LookupPrivilegeValueW@12 ;LsaLookupPrivilegeName@12 ;LsaLookupPrivilegeValue@12 ;LsaLookupSids=LsaLookupSids@20 -;LsaNtStatusToWinError +LsaNtStatusToWinError ;LsaOpenAccount@16 -;LsaOpenPolicy=LsaOpenPolicy@16 +LsaOpenPolicy=LsaOpenPolicy@16 ;LsaOpenSecret@16 ;LsaOpenTrustedDomain@16 ;LsaQueryInfoTrustedDomain -;LsaQueryInformationPolicy=LsaQueryInformationPolicy@12 +LsaQueryInformationPolicy=LsaQueryInformationPolicy@12 ;LsaQuerySecret@20 ;LsaQuerySecurityObject@12 ;LsaQueryTrustedDomainInfo=LsaQueryTrustedDomainInfo@16 diff --git a/reactos/lib/advapi32/makefile b/reactos/lib/advapi32/makefile index b24c4dd1016..98762ebaece 100644 --- a/reactos/lib/advapi32/makefile +++ b/reactos/lib/advapi32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.36 2004/02/26 16:16:18 navaraf Exp $ +# $Id: makefile,v 1.37 2004/03/08 18:09:05 sedwards Exp $ PATH_TO_TOP = ../.. @@ -28,6 +28,7 @@ REGISTRY_OBJECTS = \ SECURITY_OBJECTS = \ sec/ac.o \ sec/audit.o \ + sec/lsa.o \ sec/misc.o \ sec/sec.o \ sec/sid.o diff --git a/reactos/lib/advapi32/sec/lsa.c b/reactos/lib/advapi32/sec/lsa.c index d0f2b118477..41c31f52e64 100644 --- a/reactos/lib/advapi32/sec/lsa.c +++ b/reactos/lib/advapi32/sec/lsa.c @@ -1,4 +1,4 @@ -/* $Id: lsa.c,v 1.9 2004/02/25 14:25:11 ekohl Exp $ +/* $Id: lsa.c,v 1.10 2004/03/08 18:09:05 sedwards Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -17,6 +17,21 @@ #include <ntsecapi.h> #include <debug.h> +/****************************************************************************** + * LsaNtStatusToWinError [ADVAPI32.@] + * + * PARAMS + * Status [I] + * + * @implemented + */ +ULONG WINAPI +LsaNtStatusToWinError(NTSTATUS Status) +{ + return RtlNtStatusToDosError(Status); +} + + /****************************************************************************** * LsaOpenPolicy [ADVAPI32.@] * @@ -38,6 +53,10 @@ LsaOpenPolicy (PLSA_UNICODE_STRING lsaucs, return STATUS_SUCCESS; } +#ifndef SID_REVISION /* FIXME - Winnt.h */ +#define SID_REVISION (1) /* Current revision */ +#endif + /* * @unimplemented */ diff --git a/reactos/lib/advapi32/sec/misc.c b/reactos/lib/advapi32/sec/misc.c index 6f7b1f7eed6..b0119b3f3c3 100644 --- a/reactos/lib/advapi32/sec/misc.c +++ b/reactos/lib/advapi32/sec/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.10 2004/02/25 23:54:13 sedwards Exp $ +/* $Id: misc.c,v 1.11 2004/03/08 18:09:05 sedwards Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -158,13 +158,53 @@ RevertToSelf(VOID) * RETURNS * Success: The length of the user name, including terminating NUL. * Failure: ERROR_MORE_DATA if *lpSize is too small. + * + * @unimplemented */ -BOOL STDCALL +BOOL WINAPI GetUserNameA( LPSTR lpszName, LPDWORD lpSize ) { - DPRINT1("GetUserNameA - Unimplemented\n"); - return 1; +// size_t len; +// char name[] = { "Administrator" }; + + /* We need to include the null character when determining the size of the buffer. */ +// len = strlen(name) + 1; +// if (len > *lpSize) +// { +// SetLastError(ERROR_MORE_DATA); +// *lpSize = len; +// return 0; +// } + +// *lpSize = len; +// strcpy(lpszName, name); + return TRUE; +} + +/****************************************************************************** + * GetUserNameW [ADVAPI32.@] + * + * See GetUserNameA. + * + * @unimplemented + */ +BOOL WINAPI +GetUserNameW( LPWSTR lpszName, LPDWORD lpSize ) +{ +// char name[] = { "Administrator" }; + +// DWORD len = MultiByteToWideChar( CP_ACP, 0, name, -1, NULL, 0 ); + +// if (len > *lpSize) +// { +// SetLastError(ERROR_MORE_DATA); +// *lpSize = len; +// return FALSE; +// } + +// *lpSize = len; +// MultiByteToWideChar( CP_ACP, 0, name, -1, lpszName, len ); + return TRUE; } /* EOF */ - From f350173836a3ea2df7dcb96bd21b3714a37a2a75 Mon Sep 17 00:00:00 2001 From: Richard Campbell <betam4x@gmail.com> Date: Mon, 8 Mar 2004 20:16:45 +0000 Subject: [PATCH 0382/1463] fix corrupted GPL problem svn path=/trunk/; revision=8594 --- reactos/lib/cpl/sysdm/resources/gpl.txt | Bin 36690 -> 36700 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/reactos/lib/cpl/sysdm/resources/gpl.txt b/reactos/lib/cpl/sysdm/resources/gpl.txt index 86ed154a2d2821b30f0faff3e888df147ca1e776..4c894fc7e8502ef1c675c229a3ab02cba0765f25 100644 GIT binary patch delta 44 ucmcaKkLk`lrVZ!B7<o3I6?-TSq}J+XO9ClzkKYnNN-!}SBv@T>T?_zyzz@R! delta 42 zcmV+_0M-B8o&wUI0<g{&lQ?(~v)~rc7qhZ1Y8kU0NctF)U?~W*B4J_|vxa!q7MVyA A7XSbN From 5df0488416c738ddfeac0dda0ce8a82e112782f4 Mon Sep 17 00:00:00 2001 From: Richard Campbell <betam4x@gmail.com> Date: Mon, 8 Mar 2004 20:19:54 +0000 Subject: [PATCH 0383/1463] one more change. svn path=/trunk/; revision=8595 --- reactos/lib/cpl/sysdm/resources/gpl.txt | Bin 36700 -> 30820 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/reactos/lib/cpl/sysdm/resources/gpl.txt b/reactos/lib/cpl/sysdm/resources/gpl.txt index 4c894fc7e8502ef1c675c229a3ab02cba0765f25..4b6523f5f96d946638a722ebf8d5582b18821dc7 100644 GIT binary patch delta 38 hcmcaJkLk$=M&bYe6d2Ip<f~%N6Ww-f)?y4R2LSO83w;0p delta 4188 zcma)9&u^4v5PnPBg%)a|OS`nore7CG*`$<|gDKKfst{Tf3R1u(g57R^?85${+p=zA zvXU5&D9+JDA@S@%W5UIQH?Mjl@#slog8zW{JTv?5j}{WM*>At^{oa{*X6BihcmH_a z_WRencD?vlo(`OQbmM6vaR2l3!``;Va<#{GyM2z=uDal?E4VVAHt`#{8CS$7>ngZk zaA~*dO8D}A)or*Op8U>5?BBv#;4b4GHC(|{!L8$()Sa}$FCoskH5c55S_%bj1tRzH z&EmO;=On)QnwnyZnlXKwheS}9E@OWlfCHD&t3h9uUnj#=nqS5HO<YU35<n4FO88{l zGAz=aEj;npBsbO30Q<IdN5-Wb?fUiQnyvtDCN(rBm&Cp_w3;uv|0o_ABfHwR9E9$w zIl=`Xd6J9CFL(FJxBdHj0w|$70f9?$HX`TR2jtvjUyp~Vk(XQDk--%>5<q`J;nB%W z$O42sn~e1`gaxb+KAe}{wSHL|>#mMNh8eJc5nTyVYc;1BAn#6HANH8@IlZG*9}EUH z39QssU{;~W0%6F=3EB_vF2isSsW4UKAV6`7tPz0xoCuGmu$oskkaXV6s{06PvYM$3 zcgU@g*aQPbCNxaej9{&VT##K^-H`?;Fib|ygq8MQZyZ|5xe8!rK-M%Y#vz@>6B$S@ znhkQ2%;7rOM5<e$%E}k=tbun;EoZUPoCGDpG#1ws8WoQ#C4F5mGgEkHrW+v4&^nCY zm-(@1aun`SH7jd7$YphfA*DH%7NJ{i2$ekXr9uX=Fvi_<y*7#AZ5bH}Kl*OZJ5z`Z z6>MOGfom8wl}UKYXclx29cgxE0dI`_MR_n6mdClnku%WbD}Ni=+ffqoqBqvttb=Pa zlcVx+`?x#~^|dEK=4a_>SACB}JCDiX(13iB?U3Jw4$9Dackd}!F@&0HNuKIIK#X-M zygx3Fj>Os$@?-i~Y-b|2V~^iHRAt~;oT?MQ^t-4j;7W67%h;L4CqNHjimb;NFUDF> zENcV<cN0aq;AY*tyN+Kr-^*?hzc+FB9zJ;f0529D14#8WNs3zuv4J*2%YYl~-E2rK z5;m(1e5_frxEP+MaLA>5Bkc&0l<v(9UxQSG&`rDC1;Dy44?+{?$zqlP3)$#Twy_`3 zb+U?b&9XKnT8dNVFAmGY_#ydXszW|&KZ+FZm&eN;yGb{E<fnM_NR2|U(wHcWLPlAx zB_<Qu({i@6qtm3K+31&Td)mfiZ`)SH!<bQ6>^(_@WJS8Bqg580<*_mLtOr>$WpF)P zmvP5#!>N&iqlA+Oh?HuyK2d~jGQt95p=bm`2cIU6!NqKo&)@8o?-N5+PMFrwzyvY5 zoI^yxGPbT}?Y6bEFwr(vNDBsxUR!UXholSTeY>`?#5X!_BzI!)BooOLzOf^57vN_> z6MbKGTMs_49`1VGo!0T=TSnD4jOPBdvsE;+;-$&~jA>whBUI0Kmc?7{8j9pyEtB*3 zWszLQik6Bj=6kM^8=jr5oMh=%G(mw|s)dt@FT2qiUu(QWrTNx{V9Ga`(M!8KCj2<? zlweIUm1SJBb;N!&)Mj{s!Eg3>3*jU#l7!Qd2_;qXa&jQ@A<@4aWeO-?<ynJdL{3a; z^^|7-KHEtk>9X=9(Z9Og_r{=Weq;7pN2xtov6vka-i~R!X5a}2B>a`H?nLF&(3m`* z4Mpd*R+&?t33!^RAF7B5yx|+)D6JSO8Z~R692IP+*3Ee8AvcWdd5mtBi+ReZ@=l4p zBg?Pww2IJL;OP|W+@RX|!OnE77J^|aSu57lPhcmjFNOLeRee)rJElWS{wnsD+zEXA z2sVv`TEec3>)fQU{1Y0KKjVGX)|k_CdK|z{`s`a0#i^Qoz5vk1sN+z_>F*<2R!DcT zg3+m0Z9Q1^r*lSf!zJ*}z*o-VhH0XwC3wa`Q-Bes%#<^@m0Ai3jOXcftkFo|;xata zA6vm1rL$P$IHHj_-fC&e)v-bCdelcdJoM;M6*4TV3JQ|NIID6bw2cAlgFO1s?N!Yh z1JpQ`87=)urL?V|Ey5FqX2n&e)F_>r!(9pnc~5axwYB^0PFMuNM434h>2Dkd?GFY) z=G8U2MEFaXm@jFbTFJ+i4x~;RJAM171&$H^NwMx{2Mg<mMOdKQtRZHsj5|_{?i)c# z-iuWz@Xd1;_hcu98f}8$rl7>~Mib09<81AE0a3zH5Ko+P(;Auytng1EO=fXFf$l$v zuXnZ~bDBbo<`q>+GwgWwN6ie}z#0=yVSX171@>B;EhO00A@65i+iRmVhxJW)a3`{x z@kXt)PVisJqF<o2{CzMI+s<pALFlHAU9GK$b0Hk!j6(c-#}Ur)N=<Z~h0IkWAo2Su zVs@+_F%NkSobTa`fAcx0`LO3_LEV!+-AqGy<U}2kzYY#|5tjblmbRJjrN+Rsrp5rZ yf@^XO8k>d{p!hCRgD+3^hkJS0r$e=WyOIi>Y-ix^tq%7P1<wXN>#s;GG5Q~!HT_5c From 2b4fa805eb92a9a19a40bd966a51dcdd3ba02b3b Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Mon, 8 Mar 2004 20:27:33 +0000 Subject: [PATCH 0384/1463] - Hacky implementation of some dma related functions. svn path=/trunk/; revision=8596 --- reactos/drivers/video/videoprt/videoprt.c | 70 +++++++++++++++++---- reactos/drivers/video/videoprt/videoprt.def | 3 +- reactos/drivers/video/videoprt/videoprt.edf | 3 +- 3 files changed, 63 insertions(+), 13 deletions(-) diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index 2d9b8a235d4..b1254a24aab 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.13 2004/03/08 14:31:49 navaraf Exp $ + * $Id: videoprt.c,v 1.14 2004/03/08 20:27:33 dwelch Exp $ */ #include "videoprt.h" @@ -144,7 +144,6 @@ UCHAR STDCALL VideoPortGetCurrentIrql(VOID) { - DPRINT("VideoPortGetCurrentIrql\n"); return KeGetCurrentIrql(); } @@ -409,8 +408,6 @@ VideoPortGetRegistryParameters(IN PVOID HwDeviceExtension, UNIMPLEMENTED; } - DPRINT("ParameterName %S\n", ParameterName); - Context.HwDeviceExtension = HwDeviceExtension; Context.HwContext = HwContext; Context.HwGetRegistryRoutine = GetRegistryRoutine; @@ -965,8 +962,6 @@ VideoPortSynchronizeExecution(IN PVOID HwDeviceExtension, PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; KIRQL OldIrql; - DPRINT("VideoPortSynchronizeExecution\n"); - switch(Priority) { case VpLowPriority: @@ -1400,6 +1395,7 @@ VideoPortDDCMonitorHelper( ULONG EdidBufferSize ) { + DPRINT1("VideoPortDDCMonitorHelper() - Unimplemented.\n"); return FALSE; } @@ -1564,8 +1560,10 @@ VideoPortAllocateCommonBuffer ( IN PVOID HwDeviceExtension, IN BOOLEAN CacheEnabled, PVOID Reserved ) { - DPRINT1("VideoPortAllocateCommonBuffer(): Unimplemented.\n"); - return(NULL); + return HalAllocateCommonBuffer((PADAPTER_OBJECT)VpDmaAdapter, + DesiredLength, + LogicalAddress, + CacheEnabled); } VOID @@ -1577,7 +1575,11 @@ VideoPortReleaseCommonBuffer ( IN PVOID HwDeviceExtension, IN PVOID VirtualAddress, IN BOOLEAN CacheEnabled ) { - DPRINT1("VideoPortReleaseCommonBuffer(): Unimplemented.\n"); + HalFreeCommonBuffer((PADAPTER_OBJECT)VpDmaAdapter, + Length, + LogicalAddress, + VirtualAddress, + CacheEnabled); } VP_STATUS @@ -1590,13 +1592,50 @@ VideoPortCreateSecondaryDisplay ( IN PVOID HwDeviceExtension, return STATUS_UNSUCCESSFUL; } +VOID +STDCALL +VideoPortPutDmaAdapter ( IN PVOID HwDeviceExtension, + IN PVP_DMA_ADAPTER VpDmaAdapter ) +{ + DPRINT("VideoPortPutDmaAdapter(): Unimplemented.\n"); +} + PVP_DMA_ADAPTER STDCALL VideoPortGetDmaAdapter ( IN PVOID HwDeviceExtension, IN PVP_DEVICE_DESCRIPTION VpDeviceExtension ) { - DPRINT1("VideoPortGetDmaAdapter(): Unimplemented.\n"); - return NULL; + DEVICE_DESCRIPTION DeviceDescription; + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + ULONG NumberOfMapRegisters; + PVP_DMA_ADAPTER Adapter; + + DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, + VIDEO_PORT_DEVICE_EXTENSION, + MiniPortDeviceExtension); + + DPRINT("VideoPortGetDmaAdapter()\n"); + + DeviceDescription.Version = DEVICE_DESCRIPTION_VERSION; + DeviceDescription.Master = TRUE /* ?? */; + DeviceDescription.ScatterGather = TRUE /* ?? */; + DeviceDescription.DemandMode = FALSE /* ?? */; + DeviceDescription.AutoInitialize = FALSE /* ?? */; + DeviceDescription.Dma32BitAddresses = TRUE /* ?? */; + DeviceDescription.IgnoreCount = FALSE /* ?? */; + DeviceDescription.Reserved1 = FALSE; + DeviceDescription.BusNumber = DeviceExtension->SystemIoBusNumber; + DeviceDescription.DmaChannel = 0 /* ?? */; + DeviceDescription.InterfaceType = DeviceExtension->AdapterInterfaceType; + DeviceDescription.DmaWidth = Width8Bits; + DeviceDescription.DmaSpeed = Compatible; + DeviceDescription.MaximumLength = 65536 /* ?? */; + DeviceDescription.DmaPort = 0; + + Adapter = + (PVP_DMA_ADAPTER)HalGetAdapter(&DeviceDescription, &NumberOfMapRegisters); + DPRINT("Adapter %X\n", Adapter); + return(Adapter); } @@ -1613,6 +1652,7 @@ VideoPortGetVersion ( IN PVOID HwDeviceExtension, Version.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW); if (VpOsVersionInfo->Size >= sizeof(VPOSVERSIONINFO)) { +#if 1 if (NT_SUCCESS(RtlGetVersion((PRTL_OSVERSIONINFOW)&Version))) { VpOsVersionInfo->MajorVersion = Version.dwMajorVersion; @@ -1623,6 +1663,14 @@ VideoPortGetVersion ( IN PVOID HwDeviceExtension, return STATUS_SUCCESS; } return STATUS_UNSUCCESSFUL; +#else + VpOsVersionInfo->MajorVersion = 5; + VpOsVersionInfo->MinorVersion = 0; + VpOsVersionInfo->BuildNumber = 2195; + VpOsVersionInfo->ServicePackMajor = 4; + VpOsVersionInfo->ServicePackMinor = 0; + return(STATUS_SUCCESS); +#endif } return ERROR_INVALID_PARAMETER; diff --git a/reactos/drivers/video/videoprt/videoprt.def b/reactos/drivers/video/videoprt/videoprt.def index 6812d2bf548..e0bd5ee958d 100644 --- a/reactos/drivers/video/videoprt/videoprt.def +++ b/reactos/drivers/video/videoprt/videoprt.def @@ -1,4 +1,4 @@ -; $Id: videoprt.def,v 1.6 2004/03/07 04:43:55 dwelch Exp $ +; $Id: videoprt.def,v 1.7 2004/03/08 20:27:33 dwelch Exp $ ; ; vidport.def - export definition file for ReactOS ; @@ -37,6 +37,7 @@ VideoPortLogError@16 VideoPortMapBankedMemory@40 VideoPortMapMemory@24 VideoPortMoveMemory@12 +VideoPortPutDmaAdapter@8 VideoPortQueueDpc@12 VideoPortReadPortUchar@4 VideoPortReadPortUshort@4 diff --git a/reactos/drivers/video/videoprt/videoprt.edf b/reactos/drivers/video/videoprt/videoprt.edf index d9c7977ea5b..bce89b97afb 100644 --- a/reactos/drivers/video/videoprt/videoprt.edf +++ b/reactos/drivers/video/videoprt/videoprt.edf @@ -1,4 +1,4 @@ -; $Id: videoprt.edf,v 1.6 2004/03/07 04:43:55 dwelch Exp $ +; $Id: videoprt.edf,v 1.7 2004/03/08 20:27:33 dwelch Exp $ ; ; vidport.def - export definition file for ReactOS ; @@ -39,6 +39,7 @@ VideoPortLogError=VideoPortLogError@16 VideoPortMapBankedMemory=VideoPortMapBankedMemory@40 VideoPortMapMemory=VideoPortMapMemory@24 VideoPortMoveMemory=NTOSKRNL.RtlMoveMemory +VideoPortPutDmaAdapter=VideoPortPutDmaAdapter@8 VideoPortQueryServices=VideoPortQueryServices@12 VideoPortQuerySystemTime=NTOSKRNL.KeQuerySystemTime VideoPortQueueDpc=VideoPortQueueDpc@12 From 03e7c82dd20758ad6e82f7dc11826423331c57e0 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Mon, 8 Mar 2004 20:54:10 +0000 Subject: [PATCH 0385/1463] - Mask out VIDEO_MEMORY_SPACE_DENSE flag, because it's specific to ALPHA processors. This gets Matrox Mystique driver working. svn path=/trunk/; revision=8597 --- reactos/drivers/video/videoprt/videoprt.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index b1254a24aab..d0bd6364a06 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.14 2004/03/08 20:27:33 dwelch Exp $ + * $Id: videoprt.c,v 1.15 2004/03/08 20:54:10 navaraf Exp $ */ #include "videoprt.h" @@ -1264,6 +1264,7 @@ InternalMapMemory(IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension, DPRINT("- IoAddress: %lx\n", IoAddress.u.LowPart); DPRINT("- NumberOfUchars: %lx\n", NumberOfUchars); DPRINT("- InIoSpace: %x\n", InIoSpace); + InIoSpace &= ~VIDEO_MEMORY_SPACE_DENSE; if (0 != (InIoSpace & VIDEO_MEMORY_SPACE_P6CACHE)) { DPRINT("VIDEO_MEMORY_SPACE_P6CACHE not supported, turning off\n"); From 70acaf22e8d62d35df37b92fe9be73ee2a021e85 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Mon, 8 Mar 2004 21:21:28 +0000 Subject: [PATCH 0386/1463] - Added service pack numbers to application compatibility settings. svn path=/trunk/; revision=8598 --- reactos/bootdata/hivedef.inf | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reactos/bootdata/hivedef.inf b/reactos/bootdata/hivedef.inf index cf6dd3ce7c6..77f5219cbd5 100644 --- a/reactos/bootdata/hivedef.inf +++ b/reactos/bootdata/hivedef.inf @@ -53,16 +53,22 @@ HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\NT4SP5" HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\NT4SP5","MinorVersion",0x00010001,0x00000000 HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\NT4SP5","BuildNumber",0x00010001,0x00000565 HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\NT4SP5","PlatformId",0x00010001,0x00000002 +HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\NT4SP5","SPMajorVersion",0x00010001,0x00000006 +HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\NT4SP5","SPMinorVersion",0x00010001,0x00000000 ; application compatibility settings for Windows 2000 HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN2000","MajorVersion",0x00010001,0x00000005 HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN2000","MinorVersion",0x00010001,0x00000000 HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN2000","BuildNumber",0x00010001,0x00000893 HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN2000","PlatformId",0x00010001,0x00000002 +HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN2000","SPMajorVersion",0x00010001,0x00000003 +HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN2000","SPMinorVersion",0x00010001,0x00000000 ; application compatibility settings for Windows XP HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WINXP","MajorVersion",0x00010001,0x00000005 HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WINXP","MinorVersion",0x00010001,0x00000001 HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WINXP","BuildNumber",0x00010001,0x00000A28 HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WINXP","PlatformId",0x00010001,0x00000002 +HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WINXP","SPMajorVersion",0x00010001,0x00000001 +HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WINXP","SPMinorVersion",0x00010001,0x00000000 ; GUI Setup From dbce1b766dd789f2f4eba99f549cbcbda990660b Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Mon, 8 Mar 2004 21:45:39 +0000 Subject: [PATCH 0387/1463] - Do the real memory allocation in context of CSRSS process. Suggested by David Welch. svn path=/trunk/; revision=8599 --- reactos/drivers/video/videoprt/int10.c | 114 +++++++++++++++---------- 1 file changed, 68 insertions(+), 46 deletions(-) diff --git a/reactos/drivers/video/videoprt/int10.c b/reactos/drivers/video/videoprt/int10.c index 87121980c26..f822c295fd4 100644 --- a/reactos/drivers/video/videoprt/int10.c +++ b/reactos/drivers/video/videoprt/int10.c @@ -18,12 +18,45 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: int10.c,v 1.3 2004/03/06 01:22:02 navaraf Exp $ + * $Id: int10.c,v 1.4 2004/03/08 21:45:39 navaraf Exp $ */ #include "videoprt.h" #include "internal/v86m.h" +VOID FASTCALL +IntAttachToCSRSS(PEPROCESS *CallingProcess, PEPROCESS *PrevAttachedProcess) +{ + *CallingProcess = PsGetCurrentProcess(); + if (*CallingProcess != Csrss) + { + if (NULL != PsGetCurrentThread()->OldProcess) + { + *PrevAttachedProcess = *CallingProcess; + KeDetachProcess(); + } + else + { + *PrevAttachedProcess = NULL; + } + KeAttachProcess(Csrss); + } +} + +VOID FASTCALL +IntDetachFromCSRSS(PEPROCESS *CallingProcess, PEPROCESS *PrevAttachedProcess) +{ + if (*CallingProcess != Csrss) + { + KeDetachProcess(); + if (NULL != *PrevAttachedProcess) + { + KeAttachProcess(*PrevAttachedProcess); + } + } +} + + /* * @implemented */ @@ -40,20 +73,7 @@ VideoPortInt10( DPRINT("VideoPortInt10\n"); - CallingProcess = PsGetCurrentProcess(); - if (CallingProcess != Csrss) - { - if (NULL != PsGetCurrentThread()->OldProcess) - { - PrevAttachedProcess = CallingProcess; - KeDetachProcess(); - } - else - { - PrevAttachedProcess = NULL; - } - KeAttachProcess(Csrss); - } + IntAttachToCSRSS(&CallingProcess, &PrevAttachedProcess); memset(&Regs, 0, sizeof(Regs)); DPRINT("- Input register Eax: %x\n", BiosArguments->Eax); @@ -72,14 +92,7 @@ VideoPortInt10( Regs.Ebp = BiosArguments->Ebp; Status = Ke386CallBios(0x10, &Regs); - if (CallingProcess != Csrss) - { - KeDetachProcess(); - if (NULL != PrevAttachedProcess) - { - KeAttachProcess(PrevAttachedProcess); - } - } + IntDetachFromCSRSS(&CallingProcess, &PrevAttachedProcess); return Status; } @@ -93,9 +106,13 @@ IntInt10AllocateBuffer( { PVOID MemoryAddress; NTSTATUS Status; + PEPROCESS CallingProcess; + PEPROCESS PrevAttachedProcess; DPRINT("IntInt10AllocateBuffer\n"); + IntAttachToCSRSS(&CallingProcess, &PrevAttachedProcess); + MemoryAddress = (PVOID)0x20000; Status = ZwAllocateVirtualMemory(NtCurrentProcess(), &MemoryAddress, 0, Length, MEM_COMMIT, PAGE_EXECUTE_READWRITE); @@ -119,6 +136,8 @@ IntInt10AllocateBuffer( DPRINT("- Offset: %x\n", (ULONG)MemoryAddress & 0xFF); DPRINT("- Length: %x\n", *Length); + IntDetachFromCSRSS(&CallingProcess, &PrevAttachedProcess); + return STATUS_SUCCESS; } @@ -129,11 +148,20 @@ IntInt10FreeBuffer( IN USHORT Off) { PVOID MemoryAddress = (PVOID)((Seg << 4) + Off); + NTSTATUS Status; + PEPROCESS CallingProcess; + PEPROCESS PrevAttachedProcess; + DPRINT("IntInt10FreeBuffer\n"); DPRINT("- Segment: %x\n", Seg); DPRINT("- Offset: %x\n", Off); - return ZwFreeVirtualMemory(NtCurrentProcess(), &MemoryAddress, 0, + + IntAttachToCSRSS(&CallingProcess, &PrevAttachedProcess); + Status = ZwFreeVirtualMemory(NtCurrentProcess(), &MemoryAddress, 0, MEM_RELEASE); + IntDetachFromCSRSS(&CallingProcess, &PrevAttachedProcess); + + return Status; } VP_STATUS STDCALL @@ -144,12 +172,19 @@ IntInt10ReadMemory( OUT PVOID Buffer, IN ULONG Length) { + PEPROCESS CallingProcess; + PEPROCESS PrevAttachedProcess; + DPRINT("IntInt10ReadMemory\n"); DPRINT("- Segment: %x\n", Seg); DPRINT("- Offset: %x\n", Off); DPRINT("- Buffer: %x\n", Buffer); DPRINT("- Length: %x\n", Length); + + IntAttachToCSRSS(&CallingProcess, &PrevAttachedProcess); RtlCopyMemory(Buffer, (PVOID)((Seg << 4) + Off), Length); + IntDetachFromCSRSS(&CallingProcess, &PrevAttachedProcess); + return STATUS_SUCCESS; } @@ -161,12 +196,19 @@ IntInt10WriteMemory( IN PVOID Buffer, IN ULONG Length) { + PEPROCESS CallingProcess; + PEPROCESS PrevAttachedProcess; + DPRINT("IntInt10WriteMemory\n"); DPRINT("- Segment: %x\n", Seg); DPRINT("- Offset: %x\n", Off); DPRINT("- Buffer: %x\n", Buffer); DPRINT("- Length: %x\n", Length); + + IntAttachToCSRSS(&CallingProcess, &PrevAttachedProcess); RtlCopyMemory((PVOID)((Seg << 4) + Off), Buffer, Length); + IntDetachFromCSRSS(&CallingProcess, &PrevAttachedProcess); + return STATUS_SUCCESS; } @@ -182,20 +224,7 @@ IntInt10CallBios( DPRINT("IntInt10CallBios\n"); - CallingProcess = PsGetCurrentProcess(); - if (CallingProcess != Csrss) - { - if (NULL != PsGetCurrentThread()->OldProcess) - { - PrevAttachedProcess = CallingProcess; - KeDetachProcess(); - } - else - { - PrevAttachedProcess = NULL; - } - KeAttachProcess(Csrss); - } + IntAttachToCSRSS(&CallingProcess, &PrevAttachedProcess); memset(&Regs, 0, sizeof(Regs)); DPRINT("- Input register Eax: %x\n", BiosArguments->Eax); @@ -227,14 +256,7 @@ IntInt10CallBios( BiosArguments->SegDs = Regs.Ds; BiosArguments->SegEs = Regs.Es; - if (CallingProcess != Csrss) - { - KeDetachProcess(); - if (NULL != PrevAttachedProcess) - { - KeAttachProcess(PrevAttachedProcess); - } - } + IntDetachFromCSRSS(&CallingProcess, &PrevAttachedProcess); return Status; } From 1a34bfa768cada6a65332b3c2eaa718976b02c24 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Mon, 8 Mar 2004 21:58:17 +0000 Subject: [PATCH 0388/1463] - Added Event Log stubs copied from Wine. It seems it's needed for Visual Basic runtime. svn path=/trunk/; revision=8600 --- reactos/lib/advapi32/advapi32.edf | 4 +- reactos/lib/advapi32/service/eventlog.c | 336 ++++++++++++++++++++++++ 2 files changed, 338 insertions(+), 2 deletions(-) create mode 100644 reactos/lib/advapi32/service/eventlog.c diff --git a/reactos/lib/advapi32/advapi32.edf b/reactos/lib/advapi32/advapi32.edf index 10df2e3281f..c03ee9da6d4 100644 --- a/reactos/lib/advapi32/advapi32.edf +++ b/reactos/lib/advapi32/advapi32.edf @@ -1,4 +1,4 @@ -; $Id: advapi32.edf,v 1.34 2004/03/08 18:09:05 sedwards Exp $ +; $Id: advapi32.edf,v 1.35 2004/03/08 21:58:16 navaraf Exp $ ; ; advapi32.edf ; @@ -227,7 +227,7 @@ LsaFreeMemory=LsaFreeMemory@4 ;LsaLookupPrivilegeName@12 ;LsaLookupPrivilegeValue@12 ;LsaLookupSids=LsaLookupSids@20 -LsaNtStatusToWinError +LsaNtStatusToWinError=LsaNtStatusToWinError@4 ;LsaOpenAccount@16 LsaOpenPolicy=LsaOpenPolicy@16 ;LsaOpenSecret@16 diff --git a/reactos/lib/advapi32/service/eventlog.c b/reactos/lib/advapi32/service/eventlog.c new file mode 100644 index 00000000000..e1eed3b6728 --- /dev/null +++ b/reactos/lib/advapi32/service/eventlog.c @@ -0,0 +1,336 @@ +/* + * Win32 advapi functions + * + * Copyright 1995 Sven Verdoolaege + * Copyright 1998 Juergen Schmied + * Copyright 2003 Mike Hearn + * + * 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 __USE_W32API +#define _WIN32_WINNT 0x0501 +#include <stdarg.h> + +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "winreg.h" +#include "wine/winternl.h" + +#define YDEBUG +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(advapi); +WINE_DECLARE_DEBUG_CHANNEL(eventlog); + +/****************************************************************************** + * BackupEventLogA [ADVAPI32.@] + */ +BOOL WINAPI BackupEventLogA( HANDLE hEventLog, LPCSTR lpBackupFileName ) +{ + FIXME("stub\n"); + return TRUE; +} + +/****************************************************************************** + * BackupEventLogW [ADVAPI32.@] + * + * PARAMS + * hEventLog [] + * lpBackupFileName [] + */ +BOOL WINAPI +BackupEventLogW( HANDLE hEventLog, LPCWSTR lpBackupFileName ) +{ + FIXME("stub\n"); + return TRUE; +} + +/****************************************************************************** + * ClearEventLogA [ADVAPI32.@] + */ +BOOL WINAPI ClearEventLogA ( HANDLE hEventLog, LPCSTR lpBackupFileName ) +{ + FIXME("stub\n"); + return TRUE; +} + +/****************************************************************************** + * ClearEventLogW [ADVAPI32.@] + */ +BOOL WINAPI ClearEventLogW ( HANDLE hEventLog, LPCWSTR lpBackupFileName ) +{ + FIXME("stub\n"); + return TRUE; +} + +/****************************************************************************** + * CloseEventLog [ADVAPI32.@] + */ +BOOL WINAPI CloseEventLog ( HANDLE hEventLog ) +{ + FIXME("stub\n"); + return TRUE; +} + +/****************************************************************************** + * DeregisterEventSource [ADVAPI32.@] + * Closes a handle to the specified event log + * + * PARAMS + * hEventLog [I] Handle to event log + * + * RETURNS STD + */ +BOOL WINAPI DeregisterEventSource( HANDLE hEventLog ) +{ + FIXME("(%p): stub\n",hEventLog); + return TRUE; +} + +/****************************************************************************** + * GetNumberOfEventLogRecords [ADVAPI32.@] + * + * PARAMS + * hEventLog [] + * NumberOfRecords [] + */ +BOOL WINAPI +GetNumberOfEventLogRecords( HANDLE hEventLog, PDWORD NumberOfRecords ) +{ + FIXME("stub\n"); + return TRUE; +} + +/****************************************************************************** + * GetOldestEventLogRecord [ADVAPI32.@] + * + * PARAMS + * hEventLog [] + * OldestRecord [] + */ +BOOL WINAPI +GetOldestEventLogRecord( HANDLE hEventLog, PDWORD OldestRecord ) +{ + FIXME(":stub\n"); + return TRUE; +} + +/****************************************************************************** + * NotifyChangeEventLog [ADVAPI32.@] + * + * PARAMS + * hEventLog [] + * hEvent [] + */ +BOOL WINAPI NotifyChangeEventLog( HANDLE hEventLog, HANDLE hEvent ) +{ + FIXME("stub\n"); + return TRUE; +} + +/****************************************************************************** + * OpenBackupEventLogA [ADVAPI32.@] + */ +HANDLE WINAPI +OpenBackupEventLogA( LPCSTR lpUNCServerName, LPCSTR lpFileName ) +{ + FIXME("stub\n"); + return (HANDLE)1; +} + +/****************************************************************************** + * OpenBackupEventLogW [ADVAPI32.@] + * + * PARAMS + * lpUNCServerName [] + * lpFileName [] + */ +HANDLE WINAPI +OpenBackupEventLogW( LPCWSTR lpUNCServerName, LPCWSTR lpFileName ) +{ + FIXME("stub\n"); + return (HANDLE)1; +} + +/****************************************************************************** + * OpenEventLogA [ADVAPI32.@] + */ +HANDLE WINAPI OpenEventLogA(LPCSTR uncname,LPCSTR source) +{ + FIXME("(%s,%s),stub!\n",uncname,source); + return (HANDLE)0xcafe4242; +} + +/****************************************************************************** + * OpenEventLogW [ADVAPI32.@] + * + * PARAMS + * uncname [] + * source [] + */ +HANDLE WINAPI +OpenEventLogW( LPCWSTR uncname, LPCWSTR source ) +{ + FIXME("stub\n"); + return (HANDLE)1; +} + +/****************************************************************************** + * ReadEventLogA [ADVAPI32.@] + */ +BOOL WINAPI ReadEventLogA( HANDLE hEventLog, DWORD dwReadFlags, DWORD dwRecordOffset, + LPVOID lpBuffer, DWORD nNumberOfBytesToRead, DWORD *pnBytesRead, DWORD *pnMinNumberOfBytesNeeded ) +{ + FIXME("stub\n"); + return TRUE; +} + +/****************************************************************************** + * ReadEventLogW [ADVAPI32.@] + * + * PARAMS + * hEventLog [] + * dwReadFlags [] + * dwRecordOffset [] + * lpBuffer [] + * nNumberOfBytesToRead [] + * pnBytesRead [] + * pnMinNumberOfBytesNeeded [] + */ +BOOL WINAPI +ReadEventLogW( HANDLE hEventLog, DWORD dwReadFlags, DWORD dwRecordOffset, + LPVOID lpBuffer, DWORD nNumberOfBytesToRead, + DWORD *pnBytesRead, DWORD *pnMinNumberOfBytesNeeded ) +{ + FIXME("stub\n"); + return TRUE; +} + +/****************************************************************************** + * RegisterEventSourceA [ADVAPI32.@] + */ +HANDLE WINAPI RegisterEventSourceA( LPCSTR lpUNCServerName, LPCSTR lpSourceName ) +{ + + UNICODE_STRING lpUNCServerNameW; + UNICODE_STRING lpSourceNameW; + HANDLE ret; + RtlCreateUnicodeStringFromAsciiz(&lpUNCServerNameW, lpUNCServerName); + RtlCreateUnicodeStringFromAsciiz(&lpSourceNameW, lpSourceName); + ret = RegisterEventSourceW(lpUNCServerNameW.Buffer,lpSourceNameW.Buffer); + RtlFreeUnicodeString (&lpUNCServerNameW); + RtlFreeUnicodeString (&lpSourceNameW); + return ret; +} + +/****************************************************************************** + * RegisterEventSourceW [ADVAPI32.@] + * Returns a registered handle to an event log + * + * PARAMS + * lpUNCServerName [I] Server name for source + * lpSourceName [I] Source name for registered handle + * + * RETURNS + * Success: Handle + * Failure: NULL + */ +HANDLE WINAPI +RegisterEventSourceW( LPCWSTR lpUNCServerName, LPCWSTR lpSourceName ) +{ + FIXME("(%s,%s): stub\n", debugstr_w(lpUNCServerName), + debugstr_w(lpSourceName)); + return (HANDLE)1; +} + +/****************************************************************************** + * ReportEventA [ADVAPI32.@] + */ +BOOL WINAPI ReportEventA ( HANDLE hEventLog, WORD wType, WORD wCategory, DWORD dwEventID, + PSID lpUserSid, WORD wNumStrings, DWORD dwDataSize, LPCSTR *lpStrings, LPVOID lpRawData) +{ + LPCWSTR *wideStrArray; + UNICODE_STRING str; + int i; + BOOL ret; + + if (wNumStrings == 0) return TRUE; + if (!lpStrings) return TRUE; + + wideStrArray = HeapAlloc(GetProcessHeap(), 0, sizeof(LPCWSTR) * wNumStrings); + for (i = 0; i < wNumStrings; i++) + { + RtlCreateUnicodeStringFromAsciiz(&str, lpStrings[i]); + wideStrArray[i] = str.Buffer; + } + ret = ReportEventW(hEventLog, wType, wCategory, dwEventID, lpUserSid, + wNumStrings, dwDataSize, wideStrArray, lpRawData); + for (i = 0; i < wNumStrings; i++) + { + if (wideStrArray[i]) HeapFree( GetProcessHeap(), 0, (LPSTR)wideStrArray[i] ); + } + HeapFree(GetProcessHeap(), 0, wideStrArray); + return ret; +} + +/****************************************************************************** + * ReportEventW [ADVAPI32.@] + * + * PARAMS + * hEventLog [] + * wType [] + * wCategory [] + * dwEventID [] + * lpUserSid [] + * wNumStrings [] + * dwDataSize [] + * lpStrings [] + * lpRawData [] + */ +BOOL WINAPI +ReportEventW( HANDLE hEventLog, WORD wType, WORD wCategory, + DWORD dwEventID, PSID lpUserSid, WORD wNumStrings, + DWORD dwDataSize, LPCWSTR *lpStrings, LPVOID lpRawData ) +{ + int i; + + /* partial stub */ + + if (wNumStrings == 0) return TRUE; + if (!lpStrings) return TRUE; + + for (i = 0; i < wNumStrings; i++) + { + switch (wType) + { + case EVENTLOG_SUCCESS: + TRACE_(eventlog)("%s\n", debugstr_w(lpStrings[i])); + break; + case EVENTLOG_ERROR_TYPE: + ERR_(eventlog)("%s\n", debugstr_w(lpStrings[i])); + break; + case EVENTLOG_WARNING_TYPE: + WARN_(eventlog)("%s\n", debugstr_w(lpStrings[i])); + break; + default: + TRACE_(eventlog)("%s\n", debugstr_w(lpStrings[i])); + break; + } + } + return TRUE; + +} From 847c530813068ad980773615217ec824681a7818 Mon Sep 17 00:00:00 2001 From: Richard Campbell <betam4x@gmail.com> Date: Tue, 9 Mar 2004 10:55:44 +0000 Subject: [PATCH 0389/1463] please don't commit copyrighted microsoft icons to cvs! svn path=/trunk/; revision=8601 --- reactos/lib/cpl/sysdm/resources/devmgr.ico | Bin 10278 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 reactos/lib/cpl/sysdm/resources/devmgr.ico diff --git a/reactos/lib/cpl/sysdm/resources/devmgr.ico b/reactos/lib/cpl/sysdm/resources/devmgr.ico deleted file mode 100644 index 283fe4e087bfd21e572c8487cd2aa953c126f721..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10278 zcmeI2PiP#;6^EZJWv4?-WGmpy3|P@2v2V`y$$Rn|Uq$xfv-je@4VVzn91QA{H8%x? z82XZ3M6x15x%jNZEQB25-rQ_oVi*u)!8EK4JF8(6w(`AK-90@$J)_vk=CXP-)z$Ut z{rUB)>Z&&-i7d%Gvc7(adPQVeBodKJmwfxy5^Z=lZuoZmj>sp7t*;C6feZqXpZq}k z^Y#x#{_!K#_wD$5$Zv>T!zL<ni(-DL<$_+CC>G%>aqKIu+{$1upw<p&UvW<FD14Nq zm$|gFwH1qS&8ZK?vWt?Z9p`#|3C2O(x3Bi7Ks;WxZ$Nt-OVIbt)z}*dPJ6k{-uCHk zPlD55{B&#Ufx-yXL2#=6dMdnw{k-ilSUY#G)tG)!$((kyU7>zY8%1xwAM9v**Bir0 zZ1TI?xyfFv-Lm`3J4Qb*+7D8r|6TiUHGB1T-Jijd(!T|#-`_3pO`gXDHSk76->4YF z?Ytcn5ur^GuTr%TWY)?O_cEXiCuNEIvYc@LuSr?ve)UbuH|Q|)R$VMtannfG;POh? zJ5bF3xKUD>^zeP_`5&OGRLmcc**qWj9|SEW<|!{ytn)>K*<)Ur4)aOpYcF8lewn7d zn08rbdHc>C<1-{$n*ptL6k>75@4f3jeScHrBY654AIV_pXOu5wxFmOmOJB-xnfvAU z-W@K#zd2--hReT|6Y8;!+8omO-JpC(DdV?7qmknOE`E(Rr<gY7@KSjhi%F<;<)yUA z-0Kr&rg>ahZ*)qJS#+G+LZN(#y}VzRdi^*!9j{J4&g9*x8rqKC<TF+~HXu_9;=G|# zpjH)j{DP!_rWPce<6&#p>H1ZJwCzrN#t%+6SmBIR%tFBvW9W|s-(sOYVAma3AQtld zvrMjIZ)YafJ2_vCRjIG*D&&zF7P|!b`{0-4{1Jc?`*pPrw3n~1@V6&mh=N8<DL8%L zS5~`D@%@UY*FT^0Eg1h<9Q@8P8@D&*o682je&F=FQXQ9aF6d2Ve4F|8m$;Y@5=_Z& zmHbN9VGiN~Ms0?|XQF*0+kW|y)m*Mv7j;KdA}1>-&Tj^JJ<RKqydLK@dzuk@)uhIb zwHs>oGxOsHc^xmP!NuOk4*377f3x(~{suYDq1FR&8mQG3aT=(r7r8XkHQ4KvTNKTE zjoxDa8T@@9Cx87!R#sLd2m-ly@uFP5d|9qsxgwoTM>aM#<ofmNa`*0C+1%We+qZAa z&6_tRe(2<b51jm3o{P&;`OEV!<oV~H%dh_MC!mCsh>}oJ-wfe}@IrW@@)%JSiQq@v zMDQc{5qwok;3x1C8VURaK9!{KQ}`+T6h;c)(RQ?5YMw)`A;v=tg(!vO<K~`A2!;?0 zAs9k17$h)+U<knwf*}Nh!30AHh7b%P7(y@@bTEWq2*D77Ap}F{;DI9qN2oZ+{Xu0Y zBCZiwBCteYu}20=g!2eT5k@1hSQzMxxQW0LfyKfCjtCqPI3jRF;IL4EBLYJNh6oHA zx(FN*7$PvF_Ddx7A;gdW(6;bubU=mg1UU;ez7sGdI8AVnfGNRuLT7^S1m6k1Z8*#~ zeEcW)Pw=lpl;A%hHVGIKFeJo5hmEM%)5D?Ws>4VOQv9W0OTm%i&xTfU5Q7vPsp8<l zY`9TM!IFX{1w@KNn*v}-QA`nHjitcX>7rN|lN2ne#>24aY|v4F2L=ZQ2L=ZQ2L=ZQ zn@(Uz!QjB)z>tCgGZf^(;K1O(;J|=s3Vbj)FgP$c066@o7;`8(gd%K2v?Fjhv#m0b z{8)Z3_wL;j)?#_|=#e~r{8*koeJW3$JdqbKUdYRrFXj07SYEw)C9hw<mhpHjC;xQv zyN^E>l4hc-?|@d=vzFS`rnVN-UPJd<#+%>CtY@!*);gNAcQTdOYtPbJOL>LBs3lqb zJ5s6$v|GY=)R8t{6)pr6!yXnU0^D~bD`*}@wb05&tu-&uZXX>T8R$+Yf8sSG>*gUY zT)5yR^ucrLcDuft{)Z1Q<R%dCA<3%!vq2b*D*fEfQmeF|yP2-K-B#gW)K{GZfkGqu zN*`{DFg~%LeN_iI?VSGoDQeI3-#<7w*e^c&&HWRR#{NV4y-1_};eiR5lLr06&z^l& z2sG+H8$By6yp6v1zi*G(pntzgv;D=a@pZkw9{yUtWNn-Al}lC*z72BLo*G>m{{1Xw zz~q%EfmoNGKX9WnMYFZ3^9M~eNHdn|h1{$-gZNg@A8z3PLj_gjFW;xpNb%g?&*%Az zrd8+p%X$7nj`1DLUmBN-`OL{Cn#+`{W#dgZvs6fP0yI^HoMJw8k@mfoMW{knS<+{2 zyIHF}@>_%DQz&G4duGE>Mz^v}SbpUdG(T!CU7tvqV^#2o<_N2iDqIv)ULiGGuPco5 zgk`b9RG`)V84vA~LH0YIqDXkM(NT+hEvIroG;JmF_RywK$ny+Gn&P$dk1Do~%3hxf zRuV#e=C8jd<?|mZQz)UgI-RvH9}nN2ptP+j5Eneyr*qUHl&VmXFKidJYE%?D-J1QG z$x~x6KP&dh{m!7hDf=a`c{kmzDpY!#Qqqb`0H9EnU-aT=wy6qJ@{O;6XCiM3HThad z%BE&plVsQ{>5F!sQ;!B3&6S_Zk;}#cd7thUX|u2Q=gVvEnNyi-A1stF#C>f_XUeOO z+>a?N!c(ztDkv<rpC|dH9t!jA*M%+jULc=at*R}wf4~odn($)$DqdAEK#TAn9-2a_ zb4GmpkC;;024cbU9v<?e1`nS6xGju--9B&@$A22Xi7&uo(V4(8@kRElKba=?bK^Pp zji2-WzKJ|b`h02^+k0g};Wt^ivCQ14LRHr8Gh6s|@t-9WX5<@wvz0pxHzt36{!SRa z&2#)gZhx59cK*)UnVrAGn?rj3eu=V9DSyB6cZ+6<&wsyi)*7ClzuW2e`T09%;@`dV z_u2-~wIjUzG+LJpwx_Imp3WA)FO)rL=N~=KW>eTJKlv6k*_^zGGBa0osMyCc_8Z?` zA+6bO6+2SaUU>$i+U6wnpwhOjyVACOw`_A<@2PyiVi&`kJEnZ9Zau|R1J=o5wQw@& N|L<l}pY{JY{|34uZ#w`0 From 462be9c136b1d2f6931dafd90d8fba49956b5aec Mon Sep 17 00:00:00 2001 From: Richard Campbell <betam4x@gmail.com> Date: Tue, 9 Mar 2004 10:56:16 +0000 Subject: [PATCH 0390/1463] noncopyrighted icon svn path=/trunk/; revision=8602 --- reactos/lib/cpl/sysdm/resources/devmgr.ico | Bin 0 -> 23558 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 reactos/lib/cpl/sysdm/resources/devmgr.ico diff --git a/reactos/lib/cpl/sysdm/resources/devmgr.ico b/reactos/lib/cpl/sysdm/resources/devmgr.ico new file mode 100644 index 0000000000000000000000000000000000000000..1bb121442ea4f2a132d7fc4cb82be1c123e6f5ea GIT binary patch literal 23558 zcmeHP30##$*MAhz>jD=<c3BcdMKsGwv((C^&9b*l&1^MI%QY)7Q?OhxvaDRQ#kVpw zGsRp$TmTU_P!v$y*mqEILClu({r_|CbG;(CWcKxazvgo8JoC(%nR8~&%$zxAE}B+L zGibiP8sa)yQEg3|rfHgkgDKsrmZpue(X{sMnKo!k?KN#~9nFl7v_aFlI_dZZZJ4d5 z6?p3SzS`0jn)diDIzG~<_gpU>-&Y%ky1weKX|2#ENYL&BkPa0<OLZZXFYy&>eh4)u zVq#+OE>sid<4epBVor$Z1#_<$4AX;yr-y}w>PW`Q%F3XiU`u+sNJvn~bW7SOl>!7y z+EA$wEa^HT=YuMPHB0yy`SPYEsTo2<E>@5ChOkSLcoAyBekf@A^spch7;M5pSyUHN zSs4<dngB6KRE7kBBvus??KyV+`pEEbPajkMsfg(C@UX~;i1nuY8R4FjBcsDTJzbgB zBs>Bsx5$Xd_2*Uj@t&TZ5z(HW3+I{gS4Tud&X1T8HDg|-!k>ZsaL>s33tO7%8_V+H zp5YPmSY8t}=Nb_n77^`Ad_&0O$ob)*$1OtDugL_@31cTr2oDeUG1VUt8Mz)IGGYty z>x3X@0z!DWtEoOP$`Di;!h8*#sRxyB2(yGx=3g2p7Jq13NOfQq8IjOhQm$#nEKREy zqiHsO6|g?aIi`S;bzROwk*+R;@+H1*OwOkVO%G#5A4^cMiYsLdV}qC_)+AfggAjlq zL0f_*U?6_=3=fYA(hL*kM?g|E?L0==-SmDv)4`GJ!#$^Kb$-R@gyVe(2cZ(xviC!^ zETg7n)w>AgNQc(Cc3?lX2fPU2x}!pUQ&jca(a}+B)~uP<p+g6)M~@!b(@#IGff)@# zqAlp40Xk@jh!YVn7>e{zq!A|~7WF(7@lY)h$O2dZq(p!)2BHAK6y7h;e)!=BEjl_H z`3sQ00Qrak3l=2eIZ-=y>=@E`mPD*Se23KsaN@)Xq}75{mHdB1I>vPl=;)*^?eR;H z6Q0}}bW-X0!#ip7RUXFDeU4Thb|Gj?r-~qsHgU&HtO)A-K}FCsU=uh}tK3+ZrtL<) z;gfn=Qg}sBu#>IUaaIKc1^Wf?8Q+Y+xy3M48>VSxzlV5W59#ePM{@ujzd6t07|0rr zIa*KPv_c-!Iq4Na6Bkwl&0Yrq)oiu1;5Srrh#?;N4Qp!R*P8x?s|$nH1Djjacfeyw zHvoeJ`so4FqjuKZ7v`ka2oEe%s}}kI^g#?&z!s~G(mZODP6o!<O0~^D7Y6l4ec!Gr z4B}pl5Tm~F#d<=`i4Q?TNb#du@{1fd6HX}JS>wdCoTJ58tW@uMb{;f%{HsC3M-3V_ zdgPEngWn!E2#FzsUKufB+@Nv8hKv}|;r2lz#}6Joa?D$A4tb;9@WG=spL<f3Y|KXk zeeg_q=z#c@Z52VwPFd(PQ-lcZQ+_BH3_F3tXZDwQMyou&WBRPQKK6V4hl+zD9g3Bl zv7AfEqZ;|w>l*-^%R*qa;W9M+MYY&?spnUTYeKK7Kww~PPp_sbcs9lA>FMc#U|VAY zfq}Md+5`jyG)M45@bdCP8L!$k6u|4c#5ZFTy(yY$YEv`5XB*XkYJ)BKfjF-^HPi0_ zd=*dv?SLdtuPfn$ew_hw;N{oUt10QP(vjw5V4zKaxq1^D&B248XAR_Q8ZyWL126-c z2auqe$zg$7%}w~|7eB>7bB`LU2UVcRQ~<c9f$*qR6ZK>Qb=mltT2PGp)y10{xK&Iu z+g2~pyvCtYH4|5bS~hh(nl`O#%YnTZRDI^Ji*NNO4~%NnU@1{G12lP&(W*f&fcLhZ zlw*9UxS3aT$|h6zR-#QQHFJ&!2&O3nP#ywWw#HylP#OFvNX`8&im7RsOqdWe{IxP8 zDjB65`FS;OYE{1tDh~)~)3Qx-eo()vJD`Ps3%>wVP1*Ci1RrwN+{M+~<rZ&zZUOk> z<Kye&dy9)NUi$<<RITc-1AK4$Mn<F2$=Jln=+eZ+0pR4|gg5qf_V#uGm)Gx&JfJ(d z5FH=KCQgn>qJYuhL`k)(pK|Zr2szA00i%nPi<2W0MmrQ}XapD5^bp^-fy!hP__&~` zx%Ng48yQjmCHUwcmqrcj(14;z72z{$HzK3j`t8sHc~(@R2yu<5y@8=Rdb|zjAe6AT zBbvR@4i9z>>>Hv$P52EBMgzJ}Zvmx9yTQ=F4&!|Z{ovQdU})5!5h=C~AjaNsS^c%y zpQy(|y_3<@_h6!t0rXc}zd~2t>0;_kvTSrx^<PSlseY0I6v%?n$<-98Ua~`fUW(80 zaz@`E+ZAKw<cjfa;(}*=j3MRL{MN>*<BfhHF0fpc1UaE7qzS>^SY7=<2PHsd{rn)J zw1Pw@)PHdu#Xh9!r__)XS9cfuxwx_!r^YPch{<G459xQbBRNe_0GMvB?yhclfJlP} zdt;k`HdX6)Zh%Y&5&~2o0AjG<O0MisU)B1Z>w`P=3u<*k0XMdT1Ua@dLVm6BNk7*S zF3Q$HEz*2l1wT+<V)4GFz@^%>z~RA`HC!=RZ^I~1yDox9HD7#%V9VvyYW+m&>Osf9 zbosBToC#abYnl%auH`teGS0#wvr25kbPNu%=D2Ep)wHTduTQUEkALG)Pt$OI#siLp zjD0i>=peux^W4Yu|D*U4{=g@?LDRZbwOg6B+B(dvCOGn)qgLH{btulC)ty=Y%Jb?1 zoKtH$uUel~6LC)cr=C~;J*WPAPW``pPHk5uR9Pje<RW<~Lc4YbA8!O4_IR|ky)56x zziptue~T6^e1PZG^z!_`w)mJ(yuB~aZ|C0@*$Ak^+ozg*ueJ!Rz~A4eMZK!^YwhX; zGT+Mw75IBymaVmGS63nUqY0lnm*)e))`v~B^>1oZCEL<DwgzvndMIoT<}T8cjO*96 zPAP<T?do`;OZey2yoHbILUv<)b2IJQnc7A7v}xrJ2FU?G^-W}uvw)VZ{9Cnd)zUw( zB|5pKe@k?93-62h&9Jn)xwyHzJG;5NxH%)`=+|1$w+U?PYwzgn=<MX|=H`xXM@M@{ zM<46*zIKj8Fn>_mp<xSuy*%1?vv+jBTa;woMr1oSYvFUTecy%-jdTnLWH)kX*wWvt zwi2Rt5DhoGhG^4>vJA|&^9j7gx_m=Wpeknr4h`)a`nC40WiF5Q8!GymC?<&3(9ViJ z)KC5#ot@oWoE3l0jtyJ3F-t)^@bBvA*x1e4-OZgH;MSOJGz+xw=ik=X0lnf*1pGO> zv5uCOe9-TNx{>4I?&;=<N>G7=e_Opg>UT3bs_Kd0?&j=<K5BU}A5$Zca%UYN?t1xl zO0<>iUGilXatKtt`iA<JKlNy+Z=j@^1<YFJte=q$mFXYkcQETICVQfJ`do~ZnsSYL z3hnCDQFMEHqS=maZ9}iges0l4XfL<6ox@&URR_`S>i_B~|Ju_pN~-p+Jsq9#7u(ah zr`6)0xu09q^TB%U>Qcx2qD6g}n|!?8>*;A*SoFO8+-)uvfc?$e)|6yzEo#>{)K(90 zS~R}J+uh6E+YMg^pxF4)rs(V0)T4>JJJNNUIl$zBh1+Q7<c$T&#?Mh%jEr`ToV?)8 zu<>(fNTZ0+*wDdSmB%CY5u?%G$zA2s_|wFx32ZH<d?%RVobkfw$#e^EWgw)DusPdn zVPiV6^BWxewSG%qQx`Tj_vDR7jZnp{fKGspHwdgF0MHQdcZBX}WEJ2nfM$cr8wA#I z7%&yk3UD(6x5OL(w(%=Nty;CDD%7rBTL?BbHd3cf9R+;0s%s^l8v|}u7=nt$*Vk7T zE?g*4QBksX?OIvAdbO-twMu^a=_gsfe7P)JwoH~RSt8$k_nmz6%{TJ(*I&yQUwom; z%$++|KK$@QnKo^jz!xqbee{tG95_(%gu06Xcik-FQSbKvdFGjC=&qFu7cR)DQ>Ub~ zv{dr)@+2!OOO75rD(UIzlA4+-$;rvGd-rbHzJ0rF-MUq_Y}q34*(+YZ`syp0H*cOW zChu64I1ax91_El(h>-K=gDr|C0OY;*-c$7Bc8;RIxVTu+pP88{hYuf?0|ySs{{8!9 z&z?Q9YuB#J=#PwyRAa<3nLmHNtX#QLx^(HH%h9`N<7Uv$TNkOM|I<%DRrK@gmtTI7 zbLY+}ICJKVoIH6_%F4>5prAmqv$NHBke_|~_Tf52q9i0FsIef;ix)4JrAwE}x^?RW z_ce6-Igf8vSc{5f%9JS<`Z)%_{`#x@{`>Fp+i$-qpj@3lf8HWn`T6<6u{m_;kffxf z$lkqs)x7!k+izvXiWN$xtonc0%_1K4hLQdkUU<PmKWS&5!%ioZquktFMJx1VB}-{( zX=)y@@AY}GdGlr^^PKl<)~t~Y8#YL*R;}3oT#N4o+^ld1D!zatksLpM+`@zY@W&s2 zs5xCxQ6Xo~o>hEtZnOWb=Qig?TwI)@J2o~}&Ep0Q8j$`pfcwoN9`(|qyMt>t*N&P3 zWr^~_evXfiS94pR4;&ZHg>BomDIT~cb?@F?m;KLgBJFzBBk&+@Zf=T>>UiKdP&U5& z@=LY8kY0|LJ`eP{OxfaGVtoMai>(2FN0^I7q-)o%HS$1uGcq#N8pQR8^P{k^P_0MY zBMu%sD7Z{0O`0^(>3`wxAl%%B2V%7s+<E7nYCYsSS~ckF5!a~l@^ZDVaz1eVfsa7y z)uYEo?O7iq=Kk_`2DY~jAO?d$1`HUW_FBq*b%FeGZQ_1=+ikb$ea<)(aI*sULF&p) zssVev^8ri%P;U_j2L~ln!-o%-88c=GE<7szXVRoe(!YOyfxSrSY{Ug@0rUZ|Zt8{A zwZXRk%(!r!=?(Y*umTVbh^hv-pDhRM1CS;QaE&6}k3RaS<(*ajDLiigP~YVBwd(4Q z#QVj7sQ~Ki4FJ~?>H>+EvZ`zMn&0*9+gCPi+9V%*@PXiB$u*a&p<TM|h6C&XR}1d| zL5(x@TI#{v<Ea<p&Zh;aBNM2<=s?`>zyDsn=lV`vf%*>jSn3KoP^bRyfB$QNMT-^* zfqFK9bA<V`XV12tE9XGhAOK~froi)02|$8_gVkPYJr}vIQ(w^a8?GzdXQ{WHK7CrP zG1mH9PEL*xIB%(6^O^fF*Hx~eM~)m(IuZ44>Uh+-$usqCu2J0UsDIym_ucyVQQll@ zA|CI9NxQ47tJ*(FJ83)zU995Vc{y{oLQb85UQm8oj-SMOcpN%UNvRYSmq<Y&bm)RY z$;rhzAR9VRR<<0=$dn^TkIA7UJQEy}0|#*~NINL|c{bRWB72heNz$IZvO5WS_U<Iv zzH^r(?AR&s3EL$O=LP(ZK=H?O5a|M(0Kn2&W0-;*#V^-u2BjaDmrBLS5~(;*B4<t% z%bDZFa=NTYL3vq$l$QcZ3gl!-o*XYC<Vsm#j+7Q;OL2ad6y;?~Va_or$UZ9hnMWiy z<B;SWOPA~;2PE@ws$`_6$gzX_<w#nx97@@Pc)z4TN8*`>{m*lqt*tHTr+(M5M(Q<9 z(SPr~_bT0&^#2OT*%c+}3&+UOZ^lc;l8KW2!(_=_IaTskhe^@852ZNjBPoskM2>Hs zEhl2;$jR8bax!k7f)lax)Vs3Hp8;o<6i0p}g=@nlKVrJ%{xn6^mHGWdRrjH<-jW0J zMoHFk<mcu{{I&#jX5id|Rpy%M@7%ewg?{cv$;)QR#(s{nb+C^l4EL8^V*(}V?b~JF zgpQIrxr-c}cE22&(L;{Td`OPXdPFimeM~YxGeO2Dz16!TANG>;u<ml;{ce&nsk0;p z-yw<PZj~J)17zE)%_a6FZ`m}^Rn|S;K;lPtlKh-3*$!FaJoxd)AFr$bIbU@7;TY`u zakgw6=q_<X{Uu>UpzM0%c1a5AD9P{MD=CxjleDQl<Y3r?a_GZH<nTwm<><$c$<bMl zD>#DZ!!sY1LmxaW2d4Lu)b}5deIZ?C&pUU^?zirc9b?+dw%6K7>?<u~)AK&E{;9^2 zFs_>v<Yvnb%m>cp>!rU_r%spBzx-2)db){hd8wIfeYKS&jBG2r#@;50Z{H<*Cv=v5 zle$>=I554Z;^p9s2Svg32j#%Do{H}Mq1_~T;=QtGd?(rcCTJghtD-$_h`(%p@fO)I z&{NhtZj|^j_k#W$%;`jRj=oX)lb3xW>;K~*n+ADF%*%cz9xx6&$F^5}xF@)y;v*S+ zuy6NcOgJu#Ni*MZtoDq*8*+D->>78wY#-GQv<Ij$-2&P-KHF3xpLUhik2H|D5qC>r zUall!UE-Qb`R9Iqt@HP;yY5nFC&~`Po+Tg4&%GN;)Brcx_?)+ihoLQ1-;s`;7>nI+ zc2MJy1YStzMd+ktE%B{8mE2KY5=OL@t;1R?nPI;x+WWc5+9w*z%AU5eW!Rlkl%Fd} zdz00^@Mq|!zOIMF?>>}Oz3R%k|2RohfAH|Em$1)bUumw!g7Qn5qCD&beLFEfF2Zd} z#>r>G>wywK+}!6cH&gOXnPI<^_SKKt$&dGGvhkJMu<qtzkJztlN!<6Zr~j$bTc2-t zEeewrsQ2gI_Occ{MD}x)XtcWtW3lC>TO?*M){h}ABo1?9>+sgH4Kz|V2=PeA4{HTE zX(=(_mvd<I^S-JNHVkl=^?h9|w6E-Ckfrx%68&;}DJjgCeJQDG|04ZnJL5I2|99MR zhdOKM{h#pVR9V(pla;;dqmS%mO`pcH?kQ*0Z&9Ej8uMbyi_H{`@sJBe`|E9Fn-1Vd z$qVKw@uHvc1l`W4$5DQM%qS6$G?Jfs8f5u>Hu8NZO*XuAE9ftfl+-k(V^Gh!9{Tb7 zpG)YE|NMRVzN3b*wLv@eWaWbmRJ)X=%`f<(e_Na62ePy4joUCkJE-}<Ik6khoUfcC zl>P0HGs+P8h=k0O{vRKxBR_PjEz7#rvd~{zR3K>w4k|tAdg;IY_S=<BQ}6$+3nnZ2 zmvzyE5b<y$B{P(H(zT0pVt(p#muu?Y3HO+xGuHafl7uyr>n+#KonyKF+=}_oMvWO| z=m+%8(t9-v{bj|4auD{eOxQ7~-_mY<t?LiZcO@kyI{6YeKU5aqrK$SYW3I(Ru6K+v z^)uH)t~JT;-eX!jv0kRUcfX`ypHjeQ^E%44pS+Pz6CW54wT`w?<G2cP#C9k@WyM93 z4qGbqRqEx}Lx21B?UgM}XCP+oB-Q_1C$^6?t(RO6lSnsc;u=p{)23k`#vYqK;~`1^ zzzlfi-pqY1ZAy2=8}~akCPCZ_I+%FCSi}tWlNI;ZmJKh$K2}mJhoQSt=e}P0Z@u+a zDJm*b<o|*1O`lFs>oR4R@{;)Wow64)v2RjWwXYtS2AV-H^#tk*N_Y6=2|22uk4jUo zI28V{;)Q&uy%=Mr#=^3nwZXdNA)AJDkQ1Q)Xhx<wH;{h%LatSQXdk4lhC$K)*#z0p z-&N7hacAG{$DW!BI@q^|q4!Yd$@uI)k~z1pWX<m<*$Xa0*1V@BWA;;W4E!7cALNxf z6XlBgGIc5L7o1OVFW&<Fp$q!INHQ|Bl+BB0y6d5zb^_YU7^r`4hWy06(oC%>)Lp0# zun!MHHrTHjpFSa3pgZUD0h0U0K*|4lkQ6L>PC-86ysw^>+=b6bHu%b%{iGU?bc_Y{ zA`=hyNFrp3dtdx8f7$VNch&#dIk`#>XlF;?UvvLgrGMk>2@($-SJyeIL$cqG%mnS| z^Xz&3K=(6>-okHRl;ZCPOUcq#6cjIcMT!=`EQQ~^p!mpH&|fm=Jf+4fojNJz3}uP( z$n`ei_13Z-^q)IjE@vxDeue9$9~Zcl-0A(le&$<Bf8Gmu-5-j+$JkR>KK4l;p=_|v z3;z4O6fYhurOSrO@fE}6<jU6pBjm)&*W~!}VN$YWh!lSN5_lK{+3F9zpHySVen`a{ zMLFUaY#)KWZgdx^Jabwqf4QLi3D-+MuC}W)w@&|>urado{#xqHkvh4nq)+dTv&zGg z^;sXu{rqVuT=cAzE`Cu?{4hjLf!;GekCKXYV-%cSJ6cY!9wFr`UX`*XFH7+^&q@9l z10;Lylaev3w;cYU7tS=$Qzv522)<KdU+|RZ7Xsy%iZk*HYz4F#+%WxfrpTf`ezI<C zciBDTDcLi#zwG<;SxKGuk{tYUs2u+0H959~=e}{0w<=f))=ZGX^&wIOC|EZU=gfB` z=cl(NW7$|a`rQaQ^z|@FTQFGm&wft!e*BCie$ZETP3<FFCp{ud1_sK{<NC;j^Of@3 z?<QO1_0o?kjmmD!{%0sFI}U$Vp%mm7NHO%P%K&?QF`(osK%63!FDl5p1PY-m6AGa7 z)7C;i4sE}>E!E2Ya5epHBImiCot^SKn5h5X`KH`3(B2dh!e0ug_2)F=_JEoKZ4<u& zq+dU*Dd>y;&A|SrpAx?m)9I(3)S)Kg&F^QDe(o3ChewVaDHA77ly~2K_b&(fFLZe4 zop;0<=pUfXntmSAV}|}_8m|=5e?~s_GXI3Q0`yD+T*>x{>`TI6q>=$=0JQ)9-9Q`r zNx*7A7eKY)-{0+^TmFXM2XXK%ze_UK^t&BjVqJZPo3N^W^ZwMM0LtA<*9gR=Z2TD? z5sFy?=LK!+m&{e``$ziSBmMpn?ZM_V^#zm*1=s-oZ0L%DzmFO<O7IU`l)r>$Uhcd4 z{UP2rqR*T@4c;Gm|NZx6>eQ)1TOrEQXVLP{HjZ+y;_{!e)o{O{?S<zi`X}g*NJ>hQ z9Xoa?fBVLb8<jtXeiqVZ-kW&u=fN9j{|)-6=;LSLeHh+h;N2wpp6NTGzl63t-ov18 zh&D0$m1fPFrQ4RCxPkWjanEP{4D^}s{tEp%y5E?4Deo5X?gZ}?@y-+P5%De(+T|U( z+i#$KACx`Lv1Q=i&%Kj=CepyO5bpx<EKVADe_+d&Evg@$eDX=Qp9HuT-`tf*oY%T_ zYm45m2*DTmXJ69?$1^d<g7+3E7rfuls8J)f&pQz}8k(Yl^xnODUt)V=ALu?b(n7lk z<%GUvTs>vm>j8!vZQNYG4dOJ~zsPUZI|bCmD2McI<3CWaZTj!&xBfGM_rd6I>;$0R zMhFB@juW}I&<^zKtFNkgMmgubJ^X(jwo6z8xF2vUKrhdj>j3M%QlPAE22=v5FLDjj zf%`r6Ow|t8x$)!23&%x&hnVx7TLOKmdO60di~IIZfYyNOf+t=c;TeJQ&N)o`D%U&O zIS8~D=yxY6dt84g?_6)_+a>Vso_?qD^UpuWzYtoW?pIQ8!!2gg8VjgyY(~=;M&G1$ z;7RAg?|(?;h2P|C<u7vT>^V7c>Wq|>osgV7+{Meymz?}U$<E1_jI10vd@K|8v15{! zeppftq)T#2n(Q(AY$s2itoPO9)pWoVjv?=%Fr0zUvOFtQPG%plzzIAb2b5)}Nm*8! zlw_nx@v;3<czCbmrzc5H+Ahi5zg>>)jh7>dv68-Xv!w6XB>VRy%5JQW>@%~!kNarV zFa^Kjx3r(S{A2jv{9&888~zs9C1$`D1UpaGy#6@X4}vY_c>rw>&%wSj5cZR&Vdr{W z4orPe_D$?2iEnk3gx3OP+psp0zICnafnS(od8PKrzi!`5UOWSSKNr*y09*0xk_<aW z>U;OW4%icRsfS^2f=vxJp2IUAfnD%H*nJ+5{gYsGf(>p5Y?oW%)7u1_S@bg=axiAK z>`O~m?VJ6z)$)Hy``?AhhQ5s@4*mn$_jZrF1GW_O1#C<y?>(SwWVAKWW@EA0!RESS zG;Kw#l^-Pv{)ouFu96=6v!p^E$p4kv=Xr={REDHQQ)DfCOY~*Xhq&$a0A+`wosRaR zq+s}u6m&#in|w&5bL*=uRol@6JY;Pj2U+u&qojlX^dlLneY3x%TK;)|S+{TQS{N#; zdejE}&am+`Rdv#rLZ1o!5A;>huE$vS{lvhBLVBb6yDQ(xss|15FEvo@AI`{9_U@~- zuiGaR=1!0w;B#61h@J9h&_+x@D#wHEZF@aX`E2R8RqfMP3I7f8=ntaLW_h<-vZ8xk zIUKh}GIH|N8e-PXs^#Cu$H$^;#C;Yli|^2s?_}MRO)v)j%C=9tGVM{S?_qOfoQUz@ zxTvuQZ5!dYp)X_!d^<m){Ueb7th~ajwvXSPTI`##v)-2PX>*7C(*MRWR<>m&fA=f7 zqn(!WN4q|4&XiB$(OyY8`1vt=_)zM~(fD<eTUesnH{0v0<sU!RwCwYnKN=_NpRl+1 z#P?0?g0{NDS5JSq$(~J{Hi2orXFl=hdr&r0(6IJDP2}j-by84Lrq*w>y|>!-@q=5n zr&Ip7&V5JXhcr`l?FVlMU|T$lc8<}eJFl;@73M5}y$v=)rum-v#3Md^GMo=_Lt08k zLX;Ghp15lJ)HSJ3F>L#MlI$4K3jEw_Y8y6u+K6c{rcJZxJJ|eSe`U-x-!q@Ke$qhy z1$|!hYvk{Vm9ytBsQ$;I%RQi4{;4}qmt)vCbBt^s=7)O}U2%t^7i`&&OWx=GU}t<@ zj>8^V{?lu6YSrs1W}5GrPdwtMhQb%}b_a=r@1r<5PSwf%^jh0rJM(Q>^I~h+8`eis zXZ4dq^PiK9MMETa=}0MD`KFYv9WQ0;C#aZdzGr?q@KS)kclzV9{oNk2>bW*jl(Iv$ z&;930?K?X=tFr}>Pe8vf%)?!s!aON0%9k=iae)a+3gJh%2xWL?9`Q;DC{t1Z8$HVN zzQTFfEE%XnT%mpHs_J(a3i&Vo;(ajQ<wP6Qk$M8E1{b_Y<9+L=o_b2&eDh6t<Bd0} zg|TDD%GF@Zm@%Tm=+UF4Teohyua0(;n$E@4J0k$JuTWp3F85ae^~NH=Jb*L663`+4 zpx^EKn&`T^HOvO<*t@u&y8^JZ3amihNDG72Kimcz;syQ=g}<BOnT5V!o||UQoGI{= zvcLSQFRI>lhJErkiYU*+JPY$qAkUxt%>i_B>hB!Onu1-&jvWuOECbI`{0#=rPqZ^& z9o~k5HOYuxXHT3vN_ht5d7OG1e>-r`J@;e-;Z7Z?O57OxPcU@Axwdud@(ykS{w0yR zbB+JcqU+}yasPS-U@maS0moji1AF%uvuA%M`%(|e_M~Llx_y^KZHke&gq;$-B~DhY ziImmrH^{2BQ4+Ccos5Ew7-gsE<=x#q63bx2IKDFizL1Zlbjw0H9=}LRw|*r>F$*Ps z!yGxbGF(!>8ZU>U7E4t0CaK?`!BV}vho@&^Y1wf}oHjt>o_Cc!Z?%`S(0e3(>V0zH zJ={^k-L)OB`OAhr21)#Am_%-jk^1%PTgtn8cqEpTmdW<X{Ur+b!FcbCe)e6sH=yf{ zn+ADHM9(_1^TT1XVRNkDSMZkd_+fq`?`3Wt_lT_QVWaLF>30=)hk|+#@4qa&Ta)c! zLu6xYJnxWSEbr!?SWs9bvG4SOKh{V2*7Q4W^sm$B$$c}rzmp_>JVG|1d_Al3_)k)a zxj5%1&3q9)vkpoR&zav>3ch|;^5Cb;__U84fF8c{b$|Gt-j&#GJ9wAg(mwvrRbpOV zzU-RynxxHmRI<N@U+|}~QXch=oLCzq1xsF&qw}7X#0gy_bHz+a#yHotDv!R5<vHfU zxwCQ_cRtUSm&w^vC*<sDGn5~f(<e)C@3TmLzi?jp7%+BU>*I&`5&V0KoSwZNJkz~r hukr`F_XPB~9D4LDzyE>mXCa%1Q08uyztP{V{tribk?{Zk literal 0 HcmV?d00001 From 442842230ed33cd05cb2140415b603c929b5fdc5 Mon Sep 17 00:00:00 2001 From: Richard Campbell <betam4x@gmail.com> Date: Tue, 9 Mar 2004 10:59:26 +0000 Subject: [PATCH 0391/1463] noncopyrighted icon FIXED svn path=/trunk/; revision=8603 --- reactos/lib/cpl/sysdm/resources/devmgr.ico | Bin 23558 -> 8038 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/reactos/lib/cpl/sysdm/resources/devmgr.ico b/reactos/lib/cpl/sysdm/resources/devmgr.ico index 1bb121442ea4f2a132d7fc4cb82be1c123e6f5ea..beb28a65a33482a867435d3cc444eace440daeae 100644 GIT binary patch delta 2735 zcmeHIi&Ilq8o#_Er6__TG%6w>RxDMERYWTmDYyb+(JEM=R867E!zD<7Rw5u<nE}c+ zpaQjYU9bqcqJUrv${U0PNJub-han^cLSSJ)dAP{_ZZg>JxX$b!uxHNw?#cJ~eXn!B z{H0uDV7D_tXb{?jxjFgPCGvF%!i6A+rAyVngLDXD6g;)ul*rd7h$BlD<mN<>HbK0k z7VlaXtFiQL*j>@J2el`PzR=fTH7~cKl3?TmJ)+1o1C$_IoM#x`1*`x{q)`+RLlDY2 zCRLLl+*f1}0R^ly<4d+tDm{YG!uvcy)eI<Dq~efoL_|C&mNVSn$sqn-B4;dT6)v*W z7Vm(=m=#t`X9wRfIxXr9Ej)tm8&3Q3L_`?fmwxs*JsPiQdIT-R7t-Lca9TLTbl($U zA!p7;(89^+z43VN<TJ#8w!`~m{WHdmak$V>dH<bIGgKLpiIM9ObjWiqHN!}iDam}5 zIct-N<y#~KSrnJz&rKFl{$H#AtyWs*o*G8xDCQnK8iXk*mOg9k@)TAYMW3p%urwEz zmX?-|j*gZVOJkpdO=xInSy|bwTeoi9xRIBackSA>oSdBO?Ci^zFQ=!cCnqN-BqSsz zCfeKEv*IXrwgv_ULZNVeetu+RL?V%Nb#--gbZ|JFrlzKvnwpA=ijtBN004%`WRez} zSFT(+Ffag%=g*%%d-iO6d|atiN~O~7?ruJx&t|jh>+1^(3lTwDTAH@DHjFmgE?&GC zLKsa=O-)ZvPfSdVjg7&szrSB367hJv=H}+2qN4Kh^7#08SZuRFuuy;b^5xvz-0bWu zEMziSUtgbCEQSS_%YFFpAv}3`d8yPlY}kMpV4+?>M+}I4aBvWOfk1$?u3o*WudfgF z9aiq{?(nYG1v)ZEBrsAa6iDvQojaD6mQZvwv$L}U%FN8n0`mNe7cY=%Qc@C?N`=ZN z#wh=mEn5Nu15qTT?BnBOVPS!Gefk!<5*-~4U!>1{*4EZY3Uw(cC_r<5QLXFOujl6G z!V=-4>_`gdpH%Bd)k5pCva&KWGjU)r7>0(105f)@P$*SZRj-1Yo1dSZdpR}xugR&I z@yX|-;}Z(ys6;x@*DsUE<b4uZuUI1Lc`6k32!x`JPGNh8ptY^7r>7?_E{?=wBIM!W zVc<<Dq+??KKl?h>d$g}}q_0!iCs2w7ir$W)9-ds(CKGZbg65~Z#-6siE_Su>(F0*q zC9jp;!e%24gr>f;f23AcR%(2H;rI1{)*QwTUYyh8r2XB0Jt)3>w4eE-uPn!3mh*-5 zCqGHnv8U;uiBb-9Cc1LZIkL}gZ#eZ{eb7c>ZD}jF1C{%)4v+wvhXmU5k}8j_XgFol zLjRyW#(^Kd=ka%+h?4)*mFm`&>MlyzFHCY3TyWyW?&3s#*cAGH?N`>7pBqqr^PxVj zy2}*^;Xp@+RlRYU$M2B27k@o$R6|?W7-HK(-`W<lgU8(65%0vmuvc(lFF(PFciyr6 z+nt=qZB1dD>w-2s3|M>rh)MZj6Jd2RUnqKo$XvU2?a<H=g5>;sq165DN<Xvelk4hF z+dMk6xg}yNhq0X#Wv|-X*=Ij&4*vlDY6I5;?l*60sprxX4?|(qU13)*5b<UGvA*iF zxw$zmJn);d&lfpsmLE2*IJOGr)wFeWLGRWxPj74pwrvQp1+DwqrsgZ_sxK`N#Qmf1 zlpZuHa@8$z(Srj~uQ)$H|4k0$ayc9{T>7S9CvkWG;u258^3O~v{nwy8z^p(0UPCas zNqn011AlW!i`|#pcF`?#G|;%Umm;bu>6J)v`BejJna7$nYt-|kh82~!l_=b!b<b;g z^-1f-&`r&BJ2qn*S&(S5ENsShREaF{*ESWtt8csN{o+8}+)L@IEfq`UuMnALW@eZb z2(mgY^7=O7S08Fq*d`RTEyjUM_U&VI46OsjnH#$s{e%=fK&^{CmfUorbl2VMmn(pX z5&L?TSFc{Jo;43r>179(pik%=_uNPPguTLxu1}cBZe8DdsP~g(H?Sap7}o<n>H^o7 ze!9H7_TGR(iH{${{B;MbR;|KBLISmyV(MrXFyzJV?o4zRCA;<ffbZpSU*=IsrZ*_g z;D8S)bl8#G8bd;CYiR3x8}1JdkG{zPW;jME9MosUHU+=SJ-3TQPjP#i?$w{|Gw?V6 z!QA6RdB;I<1_yjdq0@eDS9AE5#*p`At<{s$v#5}28etS-E(5P3<xFFcB|mQWlO&hk z9}Y;fjtpJ%A1R=X{o~Yl(P>be!2usq=<v^f)Ea45bHZ|{y$0r(jQ@#Oni5$Ou%Ydu zCqM1TlPi9`Khyg2L*%z3hD)QBW#53}3=a6hD}EhmN7}wS(D<!$k>AF_jwaw?8maJ% zjg9fo2F9pTDVIuy<<j9nnG$<wfZPiC$il`M97q+|a;ajVe^4qJ=$A}SPr+QBuc=mQ zYATESu_I-2a?;z|8!k-u>FMbmI&>%^A|m{?_2)OQGYcy$EX>i-5!VfW9Kozn&D7$X IM~`X$8{nb)r~m)} literal 23558 zcmeHP30##$*MAhz>jD=<c3BcdMKsGwv((C^&9b*l&1^MI%QY)7Q?OhxvaDRQ#kVpw zGsRp$TmTU_P!v$y*mqEILClu({r_|CbG;(CWcKxazvgo8JoC(%nR8~&%$zxAE}B+L zGibiP8sa)yQEg3|rfHgkgDKsrmZpue(X{sMnKo!k?KN#~9nFl7v_aFlI_dZZZJ4d5 z6?p3SzS`0jn)diDIzG~<_gpU>-&Y%ky1weKX|2#ENYL&BkPa0<OLZZXFYy&>eh4)u zVq#+OE>sid<4epBVor$Z1#_<$4AX;yr-y}w>PW`Q%F3XiU`u+sNJvn~bW7SOl>!7y z+EA$wEa^HT=YuMPHB0yy`SPYEsTo2<E>@5ChOkSLcoAyBekf@A^spch7;M5pSyUHN zSs4<dngB6KRE7kBBvus??KyV+`pEEbPajkMsfg(C@UX~;i1nuY8R4FjBcsDTJzbgB zBs>Bsx5$Xd_2*Uj@t&TZ5z(HW3+I{gS4Tud&X1T8HDg|-!k>ZsaL>s33tO7%8_V+H zp5YPmSY8t}=Nb_n77^`Ad_&0O$ob)*$1OtDugL_@31cTr2oDeUG1VUt8Mz)IGGYty z>x3X@0z!DWtEoOP$`Di;!h8*#sRxyB2(yGx=3g2p7Jq13NOfQq8IjOhQm$#nEKREy zqiHsO6|g?aIi`S;bzROwk*+R;@+H1*OwOkVO%G#5A4^cMiYsLdV}qC_)+AfggAjlq zL0f_*U?6_=3=fYA(hL*kM?g|E?L0==-SmDv)4`GJ!#$^Kb$-R@gyVe(2cZ(xviC!^ zETg7n)w>AgNQc(Cc3?lX2fPU2x}!pUQ&jca(a}+B)~uP<p+g6)M~@!b(@#IGff)@# zqAlp40Xk@jh!YVn7>e{zq!A|~7WF(7@lY)h$O2dZq(p!)2BHAK6y7h;e)!=BEjl_H z`3sQ00Qrak3l=2eIZ-=y>=@E`mPD*Se23KsaN@)Xq}75{mHdB1I>vPl=;)*^?eR;H z6Q0}}bW-X0!#ip7RUXFDeU4Thb|Gj?r-~qsHgU&HtO)A-K}FCsU=uh}tK3+ZrtL<) z;gfn=Qg}sBu#>IUaaIKc1^Wf?8Q+Y+xy3M48>VSxzlV5W59#ePM{@ujzd6t07|0rr zIa*KPv_c-!Iq4Na6Bkwl&0Yrq)oiu1;5Srrh#?;N4Qp!R*P8x?s|$nH1Djjacfeyw zHvoeJ`so4FqjuKZ7v`ka2oEe%s}}kI^g#?&z!s~G(mZODP6o!<O0~^D7Y6l4ec!Gr z4B}pl5Tm~F#d<=`i4Q?TNb#du@{1fd6HX}JS>wdCoTJ58tW@uMb{;f%{HsC3M-3V_ zdgPEngWn!E2#FzsUKufB+@Nv8hKv}|;r2lz#}6Joa?D$A4tb;9@WG=spL<f3Y|KXk zeeg_q=z#c@Z52VwPFd(PQ-lcZQ+_BH3_F3tXZDwQMyou&WBRPQKK6V4hl+zD9g3Bl zv7AfEqZ;|w>l*-^%R*qa;W9M+MYY&?spnUTYeKK7Kww~PPp_sbcs9lA>FMc#U|VAY zfq}Md+5`jyG)M45@bdCP8L!$k6u|4c#5ZFTy(yY$YEv`5XB*XkYJ)BKfjF-^HPi0_ zd=*dv?SLdtuPfn$ew_hw;N{oUt10QP(vjw5V4zKaxq1^D&B248XAR_Q8ZyWL126-c z2auqe$zg$7%}w~|7eB>7bB`LU2UVcRQ~<c9f$*qR6ZK>Qb=mltT2PGp)y10{xK&Iu z+g2~pyvCtYH4|5bS~hh(nl`O#%YnTZRDI^Ji*NNO4~%NnU@1{G12lP&(W*f&fcLhZ zlw*9UxS3aT$|h6zR-#QQHFJ&!2&O3nP#ywWw#HylP#OFvNX`8&im7RsOqdWe{IxP8 zDjB65`FS;OYE{1tDh~)~)3Qx-eo()vJD`Ps3%>wVP1*Ci1RrwN+{M+~<rZ&zZUOk> z<Kye&dy9)NUi$<<RITc-1AK4$Mn<F2$=Jln=+eZ+0pR4|gg5qf_V#uGm)Gx&JfJ(d z5FH=KCQgn>qJYuhL`k)(pK|Zr2szA00i%nPi<2W0MmrQ}XapD5^bp^-fy!hP__&~` zx%Ng48yQjmCHUwcmqrcj(14;z72z{$HzK3j`t8sHc~(@R2yu<5y@8=Rdb|zjAe6AT zBbvR@4i9z>>>Hv$P52EBMgzJ}Zvmx9yTQ=F4&!|Z{ovQdU})5!5h=C~AjaNsS^c%y zpQy(|y_3<@_h6!t0rXc}zd~2t>0;_kvTSrx^<PSlseY0I6v%?n$<-98Ua~`fUW(80 zaz@`E+ZAKw<cjfa;(}*=j3MRL{MN>*<BfhHF0fpc1UaE7qzS>^SY7=<2PHsd{rn)J zw1Pw@)PHdu#Xh9!r__)XS9cfuxwx_!r^YPch{<G459xQbBRNe_0GMvB?yhclfJlP} zdt;k`HdX6)Zh%Y&5&~2o0AjG<O0MisU)B1Z>w`P=3u<*k0XMdT1Ua@dLVm6BNk7*S zF3Q$HEz*2l1wT+<V)4GFz@^%>z~RA`HC!=RZ^I~1yDox9HD7#%V9VvyYW+m&>Osf9 zbosBToC#abYnl%auH`teGS0#wvr25kbPNu%=D2Ep)wHTduTQUEkALG)Pt$OI#siLp zjD0i>=peux^W4Yu|D*U4{=g@?LDRZbwOg6B+B(dvCOGn)qgLH{btulC)ty=Y%Jb?1 zoKtH$uUel~6LC)cr=C~;J*WPAPW``pPHk5uR9Pje<RW<~Lc4YbA8!O4_IR|ky)56x zziptue~T6^e1PZG^z!_`w)mJ(yuB~aZ|C0@*$Ak^+ozg*ueJ!Rz~A4eMZK!^YwhX; zGT+Mw75IBymaVmGS63nUqY0lnm*)e))`v~B^>1oZCEL<DwgzvndMIoT<}T8cjO*96 zPAP<T?do`;OZey2yoHbILUv<)b2IJQnc7A7v}xrJ2FU?G^-W}uvw)VZ{9Cnd)zUw( zB|5pKe@k?93-62h&9Jn)xwyHzJG;5NxH%)`=+|1$w+U?PYwzgn=<MX|=H`xXM@M@{ zM<46*zIKj8Fn>_mp<xSuy*%1?vv+jBTa;woMr1oSYvFUTecy%-jdTnLWH)kX*wWvt zwi2Rt5DhoGhG^4>vJA|&^9j7gx_m=Wpeknr4h`)a`nC40WiF5Q8!GymC?<&3(9ViJ z)KC5#ot@oWoE3l0jtyJ3F-t)^@bBvA*x1e4-OZgH;MSOJGz+xw=ik=X0lnf*1pGO> zv5uCOe9-TNx{>4I?&;=<N>G7=e_Opg>UT3bs_Kd0?&j=<K5BU}A5$Zca%UYN?t1xl zO0<>iUGilXatKtt`iA<JKlNy+Z=j@^1<YFJte=q$mFXYkcQETICVQfJ`do~ZnsSYL z3hnCDQFMEHqS=maZ9}iges0l4XfL<6ox@&URR_`S>i_B~|Ju_pN~-p+Jsq9#7u(ah zr`6)0xu09q^TB%U>Qcx2qD6g}n|!?8>*;A*SoFO8+-)uvfc?$e)|6yzEo#>{)K(90 zS~R}J+uh6E+YMg^pxF4)rs(V0)T4>JJJNNUIl$zBh1+Q7<c$T&#?Mh%jEr`ToV?)8 zu<>(fNTZ0+*wDdSmB%CY5u?%G$zA2s_|wFx32ZH<d?%RVobkfw$#e^EWgw)DusPdn zVPiV6^BWxewSG%qQx`Tj_vDR7jZnp{fKGspHwdgF0MHQdcZBX}WEJ2nfM$cr8wA#I z7%&yk3UD(6x5OL(w(%=Nty;CDD%7rBTL?BbHd3cf9R+;0s%s^l8v|}u7=nt$*Vk7T zE?g*4QBksX?OIvAdbO-twMu^a=_gsfe7P)JwoH~RSt8$k_nmz6%{TJ(*I&yQUwom; z%$++|KK$@QnKo^jz!xqbee{tG95_(%gu06Xcik-FQSbKvdFGjC=&qFu7cR)DQ>Ub~ zv{dr)@+2!OOO75rD(UIzlA4+-$;rvGd-rbHzJ0rF-MUq_Y}q34*(+YZ`syp0H*cOW zChu64I1ax91_El(h>-K=gDr|C0OY;*-c$7Bc8;RIxVTu+pP88{hYuf?0|ySs{{8!9 z&z?Q9YuB#J=#PwyRAa<3nLmHNtX#QLx^(HH%h9`N<7Uv$TNkOM|I<%DRrK@gmtTI7 zbLY+}ICJKVoIH6_%F4>5prAmqv$NHBke_|~_Tf52q9i0FsIef;ix)4JrAwE}x^?RW z_ce6-Igf8vSc{5f%9JS<`Z)%_{`#x@{`>Fp+i$-qpj@3lf8HWn`T6<6u{m_;kffxf z$lkqs)x7!k+izvXiWN$xtonc0%_1K4hLQdkUU<PmKWS&5!%ioZquktFMJx1VB}-{( zX=)y@@AY}GdGlr^^PKl<)~t~Y8#YL*R;}3oT#N4o+^ld1D!zatksLpM+`@zY@W&s2 zs5xCxQ6Xo~o>hEtZnOWb=Qig?TwI)@J2o~}&Ep0Q8j$`pfcwoN9`(|qyMt>t*N&P3 zWr^~_evXfiS94pR4;&ZHg>BomDIT~cb?@F?m;KLgBJFzBBk&+@Zf=T>>UiKdP&U5& z@=LY8kY0|LJ`eP{OxfaGVtoMai>(2FN0^I7q-)o%HS$1uGcq#N8pQR8^P{k^P_0MY zBMu%sD7Z{0O`0^(>3`wxAl%%B2V%7s+<E7nYCYsSS~ckF5!a~l@^ZDVaz1eVfsa7y z)uYEo?O7iq=Kk_`2DY~jAO?d$1`HUW_FBq*b%FeGZQ_1=+ikb$ea<)(aI*sULF&p) zssVev^8ri%P;U_j2L~ln!-o%-88c=GE<7szXVRoe(!YOyfxSrSY{Ug@0rUZ|Zt8{A zwZXRk%(!r!=?(Y*umTVbh^hv-pDhRM1CS;QaE&6}k3RaS<(*ajDLiigP~YVBwd(4Q z#QVj7sQ~Ki4FJ~?>H>+EvZ`zMn&0*9+gCPi+9V%*@PXiB$u*a&p<TM|h6C&XR}1d| zL5(x@TI#{v<Ea<p&Zh;aBNM2<=s?`>zyDsn=lV`vf%*>jSn3KoP^bRyfB$QNMT-^* zfqFK9bA<V`XV12tE9XGhAOK~froi)02|$8_gVkPYJr}vIQ(w^a8?GzdXQ{WHK7CrP zG1mH9PEL*xIB%(6^O^fF*Hx~eM~)m(IuZ44>Uh+-$usqCu2J0UsDIym_ucyVQQll@ zA|CI9NxQ47tJ*(FJ83)zU995Vc{y{oLQb85UQm8oj-SMOcpN%UNvRYSmq<Y&bm)RY z$;rhzAR9VRR<<0=$dn^TkIA7UJQEy}0|#*~NINL|c{bRWB72heNz$IZvO5WS_U<Iv zzH^r(?AR&s3EL$O=LP(ZK=H?O5a|M(0Kn2&W0-;*#V^-u2BjaDmrBLS5~(;*B4<t% z%bDZFa=NTYL3vq$l$QcZ3gl!-o*XYC<Vsm#j+7Q;OL2ad6y;?~Va_or$UZ9hnMWiy z<B;SWOPA~;2PE@ws$`_6$gzX_<w#nx97@@Pc)z4TN8*`>{m*lqt*tHTr+(M5M(Q<9 z(SPr~_bT0&^#2OT*%c+}3&+UOZ^lc;l8KW2!(_=_IaTskhe^@852ZNjBPoskM2>Hs zEhl2;$jR8bax!k7f)lax)Vs3Hp8;o<6i0p}g=@nlKVrJ%{xn6^mHGWdRrjH<-jW0J zMoHFk<mcu{{I&#jX5id|Rpy%M@7%ewg?{cv$;)QR#(s{nb+C^l4EL8^V*(}V?b~JF zgpQIrxr-c}cE22&(L;{Td`OPXdPFimeM~YxGeO2Dz16!TANG>;u<ml;{ce&nsk0;p z-yw<PZj~J)17zE)%_a6FZ`m}^Rn|S;K;lPtlKh-3*$!FaJoxd)AFr$bIbU@7;TY`u zakgw6=q_<X{Uu>UpzM0%c1a5AD9P{MD=CxjleDQl<Y3r?a_GZH<nTwm<><$c$<bMl zD>#DZ!!sY1LmxaW2d4Lu)b}5deIZ?C&pUU^?zirc9b?+dw%6K7>?<u~)AK&E{;9^2 zFs_>v<Yvnb%m>cp>!rU_r%spBzx-2)db){hd8wIfeYKS&jBG2r#@;50Z{H<*Cv=v5 zle$>=I554Z;^p9s2Svg32j#%Do{H}Mq1_~T;=QtGd?(rcCTJghtD-$_h`(%p@fO)I z&{NhtZj|^j_k#W$%;`jRj=oX)lb3xW>;K~*n+ADF%*%cz9xx6&$F^5}xF@)y;v*S+ zuy6NcOgJu#Ni*MZtoDq*8*+D->>78wY#-GQv<Ij$-2&P-KHF3xpLUhik2H|D5qC>r zUall!UE-Qb`R9Iqt@HP;yY5nFC&~`Po+Tg4&%GN;)Brcx_?)+ihoLQ1-;s`;7>nI+ zc2MJy1YStzMd+ktE%B{8mE2KY5=OL@t;1R?nPI;x+WWc5+9w*z%AU5eW!Rlkl%Fd} zdz00^@Mq|!zOIMF?>>}Oz3R%k|2RohfAH|Em$1)bUumw!g7Qn5qCD&beLFEfF2Zd} z#>r>G>wywK+}!6cH&gOXnPI<^_SKKt$&dGGvhkJMu<qtzkJztlN!<6Zr~j$bTc2-t zEeewrsQ2gI_Occ{MD}x)XtcWtW3lC>TO?*M){h}ABo1?9>+sgH4Kz|V2=PeA4{HTE zX(=(_mvd<I^S-JNHVkl=^?h9|w6E-Ckfrx%68&;}DJjgCeJQDG|04ZnJL5I2|99MR zhdOKM{h#pVR9V(pla;;dqmS%mO`pcH?kQ*0Z&9Ej8uMbyi_H{`@sJBe`|E9Fn-1Vd z$qVKw@uHvc1l`W4$5DQM%qS6$G?Jfs8f5u>Hu8NZO*XuAE9ftfl+-k(V^Gh!9{Tb7 zpG)YE|NMRVzN3b*wLv@eWaWbmRJ)X=%`f<(e_Na62ePy4joUCkJE-}<Ik6khoUfcC zl>P0HGs+P8h=k0O{vRKxBR_PjEz7#rvd~{zR3K>w4k|tAdg;IY_S=<BQ}6$+3nnZ2 zmvzyE5b<y$B{P(H(zT0pVt(p#muu?Y3HO+xGuHafl7uyr>n+#KonyKF+=}_oMvWO| z=m+%8(t9-v{bj|4auD{eOxQ7~-_mY<t?LiZcO@kyI{6YeKU5aqrK$SYW3I(Ru6K+v z^)uH)t~JT;-eX!jv0kRUcfX`ypHjeQ^E%44pS+Pz6CW54wT`w?<G2cP#C9k@WyM93 z4qGbqRqEx}Lx21B?UgM}XCP+oB-Q_1C$^6?t(RO6lSnsc;u=p{)23k`#vYqK;~`1^ zzzlfi-pqY1ZAy2=8}~akCPCZ_I+%FCSi}tWlNI;ZmJKh$K2}mJhoQSt=e}P0Z@u+a zDJm*b<o|*1O`lFs>oR4R@{;)Wow64)v2RjWwXYtS2AV-H^#tk*N_Y6=2|22uk4jUo zI28V{;)Q&uy%=Mr#=^3nwZXdNA)AJDkQ1Q)Xhx<wH;{h%LatSQXdk4lhC$K)*#z0p z-&N7hacAG{$DW!BI@q^|q4!Yd$@uI)k~z1pWX<m<*$Xa0*1V@BWA;;W4E!7cALNxf z6XlBgGIc5L7o1OVFW&<Fp$q!INHQ|Bl+BB0y6d5zb^_YU7^r`4hWy06(oC%>)Lp0# zun!MHHrTHjpFSa3pgZUD0h0U0K*|4lkQ6L>PC-86ysw^>+=b6bHu%b%{iGU?bc_Y{ zA`=hyNFrp3dtdx8f7$VNch&#dIk`#>XlF;?UvvLgrGMk>2@($-SJyeIL$cqG%mnS| z^Xz&3K=(6>-okHRl;ZCPOUcq#6cjIcMT!=`EQQ~^p!mpH&|fm=Jf+4fojNJz3}uP( z$n`ei_13Z-^q)IjE@vxDeue9$9~Zcl-0A(le&$<Bf8Gmu-5-j+$JkR>KK4l;p=_|v z3;z4O6fYhurOSrO@fE}6<jU6pBjm)&*W~!}VN$YWh!lSN5_lK{+3F9zpHySVen`a{ zMLFUaY#)KWZgdx^Jabwqf4QLi3D-+MuC}W)w@&|>urado{#xqHkvh4nq)+dTv&zGg z^;sXu{rqVuT=cAzE`Cu?{4hjLf!;GekCKXYV-%cSJ6cY!9wFr`UX`*XFH7+^&q@9l z10;Lylaev3w;cYU7tS=$Qzv522)<KdU+|RZ7Xsy%iZk*HYz4F#+%WxfrpTf`ezI<C zciBDTDcLi#zwG<;SxKGuk{tYUs2u+0H959~=e}{0w<=f))=ZGX^&wIOC|EZU=gfB` z=cl(NW7$|a`rQaQ^z|@FTQFGm&wft!e*BCie$ZETP3<FFCp{ud1_sK{<NC;j^Of@3 z?<QO1_0o?kjmmD!{%0sFI}U$Vp%mm7NHO%P%K&?QF`(osK%63!FDl5p1PY-m6AGa7 z)7C;i4sE}>E!E2Ya5epHBImiCot^SKn5h5X`KH`3(B2dh!e0ug_2)F=_JEoKZ4<u& zq+dU*Dd>y;&A|SrpAx?m)9I(3)S)Kg&F^QDe(o3ChewVaDHA77ly~2K_b&(fFLZe4 zop;0<=pUfXntmSAV}|}_8m|=5e?~s_GXI3Q0`yD+T*>x{>`TI6q>=$=0JQ)9-9Q`r zNx*7A7eKY)-{0+^TmFXM2XXK%ze_UK^t&BjVqJZPo3N^W^ZwMM0LtA<*9gR=Z2TD? z5sFy?=LK!+m&{e``$ziSBmMpn?ZM_V^#zm*1=s-oZ0L%DzmFO<O7IU`l)r>$Uhcd4 z{UP2rqR*T@4c;Gm|NZx6>eQ)1TOrEQXVLP{HjZ+y;_{!e)o{O{?S<zi`X}g*NJ>hQ z9Xoa?fBVLb8<jtXeiqVZ-kW&u=fN9j{|)-6=;LSLeHh+h;N2wpp6NTGzl63t-ov18 zh&D0$m1fPFrQ4RCxPkWjanEP{4D^}s{tEp%y5E?4Deo5X?gZ}?@y-+P5%De(+T|U( z+i#$KACx`Lv1Q=i&%Kj=CepyO5bpx<EKVADe_+d&Evg@$eDX=Qp9HuT-`tf*oY%T_ zYm45m2*DTmXJ69?$1^d<g7+3E7rfuls8J)f&pQz}8k(Yl^xnODUt)V=ALu?b(n7lk z<%GUvTs>vm>j8!vZQNYG4dOJ~zsPUZI|bCmD2McI<3CWaZTj!&xBfGM_rd6I>;$0R zMhFB@juW}I&<^zKtFNkgMmgubJ^X(jwo6z8xF2vUKrhdj>j3M%QlPAE22=v5FLDjj zf%`r6Ow|t8x$)!23&%x&hnVx7TLOKmdO60di~IIZfYyNOf+t=c;TeJQ&N)o`D%U&O zIS8~D=yxY6dt84g?_6)_+a>Vso_?qD^UpuWzYtoW?pIQ8!!2gg8VjgyY(~=;M&G1$ z;7RAg?|(?;h2P|C<u7vT>^V7c>Wq|>osgV7+{Meymz?}U$<E1_jI10vd@K|8v15{! zeppftq)T#2n(Q(AY$s2itoPO9)pWoVjv?=%Fr0zUvOFtQPG%plzzIAb2b5)}Nm*8! zlw_nx@v;3<czCbmrzc5H+Ahi5zg>>)jh7>dv68-Xv!w6XB>VRy%5JQW>@%~!kNarV zFa^Kjx3r(S{A2jv{9&888~zs9C1$`D1UpaGy#6@X4}vY_c>rw>&%wSj5cZR&Vdr{W z4orPe_D$?2iEnk3gx3OP+psp0zICnafnS(od8PKrzi!`5UOWSSKNr*y09*0xk_<aW z>U;OW4%icRsfS^2f=vxJp2IUAfnD%H*nJ+5{gYsGf(>p5Y?oW%)7u1_S@bg=axiAK z>`O~m?VJ6z)$)Hy``?AhhQ5s@4*mn$_jZrF1GW_O1#C<y?>(SwWVAKWW@EA0!RESS zG;Kw#l^-Pv{)ouFu96=6v!p^E$p4kv=Xr={REDHQQ)DfCOY~*Xhq&$a0A+`wosRaR zq+s}u6m&#in|w&5bL*=uRol@6JY;Pj2U+u&qojlX^dlLneY3x%TK;)|S+{TQS{N#; zdejE}&am+`Rdv#rLZ1o!5A;>huE$vS{lvhBLVBb6yDQ(xss|15FEvo@AI`{9_U@~- zuiGaR=1!0w;B#61h@J9h&_+x@D#wHEZF@aX`E2R8RqfMP3I7f8=ntaLW_h<-vZ8xk zIUKh}GIH|N8e-PXs^#Cu$H$^;#C;Yli|^2s?_}MRO)v)j%C=9tGVM{S?_qOfoQUz@ zxTvuQZ5!dYp)X_!d^<m){Ueb7th~ajwvXSPTI`##v)-2PX>*7C(*MRWR<>m&fA=f7 zqn(!WN4q|4&XiB$(OyY8`1vt=_)zM~(fD<eTUesnH{0v0<sU!RwCwYnKN=_NpRl+1 z#P?0?g0{NDS5JSq$(~J{Hi2orXFl=hdr&r0(6IJDP2}j-by84Lrq*w>y|>!-@q=5n zr&Ip7&V5JXhcr`l?FVlMU|T$lc8<}eJFl;@73M5}y$v=)rum-v#3Md^GMo=_Lt08k zLX;Ghp15lJ)HSJ3F>L#MlI$4K3jEw_Y8y6u+K6c{rcJZxJJ|eSe`U-x-!q@Ke$qhy z1$|!hYvk{Vm9ytBsQ$;I%RQi4{;4}qmt)vCbBt^s=7)O}U2%t^7i`&&OWx=GU}t<@ zj>8^V{?lu6YSrs1W}5GrPdwtMhQb%}b_a=r@1r<5PSwf%^jh0rJM(Q>^I~h+8`eis zXZ4dq^PiK9MMETa=}0MD`KFYv9WQ0;C#aZdzGr?q@KS)kclzV9{oNk2>bW*jl(Iv$ z&;930?K?X=tFr}>Pe8vf%)?!s!aON0%9k=iae)a+3gJh%2xWL?9`Q;DC{t1Z8$HVN zzQTFfEE%XnT%mpHs_J(a3i&Vo;(ajQ<wP6Qk$M8E1{b_Y<9+L=o_b2&eDh6t<Bd0} zg|TDD%GF@Zm@%Tm=+UF4Teohyua0(;n$E@4J0k$JuTWp3F85ae^~NH=Jb*L663`+4 zpx^EKn&`T^HOvO<*t@u&y8^JZ3amihNDG72Kimcz;syQ=g}<BOnT5V!o||UQoGI{= zvcLSQFRI>lhJErkiYU*+JPY$qAkUxt%>i_B>hB!Onu1-&jvWuOECbI`{0#=rPqZ^& z9o~k5HOYuxXHT3vN_ht5d7OG1e>-r`J@;e-;Z7Z?O57OxPcU@Axwdud@(ykS{w0yR zbB+JcqU+}yasPS-U@maS0moji1AF%uvuA%M`%(|e_M~Llx_y^KZHke&gq;$-B~DhY ziImmrH^{2BQ4+Ccos5Ew7-gsE<=x#q63bx2IKDFizL1Zlbjw0H9=}LRw|*r>F$*Ps z!yGxbGF(!>8ZU>U7E4t0CaK?`!BV}vho@&^Y1wf}oHjt>o_Cc!Z?%`S(0e3(>V0zH zJ={^k-L)OB`OAhr21)#Am_%-jk^1%PTgtn8cqEpTmdW<X{Ur+b!FcbCe)e6sH=yf{ zn+ADHM9(_1^TT1XVRNkDSMZkd_+fq`?`3Wt_lT_QVWaLF>30=)hk|+#@4qa&Ta)c! zLu6xYJnxWSEbr!?SWs9bvG4SOKh{V2*7Q4W^sm$B$$c}rzmp_>JVG|1d_Al3_)k)a zxj5%1&3q9)vkpoR&zav>3ch|;^5Cb;__U84fF8c{b$|Gt-j&#GJ9wAg(mwvrRbpOV zzU-RynxxHmRI<N@U+|}~QXch=oLCzq1xsF&qw}7X#0gy_bHz+a#yHotDv!R5<vHfU zxwCQ_cRtUSm&w^vC*<sDGn5~f(<e)C@3TmLzi?jp7%+BU>*I&`5&V0KoSwZNJkz~r hukr`F_XPB~9D4LDzyE>mXCa%1Q08uyztP{V{tribk?{Zk From 97ce8d58b4883e7057b2ffc6c09589cd7322c2e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Tue, 9 Mar 2004 12:59:13 +0000 Subject: [PATCH 0392/1463] Fix SPMajorVersion for Nt4SP5, spotted by Christoph_vW svn path=/trunk/; revision=8604 --- reactos/bootdata/hivedef.inf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/bootdata/hivedef.inf b/reactos/bootdata/hivedef.inf index 77f5219cbd5..137de793c4b 100644 --- a/reactos/bootdata/hivedef.inf +++ b/reactos/bootdata/hivedef.inf @@ -53,7 +53,7 @@ HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\NT4SP5" HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\NT4SP5","MinorVersion",0x00010001,0x00000000 HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\NT4SP5","BuildNumber",0x00010001,0x00000565 HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\NT4SP5","PlatformId",0x00010001,0x00000002 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\NT4SP5","SPMajorVersion",0x00010001,0x00000006 +HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\NT4SP5","SPMajorVersion",0x00010001,0x00000005 HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\NT4SP5","SPMinorVersion",0x00010001,0x00000000 ; application compatibility settings for Windows 2000 HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN2000","MajorVersion",0x00010001,0x00000005 From 1bb065b4f4dc4610bee9490b94baaab90d306a58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Tue, 9 Mar 2004 14:03:18 +0000 Subject: [PATCH 0393/1463] Correct menu bars for windows not originating at top-left of screen. This fixes bug #234. svn path=/trunk/; revision=8605 --- reactos/lib/user32/windows/menu.c | 393 ++++++++----------------- reactos/lib/user32/windows/nonclient.c | 4 +- reactos/subsys/win32k/ntuser/menu.c | 22 +- 3 files changed, 132 insertions(+), 287 deletions(-) diff --git a/reactos/lib/user32/windows/menu.c b/reactos/lib/user32/windows/menu.c index 7775916875c..566c91bdc21 100644 --- a/reactos/lib/user32/windows/menu.c +++ b/reactos/lib/user32/windows/menu.c @@ -21,7 +21,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: menu.c,v 1.52 2004/03/07 22:13:51 silverblade Exp $ +/* $Id: menu.c,v 1.53 2004/03/09 14:03:18 gvg Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/menu.c @@ -48,7 +48,6 @@ #include "../controls/controls.h" #define NDEBUG -//#define DBG #include <debug.h> /* internal popup menu window messages */ @@ -436,7 +435,7 @@ MenuDrawMenuItem(HWND Wnd, PROSMENUINFO MenuInfo, HWND WndOwner, HDC Dc, dis.hDC = Dc; dis.rcItem = Item->Rect; DPRINT("Ownerdraw: owner=%p itemID=%d, itemState=%d, itemAction=%d, " - "hwndItem=%p, hdc=%p, rcItem={%ld,%ld,%ld,%ld}\n", WndOwner, + "hwndItem=%p, hdc=%p, rcItem={%ld,%ld,%ld,%ld}\n", hwndOwner, dis.itemID, dis.itemState, dis.itemAction, dis.hwndItem, dis.hDC, dis.rcItem.left, dis.rcItem.top, dis.rcItem.right, dis.rcItem.bottom); @@ -444,8 +443,8 @@ MenuDrawMenuItem(HWND Wnd, PROSMENUINFO MenuInfo, HWND WndOwner, HDC Dc, /* Fall through to draw popup-menu arrow */ } -// DPRINT("rect={%ld,%ld,%ld,%ld}\n", Item->rect.left, Item->rect.top, -// Item->rect.right, Item->rect.bottom); + DPRINT("rect={%ld,%ld,%ld,%ld}\n", Item->rect.left, Item->rect.top, + Item->rect.right, Item->rect.bottom); if (MenuBar && 0 != (Item->fType & MF_SEPARATOR)) { @@ -981,78 +980,6 @@ MenuInit(VOID) } -static BOOL FASTCALL -MeasureMenuItem(HWND hWnd, HMENU mnu, HDC hDC, PROSMENUITEMINFO mii, LPWSTR str) -{ - BOOL res = FALSE; - MEASUREITEMSTRUCT mis; - SIZE sz; - - if(mii->fType & MFT_OWNERDRAW) - { - /* send WM_MEASUREITEM message to window */ - mis.CtlType = ODT_MENU; - mis.CtlID = 0; - mis.itemID = mii->wID; - mis.itemWidth = 0; - mis.itemHeight = 0; - mis.itemData = mii->dwItemData; - res = (BOOL)SendMessageW(hWnd, WM_MEASUREITEM, 0, (LPARAM)&mis); - if(res) - { - mii->Rect.right = mii->Rect.left + mis.itemWidth; - mii->Rect.bottom = mii->Rect.top + mis.itemHeight; - } - else - { - /* FIXME calculate size internally assuming the menu item is empty */ - mii->Rect.right = mii->Rect.left + 1; - mii->Rect.bottom = mii->Rect.top + 1; - } - return res; - } - else - { - GetTextExtentPoint32W(hDC, str, mii->cch, &sz); - /* FIXME calculate the size of the menu item */ - mii->Rect.right = mii->Rect.left + sz.cx + 6; - mii->Rect.bottom = mii->Rect.top + max(sz.cy, GetSystemMetrics(SM_CYMENU)); - return TRUE; - } -} - -static BOOL -DrawMenuItem(HWND hWnd, HMENU mnu, HDC hDC, PROSMENUITEMINFO mii, LPWSTR str) -{ - BOOL res = FALSE; - DRAWITEMSTRUCT dis; - - if(mii->fType & MFT_OWNERDRAW) - { - /* send WM_DRAWITEM message to window */ - dis.CtlType = ODT_MENU; - dis.CtlID = 0; - dis.itemID = mii->wID; - dis.itemAction = ODA_DRAWENTIRE; /* FIXME */ - dis.itemState = 0; /* FIXME */ - dis.hwndItem = (HWND)mnu; - dis.hDC = hDC; - RtlCopyMemory(&dis.rcItem, &mii->Rect, sizeof(RECT)); - dis.itemData = mii->dwItemData; - res = (BOOL)SendMessageW(hWnd, WM_DRAWITEM, 0, (LPARAM)&dis); - return res; - } - else - { - /* FIXME draw the menu item */ - SetTextColor(hDC, COLOR_MENUTEXT); - SetBkMode(hDC, TRANSPARENT); - DrawTextW(hDC, str, mii->cch, &mii->Rect, DT_SINGLELINE | DT_VCENTER | DT_CENTER); - } - return res; -} - - /*********************************************************************** * MenuCalcItemSize * @@ -1278,7 +1205,6 @@ MenuPopupMenuCalcSize(PROSMENUINFO MenuInfo, HWND WndOwner) MenuSetRosMenuInfo(MenuInfo); } -#if 0 /* Not used yet */ /*********************************************************************** * MenuMenuBarCalcSize * @@ -1421,167 +1347,119 @@ MenuMenuBarCalcSize(HDC Dc, LPRECT Rect, PROSMENUINFO MenuInfo, HWND WndOwner) MenuCleanupRosMenuItemInfo(&ItemInfo); } -#endif - -UINT -MenuDrawMenuBar(HDC hDC, LPRECT Rect, HWND hWnd, BOOL Draw) +/*********************************************************************** + * DrawMenuBarTemp (USER32.@) + * + * UNDOCUMENTED !! + * + * called by W98SE desk.cpl Control Panel Applet + * + * Not 100% sure about the param names, but close. + * + * @implemented + */ +DWORD WINAPI +DrawMenuBarTemp(HWND Wnd, HDC DC, LPRECT Rect, HMENU Menu, HFONT Font) { - UINT bottom, line; - HMENU mnu; - HANDLE hHeap; - PVOID Buf, hBuf; - DWORD BufSize, Items, Items2, hItems; - ROSMENUITEMINFO *mii; - PVOID milist, *mih; - SETMENUITEMRECT smir; - RECT omir; - LPWSTR str; + ROSMENUINFO MenuInfo; + ROSMENUITEMINFO ItemInfo; + UINT i; + HFONT FontOld = NULL; - mnu = GetMenu(hWnd); /* Fixme - pass menu handle as parameter */ - /* get menu item list size */ - BufSize = NtUserBuildMenuItemList(mnu, (VOID*)1, 0, 0); - if(BufSize) - { - hHeap = GetProcessHeap(); - hBuf = HeapAlloc(hHeap, 0, BufSize); - if(!hBuf) - return 0; - Buf = hBuf; - /* copy menu items into buffer */ - Items = Items2 = NtUserBuildMenuItemList(mnu, Buf, BufSize, 0); - - if(!Draw) + if (NULL == Menu) { - bottom = line = Rect->top; - smir.fByPosition = TRUE; - smir.uItem = 0; - /* calculate menu item rectangles */ - milist = NULL; - hItems = 0; - while(Items > 0) - { - mii = (PROSMENUITEMINFO)Buf; - Buf += sizeof(ROSMENUITEMINFO); - if(mii->cch) - { - str = (LPWSTR)mii->dwTypeData; - } - else - str = NULL; - if(Items != Items2) - { - mii->Rect.left = omir.right + 1; - mii->Rect.top = omir.top; - mii->Rect.right += mii->Rect.left; - mii->Rect.bottom += mii->Rect.top; - } - else - { - mii->Rect.left = Rect->left; - mii->Rect.top = Rect->top; - } - if((mii->fType & MFT_RIGHTJUSTIFY) && !milist) - { - milist = mih = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, Items * sizeof(PROSMENUITEMINFO)); - hItems = Items; - } - - MeasureMenuItem(hWnd, mnu, hDC, mii, str); - - if((mii->Rect.right > Rect->right) || (mii->fType & (MFT_MENUBREAK | MFT_MENUBARBREAK))) - { - mii->Rect.right -= (mii->Rect.left - Rect->left); - mii->Rect.left = Rect->left; - mii->Rect.top += line; - mii->Rect.bottom += line; - line = mii->Rect.bottom - mii->Rect.top; - } - - if(!milist) - { - smir.rcRect = mii->Rect; - NtUserSetMenuItemRect(mnu, &smir); - smir.uItem++; - } - else - { - *(mih++) = mii; - } - - bottom = max(bottom, mii->Rect.bottom); - line = max(line, mii->Rect.bottom - mii->Rect.top); - omir = mii->Rect; - Items--; - } - /* align help menus to the right */ - if(milist) - { - LONG x; - x = Rect->right; - mii = NULL; - smir.uItem = Items2 - 1; - while(hItems > 0) - { - LONG wd; - PROSMENUITEMINFO omii; - - omii = mii; - mii = (PROSMENUITEMINFO)(*(--mih)); - - if(omii && ((mii->Rect.right > x) || (omii->fType & (MFT_MENUBREAK | MFT_MENUBARBREAK)))) - { - x = Rect->right; - } - - wd = (mii->Rect.right - mii->Rect.left); - mii->Rect.right = x - 1; - mii->Rect.left = mii->Rect.right - wd; - x = mii->Rect.left; - - smir.rcRect = mii->Rect; - - NtUserSetMenuItemRect(mnu, &smir); - smir.uItem--; - hItems--; - } - } - - if(milist) - HeapFree(GetProcessHeap(), 0, milist); - - bottom = max(bottom, Rect->top + GetSystemMetrics(SM_CYMENU)); - if(bottom - Rect->top > 0) - { - NtUserSetMenuBarHeight(mnu, bottom - Rect->top); - } + Menu = GetMenu(Wnd); } - else - { - bottom = Rect->bottom; - FillRect(hDC, Rect, GetSysColorBrush(COLOR_MENU)); - Buf = hBuf; - /* draw menu items */ - while (Items2 > 0) - { - mii = (PROSMENUITEMINFO)Buf; - Buf += sizeof(ROSMENUITEMINFO); - if(mii->cch) - { - str = (LPWSTR)mii->dwTypeData; - } - else - str = NULL; - /* DbgPrint("Draw menu item %ws at (%d, %d, %d, %d)\n", str, mir->left, mir->top, mir->right, mir->bottom); */ - DrawMenuItem(hWnd, mnu, hDC, mii, str); - Items2--; - } - } - - HeapFree(hHeap, 0, hBuf); - } - return max(bottom - Rect->top, GetSystemMetrics(SM_CYMENU)); + if (NULL == Font) + { + Font = hMenuFont; + } + + if (NULL == Rect || ! MenuGetRosMenuInfo(&MenuInfo, Menu)) + { + return GetSystemMetrics(SM_CYMENU); + } + + DPRINT("(%x, %x, %p, %x, %x)\n", Wnd, DC, Rect, Menu, Font); + + FontOld = SelectObject(DC, Font); + + if (0 == MenuInfo.Height) + { + MenuMenuBarCalcSize(DC, Rect, &MenuInfo, Wnd); + } + + Rect->bottom = Rect->top + MenuInfo.Height; + + FillRect(DC, Rect, GetSysColorBrush(COLOR_MENU)); + + SelectObject(DC, GetSysColorPen(COLOR_3DFACE)); + MoveToEx(DC, Rect->left, Rect->bottom, NULL); + LineTo(DC, Rect->right, Rect->bottom); + + if (0 == MenuInfo.MenuItemCount) + { + SelectObject(DC, FontOld); + return GetSystemMetrics(SM_CYMENU); + } + + MenuInitRosMenuItemInfo(&ItemInfo); + for (i = 0; i < MenuInfo.MenuItemCount; i++) + { + if (MenuGetRosMenuItemInfo(MenuInfo.Self, i, &ItemInfo)) + { + MenuDrawMenuItem(Wnd, &MenuInfo, Wnd, DC, &ItemInfo, + MenuInfo.Height, TRUE, ODA_DRAWENTIRE); + } + } + MenuCleanupRosMenuItemInfo(&ItemInfo); + + SelectObject(DC, FontOld); + + return MenuInfo.Height; +} + + +/*********************************************************************** + * MenuDrawMenuBar + * + * Paint a menu bar. Returns the height of the menu bar. + * called from [windows/nonclient.c] + */ +UINT MenuDrawMenuBar(HDC DC, LPRECT Rect, HWND Wnd, BOOL SuppressDraw) +{ + ROSMENUINFO MenuInfo; + HFONT FontOld = NULL; + HMENU Menu = GetMenu(Wnd); + + if (NULL == Rect || ! MenuGetRosMenuInfo(&MenuInfo, Menu)) + { + return GetSystemMetrics(SM_CYMENU); + } + + if (SuppressDraw) + { + FontOld = SelectObject(DC, hMenuFont); + + if (0 == MenuInfo.Height) + { + MenuMenuBarCalcSize(DC, Rect, &MenuInfo, Wnd); + } + + Rect->bottom = Rect->top + MenuInfo.Height; + + if (NULL != FontOld) + { + SelectObject(DC, FontOld); + } + return MenuInfo.Height; + } + else + { + return DrawMenuBarTemp(Wnd, DC, Rect, Menu, NULL); + } } /*********************************************************************** @@ -1888,7 +1766,7 @@ MenuMoveSelection(HWND WndOwner, PROSMENUINFO MenuInfo, INT Offset) INT i; ROSMENUITEMINFO ItemInfo; - DPRINT("hwnd=%x menu=%x off=0x%04x\n", WndOwner, MenuInfo, Offset); + DPRINT("hwnd=%x menu=%x off=0x%04x\n", WndOwner, MenuInfo, offset); MenuInitRosMenuItemInfo(&ItemInfo); if (NO_SELECTED_ITEM != MenuInfo->FocusedItem) @@ -2340,16 +2218,12 @@ MenuPtMenu(HMENU Menu, POINT Pt) ROSMENUITEMINFO ItemInfo; HMENU Ret = NULL; INT Ht; - + if (! MenuGetRosMenuInfo(&MenuInfo, Menu)) { return NULL; } -// ScreenToClient(MenuInfo.Wnd, &Pt); - - DPRINT("MenuPtMenu X %d Y %d\n", Pt.x, Pt.y); - /* try subpopup first (if any) */ if (NO_SELECTED_ITEM != MenuInfo.FocusedItem) { @@ -2370,10 +2244,7 @@ MenuPtMenu(HMENU Menu, POINT Pt) /* check the current window (avoiding WM_HITTEST) */ Ht = DefWndNCHitTest(MenuInfo.Wnd, Pt); - - DPRINT("Hit test == %d\n", Ht); - - if (0 != (MenuInfo.Flags & MF_POPUP )) + if (0 != (MenuInfo.Flags & MF_POPUP)) { if (HTNOWHERE != Ht && HTERROR != Ht) { @@ -3004,7 +2875,6 @@ MenuTrackMenu(HMENU Menu, UINT Flags, INT x, INT y, Mt.CurrentMenu = Menu; Mt.TopMenu = Menu; Mt.OwnerWnd = Wnd; - Mt.Pt.x = x; Mt.Pt.y = y; @@ -3354,7 +3224,7 @@ MenuTrackMenu(HMENU Menu, UINT Flags, INT x, INT y, static BOOL FASTCALL MenuExitTracking(HWND Wnd) { - DPRINT("hwnd=%p\n", Wnd); + DPRINT("hwnd=%p\n", hWnd); SendMessageW(Wnd, WM_EXITMENULOOP, 0, 0); ShowCaret(0); @@ -3368,27 +3238,21 @@ MenuTrackMouseMenuBar(HWND Wnd, ULONG Ht, POINT Pt) HMENU Menu = (HTSYSMENU == Ht) ? NtUserGetSystemMenu(Wnd, FALSE) : GetMenu(Wnd); UINT Flags = TPM_ENTERIDLEEX | TPM_BUTTONDOWN | TPM_LEFTALIGN | TPM_LEFTBUTTON; - DPRINT("wnd=%p ht=0x%04x (%ld,%ld)\n", Wnd, Ht, Pt.x, Pt.y); + DPRINT("wnd=%p ht=0x%04x (%ld,%ld)\n", Wnd, Ht, pt.x, pt.y); if (IsMenu(Menu)) { - DPRINT("Is a menu\n"); /* map point to parent client coordinates */ HWND Parent = GetAncestor(Wnd, GA_PARENT ); -// if (Parent != GetDesktopWindow()) // this doesn't work? -// { - MapWindowPoints(Parent, Wnd, &Pt, 1); - Pt.y += (GetSystemMetrics(SM_CYCAPTION)-1) * 2; // is this ok? -// ScreenToClient(Wnd, &Pt); // wnd = parent - DPRINT("MapWindowPoints == %d %d\n", Pt.x, Pt.y); -// } -// else DPRINT("Is desktop window\n"); + if (Parent != GetDesktopWindow()) + { + ScreenToClient(Parent, &Pt); + } MenuInitTracking(Wnd, Menu, FALSE, Flags); MenuTrackMenu(Menu, Flags, Pt.x, Pt.y, Wnd, NULL); MenuExitTracking(Wnd); } - else DPRINT("Is NOT a menu\n"); } @@ -4404,23 +4268,6 @@ GetMenuContextHelpId(HMENU hmenu) return 0; } -/* - * @unimplemented - */ -DWORD -STDCALL -DrawMenuBarTemp( - HWND hwnd, - HDC hDC, - LPRECT lprect, - HMENU hMenu, - HFONT hFont - ) -{ - UNIMPLEMENTED; - return FALSE; -} - /* * @unimplemented */ diff --git a/reactos/lib/user32/windows/nonclient.c b/reactos/lib/user32/windows/nonclient.c index b9c90b6f9b6..8f47a7b4c01 100644 --- a/reactos/lib/user32/windows/nonclient.c +++ b/reactos/lib/user32/windows/nonclient.c @@ -433,7 +433,7 @@ DefWndNCPaint(HWND hWnd, HRGN hRgn) { TempRect = CurrentRect; TempRect.bottom = TempRect.top + (UINT)NtUserSetMenuBarHeight(menu, 0); - CurrentRect.top += MenuDrawMenuBar(hDC, &TempRect, hWnd, TRUE); + CurrentRect.top += MenuDrawMenuBar(hDC, &TempRect, hWnd, FALSE); } if (ExStyle & WS_EX_CLIENTEDGE) @@ -528,7 +528,7 @@ DefWndNCCalcSize(HWND hWnd, BOOL CalcSizeStruct, RECT *Rect) CliRect.right -= OrigRect.left; CliRect.left -= OrigRect.left; CliRect.top -= OrigRect.top; - menuheight = (ULONG)MenuDrawMenuBar(hDC, &CliRect, hWnd, FALSE); + menuheight = (ULONG)MenuDrawMenuBar(hDC, &CliRect, hWnd, TRUE); ReleaseDC(hWnd, hDC); Rect->top += max(menuheight, GetSystemMetrics(SM_CYMENU)); } diff --git a/reactos/subsys/win32k/ntuser/menu.c b/reactos/subsys/win32k/ntuser/menu.c index cd1a774e68a..7ddb4aeff23 100644 --- a/reactos/subsys/win32k/ntuser/menu.c +++ b/reactos/subsys/win32k/ntuser/menu.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: menu.c,v 1.50 2004/02/24 13:27:03 weiden Exp $ +/* $Id: menu.c,v 1.51 2004/03/09 14:03:18 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1671,25 +1671,23 @@ NtUserMenuItemFromPoint( PWINDOW_OBJECT WindowObject = NULL; PMENU_ITEM mi; int i; - + MenuObject = IntGetMenuObject(Menu); if (NULL == MenuObject) { SetLastWin32Error(ERROR_INVALID_MENU_HANDLE); return -1; } - if (0 != (MenuObject->MenuInfo.Flags & MF_POPUP)) + + WindowObject = IntGetWindowObject(MenuObject->MenuInfo.Wnd); + if (NULL == WindowObject) { - WindowObject = IntGetWindowObject(MenuObject->MenuInfo.Wnd); - if (NULL == WindowObject) - { - SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); - return -1; - } - X -= WindowObject->WindowRect.left; - Y -= WindowObject->WindowRect.top; - IntReleaseWindowObject(WindowObject); + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + return -1; } + X -= WindowObject->WindowRect.left; + Y -= WindowObject->WindowRect.top; + IntReleaseWindowObject(WindowObject); IntLockMenuItems(MenuObject); mi = MenuObject->MenuItemList; From bea52f9dbec19dda02f2dd3401e89c6a6cebc0c4 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Tue, 9 Mar 2004 14:16:39 +0000 Subject: [PATCH 0394/1463] - Minor correction to DMA routines. svn path=/trunk/; revision=8606 --- reactos/drivers/video/videoprt/videoprt.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index d0bd6364a06..7981bd02604 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.15 2004/03/08 20:54:10 navaraf Exp $ + * $Id: videoprt.c,v 1.16 2004/03/09 14:16:39 navaraf Exp $ */ #include "videoprt.h" @@ -1619,10 +1619,10 @@ VideoPortGetDmaAdapter ( IN PVOID HwDeviceExtension, DeviceDescription.Version = DEVICE_DESCRIPTION_VERSION; DeviceDescription.Master = TRUE /* ?? */; - DeviceDescription.ScatterGather = TRUE /* ?? */; + DeviceDescription.ScatterGather = VpDeviceExtension->ScatterGather; DeviceDescription.DemandMode = FALSE /* ?? */; DeviceDescription.AutoInitialize = FALSE /* ?? */; - DeviceDescription.Dma32BitAddresses = TRUE /* ?? */; + DeviceDescription.Dma32BitAddresses = VpDeviceExtension->Dma32BitAddresses; DeviceDescription.IgnoreCount = FALSE /* ?? */; DeviceDescription.Reserved1 = FALSE; DeviceDescription.BusNumber = DeviceExtension->SystemIoBusNumber; @@ -1630,7 +1630,7 @@ VideoPortGetDmaAdapter ( IN PVOID HwDeviceExtension, DeviceDescription.InterfaceType = DeviceExtension->AdapterInterfaceType; DeviceDescription.DmaWidth = Width8Bits; DeviceDescription.DmaSpeed = Compatible; - DeviceDescription.MaximumLength = 65536 /* ?? */; + DeviceDescription.MaximumLength = VpDeviceExtension->MaximumLength; DeviceDescription.DmaPort = 0; Adapter = From e380640f4457e8657dfbb96581f1b564f5d47b6e Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Tue, 9 Mar 2004 15:04:28 +0000 Subject: [PATCH 0395/1463] LogonUserW(): Fix key name. svn path=/trunk/; revision=8607 --- reactos/lib/advapi32/misc/logon.c | 78 +++++++++++++------------------ 1 file changed, 33 insertions(+), 45 deletions(-) diff --git a/reactos/lib/advapi32/misc/logon.c b/reactos/lib/advapi32/misc/logon.c index 853d12e0dba..83a12a97402 100644 --- a/reactos/lib/advapi32/misc/logon.c +++ b/reactos/lib/advapi32/misc/logon.c @@ -1,4 +1,4 @@ -/* $Id: logon.c,v 1.4 2004/02/25 14:25:10 ekohl Exp $ +/* $Id: logon.c,v 1.5 2004/03/09 15:04:28 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -7,13 +7,15 @@ * PROGRAMMER: Eric Kohl */ -#include <windows.h> - #define NTOS_MODE_USER #include <ntos.h> - +#include <windows.h> #include <string.h> +#define NDEBUG +#include <debug.h> + + /* FUNCTIONS ***************************************************************/ /* @@ -145,27 +147,25 @@ SamGetUserSid (LPCWSTR UserName, { PSID lpSid; DWORD dwLength; - HKEY hAccountKey; + HKEY hUsersKey; HKEY hUserKey; if (Sid != NULL) *Sid = NULL; - /* Open the Account key */ + /* Open the Users key */ if (RegOpenKeyExW (HKEY_LOCAL_MACHINE, - L"SAM\\SAM\\Domains\\Account", + L"SAM\\SAM\\Domains\\Account\\Users", 0, KEY_READ, - &hAccountKey)) + &hUsersKey)) { -//#if 0 -// DebugPrint ("Failed to open Account key! (Error %lu)\n", GetLastError()); -//#endif + DPRINT1 ("Failed to open Users key! (Error %lu)\n", GetLastError()); return FALSE; } /* Open the user key */ - if (RegOpenKeyExW (hAccountKey, + if (RegOpenKeyExW (hUsersKey, UserName, 0, KEY_READ, @@ -173,23 +173,19 @@ SamGetUserSid (LPCWSTR UserName, { if (GetLastError () == ERROR_FILE_NOT_FOUND) { -//#if 0 -// DebugPrint ("Invalid user name!\n"); -//#endif + DPRINT1 ("Invalid user name!\n"); SetLastError (ERROR_NO_SUCH_USER); } else { -//#if 0 -// DebugPrint ("Failed to open user key! (Error %lu)\n", GetLastError()); -//#endif + DPRINT1 ("Failed to open user key! (Error %lu)\n", GetLastError()); } - RegCloseKey (hAccountKey); + RegCloseKey (hUsersKey); return FALSE; } - RegCloseKey (hAccountKey); + RegCloseKey (hUsersKey); /* Get SID size */ dwLength = 0; @@ -200,26 +196,19 @@ SamGetUserSid (LPCWSTR UserName, NULL, &dwLength)) { -//#if 0 -// DebugPrint ("Failed to read the SID size! (Error %lu)\n", GetLastError()); -//#endif + DPRINT1 ("Failed to read the SID size! (Error %lu)\n", GetLastError()); RegCloseKey (hUserKey); return FALSE; } - /* FIXME: Allocate sid buffer */ -//#if 0 -// DebugPrint ("Required SID buffer size: %lu\n", dwLength); -//#endif - + /* Allocate sid buffer */ + DPRINT ("Required SID buffer size: %lu\n", dwLength); lpSid = (PSID)RtlAllocateHeap (RtlGetProcessHeap (), 0, dwLength); if (lpSid == NULL) { -//#if 0 -// DebugPrint ("Failed to allocate SID buffer!\n"); -//#endif + DPRINT1 ("Failed to allocate SID buffer!\n"); RegCloseKey (hUserKey); return FALSE; } @@ -232,9 +221,7 @@ SamGetUserSid (LPCWSTR UserName, (LPBYTE)lpSid, &dwLength)) { -//#if 0 -// DebugPrint ("Failed to read the SID! (Error %lu)\n", GetLastError()); -//#endif + DPRINT1 ("Failed to read the SID! (Error %lu)\n", GetLastError()); RtlFreeHeap (RtlGetProcessHeap (), 0, lpSid); @@ -300,17 +287,18 @@ LogonUserW (LPCWSTR lpszUsername, /* Get the user SID from the registry */ if (!SamGetUserSid (lpszUsername, &UserSid)) { - RtlAllocateAndInitializeSid (&SystemAuthority, - 5, - SECURITY_NT_NON_UNIQUE_RID, - 0x12345678, - 0x12345678, - 0x12345678, - DOMAIN_USER_RID_ADMIN, - SECURITY_NULL_RID, - SECURITY_NULL_RID, - SECURITY_NULL_RID, - &UserSid); + DPRINT ("SamGetUserSid() failed\n"); + RtlAllocateAndInitializeSid (&SystemAuthority, + 5, + SECURITY_NT_NON_UNIQUE_RID, + 0x12345678, + 0x12345678, + 0x12345678, + DOMAIN_USER_RID_ADMIN, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + &UserSid); } TokenUser.User.Sid = UserSid; From 282e78244f6794c19ab09aa94d92c88aa32c557c Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Tue, 9 Mar 2004 15:08:12 +0000 Subject: [PATCH 0396/1463] Create a logon token and use it to start the shell process. svn path=/trunk/; revision=8608 --- reactos/subsys/system/winlogon/winlogon.c | 131 +++++++++++++--------- 1 file changed, 80 insertions(+), 51 deletions(-) diff --git a/reactos/subsys/system/winlogon/winlogon.c b/reactos/subsys/system/winlogon/winlogon.c index 56a38935946..4eaab42a5b0 100644 --- a/reactos/subsys/system/winlogon/winlogon.c +++ b/reactos/subsys/system/winlogon/winlogon.c @@ -1,4 +1,4 @@ -/* $Id: winlogon.c,v 1.26 2004/01/20 23:40:19 gvg Exp $ +/* $Id: winlogon.c,v 1.27 2004/03/09 15:08:12 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -48,7 +48,8 @@ BOOL StartConsole = TRUE; /* FUNCTIONS *****************************************************************/ -static void PrintString (WCHAR* fmt,...) +static void +PrintString (WCHAR* fmt,...) { WCHAR buffer[512]; va_list ap; @@ -60,14 +61,12 @@ static void PrintString (WCHAR* fmt,...) OutputDebugString(buffer); } -BOOL -CALLBACK -ShutdownComputerProc( - HWND hwndDlg, - UINT uMsg, - WPARAM wParam, - LPARAM lParam -) + +BOOL CALLBACK +ShutdownComputerProc (HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) { switch(uMsg) { @@ -91,7 +90,8 @@ ShutdownComputerProc( return FALSE; } -static BOOLEAN StartServices(VOID) +static BOOLEAN +StartServices (VOID) { HANDLE ServicesInitEvent; BOOLEAN Result; @@ -161,7 +161,8 @@ static BOOLEAN StartServices(VOID) } #if START_LSASS -static BOOLEAN StartLsass(VOID) +static BOOLEAN +StartLsass (VOID) { HANDLE LsassInitEvent; BOOLEAN Result; @@ -212,7 +213,10 @@ static BOOLEAN StartLsass(VOID) return(TRUE); } #endif -static BOOLEAN OpenRegistryKey(HANDLE *WinLogonKey) + + +static BOOLEAN +OpenRegistryKey (HANDLE *WinLogonKey) { return ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\ReactOS\\Windows NT\\CurrentVersion\\WinLogon", @@ -221,6 +225,7 @@ static BOOLEAN OpenRegistryKey(HANDLE *WinLogonKey) WinLogonKey); } + static BOOLEAN StartProcess(PWCHAR ValueName) { BOOL StartIt; @@ -306,7 +311,9 @@ static BOOL StartIntoGUI(void) return FALSE; } -static PWCHAR GetShell(WCHAR *CommandLine) + +static PWCHAR +GetShell (WCHAR *CommandLine) { HANDLE WinLogonKey; BOOL GotCommandLine; @@ -348,47 +355,69 @@ static PWCHAR GetShell(WCHAR *CommandLine) return CommandLine; } -static BOOL DoLoginUser(PWCHAR Name, PWCHAR Password) + +static BOOL +DoLogonUser (PWCHAR Name, + PWCHAR Password) { - PROCESS_INFORMATION ProcessInformation; - STARTUPINFO StartupInfo; - BOOLEAN Result; - WCHAR CommandLine[MAX_PATH]; - WCHAR CurrentDirectory[MAX_PATH]; + PROCESS_INFORMATION ProcessInformation; + STARTUPINFO StartupInfo; + WCHAR CommandLine[MAX_PATH]; + WCHAR CurrentDirectory[MAX_PATH]; + HANDLE hToken; + BOOL Result; - GetWindowsDirectory(CurrentDirectory, MAX_PATH); + Result = LogonUserW (Name, + NULL, + Password, + LOGON32_LOGON_INTERACTIVE, + LOGON32_PROVIDER_DEFAULT, + &hToken); + if (!Result) + { + DbgPrint ("WL: LogonUserW failed\n"); + return FALSE; + } - StartupInfo.cb = sizeof(StartupInfo); - StartupInfo.lpReserved = NULL; - StartupInfo.lpDesktop = NULL; - StartupInfo.lpTitle = NULL; - StartupInfo.dwFlags = 0; - StartupInfo.cbReserved2 = 0; - StartupInfo.lpReserved2 = 0; - - Result = CreateProcess(NULL, - GetShell(CommandLine), - NULL, - NULL, - FALSE, - CREATE_NEW_CONSOLE, - NULL, - CurrentDirectory, - &StartupInfo, - &ProcessInformation); + GetWindowsDirectoryW(CurrentDirectory, MAX_PATH); + + StartupInfo.cb = sizeof(StartupInfo); + StartupInfo.lpReserved = NULL; + StartupInfo.lpDesktop = NULL; + StartupInfo.lpTitle = NULL; + StartupInfo.dwFlags = 0; + StartupInfo.cbReserved2 = 0; + StartupInfo.lpReserved2 = 0; + + Result = CreateProcessAsUserW (hToken, + NULL, + GetShell (CommandLine), + NULL, + NULL, + FALSE, + CREATE_NEW_CONSOLE, + NULL, + CurrentDirectory, + &StartupInfo, + &ProcessInformation); if (!Result) { - DbgPrint("WL: Failed to execute user shell %s\n", CommandLine); - return FALSE; + DbgPrint ("WL: Failed to execute user shell %s\n", CommandLine); + CloseHandle (hToken); + return FALSE; } - WaitForSingleObject(ProcessInformation.hProcess, INFINITE); - CloseHandle( ProcessInformation.hProcess ); - CloseHandle( ProcessInformation.hThread ); - return TRUE; + WaitForSingleObject (ProcessInformation.hProcess, INFINITE); + CloseHandle (ProcessInformation.hProcess); + CloseHandle (ProcessInformation.hThread); + + CloseHandle (hToken); + + return TRUE; } #endif + int STDCALL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, @@ -396,8 +425,8 @@ WinMain(HINSTANCE hInstance, int nShowCmd) { #if SUPPORT_CONSOLESTART - WCHAR LoginName[255]; - WCHAR Password[255]; +// WCHAR LoginName[255]; +// WCHAR Password[255]; #endif #if 0 LSA_STRING ProcessName, PackageName; @@ -494,11 +523,10 @@ WinMain(HINSTANCE hInstance, RunSetup (); NtShutdownSystem (ShutdownReboot); -// NtShutdownSystem (ShutdownNoReboot); ExitProcess (0); return 0; } - + #if SUPPORT_CONSOLESTART StartConsole = !StartIntoGUI(); if(!StartConsole) @@ -510,7 +538,7 @@ WinMain(HINSTANCE hInstance, ExitProcess(0); return(0); } - + /* FIXME - better solution needed */ hShutdownEvent = CreateEvent(NULL, TRUE, @@ -642,7 +670,8 @@ WinMain(HINSTANCE hInstance, #if SUPPORT_CONSOLESTART if(StartConsole) { - if (! DoLoginUser(LoginName, Password)) +// if (! DoLogonUser(LoginName, Password)) + if (! DoLogonUser(L"Administrator", L"Secret")) { } From b6ead4d81ad9fede90e4cccea98b55774174f1fa Mon Sep 17 00:00:00 2001 From: Aleksey Bragin <aleksey@reactos.org> Date: Tue, 9 Mar 2004 16:33:22 +0000 Subject: [PATCH 0397/1463] Added more processor defines to SYSINFO struct, by Christoph von Wittich. svn path=/trunk/; revision=8609 --- reactos/include/defines.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/reactos/include/defines.h b/reactos/include/defines.h index 3761890e9ca..ef24bf6cb24 100644 --- a/reactos/include/defines.h +++ b/reactos/include/defines.h @@ -4106,10 +4106,21 @@ extern "C" { #define SORT_KOREAN_UNICODE (1) /* SYSTEM_INFO structure */ +#define PROCESSOR_ARCHITECTURE_IA64 (6) +#define PROCESSOR_ARCHITECTURE_AMD64 (9) +#define PROCESSOR_ARCHITECTURE_IA64_ON_WIN64 (10) #define PROCESSOR_INTEL_386 (386) #define PROCESSOR_INTEL_486 (486) #define PROCESSOR_INTEL_PENTIUM (586) +#define PROCESSOR_INTEL_PENTIUMII (686) +#define PROCESSOR_INTEL_PENTIUMIII (786) +#define PROCESSOR_PPC_601 (601) +#define PROCESSOR_PPC_603 (603) +#define PROCESSOR_PPC_604 (604) +#define PROCESSOR_PPC_620 (620) +#define PROCESSOR_INTEL_IA64 (2200) #define PROCESSOR_MIPS_R4000 (4000) +#define PROCESSOR_AMD_X8664 (8664) #define PROCESSOR_ALPHA_21064 (21064) /* TAPE_GET_DRIVE_PARAMETERS structure */ From e4ac5bf4f40ff46254b412c24cbe6136b89fd360 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin <aleksey@reactos.org> Date: Tue, 9 Mar 2004 16:35:15 +0000 Subject: [PATCH 0398/1463] Added more (in case we run on PowerPC) processor ids returned by GetSystemInfo(), by Christoph von Wittich. svn path=/trunk/; revision=8610 --- reactos/lib/kernel32/misc/sysinfo.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/reactos/lib/kernel32/misc/sysinfo.c b/reactos/lib/kernel32/misc/sysinfo.c index 2a0d62b920d..ffd81dec71c 100644 --- a/reactos/lib/kernel32/misc/sysinfo.c +++ b/reactos/lib/kernel32/misc/sysinfo.c @@ -1,4 +1,4 @@ -/* $Id: sysinfo.c,v 1.10 2004/01/23 21:16:03 ekohl Exp $ +/* $Id: sysinfo.c,v 1.11 2004/03/09 16:35:15 fireball Exp $ * * reactos/lib/kernel32/misc/sysinfo.c * @@ -100,7 +100,29 @@ GetSystemInfo ( break; case PROCESSOR_ARCHITECTURE_PPC: - Si->dwProcessorType = -1; /* FIXME: what value? */ + switch (Spi.ProcessorLevel) + { + case 1: + Si->dwProcessorType = PROCESSOR_PPC_601; + break; + case 3: + Si->dwProcessorType = PROCESSOR_PPC_603; + break; + case 4: + Si->dwProcessorType = PROCESSOR_PPC_604; + break; + case 6: + Si->dwProcessorType = -1; /* FIXME: what value? */ + break; + case 9: + Si->dwProcessorType = -1; /* FIXME: what value? */ + break; + case 20: + Si->dwProcessorType = PROCESSOR_PPC_620; + break; + default: + Si->dwProcessorType = -1; + } break; } From daae8270b7f71850cab99cbbb5432bce1d48b8b0 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Tue, 9 Mar 2004 17:28:49 +0000 Subject: [PATCH 0399/1463] - Implemented VideoPortQueryPerformanceCounter and all video port spinlock functions. - Added more debug info to VideoPortGetAccessRanges. svn path=/trunk/; revision=8611 --- reactos/drivers/video/videoprt/Makefile | 5 +- reactos/drivers/video/videoprt/spinlock.c | 109 ++++++++++++++++++++ reactos/drivers/video/videoprt/videoprt.c | 63 +++++------ reactos/drivers/video/videoprt/videoprt.edf | 42 +++++++- 4 files changed, 181 insertions(+), 38 deletions(-) create mode 100644 reactos/drivers/video/videoprt/spinlock.c diff --git a/reactos/drivers/video/videoprt/Makefile b/reactos/drivers/video/videoprt/Makefile index 01f031c07a3..a7bbc0a056e 100644 --- a/reactos/drivers/video/videoprt/Makefile +++ b/reactos/drivers/video/videoprt/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.2 2004/03/04 18:51:58 navaraf Exp $ +# $Id: Makefile,v 1.3 2004/03/09 17:28:49 navaraf Exp $ PATH_TO_TOP = ../../.. @@ -12,7 +12,8 @@ TARGET_OBJECTS = \ int10.o \ interrupt.o \ videoprt.o \ - services.o + services.o \ + spinlock.o include $(PATH_TO_TOP)/rules.mak diff --git a/reactos/drivers/video/videoprt/spinlock.c b/reactos/drivers/video/videoprt/spinlock.c new file mode 100644 index 00000000000..3aa4721d37f --- /dev/null +++ b/reactos/drivers/video/videoprt/spinlock.c @@ -0,0 +1,109 @@ +/* + * VideoPort driver + * + * Copyright (C) 2002, 2003, 2004 ReactOS Team + * + * 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; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Id: spinlock.c,v 1.1 2004/03/09 17:28:49 navaraf Exp $ + */ + +#include "videoprt.h" + +/* + * @implemented + */ + +VP_STATUS STDCALL +VideoPortCreateSpinLock( + IN PVOID HwDeviceExtension, + OUT PSPIN_LOCK *SpinLock) +{ + DPRINT("VideoPortCreateSpinLock\n"); + *SpinLock = ExAllocatePool(NonPagedPool, sizeof(KSPIN_LOCK)); + if (*SpinLock == NULL) + return STATUS_UNSUCCESSFUL; + KeInitializeSpinLock((PKSPIN_LOCK)*SpinLock); + return STATUS_SUCCESS; +} + +/* + * @implemented + */ + +VP_STATUS STDCALL +VideoPortDeleteSpinLock( + IN PVOID HwDeviceExtension, + IN PSPIN_LOCK SpinLock) +{ + DPRINT("VideoPortDeleteSpinLock\n"); + ExFreePool(SpinLock); + return STATUS_SUCCESS; +} + +/* + * @implemented + */ + +VOID STDCALL +VideoPortAcquireSpinLock( + IN PVOID HwDeviceExtension, + IN PSPIN_LOCK SpinLock, + OUT PUCHAR OldIrql) +{ + DPRINT("VideoPortAcquireSpinLock\n"); + KeAcquireSpinLock((PKSPIN_LOCK)SpinLock, OldIrql); +} + +/* + * @implemented + */ + +VOID STDCALL +VideoPortAcquireSpinLockAtDpcLevel( + IN PVOID HwDeviceExtension, + IN PSPIN_LOCK SpinLock) +{ + DPRINT("VideoPortAcquireSpinLockAtDpcLevel\n"); + KefAcquireSpinLockAtDpcLevel((PKSPIN_LOCK)SpinLock); +} + +/* + * @implemented + */ + +VOID STDCALL +VideoPortReleaseSpinLock( + IN PVOID HwDeviceExtension, + IN PSPIN_LOCK SpinLock, + IN UCHAR NewIrql) +{ + DPRINT("VideoPortReleaseSpinLock\n"); + KeReleaseSpinLock((PKSPIN_LOCK)SpinLock, NewIrql); +} + +/* + * @implemented + */ + +VOID STDCALL +VideoPortReleaseSpinLockFromDpcLevel( + IN PVOID HwDeviceExtension, + IN PSPIN_LOCK SpinLock) +{ + DPRINT("VideoPortReleaseSpinLockFromDpcLevel\n"); + KefReleaseSpinLockFromDpcLevel((PKSPIN_LOCK)SpinLock); +} diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index 7981bd02604..aa77e78be73 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.16 2004/03/09 14:16:39 navaraf Exp $ + * $Id: videoprt.c,v 1.17 2004/03/09 17:28:49 navaraf Exp $ */ #include "videoprt.h" @@ -211,26 +211,10 @@ VideoPortGetAccessRanges(IN PVOID HwDeviceExtension, PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; USHORT VendorIdToFind; USHORT DeviceIdToFind; + ULONG SlotIdToFind; DPRINT("VideoPortGetAccessRanges\n"); - if (VendorId != NULL) - { - VendorIdToFind = *(PUSHORT)VendorId; - } - else - { - VendorIdToFind = 0; - } - if (DeviceId != NULL) - { - DeviceIdToFind = *(PUSHORT)DeviceId; - } - else - { - DeviceIdToFind = 0; - } - DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, VIDEO_PORT_DEVICE_EXTENSION, MiniPortDeviceExtension); @@ -238,10 +222,14 @@ VideoPortGetAccessRanges(IN PVOID HwDeviceExtension, if (0 == NumRequestedResources && PCIBus == DeviceExtension->AdapterInterfaceType) { - DPRINT("Looking for VendorId 0x%04x DeviceId 0x%04x\n", - VendorIdToFind, DeviceIdToFind); + VendorIdToFind = VendorId != NULL ? *(PUSHORT)VendorId : 0; + DeviceIdToFind = DeviceId != NULL ? *(PUSHORT)DeviceId : 0; + SlotIdToFind = Slot != NULL ? *Slot : 0; - PciSlotNumber.u.AsULONG = *Slot; + DPRINT("Looking for VendorId 0x%04x DeviceId 0x%04x SlotId 0x%04x\n", + VendorIdToFind, DeviceIdToFind, SlotIdToFind); + + PciSlotNumber.u.AsULONG = SlotIdToFind; /* Search for the device id and vendor id on this bus. @@ -249,23 +237,23 @@ VideoPortGetAccessRanges(IN PVOID HwDeviceExtension, for (FunctionNumber = 0; FunctionNumber < 8; FunctionNumber++) { ULONG ReturnedLength; + DPRINT("- Function number: %d\n", FunctionNumber); PciSlotNumber.u.bits.FunctionNumber = FunctionNumber; ReturnedLength = HalGetBusData(PCIConfiguration, DeviceExtension->SystemIoBusNumber, PciSlotNumber.u.AsULONG, &Config, sizeof(PCI_COMMON_CONFIG)); - if (sizeof(PCI_COMMON_CONFIG) == ReturnedLength) + DPRINT("- Length of data: %x\n", ReturnedLength); + if (sizeof(PCI_COMMON_CONFIG) == ReturnedLength) { - if (DeviceId != NULL && VendorId != NULL) - { - DPRINT("Slot 0x%02x (Device %d Function %d) VendorId 0x%04x " - "DeviceId 0x%04x\n", - PciSlotNumber.u.AsULONG, - PciSlotNumber.u.bits.DeviceNumber, - PciSlotNumber.u.bits.FunctionNumber, Config.VendorID, - Config.DeviceID); - } + DPRINT("- Slot 0x%02x (Device %d Function %d) VendorId 0x%04x " + "DeviceId 0x%04x\n", + PciSlotNumber.u.AsULONG, + PciSlotNumber.u.bits.DeviceNumber, + PciSlotNumber.u.bits.FunctionNumber, + Config.VendorID, + Config.DeviceID); if ((VendorIdToFind == 0 || Config.VendorID == VendorIdToFind) && (DeviceIdToFind == 0 || Config.DeviceID == DeviceIdToFind)) @@ -1857,3 +1845,16 @@ VideoPortGetProcAddress(IN PVOID HwDeviceExtension, DPRINT("VideoPortGetProcAddress: Can't resolve symbol %s\n", FunctionName); return(NULL); } + +LONGLONG STDCALL +VideoPortQueryPerformanceCounter( + IN PVOID HwDeviceExtension, + OUT PLONGLONG PerformanceFrequency OPTIONAL) +{ + LARGE_INTEGER Result; + + DPRINT("VideoPortQueryPerformanceCounter\n"); + Result = KeQueryPerformanceCounter((PLARGE_INTEGER)PerformanceFrequency); + return Result.QuadPart; +} + diff --git a/reactos/drivers/video/videoprt/videoprt.edf b/reactos/drivers/video/videoprt/videoprt.edf index bce89b97afb..5aedc3bfd61 100644 --- a/reactos/drivers/video/videoprt/videoprt.edf +++ b/reactos/drivers/video/videoprt/videoprt.edf @@ -1,45 +1,66 @@ -; $Id: videoprt.edf,v 1.7 2004/03/08 20:27:33 dwelch Exp $ +; $Id: videoprt.edf,v 1.8 2004/03/09 17:28:49 navaraf Exp $ ; -; vidport.def - export definition file for ReactOS +; videoprt.def - export definition file for ReactOS ; EXPORTS +;VideoPortAcquireDeviceLock +VideoPortAcquireSpinLock=VideoPortAcquireSpinLock@12 +VideoPortAcquireSpinLockAtDpcLevel=VideoPortAcquireSpinLockAtDpcLevel@8 VideoPortAllocateBuffer=VideoPortAllocateBuffer@12 VideoPortAllocateCommonBuffer=VideoPortAllocateCommonBuffer@24 +;VideoPortAllocateContiguousMemory VideoPortAllocatePool=VideoPortAllocatePool@16 +;VideoPortAssociateEventsWithDmaHandle VideoPortCheckForDeviceExistence=VideoPortCheckForDeviceExistence@28 -VideoPortCompareMemory=NTOSKRNL.RtlCompareMemory VideoPortClearEvent=VideoPortClearEvent@8 +VideoPortCompareMemory=NTOSKRNL.RtlCompareMemory +;VideoPortCompleteDma VideoPortCreateEvent=VideoPortCreateEvent@16 VideoPortCreateSecondaryDisplay=VideoPortCreateSecondaryDisplay@12 +VideoPortCreateSpinLock=VideoPortCreateSpinLock@8 VideoPortDDCMonitorHelper=VideoPortDDCMonitorHelper@16 VideoPortDebugPrint VideoPortDeleteEvent=VideoPortDeleteEvent@8 +VideoPortDeleteSpinLock=VideoPortDeleteSpinLock@8 VideoPortDisableInterrupt=VideoPortDisableInterrupt@4 +;VideoPortDoDma VideoPortEnableInterrupt=VideoPortEnableInterrupt@4 VideoPortEnumerateChildren=VideoPortEnumerateChildren@8 +;VideoPortFlushRegistry +;VideoPortFreeCommonBuffer VideoPortFreeDeviceBase=VideoPortFreeDeviceBase@8 VideoPortFreePool=VideoPortFreePool@8 -VideoPortGetBusData=VideoPortGetBusData@24 +VideoPortGetAccessRanges=VideoPortGetAccessRanges@32 VideoPortGetAgpServices=VideoPortGetAgpServices@8 VideoPortGetAssociatedDeviceExtension=VideoPortGetAssociatedDeviceExtension@4 +;VideoPortGetAssociatedDeviceID +VideoPortGetBusData=VideoPortGetBusData@24 +;VideoPortGetBytesUsed +;VideoPortGetCommonBuffer VideoPortGetCurrentIrql=VideoPortGetCurrentIrql@0 VideoPortGetDeviceBase=VideoPortGetDeviceBase@20 VideoPortGetDeviceData=VideoPortGetDeviceData@16 VideoPortGetDmaAdapter=VideoPortGetDmaAdapter@8 -VideoPortGetAccessRanges=VideoPortGetAccessRanges@32 +;VideoPortGetDmaContext +;VideoPortGetMdl VideoPortGetRegistryParameters=VideoPortGetRegistryParameters@20 VideoPortGetRomImage=VideoPortGetRomImage@16 VideoPortGetVersion=VideoPortGetVersion@8 VideoPortGetVgaStatus=VideoPortGetVgaStatus@8 VideoPortInitialize=VideoPortInitialize@16 VideoPortInt10=VideoPortInt10@8 +VideoPortInterlockedDecrement=NTOSKRNL.InterlockedDecrement VideoPortInterlockedExchange=NTOSKRNL.InterlockedExchange +VideoPortInterlockedIncrement=NTOSKRNL.InterlockedIncrement VideoPortLockBuffer=VideoPortLockBuffer@16 +;VideoPortLockPages VideoPortLogError=VideoPortLogError@16 VideoPortMapBankedMemory=VideoPortMapBankedMemory@40 +;VideoPortMapDmaMemory VideoPortMapMemory=VideoPortMapMemory@24 VideoPortMoveMemory=NTOSKRNL.RtlMoveMemory VideoPortPutDmaAdapter=VideoPortPutDmaAdapter@8 +VideoPortQueryPerformanceCounter=VideoPortQueryPerformanceCounter@8 VideoPortQueryServices=VideoPortQueryServices@12 VideoPortQuerySystemTime=NTOSKRNL.KeQuerySystemTime VideoPortQueueDpc=VideoPortQueueDpc@12 @@ -55,19 +76,29 @@ VideoPortReadRegisterUlong=NTOSKRNL.READ_REGISTER_ULONG VideoPortReadRegisterBufferUchar=NTOSKRNL.READ_REGISTER_BUFFER_UCHAR VideoPortReadRegisterBufferUshort=NTOSKRNL.READ_REGISTER_BUFFER_USHORT VideoPortReadRegisterBufferUlong=NTOSKRNL.READ_REGISTER_BUFFER_ULONG +;VideoPortReadStateEvent VideoPortRegisterBugcheckCallBack=VideoPortRegisterBugcheckCallback@16 VideoPortReleaseBuffer=VideoPortReleaseBuffer@8 VideoPortReleaseCommonBuffer=VideoPortReleaseCommonBuffer@28 +;VideoPortReleaseDeviceLock +VideoPortReleaseSpinLock@12 +VideoPortReleaseSpinLockFromDpcLevel@8 VideoPortScanRom=VideoPortScanRom@16 VideoPortSetBusData=VideoPortSetBusData@24 +;VideoPortSetBytesUsed +;VideoPortSetDmaContext VideoPortSetEvent=VideoPortSetEvent@8 VideoPortSetRegistryParameters=VideoPortSetRegistryParameters@16 VideoPortSetTrappedEmulatorPorts=VideoPortSetTrappedEmulatorPorts@12 +;VideoPortSignalDmaComplete VideoPortStallExecution=HAL.KeStallExecutionProcessor +;VideoPortStartDma VideoPortStartTimer=VideoPortStartTimer@4 VideoPortStopTimer=VideoPortStopTimer@4 VideoPortSynchronizeExecution=VideoPortSynchronizeExecution@16 VideoPortUnlockBuffer=VideoPortUnlockBuffer@8 +;VideoPortUnlockPages +;VideoPortUnmapDmaMemory VideoPortUnmapMemory=VideoPortUnmapMemory@12 VideoPortVerifyAccessRanges=VideoPortVerifyAccessRanges@12 VideoPortWaitForSingleObject=VideoPortWaitForSingleObject@12 @@ -85,3 +116,4 @@ VideoPortWriteRegisterBufferUshort=NTOSKRNL.WRITE_REGISTER_BUFFER_USHORT VideoPortWriteRegisterBufferUlong=NTOSKRNL.WRITE_REGISTER_BUFFER_ULONG VideoPortZeroMemory=NTOSKRNL.RtlZeroMemory VideoPortZeroDeviceMemory=NTOSKRNL.RtlZeroMemory +;VpNotifyEaData From 9c45d9475e67e11364a5d3ef06c2ece68bd29e71 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Tue, 9 Mar 2004 18:56:32 +0000 Subject: [PATCH 0400/1463] - Uncomment NDEBUG. svn path=/trunk/; revision=8612 --- reactos/drivers/video/videoprt/videoprt.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/video/videoprt/videoprt.h b/reactos/drivers/video/videoprt/videoprt.h index 4d358afacc6..a25d544a702 100644 --- a/reactos/drivers/video/videoprt/videoprt.h +++ b/reactos/drivers/video/videoprt/videoprt.h @@ -18,7 +18,7 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: videoprt.h,v 1.5 2004/03/08 08:05:26 navaraf Exp $ + * $Id: videoprt.h,v 1.6 2004/03/09 18:56:32 navaraf Exp $ */ #ifndef VIDEOPRT_H @@ -28,7 +28,7 @@ #include <ddk/video.h> #include <ddk/ntddvdeo.h> #include "internal/ps.h" -/* #define NDEBUG */ +#define NDEBUG #include <debug.h> /* From 860bde3b68a9de50b9bb613489efa50dadc6a26d Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Tue, 9 Mar 2004 20:34:28 +0000 Subject: [PATCH 0401/1463] - Disabled double lock message in NDEBUG builds since it is triggered whenever there is contention for the same object. svn path=/trunk/; revision=8613 --- reactos/subsys/win32k/objects/gdiobj.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/objects/gdiobj.c b/reactos/subsys/win32k/objects/gdiobj.c index 8e9f2824dbf..4e257ece3c6 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.61 2004/02/28 21:16:55 weiden Exp $ + * $Id: gdiobj.c,v 1.62 2004/03/09 20:34:28 dwelch Exp $ * */ @@ -745,6 +745,9 @@ GDIOBJ_LockObjDbg (const char* file, int line, HGDIOBJ hObj, DWORD ObjectType) return NULL; } +#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); @@ -756,6 +759,7 @@ GDIOBJ_LockObjDbg (const char* file, int line, HGDIOBJ hObj, DWORD ObjectType) ExAcquireFastMutex(&ObjHdr->Lock); DPRINT1(" Disregard previous message about object 0x%x, it's ok\n", hObj); } +#endif /* NDEBUG */ ExAcquireFastMutex(&RefCountHandling); ObjHdr->dwCount++; From e04ce16d15fbc6d9cd77143dfec6db92b3086f93 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Tue, 9 Mar 2004 21:21:39 +0000 Subject: [PATCH 0402/1463] - Fixed check for an out of range index in {Get/Set}{Class/Window}Long (signed vs. unsigned arithmetic). Fixes crash in 'user32_test win'. svn path=/trunk/; revision=8614 --- reactos/subsys/win32k/ntuser/class.c | 6 +++--- reactos/subsys/win32k/ntuser/window.c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/class.c b/reactos/subsys/win32k/ntuser/class.c index e64f891d0ae..4420c6ded7a 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.48 2004/02/24 13:27:03 weiden Exp $ +/* $Id: class.c,v 1.49 2004/03/09 21:21:39 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -433,7 +433,7 @@ IntGetClassLong(struct _WINDOW_OBJECT *WindowObject, ULONG Offset, BOOL Ansi) if ((int)Offset >= 0) { DPRINT("GetClassLong(%x, %d)\n", WindowObject->Self, Offset); - if (Offset > WindowObject->Class->cbClsExtra - sizeof(LONG)) + if ((Offset + sizeof(LONG)) > WindowObject->Class->cbClsExtra) { SetLastWin32Error(ERROR_INVALID_PARAMETER); return 0; @@ -514,7 +514,7 @@ IntSetClassLong(PWINDOW_OBJECT WindowObject, ULONG Offset, LONG dwNewLong, BOOL if ((int)Offset >= 0) { DPRINT("SetClassLong(%x, %d, %x)\n", WindowObject->Self, Offset, dwNewLong); - if (Offset > WindowObject->Class->cbClsExtra - sizeof(LONG)) + if ((Offset + sizeof(LONG)) > WindowObject->Class->cbClsExtra) { SetLastWin32Error(ERROR_INVALID_PARAMETER); return; diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index af5f1e1cf07..931a7cc18b6 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.197 2004/02/27 22:21:32 weiden Exp $ +/* $Id: window.c,v 1.198 2004/03/09 21:21:39 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -2674,7 +2674,7 @@ NtUserGetWindowLong(HWND hWnd, DWORD Index, BOOL Ansi) if ((INT)Index >= 0) { - if (Index > WindowObject->ExtraDataSize - sizeof(LONG)) + if ((Index + sizeof(LONG)) > WindowObject->ExtraDataSize) { SetLastWin32Error(ERROR_INVALID_PARAMETER); return 0; @@ -2774,7 +2774,7 @@ NtUserSetWindowLong(HWND hWnd, DWORD Index, LONG NewValue, BOOL Ansi) if ((INT)Index >= 0) { - if (Index > WindowObject->ExtraDataSize - sizeof(LONG)) + if ((Index + sizeof(LONG)) > WindowObject->ExtraDataSize) { SetLastWin32Error(ERROR_INVALID_PARAMETER); IntReleaseWindowObject(WindowObject); From 1fbda72a7a85889e4c996dd938e8e19a5d473949 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Tue, 9 Mar 2004 21:49:54 +0000 Subject: [PATCH 0403/1463] - Replaced some common sequences of inline assembly with macros. Avoid having compiler checks scattered all over the place. - Added some disabled code to KiDumpTrapFrame that dumps every address on the stack that could be a return address. This is quite handy for debugging crashes in modules compiled with fpo. svn path=/trunk/; revision=8615 --- reactos/ntoskrnl/ex/power.c | 8 +- reactos/ntoskrnl/include/internal/i386/ke.h | 24 ++++++ reactos/ntoskrnl/ke/bug.c | 81 +++------------------ reactos/ntoskrnl/ke/i386/exp.c | 45 +++++++----- reactos/ntoskrnl/ke/i386/irq.c | 22 ++---- reactos/ntoskrnl/ke/i386/kernel.c | 9 +-- reactos/ntoskrnl/ke/i386/tss.c | 18 +---- reactos/ntoskrnl/ke/process.c | 24 +----- reactos/ntoskrnl/mm/i386/page.c | 12 +-- reactos/ntoskrnl/ps/idle.c | 8 +- 10 files changed, 79 insertions(+), 172 deletions(-) diff --git a/reactos/ntoskrnl/ex/power.c b/reactos/ntoskrnl/ex/power.c index 85620e96fda..9892eca9ebc 100644 --- a/reactos/ntoskrnl/ex/power.c +++ b/reactos/ntoskrnl/ex/power.c @@ -53,13 +53,7 @@ NtShutdownSystem(IN SHUTDOWN_ACTION Action) #else PopSetSystemPowerState(PowerSystemShutdown); -#if defined(__GNUC__) - __asm__("cli\n"); -#elif defined(_MSC_VER) - __asm cli -#else -#error Unknown compiler for inline assembler -#endif + Ke386DisableInterrupts(); while (TRUE) { diff --git a/reactos/ntoskrnl/include/internal/i386/ke.h b/reactos/ntoskrnl/include/internal/i386/ke.h index 02f8f36504c..a796cd07380 100644 --- a/reactos/ntoskrnl/include/internal/i386/ke.h +++ b/reactos/ntoskrnl/include/internal/i386/ke.h @@ -135,6 +135,30 @@ VOID KeFreeGdtSelector(ULONG Entry); VOID NtEarlyInitVdm(VOID); +#if defined(__GNUC__) +#define Ke386DisableInterrupts() __asm__("cli\n\t"); +#define Ke386EnableInterrupts() __asm__("sti\n\t"); +#define Ke386HaltProcessor() __asm__("hlt\n\t"); +#define Ke386GetPageTableDirectory(X) \ + __asm__("movl %%cr3,%0\n\t" : "=d" (X)); +#define Ke386SetPageTableDirectory(X) \ + __asm__("movl %0,%%cr3\n\t" \ + : /* no outputs */ \ + : "r" (X)); +#elif defined(_MSC_VER) +#define Ke386DisableInterrupts() __asm cli +#define Ke386EnableInterrupts() __asm sti +#define Ke386HaltProcessor() __asm hlt +#define Ke386GetPageTableDirectory(X) \ + __asm mov eax, cr3; \ + __asm mov X, eax; +#define Ke386GetPageTableDirectory(X) \ + __asm mov eax, X; \ + __asm mov cr3, eax; +#else +#error Unknown compiler for inline assembler +#endif + #endif /* __ASM__ */ #endif /* __NTOSKRNL_INCLUDE_INTERNAL_I386_KE_H */ diff --git a/reactos/ntoskrnl/ke/bug.c b/reactos/ntoskrnl/ke/bug.c index c7dc5c22a86..c9ff4a6f550 100644 --- a/reactos/ntoskrnl/ke/bug.c +++ b/reactos/ntoskrnl/ke/bug.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: bug.c,v 1.42 2004/03/06 22:24:13 dwelch Exp $ +/* $Id: bug.c,v 1.43 2004/03/09 21:49:53 dwelch Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/bug.c @@ -103,13 +103,7 @@ KeBugCheckWithTf(ULONG BugCheckCode, KdDebugState |= KD_DEBUG_SCREEN; } -#if defined(__GNUC__) - __asm__("cli\n\t"); -#elif defined(_MSC_VER) - __asm cli -#else -#error Unknown compiler for inline assembler -#endif + Ke386DisableInterrupts(); if (KeGetCurrentIrql() < DISPATCH_LEVEL) { @@ -142,16 +136,7 @@ KeBugCheckWithTf(ULONG BugCheckCode, if (InBugCheck == 1) { DbgPrint("Recursive bug check halting now\n"); - for (;;) - { -#if defined(__GNUC__) - __asm__("hlt\n\t"); -#elif defined(_MSC_VER) - __asm hlt -#else -#error Unknown compiler for inline assembler -#endif - } + Ke386HaltProcessor(); } InBugCheck = 1; KiDumpTrapFrame(Tf, BugCheckParameter1, BugCheckParameter2); @@ -161,28 +146,14 @@ KeBugCheckWithTf(ULONG BugCheckCode, if (KdDebuggerEnabled) { -#if defined(__GNUC__) - __asm__("sti\n\t"); + Ke386EnableInterrupts(); DbgBreakPointNoBugCheck(); - __asm__("cli\n\t"); -#elif defined(_MSC_VER) - __asm sti - DbgBreakPointNoBugCheck(); - __asm cli -#else -#error Unknown compiler for inline assembler -#endif + Ke386DisableInterrupts(); } for (;;) { -#if defined(__GNUC__) - __asm__("hlt\n\t"); -#elif defined(_MSC_VER) - __asm hlt -#else -#error Unknown compiler for inline assembler -#endif + Ke386HaltProcessor(); } } @@ -215,13 +186,8 @@ KeBugCheckEx(ULONG BugCheckCode, KdDebugState |= KD_DEBUG_SCREEN; } -#if defined(__GNUC__) - __asm__("cli\n\t"); -#elif defined(_MSC_VER) - __asm cli -#else -#error Unknown compiler for inline assembler -#endif + Ke386DisableInterrupts(); + if (KeGetCurrentIrql() < DISPATCH_LEVEL) { KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); @@ -253,16 +219,7 @@ KeBugCheckEx(ULONG BugCheckCode, if (InBugCheck == 1) { DbgPrint("Recursive bug check halting now\n"); - for (;;) - { -#if defined(__GNUC__) - __asm__("hlt\n\t"); -#elif defined(_MSC_VER) - __asm hlt -#else -#error Unknown compiler for inline assembler -#endif - } + Ke386HaltProcessor(); } InBugCheck = 1; if (PsGetCurrentProcess() != NULL) @@ -291,28 +248,14 @@ KeBugCheckEx(ULONG BugCheckCode, if (KdDebuggerEnabled) { -#if defined(__GNUC__) - __asm__("sti\n\t"); + Ke386EnableInterrupts(); DbgBreakPointNoBugCheck(); - __asm__("cli\n\t"); -#elif defined(_MSC_VER) - __asm sti - DbgBreakPointNoBugCheck(); - __asm cli -#else -#error Unknown compiler for inline assembler -#endif + Ke386DisableInterrupts(); } for (;;) { -#if defined(__GNUC__) - __asm__("hlt\n\t"); -#elif defined(_MSC_VER) - __asm hlt -#else -#error Unknown compiler for inline assembler -#endif + Ke386HaltProcessor(); } } diff --git a/reactos/ntoskrnl/ke/i386/exp.c b/reactos/ntoskrnl/ke/i386/exp.c index 5ce3880ce5f..6de7ec9b6d0 100644 --- a/reactos/ntoskrnl/ke/i386/exp.c +++ b/reactos/ntoskrnl/ke/i386/exp.c @@ -318,6 +318,7 @@ KiDoubleFaultHandler(VOID) StackBase = (ULONG)&init_stack; } + /* Change to an #if 0 if no frames are printed because of fpo. */ #if 1 DbgPrint("Frames: "); Frame = (PULONG)OldTss->Ebp; @@ -442,14 +443,7 @@ KiDumpTrapFrame(PKTRAP_FRAME Tf, ULONG Parameter1, ULONG Parameter2) Tf->Cs&0xffff, Tf->Eip); print_address((PVOID)Tf->Eip); DbgPrint("\n"); -#if defined(__GNUC__) - __asm__("movl %%cr3,%0\n\t" : "=d" (cr3_)); -#elif defined(_MSC_VER) - __asm mov eax, cr3; - __asm mov cr3_, eax; -#else -#error Unknown compiler for inline assembler -#endif + Ke386GetPageTableDirectory(cr3_); DbgPrint("cr2 %x cr3 %x ", cr2, cr3_); DbgPrint("Proc: %x ",PsGetCurrentProcess()); if (PsGetCurrentProcess() != NULL) @@ -494,6 +488,7 @@ KiDumpTrapFrame(PKTRAP_FRAME Tf, ULONG Parameter1, ULONG Parameter2) * Dump the stack frames */ DbgPrint("Frames: "); +#if 0 i = 1; Frame = (PULONG)Tf->Ebp; while (Frame != NULL) @@ -506,7 +501,11 @@ KiDumpTrapFrame(PKTRAP_FRAME Tf, ULONG Parameter1, ULONG Parameter2) DbgPrint("<INVALID>"); break; } - print_address(Eip); + if (!print_address(Eip)) + { + DbgPrint("<%X>", Eip); + break; + } Status = MmSafeCopyFromUser(&Frame, Frame, sizeof(Frame)); if (!NT_SUCCESS(Status)) { @@ -515,6 +514,19 @@ KiDumpTrapFrame(PKTRAP_FRAME Tf, ULONG Parameter1, ULONG Parameter2) i++; DbgPrint(" "); } +#else + i = 1; + Frame = (PULONG)((ULONG_PTR)Esp0 + KTRAP_FRAME_EFLAGS); + while (Frame < (PULONG)PsGetCurrentThread()->Tcb.StackBase && i < 50) + { + ULONG Address = *Frame; + if (print_address((PVOID)Address)) + { + i++; + } + Frame++; + } +#endif } ULONG @@ -573,13 +585,7 @@ KiTrapHandler(PKTRAP_FRAME Tf, ULONG ExceptionNr) { if (Tf->Eflags & FLAG_IF) { -#if defined(__GNUC__) - __asm__("sti\n\t"); -#elif defined(_MSC_VER) - __asm sti -#else -#error Unknown compiler for inline assembler -#endif + Ke386EnableInterrupts(); } Status = MmPageFault(Tf->Cs&0xffff, &Tf->Eip, @@ -626,10 +632,13 @@ KeDumpStackFrames(PULONG Frame) i = 1; while (Frame != NULL) { - print_address((PVOID)Frame[1]); + if (!print_address((PVOID)Frame[1])) + { + DbgPrint("<%X>", (PVOID)Frame[1]); + } Frame = (PULONG)Frame[0]; i++; - DbgPrint("\n"); + DbgPrint(" "); } } diff --git a/reactos/ntoskrnl/ke/i386/irq.c b/reactos/ntoskrnl/ke/i386/irq.c index f05dd349ba3..adcf14de105 100644 --- a/reactos/ntoskrnl/ke/i386/irq.c +++ b/reactos/ntoskrnl/ke/i386/irq.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: irq.c,v 1.40 2004/01/18 22:58:10 gdalsnes Exp $ +/* $Id: irq.c,v 1.41 2004/03/09 21:49:53 dwelch Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/i386/irq.c @@ -391,7 +391,7 @@ KiInterruptDispatch (ULONG Vector, PKIRQ_TRAPFRAME Trapframe) * Enable interrupts * NOTE: Only higher priority interrupts will get through */ - __asm__("sti\n\t"); + Ke386EnableInterrupts(); /* * Actually call the ISR. @@ -401,7 +401,7 @@ KiInterruptDispatch (ULONG Vector, PKIRQ_TRAPFRAME Trapframe) /* * Disable interrupts */ - __asm__("cli\n\t"); + Ke386DisableInterrupts(); /* * Unmask the related irq @@ -491,13 +491,7 @@ KiInterruptDispatch (ULONG irq, PKIRQ_TRAPFRAME Trapframe) * Enable interrupts * NOTE: Only higher priority interrupts will get through */ -#if defined(__GNUC__) - __asm__("sti\n\t"); -#elif defined(_MSC_VER) - __asm sti -#else -#error Unknown compiler for inline assembler -#endif + Ke386EnableInterrupts(); /* * Actually call the ISR. @@ -523,13 +517,7 @@ KiInterruptDispatch (ULONG irq, PKIRQ_TRAPFRAME Trapframe) /* * End the system interrupt. */ -#if defined(__GNUC__) - __asm__("cli\n\t"); -#elif defined(_MSC_VER) - __asm cli -#else -#error Unknown compiler for inline assembler -#endif + Ke386DisableInterrupts(); HalEndSystemInterrupt (old_level, 0); diff --git a/reactos/ntoskrnl/ke/i386/kernel.c b/reactos/ntoskrnl/ke/i386/kernel.c index 8725c0ad66f..8296735b269 100644 --- a/reactos/ntoskrnl/ke/i386/kernel.c +++ b/reactos/ntoskrnl/ke/i386/kernel.c @@ -93,13 +93,8 @@ KeApplicationProcessorInit(VOID) */ Ki386InitializeLdt(); -#if defined(__GNUC__) - __asm__ __volatile__ ("sti\n\t"); -#elif defined(_MSC_VER) - __asm sti -#else -#error Unknown compiler for inline assembler -#endif + /* Now we can enable interrupts. */ + Ke386EnableInterrupts(); } VOID INIT_FUNCTION diff --git a/reactos/ntoskrnl/ke/i386/tss.c b/reactos/ntoskrnl/ke/i386/tss.c index e81a09fe1b4..4adc272f0d5 100644 --- a/reactos/ntoskrnl/ke/i386/tss.c +++ b/reactos/ntoskrnl/ke/i386/tss.c @@ -126,14 +126,7 @@ Ki386ApplicationProcessorInitializeTSS(VOID) Id = KeGetCurrentProcessorNumber(); Gdt = KeGetCurrentKPCR()->GDT; -#if defined(__GNUC__) - __asm__("movl %%cr3,%0\n\t" : "=d" (cr3_)); -#elif defined(_MSC_VER) - __asm mov eax, cr3; - __asm mov cr3_, eax; -#else -#error Unknown compiler for inline assembler -#endif + Ke386GetPageTableDirectory(cr3_); Tss = ExAllocatePool(NonPagedPool, sizeof(KTSS)); TrapTss = ExAllocatePool(NonPagedPool, sizeof(KTSSNOIOPM)); @@ -214,14 +207,7 @@ Ki386BootInitializeTSS(VOID) extern unsigned int trap_stack, trap_stack_top; unsigned int base, length; -#if defined(__GNUC__) - __asm__("movl %%cr3,%0\n\t" : "=d" (cr3_)); -#elif defined(_MSC_VER) - __asm mov eax, cr3; - __asm mov cr3_, eax; -#else -#error Unknown compiler for inline assembler -#endif + Ke386GetPageTableDirectory(cr3_); Ki386TssArray[0] = &KiBootTss; Ki386TrapTssArray[0] = &KiBootTrapTss; diff --git a/reactos/ntoskrnl/ke/process.c b/reactos/ntoskrnl/ke/process.c index 3094e0775f8..eaa110ee5b0 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.18 2003/12/30 18:52:04 fireball Exp $ +/* $Id: process.c,v 1.19 2004/03/09 21:49:53 dwelch Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/process.c @@ -81,16 +81,7 @@ KeAttachProcess (PEPROCESS Process) CurrentThread->ThreadsProcess = Process; PageDir = Process->Pcb.DirectoryTableBase.u.LowPart; DPRINT("Switching process context to %x\n",PageDir); -#if defined(__GNUC__) - __asm__("movl %0,%%cr3\n\t" - : /* no outputs */ - : "r" (PageDir)); -#elif defined(_MSC_VER) - __asm mov eax, PageDir; - __asm mov cr3, eax; -#else -#error Unknown compiler for inline assembler -#endif + Ke386SetPageTableDirectory(PageDir); KeLowerIrql(oldlvl); } @@ -121,16 +112,7 @@ KeDetachProcess (VOID) CurrentThread->ThreadsProcess = CurrentThread->OldProcess; CurrentThread->OldProcess = NULL; PageDir = CurrentThread->ThreadsProcess->Pcb.DirectoryTableBase.u.LowPart; -#if defined(__GNUC__) - __asm__("movl %0,%%cr3\n\t" - : /* no inputs */ - : "r" (PageDir)); -#elif defined(_MSC_VER) - __asm mov eax, PageDir; - __asm mov cr3, eax; -#else -#error Unknown compiler for inline assembler -#endif + Ke386SetPageTableDirectory(PageDir); KeLowerIrql(oldlvl); } diff --git a/reactos/ntoskrnl/mm/i386/page.c b/reactos/ntoskrnl/mm/i386/page.c index 5979a51aaa2..da6ba4667c6 100644 --- a/reactos/ntoskrnl/mm/i386/page.c +++ b/reactos/ntoskrnl/mm/i386/page.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: page.c,v 1.62 2004/01/05 14:28:21 weiden Exp $ +/* $Id: page.c,v 1.63 2004/03/09 21:49:53 dwelch Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/i386/page.c @@ -78,15 +78,7 @@ PULONG MmGetPageDirectory(VOID) { unsigned int page_dir=0; -#if defined(__GNUC__) - __asm__("movl %%cr3,%0\n\t" - : "=r" (page_dir)); -#elif defined(_MSC_VER) - __asm mov eax, cr3; - __asm mov page_dir, eax; -#else -#error Unknown compiler for inline assembler -#endif + Ke386GetPageTableDirectory(page_dir); return((PULONG)page_dir); } diff --git a/reactos/ntoskrnl/ps/idle.c b/reactos/ntoskrnl/ps/idle.c index 1d8c7f72f8f..18494266a46 100644 --- a/reactos/ntoskrnl/ps/idle.c +++ b/reactos/ntoskrnl/ps/idle.c @@ -40,13 +40,7 @@ PsIdleThreadMain(PVOID Context) } NtYieldExecution(); -#if defined(__GNUC__) - __asm__( "hlt" ); -#elif defined(_MSC_VER) - __asm hlt -#else -#error Unknown compiler for inline assembler -#endif + Ke386HaltProcessor(); } } From 6616abd5321e9d742acf39b191166aa058bb6003 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Tue, 9 Mar 2004 22:04:47 +0000 Subject: [PATCH 0404/1463] - Forgot this one. svn path=/trunk/; revision=8616 --- reactos/ntoskrnl/include/internal/i386/mm.h | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/i386/mm.h b/reactos/ntoskrnl/include/internal/i386/mm.h index cebaee15a71..0861c7fec74 100644 --- a/reactos/ntoskrnl/include/internal/i386/mm.h +++ b/reactos/ntoskrnl/include/internal/i386/mm.h @@ -42,8 +42,7 @@ PULONG MmGetPageEntry(PVOID Address); } #elif defined(_MSC_VER) -/* TODO: Verify that this really WORKS. Perhaps it, as the GCC thing */ -/* above, needs to actually touch some memory too ? */ +/* TODO: Need some way to tell the compiler this is a memory barrier. */ #define FLUSH_TLB __asm mov eax, cr3 __asm mov cr3, eax; #else #error Unknown compiler for inline assembler @@ -52,17 +51,6 @@ PULONG MmGetPageEntry(PVOID Address); PULONG MmGetPageDirectory(VOID); -#if 0 -extern inline PULONG get_page_directory(void) -{ - unsigned int page_dir=0; - __asm__("movl %%cr3,%0\n\t" - : "=r" (page_dir)); - return((PULONG)page_dir); -} -#endif - - /* * Amount of memory that can be mapped by a page table */ From e2b29d7f6c8180403f4732f95b97e38357c9a051 Mon Sep 17 00:00:00 2001 From: Casper Hornstrup <chorns@users.sourceforge.net> Date: Tue, 9 Mar 2004 22:08:04 +0000 Subject: [PATCH 0405/1463] 2004-03-09 Casper S. Hornstrup <chorns@users.sourceforge.net> * regtests/Makefile: Make REGTEST_TARGETS depend on *.c. * regtests/kmregtests/driver.c: Update call to PerformTests(). * regtests/kmrtint/kmrtint.c (RegTestMain): Update to match prototype. * regtests/kmrtint/kmrtint.def (RegTestMain): Ditto. * regtests/kmrtint/kmrtint.edf (RegTestMain): Ditto. * regtests/win32base/tests/ws2event.c: New file. * regtests/regtests/regtests.c (OUPUT_MODE_DbgPrint, OUPUT_MODE_OutputDebugString, OUPUT_MODE_printf): Define. (OutputMode): New variable. (OutputRoutine): New function. (RunTestDriver): Add TestName parameter. (main): Parse command line to find output routine and test name. * regtests/shared/regtests.c (PerformTest): Use specified output routine if specified. Run only specified test if specified. (PerformTests): Update call to PerformTest(). * regtests/shared/regtests.h (TestOutputRoutine): Add prototype. (TestDriverMain): Add OutputRoutine and TestName parameter. (PerformTests): Ditto. * regtests/win32base/Makefile (TARGET_SDKLIBS): Add ws2_32.a. * regtests/win32base/driver.c (RegTestMain): Update to match prototype. * regtests/win32base/win32base.def (RegTestMain): Ditto. * regtests/win32base/win32base.edf (RegTestMain): Ditto. * tools/regtests.c (UMSTUB): Update call to PerformTests(). svn path=/trunk/; revision=8617 --- reactos/ChangeLog | 26 ++++ reactos/regtests/Makefile | 4 +- reactos/regtests/kmregtests/driver.c | 2 +- reactos/regtests/kmrtint/kmrtint.c | 2 +- reactos/regtests/kmrtint/kmrtint.def | 2 +- reactos/regtests/kmrtint/kmrtint.edf | 2 +- reactos/regtests/regtests/regtests.c | 64 +++++++++- reactos/regtests/shared/regtests.c | 40 ++++-- reactos/regtests/shared/regtests.h | 16 ++- reactos/regtests/win32base/Makefile | 4 +- reactos/regtests/win32base/driver.c | 13 +- reactos/regtests/win32base/tests/ws2event.c | 127 ++++++++++++++++++++ reactos/regtests/win32base/win32base.def | 2 +- reactos/regtests/win32base/win32base.edf | 2 +- reactos/tools/regtests.c | 2 +- 15 files changed, 273 insertions(+), 35 deletions(-) create mode 100644 reactos/regtests/win32base/tests/ws2event.c diff --git a/reactos/ChangeLog b/reactos/ChangeLog index df43974f9f6..eac5847234c 100644 --- a/reactos/ChangeLog +++ b/reactos/ChangeLog @@ -1,3 +1,29 @@ +2004-03-09 Casper S. Hornstrup <chorns@users.sourceforge.net> + + * regtests/Makefile: Make REGTEST_TARGETS depend on *.c. + * regtests/kmregtests/driver.c: Update call to PerformTests(). + * regtests/kmrtint/kmrtint.c (RegTestMain): Update to match prototype. + * regtests/kmrtint/kmrtint.def (RegTestMain): Ditto. + * regtests/kmrtint/kmrtint.edf (RegTestMain): Ditto. + * regtests/win32base/tests/ws2event.c: New file. + * regtests/regtests/regtests.c (OUPUT_MODE_DbgPrint, + OUPUT_MODE_OutputDebugString, OUPUT_MODE_printf): Define. + (OutputMode): New variable. + (OutputRoutine): New function. + (RunTestDriver): Add TestName parameter. + (main): Parse command line to find output routine and test name. + * regtests/shared/regtests.c (PerformTest): Use specified output routine + if specified. Run only specified test if specified. + (PerformTests): Update call to PerformTest(). + * regtests/shared/regtests.h (TestOutputRoutine): Add prototype. + (TestDriverMain): Add OutputRoutine and TestName parameter. + (PerformTests): Ditto. + * regtests/win32base/Makefile (TARGET_SDKLIBS): Add ws2_32.a. + * regtests/win32base/driver.c (RegTestMain): Update to match prototype. + * regtests/win32base/win32base.def (RegTestMain): Ditto. + * regtests/win32base/win32base.edf (RegTestMain): Ditto. + * tools/regtests.c (UMSTUB): Update call to PerformTests(). + 2004-03-04 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/net/tcpip/tcpip/i386: New directory. diff --git a/reactos/regtests/Makefile b/reactos/regtests/Makefile index 2ee5211edd2..958a95a6141 100755 --- a/reactos/regtests/Makefile +++ b/reactos/regtests/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.3 2004/02/22 18:53:39 dwelch Exp $ +# $Id: Makefile,v 1.4 2004/03/09 22:08:04 chorns Exp $ PATH_TO_TOP = .. @@ -27,7 +27,7 @@ install: $(MAKE) -C kmrtint install $(MAKE) -C regtests install -$(REGTEST_TARGETS): kmregtests/tests/* win32base/tests/* +$(REGTEST_TARGETS): kmregtests/tests/*.c win32base/tests/*.c $(REGTESTS) ./kmregtests/tests ./kmregtests/_regtests.c ./kmregtests/Makefile.tests $(REGTESTS) ./win32base/tests ./win32base/_regtests.c ./win32base/Makefile.tests diff --git a/reactos/regtests/kmregtests/driver.c b/reactos/regtests/kmregtests/driver.c index 4a2e50fffa6..b031d8604ac 100755 --- a/reactos/regtests/kmregtests/driver.c +++ b/reactos/regtests/kmregtests/driver.c @@ -60,7 +60,7 @@ KMRegTestsRun( PIRP Irp, PIO_STACK_LOCATION IrpSp) { - PerformTests(); + PerformTests(NULL, NULL); ShutdownBochs(); Irp->IoStatus.Status = STATUS_SUCCESS; diff --git a/reactos/regtests/kmrtint/kmrtint.c b/reactos/regtests/kmrtint/kmrtint.c index a336c8c8ac1..e14ac0fb0d7 100755 --- a/reactos/regtests/kmrtint/kmrtint.c +++ b/reactos/regtests/kmrtint/kmrtint.c @@ -53,7 +53,7 @@ OpenDevice() } VOID STDCALL -RegTestMain() +RegTestMain(TestOutputRoutine OutputRoutine, LPSTR TestName) { IO_STATUS_BLOCK Iosb; HANDLE DeviceHandle; diff --git a/reactos/regtests/kmrtint/kmrtint.def b/reactos/regtests/kmrtint/kmrtint.def index 4f915f52c53..39fa60a6217 100755 --- a/reactos/regtests/kmrtint/kmrtint.def +++ b/reactos/regtests/kmrtint/kmrtint.def @@ -1,3 +1,3 @@ LIBRARY kmrtint.dll EXPORTS -RegTestMain@0 +RegTestMain@8 diff --git a/reactos/regtests/kmrtint/kmrtint.edf b/reactos/regtests/kmrtint/kmrtint.edf index 031c73fecb9..9a41aad4e41 100755 --- a/reactos/regtests/kmrtint/kmrtint.edf +++ b/reactos/regtests/kmrtint/kmrtint.edf @@ -1,3 +1,3 @@ LIBRARY kmrtint.dll EXPORTS -RegTestMain=RegTestMain@0 +RegTestMain=RegTestMain@8 diff --git a/reactos/regtests/regtests/regtests.c b/reactos/regtests/regtests/regtests.c index 5380d20a661..40b0fb80e1a 100755 --- a/reactos/regtests/regtests/regtests.c +++ b/reactos/regtests/regtests/regtests.c @@ -7,11 +7,34 @@ * 06-07-2003 CSH Created */ #define NTOS_MODE_USER +#include <stdio.h> #include <ntos.h> #include "regtests.h" -VOID -RunTestDriver(LPTSTR FileName) +#define OUPUT_MODE_DbgPrint 0 +#define OUPUT_MODE_OutputDebugString 1 +#define OUPUT_MODE_printf 2 + +static int OutputMode = 0; + +static void OutputRoutine(char *Buffer) +{ + if (OutputMode == OUPUT_MODE_DbgPrint) + { + DbgPrint(Buffer); + } + else if (OutputMode == OUPUT_MODE_OutputDebugString) + { + OutputDebugString(Buffer); + } + else if (OutputMode == OUPUT_MODE_printf) + { + printf(Buffer); + } +} + +static VOID +RunTestDriver(LPSTR FileName, LPSTR TestName) { TestDriverMain Main; HMODULE hModule; @@ -20,9 +43,9 @@ RunTestDriver(LPTSTR FileName) if (hModule != NULL) { Main = (TestDriverMain) GetProcAddress(hModule, "RegTestMain"); - if (Main != NULL) + if (Main != NULL) { - (Main)(); + (Main)(OutputRoutine, TestName); } FreeLibrary(hModule); } @@ -31,7 +54,36 @@ RunTestDriver(LPTSTR FileName) int main(int argc, char* argv[]) { - RunTestDriver("win32base.dll"); - RunTestDriver("kmrtint.dll"); + LPSTR testname = NULL; + int i; + + if (argc > 1) + { + i = 1; + if (argv[i][0] == '-') + { + switch (argv[i][1]) + { + case 'd': + OutputMode = OUPUT_MODE_DbgPrint; + break; + case 'o': + OutputMode = OUPUT_MODE_OutputDebugString; + break; + case 'p': + OutputMode = OUPUT_MODE_printf; + break; + default: + printf("Usage: regtests [-dop] [testname]"); + return 0; + } + i++; + } + + testname = argv[i]; + } + + RunTestDriver("win32base.dll", testname); + RunTestDriver("kmrtint.dll", testname); return 0; } diff --git a/reactos/regtests/shared/regtests.c b/reactos/regtests/shared/regtests.c index 952c45afc6b..232ba362f94 100755 --- a/reactos/regtests/shared/regtests.c +++ b/reactos/regtests/shared/regtests.c @@ -7,6 +7,7 @@ * 06-07-2003 CSH Created */ #include <roscfg.h> +#include <stdio.h> #define NTOS_MODE_USER #include <ntos.h> #include "regtests.h" @@ -40,18 +41,31 @@ InitializeTests() } VOID -PerformTest(PROS_TEST Test) +PerformTest(TestOutputRoutine OutputRoutine, PROS_TEST Test, LPSTR TestName) { - char TestName[200]; + char OutputBuffer[200]; char Buffer[200]; + char Name[200]; int Result; - memset(TestName, 0, sizeof(TestName)); + memset(Name, 0, sizeof(Name)); memset(Buffer, 0, sizeof(Buffer)); - if (!((Test->Routine)(TESTCMD_TESTNAME, TestName) == 0)) + if (!((Test->Routine)(TESTCMD_TESTNAME, Name) == 0)) { - strcpy(TestName, "Unnamed"); + if (TestName != NULL) + { + return; + } + strcpy(Name, "Unnamed"); + } + + if (TestName != NULL) + { + if (_stricmp(Name, TestName) != 0) + { + return; + } } #ifdef SEH @@ -67,16 +81,24 @@ PerformTest(PROS_TEST Test) if (Result != TS_OK) { - DbgPrint("ROSREGTEST: (%s) Status: Failed (%s)\n", TestName, Buffer); + sprintf(OutputBuffer, "ROSREGTEST: (%s) Status: Failed (%s)\n", Name, Buffer); } else { - DbgPrint("ROSREGTEST: (%s) Status: Success\n", TestName); + sprintf(OutputBuffer, "ROSREGTEST: (%s) Status: Success\n", Name); + } + if (OutputRoutine != NULL) + { + (*OutputRoutine)(OutputBuffer); + } + else + { + DbgPrint(OutputBuffer); } } VOID -PerformTests() +PerformTests(TestOutputRoutine OutputRoutine, LPSTR TestName) { PLIST_ENTRY CurrentEntry; PLIST_ENTRY NextEntry; @@ -87,7 +109,7 @@ PerformTests() { NextEntry = CurrentEntry->Flink; Current = CONTAINING_RECORD(CurrentEntry, ROS_TEST, ListEntry); - PerformTest(Current); + PerformTest(OutputRoutine, Current, TestName); CurrentEntry = NextEntry; } } diff --git a/reactos/regtests/shared/regtests.h b/reactos/regtests/shared/regtests.h index 4d75575b92c..96572c4e5d0 100755 --- a/reactos/regtests/shared/regtests.h +++ b/reactos/regtests/shared/regtests.h @@ -24,8 +24,18 @@ */ typedef int (*TestRoutine)(int Command, char *Buffer); -/* Test driver entry routine */ -typedef VOID STDCALL (*TestDriverMain)(); +/* + * Test output routine prototype + * Buffer - Address of buffer with text to output + */ +typedef void (*TestOutputRoutine)(char *Buffer); + +/* + * Test driver entry routine. +* OutputRoutine - Output routine. + * TestName - If NULL all tests are run. If non-NULL specifies the test to be run + */ +typedef void STDCALL (*TestDriverMain)(TestOutputRoutine OutputRoutine, char *TestName); typedef struct _ROS_TEST { @@ -37,7 +47,7 @@ extern LIST_ENTRY AllTests; extern VOID InitializeTests(); extern VOID RegisterTests(); -extern VOID PerformTests(); +extern VOID PerformTests(TestOutputRoutine OutputRoutine, LPSTR TestName); /* Routines provided by the driver */ extern PVOID AllocateMemory(ULONG Size); diff --git a/reactos/regtests/win32base/Makefile b/reactos/regtests/win32base/Makefile index 99e3806ae87..ec482903ad2 100755 --- a/reactos/regtests/win32base/Makefile +++ b/reactos/regtests/win32base/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.3 2003/12/07 11:34:41 chorns Exp $ +# $Id: Makefile,v 1.4 2004/03/09 22:08:04 chorns Exp $ PATH_TO_TOP = ../.. @@ -8,7 +8,7 @@ TARGET_TYPE = dynlink TARGET_NAME = win32base -TARGET_SDKLIBS = rtshared.a ntdll.a kernel32.a +TARGET_SDKLIBS = rtshared.a ntdll.a kernel32.a ws2_32.a TARGET_CFLAGS = -I../shared -Wall -Werror diff --git a/reactos/regtests/win32base/driver.c b/reactos/regtests/win32base/driver.c index 7680e96f7d7..9b043d3adc2 100755 --- a/reactos/regtests/win32base/driver.c +++ b/reactos/regtests/win32base/driver.c @@ -55,15 +55,15 @@ RunPrivateTests(LPTSTR FileName) /* * The module is a core OS component that is already * mapped into the current process. - * NOTE: This will cause all core OS components that are already mapped - * into the process to run their regression tests. + * NOTE: This will cause all core OS components that are already mapped + * into the process to run their regression tests. */ hThread = CreateThread(NULL, 0, DummyThreadMain, NULL, 0, NULL); if (hThread != NULL) { DWORD ErrorCode; - ErrorCode = WaitForSingleObject(hEvent, 5000); /* Wait up to 5 seconds */ - CloseHandle(hThread); + ErrorCode = WaitForSingleObject(hEvent, 5000); /* Wait up to 5 seconds */ + CloseHandle(hThread); } } else @@ -81,12 +81,13 @@ RunPrivateTests(LPTSTR FileName) VOID STDCALL -RegTestMain() +RegTestMain(TestOutputRoutine OutputRoutine, LPSTR TestName) { /* * Private module regression tests in components already mapped * (ntdll.dll, kernel32.dll, msvcrt.dll) */ + /* FIXME: Need to pass TestName to the driver */ RunPrivateTests(_T("ntdll.dll")); /* Other private module regression tests */ @@ -94,5 +95,5 @@ RegTestMain() /* Cross-module regression tests */ InitializeTests(); RegisterTests(); - PerformTests(); + PerformTests(OutputRoutine, TestName); } diff --git a/reactos/regtests/win32base/tests/ws2event.c b/reactos/regtests/win32base/tests/ws2event.c new file mode 100644 index 00000000000..5619c10522c --- /dev/null +++ b/reactos/regtests/win32base/tests/ws2event.c @@ -0,0 +1,127 @@ +#include <stdio.h> +#include <windows.h> +#include <winsock2.h> + +#include "regtests.h" + +static int RunTest(char *Buffer) +{ + const WSAEVENT* lphEvents; + WORD wVersionRequested; + WSAEVENT hEvent; + WSADATA wsaData; + DWORD ErrorCode; + int startup; + + /* Require WinSock 2.0 or later */ + wVersionRequested = MAKEWORD(2, 0); + startup = WSAStartup(wVersionRequested, &wsaData); + if (startup != 0) + { + sprintf(Buffer, "WSAStartup() failed with status %d", startup); + return TS_FAILED; + } + + /* Check if the WinSock version is 2.0 */ + if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 0) + { + strcpy(Buffer, "Winsock dll version is not 2.0 or higher"); + WSACleanup(); + return TS_FAILED; + } + + /* Create an event */ + hEvent = WSACreateEvent(); + if (hEvent == WSA_INVALID_EVENT) + { + sprintf(Buffer, "WSACreateEvent() failed with status %d", WSAGetLastError()); + WSACleanup(); + return TS_FAILED; + } + + /* Check that the state of the event defaults to non-signalled */ + lphEvents = &hEvent; + ErrorCode = WSAWaitForMultipleEvents(1, + lphEvents, + FALSE, + 0, + FALSE); + if (ErrorCode != WSA_WAIT_TIMEOUT) + { + sprintf(Buffer, "WSAWaitForMultipleEvents() has bad status %ld (should be WSA_WAIT_TIMEOUT (%ld))", + ErrorCode, WSA_WAIT_TIMEOUT); + WSACleanup(); + return TS_FAILED; + } + + if (!WSASetEvent(hEvent)) + { + sprintf(Buffer, "WSASetEvent() failed with status %d", WSAGetLastError()); + WSACleanup(); + return TS_FAILED; + } + + /* Check that the state of the event is now signalled */ + lphEvents = &hEvent; + ErrorCode = WSAWaitForMultipleEvents(1, + lphEvents, + FALSE, + 0, + FALSE); + if (ErrorCode != WSA_WAIT_EVENT_0) + { + sprintf(Buffer, "WSAWaitForMultipleEvents() has bad status %ld (should be WSA_WAIT_EVENT_0 (%ld))", + ErrorCode, WSA_WAIT_EVENT_0); + WSACleanup(); + return TS_FAILED; + } + + if (!WSAResetEvent(hEvent)) + { + sprintf(Buffer, "WSAResetEvent() failed with status %d", WSAGetLastError()); + WSACleanup(); + return TS_FAILED; + } + + /* Check that the state of the event is now non-signalled */ + lphEvents = &hEvent; + ErrorCode = WSAWaitForMultipleEvents(1, + lphEvents, + FALSE, + 0, + FALSE); + if (ErrorCode != WSA_WAIT_TIMEOUT) + { + /*sprintf(Buffer, "WSAWaitForMultipleEvents() now has bad status %d (should be WSA_WAIT_TIMEOUT (%d))", + ErrorCode, WSA_WAIT_TIMEOUT);*/ + WSACleanup(); + return TS_FAILED; + } + + if (!WSACloseEvent(hEvent)) + { + sprintf(Buffer, "WSACloseEvent() failed with status %d", WSAGetLastError()); + WSACleanup(); + return TS_FAILED; + } + + WSACleanup(); + + return TS_OK; +} + +int +Ws2eventTest(int Command, char *Buffer) +{ + switch (Command) + { + case TESTCMD_RUN: + return RunTest(Buffer); + case TESTCMD_TESTNAME: + strcpy(Buffer, "Winsock 2 event"); + return TS_OK; + default: + break; + } + return TS_FAILED; +} diff --git a/reactos/regtests/win32base/win32base.def b/reactos/regtests/win32base/win32base.def index acb9dd17905..40c09bb895b 100755 --- a/reactos/regtests/win32base/win32base.def +++ b/reactos/regtests/win32base/win32base.def @@ -1,3 +1,3 @@ LIBRARY win32base.dll EXPORTS -RegTestMain@0 +RegTestMain@8 diff --git a/reactos/regtests/win32base/win32base.edf b/reactos/regtests/win32base/win32base.edf index ec7a45280ad..2bc277a1afd 100755 --- a/reactos/regtests/win32base/win32base.edf +++ b/reactos/regtests/win32base/win32base.edf @@ -1,3 +1,3 @@ LIBRARY win32base.dll EXPORTS -RegTestMain=RegTestMain@0 +RegTestMain=RegTestMain@8 diff --git a/reactos/tools/regtests.c b/reactos/tools/regtests.c index ea28f56913b..b763a822b6d 100755 --- a/reactos/tools/regtests.c +++ b/reactos/tools/regtests.c @@ -480,7 +480,7 @@ static char UMSTUB[] = " testsRegistered = 1;\n" " InitializeTests();\n" " RegisterTests();\n" - " PerformTests();\n" + " PerformTests(NULL, NULL);\n" " }\n" " }\n" "}\n"; From 025e88cba919260a1c973236a6136337e0db43b3 Mon Sep 17 00:00:00 2001 From: Andrew Greenwood <silverblade@reactos.org> Date: Tue, 9 Mar 2004 23:21:56 +0000 Subject: [PATCH 0406/1463] - Implemented GetDCOrg(), which is officially obsolete, but I've included it for completeness' sake :) svn path=/trunk/; revision=8618 --- reactos/lib/gdi32/objects/dc.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/reactos/lib/gdi32/objects/dc.c b/reactos/lib/gdi32/objects/dc.c index ca923b6bb5b..c37da44a82f 100644 --- a/reactos/lib/gdi32/objects/dc.c +++ b/reactos/lib/gdi32/objects/dc.c @@ -895,6 +895,22 @@ GetDCOrgEx( return NtGdiGetDCOrgEx(a0,a1); } +/* + * @implemented +*/ +LONG +STDCALL +GetDCOrg( + HDC a0 + ) +{ + // Officially obsolete by Microsoft + POINT Pt; + if (!NtGdiGetDCOrgEx(a0,&Pt)) + return 0; + return(MAKELONG(Pt.x, Pt.y)); +} + /* * @implemented */ From 69208dc611a98db570d8fc37ce24fe83685cd126 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Wed, 10 Mar 2004 09:14:29 +0000 Subject: [PATCH 0407/1463] Tell apps we're NT4 SP6, VB runtime will fail if we report SP0 svn path=/trunk/; revision=8619 --- reactos/ntoskrnl/ps/process.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/ps/process.c b/reactos/ntoskrnl/ps/process.c index e29f69536f2..b61c6ea5c8c 100644 --- a/reactos/ntoskrnl/ps/process.c +++ b/reactos/ntoskrnl/ps/process.c @@ -1,4 +1,4 @@ -/* $Id: process.c,v 1.126 2004/03/07 21:09:08 navaraf Exp $ +/* $Id: process.c,v 1.127 2004/03/10 09:14:29 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -470,6 +470,7 @@ PsCreatePeb(HANDLE ProcessHandle, Peb->OSMinorVersion = 0; Peb->OSBuildNumber = 0; Peb->OSPlatformId = 2; //VER_PLATFORM_WIN32_NT; + Peb->SPMajorVersion = 6; Peb->AnsiCodePageData = (char*)TableBase + NlsAnsiTableOffset; Peb->OemCodePageData = (char*)TableBase + NlsOemTableOffset; From a306af21c23902d333929b31b120fd1afc6815b7 Mon Sep 17 00:00:00 2001 From: Andrew Greenwood <silverblade@reactos.org> Date: Wed, 10 Mar 2004 15:22:45 +0000 Subject: [PATCH 0408/1463] *Major soundcard support update* ReactOS remains silent for now, but for anyone wishing to further work on the Sound Blaster driver and/or mmdrv.dll, this should help immensely :) - Imported midimap from WINE - Imported wavemap from WINE - Imported msacm from WINE (32-bit only) - Minor changes to mpu401 - Basic IRP_MJ_WRITE dispatch routine for sndblst.sys (receives buffers, does nothing else.) - Added various WINE headers to include\wine svn path=/trunk/; revision=8620 --- reactos/bootdata/hivesft.inf | 4 +- reactos/bootdata/hivesys.inf | 53 + reactos/drivers/dd/mpu401/mpu401.c | 7 +- reactos/drivers/dd/mpu401/mpu401.h | 9 +- reactos/drivers/dd/sndblst/sndblst.c | 51 +- reactos/include/defines.h | 8 + reactos/include/wine/mmreg.h | 408 ++++++++ reactos/include/wine/msacm.h | 779 ++++++++++++++ reactos/include/wine/msacmdlg.h | 36 + reactos/include/wine/msacmdrv.h | 157 +++ reactos/lib/mmdrv/midi.c | 2 + reactos/lib/mmdrv/mmdef.h | 87 ++ reactos/lib/mmdrv/mmdrv.h | 12 +- reactos/lib/mmdrv/utils.c | 36 +- reactos/lib/msacm/.cvsignore | 9 + reactos/lib/msacm/Makefile.in | 27 + reactos/lib/msacm/Makefile.ros | 21 + reactos/lib/msacm/Makefile.ros-template | 21 + reactos/lib/msacm/driver.c | 400 +++++++ reactos/lib/msacm/filter.c | 454 ++++++++ reactos/lib/msacm/format.c | 832 +++++++++++++++ reactos/lib/msacm/imaadp32/.cvsignore | 3 + reactos/lib/msacm/imaadp32/Makefile.in | 12 + reactos/lib/msacm/imaadp32/imaadp32.acm.spec | 1 + reactos/lib/msacm/imaadp32/imaadp32.c | 938 +++++++++++++++++ reactos/lib/msacm/internal.c | 415 ++++++++ reactos/lib/msacm/makefile | 23 + reactos/lib/msacm/msacm.rc | 30 + reactos/lib/msacm/msacm.spec | 40 + reactos/lib/msacm/msacm.spec.def | 0 reactos/lib/msacm/msacm32.spec | 46 + reactos/lib/msacm/msacm32.spec.def | 48 + reactos/lib/msacm/msacm32_main.c | 221 ++++ reactos/lib/msacm/msacm_En.rc | 56 + reactos/lib/msacm/msacm_Fr.rc | 57 + reactos/lib/msacm/msacm_It.rc | 57 + reactos/lib/msacm/msacm_Nl.rc | 56 + reactos/lib/msacm/msacm_Pt.rc | 56 + reactos/lib/msacm/msacm_main.c | 463 +++++++++ reactos/lib/msacm/msadp32/.cvsignore | 3 + reactos/lib/msacm/msadp32/Makefile.in | 12 + reactos/lib/msacm/msadp32/msadp32.acm.spec | 1 + reactos/lib/msacm/msadp32/msadp32.c | 781 ++++++++++++++ reactos/lib/winmm/lolvldrv.c | 10 +- reactos/lib/winmm/midimap/.cvsignore | 9 + reactos/lib/winmm/midimap/Makefile.in | 13 + reactos/lib/winmm/midimap/Makefile.ros | 21 + .../lib/winmm/midimap/Makefile.ros-template | 21 + reactos/lib/winmm/midimap/makefile | 9 + reactos/lib/winmm/midimap/midimap.c | 555 ++++++++++ reactos/lib/winmm/midimap/midimap.rc | 39 + reactos/lib/winmm/midimap/midimap.spec.def | 2 + reactos/lib/winmm/wavemap/.cvsignore | 9 + reactos/lib/winmm/wavemap/Makefile.in | 13 + reactos/lib/winmm/wavemap/Makefile.ros | 21 + .../lib/winmm/wavemap/Makefile.ros-template | 21 + reactos/lib/winmm/wavemap/makefile | 9 + reactos/lib/winmm/wavemap/msacm.spec.def | 3 + reactos/lib/winmm/wavemap/wavemap.c | 975 ++++++++++++++++++ reactos/lib/winmm/wavemap/wavemap.rc | 39 + reactos/lib/winmm/wavemap/wavemap.spec.def | 2 + reactos/subsys/win32k/objects/bitmaps.c | 9 +- reactos/tools/helper.mk | 36 +- 63 files changed, 8517 insertions(+), 31 deletions(-) create mode 100644 reactos/include/wine/mmreg.h create mode 100644 reactos/include/wine/msacm.h create mode 100644 reactos/include/wine/msacmdlg.h create mode 100644 reactos/include/wine/msacmdrv.h create mode 100644 reactos/lib/mmdrv/mmdef.h create mode 100644 reactos/lib/msacm/.cvsignore create mode 100644 reactos/lib/msacm/Makefile.in create mode 100644 reactos/lib/msacm/Makefile.ros create mode 100644 reactos/lib/msacm/Makefile.ros-template create mode 100644 reactos/lib/msacm/driver.c create mode 100644 reactos/lib/msacm/filter.c create mode 100644 reactos/lib/msacm/format.c create mode 100644 reactos/lib/msacm/imaadp32/.cvsignore create mode 100644 reactos/lib/msacm/imaadp32/Makefile.in create mode 100644 reactos/lib/msacm/imaadp32/imaadp32.acm.spec create mode 100644 reactos/lib/msacm/imaadp32/imaadp32.c create mode 100644 reactos/lib/msacm/internal.c create mode 100644 reactos/lib/msacm/makefile create mode 100644 reactos/lib/msacm/msacm.rc create mode 100644 reactos/lib/msacm/msacm.spec create mode 100644 reactos/lib/msacm/msacm.spec.def create mode 100644 reactos/lib/msacm/msacm32.spec create mode 100644 reactos/lib/msacm/msacm32.spec.def create mode 100644 reactos/lib/msacm/msacm32_main.c create mode 100644 reactos/lib/msacm/msacm_En.rc create mode 100644 reactos/lib/msacm/msacm_Fr.rc create mode 100644 reactos/lib/msacm/msacm_It.rc create mode 100644 reactos/lib/msacm/msacm_Nl.rc create mode 100644 reactos/lib/msacm/msacm_Pt.rc create mode 100644 reactos/lib/msacm/msacm_main.c create mode 100644 reactos/lib/msacm/msadp32/.cvsignore create mode 100644 reactos/lib/msacm/msadp32/Makefile.in create mode 100644 reactos/lib/msacm/msadp32/msadp32.acm.spec create mode 100644 reactos/lib/msacm/msadp32/msadp32.c create mode 100644 reactos/lib/winmm/midimap/.cvsignore create mode 100644 reactos/lib/winmm/midimap/Makefile.in create mode 100644 reactos/lib/winmm/midimap/Makefile.ros create mode 100644 reactos/lib/winmm/midimap/Makefile.ros-template create mode 100644 reactos/lib/winmm/midimap/makefile create mode 100644 reactos/lib/winmm/midimap/midimap.c create mode 100644 reactos/lib/winmm/midimap/midimap.rc create mode 100644 reactos/lib/winmm/midimap/midimap.spec.def create mode 100644 reactos/lib/winmm/wavemap/.cvsignore create mode 100644 reactos/lib/winmm/wavemap/Makefile.in create mode 100644 reactos/lib/winmm/wavemap/Makefile.ros create mode 100644 reactos/lib/winmm/wavemap/Makefile.ros-template create mode 100644 reactos/lib/winmm/wavemap/makefile create mode 100644 reactos/lib/winmm/wavemap/msacm.spec.def create mode 100644 reactos/lib/winmm/wavemap/wavemap.c create mode 100644 reactos/lib/winmm/wavemap/wavemap.rc create mode 100644 reactos/lib/winmm/wavemap/wavemap.spec.def diff --git a/reactos/bootdata/hivesft.inf b/reactos/bootdata/hivesft.inf index b2dcf0d67c0..caaacf32e4f 100644 --- a/reactos/bootdata/hivesft.inf +++ b/reactos/bootdata/hivesft.inf @@ -31,8 +31,8 @@ HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList","ProfilesDirecto ;HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList","AllUsersProfile",0x00000000,"All Users.REACTOS" ;HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList","DefaultUserProfile",0x00000000,"Default User.REACTOS" -;HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","Shell",0x00020000,"%SystemRoot%\system32\cmd.exe" -HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","Shell",0x00020000,"%SystemRoot%\explorer.exe" +HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","Shell",0x00020000,"%SystemRoot%\system32\cmd.exe" +;HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","Shell",0x00020000,"%SystemRoot%\explorer.exe" HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","StartServices",0x00010001,0x00000001 HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","StartGUI",0x00010001,0x00000000 HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","Userinit",0x00020000,"%SystemRoot%\system32\userinit.exe" diff --git a/reactos/bootdata/hivesys.inf b/reactos/bootdata/hivesys.inf index 9912e56e5d6..d6b0ec45e10 100644 --- a/reactos/bootdata/hivesys.inf +++ b/reactos/bootdata/hivesys.inf @@ -238,6 +238,59 @@ HKLM,"SYSTEM\CurrentControlSet\Services\Keyboard","ImagePath",0x00020000,"system HKLM,"SYSTEM\CurrentControlSet\Services\Keyboard","Start",0x00010001,0x00000001 HKLM,"SYSTEM\CurrentControlSet\Services\Keyboard","Type",0x00010001,0x00000001 +; SB16 driver +;HKLM,"SYSTEM\CurrentControlSet\Services\sb16snd","Group",0x00000000,"Base" +;HKLM,"SYSTEM\CurrentControlSet\Services\sb16snd","ServiceType",0x00010001,0x00000001 +;HKLM,"SYSTEM\CurrentControlSet\Services\sb16snd","Type",0x00010001,0x00000001 +;HKLM,"SYSTEM\CurrentControlSet\Services\sb16snd","Start",0x00010001,0x00000001 +;HKLM,"SYSTEM\CurrentControlSet\Services\sb16snd","ErrorControl",0x00010001,0x00000001 +;HKLM,"SYSTEM\CurrentControlSet\Services\sb16snd","ImagePath",0x00020000,"system32\drivers\sb16snd.sys" +;HKLM,"SYSTEM\CurrentControlSet\Services\sb16snd\Parameters\Device0","DmaChannel",0x00010001,0x00000001 +;HKLM,"SYSTEM\CurrentControlSet\Services\sb16snd\Parameters\Device0","DmaChannel16",0x00010001,0x00000005 +;HKLM,"SYSTEM\CurrentControlSet\Services\sb16snd\Parameters\Device0","Port",0x00010001,0x00000220 +;HKLM,"SYSTEM\CurrentControlSet\Services\sb16snd\Parameters\Device0","Interrupt",0x00010001,0x00000005 +;HKLM,"SYSTEM\CurrentControlSet\Services\sb16snd\Parameters\Device0","DSP Version",0x00010001,0x00000401 +;HKLM,"SYSTEM\CurrentControlSet\Services\sb16snd\Parameters\Device0\Devices","SBWaveIn0",0x00010001,0x00000001 +;HKLM,"SYSTEM\CurrentControlSet\Services\sb16snd\Parameters\Device0\Devices","SBWaveOut0",0x00010001,0x00000002 + + +HKLM,"SYSTEM\CurrentControlSet\Services\sb16snd","Group",0x00000000,"Base" +HKLM,"SYSTEM\CurrentControlSet\Services\sb16snd","ServiceType",0x00010001,0x00000001 +HKLM,"SYSTEM\CurrentControlSet\Services\sb16snd","Type",0x00010001,0x00000001 +HKLM,"SYSTEM\CurrentControlSet\Services\sb16snd","Start",0x00010001,0x00000001 +HKLM,"SYSTEM\CurrentControlSet\Services\sb16snd","ErrorControl",0x00010001,0x00000001 +HKLM,"SYSTEM\CurrentControlSet\Services\sb16snd","ImagePath",0x00020000,"system32\drivers\sndblst.sys" + + +HKLM,"SYSTEM\CurrentControlSet\Services\es137140","Group",0x00000000,"Base" +HKLM,"SYSTEM\CurrentControlSet\Services\es137140","ServiceType",0x00010001,0x00000001 +HKLM,"SYSTEM\CurrentControlSet\Services\es137140","Type",0x00010001,0x00000001 +HKLM,"SYSTEM\CurrentControlSet\Services\es137140","Start",0x00010001,0x00000001 +HKLM,"SYSTEM\CurrentControlSet\Services\es137140","ErrorControl",0x00010001,0x00000001 +HKLM,"SYSTEM\CurrentControlSet\Services\es137140","ImagePath",0x00020000,"system32\drivers\es137140.sys" +HKLM,"SYSTEM\CurrentControlSet\Services\es137140","DisplayName",0x00020000,"ENSONIQ AudioPCI" +HKLM,"SYSTEM\CurrentControlSet\Services\es137140\Parameters\Device0","Configuration Error",0x00010001,0xffffffff +HKLM,"SYSTEM\CurrentControlSet\Services\es137140\Parameters\Device0","Joystick",0x00010001,0x00000001 +HKLM,"SYSTEM\CurrentControlSet\Services\es137140\Parameters\Device0","Port",0x00010001,0x00001080 +HKLM,"SYSTEM\CurrentControlSet\Services\es137140\Parameters\Device0","Interrupt",0x00010001,0x00000044 +HKLM,"SYSTEM\CurrentControlSet\Services\es137140\Parameters\Device0","RequestedSystemResources",0x00000001,88,00,00,00,05,00,00,00,00,00,00,00,11,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,01,00,00,00,01,00,01,00,03,00,00,00,00,02,03,00,00,00,00,00,44,00,00,00,44,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,01,01,01,00,01,00,00,00,40,00,00,00,40,00,00,00,80,10,00,00,00,00,00,00,bf,10,00,00,00,00,00,00,08,01,01,00,01,00,00,00,40,00,00,00,40,00,00,00,80,10,00,00,00,00,00,00,bf,10,00,00,00,00,00,00 +HKLM,"SYSTEM\CurrentControlSet\Services\es137140\Parameters\Device0\Devices","EAPWaveIn0",0x00010001,0x00000001 +HKLM,"SYSTEM\CurrentControlSet\Services\es137140\Parameters\Device0\Devices","EAPWaveOut0",0x00010001,0x00000002 +HKLM,"SYSTEM\CurrentControlSet\Services\es137140\Parameters\Device0\Devices","EAPMidiIn0",0x00010001,0x00000003 +HKLM,"SYSTEM\CurrentControlSet\Services\es137140\Parameters\Device0\Devices","EAPMidiOut0",0x00010001,0x00000004 +HKLM,"SYSTEM\CurrentControlSet\Services\es137140\Parameters\Device0\Devices","EAPMidiOut1",0x00010001,0x00000004 +HKLM,"SYSTEM\CurrentControlSet\Services\es137140\Parameters\Device0\Devices","EAPMixer0",0x00010001,0x00000006 +HKLM,"SYSTEM\CurrentControlSet\Services\es137140\Parameters\Device0\Devices","EAPAux0",0x00010001,0x00000005 + + +; MPU-401 MIDI driver +HKLM,"SYSTEM\CurrentControlSet\Services\mpu401","Group",0x00000000,"Base" +HKLM,"SYSTEM\CurrentControlSet\Services\mpu401","ServiceType",0x00010001,0x00000001 +HKLM,"SYSTEM\CurrentControlSet\Services\mpu401","Type",0x00010001,0x00000001 +HKLM,"SYSTEM\CurrentControlSet\Services\mpu401","Start",0x00010001,0x00000001 +HKLM,"SYSTEM\CurrentControlSet\Services\mpu401","ErrorControl",0x00010001,0x00000001 +HKLM,"SYSTEM\CurrentControlSet\Services\mpu401","ImagePath",0x00020000,"system32\drivers\mpu401.sys" + ; Mouse driver HKLM,"SYSTEM\CurrentControlSet\Services\Mouse","ErrorControl",0x00010001,0x00000000 HKLM,"SYSTEM\CurrentControlSet\Services\Mouse","Group",0x00000000,"Pointer Class" diff --git a/reactos/drivers/dd/mpu401/mpu401.c b/reactos/drivers/dd/mpu401/mpu401.c index 5792ddcfbae..ca780c04a3c 100644 --- a/reactos/drivers/dd/mpu401/mpu401.c +++ b/reactos/drivers/dd/mpu401/mpu401.c @@ -150,12 +150,12 @@ MPU401Create(PDEVICE_OBJECT DeviceObject, // Play a note to say we're alive: -/* WaitToSend(MPU401_PORT); + WaitToSend(MPU401_PORT); MPU401_WRITE_DATA(MPU401_PORT, 0x90); WaitToSend(MPU401_PORT); MPU401_WRITE_DATA(MPU401_PORT, 0x50); WaitToSend(MPU401_PORT); - MPU401_WRITE_DATA(MPU401_PORT, 0x7f);*/ + MPU401_WRITE_DATA(MPU401_PORT, 0x7f); Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; @@ -248,6 +248,9 @@ MPU401DeviceControl(PDEVICE_OBJECT DeviceObject, DeviceExtension = DeviceObject->DeviceExtension; Stack = IoGetCurrentIrpStackLocation(Irp); + + DPRINT("Control code %d [0x%x]\n", Stack->Parameters.DeviceIoControl.IoControlCode, + Stack->Parameters.DeviceIoControl.IoControlCode); switch(Stack->Parameters.DeviceIoControl.IoControlCode) { diff --git a/reactos/drivers/dd/mpu401/mpu401.h b/reactos/drivers/dd/mpu401/mpu401.h index 048efffded5..9dfdfa54f22 100644 --- a/reactos/drivers/dd/mpu401/mpu401.h +++ b/reactos/drivers/dd/mpu401/mpu401.h @@ -12,6 +12,12 @@ #ifndef __INCLUDES_MPU401_H__ #define __INCLUDES_MPU401_H__ +#include <windows.h> +//#include <mmsystem.h> +//#include <mmddk.h> +//#include <winioctl.h> +#include "../../../lib/mmdrv/mmdef.h" + #define DEFAULT_PORT 0x330 #define DEFAULT_IRQ 9 @@ -26,6 +32,7 @@ #define MPU401_TIMEOUT 10000 +/* OBSOLETE - see mmdef.h instead: #define IOCTL_SOUND_BASE FILE_DEVICE_SOUND // wave base 0 #define IOCTL_MIDI_BASE 0x0080 @@ -39,7 +46,7 @@ #define IOCTL_MIDI_RECORD CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0007, METHOD_BUFFERED, FILE_WRITE_ACCESS) #define IOCTL_MIDI_CACHE_PATCHES CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0008, METHOD_BUFFERED, FILE_WRITE_ACCESS) #define IOCTL_MIDI_CACHE_DRUM_PATCHES CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0009, METHOD_BUFFERED, FILE_WRITE_ACCESS) - +*/ // The MPU-401 has 2 ports, usually 0x330 and 0x331, which are known as // "data" and "status/command", respectively. These macros deal with diff --git a/reactos/drivers/dd/sndblst/sndblst.c b/reactos/drivers/dd/sndblst/sndblst.c index 1d4c8407c2f..59cfb961624 100644 --- a/reactos/drivers/dd/sndblst/sndblst.c +++ b/reactos/drivers/dd/sndblst/sndblst.c @@ -35,8 +35,8 @@ NTSTATUS InitDevice( // PDEVICE_INSTANCE Instance = Context; PDEVICE_OBJECT DeviceObject; // = Context; PDEVICE_EXTENSION Parameters; // = DeviceObject->DeviceExtension; - UNICODE_STRING DeviceName = ROS_STRING_INITIALIZER(L"\\Device\\WaveOut"); // CHANGE THESE! - UNICODE_STRING SymlinkName = ROS_STRING_INITIALIZER(L"\\??\\WaveOut"); + UNICODE_STRING DeviceName = ROS_STRING_INITIALIZER(L"\\Device\\WaveOut0"); // CHANGE THESE? + UNICODE_STRING SymlinkName = ROS_STRING_INITIALIZER(L"\\??\\WaveOut0"); // CONFIG Config; RTL_QUERY_REGISTRY_TABLE Table[2]; @@ -140,10 +140,10 @@ NTSTATUS InitDevice( if (! CreateDMA(DeviceObject)) DPRINT("FAILURE!\n"); - // TEMPORARY TESTING STUFF: + // TEMPORARY TESTING STUFF: should be in BlasterCreate EnableSpeaker(Parameters->Port, TRUE); - SetOutputSampleRate(Parameters->Port, 11025); - BeginPlayback(Parameters->Port, 8, 1, Parameters->BufferSize); + SetOutputSampleRate(Parameters->Port, 2205); + BeginPlayback(Parameters->Port, 16, 2, Parameters->BufferSize); DeviceCount ++; @@ -178,9 +178,14 @@ BlasterCreate(PDEVICE_OBJECT DeviceObject, Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; + + DPRINT("IoCompleteRequest()\n"); + IoCompleteRequest(Irp, IO_NO_INCREMENT); + DPRINT("BlasterCreate() completed\n"); + return(STATUS_SUCCESS); } @@ -247,6 +252,39 @@ BlasterCleanup(PDEVICE_OBJECT DeviceObject, } +static NTSTATUS STDCALL +BlasterWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp) +{ + PIO_STACK_LOCATION Stack; + PDEVICE_EXTENSION DeviceExtension; + UINT ByteCount; + PBYTE Data; + + DPRINT("BlasterWrite() called!\n"); + + DeviceExtension = DeviceObject->DeviceExtension; + Stack = IoGetCurrentIrpStackLocation(Irp); + + DPRINT("%d bytes\n", Stack->Parameters.Write.Length); + + Data = (PBYTE) Irp->AssociatedIrp.SystemBuffer; + + for (ByteCount = 0; ByteCount < Stack->Parameters.Write.Length; ByteCount ++) + { +// DPRINT("0x%x ", Data[ByteCount]); + +// MPU401_WRITE_BYTE(DeviceExtension->Port, Data[ByteCount]); + } + + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, + IO_NO_INCREMENT); + + return(STATUS_SUCCESS); +} + + static NTSTATUS STDCALL BlasterDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) @@ -392,7 +430,7 @@ DriverEntry(PDRIVER_OBJECT DriverObject, // Doesn't support multiple instances (yet ...) NTSTATUS Status; - DPRINT("Sound Blaster Device Driver 0.0.1\n"); + DPRINT("Sound Blaster Device Driver 0.0.2\n"); // Instance.DriverObject = DriverObject; // previous instance = NULL... @@ -404,6 +442,7 @@ DriverEntry(PDRIVER_OBJECT DriverObject, DriverObject->MajorFunction[IRP_MJ_CLOSE] = BlasterClose; DriverObject->MajorFunction[IRP_MJ_CLEANUP] = BlasterCleanup; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = BlasterDeviceControl; + DriverObject->MajorFunction[IRP_MJ_WRITE] = BlasterWrite; DriverObject->DriverUnload = BlasterUnload; // Major hack to just get this damn thing working: diff --git a/reactos/include/defines.h b/reactos/include/defines.h index ef24bf6cb24..e18e0507f43 100644 --- a/reactos/include/defines.h +++ b/reactos/include/defines.h @@ -165,6 +165,7 @@ extern "C" { #define MF_USECHECKBITMAPS (0x200L) #define MF_RIGHTJUSTIFY MF_HELP + /* Ternary Raster Operations - BitBlt */ #define BLACKNESS 0x00000042 #define NOTSRCERASE 0x001100A6 @@ -254,6 +255,13 @@ extern "C" { #define DISP_CHANGE_NOTUPDATED (-3) #define DISP_CHANGE_BADPARAM (-5) +/* ChangeMenu */ +#define MF_INSERT 0 +#define MF_CHANGE 128 +#define MF_APPEND 256 +#define MF_DELETE 512 +#define MF_REMOVE 4096 + /* ChangeServiceConfig */ #define SERVICE_NO_CHANGE (-1) #define SERVICE_KERNEL_DRIVER (1) diff --git a/reactos/include/wine/mmreg.h b/reactos/include/wine/mmreg.h new file mode 100644 index 00000000000..cb96b6b3a6f --- /dev/null +++ b/reactos/include/wine/mmreg.h @@ -0,0 +1,408 @@ +/* + * Declarations for MultiMedia-REGistration + * + * Copyright (C) 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 + */ + +#ifndef __WINE_MMREG_H +#define __WINE_MMREG_H + +/*********************************************************************** + * Defines/Enums + */ + +#ifndef _ACM_WAVEFILTER +#define _ACM_WAVEFILTER + +#define WAVE_FILTER_UNKNOWN 0x0000 +#define WAVE_FILTER_DEVELOPMENT 0xFFFF + +typedef struct _WAVEFILTER { + DWORD cbStruct; + DWORD dwFilterTag; + DWORD fdwFilter; + DWORD dwReserved[5]; +} WAVEFILTER, *PWAVEFILTER, *NPWAVEFILTER, *LPWAVEFILTER; +#endif /* _ACM_WAVEFILTER */ + +#ifndef WAVE_FILTER_VOLUME +#define WAVE_FILTER_VOLUME 0x0001 + +typedef struct _WAVEFILTER_VOLUME { + WAVEFILTER wfltr; + DWORD dwVolume; +} VOLUMEWAVEFILTER, *PVOLUMEWAVEFILTER, *NPVOLUMEWAVEFILTER, *LPVOLUMEWAVEFILTER; +#endif /* WAVE_FILTER_VOLUME */ + +#ifndef WAVE_FILTER_ECHO +#define WAVE_FILTER_ECHO 0x0002 + +typedef struct WAVEFILTER_ECHO { + WAVEFILTER wfltr; + DWORD dwVolume; + DWORD dwDelay; +} ECHOWAVEFILTER, *PECHOWAVEFILTER, *NPECHOWAVEFILTER, *LPECHOWAVEFILTER; +#endif /* WAVEFILTER_ECHO */ + +#ifndef _WAVEFORMATEX_ +#define _WAVEFORMATEX_ +typedef struct _WAVEFORMATEX { + WORD wFormatTag; + WORD nChannels; + DWORD nSamplesPerSec; + DWORD nAvgBytesPerSec; + WORD nBlockAlign; + WORD wBitsPerSample; + WORD cbSize; +} WAVEFORMATEX, *PWAVEFORMATEX, *NPWAVEFORMATEX, *LPWAVEFORMATEX; +#endif /* _WAVEFORMATEX_ */ + +/* WAVE form wFormatTag IDs */ +#define WAVE_FORMAT_UNKNOWN 0x0000 /* Microsoft Corporation */ +#define WAVE_FORMAT_ADPCM 0x0002 /* Microsoft Corporation */ +#define WAVE_FORMAT_IBM_CVSD 0x0005 /* IBM Corporation */ +#define WAVE_FORMAT_ALAW 0x0006 /* Microsoft Corporation */ +#define WAVE_FORMAT_MULAW 0x0007 /* Microsoft Corporation */ +#define WAVE_FORMAT_OKI_ADPCM 0x0010 /* OKI */ +#define WAVE_FORMAT_DVI_ADPCM 0x0011 /* Intel Corporation */ +#define WAVE_FORMAT_IMA_ADPCM (WAVE_FORMAT_DVI_ADPCM) /* Intel Corporation */ +#define WAVE_FORMAT_MEDIASPACE_ADPCM 0x0012 /* Videologic */ +#define WAVE_FORMAT_SIERRA_ADPCM 0x0013 /* Sierra Semiconductor Corp */ +#define WAVE_FORMAT_G723_ADPCM 0x0014 /* Antex Electronics Corporation */ +#define WAVE_FORMAT_DIGISTD 0x0015 /* DSP Solutions, Inc. */ +#define WAVE_FORMAT_DIGIFIX 0x0016 /* DSP Solutions, Inc. */ +#define WAVE_FORMAT_DIALOGIC_OKI_ADPCM 0x0017 /* Dialogic Corporation */ +#define WAVE_FORMAT_YAMAHA_ADPCM 0x0020 /* Yamaha Corporation of America */ +#define WAVE_FORMAT_SONARC 0x0021 /* Speech Compression */ +#define WAVE_FORMAT_DSPGROUP_TRUESPEECH 0x0022 /* DSP Group, Inc */ +#define WAVE_FORMAT_ECHOSC1 0x0023 /* Echo Speech Corporation */ +#define WAVE_FORMAT_AUDIOFILE_AF36 0x0024 /* */ +#define WAVE_FORMAT_APTX 0x0025 /* Audio Processing Technology */ +#define WAVE_FORMAT_AUDIOFILE_AF10 0x0026 /* */ +#define WAVE_FORMAT_DOLBY_AC2 0x0030 /* Dolby Laboratories */ +#define WAVE_FORMAT_GSM610 0x0031 /* Microsoft Corporation */ +#define WAVE_FORMAT_ANTEX_ADPCME 0x0033 /* Antex Electronics Corporation */ +#define WAVE_FORMAT_CONTROL_RES_VQLPC 0x0034 /* Control Resources Limited */ +#define WAVE_FORMAT_DIGIREAL 0x0035 /* DSP Solutions, Inc. */ +#define WAVE_FORMAT_DIGIADPCM 0x0036 /* DSP Solutions, Inc. */ +#define WAVE_FORMAT_CONTROL_RES_CR10 0x0037 /* Control Resources Limited */ +#define WAVE_FORMAT_NMS_VBXADPCM 0x0038 /* Natural MicroSystems */ +#define WAVE_FORMAT_G721_ADPCM 0x0040 /* Antex Electronics Corporation */ +#define WAVE_FORMAT_MPEG 0x0050 /* Microsoft Corporation */ +#define WAVE_FORMAT_MPEGLAYER3 0x0055 +#define WAVE_FORMAT_CREATIVE_ADPCM 0x0200 /* Creative Labs, Inc */ +#define WAVE_FORMAT_CREATIVE_FASTSPEECH8 0x0202 /* Creative Labs, Inc */ +#define WAVE_FORMAT_CREATIVE_FASTSPEECH10 0x0203 /* Creative Labs, Inc */ +#define WAVE_FORMAT_FM_TOWNS_SND 0x0300 /* Fujitsu Corp. */ +#define WAVE_FORMAT_OLIGSM 0x1000 /* Ing C. Olivetti & C., S.p.A. */ +#define WAVE_FORMAT_OLIADPCM 0x1001 /* Ing C. Olivetti & C., S.p.A. */ +#define WAVE_FORMAT_OLICELP 0x1002 /* Ing C. Olivetti & C., S.p.A. */ +#define WAVE_FORMAT_OLISBC 0x1003 /* Ing C. Olivetti & C., S.p.A. */ +#define WAVE_FORMAT_OLIOPR 0x1004 /* Ing C. Olivetti & C., S.p.A. */ + +#define WAVE_FORMAT_DEVELOPMENT (0xFFFF) + +typedef struct adpcmcoef_tag { + short iCoef1; + short iCoef2; +} ADPCMCOEFSET; +typedef ADPCMCOEFSET *PADPCMCOEFSET, + *NPADPCMCOEFSET, *LPADPCMCOEFSET; + +typedef struct adpcmwaveformat_tag { + WAVEFORMATEX wfx; + WORD wSamplesPerBlock; + WORD wNumCoef; + /* FIXME: this should be aCoef[0] */ + ADPCMCOEFSET aCoef[1]; +} ADPCMWAVEFORMAT; +typedef ADPCMWAVEFORMAT *PADPCMWAVEFORMAT, + *NPADPCMWAVEFORMAT, *LPADPCMWAVEFORMAT; + +typedef struct dvi_adpcmwaveformat_tag { + WAVEFORMATEX wfx; + WORD wSamplesPerBlock; +} DVIADPCMWAVEFORMAT; +typedef DVIADPCMWAVEFORMAT *PDVIADPCMWAVEFORMAT, + *NPDVIADPCMWAVEFORMAT, *LPDVIADPCMWAVEFORMAT; + +typedef struct ima_adpcmwaveformat_tag { + WAVEFORMATEX wfx; + WORD wSamplesPerBlock; +} IMAADPCMWAVEFORMAT; +typedef IMAADPCMWAVEFORMAT *PIMAADPCMWAVEFORMAT, *NPIMAADPCMWAVEFORMAT, + *LPIMAADPCMWAVEFORMAT; + +typedef struct mediaspace_adpcmwaveformat_tag { + WAVEFORMATEX wfx; + WORD wRevision; +} MEDIASPACEADPCMWAVEFORMAT; +typedef MEDIASPACEADPCMWAVEFORMAT *PMEDIASPACEADPCMWAVEFORMAT, + *NPMEDIASPACEADPCMWAVEFORMAT, *LPMEDIASPACEADPCMWAVEFORMAT; + +typedef struct sierra_adpcmwaveformat_tag { + WAVEFORMATEX wfx; + WORD wRevision; +} SIERRAADPCMWAVEFORMAT; +typedef SIERRAADPCMWAVEFORMAT *PSIERRAADPCMWAVEFORMAT, + *NPSIERRAADPCMWAVEFORMAT, *LPSIERRAADPCMWAVEFORMAT; + +typedef struct g723_adpcmwaveformat_tag { + WAVEFORMATEX wfx; + WORD cbExtraSize; + WORD nAuxBlockSize; +} G723_ADPCMWAVEFORMAT; +typedef G723_ADPCMWAVEFORMAT *PG723_ADPCMWAVEFORMAT, + *NPG723_ADPCMWAVEFORMAT, *LPG723_ADPCMWAVEFORMAT; + +typedef struct digistdwaveformat_tag { + WAVEFORMATEX wfx; +} DIGISTDWAVEFORMAT; +typedef DIGISTDWAVEFORMAT *PDIGISTDWAVEFORMAT, + *NPDIGISTDWAVEFORMAT, *LPDIGISTDWAVEFORMAT; + +typedef struct digifixwaveformat_tag { + WAVEFORMATEX wfx; +} DIGIFIXWAVEFORMAT; +typedef DIGIFIXWAVEFORMAT *PDIGIFIXWAVEFORMAT, + *NPDIGIFIXWAVEFORMAT, *LPDIGIFIXWAVEFORMAT; + +typedef struct creative_fastspeechformat_tag { + WAVEFORMATEX ewf; +} DIALOGICOKIADPCMWAVEFORMAT; +typedef DIALOGICOKIADPCMWAVEFORMAT *PDIALOGICOKIADPCMWAVEFORMAT, + *NPDIALOGICOKIADPCMWAVEFORMAT, *LPDIALOGICOKIADPCMWAVEFORMAT; + +typedef struct yamaha_adpmcwaveformat_tag { + WAVEFORMATEX wfx; +} YAMAHA_ADPCMWAVEFORMAT; +typedef YAMAHA_ADPCMWAVEFORMAT *PYAMAHA_ADPCMWAVEFORMAT, + *NPYAMAHA_ADPCMWAVEFORMAT, *LPYAMAHA_ADPCMWAVEFORMAT; + +typedef struct sonarcwaveformat_tag { + WAVEFORMATEX wfx; + WORD wCompType; +} SONARCWAVEFORMAT; +typedef SONARCWAVEFORMAT *PSONARCWAVEFORMAT, + *NPSONARCWAVEFORMAT,*LPSONARCWAVEFORMAT; + +typedef struct truespeechwaveformat_tag { + WAVEFORMATEX wfx; + WORD wRevision; + WORD nSamplesPerBlock; + BYTE abReserved[28]; +} TRUESPEECHWAVEFORMAT; +typedef TRUESPEECHWAVEFORMAT *PTRUESPEECHWAVEFORMAT, + *NPTRUESPEECHWAVEFORMAT, *LPTRUESPEECHWAVEFORMAT; + +typedef struct echosc1waveformat_tag { + WAVEFORMATEX wfx; +} ECHOSC1WAVEFORMAT; +typedef ECHOSC1WAVEFORMAT *PECHOSC1WAVEFORMAT, + *NPECHOSC1WAVEFORMAT, *LPECHOSC1WAVEFORMAT; + +typedef struct audiofile_af36waveformat_tag { + WAVEFORMATEX wfx; +} AUDIOFILE_AF36WAVEFORMAT; +typedef AUDIOFILE_AF36WAVEFORMAT *PAUDIOFILE_AF36WAVEFORMAT, + *NPAUDIOFILE_AF36WAVEFORMAT, *LPAUDIOFILE_AF36WAVEFORMAT; + +typedef struct aptxwaveformat_tag { + WAVEFORMATEX wfx; +} APTXWAVEFORMAT; +typedef APTXWAVEFORMAT *PAPTXWAVEFORMAT, + *NPAPTXWAVEFORMAT, *LPAPTXWAVEFORMAT; + +typedef struct audiofile_af10waveformat_tag { + WAVEFORMATEX wfx; +} AUDIOFILE_AF10WAVEFORMAT; +typedef AUDIOFILE_AF10WAVEFORMAT *PAUDIOFILE_AF10WAVEFORMAT, + *NPAUDIOFILE_AF10WAVEFORMAT, *LPAUDIOFILE_AF10WAVEFORMAT; + +typedef struct dolbyac2waveformat_tag { + WAVEFORMATEX wfx; + WORD nAuxBitsCode; +} DOLBYAC2WAVEFORMAT; + +typedef struct gsm610waveformat_tag { + WAVEFORMATEX wfx; + WORD wSamplesPerBlock; +} GSM610WAVEFORMAT; +typedef GSM610WAVEFORMAT *PGSM610WAVEFORMAT, + *NPGSM610WAVEFORMAT, *LPGSM610WAVEFORMAT; + +typedef struct adpcmewaveformat_tag { + WAVEFORMATEX wfx; + WORD wSamplesPerBlock; +} ADPCMEWAVEFORMAT; +typedef ADPCMEWAVEFORMAT *PADPCMEWAVEFORMAT, + *NPADPCMEWAVEFORMAT, *LPADPCMEWAVEFORMAT; + +typedef struct contres_vqlpcwaveformat_tag { + WAVEFORMATEX wfx; + WORD wSamplesPerBlock; +} CONTRESVQLPCWAVEFORMAT; +typedef CONTRESVQLPCWAVEFORMAT *PCONTRESVQLPCWAVEFORMAT, + *NPCONTRESVQLPCWAVEFORMAT, *LPCONTRESVQLPCWAVEFORMAT; + +typedef struct digirealwaveformat_tag { + WAVEFORMATEX wfx; + WORD wSamplesPerBlock; +} DIGIREALWAVEFORMAT; +typedef DIGIREALWAVEFORMAT *PDIGIREALWAVEFORMAT, + *NPDIGIREALWAVEFORMAT, *LPDIGIREALWAVEFORMAT; + +typedef struct digiadpcmmwaveformat_tag { + WAVEFORMATEX wfx; + WORD wSamplesPerBlock; +} DIGIADPCMWAVEFORMAT; +typedef DIGIADPCMWAVEFORMAT *PDIGIADPCMWAVEFORMAT, + *NPDIGIADPCMWAVEFORMAT, *LPDIGIADPCMWAVEFORMAT; + +typedef struct contres_cr10waveformat_tag { + WAVEFORMATEX wfx; + WORD wSamplesPerBlock; +} CONTRESCR10WAVEFORMAT; +typedef CONTRESCR10WAVEFORMAT *PCONTRESCR10WAVEFORMAT, + *NPCONTRESCR10WAVEFORMAT, *LPCONTRESCR10WAVEFORMAT; + +typedef struct nms_vbxadpcmmwaveformat_tag { + WAVEFORMATEX wfx; + WORD wSamplesPerBlock; +} NMS_VBXADPCMWAVEFORMAT; +typedef NMS_VBXADPCMWAVEFORMAT *PNMS_VBXADPCMWAVEFORMAT, + *NPNMS_VBXADPCMWAVEFORMAT, *LPNMS_VBXADPCMWAVEFORMAT; + +typedef struct g721_adpcmwaveformat_tag { + WAVEFORMATEX wfx; + WORD nAuxBlockSize; +} G721_ADPCMWAVEFORMAT; +typedef G721_ADPCMWAVEFORMAT *PG721_ADPCMWAVEFORMAT, + *NG721_ADPCMWAVEFORMAT, *LPG721_ADPCMWAVEFORMAT; + +typedef struct creative_adpcmwaveformat_tag { + WAVEFORMATEX wfx; + WORD wRevision; +} CREATIVEADPCMWAVEFORMAT; +typedef CREATIVEADPCMWAVEFORMAT *PCREATIVEADPCMWAVEFORMAT, + *NPCREATIVEADPCMWAVEFORMAT, *LPCREATIVEADPCMWAVEFORMAT; + +typedef struct creative_fastspeech8format_tag { + WAVEFORMATEX wfx; + WORD wRevision; +} CREATIVEFASTSPEECH8WAVEFORMAT; +typedef CREATIVEFASTSPEECH8WAVEFORMAT *PCREATIVEFASTSPEECH8WAVEFORMAT, + *NPCREATIVEFASTSPEECH8WAVEFORMAT, *LPCREATIVEFASTSPEECH8WAVEFORMAT; + +typedef struct creative_fastspeech10format_tag { + WAVEFORMATEX wfx; + WORD wRevision; +} CREATIVEFASTSPEECH10WAVEFORMAT; +typedef CREATIVEFASTSPEECH10WAVEFORMAT *PCREATIVEFASTSPEECH10WAVEFORMAT, + *NPCREATIVEFASTSPEECH10WAVEFORMAT, *LPCREATIVEFASTSPEECH10WAVEFORMAT; + +typedef struct fmtowns_snd_waveformat_tag { + WAVEFORMATEX wfx; + WORD wRevision; +} FMTOWNS_SND_WAVEFORMAT; +typedef FMTOWNS_SND_WAVEFORMAT *PFMTOWNS_SND_WAVEFORMAT, + *NPFMTOWNS_SND_WAVEFORMAT, *LPFMTOWNS_SND_WAVEFORMAT; + +typedef struct oligsmwaveformat_tag { + WAVEFORMATEX wfx; +} OLIGSMWAVEFORMAT; +typedef OLIGSMWAVEFORMAT *POLIGSMWAVEFORMAT, + *NPOLIGSMWAVEFORMAT, *LPOLIGSMWAVEFORMAT; + +typedef struct oliadpcmwaveformat_tag { + WAVEFORMATEX wfx; +} OLIADPCMWAVEFORMAT; +typedef OLIADPCMWAVEFORMAT *POLIADPCMWAVEFORMAT, + *NPOLIADPCMWAVEFORMAT, *LPOLIADPCMWAVEFORMAT; + +typedef struct olicelpwaveformat_tag { + WAVEFORMATEX wfx; +} OLICELPWAVEFORMAT; +typedef OLICELPWAVEFORMAT *POLICELPWAVEFORMAT, + *NPOLICELPWAVEFORMAT, *LPOLICELPWAVEFORMAT; + +typedef struct olisbcwaveformat_tag { + WAVEFORMATEX wfx; +} OLISBCWAVEFORMAT; +typedef OLISBCWAVEFORMAT *POLISBCWAVEFORMAT, + *NPOLISBCWAVEFORMAT, *LPOLISBCWAVEFORMAT; + +typedef struct olioprwaveformat_tag { + WAVEFORMATEX wfx; +} OLIOPRWAVEFORMAT; +typedef OLIOPRWAVEFORMAT *POLIOPRWAVEFORMAT, + *NPOLIOPRWAVEFORMAT, *LPOLIOPRWAVEFORMAT; + +typedef struct csimaadpcmwaveformat_tag { + WAVEFORMATEX wfx; +} CSIMAADPCMWAVEFORMAT; +typedef CSIMAADPCMWAVEFORMAT *PCSIMAADPCMWAVEFORMAT, + *NPCSIMAADPCMWAVEFORMAT, *LPCSIMAADPCMWAVEFORMAT; + +typedef struct +{ + WAVEFORMATEX wfx; + WORD fwHeadLayer; + DWORD dwHeadBitrate; + WORD fwHeadMode; + WORD fwHeadModeExt; + WORD wHeadEmphasis; + WORD fwHeadFlags; + DWORD dwPTSLow; + DWORD dwPTSHigh; +} MPEG1WAVEFORMAT,* PMPEG1WAVEFORMAT; + +#define ACM_MPEG_LAYER1 0x0001 +#define ACM_MPEG_LAYER2 0x0002 +#define ACM_MPEG_LAYER3 0x0004 + +#define ACM_MPEG_STEREO 0x0001 +#define ACM_MPEG_JOINTSTEREO 0x0002 +#define ACM_MPEG_DUALCHANNEL 0x0004 +#define ACM_MPEG_SINGLECHANNEL 0x0008 +#define ACM_MPEG_PRIVATEBIT 0x0001 +#define ACM_MPEG_COPYRIGHT 0x0002 +#define ACM_MPEG_ORIGINALHOME 0x0004 +#define ACM_MPEG_PROTECTIONBIT 0x0008 +#define ACM_MPEG_ID_MPEG1 0x0010 + +typedef struct +{ + WAVEFORMATEX wfx; + WORD wID; + DWORD fdwFlags; + WORD nBlockSize; + WORD nFramesPerBlock; + WORD nCodecDelay; +} MPEGLAYER3WAVEFORMAT; + +#define MPEGLAYER3_WFX_EXTRA_BYTES 12 + +#define MPEGLAYER3_ID_UNKNOWN 0 +#define MPEGLAYER3_ID_MPEG 1 +#define MPEGLAYER3_ID_CONSTANTFRAMESIZE 2 + +#define MPEGLAYER3_FLAG_PADDING_ISO 0x00000000 +#define MPEGLAYER3_FLAG_PADDING_ON 0x00000001 +#define MPEGLAYER3_FLAG_PADDING_OFF 0x00000002 + +#endif /* __WINE_MMREG_H */ diff --git a/reactos/include/wine/msacm.h b/reactos/include/wine/msacm.h new file mode 100644 index 00000000000..8e9c85b10a2 --- /dev/null +++ b/reactos/include/wine/msacm.h @@ -0,0 +1,779 @@ +/* + * Declarations for MSACM + * + * Copyright (C) the Wine project + * + * 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_MSACM_H +#define __WINE_MSACM_H + +#ifdef __cplusplus +extern "C" { +#endif /* defined(__cplusplus) */ + +#define ACMAPI WINAPI + +/*********************************************************************** + * Defines/Enums + */ +#define ACMERR_BASE 512 +#define ACMERR_NOTPOSSIBLE (ACMERR_BASE + 0) +#define ACMERR_BUSY (ACMERR_BASE + 1) +#define ACMERR_UNPREPARED (ACMERR_BASE + 2) +#define ACMERR_CANCELED (ACMERR_BASE + 3) + +#define MM_ACM_OPEN MM_STREAM_OPEN +#define MM_ACM_CLOSE MM_STREAM_CLOSE +#define MM_ACM_DONE MM_STREAM_DONE + +#define ACM_DRIVERADDF_FUNCTION 0x00000003L +#define ACM_DRIVERADDF_NOTIFYHWND 0x00000004L +#define ACM_DRIVERADDF_TYPEMASK 0x00000007L +#define ACM_DRIVERADDF_LOCAL 0x00000000L +#define ACM_DRIVERADDF_GLOBAL 0x00000008L + +#define ACMDRIVERDETAILS_SHORTNAME_CHARS 32 +#define ACMDRIVERDETAILS_LONGNAME_CHARS 128 +#define ACMDRIVERDETAILS_COPYRIGHT_CHARS 80 +#define ACMDRIVERDETAILS_LICENSING_CHARS 128 +#define ACMDRIVERDETAILS_FEATURES_CHARS 512 + +#define ACMDRIVERDETAILS_FCCTYPE_AUDIOCODEC mmioFOURCC('a', 'u', 'd', 'c') +#define ACMDRIVERDETAILS_FCCCOMP_UNDEFINED mmioFOURCC('\0', '\0', '\0', '\0') + +#define ACMDRIVERDETAILS_SUPPORTF_CODEC 0x00000001L +#define ACMDRIVERDETAILS_SUPPORTF_CONVERTER 0x00000002L +#define ACMDRIVERDETAILS_SUPPORTF_FILTER 0x00000004L +#define ACMDRIVERDETAILS_SUPPORTF_HARDWARE 0x00000008L +#define ACMDRIVERDETAILS_SUPPORTF_ASYNC 0x00000010L +#define ACMDRIVERDETAILS_SUPPORTF_LOCAL 0x40000000L +#define ACMDRIVERDETAILS_SUPPORTF_DISABLED 0x80000000L + +#define ACM_DRIVERENUMF_NOLOCAL 0x40000000L +#define ACM_DRIVERENUMF_DISABLED 0x80000000L + +#define ACM_DRIVERPRIORITYF_ENABLE 0x00000001L +#define ACM_DRIVERPRIORITYF_DISABLE 0x00000002L +#define ACM_DRIVERPRIORITYF_ABLEMASK 0x00000003L +#define ACM_DRIVERPRIORITYF_BEGIN 0x00010000L +#define ACM_DRIVERPRIORITYF_END 0x00020000L +#define ACM_DRIVERPRIORITYF_DEFERMASK 0x00030000L + +#define MM_ACM_FILTERCHOOSE 0x8000 + +#define FILTERCHOOSE_MESSAGE 0 +#define FILTERCHOOSE_FILTERTAG_VERIFY (FILTERCHOOSE_MESSAGE+0) +#define FILTERCHOOSE_FILTER_VERIFY (FILTERCHOOSE_MESSAGE+1) +#define FILTERCHOOSE_CUSTOM_VERIFY (FILTERCHOOSE_MESSAGE+2) + +#define ACMFILTERCHOOSE_STYLEF_SHOWHELP 0x00000004L +#define ACMFILTERCHOOSE_STYLEF_ENABLEHOOK 0x00000008L +#define ACMFILTERCHOOSE_STYLEF_ENABLETEMPLATE 0x00000010L +#define ACMFILTERCHOOSE_STYLEF_ENABLETEMPLATEHANDLE 0x00000020L +#define ACMFILTERCHOOSE_STYLEF_INITTOFILTERSTRUCT 0x00000040L +#define ACMFILTERCHOOSE_STYLEF_CONTEXTHELP 0x00000080L + +#define ACMFILTERDETAILS_FILTER_CHARS 128 + +#define ACM_FILTERDETAILSF_INDEX 0x00000000L +#define ACM_FILTERDETAILSF_FILTER 0x00000001L +#define ACM_FILTERDETAILSF_QUERYMASK 0x0000000FL + +#define ACMFILTERTAGDETAILS_FILTERTAG_CHARS 48 + +#define ACM_FILTERTAGDETAILSF_INDEX 0x00000000L +#define ACM_FILTERTAGDETAILSF_FILTERTAG 0x00000001L +#define ACM_FILTERTAGDETAILSF_LARGESTSIZE 0x00000002L +#define ACM_FILTERTAGDETAILSF_QUERYMASK 0x0000000FL + +#define ACM_FILTERENUMF_DWFILTERTAG 0x00010000L + +#define ACMHELPMSGSTRINGA "acmchoose_help" +#if defined(__GNUC__) +# define ACMHELPMSGSTRINGW (const WCHAR []){ 'a','c','m', \ + 'c','h','o','o','s','e','_','h','e','l','p',0 } +#elif defined(_MSC_VER) +# define ACMHELPMSGSTRINGW L"acmchoose_help" +#else +static const WCHAR ACMHELPMSGSTRINGW[] = { 'a','c','m', + 'c','h','o','o','s','e','_','h','e','l','p',0 }; +#endif +#define ACMHELPMSGSTRING WINELIB_NAME_AW(ACMHELPMSGSTRING) + +#define ACMHELPMSGCONTEXTMENUA "acmchoose_contextmenu" +#if defined(__GNUC__) +# define ACMHELPMSGCONTEXTMENUW (const WCHAR []){ 'a','c','m', \ + 'c','h','o','o','s','e','_','c','o','n','t','e','x','t','m','e','n','u',0 } +#elif defined(_MSC_VER) +# define ACMHELPMSGCONTEXTMENUW L"acmchoose_contextmenu" +#else +static const WCHAR ACMHELPMSGCONTEXTMENUW[] = { 'a','c','m', + 'c','h','o','o','s','e','_','c','o','n','t','e','x','t','m','e','n','u',0 }; +#endif +#define ACMHELPMSGCONTEXTMENU WINELIB_NAME_AW(ACMHELPMSGCONTEXTMENU) + +#define ACMHELPMSGCONTEXTHELPA "acmchoose_contexthelp" +#if defined(__GNUC__) +# define ACMHELPMSGCONTEXTHELPW (const WCHAR []){ 'a','c','m', \ + 'c','h','o','o','s','e','_','c','o','n','t','e','x','t','h','e','l','p',0 } +#elif defined(_MSC_VER) +# define ACMHELPMSGCONTEXTHELPW L"acmchoose_contexthelp" +#else +static const WCHAR ACMHELPMSGCONTEXTHELPW[] = { 'a','c','m', + 'c','h','o','o','s','e','_','c','o','n','t','e','x','t','h','e','l','p',0 }; +#endif +#define ACMHELPMSGCONTEXTHELP WINELIB_NAME_AW(ACMHELPMSGCONTEXTHELP) + +#define MM_ACM_FORMATCHOOSE 0x8000 + +#define FORMATCHOOSE_MESSAGE 0 +#define FORMATCHOOSE_FORMATTAG_VERIFY (FORMATCHOOSE_MESSAGE+0) +#define FORMATCHOOSE_FORMAT_VERIFY (FORMATCHOOSE_MESSAGE+1) +#define FORMATCHOOSE_CUSTOM_VERIFY (FORMATCHOOSE_MESSAGE+2) + +#define ACMFORMATCHOOSE_STYLEF_SHOWHELP 0x00000004L +#define ACMFORMATCHOOSE_STYLEF_ENABLEHOOK 0x00000008L +#define ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATE 0x00000010L +#define ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATEHANDLE 0x00000020L +#define ACMFORMATCHOOSE_STYLEF_INITTOWFXSTRUCT 0x00000040L +#define ACMFORMATCHOOSE_STYLEF_CONTEXTHELP 0x00000080L + +#define ACMFORMATDETAILS_FORMAT_CHARS 128 + +#define ACM_FORMATDETAILSF_INDEX 0x00000000L +#define ACM_FORMATDETAILSF_FORMAT 0x00000001L +#define ACM_FORMATDETAILSF_QUERYMASK 0x0000000FL + +#define ACM_FORMATENUMF_WFORMATTAG 0x00010000L +#define ACM_FORMATENUMF_NCHANNELS 0x00020000L +#define ACM_FORMATENUMF_NSAMPLESPERSEC 0x00040000L +#define ACM_FORMATENUMF_WBITSPERSAMPLE 0x00080000L +#define ACM_FORMATENUMF_CONVERT 0x00100000L +#define ACM_FORMATENUMF_SUGGEST 0x00200000L +#define ACM_FORMATENUMF_HARDWARE 0x00400000L +#define ACM_FORMATENUMF_INPUT 0x00800000L +#define ACM_FORMATENUMF_OUTPUT 0x01000000L + +#define ACM_FORMATSUGGESTF_WFORMATTAG 0x00010000L +#define ACM_FORMATSUGGESTF_NCHANNELS 0x00020000L +#define ACM_FORMATSUGGESTF_NSAMPLESPERSEC 0x00040000L +#define ACM_FORMATSUGGESTF_WBITSPERSAMPLE 0x00080000L +#define ACM_FORMATSUGGESTF_TYPEMASK 0x00FF0000L + +#define ACMFORMATTAGDETAILS_FORMATTAG_CHARS 48 + +#define ACM_FORMATTAGDETAILSF_INDEX 0x00000000L +#define ACM_FORMATTAGDETAILSF_FORMATTAG 0x00000001L +#define ACM_FORMATTAGDETAILSF_LARGESTSIZE 0x00000002L +#define ACM_FORMATTAGDETAILSF_QUERYMASK 0x0000000FL + +#define ACM_METRIC_COUNT_DRIVERS 1 +#define ACM_METRIC_COUNT_CODECS 2 +#define ACM_METRIC_COUNT_CONVERTERS 3 +#define ACM_METRIC_COUNT_FILTERS 4 +#define ACM_METRIC_COUNT_DISABLED 5 +#define ACM_METRIC_COUNT_HARDWARE 6 +#define ACM_METRIC_COUNT_LOCAL_DRIVERS 20 +#define ACM_METRIC_COUNT_LOCAL_CODECS 21 +#define ACM_METRIC_COUNT_LOCAL_CONVERTERS 22 +#define ACM_METRIC_COUNT_LOCAL_FILTERS 23 +#define ACM_METRIC_COUNT_LOCAL_DISABLED 24 +#define ACM_METRIC_HARDWARE_WAVE_INPUT 30 +#define ACM_METRIC_HARDWARE_WAVE_OUTPUT 31 +#define ACM_METRIC_MAX_SIZE_FORMAT 50 +#define ACM_METRIC_MAX_SIZE_FILTER 51 +#define ACM_METRIC_DRIVER_SUPPORT 100 +#define ACM_METRIC_DRIVER_PRIORITY 101 + +#define ACM_STREAMCONVERTF_BLOCKALIGN 0x00000004 +#define ACM_STREAMCONVERTF_START 0x00000010 +#define ACM_STREAMCONVERTF_END 0x00000020 + +#define ACMSTREAMHEADER_STATUSF_DONE 0x00010000L +#define ACMSTREAMHEADER_STATUSF_PREPARED 0x00020000L +#define ACMSTREAMHEADER_STATUSF_INQUEUE 0x00100000L + +#define ACM_STREAMOPENF_QUERY 0x00000001 +#define ACM_STREAMOPENF_ASYNC 0x00000002 +#define ACM_STREAMOPENF_NONREALTIME 0x00000004 + +#define ACM_STREAMSIZEF_SOURCE 0x00000000L +#define ACM_STREAMSIZEF_DESTINATION 0x00000001L +#define ACM_STREAMSIZEF_QUERYMASK 0x0000000FL + +#define ACMDM_USER (DRV_USER + 0x0000) +#define ACMDM_RESERVED_LOW (DRV_USER + 0x2000) +#define ACMDM_RESERVED_HIGH (DRV_USER + 0x2FFF) + +#define ACMDM_BASE ACMDM_RESERVED_LOW + +#define ACMDM_DRIVER_ABOUT (ACMDM_BASE + 11) + +/* handles */ + +DECLARE_HANDLE(HACMDRIVERID); +DECLARE_HANDLE(HACMDRIVER); +DECLARE_HANDLE(HACMSTREAM); +DECLARE_HANDLE(HACMOBJ); +typedef HACMDRIVERID *PHACMDRIVERID, *LPHACMDRIVERID; +typedef HACMDRIVER *PHACMDRIVER, *LPHACMDRIVER; +typedef HACMSTREAM *PHACMSTREAM, *LPHACMSTREAM; +typedef HACMOBJ *PHACMOBJ, *LPHACMOBJ; + +/*********************************************************************** + * Callbacks + */ + +typedef BOOL (CALLBACK *ACMDRIVERENUMCB)( + HACMDRIVERID hadid, DWORD dwInstance, DWORD fdwSupport +); + +typedef UINT (CALLBACK *ACMFILTERCHOOSEHOOKPROCA)( + HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam +); + +typedef UINT (CALLBACK *ACMFILTERCHOOSEHOOKPROCW)( + HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam +); +#define ACMFILTERCHOOSEHOOKPROC WINELIB_NAME_AW(ACMFILTERCHOOSEHOOKPROC) + +typedef UINT (CALLBACK *ACMFORMATCHOOSEHOOKPROCA)( + HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam +); + +typedef UINT (CALLBACK *ACMFORMATCHOOSEHOOKPROCW)( + HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam +); +#define ACMFORMATCHOOSEHOOKPROC WINELIB_NAME_AW(ACMFORMATCHOOSEHOOKPROC) + +/*********************************************************************** + * Structures + */ + +typedef struct _ACMDRIVERDETAILSA +{ + DWORD cbStruct; + + FOURCC fccType; + FOURCC fccComp; + + WORD wMid; + WORD wPid; + + DWORD vdwACM; + DWORD vdwDriver; + + DWORD fdwSupport; + DWORD cFormatTags; + DWORD cFilterTags; + + HICON 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]; +} ACMDRIVERDETAILSA, *PACMDRIVERDETAILSA, *LPACMDRIVERDETAILSA; + +typedef struct _ACMDRIVERDETAILSW +{ + DWORD cbStruct; + + FOURCC fccType; + FOURCC fccComp; + + WORD wMid; + WORD wPid; + + DWORD vdwACM; + DWORD vdwDriver; + + DWORD fdwSupport; + DWORD cFormatTags; + DWORD cFilterTags; + + HICON hicon; + + WCHAR szShortName[ACMDRIVERDETAILS_SHORTNAME_CHARS]; + WCHAR szLongName[ACMDRIVERDETAILS_LONGNAME_CHARS]; + WCHAR szCopyright[ACMDRIVERDETAILS_COPYRIGHT_CHARS]; + WCHAR szLicensing[ACMDRIVERDETAILS_LICENSING_CHARS]; + WCHAR szFeatures[ACMDRIVERDETAILS_FEATURES_CHARS]; +} ACMDRIVERDETAILSW, *PACMDRIVERDETAILSW, *LPACMDRIVERDETAILSW; + +DECL_WINELIB_TYPE_AW(ACMDRIVERDETAILS) +DECL_WINELIB_TYPE_AW(PACMDRIVERDETAILS) +DECL_WINELIB_TYPE_AW(LPACMDRIVERDETAILS) + +typedef struct _ACMFILTERCHOOSEA +{ + DWORD cbStruct; + DWORD fdwStyle; + + HWND hwndOwner; + + PWAVEFILTER pwfltr; + DWORD cbwfltr; + + LPCSTR pszTitle; + + CHAR szFilterTag[ACMFILTERTAGDETAILS_FILTERTAG_CHARS]; + CHAR szFilter[ACMFILTERDETAILS_FILTER_CHARS]; + LPSTR pszName; + DWORD cchName; + + DWORD fdwEnum; + PWAVEFILTER pwfltrEnum; + + HINSTANCE hInstance; + LPCSTR pszTemplateName; + LPARAM lCustData; + ACMFILTERCHOOSEHOOKPROCA pfnHook; +} ACMFILTERCHOOSEA, *PACMFILTERCHOOSEA, *LPACMFILTERCHOOSEA; + +typedef struct _ACMFILTERCHOOSEW +{ + DWORD cbStruct; + DWORD fdwStyle; + + HWND hwndOwner; + + PWAVEFILTER pwfltr; + DWORD cbwfltr; + + LPCWSTR pszTitle; + + WCHAR szFilterTag[ACMFILTERTAGDETAILS_FILTERTAG_CHARS]; + WCHAR szFilter[ACMFILTERDETAILS_FILTER_CHARS]; + LPWSTR pszName; + DWORD cchName; + + DWORD fdwEnum; + PWAVEFILTER pwfltrEnum; + + HINSTANCE hInstance; + LPCWSTR pszTemplateName; + LPARAM lCustData; + ACMFILTERCHOOSEHOOKPROCW pfnHook; +} ACMFILTERCHOOSEW, *PACMFILTERCHOOSEW, *LPACMFILTERCHOOSEW; + +DECL_WINELIB_TYPE_AW(ACMFILTERCHOOSE) +DECL_WINELIB_TYPE_AW(PACMFILTERCHOOSE) +DECL_WINELIB_TYPE_AW(LPACMFILTERCHOOSE) + +typedef struct _ACMFILTERDETAILSA +{ + DWORD cbStruct; + DWORD dwFilterIndex; + DWORD dwFilterTag; + DWORD fdwSupport; + PWAVEFILTER pwfltr; + DWORD cbwfltr; + CHAR szFilter[ACMFILTERDETAILS_FILTER_CHARS]; +} ACMFILTERDETAILSA, *PACMFILTERDETAILSA, *LPACMFILTERDETAILSA; + +typedef struct _ACMFILTERDETAILSW +{ + DWORD cbStruct; + DWORD dwFilterIndex; + DWORD dwFilterTag; + DWORD fdwSupport; + PWAVEFILTER pwfltr; + DWORD cbwfltr; + WCHAR szFilter[ACMFILTERDETAILS_FILTER_CHARS]; +} ACMFILTERDETAILSW, *PACMFILTERDETAILSW, *LPACMFILTERDETAILSW; + +DECL_WINELIB_TYPE_AW(ACMFILTERDETAILS) +DECL_WINELIB_TYPE_AW(PACMFILTERDETAILS) +DECL_WINELIB_TYPE_AW(LPACMFILTERDETAILS) + +typedef struct _ACMFILTERTAGDETAILSA +{ + DWORD cbStruct; + DWORD dwFilterTagIndex; + DWORD dwFilterTag; + DWORD cbFilterSize; + DWORD fdwSupport; + DWORD cStandardFilters; + CHAR szFilterTag[ACMFILTERTAGDETAILS_FILTERTAG_CHARS]; +} ACMFILTERTAGDETAILSA, *PACMFILTERTAGDETAILSA, *LPACMFILTERTAGDETAILSA; + +typedef struct _ACMFILTERTAGDETAILSW +{ + DWORD cbStruct; + DWORD dwFilterTagIndex; + DWORD dwFilterTag; + DWORD cbFilterSize; + DWORD fdwSupport; + DWORD cStandardFilters; + WCHAR szFilterTag[ACMFILTERTAGDETAILS_FILTERTAG_CHARS]; +} ACMFILTERTAGDETAILSW, *PACMFILTERTAGDETAILSW, *LPACMFILTERTAGDETAILSW; + +DECL_WINELIB_TYPE_AW(ACMFILTERTAGDETAILS) +DECL_WINELIB_TYPE_AW(PACMFILTERTAGDETAILS) +DECL_WINELIB_TYPE_AW(LPACMFILTERTAGDETAILS) + +typedef struct _ACMFORMATCHOOSEA +{ + DWORD cbStruct; + DWORD fdwStyle; + + HWND hwndOwner; + + PWAVEFORMATEX pwfx; + DWORD cbwfx; + LPCSTR pszTitle; + + CHAR szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS]; + CHAR szFormat[ACMFORMATDETAILS_FORMAT_CHARS]; + + LPSTR pszName; + DWORD cchName; + + DWORD fdwEnum; + PWAVEFORMATEX pwfxEnum; + + HINSTANCE hInstance; + LPCSTR pszTemplateName; + LPARAM lCustData; + ACMFORMATCHOOSEHOOKPROCA pfnHook; +} ACMFORMATCHOOSEA, *PACMFORMATCHOOSEA, *LPACMFORMATCHOOSEA; + +typedef struct _ACMFORMATCHOOSEW +{ + DWORD cbStruct; + DWORD fdwStyle; + + HWND hwndOwner; + + PWAVEFORMATEX pwfx; + DWORD cbwfx; + LPCWSTR pszTitle; + + WCHAR szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS]; + WCHAR szFormat[ACMFORMATDETAILS_FORMAT_CHARS]; + + LPWSTR pszName; + DWORD cchName; + + DWORD fdwEnum; + LPWAVEFORMATEX pwfxEnum; + + HINSTANCE hInstance; + LPCWSTR pszTemplateName; + LPARAM lCustData; + ACMFORMATCHOOSEHOOKPROCW pfnHook; +} ACMFORMATCHOOSEW, *PACMFORMATCHOOSEW, *LPACMFORMATCHOOSEW; + +DECL_WINELIB_TYPE_AW(ACMFORMATCHOOSE) +DECL_WINELIB_TYPE_AW(PACMFORMATCHOOSE) +DECL_WINELIB_TYPE_AW(LPACMFORMATCHOOSE) + +typedef struct _ACMFORMATDETAILSA +{ + DWORD cbStruct; + DWORD dwFormatIndex; + DWORD dwFormatTag; + DWORD fdwSupport; + PWAVEFORMATEX pwfx; + DWORD cbwfx; + CHAR szFormat[ACMFORMATDETAILS_FORMAT_CHARS]; +} ACMFORMATDETAILSA, *PACMFORMATDETAILSA, *LPACMFORMATDETAILSA; + +typedef struct _ACMFORMATDETAILSW +{ + DWORD cbStruct; + DWORD dwFormatIndex; + DWORD dwFormatTag; + DWORD fdwSupport; + PWAVEFORMATEX pwfx; + DWORD cbwfx; + WCHAR szFormat[ACMFORMATDETAILS_FORMAT_CHARS]; +} ACMFORMATDETAILSW, *PACMFORMATDETAILSW, *LPACMFORMATDETAILSW; + +DECL_WINELIB_TYPE_AW(ACMFORMATDETAILS) +DECL_WINELIB_TYPE_AW(PACMFORMATDETAILS) +DECL_WINELIB_TYPE_AW(LPACMFORMATDETAILS) + +typedef struct _ACMFORMATTAGDETAILSA +{ + DWORD cbStruct; + DWORD dwFormatTagIndex; + DWORD dwFormatTag; + DWORD cbFormatSize; + DWORD fdwSupport; + DWORD cStandardFormats; + CHAR szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS]; +} ACMFORMATTAGDETAILSA, *PACMFORMATTAGDETAILSA, *LPACMFORMATTAGDETAILSA; + +typedef struct _ACMFORMATTAGDETAILSW +{ + DWORD cbStruct; + DWORD dwFormatTagIndex; + DWORD dwFormatTag; + DWORD cbFormatSize; + DWORD fdwSupport; + DWORD cStandardFormats; + WCHAR szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS]; +} ACMFORMATTAGDETAILSW, *PACMFORMATTAGDETAILSW, *LPACMFORMATTAGDETAILSW; + +DECL_WINELIB_TYPE_AW(ACMFORMATTAGDETAILS) +DECL_WINELIB_TYPE_AW(PACMFORMATTAGDETAILS) +DECL_WINELIB_TYPE_AW(LPACMFORMATTAGDETAILS) + +typedef struct _ACMSTREAMHEADER +{ + DWORD cbStruct; + DWORD fdwStatus; + DWORD dwUser; + LPBYTE pbSrc; + DWORD cbSrcLength; + DWORD cbSrcLengthUsed; + DWORD dwSrcUser; + LPBYTE pbDst; + DWORD cbDstLength; + DWORD cbDstLengthUsed; + DWORD dwDstUser; + DWORD dwReservedDriver[10]; +} ACMSTREAMHEADER, *PACMSTREAMHEADER, *LPACMSTREAMHEADER; + +/*********************************************************************** + * Callbacks 2 + */ + +typedef BOOL (CALLBACK *ACMFILTERENUMCBA)( + HACMDRIVERID hadid, PACMFILTERDETAILSA pafd, + DWORD dwInstance, DWORD fdwSupport +); + +typedef BOOL (CALLBACK *ACMFILTERENUMCBW)( + HACMDRIVERID hadid, PACMFILTERDETAILSW pafd, + DWORD dwInstance, DWORD fdwSupport +); + +#define ACMFILTERENUMCB WINELIB_NAME_AW(ACMFILTERENUMCB) + +typedef BOOL (CALLBACK *ACMFILTERTAGENUMCBA)( + HACMDRIVERID hadid, PACMFILTERTAGDETAILSA paftd, + DWORD dwInstance, DWORD fdwSupport +); + +typedef BOOL (CALLBACK *ACMFILTERTAGENUMCBW)( + HACMDRIVERID hadid, PACMFILTERTAGDETAILSW paftd, + DWORD dwInstance, DWORD fdwSupport +); + +#define ACMFILTERTAGENUMCB WINELIB_NAME_AW(ACMFILTERTAGENUMCB) + +typedef BOOL (CALLBACK *ACMFORMATENUMCBA)( + HACMDRIVERID hadid, PACMFORMATDETAILSA pafd, + DWORD dwInstance, DWORD fdwSupport +); + +typedef BOOL (CALLBACK *ACMFORMATENUMCBW)( + HACMDRIVERID hadid, PACMFORMATDETAILSW pafd, + DWORD dwInstance, DWORD fdwSupport +); + +#define ACMFORMATENUMCB WINELIB_NAME_AW(ACMFORMATENUMCB) + +typedef BOOL (CALLBACK *ACMFORMATTAGENUMCBA)( + HACMDRIVERID hadid, PACMFORMATTAGDETAILSA paftd, + DWORD dwInstance, DWORD fdwSupport +); + +typedef BOOL (CALLBACK *ACMFORMATTAGENUMCBW)( + HACMDRIVERID hadid, PACMFORMATTAGDETAILSW paftd, + DWORD dwInstance, DWORD fdwSupport +); + +#define ACMFORMATTAGENUMCB WINELIB_NAME_AW(ACMFORMATTAGENUMCB) + +/*********************************************************************** + * Functions - Win32 + */ + +MMRESULT WINAPI acmDriverAddA( + PHACMDRIVERID phadid, HINSTANCE hinstModule, + LPARAM lParam, DWORD dwPriority, DWORD fdwAdd +); +MMRESULT WINAPI acmDriverAddW( + PHACMDRIVERID phadid, HINSTANCE hinstModule, + LPARAM lParam, DWORD dwPriority, DWORD fdwAdd +); +#define acmDriverAdd WINELIB_NAME_AW(acmDriverAdd) + +MMRESULT WINAPI acmDriverClose( + HACMDRIVER had, DWORD fdwClose +); +MMRESULT WINAPI acmDriverDetailsA( + HACMDRIVERID hadid, PACMDRIVERDETAILSA padd, DWORD fdwDetails +); +MMRESULT WINAPI acmDriverDetailsW( + HACMDRIVERID hadid, PACMDRIVERDETAILSW padd, DWORD fdwDetails +); +#define acmDriverDetails WINELIB_NAME_AW(acmDriverDetails) + +MMRESULT WINAPI acmDriverEnum( + ACMDRIVERENUMCB fnCallback, DWORD dwInstance, DWORD fdwEnum +); +MMRESULT WINAPI acmDriverID( + HACMOBJ hao, PHACMDRIVERID phadid, DWORD fdwDriverID +); +LRESULT WINAPI acmDriverMessage( + HACMDRIVER had, UINT uMsg, LPARAM lParam1, LPARAM lParam2 +); +MMRESULT WINAPI acmDriverOpen( + PHACMDRIVER phad, HACMDRIVERID hadid, DWORD fdwOpen +); +MMRESULT WINAPI acmDriverPriority( + HACMDRIVERID hadid, DWORD dwPriority, DWORD fdwPriority +); +MMRESULT WINAPI acmDriverRemove( + HACMDRIVERID hadid, DWORD fdwRemove +); +MMRESULT WINAPI acmFilterChooseA( + PACMFILTERCHOOSEA pafltrc +); +MMRESULT WINAPI acmFilterChooseW( + PACMFILTERCHOOSEW pafltrc +); +#define acmFilterChoose WINELIB_NAME_AW(acmFilterChoose) + +MMRESULT WINAPI acmFilterDetailsA( + HACMDRIVER had, PACMFILTERDETAILSA pafd, DWORD fdwDetails +); +MMRESULT WINAPI acmFilterDetailsW( + HACMDRIVER had, PACMFILTERDETAILSW pafd, DWORD fdwDetails +); +#define acmFilterDetails WINELIB_NAME_AW(acmFilterDetails) + +MMRESULT WINAPI acmFilterEnumA( + HACMDRIVER had, PACMFILTERDETAILSA pafd, + ACMFILTERENUMCBA fnCallback, DWORD dwInstance, DWORD fdwEnum +); +MMRESULT WINAPI acmFilterEnumW( + HACMDRIVER had, PACMFILTERDETAILSW pafd, + ACMFILTERENUMCBW fnCallback, DWORD dwInstance, DWORD fdwEnum +); +#define acmFilterEnum WINELIB_NAME_AW(acmFilterEnum) + +MMRESULT WINAPI acmFilterTagDetailsA( + HACMDRIVER had, PACMFILTERTAGDETAILSA paftd, DWORD fdwDetails +); +MMRESULT WINAPI acmFilterTagDetailsW( + HACMDRIVER had, PACMFILTERTAGDETAILSW paftd, DWORD fdwDetails +); +#define acmFilterTagDetails WINELIB_NAME_AW(acmFilterTagDetails) + +MMRESULT WINAPI acmFilterTagEnumA( + HACMDRIVER had, PACMFILTERTAGDETAILSA paftd, + ACMFILTERTAGENUMCBA fnCallback, DWORD dwInstance, DWORD fdwEnum +); +MMRESULT WINAPI acmFilterTagEnumW( + HACMDRIVER had, PACMFILTERTAGDETAILSW paftd, + ACMFILTERTAGENUMCBW fnCallback, DWORD dwInstance, DWORD fdwEnum +); +#define acmFilterTagEnum WINELIB_NAME_AW(acmFilterTagEnum) + +MMRESULT WINAPI acmFormatChooseA( + PACMFORMATCHOOSEA pafmtc +); +MMRESULT WINAPI acmFormatChooseW( + PACMFORMATCHOOSEW pafmtc +); +#define acmFormatChoose WINELIB_NAME_AW(acmFormatChoose) + +MMRESULT WINAPI acmFormatDetailsA( + HACMDRIVER had, PACMFORMATDETAILSA pafd, DWORD fdwDetails +); +MMRESULT WINAPI acmFormatDetailsW( + HACMDRIVER had, PACMFORMATDETAILSW pafd, DWORD fdwDetails +); +#define acmFormatDetails WINELIB_NAME_AW(acmFormatDetails) + +MMRESULT WINAPI acmFormatEnumA( + HACMDRIVER had, PACMFORMATDETAILSA pafd, + ACMFORMATENUMCBA fnCallback, DWORD dwInstance, DWORD fdwEnum +); +MMRESULT WINAPI acmFormatEnumW( + HACMDRIVER had, PACMFORMATDETAILSW pafd, + ACMFORMATENUMCBW fnCallback, DWORD dwInstance, DWORD fdwEnum +); +#define acmFormatEnum WINELIB_NAME_AW(acmFormatEnum) + +MMRESULT WINAPI acmFormatSuggest( + HACMDRIVER had, PWAVEFORMATEX pwfxSrc, PWAVEFORMATEX pwfxDst, + DWORD cbwfxDst, DWORD fdwSuggest +); +MMRESULT WINAPI acmFormatTagDetailsA( + HACMDRIVER had, PACMFORMATTAGDETAILSA paftd, DWORD fdwDetails +); +MMRESULT WINAPI acmFormatTagDetailsW( + HACMDRIVER had, PACMFORMATTAGDETAILSW paftd, DWORD fdwDetails +); +#define acmFormatTagDetails WINELIB_NAME_AW(acmFormatTagDetails) + +MMRESULT WINAPI acmFormatTagEnumA( + HACMDRIVER had, PACMFORMATTAGDETAILSA paftd, + ACMFORMATTAGENUMCBA fnCallback, DWORD dwInstance, DWORD fdwEnum +); +MMRESULT WINAPI acmFormatTagEnumW( + HACMDRIVER had, PACMFORMATTAGDETAILSW paftd, + ACMFORMATTAGENUMCBW fnCallback, DWORD dwInstance, DWORD fdwEnum +); +#define acmFormatTagEnum WINELIB_NAME_AW(acmFormatTagEnum) + +DWORD WINAPI acmGetVersion(void +); +MMRESULT WINAPI acmMetrics( + HACMOBJ hao, UINT uMetric, LPVOID pMetric +); +MMRESULT WINAPI acmStreamClose( + HACMSTREAM has, DWORD fdwClose +); +MMRESULT WINAPI acmStreamConvert( + HACMSTREAM has, PACMSTREAMHEADER pash, DWORD fdwConvert +); +MMRESULT WINAPI acmStreamMessage( + HACMSTREAM has, UINT uMsg, LPARAM lParam1, LPARAM lParam2 +); +MMRESULT WINAPI acmStreamOpen( + PHACMSTREAM phas, HACMDRIVER had, PWAVEFORMATEX pwfxSrc, + PWAVEFORMATEX pwfxDst, PWAVEFILTER pwfltr, DWORD dwCallback, + DWORD dwInstance, DWORD fdwOpen +); +MMRESULT WINAPI acmStreamPrepareHeader( + HACMSTREAM has, PACMSTREAMHEADER pash, DWORD fdwPrepare +); +MMRESULT WINAPI acmStreamReset( + HACMSTREAM has, DWORD fdwReset +); +MMRESULT WINAPI acmStreamSize( + HACMSTREAM has, DWORD cbInput, + LPDWORD pdwOutputBytes, DWORD fdwSize +); +MMRESULT WINAPI acmStreamUnprepareHeader( + HACMSTREAM has, PACMSTREAMHEADER pash, DWORD fdwUnprepare +); + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* defined(__cplusplus) */ + +#endif /* __WINE_MSACM_H */ diff --git a/reactos/include/wine/msacmdlg.h b/reactos/include/wine/msacmdlg.h new file mode 100644 index 00000000000..6f8ab688cd8 --- /dev/null +++ b/reactos/include/wine/msacmdlg.h @@ -0,0 +1,36 @@ +/* + * definitions for MSACM dialog boxes + * + * Copyright (C) 2001 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 + */ + +#define DLG_ACMFORMATCHOOSE_ID 70 +#define IDD_ACMFORMATCHOOSE_BTN_HELP 9 +#define IDD_ACMFORMATCHOOSE_CMB_CUSTOM 100 +#define IDD_ACMFORMATCHOOSE_CMB_FORMATTAG 101 +#define IDD_ACMFORMATCHOOSE_CMB_FORMAT 102 +#define IDD_ACMFORMATCHOOSE_BTN_SETNAME 103 +#define IDD_ACMFORMATCHOOSE_BTN_DELNAME 104 + +#define DLG_ACMFILTERCHOOSE_ID 71 +#define IDD_ACMFILTERCHOOSE_BTN_HELP 9 +#define IDD_ACMFILTERCHOOSE_CMB_CUSTOM 100 +#define IDD_ACMFILTERCHOOSE_CMB_FILTERTAG 101 +#define IDD_ACMFILTERCHOOSE_CMB_FILTER 102 +#define IDD_ACMFILTERCHOOSE_BTN_SETNAME 103 +#define IDD_ACMFILTERCHOOSE_BTN_DELNAME 104 + diff --git a/reactos/include/wine/msacmdrv.h b/reactos/include/wine/msacmdrv.h new file mode 100644 index 00000000000..6d2668dface --- /dev/null +++ b/reactos/include/wine/msacmdrv.h @@ -0,0 +1,157 @@ +/* + * Declarations for MSACM driver + * + * Copyright 1998 Patrik Stridvall + * + * 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_MSACMDRV_H +#define __WINE_MSACMDRV_H + +#include <stdarg.h> + +#include "windef.h" +#include "winbase.h" +#include "mmsystem.h" +#include "mmreg.h" +#include "msacm.h" + +/*********************************************************************** + * Types + */ + +/*********************************************************************** + * Defines/Enums + */ + +#define MAKE_ACM_VERSION(mjr, mnr, bld) \ + (((long)(mjr)<<24) | ((long)(mnr)<<16) | ((long)bld)) + +#define ACMDRVOPENDESC_SECTIONNAME_CHARS + +#define ACMDM_DRIVER_NOTIFY (ACMDM_BASE + 1) +#define ACMDM_DRIVER_DETAILS (ACMDM_BASE + 10) + +#define ACMDM_HARDWARE_WAVE_CAPS_INPUT (ACMDM_BASE + 20) +#define ACMDM_HARDWARE_WAVE_CAPS_OUTPUT (ACMDM_BASE + 21) + +#define ACMDM_FORMATTAG_DETAILS (ACMDM_BASE + 25) +#define ACMDM_FORMAT_DETAILS (ACMDM_BASE + 26) +#define ACMDM_FORMAT_SUGGEST (ACMDM_BASE + 27) + +#define ACMDM_FILTERTAG_DETAILS (ACMDM_BASE + 50) +#define ACMDM_FILTER_DETAILS (ACMDM_BASE + 51) + +#define ACMDM_STREAM_OPEN (ACMDM_BASE + 76) +#define ACMDM_STREAM_CLOSE (ACMDM_BASE + 77) +#define ACMDM_STREAM_SIZE (ACMDM_BASE + 78) +#define ACMDM_STREAM_CONVERT (ACMDM_BASE + 79) +#define ACMDM_STREAM_RESET (ACMDM_BASE + 80) +#define ACMDM_STREAM_PREPARE (ACMDM_BASE + 81) +#define ACMDM_STREAM_UNPREPARE (ACMDM_BASE + 82) +#define ACMDM_STREAM_UPDATE (ACMDM_BASE + 83) + +/*********************************************************************** + * Structures + */ + +typedef struct _ACMDRVOPENDESCA +{ + DWORD cbStruct; + FOURCC fccType; + FOURCC fccComp; + DWORD dwVersion; + DWORD dwFlags; + DWORD dwError; + LPCSTR pszSectionName; + LPCSTR pszAliasName; + DWORD dnDevNode; +} ACMDRVOPENDESCA, *PACMDRVOPENDESCA; + +typedef struct _ACMDRVOPENDESCW +{ + DWORD cbStruct; + FOURCC fccType; + FOURCC fccComp; + DWORD dwVersion; + DWORD dwFlags; + DWORD dwError; + LPCWSTR pszSectionName; + LPCWSTR pszAliasName; + DWORD dnDevNode; +} ACMDRVOPENDESCW, *PACMDRVOPENDESCW; + +typedef struct _ACMDRVSTREAMINSTANCE +{ + DWORD cbStruct; + PWAVEFORMATEX pwfxSrc; + PWAVEFORMATEX pwfxDst; + PWAVEFILTER pwfltr; + DWORD dwCallback; + DWORD dwInstance; + DWORD fdwOpen; + DWORD fdwDriver; + DWORD dwDriver; + HACMSTREAM has; +} ACMDRVSTREAMINSTANCE, *PACMDRVSTREAMINSTANCE; + +typedef struct _ACMDRVSTREAMHEADER *PACMDRVSTREAMHEADER; +typedef struct _ACMDRVSTREAMHEADER { + DWORD cbStruct; + DWORD fdwStatus; + DWORD dwUser; + LPBYTE pbSrc; + DWORD cbSrcLength; + DWORD cbSrcLengthUsed; + DWORD dwSrcUser; + LPBYTE pbDst; + DWORD cbDstLength; + DWORD cbDstLengthUsed; + DWORD dwDstUser; + + DWORD fdwConvert; + PACMDRVSTREAMHEADER *padshNext; + DWORD fdwDriver; + DWORD dwDriver; + + /* Internal fields for ACM */ + DWORD fdwPrepared; + DWORD dwPrepared; + LPBYTE pbPreparedSrc; + DWORD cbPreparedSrcLength; + LPBYTE pbPreparedDst; + DWORD cbPreparedDstLength; +} ACMDRVSTREAMHEADER; + +typedef struct _ACMDRVSTREAMSIZE +{ + DWORD cbStruct; + DWORD fdwSize; + DWORD cbSrcLength; + DWORD cbDstLength; +} ACMDRVSTREAMSIZE, *PACMDRVSTREAMSIZE; + +typedef struct _ACMDRVFORMATSUGGEST +{ + DWORD cbStruct; + DWORD fdwSuggest; + PWAVEFORMATEX pwfxSrc; + DWORD cbwfxSrc; + PWAVEFORMATEX pwfxDst; + DWORD cbwfxDst; +} ACMDRVFORMATSUGGEST, *PACMDRVFORMATSUGGEST; + +#endif /* __WINE_MSACMDRV_H */ diff --git a/reactos/lib/mmdrv/midi.c b/reactos/lib/mmdrv/midi.c index 47076ba9649..9cae3d1b5cd 100644 --- a/reactos/lib/mmdrv/midi.c +++ b/reactos/lib/mmdrv/midi.c @@ -118,6 +118,8 @@ static DWORD OpenMidiDevice(UINT DeviceType, DWORD ID, DWORD User, DWORD Param1, static DWORD WriteMidi(PBYTE pData, ULONG Length, PMIDIALLOC pClient) { DWORD BytesReturned; + + printf("IOCTL_MIDI_PLAY == %d [%x]\n", IOCTL_MIDI_PLAY, IOCTL_MIDI_PLAY); if ( !DeviceIoControl(pClient->DeviceHandle, IOCTL_MIDI_PLAY, (PVOID)pData, Length, NULL, 0, &BytesReturned, NULL)) diff --git a/reactos/lib/mmdrv/mmdef.h b/reactos/lib/mmdrv/mmdef.h new file mode 100644 index 00000000000..29f2569404f --- /dev/null +++ b/reactos/lib/mmdrv/mmdef.h @@ -0,0 +1,87 @@ +/* + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: lib/mmdrv/mmdef.h + * PURPOSE: Multimedia Definitions (for mmdrv.dll) + * PROGRAMMER: Andrew Greenwood + * + */ + +#ifndef __INCLUDES_MMDEF_H__ +#define __INCLUDES_MMDEF_H__ + +//#define UNICODE + +#define EXPORT __declspec(dllexport) + + +//#include <stdio.h> +//#include <windows.h> +//#include <mmsystem.h> +//#include <mmddk.h> + +// This needs to be done to get winioctl.h to work: +//typedef unsigned __int64 DWORD64, *PDWORD64; + +//#include <winioctl.h> +//#include "mmddk.h" + + +#define SOUND_MAX_DEVICE_NAME 1024 // GUESSWORK +#define SOUND_MAX_DEVICES 256 // GUESSWORK + + +// If the root is \Device and the Device type is +// WaveIn and the device number is 2, the full name is \Device\WaveIn2 + +#define WAVE_IN_DEVICE_NAME "\\Device\\WaveIn" +#define WAVE_IN_DEVICE_NAME_U L"\\Device\\WaveIn" +#define WAVE_OUT_DEVICE_NAME "\\Device\\WaveOut" +#define WAVE_OUT_DEVICE_NAME_U L"\\Device\\WaveOut" + +#define MIDI_IN_DEVICE_NAME "\\Device\\MidiIn" +#define MIDI_IN_DEVICE_NAME_U L"\\Device\\MidiIn" +#define MIDI_OUT_DEVICE_NAME "\\Device\\MidiOut" +#define MIDI_OUT_DEVICE_NAME_U L"\\Device\\MidiOut" + +#define AUX_DEVICE_NAME "\\Device\\MMAux" +#define AUX_DEVICE_NAME_U L"\\Device\\MMAux" + + +#define IOCTL_SOUND_BASE FILE_DEVICE_SOUND +#define IOCTL_WAVE_BASE 0x0000 +#define IOCTL_MIDI_BASE 0x0080 + +// Wave device driver IOCTLs + +#define IOCTL_WAVE_QUERY_FORMAT CTL_CODE(IOCTL_SOUND_BASE, IOCTL_WAVE_BASE + 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_WAVE_SET_FORMAT CTL_CODE(IOCTL_SOUND_BASE, IOCTL_WAVE_BASE + 0x0002, METHOD_BUFFERED, FILE_WRITE_ACCESS) +#define IOCTL_WAVE_GET_CAPABILITIES CTL_CODE(IOCTL_SOUND_BASE, IOCTL_WAVE_BASE + 0x0003, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_WAVE_SET_STATE CTL_CODE(IOCTL_SOUND_BASE, IOCTL_WAVE_BASE + 0x0004, METHOD_BUFFERED, FILE_WRITE_ACCESS) +#define IOCTL_WAVE_GET_STATE CTL_CODE(IOCTL_SOUND_BASE, IOCTL_WAVE_BASE + 0x0005, METHOD_BUFFERED, FILE_WRITE_ACCESS) +#define IOCTL_WAVE_GET_POSITION CTL_CODE(IOCTL_SOUND_BASE, IOCTL_WAVE_BASE + 0x0006, METHOD_BUFFERED, FILE_WRITE_ACCESS) +#define IOCTL_WAVE_SET_VOLUME CTL_CODE(IOCTL_SOUND_BASE, IOCTL_WAVE_BASE + 0x0007, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_WAVE_GET_VOLUME CTL_CODE(IOCTL_SOUND_BASE, IOCTL_WAVE_BASE + 0x0008, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_WAVE_SET_PITCH CTL_CODE(IOCTL_SOUND_BASE, IOCTL_WAVE_BASE + 0x0009, METHOD_BUFFERED, FILE_WRITE_ACCESS) +#define IOCTL_WAVE_GET_PITCH CTL_CODE(IOCTL_SOUND_BASE, IOCTL_WAVE_BASE + 0x000A, METHOD_BUFFERED, FILE_WRITE_ACCESS) +#define IOCTL_WAVE_SET_PLAYBACK_RATE CTL_CODE(IOCTL_SOUND_BASE, IOCTL_WAVE_BASE + 0x000B, METHOD_BUFFERED, FILE_WRITE_ACCESS) +#define IOCTL_WAVE_GET_PLAYBACK_RATE CTL_CODE(IOCTL_SOUND_BASE, IOCTL_WAVE_BASE + 0x000C, METHOD_BUFFERED, FILE_WRITE_ACCESS) +#define IOCTL_WAVE_PLAY CTL_CODE(IOCTL_SOUND_BASE, IOCTL_WAVE_BASE + 0x000D, METHOD_IN_DIRECT, FILE_WRITE_ACCESS) +#define IOCTL_WAVE_RECORD CTL_CODE(IOCTL_SOUND_BASE, IOCTL_WAVE_BASE + 0x000E, METHOD_OUT_DIRECT, FILE_WRITE_ACCESS) +#define IOCTL_WAVE_BREAK_LOOP CTL_CODE(IOCTL_SOUND_BASE, IOCTL_WAVE_BASE + 0x000F, METHOD_BUFFERED, FILE_WRITE_ACCESS) +#define IOCTL_WAVE_SET_LOW_PRIORITY CTL_CODE(IOCTL_SOUND_BASE, IOCTL_WAVE_BASE + 0x0010, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +// MIDI device driver IOCTLs + +#define IOCTL_MIDI_GET_CAPABILITIES CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_MIDI_SET_STATE CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0002, METHOD_BUFFERED, FILE_WRITE_ACCESS) +#define IOCTL_MIDI_GET_STATE CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0003, METHOD_BUFFERED, FILE_WRITE_ACCESS) +#define IOCTL_MIDI_SET_VOLUME CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_MIDI_GET_VOLUME CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0005, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_MIDI_PLAY CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0006, METHOD_BUFFERED, FILE_WRITE_ACCESS) +#define IOCTL_MIDI_RECORD CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0007, METHOD_BUFFERED, FILE_WRITE_ACCESS) +#define IOCTL_MIDI_CACHE_PATCHES CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0008, METHOD_BUFFERED, FILE_WRITE_ACCESS) +#define IOCTL_MIDI_CACHE_DRUM_PATCHES CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0009, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#endif diff --git a/reactos/lib/mmdrv/mmdrv.h b/reactos/lib/mmdrv/mmdrv.h index 2ba67034f13..a018d5554e0 100644 --- a/reactos/lib/mmdrv/mmdrv.h +++ b/reactos/lib/mmdrv/mmdrv.h @@ -23,15 +23,17 @@ #include <mmddk.h> // This needs to be done to get winioctl.h to work: -typedef unsigned __int64 DWORD64, *PDWORD64; +//typedef unsigned __int64 DWORD64, *PDWORD64; #include <winioctl.h> //#include "mmddk.h" +#include "mmdef.h" +/* #define SOUND_MAX_DEVICE_NAME 1024 // GUESSWORK #define SOUND_MAX_DEVICES 256 // GUESSWORK - +*/ // If the root is \Device and the Device type is // WaveIn and the device number is 2, the full name is \Device\WaveIn2 @@ -49,7 +51,7 @@ typedef unsigned __int64 DWORD64, *PDWORD64; #define AUX_DEVICE_NAME "\\Device\\MMAux" #define AUX_DEVICE_NAME_U L"\\Device\\MMAux" - +/* #define IOCTL_SOUND_BASE FILE_DEVICE_SOUND #define IOCTL_WAVE_BASE 0x0000 #define IOCTL_MIDI_BASE 0x0080 @@ -80,11 +82,11 @@ typedef unsigned __int64 DWORD64, *PDWORD64; #define IOCTL_MIDI_GET_STATE CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0003, METHOD_BUFFERED, FILE_WRITE_ACCESS) #define IOCTL_MIDI_SET_VOLUME CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS) #define IOCTL_MIDI_GET_VOLUME CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0005, METHOD_BUFFERED, FILE_READ_ACCESS) -#define IOCTL_MIDI_PLAY CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0006, METHOD_NEITHER, FILE_WRITE_ACCESS) +#define IOCTL_MIDI_PLAY CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0006, METHOD_BUFFERED, FILE_WRITE_ACCESS) #define IOCTL_MIDI_RECORD CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0007, METHOD_BUFFERED, FILE_WRITE_ACCESS) #define IOCTL_MIDI_CACHE_PATCHES CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0008, METHOD_BUFFERED, FILE_WRITE_ACCESS) #define IOCTL_MIDI_CACHE_DRUM_PATCHES CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0009, METHOD_BUFFERED, FILE_WRITE_ACCESS) - +*/ CRITICAL_SECTION CS; // Serialize access to device lists diff --git a/reactos/lib/mmdrv/utils.c b/reactos/lib/mmdrv/utils.c index 7ef83b3830d..cc38d23c7c9 100644 --- a/reactos/lib/mmdrv/utils.c +++ b/reactos/lib/mmdrv/utils.c @@ -60,28 +60,42 @@ MMRESULT OpenDevice(UINT DeviceType, DWORD ID, PHANDLE pDeviceHandle, DWORD Access) { printf("OpenDevice()\n"); - WCHAR Name[SOUND_MAX_DEVICE_NAME]; + WCHAR DeviceName[SOUND_MAX_DEVICE_NAME]; *pDeviceHandle = INVALID_HANDLE_VALUE; if (ID > SOUND_MAX_DEVICES) return MMSYSERR_BADDEVICEID; - wsprintf(Name, L"\\\\.%ls%d", - (DeviceType == WaveOutDevice ? WAVE_OUT_DEVICE_NAME_U : - DeviceType == WaveInDevice ? WAVE_IN_DEVICE_NAME_U : - DeviceType == MidiOutDevice ? MIDI_OUT_DEVICE_NAME_U : - DeviceType == MidiInDevice ? MIDI_IN_DEVICE_NAME_U : - AUX_DEVICE_NAME_U) + strlen("\\Device"), ID); - - printf("Attempting to open %S\n", Name); + switch(DeviceType) + { + case WaveOutDevice : + wsprintf(DeviceName, L"\\\\.%ls%d", WAVE_OUT_DEVICE_NAME_U + strlen("\\Device"), ID); + break; + case WaveInDevice : + wsprintf(DeviceName, L"\\\\.%ls%d", WAVE_IN_DEVICE_NAME_U + strlen("\\Device"), ID); + break; + case MidiOutDevice : + wsprintf(DeviceName, L"\\\\.%ls%d", MIDI_OUT_DEVICE_NAME_U + strlen("\\Device"), ID); + break; + case MidiInDevice : + wsprintf(DeviceName, L"\\\\.%ls%d", MIDI_IN_DEVICE_NAME_U + strlen("\\Device"), ID); + break; + default : // Aux + wsprintf(DeviceName, L"\\\\.%ls%d", AUX_DEVICE_NAME_U + strlen("\\Device"), ID); + }; - *pDeviceHandle = CreateFile(Name, Access, FILE_SHARE_WRITE, NULL, + printf("Attempting to open %S\n", DeviceName); + + *pDeviceHandle = CreateFile(DeviceName, Access, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, Access != GENERIC_READ ? FILE_FLAG_OVERLAPPED : 0, NULL); printf("DeviceHandle == 0x%x\n", (int)*pDeviceHandle); - return *pDeviceHandle != INVALID_HANDLE_VALUE ? MMSYSERR_NOERROR : TranslateStatus(); + if (pDeviceHandle == INVALID_HANDLE_VALUE) + return TranslateStatus(); + + return MMSYSERR_NOERROR; } diff --git a/reactos/lib/msacm/.cvsignore b/reactos/lib/msacm/.cvsignore new file mode 100644 index 00000000000..b5572719a60 --- /dev/null +++ b/reactos/lib/msacm/.cvsignore @@ -0,0 +1,9 @@ +*.a +*.d +*.o +*.dll +*.coff +*.sym +*.map +*.tmp +temp.exp diff --git a/reactos/lib/msacm/Makefile.in b/reactos/lib/msacm/Makefile.in new file mode 100644 index 00000000000..f4cb7c1376c --- /dev/null +++ b/reactos/lib/msacm/Makefile.in @@ -0,0 +1,27 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = msacm32.dll +IMPORTS = winmm user32 advapi32 kernel32 +ALTNAMES = msacm.dll + +SPEC_SRCS16 = $(ALTNAMES:.dll=.spec) + +C_SRCS = \ + driver.c \ + filter.c \ + format.c \ + internal.c \ + msacm32_main.c \ + pcmconverter.c \ + stream.c + +C_SRCS16 = \ + msacm_main.c + +RC_SRCS = msacm.rc + +@MAKE_DLL_RULES@ + +### Dependencies: diff --git a/reactos/lib/msacm/Makefile.ros b/reactos/lib/msacm/Makefile.ros new file mode 100644 index 00000000000..3fc9715f3e9 --- /dev/null +++ b/reactos/lib/msacm/Makefile.ros @@ -0,0 +1,21 @@ +# $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 diff --git a/reactos/lib/msacm/Makefile.ros-template b/reactos/lib/msacm/Makefile.ros-template new file mode 100644 index 00000000000..42e0d76161d --- /dev/null +++ b/reactos/lib/msacm/Makefile.ros-template @@ -0,0 +1,21 @@ +# $Id: Makefile.ros-template,v 1.1 2004/03/10 15:22:44 silverblade Exp $ + +TARGET_NAME = iphlpapi + +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_BASE = 0x77300000 + +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/msacm/driver.c b/reactos/lib/msacm/driver.c new file mode 100644 index 00000000000..b473f9c4d73 --- /dev/null +++ b/reactos/lib/msacm/driver.c @@ -0,0 +1,400 @@ +/* -*- 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 + */ + +#include "config.h" +#include "wine/port.h" + +#include <stdarg.h> +#include <stdio.h> + +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "wingdi.h" +#include "winuser.h" +#include "winnls.h" +#include "winreg.h" +#include "mmsystem.h" +#include "mmreg.h" +#include "msacm.h" +#include "msacmdrv.h" +#include "wineacm.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msacm); + +/*********************************************************************** + * acmDriverAddA (MSACM32.@) + */ +MMRESULT WINAPI acmDriverAddA(PHACMDRIVERID phadid, HINSTANCE hinstModule, + LPARAM lParam, DWORD dwPriority, DWORD fdwAdd) +{ + if (!phadid) + return MMSYSERR_INVALPARAM; + + /* Check if any unknown flags */ + if (fdwAdd & + ~(ACM_DRIVERADDF_FUNCTION|ACM_DRIVERADDF_NOTIFYHWND| + ACM_DRIVERADDF_GLOBAL)) + return MMSYSERR_INVALFLAG; + + /* Check if any incompatible flags */ + if ((fdwAdd & ACM_DRIVERADDF_FUNCTION) && + (fdwAdd & ACM_DRIVERADDF_NOTIFYHWND)) + return MMSYSERR_INVALFLAG; + + /* FIXME: in fact, should GetModuleFileName(hinstModule) and do a + * LoadDriver on it, to be sure we can call SendDriverMessage on the + * hDrvr handle. + */ + *phadid = (HACMDRIVERID) MSACM_RegisterDriver(NULL, NULL, hinstModule); + + /* FIXME: lParam, dwPriority and fdwAdd ignored */ + + return MMSYSERR_NOERROR; +} + +/*********************************************************************** + * acmDriverAddW (MSACM32.@) + * FIXME + * Not implemented + */ +MMRESULT WINAPI acmDriverAddW(PHACMDRIVERID phadid, HINSTANCE hinstModule, + LPARAM lParam, DWORD dwPriority, DWORD fdwAdd) +{ + FIXME("(%p, %p, %ld, %ld, %ld): stub\n", + phadid, hinstModule, lParam, dwPriority, fdwAdd); + + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmDriverClose (MSACM32.@) + */ +MMRESULT WINAPI acmDriverClose(HACMDRIVER had, DWORD fdwClose) +{ + PWINE_ACMDRIVER pad; + PWINE_ACMDRIVERID padid; + PWINE_ACMDRIVER* tpad; + + if (fdwClose) + return MMSYSERR_INVALFLAG; + + pad = MSACM_GetDriver(had); + if (!pad) + return MMSYSERR_INVALHANDLE; + + padid = pad->obj.pACMDriverID; + + /* remove driver from list */ + for (tpad = &(padid->pACMDriverList); *tpad; *tpad = (*tpad)->pNextACMDriver) { + if (*tpad == pad) { + *tpad = (*tpad)->pNextACMDriver; + break; + } + } + + /* close driver if it has been opened */ + if (pad->hDrvr && !padid->hInstModule) + CloseDriver(pad->hDrvr, 0, 0); + + HeapFree(MSACM_hHeap, 0, pad); + + return MMSYSERR_NOERROR; +} + +/*********************************************************************** + * acmDriverDetailsA (MSACM32.@) + */ +MMRESULT WINAPI acmDriverDetailsA(HACMDRIVERID hadid, PACMDRIVERDETAILSA padd, DWORD fdwDetails) +{ + MMRESULT mmr; + ACMDRIVERDETAILSW addw; + + 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 ); + } + return mmr; +} + +/*********************************************************************** + * acmDriverDetailsW (MSACM32.@) + */ +MMRESULT WINAPI acmDriverDetailsW(HACMDRIVERID hadid, PACMDRIVERDETAILSW padd, DWORD fdwDetails) +{ + HACMDRIVER acmDrvr; + MMRESULT mmr; + + if (fdwDetails) + return MMSYSERR_INVALFLAG; + + mmr = acmDriverOpen(&acmDrvr, hadid, 0); + if (mmr == MMSYSERR_NOERROR) { + mmr = (MMRESULT)MSACM_Message(acmDrvr, ACMDM_DRIVER_DETAILS, (LPARAM)padd, 0); + + acmDriverClose(acmDrvr, 0); + } + + return mmr; +} + +/*********************************************************************** + * acmDriverEnum (MSACM32.@) + */ +MMRESULT WINAPI acmDriverEnum(ACMDRIVERENUMCB fnCallback, DWORD dwInstance, DWORD fdwEnum) +{ + PWINE_ACMDRIVERID padid; + DWORD fdwSupport; + + if (!fnCallback) return MMSYSERR_INVALPARAM; + + if (fdwEnum & ~(ACM_DRIVERENUMF_NOLOCAL|ACM_DRIVERENUMF_DISABLED)) + return MMSYSERR_INVALFLAG; + + for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) { + fdwSupport = padid->fdwSupport; + + if (padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) { + if (fdwEnum & ACM_DRIVERENUMF_DISABLED) + fdwSupport |= ACMDRIVERDETAILS_SUPPORTF_DISABLED; + else + continue; + } + if (!(*fnCallback)((HACMDRIVERID)padid, dwInstance, fdwSupport)) + break; + } + + return MMSYSERR_NOERROR; +} + +/*********************************************************************** + * acmDriverID (MSACM32.@) + */ +MMRESULT WINAPI acmDriverID(HACMOBJ hao, PHACMDRIVERID phadid, DWORD fdwDriverID) +{ + PWINE_ACMOBJ pao; + + if (!phadid) + return MMSYSERR_INVALPARAM; + + if (fdwDriverID) + return MMSYSERR_INVALFLAG; + + pao = MSACM_GetObj(hao, WINE_ACMOBJ_DONTCARE); + if (!pao) + return MMSYSERR_INVALHANDLE; + + *phadid = (HACMDRIVERID) pao->pACMDriverID; + + return MMSYSERR_NOERROR; +} + +/*********************************************************************** + * acmDriverMessage (MSACM32.@) + * + */ +LRESULT WINAPI acmDriverMessage(HACMDRIVER had, UINT uMsg, LPARAM lParam1, LPARAM 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); + return MMSYSERR_INVALPARAM; +} + +/*********************************************************************** + * acmDriverOpen (MSACM32.@) + */ +MMRESULT WINAPI acmDriverOpen(PHACMDRIVER phad, HACMDRIVERID hadid, DWORD fdwOpen) +{ + PWINE_ACMDRIVERID padid; + PWINE_ACMDRIVER pad = NULL; + MMRESULT ret; + + TRACE("(%p, %p, %08lu)\n", phad, hadid, fdwOpen); + + if (!phad) + return MMSYSERR_INVALPARAM; + + if (fdwOpen) + return MMSYSERR_INVALFLAG; + + padid = MSACM_GetDriverID(hadid); + if (!padid) + return MMSYSERR_INVALHANDLE; + + pad = HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMDRIVER)); + if (!pad) + return MMSYSERR_NOMEM; + + pad->obj.dwType = WINE_ACMOBJ_DRIVER; + pad->obj.pACMDriverID = padid; + + if (!(pad->hDrvr = (HDRVR)padid->hInstModule)) + { + ACMDRVOPENDESCW adod; + int len; + + /* this is not an externally added driver... need to actually load it */ + if (!padid->pszDriverAlias) + { + ret = MMSYSERR_ERROR; + goto gotError; + } + + adod.cbStruct = sizeof(adod); + adod.fccType = ACMDRIVERDETAILS_FCCTYPE_AUDIOCODEC; + adod.fccComp = ACMDRIVERDETAILS_FCCCOMP_UNDEFINED; + adod.dwVersion = acmGetVersion(); + adod.dwFlags = fdwOpen; + adod.dwError = 0; + len = strlen("Drivers32") + 1; + adod.pszSectionName = HeapAlloc(MSACM_hHeap, 0, len * sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, "Drivers32", -1, (LPWSTR)adod.pszSectionName, len); + adod.pszAliasName = padid->pszDriverAlias; + adod.dnDevNode = 0; + + pad->hDrvr = OpenDriver(padid->pszDriverAlias, NULL, (DWORD)&adod); + + HeapFree(MSACM_hHeap, 0, (LPWSTR)adod.pszSectionName); + if (!pad->hDrvr) + { + ret = adod.dwError; + goto gotError; + } + } + + /* insert new pad at beg of list */ + pad->pNextACMDriver = padid->pACMDriverList; + padid->pACMDriverList = pad; + + /* FIXME: Create a WINE_ACMDRIVER32 */ + *phad = (HACMDRIVER)pad; + TRACE("'%s' => %08lx\n", debugstr_w(padid->pszDriverAlias), (DWORD)pad); + + return MMSYSERR_NOERROR; + gotError: + if (pad && !pad->hDrvr) + HeapFree(MSACM_hHeap, 0, pad); + return ret; +} + +/*********************************************************************** + * acmDriverPriority (MSACM32.@) + */ +MMRESULT WINAPI acmDriverPriority(HACMDRIVERID hadid, DWORD dwPriority, DWORD fdwPriority) +{ + PWINE_ACMDRIVERID padid; + CHAR szSubKey[17]; + CHAR szBuffer[256]; + LONG lBufferLength = sizeof(szBuffer); + LONG lError; + HKEY hPriorityKey; + DWORD dwPriorityCounter; + + padid = MSACM_GetDriverID(hadid); + if (!padid) + return MMSYSERR_INVALHANDLE; + + /* Check for unknown flags */ + if (fdwPriority & + ~(ACM_DRIVERPRIORITYF_ENABLE|ACM_DRIVERPRIORITYF_DISABLE| + ACM_DRIVERPRIORITYF_BEGIN|ACM_DRIVERPRIORITYF_END)) + return MMSYSERR_INVALFLAG; + + /* Check for incompatible flags */ + if ((fdwPriority & ACM_DRIVERPRIORITYF_ENABLE) && + (fdwPriority & ACM_DRIVERPRIORITYF_DISABLE)) + return MMSYSERR_INVALFLAG; + + /* Check for incompatible flags */ + if ((fdwPriority & ACM_DRIVERPRIORITYF_BEGIN) && + (fdwPriority & ACM_DRIVERPRIORITYF_END)) + return MMSYSERR_INVALFLAG; + + lError = RegOpenKeyA(HKEY_CURRENT_USER, + "Software\\Microsoft\\Multimedia\\" + "Audio Compression Manager\\Priority v4.00", + &hPriorityKey + ); + /* FIXME: Create key */ + if (lError != ERROR_SUCCESS) + return MMSYSERR_ERROR; + + for (dwPriorityCounter = 1; ; dwPriorityCounter++) { + snprintf(szSubKey, 17, "Priority%ld", dwPriorityCounter); + lError = RegQueryValueA(hPriorityKey, szSubKey, szBuffer, &lBufferLength); + if (lError != ERROR_SUCCESS) + break; + + FIXME("(%p, %ld, %ld): stub (partial)\n", + hadid, dwPriority, fdwPriority); + break; + } + + RegCloseKey(hPriorityKey); + + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmDriverRemove (MSACM32.@) + */ +MMRESULT WINAPI acmDriverRemove(HACMDRIVERID hadid, DWORD fdwRemove) +{ + PWINE_ACMDRIVERID padid; + + padid = MSACM_GetDriverID(hadid); + if (!padid) + return MMSYSERR_INVALHANDLE; + + if (fdwRemove) + return MMSYSERR_INVALFLAG; + + MSACM_UnregisterDriver(padid); + + return MMSYSERR_NOERROR; +} diff --git a/reactos/lib/msacm/filter.c b/reactos/lib/msacm/filter.c new file mode 100644 index 00000000000..3bce5c23d3c --- /dev/null +++ b/reactos/lib/msacm/filter.c @@ -0,0 +1,454 @@ +/* -*- tab-width: 8; c-basic-offset: 4 -*- */ + +/* + * MSACM32 library + * + * Copyright 1998 Patrik Stridvall + * + * 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 <stdarg.h> +#include <string.h> +#include "windef.h" +#include "winbase.h" +#include "winnls.h" +#include "winerror.h" +#include "mmsystem.h" +#include "mmreg.h" +#include "msacm.h" +#include "msacmdrv.h" +#include "wineacm.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msacm); + +/*********************************************************************** + * acmFilterChooseA (MSACM32.@) + */ +MMRESULT WINAPI acmFilterChooseA(PACMFILTERCHOOSEA pafltrc) +{ + FIXME("(%p): stub\n", pafltrc); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmFilterChooseW (MSACM32.@) + */ +MMRESULT WINAPI acmFilterChooseW(PACMFILTERCHOOSEW pafltrc) +{ + FIXME("(%p): stub\n", pafltrc); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmFilterDetailsA (MSACM32.@) + */ +MMRESULT WINAPI acmFilterDetailsA(HACMDRIVER had, PACMFILTERDETAILSA pafd, + DWORD fdwDetails) +{ + ACMFILTERDETAILSW afdw; + MMRESULT mmr; + + memset(&afdw, 0, sizeof(afdw)); + afdw.cbStruct = sizeof(afdw); + afdw.dwFilterIndex = pafd->dwFilterIndex; + afdw.dwFilterTag = pafd->dwFilterTag; + afdw.pwfltr = pafd->pwfltr; + afdw.cbwfltr = pafd->cbwfltr; + + mmr = acmFilterDetailsW(had, &afdw, fdwDetails); + if (mmr == MMSYSERR_NOERROR) { + pafd->dwFilterTag = afdw.dwFilterTag; + pafd->fdwSupport = afdw.fdwSupport; + WideCharToMultiByte( CP_ACP, 0, afdw.szFilter, -1, pafd->szFilter, + sizeof(pafd->szFilter), NULL, NULL ); + } + return mmr; +} + +/*********************************************************************** + * acmFilterDetailsW (MSACM32.@) + */ +MMRESULT WINAPI acmFilterDetailsW(HACMDRIVER had, PACMFILTERDETAILSW pafd, + DWORD fdwDetails) +{ + MMRESULT mmr; + ACMFILTERTAGDETAILSA aftd; + + TRACE("(%p, %p, %ld)\n", had, pafd, fdwDetails); + + memset(&aftd, 0, sizeof(aftd)); + aftd.cbStruct = sizeof(aftd); + + if (pafd->cbStruct < sizeof(*pafd)) return MMSYSERR_INVALPARAM; + + switch (fdwDetails) { + case ACM_FILTERDETAILSF_FILTER: + if (pafd->dwFilterTag != pafd->pwfltr->dwFilterTag) { + mmr = MMSYSERR_INVALPARAM; + break; + } + if (had == NULL) { + PWINE_ACMDRIVERID padid; + + mmr = ACMERR_NOTPOSSIBLE; + for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) { + /* should check for codec only */ + if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && + acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) { + mmr = MSACM_Message(had, ACMDM_FILTER_DETAILS, + (LPARAM)pafd, (LPARAM)fdwDetails); + acmDriverClose(had, 0); + if (mmr == MMSYSERR_NOERROR) break; + } + } + } else { + mmr = MSACM_Message(had, ACMDM_FILTER_DETAILS, (LPARAM)pafd, fdwDetails); + } + break; + case ACM_FILTERDETAILSF_INDEX: + /* should check pafd->dwFilterIndex < aftd->cStandardFilters */ + mmr = MSACM_Message(had, ACMDM_FILTER_DETAILS, (LPARAM)pafd, fdwDetails); + break; + default: + WARN("Unknown fdwDetails %08lx\n", fdwDetails); + mmr = MMSYSERR_INVALFLAG; + break; + } + + TRACE("=> %d\n", mmr); + return mmr; +} + +struct MSACM_FilterEnumWtoA_Instance { + PACMFILTERDETAILSA pafda; + DWORD dwInstance; + ACMFILTERENUMCBA fnCallback; +}; + +static BOOL CALLBACK MSACM_FilterEnumCallbackWtoA(HACMDRIVERID hadid, + PACMFILTERDETAILSW pafdw, + DWORD dwInstance, + DWORD fdwSupport) +{ + struct MSACM_FilterEnumWtoA_Instance* pafei; + + pafei = (struct MSACM_FilterEnumWtoA_Instance*)dwInstance; + + pafei->pafda->dwFilterIndex = pafdw->dwFilterIndex; + pafei->pafda->dwFilterTag = pafdw->dwFilterTag; + pafei->pafda->fdwSupport = pafdw->fdwSupport; + WideCharToMultiByte( CP_ACP, 0, pafdw->szFilter, -1, pafei->pafda->szFilter, + sizeof(pafei->pafda->szFilter), NULL, NULL ); + + return (pafei->fnCallback)(hadid, pafei->pafda, + pafei->dwInstance, fdwSupport); +} + +/*********************************************************************** + * acmFilterEnumA (MSACM32.@) + */ +MMRESULT WINAPI acmFilterEnumA(HACMDRIVER had, PACMFILTERDETAILSA pafda, + ACMFILTERENUMCBA fnCallback, DWORD dwInstance, + DWORD fdwEnum) +{ + ACMFILTERDETAILSW afdw; + struct MSACM_FilterEnumWtoA_Instance afei; + + memset(&afdw, 0, sizeof(afdw)); + afdw.cbStruct = sizeof(afdw); + afdw.dwFilterIndex = pafda->dwFilterIndex; + afdw.dwFilterTag = pafda->dwFilterTag; + afdw.pwfltr = pafda->pwfltr; + afdw.cbwfltr = pafda->cbwfltr; + + afei.pafda = pafda; + afei.dwInstance = dwInstance; + afei.fnCallback = fnCallback; + + return acmFilterEnumW(had, &afdw, MSACM_FilterEnumCallbackWtoA, + (DWORD)&afei, fdwEnum); +} + +static BOOL MSACM_FilterEnumHelper(PWINE_ACMDRIVERID padid, HACMDRIVER had, + PACMFILTERDETAILSW pafd, + ACMFILTERENUMCBW fnCallback, DWORD dwInstance, + DWORD fdwEnum) +{ + ACMFILTERTAGDETAILSW aftd; + int i, j; + + for (i = 0; i < padid->cFilterTags; i++) { + memset(&aftd, 0, sizeof(aftd)); + aftd.cbStruct = sizeof(aftd); + aftd.dwFilterTagIndex = i; + if (acmFilterTagDetailsW(had, &aftd, ACM_FILTERTAGDETAILSF_INDEX) != MMSYSERR_NOERROR) + continue; + + if ((fdwEnum & ACM_FILTERENUMF_DWFILTERTAG) && + aftd.dwFilterTag != pafd->pwfltr->dwFilterTag) + continue; + + for (j = 0; j < aftd.cStandardFilters; j++) { + pafd->dwFilterIndex = j; + pafd->dwFilterTag = aftd.dwFilterTag; + if (acmFilterDetailsW(had, pafd, ACM_FILTERDETAILSF_INDEX) != MMSYSERR_NOERROR) + continue; + + if (!(fnCallback)((HACMDRIVERID)padid, pafd, dwInstance, padid->fdwSupport)) + return FALSE; + } + } + return TRUE; +} + +/*********************************************************************** + * acmFilterEnumW (MSACM32.@) + */ +MMRESULT WINAPI acmFilterEnumW(HACMDRIVER had, PACMFILTERDETAILSW pafd, + ACMFILTERENUMCBW fnCallback, DWORD dwInstance, + DWORD fdwEnum) +{ + PWINE_ACMDRIVERID padid; + BOOL ret; + + TRACE("(%p, %p, %p, %ld, %ld)\n", + had, pafd, fnCallback, dwInstance, fdwEnum); + + if (pafd->cbStruct < sizeof(*pafd)) return MMSYSERR_INVALPARAM; + + if (fdwEnum & ~(ACM_FILTERENUMF_DWFILTERTAG)) + FIXME("Unsupported fdwEnum values\n"); + + if (had) { + HACMDRIVERID hadid; + + if (acmDriverID((HACMOBJ)had, &hadid, 0) != MMSYSERR_NOERROR) + return MMSYSERR_INVALHANDLE; + MSACM_FilterEnumHelper(MSACM_GetDriverID(hadid), had, pafd, + fnCallback, dwInstance, fdwEnum); + return MMSYSERR_NOERROR; + } + for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) { + /* should check for codec only */ + if ((padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) || + acmDriverOpen(&had, (HACMDRIVERID)padid, 0) != MMSYSERR_NOERROR) + continue; + ret = MSACM_FilterEnumHelper(padid, had, pafd, + fnCallback, dwInstance, fdwEnum); + acmDriverClose(had, 0); + if (!ret) break; + } + return MMSYSERR_NOERROR; +} + +/*********************************************************************** + * acmFilterTagDetailsA (MSACM32.@) + */ +MMRESULT WINAPI acmFilterTagDetailsA(HACMDRIVER had, PACMFILTERTAGDETAILSA paftda, + DWORD fdwDetails) +{ + ACMFILTERTAGDETAILSW aftdw; + MMRESULT mmr; + + memset(&aftdw, 0, sizeof(aftdw)); + aftdw.cbStruct = sizeof(aftdw); + aftdw.dwFilterTagIndex = paftda->dwFilterTagIndex; + aftdw.dwFilterTag = paftda->dwFilterTag; + + mmr = acmFilterTagDetailsW(had, &aftdw, fdwDetails); + if (mmr == MMSYSERR_NOERROR) { + paftda->dwFilterTag = aftdw.dwFilterTag; + paftda->dwFilterTagIndex = aftdw.dwFilterTagIndex; + paftda->cbFilterSize = aftdw.cbFilterSize; + paftda->fdwSupport = aftdw.fdwSupport; + paftda->cStandardFilters = aftdw.cStandardFilters; + WideCharToMultiByte( CP_ACP, 0, aftdw.szFilterTag, -1, paftda->szFilterTag, + sizeof(paftda->szFilterTag), NULL, NULL ); + } + return mmr; +} + +/*********************************************************************** + * acmFilterTagDetailsW (MSACM32.@) + */ +MMRESULT WINAPI acmFilterTagDetailsW(HACMDRIVER had, PACMFILTERTAGDETAILSW paftd, + DWORD fdwDetails) +{ + PWINE_ACMDRIVERID padid; + MMRESULT mmr; + + TRACE("(%p, %p, %ld)\n", had, paftd, fdwDetails); + + if (fdwDetails & ~(ACM_FILTERTAGDETAILSF_FILTERTAG|ACM_FILTERTAGDETAILSF_INDEX| + ACM_FILTERTAGDETAILSF_LARGESTSIZE)) + return MMSYSERR_INVALFLAG; + + switch (fdwDetails) { + case ACM_FILTERTAGDETAILSF_FILTERTAG: + if (had == NULL) { + mmr = ACMERR_NOTPOSSIBLE; + for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) { + /* should check for codec only */ + if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && + acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) { + mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS, (LPARAM)paftd, fdwDetails); + acmDriverClose(had, 0); + if (mmr == MMSYSERR_NOERROR) break; + } + } + } else { + mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS, (LPARAM)paftd, fdwDetails); + } + break; + + case ACM_FILTERTAGDETAILSF_INDEX: + /* FIXME should check paftd->dwFilterTagIndex < add.cFilterTags */ + mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS, (LPARAM)paftd, fdwDetails); + break; + + case ACM_FILTERTAGDETAILSF_LARGESTSIZE: + if (had == NULL) { + ACMFILTERTAGDETAILSW tmp; + DWORD ft = paftd->dwFilterTag; + + mmr = ACMERR_NOTPOSSIBLE; + for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) { + /* should check for codec only */ + if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && + acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) { + + memset(&tmp, 0, sizeof(tmp)); + tmp.cbStruct = sizeof(tmp); + tmp.dwFilterTag = ft; + + if (MSACM_Message(had, ACMDM_FILTERTAG_DETAILS, + (LPARAM)&tmp, fdwDetails) == MMSYSERR_NOERROR) { + if (mmr == ACMERR_NOTPOSSIBLE || + paftd->cbFilterSize < tmp.cbFilterSize) { + *paftd = tmp; + mmr = MMSYSERR_NOERROR; + } + } + acmDriverClose(had, 0); + } + } + } else { + mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS, (LPARAM)paftd, fdwDetails); + } + break; + + default: + WARN("Unsupported fdwDetails=%08lx\n", fdwDetails); + mmr = MMSYSERR_ERROR; + } + + if (mmr == MMSYSERR_NOERROR && + paftd->dwFilterTag == WAVE_FORMAT_PCM && paftd->szFilterTag[0] == 0) + MultiByteToWideChar( CP_ACP, 0, "PCM", -1, paftd->szFilterTag, + sizeof(paftd->szFilterTag)/sizeof(WCHAR) ); + + return mmr; +} + +struct MSACM_FilterTagEnumWtoA_Instance { + PACMFILTERTAGDETAILSA paftda; + DWORD dwInstance; + ACMFILTERTAGENUMCBA fnCallback; +}; + +static BOOL CALLBACK MSACM_FilterTagEnumCallbackWtoA(HACMDRIVERID hadid, + PACMFILTERTAGDETAILSW paftdw, + DWORD dwInstance, + DWORD fdwSupport) +{ + struct MSACM_FilterTagEnumWtoA_Instance* paftei; + + paftei = (struct MSACM_FilterTagEnumWtoA_Instance*)dwInstance; + + paftei->paftda->dwFilterTagIndex = paftdw->dwFilterTagIndex; + paftei->paftda->dwFilterTag = paftdw->dwFilterTag; + paftei->paftda->cbFilterSize = paftdw->cbFilterSize; + paftei->paftda->fdwSupport = paftdw->fdwSupport; + paftei->paftda->cStandardFilters = paftdw->cStandardFilters; + WideCharToMultiByte( CP_ACP, 0, paftdw->szFilterTag, -1, paftei->paftda->szFilterTag, + sizeof(paftei->paftda->szFilterTag), NULL, NULL ); + + return (paftei->fnCallback)(hadid, paftei->paftda, + paftei->dwInstance, fdwSupport); +} + +/*********************************************************************** + * acmFilterTagEnumA (MSACM32.@) + */ +MMRESULT WINAPI acmFilterTagEnumA(HACMDRIVER had, PACMFILTERTAGDETAILSA paftda, + ACMFILTERTAGENUMCBA fnCallback, DWORD dwInstance, + DWORD fdwEnum) +{ + ACMFILTERTAGDETAILSW aftdw; + struct MSACM_FilterTagEnumWtoA_Instance aftei; + + memset(&aftdw, 0, sizeof(aftdw)); + aftdw.cbStruct = sizeof(aftdw); + aftdw.dwFilterTagIndex = paftda->dwFilterTagIndex; + aftdw.dwFilterTag = paftda->dwFilterTag; + + aftei.paftda = paftda; + aftei.dwInstance = dwInstance; + aftei.fnCallback = fnCallback; + + return acmFilterTagEnumW(had, &aftdw, MSACM_FilterTagEnumCallbackWtoA, + (DWORD)&aftei, fdwEnum); +} + +/*********************************************************************** + * acmFilterTagEnumW (MSACM32.@) + */ +MMRESULT WINAPI acmFilterTagEnumW(HACMDRIVER had, PACMFILTERTAGDETAILSW paftd, + ACMFILTERTAGENUMCBW fnCallback, DWORD dwInstance, + DWORD fdwEnum) +{ + PWINE_ACMDRIVERID padid; + int i; + + TRACE("(%p, %p, %p, %ld, %ld)\n", + had, paftd, fnCallback, dwInstance, fdwEnum); + + if (paftd->cbStruct < sizeof(*paftd)) return MMSYSERR_INVALPARAM; + + if (had) FIXME("had != NULL, not supported\n"); + + for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) { + /* should check for codec only */ + if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && + acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == MMSYSERR_NOERROR) { + + for (i = 0; i < padid->cFilterTags; i++) { + paftd->dwFilterTagIndex = i; + if (acmFilterTagDetailsW(had, paftd, ACM_FILTERTAGDETAILSF_INDEX) == MMSYSERR_NOERROR) { + if (!(fnCallback)((HACMDRIVERID)padid, paftd, dwInstance, padid->fdwSupport)) { + padid = NULL; + break; + } + } + } + } + acmDriverClose(had, 0); + } + return MMSYSERR_NOERROR; +} diff --git a/reactos/lib/msacm/format.c b/reactos/lib/msacm/format.c new file mode 100644 index 00000000000..b6825689140 --- /dev/null +++ b/reactos/lib/msacm/format.c @@ -0,0 +1,832 @@ +/* -*- tab-width: 8; c-basic-offset: 4 -*- */ + +/* + * MSACM32 library + * + * Copyright 1998 Patrik Stridvall + * 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 + */ + +#include <stdarg.h> +#include <string.h> +#include "windef.h" +#include "winbase.h" +#include "winnls.h" +#include "winerror.h" +#include "wingdi.h" +#include "winuser.h" +#include "wine/unicode.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 PACMFORMATCHOOSEA afc; + +struct MSACM_FillFormatData { + HWND hWnd; +#define WINE_ACMFF_TAG 0 +#define WINE_ACMFF_FORMAT 1 +#define WINE_ACMFF_WFX 2 + int mode; + char szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS]; + PACMFORMATCHOOSEA afc; + DWORD ret; +}; + +static BOOL CALLBACK MSACM_FillFormatTagsCB(HACMDRIVERID hadid, + PACMFORMATTAGDETAILSA paftd, + DWORD dwInstance, DWORD fdwSupport) +{ + struct MSACM_FillFormatData* affd = (struct MSACM_FillFormatData*)dwInstance; + + switch (affd->mode) { + case WINE_ACMFF_TAG: + if (SendDlgItemMessageA(affd->hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG, + CB_FINDSTRINGEXACT, + (WPARAM)-1, (LPARAM)paftd->szFormatTag) == CB_ERR) + SendDlgItemMessageA(affd->hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG, + CB_ADDSTRING, 0, (DWORD)paftd->szFormatTag); + break; + case WINE_ACMFF_FORMAT: + if (strcmp(affd->szFormatTag, paftd->szFormatTag) == 0) { + HACMDRIVER had; + + if (acmDriverOpen(&had, hadid, 0) == MMSYSERR_NOERROR) { + ACMFORMATDETAILSA afd; + int i, idx; + MMRESULT mmr; + char buffer[ACMFORMATDETAILS_FORMAT_CHARS+16]; + + afd.cbStruct = sizeof(afd); + afd.dwFormatTag = paftd->dwFormatTag; + afd.pwfx = HeapAlloc(MSACM_hHeap, 0, paftd->cbFormatSize); + if (!afd.pwfx) return FALSE; + afd.pwfx->wFormatTag = paftd->dwFormatTag; + afd.pwfx->cbSize = paftd->cbFormatSize; + afd.cbwfx = paftd->cbFormatSize; + + for (i = 0; i < paftd->cStandardFormats; i++) { + afd.dwFormatIndex = i; + mmr = acmFormatDetailsA(had, &afd, ACM_FORMATDETAILSF_INDEX); + if (mmr == MMSYSERR_NOERROR) { + strncpy(buffer, afd.szFormat, ACMFORMATTAGDETAILS_FORMATTAG_CHARS); + for (idx = strlen(buffer); + idx < ACMFORMATTAGDETAILS_FORMATTAG_CHARS; idx++) + buffer[idx] = ' '; + wsprintfA(buffer + ACMFORMATTAGDETAILS_FORMATTAG_CHARS, + "%d Ko/s", + (afd.pwfx->nAvgBytesPerSec + 512) / 1024); + SendDlgItemMessageA(affd->hWnd, + IDD_ACMFORMATCHOOSE_CMB_FORMAT, + CB_ADDSTRING, 0, (DWORD)buffer); + } + } + acmDriverClose(had, 0); + SendDlgItemMessageA(affd->hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMAT, + CB_SETCURSEL, 0, 0); + HeapFree(MSACM_hHeap, 0, afd.pwfx); + } + } + break; + case WINE_ACMFF_WFX: + if (strcmp(affd->szFormatTag, paftd->szFormatTag) == 0) { + HACMDRIVER had; + + if (acmDriverOpen(&had, hadid, 0) == MMSYSERR_NOERROR) { + ACMFORMATDETAILSA afd; + + afd.cbStruct = sizeof(afd); + afd.dwFormatTag = paftd->dwFormatTag; + afd.pwfx = affd->afc->pwfx; + afd.cbwfx = affd->afc->cbwfx; + + afd.dwFormatIndex = SendDlgItemMessageA(affd->hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMAT, + CB_GETCURSEL, 0, 0); + affd->ret = acmFormatDetailsA(had, &afd, ACM_FORMATDETAILSF_INDEX); + acmDriverClose(had, 0); + return TRUE; + } + } + break; + default: + FIXME("Unknown mode (%d)\n", affd->mode); + break; + } + return TRUE; +} + +static BOOL MSACM_FillFormatTags(HWND hWnd) +{ + ACMFORMATTAGDETAILSA aftd; + struct MSACM_FillFormatData affd; + + memset(&aftd, 0, sizeof(aftd)); + aftd.cbStruct = sizeof(aftd); + + affd.hWnd = hWnd; + affd.mode = WINE_ACMFF_TAG; + + acmFormatTagEnumA(NULL, &aftd, MSACM_FillFormatTagsCB, (DWORD)&affd, 0); + SendDlgItemMessageA(hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG, CB_SETCURSEL, 0, 0); + return TRUE; +} + +static BOOL MSACM_FillFormat(HWND hWnd) +{ + ACMFORMATTAGDETAILSA aftd; + struct MSACM_FillFormatData affd; + + SendDlgItemMessageA(hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMAT, CB_RESETCONTENT, 0, 0); + + memset(&aftd, 0, sizeof(aftd)); + aftd.cbStruct = sizeof(aftd); + + affd.hWnd = hWnd; + affd.mode = WINE_ACMFF_FORMAT; + SendDlgItemMessageA(hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG, + CB_GETLBTEXT, + SendDlgItemMessageA(hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG, + CB_GETCURSEL, 0, 0), + (DWORD)affd.szFormatTag); + + acmFormatTagEnumA(NULL, &aftd, MSACM_FillFormatTagsCB, (DWORD)&affd, 0); + SendDlgItemMessageA(hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMAT, CB_SETCURSEL, 0, 0); + return TRUE; +} + +static MMRESULT MSACM_GetWFX(HWND hWnd, PACMFORMATCHOOSEA afc) +{ + ACMFORMATTAGDETAILSA aftd; + struct MSACM_FillFormatData affd; + + memset(&aftd, 0, sizeof(aftd)); + aftd.cbStruct = sizeof(aftd); + + affd.hWnd = hWnd; + affd.mode = WINE_ACMFF_WFX; + affd.afc = afc; + affd.ret = MMSYSERR_NOERROR; + SendDlgItemMessageA(hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG, + CB_GETLBTEXT, + SendDlgItemMessageA(hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG, + CB_GETCURSEL, 0, 0), + (DWORD)affd.szFormatTag); + + acmFormatTagEnumA(NULL, &aftd, MSACM_FillFormatTagsCB, (DWORD)&affd, 0); + return affd.ret; +} + +static INT_PTR CALLBACK FormatChooseDlgProc(HWND hWnd, UINT msg, + WPARAM wParam, LPARAM lParam) +{ + + TRACE("hwnd=%p msg=%i 0x%08x 0x%08lx\n", hWnd, msg, wParam, lParam ); + + switch (msg) { + case WM_INITDIALOG: + afc = (PACMFORMATCHOOSEA)lParam; + MSACM_FillFormatTags(hWnd); + MSACM_FillFormat(hWnd); + if ((afc->fdwStyle & ~(ACMFORMATCHOOSE_STYLEF_CONTEXTHELP| + ACMFORMATCHOOSE_STYLEF_SHOWHELP)) != 0) + FIXME("Unsupported style %08lx\n", ((PACMFORMATCHOOSEA)lParam)->fdwStyle); + if (!(afc->fdwStyle & ACMFORMATCHOOSE_STYLEF_SHOWHELP)) + ShowWindow(GetDlgItem(hWnd, IDD_ACMFORMATCHOOSE_BTN_HELP), SW_HIDE); + return TRUE; + + case WM_COMMAND: + switch (LOWORD(wParam)) { + case IDOK: + EndDialog(hWnd, MSACM_GetWFX(hWnd, afc)); + return TRUE; + case IDCANCEL: + EndDialog(hWnd, ACMERR_CANCELED); + return TRUE; + case IDD_ACMFORMATCHOOSE_CMB_FORMATTAG: + switch (HIWORD(wParam)) { + case CBN_SELCHANGE: + MSACM_FillFormat(hWnd); + break; + default: + TRACE("Dropped dlgNotif (fmtTag): 0x%08x 0x%08lx\n", + HIWORD(wParam), lParam); + break; + } + break; + case IDD_ACMFORMATCHOOSE_BTN_HELP: + if (afc->fdwStyle & ACMFORMATCHOOSE_STYLEF_SHOWHELP) + SendMessageA(afc->hwndOwner, + RegisterWindowMessageA(ACMHELPMSGSTRINGA), 0L, 0L); + break; + + default: + TRACE("Dropped dlgCmd: ctl=%d ntf=0x%04x 0x%08lx\n", + LOWORD(wParam), HIWORD(wParam), lParam); + break; + } + break; + case WM_CONTEXTMENU: + if (afc->fdwStyle & ACMFORMATCHOOSE_STYLEF_CONTEXTHELP) + SendMessageA(afc->hwndOwner, + RegisterWindowMessageA(ACMHELPMSGCONTEXTMENUA), + wParam, lParam); + break; +#if defined(WM_CONTEXTHELP) + case WM_CONTEXTHELP: + if (afc->fdwStyle & ACMFORMATCHOOSE_STYLEF_CONTEXTHELP) + SendMessageA(afc->hwndOwner, + RegisterWindowMessageA(ACMHELPMSGCONTEXTHELPA), + wParam, lParam); + break; +#endif + default: + TRACE("Dropped dlgMsg: hwnd=%p msg=%i 0x%08x 0x%08lx\n", + hWnd, msg, wParam, lParam ); + break; + } + return FALSE; +} + +/*********************************************************************** + * acmFormatChooseA (MSACM32.@) + */ +MMRESULT WINAPI acmFormatChooseA(PACMFORMATCHOOSEA pafmtc) +{ + return DialogBoxParamA(MSACM_hInstance32, MAKEINTRESOURCEA(DLG_ACMFORMATCHOOSE_ID), + pafmtc->hwndOwner, FormatChooseDlgProc, (INT)pafmtc); +} + +/*********************************************************************** + * acmFormatChooseW (MSACM32.@) + */ +MMRESULT WINAPI acmFormatChooseW(PACMFORMATCHOOSEW pafmtc) +{ + FIXME("(%p): stub\n", pafmtc); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmFormatDetailsA (MSACM32.@) + */ +MMRESULT WINAPI acmFormatDetailsA(HACMDRIVER had, PACMFORMATDETAILSA pafd, + DWORD fdwDetails) +{ + ACMFORMATDETAILSW afdw; + MMRESULT mmr; + + memset(&afdw, 0, sizeof(afdw)); + afdw.cbStruct = sizeof(afdw); + afdw.dwFormatIndex = pafd->dwFormatIndex; + afdw.dwFormatTag = pafd->dwFormatTag; + afdw.pwfx = pafd->pwfx; + afdw.cbwfx = pafd->cbwfx; + + mmr = acmFormatDetailsW(had, &afdw, fdwDetails); + if (mmr == MMSYSERR_NOERROR) { + pafd->dwFormatTag = afdw.dwFormatTag; + pafd->fdwSupport = afdw.fdwSupport; + WideCharToMultiByte( CP_ACP, 0, afdw.szFormat, -1, + pafd->szFormat, sizeof(pafd->szFormat), NULL, NULL ); + } + return mmr; +} + +/*********************************************************************** + * acmFormatDetailsW (MSACM32.@) + */ +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}; + ACMFORMATTAGDETAILSA aftd; + + TRACE("(%p, %p, %ld)\n", had, pafd, fdwDetails); + + memset(&aftd, 0, sizeof(aftd)); + aftd.cbStruct = sizeof(aftd); + + if (pafd->cbStruct < sizeof(*pafd)) return MMSYSERR_INVALPARAM; + + switch (fdwDetails) { + case ACM_FORMATDETAILSF_FORMAT: + if (pafd->dwFormatTag != pafd->pwfx->wFormatTag) { + mmr = MMSYSERR_INVALPARAM; + break; + } + if (had == NULL) { + PWINE_ACMDRIVERID padid; + + mmr = ACMERR_NOTPOSSIBLE; + for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) { + /* should check for codec only */ + if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && + acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) { + mmr = MSACM_Message(had, ACMDM_FORMAT_DETAILS, (LPARAM)pafd, fdwDetails); + acmDriverClose(had, 0); + if (mmr == MMSYSERR_NOERROR) break; + } + } + } else { + mmr = MSACM_Message(had, ACMDM_FORMAT_DETAILS, (LPARAM)pafd, fdwDetails); + } + break; + case ACM_FORMATDETAILSF_INDEX: + /* should check pafd->dwFormatIndex < aftd->cStandardFormats */ + mmr = MSACM_Message(had, ACMDM_FORMAT_DETAILS, (LPARAM)pafd, fdwDetails); + break; + default: + WARN("Unknown fdwDetails %08lx\n", fdwDetails); + mmr = MMSYSERR_INVALFLAG; + break; + } + + if (mmr == MMSYSERR_NOERROR && pafd->szFormat[0] == (WCHAR)0) { + wsprintfW(pafd->szFormat, fmt1, pafd->pwfx->nSamplesPerSec); + if (pafd->pwfx->wBitsPerSample) { + wsprintfW(pafd->szFormat + lstrlenW(pafd->szFormat), fmt2, + pafd->pwfx->wBitsPerSample); + } + MultiByteToWideChar( CP_ACP, 0, (pafd->pwfx->nChannels == 1) ? "; Mono" : "; Stereo", -1, + pafd->szFormat + strlenW(pafd->szFormat), + sizeof(pafd->szFormat)/sizeof(WCHAR) - strlenW(pafd->szFormat) ); + } + + TRACE("=> %d\n", mmr); + return mmr; +} + +struct MSACM_FormatEnumWtoA_Instance { + PACMFORMATDETAILSA pafda; + DWORD dwInstance; + ACMFORMATENUMCBA fnCallback; +}; + +static BOOL CALLBACK MSACM_FormatEnumCallbackWtoA(HACMDRIVERID hadid, + PACMFORMATDETAILSW pafdw, + DWORD dwInstance, + DWORD fdwSupport) +{ + struct MSACM_FormatEnumWtoA_Instance* pafei; + + pafei = (struct MSACM_FormatEnumWtoA_Instance*)dwInstance; + + pafei->pafda->dwFormatIndex = pafdw->dwFormatIndex; + pafei->pafda->dwFormatTag = pafdw->dwFormatTag; + pafei->pafda->fdwSupport = pafdw->fdwSupport; + WideCharToMultiByte( CP_ACP, 0, pafdw->szFormat, -1, + pafei->pafda->szFormat, sizeof(pafei->pafda->szFormat), NULL, NULL ); + + return (pafei->fnCallback)(hadid, pafei->pafda, + pafei->dwInstance, fdwSupport); +} + +/*********************************************************************** + * acmFormatEnumA (MSACM32.@) + */ +MMRESULT WINAPI acmFormatEnumA(HACMDRIVER had, PACMFORMATDETAILSA pafda, + ACMFORMATENUMCBA fnCallback, DWORD dwInstance, + DWORD fdwEnum) +{ + ACMFORMATDETAILSW afdw; + struct MSACM_FormatEnumWtoA_Instance afei; + + memset(&afdw, 0, sizeof(afdw)); + afdw.cbStruct = sizeof(afdw); + afdw.dwFormatIndex = pafda->dwFormatIndex; + afdw.dwFormatTag = pafda->dwFormatTag; + afdw.pwfx = pafda->pwfx; + afdw.cbwfx = pafda->cbwfx; + + afei.pafda = pafda; + afei.dwInstance = dwInstance; + afei.fnCallback = fnCallback; + + return acmFormatEnumW(had, &afdw, MSACM_FormatEnumCallbackWtoA, + (DWORD)&afei, fdwEnum); +} + +/*********************************************************************** + * acmFormatEnumW (MSACM32.@) + */ +static BOOL MSACM_FormatEnumHelper(PWINE_ACMDRIVERID padid, HACMDRIVER had, + PACMFORMATDETAILSW pafd, PWAVEFORMATEX pwfxRef, + ACMFORMATENUMCBW fnCallback, DWORD dwInstance, + DWORD fdwEnum) +{ + ACMFORMATTAGDETAILSW aftd; + int i, j; + + for (i = 0; i < padid->cFormatTags; i++) { + memset(&aftd, 0, sizeof(aftd)); + aftd.cbStruct = sizeof(aftd); + aftd.dwFormatTagIndex = i; + if (acmFormatTagDetailsW(had, &aftd, ACM_FORMATTAGDETAILSF_INDEX) != MMSYSERR_NOERROR) + continue; + + if ((fdwEnum & ACM_FORMATENUMF_WFORMATTAG) && aftd.dwFormatTag != pwfxRef->wFormatTag) + continue; + + for (j = 0; j < aftd.cStandardFormats; j++) { + pafd->dwFormatIndex = j; + pafd->dwFormatTag = aftd.dwFormatTag; + if (acmFormatDetailsW(had, pafd, ACM_FORMATDETAILSF_INDEX) != MMSYSERR_NOERROR) + continue; + + if ((fdwEnum & ACM_FORMATENUMF_NCHANNELS) && + pafd->pwfx->nChannels != pwfxRef->nChannels) + continue; + if ((fdwEnum & ACM_FORMATENUMF_NSAMPLESPERSEC) && + pafd->pwfx->nSamplesPerSec != pwfxRef->nSamplesPerSec) + continue; + if ((fdwEnum & ACM_FORMATENUMF_WBITSPERSAMPLE) && + pafd->pwfx->wBitsPerSample != pwfxRef->wBitsPerSample) + continue; + if ((fdwEnum & ACM_FORMATENUMF_HARDWARE) && + !(pafd->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_HARDWARE)) + continue; + + /* more checks to be done on fdwEnum */ + + if (!(fnCallback)((HACMDRIVERID)padid, pafd, dwInstance, padid->fdwSupport)) + return FALSE; + } + /* the "formats" used by the filters are also reported */ + } + return TRUE; +} + +/**********************************************************************/ + +MMRESULT WINAPI acmFormatEnumW(HACMDRIVER had, PACMFORMATDETAILSW pafd, + ACMFORMATENUMCBW fnCallback, DWORD dwInstance, + DWORD fdwEnum) +{ + PWINE_ACMDRIVERID padid; + WAVEFORMATEX wfxRef; + BOOL ret; + + TRACE("(%p, %p, %p, %ld, %ld)\n", + had, pafd, fnCallback, dwInstance, fdwEnum); + + if (pafd->cbStruct < sizeof(*pafd)) return MMSYSERR_INVALPARAM; + + if (fdwEnum & (ACM_FORMATENUMF_WFORMATTAG|ACM_FORMATENUMF_NCHANNELS| + ACM_FORMATENUMF_NSAMPLESPERSEC|ACM_FORMATENUMF_WBITSPERSAMPLE| + ACM_FORMATENUMF_CONVERT|ACM_FORMATENUMF_SUGGEST)) + wfxRef = *pafd->pwfx; + + if ((fdwEnum & ACM_FORMATENUMF_HARDWARE) && + !(fdwEnum & (ACM_FORMATENUMF_INPUT|ACM_FORMATENUMF_OUTPUT))) + return MMSYSERR_INVALPARAM; + + if ((fdwEnum & ACM_FORMATENUMF_WFORMATTAG) && + (pafd->dwFormatTag != pafd->pwfx->wFormatTag)) + return MMSYSERR_INVALPARAM; + + if (fdwEnum & (ACM_FORMATENUMF_CONVERT|ACM_FORMATENUMF_SUGGEST| + ACM_FORMATENUMF_INPUT|ACM_FORMATENUMF_OUTPUT)) + FIXME("Unsupported fdwEnum values %08lx\n", fdwEnum); + + if (had) { + HACMDRIVERID hadid; + + if (acmDriverID((HACMOBJ)had, &hadid, 0) != MMSYSERR_NOERROR) + return MMSYSERR_INVALHANDLE; + MSACM_FormatEnumHelper(MSACM_GetDriverID(hadid), had, pafd, &wfxRef, + fnCallback, dwInstance, fdwEnum); + return MMSYSERR_NOERROR; + } + for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) { + /* should check for codec only */ + if ((padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) || + acmDriverOpen(&had, (HACMDRIVERID)padid, 0) != MMSYSERR_NOERROR) + continue; + ret = MSACM_FormatEnumHelper(padid, had, pafd, &wfxRef, + fnCallback, dwInstance, fdwEnum); + acmDriverClose(had, 0); + if (!ret) break; + } + return MMSYSERR_NOERROR; +} + +/*********************************************************************** + * acmFormatSuggest (MSACM32.@) + */ +MMRESULT WINAPI acmFormatSuggest(HACMDRIVER had, PWAVEFORMATEX pwfxSrc, + PWAVEFORMATEX pwfxDst, DWORD cbwfxDst, DWORD fdwSuggest) +{ + ACMDRVFORMATSUGGEST adfg; + MMRESULT mmr; + + TRACE("(%p, %p, %p, %ld, %ld)\n", + had, pwfxSrc, pwfxDst, cbwfxDst, fdwSuggest); + + if (fdwSuggest & ~(ACM_FORMATSUGGESTF_NCHANNELS|ACM_FORMATSUGGESTF_NSAMPLESPERSEC| + ACM_FORMATSUGGESTF_WBITSPERSAMPLE|ACM_FORMATSUGGESTF_WFORMATTAG)) + return MMSYSERR_INVALFLAG; + + adfg.cbStruct = sizeof(adfg); + adfg.fdwSuggest = fdwSuggest; + adfg.pwfxSrc = pwfxSrc; + adfg.cbwfxSrc = (pwfxSrc->wFormatTag == WAVE_FORMAT_PCM) ? + sizeof(WAVEFORMATEX) : (sizeof(WAVEFORMATEX) + pwfxSrc->cbSize); + adfg.pwfxDst = pwfxDst; + adfg.cbwfxDst = cbwfxDst; + + if (had == NULL) { + PWINE_ACMDRIVERID padid; + + /* MS doc says: ACM finds the best suggestion. + * Well, first found will be the "best" + */ + mmr = ACMERR_NOTPOSSIBLE; + for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) { + /* should check for codec only */ + if ((padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) || + acmDriverOpen(&had, (HACMDRIVERID)padid, 0) != MMSYSERR_NOERROR) + continue; + + if (MSACM_Message(had, ACMDM_FORMAT_SUGGEST, (LPARAM)&adfg, 0L) == MMSYSERR_NOERROR) { + mmr = MMSYSERR_NOERROR; + break; + } + acmDriverClose(had, 0); + } + } else { + mmr = MSACM_Message(had, ACMDM_FORMAT_SUGGEST, (LPARAM)&adfg, 0L); + } + return mmr; +} + +/*********************************************************************** + * acmFormatTagDetailsA (MSACM32.@) + */ +MMRESULT WINAPI acmFormatTagDetailsA(HACMDRIVER had, PACMFORMATTAGDETAILSA paftda, + DWORD fdwDetails) +{ + ACMFORMATTAGDETAILSW aftdw; + MMRESULT mmr; + + memset(&aftdw, 0, sizeof(aftdw)); + aftdw.cbStruct = sizeof(aftdw); + aftdw.dwFormatTagIndex = paftda->dwFormatTagIndex; + aftdw.dwFormatTag = paftda->dwFormatTag; + + mmr = acmFormatTagDetailsW(had, &aftdw, fdwDetails); + if (mmr == MMSYSERR_NOERROR) { + paftda->dwFormatTag = aftdw.dwFormatTag; + paftda->dwFormatTagIndex = aftdw.dwFormatTagIndex; + paftda->cbFormatSize = aftdw.cbFormatSize; + paftda->fdwSupport = aftdw.fdwSupport; + paftda->cStandardFormats = aftdw.cStandardFormats; + WideCharToMultiByte( CP_ACP, 0, aftdw.szFormatTag, -1, paftda->szFormatTag, + sizeof(paftda->szFormatTag), NULL, NULL ); + } + return mmr; +} + +/*********************************************************************** + * acmFormatTagDetailsW (MSACM32.@) + */ +MMRESULT WINAPI acmFormatTagDetailsW(HACMDRIVER had, PACMFORMATTAGDETAILSW paftd, + DWORD fdwDetails) +{ + PWINE_ACMDRIVERID padid; + MMRESULT mmr = ACMERR_NOTPOSSIBLE; + + TRACE("(%p, %p, %ld)\n", had, paftd, fdwDetails); + + if (fdwDetails & ~(ACM_FORMATTAGDETAILSF_FORMATTAG|ACM_FORMATTAGDETAILSF_INDEX| + ACM_FORMATTAGDETAILSF_LARGESTSIZE)) + return MMSYSERR_INVALFLAG; + + switch (fdwDetails) { + case ACM_FORMATTAGDETAILSF_FORMATTAG: + if (had == NULL) { + for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) { + /* should check for codec only */ + if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && + MSACM_FindFormatTagInCache(padid, paftd->dwFormatTag, NULL) && + acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) { + mmr = MSACM_Message(had, ACMDM_FORMATTAG_DETAILS, (LPARAM)paftd, fdwDetails); + acmDriverClose(had, 0); + if (mmr == MMSYSERR_NOERROR) break; + } + } + } else { + PWINE_ACMDRIVER pad = MSACM_GetDriver(had); + + if (pad && MSACM_FindFormatTagInCache(pad->obj.pACMDriverID, paftd->dwFormatTag, NULL)) + mmr = MSACM_Message(had, ACMDM_FORMATTAG_DETAILS, (LPARAM)paftd, fdwDetails); + } + break; + + case ACM_FORMATTAGDETAILSF_INDEX: + if (had != NULL) { + PWINE_ACMDRIVER pad = MSACM_GetDriver(had); + + if (pad && paftd->dwFormatTagIndex < pad->obj.pACMDriverID->cFormatTags) + mmr = MSACM_Message(had, ACMDM_FORMATTAG_DETAILS, (LPARAM)paftd, fdwDetails); + } + break; + + case ACM_FORMATTAGDETAILSF_LARGESTSIZE: + if (had == NULL) { + ACMFORMATTAGDETAILSW tmp; + DWORD ft = paftd->dwFormatTag; + + for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) { + /* should check for codec only */ + if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && + acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) { + + memset(&tmp, 0, sizeof(tmp)); + tmp.cbStruct = sizeof(tmp); + tmp.dwFormatTag = ft; + + if (MSACM_Message(had, ACMDM_FORMATTAG_DETAILS, + (LPARAM)&tmp, fdwDetails) == MMSYSERR_NOERROR) { + if (mmr == ACMERR_NOTPOSSIBLE || + paftd->cbFormatSize < tmp.cbFormatSize) { + *paftd = tmp; + mmr = MMSYSERR_NOERROR; + } + } + acmDriverClose(had, 0); + } + } + } else { + mmr = MSACM_Message(had, ACMDM_FORMATTAG_DETAILS, (LPARAM)paftd, fdwDetails); + } + break; + + default: + WARN("Unsupported fdwDetails=%08lx\n", fdwDetails); + mmr = MMSYSERR_ERROR; + } + + if (mmr == MMSYSERR_NOERROR && + paftd->dwFormatTag == WAVE_FORMAT_PCM && paftd->szFormatTag[0] == 0) + MultiByteToWideChar( CP_ACP, 0, "PCM", -1, paftd->szFormatTag, + sizeof(paftd->szFormatTag)/sizeof(WCHAR) ); + + return mmr; +} + +struct MSACM_FormatTagEnumWtoA_Instance { + PACMFORMATTAGDETAILSA paftda; + DWORD dwInstance; + ACMFORMATTAGENUMCBA fnCallback; +}; + +static BOOL CALLBACK MSACM_FormatTagEnumCallbackWtoA(HACMDRIVERID hadid, + PACMFORMATTAGDETAILSW paftdw, + DWORD dwInstance, + DWORD fdwSupport) +{ + struct MSACM_FormatTagEnumWtoA_Instance* paftei; + + paftei = (struct MSACM_FormatTagEnumWtoA_Instance*)dwInstance; + + paftei->paftda->dwFormatTagIndex = paftdw->dwFormatTagIndex; + paftei->paftda->dwFormatTag = paftdw->dwFormatTag; + paftei->paftda->cbFormatSize = paftdw->cbFormatSize; + paftei->paftda->fdwSupport = paftdw->fdwSupport; + paftei->paftda->cStandardFormats = paftdw->cStandardFormats; + WideCharToMultiByte( CP_ACP, 0, paftdw->szFormatTag, -1, paftei->paftda->szFormatTag, + sizeof(paftei->paftda->szFormatTag), NULL, NULL ); + + return (paftei->fnCallback)(hadid, paftei->paftda, + paftei->dwInstance, fdwSupport); +} + +/*********************************************************************** + * acmFormatTagEnumA (MSACM32.@) + */ +MMRESULT WINAPI acmFormatTagEnumA(HACMDRIVER had, PACMFORMATTAGDETAILSA paftda, + ACMFORMATTAGENUMCBA fnCallback, DWORD dwInstance, + DWORD fdwEnum) +{ + ACMFORMATTAGDETAILSW aftdw; + struct MSACM_FormatTagEnumWtoA_Instance aftei; + + memset(&aftdw, 0, sizeof(aftdw)); + aftdw.cbStruct = sizeof(aftdw); + aftdw.dwFormatTagIndex = paftda->dwFormatTagIndex; + aftdw.dwFormatTag = paftda->dwFormatTag; + + aftei.paftda = paftda; + aftei.dwInstance = dwInstance; + aftei.fnCallback = fnCallback; + + return acmFormatTagEnumW(had, &aftdw, MSACM_FormatTagEnumCallbackWtoA, + (DWORD)&aftei, fdwEnum); +} + +/*********************************************************************** + * acmFormatTagEnumW (MSACM32.@) + */ +MMRESULT WINAPI acmFormatTagEnumW(HACMDRIVER had, PACMFORMATTAGDETAILSW paftd, + ACMFORMATTAGENUMCBW fnCallback, DWORD dwInstance, + DWORD fdwEnum) +{ + PWINE_ACMDRIVERID padid; + int i; + BOOL bPcmDone = FALSE; + + TRACE("(%p, %p, %p, %ld, %ld)\n", + had, paftd, fnCallback, dwInstance, fdwEnum); + + if (paftd->cbStruct < sizeof(*paftd)) return MMSYSERR_INVALPARAM; + + /* (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 + * the FIXME call and adding a search block below. It also seems + * that the lack of this functionality was the responsible for + * codecs to be multiply and incorrectly listed. + */ + + /* if (had) FIXME("had != NULL, not supported\n"); */ + + if (had) { + + if (acmDriverID((HACMOBJ)had, (HACMDRIVERID *)&padid, 0) != MMSYSERR_NOERROR) + return MMSYSERR_INVALHANDLE; + + for (i = 0; i < padid->cFormatTags; i++) { + paftd->dwFormatTagIndex = i; + if (MSACM_Message(had, ACMDM_FORMATTAG_DETAILS, + (LPARAM)paftd, ACM_FORMATTAGDETAILSF_INDEX) == MMSYSERR_NOERROR) { + if (paftd->dwFormatTag == WAVE_FORMAT_PCM) { + if (paftd->szFormatTag[0] == 0) + MultiByteToWideChar( CP_ACP, 0, "PCM", -1, paftd->szFormatTag, + sizeof(paftd->szFormatTag)/sizeof(WCHAR) ); + /* (WS) I'm preserving this PCM hack since it seems to be + * correct. Please notice this block was borrowed from + * below. + */ + if (bPcmDone) continue; + bPcmDone = TRUE; + } + if (!(fnCallback)((HACMDRIVERID)padid, paftd, dwInstance, padid->fdwSupport)) + return MMSYSERR_NOERROR; + } + } + + } + + /* if had==0 then search for the first suitable driver */ + else { + for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) { + /* should check for codec only */ + if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && + acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == MMSYSERR_NOERROR) { + for (i = 0; i < padid->cFormatTags; i++) { + paftd->dwFormatTagIndex = i; + if (MSACM_Message(had, ACMDM_FORMATTAG_DETAILS, + (LPARAM)paftd, ACM_FORMATTAGDETAILSF_INDEX) == MMSYSERR_NOERROR) { + if (paftd->dwFormatTag == WAVE_FORMAT_PCM) { + if (paftd->szFormatTag[0] == 0) + MultiByteToWideChar( CP_ACP, 0, "PCM", -1, paftd->szFormatTag, + sizeof(paftd->szFormatTag)/sizeof(WCHAR) ); + /* FIXME (EPP): I'm not sure this is the correct + * algorithm (should make more sense to apply the same + * for all already loaded formats, but this will do + * for now + */ + if (bPcmDone) continue; + bPcmDone = TRUE; + } + if (!(fnCallback)((HACMDRIVERID)padid, paftd, dwInstance, padid->fdwSupport)) { + acmDriverClose(had, 0); + return MMSYSERR_NOERROR; + } + } + } + } + acmDriverClose(had, 0); + } + } + return MMSYSERR_NOERROR; +} diff --git a/reactos/lib/msacm/imaadp32/.cvsignore b/reactos/lib/msacm/imaadp32/.cvsignore new file mode 100644 index 00000000000..525c7a499a9 --- /dev/null +++ b/reactos/lib/msacm/imaadp32/.cvsignore @@ -0,0 +1,3 @@ +Makefile +imaadp32.acm.dbg.c +imaadp32.acm.spec.c diff --git a/reactos/lib/msacm/imaadp32/Makefile.in b/reactos/lib/msacm/imaadp32/Makefile.in new file mode 100644 index 00000000000..79cc94e4aee --- /dev/null +++ b/reactos/lib/msacm/imaadp32/Makefile.in @@ -0,0 +1,12 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = imaadp32.acm +IMPORTS = winmm user32 kernel32 + +C_SRCS = imaadp32.c + +@MAKE_DLL_RULES@ + +### Dependencies: diff --git a/reactos/lib/msacm/imaadp32/imaadp32.acm.spec b/reactos/lib/msacm/imaadp32/imaadp32.acm.spec new file mode 100644 index 00000000000..a0ba1c7e701 --- /dev/null +++ b/reactos/lib/msacm/imaadp32/imaadp32.acm.spec @@ -0,0 +1 @@ +@ stdcall DriverProc (long long long long long) ADPCM_DriverProc diff --git a/reactos/lib/msacm/imaadp32/imaadp32.c b/reactos/lib/msacm/imaadp32/imaadp32.c new file mode 100644 index 00000000000..61d3d00c2bc --- /dev/null +++ b/reactos/lib/msacm/imaadp32/imaadp32.c @@ -0,0 +1,938 @@ +/* + * IMA ADPCM handling + * + * Copyright (C) 2001,2002 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 + */ + +#include <assert.h> +#include <stdarg.h> +#include <string.h> +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "winnls.h" +#include "mmsystem.h" +#include "mmreg.h" +#include "msacm.h" +#include "msacmdrv.h" +#include "wine/debug.h" + +/* see http://www.pcisys.net/~melanson/codecs/adpcm.txt for the details */ + +WINE_DEFAULT_DEBUG_CHANNEL(adpcm); + +/*********************************************************************** + * ADPCM_drvOpen + */ +static DWORD ADPCM_drvOpen(LPCSTR str) +{ + return 1; +} + +/*********************************************************************** + * ADPCM_drvClose + */ +static DWORD ADPCM_drvClose(DWORD dwDevID) +{ + return 1; +} + +typedef struct tagAcmAdpcmData +{ + void (*convert)(PACMDRVSTREAMINSTANCE adsi, + const unsigned char*, LPDWORD, unsigned char*, LPDWORD); + /* IMA encoding only */ + BYTE stepIndexL; + BYTE stepIndexR; + /* short sample; */ +} AcmAdpcmData; + +/* table to list all supported formats... those are the basic ones. this + * also helps given a unique index to each of the supported formats + */ +typedef struct +{ + int nChannels; + int nBits; + int rate; +} Format; + +static Format 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}, +}; + +static Format ADPCM_Formats[] = +{ + {1, 4, 8000}, {2, 4, 8000}, {1, 4, 11025}, {2, 4, 11025}, + {1, 4, 22050}, {2, 4, 22050}, {1, 4, 44100}, {2, 4, 44100}, +}; + +#define NUM_PCM_FORMATS (sizeof(PCM_Formats) / sizeof(PCM_Formats[0])) +#define NUM_ADPCM_FORMATS (sizeof(ADPCM_Formats) / sizeof(ADPCM_Formats[0])) + +/*********************************************************************** + * ADPCM_GetFormatIndex + */ +static DWORD ADPCM_GetFormatIndex(LPWAVEFORMATEX wfx) +{ + int i, hi; + Format* fmts; + + switch (wfx->wFormatTag) + { + case WAVE_FORMAT_PCM: + hi = NUM_PCM_FORMATS; + fmts = PCM_Formats; + break; + case WAVE_FORMAT_IMA_ADPCM: + hi = NUM_ADPCM_FORMATS; + fmts = ADPCM_Formats; + break; + default: + return 0xFFFFFFFF; + } + + for (i = 0; i < hi; i++) + { + if (wfx->nChannels == fmts[i].nChannels && + wfx->nSamplesPerSec == fmts[i].rate && + wfx->wBitsPerSample == fmts[i].nBits) + return i; + } + + return 0xFFFFFFFF; +} + +/*********************************************************************** + * 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); +} + +/* IMA (or DVI) APDCM codec routines */ + +static const unsigned IMA_StepTable[89] = +{ + 7, 8, 9, 10, 11, 12, 13, 14, + 16, 17, 19, 21, 23, 25, 28, 31, + 34, 37, 41, 45, 50, 55, 60, 66, + 73, 80, 88, 97, 107, 118, 130, 143, + 157, 173, 190, 209, 230, 253, 279, 307, + 337, 371, 408, 449, 494, 544, 598, 658, + 724, 796, 876, 963, 1060, 1166, 1282, 1411, + 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, + 3327, 3660, 4026, 4428, 4871, 5358, 5894, 6484, + 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899, + 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, + 32767 +}; + +static const int IMA_IndexTable[16] = +{ + -1, -1, -1, -1, 2, 4, 6, 8, + -1, -1, -1, -1, 2, 4, 6, 8 +}; + +static inline void clamp_step_index(int* stepIndex) +{ + if (*stepIndex < 0 ) *stepIndex = 0; + if (*stepIndex > 88) *stepIndex = 88; +} + +static inline void clamp_sample(int* sample) +{ + if (*sample < -32768) *sample = -32768; + if (*sample > 32767) *sample = 32767; +} + +static inline void process_nibble(unsigned char code, int* stepIndex, int* sample) +{ + unsigned step; + int diff; + + code &= 0x0F; + + step = IMA_StepTable[*stepIndex]; + diff = step >> 3; + if (code & 1) diff += step >> 2; + if (code & 2) diff += step >> 1; + if (code & 4) diff += step; + if (code & 8) *sample -= diff; + else *sample += diff; + clamp_sample(sample); + *stepIndex += IMA_IndexTable[code]; + clamp_step_index(stepIndex); +} + +static inline unsigned char generate_nibble(int in, int* stepIndex, int* sample) +{ + int effdiff, diff = in - *sample; + unsigned step; + unsigned char code; + + if (diff < 0) + { + diff = -diff; + code = 8; + } + else + { + code = 0; + } + + step = IMA_StepTable[*stepIndex]; + effdiff = (step >> 3); + if (diff >= step) + { + code |= 4; + diff -= step; + effdiff += step; + } + step >>= 1; + if (diff >= step) + { + code |= 2; + diff -= step; + effdiff += step; + } + step >>= 1; + if (diff >= step) + { + code |= 1; + effdiff += step; + } + if (code & 8) *sample -= effdiff; + else *sample += effdiff; + clamp_sample(sample); + *stepIndex += IMA_IndexTable[code]; + clamp_step_index(stepIndex); + return code; +} + +static void cvtSSima16K(PACMDRVSTREAMINSTANCE adsi, + const unsigned char* src, LPDWORD nsrc, + unsigned char* dst, LPDWORD ndst) +{ + int i; + int sampleL, sampleR; + int stepIndexL, stepIndexR; + int nsamp_blk = ((LPIMAADPCMWAVEFORMAT)adsi->pwfxSrc)->wSamplesPerBlock; + int nsamp; + /* compute the number of entire blocks we can decode... + * it's the min of the number of entire blocks in source buffer and the number + * of entire blocks in destination buffer + */ + DWORD nblock = min(*nsrc / adsi->pwfxSrc->nBlockAlign, + *ndst / (nsamp_blk * 2 * 2)); + + *nsrc = nblock * adsi->pwfxSrc->nBlockAlign; + *ndst = nblock * (nsamp_blk * 2 * 2); + + nsamp_blk--; /* remove the sample in block header */ + for (; nblock > 0; nblock--) + { + const unsigned char* in_src = src; + + /* handle headers first */ + sampleL = R16(src); + stepIndexL = (unsigned)*(src + 2); + clamp_step_index(&stepIndexL); + src += 4; + W16(dst, sampleL); dst += 2; + + sampleR = R16(src); + stepIndexR = (unsigned)*(src + 2); + clamp_step_index(&stepIndexR); + src += 4; + W16(dst, sampleR); dst += 2; + + for (nsamp = nsamp_blk; nsamp > 0; nsamp -= 8) + { + for (i = 0; i < 4; i++) + { + process_nibble(*src, &stepIndexL, &sampleL); + W16(dst + (2 * i + 0) * 4 + 0, sampleL); + process_nibble(*src++ >> 4, &stepIndexL, &sampleL); + W16(dst + (2 * i + 1) * 4 + 0, sampleL); + } + for (i = 0; i < 4; i++) + { + process_nibble(*src , &stepIndexR, &sampleR); + W16(dst + (2 * i + 0) * 4 + 2, sampleR); + process_nibble(*src++ >>4, &stepIndexR, &sampleR); + W16(dst + (2 * i + 1) * 4 + 2, sampleR); + } + dst += 32; + } + /* we have now to realign the source pointer on block */ + src = in_src + adsi->pwfxSrc->nBlockAlign; + } +} + +static void cvtMMima16K(PACMDRVSTREAMINSTANCE adsi, + const unsigned char* src, LPDWORD nsrc, + unsigned char* dst, LPDWORD ndst) +{ + int sample; + int stepIndex; + int nsamp_blk = ((LPIMAADPCMWAVEFORMAT)adsi->pwfxSrc)->wSamplesPerBlock; + int nsamp; + /* compute the number of entire blocks we can decode... + * it's the min of the number of entire blocks in source buffer and the number + * of entire blocks in destination buffer + */ + DWORD nblock = min(*nsrc / adsi->pwfxSrc->nBlockAlign, + *ndst / (nsamp_blk * 2)); + + *nsrc = nblock * adsi->pwfxSrc->nBlockAlign; + *ndst = nblock * nsamp_blk * 2; + + nsamp_blk--; /* remove the sample in block header */ + for (; nblock > 0; nblock--) + { + const unsigned char* in_src = src; + + /* handle header first */ + sample = R16(src); + stepIndex = (unsigned)*(src + 2); + clamp_step_index(&stepIndex); + src += 4; + W16(dst, sample); dst += 2; + + for (nsamp = nsamp_blk; nsamp > 0; nsamp -= 2) + { + process_nibble(*src, &stepIndex, &sample); + W16(dst, sample); dst += 2; + process_nibble(*src++ >> 4, &stepIndex, &sample); + W16(dst, sample); dst += 2; + } + /* we have now to realign the source pointer on block */ + src = in_src + adsi->pwfxSrc->nBlockAlign; + } +} + +static void cvtSS16imaK(PACMDRVSTREAMINSTANCE adsi, + const unsigned char* src, LPDWORD nsrc, + unsigned char* dst, LPDWORD ndst) +{ + int stepIndexL, stepIndexR; + int sampleL, sampleR; + BYTE code1, code2; + int nsamp_blk = ((LPIMAADPCMWAVEFORMAT)adsi->pwfxDst)->wSamplesPerBlock; + int i, nsamp; + /* compute the number of entire blocks we can decode... + * it's the min of the number of entire blocks in source buffer and the number + * of entire blocks in destination buffer + */ + DWORD nblock = min(*nsrc / (nsamp_blk * 2 * 2), + *ndst / adsi->pwfxDst->nBlockAlign); + + *nsrc = nblock * (nsamp_blk * 2 * 2); + *ndst = nblock * adsi->pwfxDst->nBlockAlign; + + stepIndexL = ((AcmAdpcmData*)adsi->dwDriver)->stepIndexL; + stepIndexR = ((AcmAdpcmData*)adsi->dwDriver)->stepIndexR; + + nsamp_blk--; /* so that we won't count the sample in header while filling the block */ + + for (; nblock > 0; nblock--) + { + char* in_dst = dst; + + /* generate header */ + sampleL = R16(src); src += 2; + W16(dst, sampleL); dst += 2; + *dst = (unsigned char)(unsigned)stepIndexL; + dst += 2; + + sampleR = R16(src); src += 2; + W16(dst, sampleR); dst += 2; + *dst = (unsigned char)(unsigned)stepIndexR; + dst += 2; + + for (nsamp = nsamp_blk; nsamp > 0; nsamp -= 8) + { + for (i = 0; i < 4; i++) + { + code1 = generate_nibble(R16(src + (2 * i + 0) * 2 + 0), + &stepIndexL, &sampleL); + code2 = generate_nibble(R16(src + (2 * i + 1) * 2 + 0), + &stepIndexL, &sampleL); + *dst++ = (code1 << 4) | code2; + } + for (i = 0; i < 4; i++) + { + code1 = generate_nibble(R16(src + (2 * i + 0) * 2 + 1), + &stepIndexR, &sampleR); + code2 = generate_nibble(R16(src + (2 * i + 1) * 2 + 1), + &stepIndexR, &sampleR); + *dst++ = (code1 << 4) | code2; + } + src += 32; + } + dst = in_dst + adsi->pwfxDst->nBlockAlign; + } + ((AcmAdpcmData*)adsi->dwDriver)->stepIndexL = stepIndexL; + ((AcmAdpcmData*)adsi->dwDriver)->stepIndexR = stepIndexR; +} + +static void cvtMM16imaK(PACMDRVSTREAMINSTANCE adsi, + const unsigned char* src, LPDWORD nsrc, + unsigned char* dst, LPDWORD ndst) +{ + int stepIndex; + int sample; + BYTE code1, code2; + int nsamp_blk = ((LPIMAADPCMWAVEFORMAT)adsi->pwfxDst)->wSamplesPerBlock; + int nsamp; + /* compute the number of entire blocks we can decode... + * it's the min of the number of entire blocks in source buffer and the number + * of entire blocks in destination buffer + */ + DWORD nblock = min(*nsrc / (nsamp_blk * 2), + *ndst / adsi->pwfxDst->nBlockAlign); + + *nsrc = nblock * (nsamp_blk * 2); + *ndst = nblock * adsi->pwfxDst->nBlockAlign; + + stepIndex = ((AcmAdpcmData*)adsi->dwDriver)->stepIndexL; + nsamp_blk--; /* so that we won't count the sample in header while filling the block */ + + for (; nblock > 0; nblock--) + { + char* in_dst = dst; + + /* generate header */ + /* FIXME: what about the last effective sample from previous block ??? */ + /* perhaps something like: + * sample += R16(src); + * clamp_sample(sample); + * and with : + * + saving the sample in adsi->dwDriver when all blocks are done + + + reset should set the field in adsi->dwDriver to 0 too + */ + sample = R16(src); src += 2; + W16(dst, sample); dst += 2; + *dst = (unsigned char)(unsigned)stepIndex; + dst += 2; + + for (nsamp = nsamp_blk; nsamp > 0; nsamp -= 2) + { + code1 = generate_nibble(R16(src), &stepIndex, &sample); + src += 2; + code2 = generate_nibble(R16(src), &stepIndex, &sample); + src += 2; + *dst++ = (code1 << 4) | code2; + } + dst = in_dst + adsi->pwfxDst->nBlockAlign; + } + ((AcmAdpcmData*)adsi->dwDriver)->stepIndexL = stepIndex; +} + +/*********************************************************************** + * ADPCM_DriverDetails + * + */ +static LRESULT ADPCM_DriverDetails(PACMDRIVERDETAILSW 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_CODEC; + add->cFormatTags = 2; /* PCM, IMA ADPCM */ + add->cFilterTags = 0; + add->hicon = NULL; + MultiByteToWideChar( CP_ACP, 0, "WINE-ADPCM", -1, + add->szShortName, sizeof(add->szShortName)/sizeof(WCHAR) ); + MultiByteToWideChar( CP_ACP, 0, "Wine IMA ADPCM 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; +} + +/*********************************************************************** + * ADPCM_FormatTagDetails + * + */ +static LRESULT ADPCM_FormatTagDetails(PACMFORMATTAGDETAILSW aftd, DWORD dwQuery) +{ + static WCHAR szPcm[]={'P','C','M',0}; + static WCHAR szImaAdPcm[]={'I','M','A',' ','A','d','P','C','M',0}; + + switch (dwQuery) + { + case ACM_FORMATTAGDETAILSF_INDEX: + if (aftd->dwFormatTagIndex >= 2) return ACMERR_NOTPOSSIBLE; + break; + case ACM_FORMATTAGDETAILSF_LARGESTSIZE: + if (aftd->dwFormatTag == WAVE_FORMAT_UNKNOWN) + { + aftd->dwFormatTagIndex = 1; /* WAVE_FORMAT_IMA_ADPCM is bigger than PCM */ + break; + } + /* fall thru */ + case ACM_FORMATTAGDETAILSF_FORMATTAG: + switch (aftd->dwFormatTag) + { + case WAVE_FORMAT_PCM: aftd->dwFormatTagIndex = 0; break; + case WAVE_FORMAT_IMA_ADPCM: aftd->dwFormatTagIndex = 1; break; + default: return ACMERR_NOTPOSSIBLE; + } + break; + default: + WARN("Unsupported query %08lx\n", dwQuery); + return MMSYSERR_NOTSUPPORTED; + } + + aftd->fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CODEC; + switch (aftd->dwFormatTagIndex) + { + case 0: + aftd->dwFormatTag = WAVE_FORMAT_PCM; + aftd->cbFormatSize = sizeof(PCMWAVEFORMAT); + aftd->cStandardFormats = NUM_PCM_FORMATS; + lstrcpyW(aftd->szFormatTag, szPcm); + break; + case 1: + aftd->dwFormatTag = WAVE_FORMAT_IMA_ADPCM; + aftd->cbFormatSize = sizeof(IMAADPCMWAVEFORMAT); + aftd->cStandardFormats = NUM_ADPCM_FORMATS; + lstrcpyW(aftd->szFormatTag, szImaAdPcm); + break; + } + return MMSYSERR_NOERROR; +} + +/*********************************************************************** + * ADPCM_FormatDetails + * + */ +static LRESULT ADPCM_FormatDetails(PACMFORMATDETAILSW afd, DWORD dwQuery) +{ + switch (dwQuery) + { + case ACM_FORMATDETAILSF_FORMAT: + if (ADPCM_GetFormatIndex(afd->pwfx) == 0xFFFFFFFF) return ACMERR_NOTPOSSIBLE; + break; + case ACM_FORMATDETAILSF_INDEX: + afd->pwfx->wFormatTag = afd->dwFormatTag; + switch (afd->dwFormatTag) + { + case WAVE_FORMAT_PCM: + if (afd->dwFormatIndex >= NUM_PCM_FORMATS) return ACMERR_NOTPOSSIBLE; + 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; + case WAVE_FORMAT_IMA_ADPCM: + if (afd->dwFormatIndex >= NUM_ADPCM_FORMATS) return ACMERR_NOTPOSSIBLE; + afd->pwfx->nChannels = ADPCM_Formats[afd->dwFormatIndex].nChannels; + afd->pwfx->nSamplesPerSec = ADPCM_Formats[afd->dwFormatIndex].rate; + afd->pwfx->wBitsPerSample = ADPCM_Formats[afd->dwFormatIndex].nBits; + afd->pwfx->nBlockAlign = 1024; + /* we got 4 bits per sample */ + afd->pwfx->nAvgBytesPerSec = + (afd->pwfx->nSamplesPerSec * 4) / 8; + if (afd->cbwfx >= sizeof(WAVEFORMATEX)) + afd->pwfx->cbSize = sizeof(WORD); + if (afd->cbwfx >= sizeof(IMAADPCMWAVEFORMAT)) + ((IMAADPCMWAVEFORMAT*)afd->pwfx)->wSamplesPerBlock = (1024 - 4 * afd->pwfx->nChannels) * (2 / afd->pwfx->nChannels) + 1; + break; + default: + WARN("Unsupported tag %08lx\n", afd->dwFormatTag); + return MMSYSERR_INVALPARAM; + } + break; + default: + WARN("Unsupported query %08lx\n", dwQuery); + return MMSYSERR_NOTSUPPORTED; + } + afd->fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CODEC; + afd->szFormat[0] = 0; /* let MSACM format this for us... */ + + return MMSYSERR_NOERROR; +} + +/*********************************************************************** + * ADPCM_FormatSuggest + * + */ +static LRESULT ADPCM_FormatSuggest(PACMDRVFORMATSUGGEST adfs) +{ + /* some tests ... */ + if (adfs->cbwfxSrc < sizeof(PCMWAVEFORMAT) || + adfs->cbwfxDst < sizeof(PCMWAVEFORMAT) || + ADPCM_GetFormatIndex(adfs->pwfxSrc) == 0xFFFFFFFF) return ACMERR_NOTPOSSIBLE; + /* FIXME: should do those tests against the real size (according to format tag */ + + /* If 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)) + { + if (adfs->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM) + adfs->pwfxDst->wBitsPerSample = 4; + else + adfs->pwfxDst->wBitsPerSample = 16; + } + if (!(adfs->fdwSuggest & ACM_FORMATSUGGESTF_WFORMATTAG)) + { + if (adfs->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM) + adfs->pwfxDst->wFormatTag = WAVE_FORMAT_IMA_ADPCM; + else + adfs->pwfxDst->wFormatTag = WAVE_FORMAT_PCM; + } + + /* check if result is ok */ + if (ADPCM_GetFormatIndex(adfs->pwfxDst) == 0xFFFFFFFF) return ACMERR_NOTPOSSIBLE; + + /* recompute other values */ + switch (adfs->pwfxDst->wFormatTag) + { + case WAVE_FORMAT_PCM: + adfs->pwfxDst->nBlockAlign = (adfs->pwfxDst->nChannels * adfs->pwfxDst->wBitsPerSample) / 8; + adfs->pwfxDst->nAvgBytesPerSec = adfs->pwfxDst->nSamplesPerSec * adfs->pwfxDst->nBlockAlign; + break; + case WAVE_FORMAT_IMA_ADPCM: + adfs->pwfxDst->nBlockAlign = 1024; + /* FIXME: not handling header overhead */ + adfs->pwfxDst->nAvgBytesPerSec = ((adfs->pwfxDst->nSamplesPerSec * 4) / 8) * adfs->pwfxSrc->nChannels; + ((IMAADPCMWAVEFORMAT*)adfs->pwfxDst)->wSamplesPerBlock = (1024 - 4 * adfs->pwfxSrc->nChannels) * (2 / adfs->pwfxSrc->nChannels) + 1; + TRACE("setting spb=%u\n", ((IMAADPCMWAVEFORMAT*)adfs->pwfxDst)->wSamplesPerBlock); + break; + default: + FIXME("\n"); + break; + } + + return MMSYSERR_NOERROR; +} + +/*********************************************************************** + * ADPCM_Reset + * + */ +static void ADPCM_Reset(PACMDRVSTREAMINSTANCE adsi, AcmAdpcmData* aad) +{ + aad->stepIndexL = aad->stepIndexR = 0; +} + +/*********************************************************************** + * ADPCM_StreamOpen + * + */ +static LRESULT ADPCM_StreamOpen(PACMDRVSTREAMINSTANCE adsi) +{ + AcmAdpcmData* aad; + unsigned nspb; + + assert(!(adsi->fdwOpen & ACM_STREAMOPENF_ASYNC)); + + if (ADPCM_GetFormatIndex(adsi->pwfxSrc) == 0xFFFFFFFF || + ADPCM_GetFormatIndex(adsi->pwfxDst) == 0xFFFFFFFF) + return ACMERR_NOTPOSSIBLE; + + aad = HeapAlloc(GetProcessHeap(), 0, sizeof(AcmAdpcmData)); + if (aad == 0) return MMSYSERR_NOMEM; + + adsi->dwDriver = (DWORD)aad; + + if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM && + adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM) + { + goto theEnd; + } + else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_IMA_ADPCM && + adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM) + { + /* resampling or mono <=> stereo not available + * ADPCM algo only define 16 bit per sample output + */ + if (adsi->pwfxSrc->nSamplesPerSec != adsi->pwfxDst->nSamplesPerSec || + adsi->pwfxSrc->nChannels != adsi->pwfxDst->nChannels || + adsi->pwfxDst->wBitsPerSample != 16) + goto theEnd; + + nspb = ((LPIMAADPCMWAVEFORMAT)adsi->pwfxSrc)->wSamplesPerBlock; + TRACE("spb=%u\n", nspb); + + /* we check that in a block, after the header, samples are present on + * 4-sample packet pattern + * we also check that the block alignement is bigger than the expected size + */ + if (((nspb - 1) & 3) != 0) goto theEnd; + if ((((nspb - 1) / 2) + 4) * adsi->pwfxSrc->nChannels < adsi->pwfxSrc->nBlockAlign) + goto theEnd; + + /* adpcm decoding... */ + if (adsi->pwfxDst->wBitsPerSample == 16 && adsi->pwfxDst->nChannels == 2) + aad->convert = cvtSSima16K; + if (adsi->pwfxDst->wBitsPerSample == 16 && adsi->pwfxDst->nChannels == 1) + aad->convert = cvtMMima16K; + } + else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM && + adsi->pwfxDst->wFormatTag == WAVE_FORMAT_IMA_ADPCM) + { + if (adsi->pwfxSrc->nSamplesPerSec != adsi->pwfxDst->nSamplesPerSec || + adsi->pwfxSrc->nChannels != adsi->pwfxDst->nChannels || + adsi->pwfxSrc->wBitsPerSample != 16) + goto theEnd; + + nspb = ((LPIMAADPCMWAVEFORMAT)adsi->pwfxDst)->wSamplesPerBlock; + TRACE("spb=%u\n", nspb); + + /* we check that in a block, after the header, samples are present on + * 4-sample packet pattern + * we also check that the block alignement is bigger than the expected size + */ + if (((nspb - 1) & 3) != 0) goto theEnd; + if ((((nspb - 1) / 2) + 4) * adsi->pwfxDst->nChannels < adsi->pwfxDst->nBlockAlign) + goto theEnd; + + /* adpcm coding... */ + if (adsi->pwfxSrc->wBitsPerSample == 16 && adsi->pwfxSrc->nChannels == 2) + aad->convert = cvtSS16imaK; + if (adsi->pwfxSrc->wBitsPerSample == 16 && adsi->pwfxSrc->nChannels == 1) + aad->convert = cvtMM16imaK; + } + else goto theEnd; + ADPCM_Reset(adsi, aad); + + return MMSYSERR_NOERROR; + + theEnd: + HeapFree(GetProcessHeap(), 0, aad); + adsi->dwDriver = 0L; + return MMSYSERR_NOTSUPPORTED; +} + +/*********************************************************************** + * ADPCM_StreamClose + * + */ +static LRESULT ADPCM_StreamClose(PACMDRVSTREAMINSTANCE adsi) +{ + HeapFree(GetProcessHeap(), 0, (void*)adsi->dwDriver); + return MMSYSERR_NOERROR; +} + +/*********************************************************************** + * ADPCM_round + * + */ +static inline DWORD ADPCM_round(DWORD a, DWORD b, DWORD c) +{ + assert(a && b && c); + /* to be sure, always return an entire number of c... */ + return ((double)a * (double)b + (double)c - 1) / (double)c; +} + +/*********************************************************************** + * ADPCM_StreamSize + * + */ +static LRESULT ADPCM_StreamSize(PACMDRVSTREAMINSTANCE adsi, PACMDRVSTREAMSIZE adss) +{ + switch (adss->fdwSize) + { + case ACM_STREAMSIZEF_DESTINATION: + /* cbDstLength => cbSrcLength */ + if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM && + adsi->pwfxDst->wFormatTag == WAVE_FORMAT_IMA_ADPCM) + { + /* don't take block overhead into account, doesn't matter too much */ + adss->cbSrcLength = adss->cbDstLength * 4; + } + else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_IMA_ADPCM && + adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM) + { + FIXME("misses the block header overhead\n"); + adss->cbSrcLength = 256 + adss->cbDstLength / 4; + } + else + { + return MMSYSERR_NOTSUPPORTED; + } + break; + case ACM_STREAMSIZEF_SOURCE: + /* cbSrcLength => cbDstLength */ + if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM && + adsi->pwfxDst->wFormatTag == WAVE_FORMAT_IMA_ADPCM) + { + FIXME("misses the block header overhead\n"); + adss->cbDstLength = 256 + adss->cbSrcLength / 4; + } + else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_IMA_ADPCM && + adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM) + { + /* don't take block overhead into account, doesn't matter too much */ + adss->cbDstLength = adss->cbSrcLength * 4; + } + else + { + return MMSYSERR_NOTSUPPORTED; + } + break; + default: + WARN("Unsupported query %08lx\n", adss->fdwSize); + return MMSYSERR_NOTSUPPORTED; + } + return MMSYSERR_NOERROR; +} + +/*********************************************************************** + * ADPCM_StreamConvert + * + */ +static LRESULT ADPCM_StreamConvert(PACMDRVSTREAMINSTANCE adsi, PACMDRVSTREAMHEADER adsh) +{ + AcmAdpcmData* aad = (AcmAdpcmData*)adsi->dwDriver; + DWORD nsrc = adsh->cbSrcLength; + DWORD ndst = adsh->cbDstLength; + + 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)) + { + ADPCM_Reset(adsi, aad); + } + + aad->convert(adsi, adsh->pbSrc, &nsrc, adsh->pbDst, &ndst); + adsh->cbSrcLengthUsed = nsrc; + adsh->cbDstLengthUsed = ndst; + + return MMSYSERR_NOERROR; +} + +/************************************************************************** + * ADPCM_DriverProc [exported] + */ +LRESULT CALLBACK ADPCM_DriverProc(DWORD dwDevID, HDRVR hDriv, UINT wMsg, + LPARAM dwParam1, LPARAM dwParam2) +{ + TRACE("(%08lx %08lx %04x %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 ADPCM_drvOpen((LPSTR)dwParam1); + case DRV_CLOSE: return ADPCM_drvClose(dwDevID); + case DRV_ENABLE: return 1; + case DRV_DISABLE: return 1; + case DRV_QUERYCONFIGURE: return 1; + case DRV_CONFIGURE: MessageBoxA(0, "MSACM IMA ADPCM 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 ADPCM_DriverDetails((PACMDRIVERDETAILSW)dwParam1); + + case ACMDM_FORMATTAG_DETAILS: + return ADPCM_FormatTagDetails((PACMFORMATTAGDETAILSW)dwParam1, dwParam2); + + case ACMDM_FORMAT_DETAILS: + return ADPCM_FormatDetails((PACMFORMATDETAILSW)dwParam1, dwParam2); + + case ACMDM_FORMAT_SUGGEST: + return ADPCM_FormatSuggest((PACMDRVFORMATSUGGEST)dwParam1); + + case ACMDM_STREAM_OPEN: + return ADPCM_StreamOpen((PACMDRVSTREAMINSTANCE)dwParam1); + + case ACMDM_STREAM_CLOSE: + return ADPCM_StreamClose((PACMDRVSTREAMINSTANCE)dwParam1); + + case ACMDM_STREAM_SIZE: + return ADPCM_StreamSize((PACMDRVSTREAMINSTANCE)dwParam1, (PACMDRVSTREAMSIZE)dwParam2); + + case ACMDM_STREAM_CONVERT: + return ADPCM_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 */ + return MMSYSERR_NOTSUPPORTED; + case ACMDM_STREAM_PREPARE: + case ACMDM_STREAM_UNPREPARE: + /* nothing special to do here... so don't do anything */ + return MMSYSERR_NOERROR; + + default: + return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2); + } + return 0; +} diff --git a/reactos/lib/msacm/internal.c b/reactos/lib/msacm/internal.c new file mode 100644 index 00000000000..d54c7640214 --- /dev/null +++ b/reactos/lib/msacm/internal.c @@ -0,0 +1,415 @@ +/* -*- 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 + */ + +#include <stdarg.h> +#include <string.h> + +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "winerror.h" +#include "winreg.h" +#include "mmsystem.h" +#include "mmreg.h" +#include "msacm.h" +#include "msacmdrv.h" +#include "wineacm.h" +#include "wine/debug.h" +#include "wine/unicode.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msacm); + +/**********************************************************************/ + +HANDLE MSACM_hHeap = NULL; +PWINE_ACMDRIVERID MSACM_pFirstACMDriverID = NULL; +PWINE_ACMDRIVERID MSACM_pLastACMDriverID = NULL; + +#if 0 +/*********************************************************************** + * MSACM_DumpCache + */ +static void MSACM_DumpCache(PWINE_ACMDRIVERID padid) +{ + unsigned i; + + TRACE("cFilterTags=%lu cFormatTags=%lu fdwSupport=%08lx\n", + padid->cFilterTags, padid->cFormatTags, padid->fdwSupport); + for (i = 0; i < padid->cache->cFormatTags; i++) { + TRACE("\tdwFormatTag=%lu cbwfx=%lu\n", + padid->aFormatTag[i].dwFormatTag, padid->aFormatTag[i].cbwfx); + } +} +#endif + +/*********************************************************************** + * MSACM_FindFormatTagInCache [internal] + * + * Returns TRUE is the format tag fmtTag is present in the cache. + * If so, idx is set to its index. + */ +BOOL MSACM_FindFormatTagInCache(WINE_ACMDRIVERID* padid, DWORD fmtTag, LPDWORD idx) +{ + unsigned i; + + for (i = 0; i < padid->cFormatTags; i++) { + if (padid->aFormatTag[i].dwFormatTag == fmtTag) { + if (idx) *idx = i; + return TRUE; + } + } + return FALSE; +} + +/*********************************************************************** + * MSACM_FillCache + */ +static BOOL MSACM_FillCache(PWINE_ACMDRIVERID padid) +{ + HACMDRIVER had = 0; + int ntag; + ACMDRIVERDETAILSW add; + ACMFORMATTAGDETAILSW aftd; + + if (acmDriverOpen(&had, (HACMDRIVERID)padid, 0) != 0) + return FALSE; + + padid->aFormatTag = NULL; + add.cbStruct = sizeof(add); + if (MSACM_Message(had, ACMDM_DRIVER_DETAILS, (LPARAM)&add, 0)) + goto errCleanUp; + + if (add.cFormatTags > 0) { + padid->aFormatTag = HeapAlloc(MSACM_hHeap, HEAP_ZERO_MEMORY, + add.cFormatTags * sizeof(padid->aFormatTag[0])); + if (!padid->aFormatTag) goto errCleanUp; + } + + padid->cFormatTags = add.cFormatTags; + padid->cFilterTags = add.cFilterTags; + padid->fdwSupport = add.fdwSupport; + + aftd.cbStruct = sizeof(aftd); + + for (ntag = 0; ntag < add.cFormatTags; ntag++) { + aftd.dwFormatTagIndex = ntag; + if (MSACM_Message(had, ACMDM_FORMATTAG_DETAILS, (LPARAM)&aftd, ACM_FORMATTAGDETAILSF_INDEX)) { + TRACE("IIOs (%s)\n", debugstr_w(padid->pszDriverAlias)); + goto errCleanUp; + } + padid->aFormatTag[ntag].dwFormatTag = aftd.dwFormatTag; + padid->aFormatTag[ntag].cbwfx = aftd.cbFormatSize; + } + + acmDriverClose(had, 0); + + return TRUE; + +errCleanUp: + if (had) acmDriverClose(had, 0); + HeapFree(MSACM_hHeap, 0, padid->aFormatTag); + padid->aFormatTag = NULL; + return FALSE; +} + +/*********************************************************************** + * MSACM_GetRegistryKey + */ +static LPWSTR MSACM_GetRegistryKey(const WINE_ACMDRIVERID* padid) +{ + static const WCHAR baseKey[] = {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\', + 'A','u','d','i','o','C','o','m','p','r','e','s','s','i','o','n','M','a','n','a','g','e','r','\\', + 'D','r','i','v','e','r','C','a','c','h','e','\\','\0'}; + LPWSTR ret; + int len; + + if (!padid->pszDriverAlias) { + ERR("No alias needed for registry entry\n"); + return NULL; + } + len = strlenW(baseKey); + ret = HeapAlloc(MSACM_hHeap, 0, (len + strlenW(padid->pszDriverAlias) + 1) * sizeof(WCHAR)); + if (!ret) return NULL; + + strcpyW(ret, baseKey); + strcpyW(ret + len, padid->pszDriverAlias); + CharLowerW(ret + len); + return ret; +} + +/*********************************************************************** + * MSACM_ReadCache + */ +static BOOL MSACM_ReadCache(PWINE_ACMDRIVERID padid) +{ + LPWSTR key = MSACM_GetRegistryKey(padid); + HKEY hKey; + DWORD type, size; + + if (!key) return FALSE; + + padid->aFormatTag = NULL; + + if (RegCreateKeyW(HKEY_LOCAL_MACHINE, key, &hKey)) + goto errCleanUp; + + size = sizeof(padid->cFormatTags); + if (RegQueryValueExA(hKey, "cFormatTags", 0, &type, (void*)&padid->cFormatTags, &size)) + goto errCleanUp; + size = sizeof(padid->cFilterTags); + if (RegQueryValueExA(hKey, "cFilterTags", 0, &type, (void*)&padid->cFilterTags, &size)) + goto errCleanUp; + size = sizeof(padid->fdwSupport); + if (RegQueryValueExA(hKey, "fdwSupport", 0, &type, (void*)&padid->fdwSupport, &size)) + goto errCleanUp; + + if (padid->cFormatTags > 0) { + size = padid->cFormatTags * sizeof(padid->aFormatTag[0]); + padid->aFormatTag = HeapAlloc(MSACM_hHeap, HEAP_ZERO_MEMORY, size); + if (!padid->aFormatTag) goto errCleanUp; + if (RegQueryValueExA(hKey, "aFormatTagCache", 0, &type, (void*)padid->aFormatTag, &size)) + goto errCleanUp; + } + HeapFree(MSACM_hHeap, 0, key); + return TRUE; + + errCleanUp: + HeapFree(MSACM_hHeap, 0, key); + HeapFree(MSACM_hHeap, 0, padid->aFormatTag); + padid->aFormatTag = NULL; + RegCloseKey(hKey); + return FALSE; +} + +/*********************************************************************** + * MSACM_WriteCache + */ +static BOOL MSACM_WriteCache(PWINE_ACMDRIVERID padid) +{ + LPWSTR key = MSACM_GetRegistryKey(padid); + HKEY hKey; + + if (!key) return FALSE; + + if (RegCreateKeyW(HKEY_LOCAL_MACHINE, key, &hKey)) + goto errCleanUp; + + if (RegSetValueExA(hKey, "cFormatTags", 0, REG_DWORD, (void*)&padid->cFormatTags, sizeof(DWORD))) + goto errCleanUp; + if (RegSetValueExA(hKey, "cFilterTags", 0, REG_DWORD, (void*)&padid->cFilterTags, sizeof(DWORD))) + goto errCleanUp; + if (RegSetValueExA(hKey, "fdwSupport", 0, REG_DWORD, (void*)&padid->fdwSupport, sizeof(DWORD))) + goto errCleanUp; + if (RegSetValueExA(hKey, "aFormatTagCache", 0, REG_BINARY, + (void*)padid->aFormatTag, + padid->cFormatTags * sizeof(padid->aFormatTag[0]))) + goto errCleanUp; + HeapFree(MSACM_hHeap, 0, key); + return TRUE; + + errCleanUp: + HeapFree(MSACM_hHeap, 0, key); + return FALSE; +} + +/*********************************************************************** + * MSACM_RegisterDriver() + */ +PWINE_ACMDRIVERID MSACM_RegisterDriver(LPWSTR pszDriverAlias, LPWSTR pszFileName, + HINSTANCE hinstModule) +{ + PWINE_ACMDRIVERID padid; + + TRACE("(%s, %s, %p)\n", + debugstr_w(pszDriverAlias), debugstr_w(pszFileName), hinstModule); + + padid = (PWINE_ACMDRIVERID) HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMDRIVERID)); + padid->obj.dwType = WINE_ACMOBJ_DRIVERID; + padid->obj.pACMDriverID = padid; + padid->pszDriverAlias = NULL; + if (pszDriverAlias) + { + padid->pszDriverAlias = HeapAlloc( MSACM_hHeap, 0, (strlenW(pszDriverAlias)+1) * sizeof(WCHAR) ); + strcpyW( padid->pszDriverAlias, pszDriverAlias ); + } + padid->pszFileName = NULL; + if (pszFileName) + { + padid->pszFileName = HeapAlloc( MSACM_hHeap, 0, (strlenW(pszFileName)+1) * sizeof(WCHAR) ); + strcpyW( padid->pszFileName, pszFileName ); + } + padid->hInstModule = hinstModule; + + padid->pACMDriverList = NULL; + padid->pNextACMDriverID = NULL; + padid->pPrevACMDriverID = MSACM_pLastACMDriverID; + if (MSACM_pLastACMDriverID) + MSACM_pLastACMDriverID->pNextACMDriverID = padid; + MSACM_pLastACMDriverID = padid; + if (!MSACM_pFirstACMDriverID) + MSACM_pFirstACMDriverID = padid; + /* disable the driver if we cannot load the cache */ + if (!MSACM_ReadCache(padid) && !MSACM_FillCache(padid)) { + WARN("Couldn't load cache for ACM driver (%s)\n", debugstr_w(pszFileName)); + MSACM_UnregisterDriver(padid); + return NULL; + } + return padid; +} + +/*********************************************************************** + * MSACM_RegisterAllDrivers() + */ +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'}; + + /* 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 */ + } + } + + HeapFree(MSACM_hHeap, 0, pszBuffer); + + MSACM_RegisterDriver(msacm32, msacm32, 0); +} + +/*********************************************************************** + * MSACM_UnregisterDriver() + */ +PWINE_ACMDRIVERID MSACM_UnregisterDriver(PWINE_ACMDRIVERID p) +{ + PWINE_ACMDRIVERID pNextACMDriverID; + + while (p->pACMDriverList) + acmDriverClose((HACMDRIVER) p->pACMDriverList, 0); + + if (p->pszDriverAlias) + HeapFree(MSACM_hHeap, 0, p->pszDriverAlias); + if (p->pszFileName) + HeapFree(MSACM_hHeap, 0, p->pszFileName); + HeapFree(MSACM_hHeap, 0, p->aFormatTag); + + if (p == MSACM_pFirstACMDriverID) + MSACM_pFirstACMDriverID = p->pNextACMDriverID; + if (p == MSACM_pLastACMDriverID) + MSACM_pLastACMDriverID = p->pPrevACMDriverID; + + if (p->pPrevACMDriverID) + p->pPrevACMDriverID->pNextACMDriverID = p->pNextACMDriverID; + if (p->pNextACMDriverID) + p->pNextACMDriverID->pPrevACMDriverID = p->pPrevACMDriverID; + + pNextACMDriverID = p->pNextACMDriverID; + + HeapFree(MSACM_hHeap, 0, p); + + return pNextACMDriverID; +} + +/*********************************************************************** + * MSACM_UnregisterAllDrivers() + */ +void MSACM_UnregisterAllDrivers(void) +{ + PWINE_ACMDRIVERID p = MSACM_pFirstACMDriverID; + + while (p) { + MSACM_WriteCache(p); + p = MSACM_UnregisterDriver(p); + } +} + +/*********************************************************************** + * MSACM_GetObj() + */ +PWINE_ACMOBJ MSACM_GetObj(HACMOBJ hObj, DWORD type) +{ + PWINE_ACMOBJ pao = (PWINE_ACMOBJ)hObj; + + if (pao == NULL || IsBadReadPtr(pao, sizeof(WINE_ACMOBJ)) || + ((type != WINE_ACMOBJ_DONTCARE) && (type != pao->dwType))) + return NULL; + return pao; +} + +/*********************************************************************** + * MSACM_GetDriverID() + */ +PWINE_ACMDRIVERID MSACM_GetDriverID(HACMDRIVERID hDriverID) +{ + return (PWINE_ACMDRIVERID)MSACM_GetObj((HACMOBJ)hDriverID, WINE_ACMOBJ_DRIVERID); +} + +/*********************************************************************** + * MSACM_GetDriver() + */ +PWINE_ACMDRIVER MSACM_GetDriver(HACMDRIVER hDriver) +{ + return (PWINE_ACMDRIVER)MSACM_GetObj((HACMOBJ)hDriver, WINE_ACMOBJ_DRIVER); +} + +/*********************************************************************** + * MSACM_Message() + */ +MMRESULT MSACM_Message(HACMDRIVER had, UINT uMsg, LPARAM lParam1, LPARAM lParam2) +{ + PWINE_ACMDRIVER pad = MSACM_GetDriver(had); + + return pad ? SendDriverMessage(pad->hDrvr, uMsg, lParam1, lParam2) : MMSYSERR_INVALHANDLE; +} diff --git a/reactos/lib/msacm/makefile b/reactos/lib/msacm/makefile new file mode 100644 index 00000000000..24c40308492 --- /dev/null +++ b/reactos/lib/msacm/makefile @@ -0,0 +1,23 @@ +# $Id: makefile + +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 new file mode 100644 index 00000000000..3aee776beeb --- /dev/null +++ b/reactos/lib/msacm/msacm.rc @@ -0,0 +1,30 @@ +/* + * Top level resource file for MS ACM + * + * 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 + */ + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "wineacm.h" + +#include "msacm_En.rc" +#include "msacm_Fr.rc" +#include "msacm_It.rc" +#include "msacm_Nl.rc" +#include "msacm_Pt.rc" diff --git a/reactos/lib/msacm/msacm.spec b/reactos/lib/msacm/msacm.spec new file mode 100644 index 00000000000..9f03617534f --- /dev/null +++ b/reactos/lib/msacm/msacm.spec @@ -0,0 +1,40 @@ + 1 stub WEP + 2 stub DRIVERPROC + 3 stub ___EXPORTEDSTUB + 7 pascal acmGetVersion() acmGetVersion16 + 8 pascal -ret16 acmMetrics(word word ptr) acmMetrics16 + 10 pascal -ret16 acmDriverEnum(ptr long long) acmDriverEnum16 + 11 pascal -ret16 acmDriverDetails(word ptr long) acmDriverDetails16 + 12 pascal -ret16 acmDriverAdd(ptr word long long long) acmDriverAdd16 + 13 pascal -ret16 acmDriverRemove(word long) acmDriverRemove16 + 14 pascal -ret16 acmDriverOpen(ptr word long) acmDriverOpen16 + 15 pascal -ret16 acmDriverClose(word long) acmDriverClose16 + 16 pascal acmDriverMessage(word word long long) acmDriverMessage16 + 17 pascal -ret16 acmDriverID(word ptr long) acmDriverID16 + 18 pascal -ret16 acmDriverPriority(word long long) acmDriverPriority16 + 30 pascal -ret16 acmFormatTagDetails(word ptr long) acmFormatTagDetails16 + 31 pascal -ret16 acmFormatTagEnum(word ptr ptr long long) acmFormatTagEnum16 + 40 pascal -ret16 acmFormatChoose(ptr) acmFormatChoose16 + 41 pascal -ret16 acmFormatDetails(word ptr long) acmFormatDetails16 + 42 pascal -ret16 acmFormatEnum(word ptr ptr long long) acmFormatEnum16 + 45 pascal -ret16 acmFormatSuggest(word ptr ptr long long) acmFormatSuggest16 + 50 pascal -ret16 acmFilterTagDetails(word ptr long) acmFilterTagDetails16 + 51 pascal -ret16 acmFilterTagEnum(word ptr ptr long long) acmFilterTagEnum16 + 60 pascal -ret16 acmFilterChoose(ptr) acmFilterChoose16 + 61 pascal -ret16 acmFilterDetails(word ptr long) acmFilterDetails16 + 62 pascal -ret16 acmFilterEnum(word ptr ptr long long) acmFilterEnum16 + 70 pascal -ret16 acmStreamOpen(ptr word ptr ptr ptr long long long) acmStreamOpen16 + 71 pascal -ret16 acmStreamClose(word long) acmStreamClose16 + 72 pascal -ret16 acmStreamSize(word long ptr long) acmStreamSize16 + 75 pascal -ret16 acmStreamConvert(word ptr long) acmStreamConvert16 + 76 pascal -ret16 acmStreamReset(word long) acmStreamReset16 + 77 pascal -ret16 acmStreamPrepareHeader(word ptr long) acmStreamPrepareHeader16 + 78 pascal -ret16 acmStreamUnprepareHeader(word ptr long) acmStreamUnprepareHeader16 +150 stub ACMAPPLICATIONEXIT +175 stub ACMHUGEPAGELOCK +176 stub ACMHUGEPAGEUNLOCK +200 stub ACMOPENCONVERSION +201 stub ACMCLOSECONVERSION +202 stub ACMCONVERT +203 stub ACMCHOOSEFORMAT +255 pascal DllEntryPoint(long word word word long word) MSACM_DllEntryPoint diff --git a/reactos/lib/msacm/msacm.spec.def b/reactos/lib/msacm/msacm.spec.def new file mode 100644 index 00000000000..e69de29bb2d diff --git a/reactos/lib/msacm/msacm32.spec b/reactos/lib/msacm/msacm32.spec new file mode 100644 index 00000000000..9500b53e2cd --- /dev/null +++ b/reactos/lib/msacm/msacm32.spec @@ -0,0 +1,46 @@ +@ stdcall acmDriverAddA(ptr long long long long) +@ stdcall acmDriverAddW(ptr long long long long) +@ stdcall acmDriverClose(long long) +@ stdcall acmDriverDetailsA(long ptr long) +@ stdcall acmDriverDetailsW(long ptr long) +@ stdcall acmDriverEnum(ptr long long) +@ stdcall acmDriverID(long ptr long) +@ stdcall acmDriverMessage(long long long long) +@ stdcall acmDriverOpen(ptr long long) +@ stdcall acmDriverPriority(long long long) +@ stdcall acmDriverRemove(long long) +@ stdcall acmFilterChooseA(ptr) +@ stdcall acmFilterChooseW(ptr) +@ stdcall acmFilterDetailsA(long ptr long) +@ stdcall acmFilterDetailsW(long ptr long) +@ stdcall acmFilterEnumA(long ptr ptr long long) +@ stdcall acmFilterEnumW(long ptr ptr long long) +@ stdcall acmFilterTagDetailsA(long ptr long) +@ stdcall acmFilterTagDetailsW(long ptr long) +@ stdcall acmFilterTagEnumA(long ptr ptr long long) +@ stdcall acmFilterTagEnumW(long ptr ptr long long) +@ stdcall acmFormatChooseA(ptr) +@ stdcall acmFormatChooseW(ptr) +@ stdcall acmFormatDetailsA(long ptr long) +@ stdcall acmFormatDetailsW(long ptr long) +@ stdcall acmFormatEnumA(long ptr ptr long long) +@ stdcall acmFormatEnumW(long ptr ptr long long) +@ stdcall acmFormatSuggest(long ptr ptr long long) +@ stdcall acmFormatTagDetailsA(long ptr long) +@ stdcall acmFormatTagDetailsW(long ptr long) +@ stdcall acmFormatTagEnumA(long ptr ptr long long) +@ stdcall acmFormatTagEnumW(long ptr ptr long long) +@ stdcall acmGetVersion() +@ stub acmMessage32 +@ stdcall acmMetrics(long long ptr) +@ stdcall acmStreamClose(long long) +@ stdcall acmStreamConvert(long ptr long) +@ stdcall acmStreamMessage(long long long long) +@ stdcall acmStreamOpen(ptr long ptr ptr ptr long long long) +@ stdcall acmStreamPrepareHeader(long ptr long) +@ stdcall acmStreamReset(long long) +@ stdcall acmStreamSize(long long ptr long) +@ stdcall acmStreamUnprepareHeader(long ptr long) + +# this is wine only +@ stdcall DriverProc(long long long long long) PCM_DriverProc diff --git a/reactos/lib/msacm/msacm32.spec.def b/reactos/lib/msacm/msacm32.spec.def new file mode 100644 index 00000000000..25b2dc23008 --- /dev/null +++ b/reactos/lib/msacm/msacm32.spec.def @@ -0,0 +1,48 @@ +; File generated automatically from msacm32.spec; do not edit! + +LIBRARY msacm32.dll + +EXPORTS + acmDriverAddA@20 @2 + acmDriverAddW@20 @3 + acmDriverClose@8 @4 + acmDriverDetailsA@12 @5 + acmDriverDetailsW@12 @6 + acmDriverEnum@12 @7 + acmDriverID@12 @8 + acmDriverMessage@16 @9 + acmDriverOpen@12 @10 + acmDriverPriority@12 @11 + acmDriverRemove@8 @12 + acmFilterChooseA@4 @13 + acmFilterChooseW@4 @14 + acmFilterDetailsA@12 @15 + acmFilterDetailsW@12 @16 + acmFilterEnumA@20 @17 + acmFilterEnumW@20 @18 + acmFilterTagDetailsA@12 @19 + acmFilterTagDetailsW@12 @20 + acmFilterTagEnumA@20 @21 + acmFilterTagEnumW@20 @22 + acmFormatChooseA@4 @23 + acmFormatChooseW@4 @24 + acmFormatDetailsA@12 @25 + acmFormatDetailsW@12 @26 + acmFormatEnumA@20 @27 + acmFormatEnumW@20 @28 + acmFormatSuggest@20 @29 + acmFormatTagDetailsA@12 @30 + acmFormatTagDetailsW@12 @31 + acmFormatTagEnumA@20 @32 + acmFormatTagEnumW@20 @33 + acmGetVersion@0 @34 + acmMetrics@12 @36 + acmStreamClose@8 @37 + acmStreamConvert@12 @38 + acmStreamMessage@16 @39 + acmStreamOpen@32 @40 + acmStreamPrepareHeader@12 @41 + acmStreamReset@8 @42 + acmStreamSize@16 @43 + acmStreamUnprepareHeader@12 @44 + DriverProc@20=PCM_DriverProc@20 @1 diff --git a/reactos/lib/msacm/msacm32_main.c b/reactos/lib/msacm/msacm32_main.c new file mode 100644 index 00000000000..6ca97e9e3be --- /dev/null +++ b/reactos/lib/msacm/msacm32_main.c @@ -0,0 +1,221 @@ +/* -*- 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 + */ + +#include <stdarg.h> + +#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); + +/**********************************************************************/ + +HINSTANCE MSACM_hInstance32 = 0; + +/*********************************************************************** + * DllMain (MSACM32.init) + */ +BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + TRACE("%p 0x%lx %p\n", hInstDLL, fdwReason, lpvReserved); + + switch (fdwReason) { + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hInstDLL); + MSACM_hHeap = HeapCreate(0, 0x10000, 0); + MSACM_hInstance32 = hInstDLL; + MSACM_RegisterAllDrivers(); + break; + case DLL_PROCESS_DETACH: + MSACM_UnregisterAllDrivers(); + HeapDestroy(MSACM_hHeap); + MSACM_hHeap = NULL; + MSACM_hInstance32 = NULL; + break; + default: + break; + } + return TRUE; +} + +/*********************************************************************** + * XRegThunkEntry (MSACM32.1) + * FIXME + * No documentation found. + */ + +/*********************************************************************** + * acmGetVersion (MSACM32.@) + */ +DWORD WINAPI acmGetVersion(void) +{ + OSVERSIONINFOA version; + + version.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA); + if (!GetVersionExA( &version )) + return 0x04030000; + + switch (version.dwPlatformId) { + case VER_PLATFORM_WIN32_NT: + return 0x04000565; /* 4.0.1381 */ + default: + FIXME("%lx not supported\n", version.dwPlatformId); + case VER_PLATFORM_WIN32_WINDOWS: + return 0x04030000; /* 4.3.0 */ + } +} + +/*********************************************************************** + * acmMessage32 (MSACM32.35) + * FIXME + * No documentation found. + */ + +/*********************************************************************** + * acmMetrics (MSACM32.@) + */ +MMRESULT WINAPI acmMetrics(HACMOBJ hao, UINT uMetric, LPVOID pMetric) +{ + PWINE_ACMOBJ pao = MSACM_GetObj(hao, WINE_ACMOBJ_DONTCARE); + BOOL bLocal = TRUE; + PWINE_ACMDRIVERID padid; + DWORD val = 0; + int i; + MMRESULT mmr = MMSYSERR_NOERROR; + + TRACE("(%p, %d, %p);\n", hao, uMetric, pMetric); + +#define CheckLocal(padid) (!bLocal || ((padid)->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_LOCAL)) + + switch (uMetric) { + case ACM_METRIC_COUNT_DRIVERS: + bLocal = FALSE; + /* fall through */ + case ACM_METRIC_COUNT_LOCAL_DRIVERS: + if (hao) return MMSYSERR_INVALHANDLE; + for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) + if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && CheckLocal(padid)) + val++; + *(LPDWORD)pMetric = val; + break; + + case ACM_METRIC_COUNT_CODECS: + bLocal = FALSE; + /* fall through */ + case ACM_METRIC_COUNT_LOCAL_CODECS: + if (hao) return MMSYSERR_INVALHANDLE; + for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) + if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && + (padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CODEC) && + CheckLocal(padid)) + val++; + *(LPDWORD)pMetric = val; + break; + + case ACM_METRIC_COUNT_CONVERTERS: + bLocal = FALSE; + /* fall through */ + case ACM_METRIC_COUNT_LOCAL_CONVERTERS: + if (hao) return MMSYSERR_INVALHANDLE; + for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) + if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && + (padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CONVERTER) && + CheckLocal(padid)) + val++; + *(LPDWORD)pMetric = val; + break; + + case ACM_METRIC_COUNT_FILTERS: + bLocal = FALSE; + /* fall through */ + case ACM_METRIC_COUNT_LOCAL_FILTERS: + if (hao) return MMSYSERR_INVALHANDLE; + for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) + if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && + (padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_FILTER) && + CheckLocal(padid)) + val++; + *(LPDWORD)pMetric = val; + break; + + case ACM_METRIC_COUNT_DISABLED: + bLocal = FALSE; + /* fall through */ + case ACM_METRIC_COUNT_LOCAL_DISABLED: + if (hao) return MMSYSERR_INVALHANDLE; + for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) + if ((padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && CheckLocal(padid)) + val++; + *(LPDWORD)pMetric = val; + break; + + case ACM_METRIC_MAX_SIZE_FORMAT: + if (hao == NULL) { + for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) { + if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED)) { + for (i = 0; i < padid->cFormatTags; i++) { + if (val < padid->aFormatTag[i].cbwfx) + val = padid->aFormatTag[i].cbwfx; + } + } + } + } else if (pao != NULL) { + switch (pao->dwType) { + case WINE_ACMOBJ_DRIVER: + case WINE_ACMOBJ_DRIVERID: + padid = pao->pACMDriverID; + break; + default: + return MMSYSERR_INVALHANDLE; + } + if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED)) { + for (i = 0; i < padid->cFormatTags; i++) { + if (val < padid->aFormatTag[i].cbwfx) + val = padid->aFormatTag[i].cbwfx; + } + } + } else { + return MMSYSERR_INVALHANDLE; + } + *(LPDWORD)pMetric = val; + break; + + case ACM_METRIC_COUNT_HARDWARE: + case ACM_METRIC_HARDWARE_WAVE_INPUT: + case ACM_METRIC_HARDWARE_WAVE_OUTPUT: + case ACM_METRIC_MAX_SIZE_FILTER: + case ACM_METRIC_DRIVER_SUPPORT: + case ACM_METRIC_DRIVER_PRIORITY: + default: + FIXME("(%p, %d, %p): stub\n", hao, uMetric, pMetric); + mmr = MMSYSERR_NOTSUPPORTED; + } + return mmr; +} diff --git a/reactos/lib/msacm/msacm_En.rc b/reactos/lib/msacm/msacm_En.rc new file mode 100644 index 00000000000..a1e32adfae1 --- /dev/null +++ b/reactos/lib/msacm/msacm_En.rc @@ -0,0 +1,56 @@ +/* + * English resource file for MS ACM + * + * 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 + */ + +LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT + +DLG_ACMFORMATCHOOSE_ID DIALOG DISCARDABLE 10, 20, 225, 100 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Sound Selection" +FONT 8, "MS Shell Dlg" +BEGIN + + LTEXT "&Name:", -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 "&Save As...", IDD_ACMFORMATCHOOSE_BTN_SETNAME, 125, 14, 45, 14 + PUSHBUTTON "&Remove", IDD_ACMFORMATCHOOSE_BTN_DELNAME, 175, 14, 45, 14 + + LTEXT "&Format:", -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 "&Attributes:", -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 "Cancel", IDCANCEL, 92, 80, 40, 14 + PUSHBUTTON "&Help", IDD_ACMFORMATCHOOSE_BTN_HELP, 136, 80, 40, 14 + +END diff --git a/reactos/lib/msacm/msacm_Fr.rc b/reactos/lib/msacm/msacm_Fr.rc new file mode 100644 index 00000000000..f9efdbad7d9 --- /dev/null +++ b/reactos/lib/msacm/msacm_Fr.rc @@ -0,0 +1,57 @@ +/* + * French resource file for MS ACM + * + * Copyright 2000 Eric Pouech + * Copyright 2003 Vincent B閞on + * + * 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_FRENCH, SUBLANG_NEUTRAL + +DLG_ACMFORMATCHOOSE_ID DIALOG DISCARDABLE 10, 20, 225, 100 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "S閘ection du son" +FONT 8, "MS Shell Dlg" +BEGIN + + LTEXT "&Nom :", -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 "&Enregistrer sous...", IDD_ACMFORMATCHOOSE_BTN_SETNAME, 125, 14, 45, 14 + PUSHBUTTON "&Retirer", IDD_ACMFORMATCHOOSE_BTN_DELNAME, 175, 14, 45, 14 + + LTEXT "&Format :", -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 "&Attributs :", -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 "Annuler", IDCANCEL, 92, 80, 40, 14 + PUSHBUTTON "&Aide", 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 new file mode 100644 index 00000000000..40d93d64e3e --- /dev/null +++ b/reactos/lib/msacm/msacm_It.rc @@ -0,0 +1,57 @@ +/* + * Italian resource file for MS ACM + * + * Copyright 2000 Eric Pouech + * Copyright 2003 Ivan Leo Murray-Smith + * + * 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_ITALIAN, SUBLANG_DEFAULT + +DLG_ACMFORMATCHOOSE_ID DIALOG DISCARDABLE 10, 20, 225, 100 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Selezione dell'audio" +FONT 8, "MS Shell Dlg" +BEGIN + + LTEXT "&Nome:", -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 "&Salva con nome...", IDD_ACMFORMATCHOOSE_BTN_SETNAME, 125, 14, 45, 14 + PUSHBUTTON "&Rimuovi", 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 "&Attributi:", -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 "Anulla", IDCANCEL, 92, 80, 40, 14 + PUSHBUTTON "&Aiuto", IDD_ACMFORMATCHOOSE_BTN_HELP, 136, 80, 40, 14 + +END diff --git a/reactos/lib/msacm/msacm_Nl.rc b/reactos/lib/msacm/msacm_Nl.rc new file mode 100644 index 00000000000..0da8eebd260 --- /dev/null +++ b/reactos/lib/msacm/msacm_Nl.rc @@ -0,0 +1,56 @@ +/* + * msacm (Dutch resources) + * + * Copyright 2003 Hans Leidekker + * + * 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_DUTCH, SUBLANG_DEFAULT + +DLG_ACMFORMATCHOOSE_ID DIALOG DISCARDABLE 10, 20, 225, 100 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Geluidskeuze" +FONT 8, "MS Shell Dlg" +BEGIN + + LTEXT "&Naam:", -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 "&Opslaan als...", IDD_ACMFORMATCHOOSE_BTN_SETNAME, 125, 14, 45, 14 + PUSHBUTTON "&Verwijderen", IDD_ACMFORMATCHOOSE_BTN_DELNAME, 175, 14, 45, 14 + + LTEXT "&Formaat:", -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 "&Attributen:", -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 "Annuleren", IDCANCEL, 92, 80, 40, 14 + PUSHBUTTON "&Help", IDD_ACMFORMATCHOOSE_BTN_HELP, 136, 80, 40, 14 + +END diff --git a/reactos/lib/msacm/msacm_Pt.rc b/reactos/lib/msacm/msacm_Pt.rc new file mode 100644 index 00000000000..45fd0f08444 --- /dev/null +++ b/reactos/lib/msacm/msacm_Pt.rc @@ -0,0 +1,56 @@ +/* + * Portuguese resource file for MS ACM + * + * Copyright 2003 Marcelo Duarte + * + * 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_PORTUGUESE, SUBLANG_DEFAULT + +DLG_ACMFORMATCHOOSE_ID DIALOG DISCARDABLE 10, 20, 225, 100 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Sele玢o de som" +FONT 8, "MS Shell Dlg" +BEGIN + + LTEXT "&Nome:", -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 "&Salvar como...", IDD_ACMFORMATCHOOSE_BTN_SETNAME, 125, 14, 45, 14 + PUSHBUTTON "&Remover", 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 "&Atributos:", -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 "Cancelar", IDCANCEL, 92, 80, 40, 14 + PUSHBUTTON "Aj&uda", IDD_ACMFORMATCHOOSE_BTN_HELP, 136, 80, 40, 14 + +END diff --git a/reactos/lib/msacm/msacm_main.c b/reactos/lib/msacm/msacm_main.c new file mode 100644 index 00000000000..01bfa75c577 --- /dev/null +++ b/reactos/lib/msacm/msacm_main.c @@ -0,0 +1,463 @@ +/* + * MSACM library + * + * Copyright 1998 Patrik Stridvall + * + * 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 <stdarg.h> + +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "mmsystem.h" +#include "mmreg.h" +#include "msacm.h" +#include "msacmdrv.h" +#include "wineacm.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msacm); + +/************************************************************************** + * DllEntryPoint (MSACM.255) + * + * MSACM DLL entry point + * + */ +BOOL WINAPI MSACM_DllEntryPoint(DWORD fdwReason, HINSTANCE16 hinstDLL, WORD ds, + WORD wHeapSize, DWORD dwReserved1, WORD wReserved2) +{ + static HANDLE hndl; + + TRACE("0x%x 0x%lx\n", hinstDLL, fdwReason); + + switch (fdwReason) { + case DLL_PROCESS_ATTACH: + if (!hndl && !(hndl = LoadLibraryA("MSACM32.DLL"))) { + ERR("Could not load sibling MsAcm32.dll\n"); + return FALSE; + } + break; + case DLL_PROCESS_DETACH: + FreeLibrary(hndl); + hndl = 0; + break; + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + break; + } + return TRUE; +} + +/*********************************************************************** + * acmGetVersion (MSACM.7) + */ +DWORD WINAPI acmGetVersion16(void) +{ + return acmGetVersion(); +} + +/*********************************************************************** + * acmMetrics (MSACM.8) + */ + +MMRESULT16 WINAPI acmMetrics16( + HACMOBJ16 hao, UINT16 uMetric, LPVOID pMetric) +{ + FIXME("(0x%04x, %d, %p): semi-stub\n", hao, uMetric, pMetric); + + if(!hao) return acmMetrics(0, uMetric, pMetric); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmDriverEnum (MSACM.10) + */ +MMRESULT16 WINAPI acmDriverEnum16( + ACMDRIVERENUMCB16 fnCallback, DWORD dwInstance, DWORD fdwEnum) +{ + FIXME("(%p, %ld, %ld): stub\n", + fnCallback, dwInstance, fdwEnum + ); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmDriverDetails (MSACM.11) + */ + +MMRESULT16 WINAPI acmDriverDetails16( + HACMDRIVERID16 hadid, LPACMDRIVERDETAILS16 padd, DWORD fdwDetails) +{ + FIXME("(0x%04x, %p, %ld): stub\n", hadid, padd, fdwDetails); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmDriverAdd (MSACM.12) + */ +MMRESULT16 WINAPI acmDriverAdd16( + LPHACMDRIVERID16 phadid, HINSTANCE16 hinstModule, + LPARAM lParam, DWORD dwPriority, DWORD fdwAdd) +{ + FIXME("(%p, 0x%04x, %ld, %ld, %ld): stub\n", + phadid, hinstModule, lParam, dwPriority, fdwAdd + ); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmDriverRemove (MSACM.13) + */ +MMRESULT16 WINAPI acmDriverRemove16( + HACMDRIVERID16 hadid, DWORD fdwRemove) +{ + FIXME("(0x%04x, %ld): stub\n", hadid, fdwRemove); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmDriverOpen (MSACM.14) + */ +MMRESULT16 WINAPI acmDriverOpen16( + LPHACMDRIVER16 phad, HACMDRIVERID16 hadid, DWORD fdwOpen) +{ + FIXME("(%p, 0x%04x, %ld): stub\n", phad, hadid, fdwOpen); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmDriverClose (MSACM.15) + */ +MMRESULT16 WINAPI acmDriverClose16( + HACMDRIVER16 had, DWORD fdwClose) +{ + FIXME("(0x%04x, %ld): stub\n", had, fdwClose); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmDriverMessage (MSACM.16) + */ +LRESULT WINAPI acmDriverMessage16( + HACMDRIVER16 had, UINT16 uMsg, LPARAM lParam1, LPARAM lParam2) +{ + FIXME("(0x%04x, %d, %ld, %ld): stub\n", + had, uMsg, lParam1, lParam2 + ); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return 0; +} + +/*********************************************************************** + * acmDriverID (MSACM.17) + */ +MMRESULT16 WINAPI acmDriverID16( + HACMOBJ16 hao, LPHACMDRIVERID16 phadid, DWORD fdwDriverID) +{ + FIXME("(0x%04x, %p, %ld): stub\n", hao, phadid, fdwDriverID); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmDriverPriority (MSACM.18) + */ +MMRESULT16 WINAPI acmDriverPriority16( + HACMDRIVERID16 hadid, DWORD dwPriority, DWORD fdwPriority) +{ + FIXME("(0x%04x, %ld, %ld): stub\n", + hadid, dwPriority, fdwPriority + ); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmFormatTagDetails (MSACM.30) + */ +MMRESULT16 WINAPI acmFormatTagDetails16( + HACMDRIVER16 had, LPACMFORMATTAGDETAILS16 paftd, DWORD fdwDetails) +{ + FIXME("(0x%04x, %p, %ld): stub\n", had, paftd, fdwDetails); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmFormatTagEnum (MSACM.31) + */ +MMRESULT16 WINAPI acmFormatTagEnum16( + HACMDRIVER16 had, LPACMFORMATTAGDETAILS16 paftd, + ACMFORMATTAGENUMCB16 fnCallback, DWORD dwInstance, DWORD fdwEnum) +{ + FIXME("(0x%04x, %p, %p, %ld, %ld): stub\n", + had, paftd, fnCallback, dwInstance, fdwEnum + ); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmFormatChoose (MSACM.40) + */ +MMRESULT16 WINAPI acmFormatChoose16( + LPACMFORMATCHOOSE16 pafmtc) +{ + FIXME("(%p): stub\n", pafmtc); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmFormatDetails (MSACM.41) + */ +MMRESULT16 WINAPI acmFormatDetails16( + HACMDRIVER16 had, LPACMFORMATDETAILS16 pafd, DWORD fdwDetails) +{ + FIXME("(0x%04x, %p, %ld): stub\n", had, pafd, fdwDetails); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmFormatEnum (MSACM.42) + */ +MMRESULT16 WINAPI acmFormatEnum16( + HACMDRIVER16 had, LPACMFORMATDETAILS16 pafd, + ACMFORMATENUMCB16 fnCallback, DWORD dwInstance, DWORD fdwEnum) +{ + FIXME("(0x%04x, %p, %p, %ld, %ld): stub\n", + had, pafd, fnCallback, dwInstance, fdwEnum + ); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmFormatSuggest (MSACM.45) + */ +MMRESULT16 WINAPI acmFormatSuggest16( + HACMDRIVER16 had, LPWAVEFORMATEX pwfxSrc, + LPWAVEFORMATEX pwfxDst, DWORD cbwfxDst, DWORD fdwSuggest) +{ + FIXME("(0x%04x, %p, %p, %ld, %ld): stub\n", + had, pwfxSrc, pwfxDst, cbwfxDst, fdwSuggest + ); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmFilterTagDetails (MSACM.50) + */ +MMRESULT16 WINAPI acmFilterTagDetails16( + HACMDRIVER16 had, LPACMFILTERTAGDETAILS16 paftd, DWORD fdwDetails) +{ + FIXME("(0x%04x, %p, %ld): stub\n", had, paftd, fdwDetails); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmFilterTagEnum (MSACM.51) + */ +MMRESULT16 WINAPI acmFilterTagEnum16( + HACMDRIVER16 had, LPACMFILTERTAGDETAILS16 paftd, + ACMFILTERTAGENUMCB16 fnCallback, DWORD dwInstance, DWORD fdwEnum) +{ + FIXME("(0x%04x, %p, %p, %ld, %ld): stub\n", + had, paftd, fnCallback, dwInstance, fdwEnum + ); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmFilterChoose (MSACM.60) + */ +MMRESULT16 WINAPI acmFilterChoose16( + LPACMFILTERCHOOSE16 pafltrc) +{ + FIXME("(%p): stub\n", pafltrc); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmFilterDetails (MSACM.61) + */ +MMRESULT16 WINAPI acmFilterDetails16( + HACMDRIVER16 had, LPACMFILTERDETAILS16 pafd, DWORD fdwDetails) +{ + FIXME("(0x%04x, %p, %ld): stub\n", had, pafd, fdwDetails); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmFilterEnum (MSACM.62) + */ +MMRESULT16 WINAPI acmFilterEnum16( + HACMDRIVER16 had, LPACMFILTERDETAILS16 pafd, + ACMFILTERENUMCB16 fnCallback, DWORD dwInstance, DWORD fdwEnum) +{ + FIXME("(0x%04x, %p, %p, %ld, %ld): stub\n", + had, pafd, fnCallback, dwInstance, fdwEnum + ); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmStreamOpen (MSACM.70) + */ +MMRESULT16 WINAPI acmStreamOpen16( + LPHACMSTREAM16 phas, HACMDRIVER16 had, + LPWAVEFORMATEX pwfxSrc, LPWAVEFORMATEX pwfxDst, + LPWAVEFILTER pwfltr, DWORD dwCallback, + DWORD dwInstance, DWORD fdwOpen) +{ + FIXME("(%p, 0x%04x, %p, %p, %p, %ld, %ld, %ld): stub\n", + phas, had, pwfxSrc, pwfxDst, pwfltr, + dwCallback, dwInstance, fdwOpen + ); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmStreamClose (MSACM.71) + */ +MMRESULT16 WINAPI acmStreamClose16( + HACMSTREAM16 has, DWORD fdwClose) +{ + FIXME("(0x%04x, %ld): stub\n", has, fdwClose); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmStreamSize (MSACM.72) + */ +MMRESULT16 WINAPI acmStreamSize16( + HACMSTREAM16 has, DWORD cbInput, + LPDWORD pdwOutputBytes, DWORD fdwSize) +{ + FIXME("(0x%04x, %ld, %p, %ld): stub\n", + has, cbInput, pdwOutputBytes, fdwSize + ); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmStreamConvert (MSACM.75) + */ +MMRESULT16 WINAPI acmStreamConvert16( + HACMSTREAM16 has, LPACMSTREAMHEADER16 pash, DWORD fdwConvert) +{ + FIXME("(0x%04x, %p, %ld): stub\n", has, pash, fdwConvert); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmStreamReset (MSACM.76) + */ +MMRESULT16 WINAPI acmStreamReset16( + HACMSTREAM16 has, DWORD fdwReset) +{ + FIXME("(0x%04x, %ld): stub\n", has, fdwReset); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmStreamPrepareHeader (MSACM.77) + */ +MMRESULT16 WINAPI acmStreamPrepareHeader16( + HACMSTREAM16 has, LPACMSTREAMHEADER16 pash, DWORD fdwPrepare) +{ + FIXME("(0x%04x, %p, %ld): stub\n", has, pash, fdwPrepare); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmStreamUnprepareHeader (MSACM.78) + */ +MMRESULT16 WINAPI acmStreamUnprepareHeader16( + HACMSTREAM16 has, LPACMSTREAMHEADER16 pash, DWORD fdwUnprepare) +{ + FIXME("(0x%04x, %p, %ld): stub\n", + has, pash, fdwUnprepare + ); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * ACMAPPLICATIONEXIT (MSACM.150) + * FIXME + * No documentation found. + */ + +/*********************************************************************** + * ACMHUGEPAGELOCK (MSACM.175) + *FIXME + * No documentation found. + */ + +/*********************************************************************** + * ACMHUGEPAGEUNLOCK (MSACM.176) + * FIXME + * No documentation found. + */ + +/*********************************************************************** + * ACMOPENCONVERSION (MSACM.200) + * FIXME + * No documentation found. + */ + +/*********************************************************************** + * ACMCLOSECONVERSION (MSACM.201) + * FIXME + * No documentation found. + */ + +/*********************************************************************** + * ACMCONVERT (MSACM.202) + * FIXME + * No documentation found. + */ + +/*********************************************************************** + * ACMCHOOSEFORMAT (MSACM.203) + * FIXME + * No documentation found. + */ + + diff --git a/reactos/lib/msacm/msadp32/.cvsignore b/reactos/lib/msacm/msadp32/.cvsignore new file mode 100644 index 00000000000..edbb279da22 --- /dev/null +++ b/reactos/lib/msacm/msadp32/.cvsignore @@ -0,0 +1,3 @@ +Makefile +msadp32.acm.dbg.c +msadp32.acm.spec.c diff --git a/reactos/lib/msacm/msadp32/Makefile.in b/reactos/lib/msacm/msadp32/Makefile.in new file mode 100644 index 00000000000..c331f654c86 --- /dev/null +++ b/reactos/lib/msacm/msadp32/Makefile.in @@ -0,0 +1,12 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = msadp32.acm +IMPORTS = winmm user32 kernel32 + +C_SRCS = msadp32.c + +@MAKE_DLL_RULES@ + +### Dependencies: diff --git a/reactos/lib/msacm/msadp32/msadp32.acm.spec b/reactos/lib/msacm/msadp32/msadp32.acm.spec new file mode 100644 index 00000000000..a0ba1c7e701 --- /dev/null +++ b/reactos/lib/msacm/msadp32/msadp32.acm.spec @@ -0,0 +1 @@ +@ stdcall DriverProc (long long long long long) ADPCM_DriverProc diff --git a/reactos/lib/msacm/msadp32/msadp32.c b/reactos/lib/msacm/msadp32/msadp32.c new file mode 100644 index 00000000000..dae681c9c90 --- /dev/null +++ b/reactos/lib/msacm/msadp32/msadp32.c @@ -0,0 +1,781 @@ +/* + * MS ADPCM handling + * + * Copyright (C) 2002 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 + */ + +#include <assert.h> +#include <stdarg.h> +#include <string.h> +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "winnls.h" +#include "mmsystem.h" +#include "mmreg.h" +#include "msacm.h" +#include "msacmdrv.h" +#include "wine/debug.h" + +/* see http://www.pcisys.net/~melanson/codecs/adpcm.txt for the details */ + +WINE_DEFAULT_DEBUG_CHANNEL(adpcm); + +/*********************************************************************** + * ADPCM_drvOpen + */ +static DWORD ADPCM_drvOpen(LPCSTR str) +{ + return 1; +} + +/*********************************************************************** + * ADPCM_drvClose + */ +static DWORD ADPCM_drvClose(DWORD dwDevID) +{ + return 1; +} + +typedef struct tagAcmAdpcmData +{ + void (*convert)(PACMDRVSTREAMINSTANCE adsi, + const unsigned char*, LPDWORD, unsigned char*, LPDWORD); +} AcmAdpcmData; + +/* table to list all supported formats... those are the basic ones. this + * also helps given a unique index to each of the supported formats + */ +typedef struct +{ + int nChannels; + int nBits; + int rate; +} Format; + +static Format 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}, +}; + +static Format ADPCM_Formats[] = +{ + {1, 4, 8000}, {2, 4, 8000}, {1, 4, 11025}, {2, 4, 11025}, + {1, 4, 22050}, {2, 4, 22050}, {1, 4, 44100}, {2, 4, 44100}, +}; + +#define NUM_PCM_FORMATS (sizeof(PCM_Formats) / sizeof(PCM_Formats[0])) +#define NUM_ADPCM_FORMATS (sizeof(ADPCM_Formats) / sizeof(ADPCM_Formats[0])) + +static int MS_Delta[] = +{ + 230, 230, 230, 230, 307, 409, 512, 614, + 768, 614, 512, 409, 307, 230, 230, 230 +}; + + +static ADPCMCOEFSET MSADPCM_CoeffSet[] = +{ + {256, 0}, {512, -256}, {0, 0}, {192, 64}, {240, 0}, {460, -208}, {392, -232} +}; + +/*********************************************************************** + * ADPCM_GetFormatIndex + */ +static DWORD ADPCM_GetFormatIndex(WAVEFORMATEX* wfx) +{ + int i, hi; + Format* fmts; + + switch (wfx->wFormatTag) + { + case WAVE_FORMAT_PCM: + hi = NUM_PCM_FORMATS; + fmts = PCM_Formats; + break; + case WAVE_FORMAT_ADPCM: + hi = NUM_ADPCM_FORMATS; + fmts = ADPCM_Formats; + break; + default: + return 0xFFFFFFFF; + } + + for (i = 0; i < hi; i++) + { + if (wfx->nChannels == fmts[i].nChannels && + wfx->nSamplesPerSec == fmts[i].rate && + wfx->wBitsPerSample == fmts[i].nBits) + return i; + } + + return 0xFFFFFFFF; +} + +static void init_wfx_adpcm(ADPCMWAVEFORMAT* awfx) +{ + register WAVEFORMATEX* pwfx = &awfx->wfx; + + /* we assume wFormatTag, nChannels, nSamplesPerSec and wBitsPerSample + * have been initialized... */ + + if (pwfx->wFormatTag != WAVE_FORMAT_ADPCM) {FIXME("wrong FT\n"); return;} + if (ADPCM_GetFormatIndex(pwfx) == 0xFFFFFFFF) {FIXME("wrong fmt\n"); return;} + + switch (pwfx->nSamplesPerSec) + { + case 8000: pwfx->nBlockAlign = 256; break; + case 11025: pwfx->nBlockAlign = 256; break; + case 22050: pwfx->nBlockAlign = 512; break; + default: + case 44100: pwfx->nBlockAlign = 1024; break; + } + pwfx->cbSize = 2 * sizeof(WORD) + 7 * sizeof(ADPCMCOEFSET); + /* 7 is the size of the block head (which contains two samples) */ + + awfx->wSamplesPerBlock = (pwfx->nBlockAlign - (7 * pwfx->nChannels)) * (2 / pwfx->nChannels) + 2; + pwfx->nAvgBytesPerSec = (pwfx->nSamplesPerSec * pwfx->nBlockAlign) / awfx->wSamplesPerBlock; + awfx->wNumCoef = 7; + memcpy(awfx->aCoef, MSADPCM_CoeffSet, 7 * sizeof(ADPCMCOEFSET)); +} + +/*********************************************************************** + * 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); +} + +static inline void clamp_sample(int* sample) +{ + if (*sample < -32768) *sample = -32768; + if (*sample > 32767) *sample = 32767; +} + +static inline void process_nibble(unsigned nibble, int* idelta, + int* sample1, int* sample2, + const ADPCMCOEFSET* coeff) +{ + int sample; + int snibble; + + /* nibble is in fact a signed 4 bit integer => propagate sign if needed */ + snibble = (nibble & 0x08) ? (nibble - 16) : nibble; + sample = ((*sample1 * coeff->iCoef1) + (*sample2 * coeff->iCoef2)) / 256 + + snibble * *idelta; + clamp_sample(&sample); + + *sample2 = *sample1; + *sample1 = sample; + *idelta = ((MS_Delta[nibble] * *idelta) / 256); + if (*idelta < 16) *idelta = 16; +} + +static void cvtSSms16K(PACMDRVSTREAMINSTANCE adsi, + const unsigned char* src, LPDWORD nsrc, + unsigned char* dst, LPDWORD ndst) +{ + int ideltaL, ideltaR; + int sample1L, sample2L; + int sample1R, sample2R; + ADPCMCOEFSET coeffL, coeffR; + int nsamp; + int nsamp_blk = ((ADPCMWAVEFORMAT*)adsi->pwfxSrc)->wSamplesPerBlock; + DWORD nblock = min(*nsrc / adsi->pwfxSrc->nBlockAlign, + *ndst / (nsamp_blk * 2 * 2)); + + *nsrc = nblock * adsi->pwfxSrc->nBlockAlign; + *ndst = nblock * nsamp_blk * 2 * 2; + + nsamp_blk -= 2; /* see below for samples from block head */ + for (; nblock > 0; nblock--) + { + const unsigned char* in_src = src; + + assert(*src <= 6); + coeffL = MSADPCM_CoeffSet[*src++]; + assert(*src <= 6); + coeffR = MSADPCM_CoeffSet[*src++]; + + ideltaL = R16(src); src += 2; + ideltaR = R16(src); src += 2; + sample1L = R16(src); src += 2; + sample1R = R16(src); src += 2; + sample2L = R16(src); src += 2; + sample2R = R16(src); src += 2; + + /* store samples from block head */ + W16(dst, sample2L); dst += 2; + W16(dst, sample2R); dst += 2; + W16(dst, sample1L); dst += 2; + W16(dst, sample1R); dst += 2; + + for (nsamp = nsamp_blk; nsamp > 0; nsamp--) + { + process_nibble(*src >> 4, &ideltaL, &sample1L, &sample2L, &coeffL); + W16(dst, sample1L); dst += 2; + process_nibble(*src++ & 0x0F, &ideltaR, &sample1R, &sample2R, &coeffR); + W16(dst, sample1R); dst += 2; + } + src = in_src + adsi->pwfxSrc->nBlockAlign; + } +} + +static void cvtMMms16K(PACMDRVSTREAMINSTANCE adsi, + const unsigned char* src, LPDWORD nsrc, + unsigned char* dst, LPDWORD ndst) +{ + int idelta; + int sample1, sample2; + ADPCMCOEFSET coeff; + int nsamp; + int nsamp_blk = ((ADPCMWAVEFORMAT*)adsi->pwfxSrc)->wSamplesPerBlock; + DWORD nblock = min(*nsrc / adsi->pwfxSrc->nBlockAlign, + *ndst / (nsamp_blk * 2)); + + *nsrc = nblock * adsi->pwfxSrc->nBlockAlign; + *ndst = nblock * nsamp_blk * 2; + + nsamp_blk -= 2; /* see below for samples from block head */ + for (; nblock > 0; nblock--) + { + const unsigned char* in_src = src; + + assert(*src <= 6); + coeff = MSADPCM_CoeffSet[*src++]; + + idelta = R16(src); src += 2; + sample1 = R16(src); src += 2; + sample2 = R16(src); src += 2; + + /* store samples from block head */ + W16(dst, sample2); dst += 2; + W16(dst, sample1); dst += 2; + + for (nsamp = nsamp_blk; nsamp > 0; nsamp -= 2) + { + process_nibble(*src >> 4, &idelta, &sample1, &sample2, &coeff); + W16(dst, sample1); dst += 2; + process_nibble(*src++ & 0x0F, &idelta, &sample1, &sample2, &coeff); + W16(dst, sample1); dst += 2; + } + src = in_src + adsi->pwfxSrc->nBlockAlign; + } +} + +#if 0 +static void cvtSS16msK(PACMDRVSTREAMINSTANCE adsi, + const unsigned char* src, LPDWORD nsrc, + unsigned char* dst, LPDWORD ndst) +{ +} + +static void cvtMM16msK(PACMDRVSTREAMINSTANCE adsi, + const unsigned char* src, LPDWORD nsrc, + unsigned char* dst, LPDWORD ndst) +{ +} +#endif + +/*********************************************************************** + * ADPCM_DriverDetails + * + */ +static LRESULT ADPCM_DriverDetails(PACMDRIVERDETAILSW 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_CODEC; + add->cFormatTags = 2; /* PCM, MS ADPCM */ + add->cFilterTags = 0; + add->hicon = NULL; + MultiByteToWideChar( CP_ACP, 0, "WINE-MS ADPCM", -1, + add->szShortName, sizeof(add->szShortName)/sizeof(WCHAR) ); + MultiByteToWideChar( CP_ACP, 0, "Wine MS ADPCM 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; +} + +/*********************************************************************** + * ADPCM_FormatTagDetails + * + */ +static LRESULT ADPCM_FormatTagDetails(PACMFORMATTAGDETAILSW aftd, DWORD dwQuery) +{ + static WCHAR szPcm[]={'P','C','M',0}; + static WCHAR szMsAdPcm[]={'M','S',' ','A','d','P','C','M',0}; + + switch (dwQuery) + { + case ACM_FORMATTAGDETAILSF_INDEX: + if (aftd->dwFormatTagIndex >= 2) return ACMERR_NOTPOSSIBLE; + break; + case ACM_FORMATTAGDETAILSF_LARGESTSIZE: + if (aftd->dwFormatTag == WAVE_FORMAT_UNKNOWN) + { + aftd->dwFormatTagIndex = 1; /* WAVE_FORMAT_ADPCM is bigger than PCM */ + break; + } + /* fall thru */ + case ACM_FORMATTAGDETAILSF_FORMATTAG: + switch (aftd->dwFormatTag) + { + case WAVE_FORMAT_PCM: aftd->dwFormatTagIndex = 0; break; + case WAVE_FORMAT_ADPCM: aftd->dwFormatTagIndex = 1; break; + default: return ACMERR_NOTPOSSIBLE; + } + break; + default: + WARN("Unsupported query %08lx\n", dwQuery); + return MMSYSERR_NOTSUPPORTED; + } + + aftd->fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CODEC; + switch (aftd->dwFormatTagIndex) + { + case 0: + aftd->dwFormatTag = WAVE_FORMAT_PCM; + aftd->cbFormatSize = sizeof(PCMWAVEFORMAT); + aftd->cStandardFormats = NUM_PCM_FORMATS; + lstrcpyW(aftd->szFormatTag, szPcm); + break; + case 1: + aftd->dwFormatTag = WAVE_FORMAT_ADPCM; + aftd->cbFormatSize = sizeof(ADPCMWAVEFORMAT) + (7 - 1) * sizeof(ADPCMCOEFSET); + aftd->cStandardFormats = NUM_ADPCM_FORMATS; + lstrcpyW(aftd->szFormatTag, szMsAdPcm); + break; + } + return MMSYSERR_NOERROR; +} + +/*********************************************************************** + * ADPCM_FormatDetails + * + */ +static LRESULT ADPCM_FormatDetails(PACMFORMATDETAILSW afd, DWORD dwQuery) +{ + switch (dwQuery) + { + case ACM_FORMATDETAILSF_FORMAT: + if (ADPCM_GetFormatIndex(afd->pwfx) == 0xFFFFFFFF) return ACMERR_NOTPOSSIBLE; + break; + case ACM_FORMATDETAILSF_INDEX: + afd->pwfx->wFormatTag = afd->dwFormatTag; + switch (afd->dwFormatTag) + { + case WAVE_FORMAT_PCM: + if (afd->dwFormatIndex >= NUM_PCM_FORMATS) return ACMERR_NOTPOSSIBLE; + 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; + case WAVE_FORMAT_ADPCM: + if (afd->dwFormatIndex >= NUM_ADPCM_FORMATS) return ACMERR_NOTPOSSIBLE; + if (afd->cbwfx < sizeof(ADPCMWAVEFORMAT) + (7 - 1) * sizeof(ADPCMCOEFSET)) + return ACMERR_NOTPOSSIBLE; + afd->pwfx->nChannels = ADPCM_Formats[afd->dwFormatIndex].nChannels; + afd->pwfx->nSamplesPerSec = ADPCM_Formats[afd->dwFormatIndex].rate; + afd->pwfx->wBitsPerSample = ADPCM_Formats[afd->dwFormatIndex].nBits; + init_wfx_adpcm((ADPCMWAVEFORMAT*)afd->pwfx); + break; + default: + WARN("Unsupported tag %08lx\n", afd->dwFormatTag); + return MMSYSERR_INVALPARAM; + } + break; + default: + WARN("Unsupported query %08lx\n", dwQuery); + return MMSYSERR_NOTSUPPORTED; + } + afd->fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CODEC; + afd->szFormat[0] = 0; /* let MSACM format this for us... */ + + return MMSYSERR_NOERROR; +} + +/*********************************************************************** + * ADPCM_FormatSuggest + * + */ +static LRESULT ADPCM_FormatSuggest(PACMDRVFORMATSUGGEST adfs) +{ + /* some tests ... */ + if (adfs->cbwfxSrc < sizeof(PCMWAVEFORMAT) || + adfs->cbwfxDst < sizeof(PCMWAVEFORMAT) || + ADPCM_GetFormatIndex(adfs->pwfxSrc) == 0xFFFFFFFF) return ACMERR_NOTPOSSIBLE; + /* FIXME: should do those tests against the real size (according to format tag */ + + /* If 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)) + { + if (adfs->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM) + adfs->pwfxDst->wBitsPerSample = 4; + else + adfs->pwfxDst->wBitsPerSample = 16; + } + if (!(adfs->fdwSuggest & ACM_FORMATSUGGESTF_WFORMATTAG)) + { + if (adfs->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM) + adfs->pwfxDst->wFormatTag = WAVE_FORMAT_ADPCM; + else + adfs->pwfxDst->wFormatTag = WAVE_FORMAT_PCM; + } + + /* check if result is ok */ + if (ADPCM_GetFormatIndex(adfs->pwfxDst) == 0xFFFFFFFF) return ACMERR_NOTPOSSIBLE; + + /* recompute other values */ + switch (adfs->pwfxDst->wFormatTag) + { + case WAVE_FORMAT_PCM: + adfs->pwfxDst->nBlockAlign = (adfs->pwfxDst->nChannels * adfs->pwfxDst->wBitsPerSample) / 8; + adfs->pwfxDst->nAvgBytesPerSec = adfs->pwfxDst->nSamplesPerSec * adfs->pwfxDst->nBlockAlign; + break; + case WAVE_FORMAT_ADPCM: + init_wfx_adpcm((ADPCMWAVEFORMAT*)adfs->pwfxDst); + break; + default: + FIXME("\n"); + break; + } + + return MMSYSERR_NOERROR; +} + +/*********************************************************************** + * ADPCM_Reset + * + */ +static void ADPCM_Reset(PACMDRVSTREAMINSTANCE adsi, AcmAdpcmData* aad) +{ +} + +/*********************************************************************** + * ADPCM_StreamOpen + * + */ +static LRESULT ADPCM_StreamOpen(PACMDRVSTREAMINSTANCE adsi) +{ + AcmAdpcmData* aad; + + assert(!(adsi->fdwOpen & ACM_STREAMOPENF_ASYNC)); + + if (ADPCM_GetFormatIndex(adsi->pwfxSrc) == 0xFFFFFFFF || + ADPCM_GetFormatIndex(adsi->pwfxDst) == 0xFFFFFFFF) + return ACMERR_NOTPOSSIBLE; + + aad = HeapAlloc(GetProcessHeap(), 0, sizeof(AcmAdpcmData)); + if (aad == 0) return MMSYSERR_NOMEM; + + adsi->dwDriver = (DWORD)aad; + + if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM && + adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM) + { + goto theEnd; + } + else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_ADPCM && + adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM) + { + /* resampling or mono <=> stereo not available + * ADPCM algo only define 16 bit per sample output + */ + if (adsi->pwfxSrc->nSamplesPerSec != adsi->pwfxDst->nSamplesPerSec || + adsi->pwfxSrc->nChannels != adsi->pwfxDst->nChannels || + adsi->pwfxDst->wBitsPerSample != 16) + goto theEnd; + +#if 0 + { + unsigned int nspb = ((IMAADPCMWAVEFORMAT*)adsi->pwfxSrc)->wSamplesPerBlock; + FIXME("spb=%u\n", nspb); + + /* we check that in a block, after the header, samples are present on + * 4-sample packet pattern + * we also check that the block alignement is bigger than the expected size + */ + if (((nspb - 1) & 3) != 0) goto theEnd; + if ((((nspb - 1) / 2) + 4) * adsi->pwfxSrc->nChannels < adsi->pwfxSrc->nBlockAlign) + goto theEnd; + } +#endif + + /* adpcm decoding... */ + if (adsi->pwfxDst->wBitsPerSample == 16 && adsi->pwfxDst->nChannels == 2) + aad->convert = cvtSSms16K; + if (adsi->pwfxDst->wBitsPerSample == 16 && adsi->pwfxDst->nChannels == 1) + aad->convert = cvtMMms16K; + } + else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM && + adsi->pwfxDst->wFormatTag == WAVE_FORMAT_ADPCM) + { + if (adsi->pwfxSrc->nSamplesPerSec != adsi->pwfxDst->nSamplesPerSec || + adsi->pwfxSrc->nChannels != adsi->pwfxDst->nChannels || + adsi->pwfxSrc->wBitsPerSample != 16) + goto theEnd; +#if 0 + nspb = ((IMAADPCMWAVEFORMAT*)adsi->pwfxDst)->wSamplesPerBlock; + FIXME("spb=%u\n", nspb); + + /* we check that in a block, after the header, samples are present on + * 4-sample packet pattern + * we also check that the block alignement is bigger than the expected size + */ + if (((nspb - 1) & 3) != 0) goto theEnd; + if ((((nspb - 1) / 2) + 4) * adsi->pwfxDst->nChannels < adsi->pwfxDst->nBlockAlign) + goto theEnd; +#endif +#if 0 + /* adpcm coding... */ + if (adsi->pwfxSrc->wBitsPerSample == 16 && adsi->pwfxSrc->nChannels == 2) + aad->convert = cvtSS16msK; + if (adsi->pwfxSrc->wBitsPerSample == 16 && adsi->pwfxSrc->nChannels == 1) + aad->convert = cvtMM16msK; +#endif + FIXME("We don't support encoding yet\n"); + goto theEnd; + } + else goto theEnd; + ADPCM_Reset(adsi, aad); + + return MMSYSERR_NOERROR; + + theEnd: + HeapFree(GetProcessHeap(), 0, aad); + adsi->dwDriver = 0L; + return MMSYSERR_NOTSUPPORTED; +} + +/*********************************************************************** + * ADPCM_StreamClose + * + */ +static LRESULT ADPCM_StreamClose(PACMDRVSTREAMINSTANCE adsi) +{ + HeapFree(GetProcessHeap(), 0, (void*)adsi->dwDriver); + return MMSYSERR_NOERROR; +} + +/*********************************************************************** + * ADPCM_round + * + */ +static inline DWORD ADPCM_round(DWORD a, DWORD b, DWORD c) +{ + assert(a && b && c); + /* to be sure, always return an entire number of c... */ + return ((double)a * (double)b + (double)c - 1) / (double)c; +} + +/*********************************************************************** + * ADPCM_StreamSize + * + */ +static LRESULT ADPCM_StreamSize(PACMDRVSTREAMINSTANCE adsi, PACMDRVSTREAMSIZE adss) +{ + switch (adss->fdwSize) + { + case ACM_STREAMSIZEF_DESTINATION: + /* cbDstLength => cbSrcLength */ + if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM && + adsi->pwfxDst->wFormatTag == WAVE_FORMAT_ADPCM) + { + /* don't take block overhead into account, doesn't matter too much */ + adss->cbSrcLength = adss->cbDstLength * 4; + } + else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_ADPCM && + adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM) + { + FIXME("misses the block header overhead\n"); + adss->cbSrcLength = 256 + adss->cbDstLength / 4; + } + else + { + return MMSYSERR_NOTSUPPORTED; + } + break; + case ACM_STREAMSIZEF_SOURCE: + /* cbSrcLength => cbDstLength */ + if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM && + adsi->pwfxDst->wFormatTag == WAVE_FORMAT_ADPCM) + { + FIXME("misses the block header overhead\n"); + adss->cbDstLength = 256 + adss->cbSrcLength / 4; + } + else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_ADPCM && + adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM) + { + /* don't take block overhead into account, doesn't matter too much */ + adss->cbDstLength = adss->cbSrcLength * 4; + } + else + { + return MMSYSERR_NOTSUPPORTED; + } + break; + default: + WARN("Unsupported query %08lx\n", adss->fdwSize); + return MMSYSERR_NOTSUPPORTED; + } + return MMSYSERR_NOERROR; +} + +/*********************************************************************** + * ADPCM_StreamConvert + * + */ +static LRESULT ADPCM_StreamConvert(PACMDRVSTREAMINSTANCE adsi, PACMDRVSTREAMHEADER adsh) +{ + AcmAdpcmData* aad = (AcmAdpcmData*)adsi->dwDriver; + DWORD nsrc = adsh->cbSrcLength; + DWORD ndst = adsh->cbDstLength; + + 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)) + { + ADPCM_Reset(adsi, aad); + } + + aad->convert(adsi, adsh->pbSrc, &nsrc, adsh->pbDst, &ndst); + adsh->cbSrcLengthUsed = nsrc; + adsh->cbDstLengthUsed = ndst; + + return MMSYSERR_NOERROR; +} + +/************************************************************************** + * ADPCM_DriverProc [exported] + */ +LRESULT CALLBACK ADPCM_DriverProc(DWORD dwDevID, HDRVR hDriv, UINT wMsg, + LPARAM dwParam1, LPARAM dwParam2) +{ + TRACE("(%08lx %08lx %04x %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 ADPCM_drvOpen((LPSTR)dwParam1); + case DRV_CLOSE: return ADPCM_drvClose(dwDevID); + case DRV_ENABLE: return 1; + case DRV_DISABLE: return 1; + case DRV_QUERYCONFIGURE: return 1; + case DRV_CONFIGURE: MessageBoxA(0, "MSACM MS ADPCM 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 ADPCM_DriverDetails((PACMDRIVERDETAILSW)dwParam1); + + case ACMDM_FORMATTAG_DETAILS: + return ADPCM_FormatTagDetails((PACMFORMATTAGDETAILSW)dwParam1, dwParam2); + + case ACMDM_FORMAT_DETAILS: + return ADPCM_FormatDetails((PACMFORMATDETAILSW)dwParam1, dwParam2); + + case ACMDM_FORMAT_SUGGEST: + return ADPCM_FormatSuggest((PACMDRVFORMATSUGGEST)dwParam1); + + case ACMDM_STREAM_OPEN: + return ADPCM_StreamOpen((PACMDRVSTREAMINSTANCE)dwParam1); + + case ACMDM_STREAM_CLOSE: + return ADPCM_StreamClose((PACMDRVSTREAMINSTANCE)dwParam1); + + case ACMDM_STREAM_SIZE: + return ADPCM_StreamSize((PACMDRVSTREAMINSTANCE)dwParam1, (PACMDRVSTREAMSIZE)dwParam2); + + case ACMDM_STREAM_CONVERT: + return ADPCM_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 */ + return MMSYSERR_NOTSUPPORTED; + case ACMDM_STREAM_PREPARE: + case ACMDM_STREAM_UNPREPARE: + /* nothing special to do here... so don't do anything */ + return MMSYSERR_NOERROR; + + default: + return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2); + } + return 0; +} diff --git a/reactos/lib/winmm/lolvldrv.c b/reactos/lib/winmm/lolvldrv.c index 4eb6b5b7da4..979820feaba 100644 --- a/reactos/lib/winmm/lolvldrv.c +++ b/reactos/lib/winmm/lolvldrv.c @@ -746,9 +746,15 @@ static BOOL MMDRV_InitHardcoded(void) #ifndef __REACTOS__ MMDRV_Install("wineoss.drv", "wineoss.drv", FALSE); #endif /* __REACTOS__ */ + +#ifdef __REACTOS__ + // AG: TESTING: + MMDRV_Install("mmdrv.dll", "mmdrv.dll", FALSE); +#endif + /* finish with mappers */ - MMDRV_Install("wavemapper", "msacm.drv", TRUE); - MMDRV_Install("midimapper", "midimap.drv", TRUE); + MMDRV_Install("wavemapper", "msacm32.dll", TRUE); + MMDRV_Install("midimapper", "midimap.dll", TRUE); return TRUE; } diff --git a/reactos/lib/winmm/midimap/.cvsignore b/reactos/lib/winmm/midimap/.cvsignore new file mode 100644 index 00000000000..b5572719a60 --- /dev/null +++ b/reactos/lib/winmm/midimap/.cvsignore @@ -0,0 +1,9 @@ +*.a +*.d +*.o +*.dll +*.coff +*.sym +*.map +*.tmp +temp.exp diff --git a/reactos/lib/winmm/midimap/Makefile.in b/reactos/lib/winmm/midimap/Makefile.in new file mode 100644 index 00000000000..35bfeac72c8 --- /dev/null +++ b/reactos/lib/winmm/midimap/Makefile.in @@ -0,0 +1,13 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = midimap.drv +IMPORTS = winmm user32 advapi32 kernel32 + +C_SRCS = \ + midimap.c + +@MAKE_DLL_RULES@ + +### Dependencies: diff --git a/reactos/lib/winmm/midimap/Makefile.ros b/reactos/lib/winmm/midimap/Makefile.ros new file mode 100644 index 00000000000..d87046547b0 --- /dev/null +++ b/reactos/lib/winmm/midimap/Makefile.ros @@ -0,0 +1,21 @@ +# $Id: Makefile.ros,v 1.1 2004/03/10 15:22:44 silverblade Exp $ + +TARGET_NAME = midimap + +TARGET_OBJECTS = midimap.o + +TARGET_CFLAGS = -D__REACTOS__ + +TARGET_SDKLIBS = winmm.a libwine.a ws2_32.a wine_uuid.a ntdll.a + +TARGET_BASE = 0x77300000 + +TARGET_RC_SRCS = midimap.rc +TARGET_RC_BINSRC = midimap.rc +TARGET_RC_BINARIES = + +default: all + +DEP_OBJECTS = $(TARGET_OBJECTS) + +include $(TOOLS_PATH)/depend.mk diff --git a/reactos/lib/winmm/midimap/Makefile.ros-template b/reactos/lib/winmm/midimap/Makefile.ros-template new file mode 100644 index 00000000000..165b6970b17 --- /dev/null +++ b/reactos/lib/winmm/midimap/Makefile.ros-template @@ -0,0 +1,21 @@ +# $Id: Makefile.ros-template,v 1.1 2004/03/10 15:22:44 silverblade Exp $ + +TARGET_NAME = midimap + +TARGET_OBJECTS = @C_SRCS@ + +TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ + +TARGET_SDKLIBS = @IMPORTS@ winmm.a libwine.a wine_uuid.a ntdll.a + +TARGET_BASE = 0x76160000 + +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/winmm/midimap/makefile b/reactos/lib/winmm/midimap/makefile new file mode 100644 index 00000000000..3301270fbac --- /dev/null +++ b/reactos/lib/winmm/midimap/makefile @@ -0,0 +1,9 @@ +# $Id: makefile,v 1.1 2004/03/10 15:22:44 silverblade Exp $ + +PATH_TO_TOP = ../../.. + +TARGET_TYPE = winedll + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk diff --git a/reactos/lib/winmm/midimap/midimap.c b/reactos/lib/winmm/midimap/midimap.c new file mode 100644 index 00000000000..67446c278bc --- /dev/null +++ b/reactos/lib/winmm/midimap/midimap.c @@ -0,0 +1,555 @@ +/* -*- tab-width: 8; c-basic-offset: 4 -*- */ +/* + * Wine MIDI mapper driver + * + * Copyright 1999, 2000, 2001 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: + * notification has to be implemented + * IDF file loading + */ + +#include <stdarg.h> +#include <string.h> +#include <stdlib.h> +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "mmddk.h" +#include "winreg.h" +#include "wine/debug.h" + +/* + * Here's how Windows stores the midiOut mapping information. + * + * Full form (in HKU) is: + * + * [Software\\Microsoft\\Windows\\CurrentVersion\\Multimedia\\MIDIMap] 988836060 + * "AutoScheme"=dword:00000000 + * "ConfigureCount"=dword:00000004 + * "CurrentInstrument"="Wine OSS midi" + * "CurrentScheme"="epp" + * "DriverList"="" + * "UseScheme"=dword:00000000 + * + * AutoScheme: ? + * CurrentInstrument: name of midiOut device to use when UseScheme is 0. Wine uses an extension + * of the form #n to link to n'th midiOut device of the system + * CurrentScheme: when UseScheme is non null, it's the scheme to use (see below) + * DriverList: ? + * UseScheme: trigger for simple/complex mapping + * + * A scheme is defined (in HKLM) as: + * + * [System\\CurrentControlSet\\Control\\MediaProperties\\PrivateProperties\\Midi\\Schemes\\<nameScheme>] + * <nameScheme>: one key for each defined scheme (system wide) + * under each one of these <nameScheme> keys, there's: + * [...\\<nameScheme>\\<idxDevice>] + * "Channels"="<bitMask>" + * (the default value of this key also refers to the name of the device). + * + * this defines, for each midiOut device (identified by its index in <idxDevice>), which + * channels have to be mapped onto it. The <bitMask> defines the channels (from 0 to 15) + * will be mapped (mapping occurs for channel <ch> if bit <ch> is set in <bitMask> + * + * Further mapping information can also be defined in: + * [System\\CurrentControlSet\\Control\\MediaProperties\\PrivateProperties\\Midi\\Ports\\<nameDevice>\\Instruments\\<idx>] + * "Definition"="<.idf file>" + * "FriendlyName"="#for .idx file#" + * "Port"="<idxPort>" + * + * This last part isn't implemented (.idf file support). + */ + +WINE_DEFAULT_DEBUG_CHANNEL(msacm); + +typedef struct tagMIDIOUTPORT +{ + char name[MAXPNAMELEN]; + int loaded; + HMIDIOUT hMidi; + unsigned short uDevID; + LPBYTE lpbPatch; + unsigned int aChn[16]; +} MIDIOUTPORT; + +typedef struct tagMIDIMAPDATA +{ + struct tagMIDIMAPDATA* self; + MIDIOUTPORT* ChannelMap[16]; +} MIDIMAPDATA; + +static MIDIOUTPORT* midiOutPorts; +static unsigned numMidiOutPorts; + +static BOOL MIDIMAP_IsBadData(MIDIMAPDATA* mm) +{ + if (!IsBadReadPtr(mm, sizeof(MIDIMAPDATA)) && mm->self == mm) + return FALSE; + TRACE("Bad midimap data (%p)\n", mm); + return TRUE; +} + +static BOOL MIDIMAP_FindPort(const char* name, unsigned* dev) +{ + for (*dev = 0; *dev < numMidiOutPorts; (*dev)++) + { + TRACE("%s\n", midiOutPorts[*dev].name); + if (strcmp(midiOutPorts[*dev].name, name) == 0) + return TRUE; + } + /* try the form #nnn */ + if (*name == '#' && isdigit(name[1])) + { + *dev = atoi(name + 1); + if (*dev < numMidiOutPorts) + return TRUE; + } + return FALSE; +} + +static BOOL MIDIMAP_LoadSettingsDefault(MIDIMAPDATA* mom, const char* port) +{ + unsigned i, dev = 0; + + if (port != NULL && !MIDIMAP_FindPort(port, &dev)) + { + ERR("Registry glitch: couldn't find midi out (%s)\n", port); + dev = 0; + } + + /* this is necessary when no midi out ports are present */ + if (dev >= numMidiOutPorts) + return FALSE; + /* sets default */ + for (i = 0; i < 16; i++) mom->ChannelMap[i] = &midiOutPorts[dev]; + + return TRUE; +} + +static BOOL MIDIMAP_LoadSettingsScheme(MIDIMAPDATA* mom, const char* scheme) +{ + HKEY hSchemesKey, hKey, hPortKey; + unsigned i, idx, dev; + char buffer[256], port[256]; + DWORD type, size, mask; + + for (i = 0; i < 16; i++) mom->ChannelMap[i] = NULL; + + if (RegOpenKeyA(HKEY_LOCAL_MACHINE, + "System\\CurrentControlSet\\Control\\MediaProperties\\PrivateProperties\\Midi\\Schemes", + &hSchemesKey)) + { + return FALSE; + } + if (RegOpenKeyA(hSchemesKey, scheme, &hKey)) + { + RegCloseKey(hSchemesKey); + return FALSE; + } + + for (idx = 0; !RegEnumKeyA(hKey, idx, buffer, sizeof(buffer)); idx++) + { + if (RegOpenKeyA(hKey, buffer, &hPortKey)) continue; + + size = sizeof(port); + if (RegQueryValueExA(hPortKey, NULL, 0, &type, port, &size)) continue; + + if (!MIDIMAP_FindPort(port, &dev)) continue; + + size = sizeof(mask); + if (RegQueryValueExA(hPortKey, "Channels", 0, &type, (void*)&mask, &size)) + continue; + + for (i = 0; i < 16; i++) + { + if (mask & (1 << i)) + { + if (mom->ChannelMap[i]) + ERR("Quirks in registry, channel %u is mapped twice\n", i); + mom->ChannelMap[i] = &midiOutPorts[dev]; + } + } + } + + RegCloseKey(hSchemesKey); + RegCloseKey(hKey); + + return TRUE; +} + +static BOOL MIDIMAP_LoadSettings(MIDIMAPDATA* mom) +{ + HKEY hKey; + BOOL ret; + + if (RegOpenKeyA(HKEY_CURRENT_USER, + "Software\\Microsoft\\Windows\\CurrentVersion\\Multimedia\\MIDIMap", &hKey)) + { + ret = MIDIMAP_LoadSettingsDefault(mom, NULL); + } + else + { + DWORD type, size, out; + char buffer[256]; + + ret = 2; + size = sizeof(out); + if (!RegQueryValueExA(hKey, "UseScheme", 0, &type, (void*)&out, &size) && out) + { + size = sizeof(buffer); + if (!RegQueryValueExA(hKey, "CurrentScheme", 0, &type, buffer, &size)) + { + if (!(ret = MIDIMAP_LoadSettingsScheme(mom, buffer))) + ret = MIDIMAP_LoadSettingsDefault(mom, NULL); + } + else + { + ERR("Wrong registry: UseScheme is active, but no CurrentScheme found\n"); + } + } + if (ret == 2) + { + size = sizeof(buffer); + if (!RegQueryValueExA(hKey, "CurrentInstrument", 0, &type, buffer, &size) && *buffer) + { + ret = MIDIMAP_LoadSettingsDefault(mom, buffer); + } + else + { + ret = MIDIMAP_LoadSettingsDefault(mom, NULL); + } + } + } + RegCloseKey(hKey); + + if (ret && TRACE_ON(msacm)) + { + unsigned i; + + for (i = 0; i < 16; i++) + { + TRACE("chnMap[%2d] => %d\n", + i, mom->ChannelMap[i] ? mom->ChannelMap[i]->uDevID : -1); + } + } + return ret; +} + +static DWORD modOpen(LPDWORD lpdwUser, LPMIDIOPENDESC lpDesc, DWORD dwFlags) +{ + MIDIMAPDATA* mom = HeapAlloc(GetProcessHeap(), 0, sizeof(MIDIMAPDATA)); + + TRACE("(%p %p %08lx)\n", lpdwUser, lpDesc, dwFlags); + + if (!mom) return MMSYSERR_NOMEM; + + if (MIDIMAP_LoadSettings(mom)) + { + *lpdwUser = (DWORD)mom; + mom->self = mom; + + return MMSYSERR_NOERROR; + } + HeapFree(GetProcessHeap(), 0, mom); + return MIDIERR_INVALIDSETUP; +} + +static DWORD modClose(MIDIMAPDATA* mom) +{ + UINT i; + DWORD ret = MMSYSERR_NOERROR; + + if (MIDIMAP_IsBadData(mom)) return MMSYSERR_ERROR; + + for (i = 0; i < 16; i++) + { + DWORD t; + if (mom->ChannelMap[i] && mom->ChannelMap[i]->loaded > 0) + { + t = midiOutClose(mom->ChannelMap[i]->hMidi); + if (t == MMSYSERR_NOERROR) + { + mom->ChannelMap[i]->loaded = 0; + mom->ChannelMap[i]->hMidi = 0; + } + else if (ret == MMSYSERR_NOERROR) + ret = t; + } + } + if (ret == MMSYSERR_NOERROR) + HeapFree(GetProcessHeap(), 0, mom); + return ret; +} + +static DWORD modLongData(MIDIMAPDATA* mom, LPMIDIHDR lpMidiHdr, DWORD dwParam2) +{ + WORD chn; + DWORD ret = MMSYSERR_NOERROR; + MIDIHDR mh; + + if (MIDIMAP_IsBadData(mom)) + return MMSYSERR_ERROR; + + mh = *lpMidiHdr; + for (chn = 0; chn < 16; chn++) + { + if (mom->ChannelMap[chn] && mom->ChannelMap[chn]->loaded > 0) + { + mh.dwFlags = 0; + midiOutPrepareHeader(mom->ChannelMap[chn]->hMidi, &mh, sizeof(mh)); + ret = midiOutLongMsg(mom->ChannelMap[chn]->hMidi, &mh, sizeof(mh)); + midiOutUnprepareHeader(mom->ChannelMap[chn]->hMidi, &mh, sizeof(mh)); + if (ret != MMSYSERR_NOERROR) break; + } + } + return ret; +} + +static DWORD modData(MIDIMAPDATA* mom, DWORD dwParam) +{ + BYTE lb = LOBYTE(LOWORD(dwParam)); + WORD chn = lb & 0x0F; + DWORD ret = MMSYSERR_NOERROR; + + if (MIDIMAP_IsBadData(mom)) + return MMSYSERR_ERROR; + + if (!mom->ChannelMap[chn]) return MMSYSERR_NOERROR; + + switch (lb & 0xF0) + { + case 0x80: + case 0x90: + case 0xA0: + case 0xB0: + case 0xC0: + case 0xD0: + case 0xE0: + if (mom->ChannelMap[chn]->loaded == 0) + { + if (midiOutOpen(&mom->ChannelMap[chn]->hMidi, mom->ChannelMap[chn]->uDevID, + 0L, 0L, CALLBACK_NULL) == MMSYSERR_NOERROR) + mom->ChannelMap[chn]->loaded = 1; + else + mom->ChannelMap[chn]->loaded = -1; + /* FIXME: should load here the IDF midi data... and allow channel and + * patch mappings + */ + } + if (mom->ChannelMap[chn]->loaded > 0) + { + /* change channel */ + dwParam &= ~0x0F; + dwParam |= mom->ChannelMap[chn]->aChn[chn]; + + if ((LOBYTE(LOWORD(dwParam)) & 0xF0) == 0xC0 /* program change */ && + mom->ChannelMap[chn]->lpbPatch) + { + BYTE patch = HIBYTE(LOWORD(dwParam)); + + /* change patch */ + dwParam &= ~0x0000FF00; + dwParam |= mom->ChannelMap[chn]->lpbPatch[patch]; + } + ret = midiOutShortMsg(mom->ChannelMap[chn]->hMidi, dwParam); + } + break; + case 0xF0: + for (chn = 0; chn < 16; chn++) + { + if (mom->ChannelMap[chn]->loaded > 0) + ret = midiOutShortMsg(mom->ChannelMap[chn]->hMidi, dwParam); + } + break; + default: + FIXME("ooch %lu\n", dwParam); + } + + return ret; +} + +static DWORD modPrepare(MIDIMAPDATA* mom, LPMIDIHDR lpMidiHdr, DWORD dwParam2) +{ + if (MIDIMAP_IsBadData(mom)) return MMSYSERR_ERROR; + if (lpMidiHdr->dwFlags & (MHDR_ISSTRM|MHDR_PREPARED)) + return MMSYSERR_INVALPARAM; + + lpMidiHdr->dwFlags |= MHDR_PREPARED; + return MMSYSERR_NOERROR; +} + +static DWORD modUnprepare(MIDIMAPDATA* mom, LPMIDIHDR lpMidiHdr, DWORD dwParam2) +{ + if (MIDIMAP_IsBadData(mom)) return MMSYSERR_ERROR; + if ((lpMidiHdr->dwFlags & MHDR_ISSTRM) || !(lpMidiHdr->dwFlags & MHDR_PREPARED)) + return MMSYSERR_INVALPARAM; + + lpMidiHdr->dwFlags &= ~MHDR_PREPARED; + return MMSYSERR_NOERROR; +} + +static DWORD modGetDevCaps(UINT wDevID, MIDIMAPDATA* mom, LPMIDIOUTCAPSA lpMidiCaps, DWORD size) +{ + lpMidiCaps->wMid = 0x00FF; + lpMidiCaps->wPid = 0x0001; + lpMidiCaps->vDriverVersion = 0x0100; + strcpy(lpMidiCaps->szPname, "Wine midi out mapper"); + lpMidiCaps->wTechnology = MOD_MAPPER; + lpMidiCaps->wVoices = 0; + lpMidiCaps->wNotes = 0; + lpMidiCaps->wChannelMask = 0xFFFF; + lpMidiCaps->dwSupport = 0L; + + return MMSYSERR_NOERROR; +} + +static DWORD modReset(MIDIMAPDATA* mom) +{ + WORD chn; + DWORD ret = MMSYSERR_NOERROR; + + if (MIDIMAP_IsBadData(mom)) + return MMSYSERR_ERROR; + + for (chn = 0; chn < 16; chn++) + { + if (mom->ChannelMap[chn] && mom->ChannelMap[chn]->loaded > 0) + { + ret = midiOutReset(mom->ChannelMap[chn]->hMidi); + if (ret != MMSYSERR_NOERROR) break; + } + } + return ret; +} + +/************************************************************************** + * modMessage (MIDIMAP.@) + */ +DWORD WINAPI MIDIMAP_modMessage(UINT wDevID, UINT wMsg, DWORD dwUser, + DWORD dwParam1, DWORD dwParam2) +{ + TRACE("(%u, %04X, %08lX, %08lX, %08lX);\n", + wDevID, wMsg, dwUser, dwParam1, dwParam2); + + switch (wMsg) + { + case DRVM_INIT: + case DRVM_EXIT: + case DRVM_ENABLE: + case DRVM_DISABLE: + /* FIXME: Pretend this is supported */ + return 0; + + case MODM_OPEN: return modOpen ((LPDWORD)dwUser, (LPMIDIOPENDESC)dwParam1,dwParam2); + case MODM_CLOSE: return modClose ((MIDIMAPDATA*)dwUser); + + case MODM_DATA: return modData ((MIDIMAPDATA*)dwUser, dwParam1); + case MODM_LONGDATA: return modLongData ((MIDIMAPDATA*)dwUser, (LPMIDIHDR)dwParam1, dwParam2); + case MODM_PREPARE: return modPrepare ((MIDIMAPDATA*)dwUser, (LPMIDIHDR)dwParam1, dwParam2); + case MODM_UNPREPARE: return modUnprepare ((MIDIMAPDATA*)dwUser, (LPMIDIHDR)dwParam1, dwParam2); + case MODM_RESET: return modReset ((MIDIMAPDATA*)dwUser); + + case MODM_GETDEVCAPS: return modGetDevCaps (wDevID, (MIDIMAPDATA*)dwUser, (LPMIDIOUTCAPSA)dwParam1,dwParam2); + case MODM_GETNUMDEVS: return 1; + case MODM_GETVOLUME: return MMSYSERR_NOTSUPPORTED; + case MODM_SETVOLUME: return MMSYSERR_NOTSUPPORTED; + default: + FIXME("unknown message %d!\n", wMsg); + } + return MMSYSERR_NOTSUPPORTED; +} + +/*======================================================================* + * Driver part * + *======================================================================*/ + +/************************************************************************** + * MIDIMAP_drvOpen [internal] + */ +static DWORD MIDIMAP_drvOpen(LPSTR str) +{ + MIDIOUTCAPSA moc; + unsigned dev, i; + + if (midiOutPorts) + return 0; + + numMidiOutPorts = midiOutGetNumDevs(); + midiOutPorts = HeapAlloc(GetProcessHeap(), 0, + numMidiOutPorts * sizeof(MIDIOUTPORT)); + for (dev = 0; dev < numMidiOutPorts; dev++) + { + if (midiOutGetDevCapsA(dev, &moc, sizeof(moc)) == 0L) + { + strcpy(midiOutPorts[dev].name, moc.szPname); + midiOutPorts[dev].loaded = 0; + midiOutPorts[dev].hMidi = 0; + midiOutPorts[dev].uDevID = dev; + midiOutPorts[dev].lpbPatch = NULL; + for (i = 0; i < 16; i++) + midiOutPorts[dev].aChn[i] = i; + } + else + { + midiOutPorts[dev].loaded = -1; + } + } + + return 1; +} + +/************************************************************************** + * MIDIMAP_drvClose [internal] + */ +static DWORD MIDIMAP_drvClose(DWORD dwDevID) +{ + if (midiOutPorts) + { + HeapFree(GetProcessHeap(), 0, midiOutPorts); + midiOutPorts = NULL; + return 1; + } + return 0; +} + +/************************************************************************** + * DriverProc (MIDIMAP.@) + */ +LONG CALLBACK MIDIMAP_DriverProc(DWORD dwDevID, HDRVR hDriv, DWORD wMsg, + DWORD dwParam1, DWORD dwParam2) +{ +/* EPP TRACE("(%08lX, %04X, %08lX, %08lX, %08lX)\n", */ +/* EPP dwDevID, hDriv, wMsg, dwParam1, dwParam2); */ + + switch (wMsg) + { + case DRV_LOAD: return 1; + case DRV_FREE: return 1; + case DRV_OPEN: return MIDIMAP_drvOpen((LPSTR)dwParam1); + case DRV_CLOSE: return MIDIMAP_drvClose(dwDevID); + case DRV_ENABLE: return 1; + case DRV_DISABLE: return 1; + case DRV_QUERYCONFIGURE: return 1; + case DRV_CONFIGURE: MessageBoxA(0, "MIDIMAP MultiMedia Driver !", "OSS Driver", MB_OK); return 1; + case DRV_INSTALL: return DRVCNF_RESTART; + case DRV_REMOVE: return DRVCNF_RESTART; + default: + return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2); + } +} diff --git a/reactos/lib/winmm/midimap/midimap.rc b/reactos/lib/winmm/midimap/midimap.rc new file mode 100644 index 00000000000..a4f657aea57 --- /dev/null +++ b/reactos/lib/winmm/midimap/midimap.rc @@ -0,0 +1,39 @@ +#include <defines.h> +#include <reactos/resource.h> + +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", "ReactOS/WINE MIDI Mapper\0" + VALUE "FileVersion", RES_STR_FILE_VERSION + VALUE "InternalName", "midimap\0" + VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT + VALUE "OriginalFilename", "midimap.drv\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/winmm/midimap/midimap.spec.def b/reactos/lib/winmm/midimap/midimap.spec.def new file mode 100644 index 00000000000..e83446b9187 --- /dev/null +++ b/reactos/lib/winmm/midimap/midimap.spec.def @@ -0,0 +1,2 @@ +@ stdcall DriverProc(long long long long long) MIDIMAP_DriverProc +@ stdcall modMessage(long long long long long) MIDIMAP_modMessage diff --git a/reactos/lib/winmm/wavemap/.cvsignore b/reactos/lib/winmm/wavemap/.cvsignore new file mode 100644 index 00000000000..b5572719a60 --- /dev/null +++ b/reactos/lib/winmm/wavemap/.cvsignore @@ -0,0 +1,9 @@ +*.a +*.d +*.o +*.dll +*.coff +*.sym +*.map +*.tmp +temp.exp diff --git a/reactos/lib/winmm/wavemap/Makefile.in b/reactos/lib/winmm/wavemap/Makefile.in new file mode 100644 index 00000000000..de1c5148e8d --- /dev/null +++ b/reactos/lib/winmm/wavemap/Makefile.in @@ -0,0 +1,13 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = msacm.drv +IMPORTS = msacm32 winmm user32 kernel32 + +C_SRCS = \ + wavemap.c + +@MAKE_DLL_RULES@ + +### Dependencies: diff --git a/reactos/lib/winmm/wavemap/Makefile.ros b/reactos/lib/winmm/wavemap/Makefile.ros new file mode 100644 index 00000000000..ea6112004ef --- /dev/null +++ b/reactos/lib/winmm/wavemap/Makefile.ros @@ -0,0 +1,21 @@ +# $Id: Makefile.ros,v 1.1 2004/03/10 15:22:45 silverblade Exp $ + +TARGET_NAME = wavemap + +TARGET_OBJECTS = wavemap.o + +TARGET_CFLAGS = -D__REACTOS__ + +TARGET_SDKLIBS = winmm.a libwine.a ws2_32.a wine_uuid.a ntdll.a msacm32.a + +TARGET_BASE = 0x77300000 + +TARGET_RC_SRCS = wavemap.rc +TARGET_RC_BINSRC = wavemap.rc +TARGET_RC_BINARIES = + +default: all + +DEP_OBJECTS = $(TARGET_OBJECTS) + +include $(TOOLS_PATH)/depend.mk diff --git a/reactos/lib/winmm/wavemap/Makefile.ros-template b/reactos/lib/winmm/wavemap/Makefile.ros-template new file mode 100644 index 00000000000..be50a9b020e --- /dev/null +++ b/reactos/lib/winmm/wavemap/Makefile.ros-template @@ -0,0 +1,21 @@ +# $Id: Makefile.ros-template,v 1.1 2004/03/10 15:22:45 silverblade Exp $ + +TARGET_NAME = midimap + +TARGET_OBJECTS = @C_SRCS@ + +TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ + +TARGET_SDKLIBS = @IMPORTS@ winmm.a libwine.a wine_uuid.a ntdll.a + +TARGET_BASE = 0x76160000 + +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/winmm/wavemap/makefile b/reactos/lib/winmm/wavemap/makefile new file mode 100644 index 00000000000..836458a4cc8 --- /dev/null +++ b/reactos/lib/winmm/wavemap/makefile @@ -0,0 +1,9 @@ +# $Id: makefile,v 1.1 2004/03/10 15:22:45 silverblade Exp $ + +PATH_TO_TOP = ../../.. + +TARGET_TYPE = winedll + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk diff --git a/reactos/lib/winmm/wavemap/msacm.spec.def b/reactos/lib/winmm/wavemap/msacm.spec.def new file mode 100644 index 00000000000..f9bead0b053 --- /dev/null +++ b/reactos/lib/winmm/wavemap/msacm.spec.def @@ -0,0 +1,3 @@ +@ stdcall DriverProc(long long long long long) WAVEMAP_DriverProc +@ stdcall widMessage(long long long long long) WAVEMAP_widMessage +@ stdcall wodMessage(long long long long long) WAVEMAP_wodMessage diff --git a/reactos/lib/winmm/wavemap/wavemap.c b/reactos/lib/winmm/wavemap/wavemap.c new file mode 100644 index 00000000000..6d53e498c53 --- /dev/null +++ b/reactos/lib/winmm/wavemap/wavemap.c @@ -0,0 +1,975 @@ +/* -*- tab-width: 8; c-basic-offset: 4 -*- */ +/* + * Wine Wave mapper driver + * + * Copyright 1999,2001 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 + */ + +/* TODOs + * + better protection against evilish dwUser parameters + * + use asynchronous ACM conversion + * + don't use callback functions when none is required in open + * + the buffer sizes may not be accurate, so there may be some + * remaining bytes in src and dst buffers after ACM conversions... + * those should be taken care of... + */ + +#include <stdarg.h> +#include <string.h> +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "mmddk.h" +#include "mmreg.h" +#include "msacm.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msacm); + +typedef struct tagWAVEMAPDATA { + struct tagWAVEMAPDATA* self; + union { + struct { + HWAVEOUT hOuterWave; + HWAVEOUT hInnerWave; + } out; + struct { + HWAVEIN hOuterWave; + HWAVEIN hInnerWave; + } in; + } u; + HACMSTREAM hAcmStream; + /* needed data to filter callbacks. Only needed when hAcmStream is not 0 */ + DWORD dwCallback; + DWORD dwClientInstance; + DWORD dwFlags; + /* ratio to compute position from a PCM playback to any format */ + DWORD avgSpeedOuter; + DWORD avgSpeedInner; +} WAVEMAPDATA; + +static BOOL WAVEMAP_IsData(WAVEMAPDATA* wm) +{ + return (!IsBadReadPtr(wm, sizeof(WAVEMAPDATA)) && wm->self == wm); +} + +/*======================================================================* + * WAVE OUT part * + *======================================================================*/ + +static void CALLBACK wodCallback(HWAVEOUT hWave, UINT uMsg, DWORD dwInstance, + DWORD dwParam1, DWORD dwParam2) +{ + WAVEMAPDATA* wom = (WAVEMAPDATA*)dwInstance; + + TRACE("(%p %u %ld %lx %lx);\n", hWave, uMsg, dwInstance, dwParam1, dwParam2); + + if (!WAVEMAP_IsData(wom)) { + ERR("Bad data\n"); + return; + } + + if (hWave != wom->u.out.hInnerWave && uMsg != WOM_OPEN) + ERR("Shouldn't happen (%p %p)\n", hWave, wom->u.out.hInnerWave); + + switch (uMsg) { + case WOM_OPEN: + case WOM_CLOSE: + /* dwParam1 & dwParam2 are supposed to be 0, nothing to do */ + break; + case WOM_DONE: + if (wom->hAcmStream) { + LPWAVEHDR lpWaveHdrDst = (LPWAVEHDR)dwParam1; + PACMSTREAMHEADER ash = (PACMSTREAMHEADER)((LPSTR)lpWaveHdrDst - sizeof(ACMSTREAMHEADER)); + LPWAVEHDR lpWaveHdrSrc = (LPWAVEHDR)ash->dwUser; + + lpWaveHdrSrc->dwFlags &= ~WHDR_INQUEUE; + lpWaveHdrSrc->dwFlags |= WHDR_DONE; + dwParam1 = (DWORD)lpWaveHdrSrc; + } + break; + default: + ERR("Unknown msg %u\n", uMsg); + } + + DriverCallback(wom->dwCallback, HIWORD(wom->dwFlags), (HDRVR)wom->u.out.hOuterWave, + uMsg, wom->dwClientInstance, dwParam1, dwParam2); +} + +/****************************************************************** + * wodOpenHelper + * + * + */ +static DWORD wodOpenHelper(WAVEMAPDATA* wom, UINT idx, + LPWAVEOPENDESC lpDesc, LPWAVEFORMATEX lpwfx, + DWORD dwFlags) +{ + DWORD ret; + + /* destination is always PCM, so the formulas below apply */ + lpwfx->nBlockAlign = (lpwfx->nChannels * lpwfx->wBitsPerSample) / 8; + lpwfx->nAvgBytesPerSec = lpwfx->nSamplesPerSec * lpwfx->nBlockAlign; + if (dwFlags & WAVE_FORMAT_QUERY) { + ret = acmStreamOpen(NULL, 0, lpDesc->lpFormat, lpwfx, NULL, 0L, 0L, ACM_STREAMOPENF_QUERY); + } else { + ret = acmStreamOpen(&wom->hAcmStream, 0, lpDesc->lpFormat, lpwfx, NULL, 0L, 0L, 0L); + } + if (ret == MMSYSERR_NOERROR) { + ret = waveOutOpen(&wom->u.out.hInnerWave, idx, lpwfx, (DWORD)wodCallback, + (DWORD)wom, (dwFlags & ~CALLBACK_TYPEMASK) | CALLBACK_FUNCTION); + if (ret != MMSYSERR_NOERROR && !(dwFlags & WAVE_FORMAT_QUERY)) { + acmStreamClose(wom->hAcmStream, 0); + wom->hAcmStream = 0; + } + } + return ret; +} + +static DWORD wodOpen(LPDWORD lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags) +{ + UINT ndlo, ndhi; + UINT i; + WAVEMAPDATA* wom = HeapAlloc(GetProcessHeap(), 0, sizeof(WAVEMAPDATA)); + + TRACE("(%p %p %08lx)\n", lpdwUser, lpDesc, dwFlags); + + if (!wom) + return MMSYSERR_NOMEM; + + ndhi = waveOutGetNumDevs(); + if (dwFlags & WAVE_MAPPED) { + if (lpDesc->uMappedDeviceID >= ndhi) return MMSYSERR_INVALPARAM; + ndlo = lpDesc->uMappedDeviceID; + ndhi = ndlo + 1; + dwFlags &= ~WAVE_MAPPED; + } else { + ndlo = 0; + } + wom->self = wom; + wom->dwCallback = lpDesc->dwCallback; + wom->dwFlags = dwFlags; + wom->dwClientInstance = lpDesc->dwInstance; + wom->u.out.hOuterWave = (HWAVEOUT)lpDesc->hWave; + wom->avgSpeedOuter = wom->avgSpeedInner = lpDesc->lpFormat->nAvgBytesPerSec; + + for (i = ndlo; i < ndhi; i++) { + /* if no ACM stuff is involved, no need to handle callbacks at this + * level, this will be done transparently + */ + if (waveOutOpen(&wom->u.out.hInnerWave, i, lpDesc->lpFormat, (DWORD)wodCallback, + (DWORD)wom, (dwFlags & ~CALLBACK_TYPEMASK) | CALLBACK_FUNCTION | WAVE_FORMAT_DIRECT) == MMSYSERR_NOERROR) { + wom->hAcmStream = 0; + goto found; + } + } + + if ((dwFlags & WAVE_FORMAT_DIRECT) == 0) { + WAVEFORMATEX wfx; + + wfx.wFormatTag = WAVE_FORMAT_PCM; + wfx.cbSize = 0; /* normally, this field is not used for PCM format, just in case */ + /* try some ACM stuff */ + +#define TRY(sps,bps) wfx.nSamplesPerSec = (sps); wfx.wBitsPerSample = (bps); \ + switch (wodOpenHelper(wom, i, lpDesc, &wfx, dwFlags | WAVE_FORMAT_DIRECT)) { \ + case MMSYSERR_NOERROR: wom->avgSpeedInner = wfx.nAvgBytesPerSec; goto found; \ + case WAVERR_BADFORMAT: break; \ + default: goto error; \ + } + + /* Our resampling algorithm is quite primitive so first try + * to just change the bit depth and number of channels + */ + for (i = ndlo; i < ndhi; i++) { + wfx.nSamplesPerSec=lpDesc->lpFormat->nSamplesPerSec; + wfx.nChannels = lpDesc->lpFormat->nChannels; + TRY(wfx.nSamplesPerSec, 16); + TRY(wfx.nSamplesPerSec, 8); + wfx.nChannels ^= 3; + TRY(wfx.nSamplesPerSec, 16); + TRY(wfx.nSamplesPerSec, 8); + } + + for (i = ndlo; i < ndhi; i++) { + /* first try with same stereo/mono option as source */ + wfx.nChannels = lpDesc->lpFormat->nChannels; + TRY(96000, 16); + TRY(48000, 16); + TRY(44100, 16); + TRY(22050, 16); + TRY(11025, 16); + + /* 2^3 => 1, 1^3 => 2, so if stereo, try mono (and the other way around) */ + wfx.nChannels ^= 3; + TRY(96000, 16); + TRY(48000, 16); + TRY(44100, 16); + TRY(22050, 16); + TRY(11025, 16); + + /* first try with same stereo/mono option as source */ + wfx.nChannels = lpDesc->lpFormat->nChannels; + TRY(96000, 8); + TRY(48000, 8); + TRY(44100, 8); + TRY(22050, 8); + TRY(11025, 8); + + /* 2^3 => 1, 1^3 => 2, so if stereo, try mono (and the other way around) */ + wfx.nChannels ^= 3; + TRY(96000, 8); + TRY(48000, 8); + TRY(44100, 8); + TRY(22050, 8); + TRY(11025, 8); + } +#undef TRY + } + + HeapFree(GetProcessHeap(), 0, wom); + return WAVERR_BADFORMAT; + +found: + if (dwFlags & WAVE_FORMAT_QUERY) { + *lpdwUser = 0L; + HeapFree(GetProcessHeap(), 0, wom); + } else { + *lpdwUser = (DWORD)wom; + } + return MMSYSERR_NOERROR; +error: + HeapFree(GetProcessHeap(), 0, wom); + return MMSYSERR_ERROR; +} + +static DWORD wodClose(WAVEMAPDATA* wom) +{ + DWORD ret = waveOutClose(wom->u.out.hInnerWave); + + if (ret == MMSYSERR_NOERROR) { + if (wom->hAcmStream) { + ret = acmStreamClose(wom->hAcmStream, 0); + } + if (ret == MMSYSERR_NOERROR) { + HeapFree(GetProcessHeap(), 0, wom); + } + } + return ret; +} + +static DWORD wodWrite(WAVEMAPDATA* wom, LPWAVEHDR lpWaveHdrSrc, DWORD dwParam2) +{ + PACMSTREAMHEADER ash; + LPWAVEHDR lpWaveHdrDst; + + if (!wom->hAcmStream) { + return waveOutWrite(wom->u.out.hInnerWave, lpWaveHdrSrc, dwParam2); + } + + lpWaveHdrSrc->dwFlags |= WHDR_INQUEUE; + ash = (PACMSTREAMHEADER)lpWaveHdrSrc->reserved; + /* acmStreamConvert will actually check that the new size is less than initial size */ + ash->cbSrcLength = lpWaveHdrSrc->dwBufferLength; + if (acmStreamConvert(wom->hAcmStream, ash, 0L) != MMSYSERR_NOERROR) + return MMSYSERR_ERROR; + + lpWaveHdrDst = (LPWAVEHDR)((LPSTR)ash + sizeof(ACMSTREAMHEADER)); + if (ash->cbSrcLength > ash->cbSrcLengthUsed) + FIXME("Not all src buffer has been written, expect bogus sound\n"); + else if (ash->cbSrcLength < ash->cbSrcLengthUsed) + ERR("CoDec has read more data than it is allowed to\n"); + + if (ash->cbDstLengthUsed == 0) + { + /* something went wrong in decoding */ + FIXME("Got 0 length\n"); + return MMSYSERR_ERROR; + } + lpWaveHdrDst->dwBufferLength = ash->cbDstLengthUsed; + return waveOutWrite(wom->u.out.hInnerWave, lpWaveHdrDst, sizeof(*lpWaveHdrDst)); +} + +static DWORD wodPrepare(WAVEMAPDATA* wom, LPWAVEHDR lpWaveHdrSrc, DWORD dwParam2) +{ + PACMSTREAMHEADER ash; + DWORD size; + DWORD dwRet; + LPWAVEHDR lpWaveHdrDst; + + if (!wom->hAcmStream) { + return waveOutPrepareHeader(wom->u.out.hInnerWave, lpWaveHdrSrc, dwParam2); + } + if (acmStreamSize(wom->hAcmStream, lpWaveHdrSrc->dwBufferLength, &size, ACM_STREAMSIZEF_SOURCE) != MMSYSERR_NOERROR) + return MMSYSERR_ERROR; + + ash = HeapAlloc(GetProcessHeap(), 0, sizeof(ACMSTREAMHEADER) + sizeof(WAVEHDR) + size); + if (ash == NULL) + return MMSYSERR_NOMEM; + + ash->cbStruct = sizeof(*ash); + ash->fdwStatus = 0L; + ash->dwUser = (DWORD)lpWaveHdrSrc; + ash->pbSrc = lpWaveHdrSrc->lpData; + ash->cbSrcLength = lpWaveHdrSrc->dwBufferLength; + /* ash->cbSrcLengthUsed */ + ash->dwSrcUser = lpWaveHdrSrc->dwUser; /* FIXME ? */ + ash->pbDst = (LPSTR)ash + sizeof(ACMSTREAMHEADER) + sizeof(WAVEHDR); + ash->cbDstLength = size; + /* ash->cbDstLengthUsed */ + ash->dwDstUser = 0; /* FIXME ? */ + dwRet = acmStreamPrepareHeader(wom->hAcmStream, ash, 0L); + if (dwRet != MMSYSERR_NOERROR) + goto errCleanUp; + + lpWaveHdrDst = (LPWAVEHDR)((LPSTR)ash + sizeof(ACMSTREAMHEADER)); + lpWaveHdrDst->lpData = ash->pbDst; + lpWaveHdrDst->dwBufferLength = size; /* conversion is not done yet */ + lpWaveHdrDst->dwFlags = 0; + lpWaveHdrDst->dwLoops = 0; + dwRet = waveOutPrepareHeader(wom->u.out.hInnerWave, lpWaveHdrDst, sizeof(*lpWaveHdrDst)); + if (dwRet != MMSYSERR_NOERROR) + goto errCleanUp; + + lpWaveHdrSrc->reserved = (DWORD)ash; + lpWaveHdrSrc->dwFlags = WHDR_PREPARED; + TRACE("=> (0)\n"); + return MMSYSERR_NOERROR; +errCleanUp: + TRACE("=> (%ld)\n", dwRet); + HeapFree(GetProcessHeap(), 0, ash); + return dwRet; +} + +static DWORD wodUnprepare(WAVEMAPDATA* wom, LPWAVEHDR lpWaveHdrSrc, DWORD dwParam2) +{ + PACMSTREAMHEADER ash; + LPWAVEHDR lpWaveHdrDst; + DWORD dwRet1, dwRet2; + + if (!wom->hAcmStream) { + return waveOutUnprepareHeader(wom->u.out.hInnerWave, lpWaveHdrSrc, dwParam2); + } + ash = (PACMSTREAMHEADER)lpWaveHdrSrc->reserved; + dwRet1 = acmStreamUnprepareHeader(wom->hAcmStream, ash, 0L); + + lpWaveHdrDst = (LPWAVEHDR)((LPSTR)ash + sizeof(ACMSTREAMHEADER)); + dwRet2 = waveOutUnprepareHeader(wom->u.out.hInnerWave, lpWaveHdrDst, sizeof(*lpWaveHdrDst)); + + HeapFree(GetProcessHeap(), 0, ash); + + lpWaveHdrSrc->dwFlags &= ~WHDR_PREPARED; + return (dwRet1 == MMSYSERR_NOERROR) ? dwRet2 : dwRet1; +} + +static DWORD wodGetPosition(WAVEMAPDATA* wom, LPMMTIME lpTime, DWORD dwParam2) +{ + DWORD val = waveOutGetPosition(wom->u.out.hInnerWave, lpTime, dwParam2); + if (lpTime->wType == TIME_BYTES) + lpTime->u.cb = MulDiv(lpTime->u.cb, wom->avgSpeedOuter, wom->avgSpeedInner); + /* other time types don't require conversion */ + return val; +} + +static DWORD wodGetDevCaps(UINT wDevID, WAVEMAPDATA* wom, LPWAVEOUTCAPSA lpWaveCaps, DWORD dwParam2) +{ + /* if opened low driver, forward message */ + if (WAVEMAP_IsData(wom)) + return waveOutGetDevCapsA((UINT)wom->u.out.hInnerWave, lpWaveCaps, dwParam2); + /* otherwise, return caps of mapper itself */ + if (wDevID == (UINT)-1 || wDevID == (UINT16)-1) { + lpWaveCaps->wMid = 0x00FF; + lpWaveCaps->wPid = 0x0001; + lpWaveCaps->vDriverVersion = 0x0100; + strcpy(lpWaveCaps->szPname, "Wine wave out mapper"); + lpWaveCaps->dwFormats = + WAVE_FORMAT_4M08 | WAVE_FORMAT_4S08 | WAVE_FORMAT_4M16 | WAVE_FORMAT_4S16 | + WAVE_FORMAT_2M08 | WAVE_FORMAT_2S08 | WAVE_FORMAT_2M16 | WAVE_FORMAT_2S16 | + WAVE_FORMAT_1M08 | WAVE_FORMAT_1S08 | WAVE_FORMAT_1M16 | WAVE_FORMAT_1S16; + lpWaveCaps->wChannels = 2; + lpWaveCaps->dwSupport = WAVECAPS_VOLUME | WAVECAPS_LRVOLUME; + + return MMSYSERR_NOERROR; + } + ERR("This shouldn't happen\n"); + return MMSYSERR_ERROR; +} + +static DWORD wodGetVolume(UINT wDevID, WAVEMAPDATA* wom, LPDWORD lpVol) +{ + if (WAVEMAP_IsData(wom)) + return waveOutGetVolume(wom->u.out.hInnerWave, lpVol); + return MMSYSERR_NOERROR; +} + +static DWORD wodSetVolume(UINT wDevID, WAVEMAPDATA* wom, DWORD vol) +{ + if (WAVEMAP_IsData(wom)) + return waveOutSetVolume(wom->u.out.hInnerWave, vol); + return MMSYSERR_NOERROR; +} + +static DWORD wodPause(WAVEMAPDATA* wom) +{ + return waveOutPause(wom->u.out.hInnerWave); +} + +static DWORD wodRestart(WAVEMAPDATA* wom) +{ + return waveOutRestart(wom->u.out.hInnerWave); +} + +static DWORD wodReset(WAVEMAPDATA* wom) +{ + return waveOutReset(wom->u.out.hInnerWave); +} + +static DWORD wodBreakLoop(WAVEMAPDATA* wom) +{ + return waveOutBreakLoop(wom->u.out.hInnerWave); +} + +static DWORD wodMapperStatus(WAVEMAPDATA* wom, DWORD flags, LPVOID ptr) +{ + UINT id; + DWORD ret = MMSYSERR_NOTSUPPORTED; + + switch (flags) { + case WAVEOUT_MAPPER_STATUS_DEVICE: + ret = waveOutGetID(wom->u.out.hInnerWave, &id); + *(LPDWORD)ptr = id; + break; + case WAVEOUT_MAPPER_STATUS_MAPPED: + FIXME("Unsupported flag=%ld\n", flags); + *(LPDWORD)ptr = 0; /* FIXME ?? */ + break; + case WAVEOUT_MAPPER_STATUS_FORMAT: + FIXME("Unsupported flag=%ld\n", flags); + /* ptr points to a WAVEFORMATEX struct - before or after streaming ? */ + *(LPDWORD)ptr = 0; + break; + default: + FIXME("Unsupported flag=%ld\n", flags); + *(LPDWORD)ptr = 0; + break; + } + return ret; +} + +/************************************************************************** + * wodMessage (MSACM.@) + */ +DWORD WINAPI WAVEMAP_wodMessage(UINT wDevID, UINT wMsg, DWORD dwUser, + DWORD dwParam1, DWORD dwParam2) +{ + TRACE("(%u, %04X, %08lX, %08lX, %08lX);\n", + wDevID, wMsg, dwUser, dwParam1, dwParam2); + + switch (wMsg) { + case DRVM_INIT: + case DRVM_EXIT: + case DRVM_ENABLE: + case DRVM_DISABLE: + /* FIXME: Pretend this is supported */ + return 0; + case WODM_OPEN: return wodOpen ((LPDWORD)dwUser, (LPWAVEOPENDESC)dwParam1,dwParam2); + case WODM_CLOSE: return wodClose ((WAVEMAPDATA*)dwUser); + case WODM_WRITE: return wodWrite ((WAVEMAPDATA*)dwUser, (LPWAVEHDR)dwParam1, dwParam2); + case WODM_PAUSE: return wodPause ((WAVEMAPDATA*)dwUser); + case WODM_GETPOS: return wodGetPosition ((WAVEMAPDATA*)dwUser, (LPMMTIME)dwParam1, dwParam2); + case WODM_BREAKLOOP: return wodBreakLoop ((WAVEMAPDATA*)dwUser); + case WODM_PREPARE: return wodPrepare ((WAVEMAPDATA*)dwUser, (LPWAVEHDR)dwParam1, dwParam2); + case WODM_UNPREPARE: return wodUnprepare ((WAVEMAPDATA*)dwUser, (LPWAVEHDR)dwParam1, dwParam2); + case WODM_GETDEVCAPS: return wodGetDevCaps (wDevID, (WAVEMAPDATA*)dwUser, (LPWAVEOUTCAPSA)dwParam1,dwParam2); + case WODM_GETNUMDEVS: return 1; + case WODM_GETPITCH: return MMSYSERR_NOTSUPPORTED; + case WODM_SETPITCH: return MMSYSERR_NOTSUPPORTED; + case WODM_GETPLAYBACKRATE: return MMSYSERR_NOTSUPPORTED; + case WODM_SETPLAYBACKRATE: return MMSYSERR_NOTSUPPORTED; + case WODM_GETVOLUME: return wodGetVolume (wDevID, (WAVEMAPDATA*)dwUser, (LPDWORD)dwParam1); + case WODM_SETVOLUME: return wodSetVolume (wDevID, (WAVEMAPDATA*)dwUser, dwParam1); + case WODM_RESTART: return wodRestart ((WAVEMAPDATA*)dwUser); + case WODM_RESET: return wodReset ((WAVEMAPDATA*)dwUser); + case WODM_MAPPER_STATUS: return wodMapperStatus ((WAVEMAPDATA*)dwUser, dwParam1, (LPVOID)dwParam2); + default: + FIXME("unknown message %d!\n", wMsg); + } + return MMSYSERR_NOTSUPPORTED; +} + +/*======================================================================* + * WAVE IN part * + *======================================================================*/ + +static void CALLBACK widCallback(HWAVEIN hWave, UINT uMsg, DWORD dwInstance, + DWORD dwParam1, DWORD dwParam2) +{ + WAVEMAPDATA* wim = (WAVEMAPDATA*)dwInstance; + + TRACE("(%p %u %ld %lx %lx);\n", hWave, uMsg, dwInstance, dwParam1, dwParam2); + + if (!WAVEMAP_IsData(wim)) { + ERR("Bad data\n"); + return; + } + + if (hWave != wim->u.in.hInnerWave && uMsg != WIM_OPEN) + ERR("Shouldn't happen (%p %p)\n", hWave, wim->u.in.hInnerWave); + + switch (uMsg) { + case WIM_OPEN: + case WIM_CLOSE: + /* dwParam1 & dwParam2 are supposed to be 0, nothing to do */ + break; + case WIM_DATA: + if (wim->hAcmStream) { + LPWAVEHDR lpWaveHdrSrc = (LPWAVEHDR)dwParam1; + PACMSTREAMHEADER ash = (PACMSTREAMHEADER)((LPSTR)lpWaveHdrSrc - sizeof(ACMSTREAMHEADER)); + LPWAVEHDR lpWaveHdrDst = (LPWAVEHDR)ash->dwUser; + + /* convert data just gotten from waveIn into requested format */ + if (acmStreamConvert(wim->hAcmStream, ash, 0L) != MMSYSERR_NOERROR) { + ERR("ACM conversion failed\n"); + return; + } else { + TRACE("Converted %ld bytes into %ld\n", ash->cbSrcLengthUsed, ash->cbDstLengthUsed); + } + /* and setup the wavehdr to return accordingly */ + lpWaveHdrDst->dwFlags &= ~WHDR_INQUEUE; + lpWaveHdrDst->dwFlags |= WHDR_DONE; + lpWaveHdrDst->dwBytesRecorded = ash->cbDstLengthUsed; + dwParam1 = (DWORD)lpWaveHdrDst; + } + break; + default: + ERR("Unknown msg %u\n", uMsg); + } + + DriverCallback(wim->dwCallback, HIWORD(wim->dwFlags), (HDRVR)wim->u.in.hOuterWave, + uMsg, wim->dwClientInstance, dwParam1, dwParam2); +} + +static DWORD widOpenHelper(WAVEMAPDATA* wim, UINT idx, + LPWAVEOPENDESC lpDesc, LPWAVEFORMATEX lpwfx, + DWORD dwFlags) +{ + DWORD ret; + + /* source is always PCM, so the formulas below apply */ + lpwfx->nBlockAlign = (lpwfx->nChannels * lpwfx->wBitsPerSample) / 8; + lpwfx->nAvgBytesPerSec = lpwfx->nSamplesPerSec * lpwfx->nBlockAlign; + if (dwFlags & WAVE_FORMAT_QUERY) { + ret = acmStreamOpen(NULL, 0, lpwfx, lpDesc->lpFormat, NULL, 0L, 0L, ACM_STREAMOPENF_QUERY); + } else { + ret = acmStreamOpen(&wim->hAcmStream, 0, lpwfx, lpDesc->lpFormat, NULL, 0L, 0L, 0L); + } + if (ret == MMSYSERR_NOERROR) { + ret = waveInOpen(&wim->u.in.hInnerWave, idx, lpwfx, (DWORD)widCallback, + (DWORD)wim, (dwFlags & ~CALLBACK_TYPEMASK) | CALLBACK_FUNCTION); + if (ret != MMSYSERR_NOERROR && !(dwFlags & WAVE_FORMAT_QUERY)) { + acmStreamClose(wim->hAcmStream, 0); + wim->hAcmStream = 0; + } + } + return ret; +} + +static DWORD widOpen(LPDWORD lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags) +{ + UINT ndlo, ndhi; + UINT i; + WAVEMAPDATA* wim = HeapAlloc(GetProcessHeap(), 0, sizeof(WAVEMAPDATA)); + + TRACE("(%p %p %08lx)\n", lpdwUser, lpDesc, dwFlags); + + if (!wim) + return MMSYSERR_NOMEM; + + wim->self = wim; + wim->dwCallback = lpDesc->dwCallback; + wim->dwFlags = dwFlags; + wim->dwClientInstance = lpDesc->dwInstance; + wim->u.in.hOuterWave = (HWAVEIN)lpDesc->hWave; + + ndhi = waveInGetNumDevs(); + if (dwFlags & WAVE_MAPPED) { + if (lpDesc->uMappedDeviceID >= ndhi) return MMSYSERR_INVALPARAM; + ndlo = lpDesc->uMappedDeviceID; + ndhi = ndlo + 1; + dwFlags &= ~WAVE_MAPPED; + } else { + ndlo = 0; + } + + wim->avgSpeedOuter = wim->avgSpeedInner = lpDesc->lpFormat->nAvgBytesPerSec; + + for (i = ndlo; i < ndhi; i++) { + if (waveInOpen(&wim->u.in.hInnerWave, i, lpDesc->lpFormat, (DWORD)widCallback, + (DWORD)wim, (dwFlags & ~CALLBACK_TYPEMASK) | CALLBACK_FUNCTION | WAVE_FORMAT_DIRECT) == MMSYSERR_NOERROR) { + wim->hAcmStream = 0; + goto found; + } + } + + if ((dwFlags & WAVE_FORMAT_DIRECT) == 0) + { + WAVEFORMATEX wfx; + + wfx.wFormatTag = WAVE_FORMAT_PCM; + wfx.cbSize = 0; /* normally, this field is not used for PCM format, just in case */ + /* try some ACM stuff */ + +#define TRY(sps,bps) wfx.nSamplesPerSec = (sps); wfx.wBitsPerSample = (bps); \ + switch (widOpenHelper(wim, i, lpDesc, &wfx, dwFlags | WAVE_FORMAT_DIRECT)) { \ + case MMSYSERR_NOERROR: wim->avgSpeedInner = wfx.nAvgBytesPerSec; goto found; \ + case WAVERR_BADFORMAT: break; \ + default: goto error; \ + } + + for (i = ndlo; i < ndhi; i++) { + wfx.nSamplesPerSec=lpDesc->lpFormat->nSamplesPerSec; + /* first try with same stereo/mono option as source */ + wfx.nChannels = lpDesc->lpFormat->nChannels; + TRY(wfx.nSamplesPerSec, 16); + TRY(wfx.nSamplesPerSec, 8); + wfx.nChannels ^= 3; + TRY(wfx.nSamplesPerSec, 16); + TRY(wfx.nSamplesPerSec, 8); + } + + for (i = ndlo; i < ndhi; i++) { + wfx.nSamplesPerSec=lpDesc->lpFormat->nSamplesPerSec; + /* first try with same stereo/mono option as source */ + wfx.nChannels = lpDesc->lpFormat->nChannels; + TRY(96000, 16); + TRY(48000, 16); + TRY(44100, 16); + TRY(22050, 16); + TRY(11025, 16); + + /* 2^3 => 1, 1^3 => 2, so if stereo, try mono (and the other way around) */ + wfx.nChannels ^= 3; + TRY(96000, 16); + TRY(48000, 16); + TRY(44100, 16); + TRY(22050, 16); + TRY(11025, 16); + + /* first try with same stereo/mono option as source */ + wfx.nChannels = lpDesc->lpFormat->nChannels; + TRY(96000, 8); + TRY(48000, 8); + TRY(44100, 8); + TRY(22050, 8); + TRY(11025, 8); + + /* 2^3 => 1, 1^3 => 2, so if stereo, try mono (and the other way around) */ + wfx.nChannels ^= 3; + TRY(96000, 8); + TRY(48000, 8); + TRY(44100, 8); + TRY(22050, 8); + TRY(11025, 8); + } +#undef TRY + } + + HeapFree(GetProcessHeap(), 0, wim); + return WAVERR_BADFORMAT; +found: + if (dwFlags & WAVE_FORMAT_QUERY) { + *lpdwUser = 0L; + HeapFree(GetProcessHeap(), 0, wim); + } else { + *lpdwUser = (DWORD)wim; + } + TRACE("Ok (stream=%08lx)\n", (DWORD)wim->hAcmStream); + return MMSYSERR_NOERROR; +error: + HeapFree(GetProcessHeap(), 0, wim); + return MMSYSERR_ERROR; +} + +static DWORD widClose(WAVEMAPDATA* wim) +{ + DWORD ret = waveInClose(wim->u.in.hInnerWave); + + if (ret == MMSYSERR_NOERROR) { + if (wim->hAcmStream) { + ret = acmStreamClose(wim->hAcmStream, 0); + } + if (ret == MMSYSERR_NOERROR) { + HeapFree(GetProcessHeap(), 0, wim); + } + } + return ret; +} + +static DWORD widAddBuffer(WAVEMAPDATA* wim, LPWAVEHDR lpWaveHdrDst, DWORD dwParam2) +{ + PACMSTREAMHEADER ash; + LPWAVEHDR lpWaveHdrSrc; + + if (!wim->hAcmStream) { + return waveInAddBuffer(wim->u.in.hInnerWave, lpWaveHdrDst, dwParam2); + } + + lpWaveHdrDst->dwFlags |= WHDR_INQUEUE; + ash = (PACMSTREAMHEADER)lpWaveHdrDst->reserved; + + lpWaveHdrSrc = (LPWAVEHDR)((LPSTR)ash + sizeof(ACMSTREAMHEADER)); + return waveInAddBuffer(wim->u.in.hInnerWave, lpWaveHdrSrc, sizeof(*lpWaveHdrSrc)); +} + +static DWORD widPrepare(WAVEMAPDATA* wim, LPWAVEHDR lpWaveHdrDst, DWORD dwParam2) +{ + PACMSTREAMHEADER ash; + DWORD size; + DWORD dwRet; + LPWAVEHDR lpWaveHdrSrc; + + if (!wim->hAcmStream) { + return waveInPrepareHeader(wim->u.in.hInnerWave, lpWaveHdrDst, dwParam2); + } + if (acmStreamSize(wim->hAcmStream, lpWaveHdrDst->dwBufferLength, &size, + ACM_STREAMSIZEF_DESTINATION) != MMSYSERR_NOERROR) + return MMSYSERR_ERROR; + + ash = HeapAlloc(GetProcessHeap(), 0, sizeof(ACMSTREAMHEADER) + sizeof(WAVEHDR) + size); + if (ash == NULL) + return MMSYSERR_NOMEM; + + ash->cbStruct = sizeof(*ash); + ash->fdwStatus = 0L; + ash->dwUser = (DWORD)lpWaveHdrDst; + ash->pbSrc = (LPSTR)ash + sizeof(ACMSTREAMHEADER) + sizeof(WAVEHDR); + ash->cbSrcLength = size; + /* ash->cbSrcLengthUsed */ + ash->dwSrcUser = 0L; /* FIXME ? */ + ash->pbDst = lpWaveHdrDst->lpData; + ash->cbDstLength = lpWaveHdrDst->dwBufferLength; + /* ash->cbDstLengthUsed */ + ash->dwDstUser = lpWaveHdrDst->dwUser; /* FIXME ? */ + dwRet = acmStreamPrepareHeader(wim->hAcmStream, ash, 0L); + if (dwRet != MMSYSERR_NOERROR) + goto errCleanUp; + + lpWaveHdrSrc = (LPWAVEHDR)((LPSTR)ash + sizeof(ACMSTREAMHEADER)); + lpWaveHdrSrc->lpData = ash->pbSrc; + lpWaveHdrSrc->dwBufferLength = size; /* conversion is not done yet */ + lpWaveHdrSrc->dwFlags = 0; + lpWaveHdrSrc->dwLoops = 0; + dwRet = waveInPrepareHeader(wim->u.in.hInnerWave, lpWaveHdrSrc, sizeof(*lpWaveHdrSrc)); + if (dwRet != MMSYSERR_NOERROR) + goto errCleanUp; + + lpWaveHdrDst->reserved = (DWORD)ash; + lpWaveHdrDst->dwFlags = WHDR_PREPARED; + TRACE("=> (0)\n"); + return MMSYSERR_NOERROR; +errCleanUp: + TRACE("=> (%ld)\n", dwRet); + HeapFree(GetProcessHeap(), 0, ash); + return dwRet; +} + +static DWORD widUnprepare(WAVEMAPDATA* wim, LPWAVEHDR lpWaveHdrDst, DWORD dwParam2) +{ + PACMSTREAMHEADER ash; + LPWAVEHDR lpWaveHdrSrc; + DWORD dwRet1, dwRet2; + + if (!wim->hAcmStream) { + return waveInUnprepareHeader(wim->u.in.hInnerWave, lpWaveHdrDst, dwParam2); + } + ash = (PACMSTREAMHEADER)lpWaveHdrDst->reserved; + dwRet1 = acmStreamUnprepareHeader(wim->hAcmStream, ash, 0L); + + lpWaveHdrSrc = (LPWAVEHDR)((LPSTR)ash + sizeof(ACMSTREAMHEADER)); + dwRet2 = waveInUnprepareHeader(wim->u.in.hInnerWave, lpWaveHdrSrc, sizeof(*lpWaveHdrSrc)); + + HeapFree(GetProcessHeap(), 0, ash); + + lpWaveHdrDst->dwFlags &= ~WHDR_PREPARED; + return (dwRet1 == MMSYSERR_NOERROR) ? dwRet2 : dwRet1; +} + +static DWORD widGetPosition(WAVEMAPDATA* wim, LPMMTIME lpTime, DWORD dwParam2) +{ + DWORD val = waveInGetPosition(wim->u.in.hInnerWave, lpTime, dwParam2); + if (lpTime->wType == TIME_BYTES) + lpTime->u.cb = MulDiv(lpTime->u.cb, wim->avgSpeedOuter, wim->avgSpeedInner); + /* other time types don't require conversion */ + return val; +} + +static DWORD widGetDevCaps(UINT wDevID, WAVEMAPDATA* wim, LPWAVEINCAPSA lpWaveCaps, DWORD dwParam2) +{ + /* if opened low driver, forward message */ + if (WAVEMAP_IsData(wim)) + return waveInGetDevCapsA((UINT)wim->u.in.hInnerWave, lpWaveCaps, dwParam2); + /* otherwise, return caps of mapper itself */ + if (wDevID == (UINT)-1 || wDevID == (UINT16)-1) { + lpWaveCaps->wMid = 0x00FF; + lpWaveCaps->wPid = 0x0001; + lpWaveCaps->vDriverVersion = 0x0001; + strcpy(lpWaveCaps->szPname, "Wine wave in mapper"); + lpWaveCaps->dwFormats = + WAVE_FORMAT_4M08 | WAVE_FORMAT_4S08 | WAVE_FORMAT_4M16 | WAVE_FORMAT_4S16 | + WAVE_FORMAT_2M08 | WAVE_FORMAT_2S08 | WAVE_FORMAT_2M16 | WAVE_FORMAT_2S16 | + WAVE_FORMAT_1M08 | WAVE_FORMAT_1S08 | WAVE_FORMAT_1M16 | WAVE_FORMAT_1S16; + lpWaveCaps->wChannels = 2; + return MMSYSERR_NOERROR; + } + ERR("This shouldn't happen\n"); + return MMSYSERR_ERROR; +} + +static DWORD widStop(WAVEMAPDATA* wim) +{ + return waveInStop(wim->u.in.hInnerWave); +} + +static DWORD widStart(WAVEMAPDATA* wim) +{ + return waveInStart(wim->u.in.hInnerWave); +} + +static DWORD widReset(WAVEMAPDATA* wim) +{ + return waveInReset(wim->u.in.hInnerWave); +} + +static DWORD widMapperStatus(WAVEMAPDATA* wim, DWORD flags, LPVOID ptr) +{ + UINT id; + DWORD ret = MMSYSERR_NOTSUPPORTED; + + switch (flags) { + case WAVEIN_MAPPER_STATUS_DEVICE: + ret = waveInGetID(wim->u.in.hInnerWave, &id); + *(LPDWORD)ptr = id; + break; + case WAVEIN_MAPPER_STATUS_MAPPED: + FIXME("Unsupported yet flag=%ld\n", flags); + *(LPDWORD)ptr = 0; /* FIXME ?? */ + break; + case WAVEIN_MAPPER_STATUS_FORMAT: + FIXME("Unsupported flag=%ld\n", flags); + /* ptr points to a WAVEFORMATEX struct - before or after streaming ? */ + *(LPDWORD)ptr = 0; /* FIXME ?? */ + break; + default: + FIXME("Unsupported flag=%ld\n", flags); + *(LPDWORD)ptr = 0; + break; + } + return ret; +} + +/************************************************************************** + * widMessage (MSACM.@) + */ +DWORD WINAPI WAVEMAP_widMessage(WORD wDevID, WORD wMsg, DWORD dwUser, + DWORD dwParam1, DWORD dwParam2) +{ + TRACE("(%u, %04X, %08lX, %08lX, %08lX);\n", + wDevID, wMsg, dwUser, dwParam1, dwParam2); + + switch (wMsg) { + case DRVM_INIT: + case DRVM_EXIT: + case DRVM_ENABLE: + case DRVM_DISABLE: + /* FIXME: Pretend this is supported */ + return 0; + + case WIDM_OPEN: return widOpen ((LPDWORD)dwUser, (LPWAVEOPENDESC)dwParam1, dwParam2); + case WIDM_CLOSE: return widClose ((WAVEMAPDATA*)dwUser); + + case WIDM_ADDBUFFER: return widAddBuffer ((WAVEMAPDATA*)dwUser, (LPWAVEHDR)dwParam1, dwParam2); + case WIDM_PREPARE: return widPrepare ((WAVEMAPDATA*)dwUser, (LPWAVEHDR)dwParam1, dwParam2); + case WIDM_UNPREPARE: return widUnprepare ((WAVEMAPDATA*)dwUser, (LPWAVEHDR)dwParam1, dwParam2); + case WIDM_GETDEVCAPS: return widGetDevCaps (wDevID, (WAVEMAPDATA*)dwUser, (LPWAVEINCAPSA)dwParam1, dwParam2); + case WIDM_GETNUMDEVS: return 1; + case WIDM_GETPOS: return widGetPosition ((WAVEMAPDATA*)dwUser, (LPMMTIME)dwParam1, dwParam2); + case WIDM_RESET: return widReset ((WAVEMAPDATA*)dwUser); + case WIDM_START: return widStart ((WAVEMAPDATA*)dwUser); + case WIDM_STOP: return widStop ((WAVEMAPDATA*)dwUser); + case WIDM_MAPPER_STATUS: return widMapperStatus ((WAVEMAPDATA*)dwUser, dwParam1, (LPVOID)dwParam2); + default: + FIXME("unknown message %u!\n", wMsg); + } + return MMSYSERR_NOTSUPPORTED; +} + +/*======================================================================* + * Driver part * + *======================================================================*/ + +static struct WINE_WAVEMAP* oss = NULL; + +/************************************************************************** + * WAVEMAP_drvOpen [internal] + */ +static DWORD WAVEMAP_drvOpen(LPSTR str) +{ + if (oss) + return 0; + + /* I know, this is ugly, but who cares... */ + oss = (struct WINE_WAVEMAP*)1; + return 1; +} + +/************************************************************************** + * WAVEMAP_drvClose [internal] + */ +static DWORD WAVEMAP_drvClose(DWORD dwDevID) +{ + if (oss) { + oss = NULL; + return 1; + } + return 0; +} + +/************************************************************************** + * DriverProc (MSACM.@) + */ +LONG CALLBACK WAVEMAP_DriverProc(DWORD dwDevID, HDRVR hDriv, DWORD wMsg, + DWORD dwParam1, DWORD dwParam2) +{ + TRACE("(%08lX, %p, %08lX, %08lX, %08lX)\n", + dwDevID, hDriv, wMsg, dwParam1, dwParam2); + + switch(wMsg) { + case DRV_LOAD: return 1; + case DRV_FREE: return 1; + case DRV_OPEN: return WAVEMAP_drvOpen((LPSTR)dwParam1); + case DRV_CLOSE: return WAVEMAP_drvClose(dwDevID); + case DRV_ENABLE: return 1; + case DRV_DISABLE: return 1; + case DRV_QUERYCONFIGURE: return 1; + case DRV_CONFIGURE: MessageBoxA(0, "WAVEMAP MultiMedia Driver !", "Wave mapper Driver", MB_OK); return 1; + case DRV_INSTALL: return DRVCNF_RESTART; + case DRV_REMOVE: return DRVCNF_RESTART; + default: + return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2); + } +} diff --git a/reactos/lib/winmm/wavemap/wavemap.rc b/reactos/lib/winmm/wavemap/wavemap.rc new file mode 100644 index 00000000000..2d6c55fafe7 --- /dev/null +++ b/reactos/lib/winmm/wavemap/wavemap.rc @@ -0,0 +1,39 @@ +#include <defines.h> +#include <reactos/resource.h> + +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", "ReactOS/WINE Wave Mapper\0" + VALUE "FileVersion", RES_STR_FILE_VERSION + VALUE "InternalName", "wavemap\0" + VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT + VALUE "OriginalFilename", "wavemap.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/winmm/wavemap/wavemap.spec.def b/reactos/lib/winmm/wavemap/wavemap.spec.def new file mode 100644 index 00000000000..e83446b9187 --- /dev/null +++ b/reactos/lib/winmm/wavemap/wavemap.spec.def @@ -0,0 +1,2 @@ +@ stdcall DriverProc(long long long long long) MIDIMAP_DriverProc +@ stdcall modMessage(long long long long long) MIDIMAP_modMessage diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index afad18f1402..e09cfda3ea9 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.58 2004/02/25 01:25:51 sedwards Exp $ */ +/* $Id: bitmaps.c,v 1.59 2004/03/10 15:22:43 silverblade Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> #include <stdlib.h> @@ -268,6 +268,7 @@ HBITMAP STDCALL NtGdiCreateBitmap(INT Width, { PBITMAPOBJ bmp; HBITMAP hBitmap; + int Pixel; Planes = (BYTE) Planes; BitsPerPel = (BYTE) BitsPerPel; @@ -321,6 +322,12 @@ HBITMAP STDCALL NtGdiCreateBitmap(INT Width, bmp->bitmap.bmBits = ExAllocatePoolWithTag(PagedPool, bmp->bitmap.bmWidthBytes * bmp->bitmap.bmHeight, TAG_BITMAP); BITMAPOBJ_UnlockBitmap( hBitmap ); + + // Initialize the bitmap (fixes bug 244?) + for (Pixel = 0; Pixel < Height * bmp->bitmap.bmWidthBytes; Pixel ++) + { + ((char*)Bits)[Pixel] = 0; + } if (Bits) /* Set bitmap bits */ { diff --git a/reactos/tools/helper.mk b/reactos/tools/helper.mk index fe2cd7f2247..4bb3b39b283 100644 --- a/reactos/tools/helper.mk +++ b/reactos/tools/helper.mk @@ -1,4 +1,4 @@ -# $Id: helper.mk,v 1.59 2004/03/04 23:14:01 dwelch Exp $ +# $Id: helper.mk,v 1.60 2004/03/10 15:22:44 silverblade Exp $ # # Helper makefile for ReactOS modules # Variables this makefile accepts: @@ -467,6 +467,38 @@ endif MK_RC_BINARIES = $(TARGET_RC_BINARIES) endif +ifeq ($(TARGET_TYPE),winedrv) +-include Makefile.ros + MK_GENERATED_MAKEFILE = Makefile.ros + MK_MODE := user + MK_EXETYPE := drv + MK_DEFEXT := .drv +# does this need changing?: + MK_DEFENTRY := _DllMain@12 + MK_DDKLIBS := + MK_SDKLIBS := + MK_CFLAGS := -D__USE_W32API -D_WIN32_IE=0x600 -D_WIN32_WINNT=0x501 -DWINVER=0x501 -D__need_offsetof -DCOBJMACROS -I$(PATH_TO_TOP)/include/wine + MK_CPPFLAGS := -D__USE_W32API -D_WIN32_IE=0x600 -D_WIN32_WINNT=0x501 -DWINVER=0x501 -D__need_offsetof -DCOBJMACROS -I$(PATH_TO_TOP)/include -I$(PATH_TO_TOP)/include/wine + MK_RCFLAGS := --define __USE_W32API --include-dir $(PATH_TO_TOP)/include/wine + MK_IMPLIB := yes + MK_IMPLIBONLY := no + MK_IMPLIBDEFPATH := $(SDK_PATH_LIB) + MK_IMPLIB_EXT := .a + MK_INSTALLDIR := system32 + MK_BOOTCDDIR := system32 + MK_DISTDIR := dlls + MK_RES_BASE := $(TARGET_NAME) +ifeq ($(TARGET_DEFNAME),) + MK_DEFBASENAME := $(TARGET_NAME).spec + MK_SPECDEF := $(MK_DEFBASENAME).def +else + MK_DEFBASENAME := $(TARGET_DEFNAME) +endif + MK_KILLAT := --kill-at + TARGET_DEFONLY := yes + MK_RC_BINARIES = $(TARGET_RC_BINARIES) +endif + ifeq ($(TARGET_RC_SRCS),) MK_RES_SRC := $(TARGET_PATH)/$(MK_RES_BASE).rc MK_RESOURCE := $(MK_RES_BASE).coff @@ -1030,6 +1062,8 @@ endif # ROS_USE_PCH $(RC) $(TARGET_RCFLAGS) $< -o $@ %.spec.def: %.spec $(WINEBUILD) $(DEFS) -o $@ --def $< +%.drv.spec.def: %.spec + $(WINEBUILD) $(DEFS) -o $@ --def $< # Kill implicit rule .o:; From 7f3f39dc2078902c052c78d0eb62cca5b7a618b2 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Wed, 10 Mar 2004 16:10:13 +0000 Subject: [PATCH 0409/1463] - Fixed bug in VideoPortSetBusData. svn path=/trunk/; revision=8621 --- reactos/drivers/video/videoprt/videoprt.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index aa77e78be73..72c80d79534 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.17 2004/03/09 17:28:49 navaraf Exp $ + * $Id: videoprt.c,v 1.18 2004/03/10 16:10:13 navaraf Exp $ */ #include "videoprt.h" @@ -847,9 +847,16 @@ VideoPortSetBusData(IN PVOID HwDeviceExtension, IN ULONG Offset, IN ULONG Length) { + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + DPRINT("VideoPortSetBusData\n"); + + DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, + VIDEO_PORT_DEVICE_EXTENSION, + MiniPortDeviceExtension); + return HalSetBusDataByOffset(BusDataType, - 0, + DeviceExtension->SystemIoBusNumber, SlotNumber, Buffer, Offset, From d72790226acaa8581348a2050ada25a179fff7f7 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Wed, 10 Mar 2004 16:55:03 +0000 Subject: [PATCH 0410/1463] - Fixed the Andrew's NtGdiCreateCompatibleBitmap fix, it was using a wrong Bits array. svn path=/trunk/; revision=8622 --- reactos/subsys/win32k/objects/bitmaps.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index e09cfda3ea9..a6363ab909d 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.59 2004/03/10 15:22:43 silverblade Exp $ */ +/* $Id: bitmaps.c,v 1.60 2004/03/10 16:55:03 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> #include <stdlib.h> @@ -268,7 +268,6 @@ HBITMAP STDCALL NtGdiCreateBitmap(INT Width, { PBITMAPOBJ bmp; HBITMAP hBitmap; - int Pixel; Planes = (BYTE) Planes; BitsPerPel = (BYTE) BitsPerPel; @@ -323,16 +322,15 @@ HBITMAP STDCALL NtGdiCreateBitmap(INT Width, BITMAPOBJ_UnlockBitmap( hBitmap ); - // Initialize the bitmap (fixes bug 244?) - for (Pixel = 0; Pixel < Height * bmp->bitmap.bmWidthBytes; Pixel ++) - { - ((char*)Bits)[Pixel] = 0; - } - 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; } From fc8e6d987a9276c93a81d25b15e8212eaacec42e Mon Sep 17 00:00:00 2001 From: Casper Hornstrup <chorns@users.sourceforge.net> Date: Wed, 10 Mar 2004 16:57:36 +0000 Subject: [PATCH 0411/1463] 2004-03-10 Casper S. Hornstrup <chorns@users.sourceforge.net> * subsys/system/usetup/bootsup.c (UpdateFreeLoaderIni): Use existing ReactOS entry if available. svn path=/trunk/; revision=8623 --- reactos/ChangeLog | 5 ++ reactos/subsys/system/usetup/bootsup.c | 85 ++++++++++++++++++++++++-- 2 files changed, 84 insertions(+), 6 deletions(-) diff --git a/reactos/ChangeLog b/reactos/ChangeLog index eac5847234c..1f03662603e 100644 --- a/reactos/ChangeLog +++ b/reactos/ChangeLog @@ -1,3 +1,8 @@ +2004-03-10 Casper S. Hornstrup <chorns@users.sourceforge.net> + + * subsys/system/usetup/bootsup.c (UpdateFreeLoaderIni): Use existing + ReactOS entry if available. + 2004-03-09 Casper S. Hornstrup <chorns@users.sourceforge.net> * regtests/Makefile: Make REGTEST_TARGETS depend on *.c. diff --git a/reactos/subsys/system/usetup/bootsup.c b/reactos/subsys/system/usetup/bootsup.c index 12505268840..68fa979277e 100644 --- a/reactos/subsys/system/usetup/bootsup.c +++ b/reactos/subsys/system/usetup/bootsup.c @@ -380,10 +380,13 @@ UpdateFreeLoaderIni(PWCHAR IniPath, UNICODE_STRING Name; PINICACHE IniCache; PINICACHESECTION IniSection; + PINICACHESECTION OsIniSection; WCHAR SectionName[80]; WCHAR OsName[80]; + WCHAR SystemPath[200]; + WCHAR SectionName2[200]; PWCHAR KeyData; - ULONG i; + ULONG i,j; NTSTATUS Status; RtlInitUnicodeString(&Name, @@ -399,9 +402,12 @@ UpdateFreeLoaderIni(PWCHAR IniPath, IniSection = IniCacheGetSection(IniCache, L"Operating Systems"); if (IniSection == NULL) + { + IniCacheDestroy(IniCache); return(STATUS_UNSUCCESSFUL); + } - /* Find an unused section name */ + /* Find an existing usable or an unused section name */ i = 1; wcscpy(SectionName, L"ReactOS"); wcscpy(OsName, L"\"ReactOS\""); @@ -413,6 +419,77 @@ UpdateFreeLoaderIni(PWCHAR IniPath, if (!NT_SUCCESS(Status)) break; + /* Get operation system section */ + if (KeyData[0] == '"') + { + wcscpy(SectionName2, &KeyData[1]); + j = wcslen(SectionName2); + if (j > 0) + { + SectionName2[j-1] = 0; + } + } + else + { + wcscpy(SectionName2, KeyData); + } + + OsIniSection = IniCacheGetSection(IniCache, + SectionName2); + if (OsIniSection != NULL) + { + BOOLEAN UseExistingEntry = TRUE; + + /* Check BootType */ + Status = IniCacheGetKey(OsIniSection, + L"BootType", + &KeyData); + if (NT_SUCCESS(Status)) + { + if (KeyData == NULL + || (_wcsicmp(KeyData, L"ReactOS") != 0 + && _wcsicmp(KeyData, L"\"ReactOS\"") != 0)) + { + /* This is not a ReactOS entry */ + UseExistingEntry = FALSE; + } + } + else + { + UseExistingEntry = FALSE; + } + + if (UseExistingEntry) + { + /* BootType is ReactOS. Now check SystemPath */ + Status = IniCacheGetKey(OsIniSection, + L"SystemPath", + &KeyData); + if (NT_SUCCESS(Status)) + { + swprintf(SystemPath, L"\"%S\"", ArcPath); + if (KeyData == NULL + || (_wcsicmp(KeyData, ArcPath) != 0 + && _wcsicmp(KeyData, SystemPath) != 0)) + { + /* This entry is a ReactOS entry, but the SystemRoot does not + match the one we are looking for */ + UseExistingEntry = FALSE; + } + } + else + { + UseExistingEntry = FALSE; + } + } + + if (UseExistingEntry) + { + IniCacheDestroy(IniCache); + return(STATUS_SUCCESS); + } + } + swprintf(SectionName, L"ReactOS_%lu", i); swprintf(OsName, L"\"ReactOS %lu\"", i); i++; @@ -1608,7 +1685,6 @@ UpdateBootIni(PWSTR BootIniPath, FALSE); if (!NT_SUCCESS(Status)) { -CHECKPOINT1; return(Status); } @@ -1616,7 +1692,6 @@ CHECKPOINT1; L"operating systems"); if (Section == NULL) { -CHECKPOINT1; IniCacheDestroy(Cache); return(STATUS_UNSUCCESSFUL); } @@ -1631,7 +1706,6 @@ CHECKPOINT1; &FileAttribute); if (!NT_SUCCESS(Status)) { -CHECKPOINT1; IniCacheDestroy(Cache); return(Status); } @@ -1640,7 +1714,6 @@ CHECKPOINT1; BootIniPath); if (!NT_SUCCESS(Status)) { -CHECKPOINT1; IniCacheDestroy(Cache); return(Status); } From b2a9c5d1de47ce83001f54cc6d55bc5ecbe3b3a0 Mon Sep 17 00:00:00 2001 From: Andrew Greenwood <silverblade@reactos.org> Date: Wed, 10 Mar 2004 17:32:16 +0000 Subject: [PATCH 0412/1463] - Boot into GUI again (I'd disabled this as GUI stopped working in my local tree) - sorry about that! svn path=/trunk/; revision=8624 --- reactos/bootdata/hivesft.inf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/bootdata/hivesft.inf b/reactos/bootdata/hivesft.inf index caaacf32e4f..b2dcf0d67c0 100644 --- a/reactos/bootdata/hivesft.inf +++ b/reactos/bootdata/hivesft.inf @@ -31,8 +31,8 @@ HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList","ProfilesDirecto ;HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList","AllUsersProfile",0x00000000,"All Users.REACTOS" ;HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList","DefaultUserProfile",0x00000000,"Default User.REACTOS" -HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","Shell",0x00020000,"%SystemRoot%\system32\cmd.exe" -;HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","Shell",0x00020000,"%SystemRoot%\explorer.exe" +;HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","Shell",0x00020000,"%SystemRoot%\system32\cmd.exe" +HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","Shell",0x00020000,"%SystemRoot%\explorer.exe" HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","StartServices",0x00010001,0x00000001 HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","StartGUI",0x00010001,0x00000000 HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","Userinit",0x00020000,"%SystemRoot%\system32\userinit.exe" From c29a4bda2e19aa0bce6bccf082761427e101a837 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Wed, 10 Mar 2004 18:57:36 +0000 Subject: [PATCH 0413/1463] Add -Wall to the Makefle and fix a few compiler warrnings for depreceated C++ svn path=/trunk/; revision=8625 --- rosapps/net/telnet/Makefile | 4 ++-- rosapps/net/telnet/src/stl_bids.h | 13 +++++-------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/rosapps/net/telnet/Makefile b/rosapps/net/telnet/Makefile index c638b738380..dce43a92de5 100644 --- a/rosapps/net/telnet/Makefile +++ b/rosapps/net/telnet/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.4 2004/01/12 22:45:53 sedwards Exp $ +# $Id: Makefile,v 1.5 2004/03/10 18:57:35 sedwards Exp $ PATH_TO_TOP=../../../reactos @@ -10,7 +10,7 @@ TARGET_NAME = telnet TARGET_SDKLIBS = ws2_32.a -TARGET_CPPFLAGS = -D__REACTOS__ -D__USE_W32API +TARGET_CPPFLAGS = -D__REACTOS__ -D__USE_W32API -Wall TARGET_GCCLIBS = stdc++ diff --git a/rosapps/net/telnet/src/stl_bids.h b/rosapps/net/telnet/src/stl_bids.h index cadf32a751b..e95493202a7 100644 --- a/rosapps/net/telnet/src/stl_bids.h +++ b/rosapps/net/telnet/src/stl_bids.h @@ -18,6 +18,7 @@ template <class T> class TArrayAsVector : public vector<T> { private: const unsigned int growable; + typedef size_t size_type; const size_type lowerbound; public: TArrayAsVector(size_type upper, @@ -128,15 +129,11 @@ public: #ifdef _MSC_VER _Destroy(begin(), end()); _Last = _First; -#else -// destroy(begin( ), end( )); -#ifdef __CYGWIN__ + destroy(begin( ), end( )); +#elif defined (__CYGWIN__) || defined (__MINGW32__) _M_finish = _M_start; -#endif -// finish = start; /* Removed for ReactOS */ -#ifdef __REACTOS__ - _M_finish = _M_start; -#endif +#else /* Anything else */ + finish = start; #endif } From 1984d3c175869adb5934fceae1f673f9663e19b9 Mon Sep 17 00:00:00 2001 From: Vizzini <vizzini@plasmic.com> Date: Wed, 10 Mar 2004 19:35:04 +0000 Subject: [PATCH 0414/1463] Disabled disk-change notification because it was breaking on Model 30 controllers; read/write is starting to work as a result svn path=/trunk/; revision=8626 --- reactos/drivers/storage/floppy/hardware.c | 3 ++- reactos/drivers/storage/floppy/readwrite.c | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/storage/floppy/hardware.c b/reactos/drivers/storage/floppy/hardware.c index da4d67bad3e..7945158a807 100644 --- a/reactos/drivers/storage/floppy/hardware.c +++ b/reactos/drivers/storage/floppy/hardware.c @@ -885,8 +885,9 @@ NTSTATUS NTAPI HwDiskChanged(PDRIVE_INFO DriveInfo, { if(!(Buffer & DIR_DISKETTE_CHANGE)) { + /* FIXME FIXME FIXME: This is wrong */ KdPrint(("floppy: HdDiskChanged - Model30 - returning TRUE\n")); - *DiskChanged = TRUE; + *DiskChanged = FALSE; } else { diff --git a/reactos/drivers/storage/floppy/readwrite.c b/reactos/drivers/storage/floppy/readwrite.c index dc05b6dc42b..89513078944 100644 --- a/reactos/drivers/storage/floppy/readwrite.c +++ b/reactos/drivers/storage/floppy/readwrite.c @@ -235,7 +235,7 @@ static NTSTATUS NTAPI RWDetermineMediaType(PDRIVE_INFO DriveInfo) return STATUS_UNSUCCESSFUL; /* if we can't even write to the controller, it's hopeless */ } - /* Wait for the recalibrate to finish */ + /* Wait for the ReadID to finish */ WaitForControllerInterrupt(DriveInfo->ControllerInfo); if(HwReadIdResult(DriveInfo->ControllerInfo, NULL, NULL) != STATUS_SUCCESS) @@ -280,6 +280,8 @@ static NTSTATUS NTAPI RWSeekToCylinder(PDRIVE_INFO DriveInfo, PAGED_CODE(); + KdPrint(("floppy: RWSeekToCylinder called drive 0x%x cylinder %d\n", DriveInfo, Cylinder)); + /* Clear any spurious interrupts */ KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); @@ -319,6 +321,8 @@ static NTSTATUS NTAPI RWSeekToCylinder(PDRIVE_INFO DriveInfo, return STATUS_UNSUCCESSFUL; } + KdPrint(("floppy: RWSeekToCylinder: returning successfully, now on cyl %d\n", Cylinder)); + return STATUS_SUCCESS; } From ab9a6623a234d3a1416aca5047cea175d799afa7 Mon Sep 17 00:00:00 2001 From: Vizzini <vizzini@plasmic.com> Date: Wed, 10 Mar 2004 20:17:26 +0000 Subject: [PATCH 0415/1463] Properly set the length of the transfer so FastFat won't assert on us svn path=/trunk/; revision=8627 --- reactos/drivers/storage/floppy/readwrite.c | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/drivers/storage/floppy/readwrite.c b/reactos/drivers/storage/floppy/readwrite.c index 89513078944..499c59f1e86 100644 --- a/reactos/drivers/storage/floppy/readwrite.c +++ b/reactos/drivers/storage/floppy/readwrite.c @@ -708,6 +708,7 @@ VOID NTAPI ReadWritePassive(PDRIVE_INFO DriveInfo, /* That's all folks! */ KdPrint(("floppy: ReadWritePassive(): success; Completing with STATUS_SUCCESS\n")); Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = Length; IoCompleteRequest(Irp, IO_NO_INCREMENT); StopMotor(DriveInfo->ControllerInfo); } From e080b835d034a642ae17318a73753d32c817e9e8 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Wed, 10 Mar 2004 20:26:40 +0000 Subject: [PATCH 0416/1463] - Fixed querying of thread locale. svn path=/trunk/; revision=8628 --- reactos/ntoskrnl/ps/locale.c | 38 ++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/ps/locale.c b/reactos/ntoskrnl/ps/locale.c index 85d291bc3d8..2e356d0db66 100644 --- a/reactos/ntoskrnl/ps/locale.c +++ b/reactos/ntoskrnl/ps/locale.c @@ -1,4 +1,4 @@ -/* $Id: locale.c,v 1.7 2004/02/12 15:55:57 navaraf Exp $ +/* $Id: locale.c,v 1.8 2004/03/10 20:26:40 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -26,7 +26,7 @@ */ LCID PsDefaultThreadLocaleId = 0; LCID PsDefaultSystemLocaleId = 0; - +BOOL PsDefaultThreadLocaleInitialized = FALSE; #define VALUE_BUFFER_SIZE 256 @@ -96,6 +96,33 @@ PiInitDefaultLocale(VOID) } NtClose(KeyHandle); } +} + + +VOID STDCALL +PiInitThreadLocale(VOID) +/* + * FUNCTION: + * Initializes the default thread locale. + * Reads default locale from registry, if available + * ARGUMENTS: + * None. + * Returns: + * None. + */ +{ + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING KeyName; + UNICODE_STRING ValueName; + HANDLE KeyHandle; + ULONG ValueLength; + UCHAR ValueBuffer[VALUE_BUFFER_SIZE]; + PKEY_VALUE_PARTIAL_INFORMATION ValueInfo; + UNICODE_STRING ValueString; + ULONG LocaleValue; + NTSTATUS Status; + + ValueInfo = (PKEY_VALUE_PARTIAL_INFORMATION)ValueBuffer; /* read default thread locale */ RtlRosInitUnicodeStringFromLiteral(&KeyName, @@ -136,6 +163,8 @@ PiInitDefaultLocale(VOID) } NtClose(KeyHandle); } + + PsDefaultThreadLocaleInitialized = TRUE; } @@ -158,6 +187,10 @@ NtQueryDefaultLocale(IN BOOLEAN ThreadOrSystem, if (ThreadOrSystem == TRUE) { + if (PsDefaultThreadLocaleInitialized == FALSE) + { + PiInitThreadLocale(); + } /* set thread locale */ *DefaultLocaleId = PsDefaultThreadLocaleId; } @@ -259,6 +292,7 @@ NtSetDefaultLocale(IN BOOLEAN ThreadOrSystem, /* set thread locale */ DPRINT("Thread locale: %08lu\n", DefaultLocaleId); PsDefaultThreadLocaleId = DefaultLocaleId; + PsDefaultThreadLocaleInitialized = TRUE; } else { From c9c497dc9f2ce25b1bb2bd2240842e32231cd527 Mon Sep 17 00:00:00 2001 From: Andrew Greenwood <silverblade@reactos.org> Date: Wed, 10 Mar 2004 20:36:19 +0000 Subject: [PATCH 0417/1463] - Implemented ChangeMenuA and ChangeMenuW, as implemented in WINE. svn path=/trunk/; revision=8629 --- reactos/lib/user32/windows/menu.c | 58 +++++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 7 deletions(-) diff --git a/reactos/lib/user32/windows/menu.c b/reactos/lib/user32/windows/menu.c index 566c91bdc21..b8c5f8a661c 100644 --- a/reactos/lib/user32/windows/menu.c +++ b/reactos/lib/user32/windows/menu.c @@ -21,7 +21,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: menu.c,v 1.53 2004/03/09 14:03:18 gvg Exp $ +/* $Id: menu.c,v 1.54 2004/03/10 20:36:19 silverblade Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/menu.c @@ -4301,7 +4301,7 @@ MenuWindowProcW( } /* - * @unimplemented + * @implemented */ BOOL STDCALL @@ -4312,12 +4312,34 @@ ChangeMenuW( UINT cmdInsert, UINT flags) { - UNIMPLEMENTED; - return FALSE; + /* + FIXME: Word passes the item id in 'cmd' and 0 or 0xffff as cmdInsert + for MF_DELETE. We should check the parameters for all others + MF_* actions also (anybody got a doc on ChangeMenu?). + */ + + switch(flags & (MF_APPEND | MF_DELETE | MF_CHANGE | MF_REMOVE | MF_INSERT)) + { + case MF_APPEND : + return AppendMenuW(hMenu, flags &~ MF_APPEND, cmdInsert, lpszNewItem); + + case MF_DELETE : + return DeleteMenu(hMenu, cmd, flags &~ MF_DELETE); + + case MF_CHANGE : + return ModifyMenuW(hMenu, cmd, flags &~ MF_CHANGE, cmdInsert, lpszNewItem); + + case MF_REMOVE : + return RemoveMenu(hMenu, flags & MF_BYPOSITION ? cmd : cmdInsert, + flags &~ MF_REMOVE); + + default : /* MF_INSERT */ + return InsertMenuW(hMenu, cmd, flags, cmdInsert, lpszNewItem); + }; } /* - * @unimplemented + * @implemented */ BOOL STDCALL @@ -4328,6 +4350,28 @@ ChangeMenuA( UINT cmdInsert, UINT flags) { - UNIMPLEMENTED; - return FALSE; + /* + FIXME: Word passes the item id in 'cmd' and 0 or 0xffff as cmdInsert + for MF_DELETE. We should check the parameters for all others + MF_* actions also (anybody got a doc on ChangeMenu?). + */ + + switch(flags & (MF_APPEND | MF_DELETE | MF_CHANGE | MF_REMOVE | MF_INSERT)) + { + case MF_APPEND : + return AppendMenuA(hMenu, flags &~ MF_APPEND, cmdInsert, lpszNewItem); + + case MF_DELETE : + return DeleteMenu(hMenu, cmd, flags &~ MF_DELETE); + + case MF_CHANGE : + return ModifyMenuA(hMenu, cmd, flags &~ MF_CHANGE, cmdInsert, lpszNewItem); + + case MF_REMOVE : + return RemoveMenu(hMenu, flags & MF_BYPOSITION ? cmd : cmdInsert, + flags &~ MF_REMOVE); + + default : /* MF_INSERT */ + return InsertMenuA(hMenu, cmd, flags, cmdInsert, lpszNewItem); + }; } From 2b24e33ce7b745cfe97dd8a0c3ddac63cd023d7c Mon Sep 17 00:00:00 2001 From: Aleksey Bragin <aleksey@reactos.org> Date: Wed, 10 Mar 2004 21:34:42 +0000 Subject: [PATCH 0418/1463] LookupAccountSidA and W stubs added (FAR needs them). Hope it is the right place for them. svn path=/trunk/; revision=8630 --- reactos/lib/advapi32/sec/sid.c | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/reactos/lib/advapi32/sec/sid.c b/reactos/lib/advapi32/sec/sid.c index 12353c848c4..652d66379c1 100644 --- a/reactos/lib/advapi32/sec/sid.c +++ b/reactos/lib/advapi32/sec/sid.c @@ -1,4 +1,4 @@ -/* $Id: sid.c,v 1.10 2004/02/25 14:25:11 ekohl Exp $ +/* $Id: sid.c,v 1.11 2004/03/10 21:34:42 fireball Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -6,6 +6,7 @@ * PURPOSE: Security ID functions */ +#include <debug.h> #define NTOS_MODE_USER #include <ntos.h> #include <windows.h> @@ -237,4 +238,35 @@ IsValidSid(PSID pSid) return((BOOL)RtlValidSid(pSid)); } +/****************************************************************************** + * LookupAccountSidA [ADVAPI32.@] + * + * @unimplemented + */ +BOOL STDCALL +LookupAccountSidA(LPCSTR lpSystemName, PSID lpSid, LPSTR lpName, + LPDWORD cchName, LPSTR lpReferencedDomainName, + LPDWORD cchReferencedDomainName, PSID_NAME_USE peUse) + + +{ + DPRINT1("LookupAccountSidA is unimplemented, but returns success\n"); + return TRUE; +} + + +/****************************************************************************** + * LookupAccountSidW [ADVAPI32.@] + * + * @unimplemented + */ +BOOL STDCALL +LookupAccountSidW(LPCWSTR lpSystemName, PSID lpSid, LPWSTR lpName, + LPDWORD cchName, LPWSTR lpReferencedDomainName, + LPDWORD cchReferencedDomainName, PSID_NAME_USE peUse) +{ + DPRINT1("LookupAccountSidW is unimplemented, but returns success\n"); + return TRUE; +} + /* EOF */ From fe0b173e6e13f7db7e64cf4c8c0a08ebaf2630b2 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Wed, 10 Mar 2004 21:37:18 +0000 Subject: [PATCH 0419/1463] - Export the event log functions and LookupAccountSid[AW]. svn path=/trunk/; revision=8631 --- reactos/lib/advapi32/advapi32.edf | 44 +++++++++++++++---------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/reactos/lib/advapi32/advapi32.edf b/reactos/lib/advapi32/advapi32.edf index c03ee9da6d4..b857f922b07 100644 --- a/reactos/lib/advapi32/advapi32.edf +++ b/reactos/lib/advapi32/advapi32.edf @@ -1,4 +1,4 @@ -; $Id: advapi32.edf,v 1.35 2004/03/08 21:58:16 navaraf Exp $ +; $Id: advapi32.edf,v 1.36 2004/03/10 21:37:18 navaraf Exp $ ; ; advapi32.edf ; @@ -21,8 +21,8 @@ AllocateAndInitializeSid=AllocateAndInitializeSid@44 AllocateLocallyUniqueId=AllocateLocallyUniqueId@4 AreAllAccessesGranted=AreAllAccessesGranted@8 AreAnyAccessesGranted=AreAnyAccessesGranted@8 -;BackupEventLogA=BackupEventLogA@8 -;BackupEventLogW=BackupEventLogW@8 +BackupEventLogA=BackupEventLogA@8 +BackupEventLogW=BackupEventLogW@8 ;BuildAccessRequestA ;BuildAccessRequestW ;BuildExplicitAccessWithNameA=BuildExplicitAccessWithNameA@20 @@ -39,9 +39,9 @@ AreAnyAccessesGranted=AreAnyAccessesGranted@8 ;BuildTrusteeWithSidW=BuildTrusteeWithSidW@8 ChangeServiceConfigA=ChangeServiceConfigA@44 ChangeServiceConfigW=ChangeServiceConfigW@44 -;ClearEventLogA=ClearEventLogA@8 -;ClearEventLogW=ClearEventLogW@8 -;CloseEventLog=CloseEventLog@4 +ClearEventLogA=ClearEventLogA@8 +ClearEventLogW=ClearEventLogW@8 +CloseEventLog=CloseEventLog@4 CloseServiceHandle=CloseServiceHandle@4 ControlService=ControlService@12 CopySid=CopySid@12 @@ -82,7 +82,7 @@ DeleteAce=DeleteAce@8 DeleteService=DeleteService@4 ;DenyAccessRightsA ;DenyAccessRightsW -;DeregisterEventSource=DeregisterEventSource@4 +DeregisterEventSource=DeregisterEventSource@4 ;DestroyPrivateObjectSecurity=DestroyPrivateObjectSecurity@4 DuplicateToken=DuplicateToken@12 DuplicateTokenEx=DuplicateTokenEx@24 @@ -142,8 +142,8 @@ GetLengthSid=GetLengthSid@4 ;GetMultipleTrusteeW=GetMultipleTrusteeW@4 ;GetNamedSecurityInfoA=GetNamedSecurityInfoA@32 ;GetNamedSecurityInfoW=GetNamedSecurityInfoW@32 -;GetNumberOfEventLogRecords=GetNumberOfEventLogRecords@8 -;GetOldestEventLogRecord=GetOldestEventLogRecord@8 +GetNumberOfEventLogRecords=GetNumberOfEventLogRecords@8 +GetOldestEventLogRecord=GetOldestEventLogRecord@8 ;GetPrivateObjectSecurity=GetPrivateObjectSecurity@20 GetSecurityDescriptorControl=GetSecurityDescriptorControl@12 GetSecurityDescriptorDacl=GetSecurityDescriptorDacl@16 @@ -191,8 +191,8 @@ LogonUserA=LogonUserA@24 LogonUserW=LogonUserW@24 ;LookupAccountNameA=LookupAccountNameA@28 ;LookupAccountNameW=LookupAccountNameW@28 -;LookupAccountSidA=LookupAccountSidA@28 -;LookupAccountSidW=LookupAccountSidW@28 +LookupAccountSidA=LookupAccountSidA@28 +LookupAccountSidW=LookupAccountSidW@28 LookupPrivilegeDisplayNameA=LookupPrivilegeDisplayNameA@20 LookupPrivilegeDisplayNameW=LookupPrivilegeDisplayNameW@20 LookupPrivilegeNameA=LookupPrivilegeNameA@16 @@ -253,7 +253,7 @@ MakeSelfRelativeSD=MakeSelfRelativeSD@12 MapGenericMask=MapGenericMask@8 ;NTAccessMaskToProvAccessRights=NTAccessMaskToProvAccessRights@12 ;NotifyBootConfigStatus=NotifyBootConfigStatus@4 -;NotifyChangeEventLog=NotifyChangeEventLog@8 +NotifyChangeEventLog=NotifyChangeEventLog@8 ObjectCloseAuditAlarmA=ObjectCloseAuditAlarmA@12 ObjectCloseAuditAlarmW=ObjectCloseAuditAlarmW@12 ObjectDeleteAuditAlarmA=ObjectDeleteAuditAlarmA@12 @@ -262,10 +262,10 @@ ObjectOpenAuditAlarmA=ObjectOpenAuditAlarmA@48 ObjectOpenAuditAlarmW=ObjectOpenAuditAlarmW@48 ObjectPrivilegeAuditAlarmA=ObjectPrivilegeAuditAlarmA@24 ObjectPrivilegeAuditAlarmW=ObjectPrivilegeAuditAlarmW@24 -;OpenBackupEventLogA=OpenBackupEventLogA@8 -;OpenBackupEventLogW=OpenBackupEventLogW@8 -;OpenEventLogA=OpenEventLogA@8 -;OpenEventLogW=OpenEventLogW@8 +OpenBackupEventLogA=OpenBackupEventLogA@8 +OpenBackupEventLogW=OpenBackupEventLogW@8 +OpenEventLogA=OpenEventLogA@8 +OpenEventLogW=OpenEventLogW@8 OpenProcessToken=OpenProcessToken@12 OpenSCManagerA=OpenSCManagerA@12 OpenSCManagerW=OpenSCManagerW@12 @@ -284,8 +284,8 @@ QueryServiceObjectSecurity=QueryServiceObjectSecurity@20 QueryServiceStatus=QueryServiceStatus@8 QueryServiceStatusEx=QueryServiceStatusEx@20 ;QueryWindows31FilesMigration=QueryWindows31FilesMigration@4 -;ReadEventLogA=ReadEventLogA@28 -;ReadEventLogW=ReadEventLogW@28 +ReadEventLogA=ReadEventLogA@28 +ReadEventLogW=ReadEventLogW@28 RegCloseKey=RegCloseKey@4 RegConnectRegistryA=RegConnectRegistryA@12 RegConnectRegistryW=RegConnectRegistryW@12 @@ -333,14 +333,14 @@ RegSetValueExW=RegSetValueExW@24 RegSetValueW=RegSetValueW@20 RegUnLoadKeyA=RegUnLoadKeyA@8 RegUnLoadKeyW=RegUnLoadKeyW@8 -;RegisterEventSourceA=RegisterEventSourceA@8 -;RegisterEventSourceW=RegisterEventSourceW@8 +RegisterEventSourceA=RegisterEventSourceA@8 +RegisterEventSourceW=RegisterEventSourceW@8 RegisterServiceCtrlHandlerA=RegisterServiceCtrlHandlerA@8 RegisterServiceCtrlHandlerW=RegisterServiceCtrlHandlerW@8 ;ReplaceAllAccessRightsA ;ReplaceAllAccessRightsW -;ReportEventA=ReportEventA@36 -;ReportEventW=ReportEventW@36 +ReportEventA=ReportEventA@36 +ReportEventW=ReportEventW@36 RevertToSelf=RevertToSelf@0 ;RevokeExplicitAccessRightsA=RevokeExplicitAccessRightsA@16 ;RevokeExplicitAccessRightsW=RevokeExplicitAccessRightsW@16 From cf417193218b5ec63488e528e169d70fb8e18bd5 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Wed, 10 Mar 2004 21:56:04 +0000 Subject: [PATCH 0420/1463] - Include eventlog.c in the build. svn path=/trunk/; revision=8632 --- reactos/lib/advapi32/makefile | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/reactos/lib/advapi32/makefile b/reactos/lib/advapi32/makefile index 98762ebaece..eabcfe6330a 100644 --- a/reactos/lib/advapi32/makefile +++ b/reactos/lib/advapi32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.37 2004/03/08 18:09:05 sedwards Exp $ +# $Id: makefile,v 1.38 2004/03/10 21:56:04 navaraf Exp $ PATH_TO_TOP = ../.. @@ -11,7 +11,7 @@ TARGET_CFLAGS = -Wall -Werror -fno-builtin TARGET_LFLAGS = -nostartfiles -nostdlib -TARGET_SDKLIBS = ntdll.a kernel32.a +TARGET_SDKLIBS = ntdll.a kernel32.a libwine.a msvcrt.a TARGET_BASE = 0x77DB0000 @@ -36,7 +36,8 @@ SECURITY_OBJECTS = \ SERVICE_OBJECTS = \ service/scm.o \ service/sctrl.o \ - service/undoc.o + service/undoc.o \ + service/eventlog.o TOKEN_OBJECTS = \ token/privilege.o \ From 15989c99be44f1c9b3a423137b3fcafc71393860 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Wed, 10 Mar 2004 23:21:56 +0000 Subject: [PATCH 0421/1463] - Support for SS_REALSIZEIMAGE and SS_CENTERIMAGE flags for bitmap static controls. svn path=/trunk/; revision=8633 --- reactos/lib/user32/controls/static.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/reactos/lib/user32/controls/static.c b/reactos/lib/user32/controls/static.c index 04ed30e2026..c2ab665d987 100644 --- a/reactos/lib/user32/controls/static.c +++ b/reactos/lib/user32/controls/static.c @@ -1,4 +1,4 @@ -/* $Id: static.c,v 1.11 2004/02/01 15:52:02 gvg Exp $ +/* $Id: static.c,v 1.12 2004/03/10 23:21:56 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS User32 @@ -126,6 +126,7 @@ static HICON STATIC_SetIcon( HWND hwnd, HICON hicon, DWORD style ) static HBITMAP STATIC_SetBitmap( HWND hwnd, HBITMAP hBitmap, DWORD style ) { HBITMAP hOldBitmap; + LONG full_style = GetWindowLongA( hwnd, GWL_STYLE ); if ((style & SS_TYPEMASK) != SS_BITMAP) return 0; if (hBitmap && GetObjectType(hBitmap) != OBJ_BITMAP) { @@ -133,7 +134,7 @@ static HBITMAP STATIC_SetBitmap( HWND hwnd, HBITMAP hBitmap, DWORD style ) return 0; } hOldBitmap = (HBITMAP)SetWindowLongA( hwnd, HICON_GWL_OFFSET, (LONG)hBitmap ); - if (hBitmap) + if (hBitmap && !(full_style & SS_REALSIZEIMAGE)) { BITMAP bm; GetObjectW(hBitmap, sizeof(bm), &bm); @@ -598,6 +599,7 @@ static void STATIC_PaintBitmapfn(HWND hwnd, HDC hdc, DWORD style ) HBRUSH hbrush; HDC hMemDC; HBITMAP hBitmap, oldbitmap; + LONG full_style = GetWindowLongA( hwnd, GWL_STYLE ); GetClientRect( hwnd, &rc ); hbrush = (HBRUSH)SendMessageW( GetParent(hwnd), WM_CTLCOLORSTATIC, @@ -612,8 +614,17 @@ static void STATIC_PaintBitmapfn(HWND hwnd, HDC hdc, DWORD style ) if (!(hMemDC = CreateCompatibleDC( hdc ))) return; GetObjectW(hBitmap, sizeof(bm), &bm); oldbitmap = SelectObject(hMemDC, hBitmap); - BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, - SRCCOPY); + if (full_style & SS_CENTERIMAGE) + { + BitBlt(hdc, (rc.right - bm.bmWidth) >> 1, + (rc.bottom - bm.bmHeight) >> 1, + bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY); + } + else + { + BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, + SRCCOPY); + } SelectObject(hMemDC, oldbitmap); DeleteDC(hMemDC); } From 64c32ff6f4a7677dafcb003f9c2119c270d6ead6 Mon Sep 17 00:00:00 2001 From: James Tabor <james.tabor@reactos.org> Date: Thu, 11 Mar 2004 00:05:00 +0000 Subject: [PATCH 0422/1463] Turn off debug print out svn path=/trunk/; revision=8634 --- reactos/drivers/video/videoprt/videoprt.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index 72c80d79534..0cd3cb0cd4b 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.18 2004/03/10 16:10:13 navaraf Exp $ + * $Id: videoprt.c,v 1.19 2004/03/11 00:05:00 jimtabor Exp $ */ #include "videoprt.h" @@ -428,7 +428,7 @@ VideoPortGetVgaStatus(IN PVOID HwDeviceExtension, { PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - DPRINT1("VideoPortGetVgaStatus = %S \n", VgaStatus); + DPRINT("VideoPortGetVgaStatus = %x \n", VgaStatus); DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, VIDEO_PORT_DEVICE_EXTENSION, @@ -436,14 +436,14 @@ VideoPortGetVgaStatus(IN PVOID HwDeviceExtension, if(KeGetCurrentIrql() == PASSIVE_LEVEL) { - DPRINT1("VideoPortGetVgaStatus1 = %S \n", VgaStatus); + DPRINT("VideoPortGetVgaStatus1 = %x \n", VgaStatus); if ( PCIBus == DeviceExtension->AdapterInterfaceType) { /* VgaStatus 0 == VGA not enabled, 1 == VGA enabled. */ - DPRINT1("VideoPortGetVgaStatus2 = %S \n", VgaStatus); + DPRINT("VideoPortGetVgaStatus2 = %x \n", VgaStatus); /* Assumed for now */ @@ -452,7 +452,7 @@ VideoPortGetVgaStatus(IN PVOID HwDeviceExtension, return STATUS_SUCCESS; } } - DPRINT1("VideoPortGetVgaStatus3 = %S \n", VgaStatus); + DPRINT("VideoPortGetVgaStatus3 = %x \n", VgaStatus); return ERROR_INVALID_FUNCTION; } From d5044130a8a4836ed21fc040789a20a22c66b87d Mon Sep 17 00:00:00 2001 From: Andrew Greenwood <silverblade@reactos.org> Date: Thu, 11 Mar 2004 02:09:14 +0000 Subject: [PATCH 0423/1463] - Updated the version number in README.TXT to 0.2.x (maybe I'm just being pedantic...) svn path=/trunk/; revision=8635 --- reactos/bootdata/readme.txt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/reactos/bootdata/readme.txt b/reactos/bootdata/readme.txt index e291be860c2..c1d9a6428d1 100644 --- a/reactos/bootdata/readme.txt +++ b/reactos/bootdata/readme.txt @@ -1,6 +1,6 @@ ======================== -ReactOS Version 0.1.x -Updated March 27th, 2003 +ReactOS Version 0.2.x +Updated March 11th, 2004 ======================== 1. What is ReactOS? @@ -51,5 +51,4 @@ ReactOS - among other topics. Contributors to the project are always welcome. 6. Author --------- -This document was written by Jason Filby (jasonfilby@yahoo.com). - +This document was written by Jason Filby (jasonfilby@yahoo.com). \ No newline at end of file From 6ef65a387280d2a08369786e3236e8cbfc93cab6 Mon Sep 17 00:00:00 2001 From: Vizzini <vizzini@plasmic.com> Date: Thu, 11 Mar 2004 06:24:44 +0000 Subject: [PATCH 0424/1463] - Implement support for split DMA transfers - Remove assert from CreateClose handler (still doesn't seem to get called consistently though) - Fixed an off-by-one bug for sector calculation --> Medium-sized files transfer to/from disk now svn path=/trunk/; revision=8636 --- reactos/drivers/storage/floppy/floppy.c | 2 -- reactos/drivers/storage/floppy/readwrite.c | 42 +++++++++++++++++++--- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/reactos/drivers/storage/floppy/floppy.c b/reactos/drivers/storage/floppy/floppy.c index 5153b0eda09..644c18f4e88 100644 --- a/reactos/drivers/storage/floppy/floppy.c +++ b/reactos/drivers/storage/floppy/floppy.c @@ -205,8 +205,6 @@ static NTSTATUS NTAPI CreateClose(PDEVICE_OBJECT DeviceObject, { KdPrint(("floppy: CreateClose called\n")); - ASSERT(0); - Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = FILE_OPENED; diff --git a/reactos/drivers/storage/floppy/readwrite.c b/reactos/drivers/storage/floppy/readwrite.c index 499c59f1e86..863341f54f6 100644 --- a/reactos/drivers/storage/floppy/readwrite.c +++ b/reactos/drivers/storage/floppy/readwrite.c @@ -496,22 +496,26 @@ VOID NTAPI ReadWritePassive(PDRIVE_INFO DriveInfo, /* Set up parameters for read or write */ if(Stack->MajorFunction == IRP_MJ_READ) { + /* if(Stack->Parameters.Read.Length > PAGE_SIZE * DriveInfo->ControllerInfo->MapRegisters) { KdPrint(("floppy: ReadWritePassive(): unable to transfer; would have to split\n")); ASSERT(0); } + */ Length = Stack->Parameters.Read.Length; DiskByteOffset = Stack->Parameters.Read.ByteOffset.u.LowPart; WriteToDevice = FALSE; } else { + /* if(Stack->Parameters.Write.Length > PAGE_SIZE * DriveInfo->ControllerInfo->MapRegisters) { KdPrint(("floppy: ReadWritePassive(): unable to transfer; would have to split\n")); ASSERT(0); } + */ Length = Stack->Parameters.Write.Length; DiskByteOffset = Stack->Parameters.Write.ByteOffset.u.LowPart; WriteToDevice = TRUE; @@ -579,9 +583,10 @@ VOID NTAPI ReadWritePassive(PDRIVE_INFO DriveInfo, */ /* Get map registers for DMA */ + /* FIXME: Just request all of our map regiters for now */ KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); Status = IoAllocateAdapterChannel(DriveInfo->ControllerInfo->AdapterObject, DeviceObject, - DriveInfo->ControllerInfo->MapRegisters, MapRegisterCallback, DriveInfo->ControllerInfo); + DriveInfo->ControllerInfo->MapRegisters, MapRegisterCallback, DriveInfo->ControllerInfo); KeLowerIrql(OldIrql); if(Status != STATUS_SUCCESS) @@ -592,13 +597,13 @@ VOID NTAPI ReadWritePassive(PDRIVE_INFO DriveInfo, return ; } + /* * Read from (or write to) the device * * This has to be called in a loop, as you can only transfer data to/from a single track at * a time. */ - TransferByteOffset = 0; while(TransferByteOffset < Length) { @@ -607,7 +612,10 @@ VOID NTAPI ReadWritePassive(PDRIVE_INFO DriveInfo, UCHAR StartSector; ULONG CurrentTransferBytes; UCHAR CurrentTransferSectors; - + + KdPrint(("floppy: ReadWritePassive(): iterating in while (TransferByteOffset = 0x%x of 0x%x total) - allocating %d registers\n", + TransferByteOffset, Length, DriveInfo->ControllerInfo->MapRegisters)); + KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); /* @@ -643,13 +651,37 @@ VOID NTAPI ReadWritePassive(PDRIVE_INFO DriveInfo, * We can only ask for a transfer up to the end of the track. Then we have to re-seek and do more. * TODO: Support the MT bit */ - if( (DriveInfo->DiskGeometry.SectorsPerTrack - StartSector) < Length / DriveInfo->DiskGeometry.BytesPerSector) - CurrentTransferSectors = (UCHAR)DriveInfo->DiskGeometry.SectorsPerTrack - StartSector; + KdPrint(("floppy: ReadWritePassive(): computing number of sectors to transfer (StartSector 0x%x): ", StartSector)); + + /* 1-based sector number */ + if( (DriveInfo->DiskGeometry.SectorsPerTrack - StartSector + 1) < Length / DriveInfo->DiskGeometry.BytesPerSector) + CurrentTransferSectors = (UCHAR)DriveInfo->DiskGeometry.SectorsPerTrack - StartSector + 1; else CurrentTransferSectors = (UCHAR)(Length / DriveInfo->DiskGeometry.BytesPerSector); + KdPrint(("0x%x\n", CurrentTransferSectors)); + CurrentTransferBytes = CurrentTransferSectors * DriveInfo->DiskGeometry.BytesPerSector; + /* + * Adjust to map registers + * BUG: Does this take into account page crossings? + */ + KdPrint(("floppy: ReadWritePassive(): Trying to transfer 0x%x bytes\n", CurrentTransferBytes)); + + ASSERT(CurrentTransferBytes); + + if(BYTES_TO_PAGES(CurrentTransferBytes) > DriveInfo->ControllerInfo->MapRegisters) + { + CurrentTransferSectors = (UCHAR)((DriveInfo->ControllerInfo->MapRegisters * PAGE_SIZE) / + DriveInfo->DiskGeometry.BytesPerSector); + + CurrentTransferBytes = CurrentTransferSectors * DriveInfo->DiskGeometry.BytesPerSector; + + KdPrint(("floppy: ReadWritePassive: limiting transfer to 0x%x bytes (0x%x sectors) due to map registers\n", + CurrentTransferBytes, CurrentTransferSectors)); + } + /* set up this round's dma operation */ /* param 2 is ReadOperation --> opposite of WriteToDevice that IoMapTransfer takes. BAD MS. */ KeFlushIoBuffers(Irp->MdlAddress, !WriteToDevice, TRUE); From 8438bc1293424c6a704c886e693b9a38bba232c1 Mon Sep 17 00:00:00 2001 From: Vizzini <vizzini@plasmic.com> Date: Thu, 11 Mar 2004 06:48:22 +0000 Subject: [PATCH 0425/1463] fixed CHS computation bug svn path=/trunk/; revision=8637 --- reactos/drivers/storage/floppy/readwrite.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/reactos/drivers/storage/floppy/readwrite.c b/reactos/drivers/storage/floppy/readwrite.c index 863341f54f6..bc5a851dd4b 100644 --- a/reactos/drivers/storage/floppy/readwrite.c +++ b/reactos/drivers/storage/floppy/readwrite.c @@ -48,7 +48,6 @@ * TODO: Handle split reads and writes across multiple map registers * TODO: Break up ReadWritePassive and handle errors better * TODO: Figure out data rate issues - * TODO: I think RWComputeCHS is bugified * TODO: Media type detection * TODO: Figure out perf issue - waiting after call to read/write for about a second each time * TODO: Figure out specify timings @@ -346,7 +345,7 @@ static NTSTATUS NTAPI RWComputeCHS(PDRIVE_INFO IN DriveInfo, * NOTES: * - Lots of ugly typecasts here * - Sectors are 1-based! - * - FIXME: I think this routine is still bugified a bit + * - This is really crummy code. Please FIXME. */ { ULONG AbsoluteSector; @@ -356,13 +355,15 @@ static NTSTATUS NTAPI RWComputeCHS(PDRIVE_INFO IN DriveInfo, /* First calculate the 1-based "absolute sector" based on the byte offset */ ASSERT(!(DiskByteOffset % DriveInfo->DiskGeometry.BytesPerSector)); /* FIXME: Only handle full sector transfers atm */ + + /* AbsoluteSector is zero-based to make the math a little easier */ AbsoluteSector = DiskByteOffset / DriveInfo->DiskGeometry.BytesPerSector; /* Num full sectors */ /* Cylinder number is floor(AbsoluteSector / SectorsPerCylinder) */ *Cylinder = (CHAR)(AbsoluteSector / SectorsPerCylinder); - /* Head number is 1 if the sector within the cylinder > SectorsPerTrack; 0 otherwise */ - *Head = AbsoluteSector % SectorsPerCylinder > DriveInfo->DiskGeometry.SectorsPerTrack ? 1 : 0; + /* Head number is 0 if the sector within the cylinder < SectorsPerTrack; 1 otherwise */ + *Head = AbsoluteSector % SectorsPerCylinder < DriveInfo->DiskGeometry.SectorsPerTrack ? 0 : 1; /* * Sector number is the sector within the cylinder if on head 0; that minus SectorsPerTrack if it's on head 1 @@ -372,6 +373,11 @@ static NTSTATUS NTAPI RWComputeCHS(PDRIVE_INFO IN DriveInfo, KdPrint(("floppy: RWComputeCHS: offset 0x%x is c:0x%x h:0x%x s:0x%x\n", DiskByteOffset, *Cylinder, *Head, *Sector)); + /* Sanity checking */ + ASSERT(*Cylinder <= DriveInfo->DiskGeometry.Cylinders.QuadPart); + ASSERT(*Head <= DriveInfo->DiskGeometry.TracksPerCylinder); + ASSERT(*Sector <= DriveInfo->DiskGeometry.SectorsPerTrack); + return STATUS_SUCCESS; } From 8e37499a908f9bda5163ad016f11365dd6c25c29 Mon Sep 17 00:00:00 2001 From: Vizzini <vizzini@plasmic.com> Date: Thu, 11 Mar 2004 07:01:58 +0000 Subject: [PATCH 0426/1463] Fixed a length calculation bug introduced with transfer-splitting code --> big file transfers work now svn path=/trunk/; revision=8638 --- reactos/drivers/storage/floppy/readwrite.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/storage/floppy/readwrite.c b/reactos/drivers/storage/floppy/readwrite.c index bc5a851dd4b..13efa2afa06 100644 --- a/reactos/drivers/storage/floppy/readwrite.c +++ b/reactos/drivers/storage/floppy/readwrite.c @@ -660,10 +660,15 @@ VOID NTAPI ReadWritePassive(PDRIVE_INFO DriveInfo, KdPrint(("floppy: ReadWritePassive(): computing number of sectors to transfer (StartSector 0x%x): ", StartSector)); /* 1-based sector number */ - if( (DriveInfo->DiskGeometry.SectorsPerTrack - StartSector + 1) < Length / DriveInfo->DiskGeometry.BytesPerSector) + if( (DriveInfo->DiskGeometry.SectorsPerTrack - StartSector + 1) < + (Length - TransferByteOffset) / DriveInfo->DiskGeometry.BytesPerSector) + { CurrentTransferSectors = (UCHAR)DriveInfo->DiskGeometry.SectorsPerTrack - StartSector + 1; + } else - CurrentTransferSectors = (UCHAR)(Length / DriveInfo->DiskGeometry.BytesPerSector); + { + CurrentTransferSectors = (UCHAR)((Length - TransferByteOffset) / DriveInfo->DiskGeometry.BytesPerSector); + } KdPrint(("0x%x\n", CurrentTransferSectors)); From 6477510568218ecc212fe5b89479b9713595e2af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Thu, 11 Mar 2004 11:13:28 +0000 Subject: [PATCH 0427/1463] Sync to Wine-20040309: Robert Shearman <R.J.Shearman@warwick.ac.uk> - Implement the drag list control. - Fix tabs in LBItemFromPt. - Move string functions to separate file. - Implement string functions in comctl32. - Use CompareString in shlwapi wherever possible instead of ugly helpers. - Forward some wrapper functions since we don't care about compatibility with Win98 in this case. - Documentation update. - Update common control function documentation. - Don't allocate space for text when nMaxTextRows = 0. - Support custom check background. - Reduce number of parameters needed for DrawString function. - Fix some traces. - The TBM_GET*HOTLIST functions take imagelist ID in wParam. - Implement TBM_GETSTRING{A,W}. - Implement undocumented 0x462 message. Alexandre Julliard - Removed a couple of unneeded helper functions. Maxime BellengT <maxime.bellenge@laposte.net> - Fix a regression in ImageList_Create when creating a dibsection. Ulrich Czekalla <ulrich@codeweavers.com> - Use dibsections for the images. Dimitrie O. Paun <dpaun@rogers.com> - LVN_BEGINRDRAG is implemented now. Fix typo. Aric Stewart <aric@codeweavers.com> - Implemented LISTVIEW_ApproximateViewRect for LVS_REPORT. Fabian Cenedese <Cenedese@indel.ch> - ListView should behave in OWNERDRAW as in FULLROWSELECT. This allows to select cells not in the first column in REPORT mode with OWNERDRAW style set. Matt Chapman <matthewc@cse.unsw.edu.au> - Fix a reentrancy issue in the property sheet implementation by not caching a pointer that can change. - REBAR_Layout should respect the minimum size of bands even when RBBS_FIXEDSIZE is not set. - REBAR_ShowBand needs to force layout of the rebar after a band is hidden/unhidden. Vitaliy Margolen <wine-patch@kievinfo.com> - Adjust all dimensions to match native. - Invalidate whole tab area when multi-line. - In vertical tab placement go from top to bottom. - Fix annoying visual artifacts. Huw Davies <huw@codeweavers.com> - If TBSTYLE_EX_HIDECLIPPEDBUTTONS is set then invalidate the area that changes in a resize. - Don't call SWP unless we're actually adjusting anything. Christian Costa <titan.costa@wanadoo.fr> - Accept null module instance, Loadstring can handle it. Steve Lustbader <slustbader@verizon.net> - Handle the firstVisible item being NULL in Mike Hearn <mike@theoretic.com> - Grow the treeview control expander button by 1px in each direction to match the native look. svn path=/trunk/; revision=8639 --- reactos/include/wine/commctrl.h | 1 + reactos/lib/comctl32/Makefile.in | 2 + reactos/lib/comctl32/comctl32.h | 5 +- reactos/lib/comctl32/comctl32.spec | 34 +- reactos/lib/comctl32/comctl32undoc.c | 437 ++++--------- reactos/lib/comctl32/commctrl.c | 54 +- reactos/lib/comctl32/draglist.c | 305 +++++++-- reactos/lib/comctl32/flatsb.c | 48 +- reactos/lib/comctl32/imagelist.c | 155 +++-- reactos/lib/comctl32/listview.c | 28 +- reactos/lib/comctl32/propsheet.c | 36 +- reactos/lib/comctl32/rebar.c | 6 +- reactos/lib/comctl32/rsrc.rc | 27 + reactos/lib/comctl32/smoothscroll.c | 10 +- reactos/lib/comctl32/string.c | 853 ++++++++++++++++++++++++++ reactos/lib/comctl32/tab.c | 391 ++++++------ reactos/lib/comctl32/toolbar.c | 182 +++++- reactos/lib/comctl32/tooltips.c | 18 +- reactos/lib/comctl32/treeview.c | 6 +- reactos/lib/comctl32/winehq2ros.patch | 104 ++++ reactos/w32api/include/commctrl.h | 4 + 21 files changed, 2009 insertions(+), 697 deletions(-) create mode 100644 reactos/lib/comctl32/string.c diff --git a/reactos/include/wine/commctrl.h b/reactos/include/wine/commctrl.h index 4182c5d70ee..b8ae4a76a0f 100644 --- a/reactos/include/wine/commctrl.h +++ b/reactos/include/wine/commctrl.h @@ -47,6 +47,7 @@ typedef LPFINDINFOW LPLVFINDINFOW; #define TB_UNKWN45D (WM_USER+93) #define TB_UNKWN45E (WM_USER+94) #define TB_UNKWN460 (WM_USER+96) +#define TB_UNKWN462 (WM_USER+98) #define TB_UNKWN463 (WM_USER+99) #define TB_UNKWN464 (WM_USER+100) diff --git a/reactos/lib/comctl32/Makefile.in b/reactos/lib/comctl32/Makefile.in index 32a3b9c14ea..3a60a3b2557 100644 --- a/reactos/lib/comctl32/Makefile.in +++ b/reactos/lib/comctl32/Makefile.in @@ -28,6 +28,7 @@ C_SRCS = \ propsheet.c \ rebar.c \ smoothscroll.c \ + string.c \ status.c \ tab.c \ toolbar.c \ @@ -45,6 +46,7 @@ RC_BINARIES = \ idb_std_small.bmp \ idb_view_large.bmp \ idb_view_small.bmp \ + idc_copy.cur \ idc_divider.cur \ idc_divideropen.cur \ idi_dragarrow.ico \ diff --git a/reactos/lib/comctl32/comctl32.h b/reactos/lib/comctl32/comctl32.h index a9a12ce19a5..a5f2f280aaf 100644 --- a/reactos/lib/comctl32/comctl32.h +++ b/reactos/lib/comctl32/comctl32.h @@ -102,8 +102,9 @@ extern HBRUSH COMCTL32_hPattern55AABrush; #define IDC_DIVIDEROPEN 107 -/* DragList icon */ -#define IDI_DRAGARROW 150 +/* DragList resources */ +#define IDI_DRAGARROW 501 +#define IDC_COPY 502 /* HOTKEY internal strings */ diff --git a/reactos/lib/comctl32/comctl32.spec b/reactos/lib/comctl32/comctl32.spec index 75f3877b762..2348dbec56b 100644 --- a/reactos/lib/comctl32/comctl32.spec +++ b/reactos/lib/comctl32/comctl32.spec @@ -77,16 +77,16 @@ 363 stdcall -noname StrStrIW(wstr wstr) 364 stdcall -noname StrSpnW(wstr wstr) 365 stdcall -noname StrToIntW(wstr) -366 stub -noname StrChrIA -367 stub -noname StrChrIW -368 stub -noname StrRChrIA -369 stub -noname StrRChrIW -372 stub -noname StrRStrIA -373 stub -noname StrRStrIW -374 stub -noname StrCSpnIA -375 stub -noname StrCSpnIW -376 stub -noname IntlStrEqWorkerA -377 stub -noname IntlStrEqWorkerW +366 stdcall -noname StrChrIA(str long) +367 stdcall -noname StrChrIW(wstr long) +368 stdcall -noname StrRChrIA(str str long) +369 stdcall -noname StrRChrIW(wstr wstr long) +372 stdcall -noname StrRStrIA(str str str) +373 stdcall -noname StrRStrIW(wstr wstr wstr) +374 stdcall -noname StrCSpnIA(str str) +375 stdcall -noname StrCSpnIW(wstr wstr) +376 stdcall -noname IntlStrEqWorkerA(long str str long) +377 stdcall -noname IntlStrEqWorkerW(long wstr wstr long) 382 stdcall -noname SmoothScrollWindow(ptr) 383 stub -noname DoReaderMode 384 stub -noname SetPathWordBreakProc @@ -106,13 +106,13 @@ 412 stdcall RemoveWindowSubclass(long ptr long) 413 stdcall DefSubclassProc(long long long long) 414 stub -noname MirrorIcon -415 stdcall -noname DrawTextWrap(long long long long long) -416 stub -noname DrawTextExPrivWrap -417 stdcall -noname ExtTextOutWrap(long long long long ptr wstr long ptr) -418 stub -noname GetCharWidthWrap -419 stdcall -noname GetTextExtentPointWrap(long long long long) -420 stub -noname GetTextExtentPoint32Wrap -421 stub -noname TextOutWrap +415 stdcall DrawTextWrap(long wstr long ptr long) user32.DrawTextW +416 stdcall DrawTextExPrivWrap(long wstr long ptr long ptr) user32.DrawTextExW +417 stdcall ExtTextOutWrap(long long long long ptr wstr long ptr) gdi32.ExtTextOutW +418 stdcall GetCharWidthWrap(long long long long) gdi32.GetCharWidthW +419 stdcall GetTextExtentPointWrap(long wstr long ptr) gdi32.GetTextExtentPointW +420 stdcall GetTextExtentPoint32Wrap(long wstr long ptr) gdi32.GetTextExtentPoint32W +421 stdcall TextOutWrap(long long long wstr long) gdi32.TextOutW # Functions imported by name diff --git a/reactos/lib/comctl32/comctl32undoc.c b/reactos/lib/comctl32/comctl32undoc.c index 1a966566711..fabc4d59032 100644 --- a/reactos/lib/comctl32/comctl32undoc.c +++ b/reactos/lib/comctl32/comctl32undoc.c @@ -25,16 +25,12 @@ * These functions are used by EXPLORER.EXE, IEXPLORE.EXE and * COMCTL32.DLL (internally). * - * TODO - * - Add more functions. - * - Write some documentation. */ #include "config.h" #include "wine/port.h" #include <stdarg.h> #include <string.h> -#include <stdlib.h> /* atoi */ #include <ctype.h> #include <limits.h> @@ -101,6 +97,10 @@ typedef HRESULT (CALLBACK *DPALOADPROC)(LPLOADDATA,IStream*,LPARAM); * pStream [I] pointer to a stream * lParam [I] application specific value * + * RETURNS + * Success: TRUE + * Failure: FALSE + * * NOTES * No more information available yet! */ @@ -196,6 +196,10 @@ DPA_LoadStream (HDPA *phDpa, DPALOADPROC loadProc, IStream *pStream, LPARAM lPar * pStream [I] pointer to a stream * lParam [I] application specific value * + * RETURNS + * Success: TRUE + * Failure: FALSE + * * NOTES * No more information available yet! */ @@ -222,6 +226,10 @@ DPA_SaveStream (const HDPA hDpa, DPALOADPROC loadProc, IStream *pStream, LPARAM * pfnMerge [I] pointer to merge function * lParam [I] application specific value * + * RETURNS + * Success: TRUE + * Failure: FALSE + * * NOTES * No more information available yet! */ @@ -505,8 +513,9 @@ typedef struct tagWINEMRULIST #define WMRUF_CHANGED 0x0001 /* MRU list has changed */ /************************************************************************** - * MRU_SaveChanged - Localize MRU saving code + * MRU_SaveChanged (internal) * + * Localize MRU saving code */ VOID MRU_SaveChanged( LPWINEMRULIST mp ) { @@ -570,11 +579,16 @@ VOID MRU_SaveChanged( LPWINEMRULIST mp ) /************************************************************************** * FreeMRUList [COMCTL32.152] * + * Frees a most-recently-used items list. + * * PARAMS * hMRUList [I] Handle to list. * + * RETURNS + * Success: TRUE + * Failure: FALSE */ -DWORD WINAPI +BOOL WINAPI FreeMRUList (HANDLE hMRUList) { LPWINEMRULIST mp = (LPWINEMRULIST)hMRUList; @@ -764,6 +778,8 @@ AddMRUStringW(HANDLE hList, LPCWSTR lpszString) /************************************************************************** * AddMRUStringA [COMCTL32.153] + * + * See AddMRUStringW. */ INT WINAPI AddMRUStringA(HANDLE hList, LPCSTR lpszString) @@ -794,6 +810,8 @@ DelMRUString(HANDLE hList, INT nItemPos) /************************************************************************** * FindMRUStringW [COMCTL32.402] + * + * See FindMRUStringA. */ INT WINAPI FindMRUStringW (HANDLE hList, LPCWSTR lpszString, LPINT lpRegNum) @@ -831,7 +849,7 @@ FindMRUStringA (HANDLE hList, LPCSTR lpszString, LPINT lpRegNum) } /************************************************************************* - * CreateMRUListLazy_common + * CreateMRUListLazy_common (internal) */ HANDLE CreateMRUListLazy_common(LPWINEMRULIST mp) { @@ -915,6 +933,8 @@ HANDLE CreateMRUListLazy_common(LPWINEMRULIST mp) /************************************************************************** * CreateMRUListLazyW [COMCTL32.404] + * + * See CreateMRUListLazyA. */ HANDLE WINAPI CreateMRUListLazyW (LPCREATEMRULISTW lpcml, DWORD dwParam2, DWORD dwParam3, DWORD dwParam4) @@ -938,6 +958,17 @@ CreateMRUListLazyW (LPCREATEMRULISTW lpcml, DWORD dwParam2, DWORD dwParam3, DWOR /************************************************************************** * CreateMRUListLazyA [COMCTL32.157] + * + * Creates a most-recently-used list. + * + * PARAMS + * lpcml [I] ptr to CREATEMRULIST structure. + * dwParam2 [I] Unknown + * dwParam3 [I] Unknown + * dwParam4 [I] Unknown + * + * RETURNS + * Handle to MRU list. */ HANDLE WINAPI CreateMRUListLazyA (LPCREATEMRULISTA lpcml, DWORD dwParam2, DWORD dwParam3, DWORD dwParam4) @@ -964,11 +995,7 @@ CreateMRUListLazyA (LPCREATEMRULISTA lpcml, DWORD dwParam2, DWORD dwParam3, DWOR /************************************************************************** * CreateMRUListW [COMCTL32.400] * - * PARAMS - * lpcml [I] ptr to CREATEMRULIST structure. - * - * RETURNS - * Handle to MRU list. + * See CreateMRUListA. */ HANDLE WINAPI CreateMRUListW (LPCREATEMRULISTW lpcml) @@ -978,6 +1005,14 @@ CreateMRUListW (LPCREATEMRULISTW lpcml) /************************************************************************** * CreateMRUListA [COMCTL32.151] + * + * Creates a most-recently-used list. + * + * PARAMS + * lpcml [I] ptr to CREATEMRULIST structure. + * + * RETURNS + * Handle to MRU list. */ HANDLE WINAPI CreateMRUListA (LPCREATEMRULISTA lpcml) @@ -989,7 +1024,7 @@ CreateMRUListA (LPCREATEMRULISTA lpcml) /************************************************************************** * EnumMRUListW [COMCTL32.403] * - * Enumerate item in a list + * Enumerate item in a most-recenty-used list * * PARAMS * hList [I] list handle @@ -1027,6 +1062,7 @@ DWORD nBufferSize) /************************************************************************** * EnumMRUListA [COMCTL32.154] * + * See EnumMRUListW. */ INT WINAPI EnumMRUListA(HANDLE hList, INT nItemPos, LPVOID lpBuffer, DWORD nBufferSize) @@ -1061,12 +1097,15 @@ DWORD nBufferSize) /************************************************************************** * Str_GetPtrA [COMCTL32.233] * + * Copies a string into a destination buffer. + * * PARAMS - * lpSrc [I] - * lpDest [O] - * nMaxLen [I] + * lpSrc [I] Source string + * lpDest [O] Destination buffer + * nMaxLen [I] Size of buffer in characters * * RETURNS + * The number of characters copied. */ INT WINAPI @@ -1101,11 +1140,19 @@ Str_GetPtrA (LPCSTR lpSrc, LPSTR lpDest, INT nMaxLen) /************************************************************************** * Str_SetPtrA [COMCTL32.234] * + * Makes a copy of a string, allocating memory if necessary. + * * PARAMS - * lppDest [O] - * lpSrc [I] + * lppDest [O] Pointer to destination string + * lpSrc [I] Source string * * RETURNS + * Success: TRUE + * Failure: FALSE + * + * NOTES + * Set lpSrc to NULL to free the memory allocated by a previous call + * to this function. */ BOOL WINAPI @@ -1134,12 +1181,7 @@ Str_SetPtrA (LPSTR *lppDest, LPCSTR lpSrc) /************************************************************************** * Str_GetPtrW [COMCTL32.235] * - * PARAMS - * lpSrc [I] - * lpDest [O] - * nMaxLen [I] - * - * RETURNS + * See Str_GetPtrA. */ INT WINAPI @@ -1174,11 +1216,7 @@ Str_GetPtrW (LPCWSTR lpSrc, LPWSTR lpDest, INT nMaxLen) /************************************************************************** * Str_SetPtrW [COMCTL32.236] * - * PARAMS - * lpDest [O] - * lpSrc [I] - * - * RETURNS + * See Str_SetPtrA. */ BOOL WINAPI @@ -1292,13 +1330,9 @@ Str_SetPtrAtoW (LPWSTR *lppDest, LPCSTR lpSrc) /************************************************************************** - * The DSA-API is a set of functions to create and manipulate arrays of - * fixed-size memory blocks. These arrays can store any kind of data - * (strings, icons...). - */ - -/************************************************************************** - * DSA_Create [COMCTL32.320] Creates a dynamic storage array + * DSA_Create [COMCTL32.320] + * + * Creates a dynamic storage array * * PARAMS * nSize [I] size of the array elements @@ -1307,6 +1341,11 @@ Str_SetPtrAtoW (LPWSTR *lppDest, LPCSTR lpSrc) * RETURNS * Success: pointer to an array control structure. Use this like a handle. * Failure: NULL + * + * NOTES + * The DSA_ functions can be used to create and manipulate arrays of + * fixed-size memory blocks. These arrays can store any kind of data + * (e.g. strings and icons). */ HDSA WINAPI @@ -1331,7 +1370,9 @@ DSA_Create (INT nSize, INT nGrow) /************************************************************************** - * DSA_Destroy [COMCTL32.321] Destroys a dynamic storage array + * DSA_Destroy [COMCTL32.321] + * + * Destroys a dynamic storage array * * PARAMS * hdsa [I] pointer to the array control structure @@ -1359,6 +1400,8 @@ DSA_Destroy (const HDSA hdsa) /************************************************************************** * DSA_GetItem [COMCTL32.322] * + * Copies the specified item into a caller-supplied buffer. + * * PARAMS * hdsa [I] pointer to the array control structure * nIndex [I] number of the Item to get @@ -1483,6 +1526,8 @@ DSA_SetItem (const HDSA hdsa, INT nIndex, LPVOID pSrc) /************************************************************************** * DSA_InsertItem [COMCTL32.324] * + * Inserts an item into the array at the specified index. + * * PARAMS * hdsa [I] pointer to the array control structure * nIndex [I] index for the new item @@ -1545,6 +1590,8 @@ DSA_InsertItem (const HDSA hdsa, INT nIndex, LPVOID pSrc) /************************************************************************** * DSA_DeleteItem [COMCTL32.326] * + * Deletes the specified item from the array. + * * PARAMS * hdsa [I] pointer to the array control structure * nIndex [I] index for the element to delete @@ -1627,12 +1674,9 @@ DSA_DeleteAllItems (const HDSA hdsa) /************************************************************************** - * The DPA-API is a set of functions to create and manipulate arrays of - * pointers. - */ - -/************************************************************************** - * DPA_Destroy [COMCTL32.329] Destroys a dynamic pointer array + * DPA_Destroy [COMCTL32.329] + * + * Destroys a dynamic pointer array * * PARAMS * hdpa [I] handle (pointer) to the pointer array @@ -2180,6 +2224,10 @@ DPA_Search (const HDPA hdpa, LPVOID pFind, INT nStart, * RETURNS * Success: handle (pointer) to the pointer array. * Failure: NULL + * + * NOTES + * The DPA_ functions can be used to create and manipulate arrays of + * pointers. */ HDPA WINAPI @@ -2209,7 +2257,9 @@ DPA_CreateEx (INT nGrow, HANDLE hHeap) /************************************************************************** - * DPA_Create [COMCTL32.328] Creates a dynamic pointer array + * DPA_Create [COMCTL32.328] + * + * Creates a dynamic pointer array. * * PARAMS * nGrow [I] number of items by which the array grows when it is filled @@ -2217,6 +2267,10 @@ DPA_CreateEx (INT nGrow, HANDLE hHeap) * RETURNS * Success: handle (pointer) to the pointer array. * Failure: NULL + * + * NOTES + * The DPA_ functions can be used to create and manipulate arrays of + * pointers. */ HDPA WINAPI @@ -2281,15 +2335,22 @@ DoNotify (LPNOTIFYDATA lpNotify, UINT uCode, LPNMHDR lpHdr) /************************************************************************** * SendNotify [COMCTL32.341] * + * Sends a WM_NOTIFY message to the specified window. + * * PARAMS - * hwndTo [I] - * hwndFrom [I] - * uCode [I] - * lpHdr [I] + * hwndTo [I] Window to receive the message + * hwndFrom [I] Window that the message is from (see notes) + * uCode [I] Notification code + * lpHdr [I] The NMHDR and any additional information to send or NULL * * RETURNS * Success: return value from notification * Failure: 0 + * + * NOTES + * If hwndFrom is -1 then the identifier of the control sending the + * message is taken from the NMHDR structure. + * If hwndFrom is not -1 then lpHdr can be NULL. */ LRESULT WINAPI SendNotify (HWND hwndTo, HWND hwndFrom, UINT uCode, LPNMHDR lpHdr) @@ -2311,16 +2372,23 @@ LRESULT WINAPI SendNotify (HWND hwndTo, HWND hwndFrom, UINT uCode, LPNMHDR lpHdr /************************************************************************** * SendNotifyEx [COMCTL32.342] * + * Sends a WM_NOTIFY message to the specified window. + * * PARAMS - * hwndFrom [I] - * hwndTo [I] - * uCode [I] - * lpHdr [I] - * dwParam5 [I] + * hwndFrom [I] Window to receive the message + * hwndTo [I] Window that the message is from + * uCode [I] Notification code + * lpHdr [I] The NMHDR and any additional information to send or NULL + * dwParam5 [I] Unknown * * RETURNS * Success: return value from notification * Failure: 0 + * + * NOTES + * If hwndFrom is -1 then the identifier of the control sending the + * message is taken from the NMHDR structure. + * If hwndFrom is not -1 then lpHdr can be NULL. */ LRESULT WINAPI SendNotifyEx (HWND hwndTo, HWND hwndFrom, UINT uCode, @@ -2350,96 +2418,6 @@ LRESULT WINAPI SendNotifyEx (HWND hwndTo, HWND hwndFrom, UINT uCode, } -/************************************************************************** - * StrChrA [COMCTL32.350] - * - */ - -LPSTR WINAPI StrChrA (LPCSTR lpString, CHAR cChar) -{ - return strchr (lpString, cChar); -} - - -/************************************************************************** - * StrStrIA [COMCTL32.355] - */ - -LPSTR WINAPI StrStrIA (LPCSTR lpStr1, LPCSTR lpStr2) -{ - INT len1, len2, i; - CHAR first; - - if (*lpStr2 == 0) - return ((LPSTR)lpStr1); - len1 = 0; - while (lpStr1[len1] != 0) ++len1; - len2 = 0; - while (lpStr2[len2] != 0) ++len2; - if (len2 == 0) - return ((LPSTR)(lpStr1 + len1)); - first = tolower (*lpStr2); - while (len1 >= len2) { - if (tolower(*lpStr1) == first) { - for (i = 1; i < len2; ++i) - if (tolower (lpStr1[i]) != tolower(lpStr2[i])) - break; - if (i >= len2) - return ((LPSTR)lpStr1); - } - ++lpStr1; --len1; - } - return (NULL); -} - -/************************************************************************** - * StrToIntA [COMCTL32.357] Converts a string to a signed integer. - */ - -INT WINAPI StrToIntA (LPSTR lpString) -{ - return atoi(lpString); -} - -/************************************************************************** - * StrStrIW [COMCTL32.363] - */ - -LPWSTR WINAPI StrStrIW (LPCWSTR lpStr1, LPCWSTR lpStr2) -{ - INT len1, len2, i; - WCHAR first; - - if (*lpStr2 == 0) - return ((LPWSTR)lpStr1); - len1 = 0; - while (lpStr1[len1] != 0) ++len1; - len2 = 0; - while (lpStr2[len2] != 0) ++len2; - if (len2 == 0) - return ((LPWSTR)(lpStr1 + len1)); - first = tolowerW (*lpStr2); - while (len1 >= len2) { - if (tolowerW (*lpStr1) == first) { - for (i = 1; i < len2; ++i) - if (tolowerW (lpStr1[i]) != tolowerW(lpStr2[i])) - break; - if (i >= len2) - return ((LPWSTR)lpStr1); - } - ++lpStr1; --len1; - } - return (NULL); -} - -/************************************************************************** - * StrToIntW [COMCTL32.365] Converts a wide char string to a signed integer. - */ - -INT WINAPI StrToIntW (LPWSTR lpString) -{ - return atoiW(lpString); -} /************************************************************************** @@ -2559,176 +2537,3 @@ DSA_DestroyCallback (HDSA hdsa, PFNDSAENUMCALLBACK enumProc, LPVOID lParam) DSA_EnumCallback (hdsa, enumProc, lParam); DSA_Destroy (hdsa); } - -/************************************************************************** - * StrCSpnA [COMCTL32.356] - * - */ -INT WINAPI StrCSpnA( LPCSTR lpStr, LPCSTR lpSet) -{ - return strcspn(lpStr, lpSet); -} - -/************************************************************************** - * StrChrW [COMCTL32.358] - * - */ -LPWSTR WINAPI StrChrW( LPCWSTR lpStart, WORD wMatch) -{ - return strchrW(lpStart, wMatch); -} - -/************************************************************************** - * StrCmpNA [COMCTL32.352] - * - */ -INT WINAPI StrCmpNA( LPCSTR lpStr1, LPCSTR lpStr2, int nChar) -{ - return strncmp(lpStr1, lpStr2, nChar); -} - -/************************************************************************** - * StrCmpNIA [COMCTL32.353] - * - */ -INT WINAPI StrCmpNIA( LPCSTR lpStr1, LPCSTR lpStr2, int nChar) -{ - return strncasecmp(lpStr1, lpStr2, nChar); -} - -/************************************************************************** - * StrCmpNW [COMCTL32.360] - * - */ -INT WINAPI StrCmpNW( LPCWSTR lpStr1, LPCWSTR lpStr2, int nChar) -{ - return strncmpW(lpStr1, lpStr2, nChar); -} - -/************************************************************************** - * StrCmpNIW [COMCTL32.361] - * - */ -INT WINAPI StrCmpNIW( LPCWSTR lpStr1, LPCWSTR lpStr2, int nChar) -{ - FIXME("(%s, %s, %i): stub\n", debugstr_w(lpStr1), debugstr_w(lpStr2), nChar); - return 0; -} - -/************************************************************************** - * StrRChrA [COMCTL32.351] - * - */ -LPSTR WINAPI StrRChrA( LPCSTR lpStart, LPCSTR lpEnd, WORD wMatch ) -{ - LPCSTR lpGotIt = NULL; - BOOL dbcs = IsDBCSLeadByte( LOBYTE(wMatch) ); - - TRACE("(%p, %p, %x)\n", lpStart, lpEnd, wMatch); - - if (!lpEnd) lpEnd = lpStart + strlen(lpStart); - - for(; lpStart < lpEnd; lpStart = CharNextA(lpStart)) - { - if (*lpStart != LOBYTE(wMatch)) continue; - if (dbcs && lpStart[1] != HIBYTE(wMatch)) continue; - lpGotIt = lpStart; - } - return (LPSTR)lpGotIt; -} - - -/************************************************************************** - * StrRChrW [COMCTL32.359] - * - */ -LPWSTR WINAPI StrRChrW( LPCWSTR lpStart, LPCWSTR lpEnd, WORD wMatch) -{ - LPCWSTR lpGotIt = NULL; - - TRACE("(%p, %p, %x)\n", lpStart, lpEnd, wMatch); - if (!lpEnd) lpEnd = lpStart + strlenW(lpStart); - - for(; lpStart < lpEnd; lpStart = CharNextW(lpStart)) - if (*lpStart == wMatch) lpGotIt = lpStart; - - return (LPWSTR)lpGotIt; -} - - -/************************************************************************** - * StrStrA [COMCTL32.354] - * - */ -LPSTR WINAPI StrStrA( LPCSTR lpFirst, LPCSTR lpSrch) -{ - return strstr(lpFirst, lpSrch); -} - -/************************************************************************** - * StrStrW [COMCTL32.362] - * - */ -LPWSTR WINAPI StrStrW( LPCWSTR lpFirst, LPCWSTR lpSrch) -{ - return strstrW(lpFirst, lpSrch); -} - -/************************************************************************** - * StrSpnW [COMCTL32.364] - * - */ -INT WINAPI StrSpnW( LPWSTR lpStr, LPWSTR lpSet) -{ - LPWSTR lpLoop = lpStr; - - /* validate ptr */ - if ((lpStr == 0) || (lpSet == 0)) return 0; - -/* while(*lpLoop) { if lpLoop++; } */ - - for(; (*lpLoop != 0); lpLoop++) - if( strchrW(lpSet, *(WORD*)lpLoop)) - return (INT)(lpLoop-lpStr); - - return (INT)(lpLoop-lpStr); -} - -/************************************************************************** - * @ [COMCTL32.415] - * - * FIXME: What's this supposed to do? - * Parameter 1 is an HWND, you're on your own for the rest. - */ - -BOOL WINAPI DrawTextWrap( HWND hwnd, DWORD b, DWORD c, DWORD d, DWORD e) -{ - - FIXME("(%p, %lx, %lx, %lx, %lx): stub!\n", hwnd, b, c, d, e); - - return TRUE; -} - -/************************************************************************** - * @ [COMCTL32.417] - * - */ -BOOL WINAPI ExtTextOutWrap(HDC hdc, INT x, INT y, UINT flags, const RECT *lprect, - LPCWSTR str, UINT count, const INT *lpDx) -{ - return ExtTextOutW(hdc, x, y, flags, lprect, str, count, lpDx); -} - -/************************************************************************** - * @ [COMCTL32.419] - * - * FIXME: What's this supposed to do? - */ - -BOOL WINAPI GetTextExtentPointWrap( DWORD a, DWORD b, DWORD c, DWORD d) -{ - - FIXME("(%lx, %lx, %lx, %lx): stub!\n", a, b, c, d); - - return TRUE; -} diff --git a/reactos/lib/comctl32/commctrl.c b/reactos/lib/comctl32/commctrl.c index a4e20417ee7..0d66491ce2b 100644 --- a/reactos/lib/comctl32/commctrl.c +++ b/reactos/lib/comctl32/commctrl.c @@ -131,7 +131,9 @@ static const WORD wPattern55AA[] = /*********************************************************************** - * DllMain [Internal] Initializes the internal 'COMCTL32.DLL'. + * DllMain [Internal] + * + * Initializes the internal 'COMCTL32.DLL'. * * PARAMS * hinstDLL [I] handle to the 'dlls' instance @@ -223,6 +225,9 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) /*********************************************************************** * MenuHelp [COMCTL32.2] * + * Handles the setting of status bar help messages when the user + * selects menu items. + * * PARAMS * uMsg [I] message (WM_MENUSELECT) (see NOTES) * wParam [I] wParam of the message uMsg @@ -378,6 +383,8 @@ ShowHideMenuCtl (HWND hwnd, UINT uFlags, LPINT lpInfo) /*********************************************************************** * GetEffectiveClientRect [COMCTL32.4] * + * Calculates the coordinates of a rectangle in the client area. + * * PARAMS * hwnd [I] handle to the client window. * lpRect [O] pointer to the rectangle of the client window @@ -536,7 +543,9 @@ CreateStatusWindowA (LONG style, LPCSTR text, HWND parent, UINT wid) /*********************************************************************** - * CreateStatusWindowW [COMCTL32.@] Creates a status bar control + * CreateStatusWindowW [COMCTL32.@] + * + * Creates a status bar control * * PARAMS * style [I] window style @@ -560,7 +569,9 @@ CreateStatusWindowW (LONG style, LPCWSTR text, HWND parent, UINT wid) /*********************************************************************** - * CreateUpDownControl [COMCTL32.16] Creates an up-down control + * CreateUpDownControl [COMCTL32.16] + * + * Creates an up-down control * * PARAMS * style [I] window styles @@ -711,7 +722,9 @@ InitCommonControlsEx (LPINITCOMMONCONTROLSEX lpInitCtrls) /*********************************************************************** - * CreateToolbarEx [COMCTL32.@] Creates a tool bar window + * CreateToolbarEx [COMCTL32.@] + * + * Creates a toolbar window. * * PARAMS * hwnd @@ -794,12 +807,14 @@ CreateToolbarEx (HWND hwnd, DWORD style, UINT wID, INT nBitmaps, /*********************************************************************** * CreateMappedBitmap [COMCTL32.8] * + * Loads a bitmap resource using a colour map. + * * PARAMS - * hInstance [I] - * idBitmap [I] - * wFlags [I] - * lpColorMap [I] - * iNumMaps [I] + * hInstance [I] Handle to the module containing the bitmap. + * idBitmap [I] The bitmap resource ID. + * wFlags [I] CMB_MASKED for using bitmap as a mask or 0 for normal. + * lpColorMap [I] Colour information needed for the bitmap or NULL (uses system colours). + * iNumMaps [I] Number of COLORMAP's pointed to by lpColorMap. * * RETURNS * Success: handle to the new bitmap @@ -900,7 +915,9 @@ CreateMappedBitmap (HINSTANCE hInstance, INT idBitmap, UINT wFlags, /*********************************************************************** - * CreateToolbar [COMCTL32.7] Creates a tool bar control + * CreateToolbar [COMCTL32.7] + * + * Creates a toolbar control. * * PARAMS * hwnd @@ -969,6 +986,12 @@ COMCTL32_DllGetVersion (DLLVERSIONINFO *pdvi) /*********************************************************************** * DllInstall (COMCTL32.@) + * + * Installs the ComCtl32 DLL. + * + * RETURNS + * Success: S_OK + * Failure: A HRESULT error */ HRESULT WINAPI COMCTL32_DllInstall(BOOL bInstall, LPCWSTR cmdline) { @@ -1011,9 +1034,10 @@ _TrackMouseEvent (TRACKMOUSEEVENT *ptme) /************************************************************************* * GetMUILanguage [COMCTL32.@] * - * FIXME: "Returns the language currently in use by the common controls - * for a particular process." (MSDN) + * Returns the user interface language in use by the current process. * + * RETURNS + * Language ID in use by the current process. */ LANGID WINAPI GetMUILanguage (VOID) { @@ -1024,11 +1048,11 @@ LANGID WINAPI GetMUILanguage (VOID) /************************************************************************* * InitMUILanguage [COMCTL32.@] * - * FIXME: "Enables an application to specify a language to be used with - * the common controls that is different than the system language." (MSDN) + * Sets the user interface language to be used by the current process. * + * RETURNS + * Nothing. */ - VOID WINAPI InitMUILanguage (LANGID uiLang) { COMCTL32_uiLang = uiLang; diff --git a/reactos/lib/comctl32/draglist.c b/reactos/lib/comctl32/draglist.c index cb896f4a938..939a27798c5 100644 --- a/reactos/lib/comctl32/draglist.c +++ b/reactos/lib/comctl32/draglist.c @@ -2,6 +2,7 @@ * Drag List control * * Copyright 1999 Eric Kohl + * Copyright 2004 Robert Shearman * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -17,13 +18,6 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * NOTES - * This is just a dummy control. An author is needed! Any volunteers? - * I will only improve this control once in a while. - * Eric <ekohl@abo.rhein-zeitung.de> - * - * TODO: - * - Everything. */ #include <stdarg.h> @@ -33,37 +27,265 @@ #include "wingdi.h" #include "winuser.h" #include "winnls.h" +#include "winnt.h" #include "commctrl.h" +#include "comctl32.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(commctrl); +#ifndef TEXT +# define TEXT(string) string +#endif +#define DRAGLIST_SUBCLASSID 0 +#define DRAGLIST_SCROLLPERIOD 200 +#define DRAGLIST_TIMERID 666 + +/* properties relating to IDI_DRAGICON */ +#define DRAGICON_HOTSPOT_X 17 +#define DRAGICON_HOTSPOT_Y 7 +#define DRAGICON_HEIGHT 32 + +/* internal Wine specific data for the drag list control */ +typedef struct _DRAGLISTDATA +{ + /* are we currently in dragging mode? */ + BOOL dragging; + + /* cursor to use as determined by DL_DRAGGING notification. + * NOTE: as we use LoadCursor we don't have to use DeleteCursor + * when we are finished with it */ + HCURSOR cursor; + + /* optimisation so that we don't have to load the cursor + * all of the time whilst dragging */ + LRESULT last_dragging_response; + /* prevents flicker with drawing drag arrow */ + RECT last_drag_icon_rect; +} DRAGLISTDATA; + +static UINT uDragListMessage = 0; /* registered window message code */ static DWORD dwLastScrollTime = 0; +static HICON hDragArrow = NULL; + +/*********************************************************************** + * DragList_Notify (internal) + * + * Sends notification messages to the parent control. Note that it + * does not use WM_NOTIFY like the rest of the controls, but a registered + * window message. + */ +static LRESULT DragList_Notify(HWND hwndLB, UINT uNotification) +{ + DRAGLISTINFO dli; + dli.hWnd = hwndLB; + dli.uNotification = uNotification; + GetCursorPos(&dli.ptCursor); + return SendMessageW(GetParent(hwndLB), uDragListMessage, GetDlgCtrlID(hwndLB), (LPARAM)&dli); +} + +/* cleans up after dragging */ +static inline void DragList_EndDrag(HWND hwnd, DRAGLISTDATA * data) +{ + KillTimer(hwnd, DRAGLIST_TIMERID); + ReleaseCapture(); + data->dragging = FALSE; + /* clear any drag insert icon present */ + InvalidateRect(GetParent(hwnd), &data->last_drag_icon_rect, TRUE); +} + +/*********************************************************************** + * DragList_SubclassWindowProc (internal) + * + * Handles certain messages to enable dragging for the ListBox and forwards + * the rest to the ListBox. + */ +static LRESULT CALLBACK +DragList_SubclassWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData) +{ + DRAGLISTDATA * data = (DRAGLISTDATA*)dwRefData; + switch (uMsg) + { + case WM_LBUTTONDOWN: + SetFocus(hwnd); + data->cursor = NULL; + SetRectEmpty(&data->last_drag_icon_rect); + data->dragging = DragList_Notify(hwnd, DL_BEGINDRAG); + if (data->dragging) + { + SetCapture(hwnd); + SetTimer(hwnd, DRAGLIST_TIMERID, DRAGLIST_SCROLLPERIOD, NULL); + } + /* note that we don't absorb this message to let the list box + * do its thing (normally selecting an item) */ + break; + + case WM_KEYDOWN: + case WM_RBUTTONDOWN: + /* user cancelled drag by either right clicking or + * by pressing the escape key */ + if ((data->dragging) && + ((uMsg == WM_RBUTTONDOWN) || (wParam == VK_ESCAPE))) + { + /* clean up and absorb message */ + DragList_EndDrag(hwnd, data); + DragList_Notify(hwnd, DL_CANCELDRAG); + return 0; + } + break; + + case WM_MOUSEMOVE: + case WM_TIMER: + if (data->dragging) + { + LRESULT cursor = DragList_Notify(hwnd, DL_DRAGGING); + /* optimisation so that we don't have to load the cursor + * all of the time whilst dragging */ + if (data->last_dragging_response != cursor) + { + switch (cursor) + { + case DL_STOPCURSOR: + data->cursor = LoadCursorW(NULL, (LPCWSTR)IDC_NO); + SetCursor(data->cursor); + break; + case DL_COPYCURSOR: + data->cursor = LoadCursorW(COMCTL32_hModule, (LPCWSTR)IDC_COPY); + SetCursor(data->cursor); + break; + case DL_MOVECURSOR: + data->cursor = LoadCursorW(NULL, (LPCWSTR)IDC_ARROW); + SetCursor(data->cursor); + break; + } + data->last_dragging_response = cursor; + } + /* don't pass this message on to List Box */ + return 0; + } + break; + + case WM_LBUTTONUP: + if (data->dragging) + { + DragList_EndDrag(hwnd, data); + DragList_Notify(hwnd, DL_DROPPED); + } + break; + + case WM_SETCURSOR: + /* if app has told us to set a cursor then do so */ + if (data->dragging && data->cursor) + { + SetCursor(data->cursor); + return TRUE; + } + break; + + case WM_GETDLGCODE: + /* tell dialog boxes that we want to receive WM_KEYDOWN events + * for keys like VK_ESCAPE */ + if (data->dragging) + return DLGC_WANTALLKEYS; + break; + case WM_NCDESTROY: + RemoveWindowSubclass(hwnd, DragList_SubclassWindowProc, DRAGLIST_SUBCLASSID); + Free(data); + break; + } + return DefSubclassProc(hwnd, uMsg, wParam, lParam); +} /*********************************************************************** * MakeDragList (COMCTL32.13) + * + * Makes a normal ListBox into a DragList by subclassing it. + * + * RETURNS + * Success: Non-zero + * Failure: Zero */ BOOL WINAPI MakeDragList (HWND hwndLB) { - FIXME("(%p)\n", hwndLB); + DRAGLISTDATA * data = Alloc(sizeof(DRAGLISTDATA)); + TRACE("(%p)\n", hwndLB); - return FALSE; + if (!uDragListMessage) + uDragListMessage = RegisterWindowMessageA(DRAGLISTMSGSTRING); + + return SetWindowSubclass(hwndLB, DragList_SubclassWindowProc, DRAGLIST_SUBCLASSID, (DWORD_PTR)data); } /*********************************************************************** * DrawInsert (COMCTL32.15) + * + * Draws insert arrow by the side of the ListBox item in the parent window. + * + * RETURNS + * Nothing. */ VOID WINAPI DrawInsert (HWND hwndParent, HWND hwndLB, INT nItem) { - FIXME("(%p %p %d)\n", hwndParent, hwndLB, nItem); + RECT rcItem, rcListBox, rcDragIcon; + HDC hdc; + DRAGLISTDATA * data; + TRACE("(%p %p %d)\n", hwndParent, hwndLB, nItem); + if (!hDragArrow) + hDragArrow = LoadIconW(COMCTL32_hModule, (LPCWSTR)IDI_DRAGARROW); + + if (LB_ERR == SendMessageW(hwndLB, LB_GETITEMRECT, nItem, (LPARAM)&rcItem)) + return; + + if (!GetWindowRect(hwndLB, &rcListBox)) + return; + + /* convert item rect to parent co-ordinates */ + if (!MapWindowPoints(hwndLB, hwndParent, (LPPOINT)&rcItem, 2)) + return; + + /* convert list box rect to parent co-ordinates */ + if (!MapWindowPoints(HWND_DESKTOP, hwndParent, (LPPOINT)&rcListBox, 2)) + return; + + rcDragIcon.left = rcListBox.left - DRAGICON_HOTSPOT_X; + rcDragIcon.top = rcItem.top - DRAGICON_HOTSPOT_Y; + rcDragIcon.right = rcListBox.left; + rcDragIcon.bottom = rcDragIcon.top + DRAGICON_HEIGHT; + + if (!GetWindowSubclass(hwndLB, DragList_SubclassWindowProc, DRAGLIST_SUBCLASSID, (DWORD_PTR*)&data)) + return; + + /* prevent flicker by only redrawing when necessary */ + if (!EqualRect(&rcDragIcon, &data->last_drag_icon_rect)) + { + /* get rid of any previous inserts drawn */ + RedrawWindow(hwndParent, &data->last_drag_icon_rect, NULL, + RDW_INTERNALPAINT | RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW); + + if (nItem >= 0) + { + hdc = GetDC(hwndParent); + + DrawIcon(hdc, rcDragIcon.left, rcDragIcon.top, hDragArrow); + + ReleaseDC(hwndParent, hdc); + } + } + CopyRect(&data->last_drag_icon_rect, &rcDragIcon); } /*********************************************************************** * LBItemFromPt (COMCTL32.14) + * + * Gets the index of the ListBox item under the specified point, + * scrolling if bAutoScroll is TRUE and pt is outside of the ListBox. + * + * RETURNS + * The ListBox item ID if pt is over a list item or -1 otherwise. */ INT WINAPI LBItemFromPt (HWND hwndLB, POINT pt, BOOL bAutoScroll) { @@ -71,8 +293,8 @@ INT WINAPI LBItemFromPt (HWND hwndLB, POINT pt, BOOL bAutoScroll) INT nIndex; DWORD dwScrollTime; - FIXME("(%p %ld x %ld %s)\n", - hwndLB, pt.x, pt.y, bAutoScroll ? "TRUE" : "FALSE"); + TRACE("(%p %ld x %ld %s)\n", + hwndLB, pt.x, pt.y, bAutoScroll ? "TRUE" : "FALSE"); ScreenToClient (hwndLB, &pt); GetClientRect (hwndLB, &rcClient); @@ -80,54 +302,41 @@ INT WINAPI LBItemFromPt (HWND hwndLB, POINT pt, BOOL bAutoScroll) if (PtInRect (&rcClient, pt)) { - /* point is inside -- get the item index */ - while (TRUE) - { - if (SendMessageA (hwndLB, LB_GETITEMRECT, nIndex, (LPARAM)&rcClient) == LB_ERR) - return -1; + /* point is inside -- get the item index */ + while (TRUE) + { + if (SendMessageA (hwndLB, LB_GETITEMRECT, nIndex, (LPARAM)&rcClient) == LB_ERR) + return -1; - if (PtInRect (&rcClient, pt)) - return nIndex; + if (PtInRect (&rcClient, pt)) + return nIndex; - nIndex++; - } + nIndex++; + } } else { - /* point is outside */ - if (!bAutoScroll) - return -1; + /* point is outside */ + if (!bAutoScroll) + return -1; - if ((pt.x > rcClient.right) || (pt.x < rcClient.left)) - return -1; + if ((pt.x > rcClient.right) || (pt.x < rcClient.left)) + return -1; - if (pt.y < 0) - nIndex--; - else - nIndex++; + if (pt.y < 0) + nIndex--; + else + nIndex++; - dwScrollTime = GetTickCount (); + dwScrollTime = GetTickCount (); - if ((dwScrollTime - dwLastScrollTime) < 200) - return -1; + if ((dwScrollTime - dwLastScrollTime) < DRAGLIST_SCROLLPERIOD) + return -1; - dwLastScrollTime = dwScrollTime; + dwLastScrollTime = dwScrollTime; - SendMessageA (hwndLB, LB_SETTOPINDEX, (WPARAM)nIndex, 0); + SendMessageA (hwndLB, LB_SETTOPINDEX, (WPARAM)nIndex, 0); } return -1; } - - -#if 0 -static LRESULT CALLBACK -DRAGLIST_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - - return FALSE; -} -#endif - - - diff --git a/reactos/lib/comctl32/flatsb.c b/reactos/lib/comctl32/flatsb.c index b13618fd2dc..0c69a326bbe 100644 --- a/reactos/lib/comctl32/flatsb.c +++ b/reactos/lib/comctl32/flatsb.c @@ -53,8 +53,15 @@ typedef struct /*********************************************************************** * InitializeFlatSB (COMCTL32.@) * - * returns nonzero if successful, zero otherwise + * Initializes flat scroll bars for the specified window. * + * RETURNS + * Success: Non-zero + * Failure: Zero + * + * NOTES + * Subclasses specified window so that flat scroll bars may be drawn + * and used. */ BOOL WINAPI InitializeFlatSB(HWND hwnd) { @@ -65,11 +72,16 @@ BOOL WINAPI InitializeFlatSB(HWND hwnd) /*********************************************************************** * UninitializeFlatSB (COMCTL32.@) * - * returns: + * Uninitializes flat scroll bars for the specified window. + * + * RETURNS * E_FAIL if one of the scroll bars is currently in use - * S_FALSE if InitializeFlatSB was never called on this hwnd + * S_FALSE if InitializeFlatSB() was never called on this hwnd * S_OK otherwise * + * NOTES + * Removes any subclassing on the specified window so that regular + * scroll bars are drawn and used. */ HRESULT WINAPI UninitializeFlatSB(HWND hwnd) { @@ -80,10 +92,12 @@ HRESULT WINAPI UninitializeFlatSB(HWND hwnd) /*********************************************************************** * FlatSB_GetScrollProp (COMCTL32.@) * - * Returns nonzero if successful, or zero otherwise. If index is WSB_PROP_HSTYLE, - * the return is nonzero if InitializeFlatSB has been called for this window, or - * zero otherwise. + * Retrieves flat-scroll-bar-specific properties for the specified window. * + * RETURNS + * nonzero if successful, or zero otherwise. If index is WSB_PROP_HSTYLE, + * the return is nonzero if InitializeFlatSB has been called for this window, or + * zero otherwise. */ BOOL WINAPI FlatSB_GetScrollProp(HWND hwnd, INT propIndex, LPINT prop) @@ -94,6 +108,12 @@ FlatSB_GetScrollProp(HWND hwnd, INT propIndex, LPINT prop) /*********************************************************************** * FlatSB_SetScrollProp (COMCTL32.@) + * + * Sets flat-scroll-bar-specific properties for the specified window. + * + * RETURNS + * Success: Non-zero + * Failure: Zero */ BOOL WINAPI FlatSB_SetScrollProp(HWND hwnd, UINT index, INT newValue, BOOL flag) @@ -120,6 +140,8 @@ FlatSB_SetScrollProp(HWND hwnd, UINT index, INT newValue, BOOL flag) /*********************************************************************** * FlatSB_EnableScrollBar (COMCTL32.@) + * + * See EnableScrollBar. */ BOOL WINAPI FlatSB_EnableScrollBar(HWND hwnd, int nBar, UINT flags) @@ -129,6 +151,8 @@ FlatSB_EnableScrollBar(HWND hwnd, int nBar, UINT flags) /*********************************************************************** * FlatSB_ShowScrollBar (COMCTL32.@) + * + * See ShowScrollBar. */ BOOL WINAPI FlatSB_ShowScrollBar(HWND hwnd, int nBar, BOOL fShow) @@ -138,6 +162,8 @@ FlatSB_ShowScrollBar(HWND hwnd, int nBar, BOOL fShow) /*********************************************************************** * FlatSB_GetScrollRange (COMCTL32.@) + * + * See GetScrollRange. */ BOOL WINAPI FlatSB_GetScrollRange(HWND hwnd, int nBar, LPINT min, LPINT max) @@ -147,6 +173,8 @@ FlatSB_GetScrollRange(HWND hwnd, int nBar, LPINT min, LPINT max) /*********************************************************************** * FlatSB_GetScrollInfo (COMCTL32.@) + * + * See GetScrollInfo. */ BOOL WINAPI FlatSB_GetScrollInfo(HWND hwnd, int nBar, LPSCROLLINFO info) @@ -156,6 +184,8 @@ FlatSB_GetScrollInfo(HWND hwnd, int nBar, LPSCROLLINFO info) /*********************************************************************** * FlatSB_GetScrollPos (COMCTL32.@) + * + * See GetScrollPos. */ INT WINAPI FlatSB_GetScrollPos(HWND hwnd, int nBar) @@ -165,6 +195,8 @@ FlatSB_GetScrollPos(HWND hwnd, int nBar) /*********************************************************************** * FlatSB_SetScrollPos (COMCTL32.@) + * + * See SetScrollPos. */ INT WINAPI FlatSB_SetScrollPos(HWND hwnd, int nBar, INT pos, BOOL bRedraw) @@ -174,6 +206,8 @@ FlatSB_SetScrollPos(HWND hwnd, int nBar, INT pos, BOOL bRedraw) /*********************************************************************** * FlatSB_SetScrollInfo (COMCTL32.@) + * + * See SetScrollInfo. */ INT WINAPI FlatSB_SetScrollInfo(HWND hwnd, int nBar, LPSCROLLINFO info, BOOL bRedraw) @@ -183,6 +217,8 @@ FlatSB_SetScrollInfo(HWND hwnd, int nBar, LPSCROLLINFO info, BOOL bRedraw) /*********************************************************************** * FlatSB_SetScrollRange (COMCTL32.@) + * + * See SetScrollRange. */ INT WINAPI FlatSB_SetScrollRange(HWND hwnd, int nBar, INT min, INT max, BOOL bRedraw) diff --git a/reactos/lib/comctl32/imagelist.c b/reactos/lib/comctl32/imagelist.c index dbcfb07eaf2..bf81080837a 100644 --- a/reactos/lib/comctl32/imagelist.c +++ b/reactos/lib/comctl32/imagelist.c @@ -33,6 +33,7 @@ * TODO: * - Add support for ILD_PRESERVEALPHA, ILD_SCALE, ILD_DPISCALE * - Add support for ILS_GLOW, ILS_SHADOW, ILS_SATURATE, ILS_ALPHA + * - Thread-safe locking * * FIXME: * - Hotspot handling still not correct. The Hotspot passed to BeginDrag @@ -80,6 +81,7 @@ typedef struct static INTERNALDRAG InternalDrag = { 0, 0, 0, 0, 0, 0, FALSE, 0, FALSE }; +static HBITMAP ImageList_CreateImage(HDC hdc, HIMAGELIST himl, UINT width, UINT height); static inline BOOL is_valid(HIMAGELIST himl) { @@ -120,31 +122,36 @@ IMAGELIST_InternalExpandBitmaps (HIMAGELIST himl, INT nImageCount, INT cx, INT c TRACE("Create expanded bitmaps : himl=%p x=%d y=%d count=%d\n", himl, nNewWidth, cy, nNewCount); hdcBitmap = CreateCompatibleDC (0); - hbmNewBitmap = - CreateBitmap (nNewWidth, cy, 1, himl->uBitsPixel, NULL); + hbmNewBitmap = ImageList_CreateImage(hdcBitmap, himl, nNewWidth, cy); + if (hbmNewBitmap == 0) ERR("creating new image bitmap (x=%d y=%d)!\n", nNewWidth, cy); - hbmNull = SelectObject (hdcBitmap, hbmNewBitmap); - BitBlt (hdcBitmap, 0, 0, himl->cCurImage * himl->cx, cy, - himl->hdcImage, 0, 0, SRCCOPY); - - SelectObject (hdcBitmap, hbmNull); + if(himl->cCurImage) + { + hbmNull = SelectObject (hdcBitmap, hbmNewBitmap); + BitBlt (hdcBitmap, 0, 0, himl->cCurImage * himl->cx, cy, + himl->hdcImage, 0, 0, SRCCOPY); + SelectObject (hdcBitmap, hbmNull); + } SelectObject (himl->hdcImage, hbmNewBitmap); DeleteObject (himl->hbmImage); himl->hbmImage = hbmNewBitmap; - if (himl->hbmMask) { - hbmNewBitmap = - CreateBitmap (nNewWidth, cy, 1, 1, NULL); + if (himl->flags & ILC_MASK) + { + hbmNewBitmap = CreateBitmap (nNewWidth, cy, 1, 1, NULL); if (hbmNewBitmap == 0) ERR("creating new mask bitmap!\n"); - SelectObject (hdcBitmap, hbmNewBitmap); - BitBlt (hdcBitmap, 0, 0, himl->cCurImage * himl->cx, cy, - himl->hdcMask, 0, 0, SRCCOPY); - SelectObject (hdcBitmap, hbmNull); + if(himl->cCurImage) + { + hbmNull = SelectObject (hdcBitmap, hbmNewBitmap); + BitBlt (hdcBitmap, 0, 0, himl->cCurImage * himl->cx, cy, + himl->hdcMask, 0, 0, SRCCOPY); + SelectObject (hdcBitmap, hbmNull); + } SelectObject (himl->hdcMask, hbmNewBitmap); DeleteObject (himl->hbmMask); himl->hbmMask = hbmNewBitmap; @@ -524,7 +531,9 @@ ImageList_Copy (HIMAGELIST himlDst, INT iDst, HIMAGELIST himlSrc, /************************************************************************* - * ImageList_Create [COMCTL32.@] Creates a new image list. + * ImageList_Create [COMCTL32.@] + * + * Creates a new image list. * * PARAMS * cx [I] image height @@ -537,7 +546,6 @@ ImageList_Copy (HIMAGELIST himlDst, INT iDst, HIMAGELIST himlSrc, * Success: Handle to the created image list * Failure: NULL */ - HIMAGELIST WINAPI ImageList_Create (INT cx, INT cy, UINT flags, INT cInitial, INT cGrow) @@ -545,6 +553,7 @@ ImageList_Create (INT cx, INT cy, UINT flags, HIMAGELIST himl; INT nCount; HBITMAP hbmTemp; + UINT ilc = (flags & 0xFE); static WORD aBitBlend25[] = {0xAA, 0x00, 0x55, 0x00, 0xAA, 0x00, 0x55, 0x00}; @@ -583,22 +592,22 @@ ImageList_Create (INT cx, INT cy, UINT flags, goto cleanup; } - himl->uBitsPixel = (UINT)GetDeviceCaps (himl->hdcImage, BITSPIXEL); + /* Default to ILC_COLOR4 if non of the ILC_COLOR* flags are specified */ + if (ilc == ILC_COLOR) + ilc = ILC_COLOR4; - TRACE("Image: %d Bits per Pixel\n", himl->uBitsPixel); + if (ilc >= ILC_COLOR4 && ilc <= ILC_COLOR32) + himl->uBitsPixel = ilc; + else + himl->uBitsPixel = (UINT)GetDeviceCaps (himl->hdcImage, BITSPIXEL); if (himl->cMaxImage > 0) { - himl->hbmImage = - CreateBitmap (himl->cx * himl->cMaxImage, himl->cy, - 1, himl->uBitsPixel, NULL); - if (himl->hbmImage == 0) { - ERR("Error creating image bitmap!\n"); - goto cleanup; - } - SelectObject(himl->hdcImage, himl->hbmImage); - } + himl->hbmImage = ImageList_CreateImage(himl->hdcImage, himl, cx * himl->cMaxImage, cy); + SelectObject(himl->hdcImage, himl->hbmImage); + } else + himl->hbmImage = 0; - if (himl->flags & ILC_MASK) { + if ((himl->cMaxImage > 0) && (himl->flags & ILC_MASK)) { himl->hbmMask = CreateBitmap (himl->cx * himl->cMaxImage, himl->cy, 1, 1, NULL); @@ -953,7 +962,9 @@ ImageList_DragShowNolock (BOOL bShow) /************************************************************************* - * ImageList_Draw [COMCTL32.@] Draws an image. + * ImageList_Draw [COMCTL32.@] + * + * Draws an image. * * PARAMS * himl [I] handle to image list @@ -1034,7 +1045,7 @@ ImageList_DrawEx (HIMAGELIST himl, INT i, HDC hdc, INT x, INT y, /************************************************************************* * ImageList_DrawIndirect [COMCTL32.@] * - * Draws an image using ... + * Draws an image using various parameters specified in pimldp. * * PARAMS * pimldp [I] pointer to IMAGELISTDRAWPARAMS structure. @@ -1071,8 +1082,8 @@ ImageList_DrawIndirect (IMAGELISTDRAWPARAMS *pimldp) bIsTransparent = (fStyle & ILD_TRANSPARENT) || clrBk == CLR_NONE; bBlend = fStyle & (ILD_BLEND25 | ILD_BLEND50); - TRACE("hbmMask(%p) iImage(%d) x(%d) y(%d) cx(%d) cy(%d)\n", - himl->hbmMask, pimldp->i, pimldp->x, pimldp->y, cx, cy); + TRACE("himl(0x%lx) hbmMask(%p) iImage(%d) x(%d) y(%d) cx(%d) cy(%d)\n", + (DWORD)himl, himl->hbmMask, pimldp->i, pimldp->x, pimldp->y, cx, cy); /* we will use these DCs to access the images and masks in the ImageList */ hImageListDC = himl->hdcImage; @@ -1200,7 +1211,9 @@ cleanup: /************************************************************************* - * ImageList_Duplicate [COMCTL32.@] Duplicates an image list. + * ImageList_Duplicate [COMCTL32.@] + * + * Duplicates an image list. * * PARAMS * himlSrc [I] source image list handle @@ -1240,7 +1253,7 @@ ImageList_Duplicate (HIMAGELIST himlSrc) /************************************************************************* - * ImageList_EndDrag [COMCTL32.@] Finishes a drag operation. + * ImageList_EndDrag [COMCTL32.@] * * Finishes a drag operation. * @@ -1326,6 +1339,14 @@ ImageList_GetDragImage (POINT *ppt, POINT *pptHotspot) /************************************************************************* * ImageList_GetFlags [COMCTL32.@] * + * Gets the flags of the specified image list. + * + * PARAMS + * himl [I] Handle to image list + * + * RETURNS + * Image list flags. + * * BUGS * Stub. */ @@ -2012,7 +2033,9 @@ HIMAGELIST WINAPI ImageList_Read (LPSTREAM pstm) /************************************************************************* - * ImageList_Remove [COMCTL32.@] Removes an image from an image list + * ImageList_Remove [COMCTL32.@] + * + * Removes an image from an image list * * PARAMS * himl [I] image list handle @@ -2055,8 +2078,7 @@ ImageList_Remove (HIMAGELIST himl, INT i) for (nCount = 0; nCount < MAX_OVERLAYIMAGE; nCount++) himl->nOvlIdx[nCount] = -1; - hbmNewImage = CreateBitmap (himl->cMaxImage * himl->cx, himl->cy, - 1, himl->uBitsPixel, NULL); + hbmNewImage = ImageList_CreateImage(himl->hdcImage, himl, himl->cMaxImage * himl->cx, himl->cy); SelectObject (himl->hdcImage, hbmNewImage); DeleteObject (himl->hbmImage); himl->hbmImage = hbmNewImage; @@ -2074,15 +2096,15 @@ ImageList_Remove (HIMAGELIST himl, INT i) TRACE("Remove single image! %d\n", i); /* create new bitmap(s) */ - cxNew = (himl->cCurImage + himl->cGrow - 1) * himl->cx; + nCount = (himl->cCurImage + himl->cGrow - 1); + cxNew = nCount * himl->cx; TRACE(" - Number of images: %d / %d (Old/New)\n", himl->cCurImage, himl->cCurImage - 1); TRACE(" - Max. number of images: %d / %d (Old/New)\n", himl->cMaxImage, himl->cCurImage + himl->cGrow - 1); - hbmNewImage = - CreateBitmap (cxNew, himl->cy, 1, himl->uBitsPixel, NULL); + hbmNewImage = ImageList_CreateImage(himl->hdcImage, himl, cxNew, himl->cy); if (himl->hbmMask) hbmNewMask = CreateBitmap (cxNew, himl->cy, 1, 1, NULL); @@ -2438,6 +2460,15 @@ ImageList_SetFilter (HIMAGELIST himl, INT i, DWORD dwFilter) /************************************************************************* * ImageList_SetFlags [COMCTL32.@] * + * Sets the image list flags. + * + * PARAMS + * himl [I] Handle to image list + * flags [I] Flags to set + * + * RETURNS + * Old flags? + * * BUGS * Stub. */ @@ -2484,8 +2515,7 @@ ImageList_SetIconSize (HIMAGELIST himl, INT cx, INT cy) for (nCount = 0; nCount < MAX_OVERLAYIMAGE; nCount++) himl->nOvlIdx[nCount] = -1; - hbmNew = CreateBitmap (himl->cMaxImage * himl->cx, himl->cy, - 1, himl->uBitsPixel, NULL); + hbmNew = ImageList_CreateImage(himl->hdcImage, himl, himl->cMaxImage * himl->cx, himl->cy); SelectObject (himl->hdcImage, hbmNew); DeleteObject (himl->hbmImage); himl->hbmImage = hbmNew; @@ -2540,8 +2570,8 @@ ImageList_SetImageCount (HIMAGELIST himl, UINT iImageCount) hdcBitmap = CreateCompatibleDC (0); - hbmNewBitmap = CreateBitmap (nNewCount * himl->cx, himl->cy, - 1, himl->uBitsPixel, NULL); + hbmNewBitmap = ImageList_CreateImage(hdcBitmap, himl, nNewCount * himl->cx, himl->cy); + if (hbmNewBitmap != 0) { SelectObject (hdcBitmap, hbmNewBitmap); @@ -2782,3 +2812,40 @@ ImageList_Write (HIMAGELIST himl, LPSTREAM pstm) return TRUE; } + + +static HBITMAP ImageList_CreateImage(HDC hdc, HIMAGELIST himl, UINT width, UINT height) +{ + HBITMAP hbmNewBitmap; + UINT ilc = (himl->flags & 0xFE); + + if ((ilc >= ILC_COLOR4 && ilc <= ILC_COLOR32) || ilc == ILC_COLOR) + { + VOID* bits; + 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; + + hbmNewBitmap = CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, &bits, 0, 0); + } + else /*if (ilc == ILC_COLORDDB)*/ + { + TRACE("Creating Bitmap: %d Bits per Pixel\n", himl->uBitsPixel); + + hbmNewBitmap = CreateBitmap (width, height, 1, himl->uBitsPixel, NULL); + } + + return hbmNewBitmap; +} diff --git a/reactos/lib/comctl32/listview.c b/reactos/lib/comctl32/listview.c index 8c43634ede9..cfc92ed2e88 100644 --- a/reactos/lib/comctl32/listview.c +++ b/reactos/lib/comctl32/listview.c @@ -93,7 +93,6 @@ * -- LVS_EX_UNDERLINEHOT * * Notifications: - * -- LVN_BEGINRDRAG * -- LVN_BEGINSCROLL, LVN_ENDSCROLL * -- LVN_GETINFOTIP * -- LVN_HOTTRACK @@ -4000,7 +3999,26 @@ static DWORD LISTVIEW_ApproximateViewRect(LISTVIEW_INFO *infoPtr, INT nItemCount dwViewRect = MAKELONG(wWidth, wHeight); } else if (uView == LVS_REPORT) - FIXME("uView == LVS_REPORT: not implemented\n"); + { + RECT rcBox; + + if (infoPtr->nItemCount > 0) + { + LISTVIEW_GetItemBox(infoPtr, 0, &rcBox); + wWidth = rcBox.right - rcBox.left; + wHeight = (rcBox.bottom - rcBox.top) * nItemCount; + } + else + { + /* use current height and width */ + if (wHeight == 0xffff) + wHeight = infoPtr->rcList.bottom - infoPtr->rcList.top; + if (wWidth == 0xffff) + wWidth = infoPtr->rcList.right - infoPtr->rcList.left; + } + + dwViewRect = MAKELONG(wWidth, wHeight); + } else if (uView == LVS_SMALLICON) FIXME("uView == LVS_SMALLICON: not implemented\n"); else if (uView == LVS_ICON) @@ -4971,7 +4989,7 @@ static HIMAGELIST LISTVIEW_GetImageList(LISTVIEW_INFO *infoPtr, INT nImageList) * the buffer pointer you provided on input. Most code already does * that, so it's not a problem. * For the two cases when the text must be copied (that is, - * for LVM_GETITEM, and LVMGETITEMTEXT), use LISTVIEW_GetItemExtT. + * for LVM_GETITEM, and LVM_GETITEMTEXT), use LISTVIEW_GetItemExtT. * * RETURN: * SUCCESS : TRUE @@ -5980,7 +5998,9 @@ static INT LISTVIEW_HitTest(LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht, BOOL s } } - if (select && !(uView == LVS_REPORT && (infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT))) + if (select && !(uView == LVS_REPORT && + ((infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT) || + (infoPtr->dwStyle & LVS_OWNERDRAWFIXED)))) { if (uView == LVS_REPORT) { diff --git a/reactos/lib/comctl32/propsheet.c b/reactos/lib/comctl32/propsheet.c index c1b4a7c789d..edc61ec36eb 100644 --- a/reactos/lib/comctl32/propsheet.c +++ b/reactos/lib/comctl32/propsheet.c @@ -1381,7 +1381,6 @@ static BOOL PROPSHEET_CreatePage(HWND hwndParent, DLGTEMPLATE* pTemplate; HWND hwndPage; RECT rc; - PropPageInfo* ppInfo = psInfo->proppage; PADDING_INFO padding; UINT pageWidth,pageHeight; DWORD resSize; @@ -1494,7 +1493,7 @@ static BOOL PROPSHEET_CreatePage(HWND hwndParent, if(temp) Free(temp); - ppInfo[index].hwndPage = hwndPage; + psInfo->proppage[index].hwndPage = hwndPage; if (psInfo->ppshheader.dwFlags & INTRNL_ANY_WIZARD) { /* FIXME: This code may no longer be correct. @@ -2278,7 +2277,6 @@ static BOOL PROPSHEET_RemovePage(HWND hwndDlg, if (!psInfo) { return FALSE; } - oldPages = psInfo->proppage; /* * hpage takes precedence over index. */ @@ -2345,6 +2343,7 @@ static BOOL PROPSHEET_RemovePage(HWND hwndDlg, /* Remove the tab */ SendMessageW(hwndTabControl, TCM_DELETEITEM, index, 0); + oldPages = psInfo->proppage; psInfo->nPages--; psInfo->proppage = Alloc(sizeof(PropPageInfo) * psInfo->nPages); @@ -2478,6 +2477,15 @@ static void PROPSHEET_CleanUp(HWND hwndDlg) /****************************************************************************** * PropertySheet (COMCTL32.@) * PropertySheetA (COMCTL32.@) + * + * Creates a property sheet in the specified property sheet header. + * + * RETURNS + * Modal property sheets: Positive if successful or -1 otherwise. + * Modeless property sheets: Property sheet handle. + * Or: + *| ID_PSREBOOTSYSTEM - The user must reboot the computer for the changes to take effect. + *| ID_PSRESTARTWINDOWS - The user must restart Windows for the changes to take effect. */ INT WINAPI PropertySheetA(LPCPROPSHEETHEADERA lppsh) { @@ -2523,6 +2531,8 @@ INT WINAPI PropertySheetA(LPCPROPSHEETHEADERA lppsh) /****************************************************************************** * PropertySheetW (COMCTL32.@) + * + * See PropertySheetA. */ INT WINAPI PropertySheetW(LPCPROPSHEETHEADERW lppsh) { @@ -2569,6 +2579,16 @@ INT WINAPI PropertySheetW(LPCPROPSHEETHEADERW lppsh) /****************************************************************************** * CreatePropertySheetPage (COMCTL32.@) * CreatePropertySheetPageA (COMCTL32.@) + * + * Creates a new property sheet page. + * + * RETURNS + * Success: Handle to new property sheet page. + * Failure: NULL. + * + * NOTES + * An application must use the PSM_ADDPAGE message to add the new page to + * an existing property sheet. */ HPROPSHEETPAGE WINAPI CreatePropertySheetPageA( LPCPROPSHEETPAGEA lpPropSheetPage) @@ -2602,6 +2622,8 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPageA( /****************************************************************************** * CreatePropertySheetPageW (COMCTL32.@) + * + * See CreatePropertySheetA. */ HPROPSHEETPAGE WINAPI CreatePropertySheetPageW(LPCPROPSHEETPAGEW lpPropSheetPage) { @@ -2639,6 +2661,14 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPageW(LPCPROPSHEETPAGEW lpPropSheetPage /****************************************************************************** * DestroyPropertySheetPage (COMCTL32.@) + * + * Destroys a property sheet page previously created with + * CreatePropertySheetA() or CreatePropertySheetW() and frees the associated + * memory. + * + * RETURNS + * Success: TRUE + * Failure: FALSE */ BOOL WINAPI DestroyPropertySheetPage(HPROPSHEETPAGE hPropPage) { diff --git a/reactos/lib/comctl32/rebar.c b/reactos/lib/comctl32/rebar.c index d349d5d0385..04668822880 100644 --- a/reactos/lib/comctl32/rebar.c +++ b/reactos/lib/comctl32/rebar.c @@ -1497,10 +1497,7 @@ REBAR_Layout (REBAR_INFO *infoPtr, LPRECT lpRect, BOOL notify, BOOL resetclient) /* separator from previous band */ cxsep = (cntonrow == 0) ? 0 : SEP_WIDTH; - - /* Header: includes gripper, text, image */ - cx = lpBand->cxHeader; - if (lpBand->fStyle & RBBS_FIXEDSIZE) cx = lpBand->lcx; + cx = lpBand->lcx; if (infoPtr->dwStyle & CCS_VERT) dobreak = (y + cx + cxsep > adjcy); @@ -3747,6 +3744,7 @@ REBAR_ShowBand (REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam) ShowWindow (lpBand->hwndChild, SW_HIDE); } + infoPtr->fStatus |= BAND_NEEDS_LAYOUT; REBAR_Layout (infoPtr, NULL, TRUE, FALSE); InvalidateRect(infoPtr->hwndSelf, 0, 1); diff --git a/reactos/lib/comctl32/rsrc.rc b/reactos/lib/comctl32/rsrc.rc index 0bb670fc7c5..b1c28fc5b6b 100644 --- a/reactos/lib/comctl32/rsrc.rc +++ b/reactos/lib/comctl32/rsrc.rc @@ -971,6 +971,33 @@ IDB_HIST_LARGE BITMAP LOADONCALL DISCARDABLE idb_hist_large.bmp } */ +/* BINRES idc_copy.cur */ +IDC_COPY CURSOR LOADONCALL DISCARDABLE idc_copy.cur +/* { + '00 00 02 00 01 00 20 20 00 00 00 00 00 00 30 01' + '00 00 16 00 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 01 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 C0 00 00 00 C0' + '00 00 01 80 00 00 01 80 00 00 03 00 00 00 43 00' + '00 00 66 00 00 00 76 00 00 00 7E 00 00 00 7F C0' + '00 00 7F 80 00 00 7F 00 00 00 7E 00 00 00 7C 00' + '00 00 78 00 00 00 70 00 00 00 60 00 00 00 40 00' + '00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FD FF FF FF FD FF FF FF F0' + '7F FF FF FD FF FF FF 3D FF FF FE 1F FF FF FE 1F' + 'FF FF FC 3F FF FF 7C 3F FF FF 38 7F FF FF 18 7F' + 'FF FF 00 FF FF FF 00 FF FF FF 00 0F FF FF 00 1F' + 'FF FF 00 3F FF FF 00 7F FF FF 00 FF FF FF 01 FF' + 'FF FF 03 FF FF FF 07 FF FF FF 0F FF FF FF 1F FF' + 'FF FF 3F FF FF FF' +} */ + + /* BINRES idc_divider.cur */ IDC_DIVIDER CURSOR LOADONCALL DISCARDABLE idc_divider.cur /* { diff --git a/reactos/lib/comctl32/smoothscroll.c b/reactos/lib/comctl32/smoothscroll.c index 1eb503978b8..658be6259f2 100644 --- a/reactos/lib/comctl32/smoothscroll.c +++ b/reactos/lib/comctl32/smoothscroll.c @@ -63,10 +63,14 @@ typedef struct tagSMOOTHSCROLLSTRUCT { * * Lots of magic for smooth scrolling windows. * - * Currently only scrolls ONCE. The comctl32 implementation uses GetTickCount - * and what else to do smooth scrolling. + * RETURNS + * Success: TRUE + * Failure: FALSE + * + * BUGS + * Currently only scrolls ONCE. The comctl32 implementation uses GetTickCount + * and what else to do smooth scrolling. */ - BOOL WINAPI SmoothScrollWindow( SMOOTHSCROLLSTRUCT *smooth ) { LPRECT lpupdaterect = smooth->lpupdaterect; HRGN hrgnupdate = smooth->hrgnupdate; diff --git a/reactos/lib/comctl32/string.c b/reactos/lib/comctl32/string.c new file mode 100644 index 00000000000..2eb6172f936 --- /dev/null +++ b/reactos/lib/comctl32/string.c @@ -0,0 +1,853 @@ +/* + * String manipulation functions + * + * Copyright 1998 Eric Kohl + * 1998 Juergen Schmied <j.schmied@metronet.de> + * 2000 Eric Kohl for CodeWeavers + * Copyright 2002 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 + * + */ + +#include <stdarg.h> +#include <string.h> +#include <stdlib.h> /* atoi */ + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "winnls.h" + +#include "wine/unicode.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(commctrl); + +/************************************************************************* + * COMCTL32_ChrCmpHelperA + * + * Internal helper for ChrCmpA/COMCTL32_ChrCmpIA. + * + * NOTES + * Both this function and its Unicode counterpart are very inneficient. To + * fix this, CompareString must be completely implemented and optimised + * first. Then the core character test can be taken out of that function and + * placed here, so that it need never be called at all. Until then, do not + * attempt to optimise this code unless you are willing to test that it + * still performs correctly. + */ +static BOOL COMCTL32_ChrCmpHelperA(WORD ch1, WORD ch2, DWORD dwFlags) +{ + char str1[3], str2[3]; + + str1[0] = LOBYTE(ch1); + if (IsDBCSLeadByte(str1[0])) + { + str1[1] = HIBYTE(ch1); + str1[2] = '\0'; + } + else + str1[1] = '\0'; + + str2[0] = LOBYTE(ch2); + if (IsDBCSLeadByte(str2[0])) + { + str2[1] = HIBYTE(ch2); + str2[2] = '\0'; + } + else + str2[1] = '\0'; + + return CompareStringA(GetThreadLocale(), dwFlags, str1, -1, str2, -1) - 2; +} + +/************************************************************************* + * COMCTL32_ChrCmpHelperW + * + * Internal helper for COMCTL32_ChrCmpW/ChrCmpIW. + */ +static BOOL COMCTL32_ChrCmpHelperW(WCHAR ch1, WCHAR ch2, DWORD dwFlags) +{ + WCHAR str1[2], str2[2]; + + str1[0] = ch1; + str1[1] = '\0'; + str2[0] = ch2; + str2[1] = '\0'; + return CompareStringW(GetThreadLocale(), dwFlags, str1, 2, str2, 2) - 2; +} + +/************************************************************************* + * COMCTL32_ChrCmpA (internal) + * + * Internal helper function. + */ +static BOOL COMCTL32_ChrCmpA(WORD ch1, WORD ch2) +{ + return COMCTL32_ChrCmpHelperA(ch1, ch2, 0); +} + +/************************************************************************* + * COMCTL32_ChrCmpIA (internal) + * + * Compare two characters, ignoring case. + * + * PARAMS + * ch1 [I] First character to compare + * ch2 [I] Second character to compare + * + * RETURNS + * FALSE, if the characters are equal. + * Non-zero otherwise. + */ +static BOOL COMCTL32_ChrCmpIA(WORD ch1, WORD ch2) +{ + TRACE("(%d,%d)\n", ch1, ch2); + + return COMCTL32_ChrCmpHelperA(ch1, ch2, NORM_IGNORECASE); +} + +/************************************************************************* + * COMCTL32_ChrCmpW + * + * Internal helper function. + */ +static BOOL COMCTL32_ChrCmpW(WCHAR ch1, WCHAR ch2) +{ + return COMCTL32_ChrCmpHelperW(ch1, ch2, 0); +} + +/************************************************************************** + * StrChrA [COMCTL32.350] + * + * Find a given character in a string. + * + * PARAMS + * lpszStr [I] String to search in. + * ch [I] Character to search for. + * + * RETURNS + * Success: A pointer to the first occurrence of ch in lpszStr, or NULL if + * not found. + * Failure: NULL, if any arguments are invalid. + */ +LPSTR WINAPI StrChrA(LPCSTR lpszStr, WORD ch) +{ + TRACE("(%s,%i)\n", debugstr_a(lpszStr), ch); + + if (lpszStr) + { + while (*lpszStr) + { + if (!COMCTL32_ChrCmpA(*lpszStr, ch)) + return (LPSTR)lpszStr; + lpszStr = CharNextA(lpszStr); + } + } + return NULL; +} + +/************************************************************************* + * COMCTL32_StrStrHelperA + * + * Internal implementation of StrStrA/StrStrIA + */ +static LPSTR COMCTL32_StrStrHelperA(LPCSTR lpszStr, LPCSTR lpszSearch, + int (*pStrCmpFn)(LPCSTR,LPCSTR,size_t)) +{ + size_t iLen; + + if (!lpszStr || !lpszSearch || !*lpszSearch) + return NULL; + + iLen = strlen(lpszSearch); + + while (*lpszStr) + { + if (!pStrCmpFn(lpszStr, lpszSearch, iLen)) + return (LPSTR)lpszStr; + lpszStr = CharNextA(lpszStr); + } + return NULL; +} + +/************************************************************************* + * COMCTL32_StrStrHelperW + * + * Internal implementation of StrStrW/StrStrIW + */ +static LPWSTR COMCTL32_StrStrHelperW(LPCWSTR lpszStr, LPCWSTR lpszSearch, + int (*pStrCmpFn)(LPCWSTR,LPCWSTR,int)) +{ + int iLen; + + if (!lpszStr || !lpszSearch || !*lpszSearch) + return NULL; + + iLen = strlenW(lpszSearch); + + while (*lpszStr) + { + if (!pStrCmpFn(lpszStr, lpszSearch, iLen)) + return (LPWSTR)lpszStr; + lpszStr = CharNextW(lpszStr); + } + return NULL; +} + +/************************************************************************** + * StrStrIA [COMCTL32.355] + * + * Find a substring within a string, ignoring case. + * + * PARAMS + * lpszStr [I] String to search in + * lpszSearch [I] String to look for + * + * RETURNS + * The start of lpszSearch within lpszStr, or NULL if not found. + */ +LPSTR WINAPI StrStrIA(LPCSTR lpszStr, LPCSTR lpszSearch) +{ + TRACE("(%s,%s)\n", debugstr_a(lpszStr), debugstr_a(lpszSearch)); + + return COMCTL32_StrStrHelperA(lpszStr, lpszSearch, strncasecmp); +} + +/************************************************************************** + * StrToIntA [COMCTL32.357] + * + * Read a signed integer from a string. + * + * PARAMS + * lpszStr [I] String to read integer from + * + * RETURNS + * The signed integer value represented by the string, or 0 if no integer is + * present. + */ +INT WINAPI StrToIntA (LPSTR lpszStr) +{ + return atoi(lpszStr); +} + +/************************************************************************** + * StrStrIW [COMCTL32.363] + * + * See StrStrIA. + */ +LPWSTR WINAPI StrStrIW(LPCWSTR lpszStr, LPCWSTR lpszSearch) +{ + TRACE("(%s,%s)\n", debugstr_w(lpszStr), debugstr_w(lpszSearch)); + + return COMCTL32_StrStrHelperW(lpszStr, lpszSearch, (int (*)(LPCWSTR,LPCWSTR,int)) wcsnicmp); +} + +/************************************************************************** + * StrToIntW [COMCTL32.365] + * + * See StrToIntA. + */ +INT WINAPI StrToIntW (LPWSTR lpString) +{ + return atoiW(lpString); +} + +/************************************************************************* + * COMCTL32_StrSpnHelperA (internal) + * + * Internal implementation of StrSpnA/StrCSpnA/StrCSpnIA + */ +static int COMCTL32_StrSpnHelperA(LPCSTR lpszStr, LPCSTR lpszMatch, + LPSTR (WINAPI *pStrChrFn)(LPCSTR,WORD), + BOOL bInvert) +{ + LPCSTR lpszRead = lpszStr; + if (lpszStr && *lpszStr && lpszMatch) + { + while (*lpszRead) + { + LPCSTR lpszTest = pStrChrFn(lpszMatch, *lpszRead); + + if (!bInvert && !lpszTest) + break; + if (bInvert && lpszTest) + break; + lpszRead = CharNextA(lpszRead); + }; + } + return lpszRead - lpszStr; +} + +/************************************************************************** + * StrCSpnA [COMCTL32.356] + * + * Find the length of the start of a string that does not contain certain + * characters. + * + * PARAMS + * lpszStr [I] String to search + * lpszMatch [I] Characters that cannot be in the substring + * + * RETURNS + * The length of the part of lpszStr containing only chars not in lpszMatch, + * or 0 if any parameter is invalid. + */ +int WINAPI StrCSpnA(LPCSTR lpszStr, LPCSTR lpszMatch) +{ + TRACE("(%s,%s)\n",debugstr_a(lpszStr), debugstr_a(lpszMatch)); + + return COMCTL32_StrSpnHelperA(lpszStr, lpszMatch, StrChrA, TRUE); +} + +/************************************************************************** + * StrChrW [COMCTL32.358] + * + * See StrChrA. + */ +LPWSTR WINAPI StrChrW(LPCWSTR lpszStr, WCHAR ch) +{ + LPWSTR lpszRet = NULL; + + TRACE("(%s,%i)\n", debugstr_w(lpszStr), ch); + + if (lpszStr) + lpszRet = strchrW(lpszStr, ch); + return lpszRet; +} + +/************************************************************************** + * StrCmpNA [COMCTL32.352] + * + * Compare two strings, up to a maximum length. + * + * PARAMS + * lpszStr [I] First string to compare + * lpszComp [I] Second string to compare + * iLen [I] Maximum number of chars to compare. + * + * RETURNS + * An integer less than, equal to or greater than 0, indicating that + * lpszStr is less than, the same, or greater than lpszComp. + */ +INT WINAPI StrCmpNA(LPCSTR lpszStr, LPCSTR lpszComp, INT iLen) +{ + INT iRet; + + TRACE("(%s,%s,%i)\n", debugstr_a(lpszStr), debugstr_a(lpszComp), iLen); + + iRet = CompareStringA(GetThreadLocale(), 0, lpszStr, iLen, lpszComp, iLen); + return iRet == CSTR_LESS_THAN ? -1 : iRet == CSTR_GREATER_THAN ? 1 : 0; +} + +/************************************************************************** + * StrCmpNIA [COMCTL32.353] + * + * Compare two strings, up to a maximum length, ignoring case. + * + * PARAMS + * lpszStr [I] First string to compare + * lpszComp [I] Second string to compare + * iLen [I] Maximum number of chars to compare. + * + * RETURNS + * An integer less than, equal to or greater than 0, indicating that + * lpszStr is less than, the same, or greater than lpszComp. + */ +int WINAPI StrCmpNIA(LPCSTR lpszStr, LPCSTR lpszComp, int iLen) +{ + INT iRet; + + TRACE("(%s,%s,%i)\n", debugstr_a(lpszStr), debugstr_a(lpszComp), iLen); + + iRet = CompareStringA(GetThreadLocale(), NORM_IGNORECASE, lpszStr, iLen, lpszComp, iLen); + return iRet == CSTR_LESS_THAN ? -1 : iRet == CSTR_GREATER_THAN ? 1 : 0; +} + +/************************************************************************* + * StrCmpNIW [COMCTL32.361] + * + * See StrCmpNIA. + */ +INT WINAPI StrCmpNIW(LPCWSTR lpszStr, LPCWSTR lpszComp, int iLen) +{ + INT iRet; + + TRACE("(%s,%s,%i)\n", debugstr_w(lpszStr), debugstr_w(lpszComp), iLen); + + iRet = CompareStringW(GetThreadLocale(), NORM_IGNORECASE, lpszStr, iLen, lpszComp, iLen); + return iRet == CSTR_LESS_THAN ? -1 : iRet == CSTR_GREATER_THAN ? 1 : 0; +} + +/************************************************************************** + * StrCmpNW [COMCTL32.360] + * + * See StrCmpNA. + */ +INT WINAPI StrCmpNW(LPCWSTR lpszStr, LPCWSTR lpszComp, INT iLen) +{ + INT iRet; + + TRACE("(%s,%s,%i)\n", debugstr_w(lpszStr), debugstr_w(lpszComp), iLen); + + iRet = CompareStringW(GetThreadLocale(), 0, lpszStr, iLen, lpszComp, iLen); + return iRet == CSTR_LESS_THAN ? -1 : iRet == CSTR_GREATER_THAN ? 1 : 0; +} + +/************************************************************************** + * StrRChrA [COMCTL32.351] + * + * Find the last occurence of a character in string. + * + * PARAMS + * lpszStr [I] String to search in + * lpszEnd [I] Place to end search, or NULL to search until the end of lpszStr + * ch [I] Character to search for. + * + * RETURNS + * Success: A pointer to the last occurrence of ch in lpszStr before lpszEnd, + * or NULL if not found. + * Failure: NULL, if any arguments are invalid. + */ +LPSTR WINAPI StrRChrA(LPCSTR lpszStr, LPCSTR lpszEnd, WORD ch) +{ + LPCSTR lpszRet = NULL; + + TRACE("(%s,%s,%x)\n", debugstr_a(lpszStr), debugstr_a(lpszEnd), ch); + + if (lpszStr) + { + WORD ch2; + + if (!lpszEnd) + lpszEnd = lpszStr + lstrlenA(lpszStr); + + while (*lpszStr && lpszStr <= lpszEnd) + { + ch2 = IsDBCSLeadByte(*lpszStr)? *lpszStr << 8 | lpszStr[1] : *lpszStr; + + if (!COMCTL32_ChrCmpA(ch, ch2)) + lpszRet = lpszStr; + lpszStr = CharNextA(lpszStr); + } + } + return (LPSTR)lpszRet; +} + + +/************************************************************************** + * StrRChrW [COMCTL32.359] + * + * See StrRChrA. + */ +LPWSTR WINAPI StrRChrW(LPCWSTR lpszStr, LPCWSTR lpszEnd, WORD ch) +{ + LPCWSTR lpszRet = NULL; + + TRACE("(%s,%s,%x)\n", debugstr_w(lpszStr), debugstr_w(lpszEnd), ch); + + if (lpszStr) + { + if (!lpszEnd) + lpszEnd = lpszStr + strlenW(lpszStr); + + while (*lpszStr && lpszStr <= lpszEnd) + { + if (!COMCTL32_ChrCmpW(ch, *lpszStr)) + lpszRet = lpszStr; + lpszStr = CharNextW(lpszStr); + } + } + return (LPWSTR)lpszRet; +} + +/************************************************************************** + * StrStrA [COMCTL32.354] + * + * Find a substring within a string. + * + * PARAMS + * lpszStr [I] String to search in + * lpszSearch [I] String to look for + * + * RETURNS + * The start of lpszSearch within lpszStr, or NULL if not found. + */ +LPSTR WINAPI StrStrA(LPCSTR lpszStr, LPCSTR lpszSearch) +{ + TRACE("(%s,%s)\n", debugstr_a(lpszStr), debugstr_a(lpszSearch)); + + return COMCTL32_StrStrHelperA(lpszStr, lpszSearch, strncmp); +} + +/************************************************************************** + * StrStrW [COMCTL32.362] + * + * See StrStrA. + */ +LPWSTR WINAPI StrStrW(LPCWSTR lpszStr, LPCWSTR lpszSearch) +{ + TRACE("(%s,%s)\n", debugstr_w(lpszStr), debugstr_w(lpszSearch)); + + return COMCTL32_StrStrHelperW(lpszStr, lpszSearch, (int (*)(LPCWSTR,LPCWSTR,int)) wcsncmp); +} + +/************************************************************************* + * StrChrIA [COMCTL32.366] + * + * Find a given character in a string, ignoring case. + * + * PARAMS + * lpszStr [I] String to search in. + * ch [I] Character to search for. + * + * RETURNS + * Success: A pointer to the first occurrence of ch in lpszStr, or NULL if + * not found. + * Failure: NULL, if any arguments are invalid. + */ +LPSTR WINAPI StrChrIA(LPCSTR lpszStr, WORD ch) +{ + TRACE("(%s,%i)\n", debugstr_a(lpszStr), ch); + + if (lpszStr) + { + while (*lpszStr) + { + if (!COMCTL32_ChrCmpIA(*lpszStr, ch)) + return (LPSTR)lpszStr; + lpszStr = CharNextA(lpszStr); + } + } + return NULL; +} + +/************************************************************************* + * StrChrIW [COMCTL32.367] + * + * See StrChrA. + */ +LPWSTR WINAPI StrChrIW(LPCWSTR lpszStr, WCHAR ch) +{ + TRACE("(%s,%i)\n", debugstr_w(lpszStr), ch); + + if (lpszStr) + { + ch = toupperW(ch); + while (*lpszStr) + { + if (toupperW(*lpszStr) == ch) + return (LPWSTR)lpszStr; + lpszStr = CharNextW(lpszStr); + } + lpszStr = NULL; + } + return (LPWSTR)lpszStr; +} + +/************************************************************************* + * StrRStrIA [COMCTL32.372] + * + * Find the last occurence of a substring within a string. + * + * PARAMS + * lpszStr [I] String to search in + * lpszEnd [I] End of lpszStr + * lpszSearch [I] String to look for + * + * RETURNS + * The last occurence lpszSearch within lpszStr, or NULL if not found. + */ +LPSTR WINAPI StrRStrIA(LPCSTR lpszStr, LPCSTR lpszEnd, LPCSTR lpszSearch) +{ + LPSTR lpszRet = NULL; + WORD ch1, ch2; + INT iLen; + + TRACE("(%s,%s)\n", debugstr_a(lpszStr), debugstr_a(lpszSearch)); + + if (!lpszStr || !lpszSearch || !*lpszSearch) + return NULL; + + if (!lpszEnd) + lpszEnd = lpszStr + lstrlenA(lpszStr); + + if (IsDBCSLeadByte(*lpszSearch)) + ch1 = *lpszSearch << 8 | lpszSearch[1]; + else + ch1 = *lpszSearch; + iLen = lstrlenA(lpszSearch); + + while (lpszStr <= lpszEnd && *lpszStr) + { + ch2 = IsDBCSLeadByte(*lpszStr)? *lpszStr << 8 | lpszStr[1] : *lpszStr; + if (!COMCTL32_ChrCmpIA(ch1, ch2)) + { + if (!StrCmpNIA(lpszStr, lpszSearch, iLen)) + lpszRet = (LPSTR)lpszStr; + } + lpszStr = CharNextA(lpszStr); + } + return lpszRet; +} + +/************************************************************************* + * StrRStrIW [COMCTL32.373] + * + * See StrRStrIA. + */ +LPWSTR WINAPI StrRStrIW(LPCWSTR lpszStr, LPCWSTR lpszEnd, LPCWSTR lpszSearch) +{ + LPWSTR lpszRet = NULL; + INT iLen; + + TRACE("(%s,%s)\n", debugstr_w(lpszStr), debugstr_w(lpszSearch)); + + if (!lpszStr || !lpszSearch || !*lpszSearch) + return NULL; + + if (!lpszEnd) + lpszEnd = lpszStr + strlenW(lpszStr); + + iLen = strlenW(lpszSearch); + + while (lpszStr <= lpszEnd && *lpszStr) + { + if (!COMCTL32_ChrCmpIA(*lpszSearch, *lpszStr)) + { + if (!StrCmpNIW(lpszStr, lpszSearch, iLen)) + lpszRet = (LPWSTR)lpszStr; + } + lpszStr = CharNextW(lpszStr); + } + return lpszRet; +} + +/************************************************************************* + * COMCTL32_StrSpnHelperW + * + * Internal implementation of StrSpnW/StrCSpnW/StrCSpnIW + */ +static int COMCTL32_StrSpnHelperW(LPCWSTR lpszStr, LPCWSTR lpszMatch, + LPWSTR (WINAPI *pStrChrFn)(LPCWSTR,WCHAR), + BOOL bInvert) +{ + LPCWSTR lpszRead = lpszStr; + if (lpszStr && *lpszStr && lpszMatch) + { + while (*lpszRead) + { + LPCWSTR lpszTest = pStrChrFn(lpszMatch, *lpszRead); + + if (!bInvert && !lpszTest) + break; + if (bInvert && lpszTest) + break; + lpszRead = CharNextW(lpszRead); + }; + } + return lpszRead - lpszStr; +} + +/************************************************************************* + * StrCSpnIA [COMCTL32.374] + * + * Find the length of the start of a string that does not contain certain + * characters, ignoring case. + * + * PARAMS + * lpszStr [I] String to search + * lpszMatch [I] Characters that cannot be in the substring + * + * RETURNS + * The length of the part of lpszStr containing only chars not in lpszMatch, + * or 0 if any parameter is invalid. + */ +int WINAPI StrCSpnIA(LPCSTR lpszStr, LPCSTR lpszMatch) +{ + TRACE("(%s,%s)\n",debugstr_a(lpszStr), debugstr_a(lpszMatch)); + + return COMCTL32_StrSpnHelperA(lpszStr, lpszMatch, StrChrIA, TRUE); +} + +/************************************************************************* + * StrCSpnIW [COMCTL32.375] + * + * See StrCSpnIA. + */ +int WINAPI StrCSpnIW(LPCWSTR lpszStr, LPCWSTR lpszMatch) +{ + TRACE("(%s,%s)\n",debugstr_w(lpszStr), debugstr_w(lpszMatch)); + + return COMCTL32_StrSpnHelperW(lpszStr, lpszMatch, StrChrIW, TRUE); +} + +/************************************************************************** + * StrRChrIA [COMCTL32.368] + * + * Find the last occurence of a character in string, ignoring case. + * + * PARAMS + * lpszStr [I] String to search in + * lpszEnd [I] Place to end search, or NULL to search until the end of lpszStr + * ch [I] Character to search for. + * + * RETURNS + * Success: A pointer to the last occurrence of ch in lpszStr before lpszEnd, + * or NULL if not found. + * Failure: NULL, if any arguments are invalid. + */ +LPSTR WINAPI StrRChrIA(LPCSTR lpszStr, LPCSTR lpszEnd, WORD ch) +{ + LPCSTR lpszRet = NULL; + + TRACE("(%s,%s,%x)\n", debugstr_a(lpszStr), debugstr_a(lpszEnd), ch); + + if (lpszStr) + { + WORD ch2; + + if (!lpszEnd) + lpszEnd = lpszStr + lstrlenA(lpszStr); + + while (*lpszStr && lpszStr <= lpszEnd) + { + ch2 = IsDBCSLeadByte(*lpszStr)? *lpszStr << 8 | lpszStr[1] : *lpszStr; + + if (ch == ch2) + lpszRet = lpszStr; + lpszStr = CharNextA(lpszStr); + } + } + return (LPSTR)lpszRet; +} + +/************************************************************************** + * StrRChrIW [COMCTL32.369] + * + * See StrRChrIA. + */ +LPWSTR WINAPI StrRChrIW(LPCWSTR lpszStr, LPCWSTR lpszEnd, WORD ch) +{ + LPCWSTR lpszRet = NULL; + + TRACE("(%s,%s,%x)\n", debugstr_w(lpszStr), debugstr_w(lpszEnd), ch); + + if (lpszStr) + { + if (!lpszEnd) + lpszEnd = lpszStr + strlenW(lpszStr); + + while (*lpszStr && lpszStr <= lpszEnd) + { + if (ch == *lpszStr) + lpszRet = lpszStr; + lpszStr = CharNextW(lpszStr); + } + } + return (LPWSTR)lpszRet; +} + +/************************************************************************* + * StrSpnW [COMCTL32.364] + * + * See StrSpnA. + */ +int WINAPI StrSpnW(LPCWSTR lpszStr, LPCWSTR lpszMatch) +{ + TRACE("(%s,%s)\n",debugstr_w(lpszStr), debugstr_w(lpszMatch)); + + return COMCTL32_StrSpnHelperW(lpszStr, lpszMatch, StrChrW, FALSE); +} + +/************************************************************************* + * StrCSpnW [COMCTL32.@] + * + * See StrCSpnA. + */ +int WINAPI StrCSpnW(LPCWSTR lpszStr, LPCWSTR lpszMatch) +{ + TRACE("(%s,%s)\n",debugstr_w(lpszStr), debugstr_w(lpszMatch)); + + return COMCTL32_StrSpnHelperW(lpszStr, lpszMatch, StrChrW, TRUE); +} + +/************************************************************************* + * IntlStrEqWorkerA [COMCTL32.376] + * + * Compare two strings. + * + * PARAMS + * bCase [I] Whether to compare case sensitively + * lpszStr [I] First string to compare + * lpszComp [I] Second string to compare + * iLen [I] Length to compare + * + * RETURNS + * TRUE If the strings are equal. + * FALSE Otherwise. + */ +BOOL WINAPI IntlStrEqWorkerA(BOOL bCase, LPCSTR lpszStr, LPCSTR lpszComp, + int iLen) +{ + DWORD dwFlags = LOCALE_USE_CP_ACP; + int iRet; + + TRACE("(%d,%s,%s,%d)\n", bCase, + debugstr_a(lpszStr), debugstr_a(lpszComp), iLen); + + /* FIXME: These flags are undocumented and unknown by our CompareString. + * We need defines for them. + */ + dwFlags |= bCase ? 0x10000000 : 0x10000001; + + iRet = CompareStringA(GetThreadLocale(), + dwFlags, lpszStr, iLen, lpszComp, iLen); + + if (!iRet) + iRet = CompareStringA(2048, dwFlags, lpszStr, iLen, lpszComp, iLen); + + return iRet == 2 ? TRUE : FALSE; +} + +/************************************************************************* + * IntlStrEqWorkerW [COMCTL32.377] + * + * See IntlStrEqWorkerA. + */ +BOOL WINAPI IntlStrEqWorkerW(BOOL bCase, LPCWSTR lpszStr, LPCWSTR lpszComp, + int iLen) +{ + DWORD dwFlags; + int iRet; + + TRACE("(%d,%s,%s,%d)\n", bCase, + debugstr_w(lpszStr),debugstr_w(lpszComp), iLen); + + /* FIXME: These flags are undocumented and unknown by our CompareString. + * We need defines for them. + */ + dwFlags = bCase ? 0x10000000 : 0x10000001; + + iRet = CompareStringW(GetThreadLocale(), + dwFlags, lpszStr, iLen, lpszComp, iLen); + + if (!iRet) + iRet = CompareStringW(2048, dwFlags, lpszStr, iLen, lpszComp, iLen); + + return iRet == 2 ? TRUE : FALSE; +} diff --git a/reactos/lib/comctl32/tab.c b/reactos/lib/comctl32/tab.c index f38dd9cda25..7a332c2d095 100644 --- a/reactos/lib/comctl32/tab.c +++ b/reactos/lib/comctl32/tab.c @@ -33,8 +33,6 @@ * TCM_GETEXTENDEDSTYLE * TCM_SETEXTENDEDSTYLE * - * FIXME: - * UpDown control not displayed until after a tab is clicked on */ #include <stdarg.h> @@ -107,7 +105,7 @@ typedef struct #define CONTROL_BORDER_SIZEX 2 #define CONTROL_BORDER_SIZEY 2 #define BUTTON_SPACINGX 3 -#define BUTTON_SPACINGY 4 +#define BUTTON_SPACINGY 3 #define FLAT_BTN_SPACINGX 8 #define DEFAULT_TAB_WIDTH 96 @@ -327,40 +325,29 @@ static BOOL TAB_InternalGetItemRect( /* calculate the times bottom and top based on the row */ GetClientRect(hwnd, &clientRect); - if ((lStyle & TCS_BOTTOM) && !(lStyle & TCS_VERTICAL)) + if ((lStyle & TCS_BOTTOM) && (lStyle & TCS_VERTICAL)) { - itemRect->bottom = clientRect.bottom - - itemRect->top * (infoPtr->tabHeight - 2) - - ((lStyle & TCS_BUTTONS) ? itemRect->top * BUTTON_SPACINGY : SELECTED_TAB_OFFSET); - - itemRect->top = clientRect.bottom - - infoPtr->tabHeight - - itemRect->top * (infoPtr->tabHeight - 2) - - ((lStyle & TCS_BUTTONS) ? itemRect->top * BUTTON_SPACINGY : SELECTED_TAB_OFFSET); + itemRect->right = clientRect.right - SELECTED_TAB_OFFSET - itemRect->left * infoPtr->tabHeight - + ((lStyle & TCS_BUTTONS) ? itemRect->left * BUTTON_SPACINGX : 0); + itemRect->left = itemRect->right - infoPtr->tabHeight; } - else if((lStyle & TCS_BOTTOM) && (lStyle & TCS_VERTICAL)) + else if (lStyle & TCS_VERTICAL) { - itemRect->right = clientRect.right - SELECTED_TAB_OFFSET - itemRect->left * (infoPtr->tabHeight - 2) - - ((lStyle & TCS_BUTTONS) ? itemRect->left * BUTTON_SPACINGY : 0); - itemRect->left = clientRect.right - infoPtr->tabHeight - itemRect->left * (infoPtr->tabHeight - 2) - - ((lStyle & TCS_BUTTONS) ? itemRect->left * BUTTON_SPACINGY : 0); + itemRect->left = clientRect.left + SELECTED_TAB_OFFSET + itemRect->left * infoPtr->tabHeight + + ((lStyle & TCS_BUTTONS) ? itemRect->left * BUTTON_SPACINGX : 0); + itemRect->right = itemRect->left + infoPtr->tabHeight; } - else if((lStyle & TCS_VERTICAL) && !(lStyle & TCS_BOTTOM)) + else if (lStyle & TCS_BOTTOM) { - itemRect->right = clientRect.left + infoPtr->tabHeight + itemRect->left * (infoPtr->tabHeight - 2) + - ((lStyle & TCS_BUTTONS) ? itemRect->left * BUTTON_SPACINGY : 0); - itemRect->left = clientRect.left + SELECTED_TAB_OFFSET + itemRect->left * (infoPtr->tabHeight - 2) + - ((lStyle & TCS_BUTTONS) ? itemRect->left * BUTTON_SPACINGY : 0); + itemRect->bottom = clientRect.bottom - itemRect->top * infoPtr->tabHeight - + ((lStyle & TCS_BUTTONS) ? itemRect->top * BUTTON_SPACINGY : SELECTED_TAB_OFFSET); + itemRect->top = itemRect->bottom - infoPtr->tabHeight; } - else if(!(lStyle & TCS_VERTICAL) && !(lStyle & TCS_BOTTOM)) /* not TCS_BOTTOM and not TCS_VERTICAL */ + else /* not TCS_BOTTOM and not TCS_VERTICAL */ { - itemRect->bottom = clientRect.top + - infoPtr->tabHeight + - itemRect->top * (infoPtr->tabHeight - 2) + - ((lStyle & TCS_BUTTONS) ? itemRect->top * BUTTON_SPACINGY : SELECTED_TAB_OFFSET); - itemRect->top = clientRect.top + - itemRect->top * (infoPtr->tabHeight - 2) + - ((lStyle & TCS_BUTTONS) ? itemRect->top * BUTTON_SPACINGY : SELECTED_TAB_OFFSET); + itemRect->top = clientRect.top + itemRect->top * infoPtr->tabHeight + + ((lStyle & TCS_BUTTONS) ? itemRect->top * BUTTON_SPACINGY : SELECTED_TAB_OFFSET); + itemRect->bottom = itemRect->top + infoPtr->tabHeight; } /* @@ -371,7 +358,7 @@ static BOOL TAB_InternalGetItemRect( { OffsetRect(itemRect, 0, - -(clientRect.bottom - infoPtr->items[infoPtr->leftmostVisible].rect.bottom)); + -infoPtr->items[infoPtr->leftmostVisible].rect.top); /* * Move the rectangle so the first item is slightly offset from @@ -379,7 +366,7 @@ static BOOL TAB_InternalGetItemRect( */ OffsetRect(itemRect, 0, - -SELECTED_TAB_OFFSET); + SELECTED_TAB_OFFSET); } else { @@ -411,23 +398,23 @@ static BOOL TAB_InternalGetItemRect( InflateRect(selectedRect, SELECTED_TAB_OFFSET, 0); /* If it also a bit higher. */ - if ((lStyle & TCS_BOTTOM) && !(lStyle & TCS_VERTICAL)) + if ((lStyle & TCS_BOTTOM) && (lStyle & TCS_VERTICAL)) + { + selectedRect->left -= 2; /* the border is thicker on the right */ + selectedRect->right += SELECTED_TAB_OFFSET; + } + else if (lStyle & TCS_VERTICAL) + { + selectedRect->left -= SELECTED_TAB_OFFSET; + selectedRect->right += 1; + } + else if (lStyle & TCS_BOTTOM) { selectedRect->bottom += SELECTED_TAB_OFFSET; } - else if((lStyle & TCS_BOTTOM) && (lStyle & TCS_VERTICAL)) + else /* not TCS_BOTTOM and not TCS_VERTICAL */ { - selectedRect->left -= 2; /* the border is thicker on the right */ - selectedRect->right += SELECTED_TAB_OFFSET; - } - else if(lStyle & TCS_VERTICAL) - { - selectedRect->left -= SELECTED_TAB_OFFSET; - selectedRect->right += 1; - } - else - { - selectedRect->top -= SELECTED_TAB_OFFSET; + selectedRect->top -= SELECTED_TAB_OFFSET; selectedRect->bottom -= 1; } } @@ -853,72 +840,53 @@ static LRESULT TAB_AdjustRect( WPARAM fLarger, LPRECT prc) { - TAB_INFO *infoPtr = TAB_GetInfoPtr(hwnd); - DWORD lStyle = GetWindowLongA(hwnd, GWL_STYLE); + TAB_INFO *infoPtr = TAB_GetInfoPtr(hwnd); + DWORD lStyle = GetWindowLongA(hwnd, GWL_STYLE); + LONG *iRightBottom, *iLeftTop; + + TRACE ("hwnd=%p fLarger=%d (%ld,%ld)-(%ld,%ld)\n", hwnd, fLarger, prc->left, prc->top, prc->right, prc->bottom); + + if(lStyle & TCS_VERTICAL) + { + iRightBottom = &(prc->right); + iLeftTop = &(prc->left); + } + else + { + iRightBottom = &(prc->bottom); + iLeftTop = &(prc->top); + } - if(lStyle & TCS_VERTICAL) - { if (fLarger) /* Go from display rectangle */ { - /* Add the height of the tabs. */ - if (lStyle & TCS_BOTTOM) - prc->right += (infoPtr->tabHeight - 2) * infoPtr->uNumRows + 2; - else - prc->left -= (infoPtr->tabHeight - 2) * infoPtr->uNumRows + 2; + /* Add the height of the tabs. */ + if (lStyle & TCS_BOTTOM) + *iRightBottom += infoPtr->tabHeight * infoPtr->uNumRows; + else + *iLeftTop -= infoPtr->tabHeight * infoPtr->uNumRows + + ((lStyle & TCS_BUTTONS)? 3 * (infoPtr->uNumRows - 1) : 0); - /* FIXME: not sure if these InflateRect's need to have different values for TCS_VERTICAL */ - /* Inflate the rectangle for the padding */ - InflateRect(prc, DISPLAY_AREA_PADDINGX, DISPLAY_AREA_PADDINGY); + /* Inflate the rectangle for the padding */ + InflateRect(prc, DISPLAY_AREA_PADDINGX, DISPLAY_AREA_PADDINGY); - /* Inflate for the border */ - InflateRect(prc, CONTROL_BORDER_SIZEX, CONTROL_BORDER_SIZEX); + /* Inflate for the border */ + InflateRect(prc, CONTROL_BORDER_SIZEX, CONTROL_BORDER_SIZEY); } else /* Go from window rectangle. */ { - /* FIXME: not sure if these InflateRect's need to have different values for TCS_VERTICAL */ - /* Deflate the rectangle for the border */ - InflateRect(prc, -CONTROL_BORDER_SIZEX, -CONTROL_BORDER_SIZEX); + /* Deflate the rectangle for the border */ + InflateRect(prc, -CONTROL_BORDER_SIZEX, -CONTROL_BORDER_SIZEY); - /* Deflate the rectangle for the padding */ - InflateRect(prc, -DISPLAY_AREA_PADDINGX, -DISPLAY_AREA_PADDINGY); + /* Deflate the rectangle for the padding */ + InflateRect(prc, -DISPLAY_AREA_PADDINGX, -DISPLAY_AREA_PADDINGY); - /* Remove the height of the tabs. */ - if (lStyle & TCS_BOTTOM) - prc->right -= (infoPtr->tabHeight - 2) * infoPtr->uNumRows + 2; - else - prc->left += (infoPtr->tabHeight - 2) * infoPtr->uNumRows + 2; + /* Remove the height of the tabs. */ + if (lStyle & TCS_BOTTOM) + *iRightBottom -= infoPtr->tabHeight * infoPtr->uNumRows; + else + *iLeftTop += (infoPtr->tabHeight) * infoPtr->uNumRows + + ((lStyle & TCS_BUTTONS)? 3 * (infoPtr->uNumRows - 1) : 0); } - } - else { - if (fLarger) /* Go from display rectangle */ - { - /* Add the height of the tabs. */ - if (lStyle & TCS_BOTTOM) - prc->bottom += (infoPtr->tabHeight - 2) * infoPtr->uNumRows + 2; - else - prc->top -= (infoPtr->tabHeight - 2) * infoPtr->uNumRows + 2; - - /* Inflate the rectangle for the padding */ - InflateRect(prc, DISPLAY_AREA_PADDINGX, DISPLAY_AREA_PADDINGY); - - /* Inflate for the border */ - InflateRect(prc, CONTROL_BORDER_SIZEX, CONTROL_BORDER_SIZEX); - } - else /* Go from window rectangle. */ - { - /* Deflate the rectangle for the border */ - InflateRect(prc, -CONTROL_BORDER_SIZEX, -CONTROL_BORDER_SIZEX); - - /* Deflate the rectangle for the padding */ - InflateRect(prc, -DISPLAY_AREA_PADDINGX, -DISPLAY_AREA_PADDINGY); - - /* Remove the height of the tabs. */ - if (lStyle & TCS_BOTTOM) - prc->bottom -= (infoPtr->tabHeight - 2) * infoPtr->uNumRows + 2; - else - prc->top += (infoPtr->tabHeight - 2) * infoPtr->uNumRows + 2; - } - } return 0; } @@ -1147,7 +1115,7 @@ static void TAB_SetItemBounds (HWND hwnd) * Make sure there is enough space for the letters + icon + growing the * selected item + extra space for the selected item. */ - infoPtr->tabHeight = item_height + SELECTED_TAB_OFFSET + + infoPtr->tabHeight = item_height + ((lStyle & TCS_BUTTONS) ? 2 : 1) * infoPtr->uVItemPadding; @@ -1201,12 +1169,13 @@ static void TAB_SetItemBounds (HWND hwnd) * Check if this is a multiline tab control and if so * check to see if we should wrap the tabs * - * Wrap all these tabs. We will arange them evenly later. + * Wrap all these tabs. We will arrange them evenly later. * */ if (((lStyle & TCS_MULTILINE) || (lStyle & TCS_VERTICAL)) && - (infoPtr->items[curItem].rect.right > clientRect.right)) + (infoPtr->items[curItem].rect.right > + (clientRect.right - CONTROL_BORDER_SIZEX - DISPLAY_AREA_PADDINGX))) { infoPtr->items[curItem].rect.right -= infoPtr->items[curItem].rect.left; @@ -1268,7 +1237,7 @@ static void TAB_SetItemBounds (HWND hwnd) /* Set the number of rows */ infoPtr->uNumRows = curItemRowCount; - /* Arange all tabs evenly if style says so */ + /* Arrange all tabs evenly if style says so */ if (!(lStyle & TCS_RAGGEDRIGHT) && ((lStyle & TCS_MULTILINE) || (lStyle & TCS_VERTICAL)) && (infoPtr->uNumItem > 0)) { INT tabPerRow,remTab; @@ -1303,17 +1272,6 @@ static void TAB_SetItemBounds (HWND hwnd) /* move to the next row, reset our current item left position and */ /* the count of items on this row */ - /* ************ FIXME FIXME FIXME *************** */ - /* */ - /* FIXME: */ - /* if vertical, */ - /* if item n and n+1 are in the same row, */ - /* then the display has n+1 lower (toward the */ - /* bottom) than n. We do it just the */ - /* opposite!!! */ - /* */ - /* ************ FIXME FIXME FIXME *************** */ - if (lStyle & TCS_VERTICAL) { /* Vert: Add the remaining tabs in the *last* remainder rows */ if (iCount >= ((iRow>=(INT)infoPtr->uNumRows - remTab)?tabPerRow + 1:tabPerRow)) { @@ -1429,8 +1387,8 @@ static void TAB_SetItemBounds (HWND hwnd) rcOriginal = *rcItem; - /* this is rotating the items by 90 degrees around the center of the control */ - rcItem->top = (clientRect.right - (rcOriginal.left - clientRect.left)) - (rcOriginal.right - rcOriginal.left); + /* this is rotating the items by 90 degrees clockwise around the center of the control */ + rcItem->top = (rcOriginal.left - clientRect.left); rcItem->bottom = rcItem->top + (rcOriginal.right - rcOriginal.left); rcItem->left = rcOriginal.top; rcItem->right = rcOriginal.bottom; @@ -1533,7 +1491,7 @@ TAB_DrawItemInterior INT oldBkMode; HFONT hOldFont; - if (drawRect == NULL) +/* if (drawRect == NULL) */ { BOOL isVisible; RECT itemRect; @@ -1557,40 +1515,75 @@ TAB_DrawItemInterior * would have liked to avoid code duplication, but couldn't figure * out how without making spaghetti of TAB_DrawItem. */ + if (iItem == infoPtr->iSelected) + *drawRect = selectedRect; + else + *drawRect = itemRect; + if (lStyle & TCS_BUTTONS) { - *drawRect = itemRect; if (iItem == infoPtr->iSelected) { - OffsetRect(drawRect, 1, 1); + drawRect->left += 4; + drawRect->top += 4; + drawRect->right -= 4; + drawRect->bottom -= 1; + } + else + { + drawRect->left += 2; + drawRect->top += 2; + drawRect->right -= 2; + drawRect->bottom -= 2; } } else { - if (iItem == infoPtr->iSelected) + if ((lStyle & TCS_VERTICAL) && (lStyle & TCS_BOTTOM)) { - *drawRect = selectedRect; - if (lStyle & TCS_BOTTOM) + if (iItem != infoPtr->iSelected) { - if (lStyle & TCS_VERTICAL) - { - drawRect->left++; - } - else - { - drawRect->top += 3; - drawRect->left += 1; - } + drawRect->left += 2; + drawRect->top += 2; + drawRect->bottom -= 2; + } + } + else if (lStyle & TCS_VERTICAL) + { + if (iItem == infoPtr->iSelected) + { + drawRect->right += 1; + } + else + { + drawRect->top += 2; + drawRect->right -= 2; + drawRect->bottom -= 2; + } + } + else if (lStyle & TCS_BOTTOM) + { + if (iItem == infoPtr->iSelected) + { + drawRect->top -= 2; + } + else + { + InflateRect(drawRect, -2, -2); + drawRect->bottom += 2; } } else - *drawRect = itemRect; - - - if (lStyle & TCS_BOTTOM && !(lStyle & TCS_VERTICAL)) { - drawRect->top--; - drawRect->bottom--; + if (iItem == infoPtr->iSelected) + { + drawRect->bottom += 3; + } + else + { + drawRect->bottom -= (infoPtr->items[iItem].rect.top != infoPtr->uNumRows-1)? 2:2; + InflateRect(drawRect, -2, 0); + } } } } @@ -1661,7 +1654,6 @@ TAB_DrawItemInterior dis.hwndItem = hwnd; /* */ dis.hDC = hdc; CopyRect(&dis.rcItem,drawRect); - InflateRect(&dis.rcItem, -2, -2); dis.itemData = infoPtr->items[iItem].lParam; /* @@ -1717,6 +1709,9 @@ TAB_DrawItemInterior if (center_offset_h < 2) center_offset_h = 2; + if (center_offset_v < 0) + center_offset_v = 0; + TRACE("for <%s>, c_o_h=%d, c_o_v=%d, draw=(%ld,%ld)-(%ld,%ld), textlen=%ld\n", debugstr_w(infoPtr->items[iItem].pszText), center_offset_h, center_offset_v, drawRect->left, drawRect->top, drawRect->right, drawRect->bottom, @@ -1773,14 +1768,22 @@ TAB_DrawItemInterior else drawRect->bottom-=center_offset_h; - drawRect->left += ((drawRect->right - drawRect->left) - ((rcText.bottom - rcText.top) + infoPtr->uVItemPadding)) / 2; + center_offset_v = ((drawRect->right - drawRect->left) - ((rcText.bottom - rcText.top) + infoPtr->uVItemPadding)) / 2; } else { drawRect->left += center_offset_h; - drawRect->top += ((drawRect->bottom - drawRect->top) - ((rcText.bottom - rcText.top) + infoPtr->uVItemPadding)) / 2; + center_offset_v = ((drawRect->bottom - drawRect->top) - ((rcText.bottom - rcText.top) + infoPtr->uVItemPadding)) / 2; } + if (center_offset_v < 0) + center_offset_v = 0; + + if(lStyle & TCS_VERTICAL) + drawRect->left += center_offset_v; + else + drawRect->top += center_offset_v; + /* Draw the text */ if(lStyle & TCS_VERTICAL) /* if we are vertical rotate the text and each character */ { @@ -1830,6 +1833,10 @@ TAB_DrawItemInterior } else { + TRACE("for <%s>, c_o_h=%d, c_o_v=%d, draw=(%ld,%ld)-(%ld,%ld), textlen=%ld\n", + debugstr_w(infoPtr->items[iItem].pszText), center_offset_h, center_offset_v, + drawRect->left, drawRect->top, drawRect->right, drawRect->bottom, + (rcText.right-rcText.left)); DrawTextW ( hdc, @@ -1958,10 +1965,10 @@ static void TAB_DrawItem( /* if leftmost draw the line longer */ if(selectedRect.top == 0) - fillRect.top += 2; + fillRect.top += CONTROL_BORDER_SIZEY; /* if rightmost draw the line longer */ if(selectedRect.bottom == clBottom) - fillRect.bottom -= 2; + fillRect.bottom -= CONTROL_BORDER_SIZEY; } if (lStyle & TCS_BOTTOM) @@ -1969,7 +1976,7 @@ static void TAB_DrawItem( /* Adjust both rectangles to match native */ r.left += (1-ZZ); - TRACE("<left> item=%d, fill=(%ld,%ld)-(%ld,%ld), edge=(%ld,%ld)-(%ld,%ld)\n", + TRACE("<right> item=%d, fill=(%ld,%ld)-(%ld,%ld), edge=(%ld,%ld)-(%ld,%ld)\n", iItem, fillRect.left,fillRect.top,fillRect.right,fillRect.bottom, r.left,r.top,r.right,r.bottom); @@ -2010,9 +2017,6 @@ static void TAB_DrawItem( } else { - /* Adjust both rectangles to match native */ - fillRect.right += (1-ZZ); - TRACE("<left> item=%d, fill=(%ld,%ld)-(%ld,%ld), edge=(%ld,%ld)-(%ld,%ld)\n", iItem, fillRect.left,fillRect.top,fillRect.right,fillRect.bottom, @@ -2049,26 +2053,23 @@ static void TAB_DrawItem( { /* These are for adjusting the drawing of a Selected tab */ /* The initial values are for the normal case of non-Selected */ - int ZZ = 1; /* Do not strech if selected */ if (iItem == infoPtr->iSelected) { - ZZ = 0; - /* if leftmost draw the line longer */ if(selectedRect.left == 0) - fillRect.left += 2; + fillRect.left += CONTROL_BORDER_SIZEX; /* if rightmost draw the line longer */ if(selectedRect.right == clRight) - fillRect.right -= 2; + fillRect.right -= CONTROL_BORDER_SIZEX; } if (lStyle & TCS_BOTTOM) { - - /* Adjust both rectangles to match native */ - fillRect.top--; - fillRect.bottom--; - r.bottom--; - r.top -= ZZ; + /* Adjust both rectangles for topmost row */ + if (infoPtr->items[iItem].rect.top == infoPtr->uNumRows-1) + { + fillRect.top -= 2; + r.top -= 1; + } TRACE("<bottom> item=%d, fill=(%ld,%ld)-(%ld,%ld), edge=(%ld,%ld)-(%ld,%ld)\n", iItem, @@ -2117,9 +2118,12 @@ static void TAB_DrawItem( } else { - - /* Adjust both rectangles to match native */ - fillRect.bottom += (1-ZZ); + /* Adjust both rectangles for bottommost row */ + if (infoPtr->items[iItem].rect.top == infoPtr->uNumRows-1) + { + fillRect.bottom += 3; + r.bottom += 2; + } TRACE("<top> item=%d, fill=(%ld,%ld)-(%ld,%ld), edge=(%ld,%ld)-(%ld,%ld)\n", iItem, @@ -2151,7 +2155,6 @@ static void TAB_DrawItem( ExtTextOutA(hdc, 0, 0, 2, &r1, NULL, 0, 0); r1.top++; DrawEdge(hdc, &r1, EDGE_RAISED, BF_SOFT|BF_DIAGONAL_ENDTOPRIGHT); - } } } @@ -2184,21 +2187,13 @@ static void TAB_DrawBorder (HWND hwnd, HDC hdc) if (infoPtr->uNumItem) { if ((lStyle & TCS_BOTTOM) && !(lStyle & TCS_VERTICAL)) - { - rect.bottom -= (infoPtr->tabHeight - 2) * infoPtr->uNumRows + 3; - } + rect.bottom -= infoPtr->tabHeight * infoPtr->uNumRows + CONTROL_BORDER_SIZEX; else if((lStyle & TCS_BOTTOM) && (lStyle & TCS_VERTICAL)) - { - rect.right -= (infoPtr->tabHeight - 2) * infoPtr->uNumRows + 2; - } + rect.right -= infoPtr->tabHeight * infoPtr->uNumRows + CONTROL_BORDER_SIZEX; else if(lStyle & TCS_VERTICAL) - { - rect.left += (infoPtr->tabHeight - 2) * infoPtr->uNumRows + 2; - } + rect.left += infoPtr->tabHeight * infoPtr->uNumRows + CONTROL_BORDER_SIZEX; else /* not TCS_VERTICAL and not TCS_BOTTOM */ - { - rect.top += (infoPtr->tabHeight - 2) * infoPtr->uNumRows + 2; - } + rect.top += infoPtr->tabHeight * infoPtr->uNumRows + CONTROL_BORDER_SIZEX; } TRACE("border=(%ld,%ld)-(%ld,%ld)\n", @@ -2418,7 +2413,7 @@ static void TAB_InvalidateTabArea( HWND hwnd, TAB_INFO* infoPtr) { - RECT clientRect, rInvalidate; + RECT clientRect, rInvalidate, rAdjClient; DWORD lStyle = GetWindowLongA(hwnd, GWL_STYLE); INT lastRow = infoPtr->uNumRows - 1; RECT rect; @@ -2427,36 +2422,34 @@ static void TAB_InvalidateTabArea( GetClientRect(hwnd, &clientRect); rInvalidate = clientRect; + rAdjClient = clientRect; + + TAB_AdjustRect(hwnd, 0, &rAdjClient); TAB_InternalGetItemRect(hwnd, infoPtr, infoPtr->uNumItem-1 , &rect, NULL); - if ((lStyle & TCS_BOTTOM) && !(lStyle & TCS_VERTICAL)) + if ((lStyle & TCS_BOTTOM) && (lStyle & TCS_VERTICAL)) { - rInvalidate.top = clientRect.bottom - - infoPtr->tabHeight - - lastRow * (infoPtr->tabHeight - 2) - - ((lStyle & TCS_BUTTONS) ? lastRow * BUTTON_SPACINGY : 0) - 3; - rInvalidate.right = clientRect.left + rect.right + 2 * SELECTED_TAB_OFFSET; - } - else if((lStyle & TCS_BOTTOM) && (lStyle & TCS_VERTICAL)) - { - rInvalidate.left = clientRect.right - infoPtr->tabHeight - - lastRow * (infoPtr->tabHeight - 2) - - ((lStyle & TCS_BUTTONS) ? lastRow * BUTTON_SPACINGY : 0) - 2; - rInvalidate.bottom = clientRect.top + rect.bottom + 2 * SELECTED_TAB_OFFSET; + rInvalidate.left = rAdjClient.right; + if (infoPtr->uNumRows == 1) + rInvalidate.bottom = clientRect.top + rect.bottom + 2 * SELECTED_TAB_OFFSET; } else if(lStyle & TCS_VERTICAL) { - rInvalidate.right = clientRect.left + infoPtr->tabHeight + - lastRow * (infoPtr->tabHeight - 2) - - ((lStyle & TCS_BUTTONS) ? lastRow * BUTTON_SPACINGY : 0) + 2; - rInvalidate.bottom = clientRect.top + rect.bottom + 2 * SELECTED_TAB_OFFSET; + rInvalidate.right = rAdjClient.left; + if (infoPtr->uNumRows == 1) + rInvalidate.bottom = clientRect.top + rect.bottom + 2 * SELECTED_TAB_OFFSET; } - else + else if (lStyle & TCS_BOTTOM) { - rInvalidate.bottom = clientRect.top + infoPtr->tabHeight + - lastRow * (infoPtr->tabHeight - 2) + - ((lStyle & TCS_BUTTONS) ? lastRow * BUTTON_SPACINGY : 0) + 2; - rInvalidate.right = clientRect.left + rect.right + 2 * SELECTED_TAB_OFFSET; + rInvalidate.top = rAdjClient.bottom; + if (infoPtr->uNumRows == 1) + rInvalidate.right = clientRect.left + rect.right + 2 * SELECTED_TAB_OFFSET; + } + else + { + rInvalidate.bottom = rAdjClient.top; + if (infoPtr->uNumRows == 1) + rInvalidate.right = clientRect.left + rect.right + 2 * SELECTED_TAB_OFFSET; } /* Punch out the updown control */ @@ -2470,8 +2463,8 @@ static void TAB_InvalidateTabArea( } TRACE("invalidate (%ld,%ld)-(%ld,%ld)\n", - clientRect.left,clientRect.top, - clientRect.right,clientRect.bottom); + rInvalidate.left, rInvalidate.top, + rInvalidate.right, rInvalidate.bottom); InvalidateRect(hwnd, &rInvalidate, TRUE); } diff --git a/reactos/lib/comctl32/toolbar.c b/reactos/lib/comctl32/toolbar.c index 73d5cf3133c..3e1fa927e31 100644 --- a/reactos/lib/comctl32/toolbar.c +++ b/reactos/lib/comctl32/toolbar.c @@ -113,6 +113,7 @@ typedef struct DWORD dwStructSize; /* size of TBBUTTON struct */ INT nHeight; /* height of the toolbar */ INT nWidth; /* width of the toolbar */ + RECT client_rect; INT nButtonHeight; INT nButtonWidth; INT nBitmapHeight; @@ -392,8 +393,8 @@ TOOLBAR_DrawImageList (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, IMAGE_LIST_T if (!TOOLBAR_IsValidBitmapIndex(infoPtr,btnPtr->iBitmap)) { if (btnPtr->iBitmap == I_IMAGENONE) return FALSE; - ERR("index %d is not valid, max %d\n", - btnPtr->iBitmap, infoPtr->nNumBitmaps); + ERR("index %d,%d is not valid, max %d\n", + HIWORD(btnPtr->iBitmap), LOWORD(btnPtr->iBitmap), infoPtr->nNumBitmaps); return FALSE; } @@ -497,7 +498,7 @@ TOOLBAR_DrawFlatSeparator (LPRECT lpRect, HDC hdc, TOOLBAR_INFO *infoPtr) /*********************************************************************** * TOOLBAR_DrawDDFlatSeparator * -* This function draws the separator that was flaged as BTNS_DROPDOWN. +* This function draws the separator that was flagged as BTNS_DROPDOWN. * In this case, the separator is a pixel high line of COLOR_BTNSHADOW, * followed by a pixel high line of COLOR_BTNHIGHLIGHT. These separators * are horizontal as opposed to the vertical separators for not dropdown @@ -565,13 +566,13 @@ TOOLBAR_DrawArrow (HDC hdc, INT left, INT top, INT colorRef) * an image list */ static void -TOOLBAR_DrawString (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, - HDC hdc, DWORD dwStyle, - RECT *rcText, LPWSTR lpText, NMTBCUSTOMDRAW *tbcd) +TOOLBAR_DrawString (TOOLBAR_INFO *infoPtr, RECT *rcText, LPWSTR lpText, + NMTBCUSTOMDRAW *tbcd) { HFONT hOldFont = 0; COLORREF clrOld = 0; UINT state = tbcd->nmcd.uItemState; + HDC hdc = tbcd->nmcd.hdc; /* draw text */ if (lpText) { @@ -604,12 +605,15 @@ TOOLBAR_DrawString (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, static void -TOOLBAR_DrawPattern (HDC hdc, LPRECT lpRect) +TOOLBAR_DrawPattern (LPRECT lpRect, NMTBCUSTOMDRAW *tbcd) { + HDC hdc = tbcd->nmcd.hdc; HBRUSH hbr = SelectObject (hdc, COMCTL32_hPattern55AABrush); INT cx = lpRect->right - lpRect->left; INT cy = lpRect->bottom - lpRect->top; - PatBlt (hdc, lpRect->left, lpRect->top, cx, cy, 0x00FA0089); + SetTextColor(hdc, tbcd->clrBtnHighlight); + SetBkColor(hdc, tbcd->clrBtnFace); + PatBlt (hdc, lpRect->left, lpRect->top, cx, cy, PATCOPY); SelectObject (hdc, hbr); } @@ -801,9 +805,10 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) /* NOTE: applications can and do alter this to customize their */ /* toolbars */ tbcd.nmcd.uItemState = TOOLBAR_TranslateState(btnPtr); + tbcd.nmcd.hdc = hdc; + tbcd.hbrMonoDither = COMCTL32_hPattern55AABrush; /* FIXME: what should these be set to ????? */ - tbcd.hbrMonoDither = 0; tbcd.hbrLines = 0; tbcd.hpenLines = 0; @@ -813,7 +818,6 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) if (infoPtr->dwBaseCustDraw & CDRF_NOTIFYITEMDRAW) { tbcd.nmcd.dwDrawStage = CDDS_ITEMPREPAINT; - tbcd.nmcd.hdc = hdc; tbcd.nmcd.rc = rc; tbcd.nmcd.dwItemSpec = btnPtr->idCommand; tbcd.nmcd.lItemlParam = btnPtr->dwData; @@ -896,7 +900,7 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) TOOLBAR_DrawMasked (infoPtr, btnPtr, hdc, rcBitmap.left, rcBitmap.top); if (!(infoPtr->dwExStyle & TBSTYLE_EX_MIXEDBUTTONS) || (btnPtr->fsStyle & BTNS_SHOWTEXT)) - TOOLBAR_DrawString (infoPtr, btnPtr, hdc, dwStyle, &rcText, lpText, &tbcd); + TOOLBAR_DrawString (infoPtr, &rcText, lpText, &tbcd); goto FINALNOTIFY; } @@ -927,7 +931,7 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) ILD_NORMAL); if (!(infoPtr->dwExStyle & TBSTYLE_EX_MIXEDBUTTONS) || (btnPtr->fsStyle & BTNS_SHOWTEXT)) - TOOLBAR_DrawString (infoPtr, btnPtr, hdc, dwStyle, &rcText, lpText, &tbcd); + TOOLBAR_DrawString (infoPtr, &rcText, lpText, &tbcd); goto FINALNOTIFY; } @@ -944,14 +948,14 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) BF_RECT | BF_MIDDLE | BF_ADJUST); } - TOOLBAR_DrawPattern (hdc, &rc); + TOOLBAR_DrawPattern (&rc, &tbcd); TOOLBAR_DrawImageList (infoPtr, btnPtr, IMAGE_LIST_DEFAULT, hdc, rcBitmap.left+1, rcBitmap.top+1, ILD_NORMAL); if (!(infoPtr->dwExStyle & TBSTYLE_EX_MIXEDBUTTONS) || (btnPtr->fsStyle & BTNS_SHOWTEXT)) - TOOLBAR_DrawString (infoPtr, btnPtr, hdc, dwStyle, &rcText, lpText, &tbcd); + TOOLBAR_DrawString (infoPtr, &rcText, lpText, &tbcd); goto FINALNOTIFY; } @@ -961,10 +965,10 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) DrawEdge (hdc, &rc, EDGE_RAISED, BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST); - TOOLBAR_DrawPattern (hdc, &rc); + TOOLBAR_DrawPattern (&rc, &tbcd); TOOLBAR_DrawMasked (infoPtr, btnPtr, hdc, rcBitmap.left, rcBitmap.top); if (!(infoPtr->dwExStyle & TBSTYLE_EX_MIXEDBUTTONS) || (btnPtr->fsStyle & BTNS_SHOWTEXT)) - TOOLBAR_DrawString (infoPtr, btnPtr, hdc, dwStyle, &rcText, lpText, &tbcd); + TOOLBAR_DrawString (infoPtr, &rcText, lpText, &tbcd); goto FINALNOTIFY; } @@ -1011,7 +1015,7 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) if (!(infoPtr->dwExStyle & TBSTYLE_EX_MIXEDBUTTONS) || (btnPtr->fsStyle & BTNS_SHOWTEXT)) - TOOLBAR_DrawString (infoPtr, btnPtr, hdc, dwStyle, &rcText, lpText, &tbcd); + TOOLBAR_DrawString (infoPtr, &rcText, lpText, &tbcd); FINALNOTIFY: if (infoPtr->dwItemCustDraw & CDRF_NOTIFYPOSTPAINT) @@ -1116,7 +1120,8 @@ TOOLBAR_MeasureString(TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, lpSize->cx = 0; lpSize->cy = 0; - if (!(btnPtr->fsState & TBSTATE_HIDDEN) && + if (infoPtr->nMaxTextRows > 0 && + !(btnPtr->fsState & TBSTATE_HIDDEN) && (!(infoPtr->dwExStyle & TBSTYLE_EX_MIXEDBUTTONS) || (btnPtr->fsStyle & BTNS_SHOWTEXT)) ) { @@ -3290,7 +3295,9 @@ TOOLBAR_GetButtonTextW (HWND hwnd, WPARAM wParam, LPARAM lParam) static LRESULT TOOLBAR_GetDisabledImageList (HWND hwnd, WPARAM wParam, LPARAM lParam) { - return (LRESULT)GETDISIMAGELIST(TOOLBAR_GetInfoPtr (hwnd), 0); + TRACE("hwnd=%p, wParam=%d, lParam=0x%lx\n", hwnd, wParam, lParam); + /* UNDOCUMENTED: wParam is actually the ID of the image list to return */ + return (LRESULT)GETDISIMAGELIST(TOOLBAR_GetInfoPtr (hwnd), wParam); } @@ -3308,7 +3315,9 @@ TOOLBAR_GetExtendedStyle (HWND hwnd) static LRESULT TOOLBAR_GetHotImageList (HWND hwnd, WPARAM wParam, LPARAM lParam) { - return (LRESULT)GETHOTIMAGELIST(TOOLBAR_GetInfoPtr (hwnd), 0); + TRACE("hwnd=%p, wParam=%d, lParam=0x%lx\n", hwnd, wParam, lParam); + /* UNDOCUMENTED: wParam is actually the ID of the image list to return */ + return (LRESULT)GETHOTIMAGELIST(TOOLBAR_GetInfoPtr (hwnd), wParam); } @@ -3330,7 +3339,9 @@ TOOLBAR_GetHotItem (HWND hwnd) static LRESULT TOOLBAR_GetDefImageList (HWND hwnd, WPARAM wParam, LPARAM lParam) { - return (LRESULT) GETDEFIMAGELIST(TOOLBAR_GetInfoPtr(hwnd), 0); + TRACE("hwnd=%p, wParam=%d, lParam=0x%lx\n", hwnd, wParam, lParam); + /* UNDOCUMENTED: wParam is actually the ID of the image list to return */ + return (LRESULT) GETDEFIMAGELIST(TOOLBAR_GetInfoPtr(hwnd), wParam); } @@ -4305,6 +4316,12 @@ TOOLBAR_SetDrawTextFlags (HWND hwnd, WPARAM wParam, LPARAM lParam) return (LRESULT)dwTemp; } +/* This function differs a bit from what MSDN says it does: + * 1. lParam contains extended style flags to OR with current style + * (MSDN isn't clear on the OR bit) + * 2. wParam appears to contain extended style flags to be reset + * (MSDN says that this parameter is reserved) + */ static LRESULT TOOLBAR_SetExtendedStyle (HWND hwnd, WPARAM wParam, LPARAM lParam) { @@ -4312,6 +4329,7 @@ TOOLBAR_SetExtendedStyle (HWND hwnd, WPARAM wParam, LPARAM lParam) DWORD dwTemp; dwTemp = infoPtr->dwExStyle; + infoPtr->dwExStyle &= ~wParam; infoPtr->dwExStyle |= (DWORD)lParam; TRACE("new style 0x%08lx\n", infoPtr->dwExStyle); @@ -4653,6 +4671,57 @@ TOOLBAR_SetVersion (HWND hwnd, INT iVersion) return iOldVersion; } + +static LRESULT +TOOLBAR_GetStringA (HWND hwnd, WPARAM wParam, LPARAM lParam) +{ + TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(hwnd); + WORD iString = HIWORD(wParam); + WORD buffersize = LOWORD(wParam); + LPSTR str = (LPSTR)lParam; + LRESULT ret = -1; + + TRACE("hwnd=%p, iString=%d, buffersize=%d, string=%p\n", hwnd, iString, buffersize, str); + + if (iString < infoPtr->nNumStrings) + { + ret = WideCharToMultiByte(CP_ACP, 0, infoPtr->strings[iString], -1, str, buffersize, NULL, NULL); + + TRACE("returning %s\n", debugstr_a(str)); + } + else + ERR("String index %d out of range (largest is %d)\n", iString, infoPtr->nNumStrings - 1); + + return ret; +} + + +static LRESULT +TOOLBAR_GetStringW (HWND hwnd, WPARAM wParam, LPARAM lParam) +{ + TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(hwnd); + WORD iString = HIWORD(wParam); + WORD len = LOWORD(wParam)/sizeof(WCHAR) - 1; + LPWSTR str = (LPWSTR)lParam; + LRESULT ret = -1; + + TRACE("hwnd=%p, iString=%d, buffersize=%d, string=%p\n", hwnd, iString, LOWORD(wParam), str); + + if (iString < infoPtr->nNumStrings) + { + len = min(len, strlenW(infoPtr->strings[iString])); + ret = (len+1)*sizeof(WCHAR); + memcpy(str, infoPtr->strings[iString], ret); + str[len] = '\0'; + + TRACE("returning %s\n", debugstr_w(str)); + } + else + ERR("String index %d out of range (largest is %d)\n", iString, infoPtr->nNumStrings - 1); + + return ret; +} + static LRESULT TOOLBAR_Unkwn45D(HWND hwnd, WPARAM wParam, LPARAM lParam) { FIXME("hwnd=%p wParam %08x lParam %08lx stub!\n", hwnd, wParam, lParam); @@ -4713,12 +4782,23 @@ TOOLBAR_Unkwn45E (HWND hwnd, WPARAM wParam, LPARAM lParam) static LRESULT TOOLBAR_Unkwn460(HWND hwnd, WPARAM wParam, LPARAM lParam) { - TRACE("hwnd=%p wParam %08x lParam %08lx\n", hwnd, wParam, lParam); + FIXME("hwnd=%p wParam %08x lParam %08lx\n", hwnd, wParam, lParam); InvalidateRect(hwnd, NULL, TRUE); return 0; } +/* UNDOCUMENTED MESSAGE: This returns the number of maximum number + * of image lists associated with the various states. */ +static LRESULT TOOLBAR_Unkwn462(HWND hwnd, WPARAM wParam, LPARAM lParam) +{ + TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(hwnd); + + TRACE("hwnd=%p wParam %08x lParam %08lx\n", hwnd, wParam, lParam); + + return max(infoPtr->cimlDef, max(infoPtr->cimlHot, infoPtr->cimlDis)); +} + static LRESULT TOOLBAR_Unkwn463 (HWND hwnd, WPARAM wParam, LPARAM lParam) { @@ -4775,7 +4855,7 @@ TOOLBAR_Unkwn463 (HWND hwnd, WPARAM wParam, LPARAM lParam) static LRESULT TOOLBAR_Unkwn464(HWND hwnd, WPARAM wParam, LPARAM lParam) { - TRACE("hwnd=%p wParam %08x lParam %08lx\n", hwnd, wParam, lParam); + FIXME("hwnd=%p wParam %08x lParam %08lx\n", hwnd, wParam, lParam); InvalidateRect(hwnd, NULL, TRUE); return 1; @@ -4789,6 +4869,8 @@ TOOLBAR_Create (HWND hwnd, WPARAM wParam, LPARAM lParam) DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); LOGFONTA logFont; + TRACE("hwnd = %p\n", hwnd); + /* initialize info structure */ infoPtr->nButtonHeight = 22; infoPtr->nButtonWidth = 24; @@ -4819,6 +4901,7 @@ TOOLBAR_Create (HWND hwnd, WPARAM wParam, LPARAM lParam) infoPtr->clrBtnShadow = CLR_DEFAULT; infoPtr->szPadding.cx = 7; infoPtr->szPadding.cy = 6; + GetClientRect(hwnd, &infoPtr->client_rect); TOOLBAR_NotifyFormat(infoPtr, (WPARAM)hwnd, (LPARAM)NF_REQUERY); SystemParametersInfoA (SPI_GETICONTITLELOGFONT, 0, &logFont, 0); @@ -5701,8 +5784,50 @@ TOOLBAR_Size (HWND hwnd, WPARAM wParam, LPARAM lParam) cx += GetSystemMetrics(SM_CYEDGE); } - SetWindowPos (hwnd, 0, x, y, cx, cy, uPosFlags | SWP_NOZORDER); + if(infoPtr->dwExStyle & TBSTYLE_EX_HIDECLIPPEDBUTTONS) + { + RECT delta_width, delta_height, client, dummy; + DWORD min_x, max_x, min_y, max_y; + TBUTTON_INFO *btnPtr; + INT i; + + GetClientRect(hwnd, &client); + if(client.right > infoPtr->client_rect.right) + { + min_x = infoPtr->client_rect.right; + max_x = client.right; + } + else + { + max_x = infoPtr->client_rect.right; + min_x = client.right; + } + if(client.bottom > infoPtr->client_rect.bottom) + { + min_y = infoPtr->client_rect.bottom; + max_y = client.bottom; + } + else + { + max_y = infoPtr->client_rect.bottom; + min_y = client.bottom; + } + + SetRect(&delta_width, min_x, 0, max_x, min_y); + SetRect(&delta_height, 0, min_y, max_x, max_y); + + TRACE("delta_width %s delta_height %s\n", wine_dbgstr_rect(&delta_width), wine_dbgstr_rect(&delta_height)); + btnPtr = infoPtr->buttons; + for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) + if(IntersectRect(&dummy, &delta_width, &btnPtr->rect) || + IntersectRect(&dummy, &delta_height, &btnPtr->rect)) + InvalidateRect(hwnd, &btnPtr->rect, TRUE); + } + + if((uPosFlags & (SWP_NOSIZE | SWP_NOMOVE)) == (SWP_NOSIZE | SWP_NOMOVE)) + SetWindowPos (hwnd, 0, x, y, cx, cy, uPosFlags | SWP_NOZORDER); } + GetClientRect(hwnd, &infoPtr->client_rect); return 0; } @@ -5867,6 +5992,12 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case TB_GETSTATE: return TOOLBAR_GetState (hwnd, wParam, lParam); + case TB_GETSTRINGA: + return TOOLBAR_GetStringA (hwnd, wParam, lParam); + + case TB_GETSTRINGW: + return TOOLBAR_GetStringW (hwnd, wParam, lParam); + case TB_GETSTYLE: return TOOLBAR_GetStyle (hwnd, wParam, lParam); @@ -6015,6 +6146,9 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case TB_UNKWN460: return TOOLBAR_Unkwn460(hwnd, wParam, lParam); + case TB_UNKWN462: + return TOOLBAR_Unkwn462(hwnd, wParam, lParam); + case TB_UNKWN463: return TOOLBAR_Unkwn463 (hwnd, wParam, lParam); diff --git a/reactos/lib/comctl32/tooltips.c b/reactos/lib/comctl32/tooltips.c index 0a7e1466b4f..fa2f8782ce8 100644 --- a/reactos/lib/comctl32/tooltips.c +++ b/reactos/lib/comctl32/tooltips.c @@ -701,7 +701,7 @@ TOOLTIPS_AddToolA (HWND hwnd, WPARAM wParam, LPARAM lParam) toolPtr->rect = lpToolInfo->rect; toolPtr->hinst = lpToolInfo->hinst; - if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)) { + if (HIWORD(lpToolInfo->lpszText) == 0) { TRACE("add string id %x!\n", (int)lpToolInfo->lpszText); toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText; } @@ -779,7 +779,7 @@ TOOLTIPS_AddToolW (HWND hwnd, WPARAM wParam, LPARAM lParam) toolPtr->rect = lpToolInfo->rect; toolPtr->hinst = lpToolInfo->hinst; - if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)) { + if (HIWORD(lpToolInfo->lpszText) == 0) { TRACE("add string id %x!\n", (int)lpToolInfo->lpszText); toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText; } @@ -842,7 +842,7 @@ TOOLTIPS_DelToolA (HWND hwnd, WPARAM wParam, LPARAM lParam) /* delete text string */ toolPtr = &infoPtr->tools[nTool]; - if ((toolPtr->hinst) && (toolPtr->lpszText)) { + if (toolPtr->lpszText) { if ( (toolPtr->lpszText != LPSTR_TEXTCALLBACKW) && (HIWORD((INT)toolPtr->lpszText) != 0) ) Free (toolPtr->lpszText); @@ -917,7 +917,7 @@ TOOLTIPS_DelToolW (HWND hwnd, WPARAM wParam, LPARAM lParam) /* delete text string */ toolPtr = &infoPtr->tools[nTool]; - if ((toolPtr->hinst) && (toolPtr->lpszText)) { + if (toolPtr->lpszText) { if ( (toolPtr->lpszText != LPSTR_TEXTCALLBACKW) && (HIWORD((INT)toolPtr->lpszText) != 0) ) Free (toolPtr->lpszText); @@ -1632,7 +1632,7 @@ TOOLTIPS_SetToolInfoA (HWND hwnd, WPARAM wParam, LPARAM lParam) toolPtr->rect = lpToolInfo->rect; toolPtr->hinst = lpToolInfo->hinst; - if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)) { + if (HIWORD(lpToolInfo->lpszText) == 0) { TRACE("set string id %x!\n", (INT)lpToolInfo->lpszText); toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText; } @@ -1689,7 +1689,7 @@ TOOLTIPS_SetToolInfoW (HWND hwnd, WPARAM wParam, LPARAM lParam) toolPtr->rect = lpToolInfo->rect; toolPtr->hinst = lpToolInfo->hinst; - if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)) { + if (HIWORD(lpToolInfo->lpszText) == 0) { TRACE("set string id %x!\n", (INT)lpToolInfo->lpszText); toolPtr->lpszText = lpToolInfo->lpszText; } @@ -1805,7 +1805,7 @@ TOOLTIPS_UpdateTipTextA (HWND hwnd, WPARAM wParam, LPARAM lParam) /* copy tool text */ toolPtr->hinst = lpToolInfo->hinst; - if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)){ + if (HIWORD(lpToolInfo->lpszText) == 0){ toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText; } else if (lpToolInfo->lpszText) { @@ -1862,7 +1862,7 @@ TOOLTIPS_UpdateTipTextW (HWND hwnd, WPARAM wParam, LPARAM lParam) /* copy tool text */ toolPtr->hinst = lpToolInfo->hinst; - if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)){ + if (HIWORD(lpToolInfo->lpszText) == 0){ toolPtr->lpszText = lpToolInfo->lpszText; } else if (lpToolInfo->lpszText) { @@ -1958,7 +1958,7 @@ TOOLTIPS_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam) if (infoPtr->tools) { for (i = 0; i < infoPtr->uNumTools; i++) { toolPtr = &infoPtr->tools[i]; - if ((toolPtr->hinst) && (toolPtr->lpszText)) { + if (toolPtr->lpszText) { if ( (toolPtr->lpszText != LPSTR_TEXTCALLBACKW) && (HIWORD((INT)toolPtr->lpszText) != 0) ) { diff --git a/reactos/lib/comctl32/treeview.c b/reactos/lib/comctl32/treeview.c index 41147d3f4de..b15d1c117c4 100644 --- a/reactos/lib/comctl32/treeview.c +++ b/reactos/lib/comctl32/treeview.c @@ -2289,8 +2289,8 @@ TREEVIEW_DrawItemLines(TREEVIEW_INFO *infoPtr, HDC hdc, TREEVIEW_ITEM *item) HBRUSH hbr = CreateSolidBrush(infoPtr->clrBk); HBRUSH hbrOld = SelectObject(hdc, hbr); - Rectangle(hdc, centerx - rectsize, centery - rectsize, - centerx + rectsize + 1, centery + rectsize + 1); + Rectangle(hdc, centerx - rectsize - 1, centery - rectsize - 1, + centerx + rectsize + 2, centery + rectsize + 2); SelectObject(hdc, hbrOld); DeleteObject(hbr); @@ -2599,7 +2599,7 @@ TREEVIEW_UpdateScrollBars(TREEVIEW_INFO *infoPtr) if (vert) { si.nPage = TREEVIEW_GetVisibleCount(infoPtr); - if ( si.nPage ) + if ( si.nPage && NULL != infoPtr->firstVisible) { si.nPos = infoPtr->firstVisible->visibleOrder; si.nMax = infoPtr->maxVisibleOrder - 1; diff --git a/reactos/lib/comctl32/winehq2ros.patch b/reactos/lib/comctl32/winehq2ros.patch index e69de29bb2d..1ec16ac12d0 100644 --- a/reactos/lib/comctl32/winehq2ros.patch +++ b/reactos/lib/comctl32/winehq2ros.patch @@ -0,0 +1,104 @@ +Index: comctl32.spec +=================================================================== +RCS file: /home/wine/wine/dlls/comctl32/comctl32.spec,v +retrieving revision 1.43 +diff -u -r1.43 comctl32.spec +--- comctl32.spec 20 Feb 2004 05:16:37 -0000 1.43 ++++ comctl32.spec 11 Mar 2004 11:16:16 -0000 +@@ -106,13 +106,13 @@ + 412 stdcall RemoveWindowSubclass(long ptr long) + 413 stdcall DefSubclassProc(long long long long) + 414 stub -noname MirrorIcon +-415 stdcall -noname DrawTextWrap(long wstr long ptr long) user32.DrawTextW +-416 stdcall -noname DrawTextExPrivWrap(long wstr long ptr long ptr) user32.DrawTextExW +-417 stdcall -noname ExtTextOutWrap(long long long long ptr wstr long ptr) gdi32.ExtTextOutW +-418 stdcall -noname GetCharWidthWrap(long long long long) gdi32.GetCharWidthW +-419 stdcall -noname GetTextExtentPointWrap(long wstr long ptr) gdi32.GetTextExtentPointW +-420 stdcall -noname GetTextExtentPoint32Wrap(long wstr long ptr) gdi32.GetTextExtentPoint32W +-421 stdcall -noname TextOutWrap(long long long wstr long) gdi32.TextOutW ++415 stdcall DrawTextWrap(long wstr long ptr long) user32.DrawTextW ++416 stdcall DrawTextExPrivWrap(long wstr long ptr long ptr) user32.DrawTextExW ++417 stdcall ExtTextOutWrap(long long long long ptr wstr long ptr) gdi32.ExtTextOutW ++418 stdcall GetCharWidthWrap(long long long long) gdi32.GetCharWidthW ++419 stdcall GetTextExtentPointWrap(long wstr long ptr) gdi32.GetTextExtentPointW ++420 stdcall GetTextExtentPoint32Wrap(long wstr long ptr) gdi32.GetTextExtentPoint32W ++421 stdcall TextOutWrap(long long long wstr long) gdi32.TextOutW + + # Functions imported by name + +Index: rebar.c +=================================================================== +RCS file: /home/wine/wine/dlls/comctl32/rebar.c,v +retrieving revision 1.85 +diff -u -r1.85 rebar.c +--- rebar.c 27 Feb 2004 04:32:54 -0000 1.85 ++++ rebar.c 11 Mar 2004 11:16:19 -0000 +@@ -985,7 +985,7 @@ + } + + /* text is visible */ +- if (lpBand->fStatus & HAS_TEXT) { ++ if ((lpBand->fStatus & HAS_TEXT) && !(lpBand->fStyle & RBBS_HIDETITLE)) { + lpBand->fDraw |= DRAW_TEXT; + lpBand->rcCapText.right = max(lpBand->rcCapText.left, + lpBand->rcCapText.right-REBAR_POST_TEXT); +@@ -1131,7 +1131,7 @@ + } + + /* text is visible */ +- if (lpBand->fStatus & HAS_TEXT) { ++ if ((lpBand->fStatus & HAS_TEXT) && !(lpBand->fStyle & RBBS_HIDETITLE)) { + lpBand->fDraw |= DRAW_TEXT; + lpBand->rcCapText.bottom = max(lpBand->rcCapText.top, + lpBand->rcCapText.bottom); +@@ -2027,7 +2027,8 @@ + } + + /* text is visible */ +- if ((lpBand->fMask & RBBIM_TEXT) && (lpBand->lpText)) { ++ if ((lpBand->fMask & RBBIM_TEXT) && (lpBand->lpText) && ++ !(lpBand->fStyle & RBBS_HIDETITLE)) { + HDC hdc = GetDC (0); + HFONT hOldFont = SelectObject (hdc, infoPtr->hFont); + SIZE size; +Index: string.c +=================================================================== +RCS file: /home/wine/wine/dlls/comctl32/string.c,v +retrieving revision 1.3 +diff -u -r1.3 string.c +--- string.c 20 Feb 2004 19:58:39 -0000 1.3 ++++ string.c 11 Mar 2004 11:16:19 -0000 +@@ -254,7 +254,7 @@ + { + TRACE("(%s,%s)\n", debugstr_w(lpszStr), debugstr_w(lpszSearch)); + +- return COMCTL32_StrStrHelperW(lpszStr, lpszSearch, strncmpiW); ++ return COMCTL32_StrStrHelperW(lpszStr, lpszSearch, (int (*)(LPCWSTR,LPCWSTR,int)) wcsnicmp); + } + + /************************************************************************** +@@ -503,7 +503,7 @@ + { + TRACE("(%s,%s)\n", debugstr_w(lpszStr), debugstr_w(lpszSearch)); + +- return COMCTL32_StrStrHelperW(lpszStr, lpszSearch, strncmpW); ++ return COMCTL32_StrStrHelperW(lpszStr, lpszSearch, (int (*)(LPCWSTR,LPCWSTR,int)) wcsncmp); + } + + /************************************************************************* +Index: toolbar.c +=================================================================== +RCS file: /home/wine/wine/dlls/comctl32/toolbar.c,v +retrieving revision 1.160 +diff -u -r1.160 toolbar.c +--- toolbar.c 7 Mar 2004 03:13:26 -0000 1.160 ++++ toolbar.c 11 Mar 2004 11:16:21 -0000 +@@ -2299,7 +2299,7 @@ + TRACE ("creating default image list!\n"); + + himlDef = ImageList_Create (infoPtr->nBitmapWidth, infoPtr->nBitmapHeight, +- ILC_COLOR | ILC_MASK, nButtons, 2); ++ ILC_COLORDDB | ILC_MASK, nButtons, 2); + TOOLBAR_InsertImageList(&infoPtr->himlDef, &infoPtr->cimlDef, himlDef, 0); + infoPtr->himlInt = himlDef; + } diff --git a/reactos/w32api/include/commctrl.h b/reactos/w32api/include/commctrl.h index 6917cb26ab3..e60656d192d 100644 --- a/reactos/w32api/include/commctrl.h +++ b/reactos/w32api/include/commctrl.h @@ -605,6 +605,8 @@ extern "C" { #define TB_SETINSERTMARKCOLOR (WM_USER+88) #define TB_GETINSERTMARKCOLOR (WM_USER+89) #define TB_MAPACCELERATORW (WM_USER+90) +#define TB_GETSTRINGW (WM_USER+91) +#define TB_GETSTRINGA (WM_USER+92) #define TB_SETCOLORSCHEME CCM_SETCOLORSCHEME #define TB_GETCOLORSCHEME CCM_GETCOLORSCHEME #define TB_SETUNICODEFORMAT CCM_SETUNICODEFORMAT @@ -3235,6 +3237,7 @@ typedef NMHDDISPINFOW NMHDDISPINFO, *LPNMHDDISPINFO; #define TB_INSERTBUTTON TB_INSERTBUTTONW #define TB_ADDBUTTONS TB_ADDBUTTONSW #define TB_MAPACCELERATOR TB_MAPACCELERATORW +#define TB_GETSTRING TB_GETSTRINGW #define TBBUTTONINFO TBBUTTONINFOW #define LPTBBUTTONINFO LPTBBUTTONINFOW #define TBN_GETDISPINFO TBN_GETDISPINFOW @@ -3372,6 +3375,7 @@ typedef NMHDDISPINFOW NMHDDISPINFO, *LPNMHDDISPINFO; #define TB_INSERTBUTTON TB_INSERTBUTTONA #define TB_ADDBUTTONS TB_ADDBUTTONSA #define TB_MAPACCELERATOR TB_MAPACCELERATORA +#define TB_GETSTRING TB_GETSTRINGA #define NMCOMBOBOXEX NMCOMBOBOXEXA #define PNMCOMBOBOXEX PNMCOMBOBOXEXA #define CBEN_DRAGBEGIN CBEN_DRAGBEGINA From 41f97f68626f93b692c254480837ae89efdcc997 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Thu, 11 Mar 2004 11:14:52 +0000 Subject: [PATCH 0428/1463] Create image list for toolbar with same depth as display svn path=/trunk/; revision=8640 --- reactos/lib/comctl32/toolbar.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/comctl32/toolbar.c b/reactos/lib/comctl32/toolbar.c index 3e1fa927e31..b695be60f59 100644 --- a/reactos/lib/comctl32/toolbar.c +++ b/reactos/lib/comctl32/toolbar.c @@ -2299,7 +2299,7 @@ TOOLBAR_AddBitmap (HWND hwnd, WPARAM wParam, LPARAM lParam) TRACE ("creating default image list!\n"); himlDef = ImageList_Create (infoPtr->nBitmapWidth, infoPtr->nBitmapHeight, - ILC_COLOR | ILC_MASK, nButtons, 2); + ILC_COLORDDB | ILC_MASK, nButtons, 2); TOOLBAR_InsertImageList(&infoPtr->himlDef, &infoPtr->cimlDef, himlDef, 0); infoPtr->himlInt = himlDef; } From 7bbe8a0aec7f042b6af1c38e8f69c16bc3bbdf92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Thu, 11 Mar 2004 11:34:51 +0000 Subject: [PATCH 0429/1463] New cursor svn path=/trunk/; revision=8641 --- reactos/lib/comctl32/.cvsignore | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/lib/comctl32/.cvsignore b/reactos/lib/comctl32/.cvsignore index 9edd5cbe53b..61131689fb2 100644 --- a/reactos/lib/comctl32/.cvsignore +++ b/reactos/lib/comctl32/.cvsignore @@ -13,6 +13,7 @@ idb_std_small.bmp idb_std_large.bmp idb_view_large.bmp idb_view_small.bmp +idc_copy.cur idc_divider.cur idc_divideropen.cur idi_dragarrow.ico From 241b66d3bde08cae459c27250dafae1f2aa8c8a7 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Thu, 11 Mar 2004 14:44:48 +0000 Subject: [PATCH 0430/1463] added buttons to test if a thread is hung svn path=/trunk/; revision=8642 --- reactos/apps/tests/multithrdwin/makefile | 4 +- .../apps/tests/multithrdwin/multithrdwin.c | 42 +++++++++++++++++-- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/reactos/apps/tests/multithrdwin/makefile b/reactos/apps/tests/multithrdwin/makefile index 003fb12c9ed..2b30a8f4428 100644 --- a/reactos/apps/tests/multithrdwin/makefile +++ b/reactos/apps/tests/multithrdwin/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.1 2003/12/14 16:11:40 weiden Exp $ +# $Id: makefile,v 1.2 2004/03/11 14:44:48 weiden Exp $ PATH_TO_TOP = ../../.. @@ -10,7 +10,7 @@ TARGET_APPTYPE = windows TARGET_NAME = multithrdwin -TARGET_SDKLIBS = kernel32.a gdi32.a +TARGET_SDKLIBS = kernel32.a gdi32.a ntdll.a TARGET_OBJECTS = $(TARGET_NAME).o diff --git a/reactos/apps/tests/multithrdwin/multithrdwin.c b/reactos/apps/tests/multithrdwin/multithrdwin.c index 0a6e005b36e..fa7e8385bbd 100644 --- a/reactos/apps/tests/multithrdwin/multithrdwin.c +++ b/reactos/apps/tests/multithrdwin/multithrdwin.c @@ -15,6 +15,7 @@ typedef struct _THRDCREATEWIN static HINSTANCE hAppInstance; static HANDLE WinCreatedEvent; +static THRDCREATEWIN wnds[3]; LRESULT WINAPI MultiWndProc(HWND, UINT, WPARAM, LPARAM); @@ -47,7 +48,10 @@ WindowThreadProc(LPVOID lpParameter) GetLastError()); return 1; } - + CreateWindow("BUTTON","Sleep",WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_GROUP|BS_PUSHBUTTON, 10, 10, 70, 23, cw->Window, (PVOID)1, hAppInstance, NULL); + CreateWindow("BUTTON","1",WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_GROUP|BS_PUSHBUTTON, 83, 10, 20, 23, cw->Window, (PVOID)2, hAppInstance, NULL); + CreateWindow("BUTTON","2",WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_GROUP|BS_PUSHBUTTON, 105, 10, 20, 23, cw->Window, (PVOID)3, hAppInstance, NULL); + CreateWindow("BUTTON","3",WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_GROUP|BS_PUSHBUTTON, 127, 10, 20, 23, cw->Window, (PVOID)4, hAppInstance, NULL); while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); @@ -65,7 +69,6 @@ WinMain(HINSTANCE hInstance, { WNDCLASS wc; int i; - static THRDCREATEWIN wnds[3]; HANDLE Threads[3]; hAppInstance = hInstance; @@ -152,6 +155,8 @@ LRESULT CALLBACK MultiWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) HDC hDC; RECT Client; HBRUSH Brush; + DWORD Ret; + static COLORREF Colors[] = { RGB(0x00, 0x00, 0x00), @@ -187,7 +192,38 @@ LRESULT CALLBACK MultiWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) } EndPaint(hWnd, &ps); break; - + + case WM_COMMAND: + switch(LOWORD(wParam)) + { + case 1: + Sleep(20000); + break; + case 2: + case 3: + case 4: + if(SendMessageTimeout(wnds[LOWORD(wParam) - 2].Window, WM_NULL, 0, 0, SMTO_ABORTIFHUNG, 1000, &Ret)) + { + DbgPrint("SendMessageTimeout() OK"); + MessageBox(hWnd, "SendMessageTimeout() OK", NULL, 0); + } + else + { + if(GetLastError() == ERROR_TIMEOUT) + { + DbgPrint("SendMessageTimeout() Timeout"); + MessageBox(hWnd, "SendMessageTimeout() Timeout", NULL, 0); + } + else + { + DbgPrint("SendMessageTimeout() Failed"); + MessageBox(hWnd, "SendMessageTimeout() Failed", NULL, 0); + } + } + break; + } + break; + case WM_DESTROY: PostQuitMessage(0); break; From 1988a7b8ea505b21b42ba88bec626a8a10d786f5 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Thu, 11 Mar 2004 14:47:44 +0000 Subject: [PATCH 0431/1463] first attempt to implement SendMessageTimeout() svn path=/trunk/; revision=8643 --- reactos/iface/addsys/w32ksvc.db | 1 + reactos/include/defines.h | 7 ++ reactos/include/errors.h | 2 + reactos/include/win32k/ntuser.h | 14 ++- reactos/lib/user32/windows/message.c | 83 ++++++++++++- reactos/subsys/win32k/include/msgqueue.h | 21 +++- reactos/subsys/win32k/ntuser/message.c | 141 +++++++++++++++++++---- reactos/subsys/win32k/ntuser/msgqueue.c | 75 ++++++++---- 8 files changed, 292 insertions(+), 52 deletions(-) diff --git a/reactos/iface/addsys/w32ksvc.db b/reactos/iface/addsys/w32ksvc.db index 497f2df899d..c7d66aa2dbf 100644 --- a/reactos/iface/addsys/w32ksvc.db +++ b/reactos/iface/addsys/w32ksvc.db @@ -473,6 +473,7 @@ NtUserScrollWindowEx 8 NtUserSendInput 3 NtUserSendMessage 5 NtUserSendMessageCallback 6 +NtUserSendMessageTimeout 8 NtUserSendNotifyMessage 4 NtUserSetActiveWindow 1 NtUserSetCapture 1 diff --git a/reactos/include/defines.h b/reactos/include/defines.h index e18e0507f43..447ead77f52 100644 --- a/reactos/include/defines.h +++ b/reactos/include/defines.h @@ -2084,6 +2084,13 @@ extern "C" { /* InitializeSecurityDescriptor */ #define SECURITY_DESCRIPTOR_REVISION (1) +/* InSendMessageEx */ +#define ISMEX_NOSEND (0) +#define ISMEX_SEND (1) +#define ISMEX_NOTIFY (2) +#define ISMEX_CALLBACK (4) +#define ISMEX_REPLIED (8) + /* JournalPlaybackProc, KeyboardProc */ #define HC_GETNEXT (1) #define HC_SKIP (2) diff --git a/reactos/include/errors.h b/reactos/include/errors.h index 914746bbe43..78d7c25bbfb 100644 --- a/reactos/include/errors.h +++ b/reactos/include/errors.h @@ -570,6 +570,8 @@ extern "C" { #define ERROR_PAGEFILE_QUOTA 1454L #define ERROR_COMMITMENT_LIMIT 1455L #define ERROR_MENU_ITEM_NOT_FOUND 1456L +#define ERROR_TIMEOUT 1460L +#define ERROR_INVALID_MONITOR_HANDLE 1461L #define ERROR_EVENTLOG_FILE_CORRUPT 1500L #define ERROR_EVENTLOG_CANT_START 1501L #define ERROR_LOG_FILE_FULL 1502L diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index bbf97b8981e..b73cef82de3 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -783,10 +783,12 @@ NtUserGetThreadDesktop( DWORD dwThreadId, DWORD Unknown1); +#define THREADSTATE_FOCUSWINDOW (1) +#define THREADSTATE_INSENDMESSAGE (2) DWORD STDCALL NtUserGetThreadState( - DWORD Unknown0); + DWORD Routine); DWORD STDCALL @@ -1167,6 +1169,16 @@ NtUserSendMessageCallback( SENDASYNCPROC lpCallBack, ULONG_PTR dwData); +LRESULT STDCALL +NtUserSendMessageTimeout(HWND hWnd, + UINT Msg, + WPARAM wParam, + LPARAM lParam, + UINT uFlags, + UINT uTimeout, + ULONG_PTR *uResult, + PNTUSERSENDMESSAGEINFO Info); + BOOL STDCALL NtUserSendNotifyMessage( diff --git a/reactos/lib/user32/windows/message.c b/reactos/lib/user32/windows/message.c index ac297024045..0ce565ff3b0 100644 --- a/reactos/lib/user32/windows/message.c +++ b/reactos/lib/user32/windows/message.c @@ -1,4 +1,4 @@ -/* $Id: message.c,v 1.35 2004/01/28 20:54:30 gvg Exp $ +/* $Id: message.c,v 1.36 2004/03/11 14:47:43 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -54,6 +54,8 @@ BOOL STDCALL InSendMessage(VOID) { + /* return(NtUserGetThreadState(THREADSTATE_INSENDMESSAGE) != ISMEX_NOSEND); */ + UNIMPLEMENTED; return FALSE; } @@ -66,6 +68,7 @@ STDCALL InSendMessageEx( LPVOID lpReserved) { + /* return NtUserGetThreadState(THREADSTATE_INSENDMESSAGE); */ UNIMPLEMENTED; return 0; } @@ -834,8 +837,64 @@ SendMessageTimeoutA( UINT uTimeout, PDWORD_PTR lpdwResult) { - UNIMPLEMENTED; - return (LRESULT)0; + MSG AnsiMsg; + MSG UcMsg; + LRESULT Result; + NTUSERSENDMESSAGEINFO Info; + + AnsiMsg.hwnd = hWnd; + AnsiMsg.message = Msg; + AnsiMsg.wParam = wParam; + AnsiMsg.lParam = lParam; + if (! MsgiAnsiToUnicodeMessage(&UcMsg, &AnsiMsg)) + { + return FALSE; + } + + Info.Ansi = TRUE; + Result = NtUserSendMessageTimeout(UcMsg.hwnd, UcMsg.message, + UcMsg.wParam, UcMsg.lParam, + fuFlags, uTimeout, (ULONG_PTR*)lpdwResult, &Info); + if(!Result) + { + return FALSE; + } + if (! Info.HandledByKernel) + { + /* We need to send the message ourselves */ + if (Info.Ansi) + { + /* Ansi message and Ansi window proc, that's easy. Clean up + the Unicode message though */ + MsgiAnsiToUnicodeCleanup(&UcMsg, &AnsiMsg); + Result = IntCallWindowProcA(Info.Ansi, Info.Proc, hWnd, Msg, wParam, lParam); + } + else + { + /* Unicode winproc. Although we started out with an Ansi message we + already converted it to Unicode for the kernel call. Reuse that + message to avoid another conversion */ + Result = IntCallWindowProcW(Info.Ansi, Info.Proc, UcMsg.hwnd, + UcMsg.message, UcMsg.wParam, UcMsg.lParam); + if (! MsgiAnsiToUnicodeReply(&UcMsg, &AnsiMsg, &Result)) + { + return FALSE; + } + } + if(lpdwResult) + *lpdwResult = Result; + Result = TRUE; + } + else + { + /* Message sent by kernel. Convert back to Ansi */ + if (! MsgiAnsiToUnicodeReply(&UcMsg, &AnsiMsg, &Result)) + { + return FALSE; + } + } + + return Result; } @@ -853,8 +912,22 @@ SendMessageTimeoutW( UINT uTimeout, PDWORD_PTR lpdwResult) { - UNIMPLEMENTED; - return (LRESULT)0; + NTUSERSENDMESSAGEINFO Info; + LRESULT Result; + + Info.Ansi = FALSE; + Result = NtUserSendMessageTimeout(hWnd, Msg, wParam, lParam, fuFlags, uTimeout, + lpdwResult, &Info); + if (! Info.HandledByKernel) + { + /* We need to send the message ourselves */ + Result = IntCallWindowProcW(Info.Ansi, Info.Proc, hWnd, Msg, wParam, lParam); + if(lpdwResult) + *lpdwResult = Result; + return TRUE; + } + + return Result; } diff --git a/reactos/subsys/win32k/include/msgqueue.h b/reactos/subsys/win32k/include/msgqueue.h index 8b354847158..c0c78d4da06 100644 --- a/reactos/subsys/win32k/include/msgqueue.h +++ b/reactos/subsys/win32k/include/msgqueue.h @@ -6,6 +6,8 @@ #include "caret.h" #include "hook.h" +#define MSQ_HUNG 5000 + typedef struct _USER_MESSAGE { LIST_ENTRY ListEntry; @@ -59,8 +61,8 @@ typedef struct _USER_MESSAGE_QUEUE ULONG QuitExitCode; /* Set if there are new messages in any of the queues. */ KEVENT NewMessages; - /* FIXME: Unknown. */ - ULONG QueueStatus; + /* Last time PeekMessage() was called. */ + ULONG LastMsgRead; /* Current window with focus (ie. receives keyboard input) for this queue. */ HWND FocusWindow; /* True if a window needs painting. */ @@ -94,9 +96,12 @@ typedef struct _USER_MESSAGE_QUEUE } USER_MESSAGE_QUEUE, *PUSER_MESSAGE_QUEUE; -LRESULT FASTCALL +BOOL FASTCALL +MsqIsHung(PUSER_MESSAGE_QUEUE MessageQueue); +NTSTATUS FASTCALL MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, - HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam); + HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam, + UINT uTimeout, BOOL Block, ULONG_PTR *uResult); VOID FASTCALL MsqInitializeMessage(PUSER_MESSAGE Message, LPMSG Msg); @@ -147,6 +152,14 @@ IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); +LRESULT STDCALL +IntSendMessageTimeout(HWND hWnd, + UINT Msg, + WPARAM wParam, + LPARAM lParam, + UINT uFlags, + UINT uTimeout, + ULONG_PTR *uResult); LRESULT FASTCALL IntDispatchMessage(MSG* Msg); BOOL FASTCALL diff --git a/reactos/subsys/win32k/ntuser/message.c b/reactos/subsys/win32k/ntuser/message.c index 3e41db76e32..f41ec4a1ae3 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.52 2004/02/24 13:27:03 weiden Exp $ +/* $Id: message.c,v 1.53 2004/03/11 14:47:44 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -47,6 +47,13 @@ #define NDEBUG #include <debug.h> +typedef struct +{ + UINT uFlags; + UINT uTimeout; + ULONG_PTR uResult; +} DOSENDMESSAGE, *PDOSENDMESSAGE; + /* FUNCTIONS *****************************************************************/ NTSTATUS FASTCALL @@ -235,6 +242,7 @@ IntPeekMessage(LPMSG Msg, UINT MsgFilterMax, UINT RemoveMsg) { + LARGE_INTEGER LargeTickCount; PUSER_MESSAGE_QUEUE ThreadQueue; BOOLEAN Present; PUSER_MESSAGE Message; @@ -244,6 +252,9 @@ IntPeekMessage(LPMSG Msg, article on GetMessage() */ ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue; + + KeQueryTickCount(&LargeTickCount); + ThreadQueue->LastMsgRead = LargeTickCount.u.LowPart; /* Inspect RemoveMsg flags */ /* FIXME: The only flag we process is PM_REMOVE - processing of others must still be implemented */ @@ -706,11 +717,29 @@ UnpackParam(LPARAM lParamPacked, UINT Msg, WPARAM wParam, LPARAM lParam) LRESULT STDCALL IntSendMessage(HWND hWnd, - UINT Msg, - WPARAM wParam, - LPARAM lParam) + UINT Msg, + WPARAM wParam, + LPARAM lParam) +{ + LRESULT Result = 0; + if(IntSendMessageTimeout(hWnd, Msg, wParam, lParam, SMTO_NORMAL, 0, &Result)) + { + return Result; + } + return 0; +} + +LRESULT STDCALL +IntSendMessageTimeout(HWND hWnd, + UINT Msg, + WPARAM wParam, + LPARAM lParam, + UINT uFlags, + UINT uTimeout, + ULONG_PTR *uResult) { LRESULT Result; + NTSTATUS Status; PWINDOW_OBJECT Window; PMSGMEMORY MsgMemoryEntry; INT lParamBufferSize; @@ -724,7 +753,7 @@ IntSendMessage(HWND hWnd, if (!Window) { SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); - return 0; + return FALSE; } Win32Thread = PsGetWin32Thread(); @@ -736,7 +765,7 @@ IntSendMessage(HWND hWnd, { /* Never send messages to exiting threads */ IntReleaseWindowObject(Window); - return 0; + return FALSE; } /* See if this message type is present in the table */ @@ -754,7 +783,7 @@ IntSendMessage(HWND hWnd, { IntReleaseWindowObject(Window); DPRINT1("Failed to pack message parameters\n"); - return -1; + return FALSE; } if (0xFFFF0000 != ((DWORD) Window->WndProcW & 0xFFFF0000)) { @@ -770,17 +799,37 @@ IntSendMessage(HWND hWnd, { IntReleaseWindowObject(Window); DPRINT1("Failed to unpack message parameters\n"); - return Result; + if(uResult) + *uResult = Result; + return TRUE; } IntReleaseWindowObject(Window); - return Result; + if(uResult) + *uResult = Result; + return TRUE; } - Result = MsqSendMessage(Window->MessageQueue, hWnd, Msg, wParam, lParam); + if(uFlags & SMTO_ABORTIFHUNG && MsqIsHung(Window->MessageQueue)) + { + IntReleaseWindowObject(Window); + /* FIXME - Set a LastError? */ + return FALSE; + } + + Status = MsqSendMessage(Window->MessageQueue, hWnd, Msg, wParam, lParam, + (uFlags & SMTO_BLOCK), uTimeout, &Result); + if(Status == STATUS_TIMEOUT) + { + IntReleaseWindowObject(Window); + SetLastWin32Error(ERROR_TIMEOUT); + return FALSE; + } IntReleaseWindowObject(Window); - return Result; + if(uResult) + *uResult = Result; + return TRUE; } static NTSTATUS FASTCALL @@ -878,12 +927,13 @@ CopyMsgToUserMem(MSG *UserModeMsg, MSG *KernelModeMsg) return STATUS_SUCCESS; } -LRESULT STDCALL -NtUserSendMessage(HWND Wnd, - UINT Msg, - WPARAM wParam, - LPARAM lParam, - PNTUSERSENDMESSAGEINFO UnsafeInfo) +LRESULT FASTCALL +IntDoSendMessage(HWND Wnd, + UINT Msg, + WPARAM wParam, + LPARAM lParam, + PDOSENDMESSAGE dsm, + PNTUSERSENDMESSAGEINFO UnsafeInfo) { LRESULT Result; NTSTATUS Status; @@ -957,16 +1007,25 @@ NtUserSendMessage(HWND Wnd, { MmCopyToCaller(UnsafeInfo, &Info, sizeof(NTUSERSENDMESSAGEINFO)); SetLastWin32Error(ERROR_INVALID_PARAMETER); - return -1; + return (dsm ? 0 : -1); } - Result = IntSendMessage(KernelModeMsg.hwnd, KernelModeMsg.message, - KernelModeMsg.wParam, KernelModeMsg.lParam); + if(!dsm) + { + Result = IntSendMessage(KernelModeMsg.hwnd, KernelModeMsg.message, + KernelModeMsg.wParam, KernelModeMsg.lParam); + } + else + { + Result = IntSendMessageTimeout(KernelModeMsg.hwnd, KernelModeMsg.message, + KernelModeMsg.wParam, KernelModeMsg.lParam, + dsm->uFlags, dsm->uTimeout, &dsm->uResult); + } Status = CopyMsgToUserMem(&UserModeMsg, &KernelModeMsg); if (! NT_SUCCESS(Status)) { MmCopyToCaller(UnsafeInfo, &Info, sizeof(NTUSERSENDMESSAGEINFO)); SetLastWin32Error(ERROR_INVALID_PARAMETER); - return -1; + return(dsm ? 0 : -1); } } @@ -979,6 +1038,46 @@ NtUserSendMessage(HWND Wnd, return Result; } +LRESULT STDCALL +NtUserSendMessageTimeout(HWND hWnd, + UINT Msg, + WPARAM wParam, + LPARAM lParam, + UINT uFlags, + UINT uTimeout, + ULONG_PTR *uResult, + PNTUSERSENDMESSAGEINFO UnsafeInfo) +{ + DOSENDMESSAGE dsm; + LRESULT Result; + + dsm.uFlags = uFlags; + dsm.uTimeout = uTimeout; + Result = IntDoSendMessage(hWnd, Msg, wParam, lParam, &dsm, UnsafeInfo); + if(uResult) + { + NTSTATUS Status; + + Status = MmCopyToCaller(uResult, &dsm.uResult, sizeof(ULONG_PTR)); + if(!NT_SUCCESS(Status)) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return FALSE; + } + } + return Result; +} + +LRESULT STDCALL +NtUserSendMessage(HWND Wnd, + UINT Msg, + WPARAM wParam, + LPARAM lParam, + PNTUSERSENDMESSAGEINFO UnsafeInfo) +{ + return IntDoSendMessage(Wnd, Msg, wParam, lParam, NULL, UnsafeInfo); +} + BOOL STDCALL NtUserSendMessageCallback(HWND hWnd, UINT Msg, diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index cbc38e4ec0d..608c4bf0fd5 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.74 2004/02/28 00:44:28 weiden Exp $ +/* $Id: msgqueue.c,v 1.75 2004/03/11 14:47:44 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -889,16 +889,17 @@ MsqSendNotifyMessage(PUSER_MESSAGE_QUEUE MessageQueue, IntUnLockMessageQueue(MessageQueue); } -LRESULT FASTCALL +NTSTATUS FASTCALL MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, - HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) + HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam, + UINT uTimeout, BOOL Block, ULONG_PTR *uResult) { PUSER_SENT_MESSAGE Message; KEVENT CompletionEvent; - PVOID WaitObjects[2]; NTSTATUS WaitStatus; LRESULT Result; PUSER_MESSAGE_QUEUE ThreadQueue; + LARGE_INTEGER Timeout; KeInitializeEvent(&CompletionEvent, NotificationEvent, FALSE); @@ -914,24 +915,44 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, IntLockMessageQueue(MessageQueue); InsertTailList(&MessageQueue->SentMessagesListHead, &Message->ListEntry); - KeSetEvent(&MessageQueue->NewMessages, IO_NO_INCREMENT, FALSE); IntUnLockMessageQueue(MessageQueue); - + KeSetEvent(&MessageQueue->NewMessages, IO_NO_INCREMENT, FALSE); + + Timeout.QuadPart = uTimeout * -10000; + ThreadQueue = PsGetWin32Thread()->MessageQueue; - WaitObjects[1] = &ThreadQueue->NewMessages; - WaitObjects[0] = &CompletionEvent; - do - { - WaitStatus = KeWaitForMultipleObjects(2, WaitObjects, WaitAny, UserRequest, - UserMode, TRUE, NULL, NULL); - while (MsqDispatchOneSentMessage(ThreadQueue)) - { - ; - } - } - while (NT_SUCCESS(WaitStatus) && STATUS_WAIT_0 != WaitStatus); - - return (STATUS_WAIT_0 == WaitStatus ? Result : -1); + if(Block) + { + /* don't process messages sent to the thread */ + WaitStatus = KeWaitForSingleObject(&CompletionEvent, UserRequest, UserMode, + FALSE, (uTimeout ? &Timeout : NULL)); + } + else + { + PVOID WaitObjects[2]; + + WaitObjects[0] = &CompletionEvent; + WaitObjects[1] = &ThreadQueue->NewMessages; + do + { + WaitStatus = KeWaitForMultipleObjects(2, WaitObjects, WaitAny, UserRequest, + UserMode, FALSE, (uTimeout ? &Timeout : NULL), NULL); + if(WaitStatus == STATUS_TIMEOUT) + {DbgPrint("MsqSendMessage timed out\n"); + break; + } + while (MsqDispatchOneSentMessage(ThreadQueue)) + { + ; + } + } + while (NT_SUCCESS(WaitStatus) && STATUS_WAIT_0 != WaitStatus); + } + + if(WaitStatus != STATUS_TIMEOUT) + *uResult = (STATUS_WAIT_0 == WaitStatus ? Result : -1); + + return WaitStatus; } VOID FASTCALL @@ -1014,9 +1035,20 @@ MsqWaitForNewMessages(PUSER_MESSAGE_QUEUE MessageQueue) NULL)); } +BOOL FASTCALL +MsqIsHung(PUSER_MESSAGE_QUEUE MessageQueue) +{ + LARGE_INTEGER LargeTickCount; + + KeQueryTickCount(&LargeTickCount); + return ((LargeTickCount.u.LowPart - MessageQueue->LastMsgRead) > MSQ_HUNG); +} + VOID FASTCALL MsqInitializeMessageQueue(struct _ETHREAD *Thread, PUSER_MESSAGE_QUEUE MessageQueue) { + LARGE_INTEGER LargeTickCount; + MessageQueue->Thread = Thread; MessageQueue->CaretInfo = (PTHRDCARETINFO)(MessageQueue + 1); InitializeListHead(&MessageQueue->PostedMessagesListHead); @@ -1027,7 +1059,8 @@ MsqInitializeMessageQueue(struct _ETHREAD *Thread, PUSER_MESSAGE_QUEUE MessageQu MessageQueue->QuitPosted = FALSE; MessageQueue->QuitExitCode = 0; KeInitializeEvent(&MessageQueue->NewMessages, SynchronizationEvent, FALSE); - MessageQueue->QueueStatus = 0; + KeQueryTickCount(&LargeTickCount); + MessageQueue->LastMsgRead = LargeTickCount.u.LowPart; MessageQueue->FocusWindow = NULL; MessageQueue->PaintPosted = FALSE; MessageQueue->PaintCount = 0; From 169c5abd2098af6d9856fbb703b5142130027ce0 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Thu, 11 Mar 2004 16:17:25 +0000 Subject: [PATCH 0432/1463] simplified calls to MsqPostMessage() svn path=/trunk/; revision=8644 --- reactos/subsys/win32k/ntuser/keyboard.c | 15 ++++--------- reactos/subsys/win32k/ntuser/message.c | 10 +++------ reactos/subsys/win32k/ntuser/msgqueue.c | 30 ++++++++++--------------- reactos/subsys/win32k/ntuser/timer.c | 4 ++-- 4 files changed, 21 insertions(+), 38 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/keyboard.c b/reactos/subsys/win32k/ntuser/keyboard.c index 1f2ca51ca91..70eb19588a5 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.25 2004/02/24 13:27:03 weiden Exp $ +/* $Id: keyboard.c,v 1.26 2004/03/11 16:17:25 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -609,7 +609,6 @@ IntTranslateKbdMessage(LPMSG lpMsg, LONG UState = 0; WCHAR wp[2] = { 0 }; MSG NewMsg = { 0 }; - PUSER_MESSAGE UMsg; PKBDTABLES keyLayout; BOOL Result = FALSE; DWORD ScanCode = 0; @@ -658,19 +657,15 @@ IntTranslateKbdMessage(LPMSG lpMsg, NewMsg.hwnd = lpMsg->hwnd; NewMsg.wParam = dead_char; NewMsg.lParam = lpMsg->lParam; - UMsg = MsqCreateMessage(&NewMsg); dead_char = 0; - if (UMsg) - MsqPostMessage(PsGetWin32Thread()->MessageQueue, UMsg); + MsqPostMessage(PsGetWin32Thread()->MessageQueue, &NewMsg); } NewMsg.hwnd = lpMsg->hwnd; NewMsg.wParam = wp[0]; NewMsg.lParam = lpMsg->lParam; - UMsg = MsqCreateMessage(&NewMsg); DPRINT( "CHAR='%c' %04x %08x\n", wp[0], wp[0], lpMsg->lParam ); - if (UMsg) - MsqPostMessage(PsGetWin32Thread()->MessageQueue, UMsg); + MsqPostMessage(PsGetWin32Thread()->MessageQueue, &NewMsg); Result = TRUE; } else if (UState == -1) @@ -681,9 +676,7 @@ IntTranslateKbdMessage(LPMSG lpMsg, NewMsg.wParam = wp[0]; NewMsg.lParam = lpMsg->lParam; dead_char = wp[0]; - UMsg = MsqCreateMessage(&NewMsg); - if (UMsg) - MsqPostMessage(PsGetWin32Thread()->MessageQueue, UMsg); + MsqPostMessage(PsGetWin32Thread()->MessageQueue, &NewMsg); Result = TRUE; } diff --git a/reactos/subsys/win32k/ntuser/message.c b/reactos/subsys/win32k/ntuser/message.c index f41ec4a1ae3..54f1cbff359 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.53 2004/03/11 14:47:44 weiden Exp $ +/* $Id: message.c,v 1.54 2004/03/11 16:17:25 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -483,7 +483,6 @@ NtUserPostMessage(HWND hWnd, { PWINDOW_OBJECT Window; MSG Mesg; - PUSER_MESSAGE Message; LARGE_INTEGER LargeTickCount; if (WM_QUIT == Msg) @@ -522,8 +521,7 @@ NtUserPostMessage(HWND hWnd, Mesg.pt.y = PsGetWin32Process()->WindowStation->SystemCursor.y; KeQueryTickCount(&LargeTickCount); Mesg.time = LargeTickCount.u.LowPart; - Message = MsqCreateMessage(&Mesg); - MsqPostMessage(Window->MessageQueue, Message); + MsqPostMessage(Window->MessageQueue, &Mesg); IntReleaseWindowObject(Window); } @@ -538,7 +536,6 @@ NtUserPostThreadMessage(DWORD idThread, { MSG Mesg; - PUSER_MESSAGE Message; PETHREAD peThread; PW32THREAD pThread; NTSTATUS Status; @@ -556,8 +553,7 @@ NtUserPostThreadMessage(DWORD idThread, Mesg.message = Msg; Mesg.wParam = wParam; Mesg.lParam = lParam; - Message = MsqCreateMessage(&Mesg); - MsqPostMessage(pThread->MessageQueue, Message); + MsqPostMessage(pThread->MessageQueue, &Mesg); ObDereferenceObject( peThread ); return TRUE; } else { diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index 608c4bf0fd5..430558ee2d1 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.75 2004/03/11 14:47:44 weiden Exp $ +/* $Id: msgqueue.c,v 1.76 2004/03/11 16:17:25 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -667,7 +667,6 @@ VOID STDCALL MsqPostKeyboardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { PUSER_MESSAGE_QUEUE FocusMessageQueue; - PUSER_MESSAGE Message; MSG Msg; DPRINT("MsqPostKeyboardMessage(uMsg 0x%x, wParam 0x%x, lParam 0x%x)\n", @@ -682,8 +681,7 @@ MsqPostKeyboardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) FocusMessageQueue = IntGetFocusMessageQueue(); if( !IntGetScreenDC() ) { if( W32kGetPrimitiveMessageQueue() ) { - Message = MsqCreateMessage(&Msg); - MsqPostMessage(W32kGetPrimitiveMessageQueue(), Message); + MsqPostMessage(W32kGetPrimitiveMessageQueue(), &Msg); } } else { if (FocusMessageQueue == NULL) @@ -696,8 +694,7 @@ MsqPostKeyboardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { Msg.hwnd = FocusMessageQueue->FocusWindow; DPRINT("Msg.hwnd = %x\n", Msg.hwnd); - Message = MsqCreateMessage(&Msg); - MsqPostMessage(FocusMessageQueue, Message); + MsqPostMessage(FocusMessageQueue, &Msg); } else { @@ -710,7 +707,6 @@ VOID STDCALL MsqPostHotKeyMessage(PVOID Thread, HWND hWnd, WPARAM wParam, LPARAM lParam) { PWINDOW_OBJECT Window; - PUSER_MESSAGE Message; PW32THREAD Win32Thread; PW32PROCESS Win32Process; MSG Mesg; @@ -753,8 +749,7 @@ MsqPostHotKeyMessage(PVOID Thread, HWND hWnd, WPARAM wParam, LPARAM lParam) // Mesg.pt.y = PsGetWin32Process()->WindowStation->SystemCursor.y; // KeQueryTickCount(&LargeTickCount); // Mesg.time = LargeTickCount.u.LowPart; - Message = MsqCreateMessage(&Mesg); - MsqPostMessage(Window->MessageQueue, Message); + MsqPostMessage(Window->MessageQueue, &Mesg); ObmDereferenceObject(Window); ObDereferenceObject (Thread); @@ -766,13 +761,6 @@ MsqPostHotKeyMessage(PVOID Thread, HWND hWnd, WPARAM wParam, LPARAM lParam) } -VOID FASTCALL -MsqInitializeMessage(PUSER_MESSAGE Message, - LPMSG Msg) -{ - RtlMoveMemory(&Message->Msg, Msg, sizeof(MSG)); -} - PUSER_MESSAGE FASTCALL MsqCreateMessage(LPMSG Msg) { @@ -784,7 +772,7 @@ MsqCreateMessage(LPMSG Msg) return NULL; } - MsqInitializeMessage(Message, Msg); + RtlMoveMemory(&Message->Msg, Msg, sizeof(MSG)); return Message; } @@ -956,8 +944,14 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, } VOID FASTCALL -MsqPostMessage(PUSER_MESSAGE_QUEUE MessageQueue, PUSER_MESSAGE Message) +MsqPostMessage(PUSER_MESSAGE_QUEUE MessageQueue, MSG* Msg) { + PUSER_MESSAGE Message; + + if(!(Message = MsqCreateMessage(Msg))) + { + return; + } IntLockMessageQueue(MessageQueue); InsertTailList(&MessageQueue->PostedMessagesListHead, &Message->ListEntry); diff --git a/reactos/subsys/win32k/ntuser/timer.c b/reactos/subsys/win32k/ntuser/timer.c index 213c22862fa..375ceb7a2b7 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.26 2004/03/06 23:09:23 hbirr Exp $ +/* $Id: timer.c,v 1.27 2004/03/11 16:17:25 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -385,7 +385,7 @@ TimerThreadMain(PVOID StartContext) continue; } - MsqPostMessage(((PW32THREAD)Thread->Win32Thread)->MessageQueue, MsqCreateMessage(&MsgTimer->Msg)); + MsqPostMessage(((PW32THREAD)Thread->Win32Thread)->MessageQueue, &MsgTimer->Msg); ThreadsToDereference[ThreadsToDereferencePos] = Thread; ++ThreadsToDereferencePos; From c07e181b14baa6a4554c0c2b785e081b9be2451c Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Thu, 11 Mar 2004 19:22:21 +0000 Subject: [PATCH 0433/1463] forgot this one, sorry svn path=/trunk/; revision=8645 --- reactos/subsys/win32k/include/msgqueue.h | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/reactos/subsys/win32k/include/msgqueue.h b/reactos/subsys/win32k/include/msgqueue.h index c0c78d4da06..e0c35d48059 100644 --- a/reactos/subsys/win32k/include/msgqueue.h +++ b/reactos/subsys/win32k/include/msgqueue.h @@ -102,16 +102,13 @@ NTSTATUS FASTCALL MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam, UINT uTimeout, BOOL Block, ULONG_PTR *uResult); -VOID FASTCALL -MsqInitializeMessage(PUSER_MESSAGE Message, - LPMSG Msg); PUSER_MESSAGE FASTCALL MsqCreateMessage(LPMSG Msg); VOID FASTCALL MsqDestroyMessage(PUSER_MESSAGE Message); VOID FASTCALL MsqPostMessage(PUSER_MESSAGE_QUEUE MessageQueue, - PUSER_MESSAGE Message); + MSG* Msg); VOID FASTCALL MsqPostQuitMessage(PUSER_MESSAGE_QUEUE MessageQueue, ULONG ExitCode); BOOLEAN STDCALL From 63c72aa8a8ecc2631f906a152c0f2bfd1009ef20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Thu, 11 Mar 2004 20:05:11 +0000 Subject: [PATCH 0434/1463] Move declaration of GetLastError() to match PSDK svn path=/trunk/; revision=8646 --- reactos/w32api/include/winbase.h | 1 + reactos/w32api/include/winuser.h | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/w32api/include/winbase.h b/reactos/w32api/include/winbase.h index c953afa9f2a..aa322ee1c54 100644 --- a/reactos/w32api/include/winbase.h +++ b/reactos/w32api/include/winbase.h @@ -1369,6 +1369,7 @@ DWORD WINAPI GetFullPathNameA(LPCSTR,DWORD,LPSTR,LPSTR*); DWORD WINAPI GetFullPathNameW(LPCWSTR,DWORD,LPWSTR,LPWSTR*); BOOL WINAPI GetHandleInformation(HANDLE,PDWORD); BOOL WINAPI GetKernelObjectSecurity(HANDLE,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR,DWORD,PDWORD); +DWORD WINAPI GetLastError(void); DWORD WINAPI GetLengthSid(PSID); void WINAPI GetLocalTime(LPSYSTEMTIME); DWORD WINAPI GetLogicalDrives(void); diff --git a/reactos/w32api/include/winuser.h b/reactos/w32api/include/winuser.h index 879860f47e7..abfc258480a 100644 --- a/reactos/w32api/include/winuser.h +++ b/reactos/w32api/include/winuser.h @@ -3377,7 +3377,6 @@ int WINAPI GetKeyNameTextA(LONG,LPSTR,int); int WINAPI GetKeyNameTextW(LONG,LPWSTR,int); SHORT WINAPI GetKeyState(int); HWND WINAPI GetLastActivePopup(HWND); -DWORD WINAPI GetLastError(void); HMENU WINAPI GetMenu(HWND); LONG WINAPI GetMenuCheckMarkDimensions(void); DWORD WINAPI GetMenuContextHelpId(HMENU); From dbdb5a1f76fffbebdbe9a531c2684334834dfdf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Thu, 11 Mar 2004 20:08:15 +0000 Subject: [PATCH 0435/1463] Sync to Wine-20040309 svn path=/trunk/; revision=8647 --- reactos/lib/cabinet/cabextract.c | 18 +++++------------- reactos/lib/cabinet/cabinet.h | 10 +++++----- reactos/lib/cabinet/winehq2ros.patch | 0 3 files changed, 10 insertions(+), 18 deletions(-) create mode 100644 reactos/lib/cabinet/winehq2ros.patch diff --git a/reactos/lib/cabinet/cabextract.c b/reactos/lib/cabinet/cabextract.c index a7350b3a42b..566cccd162f 100644 --- a/reactos/lib/cabinet/cabextract.c +++ b/reactos/lib/cabinet/cabextract.c @@ -42,14 +42,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(cabinet); -/* ReactOS Hack */ -extern inline DWORD WINAPI GetLastError(void) -{ - DWORD ret; - __asm__ __volatile__( ".byte 0x64\n\tmovl 0x34,%0" : "=r" (ret) ); - return ret; -} - THOSE_ZIP_CONSTS; /* all the file IO is abstracted into these routines: @@ -74,7 +66,7 @@ BOOL cabinet_open(struct cabinet *cab) /* seek to end of file and get the length */ if ((cab->filelen = SetFilePointer(fh, 0, NULL, FILE_END)) == INVALID_SET_FILE_POINTER) { if (GetLastError() != NO_ERROR) { - ERR("Seek END failed: %s", debugstr_a(name)); + ERR("Seek END failed: %s\n", debugstr_a(name)); CloseHandle(fh); return FALSE; } @@ -82,7 +74,7 @@ BOOL cabinet_open(struct cabinet *cab) /* return to the start of the file */ if (SetFilePointer(fh, 0, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER) { - ERR("Seek BEGIN failed: %s", debugstr_a(name)); + ERR("Seek BEGIN failed: %s\n", debugstr_a(name)); CloseHandle(fh); return FALSE; } @@ -228,7 +220,7 @@ BOOL file_open(struct cab_file *fi, BOOL lower, LPCSTR dir) fi->fh = 0; } } else - ERR("Couldn't ensure filepath for %s", debugstr_a(name)); + ERR("Couldn't ensure filepath for %s\n", debugstr_a(name)); if (!ok) { ERR("Couldn't open file %s for writing\n", debugstr_a(name)); @@ -287,7 +279,7 @@ void cabinet_skip(struct cabinet *cab, cab_off_t distance) TRACE("(cab == ^%p, distance == %u)\n", cab, distance); if (SetFilePointer(cab->fh, distance, NULL, FILE_CURRENT) == INVALID_SET_FILE_POINTER) { if (distance != INVALID_SET_FILE_POINTER) - ERR("%s", debugstr_a((char *) cab->filename)); + ERR("%s\n", debugstr_a((char *) cab->filename)); } } @@ -2099,7 +2091,7 @@ void find_cabinet_file(char **cabname, LPCSTR origcab) { } do { - TRACE("trying cab == %s", debugstr_a(cab)); + TRACE("trying cab == %s\n", debugstr_a(cab)); /* we don't want null cabinet filenames */ if (name[0] == '\0') { diff --git a/reactos/lib/cabinet/cabinet.h b/reactos/lib/cabinet/cabinet.h index 22e1bbf941e..47221d26b6d 100644 --- a/reactos/lib/cabinet/cabinet.h +++ b/reactos/lib/cabinet/cabinet.h @@ -36,12 +36,12 @@ #define CAB_SEARCH_SIZE (32*1024) -typedef unsigned char cab_UBYTE; /* 8 bits */ -typedef unsigned short cab_UWORD; /* 16 bits */ -typedef unsigned int cab_ULONG; /* 32 bits */ -typedef signed int cab_LONG; /* 32 bits */ +typedef unsigned char cab_UBYTE; /* 8 bits */ +typedef UINT16 cab_UWORD; /* 16 bits */ +typedef UINT32 cab_ULONG; /* 32 bits */ +typedef INT32 cab_LONG; /* 32 bits */ -typedef unsigned int cab_off_t; +typedef UINT32 cab_off_t; /* number of bits in a ULONG */ #ifndef CHAR_BIT diff --git a/reactos/lib/cabinet/winehq2ros.patch b/reactos/lib/cabinet/winehq2ros.patch new file mode 100644 index 00000000000..e69de29bb2d From 4798e9d2dbdbf94162d26017561408ee5f650260 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Thu, 11 Mar 2004 21:15:50 +0000 Subject: [PATCH 0436/1463] Sync to Wine-20040309 svn path=/trunk/; revision=8648 --- reactos/lib/comdlg32/Makefile.in | 2 +- reactos/lib/comdlg32/cdlg32.c | 3 - reactos/lib/comdlg32/cdlg_De.rc | 2 +- reactos/lib/comdlg32/cdlg_It.rc | 248 +++++++++++++- reactos/lib/comdlg32/cdlg_Th.rc | 456 ++++++++++++++++++++++++++ reactos/lib/comdlg32/colordlg16.c | 2 +- reactos/lib/comdlg32/filedlg.c | 106 +++--- reactos/lib/comdlg32/filedlg16.c | 20 +- reactos/lib/comdlg32/finddlg.c | 2 +- reactos/lib/comdlg32/finddlg32.c | 2 +- reactos/lib/comdlg32/fontdlg.c | 5 +- reactos/lib/comdlg32/fontdlg16.c | 2 +- reactos/lib/comdlg32/printdlg.c | 102 +++--- reactos/lib/comdlg32/printdlg.h | 8 +- reactos/lib/comdlg32/printdlg16.c | 66 ++-- reactos/lib/comdlg32/rsrc.rc | 1 + reactos/lib/comdlg32/winehq2ros.patch | 268 +++++++++++++++ 17 files changed, 1118 insertions(+), 177 deletions(-) create mode 100644 reactos/lib/comdlg32/cdlg_Th.rc create mode 100644 reactos/lib/comdlg32/winehq2ros.patch diff --git a/reactos/lib/comdlg32/Makefile.in b/reactos/lib/comdlg32/Makefile.in index f3d024d5196..91949b80fe5 100644 --- a/reactos/lib/comdlg32/Makefile.in +++ b/reactos/lib/comdlg32/Makefile.in @@ -5,7 +5,7 @@ VPATH = @srcdir@ MODULE = comdlg32.dll IMPORTS = shell32 shlwapi comctl32 winspool user32 gdi32 kernel32 ntdll ALTNAMES = commdlg.dll -EXTRALIBS = $(LIBUUID) +EXTRALIBS = -luuid SPEC_SRCS16 = $(ALTNAMES:.dll=.spec) diff --git a/reactos/lib/comdlg32/cdlg32.c b/reactos/lib/comdlg32/cdlg32.c index 40b653e788d..fc94238c6f3 100644 --- a/reactos/lib/comdlg32/cdlg32.c +++ b/reactos/lib/comdlg32/cdlg32.c @@ -19,9 +19,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include "config.h" -#include "wine/port.h" - #include <stdarg.h> #include "windef.h" diff --git a/reactos/lib/comdlg32/cdlg_De.rc b/reactos/lib/comdlg32/cdlg_De.rc index 81dd8b5dba6..de455662c11 100644 --- a/reactos/lib/comdlg32/cdlg_De.rc +++ b/reactos/lib/comdlg32/cdlg_De.rc @@ -256,7 +256,7 @@ FONT 8, "Helv" COMBOBOX IDC_LOOKIN,49,3,132,100,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP LTEXT "" , IDC_TOOLBARSTATIC, 181, 2, 122, 17, NOT WS_GROUP | NOT WS_VISIBLE - LISTBOX IDC_SHELLSTATIC,4,20,292,85, LBS_SORT | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | WS_HSCROLL | NOT WS_VISIBLE + LISTBOX IDC_SHELLSTATIC,4,20,292,85, LBS_SORT | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | WS_HSCROLL | NOT WS_VISIBLE LTEXT "Datei&name:",IDC_FILENAMESTATIC,5,112,46,8, SS_NOTIFY EDITTEXT IDC_FILENAME,54,110,155,12,ES_AUTOHSCROLL diff --git a/reactos/lib/comdlg32/cdlg_It.rc b/reactos/lib/comdlg32/cdlg_It.rc index abe863cb45d..b678f3ee5fb 100644 --- a/reactos/lib/comdlg32/cdlg_It.rc +++ b/reactos/lib/comdlg32/cdlg_It.rc @@ -1,5 +1,6 @@ /* * Copyright 1996 Tristan Tarrant + * Copyright 2004 Ivan Leo Murray-Smith * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -33,7 +34,7 @@ FONT 8, "Helv" LTEXT "&Percorso:", -1, 110, 6, 92, 9 LTEXT "", 1088, 110, 18, 92, 9, SS_NOPREFIX | WS_GROUP LISTBOX 1121, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP - LTEXT "Files di &Tipo:", 1089, 6, 104, 90, 9 + LTEXT "File di &Tipo:", 1089, 6, 104, 90, 9 COMBOBOX 1136, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP LTEXT "&Unita':", 1091, 110, 104, 92, 9 COMBOBOX 1137, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP @@ -114,6 +115,7 @@ FONT 8, "Helv" COMBOBOX 1138, 168, 110, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP } + CHOOSE_FONT DIALOG DISCARDABLE 13, 54, 264, 147 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Font" @@ -145,6 +147,7 @@ FONT 8, "Helv" CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP } + CHOOSE_COLOR DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 300, 185 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Colore" @@ -178,6 +181,7 @@ FONT 8, "Helv" PUSHBUTTON "&i",713,300,200,4,14 /* just a dummy: 'i' is like &i in "sol&id" */ } + FINDDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 236, 62 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Trova" @@ -190,6 +194,7 @@ FONT 8, "Helv" GROUPBOX "Direzione", 1072, 107, 26, 68, 28 CONTROL "&Su", 1056, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 111, 38, 24, 12 CONTROL "&Giu'", 1057, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 142, 38, 28, 12 + DEFPUSHBUTTON "&Trova Prossimo", IDOK, 180, 5, 54, 14, WS_GROUP | WS_TABSTOP PUSHBUTTON "Annulla", IDCANCEL, 182, 23, 50, 14, WS_GROUP | WS_TABSTOP PUSHBUTTON "&Aiuto", 1038, 182, 45, 50, 14, WS_GROUP | WS_TABSTOP @@ -213,3 +218,244 @@ FONT 8, "Helv" PUSHBUTTON "Annulla", IDCANCEL, 174, 55, 50, 14, WS_GROUP | WS_TABSTOP PUSHBUTTON "&Aiuto", 1038, 174, 75, 50, 14, WS_GROUP | WS_TABSTOP } + + +PRINT32 DIALOG LOADONCALL MOVEABLE DISCARDABLE 32, 32, 288, 186 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | + DS_CONTEXTHELP | DS_3DLOOK +CAPTION "Print" +FONT 8, "Helv" +{ + DEFPUSHBUTTON "OK", IDOK, 180,164, 48,14, WS_GROUP | BS_DEFPUSHBUTTON + PUSHBUTTON "Annulla", IDCANCEL, 232,164, 48,14, WS_GROUP + PUSHBUTTON "&Aiuto", pshHelp, 50, 161, 48,14, WS_GROUP + + GROUPBOX "Stampante", grp4, 8, 4, 272,84, WS_GROUP + CONTROL "Stampa su fi&le", chx1, "Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,212,70,64,12 + PUSHBUTTON "&Propriet", psh2, 212, 17, 60,14, WS_GROUP + LTEXT "&Nome:", stc6, 16, 20, 36,8 + COMBOBOX cmb4, 52, 18, 152,152,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP + LTEXT "Stato:", stc8, 16, 36, 36,10, SS_NOPREFIX + LTEXT "Dummy State", stc12, 52, 36, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "Tipo:", stc7, 16, 48, 36,10, SS_NOPREFIX + LTEXT "Dummy Type", stc11, 52, 48, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "Where:", stc10, 16, 60, 36,10, SS_NOPREFIX + LTEXT "Dummy Location", stc14, 52, 60, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "Comment:", stc9, 16, 72, 36,10, SS_NOPREFIX + LTEXT "Dummy Remark", stc13, 52, 72, 152,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + + GROUPBOX "Copie", grp2, 160, 92, 120,64, WS_GROUP + LTEXT "Numero di &copie:",stc5,168,108,68,8 + ICON "", ico3, 162,124, 76,24, WS_GROUP | SS_CENTERIMAGE + CONTROL "C&ollate", chx2,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,240,130,36,12 + EDITTEXT edt3, 240,106, 32,12, WS_GROUP | ES_NUMBER + + GROUPBOX "Print range", grp1, 8,92, 144,64, WS_GROUP + CONTROL "&Tutto", rad1,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,16,106,64,12 + CONTROL "Pa&gine", rad3,"Button",BS_AUTORADIOBUTTON,16,122,36,12 + CONTROL "&Seleczione", rad2,"Button",BS_AUTORADIOBUTTON,16,138,64,12 + EDITTEXT edt1, 74,122, 26,12, WS_GROUP | ES_NUMBER + EDITTEXT edt2, 118,122, 26,12, WS_GROUP | ES_NUMBER + RTEXT "&da:", stc2, 52,124, 20,8 + RTEXT "&a:", stc3, 100,124, 16,8 +} + +PRINT32_SETUP DIALOG LOADONCALL MOVEABLE DISCARDABLE 32, 32, 288, 178 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | + DS_CONTEXTHELP | DS_3DLOOK +CAPTION "Configurazione Stampante" +FONT 8, "Helv" +BEGIN + DEFPUSHBUTTON "OK",IDOK,180,156,48,14,WS_GROUP + PUSHBUTTON "Annulla",IDCANCEL,232,156,48,14 +/* PUSHBUTTON "Rete...", psh5, 284,156,48,14 */ + + GROUPBOX "Stampante", grp4, 8, 4, 272,84, WS_GROUP + PUSHBUTTON "&Propriet", psh2, 212, 17, 60,14, WS_GROUP + LTEXT "&Nome:", stc6, 16, 20, 36,8 + COMBOBOX cmb1, 52, 18, 152,152,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP + LTEXT "Stato:", stc8, 16, 36, 36,10, SS_NOPREFIX + LTEXT "Dummy State", stc12, 52, 36, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "Tipo:", stc7, 16, 48, 36,10, SS_NOPREFIX + LTEXT "Dummy Type", stc11, 52, 48, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "Where:", stc10, 16, 60, 36,10, SS_NOPREFIX + LTEXT "Dummy Location", stc14, 52, 60, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "Commento:", stc9, 16, 72, 36,10, SS_NOPREFIX + LTEXT "Dummy Remark", stc13, 52, 72, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + + GROUPBOX "Carta", grp2, 8, 92, 164,56, WS_GROUP + LTEXT "Di&mensione:", stc2, 16,108, 36, 8 + COMBOBOX cmb2, 52,106, 112,112,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP + LTEXT "&Origine:", stc3, 16,128, 36, 8 + COMBOBOX cmb3, 52,126, 112,112,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP + + GROUPBOX "Orientazione", grp1, 180, 92, 100,56, WS_GROUP + ICON "", ico1, 195,112, 18,20, WS_GROUP + CONTROL "O&rizzontale", rad1,"Button",BS_AUTORADIOBUTTON | WS_GROUP |WS_TABSTOP,224,106,52,12 + CONTROL "V&erticale", rad2,"Button",BS_AUTORADIOBUTTON,224,126,52,12 +END + +PAGESETUPDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 32, 32, 240, 240 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Setup di Pagina" +FONT 8, "Helv" +BEGIN + CONTROL "", rct1, 130, 0x00020006, 80, 8, 80, 80, SS_WHITERECT + CONTROL "", rct2, 130, 0x00020005, 160, 12, 4, 80, SS_GRAYRECT + CONTROL "", rct3, 130, 0x00020005, 84, 88, 80, 4, SS_GRAYRECT + GROUPBOX "Carta", grp2, 8, 96, 224, 56, BS_GROUPBOX + LTEXT "&Dimensione:", stc2, 16, 112, 36, 8 + COMBOBOX cmb2, 64, 110, 160, 160, CBS_SIMPLE|CBS_DROPDOWN|CBS_SORT|WS_GROUP|WS_TABSTOP|WS_VSCROLL + LTEXT "&Tray:", stc3, 16, 132, 36, 8 + COMBOBOX cmb3, 64, 130, 160, 160, CBS_SIMPLE|CBS_DROPDOWN|CBS_SORT|WS_GROUP|WS_TABSTOP|WS_VSCROLL + GROUPBOX "Orientazione", grp1, 8, 156, 64, 56, BS_GROUPBOX + AUTORADIOBUTTON "&Orizzontale", rad1, 16, 170, 52, 12, BS_AUTORADIOBUTTON + AUTORADIOBUTTON "&Verticale", rad2, 16, 190, 52, 12, BS_AUTORADIOBUTTON + GROUPBOX "Bordi", grp4, 80, 156, 152, 56, BS_GROUPBOX + LTEXT "&Sinistro:", stc15, 88, 172, 21, 8 + EDITTEXT edt4, 111, 170, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER + LTEXT "&Destro:", stc16, 159, 172, 27, 8 + EDITTEXT edt6, 187, 170, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER + LTEXT "&Superiore:", stc17, 88, 192, 21, 8 + EDITTEXT edt5, 111, 190, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER + LTEXT "&Inferiore:", stc18, 159, 192, 23, 8 + EDITTEXT edt7, 187, 190, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER + DEFPUSHBUTTON "OK", IDOK, 71, 220, 50, 14, BS_PUSHBUTTON + PUSHBUTTON "Annulla", IDCANCEL, 126, 220, 50, 14 + PUSHBUTTON "S&tampante...", psh3, 184, 220, 48, 14 +END + +NEWFILEOPENORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 280, 164 +STYLE DS_MODALFRAME | DS_CONTEXTHELP | WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_CLIPCHILDREN +CAPTION "Apri" +FONT 8, "Helv" +{ + LTEXT "Cerca &in:",IDC_LOOKINSTATIC,4,6,43,8, SS_NOTIFY + COMBOBOX IDC_LOOKIN,49,3,132,100,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + + LTEXT "" , IDC_TOOLBARSTATIC, 181, 2, 102, 17, NOT WS_GROUP | NOT WS_VISIBLE + LISTBOX IDC_SHELLSTATIC,4,20,272,85, LBS_SORT | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | WS_HSCROLL | NOT WS_VISIBLE + + LTEXT "Nome &file:",IDC_FILENAMESTATIC,5,112,46,8, SS_NOTIFY + EDITTEXT IDC_FILENAME,54,110,155,12,ES_AUTOHSCROLL + + LTEXT "File del &tipo:",IDC_FILETYPESTATIC,5,128,42,8, SS_NOTIFY + COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + + CONTROL "Apri in &sola lettura",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,145,100,10 + + DEFPUSHBUTTON "&Apri", IDOK,222,110,50,14 + PUSHBUTTON "Annulla", IDCANCEL,222,128,50,14 + PUSHBUTTON "&Aiuto", pshHelp,222,145,50,14 +} + +STRINGTABLE DISCARDABLE +{ + IDS_ABOUTBOX "&Informazioni sul Test FolderPicker" + IDS_DOCUMENTFOLDERS "Cartelle Documenti" + IDS_PERSONAL "Documenti" + IDS_FAVORITES "Preferiti" + IDS_PATH "Path di Sistema" + IDS_DESKTOP "Desktop" + IDS_FONTS "Font" + IDS_MYCOMPUTER "Risorse del Computer" +} + +STRINGTABLE DISCARDABLE +{ + IDS_SYSTEMFOLDERS "Cartelle di Sistema" + IDS_LOCALHARDRIVES "Dischi Rigidi Locali" + IDS_FILENOTFOUND "File non trovato" + IDS_VERIFYFILE "Controllare che il nome del file fornito sia corretto" + IDS_CREATEFILE "Il file non esiste\nCreare il file" + IDS_OVERWRITEFILE "Il file esiste gi.\nSovrascriverlo?" + IDS_INVALID_FILENAME_TITLE "Caratteri invalidi nel percorso" + IDS_INVALID_FILENAME "Il nome di un file non pu contenere i seguenrti caratteri: \n / : < > |" + IDS_PATHNOTEXISTING "Il percorso specificato non esiste" + IDS_FILENOTEXISTING "Il file non esiste" +} + +STRINGTABLE DISCARDABLE +{ + IDS_UPFOLDER "Su di un livello" + IDS_NEWFOLDER "Crea nuova directory" + IDS_LISTVIEW "Lista" + IDS_REPORTVIEW "Dettagli" + IDS_TODESKTOP "Browse to Desktop" +} + +STRINGTABLE DISCARDABLE +{ + PD32_PRINT_TITLE "Stampa" + + PD32_VALUE_UREADABLE "Entry non leggibile" + PD32_INVALID_PAGE_RANGE "Questo valore non si trova all'interno della pagina.\n\ +Usare un valore compreso tra %d e %d." + PD32_FROM_NOT_ABOVE_TO "La voce 'da' non pu eccedere la voce 'a'." + PD32_MARGINS_OVERLAP "I margini si sovrappongono o si trovano oltre \ +il limite della carta.\nPer favore ridefinire i margini." + PD32_NR_OF_COPIES_EMPTY "Il valore del numero 'Numero di copie' \ +non pu essere vuoto." + PD32_TOO_LARGE_COPIES "Questo alto numero di copie non \ +supportato dalla stampante.\nInserire un valore compreso tra 1 e %d" + PD32_PRINT_ERROR "Si verificato un errore della stampante." + PD32_NO_DEFAULT_PRINTER "Non stata impostata una stampante predefinita." + PD32_CANT_FIND_PRINTER "Stampante non trovata." + PD32_OUT_OF_MEMORY "Memoria esaurita." + PD32_GENERIC_ERROR "Si verificato un errore." + PD32_DRIVER_UNKNOWN "Driver della stampante sconosciuto." + + PD32_DEFAULT_PRINTER "Stampante predefinita; " + PD32_NR_OF_DOCUMENTS_IN_QUEUE "Ci sono %d documenti nella coda di stampa" + PD32_PRINT_ALL_X_PAGES "&Tutte le %d pagine" + PD32_MARGINS_IN_INCHES "Margini [pollici]" + PD32_MARGINS_IN_MILIMETERS "Margini [mm]" + PD32_MILIMETERS "mm" + + PD32_PRINTER_STATUS_READY "Pronto" + PD32_PRINTER_STATUS_PAUSED "In pausa; " + PD32_PRINTER_STATUS_ERROR "Errore; " + PD32_PRINTER_STATUS_PENDING_DELETION "In attesa di annullamento; " + PD32_PRINTER_STATUS_PAPER_JAM "Carta inceppata; " + PD32_PRINTER_STATUS_PAPER_OUT "Carta esaurita; " + PD32_PRINTER_STATUS_MANUAL_FEED "Feed paper manual; " + PD32_PRINTER_STATUS_PAPER_PROBLEM "Si verificato un problema con la carta; " + PD32_PRINTER_STATUS_OFFLINE "Stampante offline; " + PD32_PRINTER_STATUS_IO_ACTIVE "I/O Attivo; " + PD32_PRINTER_STATUS_BUSY "Stampante occupata; " + PD32_PRINTER_STATUS_PRINTING "Stampa in corso; " + PD32_PRINTER_STATUS_OUTPUT_BIN_FULL "Output tray is full; " + PD32_PRINTER_STATUS_NOT_AVAILABLE "Non disponibile; " + PD32_PRINTER_STATUS_WAITING "Attesa; " + PD32_PRINTER_STATUS_PROCESSING "Elaborazione; " + PD32_PRINTER_STATUS_INITIALIZING "Inizializazione; " + PD32_PRINTER_STATUS_WARMING_UP "La stampante si sta riscaldando; " + PD32_PRINTER_STATUS_TONER_LOW "Il livello del toner basso; " + PD32_PRINTER_STATUS_NO_TONER "Manca il toner; " + PD32_PRINTER_STATUS_PAGE_PUNT "Punt della pagina; " + PD32_PRINTER_STATUS_USER_INTERVENTION "Interrotto dall'utente; " + PD32_PRINTER_STATUS_OUT_OF_MEMORY "Memoria esaurita; " + PD32_PRINTER_STATUS_DOOR_OPEN "La porta stampante aperta; " + PD32_PRINTER_STATUS_SERVER_UNKNOWN "Server di stampa sconosciuto; " + PD32_PRINTER_STATUS_POWER_SAVE "Modalit risparmio energetico; " +} + +STRINGTABLE DISCARDABLE /* Color names */ +{ + IDS_COLOR_BLACK "Nero" + IDS_COLOR_MAROON "Marrone rossiccio" + IDS_COLOR_GREEN "Verde" + IDS_COLOR_OLIVE "Verde oliva" + IDS_COLOR_NAVY "Blu notte" + IDS_COLOR_PURPLE "Propora" + IDS_COLOR_TEAL "Teal" + IDS_COLOR_GRAY "Grigio" + IDS_COLOR_SILVER "Argento" + IDS_COLOR_RED "Rosso" + IDS_COLOR_LIME "Verde cedro" + IDS_COLOR_YELLOW "Giallo" + IDS_COLOR_BLUE "Blu" + IDS_COLOR_FUCHSIA "Fuchsia" + IDS_COLOR_AQUA "Aqua" + IDS_COLOR_WHITE "Bianco" +} diff --git a/reactos/lib/comdlg32/cdlg_Th.rc b/reactos/lib/comdlg32/cdlg_Th.rc new file mode 100644 index 00000000000..72dc74ed97a --- /dev/null +++ b/reactos/lib/comdlg32/cdlg_Th.rc @@ -0,0 +1,456 @@ +/* + * Copyright 2003 Jon Griffiths (With thanks to Uraiwan Tupsang 'Oi') + * + * 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 + */ + +/* + * WARNING: DO NOT CHANGE THE SIZE OF THE STANDARD DIALOG TEMPLATES. + */ + +LANGUAGE LANG_THAI, SUBLANG_DEFAULT + +OPEN_FILE DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 275, 134 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "嗷源" +FONT 8, "Helv" +{ + LTEXT "柰峥榱:", 1090, 6, 6, 76, 9 + EDITTEXT edt1, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP + LISTBOX 1120, 6, 32, 90, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP + LTEXT "浯嗝》兔:", -1, 110, 6, 92, 9 + LTEXT "", 1088, 110, 18, 92, 9, SS_NOPREFIX | WS_GROUP + LISTBOX 1121, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP + LTEXT "笛恰猛:", 1089, 6, 104, 90, 9 + COMBOBOX cmb1, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP + LTEXT "丛省:", 1091, 110, 104, 92, 9 + COMBOBOX cmb2, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "嗷源", 1, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "隆嗯浴", 2, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "锹嗨耪", pshHelp, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP + CHECKBOX "丸夜吐枰о凑虑", chx1, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP +} + + +SAVE_FILE DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 275, 134 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "貉狗住嗷绻..." +FONT 8, "Helv" +{ + LTEXT "柰峥榱:", 1090, 6, 6, 76, 9 + EDITTEXT edt1, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP + LISTBOX 1120, 6, 32, 90, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP + LTEXT "浯嗝》兔:", -1, 110, 6, 92, 9 + LTEXT "", 1088, 110, 18, 92, 9, SS_NOPREFIX | WS_GROUP + LISTBOX 1121, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP + LTEXT "笛恰猛:", 1089, 6, 104, 90, 9 + COMBOBOX cmb1, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP + LTEXT "丛省:", 1091, 110, 104, 92, 9 + COMBOBOX cmb2, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "貉狗住", 1, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "隆嗯浴", 2, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "锹嗨耪", pshHelp, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP + CHECKBOX "丸夜吐枰о凑虑", chx1, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP +} + + +PRINT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "驹辆" +FONT 8, "Helv" +{ + LTEXT "啶米柰Ь粤眷:", 1088, 6, 6, 40, 9 + LTEXT "", 1089, 60, 6, 150, 9 + GROUPBOX "妈", grp1, 6, 30, 160, 65, BS_GROUPBOX + RADIOBUTTON "费椐肆", rad1, 16, 45, 60, 12 + RADIOBUTTON "妈褪枨狗浙", rad2, 16, 60, 60, 12 + RADIOBUTTON "斯", rad3, 16, 75, 60, 12 + DEFPUSHBUTTON "驹辆", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "隆嗯浴", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "幻押岬瑙", psh1, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP + LTEXT "ㄒ:", 1090, 60, 80, 30, 9 + LTEXT "疏Ф支:", 1091, 120, 80, 30, 9 + LTEXT "へ揖∫勉:", 1092, 6, 100, 76, 9 + COMBOBOX cmb1, 80, 100, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + CHECKBOX "驹辆爨荤贯块", chx1, 20, 100, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "妈", chx2, 160, 100, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP +} + + +PRINT_SETUP DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "幻押幛瑙啶米柰Ь粤眷" +FONT 8, "Helv" +{ + GROUPBOX "啶米柰Ь粤眷", grp1, 6, 10, 180, 65, BS_GROUPBOX + RADIOBUTTON "啶米柰Ь粤眷&Default", rad1, 16, 20, 80, 12 + LTEXT "[淞桎撮嗯淄", 1088, 35, 35, 120, 9 + RADIOBUTTON "啶米柰Ь粤眷Specific", rad2, 16, 50, 80, 12 + COMBOBOX cmb1, 35, 65, 149, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "怠脓", IDOK, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "隆嗯浴", IDCANCEL, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "幻押岬瑙", psh1, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP + GROUPBOX "氛确咬∫们咬", grp2, 6, 85, 100, 50, BS_GROUPBOX + RADIOBUTTON "∫玫验", rad3, 50, 100, 40, 12 + RADIOBUTTON "峁枪凸", rad4, 50, 115, 40, 12 + ICON "LANDSCAP", stc10, 10, 95, 32, 32 + ICON "PORTRAIT", stc11, 10, 95, 32, 32 + GROUPBOX "∶写疑", grp3, 120, 85, 180, 50, BS_GROUPBOX + LTEXT "⒐掖", 1089, 130, 95, 30, 9 + LTEXT "ㄒ", 1090, 130, 110, 30, 9 + COMBOBOX cmb2, 155, 95, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + COMBOBOX cmb3, 155, 110, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP +} + + +CHOOSE_FONT DIALOG DISCARDABLE 13, 54, 264, 147 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "甸峭选擅" +FONT 8, "Helv" +{ + LTEXT "甸峭选擅:",stc1 ,6,3,40,9 + COMBOBOX cmb1, 6,13,94,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | + CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE + LTEXT "觅会汉甸峭选擅:",stc2 ,108,3,44,9 + COMBOBOX cmb2,108,13,64,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | + WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE + LTEXT "⒐掖:",stc3,179,3,30,9 + COMBOBOX cmb3,179,13,32,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | + WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE | CBS_SORT + DEFPUSHBUTTON "怠脓",IDOK,218,6,40,14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON + PUSHBUTTON "隆嗯浴",IDCANCEL,218,23,40,14,WS_GROUP | WS_TABSTOP + PUSHBUTTON "琳寂费狗", psh3,218,40,40,14,WS_GROUP | WS_TABSTOP + PUSHBUTTON "锹嗨耪" , pshHelp,218,57,40,14,WS_GROUP | WS_TABSTOP + GROUPBOX "Effects",grp1,6,72,84,34,WS_GROUP + CHECKBOX "Stri&keout", chx1, 10,82,50,10, BS_AUTOCHECKBOX | WS_TABSTOP + CHECKBOX "⒄脆书广甸", chx2, 10,94,50,10, BS_AUTOCHECKBOX + LTEXT "收:", stc4 ,6,110,30,9 + COMBOBOX cmb4,6,120,84,100,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | + CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP + GROUPBOX "笛峭妈咬",grp2,98,72,160,49,WS_GROUP + CTEXT "A贐C、",stc5,104,81,149,37,SS_NOPREFIX | NOT WS_VISIBLE +} + + +CHOOSE_COLOR DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 300, 185 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "收" +FONT 8, "Helv" +{ + LTEXT "&Basic Colors:", 1088, 4, 4, 140, 10 + LTEXT "'收氛琛硪斯脆艇':", 1089, 4, 106, 140, 10 + LTEXT "收 | 裂韫ぇ", 1090, 150, 151, 48, 10 + LTEXT "收岽:", 726 /*1094*/,249,126,24,10 + EDITTEXT 706, 275,124,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "收啖章:",727/*1095*/,249,140,24,10 + EDITTEXT 707, 275,138,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "收块:",728 /*1096*/,249,154,24,10 + EDITTEXT 708, 275,152,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "&H:" ,723 /*1091*/,202,126,22,10 + EDITTEXT 703, 226,124,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "&S:" ,724 /*1092*/,202,140,22,10 + EDITTEXT 704, 226,138,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "&L:" ,725 /*1093*/,202,154,22,10 + EDITTEXT 705, 226,152,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP + CONTROL "" ,720,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP,4,14,140,86 + CONTROL "" ,721,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP,4,116,140,28 + CONTROL "" ,710,"STATIC",WS_BORDER|SS_SIMPLE|WS_TABSTOP|WS_GROUP, 152,4,118,116 + CONTROL "" ,702,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP, 278,4,8,116 + CONTROL "" ,709,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP, 152,124,40,26 + DEFPUSHBUTTON "怠脓", 1, 4, 166, 44, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "隆嗯浴", 2, 52, 166, 44, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "锹嗨耪", pshHelp,100,166, 44, 14 + PUSHBUTTON "嗑澡拎㈤忆 '收氛琛硪斯脆艇'", 712/*1024*/, 152, 166, 142, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "幻押岬瑙 '收氛琛硪斯脆艇' >>", 719/*1025*/, 4, 150, 142, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&i",713,300,200,4,14 /* just a dummy: 'i' is like &i in "sol&id" */ +} + + +FINDDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 236, 62 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "ら顾" +FONT 8, "Helv" +{ + LTEXT "㈤亭且练栅楣艘:", -1, 4, 8, 42, 8 + EDITTEXT edt1, 47, 7, 128, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + CHECKBOX "得А压坟〉亚脱∩", chx1, 4, 26, 100, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "驹ㄒ贸业亚嗯纭-闼", chx2, 4, 42, 64, 12, BS_AUTOCHECKBOX | WS_TABSTOP + GROUPBOX "芬", grp1, 107, 26, 68, 28 + CONTROL "⒅楣", rad1, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 111, 38, 20, 12 + CONTROL "脓", rad2, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 138, 38, 30, 12 + + DEFPUSHBUTTON "ら顾业柰浠", IDOK, 182, 5, 50, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON + PUSHBUTTON "隆嗯浴", IDCANCEL , 182, 23, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "锹嗨耪", pshHelp , 182, 45, 50, 14, WS_GROUP | WS_TABSTOP +} + + +REPLACEDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 230, 94 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "岱狗" +FONT 8, "Helv" +{ + LTEXT "㈤亭且练栅楣艘:", -1, 4, 9, 48, 8 + EDITTEXT edt1, 54, 7, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "∫冕饭氛㈤亭且:", -1, 4, 26, 48, 8 + EDITTEXT edt2, 54, 24, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + CHECKBOX "得А压坟〉亚脱∩", chx1, 5, 46, 104, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "驹ㄒ贸业亚嗯纭-闼", chx2, 5, 62, 59, 12, BS_AUTOCHECKBOX | WS_TABSTOP + + DEFPUSHBUTTON "ら顾业柰浠", IDOK, 174, 4, 50, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON + PUSHBUTTON "岱狗", psh1 , 174, 21, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "岱狗辗学肆", psh2 , 174, 38, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "隆嗯浴", IDCANCEL , 174, 55, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "锹嗨耪", pshHelp , 174, 75, 50, 14, WS_GROUP | WS_TABSTOP +} + + +PRINT32 DIALOG LOADONCALL MOVEABLE DISCARDABLE 32, 32, 288, 186 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | + DS_CONTEXTHELP | DS_3DLOOK +CAPTION "驹辆" +FONT 8, "Helv" +{ + DEFPUSHBUTTON "怠脓", IDOK, 180,164, 48,14, WS_GROUP | BS_DEFPUSHBUTTON + PUSHBUTTON "隆嗯浴", IDCANCEL, 232,164, 48,14, WS_GROUP + PUSHBUTTON "锹嗨耪", pshHelp, 50, 161, 48,14, WS_GROUP + + GROUPBOX "啶米柰Ь粤眷", grp4, 8, 4, 272,84, WS_GROUP + CONTROL "驹辆爨荤贯块", chx1, "Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,212,70,64,12 + PUSHBUTTON "へ呈梁训", psh2, 212, 17, 60,14, WS_GROUP + LTEXT "柰:", stc6, 16, 20, 36,8 + COMBOBOX cmb4, 52, 18, 152,152,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP + LTEXT "鸵∫绵っ阻艇:", stc8, 16, 36, 36,10, SS_NOPREFIX + LTEXT "淞枇", stc12, 52, 36, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "岷:", stc7, 16, 48, 36,10, SS_NOPREFIX + LTEXT "淞枇", stc11, 52, 48, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "氛渌:", stc10, 16, 60, 36,10, SS_NOPREFIX + LTEXT "淞枇", stc14, 52, 60, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "㈤亭且:", stc9, 16, 72, 36,10, SS_NOPREFIX + LTEXT "淞枇", stc13, 52, 72, 152,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + + GROUPBOX "薯亦挂", grp2, 160, 92, 120,64, WS_GROUP + LTEXT "≌枋硪喙:",stc5,168,108,68,8 + ICON "", ico3, 162,124, 76,24, WS_GROUP | SS_CENTERIMAGE + CONTROL "ㄑ脆谜搂狄僚硪囱", chx2,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,240,130,36,12 + EDITTEXT edt3, 240,106, 32,12, WS_GROUP | ES_NUMBER + + GROUPBOX "妈", grp1, 8,92, 144,64, WS_GROUP + CONTROL "费椐肆", rad1,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,16,106,64,12 + CONTROL "斯", rad3,"Button",BS_AUTORADIOBUTTON,16,122,36,12 + CONTROL "妈褪枨狗浙", rad2,"Button",BS_AUTORADIOBUTTON,16,138,64,12 + EDITTEXT edt1, 74,122, 26,12, WS_GROUP | ES_NUMBER + EDITTEXT edt2, 118,122, 26,12, WS_GROUP | ES_NUMBER + RTEXT "ㄒ:", stc2, 52,124, 20,8 + RTEXT "疏Ф支:", stc3, 100,124, 16,8 +} + +PRINT32_SETUP DIALOG LOADONCALL MOVEABLE DISCARDABLE 32, 32, 288, 178 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | + DS_CONTEXTHELP | DS_3DLOOK +CAPTION "幻押岬瑙啶米柰Ь粤眷" +FONT 8, "Helv" +BEGIN + DEFPUSHBUTTON "怠脓",IDOK,180,156,48,14,WS_GROUP + PUSHBUTTON "隆嗯浴",IDCANCEL,232,156,48,14 +/* PUSHBUTTON "Network...", psh5, 284,156,48,14 */ + + GROUPBOX "啶米柰Ь粤眷", grp4, 8, 4, 272,84, WS_GROUP + PUSHBUTTON "へ呈梁训", psh2, 212, 17, 60,14, WS_GROUP + LTEXT "柰:", stc6, 16, 20, 36,8 + COMBOBOX cmb1, 52, 18, 152,152,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP + LTEXT "鸵∫绵っ阻艇:", stc8, 16, 36, 36,10, SS_NOPREFIX + LTEXT "淞枇", stc12, 52, 36, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "岷:", stc7, 16, 48, 36,10, SS_NOPREFIX + LTEXT "淞枇", stc11, 52, 48, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "氛渌:", stc10, 16, 60, 36,10, SS_NOPREFIX + LTEXT "淞枇", stc14, 52, 60, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "㈤亭且:", stc9, 16, 72, 36,10, SS_NOPREFIX + LTEXT "淞枇", stc13, 52, 72, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + + GROUPBOX "∶写疑", grp2, 8, 92, 164,56, WS_GROUP + LTEXT "⒐掖:", stc2, 16,108, 36, 8 + COMBOBOX cmb2, 52,106, 112,112,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP + LTEXT "ㄒ′斯:", stc3, 16,128, 36, 8 + COMBOBOX cmb3, 52,126, 112,112,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP + + GROUPBOX "氛确咬∫们咬", grp1, 180, 92, 100,56, WS_GROUP + ICON "", ico1, 195,112, 18,20, WS_GROUP + CONTROL "∫玫验", rad1,"Button",BS_AUTORADIOBUTTON | WS_GROUP |WS_TABSTOP,224,106,52,12 + CONTROL "峁枪凸", rad2,"Button",BS_AUTORADIOBUTTON,224,126,52,12 +END + +PAGESETUPDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 32, 32, 240, 240 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "幻押岬瑙" +FONT 8, "Helv" +BEGIN + CONTROL "", rct1, 130, 0x00020006, 80, 8, 80, 80, SS_WHITERECT + CONTROL "", rct2, 130, 0x00020005, 160, 12, 4, 80, SS_GRAYRECT + CONTROL "", rct3, 130, 0x00020005, 84, 88, 80, 4, SS_GRAYRECT + GROUPBOX "∶写疑", grp2, 8, 96, 224, 56, BS_GROUPBOX + LTEXT "⒐掖:", stc2, 16, 112, 36, 8 + COMBOBOX cmb2, 64, 110, 160, 160, CBS_SIMPLE|CBS_DROPDOWN|CBS_SORT|WS_GROUP|WS_TABSTOP|WS_VSCROLL + LTEXT "兑:", stc3, 16, 132, 36, 8 + COMBOBOX cmb3, 64, 130, 160, 160, CBS_SIMPLE|CBS_DROPDOWN|CBS_SORT|WS_GROUP|WS_TABSTOP|WS_VSCROLL + GROUPBOX "氛确咬∫们咬", grp1, 8, 156, 64, 56, BS_GROUPBOX + AUTORADIOBUTTON "∫玫验", rad1, 16, 170, 52, 12, BS_AUTORADIOBUTTON + AUTORADIOBUTTON "峁枪凸", rad2, 16, 190, 52, 12, BS_AUTORADIOBUTTON + GROUPBOX "⑼骸眯匆", grp4, 80, 156, 152, 56, BS_GROUPBOX + LTEXT "衣:", stc15, 88, 172, 21, 8 + EDITTEXT edt4, 111, 170, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER + LTEXT "⑶:", stc16, 159, 172, 27, 8 + EDITTEXT edt6, 187, 170, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER + LTEXT "汗:", stc17, 88, 192, 21, 8 + EDITTEXT edt5, 111, 190, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER + LTEXT "盆咬:", stc18, 159, 192, 23, 8 + EDITTEXT edt7, 187, 190, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER + DEFPUSHBUTTON "怠脓", IDOK, 71, 220, 50, 14, BS_PUSHBUTTON + PUSHBUTTON "隆嗯浴", IDCANCEL, 126, 220, 50, 14 + PUSHBUTTON "啶米柰Ь粤眷...", psh3, 184, 220, 48, 14 +END + +NEWFILEOPENORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 280, 164 +STYLE DS_MODALFRAME | DS_CONTEXTHELP | WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_CLIPCHILDREN +CAPTION "嗷源" +FONT 8, "Helv" +{ + LTEXT "促㈤咬愎:",IDC_LOOKINSTATIC,4,6,43,8, SS_NOTIFY + COMBOBOX IDC_LOOKIN,49,3,132,100,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + + LTEXT "" , IDC_TOOLBARSTATIC, 181, 2, 102, 17, NOT WS_GROUP | NOT WS_VISIBLE + LISTBOX IDC_SHELLSTATIC,4,20,272,85, LBS_SORT | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | WS_HSCROLL | NOT WS_VISIBLE + + LTEXT "柰峥榱:",IDC_FILENAMESTATIC,5,112,46,8, SS_NOTIFY + EDITTEXT IDC_FILENAME,54,110,155,12,ES_AUTOHSCROLL + + LTEXT "笛恰猛:",IDC_FILETYPESTATIC,5,128,42,8, SS_NOTIFY + COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + + CONTROL "丸夜吐枰о凑虑",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,145,100,10 + + DEFPUSHBUTTON "嗷源", IDOK,222,110,50,14 + PUSHBUTTON "隆嗯浴", IDCANCEL,222,128,50,14 + PUSHBUTTON "锹嗨耪", pshHelp,222,145,50,14 +} + +STRINGTABLE DISCARDABLE +{ + IDS_ABOUTBOX "唷砧虑⊙ FolderPicker Test" + IDS_DOCUMENTFOLDERS "Document Folders" + IDS_PERSONAL "咀楣氛枋枨沟亚" + IDS_FAVORITES "氛瑜谚顾寡淄" + IDS_PATH "System Path" + IDS_DESKTOP "咀楣氛璺缨夜" + IDS_FONTS "囱峭选擅" + IDS_MYCOMPUTER "啶米柰枨沟亚" +} + +STRINGTABLE DISCARDABLE +{ + IDS_SYSTEMFOLDERS "System Folders" + IDS_LOCALHARDRIVES "我渺创允§啶米柰枨沟亚" + IDS_FILENOTFOUND "淞杈横块" + IDS_VERIFYFILE "Please verify if the correct file name was given" + IDS_CREATEFILE "File does not exist\nDo you want to create file" + IDS_OVERWRITEFILE "File does already exist.\nDo you want to replace it?" + IDS_INVALID_FILENAME_TITLE "Invalid character(s) in path" + IDS_INVALID_FILENAME "愎柰峥榱悛殇龄撮甸枪臻:\n / : < > |" + IDS_PATHNOTEXISTING "淞杈轰脆谩吠谜" + IDS_FILENOTEXISTING "淞杈横块" +} + +STRINGTABLE DISCARDABLE +{ + IDS_UPFOLDER "⒅楣斯骤写押" + IDS_NEWFOLDER "拭橐т脆谩吠谜闼凌" + IDS_LISTVIEW "№宜勾" + IDS_REPORTVIEW "靡屡朽驼麓" + IDS_TODESKTOP "ら顾颐衣∫镁组狗砧酚б" +} + +STRINGTABLE DISCARDABLE +{ + PD32_PRINT_TITLE "驹辆" + + PD32_VALUE_UREADABLE "丸夜靡隆颐淞浯" + PD32_INVALID_PAGE_RANGE "∶爻亦抛柰∷烈锣泞眯且 %d 吨 %d" + PD32_FROM_NOT_ABOVE_TO "'ㄒ' 佃艇嗷绻归吐¤切 '疏Ф支'" + PD32_MARGINS_OVERLAP "⑼骸眯匆摄谁栲≡逛籠n∶爻亦抛柰°肆" + PD32_NR_OF_COPIES_EMPTY "The number of 'Number of copies' \ +value cannot be empty." + PD32_TOO_LARGE_COPIES "This large nmuber of copies is not \ +supported by your printer.\nPlease enter a value between 1 and %d." + PD32_PRINT_ERROR "で伊辉脆っ阻艇驹辆" + PD32_NO_DEFAULT_PRINTER "淞琳啶米柰Ь粤眷弧翟" + PD32_CANT_FIND_PRINTER "淞杈亨っ阻艇驹辆" + PD32_OUT_OF_MEMORY "で伊异肆" + PD32_GENERIC_ERROR "唷源で伊辉淳乓" + PD32_DRIVER_UNKNOWN "淞杳匍ㄑ〈涿爨峭渺爨っ阻艇驹辆" + + PD32_DEFAULT_PRINTER "啶米柰Ь粤眷弧翟; " + PD32_NR_OF_DOCUMENTS_IN_QUEUE "琳 %d 峥榱猛吐勹" + PD32_PRINT_ALL_X_PAGES "坟 %d 斯橐" + PD32_MARGINS_IN_INCHES "⑼骸眯匆 [乖榍]" + PD32_MARGINS_IN_MILIMETERS "⑼骸眯匆 [亮.]" + PD32_MILIMETERS "亮." + + PD32_PRINTER_STATUS_READY "久橥" + PD32_PRINTER_STATUS_PAUSED "磐; " + PD32_PRINTER_STATUS_ERROR "で伊辉; " + PD32_PRINTER_STATUS_PENDING_DELETION "№遗学ㄐ藕; " + PD32_PRINTER_STATUS_PAPER_JAM "∶写疑翟; " + PD32_PRINTER_STATUS_PAPER_OUT "∶写疑肆; " + PD32_PRINTER_STATUS_MANUAL_FEED "Feed paper manual; " + PD32_PRINTER_STATUS_PAPER_PROBLEM "Paper problem; " + PD32_PRINTER_STATUS_OFFLINE "啶米柰Ь粤眷辉; " + PD32_PRINTER_STATUS_IO_ACTIVE "I/O Active; " + PD32_PRINTER_STATUS_BUSY "仑瑙; " + PD32_PRINTER_STATUS_PRINTING "№僚学驹辆; " + PD32_PRINTER_STATUS_OUTPUT_BIN_FULL "兑脆电; " + PD32_PRINTER_STATUS_NOT_AVAILABLE "悛殇凌浯榈凸拐; " + PD32_PRINTER_STATUS_WAITING "啶米柰Ь粤眷猛吐栀; " + PD32_PRINTER_STATUS_PROCESSING "№遗学讽咬夜; " + PD32_PRINTER_STATUS_INITIALIZING "№僚学朽苗; " + PD32_PRINTER_STATUS_WARMING_UP "№僚学芯猛; " + PD32_PRINTER_STATUS_TONER_LOW "肆帧ㄐ肆; " + PD32_PRINTER_STATUS_NO_TONER "肆帧肆瘁砰; " + PD32_PRINTER_STATUS_PAGE_PUNT "Page punt; " + PD32_PRINTER_STATUS_USER_INTERVENTION "假殂隆嗯浴; " + PD32_PRINTER_STATUS_OUT_OF_MEMORY "で伊亦っ阻艇驹辆焖链; " + PD32_PRINTER_STATUS_DOOR_OPEN "幻械汆っ阻艇驹辆爨辉; " + PD32_PRINTER_STATUS_SERVER_UNKNOWN "淞杳匍ㄑ∴释渺嗲兔祆; " + PD32_PRINTER_STATUS_POWER_SAVE "悛殇块归吐; " +} + +STRINGTABLE DISCARDABLE /* Color names */ +{ + IDS_COLOR_BLACK "收错" + IDS_COLOR_MAROON "收嗯状肆" + IDS_COLOR_GREEN "收啖章" + IDS_COLOR_OLIVE "收啖章青㈤" + IDS_COLOR_NAVY "收鬼亦г" + IDS_COLOR_PURPLE "收凌千" + IDS_COLOR_TEAL "收啖章峭凉硪唰怨㈤" + IDS_COLOR_GRAY "收喾" + IDS_COLOR_SILVER "收唰怨" + IDS_COLOR_RED "收岽" + IDS_COLOR_LIME "收啖章峭丸" + IDS_COLOR_YELLOW "收嗨抛艇" + IDS_COLOR_BLUE "收块" + IDS_COLOR_FUCHSIA "Fuchsia" + IDS_COLOR_AQUA "收块彝丸" + IDS_COLOR_WHITE "收⒁" +} diff --git a/reactos/lib/comdlg32/colordlg16.c b/reactos/lib/comdlg32/colordlg16.c index 0159e47a7b3..8733452226a 100644 --- a/reactos/lib/comdlg32/colordlg16.c +++ b/reactos/lib/comdlg32/colordlg16.c @@ -442,7 +442,7 @@ BOOL16 WINAPI ChooseColor16( LPCHOOSECOLOR16 lpChCol ) COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE); return FALSE; } - size = SizeofResource(GetModuleHandleA("COMDLG32"), hResInfo); + size = SizeofResource(COMDLG32_hInstance, hResInfo); hGlobal16 = GlobalAlloc16(0, size); if (!hGlobal16) { diff --git a/reactos/lib/comdlg32/filedlg.c b/reactos/lib/comdlg32/filedlg.c index 5e7db7fb450..8049ad26d45 100644 --- a/reactos/lib/comdlg32/filedlg.c +++ b/reactos/lib/comdlg32/filedlg.c @@ -676,30 +676,11 @@ static void ArrangeCtrlPositions(HWND hwndChildDlg, HWND hwndParentDlg, BOOL hid INT_PTR CALLBACK FileOpenDlgProcUserTemplate(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { - FileOpenDlgInfos *fodInfos; - -#if 0 - TRACE("0x%04x\n", uMsg); -#endif - - switch(uMsg) - { - case WM_INITDIALOG: - { - fodInfos = (FileOpenDlgInfos *)lParam; - lParam = (LPARAM) fodInfos->ofnInfos; - - if(fodInfos && IsHooked(fodInfos)) - return CallWindowProcA((WNDPROC)fodInfos->ofnInfos->lpfnHook,hwnd,uMsg,wParam,lParam); - return 0; - } + switch(uMsg) { + case WM_INITDIALOG: + return TRUE; } - - fodInfos = (FileOpenDlgInfos *) GetPropA(GetParent(hwnd),FileOpenDlgInfosStr); - if(fodInfos && IsHooked(fodInfos)) - return CallWindowProcA((WNDPROC)fodInfos->ofnInfos->lpfnHook,hwnd,uMsg,wParam,lParam); - - return 0; + return FALSE; } HWND CreateTemplateDialog(FileOpenDlgInfos *fodInfos, HWND hwnd) @@ -753,8 +734,9 @@ HWND CreateTemplateDialog(FileOpenDlgInfos *fodInfos, HWND hwnd) return NULL; } } - hChildDlg= CreateDialogIndirectParamA(COMDLG32_hInstance, template, - hwnd, FileOpenDlgProcUserTemplate, (LPARAM)fodInfos); + hChildDlg = CreateDialogIndirectParamA(COMDLG32_hInstance, template, hwnd, + IsHooked(fodInfos) ? (DLGPROC)fodInfos->ofnInfos->lpfnHook : FileOpenDlgProcUserTemplate, + (LPARAM)fodInfos->ofnInfos); if(hChildDlg) { ShowWindow(hChildDlg,SW_SHOW); @@ -779,7 +761,7 @@ HWND CreateTemplateDialog(FileOpenDlgInfos *fodInfos, HWND hwnd) temp.menu = temp.class = temp.title = 0; hChildDlg = CreateDialogIndirectParamA(COMDLG32_hInstance, &temp.tmplate, - hwnd, FileOpenDlgProcUserTemplate, (LPARAM)fodInfos); + hwnd, (DLGPROC)fodInfos->ofnInfos->lpfnHook, (LPARAM)fodInfos->ofnInfos); return hChildDlg; } @@ -1035,15 +1017,15 @@ static LRESULT FILEDLG95_InitControls(HWND hwnd) TBBUTTON tbb[] = { - {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0, 0}, 0, 0 }, - {VIEW_PARENTFOLDER, FCIDM_TB_UPFOLDER, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0 }, - {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0, 0}, 0, 0 }, - {VIEW_NEWFOLDER+1, FCIDM_TB_DESKTOP, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0 }, - {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0, 0}, 0, 0 }, - {VIEW_NEWFOLDER, FCIDM_TB_NEWFOLDER, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0 }, - {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0, 0}, 0, 0 }, - {VIEW_LIST, FCIDM_TB_SMALLICON, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0 }, - {VIEW_DETAILS, FCIDM_TB_REPORTVIEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0 }, + {0, 0, TBSTATE_ENABLED, BTNS_SEP, {0, 0}, 0, 0 }, + {VIEW_PARENTFOLDER, FCIDM_TB_UPFOLDER, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0 }, + {0, 0, TBSTATE_ENABLED, BTNS_SEP, {0, 0}, 0, 0 }, + {VIEW_NEWFOLDER+1, FCIDM_TB_DESKTOP, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0 }, + {0, 0, TBSTATE_ENABLED, BTNS_SEP, {0, 0}, 0, 0 }, + {VIEW_NEWFOLDER, FCIDM_TB_NEWFOLDER, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0 }, + {0, 0, TBSTATE_ENABLED, BTNS_SEP, {0, 0}, 0, 0 }, + {VIEW_LIST, FCIDM_TB_SMALLICON, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0 }, + {VIEW_DETAILS, FCIDM_TB_REPORTVIEW, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0 }, }; TBADDBITMAP tba[2]; RECT rectTB; @@ -1159,19 +1141,31 @@ static LRESULT FILEDLG95_InitControls(HWND hwnd) DWORD result; strcpyW(tmpBuf, fodInfos->initdir); - if (tmpBuf[strlenW(tmpBuf)-1] != '\\') { - strcatW(tmpBuf, szwSlash); + if( PathFileExistsW(tmpBuf) ) { + /* initdir does not have to be a directory. If a file is + * specified, the dir part is taken */ + if( PathIsDirectoryW(tmpBuf)) { + if (tmpBuf[strlenW(tmpBuf)-1] != '\\') { + strcatW(tmpBuf, szwSlash); + } + strcatW(tmpBuf, szwStar); + } + result = GetFullPathNameW(tmpBuf, MAX_PATH, tmpBuf2, &nameBit); + if (result) { + *nameBit = 0x00; + if (fodInfos->initdir) + MemFree(fodInfos->initdir); + fodInfos->initdir = MemAlloc((strlenW(tmpBuf2) + 1)*sizeof(WCHAR)); + strcpyW(fodInfos->initdir, tmpBuf2); + handledPath = TRUE; + TRACE("Value in InitDir changed to %s\n", debugstr_w(fodInfos->initdir)); + } } - strcatW(tmpBuf, szwStar); - result = GetFullPathNameW(tmpBuf, MAX_PATH, tmpBuf2, &nameBit); - if (result) { - *nameBit = 0x00; - if (fodInfos->initdir) - MemFree(fodInfos->initdir); - fodInfos->initdir = MemAlloc((strlenW(tmpBuf2) + 1)*sizeof(WCHAR)); - strcpyW(fodInfos->initdir, tmpBuf2); - handledPath = TRUE; - TRACE("Value in InitDir changed to %s\n", debugstr_w(fodInfos->initdir)); + else if (fodInfos->initdir) + { + MemFree(fodInfos->initdir); + fodInfos->initdir = NULL; + TRACE("Value in InitDir is not an existing path, changed to (nil)\n"); } } } @@ -1478,12 +1472,16 @@ static BOOL FILEDLG95_SendFileOK( HWND hwnd, FileOpenDlgInfos *fodInfos ) TRACE("---\n"); /* First send CDN_FILEOK as MSDN doc says */ SendCustomDlgNotificationMessage(hwnd,CDN_FILEOK); + if (GetWindowLongW(fodInfos->DlgInfos.hwndCustomDlg, DWL_MSGRESULT)) + { + TRACE("canceled\n"); + return FALSE; + } /* fodInfos->ofnInfos points to an ASCII or UNICODE structure as appropriate */ - CallWindowProcA((WNDPROC)fodInfos->ofnInfos->lpfnHook, - fodInfos->DlgInfos.hwndCustomDlg, - fodInfos->HookMsg.fileokstring, 0, (LPARAM)fodInfos->ofnInfos); - if (GetWindowLongA(fodInfos->DlgInfos.hwndCustomDlg, DWL_MSGRESULT)) + SendMessageW(fodInfos->DlgInfos.hwndCustomDlg, + fodInfos->HookMsg.fileokstring, 0, (LPARAM)fodInfos->ofnInfos); + if (GetWindowLongW(fodInfos->DlgInfos.hwndCustomDlg, DWL_MSGRESULT)) { TRACE("canceled\n"); return FALSE; @@ -1562,9 +1560,9 @@ BOOL FILEDLG95_OnOpenMultipleFiles(HWND hwnd, LPWSTR lpstrFileList, UINT nFileCo if ( !(fodInfos->ofnInfos->Flags & OFN_EXPLORER) ) { /* For "oldstyle" dialog the components have to - be spearated by blanks (not '\0'!) and short + be separated by blanks (not '\0'!) and short filenames have to be used! */ - FIXME("Components have to be separated by blanks"); + FIXME("Components have to be separated by blanks\n"); } if(fodInfos->unicode) { @@ -1711,7 +1709,7 @@ BOOL FILEDLG95_OnOpen(HWND hwnd) nOpenAction = ONOPEN_BROWSE; - /* dont apply any checks with OFN_NOVALIDATE */ + /* don't apply any checks with OFN_NOVALIDATE */ { LPWSTR lpszTemp, lpszTemp1; LPITEMIDLIST pidl = NULL; diff --git a/reactos/lib/comdlg32/filedlg16.c b/reactos/lib/comdlg32/filedlg16.c index 063a9c0281b..dac494f2f1e 100644 --- a/reactos/lib/comdlg32/filedlg16.c +++ b/reactos/lib/comdlg32/filedlg16.c @@ -95,18 +95,12 @@ static BOOL FileDlg_Init(void) static BOOL initialized = 0; if (!initialized) { - HINSTANCE inst = GetModuleHandleA( "comdlg32.dll" ); - if (!inst) - { - ERR( "cannot get comdlg32.dll instance\n" ); - return FALSE; - } - hFolder = LoadImageA( inst, "FOLDER", IMAGE_ICON, 16, 16, LR_SHARED ); - hFolder2 = LoadImageA( inst, "FOLDER2", IMAGE_ICON, 16, 16, LR_SHARED ); - hFloppy = LoadImageA( inst, "FLOPPY", IMAGE_ICON, 16, 16, LR_SHARED ); - hHDisk = LoadImageA( inst, "HDISK", IMAGE_ICON, 16, 16, LR_SHARED ); - hCDRom = LoadImageA( inst, "CDROM", IMAGE_ICON, 16, 16, LR_SHARED ); - hNet = LoadImageA( inst, "NETWORK", IMAGE_ICON, 16, 16, LR_SHARED ); + 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) { @@ -230,7 +224,7 @@ BOOL Get16BitsTemplate(LFSPRIVATE lfs) COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE); return FALSE; } - size = SizeofResource(GetModuleHandleA("COMDLG32"), hResInfo); + size = SizeofResource(COMDLG32_hInstance, hResInfo); hGlobal16 = GlobalAlloc16(0, size); if (!hGlobal16) { diff --git a/reactos/lib/comdlg32/finddlg.c b/reactos/lib/comdlg32/finddlg.c index 70e8ad4f1c9..afaa3743c38 100644 --- a/reactos/lib/comdlg32/finddlg.c +++ b/reactos/lib/comdlg32/finddlg.c @@ -121,7 +121,7 @@ BOOL FINDDLG_Get16BitsTemplate(LFRPRIVATE lfr) COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE); return FALSE; } - size = SizeofResource(GetModuleHandleA("COMDLG32"), hResInfo); + size = SizeofResource(COMDLG32_hInstance, hResInfo); hGlobal16 = GlobalAlloc16(0, size); if (!hGlobal16) { diff --git a/reactos/lib/comdlg32/finddlg32.c b/reactos/lib/comdlg32/finddlg32.c index a75de117774..6863ef7af36 100644 --- a/reactos/lib/comdlg32/finddlg32.c +++ b/reactos/lib/comdlg32/finddlg32.c @@ -54,7 +54,7 @@ static UINT HelpMessage; * The find/replace calls are passed a structure that is _not_ used * internally. There is a local copy that holds the running info to * be able to combine xxxA and xxxW calls. The passed pointer is - * returned upon sendmessage. Apps wont break this way when they rely + * returned upon sendmessage. Apps won't break this way when they rely * on the original pointer. This will work as long as the sizes of * FINDREPLACEA == FINDREPLACEW. The local copy will also prevent * the app to see the wine-specific extra flags to distinguish between diff --git a/reactos/lib/comdlg32/fontdlg.c b/reactos/lib/comdlg32/fontdlg.c index 90e2d18f1eb..2be535bd4ac 100644 --- a/reactos/lib/comdlg32/fontdlg.c +++ b/reactos/lib/comdlg32/fontdlg.c @@ -29,8 +29,9 @@ #include "winnls.h" #include "wingdi.h" #include "winuser.h" -#include "wine/winuser16.h" /* Needed for CB_SETITEMDATA16 */ -#include "heap.h" /* HEAP_strdupWtoA */ +#include "wine/winbase16.h" +#include "wine/winuser16.h" +#include "heap.h" #include "commdlg.h" #include "dlgs.h" #include "wine/debug.h" diff --git a/reactos/lib/comdlg32/fontdlg16.c b/reactos/lib/comdlg32/fontdlg16.c index bb10e40ed7f..b1ab2b3388b 100644 --- a/reactos/lib/comdlg32/fontdlg16.c +++ b/reactos/lib/comdlg32/fontdlg16.c @@ -205,7 +205,7 @@ BOOL16 WINAPI ChooseFont16(LPCHOOSEFONT16 lpChFont) COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE); return FALSE; } - size = SizeofResource(GetModuleHandleA("COMDLG32"), hResInfo); + size = SizeofResource(COMDLG32_hInstance, hResInfo); hGlobal16 = GlobalAlloc16(0, size); if (!hGlobal16) { diff --git a/reactos/lib/comdlg32/printdlg.c b/reactos/lib/comdlg32/printdlg.c index 41a16906fa9..917f2334cc4 100644 --- a/reactos/lib/comdlg32/printdlg.c +++ b/reactos/lib/comdlg32/printdlg.c @@ -26,8 +26,8 @@ #include <stdio.h> #include <string.h> -//#define NONAMELESSUNION -//#define NONAMELESSSTRUCT +#define NONAMELESSUNION +#define NONAMELESSSTRUCT #include "windef.h" #include "winbase.h" #include "wingdi.h" @@ -279,7 +279,7 @@ static BOOL PRINTDLG_CreateDevNamesW(HGLOBAL *hmem, LPCWSTR DeviceDriverName, static BOOL PRINTDLG_UpdatePrintDlgA(HWND hDlg, PRINT_PTRA* PrintStructures) { - LPPRINTDLGA lppd = PrintStructures->dlg.lpPrintDlg; + LPPRINTDLGA lppd = PrintStructures->lpPrintDlg; PDEVMODEA lpdm = PrintStructures->lpDevMode; LPPRINTER_INFO_2A pi = PrintStructures->lpPrinterInfo; @@ -341,7 +341,7 @@ static BOOL PRINTDLG_UpdatePrintDlgA(HWND hDlg, lpdm->dmCollate = (IsDlgButtonChecked(hDlg, chx2) == BST_CHECKED); if (lpdm->dmFields & DM_COPIES) - lpdm->dmCopies = GetDlgItemInt(hDlg, edt3, NULL, FALSE); + lpdm->u.s.dmCopies = GetDlgItemInt(hDlg, edt3, NULL, FALSE); } else { if (IsDlgButtonChecked(hDlg, chx2) == BST_CHECKED) lppd->Flags |= PD_COLLATE; @@ -356,7 +356,7 @@ static BOOL PRINTDLG_UpdatePrintDlgA(HWND hDlg, static BOOL PRINTDLG_UpdatePrintDlgW(HWND hDlg, PRINT_PTRW* PrintStructures) { - LPPRINTDLGW lppd = PrintStructures->dlg.lpPrintDlg; + LPPRINTDLGW lppd = PrintStructures->lpPrintDlg; PDEVMODEW lpdm = PrintStructures->lpDevMode; LPPRINTER_INFO_2W pi = PrintStructures->lpPrinterInfo; @@ -416,7 +416,7 @@ static BOOL PRINTDLG_UpdatePrintDlgW(HWND hDlg, lpdm->dmCollate = (IsDlgButtonChecked(hDlg, chx2) == BST_CHECKED); if (lpdm->dmFields & DM_COPIES) - lpdm->dmCopies = GetDlgItemInt(hDlg, edt3, NULL, FALSE); + lpdm->u.s.dmCopies = GetDlgItemInt(hDlg, edt3, NULL, FALSE); } else { if (IsDlgButtonChecked(hDlg, chx2) == BST_CHECKED) lppd->Flags |= PD_COLLATE; @@ -581,9 +581,9 @@ static BOOL PRINTDLG_SetUpPaperComboBoxA(HWND hDlg, Sel, 0); if (dm) { if (nIDComboBox == cmb2) - dm->dmPaperSize = oldWord; + dm->u.s.dmPaperSize = oldWord; else - dm->dmDefaultSource = oldWord; + dm->u.s.dmDefaultSource = oldWord; } } else { @@ -593,9 +593,9 @@ static BOOL PRINTDLG_SetUpPaperComboBoxA(HWND hDlg, */ if (dm) { if (nIDComboBox == cmb2) - oldWord = dm->dmPaperSize; + oldWord = dm->u.s.dmPaperSize; else - oldWord = dm->dmDefaultSource; + oldWord = dm->u.s.dmDefaultSource; } } @@ -691,9 +691,9 @@ static BOOL PRINTDLG_SetUpPaperComboBoxW(HWND hDlg, Sel, 0); if (dm) { if (nIDComboBox == cmb2) - dm->dmPaperSize = oldWord; + dm->u.s.dmPaperSize = oldWord; else - dm->dmDefaultSource = oldWord; + dm->u.s.dmDefaultSource = oldWord; } } else { @@ -703,9 +703,9 @@ static BOOL PRINTDLG_SetUpPaperComboBoxW(HWND hDlg, */ if (dm) { if (nIDComboBox == cmb2) - oldWord = dm->dmPaperSize; + oldWord = dm->u.s.dmPaperSize; else - oldWord = dm->dmDefaultSource; + oldWord = dm->u.s.dmDefaultSource; } } @@ -856,7 +856,7 @@ static void PRINTDLG_UpdatePrinterInfoTextsW(HWND hDlg, LPPRINTER_INFO_2W pi) BOOL PRINTDLG_ChangePrinterA(HWND hDlg, char *name, PRINT_PTRA *PrintStructures) { - LPPRINTDLGA lppd = PrintStructures->dlg.lpPrintDlg; + LPPRINTDLGA lppd = PrintStructures->lpPrintDlg; LPDEVMODEA lpdm = NULL; LONG dmSize; DWORD needed; @@ -968,7 +968,7 @@ BOOL PRINTDLG_ChangePrinterA(HWND hDlg, char *name, if (lppd->hDevMode == 0) copies = lppd->nCopies; else - copies = lpdm->dmCopies; + copies = lpdm->u.s.dmCopies; if(copies == 0) copies = 1; else if(copies < 0) copies = MAX_COPIES; SetDlgItemInt(hDlg, edt3, copies, FALSE); @@ -990,7 +990,7 @@ BOOL PRINTDLG_ChangePrinterA(HWND hDlg, char *name, ShowWindow(GetDlgItem(hDlg, chx1), SW_HIDE); } else { /* PD_PRINTSETUP */ - BOOL bPortrait = (lpdm->dmOrientation == DMORIENT_PORTRAIT); + BOOL bPortrait = (lpdm->u.s.dmOrientation == DMORIENT_PORTRAIT); PRINTDLG_SetUpPaperComboBoxA(hDlg, cmb2, PrintStructures->lpPrinterInfo->pPrinterName, @@ -1018,7 +1018,7 @@ BOOL PRINTDLG_ChangePrinterA(HWND hDlg, char *name, static BOOL PRINTDLG_ChangePrinterW(HWND hDlg, WCHAR *name, PRINT_PTRW *PrintStructures) { - LPPRINTDLGW lppd = PrintStructures->dlg.lpPrintDlg; + LPPRINTDLGW lppd = PrintStructures->lpPrintDlg; LPDEVMODEW lpdm = NULL; LONG dmSize; DWORD needed; @@ -1131,7 +1131,7 @@ static BOOL PRINTDLG_ChangePrinterW(HWND hDlg, WCHAR *name, if (lppd->hDevMode == 0) copies = lppd->nCopies; else - copies = lpdm->dmCopies; + copies = lpdm->u.s.dmCopies; if(copies == 0) copies = 1; else if(copies < 0) copies = MAX_COPIES; SetDlgItemInt(hDlg, edt3, copies, FALSE); @@ -1153,7 +1153,7 @@ static BOOL PRINTDLG_ChangePrinterW(HWND hDlg, WCHAR *name, ShowWindow(GetDlgItem(hDlg, chx1), SW_HIDE); } else { /* PD_PRINTSETUP */ - BOOL bPortrait = (lpdm->dmOrientation == DMORIENT_PORTRAIT); + BOOL bPortrait = (lpdm->u.s.dmOrientation == DMORIENT_PORTRAIT); PRINTDLG_SetUpPaperComboBoxW(hDlg, cmb2, PrintStructures->lpPrinterInfo->pPrinterName, @@ -1184,7 +1184,7 @@ static BOOL PRINTDLG_ChangePrinterW(HWND hDlg, WCHAR *name, static LRESULT PRINTDLG_WMInitDialog(HWND hDlg, WPARAM wParam, PRINT_PTRA* PrintStructures) { - LPPRINTDLGA lppd = PrintStructures->dlg.lpPrintDlg; + LPPRINTDLGA lppd = PrintStructures->lpPrintDlg; DEVNAMES *pdn; DEVMODEA *pdm; char *name = NULL; @@ -1288,7 +1288,7 @@ static LRESULT PRINTDLG_WMInitDialog(HWND hDlg, WPARAM wParam, static LRESULT PRINTDLG_WMInitDialogW(HWND hDlg, WPARAM wParam, PRINT_PTRW* PrintStructures) { - LPPRINTDLGW lppd = PrintStructures->dlg.lpPrintDlg; + LPPRINTDLGW lppd = PrintStructures->lpPrintDlg; DEVNAMES *pdn; DEVMODEW *pdm; WCHAR *name = NULL; @@ -1396,7 +1396,7 @@ static LRESULT PRINTDLG_WMInitDialogW(HWND hDlg, WPARAM wParam, LRESULT PRINTDLG_WMCommandA(HWND hDlg, WPARAM wParam, LPARAM lParam, PRINT_PTRA* PrintStructures) { - LPPRINTDLGA lppd = PrintStructures->dlg.lpPrintDlg; + LPPRINTDLGA lppd = PrintStructures->lpPrintDlg; UINT PrinterComboID = (lppd->Flags & PD_PRINTSETUP) ? cmb1 : cmb4; LPDEVMODEA lpdm = PrintStructures->lpDevMode; @@ -1490,7 +1490,7 @@ LRESULT PRINTDLG_WMCommandA(HWND hDlg, WPARAM wParam, case rad1: /* Paperorientation */ if (lppd->Flags & PD_PRINTSETUP) { - lpdm->dmOrientation = DMORIENT_PORTRAIT; + lpdm->u.s.dmOrientation = DMORIENT_PORTRAIT; SendDlgItemMessageA(hDlg, ico1, STM_SETIMAGE, (WPARAM) IMAGE_ICON, (LPARAM)(PrintStructures->hPortraitIcon)); } @@ -1499,7 +1499,7 @@ LRESULT PRINTDLG_WMCommandA(HWND hDlg, WPARAM wParam, case rad2: /* Paperorientation */ if (lppd->Flags & PD_PRINTSETUP) { - lpdm->dmOrientation = DMORIENT_LANDSCAPE; + lpdm->u.s.dmOrientation = DMORIENT_LANDSCAPE; SendDlgItemMessageA(hDlg, ico1, STM_SETIMAGE, (WPARAM) IMAGE_ICON, (LPARAM)(PrintStructures->hLandscapeIcon)); } @@ -1523,7 +1523,7 @@ LRESULT PRINTDLG_WMCommandA(HWND hDlg, WPARAM wParam, { DWORD Sel = SendDlgItemMessageA(hDlg, cmb2, CB_GETCURSEL, 0, 0); if(Sel != CB_ERR) - lpdm->dmPaperSize = SendDlgItemMessageA(hDlg, cmb2, + lpdm->u.s.dmPaperSize = SendDlgItemMessageA(hDlg, cmb2, CB_GETITEMDATA, Sel, 0); } @@ -1533,7 +1533,7 @@ LRESULT PRINTDLG_WMCommandA(HWND hDlg, WPARAM wParam, { DWORD Sel = SendDlgItemMessageA(hDlg, cmb3, CB_GETCURSEL, 0, 0); if(Sel != CB_ERR) - lpdm->dmDefaultSource = SendDlgItemMessageA(hDlg, cmb3, + lpdm->u.s.dmDefaultSource = SendDlgItemMessageA(hDlg, cmb3, CB_GETITEMDATA, Sel, 0); } @@ -1544,8 +1544,8 @@ LRESULT PRINTDLG_WMCommandA(HWND hDlg, WPARAM wParam, case rad1: /* orientation */ case rad2: if (IsDlgButtonChecked(hDlg, rad1) == BST_CHECKED) { - if(lpdm->dmOrientation != DMORIENT_PORTRAIT) { - lpdm->dmOrientation = DMORIENT_PORTRAIT; + if(lpdm->u.s.dmOrientation != DMORIENT_PORTRAIT) { + lpdm->u.s.dmOrientation = DMORIENT_PORTRAIT; SendDlgItemMessageA(hDlg, stc10, STM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)PrintStructures->hPortraitIcon); @@ -1554,8 +1554,8 @@ LRESULT PRINTDLG_WMCommandA(HWND hDlg, WPARAM wParam, (LPARAM)PrintStructures->hPortraitIcon); } } else { - if(lpdm->dmOrientation != DMORIENT_LANDSCAPE) { - lpdm->dmOrientation = DMORIENT_LANDSCAPE; + if(lpdm->u.s.dmOrientation != DMORIENT_LANDSCAPE) { + lpdm->u.s.dmOrientation = DMORIENT_LANDSCAPE; SendDlgItemMessageA(hDlg, stc10, STM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)PrintStructures->hLandscapeIcon); @@ -1573,7 +1573,7 @@ LRESULT PRINTDLG_WMCommandA(HWND hDlg, WPARAM wParam, static LRESULT PRINTDLG_WMCommandW(HWND hDlg, WPARAM wParam, LPARAM lParam, PRINT_PTRW* PrintStructures) { - LPPRINTDLGW lppd = PrintStructures->dlg.lpPrintDlg; + LPPRINTDLGW lppd = PrintStructures->lpPrintDlg; UINT PrinterComboID = (lppd->Flags & PD_PRINTSETUP) ? cmb1 : cmb4; LPDEVMODEW lpdm = PrintStructures->lpDevMode; @@ -1654,7 +1654,7 @@ static LRESULT PRINTDLG_WMCommandW(HWND hDlg, WPARAM wParam, case rad1: /* Paperorientation */ if (lppd->Flags & PD_PRINTSETUP) { - lpdm->dmOrientation = DMORIENT_PORTRAIT; + lpdm->u.s.dmOrientation = DMORIENT_PORTRAIT; SendDlgItemMessageA(hDlg, ico1, STM_SETIMAGE, (WPARAM) IMAGE_ICON, (LPARAM)(PrintStructures->hPortraitIcon)); } @@ -1663,7 +1663,7 @@ static LRESULT PRINTDLG_WMCommandW(HWND hDlg, WPARAM wParam, case rad2: /* Paperorientation */ if (lppd->Flags & PD_PRINTSETUP) { - lpdm->dmOrientation = DMORIENT_LANDSCAPE; + lpdm->u.s.dmOrientation = DMORIENT_LANDSCAPE; SendDlgItemMessageA(hDlg, ico1, STM_SETIMAGE, (WPARAM) IMAGE_ICON, (LPARAM)(PrintStructures->hLandscapeIcon)); } @@ -1687,7 +1687,7 @@ static LRESULT PRINTDLG_WMCommandW(HWND hDlg, WPARAM wParam, { DWORD Sel = SendDlgItemMessageA(hDlg, cmb2, CB_GETCURSEL, 0, 0); if(Sel != CB_ERR) - lpdm->dmPaperSize = SendDlgItemMessageA(hDlg, cmb2, + lpdm->u.s.dmPaperSize = SendDlgItemMessageA(hDlg, cmb2, CB_GETITEMDATA, Sel, 0); } @@ -1697,7 +1697,7 @@ static LRESULT PRINTDLG_WMCommandW(HWND hDlg, WPARAM wParam, { DWORD Sel = SendDlgItemMessageA(hDlg, cmb3, CB_GETCURSEL, 0, 0); if(Sel != CB_ERR) - lpdm->dmDefaultSource = SendDlgItemMessageW(hDlg, cmb3, + lpdm->u.s.dmDefaultSource = SendDlgItemMessageW(hDlg, cmb3, CB_GETITEMDATA, Sel, 0); } @@ -1708,8 +1708,8 @@ static LRESULT PRINTDLG_WMCommandW(HWND hDlg, WPARAM wParam, case rad1: /* orientation */ case rad2: if (IsDlgButtonChecked(hDlg, rad1) == BST_CHECKED) { - if(lpdm->dmOrientation != DMORIENT_PORTRAIT) { - lpdm->dmOrientation = DMORIENT_PORTRAIT; + if(lpdm->u.s.dmOrientation != DMORIENT_PORTRAIT) { + lpdm->u.s.dmOrientation = DMORIENT_PORTRAIT; SendDlgItemMessageA(hDlg, stc10, STM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)PrintStructures->hPortraitIcon); @@ -1718,8 +1718,8 @@ static LRESULT PRINTDLG_WMCommandW(HWND hDlg, WPARAM wParam, (LPARAM)PrintStructures->hPortraitIcon); } } else { - if(lpdm->dmOrientation != DMORIENT_LANDSCAPE) { - lpdm->dmOrientation = DMORIENT_LANDSCAPE; + if(lpdm->u.s.dmOrientation != DMORIENT_LANDSCAPE) { + lpdm->u.s.dmOrientation = DMORIENT_LANDSCAPE; SendDlgItemMessageA(hDlg, stc10, STM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)PrintStructures->hLandscapeIcon); @@ -1752,15 +1752,15 @@ INT_PTR CALLBACK PrintDlgProcA(HWND hDlg, UINT uMsg, WPARAM wParam, SetPropA(hDlg,"__WINE_PRINTDLGDATA",PrintStructures); res = PRINTDLG_WMInitDialog(hDlg, wParam, PrintStructures); - if(PrintStructures->dlg.lpPrintDlg->Flags & PD_ENABLEPRINTHOOK) - res = PrintStructures->dlg.lpPrintDlg->lpfnPrintHook( - hDlg, uMsg, wParam, (LPARAM)PrintStructures->dlg.lpPrintDlg + if(PrintStructures->lpPrintDlg->Flags & PD_ENABLEPRINTHOOK) + res = PrintStructures->lpPrintDlg->lpfnPrintHook( + hDlg, uMsg, wParam, (LPARAM)PrintStructures->lpPrintDlg ); return res; } - if(PrintStructures->dlg.lpPrintDlg->Flags & PD_ENABLEPRINTHOOK) { - res = PrintStructures->dlg.lpPrintDlg->lpfnPrintHook(hDlg,uMsg,wParam, + if(PrintStructures->lpPrintDlg->Flags & PD_ENABLEPRINTHOOK) { + res = PrintStructures->lpPrintDlg->lpfnPrintHook(hDlg,uMsg,wParam, lParam); if(res) return res; } @@ -1797,13 +1797,13 @@ INT_PTR CALLBACK PrintDlgProcW(HWND hDlg, UINT uMsg, WPARAM wParam, SetPropW(hDlg, propW, PrintStructures); res = PRINTDLG_WMInitDialogW(hDlg, wParam, PrintStructures); - if(PrintStructures->dlg.lpPrintDlg->Flags & PD_ENABLEPRINTHOOK) - res = PrintStructures->dlg.lpPrintDlg->lpfnPrintHook(hDlg, uMsg, wParam, (LPARAM)PrintStructures->dlg.lpPrintDlg); + if(PrintStructures->lpPrintDlg->Flags & PD_ENABLEPRINTHOOK) + res = PrintStructures->lpPrintDlg->lpfnPrintHook(hDlg, uMsg, wParam, (LPARAM)PrintStructures->lpPrintDlg); return res; } - if(PrintStructures->dlg.lpPrintDlg->Flags & PD_ENABLEPRINTHOOK) { - res = PrintStructures->dlg.lpPrintDlg->lpfnPrintHook(hDlg,uMsg,wParam, lParam); + if(PrintStructures->lpPrintDlg->Flags & PD_ENABLEPRINTHOOK) { + res = PrintStructures->lpPrintDlg->lpfnPrintHook(hDlg,uMsg,wParam, lParam); if(res) return res; } @@ -2056,7 +2056,7 @@ BOOL WINAPI PrintDlgA( PrintStructures = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PRINT_PTRA)); - PrintStructures->dlg.lpPrintDlg = lppd; + PrintStructures->lpPrintDlg = lppd; /* and create & process the dialog . * -1 is failure, 0 is broken hwnd, everything else is ok. @@ -2212,7 +2212,7 @@ BOOL WINAPI PrintDlgW( PrintStructures = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PRINT_PTRW)); - PrintStructures->dlg.lpPrintDlg = lppd; + PrintStructures->lpPrintDlg = lppd; /* and create & process the dialog . * -1 is failure, 0 is broken hwnd, everything else is ok. diff --git a/reactos/lib/comdlg32/printdlg.h b/reactos/lib/comdlg32/printdlg.h index a9d80786b94..748e5c033fc 100644 --- a/reactos/lib/comdlg32/printdlg.h +++ b/reactos/lib/comdlg32/printdlg.h @@ -33,9 +33,7 @@ typedef struct { LPDEVMODEA lpDevMode; - struct { - LPPRINTDLGA lpPrintDlg; - } dlg; + LPPRINTDLGA lpPrintDlg; LPPRINTER_INFO_2A lpPrinterInfo; LPDRIVER_INFO_3A lpDriverInfo; UINT HelpMessageID; @@ -49,9 +47,7 @@ typedef struct typedef struct { LPDEVMODEW lpDevMode; - struct { - LPPRINTDLGW lpPrintDlg; - } dlg; + LPPRINTDLGW lpPrintDlg; LPPRINTER_INFO_2W lpPrinterInfo; LPDRIVER_INFO_3W lpDriverInfo; UINT HelpMessageID; diff --git a/reactos/lib/comdlg32/printdlg16.c b/reactos/lib/comdlg32/printdlg16.c index 157b5d8b991..e68b3e7abb0 100644 --- a/reactos/lib/comdlg32/printdlg16.c +++ b/reactos/lib/comdlg32/printdlg16.c @@ -48,27 +48,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(commdlg); #include "cdlg16.h" #include "printdlg.h" -/* This PRINTDLGA16 internal structure stores - * pointers to several throughout useful structures. - * This structure is a duplicate of the PRINT_PTRA - * struct with a extra memeber. - */ - typedef struct { - LPDEVMODEA lpDevMode; - struct { - LPPRINTDLGA lpPrintDlg; - LPPRINTDLG16 lpPrintDlg16; - } dlg; - LPPRINTER_INFO_2A lpPrinterInfo; - LPDRIVER_INFO_3A lpDriverInfo; - UINT HelpMessageID; - HICON hCollateIcon; /* PrintDlg only */ - HICON hNoCollateIcon; /* PrintDlg only */ - HICON hPortraitIcon; /* PrintSetupDlg only */ - HICON hLandscapeIcon; /* PrintSetupDlg only */ - HWND hwndUpDown; + PRINT_PTRA print32; + LPPRINTDLG16 lpPrintDlg16; } PRINT_PTRA16; /* Internal Functions */ @@ -120,10 +103,10 @@ static BOOL PRINTDLG_CreateDevNames16(HGLOBAL16 *hmem, char* DeviceDriverName, /*********************************************************************** * PRINTDLG_WMInitDialog [internal] */ -static LRESULT PRINTDLG_WMInitDialog16(HWND hDlg, WPARAM wParam, - PRINT_PTRA16* PrintStructures) +static LRESULT PRINTDLG_WMInitDialog16(HWND hDlg, WPARAM wParam, PRINT_PTRA16* ptr16) { - LPPRINTDLG16 lppd = PrintStructures->dlg.lpPrintDlg16; + PRINT_PTRA *PrintStructures = &ptr16->print32; + LPPRINTDLG16 lppd = ptr16->lpPrintDlg16; DEVNAMES *pdn; DEVMODEA *pdm; char *name = NULL; @@ -430,7 +413,8 @@ BOOL16 WINAPI PrintDlg16( bRet = TRUE; } else { HGLOBAL16 hDlgTmpl; - PRINT_PTRA16 *PrintStructures; + PRINT_PTRA *PrintStructures; + PRINT_PTRA16 *ptr16; /* load Dialog resources, * depending on Flags indicates Print32 or Print32_setup dialog @@ -440,18 +424,18 @@ BOOL16 WINAPI PrintDlg16( COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE); return FALSE; } - PrintStructures = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, - sizeof(PRINT_PTRA16)); - PrintStructures->dlg.lpPrintDlg16 = lppd; - PrintStructures->dlg.lpPrintDlg = (LPPRINTDLGA)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(PRINTDLGA)); -#define CVAL(x) PrintStructures->dlg.lpPrintDlg->x = lppd->x; -#define MVAL(x) PrintStructures->dlg.lpPrintDlg->x = MapSL(lppd->x); + ptr16 = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PRINT_PTRA16)); + ptr16->lpPrintDlg16 = lppd; + PrintStructures = &ptr16->print32; + PrintStructures->lpPrintDlg = (LPPRINTDLGA)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(PRINTDLGA)); +#define CVAL(x) PrintStructures->lpPrintDlg->x = lppd->x; +#define MVAL(x) PrintStructures->lpPrintDlg->x = MapSL(lppd->x); CVAL(Flags); - PrintStructures->dlg.lpPrintDlg->hwndOwner = HWND_32(lppd->hwndOwner); - PrintStructures->dlg.lpPrintDlg->hDC = HDC_32(lppd->hDC); + PrintStructures->lpPrintDlg->hwndOwner = HWND_32(lppd->hwndOwner); + PrintStructures->lpPrintDlg->hDC = HDC_32(lppd->hDC); CVAL(nFromPage);CVAL(nToPage);CVAL(nMinPage);CVAL(nMaxPage); CVAL(nCopies); - PrintStructures->dlg.lpPrintDlg->hInstance = HINSTANCE_32(lppd->hInstance); + PrintStructures->lpPrintDlg->hInstance = HINSTANCE_32(lppd->hInstance); CVAL(lCustData); MVAL(lpPrintTemplateName);MVAL(lpSetupTemplateName); /* Don't copy rest, it is 16 bit specific */ @@ -531,7 +515,7 @@ BOOL16 CALLBACK PrintDlgProc16(HWND16 hDlg16, UINT16 uMsg, WPARAM16 wParam, LPARAM lParam) { HWND hDlg = HWND_32(hDlg16); - PRINT_PTRA16* PrintStructures; + PRINT_PTRA16 *PrintStructures; BOOL16 res = FALSE; if (uMsg!=WM_INITDIALOG) { @@ -543,18 +527,18 @@ BOOL16 CALLBACK PrintDlgProc16(HWND16 hDlg16, UINT16 uMsg, WPARAM16 wParam, SetPropA(hDlg,"__WINE_PRINTDLGDATA",PrintStructures); res = PRINTDLG_WMInitDialog16(hDlg, wParam, PrintStructures); - if(PrintStructures->dlg.lpPrintDlg16->Flags & PD_ENABLEPRINTHOOK) { + if(PrintStructures->lpPrintDlg16->Flags & PD_ENABLEPRINTHOOK) { res = CallWindowProc16( - (WNDPROC16)PrintStructures->dlg.lpPrintDlg16->lpfnPrintHook, - hDlg16, uMsg, wParam, (LPARAM)PrintStructures->dlg.lpPrintDlg16 + (WNDPROC16)PrintStructures->lpPrintDlg16->lpfnPrintHook, + hDlg16, uMsg, wParam, (LPARAM)PrintStructures->lpPrintDlg16 ); } return res; } - if(PrintStructures->dlg.lpPrintDlg16->Flags & PD_ENABLEPRINTHOOK) { + if(PrintStructures->lpPrintDlg16->Flags & PD_ENABLEPRINTHOOK) { res = CallWindowProc16( - (WNDPROC16)PrintStructures->dlg.lpPrintDlg16->lpfnPrintHook, + (WNDPROC16)PrintStructures->lpPrintDlg16->lpfnPrintHook, hDlg16,uMsg, wParam, lParam ); if(LOWORD(res)) return res; @@ -569,12 +553,12 @@ BOOL16 CALLBACK PrintDlgProc16(HWND16 hDlg16, UINT16 uMsg, WPARAM16 wParam, hDlg, MAKEWPARAM(wParam,HIWORD(lParam)), LOWORD(lParam), - PrintStructures + &PrintStructures->print32 ); } case WM_DESTROY: - DestroyIcon(PrintStructures->hCollateIcon); - DestroyIcon(PrintStructures->hNoCollateIcon); + DestroyIcon(PrintStructures->print32.hCollateIcon); + DestroyIcon(PrintStructures->print32.hNoCollateIcon); /* FIXME: don't forget to delete the paper orientation icons here! */ return FALSE; diff --git a/reactos/lib/comdlg32/rsrc.rc b/reactos/lib/comdlg32/rsrc.rc index dc3558d517d..c5fbf3bb71d 100644 --- a/reactos/lib/comdlg32/rsrc.rc +++ b/reactos/lib/comdlg32/rsrc.rc @@ -62,6 +62,7 @@ #include "cdlg_Si.rc" #include "cdlg_Sk.rc" #include "cdlg_Sv.rc" +#include "cdlg_Th.rc" #include "cdlg_Wa.rc" #include "cdlg_Ja.rc" #include "cdlg_Zh.rc" diff --git a/reactos/lib/comdlg32/winehq2ros.patch b/reactos/lib/comdlg32/winehq2ros.patch new file mode 100644 index 00000000000..bf2a3115379 --- /dev/null +++ b/reactos/lib/comdlg32/winehq2ros.patch @@ -0,0 +1,268 @@ +Index: filetitle.c +=================================================================== +RCS file: /home/wine/wine/dlls/commdlg/filetitle.c,v +retrieving revision 1.15 +diff -u -r1.15 filetitle.c +--- filetitle.c 5 Sep 2003 23:08:42 -0000 1.15 ++++ filetitle.c 11 Mar 2004 21:21:49 -0000 +@@ -40,7 +40,7 @@ + * GetFileTitleA (COMDLG32.@) + * + */ +-short WINAPI GetFileTitleA(LPCSTR lpFile, LPSTR lpTitle, UINT cbBuf) ++short WINAPI GetFileTitleA(LPCSTR lpFile, LPSTR lpTitle, WORD cbBuf) + { + int ret; + UNICODE_STRING strWFile; +@@ -60,7 +60,7 @@ + * GetFileTitleW (COMDLG32.@) + * + */ +-short WINAPI GetFileTitleW(LPCWSTR lpFile, LPWSTR lpTitle, UINT cbBuf) ++short WINAPI GetFileTitleW(LPCWSTR lpFile, LPWSTR lpTitle, WORD cbBuf) + { + int i, len; + static const WCHAR brkpoint[] = {'*','[',']',0}; +Index: printdlg.c +=================================================================== +RCS file: /home/wine/wine/dlls/commdlg/printdlg.c,v +retrieving revision 1.74 +diff -u -r1.74 printdlg.c +--- printdlg.c 9 Jan 2004 05:10:35 -0000 1.74 ++++ printdlg.c 11 Mar 2004 21:21:50 -0000 +@@ -341,7 +341,7 @@ + lpdm->dmCollate = + (IsDlgButtonChecked(hDlg, chx2) == BST_CHECKED); + if (lpdm->dmFields & DM_COPIES) +- lpdm->dmCopies = GetDlgItemInt(hDlg, edt3, NULL, FALSE); ++ lpdm->u.s.dmCopies = GetDlgItemInt(hDlg, edt3, NULL, FALSE); + } else { + if (IsDlgButtonChecked(hDlg, chx2) == BST_CHECKED) + lppd->Flags |= PD_COLLATE; +@@ -416,7 +416,7 @@ + lpdm->dmCollate = + (IsDlgButtonChecked(hDlg, chx2) == BST_CHECKED); + if (lpdm->dmFields & DM_COPIES) +- lpdm->dmCopies = GetDlgItemInt(hDlg, edt3, NULL, FALSE); ++ lpdm->u.s.dmCopies = GetDlgItemInt(hDlg, edt3, NULL, FALSE); + } else { + if (IsDlgButtonChecked(hDlg, chx2) == BST_CHECKED) + lppd->Flags |= PD_COLLATE; +@@ -581,9 +581,9 @@ + Sel, 0); + if (dm) { + if (nIDComboBox == cmb2) +- dm->u1.s1.dmPaperSize = oldWord; ++ dm->u.s.dmPaperSize = oldWord; + else +- dm->dmDefaultSource = oldWord; ++ dm->u.s.dmDefaultSource = oldWord; + } + } + else { +@@ -593,9 +593,9 @@ + */ + if (dm) { + if (nIDComboBox == cmb2) +- oldWord = dm->u1.s1.dmPaperSize; ++ oldWord = dm->u.s.dmPaperSize; + else +- oldWord = dm->dmDefaultSource; ++ oldWord = dm->u.s.dmDefaultSource; + } + } + +@@ -691,9 +691,9 @@ + Sel, 0); + if (dm) { + if (nIDComboBox == cmb2) +- dm->u1.s1.dmPaperSize = oldWord; ++ dm->u.s.dmPaperSize = oldWord; + else +- dm->dmDefaultSource = oldWord; ++ dm->u.s.dmDefaultSource = oldWord; + } + } + else { +@@ -703,9 +703,9 @@ + */ + if (dm) { + if (nIDComboBox == cmb2) +- oldWord = dm->u1.s1.dmPaperSize; ++ oldWord = dm->u.s.dmPaperSize; + else +- oldWord = dm->dmDefaultSource; ++ oldWord = dm->u.s.dmDefaultSource; + } + } + +@@ -968,7 +968,7 @@ + if (lppd->hDevMode == 0) + copies = lppd->nCopies; + else +- copies = lpdm->dmCopies; ++ copies = lpdm->u.s.dmCopies; + if(copies == 0) copies = 1; + else if(copies < 0) copies = MAX_COPIES; + SetDlgItemInt(hDlg, edt3, copies, FALSE); +@@ -990,7 +990,7 @@ + ShowWindow(GetDlgItem(hDlg, chx1), SW_HIDE); + + } else { /* PD_PRINTSETUP */ +- BOOL bPortrait = (lpdm->u1.s1.dmOrientation == DMORIENT_PORTRAIT); ++ BOOL bPortrait = (lpdm->u.s.dmOrientation == DMORIENT_PORTRAIT); + + PRINTDLG_SetUpPaperComboBoxA(hDlg, cmb2, + PrintStructures->lpPrinterInfo->pPrinterName, +@@ -1131,7 +1131,7 @@ + if (lppd->hDevMode == 0) + copies = lppd->nCopies; + else +- copies = lpdm->dmCopies; ++ copies = lpdm->u.s.dmCopies; + if(copies == 0) copies = 1; + else if(copies < 0) copies = MAX_COPIES; + SetDlgItemInt(hDlg, edt3, copies, FALSE); +@@ -1153,7 +1153,7 @@ + ShowWindow(GetDlgItem(hDlg, chx1), SW_HIDE); + + } else { /* PD_PRINTSETUP */ +- BOOL bPortrait = (lpdm->u1.s1.dmOrientation == DMORIENT_PORTRAIT); ++ BOOL bPortrait = (lpdm->u.s.dmOrientation == DMORIENT_PORTRAIT); + + PRINTDLG_SetUpPaperComboBoxW(hDlg, cmb2, + PrintStructures->lpPrinterInfo->pPrinterName, +@@ -1490,7 +1490,7 @@ + case rad1: /* Paperorientation */ + if (lppd->Flags & PD_PRINTSETUP) + { +- lpdm->u1.s1.dmOrientation = DMORIENT_PORTRAIT; ++ lpdm->u.s.dmOrientation = DMORIENT_PORTRAIT; + SendDlgItemMessageA(hDlg, ico1, STM_SETIMAGE, (WPARAM) IMAGE_ICON, + (LPARAM)(PrintStructures->hPortraitIcon)); + } +@@ -1499,7 +1499,7 @@ + case rad2: /* Paperorientation */ + if (lppd->Flags & PD_PRINTSETUP) + { +- lpdm->u1.s1.dmOrientation = DMORIENT_LANDSCAPE; ++ lpdm->u.s.dmOrientation = DMORIENT_LANDSCAPE; + SendDlgItemMessageA(hDlg, ico1, STM_SETIMAGE, (WPARAM) IMAGE_ICON, + (LPARAM)(PrintStructures->hLandscapeIcon)); + } +@@ -1523,7 +1523,7 @@ + { + DWORD Sel = SendDlgItemMessageA(hDlg, cmb2, CB_GETCURSEL, 0, 0); + if(Sel != CB_ERR) +- lpdm->u1.s1.dmPaperSize = SendDlgItemMessageA(hDlg, cmb2, ++ lpdm->u.s.dmPaperSize = SendDlgItemMessageA(hDlg, cmb2, + CB_GETITEMDATA, + Sel, 0); + } +@@ -1533,7 +1533,7 @@ + { + DWORD Sel = SendDlgItemMessageA(hDlg, cmb3, CB_GETCURSEL, 0, 0); + if(Sel != CB_ERR) +- lpdm->dmDefaultSource = SendDlgItemMessageA(hDlg, cmb3, ++ lpdm->u.s.dmDefaultSource = SendDlgItemMessageA(hDlg, cmb3, + CB_GETITEMDATA, Sel, + 0); + } +@@ -1544,8 +1544,8 @@ + case rad1: /* orientation */ + case rad2: + if (IsDlgButtonChecked(hDlg, rad1) == BST_CHECKED) { +- if(lpdm->u1.s1.dmOrientation != DMORIENT_PORTRAIT) { +- lpdm->u1.s1.dmOrientation = DMORIENT_PORTRAIT; ++ if(lpdm->u.s.dmOrientation != DMORIENT_PORTRAIT) { ++ lpdm->u.s.dmOrientation = DMORIENT_PORTRAIT; + SendDlgItemMessageA(hDlg, stc10, STM_SETIMAGE, + (WPARAM)IMAGE_ICON, + (LPARAM)PrintStructures->hPortraitIcon); +@@ -1554,8 +1554,8 @@ + (LPARAM)PrintStructures->hPortraitIcon); + } + } else { +- if(lpdm->u1.s1.dmOrientation != DMORIENT_LANDSCAPE) { +- lpdm->u1.s1.dmOrientation = DMORIENT_LANDSCAPE; ++ if(lpdm->u.s.dmOrientation != DMORIENT_LANDSCAPE) { ++ lpdm->u.s.dmOrientation = DMORIENT_LANDSCAPE; + SendDlgItemMessageA(hDlg, stc10, STM_SETIMAGE, + (WPARAM)IMAGE_ICON, + (LPARAM)PrintStructures->hLandscapeIcon); +@@ -1654,7 +1654,7 @@ + case rad1: /* Paperorientation */ + if (lppd->Flags & PD_PRINTSETUP) + { +- lpdm->u1.s1.dmOrientation = DMORIENT_PORTRAIT; ++ lpdm->u.s.dmOrientation = DMORIENT_PORTRAIT; + SendDlgItemMessageA(hDlg, ico1, STM_SETIMAGE, (WPARAM) IMAGE_ICON, + (LPARAM)(PrintStructures->hPortraitIcon)); + } +@@ -1663,7 +1663,7 @@ + case rad2: /* Paperorientation */ + if (lppd->Flags & PD_PRINTSETUP) + { +- lpdm->u1.s1.dmOrientation = DMORIENT_LANDSCAPE; ++ lpdm->u.s.dmOrientation = DMORIENT_LANDSCAPE; + SendDlgItemMessageA(hDlg, ico1, STM_SETIMAGE, (WPARAM) IMAGE_ICON, + (LPARAM)(PrintStructures->hLandscapeIcon)); + } +@@ -1687,7 +1687,7 @@ + { + DWORD Sel = SendDlgItemMessageA(hDlg, cmb2, CB_GETCURSEL, 0, 0); + if(Sel != CB_ERR) +- lpdm->u1.s1.dmPaperSize = SendDlgItemMessageA(hDlg, cmb2, ++ lpdm->u.s.dmPaperSize = SendDlgItemMessageA(hDlg, cmb2, + CB_GETITEMDATA, + Sel, 0); + } +@@ -1697,7 +1697,7 @@ + { + DWORD Sel = SendDlgItemMessageA(hDlg, cmb3, CB_GETCURSEL, 0, 0); + if(Sel != CB_ERR) +- lpdm->dmDefaultSource = SendDlgItemMessageW(hDlg, cmb3, ++ lpdm->u.s.dmDefaultSource = SendDlgItemMessageW(hDlg, cmb3, + CB_GETITEMDATA, Sel, + 0); + } +@@ -1708,8 +1708,8 @@ + case rad1: /* orientation */ + case rad2: + if (IsDlgButtonChecked(hDlg, rad1) == BST_CHECKED) { +- if(lpdm->u1.s1.dmOrientation != DMORIENT_PORTRAIT) { +- lpdm->u1.s1.dmOrientation = DMORIENT_PORTRAIT; ++ if(lpdm->u.s.dmOrientation != DMORIENT_PORTRAIT) { ++ lpdm->u.s.dmOrientation = DMORIENT_PORTRAIT; + SendDlgItemMessageA(hDlg, stc10, STM_SETIMAGE, + (WPARAM)IMAGE_ICON, + (LPARAM)PrintStructures->hPortraitIcon); +@@ -1718,8 +1718,8 @@ + (LPARAM)PrintStructures->hPortraitIcon); + } + } else { +- if(lpdm->u1.s1.dmOrientation != DMORIENT_LANDSCAPE) { +- lpdm->u1.s1.dmOrientation = DMORIENT_LANDSCAPE; ++ if(lpdm->u.s.dmOrientation != DMORIENT_LANDSCAPE) { ++ lpdm->u.s.dmOrientation = DMORIENT_LANDSCAPE; + SendDlgItemMessageA(hDlg, stc10, STM_SETIMAGE, + (WPARAM)IMAGE_ICON, + (LPARAM)PrintStructures->hLandscapeIcon); +@@ -2911,7 +2911,7 @@ + /*********************************************************************** + * PrintDlgExA (COMDLG32.@) + */ +-HRESULT WINAPI PrintDlgExA(LPVOID lpPrintDlgExA) /* [???] FIXME: LPPRINTDLGEXA */ ++HRESULT WINAPI PrintDlgExA(LPPRINTDLGEXA lpPrintDlgExA) + { + FIXME("stub\n"); + return E_NOTIMPL; +@@ -2919,7 +2919,7 @@ + /*********************************************************************** + * PrintDlgExW (COMDLG32.@) + */ +-HRESULT WINAPI PrintDlgExW(LPVOID lpPrintDlgExW) /* [???] FIXME: LPPRINTDLGEXW */ ++HRESULT WINAPI PrintDlgExW(LPPRINTDLGEXW lpPrintDlgExW) + { + FIXME("stub\n"); + return E_NOTIMPL; From 0581a7d1a6143c93ded3903b5d3873bd7cc79059 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Thu, 11 Mar 2004 21:16:56 +0000 Subject: [PATCH 0437/1463] Fix DocumentPropertiesW declaration svn path=/trunk/; revision=8649 --- reactos/w32api/include/winspool.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/w32api/include/winspool.h b/reactos/w32api/include/winspool.h index cc803ca2747..e18eeda88d8 100644 --- a/reactos/w32api/include/winspool.h +++ b/reactos/w32api/include/winspool.h @@ -587,7 +587,7 @@ BOOL WINAPI DeletePrintProcessorW(LPWSTR,LPWSTR,LPWSTR); BOOL WINAPI DeletePrintProvidorA(LPSTR,LPSTR,LPSTR); BOOL WINAPI DeletePrintProvidorW(LPWSTR,LPWSTR,LPWSTR); LONG WINAPI DocumentPropertiesA(HWND,HANDLE,LPSTR,PDEVMODEA,PDEVMODEA,DWORD); -LONG WINAPI DocumentPropertiesW(HWND,HANDLE,LPWSTR,PDEVMODEA,PDEVMODEA,DWORD); +LONG WINAPI DocumentPropertiesW(HWND,HANDLE,LPWSTR,PDEVMODEW,PDEVMODEW,DWORD); BOOL WINAPI EndDocPrinter(HANDLE); BOOL WINAPI EndPagePrinter(HANDLE); BOOL WINAPI EnumFormsA(HANDLE,DWORD,PBYTE,DWORD,PDWORD,PDWORD); From 2f596c1ce88a2717d70da74f1a8be6a49dd46a5d Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Thu, 11 Mar 2004 21:38:58 +0000 Subject: [PATCH 0438/1463] - Implemented EngSaveFloatingPointState and EngRestoreFloatingState. svn path=/trunk/; revision=8650 --- reactos/subsys/win32k/eng/float.c | 85 +++++++++++++++++++++++++++++ reactos/subsys/win32k/makefile | 4 +- reactos/subsys/win32k/stubs/stubs.c | 21 ------- 3 files changed, 87 insertions(+), 23 deletions(-) create mode 100644 reactos/subsys/win32k/eng/float.c diff --git a/reactos/subsys/win32k/eng/float.c b/reactos/subsys/win32k/eng/float.c new file mode 100644 index 00000000000..62329c3d9bd --- /dev/null +++ b/reactos/subsys/win32k/eng/float.c @@ -0,0 +1,85 @@ +/* + * 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: float.c,v 1.1 2004/03/11 21:38:58 dwelch Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * PURPOSE: Engine floating point functions + * FILE: subsys/win32k/eng/float.c + * PROGRAMER: Jason Filby + * REVISION HISTORY: + */ + +#include <ddk/ntddk.h> +#include <ddk/winddi.h> +#include <win32k/dc.h> +#include <win32k/gdiobj.h> +#include <include/dib.h> +#include <include/object.h> +#include <include/paint.h> +#include "handle.h" +#include "../dib/dib.h" + +#define NDEBUG +#include <win32k/debug1.h> + +BOOL +STDCALL +EngRestoreFloatingPointState ( IN VOID *Buffer ) +{ + NTSTATUS Status; + Status = KeRestoreFloatingPointState((PKFLOATING_SAVE)Buffer); + if (Status != STATUS_SUCCESS) + { + return FALSE; + } + return TRUE; +} + +BOOL +STDCALL +EngSaveFloatingPointState(OUT VOID *Buffer, + IN ULONG BufferSize) +{ + KFLOATING_SAVE TempBuffer; + NTSTATUS Status; + if (Buffer == NULL || BufferSize == 0) + { + /* Check for floating point support. */ + Status = KeSaveFloatingPointState(&TempBuffer); + if (Status != STATUS_SUCCESS) + { + return(0); + } + KeRestoreFloatingPointState(&TempBuffer); + return(sizeof(KFLOATING_SAVE)); + } + if (BufferSize < sizeof(KFLOATING_SAVE)) + { + return(0); + } + Status = KeSaveFloatingPointState((PKFLOATING_SAVE)Buffer); + if (!NT_SUCCESS(Status)) + { + return FALSE; + } + return TRUE; +} + + diff --git a/reactos/subsys/win32k/makefile b/reactos/subsys/win32k/makefile index 9bb1da04d55..d0b29a4aff6 100644 --- a/reactos/subsys/win32k/makefile +++ b/reactos/subsys/win32k/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.95 2004/03/08 07:04:56 dwelch Exp $ +# $Id: makefile,v 1.96 2004/03/11 21:38:58 dwelch Exp $ PATH_TO_TOP = ../.. @@ -42,7 +42,7 @@ 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/gradient.o eng/event.o + eng/gradient.o eng/event.o eng/float.o MAIN_OBJECTS = main/dllmain.o main/svctabm.o diff --git a/reactos/subsys/win32k/stubs/stubs.c b/reactos/subsys/win32k/stubs/stubs.c index f8be6b7bc4c..e53a6f852ac 100644 --- a/reactos/subsys/win32k/stubs/stubs.c +++ b/reactos/subsys/win32k/stubs/stubs.c @@ -506,27 +506,6 @@ EngQueryPalette( return 0; } -BOOL -STDCALL -EngRestoreFloatingPointState ( IN VOID *pBuffer ) -{ - // www.osr.com/ddk/graphics/gdifncs_9l0n.htm - UNIMPLEMENTED; - return FALSE; -} - -ULONG -STDCALL -EngSaveFloatingPointState( - OUT VOID *pBuffer, - IN ULONG cjBufferSize - ) -{ - // www.osr.com/ddk/graphics/gdifncs_9tif.htm - UNIMPLEMENTED; - return 0; -} - BOOL STDCALL EngSetPointerTag( From 060aa03ca6f115394bc9cac54ef310c9c857b1ee Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Thu, 11 Mar 2004 21:42:01 +0000 Subject: [PATCH 0439/1463] - Added KeSaveFloatingPoint and KeRestoreFloatingPointState to the old ddk so win32k can use them. svn path=/trunk/; revision=8651 --- reactos/include/ddk/kefuncs.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/reactos/include/ddk/kefuncs.h b/reactos/include/ddk/kefuncs.h index cf820069b8b..9171e14bd56 100644 --- a/reactos/include/ddk/kefuncs.h +++ b/reactos/include/ddk/kefuncs.h @@ -4,6 +4,16 @@ /* KERNEL FUNCTIONS ********************************************************/ +NTSTATUS +STDCALL +KeRestoreFloatingPointState( + IN PKFLOATING_SAVE FloatSave); + +NTSTATUS +STDCALL +KeSaveFloatingPointState( + OUT PKFLOATING_SAVE FloatSave); + #ifndef KeFlushIoBuffers #define KeFlushIoBuffers(Mdl, ReadOperation, DmaOperation) #endif From 14a834a699e7f04ccd1252483b1011dfb12d873e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Thu, 11 Mar 2004 21:46:41 +0000 Subject: [PATCH 0440/1463] Sync to Wine-20040309: Mike Hearn <mh@codeweavers.com> - To reduce debugging noise, make IMalloc32/IMallocSpy implementations output to the new olemalloc debug channel. Patrik Stridvall <ps@leissner.se> - Fixed some issues found by winapi_check. Alexandre Julliard - Sync some of the dll registrations with the contents of winedefault.reg. svn path=/trunk/; revision=8652 --- reactos/lib/ole32/ifs.c | 4 ++-- reactos/lib/ole32/moniker.c | 4 ++-- reactos/lib/ole32/regsvr.c | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/reactos/lib/ole32/ifs.c b/reactos/lib/ole32/ifs.c index f9a811f7b28..2850651670b 100644 --- a/reactos/lib/ole32/ifs.c +++ b/reactos/lib/ole32/ifs.c @@ -34,7 +34,7 @@ #include "wine/debug.h" -WINE_DEFAULT_DEBUG_CHANNEL(ole); +WINE_DEFAULT_DEBUG_CHANNEL(olemalloc); /****************************************************************************** * IMalloc32 implementation @@ -596,7 +596,7 @@ HRESULT WINAPI CoRegisterMallocSpy(LPMALLOCSPY pMallocSpy) * CoRevokeMallocSpy [OLE32.@] * * NOTES - * we can't rewoke a malloc spy as long as memory blocks allocated with + * we can't revoke a malloc spy as long as memory blocks allocated with * the spy are active since only the spy knows how to free them */ HRESULT WINAPI CoRevokeMallocSpy(void) diff --git a/reactos/lib/ole32/moniker.c b/reactos/lib/ole32/moniker.c index d226a2c2da4..f5cbcaffe92 100644 --- a/reactos/lib/ole32/moniker.c +++ b/reactos/lib/ole32/moniker.c @@ -467,7 +467,7 @@ HRESULT WINAPI RunningObjectTableImpl_GetObjectIndex(RunningObjectTableImpl* Thi } /****************************************************************************** - * GetRunningObjectTable [OLE2.@] + * GetRunningObjectTable (OLE2.30) */ HRESULT WINAPI GetRunningObjectTable16(DWORD reserved, LPRUNNINGOBJECTTABLE *pprot) { @@ -527,7 +527,7 @@ HRESULT WINAPI MkParseDisplayName(LPBC pbc, LPCOLESTR szUserName, } /****************************************************************************** - * CreateClassMoniker [OLE32.*] + * CreateClassMoniker [OLE32.@] */ HRESULT WINAPI CreateClassMoniker(REFCLSID rclsid, IMoniker ** ppmk) { diff --git a/reactos/lib/ole32/regsvr.c b/reactos/lib/ole32/regsvr.c index 69f2d43ec14..4c3ddf21f39 100644 --- a/reactos/lib/ole32/regsvr.c +++ b/reactos/lib/ole32/regsvr.c @@ -500,7 +500,7 @@ static struct regsvr_interface const interface_list[] = { }, { &IID_IPersistStorage, "IPersistStorage", - NULL, + &IID_IPersist, 10, NULL, &CLSID_PSFactoryBuffer From 01d31249250101eb5d6f8c004a0d0c97afdaac94 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Thu, 11 Mar 2004 21:50:24 +0000 Subject: [PATCH 0441/1463] - Made KeBugCheckEx into a call to KeBugCheckExWithTf. - If file logging is in use then dump the last messages from the ringbuffer on a bugcheck so the user can see them if the system was in graphics mode when it crashed. svn path=/trunk/; revision=8653 --- reactos/ntoskrnl/include/internal/kd.h | 4 +- reactos/ntoskrnl/kd/dlog.c | 34 +++++++- reactos/ntoskrnl/ke/bug.c | 106 +++++-------------------- 3 files changed, 57 insertions(+), 87 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/kd.h b/reactos/ntoskrnl/include/internal/kd.h index dd0112f35a3..f523d07504a 100644 --- a/reactos/ntoskrnl/include/internal/kd.h +++ b/reactos/ntoskrnl/include/internal/kd.h @@ -1,4 +1,4 @@ -/* $Id: kd.h,v 1.23 2004/02/24 21:25:41 weiden Exp $ +/* $Id: kd.h,v 1.24 2004/03/11 21:50:23 dwelch Exp $ * * kernel debugger prototypes */ @@ -120,5 +120,7 @@ KD_CONTINUE_TYPE KdbEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord, PCONTEXT Context, PKTRAP_FRAME TrapFrame); +VOID +DebugLogDumpMessages(VOID); #endif /* __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H */ diff --git a/reactos/ntoskrnl/kd/dlog.c b/reactos/ntoskrnl/kd/dlog.c index b4bab1637ac..d0d31dc4daf 100644 --- a/reactos/ntoskrnl/kd/dlog.c +++ b/reactos/ntoskrnl/kd/dlog.c @@ -1,4 +1,4 @@ -/* $Id: dlog.c,v 1.12 2004/03/07 04:38:41 dwelch Exp $ +/* $Id: dlog.c,v 1.13 2004/03/11 21:50:23 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -35,6 +35,38 @@ static KEVENT DebugLogEvent; /* FUNCTIONS *****************************************************************/ +VOID +DebugLogDumpMessages(VOID) +{ + static CHAR Buffer[256]; + ULONG Offset; + ULONG Length; + + if (!(KdDebugState & KD_DEBUG_FILELOG)) + { + return; + } + KdDebugState &= ~KD_DEBUG_FILELOG; + + Offset = (DebugLogEnd + 1) % DEBUGLOG_SIZE; + do + { + if (Offset <= DebugLogEnd) + { + Length = min(255, DebugLogEnd - Offset); + } + else + { + Length = min(255, DEBUGLOG_SIZE - Offset); + } + memcpy(Buffer, DebugLog + Offset, Length); + Buffer[Length] = 0; + DbgPrint(Buffer); + Offset = (Offset + Length) % DEBUGLOG_SIZE; + } + while (Length > 0); +} + VOID INIT_FUNCTION DebugLogInit(VOID) { diff --git a/reactos/ntoskrnl/ke/bug.c b/reactos/ntoskrnl/ke/bug.c index c9ff4a6f550..7f51fe575e3 100644 --- a/reactos/ntoskrnl/ke/bug.c +++ b/reactos/ntoskrnl/ke/bug.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: bug.c,v 1.43 2004/03/09 21:49:53 dwelch Exp $ +/* $Id: bug.c,v 1.44 2004/03/11 21:50:24 dwelch Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/bug.c @@ -104,6 +104,7 @@ KeBugCheckWithTf(ULONG BugCheckCode, } Ke386DisableInterrupts(); + DebugLogDumpMessages(); if (KeGetCurrentIrql() < DISPATCH_LEVEL) { @@ -138,8 +139,23 @@ KeBugCheckWithTf(ULONG BugCheckCode, DbgPrint("Recursive bug check halting now\n"); Ke386HaltProcessor(); } - InBugCheck = 1; - KiDumpTrapFrame(Tf, BugCheckParameter1, BugCheckParameter2); + InBugCheck = 1; + if (Tf != NULL) + { + KiDumpTrapFrame(Tf, BugCheckParameter1, BugCheckParameter2); + } + else + { +#if defined(__GNUC__) + KeDumpStackFrames((PULONG)__builtin_frame_address(0)); +#elif defined(_MSC_VER) + __asm push ebp + __asm call KeDumpStackFrames + __asm add esp, 4 +#else +#error Unknown compiler for inline assembler +#endif + } MmDumpToPagingFile(BugCheckCode, BugCheckParameter1, BugCheckParameter2, BugCheckParameter3, BugCheckParameter4, Tf); @@ -175,88 +191,8 @@ KeBugCheckEx(ULONG BugCheckCode, * RETURNS: Doesn't */ { - PRTL_MESSAGE_RESOURCE_ENTRY Message; - NTSTATUS Status; - KIRQL OldIrql; - - /* Make sure we're switching back to the blue screen and print messages on it */ - HalReleaseDisplayOwnership(); - if (0 == (KdDebugState & KD_DEBUG_GDB)) - { - KdDebugState |= KD_DEBUG_SCREEN; - } - - Ke386DisableInterrupts(); - - if (KeGetCurrentIrql() < DISPATCH_LEVEL) - { - KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); - } - DbgPrint("Bug detected (code %x param %x %x %x %x)\n", - BugCheckCode, - BugCheckParameter1, - BugCheckParameter2, - BugCheckParameter3, - BugCheckParameter4); - - Status = RtlFindMessage((PVOID)KERNEL_BASE, //0xC0000000, - 11, //RT_MESSAGETABLE, - 0x09, //0x409, - BugCheckCode, - &Message); - if (NT_SUCCESS(Status)) - { - if (Message->Flags == 0) - DbgPrint(" %s\n", Message->Text); - else - DbgPrint(" %S\n", (PWSTR)Message->Text); - } - else - { - DbgPrint(" No message text found!\n\n"); - } - - if (InBugCheck == 1) - { - DbgPrint("Recursive bug check halting now\n"); - Ke386HaltProcessor(); - } - InBugCheck = 1; - if (PsGetCurrentProcess() != NULL) - { - DbgPrint("Pid: %x <", PsGetCurrentProcess()->UniqueProcessId); - DbgPrint("%.8s> ", PsGetCurrentProcess()->ImageFileName); - } - if (PsGetCurrentThread() != NULL) - { - DbgPrint("Thrd: %x Tid: %x\n", - PsGetCurrentThread(), - PsGetCurrentThread()->Cid.UniqueThread); - } -#if defined(__GNUC__) - KeDumpStackFrames((PULONG)__builtin_frame_address(0)); -#elif defined(_MSC_VER) - __asm push ebp - __asm call KeDumpStackFrames - __asm add esp, 4 -#else -#error Unknown compiler for inline assembler -#endif - MmDumpToPagingFile(BugCheckCode, BugCheckParameter1, - BugCheckParameter2, BugCheckParameter3, - BugCheckParameter4, NULL); - - if (KdDebuggerEnabled) - { - Ke386EnableInterrupts(); - DbgBreakPointNoBugCheck(); - Ke386DisableInterrupts(); - } - - for (;;) - { - Ke386HaltProcessor(); - } + KeBugCheckWithTf(BugCheckCode, BugCheckParameter1, BugCheckParameter2, + BugCheckParameter3, BugCheckParameter4, NULL); } /* From 778b9378b65bbbf4a11497d7fe3dc67cf4224f38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Thu, 11 Mar 2004 22:00:19 +0000 Subject: [PATCH 0442/1463] Sync to Wine-20040309: Marcelo Duarte <wine-devel@bol.com.br> - Update of Portuguese resources. svn path=/trunk/; revision=8654 --- reactos/lib/oledlg/oledlg_Pt.rc | 55 +++++++++++++++++++++++++++++ reactos/lib/oledlg/rsrc.rc | 1 + reactos/lib/oledlg/winehq2ros.patch | 0 3 files changed, 56 insertions(+) create mode 100644 reactos/lib/oledlg/oledlg_Pt.rc create mode 100644 reactos/lib/oledlg/winehq2ros.patch diff --git a/reactos/lib/oledlg/oledlg_Pt.rc b/reactos/lib/oledlg/oledlg_Pt.rc new file mode 100644 index 00000000000..c42056dd644 --- /dev/null +++ b/reactos/lib/oledlg/oledlg_Pt.rc @@ -0,0 +1,55 @@ +/* + * Copyright 2004 Marcelo Duarte + * + * 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_PORTUGUESE, SUBLANG_DEFAULT + +UIINSERTOBJECT DIALOG DISCARDABLE 0, 0, 294, 151 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Inserir objeto" +FONT 8, "MS Sans Serif" +BEGIN + LISTBOX IDC_OBJTYPELIST,82,19,131,66,LBS_SORT | + LBS_NOINTEGRALHEIGHT | WS_VISIBLE | WS_VSCROLL | + WS_TABSTOP + LTEXT "Tipo de objeto:",IDC_OBJTYPELBL,82,7,53,8,WS_VISIBLE + DEFPUSHBUTTON "OK",IDOK,221,7,66,14 + PUSHBUTTON "Cancelar",IDCANCEL,221,24,66,14 + GROUPBOX "Resultado",IDC_RESULT,7,103,208,41 + CONTROL "Criar novo",IDC_CREATENEW,"Button",BS_AUTORADIOBUTTON | + WS_GROUP,7,20,62,10 + CONTROL "Criar controle",IDC_CREATECONTROL,"Button", + BS_AUTORADIOBUTTON | NOT WS_VISIBLE,7,54,62,10 + CONTROL "Criar do arquivo",IDC_CREATEFROMFILE,"Button", + BS_AUTORADIOBUTTON,7,37,67,10 + LTEXT "",IDC_RESULTDESC,49,112,159,23 + PUSHBUTTON "&Adicionar Controle...",IDC_ADDCONTROL,81,88,63,14,NOT WS_VISIBLE + CONTROL "Mostrar como 韈one",IDC_ASICON,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP | NOT WS_VISIBLE,223,58,64,10 + PUSHBUTTON "Procurar...",IDC_BROWSE,83,53,50,14,NOT WS_VISIBLE + LTEXT "Arquivo:",IDC_FILELBL,83,27,20,8, NOT WS_VISIBLE + EDITTEXT IDC_FILE,83,37,132,13,ES_AUTOHSCROLL | NOT WS_VISIBLE +END + +STRINGTABLE DISCARDABLE +{ + IDS_RESULTOBJDESC "Inserir um novo objeto %s no documento" + IDS_RESULTFILEOBJDESC "Inserir o conte鷇o do arquivo como um objeto no documento de modo que possa ativ-lo usando o programa que o criou." + IDS_BROWSE "Procurar" + IDS_NOTOLEMOD "O arquivo n鉶 parece ser um m骴ulo OLE v醠ido. Imposs韛el registrar o controle OLE." + IDS_NOTOLEMODCAPTION "Adicionar Controle" +} diff --git a/reactos/lib/oledlg/rsrc.rc b/reactos/lib/oledlg/rsrc.rc index a9b05a76371..af0cc3a6463 100644 --- a/reactos/lib/oledlg/rsrc.rc +++ b/reactos/lib/oledlg/rsrc.rc @@ -34,3 +34,4 @@ #include "oledlg_En.rc" #include "oledlg_It.rc" #include "oledlg_Nl.rc" +#include "oledlg_Pt.rc" diff --git a/reactos/lib/oledlg/winehq2ros.patch b/reactos/lib/oledlg/winehq2ros.patch new file mode 100644 index 00000000000..e69de29bb2d From 162e4ee1f5ecb2f19cf448b763394e8427b50d57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Thu, 11 Mar 2004 22:30:40 +0000 Subject: [PATCH 0443/1463] Sync to Wine-20040309: Francois Gouget <fgouget@free.fr> - Assorted spelling and case fixes. Dmitry Timoshkov <dmitry@codeweavers.com> - Add SHMenuIndexFromID and SHCoCreateInstanceAC. Patrik Stridvall <ps@leissner.se> - Fixed some issues found by winapi_check. Jon Griffiths <jon_p_griffiths@yahoo.com> - Stub the stopwatch API. - Implement DoesStringRoundTripW,@371-3,@392. - Move a couple of string functions into string.c Robert Shearman <R.J.Shearman@warwick.ac.uk> - Add IntlStrEqWorkerA/W. - StrCmp tests. - Implement string functions in comctl32. - Use CompareString in shlwapi wherever possible instead of ugly helpers. Kevin Koltzau <kevin@plop.org> - Fix UrlCanonicalize and add regression test. - Prevent crash with invalid args in a few URL functions. svn path=/trunk/; revision=8655 --- reactos/lib/shlwapi/Makefile.in | 1 + reactos/lib/shlwapi/assoc.c | 2 +- reactos/lib/shlwapi/ordinal.c | 242 +++----------------- reactos/lib/shlwapi/shlwapi.spec | 38 ++-- reactos/lib/shlwapi/stopwatch.c | 228 +++++++++++++++++++ reactos/lib/shlwapi/string.c | 316 +++++++++++++++++++++------ reactos/lib/shlwapi/url.c | 41 +++- reactos/lib/shlwapi/winehq2ros.patch | 53 ++++- 8 files changed, 610 insertions(+), 311 deletions(-) create mode 100644 reactos/lib/shlwapi/stopwatch.c diff --git a/reactos/lib/shlwapi/Makefile.in b/reactos/lib/shlwapi/Makefile.in index f5eee2e2a52..a2f1d67a4c2 100644 --- a/reactos/lib/shlwapi/Makefile.in +++ b/reactos/lib/shlwapi/Makefile.in @@ -17,6 +17,7 @@ C_SRCS = \ reg.c \ regstream.c \ shlwapi_main.c \ + stopwatch.c \ string.c \ thread.c \ url.c \ diff --git a/reactos/lib/shlwapi/assoc.c b/reactos/lib/shlwapi/assoc.c index 753828944ca..4a8b1326930 100644 --- a/reactos/lib/shlwapi/assoc.c +++ b/reactos/lib/shlwapi/assoc.c @@ -418,7 +418,7 @@ HRESULT WINAPI AssocQueryStringByKeyA(ASSOCF cfFlags, ASSOCSTR str, HKEY hkAssoc * Determine if a file association is dangerous (potentially malware). * * PARAMS - * lpszAssoc [I] Name of file or file extention to check. + * lpszAssoc [I] Name of file or file extension to check. * * RETURNS * TRUE, if lpszAssoc may potentially be malware (executable), diff --git a/reactos/lib/shlwapi/ordinal.c b/reactos/lib/shlwapi/ordinal.c index 99a182172e7..96b4b67a6ef 100644 --- a/reactos/lib/shlwapi/ordinal.c +++ b/reactos/lib/shlwapi/ordinal.c @@ -34,7 +34,6 @@ #include "winbase.h" #include "winuser.h" #include "winnls.h" -#include "ddeml.h" #include "docobj.h" #include "exdisp.h" #include "shlguid.h" @@ -70,7 +69,6 @@ extern HMODULE SHLWAPI_hwinmm; extern HMODULE SHLWAPI_hcomdlg32; extern HMODULE SHLWAPI_hcomctl32; extern HMODULE SHLWAPI_hmpr; -extern HMODULE SHLWAPI_hmlang; extern HMODULE SHLWAPI_hurlmon; extern HMODULE SHLWAPI_hversion; @@ -86,8 +84,6 @@ static DWORD id2[4] = {0x79eac9ee, 0x11cebaf9, 0xaa00828c, 0x0ba94b00}; /* Function pointers for GET_FUNC macro; these need to be global because of gcc bug */ typedef LPITEMIDLIST (WINAPI *fnpSHBrowseForFolderW)(LPBROWSEINFOW); static fnpSHBrowseForFolderW pSHBrowseForFolderW; -typedef HRESULT (WINAPI *fnpConvertINetUnicodeToMultiByte)(LPDWORD,DWORD,LPCWSTR,LPINT,LPSTR,LPINT); -static fnpConvertINetUnicodeToMultiByte pConvertINetUnicodeToMultiByte; typedef BOOL (WINAPI *fnpPlaySoundW)(LPCWSTR, HMODULE, DWORD); static fnpPlaySoundW pPlaySoundW; typedef DWORD (WINAPI *fnpSHGetFileInfoW)(LPCWSTR,DWORD,SHFILEINFOW*,UINT,UINT); @@ -585,7 +581,7 @@ HRESULT WINAPI GetAcceptLanguagesA( /************************************************************************* * @ [SHLWAPI.15] * - * Unicode version of SHLWAPI_14. + * Unicode version of GetAcceptLanguagesA. */ HRESULT WINAPI GetAcceptLanguagesW( LPWSTR langbuf, @@ -670,7 +666,7 @@ INT WINAPI SHStringFromGUIDW(REFGUID guid, LPWSTR lpszDest, INT cchMax) { char xguid[40]; INT iLen = SHStringFromGUIDA(guid, xguid, cchMax); - + if (iLen) MultiByteToWideChar(CP_ACP, 0, xguid, -1, lpszDest, cchMax); return iLen; @@ -1168,38 +1164,6 @@ BOOL WINAPI SHAboutInfoW(LPWSTR lpszDest, DWORD dwDestLen) return TRUE; } -/************************************************************************* - * @ [SHLWAPI.162] - * - * Remove a hanging lead byte from the end of a string, if present. - * - * PARAMS - * lpStr [I] String to check for a hanging lead byte - * size [I] Length of lpStr - * - * RETURNS - * Success: The new length of the string. Any hanging lead bytes are removed. - * Failure: 0, if any parameters are invalid. - */ -DWORD WINAPI SHTruncateString(LPSTR lpStr, DWORD size) -{ - if (lpStr && size) - { - LPSTR lastByte = lpStr + size - 1; - - while(lpStr < lastByte) - lpStr += IsDBCSLeadByte(*lpStr) ? 2 : 1; - - if(lpStr == lastByte && IsDBCSLeadByte(*lpStr)) - { - *lpStr = '\0'; - size--; - } - return size; - } - return 0; -} - /************************************************************************* * @ [SHLWAPI.163] * @@ -2176,148 +2140,6 @@ DWORD WINAPI FDSA_DeleteItem( return 1; } -/************************************************************************* - * @ [SHLWAPI.215] - * - * NOTES - * check me! - */ -DWORD WINAPI SHAnsiToUnicode( - LPCSTR lpStrSrc, - LPWSTR lpwStrDest, - int len) -{ - INT len_a, ret; - - len_a = lstrlenA(lpStrSrc); - ret = MultiByteToWideChar(0, 0, lpStrSrc, len_a, lpwStrDest, len); - TRACE("%s %s %d, ret=%d\n", - debugstr_a(lpStrSrc), debugstr_w(lpwStrDest), len, ret); - return ret; -} - -/************************************************************************* - * @ [SHLWAPI.218] - * - * WideCharToMultiByte with support for multiple codepages. - * - * PARAMS - * CodePage [I] Code page to use for the conversion - * lpSrcStr [I] Source Unicode string to convert - * lpDstStr [O] Destination for converted Ascii string - * lpnMultiCharCount [O] Input length of lpDstStr/destination for length of lpDstStr - * - * RETURNS - * Success: The number of characters that result from the conversion. - * Failure: 0. - */ -INT WINAPI SHUnicodeToAnsiCP(UINT CodePage, LPCWSTR lpSrcStr, LPSTR lpDstStr, - LPINT lpnMultiCharCount) -{ - WCHAR emptyW[] = { '\0' }; - int len , reqLen; - LPSTR mem; - - if (!lpDstStr || !lpnMultiCharCount) - return 0; - - if (!lpSrcStr) - lpSrcStr = emptyW; - - *lpDstStr = '\0'; - - len = strlenW(lpSrcStr) + 1; - - switch (CodePage) - { - case CP_WINUNICODE: - CodePage = CP_UTF8; /* Fall through... */ - case 0x0000C350: /* FIXME: CP_ #define */ - case CP_UTF7: - case CP_UTF8: - { - DWORD dwMode = 0; - INT nWideCharCount = len - 1; - - GET_FUNC(pConvertINetUnicodeToMultiByte, mlang, "ConvertINetUnicodeToMultiByte", 0); - if (!pConvertINetUnicodeToMultiByte(&dwMode, CodePage, lpSrcStr, &nWideCharCount, lpDstStr, - lpnMultiCharCount)) - return 0; - - if (nWideCharCount < len - 1) - { - mem = (LPSTR)HeapAlloc(GetProcessHeap(), 0, *lpnMultiCharCount); - if (!mem) - return 0; - - *lpnMultiCharCount = 0; - - if (pConvertINetUnicodeToMultiByte(&dwMode, CodePage, lpSrcStr, &len, mem, lpnMultiCharCount)) - { - SHTruncateString(mem, *lpnMultiCharCount); - lstrcpynA(lpDstStr, mem, *lpnMultiCharCount + 1); - return *lpnMultiCharCount + 1; - } - HeapFree(GetProcessHeap(), 0, mem); - return *lpnMultiCharCount; - } - lpDstStr[*lpnMultiCharCount] = '\0'; - return *lpnMultiCharCount; - } - break; - default: - break; - } - - reqLen = WideCharToMultiByte(CodePage, 0, lpSrcStr, len, lpDstStr, - *lpnMultiCharCount, NULL, NULL); - - if (!reqLen && GetLastError() == ERROR_INSUFFICIENT_BUFFER) - { - reqLen = WideCharToMultiByte(CodePage, 0, lpSrcStr, len, NULL, 0, NULL, NULL); - if (reqLen) - { - mem = (LPSTR)HeapAlloc(GetProcessHeap(), 0, reqLen); - if (mem) - { - reqLen = WideCharToMultiByte(CodePage, 0, lpSrcStr, len, mem, - reqLen, NULL, NULL); - - reqLen = SHTruncateString(mem, *lpnMultiCharCount); - reqLen++; - - lstrcpynA(lpDstStr, mem, *lpnMultiCharCount); - - HeapFree(GetProcessHeap(), 0, mem); - } - } - } - return reqLen; -} - -/************************************************************************* - * @ [SHLWAPI.217] - * - * WideCharToMultiByte with support for multiple codepages. - * - * PARAMS - * lpSrcStr [I] Source Unicode string to convert - * lpDstStr [O] Destination for converted Ascii string - * lpnMultiCharCount [O] Input length of lpDstStr/destination for length of lpDstStr - * - * RETURNS - * See SHUnicodeToAnsiCP - - * NOTES - * This function simply calls SHUnicodeToAnsiCP with CodePage = CP_ACP. - */ -INT WINAPI SHUnicodeToAnsi(LPCWSTR lpSrcStr, LPSTR lpDstStr, INT MultiCharCount) -{ - INT myint = MultiCharCount; - - return SHUnicodeToAnsiCP(CP_ACP, lpSrcStr, lpDstStr, &myint); -} - typedef struct { REFIID refid; DWORD indx; @@ -2514,16 +2336,6 @@ LRESULT CALLBACK SHDefWindowProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM return DefWindowProcA(hWnd, uMessage, wParam, lParam); } -/************************************************************************* - * @ [SHLWAPI.241] - * - */ -DWORD WINAPI StopWatchMode() -{ - FIXME("()stub\n"); - return /* 0xabba1243 */ 0; -} - /************************************************************************* * @ [SHLWAPI.257] * @@ -3357,25 +3169,6 @@ HRESULT WINAPI SHInvokeCommand(HWND hWnd, IShellFolder* lpFolder, LPCITEMIDLIST return hRet; } -/************************************************************************* - * @ [SHLWAPI.364] - * - * Copy one string to another, up to a given length. - * - * PARAMS - * lpszSrc [I] Source string to copy - * lpszDst [O] Destination for copied string - * iLen [I] Number of characters to copy - * - * RETURNS - * TRUE. - */ -DWORD WINAPI DoesStringRoundTripA(LPCSTR lpszSrc, LPSTR lpszDst, INT iLen) -{ - lstrcpynA(lpszDst, lpszSrc, iLen); - return TRUE; -} - /************************************************************************* * @ [SHLWAPI.370] * @@ -3998,6 +3791,25 @@ INT WINAPI GetMenuPosFromID(HMENU hMenu, UINT wID) return -1; } +/************************************************************************* + * @ [SHLWAPI.179] + * + * Same as SHLWAPI.GetMenuPosFromID + */ +DWORD WINAPI SHMenuIndexFromID(HMENU hMenu, UINT uID) +{ + return GetMenuPosFromID(hMenu, uID); +} + +/************************************************************************* + * @ [SHLWAPI.549] + */ +HRESULT WINAPI SHCoCreateInstanceAC(REFCLSID rclsid, LPUNKNOWN pUnkOuter, + DWORD dwClsContext, REFIID iid, LPVOID *ppv) +{ + return CoCreateInstance(rclsid, pUnkOuter, dwClsContext, iid, ppv); +} + /************************************************************************* * SHSkipJunction [SHLWAPI.@] * @@ -4036,18 +3848,27 @@ BOOL WINAPI SHSkipJunction(IBindCtx *pbc, const CLSID *pclsid) return bRet; } +/*********************************************************************** + * SHGetShellKey (SHLWAPI.@) + */ DWORD WINAPI SHGetShellKey(DWORD a, DWORD b, DWORD c) { FIXME("(%lx, %lx, %lx): stub\n", a, b, c); return 0x50; } +/*********************************************************************** + * SHQueueUserWorkItem (SHLWAPI.@) + */ HRESULT WINAPI SHQueueUserWorkItem(DWORD a, DWORD b, DWORD c, DWORD d, DWORD e, DWORD f, DWORD g) { FIXME("(%lx, %lx, %lx, %lx, %lx, %lx, %lx): stub\n", a, b, c, d, e, f, g); return E_FAIL; } +/*********************************************************************** + * IUnknown_OnFocusChangeIS (SHLWAPI.@) + */ DWORD WINAPI IUnknown_OnFocusChangeIS(IUnknown * pUnk, IUnknown * pFocusObject, BOOL bChange) { FIXME("(%p, %p, %s)\n", pUnk, pFocusObject, bChange ? "TRUE" : "FALSE"); @@ -4061,6 +3882,9 @@ DWORD WINAPI IUnknown_OnFocusChangeIS(IUnknown * pUnk, IUnknown * pFocusObject, return 0; } +/*********************************************************************** + * SHGetValueW (SHLWAPI.@) + */ HRESULT WINAPI SKGetValueW(DWORD a, LPWSTR b, LPWSTR c, DWORD d, DWORD e, DWORD f) { FIXME("(%lx, %s, %s, %lx, %lx, %lx): stub\n", a, debugstr_w(b), debugstr_w(c), d, e, f); diff --git a/reactos/lib/shlwapi/shlwapi.spec b/reactos/lib/shlwapi/shlwapi.spec index adf2adc96f5..262e5c259e4 100644 --- a/reactos/lib/shlwapi/shlwapi.spec +++ b/reactos/lib/shlwapi/shlwapi.spec @@ -176,7 +176,7 @@ 176 stdcall -noname IUnknown_QueryService(ptr ptr ptr ptr) 177 stdcall -noname SHLoadMenuPopup(ptr wstr) 178 stdcall -noname SHPropagateMessage(ptr long long long long) -179 stub -noname SHMenuIndexFromID +179 stdcall -noname SHMenuIndexFromID(long long) 180 stdcall -noname SHRemoveAllSubMenus(long) 181 stdcall -noname SHEnableMenuItem(long long long) 182 stdcall -noname SHCheckMenuItem(long long long) @@ -239,17 +239,17 @@ 239 stdcall -noname SHUnregisterClassesW(ptr ptr long) 240 stdcall -noname SHDefWindowProc(long long long long) 241 stdcall -noname StopWatchMode() -242 stub -noname StopWatchFlush -243 stub -noname StopWatchA -244 stub -noname StopWatchW -245 stub -noname StopWatch_TimerHandler +242 stdcall -noname StopWatchFlush() +243 stdcall -noname StopWatchA(long str long long long) +244 stdcall -noname StopWatchW(long wstr long long long) +245 stdcall -noname StopWatch_TimerHandler(ptr ptr long ptr) 246 stub -noname StopWatch_CheckMsg -247 stub -noname StopWatch_MarkFrameStart -248 stub -noname StopWatch_MarkSameFramStart -249 stub -noname StopWatch_MarkJavaStop -250 stub -noname GetPerfTime +247 stdcall -noname StopWatch_MarkFrameStart(str) +248 stub -noname StopWatch_MarkSameFrameStart +249 stdcall -noname StopWatch_MarkJavaStop(wstr ptr long) +250 stdcall -noname GetPerfTime() 251 stub -noname StopWatch_DispatchTime -252 stub -noname StopWatch_SetMsgLastLocation +252 stdcall -noname StopWatch_SetMsgLastLocation(long) 253 stub -noname StopWatchExA 254 stub -noname StopWatchExW 255 stub -noname EventTraceHandler @@ -361,16 +361,16 @@ 361 stdcall @(wstr ptr long) kernel32.GetShortPathNameW 362 stdcall @(ptr ptr) advapi32.GetUserNameW 363 stdcall -noname SHInvokeCommand(ptr ptr ptr long) -364 stdcall -noname DoesStringRoundTripA(str str long) -365 stub -noname DoesStringRoundTripW +364 stdcall -noname DoesStringRoundTripA(str ptr long) +365 stdcall -noname DoesStringRoundTripW(wstr ptr long) 366 stdcall @(long long ptr ptr ptr ptr ptr ptr) advapi32.RegEnumValueW 367 stdcall @(wstr wstr ptr long wstr) kernel32.WritePrivateProfileStructW 368 stdcall @(wstr wstr ptr long wstr) kernel32.GetPrivateProfileStructW 369 stdcall @(wstr wstr ptr ptr long long ptr wstr ptr ptr) kernel32.CreateProcessW 370 stdcall -noname ExtractIconWrapW(long wstr long) -371 stub -noname DdeInitializeWrapW -372 stub -noname DdeCreateStringHandleWrapW -373 stub -noname DdeQueryStringWrapW +371 stdcall DdeInitializeWrapW(ptr ptr long long) user32.DdeInitializeW +372 stdcall DdeCreateStringHandleWrapW(long ptr long) user32.DdeCreateStringHandleW +373 stdcall DdeQueryStringWrapW(long ptr wstr long long) user32.DdeQueryStringW 374 stub -noname SHCheckDiskForMediaA 375 stub -noname SHCheckDiskForMediaW 376 stdcall -noname MLGetUILanguage() # kernel32.GetUserDefaultUILanguage @@ -389,7 +389,7 @@ 389 stdcall -noname GetSaveFileNameWrapW(ptr) 390 stdcall -noname WNetRestoreConnectionWrapW(long wstr) 391 stdcall -noname WNetGetLastErrorWrapW(ptr ptr long ptr long) -392 stub -noname EndDialogWrap +392 stdcall EndDialogWrap(ptr ptr) user32.EndDialog 393 stdcall @(long ptr long ptr long) user32.CreateDialogIndirectParamW 394 stdcall @(long ptr long ptr long) user32.CreateDialogIndirectParamA 395 stub -noname MLWinHelpA @@ -542,7 +542,7 @@ 546 stub -noname IUnknown_DoContextMenuPopup 548 stub -noname SHAreIconsEqual -549 stub -noname SHCoCreateInstanceAC +549 stdcall -noname SHCoCreateInstanceAC(ptr ptr long ptr ptr) 550 stub -noname GetTemplateInfoFroHandle 551 stub -noname IShellFolder_CompareIDs @@ -561,8 +561,8 @@ @ stdcall DllGetVersion (ptr) SHLWAPI_DllGetVersion @ stdcall GetMenuPosFromID(ptr long) @ stdcall HashData (ptr long ptr long) -@ stub IntlStrEqWorkerA -@ stub IntlStrEqWorkerW +@ stdcall IntlStrEqWorkerA(long str str long) StrIsIntlEqualA +@ stdcall IntlStrEqWorkerW(long wstr wstr long) StrIsIntlEqualW @ stdcall PathAddBackslashA (str) @ stdcall PathAddBackslashW (wstr) @ stdcall PathAddExtensionA (str str) diff --git a/reactos/lib/shlwapi/stopwatch.c b/reactos/lib/shlwapi/stopwatch.c new file mode 100644 index 00000000000..173d9a0c50b --- /dev/null +++ b/reactos/lib/shlwapi/stopwatch.c @@ -0,0 +1,228 @@ +/* + * Stopwatch Functions + * + * Copyright 2004 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 + * + * NOTES + * These functions probably never need to be implemented unless we + * A) Rewrite explorer from scratch, and + * B) Want to use a substandard API to tune its performance. + */ + +#include "config.h" +#include "wine/port.h" + +#include <stdarg.h> +#include <string.h> +#include <stdlib.h> + +#define NONAMELESSUNION +#define NONAMELESSSTRUCT +#include "wine/unicode.h" +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "winreg.h" +#define NO_SHLWAPI_STREAM +#include "shlwapi.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +/************************************************************************* + * @ [SHLWAPI.241] + * + * Get the current performance monitoring mode. + * + * PARAMS + * None. + * + * RETURNS + * The current performance monitoring mode. This is zero if monitoring + * is disabled (the default). + * + * NOTES + * If this function returns 0, no further StopWatch functions should be called. + */ +DWORD WINAPI StopWatchMode() +{ + FIXME("() stub!\n"); + return 0; +} + +/************************************************************************* + * @ [SHLWAPI.242] + * + * Write captured performance nodes to a log file. + * + * PARAMS + * None. + * + * RETURNS + * Nothing. + */ +void WINAPI StopWatchFlush() +{ + FIXME("() stub!\n"); +} + + +/************************************************************************* + * @ [SHLWAPI.243] + * + * Write a performance event to a log file + * + * PARAMS + * dwClass [I] Class of event + * lpszStr [I] Text of event to log + * dwUnknown [I] Unknown + * dwMode [I] Mode flags + * dwTimeStamp [I] Timestamp + * + * RETURNS + * Success: ERROR_SUCCESS. + * Failure: A standard Win32 error code indicating the failure. + */ +DWORD WINAPI StopWatchA(DWORD dwClass, LPCSTR lpszStr, DWORD dwUnknown, + DWORD dwMode, DWORD dwTimeStamp) +{ + FIXME("(%ld,%s,%ld,%ld,%ld) stub!\n", dwClass, debugstr_a(lpszStr), + dwUnknown, dwMode, dwTimeStamp); + return ERROR_SUCCESS; +} + +/************************************************************************* + * @ [SHLWAPI.244] + * + * See StopWatchA. + */ +DWORD WINAPI StopWatchW(DWORD dwClass, LPCWSTR lpszStr, DWORD dwUnknown, + DWORD dwMode, DWORD dwTimeStamp) +{ + char szBuff[MAX_PATH]; + + if(!WideCharToMultiByte(0, 0, lpszStr, -1, szBuff, MAX_PATH, 0, 0)) + return ERROR_NOT_ENOUGH_MEMORY; + + return StopWatchA(dwClass, szBuff, dwUnknown, dwMode, dwTimeStamp); +} + +/************************************************************************* + * @ [SHLWAPI.245] + * + * Log a shell frame event. + * + * PARAMS + * hWnd [I] Window having the event + * pvUnknown1 [I] Unknown + * bUnknown2 [I] Unknown + * pClassWnd [I] Window of class to log + * + * RETURNS + * Nothing. + */ +void WINAPI StopWatch_TimerHandler(HWND hWnd, PVOID pvUnknown1, BOOL bUnknown2, HWND *pClassWnd) +{ + FIXME("(%p,%p,%d,%p) stub!\n", hWnd, pvUnknown1, bUnknown2 ,pClassWnd); +} + +/* FIXME: Parameters for @246:StopWatch_CheckMsg unknown */ + +/************************************************************************* + * @ [SHLWAPI.247] + * + * Log the start of an applet. + * + * PARAMS + * lpszName [I] Name of the applet + * + * RETURNS + * Nothing. + */ +void WINAPI StopWatch_MarkFrameStart(LPCSTR lpszName) +{ + FIXME("(%s) stub!\n", debugstr_a(lpszName)); +} + +/* FIXME: Parameters for @248:StopWatch_MarkSameFrameStart unknown */ + +/************************************************************************* + * @ [SHLWAPI.249] + * + * Log a java applet stopping. + * + * PARAMS + * lpszEvent [I] Name of the event (applet) + * hWnd [I] Window running the applet + * dwReserved [I] Unused + * + * RETURNS + * Nothing. + */ +void WINAPI StopWatch_MarkJavaStop(LPCWSTR lpszEvent, HWND hWnd, DWORD dwReserved) +{ + FIXME("(%s,%p,0x%08lx) stub!\n", debugstr_w(lpszEvent), hWnd, dwReserved); +} + +/************************************************************************* + * @ [SHLWAPI.250] + * + * Read the performance counter. + * + * PARAMS + * None. + * + * RETURNS + * The low 32 bits of the current performance counter reading. + */ +DWORD WINAPI GetPerfTime() +{ + static LONG64 iCounterFreq = 0; + LARGE_INTEGER iCounter; + + TRACE("()\n"); + + if (!iCounterFreq) + QueryPerformanceFrequency((LARGE_INTEGER*)&iCounterFreq); + + QueryPerformanceCounter(&iCounter); + iCounter.QuadPart = iCounter.QuadPart * 1000 / iCounterFreq; + return iCounter.u.LowPart; +} + +/* FIXME: Parameters for @251:StopWatch_DispatchTime unknown */ + +/************************************************************************* + * @ [SHLWAPI.252] + * + * Set an as yet unidentified performance value. + * + * PARAMS + * dwUnknown [I] Value to set + * + * RETURNS + * dwUnknown. + */ +DWORD WINAPI StopWatch_SetMsgLastLocation(DWORD dwUnknown) +{ + FIXME("(%ld) stub!\n", dwUnknown); + + return dwUnknown; +} + +/* FIXME: Parameters for @253:StopWatchExA, 254:StopWatchExW unknown */ diff --git a/reactos/lib/shlwapi/string.c b/reactos/lib/shlwapi/string.c index 85584b2afd2..d2c12776b17 100644 --- a/reactos/lib/shlwapi/string.c +++ b/reactos/lib/shlwapi/string.c @@ -38,11 +38,27 @@ #include "wingdi.h" #include "winuser.h" #include "shlobj.h" +#include "ddeml.h" #include "wine/unicode.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(shell); +/* Get a function pointer from a DLL handle */ +#define GET_FUNC(func, module, name, fail) \ + do { \ + if (!func) { \ + if (!SHLWAPI_h##module && !(SHLWAPI_h##module = LoadLibraryA(#module ".dll"))) return fail; \ + func = (fn##func)GetProcAddress(SHLWAPI_h##module, name); \ + if (!func) return fail; \ + } \ + } while (0) + +extern HMODULE SHLWAPI_hmlang; + +typedef HRESULT (WINAPI *fnpConvertINetUnicodeToMultiByte)(LPDWORD,DWORD,LPCWSTR,LPINT,LPSTR,LPINT); +static fnpConvertINetUnicodeToMultiByte pConvertINetUnicodeToMultiByte; + static HRESULT WINAPI _SHStrDupAA(LPCSTR,LPSTR*); static HRESULT WINAPI _SHStrDupAW(LPCWSTR,LPSTR*); @@ -264,51 +280,12 @@ LPWSTR WINAPI StrChrIW(LPCWSTR lpszStr, WCHAR ch) */ int WINAPI StrCmpIW(LPCWSTR lpszStr, LPCWSTR lpszComp) { - INT iRet; + int iRet; TRACE("(%s,%s)\n", debugstr_w(lpszStr),debugstr_w(lpszComp)); - iRet = strcmpiW(lpszStr, lpszComp); - return iRet < 0 ? -1 : iRet ? 1 : 0; -} - -/************************************************************************* - * SHLWAPI_StrCmpNHelperA - * - * Internal helper for StrCmpNA/StrCmpNIA. - */ -static INT WINAPI SHLWAPI_StrCmpNHelperA(LPCSTR lpszStr, LPCSTR lpszComp, - INT iLen, - BOOL (WINAPI *pChrCmpFn)(WORD,WORD)) -{ - if (!lpszStr) - { - if (!lpszComp) - return 0; - return 1; - } - else if (!lpszComp) - return -1; - - while (iLen-- > 0) - { - int iDiff; - WORD ch1, ch2; - - ch1 = IsDBCSLeadByte(*lpszStr)? *lpszStr << 8 | lpszStr[1] : *lpszStr; - ch2 = IsDBCSLeadByte(*lpszComp)? *lpszComp << 8 | lpszComp[1] : *lpszComp; - - if ((iDiff = pChrCmpFn(ch1, ch2)) < 0) - return -1; - else if (iDiff > 0) - return 1; - else if (!*lpszStr && !*lpszComp) - return 0; - - lpszStr = CharNextA(lpszStr); - lpszComp = CharNextA(lpszComp); - } - return 0; + iRet = CompareStringW(GetThreadLocale(), NORM_IGNORECASE, lpszStr, -1, lpszComp, -1); + return iRet == CSTR_LESS_THAN ? -1 : iRet == CSTR_GREATER_THAN ? 1 : 0; } /************************************************************************* @@ -327,9 +304,12 @@ static INT WINAPI SHLWAPI_StrCmpNHelperA(LPCSTR lpszStr, LPCSTR lpszComp, */ INT WINAPI StrCmpNA(LPCSTR lpszStr, LPCSTR lpszComp, INT iLen) { + INT iRet; + TRACE("(%s,%s,%i)\n", debugstr_a(lpszStr), debugstr_a(lpszComp), iLen); - return SHLWAPI_StrCmpNHelperA(lpszStr, lpszComp, iLen, SHLWAPI_ChrCmpA); + iRet = CompareStringA(GetThreadLocale(), 0, lpszStr, iLen, lpszComp, iLen); + return iRet == CSTR_LESS_THAN ? -1 : iRet == CSTR_GREATER_THAN ? 1 : 0; } /************************************************************************* @@ -343,8 +323,8 @@ INT WINAPI StrCmpNW(LPCWSTR lpszStr, LPCWSTR lpszComp, INT iLen) TRACE("(%s,%s,%i)\n", debugstr_w(lpszStr), debugstr_w(lpszComp), iLen); - iRet = strncmpW(lpszStr, lpszComp, iLen); - return iRet < 0 ? -1 : iRet ? 1 : 0; + iRet = CompareStringW(GetThreadLocale(), 0, lpszStr, iLen, lpszComp, iLen); + return iRet == CSTR_LESS_THAN ? -1 : iRet == CSTR_GREATER_THAN ? 1 : 0; } /************************************************************************* @@ -360,23 +340,15 @@ INT WINAPI StrCmpNW(LPCWSTR lpszStr, LPCWSTR lpszComp, INT iLen) * RETURNS * An integer less than, equal to or greater than 0, indicating that * lpszStr is less than, the same, or greater than lpszComp. - * - * NOTES - * The Win32 version of this function is _completely_ broken for cases - * where iLen is greater than the length of lpszComp. Examples: - * - *| StrCmpNIA("foo.gif", "foo", 5) is -1 under Win32; Should return 1. - *| StrCmpNIA("\", "\\", 3) is 0 under Win32; Should return -1. - *| StrCmpNIA("\", "\..\foo\", 3) is 1 under Win32; Should return -1. - * - * This implementation behaves correctly, since it is unlikely any - * applications actually rely on this function being broken. */ int WINAPI StrCmpNIA(LPCSTR lpszStr, LPCSTR lpszComp, int iLen) { + INT iRet; + TRACE("(%s,%s,%i)\n", debugstr_a(lpszStr), debugstr_a(lpszComp), iLen); - return SHLWAPI_StrCmpNHelperA(lpszStr, lpszComp, iLen, ChrCmpIA); + iRet = CompareStringA(GetThreadLocale(), NORM_IGNORECASE, lpszStr, iLen, lpszComp, iLen); + return iRet == CSTR_LESS_THAN ? -1 : iRet == CSTR_GREATER_THAN ? 1 : 0; } /************************************************************************* @@ -390,8 +362,8 @@ INT WINAPI StrCmpNIW(LPCWSTR lpszStr, LPCWSTR lpszComp, int iLen) TRACE("(%s,%s,%i)\n", debugstr_w(lpszStr), debugstr_w(lpszComp), iLen); - iRet = strncmpiW(lpszStr, lpszComp, iLen); - return iRet < 0 ? -1 : iRet ? 1 : 0; + iRet = CompareStringW(GetThreadLocale(), NORM_IGNORECASE, lpszStr, iLen, lpszComp, iLen); + return iRet == CSTR_LESS_THAN ? -1 : iRet == CSTR_GREATER_THAN ? 1 : 0; } /************************************************************************* @@ -413,8 +385,8 @@ int WINAPI StrCmpW(LPCWSTR lpszStr, LPCWSTR lpszComp) TRACE("(%s,%s)\n", debugstr_w(lpszStr), debugstr_w(lpszComp)); - iRet = strcmpW(lpszStr, lpszComp); - return iRet < 0 ? -1 : iRet ? 1 : 0; + iRet = CompareStringW(GetThreadLocale(), 0, lpszStr, -1, lpszComp, -1); + return iRet == CSTR_LESS_THAN ? -1 : iRet == CSTR_GREATER_THAN ? 1 : 0; } /************************************************************************* @@ -671,13 +643,13 @@ LPWSTR WINAPI StrStrIW(LPCWSTR lpszStr, LPCWSTR lpszSearch) /************************************************************************* * StrToIntA [SHLWAPI.@] * - * Read an integer from a string. + * Read a signed integer from a string. * * PARAMS * lpszStr [I] String to read integer from * * RETURNS - * The integer value represented by the string, or 0 if no integer is + * The signed integer value represented by the string, or 0 if no integer is * present. * * NOTES @@ -2389,6 +2361,38 @@ LPSTR WINAPI StrFormatByteSizeA(DWORD dwBytes, LPSTR lpszDest, UINT cchMax) return StrFormatByteSize64A(dwBytes, lpszDest, cchMax); } +/************************************************************************* + * @ [SHLWAPI.162] + * + * Remove a hanging lead byte from the end of a string, if present. + * + * PARAMS + * lpStr [I] String to check for a hanging lead byte + * size [I] Length of lpStr + * + * RETURNS + * Success: The new length of the string. Any hanging lead bytes are removed. + * Failure: 0, if any parameters are invalid. + */ +DWORD WINAPI SHTruncateString(LPSTR lpStr, DWORD size) +{ + if (lpStr && size) + { + LPSTR lastByte = lpStr + size - 1; + + while(lpStr < lastByte) + lpStr += IsDBCSLeadByte(*lpStr) ? 2 : 1; + + if(lpStr == lastByte && IsDBCSLeadByte(*lpStr)) + { + *lpStr = '\0'; + size--; + } + return size; + } + return 0; +} + /************************************************************************* * @ [SHLWAPI.203] * @@ -2429,3 +2433,189 @@ char WINAPI SHStripMneumonicA(LPCSTR lpszStr) return ch; } + +/************************************************************************* + * @ [SHLWAPI.215] + * + * Convert an Ascii string to Unicode. + * + * PARAMS + * lpSrcStr [I] Source Ascii string to convert + * lpDstStr [O] Destination for converted Unicode string + * iLen [I] Length of lpDstStr + * + * RETURNS + * The return value of the MultiByteToWideChar() function called on lpSrcStr. + */ +DWORD WINAPI SHAnsiToUnicode(LPCSTR lpSrcStr, LPWSTR lpDstStr, int iLen) +{ + DWORD dwRet; + + dwRet = MultiByteToWideChar(CP_ACP, 0, lpSrcStr, -1, lpDstStr, iLen); + TRACE("%s->%s,ret=%ld\n", debugstr_a(lpSrcStr), debugstr_w(lpDstStr), dwRet); + return dwRet; +} + +/************************************************************************* + * @ [SHLWAPI.218] + * + * Convert a Unicode string to Ascii. + * + * PARAMS + * CodePage [I] Code page to use for the conversion + * lpSrcStr [I] Source Unicode string to convert + * lpDstStr [O] Destination for converted Ascii string + * lpiLen [I/O] Input length of lpDstStr/destination for length of lpDstStr + * + * RETURNS + * Success: The number of characters that result from the conversion. + * Failure: 0. + */ +INT WINAPI SHUnicodeToAnsiCP(UINT CodePage, LPCWSTR lpSrcStr, LPSTR lpDstStr, + LPINT lpiLen) +{ + WCHAR emptyW[] = { '\0' }; + int len , reqLen; + LPSTR mem; + + if (!lpDstStr || !lpiLen) + return 0; + + if (!lpSrcStr) + lpSrcStr = emptyW; + + *lpDstStr = '\0'; + + len = strlenW(lpSrcStr) + 1; + + switch (CodePage) + { + case CP_WINUNICODE: + CodePage = CP_UTF8; /* Fall through... */ + case 0x0000C350: /* FIXME: CP_ #define */ + case CP_UTF7: + case CP_UTF8: + { + DWORD dwMode = 0; + INT nWideCharCount = len - 1; + + GET_FUNC(pConvertINetUnicodeToMultiByte, mlang, "ConvertINetUnicodeToMultiByte", 0); + if (!pConvertINetUnicodeToMultiByte(&dwMode, CodePage, lpSrcStr, &nWideCharCount, lpDstStr, + lpiLen)) + return 0; + + if (nWideCharCount < len - 1) + { + mem = (LPSTR)HeapAlloc(GetProcessHeap(), 0, *lpiLen); + if (!mem) + return 0; + + *lpiLen = 0; + + if (pConvertINetUnicodeToMultiByte(&dwMode, CodePage, lpSrcStr, &len, mem, lpiLen)) + { + SHTruncateString(mem, *lpiLen); + lstrcpynA(lpDstStr, mem, *lpiLen + 1); + return *lpiLen + 1; + } + HeapFree(GetProcessHeap(), 0, mem); + return *lpiLen; + } + lpDstStr[*lpiLen] = '\0'; + return *lpiLen; + } + break; + default: + break; + } + + reqLen = WideCharToMultiByte(CodePage, 0, lpSrcStr, len, lpDstStr, + *lpiLen, NULL, NULL); + + if (!reqLen && GetLastError() == ERROR_INSUFFICIENT_BUFFER) + { + reqLen = WideCharToMultiByte(CodePage, 0, lpSrcStr, len, NULL, 0, NULL, NULL); + if (reqLen) + { + mem = (LPSTR)HeapAlloc(GetProcessHeap(), 0, reqLen); + if (mem) + { + reqLen = WideCharToMultiByte(CodePage, 0, lpSrcStr, len, mem, + reqLen, NULL, NULL); + + reqLen = SHTruncateString(mem, *lpiLen); + reqLen++; + + lstrcpynA(lpDstStr, mem, *lpiLen); + + HeapFree(GetProcessHeap(), 0, mem); + } + } + } + return reqLen; +} + +/************************************************************************* + * @ [SHLWAPI.217] + * + * Convert a Unicode string to Ascii. + * + * PARAMS + * lpSrcStr [I] Source Unicode string to convert + * lpDstStr [O] Destination for converted Ascii string + * iLen [O] Length of lpDstStr in characters + * + * RETURNS + * See SHUnicodeToAnsiCP + + * NOTES + * This function simply calls SHUnicodeToAnsiCP() with CodePage = CP_ACP. + */ +INT WINAPI SHUnicodeToAnsi(LPCWSTR lpSrcStr, LPSTR lpDstStr, INT iLen) +{ + INT myint = iLen; + + return SHUnicodeToAnsiCP(CP_ACP, lpSrcStr, lpDstStr, &myint); +} + +/************************************************************************* + * @ [SHLWAPI.364] + * + * Determine if an Ascii string converts to Unicode and back identically. + * + * PARAMS + * lpSrcStr [I] Source Unicode string to convert + * lpDst [O] Destination for resulting Ascii string + * iLen [I] Length of lpDst in characters + * + * RETURNS + * TRUE, since Ascii strings always convert identically. + */ +BOOL WINAPI DoesStringRoundTripA(LPCSTR lpSrcStr, LPSTR lpDst, INT iLen) +{ + lstrcpynA(lpDst, lpSrcStr, iLen); + return TRUE; +} + +/************************************************************************* + * @ [SHLWAPI.365] + * + * Determine if a Unicode string converts to Ascii and back identically. + * + * PARAMS + * lpSrcStr [I] Source Unicode string to convert + * lpDst [O] Destination for resulting Ascii string + * iLen [I] Length of lpDst in characters + * + * RETURNS + * TRUE, if lpSrcStr converts to Ascii and back identically, + * FALSE otherwise. + */ +BOOL WINAPI DoesStringRoundTripW(LPCWSTR lpSrcStr, LPSTR lpDst, INT iLen) +{ + WCHAR szBuff[MAX_PATH]; + + SHUnicodeToAnsi(lpSrcStr, lpDst, iLen); + SHAnsiToUnicode(lpDst, szBuff, MAX_PATH); + return !strcmpW(lpSrcStr, szBuff); +} diff --git a/reactos/lib/shlwapi/url.c b/reactos/lib/shlwapi/url.c index 8b8bb9bbbe9..019a0860a57 100644 --- a/reactos/lib/shlwapi/url.c +++ b/reactos/lib/shlwapi/url.c @@ -419,6 +419,9 @@ HRESULT WINAPI UrlCanonicalizeA(LPCSTR pszUrl, LPSTR pszCanonicalized, debugstr_a(pszUrl), pszCanonicalized, pcchCanonicalized, dwFlags); + if(!pszUrl || !pszCanonicalized || !pcchCanonicalized) + return E_INVALIDARG; + base = (LPWSTR) HeapAlloc(GetProcessHeap(), 0, (2*INTERNET_MAX_URL_LENGTH) * sizeof(WCHAR)); canonical = base + INTERNET_MAX_URL_LENGTH; @@ -461,6 +464,9 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized, TRACE("(%s %p %p 0x%08lx)\n", debugstr_w(pszUrl), pszCanonicalized, pcchCanonicalized, dwFlags); + if(!pszUrl || !pszCanonicalized || !pcchCanonicalized) + return E_INVALIDARG; + nByteLen = (lstrlenW(pszUrl) + 1) * sizeof(WCHAR); /* length in bytes */ lpszUrlCpy = HeapAlloc(GetProcessHeap(), 0, nByteLen); @@ -508,8 +514,8 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized, wk2 += strlenW(wk2); break; case 4: - if (!isalnumW(*wk1) && (*wk1 != L'-')) {state = 3; break;} - while(isalnumW(*wk1) || (*wk1 == L'-')) *wk2++ = *wk1++; + if (!isalnumW(*wk1) && (*wk1 != L'-') && (*wk1 != L'.')) {state = 3; break;} + while(isalnumW(*wk1) || (*wk1 == L'-') || (*wk1 == L'.')) *wk2++ = *wk1++; state = 5; break; case 5: @@ -543,7 +549,7 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized, else if (*(wk1+1) == L'.') { /* found /.. look for next / */ TRACE("found '/..'\n"); - if (*(wk1+2) == L'/') { + if (*(wk1+2) == L'/' || *(wk1+2) == L'?' || *(wk1+2) == L'#' || *(wk1+2) == 0) { /* case /../ -> need to backup wk2 */ TRACE("found '/../'\n"); *(wk2-1) = L'\0'; /* set end of string */ @@ -551,7 +557,10 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized, if (mp && (mp >= root)) { /* found valid backup point */ wk2 = mp + 1; - wk1 += 3; + if(*(wk1+2) != L'/') + wk1 += 2; + else + wk1 += 3; } else { /* did not find point, restore '/' */ @@ -629,7 +638,10 @@ HRESULT WINAPI UrlCombineA(LPCSTR pszBase, LPCSTR pszRelative, TRACE("(base %s, Relative %s, Combine size %ld, flags %08lx) using W version\n", debugstr_a(pszBase),debugstr_a(pszRelative), - *pcchCombined,dwFlags); + pcchCombined?*pcchCombined:0,dwFlags); + + if(!pszBase || !pszRelative || !pszCombined || !pcchCombined) + return E_INVALIDARG; base = (LPWSTR) HeapAlloc(GetProcessHeap(), 0, (3*INTERNET_MAX_URL_LENGTH) * sizeof(WCHAR)); @@ -678,7 +690,10 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative, TRACE("(base %s, Relative %s, Combine size %ld, flags %08lx)\n", debugstr_w(pszBase),debugstr_w(pszRelative), - *pcchCombined,dwFlags); + pcchCombined?*pcchCombined:0,dwFlags); + + if(!pszBase || !pszRelative || !pszCombined || !pcchCombined) + return E_INVALIDARG; base.size = 24; relative.size = 24; @@ -964,7 +979,10 @@ HRESULT WINAPI UrlEscapeA( INT len; TRACE("(%s %p %lx 0x%08lx)\n", debugstr_a(pszUrl), pszEscaped, - *pcchEscaped, dwFlags); + pcchEscaped?*pcchEscaped:0, dwFlags); + + if(!pszUrl || !pszEscaped || !pcchEscaped) + return E_INVALIDARG; if(dwFlags & ~(URL_ESCAPE_SPACES_ONLY | URL_ESCAPE_SEGMENT_ONLY | @@ -1039,6 +1057,9 @@ HRESULT WINAPI UrlEscapeW( TRACE("(%s %p %p 0x%08lx)\n", debugstr_w(pszUrl), pszEscaped, pcchEscaped, dwFlags); + if(!pszUrl || !pszEscaped || !pcchEscaped) + return E_INVALIDARG; + if(dwFlags & ~(URL_ESCAPE_SPACES_ONLY | URL_ESCAPE_SEGMENT_ONLY | URL_DONT_ESCAPE_EXTRA_INFO | @@ -1144,6 +1165,9 @@ HRESULT WINAPI UrlUnescapeA( TRACE("(%s, %p, %p, 0x%08lx)\n", debugstr_a(pszUrl), pszUnescaped, pcchUnescaped, dwFlags); + if(!pszUrl || !pszUnescaped || !pcchUnescaped) + return E_INVALIDARG; + if(dwFlags & URL_UNESCAPE_INPLACE) dst = pszUrl; else @@ -1208,6 +1232,9 @@ HRESULT WINAPI UrlUnescapeW( TRACE("(%s, %p, %p, 0x%08lx)\n", debugstr_w(pszUrl), pszUnescaped, pcchUnescaped, dwFlags); + if(!pszUrl || !pszUnescaped || !pcchUnescaped) + return E_INVALIDARG; + if(dwFlags & URL_UNESCAPE_INPLACE) dst = pszUrl; else diff --git a/reactos/lib/shlwapi/winehq2ros.patch b/reactos/lib/shlwapi/winehq2ros.patch index fba9cdab8e8..53deb08748d 100644 --- a/reactos/lib/shlwapi/winehq2ros.patch +++ b/reactos/lib/shlwapi/winehq2ros.patch @@ -4,7 +4,7 @@ RCS file: /home/wine/wine/dlls/shlwapi/path.c,v retrieving revision 1.41 diff -u -r1.41 path.c --- path.c 23 Jan 2004 22:45:25 -0000 1.41 -+++ path.c 28 Jan 2004 22:02:59 -0000 ++++ path.c 11 Mar 2004 22:38:00 -0000 @@ -32,6 +32,7 @@ #include "wingdi.h" #include "winuser.h" @@ -13,14 +13,43 @@ diff -u -r1.41 path.c #define NO_SHLWAPI_STREAM #include "shlwapi.h" #include "wine/debug.h" +Index: shlwapi.spec +=================================================================== +RCS file: /home/wine/wine/dlls/shlwapi/shlwapi.spec,v +retrieving revision 1.88 +diff -u -r1.88 shlwapi.spec +--- shlwapi.spec 28 Feb 2004 01:46:56 -0000 1.88 ++++ shlwapi.spec 11 Mar 2004 22:38:00 -0000 +@@ -368,9 +368,9 @@ + 368 stdcall @(wstr wstr ptr long wstr) kernel32.GetPrivateProfileStructW + 369 stdcall @(wstr wstr ptr ptr long long ptr wstr ptr ptr) kernel32.CreateProcessW + 370 stdcall -noname ExtractIconWrapW(long wstr long) +-371 stdcall -noname DdeInitializeWrapW(ptr ptr long long) user32.DdeInitializeW +-372 stdcall -noname DdeCreateStringHandleWrapW(long ptr long) user32.DdeCreateStringHandleW +-373 stdcall -noname DdeQueryStringWrapW(long ptr wstr long long) user32.DdeQueryStringW ++371 stdcall DdeInitializeWrapW(ptr ptr long long) user32.DdeInitializeW ++372 stdcall DdeCreateStringHandleWrapW(long ptr long) user32.DdeCreateStringHandleW ++373 stdcall DdeQueryStringWrapW(long ptr wstr long long) user32.DdeQueryStringW + 374 stub -noname SHCheckDiskForMediaA + 375 stub -noname SHCheckDiskForMediaW + 376 stdcall -noname MLGetUILanguage() # kernel32.GetUserDefaultUILanguage +@@ -389,7 +389,7 @@ + 389 stdcall -noname GetSaveFileNameWrapW(ptr) + 390 stdcall -noname WNetRestoreConnectionWrapW(long wstr) + 391 stdcall -noname WNetGetLastErrorWrapW(ptr ptr long ptr long) +-392 stdcall -noname EndDialogWrap(ptr ptr) user32.EndDialog ++392 stdcall EndDialogWrap(ptr ptr) user32.EndDialog + 393 stdcall @(long ptr long ptr long) user32.CreateDialogIndirectParamW + 394 stdcall @(long ptr long ptr long) user32.CreateDialogIndirectParamA + 395 stub -noname MLWinHelpA Index: string.c =================================================================== RCS file: /home/wine/wine/dlls/shlwapi/string.c,v -retrieving revision 1.40 -diff -u -r1.40 string.c ---- string.c 23 Jan 2004 22:45:25 -0000 1.40 -+++ string.c 28 Jan 2004 22:03:00 -0000 -@@ -556,7 +556,7 @@ +retrieving revision 1.44 +diff -u -r1.44 string.c +--- string.c 20 Feb 2004 05:16:37 -0000 1.44 ++++ string.c 11 Mar 2004 22:38:01 -0000 +@@ -528,7 +528,7 @@ { TRACE("(%s,%s)\n", debugstr_w(lpszStr), debugstr_w(lpszSearch)); @@ -29,7 +58,7 @@ diff -u -r1.40 string.c } /************************************************************************* -@@ -665,7 +665,7 @@ +@@ -637,7 +637,7 @@ { TRACE("(%s,%s)\n", debugstr_w(lpszStr), debugstr_w(lpszSearch)); @@ -41,11 +70,11 @@ diff -u -r1.40 string.c Index: url.c =================================================================== RCS file: /home/wine/wine/dlls/shlwapi/url.c,v -retrieving revision 1.27 -diff -u -r1.27 url.c ---- url.c 23 Jan 2004 22:45:25 -0000 1.27 -+++ url.c 28 Jan 2004 22:03:02 -0000 -@@ -1396,8 +1396,8 @@ +retrieving revision 1.29 +diff -u -r1.29 url.c +--- url.c 3 Mar 2004 20:11:46 -0000 1.29 ++++ url.c 11 Mar 2004 22:38:02 -0000 +@@ -1423,8 +1423,8 @@ * Success: TRUE. lpDest is filled with the computed hash value. * Failure: FALSE, if any argument is invalid. */ From 304ff0ba9688496acf87e8707bf923d5ce350621 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Thu, 11 Mar 2004 23:07:16 +0000 Subject: [PATCH 0444/1463] - Return any error code from the miniport device i/o control to the display driver. Fixes crash when running with ati drivers. svn path=/trunk/; revision=8656 --- reactos/subsys/win32k/eng/device.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/eng/device.c b/reactos/subsys/win32k/eng/device.c index c22e896aad0..959ef145e1e 100644 --- a/reactos/subsys/win32k/eng/device.c +++ b/reactos/subsys/win32k/eng/device.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: device.c,v 1.12 2003/11/05 22:46:05 gvg Exp $ +/* $Id: device.c,v 1.13 2004/03/11 23:07:16 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -71,7 +71,12 @@ EngDeviceIoControl(HANDLE hDevice, (void) KeWaitForSingleObject(&Event, Executive, KernelMode, TRUE, 0); } - return (Status); + DPRINT("EngDeviceIoControl(): Returning %X/%X\n", Iosb.Status, + Iosb.Information); + + /* Return information to the caller about the operation. */ + *lpBytesReturned = Iosb.Information; + return Iosb.Status; } /* EOF */ From abc17a48304742dd14690855cbab2cb3bee2e6b1 Mon Sep 17 00:00:00 2001 From: Vizzini <vizzini@plasmic.com> Date: Thu, 11 Mar 2004 23:12:03 +0000 Subject: [PATCH 0445/1463] Lots of code clean-up; correctly copies files of any size to/from disk; clean under prefast, lint, verifier, and checked win2k svn path=/trunk/; revision=8657 --- reactos/drivers/storage/floppy/csqrtns.c | 31 ++++---- reactos/drivers/storage/floppy/floppy.c | 83 ++++++++++++++++------ reactos/drivers/storage/floppy/floppy.h | 11 ++- reactos/drivers/storage/floppy/hardware.c | 4 +- reactos/drivers/storage/floppy/hardware.h | 2 - reactos/drivers/storage/floppy/readwrite.c | 23 ++---- 6 files changed, 92 insertions(+), 62 deletions(-) diff --git a/reactos/drivers/storage/floppy/csqrtns.c b/reactos/drivers/storage/floppy/csqrtns.c index 69c7c82643a..bdc911634e2 100644 --- a/reactos/drivers/storage/floppy/csqrtns.c +++ b/reactos/drivers/storage/floppy/csqrtns.c @@ -56,29 +56,30 @@ KSEMAPHORE QueueSemaphore; */ -VOID NTAPI CsqRemoveIrp(PIO_CSQ Csq, +VOID NTAPI CsqRemoveIrp(PIO_CSQ UnusedCsq, PIRP Irp) /* * FUNCTION: Remove an IRP from the queue * ARGUMENTS: - * Csq: Pointer to CSQ context structure + * UnusedCsq: Pointer to CSQ context structure * Irp: Pointer to the IRP to remove from the queue * NOTES: * - Called under the protection of the queue lock */ { + UNREFERENCED_PARAMETER(UnusedCsq); KdPrint(("CSQ: Removing IRP 0x%x\n", Irp)); RemoveEntryList(&Irp->Tail.Overlay.ListEntry); } -PIRP NTAPI CsqPeekNextIrp(PIO_CSQ Csq, +PIRP NTAPI CsqPeekNextIrp(PIO_CSQ UnusedCsq, PIRP Irp, PVOID PeekContext) /* * FUNCTION: Remove the next IRP from the queue * ARGUMENTS: - * Csq: Pointer to CSQ context structure + * UnusedCsq: Pointer to CSQ context structure * Irp: Pointer to a starting IRP in the queue (i.e. start search here) * PeekContext: Unused * RETURNS: @@ -88,6 +89,8 @@ PIRP NTAPI CsqPeekNextIrp(PIO_CSQ Csq, * - Called under the protection of the queue lock */ { + UNREFERENCED_PARAMETER(UnusedCsq); + UNREFERENCED_PARAMETER(PeekContext); KdPrint(("CSQ: Peeking for next IRP\n")); if(Irp) @@ -100,46 +103,49 @@ PIRP NTAPI CsqPeekNextIrp(PIO_CSQ Csq, } -VOID NTAPI CsqAcquireLock(PIO_CSQ Csq, +VOID NTAPI CsqAcquireLock(PIO_CSQ UnusedCsq, PKIRQL Irql) /* * FUNCTION: Acquire the queue lock * ARGUMENTS: - * Csq: Pointer to CSQ context structure + * UnusedCsq: Pointer to CSQ context structure * Irql: Pointer to a variable to store the old irql into */ { + UNREFERENCED_PARAMETER(UnusedCsq); KdPrint(("CSQ: Acquiring spin lock\n")); KeAcquireSpinLock(&IrpQueueLock, Irql); } -VOID NTAPI CsqReleaseLock(PIO_CSQ Csq, +VOID NTAPI CsqReleaseLock(PIO_CSQ UnusedCsq, KIRQL Irql) /* * FUNCTION: Release the queue lock * ARGUMENTS: - * Csq: Pointer to CSQ context structure + * UnusedCsq: Pointer to CSQ context structure * Irql: IRQL to lower to on release */ { + UNREFERENCED_PARAMETER(UnusedCsq); KdPrint(("CSQ: Releasing spin lock\n")); KeReleaseSpinLock(&IrpQueueLock, Irql); } -VOID NTAPI CsqCompleteCanceledIrp(PIO_CSQ Csq, +VOID NTAPI CsqCompleteCanceledIrp(PIO_CSQ UnusedCsq, PIRP Irp) /* * FUNCTION: Complete a canceled IRP * ARGUMENTS: - * Csq: Pointer to CSQ context structure + * UnusedCsq: Pointer to CSQ context structure * Irp: IRP to complete * NOTES: * - Perhaps we should complete with something besides NO_INCREMENT * - MS misspelled CANCELLED... sigh... */ { + UNREFERENCED_PARAMETER(UnusedCsq); KdPrint(("CSQ: Canceling irp 0x%x\n", Irp)); Irp->IoStatus.Status = STATUS_CANCELLED; Irp->IoStatus.Information = 0; @@ -147,12 +153,12 @@ VOID NTAPI CsqCompleteCanceledIrp(PIO_CSQ Csq, } -VOID NTAPI CsqInsertIrp(PIO_CSQ Csq, +VOID NTAPI CsqInsertIrp(PIO_CSQ UnusedCsq, PIRP Irp) /* * FUNCTION: Queue an IRP * ARGUMENTS: - * Csq: Unused + * UnusedCsq: Unused * Irp: IRP to add to the queue * NOTES: * - Called under the protection of the queue lock @@ -164,6 +170,7 @@ VOID NTAPI CsqInsertIrp(PIO_CSQ Csq, * that at least one IRP is canceled at some point */ { + UNREFERENCED_PARAMETER(UnusedCsq); KdPrint(("CSQ: Inserting IRP 0x%x\n", Irp)); InsertTailList(&IrpQueue, &Irp->Tail.Overlay.ListEntry); KeReleaseSemaphore(&QueueSemaphore, 0, 1, FALSE); diff --git a/reactos/drivers/storage/floppy/floppy.c b/reactos/drivers/storage/floppy/floppy.c index 644c18f4e88..0428a781f3c 100644 --- a/reactos/drivers/storage/floppy/floppy.c +++ b/reactos/drivers/storage/floppy/floppy.c @@ -64,25 +64,22 @@ * will probably have only one, with four being a very unlikely maximum, a static * global array is easiest to deal with. */ -CONTROLLER_INFO gControllerInfo[MAX_CONTROLLERS]; -ULONG gNumberOfControllers = 0; +static CONTROLLER_INFO gControllerInfo[MAX_CONTROLLERS]; +static ULONG gNumberOfControllers = 0; /* Queue thread management */ -KEVENT QueueThreadTerminate; -PVOID ThreadObject; - -/* ISR DPC */ -KDPC Dpc; +static KEVENT QueueThreadTerminate; +static PVOID ThreadObject; -static VOID NTAPI MotorStopDpcFunc(PKDPC Dpc, +static VOID NTAPI MotorStopDpcFunc(PKDPC UnusedDpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2) /* * FUNCTION: Stop the floppy motor * ARGUMENTS: - * Dpc: DPC object that's going off + * UnusedDpc: DPC object that's going off * DeferredContext: called with DRIVE_INFO for drive to turn off * SystemArgument1: unused * SystemArgument2: unused @@ -93,6 +90,10 @@ static VOID NTAPI MotorStopDpcFunc(PKDPC Dpc, { PCONTROLLER_INFO ControllerInfo = (PCONTROLLER_INFO)DeferredContext; + UNREFERENCED_PARAMETER(SystemArgument1); + UNREFERENCED_PARAMETER(SystemArgument2); + UNREFERENCED_PARAMETER(UnusedDpc); + ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); ASSERT(ControllerInfo); @@ -133,7 +134,8 @@ VOID NTAPI StartMotor(PDRIVE_INFO DriveInfo) DriveInfo->ControllerInfo->StopDpcQueued = FALSE; } - HwTurnOnMotor(DriveInfo); + if(HwTurnOnMotor(DriveInfo) != STATUS_SUCCESS) + KdPrint(("floppy: StartMotor(): warning: HwTurnOnMotor failed\n")); } @@ -203,6 +205,8 @@ static NTSTATUS NTAPI CreateClose(PDEVICE_OBJECT DeviceObject, * TODO: Figure out why this isn't getting called any more, and remove the ASSERT once that happens */ { + UNREFERENCED_PARAMETER(DeviceObject); + KdPrint(("floppy: CreateClose called\n")); Irp->IoStatus.Status = STATUS_SUCCESS; @@ -239,7 +243,11 @@ static NTSTATUS NTAPI Recalibrate(PDRIVE_INFO DriveInfo) /* set the data rate */ KdPrint(("floppy: FIXME: UN-HARDCODE DATA RATE\n")); - HwSetDataRate(DriveInfo->ControllerInfo, 0); + if(HwSetDataRate(DriveInfo->ControllerInfo, 0) != STATUS_SUCCESS) + { + KdPrint(("floppy: Recalibrate: HwSetDataRate failed\n")); + return STATUS_UNSUCCESSFUL; + } /* clear the event just in case the last call forgot */ KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); @@ -313,7 +321,11 @@ NTSTATUS NTAPI ResetChangeFlag(PDRIVE_INFO DriveInfo) WaitForControllerInterrupt(DriveInfo->ControllerInfo); - HwSenseInterruptStatus(DriveInfo->ControllerInfo); + if(HwSenseInterruptStatus(DriveInfo->ControllerInfo) != STATUS_SUCCESS) + { + KdPrint(("floppy: ResetChangeFlag(): HwSenseInterruptStatus failed; bailing out\n")); + return STATUS_IO_DEVICE_ERROR; + } /* Seek back to 0 */ if(HwSeek(DriveInfo, 1) != STATUS_SUCCESS) @@ -324,7 +336,11 @@ NTSTATUS NTAPI ResetChangeFlag(PDRIVE_INFO DriveInfo) WaitForControllerInterrupt(DriveInfo->ControllerInfo); - HwSenseInterruptStatus(DriveInfo->ControllerInfo); + if(HwSenseInterruptStatus(DriveInfo->ControllerInfo) != STATUS_SUCCESS) + { + KdPrint(("floppy: ResetChangeFlag(): HwSenseInterruptStatus #2 failed; bailing\n")); + return STATUS_IO_DEVICE_ERROR; + } /* Check the change bit */ if(HwDiskChanged(DriveInfo, &DiskChanged) != STATUS_SUCCESS) @@ -354,6 +370,7 @@ static VOID NTAPI Unload(PDRIVER_OBJECT DriverObject) ULONG i,j; PAGED_CODE(); + UNREFERENCED_PARAMETER(DriverObject); KdPrint(("floppy: unloading\n")); @@ -380,7 +397,8 @@ static VOID NTAPI Unload(PDRIVER_OBJECT DriverObject) IoDisconnectInterrupt(gControllerInfo[i].InterruptObject); /* Power down the controller */ - HwPowerOff(&gControllerInfo[i]); + if(HwPowerOff(&gControllerInfo[i]) != STATUS_SUCCESS) + KdPrint(("floppy: unload: warning: HwPowerOff failed\n")); } } @@ -440,6 +458,13 @@ static NTSTATUS NTAPI ConfigCallback(PVOID Context, UCHAR i; PAGED_CODE(); + UNREFERENCED_PARAMETER(PeripheralType); + UNREFERENCED_PARAMETER(PeripheralNumber); + UNREFERENCED_PARAMETER(BusInformation); + UNREFERENCED_PARAMETER(Context); + UNREFERENCED_PARAMETER(ControllerType); + UNREFERENCED_PARAMETER(PathName); + KdPrint(("floppy: ConfigCallback called with ControllerNumber %d\n", ControllerNumber)); @@ -471,12 +496,19 @@ static NTSTATUS NTAPI ConfigCallback(PVOID Context, ULONG AddressSpace = 0x1; /* I/O Port Range */ if(!HalTranslateBusAddress(BusType, BusNumber, PartialDescriptor->u.Port.Start, &AddressSpace, &TranslatedAddress)) - ASSERT(0); + { + KdPrint(("floppy: HalTranslateBusAddress failed; returning\n")); + return STATUS_IO_DEVICE_ERROR; + } if(AddressSpace == 0) - gControllerInfo[gNumberOfControllers].BaseAddress = MmMapIoSpace(TranslatedAddress, 8, FALSE); // symbolic constant? + { + gControllerInfo[gNumberOfControllers].BaseAddress = MmMapIoSpace(TranslatedAddress, 8, MmNonCached); // symbolic constant? + } else - gControllerInfo[gNumberOfControllers].BaseAddress = (PUCHAR)TranslatedAddress.u.LowPart; + { + gControllerInfo[gNumberOfControllers].BaseAddress = (PUCHAR)TranslatedAddress.u.LowPart; + } } else if(PartialDescriptor->Type == CmResourceTypeDma) @@ -558,6 +590,8 @@ static BOOLEAN NTAPI Isr(PKINTERRUPT Interrupt, { PCONTROLLER_INFO ControllerInfo = (PCONTROLLER_INFO)ServiceContext; + UNREFERENCED_PARAMETER(Interrupt); + ASSERT(ControllerInfo); KdPrint(("floppy: ISR called\n")); @@ -575,14 +609,14 @@ static BOOLEAN NTAPI Isr(PKINTERRUPT Interrupt, } -VOID NTAPI DpcForIsr(PKDPC Dpc, +VOID NTAPI DpcForIsr(PKDPC UnusedDpc, PVOID Context, PVOID SystemArgument1, PVOID SystemArgument2) /* * FUNCTION: This DPC gets queued by every ISR. Does the real per-interrupt work. * ARGUMENTS: - * Dpc: Pointer to the DPC object that represents our function + * UnusedDpc: Pointer to the DPC object that represents our function * DeviceObject: Device that this DPC is running for * Irp: Unused * Context: Pointer to our ControllerInfo struct @@ -598,6 +632,10 @@ VOID NTAPI DpcForIsr(PKDPC Dpc, { PCONTROLLER_INFO ControllerInfo = (PCONTROLLER_INFO)Context; + UNREFERENCED_PARAMETER(UnusedDpc); + UNREFERENCED_PARAMETER(SystemArgument1); + UNREFERENCED_PARAMETER(SystemArgument2); + ASSERT(ControllerInfo); KdPrint(("floppy: DpcForIsr called\n")); @@ -868,7 +906,7 @@ static BOOLEAN NTAPI AddControllers(PDRIVER_OBJECT DriverObject) * 14: 3,2 * 15: 3,3 */ - DriveNumber = i*4 + j; + DriveNumber = (UCHAR)(i*4 + j); /* loss of precision is OK; there are only 16 of 'em */ swprintf(DeviceNameBuf, L"\\Device\\Floppy%d", DriveNumber); RtlInitUnicodeString(&DeviceName, DeviceNameBuf); @@ -962,7 +1000,7 @@ VOID NTAPI SignalMediaChanged(PDEVICE_OBJECT DeviceObject, } -VOID NTAPI QueueThread(PVOID Context) +static VOID NTAPI QueueThread(PVOID Context) /* * FUNCTION: Thread that manages the queue and dispatches any queued requests * ARGUMENTS: @@ -975,6 +1013,7 @@ VOID NTAPI QueueThread(PVOID Context) PVOID Objects[2]; PAGED_CODE(); + UNREFERENCED_PARAMETER(Context); Objects[0] = &QueueSemaphore; Objects[1] = &QueueThreadTerminate; @@ -1043,6 +1082,8 @@ NTSTATUS NTAPI DriverEntry(PDRIVER_OBJECT DriverObject, { HANDLE ThreadHandle; + UNREFERENCED_PARAMETER(RegistryPath); + /* * Set up dispatch routines */ diff --git a/reactos/drivers/storage/floppy/floppy.h b/reactos/drivers/storage/floppy/floppy.h index da3fbe0c8b4..a1be952eaee 100644 --- a/reactos/drivers/storage/floppy/floppy.h +++ b/reactos/drivers/storage/floppy/floppy.h @@ -55,6 +55,10 @@ int _cdecl swprintf(const WCHAR *, ...); #define PAGED_CODE() {ASSERT(KeGetCurrentIrql() < DISPATCH_LEVEL);} #endif +#ifndef UNREFERENCED_PARAMETER +#define UNREFERENCED_PARAMETER(x) { (x) = (x); } +#endif + struct _CONTROLLER_INFO; typedef struct _DRIVE_INFO @@ -101,13 +105,6 @@ typedef struct _CONTROLLER_INFO BOOLEAN StopDpcQueued; } CONTROLLER_INFO, *PCONTROLLER_INFO; -NTSTATUS NTAPI ReadWrite(PDEVICE_OBJECT DeviceObject, - PIRP Irp); - -VOID NTAPI QueueThread(PVOID Context); - -extern KEVENT QueueThreadTerminate; - NTSTATUS NTAPI DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath); diff --git a/reactos/drivers/storage/floppy/hardware.c b/reactos/drivers/storage/floppy/hardware.c index 7945158a807..e8c4fd5f15d 100644 --- a/reactos/drivers/storage/floppy/hardware.c +++ b/reactos/drivers/storage/floppy/hardware.c @@ -846,7 +846,7 @@ NTSTATUS NTAPI HwGetVersion(PCONTROLLER_INFO ControllerInfo) if(Send_Byte(ControllerInfo, COMMAND_VERSION) != STATUS_SUCCESS) { KdPrint(("floppy: HwGetVersion: unable to write fifo\n")); - return STATUS_UNSUCCESSFUL;; + return STATUS_UNSUCCESSFUL; } if(Get_Byte(ControllerInfo, &Buffer) != STATUS_SUCCESS) @@ -1108,6 +1108,8 @@ VOID NTAPI HwDumpRegisters(PCONTROLLER_INFO ControllerInfo) * ControllerInfo: Controller to dump registers from */ { + UNREFERENCED_PARAMETER(ControllerInfo); + KdPrint(("floppy: STATUS: ")); KdPrint(("STATUS_REGISTER_A = 0x%x ", READ_PORT_UCHAR(ControllerInfo->BaseAddress + STATUS_REGISTER_A))); KdPrint(("STATUS_REGISTER_B = 0x%x ", READ_PORT_UCHAR(ControllerInfo->BaseAddress + STATUS_REGISTER_B))); diff --git a/reactos/drivers/storage/floppy/hardware.h b/reactos/drivers/storage/floppy/hardware.h index 7d110d9ee81..52cf5f0a87b 100644 --- a/reactos/drivers/storage/floppy/hardware.h +++ b/reactos/drivers/storage/floppy/hardware.h @@ -324,8 +324,6 @@ NTSTATUS NTAPI HwReadIdResult(PCONTROLLER_INFO ControllerInfo, NTSTATUS NTAPI HwSetDataRate(PCONTROLLER_INFO ControllerInfo, UCHAR DataRate); -NTSTATUS NTAPI HwRecalibrateResult(PCONTROLLER_INFO ControllerInfo); - NTSTATUS NTAPI HwReset(PCONTROLLER_INFO Controller); NTSTATUS NTAPI HwPowerOff(PCONTROLLER_INFO ControllerInfo); diff --git a/reactos/drivers/storage/floppy/readwrite.c b/reactos/drivers/storage/floppy/readwrite.c index 13efa2afa06..fd4d8b6586d 100644 --- a/reactos/drivers/storage/floppy/readwrite.c +++ b/reactos/drivers/storage/floppy/readwrite.c @@ -77,6 +77,8 @@ static IO_ALLOCATION_ACTION NTAPI MapRegisterCallback(PDEVICE_OBJECT DeviceObjec */ { PCONTROLLER_INFO ControllerInfo = (PCONTROLLER_INFO)Context; + UNREFERENCED_PARAMETER(DeviceObject); + UNREFERENCED_PARAMETER(Irp); KdPrint(("floppy: MapRegisterCallback Called\n")); @@ -104,14 +106,11 @@ NTSTATUS NTAPI ReadWrite(PDEVICE_OBJECT DeviceObject, * it onto the irp queue */ { - PIO_STACK_LOCATION Stack; KdPrint(("floppy: ReadWrite called\n")); ASSERT(DeviceObject); ASSERT(Irp); - Stack = IoGetCurrentIrpStackLocation(Irp); - if(!Irp->MdlAddress) { KdPrint(("floppy: ReadWrite(): MDL not found in IRP - Completing with STATUS_INVALID_PARAMETER\n")); @@ -502,26 +501,12 @@ VOID NTAPI ReadWritePassive(PDRIVE_INFO DriveInfo, /* Set up parameters for read or write */ if(Stack->MajorFunction == IRP_MJ_READ) { - /* - if(Stack->Parameters.Read.Length > PAGE_SIZE * DriveInfo->ControllerInfo->MapRegisters) - { - KdPrint(("floppy: ReadWritePassive(): unable to transfer; would have to split\n")); - ASSERT(0); - } - */ Length = Stack->Parameters.Read.Length; DiskByteOffset = Stack->Parameters.Read.ByteOffset.u.LowPart; WriteToDevice = FALSE; } else { - /* - if(Stack->Parameters.Write.Length > PAGE_SIZE * DriveInfo->ControllerInfo->MapRegisters) - { - KdPrint(("floppy: ReadWritePassive(): unable to transfer; would have to split\n")); - ASSERT(0); - } - */ Length = Stack->Parameters.Write.Length; DiskByteOffset = Stack->Parameters.Write.ByteOffset.u.LowPart; WriteToDevice = TRUE; @@ -660,10 +645,10 @@ VOID NTAPI ReadWritePassive(PDRIVE_INFO DriveInfo, KdPrint(("floppy: ReadWritePassive(): computing number of sectors to transfer (StartSector 0x%x): ", StartSector)); /* 1-based sector number */ - if( (DriveInfo->DiskGeometry.SectorsPerTrack - StartSector + 1) < + if( ((DriveInfo->DiskGeometry.SectorsPerTrack - StartSector) + 1) < (Length - TransferByteOffset) / DriveInfo->DiskGeometry.BytesPerSector) { - CurrentTransferSectors = (UCHAR)DriveInfo->DiskGeometry.SectorsPerTrack - StartSector + 1; + CurrentTransferSectors = (UCHAR)(DriveInfo->DiskGeometry.SectorsPerTrack - StartSector) + 1; } else { From c61a3955d5c4978e792dc160f7024a08caa99a4b Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Fri, 12 Mar 2004 00:28:13 +0000 Subject: [PATCH 0446/1463] - Use the return value from calling InterlockedDecrement on the reference count when checking whether the object should be retained. This fixes a race whereby one thread decrements the value to one, another thread come in and decrements the value to zero and starts the delete, the first thread then comes back, does retention checks and finds the reference count is now zero and then bugchecks because the object is already being deleted. svn path=/trunk/; revision=8658 --- reactos/ntoskrnl/ob/object.c | 39 ++++++++++++++++-------------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/reactos/ntoskrnl/ob/object.c b/reactos/ntoskrnl/ob/object.c index efc49b0751d..edbeabff4db 100644 --- a/reactos/ntoskrnl/ob/object.c +++ b/reactos/ntoskrnl/ob/object.c @@ -1,4 +1,4 @@ -/* $Id: object.c,v 1.75 2004/03/04 00:07:02 navaraf Exp $ +/* $Id: object.c,v 1.76 2004/03/12 00:28:13 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -611,7 +611,8 @@ ObpPerformRetentionChecksWorkRoutine (IN PVOID Parameter) static NTSTATUS -ObpPerformRetentionChecksDpcLevel(IN POBJECT_HEADER ObjectHeader) +ObpPerformRetentionChecksDpcLevel(IN POBJECT_HEADER ObjectHeader, + IN LONG OldRefCount) { if (ObjectHeader->RefCount < 0) { @@ -627,7 +628,7 @@ ObpPerformRetentionChecksDpcLevel(IN POBJECT_HEADER ObjectHeader) KEBUGCHECK(0); } - if (ObjectHeader->RefCount == 0 && + if (OldRefCount == 0 && ObjectHeader->HandleCount == 0 && ObjectHeader->Permanent == FALSE) { @@ -696,18 +697,20 @@ VOID FASTCALL ObfReferenceObject(IN PVOID Object) { POBJECT_HEADER Header; + LONG NewRefCount; assert(Object); Header = BODY_TO_HEADER(Object); + /* No one should be referencing an object once we are deleting it. */ if (Header->CloseInProcess) { KEBUGCHECK(0); } - InterlockedIncrement(&Header->RefCount); - ObpPerformRetentionChecksDpcLevel(Header); + NewRefCount = InterlockedIncrement(&Header->RefCount); + ObpPerformRetentionChecksDpcLevel(Header, NewRefCount); } @@ -731,29 +734,21 @@ VOID FASTCALL ObfDereferenceObject(IN PVOID Object) { POBJECT_HEADER Header; - extern POBJECT_TYPE PsProcessType; + LONG NewRefCount; assert(Object); + /* Extract the object header. */ Header = BODY_TO_HEADER(Object); - if (Header->ObjectType == PsProcessType) - { - DPRINT("Deref p 0x%x with refcount %d type %x ", - Object, Header->RefCount, PsProcessType); - DPRINT("eip %x\n", ((PULONG)&Object)[-1]); - } + /* + Drop our reference and get the new count so we can tell if this was the + last reference. + */ + NewRefCount = InterlockedDecrement(&Header->RefCount); - if (Header->ObjectType == PsThreadType) - { - DPRINT("Deref t 0x%x with refcount %d type %x ", - Object, Header->RefCount, PsThreadType); - DPRINT("eip %x\n", ((PULONG)&Object)[-1]); - } - - InterlockedDecrement(&Header->RefCount); - - ObpPerformRetentionChecksDpcLevel(Header); + /* Check whether the object can now be deleted. */ + ObpPerformRetentionChecksDpcLevel(Header, NewRefCount); } From f12f44e03601ff13e153ff98679538f76b21e6b9 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Fri, 12 Mar 2004 00:46:35 +0000 Subject: [PATCH 0447/1463] - Actually I realised it isn't valid to touch the object at all after decrementing the reference count unless the reference count was one. I also removed the retention check in ObfReferenceObject since I couldn't see how this would ever be needed. svn path=/trunk/; revision=8659 --- reactos/ntoskrnl/ob/object.c | 116 ++++++++++++++++++----------------- 1 file changed, 61 insertions(+), 55 deletions(-) diff --git a/reactos/ntoskrnl/ob/object.c b/reactos/ntoskrnl/ob/object.c index edbeabff4db..81eabe93747 100644 --- a/reactos/ntoskrnl/ob/object.c +++ b/reactos/ntoskrnl/ob/object.c @@ -1,4 +1,4 @@ -/* $Id: object.c,v 1.76 2004/03/12 00:28:13 dwelch Exp $ +/* $Id: object.c,v 1.77 2004/03/12 00:46:35 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -565,7 +565,7 @@ ObOpenObjectByPointer(IN POBJECT Object, static NTSTATUS -ObpPerformRetentionChecks(POBJECT_HEADER Header) +ObpDeleteObject(POBJECT_HEADER Header) { DPRINT("ObPerformRetentionChecks(Header %p)\n", Header); if (KeGetCurrentIrql() != PASSIVE_LEVEL) @@ -594,7 +594,7 @@ ObpPerformRetentionChecks(POBJECT_HEADER Header) VOID STDCALL -ObpPerformRetentionChecksWorkRoutine (IN PVOID Parameter) +ObpDeleteObjectWorkRoutine (IN PVOID Parameter) { PRETENTION_CHECK_PARAMS Params = (PRETENTION_CHECK_PARAMS)Parameter; /* ULONG Tag; */ /* See below */ @@ -604,73 +604,71 @@ ObpPerformRetentionChecksWorkRoutine (IN PVOID Parameter) /* Turn this on when we have ExFreePoolWithTag Tag = Params->ObjectHeader->ObjectType->Tag; */ - ObpPerformRetentionChecks(Params->ObjectHeader); + ObpDeleteObject(Params->ObjectHeader); ExFreePool(Params); /* ExFreePoolWithTag(Params, Tag); */ } -static NTSTATUS -ObpPerformRetentionChecksDpcLevel(IN POBJECT_HEADER ObjectHeader, - IN LONG OldRefCount) +STATIC NTSTATUS +ObpDeleteObjectDpcLevel(IN POBJECT_HEADER ObjectHeader, + IN LONG OldRefCount) { if (ObjectHeader->RefCount < 0) { CPRINT("Object %p/%p has invalid reference count (%d)\n", - ObjectHeader, HEADER_TO_BODY(ObjectHeader), ObjectHeader->RefCount); + ObjectHeader, HEADER_TO_BODY(ObjectHeader), + ObjectHeader->RefCount); KEBUGCHECK(0); } if (ObjectHeader->HandleCount < 0) { CPRINT("Object %p/%p has invalid handle count (%d)\n", - ObjectHeader, HEADER_TO_BODY(ObjectHeader), ObjectHeader->HandleCount); + ObjectHeader, HEADER_TO_BODY(ObjectHeader), + ObjectHeader->HandleCount); KEBUGCHECK(0); } - if (OldRefCount == 0 && - ObjectHeader->HandleCount == 0 && - ObjectHeader->Permanent == FALSE) + if (ObjectHeader->CloseInProcess) { - if (ObjectHeader->CloseInProcess) - { - KEBUGCHECK(0); - return STATUS_UNSUCCESSFUL; - } - ObjectHeader->CloseInProcess = TRUE; - - switch (KeGetCurrentIrql ()) - { - case PASSIVE_LEVEL: - return ObpPerformRetentionChecks (ObjectHeader); - - case APC_LEVEL: - case DISPATCH_LEVEL: - { - PRETENTION_CHECK_PARAMS Params; - - /* - * Can we get rid of this NonPagedPoolMustSucceed call and still be a - * 'must succeed' function? I don't like to bugcheck on no memory! - */ - Params = (PRETENTION_CHECK_PARAMS)ExAllocatePoolWithTag(NonPagedPoolMustSucceed, - sizeof(RETENTION_CHECK_PARAMS), - ObjectHeader->ObjectType->Tag); - Params->ObjectHeader = ObjectHeader; - ExInitializeWorkItem(&Params->WorkItem, - ObpPerformRetentionChecksWorkRoutine, - (PVOID)Params); - ExQueueWorkItem(&Params->WorkItem, - CriticalWorkQueue); - } - return STATUS_PENDING; - - default: - DPRINT("ObpPerformRetentionChecksDpcLevel called at unsupported IRQL %u!\n", - KeGetCurrentIrql()); - KEBUGCHECK(0); - return STATUS_UNSUCCESSFUL; - } + KEBUGCHECK(0); + return STATUS_UNSUCCESSFUL; + } + ObjectHeader->CloseInProcess = TRUE; + + switch (KeGetCurrentIrql ()) + { + case PASSIVE_LEVEL: + return ObpDeleteObject (ObjectHeader); + + case APC_LEVEL: + case DISPATCH_LEVEL: + { + PRETENTION_CHECK_PARAMS Params; + + /* + We use must succeed pool here because if the allocation fails + then we leak memory. + */ + Params = (PRETENTION_CHECK_PARAMS) + ExAllocatePoolWithTag(NonPagedPoolMustSucceed, + sizeof(RETENTION_CHECK_PARAMS), + ObjectHeader->ObjectType->Tag); + Params->ObjectHeader = ObjectHeader; + ExInitializeWorkItem(&Params->WorkItem, + ObpDeleteObjectWorkRoutine, + (PVOID)Params); + ExQueueWorkItem(&Params->WorkItem, + CriticalWorkQueue); + } + return STATUS_PENDING; + + default: + DPRINT("ObpPerformRetentionChecksDpcLevel called at unsupported " + "IRQL %u!\n", KeGetCurrentIrql()); + KEBUGCHECK(0); + return STATUS_UNSUCCESSFUL; } return STATUS_SUCCESS; @@ -697,7 +695,6 @@ VOID FASTCALL ObfReferenceObject(IN PVOID Object) { POBJECT_HEADER Header; - LONG NewRefCount; assert(Object); @@ -709,8 +706,7 @@ ObfReferenceObject(IN PVOID Object) KEBUGCHECK(0); } - NewRefCount = InterlockedIncrement(&Header->RefCount); - ObpPerformRetentionChecksDpcLevel(Header, NewRefCount); + (VOID)InterlockedIncrement(&Header->RefCount); } @@ -735,20 +731,30 @@ ObfDereferenceObject(IN PVOID Object) { POBJECT_HEADER Header; LONG NewRefCount; + BOOL Permanent; + ULONG HandleCount; assert(Object); /* Extract the object header. */ Header = BODY_TO_HEADER(Object); + Permanent = Header->Permanent; + HandleCount = Header->HandleCount; /* Drop our reference and get the new count so we can tell if this was the last reference. */ NewRefCount = InterlockedDecrement(&Header->RefCount); + assert(NewRefCount >= 0); /* Check whether the object can now be deleted. */ - ObpPerformRetentionChecksDpcLevel(Header, NewRefCount); + if (NewRefCount == 0 && + HandleCount == 0 && + !Permanent) + { + ObpDeleteObjectDpcLevel(Header, NewRefCount); + } } From 29d063166bda7c17fd90dc4bbaa47435500e07b2 Mon Sep 17 00:00:00 2001 From: Vizzini <vizzini@plasmic.com> Date: Fri, 12 Mar 2004 03:36:32 +0000 Subject: [PATCH 0448/1463] - Added arc path support - Fixed disk change support - Fixed the priority boosts to be saner - Fixed some start/stop motor timing bugs - Figured out the Real Deal with Model 30 support (I hope...) - Cleaned up DMA init a bit - Improved return values, freed things on fail, etc - General code cleanup svn path=/trunk/; revision=8660 --- reactos/drivers/storage/floppy/floppy.c | 197 +++++++++++---------- reactos/drivers/storage/floppy/floppy.h | 18 +- reactos/drivers/storage/floppy/hardware.c | 53 +----- reactos/drivers/storage/floppy/hardware.h | 1 + reactos/drivers/storage/floppy/ioctl.c | 9 +- reactos/drivers/storage/floppy/ioctl.h | 1 + reactos/drivers/storage/floppy/readwrite.c | 37 ++-- 7 files changed, 157 insertions(+), 159 deletions(-) diff --git a/reactos/drivers/storage/floppy/floppy.c b/reactos/drivers/storage/floppy/floppy.c index 0428a781f3c..27c34ab1198 100644 --- a/reactos/drivers/storage/floppy/floppy.c +++ b/reactos/drivers/storage/floppy/floppy.c @@ -23,32 +23,21 @@ * REVISIONS: * 15-Feb-2004 vizzini - Created * NOTES: + * - This driver is only designed to work with ISA-bus floppy controllers. This + * won't work on PCI-based controllers or on anything else with level-sensitive + * interrupts without modification. I don't think these controllers exist. * * ---- General to-do items ---- - * TODO: Clean up properly on failed init - * TODO: Add arc-path support so we can boot from the floppy - * TODO: Fix all these stupid STATUS_UNSUCCESSFUL return values - * TODO: Think about IO_NO_INCREMENT - * TODO: Figure out why CreateClose isn't called any more on XP. Seems to correspond - * with the driver not being unloadable. Does it have to do with cleanup? - * TODO: Consider using the built-in device object pointer in the stack location - * rather than the context area + * TODO: Figure out why CreateClose isn't called any more. Seems to correspond + * with the driver not being unloadable. * TODO: Think about StopDpcQueued -- could be a race; too tired atm to tell + * TODO: Clean up drive start/stop responsibilities (currently a mess...) * * ---- Support for proper media detection ---- * TODO: Handle MFM flag * TODO: Un-hardcode the data rate from various places * TODO: Proper media detection (right now we're hardcoded to 1.44) * TODO: Media detection based on sector 1 - * - * ---- Support for normal floppy hardware ---- - * TODO: Support the three primary types of controller - * TODO: Figure out thinkpad compatibility (I've heard rumors of weirdness with them) - * - * ---- Support for non-ISA and/or non-slave-dma controllers, if they exist ---- - * TODO: Find controllers on non-ISA buses - * TODO: Think about making the interrupt shareable - * TODO: Support bus-master controllers. PCI will break ATM. */ #include <ntddk.h> @@ -101,7 +90,7 @@ static VOID NTAPI MotorStopDpcFunc(PKDPC UnusedDpc, HwTurnOffMotor(ControllerInfo); ControllerInfo->StopDpcQueued = FALSE; - KeSetEvent(&ControllerInfo->MotorStoppedEvent, IO_NO_INCREMENT, FALSE); + KeSetEvent(&ControllerInfo->MotorStoppedEvent, EVENT_INCREMENT, FALSE); } @@ -202,7 +191,7 @@ static NTSTATUS NTAPI CreateClose(PDEVICE_OBJECT DeviceObject, * - No state to track, so this routine is easy * - Can be called <= DISPATCH_LEVEL * - * TODO: Figure out why this isn't getting called any more, and remove the ASSERT once that happens + * TODO: Figure out why this isn't getting called */ { UNREFERENCED_PARAMETER(DeviceObject); @@ -212,7 +201,7 @@ static NTSTATUS NTAPI CreateClose(PDEVICE_OBJECT DeviceObject, Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = FILE_OPENED; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + IoCompleteRequest(Irp, IO_DISK_INCREMENT); return STATUS_SUCCESS; } @@ -225,7 +214,7 @@ static NTSTATUS NTAPI Recalibrate(PDRIVE_INFO DriveInfo) * DriveInfo: Pointer to the driveinfo struct associated with the targeted drive * RETURNS: * STATUS_SUCCESS on successful starting of the process - * STATUS_UNSUCCESSFUL if it fails + * STATUS_IO_DEVICE_ERROR if it fails * NOTES: * - Sometimes you have to do two recalibrations, particularly if the disk has <80 tracks. * - PAGED_CODE because we wait @@ -246,13 +235,17 @@ static NTSTATUS NTAPI Recalibrate(PDRIVE_INFO DriveInfo) if(HwSetDataRate(DriveInfo->ControllerInfo, 0) != STATUS_SUCCESS) { KdPrint(("floppy: Recalibrate: HwSetDataRate failed\n")); - return STATUS_UNSUCCESSFUL; + StopMotor(DriveInfo->ControllerInfo); + return STATUS_IO_DEVICE_ERROR; } /* clear the event just in case the last call forgot */ KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); - /* sometimes you have to do this twice */ + /* sometimes you have to do this twice; we'll just do it twice all the time since + * we don't know if the people calling this Recalibrate routine expect a disk to + * even be in the drive, and if so, if that disk is formatted. + */ for(i = 0; i < 2; i++) { /* Send the command */ @@ -312,10 +305,14 @@ NTSTATUS NTAPI ResetChangeFlag(PDRIVE_INFO DriveInfo) /* clear spurious interrupts in prep for seeks */ KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); + /* must re-start the drive because Recalibrate() stops it */ + StartMotor(DriveInfo); + /* Seek to 1 */ if(HwSeek(DriveInfo, 1) != STATUS_SUCCESS) { KdPrint(("floppy: ResetChangeFlag(): HwSeek failed; returning STATUS_IO_DEVICE_ERROR\n")); + StopMotor(DriveInfo->ControllerInfo); return STATUS_IO_DEVICE_ERROR; } @@ -324,6 +321,7 @@ NTSTATUS NTAPI ResetChangeFlag(PDRIVE_INFO DriveInfo) if(HwSenseInterruptStatus(DriveInfo->ControllerInfo) != STATUS_SUCCESS) { KdPrint(("floppy: ResetChangeFlag(): HwSenseInterruptStatus failed; bailing out\n")); + StopMotor(DriveInfo->ControllerInfo); return STATUS_IO_DEVICE_ERROR; } @@ -331,6 +329,7 @@ NTSTATUS NTAPI ResetChangeFlag(PDRIVE_INFO DriveInfo) if(HwSeek(DriveInfo, 1) != STATUS_SUCCESS) { KdPrint(("floppy: ResetChangeFlag(): HwSeek failed; returning STATUS_IO_DEVICE_ERROR\n")); + StopMotor(DriveInfo->ControllerInfo); return STATUS_IO_DEVICE_ERROR; } @@ -339,6 +338,7 @@ NTSTATUS NTAPI ResetChangeFlag(PDRIVE_INFO DriveInfo) if(HwSenseInterruptStatus(DriveInfo->ControllerInfo) != STATUS_SUCCESS) { KdPrint(("floppy: ResetChangeFlag(): HwSenseInterruptStatus #2 failed; bailing\n")); + StopMotor(DriveInfo->ControllerInfo); return STATUS_IO_DEVICE_ERROR; } @@ -346,9 +346,12 @@ NTSTATUS NTAPI ResetChangeFlag(PDRIVE_INFO DriveInfo) if(HwDiskChanged(DriveInfo, &DiskChanged) != STATUS_SUCCESS) { KdPrint(("floppy: ResetChangeFlag(): HwDiskChagned failed; returning STATUS_IO_DEVICE_ERROR\n")); + StopMotor(DriveInfo->ControllerInfo); return STATUS_IO_DEVICE_ERROR; } + StopMotor(DriveInfo->ControllerInfo); + /* if the change flag is still set, there's probably no media in the drive. */ if(DiskChanged) return STATUS_NO_MEDIA_IN_DEVICE; @@ -363,8 +366,6 @@ static VOID NTAPI Unload(PDRIVER_OBJECT DriverObject) * FUNCTION: Unload the driver from memory * ARGUMENTS: * DriverObject - The driver that is being unloaded - * - * TODO: Delete ARC links */ { ULONG i,j; @@ -380,16 +381,24 @@ static VOID NTAPI Unload(PDRIVER_OBJECT DriverObject) for(i = 0; i < gNumberOfControllers; i++) { - if(!gControllerInfo[i].Populated) + if(!gControllerInfo[i].Initialized) continue; for(j = 0; j < gControllerInfo[i].NumberOfDrives; j++) { + if(!gControllerInfo[i].DriveInfo[j].Initialized) + continue; + if(gControllerInfo[i].DriveInfo[j].DeviceObject) { UNICODE_STRING Link; + RtlInitUnicodeString(&Link, gControllerInfo[i].DriveInfo[j].SymLinkBuffer); IoDeleteSymbolicLink(&Link); + + RtlInitUnicodeString(&Link, gControllerInfo[i].DriveInfo[j].ArcPathBuffer); + IoDeassignArcName(&Link); + IoDeleteDevice(gControllerInfo[i].DriveInfo[j].DeviceObject); } } @@ -502,13 +511,9 @@ static NTSTATUS NTAPI ConfigCallback(PVOID Context, } if(AddressSpace == 0) - { - gControllerInfo[gNumberOfControllers].BaseAddress = MmMapIoSpace(TranslatedAddress, 8, MmNonCached); // symbolic constant? - } + gControllerInfo[gNumberOfControllers].BaseAddress = MmMapIoSpace(TranslatedAddress, FDC_PORT_BYTES, MmNonCached); else - { gControllerInfo[gNumberOfControllers].BaseAddress = (PUCHAR)TranslatedAddress.u.LowPart; - } } else if(PartialDescriptor->Type == CmResourceTypeDma) @@ -579,7 +584,6 @@ static BOOLEAN NTAPI Isr(PKINTERRUPT Interrupt, * triggered, this is safe to not do here, as we can just wait for the DPC. * - Either way, we don't want to do this here. The controller shouldn't interrupt again, so we'll * schedule a DPC to take care of it. - * TODO: * - This driver really cannot shrare interrupts, as I don't know how to conclusively say * whether it was our controller that interrupted or not. I just have to assume that any time * my ISR gets called, it was my board that called it. Dumb design, yes, but it goes back to @@ -640,7 +644,7 @@ VOID NTAPI DpcForIsr(PKDPC UnusedDpc, KdPrint(("floppy: DpcForIsr called\n")); - KeSetEvent(&ControllerInfo->SynchEvent, IO_NO_INCREMENT, FALSE); + KeSetEvent(&ControllerInfo->SynchEvent, EVENT_INCREMENT, FALSE); } @@ -651,7 +655,7 @@ static NTSTATUS NTAPI InitController(PCONTROLLER_INFO ControllerInfo) * ControllerInfo: pointer to the controller to be initialized * RETURNS: * STATUS_SUCCESS if the controller is successfully initialized - * STATUS_UNSUCCESSFUL otherwise + * STATUS_IO_DEVICE_ERROR otherwise */ { int i; @@ -666,26 +670,22 @@ static NTSTATUS NTAPI InitController(PCONTROLLER_INFO ControllerInfo) KeClearEvent(&ControllerInfo->SynchEvent); - //HwDumpRegisters(ControllerInfo); - KdPrint(("floppy: InitController: resetting the controller\n")); /* Reset the controller */ if(HwReset(ControllerInfo) != STATUS_SUCCESS) { KdPrint(("floppy: InitController: unable to reset controller\n")); - return STATUS_UNSUCCESSFUL; + return STATUS_IO_DEVICE_ERROR; } - //HwDumpRegisters(ControllerInfo); - KdPrint(("floppy: InitController: setting data rate\n")); /* Set data rate */ if(HwSetDataRate(ControllerInfo, DRSR_DSEL_500KBPS) != STATUS_SUCCESS) { KdPrint(("floppy: InitController: unable to set data rate\n")); - return STATUS_UNSUCCESSFUL; + return STATUS_IO_DEVICE_ERROR; } KdPrint(("floppy: InitController: waiting for initial interrupt\n")); @@ -697,27 +697,18 @@ static NTSTATUS NTAPI InitController(PCONTROLLER_INFO ControllerInfo) for(i = 0; i < MAX_DRIVES_PER_CONTROLLER; i++) { KdPrint(("floppy: InitController: Sensing interrupt %d\n", i)); - //HwDumpRegisters(ControllerInfo); if(HwSenseInterruptStatus(ControllerInfo) != STATUS_SUCCESS) { KdPrint(("floppy: InitController: Unable to clear interrupt 0x%x\n", i)); - return STATUS_UNSUCCESSFUL; + return STATUS_IO_DEVICE_ERROR; } } KdPrint(("floppy: InitController: done sensing interrupts\n")); - //HwDumpRegisters(ControllerInfo); - /* Next, see if we have the right version to do implied seek */ - if(HwGetVersion(ControllerInfo) != VERSION_ENHANCED) - { - KdPrint(("floppy: InitController: enhanced version not supported; disabling implied seeks\n")); - ControllerInfo->ImpliedSeeks = FALSE; - ControllerInfo->Model30 = FALSE; - } - else + if(HwGetVersion(ControllerInfo) == VERSION_ENHANCED) { /* If so, set that up -- all defaults below except first TRUE for EIS */ if(HwConfigure(ControllerInfo, TRUE, TRUE, FALSE, 0, 0) != STATUS_SUCCESS) @@ -731,7 +722,32 @@ static NTSTATUS NTAPI InitController(PCONTROLLER_INFO ControllerInfo) ControllerInfo->ImpliedSeeks = TRUE; } - ControllerInfo->Model30 = TRUE; + /* + * FIXME: Figure out the answer to the below + * + * I must admit that I'm really confused about the Model 30 issue. At least one + * important bit (the disk change bit in the DIR) is flipped if this is a Model 30 + * controller. However, at least one other floppy driver believes that there are only + * two computers that are guaranteed to have a Model 30 controller: + * - IBM Thinkpad 750 + * - IBM PS2e + * + * ...and another driver only lists a config option for "thinkpad", that flips + * the change line. A third driver doesn't mention the Model 30 issue at all. + * + * What I can't tell is whether or not the average, run-of-the-mill computer now has + * a Model 30 controller. For the time being, I'm going to wire this to FALSE, + * and just not support the computers mentioned above, while I try to figure out + * how ubiquitous these newfangled 30 thingies are. + */ + //ControllerInfo->Model30 = TRUE; + ControllerInfo->Model30 = FALSE; + } + else + { + KdPrint(("floppy: InitController: enhanced version not supported; disabling implied seeks\n")); + ControllerInfo->ImpliedSeeks = FALSE; + ControllerInfo->Model30 = FALSE; } /* Specify */ @@ -746,32 +762,25 @@ static NTSTATUS NTAPI InitController(PCONTROLLER_INFO ControllerInfo) if(HwSpecify(ControllerInfo, HeadLoadTime, HeadUnloadTime, StepRateTime, FALSE) != STATUS_SUCCESS) { KdPrint(("floppy: InitController: unable to specify options\n")); - return STATUS_UNSUCCESSFUL; + return STATUS_IO_DEVICE_ERROR; } - //HwDumpRegisters(ControllerInfo); - /* Init the stop stuff */ KeInitializeDpc(&ControllerInfo->MotorStopDpc, MotorStopDpcFunc, ControllerInfo); KeInitializeTimer(&ControllerInfo->MotorTimer); KeInitializeEvent(&ControllerInfo->MotorStoppedEvent, SynchronizationEvent, FALSE); ControllerInfo->StopDpcQueued = FALSE; - /* Recalibrate each drive on the controller (depends on StartMotor, which depends on the timer stuff above) */ - /* TODO: Handle failure of one or more drives */ + /* + * Recalibrate each drive on the controller (depends on StartMotor, which depends on the timer stuff above) + * We don't even know if there is a disk in the drive, so this may not work, but that's OK. + */ for(i = 0; i < ControllerInfo->NumberOfDrives; i++) { KdPrint(("floppy: InitController: recalibrating drive 0x%x on controller 0x%x\n", i, ControllerInfo)); - - if(Recalibrate(&ControllerInfo->DriveInfo[i]) != STATUS_SUCCESS) - { - KdPrint(("floppy: InitController: unable to recalibrate drive\n")); - return STATUS_UNSUCCESSFUL; - } + Recalibrate(&ControllerInfo->DriveInfo[i]); } - //HwDumpRegisters(ControllerInfo); - KdPrint(("floppy: InitController: done initializing; returning STATUS_SUCCESS\n")); return STATUS_SUCCESS; @@ -792,11 +801,7 @@ static BOOLEAN NTAPI AddControllers(PDRIVER_OBJECT DriverObject) * just test a boolean value in the first object to see if it was completely populated. The same value * is tested for each controller before we build device objects for it. * TODO: - * - Figure out a workable interrupt-sharing scheme and un-hardcode FALSE in IoConnectInterrupt - * - Add support for non-ISA buses, by looping through all of the bus types looking for floppy controllers * - Report resource usage to the HAL - * - Add ARC path support - * - Think more about error handling; atm most errors abort the start of the driver */ { INTERFACE_TYPE InterfaceType = Isa; @@ -814,7 +819,7 @@ static BOOLEAN NTAPI AddControllers(PDRIVER_OBJECT DriverObject) /* * w2k breaks the return val from ConfigCallback, so we have to hack around it, rather than just - * looking for a return value from ConfigCallback + * looking for a return value from ConfigCallback. We expect at least one controller. */ if(!gControllerInfo[0].Populated) { @@ -826,7 +831,7 @@ static BOOLEAN NTAPI AddControllers(PDRIVER_OBJECT DriverObject) for(i = 0; i < gNumberOfControllers; i++) { /* 0: Report resource usage to the kernel, to make sure they aren't assigned to anyone else */ - /* XXX do me baby */ + /* FIXME: Implement me. */ /* 1: Set up interrupt */ gControllerInfo[i].MappedVector = HalGetInterruptVector(gControllerInfo[i].InterfaceType, gControllerInfo[i].BusNumber, @@ -845,26 +850,18 @@ static BOOLEAN NTAPI AddControllers(PDRIVER_OBJECT DriverObject) FALSE, Affinity, 0) != STATUS_SUCCESS) { KdPrint(("floppy: AddControllers: unable to connect interrupt\n")); - return FALSE; + continue; } /* 2: Set up DMA */ - memset(&DeviceDescription, 0, sizeof(DeviceDescription)); DeviceDescription.Version = DEVICE_DESCRIPTION_VERSION; - DeviceDescription.Master = (gControllerInfo[i].InterfaceType == PCIBus ? TRUE : FALSE); /* guessing if not pci not master */ DeviceDescription.DmaChannel = gControllerInfo[i].Dma; DeviceDescription.InterfaceType = gControllerInfo[i].InterfaceType; DeviceDescription.BusNumber = gControllerInfo[i].BusNumber; - if(gControllerInfo[i].InterfaceType == PCIBus) - { - DeviceDescription.Dma32BitAddresses = TRUE; - DeviceDescription.DmaWidth = Width32Bits; - } - else - /* DMA 0,1,2,3 are 8-bit; 4,5,6,7 are 16-bit (4 is chain i think) */ - DeviceDescription.DmaWidth = gControllerInfo[i].Dma > 3 ? Width16Bits: Width8Bits; + /* DMA 0,1,2,3 are 8-bit; 4,5,6,7 are 16-bit (4 is chain i think) */ + DeviceDescription.DmaWidth = gControllerInfo[i].Dma > 3 ? Width16Bits: Width8Bits; gControllerInfo[i].AdapterObject = HalGetAdapter(&DeviceDescription, &gControllerInfo[i].MapRegisters); @@ -872,23 +869,27 @@ static BOOLEAN NTAPI AddControllers(PDRIVER_OBJECT DriverObject) { KdPrint(("floppy: AddControllers: unable to allocate an adapter object\n")); IoDisconnectInterrupt(gControllerInfo[i].InterruptObject); - return FALSE; + continue; } /* 2b: Initialize the new controller */ if(InitController(&gControllerInfo[i]) != STATUS_SUCCESS) { KdPrint(("floppy: AddControllers():Unable to set up controller %d - initialization failed\n", i)); - ASSERT(0); /* FIXME: clean up properly */ + IoDisconnectInterrupt(gControllerInfo[i].InterruptObject); continue; } + /* 2c: Set the controller's initlized flag so we know to release stuff in Unload */ + gControllerInfo[i].Initialized = TRUE; + /* 3: per-drive setup */ for(j = 0; j < gControllerInfo[i].NumberOfDrives; j++) { WCHAR DeviceNameBuf[MAX_DEVICE_NAME]; UNICODE_STRING DeviceName; UNICODE_STRING LinkName; + UNICODE_STRING ArcPath; UCHAR DriveNumber; KdPrint(("floppy: AddControllers(): Configuring drive %d on controller %d\n", i, j)); @@ -917,11 +918,18 @@ static BOOLEAN NTAPI AddControllers(PDRIVER_OBJECT DriverObject) { KdPrint(("floppy: AddControllers: unable to register a Device object\n")); IoDisconnectInterrupt(gControllerInfo[i].InterruptObject); - return FALSE; + continue; /* continue on to next drive */ } KdPrint(("floppy: AddControllers: New device: %S (0x%x)\n", DeviceNameBuf, gControllerInfo[i].DriveInfo[j].DeviceObject)); + /* 3b.5: Create an ARC path in case we're booting from this drive */ + swprintf(gControllerInfo[i].DriveInfo[j].ArcPathBuffer, + L"\\ArcName\\multi(%d)disk(%d)fdisk(%d)", gControllerInfo[i].BusNumber, i, DriveNumber); + + RtlInitUnicodeString(&ArcPath, gControllerInfo[i].DriveInfo[j].ArcPathBuffer); + IoAssignArcName(&ArcPath, &DeviceName); + /* 3c: Set flags up */ gControllerInfo[i].DriveInfo[j].DeviceObject->Flags |= DO_DIRECT_IO; @@ -932,8 +940,8 @@ static BOOLEAN NTAPI AddControllers(PDRIVER_OBJECT DriverObject) { KdPrint(("floppy: AddControllers: Unable to create a symlink for drive %d\n", DriveNumber)); IoDisconnectInterrupt(gControllerInfo[i].InterruptObject); - // delete devices too? - return FALSE; + IoDeassignArcName(&ArcPath); + continue; /* continue to next drive */ } /* 3e: Set up the DPC */ @@ -947,6 +955,9 @@ static BOOLEAN NTAPI AddControllers(PDRIVER_OBJECT DriverObject) /* 3h: set the initial media type to unknown */ memset(&gControllerInfo[i].DriveInfo[j].DiskGeometry, 0, sizeof(DISK_GEOMETRY)); gControllerInfo[i].DriveInfo[j].DiskGeometry.MediaType = Unknown; + + /* 3i: Now that we're done, set the Initialized flag so we know to free this in Unload */ + gControllerInfo[i].DriveInfo[j].Initialized = TRUE; } } @@ -1131,7 +1142,7 @@ NTSTATUS NTAPI DriverEntry(PDRIVER_OBJECT DriverObject, if(PsCreateSystemThread(&ThreadHandle, 0, 0, 0, 0, QueueThread, 0) != STATUS_SUCCESS) { KdPrint(("floppy: Unable to create system thread; failing init\n")); - return STATUS_UNSUCCESSFUL; + return STATUS_INSUFFICIENT_RESOURCES; } if(ObReferenceObjectByHandle(ThreadHandle, STANDARD_RIGHTS_ALL, NULL, KernelMode, &ThreadObject, NULL) != STATUS_SUCCESS) @@ -1140,6 +1151,11 @@ NTSTATUS NTAPI DriverEntry(PDRIVER_OBJECT DriverObject, return STATUS_UNSUCCESSFUL; } + /* + * Close the handle, now that we have the object pointer and a reference of our own. + * The handle will certainly not be valid in the context of the caller next time we + * need it, as handles are process-specific. + */ ZwClose(ThreadHandle); /* @@ -1148,9 +1164,8 @@ NTSTATUS NTAPI DriverEntry(PDRIVER_OBJECT DriverObject, KeInitializeEvent(&QueueThreadTerminate, NotificationEvent, FALSE); /* - * Start the device discovery proces. In theory, this should return STATUS_SUCCESS if - * it finds even one drive attached to one controller. In practice, the AddControllers - * routine doesn't handle all of the errors right just yet. FIXME. + * Start the device discovery proces. Returns STATUS_SUCCESS if + * it finds even one drive attached to one controller. */ if(!AddControllers(DriverObject)) return STATUS_NO_SUCH_DEVICE; diff --git a/reactos/drivers/storage/floppy/floppy.h b/reactos/drivers/storage/floppy/floppy.h index a1be952eaee..56967695c14 100644 --- a/reactos/drivers/storage/floppy/floppy.h +++ b/reactos/drivers/storage/floppy/floppy.h @@ -71,12 +71,15 @@ typedef struct _DRIVE_INFO DISK_GEOMETRY DiskGeometry; UCHAR BytesPerSectorCode; WCHAR SymLinkBuffer[MAX_DEVICE_NAME]; + WCHAR ArcPathBuffer[MAX_ARC_PATH_LEN]; ULONG DiskChangeCount; + BOOLEAN Initialized; } DRIVE_INFO, *PDRIVE_INFO; typedef struct _CONTROLLER_INFO { BOOLEAN Populated; + BOOLEAN Initialized; ULONG ControllerNumber; INTERFACE_TYPE InterfaceType; ULONG BusNumber; @@ -111,6 +114,14 @@ NTSTATUS NTAPI DriverEntry(PDRIVER_OBJECT DriverObject, VOID NTAPI SignalMediaChanged(PDEVICE_OBJECT DeviceObject, PIRP Irp); +VOID NTAPI WaitForControllerInterrupt(PCONTROLLER_INFO ControllerInfo); + +NTSTATUS NTAPI ResetChangeFlag(PDRIVE_INFO DriveInfo); + +VOID NTAPI StartMotor(PDRIVE_INFO DriveInfo); + +VOID NTAPI StopMotor(PCONTROLLER_INFO ControllerInfo); + /* * MEDIA TYPES * @@ -133,10 +144,3 @@ VOID NTAPI SignalMediaChanged(PDEVICE_OBJECT DeviceObject, #define GEOMETRY_144_SECTORSPERTRACK 18 #define GEOMETRY_144_BYTESPERSECTOR 512 -VOID NTAPI WaitForControllerInterrupt(PCONTROLLER_INFO ControllerInfo); - -NTSTATUS NTAPI ResetChangeFlag(PDRIVE_INFO DriveInfo); - -VOID NTAPI StartMotor(PDRIVE_INFO DriveInfo); -VOID NTAPI StopMotor(PCONTROLLER_INFO ControllerInfo); - diff --git a/reactos/drivers/storage/floppy/hardware.c b/reactos/drivers/storage/floppy/hardware.c index e8c4fd5f15d..9a9b3ec05b6 100644 --- a/reactos/drivers/storage/floppy/hardware.c +++ b/reactos/drivers/storage/floppy/hardware.c @@ -41,7 +41,6 @@ * thread. * - Some information taken from Intel 82077AA data sheet (order #290166-007) * - * TODO: Fix all of the stupid STATUS_UNSUCCESSFUL return codes * TODO: ATM the constants defined in hardware.h *might* be shifted to line up * with the bit position in the register, or they *might not*. This should * all be converted to standardize on absolute values or shifts. @@ -81,21 +80,11 @@ static BOOLEAN NTAPI ReadyForWrite(PCONTROLLER_INFO ControllerInfo) { UCHAR Status = READ_PORT_UCHAR(ControllerInfo->BaseAddress + MAIN_STATUS_REGISTER); - PAGED_CODE(); - if((Status & MSR_IO_DIRECTION)) /* 0 for out */ - { - //KdPrint(("floppy: ReadyForWrite returning false due to incorrect FIFO direction; Status = 0x%x\n", Status)); - //HwDumpRegisters(ControllerInfo); return FALSE; - } if(!(Status & MSR_DATA_REG_READY_FOR_IO)) - { - //KdPrint(("floppy: ReadyForWrite returning false due to MSR Not ready for I/O; Status = 0x%x\n", Status)); - //HwDumpRegisters(ControllerInfo); return FALSE; - } return TRUE; } @@ -116,21 +105,11 @@ static BOOLEAN NTAPI ReadyForRead(PCONTROLLER_INFO ControllerInfo) { UCHAR Status = READ_PORT_UCHAR(ControllerInfo->BaseAddress + MAIN_STATUS_REGISTER); - PAGED_CODE(); - if(!(Status & MSR_IO_DIRECTION)) /* Read = 1 */ - { -// KdPrint(("floppy: ReadyForRead returning FALSE due to incorrect FIFO direction; Status 0x%x\n", Status)); -// HwDumpRegisters(ControllerInfo); return FALSE; - } if(!(Status & MSR_DATA_REG_READY_FOR_IO)) - { -// KdPrint(("floppy: ReadyForRead returning FALSE due to MSR Not ready for I/O\n; Status 0x%x", Status)); -// HwDumpRegisters(ControllerInfo); return FALSE; - } return TRUE; } @@ -157,14 +136,13 @@ static NTSTATUS NTAPI Send_Byte(PCONTROLLER_INFO ControllerInfo, * maximum. * - This function is necessary because sometimes the FIFO reacts slowly * and isn't yet ready to read or write the next byte + * FIXME: time interval here and in Get_Byte */ { LARGE_INTEGER StartingTickCount; LARGE_INTEGER CurrentTickCount; PUCHAR Address; - //KdPrint(("floppy: Send_Byte called to write 0x%x at offset 0x%x\n", Byte, Offset)); - PAGED_CODE(); Address = ControllerInfo->BaseAddress + FIFO; @@ -193,8 +171,6 @@ static NTSTATUS NTAPI Send_Byte(PCONTROLLER_INFO ControllerInfo, ElapsedTicks = CurrentTickCount.QuadPart - StartingTickCount.QuadPart; TimeUnits = ElapsedTicks * TimeIncrement; - //KdPrint(("floppy: Send_Byte: failed to write; elapsed time %d\n", TimeUnits)); - if(TimeUnits > 25000000) break; @@ -263,8 +239,6 @@ static NTSTATUS NTAPI Get_Byte(PCONTROLLER_INFO ControllerInfo, ElapsedTicks = CurrentTickCount.QuadPart - StartingTickCount.QuadPart; TimeUnits = ElapsedTicks * TimeIncrement; - //KdPrint(("floppy: Get_Byte: failed to read; elapsed time %d\n", TimeUnits)); - if(TimeUnits > 25000000) break; @@ -273,8 +247,6 @@ static NTSTATUS NTAPI Get_Byte(PCONTROLLER_INFO ControllerInfo, *Byte = READ_PORT_UCHAR(Address); - //KdPrint(("floppy: Get_Byte read 0x%x from offset 0x%x\n", *Byte, Offset)); - return STATUS_SUCCESS; } @@ -334,14 +306,13 @@ NTSTATUS NTAPI HwTurnOnMotor(PDRIVE_INFO DriveInfo) * STATUS_UNSUCCESSFUL otherwise * NOTES: * - Doesn't interrupt + * - Currently cannot fail */ { PCONTROLLER_INFO ControllerInfo = DriveInfo->ControllerInfo; UCHAR Unit = DriveInfo->UnitNumber; UCHAR Buffer; - //KdPrint(("floppy: HwTurnOnMotor called; setting unit 0x%x to data rate 0x%x\n", Unit, DataRate)); - PAGED_CODE(); /* turn on motor */ @@ -435,8 +406,6 @@ NTSTATUS NTAPI HwReadWriteData(PCONTROLLER_INFO ControllerInfo, PAGED_CODE(); - //KdPrint(("floppy: HwReadWriteData called\n")); - /* Shouldn't be using DataLength in this driver */ ASSERT(DataLength == 0xff); @@ -469,7 +438,6 @@ NTSTATUS NTAPI HwReadWriteData(PCONTROLLER_INFO ControllerInfo, } } - //KdPrint(("floppy: HwReadWriteData: returning STATUS_SUCCESS\n")); return STATUS_SUCCESS; } @@ -487,7 +455,7 @@ NTSTATUS NTAPI HwRecalibrateResult(PCONTROLLER_INFO ControllerInfo) * whole thing down to a single SUCCESS or FAILURE result * - Called post-interrupt; does not interrupt * TODO - * - handle much more status + * - perhaps handle more status */ { UCHAR Buffer[2]; @@ -495,8 +463,6 @@ NTSTATUS NTAPI HwRecalibrateResult(PCONTROLLER_INFO ControllerInfo) PAGED_CODE(); - //KdPrint(("floppy: HwRecalibrateResult called\n")); - if(Send_Byte(ControllerInfo, COMMAND_SENSE_INTERRUPT_STATUS) != STATUS_SUCCESS) { KdPrint(("floppy: HwRecalibrateResult: Unable to write the controller\n")); @@ -552,15 +518,13 @@ NTSTATUS NTAPI HwReadWriteResult(PCONTROLLER_INFO ControllerInfo) * - This function tests the error conditions itself, and boils the * whole thing down to a single SUCCESS or FAILURE result * - Called post-interrupt; does not interrupt - * TODO - * - handle much more status + * TODO: + * - perhaps handle more status */ { UCHAR Buffer[7]; int i; - //KdPrint(("floppy: HwReadWriteResult called\n")); - PAGED_CODE(); for(i = 0; i < 7; i++) @@ -632,8 +596,6 @@ NTSTATUS NTAPI HwSenseInterruptStatus(PCONTROLLER_INFO ControllerInfo) PAGED_CODE(); - //KdPrint(("floppy: HwSenseInterruptStatus called\n")); - if(Send_Byte(ControllerInfo, COMMAND_SENSE_INTERRUPT_STATUS) != STATUS_SUCCESS) { KdPrint(("floppy: HwSenseInterruptStatus: failed to write controller\n")); @@ -885,9 +847,8 @@ NTSTATUS NTAPI HwDiskChanged(PDRIVE_INFO DriveInfo, { if(!(Buffer & DIR_DISKETTE_CHANGE)) { - /* FIXME FIXME FIXME: This is wrong */ KdPrint(("floppy: HdDiskChanged - Model30 - returning TRUE\n")); - *DiskChanged = FALSE; + *DiskChanged = TRUE; } else { @@ -957,7 +918,7 @@ NTSTATUS NTAPI HwReadIdResult(PCONTROLLER_INFO ControllerInfo, * whole thing down to a single SUCCESS or FAILURE result * - Called post-interrupt; does not interrupt * TODO - * - handle much more status + * - perhaps handle more status */ { UCHAR Buffer[7] = {0,0,0,0,0,0,0}; diff --git a/reactos/drivers/storage/floppy/hardware.h b/reactos/drivers/storage/floppy/hardware.h index 52cf5f0a87b..17b15ccc827 100644 --- a/reactos/drivers/storage/floppy/hardware.h +++ b/reactos/drivers/storage/floppy/hardware.h @@ -35,6 +35,7 @@ */ #define FLOPPY_DEFAULT_IRQ 0x6 +#define FDC_PORT_BYTES 0x8 /* Register offsets from base address (usually 0x3f8) */ #define STATUS_REGISTER_A 0x0 /* Read; PS/2 Only */ diff --git a/reactos/drivers/storage/floppy/ioctl.c b/reactos/drivers/storage/floppy/ioctl.c index 1cdc0f791e2..7242a3311d2 100644 --- a/reactos/drivers/storage/floppy/ioctl.c +++ b/reactos/drivers/storage/floppy/ioctl.c @@ -134,6 +134,11 @@ VOID NTAPI DeviceIoctlPassive(PDRIVE_INFO DriveInfo, return; } + /* + * Start the drive to see if the disk has changed + */ + StartMotor(DriveInfo); + /* * Check the change line, and if it's set, return */ @@ -143,6 +148,7 @@ VOID NTAPI DeviceIoctlPassive(PDRIVE_INFO DriveInfo, Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); + StopMotor(DriveInfo->ControllerInfo); return; } @@ -161,7 +167,7 @@ VOID NTAPI DeviceIoctlPassive(PDRIVE_INFO DriveInfo, Irp->IoStatus.Status = STATUS_NO_MEDIA_IN_DEVICE; IoCompleteRequest(Irp, IO_NO_INCREMENT); - + StopMotor(DriveInfo->ControllerInfo); return; } @@ -245,6 +251,7 @@ VOID NTAPI DeviceIoctlPassive(PDRIVE_INFO DriveInfo, KdPrint(("floppy: ioctl: completing with status 0x%x\n", Irp->IoStatus.Status)); IoCompleteRequest(Irp, IO_NO_INCREMENT); + StopMotor(DriveInfo->ControllerInfo); return; } diff --git a/reactos/drivers/storage/floppy/ioctl.h b/reactos/drivers/storage/floppy/ioctl.h index 935894a7804..ad55ad4ffdf 100644 --- a/reactos/drivers/storage/floppy/ioctl.h +++ b/reactos/drivers/storage/floppy/ioctl.h @@ -29,3 +29,4 @@ NTSTATUS NTAPI DeviceIoctl(PDEVICE_OBJECT DeviceObject, VOID NTAPI DeviceIoctlPassive(PDRIVE_INFO DriveInfo, PIRP Irp); + diff --git a/reactos/drivers/storage/floppy/readwrite.c b/reactos/drivers/storage/floppy/readwrite.c index fd4d8b6586d..8e7e80a90d0 100644 --- a/reactos/drivers/storage/floppy/readwrite.c +++ b/reactos/drivers/storage/floppy/readwrite.c @@ -45,7 +45,6 @@ * of RWComputeCHS. I've never seen Windows send a partial-sector request, though, so * this may not be a bad thing. Should be looked into, regardless. * - * TODO: Handle split reads and writes across multiple map registers * TODO: Break up ReadWritePassive and handle errors better * TODO: Figure out data rate issues * TODO: Media type detection @@ -85,7 +84,7 @@ static IO_ALLOCATION_ACTION NTAPI MapRegisterCallback(PDEVICE_OBJECT DeviceObjec ControllerInfo->MapRegisterBase = MapRegisterBase; KeSetEvent(&ControllerInfo->SynchEvent, 0, FALSE); - return KeepObject; /* FIXME: Should be something else if we find a bus master */ + return KeepObject; } @@ -184,6 +183,8 @@ static NTSTATUS NTAPI RWDetermineMediaType(PDRIVE_INFO DriveInfo) do { + int i; + /* Program data rate */ if(HwSetDataRate(DriveInfo->ControllerInfo, DRSR_DSEL_500KBPS) != STATUS_SUCCESS) { @@ -207,20 +208,29 @@ static NTSTATUS NTAPI RWDetermineMediaType(PDRIVE_INFO DriveInfo) KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); /* Recalibrate --> head over first track */ - /* FIXME: should be done in a loop? */ - if(HwRecalibrate(DriveInfo) != STATUS_SUCCESS) + for(i=0; i < 2; i++) { - KdPrint(("floppy: RWDetermineMediaType(): Recalibrate failed\n")); - return STATUS_UNSUCCESSFUL; - } + NTSTATUS RecalStatus; - /* Wait for the recalibrate to finish */ - WaitForControllerInterrupt(DriveInfo->ControllerInfo); + if(HwRecalibrate(DriveInfo) != STATUS_SUCCESS) + { + KdPrint(("floppy: RWDetermineMediaType(): Recalibrate failed\n")); + return STATUS_UNSUCCESSFUL; + } - if(HwRecalibrateResult(DriveInfo->ControllerInfo) != STATUS_SUCCESS) - { - KdPrint(("floppy: RWDetermineMediaType(): RecalibrateResult failed\n")); - return STATUS_UNSUCCESSFUL; + /* Wait for the recalibrate to finish */ + WaitForControllerInterrupt(DriveInfo->ControllerInfo); + + RecalStatus = HwRecalibrateResult(DriveInfo->ControllerInfo); + + if(RecalStatus == STATUS_SUCCESS) + break; + + if(i == 1) /* failed for 2nd time */ + { + KdPrint(("floppy: RWDetermineMediaType(): RecalibrateResult failed\n")); + return STATUS_UNSUCCESSFUL; + } } /* clear any spurious interrupts */ @@ -574,7 +584,6 @@ VOID NTAPI ReadWritePassive(PDRIVE_INFO DriveInfo, */ /* Get map registers for DMA */ - /* FIXME: Just request all of our map regiters for now */ KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); Status = IoAllocateAdapterChannel(DriveInfo->ControllerInfo->AdapterObject, DeviceObject, DriveInfo->ControllerInfo->MapRegisters, MapRegisterCallback, DriveInfo->ControllerInfo); From 7b9bc747c892b0fff43d160cc2e661f738ee1337 Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Fri, 12 Mar 2004 04:21:59 +0000 Subject: [PATCH 0449/1463] Added bit counting and inverting functions to address. Broke out some functions in info.c -- They still don't work properly but are improving. Added setting of netmask in datalink/lan.c from the registry, broke out registry reading function. svn path=/trunk/; revision=8661 --- reactos/drivers/net/tcpip/datalink/lan.c | 203 +++++++++++--------- reactos/drivers/net/tcpip/include/address.h | 4 + reactos/drivers/net/tcpip/include/info.h | 26 +++ reactos/drivers/net/tcpip/include/ip.h | 2 + reactos/drivers/net/tcpip/include/tcpip.h | 1 + reactos/drivers/net/tcpip/tcpip/address.c | 29 +++ reactos/drivers/net/tcpip/tcpip/info.c | 170 ++++++++++++---- 7 files changed, 308 insertions(+), 127 deletions(-) diff --git a/reactos/drivers/net/tcpip/datalink/lan.c b/reactos/drivers/net/tcpip/datalink/lan.c index 08169ead95a..fd4aec48218 100644 --- a/reactos/drivers/net/tcpip/datalink/lan.c +++ b/reactos/drivers/net/tcpip/datalink/lan.c @@ -15,7 +15,6 @@ #include <receive.h> #include <arp.h> - NDIS_HANDLE NdisProtocolHandle = (NDIS_HANDLE)NULL; BOOLEAN ProtocolRegistered = FALSE; LIST_ENTRY AdapterListHead; @@ -590,6 +589,72 @@ VOID LANTransmit( } } +static NTSTATUS +OpenRegistryKey( PNDIS_STRING RegistryPath, PHANDLE RegHandle ) { + OBJECT_ATTRIBUTES Attributes; + NTSTATUS Status; + + InitializeObjectAttributes(&Attributes, RegistryPath, OBJ_CASE_INSENSITIVE, 0, 0); + Status = ZwOpenKey(RegHandle, GENERIC_READ, &Attributes); + return Status; +} + +static NTSTATUS ReadIPAddressFromRegistry( HANDLE RegHandle, + PWCHAR RegistryValue, + PIP_ADDRESS *Address ) { + UNICODE_STRING ValueName; + UNICODE_STRING UnicodeAddress; + NTSTATUS Status; + ULONG ResultLength; + UCHAR buf[1024]; + PKEY_VALUE_PARTIAL_INFORMATION Information = (PKEY_VALUE_PARTIAL_INFORMATION)buf; + ANSI_STRING AnsiAddress; + ULONG AnsiLen; + + RtlInitUnicodeString(&ValueName, RegistryValue); + Status = + ZwQueryValueKey(RegHandle, + &ValueName, + KeyValuePartialInformation, + Information, + sizeof(buf), + &ResultLength); + + if (!NT_SUCCESS(Status)) + return Status; + /* IP address is stored as a REG_MULTI_SZ - we only pay attention to the first one though */ + TI_DbgPrint(MIN_TRACE, ("Information DataLength: 0x%x\n", Information->DataLength)); + + UnicodeAddress.Buffer = (PWCHAR)&Information->Data; + UnicodeAddress.Length = Information->DataLength; + UnicodeAddress.MaximumLength = Information->DataLength; + + AnsiLen = RtlUnicodeStringToAnsiSize(&UnicodeAddress); + if(!AnsiLen) + return STATUS_NO_MEMORY; + + AnsiAddress.Buffer = ExAllocatePoolWithTag(PagedPool, AnsiLen, 0x01020304); + if(!AnsiAddress.Buffer) + return STATUS_NO_MEMORY; + + AnsiAddress.Length = AnsiLen; + AnsiAddress.MaximumLength = AnsiLen; + + Status = RtlUnicodeStringToAnsiString(&AnsiAddress, &UnicodeAddress, FALSE); + if (!NT_SUCCESS(Status)) { + ExFreePool(AnsiAddress.Buffer); + return STATUS_UNSUCCESSFUL; + } + + AnsiAddress.Buffer[AnsiAddress.Length] = 0; + *Address = AddrBuildIPv4(inet_addr(AnsiAddress.Buffer)); + if (!Address) { + ExFreePool(AnsiAddress.Buffer); + return STATUS_UNSUCCESSFUL; + } + + return *Address ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL; +} VOID BindAdapter( PLAN_ADAPTER Adapter, @@ -605,11 +670,14 @@ VOID BindAdapter( { INT i; PIP_INTERFACE IF; - PIP_ADDRESS Address; + PIP_ADDRESS Address = 0; + PIP_ADDRESS Netmask = 0; PNDIS_PACKET Packet; NDIS_STATUS NdisStatus; LLIP_BIND_INFO BindInfo; ULONG Lookahead = LOOKAHEAD_SIZE; + NTSTATUS Status; + HANDLE RegHandle = 0; TI_DbgPrint(DEBUG_DATALINK, ("Called.\n")); @@ -655,100 +723,59 @@ VOID BindAdapter( return; } - { - /* - * Query per-adapter configuration from the registry - * In case anyone is curious: there *is* an Ndis configuration api - * for this sort of thing, but it doesn't really support things like - * REG_MULTI_SZ very well, and there is a note in the DDK that says that - * protocol drivers developed for win2k and above just use the native - * services (ZwOpenKey, etc). - */ - - OBJECT_ATTRIBUTES Attributes; - HANDLE RegHandle; - NTSTATUS Status; - UNICODE_STRING ValueName; - UCHAR buf[1024]; - PKEY_VALUE_PARTIAL_INFORMATION Information = (PKEY_VALUE_PARTIAL_INFORMATION)buf; - ULONG ResultLength; - ANSI_STRING AnsiAddress; - UNICODE_STRING UnicodeAddress; - ULONG AnsiLen; - - InitializeObjectAttributes(&Attributes, RegistryPath, OBJ_CASE_INSENSITIVE, 0, 0); - Status = ZwOpenKey(&RegHandle, GENERIC_READ, &Attributes); - - if(!NT_SUCCESS(Status)) - { - TI_DbgPrint(MIN_TRACE, ("Unable to open protocol-specific registry key: 0x%x\n", Status)); - - /* XXX how do we proceed? No ip address, no parameters... do we guess? */ - FreeTDPackets(Adapter); - IPDestroyInterface(Adapter->Context); - return; - } - - RtlInitUnicodeString(&ValueName, L"IPAddress"); - ZwQueryValueKey(RegHandle, &ValueName, KeyValuePartialInformation, Information, sizeof(buf), &ResultLength); - ZwClose(RegHandle); - - /* IP address is stored as a REG_MULTI_SZ - we only pay attention to the first one though */ - TI_DbgPrint(MIN_TRACE, ("Information DataLength: 0x%x\n", Information->DataLength)); - - UnicodeAddress.Buffer = (PWCHAR)&Information->Data; - UnicodeAddress.Length = Information->DataLength; - UnicodeAddress.MaximumLength = Information->DataLength; - - AnsiLen = RtlUnicodeStringToAnsiSize(&UnicodeAddress); - if(!AnsiLen) - { - TI_DbgPrint(MIN_TRACE, ("Unable to calculate address length\n")); - FreeTDPackets(Adapter); - IPDestroyInterface(Adapter->Context); - return; - } - - AnsiAddress.Buffer = ExAllocatePoolWithTag(PagedPool, AnsiLen, 0x01020304); - if(!AnsiAddress.Buffer) - { - TI_DbgPrint(MIN_TRACE, ("ExAllocatePoolWithTag() failed.\n")); - FreeTDPackets(Adapter); - IPDestroyInterface(Adapter->Context); - return; - } - AnsiAddress.Length = AnsiLen; - AnsiAddress.MaximumLength = AnsiLen; - - Status = RtlUnicodeStringToAnsiString(&AnsiAddress, &UnicodeAddress, FALSE); - if (!NT_SUCCESS(Status)) - { - TI_DbgPrint(MIN_TRACE, ("RtlUnicodeStringToAnsiString() failed with Status 0x%lx.\n", Status)); - FreeTDPackets(Adapter); - IPDestroyInterface(Adapter->Context); - return; - } - - AnsiAddress.Buffer[AnsiAddress.Length] = 0; - Address = AddrBuildIPv4(inet_addr(AnsiAddress.Buffer)); - if (!Address) { - TI_DbgPrint(MIN_TRACE, ("AddrBuildIPv4() failed.\n")); - FreeTDPackets(Adapter); - IPDestroyInterface(Adapter->Context); - return; - } - - TI_DbgPrint(MID_TRACE, ("--> Our IP address on this interface: '%s'\n", A2S(Address))); - } + /* + * Query per-adapter configuration from the registry + * In case anyone is curious: there *is* an Ndis configuration api + * for this sort of thing, but it doesn't really support things like + * REG_MULTI_SZ very well, and there is a note in the DDK that says that + * protocol drivers developed for win2k and above just use the native + * services (ZwOpenKey, etc). + */ + + Status = OpenRegistryKey( RegistryPath, &RegHandle ); + + if(NT_SUCCESS(Status)) + Status = ReadIPAddressFromRegistry( RegHandle, L"IPAddress", + &Address ); + if(NT_SUCCESS(Status)) + Status = ReadIPAddressFromRegistry( RegHandle, L"SubnetMask", + &Netmask ); + + if(!NT_SUCCESS(Status) || !Address || !Netmask) + { + TI_DbgPrint(MIN_TRACE, ("Unable to open protocol-specific registry key: 0x%x\n", Status)); + + /* XXX how do we proceed? No ip address, no parameters... do we guess? */ + if(RegHandle) + ZwClose(RegHandle); + if(Address) Address->Free(Address); + if(Netmask) Netmask->Free(Netmask); + FreeTDPackets(Adapter); + IPDestroyInterface(IF); + return; + } + + TI_DbgPrint + (MID_TRACE, + ("--> Our IP address on this interface: '%s'\n", + A2S(Address))); + + TI_DbgPrint + (MID_TRACE, + ("--> Our net mask on this interface: '%s'\n", + A2S(Netmask))); /* Create a net table entry for this interface */ - if (!IPCreateNTE(IF, Address, 8)) { + if (!IPCreateNTE(IF, Address, AddrCountPrefixBits(Netmask))) { + Netmask->Free(Netmask); TI_DbgPrint(MIN_TRACE, ("IPCreateNTE() failed.\n")); FreeTDPackets(Adapter); IPDestroyInterface(IF); return; } + Netmask->Free(Netmask); + /* Reference the interface for the NTE. The reference for the address is just passed on to the NTE */ ReferenceObject(IF); diff --git a/reactos/drivers/net/tcpip/include/address.h b/reactos/drivers/net/tcpip/include/address.h index c93b6772115..450f96889c2 100644 --- a/reactos/drivers/net/tcpip/include/address.h +++ b/reactos/drivers/net/tcpip/include/address.h @@ -78,6 +78,10 @@ PADDRESS_FILE AddrSearchNext( unsigned long PASCAL inet_addr(const char*); +ULONG IPv4NToHl( ULONG Address ); + +UINT AddrCountPrefixBits( PIP_ADDRESS Netmask ); + #endif /* __ADDRESS_H */ /* EOF */ diff --git a/reactos/drivers/net/tcpip/include/info.h b/reactos/drivers/net/tcpip/include/info.h index 2e9631bea3e..2ead71a6e88 100644 --- a/reactos/drivers/net/tcpip/include/info.h +++ b/reactos/drivers/net/tcpip/include/info.h @@ -7,6 +7,8 @@ #ifndef __INFO_H #define __INFO_H +#define MAX_PHYSADDR_LEN 8 +#define MAX_IFDESCR_LEN 256 typedef struct IPSNMP_INFO { ULONG Forwarding; @@ -60,7 +62,31 @@ typedef struct IPROUTE_ENTRY { ULONG Info; } IPROUTE_ENTRY, *PIPROUTE_ENTRY; +typedef struct IFENTRY { + ULONG Index; + ULONG Type; + ULONG Mtu; + ULONG Speed; + ULONG PhysAddrLen; + UCHAR PhysAddr[MAX_PHYSADDR_LEN]; + ULONG AdminStatus; + ULONG OperStatus; + ULONG LastChange; + ULONG InOctets; + ULONG InUcastPackets; + ULONG InDiscards; + ULONG InErrors; + ULONG InUnknownProtos; + ULONG OutOctets; + ULONG OutUcastPackets; + ULONG OutDiscards; + ULONG OutErrors; + ULONG OutQLen; + ULONG DescrLen; +} IFENTRY, *PIFENTRY; + #define IP_MIB_STATS_ID 1 +#define IF_MIB_STATS_ID 1 #ifndef IP_MIB_ADDRTABLE_ENTRY_ID #define IP_MIB_ADDRTABLE_ENTRY_ID 0x102 #endif diff --git a/reactos/drivers/net/tcpip/include/ip.h b/reactos/drivers/net/tcpip/include/ip.h index 81670ac507a..6c2b7190861 100644 --- a/reactos/drivers/net/tcpip/include/ip.h +++ b/reactos/drivers/net/tcpip/include/ip.h @@ -264,6 +264,8 @@ NTSTATUS IPStartup( NTSTATUS IPShutdown( VOID); + + #endif /* __IP_H */ /* EOF */ diff --git a/reactos/drivers/net/tcpip/include/tcpip.h b/reactos/drivers/net/tcpip/include/tcpip.h index 69efcd6215a..67a0d16c2e8 100644 --- a/reactos/drivers/net/tcpip/include/tcpip.h +++ b/reactos/drivers/net/tcpip/include/tcpip.h @@ -125,6 +125,7 @@ extern NDIS_HANDLE GlobalBufferPool; extern KSPIN_LOCK EntityListLock; extern TDIEntityID *EntityList; extern ULONG EntityCount; +extern ULONG EntityMax; extern UDP_STATISTICS UDPStats; #endif /* __TCPIP_H */ diff --git a/reactos/drivers/net/tcpip/tcpip/address.c b/reactos/drivers/net/tcpip/tcpip/address.c index 252f6ddd387..5828c36d4da 100644 --- a/reactos/drivers/net/tcpip/tcpip/address.c +++ b/reactos/drivers/net/tcpip/tcpip/address.c @@ -54,6 +54,35 @@ PCHAR A2S( #endif /* DBG */ +ULONG IPv4NToHl( ULONG Address ) { + return + ((Address & 0xff) << 24) | + ((Address & 0xff00) << 8) | + ((Address >> 8) & 0xff00) | + ((Address >> 24) & 0xff); +} + +UINT AddrCountPrefixBits( PIP_ADDRESS Netmask ) { + UINT Prefix = 0; + if( Netmask->Type == IP_ADDRESS_V4 ) { + ULONG BitTest = 0x80000000; + + /* The mask has been read in network order. Put it in host order + * in order to scan it. */ + + ULONG TestMask = IPv4NToHl(Netmask->Address.IPv4Address); + + while( (BitTest & TestMask) == BitTest ) { + Prefix++; + BitTest >>= 1; + } + return Prefix; + } else { + TI_DbgPrint(DEBUG_DATALINK, ("Don't know address type %d\n", + Netmask->Type)); + return 0; + } +} VOID IPAddressFree( PVOID Object) diff --git a/reactos/drivers/net/tcpip/tcpip/info.c b/reactos/drivers/net/tcpip/tcpip/info.c index 04e91815d45..2331821ba4d 100644 --- a/reactos/drivers/net/tcpip/tcpip/info.c +++ b/reactos/drivers/net/tcpip/tcpip/info.c @@ -201,6 +201,127 @@ TDI_STATUS IPTdiQueryInformationEx( return TDI_INVALID_PARAMETER; } +TDI_STATUS InfoTdiQueryListEntities(PNDIS_BUFFER Buffer, + UINT BufSize, + PUINT BufferSize) +{ + UINT Count, Size, Temp; + KIRQL OldIrql; + PLIST_ENTRY CurrentIFEntry; + + /* Count Adapters */ + KeAcquireSpinLock(&InterfaceListLock, &OldIrql); + + CurrentIFEntry = InterfaceListHead.Flink; + Count = EntityCount; + + while( CurrentIFEntry != &InterfaceListHead ) { + Count++; + CurrentIFEntry = CurrentIFEntry->Flink; + } + + KeReleaseSpinLock(&InterfaceListLock, OldIrql); + + Size = Count * sizeof(TDIEntityID); + *BufferSize = Size; + + if (BufSize < Size) + { + /* The buffer is too small to contain requested data */ + return TDI_BUFFER_TOO_SMALL; + } + + DbgPrint("About to copy %d TDIEntityIDs (%d bytes) to user\n", + Count, Size); + + KeAcquireSpinLock(&EntityListLock, &OldIrql); + + /* Update entity list */ + for( Temp = EntityCount; Temp < Count; Temp++ ) { + EntityList[Temp].tei_entity = IF_ENTITY; + EntityList[Temp].tei_instance = Temp - EntityCount; + } + EntityMax = Count; + + /* Return entity list */ + Count = CopyBufferToBufferChain(Buffer, 0, (PUCHAR)EntityList, Size); + + KeReleaseSpinLock(&EntityListLock, OldIrql); + + *BufferSize = Size; + + return TDI_SUCCESS; +} + +TDI_STATUS InfoTdiQueryGetInterfaceMIB(TDIObjectID *ID, + PNDIS_BUFFER Buffer, + UINT BufSize, + PUINT BufferSize) { + PIFENTRY OutData; + UINT ListedIfIndex, Count, Size; + PLIST_ENTRY CurrentADEEntry; + PADDRESS_ENTRY CurrentADE; + PLIST_ENTRY CurrentIFEntry; + PIP_INTERFACE CurrentIF; + PCHAR IFDescr; + KIRQL OldIrql; + + OutData = ExAllocatePool( NonPagedPool, + sizeof(IFENTRY) + MAX_IFDESCR_LEN ); + + if( !OutData ) return STATUS_NO_MEMORY; + + RtlZeroMemory( OutData,sizeof(IFENTRY) + MAX_IFDESCR_LEN ); + + KeAcquireSpinLock(&EntityListLock, &OldIrql); + ListedIfIndex = ID->toi_entity.tei_instance - EntityCount; + if( ListedIfIndex > EntityMax ) { + KeReleaseSpinLock(&EntityListLock,OldIrql); + return TDI_INVALID_REQUEST; + } + + CurrentIFEntry = InterfaceListHead.Flink; + + for( Count = 0; Count < ListedIfIndex; Count++ ) + CurrentIFEntry = CurrentIFEntry->Flink; + + CurrentIF = CONTAINING_RECORD(CurrentIFEntry, IP_INTERFACE, ListEntry); + + CurrentADEEntry = CurrentIF->ADEListHead.Flink; + if( CurrentADEEntry == &CurrentIF->ADEListHead ) { + KeReleaseSpinLock( &EntityListLock, OldIrql ); + return TDI_INVALID_REQUEST; + } + + CurrentADE = CONTAINING_RECORD(CurrentADEEntry, ADDRESS_ENTRY, ListEntry); + + OutData->Index = Count + 1; /* XXX - arty What goes here?? */ + OutData->Type = CurrentADE->Type; + OutData->Mtu = CurrentIF->MTU; + OutData->Speed = 10000000; /* XXX - arty Not sure */ + memcpy(OutData->PhysAddr, + CurrentIF->Address,CurrentIF->AddressLength); + OutData->PhysAddrLen = CurrentIF->AddressLength; + OutData->AdminStatus = TRUE; + OutData->OperStatus = TRUE; + IFDescr = (PCHAR)&OutData[1]; + strcpy(IFDescr,"ethernet adapter"); + OutData->DescrLen = strlen(IFDescr); + IFDescr = IFDescr + strlen(IFDescr); + Size = IFDescr - (PCHAR)OutData; + + KeReleaseSpinLock(&InterfaceListLock, OldIrql); + + *BufferSize = Size; + + if( BufSize < Size ) { + return TDI_BUFFER_TOO_SMALL; + } else { + CopyBufferToBufferChain(Buffer, 0, (PUCHAR)&OutData, Size); + return TDI_SUCCESS; + } +} + TDI_STATUS InfoTdiQueryInformationEx( PTDI_REQUEST Request, TDIObjectID *ID, @@ -250,47 +371,18 @@ TDI_STATUS InfoTdiQueryInformationEx( return TDI_INVALID_PARAMETER; } - /* Count Adapters */ - KeAcquireSpinLock(&InterfaceListLock, &OldIrql); + return InfoTdiQueryListEntities(Buffer, BufSize, BufferSize); + } - CurrentIFEntry = InterfaceListHead.Flink; - Count = EntityCount; + /* Get an IFENTRY */ + if (ID->toi_class == INFO_CLASS_PROTOCOL && + ID->toi_type == INFO_TYPE_PROVIDER && + ID->toi_id == IF_MIB_STATS_ID) + { + if(ID->toi_entity.tei_entity != IF_ENTITY) + return TDI_INVALID_REQUEST; - while( CurrentIFEntry != &InterfaceListHead ) { - Count++; - CurrentIFEntry = CurrentIFEntry->Flink; - } - - KeReleaseSpinLock(&InterfaceListLock, OldIrql); - - Size = Count * sizeof(TDIEntityID); - *BufferSize = Size; - - if (BufSize < Size) - { - /* The buffer is too small to contain requested data */ - return TDI_BUFFER_TOO_SMALL; - } - - DbgPrint("About to copy %d TDIEntityIDs (%d bytes) to user\n", - Count, Size); - - KeAcquireSpinLock(&EntityListLock, &OldIrql); - - /* Update entity list */ - for( Temp = EntityCount; Temp < Count; Temp++ ) { - EntityList[Temp].tei_entity = IF_ENTITY; - EntityList[Temp].tei_instance = Temp - EntityCount; - } - - /* Return entity list */ - Count = CopyBufferToBufferChain(Buffer, 0, (PUCHAR)EntityList, Size); - - KeReleaseSpinLock(&EntityListLock, OldIrql); - - *BufferSize = Size; - - return TDI_SUCCESS; + return InfoTdiQueryGetInterfaceMIB(ID, Buffer, BufSize, BufferSize); } if ((Entity != CL_TL_ENTITY) && (Entity != CO_TL_ENTITY)) From 5c45ab6ac0c120cc5e5088fad156e7be9051c964 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 12 Mar 2004 19:40:05 +0000 Subject: [PATCH 0450/1463] - Support for IRP_MN_QUERY_BUS_INFORMATION and devices on multiple PCI buses. svn path=/trunk/; revision=8662 --- reactos/drivers/bus/pci/fdo.c | 130 ++++++++++++++++++---------------- reactos/drivers/bus/pci/pci.h | 14 ++-- reactos/drivers/bus/pci/pdo.c | 36 +++++++++- 3 files changed, 112 insertions(+), 68 deletions(-) diff --git a/reactos/drivers/bus/pci/fdo.c b/reactos/drivers/bus/pci/fdo.c index b57dbb7a90d..ce76ced9365 100644 --- a/reactos/drivers/bus/pci/fdo.c +++ b/reactos/drivers/bus/pci/fdo.c @@ -1,4 +1,4 @@ -/* $Id: fdo.c,v 1.5 2003/12/12 21:54:42 ekohl Exp $ +/* $Id: fdo.c,v 1.6 2004/03/12 19:40:05 navaraf Exp $ * * PROJECT: ReactOS PCI bus driver * FILE: fdo.c @@ -13,7 +13,7 @@ #include "pcidef.h" #include "pci.h" -#define NDEBUG +//#define NDEBUG #include <debug.h> /*** PRIVATE *****************************************************************/ @@ -61,6 +61,7 @@ FdoEnumerateDevices( PLIST_ENTRY CurrentEntry; PPCI_DEVICE Device; PCI_SLOT_NUMBER SlotNumber; + ULONG BusNumber; ULONG DeviceNumber; ULONG FunctionNumber; ULONG Size; @@ -82,70 +83,75 @@ FdoEnumerateDevices( DeviceExtension->DeviceListCount = 0; /* Enumerate devices on the PCI bus */ - SlotNumber.u.AsULONG = 0; - for (DeviceNumber = 0; DeviceNumber < PCI_MAX_DEVICES; DeviceNumber++) + for (BusNumber = 0; BusNumber < 8; BusNumber++) { - SlotNumber.u.bits.DeviceNumber = DeviceNumber; - for (FunctionNumber = 0; FunctionNumber < PCI_MAX_FUNCTION; FunctionNumber++) + SlotNumber.u.AsULONG = 0; + for (DeviceNumber = 0; DeviceNumber < PCI_MAX_DEVICES; DeviceNumber++) { - SlotNumber.u.bits.FunctionNumber = FunctionNumber; - - Size= HalGetBusData(PCIConfiguration, - DeviceExtension->BusNumber, - SlotNumber.u.AsULONG, - &PciConfig, - sizeof(PCI_COMMON_CONFIG)); - DPRINT("Size %lu\n", Size); - if (Size < sizeof(PCI_COMMON_CONFIG)) + SlotNumber.u.bits.DeviceNumber = DeviceNumber; + for (FunctionNumber = 0; FunctionNumber < PCI_MAX_FUNCTION; FunctionNumber++) { - if (FunctionNumber == 0) + SlotNumber.u.bits.FunctionNumber = FunctionNumber; + + Size= HalGetBusData(PCIConfiguration, + BusNumber, + SlotNumber.u.AsULONG, + &PciConfig, + sizeof(PCI_COMMON_CONFIG)); + DPRINT("Size %lu\n", Size); + if (Size < sizeof(PCI_COMMON_CONFIG)) { - break; + if (FunctionNumber == 0) + { + break; + } + else + { + continue; + } } - else + + DPRINT("Bus %1lu Device %2lu Func %1lu VenID 0x%04hx DevID 0x%04hx\n", + BusNumber, + DeviceNumber, + FunctionNumber, + PciConfig.VendorID, + PciConfig.DeviceID); + + Status = FdoLocateChildDevice(&Device, DeviceExtension, SlotNumber, &PciConfig); + if (!NT_SUCCESS(Status)) { - continue; + Device = (PPCI_DEVICE)ExAllocatePool(PagedPool, sizeof(PCI_DEVICE)); + if (!Device) + { + /* FIXME: Cleanup resources for already discovered devices */ + return STATUS_INSUFFICIENT_RESOURCES; + } + + RtlZeroMemory (Device, + sizeof(PCI_DEVICE)); + + Device->BusNumber = BusNumber; + + RtlCopyMemory (&Device->SlotNumber, + &SlotNumber, + sizeof(PCI_SLOT_NUMBER)); + + RtlCopyMemory (&Device->PciConfig, + &PciConfig, + sizeof(PCI_COMMON_CONFIG)); + + ExInterlockedInsertTailList( + &DeviceExtension->DeviceListHead, + &Device->ListEntry, + &DeviceExtension->DeviceListLock); } + + /* Don't remove this device */ + Device->RemovePending = FALSE; + + DeviceExtension->DeviceListCount++; } - - DPRINT("Bus %1lu Device %2lu Func %1lu VenID 0x%04hx DevID 0x%04hx\n", - DeviceExtension->BusNumber, - DeviceNumber, - FunctionNumber, - PciConfig.VendorID, - PciConfig.DeviceID); - - Status = FdoLocateChildDevice(&Device, DeviceExtension, SlotNumber, &PciConfig); - if (!NT_SUCCESS(Status)) - { - Device = (PPCI_DEVICE)ExAllocatePool(PagedPool, sizeof(PCI_DEVICE)); - if (!Device) - { - /* FIXME: Cleanup resources for already discovered devices */ - return STATUS_INSUFFICIENT_RESOURCES; - } - - RtlZeroMemory (Device, - sizeof(PCI_DEVICE)); - - RtlCopyMemory (&Device->SlotNumber, - &SlotNumber, - sizeof(PCI_SLOT_NUMBER)); - - RtlCopyMemory (&Device->PciConfig, - &PciConfig, - sizeof(PCI_COMMON_CONFIG)); - - ExInterlockedInsertTailList( - &DeviceExtension->DeviceListHead, - &Device->ListEntry, - &DeviceExtension->DeviceListLock); - } - - /* Don't remove this device */ - Device->RemovePending = FALSE; - - DeviceExtension->DeviceListCount++; } } @@ -239,6 +245,10 @@ FdoQueryBusRelations( PdoDeviceExtension->Common.DevicePowerState = PowerDeviceD0; + PdoDeviceExtension->Fdo = DeviceObject; + + PdoDeviceExtension->BusNumber = Device->BusNumber; + /* FIXME: Get device properties (Hardware IDs, etc.) */ swprintf( @@ -310,10 +320,6 @@ FdoStartDevice( InitializeListHead(&DeviceExtension->DeviceListHead); KeInitializeSpinLock(&DeviceExtension->DeviceListLock); DeviceExtension->DeviceListCount = 0; - - /* FIXME: Find a way to get this information */ - DeviceExtension->BusNumber = 0; - DeviceExtension->State = dsStarted; //Irp->IoStatus.Information = 0; diff --git a/reactos/drivers/bus/pci/pci.h b/reactos/drivers/bus/pci/pci.h index c447a042300..0cab2f81df9 100644 --- a/reactos/drivers/bus/pci/pci.h +++ b/reactos/drivers/bus/pci/pci.h @@ -1,4 +1,4 @@ -/* $Id: pci.h,v 1.4 2003/12/12 21:54:42 ekohl Exp $ */ +/* $Id: pci.h,v 1.5 2004/03/12 19:40:05 navaraf Exp $ */ #ifndef __PCI_H #define __PCI_H @@ -17,7 +17,9 @@ typedef struct _PCI_DEVICE LIST_ENTRY ListEntry; // Physical Device Object of device PDEVICE_OBJECT Pdo; - /* PCI Slot number */ + // PCI bus number + ULONG BusNumber; + // PCI slot number PCI_SLOT_NUMBER SlotNumber; // PCI configuration data PCI_COMMON_CONFIG PciConfig; @@ -52,6 +54,10 @@ typedef struct _PDO_DEVICE_EXTENSION { // Common device data COMMON_DEVICE_EXTENSION Common; + // Functional device object + PDEVICE_OBJECT Fdo; + // PCI bus number + ULONG BusNumber; // Device ID UNICODE_STRING DeviceID; // Instance ID @@ -71,8 +77,6 @@ typedef struct _FDO_DEVICE_EXTENSION { // Common device data COMMON_DEVICE_EXTENSION Common; - // Physical Device Object - PDEVICE_OBJECT Pdo; // Current state of the driver PCI_DEVICE_STATE State; // Namespace device list @@ -82,7 +86,7 @@ typedef struct _FDO_DEVICE_EXTENSION // Lock for namespace device list KSPIN_LOCK DeviceListLock; // PCI bus number - ULONG BusNumber; +/* ULONG BusNumber;*/ // Lower device object PDEVICE_OBJECT Ldo; } __attribute((packed)) FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION; diff --git a/reactos/drivers/bus/pci/pdo.c b/reactos/drivers/bus/pci/pdo.c index bbe68e7a54e..b1e980debf5 100644 --- a/reactos/drivers/bus/pci/pdo.c +++ b/reactos/drivers/bus/pci/pdo.c @@ -1,4 +1,4 @@ -/* $Id: pdo.c,v 1.2 2003/12/12 21:54:42 ekohl Exp $ +/* $Id: pdo.c,v 1.3 2004/03/12 19:40:05 navaraf Exp $ * * PROJECT: ReactOS PCI bus driver * FILE: pdo.c @@ -16,6 +16,8 @@ #define NDEBUG #include <debug.h> +DEFINE_GUID(GUID_BUS_TYPE_PCI, 0xc8ebdfb0L, 0xb510, 0x11d0, 0x80, 0xe5, 0x00, 0xa0, 0xc9, 0x25, 0x42, 0xe3); + /*** PRIVATE *****************************************************************/ NTSTATUS @@ -75,6 +77,35 @@ PdoQueryId( } +NTSTATUS +PdoQueryBusInformation( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + PIO_STACK_LOCATION IrpSp) +{ + PPDO_DEVICE_EXTENSION DeviceExtension; + PFDO_DEVICE_EXTENSION FdoDeviceExtension; + PPNP_BUS_INFORMATION BusInformation; + + DPRINT("Called\n"); + + DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceExtension->Fdo->DeviceExtension; + BusInformation = ExAllocatePool(PagedPool, sizeof(PNP_BUS_INFORMATION)); + Irp->IoStatus.Information = (ULONG_PTR)BusInformation; + if (BusInformation != NULL) + { + BusInformation->BusTypeGuid = GUID_BUS_TYPE_PCI; + BusInformation->LegacyBusType = PCIBus; + BusInformation->BusNumber = DeviceExtension->BusNumber; + + return STATUS_INSUFFICIENT_RESOURCES; + } + + return STATUS_SUCCESS; +} + + NTSTATUS PdoSetPower( IN PDEVICE_OBJECT DeviceObject, @@ -139,10 +170,13 @@ PdoPnpControl( case IRP_MN_EJECT: break; +#endif case IRP_MN_QUERY_BUS_INFORMATION: + Status = PdoQueryBusInformation(DeviceObject, Irp, IrpSp); break; +#if 0 case IRP_MN_QUERY_CAPABILITIES: break; From 0e8946cb444feb2d2356dcec16d64cd87c26af25 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 12 Mar 2004 19:40:29 +0000 Subject: [PATCH 0451/1463] - Implemented IoGetDriverObjectExtension and IoAllocateDriverObjectExtension. - Fixed the parts of IoGetDeviceProperty that were incorrectly sending IRP_MN_QUERY_BUS_INFORMATION. svn path=/trunk/; revision=8663 --- reactos/ntoskrnl/io/driver.c | 78 ++++++++++++++++++++++++++++++++++- reactos/ntoskrnl/io/pnpmgr.c | 74 +++++++++++++++++++-------------- reactos/ntoskrnl/ntoskrnl.def | 4 +- reactos/ntoskrnl/ntoskrnl.edf | 4 +- 4 files changed, 126 insertions(+), 34 deletions(-) diff --git a/reactos/ntoskrnl/io/driver.c b/reactos/ntoskrnl/io/driver.c index c9d63766a7e..6b5bb165f8a 100644 --- a/reactos/ntoskrnl/io/driver.c +++ b/reactos/ntoskrnl/io/driver.c @@ -1,4 +1,4 @@ -/* $Id: driver.c,v 1.34 2004/01/10 14:24:30 hbirr Exp $ +/* $Id: driver.c,v 1.35 2004/03/12 19:40:29 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1237,4 +1237,80 @@ IopReinitializeDrivers(VOID) } } +typedef struct _PRIVATE_DRIVER_EXTENSIONS { + struct _PRIVATE_DRIVER_EXTENSIONS *Link; + PVOID ClientIdentificationAddress; + CHAR Extension[1]; +} PRIVATE_DRIVER_EXTENSIONS, *PPRIVATE_DRIVER_EXTENSIONS; + +NTSTATUS STDCALL +IoAllocateDriverObjectExtension( + PDRIVER_OBJECT DriverObject, + PVOID ClientIdentificationAddress, + ULONG DriverObjectExtensionSize, + PVOID *DriverObjectExtension) +{ + KIRQL OldIrql; + PPRIVATE_DRIVER_EXTENSIONS DriverExtensions; + PPRIVATE_DRIVER_EXTENSIONS NewDriverExtension; + + NewDriverExtension = ExAllocatePoolWithTag( + NonPagedPool, + sizeof(PRIVATE_DRIVER_EXTENSIONS) - sizeof(CHAR) + + DriverObjectExtensionSize, + TAG_DRIVER_EXTENSION); + + if (NewDriverExtension == NULL) + { + return STATUS_INSUFFICIENT_RESOURCES; + } + + OldIrql = KeRaiseIrqlToDpcLevel(); + + NewDriverExtension->Link = DriverObject->DriverSection; + NewDriverExtension->ClientIdentificationAddress = ClientIdentificationAddress; + + for (DriverExtensions = DriverObject->DriverSection; + DriverExtensions != NULL; + DriverExtensions = DriverExtensions->Link) + { + if (DriverExtensions->ClientIdentificationAddress == + ClientIdentificationAddress) + return STATUS_OBJECT_NAME_COLLISION; + } + + DriverObject->DriverSection = NewDriverExtension; + + KfLowerIrql(OldIrql); + + *DriverObjectExtension = &NewDriverExtension->Extension; + + return STATUS_SUCCESS; +} + +PVOID STDCALL +IoGetDriverObjectExtension( + PDRIVER_OBJECT DriverObject, + PVOID ClientIdentificationAddress) +{ + KIRQL OldIrql; + PPRIVATE_DRIVER_EXTENSIONS DriverExtensions; + + OldIrql = KeRaiseIrqlToDpcLevel(); + + for (DriverExtensions = DriverObject->DriverSection; + DriverExtensions != NULL && + DriverExtensions->ClientIdentificationAddress != + ClientIdentificationAddress; + DriverExtensions = DriverExtensions->Link) + ; + + KfLowerIrql(OldIrql); + + if (DriverExtensions == NULL) + return NULL; + + return &DriverExtensions->Extension; +} + /* EOF */ diff --git a/reactos/ntoskrnl/io/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr.c index 6247e386eac..acb0e479e64 100644 --- a/reactos/ntoskrnl/io/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr.c @@ -1,4 +1,4 @@ -/* $Id: pnpmgr.c,v 1.22 2003/10/16 14:49:05 ekohl Exp $ +/* $Id: pnpmgr.c,v 1.23 2004/03/12 19:40:29 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -62,17 +62,16 @@ IoInvalidateDeviceRelations( { } -NTSTATUS +PPNP_BUS_INFORMATION FASTCALL IopQueryBusInformation( - PDEVICE_OBJECT DeviceObject, - PPNP_BUS_INFORMATION BusInformation) + PDEVICE_OBJECT DeviceObject) { IO_STATUS_BLOCK IoStatusBlock; IO_STACK_LOCATION Stack; - IoStatusBlock.Information = (ULONG)BusInformation; - return IopInitiatePnpIrp(DeviceObject, &IoStatusBlock, - IRP_MN_QUERY_BUS_INFORMATION, &Stack); + return NT_SUCCESS(IopInitiatePnpIrp(DeviceObject, &IoStatusBlock, + IRP_MN_QUERY_BUS_INFORMATION, &Stack)) ? + (PPNP_BUS_INFORMATION)IoStatusBlock.Information : NULL; } /* @@ -87,8 +86,7 @@ IoGetDeviceProperty( OUT PVOID PropertyBuffer, OUT PULONG ResultLength) { - PNP_BUS_INFORMATION BusInformation; - NTSTATUS Status; + PPNP_BUS_INFORMATION BusInformation; DPRINT("IoGetDeviceProperty called"); @@ -104,43 +102,57 @@ IoGetDeviceProperty( *ResultLength = sizeof(ULONG); if (BufferLength < sizeof(ULONG)) return STATUS_BUFFER_TOO_SMALL; - Status = IopQueryBusInformation(DeviceObject, &BusInformation); - if (NT_SUCCESS(Status)) - *((ULONG *)PropertyBuffer) = BusInformation.BusNumber; - return Status; + BusInformation = IopQueryBusInformation(DeviceObject); + if (BusInformation != NULL) + { + *((ULONG *)PropertyBuffer) = BusInformation->BusNumber; + ExFreePool(BusInformation); + return STATUS_UNSUCCESSFUL; + } + return STATUS_SUCCESS; /* Complete, untested */ case DevicePropertyBusTypeGuid: *ResultLength = 39 * sizeof(WCHAR); if (BufferLength < (39 * sizeof(WCHAR))) return STATUS_BUFFER_TOO_SMALL; - Status = IopQueryBusInformation(DeviceObject, &BusInformation); - if (NT_SUCCESS(Status)) + BusInformation = IopQueryBusInformation(DeviceObject); + if (BusInformation != NULL) + { swprintf((PWSTR)PropertyBuffer, L"{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", - BusInformation.BusTypeGuid.Data1, - BusInformation.BusTypeGuid.Data2, - BusInformation.BusTypeGuid.Data3, - BusInformation.BusTypeGuid.Data4[0], - BusInformation.BusTypeGuid.Data4[1], - BusInformation.BusTypeGuid.Data4[2], - BusInformation.BusTypeGuid.Data4[3], - BusInformation.BusTypeGuid.Data4[4], - BusInformation.BusTypeGuid.Data4[5], - BusInformation.BusTypeGuid.Data4[6], - BusInformation.BusTypeGuid.Data4[7]); - return Status; + BusInformation->BusTypeGuid.Data1, + BusInformation->BusTypeGuid.Data2, + BusInformation->BusTypeGuid.Data3, + BusInformation->BusTypeGuid.Data4[0], + BusInformation->BusTypeGuid.Data4[1], + BusInformation->BusTypeGuid.Data4[2], + BusInformation->BusTypeGuid.Data4[3], + BusInformation->BusTypeGuid.Data4[4], + BusInformation->BusTypeGuid.Data4[5], + BusInformation->BusTypeGuid.Data4[6], + BusInformation->BusTypeGuid.Data4[7]); + ExFreePool(BusInformation); + return STATUS_UNSUCCESSFUL; + } + return STATUS_SUCCESS; /* Complete, untested */ case DevicePropertyLegacyBusType: *ResultLength = sizeof(INTERFACE_TYPE); if (BufferLength < sizeof(INTERFACE_TYPE)) return STATUS_BUFFER_TOO_SMALL; - Status = IopQueryBusInformation(DeviceObject, &BusInformation); - if (NT_SUCCESS(Status)) - memcpy(PropertyBuffer, &BusInformation.LegacyBusType, + BusInformation = IopQueryBusInformation(DeviceObject); + if (BusInformation != NULL) + { + RtlCopyMemory( + PropertyBuffer, + &BusInformation->LegacyBusType, sizeof(INTERFACE_TYPE)); - return Status; + ExFreePool(BusInformation); + return STATUS_UNSUCCESSFUL; + } + return STATUS_SUCCESS; case DevicePropertyAddress: case DevicePropertyBootConfiguration: diff --git a/reactos/ntoskrnl/ntoskrnl.def b/reactos/ntoskrnl/ntoskrnl.def index 55ad8d0c3d7..b60d0ce19db 100644 --- a/reactos/ntoskrnl/ntoskrnl.def +++ b/reactos/ntoskrnl/ntoskrnl.def @@ -1,4 +1,4 @@ -; $Id: ntoskrnl.def,v 1.178 2004/03/08 08:05:27 navaraf Exp $ +; $Id: ntoskrnl.def,v 1.179 2004/03/12 19:40:29 navaraf Exp $ ; ; reactos/ntoskrnl/ntoskrnl.def ; @@ -238,6 +238,7 @@ IoAcquireVpbSpinLock@4 IoAdapterObjectType DATA IoAllocateAdapterChannel@20 IoAllocateController@16 +IoAllocateDriverObjectExtension@16 IoAllocateErrorLogEntry@8 IoAllocateIrp@8 IoAllocateMdl@20 @@ -287,6 +288,7 @@ IoGetAttachedDeviceReference@4 IoGetBaseFileSystemDeviceObject@4 IoGetConfigurationInformation@0 IoGetCurrentProcess@0 +IoGetDriverObjectExtension@8 IoGetDeviceObjectPointer@16 IoGetDeviceProperty@20 IoGetDeviceToVerify@4 diff --git a/reactos/ntoskrnl/ntoskrnl.edf b/reactos/ntoskrnl/ntoskrnl.edf index 689c7077100..9c51469ee20 100644 --- a/reactos/ntoskrnl/ntoskrnl.edf +++ b/reactos/ntoskrnl/ntoskrnl.edf @@ -1,4 +1,4 @@ -; $Id: ntoskrnl.edf,v 1.164 2004/03/08 08:05:27 navaraf Exp $ +; $Id: ntoskrnl.edf,v 1.165 2004/03/12 19:40:29 navaraf Exp $ ; ; reactos/ntoskrnl/ntoskrnl.def ; @@ -239,6 +239,7 @@ IoAllocateAdapterChannel=IoAllocateAdapterChannel@20 IoAllocateIrp=IoAllocateIrp@8 IoAllocateMdl=IoAllocateMdl@20 IoAllocateController=IoAllocateController@16 +IoAllocateDriverObjectExtension=IoAllocateDriverObjectExtension@16 IoAllocateErrorLogEntry=IoAllocateErrorLogEntry@8 IoAllocateWorkItem=IoAllocateWorkItem@4 IoAssignResources=IoAssignResources@24 @@ -287,6 +288,7 @@ IoGetBaseFileSystemDeviceObject=IoGetBaseFileSystemDeviceObject@4 IoGetConfigurationInformation=IoGetConfigurationInformation@0 IoGetCurrentProcess=IoGetCurrentProcess@0 IoGetDeviceObjectPointer=IoGetDeviceObjectPointer@16 +IoGetDriverObjectExtension=IoGetDriverObjectExtension@8 IoGetDeviceProperty=IoGetDeviceProperty@20 IoGetDeviceToVerify=IoGetDeviceToVerify@4 IoGetDmaAdapter=IoGetDmaAdapter@12 From 7f1a2fa09fa6170a831dd4fb82315c794f4555f7 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 12 Mar 2004 19:40:40 +0000 Subject: [PATCH 0452/1463] - Fixed declaration of DRIVER_OBJECT and friends. svn path=/trunk/; revision=8664 --- reactos/drivers/input/sermouse/sermouse.c | 10 +- reactos/w32api/include/ddk/winddk.h | 142 ++++++++++++---------- 2 files changed, 85 insertions(+), 67 deletions(-) diff --git a/reactos/drivers/input/sermouse/sermouse.c b/reactos/drivers/input/sermouse/sermouse.c index b67fa14b8d2..c4be585acaa 100644 --- a/reactos/drivers/input/sermouse/sermouse.c +++ b/reactos/drivers/input/sermouse/sermouse.c @@ -247,7 +247,7 @@ MouseSynchronizeRoutine(PVOID Context) return TRUE; } -VOID STDCALL +NTSTATUS STDCALL SerialMouseStartIo(PDEVICE_OBJECT DeviceObject, PIRP Irp) { PDEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension; @@ -270,6 +270,8 @@ SerialMouseStartIo(PDEVICE_OBJECT DeviceObject, PIRP Irp) IoStartNextPacket (DeviceObject, FALSE); } } + + return STATUS_SUCCESS; } NTSTATUS STDCALL @@ -652,9 +654,9 @@ DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) return STATUS_UNSUCCESSFUL; } - DriverObject->MajorFunction[IRP_MJ_CREATE] = (PDRIVER_DISPATCH)SerialMouseDispatch; - DriverObject->MajorFunction[IRP_MJ_CLOSE] = (PDRIVER_DISPATCH)SerialMouseDispatch; - DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = (PDRIVER_DISPATCH)SerialMouseInternalDeviceControl; + DriverObject->MajorFunction[IRP_MJ_CREATE] = SerialMouseDispatch; + DriverObject->MajorFunction[IRP_MJ_CLOSE] = SerialMouseDispatch; + DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = SerialMouseInternalDeviceControl; DriverObject->DriverStartIo = SerialMouseStartIo; return STATUS_SUCCESS; diff --git a/reactos/w32api/include/ddk/winddk.h b/reactos/w32api/include/ddk/winddk.h index bda8b5318d9..2625c8127d1 100644 --- a/reactos/w32api/include/ddk/winddk.h +++ b/reactos/w32api/include/ddk/winddk.h @@ -428,100 +428,100 @@ typedef enum _IO_ALLOCATION_ACTION { DeallocateObjectKeepRegisters } IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION; -typedef IO_ALLOCATION_ACTION DDKAPI -(*PDRIVER_CONTROL)( +typedef IO_ALLOCATION_ACTION +(DDKAPI *PDRIVER_CONTROL)( IN struct _DEVICE_OBJECT *DeviceObject, IN struct _IRP *Irp, IN PVOID MapRegisterBase, IN PVOID Context); -typedef VOID DDKAPI -(*PDRIVER_LIST_CONTROL)( +typedef VOID +(DDKAPI *PDRIVER_LIST_CONTROL)( IN struct _DEVICE_OBJECT *DeviceObject, IN struct _IRP *Irp, IN struct _SCATTER_GATHER_LIST *ScatterGather, IN PVOID Context); -typedef NTSTATUS DDKAPI -(*PDRIVER_ADD_DEVICE)( +typedef NTSTATUS +(DDKAPI *PDRIVER_ADD_DEVICE)( IN struct _DRIVER_OBJECT *DriverObject, IN struct _DEVICE_OBJECT *PhysicalDeviceObject); -typedef NTSTATUS DDKAPI -(*PIO_COMPLETION_ROUTINE)( +typedef NTSTATUS +(DDKAPI *PIO_COMPLETION_ROUTINE)( IN struct _DEVICE_OBJECT *DeviceObject, IN struct _IRP *Irp, IN PVOID Context); -typedef VOID DDKAPI -(*PDRIVER_CANCEL)( +typedef VOID +(DDKAPI *PDRIVER_CANCEL)( IN struct _DEVICE_OBJECT *DeviceObject, IN struct _IRP *Irp); -typedef VOID DDKAPI -(*PKDEFERRED_ROUTINE)( +typedef VOID +(DDKAPI *PKDEFERRED_ROUTINE)( IN struct _KDPC *Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2); -typedef NTSTATUS DDKAPI -(*PDRIVER_DISPATCH)( +typedef NTSTATUS +(DDKAPI *PDRIVER_DISPATCH)( IN struct _DEVICE_OBJECT *DeviceObject, IN struct _IRP *Irp); -typedef VOID DDKAPI -(*PIO_DPC_ROUTINE)( +typedef VOID +(DDKAPI *PIO_DPC_ROUTINE)( IN struct _KDPC *Dpc, IN struct _DEVICE_OBJECT *DeviceObject, IN struct _IRP *Irp, IN PVOID Context); -typedef NTSTATUS DDKAPI -(*PMM_DLL_INITIALIZE)( +typedef NTSTATUS +(DDKAPI *PMM_DLL_INITIALIZE)( IN PUNICODE_STRING RegistryPath); -typedef NTSTATUS DDKAPI -(*PMM_DLL_UNLOAD)( +typedef NTSTATUS +(DDKAPI *PMM_DLL_UNLOAD)( VOID); -typedef NTSTATUS DDKAPI -(*PDRIVER_ENTRY)( +typedef NTSTATUS +(DDKAPI *PDRIVER_ENTRY)( IN struct _DRIVER_OBJECT *DriverObject, IN PUNICODE_STRING RegistryPath); -typedef NTSTATUS DDKAPI -(*PDRIVER_INITIALIZE)( +typedef NTSTATUS +(DDKAPI *PDRIVER_INITIALIZE)( IN struct _DRIVER_OBJECT *DriverObject, IN PUNICODE_STRING RegistryPath); -typedef BOOLEAN DDKAPI -(*PKSERVICE_ROUTINE)( +typedef BOOLEAN +(DDKAPI *PKSERVICE_ROUTINE)( IN struct _KINTERRUPT *Interrupt, IN PVOID ServiceContext); -typedef VOID DDKAPI -(*PIO_TIMER_ROUTINE)( +typedef VOID +(DDKAPI *PIO_TIMER_ROUTINE)( IN struct _DEVICE_OBJECT *DeviceObject, IN PVOID Context); -typedef VOID DDKAPI -(*PDRIVER_REINITIALIZE)( +typedef VOID +(DDKAPI *PDRIVER_REINITIALIZE)( IN struct _DRIVER_OBJECT *DriverObject, IN PVOID Context, IN ULONG Count); -typedef NTSTATUS DDKAPI -(*PDRIVER_STARTIO)( +typedef NTSTATUS +(DDKAPI *PDRIVER_STARTIO)( IN struct _DEVICE_OBJECT *DeviceObject, IN struct _IRP *Irp); -typedef BOOLEAN DDKAPI -(*PKSYNCHRONIZE_ROUTINE)( +typedef BOOLEAN +(DDKAPI *PKSYNCHRONIZE_ROUTINE)( IN PVOID SynchronizeContext); -typedef VOID DDKAPI -(*PDRIVER_UNLOAD)( +typedef VOID +(DDKAPI *PDRIVER_UNLOAD)( IN struct _DRIVER_OBJECT *DriverObject); @@ -2331,7 +2331,6 @@ typedef struct _FAST_IO_DISPATCH { PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush; } FAST_IO_DISPATCH, *PFAST_IO_DISPATCH; -/* NOTE: PVOID for methods to avoid 'assignment from incompatible pointer type' warning */ typedef struct _DRIVER_OBJECT { CSHORT Type; CSHORT Size; @@ -2343,11 +2342,11 @@ typedef struct _DRIVER_OBJECT { PDRIVER_EXTENSION DriverExtension; UNICODE_STRING DriverName; PUNICODE_STRING HardwareDatabase; - PVOID FastIoDispatch; - PVOID DriverInit; - PVOID DriverStartIo; - PVOID DriverUnload; - PVOID MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1]; + PFAST_IO_DISPATCH FastIoDispatch; + PDRIVER_INITIALIZE DriverInit; + PDRIVER_STARTIO DriverStartIo; + PDRIVER_UNLOAD DriverUnload; + PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1]; } DRIVER_OBJECT; typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT; @@ -3703,6 +3702,7 @@ typedef ULONG PFN_NUMBER, *PPFN_NUMBER; #define LOW_LEVEL 0 #define APC_LEVEL 1 #define DISPATCH_LEVEL 2 +#define SYNCH_LEVEL 27 #define PROFILE_LEVEL 27 #define CLOCK1_LEVEL 28 #define CLOCK2_LEVEL 28 @@ -5790,8 +5790,6 @@ WRITE_REGISTER_USHORT( IN PUSHORT Register, IN USHORT Value); - - /** I/O manager routines **/ NTOSAPI @@ -7317,12 +7315,6 @@ DDKAPI KeLeaveCriticalRegion( VOID); -NTOSAPI -VOID -DDKAPI -KeLowerIrql( - IN KIRQL NewIrql); - NTOSAPI NTSTATUS DDKAPI @@ -7367,19 +7359,6 @@ DDKAPI KeQueryTimeIncrement( VOID); -NTOSAPI -VOID -DDKAPI -KeRaiseIrql( - IN KIRQL NewIrql, - OUT PKIRQL OldIrql); - -NTOSAPI -KIRQL -DDKAPI -KeRaiseIrqlToDpcLevel( - VOID); - NTOSAPI LONG DDKAPI @@ -7606,7 +7585,44 @@ KeWaitForSingleObject( IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL); +#if defined(_X86_) +NTOSAPI +VOID +FASTCALL +KfLowerIrql( + IN KIRQL NewIrql); + +NTOSAPI +KIRQL +FASTCALL +KfRaiseIrql( + IN KIRQL NewIrql); + +#define KeLowerIrql(a) KfLowerIrql(a) +#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) + +#else + +NTOSAPI +VOID +DDKAPI +KeLowerIrql( + IN KIRQL NewIrql); + +NTOSAPI +KIRQL +DDKAPI +KeRaiseIrql( + IN KIRQL NewIrql); + +#endif + +NTOSAPI +KIRQL +DDKAPI +KeRaiseIrqlToDpcLevel( + VOID); /** Memory manager routines **/ From a990283857396a479b21f37921831bdf937b57cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Fri, 12 Mar 2004 20:30:44 +0000 Subject: [PATCH 0453/1463] Merge back commit from WineHQ svn path=/trunk/; revision=8665 --- reactos/lib/comctl32/toolbar.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/lib/comctl32/toolbar.c b/reactos/lib/comctl32/toolbar.c index b695be60f59..45b8d2ca0ef 100644 --- a/reactos/lib/comctl32/toolbar.c +++ b/reactos/lib/comctl32/toolbar.c @@ -2298,10 +2298,10 @@ TOOLBAR_AddBitmap (HWND hwnd, WPARAM wParam, LPARAM lParam) /* create new default image list */ TRACE ("creating default image list!\n"); - himlDef = ImageList_Create (infoPtr->nBitmapWidth, infoPtr->nBitmapHeight, - ILC_COLORDDB | ILC_MASK, nButtons, 2); + himlDef = ImageList_Create (infoPtr->nBitmapWidth, infoPtr->nBitmapHeight, + ILC_COLORDDB | ILC_MASK, nButtons, 2); TOOLBAR_InsertImageList(&infoPtr->himlDef, &infoPtr->cimlDef, himlDef, 0); - infoPtr->himlInt = himlDef; + infoPtr->himlInt = himlDef; } else { himlDef = GETDEFIMAGELIST(infoPtr, 0); From a526783523d54aca2cf2de997f7b55ad5a9e52f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Fri, 12 Mar 2004 21:04:04 +0000 Subject: [PATCH 0454/1463] Sync to Wine-20040309: Alexandre Julliard: - Added version scripts for libwine and libwine_unicode. Rein Klazes <rklazes@xs4all.nl> - Fix MultiByteToWideChar and WideCharToMultiByte when called with code page CP_SYMBOL. - Remove the symbol font from the code page table, so it is not reported as a valid/supported/installed code page. - Remove workarounds for the badly behaved MultiByteToWideChar and co. in a few places. svn path=/trunk/; revision=8666 --- reactos/lib/unicode/Makefile.in | 2 +- reactos/lib/unicode/c_042.c | 749 --------------------------- reactos/lib/unicode/cpmap.pl | 32 +- reactos/lib/unicode/cptable.c | 4 +- reactos/lib/unicode/mbtowc.c | 19 + reactos/lib/unicode/wctomb.c | 21 + reactos/lib/unicode/wine_unicode.def | 2 + 7 files changed, 45 insertions(+), 784 deletions(-) delete mode 100644 reactos/lib/unicode/c_042.c diff --git a/reactos/lib/unicode/Makefile.in b/reactos/lib/unicode/Makefile.in index 087a453ffd4..3013d5efad8 100644 --- a/reactos/lib/unicode/Makefile.in +++ b/reactos/lib/unicode/Makefile.in @@ -4,11 +4,11 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ LIBRARY = wine_unicode SOVERSION = 1 +VERSCRIPT = $(SRCDIR)/wine_unicode.map EXTRADEFS = -D__WINESRC__ -DNO_LIBWINE_PORT -DWINE_UNICODE_API="" CODEPAGES = \ 037 \ - 042 \ 424 \ 437 \ 500 \ diff --git a/reactos/lib/unicode/c_042.c b/reactos/lib/unicode/c_042.c deleted file mode 100644 index a05d3207718..00000000000 --- a/reactos/lib/unicode/c_042.c +++ /dev/null @@ -1,749 +0,0 @@ -/* code page 042 (Symbol) */ -/* generated from ftp.unicode.org/Public/MAPPINGS/VENDORS/ADOBE/symbol.txt */ -/* DO NOT EDIT!! */ - -#include "wine/unicode.h" - -static const WCHAR cp2uni[256] = -{ - 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, - 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, - 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, - 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, - 0x0020, 0x0021, 0x2200, 0x0023, 0x2203, 0x0025, 0x0026, 0x220b, - 0x0028, 0x0029, 0x2217, 0x002b, 0x002c, 0x2212, 0x002e, 0x002f, - 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, - 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, - 0x2245, 0x0391, 0x0392, 0x03a7, 0x0394, 0x0395, 0x03a6, 0x0393, - 0x0397, 0x0399, 0x03d1, 0x039a, 0x039b, 0x039c, 0x039d, 0x039f, - 0x03a0, 0x0398, 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03c2, 0x03a9, - 0x039e, 0x03a8, 0x0396, 0x005b, 0x2234, 0x005d, 0x22a5, 0x005f, - 0xf8e5, 0x03b1, 0x03b2, 0x03c7, 0x03b4, 0x03b5, 0x03c6, 0x03b3, - 0x03b7, 0x03b9, 0x03d5, 0x03ba, 0x03bb, 0x00b5, 0x03bd, 0x03bf, - 0x03c0, 0x03b8, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03d6, 0x03c9, - 0x03be, 0x03c8, 0x03b6, 0x007b, 0x007c, 0x007d, 0x223c, 0x007f, - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x20ac, 0x03d2, 0x2032, 0x2264, 0x2044, 0x221e, 0x0192, 0x2663, - 0x2666, 0x2665, 0x2660, 0x2194, 0x2190, 0x2191, 0x2192, 0x2193, - 0x00b0, 0x00b1, 0x2033, 0x2265, 0x00d7, 0x221d, 0x2202, 0x2022, - 0x00f7, 0x2260, 0x2261, 0x2248, 0x2026, 0xf8e6, 0xf8e7, 0x21b5, - 0x2135, 0x2111, 0x211c, 0x2118, 0x2297, 0x2295, 0x2205, 0x2229, - 0x222a, 0x2283, 0x2287, 0x2284, 0x2282, 0x2286, 0x2208, 0x2209, - 0x2220, 0x2207, 0xf6da, 0xf6d9, 0xf6db, 0x220f, 0x221a, 0x22c5, - 0x00ac, 0x2227, 0x2228, 0x21d4, 0x21d0, 0x21d1, 0x21d2, 0x21d3, - 0x25ca, 0x2329, 0xf8e8, 0xf8e9, 0xf8ea, 0x2211, 0xf8eb, 0xf8ec, - 0xf8ed, 0xf8ee, 0xf8ef, 0xf8f0, 0xf8f1, 0xf8f2, 0xf8f3, 0xf8f4, - 0x00f0, 0x232a, 0x222b, 0x2320, 0xf8f5, 0x2321, 0xf8f6, 0xf8f7, - 0xf8f8, 0xf8f9, 0xf8fa, 0xf8fb, 0xf8fc, 0xf8fd, 0xf8fe, 0x00ff -}; - -static const unsigned char uni2cp_low[5120] = -{ - /* 0x0000 .. 0x00ff */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, - 0x20, 0x21, 0x3f, 0x23, 0x3f, 0x25, 0x26, 0x3f, - 0x28, 0x29, 0x3f, 0x2b, 0x2c, 0x3f, 0x2e, 0x2f, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x5b, 0x3f, 0x5d, 0x3f, 0x5f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x7b, 0x7c, 0x7d, 0x3f, 0x7f, - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, - 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, - 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, - 0x20, 0x21, 0x3f, 0x3f, 0x3f, 0x3f, 0x7c, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3c, 0xd8, 0x3f, 0x3f, 0x3f, - 0xb0, 0xb1, 0x32, 0x33, 0xa2, 0x6d, 0x3f, 0x3f, - 0x2c, 0x31, 0x3f, 0x3e, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0xb4, - 0xc6, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x62, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0xf0, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0xb8, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0xff, - /* 0x0100 .. 0x01ff */ - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0xa6, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x7c, 0x3f, 0x3f, 0x21, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0xc6, 0x3f, - /* 0x0200 .. 0x02ff */ - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0xa2, 0xb2, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0xa2, 0x3f, 0x3f, 0x5f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0xb0, 0x3f, 0x3f, 0xb2, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - /* 0x0300 .. 0x03ff */ - 0x3f, 0xa2, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0xb0, 0xb2, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x2c, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x5f, 0x5f, 0x5f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0xa2, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0xa2, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3b, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0xa2, 0x3f, 0x41, 0x3f, - 0x45, 0x48, 0x49, 0x3f, 0x4f, 0x3f, 0x55, 0x57, - 0x69, 0x41, 0x42, 0x47, 0x44, 0x45, 0x5a, 0x48, - 0x51, 0x49, 0x4b, 0x4c, 0x4d, 0x4e, 0x58, 0x4f, - 0x50, 0x52, 0x3f, 0x53, 0x54, 0x55, 0x46, 0x43, - 0x59, 0x57, 0x49, 0x55, 0x61, 0x65, 0x68, 0x69, - 0x75, 0x61, 0x62, 0x67, 0x64, 0x65, 0x7a, 0x68, - 0x71, 0x69, 0x6b, 0x6c, 0x6d, 0x6e, 0x78, 0x6f, - 0x70, 0x72, 0x56, 0x73, 0x74, 0x75, 0x66, 0x63, - 0x79, 0x77, 0x69, 0x75, 0x6f, 0x75, 0x77, 0x3f, - 0x62, 0x4a, 0xa1, 0xa1, 0xa1, 0x6a, 0x76, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x6b, 0x72, 0x56, 0x3f, 0x51, 0x65, 0x3f, 0x3f, - 0x3f, 0x53, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - /* 0x1d00 .. 0x1dff */ - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x62, 0x67, 0x64, - 0x66, 0x63, 0x3f, 0x3f, 0x3f, 0x3f, 0x62, 0x67, - 0x72, 0x66, 0x63, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - /* 0x1f00 .. 0x1fff */ - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x3f, 0x3f, - 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x3f, 0x3f, - 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, - 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, - 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, - 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, - 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x3f, 0x3f, - 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x3f, 0x3f, - 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, - 0x3f, 0x55, 0x3f, 0x55, 0x3f, 0x55, 0x3f, 0x55, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x61, 0x61, 0x65, 0x65, 0x68, 0x68, 0x69, 0x69, - 0x6f, 0x6f, 0x75, 0x75, 0x77, 0x77, 0x3f, 0x3f, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, - 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x3f, 0x61, 0x61, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x3f, 0x69, 0x3f, - 0x3f, 0x3f, 0x68, 0x68, 0x68, 0x3f, 0x68, 0x68, - 0x45, 0x45, 0x48, 0x48, 0x48, 0x3f, 0x3f, 0x3f, - 0x69, 0x69, 0x69, 0x69, 0x3f, 0x3f, 0x69, 0x69, - 0x49, 0x49, 0x49, 0x49, 0x3f, 0x3f, 0x3f, 0x3f, - 0x75, 0x75, 0x75, 0x75, 0x72, 0x72, 0x75, 0x75, - 0x55, 0x55, 0x55, 0x55, 0x52, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x77, 0x77, 0x77, 0x3f, 0x77, 0x77, - 0x4f, 0x4f, 0x57, 0x57, 0x57, 0xa2, 0x3f, 0x3f, - /* 0x2000 .. 0x20ff */ - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x2d, 0x2d, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x5f, - 0x3f, 0x3f, 0x2c, 0x3f, 0x3f, 0x3f, 0x2c, 0x3f, - 0x3f, 0x3f, 0xb7, 0x3f, 0x2e, 0x3f, 0xbc, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x20, - 0x3f, 0x3f, 0xa2, 0xb2, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3c, 0x3e, 0x3f, 0x21, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0xa4, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x20, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0xb0, 0x3f, 0x3f, 0x3f, 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x2b, 0x2d, 0x3d, 0x28, 0x29, 0x3f, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x2b, 0x2d, 0x3d, 0x28, 0x29, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0xa0, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - /* 0x2100 .. 0x21ff */ - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0xc1, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0xc3, 0x3f, 0x3f, 0x3f, 0xc2, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x57, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0xc0, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x67, 0x47, 0x50, - 0xe5, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0xac, 0xad, 0xae, 0xaf, 0xab, 0x7c, 0x3f, 0x3f, - 0x3f, 0x3f, 0xac, 0xae, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0xab, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0xbf, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0xdc, 0xdb, 0xde, - 0xdc, 0xdd, 0xde, 0xdf, 0xdb, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - /* 0x2200 .. 0x22ff */ - 0x22, 0x3f, 0xb6, 0x24, 0x24, 0xc6, 0x44, 0xd1, - 0xce, 0xcf, 0x3f, 0x27, 0x27, 0x3f, 0x3f, 0xd5, - 0x3f, 0xe5, 0x2d, 0xb1, 0x3f, 0xa4, 0x3f, 0x2a, - 0xb0, 0xb7, 0xd6, 0x3f, 0x3f, 0xb5, 0xa5, 0x3f, - 0xd0, 0x3f, 0x3f, 0x7c, 0x7c, 0x3f, 0x3f, 0xd9, - 0xda, 0xc7, 0xc8, 0xf2, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x5c, 0x3f, 0x3a, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x7e, 0x3f, 0x3f, 0x3f, - 0x3f, 0x7e, 0x3f, 0x3f, 0x3f, 0x40, 0x3f, 0x40, - 0xbb, 0xbb, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0xb9, 0xba, 0xba, 0xba, 0xa3, 0xb3, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3c, 0x3e, 0x3f, 0x3f, 0x3c, 0x3e, - 0xa3, 0xb3, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0xcc, 0xc9, 0xcb, 0xc9, 0xcd, 0xca, - 0xcd, 0xca, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0xc5, 0x3f, 0xc4, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x5e, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0xd7, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - /* 0x2300 .. 0x23ff */ - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0xf3, 0xf5, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0xe1, 0xf1, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - /* 0x2400 .. 0x24ff */ - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, - 0x39, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x30, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - /* 0x2500 .. 0x25ff */ - 0x3f, 0x3f, 0x7c, 0x7c, 0x3f, 0x3f, 0x7c, 0x7c, - 0x3f, 0x3f, 0x7c, 0x7c, 0x2b, 0x2b, 0x2b, 0x2b, - 0xd8, 0xd8, 0xd8, 0xd8, 0x3f, 0x3f, 0x3f, 0x3f, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x3f, 0x3f, 0x7c, 0x7c, - 0x3d, 0x7c, 0x2b, 0x2b, 0x2b, 0xd8, 0xd8, 0xd8, - 0x3f, 0x3f, 0x3f, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x3f, 0x3f, 0x3f, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x3f, 0x3f, 0x3f, - 0x3f, 0x2f, 0x3f, 0x3f, 0x3f, 0x7c, 0x3f, 0x7c, - 0x3f, 0x7c, 0x3f, 0x7c, 0x3f, 0x7c, 0x3f, 0x7c, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0xe0, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - /* 0x2600 .. 0x26ff */ - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0xaa, 0x3f, 0x3f, 0xa7, 0x3f, 0xa9, 0xa8, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - /* 0x3000 .. 0x30ff */ - 0x20, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3c, 0x3e, 0x3c, 0x3e, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x5b, 0x5d, 0x3f, 0x3f, 0x3f, 0x2c, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - /* 0xf600 .. 0xf6ff */ - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0xd3, 0xd2, 0xd4, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - /* 0xf800 .. 0xf8ff */ - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x60, 0xbd, 0xbe, - 0xe2, 0xe3, 0xe4, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, - 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf4, 0xf6, 0xf7, - 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x3f, - /* 0xfb00 .. 0xfbff */ - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x2b, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - /* 0xfe00 .. 0xfeff */ - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x5f, 0x5f, 0x5f, - 0x2c, 0x3f, 0x2e, 0x3f, 0x3b, 0x3a, 0x3f, 0x21, - 0x3f, 0x28, 0x29, 0x7b, 0x7d, 0x3f, 0x3f, 0x23, - 0x26, 0x3f, 0x2b, 0x3f, 0x3c, 0x3e, 0x3d, 0x3f, - 0x3f, 0x3f, 0x25, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - /* 0xff00 .. 0xffff */ - 0x3f, 0x21, 0x3f, 0x23, 0x3f, 0x25, 0x26, 0x3f, - 0x28, 0x29, 0x3f, 0x2b, 0x2c, 0x3f, 0x2e, 0x2f, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x5b, 0x3f, 0x5d, 0x3f, 0x5f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x7b, 0x7c, 0x7d, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0xd8, 0x3f, 0x7c, 0x3f, 0x3f, 0x3f, - 0x7c, 0xac, 0xad, 0xae, 0xaf, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - /* defaults */ - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f -}; - -static const unsigned short uni2cp_high[256] = -{ - 0x0000, 0x0100, 0x0200, 0x0300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x0400, 0x1300, 0x0500, - 0x0600, 0x0700, 0x0800, 0x0900, 0x0a00, 0x0b00, 0x0c00, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x0d00, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, - 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x1300, 0x0e00, 0x1300, - 0x0f00, 0x1300, 0x1300, 0x1000, 0x1300, 0x1300, 0x1100, 0x1200 -}; - -const struct sbcs_table cptable_042 = -{ - { 42, 1, 0x003f, 0x003f, "Symbol" }, - cp2uni, - uni2cp_low, - uni2cp_high -}; diff --git a/reactos/lib/unicode/cpmap.pl b/reactos/lib/unicode/cpmap.pl index 17d26c9bfcc..71967b5ab6b 100644 --- a/reactos/lib/unicode/cpmap.pl +++ b/reactos/lib/unicode/cpmap.pl @@ -38,7 +38,6 @@ $DEF_CHAR = ord '?'; @allfiles = ( [ 37, "VENDORS/MICSFT/EBCDIC/CP037.TXT", "IBM EBCDIC US Canada" ], - [ 42, "VENDORS/ADOBE/symbol.txt", "Symbol" ], [ 424, "VENDORS/MISC/CP424.TXT", "IBM EBCDIC Hebrew" ], [ 437, "VENDORS/MICSFT/PC/CP437.TXT", "OEM United States" ], [ 500, "VENDORS/MICSFT/EBCDIC/CP500.TXT", "IBM EBCDIC International" ], @@ -396,34 +395,6 @@ sub READ_FILE } -################################################################ -# parse the symbol.txt file, since its syntax is different from the other ones -sub READ_SYMBOL_FILE -{ - my $name = shift; - open INPUT,$name or die "Cannot open $name"; - @cp2uni = (); - @lead_bytes = (); - @uni2cp = (); - - while (<INPUT>) - { - next if /^\#/; # skip comments - next if /^$/; # skip empty lines - next if /\x1a/; # skip ^Z - if (/^([0-9a-fA-F]+)\s+([0-9a-fA-F]+)\s+(\#.*)?/) - { - $uni = hex $1; - $cp = hex $2; - $cp2uni[$cp] = $uni unless defined($cp2uni[$cp]); - $uni2cp[$uni] = $cp unless defined($uni2cp[$uni]); - next; - } - die "$name: Unrecognized line $_\n"; - } -} - - ################################################################ # build EUC-JP table from the JIS 0208 file # FIXME: for proper EUC-JP we should probably read JIS 0212 too @@ -1165,8 +1136,7 @@ sub HANDLE_FILE my ($codepage,$filename,$comment) = @_; # symbol codepage file is special - if ($codepage == 42) { READ_SYMBOL_FILE($MAPPREFIX . $filename); } - elsif ($codepage == 20932) { READ_JIS0208_FILE($MAPPREFIX . $filename); } + if ($codepage == 20932) { READ_JIS0208_FILE($MAPPREFIX . $filename); } else { READ_FILE($MAPPREFIX . $filename); } # hack: 0x00a5 must map to backslash in Shift-JIS diff --git a/reactos/lib/unicode/cptable.c b/reactos/lib/unicode/cptable.c index 475898788df..cf94fafe499 100644 --- a/reactos/lib/unicode/cptable.c +++ b/reactos/lib/unicode/cptable.c @@ -25,7 +25,6 @@ /* Everything below this line is generated automatically by cpmap.pl */ /* ### cpmap begin ### */ extern union cptable cptable_037; -extern union cptable cptable_042; extern union cptable cptable_424; extern union cptable cptable_437; extern union cptable cptable_500; @@ -85,10 +84,9 @@ extern union cptable cptable_28604; extern union cptable cptable_28605; extern union cptable cptable_28606; -static const union cptable * const cptables[60] = +static const union cptable * const cptables[59] = { &cptable_037, - &cptable_042, &cptable_424, &cptable_437, &cptable_500, diff --git a/reactos/lib/unicode/mbtowc.c b/reactos/lib/unicode/mbtowc.c index 27af0902c46..dd3c9242d37 100644 --- a/reactos/lib/unicode/mbtowc.c +++ b/reactos/lib/unicode/mbtowc.c @@ -277,3 +277,22 @@ int wine_cp_mbstowcs( const union cptable *table, int flags, return mbstowcs_dbcs_decompose( &table->dbcs, src, srclen, dst, dstlen ); } } + +/* CP_SYMBOL implementation */ +/* return -1 on dst buffer overflow */ +int wine_cpsymbol_mbstowcs( const char *src, int srclen, WCHAR *dst, int dstlen) +{ + int len, i; + if( dstlen == 0) return srclen; + len = dstlen > srclen ? srclen : dstlen; + for( i = 0; i < len; i++) + { + unsigned char c = src [ i ]; + if( c < 0x20 ) + dst[i] = c; + else + dst[i] = c + 0xf000; + } + if( srclen > len) return -1; + return len; +} diff --git a/reactos/lib/unicode/wctomb.c b/reactos/lib/unicode/wctomb.c index ef09fcbb0b2..5f9874018ba 100644 --- a/reactos/lib/unicode/wctomb.c +++ b/reactos/lib/unicode/wctomb.c @@ -454,3 +454,24 @@ int wine_cp_wcstombs( const union cptable *table, int flags, return wcstombs_dbcs( &table->dbcs, src, srclen, dst, dstlen ); } } + +/* CP_SYMBOL implementation */ +/* return -1 on dst buffer overflow, -2 on invalid character */ +int wine_cpsymbol_wcstombs( const WCHAR *src, int srclen, char *dst, int dstlen) +{ + int len, i; + if( dstlen == 0) return srclen; + len = dstlen > srclen ? srclen : dstlen; + for( i = 0; i < len; i++) + { + WCHAR w = src [ i ]; + if( w < 0x20 ) + dst[i] = w; + else if( w >= 0xf020 && w < 0xf100) + dst[i] = w - 0xf000; + else + return -2; + } + if( srclen > len) return -1; + return len; +} diff --git a/reactos/lib/unicode/wine_unicode.def b/reactos/lib/unicode/wine_unicode.def index 438e31ebfc3..c60334ddaf3 100644 --- a/reactos/lib/unicode/wine_unicode.def +++ b/reactos/lib/unicode/wine_unicode.def @@ -17,6 +17,8 @@ EXPORTS wine_cp_get_table wine_cp_mbstowcs wine_cp_wcstombs + wine_cpsymbol_mbstowcs + wine_cpsymbol_wcstombs wine_fold_string wine_get_sortkey wine_utf8_mbstowcs From e40caec333a1515bc756c9fa2ee856b0af6afa6d Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Fri, 12 Mar 2004 21:12:27 +0000 Subject: [PATCH 0455/1463] adjust start button to text size svn path=/trunk/; revision=8667 --- reactos/subsys/system/explorer/Makefile | 5 +-- reactos/subsys/system/explorer/Makefile.MinGW | 5 +-- reactos/subsys/system/explorer/explorer.dsp | 36 +++++++++---------- .../system/explorer/taskbar/desktopbar.cpp | 18 +++++++--- .../system/explorer/taskbar/desktopbar.h | 1 + .../system/explorer/taskbar/taskbar.cpp | 4 ++- 6 files changed, 41 insertions(+), 28 deletions(-) diff --git a/reactos/subsys/system/explorer/Makefile b/reactos/subsys/system/explorer/Makefile index b78e87e4218..7e835f2710f 100644 --- a/reactos/subsys/system/explorer/Makefile +++ b/reactos/subsys/system/explorer/Makefile @@ -103,7 +103,8 @@ OBJECTS = \ settings.o \ i386-stub-win32.o -LIBS = gdi32 comctl32 ole32 uuid wsock32 oleaut32 +LIBS = gdi32 comctl32 ole32 uuid +DELAYIMPORTS = oleaut32 wsock32 .PHONY: all depends implib clean install dist bootcd depends @@ -128,7 +129,7 @@ buildno.h: ../../../include/reactos/buildno.h $(CD_PREFIX)updatebuildno $(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) - $(LINK) $(LFLAGS) -o $@ $^ $(addprefix -l,$(LIBS)) + $(LINK) $(LFLAGS) -o $@ $^ $(addprefix -l,$(LIBS)) $(addprefix -l,$(DELAYIMPORTS)) explorer$(RES_SUFFIX): $(PROGRAM)_intres.rc res/*.bmp res/*.ico $(RC) $(RCFLAGS) -o $@ $(PROGRAM)_intres.rc diff --git a/reactos/subsys/system/explorer/Makefile.MinGW b/reactos/subsys/system/explorer/Makefile.MinGW index 8ea7b0eb115..907fdfb6de0 100644 --- a/reactos/subsys/system/explorer/Makefile.MinGW +++ b/reactos/subsys/system/explorer/Makefile.MinGW @@ -72,12 +72,13 @@ OBJECTS = \ settings.o \ i386-stub-win32.o -LIBS = gdi32 comctl32 ole32 uuid wsock32 oleaut32 +LIBS = gdi32 comctl32 ole32 uuid +DELAYIMPORTS = oleaut32 wsock32 all: $(TARGET) $(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) - $(LINK) $(LFLAGS) -o $@ $^ $(addprefix -l,$(LIBS)) + $(LINK) $(LFLAGS) -o $@ $^ $(addprefix -l,$(LIBS)) $(addprefix -l,$(DELAYIMPORTS)) explorer$(RES_SUFFIX): $(PROGRAM)_intres.rc res/*.bmp res/*.ico windres $(RCFLAGS) -o $@ $(PROGRAM)_intres.rc diff --git a/reactos/subsys/system/explorer/explorer.dsp b/reactos/subsys/system/explorer/explorer.dsp index dc8f647bce4..37ec278b3d4 100644 --- a/reactos/subsys/system/explorer/explorer.dsp +++ b/reactos/subsys/system/explorer/explorer.dsp @@ -57,8 +57,8 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib /nologo /subsystem:windows /machine:I386 -# SUBTRACT LINK32 /pdb:none /force +# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /machine:I386 /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "explorer - Win32 Debug" @@ -82,8 +82,8 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept -# SUBTRACT LINK32 /pdb:none /force +# ADD LINK32 kernel32.lib shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "explorer - Win32 Debug Release" @@ -108,8 +108,8 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib /nologo /subsystem:windows /debug /machine:I386 -# SUBTRACT LINK32 /pdb:none /force +# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "explorer - Win32 Unicode Release" @@ -134,8 +134,8 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib /nologo /subsystem:windows /machine:I386 -# SUBTRACT LINK32 /pdb:none /force +# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /machine:I386 /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "explorer - Win32 Unicode Debug" @@ -160,8 +160,8 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept -# SUBTRACT LINK32 /pdb:none /force +# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "explorer - Win32 _NO_COMUTIL" @@ -187,8 +187,8 @@ BSC32=bscmake.exe LINK32=link.exe # ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib ole32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # SUBTRACT BASE LINK32 /pdb:none -# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept -# SUBTRACT LINK32 /pdb:none /force +# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "explorer - Win32" @@ -214,8 +214,8 @@ BSC32=bscmake.exe LINK32=link.exe # ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib ole32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # SUBTRACT BASE LINK32 /pdb:none -# ADD LINK32 gdi32.lib user32.lib advapi32.lib ole32.lib /nologo /subsystem:windows /debug /machine:I386 /out:"Win32/wexplorer.exe" /pdbtype:sept -# SUBTRACT LINK32 /pdb:none /force +# ADD LINK32 gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /out:"Win32/wexplorer.exe" /pdbtype:sept /delayload:oleaut32.dll +# SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "explorer - Win32 WineRelease" @@ -241,8 +241,8 @@ BSC32=bscmake.exe LINK32=link.exe # ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib ole32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # SUBTRACT BASE LINK32 /pdb:none -# ADD LINK32 gdi32.lib user32.lib advapi32.lib ole32.lib /nologo /subsystem:windows /incremental:no /machine:I386 /out:"WineRelease/wexplorer.exe" /pdbtype:sept -# SUBTRACT LINK32 /pdb:none /debug /force +# ADD LINK32 gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /incremental:no /machine:I386 /out:"WineRelease/wexplorer.exe" /pdbtype:sept /delayload:oleaut32.dll /delayload:wsock32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "explorer - Win32 WineDll" @@ -268,8 +268,8 @@ BSC32=bscmake.exe LINK32=link.exe # ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib ole32.lib /nologo /subsystem:windows /machine:I386 /pdbtype:sept # SUBTRACT BASE LINK32 /pdb:none /debug -# ADD LINK32 gdi32.lib user32.lib advapi32.lib ole32.lib /nologo /subsystem:windows /machine:I386 /out:"WineDll/wexplorer.exe" /pdbtype:sept -# SUBTRACT LINK32 /pdb:none /debug /force +# ADD LINK32 gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /machine:I386 /out:"WineDll/wexplorer.exe" /pdbtype:sept /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none !ENDIF diff --git a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp index 59ffce98f04..613b72a51d8 100644 --- a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp @@ -89,7 +89,15 @@ LRESULT DesktopBar::Init(LPCREATESTRUCT pcs) return 1; // create start button - new PictureButton(Button(_hwnd, ResString(IDS_START), 2, 2, STARTBUTTON_WIDTH, DESKTOPBARBAR_HEIGHT-8, IDC_START, WS_VISIBLE|WS_CHILD|BS_OWNERDRAW), + ResString start_str(IDS_START); + WindowCanvas canvas(_hwnd); + RECT rect = {0, 0}; + DrawText(canvas, start_str, -1, &rect, DT_SINGLELINE|DT_CALCRECT); + int start_btn_width = rect.right+16+8; + + _taskbar_pos = start_btn_width + 6; + + new PictureButton(Button(_hwnd, start_str, 2, 2, start_btn_width, DESKTOPBARBAR_HEIGHT-8, IDC_START, WS_VISIBLE|WS_CHILD|BS_OWNERDRAW), SmallIcon(IDI_STARTMENU)/*, GetStockBrush(WHITE_BRUSH)*/); // create task bar @@ -137,7 +145,7 @@ LRESULT DesktopBar::Init(LPCREATESTRUCT pcs) rbBand.hwndChild = _hwndTaskBar; rbBand.cxMinChild = 0; rbBand.cyMinChild = ClientRect(_hwndTaskBar).bottom + 2; - rbBand.cx = 200; //pcs->cx-TASKBAR_LEFT-quicklaunch_width-(notifyarea_width+1); + rbBand.cx = 200; //pcs->cx-_taskbar_pos-quicklaunch_width-(notifyarea_width+1); SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand); #endif @@ -248,13 +256,13 @@ void DesktopBar::Resize(int cx, int cy) HDWP hdwp = BeginDeferWindowPos(3); if (_hwndrebar) - DeferWindowPos(hdwp, _hwndrebar, 0, TASKBAR_LEFT, 0, cx-TASKBAR_LEFT-(notifyarea_width+1), cy, SWP_NOZORDER|SWP_NOACTIVATE); + DeferWindowPos(hdwp, _hwndrebar, 0, _taskbar_pos, 0, cx-_taskbar_pos-(notifyarea_width+1), cy, SWP_NOZORDER|SWP_NOACTIVATE); else { if (_hwndQuickLaunch) - DeferWindowPos(hdwp, _hwndQuickLaunch, 0, TASKBAR_LEFT, 1, quicklaunch_width, cy-2, SWP_NOZORDER|SWP_NOACTIVATE); + DeferWindowPos(hdwp, _hwndQuickLaunch, 0, _taskbar_pos, 1, quicklaunch_width, cy-2, SWP_NOZORDER|SWP_NOACTIVATE); if (_hwndTaskBar) - DeferWindowPos(hdwp, _hwndTaskBar, 0, TASKBAR_LEFT+quicklaunch_width, 0, cx-TASKBAR_LEFT-quicklaunch_width-(notifyarea_width+1), cy, SWP_NOZORDER|SWP_NOACTIVATE); + DeferWindowPos(hdwp, _hwndTaskBar, 0, _taskbar_pos+quicklaunch_width, 0, cx-_taskbar_pos-quicklaunch_width-(notifyarea_width+1), cy, SWP_NOZORDER|SWP_NOACTIVATE); } if (_hwndNotify) diff --git a/reactos/subsys/system/explorer/taskbar/desktopbar.h b/reactos/subsys/system/explorer/taskbar/desktopbar.h index 06a8271e41a..db51b550808 100644 --- a/reactos/subsys/system/explorer/taskbar/desktopbar.h +++ b/reactos/subsys/system/explorer/taskbar/desktopbar.h @@ -78,6 +78,7 @@ protected: int WM_TASKBARCREATED; RECT _work_area_org; + int _taskbar_pos; LRESULT Init(LPCREATESTRUCT pcs); LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); diff --git a/reactos/subsys/system/explorer/taskbar/taskbar.cpp b/reactos/subsys/system/explorer/taskbar/taskbar.cpp index 6eb73ab042b..ff015aab44a 100644 --- a/reactos/subsys/system/explorer/taskbar/taskbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/taskbar.cpp @@ -71,10 +71,12 @@ HWND TaskBar::Create(HWND hwndParent) { ClientRect clnt(hwndParent); + int taskbar_pos = 80; // This start position will be adjusted in DesktopBar::Resize(). + return Window::Create(WINDOW_CREATOR(TaskBar), 0, BtnWindowClass(CLASSNAME_TASKBAR), TITLE_TASKBAR, WS_CHILD|WS_VISIBLE | CCS_TOP|CCS_NODIVIDER|CCS_NORESIZE, - TASKBAR_LEFT, 0, clnt.right-TASKBAR_LEFT-(NOTIFYAREA_WIDTH_DEF+1), clnt.bottom, hwndParent); + taskbar_pos, 0, clnt.right-taskbar_pos-(NOTIFYAREA_WIDTH_DEF+1), clnt.bottom, hwndParent); } LRESULT TaskBar::Init(LPCREATESTRUCT pcs) From 82ed8b47d600beac424721b8f4c3fa5caea1b8b5 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Fri, 12 Mar 2004 21:12:28 +0000 Subject: [PATCH 0456/1463] adjust start button to text size svn path=/trunk/; revision=8668 --- reactos/subsys/system/explorer/taskbar/taskbar.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/reactos/subsys/system/explorer/taskbar/taskbar.h b/reactos/subsys/system/explorer/taskbar/taskbar.h index 9f0d831fed9..0e66b449b6a 100644 --- a/reactos/subsys/system/explorer/taskbar/taskbar.h +++ b/reactos/subsys/system/explorer/taskbar/taskbar.h @@ -34,8 +34,6 @@ #define IDC_FIRST_APP 0x2000 -#define STARTBUTTON_WIDTH 60 -#define TASKBAR_LEFT 70 //#define TASKBAR_AT_TOP #define TASKBUTTONWIDTH_MIN 38 From 5ceefba3a369760b3dcf3f5f2b8ee7663d4c9baf Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Fri, 12 Mar 2004 21:20:02 +0000 Subject: [PATCH 0457/1463] small 'Explorer' string adjustment for french svn path=/trunk/; revision=8670 --- reactos/subsys/system/explorer/explorer_intres.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/subsys/system/explorer/explorer_intres.rc b/reactos/subsys/system/explorer/explorer_intres.rc index 772eb8d750b..b85c4b16bd3 100644 --- a/reactos/subsys/system/explorer/explorer_intres.rc +++ b/reactos/subsys/system/explorer/explorer_intres.rc @@ -956,7 +956,7 @@ BEGIN IDS_FAVORITES "Favoris" IDS_PROGRAMS "Programmes" IDS_SETTINGS "Param鑤res" - IDS_EXPLORE "Explore" + IDS_EXPLORE "Explorer" IDS_EMPTY "(Vide)" IDS_RECENT "Documents r閏ents" IDS_ADMIN "Administration" From ceabe25983c921d2279fc4ef59386e5e0e4bc471 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Fri, 12 Mar 2004 21:20:53 +0000 Subject: [PATCH 0458/1463] Sync to Wine-20040309: Jason Edmeades <us@the-edmeades.demon.co.uk> - Handle playing of files containing a '+' as part of the filename. Robert Reif <reif@earthlink.net> - Cleanup prepare/unprepare header parameter checking. - Fix midiInGetDevCapsW. Sean Young <sean@mess.org> - Check uSize parameter in waveOutUnprepareHeader and waveOutPrepareHeader. Christian Costa <titan.costa@wanadoo.fr> - Fixed waveInGetDevCapsW. svn path=/trunk/; revision=8672 --- reactos/lib/winmm/mmio.c | 50 +++++++++++++++++------------- reactos/lib/winmm/winehq2ros.patch | 50 +++++++++++++++++++++--------- reactos/lib/winmm/winmm.c | 30 +++++++++++++++--- 3 files changed, 88 insertions(+), 42 deletions(-) diff --git a/reactos/lib/winmm/mmio.c b/reactos/lib/winmm/mmio.c index 25631c52164..f588690e527 100644 --- a/reactos/lib/winmm/mmio.c +++ b/reactos/lib/winmm/mmio.c @@ -389,41 +389,47 @@ static LRESULT send_message(struct IOProcList* ioProc, LPMMIOINFO mmioinfo, */ static FOURCC MMIO_ParseExtA(LPCSTR szFileName) { - /* Filenames are of the form file.ext+ABC - FIXME: What if a '+' is part of the file name? - For now, we take the last '+' present */ + /* Filenames are of the form file.ext{+ABC} + For now, we take the last '+' if present */ FOURCC ret = 0; /* Note that ext{Start,End} point to the . and + respectively */ LPSTR extEnd; + LPSTR extStart; TRACE("(%s)\n", debugstr_a(szFileName)); if (!szFileName) return ret; - extEnd = strrchr(szFileName,'+'); - if (extEnd) { - /* Need to parse to find the extension */ - LPSTR extStart; - extStart = extEnd; - while (extStart >= szFileName && extStart[0] != '.') { - extStart--; - } + /* Find the last '.' */ + extStart = strrchr(szFileName,'.'); - if (extStart < szFileName) { - ERR("+ but no . in szFileName: %s\n", debugstr_a(szFileName)); - } else { - CHAR ext[5]; + if (!extStart) { + ERR("No . in szFileName: %s\n", debugstr_a(szFileName)); + } else { + CHAR ext[5]; - if (extEnd - extStart - 1 > 4) - WARN("Extension length > 4\n"); - lstrcpynA(ext, extStart + 1, min(extEnd-extStart,5)); - TRACE("Got extension: %s\n", debugstr_a(ext)); - /* FOURCC codes identifying file-extensions must be uppercase */ - ret = mmioStringToFOURCCA(ext, MMIO_TOUPPER); - } + /* Find the '+' afterwards */ + extEnd = strchr(extStart,'+'); + if (extEnd) { + + if (extEnd - extStart - 1 > 4) + WARN("Extension length > 4\n"); + lstrcpynA(ext, extStart + 1, min(extEnd-extStart,5)); + + } else { + /* No + so just an extension */ + if (strlen(extStart) > 4) { + WARN("Extension length > 4\n"); + } + lstrcpynA(ext, extStart + 1, 5); + } + TRACE("Got extension: %s\n", debugstr_a(ext)); + + /* FOURCC codes identifying file-extensions must be uppercase */ + ret = mmioStringToFOURCCA(ext, MMIO_TOUPPER); } return ret; } diff --git a/reactos/lib/winmm/winehq2ros.patch b/reactos/lib/winmm/winehq2ros.patch index 44c2764e0eb..937c04a2ee7 100644 --- a/reactos/lib/winmm/winehq2ros.patch +++ b/reactos/lib/winmm/winehq2ros.patch @@ -1,6 +1,10 @@ -diff -u /c/source/wine/dlls/winmm/lolvldrv.c winmm/lolvldrv.c ---- /c/source/wine/dlls/winmm/lolvldrv.c Wed Feb 25 18:47:36 2004 -+++ winmm/lolvldrv.c Tue Feb 17 01:15:52 2004 +Index: lolvldrv.c +=================================================================== +RCS file: /home/wine/wine/dlls/winmm/lolvldrv.c,v +retrieving revision 1.55 +diff -u -r1.55 lolvldrv.c +--- lolvldrv.c 31 Dec 2003 23:49:45 -0000 1.55 ++++ lolvldrv.c 12 Mar 2004 21:27:34 -0000 @@ -497,10 +497,12 @@ case DRV_QUERYDEVICEINTERFACESIZE: return MMDRV_Message(mld, uMsg, dwParam1, dwParam2, TRUE); @@ -14,21 +18,34 @@ diff -u /c/source/wine/dlls/winmm/lolvldrv.c winmm/lolvldrv.c default: WARN("Unknown call %04x\n", uMsg); -@@ -741,8 +743,9 @@ +@@ -741,11 +743,18 @@ static BOOL MMDRV_InitHardcoded(void) { /* first load hardware drivers */ +#ifndef __REACTOS__ MMDRV_Install("wineoss.drv", "wineoss.drv", FALSE); -- +#endif /* __REACTOS__ */ ++ ++#ifdef __REACTOS__ ++ // AG: TESTING: ++ MMDRV_Install("mmdrv.dll", "mmdrv.dll", FALSE); ++#endif + /* finish with mappers */ - MMDRV_Install("wavemapper", "msacm.drv", TRUE); - MMDRV_Install("midimapper", "midimap.drv", TRUE); - -diff -u /c/source/wine/dlls/winmm/time.c winmm/time.c ---- /c/source/wine/dlls/winmm/time.c Mon Jan 12 16:03:10 2004 -+++ winmm/time.c Sun Feb 15 16:55:10 2004 +- MMDRV_Install("wavemapper", "msacm.drv", TRUE); +- MMDRV_Install("midimapper", "midimap.drv", TRUE); ++ MMDRV_Install("wavemapper", "msacm32.dll", TRUE); ++ MMDRV_Install("midimapper", "midimap.dll", TRUE); + + return TRUE; + } +Index: time.c +=================================================================== +RCS file: /home/wine/wine/dlls/winmm/time.c,v +retrieving revision 1.26 +diff -u -r1.26 time.c +--- time.c 12 Jan 2004 21:03:10 -0000 1.26 ++++ time.c 12 Mar 2004 21:27:34 -0000 @@ -175,14 +175,19 @@ volatile HANDLE *pActive = (volatile HANDLE *)&TIME_hMMTimer; DWORD last_time, cur_time; @@ -49,10 +66,13 @@ diff -u /c/source/wine/dlls/winmm/time.c winmm/time.c } return 0; } - -diff -u /c/source/wine/dlls/winmm/winmm.c winmm/winmm.c ---- /c/source/wine/dlls/winmm/winmm.c Wed Feb 25 14:28:52 2004 -+++ winmm/winmm.c Sun Feb 15 22:58:58 2004 +Index: winmm.c +=================================================================== +RCS file: /home/wine/wine/dlls/winmm/winmm.c,v +retrieving revision 1.33 +diff -u -r1.33 winmm.c +--- winmm.c 27 Feb 2004 21:29:32 -0000 1.33 ++++ winmm.c 12 Mar 2004 21:27:36 -0000 @@ -125,10 +125,12 @@ loaded = -1; if (h) diff --git a/reactos/lib/winmm/winmm.c b/reactos/lib/winmm/winmm.c index 7fe006fd468..773eb0955b9 100644 --- a/reactos/lib/winmm/winmm.c +++ b/reactos/lib/winmm/winmm.c @@ -1371,6 +1371,9 @@ UINT WINAPI midiOutPrepareHeader(HMIDIOUT hMidiOut, TRACE("(%p, %p, %d)\n", hMidiOut, lpMidiOutHdr, uSize); + if (lpMidiOutHdr == NULL || uSize < sizeof (MIDIHDR)) + return MMSYSERR_INVALPARAM; + if ((wmld = MMDRV_Get(hMidiOut, MMDRV_MIDIOUT, FALSE)) == NULL) return MMSYSERR_INVALHANDLE; @@ -1387,6 +1390,9 @@ UINT WINAPI midiOutUnprepareHeader(HMIDIOUT hMidiOut, TRACE("(%p, %p, %d)\n", hMidiOut, lpMidiOutHdr, uSize); + if (lpMidiOutHdr == NULL || uSize < sizeof (MIDIHDR)) + return MMSYSERR_INVALPARAM; + if (!(lpMidiOutHdr->dwFlags & MHDR_PREPARED)) { return MMSYSERR_NOERROR; } @@ -1556,7 +1562,7 @@ UINT WINAPI midiInGetNumDevs(void) UINT WINAPI midiInGetDevCapsW(UINT_PTR uDeviceID, LPMIDIINCAPSW lpCaps, UINT uSize) { MIDIINCAPSA micA; - UINT ret = midiInGetDevCapsA(uDeviceID, &micA, uSize); + UINT ret = midiInGetDevCapsA(uDeviceID, &micA, sizeof(micA)); if (ret == MMSYSERR_NOERROR) { MIDIINCAPSW micW; @@ -1681,6 +1687,9 @@ UINT WINAPI midiInPrepareHeader(HMIDIIN hMidiIn, TRACE("(%p, %p, %d)\n", hMidiIn, lpMidiInHdr, uSize); + if (lpMidiInHdr == NULL || uSize < sizeof (MIDIHDR)) + return MMSYSERR_INVALPARAM; + if ((wmld = MMDRV_Get(hMidiIn, MMDRV_MIDIIN, FALSE)) == NULL) return MMSYSERR_INVALHANDLE; @@ -1697,6 +1706,9 @@ UINT WINAPI midiInUnprepareHeader(HMIDIIN hMidiIn, TRACE("(%p, %p, %d)\n", hMidiIn, lpMidiInHdr, uSize); + if (lpMidiInHdr == NULL || uSize < sizeof (MIDIHDR)) + return MMSYSERR_INVALPARAM; + if (!(lpMidiInHdr->dwFlags & MHDR_PREPARED)) { return MMSYSERR_NOERROR; } @@ -2609,7 +2621,8 @@ UINT WINAPI waveOutPrepareHeader(HWAVEOUT hWaveOut, TRACE("(%p, %p, %u);\n", hWaveOut, lpWaveOutHdr, uSize); - if (lpWaveOutHdr == NULL) return MMSYSERR_INVALPARAM; + if (lpWaveOutHdr == NULL || uSize < sizeof (WAVEHDR)) + return MMSYSERR_INVALPARAM; if ((wmld = MMDRV_Get(hWaveOut, MMDRV_WAVEOUT, FALSE)) == NULL) return MMSYSERR_INVALHANDLE; @@ -2627,6 +2640,9 @@ UINT WINAPI waveOutUnprepareHeader(HWAVEOUT hWaveOut, TRACE("(%p, %p, %u);\n", hWaveOut, lpWaveOutHdr, uSize); + if (lpWaveOutHdr == NULL || uSize < sizeof (WAVEHDR)) + return MMSYSERR_INVALPARAM; + if (!(lpWaveOutHdr->dwFlags & WHDR_PREPARED)) { return MMSYSERR_NOERROR; } @@ -2867,7 +2883,7 @@ UINT WINAPI waveInGetNumDevs(void) UINT WINAPI waveInGetDevCapsW(UINT_PTR uDeviceID, LPWAVEINCAPSW lpCaps, UINT uSize) { WAVEINCAPSA wicA; - UINT ret = waveInGetDevCapsA(uDeviceID, &wicA, uSize); + UINT ret = waveInGetDevCapsA(uDeviceID, &wicA, sizeof(wicA)); if (ret == MMSYSERR_NOERROR) { WAVEINCAPSW wicW; @@ -2961,7 +2977,9 @@ UINT WINAPI waveInPrepareHeader(HWAVEIN hWaveIn, WAVEHDR* lpWaveInHdr, TRACE("(%p, %p, %u);\n", hWaveIn, lpWaveInHdr, uSize); - if (lpWaveInHdr == NULL) return MMSYSERR_INVALPARAM; + if (lpWaveInHdr == NULL || uSize < sizeof (WAVEHDR)) + return MMSYSERR_INVALPARAM; + if ((wmld = MMDRV_Get(hWaveIn, MMDRV_WAVEIN, FALSE)) == NULL) return MMSYSERR_INVALHANDLE; @@ -2980,7 +2998,9 @@ UINT WINAPI waveInUnprepareHeader(HWAVEIN hWaveIn, WAVEHDR* lpWaveInHdr, TRACE("(%p, %p, %u);\n", hWaveIn, lpWaveInHdr, uSize); - if (lpWaveInHdr == NULL) return MMSYSERR_INVALPARAM; + if (lpWaveInHdr == NULL || uSize < sizeof (WAVEHDR)) + return MMSYSERR_INVALPARAM; + if (!(lpWaveInHdr->dwFlags & WHDR_PREPARED)) { return MMSYSERR_NOERROR; } From 94c34aee8077360d21c5c24f9846d4d3b3a5674b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Fri, 12 Mar 2004 22:08:23 +0000 Subject: [PATCH 0459/1463] Update status svn path=/trunk/; revision=8674 --- reactos/doc/README.WINE | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/reactos/doc/README.WINE b/reactos/doc/README.WINE index 9672be1fa45..38ee5c88284 100644 --- a/reactos/doc/README.WINE +++ b/reactos/doc/README.WINE @@ -32,22 +32,24 @@ reactos/tools/bin2res # Resource to binary converter The following shared libraries are a 100% port from Winehq sourcs. -reactos/lib/cabinet -reactos/lib/comctl32 # Synced to Wine-20040121 -reactos/lib/comdlg32 +reactos/lib/cabinet # Synced to Wine-20040309 +reactos/lib/comctl32 # Synced to Wine-20040309 +reactos/lib/comdlg32 # Synced to Wine-20040309 reactos/lib/imagehlp # Out of sync reactos/lib/imm32 -reactos/lib/msvideo # Syned to WINE-20040213 reactos/lib/msvcrt20 -reactos/lib/mpr # Imported 20040201 -reactos/lib/ole32 # Synced to Wine-20040121 -reactos/lib/richedit # Synced 20040201 +reactos/lib/mpr # Synced to Wine-20040309 +reactos/lib/ole32 # Synced to Wine-20040309 +reactos/lib/oledlg # Synced to Wine-20040309 +reactos/lib/richedit # Synced to Wine-20040309 reactos/lib/rpcrt4 # Out of date+Hack. In need of new merge reactos/lib/shell32 # 2004/01/22: Heavy syncing in progress -reactos/lib/shlwapi # Synced to Wine-20040121 +reactos/lib/shlwapi # Synced to Wine-20040309 reactos/lib/twain # Out of sync -reactos/lib/unicode # make this go away. -reactos/lib/winmm # Syned to WINE-20040213 +reactos/lib/unicode # make this go away. Synced to Wine-20040309 +reactos/lib/winmm # Synced to Wine-20040309 +reactos/lib/winmm/midimap # Synced to Wine-20040309 +reactos/lib/winmm/wavemap # Synced to Wine-20040309 ReactOS shares the following programs with Winehq. reactos/subsys/system/regedit #Out of sync From e964a19eb26eef4bad7f61665c5249c0ec6c5423 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Fri, 12 Mar 2004 23:03:21 +0000 Subject: [PATCH 0460/1463] - Fixed VPInterruptRoutine definition. svn path=/trunk/; revision=8675 --- reactos/drivers/video/videoprt/videoprt.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index 0cd3cb0cd4b..44b3c0227b7 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.19 2004/03/11 00:05:00 jimtabor Exp $ + * $Id: videoprt.c,v 1.20 2004/03/12 23:03:21 dwelch Exp $ */ #include "videoprt.h" @@ -385,7 +385,7 @@ VideoPortGetRegistryParameters(IN PVOID HwDeviceExtension, QUERY_REGISTRY_CALLBACK_CONTEXT Context; PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - DPRINT("VideoPortGetRegistryParameters ParameterName %S\n", ParameterName); + /*DPRINT("VideoPortGetRegistryParameters ParameterName %S\n", ParameterName);*/ DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, VIDEO_PORT_DEVICE_EXTENSION, @@ -457,7 +457,7 @@ VideoPortGetVgaStatus(IN PVOID HwDeviceExtension, return ERROR_INVALID_FUNCTION; } -static BOOLEAN +static BOOLEAN STDCALL VPInterruptRoutine(IN struct _KINTERRUPT *Interrupt, IN PVOID ServiceContext) { @@ -1208,6 +1208,7 @@ VidDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject, PIO_STACK_LOCATION IrpStack; PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; PVIDEO_REQUEST_PACKET vrp; + BOOLEAN Ret; DPRINT("VidDispatchDeviceControl\n"); IrpStack = IoGetCurrentIrpStackLocation(Irp); @@ -1223,6 +1224,19 @@ VidDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject, vrp->IoControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode; DPRINT("- IoControlCode: %x\n", vrp->IoControlCode); + DPRINT("InputBuffer %X (InLength %d OutLength %d) Routine %X\n", + Irp->AssociatedIrp.SystemBuffer, + IrpStack->Parameters.DeviceIoControl.InputBufferLength, + IrpStack->Parameters.DeviceIoControl.OutputBufferLength, + DeviceObject->DriverObject->DriverStartIo); + { + ULONG i; + for (i = 0; i < IrpStack->Parameters.DeviceIoControl.InputBufferLength; i++) + { + DbgPrint("%X ", ((PUCHAR)Irp->AssociatedIrp.SystemBuffer)[i]); + } + DbgPrint("\n"); + } /* We're assuming METHOD_BUFFERED */ vrp->InputBuffer = Irp->AssociatedIrp.SystemBuffer; @@ -1231,7 +1245,8 @@ VidDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject, vrp->OutputBufferLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength; /* Call the Miniport Driver with the VRP */ - ((PDRIVER_STARTIO)DeviceObject->DriverObject->DriverStartIo)((PVOID) &DeviceExtension->MiniPortDeviceExtension, (PIRP)vrp); + Ret = ((PDRIVER_STARTIO)DeviceObject->DriverObject->DriverStartIo)((PVOID) &DeviceExtension->MiniPortDeviceExtension, (PIRP)vrp); + assert(Ret); /* Free the VRP */ ExFreePool(vrp); From 410da0d376e2200fcc12c004293abc555ea6347c Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Sat, 13 Mar 2004 00:41:40 +0000 Subject: [PATCH 0461/1463] - Removed some debugging stuff I checked in by accident. svn path=/trunk/; revision=8676 --- reactos/drivers/video/videoprt/videoprt.c | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index 44b3c0227b7..4376834639a 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.20 2004/03/12 23:03:21 dwelch Exp $ + * $Id: videoprt.c,v 1.21 2004/03/13 00:41:40 dwelch Exp $ */ #include "videoprt.h" @@ -385,7 +385,7 @@ VideoPortGetRegistryParameters(IN PVOID HwDeviceExtension, QUERY_REGISTRY_CALLBACK_CONTEXT Context; PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - /*DPRINT("VideoPortGetRegistryParameters ParameterName %S\n", ParameterName);*/ + DPRINT("VideoPortGetRegistryParameters ParameterName %S\n", ParameterName); DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, VIDEO_PORT_DEVICE_EXTENSION, @@ -1224,19 +1224,6 @@ VidDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject, vrp->IoControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode; DPRINT("- IoControlCode: %x\n", vrp->IoControlCode); - DPRINT("InputBuffer %X (InLength %d OutLength %d) Routine %X\n", - Irp->AssociatedIrp.SystemBuffer, - IrpStack->Parameters.DeviceIoControl.InputBufferLength, - IrpStack->Parameters.DeviceIoControl.OutputBufferLength, - DeviceObject->DriverObject->DriverStartIo); - { - ULONG i; - for (i = 0; i < IrpStack->Parameters.DeviceIoControl.InputBufferLength; i++) - { - DbgPrint("%X ", ((PUCHAR)Irp->AssociatedIrp.SystemBuffer)[i]); - } - DbgPrint("\n"); - } /* We're assuming METHOD_BUFFERED */ vrp->InputBuffer = Irp->AssociatedIrp.SystemBuffer; From 2207df1ae4f3a49b8f7999e7572e1914897f5e15 Mon Sep 17 00:00:00 2001 From: Vizzini <vizzini@plasmic.com> Date: Sat, 13 Mar 2004 05:06:49 +0000 Subject: [PATCH 0462/1463] fixed a couple motor start/stop bugs; fixed a seek offset svn path=/trunk/; revision=8678 --- reactos/drivers/storage/floppy/floppy.c | 2 +- reactos/drivers/storage/floppy/readwrite.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/drivers/storage/floppy/floppy.c b/reactos/drivers/storage/floppy/floppy.c index 27c34ab1198..5299957861d 100644 --- a/reactos/drivers/storage/floppy/floppy.c +++ b/reactos/drivers/storage/floppy/floppy.c @@ -326,7 +326,7 @@ NTSTATUS NTAPI ResetChangeFlag(PDRIVE_INFO DriveInfo) } /* Seek back to 0 */ - if(HwSeek(DriveInfo, 1) != STATUS_SUCCESS) + if(HwSeek(DriveInfo, 0) != STATUS_SUCCESS) { KdPrint(("floppy: ResetChangeFlag(): HwSeek failed; returning STATUS_IO_DEVICE_ERROR\n")); StopMotor(DriveInfo->ControllerInfo); diff --git a/reactos/drivers/storage/floppy/readwrite.c b/reactos/drivers/storage/floppy/readwrite.c index 8e7e80a90d0..d3d0b68f776 100644 --- a/reactos/drivers/storage/floppy/readwrite.c +++ b/reactos/drivers/storage/floppy/readwrite.c @@ -458,10 +458,12 @@ VOID NTAPI ReadWritePassive(PDRIVE_INFO DriveInfo, /* * Check the change line, and if it's set, return */ + StartMotor(DriveInfo); if(HwDiskChanged(DeviceObject->DeviceExtension, &DiskChanged) != STATUS_SUCCESS) { KdPrint(("floppy: ReadWritePassive(): unable to detect disk change; Completing with STATUS_UNSUCCESSFUL\n")); IoCompleteRequest(Irp, IO_NO_INCREMENT); + StopMotor(DriveInfo->ControllerInfo); return; } @@ -479,12 +481,10 @@ VOID NTAPI ReadWritePassive(PDRIVE_INFO DriveInfo, Irp->IoStatus.Status = STATUS_NO_MEDIA_IN_DEVICE; IoCompleteRequest(Irp, IO_NO_INCREMENT); + StopMotor(DriveInfo->ControllerInfo); return; } - /* Start the motor and set the initial data rate */ - StartMotor(DriveInfo); - /* * Figure out the media type, if we don't know it already */ From 007814383b99c5ca56f0ff6d69438ffa0aa1319e Mon Sep 17 00:00:00 2001 From: Vizzini <vizzini@plasmic.com> Date: Sat, 13 Mar 2004 07:04:54 +0000 Subject: [PATCH 0463/1463] fixed two race conditions with motor power-off; now handles disk change detection and no-disk-in-drive correctly svn path=/trunk/; revision=8679 --- reactos/drivers/storage/floppy/floppy.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/reactos/drivers/storage/floppy/floppy.c b/reactos/drivers/storage/floppy/floppy.c index 5299957861d..541e026b3f0 100644 --- a/reactos/drivers/storage/floppy/floppy.c +++ b/reactos/drivers/storage/floppy/floppy.c @@ -115,14 +115,16 @@ VOID NTAPI StartMotor(PDRIVE_INFO DriveInfo) KdPrint(("floppy: StartMotor called\n")); - if(DriveInfo->ControllerInfo->StopDpcQueued && - !KeCancelTimer(&DriveInfo->ControllerInfo->MotorTimer)) + if(DriveInfo->ControllerInfo->StopDpcQueued && !KeCancelTimer(&DriveInfo->ControllerInfo->MotorTimer)) { /* Motor turner-offer is already running; wait for it to finish */ + KdPrint(("floppy: StartMotor: motor turner-offer is already running; waiting for it\n")); KeWaitForSingleObject(&DriveInfo->ControllerInfo->MotorStoppedEvent, Executive, KernelMode, FALSE, NULL); - DriveInfo->ControllerInfo->StopDpcQueued = FALSE; + KdPrint(("floppy: StartMotor: wait satisfied\n")); } + DriveInfo->ControllerInfo->StopDpcQueued = FALSE; + if(HwTurnOnMotor(DriveInfo) != STATUS_SUCCESS) KdPrint(("floppy: StartMotor(): warning: HwTurnOnMotor failed\n")); } @@ -768,7 +770,7 @@ static NTSTATUS NTAPI InitController(PCONTROLLER_INFO ControllerInfo) /* Init the stop stuff */ KeInitializeDpc(&ControllerInfo->MotorStopDpc, MotorStopDpcFunc, ControllerInfo); KeInitializeTimer(&ControllerInfo->MotorTimer); - KeInitializeEvent(&ControllerInfo->MotorStoppedEvent, SynchronizationEvent, FALSE); + KeInitializeEvent(&ControllerInfo->MotorStoppedEvent, NotificationEvent, FALSE); ControllerInfo->StopDpcQueued = FALSE; /* From 35472661aa307fd816f99f9ae5663925dc593288 Mon Sep 17 00:00:00 2001 From: Vizzini <vizzini@plasmic.com> Date: Sat, 13 Mar 2004 07:28:40 +0000 Subject: [PATCH 0464/1463] turn off skip bit to support VMWare FDC svn path=/trunk/; revision=8680 --- 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 9a9b3ec05b6..e881d83f1eb 100644 --- a/reactos/drivers/storage/floppy/hardware.c +++ b/reactos/drivers/storage/floppy/hardware.c @@ -415,7 +415,7 @@ NTSTATUS NTAPI HwReadWriteData(PCONTROLLER_INFO ControllerInfo, else Buffer[0] = COMMAND_WRITE_DATA; - Buffer[0] |= READ_DATA_MFM | READ_DATA_MT | READ_DATA_SK; + Buffer[0] |= READ_DATA_MFM | READ_DATA_MT; Buffer[1] = (Head << COMMAND_HEAD_NUMBER_SHIFT) | Unit; Buffer[2] = Cylinder; From c9c372e34b7e2d07990f59ffe9b96be4e958132b Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Sat, 13 Mar 2004 09:38:55 +0000 Subject: [PATCH 0465/1463] Add missing EVENTLOG_SUCCESS. svn path=/trunk/; revision=8681 --- reactos/include/defines.h | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/include/defines.h b/reactos/include/defines.h index 447ead77f52..4efbc97f542 100644 --- a/reactos/include/defines.h +++ b/reactos/include/defines.h @@ -2319,6 +2319,7 @@ extern "C" { #define EVENTLOG_BACKWARDS_READ (8) #define EVENTLOG_SEEK_READ (2) #define EVENTLOG_SEQUENTIAL_READ (1) +#define EVENTLOG_SUCCESS (0) #define EVENTLOG_ERROR_TYPE (1) #define EVENTLOG_WARNING_TYPE (2) #define EVENTLOG_INFORMATION_TYPE (4) From 544d860114dac53c990157b93541a06110908aaa Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Sat, 13 Mar 2004 12:14:44 +0000 Subject: [PATCH 0466/1463] Fix key name size calculation bugs. Fill some allocated buffers with zeros. Minor cleanup. svn path=/trunk/; revision=8682 --- reactos/ntoskrnl/cm/ntfunc.c | 23 ++++-- reactos/ntoskrnl/cm/regfile.c | 132 +++++++++++++++++++-------------- reactos/ntoskrnl/cm/registry.c | 64 ++++++++-------- 3 files changed, 128 insertions(+), 91 deletions(-) diff --git a/reactos/ntoskrnl/cm/ntfunc.c b/reactos/ntoskrnl/cm/ntfunc.c index a605e72073c..fe26fcc2c73 100644 --- a/reactos/ntoskrnl/cm/ntfunc.c +++ b/reactos/ntoskrnl/cm/ntfunc.c @@ -404,7 +404,7 @@ NtEnumerateKey(IN HANDLE KeyHandle, KeLeaveCriticalRegion(); ObDereferenceObject(KeyObject); DPRINT("No more entries\n"); - return(STATUS_NO_MORE_ENTRIES); + return STATUS_NO_MORE_ENTRIES; } Status = STATUS_SUCCESS; @@ -412,10 +412,17 @@ NtEnumerateKey(IN HANDLE KeyHandle, { case KeyBasicInformation: /* Check size of buffer */ - NameSize = SubKeyCell->NameSize; - if (SubKeyCell->Flags & REG_KEY_NAME_PACKED) + if (SubKeyObject != NULL) { - NameSize *= sizeof(WCHAR); + NameSize = SubKeyObject->Name.Length; + } + else + { + NameSize = SubKeyCell->NameSize; + if (SubKeyCell->Flags & REG_KEY_NAME_PACKED) + { + NameSize *= sizeof(WCHAR); + } } *ResultLength = sizeof(KEY_BASIC_INFORMATION) + NameSize; @@ -460,13 +467,17 @@ NtEnumerateKey(IN HANDLE KeyHandle, case KeyNodeInformation: /* Check size of buffer */ - if (SubKeyCell->Flags & REG_KEY_NAME_PACKED) + if (SubKeyObject != NULL) { - NameSize = SubKeyCell->NameSize * sizeof(WCHAR); + NameSize = SubKeyObject->Name.Length; } else { NameSize = SubKeyCell->NameSize; + if (SubKeyCell->Flags & REG_KEY_NAME_PACKED) + { + NameSize *= sizeof(WCHAR); + } } *ResultLength = sizeof(KEY_NODE_INFORMATION) + NameSize + SubKeyCell->ClassSize; diff --git a/reactos/ntoskrnl/cm/regfile.c b/reactos/ntoskrnl/cm/regfile.c index 943a177c681..4a7657f2168 100644 --- a/reactos/ntoskrnl/cm/regfile.c +++ b/reactos/ntoskrnl/cm/regfile.c @@ -369,6 +369,9 @@ CmiCreateNewRegFile(HANDLE FileHandle) if (Buffer == NULL) return STATUS_INSUFFICIENT_RESOURCES; + RtlZeroMemory (Buffer, + 2 * REG_BLOCK_SIZE); + HiveHeader = (PHIVE_HEADER)Buffer; BinCell = (PHBIN)((ULONG_PTR)Buffer + REG_BLOCK_SIZE); RootKeyCell = (PKEY_CELL)((ULONG_PTR)Buffer + REG_BLOCK_SIZE + REG_HBIN_DATA_OFFSET); @@ -985,7 +988,7 @@ CmiInitNonVolatileRegistryHive (PREGISTRY_HIVE RegistryHive, /* Allocate hive block list */ RegistryHive->BlockList = ExAllocatePool(NonPagedPool, - sizeof(PHBIN *) * RegistryHive->BlockListSize); + sizeof(PHBIN *) * RegistryHive->BlockListSize); if (RegistryHive->BlockList == NULL) { DPRINT1("Failed to allocate the hive block list\n"); @@ -996,6 +999,8 @@ CmiInitNonVolatileRegistryHive (PREGISTRY_HIVE RegistryHive, RtlFreeUnicodeString(&RegistryHive->LogFileName); return STATUS_INSUFFICIENT_RESOURCES; } + RtlZeroMemory (RegistryHive->BlockList, + RegistryHive->BlockListSize * sizeof(PHBIN *)); /* Import the hive bins */ Status = CmiImportHiveBins (RegistryHive, @@ -1042,7 +1047,7 @@ CmiInitNonVolatileRegistryHive (PREGISTRY_HIVE RegistryHive, DPRINT("CmiInitNonVolatileRegistryHive(%p, %S) - Finished.\n", RegistryHive, Filename); - return(STATUS_SUCCESS); + return STATUS_SUCCESS; } @@ -1071,6 +1076,8 @@ CmiCreateVolatileHive(PREGISTRY_HIVE *RegistryHive) ExFreePool (Hive); return STATUS_INSUFFICIENT_RESOURCES; } + RtlZeroMemory (Hive->HiveHeader, + sizeof(HIVE_HEADER)); Hive->Flags = (HIVE_NO_FILE | HIVE_POINTER); @@ -1270,6 +1277,9 @@ CmiLoadHive(IN POBJECT_ATTRIBUTES KeyObjectAttributes, return STATUS_INSUFFICIENT_RESOURCES; } + RtlZeroMemory (Hive->HiveHeader, + sizeof(HIVE_HEADER)); + Status = CmiInitNonVolatileRegistryHive (Hive, FileName->Buffer); if (!NT_SUCCESS (Status)) @@ -1395,12 +1405,15 @@ CmiStartLogUpdate(PREGISTRY_HIVE RegistryHive) DPRINT("Bitmap size %lu buffer size: %lu\n", BitmapSize, BufferSize); - Buffer = (PUCHAR)ExAllocatePool(NonPagedPool, BufferSize); + Buffer = (PUCHAR)ExAllocatePool(NonPagedPool, + BufferSize); if (Buffer == NULL) { DPRINT("ExAllocatePool() failed\n"); return(STATUS_INSUFFICIENT_RESOURCES); } + RtlZeroMemory (Buffer, + BufferSize); /* Open log file for writing */ InitializeObjectAttributes(&ObjectAttributes, @@ -2094,12 +2107,14 @@ CmiGetMaxNameLength(PKEY_OBJECT KeyObject) DPRINT("CmiGetBlock() failed\n"); continue; } + NameSize = CurSubKeyCell->NameSize; if (CurSubKeyCell->Flags & REG_KEY_NAME_PACKED) { NameSize *= sizeof(WCHAR); } - if (MaxName < NameSize) + + if (NameSize > MaxName) { MaxName = NameSize; } @@ -2107,7 +2122,7 @@ CmiGetMaxNameLength(PKEY_OBJECT KeyObject) } } - DPRINT("KeyObject->NumberOfSubKeys %d\n", KeyObject->NumberOfSubKeys); + DPRINT ("KeyObject->NumberOfSubKeys %d\n", KeyObject->NumberOfSubKeys); for (i = 0; i < KeyObject->NumberOfSubKeys; i++) { CurKey = KeyObject->SubKeys[i]; @@ -2121,19 +2136,31 @@ CmiGetMaxNameLength(PKEY_OBJECT KeyObject) continue; } - NameSize = CurSubKeyCell->NameSize; - if (CurSubKeyCell->Flags & REG_KEY_NAME_PACKED) + if ((CurSubKeyCell->Flags & REG_KEY_ROOT_CELL) == REG_KEY_ROOT_CELL) { - NameSize *= sizeof(WCHAR); + /* Use name of the key object */ + NameSize = CurKey->Name.Length; } + else + { + /* Use name of the key cell */ + NameSize = CurSubKeyCell->NameSize; + if (CurSubKeyCell->Flags & REG_KEY_NAME_PACKED) + { + NameSize *= sizeof(WCHAR); + } + } + DPRINT ("NameSize %lu\n", NameSize); - if (MaxName < NameSize) + if (NameSize > MaxName) { MaxName = NameSize; } } } + DPRINT ("MaxName %lu\n", MaxName); + return MaxName; } @@ -3239,18 +3266,20 @@ CmiAddBin(PREGISTRY_HIVE RegistryHive, { return STATUS_INSUFFICIENT_RESOURCES; } + RtlZeroMemory (tmpBin, + REG_BLOCK_SIZE); tmpBin->BlockId = REG_BIN_ID; tmpBin->BlockOffset = RegistryHive->FileSize - REG_BLOCK_SIZE; RegistryHive->FileSize += REG_BLOCK_SIZE; tmpBin->BlockSize = REG_BLOCK_SIZE; tmpBin->Unused1 = 0; - ZwQuerySystemTime(&tmpBin->DateModified); + NtQuerySystemTime(&tmpBin->DateModified); tmpBin->Unused2 = 0; /* Increase size of list of blocks */ tmpBlockList = ExAllocatePool(NonPagedPool, - sizeof(PHBIN *) * (RegistryHive->BlockListSize + 1)); + sizeof(PHBIN *) * (RegistryHive->BlockListSize + 1)); if (tmpBlockList == NULL) { ExFreePool(tmpBin); @@ -3319,12 +3348,10 @@ CmiAllocateCell (PREGISTRY_HIVE RegistryHive, BLOCK_OFFSET *CellOffset) { PCELL_HEADER NewCell; - NTSTATUS Status; - PHBIN pBin; + PHBIN Bin; ULONG i; PVOID Temp; - - Status = STATUS_SUCCESS; + NTSTATUS Status; /* Round to 16 bytes multiple */ CellSize = ROUND_UP(CellSize, 16); @@ -3333,20 +3360,18 @@ CmiAllocateCell (PREGISTRY_HIVE RegistryHive, if (IsPointerHive(RegistryHive)) { NewCell = ExAllocatePool(NonPagedPool, CellSize); - if (NewCell == NULL) { - Status = STATUS_INSUFFICIENT_RESOURCES; + return STATUS_INSUFFICIENT_RESOURCES; } - else - { - RtlZeroMemory(NewCell, CellSize); - NewCell->CellSize = -CellSize; - *Cell = NewCell; - if (CellOffset != NULL) - *CellOffset = (BLOCK_OFFSET) NewCell; - } + RtlZeroMemory (NewCell, + CellSize); + NewCell->CellSize = -CellSize; + + *Cell = NewCell; + if (CellOffset != NULL) + *CellOffset = (BLOCK_OFFSET) NewCell; } else { @@ -3361,18 +3386,17 @@ CmiAllocateCell (PREGISTRY_HIVE RegistryHive, *CellOffset = RegistryHive->FreeListOffset[i]; /* Update time of heap */ - Temp = CmiGetCell (RegistryHive, RegistryHive->FreeListOffset[i], &pBin); + Temp = CmiGetCell (RegistryHive, + RegistryHive->FreeListOffset[i], + &Bin); if (Temp == NULL) { DPRINT("CmiGetBlock() failed\n"); return STATUS_UNSUCCESSFUL; } - if (Temp) - { - NtQuerySystemTime(&pBin->DateModified); - CmiMarkBlockDirty(RegistryHive, RegistryHive->FreeListOffset[i]); - } + NtQuerySystemTime(&Bin->DateModified); + CmiMarkBlockDirty(RegistryHive, RegistryHive->FreeListOffset[i]); if ((i + 1) < RegistryHive->FreeListSize) { @@ -3395,35 +3419,35 @@ CmiAllocateCell (PREGISTRY_HIVE RegistryHive, { /* Add a new bin */ Status = CmiAddBin(RegistryHive, (PVOID *) &NewCell , CellOffset); + if (!NT_SUCCESS(Status)) + return Status; } - if (NT_SUCCESS(Status)) + *Cell = NewCell; + + /* Split the block in two parts */ + if (NewCell->CellSize > CellSize) { - *Cell = NewCell; - - /* Split the block in two parts */ - if (NewCell->CellSize > CellSize) - { - NewCell = (PCELL_HEADER) ((ULONG_PTR) NewCell + CellSize); - NewCell->CellSize = ((PCELL_HEADER) (*Cell))->CellSize - CellSize; - CmiAddFree(RegistryHive, - NewCell, - *CellOffset + CellSize, - TRUE); - CmiMarkBlockDirty(RegistryHive, - *CellOffset + CellSize); - } - else if (NewCell->CellSize < CellSize) - { - return(STATUS_UNSUCCESSFUL); - } - - RtlZeroMemory(*Cell, CellSize); - ((PCELL_HEADER) (*Cell))->CellSize = -CellSize; + NewCell = (PCELL_HEADER) ((ULONG_PTR) NewCell + CellSize); + NewCell->CellSize = ((PCELL_HEADER) (*Cell))->CellSize - CellSize; + CmiAddFree(RegistryHive, + NewCell, + *CellOffset + CellSize, + TRUE); + CmiMarkBlockDirty(RegistryHive, + *CellOffset + CellSize); } + else if (NewCell->CellSize < CellSize) + { + return STATUS_UNSUCCESSFUL; + } + + RtlZeroMemory(*Cell, + CellSize); + ((PCELL_HEADER) (*Cell))->CellSize = -CellSize; } - return(Status); + return STATUS_SUCCESS; } diff --git a/reactos/ntoskrnl/cm/registry.c b/reactos/ntoskrnl/cm/registry.c index 0ce45fc2418..baf889f72a4 100644 --- a/reactos/ntoskrnl/cm/registry.c +++ b/reactos/ntoskrnl/cm/registry.c @@ -1,4 +1,4 @@ -/* $Id: registry.c,v 1.122 2004/03/07 19:59:36 hbirr Exp $ +/* $Id: registry.c,v 1.123 2004/03/13 12:14:44 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -525,7 +525,7 @@ CmiConnectHive(IN POBJECT_ATTRIBUTES KeyObjectAttributes, CmiKeyType); if (!NT_SUCCESS(Status)) { - return(Status); + return Status; } DPRINT ("RemainingPath %wZ\n", &RemainingPath); @@ -537,12 +537,13 @@ CmiConnectHive(IN POBJECT_ATTRIBUTES KeyObjectAttributes, return STATUS_OBJECT_NAME_COLLISION; } - /* If RemainingPath contains \ we must return error - because CmiConnectHive() can not create trees */ + /* Ignore leading backslash */ SubName = RemainingPath.Buffer; if (*SubName == L'\\') SubName++; + /* If RemainingPath contains \ we must return error + because CmiConnectHive() can not create trees */ if (wcschr (SubName, L'\\') != NULL) { ObDereferenceObject (ParentKey); @@ -575,38 +576,39 @@ CmiConnectHive(IN POBJECT_ATTRIBUTES KeyObjectAttributes, NewKey->KeyCell = CmiGetCell (RegistryHive, NewKey->KeyCellOffset, NULL); NewKey->Flags = 0; NewKey->NumberOfSubKeys = 0; - NewKey->SubKeys = ExAllocatePool(PagedPool, - NewKey->KeyCell->NumberOfSubKeys * sizeof(ULONG)); - - if ((NewKey->SubKeys == NULL) && (NewKey->KeyCell->NumberOfSubKeys != 0)) + if (NewKey->KeyCell->NumberOfSubKeys != 0) { - DPRINT("NumberOfSubKeys %d\n", NewKey->KeyCell->NumberOfSubKeys); - ObDereferenceObject (NewKey); - ObDereferenceObject (ParentKey); - RtlFreeUnicodeString(&RemainingPath); - return STATUS_INSUFFICIENT_RESOURCES; - } - - if (SubName == RemainingPath.Buffer) - { - NewKey->Name = RemainingPath; + NewKey->SubKeys = ExAllocatePool(PagedPool, + NewKey->KeyCell->NumberOfSubKeys * sizeof(ULONG)); + if (NewKey->SubKeys == NULL) + { + DPRINT("ExAllocatePool() failed\n"); + ObDereferenceObject (NewKey); + ObDereferenceObject (ParentKey); + RtlFreeUnicodeString(&RemainingPath); + return STATUS_INSUFFICIENT_RESOURCES; + } } else { - Status = RtlCreateUnicodeString(&NewKey->Name, - SubName); - RtlFreeUnicodeString(&RemainingPath); - if (!NT_SUCCESS(Status)) - { - DPRINT1("RtlCreateUnicodeString() failed (Status %lx)\n", Status); - if (NewKey->SubKeys != NULL) - { - ExFreePool (NewKey->SubKeys); - } - ObDereferenceObject (NewKey); - ObDereferenceObject (ParentKey); - return STATUS_INSUFFICIENT_RESOURCES; + NewKey->SubKeys = NULL; + } + + DPRINT ("SubName %S\n", SubName); + + Status = RtlCreateUnicodeString(&NewKey->Name, + SubName); + RtlFreeUnicodeString(&RemainingPath); + if (!NT_SUCCESS(Status)) + { + DPRINT1("RtlCreateUnicodeString() failed (Status %lx)\n", Status); + if (NewKey->SubKeys != NULL) + { + ExFreePool (NewKey->SubKeys); } + ObDereferenceObject (NewKey); + ObDereferenceObject (ParentKey); + return STATUS_INSUFFICIENT_RESOURCES; } CmiAddKeyToList (ParentKey, NewKey); From 05825a6aab0ec1cc2b0363ea09cd0b0307c14840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Sat, 13 Mar 2004 17:33:53 +0000 Subject: [PATCH 0467/1463] Mark update regions as global objects, to prevent their destruction when the creating process exits svn path=/trunk/; revision=8683 --- reactos/subsys/win32k/ntuser/painting.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/painting.c b/reactos/subsys/win32k/ntuser/painting.c index 818181c9c17..f5240746ca2 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.75 2004/02/29 11:34:42 navaraf Exp $ + * $Id: painting.c,v 1.76 2004/03/13 17:33:53 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -113,6 +113,10 @@ IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags) IntValidateParent(Window, Window->NCUpdateRegion); } TempRegion = Window->NCUpdateRegion; + if ((HANDLE) 1 != TempRegion && NULL != TempRegion) + { + GDIOBJ_SetOwnership(TempRegion, PsGetCurrentProcess()); + } Window->NCUpdateRegion = NULL; Window->Flags &= ~WINDOWOBJECT_NEED_NCPAINT; MsqDecPaintCountQueue(Window->MessageQueue); @@ -246,11 +250,13 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags) if (Window->UpdateRegion == NULL) { Window->UpdateRegion = NtGdiCreateRectRgn(0, 0, 0, 0); + GDIOBJ_SetOwnership(Window->UpdateRegion, NULL); } if (NtGdiCombineRgn(Window->UpdateRegion, Window->UpdateRegion, hRgn, RGN_OR) == NULLREGION) { + GDIOBJ_SetOwnership(Window->UpdateRegion, PsGetCurrentProcess()); NtGdiDeleteObject(Window->UpdateRegion); Window->UpdateRegion = NULL; } @@ -270,6 +276,7 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags) if (NtGdiCombineRgn(Window->UpdateRegion, Window->UpdateRegion, hRgn, RGN_DIFF) == NULLREGION) { + GDIOBJ_SetOwnership(Window->UpdateRegion, PsGetCurrentProcess()); NtGdiDeleteObject(Window->UpdateRegion); Window->UpdateRegion = NULL; } @@ -306,9 +313,11 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags) -Window->WindowRect.top); hRgnNonClient = NtGdiCreateRectRgn(0, 0, 0, 0); + GDIOBJ_SetOwnership(hRgnNonClient, NULL); if (NtGdiCombineRgn(hRgnNonClient, Window->UpdateRegion, hRgnWindow, RGN_DIFF) == NULLREGION) { + GDIOBJ_SetOwnership(hRgnNonClient, PsGetCurrentProcess()); NtGdiDeleteObject(hRgnNonClient); hRgnNonClient = NULL; } @@ -320,6 +329,7 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags) if (NtGdiCombineRgn(Window->UpdateRegion, Window->UpdateRegion, hRgnWindow, RGN_AND) == NULLREGION) { + GDIOBJ_SetOwnership(Window->UpdateRegion, PsGetCurrentProcess()); NtGdiDeleteObject(Window->UpdateRegion); Window->UpdateRegion = NULL; } @@ -332,7 +342,11 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags) { NtGdiCombineRgn(Window->NCUpdateRegion, Window->NCUpdateRegion, hRgnNonClient, RGN_OR); - NtGdiDeleteObject(hRgnNonClient); + if (NULL != hRgnNonClient) + { + GDIOBJ_SetOwnership(hRgnNonClient, PsGetCurrentProcess()); + NtGdiDeleteObject(hRgnNonClient); + } } NtGdiDeleteObject(hRgnWindow); @@ -736,6 +750,7 @@ NtUserBeginPaint(HWND hWnd, PAINTSTRUCT* lPs) NtGdiOffsetRect(&lPs->rcPaint, Window->WindowRect.left - Window->ClientRect.left, Window->WindowRect.top - Window->ClientRect.top); + GDIOBJ_SetOwnership(Window->UpdateRegion, PsGetCurrentProcess()); NtGdiDeleteObject(Window->UpdateRegion); Window->UpdateRegion = NULL; } From c417fd21b1701b83db15216b15e45a63682c8778 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sat, 13 Mar 2004 18:14:04 +0000 Subject: [PATCH 0468/1463] - Split LdrpProcessImportDirectory into LdrpProcessImportDirectory and LdrpProcessImportDirectoryEntry. Sometimes it is necessary to process a single entry from import directory and sometimes it is necessary to process all entries with the same name. svn path=/trunk/; revision=8684 --- reactos/lib/ntdll/ldr/utils.c | 226 ++++++++++++++++++---------------- 1 file changed, 121 insertions(+), 105 deletions(-) diff --git a/reactos/lib/ntdll/ldr/utils.c b/reactos/lib/ntdll/ldr/utils.c index 9a13ab00d9a..73f77a9dfed 100644 --- a/reactos/lib/ntdll/ldr/utils.c +++ b/reactos/lib/ntdll/ldr/utils.c @@ -1,4 +1,4 @@ -/* $Id: utils.c,v 1.83 2004/03/06 20:32:06 navaraf Exp $ +/* $Id: utils.c,v 1.84 2004/03/13 18:14:04 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1416,11 +1416,10 @@ LdrpGetOrLoadModule(PWCHAR SerachPath, } static NTSTATUS -LdrpProcessImportDirectory( +LdrpProcessImportDirectoryEntry( PLDR_MODULE Module, PLDR_MODULE ImportedModule, - PIMAGE_IMPORT_MODULE_DIRECTORY ImportModuleDirectory, - PCHAR ImportedName) + PIMAGE_IMPORT_MODULE_DIRECTORY ImportModuleDirectory) { NTSTATUS Status; PVOID* ImportAddressList; @@ -1430,37 +1429,9 @@ LdrpProcessImportDirectory( ULONG Ordinal; ULONG IATSize; - DPRINT("LdrpProcessImportDirectory(%x '%wZ', '%s')\n", - Module, &Module->BaseDllName, ImportedName); - - if (ImportModuleDirectory == NULL) + if (ImportModuleDirectory == NULL || ImportModuleDirectory->dwRVAModuleName == 0) { - PCHAR Name; - - ImportModuleDirectory = (PIMAGE_IMPORT_MODULE_DIRECTORY) - RtlImageDirectoryEntryToData(Module->BaseAddress, - TRUE, - IMAGE_DIRECTORY_ENTRY_IMPORT, - NULL); - if (ImportModuleDirectory == NULL) - { - return STATUS_UNSUCCESSFUL; - } - - while (ImportModuleDirectory->dwRVAModuleName) - { - Name = (PCHAR)Module->BaseAddress + ImportModuleDirectory->dwRVAModuleName; - if (0 == _stricmp(Name, ImportedName)) - { - break; - } - ImportModuleDirectory++; - } - - if (ImportModuleDirectory->dwRVAModuleName == 0) - { - return STATUS_UNSUCCESSFUL; - } + return STATUS_UNSUCCESSFUL; } /* Get the import address list. */ @@ -1483,41 +1454,41 @@ LdrpProcessImportDirectory( IATSize++; } - /* Unprotect the region we are about to write into. */ - IATBase = (PVOID)ImportAddressList; - Status = NtProtectVirtualMemory(NtCurrentProcess(), + /* Unprotect the region we are about to write into. */ + IATBase = (PVOID)ImportAddressList; + Status = NtProtectVirtualMemory(NtCurrentProcess(), IATBase, IATSize * sizeof(PVOID*), PAGE_READWRITE, &OldProtect); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to unprotect IAT.\n"); - return(Status); - } + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to unprotect IAT.\n"); + return(Status); + } - /* Walk through function list and fixup addresses. */ - while (*FunctionNameList != 0L) - { - if ((*FunctionNameList) & 0x80000000) - { - Ordinal = (*FunctionNameList) & 0x7fffffff; - *ImportAddressList = LdrGetExportByOrdinal(ImportedModule->BaseAddress, Ordinal); - } - else - { - IMAGE_IMPORT_BY_NAME *pe_name; - pe_name = RVA(Module->BaseAddress, *FunctionNameList); - *ImportAddressList = LdrGetExportByName(ImportedModule->BaseAddress, pe_name->Name, pe_name->Hint); - if ((*ImportAddressList) == NULL) - { - DPRINT1("Failed to import %s\n", pe_name->Name); - return STATUS_UNSUCCESSFUL; - } - } - ImportAddressList++; - FunctionNameList++; - } + /* Walk through function list and fixup addresses. */ + while (*FunctionNameList != 0L) + { + if ((*FunctionNameList) & 0x80000000) + { + Ordinal = (*FunctionNameList) & 0x7fffffff; + *ImportAddressList = LdrGetExportByOrdinal(ImportedModule->BaseAddress, Ordinal); + } + else + { + IMAGE_IMPORT_BY_NAME *pe_name; + pe_name = RVA(Module->BaseAddress, *FunctionNameList); + *ImportAddressList = LdrGetExportByName(ImportedModule->BaseAddress, pe_name->Name, pe_name->Hint); + if ((*ImportAddressList) == NULL) + { + DPRINT1("Failed to import %s\n", pe_name->Name); + return STATUS_UNSUCCESSFUL; + } + } + ImportAddressList++; + FunctionNameList++; + } /* Protect the region we are about to write into. */ Status = NtProtectVirtualMemory(NtCurrentProcess(), @@ -1534,10 +1505,55 @@ LdrpProcessImportDirectory( return STATUS_SUCCESS; } +static NTSTATUS +LdrpProcessImportDirectory( + PLDR_MODULE Module, + PLDR_MODULE ImportedModule, + PCHAR ImportedName) +{ + NTSTATUS Status; + PIMAGE_IMPORT_MODULE_DIRECTORY ImportModuleDirectory; + PCHAR Name; -NTSTATUS LdrpAdjustImportDirectory(PLDR_MODULE Module, - PLDR_MODULE ImportedModule, - PUCHAR ImportedName) + DPRINT("LdrpProcessImportDirectory(%x '%wZ', '%s')\n", + Module, &Module->BaseDllName, ImportedName); + + + ImportModuleDirectory = (PIMAGE_IMPORT_MODULE_DIRECTORY) + RtlImageDirectoryEntryToData(Module->BaseAddress, + TRUE, + IMAGE_DIRECTORY_ENTRY_IMPORT, + NULL); + if (ImportModuleDirectory == NULL) + { + return STATUS_UNSUCCESSFUL; + } + + while (ImportModuleDirectory->dwRVAModuleName) + { + Name = (PCHAR)Module->BaseAddress + ImportModuleDirectory->dwRVAModuleName; + if (0 == _stricmp(Name, ImportedName)) + { + Status = LdrpProcessImportDirectoryEntry(Module, + ImportedModule, + ImportModuleDirectory); + if (!NT_SUCCESS(Status)) + { + return Status; + } + } + ImportModuleDirectory++; + } + + + return STATUS_SUCCESS; +} + + +static NTSTATUS +LdrpAdjustImportDirectory(PLDR_MODULE Module, + PLDR_MODULE ImportedModule, + PUCHAR ImportedName) { PIMAGE_IMPORT_MODULE_DIRECTORY ImportModuleDirectory; NTSTATUS Status; @@ -1591,46 +1607,46 @@ NTSTATUS LdrpAdjustImportDirectory(PLDR_MODULE Module, IATSize++; } - /* Unprotect the region we are about to write into. */ - IATBase = (PVOID)ImportAddressList; - Status = NtProtectVirtualMemory(NtCurrentProcess(), - IATBase, - IATSize * sizeof(PVOID*), - PAGE_READWRITE, - &OldProtect); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to unprotect IAT.\n"); - return(Status); - } + /* Unprotect the region we are about to write into. */ + IATBase = (PVOID)ImportAddressList; + Status = NtProtectVirtualMemory(NtCurrentProcess(), + IATBase, + IATSize * sizeof(PVOID*), + PAGE_READWRITE, + &OldProtect); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to unprotect IAT.\n"); + return(Status); + } - NTHeaders = RtlImageNtHeader (ImportedModule->BaseAddress); - Start = (PVOID)NTHeaders->OptionalHeader.ImageBase; - End = Start + ImportedModule->SizeOfImage; - Offset = ImportedModule->BaseAddress - Start; + NTHeaders = RtlImageNtHeader (ImportedModule->BaseAddress); + Start = (PVOID)NTHeaders->OptionalHeader.ImageBase; + End = Start + ImportedModule->SizeOfImage; + Offset = ImportedModule->BaseAddress - Start; - /* Walk through function list and fixup addresses. */ - while (*FunctionNameList != 0L) - { - if (*ImportAddressList >= Start && *ImportAddressList < End) + /* Walk through function list and fixup addresses. */ + while (*FunctionNameList != 0L) + { + if (*ImportAddressList >= Start && *ImportAddressList < End) { (*ImportAddressList) += Offset; } - ImportAddressList++; - FunctionNameList++; - } + ImportAddressList++; + FunctionNameList++; + } - /* Protect the region we are about to write into. */ - Status = NtProtectVirtualMemory(NtCurrentProcess(), - IATBase, - IATSize * sizeof(PVOID*), - OldProtect, - &OldProtect); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to protect IAT.\n"); - return(Status); - } + /* Protect the region we are about to write into. */ + Status = NtProtectVirtualMemory(NtCurrentProcess(), + IATBase, + IATSize * sizeof(PVOID*), + OldProtect, + &OldProtect); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to protect IAT.\n"); + return(Status); + } } ImportModuleDirectory++; } @@ -1733,7 +1749,7 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL, { TRACE_LDR("%wZ has stale binding to %wZ\n", &Module->BaseDllName, &ImportedModule->BaseDllName); - Status = LdrpProcessImportDirectory(Module, ImportedModule, NULL, ImportedName); + Status = LdrpProcessImportDirectory(Module, ImportedModule, ImportedName); if (!NT_SUCCESS(Status)) { DPRINT1("failed to import %s\n", ImportedName); @@ -1794,7 +1810,7 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL, if (WrongForwarder || ImportedModule->Flags & IMAGE_NOT_AT_BASE) { - Status = LdrpProcessImportDirectory(Module, ImportedModule, NULL, ImportedName); + Status = LdrpProcessImportDirectory(Module, ImportedModule, ImportedName); if (!NT_SUCCESS(Status)) { DPRINT1("failed to import %s\n", ImportedName); @@ -1820,7 +1836,7 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL, */ TRACE_LDR("Stale BIND %s from %wZ\n", ImportedName, &Module->BaseDllName); - Status = LdrpProcessImportDirectory(Module, ImportedModule, NULL, ImportedName); + Status = LdrpProcessImportDirectory(Module, ImportedModule, ImportedName); if (!NT_SUCCESS(Status)) { DPRINT1("faild to import %s\n", ImportedName); @@ -1858,7 +1874,7 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL, TRACE_LDR("Initializing imports for %wZ from %s\n", &Module->BaseDllName, ImportedName); - Status = LdrpProcessImportDirectory(Module, ImportedModule, ImportModuleDirectoryCurrent, ImportedName); + Status = LdrpProcessImportDirectoryEntry(Module, ImportedModule, ImportModuleDirectoryCurrent); if (!NT_SUCCESS(Status)) { DPRINT1("failed to import %s\n", ImportedName); From ff3151887b08bb28a5e41b307198f8799a1c84ae Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Sat, 13 Mar 2004 18:21:57 +0000 Subject: [PATCH 0469/1463] - Added basic tracing, breakpoints and disassembly to the kernel debugger. svn path=/trunk/; revision=8685 --- reactos/ntoskrnl/Makefile | 4 +- reactos/ntoskrnl/dbg/i386/kdb_help.S | 110 +++- reactos/ntoskrnl/dbg/kdb.c | 647 +++++++++++++++++++- reactos/ntoskrnl/include/internal/i386/ke.h | 12 +- reactos/ntoskrnl/ke/catch.c | 6 +- reactos/ntoskrnl/ke/i386/trap.s | 37 +- 6 files changed, 759 insertions(+), 57 deletions(-) diff --git a/reactos/ntoskrnl/Makefile b/reactos/ntoskrnl/Makefile index 3ec1c62db62..7f47e510975 100644 --- a/reactos/ntoskrnl/Makefile +++ b/reactos/ntoskrnl/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.117 2004/03/08 08:05:27 navaraf Exp $ +# $Id: Makefile,v 1.118 2004/03/13 18:21:56 dwelch Exp $ # # ReactOS Operating System # @@ -28,7 +28,7 @@ endif ifeq ($(KDBG), 1) OBJECTS_KDBG := dbg/kdb.o dbg/kdb_serial.o dbg/kdb_keyboard.o dbg/rdebug.o \ dbg/i386/kdb_help.o dbg/kdb_stabs.o dbg/profile.o \ - ../dk/w32/lib/kjs.a + ../dk/w32/lib/kjs.a dbg/i386/i386-dis.o CFLAGS += -I../lib/kjs/include preall: all diff --git a/reactos/ntoskrnl/dbg/i386/kdb_help.S b/reactos/ntoskrnl/dbg/i386/kdb_help.S index 9eee6a34a71..18b58cf3803 100644 --- a/reactos/ntoskrnl/dbg/i386/kdb_help.S +++ b/reactos/ntoskrnl/dbg/i386/kdb_help.S @@ -1,35 +1,31 @@ #include <internal/ke.h> #include <internal/i386/segment.h> + .data +_KdbEipTemp: + .int 0 + + .text .globl _KdbEnter _KdbEnter: /* - * Set up a stack frame - */ - pushl %ebp - movl %esp, %ebp + * Record when we are inside the debugger. + */ + incl _KdbEntryCount /* - * Save registers - */ - pushl %edi - pushl %esi - pushl %ebx - + * Save the callers eip. + */ + popl _KdbEipTemp + /* * Set up a trap frame */ - pushl $0 /* V86_Gs */ - pushl $0 /* V86_Fs */ - pushl $0 /* V86_Ds */ - pushl $0 /* V86_Es */ - pushl %ss /* Ss */ - pushl %ebp /* Esp */ pushfl /* Eflags */ pushl %cs /* Cs */ - pushl 4(%ebp) /* Eip */ + pushl _KdbEipTemp /* Eip */ pushl $0 /* ErrorCode */ - pushl 0(%ebp) /* Ebp */ + pushl %ebp /* Ebp */ pushl %ebx /* Ebx */ pushl %esi /* Esi */ pushl %edi /* Edi */ @@ -42,12 +38,21 @@ _KdbEnter: pushl %ds /* Ds */ pushl %es /* Es */ pushl %gs /* Gs */ - pushl $0 /* Dr7 */ - pushl $0 /* Dr6 */ - pushl $0 /* Dr3 */ - pushl $0 /* Dr2 */ - pushl $0 /* Dr1 */ - pushl $0 /* Dr0 */ + movl %dr7, %eax + pushl %eax /* Dr7 */ + /* Clear all breakpoint enables in dr7. */ + andl $0xFFFF0000, %eax + movl %eax, %dr7 + movl %dr6, %eax + pushl %eax /* Dr6 */ + movl %dr3, %eax + pushl %eax /* Dr3 */ + movl %dr2, %eax + pushl %eax /* Dr2 */ + movl %dr1, %eax + pushl %eax /* Dr1 */ + movl %dr0, %eax + pushl %eax /* Dr0 */ pushl $0 /* TempEip */ pushl $0 /* TempCs */ pushl $0 /* DebugPointer */ @@ -66,23 +71,60 @@ _KdbEnter: call _KdbInternalEnter /* - * Pop the argument and destroy the trap frame + * Pop the argument */ - popl %eax - addl $KTRAP_FRAME_SIZE, %esp + popl %eax /* - * Restore registers + * Ignore unused portions of the trap frame. */ - popl %ebx - popl %esi - popl %edi + popl %eax /* DebugEbp */ + popl %eax /* DebugEip */ + popl %eax /* DebugArgMark */ + popl %eax /* DebugPointer */ + popl %eax /* TempCs */ + popl %eax /* TempEip */ + popl %eax /* Dr0 */ + movl %eax, %dr0 + popl %eax /* Dr1 */ + movl %eax, %dr1 + popl %eax /* Dr2 */ + movl %eax, %dr2 + popl %eax /* Dr3 */ + movl %eax, %dr3 + popl %eax /* Dr6 */ + movl %eax, %dr6 + popl %eax /* Dr7 */ + movl %eax, %dr7 /* - * Return + * Restore registers including any that might have been changed + * inside the debugger. */ - popl %ebp - ret + popl %gs /* Gs */ + popl %es /* Es */ + popl %ds /* Ds */ + popl %edx /* Edx */ + popl %ecx /* Ecx */ + popl %eax /* Eax */ + addl $4, %esp /* PreviousMode */ + addl $4, %esp /* ExceptionList */ + popl %fs /* Fs */ + popl %edi /* Edi */ + popl %esi /* Esi */ + popl %ebx /* Ebx */ + popl %ebp /* Ebp */ + addl $4, %esp /* ErrorCode */ + + /* + * Record when we are in the debugger. + */ + decl _KdbEntryCount + + /* + * Return to the caller. + */ + iret diff --git a/reactos/ntoskrnl/dbg/kdb.c b/reactos/ntoskrnl/dbg/kdb.c index 1b95b1762fd..21e0b3235a4 100644 --- a/reactos/ntoskrnl/dbg/kdb.c +++ b/reactos/ntoskrnl/dbg/kdb.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: kdb.c,v 1.18 2004/02/24 21:25:40 weiden Exp $ +/* $Id: kdb.c,v 1.19 2004/03/13 18:21:56 dwelch Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/dbg/kdb.c @@ -34,6 +34,8 @@ #include <internal/ps.h> #include <limits.h> #include <internal/kd.h> +#include <internal/mm.h> +#include <internal/i386/mm.h> #include "kdb.h" #include "kjs.h" @@ -46,9 +48,32 @@ #define BS 8 #define DEL 127 +#define UPARROW 56 BOOL KbdEchoOn = TRUE; +typedef struct +{ + BOOLEAN Enabled; + BOOLEAN Temporary; + BOOLEAN Assigned; + ULONG Address; + UCHAR SavedInst; +} KDB_ACTIVE_BREAKPOINT; + +#define KDB_MAXIMUM_BREAKPOINT_COUNT (255) + +static ULONG KdbBreakPointCount = 0; +static KDB_ACTIVE_BREAKPOINT + KdbActiveBreakPoints[KDB_MAXIMUM_BREAKPOINT_COUNT]; + +static BOOLEAN KdbIgnoreNextSingleStep = FALSE; + +static ULONG KdbLastSingleStepFrom = 0xFFFFFFFF; +static BOOLEAN KdbEnteredOnSingleStep = FALSE; + +ULONG KdbEntryCount = 0; + int isalpha( int ); VOID PsDumpThreads(BOOLEAN System); @@ -84,6 +109,20 @@ ULONG DbgEnableFileCommand(ULONG Argc, PCH Argv[], PKTRAP_FRAME Tf); ULONG DbgDisableFileCommand(ULONG Argc, PCH Argv[], PKTRAP_FRAME Tf); +ULONG +DbgDisassemble(ULONG Argc, PCH Argv[], PKTRAP_FRAME Tf); +ULONG +DbgSetBreakPoint(ULONG Argc, PCH Argv[], PKTRAP_FRAME Tf); +ULONG +DbgDeleteBreakPoint(ULONG Argc, PCH Argv[], PKTRAP_FRAME Tf); +ULONG +DbgSetMemoryBreakPoint(ULONG Argc, PCH Argv[], PKTRAP_FRAME Tf); +ULONG +DbgStep(ULONG Argc, PCH Argv[], PKTRAP_FRAME Tf); +ULONG +DbgStepOver(ULONG Argc, PCH Argv[], PKTRAP_FRAME Tf); +ULONG +DbgFinish(ULONG Argc, PCH Argv[], PKTRAP_FRAME Tf); struct { @@ -107,12 +146,28 @@ struct {"efile", "efile <filename>", "Enable debug prints from file", DbgEnableFileCommand}, {"dfile", "dfile <filename>", "Disable debug prints from file", DbgDisableFileCommand}, {"js", "js", "Script mode", DbgScriptCommand}, + {"disasm", "disasm <address>", "Disables 10 instructions at <address> or " + "eip", DbgDisassemble}, + {"bp", "bp <address>", "Sets an int3 breakpoint at a given address", + DbgSetBreakPoint}, + {"bc", "bc <breakpoint number>", "Deletes a breakpoint", + DbgDeleteBreakPoint}, + {"ba", "ba <debug register> <access type> <length> <address>", + "Sets a breakpoint using a debug register", DbgSetMemoryBreakPoint}, + {"t", "t", "Steps forward a single instructions", DbgStep}, + {"p", "p", "Steps forward a single instructions skipping calls", + DbgStepOver}, + {"finish", "finish", "Runs until the current function exits", DbgFinish}, {"help", "help", "Display help screen", DbgProcessHelpCommand}, {NULL, NULL, NULL} }; volatile DWORD x_dr0 = 0, x_dr1 = 0, x_dr2 = 0, x_dr3 = 0, x_dr7 = 0; +extern LONG KdbDisassemble(ULONG Address); +extern LONG KdbGetInstLength(ULONG Address); +extern NTSTATUS MmGetPageEntry2(PVOID PAddress, PULONG* Pte, BOOLEAN MayWait); + /* FUNCTIONS *****************************************************************/ /* @@ -206,6 +261,7 @@ KdbGetCommand(PCH Buffer) { CHAR Key; PCH Orig = Buffer; + static UCHAR LastCommand[256] = ""; KbdEchoOn = !((KdDebugState & KD_DEBUG_KDNOECHO) != 0); @@ -219,7 +275,19 @@ KdbGetCommand(PCH Buffer) if (Key == '\r' || Key == '\n') { DbgPrint("\n"); - *Buffer = 0; + /* + Repeat the last command if the user presses enter. Reduces the + risk of RSI when single-stepping. + */ + if (Buffer == Orig) + { + strcpy(Buffer, LastCommand); + } + else + { + *Buffer = 0; + strcpy(LastCommand, Orig); + } return; } else if (Key == BS || Key == DEL) @@ -234,6 +302,26 @@ KdbGetCommand(PCH Buffer) DbgPrint(" %c", BS); } } + else if (Key == UPARROW) + { + ULONG i; + while (Buffer > Orig) + { + Buffer--; + *Buffer = 0; + if (KbdEchoOn) + DbgPrint("%c %c", BS, BS); + else + DbgPrint(" %c", BS); + } + for (i = 0; LastCommand[i] != 0; i++) + { + if (KbdEchoOn) + DbgPrint("%c", LastCommand[i]); + *Buffer = LastCommand[i]; + Buffer++; + } + } else { if (KbdEchoOn) @@ -245,6 +333,444 @@ KdbGetCommand(PCH Buffer) } } +BOOLEAN STATIC +KdbDecodeAddress(PUCHAR Buffer, PULONG Address) +{ + while (isspace(*Buffer)) + { + Buffer++; + } + if (Buffer[0] == '<') + { + PUCHAR ModuleName = Buffer + 1; + PUCHAR AddressString = strpbrk(Buffer, ":"); + extern LIST_ENTRY ModuleTextListHead; + PLIST_ENTRY current_entry; + MODULE_TEXT_SECTION* current; + static WCHAR ModuleNameW[256]; + ULONG i; + + if (AddressString == NULL) + { + DbgPrint("Address %x is malformed.\n", Buffer); + return(FALSE); + } + *AddressString = 0; + AddressString++; + while (isspace(*AddressString)) + { + AddressString++; + } + + for (i = 0; ModuleName[i] != 0 && !isspace(ModuleName[i]); i++) + { + ModuleNameW[i] = (WCHAR)ModuleName[i]; + } + ModuleNameW[i] = 0; + + /* Find the module. */ + current_entry = ModuleTextListHead.Flink; + + while (current_entry != &ModuleTextListHead && + current_entry != NULL) + { + current = + CONTAINING_RECORD(current_entry, MODULE_TEXT_SECTION, ListEntry); + if (wcscmp(ModuleNameW, current->Name) == 0) + { + break; + } + current_entry = current_entry->Flink; + } + if (current_entry == NULL || current_entry == &ModuleTextListHead) + { + DbgPrint("Couldn't find module %s.\n", ModuleName); + return(FALSE); + } + *Address = current->Base; + *Address += strtoul(AddressString, NULL, 16); + return(TRUE); + } + else + { + *Address = strtoul(Buffer, NULL, 0); + return(TRUE); + } +} + +NTSTATUS STATIC +KdbOverwriteInst(ULONG Address, PUCHAR PreviousInst, UCHAR NewInst) +{ + PULONG BreakPtePtr; + ULONG SavedPte; + NTSTATUS Status; + /* Get the pte for the page containing the address. */ + Status = + MmGetPageEntry2((PVOID)PAGE_ROUND_DOWN(Address), &BreakPtePtr, FALSE); + /* Return if that page isn't present. */ + if (!NT_SUCCESS(Status)) + { + return(Status); + } + if (!((*BreakPtePtr) & (1 << 0))) + { + return(STATUS_MEMORY_NOT_ALLOCATED); + } + /* Saved the old pte and enable write permissions. */ + SavedPte = *BreakPtePtr; + (*BreakPtePtr) |= (1 << 1); + /* Flush the TLB. */ + __asm__ __volatile__ ("movl %%cr3, %%eax\n\t" + "movl %%eax, %%cr3\n\t" + : : : "memory", "eax"); + /* Copy the old instruction back to the caller. */ + if (PreviousInst != NULL) + { + Status = MmSafeCopyFromUser(PreviousInst, (PUCHAR)Address, 1); + if (!NT_SUCCESS(Status)) + { + return(Status); + } + } + /* Copy the new instruction in its place. */ + Status = MmSafeCopyToUser((PUCHAR)Address, &NewInst, 1); + if (!NT_SUCCESS(Status)) + { + return(Status); + } + /* Restore the old pte. */ + *BreakPtePtr = SavedPte; + /* And flush the tlb again. */ + __asm__ __volatile__ ("movl %%cr3, %%eax\n\t" + "movl %%eax, %%cr3\n\t" + : : : "memory", "eax"); + return(STATUS_SUCCESS); +} + + +VOID STATIC +KdbRenableBreakPoints(VOID) +{ + ULONG i; + for (i = 0; i < KDB_MAXIMUM_BREAKPOINT_COUNT; i++) + { + if (KdbActiveBreakPoints[i].Assigned && + !KdbActiveBreakPoints[i].Enabled) + { + KdbActiveBreakPoints[i].Enabled = TRUE; + (VOID)KdbOverwriteInst(KdbActiveBreakPoints[i].Address, + &KdbActiveBreakPoints[i].SavedInst, + 0xCC); + } + } +} + +LONG STATIC +KdbIsBreakPointOurs(PKTRAP_FRAME Tf) +{ + ULONG i; + for (i = 0; i < KDB_MAXIMUM_BREAKPOINT_COUNT; i++) + { + if (KdbActiveBreakPoints[i].Assigned && + KdbActiveBreakPoints[i].Address == (Tf->Eip - 1)) + { + return(i); + } + } + return(-1); +} + +VOID STATIC +KdbDeleteBreakPoint(ULONG BreakPointNr) +{ + KdbBreakPointCount--; + KdbActiveBreakPoints[BreakPointNr].Assigned = FALSE; +} + +NTSTATUS STATIC +KdbInsertBreakPoint(ULONG Address, BOOLEAN Temporary) +{ + NTSTATUS Status; + UCHAR SavedInst; + ULONG i; + if (KdbBreakPointCount == KDB_MAXIMUM_BREAKPOINT_COUNT) + { + return(STATUS_UNSUCCESSFUL); + } + for (i = 0; i < KDB_MAXIMUM_BREAKPOINT_COUNT; i++) + { + if (!KdbActiveBreakPoints[i].Assigned) + { + break; + } + } + Status = KdbOverwriteInst(Address, &SavedInst, 0xCC); + if (!NT_SUCCESS(Status)) + { + return(Status); + } + KdbActiveBreakPoints[i].Assigned = TRUE; + KdbActiveBreakPoints[i].Enabled = TRUE; + KdbActiveBreakPoints[i].Address = Address; + KdbActiveBreakPoints[i].Temporary = Temporary; + KdbActiveBreakPoints[i].SavedInst = SavedInst; + return(STATUS_SUCCESS); +} + +ULONG +DbgSetBreakPoint(ULONG Argc, PCH Argv[], PKTRAP_FRAME Tf) +{ + ULONG Addr; + NTSTATUS Status; + ULONG i; + if (Argc < 2) + { + DbgPrint("Need an address to set the breakpoint at.\n"); + return(1); + } + /* Stitch the remaining arguments back into a single string. */ + for (i = 2; i < Argc; i++) + { + Argv[i][-1] = ' '; + } + if (!KdbDecodeAddress(Argv[1], &Addr)) + { + return(1); + } + DbgPrint("Setting breakpoint at 0x%X\n", Addr); + if (!NT_SUCCESS(Status = KdbInsertBreakPoint(Addr, FALSE))) + { + DbgPrint("Failed to set breakpoint (Status %X)\n", Status); + } + return(1); +} + +ULONG +DbgDeleteBreakPoint(ULONG Argc, PCH Argv[], PKTRAP_FRAME Tf) +{ + ULONG BreakPointNr; + if (Argc != 2) + { + DbgPrint("Need a breakpoint number to delete.\n"); + return(1); + } + BreakPointNr = strtoul(Argv[1], NULL, 10); + DbgPrint("Deleting breakpoint %d.\n", BreakPointNr); + KdbDeleteBreakPoint(BreakPointNr); + return(1); +} + +ULONG +DbgSetMemoryBreakPoint(ULONG Argc, PCH Argv[], PKTRAP_FRAME Tf) +{ + ULONG DebugRegNr; + UCHAR BreakType; + ULONG Length, Address; + ULONG Rw; + ULONG i; + if (Argc != 2 && Argc < 5) + { + DbgPrint("ba <0-3> <r|w|e> <1|2|4> <address>\n"); + return(1); + } + DebugRegNr = strtoul(Argv[1], NULL, 10); + if (DebugRegNr >= 4) + { + DbgPrint("Debug register number should be between 0 and 3.\n"); + return(1); + } + if (Argc == 2) + { + /* Clear the breakpoint. */ + Tf->Dr7 &= ~(0x3 << (DebugRegNr * 2)); + if ((Tf->Dr7 & 0xFF) == 0) + { + /* + If no breakpoints are enabled then + clear the exact match flags. + */ + Tf->Dr7 &= 0xFFFFFCFF; + } + return(1); + } + BreakType = Argv[2][0]; + if (BreakType != 'r' && BreakType != 'w' && BreakType != 'e') + { + DbgPrint("Access type to break on should be either 'r', 'w' or 'e'.\n"); + return(1); + } + Length = strtoul(Argv[3], NULL, 10); + if (Length != 1 && Length != 2 && Length != 4) + { + DbgPrint("Length of the breakpoint should be one, two or four.\n"); + return(1); + } + if (Length != 1 && BreakType == 'e') + { + DbgPrint("The length of an execution breakpoint should be one.\n"); + return(1); + } + /* Stitch the remaining arguments back into a single string. */ + for (i = 4; i < Argc; i++) + { + Argv[i][-1] = ' '; + } + if (!KdbDecodeAddress(Argv[4], &Address)) + { + return(1); + } + if ((Address & (Length - 1)) != 0) + { + DbgPrint("The breakpoint address should be aligned to a multiple of " + "the breakpoint length.\n"); + return(1); + } + + /* Set the breakpoint address. */ + switch (DebugRegNr) + { + case 0: Tf->Dr0 = Address; break; + case 1: Tf->Dr1 = Address; break; + case 2: Tf->Dr2 = Address; break; + case 3: Tf->Dr3 = Address; break; + } + /* Enable the breakpoint. */ + Tf->Dr7 |= (0x3 << (DebugRegNr * 2)); + /* Enable the exact match bits. */ + Tf->Dr7 |= 0x00000300; + /* Clear existing state. */ + Tf->Dr7 &= ~(0xF << (16 + (DebugRegNr * 4))); + /* Set the breakpoint type. */ + switch (BreakType) + { + case 'r': Rw = 3; break; + case 'w': Rw = 1; break; + case 'e': Rw = 0; break; + } + Tf->Dr7 |= (Rw << (16 + (DebugRegNr * 4))); + /* Set the breakpoint length. */ + Tf->Dr7 |= ((Length - 1) << (18 + (DebugRegNr * 4))); + + return(1); +} + +ULONG +DbgStep(ULONG Argc, PCH Argv[], PKTRAP_FRAME Tf) +{ + /* Set the single step flag and return to the interrupted code. */ + Tf->Eflags |= (1 << 8); + KdbIgnoreNextSingleStep = FALSE; + KdbLastSingleStepFrom = Tf->Eip; + return(0); +} + +ULONG +DbgStepOver(ULONG Argc, PCH Argv[], PKTRAP_FRAME Tf) +{ + PUCHAR Eip = (PUCHAR)Tf->Eip; + /* Check if the current instruction is a call. */ + while (Eip[0] == 0x66 || Eip[0] == 0x67) + { + Eip++; + } + if (Eip[0] == 0xE8 || Eip[0] == 0x9A || + (Eip[0] == 0xFF && (Eip[0] & 0x3C) == 0x10)) + { + ULONG NextInst = Tf->Eip + KdbGetInstLength(Tf->Eip); + KdbLastSingleStepFrom = Tf->Eip; + KdbInsertBreakPoint(NextInst, TRUE); + return(0); + } + else + { + return(DbgStep(Argc, Argv, Tf)); + } +} + +ULONG +DbgFinish(ULONG Argc, PCH Argv[], PKTRAP_FRAME Tf) +{ + PULONG Ebp = (PULONG)Tf->Ebp; + ULONG ReturnAddress; + NTSTATUS Status; + PKTHREAD CurrentThread; + + /* Check that ebp points onto the stack. */ + CurrentThread = KeGetCurrentThread(); + if (CurrentThread == NULL || + !(Ebp >= (PULONG)CurrentThread->StackLimit && + Ebp <= (PULONG)CurrentThread->StackBase)) + { + DbgPrint("This function doesn't appear to have a valid stack frame.\n"); + return(1); + } + + /* Get the address of the caller. */ + Status = MmSafeCopyFromUser(&ReturnAddress, Ebp + 1, sizeof(ULONG)); + if (!NT_SUCCESS(Status)) + { + DbgPrint("Memory access error (%X) while getting return address.\n", + Status); + return(1); + } + + /* Set a temporary breakpoint at that location. */ + Status = KdbInsertBreakPoint(ReturnAddress, TRUE); + if (!NT_SUCCESS(Status)) + { + DbgPrint("Couldn't set a temporary breakpoint at %X (Status %X)\n", + ReturnAddress, Status); + return(1); + } + + /* + Otherwise start running again and with any luck we will break back into + the debugger when the current function returns. + */ + return(0); +} + +ULONG +DbgDisassemble(ULONG Argc, PCH Argv[], PKTRAP_FRAME Tf) +{ + ULONG Address, i; + LONG InstLen; + if (Argc >= 2) + { + /* Stitch the remaining arguments back into a single string. */ + for (i = 2; i < Argc; i++) + { + Argv[i][-1] = ' '; + } + if (!KdbDecodeAddress(Argv[1], &Address)) + { + return(1); + } + } + else + { + Address = Tf->Eip; + } + for (i = 0; i < 10; i++) + { + if (!KdbPrintAddress((PVOID)Address)) + { + DbgPrint("<%x>", Address); + } + DbgPrint(": "); + InstLen = KdbDisassemble(Address); + if (InstLen < 0) + { + DbgPrint("<INVALID>\n"); + return(1); + } + DbgPrint("\n"); + Address += InstLen; + } + + return(1); +} + ULONG DbgProcessHelpCommand(ULONG Argc, PCH Argv[], PKTRAP_FRAME Tf) { @@ -979,7 +1505,25 @@ KdbMainLoop(PKTRAP_FRAME Tf) CHAR Command[256]; ULONG s; - DbgPrint("\nEntered kernel debugger (type \"help\" for a list of commands)\n"); + if (!KdbEnteredOnSingleStep) + { + DbgPrint("\nEntered kernel debugger (type \"help\" for a list of commands)\n"); + } + else + { + if (!KdbPrintAddress((PVOID)Tf->Eip)) + { + DbgPrint("<%x>", Tf->Eip); + } + DbgPrint(": "); + if (KdbDisassemble(Tf->Eip) < 0) + { + DbgPrint("<INVALID>"); + } + KdbEnteredOnSingleStep = FALSE; + KdbLastSingleStepFrom = 0xFFFFFFFF; + } + do { DbgPrint("\nkdb:> "); @@ -1004,8 +1548,99 @@ KdbEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord, PCONTEXT Context, PKTRAP_FRAME TrapFrame) { - DbgPrint("Entered debugger on exception number %d.\n", - TrapFrame->DebugArgMark); + LONG BreakPointNr; + ULONG ExpNr = (ULONG)TrapFrame->DebugArgMark; + + /* Exception inside the debugger? Game over. */ + if (KdbEntryCount > 0) + { + return(kdHandleException); + } + KdbEntryCount++; + + /* Clear the single step flag. */ + TrapFrame->Eflags &= ~(1 << 8); + /* + Reenable any breakpoints we disabled so we could execute the breakpointed + instructions. + */ + KdbRenableBreakPoints(); + /* Silently ignore a debugger initiated single step. */ + if (ExpNr == 1 && KdbIgnoreNextSingleStep) + { + KdbIgnoreNextSingleStep = FALSE; + KdbEntryCount--; + return(kdContinue); + } + /* If we stopped on one of our breakpoints then let the user know. */ + if (ExpNr == 3 && (BreakPointNr = KdbIsBreakPointOurs(TrapFrame)) >= 0) + { + DbgPrint("Entered debugger on breakpoint %d.\n", BreakPointNr); + /* + The breakpoint will point to the next instruction by default so + point it back to the start of original instruction. + */ + TrapFrame->Eip--; + /* + ..and restore the original instruction. + */ + (VOID)KdbOverwriteInst(TrapFrame->Eip, NULL, + KdbActiveBreakPoints[BreakPointNr].SavedInst); + /* + If this was a breakpoint set by the debugger then delete it otherwise + flag to enable it again after we step over this instruction. + */ + if (KdbActiveBreakPoints[BreakPointNr].Temporary) + { + KdbActiveBreakPoints[BreakPointNr].Assigned = FALSE; + KdbBreakPointCount--; + KdbEnteredOnSingleStep = TRUE; + } + else + { + KdbActiveBreakPoints[BreakPointNr].Enabled = FALSE; + TrapFrame->Eflags |= (1 << 8); + KdbIgnoreNextSingleStep = TRUE; + } + } + else if (ExpNr == 1) + { + if ((TrapFrame->Dr6 & 0xF) != 0) + { + DbgPrint("Entered debugger on memory breakpoint(s) %s%s%s%s.\n", + (TrapFrame->Dr6 & 0x1) ? "1" : "", + (TrapFrame->Dr6 & 0x2) ? "2" : "", + (TrapFrame->Dr6 & 0x4) ? "3" : "", + (TrapFrame->Dr6 & 0x8) ? "4" : ""); + } + else if (KdbLastSingleStepFrom != 0xFFFFFFFF) + { + KdbEnteredOnSingleStep = TRUE; + } + else + { + DbgPrint("Entered debugger on unexpected debug trap.\n"); + } + } + else + { + DbgPrint("Entered debugger on exception number %d.\n", ExpNr); + } KdbInternalEnter(TrapFrame); - return(kdHandleException); + KdbEntryCount--; + if (ExpNr != 1 && ExpNr != 3) + { + return(kdHandleException); + } + else + { + /* Clear dr6 status flags. */ + TrapFrame->Dr6 &= 0xFFFF1F00; + /* Set the RF flag to we don't trigger the same breakpoint again. */ + if (ExpNr == 1) + { + TrapFrame->Eflags |= (1 << 16); + } + return(kdContinue); + } } diff --git a/reactos/ntoskrnl/include/internal/i386/ke.h b/reactos/ntoskrnl/include/internal/i386/ke.h index a796cd07380..93d31c2ff03 100644 --- a/reactos/ntoskrnl/include/internal/i386/ke.h +++ b/reactos/ntoskrnl/include/internal/i386/ke.h @@ -79,12 +79,12 @@ typedef struct _KTRAP_FRAME PVOID DebugPointer; PVOID TempCs; PVOID TempEip; - PVOID Dr0; - PVOID Dr1; - PVOID Dr2; - PVOID Dr3; - PVOID Dr6; - PVOID Dr7; + ULONG Dr0; + ULONG Dr1; + ULONG Dr2; + ULONG Dr3; + ULONG Dr6; + ULONG Dr7; USHORT Gs; USHORT Reserved1; USHORT Es; diff --git a/reactos/ntoskrnl/ke/catch.c b/reactos/ntoskrnl/ke/catch.c index e715b1bf85f..2007b72f59b 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.40 2004/03/06 22:24:13 dwelch Exp $ +/* $Id: catch.c,v 1.41 2004/03/13 18:21:57 dwelch Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/catch.c @@ -88,6 +88,10 @@ KiDispatchException(PEXCEPTION_RECORD ExceptionRecord, else if (KdDebuggerEnabled && KdDebugState & KD_DEBUG_KDB) { Action = KdbEnterDebuggerException (ExceptionRecord, Context, Tf); + if (Action == kdContinue) + { + return; + } } #endif /* KDBG */ if (Action != kdHandleException) diff --git a/reactos/ntoskrnl/ke/i386/trap.s b/reactos/ntoskrnl/ke/i386/trap.s index fd712b74730..c465bdad5c4 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.18 2003/04/27 16:21:16 hbirr Exp $ +/* $Id: trap.s,v 1.19 2004/03/13 18:21:57 dwelch Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/i386/trap.s @@ -42,7 +42,19 @@ _KiTrapEpilog: jmp _KiV86Complete _KiTrapRet: /* Skip debug information and unsaved registers */ - addl $0x30, %esp + addl $0x18, %esp + popl %eax /* Dr0 */ + movl %eax, %dr0 + popl %eax /* Dr1 */ + movl %eax, %dr1 + popl %eax /* Dr2 */ + movl %eax, %dr2 + popl %eax /* Dr3 */ + movl %eax, %dr3 + popl %eax /* Dr6 */ + movl %eax, %dr6 + popl %eax /* Dr7 */ + movl %eax, %dr7 popl %gs popl %es popl %ds @@ -120,12 +132,21 @@ _KiTrapProlog: pushl %ds pushl %es pushl %gs - pushl $0 /* DR7 */ - pushl $0 /* DR6 */ - pushl $0 /* DR3 */ - pushl $0 /* DR2 */ - pushl $0 /* DR1 */ - pushl $0 /* DR0 */ + movl %dr7, %eax + pushl %eax /* Dr7 */ + /* Clear all breakpoint enables in dr7. */ + andl $0xFFFF0000, %eax + movl %eax, %dr7 + movl %dr6, %eax + pushl %eax /* Dr6 */ + movl %dr3, %eax + pushl %eax /* Dr3 */ + movl %dr2, %eax + pushl %eax /* Dr2 */ + movl %dr1, %eax + pushl %eax /* Dr1 */ + movl %dr0, %eax + pushl %eax /* Dr0 */ pushl $0 /* XXX: TempESP */ pushl $0 /* XXX: TempCS */ pushl $0 /* XXX: DebugPointer */ From 6849e40ba7e5edfa2f239f4a122df535a0598ca1 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Sat, 13 Mar 2004 18:26:13 +0000 Subject: [PATCH 0470/1463] - Added disassembler from gdb. svn path=/trunk/; revision=8686 --- reactos/ntoskrnl/dbg/i386/dis-asm.h | 331 ++ reactos/ntoskrnl/dbg/i386/i386-dis.c | 4298 ++++++++++++++++++++++++++ 2 files changed, 4629 insertions(+) create mode 100644 reactos/ntoskrnl/dbg/i386/dis-asm.h create mode 100644 reactos/ntoskrnl/dbg/i386/i386-dis.c diff --git a/reactos/ntoskrnl/dbg/i386/dis-asm.h b/reactos/ntoskrnl/dbg/i386/dis-asm.h new file mode 100644 index 00000000000..efd2bceefa0 --- /dev/null +++ b/reactos/ntoskrnl/dbg/i386/dis-asm.h @@ -0,0 +1,331 @@ +/* Interface between the opcode library and its callers. + + Copyright 2001, 2002 Free Software Foundation, Inc. + + 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, 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., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + Written by Cygnus Support, 1993. + + The opcode library (libopcodes.a) provides instruction decoders for + a large variety of instruction sets, callable with an identical + interface, for making instruction-processing programs more independent + of the instruction set being processed. */ + +#ifndef DIS_ASM_H +#define DIS_ASM_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if 0 +#include <stdio.h> +#include "bfd.h" +#endif + +typedef int (*fprintf_ftype) PARAMS((PTR, const char*, ...)); + +enum dis_insn_type { + dis_noninsn, /* Not a valid instruction */ + dis_nonbranch, /* Not a branch instruction */ + dis_branch, /* Unconditional branch */ + dis_condbranch, /* Conditional branch */ + dis_jsr, /* Jump to subroutine */ + dis_condjsr, /* Conditional jump to subroutine */ + dis_dref, /* Data reference instruction */ + dis_dref2 /* Two data references in instruction */ +}; + +/* This struct is passed into the instruction decoding routine, + and is passed back out into each callback. The various fields are used + for conveying information from your main routine into your callbacks, + for passing information into the instruction decoders (such as the + addresses of the callback functions), or for passing information + back from the instruction decoders to their callers. + + It must be initialized before it is first passed; this can be done + by hand, or using one of the initialization macros below. */ + +typedef struct disassemble_info { + fprintf_ftype fprintf_func; + PTR stream; + PTR application_data; + + /* Target description. We could replace this with a pointer to the bfd, + but that would require one. There currently isn't any such requirement + so to avoid introducing one we record these explicitly. */ + /* The bfd_flavour. This can be bfd_target_unknown_flavour. */ + enum bfd_flavour flavour; + /* The bfd_arch value. */ + enum bfd_architecture arch; + /* The bfd_mach value. */ + unsigned long mach; +#if 0 + enum bfd_endian endian; +#endif + /* An arch/mach-specific bitmask of selected instruction subsets, mainly + for processors with run-time-switchable instruction sets. The default, + zero, means that there is no constraint. CGEN-based opcodes ports + may use ISA_foo masks. */ + unsigned long insn_sets; + +#if 0 + /* Some targets need information about the current section to accurately + display insns. If this is NULL, the target disassembler function + will have to make its best guess. */ + asection *section; + + /* An array of pointers to symbols either at the location being disassembled + or at the start of the function being disassembled. The array is sorted + so that the first symbol is intended to be the one used. The others are + present for any misc. purposes. This is not set reliably, but if it is + not NULL, it is correct. */ + asymbol **symbols; + /* Number of symbols in array. */ + int num_symbols; +#endif + /* For use by the disassembler. + The top 16 bits are reserved for public use (and are documented here). + The bottom 16 bits are for the internal use of the disassembler. */ + unsigned long flags; +#define INSN_HAS_RELOC 0x80000000 + PTR private_data; + + /* Function used to get bytes to disassemble. MEMADDR is the + address of the stuff to be disassembled, MYADDR is the address to + put the bytes in, and LENGTH is the number of bytes to read. + INFO is a pointer to this struct. + Returns an errno value or 0 for success. */ + int (*read_memory_func) + PARAMS ((bfd_vma memaddr, bfd_byte *myaddr, unsigned int length, + struct disassemble_info *info)); + + /* Function which should be called if we get an error that we can't + recover from. STATUS is the errno value from read_memory_func and + MEMADDR is the address that we were trying to read. INFO is a + pointer to this struct. */ + void (*memory_error_func) + PARAMS ((int status, bfd_vma memaddr, struct disassemble_info *info)); + + /* Function called to print ADDR. */ + void (*print_address_func) + PARAMS ((bfd_vma addr, struct disassemble_info *info)); + + /* Function called to determine if there is a symbol at the given ADDR. + If there is, the function returns 1, otherwise it returns 0. + This is used by ports which support an overlay manager where + the overlay number is held in the top part of an address. In + some circumstances we want to include the overlay number in the + address, (normally because there is a symbol associated with + that address), but sometimes we want to mask out the overlay bits. */ + int (* symbol_at_address_func) + PARAMS ((bfd_vma addr, struct disassemble_info * info)); + + /* These are for buffer_read_memory. */ + bfd_byte *buffer; + bfd_vma buffer_vma; + unsigned int buffer_length; + + /* This variable may be set by the instruction decoder. It suggests + the number of bytes objdump should display on a single line. If + the instruction decoder sets this, it should always set it to + the same value in order to get reasonable looking output. */ + int bytes_per_line; + + /* the next two variables control the way objdump displays the raw data */ + /* For example, if bytes_per_line is 8 and bytes_per_chunk is 4, the */ + /* output will look like this: + 00: 00000000 00000000 + with the chunks displayed according to "display_endian". */ + int bytes_per_chunk; + enum bfd_endian display_endian; + + /* Number of octets per incremented target address + Normally one, but some DSPs have byte sizes of 16 or 32 bits. */ + unsigned int octets_per_byte; + + /* Results from instruction decoders. Not all decoders yet support + this information. This info is set each time an instruction is + decoded, and is only valid for the last such instruction. + + To determine whether this decoder supports this information, set + insn_info_valid to 0, decode an instruction, then check it. */ + + char insn_info_valid; /* Branch info has been set. */ + char branch_delay_insns; /* How many sequential insn's will run before + a branch takes effect. (0 = normal) */ + char data_size; /* Size of data reference in insn, in bytes */ + enum dis_insn_type insn_type; /* Type of instruction */ + bfd_vma target; /* Target address of branch or dref, if known; + zero if unknown. */ + bfd_vma target2; /* Second target address for dref2 */ + + /* Command line options specific to the target disassembler. */ + char * disassembler_options; + +} disassemble_info; + + +/* Standard disassemblers. Disassemble one instruction at the given + target address. Return number of octets processed. */ +typedef int (*disassembler_ftype) + PARAMS((bfd_vma, disassemble_info *)); + +extern int print_insn_big_mips PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_little_mips PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_i386 PARAMS ((bfd_vma, disassemble_info *)); +extern int print_insn_i386_att PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_i386_intel PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_ia64 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_i370 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_m68hc11 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_m68hc12 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_m68k PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_z8001 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_z8002 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_h8300 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_h8300h PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_h8300s PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_h8500 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_alpha PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_big_arm PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_little_arm PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_sparc PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_big_a29k PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_little_a29k PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_avr PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_d10v PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_d30v PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_dlx PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_fr30 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_hppa PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_i860 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_i960 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_ip2k PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_m32r PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_m88k PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_mcore PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_mmix PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_mn10200 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_mn10300 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_msp430 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_ns32k PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_openrisc PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_big_or32 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_little_or32 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_pdp11 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_pj PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_big_powerpc PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_little_powerpc PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_rs6000 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_s390 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_sh PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_tic30 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_tic4x PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_tic54x PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_tic80 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_v850 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_vax PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_w65 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_xstormy16 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_sh64 PARAMS ((bfd_vma, disassemble_info *)); +extern int print_insn_sh64x_media PARAMS ((bfd_vma, disassemble_info *)); +extern int print_insn_frv PARAMS ((bfd_vma, disassemble_info *)); +extern int print_insn_iq2000 PARAMS ((bfd_vma, disassemble_info *)); + +extern disassembler_ftype arc_get_disassembler PARAMS ((void *)); +extern disassembler_ftype cris_get_disassembler PARAMS ((bfd *)); + +extern void print_mips_disassembler_options PARAMS ((FILE *)); +extern void print_ppc_disassembler_options PARAMS ((FILE *)); +extern void print_arm_disassembler_options PARAMS ((FILE *)); +extern void parse_arm_disassembler_option PARAMS ((char *)); +extern int get_arm_regname_num_options PARAMS ((void)); +extern int set_arm_regname_option PARAMS ((int)); +extern int get_arm_regnames PARAMS ((int, const char **, const char **, const char ***)); + +/* Fetch the disassembler for a given BFD, if that support is available. */ +extern disassembler_ftype disassembler PARAMS ((bfd *)); + +/* Document any target specific options available from the disassembler. */ +extern void disassembler_usage PARAMS ((FILE *)); + + +/* This block of definitions is for particular callers who read instructions + into a buffer before calling the instruction decoder. */ + +/* Here is a function which callers may wish to use for read_memory_func. + It gets bytes from a buffer. */ +extern int buffer_read_memory + PARAMS ((bfd_vma, bfd_byte *, unsigned int, struct disassemble_info *)); + +/* This function goes with buffer_read_memory. + It prints a message using info->fprintf_func and info->stream. */ +extern void perror_memory PARAMS ((int, bfd_vma, struct disassemble_info *)); + + +/* Just print the address in hex. This is included for completeness even + though both GDB and objdump provide their own (to print symbolic + addresses). */ +extern void generic_print_address + PARAMS ((bfd_vma, struct disassemble_info *)); + +/* Always true. */ +extern int generic_symbol_at_address + PARAMS ((bfd_vma, struct disassemble_info *)); + +/* Macro to initialize a disassemble_info struct. This should be called + by all applications creating such a struct. */ +#define INIT_DISASSEMBLE_INFO(INFO, STREAM, FPRINTF_FUNC) \ + (INFO).flavour = bfd_target_unknown_flavour, \ + (INFO).arch = bfd_arch_unknown, \ + (INFO).mach = 0, \ + (INFO).insn_sets = 0, \ + (INFO).endian = BFD_ENDIAN_UNKNOWN, \ + (INFO).octets_per_byte = 1, \ + INIT_DISASSEMBLE_INFO_NO_ARCH(INFO, STREAM, FPRINTF_FUNC) + +/* Call this macro to initialize only the internal variables for the + disassembler. Architecture dependent things such as byte order, or machine + variant are not touched by this macro. This makes things much easier for + GDB which must initialize these things separately. */ + +#define INIT_DISASSEMBLE_INFO_NO_ARCH(INFO, STREAM, FPRINTF_FUNC) \ + (INFO).fprintf_func = (fprintf_ftype)(FPRINTF_FUNC), \ + (INFO).stream = (PTR)(STREAM), \ + (INFO).section = NULL, \ + (INFO).symbols = NULL, \ + (INFO).num_symbols = 0, \ + (INFO).private_data = NULL, \ + (INFO).buffer = NULL, \ + (INFO).buffer_vma = 0, \ + (INFO).buffer_length = 0, \ + (INFO).read_memory_func = buffer_read_memory, \ + (INFO).memory_error_func = perror_memory, \ + (INFO).print_address_func = generic_print_address, \ + (INFO).symbol_at_address_func = generic_symbol_at_address, \ + (INFO).flags = 0, \ + (INFO).bytes_per_line = 0, \ + (INFO).bytes_per_chunk = 0, \ + (INFO).display_endian = BFD_ENDIAN_UNKNOWN, \ + (INFO).disassembler_options = NULL, \ + (INFO).insn_info_valid = 0 + +#ifdef __cplusplus +} +#endif + +#endif /* ! defined (DIS_ASM_H) */ diff --git a/reactos/ntoskrnl/dbg/i386/i386-dis.c b/reactos/ntoskrnl/dbg/i386/i386-dis.c new file mode 100644 index 00000000000..c7a1fdeffd9 --- /dev/null +++ b/reactos/ntoskrnl/dbg/i386/i386-dis.c @@ -0,0 +1,4298 @@ +#include <stdarg.h> + +/* ReactOS compatibility stuff. */ +#define PARAMS(X) X +#define PTR void* +typedef enum bfd_flavour +{ + bfd_target_unknown_flavour, +} bfd_flavour; +typedef enum bfd_architecture +{ + bfd_arch_i386, +} bfd_arch; +typedef unsigned int bfd_vma; +typedef unsigned char bfd_byte; +enum bfd_endian { BFD_ENDIAN_BIG, BIG_ENDIAN_LITTLE, BFD_ENDIAN_UNKNOWN }; +typedef void* bfd; +typedef void* FILE; +typedef signed int bfd_signed_vma; +#define NULL 0 +#define bfd_mach_x86_64_intel_syntax 0 +#define bfd_mach_x86_64 1 +#define bfd_mach_i386_i386_intel_syntax 2 +#define bfd_mach_i386_i386 3 +#define bfd_mach_i386_i8086 4 +#define abort() __asm__("int $3\n\t") +#define _(X) X +#define ATTRIBUTE_UNUSED +extern char* strcpy(char *dest, const char *src); +extern unsigned int strlen(const char *s); +extern int sprintf(char *str, const char *format, ...); +extern int vsprintf(char *buf, const char *format, va_list ap); +void* memcpy(void *dest, const void *src, unsigned int length); +extern void DbgPrint(const char *format, ...); +#define sprintf_vma(BUF, VMA) sprintf(BUF, "0x%X", VMA) +#define _setjmp setjmp +unsigned int +KdbPrintAddress(void* address); + +struct disassemble_info; + +int +print_insn_i386_att (bfd_vma pc, struct disassemble_info *info); + +int +KdbPrintDisasm(void* Ignored, const char* fmt, ...) +{ + va_list ap; + static char buffer[256]; + int ret; + + va_start(ap, fmt); + ret = vsprintf(buffer, fmt, ap); + DbgPrint(buffer); + va_end(ap); + return(ret); +} + +int +KdbNopPrintDisasm(void* Ignored, const char* fmt, ...) +{ + return(0); +} + +int static +KdbReadMemory(unsigned int Addr, unsigned char* Data, unsigned int Length, + struct disassemble_info * Ignored) +{ + memcpy(Data, (unsigned char*)Addr, Length); + return(0); +} + +void static +KdbMemoryError(int Status, unsigned int Addr, + struct disassemble_info * Ignored) +{ +} + +void static +KdbPrintAddressInCode(unsigned int Addr, struct disassemble_info * Ignored) +{ + if (!KdbPrintAddress((void*)Addr)) + { + DbgPrint("<0x%X>", Addr); + } +} + +void static +KdbNopPrintAddress(unsigned int Addr, struct disassemble_info * Ignored) +{ +} + +#include "dis-asm.h" + +long +KdbGetInstLength(unsigned int Address) +{ + disassemble_info info; + + info.fprintf_func = KdbNopPrintDisasm; + info.stream = NULL; + info.application_data = NULL; + info.flavour = bfd_target_unknown_flavour; + info.arch = bfd_arch_i386; + info.mach = bfd_mach_i386_i386; + info.insn_sets = 0; + info.flags = 0; + info.read_memory_func = KdbReadMemory; + info.memory_error_func = KdbMemoryError; + info.print_address_func = KdbNopPrintAddress; + info.symbol_at_address_func = NULL; + info.buffer = NULL; + info.buffer_vma = info.buffer_length = 0; + info.bytes_per_chunk = 0; + info.display_endian = BIG_ENDIAN_LITTLE; + info.disassembler_options = NULL; + + return(print_insn_i386_att(Address, &info)); +} + +long +KdbDisassemble(unsigned int Address) +{ + disassemble_info info; + + info.fprintf_func = KdbPrintDisasm; + info.stream = NULL; + info.application_data = NULL; + info.flavour = bfd_target_unknown_flavour; + info.arch = bfd_arch_i386; + info.mach = bfd_mach_i386_i386; + info.insn_sets = 0; + info.flags = 0; + info.read_memory_func = KdbReadMemory; + info.memory_error_func = KdbMemoryError; + info.print_address_func = KdbPrintAddressInCode; + info.symbol_at_address_func = NULL; + info.buffer = NULL; + info.buffer_vma = info.buffer_length = 0; + info.bytes_per_chunk = 0; + info.display_endian = BIG_ENDIAN_LITTLE; + info.disassembler_options = NULL; + + return(print_insn_i386_att(Address, &info)); +} + +/* Print i386 instructions for GDB, the GNU debugger. + Copyright 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, + 2001 + Free Software Foundation, Inc. + +This file is part of GDB. + +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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* + * 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu) + * July 1988 + * modified by John Hassey (hassey@dg-rtp.dg.com) + * x86-64 support added by Jan Hubicka (jh@suse.cz) + */ + +/* + * The main tables describing the instructions is essentially a copy + * of the "Opcode Map" chapter (Appendix A) of the Intel 80386 + * Programmers Manual. Usually, there is a capital letter, followed + * by a small letter. The capital letter tell the addressing mode, + * and the small letter tells about the operand size. Refer to + * the Intel manual for details. + */ + +#include "dis-asm.h" +#if 0 +#include "sysdep.h" +#include "opintl.h" +#endif + +#define MAXLEN 20 + +#include <setjmp.h> + +#ifndef UNIXWARE_COMPAT +/* Set non-zero for broken, compatible instructions. Set to zero for + non-broken opcodes. */ +#define UNIXWARE_COMPAT 1 +#endif + +static int fetch_data PARAMS ((struct disassemble_info *, bfd_byte *)); +static void ckprefix PARAMS ((void)); +static const char *prefix_name PARAMS ((int, int)); +static int print_insn PARAMS ((bfd_vma, disassemble_info *)); +static void dofloat PARAMS ((int)); +static void OP_ST PARAMS ((int, int)); +static void OP_STi PARAMS ((int, int)); +static int putop PARAMS ((const char *, int)); +static void oappend PARAMS ((const char *)); +static void append_seg PARAMS ((void)); +static void OP_indirE PARAMS ((int, int)); +static void print_operand_value PARAMS ((char *, int, bfd_vma)); +static void OP_E PARAMS ((int, int)); +static void OP_G PARAMS ((int, int)); +static bfd_vma get64 PARAMS ((void)); +static bfd_signed_vma get32 PARAMS ((void)); +static bfd_signed_vma get32s PARAMS ((void)); +static int get16 PARAMS ((void)); +static void set_op PARAMS ((bfd_vma, int)); +static void OP_REG PARAMS ((int, int)); +static void OP_IMREG PARAMS ((int, int)); +static void OP_I PARAMS ((int, int)); +static void OP_I64 PARAMS ((int, int)); +static void OP_sI PARAMS ((int, int)); +static void OP_J PARAMS ((int, int)); +static void OP_SEG PARAMS ((int, int)); +static void OP_DIR PARAMS ((int, int)); +static void OP_OFF PARAMS ((int, int)); +static void OP_OFF64 PARAMS ((int, int)); +static void ptr_reg PARAMS ((int, int)); +static void OP_ESreg PARAMS ((int, int)); +static void OP_DSreg PARAMS ((int, int)); +static void OP_C PARAMS ((int, int)); +static void OP_D PARAMS ((int, int)); +static void OP_T PARAMS ((int, int)); +static void OP_Rd PARAMS ((int, int)); +static void OP_MMX PARAMS ((int, int)); +static void OP_XMM PARAMS ((int, int)); +static void OP_EM PARAMS ((int, int)); +static void OP_EX PARAMS ((int, int)); +static void OP_MS PARAMS ((int, int)); +static void OP_XS PARAMS ((int, int)); +static void OP_3DNowSuffix PARAMS ((int, int)); +static void OP_SIMD_Suffix PARAMS ((int, int)); +static void SIMD_Fixup PARAMS ((int, int)); +static void BadOp PARAMS ((void)); + +struct dis_private { + /* Points to first byte not fetched. */ + bfd_byte *max_fetched; + bfd_byte the_buffer[MAXLEN]; + bfd_vma insn_start; + int orig_sizeflag; + jmp_buf bailout; +}; + +/* The opcode for the fwait instruction, which we treat as a prefix + when we can. */ +#define FWAIT_OPCODE (0x9b) + +/* Set to 1 for 64bit mode disassembly. */ +static int mode_64bit; + +/* Flags for the prefixes for the current instruction. See below. */ +static int prefixes; + +/* REX prefix the current instruction. See below. */ +static int rex; +/* Bits of REX we've already used. */ +static int rex_used; +#define REX_MODE64 8 +#define REX_EXTX 4 +#define REX_EXTY 2 +#define REX_EXTZ 1 +/* Mark parts used in the REX prefix. When we are testing for + empty prefix (for 8bit register REX extension), just mask it + out. Otherwise test for REX bit is excuse for existence of REX + only in case value is nonzero. */ +#define USED_REX(value) \ + { \ + if (value) \ + rex_used |= (rex & value) ? (value) | 0x40 : 0; \ + else \ + rex_used |= 0x40; \ + } + +/* Flags for prefixes which we somehow handled when printing the + current instruction. */ +static int used_prefixes; + +/* Flags stored in PREFIXES. */ +#define PREFIX_REPZ 1 +#define PREFIX_REPNZ 2 +#define PREFIX_LOCK 4 +#define PREFIX_CS 8 +#define PREFIX_SS 0x10 +#define PREFIX_DS 0x20 +#define PREFIX_ES 0x40 +#define PREFIX_FS 0x80 +#define PREFIX_GS 0x100 +#define PREFIX_DATA 0x200 +#define PREFIX_ADDR 0x400 +#define PREFIX_FWAIT 0x800 + +/* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive) + to ADDR (exclusive) are valid. Returns 1 for success, longjmps + on error. */ +#define FETCH_DATA(info, addr) \ + ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \ + ? 1 : fetch_data ((info), (addr))) + +static int +fetch_data (info, addr) + struct disassemble_info *info; + bfd_byte *addr; +{ + int status; + struct dis_private *priv = (struct dis_private *) info->private_data; + bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer); + + status = (*info->read_memory_func) (start, + priv->max_fetched, + addr - priv->max_fetched, + info); + if (status != 0) + { + /* If we did manage to read at least one byte, then + print_insn_i386 will do something sensible. Otherwise, print + an error. We do that here because this is where we know + STATUS. */ + if (priv->max_fetched == priv->the_buffer) + (*info->memory_error_func) (status, start, info); + longjmp (priv->bailout, 1); + } + else + priv->max_fetched = addr; + return 1; +} + +#define XX NULL, 0 + +#define Eb OP_E, b_mode +#define Ev OP_E, v_mode +#define Ed OP_E, d_mode +#define indirEb OP_indirE, b_mode +#define indirEv OP_indirE, v_mode +#define Ew OP_E, w_mode +#define Ma OP_E, v_mode +#define M OP_E, 0 /* lea, lgdt, etc. */ +#define Mp OP_E, 0 /* 32 or 48 bit memory operand for LDS, LES etc */ +#define Gb OP_G, b_mode +#define Gv OP_G, v_mode +#define Gd OP_G, d_mode +#define Gw OP_G, w_mode +#define Rd OP_Rd, d_mode +#define Rm OP_Rd, m_mode +#define Ib OP_I, b_mode +#define sIb OP_sI, b_mode /* sign extened byte */ +#define Iv OP_I, v_mode +#define Iq OP_I, q_mode +#define Iv64 OP_I64, v_mode +#define Iw OP_I, w_mode +#define Jb OP_J, b_mode +#define Jv OP_J, v_mode +#define Cm OP_C, m_mode +#define Dm OP_D, m_mode +#define Td OP_T, d_mode + +#define RMeAX OP_REG, eAX_reg +#define RMeBX OP_REG, eBX_reg +#define RMeCX OP_REG, eCX_reg +#define RMeDX OP_REG, eDX_reg +#define RMeSP OP_REG, eSP_reg +#define RMeBP OP_REG, eBP_reg +#define RMeSI OP_REG, eSI_reg +#define RMeDI OP_REG, eDI_reg +#define RMrAX OP_REG, rAX_reg +#define RMrBX OP_REG, rBX_reg +#define RMrCX OP_REG, rCX_reg +#define RMrDX OP_REG, rDX_reg +#define RMrSP OP_REG, rSP_reg +#define RMrBP OP_REG, rBP_reg +#define RMrSI OP_REG, rSI_reg +#define RMrDI OP_REG, rDI_reg +#define RMAL OP_REG, al_reg +#define RMAL OP_REG, al_reg +#define RMCL OP_REG, cl_reg +#define RMDL OP_REG, dl_reg +#define RMBL OP_REG, bl_reg +#define RMAH OP_REG, ah_reg +#define RMCH OP_REG, ch_reg +#define RMDH OP_REG, dh_reg +#define RMBH OP_REG, bh_reg +#define RMAX OP_REG, ax_reg +#define RMDX OP_REG, dx_reg + +#define eAX OP_IMREG, eAX_reg +#define eBX OP_IMREG, eBX_reg +#define eCX OP_IMREG, eCX_reg +#define eDX OP_IMREG, eDX_reg +#define eSP OP_IMREG, eSP_reg +#define eBP OP_IMREG, eBP_reg +#define eSI OP_IMREG, eSI_reg +#define eDI OP_IMREG, eDI_reg +#define AL OP_IMREG, al_reg +#define AL OP_IMREG, al_reg +#define CL OP_IMREG, cl_reg +#define DL OP_IMREG, dl_reg +#define BL OP_IMREG, bl_reg +#define AH OP_IMREG, ah_reg +#define CH OP_IMREG, ch_reg +#define DH OP_IMREG, dh_reg +#define BH OP_IMREG, bh_reg +#define AX OP_IMREG, ax_reg +#define DX OP_IMREG, dx_reg +#define indirDX OP_IMREG, indir_dx_reg + +#define Sw OP_SEG, w_mode +#define Ap OP_DIR, 0 +#define Ob OP_OFF, b_mode +#define Ob64 OP_OFF64, b_mode +#define Ov OP_OFF, v_mode +#define Ov64 OP_OFF64, v_mode +#define Xb OP_DSreg, eSI_reg +#define Xv OP_DSreg, eSI_reg +#define Yb OP_ESreg, eDI_reg +#define Yv OP_ESreg, eDI_reg +#define DSBX OP_DSreg, eBX_reg + +#define es OP_REG, es_reg +#define ss OP_REG, ss_reg +#define cs OP_REG, cs_reg +#define ds OP_REG, ds_reg +#define fs OP_REG, fs_reg +#define gs OP_REG, gs_reg + +#define MX OP_MMX, 0 +#define XM OP_XMM, 0 +#define EM OP_EM, v_mode +#define EX OP_EX, v_mode +#define MS OP_MS, v_mode +#define XS OP_XS, v_mode +#define None OP_E, 0 +#define OPSUF OP_3DNowSuffix, 0 +#define OPSIMD OP_SIMD_Suffix, 0 + +#define cond_jump_flag NULL, cond_jump_mode +#define loop_jcxz_flag NULL, loop_jcxz_mode + +/* bits in sizeflag */ +#define SUFFIX_ALWAYS 4 +#define AFLAG 2 +#define DFLAG 1 + +#define b_mode 1 /* byte operand */ +#define v_mode 2 /* operand size depends on prefixes */ +#define w_mode 3 /* word operand */ +#define d_mode 4 /* double word operand */ +#define q_mode 5 /* quad word operand */ +#define x_mode 6 +#define m_mode 7 /* d_mode in 32bit, q_mode in 64bit mode. */ +#define cond_jump_mode 8 +#define loop_jcxz_mode 9 + +#define es_reg 100 +#define cs_reg 101 +#define ss_reg 102 +#define ds_reg 103 +#define fs_reg 104 +#define gs_reg 105 + +#define eAX_reg 108 +#define eCX_reg 109 +#define eDX_reg 110 +#define eBX_reg 111 +#define eSP_reg 112 +#define eBP_reg 113 +#define eSI_reg 114 +#define eDI_reg 115 + +#define al_reg 116 +#define cl_reg 117 +#define dl_reg 118 +#define bl_reg 119 +#define ah_reg 120 +#define ch_reg 121 +#define dh_reg 122 +#define bh_reg 123 + +#define ax_reg 124 +#define cx_reg 125 +#define dx_reg 126 +#define bx_reg 127 +#define sp_reg 128 +#define bp_reg 129 +#define si_reg 130 +#define di_reg 131 + +#define rAX_reg 132 +#define rCX_reg 133 +#define rDX_reg 134 +#define rBX_reg 135 +#define rSP_reg 136 +#define rBP_reg 137 +#define rSI_reg 138 +#define rDI_reg 139 + +#define indir_dx_reg 150 + +#define FLOATCODE 1 +#define USE_GROUPS 2 +#define USE_PREFIX_USER_TABLE 3 +#define X86_64_SPECIAL 4 + +#define FLOAT NULL, NULL, FLOATCODE, NULL, 0, NULL, 0 + +#define GRP1b NULL, NULL, USE_GROUPS, NULL, 0, NULL, 0 +#define GRP1S NULL, NULL, USE_GROUPS, NULL, 1, NULL, 0 +#define GRP1Ss NULL, NULL, USE_GROUPS, NULL, 2, NULL, 0 +#define GRP2b NULL, NULL, USE_GROUPS, NULL, 3, NULL, 0 +#define GRP2S NULL, NULL, USE_GROUPS, NULL, 4, NULL, 0 +#define GRP2b_one NULL, NULL, USE_GROUPS, NULL, 5, NULL, 0 +#define GRP2S_one NULL, NULL, USE_GROUPS, NULL, 6, NULL, 0 +#define GRP2b_cl NULL, NULL, USE_GROUPS, NULL, 7, NULL, 0 +#define GRP2S_cl NULL, NULL, USE_GROUPS, NULL, 8, NULL, 0 +#define GRP3b NULL, NULL, USE_GROUPS, NULL, 9, NULL, 0 +#define GRP3S NULL, NULL, USE_GROUPS, NULL, 10, NULL, 0 +#define GRP4 NULL, NULL, USE_GROUPS, NULL, 11, NULL, 0 +#define GRP5 NULL, NULL, USE_GROUPS, NULL, 12, NULL, 0 +#define GRP6 NULL, NULL, USE_GROUPS, NULL, 13, NULL, 0 +#define GRP7 NULL, NULL, USE_GROUPS, NULL, 14, NULL, 0 +#define GRP8 NULL, NULL, USE_GROUPS, NULL, 15, NULL, 0 +#define GRP9 NULL, NULL, USE_GROUPS, NULL, 16, NULL, 0 +#define GRP10 NULL, NULL, USE_GROUPS, NULL, 17, NULL, 0 +#define GRP11 NULL, NULL, USE_GROUPS, NULL, 18, NULL, 0 +#define GRP12 NULL, NULL, USE_GROUPS, NULL, 19, NULL, 0 +#define GRP13 NULL, NULL, USE_GROUPS, NULL, 20, NULL, 0 +#define GRP14 NULL, NULL, USE_GROUPS, NULL, 21, NULL, 0 +#define GRPAMD NULL, NULL, USE_GROUPS, NULL, 22, NULL, 0 + +#define PREGRP0 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 0, NULL, 0 +#define PREGRP1 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 1, NULL, 0 +#define PREGRP2 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 2, NULL, 0 +#define PREGRP3 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 3, NULL, 0 +#define PREGRP4 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 4, NULL, 0 +#define PREGRP5 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 5, NULL, 0 +#define PREGRP6 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 6, NULL, 0 +#define PREGRP7 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 7, NULL, 0 +#define PREGRP8 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 8, NULL, 0 +#define PREGRP9 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 9, NULL, 0 +#define PREGRP10 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 10, NULL, 0 +#define PREGRP11 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 11, NULL, 0 +#define PREGRP12 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 12, NULL, 0 +#define PREGRP13 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 13, NULL, 0 +#define PREGRP14 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 14, NULL, 0 +#define PREGRP15 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 15, NULL, 0 +#define PREGRP16 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 16, NULL, 0 +#define PREGRP17 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 17, NULL, 0 +#define PREGRP18 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 18, NULL, 0 +#define PREGRP19 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 19, NULL, 0 +#define PREGRP20 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 20, NULL, 0 +#define PREGRP21 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 21, NULL, 0 +#define PREGRP22 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 22, NULL, 0 +#define PREGRP23 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 23, NULL, 0 +#define PREGRP24 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 24, NULL, 0 +#define PREGRP25 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 25, NULL, 0 +#define PREGRP26 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 26, NULL, 0 + +#define X86_64_0 NULL, NULL, X86_64_SPECIAL, NULL, 0, NULL, 0 + +typedef void (*op_rtn) PARAMS ((int bytemode, int sizeflag)); + +struct dis386 { + const char *name; + op_rtn op1; + int bytemode1; + op_rtn op2; + int bytemode2; + op_rtn op3; + int bytemode3; +}; + +/* Upper case letters in the instruction names here are macros. + 'A' => print 'b' if no register operands or suffix_always is true + 'B' => print 'b' if suffix_always is true + 'E' => print 'e' if 32-bit form of jcxz + 'F' => print 'w' or 'l' depending on address size prefix (loop insns) + 'H' => print ",pt" or ",pn" branch hint + 'L' => print 'l' if suffix_always is true + 'N' => print 'n' if instruction has no wait "prefix" + 'O' => print 'd', or 'o' + 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix, + . or suffix_always is true. print 'q' if rex prefix is present. + 'Q' => print 'w', 'l' or 'q' if no register operands or suffix_always + . is true + 'R' => print 'w', 'l' or 'q' ("wd" or "dq" in intel mode) + 'S' => print 'w', 'l' or 'q' if suffix_always is true + 'T' => print 'q' in 64bit mode and behave as 'P' otherwise + 'U' => print 'q' in 64bit mode and behave as 'Q' otherwise + 'X' => print 's', 'd' depending on data16 prefix (for XMM) + 'W' => print 'b' or 'w' ("w" or "de" in intel mode) + 'Y' => 'q' if instruction has an REX 64bit overwrite prefix + + Many of the above letters print nothing in Intel mode. See "putop" + for the details. + + Braces '{' and '}', and vertical bars '|', indicate alternative + mnemonic strings for AT&T, Intel, X86_64 AT&T, and X86_64 Intel + modes. In cases where there are only two alternatives, the X86_64 + instruction is reserved, and "(bad)" is printed. +*/ + +static const struct dis386 dis386[] = { + /* 00 */ + { "addB", Eb, Gb, XX }, + { "addS", Ev, Gv, XX }, + { "addB", Gb, Eb, XX }, + { "addS", Gv, Ev, XX }, + { "addB", AL, Ib, XX }, + { "addS", eAX, Iv, XX }, + { "push{T|}", es, XX, XX }, + { "pop{T|}", es, XX, XX }, + /* 08 */ + { "orB", Eb, Gb, XX }, + { "orS", Ev, Gv, XX }, + { "orB", Gb, Eb, XX }, + { "orS", Gv, Ev, XX }, + { "orB", AL, Ib, XX }, + { "orS", eAX, Iv, XX }, + { "push{T|}", cs, XX, XX }, + { "(bad)", XX, XX, XX }, /* 0x0f extended opcode escape */ + /* 10 */ + { "adcB", Eb, Gb, XX }, + { "adcS", Ev, Gv, XX }, + { "adcB", Gb, Eb, XX }, + { "adcS", Gv, Ev, XX }, + { "adcB", AL, Ib, XX }, + { "adcS", eAX, Iv, XX }, + { "push{T|}", ss, XX, XX }, + { "popT|}", ss, XX, XX }, + /* 18 */ + { "sbbB", Eb, Gb, XX }, + { "sbbS", Ev, Gv, XX }, + { "sbbB", Gb, Eb, XX }, + { "sbbS", Gv, Ev, XX }, + { "sbbB", AL, Ib, XX }, + { "sbbS", eAX, Iv, XX }, + { "push{T|}", ds, XX, XX }, + { "pop{T|}", ds, XX, XX }, + /* 20 */ + { "andB", Eb, Gb, XX }, + { "andS", Ev, Gv, XX }, + { "andB", Gb, Eb, XX }, + { "andS", Gv, Ev, XX }, + { "andB", AL, Ib, XX }, + { "andS", eAX, Iv, XX }, + { "(bad)", XX, XX, XX }, /* SEG ES prefix */ + { "daa{|}", XX, XX, XX }, + /* 28 */ + { "subB", Eb, Gb, XX }, + { "subS", Ev, Gv, XX }, + { "subB", Gb, Eb, XX }, + { "subS", Gv, Ev, XX }, + { "subB", AL, Ib, XX }, + { "subS", eAX, Iv, XX }, + { "(bad)", XX, XX, XX }, /* SEG CS prefix */ + { "das{|}", XX, XX, XX }, + /* 30 */ + { "xorB", Eb, Gb, XX }, + { "xorS", Ev, Gv, XX }, + { "xorB", Gb, Eb, XX }, + { "xorS", Gv, Ev, XX }, + { "xorB", AL, Ib, XX }, + { "xorS", eAX, Iv, XX }, + { "(bad)", XX, XX, XX }, /* SEG SS prefix */ + { "aaa{|}", XX, XX, XX }, + /* 38 */ + { "cmpB", Eb, Gb, XX }, + { "cmpS", Ev, Gv, XX }, + { "cmpB", Gb, Eb, XX }, + { "cmpS", Gv, Ev, XX }, + { "cmpB", AL, Ib, XX }, + { "cmpS", eAX, Iv, XX }, + { "(bad)", XX, XX, XX }, /* SEG DS prefix */ + { "aas{|}", XX, XX, XX }, + /* 40 */ + { "inc{S|}", RMeAX, XX, XX }, + { "inc{S|}", RMeCX, XX, XX }, + { "inc{S|}", RMeDX, XX, XX }, + { "inc{S|}", RMeBX, XX, XX }, + { "inc{S|}", RMeSP, XX, XX }, + { "inc{S|}", RMeBP, XX, XX }, + { "inc{S|}", RMeSI, XX, XX }, + { "inc{S|}", RMeDI, XX, XX }, + /* 48 */ + { "dec{S|}", RMeAX, XX, XX }, + { "dec{S|}", RMeCX, XX, XX }, + { "dec{S|}", RMeDX, XX, XX }, + { "dec{S|}", RMeBX, XX, XX }, + { "dec{S|}", RMeSP, XX, XX }, + { "dec{S|}", RMeBP, XX, XX }, + { "dec{S|}", RMeSI, XX, XX }, + { "dec{S|}", RMeDI, XX, XX }, + /* 50 */ + { "pushS", RMrAX, XX, XX }, + { "pushS", RMrCX, XX, XX }, + { "pushS", RMrDX, XX, XX }, + { "pushS", RMrBX, XX, XX }, + { "pushS", RMrSP, XX, XX }, + { "pushS", RMrBP, XX, XX }, + { "pushS", RMrSI, XX, XX }, + { "pushS", RMrDI, XX, XX }, + /* 58 */ + { "popS", RMrAX, XX, XX }, + { "popS", RMrCX, XX, XX }, + { "popS", RMrDX, XX, XX }, + { "popS", RMrBX, XX, XX }, + { "popS", RMrSP, XX, XX }, + { "popS", RMrBP, XX, XX }, + { "popS", RMrSI, XX, XX }, + { "popS", RMrDI, XX, XX }, + /* 60 */ + { "pusha{P|}", XX, XX, XX }, + { "popa{P|}", XX, XX, XX }, + { "bound{S|}", Gv, Ma, XX }, + { X86_64_0 }, + { "(bad)", XX, XX, XX }, /* seg fs */ + { "(bad)", XX, XX, XX }, /* seg gs */ + { "(bad)", XX, XX, XX }, /* op size prefix */ + { "(bad)", XX, XX, XX }, /* adr size prefix */ + /* 68 */ + { "pushT", Iq, XX, XX }, + { "imulS", Gv, Ev, Iv }, + { "pushT", sIb, XX, XX }, + { "imulS", Gv, Ev, sIb }, + { "ins{b||b|}", Yb, indirDX, XX }, + { "ins{R||R|}", Yv, indirDX, XX }, + { "outs{b||b|}", indirDX, Xb, XX }, + { "outs{R||R|}", indirDX, Xv, XX }, + /* 70 */ + { "joH", Jb, XX, cond_jump_flag }, + { "jnoH", Jb, XX, cond_jump_flag }, + { "jbH", Jb, XX, cond_jump_flag }, + { "jaeH", Jb, XX, cond_jump_flag }, + { "jeH", Jb, XX, cond_jump_flag }, + { "jneH", Jb, XX, cond_jump_flag }, + { "jbeH", Jb, XX, cond_jump_flag }, + { "jaH", Jb, XX, cond_jump_flag }, + /* 78 */ + { "jsH", Jb, XX, cond_jump_flag }, + { "jnsH", Jb, XX, cond_jump_flag }, + { "jpH", Jb, XX, cond_jump_flag }, + { "jnpH", Jb, XX, cond_jump_flag }, + { "jlH", Jb, XX, cond_jump_flag }, + { "jgeH", Jb, XX, cond_jump_flag }, + { "jleH", Jb, XX, cond_jump_flag }, + { "jgH", Jb, XX, cond_jump_flag }, + /* 80 */ + { GRP1b }, + { GRP1S }, + { "(bad)", XX, XX, XX }, + { GRP1Ss }, + { "testB", Eb, Gb, XX }, + { "testS", Ev, Gv, XX }, + { "xchgB", Eb, Gb, XX }, + { "xchgS", Ev, Gv, XX }, + /* 88 */ + { "movB", Eb, Gb, XX }, + { "movS", Ev, Gv, XX }, + { "movB", Gb, Eb, XX }, + { "movS", Gv, Ev, XX }, + { "movQ", Ev, Sw, XX }, + { "leaS", Gv, M, XX }, + { "movQ", Sw, Ev, XX }, + { "popU", Ev, XX, XX }, + /* 90 */ + { "nop", XX, XX, XX }, + /* FIXME: NOP with REPz prefix is called PAUSE. */ + { "xchgS", RMeCX, eAX, XX }, + { "xchgS", RMeDX, eAX, XX }, + { "xchgS", RMeBX, eAX, XX }, + { "xchgS", RMeSP, eAX, XX }, + { "xchgS", RMeBP, eAX, XX }, + { "xchgS", RMeSI, eAX, XX }, + { "xchgS", RMeDI, eAX, XX }, + /* 98 */ + { "cW{tR||tR|}", XX, XX, XX }, + { "cR{tO||tO|}", XX, XX, XX }, + { "lcall{T|}", Ap, XX, XX }, + { "(bad)", XX, XX, XX }, /* fwait */ + { "pushfT", XX, XX, XX }, + { "popfT", XX, XX, XX }, + { "sahf{|}", XX, XX, XX }, + { "lahf{|}", XX, XX, XX }, + /* a0 */ + { "movB", AL, Ob64, XX }, + { "movS", eAX, Ov64, XX }, + { "movB", Ob64, AL, XX }, + { "movS", Ov64, eAX, XX }, + { "movs{b||b|}", Yb, Xb, XX }, + { "movs{R||R|}", Yv, Xv, XX }, + { "cmps{b||b|}", Xb, Yb, XX }, + { "cmps{R||R|}", Xv, Yv, XX }, + /* a8 */ + { "testB", AL, Ib, XX }, + { "testS", eAX, Iv, XX }, + { "stosB", Yb, AL, XX }, + { "stosS", Yv, eAX, XX }, + { "lodsB", AL, Xb, XX }, + { "lodsS", eAX, Xv, XX }, + { "scasB", AL, Yb, XX }, + { "scasS", eAX, Yv, XX }, + /* b0 */ + { "movB", RMAL, Ib, XX }, + { "movB", RMCL, Ib, XX }, + { "movB", RMDL, Ib, XX }, + { "movB", RMBL, Ib, XX }, + { "movB", RMAH, Ib, XX }, + { "movB", RMCH, Ib, XX }, + { "movB", RMDH, Ib, XX }, + { "movB", RMBH, Ib, XX }, + /* b8 */ + { "movS", RMeAX, Iv64, XX }, + { "movS", RMeCX, Iv64, XX }, + { "movS", RMeDX, Iv64, XX }, + { "movS", RMeBX, Iv64, XX }, + { "movS", RMeSP, Iv64, XX }, + { "movS", RMeBP, Iv64, XX }, + { "movS", RMeSI, Iv64, XX }, + { "movS", RMeDI, Iv64, XX }, + /* c0 */ + { GRP2b }, + { GRP2S }, + { "retT", Iw, XX, XX }, + { "retT", XX, XX, XX }, + { "les{S|}", Gv, Mp, XX }, + { "ldsS", Gv, Mp, XX }, + { "movA", Eb, Ib, XX }, + { "movQ", Ev, Iv, XX }, + /* c8 */ + { "enterT", Iw, Ib, XX }, + { "leaveT", XX, XX, XX }, + { "lretP", Iw, XX, XX }, + { "lretP", XX, XX, XX }, + { "int3", XX, XX, XX }, + { "int", Ib, XX, XX }, + { "into{|}", XX, XX, XX }, + { "iretP", XX, XX, XX }, + /* d0 */ + { GRP2b_one }, + { GRP2S_one }, + { GRP2b_cl }, + { GRP2S_cl }, + { "aam{|}", sIb, XX, XX }, + { "aad{|}", sIb, XX, XX }, + { "(bad)", XX, XX, XX }, + { "xlat", DSBX, XX, XX }, + /* d8 */ + { FLOAT }, + { FLOAT }, + { FLOAT }, + { FLOAT }, + { FLOAT }, + { FLOAT }, + { FLOAT }, + { FLOAT }, + /* e0 */ + { "loopneFH", Jb, XX, loop_jcxz_flag }, + { "loopeFH", Jb, XX, loop_jcxz_flag }, + { "loopFH", Jb, XX, loop_jcxz_flag }, + { "jEcxzH", Jb, XX, loop_jcxz_flag }, + { "inB", AL, Ib, XX }, + { "inS", eAX, Ib, XX }, + { "outB", Ib, AL, XX }, + { "outS", Ib, eAX, XX }, + /* e8 */ + { "callT", Jv, XX, XX }, + { "jmpT", Jv, XX, XX }, + { "ljmp{T|}", Ap, XX, XX }, + { "jmp", Jb, XX, XX }, + { "inB", AL, indirDX, XX }, + { "inS", eAX, indirDX, XX }, + { "outB", indirDX, AL, XX }, + { "outS", indirDX, eAX, XX }, + /* f0 */ + { "(bad)", XX, XX, XX }, /* lock prefix */ + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, /* repne */ + { "(bad)", XX, XX, XX }, /* repz */ + { "hlt", XX, XX, XX }, + { "cmc", XX, XX, XX }, + { GRP3b }, + { GRP3S }, + /* f8 */ + { "clc", XX, XX, XX }, + { "stc", XX, XX, XX }, + { "cli", XX, XX, XX }, + { "sti", XX, XX, XX }, + { "cld", XX, XX, XX }, + { "std", XX, XX, XX }, + { GRP4 }, + { GRP5 }, +}; + +static const struct dis386 dis386_twobyte[] = { + /* 00 */ + { GRP6 }, + { GRP7 }, + { "larS", Gv, Ew, XX }, + { "lslS", Gv, Ew, XX }, + { "(bad)", XX, XX, XX }, + { "syscall", XX, XX, XX }, + { "clts", XX, XX, XX }, + { "sysretP", XX, XX, XX }, + /* 08 */ + { "invd", XX, XX, XX }, + { "wbinvd", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "ud2a", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { GRPAMD }, + { "femms", XX, XX, XX }, + { "", MX, EM, OPSUF }, /* See OP_3DNowSuffix. */ + /* 10 */ + { PREGRP8 }, + { PREGRP9 }, + { "movlpX", XM, EX, SIMD_Fixup, 'h' }, /* really only 2 operands */ + { "movlpX", EX, XM, SIMD_Fixup, 'h' }, + { "unpcklpX", XM, EX, XX }, + { "unpckhpX", XM, EX, XX }, + { "movhpX", XM, EX, SIMD_Fixup, 'l' }, + { "movhpX", EX, XM, SIMD_Fixup, 'l' }, + /* 18 */ + { GRP14 }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + /* 20 */ + { "movL", Rm, Cm, XX }, + { "movL", Rm, Dm, XX }, + { "movL", Cm, Rm, XX }, + { "movL", Dm, Rm, XX }, + { "movL", Rd, Td, XX }, + { "(bad)", XX, XX, XX }, + { "movL", Td, Rd, XX }, + { "(bad)", XX, XX, XX }, + /* 28 */ + { "movapX", XM, EX, XX }, + { "movapX", EX, XM, XX }, + { PREGRP2 }, + { "movntpX", Ev, XM, XX }, + { PREGRP4 }, + { PREGRP3 }, + { "ucomisX", XM,EX, XX }, + { "comisX", XM,EX, XX }, + /* 30 */ + { "wrmsr", XX, XX, XX }, + { "rdtsc", XX, XX, XX }, + { "rdmsr", XX, XX, XX }, + { "rdpmc", XX, XX, XX }, + { "sysenter", XX, XX, XX }, + { "sysexit", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + /* 38 */ + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + /* 40 */ + { "cmovo", Gv, Ev, XX }, + { "cmovno", Gv, Ev, XX }, + { "cmovb", Gv, Ev, XX }, + { "cmovae", Gv, Ev, XX }, + { "cmove", Gv, Ev, XX }, + { "cmovne", Gv, Ev, XX }, + { "cmovbe", Gv, Ev, XX }, + { "cmova", Gv, Ev, XX }, + /* 48 */ + { "cmovs", Gv, Ev, XX }, + { "cmovns", Gv, Ev, XX }, + { "cmovp", Gv, Ev, XX }, + { "cmovnp", Gv, Ev, XX }, + { "cmovl", Gv, Ev, XX }, + { "cmovge", Gv, Ev, XX }, + { "cmovle", Gv, Ev, XX }, + { "cmovg", Gv, Ev, XX }, + /* 50 */ + { "movmskpX", Gd, XS, XX }, + { PREGRP13 }, + { PREGRP12 }, + { PREGRP11 }, + { "andpX", XM, EX, XX }, + { "andnpX", XM, EX, XX }, + { "orpX", XM, EX, XX }, + { "xorpX", XM, EX, XX }, + /* 58 */ + { PREGRP0 }, + { PREGRP10 }, + { PREGRP17 }, + { PREGRP16 }, + { PREGRP14 }, + { PREGRP7 }, + { PREGRP5 }, + { PREGRP6 }, + /* 60 */ + { "punpcklbw", MX, EM, XX }, + { "punpcklwd", MX, EM, XX }, + { "punpckldq", MX, EM, XX }, + { "packsswb", MX, EM, XX }, + { "pcmpgtb", MX, EM, XX }, + { "pcmpgtw", MX, EM, XX }, + { "pcmpgtd", MX, EM, XX }, + { "packuswb", MX, EM, XX }, + /* 68 */ + { "punpckhbw", MX, EM, XX }, + { "punpckhwd", MX, EM, XX }, + { "punpckhdq", MX, EM, XX }, + { "packssdw", MX, EM, XX }, + { PREGRP26 }, + { PREGRP24 }, + { "movd", MX, Ed, XX }, + { PREGRP19 }, + /* 70 */ + { PREGRP22 }, + { GRP10 }, + { GRP11 }, + { GRP12 }, + { "pcmpeqb", MX, EM, XX }, + { "pcmpeqw", MX, EM, XX }, + { "pcmpeqd", MX, EM, XX }, + { "emms", XX, XX, XX }, + /* 78 */ + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { PREGRP23 }, + { PREGRP20 }, + /* 80 */ + { "joH", Jv, XX, cond_jump_flag }, + { "jnoH", Jv, XX, cond_jump_flag }, + { "jbH", Jv, XX, cond_jump_flag }, + { "jaeH", Jv, XX, cond_jump_flag }, + { "jeH", Jv, XX, cond_jump_flag }, + { "jneH", Jv, XX, cond_jump_flag }, + { "jbeH", Jv, XX, cond_jump_flag }, + { "jaH", Jv, XX, cond_jump_flag }, + /* 88 */ + { "jsH", Jv, XX, cond_jump_flag }, + { "jnsH", Jv, XX, cond_jump_flag }, + { "jpH", Jv, XX, cond_jump_flag }, + { "jnpH", Jv, XX, cond_jump_flag }, + { "jlH", Jv, XX, cond_jump_flag }, + { "jgeH", Jv, XX, cond_jump_flag }, + { "jleH", Jv, XX, cond_jump_flag }, + { "jgH", Jv, XX, cond_jump_flag }, + /* 90 */ + { "seto", Eb, XX, XX }, + { "setno", Eb, XX, XX }, + { "setb", Eb, XX, XX }, + { "setae", Eb, XX, XX }, + { "sete", Eb, XX, XX }, + { "setne", Eb, XX, XX }, + { "setbe", Eb, XX, XX }, + { "seta", Eb, XX, XX }, + /* 98 */ + { "sets", Eb, XX, XX }, + { "setns", Eb, XX, XX }, + { "setp", Eb, XX, XX }, + { "setnp", Eb, XX, XX }, + { "setl", Eb, XX, XX }, + { "setge", Eb, XX, XX }, + { "setle", Eb, XX, XX }, + { "setg", Eb, XX, XX }, + /* a0 */ + { "pushT", fs, XX, XX }, + { "popT", fs, XX, XX }, + { "cpuid", XX, XX, XX }, + { "btS", Ev, Gv, XX }, + { "shldS", Ev, Gv, Ib }, + { "shldS", Ev, Gv, CL }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + /* a8 */ + { "pushT", gs, XX, XX }, + { "popT", gs, XX, XX }, + { "rsm", XX, XX, XX }, + { "btsS", Ev, Gv, XX }, + { "shrdS", Ev, Gv, Ib }, + { "shrdS", Ev, Gv, CL }, + { GRP13 }, + { "imulS", Gv, Ev, XX }, + /* b0 */ + { "cmpxchgB", Eb, Gb, XX }, + { "cmpxchgS", Ev, Gv, XX }, + { "lssS", Gv, Mp, XX }, + { "btrS", Ev, Gv, XX }, + { "lfsS", Gv, Mp, XX }, + { "lgsS", Gv, Mp, XX }, + { "movz{bR|x|bR|x}", Gv, Eb, XX }, + { "movz{wR|x|wR|x}", Gv, Ew, XX }, /* yes, there really is movzww ! */ + /* b8 */ + { "(bad)", XX, XX, XX }, + { "ud2b", XX, XX, XX }, + { GRP8 }, + { "btcS", Ev, Gv, XX }, + { "bsfS", Gv, Ev, XX }, + { "bsrS", Gv, Ev, XX }, + { "movs{bR|x|bR|x}", Gv, Eb, XX }, + { "movs{wR|x|wR|x}", Gv, Ew, XX }, /* yes, there really is movsww ! */ + /* c0 */ + { "xaddB", Eb, Gb, XX }, + { "xaddS", Ev, Gv, XX }, + { PREGRP1 }, + { "movntiS", Ev, Gv, XX }, + { "pinsrw", MX, Ed, Ib }, + { "pextrw", Gd, MS, Ib }, + { "shufpX", XM, EX, Ib }, + { GRP9 }, + /* c8 */ + { "bswap", RMeAX, XX, XX }, + { "bswap", RMeCX, XX, XX }, + { "bswap", RMeDX, XX, XX }, + { "bswap", RMeBX, XX, XX }, + { "bswap", RMeSP, XX, XX }, + { "bswap", RMeBP, XX, XX }, + { "bswap", RMeSI, XX, XX }, + { "bswap", RMeDI, XX, XX }, + /* d0 */ + { "(bad)", XX, XX, XX }, + { "psrlw", MX, EM, XX }, + { "psrld", MX, EM, XX }, + { "psrlq", MX, EM, XX }, + { "paddq", MX, EM, XX }, + { "pmullw", MX, EM, XX }, + { PREGRP21 }, + { "pmovmskb", Gd, MS, XX }, + /* d8 */ + { "psubusb", MX, EM, XX }, + { "psubusw", MX, EM, XX }, + { "pminub", MX, EM, XX }, + { "pand", MX, EM, XX }, + { "paddusb", MX, EM, XX }, + { "paddusw", MX, EM, XX }, + { "pmaxub", MX, EM, XX }, + { "pandn", MX, EM, XX }, + /* e0 */ + { "pavgb", MX, EM, XX }, + { "psraw", MX, EM, XX }, + { "psrad", MX, EM, XX }, + { "pavgw", MX, EM, XX }, + { "pmulhuw", MX, EM, XX }, + { "pmulhw", MX, EM, XX }, + { PREGRP15 }, + { PREGRP25 }, + /* e8 */ + { "psubsb", MX, EM, XX }, + { "psubsw", MX, EM, XX }, + { "pminsw", MX, EM, XX }, + { "por", MX, EM, XX }, + { "paddsb", MX, EM, XX }, + { "paddsw", MX, EM, XX }, + { "pmaxsw", MX, EM, XX }, + { "pxor", MX, EM, XX }, + /* f0 */ + { "(bad)", XX, XX, XX }, + { "psllw", MX, EM, XX }, + { "pslld", MX, EM, XX }, + { "psllq", MX, EM, XX }, + { "pmuludq", MX, EM, XX }, + { "pmaddwd", MX, EM, XX }, + { "psadbw", MX, EM, XX }, + { PREGRP18 }, + /* f8 */ + { "psubb", MX, EM, XX }, + { "psubw", MX, EM, XX }, + { "psubd", MX, EM, XX }, + { "psubq", MX, EM, XX }, + { "paddb", MX, EM, XX }, + { "paddw", MX, EM, XX }, + { "paddd", MX, EM, XX }, + { "(bad)", XX, XX, XX } +}; + +static const unsigned char onebyte_has_modrm[256] = { + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + /* ------------------------------- */ + /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */ + /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */ + /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */ + /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */ + /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */ + /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */ + /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */ + /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */ + /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */ + /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */ + /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */ + /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */ + /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */ + /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */ + /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */ + /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */ + /* ------------------------------- */ + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ +}; + +static const unsigned char twobyte_has_modrm[256] = { + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + /* ------------------------------- */ + /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */ + /* 10 */ 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, /* 1f */ + /* 20 */ 1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1, /* 2f */ + /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */ + /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */ + /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */ + /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */ + /* 70 */ 1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1, /* 7f */ + /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */ + /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */ + /* a0 */ 0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,1, /* af */ + /* b0 */ 1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1, /* bf */ + /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */ + /* d0 */ 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */ + /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */ + /* f0 */ 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* ff */ + /* ------------------------------- */ + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ +}; + +static const unsigned char twobyte_uses_SSE_prefix[256] = { + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + /* ------------------------------- */ + /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */ + /* 10 */ 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1f */ + /* 20 */ 0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0, /* 2f */ + /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */ + /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */ + /* 50 */ 0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* 5f */ + /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1, /* 6f */ + /* 70 */ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, /* 7f */ + /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */ + /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */ + /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */ + /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */ + /* c0 */ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */ + /* d0 */ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* df */ + /* e0 */ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* ef */ + /* f0 */ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0 /* ff */ + /* ------------------------------- */ + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ +}; + +static char obuf[100]; +static char *obufp; +static char scratchbuf[100]; +static unsigned char *start_codep; +static unsigned char *insn_codep; +static unsigned char *codep; +static disassemble_info *the_info; +static int mod; +static int rm; +static int reg; +static unsigned char need_modrm; + +/* If we are accessing mod/rm/reg without need_modrm set, then the + values are stale. Hitting this abort likely indicates that you + need to update onebyte_has_modrm or twobyte_has_modrm. */ +#define MODRM_CHECK if (!need_modrm) abort () + +static const char **names64; +static const char **names32; +static const char **names16; +static const char **names8; +static const char **names8rex; +static const char **names_seg; +static const char **index16; + +static const char *intel_names64[] = { + "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", + "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15" +}; +static const char *intel_names32[] = { + "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", + "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d" +}; +static const char *intel_names16[] = { + "ax", "cx", "dx", "bx", "sp", "bp", "si", "di", + "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w" +}; +static const char *intel_names8[] = { + "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh", +}; +static const char *intel_names8rex[] = { + "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil", + "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b" +}; +static const char *intel_names_seg[] = { + "es", "cs", "ss", "ds", "fs", "gs", "?", "?", +}; +static const char *intel_index16[] = { + "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx" +}; + +static const char *att_names64[] = { + "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi", + "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15" +}; +static const char *att_names32[] = { + "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi", + "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d" +}; +static const char *att_names16[] = { + "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di", + "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w" +}; +static const char *att_names8[] = { + "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh", +}; +static const char *att_names8rex[] = { + "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil", + "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b" +}; +static const char *att_names_seg[] = { + "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?", +}; +static const char *att_index16[] = { + "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx" +}; + +static const struct dis386 grps[][8] = { + /* GRP1b */ + { + { "addA", Eb, Ib, XX }, + { "orA", Eb, Ib, XX }, + { "adcA", Eb, Ib, XX }, + { "sbbA", Eb, Ib, XX }, + { "andA", Eb, Ib, XX }, + { "subA", Eb, Ib, XX }, + { "xorA", Eb, Ib, XX }, + { "cmpA", Eb, Ib, XX } + }, + /* GRP1S */ + { + { "addQ", Ev, Iv, XX }, + { "orQ", Ev, Iv, XX }, + { "adcQ", Ev, Iv, XX }, + { "sbbQ", Ev, Iv, XX }, + { "andQ", Ev, Iv, XX }, + { "subQ", Ev, Iv, XX }, + { "xorQ", Ev, Iv, XX }, + { "cmpQ", Ev, Iv, XX } + }, + /* GRP1Ss */ + { + { "addQ", Ev, sIb, XX }, + { "orQ", Ev, sIb, XX }, + { "adcQ", Ev, sIb, XX }, + { "sbbQ", Ev, sIb, XX }, + { "andQ", Ev, sIb, XX }, + { "subQ", Ev, sIb, XX }, + { "xorQ", Ev, sIb, XX }, + { "cmpQ", Ev, sIb, XX } + }, + /* GRP2b */ + { + { "rolA", Eb, Ib, XX }, + { "rorA", Eb, Ib, XX }, + { "rclA", Eb, Ib, XX }, + { "rcrA", Eb, Ib, XX }, + { "shlA", Eb, Ib, XX }, + { "shrA", Eb, Ib, XX }, + { "(bad)", XX, XX, XX }, + { "sarA", Eb, Ib, XX }, + }, + /* GRP2S */ + { + { "rolQ", Ev, Ib, XX }, + { "rorQ", Ev, Ib, XX }, + { "rclQ", Ev, Ib, XX }, + { "rcrQ", Ev, Ib, XX }, + { "shlQ", Ev, Ib, XX }, + { "shrQ", Ev, Ib, XX }, + { "(bad)", XX, XX, XX }, + { "sarQ", Ev, Ib, XX }, + }, + /* GRP2b_one */ + { + { "rolA", Eb, XX, XX }, + { "rorA", Eb, XX, XX }, + { "rclA", Eb, XX, XX }, + { "rcrA", Eb, XX, XX }, + { "shlA", Eb, XX, XX }, + { "shrA", Eb, XX, XX }, + { "(bad)", XX, XX, XX }, + { "sarA", Eb, XX, XX }, + }, + /* GRP2S_one */ + { + { "rolQ", Ev, XX, XX }, + { "rorQ", Ev, XX, XX }, + { "rclQ", Ev, XX, XX }, + { "rcrQ", Ev, XX, XX }, + { "shlQ", Ev, XX, XX }, + { "shrQ", Ev, XX, XX }, + { "(bad)", XX, XX, XX}, + { "sarQ", Ev, XX, XX }, + }, + /* GRP2b_cl */ + { + { "rolA", Eb, CL, XX }, + { "rorA", Eb, CL, XX }, + { "rclA", Eb, CL, XX }, + { "rcrA", Eb, CL, XX }, + { "shlA", Eb, CL, XX }, + { "shrA", Eb, CL, XX }, + { "(bad)", XX, XX, XX }, + { "sarA", Eb, CL, XX }, + }, + /* GRP2S_cl */ + { + { "rolQ", Ev, CL, XX }, + { "rorQ", Ev, CL, XX }, + { "rclQ", Ev, CL, XX }, + { "rcrQ", Ev, CL, XX }, + { "shlQ", Ev, CL, XX }, + { "shrQ", Ev, CL, XX }, + { "(bad)", XX, XX, XX }, + { "sarQ", Ev, CL, XX } + }, + /* GRP3b */ + { + { "testA", Eb, Ib, XX }, + { "(bad)", Eb, XX, XX }, + { "notA", Eb, XX, XX }, + { "negA", Eb, XX, XX }, + { "mulA", Eb, XX, XX }, /* Don't print the implicit %al register, */ + { "imulA", Eb, XX, XX }, /* to distinguish these opcodes from other */ + { "divA", Eb, XX, XX }, /* mul/imul opcodes. Do the same for div */ + { "idivA", Eb, XX, XX } /* and idiv for consistency. */ + }, + /* GRP3S */ + { + { "testQ", Ev, Iv, XX }, + { "(bad)", XX, XX, XX }, + { "notQ", Ev, XX, XX }, + { "negQ", Ev, XX, XX }, + { "mulQ", Ev, XX, XX }, /* Don't print the implicit register. */ + { "imulQ", Ev, XX, XX }, + { "divQ", Ev, XX, XX }, + { "idivQ", Ev, XX, XX }, + }, + /* GRP4 */ + { + { "incA", Eb, XX, XX }, + { "decA", Eb, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + }, + /* GRP5 */ + { + { "incQ", Ev, XX, XX }, + { "decQ", Ev, XX, XX }, + { "callT", indirEv, XX, XX }, + { "lcallT", indirEv, XX, XX }, + { "jmpT", indirEv, XX, XX }, + { "ljmpT", indirEv, XX, XX }, + { "pushU", Ev, XX, XX }, + { "(bad)", XX, XX, XX }, + }, + /* GRP6 */ + { + { "sldtQ", Ev, XX, XX }, + { "strQ", Ev, XX, XX }, + { "lldt", Ew, XX, XX }, + { "ltr", Ew, XX, XX }, + { "verr", Ew, XX, XX }, + { "verw", Ew, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX } + }, + /* GRP7 */ + { + { "sgdtQ", M, XX, XX }, + { "sidtQ", M, XX, XX }, + { "lgdtQ", M, XX, XX }, + { "lidtQ", M, XX, XX }, + { "smswQ", Ev, XX, XX }, + { "(bad)", XX, XX, XX }, + { "lmsw", Ew, XX, XX }, + { "invlpg", Ew, XX, XX }, + }, + /* GRP8 */ + { + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "btQ", Ev, Ib, XX }, + { "btsQ", Ev, Ib, XX }, + { "btrQ", Ev, Ib, XX }, + { "btcQ", Ev, Ib, XX }, + }, + /* GRP9 */ + { + { "(bad)", XX, XX, XX }, + { "cmpxchg8b", Ev, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + }, + /* GRP10 */ + { + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "psrlw", MS, Ib, XX }, + { "(bad)", XX, XX, XX }, + { "psraw", MS, Ib, XX }, + { "(bad)", XX, XX, XX }, + { "psllw", MS, Ib, XX }, + { "(bad)", XX, XX, XX }, + }, + /* GRP11 */ + { + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "psrld", MS, Ib, XX }, + { "(bad)", XX, XX, XX }, + { "psrad", MS, Ib, XX }, + { "(bad)", XX, XX, XX }, + { "pslld", MS, Ib, XX }, + { "(bad)", XX, XX, XX }, + }, + /* GRP12 */ + { + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "psrlq", MS, Ib, XX }, + { "psrldq", MS, Ib, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "psllq", MS, Ib, XX }, + { "pslldq", MS, Ib, XX }, + }, + /* GRP13 */ + { + { "fxsave", Ev, XX, XX }, + { "fxrstor", Ev, XX, XX }, + { "ldmxcsr", Ev, XX, XX }, + { "stmxcsr", Ev, XX, XX }, + { "(bad)", XX, XX, XX }, + { "lfence", None, XX, XX }, + { "mfence", None, XX, XX }, + { "sfence", None, XX, XX }, + /* FIXME: the sfence with memory operand is clflush! */ + }, + /* GRP14 */ + { + { "prefetchnta", Ev, XX, XX }, + { "prefetcht0", Ev, XX, XX }, + { "prefetcht1", Ev, XX, XX }, + { "prefetcht2", Ev, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + }, + /* GRPAMD */ + { + { "prefetch", Eb, XX, XX }, + { "prefetchw", Eb, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + } +}; + +static const struct dis386 prefix_user_table[][4] = { + /* PREGRP0 */ + { + { "addps", XM, EX, XX }, + { "addss", XM, EX, XX }, + { "addpd", XM, EX, XX }, + { "addsd", XM, EX, XX }, + }, + /* PREGRP1 */ + { + { "", XM, EX, OPSIMD }, /* See OP_SIMD_SUFFIX. */ + { "", XM, EX, OPSIMD }, + { "", XM, EX, OPSIMD }, + { "", XM, EX, OPSIMD }, + }, + /* PREGRP2 */ + { + { "cvtpi2ps", XM, EM, XX }, + { "cvtsi2ssY", XM, Ev, XX }, + { "cvtpi2pd", XM, EM, XX }, + { "cvtsi2sdY", XM, Ev, XX }, + }, + /* PREGRP3 */ + { + { "cvtps2pi", MX, EX, XX }, + { "cvtss2siY", Gv, EX, XX }, + { "cvtpd2pi", MX, EX, XX }, + { "cvtsd2siY", Gv, EX, XX }, + }, + /* PREGRP4 */ + { + { "cvttps2pi", MX, EX, XX }, + { "cvttss2siY", Gv, EX, XX }, + { "cvttpd2pi", MX, EX, XX }, + { "cvttsd2siY", Gv, EX, XX }, + }, + /* PREGRP5 */ + { + { "divps", XM, EX, XX }, + { "divss", XM, EX, XX }, + { "divpd", XM, EX, XX }, + { "divsd", XM, EX, XX }, + }, + /* PREGRP6 */ + { + { "maxps", XM, EX, XX }, + { "maxss", XM, EX, XX }, + { "maxpd", XM, EX, XX }, + { "maxsd", XM, EX, XX }, + }, + /* PREGRP7 */ + { + { "minps", XM, EX, XX }, + { "minss", XM, EX, XX }, + { "minpd", XM, EX, XX }, + { "minsd", XM, EX, XX }, + }, + /* PREGRP8 */ + { + { "movups", XM, EX, XX }, + { "movss", XM, EX, XX }, + { "movupd", XM, EX, XX }, + { "movsd", XM, EX, XX }, + }, + /* PREGRP9 */ + { + { "movups", EX, XM, XX }, + { "movss", EX, XM, XX }, + { "movupd", EX, XM, XX }, + { "movsd", EX, XM, XX }, + }, + /* PREGRP10 */ + { + { "mulps", XM, EX, XX }, + { "mulss", XM, EX, XX }, + { "mulpd", XM, EX, XX }, + { "mulsd", XM, EX, XX }, + }, + /* PREGRP11 */ + { + { "rcpps", XM, EX, XX }, + { "rcpss", XM, EX, XX }, + { "(bad)", XM, EX, XX }, + { "(bad)", XM, EX, XX }, + }, + /* PREGRP12 */ + { + { "rsqrtps", XM, EX, XX }, + { "rsqrtss", XM, EX, XX }, + { "(bad)", XM, EX, XX }, + { "(bad)", XM, EX, XX }, + }, + /* PREGRP13 */ + { + { "sqrtps", XM, EX, XX }, + { "sqrtss", XM, EX, XX }, + { "sqrtpd", XM, EX, XX }, + { "sqrtsd", XM, EX, XX }, + }, + /* PREGRP14 */ + { + { "subps", XM, EX, XX }, + { "subss", XM, EX, XX }, + { "subpd", XM, EX, XX }, + { "subsd", XM, EX, XX }, + }, + /* PREGRP15 */ + { + { "(bad)", XM, EX, XX }, + { "cvtdq2pd", XM, EX, XX }, + { "cvttpd2dq", XM, EX, XX }, + { "cvtpd2dq", XM, EX, XX }, + }, + /* PREGRP16 */ + { + { "cvtdq2ps", XM, EX, XX }, + { "cvttps2dq",XM, EX, XX }, + { "cvtps2dq",XM, EX, XX }, + { "(bad)", XM, EX, XX }, + }, + /* PREGRP17 */ + { + { "cvtps2pd", XM, EX, XX }, + { "cvtss2sd", XM, EX, XX }, + { "cvtpd2ps", XM, EX, XX }, + { "cvtsd2ss", XM, EX, XX }, + }, + /* PREGRP18 */ + { + { "maskmovq", MX, MS, XX }, + { "(bad)", XM, EX, XX }, + { "maskmovdqu", XM, EX, XX }, + { "(bad)", XM, EX, XX }, + }, + /* PREGRP19 */ + { + { "movq", MX, EM, XX }, + { "movdqu", XM, EX, XX }, + { "movdqa", XM, EX, XX }, + { "(bad)", XM, EX, XX }, + }, + /* PREGRP20 */ + { + { "movq", EM, MX, XX }, + { "movdqu", EX, XM, XX }, + { "movdqa", EX, XM, XX }, + { "(bad)", EX, XM, XX }, + }, + /* PREGRP21 */ + { + { "(bad)", EX, XM, XX }, + { "movq2dq", XM, MS, XX }, + { "movq", EX, XM, XX }, + { "movdq2q", MX, XS, XX }, + }, + /* PREGRP22 */ + { + { "pshufw", MX, EM, Ib }, + { "pshufhw", XM, EX, Ib }, + { "pshufd", XM, EX, Ib }, + { "pshuflw", XM, EX, Ib }, + }, + /* PREGRP23 */ + { + { "movd", Ed, MX, XX }, + { "movq", XM, EX, XX }, + { "movd", Ed, XM, XX }, + { "(bad)", Ed, XM, XX }, + }, + /* PREGRP24 */ + { + { "(bad)", MX, EX, XX }, + { "(bad)", XM, EX, XX }, + { "punpckhqdq", XM, EX, XX }, + { "(bad)", XM, EX, XX }, + }, + /* PREGRP25 */ + { + { "movntq", Ev, MX, XX }, + { "(bad)", Ev, XM, XX }, + { "movntdq", Ev, XM, XX }, + { "(bad)", Ev, XM, XX }, + }, + /* PREGRP26 */ + { + { "(bad)", MX, EX, XX }, + { "(bad)", XM, EX, XX }, + { "punpcklqdq", XM, EX, XX }, + { "(bad)", XM, EX, XX }, + }, +}; + +static const struct dis386 x86_64_table[][2] = { + { + { "arpl", Ew, Gw, XX }, + { "movs{||lq|xd}", Gv, Ed, XX }, + }, +}; + +#define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>") + +static void +ckprefix () +{ + int newrex; + rex = 0; + prefixes = 0; + used_prefixes = 0; + rex_used = 0; + while (1) + { + FETCH_DATA (the_info, codep + 1); + newrex = 0; + switch (*codep) + { + /* REX prefixes family. */ + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4a: + case 0x4b: + case 0x4c: + case 0x4d: + case 0x4e: + case 0x4f: + if (mode_64bit) + newrex = *codep; + else + return; + break; + case 0xf3: + prefixes |= PREFIX_REPZ; + break; + case 0xf2: + prefixes |= PREFIX_REPNZ; + break; + case 0xf0: + prefixes |= PREFIX_LOCK; + break; + case 0x2e: + prefixes |= PREFIX_CS; + break; + case 0x36: + prefixes |= PREFIX_SS; + break; + case 0x3e: + prefixes |= PREFIX_DS; + break; + case 0x26: + prefixes |= PREFIX_ES; + break; + case 0x64: + prefixes |= PREFIX_FS; + break; + case 0x65: + prefixes |= PREFIX_GS; + break; + case 0x66: + prefixes |= PREFIX_DATA; + break; + case 0x67: + prefixes |= PREFIX_ADDR; + break; + case FWAIT_OPCODE: + /* fwait is really an instruction. If there are prefixes + before the fwait, they belong to the fwait, *not* to the + following instruction. */ + if (prefixes) + { + prefixes |= PREFIX_FWAIT; + codep++; + return; + } + prefixes = PREFIX_FWAIT; + break; + default: + return; + } + /* Rex is ignored when followed by another prefix. */ + if (rex) + { + oappend (prefix_name (rex, 0)); + oappend (" "); + } + rex = newrex; + codep++; + } +} + +/* Return the name of the prefix byte PREF, or NULL if PREF is not a + prefix byte. */ + +static const char * +prefix_name (pref, sizeflag) + int pref; + int sizeflag; +{ + switch (pref) + { + /* REX prefixes family. */ + case 0x40: + return "rex"; + case 0x41: + return "rexZ"; + case 0x42: + return "rexY"; + case 0x43: + return "rexYZ"; + case 0x44: + return "rexX"; + case 0x45: + return "rexXZ"; + case 0x46: + return "rexXY"; + case 0x47: + return "rexXYZ"; + case 0x48: + return "rex64"; + case 0x49: + return "rex64Z"; + case 0x4a: + return "rex64Y"; + case 0x4b: + return "rex64YZ"; + case 0x4c: + return "rex64X"; + case 0x4d: + return "rex64XZ"; + case 0x4e: + return "rex64XY"; + case 0x4f: + return "rex64XYZ"; + case 0xf3: + return "repz"; + case 0xf2: + return "repnz"; + case 0xf0: + return "lock"; + case 0x2e: + return "cs"; + case 0x36: + return "ss"; + case 0x3e: + return "ds"; + case 0x26: + return "es"; + case 0x64: + return "fs"; + case 0x65: + return "gs"; + case 0x66: + return (sizeflag & DFLAG) ? "data16" : "data32"; + case 0x67: + if (mode_64bit) + return (sizeflag & AFLAG) ? "addr32" : "addr64"; + else + return ((sizeflag & AFLAG) && !mode_64bit) ? "addr16" : "addr32"; + case FWAIT_OPCODE: + return "fwait"; + default: + return NULL; + } +} + +static char op1out[100], op2out[100], op3out[100]; +static int op_ad, op_index[3]; +static bfd_vma op_address[3]; +static bfd_vma op_riprel[3]; +static bfd_vma start_pc; + +/* + * On the 386's of 1988, the maximum length of an instruction is 15 bytes. + * (see topic "Redundant prefixes" in the "Differences from 8086" + * section of the "Virtual 8086 Mode" chapter.) + * 'pc' should be the address of this instruction, it will + * be used to print the target address if this is a relative jump or call + * The function returns the length of this instruction in bytes. + */ + +static char intel_syntax; +static char open_char; +static char close_char; +static char separator_char; +static char scale_char; + +/* Here for backwards compatibility. When gdb stops using + print_insn_i386_att and print_insn_i386_intel these functions can + disappear, and print_insn_i386 be merged into print_insn. */ +int +print_insn_i386_att (pc, info) + bfd_vma pc; + disassemble_info *info; +{ + intel_syntax = 0; + + return print_insn (pc, info); +} + +int +print_insn_i386_intel (pc, info) + bfd_vma pc; + disassemble_info *info; +{ + intel_syntax = 1; + + return print_insn (pc, info); +} + +int +print_insn_i386 (pc, info) + bfd_vma pc; + disassemble_info *info; +{ + intel_syntax = -1; + + return print_insn (pc, info); +} + +static int +print_insn (pc, info) + bfd_vma pc; + disassemble_info *info; +{ + const struct dis386 *dp; + int i; + int two_source_ops; + char *first, *second, *third; + int needcomma; + unsigned char uses_SSE_prefix; + int sizeflag; + /*const char *p;*/ + struct dis_private priv; + + mode_64bit = (info->mach == bfd_mach_x86_64_intel_syntax + || info->mach == bfd_mach_x86_64); + + if (intel_syntax == -1) + intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax + || info->mach == bfd_mach_x86_64_intel_syntax); + + if (info->mach == bfd_mach_i386_i386 + || info->mach == bfd_mach_x86_64 + || info->mach == bfd_mach_i386_i386_intel_syntax + || info->mach == bfd_mach_x86_64_intel_syntax) + priv.orig_sizeflag = AFLAG | DFLAG; + else if (info->mach == bfd_mach_i386_i8086) + priv.orig_sizeflag = 0; + else + abort (); + +#if 0 + for (p = info->disassembler_options; p != NULL; ) + { + if (strncmp (p, "x86-64", 6) == 0) + { + mode_64bit = 1; + priv.orig_sizeflag = AFLAG | DFLAG; + } + else if (strncmp (p, "i386", 4) == 0) + { + mode_64bit = 0; + priv.orig_sizeflag = AFLAG | DFLAG; + } + else if (strncmp (p, "i8086", 5) == 0) + { + mode_64bit = 0; + priv.orig_sizeflag = 0; + } + else if (strncmp (p, "intel", 5) == 0) + { + intel_syntax = 1; + } + else if (strncmp (p, "att", 3) == 0) + { + intel_syntax = 0; + } + else if (strncmp (p, "addr", 4) == 0) + { + if (p[4] == '1' && p[5] == '6') + priv.orig_sizeflag &= ~AFLAG; + else if (p[4] == '3' && p[5] == '2') + priv.orig_sizeflag |= AFLAG; + } + else if (strncmp (p, "data", 4) == 0) + { + if (p[4] == '1' && p[5] == '6') + priv.orig_sizeflag &= ~DFLAG; + else if (p[4] == '3' && p[5] == '2') + priv.orig_sizeflag |= DFLAG; + } + else if (strncmp (p, "suffix", 6) == 0) + priv.orig_sizeflag |= SUFFIX_ALWAYS; + + p = strchr (p, ','); + if (p != NULL) + p++; + } +#else + mode_64bit = 0; + priv.orig_sizeflag = AFLAG | DFLAG; + intel_syntax = 0; +#endif + + if (intel_syntax) + { + names64 = intel_names64; + names32 = intel_names32; + names16 = intel_names16; + names8 = intel_names8; + names8rex = intel_names8rex; + names_seg = intel_names_seg; + index16 = intel_index16; + open_char = '['; + close_char = ']'; + separator_char = '+'; + scale_char = '*'; + } + else + { + names64 = att_names64; + names32 = att_names32; + names16 = att_names16; + names8 = att_names8; + names8rex = att_names8rex; + names_seg = att_names_seg; + index16 = att_index16; + open_char = '('; + close_char = ')'; + separator_char = ','; + scale_char = ','; + } + + /* The output looks better if we put 7 bytes on a line, since that + puts most long word instructions on a single line. */ + info->bytes_per_line = 7; + + info->private_data = (PTR) &priv; + priv.max_fetched = priv.the_buffer; + priv.insn_start = pc; + + obuf[0] = 0; + op1out[0] = 0; + op2out[0] = 0; + op3out[0] = 0; + + op_index[0] = op_index[1] = op_index[2] = -1; + + the_info = info; + start_pc = pc; + start_codep = priv.the_buffer; + codep = priv.the_buffer; + + if (setjmp (priv.bailout) != 0) + { + const char *name; + + /* Getting here means we tried for data but didn't get it. That + means we have an incomplete instruction of some sort. Just + print the first byte as a prefix or a .byte pseudo-op. */ + if (codep > priv.the_buffer) + { + name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag); + if (name != NULL) + (*info->fprintf_func) (info->stream, "%s", name); + else + { + /* Just print the first byte as a .byte instruction. */ + (*info->fprintf_func) (info->stream, ".byte 0x%x", + (unsigned int) priv.the_buffer[0]); + } + + return 1; + } + + return -1; + } + + obufp = obuf; + ckprefix (); + + insn_codep = codep; + sizeflag = priv.orig_sizeflag; + + FETCH_DATA (info, codep + 1); + two_source_ops = (*codep == 0x62) || (*codep == 0xc8); + + if ((prefixes & PREFIX_FWAIT) + && ((*codep < 0xd8) || (*codep > 0xdf))) + { + const char *name; + + /* fwait not followed by floating point instruction. Print the + first prefix, which is probably fwait itself. */ + name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag); + if (name == NULL) + name = INTERNAL_DISASSEMBLER_ERROR; + (*info->fprintf_func) (info->stream, "%s", name); + return 1; + } + + if (*codep == 0x0f) + { + FETCH_DATA (info, codep + 2); + dp = &dis386_twobyte[*++codep]; + need_modrm = twobyte_has_modrm[*codep]; + uses_SSE_prefix = twobyte_uses_SSE_prefix[*codep]; + } + else + { + dp = &dis386[*codep]; + need_modrm = onebyte_has_modrm[*codep]; + uses_SSE_prefix = 0; + } + codep++; + + if (!uses_SSE_prefix && (prefixes & PREFIX_REPZ)) + { + oappend ("repz "); + used_prefixes |= PREFIX_REPZ; + } + if (!uses_SSE_prefix && (prefixes & PREFIX_REPNZ)) + { + oappend ("repnz "); + used_prefixes |= PREFIX_REPNZ; + } + if (prefixes & PREFIX_LOCK) + { + oappend ("lock "); + used_prefixes |= PREFIX_LOCK; + } + + if (prefixes & PREFIX_ADDR) + { + sizeflag ^= AFLAG; + if (dp->bytemode3 != loop_jcxz_mode || intel_syntax) + { + if ((sizeflag & AFLAG) || mode_64bit) + oappend ("addr32 "); + else + oappend ("addr16 "); + used_prefixes |= PREFIX_ADDR; + } + } + + if (!uses_SSE_prefix && (prefixes & PREFIX_DATA)) + { + sizeflag ^= DFLAG; + if (dp->bytemode3 == cond_jump_mode + && dp->bytemode1 == v_mode + && !intel_syntax) + { + if (sizeflag & DFLAG) + oappend ("data32 "); + else + oappend ("data16 "); + used_prefixes |= PREFIX_DATA; + } + } + + if (need_modrm) + { + FETCH_DATA (info, codep + 1); + mod = (*codep >> 6) & 3; + reg = (*codep >> 3) & 7; + rm = *codep & 7; + } + + if (dp->name == NULL && dp->bytemode1 == FLOATCODE) + { + dofloat (sizeflag); + } + else + { + int index; + if (dp->name == NULL) + { + switch (dp->bytemode1) + { + case USE_GROUPS: + dp = &grps[dp->bytemode2][reg]; + break; + + case USE_PREFIX_USER_TABLE: + index = 0; + used_prefixes |= (prefixes & PREFIX_REPZ); + if (prefixes & PREFIX_REPZ) + index = 1; + else + { + used_prefixes |= (prefixes & PREFIX_DATA); + if (prefixes & PREFIX_DATA) + index = 2; + else + { + used_prefixes |= (prefixes & PREFIX_REPNZ); + if (prefixes & PREFIX_REPNZ) + index = 3; + } + } + dp = &prefix_user_table[dp->bytemode2][index]; + break; + + case X86_64_SPECIAL: + dp = &x86_64_table[dp->bytemode2][mode_64bit]; + break; + + default: + oappend (INTERNAL_DISASSEMBLER_ERROR); + break; + } + } + + if (putop (dp->name, sizeflag) == 0) + { + obufp = op1out; + op_ad = 2; + if (dp->op1) + (*dp->op1) (dp->bytemode1, sizeflag); + + obufp = op2out; + op_ad = 1; + if (dp->op2) + (*dp->op2) (dp->bytemode2, sizeflag); + + obufp = op3out; + op_ad = 0; + if (dp->op3) + (*dp->op3) (dp->bytemode3, sizeflag); + } + } + + /* See if any prefixes were not used. If so, print the first one + separately. If we don't do this, we'll wind up printing an + instruction stream which does not precisely correspond to the + bytes we are disassembling. */ + if ((prefixes & ~used_prefixes) != 0) + { + const char *name; + + name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag); + if (name == NULL) + name = INTERNAL_DISASSEMBLER_ERROR; + (*info->fprintf_func) (info->stream, "%s", name); + return 1; + } + if (rex & ~rex_used) + { + const char *name; + name = prefix_name (rex | 0x40, priv.orig_sizeflag); + if (name == NULL) + name = INTERNAL_DISASSEMBLER_ERROR; + (*info->fprintf_func) (info->stream, "%s ", name); + } + + obufp = obuf + strlen (obuf); + for (i = strlen (obuf); i < 6; i++) + oappend (" "); + oappend (" "); + (*info->fprintf_func) (info->stream, "%s", obuf); + + /* The enter and bound instructions are printed with operands in the same + order as the intel book; everything else is printed in reverse order. */ + if (intel_syntax || two_source_ops) + { + first = op1out; + second = op2out; + third = op3out; + op_ad = op_index[0]; + op_index[0] = op_index[2]; + op_index[2] = op_ad; + } + else + { + first = op3out; + second = op2out; + third = op1out; + } + needcomma = 0; + if (*first) + { + if (op_index[0] != -1 && !op_riprel[0]) + (*info->print_address_func) ((bfd_vma) op_address[op_index[0]], info); + else + (*info->fprintf_func) (info->stream, "%s", first); + needcomma = 1; + } + if (*second) + { + if (needcomma) + (*info->fprintf_func) (info->stream, ","); + if (op_index[1] != -1 && !op_riprel[1]) + (*info->print_address_func) ((bfd_vma) op_address[op_index[1]], info); + else + (*info->fprintf_func) (info->stream, "%s", second); + needcomma = 1; + } + if (*third) + { + if (needcomma) + (*info->fprintf_func) (info->stream, ","); + if (op_index[2] != -1 && !op_riprel[2]) + (*info->print_address_func) ((bfd_vma) op_address[op_index[2]], info); + else + (*info->fprintf_func) (info->stream, "%s", third); + } + for (i = 0; i < 3; i++) + if (op_index[i] != -1 && op_riprel[i]) + { + (*info->fprintf_func) (info->stream, " # "); + (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep + + op_address[op_index[i]]), info); + } + return codep - priv.the_buffer; +} + +static const char *float_mem[] = { + /* d8 */ + "fadd{s||s|}", + "fmul{s||s|}", + "fcom{s||s|}", + "fcomp{s||s|}", + "fsub{s||s|}", + "fsubr{s||s|}", + "fdiv{s||s|}", + "fdivr{s||s|}", + /* d9 */ + "fld{s||s|}", + "(bad)", + "fst{s||s|}", + "fstp{s||s|}", + "fldenv", + "fldcw", + "fNstenv", + "fNstcw", + /* da */ + "fiadd{l||l|}", + "fimul{l||l|}", + "ficom{l||l|}", + "ficomp{l||l|}", + "fisub{l||l|}", + "fisubr{l||l|}", + "fidiv{l||l|}", + "fidivr{l||l|}", + /* db */ + "fild{l||l|}", + "(bad)", + "fist{l||l|}", + "fistp{l||l|}", + "(bad)", + "fld{t||t|}", + "(bad)", + "fstp{t||t|}", + /* dc */ + "fadd{l||l|}", + "fmul{l||l|}", + "fcom{l||l|}", + "fcomp{l||l|}", + "fsub{l||l|}", + "fsubr{l||l|}", + "fdiv{l||l|}", + "fdivr{l||l|}", + /* dd */ + "fld{l||l|}", + "(bad)", + "fst{l||l|}", + "fstp{l||l|}", + "frstor", + "(bad)", + "fNsave", + "fNstsw", + /* de */ + "fiadd", + "fimul", + "ficom", + "ficomp", + "fisub", + "fisubr", + "fidiv", + "fidivr", + /* df */ + "fild", + "(bad)", + "fist", + "fistp", + "fbld", + "fild{ll||ll|}", + "fbstp", + "fistpll", +}; + +#define ST OP_ST, 0 +#define STi OP_STi, 0 + +#define FGRPd9_2 NULL, NULL, 0, NULL, 0, NULL, 0 +#define FGRPd9_4 NULL, NULL, 1, NULL, 0, NULL, 0 +#define FGRPd9_5 NULL, NULL, 2, NULL, 0, NULL, 0 +#define FGRPd9_6 NULL, NULL, 3, NULL, 0, NULL, 0 +#define FGRPd9_7 NULL, NULL, 4, NULL, 0, NULL, 0 +#define FGRPda_5 NULL, NULL, 5, NULL, 0, NULL, 0 +#define FGRPdb_4 NULL, NULL, 6, NULL, 0, NULL, 0 +#define FGRPde_3 NULL, NULL, 7, NULL, 0, NULL, 0 +#define FGRPdf_4 NULL, NULL, 8, NULL, 0, NULL, 0 + +static const struct dis386 float_reg[][8] = { + /* d8 */ + { + { "fadd", ST, STi, XX }, + { "fmul", ST, STi, XX }, + { "fcom", STi, XX, XX }, + { "fcomp", STi, XX, XX }, + { "fsub", ST, STi, XX }, + { "fsubr", ST, STi, XX }, + { "fdiv", ST, STi, XX }, + { "fdivr", ST, STi, XX }, + }, + /* d9 */ + { + { "fld", STi, XX, XX }, + { "fxch", STi, XX, XX }, + { FGRPd9_2 }, + { "(bad)", XX, XX, XX }, + { FGRPd9_4 }, + { FGRPd9_5 }, + { FGRPd9_6 }, + { FGRPd9_7 }, + }, + /* da */ + { + { "fcmovb", ST, STi, XX }, + { "fcmove", ST, STi, XX }, + { "fcmovbe",ST, STi, XX }, + { "fcmovu", ST, STi, XX }, + { "(bad)", XX, XX, XX }, + { FGRPda_5 }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + }, + /* db */ + { + { "fcmovnb",ST, STi, XX }, + { "fcmovne",ST, STi, XX }, + { "fcmovnbe",ST, STi, XX }, + { "fcmovnu",ST, STi, XX }, + { FGRPdb_4 }, + { "fucomi", ST, STi, XX }, + { "fcomi", ST, STi, XX }, + { "(bad)", XX, XX, XX }, + }, + /* dc */ + { + { "fadd", STi, ST, XX }, + { "fmul", STi, ST, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, +#if UNIXWARE_COMPAT + { "fsub", STi, ST, XX }, + { "fsubr", STi, ST, XX }, + { "fdiv", STi, ST, XX }, + { "fdivr", STi, ST, XX }, +#else + { "fsubr", STi, ST, XX }, + { "fsub", STi, ST, XX }, + { "fdivr", STi, ST, XX }, + { "fdiv", STi, ST, XX }, +#endif + }, + /* dd */ + { + { "ffree", STi, XX, XX }, + { "(bad)", XX, XX, XX }, + { "fst", STi, XX, XX }, + { "fstp", STi, XX, XX }, + { "fucom", STi, XX, XX }, + { "fucomp", STi, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + }, + /* de */ + { + { "faddp", STi, ST, XX }, + { "fmulp", STi, ST, XX }, + { "(bad)", XX, XX, XX }, + { FGRPde_3 }, +#if UNIXWARE_COMPAT + { "fsubp", STi, ST, XX }, + { "fsubrp", STi, ST, XX }, + { "fdivp", STi, ST, XX }, + { "fdivrp", STi, ST, XX }, +#else + { "fsubrp", STi, ST, XX }, + { "fsubp", STi, ST, XX }, + { "fdivrp", STi, ST, XX }, + { "fdivp", STi, ST, XX }, +#endif + }, + /* df */ + { + { "ffreep", STi, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { FGRPdf_4 }, + { "fucomip",ST, STi, XX }, + { "fcomip", ST, STi, XX }, + { "(bad)", XX, XX, XX }, + }, +}; + +static char *fgrps[][8] = { + /* d9_2 0 */ + { + "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)", + }, + + /* d9_4 1 */ + { + "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)", + }, + + /* d9_5 2 */ + { + "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)", + }, + + /* d9_6 3 */ + { + "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp", + }, + + /* d9_7 4 */ + { + "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos", + }, + + /* da_5 5 */ + { + "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)", + }, + + /* db_4 6 */ + { + "feni(287 only)","fdisi(287 only)","fNclex","fNinit", + "fNsetpm(287 only)","(bad)","(bad)","(bad)", + }, + + /* de_3 7 */ + { + "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)", + }, + + /* df_4 8 */ + { + "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)", + }, +}; + +static void +dofloat (sizeflag) + int sizeflag; +{ + const struct dis386 *dp; + unsigned char floatop; + + floatop = codep[-1]; + + if (mod != 3) + { + putop (float_mem[(floatop - 0xd8) * 8 + reg], sizeflag); + obufp = op1out; + if (floatop == 0xdb) + OP_E (x_mode, sizeflag); + else if (floatop == 0xdd) + OP_E (d_mode, sizeflag); + else + OP_E (v_mode, sizeflag); + return; + } + /* Skip mod/rm byte. */ + MODRM_CHECK; + codep++; + + dp = &float_reg[floatop - 0xd8][reg]; + if (dp->name == NULL) + { + putop (fgrps[dp->bytemode1][rm], sizeflag); + + /* Instruction fnstsw is only one with strange arg. */ + if (floatop == 0xdf && codep[-1] == 0xe0) + strcpy (op1out, names16[0]); + } + else + { + putop (dp->name, sizeflag); + + obufp = op1out; + if (dp->op1) + (*dp->op1) (dp->bytemode1, sizeflag); + obufp = op2out; + if (dp->op2) + (*dp->op2) (dp->bytemode2, sizeflag); + } +} + +static void +OP_ST (bytemode, sizeflag) + int bytemode ATTRIBUTE_UNUSED; + int sizeflag ATTRIBUTE_UNUSED; +{ + oappend ("%st"); +} + +static void +OP_STi (bytemode, sizeflag) + int bytemode ATTRIBUTE_UNUSED; + int sizeflag ATTRIBUTE_UNUSED; +{ + sprintf (scratchbuf, "%%st(%d)", rm); + oappend (scratchbuf + intel_syntax); +} + +/* Capital letters in template are macros. */ +static int +putop (template, sizeflag) + const char *template; + int sizeflag; +{ + const char *p; + int alt; + + for (p = template; *p; p++) + { + switch (*p) + { + default: + *obufp++ = *p; + break; + case '{': + alt = 0; + if (intel_syntax) + alt += 1; + if (mode_64bit) + alt += 2; + while (alt != 0) + { + while (*++p != '|') + { + if (*p == '}') + { + /* Alternative not valid. */ + strcpy (obuf, "(bad)"); + obufp = obuf + 5; + return 1; + } + else if (*p == '\0') + abort (); + } + alt--; + } + break; + case '|': + while (*++p != '}') + { + if (*p == '\0') + abort (); + } + break; + case '}': + break; + case 'A': + if (intel_syntax) + break; + if (mod != 3 || (sizeflag & SUFFIX_ALWAYS)) + *obufp++ = 'b'; + break; + case 'B': + if (intel_syntax) + break; + if (sizeflag & SUFFIX_ALWAYS) + *obufp++ = 'b'; + break; + case 'E': /* For jcxz/jecxz */ + if (mode_64bit) + { + if (sizeflag & AFLAG) + *obufp++ = 'r'; + else + *obufp++ = 'e'; + } + else + if (sizeflag & AFLAG) + *obufp++ = 'e'; + used_prefixes |= (prefixes & PREFIX_ADDR); + break; + case 'F': + if (intel_syntax) + break; + if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS)) + { + if (sizeflag & AFLAG) + *obufp++ = mode_64bit ? 'q' : 'l'; + else + *obufp++ = mode_64bit ? 'l' : 'w'; + used_prefixes |= (prefixes & PREFIX_ADDR); + } + break; + case 'H': + if (intel_syntax) + break; + if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS + || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS) + { + used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS); + *obufp++ = ','; + *obufp++ = 'p'; + if (prefixes & PREFIX_DS) + *obufp++ = 't'; + else + *obufp++ = 'n'; + } + break; + case 'L': + if (intel_syntax) + break; + if (sizeflag & SUFFIX_ALWAYS) + *obufp++ = 'l'; + break; + case 'N': + if ((prefixes & PREFIX_FWAIT) == 0) + *obufp++ = 'n'; + else + used_prefixes |= PREFIX_FWAIT; + break; + case 'O': + USED_REX (REX_MODE64); + if (rex & REX_MODE64) + *obufp++ = 'o'; + else + *obufp++ = 'd'; + break; + case 'T': + if (intel_syntax) + break; + if (mode_64bit) + { + *obufp++ = 'q'; + break; + } + /* Fall through. */ + case 'P': + if (intel_syntax) + break; + if ((prefixes & PREFIX_DATA) + || (rex & REX_MODE64) + || (sizeflag & SUFFIX_ALWAYS)) + { + USED_REX (REX_MODE64); + if (rex & REX_MODE64) + *obufp++ = 'q'; + else + { + if (sizeflag & DFLAG) + *obufp++ = 'l'; + else + *obufp++ = 'w'; + used_prefixes |= (prefixes & PREFIX_DATA); + } + } + break; + case 'U': + if (intel_syntax) + break; + if (mode_64bit) + { + *obufp++ = 'q'; + break; + } + /* Fall through. */ + case 'Q': + if (intel_syntax) + break; + USED_REX (REX_MODE64); + if (mod != 3 || (sizeflag & SUFFIX_ALWAYS)) + { + if (rex & REX_MODE64) + *obufp++ = 'q'; + else + { + if (sizeflag & DFLAG) + *obufp++ = 'l'; + else + *obufp++ = 'w'; + used_prefixes |= (prefixes & PREFIX_DATA); + } + } + break; + case 'R': + USED_REX (REX_MODE64); + if (intel_syntax) + { + if (rex & REX_MODE64) + { + *obufp++ = 'q'; + *obufp++ = 't'; + } + else if (sizeflag & DFLAG) + { + *obufp++ = 'd'; + *obufp++ = 'q'; + } + else + { + *obufp++ = 'w'; + *obufp++ = 'd'; + } + } + else + { + if (rex & REX_MODE64) + *obufp++ = 'q'; + else if (sizeflag & DFLAG) + *obufp++ = 'l'; + else + *obufp++ = 'w'; + } + if (!(rex & REX_MODE64)) + used_prefixes |= (prefixes & PREFIX_DATA); + break; + case 'S': + if (intel_syntax) + break; + if (sizeflag & SUFFIX_ALWAYS) + { + if (rex & REX_MODE64) + *obufp++ = 'q'; + else + { + if (sizeflag & DFLAG) + *obufp++ = 'l'; + else + *obufp++ = 'w'; + used_prefixes |= (prefixes & PREFIX_DATA); + } + } + break; + case 'X': + if (prefixes & PREFIX_DATA) + *obufp++ = 'd'; + else + *obufp++ = 's'; + used_prefixes |= (prefixes & PREFIX_DATA); + break; + case 'Y': + if (intel_syntax) + break; + if (rex & REX_MODE64) + { + USED_REX (REX_MODE64); + *obufp++ = 'q'; + } + break; + /* implicit operand size 'l' for i386 or 'q' for x86-64 */ + case 'W': + /* operand size flag for cwtl, cbtw */ + USED_REX (0); + if (rex) + *obufp++ = 'l'; + else if (sizeflag & DFLAG) + *obufp++ = 'w'; + else + *obufp++ = 'b'; + if (intel_syntax) + { + if (rex) + { + *obufp++ = 'q'; + *obufp++ = 'e'; + } + if (sizeflag & DFLAG) + { + *obufp++ = 'd'; + *obufp++ = 'e'; + } + else + { + *obufp++ = 'w'; + } + } + if (!rex) + used_prefixes |= (prefixes & PREFIX_DATA); + break; + } + } + *obufp = 0; + return 0; +} + +static void +oappend (s) + const char *s; +{ + strcpy (obufp, s); + obufp += strlen (s); +} + +static void +append_seg () +{ + if (prefixes & PREFIX_CS) + { + used_prefixes |= PREFIX_CS; + oappend ("%cs:" + intel_syntax); + } + if (prefixes & PREFIX_DS) + { + used_prefixes |= PREFIX_DS; + oappend ("%ds:" + intel_syntax); + } + if (prefixes & PREFIX_SS) + { + used_prefixes |= PREFIX_SS; + oappend ("%ss:" + intel_syntax); + } + if (prefixes & PREFIX_ES) + { + used_prefixes |= PREFIX_ES; + oappend ("%es:" + intel_syntax); + } + if (prefixes & PREFIX_FS) + { + used_prefixes |= PREFIX_FS; + oappend ("%fs:" + intel_syntax); + } + if (prefixes & PREFIX_GS) + { + used_prefixes |= PREFIX_GS; + oappend ("%gs:" + intel_syntax); + } +} + +static void +OP_indirE (bytemode, sizeflag) + int bytemode; + int sizeflag; +{ + if (!intel_syntax) + oappend ("*"); + OP_E (bytemode, sizeflag); +} + +static void +print_operand_value (buf, hex, disp) + char *buf; + int hex; + bfd_vma disp; +{ + if (mode_64bit) + { + if (hex) + { + char tmp[30]; + int i; + buf[0] = '0'; + buf[1] = 'x'; + sprintf_vma (tmp, disp); + for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++); + strcpy (buf + 2, tmp + i); + } + else + { + bfd_signed_vma v = disp; + char tmp[30]; + int i; + if (v < 0) + { + *(buf++) = '-'; + v = -disp; + /* Check for possible overflow on 0x8000000000000000. */ + if (v < 0) + { + strcpy (buf, "9223372036854775808"); + return; + } + } + if (!v) + { + strcpy (buf, "0"); + return; + } + + i = 0; + tmp[29] = 0; + while (v) + { + tmp[28 - i] = (v % 10) + '0'; + v /= 10; + i++; + } + strcpy (buf, tmp + 29 - i); + } + } + else + { + if (hex) + sprintf (buf, "0x%x", (unsigned int) disp); + else + sprintf (buf, "%d", (int) disp); + } +} + +static void +OP_E (bytemode, sizeflag) + int bytemode; + int sizeflag; +{ + bfd_vma disp; + int add = 0; + int riprel = 0; + USED_REX (REX_EXTZ); + if (rex & REX_EXTZ) + add += 8; + + /* Skip mod/rm byte. */ + MODRM_CHECK; + codep++; + + if (mod == 3) + { + switch (bytemode) + { + case b_mode: + USED_REX (0); + if (rex) + oappend (names8rex[rm + add]); + else + oappend (names8[rm + add]); + break; + case w_mode: + oappend (names16[rm + add]); + break; + case d_mode: + oappend (names32[rm + add]); + break; + case q_mode: + oappend (names64[rm + add]); + break; + case m_mode: + if (mode_64bit) + oappend (names64[rm + add]); + else + oappend (names32[rm + add]); + break; + case v_mode: + USED_REX (REX_MODE64); + if (rex & REX_MODE64) + oappend (names64[rm + add]); + else if (sizeflag & DFLAG) + oappend (names32[rm + add]); + else + oappend (names16[rm + add]); + used_prefixes |= (prefixes & PREFIX_DATA); + break; + case 0: + if (!(codep[-2] == 0xAE && codep[-1] == 0xF8 /* sfence */) + && !(codep[-2] == 0xAE && codep[-1] == 0xF0 /* mfence */) + && !(codep[-2] == 0xAE && codep[-1] == 0xe8 /* lfence */)) + BadOp (); /* bad sfence,lea,lds,les,lfs,lgs,lss modrm */ + break; + default: + oappend (INTERNAL_DISASSEMBLER_ERROR); + break; + } + return; + } + + disp = 0; + append_seg (); + + if ((sizeflag & AFLAG) || mode_64bit) /* 32 bit address mode */ + { + int havesib; + int havebase; + int base; + int index = 0; + int scale = 0; + + havesib = 0; + havebase = 1; + base = rm; + + if (base == 4) + { + havesib = 1; + FETCH_DATA (the_info, codep + 1); + scale = (*codep >> 6) & 3; + index = (*codep >> 3) & 7; + base = *codep & 7; + USED_REX (REX_EXTY); + USED_REX (REX_EXTZ); + if (rex & REX_EXTY) + index += 8; + if (rex & REX_EXTZ) + base += 8; + codep++; + } + + switch (mod) + { + case 0: + if ((base & 7) == 5) + { + havebase = 0; + if (mode_64bit && !havesib && (sizeflag & AFLAG)) + riprel = 1; + disp = get32s (); + } + break; + case 1: + FETCH_DATA (the_info, codep + 1); + disp = *codep++; + if ((disp & 0x80) != 0) + disp -= 0x100; + break; + case 2: + disp = get32s (); + break; + } + + if (!intel_syntax) + if (mod != 0 || (base & 7) == 5) + { + print_operand_value (scratchbuf, !riprel, disp); + oappend (scratchbuf); + if (riprel) + { + set_op (disp, 1); + oappend ("(%rip)"); + } + } + + if (havebase || (havesib && (index != 4 || scale != 0))) + { + if (intel_syntax) + { + switch (bytemode) + { + case b_mode: + oappend ("BYTE PTR "); + break; + case w_mode: + oappend ("WORD PTR "); + break; + case v_mode: + oappend ("DWORD PTR "); + break; + case d_mode: + oappend ("QWORD PTR "); + break; + case m_mode: + if (mode_64bit) + oappend ("DWORD PTR "); + else + oappend ("QWORD PTR "); + break; + case x_mode: + oappend ("XWORD PTR "); + break; + default: + break; + } + } + *obufp++ = open_char; + if (intel_syntax && riprel) + oappend ("rip + "); + *obufp = '\0'; + USED_REX (REX_EXTZ); + if (!havesib && (rex & REX_EXTZ)) + base += 8; + if (havebase) + oappend (mode_64bit && (sizeflag & AFLAG) + ? names64[base] : names32[base]); + if (havesib) + { + if (index != 4) + { + if (intel_syntax) + { + if (havebase) + { + *obufp++ = separator_char; + *obufp = '\0'; + } + sprintf (scratchbuf, "%s", + mode_64bit && (sizeflag & AFLAG) + ? names64[index] : names32[index]); + } + else + sprintf (scratchbuf, ",%s", + mode_64bit && (sizeflag & AFLAG) + ? names64[index] : names32[index]); + oappend (scratchbuf); + } + if (!intel_syntax + || (intel_syntax + && bytemode != b_mode + && bytemode != w_mode + && bytemode != v_mode)) + { + *obufp++ = scale_char; + *obufp = '\0'; + sprintf (scratchbuf, "%d", 1 << scale); + oappend (scratchbuf); + } + } + if (intel_syntax) + if (mod != 0 || (base & 7) == 5) + { + /* Don't print zero displacements. */ + if (disp != 0) + { + if ((bfd_signed_vma) disp > 0) + { + *obufp++ = '+'; + *obufp = '\0'; + } + + print_operand_value (scratchbuf, 0, disp); + oappend (scratchbuf); + } + } + + *obufp++ = close_char; + *obufp = '\0'; + } + else if (intel_syntax) + { + if (mod != 0 || (base & 7) == 5) + { + if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS + | PREFIX_ES | PREFIX_FS | PREFIX_GS)) + ; + else + { + oappend (names_seg[ds_reg - es_reg]); + oappend (":"); + } + print_operand_value (scratchbuf, 1, disp); + oappend (scratchbuf); + } + } + } + else + { /* 16 bit address mode */ + switch (mod) + { + case 0: + if ((rm & 7) == 6) + { + disp = get16 (); + if ((disp & 0x8000) != 0) + disp -= 0x10000; + } + break; + case 1: + FETCH_DATA (the_info, codep + 1); + disp = *codep++; + if ((disp & 0x80) != 0) + disp -= 0x100; + break; + case 2: + disp = get16 (); + if ((disp & 0x8000) != 0) + disp -= 0x10000; + break; + } + + if (!intel_syntax) + if (mod != 0 || (rm & 7) == 6) + { + print_operand_value (scratchbuf, 0, disp); + oappend (scratchbuf); + } + + if (mod != 0 || (rm & 7) != 6) + { + *obufp++ = open_char; + *obufp = '\0'; + oappend (index16[rm + add]); + *obufp++ = close_char; + *obufp = '\0'; + } + } +} + +static void +OP_G (bytemode, sizeflag) + int bytemode; + int sizeflag; +{ + int add = 0; + USED_REX (REX_EXTX); + if (rex & REX_EXTX) + add += 8; + switch (bytemode) + { + case b_mode: + USED_REX (0); + if (rex) + oappend (names8rex[reg + add]); + else + oappend (names8[reg + add]); + break; + case w_mode: + oappend (names16[reg + add]); + break; + case d_mode: + oappend (names32[reg + add]); + break; + case q_mode: + oappend (names64[reg + add]); + break; + case v_mode: + USED_REX (REX_MODE64); + if (rex & REX_MODE64) + oappend (names64[reg + add]); + else if (sizeflag & DFLAG) + oappend (names32[reg + add]); + else + oappend (names16[reg + add]); + used_prefixes |= (prefixes & PREFIX_DATA); + break; + default: + oappend (INTERNAL_DISASSEMBLER_ERROR); + break; + } +} + +static bfd_vma +get64 () +{ + bfd_vma x; +#ifdef BFD64 + unsigned int a; + unsigned int b; + + FETCH_DATA (the_info, codep + 8); + a = *codep++ & 0xff; + a |= (*codep++ & 0xff) << 8; + a |= (*codep++ & 0xff) << 16; + a |= (*codep++ & 0xff) << 24; + b = *codep++ & 0xff; + b |= (*codep++ & 0xff) << 8; + b |= (*codep++ & 0xff) << 16; + b |= (*codep++ & 0xff) << 24; + x = a + ((bfd_vma) b << 32); +#else + abort (); + x = 0; +#endif + return x; +} + +static bfd_signed_vma +get32 () +{ + bfd_signed_vma x = 0; + + FETCH_DATA (the_info, codep + 4); + x = *codep++ & (bfd_signed_vma) 0xff; + x |= (*codep++ & (bfd_signed_vma) 0xff) << 8; + x |= (*codep++ & (bfd_signed_vma) 0xff) << 16; + x |= (*codep++ & (bfd_signed_vma) 0xff) << 24; + return x; +} + +static bfd_signed_vma +get32s () +{ + bfd_signed_vma x = 0; + + FETCH_DATA (the_info, codep + 4); + x = *codep++ & (bfd_signed_vma) 0xff; + x |= (*codep++ & (bfd_signed_vma) 0xff) << 8; + x |= (*codep++ & (bfd_signed_vma) 0xff) << 16; + x |= (*codep++ & (bfd_signed_vma) 0xff) << 24; + + x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31); + + return x; +} + +static int +get16 () +{ + int x = 0; + + FETCH_DATA (the_info, codep + 2); + x = *codep++ & 0xff; + x |= (*codep++ & 0xff) << 8; + return x; +} + +static void +set_op (op, riprel) + bfd_vma op; + int riprel; +{ + op_index[op_ad] = op_ad; + if (mode_64bit) + { + op_address[op_ad] = op; + op_riprel[op_ad] = riprel; + } + else + { + /* Mask to get a 32-bit address. */ + op_address[op_ad] = op & 0xffffffff; + op_riprel[op_ad] = riprel & 0xffffffff; + } +} + +static void +OP_REG (code, sizeflag) + int code; + int sizeflag; +{ + const char *s; + int add = 0; + USED_REX (REX_EXTZ); + if (rex & REX_EXTZ) + add = 8; + + switch (code) + { + case indir_dx_reg: + if (intel_syntax) + s = "[dx]"; + else + s = "(%dx)"; + break; + case ax_reg: case cx_reg: case dx_reg: case bx_reg: + case sp_reg: case bp_reg: case si_reg: case di_reg: + s = names16[code - ax_reg + add]; + break; + case es_reg: case ss_reg: case cs_reg: + case ds_reg: case fs_reg: case gs_reg: + s = names_seg[code - es_reg + add]; + break; + case al_reg: case ah_reg: case cl_reg: case ch_reg: + case dl_reg: case dh_reg: case bl_reg: case bh_reg: + USED_REX (0); + if (rex) + s = names8rex[code - al_reg + add]; + else + s = names8[code - al_reg]; + break; + case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg: + case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg: + if (mode_64bit) + { + s = names64[code - rAX_reg + add]; + break; + } + code += eAX_reg - rAX_reg; + /* Fall through. */ + case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg: + case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg: + USED_REX (REX_MODE64); + if (rex & REX_MODE64) + s = names64[code - eAX_reg + add]; + else if (sizeflag & DFLAG) + s = names32[code - eAX_reg + add]; + else + s = names16[code - eAX_reg + add]; + used_prefixes |= (prefixes & PREFIX_DATA); + break; + default: + s = INTERNAL_DISASSEMBLER_ERROR; + break; + } + oappend (s); +} + +static void +OP_IMREG (code, sizeflag) + int code; + int sizeflag; +{ + const char *s; + + switch (code) + { + case indir_dx_reg: + if (intel_syntax) + s = "[dx]"; + else + s = "(%dx)"; + break; + case ax_reg: case cx_reg: case dx_reg: case bx_reg: + case sp_reg: case bp_reg: case si_reg: case di_reg: + s = names16[code - ax_reg]; + break; + case es_reg: case ss_reg: case cs_reg: + case ds_reg: case fs_reg: case gs_reg: + s = names_seg[code - es_reg]; + break; + case al_reg: case ah_reg: case cl_reg: case ch_reg: + case dl_reg: case dh_reg: case bl_reg: case bh_reg: + USED_REX (0); + if (rex) + s = names8rex[code - al_reg]; + else + s = names8[code - al_reg]; + break; + case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg: + case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg: + USED_REX (REX_MODE64); + if (rex & REX_MODE64) + s = names64[code - eAX_reg]; + else if (sizeflag & DFLAG) + s = names32[code - eAX_reg]; + else + s = names16[code - eAX_reg]; + used_prefixes |= (prefixes & PREFIX_DATA); + break; + default: + s = INTERNAL_DISASSEMBLER_ERROR; + break; + } + oappend (s); +} + +static void +OP_I (bytemode, sizeflag) + int bytemode; + int sizeflag; +{ + bfd_signed_vma op; + bfd_signed_vma mask = -1; + + switch (bytemode) + { + case b_mode: + FETCH_DATA (the_info, codep + 1); + op = *codep++; + mask = 0xff; + break; + case q_mode: + if (mode_64bit) + { + op = get32s (); + break; + } + /* Fall through. */ + case v_mode: + USED_REX (REX_MODE64); + if (rex & REX_MODE64) + op = get32s (); + else if (sizeflag & DFLAG) + { + op = get32 (); + mask = 0xffffffff; + } + else + { + op = get16 (); + mask = 0xfffff; + } + used_prefixes |= (prefixes & PREFIX_DATA); + break; + case w_mode: + mask = 0xfffff; + op = get16 (); + break; + default: + oappend (INTERNAL_DISASSEMBLER_ERROR); + return; + } + + op &= mask; + scratchbuf[0] = '$'; + print_operand_value (scratchbuf + 1, 1, op); + oappend (scratchbuf + intel_syntax); + scratchbuf[0] = '\0'; +} + +static void +OP_I64 (bytemode, sizeflag) + int bytemode; + int sizeflag; +{ + bfd_signed_vma op; + bfd_signed_vma mask = -1; + + if (!mode_64bit) + { + OP_I (bytemode, sizeflag); + return; + } + + switch (bytemode) + { + case b_mode: + FETCH_DATA (the_info, codep + 1); + op = *codep++; + mask = 0xff; + break; + case v_mode: + USED_REX (REX_MODE64); + if (rex & REX_MODE64) + op = get64 (); + else if (sizeflag & DFLAG) + { + op = get32 (); + mask = 0xffffffff; + } + else + { + op = get16 (); + mask = 0xfffff; + } + used_prefixes |= (prefixes & PREFIX_DATA); + break; + case w_mode: + mask = 0xfffff; + op = get16 (); + break; + default: + oappend (INTERNAL_DISASSEMBLER_ERROR); + return; + } + + op &= mask; + scratchbuf[0] = '$'; + print_operand_value (scratchbuf + 1, 1, op); + oappend (scratchbuf + intel_syntax); + scratchbuf[0] = '\0'; +} + +static void +OP_sI (bytemode, sizeflag) + int bytemode; + int sizeflag; +{ + bfd_signed_vma op; + bfd_signed_vma mask = -1; + + switch (bytemode) + { + case b_mode: + FETCH_DATA (the_info, codep + 1); + op = *codep++; + if ((op & 0x80) != 0) + op -= 0x100; + mask = 0xffffffff; + break; + case v_mode: + USED_REX (REX_MODE64); + if (rex & REX_MODE64) + op = get32s (); + else if (sizeflag & DFLAG) + { + op = get32s (); + mask = 0xffffffff; + } + else + { + mask = 0xffffffff; + op = get16 (); + if ((op & 0x8000) != 0) + op -= 0x10000; + } + used_prefixes |= (prefixes & PREFIX_DATA); + break; + case w_mode: + op = get16 (); + mask = 0xffffffff; + if ((op & 0x8000) != 0) + op -= 0x10000; + break; + default: + oappend (INTERNAL_DISASSEMBLER_ERROR); + return; + } + + scratchbuf[0] = '$'; + print_operand_value (scratchbuf + 1, 1, op); + oappend (scratchbuf + intel_syntax); +} + +static void +OP_J (bytemode, sizeflag) + int bytemode; + int sizeflag; +{ + bfd_vma disp; + bfd_vma mask = -1; + + switch (bytemode) + { + case b_mode: + FETCH_DATA (the_info, codep + 1); + disp = *codep++; + if ((disp & 0x80) != 0) + disp -= 0x100; + break; + case v_mode: + if (sizeflag & DFLAG) + disp = get32s (); + else + { + disp = get16 (); + /* For some reason, a data16 prefix on a jump instruction + means that the pc is masked to 16 bits after the + displacement is added! */ + mask = 0xffff; + } + break; + default: + oappend (INTERNAL_DISASSEMBLER_ERROR); + return; + } + disp = (start_pc + codep - start_codep + disp) & mask; + set_op (disp, 0); + print_operand_value (scratchbuf, 1, disp); + oappend (scratchbuf); +} + +static void +OP_SEG (dummy, sizeflag) + int dummy ATTRIBUTE_UNUSED; + int sizeflag ATTRIBUTE_UNUSED; +{ + oappend (names_seg[reg]); +} + +static void +OP_DIR (dummy, sizeflag) + int dummy ATTRIBUTE_UNUSED; + int sizeflag; +{ + int seg, offset; + + if (sizeflag & DFLAG) + { + offset = get32 (); + seg = get16 (); + } + else + { + offset = get16 (); + seg = get16 (); + } + used_prefixes |= (prefixes & PREFIX_DATA); + if (intel_syntax) + sprintf (scratchbuf, "0x%x,0x%x", seg, offset); + else + sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset); + oappend (scratchbuf); +} + +static void +OP_OFF (bytemode, sizeflag) + int bytemode ATTRIBUTE_UNUSED; + int sizeflag; +{ + bfd_vma off; + + append_seg (); + + if ((sizeflag & AFLAG) || mode_64bit) + off = get32 (); + else + off = get16 (); + + if (intel_syntax) + { + if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS + | PREFIX_ES | PREFIX_FS | PREFIX_GS))) + { + oappend (names_seg[ds_reg - es_reg]); + oappend (":"); + } + } + print_operand_value (scratchbuf, 1, off); + oappend (scratchbuf); +} + +static void +OP_OFF64 (bytemode, sizeflag) + int bytemode ATTRIBUTE_UNUSED; + int sizeflag ATTRIBUTE_UNUSED; +{ + bfd_vma off; + + if (!mode_64bit) + { + OP_OFF (bytemode, sizeflag); + return; + } + + append_seg (); + + off = get64 (); + + if (intel_syntax) + { + if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS + | PREFIX_ES | PREFIX_FS | PREFIX_GS))) + { + oappend (names_seg[ds_reg - es_reg]); + oappend (":"); + } + } + print_operand_value (scratchbuf, 1, off); + oappend (scratchbuf); +} + +static void +ptr_reg (code, sizeflag) + int code; + int sizeflag; +{ + const char *s; + if (intel_syntax) + oappend ("["); + else + oappend ("("); + + USED_REX (REX_MODE64); + if (rex & REX_MODE64) + { + if (!(sizeflag & AFLAG)) + s = names32[code - eAX_reg]; + else + s = names64[code - eAX_reg]; + } + else if (sizeflag & AFLAG) + s = names32[code - eAX_reg]; + else + s = names16[code - eAX_reg]; + oappend (s); + if (intel_syntax) + oappend ("]"); + else + oappend (")"); +} + +static void +OP_ESreg (code, sizeflag) + int code; + int sizeflag; +{ + oappend ("%es:" + intel_syntax); + ptr_reg (code, sizeflag); +} + +static void +OP_DSreg (code, sizeflag) + int code; + int sizeflag; +{ + if ((prefixes + & (PREFIX_CS + | PREFIX_DS + | PREFIX_SS + | PREFIX_ES + | PREFIX_FS + | PREFIX_GS)) == 0) + prefixes |= PREFIX_DS; + append_seg (); + ptr_reg (code, sizeflag); +} + +static void +OP_C (dummy, sizeflag) + int dummy ATTRIBUTE_UNUSED; + int sizeflag ATTRIBUTE_UNUSED; +{ + int add = 0; + USED_REX (REX_EXTX); + if (rex & REX_EXTX) + add = 8; + sprintf (scratchbuf, "%%cr%d", reg + add); + oappend (scratchbuf + intel_syntax); +} + +static void +OP_D (dummy, sizeflag) + int dummy ATTRIBUTE_UNUSED; + int sizeflag ATTRIBUTE_UNUSED; +{ + int add = 0; + USED_REX (REX_EXTX); + if (rex & REX_EXTX) + add = 8; + if (intel_syntax) + sprintf (scratchbuf, "db%d", reg + add); + else + sprintf (scratchbuf, "%%db%d", reg + add); + oappend (scratchbuf); +} + +static void +OP_T (dummy, sizeflag) + int dummy ATTRIBUTE_UNUSED; + int sizeflag ATTRIBUTE_UNUSED; +{ + sprintf (scratchbuf, "%%tr%d", reg); + oappend (scratchbuf + intel_syntax); +} + +static void +OP_Rd (bytemode, sizeflag) + int bytemode; + int sizeflag; +{ + if (mod == 3) + OP_E (bytemode, sizeflag); + else + BadOp (); +} + +static void +OP_MMX (bytemode, sizeflag) + int bytemode ATTRIBUTE_UNUSED; + int sizeflag ATTRIBUTE_UNUSED; +{ + int add = 0; + USED_REX (REX_EXTX); + if (rex & REX_EXTX) + add = 8; + used_prefixes |= (prefixes & PREFIX_DATA); + if (prefixes & PREFIX_DATA) + sprintf (scratchbuf, "%%xmm%d", reg + add); + else + sprintf (scratchbuf, "%%mm%d", reg + add); + oappend (scratchbuf + intel_syntax); +} + +static void +OP_XMM (bytemode, sizeflag) + int bytemode ATTRIBUTE_UNUSED; + int sizeflag ATTRIBUTE_UNUSED; +{ + int add = 0; + USED_REX (REX_EXTX); + if (rex & REX_EXTX) + add = 8; + sprintf (scratchbuf, "%%xmm%d", reg + add); + oappend (scratchbuf + intel_syntax); +} + +static void +OP_EM (bytemode, sizeflag) + int bytemode; + int sizeflag; +{ + int add = 0; + if (mod != 3) + { + OP_E (bytemode, sizeflag); + return; + } + USED_REX (REX_EXTZ); + if (rex & REX_EXTZ) + add = 8; + + /* Skip mod/rm byte. */ + MODRM_CHECK; + codep++; + used_prefixes |= (prefixes & PREFIX_DATA); + if (prefixes & PREFIX_DATA) + sprintf (scratchbuf, "%%xmm%d", rm + add); + else + sprintf (scratchbuf, "%%mm%d", rm + add); + oappend (scratchbuf + intel_syntax); +} + +static void +OP_EX (bytemode, sizeflag) + int bytemode; + int sizeflag; +{ + int add = 0; + if (mod != 3) + { + OP_E (bytemode, sizeflag); + return; + } + USED_REX (REX_EXTZ); + if (rex & REX_EXTZ) + add = 8; + + /* Skip mod/rm byte. */ + MODRM_CHECK; + codep++; + sprintf (scratchbuf, "%%xmm%d", rm + add); + oappend (scratchbuf + intel_syntax); +} + +static void +OP_MS (bytemode, sizeflag) + int bytemode; + int sizeflag; +{ + if (mod == 3) + OP_EM (bytemode, sizeflag); + else + BadOp (); +} + +static void +OP_XS (bytemode, sizeflag) + int bytemode; + int sizeflag; +{ + if (mod == 3) + OP_EX (bytemode, sizeflag); + else + BadOp (); +} + +static const char *Suffix3DNow[] = { +/* 00 */ NULL, NULL, NULL, NULL, +/* 04 */ NULL, NULL, NULL, NULL, +/* 08 */ NULL, NULL, NULL, NULL, +/* 0C */ "pi2fw", "pi2fd", NULL, NULL, +/* 10 */ NULL, NULL, NULL, NULL, +/* 14 */ NULL, NULL, NULL, NULL, +/* 18 */ NULL, NULL, NULL, NULL, +/* 1C */ "pf2iw", "pf2id", NULL, NULL, +/* 20 */ NULL, NULL, NULL, NULL, +/* 24 */ NULL, NULL, NULL, NULL, +/* 28 */ NULL, NULL, NULL, NULL, +/* 2C */ NULL, NULL, NULL, NULL, +/* 30 */ NULL, NULL, NULL, NULL, +/* 34 */ NULL, NULL, NULL, NULL, +/* 38 */ NULL, NULL, NULL, NULL, +/* 3C */ NULL, NULL, NULL, NULL, +/* 40 */ NULL, NULL, NULL, NULL, +/* 44 */ NULL, NULL, NULL, NULL, +/* 48 */ NULL, NULL, NULL, NULL, +/* 4C */ NULL, NULL, NULL, NULL, +/* 50 */ NULL, NULL, NULL, NULL, +/* 54 */ NULL, NULL, NULL, NULL, +/* 58 */ NULL, NULL, NULL, NULL, +/* 5C */ NULL, NULL, NULL, NULL, +/* 60 */ NULL, NULL, NULL, NULL, +/* 64 */ NULL, NULL, NULL, NULL, +/* 68 */ NULL, NULL, NULL, NULL, +/* 6C */ NULL, NULL, NULL, NULL, +/* 70 */ NULL, NULL, NULL, NULL, +/* 74 */ NULL, NULL, NULL, NULL, +/* 78 */ NULL, NULL, NULL, NULL, +/* 7C */ NULL, NULL, NULL, NULL, +/* 80 */ NULL, NULL, NULL, NULL, +/* 84 */ NULL, NULL, NULL, NULL, +/* 88 */ NULL, NULL, "pfnacc", NULL, +/* 8C */ NULL, NULL, "pfpnacc", NULL, +/* 90 */ "pfcmpge", NULL, NULL, NULL, +/* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt", +/* 98 */ NULL, NULL, "pfsub", NULL, +/* 9C */ NULL, NULL, "pfadd", NULL, +/* A0 */ "pfcmpgt", NULL, NULL, NULL, +/* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1", +/* A8 */ NULL, NULL, "pfsubr", NULL, +/* AC */ NULL, NULL, "pfacc", NULL, +/* B0 */ "pfcmpeq", NULL, NULL, NULL, +/* B4 */ "pfmul", NULL, "pfrcpit2", "pfmulhrw", +/* B8 */ NULL, NULL, NULL, "pswapd", +/* BC */ NULL, NULL, NULL, "pavgusb", +/* C0 */ NULL, NULL, NULL, NULL, +/* C4 */ NULL, NULL, NULL, NULL, +/* C8 */ NULL, NULL, NULL, NULL, +/* CC */ NULL, NULL, NULL, NULL, +/* D0 */ NULL, NULL, NULL, NULL, +/* D4 */ NULL, NULL, NULL, NULL, +/* D8 */ NULL, NULL, NULL, NULL, +/* DC */ NULL, NULL, NULL, NULL, +/* E0 */ NULL, NULL, NULL, NULL, +/* E4 */ NULL, NULL, NULL, NULL, +/* E8 */ NULL, NULL, NULL, NULL, +/* EC */ NULL, NULL, NULL, NULL, +/* F0 */ NULL, NULL, NULL, NULL, +/* F4 */ NULL, NULL, NULL, NULL, +/* F8 */ NULL, NULL, NULL, NULL, +/* FC */ NULL, NULL, NULL, NULL, +}; + +static void +OP_3DNowSuffix (bytemode, sizeflag) + int bytemode ATTRIBUTE_UNUSED; + int sizeflag ATTRIBUTE_UNUSED; +{ + const char *mnemonic; + + FETCH_DATA (the_info, codep + 1); + /* AMD 3DNow! instructions are specified by an opcode suffix in the + place where an 8-bit immediate would normally go. ie. the last + byte of the instruction. */ + obufp = obuf + strlen (obuf); + mnemonic = Suffix3DNow[*codep++ & 0xff]; + if (mnemonic) + oappend (mnemonic); + else + { + /* Since a variable sized modrm/sib chunk is between the start + of the opcode (0x0f0f) and the opcode suffix, we need to do + all the modrm processing first, and don't know until now that + we have a bad opcode. This necessitates some cleaning up. */ + op1out[0] = '\0'; + op2out[0] = '\0'; + BadOp (); + } +} + +static const char *simd_cmp_op[] = { + "eq", + "lt", + "le", + "unord", + "neq", + "nlt", + "nle", + "ord" +}; + +static void +OP_SIMD_Suffix (bytemode, sizeflag) + int bytemode ATTRIBUTE_UNUSED; + int sizeflag ATTRIBUTE_UNUSED; +{ + unsigned int cmp_type; + + FETCH_DATA (the_info, codep + 1); + obufp = obuf + strlen (obuf); + cmp_type = *codep++ & 0xff; + if (cmp_type < 8) + { + char suffix1 = 'p', suffix2 = 's'; + used_prefixes |= (prefixes & PREFIX_REPZ); + if (prefixes & PREFIX_REPZ) + suffix1 = 's'; + else + { + used_prefixes |= (prefixes & PREFIX_DATA); + if (prefixes & PREFIX_DATA) + suffix2 = 'd'; + else + { + used_prefixes |= (prefixes & PREFIX_REPNZ); + if (prefixes & PREFIX_REPNZ) + suffix1 = 's', suffix2 = 'd'; + } + } + sprintf (scratchbuf, "cmp%s%c%c", + simd_cmp_op[cmp_type], suffix1, suffix2); + used_prefixes |= (prefixes & PREFIX_REPZ); + oappend (scratchbuf); + } + else + { + /* We have a bad extension byte. Clean up. */ + op1out[0] = '\0'; + op2out[0] = '\0'; + BadOp (); + } +} + +static void +SIMD_Fixup (extrachar, sizeflag) + int extrachar; + int sizeflag ATTRIBUTE_UNUSED; +{ + /* Change movlps/movhps to movhlps/movlhps for 2 register operand + forms of these instructions. */ + if (mod == 3) + { + char *p = obuf + strlen (obuf); + *(p + 1) = '\0'; + *p = *(p - 1); + *(p - 1) = *(p - 2); + *(p - 2) = *(p - 3); + *(p - 3) = extrachar; + } +} + +static void +BadOp (void) +{ + /* Throw away prefixes and 1st. opcode byte. */ + codep = insn_codep + 1; + oappend ("(bad)"); +} From 6cee07a9b289c9b068972d9f7c968d547e34dff1 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Sat, 13 Mar 2004 18:28:33 +0000 Subject: [PATCH 0471/1463] - Fixed comment. svn path=/trunk/; revision=8687 --- reactos/ntoskrnl/ke/i386/exp.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/ke/i386/exp.c b/reactos/ntoskrnl/ke/i386/exp.c index 6de7ec9b6d0..488eea88b7e 100644 --- a/reactos/ntoskrnl/ke/i386/exp.c +++ b/reactos/ntoskrnl/ke/i386/exp.c @@ -318,7 +318,10 @@ KiDoubleFaultHandler(VOID) StackBase = (ULONG)&init_stack; } - /* Change to an #if 0 if no frames are printed because of fpo. */ + /* + Change to an #if 0 to reduce the amount of information printed on + a recursive stack trace. + */ #if 1 DbgPrint("Frames: "); Frame = (PULONG)OldTss->Ebp; @@ -488,7 +491,8 @@ KiDumpTrapFrame(PKTRAP_FRAME Tf, ULONG Parameter1, ULONG Parameter2) * Dump the stack frames */ DbgPrint("Frames: "); -#if 0 + /* Change to an #if 0 if no frames are printed because of fpo. */ +#if 1 i = 1; Frame = (PULONG)Tf->Ebp; while (Frame != NULL) From 35f3e5b5244965c49a9c232361bdb08734b719ea Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Sat, 13 Mar 2004 18:30:56 +0000 Subject: [PATCH 0472/1463] - Record feature information from cpuid. Not used at the moment. svn path=/trunk/; revision=8688 --- reactos/ntoskrnl/ke/i386/kernel.c | 60 +++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/reactos/ntoskrnl/ke/i386/kernel.c b/reactos/ntoskrnl/ke/i386/kernel.c index 8296735b269..9efc3aa9394 100644 --- a/reactos/ntoskrnl/ke/i386/kernel.c +++ b/reactos/ntoskrnl/ke/i386/kernel.c @@ -41,9 +41,66 @@ ULONG KiPcrInitDone = 0; static ULONG PcrsAllocated = 0; static PHYSICAL_ADDRESS PcrPages[MAXIMUM_PROCESSORS]; +ULONG Ke386CpuidFlags, Ke386CpuidFlags2, Ke386CpuidExFlags; + +#define X86_EFLAGS_ID (1 << 21) /* FUNCTIONS *****************************************************************/ +VOID INIT_FUNCTION STATIC +Ki386GetCpuId(VOID) +{ + ULONG OrigFlags, Flags, FinalFlags; + ULONG MaxCpuidLevel; + + Ke386CpuidFlags = Ke386CpuidFlags2 = Ke386CpuidExFlags = 0; + + /* Try to toggle the id bit in eflags. */ + __asm__ ("pushfl\n\t" + "popl %0\n\t" + : "=r" (OrigFlags)); + Flags = OrigFlags ^ X86_EFLAGS_ID; + __asm__ ("pushl %1\n\t" + "popfl\n\t" + "pushfl\n\t" + "popl %0\n\t" + : "=r" (FinalFlags) + : "r" (Flags)); + if ((OrigFlags & X86_EFLAGS_ID) == (FinalFlags & X86_EFLAGS_ID)) + { + /* No cpuid supported. */ + return; + } + + /* Get maximum cpuid level supported. */ + __asm__("cpuid\n\t" + : "=a" (MaxCpuidLevel) + : "a" (0x00000000) + : "ebx", "ecx", "edx"); + if (MaxCpuidLevel > 0) + { + /* Get the feature flags. */ + __asm__("cpuid\n\t" + : "=d" (Ke386CpuidFlags), "=c" (Ke386CpuidFlags2) + : "a" (0x00000001) + : "ebx"); + } + + /* Get the maximum extended cpuid level supported. */ + __asm__("cpuid\n\t" + : "=a" (MaxCpuidLevel) + : "a" (0x80000000) + : "ebx", "ecx", "edx"); + if (MaxCpuidLevel > 0) + { + /* Get the extended feature flags. */ + __asm__("cpuid\n\t" + : "=d" (Ke386CpuidExFlags) + : "a" (0x80000001) + : "ebx", "ecx"); + } +} + VOID INIT_FUNCTION KePrepareForApplicationProcessorInit(ULONG Id) { @@ -131,6 +188,9 @@ KeInit1(VOID) KPCR->Tib.ExceptionList = (PVOID)-1; Ki386InitializeLdt(); + + /* Get processor information. */ + Ki386GetCpuId(); } VOID INIT_FUNCTION From 988f1d59688c577406d262e5d5147e599e6e5c30 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Sat, 13 Mar 2004 19:14:16 +0000 Subject: [PATCH 0473/1463] - Checked in MmMapLockedPages patch from Anich Gregor. svn path=/trunk/; revision=8689 --- reactos/ntoskrnl/mm/mdl.c | 150 +++++++++++++++++++++++++++++--------- reactos/ntoskrnl/mm/mm.c | 8 +- 2 files changed, 121 insertions(+), 37 deletions(-) diff --git a/reactos/ntoskrnl/mm/mdl.c b/reactos/ntoskrnl/mm/mdl.c index 6bf976ebbc6..869bde7b68f 100644 --- a/reactos/ntoskrnl/mm/mdl.c +++ b/reactos/ntoskrnl/mm/mdl.c @@ -1,4 +1,4 @@ -/* $Id: mdl.c,v 1.59 2004/03/06 22:21:20 dwelch Exp $ +/* $Id: mdl.c,v 1.60 2004/03/13 19:14:16 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -152,42 +152,78 @@ MmMapLockedPages(PMDL Mdl, KPROCESSOR_MODE AccessMode) KIRQL oldIrql; ULONG RegionSize; ULONG StartingOffset; - + PEPROCESS CurrentProcess, OldProcess; + DPRINT("MmMapLockedPages(Mdl %x, AccessMode %x)\n", Mdl, AccessMode); - if (Mdl->MdlFlags & MDL_SOURCE_IS_NONPAGED_POOL) + if ((Mdl->MdlFlags & MDL_SOURCE_IS_NONPAGED_POOL) && AccessMode != UserMode) { return(Mdl->MappedSystemVa); } - if (AccessMode == UserMode) - { - DPRINT1("MDL mapping to user-mode not yet handled.\n"); - KEBUGCHECK(0); - } - /* Calculate the number of pages required. */ RegionSize = PAGE_ROUND_UP(Mdl->ByteCount + Mdl->ByteOffset) / PAGE_SIZE; - /* Allocate that number of pages from the mdl mapping region. */ - KeAcquireSpinLock(&MiMdlMappingRegionLock, &oldIrql); + if (AccessMode == UserMode) + { + MEMORY_AREA *Result; + LARGE_INTEGER BoundaryAddressMultiple; + NTSTATUS Status; - StartingOffset = RtlFindClearBitsAndSet(&MiMdlMappingRegionAllocMap, RegionSize, MiMdlMappingRegionHint); - - if (StartingOffset == 0xffffffff) - { - DPRINT1("Out of MDL mapping space\n"); - KEBUGCHECK(0); - } + BoundaryAddressMultiple.QuadPart = 0; + Base = NULL; - Base = (char*)MiMdlMappingRegionBase + StartingOffset * PAGE_SIZE; + CurrentProcess = OldProcess = PsGetCurrentProcess(); + if (Mdl->Process != CurrentProcess) + { + KeAttachProcess(Mdl->Process); + CurrentProcess = Mdl->Process; + } + + MmLockAddressSpace(&CurrentProcess->AddressSpace); + Status = MmCreateMemoryArea(CurrentProcess, + &CurrentProcess->AddressSpace, + MEMORY_AREA_MDL_MAPPING, + &Base, + RegionSize * PAGE_SIZE, + 0, /* PAGE_READWRITE? */ + &Result, + FALSE, + FALSE, + BoundaryAddressMultiple); + MmUnlockAddressSpace(&CurrentProcess->AddressSpace); + if (!NT_SUCCESS(Status)) + { + KEBUGCHECK(0); + /* FIXME: handle this? */ + } + } + else + { + CurrentProcess = OldProcess = NULL; + + /* Allocate that number of pages from the mdl mapping region. */ + KeAcquireSpinLock(&MiMdlMappingRegionLock, &oldIrql); + + StartingOffset = RtlFindClearBitsAndSet(&MiMdlMappingRegionAllocMap, RegionSize, MiMdlMappingRegionHint); + + if (StartingOffset == 0xffffffff) + { + DPRINT1("Out of MDL mapping space\n"); + KEBUGCHECK(0); + } + + Base = (char*)MiMdlMappingRegionBase + StartingOffset * PAGE_SIZE; + + if (MiMdlMappingRegionHint == StartingOffset) + { + MiMdlMappingRegionHint +=RegionSize; + } + + KeReleaseSpinLock(&MiMdlMappingRegionLock, oldIrql); + } - if (MiMdlMappingRegionHint == StartingOffset) - { - MiMdlMappingRegionHint +=RegionSize; - } - KeReleaseSpinLock(&MiMdlMappingRegionLock, oldIrql); /* Set the virtual mappings for the MDL pages. */ MdlPages = (PULONG)(Mdl + 1); @@ -198,7 +234,7 @@ MmMapLockedPages(PMDL Mdl, KPROCESSOR_MODE AccessMode) PHYSICAL_ADDRESS dummyJunkNeeded; dummyJunkNeeded.QuadPart = MdlPages[i]; #endif - Status = MmCreateVirtualMapping(NULL, + Status = MmCreateVirtualMapping(CurrentProcess, (PVOID)((ULONG)Base+(i*PAGE_SIZE)), PAGE_READWRITE, #if defined(__GNUC__) @@ -214,6 +250,11 @@ MmMapLockedPages(PMDL Mdl, KPROCESSOR_MODE AccessMode) } } + if (AccessMode == UserMode && CurrentProcess != OldProcess) + { + KeDetachProcess(); + } + /* Mark the MDL has having being mapped. */ Mdl->MdlFlags = Mdl->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA; Mdl->MappedSystemVa = (char*)Base + Mdl->ByteOffset; @@ -223,7 +264,7 @@ MmMapLockedPages(PMDL Mdl, KPROCESSOR_MODE AccessMode) /* * @implemented */ -VOID STDCALL +VOID STDCALL MmUnmapLockedPages(PVOID BaseAddress, PMDL Mdl) /* * FUNCTION: Releases a mapping set up by a preceding call to MmMapLockedPages @@ -236,6 +277,7 @@ MmUnmapLockedPages(PVOID BaseAddress, PMDL Mdl) ULONG i; ULONG RegionSize; ULONG Base; + PEPROCESS CurrentProcess, OldProcess; DPRINT("MmUnmapLockedPages(BaseAddress %x, Mdl %x)\n", BaseAddress, Mdl); @@ -243,11 +285,26 @@ MmUnmapLockedPages(PVOID BaseAddress, PMDL Mdl) * In this case, the MDL has the same system address as the base address * so there is no need to free it */ - if (Mdl->MdlFlags & MDL_SOURCE_IS_NONPAGED_POOL) + if ((Mdl->MdlFlags & MDL_SOURCE_IS_NONPAGED_POOL) && + ((ULONG_PTR)BaseAddress >= KERNEL_BASE)) { return; } + if ((ULONG_PTR)BaseAddress >= KERNEL_BASE) + { + CurrentProcess = OldProcess = NULL; + } + else + { + CurrentProcess = OldProcess = PsGetCurrentProcess(); + if (Mdl->Process != CurrentProcess) + { + KeAttachProcess(Mdl->Process); + CurrentProcess = Mdl->Process; + } + } + /* Calculate the number of pages we mapped. */ RegionSize = PAGE_ROUND_UP(Mdl->ByteCount + Mdl->ByteOffset) / PAGE_SIZE; #if defined(__GNUC__) @@ -263,23 +320,44 @@ MmUnmapLockedPages(PVOID BaseAddress, PMDL Mdl) /* Unmap all the pages. */ for (i = 0; i < RegionSize; i++) { - MmDeleteVirtualMapping(NULL, + MmDeleteVirtualMapping(NULL, (char*)BaseAddress + (i * PAGE_SIZE), FALSE, NULL, NULL); } - KeAcquireSpinLock(&MiMdlMappingRegionLock, &oldIrql); - /* Deallocate all the pages used. */ - Base = (ULONG)((char*)BaseAddress - (char*)MiMdlMappingRegionBase) / PAGE_SIZE; - - RtlClearBits(&MiMdlMappingRegionAllocMap, Base, RegionSize); + if ((DWORD)BaseAddress >= KERNEL_BASE) + { + KeAcquireSpinLock(&MiMdlMappingRegionLock, &oldIrql); + /* Deallocate all the pages used. */ + Base = (ULONG)((char*)BaseAddress - (char*)MiMdlMappingRegionBase) / PAGE_SIZE; - MiMdlMappingRegionHint = min (MiMdlMappingRegionHint, Base); + RtlClearBits(&MiMdlMappingRegionAllocMap, Base, RegionSize); + + MiMdlMappingRegionHint = min (MiMdlMappingRegionHint, Base); + + KeReleaseSpinLock(&MiMdlMappingRegionLock, oldIrql); + } + else + { + MEMORY_AREA *Marea; + + Marea = MmOpenMemoryAreaByAddress( &CurrentProcess->AddressSpace, BaseAddress ); + if (Marea == NULL) + { + DPRINT1( "Couldn't open memory area when unmapping user-space pages!\n" ); + KEBUGCHECK(0); + } + + MmFreeMemoryArea( &CurrentProcess->AddressSpace, Marea->BaseAddress, 0, NULL, NULL ); + + if (CurrentProcess != OldProcess) + { + KeDetachProcess(); + } + } - KeReleaseSpinLock(&MiMdlMappingRegionLock, oldIrql); - /* Reset the MDL state. */ Mdl->MdlFlags = Mdl->MdlFlags & ~MDL_MAPPED_TO_SYSTEM_VA; Mdl->MappedSystemVa = NULL; diff --git a/reactos/ntoskrnl/mm/mm.c b/reactos/ntoskrnl/mm/mm.c index 648bab6f042..df19bc5b00e 100644 --- a/reactos/ntoskrnl/mm/mm.c +++ b/reactos/ntoskrnl/mm/mm.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: mm.c,v 1.68 2004/02/15 19:03:29 hbirr Exp $ +/* $Id: mm.c,v 1.69 2004/03/13 19:14:15 dwelch Exp $ * * COPYRIGHT: See COPYING in the top directory * PROJECT: ReactOS kernel @@ -35,6 +35,7 @@ #include <internal/ntoskrnl.h> #include <internal/io.h> #include <internal/ps.h> +#include <reactos/bugcodes.h> #define NDEBUG #include <internal/debug.h> @@ -78,6 +79,11 @@ NTSTATUS MmReleaseMemoryArea(PEPROCESS Process, PMEMORY_AREA Marea) NULL, NULL); break; + + case MEMORY_AREA_MDL_MAPPING: + KEBUGCHECK(PROCESS_HAS_LOCKED_PAGES); + break; + default: KEBUGCHECK(0); } From 8552f80d8248d2a3a8e2f592e0e578e163bb4f38 Mon Sep 17 00:00:00 2001 From: Jason Filby <jason.filby@gmail.com> Date: Sat, 13 Mar 2004 19:25:47 +0000 Subject: [PATCH 0474/1463] Finish off NtDuplicateToken svn path=/trunk/; revision=8690 --- reactos/ntoskrnl/se/token.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/reactos/ntoskrnl/se/token.c b/reactos/ntoskrnl/se/token.c index 6360dab593e..0b2c612dbd2 100644 --- a/reactos/ntoskrnl/se/token.c +++ b/reactos/ntoskrnl/se/token.c @@ -1,4 +1,4 @@ -/* $Id: token.c,v 1.32 2003/12/30 18:52:06 fireball Exp $ +/* $Id: token.c,v 1.33 2004/03/13 19:25:47 jfilby Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -817,7 +817,7 @@ NtSetInformationToken(IN HANDLE TokenHandle, /* - * @unimplemented + * @implemented */ NTSTATUS STDCALL NtDuplicateToken(IN HANDLE ExistingTokenHandle, @@ -827,7 +827,6 @@ NtDuplicateToken(IN HANDLE ExistingTokenHandle, IN TOKEN_TYPE TokenType, OUT PHANDLE NewTokenHandle) { -#if 0 PACCESS_TOKEN Token; PACCESS_TOKEN NewToken; NTSTATUS Status; @@ -839,19 +838,27 @@ NtDuplicateToken(IN HANDLE ExistingTokenHandle, UserMode, (PVOID*)&Token, NULL); + if (!NT_SUCCESS(Status)) + { + DPRINT1 ("Failed to reference token (Status %lx)\n", Status); + return Status; + } ExistingImpersonationLevel = Token->ImpersonationLevel; - SepDuplicateToken(Token, + Status = SepDuplicateToken(Token, ObjectAttributes, ImpersonationLevel, TokenType, ExistingImpersonationLevel, KeGetPreviousMode(), &NewToken); -#else - UNIMPLEMENTED; - return(STATUS_NOT_IMPLEMENTED); -#endif + if (!NT_SUCCESS(Status)) + { + DPRINT1 ("Failed to duplicate token (Status %lx)\n", Status); + return Status; + } + + return STATUS_SUCCESS; } VOID SepAdjustGroups(PACCESS_TOKEN Token, From 17d9fc0744a133d5d2391c642f270a94b87fcf5d Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sat, 13 Mar 2004 20:05:32 +0000 Subject: [PATCH 0475/1463] french translation for some start menu entries from Gge svn path=/trunk/; revision=8691 --- reactos/subsys/system/explorer/desktop/desktop.cpp | 3 ++- reactos/subsys/system/explorer/doxy-footer.html | 2 +- reactos/subsys/system/explorer/explorer_intres.rc | 8 ++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/reactos/subsys/system/explorer/desktop/desktop.cpp b/reactos/subsys/system/explorer/desktop/desktop.cpp index b3b86f33a1f..ec7d6632d7c 100644 --- a/reactos/subsys/system/explorer/desktop/desktop.cpp +++ b/reactos/subsys/system/explorer/desktop/desktop.cpp @@ -331,7 +331,8 @@ DesktopWindow::~DesktopWindow() HWND DesktopWindow::Create() { static IconWindowClass wcDesktop(TEXT("Progman"), IDI_REACTOS, CS_DBLCLKS); - wcDesktop.hbrBackground = (HBRUSH)(COLOR_BACKGROUND+1); + /* (disabled because of small ugly temporary artefacts when hiding start menu) + wcDesktop.hbrBackground = (HBRUSH)(COLOR_BACKGROUND+1); */ int width = GetSystemMetrics(SM_CXSCREEN); int height = GetSystemMetrics(SM_CYSCREEN); diff --git a/reactos/subsys/system/explorer/doxy-footer.html b/reactos/subsys/system/explorer/doxy-footer.html index 9eedeb9fbfb..1203a4b7b17 100644 --- a/reactos/subsys/system/explorer/doxy-footer.html +++ b/reactos/subsys/system/explorer/doxy-footer.html @@ -3,7 +3,7 @@ <tr> <td><address style="align: right;"><small> ROS Explorer Source Code Documentation -<br>generated on 01.03.2004 by <a href="http://www.doxygen.org/index.html"> +<br>generated on 13.03.2004 by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border=0> </small></address> </td> diff --git a/reactos/subsys/system/explorer/explorer_intres.rc b/reactos/subsys/system/explorer/explorer_intres.rc index b85c4b16bd3..e012fe87cf6 100644 --- a/reactos/subsys/system/explorer/explorer_intres.rc +++ b/reactos/subsys/system/explorer/explorer_intres.rc @@ -951,7 +951,7 @@ BEGIN IDS_SHUTDOWN "Arr阾er..." IDS_LAUNCH "Ex閏uter..." IDS_START_HELP "Aide" - IDS_SEARCH_FILES "Rechercher Files..." + IDS_SEARCH_FILES "Rechercher Fichiers..." IDS_DOCUMENTS "Documents" IDS_FAVORITES "Favoris" IDS_PROGRAMS "Programmes" @@ -978,8 +978,8 @@ BEGIN IDS_ABOUT_EXPLORER "A propos de l'explorateur..." IDS_LAUNCH_MANY_PROGRAMS "You have selected more than one program.\nAre you sure you want to launch all of them?" - IDS_DESKTOPBAR_SETTINGS "Desktop Settings" - IDS_DESKTOP "Desktop" + IDS_DESKTOPBAR_SETTINGS "Bureau" + IDS_DESKTOP "Bureau" IDS_TASKBAR "Taskbar" END @@ -987,7 +987,7 @@ STRINGTABLE DISCARDABLE BEGIN IDS_STARTMENU "Startmenu" IDS_MINIMIZE_ALL "mimimize all windows" - IDS_DESKTOP_NUM "Desktop %d" + IDS_DESKTOP_NUM "Bureau %d" END #endif // French (France) resources From 3211fcf2d035574c0755db54bd37071439d46565 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Sat, 13 Mar 2004 20:49:07 +0000 Subject: [PATCH 0476/1463] Implement LoadUserProfileW() and UnloadUserProfile(). svn path=/trunk/; revision=8693 --- reactos/lib/userenv/internal.h | 14 ++-- reactos/lib/userenv/misc.c | 61 ++++++++++++++++- reactos/lib/userenv/profile.c | 115 +++++++++++++++++++++++++++++++- reactos/lib/userenv/setup.c | 3 +- reactos/lib/userenv/userenv.c | 3 +- reactos/lib/userenv/userenv.def | 1 + reactos/lib/userenv/userenv.edf | 1 + 7 files changed, 188 insertions(+), 10 deletions(-) diff --git a/reactos/lib/userenv/internal.h b/reactos/lib/userenv/internal.h index fe53f8990d2..4458b5fb8b6 100644 --- a/reactos/lib/userenv/internal.h +++ b/reactos/lib/userenv/internal.h @@ -1,4 +1,4 @@ -/* $Id: internal.h,v 1.4 2004/01/16 15:31:53 ekohl Exp $ +/* $Id: internal.h,v 1.5 2004/03/13 20:49:07 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -24,21 +24,25 @@ DebugPrint (char* fmt,...); #endif /* __GNUC__ */ #define CHECKPOINT -/* directory.h */ +/* directory.c */ BOOL CopyDirectory (LPCWSTR lpDestinationPath, LPCWSTR lpSourcePath); -/* misc.h */ +/* misc.c */ LPWSTR AppendBackslash (LPWSTR String); +BOOL +GetUserSidFromToken (HANDLE hToken, + PUNICODE_STRING SidString); + +/* profile.c */ BOOL AppendSystemPostfix (LPWSTR lpName, DWORD dwMaxLength); - -/* registry.h */ +/* registry.c */ BOOL CreateUserHive (LPCWSTR lpKeyName); diff --git a/reactos/lib/userenv/misc.c b/reactos/lib/userenv/misc.c index ca0861ea1ac..4548eaa98ff 100644 --- a/reactos/lib/userenv/misc.c +++ b/reactos/lib/userenv/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.1 2004/01/16 15:31:53 ekohl Exp $ +/* $Id: misc.c,v 1.2 2004/03/13 20:49:07 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -32,4 +32,63 @@ AppendBackslash (LPWSTR String) return &String[Length]; } + +BOOL +GetUserSidFromToken (HANDLE hToken, + PUNICODE_STRING SidString) +{ + PSID_AND_ATTRIBUTES SidBuffer; + ULONG Length; + NTSTATUS Status; + + Length = 256; + SidBuffer = LocalAlloc (0, + Length); + if (SidBuffer == NULL) + return FALSE; + + Status = NtQueryInformationToken (hToken, + TokenUser, + (PVOID)SidBuffer, + Length, + &Length); + if (Status == STATUS_BUFFER_TOO_SMALL) + { + SidBuffer = LocalReAlloc (SidBuffer, + Length, + 0); + if (SidBuffer == NULL) + return FALSE; + + Status = NtQueryInformationToken (hToken, + TokenUser, + (PVOID)SidBuffer, + Length, + &Length); + } + + if (!NT_SUCCESS (Status)) + { + LocalFree (SidBuffer); + return FALSE; + } + + DPRINT ("SidLength: %lu\n", RtlLengthSid (SidBuffer[0].Sid)); + + Status = RtlConvertSidToUnicodeString (SidString, + SidBuffer[0].Sid, + TRUE); + + LocalFree (SidBuffer); + + if (!NT_SUCCESS (Status)) + return FALSE; + + DPRINT ("SidString.Length: %lu\n", SidString->Length); + DPRINT ("SidString.MaximumLength: %lu\n", SidString->MaximumLength); + DPRINT ("SidString: '%wZ'\n", SidString); + + return TRUE; +} + /* EOF */ diff --git a/reactos/lib/userenv/profile.c b/reactos/lib/userenv/profile.c index d7d927a5a4c..564dc9fbdd3 100644 --- a/reactos/lib/userenv/profile.c +++ b/reactos/lib/userenv/profile.c @@ -1,4 +1,4 @@ -/* $Id: profile.c,v 1.5 2004/02/28 11:30:59 ekohl Exp $ +/* $Id: profile.c,v 1.6 2004/03/13 20:49:07 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -515,6 +515,14 @@ BOOL WINAPI LoadUserProfileW (HANDLE hToken, LPPROFILEINFOW lpProfileInfo) { + WCHAR szRawProfilesPath[MAX_PATH]; + WCHAR szProfilesPath[MAX_PATH]; + WCHAR szUserHivePath[MAX_PATH]; + UNICODE_STRING SidString; + DWORD dwLength; + HKEY hKey; + + DPRINT ("LoadUserProfileW() called\n"); /* Check profile info */ if (lpProfileInfo->dwSize != sizeof(PROFILEINFOW) || @@ -525,7 +533,110 @@ LoadUserProfileW (HANDLE hToken, return FALSE; } - /* FIXME: load the profile */ + if (RegOpenKeyExW (HKEY_LOCAL_MACHINE, + L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList", + 0, + KEY_ALL_ACCESS, + &hKey)) + { + DPRINT1("Error: %lu\n", GetLastError()); + return FALSE; + } + + /* Get profiles path */ + dwLength = MAX_PATH * sizeof(WCHAR); + if (RegQueryValueExW (hKey, + L"ProfilesDirectory", + NULL, + NULL, + (LPBYTE)szRawProfilesPath, + &dwLength)) + { + DPRINT1("Error: %lu\n", GetLastError()); + RegCloseKey (hKey); + return FALSE; + } + + /* Expand it */ + if (!ExpandEnvironmentStringsW (szRawProfilesPath, + szProfilesPath, + MAX_PATH)) + { + DPRINT1("Error: %lu\n", GetLastError()); + RegCloseKey (hKey); + return FALSE; + } + + RegCloseKey (hKey); + + wcscpy (szUserHivePath, szProfilesPath); + wcscat (szUserHivePath, L"\\"); + wcscat (szUserHivePath, lpProfileInfo->lpUserName); + if (!AppendSystemPostfix (szUserHivePath, MAX_PATH)) + { + DPRINT1("AppendSystemPostfix() failed\n", GetLastError()); + return FALSE; + } + + /* Create user hive name */ + wcscat (szUserHivePath, L"\\ntuser.dat"); + + DPRINT ("szUserHivePath: %S\n", szUserHivePath); + + if (!GetUserSidFromToken (hToken, + &SidString)) + { + DPRINT1 ("GetUserSidFromToken() failed\n"); + return FALSE; + } + + DPRINT ("SidString: '%wZ'\n", &SidString); + + if (RegLoadKeyW (HKEY_USERS, + SidString.Buffer, + szUserHivePath)) + { + DPRINT1 ("RegLoadKeyW() failed (Error %ld)\n", GetLastError()); + RtlFreeUnicodeString (&SidString); + return FALSE; + } + + RtlFreeUnicodeString (&SidString); + + DPRINT ("LoadUserProfileW() done\n"); + + return TRUE; +} + + +BOOL WINAPI +UnloadUserProfile (HANDLE hToken, + HANDLE hProfile) +{ + UNICODE_STRING SidString; + + DPRINT ("UnloadUserProfile() called\n"); + + if (!GetUserSidFromToken (hToken, + &SidString)) + { + DPRINT1 ("GetUserSidFromToken() failed\n"); + return FALSE; + } + + DPRINT ("SidString: '%wZ'\n", &SidString); + + if (RegUnLoadKeyW (HKEY_USERS, + SidString.Buffer)) + { + DPRINT1 ("RegUnLoadKeyW() failed (Error %ld)\n", GetLastError()); + RtlFreeUnicodeString (&SidString); + return FALSE; + } + + RtlFreeUnicodeString (&SidString); + + DPRINT ("UnloadUserProfile() done\n"); return TRUE; } diff --git a/reactos/lib/userenv/setup.c b/reactos/lib/userenv/setup.c index bd72482574f..835a8945124 100644 --- a/reactos/lib/userenv/setup.c +++ b/reactos/lib/userenv/setup.c @@ -1,4 +1,4 @@ -/* $Id: setup.c,v 1.3 2004/01/16 15:31:53 ekohl Exp $ +/* $Id: setup.c,v 1.4 2004/03/13 20:49:07 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -7,6 +7,7 @@ * PROGRAMMER: Eric Kohl */ +#include <ntos.h> #include <windows.h> #include <string.h> #include <stdarg.h> diff --git a/reactos/lib/userenv/userenv.c b/reactos/lib/userenv/userenv.c index 2b9993df49c..b2acad5143a 100644 --- a/reactos/lib/userenv/userenv.c +++ b/reactos/lib/userenv/userenv.c @@ -1,4 +1,4 @@ -/* $Id: userenv.c,v 1.1 2004/01/09 19:52:01 ekohl Exp $ +/* $Id: userenv.c,v 1.2 2004/03/13 20:49:07 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -7,6 +7,7 @@ * PROGRAMMER: Eric Kohl */ +#include <ntos.h> #include <windows.h> #include <userenv.h> diff --git a/reactos/lib/userenv/userenv.def b/reactos/lib/userenv/userenv.def index 7a44c804dea..3be07e7d780 100644 --- a/reactos/lib/userenv/userenv.def +++ b/reactos/lib/userenv/userenv.def @@ -7,4 +7,5 @@ GetProfilesDirectoryW@8 GetUserProfileDirectoryW@12 CreateUserProfileW@8 LoadUserProfileW@8 +UnloadUserProfile@8 ;EOF diff --git a/reactos/lib/userenv/userenv.edf b/reactos/lib/userenv/userenv.edf index 806a4469c11..e79f6d00eb1 100644 --- a/reactos/lib/userenv/userenv.edf +++ b/reactos/lib/userenv/userenv.edf @@ -7,4 +7,5 @@ GetProfilesDirectoryW=GetProfilesDirectoryW@8 GetUserProfileDirectoryW=GetUserProfileDirectoryW@12 CreateUserProfileW=CreateUserProfileW@8 LoadUserProfileW=LoadUserProfileW@8 +UnloadUserProfile=UnloadUserProfile@8 ;EOF From 1bc3d1b4ed8d3c9eabbefc8324ad3380939717df Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 13 Mar 2004 21:33:16 +0000 Subject: [PATCH 0477/1463] - Fixed DPRINT. svn path=/trunk/; revision=8694 --- 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 6d8b05064c5..2b8e800a60f 100644 --- a/reactos/drivers/video/miniport/vbe/vbemp.c +++ b/reactos/drivers/video/miniport/vbe/vbemp.c @@ -97,7 +97,7 @@ InitializeVideoAddressSpace(VOID) if (BaseAddress != (PVOID)0xa0000) { DPRINT(("VBEMP: Couldn't map physical memory at the right address " - "(was %x)(%x)\n", BaseAddress, Address)); + "(was %x)\n", BaseAddress)); return FALSE; } From ea0774aba39e0027aa88c73e483f531a88838220 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sat, 13 Mar 2004 22:23:14 +0000 Subject: [PATCH 0478/1463] RtlGetFullPathName_U() is supposed to check the parameter buf, it could be NULL svn path=/trunk/; revision=8695 --- reactos/lib/ntdll/rtl/path.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/reactos/lib/ntdll/rtl/path.c b/reactos/lib/ntdll/rtl/path.c index 1f865cc93f6..b37dbf2d722 100644 --- a/reactos/lib/ntdll/rtl/path.c +++ b/reactos/lib/ntdll/rtl/path.c @@ -1,4 +1,4 @@ -/* $Id: path.c,v 1.26 2003/11/30 20:48:07 gdalsnes Exp $ +/* $Id: path.c,v 1.27 2004/03/13 22:23:14 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -575,7 +575,8 @@ RtlGetFullPathName_U(PWSTR DosName, len--; if (FilePart) *FilePart = NULL; - *buf = 0; + if (buf) + *buf = 0; CHECKPOINT; /* check for DOS device name */ @@ -586,8 +587,11 @@ CHECKPOINT; sz &= 0x0000FFFF; if (sz + 8 >= size) return sz + 10; - wcscpy (buf, L"\\\\.\\"); - wcsncat (buf, DosName + offs, sz / sizeof(WCHAR)); + if (buf) + { + wcscpy (buf, L"\\\\.\\"); + wcsncat (buf, DosName + offs, sz / sizeof(WCHAR)); + } return sz + 8; } @@ -721,10 +725,11 @@ CHECKPOINT; if (len < (size / sizeof(WCHAR))) { - memcpy (buf, TempFullPathName, (len + 1) * sizeof(WCHAR)); + if (buf) + memcpy (buf, TempFullPathName, (len + 1) * sizeof(WCHAR)); /* find file part */ - if (FilePart) + if (FilePart && buf) { #if 0 *FilePart = wcsrchr(buf, L'\\'); From e8cf99cda9221c519c3963efc746c06d2f18b41b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Sat, 13 Mar 2004 23:12:19 +0000 Subject: [PATCH 0479/1463] Delay unlinking of windows until after all messages have been sent. This fixes bug #241. svn path=/trunk/; revision=8696 --- reactos/subsys/win32k/ntuser/window.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 931a7cc18b6..d3a712dcc09 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.198 2004/03/09 21:21:39 dwelch Exp $ +/* $Id: window.c,v 1.199 2004/03/13 23:12:19 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -533,7 +533,7 @@ DestroyThreadWindows(struct _ETHREAD *Thread) for(pWnd = List; *pWnd; pWnd++) { - IntDestroyWindow(*pWnd, Win32Process, Win32Thread, FALSE); + NtUserDestroyWindow((*pWnd)->Self); IntReleaseWindowObject(*pWnd); } ExFreePool(List); @@ -1868,9 +1868,6 @@ NtUserDestroyWindow(HWND Wnd) return TRUE; } - /* Unlink now so we won't bother with the children later on */ - IntUnlinkWindow(Window); - /* Destroy the window storage */ IntDestroyWindow(Window, PsGetWin32Process(), PsGetWin32Thread(), TRUE); From cd7fbb8e5c6af936fcc8cc4122061b9b2b4df0f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Sun, 14 Mar 2004 00:11:28 +0000 Subject: [PATCH 0480/1463] Translate pixel value from internal pixel format to RGB. Fixes bug #251. svn path=/trunk/; revision=8697 --- reactos/subsys/win32k/objects/bitmaps.c | 33 ++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index a6363ab909d..5eb5d2a8ccb 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.60 2004/03/10 16:55:03 navaraf Exp $ */ +/* $Id: bitmaps.c,v 1.61 2004/03/14 00:11:28 gvg Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> #include <stdlib.h> @@ -458,6 +458,10 @@ COLORREF STDCALL NtGdiGetPixel(HDC hDC, INT XPos, INT YPos) COLORREF Result = (COLORREF) 0; PSURFGDI Surface; PSURFOBJ SurfaceObject; + HPALETTE Pal; + PPALGDI PalGDI; + USHORT PalMode; + PXLATEOBJ XlateObj = NULL; dc = DC_LockDc (hDC); if (dc == NULL) @@ -480,6 +484,33 @@ COLORREF STDCALL NtGdiGetPixel(HDC hDC, INT XPos, INT YPos) return (COLORREF)CLR_INVALID; } Result = Surface->DIB_GetPixel(SurfaceObject, XPos, YPos); + + if (dc->w.hPalette != 0) + { + Pal = dc->w.hPalette; + } + else + { + Pal = NtGdiGetStockObject(DEFAULT_PALETTE); + } + PalGDI = PALETTE_LockPalette(Pal); + if (NULL == PalGDI) + { + DC_UnlockDc(hDC); + return (COLORREF)CLR_INVALID; + } + PalMode = PalGDI->Mode; + PALETTE_UnlockPalette(Pal); + + XlateObj = (PXLATEOBJ) IntEngCreateXlate(PAL_RGB, PalMode, NULL, Pal); + if (NULL == XlateObj) + { + DC_UnlockDc(hDC); + return (COLORREF)CLR_INVALID; + } + Result = XLATEOBJ_iXlate(XlateObj, Result); + EngDeleteXlate(XlateObj); + DC_UnlockDc(hDC); return Result; } From ff837bae4a80ecf7bb69d5c5a2b6f146b15ade60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Sun, 14 Mar 2004 08:51:16 +0000 Subject: [PATCH 0481/1463] Explicitly include stddef.h for offsetof, needed for newer GCC versions svn path=/trunk/; revision=8698 --- reactos/lib/comctl32/listview.c | 1 + reactos/lib/ole32/oleproxy.c | 1 + 2 files changed, 2 insertions(+) diff --git a/reactos/lib/comctl32/listview.c b/reactos/lib/comctl32/listview.c index cfc92ed2e88..7cdb92cc58e 100644 --- a/reactos/lib/comctl32/listview.c +++ b/reactos/lib/comctl32/listview.c @@ -147,6 +147,7 @@ #include <assert.h> #include <ctype.h> #include <string.h> +#include <stddef.h> #include <stdlib.h> #include <stdarg.h> #include <stdio.h> diff --git a/reactos/lib/ole32/oleproxy.c b/reactos/lib/ole32/oleproxy.c index a2f63109a84..e381cde6574 100644 --- a/reactos/lib/ole32/oleproxy.c +++ b/reactos/lib/ole32/oleproxy.c @@ -35,6 +35,7 @@ #include <stdlib.h> #include <stdarg.h> +#include <stddef.h> #include <stdio.h> #include <string.h> From 8dc9f6bf9c841dffa73526b7e9b8c2b25d52f80e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Sun, 14 Mar 2004 09:17:53 +0000 Subject: [PATCH 0482/1463] Avoid ReactOS changes getting lost svn path=/trunk/; revision=8699 --- reactos/lib/comctl32/winehq2ros.patch | 37 +++++++++++++-------------- reactos/lib/ole32/winehq2ros.patch | 17 +++++++++++- 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/reactos/lib/comctl32/winehq2ros.patch b/reactos/lib/comctl32/winehq2ros.patch index 1ec16ac12d0..16c67a2d4e3 100644 --- a/reactos/lib/comctl32/winehq2ros.patch +++ b/reactos/lib/comctl32/winehq2ros.patch @@ -4,7 +4,7 @@ RCS file: /home/wine/wine/dlls/comctl32/comctl32.spec,v retrieving revision 1.43 diff -u -r1.43 comctl32.spec --- comctl32.spec 20 Feb 2004 05:16:37 -0000 1.43 -+++ comctl32.spec 11 Mar 2004 11:16:16 -0000 ++++ comctl32.spec 14 Mar 2004 09:18:35 -0000 @@ -106,13 +106,13 @@ 412 stdcall RemoveWindowSubclass(long ptr long) 413 stdcall DefSubclassProc(long long long long) @@ -26,13 +26,28 @@ diff -u -r1.43 comctl32.spec # Functions imported by name +Index: listview.c +=================================================================== +RCS file: /home/wine/wine/dlls/comctl32/listview.c,v +retrieving revision 1.384 +diff -u -r1.384 listview.c +--- listview.c 20 Feb 2004 05:12:49 -0000 1.384 ++++ listview.c 14 Mar 2004 09:18:43 -0000 +@@ -147,6 +147,7 @@ + #include <assert.h> + #include <ctype.h> + #include <string.h> ++#include <stddef.h> + #include <stdlib.h> + #include <stdarg.h> + #include <stdio.h> Index: rebar.c =================================================================== RCS file: /home/wine/wine/dlls/comctl32/rebar.c,v retrieving revision 1.85 diff -u -r1.85 rebar.c --- rebar.c 27 Feb 2004 04:32:54 -0000 1.85 -+++ rebar.c 11 Mar 2004 11:16:19 -0000 ++++ rebar.c 14 Mar 2004 09:18:47 -0000 @@ -985,7 +985,7 @@ } @@ -67,7 +82,7 @@ RCS file: /home/wine/wine/dlls/comctl32/string.c,v retrieving revision 1.3 diff -u -r1.3 string.c --- string.c 20 Feb 2004 19:58:39 -0000 1.3 -+++ string.c 11 Mar 2004 11:16:19 -0000 ++++ string.c 14 Mar 2004 09:18:48 -0000 @@ -254,7 +254,7 @@ { TRACE("(%s,%s)\n", debugstr_w(lpszStr), debugstr_w(lpszSearch)); @@ -86,19 +101,3 @@ diff -u -r1.3 string.c } /************************************************************************* -Index: toolbar.c -=================================================================== -RCS file: /home/wine/wine/dlls/comctl32/toolbar.c,v -retrieving revision 1.160 -diff -u -r1.160 toolbar.c ---- toolbar.c 7 Mar 2004 03:13:26 -0000 1.160 -+++ toolbar.c 11 Mar 2004 11:16:21 -0000 -@@ -2299,7 +2299,7 @@ - TRACE ("creating default image list!\n"); - - himlDef = ImageList_Create (infoPtr->nBitmapWidth, infoPtr->nBitmapHeight, -- ILC_COLOR | ILC_MASK, nButtons, 2); -+ ILC_COLORDDB | ILC_MASK, nButtons, 2); - TOOLBAR_InsertImageList(&infoPtr->himlDef, &infoPtr->cimlDef, himlDef, 0); - infoPtr->himlInt = himlDef; - } diff --git a/reactos/lib/ole32/winehq2ros.patch b/reactos/lib/ole32/winehq2ros.patch index e36101fcdb7..9ee56656109 100644 --- a/reactos/lib/ole32/winehq2ros.patch +++ b/reactos/lib/ole32/winehq2ros.patch @@ -4,7 +4,7 @@ RCS file: /home/wine/wine/dlls/ole32/ifs.h,v retrieving revision 1.11 diff -u -r1.11 ifs.h --- ifs.h 23 Jan 2004 22:51:42 -0000 1.11 -+++ ifs.h 28 Jan 2004 21:32:28 -0000 ++++ ifs.h 14 Mar 2004 09:24:36 -0000 @@ -35,6 +35,7 @@ typedef struct IMalloc16 IMalloc16, *LPMALLOC16; @@ -13,3 +13,18 @@ diff -u -r1.11 ifs.h #define INTERFACE IMalloc16 #define IMalloc16_METHODS \ IUnknown_METHODS \ +Index: oleproxy.c +=================================================================== +RCS file: /home/wine/wine/dlls/ole32/oleproxy.c,v +retrieving revision 1.13 +diff -u -r1.13 oleproxy.c +--- oleproxy.c 23 Jan 2004 01:51:34 -0000 1.13 ++++ oleproxy.c 14 Mar 2004 09:24:39 -0000 +@@ -35,6 +35,7 @@ + + #include <stdlib.h> + #include <stdarg.h> ++#include <stddef.h> + #include <stdio.h> + #include <string.h> + From 89265e015186c6f06d54001df467ca168f4db954 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sun, 14 Mar 2004 09:21:42 +0000 Subject: [PATCH 0483/1463] Implemented CreateHardLink() svn path=/trunk/; revision=8700 --- reactos/include/ddk/fstypes.h | 8 +- reactos/include/ddk/iodef.h | 2 + reactos/lib/kernel32/file/hardlink.c | 251 +++++++++++++++++++++++++++ reactos/lib/kernel32/k32.h | 1 + reactos/lib/kernel32/makefile | 4 +- reactos/lib/kernel32/misc/stubs.c | 32 +--- 6 files changed, 264 insertions(+), 34 deletions(-) create mode 100644 reactos/lib/kernel32/file/hardlink.c diff --git a/reactos/include/ddk/fstypes.h b/reactos/include/ddk/fstypes.h index d04f7bc0101..c8d7519e4d7 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.13 2003/08/14 18:30:27 silverblade Exp $ */ +/* $Id: fstypes.h,v 1.14 2004/03/14 09:21:41 weiden Exp $ */ #ifndef __USE_W32API @@ -14,6 +14,12 @@ typedef struct _FILE_LOCK_INFO { LARGE_INTEGER EndingByte; } FILE_LOCK_INFO, *PFILE_LOCK_INFO; +typedef struct _FILE_LINK_INFORMATION { + BOOLEAN ReplaceIfExists; + HANDLE RootDirectory; + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_LINK_INFORMATION, *PFILE_LINK_INFORMATION; typedef NTSTATUS (*PCOMPLETE_LOCK_IRP_ROUTINE) ( IN PVOID Context, diff --git a/reactos/include/ddk/iodef.h b/reactos/include/ddk/iodef.h index f6248fa14dc..608005a0c8d 100644 --- a/reactos/include/ddk/iodef.h +++ b/reactos/include/ddk/iodef.h @@ -428,6 +428,8 @@ enum #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032 #define FILE_VALID_SET_FLAGS 0x00001036 +#define FILE_OPEN_REPARSE_POINT 0x00200000 + /* * special ByteOffset values */ diff --git a/reactos/lib/kernel32/file/hardlink.c b/reactos/lib/kernel32/file/hardlink.c new file mode 100644 index 00000000000..ab28ec4d9e6 --- /dev/null +++ b/reactos/lib/kernel32/file/hardlink.c @@ -0,0 +1,251 @@ +/* $Id: hardlink.c,v 1.1 2004/03/14 09:21:42 weiden Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * FILE: lib/kernel32/file/hardlink.c + * PURPOSE: Hardlink functions + * PROGRAMMER: Thomas Weidenmueller (w3seek@users.sourceforge.net) + * UPDATE HISTORY: + * Created 13/03/2004 + */ + +/* INCLUDES *****************************************************************/ + +#include <k32.h> +#include <ddk/ntifs.h> + +#define NDEBUG +#include "../include/debug.h" + + +/* FUNCTIONS ****************************************************************/ + + +/* + * @implemented + */ +BOOL STDCALL +CreateHardLinkW( + LPCWSTR lpFileName, + LPCWSTR lpExistingFileName, + LPSECURITY_ATTRIBUTES lpSecurityAttributes +) +{ + UNICODE_STRING LinkTarget, LinkName, CheckDrive, LinkDrive, LanManager; + LPWSTR lpNtLinkTarget, lpFilePart; + ULONG NeededSize; + LPVOID lpSecurityDescriptor; + WCHAR wCheckDrive[10]; + OBJECT_ATTRIBUTES ObjectAttribues; + PFILE_LINK_INFORMATION LinkInformation; + IO_STATUS_BLOCK IoStatus; + HANDLE hFile, hTarget; + NTSTATUS Status; + + if(!lpFileName || !lpExistingFileName) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + lpSecurityDescriptor = (lpSecurityAttributes ? lpSecurityAttributes->lpSecurityDescriptor : NULL); + + if(RtlDetermineDosPathNameType_U((LPWSTR)lpFileName) == 1 || + RtlDetermineDosPathNameType_U((LPWSTR)lpExistingFileName) == 1) + { + DPRINT1("CreateHardLinkW() cannot handle UNC Paths!\n"); + SetLastError(ERROR_INVALID_NAME); + return FALSE; + } + + if(!RtlDosPathNameToNtPathName_U((LPWSTR)lpExistingFileName, &LinkTarget, NULL, NULL)) + { + SetLastError(ERROR_PATH_NOT_FOUND); + return FALSE; + } + + if(!(NeededSize = RtlGetFullPathName_U((LPWSTR)lpExistingFileName, 0, NULL, NULL))) + { + RtlFreeUnicodeString(&LinkTarget); + SetLastError(ERROR_INVALID_NAME); + return FALSE; + } + + NeededSize += 2; + if(!(lpNtLinkTarget = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, NeededSize * sizeof(WCHAR)))) + { + RtlFreeUnicodeString(&LinkTarget); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + + if(!RtlGetFullPathName_U((LPWSTR)lpExistingFileName, NeededSize, lpNtLinkTarget, &lpFilePart)) + { + RtlFreeHeap(RtlGetProcessHeap(), 0, lpNtLinkTarget); + RtlFreeUnicodeString(&LinkTarget); + SetLastError(ERROR_INVALID_NAME); + return FALSE; + } + + swprintf(wCheckDrive, L"\\??\\%c:", (WCHAR)(*lpNtLinkTarget)); + RtlInitUnicodeString(&CheckDrive, wCheckDrive); + + RtlZeroMemory(&LinkDrive, sizeof(UNICODE_STRING)); + if(!(LinkDrive.Buffer = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, + (MAX_PATH + 1) * sizeof(WCHAR)))) + { + RtlFreeHeap(RtlGetProcessHeap(), 0, lpNtLinkTarget); + RtlFreeUnicodeString(&LinkTarget); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + + InitializeObjectAttributes(&ObjectAttribues, + &CheckDrive, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + Status = ZwOpenSymbolicLinkObject(&hFile, 1, &ObjectAttribues); + if(!NT_SUCCESS(Status)) + { + RtlFreeHeap(RtlGetProcessHeap(), 0, LinkDrive.Buffer); + RtlFreeHeap(RtlGetProcessHeap(), 0, lpNtLinkTarget); + RtlFreeUnicodeString(&LinkTarget); + SetLastErrorByStatus(Status); + return FALSE; + } + + RtlInitUnicodeString(&LanManager, L"\\Device\\LanmanRedirector\\"); + + ZwQuerySymbolicLinkObject(hFile, &LinkDrive, NULL); + + if(RtlPrefixUnicodeString(&LanManager, &LinkDrive, TRUE)) + { + ZwClose(hFile); + RtlFreeHeap(RtlGetProcessHeap(), 0, LinkDrive.Buffer); + RtlFreeHeap(RtlGetProcessHeap(), 0, lpNtLinkTarget); + RtlFreeUnicodeString(&LinkTarget); + DPRINT1("Path \"%wZ\" must not be a mapped drive!\n", &LinkDrive); + SetLastError(ERROR_INVALID_NAME); + return FALSE; + } + + InitializeObjectAttributes(&ObjectAttribues, + &LinkTarget, + OBJ_CASE_INSENSITIVE, + NULL, + lpSecurityDescriptor); + + Status = ZwOpenFile(&hTarget, SYNCHRONIZE | DELETE, &ObjectAttribues, &IoStatus, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + FILE_SYNCHRONOUS_IO_NONALERT | FILE_OPEN_FOR_BACKUP_INTENT | FILE_OPEN_REPARSE_POINT); + if(!NT_SUCCESS(Status)) + { + ZwClose(hFile); + RtlFreeHeap(RtlGetProcessHeap(), 0, LinkDrive.Buffer); + RtlFreeHeap(RtlGetProcessHeap(), 0, lpNtLinkTarget); + RtlFreeUnicodeString(&LinkTarget); + DPRINT1("Unable to open link destination \"%wZ\"!\n", &LinkTarget); + SetLastError(ERROR_INVALID_NAME); + return FALSE; + } + + if(!RtlDosPathNameToNtPathName_U((LPWSTR)lpFileName, &LinkName, NULL, NULL)) + { + ZwClose(hTarget); + ZwClose(hFile); + RtlFreeHeap(RtlGetProcessHeap(), 0, LinkDrive.Buffer); + RtlFreeHeap(RtlGetProcessHeap(), 0, lpNtLinkTarget); + RtlFreeUnicodeString(&LinkTarget); + SetLastError(ERROR_INVALID_NAME); + return FALSE; + } + + NeededSize = sizeof(FILE_LINK_INFORMATION) + LinkName.Length + sizeof(WCHAR); + if(!(LinkInformation = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, NeededSize))) + { + ZwClose(hTarget); + ZwClose(hFile); + RtlFreeHeap(RtlGetProcessHeap(), 0, LinkDrive.Buffer); + RtlFreeHeap(RtlGetProcessHeap(), 0, lpNtLinkTarget); + RtlFreeUnicodeString(&LinkTarget); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + + LinkInformation->ReplaceIfExists = FALSE; + LinkInformation->RootDirectory = 0; + LinkInformation->FileNameLength = LinkName.Length; + RtlCopyMemory(LinkInformation->FileName, LinkName.Buffer, LinkName.Length); + + Status = ZwSetInformationFile(hTarget, &IoStatus, LinkInformation, NeededSize, FileLinkInformation); + if(!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + } + + ZwClose(hTarget); + ZwClose(hFile); + RtlFreeHeap(RtlGetProcessHeap(), 0, LinkInformation); + RtlFreeHeap(RtlGetProcessHeap(), 0, LinkDrive.Buffer); + RtlFreeHeap(RtlGetProcessHeap(), 0, lpNtLinkTarget); + RtlFreeUnicodeString(&LinkTarget); + return NT_SUCCESS(Status); +} + + +/* + * @implemented + */ +BOOL STDCALL +CreateHardLinkA( + LPCSTR lpFileName, + LPCSTR lpExistingFileName, + LPSECURITY_ATTRIBUTES lpSecurityAttributes +) +{ + ANSI_STRING FileNameA, ExistingFileNameA; + UNICODE_STRING FileName, ExistingFileName; + NTSTATUS Status; + BOOL Ret; + + if(!lpFileName || !lpExistingFileName) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + RtlInitAnsiString(&FileNameA, (LPSTR)lpFileName); + RtlInitAnsiString(&ExistingFileNameA, (LPSTR)lpExistingFileName); + + if(bIsFileApiAnsi) + Status = RtlAnsiStringToUnicodeString(&FileName, &FileNameA, TRUE); + else + Status = RtlOemStringToUnicodeString(&FileName, &FileNameA, TRUE); + if(!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return FALSE; + } + + if(bIsFileApiAnsi) + Status = RtlAnsiStringToUnicodeString(&ExistingFileName, &ExistingFileNameA, TRUE); + else + Status = RtlOemStringToUnicodeString(&ExistingFileName, &ExistingFileNameA, TRUE); + if(!NT_SUCCESS(Status)) + { + RtlFreeUnicodeString(&FileName); + SetLastErrorByStatus(Status); + return FALSE; + } + + Ret = CreateHardLinkW(FileName.Buffer, ExistingFileName.Buffer, lpSecurityAttributes); + + RtlFreeUnicodeString(&FileName); + RtlFreeUnicodeString(&ExistingFileName); + + return Ret; +} + +/* EOF */ diff --git a/reactos/lib/kernel32/k32.h b/reactos/lib/kernel32/k32.h index 9859cc5eabb..816c8c70f85 100755 --- a/reactos/lib/kernel32/k32.h +++ b/reactos/lib/kernel32/k32.h @@ -18,6 +18,7 @@ #include <napi/i386/segment.h> #include <napi/teb.h> #include <napi/npipe.h> +#include <napi/types.h> #include <ntos/minmax.h> #include <csrss/csrss.h> #include <reactos/buildno.h> diff --git a/reactos/lib/kernel32/makefile b/reactos/lib/kernel32/makefile index ebd99de263c..30af6359d4d 100644 --- a/reactos/lib/kernel32/makefile +++ b/reactos/lib/kernel32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.77 2004/02/22 17:30:32 chorns Exp $ +# $Id: makefile,v 1.78 2004/03/14 09:21:41 weiden Exp $ PATH_TO_TOP = ../.. @@ -41,7 +41,7 @@ FILE_OBJECTS = file/file.o file/curdir.o file/lfile.o file/dir.o \ file/create.o file/find.o file/copy.o file/pipe.o \ file/move.o file/lock.o file/rw.o file/delete.o \ file/npipe.o file/tape.o file/mailslot.o file/backup.o \ - file/cnotify.o + file/cnotify.o file/hardlink.o MEM_OBJECTS = mem/global.o mem/heap.o mem/isbad.o mem/local.o \ mem/procmem.o mem/section.o mem/virtual.o diff --git a/reactos/lib/kernel32/misc/stubs.c b/reactos/lib/kernel32/misc/stubs.c index 8d2eb88474f..50b7fb7ef26 100644 --- a/reactos/lib/kernel32/misc/stubs.c +++ b/reactos/lib/kernel32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.62 2004/02/15 07:03:56 arty Exp $ +/* $Id: stubs.c,v 1.63 2004/03/14 09:21:41 weiden Exp $ * * KERNEL32.DLL stubs (unimplemented functions) * Remove from this file, if you implement them. @@ -1653,21 +1653,6 @@ CheckNameLegalDOS8Dot3W( return 0; } -/* - * @unimplemented - */ -BOOL -STDCALL -CreateHardLinkW( - LPCWSTR lpFileName, - LPCWSTR lpExistingFileName, - LPSECURITY_ATTRIBUTES lpSecurityAttributes - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented */ @@ -2042,21 +2027,6 @@ CheckNameLegalDOS8Dot3A( return 0; } -/* - * @unimplemented - */ -BOOL -STDCALL -CreateHardLinkA( - LPCSTR lpFileName, - LPCSTR lpExistingFileName, - LPSECURITY_ATTRIBUTES lpSecurityAttributes - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented */ From b0b55220e686ad912dbed352674e6a370cfe92d0 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 14 Mar 2004 09:43:12 +0000 Subject: [PATCH 0484/1463] - Make IoGetDeviceInterfaces more compatible with the native version. Patch by Matthew Brace. svn path=/trunk/; revision=8701 --- reactos/ntoskrnl/io/deviface.c | 406 ++++++++++++++++++++------------- 1 file changed, 247 insertions(+), 159 deletions(-) diff --git a/reactos/ntoskrnl/io/deviface.c b/reactos/ntoskrnl/io/deviface.c index 2411c40cff2..7cb0d5192b0 100644 --- a/reactos/ntoskrnl/io/deviface.c +++ b/reactos/ntoskrnl/io/deviface.c @@ -18,6 +18,7 @@ DEFINE_GUID(GUID_SERENUM_BUS_ENUMERATOR, 0x4D36E978L, 0xE325, 0x11CE, 0xBF, 0xC1 #endif #define NDEBUG #include <internal/debug.h> +#define ASSERT assert /* FUNCTIONS *****************************************************************/ @@ -99,13 +100,16 @@ IoGetDeviceInterfaces( UNICODE_STRING BaseKeyName; UNICODE_STRING AliasKeyName; UNICODE_STRING SymbolicLink; + UNICODE_STRING Control; UNICODE_STRING SubKeyName; UNICODE_STRING SymbolicLinkKeyName; + UNICODE_STRING ControlKeyName; UNICODE_STRING TempString; HANDLE InterfaceKey; HANDLE SubKey; HANDLE SymbolicLinkKey; PKEY_FULL_INFORMATION fip; + PKEY_FULL_INFORMATION bfip; PKEY_BASIC_INFORMATION bip; PKEY_VALUE_PARTIAL_INFORMATION vpip; PWCHAR SymLinkList = NULL; @@ -113,6 +117,7 @@ IoGetDeviceInterfaces( NTSTATUS Status; ULONG Size = 0; ULONG i = 0; + ULONG j = 0; OBJECT_ATTRIBUTES ObjectAttributes; Status = RtlStringFromGUID(InterfaceClassGuid, &GuidString); @@ -124,33 +129,34 @@ IoGetDeviceInterfaces( RtlInitUnicodeString(&AliasKeyName, BaseInterfaceString); RtlInitUnicodeString(&SymbolicLink, L"SymbolicLink"); + RtlInitUnicodeString(&Control, L"\\Control"); BaseKeyName.Length = wcslen(BaseKeyString) * sizeof(WCHAR); BaseKeyName.MaximumLength = BaseKeyName.Length + (38 * sizeof(WCHAR)); BaseKeyName.Buffer = ExAllocatePool( NonPagedPool, BaseKeyName.MaximumLength); - assert(BaseKeyName.Buffer != NULL); + ASSERT(BaseKeyName.Buffer != NULL); wcscpy(BaseKeyName.Buffer, BaseKeyString); RtlAppendUnicodeStringToString(&BaseKeyName, &GuidString); if (PhysicalDeviceObject) { - WCHAR GuidBuffer[32]; + WCHAR GuidBuffer[40]; UNICODE_STRING PdoGuidString; RtlFreeUnicodeString(&BaseKeyName); IoGetDeviceProperty( PhysicalDeviceObject, - DevicePropertyClassGuid, - sizeof(GuidBuffer), - GuidBuffer, - &Size); + DevicePropertyClassGuid, + sizeof(GuidBuffer), + GuidBuffer, + &Size); - RtlInitUnicodeString(&PdoGuidString, GuidBuffer); + RtlInitUnicodeString(&PdoGuidString, GuidBuffer); if (RtlCompareUnicodeString(&GuidString, &PdoGuidString, TRUE)) { - DPRINT("Inconsistent Guid's asked for in IoGetDeviceInterfaces()\n"); + DPRINT("Inconsistent Guid's asked for in IoGetDeviceInterfaces()\n"); return STATUS_INVALID_HANDLE; } @@ -180,7 +186,7 @@ IoGetDeviceInterfaces( Status = ZwQueryKey( InterfaceKey, - KeyFullInformation, + KeyFullInformation, NULL, 0, &Size); @@ -194,14 +200,14 @@ IoGetDeviceInterfaces( } fip = (PKEY_FULL_INFORMATION)ExAllocatePool(NonPagedPool, Size); - assert(fip != NULL); + ASSERT(fip != NULL); Status = ZwQueryKey( InterfaceKey, - KeyFullInformation, - fip, - Size, - &Size); + KeyFullInformation, + fip, + Size, + &Size); if (!NT_SUCCESS(Status)) { @@ -216,15 +222,15 @@ IoGetDeviceInterfaces( { Status = ZwEnumerateKey( InterfaceKey, - i, - KeyBasicInformation, - NULL, - 0, - &Size); + i, + KeyBasicInformation, + NULL, + 0, + &Size); if (Status != STATUS_BUFFER_TOO_SMALL) { - DPRINT("ZwEnumerateKey() Failed. (0x%X)\n", Status); + DPRINT("ZwEnumerateKey() Failed.(0x%X)\n", Status); ExFreePool(fip); if (SymLinkList != NULL) ExFreePool(SymLinkList); @@ -234,7 +240,7 @@ IoGetDeviceInterfaces( } bip = (PKEY_BASIC_INFORMATION)ExAllocatePool(NonPagedPool, Size); - assert(bip != NULL); + ASSERT(bip != NULL); Status = ZwEnumerateKey( InterfaceKey, @@ -246,7 +252,7 @@ IoGetDeviceInterfaces( if (!NT_SUCCESS(Status)) { - DPRINT("ZwEnumerateKey() Failed. (0x%X)\n", Status); + DPRINT("ZwEnumerateKey() Failed.(0x%X)\n", Status); ExFreePool(fip); ExFreePool(bip); if (SymLinkList != NULL) @@ -255,11 +261,11 @@ IoGetDeviceInterfaces( ZwClose(InterfaceKey); return Status; } - + SubKeyName.Length = 0; SubKeyName.MaximumLength = BaseKeyName.Length + bip->NameLength + sizeof(WCHAR); SubKeyName.Buffer = ExAllocatePool(NonPagedPool, SubKeyName.MaximumLength); - assert(SubKeyName.Buffer != NULL); + ASSERT(SubKeyName.Buffer != NULL); TempString.Length = TempString.MaximumLength = bip->NameLength; TempString.Buffer = bip->Name; RtlCopyUnicodeString(&SubKeyName, &BaseKeyName); @@ -292,181 +298,263 @@ IoGetDeviceInterfaces( return Status; } - Status = ZwEnumerateKey( + Status = ZwQueryKey( SubKey, - 0, - KeyBasicInformation, + KeyFullInformation, NULL, 0, &Size); if (Status != STATUS_BUFFER_TOO_SMALL) { - DPRINT("ZwEnumerateKey() Failed. (0x%X)\n", Status); + DPRINT("ZwQueryKey() Failed. (0x%X)\n", Status); ExFreePool(fip); - if (SymLinkList != NULL) - ExFreePool(SymLinkList); - RtlFreeUnicodeString(&SubKeyName); RtlFreeUnicodeString(&BaseKeyName); + RtlFreeUnicodeString(&SubKeyName); ZwClose(SubKey); ZwClose(InterfaceKey); return Status; } - bip = (PKEY_BASIC_INFORMATION)ExAllocatePool(NonPagedPool, Size); - assert(bip != NULL); + bfip = (PKEY_FULL_INFORMATION)ExAllocatePool(NonPagedPool, Size); + ASSERT(bfip != NULL); - Status = ZwEnumerateKey( + Status = ZwQueryKey( SubKey, - 0, - KeyBasicInformation, - bip, + KeyFullInformation, + bfip, Size, &Size); - + if (!NT_SUCCESS(Status)) { - DPRINT("ZwEnumerateKey() Failed. (0x%X)\n", Status); + DPRINT("ZwQueryKey() Failed. (0x%X)\n", Status); ExFreePool(fip); + RtlFreeUnicodeString(&SubKeyName); + RtlFreeUnicodeString(&BaseKeyName); + ZwClose(SubKey); + ZwClose(InterfaceKey); + return Status; + } + + for(j = 0; j < bfip->SubKeys; j++) + { + Status = ZwEnumerateKey( + SubKey, + j, + KeyBasicInformation, + NULL, + 0, + &Size); + + if (Status == STATUS_NO_MORE_ENTRIES) + continue; + + if (Status != STATUS_BUFFER_TOO_SMALL) + { + DPRINT("ZwEnumerateKey() Failed.(0x%X)\n", Status); + ExFreePool(bfip); + ExFreePool(fip); + if (SymLinkList != NULL) + ExFreePool(SymLinkList); + RtlFreeUnicodeString(&SubKeyName); + RtlFreeUnicodeString(&BaseKeyName); + ZwClose(SubKey); + ZwClose(InterfaceKey); + return Status; + } + + bip = (PKEY_BASIC_INFORMATION)ExAllocatePool(NonPagedPool, Size); + ASSERT(bip != NULL); + + Status = ZwEnumerateKey( + SubKey, + j, + KeyBasicInformation, + bip, + Size, + &Size); + + if (!NT_SUCCESS(Status)) + { + DPRINT("ZwEnumerateKey() Failed.(0x%X)\n", Status); + ExFreePool(fip); + ExFreePool(bfip); + ExFreePool(bip); + if (SymLinkList != NULL) + ExFreePool(SymLinkList); + RtlFreeUnicodeString(&SubKeyName); + RtlFreeUnicodeString(&BaseKeyName); + ZwClose(SubKey); + ZwClose(InterfaceKey); + return Status; + } + + if (!wcsncmp(bip->Name, L"Control", bip->NameLength)) + { + continue; + } + + SymbolicLinkKeyName.Length = 0; + SymbolicLinkKeyName.MaximumLength = SubKeyName.Length + bip->NameLength + sizeof(WCHAR); + SymbolicLinkKeyName.Buffer = ExAllocatePool(NonPagedPool, SymbolicLinkKeyName.MaximumLength); + ASSERT(SymbolicLinkKeyName.Buffer != NULL); + TempString.Length = TempString.MaximumLength = bip->NameLength; + TempString.Buffer = bip->Name; + RtlCopyUnicodeString(&SymbolicLinkKeyName, &SubKeyName); + RtlAppendUnicodeToString(&SymbolicLinkKeyName, L"\\"); + RtlAppendUnicodeStringToString(&SymbolicLinkKeyName, &TempString); + + ControlKeyName.Length = 0; + ControlKeyName.MaximumLength = SymbolicLinkKeyName.Length + Control.Length + sizeof(WCHAR); + ControlKeyName.Buffer = ExAllocatePool(NonPagedPool, ControlKeyName.MaximumLength); + ASSERT(ControlKeyName.Buffer != NULL); + RtlCopyUnicodeString(&ControlKeyName, &SymbolicLinkKeyName); + RtlAppendUnicodeStringToString(&ControlKeyName, &Control); + ExFreePool(bip); - if (SymLinkList != NULL) - ExFreePool(SymLinkList); - RtlFreeUnicodeString(&SubKeyName); - RtlFreeUnicodeString(&BaseKeyName); - ZwClose(SubKey); - ZwClose(InterfaceKey); - return Status; - } - SymbolicLinkKeyName.Length = 0; - SymbolicLinkKeyName.MaximumLength = SubKeyName.Length + bip->NameLength + sizeof(WCHAR); - SymbolicLinkKeyName.Buffer = ExAllocatePool(NonPagedPool, SymbolicLinkKeyName.MaximumLength); - assert(SymbolicLinkKeyName.Buffer != NULL); - TempString.Length = TempString.MaximumLength = bip->NameLength; - TempString.Buffer = bip->Name; - RtlCopyUnicodeString(&SymbolicLinkKeyName, &SubKeyName); - RtlAppendUnicodeToString(&SymbolicLinkKeyName, L"\\"); - RtlAppendUnicodeStringToString(&SymbolicLinkKeyName, &TempString); + InitializeObjectAttributes( + &ObjectAttributes, + &SymbolicLinkKeyName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + Status = ZwOpenKey( + &SymbolicLinkKey, + KEY_READ, + &ObjectAttributes); + + if (!NT_SUCCESS(Status)) + { + DPRINT("ZwOpenKey() Failed. (0x%X)\n", Status); + ExFreePool(fip); + ExFreePool(bfip); + if (SymLinkList != NULL) + ExFreePool(SymLinkList); + RtlFreeUnicodeString(&SymbolicLinkKeyName); + RtlFreeUnicodeString(&SubKeyName); + RtlFreeUnicodeString(&BaseKeyName); + ZwClose(SubKey); + ZwClose(InterfaceKey); + return Status; + } + + Status = ZwQueryValueKey( + SymbolicLinkKey, + &SymbolicLink, + KeyValuePartialInformation, + NULL, + 0, + &Size); + + if (Status == STATUS_OBJECT_NAME_NOT_FOUND) + continue; - ExFreePool(bip); + if (Status != STATUS_BUFFER_TOO_SMALL) + { + DPRINT("ZwQueryValueKey() Failed.(0x%X)\n", Status); + ExFreePool(fip); + ExFreePool(bfip); + if (SymLinkList != NULL) + ExFreePool(SymLinkList); + RtlFreeUnicodeString(&SymbolicLinkKeyName); + RtlFreeUnicodeString(&SubKeyName); + RtlFreeUnicodeString(&BaseKeyName); + ZwClose(SymbolicLinkKey); + ZwClose(SubKey); + ZwClose(InterfaceKey); + return Status; + } - InitializeObjectAttributes( - &ObjectAttributes, - &SymbolicLinkKeyName, - OBJ_CASE_INSENSITIVE, - NULL, - NULL); + vpip = (PKEY_VALUE_PARTIAL_INFORMATION)ExAllocatePool(NonPagedPool, Size); + ASSERT(vpip != NULL); - Status = ZwOpenKey( - &SymbolicLinkKey, - KEY_READ, - &ObjectAttributes); + Status = ZwQueryValueKey( + SymbolicLinkKey, + &SymbolicLink, + KeyValuePartialInformation, + vpip, + Size, + &Size); + + if (!NT_SUCCESS(Status)) + { + DPRINT("ZwQueryValueKey() Failed.(0x%X)\n", Status); + ExFreePool(fip); + ExFreePool(bfip); + ExFreePool(vpip); + if (SymLinkList != NULL) + ExFreePool(SymLinkList); + RtlFreeUnicodeString(&SymbolicLinkKeyName); + RtlFreeUnicodeString(&SubKeyName); + RtlFreeUnicodeString(&BaseKeyName); + ZwClose(SymbolicLinkKey); + ZwClose(SubKey); + ZwClose(InterfaceKey); + return Status; + } + + Status = RtlCheckRegistryKey(RTL_REGISTRY_ABSOLUTE, ControlKeyName.Buffer); + + if (NT_SUCCESS(Status)) + { + /* Put the name in the string here */ + if (SymLinkList == NULL) + { + SymLinkListSize = vpip->DataLength; + SymLinkList = ExAllocatePool(NonPagedPool, SymLinkListSize + sizeof(WCHAR)); + ASSERT(SymLinkList != NULL); + RtlCopyMemory(SymLinkList, vpip->Data, vpip->DataLength); + SymLinkList[vpip->DataLength / sizeof(WCHAR)] = 0; + SymLinkList[1] = '?'; + } + else + { + PWCHAR OldSymLinkList; + ULONG OldSymLinkListSize; + PWCHAR SymLinkListPtr; + + OldSymLinkList = SymLinkList; + OldSymLinkListSize = SymLinkListSize; + SymLinkListSize += vpip->DataLength; + SymLinkList = ExAllocatePool(NonPagedPool, SymLinkListSize + sizeof(WCHAR)); + ASSERT(SymLinkList != NULL); + RtlCopyMemory(SymLinkList, OldSymLinkList, OldSymLinkListSize); + ExFreePool(OldSymLinkList); + SymLinkListPtr = SymLinkList + (OldSymLinkListSize / sizeof(WCHAR)); + RtlCopyMemory(SymLinkListPtr, vpip->Data, vpip->DataLength); + SymLinkListPtr[vpip->DataLength / sizeof(WCHAR)] = 0; + SymLinkListPtr[1] = '?'; + } + } - if (!NT_SUCCESS(Status)) - { - DPRINT("ZwOpenKey() Failed. (0x%X)\n", Status); - ExFreePool(fip); - if (SymLinkList != NULL) - ExFreePool(SymLinkList); RtlFreeUnicodeString(&SymbolicLinkKeyName); - RtlFreeUnicodeString(&SubKeyName); - RtlFreeUnicodeString(&BaseKeyName); - ZwClose(SubKey); - ZwClose(InterfaceKey); - return Status; - } - - Status = ZwQueryValueKey( - SymbolicLinkKey, - &SymbolicLink, - KeyValuePartialInformation, - NULL, - 0, - &Size); - - if (Status != STATUS_BUFFER_TOO_SMALL) - { - DPRINT("ZwQueryValueKey() Failed. (0x%X)\n", Status); - ExFreePool(fip); - if (SymLinkList != NULL) - ExFreePool(SymLinkList); - RtlFreeUnicodeString(&SymbolicLinkKeyName); - RtlFreeUnicodeString(&SubKeyName); - RtlFreeUnicodeString(&BaseKeyName); + RtlFreeUnicodeString(&ControlKeyName); ZwClose(SymbolicLinkKey); - ZwClose(SubKey); - ZwClose(InterfaceKey); - return Status; } - vpip = (PKEY_VALUE_PARTIAL_INFORMATION)ExAllocatePool(NonPagedPool, Size); - assert(vpip != NULL); - - Status = ZwQueryValueKey( - SymbolicLinkKey, - &SymbolicLink, - KeyValuePartialInformation, - vpip, - Size, - &Size); - - if (!NT_SUCCESS(Status)) - { - ExFreePool(fip); - ExFreePool(vpip); - if (SymLinkList != NULL) - ExFreePool(SymLinkList); - RtlFreeUnicodeString(&SymbolicLinkKeyName); - RtlFreeUnicodeString(&SubKeyName); - RtlFreeUnicodeString(&BaseKeyName); - ZwClose(SymbolicLinkKey); - ZwClose(SubKey); - ZwClose(InterfaceKey); - return Status; - } - - /* Put the name in the string here */ - if (SymLinkList == NULL) - { - SymLinkListSize = vpip->DataLength; - SymLinkList = ExAllocatePool(NonPagedPool, SymLinkListSize + sizeof(WCHAR)); - assert(SymLinkList != NULL); - RtlCopyMemory(SymLinkList, vpip->Data, vpip->DataLength); - SymLinkList[vpip->DataLength / sizeof(WCHAR)] = 0; - SymLinkList[1] = '?'; - } - else - { - PWCHAR OldSymLinkList; - ULONG OldSymLinkListSize; - PWCHAR SymLinkListPtr; - - OldSymLinkList = SymLinkList; - OldSymLinkListSize = SymLinkListSize; - SymLinkListSize += vpip->DataLength; - SymLinkList = ExAllocatePool(NonPagedPool, SymLinkListSize + sizeof(WCHAR)); - assert(SymLinkList != NULL); - RtlCopyMemory(SymLinkList, OldSymLinkList, OldSymLinkListSize); - ExFreePool(OldSymLinkList); - SymLinkListPtr = SymLinkList + (OldSymLinkListSize / sizeof(WCHAR)); - RtlCopyMemory(SymLinkListPtr, vpip->Data, vpip->DataLength); - SymLinkListPtr[vpip->DataLength / sizeof(WCHAR)] = 0; - SymLinkListPtr[1] = '?'; - } - - RtlFreeUnicodeString(&SymbolicLinkKeyName); - RtlFreeUnicodeString(&SubKeyName); - ZwClose(SymbolicLinkKey); - ZwClose(SubKey); ExFreePool(vpip); + RtlFreeUnicodeString(&SubKeyName); + ZwClose(SubKey); } if (SymLinkList != NULL) + { SymLinkList[SymLinkListSize / sizeof(WCHAR)] = 0; + } + else + { + SymLinkList = ExAllocatePool(NonPagedPool, 2 * sizeof(WCHAR)); + SymLinkList[0] = 0; + } + *SymbolicLinkList = SymLinkList; RtlFreeUnicodeString(&BaseKeyName); ZwClose(InterfaceKey); + ExFreePool(bfip); ExFreePool(fip); } From 04b43aab9e92f611518822d4e51ff96a793c5144 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sun, 14 Mar 2004 10:16:18 +0000 Subject: [PATCH 0485/1463] minor fix svn path=/trunk/; revision=8702 --- reactos/lib/kernel32/file/hardlink.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/reactos/lib/kernel32/file/hardlink.c b/reactos/lib/kernel32/file/hardlink.c index ab28ec4d9e6..0aa11b291bc 100644 --- a/reactos/lib/kernel32/file/hardlink.c +++ b/reactos/lib/kernel32/file/hardlink.c @@ -1,4 +1,4 @@ -/* $Id: hardlink.c,v 1.1 2004/03/14 09:21:42 weiden Exp $ +/* $Id: hardlink.c,v 1.2 2004/03/14 10:16:18 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -79,7 +79,8 @@ CreateHardLinkW( return FALSE; } - if(!RtlGetFullPathName_U((LPWSTR)lpExistingFileName, NeededSize, lpNtLinkTarget, &lpFilePart)) + if(!RtlGetFullPathName_U((LPWSTR)lpExistingFileName, NeededSize, lpNtLinkTarget, &lpFilePart) || + (*lpNtLinkTarget) == L'\0') { RtlFreeHeap(RtlGetProcessHeap(), 0, lpNtLinkTarget); RtlFreeUnicodeString(&LinkTarget); From 85f9fdf39fb429affc42219ca784729d9f41218c Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sun, 14 Mar 2004 11:11:17 +0000 Subject: [PATCH 0486/1463] implemented GetProcessId() svn path=/trunk/; revision=8703 --- reactos/lib/kernel32/misc/stubs.c | 15 +-------------- reactos/lib/kernel32/process/proc.c | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/reactos/lib/kernel32/misc/stubs.c b/reactos/lib/kernel32/misc/stubs.c index 50b7fb7ef26..2edf5363584 100644 --- a/reactos/lib/kernel32/misc/stubs.c +++ b/reactos/lib/kernel32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.63 2004/03/14 09:21:41 weiden Exp $ +/* $Id: stubs.c,v 1.64 2004/03/14 11:11:17 weiden Exp $ * * KERNEL32.DLL stubs (unimplemented functions) * Remove from this file, if you implement them. @@ -956,19 +956,6 @@ GetProcessHandleCount( return 0; } -/* - * @unimplemented - */ -DWORD -STDCALL -GetProcessId( - HANDLE Process - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented */ diff --git a/reactos/lib/kernel32/process/proc.c b/reactos/lib/kernel32/process/proc.c index f80e9379086..a8091a8374a 100644 --- a/reactos/lib/kernel32/process/proc.c +++ b/reactos/lib/kernel32/process/proc.c @@ -1,4 +1,4 @@ -/* $Id: proc.c,v 1.59 2004/01/23 21:16:04 ekohl Exp $ +/* $Id: proc.c,v 1.60 2004/03/14 11:11:17 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -314,6 +314,23 @@ InternalGetProcessId(HANDLE hProcess, } +/* + * @implemented + */ +DWORD +STDCALL +GetProcessId(HANDLE Process) +{ + DWORD ProcessId; + + if(!InternalGetProcessId(Process, &ProcessId)) + { + return 0; + } + return ProcessId; +} + + /* * @implemented */ From 57b26979cbaade61bc7bf7671968ee3671ec54d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Sun, 14 Mar 2004 11:25:33 +0000 Subject: [PATCH 0487/1463] You can't use NtCurrentTeb() in kernel mode svn path=/trunk/; revision=8704 --- reactos/subsys/win32k/misc/error.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/misc/error.c b/reactos/subsys/win32k/misc/error.c index 5418940a370..315a1f34c63 100644 --- a/reactos/subsys/win32k/misc/error.c +++ b/reactos/subsys/win32k/misc/error.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: error.c,v 1.6 2003/08/12 20:08:45 royce Exp $ +/* $Id: error.c,v 1.7 2004/03/14 11:25:33 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -27,6 +27,7 @@ * 06-06-2001 CSH Created */ #include <ddk/ntddk.h> +#include <internal/ps.h> #include <include/error.h> @@ -39,7 +40,7 @@ SetLastNtError(NTSTATUS Status) VOID FASTCALL SetLastWin32Error(DWORD Status) { - PTEB Teb = NtCurrentTeb(); + PTEB Teb = PsGetCurrentThread()->Tcb.Teb; if (NULL != Teb) { @@ -51,7 +52,7 @@ NTSTATUS FASTCALL GetLastNtError() { // FIXME - not 100% sure this is correct - PTEB Teb = NtCurrentTeb(); + PTEB Teb = PsGetCurrentThread()->Tcb.Teb; if ( NULL != Teb ) { From d13e1cf2202a9109102ec5643a3d87b87c21e98c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Sun, 14 Mar 2004 11:27:33 +0000 Subject: [PATCH 0488/1463] Match error tested against to the actual error returned by NtUserGetWindowLong svn path=/trunk/; revision=8705 --- reactos/lib/user32/windows/window.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/user32/windows/window.c b/reactos/lib/user32/windows/window.c index 04d63eb9595..604ce18487a 100644 --- a/reactos/lib/user32/windows/window.c +++ b/reactos/lib/user32/windows/window.c @@ -1,4 +1,4 @@ -/* $Id: window.c,v 1.101 2004/03/07 20:38:17 navaraf Exp $ +/* $Id: window.c,v 1.102 2004/03/14 11:27:33 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -1046,7 +1046,7 @@ BOOL STDCALL IsWindow(HWND hWnd) { DWORD WndProc = NtUserGetWindowLong(hWnd, GWL_WNDPROC, FALSE); - return (0 != WndProc || ERROR_INVALID_HANDLE != GetLastError()); + return (0 != WndProc || ERROR_INVALID_WINDOW_HANDLE != GetLastError()); } From 5ca99eb505877e27f5f339a5578bc38422f834d3 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 14 Mar 2004 12:06:25 +0000 Subject: [PATCH 0489/1463] disable context menu for non-file system objects svn path=/trunk/; revision=8706 --- reactos/subsys/system/explorer/doc/TODO.txt | 12 ++++------ .../subsys/system/explorer/shell/entries.cpp | 13 ---------- .../subsys/system/explorer/shell/entries.h | 2 +- .../subsys/system/explorer/shell/fatfs.cpp | 15 ++++++++++++ reactos/subsys/system/explorer/shell/fatfs.h | 1 + .../system/explorer/shell/filechild.cpp | 24 ++++++++++--------- .../subsys/system/explorer/shell/winfs.cpp | 12 ++++++++++ reactos/subsys/system/explorer/shell/winfs.h | 1 + 8 files changed, 47 insertions(+), 33 deletions(-) diff --git a/reactos/subsys/system/explorer/doc/TODO.txt b/reactos/subsys/system/explorer/doc/TODO.txt index 286a87e1570..7b44bcdb71e 100644 --- a/reactos/subsys/system/explorer/doc/TODO.txt +++ b/reactos/subsys/system/explorer/doc/TODO.txt @@ -30,16 +30,12 @@ - Startmenu: You can't close the start menu with pressing Win-key You can open the start menu with pressing Win-key, but can't close with another hit of Win-key. -- Despite of settings, the clock's always shown I set my Win-Exp to hide the clock shown in - the taskbar, but the ROS-Exp ignores the setting and always shows the clock. +- > Despite of settings, the clock's always shown I set my Win-Explorer to hide the clock + > shown in the taskbar, but the ROS-Exp ignores the setting and always shows the clock. Yes, ROS explorer doesn't read many settings from the registry currently, as it doesn't have a way to configure them. (missing configuration dialogs) -- Wenn man in der Toolbar auf "NT Obj." klickt und dann mit der rechten - Maustaste in die TreeView klickt, gibt es eine COM Exeption "Falscher Parameter". - Wenn man das 鰂ter macht crasht das Programm. - -- Es scheint ein paar GDI-Leaks in deinem Programm zu geben +- Es scheint ein paar GDI-Leaks in deinem Programm zu geben. Wenn man ein neues MDI Fenster 鰂fnet und dann wieder schlie遲, werden - einige GDI-Objekte nicht wieder gel鰏cht + einige GDI-Objekte nicht wieder gel鰏cht. diff --git a/reactos/subsys/system/explorer/shell/entries.cpp b/reactos/subsys/system/explorer/shell/entries.cpp index 94f927c5887..add7c202914 100644 --- a/reactos/subsys/system/explorer/shell/entries.cpp +++ b/reactos/subsys/system/explorer/shell/entries.cpp @@ -315,19 +315,6 @@ void Entry::smart_scan(int scan_flags) } -ShellPath Entry::create_absolute_pidl() const -{ - CONTEXT("Entry::create_absolute_pidl()"); - - TCHAR path[MAX_PATH]; - - if (get_path(path)) - return ShellPath(path); - - return ShellPath(); -} - - void Entry::extract_icon() { TCHAR path[MAX_PATH]; diff --git a/reactos/subsys/system/explorer/shell/entries.h b/reactos/subsys/system/explorer/shell/entries.h index 92b0457f370..b55330a3d47 100644 --- a/reactos/subsys/system/explorer/shell/entries.h +++ b/reactos/subsys/system/explorer/shell/entries.h @@ -109,7 +109,7 @@ public: virtual const void* get_next_path_component(const void*) {return NULL;} virtual Entry* find_entry(const void*) {return NULL;} virtual bool get_path(PTSTR path) const = 0; - virtual ShellPath create_absolute_pidl() const; + virtual ShellPath create_absolute_pidl() const {return (LPCITEMIDLIST)NULL;} virtual HRESULT GetUIObjectOf(HWND hWnd, REFIID riid, LPVOID* ppvOut); virtual BOOL launch_entry(HWND hwnd, UINT nCmdShow=SW_SHOWNORMAL); }; diff --git a/reactos/subsys/system/explorer/shell/fatfs.cpp b/reactos/subsys/system/explorer/shell/fatfs.cpp index 75d9128b10b..a2c0b120bc6 100644 --- a/reactos/subsys/system/explorer/shell/fatfs.cpp +++ b/reactos/subsys/system/explorer/shell/fatfs.cpp @@ -293,6 +293,21 @@ bool FATEntry::get_path(PTSTR path) const return true; } +ShellPath FATEntry::create_absolute_pidl() const +{ + CONTEXT("WinEntry::create_absolute_pidl()"); + + return (LPCITEMIDLIST)NULL; +/* prepend root path if the drive is currently actually mounted in the file system -> return working PIDL + TCHAR path[MAX_PATH]; + + if (get_path(path)) + return ShellPath(path); + + return ShellPath(); +*/ +} + FATDirectory::FATDirectory(FATDrive& drive, LPCTSTR root_path) : FATEntry(), diff --git a/reactos/subsys/system/explorer/shell/fatfs.h b/reactos/subsys/system/explorer/shell/fatfs.h index cdc7125fced..ba6cfacbd98 100644 --- a/reactos/subsys/system/explorer/shell/fatfs.h +++ b/reactos/subsys/system/explorer/shell/fatfs.h @@ -35,6 +35,7 @@ protected: FATEntry() : Entry(ET_FAT) {} virtual bool get_path(PTSTR path) const; + virtual ShellPath create_absolute_pidl() const; DWORD _cluster; }; diff --git a/reactos/subsys/system/explorer/shell/filechild.cpp b/reactos/subsys/system/explorer/shell/filechild.cpp index eb0b572d9a2..c45dd0fdecc 100644 --- a/reactos/subsys/system/explorer/shell/filechild.cpp +++ b/reactos/subsys/system/explorer/shell/filechild.cpp @@ -501,22 +501,24 @@ LRESULT FileChildWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) ShellPath shell_path = entry->create_absolute_pidl(); LPCITEMIDLIST pidl_abs = shell_path; - IShellFolder* parentFolder; - LPCITEMIDLIST pidlLast; + if (pidl_abs) { + IShellFolder* parentFolder; + LPCITEMIDLIST pidlLast; - static DynamicFct<HRESULT(WINAPI*)(LPCITEMIDLIST, REFIID, LPVOID*, LPCITEMIDLIST*)> SHBindToParent(TEXT("SHELL32"), "SHBindToParent"); + static DynamicFct<HRESULT(WINAPI*)(LPCITEMIDLIST, REFIID, LPVOID*, LPCITEMIDLIST*)> SHBindToParent(TEXT("SHELL32"), "SHBindToParent"); - if (SHBindToParent) { - // get and use the parent folder to display correct context menu in all cases -> correct "Properties" dialog for directories, ... - if (SUCCEEDED((*SHBindToParent)(pidl_abs, IID_IShellFolder, (LPVOID*)&parentFolder, &pidlLast))) { - HRESULT hr = ShellFolderContextMenu(parentFolder, _hwnd, 1, &pidlLast, pos.x, pos.y); + if (SHBindToParent) { + // get and use the parent folder to display correct context menu in all cases -> correct "Properties" dialog for directories, ... + if (SUCCEEDED((*SHBindToParent)(pidl_abs, IID_IShellFolder, (LPVOID*)&parentFolder, &pidlLast))) { + HRESULT hr = ShellFolderContextMenu(parentFolder, _hwnd, 1, &pidlLast, pos.x, pos.y); - parentFolder->Release(); + parentFolder->Release(); - CHECKERROR(hr); + CHECKERROR(hr); + } + } else { + CHECKERROR(ShellFolderContextMenu(GetDesktopFolder(), _hwnd, 1, &pidl_abs, pos.x, pos.y)); } - } else { - CHECKERROR(ShellFolderContextMenu(GetDesktopFolder(), _hwnd, 1, &pidl_abs, pos.x, pos.y)); } } break;} diff --git a/reactos/subsys/system/explorer/shell/winfs.cpp b/reactos/subsys/system/explorer/shell/winfs.cpp index 7a13156fa64..e30ad5e1318 100644 --- a/reactos/subsys/system/explorer/shell/winfs.cpp +++ b/reactos/subsys/system/explorer/shell/winfs.cpp @@ -280,3 +280,15 @@ bool WinEntry::get_path(PTSTR path) const return true; } + +ShellPath WinEntry::create_absolute_pidl() const +{ + CONTEXT("WinEntry::create_absolute_pidl()"); + + TCHAR path[MAX_PATH]; + + if (get_path(path)) + return ShellPath(path); + + return ShellPath(); +} diff --git a/reactos/subsys/system/explorer/shell/winfs.h b/reactos/subsys/system/explorer/shell/winfs.h index 8e371e8acf0..1a3b716d1c4 100644 --- a/reactos/subsys/system/explorer/shell/winfs.h +++ b/reactos/subsys/system/explorer/shell/winfs.h @@ -35,6 +35,7 @@ protected: WinEntry() : Entry(ET_WINDOWS) {} virtual bool get_path(PTSTR path) const; + virtual ShellPath create_absolute_pidl() const; }; From 42798328cbf85c127193a0cee90ae39fdb04f6e9 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sun, 14 Mar 2004 12:16:50 +0000 Subject: [PATCH 0490/1463] count all gdi handles and serialize removing gdi handles from the table. svn path=/trunk/; revision=8708 --- reactos/subsys/win32k/objects/gdiobj.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/objects/gdiobj.c b/reactos/subsys/win32k/objects/gdiobj.c index 4e257ece3c6..374304ecf25 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.62 2004/03/09 20:34:28 dwelch Exp $ + * $Id: gdiobj.c,v 1.63 2004/03/14 12:16:50 weiden Exp $ * */ @@ -46,6 +46,8 @@ /* enable/disable GDI object caching */ #define GDI_CACHE_OBJECTS 0 +/* count all gdi objects */ +#define GDI_COUNT_OBJECTS 1 /*! Size of the GDI handle table * http://www.windevnet.com/documents/s=7290/wdj9902b/9902b.htm @@ -89,6 +91,9 @@ typedef struct _GDI_HANDLE_TABLE { WORD wTableSize; WORD AllocationHint; + #if GDI_COUNT_OBJECTS + ULONG HandlesCount; + #endif #if GDI_CACHE_OBJECTS ULONG ObjHdrSize; PGDIOBJHDR *CachedObjects; @@ -241,6 +246,9 @@ GDIOBJ_iAllocHandleTable (WORD Size) handleTable = ExAllocatePoolWithTag(PagedPool, MemSize, TAG_GDIHNDTBLE); ASSERT( handleTable ); memset (handleTable, 0, MemSize); +#if GDI_COUNT_OBJECTS + handleTable->HandlesCount = 0; +#endif #if GDI_CACHE_OBJECTS handleTable->CachedObjects = &handleTable->Handles[Size]; handleTable->ObjHdrSize = sizeof(GDIOBJHDR) + GDI_MaxGdiObjHeaderSize(); @@ -388,6 +396,9 @@ GDIOBJ_AllocObj(WORD Size, DWORD ObjectType, GDICLEANUPPROC CleanupProc) newObject->lockline = 0; ExInitializeFastMutex(&newObject->Lock); HandleTable->Handles[Index] = newObject; +#if GDI_COUNT_OBJECTS + HandleTable->HandlesCount++; +#endif ExReleaseFastMutex(&HandleTableMutex); W32Process = PsGetCurrentProcess()->Win32Process; @@ -468,7 +479,12 @@ GDIOBJ_FreeObj(HGDIOBJ hObj, DWORD ObjectType, DWORD Flag) #else ExFreePool(objectHeader); #endif + ExAcquireFastMutexUnsafe (&HandleTableMutex); HandleTable->Handles[GDI_HANDLE_GET_INDEX(hObj)] = NULL; +#if GDI_COUNT_OBJECTS + HandleTable->HandlesCount--; +#endif + ExReleaseFastMutexUnsafe (&HandleTableMutex); W32Process = PsGetCurrentProcess()->Win32Process; if(W32Process) From 3b338cc571f134ec3c942217a660d509b0e818eb Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 14 Mar 2004 12:43:27 +0000 Subject: [PATCH 0491/1463] fixed imagelist handle leak svn path=/trunk/; revision=8709 --- reactos/subsys/system/explorer/doc/TODO.txt | 4 ---- reactos/subsys/system/explorer/shell/filechild.cpp | 2 +- reactos/subsys/system/explorer/shell/pane.cpp | 5 +++++ reactos/subsys/system/explorer/shell/pane.h | 1 + 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/reactos/subsys/system/explorer/doc/TODO.txt b/reactos/subsys/system/explorer/doc/TODO.txt index 7b44bcdb71e..6f81fb154d9 100644 --- a/reactos/subsys/system/explorer/doc/TODO.txt +++ b/reactos/subsys/system/explorer/doc/TODO.txt @@ -35,7 +35,3 @@ Yes, ROS explorer doesn't read many settings from the registry currently, as it doesn't have a way to configure them. (missing configuration dialogs) -- Es scheint ein paar GDI-Leaks in deinem Programm zu geben. - Wenn man ein neues MDI Fenster 鰂fnet und dann wieder schlie遲, werden - einige GDI-Objekte nicht wieder gel鰏cht. - diff --git a/reactos/subsys/system/explorer/shell/filechild.cpp b/reactos/subsys/system/explorer/shell/filechild.cpp index c45dd0fdecc..ae84d494bcd 100644 --- a/reactos/subsys/system/explorer/shell/filechild.cpp +++ b/reactos/subsys/system/explorer/shell/filechild.cpp @@ -225,7 +225,7 @@ FileChildWindow::FileChildWindow(HWND hwnd, const FileChildWndInfo& info) if (info._open_mode & OWM_EXPLORE) ///@todo Is not-explore-mode for FileChildWindow completely implemented? - _left_hwnd = *(_left=new Pane(_hwnd, IDW_TREE_LEFT, IDW_HEADER_LEFT, _root._entry, true, COL_CONTENT)); + _left_hwnd = *(_left=new Pane(_hwnd, IDW_TREE_LEFT, IDW_HEADER_LEFT, _root._entry, true, COL_CONTENT)); _right_hwnd = *(_right=new Pane(_hwnd, IDW_TREE_RIGHT, IDW_HEADER_RIGHT, NULL, false, COL_TYPE|COL_SIZE|COL_DATE|COL_TIME|COL_ATTRIBUTES|COL_INDEX|COL_LINKS|COL_CONTENT)); diff --git a/reactos/subsys/system/explorer/shell/pane.cpp b/reactos/subsys/system/explorer/shell/pane.cpp index b9b371f3761..ddbf5d81838 100644 --- a/reactos/subsys/system/explorer/shell/pane.cpp +++ b/reactos/subsys/system/explorer/shell/pane.cpp @@ -95,6 +95,11 @@ Pane::Pane(HWND hparent, int id, int id_header, Entry* root, bool treePane, int create_header(hparent, id_header); } +Pane::~Pane() +{ + ImageList_Destroy(_himl); +} + LRESULT Pane::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) { diff --git a/reactos/subsys/system/explorer/shell/pane.h b/reactos/subsys/system/explorer/shell/pane.h index 0d72efd6b6f..7f4c1565ee8 100644 --- a/reactos/subsys/system/explorer/shell/pane.h +++ b/reactos/subsys/system/explorer/shell/pane.h @@ -68,6 +68,7 @@ struct Pane : public SubclassedWindow typedef SubclassedWindow super; Pane(HWND hparent, int id, int id_header, Entry* rool, bool treePane, int visible_cols); + ~Pane(); #define COLUMNS 12 int _widths[COLUMNS]; From 2c9bca4a1a393bf9be69130e7891926199dc9e0c Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sun, 14 Mar 2004 13:11:55 +0000 Subject: [PATCH 0492/1463] implemented SetFilePointerEx() and fixed SetFilePointer() to check if the calculated file position is negative svn path=/trunk/; revision=8710 --- reactos/lib/kernel32/file/file.c | 96 +++++++++++++++++++++++++++---- reactos/lib/kernel32/misc/stubs.c | 18 +----- 2 files changed, 86 insertions(+), 28 deletions(-) diff --git a/reactos/lib/kernel32/file/file.c b/reactos/lib/kernel32/file/file.c index 95a29b30042..a2bd8dec2e6 100644 --- a/reactos/lib/kernel32/file/file.c +++ b/reactos/lib/kernel32/file/file.c @@ -1,4 +1,4 @@ -/* $Id: file.c,v 1.49 2004/01/23 21:16:03 ekohl Exp $ +/* $Id: file.c,v 1.50 2004/03/14 13:11:55 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -203,6 +203,8 @@ SetFilePointer(HANDLE hFile, DPRINT("SetFilePointer(hFile %x, lDistanceToMove %d, dwMoveMethod %d)\n", hFile,lDistanceToMove,dwMoveMethod); + /* FIXME - should fail if hFile is a console handle */ + Distance.u.LowPart = lDistanceToMove; if (lpDistanceToMoveHigh) { @@ -216,18 +218,18 @@ SetFilePointer(HANDLE hFile, { Distance.u.HighPart = -1; } - - if (dwMoveMethod == FILE_CURRENT) - { + + switch(dwMoveMethod) + { + case FILE_CURRENT: NtQueryInformationFile(hFile, &IoStatusBlock, &FilePosition, sizeof(FILE_POSITION_INFORMATION), FilePositionInformation); FilePosition.CurrentByteOffset.QuadPart += Distance.QuadPart; - } - else if (dwMoveMethod == FILE_END) - { + break; + case FILE_END: NtQueryInformationFile(hFile, &IoStatusBlock, &FileStandart, @@ -235,11 +237,17 @@ SetFilePointer(HANDLE hFile, FileStandardInformation); FilePosition.CurrentByteOffset.QuadPart = FileStandart.EndOfFile.QuadPart + Distance.QuadPart; - } - else if ( dwMoveMethod == FILE_BEGIN ) - { + break; + case FILE_BEGIN: FilePosition.CurrentByteOffset.QuadPart = Distance.QuadPart; - } + break; + } + + if(FilePosition.CurrentByteOffset.QuadPart < 0) + { + SetLastError(ERROR_NEGATIVE_SEEK); + return -1; + } errCode = NtSetInformationFile(hFile, &IoStatusBlock, @@ -260,6 +268,72 @@ SetFilePointer(HANDLE hFile, } +/* + * @implemented + */ +BOOL +STDCALL +SetFilePointerEx(HANDLE hFile, + LARGE_INTEGER liDistanceToMove, + PLARGE_INTEGER lpNewFilePointer, + DWORD dwMoveMethod) +{ + FILE_POSITION_INFORMATION FilePosition; + FILE_STANDARD_INFORMATION FileStandart; + NTSTATUS errCode; + IO_STATUS_BLOCK IoStatusBlock; + + /* FIXME - should fail if hFile is a console handle */ + + switch(dwMoveMethod) + { + case FILE_CURRENT: + NtQueryInformationFile(hFile, + &IoStatusBlock, + &FilePosition, + sizeof(FILE_POSITION_INFORMATION), + FilePositionInformation); + FilePosition.CurrentByteOffset.QuadPart += liDistanceToMove.QuadPart; + break; + case FILE_END: + NtQueryInformationFile(hFile, + &IoStatusBlock, + &FileStandart, + sizeof(FILE_STANDARD_INFORMATION), + FileStandardInformation); + FilePosition.CurrentByteOffset.QuadPart = + FileStandart.EndOfFile.QuadPart + liDistanceToMove.QuadPart; + break; + case FILE_BEGIN: + FilePosition.CurrentByteOffset.QuadPart = liDistanceToMove.QuadPart; + break; + } + + if(FilePosition.CurrentByteOffset.QuadPart < 0) + { + SetLastError(ERROR_NEGATIVE_SEEK); + return FALSE; + } + + errCode = NtSetInformationFile(hFile, + &IoStatusBlock, + &FilePosition, + sizeof(FILE_POSITION_INFORMATION), + FilePositionInformation); + if (!NT_SUCCESS(errCode)) + { + SetLastErrorByStatus(errCode); + return FALSE; + } + + if (lpNewFilePointer) + { + *lpNewFilePointer = FilePosition.CurrentByteOffset; + } + return TRUE; +} + + /* * @implemented */ diff --git a/reactos/lib/kernel32/misc/stubs.c b/reactos/lib/kernel32/misc/stubs.c index 2edf5363584..a801be286a4 100644 --- a/reactos/lib/kernel32/misc/stubs.c +++ b/reactos/lib/kernel32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.64 2004/03/14 11:11:17 weiden Exp $ +/* $Id: stubs.c,v 1.65 2004/03/14 13:11:55 weiden Exp $ * * KERNEL32.DLL stubs (unimplemented functions) * Remove from this file, if you implement them. @@ -1421,22 +1421,6 @@ SetCriticalSectionSpinCount( return 0; } -/* - * @unimplemented - */ -BOOL -STDCALL -SetFilePointerEx( - HANDLE hFile, - LARGE_INTEGER liDistanceToMove, - PLARGE_INTEGER lpNewFilePointer, - DWORD dwMoveMethod - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented */ From 841b0b2958a759d23d5123df2fe1c6b90c51130d Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sun, 14 Mar 2004 13:20:10 +0000 Subject: [PATCH 0493/1463] implemented GetFileSizeEx() svn path=/trunk/; revision=8711 --- reactos/lib/kernel32/file/file.c | 33 ++++++++++++++++++++++++++++++- reactos/lib/kernel32/misc/stubs.c | 16 +-------------- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/reactos/lib/kernel32/file/file.c b/reactos/lib/kernel32/file/file.c index a2bd8dec2e6..731daa1cc55 100644 --- a/reactos/lib/kernel32/file/file.c +++ b/reactos/lib/kernel32/file/file.c @@ -1,4 +1,4 @@ -/* $Id: file.c,v 1.50 2004/03/14 13:11:55 weiden Exp $ +/* $Id: file.c,v 1.51 2004/03/14 13:20:10 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -444,6 +444,37 @@ GetFileSize(HANDLE hFile, } +/* + * @implemented + */ +BOOL +STDCALL +GetFileSizeEx( + HANDLE hFile, + PLARGE_INTEGER lpFileSize + ) +{ + NTSTATUS errCode; + FILE_STANDARD_INFORMATION FileStandard; + IO_STATUS_BLOCK IoStatusBlock; + + errCode = NtQueryInformationFile(hFile, + &IoStatusBlock, + &FileStandard, + sizeof(FILE_STANDARD_INFORMATION), + FileStandardInformation); + if (!NT_SUCCESS(errCode)) + { + SetLastErrorByStatus(errCode); + return FALSE; + } + if (lpFileSize) + *lpFileSize = FileStandard.EndOfFile; + + return TRUE; +} + + /* * @implemented */ diff --git a/reactos/lib/kernel32/misc/stubs.c b/reactos/lib/kernel32/misc/stubs.c index a801be286a4..45e4b16a15a 100644 --- a/reactos/lib/kernel32/misc/stubs.c +++ b/reactos/lib/kernel32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.65 2004/03/14 13:11:55 weiden Exp $ +/* $Id: stubs.c,v 1.66 2004/03/14 13:20:10 weiden Exp $ * * KERNEL32.DLL stubs (unimplemented functions) * Remove from this file, if you implement them. @@ -875,20 +875,6 @@ GetDevicePowerState( return 0; } -/* - * @unimplemented - */ -BOOL -STDCALL -GetFileSizeEx( - HANDLE hFile, - PLARGE_INTEGER lpFileSize - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented */ From 258d7cea7922423919cc808527ce0cc5117db9a3 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 14 Mar 2004 14:44:23 +0000 Subject: [PATCH 0494/1463] hide clock from desktop bar if it's configured this way in registry svn path=/trunk/; revision=8712 --- reactos/subsys/system/explorer/doc/TODO.txt | 5 ---- .../subsys/system/explorer/doxy-footer.html | 2 +- .../system/explorer/taskbar/traynotify.cpp | 29 +++++++++++++++---- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/reactos/subsys/system/explorer/doc/TODO.txt b/reactos/subsys/system/explorer/doc/TODO.txt index 6f81fb154d9..7b3897184ad 100644 --- a/reactos/subsys/system/explorer/doc/TODO.txt +++ b/reactos/subsys/system/explorer/doc/TODO.txt @@ -30,8 +30,3 @@ - Startmenu: You can't close the start menu with pressing Win-key You can open the start menu with pressing Win-key, but can't close with another hit of Win-key. -- > Despite of settings, the clock's always shown I set my Win-Explorer to hide the clock - > shown in the taskbar, but the ROS-Exp ignores the setting and always shows the clock. - Yes, ROS explorer doesn't read many settings from the registry currently, - as it doesn't have a way to configure them. (missing configuration dialogs) - diff --git a/reactos/subsys/system/explorer/doxy-footer.html b/reactos/subsys/system/explorer/doxy-footer.html index 1203a4b7b17..80bbe8b234f 100644 --- a/reactos/subsys/system/explorer/doxy-footer.html +++ b/reactos/subsys/system/explorer/doxy-footer.html @@ -3,7 +3,7 @@ <tr> <td><address style="align: right;"><small> ROS Explorer Source Code Documentation -<br>generated on 13.03.2004 by <a href="http://www.doxygen.org/index.html"> +<br>generated on 14.03.2004 by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border=0> </small></address> </td> diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index 7b2de60d63f..b6e2db8d5dc 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -104,17 +104,34 @@ LRESULT NotifyArea::Init(LPCREATESTRUCT pcs) if (!g_Globals._SHRestricted || !SHRestricted(REST_HIDECLOCK)) #endif { - // create clock window - _hwndClock = ClockWindow::Create(_hwnd); + HKEY hkeyStuckRects = 0; + DWORD buffer[10]; + DWORD len = sizeof(buffer); - if (_hwndClock) { - ClientRect clock_size(_hwndClock); - _clock_width = clock_size.right; + bool hide_clock = false; + + // check if the clock should be hidden + if (!RegOpenKey(HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StuckRects2"), &hkeyStuckRects) && + !RegQueryValueEx(hkeyStuckRects, TEXT("Settings"), 0, NULL, (LPBYTE)buffer, &len) && + len==sizeof(buffer) && buffer[0]==sizeof(buffer)) + hide_clock = buffer[2] & 0x08? true: false; + + if (!hide_clock) { + // create clock window + _hwndClock = ClockWindow::Create(_hwnd); + + if (_hwndClock) { + ClientRect clock_size(_hwndClock); + _clock_width = clock_size.right; + } } - SetTimer(_hwnd, 0, 1000, NULL); + if (hkeyStuckRects) + RegCloseKey(hkeyStuckRects); } + SetTimer(_hwnd, 0, 1000, NULL); + return 0; } From b7c8fed97811f596593fbd52dd9dcf1df74c44ec Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 14 Mar 2004 15:42:04 +0000 Subject: [PATCH 0495/1463] declare V5 structure members and constants for notifications icons svn path=/trunk/; revision=8713 --- reactos/w32api/include/shellapi.h | 38 +++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/reactos/w32api/include/shellapi.h b/reactos/w32api/include/shellapi.h index 0a583077caf..f0c0891409d 100644 --- a/reactos/w32api/include/shellapi.h +++ b/reactos/w32api/include/shellapi.h @@ -49,6 +49,9 @@ extern "C" { #define NIF_MESSAGE 1 #define NIF_ICON 2 #define NIF_TIP 4 +#define NIF_STATE 8 +#define NIS_HIDDEN 1 +#define NIS_SHAREDICON 2 #define SE_ERR_FNF 2 #define SE_ERR_PNF 3 #define SE_ERR_ACCESSDENIED 5 @@ -112,6 +115,7 @@ typedef struct _AppBarData { LPARAM lParam; } APPBARDATA,*PAPPBARDATA; DECLARE_HANDLE(HDROP); + typedef struct _NOTIFYICONDATAA { DWORD cbSize; HWND hWnd; @@ -119,8 +123,25 @@ typedef struct _NOTIFYICONDATAA { UINT uFlags; UINT uCallbackMessage; HICON hIcon; +#if _WIN32_IE >= 0x0500 + CHAR szTip[128]; + DWORD dwState; + DWORD dwStateMask; + CHAR szInfo[256]; + union { + UINT uTimeout; + UINT uVersion; + } DUMMYUNIONNAME; + CHAR szInfoTitle[64]; + DWORD dwInfoFlags; +#else CHAR szTip[64]; +#endif +#if _WIN32_IE >= 0x600 + GUID guidItem; +#endif } NOTIFYICONDATAA,*PNOTIFYICONDATAA; + typedef struct _NOTIFYICONDATAW { DWORD cbSize; HWND hWnd; @@ -128,8 +149,25 @@ typedef struct _NOTIFYICONDATAW { UINT uFlags; UINT uCallbackMessage; HICON hIcon; +#if _WIN32_IE >= 0x0500 + WCHAR szTip[128]; + DWORD dwState; + DWORD dwStateMask; + WCHAR szInfo[256]; + union { + UINT uTimeout; + UINT uVersion; + } DUMMYUNIONNAME; + WCHAR szInfoTitle[64]; + DWORD dwInfoFlags; +#else WCHAR szTip[64]; +#endif +#if _WIN32_IE >= 0x600 + GUID guidItem; +#endif } NOTIFYICONDATAW,*PNOTIFYICONDATAW; + typedef struct _SHELLEXECUTEINFOA { DWORD cbSize; ULONG fMask; From b61431ec366ffafe26c78c534ecec136fa3ea721 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 14 Mar 2004 15:54:27 +0000 Subject: [PATCH 0496/1463] declare NOTIFYICON VERSION 3 constants svn path=/trunk/; revision=8714 --- reactos/w32api/include/shellapi.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reactos/w32api/include/shellapi.h b/reactos/w32api/include/shellapi.h index f0c0891409d..603e5af0ae3 100644 --- a/reactos/w32api/include/shellapi.h +++ b/reactos/w32api/include/shellapi.h @@ -46,6 +46,11 @@ extern "C" { #define NIM_ADD 0 #define NIM_MODIFY 1 #define NIM_DELETE 2 +#if _WIN32_IE >= 0x0500 +#define NOTIFYICON_VERSION 3 +#define NIM_SETFOCUS 3 +#define NIM_SETVERSION 4 +#endif #define NIF_MESSAGE 1 #define NIF_ICON 2 #define NIF_TIP 4 From e8f56accc6415a89c4a13334698fc73a30cc75fb Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 14 Mar 2004 16:39:28 +0000 Subject: [PATCH 0497/1463] tool tip texts for notification icons svn path=/trunk/; revision=8715 --- reactos/subsys/system/explorer/Makefile.MinGW | 2 +- reactos/subsys/system/explorer/Makefile.Wine | 2 +- reactos/subsys/system/explorer/doc/TODO.txt | 1 - reactos/subsys/system/explorer/explorer.dsp | 18 +-- .../system/explorer/taskbar/traynotify.cpp | 110 +++++++++++++++--- .../system/explorer/taskbar/traynotify.h | 12 +- 6 files changed, 117 insertions(+), 28 deletions(-) diff --git a/reactos/subsys/system/explorer/Makefile.MinGW b/reactos/subsys/system/explorer/Makefile.MinGW index 907fdfb6de0..e9a2bc63d73 100644 --- a/reactos/subsys/system/explorer/Makefile.MinGW +++ b/reactos/subsys/system/explorer/Makefile.MinGW @@ -8,7 +8,7 @@ CC = gcc CXX = g++ LINK = g++ -CFLAGS = -DWIN32 -D_WIN32_IE=0x0501 -D_WIN32_WINNT=0x0501 -fexceptions -Wall +CFLAGS = -DWIN32 -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -fexceptions -Wall RCFLAGS = -DWIN32 -D__WINDRES__ LFLAGS = -Wl,--subsystem,windows diff --git a/reactos/subsys/system/explorer/Makefile.Wine b/reactos/subsys/system/explorer/Makefile.Wine index 1b484f0816e..f02c47b6508 100644 --- a/reactos/subsys/system/explorer/Makefile.Wine +++ b/reactos/subsys/system/explorer/Makefile.Wine @@ -5,7 +5,7 @@ SRCDIR = . MODULE = explorer.exe APPMODE = gui IMPORTS = shell32 comctl32 ole32 user32 gdi32 kernel32 advapi32 oleaut32 -EXTRADEFS = -D__WINE__ -D_WIN32_IE=0x0501 -D_WIN32_WINNT=0x0501 -D__MINGW32__ +EXTRADEFS = -D__WINE__ -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -D__MINGW32__ #EXTRA_OBJS = explorer_intres.res EXTRALIBS = $(LIBUUID) diff --git a/reactos/subsys/system/explorer/doc/TODO.txt b/reactos/subsys/system/explorer/doc/TODO.txt index 7b3897184ad..cb5301c2165 100644 --- a/reactos/subsys/system/explorer/doc/TODO.txt +++ b/reactos/subsys/system/explorer/doc/TODO.txt @@ -1,5 +1,4 @@ - read "DESCRIPT.ION" files to display file descriptions -- tool tip texts for notification icons - hiding of notification icons - context menus for quick launch bar - detect display mode changes and adjust desktop bar size diff --git a/reactos/subsys/system/explorer/explorer.dsp b/reactos/subsys/system/explorer/explorer.dsp index 37ec278b3d4..ac14eb38bb0 100644 --- a/reactos/subsys/system/explorer/explorer.dsp +++ b/reactos/subsys/system/explorer/explorer.dsp @@ -49,7 +49,7 @@ RSC=rc.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GR /GX /O1 /D "NDEBUG" /D "WIN32" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /YX /FD /c +# ADD CPP /nologo /MD /W3 /GR /GX /O1 /D "NDEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /YX /FD /c # ADD BASE RSC /l 0x407 /d "NDEBUG" # ADD RSC /l 0x407 /d "NDEBUG" BSC32=bscmake.exe @@ -74,7 +74,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c # ADD BASE RSC /l 0x407 /d "_DEBUG" # ADD RSC /l 0x407 /d "_DEBUG" BSC32=bscmake.exe @@ -100,7 +100,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_ROS_" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GR /GX /Zi /O2 /D "NDEBUG" /D "WIN32" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FR /YX /FD /c +# ADD CPP /nologo /MD /W3 /GR /GX /Zi /O2 /D "NDEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /YX /FD /c # ADD BASE RSC /l 0x407 /d "NDEBUG" # ADD RSC /l 0x407 /d "NDEBUG" BSC32=bscmake.exe @@ -126,7 +126,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /YX /FD /c +# ADD CPP /nologo /MD /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /YX /FD /c # ADD BASE RSC /l 0x407 /d "NDEBUG" # ADD RSC /l 0x407 /d "NDEBUG" BSC32=bscmake.exe @@ -152,7 +152,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /FR /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c # ADD BASE RSC /l 0x407 /d "_DEBUG" # ADD RSC /l 0x407 /d "_DEBUG" BSC32=bscmake.exe @@ -178,7 +178,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "_NO_COMUTIL" /D "WIN32" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "_NO_COMUTIL" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c # ADD BASE RSC /l 0x407 /d "_DEBUG" # ADD RSC /l 0x407 /d "_DEBUG" BSC32=bscmake.exe @@ -205,7 +205,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c # ADD BASE RSC /l 0x407 /d "_DEBUG" # ADD RSC /l 0x407 /d "_DEBUG" BSC32=bscmake.exe @@ -232,7 +232,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "UNICODE" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c -# ADD CPP /nologo /MT /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FD /c +# ADD CPP /nologo /MT /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FD /c # ADD BASE RSC /l 0x407 /d "_DEBUG" # ADD RSC /l 0x407 /d "_DEBUG" BSC32=bscmake.exe @@ -259,7 +259,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FD /c -# ADD CPP /nologo /MD /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FD /c +# ADD CPP /nologo /MD /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FD /c # ADD BASE RSC /l 0x407 /d "_DEBUG" # ADD RSC /l 0x407 /d "_DEBUG" BSC32=bscmake.exe diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index b6e2db8d5dc..18edddb1be6 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -57,6 +57,7 @@ NotifyInfo::NotifyInfo() _hIcon = 0; _dwState = 0; _uCallbackMessage = 0; + _version = 0; } @@ -77,22 +78,37 @@ NotifyInfo& NotifyInfo::operator=(NOTIFYICONDATA* pnid) _hIcon = (HICON) CopyImage(pnid->hIcon, IMAGE_ICON, 16, 16, 0); } -#ifdef NIF_STATE // currently (as of 21.08.2003) missing in MinGW headers +#ifdef NIF_STATE // as of 21.08.2003 missing in MinGW headers if (pnid->uFlags & NIF_STATE) _dwState = (_dwState&~pnid->dwStateMask) | (pnid->dwState&pnid->dwStateMask); #endif - ///@todo store and display tool tip texts + // store tool tip text + if (pnid->uFlags & NIF_TIP) + // UNICODE version of NOTIFYICONDATA structure + if (pnid->cbSize == sizeof(NOTIFYICONDATAW) || // _WIN32_IE = 0x600 + pnid->cbSize == sizeof(NOTIFYICONDATAW)-sizeof(GUID) || // _WIN32_IE = 0x500 + pnid->cbSize == sizeof(NOTIFYICONDATAW)-sizeof(GUID)-(128-64)*sizeof(WCHAR))// _WIN32_IE < 0x500 + _tipText = (LPCWSTR)pnid->szTip; + // ANSI version of NOTIFYICONDATA structure + else if (pnid->cbSize == sizeof(NOTIFYICONDATAA) || // _WIN32_IE = 0x600 + pnid->cbSize == sizeof(NOTIFYICONDATAA)-sizeof(GUID) || // _WIN32_IE = 0x500 + pnid->cbSize == sizeof(NOTIFYICONDATAA)-sizeof(GUID)-(128-64)*sizeof(CHAR)) // _WIN32_IE < 0x400 + _tipText = (LPCSTR)pnid->szTip; return *this; } NotifyArea::NotifyArea(HWND hwnd) - : super(hwnd) + : super(hwnd), + _tooltip(hwnd) { _next_idx = 0; _clock_width = 0; + _show_hidden = false; + + _tooltip.add(_hwnd, _hwnd); } LRESULT NotifyArea::Init(LPCREATESTRUCT pcs) @@ -212,14 +228,15 @@ LRESULT NotifyArea::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) PostMessage(entry._hWnd, entry._uCallbackMessage, entry._uID, nmsg); else { // allow SetForegroundWindow() in client process - DWORD processId; - GetWindowThreadProcessId(entry._hWnd, &processId); + DWORD pid; - // bind dynamically to AllowSetForegroundWindow() to be compatible to WIN98 - static DynamicFct<BOOL(WINAPI*)(DWORD dwProcessId)> AllowSetForegroundWindow(TEXT("USER32"), "AllowSetForegroundWindow"); + if (GetWindowThreadProcessId(entry._hWnd, &pid)) { + // bind dynamically to AllowSetForegroundWindow() to be compatible to WIN98 + static DynamicFct<BOOL(WINAPI*)(DWORD)> AllowSetForegroundWindow(TEXT("USER32"), "AllowSetForegroundWindow"); - if (AllowSetForegroundWindow) - (*AllowSetForegroundWindow)(processId); + if (AllowSetForegroundWindow) + (*AllowSetForegroundWindow)(pid); + } SendMessage(entry._hWnd, entry._uCallbackMessage, entry._uID, nmsg); } @@ -235,6 +252,27 @@ LRESULT NotifyArea::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) return 0; } +int NotifyArea::Notify(int id, NMHDR* pnmh) +{ + if (pnmh->code == TTN_GETDISPINFO) { + LPNMTTDISPINFO pdi = (LPNMTTDISPINFO)pnmh; + + Point pt(GetMessagePos()); + ScreenToClient(_hwnd, &pt); + + NotifyIconSet::iterator found = IconHitTest(pt); + + if (found != _sorted_icons.end()) { + NotifyInfo& entry = const_cast<NotifyInfo&>(*found); // Why does GCC 3.3 need this additional const_cast ?! + + if (!entry._tipText.empty()) + _tcscpy(pdi->szText, entry._tipText); + } + } + + return 0; +} + void NotifyArea::CancelModes() { PostMessage(HWND_BROADCAST, WM_CANCELMODE, 0, 0); @@ -248,13 +286,18 @@ LRESULT NotifyArea::ProcessTrayNotification(int notify_code, NOTIFYICONDATA* pni switch(notify_code) { case NIM_ADD: case NIM_MODIFY: - if ((int)pnid->uID >= 0) { ///@todo fix for windows task manager + if ((int)pnid->uID >= 0) { ///@todo This is a fix for Windows Task Manager. NotifyInfo& entry = _icon_map[pnid] = pnid; // a new entry? if (entry._idx == -1) entry._idx = ++_next_idx; +#if NOTIFYICON_VERSION>=3 // as of 21.08.2003 missing in MinGW headers + if (DetermineHideState(entry)) + entry._dwState |= NIS_HIDDEN; +#endif + Refresh(); ///@todo call only if really changes occurred return TRUE; @@ -273,12 +316,19 @@ LRESULT NotifyArea::ProcessTrayNotification(int notify_code, NOTIFYICONDATA* pni } break;} -#if NOTIFYICON_VERSION>=3 // currently (as of 21.08.2003) missing in MinGW headers +#if NOTIFYICON_VERSION>=3 // as of 21.08.2003 missing in MinGW headers case NIM_SETFOCUS: + SetForegroundWindow(_hwnd); return TRUE; case NIM_SETVERSION: - return FALSE; ///@todo + NotifyIconMap::iterator found = _icon_map.find(pnid); + + if (found != _icon_map.end()) { + found->second._version = pnid->UNION_MEMBER(uVersion); + return TRUE; + } else + return FALSE; #endif } @@ -293,8 +343,8 @@ void NotifyArea::Refresh() for(NotifyIconMap::const_iterator it=_icon_map.begin(); it!=_icon_map.end(); ++it) { const NotifyInfo& entry = it->second; -#ifdef NIF_STATE // currently (as of 21.08.2003) missing in MinGW headers - if (!(entry._dwState & NIS_HIDDEN)) +#ifdef NIF_STATE // as of 21.08.2003 missing in MinGW headers + if (_show_hidden || !(entry._dwState & NIS_HIDDEN)) #endif _sorted_icons.insert(entry); } @@ -367,6 +417,38 @@ NotifyIconSet::iterator NotifyArea::IconHitTest(const POINT& pos) return it; } +#if NOTIFYICON_VERSION>=3 // as of 21.08.2003 missing in MinGW headers +bool NotifyArea::DetermineHideState(NotifyInfo& entry) +{ +/* + DWORD pid; + + if (GetWindowThreadProcessId(entry._hWnd, &pid)) { + + //@@ look for executable path + + } +*/ + TCHAR title[MAX_PATH]; + + if (GetWindowText(entry._hWnd, title, MAX_PATH)) { + if (_tcsstr(title, TEXT("Task Manager"))) + return false; + + if (_tcsstr(title, TEXT("AntiVir"))) + return true; + + if (_tcsstr(title, TEXT("Apache"))) + return true; + + if (_tcsstr(title, TEXT("FRITZ!web"))) + return true; + } + + return false; +} +#endif + ClockWindow::ClockWindow(HWND hwnd) : super(hwnd), diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.h b/reactos/subsys/system/explorer/taskbar/traynotify.h index 73fb129d881..522f4e12e4c 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.h +++ b/reactos/subsys/system/explorer/taskbar/traynotify.h @@ -67,6 +67,8 @@ struct NotifyInfo : public NotifyIconIndex HICON _hIcon; DWORD _dwState; UINT _uCallbackMessage; + UINT _version; + String _tipText; }; typedef map<NotifyIconIndex, NotifyInfo> NotifyIconMap; @@ -86,15 +88,20 @@ struct NotifyArea : public Window LRESULT ProcessTrayNotification(int notify_code, NOTIFYICONDATA* pnid); protected: + WindowHandle _hwndClock; + int _clock_width; + NotifyIconMap _icon_map; NotifyIconSet _sorted_icons; int _next_idx; - WindowHandle _hwndClock; - int _clock_width; + ToolTip _tooltip; + + bool _show_hidden; LRESULT Init(LPCREATESTRUCT pcs); LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + int Notify(int id, NMHDR* pnmh); void Refresh(); void Paint(); @@ -102,6 +109,7 @@ protected: void CancelModes(); NotifyIconSet::iterator IconHitTest(const POINT& pos); + bool DetermineHideState(NotifyInfo& entry); }; From c72fe4771eba7602c27ef8d1d522aba2a901525a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Sun, 14 Mar 2004 16:39:49 +0000 Subject: [PATCH 0498/1463] Implement TrackPopupMenu. This fixes bug #131 svn path=/trunk/; revision=8716 --- reactos/lib/user32/windows/menu.c | 53 ++++++++++++++++++------------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/reactos/lib/user32/windows/menu.c b/reactos/lib/user32/windows/menu.c index b8c5f8a661c..34f7010769c 100644 --- a/reactos/lib/user32/windows/menu.c +++ b/reactos/lib/user32/windows/menu.c @@ -21,7 +21,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: menu.c,v 1.54 2004/03/10 20:36:19 silverblade Exp $ +/* $Id: menu.c,v 1.55 2004/03/14 16:39:49 gvg Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/menu.c @@ -4200,41 +4200,50 @@ SetSystemMenu ( BOOL STDCALL TrackPopupMenu( - HMENU hMenu, - UINT uFlags, + HMENU Menu, + UINT Flags, int x, int y, - int nReserved, - HWND hWnd, - CONST RECT *prcRect) + int Reserved, + HWND Wnd, + CONST RECT *Rect) { - TPMPARAMS tpm; - - if(prcRect) - { - tpm.cbSize = sizeof(TPMPARAMS); - tpm.rcExclude = *prcRect; - } - - return (BOOL)NtUserTrackPopupMenuEx(hMenu, uFlags, x, y, hWnd, - (prcRect ? &tpm : NULL)); + BOOL ret = FALSE; + + MenuInitTracking(Wnd, Menu, TRUE, Flags); + + /* Send WM_INITMENUPOPUP message only if TPM_NONOTIFY flag is not specified */ + if (0 == (Flags & TPM_NONOTIFY)) + { + SendMessageW(Wnd, WM_INITMENUPOPUP, (WPARAM) Menu, 0); + } + + if (MenuShowPopup(Wnd, Menu, 0, x, y, 0, 0 )) + { + ret = MenuTrackMenu(Menu, Flags | TPM_POPUPMENU, 0, 0, Wnd, Rect); + } + MenuExitTracking(Wnd); + + return ret; } /* - * @implemented + * @unimplemented */ BOOL STDCALL TrackPopupMenuEx( - HMENU hmenu, - UINT fuFlags, + HMENU Menu, + UINT Flags, int x, int y, - HWND hwnd, - LPTPMPARAMS lptpm) + HWND Wnd, + LPTPMPARAMS Tpm) { - return (BOOL)NtUserTrackPopupMenuEx(hmenu, fuFlags, x, y, hwnd, lptpm); + /* Not fully implemented */ + return TrackPopupMenu(Menu, Flags, x, y, 0, Wnd, + NULL != Tpm ? &Tpm->rcExclude : NULL); } From c5058d5a3c55cc718e5ad3e7200fbee4b6f0cdd5 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 14 Mar 2004 17:10:43 +0000 Subject: [PATCH 0499/1463] - Fixed handling of IRP_MN_QUERY_BUS_INFORMATION. - Add basic handling of IRP_MN_QUERY_CAPABILITIES for getting device specific bus address. svn path=/trunk/; revision=8717 --- reactos/drivers/bus/pci/fdo.c | 9 +++++++-- reactos/drivers/bus/pci/pci.h | 6 +++--- reactos/drivers/bus/pci/pdo.c | 30 +++++++++++++++++++++++++++--- 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/reactos/drivers/bus/pci/fdo.c b/reactos/drivers/bus/pci/fdo.c index ce76ced9365..790827a8476 100644 --- a/reactos/drivers/bus/pci/fdo.c +++ b/reactos/drivers/bus/pci/fdo.c @@ -1,4 +1,4 @@ -/* $Id: fdo.c,v 1.6 2004/03/12 19:40:05 navaraf Exp $ +/* $Id: fdo.c,v 1.7 2004/03/14 17:10:43 navaraf Exp $ * * PROJECT: ReactOS PCI bus driver * FILE: fdo.c @@ -13,7 +13,7 @@ #include "pcidef.h" #include "pci.h" -//#define NDEBUG +#define NDEBUG #include <debug.h> /*** PRIVATE *****************************************************************/ @@ -249,6 +249,11 @@ FdoQueryBusRelations( PdoDeviceExtension->BusNumber = Device->BusNumber; + RtlCopyMemory( + &PdoDeviceExtension->SlotNumber, + &Device->SlotNumber, + sizeof(PCI_SLOT_NUMBER)); + /* FIXME: Get device properties (Hardware IDs, etc.) */ swprintf( diff --git a/reactos/drivers/bus/pci/pci.h b/reactos/drivers/bus/pci/pci.h index 0cab2f81df9..8a511e3bf5c 100644 --- a/reactos/drivers/bus/pci/pci.h +++ b/reactos/drivers/bus/pci/pci.h @@ -1,4 +1,4 @@ -/* $Id: pci.h,v 1.5 2004/03/12 19:40:05 navaraf Exp $ */ +/* $Id: pci.h,v 1.6 2004/03/14 17:10:43 navaraf Exp $ */ #ifndef __PCI_H #define __PCI_H @@ -58,6 +58,8 @@ typedef struct _PDO_DEVICE_EXTENSION PDEVICE_OBJECT Fdo; // PCI bus number ULONG BusNumber; + // PCI slot number + PCI_SLOT_NUMBER SlotNumber; // Device ID UNICODE_STRING DeviceID; // Instance ID @@ -85,8 +87,6 @@ typedef struct _FDO_DEVICE_EXTENSION ULONG DeviceListCount; // Lock for namespace device list KSPIN_LOCK DeviceListLock; - // PCI bus number -/* ULONG BusNumber;*/ // Lower device object PDEVICE_OBJECT Ldo; } __attribute((packed)) FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION; diff --git a/reactos/drivers/bus/pci/pdo.c b/reactos/drivers/bus/pci/pdo.c index b1e980debf5..0af93348692 100644 --- a/reactos/drivers/bus/pci/pdo.c +++ b/reactos/drivers/bus/pci/pdo.c @@ -1,4 +1,4 @@ -/* $Id: pdo.c,v 1.3 2004/03/12 19:40:05 navaraf Exp $ +/* $Id: pdo.c,v 1.4 2004/03/14 17:10:43 navaraf Exp $ * * PROJECT: ReactOS PCI bus driver * FILE: pdo.c @@ -99,9 +99,30 @@ PdoQueryBusInformation( BusInformation->LegacyBusType = PCIBus; BusInformation->BusNumber = DeviceExtension->BusNumber; - return STATUS_INSUFFICIENT_RESOURCES; + return STATUS_SUCCESS; } + return STATUS_INSUFFICIENT_RESOURCES; +} + + +NTSTATUS +PdoQueryCapabilities( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + PIO_STACK_LOCATION IrpSp) +{ + PPDO_DEVICE_EXTENSION DeviceExtension; + PDEVICE_CAPABILITIES DeviceCapabilities; + + DPRINT("Called\n"); + + DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + DeviceCapabilities = IrpSp->Parameters.DeviceCapabilities.Capabilities; + + DeviceCapabilities->Address = + DeviceCapabilities->UINumber = DeviceExtension->SlotNumber.u.AsULONG; + return STATUS_SUCCESS; } @@ -176,10 +197,11 @@ PdoPnpControl( Status = PdoQueryBusInformation(DeviceObject, Irp, IrpSp); break; -#if 0 case IRP_MN_QUERY_CAPABILITIES: + Status = PdoQueryCapabilities(DeviceObject, Irp, IrpSp); break; +#if 0 case IRP_MN_QUERY_DEVICE_RELATIONS: /* FIXME: Possibly handle for RemovalRelations */ break; @@ -187,9 +209,11 @@ PdoPnpControl( case IRP_MN_QUERY_DEVICE_TEXT: break; #endif + case IRP_MN_QUERY_ID: Status = PdoQueryId(DeviceObject, Irp, IrpSp); break; + #if 0 case IRP_MN_QUERY_PNP_DEVICE_STATE: break; From b4e4cd66768060905db135237c3ffbdeffdfeafe Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 14 Mar 2004 17:10:48 +0000 Subject: [PATCH 0500/1463] - Don't load PnP drivers if they're disabled. - Save pointer to PnP tree device node in device object's DeviceObjectExtension. - Add function IopGetDeviceNode for getting device node from device object pointer. - Rewritten IoGetDeviceProperty to use values that are in device node instead of sending Irps. svn path=/trunk/; revision=8718 --- reactos/ntoskrnl/include/internal/io.h | 9 +- reactos/ntoskrnl/io/device.c | 14 +++- reactos/ntoskrnl/io/driver.c | 40 +++++---- reactos/ntoskrnl/io/pnpmgr.c | 112 ++++++++++++------------- 4 files changed, 95 insertions(+), 80 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/io.h b/reactos/ntoskrnl/include/internal/io.h index 33b1016c473..7aa02e4bb15 100644 --- a/reactos/ntoskrnl/include/internal/io.h +++ b/reactos/ntoskrnl/include/internal/io.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: io.h,v 1.38 2003/12/15 17:49:41 ekohl Exp $ +/* $Id: io.h,v 1.39 2004/03/14 17:10:48 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -48,6 +48,13 @@ typedef struct _IO_COMPLETION_PACKET{ LIST_ENTRY ListEntry; } IO_COMPLETION_PACKET, *PIO_COMPLETION_PACKET; +typedef struct _DEVOBJ_EXTENSION { + CSHORT Type; + USHORT Size; + PDEVICE_OBJECT DeviceObject; + ULONG Unknown[3]; + struct _DEVICE_NODE *DeviceNode; +} DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION; typedef struct _DEVICE_NODE { diff --git a/reactos/ntoskrnl/io/device.c b/reactos/ntoskrnl/io/device.c index a8509e5b7cd..ecfee43cd38 100644 --- a/reactos/ntoskrnl/io/device.c +++ b/reactos/ntoskrnl/io/device.c @@ -1,4 +1,4 @@ -/* $Id: device.c,v 1.66 2004/03/07 11:59:10 navaraf Exp $ +/* $Id: device.c,v 1.67 2004/03/14 17:10:48 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -636,6 +636,7 @@ IoCreateDevice(PDRIVER_OBJECT DriverObject, */ { PDEVICE_OBJECT CreatedDeviceObject; + PDEVOBJ_EXTENSION DeviceObjectExtension; OBJECT_ATTRIBUTES ObjectAttributes; NTSTATUS Status; @@ -740,6 +741,17 @@ IoCreateDevice(PDRIVER_OBJECT DriverObject, IoAttachVpb(CreatedDeviceObject); } + DeviceObjectExtension = + ExAllocatePoolWithTag(NonPagedPool, sizeof(DEVOBJ_EXTENSION), + TAG_DEVICE_EXTENSION); + + DeviceObjectExtension->Type = 0 /* ?? */; + DeviceObjectExtension->Size = sizeof(DEVOBJ_EXTENSION); + DeviceObjectExtension->DeviceObject = CreatedDeviceObject; + DeviceObjectExtension->DeviceNode = NULL; + + CreatedDeviceObject->DeviceObjectExtension = DeviceObjectExtension; + *DeviceObject = CreatedDeviceObject; return(STATUS_SUCCESS); diff --git a/reactos/ntoskrnl/io/driver.c b/reactos/ntoskrnl/io/driver.c index 6b5bb165f8a..045390e3cd3 100644 --- a/reactos/ntoskrnl/io/driver.c +++ b/reactos/ntoskrnl/io/driver.c @@ -1,4 +1,4 @@ -/* $Id: driver.c,v 1.35 2004/03/12 19:40:29 navaraf Exp $ +/* $Id: driver.c,v 1.36 2004/03/14 17:10:48 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -802,33 +802,34 @@ NTSTATUS IopInitializeDeviceNodeService(PDEVICE_NODE DeviceNode, BOOLEAN BootDriverOnly) { NTSTATUS Status; + ULONG ServiceStart; + RTL_QUERY_REGISTRY_TABLE QueryTable[2]; if (DeviceNode->ServiceName.Buffer == NULL) { return STATUS_UNSUCCESSFUL; } + /* + * Get service start value + */ + + RtlZeroMemory(QueryTable, sizeof(QueryTable)); + QueryTable[0].Name = L"Start"; + QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT; + QueryTable[0].EntryContext = &ServiceStart; + Status = RtlQueryRegistryValues(RTL_REGISTRY_SERVICES, + DeviceNode->ServiceName.Buffer, QueryTable, NULL, NULL); + if (!NT_SUCCESS(Status)) + { + DPRINT("RtlQueryRegistryValues() failed (Status %x)\n", Status); + return Status; + } + if (BootDriverOnly) { - ULONG ServiceStart; - RTL_QUERY_REGISTRY_TABLE QueryTable[2]; PLOADER_MODULE KeLoaderModules = (PLOADER_MODULE)KeLoaderBlock.ModsAddr; - /* - * Get service start value - */ - RtlZeroMemory(QueryTable, sizeof(QueryTable)); - QueryTable[0].Name = L"Start"; - QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT; - QueryTable[0].EntryContext = &ServiceStart; - Status = RtlQueryRegistryValues(RTL_REGISTRY_SERVICES, - DeviceNode->ServiceName.Buffer, QueryTable, NULL, NULL); - if (!NT_SUCCESS(Status)) - { - DPRINT("RtlQueryRegistryValues() failed (Status %x)\n", Status); - return Status; - } - /* * Find and initialize boot driver */ @@ -860,6 +861,7 @@ IopInitializeDeviceNodeService(PDEVICE_NODE DeviceNode, BOOLEAN BootDriverOnly) return STATUS_UNSUCCESSFUL; } } else + if (ServiceStart < 4) { UNICODE_STRING ImagePath; @@ -889,6 +891,8 @@ IopInitializeDeviceNodeService(PDEVICE_NODE DeviceNode, BOOLEAN BootDriverOnly) */ RtlFreeUnicodeString(&ImagePath); } + else + Status = STATUS_UNSUCCESSFUL; return Status; } diff --git a/reactos/ntoskrnl/io/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr.c index acb0e479e64..ce5968a670c 100644 --- a/reactos/ntoskrnl/io/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr.c @@ -1,4 +1,4 @@ -/* $Id: pnpmgr.c,v 1.23 2004/03/12 19:40:29 navaraf Exp $ +/* $Id: pnpmgr.c,v 1.24 2004/03/14 17:10:48 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -62,16 +62,11 @@ IoInvalidateDeviceRelations( { } -PPNP_BUS_INFORMATION FASTCALL -IopQueryBusInformation( +PDEVICE_NODE FASTCALL +IopGetDeviceNode( PDEVICE_OBJECT DeviceObject) { - IO_STATUS_BLOCK IoStatusBlock; - IO_STACK_LOCATION Stack; - - return NT_SUCCESS(IopInitiatePnpIrp(DeviceObject, &IoStatusBlock, - IRP_MN_QUERY_BUS_INFORMATION, &Stack)) ? - (PPNP_BUS_INFORMATION)IoStatusBlock.Information : NULL; + return DeviceObject->DeviceObjectExtension->DeviceNode; } /* @@ -86,9 +81,18 @@ IoGetDeviceProperty( OUT PVOID PropertyBuffer, OUT PULONG ResultLength) { - PPNP_BUS_INFORMATION BusInformation; + PDEVICE_NODE DeviceNode = IopGetDeviceNode(DeviceObject); + ULONG Length; + PVOID Data; - DPRINT("IoGetDeviceProperty called"); + DPRINT("IoGetDeviceProperty called\n"); + + if (DeviceNode == NULL || + DeviceNode->BusInformation == NULL || + DeviceNode->CapabilityFlags == NULL) + { + return STATUS_INVALID_DEVICE_REQUEST; + } /* * Used IRPs: @@ -97,64 +101,46 @@ IoGetDeviceProperty( */ switch (DeviceProperty) { - /* Complete, untested */ case DevicePropertyBusNumber: - *ResultLength = sizeof(ULONG); - if (BufferLength < sizeof(ULONG)) - return STATUS_BUFFER_TOO_SMALL; - BusInformation = IopQueryBusInformation(DeviceObject); - if (BusInformation != NULL) - { - *((ULONG *)PropertyBuffer) = BusInformation->BusNumber; - ExFreePool(BusInformation); - return STATUS_UNSUCCESSFUL; - } - return STATUS_SUCCESS; + Length = sizeof(ULONG); + Data = &DeviceNode->BusInformation->BusNumber; + break; /* Complete, untested */ case DevicePropertyBusTypeGuid: *ResultLength = 39 * sizeof(WCHAR); if (BufferLength < (39 * sizeof(WCHAR))) return STATUS_BUFFER_TOO_SMALL; - BusInformation = IopQueryBusInformation(DeviceObject); - if (BusInformation != NULL) - { - swprintf((PWSTR)PropertyBuffer, - L"{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", - BusInformation->BusTypeGuid.Data1, - BusInformation->BusTypeGuid.Data2, - BusInformation->BusTypeGuid.Data3, - BusInformation->BusTypeGuid.Data4[0], - BusInformation->BusTypeGuid.Data4[1], - BusInformation->BusTypeGuid.Data4[2], - BusInformation->BusTypeGuid.Data4[3], - BusInformation->BusTypeGuid.Data4[4], - BusInformation->BusTypeGuid.Data4[5], - BusInformation->BusTypeGuid.Data4[6], - BusInformation->BusTypeGuid.Data4[7]); - ExFreePool(BusInformation); - return STATUS_UNSUCCESSFUL; - } + swprintf((PWSTR)PropertyBuffer, + L"{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", + DeviceNode->BusInformation->BusTypeGuid.Data1, + DeviceNode->BusInformation->BusTypeGuid.Data2, + DeviceNode->BusInformation->BusTypeGuid.Data3, + DeviceNode->BusInformation->BusTypeGuid.Data4[0], + DeviceNode->BusInformation->BusTypeGuid.Data4[1], + DeviceNode->BusInformation->BusTypeGuid.Data4[2], + DeviceNode->BusInformation->BusTypeGuid.Data4[3], + DeviceNode->BusInformation->BusTypeGuid.Data4[4], + DeviceNode->BusInformation->BusTypeGuid.Data4[5], + DeviceNode->BusInformation->BusTypeGuid.Data4[6], + DeviceNode->BusInformation->BusTypeGuid.Data4[7]); return STATUS_SUCCESS; - /* Complete, untested */ case DevicePropertyLegacyBusType: - *ResultLength = sizeof(INTERFACE_TYPE); - if (BufferLength < sizeof(INTERFACE_TYPE)) - return STATUS_BUFFER_TOO_SMALL; - BusInformation = IopQueryBusInformation(DeviceObject); - if (BusInformation != NULL) - { - RtlCopyMemory( - PropertyBuffer, - &BusInformation->LegacyBusType, - sizeof(INTERFACE_TYPE)); - ExFreePool(BusInformation); - return STATUS_UNSUCCESSFUL; - } - return STATUS_SUCCESS; + Length = sizeof(INTERFACE_TYPE); + Data = &DeviceNode->BusInformation->LegacyBusType; + break; case DevicePropertyAddress: + Length = sizeof(ULONG); + Data = &DeviceNode->CapabilityFlags->Address; + break; + + case DevicePropertyUINumber: + Length = sizeof(ULONG); + Data = &DeviceNode->CapabilityFlags->UINumber; + break; + case DevicePropertyBootConfiguration: case DevicePropertyBootConfigurationTranslated: case DevicePropertyClassGuid: @@ -168,13 +154,17 @@ IoGetDeviceProperty( case DevicePropertyLocationInformation: case DevicePropertyManufacturer: case DevicePropertyPhysicalDeviceObjectName: - case DevicePropertyUINumber: - break; + return STATUS_NOT_IMPLEMENTED; default: - return STATUS_INVALID_PARAMETER_2; + return STATUS_INVALID_PARAMETER_2; } + *ResultLength = Length; + if (BufferLength < Length) + return STATUS_BUFFER_TOO_SMALL; + RtlCopyMemory(PropertyBuffer, Data, Length); + return STATUS_NOT_IMPLEMENTED; } @@ -309,6 +299,8 @@ IopCreateDeviceNode(PDEVICE_NODE ParentNode, Node->Pdo = PhysicalDeviceObject; + PhysicalDeviceObject->DeviceObjectExtension->DeviceNode = Node; + if (ParentNode) { KeAcquireSpinLock(&IopDeviceTreeLock, &OldIrql); From b6a8d006e32d94668b0923b568aaa9031287d070 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 14 Mar 2004 17:47:10 +0000 Subject: [PATCH 0501/1463] - Added PnP enum entry for the VMware video driver. svn path=/trunk/; revision=8720 --- reactos/bootdata/hivesys.inf | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/bootdata/hivesys.inf b/reactos/bootdata/hivesys.inf index d6b0ec45e10..3b37cdcd343 100644 --- a/reactos/bootdata/hivesys.inf +++ b/reactos/bootdata/hivesys.inf @@ -587,6 +587,7 @@ HKLM,"SYSTEM\CurrentControlSet\Hardware Profiles\Current\System\CurrentControlSe HKLM,"SYSTEM\CurrentControlSet\Hardware Profiles\Current\System\CurrentControlSet\Services\vmx_svga\Device0","DefaultSettings.BitsPerPel",0x00010001,16 HKLM,"SYSTEM\CurrentControlSet\Hardware Profiles\Current\System\CurrentControlSet\Services\vmx_svga\Device0","DefaultSettings.XResolution",0x00010001,800 HKLM,"SYSTEM\CurrentControlSet\Hardware Profiles\Current\System\CurrentControlSet\Services\vmx_svga\Device0","DefaultSettings.YResolution",0x00010001,600 +HKLM,"SYSTEM\CurrentControlSet\Enum\PCI\VEN_15AD&DEV_0405&SUBSYS_040515AD&REV_00\0000","Service",0x00000000,"vmx_svga" ; Kernel-mode regression test driver HKLM,"SYSTEM\CurrentControlSet\Services\kmregtests","ErrorControl",0x00010001,0x00000000 From e040902fffd903c13c80cfc14cb28b2c7285f4db Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sun, 14 Mar 2004 17:53:27 +0000 Subject: [PATCH 0502/1463] implemented SetConsoleIcon() svn path=/trunk/; revision=8721 --- reactos/include/csrss/csrss.h | 9 ++++++ reactos/lib/kernel32/misc/console.c | 32 ++++++++++++++++++++-- reactos/lib/kernel32/misc/stubs.c | 11 +------- reactos/subsys/csrss/include/conio.h | 6 +++- reactos/subsys/csrss/win32csr/conio.c | 29 +++++++++++++++++++- reactos/subsys/csrss/win32csr/guiconsole.c | 14 ++++++++-- 6 files changed, 85 insertions(+), 16 deletions(-) diff --git a/reactos/include/csrss/csrss.h b/reactos/include/csrss/csrss.h index 0decd65a169..398bef18a3b 100644 --- a/reactos/include/csrss/csrss.h +++ b/reactos/include/csrss/csrss.h @@ -497,6 +497,12 @@ typedef struct HWND WindowHandle; } CSRSS_CONSOLE_WINDOW, *PCSRSS_CONSOLE_WINDOW; +typedef struct +{ + HANDLE ConsoleHandle; + HICON WindowIcon; +} CSRSS_CONSOLE_SET_WINDOW_ICON, *PCSRSS_CONSOLE_SET_WINDOW_ICON; + typedef struct { WCHAR DesktopName[1]; @@ -590,6 +596,7 @@ typedef struct #define CSRSS_CREATE_DESKTOP (0x2B) #define CSRSS_SHOW_DESKTOP (0x2C) #define CSRSS_HIDE_DESKTOP (0x2D) +#define CSRSS_SET_CONSOLE_ICON (0x2E) /* Keep in sync with definition below. */ #define CSRSS_REQUEST_HEADER_SIZE (sizeof(LPC_MESSAGE) + sizeof(ULONG)) @@ -643,6 +650,7 @@ typedef struct CSRSS_CREATE_DESKTOP_REQUEST CreateDesktopRequest; CSRSS_SHOW_DESKTOP_REQUEST ShowDesktopRequest; CSRSS_HIDE_DESKTOP_REQUEST HideDesktopRequest; + CSRSS_CONSOLE_SET_WINDOW_ICON ConsoleSetWindowIconRequest; } Data; } CSRSS_API_REQUEST, *PCSRSS_API_REQUEST; @@ -682,6 +690,7 @@ typedef struct CSRSS_CREATE_DESKTOP_REPLY CreateDesktopReply; CSRSS_SHOW_DESKTOP_REPLY ShowDesktopReply; CSRSS_HIDE_DESKTOP_REPLY HideDesktopReply; + CSRSS_CONSOLE_SET_WINDOW_ICON ConsoleSetWindowIconReply; } Data; } CSRSS_API_REPLY, *PCSRSS_API_REPLY; diff --git a/reactos/lib/kernel32/misc/console.c b/reactos/lib/kernel32/misc/console.c index 1d01b163f42..0b3f632e365 100644 --- a/reactos/lib/kernel32/misc/console.c +++ b/reactos/lib/kernel32/misc/console.c @@ -1,4 +1,4 @@ -/* $Id: console.c,v 1.73 2004/01/23 21:16:03 ekohl Exp $ +/* $Id: console.c,v 1.74 2004/03/14 17:53:26 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -3169,7 +3169,7 @@ AttachConsole(DWORD dwProcessId) } /*-------------------------------------------------------------- - * GetConsoleWindow/0 + * GetConsoleWindow * * @implemented */ @@ -3196,4 +3196,32 @@ GetConsoleWindow (VOID) return Reply.Data.ConsoleWindowReply.WindowHandle; } + +/*-------------------------------------------------------------- + * GetConsoleWindow + * @implemented + */ +BOOL STDCALL SetConsoleIcon(HICON hicon) +{ + CSRSS_API_REQUEST Request; + CSRSS_API_REPLY Reply; + NTSTATUS Status; + + Request.Data.ConsoleSetWindowIconRequest.ConsoleHandle = + OpenConsoleW (L"CONOUT$", (GENERIC_READ|GENERIC_WRITE), FALSE, OPEN_EXISTING); + if (INVALID_HANDLE_VALUE == Request.Data.ConsoleSetWindowIconRequest.ConsoleHandle) + { + return FALSE; + } + Request.Type = CSRSS_SET_CONSOLE_ICON; + Request.Data.ConsoleSetWindowIconRequest.WindowIcon = hicon; + Status = CsrClientCallServer( &Request, &Reply, sizeof( CSRSS_API_REQUEST ), sizeof( CSRSS_API_REPLY ) ); + if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status)) + { + SetLastErrorByStatus (Status); + return FALSE; + } + return NT_SUCCESS(Status); +} + /* EOF */ diff --git a/reactos/lib/kernel32/misc/stubs.c b/reactos/lib/kernel32/misc/stubs.c index 45e4b16a15a..53e87b77db5 100644 --- a/reactos/lib/kernel32/misc/stubs.c +++ b/reactos/lib/kernel32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.66 2004/03/14 13:20:10 weiden Exp $ +/* $Id: stubs.c,v 1.67 2004/03/14 17:53:26 weiden Exp $ * * KERNEL32.DLL stubs (unimplemented functions) * Remove from this file, if you implement them. @@ -2388,15 +2388,6 @@ BOOL STDCALL GetConsoleKeyboardLayoutNameW(LPWSTR name) return 0; } -/* - * @unimplemented - */ -BOOL STDCALL SetConsoleIcon(HICON hicon) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented */ diff --git a/reactos/subsys/csrss/include/conio.h b/reactos/subsys/csrss/include/conio.h index d4466ba948a..865ad61c8e5 100644 --- a/reactos/subsys/csrss/include/conio.h +++ b/reactos/subsys/csrss/include/conio.h @@ -1,4 +1,4 @@ -/* $Id: conio.h,v 1.2 2004/01/11 17:31:15 gvg Exp $ +/* $Id: conio.h,v 1.3 2004/03/14 17:53:27 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -58,6 +58,7 @@ typedef struct tagCSRSS_CONSOLE_VTBL UINT OldCursorX, UINT OldCursorY); BOOL (STDCALL *ChangeTitle)(PCSRSS_CONSOLE Console); VOID (STDCALL *CleanupConsole)(PCSRSS_CONSOLE Console); + BOOL (STDCALL *ChangeIcon)(PCSRSS_CONSOLE Console); } CSRSS_CONSOLE_VTBL, *PCSRSS_CONSOLE_VTBL; typedef struct tagCSRSS_CONSOLE @@ -80,6 +81,7 @@ typedef struct tagCSRSS_CONSOLE BOOL EarlyReturn; /* wake client and return data, even if we are in line buffered mode, and we don't have a complete line */ DWORD HardwareState; /* _GDI_MANAGED, _DIRECT */ HWND hWindow; + HICON hWindowIcon; COORD Size; PVOID PrivateData; PCSRSS_CONSOLE_VTBL Vtbl; @@ -129,6 +131,7 @@ CSR_API(CsrReadConsoleOutput); CSR_API(CsrWriteConsoleInput); CSR_API(CsrHardwareStateProperty); CSR_API(CsrGetConsoleWindow); +CSR_API(CsrSetConsoleIcon); #define ConioInitScreenBuffer(Console, Buff) (Console)->Vtbl->InitScreenBuffer((Console), (Buff)) #define ConioDrawRegion(Console, Region) (Console)->Vtbl->DrawRegion((Console), (Region)) @@ -154,6 +157,7 @@ CSR_API(CsrGetConsoleWindow); Win32CsrLockObject((ProcessData), (Handle), (Object_t **)(Ptr), CONIO_SCREEN_BUFFER_MAGIC) #define ConioUnlockScreenBuffer(Buff) \ Win32CsrUnlockObject((Object_t *) Buff) +#define ConioChangeIcon(Console) (Console)->Vtbl->ChangeIcon(Console) #endif /* CONIO_H_INCLUDED */ diff --git a/reactos/subsys/csrss/win32csr/conio.c b/reactos/subsys/csrss/win32csr/conio.c index 04ae9423b9c..27bfc84b048 100644 --- a/reactos/subsys/csrss/win32csr/conio.c +++ b/reactos/subsys/csrss/win32csr/conio.c @@ -1,4 +1,4 @@ -/* $Id: conio.c,v 1.8 2004/03/07 20:03:43 hbirr Exp $ +/* $Id: conio.c,v 1.9 2004/03/14 17:53:27 weiden Exp $ * * reactos/subsys/csrss/win32csr/conio.c * @@ -2873,4 +2873,31 @@ CSR_API(CsrGetConsoleWindow) return Reply->Status = STATUS_SUCCESS; } +CSR_API(CsrSetConsoleIcon) +{ + PCSRSS_CONSOLE Console; + NTSTATUS Status; + + DPRINT("CsrSetConsoleIcon\n"); + + Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + + Status = ConioLockConsole(ProcessData, + Request->Data.ConsoleSetWindowIconRequest.ConsoleHandle, + &Console); + if (! NT_SUCCESS(Status)) + { + return Reply->Status = Status; + } + + Console->hWindowIcon = Request->Data.ConsoleSetWindowIconRequest.WindowIcon; + Reply->Status = (ConioChangeIcon(Console) ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL); + Reply->Data.ConsoleSetWindowIconReply.WindowIcon = Console->hWindow; + + ConioUnlockConsole(Console); + + return Reply->Status; +} + /* EOF */ diff --git a/reactos/subsys/csrss/win32csr/guiconsole.c b/reactos/subsys/csrss/win32csr/guiconsole.c index 17f72435c89..1d77db93b44 100644 --- a/reactos/subsys/csrss/win32csr/guiconsole.c +++ b/reactos/subsys/csrss/win32csr/guiconsole.c @@ -1,4 +1,4 @@ -/* $Id: guiconsole.c,v 1.11 2004/03/07 21:00:11 hbirr Exp $ +/* $Id: guiconsole.c,v 1.12 2004/03/14 17:53:27 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -717,6 +717,15 @@ GuiChangeTitle(PCSRSS_CONSOLE Console) return TRUE; } +STATIC BOOL STDCALL +GuiChangeIcon(PCSRSS_CONSOLE Console) +{ + SendMessageW(Console->hWindow, WM_SETICON, ICON_BIG, (LPARAM)Console->hWindowIcon); + SendMessageW(Console->hWindow, WM_SETICON, ICON_SMALL, (LPARAM)Console->hWindowIcon); + + return TRUE; +} + static VOID STDCALL GuiCleanupConsole(PCSRSS_CONSOLE Console) { @@ -731,7 +740,8 @@ static CSRSS_CONSOLE_VTBL GuiVtbl = GuiSetCursorInfo, GuiSetScreenInfo, GuiChangeTitle, - GuiCleanupConsole + GuiCleanupConsole, + GuiChangeIcon }; NTSTATUS FASTCALL From 2ce08a79bbb9739b7c2c0f62dc3fa6897d05a98f Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Sun, 14 Mar 2004 18:13:19 +0000 Subject: [PATCH 0503/1463] Fix some prototypes. svn path=/trunk/; revision=8722 --- reactos/include/ddk/psfuncs.h | 70 +++++----- reactos/ntoskrnl/include/internal/ps.h | 24 ++-- reactos/ntoskrnl/include/internal/se.h | 2 +- reactos/ntoskrnl/ps/create.c | 172 +++++++++++++------------ reactos/ntoskrnl/se/semgr.c | 43 ++++--- 5 files changed, 169 insertions(+), 142 deletions(-) diff --git a/reactos/include/ddk/psfuncs.h b/reactos/include/ddk/psfuncs.h index c2e3bc7bc60..222d4464397 100644 --- a/reactos/include/ddk/psfuncs.h +++ b/reactos/include/ddk/psfuncs.h @@ -1,18 +1,21 @@ -/* $Id: psfuncs.h,v 1.27 2003/10/04 18:19:17 navaraf Exp $ +/* $Id: psfuncs.h,v 1.28 2004/03/14 18:10:41 ekohl Exp $ */ #ifndef _INCLUDE_DDK_PSFUNCS_H #define _INCLUDE_DDK_PSFUNCS_H -NTSTATUS STDCALL PsAssignImpersonationToken (struct _ETHREAD* Thread, - HANDLE TokenHandle); +NTSTATUS STDCALL +PsAssignImpersonationToken (IN struct _ETHREAD* Thread, + IN HANDLE TokenHandle); /* * Warning: Even though it returns HANDLE, it's not a real HANDLE but really a * ULONG ProcessId! (Skywing) */ -HANDLE STDCALL PsGetCurrentProcessId(VOID); +HANDLE STDCALL +PsGetCurrentProcessId (VOID); -HANDLE STDCALL PsGetCurrentThreadId(VOID); +HANDLE STDCALL +PsGetCurrentThreadId (VOID); /* * FUNCTION: Creates a thread which executes in kernel mode @@ -30,18 +33,22 @@ HANDLE STDCALL PsGetCurrentThreadId(VOID); * execution * RETURNS: Success or failure status */ -NTSTATUS STDCALL PsCreateSystemThread(PHANDLE ThreadHandle, - ACCESS_MASK DesiredAccess, - POBJECT_ATTRIBUTES ObjectAttributes, - HANDLE ProcessHandle, - PCLIENT_ID ClientId, - PKSTART_ROUTINE StartRoutine, - void *StartContext); -NTSTATUS STDCALL PsTerminateSystemThread(NTSTATUS ExitStatus); +NTSTATUS STDCALL +PsCreateSystemThread (PHANDLE ThreadHandle, + ACCESS_MASK DesiredAccess, + POBJECT_ATTRIBUTES ObjectAttributes, + HANDLE ProcessHandle, + PCLIENT_ID ClientId, + PKSTART_ROUTINE StartRoutine, + void *StartContext); -NTSTATUS STDCALL PsCreateSystemProcess(PHANDLE ProcessHandle, - ACCESS_MASK DesiredAccess, - POBJECT_ATTRIBUTES ObjectAttributes); +NTSTATUS STDCALL +PsTerminateSystemThread (NTSTATUS ExitStatus); + +NTSTATUS STDCALL +PsCreateSystemProcess (PHANDLE ProcessHandle, + ACCESS_MASK DesiredAccess, + POBJECT_ATTRIBUTES ObjectAttributes); NTSTATUS STDCALL PsCreateWin32Process(struct _EPROCESS* Process); NTSTATUS STDCALL PsCreateWin32Thread(struct _ETHREAD* Thread); @@ -57,21 +64,24 @@ PsEstablishWin32Callouts (PW32_PROCESS_CALLBACK W32ProcessCallback, #define PsGetCurrentProcess() IoGetCurrentProcess() #define PsGetCurrentThread() ((struct _ETHREAD*) (KeGetCurrentThread())) -PACCESS_TOKEN STDCALL PsReferenceImpersonationToken(struct _ETHREAD* Thread, - PULONG Unknown1, - PULONG Unknown2, - SECURITY_IMPERSONATION_LEVEL* - Level); -PACCESS_TOKEN STDCALL PsReferencePrimaryToken(struct _EPROCESS* Process); -NTSTATUS STDCALL PsAssignImpersonationToken(struct _ETHREAD* Thread, - HANDLE TokenHandle); +PACCESS_TOKEN STDCALL +PsReferenceImpersonationToken (IN struct _ETHREAD *Thread, + OUT PBOOLEAN CopyOnOpen, + OUT PBOOLEAN EffectiveOnly, + OUT PSECURITY_IMPERSONATION_LEVEL ImpersonationLevel); -VOID STDCALL PsImpersonateClient(struct _ETHREAD* Thread, - PACCESS_TOKEN Token, - UCHAR b, - UCHAR c, - SECURITY_IMPERSONATION_LEVEL Level); -VOID STDCALL PsRevertToSelf(VOID); +PACCESS_TOKEN STDCALL +PsReferencePrimaryToken (struct _EPROCESS* Process); + +VOID STDCALL +PsImpersonateClient (IN struct _ETHREAD* Thread, + IN PACCESS_TOKEN Token, + IN BOOLEAN CopyOnOpen, + IN BOOLEAN EffectiveOnly, + IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel); + +VOID STDCALL +PsRevertToSelf (VOID); BOOLEAN STDCALL PsGetVersion (PULONG MajorVersion OPTIONAL, PULONG MinorVersion OPTIONAL, diff --git a/reactos/ntoskrnl/include/internal/ps.h b/reactos/ntoskrnl/include/internal/ps.h index 0ecf08bc6e8..ad4d3799c80 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.57 2004/01/05 14:28:20 weiden Exp $ +/* $Id: ps.h,v 1.58 2004/03/14 18:11:25 ekohl Exp $ * * FILE: ntoskrnl/ke/kthread.c * PURPOSE: Process manager definitions @@ -163,11 +163,11 @@ typedef struct _KTHREAD #include <poppack.h> /* Top level irp definitions. */ -#define FSRTL_FSP_TOP_LEVEL_IRP (0x01) -#define FSRTL_CACHE_TOP_LEVEL_IRP (0x02) -#define FSRTL_MOD_WRITE_TOP_LEVEL_IRP (0x03) -#define FSRTL_FAST_IO_TOP_LEVEL_IRP (0x04) -#define FSRTL_MAX_TOP_LEVEL_IRP_FLAG (0x04) +#define FSRTL_FSP_TOP_LEVEL_IRP (0x01) +#define FSRTL_CACHE_TOP_LEVEL_IRP (0x02) +#define FSRTL_MOD_WRITE_TOP_LEVEL_IRP (0x03) +#define FSRTL_FAST_IO_TOP_LEVEL_IRP (0x04) +#define FSRTL_MAX_TOP_LEVEL_IRP_FLAG (0x04) typedef struct _TOP_LEVEL_IRP { @@ -177,11 +177,11 @@ typedef struct _TOP_LEVEL_IRP typedef struct { - PACCESS_TOKEN Token; // 0x0 - UCHAR Unknown1; // 0x4 - UCHAR Unknown2; // 0x5 - UCHAR Pad[2]; // 0x6 - SECURITY_IMPERSONATION_LEVEL Level; // 0x8 + PACCESS_TOKEN Token; // 0x0 + BOOLEAN CopyOnOpen; // 0x4 + BOOLEAN EffectiveOnly; // 0x5 + UCHAR Pad[2]; // 0x6 + SECURITY_IMPERSONATION_LEVEL Level; // 0x8 } PS_IMPERSONATION_INFO, *PPS_IMPERSONATION_INFO; #include <pshpack1.h> @@ -226,7 +226,7 @@ typedef struct _ETHREAD UCHAR LpcExitThreadCalled; /* 238/264 */ UCHAR HardErrorsAreDisabled; /* 239/265 */ UCHAR LpcReceivedMsgIdValid; /* 23A/266 */ - UCHAR ActiveImpersonationInfo; /* 23B/267 */ + BOOLEAN ActiveImpersonationInfo; /* 23B/267 */ ULONG PerformanceCountHigh; /* 23C/268 */ /* diff --git a/reactos/ntoskrnl/include/internal/se.h b/reactos/ntoskrnl/include/internal/se.h index a646e21a253..f98ccaacaf8 100644 --- a/reactos/ntoskrnl/include/internal/se.h +++ b/reactos/ntoskrnl/include/internal/se.h @@ -114,7 +114,7 @@ VOID SepInitializeTokenImplementation(VOID); NTSTATUS SepCreateSystemProcessToken(struct _EPROCESS* Process); NTSTATUS SepInitializeNewProcess(struct _EPROCESS* NewProcess, - struct _EPROCESS* ParentProcess); + struct _EPROCESS* ParentProcess); NTSTATUS SeExchangePrimaryToken(struct _EPROCESS* Process, PACCESS_TOKEN NewToken, diff --git a/reactos/ntoskrnl/ps/create.c b/reactos/ntoskrnl/ps/create.c index e2586c43af3..de169fa12cb 100644 --- a/reactos/ntoskrnl/ps/create.c +++ b/reactos/ntoskrnl/ps/create.c @@ -1,4 +1,4 @@ -/* $Id: create.c,v 1.70 2004/01/05 14:28:21 weiden Exp $ +/* $Id: create.c,v 1.71 2004/03/14 18:12:07 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -91,88 +91,93 @@ PsAssignImpersonationToken(PETHREAD Thread, return(STATUS_SUCCESS); } + /* * @implemented */ VOID STDCALL -PsRevertToSelf(VOID) +PsRevertToSelf (VOID) { - PETHREAD Thread; + PETHREAD Thread; - Thread = PsGetCurrentThread(); + Thread = PsGetCurrentThread (); - if (Thread->ActiveImpersonationInfo != 0) - { - ObDereferenceObject(Thread->ImpersonationInfo->Token); - Thread->ActiveImpersonationInfo = 0; - } + if (Thread->ActiveImpersonationInfo == TRUE) + { + ObDereferenceObject (Thread->ImpersonationInfo->Token); + Thread->ActiveImpersonationInfo = FALSE; + } } + /* * @implemented */ VOID STDCALL -PsImpersonateClient(PETHREAD Thread, - PACCESS_TOKEN Token, - UCHAR b, - UCHAR c, - SECURITY_IMPERSONATION_LEVEL Level) +PsImpersonateClient (IN PETHREAD Thread, + IN PACCESS_TOKEN Token, + IN BOOLEAN CopyOnOpen, + IN BOOLEAN EffectiveOnly, + IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel) { - if (Token == 0) - { - if (Thread->ActiveImpersonationInfo != 0) - { - Thread->ActiveImpersonationInfo = 0; - if (Thread->ImpersonationInfo->Token != NULL) - { - ObDereferenceObject(Thread->ImpersonationInfo->Token); - } - } - return; - } - if (Thread->ActiveImpersonationInfo == 0 || - Thread->ImpersonationInfo == NULL) - { - Thread->ImpersonationInfo = ExAllocatePool(NonPagedPool, - sizeof(PS_IMPERSONATION_INFO)); - } - Thread->ImpersonationInfo->Level = Level; - Thread->ImpersonationInfo->Unknown2 = c; - Thread->ImpersonationInfo->Unknown1 = b; - Thread->ImpersonationInfo->Token = Token; - ObReferenceObjectByPointer(Token, + if (Token == NULL) + { + if (Thread->ActiveImpersonationInfo == TRUE) + { + Thread->ActiveImpersonationInfo = FALSE; + if (Thread->ImpersonationInfo->Token != NULL) + { + ObDereferenceObject (Thread->ImpersonationInfo->Token); + } + } + return; + } + + if (Thread->ImpersonationInfo == NULL) + { + Thread->ImpersonationInfo = ExAllocatePool (NonPagedPool, + sizeof(PS_IMPERSONATION_INFO)); + } + + Thread->ImpersonationInfo->Level = ImpersonationLevel; + Thread->ImpersonationInfo->CopyOnOpen = CopyOnOpen; + Thread->ImpersonationInfo->EffectiveOnly = EffectiveOnly; + Thread->ImpersonationInfo->Token = Token; + ObReferenceObjectByPointer (Token, 0, SepTokenObjectType, KernelMode); - Thread->ActiveImpersonationInfo = 1; + Thread->ActiveImpersonationInfo = TRUE; } + PACCESS_TOKEN PsReferenceEffectiveToken(PETHREAD Thread, PTOKEN_TYPE TokenType, - PUCHAR b, + PBOOLEAN EffectiveOnly, PSECURITY_IMPERSONATION_LEVEL Level) { PEPROCESS Process; PACCESS_TOKEN Token; - if (Thread->ActiveImpersonationInfo == 0) + if (Thread->ActiveImpersonationInfo == FALSE) { Process = Thread->ThreadsProcess; *TokenType = TokenPrimary; - *b = 0; + *EffectiveOnly = FALSE; Token = Process->Token; } else { Token = Thread->ImpersonationInfo->Token; *TokenType = TokenImpersonation; - *b = Thread->ImpersonationInfo->Unknown2; - *Level = Thread->ImpersonationInfo->Level; + *EffectiveOnly = Thread->ImpersonationInfo->EffectiveOnly; + *Level = Thread->ImpersonationInfo->Level; } return(Token); } + NTSTATUS STDCALL NtImpersonateThread(IN HANDLE ThreadHandle, IN HANDLE ThreadToImpersonateHandle, @@ -225,11 +230,12 @@ NtImpersonateThread(IN HANDLE ThreadHandle, return(STATUS_SUCCESS); } + NTSTATUS STDCALL -NtOpenThreadToken(IN HANDLE ThreadHandle, - IN ACCESS_MASK DesiredAccess, - IN BOOLEAN OpenAsSelf, - OUT PHANDLE TokenHandle) +NtOpenThreadToken (IN HANDLE ThreadHandle, + IN ACCESS_MASK DesiredAccess, + IN BOOLEAN OpenAsSelf, + OUT PHANDLE TokenHandle) { #if 0 PETHREAD Thread; @@ -250,39 +256,43 @@ NtOpenThreadToken(IN HANDLE ThreadHandle, Token = PsReferencePrimaryToken(Thread->ThreadsProcess); SepCreateImpersonationTokenDacl(Token); #endif - return(STATUS_UNSUCCESSFUL); + return STATUS_NO_TOKEN; } + /* * @implemented */ -PACCESS_TOKEN STDCALL -PsReferenceImpersonationToken(PETHREAD Thread, - PULONG Unknown1, - PULONG Unknown2, - SECURITY_IMPERSONATION_LEVEL* Level) +PACCESS_TOKEN STDCALL +PsReferenceImpersonationToken(IN PETHREAD Thread, + OUT PBOOLEAN CopyOnOpen, + OUT PBOOLEAN EffectiveOnly, + OUT PSECURITY_IMPERSONATION_LEVEL ImpersonationLevel) { - if (Thread->ActiveImpersonationInfo == 0) - { - return(NULL); - } - - *Level = Thread->ImpersonationInfo->Level; - *Unknown1 = Thread->ImpersonationInfo->Unknown1; - *Unknown2 = Thread->ImpersonationInfo->Unknown2; - ObReferenceObjectByPointer(Thread->ImpersonationInfo->Token, + if (Thread->ActiveImpersonationInfo == FALSE) + { + return NULL; + } + + *ImpersonationLevel = Thread->ImpersonationInfo->Level; + *CopyOnOpen = Thread->ImpersonationInfo->CopyOnOpen; + *EffectiveOnly = Thread->ImpersonationInfo->EffectiveOnly; + ObReferenceObjectByPointer (Thread->ImpersonationInfo->Token, TOKEN_ALL_ACCESS, SepTokenObjectType, KernelMode); - return(Thread->ImpersonationInfo->Token); + + return Thread->ImpersonationInfo->Token; } + VOID PiBeforeBeginThread(CONTEXT c) { KeLowerIrql(PASSIVE_LEVEL); } + VOID STDCALL PiDeleteThread(PVOID ObjectBody) { @@ -305,6 +315,7 @@ PiDeleteThread(PVOID ObjectBody) DPRINT("PiDeleteThread() finished\n"); } + NTSTATUS PsInitializeThread(HANDLE ProcessHandle, PETHREAD* ThreadPtr, @@ -529,12 +540,14 @@ PsCreateTeb(HANDLE ProcessHandle, return Status; } + VOID STDCALL LdrInitApcRundownRoutine(PKAPC Apc) { ExFreePool(Apc); } + VOID STDCALL LdrInitApcKernelRoutine(PKAPC Apc, PKNORMAL_ROUTINE* NormalRoutine, @@ -545,6 +558,7 @@ LdrInitApcKernelRoutine(PKAPC Apc, ExFreePool(Apc); } + NTSTATUS STDCALL NtCreateThread(PHANDLE ThreadHandle, ACCESS_MASK DesiredAccess, @@ -700,31 +714,31 @@ PsCreateSystemThread(PHANDLE ThreadHandle, return(STATUS_SUCCESS); } -VOID -STDCALL -PspRunCreateThreadNotifyRoutines -( - PETHREAD CurrentThread, - BOOLEAN Create -) -{ - ULONG i; - CLIENT_ID Cid = CurrentThread->Cid; - for(i = 0; i < PiThreadNotifyRoutineCount; ++ i) - PiThreadNotifyRoutine[i](Cid.UniqueProcess, Cid.UniqueThread, Create); +VOID STDCALL +PspRunCreateThreadNotifyRoutines(PETHREAD CurrentThread, + BOOLEAN Create) +{ + ULONG i; + CLIENT_ID Cid = CurrentThread->Cid; + + for (i = 0; i < PiThreadNotifyRoutineCount; i++) + { + PiThreadNotifyRoutine[i](Cid.UniqueProcess, Cid.UniqueThread, Create); + } } + /* * @implemented */ NTSTATUS STDCALL PsSetCreateThreadNotifyRoutine(IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine) { - if (PiThreadNotifyRoutineCount >= MAX_THREAD_NOTIFY_ROUTINE_COUNT) - { - return(STATUS_INSUFFICIENT_RESOURCES); - } + if (PiThreadNotifyRoutineCount >= MAX_THREAD_NOTIFY_ROUTINE_COUNT) + { + return(STATUS_INSUFFICIENT_RESOURCES); + } PiThreadNotifyRoutine[PiThreadNotifyRoutineCount] = NotifyRoutine; PiThreadNotifyRoutineCount++; diff --git a/reactos/ntoskrnl/se/semgr.c b/reactos/ntoskrnl/se/semgr.c index 5c89762268a..908e693f579 100644 --- a/reactos/ntoskrnl/se/semgr.c +++ b/reactos/ntoskrnl/se/semgr.c @@ -1,4 +1,4 @@ -/* $Id: semgr.c,v 1.28 2003/12/14 17:44:02 hbirr Exp $ +/* $Id: semgr.c,v 1.29 2004/03/14 18:13:19 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -219,33 +219,36 @@ NtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, /* * @implemented */ -VOID STDCALL SeReleaseSubjectContext (PSECURITY_SUBJECT_CONTEXT SubjectContext) +VOID STDCALL +SeReleaseSubjectContext (PSECURITY_SUBJECT_CONTEXT SubjectContext) { - ObDereferenceObject(SubjectContext->PrimaryToken); - if (SubjectContext->ClientToken != NULL) - { - ObDereferenceObject(SubjectContext->ClientToken); - } + ObDereferenceObject (SubjectContext->PrimaryToken); + if (SubjectContext->ClientToken != NULL) + { + ObDereferenceObject (SubjectContext->ClientToken); + } } + /* * @implemented */ -VOID STDCALL SeCaptureSubjectContext (PSECURITY_SUBJECT_CONTEXT SubjectContext) +VOID STDCALL +SeCaptureSubjectContext (PSECURITY_SUBJECT_CONTEXT SubjectContext) { - PEPROCESS Process; - ULONG a; - ULONG b; - - Process = PsGetCurrentThread()->ThreadsProcess; - - SubjectContext->ProcessAuditId = Process; - SubjectContext->ClientToken = - PsReferenceImpersonationToken(PsGetCurrentThread(), - &a, - &b, + PEPROCESS Process; + BOOLEAN CopyOnOpen; + BOOLEAN EffectiveOnly; + + Process = PsGetCurrentThread ()->ThreadsProcess; + + SubjectContext->ProcessAuditId = Process; + SubjectContext->ClientToken = + PsReferenceImpersonationToken (PsGetCurrentThread(), + &CopyOnOpen, + &EffectiveOnly, &SubjectContext->ImpersonationLevel); - SubjectContext->PrimaryToken = PsReferencePrimaryToken(Process); + SubjectContext->PrimaryToken = PsReferencePrimaryToken (Process); } From cc68c2e317f5ae106efd00e5bec9c3a6f1c4d943 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Sun, 14 Mar 2004 18:15:59 +0000 Subject: [PATCH 0504/1463] Implement GetUserProfileDirectoryW(). Open user key in LoadUserProfileW() and close it in UnloadUserProfile(). svn path=/trunk/; revision=8723 --- reactos/lib/userenv/profile.c | 101 ++++++++++++++++++++++++++++++- reactos/lib/userenv/registry.c | 20 +++--- reactos/w32api/include/userenv.h | 41 ++++++++++--- 3 files changed, 140 insertions(+), 22 deletions(-) diff --git a/reactos/lib/userenv/profile.c b/reactos/lib/userenv/profile.c index 564dc9fbdd3..f05d242b4e9 100644 --- a/reactos/lib/userenv/profile.c +++ b/reactos/lib/userenv/profile.c @@ -1,4 +1,4 @@ -/* $Id: profile.c,v 1.6 2004/03/13 20:49:07 ekohl Exp $ +/* $Id: profile.c,v 1.7 2004/03/14 18:15:59 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -506,8 +506,85 @@ GetUserProfileDirectoryW (HANDLE hToken, LPWSTR lpProfileDir, LPDWORD lpcchSize) { - /* FIXME */ + UNICODE_STRING SidString; + WCHAR szKeyName[MAX_PATH]; + WCHAR szRawImagePath[MAX_PATH]; + WCHAR szImagePath[MAX_PATH]; + DWORD dwLength; + HKEY hKey; + + if (!GetUserSidFromToken (hToken, + &SidString)) + { + DPRINT1 ("GetUserSidFromToken() failed\n"); + return FALSE; + } + + DPRINT ("SidString: '%wZ'\n", &SidString); + + wcscpy (szKeyName, + L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList\\"); + wcscat (szKeyName, + SidString.Buffer); + + RtlFreeUnicodeString (&SidString); + + DPRINT ("KeyName: '%S'\n", szKeyName); + + if (RegOpenKeyExW (HKEY_LOCAL_MACHINE, + szKeyName, + 0, + KEY_ALL_ACCESS, + &hKey)) + { + DPRINT1 ("Error: %lu\n", GetLastError()); + return FALSE; + } + + dwLength = MAX_PATH * sizeof(WCHAR); + if (RegQueryValueExW (hKey, + L"ProfileImagePath", + NULL, + NULL, + (LPBYTE)szRawImagePath, + &dwLength)) + { + DPRINT1 ("Error: %lu\n", GetLastError()); + RegCloseKey (hKey); + return FALSE; + } + + RegCloseKey (hKey); + + DPRINT ("RawImagePath: '%S'\n", szRawImagePath); + + /* Expand it */ + if (!ExpandEnvironmentStringsW (szRawImagePath, + szImagePath, + MAX_PATH)) + { + DPRINT1 ("Error: %lu\n", GetLastError()); + return FALSE; + } + + DPRINT ("ImagePath: '%S'\n", szImagePath); + + dwLength = wcslen (szImagePath); + if (dwLength > *lpcchSize) + { + DPRINT1 ("Buffer too small\n"); + SetLastError (ERROR_INSUFFICIENT_BUFFER); + return FALSE; + } + + *lpcchSize = dwLength; + wcscpy (lpProfileDir, + szImagePath); + + return TRUE; +#if 0 return GetDefaultUserProfileDirectoryW (lpProfileDir, lpcchSize); +#endif } @@ -601,6 +678,17 @@ LoadUserProfileW (HANDLE hToken, return FALSE; } + if (RegOpenKeyExW (HKEY_USERS, + SidString.Buffer, + 0, + KEY_ALL_ACCESS, + (PHKEY)&lpProfileInfo->hProfile)) + { + DPRINT1 ("RegOpenKeyExW() failed (Error %ld)\n", GetLastError()); + RtlFreeUnicodeString (&SidString); + return FALSE; + } + RtlFreeUnicodeString (&SidString); DPRINT ("LoadUserProfileW() done\n"); @@ -617,6 +705,15 @@ UnloadUserProfile (HANDLE hToken, DPRINT ("UnloadUserProfile() called\n"); + if (hProfile == NULL) + { + DPRINT1 ("Invalide profile handle\n"); + SetLastError (ERROR_INVALID_PARAMETER); + return FALSE; + } + + RegCloseKey (hProfile); + if (!GetUserSidFromToken (hToken, &SidString)) { diff --git a/reactos/lib/userenv/registry.c b/reactos/lib/userenv/registry.c index 65f9ec99ebe..eaae1263cd2 100644 --- a/reactos/lib/userenv/registry.c +++ b/reactos/lib/userenv/registry.c @@ -1,4 +1,4 @@ -/* $Id: registry.c,v 1.2 2004/02/28 11:30:59 ekohl Exp $ +/* $Id: registry.c,v 1.3 2004/03/14 18:15:59 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -52,7 +52,7 @@ CopyKey (HKEY hDstKey, NULL, NULL)) { - DPRINT1("Error: %lu\n", GetLastError ()); + DPRINT1 ("RegQueryInfoKey() failed (Error %lu)\n", GetLastError ()); return FALSE; } @@ -86,7 +86,7 @@ CopyKey (HKEY hDstKey, NULL, &LastWrite)) { - DPRINT1("Subkey enumeration failed (Error %lu)\n", GetLastError()); + DPRINT ("Subkey enumeration failed (Error %lu)\n", GetLastError()); HeapFree (GetProcessHeap (), 0, lpNameBuffer); @@ -103,7 +103,7 @@ CopyKey (HKEY hDstKey, &hDstSubKey, &dwDisposition)) { - DPRINT1("Subkey creation failed (Error %lu)\n", GetLastError()); + DPRINT ("Subkey creation failed (Error %lu)\n", GetLastError()); HeapFree (GetProcessHeap (), 0, lpNameBuffer); @@ -116,7 +116,7 @@ CopyKey (HKEY hDstKey, KEY_READ, &hSrcSubKey)) { - DPRINT1("Error: %lu\n", GetLastError()); + DPRINT ("Error: %lu\n", GetLastError()); RegCloseKey (hDstSubKey); HeapFree (GetProcessHeap (), 0, @@ -127,7 +127,7 @@ CopyKey (HKEY hDstKey, if (!CopyKey (hDstSubKey, hSrcSubKey)) { - DPRINT1("Error: %lu\n", GetLastError()); + DPRINT ("Error: %lu\n", GetLastError()); RegCloseKey (hSrcSubKey); RegCloseKey (hDstSubKey); HeapFree (GetProcessHeap (), @@ -153,7 +153,7 @@ CopyKey (HKEY hDstKey, dwMaxValueNameLength * sizeof(WCHAR)); if (lpNameBuffer == NULL) { - DPRINT1("Buffer allocation failed\n"); + DPRINT ("Buffer allocation failed\n"); return FALSE; } @@ -162,7 +162,7 @@ CopyKey (HKEY hDstKey, dwMaxValueLength); if (lpDataBuffer == NULL) { - DPRINT1("Buffer allocation failed\n"); + DPRINT ("Buffer allocation failed\n"); HeapFree (GetProcessHeap (), 0, lpNameBuffer); @@ -241,7 +241,7 @@ CreateUserHive (LPCWSTR lpKeyName) KEY_READ, &hDefaultKey)) { - DPRINT1("Error: %lu\n", GetLastError()); + DPRINT1 ("Error: %lu\n", GetLastError()); return FALSE; } @@ -251,7 +251,7 @@ CreateUserHive (LPCWSTR lpKeyName) KEY_ALL_ACCESS, &hUserKey)) { - DPRINT1("Error: %lu\n", GetLastError()); + DPRINT1 ("Error: %lu\n", GetLastError()); RegCloseKey (hDefaultKey); return FALSE; } diff --git a/reactos/w32api/include/userenv.h b/reactos/w32api/include/userenv.h index fad9f813b7c..1998e4c4d37 100644 --- a/reactos/w32api/include/userenv.h +++ b/reactos/w32api/include/userenv.h @@ -1,5 +1,6 @@ #ifndef _USERENV_H #define _USERENV_H + #if __GNUC__ >=3 #pragma GCC system_header #endif @@ -7,9 +8,12 @@ #ifdef __cplusplus extern "C" { #endif + #define PI_NOUI (1) #define PI_APPLYPOLICY (2) -typedef struct _PROFILEINFOA { + +typedef struct _PROFILEINFOA +{ DWORD dwSize; DWORD dwFlags; LPSTR lpUserName; @@ -19,7 +23,9 @@ typedef struct _PROFILEINFOA { LPSTR lpPolicyPath; HANDLE hProfile; } PROFILEINFOA, *LPPROFILEINFOA; -typedef struct _PROFILEINFOW { + +typedef struct _PROFILEINFOW +{ DWORD dwSize; DWORD dwFlags; LPWSTR lpUserName; @@ -29,29 +35,44 @@ typedef struct _PROFILEINFOW { LPWSTR lpPolicyPath; HANDLE hProfile; } PROFILEINFOW, *LPPROFILEINFOW; -BOOL WINAPI LoadUserProfileA(HANDLE,LPPROFILEINFOA); -BOOL WINAPI LoadUserProfileW(HANDLE,LPPROFILEINFOW); -BOOL WINAPI UnloadUserProfile(HANDLE,HANDLE); -BOOL WINAPI GetProfilesDirectoryA(LPSTR,LPDWORD); -BOOL WINAPI GetProfilesDirectoryW(LPWSTR,LPDWORD); -BOOL WINAPI GetUserProfileDirectoryA(HANDLE,LPSTR,LPDWORD); -BOOL WINAPI GetUserProfileDirectoryW(HANDLE,LPWSTR,LPDWORD); -BOOL WINAPI CreateEnvironmentBlock(LPVOID*,HANDLE,BOOL); + +BOOL WINAPI CreateUserProfileW (PSID, LPCWSTR); +BOOL WINAPI LoadUserProfileA(HANDLE, LPPROFILEINFOA); +BOOL WINAPI LoadUserProfileW(HANDLE, LPPROFILEINFOW); +BOOL WINAPI UnloadUserProfile(HANDLE, HANDLE); + +BOOL WINAPI GetAllUsersProfileDirectoryA (LPSTR, LPDWORD); +BOOL WINAPI GetAllUsersProfileDirectoryW (LPWSTR, LPDWORD); +BOOL WINAPI GetDefaultUserProfileDirectoryA (LPSTR, LPDWORD); +BOOL WINAPI GetDefaultUserProfileDirectoryW (LPWSTR, LPDWORD); +BOOL WINAPI GetProfilesDirectoryA(LPSTR, LPDWORD); +BOOL WINAPI GetProfilesDirectoryW(LPWSTR, LPDWORD); +BOOL WINAPI GetUserProfileDirectoryA(HANDLE, LPSTR, LPDWORD); +BOOL WINAPI GetUserProfileDirectoryW(HANDLE, LPWSTR, LPDWORD); + +BOOL WINAPI CreateEnvironmentBlock(LPVOID*, HANDLE, BOOL); BOOL WINAPI DestroyEnvironmentBlock(LPVOID); + #ifdef UNICODE typedef PROFILEINFOW PROFILEINFO; typedef LPPROFILEINFOW LPPROFILEINFO; #define LoadUserProfile LoadUserProfileW +#define GetAllUsersProfileDirectory GetAllUsersProfileDirectoryW +#define GetDefaultUserProfileDirectory GetDefaultUserProfileDirectoryW #define GetProfilesDirectory GetProfilesDirectoryW #define GetUserProfileDirectory GetUserProfileDirectoryW #else typedef PROFILEINFOA PROFILEINFO; typedef LPPROFILEINFOA LPPROFILEINFO; #define LoadUserProfile LoadUserProfileA +#define GetAllUsersProfileDirectory GetAllUsersProfileDirectoryA +#define GetDefaultUserProfileDirectory GetDefaultUserProfileDirectoryA #define GetProfilesDirectory GetProfilesDirectoryA #define GetUserProfileDirectory GetUserProfileDirectoryA #endif + #ifdef __cplusplus } #endif + #endif /* _USERENV_H */ From 9789932e026ab12bfaa0f3f416b6c81c444eb420 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sun, 14 Mar 2004 18:16:40 +0000 Subject: [PATCH 0505/1463] implemented GetProcessIoCounters() svn path=/trunk/; revision=8724 --- reactos/lib/kernel32/misc/stubs.c | 16 +--------------- reactos/lib/kernel32/process/proc.c | 28 +++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/reactos/lib/kernel32/misc/stubs.c b/reactos/lib/kernel32/misc/stubs.c index 53e87b77db5..db38a68e8b4 100644 --- a/reactos/lib/kernel32/misc/stubs.c +++ b/reactos/lib/kernel32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.67 2004/03/14 17:53:26 weiden Exp $ +/* $Id: stubs.c,v 1.68 2004/03/14 18:16:39 weiden Exp $ * * KERNEL32.DLL stubs (unimplemented functions) * Remove from this file, if you implement them. @@ -942,20 +942,6 @@ GetProcessHandleCount( return 0; } -/* - * @unimplemented - */ -BOOL -STDCALL -GetProcessIoCounters( - HANDLE hProcess, - PIO_COUNTERS lpIoCounters - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented */ diff --git a/reactos/lib/kernel32/process/proc.c b/reactos/lib/kernel32/process/proc.c index a8091a8374a..04500dadc8d 100644 --- a/reactos/lib/kernel32/process/proc.c +++ b/reactos/lib/kernel32/process/proc.c @@ -1,4 +1,4 @@ -/* $Id: proc.c,v 1.60 2004/03/14 11:11:17 weiden Exp $ +/* $Id: proc.c,v 1.61 2004/03/14 18:16:40 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -842,4 +842,30 @@ GetProcessVersion (DWORD ProcessId) return (Version); } + +/* + * @implemented + */ +BOOL +STDCALL +GetProcessIoCounters( + HANDLE hProcess, + PIO_COUNTERS lpIoCounters) +{ + NTSTATUS Status; + + Status = NtQueryInformationProcess(hProcess, + ProcessIoCounters, + lpIoCounters, + sizeof(IO_COUNTERS), + NULL); + if (!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return(FALSE); + } + + return TRUE; +} + /* EOF */ From ff4f24bbb643848c7f653f1193d6ac3eecac9094 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Sun, 14 Mar 2004 18:27:08 +0000 Subject: [PATCH 0506/1463] - Removed setting of STATUS_DATA_OVERRUN in IoStatusBlock.Status when IoStatusBlock.Information is greater than the output buffer length passed in by the caller. svn path=/trunk/; revision=8725 --- reactos/ntoskrnl/io/cleanup.c | 1 - 1 file changed, 1 deletion(-) diff --git a/reactos/ntoskrnl/io/cleanup.c b/reactos/ntoskrnl/io/cleanup.c index eb91d2a44cc..bf7858dda0a 100644 --- a/reactos/ntoskrnl/io/cleanup.c +++ b/reactos/ntoskrnl/io/cleanup.c @@ -44,7 +44,6 @@ VOID IoDeviceControlCompletion(PDEVICE_OBJECT DeviceObject, OutputBufferLength = Irp->IoStatus.Information; if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < OutputBufferLength) { - Irp->IoStatus.Status = STATUS_DATA_OVERRUN; OutputBufferLength = IoStack->Parameters.DeviceIoControl.OutputBufferLength; } } From 7c4c3bfb0b70a86cdea0aae2b96be124a3cb4f3b Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Sun, 14 Mar 2004 18:28:59 +0000 Subject: [PATCH 0507/1463] - Fixed bug with recalling previous input. - Switch back to text mode when entering the debugger. svn path=/trunk/; revision=8726 --- reactos/ntoskrnl/dbg/i386/kdb_help.S | 4 ++-- reactos/ntoskrnl/dbg/kdb.c | 17 +++++++++-------- reactos/ntoskrnl/dbg/kdb.h | 4 ++-- reactos/ntoskrnl/dbg/kdb_keyboard.c | 3 ++- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/reactos/ntoskrnl/dbg/i386/kdb_help.S b/reactos/ntoskrnl/dbg/i386/kdb_help.S index 18b58cf3803..2da6570fb36 100644 --- a/reactos/ntoskrnl/dbg/i386/kdb_help.S +++ b/reactos/ntoskrnl/dbg/i386/kdb_help.S @@ -57,8 +57,8 @@ _KdbEnter: pushl $0 /* TempCs */ pushl $0 /* DebugPointer */ pushl $0 /* DebugArgMark */ - pushl $0 /* DebugEip */ - pushl $0 /* DebugEbp */ + pushl _KdbEipTemp /* DebugEip */ + pushl %ebp /* DebugEbp */ /* * Push a pointer to the trap frame diff --git a/reactos/ntoskrnl/dbg/kdb.c b/reactos/ntoskrnl/dbg/kdb.c index 21e0b3235a4..117c5f36110 100644 --- a/reactos/ntoskrnl/dbg/kdb.c +++ b/reactos/ntoskrnl/dbg/kdb.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: kdb.c,v 1.19 2004/03/13 18:21:56 dwelch Exp $ +/* $Id: kdb.c,v 1.20 2004/03/14 18:28:58 dwelch Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/dbg/kdb.c @@ -48,7 +48,6 @@ #define BS 8 #define DEL 127 -#define UPARROW 56 BOOL KbdEchoOn = TRUE; @@ -262,6 +261,7 @@ KdbGetCommand(PCH Buffer) CHAR Key; PCH Orig = Buffer; static UCHAR LastCommand[256] = ""; + ULONG ScanCode = 0; KbdEchoOn = !((KdDebugState & KD_DEBUG_KDNOECHO) != 0); @@ -270,7 +270,7 @@ KdbGetCommand(PCH Buffer) if (KdDebugState & KD_DEBUG_KDSERIAL) while ((Key = KdbTryGetCharSerial()) == -1); else - while ((Key = KdbTryGetCharKeyboard()) == -1); + while ((Key = KdbTryGetCharKeyboard(&ScanCode)) == -1); if (Key == '\r' || Key == '\n') { @@ -302,7 +302,7 @@ KdbGetCommand(PCH Buffer) DbgPrint(" %c", BS); } } - else if (Key == UPARROW) + else if (ScanCode == 72) { ULONG i; while (Buffer > Orig) @@ -673,8 +673,8 @@ DbgStepOver(ULONG Argc, PCH Argv[], PKTRAP_FRAME Tf) { Eip++; } - if (Eip[0] == 0xE8 || Eip[0] == 0x9A || - (Eip[0] == 0xFF && (Eip[0] & 0x3C) == 0x10)) + if (Eip[0] == 0xE8 || Eip[0] == 0x9A || Eip[0] == 0xF2 || Eip[0] == 0xF3 || + (Eip[0] == 0xFF && (Eip[1] & 0x3C) == 0x10)) { ULONG NextInst = Tf->Eip + KdbGetInstLength(Tf->Eip); KdbLastSingleStepFrom = Tf->Eip; @@ -1124,7 +1124,7 @@ DbgBackTraceCommand(ULONG Argc, PCH Argv[], PKTRAP_FRAME Tf) StackBase = (ULONG)&init_stack_top; StackLimit = (ULONG)&init_stack; } - DbgPrintBackTrace((PULONG)Tf->Ebp, StackBase, StackLimit); + DbgPrintBackTrace((PULONG)&Tf->DebugEbp, StackBase, StackLimit); } /* * If there are two arguments and the second begins with a asterik treat it @@ -1535,9 +1535,10 @@ KdbMainLoop(PKTRAP_FRAME Tf) VOID KdbInternalEnter(PKTRAP_FRAME Tf) -{ +{ __asm__ __volatile__ ("cli\n\t"); KbdDisableMouse(); + HalReleaseDisplayOwnership(); (VOID)KdbMainLoop(Tf); KbdEnableMouse(); __asm__ __volatile__("sti\n\t"); diff --git a/reactos/ntoskrnl/dbg/kdb.h b/reactos/ntoskrnl/dbg/kdb.h index 99baf72fab8..9383b078c01 100644 --- a/reactos/ntoskrnl/dbg/kdb.h +++ b/reactos/ntoskrnl/dbg/kdb.h @@ -8,8 +8,8 @@ LdrGetAddressInformation(IN PIMAGE_SYMBOL_INFO SymbolInfo, OUT PCH FileName OPTIONAL, OUT PCH FunctionName OPTIONAL); -ULONG -KdbTryGetCharKeyboard(VOID); +CHAR +KdbTryGetCharKeyboard(PULONG ScanCode); ULONG KdbTryGetCharSerial(VOID); VOID diff --git a/reactos/ntoskrnl/dbg/kdb_keyboard.c b/reactos/ntoskrnl/dbg/kdb_keyboard.c index 32be10e7aa6..75df174d205 100644 --- a/reactos/ntoskrnl/dbg/kdb_keyboard.c +++ b/reactos/ntoskrnl/dbg/kdb_keyboard.c @@ -81,7 +81,7 @@ VOID KbdDisableMouse() } CHAR -KdbTryGetCharKeyboard() +KdbTryGetCharKeyboard(PULONG ScanCode) { static byte_t last_key = 0; static byte_t shift = 0; @@ -105,6 +105,7 @@ KdbTryGetCharKeyboard() //printf("kbd: %d, %d, %c\n", scancode, last_key, keyb_layout[shift][scancode]); last_key = scancode; c = keyb_layout[shift][scancode]; + *ScanCode = scancode; if (c > 0) return c; } } From e52b5b410ef500a931b3f35e10fdafcef81c9591 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Sun, 14 Mar 2004 18:35:02 +0000 Subject: [PATCH 0508/1463] - Map return codes from the miniport's device i/o control routine from win32 error code to ntstatus values. svn path=/trunk/; revision=8727 --- reactos/drivers/video/videoprt/videoprt.c | 24 ++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index 4376834639a..be5b1d55993 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.21 2004/03/13 00:41:40 dwelch Exp $ + * $Id: videoprt.c,v 1.22 2004/03/14 18:35:02 dwelch Exp $ */ #include "videoprt.h" @@ -620,7 +620,6 @@ VideoPortInitialize(IN PVOID Context1, /* Call HwFindAdapter entry point */ /* FIXME: Need to figure out what string to pass as param 3 */ - DPRINT("FindAdapter %X\n", HwInitializationData->HwFindAdapter); Status = HwInitializationData->HwFindAdapter(&DeviceExtension->MiniPortDeviceExtension, Context2, NULL, @@ -1238,7 +1237,26 @@ VidDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject, /* Free the VRP */ ExFreePool(vrp); - DPRINT("- Returned status: %x\n", Irp->IoStatus.Status); + DPRINT("- Returned status: %x/%d\n", Irp->IoStatus.Status, + Irp->IoStatus.Information); + if (Irp->IoStatus.Status != STATUS_SUCCESS) + { + if (Irp->IoStatus.Status != ERROR_MORE_DATA) + { + Irp->IoStatus.Information = 0; + } + /* Map from win32 error codes to ntstatus values. */ + switch (Irp->IoStatus.Status) + { + case ERROR_NOT_ENOUGH_MEMORY: return STATUS_INSUFFICIENT_RESOURCES; + case ERROR_MORE_DATA: return STATUS_BUFFER_OVERFLOW; + case ERROR_INVALID_FUNCTION: return STATUS_NOT_IMPLEMENTED; + case ERROR_INVALID_PARAMETER: return STATUS_INVALID_PARAMETER; + case ERROR_INSUFFICIENT_BUFFER: return STATUS_BUFFER_TOO_SMALL; + case ERROR_DEV_NOT_EXIST: return STATUS_DEVICE_DOES_NOT_EXIST; + case ERROR_IO_PENDING: return STATUS_PENDING; + } + } IoCompleteRequest(Irp, IO_NO_INCREMENT); From 38b3d1087944440824dce4b054630201e3306d44 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Sun, 14 Mar 2004 18:36:14 +0000 Subject: [PATCH 0509/1463] - Map ntstatus values to the win32 error code expected by the display driver. svn path=/trunk/; revision=8728 --- reactos/subsys/win32k/eng/device.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/eng/device.c b/reactos/subsys/win32k/eng/device.c index 959ef145e1e..cb2dafab17f 100644 --- a/reactos/subsys/win32k/eng/device.c +++ b/reactos/subsys/win32k/eng/device.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: device.c,v 1.13 2004/03/11 23:07:16 dwelch Exp $ +/* $Id: device.c,v 1.14 2004/03/14 18:36:14 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -29,6 +29,7 @@ #include <ddk/ntddk.h> #include <win32k/misc.h> +#include <windows.h> #define NDEBUG #include <debug.h> @@ -68,7 +69,8 @@ EngDeviceIoControl(HANDLE hDevice, if (Status == STATUS_PENDING) { - (void) KeWaitForSingleObject(&Event, Executive, KernelMode, TRUE, 0); + (VOID)KeWaitForSingleObject(&Event, Executive, KernelMode, TRUE, 0); + Status = Iosb.Status; } DPRINT("EngDeviceIoControl(): Returning %X/%X\n", Iosb.Status, @@ -76,7 +78,19 @@ EngDeviceIoControl(HANDLE hDevice, /* Return information to the caller about the operation. */ *lpBytesReturned = Iosb.Information; - return Iosb.Status; + + /* Convert NT status values to win32 error codes. */ + switch (Status) + { + case STATUS_INSUFFICIENT_RESOURCES: return ERROR_NOT_ENOUGH_MEMORY; + case STATUS_BUFFER_OVERFLOW: return ERROR_MORE_DATA; + case STATUS_NOT_IMPLEMENTED: return ERROR_INVALID_FUNCTION; + case STATUS_INVALID_PARAMETER: return ERROR_INVALID_PARAMETER; + case STATUS_BUFFER_TOO_SMALL: return ERROR_INSUFFICIENT_BUFFER; + case STATUS_DEVICE_DOES_NOT_EXIST: return ERROR_DEV_NOT_EXIST; + case STATUS_PENDING: return ERROR_IO_PENDING; + } + return Status; } /* EOF */ From 254292d714645037aed27fc239b6cf6aa4f014d5 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 14 Mar 2004 18:51:35 +0000 Subject: [PATCH 0510/1463] resize taskbar buttons on WM_SIZE svn path=/trunk/; revision=8729 --- reactos/subsys/system/explorer/Jamfile | 2 +- reactos/subsys/system/explorer/Makefile | 2 +- reactos/subsys/system/explorer/taskbar/taskbar.cpp | 13 ++++++++++--- reactos/subsys/system/explorer/taskbar/taskbar.h | 1 + .../subsys/system/explorer/taskbar/traynotify.cpp | 2 +- 5 files changed, 14 insertions(+), 6 deletions(-) diff --git a/reactos/subsys/system/explorer/Jamfile b/reactos/subsys/system/explorer/Jamfile index 96bbdf01abd..6aaa45f9215 100644 --- a/reactos/subsys/system/explorer/Jamfile +++ b/reactos/subsys/system/explorer/Jamfile @@ -41,7 +41,7 @@ exe explorer : dialogs/searchprogram.cpp dialogs/settings.cpp i386-stub-win32.c - : <define>WIN32 <define>_WIN32_IE=0x0501 <define>_WIN32_WINNT=0x0501 + : <define>WIN32 <define>_WIN32_IE=0x0600 <define>_WIN32_WINNT=0x0501 <cxxflags>-I$(INCLUDE) #nur f黵 GCC: <cxxflags>-fexceptions <cxxflags>-Wall <find-shared-library>gdi32 diff --git a/reactos/subsys/system/explorer/Makefile b/reactos/subsys/system/explorer/Makefile index 7e835f2710f..b63bfbbbcd1 100644 --- a/reactos/subsys/system/explorer/Makefile +++ b/reactos/subsys/system/explorer/Makefile @@ -43,7 +43,7 @@ ifndef UNICODE UNICODE = 1 endif -CFLAGS = -DWIN32 -D_ROS_ -D_WIN32_IE=0x0501 -D_WIN32_WINNT=0x0501 -fexceptions -Wall -I$(W32API_PATH)/include +CFLAGS = -DWIN32 -D_ROS_ -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -fexceptions -Wall -I$(W32API_PATH)/include RCFLAGS = -DWIN32 -D_ROS_ -D__WINDRES__ --include-dir $(W32API_PATH)/include LFLAGS = -Wl,--subsystem,windows diff --git a/reactos/subsys/system/explorer/taskbar/taskbar.cpp b/reactos/subsys/system/explorer/taskbar/taskbar.cpp index ff015aab44a..c7ce5caa480 100644 --- a/reactos/subsys/system/explorer/taskbar/taskbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/taskbar.cpp @@ -58,6 +58,7 @@ TaskBarMap::~TaskBarMap() TaskBar::TaskBar(HWND hwnd) : super(hwnd) { + _last_btn_width = 0; } TaskBar::~TaskBar() @@ -86,13 +87,14 @@ LRESULT TaskBar::Init(LPCREATESTRUCT pcs) _htoolbar = CreateToolbarEx(_hwnd, WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN| - CCS_TOP|CCS_NODIVIDER | TBSTYLE_LIST|TBSTYLE_TOOLTIPS|TBSTYLE_WRAPABLE, + CCS_TOP|CCS_NODIVIDER | TBSTYLE_LIST|TBSTYLE_TOOLTIPS|TBSTYLE_WRAPABLE,//|TBSTYLE_AUTOSIZE IDW_TASKTOOLBAR, 0, 0, 0, NULL, 0, 0, 0, 16, 16, sizeof(TBBUTTON)); SendMessage(_htoolbar, TB_SETBUTTONWIDTH, 0, MAKELONG(TASKBUTTONWIDTH_MAX,TASKBUTTONWIDTH_MAX)); //SendMessage(_htoolbar, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_MIXEDBUTTONS); //SendMessage(_htoolbar, TB_SETDRAWTEXTFLAGS, DT_CENTER|DT_VCENTER, DT_CENTER|DT_VCENTER); //SetWindowFont(_htoolbar, GetStockFont(ANSI_VAR_FONT), FALSE); + //SendMessage(_htoolbar, TB_SETPADDING, 0, MAKELPARAM(8,8)); _next_id = IDC_FIRST_APP; @@ -110,6 +112,7 @@ LRESULT TaskBar::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) switch(nmsg) { case WM_SIZE: SendMessage(_htoolbar, WM_SIZE, 0, 0); + ResizeButtons(); break; case WM_TIMER: @@ -463,7 +466,11 @@ void TaskBar::ResizeButtons() else if (btn_width > TASKBUTTONWIDTH_MAX) btn_width = TASKBUTTONWIDTH_MAX; - SendMessage(_htoolbar, TB_SETBUTTONWIDTH, 0, MAKELONG(btn_width,btn_width)); - SendMessage(_htoolbar, TB_AUTOSIZE, 0, 0); + if (btn_width != _last_btn_width) { + _last_btn_width = btn_width; + + SendMessage(_htoolbar, TB_SETBUTTONWIDTH, 0, MAKELONG(btn_width,btn_width)); + SendMessage(_htoolbar, TB_AUTOSIZE, 0, 0); + } } } diff --git a/reactos/subsys/system/explorer/taskbar/taskbar.h b/reactos/subsys/system/explorer/taskbar/taskbar.h index 0e66b449b6a..9b8a7cd4c1a 100644 --- a/reactos/subsys/system/explorer/taskbar/taskbar.h +++ b/reactos/subsys/system/explorer/taskbar/taskbar.h @@ -84,6 +84,7 @@ protected: TaskBarMap _map; int _next_id; WindowHandle _last_foreground_wnd; + int _last_btn_width; LRESULT Init(LPCREATESTRUCT pcs); LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index 18edddb1be6..9fa62f65a58 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -108,7 +108,7 @@ NotifyArea::NotifyArea(HWND hwnd) _clock_width = 0; _show_hidden = false; - _tooltip.add(_hwnd, _hwnd); + _tooltip.add(_hwnd, _hwnd); ///@todo use one area for each icon } LRESULT NotifyArea::Init(LPCREATESTRUCT pcs) From ad8ba55cb3f0ff57e6896b31184c61bc4c2d7898 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Sun, 14 Mar 2004 19:25:34 +0000 Subject: [PATCH 0511/1463] - Complete the irp even on an error. svn path=/trunk/; revision=8731 --- reactos/drivers/video/videoprt/videoprt.c | 34 +++++++++++++++++------ 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index be5b1d55993..349f90bb2bb 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.22 2004/03/14 18:35:02 dwelch Exp $ + * $Id: videoprt.c,v 1.23 2004/03/14 19:25:34 dwelch Exp $ */ #include "videoprt.h" @@ -1208,6 +1208,7 @@ VidDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject, PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; PVIDEO_REQUEST_PACKET vrp; BOOLEAN Ret; + NTSTATUS Status; DPRINT("VidDispatchDeviceControl\n"); IrpStack = IoGetCurrentIrpStackLocation(Irp); @@ -1248,19 +1249,34 @@ VidDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject, /* Map from win32 error codes to ntstatus values. */ switch (Irp->IoStatus.Status) { - case ERROR_NOT_ENOUGH_MEMORY: return STATUS_INSUFFICIENT_RESOURCES; - case ERROR_MORE_DATA: return STATUS_BUFFER_OVERFLOW; - case ERROR_INVALID_FUNCTION: return STATUS_NOT_IMPLEMENTED; - case ERROR_INVALID_PARAMETER: return STATUS_INVALID_PARAMETER; - case ERROR_INSUFFICIENT_BUFFER: return STATUS_BUFFER_TOO_SMALL; - case ERROR_DEV_NOT_EXIST: return STATUS_DEVICE_DOES_NOT_EXIST; - case ERROR_IO_PENDING: return STATUS_PENDING; + case ERROR_NOT_ENOUGH_MEMORY: + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + break; + case ERROR_MORE_DATA: + Irp->IoStatus.Status = STATUS_BUFFER_OVERFLOW; + break; + case ERROR_INVALID_FUNCTION: + Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; + break; + case ERROR_INVALID_PARAMETER: + Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; + break; + case ERROR_INSUFFICIENT_BUFFER: + Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; + break; + case ERROR_DEV_NOT_EXIST: + Irp->IoStatus.Status = STATUS_DEVICE_DOES_NOT_EXIST; + break; + case ERROR_IO_PENDING: + Irp->IoStatus.Status = STATUS_PENDING; + break; } } + Status = Irp->IoStatus.Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); - return STATUS_SUCCESS; + return Status; } PVOID STDCALL From 800b2b0dcffe38bc292cd9947d0c1b2c6d8cddc9 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 14 Mar 2004 19:44:02 +0000 Subject: [PATCH 0512/1463] - Set InitData.HwInitDataSize to proper value. svn path=/trunk/; revision=8733 --- reactos/drivers/video/miniport/vga/vgamp.c | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/drivers/video/miniport/vga/vgamp.c b/reactos/drivers/video/miniport/vga/vgamp.c index 8dd9cd116c0..edd5d81b443 100644 --- a/reactos/drivers/video/miniport/vga/vgamp.c +++ b/reactos/drivers/video/miniport/vga/vgamp.c @@ -82,6 +82,7 @@ DriverEntry(IN PVOID Context1, VideoPortZeroMemory(&InitData, sizeof InitData); + InitData.HwInitDataSize = sizeof(InitData); /* FIXME: Fill in InitData members */ InitData.StartingDeviceNumber = 0; From c88c8baba9d76c22c50eeeaa5d73151c2346fa92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Sun, 14 Mar 2004 20:31:55 +0000 Subject: [PATCH 0513/1463] Return a valid (empty) visible region when the window is not visible svn path=/trunk/; revision=8736 --- reactos/subsys/win32k/ntuser/vis.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/vis.c b/reactos/subsys/win32k/ntuser/vis.c index e22433d4877..cb97fe8f918 100644 --- a/reactos/subsys/win32k/ntuser/vis.c +++ b/reactos/subsys/win32k/ntuser/vis.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: vis.c,v 1.22 2004/02/29 17:43:41 navaraf Exp $ + * $Id: vis.c,v 1.23 2004/03/14 20:31:55 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -47,7 +47,7 @@ VIS_ComputeVisibleRegion( if (!(Window->Style & WS_VISIBLE)) { - return NULL; + return NtGdiCreateRectRgn(0, 0, 0, 0); } if (ClientArea) From c53a01dce132724824819a843c6ee5f9b6deb668 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 14 Mar 2004 21:02:55 +0000 Subject: [PATCH 0514/1463] - separate tooltip area for each notify icon - handle non-null terminated tooltip strings svn path=/trunk/; revision=8737 --- .../system/explorer/taskbar/traynotify.cpp | 68 +++++++++++++++---- .../system/explorer/taskbar/traynotify.h | 1 + .../subsys/system/explorer/utility/window.h | 34 +++++++++- 3 files changed, 88 insertions(+), 15 deletions(-) diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index 9fa62f65a58..c032ab48b59 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -61,6 +61,16 @@ NotifyInfo::NotifyInfo() } + // WCHAR versions von NOTIFYICONDATA +#define NID_SIZE_W6 sizeof(NOTIFYICONDATAW) // _WIN32_IE = 0x600 +#define NID_SIZE_W5 (sizeof(NOTIFYICONDATAW)-sizeof(GUID)) // _WIN32_IE = 0x500 +#define NID_SIZE_W3 (sizeof(NOTIFYICONDATAW)-sizeof(GUID)-(128-64)*sizeof(WCHAR)) // _WIN32_IE < 0x500 + + // CHAR versions von NOTIFYICONDATA +#define NID_SIZE_A6 sizeof(NOTIFYICONDATAA) +#define NID_SIZE_A5 (sizeof(NOTIFYICONDATAA)-sizeof(GUID)) +#define NID_SIZE_A3 (sizeof(NOTIFYICONDATAA)-sizeof(GUID)-(128-64)*sizeof(CHAR)) + NotifyInfo& NotifyInfo::operator=(NOTIFYICONDATA* pnid) { _hWnd = pnid->hWnd; @@ -85,16 +95,33 @@ NotifyInfo& NotifyInfo::operator=(NOTIFYICONDATA* pnid) // store tool tip text if (pnid->uFlags & NIF_TIP) - // UNICODE version of NOTIFYICONDATA structure - if (pnid->cbSize == sizeof(NOTIFYICONDATAW) || // _WIN32_IE = 0x600 - pnid->cbSize == sizeof(NOTIFYICONDATAW)-sizeof(GUID) || // _WIN32_IE = 0x500 - pnid->cbSize == sizeof(NOTIFYICONDATAW)-sizeof(GUID)-(128-64)*sizeof(WCHAR))// _WIN32_IE < 0x500 - _tipText = (LPCWSTR)pnid->szTip; - // ANSI version of NOTIFYICONDATA structure - else if (pnid->cbSize == sizeof(NOTIFYICONDATAA) || // _WIN32_IE = 0x600 - pnid->cbSize == sizeof(NOTIFYICONDATAA)-sizeof(GUID) || // _WIN32_IE = 0x500 - pnid->cbSize == sizeof(NOTIFYICONDATAA)-sizeof(GUID)-(128-64)*sizeof(CHAR)) // _WIN32_IE < 0x400 - _tipText = (LPCSTR)pnid->szTip; + if (pnid->cbSize==NID_SIZE_W6 || pnid->cbSize==NID_SIZE_W5 || pnid->cbSize==NID_SIZE_W3) + { // UNICODE version of NOTIFYICONDATA structure + LPCWSTR txt = (LPCWSTR)pnid->szTip; + + // get string length + int max_len = pnid->cbSize==NID_SIZE_W3? 64: 128; + + int l = 0; + for(; l<max_len; ++l) + if (!txt[l]) + break; + + _tipText.assign(txt, l); + } else if (pnid->cbSize==NID_SIZE_A6 || pnid->cbSize==NID_SIZE_A5 || pnid->cbSize==NID_SIZE_A3) + { // ANSI version of NOTIFYICONDATA structure + LPCSTR txt = (LPCSTR)pnid->szTip; + + // get string length + int max_len = pnid->cbSize==NID_SIZE_A3? 64: 128; + + int l = 0; + for(int l=0; l<max_len; ++l) + if (!txt[l]) + break; + + _tipText.assign(txt, l); + } return *this; } @@ -106,9 +133,8 @@ NotifyArea::NotifyArea(HWND hwnd) { _next_idx = 0; _clock_width = 0; + _last_icon_count = 0; _show_hidden = false; - - _tooltip.add(_hwnd, _hwnd); ///@todo use one area for each icon } LRESULT NotifyArea::Init(LPCREATESTRUCT pcs) @@ -349,6 +375,24 @@ void NotifyArea::Refresh() _sorted_icons.insert(entry); } + // sync tooltip areas to current icon number + if (_sorted_icons.size() != _last_icon_count) { + RECT rect = {2, 3, 2+16, 3+16}; + size_t tt_idx = 0; + + for(NotifyIconSet::const_iterator it=_sorted_icons.begin(); it!=_sorted_icons.end(); ++it) { + _tooltip.add(_hwnd, tt_idx++, rect); + + rect.left += NOTIFYICON_DIST; + rect.right += NOTIFYICON_DIST; + } + + while(tt_idx < _last_icon_count) + _tooltip.remove(_hwnd, tt_idx++); + + _last_icon_count = _sorted_icons.size(); + } + SendMessage(GetParent(_hwnd), PM_RESIZE_CHILDREN, 0, 0); InvalidateRect(_hwnd, NULL, FALSE); // refresh icon display diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.h b/reactos/subsys/system/explorer/taskbar/traynotify.h index 522f4e12e4c..d5f780b86c6 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.h +++ b/reactos/subsys/system/explorer/taskbar/traynotify.h @@ -94,6 +94,7 @@ protected: NotifyIconMap _icon_map; NotifyIconSet _sorted_icons; int _next_idx; + size_t _last_icon_count; ToolTip _tooltip; diff --git a/reactos/subsys/system/explorer/utility/window.h b/reactos/subsys/system/explorer/utility/window.h index 02d7b90f13c..8d615ab731e 100644 --- a/reactos/subsys/system/explorer/utility/window.h +++ b/reactos/subsys/system/explorer/utility/window.h @@ -842,15 +842,43 @@ struct ToolTip : public WindowHandle SendMessage(_hwnd, TTM_ACTIVATE, active, 0); } - void add(HWND hparent, HWND htool, LPCTSTR txt=LPSTR_TEXTCALLBACK) + void add(HWND hparent, HWND htool, LPCTSTR txt=LPSTR_TEXTCALLBACK, LPARAM lparam=0) { TOOLINFO ti = { - sizeof(TOOLINFO), TTF_SUBCLASS|TTF_IDISHWND/*|TTF_TRANSPARENT*/, hparent, (UINT)htool, {0,0,0,0}, 0, 0, 0 + sizeof(TOOLINFO), TTF_SUBCLASS|TTF_IDISHWND/*|TTF_TRANSPARENT*/, hparent, (UINT)htool, + {0,0,0,0}, 0, (LPTSTR)txt, lparam }; - ti.lpszText = (LPTSTR) txt; SendMessage(_hwnd, TTM_ADDTOOL, 0, (LPARAM)&ti); } + + void add(HWND hparent, UINT id, const RECT& rect, LPCTSTR txt=LPSTR_TEXTCALLBACK, LPARAM lparam=0) + { + TOOLINFO ti = { + sizeof(TOOLINFO), TTF_SUBCLASS/*|TTF_TRANSPARENT*/, hparent, id, + {rect.left,rect.top,rect.right,rect.bottom}, 0, (LPTSTR)txt, lparam + }; + + SendMessage(_hwnd, TTM_ADDTOOL, 0, (LPARAM)&ti); + } + + void remove(HWND hparent, HWND htool) + { + TOOLINFO ti = { + sizeof(TOOLINFO), TTF_IDISHWND, hparent, (UINT)htool, {0,0,0,0}, 0, 0, 0 + }; + + SendMessage(_hwnd, TTM_DELTOOL, 0, (LPARAM)&ti); + } + + void remove(HWND hparent, UINT id) + { + TOOLINFO ti = { + sizeof(TOOLINFO), 0, hparent, id, {0,0,0,0}, 0, 0, 0 + }; + + SendMessage(_hwnd, TTM_DELTOOL, 0, (LPARAM)&ti); + } }; From b95e68a45d26b0248bc552c33cc64124718b9c42 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 14 Mar 2004 22:20:10 +0000 Subject: [PATCH 0515/1463] handle WM_NOTIFYFORMAT svn path=/trunk/; revision=8738 --- .../system/explorer/taskbar/traynotify.cpp | 17 ++++------ .../subsys/system/explorer/utility/window.cpp | 12 +++++++ .../subsys/system/explorer/utility/window.h | 32 +++++++++++++++---- 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index c032ab48b59..a40cae1fe9f 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -95,24 +95,20 @@ NotifyInfo& NotifyInfo::operator=(NOTIFYICONDATA* pnid) // store tool tip text if (pnid->uFlags & NIF_TIP) - if (pnid->cbSize==NID_SIZE_W6 || pnid->cbSize==NID_SIZE_W5 || pnid->cbSize==NID_SIZE_W3) - { // UNICODE version of NOTIFYICONDATA structure + if (pnid->cbSize==NID_SIZE_W6 || pnid->cbSize==NID_SIZE_W5 || pnid->cbSize==NID_SIZE_W3) { + // UNICODE version of NOTIFYICONDATA structure LPCWSTR txt = (LPCWSTR)pnid->szTip; - - // get string length int max_len = pnid->cbSize==NID_SIZE_W3? 64: 128; + // get tooltip string length int l = 0; for(; l<max_len; ++l) if (!txt[l]) break; _tipText.assign(txt, l); - } else if (pnid->cbSize==NID_SIZE_A6 || pnid->cbSize==NID_SIZE_A5 || pnid->cbSize==NID_SIZE_A3) - { // ANSI version of NOTIFYICONDATA structure + } else if (pnid->cbSize==NID_SIZE_A6 || pnid->cbSize==NID_SIZE_A5 || pnid->cbSize==NID_SIZE_A3) { LPCSTR txt = (LPCSTR)pnid->szTip; - - // get string length int max_len = pnid->cbSize==NID_SIZE_A3? 64: 128; int l = 0; @@ -378,9 +374,10 @@ void NotifyArea::Refresh() // sync tooltip areas to current icon number if (_sorted_icons.size() != _last_icon_count) { RECT rect = {2, 3, 2+16, 3+16}; - size_t tt_idx = 0; + size_t icon_cnt = _sorted_icons.size(); - for(NotifyIconSet::const_iterator it=_sorted_icons.begin(); it!=_sorted_icons.end(); ++it) { + size_t tt_idx = 0; + while(tt_idx < icon_cnt) { _tooltip.add(_hwnd, tt_idx++, rect); rect.left += NOTIFYICON_DIST; diff --git a/reactos/subsys/system/explorer/utility/window.cpp b/reactos/subsys/system/explorer/utility/window.cpp index 793414709a6..8769ebf9758 100644 --- a/reactos/subsys/system/explorer/utility/window.cpp +++ b/reactos/subsys/system/explorer/utility/window.cpp @@ -259,6 +259,9 @@ LRESULT CALLBACK Window::WindowWndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPAR case WM_NOTIFY: return pThis->Notify(wparam, (NMHDR*)lparam); + case WM_NOTIFYFORMAT: + return NFR_CURRENT; + case WM_CREATE: return pThis->Init((LPCREATESTRUCT)lparam); @@ -331,6 +334,9 @@ LRESULT CALLBACK SubclassedWindow::SubclassedWndProc(HWND hwnd, UINT nmsg, WPARA case WM_NOTIFY: return pThis->Notify(wparam, (NMHDR*)lparam); + case WM_NOTIFYFORMAT: + return NFR_CURRENT; + case WM_CREATE: return pThis->Init((LPCREATESTRUCT)lparam); @@ -677,6 +683,9 @@ INT_PTR CALLBACK Window::DialogProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM pThis->Notify(wparam, (NMHDR*)lparam); return TRUE; // message has been processed + case WM_NOTIFYFORMAT: + return NFR_CURRENT; + case WM_NCDESTROY: delete pThis; return TRUE; // message has been processed @@ -1355,6 +1364,9 @@ INT_PTR CALLBACK PropSheetPageDlg::DialogProc(HWND hwnd, UINT nmsg, WPARAM wpara pThis->Notify(wparam, (NMHDR*)lparam); return TRUE; // message has been processed + case WM_NOTIFYFORMAT: + return NFR_CURRENT; + case WM_NCDESTROY: delete pThis; return TRUE; // message has been processed diff --git a/reactos/subsys/system/explorer/utility/window.h b/reactos/subsys/system/explorer/utility/window.h index 8d615ab731e..2113f65ebfe 100644 --- a/reactos/subsys/system/explorer/utility/window.h +++ b/reactos/subsys/system/explorer/utility/window.h @@ -138,6 +138,12 @@ protected: static WindowSet s_dialogs; }; +#ifdef UNICODE +#define NFR_CURRENT NFR_UNICODE +#else +#define NFR_CURRENT NFR_ANSI +#endif + #ifdef _MSC_VER template<typename CLASS> struct GetWindowHelper @@ -845,27 +851,40 @@ struct ToolTip : public WindowHandle void add(HWND hparent, HWND htool, LPCTSTR txt=LPSTR_TEXTCALLBACK, LPARAM lparam=0) { TOOLINFO ti = { - sizeof(TOOLINFO), TTF_SUBCLASS|TTF_IDISHWND/*|TTF_TRANSPARENT*/, hparent, (UINT)htool, + sizeof(TOOLINFO), TTF_SUBCLASS|TTF_IDISHWND|TTF_TRANSPARENT, hparent, (UINT)htool, {0,0,0,0}, 0, (LPTSTR)txt, lparam }; - SendMessage(_hwnd, TTM_ADDTOOL, 0, (LPARAM)&ti); +#ifdef UNICODE ///@todo Why is it neccesary to try both TTM_ADDTOOLW and TTM_ADDTOOLW ?! + if (!SendMessage(_hwnd, TTM_ADDTOOLW, 0, (LPARAM)&ti)) + SendMessage(_hwnd, TTM_ADDTOOLA, 0, (LPARAM)&ti); +#else + if (!SendMessage(_hwnd, TTM_ADDTOOLA, 0, (LPARAM)&ti)) + SendMessage(_hwnd, TTM_ADDTOOLW, 0, (LPARAM)&ti); +#endif } void add(HWND hparent, UINT id, const RECT& rect, LPCTSTR txt=LPSTR_TEXTCALLBACK, LPARAM lparam=0) { TOOLINFO ti = { - sizeof(TOOLINFO), TTF_SUBCLASS/*|TTF_TRANSPARENT*/, hparent, id, + sizeof(TOOLINFO), TTF_SUBCLASS|TTF_TRANSPARENT, hparent, id, {rect.left,rect.top,rect.right,rect.bottom}, 0, (LPTSTR)txt, lparam }; - SendMessage(_hwnd, TTM_ADDTOOL, 0, (LPARAM)&ti); +#ifdef UNICODE + if (!SendMessage(_hwnd, TTM_ADDTOOLW, 0, (LPARAM)&ti)) + SendMessage(_hwnd, TTM_ADDTOOLA, 0, (LPARAM)&ti); +#else + if (!SendMessage(_hwnd, TTM_ADDTOOLA, 0, (LPARAM)&ti)) + SendMessage(_hwnd, TTM_ADDTOOLW, 0, (LPARAM)&ti); +#endif } void remove(HWND hparent, HWND htool) { TOOLINFO ti = { - sizeof(TOOLINFO), TTF_IDISHWND, hparent, (UINT)htool, {0,0,0,0}, 0, 0, 0 + sizeof(TOOLINFO), TTF_IDISHWND, hparent, (UINT)htool, + {0,0,0,0}, 0, 0, 0 }; SendMessage(_hwnd, TTM_DELTOOL, 0, (LPARAM)&ti); @@ -874,7 +893,8 @@ struct ToolTip : public WindowHandle void remove(HWND hparent, UINT id) { TOOLINFO ti = { - sizeof(TOOLINFO), 0, hparent, id, {0,0,0,0}, 0, 0, 0 + sizeof(TOOLINFO), 0, hparent, id, + {0,0,0,0}, 0, 0, 0 }; SendMessage(_hwnd, TTM_DELTOOL, 0, (LPARAM)&ti); From 14f61e5720ce76ff8f16c84559be10fd2f26c003 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 14 Mar 2004 22:27:44 +0000 Subject: [PATCH 0516/1463] UNICODE fix for Tooltips svn path=/trunk/; revision=8739 --- reactos/subsys/system/explorer/utility/window.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/system/explorer/utility/window.cpp b/reactos/subsys/system/explorer/utility/window.cpp index 8769ebf9758..55a5f28d350 100644 --- a/reactos/subsys/system/explorer/utility/window.cpp +++ b/reactos/subsys/system/explorer/utility/window.cpp @@ -684,7 +684,8 @@ INT_PTR CALLBACK Window::DialogProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM return TRUE; // message has been processed case WM_NOTIFYFORMAT: - return NFR_CURRENT; + SetWindowLong(hwnd, DWLP_MSGRESULT, NFR_CURRENT); // set return value NFR_CURRENT + return TRUE; // message has been processed case WM_NCDESTROY: delete pThis; @@ -1365,7 +1366,8 @@ INT_PTR CALLBACK PropSheetPageDlg::DialogProc(HWND hwnd, UINT nmsg, WPARAM wpara return TRUE; // message has been processed case WM_NOTIFYFORMAT: - return NFR_CURRENT; + SetWindowLong(hwnd, DWLP_MSGRESULT, NFR_CURRENT); // set return value NFR_CURRENT + return TRUE; // message has been processed case WM_NCDESTROY: delete pThis; From 296ea7d29320f11061428862a2758efd2af84be0 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 14 Mar 2004 22:44:08 +0000 Subject: [PATCH 0517/1463] handle large notification strings svn path=/trunk/; revision=8741 --- reactos/subsys/system/explorer/taskbar/traynotify.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index a40cae1fe9f..6c0c372b73b 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -287,8 +287,7 @@ int NotifyArea::Notify(int id, NMHDR* pnmh) if (found != _sorted_icons.end()) { NotifyInfo& entry = const_cast<NotifyInfo&>(*found); // Why does GCC 3.3 need this additional const_cast ?! - if (!entry._tipText.empty()) - _tcscpy(pdi->szText, entry._tipText); + pdi->lpszText = (LPTSTR)entry._tipText.c_str(); } } From 639ab68e9a8cdc5ce25f5ae2652fab7b2c433538 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Sun, 14 Mar 2004 23:04:44 +0000 Subject: [PATCH 0518/1463] Fix mask for true color images svn path=/trunk/; revision=8742 --- reactos/subsys/system/explorer/res/logoff.ico | Bin 9062 -> 7782 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/reactos/subsys/system/explorer/res/logoff.ico b/reactos/subsys/system/explorer/res/logoff.ico index 8436c6abe9614acee08f14f4395bc6f701a6f0ba..a10592b738c5c4d625c827e979d67800a583b195 100644 GIT binary patch literal 7782 zcmeHMZETZO6h4EEeY6|vI_bxz`v50Xf|QCfMF&$*ru>iu6PEa^S>rzmjp4^)W^~yP zvlubUq)pL8(?u3%q*|iHwnSk{tnZ78qlr5GLuND)Gk#2i@%o(mwr}sc(QbkX#@*c8 z`*F^Bo^#K=?|JtEQ3;h&Z7s?2R2k7OjGCK``CAo4?_kZ8uOxb+Mv+^I5;mgsP-h4> zD<K$hDKR>8oSAp_M~H&lqSW#F+q8cuNC#dxOpis9<c~z?z_Bs%CzEtAnj}{+MP4+D zq{tQJK1~!&)4F4)sS|5nUW;BNO3sisd6C-C@5h>-TQWrlPMoHL=zEiC^sr3{vZA%2 zb*5(M>5nz)Po?N!Dvdr(`?2mv>xb+h`oo70(~%=b=;+a-^uoKxX>4qa-uvJ~djG?d zl!TA3CO)Sj;J$(WqvR=i1$aT=B|rI$V(8yI_a(h^ev;n(?t2>f?q?cG3kqIDn?VzT z;y?Wg_h%@AadKvcqF9ge7%hc%;rBn3ATAG=Bk<pjfLO3>Ldgm4zP;<gUAuSQmsz>1 zy`kyWj&0i>y4P56t}Wl*)&1yW_wSVRjV+Gq_1hopestUJjl8g-`KFrIJ9g}P_<=_@ z$hmEewZu}k>gKN7jQPqnEe?BC+m6mkIp4UVrgn9`%YBQxLfVVmT;hw;to%-6zPZlO zZ@kBti_Pn9Y1*=7t2Z+((h>dHN%Y%lq94nRb_zK)zh!0Ivo2DBY@BDC(YB+RdA1aj zY~dW6$+KRspS*rQ?b)-3_U+q8evA(tI)t?##zExYAaX0lXh>Qz&-yvnB5!%oI9GaQ zK141>KR7r@BO@d9^09F`e*C!1b3v?g9y@d944plDmOj^Xn5XEAbLZ%*Z@!`P=g(6* zou-M&OEft>Epys$SFoAovK)cs2>fdiD3XM(pSY>fX_ltedAO}kd%e2>rLCdC?Q-TT zv^whDQVa!@hCBs`>+9_`7Fiq)*SfYj3a!pMh%NOD&&B0xTc;|tR@c?lS4n;;ztsU9 z#f3&&U0v;pdg%fy+y=S3F}H^`EH4KKyT}TVH{6tyud><ds>{KVRj@$5Dkm?q*=*KI zfMglizAPs%Wx3UA%L2gvHg~Bax3avtqTFIxQC?D3VTT`fMZU6<0jjI2?QV<9<*>s` zw`HYbUkLzPU2S!FmBsF2>jsBKu`jIzITYZa-OlIacGy*UStS&p!3tdLHFk?d@qZP> ztF6|`Dij=1jhz*g{jXWbUWs4hLiSBL|JPQ{=XWUQ*Xo?lub#hXa^(B3nuDm>G1q@b zj@%eEJ8G5vJM+atsQ16IX}<hMSb45Q{`v41QU9Mroxc+`U29_;-~kudjGtHLeh)fj zp4*PUbFOD;-_YK(zh_Q;vd6Q@vmgi7!zU;D^x5!b5f%d9TQSt>+3`;&=9>U{=;VY? z7rulRNKEzVT3FX2Ur(aOf4LM-Oh7?pfe$T-*$#cSdo(`utpG(_2u+B|D`Nb@Bv_!J z>UZtzs?dceG3^OyJ-T2Mkud=U9P8TArRuYXIz9}iX;f>`ML-wfY2HHo@@(vfsn}(a zw}tlg?G&A&#H=%<bvzphMB_a#g#*tI2ND{5>(i%LK`FeQPz?HpR~@68FA)#uQ(zhX z;Zk61Ja4}pTRSKefipBZ<&0{csMZtJe5i>j{vD05f>QSG+gn(F@8f$Fb?SMtr{lHp ztKknsV|np}ZQt_)En^e&{Ry0y7<h3=1vkfig9A8U_>3bS%2aLWD$1tS^&Rkonf(^X z{{~oSUif>!c+Q@)USA*o=V-BLtav>Uiznj$AW-p>ae(`D4ap{qDsmP1BQs@@1~n)z zi30k=W8)d*x!?veD9nnLB~h5*oF=(yz7T3SufhRT_&;&s61Wyg0X0-l2H5})^G32U zG2J!>z(>UxEQW32Krwho1HM7wf!iG9tK#F+6}vFGU|tj-3ERN;=$fb3XGDo9vMlNr zX0HeZpQBV5e|ThgE`HdIm5Gm7sT4VUAqEBq3gZW!3GfTY*a8C8%lL&UaPFD-2*KtB zi?7#b;PY=tqfj`*B~N_8D5?IldBMUj9O-`+9~7EFkvj<GE}8cSTL3$o7cBCH#(*Y1 zu9FW@>doALoHz$<lMk+99Z!dOE*KZZ@7~jG#KffF>lz9(i-bb74WAJfUdiqSED*7I z!6N++8!<5`<oSX^p0)85%V$dU94t&13K#W1hcCmfP?)!fHzI5HiO?lDr;+0Ld;xH0 zxXP2wvKY72yr{-m%U_wDBslPk-XFfeCb*uZ;P~e%<78@fFY<J-SoHq$^Lq{c7kz#? zfn0<CMe`4mKSGhCSW5hHg^J>j%lw}?+$F{z;6?HAaDW1yEcO1tWbtp|48@}TUlO?S zd>a&a#VquQ8SmxH+Zi!gyyt52FygtGU)5@Pd_zTG&gc2R_wNDy^1mq-`1gRn0ix0{ Av;Y7A literal 9062 zcmeHMUu=_A6hC7dW9v57cC2eRSs5^JE(}&tr|33tC=3!FKtl$PG`vX`5@Ixt$RIN= z(eW^83^7rf0P19&3KO>y`6r<w8o)ka;tODWK(Z%{#Ov>zuiw|(kLub1iJ0Bw<lgU| z|L5NC^gE|SIh03bWrUe>w&oM9BqG1xcs@9TXb^h_-cMWeh+Zl+@qRi8zA+ckLhxWo zV1pbm@qj>U@H+9_(j6uWF+`~OgHLE<Ux>Et>Zdi~C<Vh|+IHwL1*1{wibTm9ictVS z;TU-%JjaP5ahiAN6t!S4z<ZHvMA2~yM6XdD=8f13GDKsv?aNctg?URfjv2f$Ma6(R zKuc_#Uisz%b;n}V6^mnz(?;wE0o}lLVeaqmr+xeO(f<AWY1fe<I(+yr4Idk!&quzZ zC~SOh>^${B?uVGaj-H^skQaiy=*e&C3(Ox~{DB59U7;gaf2M(}zfoUYQRo_A9H119 z{(2MUk5d@y==eBAupi+yAO`s9_8(RVrxsHYc-SML(vHO#NyHQN%U7&i)&5Lk=kZ6Y zYUVdDTlW0Z#zy7bg4X4$JJvkgF3*eRcuE$wu2|i%Y}F#(Xz<S}t$nO*<qOZf*dWi& zisBqc{`5zdFEE~SE9Q9IMRjd0h4Q>;T4~wLa<6Z;Z-(%z<g>_Ec_zNmcy4kT^wm!q z&#GzO?3$%Zp9&-%Czy!tv=H5zN%TvB0Vi^a>|o+}W?G~I0nW32Kr6t?v&hNT(DG~` z5TrmbNNd-wr41W4P!Q`KJ9c0%gmnn{H-y}ZH2_IV@@$ZEE%H_Xz_~IY`4G7j^PW9> zXkcJ~-aYgw4Gj%Ro(o~0^VsRrr|I0eb9DZ~_h66FcNZ_xkC!jgrAwD69*@(RE5Fl~ z8#g4U-TD*GOpU1sOhw><MPPy?bpOyb)s@z$sl7{XZKb>1SA|hmRps+m+6ihs<vu}! z0HexA0Cah|yVN1W<MGa`OChMObOG%sXYo9|-nw}@L2Zf4RbC|e1wY>d8qI`ir^{6~ ztz1lCf(5|)s*^rcFunjf*hD4(zG_wyKi%ncl@vgSN#Fo}dJ>=SbUKR*A;i?c{P{_I z9^;FPou&ZTU+2ry@WqTTnNi?yOe@IApW%ibZVjJX$O1}=O58q&*Xwb^N}nTF<1d5& zr>m@_pvd9&GIy27q4DPxLOBRvpxe#o<ny?7e10JaK*0n&+@)@ZL$iN6&@+pR3yUyt zM5S&f(EP7R$FIe&Ivsya(*C(cckB0P=T}>Kw|@QnRgK4Pzs?Rteow0Xo}_YP<@c0n z{#V-3O6m8%y5?^De_>~5j(k4+Mbv$VsO2_M&AkH4fjr2CY?f~usr8^=@?5L_o$`P( zUt?qA;?B;_?SLK~Hf`Fpy{V~b@xQ5EvSi7keaFsRNA0IjpDBFTDAZ*N^_W79rUuWR zz0Nf0WI%6yA9(Sdq)>M%)S3!)r9v&JPy-5})>9*+C$BTDT?TA@8MUiIO{!1_E7XZ% zLln9pQlSo1s3XM=rnU38x3~A8u2rak73yV$I@XW@UQ-6!!M?P$we{Hf@d4f=A7>F1 zr{S1FeXLObD%7eH1JtGpHLOB?s)W`ipuWDo2X#3Yu?jW2LXEFbzbn-C3bj4rfmnbS zHMSC38-GJXLl61^!f*P4`W~^2!j8Duf%;jYH=u;p#^2oB4F0g#jvj$RuRx(UpwJ6Y z=mkJd+?c~*CA2pF_3PJf&y;`Nx^>%Z?9{n=a|e1E6Y56~LE-#5?EL)v+OFO2psxWL z>Fq}^L%rGiR&P39bMN(@-Fvr;oxh2GhulH*CKSWl*z4`>eaoc#zs#xikYC)|$&IL~ z@z6ye5{VoDi~>|9aP;WW(Xp|y1NXzx<HwJ`&pLz1*PO$V!X*FmZ-5EdvetqJE%Pw% zz1YC~sHu~B)9BW1U^`6UeYRm_WMon{=(^>%3xXvEa1ecgw7|A9@NXOHda-3PaR5&r z^P$Hez8m@zda-Bv%(LmQKC^xX-eWsh7R$`^ESQ#mD_Os31NtG!bAVja23@bYMn6O1 zU_P@gS?V9<-&|8adM*n68Y>pY9s6e+&_}W9m%A{UssHHZNRv5Lf5?hOy7$2J)tvbr zm}`y|dPEsFchHM6n%rg#_$-2ke)BvgvVrfYu3uzk7y$IcEdBEB1O4cUrNqS24<+gD zg57_SnW294<kIM88vu!z81DphYx>RiLBIbT1Evv~+2~K`O8Sp8z#jU8au#L|;Cm@& z6TtoCI|@AK3EeJ!&PG4_l2*J$KkR4U<(<Sih#d(XY=`MD$6R!4?<d>AG$J!A|8d@6 zw)8`e@jfK%;5b08#6fJ~--lGc`8>oX&}HMl(1J(wr?nxOmsn>KwEF;i&3Lel+31(M zD*81WG&_=cLC??nnsar+F36D>@jI2_kaso3|HR#A8?euD*Fof)dQ80>7jq3<Ht)aW zKk&#qFFF(Y`5s#LKtBWBcV4IJX8W?qfB3B!P0<Z`)?I)s-FNE_V&8~EBJMUDAoH^f z!%z5T!0+Gv^PlfwHot#^!^86XZ~1(W{zG?G`Z-P?9~qKwFUtnL2a`B|_I<M7frF7@ z!-h%v&$@AzZ)AGz>F7)w_!}e}|2gLH`_*(Zv)#jgN(TU=06xbFAwhdzzW=keb&7r} I0@+01Z=nH7_W%F@ From c6476093e10160b4662a17c356c5dd319db11167 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Mon, 15 Mar 2004 00:03:31 +0000 Subject: [PATCH 0519/1463] - Fixed whole page allocations since the handle table code now relies on allocations being eight byte aligned. svn path=/trunk/; revision=8743 --- reactos/ntoskrnl/mm/npool.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/mm/npool.c b/reactos/ntoskrnl/mm/npool.c index 4e4d651e04e..9c6e564ed0f 100644 --- a/reactos/ntoskrnl/mm/npool.c +++ b/reactos/ntoskrnl/mm/npool.c @@ -1,4 +1,4 @@ -/* $Id: npool.c,v 1.82 2004/03/04 00:07:01 navaraf Exp $ +/* $Id: npool.c,v 1.83 2004/03/15 00:03:31 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -35,7 +35,7 @@ * end of the range so any accesses beyond the end of block are to invalid * memory locations. */ -/*#define WHOLE_PAGE_ALLOCATIONS*/ +#define WHOLE_PAGE_ALLOCATIONS #ifdef ENABLE_VALIDATE_POOL #define VALIDATE_POOL validate_kernel_pool() @@ -1678,6 +1678,7 @@ ExAllocateWholePageBlock(ULONG Size) } MiCurrentNonPagedPoolLength = max(MiCurrentNonPagedPoolLength, (Base + NrPages) * PAGE_SIZE); + Size = (Size + 7) & ~7; return((PVOID)((PUCHAR)Address + (NrPages * PAGE_SIZE) - Size)); } From b57b6bb7969349cfcc3c6eb9ca002b02b32b0efd Mon Sep 17 00:00:00 2001 From: Royce Mitchell III <royce3@ev1.net> Date: Mon, 15 Mar 2004 04:21:17 +0000 Subject: [PATCH 0520/1463] mark GetPixel as @implemented and fix param names svn path=/trunk/; revision=8744 --- reactos/lib/gdi32/objects/bitblt.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/reactos/lib/gdi32/objects/bitblt.c b/reactos/lib/gdi32/objects/bitblt.c index 2c5bffd6be6..93db1e0e3be 100644 --- a/reactos/lib/gdi32/objects/bitblt.c +++ b/reactos/lib/gdi32/objects/bitblt.c @@ -1,4 +1,4 @@ -/* $Id: bitblt.c,v 1.17 2004/02/14 00:31:39 sedwards Exp $ +/* $Id: bitblt.c,v 1.18 2004/03/15 04:21:17 royce Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -349,17 +349,13 @@ SetPixel(HDC hDC, /* - * @unimplemented + * @implemented */ COLORREF STDCALL -GetPixel( - HDC a0, - int a1, - int a2 - ) +GetPixel(HDC hDC, int X, int Y) { - return NtGdiGetPixel(a0, a1, a2); + return NtGdiGetPixel(hDC, X, Y); } From 94683a56821d001ca1913577089276d709b37346 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Mon, 15 Mar 2004 17:32:47 +0000 Subject: [PATCH 0521/1463] - Changed ctype.h from mingw to ntoskrnl its own. svn path=/trunk/; revision=8746 --- reactos/ntoskrnl/dbg/kdb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/dbg/kdb.c b/reactos/ntoskrnl/dbg/kdb.c index 117c5f36110..a34af18ee19 100644 --- a/reactos/ntoskrnl/dbg/kdb.c +++ b/reactos/ntoskrnl/dbg/kdb.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: kdb.c,v 1.20 2004/03/14 18:28:58 dwelch Exp $ +/* $Id: kdb.c,v 1.21 2004/03/15 17:32:47 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/dbg/kdb.c @@ -28,7 +28,7 @@ /* INCLUDES ******************************************************************/ -#include <ctype.h> +#include <internal/ctype.h> #include <ddk/ntddk.h> #include <internal/ke.h> #include <internal/ps.h> From 60a43e438d764d1ff4dcf56230b3aef0a6fb0c13 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Mon, 15 Mar 2004 19:06:35 +0000 Subject: [PATCH 0522/1463] - Fix reading past the end of the pool block. svn path=/trunk/; revision=8747 --- reactos/subsys/win32k/ntuser/keyboard.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/keyboard.c b/reactos/subsys/win32k/ntuser/keyboard.c index 70eb19588a5..b919e8a4f43 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.26 2004/03/11 16:17:25 weiden Exp $ +/* $Id: keyboard.c,v 1.27 2004/03/15 19:06:35 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -541,9 +541,10 @@ void InitKbdLayout( PVOID *pkKeyboardLayout ) { RtlFreeUnicodeString(&LayoutFile); - KeyboardLayoutWSTR = ExAllocatePoolWithTag(PagedPool, - (FullLayoutPath.Length + 1) * - sizeof(WCHAR), TAG_STRING); + KeyboardLayoutWSTR = + ExAllocatePoolWithTag(PagedPool, + FullLayoutPath.Length + sizeof(WCHAR), + TAG_STRING); if( !KeyboardLayoutWSTR ) { DPRINT1("Couldn't allocate a string for the keyboard layout name.\n"); @@ -551,8 +552,8 @@ void InitKbdLayout( PVOID *pkKeyboardLayout ) { return; } memcpy(KeyboardLayoutWSTR,FullLayoutPath.Buffer, - (FullLayoutPath.Length + 1) * sizeof(WCHAR)); - KeyboardLayoutWSTR[FullLayoutPath.Length] = 0; + FullLayoutPath.Length + sizeof(WCHAR)); + KeyboardLayoutWSTR[FullLayoutPath.Length / sizeof(WCHAR)] = 0; kbModule = EngLoadImage(KeyboardLayoutWSTR); DPRINT( "Load Keyboard Layout: %S\n", KeyboardLayoutWSTR ); From 41562afcd3d754c79cab01ad4b7daa1b11dbf6f8 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Mon, 15 Mar 2004 20:21:51 +0000 Subject: [PATCH 0523/1463] - Minor corrections to emulated mouse pointer handling. svn path=/trunk/; revision=8749 --- reactos/subsys/win32k/eng/mouse.c | 15 +++-------- reactos/subsys/win32k/objects/cursoricon.c | 30 ++++++++++++++-------- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/reactos/subsys/win32k/eng/mouse.c b/reactos/subsys/win32k/eng/mouse.c index 4b8ee94375a..b6de75051a3 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.63 2004/03/05 09:02:41 hbirr Exp $ +/* $Id: mouse.c,v 1.64 2004/03/15 20:21:50 navaraf Exp $ * * PROJECT: ReactOS kernel * PURPOSE: Mouse @@ -282,7 +282,8 @@ MouseMoveCursor(LONG X, LONG Y) { ExAcquireFastMutex(&CurInfo->CursorMutex); IntLockGDIDriver(SurfGDI); - SurfGDI->MovePointer(SurfObj, CurInfo->x, CurInfo->y, &PointerRect); + if (SurfGDI->MovePointer != NULL) + SurfGDI->MovePointer(SurfObj, CurInfo->x, CurInfo->y, &PointerRect); IntUnLockGDIDriver(SurfGDI); SetPointerRect(CurInfo, &PointerRect); ExReleaseFastMutex(&CurInfo->CursorMutex); @@ -849,14 +850,6 @@ EngMovePointer( IN RECTL *prcl) { GDIDEVICE *ppdev = (GDIDEVICE *)pso->hdev; - PSURFGDI SurfGDI = AccessInternalObjectFromUserObject(pso); - - /* - * Prevent GDI from trying to remve the mouse cursor, - * because it would cause unexpected reentrancy effects. - */ - - SurfGDI->PointerStatus = SPS_ACCEPT_NOEXCLUDE; IntHideMousePointer(ppdev, pso); ppdev->PointerAttributes.Column = x - ppdev->PointerHotSpot.x; @@ -873,8 +866,6 @@ EngMovePointer( prcl->right = prcl->left + ppdev->PointerAttributes.Width; prcl->bottom = prcl->top + ppdev->PointerAttributes.Height; } - - SurfGDI->PointerStatus = SPS_ACCEPT_EXCLUDE; } /* EOF */ diff --git a/reactos/subsys/win32k/objects/cursoricon.c b/reactos/subsys/win32k/objects/cursoricon.c index 6d8e4c0ad70..fd8c54e2034 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.50 2004/02/27 10:08:21 weiden Exp $ */ +/* $Id: cursoricon.c,v 1.51 2004/03/15 20:21:51 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -146,7 +146,8 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, { /* Remove the cursor if it was displayed */ IntLockGDIDriver(SurfGDI); - SurfGDI->MovePointer(SurfObj, -1, -1, &PointerRect); + if (SurfGDI->MovePointer != NULL) + SurfGDI->MovePointer(SurfObj, -1, -1, &PointerRect); IntUnLockGDIDriver(SurfGDI); SetPointerRect(CurInfo, &PointerRect); } @@ -219,15 +220,22 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, CurInfo->CurrentCursorObject = NULL; } - IntLockGDIDriver(SurfGDI); - SurfGDI->PointerStatus = SurfGDI->SetPointerShape(SurfObj, soMask, soColor, XlateObj, - NewCursor->IconInfo.xHotspot, - NewCursor->IconInfo.yHotspot, - CurInfo->x, - CurInfo->y, - &PointerRect, - SPS_CHANGE); - IntUnLockGDIDriver(SurfGDI); + if (SurfGDI->SetPointerShape != NULL) + { + IntLockGDIDriver(SurfGDI); + SurfGDI->PointerStatus = SurfGDI->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; + } if(SurfGDI->PointerStatus == SPS_DECLINE) { From fda8c77b11f697e5c345e5e649877a1c08d940ec Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Mon, 15 Mar 2004 20:45:41 +0000 Subject: [PATCH 0524/1463] implementation of volume control tray icon svn path=/trunk/; revision=8750 --- .../subsys/system/explorer/doxy-footer.html | 2 +- reactos/subsys/system/explorer/explorer.dsp | 4 + .../subsys/system/explorer/explorer_intres.h | 13 +- .../subsys/system/explorer/explorer_intres.rc | 15 +++ .../subsys/system/explorer/res/speaker.ico | Bin 0 -> 8038 bytes .../system/explorer/taskbar/desktopbar.cpp | 47 ++++++- .../system/explorer/taskbar/desktopbar.h | 16 ++- .../system/explorer/taskbar/quicklaunch.cpp | 2 +- .../system/explorer/taskbar/traynotify.cpp | 6 + .../subsys/system/explorer/utility/window.h | 118 ++++++++++++++++++ 10 files changed, 208 insertions(+), 15 deletions(-) create mode 100644 reactos/subsys/system/explorer/res/speaker.ico diff --git a/reactos/subsys/system/explorer/doxy-footer.html b/reactos/subsys/system/explorer/doxy-footer.html index 80bbe8b234f..76e430b17cf 100644 --- a/reactos/subsys/system/explorer/doxy-footer.html +++ b/reactos/subsys/system/explorer/doxy-footer.html @@ -3,7 +3,7 @@ <tr> <td><address style="align: right;"><small> ROS Explorer Source Code Documentation -<br>generated on 14.03.2004 by <a href="http://www.doxygen.org/index.html"> +<br>generated on 15.03.2004 by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border=0> </small></address> </td> diff --git a/reactos/subsys/system/explorer/explorer.dsp b/reactos/subsys/system/explorer/explorer.dsp index ac14eb38bb0..4d603e52c1b 100644 --- a/reactos/subsys/system/explorer/explorer.dsp +++ b/reactos/subsys/system/explorer/explorer.dsp @@ -494,6 +494,10 @@ SOURCE=.\res\search.ico # End Source File # Begin Source File +SOURCE=.\res\speaker.ico +# End Source File +# Begin Source File + SOURCE=.\res\startmenu.ico # End Source File # Begin Source File diff --git a/reactos/subsys/system/explorer/explorer_intres.h b/reactos/subsys/system/explorer/explorer_intres.h index 7613ac5e9df..dc2d3dc7078 100644 --- a/reactos/subsys/system/explorer/explorer_intres.h +++ b/reactos/subsys/system/explorer/explorer_intres.h @@ -36,6 +36,7 @@ #define IDS_STARTMENU 32 #define IDS_MINIMIZE_ALL 33 #define IDS_DESKTOP_NUM 34 +#define IDS_VOLUME 35 #define IDI_REACTOS 100 #define IDI_EXPLORER 101 #define IDI_STARTMENU 102 @@ -75,6 +76,7 @@ #define IDI_NETWORK 148 #define IDI_COMPUTER 149 #define IDM_DESKTOPBAR 150 +#define IDM_VOLUME 151 #define IDD_DESKBAR_TASKBAR 153 #define IDB_ICON_ALIGN_0 153 #define IDD_DESKBAR_STARTMENU 154 @@ -87,6 +89,7 @@ #define IDB_ICON_ALIGN_7 160 #define IDB_ICON_ALIGN_8 161 #define IDB_ICON_ALIGN_9 162 +#define IDI_SPEAKER 162 #define IDB_ICON_ALIGN_10 163 #define IDB_LOGOV16 164 #define ID_VIEW_NAME 401 @@ -137,9 +140,11 @@ #define ID_STOP 40009 #define ID_MINIMIZE_ALL 40010 #define ID_EXPLORE 40011 -#define ID_SWITCH_DESKTOP_1 50000 #define ID_TASKMGR 40012 -#define ID_BROWSE_UP 40013 +#define ID_BROWSE_UP 40013 +#define ID_TRAY_VOLUME 40014 +#define ID_VOLUME_PROPERTIES 40015 +#define ID_SWITCH_DESKTOP_1 50000 #define ID_WINDOW_NEW 0xE130 #define ID_WINDOW_ARRANGE 0xE131 #define ID_WINDOW_CASCADE 0xE132 @@ -156,8 +161,8 @@ // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 161 -#define _APS_NEXT_COMMAND_VALUE 40014 +#define _APS_NEXT_RESOURCE_VALUE 163 +#define _APS_NEXT_COMMAND_VALUE 40016 #define _APS_NEXT_CONTROL_VALUE 1003 #define _APS_NEXT_SYMED_VALUE 101 #endif diff --git a/reactos/subsys/system/explorer/explorer_intres.rc b/reactos/subsys/system/explorer/explorer_intres.rc index e012fe87cf6..6cabee94679 100644 --- a/reactos/subsys/system/explorer/explorer_intres.rc +++ b/reactos/subsys/system/explorer/explorer_intres.rc @@ -132,6 +132,7 @@ BEGIN IDS_STARTMENU "Startmenu" IDS_MINIMIZE_ALL "mimimize all windows" IDS_DESKTOP_NUM "Desktop %d" + IDS_VOLUME "Volume" END #endif // Romanian resources @@ -443,6 +444,7 @@ IDI_SEARCH_DOC ICON DISCARDABLE "res/search-doc.ico" IDI_PRINTER ICON DISCARDABLE "res/printer.ico" IDI_NETWORK ICON DISCARDABLE "res/network.ico" IDI_COMPUTER ICON DISCARDABLE "res/computer.ico" +IDI_SPEAKER ICON DISCARDABLE "res/speaker.ico" ///////////////////////////////////////////////////////////////////////////// // @@ -513,6 +515,7 @@ BEGIN IDS_STARTMENU "Startmenu" IDS_MINIMIZE_ALL "alle Fenster minimieren" IDS_DESKTOP_NUM "Desktop %d" + IDS_VOLUME "Lautst鋜ke" END #endif // German (Germany) resources @@ -685,6 +688,15 @@ BEGIN END END +IDM_VOLUME MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Open Volume Control", ID_TRAY_VOLUME + MENUITEM "Adjust Audio Properties", ID_VOLUME_PROPERTIES + END +END + ///////////////////////////////////////////////////////////////////////////// // @@ -862,6 +874,7 @@ BEGIN IDS_STARTMENU "Startmenu" IDS_MINIMIZE_ALL "mimimize all windows" IDS_DESKTOP_NUM "Desktop %d" + IDS_VOLUME "Volume" END #endif // English (U.S.) resources @@ -988,6 +1001,7 @@ BEGIN IDS_STARTMENU "Startmenu" IDS_MINIMIZE_ALL "mimimize all windows" IDS_DESKTOP_NUM "Bureau %d" + IDS_VOLUME "Volume" END #endif // French (France) resources @@ -1190,6 +1204,7 @@ BEGIN IDS_STARTMENU "Startmenu" IDS_MINIMIZE_ALL "mimimize all windows" IDS_DESKTOP_NUM "Desktop %d" + IDS_VOLUME "Volume" END #endif // Portuguese (Portugal) resources diff --git a/reactos/subsys/system/explorer/res/speaker.ico b/reactos/subsys/system/explorer/res/speaker.ico new file mode 100644 index 0000000000000000000000000000000000000000..d7f7cc496ee4786fc2ffdef609da41f8472858fe GIT binary patch literal 8038 zcmcJU2~d?s62}`w@!(bv6$MWa1-v-K1LP7!Jir4L6c5B31@&pXQ1QMGTojD=Mq|9t zN>WM6ka$!sb5(Y;mD*Gpx00+Wvz0ZHGP}sPznSNIyoW%Hshz5M-+c4U^vrbkbpN}b zh=VwaySwNzyNO65E$h3Z$OZcR{mtLcG!yY|Ve{@Ra?MjDP|cyLVGhC|RUFKZ+Q0q# z_m{A+FbNM2mxzc688Bdg3>-L61`Qe{g9i_mAwz~pbab@D#Kg$Zp+hA$HdYc65+o@p zNk)tqAtOhQlu@Hb$>`CeWz3i{lAfL}W5<q_apT5GMn;BAnlwo!Po6B9nVB+W$`qM8 zb*f}%XUnu{(`5Se=`v%+44FA|rsU@4%Iw**WzL*AGI#D=nKy5q<mKhb;>C+4KR;iV zELkGUmMs&L$t25{FP9fyctKXKTq&zot&%ls*2vnmYo)NTP}Z$mC+pX*mkk>>NKsLd zY}~j}Hf`D@TefVGty{OsjvYH>*REZ1;J^VXE-sdX2M<a~Nr@afbVy1|OQo!=OirCT zC8tlHmNRG0$SbeBB3G|omABu1TPi9l<lT4Qm76zj%B@?s<h}RallR|$Uq1NY1Nrd7 z59Q;JKbB8F{Zu~x{B!x{n{VWYAAXPr4<5*)M~|ecs!9yQkbeF8si$!!{#VnY)s?2G zZIvb^V^tBaT=FT_BKnZ;8817@?d_GO<*k}X#GXo%`Y?p?dcgnT=ZV_MGFdKi|MA*( zjYLLx7fUw#sPZb-`@Y()SQ1z}kZ<Z7cmGytT3uRcI`FDeuqN`bO|cY;dxaYJ)0Y33 zw)j?>)HvJymzIBTdX3SLkW-9PGkvJ4xVJ5qSaVYzKH<faS3$k?90vz@!2Xs!`Oui> z8fn)^?Nb%?<eJE}E8m+&K=0($?@g`E`d^{GtD@E}R1L}w_OSL|iY$+HR--CZUm<<A zV=4lQ<woU2-4`E~nOBgrd{IvRl7h_qoM|(b<P~HVES+Akg2#%2B{>T+`8q!@KPR8h z^exJnHZLbXq$PASsG|mcVY<V<`th83v(j|--`4%9rOk!)A5C|5P<o-t`;1X-#V@5N zs;GBW)%(LI^c3HlC*3o>?tV}6UCs0UAw|^rE%Y)NV_Vw$b@aA*ZyV6T&&Q$*^alk_ z$Ov=mWEtTWI3_c5f{&|ycXe{~?=^Aq<VoRK>fOV|(YsgFkg*vV!}NQjcCA8!d-?Vq zH$J(k`rddz_rX2;ghY%^Pgcy3ro(zC^axK(9Fv~ZT)lfmMi1;6kuowZJzfb=q)lsQ z-+rlSX=4VN<wsYG(BbK6Bl?>~&3oIfF{8#Lbh9Xsh)dki*n}rmPtoY&8JFPIQMD|^ z&84$y8g3%h(5Xg&s;GCU6?IhAufD6Q$1}&+UE9w3o2grbV}AS1UuS3M7TDOW*v4<E zKVoCgH)+zuZoBmn@$vC#gq_}ot*pYX8rW0=n_C?k8hXsZ!9jDlzPYNuRjXD#v8@lV zvj+Ccz+M^HPa`og@j<g@&7$g=t0dvb9$kC)?tMwk#RjS?u8X3>9*owlTW?_;9IGkN zbo27^+SaaJyO%n4?D!`3|1mb*z(yL_M_sX%2KL+V^YeR;nd-`0i?_G83I9`#pEB?< zhMJ3QH?ZdhwpZ_8odMfz^z7O5+s2I>x3x@WzmER?{<rW&2ENL`hZy)0O#{9g_z(lz zZD6|%Y`%d%{E_)uPZSMTSJ&n}di3}!{=~pP8Tb(cpJd>FG%fs%fj=<t1A0Dk`4{uM zTGn@@1Ox=!RC~j38Tc6k-=@!szcEx*d{p!CJ4RGgl$zhgGG9I0wrx9~^&jKA4E&j1 zU#*L8GVn<Ten`*9j~V!xd(8K>o!`89^JegVPPcB|*0Gn%ocl3;)4-?cxoW=J1Afv7 z3=I5A$=G(jZ5vuHy?XV!fgd*Tk9u7-A0KJphYi*_!}tbo1Nt`spZ^#?Y~WAz+KMk= zfd6tY#@Vh{SDP`e$mw%@w}Brw@Z*}V=;dFUHf`!r*PPmY$hCiRa`Ih8L#>T&+;7>k zWnArX4ZVAMdUo^m_1)2>OP90oB?>)PuEScC&9K;yJKUa%C$*5LrCRzP(PtT}<{8vL zDEU)ks8&2z4`<PF>C~x{bne_)*pGDW+EtLZbno6>khuf}1qpJK;NV~h2?-Hwg}^WA z)2EO0?b}!5liHXtGBQ%*LUhs&8`j2!adB}HA0MyrAvQ#Y4I3u#R)!BBE-5J~8ZV}% zrrKe~w6ruk%s77hc$qL^g2s*$Cr-4(k6Bq+4PwZgoE(`oYgV0Da{m1JvS7giS-5ba z#+8c}EwW<Ef`S5#FPAP|YKJjbtXN@(Ggq%({Y+SM^XAP~yt!@LHrc*?yT+Y6cka~K zbNBAuvS-g8*}HeI?Ay0b_V3?sheZz`KCE%*kt0Xs=+UEc?AS3me*CzcIB`Nwo;+!X zPtTq`E9cIg(>V3~`SWt&!Uef_@uFP5d|ArN%jL?ID;mGP`s%Cl+H0@L>#x5qZ@lq_ zy!qyv^442#$+c_Otl0LQciz$X_WJefa^uF0dU5VYAAKaZZ{OB<_mfXP(U|wM&py+* z_lqySkT1XdQojEBYmI^L-n}c|efOQ*yLV6H;rsXR%g;amEDs+(l*-CV`Q?{i<kw$+ z)%f`F<Hu56U9E94{sC>TDHc3;EWm{u@^op&eb`L5dN#8g;lNv@yakr5pk4we)yAdk z?j<ubQWHG`eN`3CilIl<y0DbOS%3dWvfMd2QsZESm)yTf5jA)5M{)WYSmmtg1fIC4 zv7>T^s?QDU@K45BFqS|4YF-Ra-KX|%bH6ohx|AJIZGWnR{-t3vjyL-f6CN4f&%Vp{ zEj%SDIzB0EfNh^mJ3K2kG$gcNbnihnoi)wS?37-?p~1m@!UJkLYg&VnvU`Rt+PNk% zI5Z%%rrX-;K4(y$^%u*_Pb3F-w->b@GB9dJP~IgpxO`tkpl6tMnx)~HF>J_5^||~) zPOyi+rQ7m!_s{LWP)~<Il((%LYv<X@+r=X>Gh%P~<x7<EKacfuindG?7iYiLE?yxM zQj<@ff93qk=gysfd0~)aU(5F%&ARt=_6&=i7(ab`>daGTUwY}x*;V0ARu*`;_37Z* zXGF@x*r_o=-SbX!Ur%iu($aduCjPO00VBtc8y`O@YCw2m$<ZT6j&DkEZ)2hF(0@`u zWagBt(eaaqB_<BrTv}36x+%4_m*xAFl*PT{a&vQ160^ppjY%&mD=8@}N^4{N?l69H zLgK=_1&N7Mr{vC`s^*uiPxrBYcTC+iJ$ZpCKQ<wI-m1d<9fwOwjueinq3;p4d-?RV zH7^W}o3do*o}%JIB_%Je7~x?>*P$*2TTN4Eu8kj>x$@w#{kYtcvi#vK{Ve+vZ~t+r z!@JBHJz!GdwtatM`k{k!lA89gewUz5ox8brP6(U0vh1Lmet1__OrwaJ@4DscHz0Fv z8M9e_Rd!z;JlG9!3C+&j$>CUj_UtaU@-+|h>zt9h_^A54W$GN)PIhzE%V4*}rI}k_ zEIC{{qad|$9U9&`XwkB)t)&O%&t27(IN_->(0OEGLDt-9b2m(Ktn-d_Y&*AT_0p9^ z%Y1BuD;qjq?Q_>{+>qZzM?N<F)@H{R!EuqUbuDfg642f^#L`yr_y#aIk7`+KR8b#E zw5~sipP}j<@v9PXdqn-|8LAqm#;bXHzJ-p3u3AHzYX{c7ZrI}#AHA_cI|N^|*WcL! z`je#sM38p^h7;ZVP6G7~2e1)y0S7<_B%;8cG(dqaE-v-XdFBrwL6T&|Go-hOSV)fX zOL)XW03k5yGgGQ#V53HjK)(b8Y@Q8+q#({O1r$Y~qw;!xpb%cd3h0yHBaH{b1}uOz z2sc@RwGao;_xV;}^Q0Py+z49PEs#Y;fVu!5Kxr%iZX}F*KKh7{keDcm1SRnW(85gI z{0qV%A&F>!yvXSHE<s=f#s&_8DoJ31b!>^#2GIcgI09jqhsQGoBGx^?83H}9G$AGk z7;so?^VTD9K%hAhwRLWt4JRij#vn~%vNmnn&|p^xkx(BdsNfHaQC-a{)<O@U4g5>E z-JwH=2Cf@A3{)eMU?kc|I6-udo)Z_7T0o942aE^Q;}_ru?xUF791ZCZsj$O3cTOjH z1i}_H0VQM=LK9Sx+eEz1RRw7SWLb!imCOU+5}ZjP3qYGVnp;5RL!ekEea^+{2z}5% z65J4{K~&C#f<CJh6%`Rwut_$676E2Cj=8WL*c#~*N!4d72*6<uqJ$Lu;l2=R5d9N0 z^UMB;z7ZmEIQv8*1km7UAT<RbO<YZ?0Tm@kt#kkMlP5t*paXH@BV<ZO0E0s;1AQWK zR20e-8Uz90c2=R#fIh54Y7NkbKX3y-N<yDl9i610+jK&cg-{amD5PS@sDQ@E!<gyQ z;FV8Y^ZMw+H~0f9*cc~;ASwZ$35wK?=gouv9ETMNm1x`UANm*#79}dJk3Lt)*VmUb zk|9A=&_*Z|NfBTn5mv;w5s0BDgidr45E0v$_m2qZB*oJJf1uBuLLtd|5S+0D=fy&j z%pneiU2L8p4zo#U1vf}?kl!)WC)orxMA^8E_34jU|G86SCJ5ZvIZQy+Nl+nNmO$Jj zl*l`gwjyFPQ?~M-6Oo>4KtG|+)kDOnC^`wF7*FI*z>5B$mgp5sAYQ~^k{PmYo(79z zy>Sp^7wWrTW~IfzA|Q&pyStm48yw>gB$yB1xMl1gQ9{jj^GE@ap<UcQG8zroho|oa z%W)~VZtNfa5Nt!=x^pY@5jxT*)zH3u`v&aW)AZ?K39Jep5DF}Te682Y%6x)-3e5aX z`&{P|%z{g}7?hvehgq=lhvN{*qY3bz)D4WSlS0Ft<hZbVTrm<190Bb@Az1>>a~Aw2 zDu+J6$>&2UTn(-^mJ`@O{sK|51eD2Ba+eVb{3ky|3b5gQHt>~OgGa!kqN41UB_K;a zm|wCVs4kubNi{&>H$Nc-{tSg6mzPWnyh2@Rb0W;nbAuo2y6~3U$N#KInam9ig`IP4 zQ5!G-FvB|Xxf|Rad?=V1G=fFKN1!ucfIrBYTKfUyv}n-+b^+9p3(~JO!1k3GMa2!# y#3<3kCw{vAM4X}O9dpb<?BPU=qU#-=^;OFl#=996=J}eAZLFf!vBoOvjQ;^jWk8Ss literal 0 HcmV?d00001 diff --git a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp index 613b72a51d8..6cf7bc0fd6b 100644 --- a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp @@ -44,8 +44,7 @@ DesktopBar::DesktopBar(HWND hwnd) : super(hwnd), - // initialize Common Controls library - WM_TASKBARCREATED(RegisterWindowMessage(WINMSG_TASKBARCREATED)) + _trayIcon(hwnd, ID_TRAY_VOLUME) { SystemParametersInfo(SPI_GETWORKAREA, 0, &_work_area_org, 0); } @@ -239,6 +238,13 @@ LRESULT DesktopBar::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) return SendMessage(_hwndTaskBar, nmsg, wparam, lparam); break; + case WM_TIMER: + if (wparam == ID_TRAY_VOLUME) { + KillTimer(_hwnd, wparam); + WinExec("sndvol32.exe -t", SW_SHOWNORMAL); // launch volume control in small mode + } + break; + default: def: return super::WndProc(nmsg, wparam, lparam); } @@ -312,10 +318,14 @@ int DesktopBar::Command(int id, int code) g_Globals._desktops.SwitchToDesktop(desktop_idx); - if (_hwndQuickLaunch) + if (_hwndQuickLaunch) PostMessage(_hwndQuickLaunch, PM_UPDATE_DESKTOP, desktop_idx, 0); break;} + case ID_TRAY_VOLUME: + WinExec("sndvol32.exe", SW_SHOWNORMAL); + break; + default: if (_hwndQuickLaunch) return SendMessage(_hwndQuickLaunch, WM_COMMAND, MAKEWPARAM(id,code), 0); @@ -357,3 +367,34 @@ LRESULT DesktopBar::ProcessCopyData(COPYDATASTRUCT* pcd) return FALSE; } + + +void DesktopBar::AddTrayIcons() +{ + _trayIcon.Add(SmallIcon(IDI_SPEAKER), ResString(IDS_VOLUME)); +} + +void DesktopBar::TrayClick(UINT id, int btn) +{ + switch(id) { + case ID_TRAY_VOLUME: + if (btn == TRAYBUTTON_LEFT) + SetTimer(_hwnd, ID_TRAY_VOLUME, 500, NULL); // wait a bit to correctly handle double clicks + else { + PopupMenu menu(IDM_VOLUME); + SetMenuDefaultItem(menu, 0, MF_BYPOSITION); + menu.TrackPopupMenuAtPos(_hwnd, GetMessagePos()); + } + break; + } +} + +void DesktopBar::TrayDblClick(UINT id, int btn) +{ + switch(id) { + case ID_TRAY_VOLUME: + KillTimer(_hwnd, ID_TRAY_VOLUME); // finish one-click timer + WinExec("sndvol32.exe", SW_SHOWNORMAL); + break; + } +} diff --git a/reactos/subsys/system/explorer/taskbar/desktopbar.h b/reactos/subsys/system/explorer/taskbar/desktopbar.h index db51b550808..9deb6ae39f7 100644 --- a/reactos/subsys/system/explorer/taskbar/desktopbar.h +++ b/reactos/subsys/system/explorer/taskbar/desktopbar.h @@ -30,9 +30,6 @@ #define TITLE_EXPLORERBAR TEXT("") // use an empty window title, so windows taskmanager does not show the window in its application list -#define WINMSG_TASKBARCREATED TEXT("TaskbarCreated") - - #define DESKTOPBARBAR_HEIGHT 29 @@ -64,9 +61,11 @@ /// desktop bar window, also known as "system tray" -struct DesktopBar : public OwnerDrawParent<Window> +struct DesktopBar : public TrayIconControllerTemplate< + OwnerDrawParent<Window> > { - typedef OwnerDrawParent<Window> super; + typedef TrayIconControllerTemplate< + OwnerDrawParent<Window> > super; DesktopBar(HWND hwnd); ~DesktopBar(); @@ -76,7 +75,6 @@ struct DesktopBar : public OwnerDrawParent<Window> protected: CommonControlInit _usingCmnCtrl; - int WM_TASKBARCREATED; RECT _work_area_org; int _taskbar_pos; @@ -96,4 +94,10 @@ protected: WindowHandle _hwndrebar; struct StartMenuRoot* _startMenuRoot; + + TrayIcon _trayIcon; + + void AddTrayIcons(); + virtual void TrayClick(UINT id, int btn); + virtual void TrayDblClick(UINT id, int btn); }; diff --git a/reactos/subsys/system/explorer/taskbar/quicklaunch.cpp b/reactos/subsys/system/explorer/taskbar/quicklaunch.cpp index eb11c642d0b..dfeb11de6a5 100644 --- a/reactos/subsys/system/explorer/taskbar/quicklaunch.cpp +++ b/reactos/subsys/system/explorer/taskbar/quicklaunch.cpp @@ -253,7 +253,7 @@ int QuickLaunchBar::Command(int id, int code) } } - return 1; + return 0; // Don't return 1 to avoid recursion with DesktopBar::Command() } int QuickLaunchBar::Notify(int id, NMHDR* pnmh) diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index 6c0c372b73b..687fdaf9cec 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -471,6 +471,12 @@ bool NotifyArea::DetermineHideState(NotifyInfo& entry) */ TCHAR title[MAX_PATH]; + if (entry._tipText == TEXT("FRITZ!fon")) + return true; + + if (entry._tipText == TEXT("FRITZ!fax")) + return true; + if (GetWindowText(entry._hWnd, title, MAX_PATH)) { if (_tcsstr(title, TEXT("Task Manager"))) return false; diff --git a/reactos/subsys/system/explorer/utility/window.h b/reactos/subsys/system/explorer/utility/window.h index 2113f65ebfe..4aa7dcbf6f7 100644 --- a/reactos/subsys/system/explorer/utility/window.h +++ b/reactos/subsys/system/explorer/utility/window.h @@ -953,3 +953,121 @@ protected: static int CALLBACK CompareFunc(LPARAM lparam1, LPARAM lparam2, LPARAM lparamSort); }; + + +enum {TRAYBUTTON_LEFT=0, TRAYBUTTON_RIGHT, TRAYBUTTON_MIDDLE}; + +#define PM_TRAYICON (WM_APP+0x1E) + +#define WINMSG_TASKBARCREATED TEXT("TaskbarCreated") + + +struct TrayIcon +{ + TrayIcon(HWND hparent, UINT id) + : _hparent(hparent), _id(id) {} + + ~TrayIcon() + {Remove();} + + void Add(HICON hIcon, LPCTSTR tooltip=NULL) + {Set(NIM_ADD, _id, hIcon, tooltip);} + + void Modify(HICON hIcon, LPCTSTR tooltip=NULL) + {Set(NIM_MODIFY, _id, hIcon, tooltip);} + + void Remove() + { + NOTIFYICONDATA nid = { + sizeof(NOTIFYICONDATA), // cbSize + _hparent, // hWnd + _id, // uID + }; + + Shell_NotifyIcon(NIM_DELETE, &nid); + } + +protected: + HWND _hparent; + UINT _id; + + void Set(DWORD dwMessage, UINT id, HICON hIcon, LPCTSTR tooltip=NULL) + { + NOTIFYICONDATA nid = { + sizeof(NOTIFYICONDATA), // cbSize + _hparent, // hWnd + id, // uID + NIF_MESSAGE|NIF_ICON, // uFlags + PM_TRAYICON, // uCallbackMessage + hIcon // hIcon + }; + + if (tooltip) + _tcsncpy(nid.szTip, tooltip, COUNTOF(nid.szTip)); + + if (nid.szTip[0]) + nid.uFlags |= NIF_TIP; + + Shell_NotifyIcon(dwMessage, &nid); + } +}; + + +template<typename BASE> struct TrayIconControllerTemplate : public BASE +{ + typedef BASE super; + + TrayIconControllerTemplate(HWND hwnd) : BASE(hwnd), + WM_TASKBARCREATED(RegisterWindowMessage(WINMSG_TASKBARCREATED)) + { + } + + LRESULT WndProc(UINT message, WPARAM wparam, LPARAM lparam) + { + if (message == PM_TRAYICON) { + switch(lparam) { + case WM_MOUSEMOVE: + TrayMouseOver(wparam); + break; + + case WM_LBUTTONDOWN: + TrayClick(wparam, TRAYBUTTON_LEFT); + break; + + case WM_LBUTTONDBLCLK: + TrayDblClick(wparam, TRAYBUTTON_LEFT); + break; + + case WM_RBUTTONDOWN: + TrayClick(wparam, TRAYBUTTON_RIGHT); + break; + + case WM_RBUTTONDBLCLK: + TrayDblClick(wparam, TRAYBUTTON_RIGHT); + break; + + case WM_MBUTTONDOWN: + TrayClick(wparam, TRAYBUTTON_MIDDLE); + break; + + case WM_MBUTTONDBLCLK: + TrayDblClick(wparam, TRAYBUTTON_MIDDLE); + break; + } + + return 0; + } else if (message == WM_TASKBARCREATED) { + AddTrayIcons(); + return 0; + } else + return super::WndProc(message, wparam, lparam); + } + + virtual void AddTrayIcons() = 0; + virtual void TrayMouseOver(UINT id) {} + virtual void TrayClick(UINT id, int btn) {} + virtual void TrayDblClick(UINT id, int btn) {} + +protected: + const UINT WM_TASKBARCREATED; +}; From dcb0a46bfe1f2a72c14a967c96f5b513dc9817e6 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Mon, 15 Mar 2004 20:59:06 +0000 Subject: [PATCH 0525/1463] launch sound control panel applet svn path=/trunk/; revision=8751 --- .../system/explorer/taskbar/desktopbar.cpp | 10 +++++--- .../system/explorer/utility/utility.cpp | 8 +++---- .../subsys/system/explorer/utility/utility.h | 23 ++++++++++--------- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp index 6cf7bc0fd6b..3293a7674f9 100644 --- a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp @@ -241,7 +241,7 @@ LRESULT DesktopBar::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) case WM_TIMER: if (wparam == ID_TRAY_VOLUME) { KillTimer(_hwnd, wparam); - WinExec("sndvol32.exe -t", SW_SHOWNORMAL); // launch volume control in small mode + launch_file(_hwnd, TEXT("sndvol32.exe"), SW_SHOWNORMAL, TEXT("-t")); // launch volume control in small mode } break; @@ -323,7 +323,11 @@ int DesktopBar::Command(int id, int code) break;} case ID_TRAY_VOLUME: - WinExec("sndvol32.exe", SW_SHOWNORMAL); + launch_file(_hwnd, TEXT("sndvol32.exe"), SW_SHOWNORMAL); // launch volume control application + break; + + case ID_VOLUME_PROPERTIES: + RunDLL(_hwnd, TEXT("shell32"), "Control_RunDLL", TEXT("mmsys.cpl"), SW_SHOWNORMAL); break; default: @@ -394,7 +398,7 @@ void DesktopBar::TrayDblClick(UINT id, int btn) switch(id) { case ID_TRAY_VOLUME: KillTimer(_hwnd, ID_TRAY_VOLUME); // finish one-click timer - WinExec("sndvol32.exe", SW_SHOWNORMAL); + launch_file(_hwnd, TEXT("sndvol32.exe"), SW_SHOWNORMAL); // launch volume control application break; } } diff --git a/reactos/subsys/system/explorer/utility/utility.cpp b/reactos/subsys/system/explorer/utility/utility.cpp index 453de9825bc..80f443f9f9c 100644 --- a/reactos/subsys/system/explorer/utility/utility.cpp +++ b/reactos/subsys/system/explorer/utility/utility.cpp @@ -176,11 +176,11 @@ BOOL time_to_filetime(const time_t* t, FILETIME* ftime) } -BOOL launch_file(HWND hwnd, LPCTSTR cmd, UINT nCmdShow) +BOOL launch_file(HWND hwnd, LPCTSTR cmd, UINT nCmdShow, LPCTSTR parameters) { CONTEXT("launch_file()"); - HINSTANCE hinst = ShellExecute(hwnd, NULL/*operation*/, cmd, NULL/*parameters*/, NULL/*dir*/, nCmdShow); + HINSTANCE hinst = ShellExecute(hwnd, NULL/*operation*/, cmd, parameters, NULL/*dir*/, nCmdShow); if ((int)hinst <= 32) { display_error(hwnd, GetLastError()); @@ -191,9 +191,9 @@ BOOL launch_file(HWND hwnd, LPCTSTR cmd, UINT nCmdShow) } #ifdef UNICODE -BOOL launch_fileA(HWND hwnd, LPSTR cmd, UINT nCmdShow) +BOOL launch_fileA(HWND hwnd, LPSTR cmd, UINT nCmdShow, LPCSTR parameters) { - HINSTANCE hinst = ShellExecuteA(hwnd, NULL/*operation*/, cmd, NULL/*parameters*/, NULL/*dir*/, nCmdShow); + HINSTANCE hinst = ShellExecuteA(hwnd, NULL/*operation*/, cmd, parameters, NULL/*dir*/, nCmdShow); if ((int)hinst <= 32) { display_error(hwnd, GetLastError()); diff --git a/reactos/subsys/system/explorer/utility/utility.h b/reactos/subsys/system/explorer/utility/utility.h index d15087ea70e..3688495ba42 100644 --- a/reactos/subsys/system/explorer/utility/utility.h +++ b/reactos/subsys/system/explorer/utility/utility.h @@ -146,17 +146,6 @@ extern BOOL time_to_filetime(const time_t* t, FILETIME* ftime); // search for windows of a specific classname extern int find_window_class(LPCTSTR classname); - // launch a program or document file -extern BOOL launch_file(HWND hwnd, LPCTSTR cmd, UINT nCmdShow); -#ifdef UNICODE -extern BOOL launch_fileA(HWND hwnd, LPSTR cmd, UINT nCmdShow); -#else -#define launch_fileA launch_file -#endif - - // call an DLL export like rundll32 -BOOL RunDLL(HWND hwnd, LPCTSTR dllname, LPCSTR procname, LPCTSTR cmdline, UINT nCmdShow); - // create a directory with all missing parent directories BOOL RecursiveCreateDirectory(LPCTSTR path_in); @@ -197,6 +186,18 @@ using namespace _com_util; #endif // _MSC_VER && !_NO_COMUTIL + // launch a program or document file +extern BOOL launch_file(HWND hwnd, LPCTSTR cmd, UINT nCmdShow, LPCTSTR parameters=NULL); +#ifdef UNICODE +extern BOOL launch_fileA(HWND hwnd, LPSTR cmd, UINT nCmdShow, LPCSTR parameters=NULL); +#else +#define launch_fileA launch_file +#endif + + // call an DLL export like rundll32 +BOOL RunDLL(HWND hwnd, LPCTSTR dllname, LPCSTR procname, LPCTSTR cmdline, UINT nCmdShow); + + /// initialization of windows common controls struct CommonControlInit { From f983216b3499e952e63eba1abac2303e6d501cef Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Mon, 15 Mar 2004 21:10:34 +0000 Subject: [PATCH 0526/1463] - Removed dirty loading of symbol files from ExpInitializeExecutive. - Prevented moving of KiSystemStartup into _main, because the memory from _main is freed from within KiSystemStartup. svn path=/trunk/; revision=8752 --- reactos/ntoskrnl/ke/main.c | 37 ++++--------------------------------- 1 file changed, 4 insertions(+), 33 deletions(-) diff --git a/reactos/ntoskrnl/ke/main.c b/reactos/ntoskrnl/ke/main.c index 6065b379d33..51c978d92cc 100644 --- a/reactos/ntoskrnl/ke/main.c +++ b/reactos/ntoskrnl/ke/main.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: main.c,v 1.184 2004/01/13 03:23:11 arty Exp $ +/* $Id: main.c,v 1.185 2004/03/15 21:10:34 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/main.c @@ -629,28 +629,7 @@ ExpInitializeExecutive(VOID) * Enter the kernel debugger before starting up the boot drivers */ #ifdef KDBG - { - /* Load the symbols */ - UNICODE_STRING KWideModuleName; - - for (i=0; i < KeLoaderBlock.ModsCount; i++) - { - RtlCreateUnicodeStringFromAsciiz(&KWideModuleName, - (PCHAR)KeLoaderModules[i].String); - LdrInitDebug(&KeLoaderModules[i],KWideModuleName.Buffer); - if( strstr((PCHAR)KeLoaderModules[i].String,".sym") || - strstr((PCHAR)KeLoaderModules[i].String,".SYM") ) { - KdbProcessSymbolFile((PVOID)KeLoaderModules[i].ModStart, - (PCHAR)KeLoaderModules[i].String, - KeLoaderModules[i].ModEnd - - KeLoaderModules[i].ModEnd); - } - - RtlFreeUnicodeString(&KWideModuleName); - } - - KdbEnter(); - } + KdbEnter(); #endif /* KDBG */ IoCreateDriverList(); @@ -816,8 +795,7 @@ ExpInitializeExecutive(VOID) NtClose(ProcessHandle); } - -VOID +VOID __attribute((noinline)) KiSystemStartup(BOOLEAN BootProcessor) { HalInitSystem (0, (PLOADER_PARAMETER_BLOCK)&KeLoaderBlock); @@ -839,14 +817,7 @@ KiSystemStartup(BOOLEAN BootProcessor) for(;;); } -/* - * FIXME: - * INIT_FUNCTION is temporary disabled, because if ntoskrnl is compiled with - * higher optimisation levels, gcc puts directly some code from KiSystemStartup - * into _main. This code frees the memory from the init section (_main) and - * that does crash reactos. - */ -VOID /*INIT_FUNCTION*/ +VOID INIT_FUNCTION _main (ULONG MultiBootMagic, PLOADER_PARAMETER_BLOCK _LoaderBlock) /* * FUNCTION: Called by the boot loader to start the kernel From 6d7c68c2622d9f4e473dc131b0ecdc0a7be3cd63 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Mon, 15 Mar 2004 21:16:45 +0000 Subject: [PATCH 0527/1463] - Fixed the loading of symbol files, if the base name contains the extension '.sym'. svn path=/trunk/; revision=8753 --- reactos/ntoskrnl/dbg/kdb_stabs.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/dbg/kdb_stabs.c b/reactos/ntoskrnl/dbg/kdb_stabs.c index 42b50c1ced5..36fe4e17f61 100644 --- a/reactos/ntoskrnl/dbg/kdb_stabs.c +++ b/reactos/ntoskrnl/dbg/kdb_stabs.c @@ -641,7 +641,7 @@ LdrpLoadModuleSymbols(PUNICODE_STRING FileName, &ObjectAttributes, &IoStatusBlock, 0, - FILE_SYNCHRONOUS_IO_NONALERT); + FILE_SYNCHRONOUS_IO_NONALERT|FILE_NO_INTERMEDIATE_BUFFERING); if (!NT_SUCCESS(Status)) { DPRINT("Could not open symbol file: %wZ\n", &SymFileName); @@ -667,7 +667,7 @@ LdrpLoadModuleSymbols(PUNICODE_STRING FileName, /* Allocate nonpageable memory for symbol file */ FileBuffer = ExAllocatePool(NonPagedPool, - FileStdInfo.EndOfFile.u.LowPart); + FileStdInfo.AllocationSize.u.LowPart); if (FileBuffer == NULL) { @@ -683,7 +683,7 @@ LdrpLoadModuleSymbols(PUNICODE_STRING FileName, FileBuffer, FileStdInfo.EndOfFile.u.LowPart, 0, 0); - if (!NT_SUCCESS(Status)) + if (!NT_SUCCESS(Status) && Status != STATUS_END_OF_FILE) { DPRINT("Could not read symbol file into memory (Status 0x%x)\n", Status); ExFreePool(FileBuffer); @@ -869,11 +869,18 @@ KdbProcessSymbolFile(PVOID ModuleLoadBase, PCHAR FileName, ULONG Length) PSYMBOLFILE_HEADER SymbolFileHeader; PIMAGE_SYMBOL_INFO SymbolInfo; ANSI_STRING AnsiString; + PCHAR Extension; DPRINT("Module %s is a symbol file\n", FileName); strncpy(TmpBaseName, FileName, MAX_PATH-1); TmpBaseName[MAX_PATH-1] = '\0'; + /* remove the extension '.sym' */ + Extension = strrchr(TmpBaseName, '.'); + if (Extension && 0 == _stricmp(Extension, ".sym")) + { + *Extension = 0; + } DPRINT("base: %s (Length %d)\n", TmpBaseName, Length); From 8536591b9dfc76786a9eb89ec9aaef5aebd44b85 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Mon, 15 Mar 2004 21:31:45 +0000 Subject: [PATCH 0528/1463] - Reduced the size of the symbol files, as only necessary symbol informations are copied. svn path=/trunk/; revision=8754 --- reactos/tools/rsym.c | 86 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 81 insertions(+), 5 deletions(-) diff --git a/reactos/tools/rsym.c b/reactos/tools/rsym.c index 5971dcf0432..bf57a07fb6a 100644 --- a/reactos/tools/rsym.c +++ b/reactos/tools/rsym.c @@ -113,6 +113,25 @@ typedef struct _SYMBOLFILE_HEADER { unsigned long StabstrLength; } SYMBOLFILE_HEADER, *PSYMBOLFILE_HEADER; +typedef struct _STAB_ENTRY { + unsigned long n_strx; /* index into string table of name */ + unsigned char n_type; /* type of symbol */ + unsigned char n_other; /* misc info (usually empty) */ + unsigned short n_desc; /* description field */ + unsigned long n_value; /* value of symbol */ +} STAB_ENTRY, *PSTAB_ENTRY; + +#define N_FUN 0x24 +#define N_SLINE 0x44 +#define N_SO 0x64 + +typedef struct +{ + unsigned long OldOffset; + unsigned long NewOffset; + char* Name; + unsigned long Length; +} STR_ENTRY, *PSTR_ENTRY; char* convert_path(char* origpath) { @@ -161,6 +180,13 @@ int main(int argc, char* argv[]) FILE* out; int n_in; int n_out; + PSTAB_ENTRY StabEntry; + ULONG Count; + ULONG i; + ULONG SymbolsCount; + PSTR_ENTRY StrEntry; + ULONG StrCount; + ULONG j; if (argc != 3) { @@ -239,14 +265,64 @@ int main(int argc, char* argv[]) } } + StabEntry = SymbolsBase; + SymbolsCount = SymbolsLength / sizeof(STAB_ENTRY); + Count = 0; + + for (i = 0; i < SymbolsCount; i++) + { + if (StabEntry[i].n_type == N_FUN || + StabEntry[i].n_type == N_SLINE || + StabEntry[i].n_type == N_SO) + { + memmove(&StabEntry[Count], &StabEntry[i], sizeof(STAB_ENTRY)); + Count++; + } + } + + StrEntry = malloc(sizeof(STR_ENTRY) * Count); + StrCount = 0; + + for (i = 0; i < Count; i++) + { + for (j = 0; j < StrCount; j++) + { + if (StabEntry[i].n_strx == StrEntry[j].OldOffset) + { + StabEntry[i].n_strx = StrEntry[j].NewOffset; + break; + } + } + if (j >= StrCount) + { + StrEntry[StrCount].OldOffset = StabEntry[i].n_strx; + StrEntry[StrCount].Name = (char*)SymbolStringsBase + StrEntry[StrCount].OldOffset; + StrEntry[StrCount].Length = strlen(StrEntry[StrCount].Name) + 1; + if (StrCount == 0) + { + StrEntry[StrCount].NewOffset = 0; + } + else + { + StrEntry[StrCount].NewOffset = StrEntry[StrCount-1].NewOffset + StrEntry[StrCount-1].Length; + } + StabEntry[i].n_strx = StrEntry[StrCount].NewOffset; + StrCount++; + } + } + SymbolFileHeader.StabsOffset = sizeof(SYMBOLFILE_HEADER); - SymbolFileHeader.StabsLength = SymbolsLength; - SymbolFileHeader.StabstrOffset = SymbolFileHeader.StabsOffset + SymbolsLength; - SymbolFileHeader.StabstrLength = SymbolStringsLength; + SymbolFileHeader.StabsLength = Count * sizeof(STAB_ENTRY); + SymbolFileHeader.StabstrOffset = SymbolFileHeader.StabsOffset + SymbolFileHeader.StabsLength; + SymbolFileHeader.StabstrLength = StrEntry[StrCount-1].NewOffset + StrEntry[StrCount-1].Length; n_out = fwrite(&SymbolFileHeader, 1, sizeof(SYMBOLFILE_HEADER), out); - n_out = fwrite(SymbolsBase, 1, SymbolsLength, out); - n_out = fwrite(SymbolStringsBase, 1, SymbolStringsLength, out); + n_out = fwrite(SymbolsBase, 1, SymbolFileHeader.StabsLength, out); + for (i = 0; i < StrCount; i++) + { + fwrite(StrEntry[i].Name, 1, StrEntry[i].Length, out); + } + fclose(out); exit(0); } From ad8fa18342b53ab80f2d2a510fc516f42f13e955 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Mon, 15 Mar 2004 22:01:17 +0000 Subject: [PATCH 0529/1463] Silence debug message svn path=/trunk/; revision=8755 --- reactos/subsys/win32k/eng/mem.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/eng/mem.c b/reactos/subsys/win32k/eng/mem.c index c27ecc68db2..551d5491c31 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.14 2003/10/29 08:38:55 gvg Exp $ +/* $Id: mem.c,v 1.15 2004/03/15 22:01:17 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -85,7 +85,6 @@ EngAllocUserMem(ULONG cj, ULONG Tag) ULONG MemSize = sizeof(USERMEMHEADER) + cj; PUSERMEMHEADER Header; - DbgPrint("EngAllocUserMem\n"); Status = ZwAllocateVirtualMemory(NtCurrentProcess(), &NewMem, 0, &MemSize, MEM_COMMIT, PAGE_READWRITE); if (! NT_SUCCESS(Status)) From 52f0a740aa5ee52ece2083373020a5ad47101798 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Mon, 15 Mar 2004 22:02:31 +0000 Subject: [PATCH 0530/1463] hSelf member contains the handle, not the pointer svn path=/trunk/; revision=8756 --- reactos/subsys/win32k/objects/dc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index 04f4abe3288..f0c8c23ebff 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.123 2004/03/06 01:22:03 navaraf Exp $ +/* $Id: dc.c,v 1.124 2004/03/15 22:02:31 gvg Exp $ * * DC.C - Device context functions * @@ -175,7 +175,7 @@ NtGdiCreateCompatableDC(HDC hDC) NewDC = DC_LockDc( hNewDC ); /* Copy information from original DC to new DC */ - NewDC->hSelf = NewDC; + NewDC->hSelf = hNewDC; NewDC->PDev = OrigDC->PDev; NewDC->DMW = OrigDC->DMW; From aea7bd761584ba91acc7d2ab0e65570e1a11fb46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Mon, 15 Mar 2004 22:06:55 +0000 Subject: [PATCH 0531/1463] - Handle 1bpp DIBs in NtGdiCreateDIBitmap - Fix double lock of DC in routines called by NtGdiCreateDIBSection svn path=/trunk/; revision=8757 --- reactos/include/win32k/bitmaps.h | 2 + reactos/subsys/win32k/objects/bitmaps.c | 73 +++++++----- reactos/subsys/win32k/objects/dib.c | 151 ++++++++++++++++++------ 3 files changed, 163 insertions(+), 63 deletions(-) diff --git a/reactos/include/win32k/bitmaps.h b/reactos/include/win32k/bitmaps.h index 0f627991cbb..bbd9f917e87 100644 --- a/reactos/include/win32k/bitmaps.h +++ b/reactos/include/win32k/bitmaps.h @@ -46,6 +46,8 @@ INT STDCALL BITMAP_GetObject(BITMAPOBJ * bmp, INT count, LPVOID buffer); BOOL FASTCALL Bitmap_InternalDelete( PBITMAPOBJ pBmp ); HBITMAP FASTCALL BitmapToSurf(PBITMAPOBJ BitmapObj, HDEV GDIDevice); +HBITMAP FASTCALL IntCreateCompatibleBitmap(PDC Dc, INT Width, INT Height); + /* User Entry Points */ BOOL STDCALL diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index 5eb5d2a8ccb..bcd662db230 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.61 2004/03/14 00:11:28 gvg Exp $ */ +/* $Id: bitmaps.c,v 1.62 2004/03/15 22:06:55 gvg Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> #include <stdlib.h> @@ -363,41 +363,56 @@ BOOL FASTCALL Bitmap_InternalDelete( PBITMAPOBJ pBmp ) } -HBITMAP STDCALL NtGdiCreateCompatibleBitmap(HDC hDC, - INT Width, - INT Height) +HBITMAP FASTCALL +IntCreateCompatibleBitmap(PDC Dc, + INT Width, + INT Height) { - HBITMAP hbmpRet; - PDC dc; + HBITMAP Bmp; - hbmpRet = 0; - dc = DC_LockDc(hDC); + Bmp = NULL; + + if ((Width >= 0x10000) || (Height >= 0x10000)) + { + DPRINT1("got bad width %d or height %d, please look for reason\n", Width, Height); + return NULL; + } + + /* MS doc says if width or height is 0, return 1-by-1 pixel, monochrome bitmap */ + if (0 == Width || 0 == Height) + { + Bmp = NtGdiCreateBitmap (1, 1, 1, 1, NULL); + } + else + { + Bmp = NtGdiCreateBitmap(Width, Height, 1, Dc->w.bitsPerPixel, NULL); + } + + return Bmp; +} + +HBITMAP STDCALL +NtGdiCreateCompatibleBitmap(HDC hDC, + INT Width, + INT Height) +{ + HBITMAP Bmp; + PDC Dc; + + Dc = DC_LockDc(hDC); DPRINT("NtGdiCreateCompatibleBitmap(%04x,%d,%d, bpp:%d) = \n", hDC, Width, Height, dc->w.bitsPerPixel); - if (!dc) - { - return 0; - } - if ((Width >= 0x10000) || (Height >= 0x10000)) - { - DPRINT("got bad width %d or height %d, please look for reason\n", Width, Height); - } - else - { - /* MS doc says if width or height is 0, return 1-by-1 pixel, monochrome bitmap */ - if (!Width || !Height) + if (NULL == Dc) { - hbmpRet = NtGdiCreateBitmap (1, 1, 1, 1, NULL); + return NULL; } - else - { - hbmpRet = NtGdiCreateBitmap(Width, Height, 1, dc->w.bitsPerPixel, NULL); - } - } - DPRINT ("\t\t%04x\n", hbmpRet); - DC_UnlockDc( hDC ); - return hbmpRet; + + Bmp = IntCreateCompatibleBitmap(Dc, Width, Height); + + DPRINT ("\t\t%04x\n", Bmp); + DC_UnlockDc(hDC); + return Bmp; } HBITMAP STDCALL NtGdiCreateBitmapIndirect(CONST BITMAP *BM) diff --git a/reactos/subsys/win32k/objects/dib.c b/reactos/subsys/win32k/objects/dib.c index 1992312c169..b45b63dcfd7 100644 --- a/reactos/subsys/win32k/objects/dib.c +++ b/reactos/subsys/win32k/objects/dib.c @@ -1,5 +1,5 @@ /* - * $Id: dib.c,v 1.42 2004/02/19 21:12:10 weiden Exp $ + * $Id: dib.c,v 1.43 2004/03/15 22:06:55 gvg Exp $ * * ReactOS W32 Subsystem * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team @@ -87,9 +87,9 @@ UINT STDCALL NtGdiSetDIBColorTable(HDC hDC, } // Converts a DIB to a device-dependent bitmap -INT STDCALL -NtGdiSetDIBits( - HDC hDC, +static INT FASTCALL +IntSetDIBits( + PDC DC, HBITMAP hBitmap, UINT StartScan, UINT ScanLines, @@ -97,7 +97,6 @@ NtGdiSetDIBits( CONST BITMAPINFO *bmi, UINT ColorUse) { - DC *dc; BITMAPOBJ *bitmap; HBITMAP SourceBitmap, DestBitmap; INT result = 0; @@ -116,12 +115,8 @@ NtGdiSetDIBits( INT scanDirection = 1, DIBWidth; // Check parameters - if (!(dc = DC_LockDc(hDC))) - return 0; - if (!(bitmap = BITMAPOBJ_LockBitmap(hBitmap))) { - DC_UnlockDc(hDC); return 0; } @@ -132,7 +127,7 @@ NtGdiSetDIBits( // lpRGB = &bmi->bmiColors[0]; // Create a temporary surface for the destination bitmap - DestBitmap = BitmapToSurf(bitmap, dc->GDIDevice); + DestBitmap = BitmapToSurf(bitmap, DC->GDIDevice); DestSurf = (PSURFOBJ) AccessUserObject( (ULONG)DestBitmap ); DestGDI = (PSURFGDI) AccessInternalObject( (ULONG)DestBitmap ); @@ -159,19 +154,18 @@ NtGdiSetDIBits( SourceSurf = (PSURFOBJ)AccessUserObject((ULONG)SourceBitmap); // Destination palette obtained from the hDC - hDCPalette = PALETTE_LockPalette(dc->DevInfo->hpalDefault); + hDCPalette = PALETTE_LockPalette(DC->DevInfo->hpalDefault); if (NULL == hDCPalette) { EngDeleteSurface(SourceBitmap); EngDeleteSurface(DestBitmap); BITMAPOBJ_UnlockBitmap(hBitmap); - DC_UnlockDc(hDC); SetLastWin32Error(ERROR_INVALID_HANDLE); return 0; } DDB_Palette_Type = hDCPalette->Mode; - DDB_Palette = dc->DevInfo->hpalDefault; - PALETTE_UnlockPalette(dc->DevInfo->hpalDefault); + DDB_Palette = DC->DevInfo->hpalDefault; + PALETTE_UnlockPalette(DC->DevInfo->hpalDefault); // Source palette obtained from the BITMAPINFO DIB_Palette = BuildDIBPalette ( (PBITMAPINFO)bmi, (PINT)&DIB_Palette_Type ); @@ -180,7 +174,6 @@ NtGdiSetDIBits( EngDeleteSurface(SourceBitmap); EngDeleteSurface(DestBitmap); BITMAPOBJ_UnlockBitmap(hBitmap); - DC_UnlockDc(hDC); SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); return 0; } @@ -193,7 +186,6 @@ NtGdiSetDIBits( EngDeleteSurface(SourceBitmap); EngDeleteSurface(DestBitmap); BITMAPOBJ_UnlockBitmap(hBitmap); - DC_UnlockDc(hDC); SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); return 0; } @@ -226,11 +218,38 @@ NtGdiSetDIBits( // WinFree((LPSTR)lpRGB); BITMAPOBJ_UnlockBitmap(hBitmap); - DC_UnlockDc(hDC); return result; } +// Converts a DIB to a device-dependent bitmap +INT STDCALL +NtGdiSetDIBits( + HDC hDC, + HBITMAP hBitmap, + UINT StartScan, + UINT ScanLines, + CONST VOID *Bits, + CONST BITMAPINFO *bmi, + UINT ColorUse) +{ + PDC Dc; + INT Ret; + + Dc = DC_LockDc(hDC); + if (NULL == Dc) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return 0; + } + + Ret = IntSetDIBits(Dc, hBitmap, StartScan, ScanLines, Bits, bmi, ColorUse); + + DC_UnlockDc(hDC); + + return Ret; +} + INT STDCALL NtGdiSetDIBitsToDevice( HDC hDC, @@ -873,13 +892,13 @@ LONG STDCALL NtGdiGetBitmapBits(HBITMAP hBitmap, return ret; } -// The CreateDIBitmap function creates a device-dependent bitmap (DDB) from a DIB and, optionally, sets the bitmap bits -// The DDB that is created will be whatever bit depth your reference DC is -HBITMAP STDCALL NtGdiCreateDIBitmap(HDC hdc, const BITMAPINFOHEADER *header, - DWORD init, LPCVOID bits, const BITMAPINFO *data, - UINT coloruse) +static HBITMAP FASTCALL +IntCreateDIBitmap(PDC Dc, const BITMAPINFOHEADER *header, + DWORD init, LPCVOID bits, const BITMAPINFO *data, + UINT coloruse) { HBITMAP handle; + BOOL fColor; DWORD width; int height; WORD bpp; @@ -891,24 +910,88 @@ HBITMAP STDCALL NtGdiCreateDIBitmap(HDC hdc, const BITMAPINFOHEADER *header, // 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. - // Now create the bitmap - if (init == CBM_INIT) - { - handle = NtGdiCreateCompatibleBitmap(hdc, width, height); - if (!handle) - { - return 0; - } - NtGdiSetDIBits(hdc, handle, 0, height, bits, data, coloruse); - } + if (bpp != 1) fColor = TRUE; + else if ((coloruse != DIB_RGB_COLORS) || + (init != CBM_INIT) || !data) fColor = FALSE; else + { + if (data->bmiHeader.biSize == sizeof(BITMAPINFOHEADER)) { - handle = NtGdiCreateBitmap(width, height, 1, bpp, NULL); + RGBQUAD *rgb = data->bmiColors; + DWORD col = RGB( rgb->rgbRed, rgb->rgbGreen, rgb->rgbBlue ); + + // Check if the first color of the colormap is black + if ((col == RGB(0, 0, 0))) + { + rgb++; + col = RGB( rgb->rgbRed, rgb->rgbGreen, rgb->rgbBlue ); + + // If the second color is white, create a monochrome bitmap + fColor = (col != RGB(0xff,0xff,0xff)); + } + else fColor = TRUE; + } + else if (data->bmiHeader.biSize == sizeof(BITMAPCOREHEADER)) + { + RGBTRIPLE *rgb = ((BITMAPCOREINFO *)data)->bmciColors; + DWORD col = RGB( rgb->rgbtRed, rgb->rgbtGreen, rgb->rgbtBlue); + + if ((col == RGB(0,0,0))) + { + rgb++; + col = RGB( rgb->rgbtRed, rgb->rgbtGreen, rgb->rgbtBlue ); + fColor = (col != RGB(0xff,0xff,0xff)); } + else fColor = TRUE; + } + else + { + DPRINT("(%ld): wrong size for data\n", data->bmiHeader.biSize ); + return 0; + } + } + + // Now create the bitmap + if (fColor) + { + handle = IntCreateCompatibleBitmap(Dc, width, height); + } + else + { + handle = NtGdiCreateBitmap( width, height, 1, 1, NULL); + } + + if (NULL != handle && CBM_INIT == init) + { + IntSetDIBits(Dc, handle, 0, height, bits, data, coloruse); + } return handle; } +// The CreateDIBitmap function creates a device-dependent bitmap (DDB) from a DIB and, optionally, sets the bitmap bits +// The DDB that is created will be whatever bit depth your reference DC is +HBITMAP STDCALL NtGdiCreateDIBitmap(HDC hDc, const BITMAPINFOHEADER *Header, + DWORD Init, LPCVOID Bits, const BITMAPINFO *Data, + UINT ColorUse) +{ + PDC Dc; + HBITMAP Bmp; + + Dc = DC_LockDc(hDc); + if (NULL == Dc) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return NULL; + } + + Bmp = IntCreateDIBitmap(Dc, Header, Init, Bits, Data, ColorUse); + + DC_UnlockDc(hDc); + + return Bmp; +} + HBITMAP STDCALL NtGdiCreateDIBSection(HDC hDC, CONST BITMAPINFO *bmi, UINT Usage, @@ -1036,7 +1119,7 @@ DIB_CreateDIBSection( // Create Device Dependent Bitmap and add DIB pointer if (dib) { - res = NtGdiCreateDIBitmap(dc->hSelf, bi, 0, NULL, bmi, usage); + res = IntCreateDIBitmap(dc, bi, 0, NULL, bmi, usage); if (! res) { return NULL; From 28f9bf0155b4ea0dd95b73afa00c99522b2c1a24 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Mon, 15 Mar 2004 22:22:53 +0000 Subject: [PATCH 0532/1463] - Left whole page allocations on by accident. svn path=/trunk/; revision=8758 --- reactos/ntoskrnl/mm/npool.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/reactos/ntoskrnl/mm/npool.c b/reactos/ntoskrnl/mm/npool.c index 9c6e564ed0f..ded9a3bbfe1 100644 --- a/reactos/ntoskrnl/mm/npool.c +++ b/reactos/ntoskrnl/mm/npool.c @@ -1,4 +1,4 @@ -/* $Id: npool.c,v 1.83 2004/03/15 00:03:31 dwelch Exp $ +/* $Id: npool.c,v 1.84 2004/03/15 22:22:53 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -35,7 +35,7 @@ * end of the range so any accesses beyond the end of block are to invalid * memory locations. */ -#define WHOLE_PAGE_ALLOCATIONS +/*#define WHOLE_PAGE_ALLOCATIONS*/ #ifdef ENABLE_VALIDATE_POOL #define VALIDATE_POOL validate_kernel_pool() @@ -1782,15 +1782,7 @@ MiInitializeNonPagedPool(VOID) KEBUGCHECK(0); } MiNonPagedPoolAllocMap[i / 32] |= (1 << (i % 32)); -#if defined(__GNUC__) - Address += PAGE_SIZE; -#else - { - char* pTemp = Address; - pTemp += PAGE_SIZE; - Address = pTemp; - } -#endif + Address = (PVOID)((ULONG_PTR)Address + PAGE_SIZE); } /* the first block contains the non paged pool bitmap */ blk = (BLOCK_HDR*)MiNonPagedPoolStart; From ba96bd3821e4f2c71cc8d254198cff29500887b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Mon, 15 Mar 2004 23:49:29 +0000 Subject: [PATCH 0533/1463] - Add arrows for popup submenus - Display bitmap menu items svn path=/trunk/; revision=8759 --- reactos/lib/user32/include/window.h | 2 + reactos/lib/user32/resources/obm_mnarrow.bmp | Bin 0 -> 106 bytes reactos/lib/user32/user32.rc | 1 + reactos/lib/user32/windows/menu.c | 261 +++++++++++++++---- reactos/lib/user32/windows/nonclient.c | 7 +- 5 files changed, 224 insertions(+), 47 deletions(-) create mode 100644 reactos/lib/user32/resources/obm_mnarrow.bmp diff --git a/reactos/lib/user32/include/window.h b/reactos/lib/user32/include/window.h index bed44dfcd44..5a2707702e3 100644 --- a/reactos/lib/user32/include/window.h +++ b/reactos/lib/user32/include/window.h @@ -17,6 +17,8 @@ ULONG UserHasThickFrameStyle(ULONG Style, ULONG ExStyle); void UserGetFrameSize(ULONG Style, ULONG ExStyle, SIZE *Size); +void +UserGetInsideRectNC(HWND hWnd, RECT *rect); DWORD SCROLL_HitTest( HWND hwnd, INT nBar, POINT pt, BOOL bDragging ); diff --git a/reactos/lib/user32/resources/obm_mnarrow.bmp b/reactos/lib/user32/resources/obm_mnarrow.bmp new file mode 100644 index 0000000000000000000000000000000000000000..58302e78842529add31c6b35dd9beb8f0cf96e7c GIT binary patch literal 106 zcmZ?r&0>H6J0PV2#Oy%K4aAH<h!6b#|DWL>P{BSRo(IHzK->nzO;8%d2Z@8^{{b-o D&-V+@ literal 0 HcmV?d00001 diff --git a/reactos/lib/user32/user32.rc b/reactos/lib/user32/user32.rc index 35b36cfd4ad..3202d61d25e 100644 --- a/reactos/lib/user32/user32.rc +++ b/reactos/lib/user32/user32.rc @@ -82,6 +82,7 @@ END OBM_CHECKBOXES BITMAP "resources/obm_checkboxes.bmp" OBM_CLOSE BITMAP "resources/obm_close.bmp" OBM_COMBO BITMAP "resources/obm_combo.bmp" +OBM_MNARROW BITMAP "resources/obm_mnarrow.bmp" ///////////////////////////////////////////////////////////////////////////// // diff --git a/reactos/lib/user32/windows/menu.c b/reactos/lib/user32/windows/menu.c index 34f7010769c..21fccd6afe6 100644 --- a/reactos/lib/user32/windows/menu.c +++ b/reactos/lib/user32/windows/menu.c @@ -21,7 +21,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: menu.c,v 1.55 2004/03/14 16:39:49 gvg Exp $ +/* $Id: menu.c,v 1.56 2004/03/15 23:49:29 gvg Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/menu.c @@ -73,6 +73,8 @@ #define IS_SYSTEM_POPUP(MenuInfo) \ (0 != ((MenuInfo)->Flags & MF_POPUP) && 0 != ((MenuInfo)->Flags & MF_SYSMENU)) + +#define IS_MAGIC_ITEM(Bmp) ((int) Bmp <12) #define MENU_BAR_ITEMS_SPACE (12) #define SEPARATOR_HEIGHT (5) @@ -151,8 +153,10 @@ static BOOL fEndMenu = FALSE; static HWND TopPopup; /* Dimension of the menu bitmaps */ -static WORD ArrowBitmapWidth = 0/*, ArrowBitmapHeight = 0*/; +static WORD ArrowBitmapWidth = 0, ArrowBitmapHeight = 0; +static HBITMAP StdMnArrow = NULL; +static HBITMAP BmpSysMenu = NULL; /*********************************************************************** * MenuGetRosMenuInfo @@ -370,6 +374,189 @@ MenuCleanupAllRosMenuItemInfo(PROSMENUITEMINFO ItemInfo) HeapFree(GetProcessHeap(), 0, ItemInfo); } + +/*********************************************************************** + * MenuLoadBitmaps + * + * Load the arrow bitmap. We can't do this from MenuInit since user32 + * can also be used (and thus initialized) from text-mode. + */ +static void FASTCALL +MenuLoadBitmaps(VOID) +{ + /* Load menu bitmaps */ + if (NULL == StdMnArrow) + { + StdMnArrow = LoadBitmapW(0, MAKEINTRESOURCEW(OBM_MNARROW)); + + if (NULL != StdMnArrow) + { + BITMAP bm; + GetObjectW(StdMnArrow, sizeof(BITMAP), &bm); + ArrowBitmapWidth = bm.bmWidth; + ArrowBitmapHeight = bm.bmHeight; + } + } + + /* Load system buttons bitmaps */ + if (NULL == BmpSysMenu) + { + BmpSysMenu = LoadBitmapW(0, MAKEINTRESOURCEW(OBM_CLOSE)); + } +} + +/*********************************************************************** + * MenuGetBitmapItemSize + * + * Get the size of a bitmap item. + */ +static void FASTCALL +MenuGetBitmapItemSize(UINT Id, DWORD Data, SIZE *Size) +{ + BITMAP Bm; + HBITMAP Bmp = (HBITMAP) Id; + + Size->cx = Size->cy = 0; + + /* check if there is a magic menu item associated with this item */ + if (0 != Id && IS_MAGIC_ITEM(Id)) + { + switch(LOWORD(Id)) + { + case (INT_PTR) HBMMENU_SYSTEM: + if (0 != Data) + { + Bmp = (HBITMAP) Data; + break; + } + /* fall through */ + case (INT_PTR) HBMMENU_MBAR_RESTORE: + case (INT_PTR) HBMMENU_MBAR_MINIMIZE: + case (INT_PTR) HBMMENU_MBAR_MINIMIZE_D: + case (INT_PTR) HBMMENU_MBAR_CLOSE: + case (INT_PTR) HBMMENU_MBAR_CLOSE_D: + Size->cx = GetSystemMetrics(SM_CXSIZE); + Size->cy = GetSystemMetrics(SM_CYSIZE); + return; + case (INT_PTR) HBMMENU_CALLBACK: + case (INT_PTR) HBMMENU_POPUP_CLOSE: + case (INT_PTR) HBMMENU_POPUP_RESTORE: + case (INT_PTR) HBMMENU_POPUP_MAXIMIZE: + case (INT_PTR) HBMMENU_POPUP_MINIMIZE: + default: + FIXME("Magic menu bitmap not implemented\n"); + return; + } + } + + if (GetObjectW(Bmp, sizeof(BITMAP), &Bm)) + { + Size->cx = Bm.bmWidth; + Size->cy = Bm.bmHeight; + } +} + +/*********************************************************************** + * MenuDrawBitmapItem + * + * Draw a bitmap item. + */ +static void FASTCALL +MenuDrawBitmapItem(HDC Dc, PROSMENUITEMINFO Item, const RECT *Rect, BOOL MenuBar) +{ + BITMAP Bm; + DWORD Rop; + HDC DcMem; + HBITMAP Bmp = (HBITMAP) Item->hbmpItem; + int w = Rect->right - Rect->left; + int h = Rect->bottom - Rect->top; + int BmpXoffset = 0; + int Left, Top; + + /* Check if there is a magic menu item associated with this item */ + if (IS_MAGIC_ITEM(Item->hbmpItem)) + { + UINT Flags = 0; + RECT r; + + switch ((int) Item->hbmpItem) + { + case (INT_PTR) HBMMENU_SYSTEM: + if (NULL != Item->hbmpItem) + { + Bmp = Item->hbmpItem; + if (! GetObjectW(Bmp, sizeof(BITMAP), &Bm)) + { + return; + } + } + else + { + Bmp = BmpSysMenu; + if (! GetObjectW(Bmp, sizeof(BITMAP), &Bm)) + { + return; + } + /* only use right half of the bitmap */ + BmpXoffset = Bm.bmWidth / 2; + Bm.bmWidth -= BmpXoffset; + } + goto got_bitmap; + case (INT_PTR) HBMMENU_MBAR_RESTORE: + Flags = DFCS_CAPTIONRESTORE; + break; + case (INT_PTR) HBMMENU_MBAR_MINIMIZE: + Flags = DFCS_CAPTIONMIN; + break; + case (INT_PTR) HBMMENU_MBAR_MINIMIZE_D: + Flags = DFCS_CAPTIONMIN | DFCS_INACTIVE; + break; + case (INT_PTR) HBMMENU_MBAR_CLOSE: + Flags = DFCS_CAPTIONCLOSE; + break; + case (INT_PTR) HBMMENU_MBAR_CLOSE_D: + Flags = DFCS_CAPTIONCLOSE | DFCS_INACTIVE; + break; + case (INT_PTR) HBMMENU_CALLBACK: + case (INT_PTR) HBMMENU_POPUP_CLOSE: + case (INT_PTR) HBMMENU_POPUP_RESTORE: + case (INT_PTR) HBMMENU_POPUP_MAXIMIZE: + case (INT_PTR) HBMMENU_POPUP_MINIMIZE: + default: + FIXME("Magic menu bitmap not implemented\n"); + return; + } + r = *Rect; + InflateRect(&r, -1, -1); + if (0 != (Item->fState & MF_HILITE)) + { + Flags |= DFCS_PUSHED; + } + DrawFrameControl(Dc, &r, DFC_CAPTION, Flags); + return; + } + + if (NULL == Bmp || ! GetObjectW(Bmp, sizeof(BITMAP), &Bm)) + { + return; + } + +got_bitmap: + DcMem = CreateCompatibleDC(Dc); + SelectObject(DcMem, Bmp); + + /* handle fontsize > bitmap_height */ + Top = (Bm.bmHeight < h) ? Rect->top + (h - Bm.bmHeight) / 2 : Rect->top; + Left = Rect->left; + Rop = (0 != (Item->fState & MF_HILITE) && ! IS_MAGIC_ITEM(Item->hbmpItem)) ? NOTSRCCOPY : SRCCOPY; + if (0 != (Item->fState & MF_HILITE) && IS_BITMAP_ITEM(Item->fType)) + { + SetBkColor(Dc, GetSysColor(COLOR_HIGHLIGHT)); + } + BitBlt(Dc, Left, Top, w, h, DcMem, BmpXoffset, 0, Rop); + DeleteDC(DcMem); +} + /*********************************************************************** * MenuDrawMenuItem * @@ -384,18 +571,12 @@ MenuDrawMenuItem(HWND Wnd, PROSMENUINFO MenuInfo, HWND WndOwner, HDC Dc, if (0 != (Item->fType & MF_SYSMENU)) { -#if 0 /* FIXME */ - if( !IsIconic(hwnd) ) { - if (TWEAK_WineLook > WIN31_LOOK) - NC_DrawSysButton95( hwnd, hdc, - lpitem->fState & - (MF_HILITE | MF_MOUSESELECT) ); - else - NC_DrawSysButton( hwnd, hdc, - lpitem->fState & - (MF_HILITE | MF_MOUSESELECT) ); + if (! IsIconic(Wnd)) + { + UserGetInsideRectNC(Wnd, &Rect); + UserDrawSysMenuButton(Wnd, Dc, &Rect, + Item->fState & (MF_HILITE | MF_MOUSESELECT)); } -#endif return; } @@ -554,8 +735,7 @@ MenuDrawMenuItem(HWND Wnd, PROSMENUINFO MenuInfo, HWND WndOwner, HDC Dc, * FIXME: * Custom checkmark bitmaps are monochrome but not always 1bpp. */ -#if 0 /* FIXME */ - HBITMAP bm = 0 != (Item->fState & MF_CHECKED) ? Item->hCheckBit : Item->hUnCheckBit; + HBITMAP bm = 0 != (Item->fState & MF_CHECKED) ? Item->hbmpChecked : Item->hbmpUnchecked; if (NULL != bm) /* we have a custom bitmap */ { HDC DcMem = CreateCompatibleDC(Dc); @@ -566,9 +746,6 @@ MenuDrawMenuItem(HWND Wnd, PROSMENUINFO MenuInfo, HWND WndOwner, HDC Dc, DeleteDC(DcMem); } else if (0 != (Item->fState & MF_CHECKED)) /* standard bitmaps */ -#else - if (0 != (Item->fState & MF_CHECKED)) /* standard bitmaps */ -#endif { RECT r; HBITMAP bm = CreateBitmap(CheckBitmapWidth, CheckBitmapHeight, 1, 1, NULL); @@ -585,22 +762,20 @@ MenuDrawMenuItem(HWND Wnd, PROSMENUINFO MenuInfo, HWND WndOwner, HDC Dc, } } -#if 0 /* FIXME */ - /* Draw the popup-menu arrow */ - if (lpitem->fType & MF_POPUP) - { - HDC hdcMem = CreateCompatibleDC( hdc ); - HBITMAP hOrigBitmap; + /* Draw the popup-menu arrow */ + if (0 != (Item->fType & MF_POPUP)) + { + HDC DcMem = CreateCompatibleDC(Dc); + HBITMAP OrigBitmap; - hOrigBitmap = SelectObject( hdcMem, hStdMnArrow ); - BitBlt( hdc, rect.right - arrow_bitmap_width - 1, - (y - arrow_bitmap_height) / 2, - arrow_bitmap_width, arrow_bitmap_height, - hdcMem, 0, 0, SRCCOPY ); - SelectObject( hdcMem, hOrigBitmap ); - DeleteDC( hdcMem ); - } -#endif + OrigBitmap = SelectObject(DcMem, StdMnArrow); + BitBlt(Dc, Rect.right - ArrowBitmapWidth - 1, + (y - ArrowBitmapHeight) / 2, + ArrowBitmapWidth, ArrowBitmapHeight, + DcMem, 0, 0, SRCCOPY); + SelectObject(DcMem, OrigBitmap); + DeleteDC(DcMem); + } Rect.left += CheckBitmapWidth; Rect.right -= ArrowBitmapWidth; @@ -615,9 +790,7 @@ MenuDrawMenuItem(HWND Wnd, PROSMENUINFO MenuInfo, HWND WndOwner, HDC Dc, /* Draw the item text or bitmap */ if (IS_BITMAP_ITEM(Item->fType)) { -#if 0 /* FIXME */ - MENU_DrawBitmapItem( hdc, lpitem, &rect, menuBar ); -#endif + MenuDrawBitmapItem(Dc, Item, &Rect, MenuBar); return; } /* No bitmap - process text if present */ @@ -1055,17 +1228,15 @@ MenuCalcItemSize(HDC Dc, PROSMENUITEMINFO ItemInfo, HWND WndOwner, if (IS_BITMAP_ITEM(ItemInfo->fType)) { -#if 0 /* FIXME */ - SIZE size; + SIZE Size; - MENU_GetBitmapItemSize( (int)lpitem->text, lpitem->dwItemData, &size ); - lpitem->rect.right += size.cx; - lpitem->rect.bottom += size.cy; + MenuGetBitmapItemSize((int) ItemInfo->hbmpItem, (DWORD) ItemInfo->hbmpItem, &Size); + ItemInfo->Rect.right += Size.cx; + ItemInfo->Rect.bottom += Size.cy; /* Leave space for the sunken border */ - lpitem->rect.right += 2; - lpitem->rect.bottom += 2; -#endif + ItemInfo->Rect.right += 2; + ItemInfo->Rect.bottom += 2; } /* it must be a text item - unless it's the system menu */ @@ -3331,6 +3502,7 @@ CheckMenuRadioItem(HMENU hmenu, HMENU STDCALL CreateMenu(VOID) { + MenuLoadBitmaps(); return NtUserCreateMenu(FALSE); } @@ -3341,6 +3513,7 @@ CreateMenu(VOID) HMENU STDCALL CreatePopupMenu(VOID) { + MenuLoadBitmaps(); return NtUserCreateMenu(TRUE); } diff --git a/reactos/lib/user32/windows/nonclient.c b/reactos/lib/user32/windows/nonclient.c index 8f47a7b4c01..260edf495ee 100644 --- a/reactos/lib/user32/windows/nonclient.c +++ b/reactos/lib/user32/windows/nonclient.c @@ -45,6 +45,7 @@ Already defined in makefile now. #include <winpos.h> #include <user32/wininternal.h> #include <user32.h> +#include "window.h" #define NDEBUG #include <debug.h> @@ -148,7 +149,7 @@ UserGetWindowIcon(HWND hwnd) } BOOL -UserDrawSysMenuButton(HWND hWnd, HDC hDC, LPRECT Rect) +UserDrawSysMenuButton(HWND hWnd, HDC hDC, LPRECT Rect, BOOL Down) { HICON WindowIcon; @@ -1141,7 +1142,7 @@ DrawCaption(HWND hWnd, HDC hDC, LPCRECT lprc, UINT uFlags) PatBlt(MemDC, 0, 0, xx, lprc->bottom - lprc->top, PATCOPY); // For some reason the icon isn't centered correctly... r.top --; - UserDrawSysMenuButton(hWnd, MemDC, &r); + UserDrawSysMenuButton(hWnd, MemDC, &r, FALSE); r.top ++; r.left += xx; } @@ -1187,7 +1188,7 @@ DrawCaption(HWND hWnd, HDC hDC, LPCRECT lprc, UINT uFlags) { // For some reason the icon isn't centered correctly... r.top --; - UserDrawSysMenuButton(hWnd, MemDC, &r); + UserDrawSysMenuButton(hWnd, MemDC, &r, FALSE); r.top ++; } r.top ++; From 7d726b95193aa95204ae1beef9cd1facf476198e Mon Sep 17 00:00:00 2001 From: Royce Mitchell III <royce3@ev1.net> Date: Tue, 16 Mar 2004 02:15:06 +0000 Subject: [PATCH 0534/1463] NtGdiGetPixel cleanup - fixed small bug with rect boundary checking, and cleaned up code to only unlock DC in one place. svn path=/trunk/; revision=8760 --- reactos/include/rosrtl/gdimacro.h | 24 ++++++++ reactos/subsys/win32k/objects/bitmaps.c | 81 +++++++++++-------------- 2 files changed, 58 insertions(+), 47 deletions(-) create mode 100644 reactos/include/rosrtl/gdimacro.h diff --git a/reactos/include/rosrtl/gdimacro.h b/reactos/include/rosrtl/gdimacro.h new file mode 100644 index 00000000000..36093a9f735 --- /dev/null +++ b/reactos/include/rosrtl/gdimacro.h @@ -0,0 +1,24 @@ +/* + * gdimacro.h + */ + +#ifndef ROSRTL_GDIMACRO_H +#define ROSRTL_GDIMACRO_H + +#define IN_RECT(r,x,y) \ +( \ + (x) >= (r).left && \ + (y) >= (r).top && \ + (x) < (r).right && \ + (y) < (r).bottom \ +) + +#define RECT_OVERLAP(a,b) \ +( \ + (a).left < (b).right && \ + (b).left < (a).right && \ + (a).top < (b).bottom && \ + (b).top < (a).bottom \ +) + +#endif /* ROSRTL_GDIMACRO_H */ diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index bcd662db230..de38d9e09d3 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.62 2004/03/15 22:06:55 gvg Exp $ */ +/* $Id: bitmaps.c,v 1.63 2004/03/16 02:15:06 royce Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> #include <stdlib.h> @@ -33,6 +33,7 @@ #include <include/surface.h> #include <include/palette.h> #include <include/tags.h> +#include <rosrtl/gdimacro.h> #define NDEBUG #include <win32k/debug1.h> @@ -467,66 +468,52 @@ BOOL STDCALL NtGdiGetBitmapDimensionEx(HBITMAP hBitmap, return TRUE; } -COLORREF STDCALL NtGdiGetPixel(HDC hDC, INT XPos, INT YPos) +COLORREF +STDCALL +NtGdiGetPixel(HDC hDC, INT XPos, INT YPos) { PDC dc = NULL; - COLORREF Result = (COLORREF) 0; + COLORREF clrSource, Result = (COLORREF)CLR_INVALID; // default to failure PSURFGDI Surface; PSURFOBJ SurfaceObject; HPALETTE Pal; PPALGDI PalGDI; USHORT PalMode; - PXLATEOBJ XlateObj = NULL; + PXLATEOBJ XlateObj; dc = DC_LockDc (hDC); - if (dc == NULL) + if (dc != NULL) { - return (COLORREF)CLR_INVALID; - } - if (XPos < dc->CombinedClip->rclBounds.left || - XPos > dc->CombinedClip->rclBounds.right || - YPos < dc->CombinedClip->rclBounds.top || - YPos > dc->CombinedClip->rclBounds.bottom) - { - DC_UnlockDc(hDC); - return (COLORREF)CLR_INVALID; - } - SurfaceObject = (PSURFOBJ)AccessUserObject((ULONG)dc->Surface); - Surface = (PSURFGDI)AccessInternalObjectFromUserObject(SurfaceObject); - if (Surface == NULL || Surface->DIB_GetPixel == NULL) - { - DC_UnlockDc(hDC); - return (COLORREF)CLR_INVALID; - } - Result = Surface->DIB_GetPixel(SurfaceObject, XPos, YPos); + if ( IN_RECT(dc->CombinedClip->rclBounds,XPos,YPos) ) + { + SurfaceObject = (PSURFOBJ)AccessUserObject((ULONG)dc->Surface); + ASSERT(SurfaceObject); + Surface = (PSURFGDI)AccessInternalObjectFromUserObject(SurfaceObject); + if ( Surface && Surface->DIB_GetPixel ) + { + clrSource = Surface->DIB_GetPixel(SurfaceObject, XPos, YPos); + if (dc->w.hPalette != 0) + Pal = dc->w.hPalette; + else + Pal = NtGdiGetStockObject(DEFAULT_PALETTE); + PalGDI = PALETTE_LockPalette(Pal); + if ( PalGDI ) + { + PalMode = PalGDI->Mode; + PALETTE_UnlockPalette(Pal); - if (dc->w.hPalette != 0) - { - Pal = dc->w.hPalette; - } - else - { - Pal = NtGdiGetStockObject(DEFAULT_PALETTE); - } - PalGDI = PALETTE_LockPalette(Pal); - if (NULL == PalGDI) - { + XlateObj = (PXLATEOBJ)IntEngCreateXlate ( PAL_RGB, PalMode, NULL, Pal ); + if ( XlateObj ) + { + Result = XLATEOBJ_iXlate(XlateObj, clrSource); + EngDeleteXlate(XlateObj); + } + } + } + } DC_UnlockDc(hDC); - return (COLORREF)CLR_INVALID; } - PalMode = PalGDI->Mode; - PALETTE_UnlockPalette(Pal); - XlateObj = (PXLATEOBJ) IntEngCreateXlate(PAL_RGB, PalMode, NULL, Pal); - if (NULL == XlateObj) - { - DC_UnlockDc(hDC); - return (COLORREF)CLR_INVALID; - } - Result = XLATEOBJ_iXlate(XlateObj, Result); - EngDeleteXlate(XlateObj); - - DC_UnlockDc(hDC); return Result; } From c20093e554f35bde56e7be5118559141da6e6f15 Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Tue, 16 Mar 2004 08:30:28 +0000 Subject: [PATCH 0535/1463] Arty's summary: drivers/fs/cdfs/fsctl: Allocate wide chars. CD title was being truncated drivers/fs/vfat/fsctl: Tolerate a zero bytes-per-sector Patches by Herve Poussineau svn path=/trunk/; revision=8761 --- reactos/drivers/fs/cdfs/fsctl.c | 4 +- reactos/drivers/fs/vfat/fsctl.c | 69 ++++++++++++++++++--------------- 2 files changed, 40 insertions(+), 33 deletions(-) diff --git a/reactos/drivers/fs/cdfs/fsctl.c b/reactos/drivers/fs/cdfs/fsctl.c index 7257cf7c172..d21d0cb9143 100644 --- a/reactos/drivers/fs/cdfs/fsctl.c +++ b/reactos/drivers/fs/cdfs/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.18 2004/03/08 08:51:26 ekohl Exp $ +/* $Id: fsctl.c,v 1.19 2004/03/16 08:30:28 arty Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -83,7 +83,7 @@ CdfsGetPVDData(PUCHAR Buffer, *pw++ = (WCHAR)*pc++; } *pw = 0; - CdInfo->VolumeLabelLength = i; + CdInfo->VolumeLabelLength = i * sizeof(WCHAR); CdInfo->VolumeSpaceSize = Pvd->VolumeSpaceSizeL; CdInfo->RootStart = Pvd->RootDirRecord.ExtentLocationL; diff --git a/reactos/drivers/fs/vfat/fsctl.c b/reactos/drivers/fs/vfat/fsctl.c index 18761725623..51adc4d8379 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.27 2004/01/28 20:53:46 ekohl Exp $ +/* $Id: fsctl.c,v 1.28 2004/03/16 08:30:28 arty Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -127,40 +127,47 @@ VfatHasFileSystem(PDEVICE_OBJECT DeviceToMount, Status = VfatReadDisk(DeviceToMount, &Offset, DiskGeometry.BytesPerSector, (PUCHAR) Boot, FALSE); if (NT_SUCCESS(Status)) { - FatInfo.VolumeID = Boot->VolumeID; - FatInfo.FATStart = Boot->ReservedSectors; - FatInfo.FATCount = Boot->FATCount; - FatInfo.FATSectors = Boot->FATSectors ? Boot->FATSectors : ((struct _BootSector32*) Boot)->FATSectors32; - FatInfo.BytesPerSector = Boot->BytesPerSector; - FatInfo.SectorsPerCluster = Boot->SectorsPerCluster; - FatInfo.BytesPerCluster = FatInfo.BytesPerSector * FatInfo.SectorsPerCluster; - FatInfo.rootDirectorySectors = ((Boot->RootEntries * 32) + Boot->BytesPerSector - 1) / Boot->BytesPerSector; - FatInfo.rootStart = FatInfo.FATStart + FatInfo.FATCount * FatInfo.FATSectors; - FatInfo.dataStart = FatInfo.rootStart + FatInfo.rootDirectorySectors; - FatInfo.Sectors = Sectors = Boot->Sectors ? Boot->Sectors : Boot->SectorsHuge; - Sectors -= Boot->ReservedSectors + FatInfo.FATCount * FatInfo.FATSectors + FatInfo.rootDirectorySectors; - FatInfo.NumberOfClusters = Sectors / Boot->SectorsPerCluster; - if (FatInfo.NumberOfClusters < 4085) + if (Boot->BytesPerSector != 0) { - DPRINT("FAT12\n"); - FatInfo.FatType = FAT12; - } - else if (FatInfo.NumberOfClusters >= 65525) - { - DPRINT("FAT32\n"); - FatInfo.FatType = FAT32; - FatInfo.RootCluster = ((struct _BootSector32*) Boot)->RootCluster; - FatInfo.rootStart = FatInfo.dataStart + ((FatInfo.RootCluster - 2) * FatInfo.SectorsPerCluster); - FatInfo.VolumeID = ((struct _BootSector32*) Boot)->VolumeID; + FatInfo.VolumeID = Boot->VolumeID; + FatInfo.FATStart = Boot->ReservedSectors; + FatInfo.FATCount = Boot->FATCount; + FatInfo.FATSectors = Boot->FATSectors ? Boot->FATSectors : ((struct _BootSector32*) Boot)->FATSectors32; + FatInfo.BytesPerSector = Boot->BytesPerSector; + FatInfo.SectorsPerCluster = Boot->SectorsPerCluster; + FatInfo.BytesPerCluster = FatInfo.BytesPerSector * FatInfo.SectorsPerCluster; + FatInfo.rootDirectorySectors = ((Boot->RootEntries * 32) + Boot->BytesPerSector - 1) / Boot->BytesPerSector; + FatInfo.rootStart = FatInfo.FATStart + FatInfo.FATCount * FatInfo.FATSectors; + FatInfo.dataStart = FatInfo.rootStart + FatInfo.rootDirectorySectors; + FatInfo.Sectors = Sectors = Boot->Sectors ? Boot->Sectors : Boot->SectorsHuge; + Sectors -= Boot->ReservedSectors + FatInfo.FATCount * FatInfo.FATSectors + FatInfo.rootDirectorySectors; + FatInfo.NumberOfClusters = Sectors / Boot->SectorsPerCluster; + if (FatInfo.NumberOfClusters < 4085) + { + DPRINT("FAT12\n"); + FatInfo.FatType = FAT12; + } + else if (FatInfo.NumberOfClusters >= 65525) + { + DPRINT("FAT32\n"); + FatInfo.FatType = FAT32; + FatInfo.RootCluster = ((struct _BootSector32*) Boot)->RootCluster; + FatInfo.rootStart = FatInfo.dataStart + ((FatInfo.RootCluster - 2) * FatInfo.SectorsPerCluster); + FatInfo.VolumeID = ((struct _BootSector32*) Boot)->VolumeID; + } + else + { + DPRINT("FAT16\n"); + FatInfo.FatType = FAT16; + } + if (pFatInfo) + { + *pFatInfo = FatInfo; + } } else { - DPRINT("FAT16\n"); - FatInfo.FatType = FAT16; - } - if (pFatInfo) - { - *pFatInfo = FatInfo; + Status = STATUS_INSUFFICIENT_RESOURCES; } } ExFreePool(Boot); From 5c6819aaae3eed282d2c75e5d6aec65fd97fab77 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Tue, 16 Mar 2004 10:07:38 +0000 Subject: [PATCH 0536/1463] replace WINE specifiy system tray implementation by a WIN32 compatible implementation svn path=/trunk/; revision=8762 --- reactos/lib/shell32/Makefile.in | 2 +- reactos/lib/shell32/ros-systray.c | 97 +++++++ reactos/lib/shell32/shell32_main.c | 2 + reactos/lib/shell32/shell32_main.h | 2 + reactos/lib/shell32/shlexec.c | 13 +- reactos/lib/shell32/systray.c | 398 ----------------------------- 6 files changed, 110 insertions(+), 404 deletions(-) create mode 100644 reactos/lib/shell32/ros-systray.c delete mode 100644 reactos/lib/shell32/systray.c diff --git a/reactos/lib/shell32/Makefile.in b/reactos/lib/shell32/Makefile.in index 6ee8ae0edb5..bcb64c467e9 100644 --- a/reactos/lib/shell32/Makefile.in +++ b/reactos/lib/shell32/Makefile.in @@ -47,7 +47,7 @@ C_SRCS = \ shpolicy.c \ shv_bg_cmenu.c \ shv_item_cmenu.c \ - systray.c \ + ros-systray.c \ shlcpanel.c RC_SRCS = shres.rc version.rc diff --git a/reactos/lib/shell32/ros-systray.c b/reactos/lib/shell32/ros-systray.c new file mode 100644 index 00000000000..5ca1580b144 --- /dev/null +++ b/reactos/lib/shell32/ros-systray.c @@ -0,0 +1,97 @@ +/* + * Copyright 2004 Martin Fuchs + * + * Pass on icon notification messages to the systray implementation + * in the currently running shell. + * + * 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 <stdarg.h> + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "shellapi.h" + + + /* copy data structure for tray notifications */ +typedef struct TrayNotifyCDSA { + DWORD cookie; + DWORD notify_code; + NOTIFYICONDATAA nicon_data; +} TrayNotifyCDSA; + +typedef struct TrayNotifyCDSW { + DWORD cookie; + DWORD notify_code; + NOTIFYICONDATAW nicon_data; +} TrayNotifyCDSW; + + +/************************************************************************* + * Shell_NotifyIcon [SHELL32.296] + * Shell_NotifyIconA [SHELL32.297] + */ +BOOL WINAPI Shell_NotifyIconA(DWORD dwMessage, PNOTIFYICONDATAA pnid) +{ + HWND hwnd; + COPYDATASTRUCT data; + TrayNotifyCDSA notify_data; + + BOOL ret = FALSE; + + notify_data.cookie = 1; + notify_data.notify_code = dwMessage; + memcpy(¬ify_data.nicon_data, pnid, sizeof(NOTIFYICONDATAA)); + + data.dwData = 1; + data.cbData = sizeof(notify_data); + data.lpData = ¬ify_data; + + for(hwnd=0; hwnd=FindWindowExA(0, hwnd, "Shell_TrayWnd", NULL); ) { + if (SendMessageA(hwnd, WM_COPYDATA, (WPARAM)pnid->hWnd, (LPARAM)&data)) + ret = TRUE; + } + + return ret; +} + +/************************************************************************* + * Shell_NotifyIconW [SHELL32.298] + */ +BOOL WINAPI Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW pnid) +{ + HWND hwnd; + COPYDATASTRUCT data; + TrayNotifyCDSW notify_data; + + BOOL ret = FALSE; + + notify_data.cookie = 1; + notify_data.notify_code = dwMessage; + memcpy(¬ify_data.nicon_data, pnid, sizeof(NOTIFYICONDATAW)); + + data.dwData = 1; + data.cbData = sizeof(notify_data); + data.lpData = ¬ify_data; + + for(hwnd=0; hwnd=FindWindowExW(0, hwnd, L"Shell_TrayWnd", NULL); ) { + if (SendMessageW(hwnd, WM_COPYDATA, (WPARAM)pnid->hWnd, (LPARAM)&data)) + ret = TRUE; + } + + return ret; +} diff --git a/reactos/lib/shell32/shell32_main.c b/reactos/lib/shell32/shell32_main.c index 7afba34621a..ff55e46fe24 100644 --- a/reactos/lib/shell32/shell32_main.c +++ b/reactos/lib/shell32/shell32_main.c @@ -921,7 +921,9 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad) InitCommonControlsEx(NULL); SIC_Initialize(); +#ifndef __REACTOS__ SYSTRAY_Init(); +#endif InitChangeNotifications(); break; diff --git a/reactos/lib/shell32/shell32_main.h b/reactos/lib/shell32/shell32_main.h index 41c8ab77de2..9db2043324a 100644 --- a/reactos/lib/shell32/shell32_main.h +++ b/reactos/lib/shell32/shell32_main.h @@ -134,8 +134,10 @@ HRESULT WINAPI Shell_MergeMenus (HMENU hmDst, HMENU hmSrc, UINT uInsert, UINT uI (((kst) & MK_SHIFT) ? DROPEFFECT_LINK : DROPEFFECT_COPY):\ DROPEFFECT_MOVE) +#ifndef __REACTOS__ /* Systray */ BOOL SYSTRAY_Init(void); +#endif /* OLE32 */ extern HINSTANCE hShellOle32; diff --git a/reactos/lib/shell32/shlexec.c b/reactos/lib/shell32/shlexec.c index ab2a0552cb0..920185624c6 100644 --- a/reactos/lib/shell32/shlexec.c +++ b/reactos/lib/shell32/shlexec.c @@ -938,6 +938,7 @@ BOOL WINAPI ShellExecuteExW32 (LPSHELLEXECUTEINFOW psei, SHELL_ExecuteW32 execfu WCHAR buffer[1024]; const WCHAR* ext; + /* make a local copy of the LPSHELLEXECUTEINFO structure and work with this from now on */ memcpy(&sei_tmp, psei, sizeof(sei_tmp)); TRACE("mask=0x%08lx hwnd=%p verb=%s file=%s parm=%s dir=%s show=0x%08x class=%s\n", @@ -948,6 +949,7 @@ BOOL WINAPI ShellExecuteExW32 (LPSHELLEXECUTEINFOW psei, SHELL_ExecuteW32 execfu psei->hProcess = NULL; + /* make copies of all path/command strings */ if (sei_tmp.lpFile) strcpyW(wszApplicationName, sei_tmp.lpFile); else @@ -963,6 +965,7 @@ BOOL WINAPI ShellExecuteExW32 (LPSHELLEXECUTEINFOW psei, SHELL_ExecuteW32 execfu else *wszDir = '\0'; + /* adjust string pointers to point to the new buffers */ sei_tmp.lpFile = wszApplicationName; sei_tmp.lpParameters = wszParameters; sei_tmp.lpDirectory = wszDir; @@ -1030,9 +1033,6 @@ BOOL WINAPI ShellExecuteExW32 (LPSHELLEXECUTEINFOW psei, SHELL_ExecuteW32 execfu return FALSE; } - /* Else, try to execute the filename */ - TRACE("execute:'%s','%s'\n", debugstr_w(sei_tmp.lpFile), debugstr_w(sei_tmp.lpParameters)); - /* resolve shell shortcuts */ ext = PathFindExtensionW(sei_tmp.lpFile); @@ -1043,7 +1043,7 @@ BOOL WINAPI ShellExecuteExW32 (LPSHELLEXECUTEINFOW psei, SHELL_ExecuteW32 execfu sei_tmp.hwnd, sei_tmp.lpVerb?sei_tmp.lpVerb:wszEmpty, &sei_tmp.nShow, (LPITEMIDLIST*)&sei_tmp.lpIDList); if (psei->lpIDList) - psei->fMask |= SEE_MASK_IDLIST; + psei->fMask |= SEE_MASK_IDLIST; //@@ nicht sei_tmp.fMask ?! if (SUCCEEDED(hr)) { @@ -1103,6 +1103,9 @@ BOOL WINAPI ShellExecuteExW32 (LPSHELLEXECUTEINFOW psei, SHELL_ExecuteW32 execfu if (ExpandEnvironmentStringsW(sei_tmp.lpDirectory, buffer, MAX_PATH)) lstrcpyW(wszDir/*sei_tmp.lpDirectory*/, buffer); + /* Else, try to execute the filename */ + TRACE("execute:'%s','%s','%s'\n", debugstr_w(wszApplicationName), debugstr_w(wszCommandline), debugstr_w(wszDir)); + /* separate out command line arguments from executable file name */ if (!*sei_tmp.lpParameters) { @@ -1181,7 +1184,7 @@ BOOL WINAPI ShellExecuteExW32 (LPSHELLEXECUTEINFOW psei, SHELL_ExecuteW32 execfu if (sei_tmp.lpIDList!=psei->lpIDList && sei_tmp.lpIDList) SHFree(sei_tmp.lpIDList); - TRACE("execfunc: retval=%d psei->hInstApp=%p\n", retval, psei->hInstApp); + TRACE("execfunc: retval=%d sei_tmp.hInstApp=%p\n", retval, sei_tmp.hInstApp); return TRUE; } diff --git a/reactos/lib/shell32/systray.c b/reactos/lib/shell32/systray.c deleted file mode 100644 index 55d0403883e..00000000000 --- a/reactos/lib/shell32/systray.c +++ /dev/null @@ -1,398 +0,0 @@ -/* - * Systray - * - * Copyright 1999 Kai Morich <kai.morich@bigfoot.de> - * - * Manage the systray window. That it actually appears in the docking - * area of KDE is handled in dlls/x11drv/window.c, - * X11DRV_set_wm_hints using KWM_DOCKWINDOW. - * - * 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 "config.h" - -#ifdef HAVE_UNISTD_H -# include <unistd.h> -#endif -#include <stdarg.h> -#include <stdlib.h> -#include <string.h> - -#include "windef.h" -#include "winbase.h" -#include "winnls.h" -#include "wingdi.h" -#include "winuser.h" -#include "shlobj.h" -#include "shellapi.h" -#include "shell32_main.h" -#include "commctrl.h" -#include "wine/debug.h" - -WINE_DEFAULT_DEBUG_CHANNEL(shell); - -typedef struct SystrayItem { - HWND hWnd; - HWND hWndToolTip; - NOTIFYICONDATAA notifyIcon; - struct SystrayItem *nextTrayItem; -} SystrayItem; - -static SystrayItem *systray=NULL; -static int firstSystray=TRUE; /* defer creation of window class until first systray item is created */ - -static BOOL SYSTRAY_Delete(PNOTIFYICONDATAA pnid); - - -#define ICON_SIZE GetSystemMetrics(SM_CXSMICON) -/* space around icon (forces icon to center of KDE systray area) */ -#define ICON_BORDER 4 - - - -static BOOL SYSTRAY_ItemIsEqual(PNOTIFYICONDATAA pnid1, PNOTIFYICONDATAA pnid2) -{ - if (pnid1->hWnd != pnid2->hWnd) return FALSE; - if (pnid1->uID != pnid2->uID) return FALSE; - return TRUE; -} - -static LRESULT CALLBACK SYSTRAY_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - HDC hdc; - PAINTSTRUCT ps; - - switch (message) { - case WM_PAINT: - { - RECT rc; - SystrayItem *ptrayItem = systray; - - while (ptrayItem) { - if (ptrayItem->hWnd==hWnd) { - if (ptrayItem->notifyIcon.hIcon) { - hdc = BeginPaint(hWnd, &ps); - GetClientRect(hWnd, &rc); - if (!DrawIconEx(hdc, rc.left+ICON_BORDER, rc.top+ICON_BORDER, ptrayItem->notifyIcon.hIcon, - ICON_SIZE, ICON_SIZE, 0, 0, DI_DEFAULTSIZE|DI_NORMAL)) { - ERR("Paint(SystrayWindow %p) failed -> removing SystrayItem %p\n", hWnd, ptrayItem); - SYSTRAY_Delete(&ptrayItem->notifyIcon); - } - } - break; - } - ptrayItem = ptrayItem->nextTrayItem; - } - EndPaint(hWnd, &ps); - } - break; - - case WM_MOUSEMOVE: - case WM_LBUTTONDOWN: - case WM_LBUTTONUP: - case WM_RBUTTONDOWN: - case WM_RBUTTONUP: - case WM_MBUTTONDOWN: - case WM_MBUTTONUP: - { - MSG msg; - SystrayItem *ptrayItem = systray; - - while ( ptrayItem ) { - if (ptrayItem->hWnd == hWnd) { - msg.hwnd=hWnd; - msg.message=message; - msg.wParam=wParam; - msg.lParam=lParam; - msg.time = GetMessageTime (); - msg.pt.x = LOWORD(GetMessagePos ()); - msg.pt.y = HIWORD(GetMessagePos ()); - - SendMessageA(ptrayItem->hWndToolTip, TTM_RELAYEVENT, 0, (LPARAM)&msg); - } - ptrayItem = ptrayItem->nextTrayItem; - } - } - /* fall through */ - - case WM_LBUTTONDBLCLK: - case WM_RBUTTONDBLCLK: - case WM_MBUTTONDBLCLK: - { - SystrayItem *ptrayItem = systray; - - while (ptrayItem) { - if (ptrayItem->hWnd == hWnd) { - if (ptrayItem->notifyIcon.hWnd && ptrayItem->notifyIcon.uCallbackMessage) { - if (!PostMessageA(ptrayItem->notifyIcon.hWnd, ptrayItem->notifyIcon.uCallbackMessage, - (WPARAM)ptrayItem->notifyIcon.uID, (LPARAM)message)) { - ERR("PostMessage(SystrayWindow %p) failed -> removing SystrayItem %p\n", hWnd, ptrayItem); - SYSTRAY_Delete(&ptrayItem->notifyIcon); - } - } - break; - } - ptrayItem = ptrayItem->nextTrayItem; - } - } - break; - - default: - return (DefWindowProcA(hWnd, message, wParam, lParam)); - } - return (0); - -} - - -BOOL SYSTRAY_RegisterClass(void) -{ - WNDCLASSA wc; - - wc.style = CS_SAVEBITS|CS_DBLCLKS; - wc.lpfnWndProc = (WNDPROC)SYSTRAY_WndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = 0; - wc.hIcon = 0; - wc.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); - wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); - wc.lpszMenuName = NULL; - wc.lpszClassName = "WineSystray"; - - if (!RegisterClassA(&wc)) { - ERR("RegisterClass(WineSystray) failed\n"); - return FALSE; - } - return TRUE; -} - - -BOOL SYSTRAY_ItemInit(SystrayItem *ptrayItem) -{ - RECT rect; - - /* Register the class if this is our first tray item. */ - if ( firstSystray ) { - firstSystray = FALSE; - if ( !SYSTRAY_RegisterClass() ) { - ERR( "RegisterClass(WineSystray) failed\n" ); - return FALSE; - } - } - - /* Initialize the window size. */ - rect.left = 0; - rect.top = 0; - rect.right = ICON_SIZE+2*ICON_BORDER; - rect.bottom = ICON_SIZE+2*ICON_BORDER; - - ZeroMemory( ptrayItem, sizeof(SystrayItem) ); - /* Create tray window for icon. */ - ptrayItem->hWnd = CreateWindowExA( WS_EX_TRAYWINDOW, - "WineSystray", "Wine-Systray", - WS_VISIBLE, - CW_USEDEFAULT, CW_USEDEFAULT, - rect.right-rect.left, rect.bottom-rect.top, - 0, 0, 0, 0 ); - if ( !ptrayItem->hWnd ) { - ERR( "CreateWindow(WineSystray) failed\n" ); - return FALSE; - } - - /* Create tooltip for icon. */ - ptrayItem->hWndToolTip = CreateWindowA( TOOLTIPS_CLASSA,NULL,TTS_ALWAYSTIP, - CW_USEDEFAULT, CW_USEDEFAULT, - CW_USEDEFAULT, CW_USEDEFAULT, - ptrayItem->hWnd, 0, 0, 0 ); - if ( !ptrayItem->hWndToolTip ) { - ERR( "CreateWindow(TOOLTIP) failed\n" ); - return FALSE; - } - return TRUE; -} - - -static void SYSTRAY_ItemTerm(SystrayItem *ptrayItem) -{ - if(ptrayItem->notifyIcon.hIcon) - DestroyIcon(ptrayItem->notifyIcon.hIcon); - if(ptrayItem->hWndToolTip) - DestroyWindow(ptrayItem->hWndToolTip); - if(ptrayItem->hWnd) - DestroyWindow(ptrayItem->hWnd); - return; -} - - -void SYSTRAY_ItemSetMessage(SystrayItem *ptrayItem, UINT uCallbackMessage) -{ - ptrayItem->notifyIcon.uCallbackMessage = uCallbackMessage; -} - - -void SYSTRAY_ItemSetIcon(SystrayItem *ptrayItem, HICON hIcon) -{ - if(ptrayItem->notifyIcon.hIcon) - DestroyIcon(ptrayItem->notifyIcon.hIcon); - ptrayItem->notifyIcon.hIcon = CopyIcon(hIcon); - InvalidateRect(ptrayItem->hWnd, NULL, TRUE); -} - - -void SYSTRAY_ItemSetTip(SystrayItem *ptrayItem, CHAR* szTip, int modify) -{ - TTTOOLINFOA ti; - - strncpy(ptrayItem->notifyIcon.szTip, szTip, sizeof(ptrayItem->notifyIcon.szTip)); - ptrayItem->notifyIcon.szTip[sizeof(ptrayItem->notifyIcon.szTip)-1]=0; - - ti.cbSize = sizeof(TTTOOLINFOA); - ti.uFlags = 0; - ti.hwnd = ptrayItem->hWnd; - ti.hinst = 0; - ti.uId = 0; - ti.lpszText = ptrayItem->notifyIcon.szTip; - ti.rect.left = 0; - ti.rect.top = 0; - ti.rect.right = ICON_SIZE+2*ICON_BORDER; - ti.rect.bottom = ICON_SIZE+2*ICON_BORDER; - - if(modify) - SendMessageA(ptrayItem->hWndToolTip, TTM_UPDATETIPTEXTA, 0, (LPARAM)&ti); - else - SendMessageA(ptrayItem->hWndToolTip, TTM_ADDTOOLA, 0, (LPARAM)&ti); -} - - -static BOOL SYSTRAY_Add(PNOTIFYICONDATAA pnid) -{ - SystrayItem **ptrayItem = &systray; - - /* Find last element. */ - while( *ptrayItem ) { - if ( SYSTRAY_ItemIsEqual(pnid, &(*ptrayItem)->notifyIcon) ) - return FALSE; - ptrayItem = &((*ptrayItem)->nextTrayItem); - } - /* Allocate SystrayItem for element and add to end of list. */ - (*ptrayItem) = ( SystrayItem *)malloc( sizeof(SystrayItem) ); - - /* Initialize and set data for the tray element. */ - SYSTRAY_ItemInit( (*ptrayItem) ); - (*ptrayItem)->notifyIcon.uID = pnid->uID; /* only needed for callback message */ - (*ptrayItem)->notifyIcon.hWnd = pnid->hWnd; /* only needed for callback message */ - SYSTRAY_ItemSetIcon (*ptrayItem, (pnid->uFlags&NIF_ICON) ?pnid->hIcon :0); - SYSTRAY_ItemSetMessage(*ptrayItem, (pnid->uFlags&NIF_MESSAGE)?pnid->uCallbackMessage:0); - SYSTRAY_ItemSetTip (*ptrayItem, (pnid->uFlags&NIF_TIP) ?pnid->szTip :"", FALSE); - - TRACE("%p: %p %s\n", (*ptrayItem), (*ptrayItem)->notifyIcon.hWnd, - (*ptrayItem)->notifyIcon.szTip); - return TRUE; -} - - -static BOOL SYSTRAY_Modify(PNOTIFYICONDATAA pnid) -{ - SystrayItem *ptrayItem = systray; - - while ( ptrayItem ) { - if ( SYSTRAY_ItemIsEqual(pnid, &ptrayItem->notifyIcon) ) { - if (pnid->uFlags & NIF_ICON) - SYSTRAY_ItemSetIcon(ptrayItem, pnid->hIcon); - if (pnid->uFlags & NIF_MESSAGE) - SYSTRAY_ItemSetMessage(ptrayItem, pnid->uCallbackMessage); - if (pnid->uFlags & NIF_TIP) - SYSTRAY_ItemSetTip(ptrayItem, pnid->szTip, TRUE); - - TRACE("%p: %p %s\n", ptrayItem, ptrayItem->notifyIcon.hWnd, ptrayItem->notifyIcon.szTip); - return TRUE; - } - ptrayItem = ptrayItem->nextTrayItem; - } - return FALSE; /* not found */ -} - - -static BOOL SYSTRAY_Delete(PNOTIFYICONDATAA pnid) -{ - SystrayItem **ptrayItem = &systray; - - while (*ptrayItem) { - if (SYSTRAY_ItemIsEqual(pnid, &(*ptrayItem)->notifyIcon)) { - SystrayItem *next = (*ptrayItem)->nextTrayItem; - TRACE("%p: %p %s\n", *ptrayItem, (*ptrayItem)->notifyIcon.hWnd, (*ptrayItem)->notifyIcon.szTip); - SYSTRAY_ItemTerm(*ptrayItem); - - free(*ptrayItem); - *ptrayItem = next; - - return TRUE; - } - ptrayItem = &((*ptrayItem)->nextTrayItem); - } - - return FALSE; /* not found */ -} - -/************************************************************************* - * - */ -BOOL SYSTRAY_Init(void) -{ - return TRUE; -} - -/************************************************************************* - * Shell_NotifyIcon [SHELL32.296] - * Shell_NotifyIconA [SHELL32.297] - */ -BOOL WINAPI Shell_NotifyIconA(DWORD dwMessage, PNOTIFYICONDATAA pnid ) -{ - BOOL flag=FALSE; - TRACE("enter %p %d %ld\n", pnid->hWnd, pnid->uID, dwMessage); - switch(dwMessage) { - case NIM_ADD: - flag = SYSTRAY_Add(pnid); - break; - case NIM_MODIFY: - flag = SYSTRAY_Modify(pnid); - break; - case NIM_DELETE: - flag = SYSTRAY_Delete(pnid); - break; - } - TRACE("leave %p %d %ld=%d\n", pnid->hWnd, pnid->uID, dwMessage, flag); - return flag; -} - -/************************************************************************* - * Shell_NotifyIconW [SHELL32.298] - */ -BOOL WINAPI Shell_NotifyIconW (DWORD dwMessage, PNOTIFYICONDATAW pnid ) -{ - BOOL ret; - - PNOTIFYICONDATAA p = HeapAlloc(GetProcessHeap(),0,sizeof(NOTIFYICONDATAA)); - memcpy(p, pnid, sizeof(NOTIFYICONDATAA)); - WideCharToMultiByte( CP_ACP, 0, pnid->szTip, -1, p->szTip, sizeof(p->szTip), NULL, NULL ); - p->szTip[sizeof(p->szTip)-1] = 0; - - ret = Shell_NotifyIconA(dwMessage, p ); - - HeapFree(GetProcessHeap(),0,p); - return ret; -} From 1a75a2261cc2ee352a0a010c641d8498a7fb75b1 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Tue, 16 Mar 2004 10:08:16 +0000 Subject: [PATCH 0537/1463] add _ANONYMOUS_UNION to NOTIFYICONDATA struct svn path=/trunk/; revision=8763 --- reactos/w32api/include/shellapi.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/w32api/include/shellapi.h b/reactos/w32api/include/shellapi.h index 603e5af0ae3..dba3874bbcf 100644 --- a/reactos/w32api/include/shellapi.h +++ b/reactos/w32api/include/shellapi.h @@ -133,7 +133,7 @@ typedef struct _NOTIFYICONDATAA { DWORD dwState; DWORD dwStateMask; CHAR szInfo[256]; - union { + _ANONYMOUS_UNION union { UINT uTimeout; UINT uVersion; } DUMMYUNIONNAME; @@ -159,7 +159,7 @@ typedef struct _NOTIFYICONDATAW { DWORD dwState; DWORD dwStateMask; WCHAR szInfo[256]; - union { + _ANONYMOUS_UNION union { UINT uTimeout; UINT uVersion; } DUMMYUNIONNAME; From bf87266d08e62aa4409319d77f77ae40625032d2 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Tue, 16 Mar 2004 11:34:51 +0000 Subject: [PATCH 0538/1463] Flush the new user hive after copying. svn path=/trunk/; revision=8764 --- reactos/lib/userenv/registry.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/reactos/lib/userenv/registry.c b/reactos/lib/userenv/registry.c index eaae1263cd2..0463214d0bd 100644 --- a/reactos/lib/userenv/registry.c +++ b/reactos/lib/userenv/registry.c @@ -1,4 +1,4 @@ -/* $Id: registry.c,v 1.3 2004/03/14 18:15:59 ekohl Exp $ +/* $Id: registry.c,v 1.4 2004/03/16 11:34:51 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -86,7 +86,7 @@ CopyKey (HKEY hDstKey, NULL, &LastWrite)) { - DPRINT ("Subkey enumeration failed (Error %lu)\n", GetLastError()); + DPRINT1 ("Subkey enumeration failed (Error %lu)\n", GetLastError()); HeapFree (GetProcessHeap (), 0, lpNameBuffer); @@ -103,7 +103,7 @@ CopyKey (HKEY hDstKey, &hDstSubKey, &dwDisposition)) { - DPRINT ("Subkey creation failed (Error %lu)\n", GetLastError()); + DPRINT1 ("Subkey creation failed (Error %lu)\n", GetLastError()); HeapFree (GetProcessHeap (), 0, lpNameBuffer); @@ -116,7 +116,7 @@ CopyKey (HKEY hDstKey, KEY_READ, &hSrcSubKey)) { - DPRINT ("Error: %lu\n", GetLastError()); + DPRINT1 ("Error: %lu\n", GetLastError()); RegCloseKey (hDstSubKey); HeapFree (GetProcessHeap (), 0, @@ -127,7 +127,7 @@ CopyKey (HKEY hDstKey, if (!CopyKey (hDstSubKey, hSrcSubKey)) { - DPRINT ("Error: %lu\n", GetLastError()); + DPRINT1 ("Error: %lu\n", GetLastError()); RegCloseKey (hSrcSubKey); RegCloseKey (hDstSubKey); HeapFree (GetProcessHeap (), @@ -153,7 +153,7 @@ CopyKey (HKEY hDstKey, dwMaxValueNameLength * sizeof(WCHAR)); if (lpNameBuffer == NULL) { - DPRINT ("Buffer allocation failed\n"); + DPRINT1 ("Buffer allocation failed\n"); return FALSE; } @@ -162,7 +162,7 @@ CopyKey (HKEY hDstKey, dwMaxValueLength); if (lpDataBuffer == NULL) { - DPRINT ("Buffer allocation failed\n"); + DPRINT1 ("Buffer allocation failed\n"); HeapFree (GetProcessHeap (), 0, lpNameBuffer); @@ -234,7 +234,6 @@ CreateUserHive (LPCWSTR lpKeyName) DPRINT ("CreateUserHive(%S) called\n", lpKeyName); - if (RegOpenKeyExW (HKEY_USERS, L".Default", 0, @@ -259,6 +258,8 @@ CreateUserHive (LPCWSTR lpKeyName) bResult = CopyKey (hUserKey, hDefaultKey); + RegFlushKey (hUserKey); + RegCloseKey (hUserKey); RegCloseKey (hDefaultKey); From 32a05a43774537cf4955824c9bfce439a2c3ea31 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Tue, 16 Mar 2004 21:06:20 +0000 Subject: [PATCH 0539/1463] - Implemented IOCTL_VIDEO_MAP_VIDEO_MEMORY/IOCTL_VIDEO_UNMAP_VIDEO_MEMORY. svn path=/trunk/; revision=8766 --- reactos/drivers/video/miniport/vga/vgamp.c | 46 ++++++++++++++++++---- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/reactos/drivers/video/miniport/vga/vgamp.c b/reactos/drivers/video/miniport/vga/vgamp.c index edd5d81b443..e2178f006e3 100644 --- a/reactos/drivers/video/miniport/vga/vgamp.c +++ b/reactos/drivers/video/miniport/vga/vgamp.c @@ -34,7 +34,8 @@ VGATimer(PVOID DeviceExtension); */ /* Mandatory IoControl routines */ -VOID VGAMapVideoMemory(IN PVIDEO_MEMORY RequestedAddress, +VOID VGAMapVideoMemory(IN PVOID DeviceExtension, + IN PVIDEO_MEMORY RequestedAddress, OUT PVIDEO_MEMORY_INFORMATION MapInformation, OUT PSTATUS_BLOCK StatusBlock); VOID VGAQueryAvailModes(OUT PVIDEO_MODE_INFORMATION ReturnedModes, @@ -53,7 +54,8 @@ VOID VGASetCurrentMode(IN PVIDEO_MODE RequestedMode, VOID VGAShareVideoMemory(IN PVIDEO_SHARE_MEMORY RequestedMemory, OUT PVIDEO_MEMORY_INFORMATION ReturnedMemory, OUT PSTATUS_BLOCK StatusBlock); -VOID VGAUnmapVideoMemory(IN PVIDEO_MEMORY MemoryToUnmap, +VOID VGAUnmapVideoMemory(IN PVOID DeviceExtension, + IN PVIDEO_MEMORY MemoryToUnmap, OUT PSTATUS_BLOCK StatusBlock); VOID VGAUnshareVideoMemory(IN PVIDEO_MEMORY MemoryToUnshare, OUT PSTATUS_BLOCK StatusBlock); @@ -219,7 +221,8 @@ VGAStartIO(PVOID DeviceExtension, switch (RequestPacket->IoControlCode) { case IOCTL_VIDEO_MAP_VIDEO_MEMORY: - VGAMapVideoMemory((PVIDEO_MEMORY) RequestPacket->InputBuffer, + VGAMapVideoMemory(DeviceExtension, + (PVIDEO_MEMORY) RequestPacket->InputBuffer, (PVIDEO_MEMORY_INFORMATION) RequestPacket->OutputBuffer, RequestPacket->StatusBlock); @@ -261,7 +264,8 @@ VGAStartIO(PVOID DeviceExtension, break; case IOCTL_VIDEO_UNMAP_VIDEO_MEMORY: - VGAUnmapVideoMemory((PVIDEO_MEMORY) RequestPacket->InputBuffer, + VGAUnmapVideoMemory(DeviceExtension, + (PVIDEO_MEMORY) RequestPacket->InputBuffer, RequestPacket->StatusBlock); break; @@ -389,11 +393,34 @@ VGATimer(PVOID DeviceExtension) #endif -VOID VGAMapVideoMemory(IN PVIDEO_MEMORY RequestedAddress, +VOID VGAMapVideoMemory(IN PVOID DeviceExtension, + IN PVIDEO_MEMORY RequestedAddress, OUT PVIDEO_MEMORY_INFORMATION MapInformation, OUT PSTATUS_BLOCK StatusBlock) { - UNIMPLEMENTED; + ULONG ReturnedLength; + PVOID ReturnedAddress; + ULONG IoSpace; + PHYSICAL_ADDRESS FrameBufferBase; + ReturnedAddress = RequestedAddress->RequestedVirtualAddress; + ReturnedLength = 256 * 1024; + FrameBufferBase.QuadPart = 0xA0000; + IoSpace = VIDEO_MEMORY_SPACE_MEMORY; + StatusBlock->Status = VideoPortMapMemory(DeviceExtension, + FrameBufferBase, + &ReturnedLength, + &IoSpace, + &ReturnedAddress); + if (StatusBlock->Status != 0) + { + StatusBlock->Information = 0; + return; + } + MapInformation->VideoRamBase = MapInformation->FrameBufferBase = + ReturnedAddress; + MapInformation->VideoRamLength = MapInformation->FrameBufferLength = + ReturnedLength; + StatusBlock->Information = sizeof(VIDEO_MEMORY_INFORMATION); } VOID VGAQueryAvailModes(OUT PVIDEO_MODE_INFORMATION ReturnedModes, @@ -474,10 +501,13 @@ VOID VGAShareVideoMemory(IN PVIDEO_SHARE_MEMORY RequestedMemory, UNIMPLEMENTED; } -VOID VGAUnmapVideoMemory(IN PVIDEO_MEMORY MemoryToUnmap, +VOID VGAUnmapVideoMemory(IN PVOID DeviceExtension, + IN PVIDEO_MEMORY MemoryToUnmap, OUT PSTATUS_BLOCK StatusBlock) { - UNIMPLEMENTED; + VideoPortUnmapMemory(DeviceExtension, + MemoryToUnmap->RequestedVirtualAddress, + 0); } VOID VGAUnshareVideoMemory(IN PVIDEO_MEMORY MemoryToUnshare, From 9eb9832b021e17e8599b168c3abf5ba2e49b1095 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Tue, 16 Mar 2004 21:11:44 +0000 Subject: [PATCH 0540/1463] - Use the miniport services to map the frame buffer. svn path=/trunk/; revision=8767 --- .../drivers/video/displays/vga/main/enable.c | 8 ++--- .../video/displays/vga/objects/screen.c | 34 +++++++++++++++---- reactos/drivers/video/displays/vga/vgaddi.h | 1 + 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/reactos/drivers/video/displays/vga/main/enable.c b/reactos/drivers/video/displays/vga/main/enable.c index b871fdc65a9..72574f4ab56 100644 --- a/reactos/drivers/video/displays/vga/main/enable.c +++ b/reactos/drivers/video/displays/vga/main/enable.c @@ -1,9 +1,9 @@ /* * entry.c * - * $Revision: 1.2 $ + * $Revision: 1.3 $ * $Author: dwelch $ - * $Date: 2004/03/04 23:11:43 $ + * $Date: 2004/03/16 21:11:44 $ * */ @@ -189,9 +189,6 @@ DrvEnableDriver(IN ULONG EngineVersion, vgaPreCalc(); - // FIXME: Use Vidport to map the memory properly - vidmem = (char *)(0xd0000000 + 0xa0000); - VGADDI_InitializeOffScreenMem((640 * 480) >> 3, 65536 - ((640 * 480) >> 3)); DriveEnableData->pdrvfn = FuncList; @@ -367,6 +364,7 @@ DrvDisableSurface(IN DHPDEV PDev) PDEVSURF pdsurf = ppdev->AssociatedSurf; CHECKPOINT; DPRINT( "KMDriver: %x\n", ppdev->KMDriver ); + DeinitVGA(ppdev); // EngFreeMem(pdsurf->BankSelectInfo); CHECKPOINT; if (pdsurf->BankInfo != NULL) { diff --git a/reactos/drivers/video/displays/vga/objects/screen.c b/reactos/drivers/video/displays/vga/objects/screen.c index 7008ee162c0..d15da46bc8c 100644 --- a/reactos/drivers/video/displays/vga/objects/screen.c +++ b/reactos/drivers/video/displays/vga/objects/screen.c @@ -1,4 +1,5 @@ #include "../vgaddi.h" +#include "../vgavideo/vgavideo.h" static WORD PaletteBuffer[] = { 16, 0, // 16 entries, start with 0 @@ -101,9 +102,33 @@ DWORD getAvailableModes(HANDLE Driver, return modes.NumModes; } +BOOL DeinitVGA(PPDEV ppdev) +{ + VIDEO_MEMORY VideoMemory; + ULONG ReturnedDataLength; + + VideoMemory.RequestedVirtualAddress = (PVOID)ppdev->fbScreen; + + if (EngDeviceIoControl(ppdev->KMDriver, + IOCTL_VIDEO_UNMAP_VIDEO_MEMORY, + (PVOID)&VideoMemory, + sizeof(VIDEO_MEMORY), + NULL, + 0, + &ReturnedDataLength)) + { + DbgPrint("Failed to unmap video memory.\n"); + DbgBreakPoint(); + return(FALSE); + } + return(TRUE); +} + BOOL InitVGA(PPDEV ppdev, BOOL bFirst) { ULONG ReturnedDataLength; + VIDEO_MEMORY VideoMemory; + VIDEO_MEMORY_INFORMATION VideoMemoryInfo; ppdev->sizeSurf.cx = 640; ppdev->sizeSurf.cy = 480; @@ -142,11 +167,7 @@ BOOL InitVGA(PPDEV ppdev, BOOL bFirst) return(FALSE); } -/* - -gotta fix this up.. it prevents drawing to vidmem right now - - if (bFirst) { + if (bFirst) { // map video memory into virtual memory VideoMemory.RequestedVirtualAddress = NULL; @@ -162,7 +183,8 @@ gotta fix this up.. it prevents drawing to vidmem right now } ppdev->fbScreen = VideoMemoryInfo.FrameBufferBase; + vidmem = (PUCHAR)ppdev->fbScreen; } -*/ + return TRUE; } diff --git a/reactos/drivers/video/displays/vga/vgaddi.h b/reactos/drivers/video/displays/vga/vgaddi.h index 1a00de0b7a1..47ae7ab4c55 100644 --- a/reactos/drivers/video/displays/vga/vgaddi.h +++ b/reactos/drivers/video/displays/vga/vgaddi.h @@ -201,6 +201,7 @@ typedef VOID (*PFN_ScreenToScreenBlt)(PDEVSURF, PRECTL, PPOINTL, INT); #define DEVSURF_IDENT ('V' + ('S' << 8) + ('R' << 16) + ('F' << 24)) BOOL InitVGA(PPDEV ppdev, BOOL bFirst); // screen.c: initialize VGA mode +BOOL DeinitVGA(PPDEV ppdev); // screen.c: Free resources allocated in InitVGA #define DRIVER_EXTRA_SIZE 0 #define ALLOC_TAG TAG('D', 'v', 'g', 'a') // Dvga tag From d4bd6869fec25aaa1ad166346f192deb75974543 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Tue, 16 Mar 2004 21:13:15 +0000 Subject: [PATCH 0541/1463] - Removed useless define. svn path=/trunk/; revision=8768 --- reactos/ntoskrnl/mm/mminit.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 4242a46ad4e..f51d19f5015 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -1,4 +1,4 @@ -/* $Id: mminit.c,v 1.60 2004/02/17 23:58:54 tamlin Exp $ +/* $Id: mminit.c,v 1.61 2004/03/16 21:13:15 dwelch Exp $ * * COPYRIGHT: See COPYING in the top directory * PROJECT: ReactOS kernel @@ -25,11 +25,6 @@ /* GLOBALS *****************************************************************/ -/* - * Size of extended memory (kb) (fixed for now) - */ -#define EXTENDED_MEMORY_SIZE (3*1024*1024) - /* * Compiler defined symbols */ From 3db0cc5595c00bbfce162c23ecad673b8fd45671 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Tue, 16 Mar 2004 22:45:56 +0000 Subject: [PATCH 0542/1463] - Map only the vga frame buffer for the hal to write debug messages and map it higher up in the kernel address space so more space is available for the nonpaged and paged pools. svn path=/trunk/; revision=8769 --- reactos/hal/halx86/display.c | 7 +++---- reactos/ntoskrnl/kd/mda.c | 4 ++-- reactos/ntoskrnl/ke/i386/multiboot.S | 13 ++++++++++++- reactos/ntoskrnl/mm/mminit.c | 10 +++++----- 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/reactos/hal/halx86/display.c b/reactos/hal/halx86/display.c index 51785b563b7..2ba9975658c 100644 --- a/reactos/hal/halx86/display.c +++ b/reactos/hal/halx86/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.13 2004/01/18 22:35:26 gdalsnes Exp $ +/* $Id: display.c,v 1.14 2004/03/16 22:45:55 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -577,9 +577,8 @@ HalInitializeDisplay (PLOADER_PARAMETER_BLOCK LoaderBlock) ULONG ScanLines; ULONG Data; - VideoBuffer = (WORD *)(0xd0000000 + 0xb8000); - GraphVideoBuffer = (PUCHAR)(0xd0000000 + 0xa0000); -// VideoBuffer = HalMapPhysicalMemory (0xb8000, 2); + VideoBuffer = (WORD *)(0xff3b8000); + GraphVideoBuffer = (PUCHAR)(0xff3a0000); /* Set cursor position */ // CursorX = LoaderBlock->cursorx; diff --git a/reactos/ntoskrnl/kd/mda.c b/reactos/ntoskrnl/kd/mda.c index 787359ea6ef..872ea398af4 100644 --- a/reactos/ntoskrnl/kd/mda.c +++ b/reactos/ntoskrnl/kd/mda.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: mda.c,v 1.3 2002/09/08 10:23:27 chorns Exp $ +/* $Id: mda.c,v 1.4 2004/03/16 22:45:56 dwelch Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/kd/mda.c @@ -77,7 +77,7 @@ KdInitializeMda(VOID) MdaStatusPort = 0x3ba; MdaGfxPort = 0x3bf; - VideoBuffer = (PUSHORT)(0xd0000000 + 0xb0000); + VideoBuffer = (PUSHORT)(0xff3b0000); MdaCursorX = MdaCursorY = 0; } diff --git a/reactos/ntoskrnl/ke/i386/multiboot.S b/reactos/ntoskrnl/ke/i386/multiboot.S index 8f8191a883e..f50e03a70f6 100644 --- a/reactos/ntoskrnl/ke/i386/multiboot.S +++ b/reactos/ntoskrnl/ke/i386/multiboot.S @@ -139,7 +139,6 @@ _multiboot_entry: movl $(V2P(kernel_pagetable+30*4096) + 0x7), 0xC78(%esi) movl $(V2P(kernel_pagetable+31*4096) + 0x7), 0xC7c(%esi) - movl $(V2P(lowmem_pagetable) + 0x7), 0xD00(%esi) movl $(V2P(startup_pagedirectory) + 0x7), 0xF00(%esi) #ifdef MP movl $(V2P(apic_pagetable) + 0x7), 0xFEC(%esi) @@ -200,6 +199,18 @@ _multiboot_entry: movl $0x1007, %eax movl %eax, (%esi, %edi) + /* + * Initialize a part of the same pagetable to map the vga frame buffer. + */ + movl $0xa0007, %eax + movl $0x20, %ecx + movl $0xE80, %edi +.l9: + movl %eax, (%esi, %edi) + add $4, %edi + add $0x1000, %eax + loop .l9 + #ifdef MP .m1: diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index f51d19f5015..10e43f6bf0a 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -1,4 +1,4 @@ -/* $Id: mminit.c,v 1.61 2004/03/16 21:13:15 dwelch Exp $ +/* $Id: mminit.c,v 1.62 2004/03/16 22:45:56 dwelch Exp $ * * COPYRIGHT: See COPYING in the top directory * PROJECT: ReactOS kernel @@ -48,7 +48,7 @@ static MEMORY_AREA* kernel_data_desc = NULL; static MEMORY_AREA* kernel_param_desc = NULL; static MEMORY_AREA* kernel_pool_desc = NULL; static MEMORY_AREA* kernel_shared_data_desc = NULL; -static MEMORY_AREA* kernel_mapped_low_mem_desc = NULL; +static MEMORY_AREA* kernel_mapped_vga_framebuffer_desc = NULL; static MEMORY_AREA* MiKernelMapDescriptor = NULL; static MEMORY_AREA* MiPagedPoolDescriptor = NULL; @@ -146,14 +146,14 @@ MmInitVirtualMemory(ULONG LastKernelAddress, FALSE, BoundaryAddressMultiple); - BaseAddress = (PVOID)0xd0000000; + BaseAddress = (PVOID)0xFF3A0000; MmCreateMemoryArea(NULL, MmGetKernelAddressSpace(), MEMORY_AREA_SYSTEM, &BaseAddress, - 0x100000, + 0x20000, 0, - &kernel_mapped_low_mem_desc, + &kernel_mapped_vga_framebuffer_desc, FALSE, FALSE, BoundaryAddressMultiple); From 820df5cbe575f0197dddce507533e23e0d2525e1 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Tue, 16 Mar 2004 22:49:29 +0000 Subject: [PATCH 0543/1463] use alloca() to pass NOTIFYICONDATA structures of any size svn path=/trunk/; revision=8770 --- reactos/lib/shell32/ros-systray.c | 41 +++++++++++++++---------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/reactos/lib/shell32/ros-systray.c b/reactos/lib/shell32/ros-systray.c index 5ca1580b144..41f07aacb5d 100644 --- a/reactos/lib/shell32/ros-systray.c +++ b/reactos/lib/shell32/ros-systray.c @@ -20,6 +20,7 @@ */ #include <stdarg.h> +#include <malloc.h> #include "windef.h" #include "winbase.h" @@ -28,17 +29,11 @@ /* copy data structure for tray notifications */ -typedef struct TrayNotifyCDSA { +typedef struct TrayNotifyCDS_Dummy { DWORD cookie; DWORD notify_code; - NOTIFYICONDATAA nicon_data; -} TrayNotifyCDSA; - -typedef struct TrayNotifyCDSW { - DWORD cookie; - DWORD notify_code; - NOTIFYICONDATAW nicon_data; -} TrayNotifyCDSW; + DWORD nicon_data[1]; // placeholder for NOTIFYICONDATA structure +} TrayNotifyCDS_Dummy; /************************************************************************* @@ -49,17 +44,19 @@ BOOL WINAPI Shell_NotifyIconA(DWORD dwMessage, PNOTIFYICONDATAA pnid) { HWND hwnd; COPYDATASTRUCT data; - TrayNotifyCDSA notify_data; + TrayNotifyCDS_Dummy* pnotify_data; BOOL ret = FALSE; - notify_data.cookie = 1; - notify_data.notify_code = dwMessage; - memcpy(¬ify_data.nicon_data, pnid, sizeof(NOTIFYICONDATAA)); + pnotify_data = (TrayNotifyCDS_Dummy*) alloca(sizeof(TrayNotifyCDS_Dummy)-sizeof(DWORD)+pnid->cbSize); + + pnotify_data->cookie = 1; + pnotify_data->notify_code = dwMessage; + memcpy(&pnotify_data->nicon_data, pnid, pnid->cbSize); data.dwData = 1; - data.cbData = sizeof(notify_data); - data.lpData = ¬ify_data; + data.cbData = pnid->cbSize; + data.lpData = pnotify_data; for(hwnd=0; hwnd=FindWindowExA(0, hwnd, "Shell_TrayWnd", NULL); ) { if (SendMessageA(hwnd, WM_COPYDATA, (WPARAM)pnid->hWnd, (LPARAM)&data)) @@ -76,17 +73,19 @@ BOOL WINAPI Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW pnid) { HWND hwnd; COPYDATASTRUCT data; - TrayNotifyCDSW notify_data; + TrayNotifyCDS_Dummy* pnotify_data; BOOL ret = FALSE; - notify_data.cookie = 1; - notify_data.notify_code = dwMessage; - memcpy(¬ify_data.nicon_data, pnid, sizeof(NOTIFYICONDATAW)); + pnotify_data = (TrayNotifyCDS_Dummy*) alloca(sizeof(TrayNotifyCDS_Dummy)-sizeof(DWORD)+pnid->cbSize); + + pnotify_data->cookie = 1; + pnotify_data->notify_code = dwMessage; + memcpy(&pnotify_data->nicon_data, pnid, pnid->cbSize); data.dwData = 1; - data.cbData = sizeof(notify_data); - data.lpData = ¬ify_data; + data.cbData = pnid->cbSize; + data.lpData = pnotify_data; for(hwnd=0; hwnd=FindWindowExW(0, hwnd, L"Shell_TrayWnd", NULL); ) { if (SendMessageW(hwnd, WM_COPYDATA, (WPARAM)pnid->hWnd, (LPARAM)&data)) From cdfa901068dcd2a0a96a0bddc7587d5448898451 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Tue, 16 Mar 2004 23:18:10 +0000 Subject: [PATCH 0544/1463] simplify Shell_NotifyIcon implementation svn path=/trunk/; revision=8771 --- reactos/lib/shell32/ros-systray.c | 72 ++++++++++++------------------- 1 file changed, 28 insertions(+), 44 deletions(-) diff --git a/reactos/lib/shell32/ros-systray.c b/reactos/lib/shell32/ros-systray.c index 41f07aacb5d..f8f418799b1 100644 --- a/reactos/lib/shell32/ros-systray.c +++ b/reactos/lib/shell32/ros-systray.c @@ -35,6 +35,32 @@ typedef struct TrayNotifyCDS_Dummy { DWORD nicon_data[1]; // placeholder for NOTIFYICONDATA structure } TrayNotifyCDS_Dummy; + /* The only difference between Shell_NotifyIconA and Shell_NotifyIconW is the call to SendMessageA/W. */ +static BOOL SHELL_NotifyIcon(DWORD dwMessage, void* pnid, HWND nid_hwnd, int nid_size, BOOL unicode) +{ + HWND hwnd; + COPYDATASTRUCT data; + + BOOL ret = FALSE; + int len = sizeof(TrayNotifyCDS_Dummy)-sizeof(DWORD)+nid_size; + + TrayNotifyCDS_Dummy* pnotify_data = (TrayNotifyCDS_Dummy*) alloca(len); + + pnotify_data->cookie = 1; + pnotify_data->notify_code = dwMessage; + memcpy(&pnotify_data->nicon_data, pnid, nid_size); + + data.dwData = 1; + data.cbData = len; + data.lpData = pnotify_data; + + for(hwnd=0; hwnd=FindWindowExW(0, hwnd, L"Shell_TrayWnd", NULL); ) + if ((unicode?SendMessageW:SendMessageA)(hwnd, WM_COPYDATA, (WPARAM)nid_hwnd, (LPARAM)&data)) + ret = TRUE; + + return ret; +} + /************************************************************************* * Shell_NotifyIcon [SHELL32.296] @@ -42,28 +68,7 @@ typedef struct TrayNotifyCDS_Dummy { */ BOOL WINAPI Shell_NotifyIconA(DWORD dwMessage, PNOTIFYICONDATAA pnid) { - HWND hwnd; - COPYDATASTRUCT data; - TrayNotifyCDS_Dummy* pnotify_data; - - BOOL ret = FALSE; - - pnotify_data = (TrayNotifyCDS_Dummy*) alloca(sizeof(TrayNotifyCDS_Dummy)-sizeof(DWORD)+pnid->cbSize); - - pnotify_data->cookie = 1; - pnotify_data->notify_code = dwMessage; - memcpy(&pnotify_data->nicon_data, pnid, pnid->cbSize); - - data.dwData = 1; - data.cbData = pnid->cbSize; - data.lpData = pnotify_data; - - for(hwnd=0; hwnd=FindWindowExA(0, hwnd, "Shell_TrayWnd", NULL); ) { - if (SendMessageA(hwnd, WM_COPYDATA, (WPARAM)pnid->hWnd, (LPARAM)&data)) - ret = TRUE; - } - - return ret; + return SHELL_NotifyIcon(dwMessage, pnid, pnid->hWnd, pnid->cbSize, FALSE); } /************************************************************************* @@ -71,26 +76,5 @@ BOOL WINAPI Shell_NotifyIconA(DWORD dwMessage, PNOTIFYICONDATAA pnid) */ BOOL WINAPI Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW pnid) { - HWND hwnd; - COPYDATASTRUCT data; - TrayNotifyCDS_Dummy* pnotify_data; - - BOOL ret = FALSE; - - pnotify_data = (TrayNotifyCDS_Dummy*) alloca(sizeof(TrayNotifyCDS_Dummy)-sizeof(DWORD)+pnid->cbSize); - - pnotify_data->cookie = 1; - pnotify_data->notify_code = dwMessage; - memcpy(&pnotify_data->nicon_data, pnid, pnid->cbSize); - - data.dwData = 1; - data.cbData = pnid->cbSize; - data.lpData = pnotify_data; - - for(hwnd=0; hwnd=FindWindowExW(0, hwnd, L"Shell_TrayWnd", NULL); ) { - if (SendMessageW(hwnd, WM_COPYDATA, (WPARAM)pnid->hWnd, (LPARAM)&data)) - ret = TRUE; - } - - return ret; + return SHELL_NotifyIcon(dwMessage, pnid, pnid->hWnd, pnid->cbSize, TRUE); } From b17d04d3a2d1dfeb20fcfc38eff843c9a5fe9029 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Wed, 17 Mar 2004 01:27:00 +0000 Subject: [PATCH 0545/1463] Moved the WINE notepad to rosapps svn path=/trunk/; revision=8772 --- reactos/apps/dist/notepad/.cvsignore | 11 - reactos/apps/dist/notepad/Da.rc | 126 ----- reactos/apps/dist/notepad/De.rc | 129 ----- reactos/apps/dist/notepad/En.rc | 129 ----- reactos/apps/dist/notepad/Es.rc | 130 ----- reactos/apps/dist/notepad/Fi.rc | 126 ----- reactos/apps/dist/notepad/Fr.rc | 129 ----- reactos/apps/dist/notepad/Hu.rc | 128 ----- reactos/apps/dist/notepad/It.rc | 130 ----- reactos/apps/dist/notepad/License_En.c | 28 - reactos/apps/dist/notepad/Nl.rc | 126 ----- reactos/apps/dist/notepad/Pt.rc | 129 ----- reactos/apps/dist/notepad/Ru.rc | 124 ---- reactos/apps/dist/notepad/Si.rc | 125 ----- reactos/apps/dist/notepad/Sk.rc | 127 ----- reactos/apps/dist/notepad/Sw.rc | 127 ----- reactos/apps/dist/notepad/Th.rc | 121 ---- reactos/apps/dist/notepad/Wa.rc | 130 ----- reactos/apps/dist/notepad/Zh.rc | 123 ---- reactos/apps/dist/notepad/dialog.c | 717 ------------------------ reactos/apps/dist/notepad/dialog.h | 57 -- reactos/apps/dist/notepad/license.c | 40 -- reactos/apps/dist/notepad/license.h | 52 -- reactos/apps/dist/notepad/main.c | 354 ------------ reactos/apps/dist/notepad/main.h | 53 -- reactos/apps/dist/notepad/makefile | 27 - reactos/apps/dist/notepad/notepad.ico | Bin 22534 -> 0 bytes reactos/apps/dist/notepad/notepad.rc | 3 - reactos/apps/dist/notepad/notepad_res.h | 78 --- reactos/apps/dist/notepad/rsrc.rc | 58 -- reactos/apps/dist/notepad/small.ico | Bin 22534 -> 0 bytes 31 files changed, 3637 deletions(-) delete mode 100644 reactos/apps/dist/notepad/.cvsignore delete mode 100644 reactos/apps/dist/notepad/Da.rc delete mode 100644 reactos/apps/dist/notepad/De.rc delete mode 100644 reactos/apps/dist/notepad/En.rc delete mode 100644 reactos/apps/dist/notepad/Es.rc delete mode 100644 reactos/apps/dist/notepad/Fi.rc delete mode 100644 reactos/apps/dist/notepad/Fr.rc delete mode 100644 reactos/apps/dist/notepad/Hu.rc delete mode 100644 reactos/apps/dist/notepad/It.rc delete mode 100644 reactos/apps/dist/notepad/License_En.c delete mode 100644 reactos/apps/dist/notepad/Nl.rc delete mode 100644 reactos/apps/dist/notepad/Pt.rc delete mode 100644 reactos/apps/dist/notepad/Ru.rc delete mode 100644 reactos/apps/dist/notepad/Si.rc delete mode 100644 reactos/apps/dist/notepad/Sk.rc delete mode 100644 reactos/apps/dist/notepad/Sw.rc delete mode 100644 reactos/apps/dist/notepad/Th.rc delete mode 100644 reactos/apps/dist/notepad/Wa.rc delete mode 100644 reactos/apps/dist/notepad/Zh.rc delete mode 100644 reactos/apps/dist/notepad/dialog.c delete mode 100644 reactos/apps/dist/notepad/dialog.h delete mode 100644 reactos/apps/dist/notepad/license.c delete mode 100644 reactos/apps/dist/notepad/license.h delete mode 100644 reactos/apps/dist/notepad/main.c delete mode 100644 reactos/apps/dist/notepad/main.h delete mode 100644 reactos/apps/dist/notepad/makefile delete mode 100644 reactos/apps/dist/notepad/notepad.ico delete mode 100644 reactos/apps/dist/notepad/notepad.rc delete mode 100644 reactos/apps/dist/notepad/notepad_res.h delete mode 100644 reactos/apps/dist/notepad/rsrc.rc delete mode 100644 reactos/apps/dist/notepad/small.ico diff --git a/reactos/apps/dist/notepad/.cvsignore b/reactos/apps/dist/notepad/.cvsignore deleted file mode 100644 index 4aed8fdf4f7..00000000000 --- a/reactos/apps/dist/notepad/.cvsignore +++ /dev/null @@ -1,11 +0,0 @@ -*.o -*.d -*.exe -*.coff -*.sym -*.map -notepad.nostrip.exe -notepad.ncb -notepad.suo -notepad.exe -Release \ No newline at end of file diff --git a/reactos/apps/dist/notepad/Da.rc b/reactos/apps/dist/notepad/Da.rc deleted file mode 100644 index ee68ae2b12c..00000000000 --- a/reactos/apps/dist/notepad/Da.rc +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Notepad (Danish resources) - * - * Copyright 1998 Henrik Olsen <henrik@iaeste.dk> - * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> - * - * 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_DANISH, SUBLANG_DEFAULT - -MAIN_MENU MENU -{ - POPUP "&Filef" { - MENUITEM "&Ny...", CMD_NEW - MENUITEM "&bn\tEnter", CMD_OPEN - MENUITEM "&Gem", CMD_SAVE - MENUITEM "Gem so&m...", CMD_SAVE_AS - MENUITEM "&Udskriv", CMD_PRINT - MENUITEM "Side&ops鎡ning...", CMD_PAGE_SETUP - MENUITEM "&Indstil printer...", CMD_PRINTER_SETUP - MENUITEM SEPARATOR - MENUITEM "&Afslut", CMD_EXIT - } -POPUP "&Rediger" { - MENUITEM "&Fortryd\tCtrl+Z", CMD_UNDO - MENUITEM SEPARATOR - MENUITEM "&Klip\tCtrl+X", CMD_CUT - MENUITEM "K&opier\tCtrl+C", CMD_COPY - MENUITEM "S鎡 &ind\tCtrl+V", CMD_PASTE - MENUITEM "&Slet\tDel", CMD_DELETE - MENUITEM SEPARATOR - MENUITEM "Marker &alt", CMD_SELECT_ALL - MENUITEM "&Dato/tid\tF5", CMD_TIME_DATE - MENUITEM SEPARATOR - MENUITEM "Automatisk &linjeskift", CMD_WRAP - } -POPUP "&S鴊" { - MENUITEM "&S鴊...", CMD_SEARCH - MENUITEM "&Find n鎠te\tF3", CMD_SEARCH_NEXT - } -POPUP "&Hj鎙p" { - MENUITEM "&Indhold", CMD_HELP_CONTENTS - MENUITEM "&S鴊 efter hj鎙p om...", CMD_HELP_SEARCH - MENUITEM "&Brug af Hj鎙p", CMD_HELP_ON_HELP - MENUITEM SEPARATOR - POPUP "&Om Notesblok..." { - MENUITEM "&Licens", CMD_LICENSE - MENUITEM "&NO WARRANTY", CMD_NO_WARRANTY - MENUITEM "&Om WINE", CMD_ABOUT_WINE - } - } -} - -/* Dialog `Page setup' */ - -DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -FONT 8, "Helv" -CAPTION "Sideops鎡ning" -{ -LTEXT "&Sidehoved:", 0x140, 10, 07, 40, 15 -EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP -LTEXT "Side&fod:", 0x142, 10, 24, 40, 15 -EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP - -GROUPBOX "Margener:", 0x144, 10, 43,160, 45 -LTEXT "&Venstre:", 0x145, 20, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Top:", 0x148, 20, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&H鴍re:", 0x14B, 100, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Bund:", 0x14E,100, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP - -DEFPUSHBUTTON "OK", 0x151, 180, 3, 40, 15, WS_TABSTOP -PUSHBUTTON "Annuller", 0x152, 180, 21, 40, 15, WS_TABSTOP -PUSHBUTTON "&Hj鎙p", 0x153, 180, 39, 40, 15, WS_TABSTOP -} - -STRINGTABLE DISCARDABLE -{ -STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ -STRING_PAGESETUP_FOOTERVALUE, "Page &s" /* FIXME */ -STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ -STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ - -STRING_NOTEPAD, "Notesblok" -STRING_ERROR, "FEJL" -STRING_WARNING, "ADVARSEL" -STRING_INFO, "Information" - -STRING_UNTITLED, "(ikke-navngivet)" - -STRING_ALL_FILES, "Alle filer (*.*)" -STRING_TEXT_FILES_TXT, "Tekst filer (*.txt)" - -STRING_TOOLARGE, "Filen '%s' er for stor til Notesblok. \ -\nBrug en anden editor til at redigere filen." -STRING_NOTEXT, "Du har ikke skrevet noget tekst. \ -\nSkriv noget tekst, og pr鴙 s igen" -STRING_DOESNOTEXIST, "File '%s'\ndoes not exist\n\n \ -Do you want to create a new file ?" -STRING_NOTSAVED, "File '%s'\nhas been modified\n\n \ -Would you like to save the changes ?" -STRING_NOTFOUND, "Kan ikke finde '%s'." -STRING_OUT_OF_MEMORY, "Der er ikke nok hukommelse til at udf鴕e \ -denne operation. \nAfslut et eller flere aktive programmer for at frig鴕e \ -hukommelse, og pr鴙 s igen." - -} diff --git a/reactos/apps/dist/notepad/De.rc b/reactos/apps/dist/notepad/De.rc deleted file mode 100644 index b39cbc5cf8b..00000000000 --- a/reactos/apps/dist/notepad/De.rc +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Notepad (German resources) - * - * Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch> - * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> - * - * - * 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 - -MAIN_MENU MENU -{ - POPUP "&Datei" { - MENUITEM "&Neu...", CMD_NEW - MENUITEM "&ffnen...", CMD_OPEN - MENUITEM "&Speichern", CMD_SAVE - MENUITEM "Speichern &unter...", CMD_SAVE_AS - MENUITEM "&Drucken", CMD_PRINT - MENUITEM "Seite ein&richten...", CMD_PAGE_SETUP - MENUITEM "Drucker&einrichtung...", CMD_PRINTER_SETUP - MENUITEM SEPARATOR - MENUITEM "&Beenden", CMD_EXIT - } -POPUP "&Bearbeiten" { - MENUITEM "&R點kg鋘gig\tStrg+Z", CMD_UNDO - MENUITEM SEPARATOR - MENUITEM "&Ausschneiden\tStrg+X", CMD_CUT - MENUITEM "&Kopieren\tStrg+C", CMD_COPY - MENUITEM "&Einf黦en\tStrg+V", CMD_PASTE - MENUITEM "&L鰏chen\tEntf", CMD_DELETE - MENUITEM SEPARATOR - MENUITEM "Alles &markieren", CMD_SELECT_ALL - MENUITEM "&Uhrzeit/Datum\tF5", CMD_TIME_DATE - MENUITEM SEPARATOR - MENUITEM "&Zeilenumbruch", CMD_WRAP - } -POPUP "&Suchen" { - MENUITEM "Suchen...", CMD_SEARCH - MENUITEM "&Weitersuchen\tF3", CMD_SEARCH_NEXT - } -POPUP "&Hilfe" { - MENUITEM "&Inhalt", CMD_HELP_CONTENTS - MENUITEM "&Suchen...", CMD_HELP_SEARCH - MENUITEM "&Hilfe benutzen", CMD_HELP_ON_HELP - MENUITEM SEPARATOR - POPUP "Inf&o..." { - MENUITEM "&Lizenz", CMD_LICENSE - MENUITEM "&KEINE GARANTIE", CMD_NO_WARRANTY - MENUITEM "&躡er Wine", CMD_ABOUT_WINE - } - } -} - -/* Dialog `Page setup' */ - -DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -FONT 8, "Helv" -CAPTION "Seite einrichten" -{ -LTEXT "&Kopfzeile:", 0x140, 10, 07, 40, 15 -EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP -LTEXT "&Fu遺eile:", 0x142, 10, 24, 40, 15 -EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP - -GROUPBOX "R鋘der", 0x144, 10, 43,160, 45 -LTEXT "&Links:", 0x145, 20, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Oben:", 0x148, 20, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Rechts:", 0x14B, 100, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Unten:", 0x14E,100, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP - -DEFPUSHBUTTON "OK", 0x151, 180, 3, 40, 15, WS_TABSTOP -PUSHBUTTON "Abbrechen", 0x152, 180, 21, 40, 15, WS_TABSTOP -PUSHBUTTON "&Hilfe", 0x153, 180, 39, 40, 15, WS_TABSTOP -} - -STRINGTABLE DISCARDABLE -{ -STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ -STRING_PAGESETUP_FOOTERVALUE, "Page &s" /* FIXME */ -STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ -STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ - -STRING_NOTEPAD, "Editor" -STRING_ERROR, "FEHLER" -STRING_WARNING, "ACHTUNG" -STRING_INFO, "Information" - -STRING_UNTITLED, "(unbenannt)" - -STRING_ALL_FILES, "Alle Dateien (*.*)" -STRING_TEXT_FILES_TXT, "Textdateien (*.txt)" - -STRING_TOOLARGE, "'%s' ist zu gross f黵 den Editor\n \ -Benutzen Sie bitte einen anderen Editor, um diese Datei zu bearbeiten." -STRING_NOTEXT, "Sie haben keinen Text eingegeben, der \ -gespeichert\n werden k鰊nte. Geben Sie Text ein, und versuchen Sie es \ -\nerneut." -STRING_DOESNOTEXIST, "File '%s'\ndoes not exist\n\n \ -Do you want to create a new file ?" -STRING_NOTSAVED, "Datei %s\n wurde geaendert.\n\n \ -Moechten Sie die Aenderungen speichern ?" -STRING_NOTFOUND, "'%s' kann nicht gefunden werden." -STRING_OUT_OF_MEMORY, "Nicht gen黦end Arbeitsspeicher, \ -um diese Funktion \nabzuschlie遝n. Beenden Sie eine oder mehrere \ -\nAnwendungen, um den verf黦baren Arbeitsspeicher zu \nerh鰄en." - - -} diff --git a/reactos/apps/dist/notepad/En.rc b/reactos/apps/dist/notepad/En.rc deleted file mode 100644 index 9debe253544..00000000000 --- a/reactos/apps/dist/notepad/En.rc +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Notepad (English resources) - * - * Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch> - * Proofread 1998 by David Lee Lambert <lamber45@egr.msu.edu> - * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> - * - * 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_ENGLISH, SUBLANG_DEFAULT - -MAIN_MENU MENU -{ - POPUP "&File" { - MENUITEM "&New...", CMD_NEW - MENUITEM "&Open\tCtrl+O", CMD_OPEN - MENUITEM "&Save\tCtrl+S", CMD_SAVE - MENUITEM "Save &as...", CMD_SAVE_AS - MENUITEM SEPARATOR - MENUITEM "&Print", CMD_PRINT - MENUITEM "Page Se&tup...", CMD_PAGE_SETUP - MENUITEM "P&rinter Setup...", CMD_PRINTER_SETUP - MENUITEM SEPARATOR - MENUITEM "E&xit", CMD_EXIT - } -POPUP "&Edit" { - MENUITEM "&Undo\tCtrl+Z", CMD_UNDO - MENUITEM SEPARATOR - MENUITEM "Cu&t\tCtrl+X", CMD_CUT - MENUITEM "&Copy\tCtrl+C", CMD_COPY - MENUITEM "&Paste\tCtrl+V", CMD_PASTE - MENUITEM "&Delete\tDel", CMD_DELETE - MENUITEM SEPARATOR - MENUITEM "Select &all\tCtrl+A", CMD_SELECT_ALL - MENUITEM "&Time/Date\tF5", CMD_TIME_DATE - MENUITEM SEPARATOR - MENUITEM "&Wrap long lines", CMD_WRAP - MENUITEM "&Font...", CMD_FONT - } -POPUP "&Search" { - MENUITEM "&Search\tCtrl+F", CMD_SEARCH - MENUITEM "&Search next\tF3", CMD_SEARCH_NEXT - } -POPUP "&Help" { - MENUITEM "&Contents", CMD_HELP_CONTENTS - MENUITEM "&Search...", CMD_HELP_SEARCH - MENUITEM "&Help on help", CMD_HELP_ON_HELP - MENUITEM SEPARATOR - POPUP "Inf&o..." { - MENUITEM "&License", CMD_LICENSE - MENUITEM "&NO WARRANTY", CMD_NO_WARRANTY - MENUITEM "&About Wine", CMD_ABOUT_WINE - } - } -} - -/* Dialog `Page setup' */ - -DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -FONT 8, "Helv" -CAPTION "Page Setup" -{ -LTEXT "&Header:", 0x140, 10, 07, 40, 15 -EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP -LTEXT "&Footer:", 0x142, 10, 24, 40, 15 -EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP - -GROUPBOX "&Margins:", 0x144, 10, 43,160, 45 -LTEXT "&Left:", 0x145, 20, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Top:", 0x148, 20, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Right:", 0x14B, 100, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Bottom:", 0x14E,100, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP - -DEFPUSHBUTTON "OK", 0x151, 180, 3, 40, 15, WS_TABSTOP -PUSHBUTTON "Cancel", 0x152, 180, 21, 40, 15, WS_TABSTOP -PUSHBUTTON "&Help", 0x153, 180, 39, 40, 15, WS_TABSTOP -} - -STRINGTABLE DISCARDABLE -{ -STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ -STRING_PAGESETUP_FOOTERVALUE, "Page &s" /* FIXME */ -STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ -STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ - -STRING_NOTEPAD, "Notepad" -STRING_ERROR, "ERROR" -STRING_WARNING, "WARNING" -STRING_INFO, "Information" - -STRING_UNTITLED, "(untitled)" - -STRING_ALL_FILES, "All files (*.*)" -STRING_TEXT_FILES_TXT, "Text files (*.txt)" - -STRING_TOOLARGE, "File '%s' is too large for notepad.\n \ -Please use a different editor." -STRING_NOTEXT, "You didn't enter any text. \ -\nPlease type something and try again" -STRING_DOESNOTEXIST, "File '%s'\ndoes not exist\n\n \ -Do you want to create a new file ?" -STRING_NOTSAVED, "File '%s'\nhas been modified\n\n \ -Would you like to save the changes ?" -STRING_NOTFOUND, "'%s' can not be found." -STRING_OUT_OF_MEMORY, "Not enough memory to complete this \ -task. \nClose one or more applications to increase the amount of \nfree \ -memory." - -} diff --git a/reactos/apps/dist/notepad/Es.rc b/reactos/apps/dist/notepad/Es.rc deleted file mode 100644 index 635479d1e79..00000000000 --- a/reactos/apps/dist/notepad/Es.rc +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Notepad (Spanish resources) - * - * Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch> - * Proofread 1998 by David Lee Lambert <lamber45@egr.msu.edu> - * Proofread 1999 by Jose Marcos Lopez <jose.lopez@upcnet.upc.es> - * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> - * Copyright 2003 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 - -MAIN_MENU MENU -{ - POPUP "&Archivo" { - MENUITEM "&Nuevo", CMD_NEW - MENUITEM "&Abrir", CMD_OPEN - MENUITEM "&Guardar", CMD_SAVE - MENUITEM "Guardar &como...", CMD_SAVE_AS - MENUITEM "&Imprimir", CMD_PRINT - MENUITEM "Configurar &p醙ina...", CMD_PAGE_SETUP - MENUITEM "Configuraci髇 &impresora...", CMD_PRINTER_SETUP - MENUITEM SEPARATOR - MENUITEM "&Salir", CMD_EXIT - } -POPUP "&Editar" { - MENUITEM "&Deshacer\tCtrl+Z", CMD_UNDO - MENUITEM SEPARATOR - MENUITEM "Cor&tar\tCtrl+X", CMD_CUT - MENUITEM "&Copiar\tCtrl+C", CMD_COPY - MENUITEM "&Pegar\tCtrl+V", CMD_PASTE - MENUITEM "&Borrar\tDel", CMD_DELETE - MENUITEM SEPARATOR - MENUITEM "Seleccionar t&odo", CMD_SELECT_ALL - MENUITEM "&Hora y Fecha\tF5", CMD_TIME_DATE - MENUITEM SEPARATOR - MENUITEM "&Ajuste de l韓ea autom醫ico", CMD_WRAP - } -POPUP "&Buscar" { - MENUITEM "&Buscar...", CMD_SEARCH - MENUITEM "Buscar &siguiente\tF3", CMD_SEARCH_NEXT - } -POPUP "&Ayuda" { - MENUITEM "&ndice", CMD_HELP_CONTENTS - MENUITEM "&Buscar...", CMD_HELP_SEARCH - MENUITEM "A&yuda sobre la ayuda", CMD_HELP_ON_HELP - MENUITEM SEPARATOR - POPUP "&Informaci髇..." { - MENUITEM "&Licencia", CMD_LICENSE - MENUITEM "SIN &GARANT虯", CMD_NO_WARRANTY - MENUITEM "&Acerca de Wine", CMD_ABOUT_WINE - } - } -} - -/* Dialog `Page setup' */ - -DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -FONT 8, "Helv" -CAPTION "&Ajuste de p醙ina" -{ -LTEXT "&Cabecera:", 0x140, 10, 07, 40, 15 -EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP -LTEXT "&Pie:", 0x142, 10, 24, 40, 15 -EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP - -GROUPBOX "&M醨genes:", 0x144, 10, 43,160, 45 -LTEXT "&Izquierda:", 0x145, 20, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "A&rriba:", 0x148, 20, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Derecha:", 0x14B, 100, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "Aba&jo:", 0x14E,100, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP - -DEFPUSHBUTTON "Aceptar", 0x151, 180, 3, 40, 15, WS_TABSTOP -PUSHBUTTON "Cancelar", 0x152, 180, 21, 40, 15, WS_TABSTOP -PUSHBUTTON "&Ayuda", 0x153, 180, 39, 40, 15, WS_TABSTOP -} - -STRINGTABLE DISCARDABLE -{ -STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ -STRING_PAGESETUP_FOOTERVALUE, "P醙ina &s" /* FIXME */ -STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ -STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ - -STRING_NOTEPAD, "Bloc de Notas" -STRING_ERROR, "ERROR" -STRING_WARNING, "ADVERTENCIA" -STRING_INFO, "Informaci髇" - -STRING_UNTITLED, "(sin t韙ulo)" - -STRING_ALL_FILES, "Todos los archivos (*.*)" -STRING_TEXT_FILES_TXT, "Documentos de texto (*.txt)" - -STRING_TOOLARGE, "El archivo '%s' es demasiado grande para el bloc de notas.\n \ -Use otro editor." -STRING_NOTEXT, "No escribi nada. \ -\nPor favor escriba algo y pruebe de nuevo" -STRING_DOESNOTEXIST, "El archivo '%s'\nno existe\n\n \ -緿esea crear un nuevo archivo?" -STRING_NOTSAVED, "El texto en el archivo '%s' ha cambiado\n\n \ -緿esea guardar los cambios?" -STRING_NOTFOUND, "no se encontr '%s'." -STRING_OUT_OF_MEMORY, "No hay suficiente memoria para terminar \ -esta tarea. \nCierre una o m醩 aplicaciones para aumentar la cantidad \nde \ -memoria libre." - - -} diff --git a/reactos/apps/dist/notepad/Fi.rc b/reactos/apps/dist/notepad/Fi.rc deleted file mode 100644 index ffefa707925..00000000000 --- a/reactos/apps/dist/notepad/Fi.rc +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Notepad (Finnish resources) - * - * Copyright 1999 by Jukka Iivonen <iivonen@iki.fi> - * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> - * - * 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_FINNISH, SUBLANG_DEFAULT - -MAIN_MENU MENU -{ - POPUP "&Tiedosto" { - MENUITEM "&Uusi...", CMD_NEW - MENUITEM "&Avaa", CMD_OPEN - MENUITEM "Ta&lleta", CMD_SAVE - MENUITEM "Talleta &nimell...", CMD_SAVE_AS - MENUITEM "T&ulosta", CMD_PRINT - MENUITEM "&Sivun asetukset...", CMD_PAGE_SETUP - MENUITEM "&Kirjoittimen asetukset...", CMD_PRINTER_SETUP - MENUITEM SEPARATOR - MENUITEM "&Poistu", CMD_EXIT - } -POPUP "&Muokkaa" { - MENUITEM "&Palauta\tCtrl+Z", CMD_UNDO - MENUITEM SEPARATOR - MENUITEM "&Leikkaa\tCtrl+X", CMD_CUT - MENUITEM "&Kopioi\tCtrl+C", CMD_COPY - MENUITEM "L&iit鋅tCtrl+V", CMD_PASTE - MENUITEM "P&oista\tDel", CMD_DELETE - MENUITEM SEPARATOR - MENUITEM "&Valitse kaikki", CMD_SELECT_ALL - MENUITEM "&Aika/P鋓v鋗滗r鋅tF5", CMD_TIME_DATE - MENUITEM SEPARATOR - MENUITEM "Ka&tkaise pitk rivi", CMD_WRAP - } -POPUP "&Etsi" { - MENUITEM "Etsi...", CMD_SEARCH - MENUITEM "Etsi &seuraava\tF3", CMD_SEARCH_NEXT - } -POPUP "&Apua" { - MENUITEM "&Sis鋖t", CMD_HELP_CONTENTS - MENUITEM "&Etsi...", CMD_HELP_SEARCH - MENUITEM "Apua &Opastuksesta", CMD_HELP_ON_HELP - MENUITEM SEPARATOR - POPUP "Inf&o..." { - MENUITEM "&Lisenssi", CMD_LICENSE - MENUITEM "&EI TAKUUTA", CMD_NO_WARRANTY - MENUITEM "&Tietoja Wine:ista", CMD_ABOUT_WINE - } - } -} - -/* Dialog `Page setup' */ - -DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -FONT 8, "Helv" -CAPTION "Sivun asetukset" -{ -LTEXT "&Yl鋙tsikko:", 0x140, 10, 07, 40, 15 -EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP -LTEXT "Alao&tsikko:", 0x142, 10, 24, 40, 15 -EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP - -GROUPBOX "&Marginaali:", 0x144, 10, 43,160, 45 -LTEXT "&Vasen:", 0x145, 20, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "Y&l:", 0x148, 20, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Oikea:", 0x14B, 100, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Ala:", 0x14E,100, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP - -DEFPUSHBUTTON "OK", 0x151, 180, 3, 40, 15, WS_TABSTOP -PUSHBUTTON "Peruuta", 0x152, 180, 21, 40, 15, WS_TABSTOP -PUSHBUTTON "&Apua", 0x153, 180, 39, 40, 15, WS_TABSTOP -} - -STRINGTABLE DISCARDABLE -{ -STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ -STRING_PAGESETUP_FOOTERVALUE, "Sivu &s" /* FIXME */ -STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ -STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ - -STRING_NOTEPAD, "Notepad" -STRING_ERROR, "VIRHE" -STRING_WARNING, "VAROITUS" -STRING_INFO, "Tiedoitus" - -STRING_UNTITLED, "(otsikoimaton)" - -STRING_ALL_FILES, "Kaikki tiedostot (*.*)" -STRING_TEXT_FILES_TXT, "Teksti tiedostot (*.txt)" - -STRING_TOOLARGE, "Tiedosto '%s' on liian suuri.\n \ -Please use a different editor." -STRING_NOTEXT, "Et sy鰐t鋘yt lainkaan teksti. \ -\nKirjoita jotain ja yrit uudelleen" -STRING_DOESNOTEXIST, "File '%s'\ndoes not exist\n\n \ -Do you want to create a new file ?" -STRING_NOTSAVED, "File '%s'\nhas been modified\n\n \ -Would you like to save the changes ?" -STRING_NOTFOUND, "'%s' ei l鰕dy." -STRING_OUT_OF_MEMORY, "Muistia ei ole riitt鋠鋝ti t鋗鋘 \ -\nteht鋠鋘 tekemiseksi. Sulje jokin sovellus vapauttaaksesi\n \ -muistia." - -} diff --git a/reactos/apps/dist/notepad/Fr.rc b/reactos/apps/dist/notepad/Fr.rc deleted file mode 100644 index 8aa233ecfcb..00000000000 --- a/reactos/apps/dist/notepad/Fr.rc +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Notepad (French resources) - * - * Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch> - * Translation by Laurent Buffler <laurent@bluewin.ch> - * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> - * - * 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_FRENCH, SUBLANG_NEUTRAL - -MAIN_MENU MENU -{ - POPUP "&Fichier" { - MENUITEM "&Nouveau...", CMD_NEW - MENUITEM "&Ouvrir\tCtrl+O", CMD_OPEN - MENUITEM "&Enregistrer\tCtrl+S", CMD_SAVE - MENUITEM "Enregistrer &sous...", CMD_SAVE_AS - MENUITEM SEPARATOR - MENUITEM "Im&primer", CMD_PRINT - MENUITEM "&Mise en page...", CMD_PAGE_SETUP - MENUITEM "&Configuration de l'imprimante...", CMD_PRINTER_SETUP - MENUITEM SEPARATOR - MENUITEM "&Quitter", CMD_EXIT - } -POPUP "&Edition" { - MENUITEM "&Annuler\tCtrl+Z", CMD_UNDO - MENUITEM SEPARATOR - MENUITEM "Co&uper\tCtrl+X", CMD_CUT - MENUITEM "&Copier\tCtrl+C", CMD_COPY - MENUITEM "C&oller\tCtrl+V", CMD_PASTE - MENUITEM "&Effacer\tDel", CMD_DELETE - MENUITEM SEPARATOR - MENUITEM "Tout &s閘ectionner\tCtrl+A", CMD_SELECT_ALL - MENUITEM "&Heure/Date\tF5", CMD_TIME_DATE - MENUITEM SEPARATOR - MENUITEM "&Retour la ligne", CMD_WRAP - MENUITEM "&Police...", CMD_FONT - } -POPUP "&Rechercher" { - MENUITEM "&Rechercher\tCtrl+F", CMD_SEARCH - MENUITEM "&Suivant\tF3", CMD_SEARCH_NEXT - } -POPUP "&Aide" { - MENUITEM "&Sommaire", CMD_HELP_CONTENTS - MENUITEM "&Rechercher...", CMD_HELP_SEARCH - MENUITEM "&Utiliser l'aide", CMD_HELP_ON_HELP - MENUITEM SEPARATOR - POPUP "Inf&o..." { - MENUITEM "&Licence", CMD_LICENSE - MENUITEM "&AUCUNE GARANTIE", CMD_NO_WARRANTY - MENUITEM "&A propos de Wine", CMD_ABOUT_WINE - } - } -} - -/* Dialog `Page setup' */ - -DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -FONT 8, "Helv" -CAPTION "Mise en page" -{ -LTEXT "&En-t阾e :", 0x140, 10, 07, 40, 15 -EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP -LTEXT "&Pied de page :", 0x142, 10, 24, 40, 15 -EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP - -GROUPBOX "&Marges :", 0x144, 10, 43,160, 45 -LTEXT "&Gauche :", 0x145, 20, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Haut :", 0x148, 20, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Droite :", 0x14B, 100, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Bas :", 0x14E,100, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP - -DEFPUSHBUTTON "OK", 0x151, 180, 3, 40, 15, WS_TABSTOP -PUSHBUTTON "Annuler", 0x152, 180, 21, 40, 15, WS_TABSTOP -PUSHBUTTON "&Aide", 0x153, 180, 39, 40, 15, WS_TABSTOP -} - -STRINGTABLE DISCARDABLE -{ -STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ -STRING_PAGESETUP_FOOTERVALUE, "Page &s" /* FIXME */ -STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ -STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ - -STRING_NOTEPAD, "Bloc-notes" -STRING_ERROR, "ERREUR" -STRING_WARNING, "ATTENTION" -STRING_INFO, "Information" - -STRING_UNTITLED, "(sans-titre)" - -STRING_ALL_FILES, "Tous fichiers (*.*)" -STRING_TEXT_FILES_TXT, "Fichiers texte (*.txt)" - -STRING_TOOLARGE, "Le fichier '%s' est trop grand pour le bloc-notes.\n \ -Veuillez utiliser un autre 閐iteur." -STRING_NOTEXT, "Vous n'avez pas entr de texte. \ -Veuillez taper quelque chose et recommencer" -STRING_DOESNOTEXIST, "Le fichier '%s'\nn'existe pas.\n\n \ -Voulez-vous cr閑r un nouveau fichier ?" -STRING_NOTSAVED, "Le fichier '%s'\na 閠 modifi閈n\n \ -Voulez-vous enregistrer vos modifications ?" -STRING_NOTFOUND, "'%s' non trouv." -STRING_OUT_OF_MEMORY, "Pas assez de m閙oire pour compl閠er cette \ -t鈉he. \nFermez une ou plusieurs applications pour lib閞er\n\ -de la m閙oire." - -} diff --git a/reactos/apps/dist/notepad/Hu.rc b/reactos/apps/dist/notepad/Hu.rc deleted file mode 100644 index 0ea976cc197..00000000000 --- a/reactos/apps/dist/notepad/Hu.rc +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Notepad (Hungarian resources) - * - * Copyright 1997,98 Marcel Baur - * Proofread 1998 by David Lee Lambert - * Copyright 2002 Sylvain Petreolle - * Copyright 2002 Zoly Nagy - * - * 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 - */ - -MAIN_MENU MENU LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT -{ - POPUP "&F醞l" { - MENUITEM "&j", CMD_NEW - MENUITEM "Meg&nyit醩...", CMD_OPEN - MENUITEM "&Ment閟", CMD_SAVE - MENUITEM "Ment閟 m&sk閚t...", CMD_SAVE_AS - MENUITEM SEPARATOR - MENUITEM "&Oldalbe醠l韙醩...", CMD_PAGE_SETUP - MENUITEM "Nyom&tat醩...", CMD_PRINT - MENUITEM "Nyomtat &be醠l韙醩...", CMD_PRINTER_SETUP - MENUITEM SEPARATOR - MENUITEM "&Kil閜閟", CMD_EXIT - } -POPUP "S&zerkeszt閟" { - MENUITEM "&Visszavon醩\tCtrl+Z", CMD_UNDO - MENUITEM SEPARATOR - MENUITEM "Kiv&g醩\tCtrl+X", CMD_CUT - MENUITEM "&M醩ol醩\tCtrl+C", CMD_COPY - MENUITEM "&Beilleszt閟\tCtrl+V", CMD_PASTE - MENUITEM "T鰎&l閟\tDel", CMD_DELETE - MENUITEM SEPARATOR - MENUITEM "&Az 鰏szes kijel鰈閟e", CMD_SELECT_ALL - MENUITEM "&Id/d醫um\tF5", CMD_TIME_DATE - MENUITEM SEPARATOR - MENUITEM "&Hossz sorok t鰎del閟e", CMD_WRAP - } -POPUP "&Keres閟" { - MENUITEM "&Keres閟...", CMD_SEARCH - MENUITEM "K鰒e&tkez keres閟e\tF3", CMD_SEARCH_NEXT - } -POPUP "&S鷊" { - MENUITEM "&T閙ak鰎鰇", CMD_HELP_CONTENTS - MENUITEM "&Keres閟...", CMD_HELP_SEARCH - MENUITEM "&Haszn醠at", CMD_HELP_ON_HELP - MENUITEM SEPARATOR - POPUP "Inf&orm醕i..." { - MENUITEM "&Licenc", CMD_LICENSE - MENUITEM "&SEMMI GARANCIA", CMD_NO_WARRANTY - MENUITEM "&Wine n関jegy", CMD_ABOUT_WINE - } - } -} - -/* Dialog `Page setup' */ - -DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 -LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -FONT 8, "Helv" -CAPTION "Oldalbe醠l韙醩" -{ -LTEXT "&Fejl閏:", 0x140, 10, 07, 40, 15 -EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP -LTEXT "&L醔l閏:", 0x142, 10, 24, 40, 15 -EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP - -GROUPBOX "&Marg髃:", 0x144, 10, 43,160, 45 -LTEXT "&Bal:", 0x145, 20, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Fels:", 0x148, 20, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Jobb:", 0x14B, 100, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Als:", 0x14E,100, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP - -DEFPUSHBUTTON "OK", 0x151, 180, 3, 40, 15, WS_TABSTOP -PUSHBUTTON "M間se", 0x152, 180, 21, 40, 15, WS_TABSTOP -PUSHBUTTON "&S鷊", 0x153, 180, 39, 40, 15, WS_TABSTOP -} - -STRINGTABLE DISCARDABLE LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT -{ -STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ -STRING_PAGESETUP_FOOTERVALUE, "Oldalsz醡: &s." /* FIXME */ -STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ -STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ - -STRING_NOTEPAD, "Jegyzett鰉b" -STRING_ERROR, "HIBA" -STRING_WARNING, "FIGYELMEZTET蒘" -STRING_INFO, "Inform醕i" - -STRING_UNTITLED, "(n関telen)" - -STRING_ALL_FILES, "Minden f醞l (*.*)" -STRING_TEXT_FILES_TXT, "Sz鰒egf醞lok (*.txt)" - -STRING_TOOLARGE, "'%s' f醞l t鷏 nagy m閞et.\n \ -K閞em haszn醠jon m醩ik sz鰒egszerkeszt programot." -STRING_NOTEXT, "A sz鰒eg nem tartalmaz karaktert! \ -\nK閞em g閜eljen be n閔醤y karaktert 閟 pr骲醠ja 鷍ra!" -STRING_DOESNOTEXIST, "A megadott '%s'\nf醞l nem l閠ezik!\n\n \ -K韛醤 l閠rehozni 鷍 f醞lt?" -STRING_NOTSAVED, "'%s' f醞l\nm骴osult\n\n \ -Szeretn menteni a v醠toz醩okat?" -STRING_NOTFOUND, "'%s' nem tal醠hat!" -STRING_OUT_OF_MEMORY, "Nincs elegend szabad mem髍ia!\ -\nZ醨jon be n閔醤y alkalmaz醩t, ezzel n鰒elve a szabad mem髍ia m閞et閠\ -!" - -} diff --git a/reactos/apps/dist/notepad/It.rc b/reactos/apps/dist/notepad/It.rc deleted file mode 100644 index 65a86012581..00000000000 --- a/reactos/apps/dist/notepad/It.rc +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Notepad (Italian resources) - * - * Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch> - * Proofread 1998 by David Lee Lambert <lamber45@egr.msu.edu> - * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> - * Copyright 2003 Marcelo Duarte - * Copyright 2003 Ivan Leo Murray-Smith <puoti@inwind.it> - * - * 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_ITALIAN, SUBLANG_DEFAULT - -MAIN_MENU MENU -{ - POPUP "&File" { - MENUITEM "&Nuovo", CMD_NEW - MENUITEM "&Apri...\tCtrl+O", CMD_OPEN - MENUITEM "&Salva\tCtrl+S", CMD_SAVE - MENUITEM "Salva &con nome...", CMD_SAVE_AS - MENUITEM SEPARATOR - MENUITEM "&Stampa", CMD_PRINT - MENUITEM "&Imposta pagina...", CMD_PAGE_SETUP - MENUITEM "&Configurazione di stampa...", CMD_PRINTER_SETUP - MENUITEM SEPARATOR - MENUITEM "E&sci", CMD_EXIT - } -POPUP "&Modifica" { - MENUITEM "&Anulla\tCtrl+Z", CMD_UNDO - MENUITEM SEPARATOR - MENUITEM "&Taglia\tCtrl+X", CMD_CUT - MENUITEM "&Copia\tCtrl+C", CMD_COPY - MENUITEM "&Incolla\tCtrl+V", CMD_PASTE - MENUITEM "&Elimina\tDel", CMD_DELETE - MENUITEM SEPARATOR - MENUITEM "Seleziona &tutto\tCtrl+A", CMD_SELECT_ALL - MENUITEM "&Ora/Data\tF5", CMD_TIME_DATE - MENUITEM SEPARATOR - MENUITEM "&A campo automatico", CMD_WRAP - MENUITEM "&Imposta carattere...", CMD_FONT - } -POPUP "&Trova" { - MENUITEM "&Trova\tCtrl+F", CMD_SEARCH - MENUITEM "&Trova successivo\tF3", CMD_SEARCH_NEXT - } -POPUP "&Aiuto" { - MENUITEM "&Contenuti", CMD_HELP_CONTENTS - MENUITEM "&Trova...", CMD_HELP_SEARCH - MENUITEM "&Aiuto sulla Guida", CMD_HELP_ON_HELP - MENUITEM SEPARATOR - POPUP "Inf&o..." { - MENUITEM "&Licenza", CMD_LICENSE - MENUITEM "&Garanzia", CMD_NO_WARRANTY - MENUITEM "&Informazioni sul Blocco Note", CMD_ABOUT_WINE - } - } -} - -/* Dialog `Page setup' */ - -DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -FONT 8, "Helv" -CAPTION "Setup di pagina" -{ -LTEXT "&Note a inizio pagina:", 0x140, 10, 07, 40, 15 -EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP -LTEXT "&Note a pi di pagina:", 0x142, 10, 24, 40, 15 -EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP - -GROUPBOX "&Margini:", 0x144, 10, 43,160, 45 -LTEXT "&Sinistro:", 0x145, 20, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Superiore:", 0x148, 20, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Destro:", 0x14B, 100, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Inferiore:", 0x14E,100, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP - -DEFPUSHBUTTON "OK", 0x151, 180, 3, 40, 15, WS_TABSTOP -PUSHBUTTON "Cancella", 0x152, 180, 21, 40, 15, WS_TABSTOP -PUSHBUTTON "&Aiuto", 0x153, 180, 39, 40, 15, WS_TABSTOP -} - -STRINGTABLE DISCARDABLE -{ -STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ -STRING_PAGESETUP_FOOTERVALUE, "Page &s" /* FIXME */ -STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ -STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ - -STRING_NOTEPAD, "Blocco note" -STRING_ERROR, "ERRORE" -STRING_WARNING, "ATTENZIONE" -STRING_INFO, "Info" - -STRING_UNTITLED, "(senza nome)" - -STRING_ALL_FILES, "Tutti i file (*.*)" -STRING_TEXT_FILES_TXT, "File di testo (*.txt)" - -STRING_TOOLARGE, "Il file '%s' troppo grande per il blocco note.\n \ -Per favore usare un altro editor." -STRING_NOTEXT, "Non stato inserito alcun testo. \ -\nPer favore digitare qualcosa e riprovare" -STRING_DOESNOTEXIST, "Il file '%s'\nnon esiste\n\n \ -Creare un nuovo file ?" -STRING_NOTSAVED, "Il file '%s'\ne' stato modificato\n\n \ -Salvare le modifiche ?" -STRING_NOTFOUND, "'%s' non stato trovato." -STRING_OUT_OF_MEMORY, "Memoria insufficente per completare questa operazione \ -task. \nChiudere una o pi applicazioni per aumentare la quantita'\n di memoria libera." - -} diff --git a/reactos/apps/dist/notepad/License_En.c b/reactos/apps/dist/notepad/License_En.c deleted file mode 100644 index f8ffe140436..00000000000 --- a/reactos/apps/dist/notepad/License_En.c +++ /dev/null @@ -1,28 +0,0 @@ -#include <windows.h> -#include "license.h" - -static const CHAR LicenseCaption_En[] = "LICENSE"; -static const CHAR License_En[] = -"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.\n" - -"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.\n" - -"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"; - -static const CHAR NoWarrantyCaption_En[] = "NO WARRANTY"; -static const CHAR NoWarranty_En[] = -"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."; - -LICENSE WineLicense_En = {License_En, LicenseCaption_En, - NoWarranty_En, NoWarrantyCaption_En}; diff --git a/reactos/apps/dist/notepad/Nl.rc b/reactos/apps/dist/notepad/Nl.rc deleted file mode 100644 index fe932bb417d..00000000000 --- a/reactos/apps/dist/notepad/Nl.rc +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Notepad (Dutch resources) - * - * Copyright 2003 Hans Leidekker - * - * 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_DUTCH, SUBLANG_DEFAULT - -MAIN_MENU MENU -{ - POPUP "&Bestand" { - MENUITEM "&Nieuw...", CMD_NEW - MENUITEM "&Openen\tCtrl+O", CMD_OPEN - MENUITEM "O&pslaan\tCtrl+p", CMD_SAVE - MENUITEM "Ops&laan als...", CMD_SAVE_AS - MENUITEM SEPARATOR - MENUITEM "&Afdrukken", CMD_PRINT - MENUITEM "Pagina-in&stelling...", CMD_PAGE_SETUP - MENUITEM "Printerinstellingen...", CMD_PRINTER_SETUP - MENUITEM SEPARATOR - MENUITEM "&Afsluiten", CMD_EXIT - } -POPUP "Be&werken" { - MENUITEM "&Ongedaan maken\tCtrl+Z", CMD_UNDO - MENUITEM SEPARATOR - MENUITEM "K&nippen\tCtrl+X", CMD_CUT - MENUITEM "&Kopi毛ren\tCtrl+C", CMD_COPY - MENUITEM "&Plakken\tCtrl+V", CMD_PASTE - MENUITEM "&Verwijderen\tDel", CMD_DELETE - MENUITEM SEPARATOR - MENUITEM "&Alles selecteren\tCtrl+A", CMD_SELECT_ALL - MENUITEM "Tijd/&datum\tF5", CMD_TIME_DATE - MENUITEM SEPARATOR - MENUITEM "A&utomatische terugloop", CMD_WRAP - MENUITEM "&Lettertype instellen...", CMD_FONT - } -POPUP "&Zoeken" { - MENUITEM "&Zoeken\tCtrl+Z", CMD_SEARCH - MENUITEM "&Volgende zoeken\tF3", CMD_SEARCH_NEXT - } -POPUP "&Help" { - MENUITEM "&Help-onderwerpen", CMD_HELP_CONTENTS - MENUITEM "&Zoeken...", CMD_HELP_SEARCH - MENUITEM "&Hulp bij Help", CMD_HELP_ON_HELP - MENUITEM SEPARATOR - POPUP "Inf&o..." { - MENUITEM "&Licentie", CMD_LICENSE - MENUITEM "&GEEN GARANTIE", CMD_NO_WARRANTY - MENUITEM "&Over Wine", CMD_ABOUT_WINE - } - } -} - -/* Dialog `Page setup' */ - -DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -FONT 8, "Helv" -CAPTION "Pagina-instelling" -{ -LTEXT "&Koptekst:", 0x140, 10, 07, 40, 15 -EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP -LTEXT "&Voettekst:", 0x142, 10, 24, 40, 15 -EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP - -GROUPBOX "&Marges:", 0x144, 10, 43,160, 45 -LTEXT "Li&nks:", 0x145, 20, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Boven:", 0x148, 20, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Rechts:", 0x14B, 100, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Onder:", 0x14E,100, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP - -DEFPUSHBUTTON "OK", 0x151, 180, 3, 40, 15, WS_TABSTOP -PUSHBUTTON "Annuleren", 0x152, 180, 21, 40, 15, WS_TABSTOP -PUSHBUTTON "&Help", 0x153, 180, 39, 40, 15, WS_TABSTOP -} - -STRINGTABLE DISCARDABLE -{ -STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ -STRING_PAGESETUP_FOOTERVALUE, "Pagina &s" /* FIXME */ -STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ -STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ - -STRING_NOTEPAD, "Kladblok" -STRING_ERROR, "FOUT" -STRING_WARNING, "WAARSCHUWING" -STRING_INFO, "Informatie" - -STRING_UNTITLED, "(naamloos)" - -STRING_ALL_FILES, "Alle bestanden (*.*)" -STRING_TEXT_FILES_TXT, "Tekstbestanden (*.txt)" - -STRING_TOOLARGE, "Het bestand '%s' is te groot voor Kladblok.\n \ -Gebruik een andere editor." -STRING_NOTEXT, "U heeft geen tekst ingevoerd. \ -\nType uw tekst en probeer het nogmaals" -STRING_DOESNOTEXIST, "Het bestand '%s'\nbestaat niet\n\n \ -Wilt u een nieuw bestand maken?" -STRING_NOTSAVED, "Het bestand '%s'\nis gewijzigd\n\n \ -Wilt u de wijzigingen opslaan?" -STRING_NOTFOUND, "'%s' kan niet worden gevonden." -STRING_OUT_OF_MEMORY, "Onvoldoende geheugen. \ -\nSluit een of meer applicaties om de hoeveelheid \nbeschikbaar geheugen te vergroten." - -} diff --git a/reactos/apps/dist/notepad/Pt.rc b/reactos/apps/dist/notepad/Pt.rc deleted file mode 100644 index 5ff963645b2..00000000000 --- a/reactos/apps/dist/notepad/Pt.rc +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Notepad - * Portuguese Language Support - * - * Copyright 1999 Marcel Baur <alves@correionet.com.br> - * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> - * Copyright 2003 Marcelo Duarte - * - * 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_PORTUGUESE, SUBLANG_DEFAULT - -MAIN_MENU MENU -{ - POPUP "&Arquivo" { - MENUITEM "&Novo...", CMD_NEW - MENUITEM "A&brir", CMD_OPEN - MENUITEM "&Salvar", CMD_SAVE - MENUITEM "Salvar &como...", CMD_SAVE_AS - MENUITEM SEPARATOR - MENUITEM "&Imprimir", CMD_PRINT - MENUITEM "C&onfigurar p醙ina...", CMD_PAGE_SETUP - MENUITEM "Configurar i&mpressora...", CMD_PRINTER_SETUP - MENUITEM SEPARATOR - MENUITEM "Sai&r", CMD_EXIT - } -POPUP "&Editar" { - MENUITEM "&Desfazer\tCtrl+Z", CMD_UNDO - MENUITEM SEPARATOR - MENUITEM "&Recortar\tCtrl+X", CMD_CUT - MENUITEM "&Copiar\tCtrl+C", CMD_COPY - MENUITEM "C&olar\tCtrl+V", CMD_PASTE - MENUITEM "E&xcluir\tDel", CMD_DELETE - MENUITEM SEPARATOR - MENUITEM "Selecionar &tudo", CMD_SELECT_ALL - MENUITEM "&Data/Hora\tF5", CMD_TIME_DATE - MENUITEM SEPARATOR - MENUITEM "&Quebrar autom醫ica de linha", CMD_WRAP - MENUITEM "&Fonte...", CMD_FONT - } -POPUP "&Pesquisa" { - MENUITEM "&Localizar...", CMD_SEARCH - MENUITEM "Localizar &pr髕ima\tF3", CMD_SEARCH_NEXT - } -POPUP "&Ajuda" { - MENUITEM "&Conte鷇o", CMD_HELP_CONTENTS - MENUITEM "&Procurar...", CMD_HELP_SEARCH - MENUITEM "&Ajuda na ajuda", CMD_HELP_ON_HELP - MENUITEM SEPARATOR - POPUP "&Informa珲es..." { - MENUITEM "&Licen鏰", CMD_LICENSE - MENUITEM "&SEM GARANTIA", CMD_NO_WARRANTY - MENUITEM "&Sobre o Wine", CMD_ABOUT_WINE - } - } -} - -/* Dialog `Page setup' */ - -DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -FONT 8, "Helv" -CAPTION "Configurar p醙ina" -{ -LTEXT "&Cabe鏰lho:", 0x140, 10, 07, 40, 15 -EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP -LTEXT "&Rodap:", 0x142, 10, 24, 40, 15 -EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP - -GROUPBOX "&Margens:", 0x144, 10, 43,160, 45 -LTEXT "&Esquerda:", 0x145, 20, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Superior:", 0x148, 20, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Direita:", 0x14B, 100, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Inferior:", 0x14E,100, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP - -DEFPUSHBUTTON "OK", 0x151, 180, 3, 40, 15, WS_TABSTOP -PUSHBUTTON "Cancelar", 0x152, 180, 21, 40, 15, WS_TABSTOP -PUSHBUTTON "&Ajuda", 0x153, 180, 39, 40, 15, WS_TABSTOP -} - -STRINGTABLE DISCARDABLE -{ -STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ -STRING_PAGESETUP_FOOTERVALUE, "P醙ina &s" /* FIXME */ -STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ -STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ - -STRING_NOTEPAD, "Notepad" -STRING_ERROR, "ERRO" -STRING_WARNING, "AVISO" -STRING_INFO, "Informa玢o" - -STRING_UNTITLED, "(sem nome)" - -STRING_ALL_FILES, "Todos os arquivos (*.*)" -STRING_TEXT_FILES_TXT, "Arquivos texto (*.txt)" - -STRING_TOOLARGE, "Arquivo '%s' muito longo para o notepad.\n \ -Por favor use um editor diferente." -STRING_NOTEXT, "Voc n鉶 digitou nenhum texto. \ -\nPor favor digite alguma coisa e tente novamente" -STRING_DOESNOTEXIST, "Arquivo '%s'\nn鉶 existe\n\n \ -Voc deseja criar um novo arquivo?" -STRING_NOTSAVED, "Arquivo '%s'\nfoi modificado\n\n \ -Gostaria de salvar as altera缯es?" -STRING_NOTFOUND, "'%s' n鉶 pode ser encontrado." -STRING_OUT_OF_MEMORY, "N鉶 h mem髍ia suficiente para completar essa \ -tarefa. \nFeche uma ou mais aplica珲es para aumentar a quantidade de mem髍ia livre." - -} diff --git a/reactos/apps/dist/notepad/Ru.rc b/reactos/apps/dist/notepad/Ru.rc deleted file mode 100644 index e40145d0ecd..00000000000 --- a/reactos/apps/dist/notepad/Ru.rc +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Notepad (Russian resources) - * - * Copyright 2003 Igor Stepin - * - * 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 - */ - -MAIN_MENU MENU LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT -{ - POPUP "&脏殡" { - MENUITEM "杨玟&囹", CMD_NEW - MENUITEM "&悟牮...", CMD_OPEN - MENUITEM "&杨躔囗栩", CMD_SAVE - MENUITEM "杨躔囗栩 &赅...", CMD_SAVE_AS - MENUITEM SEPARATOR - MENUITEM "相疣&戾蝠 耱疣龛鳆...", CMD_PAGE_SETUP - MENUITEM "&袜耱痤殛 镳桧蝈疣...", CMD_PRINTER_SETUP - MENUITEM "&襄鬣蜞螯", CMD_PRINT - MENUITEM SEPARATOR - MENUITEM "&钿", CMD_EXIT - } -POPUP "&橡噔赅" { - MENUITEM "&悟戾龛螯\tCtrl+Z", CMD_UNDO - MENUITEM SEPARATOR - MENUITEM "&蔓疱玎螯\tCtrl+X", CMD_CUT - MENUITEM "&暑镨痤忄螯\tCtrl+C", CMD_COPY - MENUITEM "埋&噔栩黒tCtrl+V", CMD_PASTE - MENUITEM "&愉嚯栩黒tDel", CMD_DELETE - MENUITEM SEPARATOR - MENUITEM "蔓溴腓螯 &皴", CMD_SELECT_ALL - MENUITEM "吗屐& 溧蜞\tF5", CMD_TIME_DATE - MENUITEM SEPARATOR - MENUITEM "&襄疱眍 镱 耠钼囔", CMD_WRAP - } -POPUP "&铊耜" { - MENUITEM "&袜轵", CMD_SEARCH - MENUITEM "袜轵 &溧脲錦tF3", CMD_SEARCH_NEXT - } -POPUP "&扬疣怅" { - MENUITEM "&杨溴疰囗桢", CMD_HELP_CONTENTS - MENUITEM "&项桉...", CMD_HELP_SEARCH - MENUITEM "&锐镱朦珙忄龛 耧疣怅", CMD_HELP_ON_HELP - MENUITEM SEPARATOR - POPUP "&砚邃屙..." { - MENUITEM "&髓鲥礴", CMD_LICENSE - MENUITEM "&僚 美欣鸵壬", CMD_NO_WARRANTY - MENUITEM "&O Wine", CMD_ABOUT_WINE - } - } -} - -/* Dialog `Page setup' */ - -DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 -LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -FONT 8, "Helv" -CAPTION "相疣戾蝠 耱疣龛鳆" -{ -LTEXT "&屦蹴栝 觐腩眚栩箅:", 0x140, 10, 07, 40, 15 -EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP -LTEXT "&桄龛 觐腩眚栩箅:", 0x142, 10, 24, 40, 15 -EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP - -GROUPBOX "项 (祆):", 0x144, 10, 43,160, 45 -LTEXT "&隋忸:", 0x145, 20, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&洛瘐礤:", 0x148, 20, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&橡噔铄:", 0x14B, 100, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&丸骓邋:", 0x14E,100, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP - -DEFPUSHBUTTON "OK", 0x151, 180, 3, 40, 15, WS_TABSTOP -PUSHBUTTON "悟戾磬", 0x152, 180, 21, 40, 15, WS_TABSTOP -PUSHBUTTON "&扬疣怅", 0x153, 180, 39, 40, 15, WS_TABSTOP -} - -STRINGTABLE DISCARDABLE LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT -{ -STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ -STRING_PAGESETUP_FOOTERVALUE, "羊疣龛鲟 &s" /* FIXME */ -STRING_PAGESETUP_LEFTVALUE, "20 祆" /* FIXME */ -STRING_PAGESETUP_RIGHTVALUE, "20 祆" /* FIXME */ -STRING_PAGESETUP_TOPVALUE, "25 祆" /* FIXME */ -STRING_PAGESETUP_BOTTOMVALUE, "25 祆" /* FIXME */ - -STRING_NOTEPAD, "岭铌眍" -STRING_ERROR, "呜攘世" -STRING_WARNING, "峦忍劳扰" -STRING_INFO, "软纛痨圉" - -STRING_UNTITLED, "(徨 玎泐腩怅)" - -STRING_ALL_FILES, "埋 羿殡 (*.*)" -STRING_TEXT_FILES_TXT, "义犟蝾恹 羿殡 (*.txt)" - -STRING_TOOLARGE, "脏殡 '%s' 耠桫觐 犷朦 潆 犭铌眍蜞.\n \ -锐镱朦珞轵 漯筱铋 疱溧牝铕." -STRING_NOTEXT, "蔓 礤 忖咫 龛赅觐泐 蝈犟蜞. \ -\n骡邃栩 黩-龛狍潼 镱镳钺箝蝈 妁." -STRING_DOESNOTEXIST, "脏殡 '%s'\n礤 耋耱怏弪\n\n \ -疹蜩蝈 耦玟囹 眍恹 羿殡?" -STRING_NOTSAVED, "脏殡 '%s'\n猁 桤戾礤韁n\n \ -疹蜩蝈 耦躔囗栩 桤戾礤龛?" -STRING_NOTFOUND, "'%s' 礤 磬殇屙." -STRING_OUT_OF_MEMORY, "湾漕耱囹铟眍 镟蜩 潆 玎忮瘌屙 铋 铒屦圉梃 \ -\n青牮铋蝈 钿眍 桦 礤耜铍 镳桦铈屙栝 镱怛铕栩 镱稃蜿." - -} diff --git a/reactos/apps/dist/notepad/Si.rc b/reactos/apps/dist/notepad/Si.rc deleted file mode 100644 index 60fe9a15201..00000000000 --- a/reactos/apps/dist/notepad/Si.rc +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Notepad (Slovenian resources) - * - * Copyright 2002-2003 Rok Mandeljc <rok.mandeljc@gimb.org> - * - * 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_SLOVENIAN, SUBLANG_DEFAULT - -MAIN_MENU MENU -{ - POPUP "&Datoteka" { - MENUITEM "&Nova", CMD_NEW - MENUITEM "&Odpri ...", CMD_OPEN - MENUITEM "&Shrani", CMD_SAVE - MENUITEM "Shrani &kot ...", CMD_SAVE_AS - MENUITEM SEPARATOR - MENUITEM "Na&tisni", CMD_PRINT - MENUITEM "P&riprava strani ...", CMD_PAGE_SETUP - MENUITEM "&Tiskalnik ...", CMD_PRINTER_SETUP - MENUITEM SEPARATOR - MENUITEM "Iz&hod", CMD_EXIT - } -POPUP "&Urejanje" { - MENUITEM "&Razveljavi\tCtrl+Z", CMD_UNDO - MENUITEM SEPARATOR - MENUITEM "&Izre瀒\tCtrl+X", CMD_CUT - MENUITEM "&Kopiraj\tCtrl+C", CMD_COPY - MENUITEM "&Prilepi\tCtrl+V", CMD_PASTE - MENUITEM "Izbri&歩\tDel", CMD_DELETE - MENUITEM SEPARATOR - MENUITEM "Izberi &vse", CMD_SELECT_ALL - MENUITEM "萢s/&Datum\tF5", CMD_TIME_DATE - MENUITEM SEPARATOR - MENUITEM "Pr&elom vrstice", CMD_WRAP - } -POPUP "&Iskanje" { - MENUITEM "&Najdi ...", CMD_SEARCH - MENUITEM "Na&daljuj iskanje\tF3", CMD_SEARCH_NEXT - } -POPUP "&Pomo" { - MENUITEM "&Teme pomo鑙", CMD_HELP_CONTENTS - MENUITEM "&Najdi ...", CMD_HELP_SEARCH - MENUITEM "&O pomo鑙", CMD_HELP_ON_HELP - MENUITEM SEPARATOR - POPUP "Inf&ormacije ..." { - MENUITEM "&Licen鑞a pogodba", CMD_LICENSE - MENUITEM "&BREZ GARANCIJE", CMD_NO_WARRANTY - MENUITEM "&O Wine", CMD_ABOUT_WINE - } - } -} - -/* Dialog `Page setup' */ - -DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -FONT 8, "Priprava strani" -CAPTION "Page Setup" -{ -LTEXT "&Glava:", 0x140, 10, 07, 40, 15 -EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP -LTEXT "&Noga:", 0x142, 10, 24, 40, 15 -EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP - -GROUPBOX "Robovi", 0x144, 10, 43,160, 45 -LTEXT "&Levo:", 0x145, 20, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Desno:", 0x148, 20, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Zgoraj:", 0x14B, 100, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Spodaj:", 0x14E,100, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP - -DEFPUSHBUTTON "V redu", 0x151, 180, 3, 40, 15, WS_TABSTOP -PUSHBUTTON "Prekli鑙", 0x152, 180, 21, 40, 15, WS_TABSTOP -PUSHBUTTON "&Pomo", 0x153, 180, 39, 40, 15, WS_TABSTOP -} - -STRINGTABLE DISCARDABLE -{ -STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ -STRING_PAGESETUP_FOOTERVALUE, "Stran &s" /* FIXME */ -STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ -STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ - -STRING_NOTEPAD, "Bele瀗ica" -STRING_ERROR, "NAPAKA" -STRING_WARNING, "OPOZORILO" -STRING_INFO, "Informacija" - -STRING_UNTITLED, "Neimenovana" - -STRING_ALL_FILES, "Vse datoteke (*.*)" -STRING_TEXT_FILES_TXT, "Datoteke z besedilom (*.txt)" - -STRING_TOOLARGE, "Datoteka '%s' je prevelika za Bele瀗ico.\n \ -Uporabite drug urejevalnik." -STRING_NOTEXT, "Niste vnesli besedila. \ -\nVnesite besedilo in poskusite znova." -STRING_DOESNOTEXIST, "Datoteka '%s' ne obstaja.\n\n \ -Ali 瀍lite ustvariti novo datoteko?" -STRING_NOTSAVED, "Vsebina datoteke '%s'je bila spremenjena.\n\n \ -Ali 瀍lite shraniti spremembe?" -STRING_NOTFOUND, "Ni mogo鑕 najti '%s'." -STRING_OUT_OF_MEMORY, "Na voljo ni dovolj pomnilnika, da bi bilo mogo鑕 dokon鑑ti to \ -operacijo. \n萫 ga 瀍lite sprostiti, kon鑑jte enega ali ve programov in poskusite znova. " - -} diff --git a/reactos/apps/dist/notepad/Sk.rc b/reactos/apps/dist/notepad/Sk.rc deleted file mode 100644 index 8e429ef9a1e..00000000000 --- a/reactos/apps/dist/notepad/Sk.rc +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Notepad (Slovak resources) - * - * Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch> - * Proofread 1998 by David Lee Lambert <lamber45@egr.msu.edu> - * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> - * - * 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_SLOVAK, SUBLANG_DEFAULT - -MAIN_MENU MENU -{ - POPUP "&File" { - MENUITEM "&New...", CMD_NEW - MENUITEM "&Open", CMD_OPEN - MENUITEM "&Save", CMD_SAVE - MENUITEM "Save &as...", CMD_SAVE_AS - MENUITEM "&Print", CMD_PRINT - MENUITEM "Page Se&tup...", CMD_PAGE_SETUP - MENUITEM "P&rinter Setup...", CMD_PRINTER_SETUP - MENUITEM SEPARATOR - MENUITEM "&Exit", CMD_EXIT - } -POPUP "&Edit" { - MENUITEM "&Undo\tCtrl+Z", CMD_UNDO - MENUITEM SEPARATOR - MENUITEM "Cu&t\tCtrl+X", CMD_CUT - MENUITEM "&Copy\tCtrl+C", CMD_COPY - MENUITEM "&Paste\tCtrl+V", CMD_PASTE - MENUITEM "&Delete\tDel", CMD_DELETE - MENUITEM SEPARATOR - MENUITEM "Select &all", CMD_SELECT_ALL - MENUITEM "&Time/Date\tF5", CMD_TIME_DATE - MENUITEM SEPARATOR - MENUITEM "&Wrap long lines", CMD_WRAP - } -POPUP "&Search" { - MENUITEM "&Search", CMD_SEARCH - MENUITEM "&Search next\tF3", CMD_SEARCH_NEXT - } -POPUP "&Help" { - MENUITEM "&Contents", CMD_HELP_CONTENTS - MENUITEM "&Search...", CMD_HELP_SEARCH - MENUITEM "&Help on help", CMD_HELP_ON_HELP - MENUITEM SEPARATOR - POPUP "Inf&o..." { - MENUITEM "&License", CMD_LICENSE - MENUITEM "&NO WARRANTY", CMD_NO_WARRANTY - MENUITEM "&About Wine", CMD_ABOUT_WINE - } - } -} - -/* Dialog `Page setup' */ - -DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -FONT 8, "Helv" -CAPTION "Page Setup" -{ -LTEXT "&Header:", 0x140, 10, 07, 40, 15 -EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP -LTEXT "&Footer:", 0x142, 10, 24, 40, 15 -EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP - -GROUPBOX "&Margins:", 0x144, 10, 43,160, 45 -LTEXT "&Left:", 0x145, 20, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Top:", 0x148, 20, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Right:", 0x14B, 100, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Bottom:", 0x14E,100, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP - -DEFPUSHBUTTON "OK", 0x151, 180, 3, 40, 15, WS_TABSTOP -PUSHBUTTON "Cancel", 0x152, 180, 21, 40, 15, WS_TABSTOP -PUSHBUTTON "&Help", 0x153, 180, 39, 40, 15, WS_TABSTOP -} - -STRINGTABLE DISCARDABLE -{ -STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ -STRING_PAGESETUP_FOOTERVALUE, "Page &s" /* FIXME */ -STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ -STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ - -STRING_NOTEPAD, "Notepad" -STRING_ERROR, "ERROR" -STRING_WARNING, "WARNING" -STRING_INFO, "Information" - -STRING_UNTITLED, "(untitled)" - -STRING_ALL_FILES, "All files (*.*)" -STRING_TEXT_FILES_TXT, "Text files (*.txt)" - -STRING_TOOLARGE, "File '%s' is too large for notepad.\n \ -Please use a different editor." -STRING_NOTEXT, "You didn't enter any text. \ -\nPlease type something and try again" -STRING_DOESNOTEXIST, "File '%s'\ndoes not exist\n\n \ -Do you want to create a new file ?" -STRING_NOTSAVED, "File '%s'\nhas been modified\n\n \ -Would you like to save the changes ?" -STRING_NOTFOUND, "'%s' can not be found." -STRING_OUT_OF_MEMORY, "Not enough memory to complete this \ -task. \nClose one or more applications to increase the amount of \nfree \ -memory." - -} diff --git a/reactos/apps/dist/notepad/Sw.rc b/reactos/apps/dist/notepad/Sw.rc deleted file mode 100644 index 4999aa6d043..00000000000 --- a/reactos/apps/dist/notepad/Sw.rc +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Notepad (Swedish resources) - * - * Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch> - * Proofread 1998 by David Lee Lambert <lamber45@egr.msu.edu> - * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> - * - * 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_SWEDISH, SUBLANG_DEFAULT - -MAIN_MENU MENU -{ - POPUP "&Arkiv" { - MENUITEM "&Ny...", CMD_NEW - MENUITEM "&ppna", CMD_OPEN - MENUITEM "&Spara", CMD_SAVE - MENUITEM "Spara &som...", CMD_SAVE_AS - MENUITEM "&Skriv ut", CMD_PRINT - MENUITEM "Sid La&yout...", CMD_PAGE_SETUP - MENUITEM "Skrivar &inst鋖lningar...", CMD_PRINTER_SETUP - MENUITEM SEPARATOR - MENUITEM "&Avsluta", CMD_EXIT - } -POPUP "&Redigera" { - MENUITEM "&Undo\tCtrl+Z", CMD_UNDO - MENUITEM SEPARATOR - MENUITEM "Klippa\tCtrl+X", CMD_CUT - MENUITEM "&Kopiera\tCtrl+C", CMD_COPY - MENUITEM "&Klistra in\tCtrl+V", CMD_PASTE - MENUITEM "&Ta bort\tDel", CMD_DELETE - MENUITEM SEPARATOR - MENUITEM "Markera &allt", CMD_SELECT_ALL - MENUITEM "&Tid/Datum\tF5", CMD_TIME_DATE - MENUITEM SEPARATOR - MENUITEM "&Dela l錸ga meningar", CMD_WRAP - } -POPUP "&S鰇" { - MENUITEM "S鰇...", CMD_SEARCH - MENUITEM "&S鰇 n鋝ta\tF3", CMD_SEARCH_NEXT - } -POPUP "&Hj鋖p" { - MENUITEM "&Inneh錶l", CMD_HELP_CONTENTS - MENUITEM "&S鰇...", CMD_HELP_SEARCH - MENUITEM "Anv鋘dningen &av hj鋖p", CMD_HELP_ON_HELP - MENUITEM SEPARATOR - POPUP "Inf&ormation..." { - MENUITEM "&Licens", CMD_LICENSE - MENUITEM "&INGEN GARANTI", CMD_NO_WARRANTY - MENUITEM "&Om Wine", CMD_ABOUT_WINE - } - } -} - -/* Dialog `Page setup' */ - -DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -FONT 8, "Helv" -CAPTION "Sid Layout" -{ -LTEXT "&Huvudnot:", 0x140, 10, 07, 40, 15 -EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP -LTEXT "&Fotnot:", 0x142, 10, 24, 40, 15 -EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP - -GROUPBOX "Kanter:", 0x144, 10, 43,160, 45 -LTEXT "&V鋘ster:", 0x145, 20, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&講er:", 0x148, 20, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&H鰃er:", 0x14B, 100, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Under:", 0x14E,100, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP - -DEFPUSHBUTTON "OK", 0x151, 180, 3, 40, 15, WS_TABSTOP -PUSHBUTTON "Avbryt", 0x152, 180, 21, 40, 15, WS_TABSTOP -PUSHBUTTON "&Hj鋖p", 0x153, 180, 39, 40, 15, WS_TABSTOP -} - -STRINGTABLE DISCARDABLE -{ -STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ -STRING_PAGESETUP_FOOTERVALUE, "Page &s" /* FIXME */ -STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ -STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ - -STRING_NOTEPAD, "Anteckningar" -STRING_ERROR, "FEL" -STRING_WARNING, "WARNING" -STRING_INFO, "Information" - -STRING_UNTITLED, "(untitled)" - -STRING_ALL_FILES, "Alla filer (*.*)" -STRING_TEXT_FILES_TXT, "Text filer (*.txt)" - -STRING_TOOLARGE, "Filen '%s' 鋜 f鰎 stor f鰎 notepad.\n \ -Anv鋘d en annan editor." -STRING_NOTEXT, "Du skrev inte in n錱on text. \ -\nSkriv n錱ot och f鰎s鰇 sedan igen" -STRING_DOESNOTEXIST, "File '%s'\ndoes not exist\n\n \ -Do you want to create a new file ?" -STRING_NOTSAVED, "File '%s'\nhas been modified\n\n \ -Would you like to save the changes ?" -STRING_NOTFOUND, "'%s' hittades inte." -STRING_OUT_OF_MEMORY, "Inte tillr鋕ligt med minne f鰎 att slutf鰎a \ -den h鋜 uppgiften. \nAvsluta ett eller flera program f鰎 att 鰇a m鋘gden \nfritt \ -minne." - -} diff --git a/reactos/apps/dist/notepad/Th.rc b/reactos/apps/dist/notepad/Th.rc deleted file mode 100644 index fb0cb107943..00000000000 --- a/reactos/apps/dist/notepad/Th.rc +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Notepad (Thai Resources) - * - * 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 - */ - -LANGUAGE LANG_THAI, SUBLANG_DEFAULT - -MAIN_MENU MENU -{ - POPUP "峥榱" { - MENUITEM "拭橐с肆...", CMD_NEW - MENUITEM "嗷源...\tCtrl+O", CMD_OPEN - MENUITEM "貉狗住\tCtrl+S", CMD_SAVE - MENUITEM "貉狗住嗷绻...", CMD_SAVE_AS - MENUITEM SEPARATOR - MENUITEM "驹辆", CMD_PRINT - MENUITEM "幻押岬瑙斯橐...", CMD_PAGE_SETUP - MENUITEM "幻押岬瑙啶米柰Ь粤眷...", CMD_PRINTER_SETUP - MENUITEM SEPARATOR - MENUITEM "屯", CMD_EXIT - } - POPUP "帷殇" { - MENUITEM "嗝章·坠\tCtrl+Z", CMD_UNDO - MENUITEM SEPARATOR - MENUITEM "笛碶tCtrl+X", CMD_CUT - MENUITEM "笛磁汀\tCtrl+C", CMD_COPY - MENUITEM "且tCtrl+V", CMD_PASTE - MENUITEM "藕\tDel", CMD_DELETE - MENUITEM SEPARATOR - MENUITEM "嗯淄》验链\tCtrl+A", CMD_SELECT_ALL - MENUITEM "茄狗砧/\tF5", CMD_TIME_DATE - MENUITEM SEPARATOR - MENUITEM "髓秃妹费绰仪", CMD_WRAP - MENUITEM "觅会汉囱峭选擅...", CMD_FONT - } - POPUP "ぱ顾" { - MENUITEM "ら顾襖tCtrl+F", CMD_SEARCH - MENUITEM "ら顾业柰浠\tF3", CMD_SEARCH_NEXT - } - POPUP "锹嗨耪" { - MENUITEM "喙组退", CMD_HELP_CONTENTS - MENUITEM "ら顾...", CMD_HELP_SEARCH - MENUITEM "唷砧虑⊙邯枨锣伺胀", CMD_HELP_ON_HELP - MENUITEM SEPARATOR - POPUP "靡屡朽驼麓..." { - MENUITEM "愫凸丨业", CMD_LICENSE - MENUITEM "淞枇 WARRANTY", CMD_NO_WARRANTY - MENUITEM "唷砧虑⊙ Wine... ", CMD_ABOUT_WINE - } - } -} - -/* Dialog `Page setup' */ - -DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -FONT 8, "Helv" -CAPTION "幻押岬瑙斯橐" -{ -LTEXT "搜:", 0x140, 10, 07, 40, 15 -EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP -LTEXT "&Footer:", 0x142, 10, 24, 40, 15 -EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP - -GROUPBOX "⑼骸眯匆:", 0x144, 10, 43,160, 45 -LTEXT "i衣:", 0x145, 20, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "汗:", 0x148, 20, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "⑶:", 0x14B, 100, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "盆咬:", 0x14E,100, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP - -DEFPUSHBUTTON "怠脓", 0x151, 180, 3, 40, 15, WS_TABSTOP -PUSHBUTTON "隆嗯浴", 0x152, 180, 21, 40, 15, WS_TABSTOP -PUSHBUTTON "锹嗨耪", 0x153, 180, 39, 40, 15, WS_TABSTOP -} - -STRINGTABLE DISCARDABLE -{ -STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ -STRING_PAGESETUP_FOOTERVALUE, "斯橐 &s" /* FIXME */ -STRING_PAGESETUP_LEFTVALUE, "20 亮." /* FIXME */ -STRING_PAGESETUP_RIGHTVALUE, "20 亮." /* FIXME */ -STRING_PAGESETUP_TOPVALUE, "25 亮." /* FIXME */ -STRING_PAGESETUP_BOTTOMVALUE, "25 亮." /* FIXME */ - -STRING_NOTEPAD, "Notepad" -STRING_ERROR, "で伊辉" -STRING_WARNING, "ろ业淄" -STRING_INFO, "靡屡朽驼麓" - -STRING_UNTITLED, "淞琛硪斯椽骤" - -STRING_ALL_FILES, "坟♂块 (*.*)" -STRING_TEXT_FILES_TXT, "峥榱淀颐 (*.txt)" - -STRING_TOOLARGE, "峥榱 '%s' 闼唷怨浠" -STRING_NOTEXT, "へ充凌愦啖章雇袖肻n∶爻遗艇闼凌" -STRING_DOESNOTEXIST, "淞杈横块 '%s' 氛璧橥А颐嗷源\nへ车橥А颐拭橐с肆桎凌 ?" -STRING_NOTSAVED, "琳∫绵慌砧鹿峄脓⊙亨汀室肻n\n'%s'\n\nへ车橥А颐貉狗帧裂顾米弯凌 ?" -STRING_NOTFOUND, "淞杈孩橥で伊 '%s' 氛璧橥А颐ら顾" -STRING_OUT_OF_MEMORY, "で伊宜链\n∶爻遗艇闼凌" - -} diff --git a/reactos/apps/dist/notepad/Wa.rc b/reactos/apps/dist/notepad/Wa.rc deleted file mode 100644 index 01f391c4525..00000000000 --- a/reactos/apps/dist/notepad/Wa.rc +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Notepad (Walon resources) - * - * Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch> - * Proofread 1998 by David Lee Lambert <lamber45@egr.msu.edu> - * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> - * - * 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 - */ - -#ifdef LANG_WALON - -LANGUAGE LANG_WALON, SUBLANG_DEFAULT - -MAIN_MENU MENU -{ - POPUP "&Fitch" { - MENUITEM "&Novea...", CMD_NEW - MENUITEM "&Drov", CMD_OPEN - MENUITEM "&Schaper", CMD_SAVE - MENUITEM "Schaper 鑤 r&lomer...", CMD_SAVE_AS - MENUITEM "&Rexhe", CMD_PRINT - MENUITEM "Arrandjmint del &P錮je...", CMD_PAGE_SETUP - MENUITEM "&Apontiaedje del scrirece...", CMD_PRINTER_SETUP - MENUITEM SEPARATOR - MENUITEM "Mouss &Fo", CMD_EXIT - } -POPUP "&Candj" { - MENUITEM "&Disf閈tCtrl+Z", CMD_UNDO - MENUITEM SEPARATOR - MENUITEM "C&per\tCtrl+X", CMD_CUT - MENUITEM "&Copy頫tCtrl+C", CMD_COPY - MENUITEM "C&laper\tCtrl+V", CMD_PASTE - MENUITEM "&Rafacer\tDel", CMD_DELETE - MENUITEM SEPARATOR - MENUITEM "&Tchwezi totafwait", CMD_SELECT_ALL - MENUITEM "&Eure/Date\tF5", CMD_TIME_DATE - MENUITEM SEPARATOR - MENUITEM "C魀er les ro&yes", CMD_WRAP - } -POPUP "C&wer" { - MENUITEM "Cwer...", CMD_SEARCH - MENUITEM "&Sh鹶ant\tF3", CMD_SEARCH_NEXT - } -POPUP "&Aide" { - MENUITEM "&dvins", CMD_HELP_CONTENTS - MENUITEM "C&wer...", CMD_HELP_SEARCH - MENUITEM "&Aide so l' Aide", CMD_HELP_ON_HELP - MENUITEM SEPARATOR - POPUP "&Inform錭ion..." { - MENUITEM "&Licinse", CMD_LICENSE - MENUITEM "&NOLE WARANTEYE", CMD_NO_WARRANTY - MENUITEM " &dfait di Wine", CMD_ABOUT_WINE - } - } -} - -/* Dialog `Page setup' */ - -DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -FONT 8, "Helv" -CAPTION "Arindjmint del P錮je" -{ -LTEXT "&Tite:", 0x140, 10, 07, 40, 15 -EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP -LTEXT "&P頽ote:", 0x142, 10, 24, 40, 15 -EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP - -GROUPBOX "&Mardjes:", 0x144, 10, 43,160, 45 -LTEXT "&Hintche:", 0x145, 20, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Copete:", 0x148, 20, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Droete:", 0x14B, 100, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Bas:", 0x14E,100, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP - -DEFPUSHBUTTON "I Va", 0x151, 180, 3, 40, 15, WS_TABSTOP -PUSHBUTTON "Rinonc", 0x152, 180, 21, 40, 15, WS_TABSTOP -PUSHBUTTON "&Aide", 0x153, 180, 39, 40, 15, WS_TABSTOP -} - -STRINGTABLE DISCARDABLE -{ -STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ -STRING_PAGESETUP_FOOTERVALUE, "P錮je &s" /* FIXME */ -STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ -STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ - -STRING_NOTEPAD, "Notepad" -STRING_ERROR, "AROKE" -STRING_WARNING, "ADVERTIXHMINT" -STRING_INFO, "Inform錭ion" - -STRING_UNTITLED, "(sin tite)" - -STRING_ALL_FILES, "Tos les fitch顂 (*.*)" -STRING_TEXT_FILES_TXT, "Fitch顂 tekse (*.txt)" - -STRING_TOOLARGE, "Li fitch '%s' est trop gros pol notepad.\n \ -Eployoz on 魌e aspougneu di tekse." -STRING_NOTEXT, "Vos n' avoz r閚 sicr顃. \ -\nTapez ene sacwe 鑤 rasayez" -STRING_DOESNOTEXIST, "File '%s'\ndoes not exist\n\n \ -Do you want to create a new file ?" -STRING_NOTSAVED, "Li fitch '%s'\na candj頫n\n \ -El voloz schaper ?" -STRING_NOTFOUND, "'%s' pout n閚 esse trov." -STRING_OUT_OF_MEMORY, "Li memwere est plinne. \n\ -Cloyoz on programe ou pus po monter li memwere libe." - -} - -#endif /* LANG_WALON */ diff --git a/reactos/apps/dist/notepad/Zh.rc b/reactos/apps/dist/notepad/Zh.rc deleted file mode 100644 index 8f2b554c2a6..00000000000 --- a/reactos/apps/dist/notepad/Zh.rc +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Notepad (Simplified Chinese resources) - * - * Copyright 2002 liuspider <liuspider@yahoo.com> - * - * 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 - */ - -MAIN_MENU MENU LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED -{ - POPUP "文件(&F)" { - MENUITEM "新建(&N)...", CMD_NEW - MENUITEM "打开(&O)", CMD_OPEN - MENUITEM "保存(&S)", CMD_SAVE - MENUITEM "另存为(&A)...", CMD_SAVE_AS - MENUITEM "打印(&P)", CMD_PRINT - MENUITEM "页面设置(&T)...", CMD_PAGE_SETUP - MENUITEM "打印设置(&R)...", CMD_PRINTER_SETUP - MENUITEM SEPARATOR - MENUITEM "退出(&E)", CMD_EXIT - } -POPUP "编辑(&E)" { - MENUITEM "撤消(&U)\tCtrl+Z", CMD_UNDO - MENUITEM SEPARATOR - MENUITEM "剪切(&T)\tCtrl+X", CMD_CUT - MENUITEM "复制(&C)\tCtrl+C", CMD_COPY - MENUITEM "粘贴(&P)\tCtrl+V", CMD_PASTE - MENUITEM "删除(&D)\tDel", CMD_DELETE - MENUITEM SEPARATOR - MENUITEM "全选(&A)", CMD_SELECT_ALL - MENUITEM "插入日期、时间(&T)\tF5", CMD_TIME_DATE - MENUITEM SEPARATOR - MENUITEM "自动换行(&W)", CMD_WRAP - } -POPUP "搜索(&S)" { - MENUITEM "搜索(&S)", CMD_SEARCH - MENUITEM "搜索下一个(&S)\tF3", CMD_SEARCH_NEXT - } -POPUP "帮助(&H)" { - MENUITEM "内容(&C)", CMD_HELP_CONTENTS - MENUITEM "搜索(&S)...", CMD_HELP_SEARCH - MENUITEM "如何使用帮助(&H)", CMD_HELP_ON_HELP - MENUITEM SEPARATOR - POPUP "资料信息(&O)..." { - MENUITEM "用户许可协议(&L)", CMD_LICENSE - MENUITEM "责任无关(&N)", CMD_NO_WARRANTY - MENUITEM "关于 Wine(&A)", CMD_ABOUT_WINE - } - } -} - -/* Dialog `Page setup' */ - -DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -FONT 10, "Helv" -CAPTION "页面设置" -{ -LTEXT "页眉(&H):", 0x140, 10, 07, 40, 15 -EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP -LTEXT "脚注(&F):", 0x142, 10, 24, 40, 15 -EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP - -GROUPBOX "边缘空白(&M):", 0x144, 10, 43,160, 45 -LTEXT "左(&L):", 0x145, 20, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "上(&T):", 0x148, 20, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "右(&R):", 0x14B, 100, 55, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "下(&B):", 0x14E,100, 73, 30, 10, WS_CHILD -EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP - -DEFPUSHBUTTON "确定", 0x151, 180, 3, 40, 15, WS_TABSTOP -PUSHBUTTON "取消", 0x152, 180, 21, 40, 15, WS_TABSTOP -PUSHBUTTON "帮助(&)", 0x153, 180, 39, 40, 15, WS_TABSTOP -} - -STRINGTABLE DISCARDABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED -{ -STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ -STRING_PAGESETUP_FOOTERVALUE, "Page &s" /* FIXME */ -STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ -STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ -STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ - -STRING_NOTEPAD, "记事本" -STRING_ERROR, "错误" -STRING_WARNING, "警告" -STRING_INFO, "信息" - -STRING_UNTITLED, "(未命名)" - -STRING_ALL_FILES, "所有文件 (*.*)" -STRING_TEXT_FILES_TXT, "文本文件 (*.txt)" - -STRING_TOOLARGE, "记事本不能打开 '%s' 这么大的文件。\n \ -请使用别的编辑器。" -STRING_NOTEXT, "您没有输入任何文本。 \ -\n请输入一些再试" -STRING_DOESNOTEXIST, "文件 '%s'\n不存在\n\n \ -您想新建一个文件吗?" -STRING_NOTSAVED, "文件 '%s'\n正文已更改\n\n \ -是否保存更改?" -STRING_NOTFOUND, "找不到文件 '%s'" -STRING_OUT_OF_MEMORY, "没有足够的内存可以用来完成此项任务。 \ -\n请关闭一些程序施放内存后再试。" - -} diff --git a/reactos/apps/dist/notepad/dialog.c b/reactos/apps/dist/notepad/dialog.c deleted file mode 100644 index 7cbee4fe87f..00000000000 --- a/reactos/apps/dist/notepad/dialog.c +++ /dev/null @@ -1,717 +0,0 @@ -/* - * Notepad (dialog.c) - * - * Copyright 1998,99 Marcel Baur <mbaur@g26.ethz.ch> - * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> - * Copyright 2002 Andriy Palamarchuk - * - * 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 UNICODE - -#include <assert.h> -#include <stdio.h> -#include <windows.h> -#include <commdlg.h> - -#include "main.h" -#include "license.h" -#include "dialog.h" - -static const WCHAR helpfileW[] = { 'n','o','t','e','p','a','d','.','h','l','p',0 }; - -static INT_PTR WINAPI DIALOG_PAGESETUP_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam); - -VOID ShowLastError(void) -{ - DWORD error = GetLastError(); - if (error != NO_ERROR) - { - LPWSTR lpMsgBuf; - WCHAR szTitle[MAX_STRING_LEN]; - - LoadString(Globals.hInstance, STRING_ERROR, szTitle, SIZEOF(szTitle)); - FormatMessage( - FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, error, 0, - (LPTSTR) &lpMsgBuf, 0, NULL); - MessageBox(NULL, lpMsgBuf, szTitle, MB_OK | MB_ICONERROR); - LocalFree(lpMsgBuf); - } -} - -/** - * Sets the caption of the main window according to Globals.szFileTitle: - * Notepad - (untitled) if no file is open - * Notepad - [filename] if a file is given - */ -static void UpdateWindowCaption(void) -{ - WCHAR szCaption[MAX_STRING_LEN]; - WCHAR szUntitled[MAX_STRING_LEN]; - - LoadString(Globals.hInstance, STRING_NOTEPAD, szCaption, SIZEOF(szCaption)); - - if (Globals.szFileTitle[0] != '\0') { - static const WCHAR bracket_lW[] = { ' ','-',' ','[',0 }; - static const WCHAR bracket_rW[] = { ']',0 }; - lstrcat(szCaption, bracket_lW); - lstrcat(szCaption, Globals.szFileTitle); - lstrcat(szCaption, bracket_rW); - } - else - { - static const WCHAR hyphenW[] = { ' ','-',' ',0 }; - LoadString(Globals.hInstance, STRING_UNTITLED, szUntitled, SIZEOF(szUntitled)); - lstrcat(szCaption, hyphenW); - lstrcat(szCaption, szUntitled); - } - - SetWindowText(Globals.hMainWnd, szCaption); -} - -static void AlertFileNotFound(LPCWSTR szFileName) -{ - WCHAR szMessage[MAX_STRING_LEN]; - WCHAR szResource[MAX_STRING_LEN]; - - /* Load and format szMessage */ - LoadString(Globals.hInstance, STRING_NOTFOUND, szResource, SIZEOF(szResource)); - wsprintf(szMessage, szResource, szFileName); - - /* Load szCaption */ - LoadString(Globals.hInstance, STRING_ERROR, szResource, SIZEOF(szResource)); - - /* Display Modal Dialog */ - MessageBox(Globals.hMainWnd, szMessage, szResource, MB_ICONEXCLAMATION); -} - -static int AlertFileNotSaved(LPCWSTR szFileName) -{ - WCHAR szMessage[MAX_STRING_LEN]; - WCHAR szResource[MAX_STRING_LEN]; - WCHAR szUntitled[MAX_STRING_LEN]; - - LoadString(Globals.hInstance, STRING_UNTITLED, szUntitled, SIZEOF(szUntitled)); - - /* Load and format Message */ - LoadString(Globals.hInstance, STRING_NOTSAVED, szResource, SIZEOF(szResource)); - wsprintf(szMessage, szResource, szFileName[0] ? szFileName : szUntitled); - - /* Load Caption */ - LoadString(Globals.hInstance, STRING_ERROR, szResource, SIZEOF(szResource)); - - /* Display modal */ - return MessageBox(Globals.hMainWnd, szMessage, szResource, MB_ICONEXCLAMATION|MB_YESNOCANCEL); -} - -/** - * Returns: - * TRUE - if file exists - * FALSE - if file does not exist - */ -BOOL FileExists(LPCWSTR szFilename) -{ - WIN32_FIND_DATA entry; - HANDLE hFile; - - hFile = FindFirstFile(szFilename, &entry); - FindClose(hFile); - - return (hFile != INVALID_HANDLE_VALUE); -} - - -static VOID DoSaveFile(VOID) -{ - HANDLE hFile; - DWORD dwNumWrite; - LPSTR pTemp; - DWORD size; - - hFile = CreateFile(Globals.szFileName, GENERIC_WRITE, FILE_SHARE_WRITE, - NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - if(hFile == INVALID_HANDLE_VALUE) - { - ShowLastError(); - return; - } - - size = GetWindowTextLengthA(Globals.hEdit) + 1; - pTemp = HeapAlloc(GetProcessHeap(), 0, size); - if (!pTemp) - { - CloseHandle(hFile); - ShowLastError(); - return; - } - size = GetWindowTextA(Globals.hEdit, pTemp, size); - - if (!WriteFile(hFile, pTemp, size, &dwNumWrite, NULL)) - ShowLastError(); - - CloseHandle(hFile); - HeapFree(GetProcessHeap(), 0, pTemp); -} - -/** - * Returns: - * TRUE - User agreed to close (both save/don't save) - * FALSE - User cancelled close by selecting "Cancel" - */ -BOOL DoCloseFile(void) -{ - int nResult; - static const WCHAR empty_strW[] = { 0 }; - - if (SendMessage(Globals.hEdit, EM_GETMODIFY, 0, 0)) - { - /* prompt user to save changes */ - nResult = AlertFileNotSaved(Globals.szFileName); - switch (nResult) { - case IDYES: DIALOG_FileSave(); - break; - - case IDNO: break; - - case IDCANCEL: return(FALSE); - break; - - default: return(FALSE); - break; - } /* switch */ - } /* if */ - - SetFileName(empty_strW); - - UpdateWindowCaption(); - return(TRUE); -} - - -void DoOpenFile(LPCWSTR szFileName) -{ - HANDLE hFile; - LPSTR pTemp; - DWORD size; - DWORD dwNumRead; - - /* Close any files and prompt to save changes */ - if (!DoCloseFile()) - return; - - hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if(hFile == INVALID_HANDLE_VALUE) - { - ShowLastError(); - return; - } - - size = GetFileSize(hFile, NULL); - if (size == INVALID_FILE_SIZE) - { - CloseHandle(hFile); - ShowLastError(); - return; - } - size++; - - pTemp = HeapAlloc(GetProcessHeap(), 0, size); - if (!pTemp) - { - CloseHandle(hFile); - ShowLastError(); - return; - } - - if (!ReadFile(hFile, pTemp, size, &dwNumRead, NULL)) - { - CloseHandle(hFile); - HeapFree(GetProcessHeap(), 0, pTemp); - ShowLastError(); - return; - } - - CloseHandle(hFile); - pTemp[dwNumRead] = 0; - - if (IsTextUnicode(pTemp, dwNumRead, NULL)) - { - LPWSTR p = (LPWSTR)pTemp; - /* We need to strip BOM Unicode character, SetWindowTextW won't do it for us. */ - if (*p == 0xFEFF || *p == 0xFFFE) p++; - SetWindowTextW(Globals.hEdit, p); - } - else - SetWindowTextA(Globals.hEdit, pTemp); - - HeapFree(GetProcessHeap(), 0, pTemp); - - SendMessage(Globals.hEdit, EM_SETMODIFY, FALSE, 0); - SendMessage(Globals.hEdit, EM_EMPTYUNDOBUFFER, 0, 0); - SetFocus(Globals.hEdit); - - SetFileName(szFileName); - UpdateWindowCaption(); -} - -VOID DIALOG_FileNew(VOID) -{ - static const WCHAR empty_strW[] = { 0 }; - - /* Close any files and promt to save changes */ - if (DoCloseFile()) { - SetWindowText(Globals.hEdit, empty_strW); - SendMessage(Globals.hEdit, EM_EMPTYUNDOBUFFER, 0, 0); - SetFocus(Globals.hEdit); - } -} - -VOID DIALOG_FileOpen(VOID) -{ - OPENFILENAME openfilename; - WCHAR szPath[MAX_PATH]; - WCHAR szDir[MAX_PATH]; - static const WCHAR szDefaultExt[] = { 't','x','t',0 }; - static const WCHAR txt_files[] = { '*','.','t','x','t',0 }; - - ZeroMemory(&openfilename, sizeof(openfilename)); - - GetCurrentDirectory(SIZEOF(szDir), szDir); - lstrcpy(szPath, txt_files); - - openfilename.lStructSize = sizeof(openfilename); - openfilename.hwndOwner = Globals.hMainWnd; - openfilename.hInstance = Globals.hInstance; - openfilename.lpstrFilter = Globals.szFilter; - openfilename.lpstrFile = szPath; - openfilename.nMaxFile = SIZEOF(szPath); - openfilename.lpstrInitialDir = szDir; - openfilename.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | - OFN_HIDEREADONLY; - openfilename.lpstrDefExt = szDefaultExt; - - - if (GetOpenFileName(&openfilename)) { - if (FileExists(openfilename.lpstrFile)) - DoOpenFile(openfilename.lpstrFile); - else - AlertFileNotFound(openfilename.lpstrFile); - } -} - - -VOID DIALOG_FileSave(VOID) -{ - if (Globals.szFileName[0] == '\0') - DIALOG_FileSaveAs(); - else - DoSaveFile(); -} - -VOID DIALOG_FileSaveAs(VOID) -{ - OPENFILENAME saveas; - WCHAR szPath[MAX_PATH]; - WCHAR szDir[MAX_PATH]; - static const WCHAR szDefaultExt[] = { 't','x','t',0 }; - static const WCHAR txt_files[] = { '*','.','t','x','t',0 }; - - ZeroMemory(&saveas, sizeof(saveas)); - - GetCurrentDirectory(SIZEOF(szDir), szDir); - lstrcpy(szPath, txt_files); - - saveas.lStructSize = sizeof(OPENFILENAME); - saveas.hwndOwner = Globals.hMainWnd; - saveas.hInstance = Globals.hInstance; - saveas.lpstrFilter = Globals.szFilter; - saveas.lpstrFile = szPath; - saveas.nMaxFile = SIZEOF(szPath); - saveas.lpstrInitialDir = szDir; - saveas.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | - OFN_HIDEREADONLY; - saveas.lpstrDefExt = szDefaultExt; - - if (GetSaveFileName(&saveas)) { - SetFileName(szPath); - UpdateWindowCaption(); - DoSaveFile(); - } -} - -VOID DIALOG_FilePrint(VOID) -{ - DOCINFO di; - PRINTDLG printer; - SIZE szMetric; - int cWidthPels, cHeightPels, border; - int xLeft, yTop, i, pagecount, dopage, copycount; - LOGFONT hdrFont; - HFONT font, old_font=0; - DWORD size; - LPWSTR pTemp; - static const WCHAR times_new_romanW[] = { 'T','i','m','e','s',' ','N','e','w',' ','R','o','m','a','n',0 }; - - /* Get a small font and print some header info on each page */ - hdrFont.lfHeight = 100; - hdrFont.lfWidth = 0; - hdrFont.lfEscapement = 0; - hdrFont.lfOrientation = 0; - hdrFont.lfWeight = FW_BOLD; - hdrFont.lfItalic = 0; - hdrFont.lfUnderline = 0; - hdrFont.lfStrikeOut = 0; - hdrFont.lfCharSet = ANSI_CHARSET; - hdrFont.lfOutPrecision = OUT_DEFAULT_PRECIS; - hdrFont.lfClipPrecision = CLIP_DEFAULT_PRECIS; - hdrFont.lfQuality = PROOF_QUALITY; - hdrFont.lfPitchAndFamily = VARIABLE_PITCH | FF_ROMAN; - lstrcpy(hdrFont.lfFaceName, times_new_romanW); - - font = CreateFontIndirect(&hdrFont); - - /* Get Current Settings */ - ZeroMemory(&printer, sizeof(printer)); - printer.lStructSize = sizeof(printer); - printer.hwndOwner = Globals.hMainWnd; - printer.hInstance = Globals.hInstance; - - /* Set some default flags */ - printer.Flags = PD_RETURNDC; - printer.nFromPage = 0; - printer.nMinPage = 1; - /* we really need to calculate number of pages to set nMaxPage and nToPage */ - printer.nToPage = 0; - printer.nMaxPage = -1; - - /* Let commdlg manage copy settings */ - printer.nCopies = (WORD)PD_USEDEVMODECOPIES; - - if (!PrintDlg(&printer)) return; - - assert(printer.hDC != 0); - - /* initialize DOCINFO */ - di.cbSize = sizeof(DOCINFO); - di.lpszDocName = Globals.szFileTitle; - di.lpszOutput = NULL; - di.lpszDatatype = NULL; - di.fwType = 0; - - if (StartDoc(printer.hDC, &di) <= 0) return; - - /* Get the page dimensions in pixels. */ - cWidthPels = GetDeviceCaps(printer.hDC, HORZRES); - cHeightPels = GetDeviceCaps(printer.hDC, VERTRES); - - /* Get the file text */ - size = GetWindowTextLength(Globals.hEdit) + 1; - pTemp = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR)); - if (!pTemp) - { - ShowLastError(); - return; - } - size = GetWindowText(Globals.hEdit, pTemp, size); - - border = 150; - for (copycount=1; copycount <= printer.nCopies; copycount++) { - i = 0; - pagecount = 1; - do { - static const WCHAR letterM[] = { 'M',0 }; - - if (pagecount >= printer.nFromPage && - /* ((printer.Flags & PD_PAGENUMS) == 0 || pagecount <= printer.nToPage))*/ - pagecount <= printer.nToPage) - dopage = 1; - else - dopage = 0; - - old_font = SelectObject(printer.hDC, font); - GetTextExtentPoint32(printer.hDC, letterM, 1, &szMetric); - - if (dopage) { - if (StartPage(printer.hDC) <= 0) { - static const WCHAR failedW[] = { 'S','t','a','r','t','P','a','g','e',' ','f','a','i','l','e','d',0 }; - static const WCHAR errorW[] = { 'P','r','i','n','t',' ','E','r','r','o','r',0 }; - MessageBox(Globals.hMainWnd, failedW, errorW, MB_ICONEXCLAMATION); - return; - } - /* Write a rectangle and header at the top of each page */ - Rectangle(printer.hDC, border, border, cWidthPels-border, border+szMetric.cy*2); - /* I don't know what's up with this TextOut command. This comes out - kind of mangled. - */ - TextOut(printer.hDC, border*2, border+szMetric.cy/2, Globals.szFileTitle, lstrlen(Globals.szFileTitle)); - } - - /* The starting point for the main text */ - xLeft = border*2; - yTop = border+szMetric.cy*4; - - SelectObject(printer.hDC, old_font); - GetTextExtentPoint32(printer.hDC, letterM, 1, &szMetric); - - /* Since outputting strings is giving me problems, output the main - text one character at a time. - */ - do { - if (pTemp[i] == '\n') { - xLeft = border*2; - yTop += szMetric.cy; - } - else if (pTemp[i] != '\r') { - if (dopage) - TextOut(printer.hDC, xLeft, yTop, &pTemp[i], 1); - xLeft += szMetric.cx; - } - } while (i++<size && yTop<(cHeightPels-border*2)); - - if (dopage) - EndPage(printer.hDC); - pagecount++; - } while (i<size); - } - - EndDoc(printer.hDC); - DeleteDC(printer.hDC); - HeapFree(GetProcessHeap(), 0, pTemp); -} - -VOID DIALOG_FilePrinterSetup(VOID) -{ - PRINTDLG printer; - - ZeroMemory(&printer, sizeof(printer)); - printer.lStructSize = sizeof(printer); - printer.hwndOwner = Globals.hMainWnd; - printer.hInstance = Globals.hInstance; - printer.Flags = PD_PRINTSETUP; - printer.nCopies = 1; - - PrintDlg(&printer); -} - -VOID DIALOG_FileExit(VOID) -{ - PostMessage(Globals.hMainWnd, WM_CLOSE, 0, 0l); -} - -VOID DIALOG_EditUndo(VOID) -{ - SendMessage(Globals.hEdit, EM_UNDO, 0, 0); -} - -VOID DIALOG_EditCut(VOID) -{ - SendMessage(Globals.hEdit, WM_CUT, 0, 0); -} - -VOID DIALOG_EditCopy(VOID) -{ - SendMessage(Globals.hEdit, WM_COPY, 0, 0); -} - -VOID DIALOG_EditPaste(VOID) -{ - SendMessage(Globals.hEdit, WM_PASTE, 0, 0); -} - -VOID DIALOG_EditDelete(VOID) -{ - SendMessage(Globals.hEdit, WM_CLEAR, 0, 0); -} - -VOID DIALOG_EditSelectAll(VOID) -{ - SendMessage(Globals.hEdit, EM_SETSEL, 0, (LPARAM)-1); -} - -VOID DIALOG_EditTimeDate(VOID) -{ - SYSTEMTIME st; - WCHAR szDate[MAX_STRING_LEN]; - static const WCHAR spaceW[] = { ' ',0 }; - - GetLocalTime(&st); - - GetTimeFormat(LOCALE_USER_DEFAULT, 0, &st, NULL, szDate, MAX_STRING_LEN); - SendMessage(Globals.hEdit, EM_REPLACESEL, TRUE, (LPARAM)szDate); - - SendMessage(Globals.hEdit, EM_REPLACESEL, TRUE, (LPARAM)spaceW); - - GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, szDate, MAX_STRING_LEN); - SendMessage(Globals.hEdit, EM_REPLACESEL, TRUE, (LPARAM)szDate); -} - -VOID DIALOG_EditWrap(VOID) -{ - Globals.bWrapLongLines = !Globals.bWrapLongLines; - CheckMenuItem(GetMenu(Globals.hMainWnd), CMD_WRAP, - MF_BYCOMMAND | (Globals.bWrapLongLines ? MF_CHECKED : MF_UNCHECKED)); -} - -VOID DIALOG_SelectFont(VOID) -{ - CHOOSEFONT cf; - LOGFONT lf=Globals.lfFont; - - ZeroMemory( &cf, sizeof(cf) ); - cf.lStructSize=sizeof(cf); - cf.hwndOwner=Globals.hMainWnd; - cf.lpLogFont=&lf; - cf.Flags=CF_SCREENFONTS; - - if( ChooseFont(&cf) ) - { - HFONT currfont=Globals.hFont; - - Globals.hFont=CreateFontIndirect( &lf ); - Globals.lfFont=lf; - SendMessage( Globals.hEdit, WM_SETFONT, (WPARAM)Globals.hFont, (LPARAM)TRUE ); - if( currfont!=NULL ) - DeleteObject( currfont ); - } -} - -VOID DIALOG_Search(VOID) -{ - ZeroMemory(&Globals.find, sizeof(Globals.find)); - Globals.find.lStructSize = sizeof(Globals.find); - Globals.find.hwndOwner = Globals.hMainWnd; - Globals.find.hInstance = Globals.hInstance; - Globals.find.lpstrFindWhat = Globals.szFindText; - Globals.find.wFindWhatLen = SIZEOF(Globals.szFindText); - Globals.find.Flags = FR_DOWN; - - /* We only need to create the modal FindReplace dialog which will */ - /* notify us of incoming events using hMainWnd Window Messages */ - - Globals.hFindReplaceDlg = FindText(&Globals.find); - assert(Globals.hFindReplaceDlg !=0); -} - -VOID DIALOG_SearchNext(VOID) -{ - /* FIXME: Search Next */ - DIALOG_Search(); -} - -VOID DIALOG_HelpContents(VOID) -{ - WinHelp(Globals.hMainWnd, helpfileW, HELP_INDEX, 0); -} - -VOID DIALOG_HelpSearch(VOID) -{ - /* Search Help */ -} - -VOID DIALOG_HelpHelp(VOID) -{ - WinHelp(Globals.hMainWnd, helpfileW, HELP_HELPONHELP, 0); -} - -VOID DIALOG_HelpLicense(VOID) -{ - WineLicense(Globals.hMainWnd); -} - -VOID DIALOG_HelpNoWarranty(VOID) -{ - WineWarranty(Globals.hMainWnd); -} - -VOID DIALOG_HelpAboutWine(VOID) -{ - static const WCHAR notepadW[] = { 'N','o','t','e','p','a','d','\n',0 }; - WCHAR szNotepad[MAX_STRING_LEN]; - - LoadString(Globals.hInstance, STRING_NOTEPAD, szNotepad, SIZEOF(szNotepad)); - ShellAbout(Globals.hMainWnd, szNotepad, notepadW, 0); -} - - -/*********************************************************************** - * - * DIALOG_FilePageSetup - */ -VOID DIALOG_FilePageSetup(void) -{ - DialogBox(Globals.hInstance, MAKEINTRESOURCE(DIALOG_PAGESETUP), - Globals.hMainWnd, DIALOG_PAGESETUP_DlgProc); -} - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * DIALOG_PAGESETUP_DlgProc - */ - -static INT_PTR WINAPI DIALOG_PAGESETUP_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - - switch (msg) - { - case WM_COMMAND: - switch (wParam) - { - case IDOK: - /* save user input and close dialog */ - GetDlgItemText(hDlg, 0x141, Globals.szHeader, SIZEOF(Globals.szHeader)); - GetDlgItemText(hDlg, 0x143, Globals.szFooter, SIZEOF(Globals.szFooter)); - GetDlgItemText(hDlg, 0x14A, Globals.szMarginTop, SIZEOF(Globals.szMarginTop)); - GetDlgItemText(hDlg, 0x150, Globals.szMarginBottom, SIZEOF(Globals.szMarginBottom)); - GetDlgItemText(hDlg, 0x147, Globals.szMarginLeft, SIZEOF(Globals.szMarginLeft)); - GetDlgItemText(hDlg, 0x14D, Globals.szMarginRight, SIZEOF(Globals.szMarginRight)); - EndDialog(hDlg, IDOK); - return TRUE; - - case IDCANCEL: - /* discard user input and close dialog */ - EndDialog(hDlg, IDCANCEL); - return TRUE; - - case IDHELP: - { - /* FIXME: Bring this to work */ - static const WCHAR sorryW[] = { 'S','o','r','r','y',',',' ','n','o',' ','h','e','l','p',' ','a','v','a','i','l','a','b','l','e',0 }; - static const WCHAR helpW[] = { 'H','e','l','p',0 }; - MessageBox(Globals.hMainWnd, sorryW, helpW, MB_ICONEXCLAMATION); - return TRUE; - } - - default: - break; - } - break; - - case WM_INITDIALOG: - /* fetch last user input prior to display dialog */ - SetDlgItemText(hDlg, 0x141, Globals.szHeader); - SetDlgItemText(hDlg, 0x143, Globals.szFooter); - SetDlgItemText(hDlg, 0x14A, Globals.szMarginTop); - SetDlgItemText(hDlg, 0x150, Globals.szMarginBottom); - SetDlgItemText(hDlg, 0x147, Globals.szMarginLeft); - SetDlgItemText(hDlg, 0x14D, Globals.szMarginRight); - break; - } - - return FALSE; -} diff --git a/reactos/apps/dist/notepad/dialog.h b/reactos/apps/dist/notepad/dialog.h deleted file mode 100644 index 98f4d1562c5..00000000000 --- a/reactos/apps/dist/notepad/dialog.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Notepad (dialog.h) - * - * Copyright 1998 Marcel Baur <mbaur@g26.ethz.ch> - * - * 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 - */ - -VOID DIALOG_FileNew(VOID); -VOID DIALOG_FileOpen(VOID); -VOID DIALOG_FileSave(VOID); -VOID DIALOG_FileSaveAs(VOID); -VOID DIALOG_FilePrint(VOID); -VOID DIALOG_FilePageSetup(VOID); -VOID DIALOG_FilePrinterSetup(VOID); -VOID DIALOG_FileExit(VOID); - -VOID DIALOG_EditUndo(VOID); -VOID DIALOG_EditCut(VOID); -VOID DIALOG_EditCopy(VOID); -VOID DIALOG_EditPaste(VOID); -VOID DIALOG_EditDelete(VOID); -VOID DIALOG_EditSelectAll(VOID); -VOID DIALOG_EditTimeDate(VOID); -VOID DIALOG_EditWrap(VOID); - -VOID DIALOG_Search(VOID); -VOID DIALOG_SearchNext(VOID); - -VOID DIALOG_SelectFont(VOID); - -VOID DIALOG_HelpContents(VOID); -VOID DIALOG_HelpSearch(VOID); -VOID DIALOG_HelpHelp(VOID); -VOID DIALOG_HelpLicense(VOID); -VOID DIALOG_HelpNoWarranty(VOID); -VOID DIALOG_HelpAboutWine(VOID); - -VOID DIALOG_TimeDate(VOID); - -/* utility functions */ -VOID ShowLastError(); -BOOL FileExists(LPCWSTR szFilename); -BOOL DoCloseFile(void); -void DoOpenFile(LPCWSTR szFileName); diff --git a/reactos/apps/dist/notepad/license.c b/reactos/apps/dist/notepad/license.c deleted file mode 100644 index 1fcef2336e6..00000000000 --- a/reactos/apps/dist/notepad/license.c +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Notepad (license.h) - * - * Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch> - * - * 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 <windows.h> -#include "license.h" - -VOID WineLicense(HWND Wnd) -{ - /* FIXME: should load strings from resources */ - LICENSE *License = &WineLicense_En; - MessageBox(Wnd, License->License, License->LicenseCaption, - MB_ICONINFORMATION | MB_OK); -} - - -VOID WineWarranty(HWND Wnd) -{ - /* FIXME: should load strings from resources */ - LICENSE *License = &WineLicense_En; - MessageBox(Wnd, License->Warranty, License->WarrantyCaption, - MB_ICONEXCLAMATION | MB_OK); -} - diff --git a/reactos/apps/dist/notepad/license.h b/reactos/apps/dist/notepad/license.h deleted file mode 100644 index 418bb66f5c7..00000000000 --- a/reactos/apps/dist/notepad/license.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Notepad (license.h) - * - * Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch> - * - * 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 - */ - -VOID WineLicense(HWND hWnd); -VOID WineWarranty(HWND hWnd); - -typedef struct -{ - LPCSTR License, LicenseCaption; - LPCSTR Warranty, WarrantyCaption; -} LICENSE; - -/* -extern LICENSE WineLicense_Ca; -extern LICENSE WineLicense_Cz; -extern LICENSE WineLicense_Da; -extern LICENSE WineLicense_De; -*/ - -extern LICENSE WineLicense_En; - -/* -extern LICENSE WineLicense_Eo; -extern LICENSE WineLicense_Es; -extern LICENSE WineLicense_Fi; -extern LICENSE WineLicense_Fr; -extern LICENSE WineLicense_Hu; -extern LICENSE WineLicense_It; -extern LICENSE WineLicense_Ko; -extern LICENSE WineLicense_No; -extern LICENSE WineLicense_Pl; -extern LICENSE WineLicense_Po; -extern LICENSE WineLicense_Sw; -extern LICENSE WineLicense_Va; -*/ diff --git a/reactos/apps/dist/notepad/main.c b/reactos/apps/dist/notepad/main.c deleted file mode 100644 index a63f0535d24..00000000000 --- a/reactos/apps/dist/notepad/main.c +++ /dev/null @@ -1,354 +0,0 @@ -/* - * Notepad - * - * Copyright 2000 Mike McCormack <Mike_McCormack@looksmart.com.au> - * Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch> - * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> - * Copyright 2002 Andriy Palamarchuk - * - * 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 UNICODE - -#include <windows.h> -#include <stdio.h> - -#include "main.h" -#include "dialog.h" -#include "notepad_res.h" - -NOTEPAD_GLOBALS Globals; -static ATOM aFINDMSGSTRING; - -/*********************************************************************** - * - * SetFileName - * - * Sets Global File Name. - */ -VOID SetFileName(LPCWSTR szFileName) -{ - lstrcpy(Globals.szFileName, szFileName); - Globals.szFileTitle[0] = 0; - GetFileTitle(szFileName, Globals.szFileTitle, sizeof(Globals.szFileTitle)); -} - -/*********************************************************************** - * - * NOTEPAD_MenuCommand - * - * All handling of main menu events - */ -static int NOTEPAD_MenuCommand(WPARAM wParam) -{ - switch (wParam) - { - case CMD_NEW: DIALOG_FileNew(); break; - case CMD_OPEN: DIALOG_FileOpen(); break; - case CMD_SAVE: DIALOG_FileSave(); break; - case CMD_SAVE_AS: DIALOG_FileSaveAs(); break; - case CMD_PRINT: DIALOG_FilePrint(); break; - case CMD_PAGE_SETUP: DIALOG_FilePageSetup(); break; - case CMD_PRINTER_SETUP: DIALOG_FilePrinterSetup();break; - case CMD_EXIT: DIALOG_FileExit(); break; - - case CMD_UNDO: DIALOG_EditUndo(); break; - case CMD_CUT: DIALOG_EditCut(); break; - case CMD_COPY: DIALOG_EditCopy(); break; - case CMD_PASTE: DIALOG_EditPaste(); break; - case CMD_DELETE: DIALOG_EditDelete(); break; - case CMD_SELECT_ALL: DIALOG_EditSelectAll(); break; - case CMD_TIME_DATE: DIALOG_EditTimeDate();break; - - case CMD_SEARCH: DIALOG_Search(); break; - case CMD_SEARCH_NEXT: DIALOG_SearchNext(); break; - - case CMD_WRAP: DIALOG_EditWrap(); break; - case CMD_FONT: DIALOG_SelectFont(); break; - - case CMD_HELP_CONTENTS: DIALOG_HelpContents(); break; - case CMD_HELP_SEARCH: DIALOG_HelpSearch(); break; - case CMD_HELP_ON_HELP: DIALOG_HelpHelp(); break; - case CMD_LICENSE: DIALOG_HelpLicense(); break; - case CMD_NO_WARRANTY: DIALOG_HelpNoWarranty(); break; - case CMD_ABOUT_WINE: DIALOG_HelpAboutWine(); break; - - default: - break; - } - return 0; -} - -/*********************************************************************** - * Data Initialization - */ -static VOID NOTEPAD_InitData(VOID) -{ - LPWSTR p = Globals.szFilter; - static const WCHAR txt_files[] = { '*','.','t','x','t',0 }; - static const WCHAR all_files[] = { '*','.','*',0 }; - - LoadString(Globals.hInstance, STRING_TEXT_FILES_TXT, p, MAX_STRING_LEN); - p += lstrlen(p) + 1; - lstrcpy(p, txt_files); - p += lstrlen(p) + 1; - LoadString(Globals.hInstance, STRING_ALL_FILES, p, MAX_STRING_LEN); - p += lstrlen(p) + 1; - lstrcpy(p, all_files); - p += lstrlen(p) + 1; - *p = '\0'; -} - -/*********************************************************************** - * - * NOTEPAD_WndProc - */ -static LRESULT WINAPI NOTEPAD_WndProc(HWND hWnd, UINT msg, WPARAM wParam, - LPARAM lParam) -{ - switch (msg) { - - case WM_CREATE: - { - static const WCHAR editW[] = { 'e','d','i','t',0 }; - RECT rc; - GetClientRect(hWnd, &rc); - Globals.hEdit = CreateWindow(editW, NULL, - WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | - ES_AUTOVSCROLL | ES_MULTILINE, - 0, 0, rc.right, rc.bottom, hWnd, - NULL, Globals.hInstance, NULL); - break; - } - - case WM_COMMAND: - NOTEPAD_MenuCommand(LOWORD(wParam)); - break; - - case WM_DESTROYCLIPBOARD: - /*MessageBox(Globals.hMainWnd, "Empty clipboard", "Debug", MB_ICONEXCLAMATION);*/ - break; - - case WM_CLOSE: - if (DoCloseFile()) { - DestroyWindow(hWnd); - } - break; - - case WM_DESTROY: - PostQuitMessage(0); - break; - - case WM_SIZE: - SetWindowPos(Globals.hEdit, NULL, 0, 0, LOWORD(lParam), HIWORD(lParam), - SWP_NOOWNERZORDER | SWP_NOZORDER); - break; - - case WM_SETFOCUS: - SetFocus(Globals.hEdit); - break; - - case WM_DROPFILES: - { - WCHAR szFileName[MAX_PATH]; - HANDLE hDrop = (HANDLE) wParam; - - DragQueryFile(hDrop, 0, szFileName, SIZEOF(szFileName)); - DragFinish(hDrop); - DoOpenFile(szFileName); - break; - } - - default: - return DefWindowProc(hWnd, msg, wParam, lParam); - } - return 0; -} - -static int AlertFileDoesNotExist(LPCWSTR szFileName) -{ - int nResult; - WCHAR szMessage[MAX_STRING_LEN]; - WCHAR szResource[MAX_STRING_LEN]; - - LoadString(Globals.hInstance, STRING_DOESNOTEXIST, szResource, SIZEOF(szResource)); - wsprintf(szMessage, szResource, szFileName); - - LoadString(Globals.hInstance, STRING_ERROR, szResource, SIZEOF(szResource)); - - nResult = MessageBox(Globals.hMainWnd, szMessage, szResource, - MB_ICONEXCLAMATION | MB_YESNO); - - return(nResult); -} - -static void HandleCommandLine(LPWSTR cmdline) -{ - WCHAR delimiter; - - /* skip white space */ - while (*cmdline && *cmdline == ' ') cmdline++; - - /* skip executable name */ - delimiter = ' '; - if (*cmdline == '"') - delimiter = '"'; - - do - { - cmdline++; - } - while (*cmdline && *cmdline != delimiter); - if (*cmdline == delimiter) cmdline++; - - while (*cmdline && (*cmdline == ' ' || *cmdline == '-')) - { - WCHAR option; - - if (*cmdline++ == ' ') continue; - - option = *cmdline; - if (option) cmdline++; - while (*cmdline && *cmdline == ' ') cmdline++; - - switch(option) - { - case 'p': - case 'P': printf("Print file: "); - /* TODO - not yet able to print a file */ - break; - } - } - - if (*cmdline) - { - /* file name is passed in the command line */ - LPCWSTR file_name; - BOOL file_exists; - WCHAR buf[MAX_PATH]; - - if (cmdline[0] == '"') - { - cmdline++; - cmdline[lstrlen(cmdline) - 1] = 0; - } - - if (FileExists(cmdline)) - { - file_exists = TRUE; - file_name = cmdline; - } - else - { - static const WCHAR txtW[] = { '.','t','x','t',0 }; - - /* try to find file with ".txt" extension */ - if (!lstrcmp(txtW, cmdline + lstrlen(cmdline) - lstrlen(txtW))) - { - file_exists = FALSE; - file_name = cmdline; - } - else - { - lstrcpyn(buf, cmdline, MAX_PATH - lstrlen(txtW) - 1); - lstrcat(buf, txtW); - file_name = buf; - file_exists = FileExists(buf); - } - } - - if (file_exists) - { - DoOpenFile(file_name); - InvalidateRect(Globals.hMainWnd, NULL, FALSE); - } - else - { - switch (AlertFileDoesNotExist(file_name)) { - case IDYES: - DoOpenFile(file_name); - break; - - case IDNO: - break; - } - } - } -} - -/*********************************************************************** - * - * WinMain - */ -int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE prev, LPSTR cmdline, int show) -{ - MSG msg; - HACCEL hAccel; - WNDCLASSEX class; - static const WCHAR className[] = {'N','P','C','l','a','s','s',0}; - static const WCHAR winName[] = {'N','o','t','e','p','a','d',0}; - - aFINDMSGSTRING = RegisterWindowMessage(FINDMSGSTRING); - - ZeroMemory(&Globals, sizeof(Globals)); - Globals.hInstance = hInstance; - - ZeroMemory(&class, sizeof(class)); - class.cbSize = sizeof(class); - class.lpfnWndProc = NOTEPAD_WndProc; - class.hInstance = Globals.hInstance; - class.hIcon = LoadIcon(0, IDI_APPLICATION); - class.hCursor = LoadCursor(0, IDC_ARROW); - class.hbrBackground = (HBRUSH)(COLOR_WINDOW); - class.lpszMenuName = MAKEINTRESOURCE(MAIN_MENU); - class.lpszClassName = className; - - if (!RegisterClassEx(&class)) return FALSE; - - /* Setup windows */ - - Globals.hMainWnd = - CreateWindow(className, winName, WS_OVERLAPPEDWINDOW, - CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, - NULL, NULL, Globals.hInstance, NULL); - if (!Globals.hMainWnd) - { - ShowLastError(); - ExitProcess(1); - } - - NOTEPAD_InitData(); - DIALOG_FileNew(); - - ShowWindow(Globals.hMainWnd, show); - UpdateWindow(Globals.hMainWnd); - DragAcceptFiles(Globals.hMainWnd, TRUE); - - HandleCommandLine(GetCommandLine()); - - hAccel = LoadAccelerators( hInstance, MAKEINTRESOURCE(ID_ACCEL) ); - - while (GetMessage(&msg, 0, 0, 0)) - { - if (!TranslateAccelerator(Globals.hMainWnd, hAccel, &msg) && !IsDialogMessage(Globals.hFindReplaceDlg, &msg)) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } - return msg.wParam; -} diff --git a/reactos/apps/dist/notepad/main.h b/reactos/apps/dist/notepad/main.h deleted file mode 100644 index 06517d0966d..00000000000 --- a/reactos/apps/dist/notepad/main.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Notepad (notepad.h) - * - * Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch> - * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> - * - * 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 SIZEOF(a) sizeof(a)/sizeof((a)[0]) - -#include "notepad_res.h" - -#define MAX_STRING_LEN 255 - -typedef struct -{ - HANDLE hInstance; - HWND hMainWnd; - HWND hFindReplaceDlg; - HWND hEdit; - HFONT hFont; /* Font used by the edit control */ - LOGFONT lfFont; - BOOL bWrapLongLines; - WCHAR szFindText[MAX_PATH]; - WCHAR szFileName[MAX_PATH]; - WCHAR szFileTitle[MAX_PATH]; - WCHAR szFilter[2 * MAX_STRING_LEN + 100]; - WCHAR szMarginTop[MAX_PATH]; - WCHAR szMarginBottom[MAX_PATH]; - WCHAR szMarginLeft[MAX_PATH]; - WCHAR szMarginRight[MAX_PATH]; - WCHAR szHeader[MAX_PATH]; - WCHAR szFooter[MAX_PATH]; - - FINDREPLACE find; -} NOTEPAD_GLOBALS; - -extern NOTEPAD_GLOBALS Globals; - -VOID SetFileName(LPCWSTR szFileName); diff --git a/reactos/apps/dist/notepad/makefile b/reactos/apps/dist/notepad/makefile deleted file mode 100644 index 5e877323a5d..00000000000 --- a/reactos/apps/dist/notepad/makefile +++ /dev/null @@ -1,27 +0,0 @@ -# $Id: makefile,v 1.4 2004/01/13 00:01:52 sedwards Exp $ - -PATH_TO_TOP = ../../.. - -TARGET_NORC = no - -TARGET_TYPE = program - -TARGET_APPTYPE = windows - -TARGET_NAME = notepad - -TARGET_CFLAGS = -Wall -Werror -D__USE_W32API - -TARGET_SDKLIBS = comdlg32.a shell32.a user32.a gdi32.a - -TARGET_OBJECTS = \ - License_En.o \ - dialog.o \ - license.o \ - main.o - -include $(PATH_TO_TOP)/rules.mak - -include $(TOOLS_PATH)/helper.mk - -# EOF diff --git a/reactos/apps/dist/notepad/notepad.ico b/reactos/apps/dist/notepad/notepad.ico deleted file mode 100644 index b7481b412cf6f25e447fbf80fda2d91fc143fab8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22534 zcmeHP3s_Xu+I|5MZ=mK4yakFNs0bNqR%!|+W)0p_6udy1m=|sdY6_`&N%M;LyHVb_ zg9DPyc<MZz%1X1+Q0aJ5vOmD+{D0?E|H*aUwTC?p!)?T)!E^YWcfPgu`qtX-`u1jK z?>*}kutF0!JGX+g@2!DV^sQPM>OHN1`8I&Jx6+KG4#4(CV0>A<2{5>gj5pM0+XCNp zGKud2Jm+E(-vao@2$Oh@wSOGYlilTzLkTNzW3`q5@P&i~gX24kL;}v7Il~5_ydZ=u z5&S1N@$I;ovALYZmbZwwHRUWKE}o+p?U#mnyfGOpFdyae7gsTVeyR<Xd5?%wt9~OB z)-*||rmh557_Z#!Vq+uB4sV5Oxr6-&ROERs|5Tib2XUTrH;R?zDI(5rxbEH?22hSq zX=$l?oYdnHp&kb{;p%>C>t&wgN6vIYem+%Yk#p8zNz_)Q`K__;cyo+94hOnp%gF9H zGR~Fgfw#uG;jM9QNTN?-OzQ06NS^3|6VG?UapLHN?u0A0ga;yHau=d2QiC2w+9YSB z5V=#Ga5AJL(Fs{oIwLE%3r^2ykG$!QI7Q@6bHblrY(=!jnHSnZ7uF7+&TWRXFWKY6 zaC>|d?tl+wx5NkGEs-?S10Sys#HmmaR>&ptW32IYv^6rPS>wbMYaAy|h1uX@lr8cX zHpZ6`jd3#67GFf#;lhF@_&lNsF2^;)x%o|TdUjJ>jCH_!3)<j=7)N}#s2k2Mb;n=V z^~Q(G`{9Q@{<yedC`yth;Fr^{;8)$NxEKvwhy>o9MGj#g2ZBC7hFo5@!bSQoqpa}W z94nljX~h`wBvL}G$c+e=an|HU-jX}Z7wJ#Wv}O$F5G>nlxSgQCNPj-k1|Rc_<l_Z4 z>@V9JAwRYeV+fWn(dWn7;?hD}d>z}EWjlPe&<>Yko8VGhQ{;2Lmlrk1<;BgBzqkdy zCN3{=z~_tF;FH+)C|KSRe~xj&doi6*w8<SmZ0d=kExl2+wKs~l_Mw;XLdiC76ekkW zZ<p{v@s57DvR?ZBDA_pxCA$Zrcqg%IAj^YLviC`1FpBAK?PD(Y4Z*Gb!*J_>A4(4R z<Hy4RxOIr2zkYBWemFK2-(39*ZvX2hO8A{qO8g)33-K%Q8}a|dzlh(7+r)^7>j;ZH zseDI8M@J(fA_C#z;g~UF2BuG+j%m}TAtWROQ>IKoP*4yiO`25IpTvLFc71)fle)Vw zt-g_k*4S1C>h$)_o7*&(W=X#mI(^e4Cr+G5CQckZb}YF%JAUFwGo8MP43}2ss_T(# zr_(=FZGc&0Yn{GTN^)`v|5;)uTI%!;DJhl(%K;sA`u3@ePf1CYt|m+ApwqWYO-)Uf zu)tE<>hxVKjFrQscGl@TrlqD?Ftieq+DWH(N>59-INn94cTP{YI6nPhoxW>&dWNOr zr+00LuP#?IKRq%m&VPDF51rmMJKNIyXJokQ^xd+vvy+qgs?iwO{r<;$N;(!9`SjB1 zdn)`b>A*mb(|UIc;tdI5pnIO)O~zN=$DC<)wp*@#NaeAW5zNjWlB<8h(s;&YKbfn4 zOnOW0@m&3Yx9`H9I;HR5Z_1+~zVqgV_y&i}3z;|1H<&P3aB#4%#Jpf%df%BZ3|jGy zK1?$ysBfUxWN$BTuQ6l2z57lM4D>cwU+=)c$z#2S1q|)$=kMJcZB`C{S3mKk=O6JI zKW@gtsRNh9zY@Q6aO8poFB;5e`m|ZIqvwx&X8Dp)qa&;`vz~r6M?W_q>8*nY4!?O| z=l(-mH*ep!chBzKy9~Bt&BpbwuUqxn>J4k(*p#@f&xkE^_~rgw?6O5M&nh+{G&D+D zT$x2hg-<ZF@O{F|i(~5hwLmTS8*b;6XB#Y5^a=86(5mc`u)!M=QB@vn_zX!#*j3D9 zRe3J|+^XvP)MZhtm3;?|)!^{6-EfFFNF-@o@%Ff$NE+vXxRKsiHo6~TpY}#9%TfMb zhzsz++Mr<w9v_HF?0e{$E;!5wYDt=I^c+WmW5fk`BZBdh$7zr?dl0hcK84IVL-Ao^ zH2$(<F%Av`c<X|b;REo=_DFoZEeb)54V@N(!+aih&>uK3obV%9-p}$o^L>#sw?FpI z8jR0&%*RJNqA_K>2FFGNZwC;gfF$}4qWj?eC@=ge!W+5;KDe}Z4$iEbhOhR#gbTap z;{2|8n9P28LEO(Xz}f%@oQ?IwM+<x7%Kq8N-xrQ^;XoGKkMmjJg(a>yzt|0*#_>M( z@JtjOnuQDVfX`nd<`S|zpI88#r$0A`;I^}}J<=9mF71p<@viu0l_v_;dgA+S15nC) zwtpP<!&mDbN8yg4C_Xd>r6)ph^H><ZeKQo-h;tlI$9v)nk=D2nWy5<;TNK7O#`i0l z<N9)Y-f!CT-jksJYOw>(zif{y32ksSp)JuKS6`LrfUC=i6^`^yC|J=E1uHw^Dp9bq z6AE7IjFJs5C|LC{N;bLDyWqzyZYbI8j?zR=q8EPL)(2O}`_}fpxV57%{=TapN_Y0d z&-;B*y1PGa?e@h_dpIWr15vv7anA2a{B&RlzI=oCuScH8x2X|0nzSENL#E*Rh2tpr zJR4u1(-P93#KljukpFoOE?+o>%U_&AK7IZdxdiK9z03R8_i^>FpW&bUP^s#k)oaf0 z%KfT*?iv#lqui$|CwaqLg$(4~f6J-P^72|b$lJgcX69(`)U;_cx179(>>9VBwYP0# zV`}YeZ96n++bSoovsSV6)C@!6&U=>Dr*%$V7p+!a#&EOw)r?mAFxxw6Gc$SZTZv_A zyISYub<<|0r)5+Yk)d^EyO%aQqw*0lwB38;<n_^Jr=_J;GJJZ5)|>5vwAxBrd4HoF z!uH3iX&=n?fz`A>$@T$Cd!-Dtk9W+;^Ve!QzshEiseO8APM#n8v$bLZ(zMzUY=5?j z`K7U4!}ihaZ?bnoF(WG@o9)j%l9Trg_kU*!Y1&LB8yRW*r=89AV76CkSz7IjY!A6} zz$=tyv3*L)iK9o49C`Z)?db8Nyh=TK>`>BMZyr8)AbI!xoV<X3?jF57dwF<xczSsB z^ziJ}t5@&-qg;F+bsj$KsZ%+5bAkfLjDLRoxR>V6ojiX0q_N{CgpUlHIq`)VeNQ4h zHz)7q^?P>in4Y+4*M>K?Z`-<M-RiY#R=mFHwT+vnJrO!@AOE^yrmjj@x_Hqmi{h5W zzq)eyl2;ZjjEahlj*M6^fA9VO<Ev>8hU*8z`!#+#oFNkK53D%0jp_bmSzf2y`Q4%F z>lB9Jm5F2V+t2@t4P*LYt;Pp=389D%9D?;@9>F>yG3YV8HuY&-%G`rB)BSPf)SGxC z%pb3Z`lH~~0sQ*&-;uRo0JhB<iY+htVdG3cTtB@R*WTHOlK1zbP`4YWL!0Atm_!S_ z`+_~aJ-q|b3Li&1<HNX~_-yrH>{&b+H}yO53&%YDq64mFuS9BM9B!<4#djOs@IRY8 zadTrYe7Bj{*c&%D^}%-%Tl(VW7H?eN{3r?&`{UZ~02E$5kDFIM!VUU=a=hZp@8bI9 zPf%EJp4-l`d=`b*F5w32x5e*#HhY`TXm3~gyp}0NVqzjzu3U-u_;@T^whT*`E|uwP zu!aoO+YAJn+cVETXEe=djcrpqyC!x9Yh=?{)7-kX+o0A4vu@o?V?S!-$fwI}WI!`b zt5N<&8!^0vrbD@UOHF&zx}Sr_X_Ws6V~1hwG(GOLj~Fqmt;TWGr~sPbZB!dg&!K~# z95CRi0RtWz^2ET$T{Z5`UAuI7xNFBwox8a_WaXjh@7vGYtM4N|y*&H$ezg0e=Ci9% z7ebqvfb?`!L?&RJ18B2=jEr*aR_W<Nq-O|Wog+VI@BD7*TyM{V2IBQ11CC@_A0d+~ zd9Npq)H7_9+_}y`)Maq}gWx)d3LMLF?Ra>MTLITY2nnv6P`p}KeO;R$*KY6$r*ghH za!rTe@9ToUsT;xP6vnc;oxi^e{{F5&wm)d_cYlSG<jOTDM*duvQjTk7ywo{V*7iqi z<9Zq+f3BB#;JLilIdh$lkw4e{2(H60&Ot4!{$BU>pYAWu1+G^z^5^;`g}>xmS2>&K zfNQCY{JFkLa1D%c4l-7qi`;JBW<J(~u1juQ4`$@gHDU@!m8;~VmZg8t{A${t<j=Kj zM*dvGR;T%z&qwBzYwwKwxgJk&{gg5X>CNNoT3zzz`avUqt|=5;`=!i5`ntx~oR8$s zb&f{<T=%H(m)z?Ef60;SHI4kae$&XG>+kA({w06OS-t*g;QwHcSwsFGY`)Due;V>% zxAM<5?m~WU%Htwoe!S{ZUGkG$C1>^Xlk4=k#b9;)^I!6lkepTi)EktsH#jxlvZj{n zf;S~eeMAHQ2Yh_0$iEZyD8{C`aGq4f!AOz?>SqMkCLH76Ko{z2Oq=S|Id3`_Q<BsH z2`;}#CVv-dgG`(LaQ>2v%G<oG5|y0WwQHA3{@ti=Qa3AJ_BAzitp9{p$F1#HYJbVO zLx&Cue`=@H&5Ez>*bkzgN>p-I`BMj`ZmzTZ%MoOSx-}zzYTC@3>wKO1JC(l+wRwUX zuX+XQ1m)jviv0YfzEDtaD5&WZ)Eo+G`UG`{^eW2gQ|M)zvR(Czk+Di!S-etLx0`!8 zmWr}|rgb^CQdj%kiKUj19IXZQkAnI>`T2RA{GF&Z6x1&Y>JtU^iGo^6deB2qt0<_e zG?a~AZYNkbw9(6cvX9AjwcXUqv6Vh*tQ=pKxi9K21@)DJI!uKF^_PPBOC_FKPeFaE zpsrL<mnf*ul;2-R$={LMN<lrOpw3cI`zfda71UnRv;H#6v39J}FKjHRdlb|<3Tht} zPyM5y{!>sl$v6Y3wPe4_A;+dplVeFRhM?Ax<wk<~P(fX&png)>4|Sq~8c~kbNKjWR zs7n;oB?@Xu1$CD4`fa=9PaUVA_EJ#qD5!T7)IkdBAq91if;vd0OzotgPEt@GDX6U^ z`U&bP1@)7HI!Zx3rJ$~|46<A~sKXT0aSG}+1@)UO_aVFlHJ*Z6PeGlhpq^7u=P9V| zWSoznj#E&_DX6s-)WQntI|VhUl0R21!>%9}KGeVpYD@*Sq=Fh#LG7uaHnwu`xKQJ& zfLc{i0kKU4wW?L4tPi!Y9D`$3wI9>%@?3~*EU0}|xMfbqM9H0Ku!amYWS|~rz;Lls zQD>4M=cMXW>hb*k5bDfZRe3evF4t)}6GI6rWhn{^Er<rI%NgK*?{kk<{p{{>aCWbL zeA9azN^AI%Kdjx2)i^$%6dGQ}QH@(_EU-)U<MXFhzW8Hu?OrvG&quW!nK|LB7Q3i% zd}e?n*LoH;j!!96txY~ks44#pV3^@mResoNY%*lhaNI2!zZT><tYI&fjIT`bp5CfI zKWo9?*u_Ar`tc3<H>US)3+!Iw_#D%aPs96N?ZT4rd6;T<{#$Z<jmfM<!IJR}`DY|w zRb|Gssp0&${6H|bv>MM(Ls+ffs~`V<w{m*-_^O`aJq}(&_N(7_L+gFWfa!T&3bcF> zFx{uTPiaLs6IRMQ3ssv8eTZm%7m)GI2-%kkdPSD_D!nCG&bTFn=77d6cg=|Ig)4@; z6iX~G^J?AP$3Nv<yvpD8*4UnH&ar>Q#q?djQFAD$9Te313F`BdvaDAIH8#q>SAp!G ze{%m%GH>d71b)RSYwN1=>Y9K^KaVT2|CN)wl>YoukzXt|f?q7$*KH9q!d>bAP0o&5 z^^YBC=>NCe?RVXu+C;H9z)jizjl4u-f62{~IZ)#$mX7YB^#AUiEyn&e^_AmG$o>h> z8TuEWG4SVRdHYcgRc({oS3K)t$Y1)>pQybQ)L{zhF$J}n3aG`rQ|2~mG>K0Hb)16w zP4Rlz;LGy(<%QY(LhY!aj#N-jS_TKDPOT}uL<>P(si3}8P@gKOa}~Q6PyCeq$6j1y zf9A#p&z}m{b}cGg-Kprt8mFQgt2!3lSlgxOhOEEVw&>gCt&0j*IThVp?O61;HLk^H c<9&YA&ubpR{!NKL)DkdAe)rrp<S~%;Z_f<Dvj6}9 diff --git a/reactos/apps/dist/notepad/notepad.rc b/reactos/apps/dist/notepad/notepad.rc deleted file mode 100644 index 05ec07e336e..00000000000 --- a/reactos/apps/dist/notepad/notepad.rc +++ /dev/null @@ -1,3 +0,0 @@ -// Compatiblity Include - -#include "rsrc.rc" diff --git a/reactos/apps/dist/notepad/notepad_res.h b/reactos/apps/dist/notepad/notepad_res.h deleted file mode 100644 index e9ad744f00c..00000000000 --- a/reactos/apps/dist/notepad/notepad_res.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Constants, used in resources. - * - * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> - * Copyright 2002 Andriy Palamarchuk - * - * 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 MAIN_MENU 0x201 -#define DIALOG_PAGESETUP 0x202 -#define ID_ACCEL 0x203 - -/* Commands */ -#define CMD_NEW 0x100 -#define CMD_OPEN 0x101 -#define CMD_SAVE 0x102 -#define CMD_SAVE_AS 0x103 -#define CMD_PRINT 0x104 -#define CMD_PAGE_SETUP 0x105 -#define CMD_PRINTER_SETUP 0x106 -#define CMD_EXIT 0x108 - -#define CMD_UNDO 0x110 -#define CMD_CUT 0x111 -#define CMD_COPY 0x112 -#define CMD_PASTE 0x113 -#define CMD_DELETE 0x114 -#define CMD_SELECT_ALL 0x116 -#define CMD_TIME_DATE 0x117 - -#define CMD_SEARCH 0x120 -#define CMD_SEARCH_NEXT 0x121 - -#define CMD_WRAP 0x119 -#define CMD_FONT 0x140 - -#define CMD_HELP_CONTENTS 0x130 -#define CMD_HELP_SEARCH 0x131 -#define CMD_HELP_ON_HELP 0x132 -#define CMD_LICENSE 0x135 -#define CMD_NO_WARRANTY 0x136 -#define CMD_ABOUT_WINE 0x137 - -/* Strings */ -#define STRING_PAGESETUP_HEADERVALUE 0x160 -#define STRING_PAGESETUP_FOOTERVALUE 0x161 -#define STRING_PAGESETUP_LEFTVALUE 0x162 -#define STRING_PAGESETUP_RIGHTVALUE 0x163 -#define STRING_PAGESETUP_TOPVALUE 0x164 -#define STRING_PAGESETUP_BOTTOMVALUE 0x165 - -#define STRING_NOTEPAD 0x170 -#define STRING_ERROR 0x171 -#define STRING_WARNING 0x172 -#define STRING_INFO 0x173 -#define STRING_UNTITLED 0x174 -#define STRING_ALL_FILES 0x175 -#define STRING_TEXT_FILES_TXT 0x176 -#define STRING_TOOLARGE 0x177 -#define STRING_NOTEXT 0x178 -#define STRING_DOESNOTEXIST 0x179 -#define STRING_NOTSAVED 0x17A - -#define STRING_NOTFOUND 0x17B -#define STRING_OUT_OF_MEMORY 0x17C diff --git a/reactos/apps/dist/notepad/rsrc.rc b/reactos/apps/dist/notepad/rsrc.rc deleted file mode 100644 index abb0b08b26b..00000000000 --- a/reactos/apps/dist/notepad/rsrc.rc +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch> - * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> - * - * 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 "windef.h" -#include "winbase.h" -#include "winuser.h" -#include "main.h" -#include "winnls.h" -#include "commctrl.h" -#include "notepad_res.h" - -ID_ACCEL ACCELERATORS -{ - "^A", CMD_SELECT_ALL - "^C", CMD_COPY - "^F", CMD_SEARCH - "^O", CMD_OPEN - "^S", CMD_SAVE - "^V", CMD_PASTE - "^X", CMD_CUT - "^Z", CMD_UNDO - VK_F3, CMD_SEARCH_NEXT, VIRTKEY - VK_F5, CMD_TIME_DATE, VIRTKEY -} - -#include "Da.rc" -#include "De.rc" -#include "En.rc" -#include "Es.rc" -#include "Fi.rc" -#include "Fr.rc" -#include "Hu.rc" -#include "It.rc" -#include "Nl.rc" -#include "Pt.rc" -#include "Ru.rc" -#include "Si.rc" -#include "Sk.rc" -#include "Sw.rc" -#include "Th.rc" -#include "Wa.rc" -#include "Zh.rc" diff --git a/reactos/apps/dist/notepad/small.ico b/reactos/apps/dist/notepad/small.ico deleted file mode 100644 index b7481b412cf6f25e447fbf80fda2d91fc143fab8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22534 zcmeHP3s_Xu+I|5MZ=mK4yakFNs0bNqR%!|+W)0p_6udy1m=|sdY6_`&N%M;LyHVb_ zg9DPyc<MZz%1X1+Q0aJ5vOmD+{D0?E|H*aUwTC?p!)?T)!E^YWcfPgu`qtX-`u1jK z?>*}kutF0!JGX+g@2!DV^sQPM>OHN1`8I&Jx6+KG4#4(CV0>A<2{5>gj5pM0+XCNp zGKud2Jm+E(-vao@2$Oh@wSOGYlilTzLkTNzW3`q5@P&i~gX24kL;}v7Il~5_ydZ=u z5&S1N@$I;ovALYZmbZwwHRUWKE}o+p?U#mnyfGOpFdyae7gsTVeyR<Xd5?%wt9~OB z)-*||rmh557_Z#!Vq+uB4sV5Oxr6-&ROERs|5Tib2XUTrH;R?zDI(5rxbEH?22hSq zX=$l?oYdnHp&kb{;p%>C>t&wgN6vIYem+%Yk#p8zNz_)Q`K__;cyo+94hOnp%gF9H zGR~Fgfw#uG;jM9QNTN?-OzQ06NS^3|6VG?UapLHN?u0A0ga;yHau=d2QiC2w+9YSB z5V=#Ga5AJL(Fs{oIwLE%3r^2ykG$!QI7Q@6bHblrY(=!jnHSnZ7uF7+&TWRXFWKY6 zaC>|d?tl+wx5NkGEs-?S10Sys#HmmaR>&ptW32IYv^6rPS>wbMYaAy|h1uX@lr8cX zHpZ6`jd3#67GFf#;lhF@_&lNsF2^;)x%o|TdUjJ>jCH_!3)<j=7)N}#s2k2Mb;n=V z^~Q(G`{9Q@{<yedC`yth;Fr^{;8)$NxEKvwhy>o9MGj#g2ZBC7hFo5@!bSQoqpa}W z94nljX~h`wBvL}G$c+e=an|HU-jX}Z7wJ#Wv}O$F5G>nlxSgQCNPj-k1|Rc_<l_Z4 z>@V9JAwRYeV+fWn(dWn7;?hD}d>z}EWjlPe&<>Yko8VGhQ{;2Lmlrk1<;BgBzqkdy zCN3{=z~_tF;FH+)C|KSRe~xj&doi6*w8<SmZ0d=kExl2+wKs~l_Mw;XLdiC76ekkW zZ<p{v@s57DvR?ZBDA_pxCA$Zrcqg%IAj^YLviC`1FpBAK?PD(Y4Z*Gb!*J_>A4(4R z<Hy4RxOIr2zkYBWemFK2-(39*ZvX2hO8A{qO8g)33-K%Q8}a|dzlh(7+r)^7>j;ZH zseDI8M@J(fA_C#z;g~UF2BuG+j%m}TAtWROQ>IKoP*4yiO`25IpTvLFc71)fle)Vw zt-g_k*4S1C>h$)_o7*&(W=X#mI(^e4Cr+G5CQckZb}YF%JAUFwGo8MP43}2ss_T(# zr_(=FZGc&0Yn{GTN^)`v|5;)uTI%!;DJhl(%K;sA`u3@ePf1CYt|m+ApwqWYO-)Uf zu)tE<>hxVKjFrQscGl@TrlqD?Ftieq+DWH(N>59-INn94cTP{YI6nPhoxW>&dWNOr zr+00LuP#?IKRq%m&VPDF51rmMJKNIyXJokQ^xd+vvy+qgs?iwO{r<;$N;(!9`SjB1 zdn)`b>A*mb(|UIc;tdI5pnIO)O~zN=$DC<)wp*@#NaeAW5zNjWlB<8h(s;&YKbfn4 zOnOW0@m&3Yx9`H9I;HR5Z_1+~zVqgV_y&i}3z;|1H<&P3aB#4%#Jpf%df%BZ3|jGy zK1?$ysBfUxWN$BTuQ6l2z57lM4D>cwU+=)c$z#2S1q|)$=kMJcZB`C{S3mKk=O6JI zKW@gtsRNh9zY@Q6aO8poFB;5e`m|ZIqvwx&X8Dp)qa&;`vz~r6M?W_q>8*nY4!?O| z=l(-mH*ep!chBzKy9~Bt&BpbwuUqxn>J4k(*p#@f&xkE^_~rgw?6O5M&nh+{G&D+D zT$x2hg-<ZF@O{F|i(~5hwLmTS8*b;6XB#Y5^a=86(5mc`u)!M=QB@vn_zX!#*j3D9 zRe3J|+^XvP)MZhtm3;?|)!^{6-EfFFNF-@o@%Ff$NE+vXxRKsiHo6~TpY}#9%TfMb zhzsz++Mr<w9v_HF?0e{$E;!5wYDt=I^c+WmW5fk`BZBdh$7zr?dl0hcK84IVL-Ao^ zH2$(<F%Av`c<X|b;REo=_DFoZEeb)54V@N(!+aih&>uK3obV%9-p}$o^L>#sw?FpI z8jR0&%*RJNqA_K>2FFGNZwC;gfF$}4qWj?eC@=ge!W+5;KDe}Z4$iEbhOhR#gbTap z;{2|8n9P28LEO(Xz}f%@oQ?IwM+<x7%Kq8N-xrQ^;XoGKkMmjJg(a>yzt|0*#_>M( z@JtjOnuQDVfX`nd<`S|zpI88#r$0A`;I^}}J<=9mF71p<@viu0l_v_;dgA+S15nC) zwtpP<!&mDbN8yg4C_Xd>r6)ph^H><ZeKQo-h;tlI$9v)nk=D2nWy5<;TNK7O#`i0l z<N9)Y-f!CT-jksJYOw>(zif{y32ksSp)JuKS6`LrfUC=i6^`^yC|J=E1uHw^Dp9bq z6AE7IjFJs5C|LC{N;bLDyWqzyZYbI8j?zR=q8EPL)(2O}`_}fpxV57%{=TapN_Y0d z&-;B*y1PGa?e@h_dpIWr15vv7anA2a{B&RlzI=oCuScH8x2X|0nzSENL#E*Rh2tpr zJR4u1(-P93#KljukpFoOE?+o>%U_&AK7IZdxdiK9z03R8_i^>FpW&bUP^s#k)oaf0 z%KfT*?iv#lqui$|CwaqLg$(4~f6J-P^72|b$lJgcX69(`)U;_cx179(>>9VBwYP0# zV`}YeZ96n++bSoovsSV6)C@!6&U=>Dr*%$V7p+!a#&EOw)r?mAFxxw6Gc$SZTZv_A zyISYub<<|0r)5+Yk)d^EyO%aQqw*0lwB38;<n_^Jr=_J;GJJZ5)|>5vwAxBrd4HoF z!uH3iX&=n?fz`A>$@T$Cd!-Dtk9W+;^Ve!QzshEiseO8APM#n8v$bLZ(zMzUY=5?j z`K7U4!}ihaZ?bnoF(WG@o9)j%l9Trg_kU*!Y1&LB8yRW*r=89AV76CkSz7IjY!A6} zz$=tyv3*L)iK9o49C`Z)?db8Nyh=TK>`>BMZyr8)AbI!xoV<X3?jF57dwF<xczSsB z^ziJ}t5@&-qg;F+bsj$KsZ%+5bAkfLjDLRoxR>V6ojiX0q_N{CgpUlHIq`)VeNQ4h zHz)7q^?P>in4Y+4*M>K?Z`-<M-RiY#R=mFHwT+vnJrO!@AOE^yrmjj@x_Hqmi{h5W zzq)eyl2;ZjjEahlj*M6^fA9VO<Ev>8hU*8z`!#+#oFNkK53D%0jp_bmSzf2y`Q4%F z>lB9Jm5F2V+t2@t4P*LYt;Pp=389D%9D?;@9>F>yG3YV8HuY&-%G`rB)BSPf)SGxC z%pb3Z`lH~~0sQ*&-;uRo0JhB<iY+htVdG3cTtB@R*WTHOlK1zbP`4YWL!0Atm_!S_ z`+_~aJ-q|b3Li&1<HNX~_-yrH>{&b+H}yO53&%YDq64mFuS9BM9B!<4#djOs@IRY8 zadTrYe7Bj{*c&%D^}%-%Tl(VW7H?eN{3r?&`{UZ~02E$5kDFIM!VUU=a=hZp@8bI9 zPf%EJp4-l`d=`b*F5w32x5e*#HhY`TXm3~gyp}0NVqzjzu3U-u_;@T^whT*`E|uwP zu!aoO+YAJn+cVETXEe=djcrpqyC!x9Yh=?{)7-kX+o0A4vu@o?V?S!-$fwI}WI!`b zt5N<&8!^0vrbD@UOHF&zx}Sr_X_Ws6V~1hwG(GOLj~Fqmt;TWGr~sPbZB!dg&!K~# z95CRi0RtWz^2ET$T{Z5`UAuI7xNFBwox8a_WaXjh@7vGYtM4N|y*&H$ezg0e=Ci9% z7ebqvfb?`!L?&RJ18B2=jEr*aR_W<Nq-O|Wog+VI@BD7*TyM{V2IBQ11CC@_A0d+~ zd9Npq)H7_9+_}y`)Maq}gWx)d3LMLF?Ra>MTLITY2nnv6P`p}KeO;R$*KY6$r*ghH za!rTe@9ToUsT;xP6vnc;oxi^e{{F5&wm)d_cYlSG<jOTDM*duvQjTk7ywo{V*7iqi z<9Zq+f3BB#;JLilIdh$lkw4e{2(H60&Ot4!{$BU>pYAWu1+G^z^5^;`g}>xmS2>&K zfNQCY{JFkLa1D%c4l-7qi`;JBW<J(~u1juQ4`$@gHDU@!m8;~VmZg8t{A${t<j=Kj zM*dvGR;T%z&qwBzYwwKwxgJk&{gg5X>CNNoT3zzz`avUqt|=5;`=!i5`ntx~oR8$s zb&f{<T=%H(m)z?Ef60;SHI4kae$&XG>+kA({w06OS-t*g;QwHcSwsFGY`)Due;V>% zxAM<5?m~WU%Htwoe!S{ZUGkG$C1>^Xlk4=k#b9;)^I!6lkepTi)EktsH#jxlvZj{n zf;S~eeMAHQ2Yh_0$iEZyD8{C`aGq4f!AOz?>SqMkCLH76Ko{z2Oq=S|Id3`_Q<BsH z2`;}#CVv-dgG`(LaQ>2v%G<oG5|y0WwQHA3{@ti=Qa3AJ_BAzitp9{p$F1#HYJbVO zLx&Cue`=@H&5Ez>*bkzgN>p-I`BMj`ZmzTZ%MoOSx-}zzYTC@3>wKO1JC(l+wRwUX zuX+XQ1m)jviv0YfzEDtaD5&WZ)Eo+G`UG`{^eW2gQ|M)zvR(Czk+Di!S-etLx0`!8 zmWr}|rgb^CQdj%kiKUj19IXZQkAnI>`T2RA{GF&Z6x1&Y>JtU^iGo^6deB2qt0<_e zG?a~AZYNkbw9(6cvX9AjwcXUqv6Vh*tQ=pKxi9K21@)DJI!uKF^_PPBOC_FKPeFaE zpsrL<mnf*ul;2-R$={LMN<lrOpw3cI`zfda71UnRv;H#6v39J}FKjHRdlb|<3Tht} zPyM5y{!>sl$v6Y3wPe4_A;+dplVeFRhM?Ax<wk<~P(fX&png)>4|Sq~8c~kbNKjWR zs7n;oB?@Xu1$CD4`fa=9PaUVA_EJ#qD5!T7)IkdBAq91if;vd0OzotgPEt@GDX6U^ z`U&bP1@)7HI!Zx3rJ$~|46<A~sKXT0aSG}+1@)UO_aVFlHJ*Z6PeGlhpq^7u=P9V| zWSoznj#E&_DX6s-)WQntI|VhUl0R21!>%9}KGeVpYD@*Sq=Fh#LG7uaHnwu`xKQJ& zfLc{i0kKU4wW?L4tPi!Y9D`$3wI9>%@?3~*EU0}|xMfbqM9H0Ku!amYWS|~rz;Lls zQD>4M=cMXW>hb*k5bDfZRe3evF4t)}6GI6rWhn{^Er<rI%NgK*?{kk<{p{{>aCWbL zeA9azN^AI%Kdjx2)i^$%6dGQ}QH@(_EU-)U<MXFhzW8Hu?OrvG&quW!nK|LB7Q3i% zd}e?n*LoH;j!!96txY~ks44#pV3^@mResoNY%*lhaNI2!zZT><tYI&fjIT`bp5CfI zKWo9?*u_Ar`tc3<H>US)3+!Iw_#D%aPs96N?ZT4rd6;T<{#$Z<jmfM<!IJR}`DY|w zRb|Gssp0&${6H|bv>MM(Ls+ffs~`V<w{m*-_^O`aJq}(&_N(7_L+gFWfa!T&3bcF> zFx{uTPiaLs6IRMQ3ssv8eTZm%7m)GI2-%kkdPSD_D!nCG&bTFn=77d6cg=|Ig)4@; z6iX~G^J?AP$3Nv<yvpD8*4UnH&ar>Q#q?djQFAD$9Te313F`BdvaDAIH8#q>SAp!G ze{%m%GH>d71b)RSYwN1=>Y9K^KaVT2|CN)wl>YoukzXt|f?q7$*KH9q!d>bAP0o&5 z^^YBC=>NCe?RVXu+C;H9z)jizjl4u-f62{~IZ)#$mX7YB^#AUiEyn&e^_AmG$o>h> z8TuEWG4SVRdHYcgRc({oS3K)t$Y1)>pQybQ)L{zhF$J}n3aG`rQ|2~mG>K0Hb)16w zP4Rlz;LGy(<%QY(LhY!aj#N-jS_TKDPOT}uL<>P(si3}8P@gKOa}~Q6PyCeq$6j1y zf9A#p&z}m{b}cGg-Kprt8mFQgt2!3lSlgxOhOEEVw&>gCt&0j*IThVp?O61;HLk^H c<9&YA&ubpR{!NKL)DkdAe)rrp<S~%;Z_f<Dvj6}9 From e816725be51001868de573fe10c51b7d618b8df6 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Wed, 17 Mar 2004 01:28:14 +0000 Subject: [PATCH 0546/1463] Moved the WINE notepad. svn path=/trunk/; revision=8773 --- rosapps/notepad/.cvsignore | 15 +- rosapps/notepad/Da.rc | 126 ++++ rosapps/notepad/De.rc | 129 ++++ rosapps/notepad/En.rc | 129 ++++ rosapps/notepad/Es.rc | 130 ++++ rosapps/notepad/Fi.rc | 126 ++++ rosapps/notepad/Fr.rc | 129 ++++ rosapps/notepad/Hu.rc | 128 ++++ rosapps/notepad/It.rc | 130 ++++ rosapps/notepad/License_En.c | 28 + rosapps/notepad/Nl.rc | 126 ++++ rosapps/notepad/Pt.rc | 129 ++++ rosapps/notepad/Ru.rc | 124 ++++ rosapps/notepad/Si.rc | 125 ++++ rosapps/notepad/Sk.rc | 127 ++++ rosapps/notepad/Sw.rc | 127 ++++ rosapps/notepad/Th.rc | 121 ++++ rosapps/notepad/Wa.rc | 130 ++++ rosapps/notepad/Zh.rc | 123 ++++ rosapps/notepad/dialog.c | 717 ++++++++++++++++++++++ rosapps/notepad/dialog.h | 57 ++ rosapps/notepad/framewnd.c | 503 --------------- rosapps/notepad/{framewnd.h => license.c} | 37 +- rosapps/notepad/license.h | 52 ++ rosapps/notepad/main.c | 436 +++++++++---- rosapps/notepad/main.h | 62 +- rosapps/notepad/makefile | 33 +- rosapps/notepad/notepad.ico | Bin 0 -> 22534 bytes rosapps/notepad/notepad.rc | 260 +------- rosapps/notepad/notepad_res.h | 78 +++ rosapps/notepad/res/notepad.ico | Bin 1078 -> 0 bytes rosapps/notepad/res/small.ico | Bin 318 -> 0 bytes rosapps/notepad/resource.h | 59 -- rosapps/notepad/rsrc.rc | 58 ++ rosapps/notepad/small.ico | Bin 0 -> 22534 bytes 35 files changed, 3530 insertions(+), 1024 deletions(-) create mode 100644 rosapps/notepad/Da.rc create mode 100644 rosapps/notepad/De.rc create mode 100644 rosapps/notepad/En.rc create mode 100644 rosapps/notepad/Es.rc create mode 100644 rosapps/notepad/Fi.rc create mode 100644 rosapps/notepad/Fr.rc create mode 100644 rosapps/notepad/Hu.rc create mode 100644 rosapps/notepad/It.rc create mode 100644 rosapps/notepad/License_En.c create mode 100644 rosapps/notepad/Nl.rc create mode 100644 rosapps/notepad/Pt.rc create mode 100644 rosapps/notepad/Ru.rc create mode 100644 rosapps/notepad/Si.rc create mode 100644 rosapps/notepad/Sk.rc create mode 100644 rosapps/notepad/Sw.rc create mode 100644 rosapps/notepad/Th.rc create mode 100644 rosapps/notepad/Wa.rc create mode 100644 rosapps/notepad/Zh.rc create mode 100644 rosapps/notepad/dialog.c create mode 100644 rosapps/notepad/dialog.h delete mode 100644 rosapps/notepad/framewnd.c rename rosapps/notepad/{framewnd.h => license.c} (57%) create mode 100644 rosapps/notepad/license.h create mode 100644 rosapps/notepad/notepad.ico create mode 100644 rosapps/notepad/notepad_res.h delete mode 100644 rosapps/notepad/res/notepad.ico delete mode 100644 rosapps/notepad/res/small.ico delete mode 100644 rosapps/notepad/resource.h create mode 100644 rosapps/notepad/rsrc.rc create mode 100644 rosapps/notepad/small.ico diff --git a/rosapps/notepad/.cvsignore b/rosapps/notepad/.cvsignore index 0ac99d2e4af..4aed8fdf4f7 100644 --- a/rosapps/notepad/.cvsignore +++ b/rosapps/notepad/.cvsignore @@ -1,14 +1,11 @@ -*.exe -*.a *.o *.d +*.exe *.coff -*.dsp -*.dsw -*.aps -*.ncb -*.opt *.sym -*.plg -*.bak *.map +notepad.nostrip.exe +notepad.ncb +notepad.suo +notepad.exe +Release \ No newline at end of file diff --git a/rosapps/notepad/Da.rc b/rosapps/notepad/Da.rc new file mode 100644 index 00000000000..ee68ae2b12c --- /dev/null +++ b/rosapps/notepad/Da.rc @@ -0,0 +1,126 @@ +/* + * Notepad (Danish resources) + * + * Copyright 1998 Henrik Olsen <henrik@iaeste.dk> + * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> + * + * 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_DANISH, SUBLANG_DEFAULT + +MAIN_MENU MENU +{ + POPUP "&Filef" { + MENUITEM "&Ny...", CMD_NEW + MENUITEM "&bn\tEnter", CMD_OPEN + MENUITEM "&Gem", CMD_SAVE + MENUITEM "Gem so&m...", CMD_SAVE_AS + MENUITEM "&Udskriv", CMD_PRINT + MENUITEM "Side&ops鎡ning...", CMD_PAGE_SETUP + MENUITEM "&Indstil printer...", CMD_PRINTER_SETUP + MENUITEM SEPARATOR + MENUITEM "&Afslut", CMD_EXIT + } +POPUP "&Rediger" { + MENUITEM "&Fortryd\tCtrl+Z", CMD_UNDO + MENUITEM SEPARATOR + MENUITEM "&Klip\tCtrl+X", CMD_CUT + MENUITEM "K&opier\tCtrl+C", CMD_COPY + MENUITEM "S鎡 &ind\tCtrl+V", CMD_PASTE + MENUITEM "&Slet\tDel", CMD_DELETE + MENUITEM SEPARATOR + MENUITEM "Marker &alt", CMD_SELECT_ALL + MENUITEM "&Dato/tid\tF5", CMD_TIME_DATE + MENUITEM SEPARATOR + MENUITEM "Automatisk &linjeskift", CMD_WRAP + } +POPUP "&S鴊" { + MENUITEM "&S鴊...", CMD_SEARCH + MENUITEM "&Find n鎠te\tF3", CMD_SEARCH_NEXT + } +POPUP "&Hj鎙p" { + MENUITEM "&Indhold", CMD_HELP_CONTENTS + MENUITEM "&S鴊 efter hj鎙p om...", CMD_HELP_SEARCH + MENUITEM "&Brug af Hj鎙p", CMD_HELP_ON_HELP + MENUITEM SEPARATOR + POPUP "&Om Notesblok..." { + MENUITEM "&Licens", CMD_LICENSE + MENUITEM "&NO WARRANTY", CMD_NO_WARRANTY + MENUITEM "&Om WINE", CMD_ABOUT_WINE + } + } +} + +/* Dialog `Page setup' */ + +DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 8, "Helv" +CAPTION "Sideops鎡ning" +{ +LTEXT "&Sidehoved:", 0x140, 10, 07, 40, 15 +EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP +LTEXT "Side&fod:", 0x142, 10, 24, 40, 15 +EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP + +GROUPBOX "Margener:", 0x144, 10, 43,160, 45 +LTEXT "&Venstre:", 0x145, 20, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Top:", 0x148, 20, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&H鴍re:", 0x14B, 100, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Bund:", 0x14E,100, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP + +DEFPUSHBUTTON "OK", 0x151, 180, 3, 40, 15, WS_TABSTOP +PUSHBUTTON "Annuller", 0x152, 180, 21, 40, 15, WS_TABSTOP +PUSHBUTTON "&Hj鎙p", 0x153, 180, 39, 40, 15, WS_TABSTOP +} + +STRINGTABLE DISCARDABLE +{ +STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ +STRING_PAGESETUP_FOOTERVALUE, "Page &s" /* FIXME */ +STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ +STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ + +STRING_NOTEPAD, "Notesblok" +STRING_ERROR, "FEJL" +STRING_WARNING, "ADVARSEL" +STRING_INFO, "Information" + +STRING_UNTITLED, "(ikke-navngivet)" + +STRING_ALL_FILES, "Alle filer (*.*)" +STRING_TEXT_FILES_TXT, "Tekst filer (*.txt)" + +STRING_TOOLARGE, "Filen '%s' er for stor til Notesblok. \ +\nBrug en anden editor til at redigere filen." +STRING_NOTEXT, "Du har ikke skrevet noget tekst. \ +\nSkriv noget tekst, og pr鴙 s igen" +STRING_DOESNOTEXIST, "File '%s'\ndoes not exist\n\n \ +Do you want to create a new file ?" +STRING_NOTSAVED, "File '%s'\nhas been modified\n\n \ +Would you like to save the changes ?" +STRING_NOTFOUND, "Kan ikke finde '%s'." +STRING_OUT_OF_MEMORY, "Der er ikke nok hukommelse til at udf鴕e \ +denne operation. \nAfslut et eller flere aktive programmer for at frig鴕e \ +hukommelse, og pr鴙 s igen." + +} diff --git a/rosapps/notepad/De.rc b/rosapps/notepad/De.rc new file mode 100644 index 00000000000..b39cbc5cf8b --- /dev/null +++ b/rosapps/notepad/De.rc @@ -0,0 +1,129 @@ +/* + * Notepad (German resources) + * + * Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch> + * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> + * + * + * 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 + +MAIN_MENU MENU +{ + POPUP "&Datei" { + MENUITEM "&Neu...", CMD_NEW + MENUITEM "&ffnen...", CMD_OPEN + MENUITEM "&Speichern", CMD_SAVE + MENUITEM "Speichern &unter...", CMD_SAVE_AS + MENUITEM "&Drucken", CMD_PRINT + MENUITEM "Seite ein&richten...", CMD_PAGE_SETUP + MENUITEM "Drucker&einrichtung...", CMD_PRINTER_SETUP + MENUITEM SEPARATOR + MENUITEM "&Beenden", CMD_EXIT + } +POPUP "&Bearbeiten" { + MENUITEM "&R點kg鋘gig\tStrg+Z", CMD_UNDO + MENUITEM SEPARATOR + MENUITEM "&Ausschneiden\tStrg+X", CMD_CUT + MENUITEM "&Kopieren\tStrg+C", CMD_COPY + MENUITEM "&Einf黦en\tStrg+V", CMD_PASTE + MENUITEM "&L鰏chen\tEntf", CMD_DELETE + MENUITEM SEPARATOR + MENUITEM "Alles &markieren", CMD_SELECT_ALL + MENUITEM "&Uhrzeit/Datum\tF5", CMD_TIME_DATE + MENUITEM SEPARATOR + MENUITEM "&Zeilenumbruch", CMD_WRAP + } +POPUP "&Suchen" { + MENUITEM "Suchen...", CMD_SEARCH + MENUITEM "&Weitersuchen\tF3", CMD_SEARCH_NEXT + } +POPUP "&Hilfe" { + MENUITEM "&Inhalt", CMD_HELP_CONTENTS + MENUITEM "&Suchen...", CMD_HELP_SEARCH + MENUITEM "&Hilfe benutzen", CMD_HELP_ON_HELP + MENUITEM SEPARATOR + POPUP "Inf&o..." { + MENUITEM "&Lizenz", CMD_LICENSE + MENUITEM "&KEINE GARANTIE", CMD_NO_WARRANTY + MENUITEM "&躡er Wine", CMD_ABOUT_WINE + } + } +} + +/* Dialog `Page setup' */ + +DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 8, "Helv" +CAPTION "Seite einrichten" +{ +LTEXT "&Kopfzeile:", 0x140, 10, 07, 40, 15 +EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP +LTEXT "&Fu遺eile:", 0x142, 10, 24, 40, 15 +EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP + +GROUPBOX "R鋘der", 0x144, 10, 43,160, 45 +LTEXT "&Links:", 0x145, 20, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Oben:", 0x148, 20, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Rechts:", 0x14B, 100, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Unten:", 0x14E,100, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP + +DEFPUSHBUTTON "OK", 0x151, 180, 3, 40, 15, WS_TABSTOP +PUSHBUTTON "Abbrechen", 0x152, 180, 21, 40, 15, WS_TABSTOP +PUSHBUTTON "&Hilfe", 0x153, 180, 39, 40, 15, WS_TABSTOP +} + +STRINGTABLE DISCARDABLE +{ +STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ +STRING_PAGESETUP_FOOTERVALUE, "Page &s" /* FIXME */ +STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ +STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ + +STRING_NOTEPAD, "Editor" +STRING_ERROR, "FEHLER" +STRING_WARNING, "ACHTUNG" +STRING_INFO, "Information" + +STRING_UNTITLED, "(unbenannt)" + +STRING_ALL_FILES, "Alle Dateien (*.*)" +STRING_TEXT_FILES_TXT, "Textdateien (*.txt)" + +STRING_TOOLARGE, "'%s' ist zu gross f黵 den Editor\n \ +Benutzen Sie bitte einen anderen Editor, um diese Datei zu bearbeiten." +STRING_NOTEXT, "Sie haben keinen Text eingegeben, der \ +gespeichert\n werden k鰊nte. Geben Sie Text ein, und versuchen Sie es \ +\nerneut." +STRING_DOESNOTEXIST, "File '%s'\ndoes not exist\n\n \ +Do you want to create a new file ?" +STRING_NOTSAVED, "Datei %s\n wurde geaendert.\n\n \ +Moechten Sie die Aenderungen speichern ?" +STRING_NOTFOUND, "'%s' kann nicht gefunden werden." +STRING_OUT_OF_MEMORY, "Nicht gen黦end Arbeitsspeicher, \ +um diese Funktion \nabzuschlie遝n. Beenden Sie eine oder mehrere \ +\nAnwendungen, um den verf黦baren Arbeitsspeicher zu \nerh鰄en." + + +} diff --git a/rosapps/notepad/En.rc b/rosapps/notepad/En.rc new file mode 100644 index 00000000000..9debe253544 --- /dev/null +++ b/rosapps/notepad/En.rc @@ -0,0 +1,129 @@ +/* + * Notepad (English resources) + * + * Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch> + * Proofread 1998 by David Lee Lambert <lamber45@egr.msu.edu> + * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> + * + * 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_ENGLISH, SUBLANG_DEFAULT + +MAIN_MENU MENU +{ + POPUP "&File" { + MENUITEM "&New...", CMD_NEW + MENUITEM "&Open\tCtrl+O", CMD_OPEN + MENUITEM "&Save\tCtrl+S", CMD_SAVE + MENUITEM "Save &as...", CMD_SAVE_AS + MENUITEM SEPARATOR + MENUITEM "&Print", CMD_PRINT + MENUITEM "Page Se&tup...", CMD_PAGE_SETUP + MENUITEM "P&rinter Setup...", CMD_PRINTER_SETUP + MENUITEM SEPARATOR + MENUITEM "E&xit", CMD_EXIT + } +POPUP "&Edit" { + MENUITEM "&Undo\tCtrl+Z", CMD_UNDO + MENUITEM SEPARATOR + MENUITEM "Cu&t\tCtrl+X", CMD_CUT + MENUITEM "&Copy\tCtrl+C", CMD_COPY + MENUITEM "&Paste\tCtrl+V", CMD_PASTE + MENUITEM "&Delete\tDel", CMD_DELETE + MENUITEM SEPARATOR + MENUITEM "Select &all\tCtrl+A", CMD_SELECT_ALL + MENUITEM "&Time/Date\tF5", CMD_TIME_DATE + MENUITEM SEPARATOR + MENUITEM "&Wrap long lines", CMD_WRAP + MENUITEM "&Font...", CMD_FONT + } +POPUP "&Search" { + MENUITEM "&Search\tCtrl+F", CMD_SEARCH + MENUITEM "&Search next\tF3", CMD_SEARCH_NEXT + } +POPUP "&Help" { + MENUITEM "&Contents", CMD_HELP_CONTENTS + MENUITEM "&Search...", CMD_HELP_SEARCH + MENUITEM "&Help on help", CMD_HELP_ON_HELP + MENUITEM SEPARATOR + POPUP "Inf&o..." { + MENUITEM "&License", CMD_LICENSE + MENUITEM "&NO WARRANTY", CMD_NO_WARRANTY + MENUITEM "&About Wine", CMD_ABOUT_WINE + } + } +} + +/* Dialog `Page setup' */ + +DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 8, "Helv" +CAPTION "Page Setup" +{ +LTEXT "&Header:", 0x140, 10, 07, 40, 15 +EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP +LTEXT "&Footer:", 0x142, 10, 24, 40, 15 +EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP + +GROUPBOX "&Margins:", 0x144, 10, 43,160, 45 +LTEXT "&Left:", 0x145, 20, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Top:", 0x148, 20, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Right:", 0x14B, 100, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Bottom:", 0x14E,100, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP + +DEFPUSHBUTTON "OK", 0x151, 180, 3, 40, 15, WS_TABSTOP +PUSHBUTTON "Cancel", 0x152, 180, 21, 40, 15, WS_TABSTOP +PUSHBUTTON "&Help", 0x153, 180, 39, 40, 15, WS_TABSTOP +} + +STRINGTABLE DISCARDABLE +{ +STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ +STRING_PAGESETUP_FOOTERVALUE, "Page &s" /* FIXME */ +STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ +STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ + +STRING_NOTEPAD, "Notepad" +STRING_ERROR, "ERROR" +STRING_WARNING, "WARNING" +STRING_INFO, "Information" + +STRING_UNTITLED, "(untitled)" + +STRING_ALL_FILES, "All files (*.*)" +STRING_TEXT_FILES_TXT, "Text files (*.txt)" + +STRING_TOOLARGE, "File '%s' is too large for notepad.\n \ +Please use a different editor." +STRING_NOTEXT, "You didn't enter any text. \ +\nPlease type something and try again" +STRING_DOESNOTEXIST, "File '%s'\ndoes not exist\n\n \ +Do you want to create a new file ?" +STRING_NOTSAVED, "File '%s'\nhas been modified\n\n \ +Would you like to save the changes ?" +STRING_NOTFOUND, "'%s' can not be found." +STRING_OUT_OF_MEMORY, "Not enough memory to complete this \ +task. \nClose one or more applications to increase the amount of \nfree \ +memory." + +} diff --git a/rosapps/notepad/Es.rc b/rosapps/notepad/Es.rc new file mode 100644 index 00000000000..635479d1e79 --- /dev/null +++ b/rosapps/notepad/Es.rc @@ -0,0 +1,130 @@ +/* + * Notepad (Spanish resources) + * + * Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch> + * Proofread 1998 by David Lee Lambert <lamber45@egr.msu.edu> + * Proofread 1999 by Jose Marcos Lopez <jose.lopez@upcnet.upc.es> + * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> + * Copyright 2003 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 + +MAIN_MENU MENU +{ + POPUP "&Archivo" { + MENUITEM "&Nuevo", CMD_NEW + MENUITEM "&Abrir", CMD_OPEN + MENUITEM "&Guardar", CMD_SAVE + MENUITEM "Guardar &como...", CMD_SAVE_AS + MENUITEM "&Imprimir", CMD_PRINT + MENUITEM "Configurar &p醙ina...", CMD_PAGE_SETUP + MENUITEM "Configuraci髇 &impresora...", CMD_PRINTER_SETUP + MENUITEM SEPARATOR + MENUITEM "&Salir", CMD_EXIT + } +POPUP "&Editar" { + MENUITEM "&Deshacer\tCtrl+Z", CMD_UNDO + MENUITEM SEPARATOR + MENUITEM "Cor&tar\tCtrl+X", CMD_CUT + MENUITEM "&Copiar\tCtrl+C", CMD_COPY + MENUITEM "&Pegar\tCtrl+V", CMD_PASTE + MENUITEM "&Borrar\tDel", CMD_DELETE + MENUITEM SEPARATOR + MENUITEM "Seleccionar t&odo", CMD_SELECT_ALL + MENUITEM "&Hora y Fecha\tF5", CMD_TIME_DATE + MENUITEM SEPARATOR + MENUITEM "&Ajuste de l韓ea autom醫ico", CMD_WRAP + } +POPUP "&Buscar" { + MENUITEM "&Buscar...", CMD_SEARCH + MENUITEM "Buscar &siguiente\tF3", CMD_SEARCH_NEXT + } +POPUP "&Ayuda" { + MENUITEM "&ndice", CMD_HELP_CONTENTS + MENUITEM "&Buscar...", CMD_HELP_SEARCH + MENUITEM "A&yuda sobre la ayuda", CMD_HELP_ON_HELP + MENUITEM SEPARATOR + POPUP "&Informaci髇..." { + MENUITEM "&Licencia", CMD_LICENSE + MENUITEM "SIN &GARANT虯", CMD_NO_WARRANTY + MENUITEM "&Acerca de Wine", CMD_ABOUT_WINE + } + } +} + +/* Dialog `Page setup' */ + +DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 8, "Helv" +CAPTION "&Ajuste de p醙ina" +{ +LTEXT "&Cabecera:", 0x140, 10, 07, 40, 15 +EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP +LTEXT "&Pie:", 0x142, 10, 24, 40, 15 +EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP + +GROUPBOX "&M醨genes:", 0x144, 10, 43,160, 45 +LTEXT "&Izquierda:", 0x145, 20, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "A&rriba:", 0x148, 20, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Derecha:", 0x14B, 100, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "Aba&jo:", 0x14E,100, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP + +DEFPUSHBUTTON "Aceptar", 0x151, 180, 3, 40, 15, WS_TABSTOP +PUSHBUTTON "Cancelar", 0x152, 180, 21, 40, 15, WS_TABSTOP +PUSHBUTTON "&Ayuda", 0x153, 180, 39, 40, 15, WS_TABSTOP +} + +STRINGTABLE DISCARDABLE +{ +STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ +STRING_PAGESETUP_FOOTERVALUE, "P醙ina &s" /* FIXME */ +STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ +STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ + +STRING_NOTEPAD, "Bloc de Notas" +STRING_ERROR, "ERROR" +STRING_WARNING, "ADVERTENCIA" +STRING_INFO, "Informaci髇" + +STRING_UNTITLED, "(sin t韙ulo)" + +STRING_ALL_FILES, "Todos los archivos (*.*)" +STRING_TEXT_FILES_TXT, "Documentos de texto (*.txt)" + +STRING_TOOLARGE, "El archivo '%s' es demasiado grande para el bloc de notas.\n \ +Use otro editor." +STRING_NOTEXT, "No escribi nada. \ +\nPor favor escriba algo y pruebe de nuevo" +STRING_DOESNOTEXIST, "El archivo '%s'\nno existe\n\n \ +緿esea crear un nuevo archivo?" +STRING_NOTSAVED, "El texto en el archivo '%s' ha cambiado\n\n \ +緿esea guardar los cambios?" +STRING_NOTFOUND, "no se encontr '%s'." +STRING_OUT_OF_MEMORY, "No hay suficiente memoria para terminar \ +esta tarea. \nCierre una o m醩 aplicaciones para aumentar la cantidad \nde \ +memoria libre." + + +} diff --git a/rosapps/notepad/Fi.rc b/rosapps/notepad/Fi.rc new file mode 100644 index 00000000000..ffefa707925 --- /dev/null +++ b/rosapps/notepad/Fi.rc @@ -0,0 +1,126 @@ +/* + * Notepad (Finnish resources) + * + * Copyright 1999 by Jukka Iivonen <iivonen@iki.fi> + * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> + * + * 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_FINNISH, SUBLANG_DEFAULT + +MAIN_MENU MENU +{ + POPUP "&Tiedosto" { + MENUITEM "&Uusi...", CMD_NEW + MENUITEM "&Avaa", CMD_OPEN + MENUITEM "Ta&lleta", CMD_SAVE + MENUITEM "Talleta &nimell...", CMD_SAVE_AS + MENUITEM "T&ulosta", CMD_PRINT + MENUITEM "&Sivun asetukset...", CMD_PAGE_SETUP + MENUITEM "&Kirjoittimen asetukset...", CMD_PRINTER_SETUP + MENUITEM SEPARATOR + MENUITEM "&Poistu", CMD_EXIT + } +POPUP "&Muokkaa" { + MENUITEM "&Palauta\tCtrl+Z", CMD_UNDO + MENUITEM SEPARATOR + MENUITEM "&Leikkaa\tCtrl+X", CMD_CUT + MENUITEM "&Kopioi\tCtrl+C", CMD_COPY + MENUITEM "L&iit鋅tCtrl+V", CMD_PASTE + MENUITEM "P&oista\tDel", CMD_DELETE + MENUITEM SEPARATOR + MENUITEM "&Valitse kaikki", CMD_SELECT_ALL + MENUITEM "&Aika/P鋓v鋗滗r鋅tF5", CMD_TIME_DATE + MENUITEM SEPARATOR + MENUITEM "Ka&tkaise pitk rivi", CMD_WRAP + } +POPUP "&Etsi" { + MENUITEM "Etsi...", CMD_SEARCH + MENUITEM "Etsi &seuraava\tF3", CMD_SEARCH_NEXT + } +POPUP "&Apua" { + MENUITEM "&Sis鋖t", CMD_HELP_CONTENTS + MENUITEM "&Etsi...", CMD_HELP_SEARCH + MENUITEM "Apua &Opastuksesta", CMD_HELP_ON_HELP + MENUITEM SEPARATOR + POPUP "Inf&o..." { + MENUITEM "&Lisenssi", CMD_LICENSE + MENUITEM "&EI TAKUUTA", CMD_NO_WARRANTY + MENUITEM "&Tietoja Wine:ista", CMD_ABOUT_WINE + } + } +} + +/* Dialog `Page setup' */ + +DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 8, "Helv" +CAPTION "Sivun asetukset" +{ +LTEXT "&Yl鋙tsikko:", 0x140, 10, 07, 40, 15 +EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP +LTEXT "Alao&tsikko:", 0x142, 10, 24, 40, 15 +EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP + +GROUPBOX "&Marginaali:", 0x144, 10, 43,160, 45 +LTEXT "&Vasen:", 0x145, 20, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "Y&l:", 0x148, 20, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Oikea:", 0x14B, 100, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Ala:", 0x14E,100, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP + +DEFPUSHBUTTON "OK", 0x151, 180, 3, 40, 15, WS_TABSTOP +PUSHBUTTON "Peruuta", 0x152, 180, 21, 40, 15, WS_TABSTOP +PUSHBUTTON "&Apua", 0x153, 180, 39, 40, 15, WS_TABSTOP +} + +STRINGTABLE DISCARDABLE +{ +STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ +STRING_PAGESETUP_FOOTERVALUE, "Sivu &s" /* FIXME */ +STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ +STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ + +STRING_NOTEPAD, "Notepad" +STRING_ERROR, "VIRHE" +STRING_WARNING, "VAROITUS" +STRING_INFO, "Tiedoitus" + +STRING_UNTITLED, "(otsikoimaton)" + +STRING_ALL_FILES, "Kaikki tiedostot (*.*)" +STRING_TEXT_FILES_TXT, "Teksti tiedostot (*.txt)" + +STRING_TOOLARGE, "Tiedosto '%s' on liian suuri.\n \ +Please use a different editor." +STRING_NOTEXT, "Et sy鰐t鋘yt lainkaan teksti. \ +\nKirjoita jotain ja yrit uudelleen" +STRING_DOESNOTEXIST, "File '%s'\ndoes not exist\n\n \ +Do you want to create a new file ?" +STRING_NOTSAVED, "File '%s'\nhas been modified\n\n \ +Would you like to save the changes ?" +STRING_NOTFOUND, "'%s' ei l鰕dy." +STRING_OUT_OF_MEMORY, "Muistia ei ole riitt鋠鋝ti t鋗鋘 \ +\nteht鋠鋘 tekemiseksi. Sulje jokin sovellus vapauttaaksesi\n \ +muistia." + +} diff --git a/rosapps/notepad/Fr.rc b/rosapps/notepad/Fr.rc new file mode 100644 index 00000000000..8aa233ecfcb --- /dev/null +++ b/rosapps/notepad/Fr.rc @@ -0,0 +1,129 @@ +/* + * Notepad (French resources) + * + * Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch> + * Translation by Laurent Buffler <laurent@bluewin.ch> + * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> + * + * 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_FRENCH, SUBLANG_NEUTRAL + +MAIN_MENU MENU +{ + POPUP "&Fichier" { + MENUITEM "&Nouveau...", CMD_NEW + MENUITEM "&Ouvrir\tCtrl+O", CMD_OPEN + MENUITEM "&Enregistrer\tCtrl+S", CMD_SAVE + MENUITEM "Enregistrer &sous...", CMD_SAVE_AS + MENUITEM SEPARATOR + MENUITEM "Im&primer", CMD_PRINT + MENUITEM "&Mise en page...", CMD_PAGE_SETUP + MENUITEM "&Configuration de l'imprimante...", CMD_PRINTER_SETUP + MENUITEM SEPARATOR + MENUITEM "&Quitter", CMD_EXIT + } +POPUP "&Edition" { + MENUITEM "&Annuler\tCtrl+Z", CMD_UNDO + MENUITEM SEPARATOR + MENUITEM "Co&uper\tCtrl+X", CMD_CUT + MENUITEM "&Copier\tCtrl+C", CMD_COPY + MENUITEM "C&oller\tCtrl+V", CMD_PASTE + MENUITEM "&Effacer\tDel", CMD_DELETE + MENUITEM SEPARATOR + MENUITEM "Tout &s閘ectionner\tCtrl+A", CMD_SELECT_ALL + MENUITEM "&Heure/Date\tF5", CMD_TIME_DATE + MENUITEM SEPARATOR + MENUITEM "&Retour la ligne", CMD_WRAP + MENUITEM "&Police...", CMD_FONT + } +POPUP "&Rechercher" { + MENUITEM "&Rechercher\tCtrl+F", CMD_SEARCH + MENUITEM "&Suivant\tF3", CMD_SEARCH_NEXT + } +POPUP "&Aide" { + MENUITEM "&Sommaire", CMD_HELP_CONTENTS + MENUITEM "&Rechercher...", CMD_HELP_SEARCH + MENUITEM "&Utiliser l'aide", CMD_HELP_ON_HELP + MENUITEM SEPARATOR + POPUP "Inf&o..." { + MENUITEM "&Licence", CMD_LICENSE + MENUITEM "&AUCUNE GARANTIE", CMD_NO_WARRANTY + MENUITEM "&A propos de Wine", CMD_ABOUT_WINE + } + } +} + +/* Dialog `Page setup' */ + +DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 8, "Helv" +CAPTION "Mise en page" +{ +LTEXT "&En-t阾e :", 0x140, 10, 07, 40, 15 +EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP +LTEXT "&Pied de page :", 0x142, 10, 24, 40, 15 +EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP + +GROUPBOX "&Marges :", 0x144, 10, 43,160, 45 +LTEXT "&Gauche :", 0x145, 20, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Haut :", 0x148, 20, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Droite :", 0x14B, 100, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Bas :", 0x14E,100, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP + +DEFPUSHBUTTON "OK", 0x151, 180, 3, 40, 15, WS_TABSTOP +PUSHBUTTON "Annuler", 0x152, 180, 21, 40, 15, WS_TABSTOP +PUSHBUTTON "&Aide", 0x153, 180, 39, 40, 15, WS_TABSTOP +} + +STRINGTABLE DISCARDABLE +{ +STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ +STRING_PAGESETUP_FOOTERVALUE, "Page &s" /* FIXME */ +STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ +STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ + +STRING_NOTEPAD, "Bloc-notes" +STRING_ERROR, "ERREUR" +STRING_WARNING, "ATTENTION" +STRING_INFO, "Information" + +STRING_UNTITLED, "(sans-titre)" + +STRING_ALL_FILES, "Tous fichiers (*.*)" +STRING_TEXT_FILES_TXT, "Fichiers texte (*.txt)" + +STRING_TOOLARGE, "Le fichier '%s' est trop grand pour le bloc-notes.\n \ +Veuillez utiliser un autre 閐iteur." +STRING_NOTEXT, "Vous n'avez pas entr de texte. \ +Veuillez taper quelque chose et recommencer" +STRING_DOESNOTEXIST, "Le fichier '%s'\nn'existe pas.\n\n \ +Voulez-vous cr閑r un nouveau fichier ?" +STRING_NOTSAVED, "Le fichier '%s'\na 閠 modifi閈n\n \ +Voulez-vous enregistrer vos modifications ?" +STRING_NOTFOUND, "'%s' non trouv." +STRING_OUT_OF_MEMORY, "Pas assez de m閙oire pour compl閠er cette \ +t鈉he. \nFermez une ou plusieurs applications pour lib閞er\n\ +de la m閙oire." + +} diff --git a/rosapps/notepad/Hu.rc b/rosapps/notepad/Hu.rc new file mode 100644 index 00000000000..0ea976cc197 --- /dev/null +++ b/rosapps/notepad/Hu.rc @@ -0,0 +1,128 @@ +/* + * Notepad (Hungarian resources) + * + * Copyright 1997,98 Marcel Baur + * Proofread 1998 by David Lee Lambert + * Copyright 2002 Sylvain Petreolle + * Copyright 2002 Zoly Nagy + * + * 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 + */ + +MAIN_MENU MENU LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT +{ + POPUP "&F醞l" { + MENUITEM "&j", CMD_NEW + MENUITEM "Meg&nyit醩...", CMD_OPEN + MENUITEM "&Ment閟", CMD_SAVE + MENUITEM "Ment閟 m&sk閚t...", CMD_SAVE_AS + MENUITEM SEPARATOR + MENUITEM "&Oldalbe醠l韙醩...", CMD_PAGE_SETUP + MENUITEM "Nyom&tat醩...", CMD_PRINT + MENUITEM "Nyomtat &be醠l韙醩...", CMD_PRINTER_SETUP + MENUITEM SEPARATOR + MENUITEM "&Kil閜閟", CMD_EXIT + } +POPUP "S&zerkeszt閟" { + MENUITEM "&Visszavon醩\tCtrl+Z", CMD_UNDO + MENUITEM SEPARATOR + MENUITEM "Kiv&g醩\tCtrl+X", CMD_CUT + MENUITEM "&M醩ol醩\tCtrl+C", CMD_COPY + MENUITEM "&Beilleszt閟\tCtrl+V", CMD_PASTE + MENUITEM "T鰎&l閟\tDel", CMD_DELETE + MENUITEM SEPARATOR + MENUITEM "&Az 鰏szes kijel鰈閟e", CMD_SELECT_ALL + MENUITEM "&Id/d醫um\tF5", CMD_TIME_DATE + MENUITEM SEPARATOR + MENUITEM "&Hossz sorok t鰎del閟e", CMD_WRAP + } +POPUP "&Keres閟" { + MENUITEM "&Keres閟...", CMD_SEARCH + MENUITEM "K鰒e&tkez keres閟e\tF3", CMD_SEARCH_NEXT + } +POPUP "&S鷊" { + MENUITEM "&T閙ak鰎鰇", CMD_HELP_CONTENTS + MENUITEM "&Keres閟...", CMD_HELP_SEARCH + MENUITEM "&Haszn醠at", CMD_HELP_ON_HELP + MENUITEM SEPARATOR + POPUP "Inf&orm醕i..." { + MENUITEM "&Licenc", CMD_LICENSE + MENUITEM "&SEMMI GARANCIA", CMD_NO_WARRANTY + MENUITEM "&Wine n関jegy", CMD_ABOUT_WINE + } + } +} + +/* Dialog `Page setup' */ + +DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 +LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 8, "Helv" +CAPTION "Oldalbe醠l韙醩" +{ +LTEXT "&Fejl閏:", 0x140, 10, 07, 40, 15 +EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP +LTEXT "&L醔l閏:", 0x142, 10, 24, 40, 15 +EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP + +GROUPBOX "&Marg髃:", 0x144, 10, 43,160, 45 +LTEXT "&Bal:", 0x145, 20, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Fels:", 0x148, 20, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Jobb:", 0x14B, 100, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Als:", 0x14E,100, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP + +DEFPUSHBUTTON "OK", 0x151, 180, 3, 40, 15, WS_TABSTOP +PUSHBUTTON "M間se", 0x152, 180, 21, 40, 15, WS_TABSTOP +PUSHBUTTON "&S鷊", 0x153, 180, 39, 40, 15, WS_TABSTOP +} + +STRINGTABLE DISCARDABLE LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT +{ +STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ +STRING_PAGESETUP_FOOTERVALUE, "Oldalsz醡: &s." /* FIXME */ +STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ +STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ + +STRING_NOTEPAD, "Jegyzett鰉b" +STRING_ERROR, "HIBA" +STRING_WARNING, "FIGYELMEZTET蒘" +STRING_INFO, "Inform醕i" + +STRING_UNTITLED, "(n関telen)" + +STRING_ALL_FILES, "Minden f醞l (*.*)" +STRING_TEXT_FILES_TXT, "Sz鰒egf醞lok (*.txt)" + +STRING_TOOLARGE, "'%s' f醞l t鷏 nagy m閞et.\n \ +K閞em haszn醠jon m醩ik sz鰒egszerkeszt programot." +STRING_NOTEXT, "A sz鰒eg nem tartalmaz karaktert! \ +\nK閞em g閜eljen be n閔醤y karaktert 閟 pr骲醠ja 鷍ra!" +STRING_DOESNOTEXIST, "A megadott '%s'\nf醞l nem l閠ezik!\n\n \ +K韛醤 l閠rehozni 鷍 f醞lt?" +STRING_NOTSAVED, "'%s' f醞l\nm骴osult\n\n \ +Szeretn menteni a v醠toz醩okat?" +STRING_NOTFOUND, "'%s' nem tal醠hat!" +STRING_OUT_OF_MEMORY, "Nincs elegend szabad mem髍ia!\ +\nZ醨jon be n閔醤y alkalmaz醩t, ezzel n鰒elve a szabad mem髍ia m閞et閠\ +!" + +} diff --git a/rosapps/notepad/It.rc b/rosapps/notepad/It.rc new file mode 100644 index 00000000000..65a86012581 --- /dev/null +++ b/rosapps/notepad/It.rc @@ -0,0 +1,130 @@ +/* + * Notepad (Italian resources) + * + * Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch> + * Proofread 1998 by David Lee Lambert <lamber45@egr.msu.edu> + * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> + * Copyright 2003 Marcelo Duarte + * Copyright 2003 Ivan Leo Murray-Smith <puoti@inwind.it> + * + * 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_ITALIAN, SUBLANG_DEFAULT + +MAIN_MENU MENU +{ + POPUP "&File" { + MENUITEM "&Nuovo", CMD_NEW + MENUITEM "&Apri...\tCtrl+O", CMD_OPEN + MENUITEM "&Salva\tCtrl+S", CMD_SAVE + MENUITEM "Salva &con nome...", CMD_SAVE_AS + MENUITEM SEPARATOR + MENUITEM "&Stampa", CMD_PRINT + MENUITEM "&Imposta pagina...", CMD_PAGE_SETUP + MENUITEM "&Configurazione di stampa...", CMD_PRINTER_SETUP + MENUITEM SEPARATOR + MENUITEM "E&sci", CMD_EXIT + } +POPUP "&Modifica" { + MENUITEM "&Anulla\tCtrl+Z", CMD_UNDO + MENUITEM SEPARATOR + MENUITEM "&Taglia\tCtrl+X", CMD_CUT + MENUITEM "&Copia\tCtrl+C", CMD_COPY + MENUITEM "&Incolla\tCtrl+V", CMD_PASTE + MENUITEM "&Elimina\tDel", CMD_DELETE + MENUITEM SEPARATOR + MENUITEM "Seleziona &tutto\tCtrl+A", CMD_SELECT_ALL + MENUITEM "&Ora/Data\tF5", CMD_TIME_DATE + MENUITEM SEPARATOR + MENUITEM "&A campo automatico", CMD_WRAP + MENUITEM "&Imposta carattere...", CMD_FONT + } +POPUP "&Trova" { + MENUITEM "&Trova\tCtrl+F", CMD_SEARCH + MENUITEM "&Trova successivo\tF3", CMD_SEARCH_NEXT + } +POPUP "&Aiuto" { + MENUITEM "&Contenuti", CMD_HELP_CONTENTS + MENUITEM "&Trova...", CMD_HELP_SEARCH + MENUITEM "&Aiuto sulla Guida", CMD_HELP_ON_HELP + MENUITEM SEPARATOR + POPUP "Inf&o..." { + MENUITEM "&Licenza", CMD_LICENSE + MENUITEM "&Garanzia", CMD_NO_WARRANTY + MENUITEM "&Informazioni sul Blocco Note", CMD_ABOUT_WINE + } + } +} + +/* Dialog `Page setup' */ + +DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 8, "Helv" +CAPTION "Setup di pagina" +{ +LTEXT "&Note a inizio pagina:", 0x140, 10, 07, 40, 15 +EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP +LTEXT "&Note a pi di pagina:", 0x142, 10, 24, 40, 15 +EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP + +GROUPBOX "&Margini:", 0x144, 10, 43,160, 45 +LTEXT "&Sinistro:", 0x145, 20, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Superiore:", 0x148, 20, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Destro:", 0x14B, 100, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Inferiore:", 0x14E,100, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP + +DEFPUSHBUTTON "OK", 0x151, 180, 3, 40, 15, WS_TABSTOP +PUSHBUTTON "Cancella", 0x152, 180, 21, 40, 15, WS_TABSTOP +PUSHBUTTON "&Aiuto", 0x153, 180, 39, 40, 15, WS_TABSTOP +} + +STRINGTABLE DISCARDABLE +{ +STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ +STRING_PAGESETUP_FOOTERVALUE, "Page &s" /* FIXME */ +STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ +STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ + +STRING_NOTEPAD, "Blocco note" +STRING_ERROR, "ERRORE" +STRING_WARNING, "ATTENZIONE" +STRING_INFO, "Info" + +STRING_UNTITLED, "(senza nome)" + +STRING_ALL_FILES, "Tutti i file (*.*)" +STRING_TEXT_FILES_TXT, "File di testo (*.txt)" + +STRING_TOOLARGE, "Il file '%s' troppo grande per il blocco note.\n \ +Per favore usare un altro editor." +STRING_NOTEXT, "Non stato inserito alcun testo. \ +\nPer favore digitare qualcosa e riprovare" +STRING_DOESNOTEXIST, "Il file '%s'\nnon esiste\n\n \ +Creare un nuovo file ?" +STRING_NOTSAVED, "Il file '%s'\ne' stato modificato\n\n \ +Salvare le modifiche ?" +STRING_NOTFOUND, "'%s' non stato trovato." +STRING_OUT_OF_MEMORY, "Memoria insufficente per completare questa operazione \ +task. \nChiudere una o pi applicazioni per aumentare la quantita'\n di memoria libera." + +} diff --git a/rosapps/notepad/License_En.c b/rosapps/notepad/License_En.c new file mode 100644 index 00000000000..f8ffe140436 --- /dev/null +++ b/rosapps/notepad/License_En.c @@ -0,0 +1,28 @@ +#include <windows.h> +#include "license.h" + +static const CHAR LicenseCaption_En[] = "LICENSE"; +static const CHAR License_En[] = +"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.\n" + +"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.\n" + +"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"; + +static const CHAR NoWarrantyCaption_En[] = "NO WARRANTY"; +static const CHAR NoWarranty_En[] = +"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."; + +LICENSE WineLicense_En = {License_En, LicenseCaption_En, + NoWarranty_En, NoWarrantyCaption_En}; diff --git a/rosapps/notepad/Nl.rc b/rosapps/notepad/Nl.rc new file mode 100644 index 00000000000..fe932bb417d --- /dev/null +++ b/rosapps/notepad/Nl.rc @@ -0,0 +1,126 @@ +/* + * Notepad (Dutch resources) + * + * Copyright 2003 Hans Leidekker + * + * 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_DUTCH, SUBLANG_DEFAULT + +MAIN_MENU MENU +{ + POPUP "&Bestand" { + MENUITEM "&Nieuw...", CMD_NEW + MENUITEM "&Openen\tCtrl+O", CMD_OPEN + MENUITEM "O&pslaan\tCtrl+p", CMD_SAVE + MENUITEM "Ops&laan als...", CMD_SAVE_AS + MENUITEM SEPARATOR + MENUITEM "&Afdrukken", CMD_PRINT + MENUITEM "Pagina-in&stelling...", CMD_PAGE_SETUP + MENUITEM "Printerinstellingen...", CMD_PRINTER_SETUP + MENUITEM SEPARATOR + MENUITEM "&Afsluiten", CMD_EXIT + } +POPUP "Be&werken" { + MENUITEM "&Ongedaan maken\tCtrl+Z", CMD_UNDO + MENUITEM SEPARATOR + MENUITEM "K&nippen\tCtrl+X", CMD_CUT + MENUITEM "&Kopi毛ren\tCtrl+C", CMD_COPY + MENUITEM "&Plakken\tCtrl+V", CMD_PASTE + MENUITEM "&Verwijderen\tDel", CMD_DELETE + MENUITEM SEPARATOR + MENUITEM "&Alles selecteren\tCtrl+A", CMD_SELECT_ALL + MENUITEM "Tijd/&datum\tF5", CMD_TIME_DATE + MENUITEM SEPARATOR + MENUITEM "A&utomatische terugloop", CMD_WRAP + MENUITEM "&Lettertype instellen...", CMD_FONT + } +POPUP "&Zoeken" { + MENUITEM "&Zoeken\tCtrl+Z", CMD_SEARCH + MENUITEM "&Volgende zoeken\tF3", CMD_SEARCH_NEXT + } +POPUP "&Help" { + MENUITEM "&Help-onderwerpen", CMD_HELP_CONTENTS + MENUITEM "&Zoeken...", CMD_HELP_SEARCH + MENUITEM "&Hulp bij Help", CMD_HELP_ON_HELP + MENUITEM SEPARATOR + POPUP "Inf&o..." { + MENUITEM "&Licentie", CMD_LICENSE + MENUITEM "&GEEN GARANTIE", CMD_NO_WARRANTY + MENUITEM "&Over Wine", CMD_ABOUT_WINE + } + } +} + +/* Dialog `Page setup' */ + +DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 8, "Helv" +CAPTION "Pagina-instelling" +{ +LTEXT "&Koptekst:", 0x140, 10, 07, 40, 15 +EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP +LTEXT "&Voettekst:", 0x142, 10, 24, 40, 15 +EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP + +GROUPBOX "&Marges:", 0x144, 10, 43,160, 45 +LTEXT "Li&nks:", 0x145, 20, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Boven:", 0x148, 20, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Rechts:", 0x14B, 100, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Onder:", 0x14E,100, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP + +DEFPUSHBUTTON "OK", 0x151, 180, 3, 40, 15, WS_TABSTOP +PUSHBUTTON "Annuleren", 0x152, 180, 21, 40, 15, WS_TABSTOP +PUSHBUTTON "&Help", 0x153, 180, 39, 40, 15, WS_TABSTOP +} + +STRINGTABLE DISCARDABLE +{ +STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ +STRING_PAGESETUP_FOOTERVALUE, "Pagina &s" /* FIXME */ +STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ +STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ + +STRING_NOTEPAD, "Kladblok" +STRING_ERROR, "FOUT" +STRING_WARNING, "WAARSCHUWING" +STRING_INFO, "Informatie" + +STRING_UNTITLED, "(naamloos)" + +STRING_ALL_FILES, "Alle bestanden (*.*)" +STRING_TEXT_FILES_TXT, "Tekstbestanden (*.txt)" + +STRING_TOOLARGE, "Het bestand '%s' is te groot voor Kladblok.\n \ +Gebruik een andere editor." +STRING_NOTEXT, "U heeft geen tekst ingevoerd. \ +\nType uw tekst en probeer het nogmaals" +STRING_DOESNOTEXIST, "Het bestand '%s'\nbestaat niet\n\n \ +Wilt u een nieuw bestand maken?" +STRING_NOTSAVED, "Het bestand '%s'\nis gewijzigd\n\n \ +Wilt u de wijzigingen opslaan?" +STRING_NOTFOUND, "'%s' kan niet worden gevonden." +STRING_OUT_OF_MEMORY, "Onvoldoende geheugen. \ +\nSluit een of meer applicaties om de hoeveelheid \nbeschikbaar geheugen te vergroten." + +} diff --git a/rosapps/notepad/Pt.rc b/rosapps/notepad/Pt.rc new file mode 100644 index 00000000000..5ff963645b2 --- /dev/null +++ b/rosapps/notepad/Pt.rc @@ -0,0 +1,129 @@ +/* + * Notepad + * Portuguese Language Support + * + * Copyright 1999 Marcel Baur <alves@correionet.com.br> + * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> + * Copyright 2003 Marcelo Duarte + * + * 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_PORTUGUESE, SUBLANG_DEFAULT + +MAIN_MENU MENU +{ + POPUP "&Arquivo" { + MENUITEM "&Novo...", CMD_NEW + MENUITEM "A&brir", CMD_OPEN + MENUITEM "&Salvar", CMD_SAVE + MENUITEM "Salvar &como...", CMD_SAVE_AS + MENUITEM SEPARATOR + MENUITEM "&Imprimir", CMD_PRINT + MENUITEM "C&onfigurar p醙ina...", CMD_PAGE_SETUP + MENUITEM "Configurar i&mpressora...", CMD_PRINTER_SETUP + MENUITEM SEPARATOR + MENUITEM "Sai&r", CMD_EXIT + } +POPUP "&Editar" { + MENUITEM "&Desfazer\tCtrl+Z", CMD_UNDO + MENUITEM SEPARATOR + MENUITEM "&Recortar\tCtrl+X", CMD_CUT + MENUITEM "&Copiar\tCtrl+C", CMD_COPY + MENUITEM "C&olar\tCtrl+V", CMD_PASTE + MENUITEM "E&xcluir\tDel", CMD_DELETE + MENUITEM SEPARATOR + MENUITEM "Selecionar &tudo", CMD_SELECT_ALL + MENUITEM "&Data/Hora\tF5", CMD_TIME_DATE + MENUITEM SEPARATOR + MENUITEM "&Quebrar autom醫ica de linha", CMD_WRAP + MENUITEM "&Fonte...", CMD_FONT + } +POPUP "&Pesquisa" { + MENUITEM "&Localizar...", CMD_SEARCH + MENUITEM "Localizar &pr髕ima\tF3", CMD_SEARCH_NEXT + } +POPUP "&Ajuda" { + MENUITEM "&Conte鷇o", CMD_HELP_CONTENTS + MENUITEM "&Procurar...", CMD_HELP_SEARCH + MENUITEM "&Ajuda na ajuda", CMD_HELP_ON_HELP + MENUITEM SEPARATOR + POPUP "&Informa珲es..." { + MENUITEM "&Licen鏰", CMD_LICENSE + MENUITEM "&SEM GARANTIA", CMD_NO_WARRANTY + MENUITEM "&Sobre o Wine", CMD_ABOUT_WINE + } + } +} + +/* Dialog `Page setup' */ + +DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 8, "Helv" +CAPTION "Configurar p醙ina" +{ +LTEXT "&Cabe鏰lho:", 0x140, 10, 07, 40, 15 +EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP +LTEXT "&Rodap:", 0x142, 10, 24, 40, 15 +EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP + +GROUPBOX "&Margens:", 0x144, 10, 43,160, 45 +LTEXT "&Esquerda:", 0x145, 20, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Superior:", 0x148, 20, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Direita:", 0x14B, 100, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Inferior:", 0x14E,100, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP + +DEFPUSHBUTTON "OK", 0x151, 180, 3, 40, 15, WS_TABSTOP +PUSHBUTTON "Cancelar", 0x152, 180, 21, 40, 15, WS_TABSTOP +PUSHBUTTON "&Ajuda", 0x153, 180, 39, 40, 15, WS_TABSTOP +} + +STRINGTABLE DISCARDABLE +{ +STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ +STRING_PAGESETUP_FOOTERVALUE, "P醙ina &s" /* FIXME */ +STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ +STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ + +STRING_NOTEPAD, "Notepad" +STRING_ERROR, "ERRO" +STRING_WARNING, "AVISO" +STRING_INFO, "Informa玢o" + +STRING_UNTITLED, "(sem nome)" + +STRING_ALL_FILES, "Todos os arquivos (*.*)" +STRING_TEXT_FILES_TXT, "Arquivos texto (*.txt)" + +STRING_TOOLARGE, "Arquivo '%s' muito longo para o notepad.\n \ +Por favor use um editor diferente." +STRING_NOTEXT, "Voc n鉶 digitou nenhum texto. \ +\nPor favor digite alguma coisa e tente novamente" +STRING_DOESNOTEXIST, "Arquivo '%s'\nn鉶 existe\n\n \ +Voc deseja criar um novo arquivo?" +STRING_NOTSAVED, "Arquivo '%s'\nfoi modificado\n\n \ +Gostaria de salvar as altera缯es?" +STRING_NOTFOUND, "'%s' n鉶 pode ser encontrado." +STRING_OUT_OF_MEMORY, "N鉶 h mem髍ia suficiente para completar essa \ +tarefa. \nFeche uma ou mais aplica珲es para aumentar a quantidade de mem髍ia livre." + +} diff --git a/rosapps/notepad/Ru.rc b/rosapps/notepad/Ru.rc new file mode 100644 index 00000000000..e40145d0ecd --- /dev/null +++ b/rosapps/notepad/Ru.rc @@ -0,0 +1,124 @@ +/* + * Notepad (Russian resources) + * + * Copyright 2003 Igor Stepin + * + * 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 + */ + +MAIN_MENU MENU LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT +{ + POPUP "&脏殡" { + MENUITEM "杨玟&囹", CMD_NEW + MENUITEM "&悟牮...", CMD_OPEN + MENUITEM "&杨躔囗栩", CMD_SAVE + MENUITEM "杨躔囗栩 &赅...", CMD_SAVE_AS + MENUITEM SEPARATOR + MENUITEM "相疣&戾蝠 耱疣龛鳆...", CMD_PAGE_SETUP + MENUITEM "&袜耱痤殛 镳桧蝈疣...", CMD_PRINTER_SETUP + MENUITEM "&襄鬣蜞螯", CMD_PRINT + MENUITEM SEPARATOR + MENUITEM "&钿", CMD_EXIT + } +POPUP "&橡噔赅" { + MENUITEM "&悟戾龛螯\tCtrl+Z", CMD_UNDO + MENUITEM SEPARATOR + MENUITEM "&蔓疱玎螯\tCtrl+X", CMD_CUT + MENUITEM "&暑镨痤忄螯\tCtrl+C", CMD_COPY + MENUITEM "埋&噔栩黒tCtrl+V", CMD_PASTE + MENUITEM "&愉嚯栩黒tDel", CMD_DELETE + MENUITEM SEPARATOR + MENUITEM "蔓溴腓螯 &皴", CMD_SELECT_ALL + MENUITEM "吗屐& 溧蜞\tF5", CMD_TIME_DATE + MENUITEM SEPARATOR + MENUITEM "&襄疱眍 镱 耠钼囔", CMD_WRAP + } +POPUP "&铊耜" { + MENUITEM "&袜轵", CMD_SEARCH + MENUITEM "袜轵 &溧脲錦tF3", CMD_SEARCH_NEXT + } +POPUP "&扬疣怅" { + MENUITEM "&杨溴疰囗桢", CMD_HELP_CONTENTS + MENUITEM "&项桉...", CMD_HELP_SEARCH + MENUITEM "&锐镱朦珙忄龛 耧疣怅", CMD_HELP_ON_HELP + MENUITEM SEPARATOR + POPUP "&砚邃屙..." { + MENUITEM "&髓鲥礴", CMD_LICENSE + MENUITEM "&僚 美欣鸵壬", CMD_NO_WARRANTY + MENUITEM "&O Wine", CMD_ABOUT_WINE + } + } +} + +/* Dialog `Page setup' */ + +DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 +LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 8, "Helv" +CAPTION "相疣戾蝠 耱疣龛鳆" +{ +LTEXT "&屦蹴栝 觐腩眚栩箅:", 0x140, 10, 07, 40, 15 +EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP +LTEXT "&桄龛 觐腩眚栩箅:", 0x142, 10, 24, 40, 15 +EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP + +GROUPBOX "项 (祆):", 0x144, 10, 43,160, 45 +LTEXT "&隋忸:", 0x145, 20, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&洛瘐礤:", 0x148, 20, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&橡噔铄:", 0x14B, 100, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&丸骓邋:", 0x14E,100, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP + +DEFPUSHBUTTON "OK", 0x151, 180, 3, 40, 15, WS_TABSTOP +PUSHBUTTON "悟戾磬", 0x152, 180, 21, 40, 15, WS_TABSTOP +PUSHBUTTON "&扬疣怅", 0x153, 180, 39, 40, 15, WS_TABSTOP +} + +STRINGTABLE DISCARDABLE LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT +{ +STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ +STRING_PAGESETUP_FOOTERVALUE, "羊疣龛鲟 &s" /* FIXME */ +STRING_PAGESETUP_LEFTVALUE, "20 祆" /* FIXME */ +STRING_PAGESETUP_RIGHTVALUE, "20 祆" /* FIXME */ +STRING_PAGESETUP_TOPVALUE, "25 祆" /* FIXME */ +STRING_PAGESETUP_BOTTOMVALUE, "25 祆" /* FIXME */ + +STRING_NOTEPAD, "岭铌眍" +STRING_ERROR, "呜攘世" +STRING_WARNING, "峦忍劳扰" +STRING_INFO, "软纛痨圉" + +STRING_UNTITLED, "(徨 玎泐腩怅)" + +STRING_ALL_FILES, "埋 羿殡 (*.*)" +STRING_TEXT_FILES_TXT, "义犟蝾恹 羿殡 (*.txt)" + +STRING_TOOLARGE, "脏殡 '%s' 耠桫觐 犷朦 潆 犭铌眍蜞.\n \ +锐镱朦珞轵 漯筱铋 疱溧牝铕." +STRING_NOTEXT, "蔓 礤 忖咫 龛赅觐泐 蝈犟蜞. \ +\n骡邃栩 黩-龛狍潼 镱镳钺箝蝈 妁." +STRING_DOESNOTEXIST, "脏殡 '%s'\n礤 耋耱怏弪\n\n \ +疹蜩蝈 耦玟囹 眍恹 羿殡?" +STRING_NOTSAVED, "脏殡 '%s'\n猁 桤戾礤韁n\n \ +疹蜩蝈 耦躔囗栩 桤戾礤龛?" +STRING_NOTFOUND, "'%s' 礤 磬殇屙." +STRING_OUT_OF_MEMORY, "湾漕耱囹铟眍 镟蜩 潆 玎忮瘌屙 铋 铒屦圉梃 \ +\n青牮铋蝈 钿眍 桦 礤耜铍 镳桦铈屙栝 镱怛铕栩 镱稃蜿." + +} diff --git a/rosapps/notepad/Si.rc b/rosapps/notepad/Si.rc new file mode 100644 index 00000000000..60fe9a15201 --- /dev/null +++ b/rosapps/notepad/Si.rc @@ -0,0 +1,125 @@ +/* + * Notepad (Slovenian resources) + * + * Copyright 2002-2003 Rok Mandeljc <rok.mandeljc@gimb.org> + * + * 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_SLOVENIAN, SUBLANG_DEFAULT + +MAIN_MENU MENU +{ + POPUP "&Datoteka" { + MENUITEM "&Nova", CMD_NEW + MENUITEM "&Odpri ...", CMD_OPEN + MENUITEM "&Shrani", CMD_SAVE + MENUITEM "Shrani &kot ...", CMD_SAVE_AS + MENUITEM SEPARATOR + MENUITEM "Na&tisni", CMD_PRINT + MENUITEM "P&riprava strani ...", CMD_PAGE_SETUP + MENUITEM "&Tiskalnik ...", CMD_PRINTER_SETUP + MENUITEM SEPARATOR + MENUITEM "Iz&hod", CMD_EXIT + } +POPUP "&Urejanje" { + MENUITEM "&Razveljavi\tCtrl+Z", CMD_UNDO + MENUITEM SEPARATOR + MENUITEM "&Izre瀒\tCtrl+X", CMD_CUT + MENUITEM "&Kopiraj\tCtrl+C", CMD_COPY + MENUITEM "&Prilepi\tCtrl+V", CMD_PASTE + MENUITEM "Izbri&歩\tDel", CMD_DELETE + MENUITEM SEPARATOR + MENUITEM "Izberi &vse", CMD_SELECT_ALL + MENUITEM "萢s/&Datum\tF5", CMD_TIME_DATE + MENUITEM SEPARATOR + MENUITEM "Pr&elom vrstice", CMD_WRAP + } +POPUP "&Iskanje" { + MENUITEM "&Najdi ...", CMD_SEARCH + MENUITEM "Na&daljuj iskanje\tF3", CMD_SEARCH_NEXT + } +POPUP "&Pomo" { + MENUITEM "&Teme pomo鑙", CMD_HELP_CONTENTS + MENUITEM "&Najdi ...", CMD_HELP_SEARCH + MENUITEM "&O pomo鑙", CMD_HELP_ON_HELP + MENUITEM SEPARATOR + POPUP "Inf&ormacije ..." { + MENUITEM "&Licen鑞a pogodba", CMD_LICENSE + MENUITEM "&BREZ GARANCIJE", CMD_NO_WARRANTY + MENUITEM "&O Wine", CMD_ABOUT_WINE + } + } +} + +/* Dialog `Page setup' */ + +DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 8, "Priprava strani" +CAPTION "Page Setup" +{ +LTEXT "&Glava:", 0x140, 10, 07, 40, 15 +EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP +LTEXT "&Noga:", 0x142, 10, 24, 40, 15 +EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP + +GROUPBOX "Robovi", 0x144, 10, 43,160, 45 +LTEXT "&Levo:", 0x145, 20, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Desno:", 0x148, 20, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Zgoraj:", 0x14B, 100, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Spodaj:", 0x14E,100, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP + +DEFPUSHBUTTON "V redu", 0x151, 180, 3, 40, 15, WS_TABSTOP +PUSHBUTTON "Prekli鑙", 0x152, 180, 21, 40, 15, WS_TABSTOP +PUSHBUTTON "&Pomo", 0x153, 180, 39, 40, 15, WS_TABSTOP +} + +STRINGTABLE DISCARDABLE +{ +STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ +STRING_PAGESETUP_FOOTERVALUE, "Stran &s" /* FIXME */ +STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ +STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ + +STRING_NOTEPAD, "Bele瀗ica" +STRING_ERROR, "NAPAKA" +STRING_WARNING, "OPOZORILO" +STRING_INFO, "Informacija" + +STRING_UNTITLED, "Neimenovana" + +STRING_ALL_FILES, "Vse datoteke (*.*)" +STRING_TEXT_FILES_TXT, "Datoteke z besedilom (*.txt)" + +STRING_TOOLARGE, "Datoteka '%s' je prevelika za Bele瀗ico.\n \ +Uporabite drug urejevalnik." +STRING_NOTEXT, "Niste vnesli besedila. \ +\nVnesite besedilo in poskusite znova." +STRING_DOESNOTEXIST, "Datoteka '%s' ne obstaja.\n\n \ +Ali 瀍lite ustvariti novo datoteko?" +STRING_NOTSAVED, "Vsebina datoteke '%s'je bila spremenjena.\n\n \ +Ali 瀍lite shraniti spremembe?" +STRING_NOTFOUND, "Ni mogo鑕 najti '%s'." +STRING_OUT_OF_MEMORY, "Na voljo ni dovolj pomnilnika, da bi bilo mogo鑕 dokon鑑ti to \ +operacijo. \n萫 ga 瀍lite sprostiti, kon鑑jte enega ali ve programov in poskusite znova. " + +} diff --git a/rosapps/notepad/Sk.rc b/rosapps/notepad/Sk.rc new file mode 100644 index 00000000000..8e429ef9a1e --- /dev/null +++ b/rosapps/notepad/Sk.rc @@ -0,0 +1,127 @@ +/* + * Notepad (Slovak resources) + * + * Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch> + * Proofread 1998 by David Lee Lambert <lamber45@egr.msu.edu> + * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> + * + * 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_SLOVAK, SUBLANG_DEFAULT + +MAIN_MENU MENU +{ + POPUP "&File" { + MENUITEM "&New...", CMD_NEW + MENUITEM "&Open", CMD_OPEN + MENUITEM "&Save", CMD_SAVE + MENUITEM "Save &as...", CMD_SAVE_AS + MENUITEM "&Print", CMD_PRINT + MENUITEM "Page Se&tup...", CMD_PAGE_SETUP + MENUITEM "P&rinter Setup...", CMD_PRINTER_SETUP + MENUITEM SEPARATOR + MENUITEM "&Exit", CMD_EXIT + } +POPUP "&Edit" { + MENUITEM "&Undo\tCtrl+Z", CMD_UNDO + MENUITEM SEPARATOR + MENUITEM "Cu&t\tCtrl+X", CMD_CUT + MENUITEM "&Copy\tCtrl+C", CMD_COPY + MENUITEM "&Paste\tCtrl+V", CMD_PASTE + MENUITEM "&Delete\tDel", CMD_DELETE + MENUITEM SEPARATOR + MENUITEM "Select &all", CMD_SELECT_ALL + MENUITEM "&Time/Date\tF5", CMD_TIME_DATE + MENUITEM SEPARATOR + MENUITEM "&Wrap long lines", CMD_WRAP + } +POPUP "&Search" { + MENUITEM "&Search", CMD_SEARCH + MENUITEM "&Search next\tF3", CMD_SEARCH_NEXT + } +POPUP "&Help" { + MENUITEM "&Contents", CMD_HELP_CONTENTS + MENUITEM "&Search...", CMD_HELP_SEARCH + MENUITEM "&Help on help", CMD_HELP_ON_HELP + MENUITEM SEPARATOR + POPUP "Inf&o..." { + MENUITEM "&License", CMD_LICENSE + MENUITEM "&NO WARRANTY", CMD_NO_WARRANTY + MENUITEM "&About Wine", CMD_ABOUT_WINE + } + } +} + +/* Dialog `Page setup' */ + +DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 8, "Helv" +CAPTION "Page Setup" +{ +LTEXT "&Header:", 0x140, 10, 07, 40, 15 +EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP +LTEXT "&Footer:", 0x142, 10, 24, 40, 15 +EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP + +GROUPBOX "&Margins:", 0x144, 10, 43,160, 45 +LTEXT "&Left:", 0x145, 20, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Top:", 0x148, 20, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Right:", 0x14B, 100, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Bottom:", 0x14E,100, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP + +DEFPUSHBUTTON "OK", 0x151, 180, 3, 40, 15, WS_TABSTOP +PUSHBUTTON "Cancel", 0x152, 180, 21, 40, 15, WS_TABSTOP +PUSHBUTTON "&Help", 0x153, 180, 39, 40, 15, WS_TABSTOP +} + +STRINGTABLE DISCARDABLE +{ +STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ +STRING_PAGESETUP_FOOTERVALUE, "Page &s" /* FIXME */ +STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ +STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ + +STRING_NOTEPAD, "Notepad" +STRING_ERROR, "ERROR" +STRING_WARNING, "WARNING" +STRING_INFO, "Information" + +STRING_UNTITLED, "(untitled)" + +STRING_ALL_FILES, "All files (*.*)" +STRING_TEXT_FILES_TXT, "Text files (*.txt)" + +STRING_TOOLARGE, "File '%s' is too large for notepad.\n \ +Please use a different editor." +STRING_NOTEXT, "You didn't enter any text. \ +\nPlease type something and try again" +STRING_DOESNOTEXIST, "File '%s'\ndoes not exist\n\n \ +Do you want to create a new file ?" +STRING_NOTSAVED, "File '%s'\nhas been modified\n\n \ +Would you like to save the changes ?" +STRING_NOTFOUND, "'%s' can not be found." +STRING_OUT_OF_MEMORY, "Not enough memory to complete this \ +task. \nClose one or more applications to increase the amount of \nfree \ +memory." + +} diff --git a/rosapps/notepad/Sw.rc b/rosapps/notepad/Sw.rc new file mode 100644 index 00000000000..4999aa6d043 --- /dev/null +++ b/rosapps/notepad/Sw.rc @@ -0,0 +1,127 @@ +/* + * Notepad (Swedish resources) + * + * Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch> + * Proofread 1998 by David Lee Lambert <lamber45@egr.msu.edu> + * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> + * + * 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_SWEDISH, SUBLANG_DEFAULT + +MAIN_MENU MENU +{ + POPUP "&Arkiv" { + MENUITEM "&Ny...", CMD_NEW + MENUITEM "&ppna", CMD_OPEN + MENUITEM "&Spara", CMD_SAVE + MENUITEM "Spara &som...", CMD_SAVE_AS + MENUITEM "&Skriv ut", CMD_PRINT + MENUITEM "Sid La&yout...", CMD_PAGE_SETUP + MENUITEM "Skrivar &inst鋖lningar...", CMD_PRINTER_SETUP + MENUITEM SEPARATOR + MENUITEM "&Avsluta", CMD_EXIT + } +POPUP "&Redigera" { + MENUITEM "&Undo\tCtrl+Z", CMD_UNDO + MENUITEM SEPARATOR + MENUITEM "Klippa\tCtrl+X", CMD_CUT + MENUITEM "&Kopiera\tCtrl+C", CMD_COPY + MENUITEM "&Klistra in\tCtrl+V", CMD_PASTE + MENUITEM "&Ta bort\tDel", CMD_DELETE + MENUITEM SEPARATOR + MENUITEM "Markera &allt", CMD_SELECT_ALL + MENUITEM "&Tid/Datum\tF5", CMD_TIME_DATE + MENUITEM SEPARATOR + MENUITEM "&Dela l錸ga meningar", CMD_WRAP + } +POPUP "&S鰇" { + MENUITEM "S鰇...", CMD_SEARCH + MENUITEM "&S鰇 n鋝ta\tF3", CMD_SEARCH_NEXT + } +POPUP "&Hj鋖p" { + MENUITEM "&Inneh錶l", CMD_HELP_CONTENTS + MENUITEM "&S鰇...", CMD_HELP_SEARCH + MENUITEM "Anv鋘dningen &av hj鋖p", CMD_HELP_ON_HELP + MENUITEM SEPARATOR + POPUP "Inf&ormation..." { + MENUITEM "&Licens", CMD_LICENSE + MENUITEM "&INGEN GARANTI", CMD_NO_WARRANTY + MENUITEM "&Om Wine", CMD_ABOUT_WINE + } + } +} + +/* Dialog `Page setup' */ + +DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 8, "Helv" +CAPTION "Sid Layout" +{ +LTEXT "&Huvudnot:", 0x140, 10, 07, 40, 15 +EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP +LTEXT "&Fotnot:", 0x142, 10, 24, 40, 15 +EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP + +GROUPBOX "Kanter:", 0x144, 10, 43,160, 45 +LTEXT "&V鋘ster:", 0x145, 20, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&講er:", 0x148, 20, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&H鰃er:", 0x14B, 100, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Under:", 0x14E,100, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP + +DEFPUSHBUTTON "OK", 0x151, 180, 3, 40, 15, WS_TABSTOP +PUSHBUTTON "Avbryt", 0x152, 180, 21, 40, 15, WS_TABSTOP +PUSHBUTTON "&Hj鋖p", 0x153, 180, 39, 40, 15, WS_TABSTOP +} + +STRINGTABLE DISCARDABLE +{ +STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ +STRING_PAGESETUP_FOOTERVALUE, "Page &s" /* FIXME */ +STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ +STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ + +STRING_NOTEPAD, "Anteckningar" +STRING_ERROR, "FEL" +STRING_WARNING, "WARNING" +STRING_INFO, "Information" + +STRING_UNTITLED, "(untitled)" + +STRING_ALL_FILES, "Alla filer (*.*)" +STRING_TEXT_FILES_TXT, "Text filer (*.txt)" + +STRING_TOOLARGE, "Filen '%s' 鋜 f鰎 stor f鰎 notepad.\n \ +Anv鋘d en annan editor." +STRING_NOTEXT, "Du skrev inte in n錱on text. \ +\nSkriv n錱ot och f鰎s鰇 sedan igen" +STRING_DOESNOTEXIST, "File '%s'\ndoes not exist\n\n \ +Do you want to create a new file ?" +STRING_NOTSAVED, "File '%s'\nhas been modified\n\n \ +Would you like to save the changes ?" +STRING_NOTFOUND, "'%s' hittades inte." +STRING_OUT_OF_MEMORY, "Inte tillr鋕ligt med minne f鰎 att slutf鰎a \ +den h鋜 uppgiften. \nAvsluta ett eller flera program f鰎 att 鰇a m鋘gden \nfritt \ +minne." + +} diff --git a/rosapps/notepad/Th.rc b/rosapps/notepad/Th.rc new file mode 100644 index 00000000000..fb0cb107943 --- /dev/null +++ b/rosapps/notepad/Th.rc @@ -0,0 +1,121 @@ +/* + * Notepad (Thai Resources) + * + * 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 + */ + +LANGUAGE LANG_THAI, SUBLANG_DEFAULT + +MAIN_MENU MENU +{ + POPUP "峥榱" { + MENUITEM "拭橐с肆...", CMD_NEW + MENUITEM "嗷源...\tCtrl+O", CMD_OPEN + MENUITEM "貉狗住\tCtrl+S", CMD_SAVE + MENUITEM "貉狗住嗷绻...", CMD_SAVE_AS + MENUITEM SEPARATOR + MENUITEM "驹辆", CMD_PRINT + MENUITEM "幻押岬瑙斯橐...", CMD_PAGE_SETUP + MENUITEM "幻押岬瑙啶米柰Ь粤眷...", CMD_PRINTER_SETUP + MENUITEM SEPARATOR + MENUITEM "屯", CMD_EXIT + } + POPUP "帷殇" { + MENUITEM "嗝章·坠\tCtrl+Z", CMD_UNDO + MENUITEM SEPARATOR + MENUITEM "笛碶tCtrl+X", CMD_CUT + MENUITEM "笛磁汀\tCtrl+C", CMD_COPY + MENUITEM "且tCtrl+V", CMD_PASTE + MENUITEM "藕\tDel", CMD_DELETE + MENUITEM SEPARATOR + MENUITEM "嗯淄》验链\tCtrl+A", CMD_SELECT_ALL + MENUITEM "茄狗砧/\tF5", CMD_TIME_DATE + MENUITEM SEPARATOR + MENUITEM "髓秃妹费绰仪", CMD_WRAP + MENUITEM "觅会汉囱峭选擅...", CMD_FONT + } + POPUP "ぱ顾" { + MENUITEM "ら顾襖tCtrl+F", CMD_SEARCH + MENUITEM "ら顾业柰浠\tF3", CMD_SEARCH_NEXT + } + POPUP "锹嗨耪" { + MENUITEM "喙组退", CMD_HELP_CONTENTS + MENUITEM "ら顾...", CMD_HELP_SEARCH + MENUITEM "唷砧虑⊙邯枨锣伺胀", CMD_HELP_ON_HELP + MENUITEM SEPARATOR + POPUP "靡屡朽驼麓..." { + MENUITEM "愫凸丨业", CMD_LICENSE + MENUITEM "淞枇 WARRANTY", CMD_NO_WARRANTY + MENUITEM "唷砧虑⊙ Wine... ", CMD_ABOUT_WINE + } + } +} + +/* Dialog `Page setup' */ + +DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 8, "Helv" +CAPTION "幻押岬瑙斯橐" +{ +LTEXT "搜:", 0x140, 10, 07, 40, 15 +EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP +LTEXT "&Footer:", 0x142, 10, 24, 40, 15 +EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP + +GROUPBOX "⑼骸眯匆:", 0x144, 10, 43,160, 45 +LTEXT "i衣:", 0x145, 20, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "汗:", 0x148, 20, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "⑶:", 0x14B, 100, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "盆咬:", 0x14E,100, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP + +DEFPUSHBUTTON "怠脓", 0x151, 180, 3, 40, 15, WS_TABSTOP +PUSHBUTTON "隆嗯浴", 0x152, 180, 21, 40, 15, WS_TABSTOP +PUSHBUTTON "锹嗨耪", 0x153, 180, 39, 40, 15, WS_TABSTOP +} + +STRINGTABLE DISCARDABLE +{ +STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ +STRING_PAGESETUP_FOOTERVALUE, "斯橐 &s" /* FIXME */ +STRING_PAGESETUP_LEFTVALUE, "20 亮." /* FIXME */ +STRING_PAGESETUP_RIGHTVALUE, "20 亮." /* FIXME */ +STRING_PAGESETUP_TOPVALUE, "25 亮." /* FIXME */ +STRING_PAGESETUP_BOTTOMVALUE, "25 亮." /* FIXME */ + +STRING_NOTEPAD, "Notepad" +STRING_ERROR, "で伊辉" +STRING_WARNING, "ろ业淄" +STRING_INFO, "靡屡朽驼麓" + +STRING_UNTITLED, "淞琛硪斯椽骤" + +STRING_ALL_FILES, "坟♂块 (*.*)" +STRING_TEXT_FILES_TXT, "峥榱淀颐 (*.txt)" + +STRING_TOOLARGE, "峥榱 '%s' 闼唷怨浠" +STRING_NOTEXT, "へ充凌愦啖章雇袖肻n∶爻遗艇闼凌" +STRING_DOESNOTEXIST, "淞杈横块 '%s' 氛璧橥А颐嗷源\nへ车橥А颐拭橐с肆桎凌 ?" +STRING_NOTSAVED, "琳∫绵慌砧鹿峄脓⊙亨汀室肻n\n'%s'\n\nへ车橥А颐貉狗帧裂顾米弯凌 ?" +STRING_NOTFOUND, "淞杈孩橥で伊 '%s' 氛璧橥А颐ら顾" +STRING_OUT_OF_MEMORY, "で伊宜链\n∶爻遗艇闼凌" + +} diff --git a/rosapps/notepad/Wa.rc b/rosapps/notepad/Wa.rc new file mode 100644 index 00000000000..01f391c4525 --- /dev/null +++ b/rosapps/notepad/Wa.rc @@ -0,0 +1,130 @@ +/* + * Notepad (Walon resources) + * + * Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch> + * Proofread 1998 by David Lee Lambert <lamber45@egr.msu.edu> + * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> + * + * 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 + */ + +#ifdef LANG_WALON + +LANGUAGE LANG_WALON, SUBLANG_DEFAULT + +MAIN_MENU MENU +{ + POPUP "&Fitch" { + MENUITEM "&Novea...", CMD_NEW + MENUITEM "&Drov", CMD_OPEN + MENUITEM "&Schaper", CMD_SAVE + MENUITEM "Schaper 鑤 r&lomer...", CMD_SAVE_AS + MENUITEM "&Rexhe", CMD_PRINT + MENUITEM "Arrandjmint del &P錮je...", CMD_PAGE_SETUP + MENUITEM "&Apontiaedje del scrirece...", CMD_PRINTER_SETUP + MENUITEM SEPARATOR + MENUITEM "Mouss &Fo", CMD_EXIT + } +POPUP "&Candj" { + MENUITEM "&Disf閈tCtrl+Z", CMD_UNDO + MENUITEM SEPARATOR + MENUITEM "C&per\tCtrl+X", CMD_CUT + MENUITEM "&Copy頫tCtrl+C", CMD_COPY + MENUITEM "C&laper\tCtrl+V", CMD_PASTE + MENUITEM "&Rafacer\tDel", CMD_DELETE + MENUITEM SEPARATOR + MENUITEM "&Tchwezi totafwait", CMD_SELECT_ALL + MENUITEM "&Eure/Date\tF5", CMD_TIME_DATE + MENUITEM SEPARATOR + MENUITEM "C魀er les ro&yes", CMD_WRAP + } +POPUP "C&wer" { + MENUITEM "Cwer...", CMD_SEARCH + MENUITEM "&Sh鹶ant\tF3", CMD_SEARCH_NEXT + } +POPUP "&Aide" { + MENUITEM "&dvins", CMD_HELP_CONTENTS + MENUITEM "C&wer...", CMD_HELP_SEARCH + MENUITEM "&Aide so l' Aide", CMD_HELP_ON_HELP + MENUITEM SEPARATOR + POPUP "&Inform錭ion..." { + MENUITEM "&Licinse", CMD_LICENSE + MENUITEM "&NOLE WARANTEYE", CMD_NO_WARRANTY + MENUITEM " &dfait di Wine", CMD_ABOUT_WINE + } + } +} + +/* Dialog `Page setup' */ + +DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 8, "Helv" +CAPTION "Arindjmint del P錮je" +{ +LTEXT "&Tite:", 0x140, 10, 07, 40, 15 +EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP +LTEXT "&P頽ote:", 0x142, 10, 24, 40, 15 +EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP + +GROUPBOX "&Mardjes:", 0x144, 10, 43,160, 45 +LTEXT "&Hintche:", 0x145, 20, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Copete:", 0x148, 20, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Droete:", 0x14B, 100, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "&Bas:", 0x14E,100, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP + +DEFPUSHBUTTON "I Va", 0x151, 180, 3, 40, 15, WS_TABSTOP +PUSHBUTTON "Rinonc", 0x152, 180, 21, 40, 15, WS_TABSTOP +PUSHBUTTON "&Aide", 0x153, 180, 39, 40, 15, WS_TABSTOP +} + +STRINGTABLE DISCARDABLE +{ +STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ +STRING_PAGESETUP_FOOTERVALUE, "P錮je &s" /* FIXME */ +STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ +STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ + +STRING_NOTEPAD, "Notepad" +STRING_ERROR, "AROKE" +STRING_WARNING, "ADVERTIXHMINT" +STRING_INFO, "Inform錭ion" + +STRING_UNTITLED, "(sin tite)" + +STRING_ALL_FILES, "Tos les fitch顂 (*.*)" +STRING_TEXT_FILES_TXT, "Fitch顂 tekse (*.txt)" + +STRING_TOOLARGE, "Li fitch '%s' est trop gros pol notepad.\n \ +Eployoz on 魌e aspougneu di tekse." +STRING_NOTEXT, "Vos n' avoz r閚 sicr顃. \ +\nTapez ene sacwe 鑤 rasayez" +STRING_DOESNOTEXIST, "File '%s'\ndoes not exist\n\n \ +Do you want to create a new file ?" +STRING_NOTSAVED, "Li fitch '%s'\na candj頫n\n \ +El voloz schaper ?" +STRING_NOTFOUND, "'%s' pout n閚 esse trov." +STRING_OUT_OF_MEMORY, "Li memwere est plinne. \n\ +Cloyoz on programe ou pus po monter li memwere libe." + +} + +#endif /* LANG_WALON */ diff --git a/rosapps/notepad/Zh.rc b/rosapps/notepad/Zh.rc new file mode 100644 index 00000000000..8f2b554c2a6 --- /dev/null +++ b/rosapps/notepad/Zh.rc @@ -0,0 +1,123 @@ +/* + * Notepad (Simplified Chinese resources) + * + * Copyright 2002 liuspider <liuspider@yahoo.com> + * + * 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 + */ + +MAIN_MENU MENU LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED +{ + POPUP "文件(&F)" { + MENUITEM "新建(&N)...", CMD_NEW + MENUITEM "打开(&O)", CMD_OPEN + MENUITEM "保存(&S)", CMD_SAVE + MENUITEM "另存为(&A)...", CMD_SAVE_AS + MENUITEM "打印(&P)", CMD_PRINT + MENUITEM "页面设置(&T)...", CMD_PAGE_SETUP + MENUITEM "打印设置(&R)...", CMD_PRINTER_SETUP + MENUITEM SEPARATOR + MENUITEM "退出(&E)", CMD_EXIT + } +POPUP "编辑(&E)" { + MENUITEM "撤消(&U)\tCtrl+Z", CMD_UNDO + MENUITEM SEPARATOR + MENUITEM "剪切(&T)\tCtrl+X", CMD_CUT + MENUITEM "复制(&C)\tCtrl+C", CMD_COPY + MENUITEM "粘贴(&P)\tCtrl+V", CMD_PASTE + MENUITEM "删除(&D)\tDel", CMD_DELETE + MENUITEM SEPARATOR + MENUITEM "全选(&A)", CMD_SELECT_ALL + MENUITEM "插入日期、时间(&T)\tF5", CMD_TIME_DATE + MENUITEM SEPARATOR + MENUITEM "自动换行(&W)", CMD_WRAP + } +POPUP "搜索(&S)" { + MENUITEM "搜索(&S)", CMD_SEARCH + MENUITEM "搜索下一个(&S)\tF3", CMD_SEARCH_NEXT + } +POPUP "帮助(&H)" { + MENUITEM "内容(&C)", CMD_HELP_CONTENTS + MENUITEM "搜索(&S)...", CMD_HELP_SEARCH + MENUITEM "如何使用帮助(&H)", CMD_HELP_ON_HELP + MENUITEM SEPARATOR + POPUP "资料信息(&O)..." { + MENUITEM "用户许可协议(&L)", CMD_LICENSE + MENUITEM "责任无关(&N)", CMD_NO_WARRANTY + MENUITEM "关于 Wine(&A)", CMD_ABOUT_WINE + } + } +} + +/* Dialog `Page setup' */ + +DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 10, "Helv" +CAPTION "页面设置" +{ +LTEXT "页眉(&H):", 0x140, 10, 07, 40, 15 +EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP +LTEXT "脚注(&F):", 0x142, 10, 24, 40, 15 +EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP + +GROUPBOX "边缘空白(&M):", 0x144, 10, 43,160, 45 +LTEXT "左(&L):", 0x145, 20, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "上(&T):", 0x148, 20, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "右(&R):", 0x14B, 100, 55, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "下(&B):", 0x14E,100, 73, 30, 10, WS_CHILD +EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP + +DEFPUSHBUTTON "确定", 0x151, 180, 3, 40, 15, WS_TABSTOP +PUSHBUTTON "取消", 0x152, 180, 21, 40, 15, WS_TABSTOP +PUSHBUTTON "帮助(&)", 0x153, 180, 39, 40, 15, WS_TABSTOP +} + +STRINGTABLE DISCARDABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED +{ +STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */ +STRING_PAGESETUP_FOOTERVALUE, "Page &s" /* FIXME */ +STRING_PAGESETUP_LEFTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ +STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ +STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ + +STRING_NOTEPAD, "记事本" +STRING_ERROR, "错误" +STRING_WARNING, "警告" +STRING_INFO, "信息" + +STRING_UNTITLED, "(未命名)" + +STRING_ALL_FILES, "所有文件 (*.*)" +STRING_TEXT_FILES_TXT, "文本文件 (*.txt)" + +STRING_TOOLARGE, "记事本不能打开 '%s' 这么大的文件。\n \ +请使用别的编辑器。" +STRING_NOTEXT, "您没有输入任何文本。 \ +\n请输入一些再试" +STRING_DOESNOTEXIST, "文件 '%s'\n不存在\n\n \ +您想新建一个文件吗?" +STRING_NOTSAVED, "文件 '%s'\n正文已更改\n\n \ +是否保存更改?" +STRING_NOTFOUND, "找不到文件 '%s'" +STRING_OUT_OF_MEMORY, "没有足够的内存可以用来完成此项任务。 \ +\n请关闭一些程序施放内存后再试。" + +} diff --git a/rosapps/notepad/dialog.c b/rosapps/notepad/dialog.c new file mode 100644 index 00000000000..7cbee4fe87f --- /dev/null +++ b/rosapps/notepad/dialog.c @@ -0,0 +1,717 @@ +/* + * Notepad (dialog.c) + * + * Copyright 1998,99 Marcel Baur <mbaur@g26.ethz.ch> + * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> + * Copyright 2002 Andriy Palamarchuk + * + * 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 UNICODE + +#include <assert.h> +#include <stdio.h> +#include <windows.h> +#include <commdlg.h> + +#include "main.h" +#include "license.h" +#include "dialog.h" + +static const WCHAR helpfileW[] = { 'n','o','t','e','p','a','d','.','h','l','p',0 }; + +static INT_PTR WINAPI DIALOG_PAGESETUP_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam); + +VOID ShowLastError(void) +{ + DWORD error = GetLastError(); + if (error != NO_ERROR) + { + LPWSTR lpMsgBuf; + WCHAR szTitle[MAX_STRING_LEN]; + + LoadString(Globals.hInstance, STRING_ERROR, szTitle, SIZEOF(szTitle)); + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, error, 0, + (LPTSTR) &lpMsgBuf, 0, NULL); + MessageBox(NULL, lpMsgBuf, szTitle, MB_OK | MB_ICONERROR); + LocalFree(lpMsgBuf); + } +} + +/** + * Sets the caption of the main window according to Globals.szFileTitle: + * Notepad - (untitled) if no file is open + * Notepad - [filename] if a file is given + */ +static void UpdateWindowCaption(void) +{ + WCHAR szCaption[MAX_STRING_LEN]; + WCHAR szUntitled[MAX_STRING_LEN]; + + LoadString(Globals.hInstance, STRING_NOTEPAD, szCaption, SIZEOF(szCaption)); + + if (Globals.szFileTitle[0] != '\0') { + static const WCHAR bracket_lW[] = { ' ','-',' ','[',0 }; + static const WCHAR bracket_rW[] = { ']',0 }; + lstrcat(szCaption, bracket_lW); + lstrcat(szCaption, Globals.szFileTitle); + lstrcat(szCaption, bracket_rW); + } + else + { + static const WCHAR hyphenW[] = { ' ','-',' ',0 }; + LoadString(Globals.hInstance, STRING_UNTITLED, szUntitled, SIZEOF(szUntitled)); + lstrcat(szCaption, hyphenW); + lstrcat(szCaption, szUntitled); + } + + SetWindowText(Globals.hMainWnd, szCaption); +} + +static void AlertFileNotFound(LPCWSTR szFileName) +{ + WCHAR szMessage[MAX_STRING_LEN]; + WCHAR szResource[MAX_STRING_LEN]; + + /* Load and format szMessage */ + LoadString(Globals.hInstance, STRING_NOTFOUND, szResource, SIZEOF(szResource)); + wsprintf(szMessage, szResource, szFileName); + + /* Load szCaption */ + LoadString(Globals.hInstance, STRING_ERROR, szResource, SIZEOF(szResource)); + + /* Display Modal Dialog */ + MessageBox(Globals.hMainWnd, szMessage, szResource, MB_ICONEXCLAMATION); +} + +static int AlertFileNotSaved(LPCWSTR szFileName) +{ + WCHAR szMessage[MAX_STRING_LEN]; + WCHAR szResource[MAX_STRING_LEN]; + WCHAR szUntitled[MAX_STRING_LEN]; + + LoadString(Globals.hInstance, STRING_UNTITLED, szUntitled, SIZEOF(szUntitled)); + + /* Load and format Message */ + LoadString(Globals.hInstance, STRING_NOTSAVED, szResource, SIZEOF(szResource)); + wsprintf(szMessage, szResource, szFileName[0] ? szFileName : szUntitled); + + /* Load Caption */ + LoadString(Globals.hInstance, STRING_ERROR, szResource, SIZEOF(szResource)); + + /* Display modal */ + return MessageBox(Globals.hMainWnd, szMessage, szResource, MB_ICONEXCLAMATION|MB_YESNOCANCEL); +} + +/** + * Returns: + * TRUE - if file exists + * FALSE - if file does not exist + */ +BOOL FileExists(LPCWSTR szFilename) +{ + WIN32_FIND_DATA entry; + HANDLE hFile; + + hFile = FindFirstFile(szFilename, &entry); + FindClose(hFile); + + return (hFile != INVALID_HANDLE_VALUE); +} + + +static VOID DoSaveFile(VOID) +{ + HANDLE hFile; + DWORD dwNumWrite; + LPSTR pTemp; + DWORD size; + + hFile = CreateFile(Globals.szFileName, GENERIC_WRITE, FILE_SHARE_WRITE, + NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + if(hFile == INVALID_HANDLE_VALUE) + { + ShowLastError(); + return; + } + + size = GetWindowTextLengthA(Globals.hEdit) + 1; + pTemp = HeapAlloc(GetProcessHeap(), 0, size); + if (!pTemp) + { + CloseHandle(hFile); + ShowLastError(); + return; + } + size = GetWindowTextA(Globals.hEdit, pTemp, size); + + if (!WriteFile(hFile, pTemp, size, &dwNumWrite, NULL)) + ShowLastError(); + + CloseHandle(hFile); + HeapFree(GetProcessHeap(), 0, pTemp); +} + +/** + * Returns: + * TRUE - User agreed to close (both save/don't save) + * FALSE - User cancelled close by selecting "Cancel" + */ +BOOL DoCloseFile(void) +{ + int nResult; + static const WCHAR empty_strW[] = { 0 }; + + if (SendMessage(Globals.hEdit, EM_GETMODIFY, 0, 0)) + { + /* prompt user to save changes */ + nResult = AlertFileNotSaved(Globals.szFileName); + switch (nResult) { + case IDYES: DIALOG_FileSave(); + break; + + case IDNO: break; + + case IDCANCEL: return(FALSE); + break; + + default: return(FALSE); + break; + } /* switch */ + } /* if */ + + SetFileName(empty_strW); + + UpdateWindowCaption(); + return(TRUE); +} + + +void DoOpenFile(LPCWSTR szFileName) +{ + HANDLE hFile; + LPSTR pTemp; + DWORD size; + DWORD dwNumRead; + + /* Close any files and prompt to save changes */ + if (!DoCloseFile()) + return; + + hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if(hFile == INVALID_HANDLE_VALUE) + { + ShowLastError(); + return; + } + + size = GetFileSize(hFile, NULL); + if (size == INVALID_FILE_SIZE) + { + CloseHandle(hFile); + ShowLastError(); + return; + } + size++; + + pTemp = HeapAlloc(GetProcessHeap(), 0, size); + if (!pTemp) + { + CloseHandle(hFile); + ShowLastError(); + return; + } + + if (!ReadFile(hFile, pTemp, size, &dwNumRead, NULL)) + { + CloseHandle(hFile); + HeapFree(GetProcessHeap(), 0, pTemp); + ShowLastError(); + return; + } + + CloseHandle(hFile); + pTemp[dwNumRead] = 0; + + if (IsTextUnicode(pTemp, dwNumRead, NULL)) + { + LPWSTR p = (LPWSTR)pTemp; + /* We need to strip BOM Unicode character, SetWindowTextW won't do it for us. */ + if (*p == 0xFEFF || *p == 0xFFFE) p++; + SetWindowTextW(Globals.hEdit, p); + } + else + SetWindowTextA(Globals.hEdit, pTemp); + + HeapFree(GetProcessHeap(), 0, pTemp); + + SendMessage(Globals.hEdit, EM_SETMODIFY, FALSE, 0); + SendMessage(Globals.hEdit, EM_EMPTYUNDOBUFFER, 0, 0); + SetFocus(Globals.hEdit); + + SetFileName(szFileName); + UpdateWindowCaption(); +} + +VOID DIALOG_FileNew(VOID) +{ + static const WCHAR empty_strW[] = { 0 }; + + /* Close any files and promt to save changes */ + if (DoCloseFile()) { + SetWindowText(Globals.hEdit, empty_strW); + SendMessage(Globals.hEdit, EM_EMPTYUNDOBUFFER, 0, 0); + SetFocus(Globals.hEdit); + } +} + +VOID DIALOG_FileOpen(VOID) +{ + OPENFILENAME openfilename; + WCHAR szPath[MAX_PATH]; + WCHAR szDir[MAX_PATH]; + static const WCHAR szDefaultExt[] = { 't','x','t',0 }; + static const WCHAR txt_files[] = { '*','.','t','x','t',0 }; + + ZeroMemory(&openfilename, sizeof(openfilename)); + + GetCurrentDirectory(SIZEOF(szDir), szDir); + lstrcpy(szPath, txt_files); + + openfilename.lStructSize = sizeof(openfilename); + openfilename.hwndOwner = Globals.hMainWnd; + openfilename.hInstance = Globals.hInstance; + openfilename.lpstrFilter = Globals.szFilter; + openfilename.lpstrFile = szPath; + openfilename.nMaxFile = SIZEOF(szPath); + openfilename.lpstrInitialDir = szDir; + openfilename.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | + OFN_HIDEREADONLY; + openfilename.lpstrDefExt = szDefaultExt; + + + if (GetOpenFileName(&openfilename)) { + if (FileExists(openfilename.lpstrFile)) + DoOpenFile(openfilename.lpstrFile); + else + AlertFileNotFound(openfilename.lpstrFile); + } +} + + +VOID DIALOG_FileSave(VOID) +{ + if (Globals.szFileName[0] == '\0') + DIALOG_FileSaveAs(); + else + DoSaveFile(); +} + +VOID DIALOG_FileSaveAs(VOID) +{ + OPENFILENAME saveas; + WCHAR szPath[MAX_PATH]; + WCHAR szDir[MAX_PATH]; + static const WCHAR szDefaultExt[] = { 't','x','t',0 }; + static const WCHAR txt_files[] = { '*','.','t','x','t',0 }; + + ZeroMemory(&saveas, sizeof(saveas)); + + GetCurrentDirectory(SIZEOF(szDir), szDir); + lstrcpy(szPath, txt_files); + + saveas.lStructSize = sizeof(OPENFILENAME); + saveas.hwndOwner = Globals.hMainWnd; + saveas.hInstance = Globals.hInstance; + saveas.lpstrFilter = Globals.szFilter; + saveas.lpstrFile = szPath; + saveas.nMaxFile = SIZEOF(szPath); + saveas.lpstrInitialDir = szDir; + saveas.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | + OFN_HIDEREADONLY; + saveas.lpstrDefExt = szDefaultExt; + + if (GetSaveFileName(&saveas)) { + SetFileName(szPath); + UpdateWindowCaption(); + DoSaveFile(); + } +} + +VOID DIALOG_FilePrint(VOID) +{ + DOCINFO di; + PRINTDLG printer; + SIZE szMetric; + int cWidthPels, cHeightPels, border; + int xLeft, yTop, i, pagecount, dopage, copycount; + LOGFONT hdrFont; + HFONT font, old_font=0; + DWORD size; + LPWSTR pTemp; + static const WCHAR times_new_romanW[] = { 'T','i','m','e','s',' ','N','e','w',' ','R','o','m','a','n',0 }; + + /* Get a small font and print some header info on each page */ + hdrFont.lfHeight = 100; + hdrFont.lfWidth = 0; + hdrFont.lfEscapement = 0; + hdrFont.lfOrientation = 0; + hdrFont.lfWeight = FW_BOLD; + hdrFont.lfItalic = 0; + hdrFont.lfUnderline = 0; + hdrFont.lfStrikeOut = 0; + hdrFont.lfCharSet = ANSI_CHARSET; + hdrFont.lfOutPrecision = OUT_DEFAULT_PRECIS; + hdrFont.lfClipPrecision = CLIP_DEFAULT_PRECIS; + hdrFont.lfQuality = PROOF_QUALITY; + hdrFont.lfPitchAndFamily = VARIABLE_PITCH | FF_ROMAN; + lstrcpy(hdrFont.lfFaceName, times_new_romanW); + + font = CreateFontIndirect(&hdrFont); + + /* Get Current Settings */ + ZeroMemory(&printer, sizeof(printer)); + printer.lStructSize = sizeof(printer); + printer.hwndOwner = Globals.hMainWnd; + printer.hInstance = Globals.hInstance; + + /* Set some default flags */ + printer.Flags = PD_RETURNDC; + printer.nFromPage = 0; + printer.nMinPage = 1; + /* we really need to calculate number of pages to set nMaxPage and nToPage */ + printer.nToPage = 0; + printer.nMaxPage = -1; + + /* Let commdlg manage copy settings */ + printer.nCopies = (WORD)PD_USEDEVMODECOPIES; + + if (!PrintDlg(&printer)) return; + + assert(printer.hDC != 0); + + /* initialize DOCINFO */ + di.cbSize = sizeof(DOCINFO); + di.lpszDocName = Globals.szFileTitle; + di.lpszOutput = NULL; + di.lpszDatatype = NULL; + di.fwType = 0; + + if (StartDoc(printer.hDC, &di) <= 0) return; + + /* Get the page dimensions in pixels. */ + cWidthPels = GetDeviceCaps(printer.hDC, HORZRES); + cHeightPels = GetDeviceCaps(printer.hDC, VERTRES); + + /* Get the file text */ + size = GetWindowTextLength(Globals.hEdit) + 1; + pTemp = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR)); + if (!pTemp) + { + ShowLastError(); + return; + } + size = GetWindowText(Globals.hEdit, pTemp, size); + + border = 150; + for (copycount=1; copycount <= printer.nCopies; copycount++) { + i = 0; + pagecount = 1; + do { + static const WCHAR letterM[] = { 'M',0 }; + + if (pagecount >= printer.nFromPage && + /* ((printer.Flags & PD_PAGENUMS) == 0 || pagecount <= printer.nToPage))*/ + pagecount <= printer.nToPage) + dopage = 1; + else + dopage = 0; + + old_font = SelectObject(printer.hDC, font); + GetTextExtentPoint32(printer.hDC, letterM, 1, &szMetric); + + if (dopage) { + if (StartPage(printer.hDC) <= 0) { + static const WCHAR failedW[] = { 'S','t','a','r','t','P','a','g','e',' ','f','a','i','l','e','d',0 }; + static const WCHAR errorW[] = { 'P','r','i','n','t',' ','E','r','r','o','r',0 }; + MessageBox(Globals.hMainWnd, failedW, errorW, MB_ICONEXCLAMATION); + return; + } + /* Write a rectangle and header at the top of each page */ + Rectangle(printer.hDC, border, border, cWidthPels-border, border+szMetric.cy*2); + /* I don't know what's up with this TextOut command. This comes out + kind of mangled. + */ + TextOut(printer.hDC, border*2, border+szMetric.cy/2, Globals.szFileTitle, lstrlen(Globals.szFileTitle)); + } + + /* The starting point for the main text */ + xLeft = border*2; + yTop = border+szMetric.cy*4; + + SelectObject(printer.hDC, old_font); + GetTextExtentPoint32(printer.hDC, letterM, 1, &szMetric); + + /* Since outputting strings is giving me problems, output the main + text one character at a time. + */ + do { + if (pTemp[i] == '\n') { + xLeft = border*2; + yTop += szMetric.cy; + } + else if (pTemp[i] != '\r') { + if (dopage) + TextOut(printer.hDC, xLeft, yTop, &pTemp[i], 1); + xLeft += szMetric.cx; + } + } while (i++<size && yTop<(cHeightPels-border*2)); + + if (dopage) + EndPage(printer.hDC); + pagecount++; + } while (i<size); + } + + EndDoc(printer.hDC); + DeleteDC(printer.hDC); + HeapFree(GetProcessHeap(), 0, pTemp); +} + +VOID DIALOG_FilePrinterSetup(VOID) +{ + PRINTDLG printer; + + ZeroMemory(&printer, sizeof(printer)); + printer.lStructSize = sizeof(printer); + printer.hwndOwner = Globals.hMainWnd; + printer.hInstance = Globals.hInstance; + printer.Flags = PD_PRINTSETUP; + printer.nCopies = 1; + + PrintDlg(&printer); +} + +VOID DIALOG_FileExit(VOID) +{ + PostMessage(Globals.hMainWnd, WM_CLOSE, 0, 0l); +} + +VOID DIALOG_EditUndo(VOID) +{ + SendMessage(Globals.hEdit, EM_UNDO, 0, 0); +} + +VOID DIALOG_EditCut(VOID) +{ + SendMessage(Globals.hEdit, WM_CUT, 0, 0); +} + +VOID DIALOG_EditCopy(VOID) +{ + SendMessage(Globals.hEdit, WM_COPY, 0, 0); +} + +VOID DIALOG_EditPaste(VOID) +{ + SendMessage(Globals.hEdit, WM_PASTE, 0, 0); +} + +VOID DIALOG_EditDelete(VOID) +{ + SendMessage(Globals.hEdit, WM_CLEAR, 0, 0); +} + +VOID DIALOG_EditSelectAll(VOID) +{ + SendMessage(Globals.hEdit, EM_SETSEL, 0, (LPARAM)-1); +} + +VOID DIALOG_EditTimeDate(VOID) +{ + SYSTEMTIME st; + WCHAR szDate[MAX_STRING_LEN]; + static const WCHAR spaceW[] = { ' ',0 }; + + GetLocalTime(&st); + + GetTimeFormat(LOCALE_USER_DEFAULT, 0, &st, NULL, szDate, MAX_STRING_LEN); + SendMessage(Globals.hEdit, EM_REPLACESEL, TRUE, (LPARAM)szDate); + + SendMessage(Globals.hEdit, EM_REPLACESEL, TRUE, (LPARAM)spaceW); + + GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, szDate, MAX_STRING_LEN); + SendMessage(Globals.hEdit, EM_REPLACESEL, TRUE, (LPARAM)szDate); +} + +VOID DIALOG_EditWrap(VOID) +{ + Globals.bWrapLongLines = !Globals.bWrapLongLines; + CheckMenuItem(GetMenu(Globals.hMainWnd), CMD_WRAP, + MF_BYCOMMAND | (Globals.bWrapLongLines ? MF_CHECKED : MF_UNCHECKED)); +} + +VOID DIALOG_SelectFont(VOID) +{ + CHOOSEFONT cf; + LOGFONT lf=Globals.lfFont; + + ZeroMemory( &cf, sizeof(cf) ); + cf.lStructSize=sizeof(cf); + cf.hwndOwner=Globals.hMainWnd; + cf.lpLogFont=&lf; + cf.Flags=CF_SCREENFONTS; + + if( ChooseFont(&cf) ) + { + HFONT currfont=Globals.hFont; + + Globals.hFont=CreateFontIndirect( &lf ); + Globals.lfFont=lf; + SendMessage( Globals.hEdit, WM_SETFONT, (WPARAM)Globals.hFont, (LPARAM)TRUE ); + if( currfont!=NULL ) + DeleteObject( currfont ); + } +} + +VOID DIALOG_Search(VOID) +{ + ZeroMemory(&Globals.find, sizeof(Globals.find)); + Globals.find.lStructSize = sizeof(Globals.find); + Globals.find.hwndOwner = Globals.hMainWnd; + Globals.find.hInstance = Globals.hInstance; + Globals.find.lpstrFindWhat = Globals.szFindText; + Globals.find.wFindWhatLen = SIZEOF(Globals.szFindText); + Globals.find.Flags = FR_DOWN; + + /* We only need to create the modal FindReplace dialog which will */ + /* notify us of incoming events using hMainWnd Window Messages */ + + Globals.hFindReplaceDlg = FindText(&Globals.find); + assert(Globals.hFindReplaceDlg !=0); +} + +VOID DIALOG_SearchNext(VOID) +{ + /* FIXME: Search Next */ + DIALOG_Search(); +} + +VOID DIALOG_HelpContents(VOID) +{ + WinHelp(Globals.hMainWnd, helpfileW, HELP_INDEX, 0); +} + +VOID DIALOG_HelpSearch(VOID) +{ + /* Search Help */ +} + +VOID DIALOG_HelpHelp(VOID) +{ + WinHelp(Globals.hMainWnd, helpfileW, HELP_HELPONHELP, 0); +} + +VOID DIALOG_HelpLicense(VOID) +{ + WineLicense(Globals.hMainWnd); +} + +VOID DIALOG_HelpNoWarranty(VOID) +{ + WineWarranty(Globals.hMainWnd); +} + +VOID DIALOG_HelpAboutWine(VOID) +{ + static const WCHAR notepadW[] = { 'N','o','t','e','p','a','d','\n',0 }; + WCHAR szNotepad[MAX_STRING_LEN]; + + LoadString(Globals.hInstance, STRING_NOTEPAD, szNotepad, SIZEOF(szNotepad)); + ShellAbout(Globals.hMainWnd, szNotepad, notepadW, 0); +} + + +/*********************************************************************** + * + * DIALOG_FilePageSetup + */ +VOID DIALOG_FilePageSetup(void) +{ + DialogBox(Globals.hInstance, MAKEINTRESOURCE(DIALOG_PAGESETUP), + Globals.hMainWnd, DIALOG_PAGESETUP_DlgProc); +} + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * + * DIALOG_PAGESETUP_DlgProc + */ + +static INT_PTR WINAPI DIALOG_PAGESETUP_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + + switch (msg) + { + case WM_COMMAND: + switch (wParam) + { + case IDOK: + /* save user input and close dialog */ + GetDlgItemText(hDlg, 0x141, Globals.szHeader, SIZEOF(Globals.szHeader)); + GetDlgItemText(hDlg, 0x143, Globals.szFooter, SIZEOF(Globals.szFooter)); + GetDlgItemText(hDlg, 0x14A, Globals.szMarginTop, SIZEOF(Globals.szMarginTop)); + GetDlgItemText(hDlg, 0x150, Globals.szMarginBottom, SIZEOF(Globals.szMarginBottom)); + GetDlgItemText(hDlg, 0x147, Globals.szMarginLeft, SIZEOF(Globals.szMarginLeft)); + GetDlgItemText(hDlg, 0x14D, Globals.szMarginRight, SIZEOF(Globals.szMarginRight)); + EndDialog(hDlg, IDOK); + return TRUE; + + case IDCANCEL: + /* discard user input and close dialog */ + EndDialog(hDlg, IDCANCEL); + return TRUE; + + case IDHELP: + { + /* FIXME: Bring this to work */ + static const WCHAR sorryW[] = { 'S','o','r','r','y',',',' ','n','o',' ','h','e','l','p',' ','a','v','a','i','l','a','b','l','e',0 }; + static const WCHAR helpW[] = { 'H','e','l','p',0 }; + MessageBox(Globals.hMainWnd, sorryW, helpW, MB_ICONEXCLAMATION); + return TRUE; + } + + default: + break; + } + break; + + case WM_INITDIALOG: + /* fetch last user input prior to display dialog */ + SetDlgItemText(hDlg, 0x141, Globals.szHeader); + SetDlgItemText(hDlg, 0x143, Globals.szFooter); + SetDlgItemText(hDlg, 0x14A, Globals.szMarginTop); + SetDlgItemText(hDlg, 0x150, Globals.szMarginBottom); + SetDlgItemText(hDlg, 0x147, Globals.szMarginLeft); + SetDlgItemText(hDlg, 0x14D, Globals.szMarginRight); + break; + } + + return FALSE; +} diff --git a/rosapps/notepad/dialog.h b/rosapps/notepad/dialog.h new file mode 100644 index 00000000000..98f4d1562c5 --- /dev/null +++ b/rosapps/notepad/dialog.h @@ -0,0 +1,57 @@ +/* + * Notepad (dialog.h) + * + * Copyright 1998 Marcel Baur <mbaur@g26.ethz.ch> + * + * 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 + */ + +VOID DIALOG_FileNew(VOID); +VOID DIALOG_FileOpen(VOID); +VOID DIALOG_FileSave(VOID); +VOID DIALOG_FileSaveAs(VOID); +VOID DIALOG_FilePrint(VOID); +VOID DIALOG_FilePageSetup(VOID); +VOID DIALOG_FilePrinterSetup(VOID); +VOID DIALOG_FileExit(VOID); + +VOID DIALOG_EditUndo(VOID); +VOID DIALOG_EditCut(VOID); +VOID DIALOG_EditCopy(VOID); +VOID DIALOG_EditPaste(VOID); +VOID DIALOG_EditDelete(VOID); +VOID DIALOG_EditSelectAll(VOID); +VOID DIALOG_EditTimeDate(VOID); +VOID DIALOG_EditWrap(VOID); + +VOID DIALOG_Search(VOID); +VOID DIALOG_SearchNext(VOID); + +VOID DIALOG_SelectFont(VOID); + +VOID DIALOG_HelpContents(VOID); +VOID DIALOG_HelpSearch(VOID); +VOID DIALOG_HelpHelp(VOID); +VOID DIALOG_HelpLicense(VOID); +VOID DIALOG_HelpNoWarranty(VOID); +VOID DIALOG_HelpAboutWine(VOID); + +VOID DIALOG_TimeDate(VOID); + +/* utility functions */ +VOID ShowLastError(); +BOOL FileExists(LPCWSTR szFilename); +BOOL DoCloseFile(void); +void DoOpenFile(LPCWSTR szFileName); diff --git a/rosapps/notepad/framewnd.c b/rosapps/notepad/framewnd.c deleted file mode 100644 index 4268c7e6f50..00000000000 --- a/rosapps/notepad/framewnd.c +++ /dev/null @@ -1,503 +0,0 @@ -/* - * ReactOS notepad - * - * framewnd.c - * - * Copyright (C) 2002 Robert Dickenson <robd@reactos.org> - * - * 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 <windows.h> -#include <tchar.h> -#include <stdlib.h> -#include <commctrl.h> -#include <commdlg.h> -//#include <shellapi.h> - -#include "main.h" -#include "framewnd.h" - - -//////////////////////////////////////////////////////////////////////////////// -// Global and Local Variables: -// - -static BOOL bInMenuLoop = FALSE; // Tells us if we are in the menu loop - -static HWND hChildWnd; - -//////////////////////////////////////////////////////////////////////////////// -// Local module support methods -// - -static void resize_frame_rect(HWND hWnd, PRECT prect) -{ - RECT rt; -/* - if (IsWindowVisible(hToolBar)) { - SendMessage(hToolBar, WM_SIZE, 0, 0); - GetClientRect(hToolBar, &rt); - prect->top = rt.bottom+3; - prect->bottom -= rt.bottom+3; - } - */ - if (IsWindowVisible(hStatusBar)) { - SetupStatusBar(hWnd, TRUE); - GetClientRect(hStatusBar, &rt); - prect->bottom -= rt.bottom; - } - MoveWindow(hChildWnd, prect->left, prect->top, prect->right, prect->bottom, TRUE); -} - -void resize_frame_client(HWND hWnd) -{ - RECT rect; - - GetClientRect(hWnd, &rect); - resize_frame_rect(hWnd, &rect); -} - -//////////////////////////////////////////////////////////////////////////////// - -static void OnEnterMenuLoop(HWND hWnd) -{ - int nParts; - - // Update the status bar pane sizes - nParts = -1; - SendMessage(hStatusBar, SB_SETPARTS, 1, (long)&nParts); - bInMenuLoop = TRUE; - SendMessage(hStatusBar, SB_SETTEXT, (WPARAM)0, (LPARAM)_T("")); -} - -static void OnExitMenuLoop(HWND hWnd) -{ - bInMenuLoop = FALSE; - // Update the status bar pane sizes - SetupStatusBar(hWnd, TRUE); - UpdateStatusBar(); -} - -static void OnMenuSelect(HWND hWnd, UINT nItemID, UINT nFlags, HMENU hSysMenu) -{ - TCHAR str[100]; - - _tcscpy(str, _T("")); - if (nFlags & MF_POPUP) { - if (hSysMenu != GetMenu(hWnd)) { - if (nItemID == 2) nItemID = 5; - } - } - if (LoadString(hInst, nItemID, str, 100)) { - // load appropriate string - LPTSTR lpsz = str; - // first newline terminates actual string - lpsz = _tcschr(lpsz, '\n'); - if (lpsz != NULL) - *lpsz = '\0'; - } - SendMessage(hStatusBar, SB_SETTEXT, 0, (LPARAM)str); -} - -void SetupStatusBar(HWND hWnd, BOOL bResize) -{ - RECT rc; - int nParts; - GetClientRect(hWnd, &rc); - nParts = rc.right; -// nParts = -1; - if (bResize) - SendMessage(hStatusBar, WM_SIZE, 0, 0); - SendMessage(hStatusBar, SB_SETPARTS, 1, (LPARAM)&nParts); -} - -void UpdateStatusBar(void) -{ - TCHAR text[260]; - DWORD size; - - size = sizeof(text)/sizeof(TCHAR); - GetComputerName(text, &size); - SendMessage(hStatusBar, SB_SETTEXT, 0, (LPARAM)text); -} - -static void toggle_child(HWND hWnd, UINT cmd, HWND hchild) -{ - BOOL vis = IsWindowVisible(hchild); - HMENU hMenuView = GetSubMenu(hMenuFrame, ID_VIEW_MENU); - - CheckMenuItem(hMenuView, cmd, vis?MF_BYCOMMAND:MF_BYCOMMAND|MF_CHECKED); - ShowWindow(hchild, vis?SW_HIDE:SW_SHOW); - resize_frame_client(hWnd); -} - -static BOOL CheckCommDlgError(HWND hWnd) -{ - DWORD dwErrorCode = CommDlgExtendedError(); - switch (dwErrorCode) { - case CDERR_DIALOGFAILURE: - break; - case CDERR_FINDRESFAILURE: - break; - case CDERR_NOHINSTANCE: - break; - case CDERR_INITIALIZATION: - break; - case CDERR_NOHOOK: - break; - case CDERR_LOCKRESFAILURE: - break; - case CDERR_NOTEMPLATE: - break; - case CDERR_LOADRESFAILURE: - break; - case CDERR_STRUCTSIZE: - break; - case CDERR_LOADSTRFAILURE: - break; - case FNERR_BUFFERTOOSMALL: - break; - case CDERR_MEMALLOCFAILURE: - break; - case FNERR_INVALIDFILENAME: - break; - case CDERR_MEMLOCKFAILURE: - break; - case FNERR_SUBCLASSFAILURE: - break; - default: - break; - } - return TRUE; -} - -UINT_PTR CALLBACK File_OFNHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) -{ - OPENFILENAME* pOpenFileName; - OFNOTIFY* pOfNotify; - - switch (uiMsg) { - case WM_INITDIALOG: - pOpenFileName = (OPENFILENAME*)lParam; - break; - case WM_NOTIFY: - pOfNotify = (OFNOTIFY*)lParam; - if (pOfNotify->hdr.code == CDN_INITDONE) { - } - break; - default: - break; - } - return 0L; -} - -#define MAX_CUSTOM_FILTER_SIZE 50 -TCHAR CustomFilterBuffer[MAX_CUSTOM_FILTER_SIZE]; -TCHAR FileNameBuffer[_MAX_PATH]; -TCHAR FileTitleBuffer[_MAX_PATH]; - -static BOOL InitOpenFileName(HWND hWnd, OPENFILENAME* pofn) -{ - 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 (notepad4)\0*.reg\0All Files (*.*)\0*.*\0\0"); - pofn->lpstrCustomFilter = CustomFilterBuffer; - pofn->nMaxCustFilter = MAX_CUSTOM_FILTER_SIZE; - pofn->nFilterIndex = 0; - pofn->lpstrFile = FileNameBuffer; - pofn->nMaxFile = _MAX_PATH; - pofn->lpstrFileTitle = FileTitleBuffer; - pofn->nMaxFileTitle = _MAX_PATH; -// pofn->lpstrInitialDir = _T(""); -// pofn->lpstrTitle = _T("Import Registry File"); -// pofn->Flags = OFN_ENABLETEMPLATE + OFN_EXPLORER + OFN_ENABLESIZING; - pofn->Flags = OFN_HIDEREADONLY; -// pofn->nFileOffset = ; -// pofn->nFileExtension = ; -// pofn->lpstrDefExt = _T(""); -// pofn->lCustData = ; -// pofn->lpfnHook = ImportRegistryFile_OFNHookProc; -// pofn->lpTemplateName = _T("ID_DLG_IMPORT_REGFILE"); -// pofn->lpTemplateName = MAKEINTRESOURCE(IDD_DIALOG1); -// pofn->FlagsEx = ; - return TRUE; -} - -BOOL open_file(TCHAR* file_name) -{ - return TRUE; -} - -BOOL save_file(TCHAR* file_name, TCHAR* unused) -{ - return TRUE; -} - -static BOOL OpenFileName(HWND hWnd) -{ - OPENFILENAME ofn; - - InitOpenFileName(hWnd, &ofn); - ofn.lpstrTitle = _T("Import Registry File"); -// ofn.lCustData = ; - if (GetOpenFileName(&ofn)) { - if (!open_file(ofn.lpstrFile)) { - //printf("Can't open file \"%s\"\n", ofn.lpstrFile); - return FALSE; - } - } else { - CheckCommDlgError(hWnd); - } - return TRUE; -} - -static BOOL SaveFileName(HWND hWnd) -{ - OPENFILENAME ofn; - TCHAR ExportKeyPath[_MAX_PATH]; - - ExportKeyPath[0] = _T('\0'); - InitOpenFileName(hWnd, &ofn); - ofn.lpstrTitle = _T("Export Registry File"); -// ofn.lCustData = ; - ofn.Flags = OFN_ENABLETEMPLATE + OFN_EXPLORER; - ofn.lpfnHook = File_OFNHookProc; - ofn.lpTemplateName = MAKEINTRESOURCE(IDD_DIALOG1); - if (GetSaveFileName(&ofn)) { - BOOL result; - result = save_file(ofn.lpstrFile, ExportKeyPath); - //result = export_registry_key(ofn.lpstrFile, NULL); - //if (!export_registry_key(ofn.lpstrFile, NULL)) { - if (!result) { - //printf("Can't open file \"%s\"\n", ofn.lpstrFile); - return FALSE; - } - } else { - CheckCommDlgError(hWnd); - } - return TRUE; -} - -BOOL PrintFile(HWND hWnd, LPTSTR path) -{ -#if 1 - PRINTDLG pd; - - ZeroMemory(&pd, sizeof(PRINTDLG)); - pd.lStructSize = sizeof(PRINTDLG); - pd.hwndOwner = hWnd; - pd.hDevMode = NULL; // Don't forget to free or store hDevMode - pd.hDevNames = NULL; // Don't forget to free or store hDevNames - pd.Flags = PD_USEDEVMODECOPIESANDCOLLATE | PD_RETURNDC; - pd.nCopies = 1; - pd.nFromPage = 0xFFFF; - pd.nToPage = 0xFFFF; - pd.nMinPage = 1; - pd.nMaxPage = 0xFFFF; - if (PrintDlg(&pd) == TRUE) { - // GDI calls to render output. - DeleteDC(pd.hDC); // Delete DC when done. - } -#else - HRESULT hResult; - PRINTDLGEX pd; - - hResult = PrintDlgEx(&pd); - if (hResult == S_OK) { - switch (pd.dwResultAction) { - case PD_RESULT_APPLY: - //The user clicked the Apply button and later clicked the Cancel button. This indicates that the user wants to apply the changes made in the property sheet, but does not yet want to print. The PRINTDLGEX structure contains the information specified by the user at the time the Apply button was clicked. - break; - case PD_RESULT_CANCEL: - //The user clicked the Cancel button. The information in the PRINTDLGEX structure is unchanged. - break; - case PD_RESULT_PRINT: - //The user clicked the Print button. The PRINTDLGEX structure contains the information specified by the user. - break; - default: - break; - } - } else { - switch (hResult) { - case E_OUTOFMEMORY: - //Insufficient memory. - break; - case E_INVALIDARG: - // One or more arguments are invalid. - break; - case E_POINTER: - //Invalid pointer. - break; - case E_HANDLE: - //Invalid handle. - break; - case E_FAIL: - //Unspecified error. - break; - default: - break; - } - return FALSE; - } -#endif - return TRUE; -} - -BOOL CopyToClipboard(HWND hWnd, LPTSTR keyName) -{ - BOOL result; - - result = OpenClipboard(hWnd); - if (result) { - result = EmptyClipboard(); - if (result) { - - //HANDLE hClipData; - //hClipData = SetClipboardData(UINT uFormat, HANDLE hMem); - - } else { - // error emptying clipboard - DWORD dwError = GetLastError(); - } - if (!CloseClipboard()) { - // error closing clipboard - DWORD dwError = GetLastError(); - } - } else { - // error opening clipboard - DWORD dwError = GetLastError(); - } - return result; -} - -BOOL RefreshView(HWND hWnd) -{ - // TODO: - MessageBeep(-1); - MessageBeep(MB_ICONASTERISK); - MessageBeep(MB_ICONEXCLAMATION); - MessageBeep(MB_ICONHAND); - MessageBeep(MB_ICONQUESTION); - MessageBeep(MB_OK); - return TRUE; -} - -//////////////////////////////////////////////////////////////////////////////// -// -// FUNCTION: _CmdWndProc(HWND, unsigned, WORD, LONG) -// -// PURPOSE: Processes WM_COMMAND messages for the main frame window. -// -// -static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch (LOWORD(wParam)) { - // Parse the menu selections: - case ID_FILE_OPEN: - OpenFileName(hWnd); - break; - case ID_FILE_SAVE: - case ID_FILE_SAVEAS: - SaveFileName(hWnd); - break; - case ID_FILE_PAGESETUP: - case ID_FILE_PRINT: - PrintFile(hWnd, _T("")); - break; - //case ID_FILE_PRINTERSETUP: - //PRINTDLG pd; - //PrintDlg(&pd); - //PAGESETUPDLG psd; - //PageSetupDlg(&psd); - // break; - case ID_FILE_EXIT: - DestroyWindow(hWnd); - break; - case ID_EDIT_COPY: - CopyToClipboard(hWnd, _T("")); - break; - case ID_VIEW_REFRESH: - RefreshView(hWnd); - break; -// case ID_VIEW_TOOLBAR: -// toggle_child(hWnd, LOWORD(wParam), hToolBar); -// break; -// case ID_VIEW_STATUSBAR: -// toggle_child(hWnd, LOWORD(wParam), hStatusBar); -// break; - case ID_HELP_HELPTOPICS: -// WinHelp(hWnd, _T("notepad"), HELP_CONTENTS, 0); - WinHelp(hWnd, _T("notepad"), HELP_FINDER, 0); - break; - case ID_HELP_ABOUT: -#ifdef WINSHELLAPI -// ShellAbout(hWnd, szTitle, _T(""), LoadIcon(hInst, (LPCTSTR)IDI_notepad)); -#else -// ShowAboutBox(hWnd); -#endif - break; - default: - return FALSE; - } - return TRUE; -} - -//////////////////////////////////////////////////////////////////////////////// -// -// FUNCTION: FrameWndProc(HWND, unsigned, WORD, LONG) -// -// PURPOSE: Processes messages for the main frame window. -// - -LRESULT CALLBACK FrameWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch (message) { - case WM_CREATE: - hChildWnd = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, _T("notepad edit"), - WS_VISIBLE | WS_CHILD, - CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, - hWnd, (HMENU)0, hInst, NULL); - break; - case WM_COMMAND: - if (!_CmdWndProc(hWnd, message, wParam, lParam)) { - return DefWindowProc(hWnd, message, wParam, lParam); - } - break; - case WM_SIZE: - resize_frame_client(hWnd); - break; - case WM_TIMER: - break; - case WM_ENTERMENULOOP: - OnEnterMenuLoop(hWnd); - break; - case WM_EXITMENULOOP: - OnExitMenuLoop(hWnd); - break; - case WM_MENUSELECT: - OnMenuSelect(hWnd, LOWORD(wParam), HIWORD(wParam), (HMENU)lParam); - break; - case WM_DESTROY: - WinHelp(hWnd, _T("notepad"), HELP_QUIT, 0); - PostQuitMessage(0); - default: - return DefWindowProc(hWnd, message, wParam, lParam); - } - return 0; -} diff --git a/rosapps/notepad/framewnd.h b/rosapps/notepad/license.c similarity index 57% rename from rosapps/notepad/framewnd.h rename to rosapps/notepad/license.c index 6e6d8bc25a6..1fcef2336e6 100644 --- a/rosapps/notepad/framewnd.h +++ b/rosapps/notepad/license.c @@ -1,9 +1,7 @@ /* - * ReactOS notepad + * Notepad (license.h) * - * framewnd.h - * - * Copyright (C) 2002 Robert Dickenson <robd@reactos.org> + * Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -20,22 +18,23 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#ifndef __FRAMEWND_H__ -#define __FRAMEWND_H__ +#include <windows.h> +#include "license.h" -#ifdef __cplusplus -extern "C" { -#endif +VOID WineLicense(HWND Wnd) +{ + /* FIXME: should load strings from resources */ + LICENSE *License = &WineLicense_En; + MessageBox(Wnd, License->License, License->LicenseCaption, + MB_ICONINFORMATION | MB_OK); +} -LRESULT CALLBACK FrameWndProc(HWND, UINT, WPARAM, LPARAM); +VOID WineWarranty(HWND Wnd) +{ + /* FIXME: should load strings from resources */ + LICENSE *License = &WineLicense_En; + MessageBox(Wnd, License->Warranty, License->WarrantyCaption, + MB_ICONEXCLAMATION | MB_OK); +} -void SetupStatusBar(HWND hWnd, BOOL bResize); -void UpdateStatusBar(void); - - -#ifdef __cplusplus -}; -#endif - -#endif // __FRAMEWND_H__ diff --git a/rosapps/notepad/license.h b/rosapps/notepad/license.h new file mode 100644 index 00000000000..418bb66f5c7 --- /dev/null +++ b/rosapps/notepad/license.h @@ -0,0 +1,52 @@ +/* + * Notepad (license.h) + * + * Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch> + * + * 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 + */ + +VOID WineLicense(HWND hWnd); +VOID WineWarranty(HWND hWnd); + +typedef struct +{ + LPCSTR License, LicenseCaption; + LPCSTR Warranty, WarrantyCaption; +} LICENSE; + +/* +extern LICENSE WineLicense_Ca; +extern LICENSE WineLicense_Cz; +extern LICENSE WineLicense_Da; +extern LICENSE WineLicense_De; +*/ + +extern LICENSE WineLicense_En; + +/* +extern LICENSE WineLicense_Eo; +extern LICENSE WineLicense_Es; +extern LICENSE WineLicense_Fi; +extern LICENSE WineLicense_Fr; +extern LICENSE WineLicense_Hu; +extern LICENSE WineLicense_It; +extern LICENSE WineLicense_Ko; +extern LICENSE WineLicense_No; +extern LICENSE WineLicense_Pl; +extern LICENSE WineLicense_Po; +extern LICENSE WineLicense_Sw; +extern LICENSE WineLicense_Va; +*/ diff --git a/rosapps/notepad/main.c b/rosapps/notepad/main.c index 48b754a3ec8..a63f0535d24 100644 --- a/rosapps/notepad/main.c +++ b/rosapps/notepad/main.c @@ -1,9 +1,10 @@ /* - * ReactOS notepad + * Notepad * - * main.c - * - * Copyright (C) 2002 Robert Dickenson <robd@reactos.org> + * Copyright 2000 Mike McCormack <Mike_McCormack@looksmart.com.au> + * Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch> + * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> + * Copyright 2002 Andriy Palamarchuk * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,141 +19,336 @@ * 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 UNICODE + #include <windows.h> -#include <tchar.h> -#include <stdlib.h> -#include <commctrl.h> - +#include <stdio.h> + #include "main.h" -#include "framewnd.h" +#include "dialog.h" +#include "notepad_res.h" +NOTEPAD_GLOBALS Globals; +static ATOM aFINDMSGSTRING; -//////////////////////////////////////////////////////////////////////////////// -// Global Variables: -// - -HINSTANCE hInst; -HWND hFrameWnd; -HWND hStatusBar; -HMENU hMenuFrame; -UINT nClipboardFormat; -LPCTSTR strClipboardFormat = _T("TODO: SET CORRECT FORMAT"); - - -TCHAR szTitle[MAX_LOADSTRING]; -TCHAR szFrameClass[MAX_LOADSTRING]; -TCHAR szChildClass[MAX_LOADSTRING]; - - -BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) +/*********************************************************************** + * + * SetFileName + * + * Sets Global File Name. + */ +VOID SetFileName(LPCWSTR szFileName) { - WNDCLASSEX wcFrame = { - sizeof(WNDCLASSEX), - CS_HREDRAW | CS_VREDRAW/*style*/, - FrameWndProc, - 0/*cbClsExtra*/, - 0/*cbWndExtra*/, - hInstance, - LoadIcon(hInstance, MAKEINTRESOURCE(IDI_NOTEPAD)), - LoadCursor(0, IDC_ARROW), - 0/*hbrBackground*/, - 0/*lpszMenuName*/, - szFrameClass, - (HICON)LoadImage(hInstance, MAKEINTRESOURCE(IDI_NOTEPAD), IMAGE_ICON, - GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_SHARED) - }; - ATOM hFrameWndClass = RegisterClassEx(&wcFrame); // register frame window class -#if 0 - WNDCLASSEX wcChild = { - sizeof(WNDCLASSEX), - CS_HREDRAW | CS_VREDRAW/*style*/, - ChildWndProc, - 0/*cbClsExtra*/, - sizeof(HANDLE)/*cbWndExtra*/, - hInstance, - LoadIcon(hInstance, MAKEINTRESOURCE(IDI_NOTEPAD)), - LoadCursor(0, IDC_ARROW), - 0/*hbrBackground*/, - 0/*lpszMenuName*/, - szChildClass, - (HICON)LoadImage(hInstance, MAKEINTRESOURCE(IDI_NOTEPAD), IMAGE_ICON, - GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_SHARED) - - }; - ATOM hChildWndClass = RegisterClassEx(&wcChild); // register child windows class - hChildWndClass = hChildWndClass; // warning eater -#endif - hMenuFrame = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_NOTEPAD_MENU)); - - // Initialize the Windows Common Controls DLL - InitCommonControls(); - - nClipboardFormat = RegisterClipboardFormat(strClipboardFormat); - if (nClipboardFormat == 0) { - DWORD dwError = GetLastError(); - } - - hFrameWnd = CreateWindowEx(0, (LPCTSTR)(int)hFrameWndClass, szTitle, - WS_OVERLAPPEDWINDOW | WS_EX_CLIENTEDGE, - CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, - NULL, hMenuFrame, hInstance, NULL/*lpParam*/); - - if (!hFrameWnd) { - return FALSE; - } - - // Create the status bar - hStatusBar = CreateStatusWindow(WS_VISIBLE|WS_CHILD|WS_CLIPSIBLINGS|SBT_NOBORDERS, - _T(""), hFrameWnd, STATUS_WINDOW); - if (hStatusBar) { - // Create the status bar panes - SetupStatusBar(hFrameWnd, FALSE); - CheckMenuItem(GetSubMenu(hMenuFrame, ID_VIEW_MENU), ID_VIEW_STATUSBAR, MF_BYCOMMAND|MF_CHECKED); - } - ShowWindow(hFrameWnd, nCmdShow); - UpdateWindow(hFrameWnd); - return TRUE; + lstrcpy(Globals.szFileName, szFileName); + Globals.szFileTitle[0] = 0; + GetFileTitle(szFileName, Globals.szFileTitle, sizeof(Globals.szFileTitle)); } -//////////////////////////////////////////////////////////////////////////////// - -void ExitInstance(void) +/*********************************************************************** + * + * NOTEPAD_MenuCommand + * + * All handling of main menu events + */ +static int NOTEPAD_MenuCommand(WPARAM wParam) { - DestroyMenu(hMenuFrame); + switch (wParam) + { + case CMD_NEW: DIALOG_FileNew(); break; + case CMD_OPEN: DIALOG_FileOpen(); break; + case CMD_SAVE: DIALOG_FileSave(); break; + case CMD_SAVE_AS: DIALOG_FileSaveAs(); break; + case CMD_PRINT: DIALOG_FilePrint(); break; + case CMD_PAGE_SETUP: DIALOG_FilePageSetup(); break; + case CMD_PRINTER_SETUP: DIALOG_FilePrinterSetup();break; + case CMD_EXIT: DIALOG_FileExit(); break; + + case CMD_UNDO: DIALOG_EditUndo(); break; + case CMD_CUT: DIALOG_EditCut(); break; + case CMD_COPY: DIALOG_EditCopy(); break; + case CMD_PASTE: DIALOG_EditPaste(); break; + case CMD_DELETE: DIALOG_EditDelete(); break; + case CMD_SELECT_ALL: DIALOG_EditSelectAll(); break; + case CMD_TIME_DATE: DIALOG_EditTimeDate();break; + + case CMD_SEARCH: DIALOG_Search(); break; + case CMD_SEARCH_NEXT: DIALOG_SearchNext(); break; + + case CMD_WRAP: DIALOG_EditWrap(); break; + case CMD_FONT: DIALOG_SelectFont(); break; + + case CMD_HELP_CONTENTS: DIALOG_HelpContents(); break; + case CMD_HELP_SEARCH: DIALOG_HelpSearch(); break; + case CMD_HELP_ON_HELP: DIALOG_HelpHelp(); break; + case CMD_LICENSE: DIALOG_HelpLicense(); break; + case CMD_NO_WARRANTY: DIALOG_HelpNoWarranty(); break; + case CMD_ABOUT_WINE: DIALOG_HelpAboutWine(); break; + + default: + break; + } + return 0; } -int APIENTRY WinMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpCmdLine, - int nCmdShow) +/*********************************************************************** + * Data Initialization + */ +static VOID NOTEPAD_InitData(VOID) { - MSG msg; - HACCEL hAccel; + LPWSTR p = Globals.szFilter; + static const WCHAR txt_files[] = { '*','.','t','x','t',0 }; + static const WCHAR all_files[] = { '*','.','*',0 }; - // Initialize global strings - LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); - LoadString(hInstance, IDC_NOTEPAD_FRAME, szFrameClass, MAX_LOADSTRING); - LoadString(hInstance, IDC_NOTEPAD, szChildClass, MAX_LOADSTRING); + LoadString(Globals.hInstance, STRING_TEXT_FILES_TXT, p, MAX_STRING_LEN); + p += lstrlen(p) + 1; + lstrcpy(p, txt_files); + p += lstrlen(p) + 1; + LoadString(Globals.hInstance, STRING_ALL_FILES, p, MAX_STRING_LEN); + p += lstrlen(p) + 1; + lstrcpy(p, all_files); + p += lstrlen(p) + 1; + *p = '\0'; +} + +/*********************************************************************** + * + * NOTEPAD_WndProc + */ +static LRESULT WINAPI NOTEPAD_WndProc(HWND hWnd, UINT msg, WPARAM wParam, + LPARAM lParam) +{ + switch (msg) { + + case WM_CREATE: + { + static const WCHAR editW[] = { 'e','d','i','t',0 }; + RECT rc; + GetClientRect(hWnd, &rc); + Globals.hEdit = CreateWindow(editW, NULL, + WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | + ES_AUTOVSCROLL | ES_MULTILINE, + 0, 0, rc.right, rc.bottom, hWnd, + NULL, Globals.hInstance, NULL); + break; + } + + case WM_COMMAND: + NOTEPAD_MenuCommand(LOWORD(wParam)); + break; + + case WM_DESTROYCLIPBOARD: + /*MessageBox(Globals.hMainWnd, "Empty clipboard", "Debug", MB_ICONEXCLAMATION);*/ + break; + + case WM_CLOSE: + if (DoCloseFile()) { + DestroyWindow(hWnd); + } + break; + + case WM_DESTROY: + PostQuitMessage(0); + break; + + case WM_SIZE: + SetWindowPos(Globals.hEdit, NULL, 0, 0, LOWORD(lParam), HIWORD(lParam), + SWP_NOOWNERZORDER | SWP_NOZORDER); + break; + + case WM_SETFOCUS: + SetFocus(Globals.hEdit); + break; + + case WM_DROPFILES: + { + WCHAR szFileName[MAX_PATH]; + HANDLE hDrop = (HANDLE) wParam; + + DragQueryFile(hDrop, 0, szFileName, SIZEOF(szFileName)); + DragFinish(hDrop); + DoOpenFile(szFileName); + break; + } + + default: + return DefWindowProc(hWnd, msg, wParam, lParam); + } + return 0; +} + +static int AlertFileDoesNotExist(LPCWSTR szFileName) +{ + int nResult; + WCHAR szMessage[MAX_STRING_LEN]; + WCHAR szResource[MAX_STRING_LEN]; + + LoadString(Globals.hInstance, STRING_DOESNOTEXIST, szResource, SIZEOF(szResource)); + wsprintf(szMessage, szResource, szFileName); + + LoadString(Globals.hInstance, STRING_ERROR, szResource, SIZEOF(szResource)); + + nResult = MessageBox(Globals.hMainWnd, szMessage, szResource, + MB_ICONEXCLAMATION | MB_YESNO); + + return(nResult); +} + +static void HandleCommandLine(LPWSTR cmdline) +{ + WCHAR delimiter; - // Store instance handle in our global variable - hInst = hInstance; + /* skip white space */ + while (*cmdline && *cmdline == ' ') cmdline++; - // Perform application initialization: - if (!InitInstance(hInstance, nCmdShow)) { - return FALSE; + /* skip executable name */ + delimiter = ' '; + if (*cmdline == '"') + delimiter = '"'; + + do + { + cmdline++; } - hAccel = LoadAccelerators(hInstance, (LPCTSTR)IDC_NOTEPAD); + while (*cmdline && *cmdline != delimiter); + if (*cmdline == delimiter) cmdline++; - // Main message loop: - while (GetMessage(&msg, (HWND)NULL, 0, 0)) { - if (!TranslateAccelerator(msg.hwnd, hAccel, &msg)) { - TranslateMessage(&msg); - DispatchMessage(&msg); + while (*cmdline && (*cmdline == ' ' || *cmdline == '-')) + { + WCHAR option; + + if (*cmdline++ == ' ') continue; + + option = *cmdline; + if (option) cmdline++; + while (*cmdline && *cmdline == ' ') cmdline++; + + switch(option) + { + case 'p': + case 'P': printf("Print file: "); + /* TODO - not yet able to print a file */ + break; } } - ExitInstance(); + + if (*cmdline) + { + /* file name is passed in the command line */ + LPCWSTR file_name; + BOOL file_exists; + WCHAR buf[MAX_PATH]; + + if (cmdline[0] == '"') + { + cmdline++; + cmdline[lstrlen(cmdline) - 1] = 0; + } + + if (FileExists(cmdline)) + { + file_exists = TRUE; + file_name = cmdline; + } + else + { + static const WCHAR txtW[] = { '.','t','x','t',0 }; + + /* try to find file with ".txt" extension */ + if (!lstrcmp(txtW, cmdline + lstrlen(cmdline) - lstrlen(txtW))) + { + file_exists = FALSE; + file_name = cmdline; + } + else + { + lstrcpyn(buf, cmdline, MAX_PATH - lstrlen(txtW) - 1); + lstrcat(buf, txtW); + file_name = buf; + file_exists = FileExists(buf); + } + } + + if (file_exists) + { + DoOpenFile(file_name); + InvalidateRect(Globals.hMainWnd, NULL, FALSE); + } + else + { + switch (AlertFileDoesNotExist(file_name)) { + case IDYES: + DoOpenFile(file_name); + break; + + case IDNO: + break; + } + } + } +} + +/*********************************************************************** + * + * WinMain + */ +int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE prev, LPSTR cmdline, int show) +{ + MSG msg; + HACCEL hAccel; + WNDCLASSEX class; + static const WCHAR className[] = {'N','P','C','l','a','s','s',0}; + static const WCHAR winName[] = {'N','o','t','e','p','a','d',0}; + + aFINDMSGSTRING = RegisterWindowMessage(FINDMSGSTRING); + + ZeroMemory(&Globals, sizeof(Globals)); + Globals.hInstance = hInstance; + + ZeroMemory(&class, sizeof(class)); + class.cbSize = sizeof(class); + class.lpfnWndProc = NOTEPAD_WndProc; + class.hInstance = Globals.hInstance; + class.hIcon = LoadIcon(0, IDI_APPLICATION); + class.hCursor = LoadCursor(0, IDC_ARROW); + class.hbrBackground = (HBRUSH)(COLOR_WINDOW); + class.lpszMenuName = MAKEINTRESOURCE(MAIN_MENU); + class.lpszClassName = className; + + if (!RegisterClassEx(&class)) return FALSE; + + /* Setup windows */ + + Globals.hMainWnd = + CreateWindow(className, winName, WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, + NULL, NULL, Globals.hInstance, NULL); + if (!Globals.hMainWnd) + { + ShowLastError(); + ExitProcess(1); + } + + NOTEPAD_InitData(); + DIALOG_FileNew(); + + ShowWindow(Globals.hMainWnd, show); + UpdateWindow(Globals.hMainWnd); + DragAcceptFiles(Globals.hMainWnd, TRUE); + + HandleCommandLine(GetCommandLine()); + + hAccel = LoadAccelerators( hInstance, MAKEINTRESOURCE(ID_ACCEL) ); + + while (GetMessage(&msg, 0, 0, 0)) + { + if (!TranslateAccelerator(Globals.hMainWnd, hAccel, &msg) && !IsDialogMessage(Globals.hFindReplaceDlg, &msg)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } return msg.wParam; } diff --git a/rosapps/notepad/main.h b/rosapps/notepad/main.h index 41cd8addc12..06517d0966d 100644 --- a/rosapps/notepad/main.h +++ b/rosapps/notepad/main.h @@ -1,9 +1,8 @@ /* - * ReactOS notepad + * Notepad (notepad.h) * - * main.h - * - * Copyright (C) 2002 Robert Dickenson <robd@reactos.org> + * Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch> + * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -20,38 +19,35 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#ifndef __MAIN_H__ -#define __MAIN_H__ +#define SIZEOF(a) sizeof(a)/sizeof((a)[0]) -#ifdef __cplusplus -extern "C" { -#endif +#include "notepad_res.h" +#define MAX_STRING_LEN 255 -#include "resource.h" +typedef struct +{ + HANDLE hInstance; + HWND hMainWnd; + HWND hFindReplaceDlg; + HWND hEdit; + HFONT hFont; /* Font used by the edit control */ + LOGFONT lfFont; + BOOL bWrapLongLines; + WCHAR szFindText[MAX_PATH]; + WCHAR szFileName[MAX_PATH]; + WCHAR szFileTitle[MAX_PATH]; + WCHAR szFilter[2 * MAX_STRING_LEN + 100]; + WCHAR szMarginTop[MAX_PATH]; + WCHAR szMarginBottom[MAX_PATH]; + WCHAR szMarginLeft[MAX_PATH]; + WCHAR szMarginRight[MAX_PATH]; + WCHAR szHeader[MAX_PATH]; + WCHAR szFooter[MAX_PATH]; + FINDREPLACE find; +} NOTEPAD_GLOBALS; -#define STATUS_WINDOW 2001 -#define MAX_LOADSTRING 100 +extern NOTEPAD_GLOBALS Globals; - -//////////////////////////////////////////////////////////////////////////////// -// Global Variables: -// - -extern HINSTANCE hInst; -extern HWND hFrameWnd; -extern HMENU hMenuFrame; -extern HWND hStatusBar; -extern HFONT hFont; - -extern TCHAR szTitle[]; -extern TCHAR szFrameClass[]; -extern TCHAR szChildClass[]; - - -#ifdef __cplusplus -}; -#endif - -#endif // __MAIN_H__ +VOID SetFileName(LPCWSTR szFileName); diff --git a/rosapps/notepad/makefile b/rosapps/notepad/makefile index ef75fcf72fc..66e65f105b7 100644 --- a/rosapps/notepad/makefile +++ b/rosapps/notepad/makefile @@ -1,37 +1,24 @@ -# -# ReactOS notepad -# -# Makefile -# +# $Id: makefile,v 1.4 2004/03/17 01:28:13 sedwards Exp $ PATH_TO_TOP = ../../reactos +TARGET_NORC = no + TARGET_TYPE = program -TARGET_APPTYPE = console +TARGET_APPTYPE = windows TARGET_NAME = notepad -TARGET_CFLAGS = -D_WIN32_IE=0x0400 # -DUNICODE -D_UNICODE +TARGET_CFLAGS = -Wall -Werror -D__USE_W32API -TARGET_RCFLAGS = -D_WIN32_IE=0x0400 - -WINE_MODE = yes - -WINE_RC = $(TARGET_NAME) - -WINE_INCLUDE = ./ - -TARGET_SDKLIBS = \ - kernel32.a \ - user32.a \ - gdi32.a \ - comctl32.a \ - comdlg32.a +TARGET_SDKLIBS = comdlg32.a shell32.a user32.a gdi32.a TARGET_OBJECTS = \ - framewnd.o \ - main.o + License_En.o \ + dialog.o \ + license.o \ + main.o include $(PATH_TO_TOP)/rules.mak diff --git a/rosapps/notepad/notepad.ico b/rosapps/notepad/notepad.ico new file mode 100644 index 0000000000000000000000000000000000000000..b7481b412cf6f25e447fbf80fda2d91fc143fab8 GIT binary patch literal 22534 zcmeHP3s_Xu+I|5MZ=mK4yakFNs0bNqR%!|+W)0p_6udy1m=|sdY6_`&N%M;LyHVb_ zg9DPyc<MZz%1X1+Q0aJ5vOmD+{D0?E|H*aUwTC?p!)?T)!E^YWcfPgu`qtX-`u1jK z?>*}kutF0!JGX+g@2!DV^sQPM>OHN1`8I&Jx6+KG4#4(CV0>A<2{5>gj5pM0+XCNp zGKud2Jm+E(-vao@2$Oh@wSOGYlilTzLkTNzW3`q5@P&i~gX24kL;}v7Il~5_ydZ=u z5&S1N@$I;ovALYZmbZwwHRUWKE}o+p?U#mnyfGOpFdyae7gsTVeyR<Xd5?%wt9~OB z)-*||rmh557_Z#!Vq+uB4sV5Oxr6-&ROERs|5Tib2XUTrH;R?zDI(5rxbEH?22hSq zX=$l?oYdnHp&kb{;p%>C>t&wgN6vIYem+%Yk#p8zNz_)Q`K__;cyo+94hOnp%gF9H zGR~Fgfw#uG;jM9QNTN?-OzQ06NS^3|6VG?UapLHN?u0A0ga;yHau=d2QiC2w+9YSB z5V=#Ga5AJL(Fs{oIwLE%3r^2ykG$!QI7Q@6bHblrY(=!jnHSnZ7uF7+&TWRXFWKY6 zaC>|d?tl+wx5NkGEs-?S10Sys#HmmaR>&ptW32IYv^6rPS>wbMYaAy|h1uX@lr8cX zHpZ6`jd3#67GFf#;lhF@_&lNsF2^;)x%o|TdUjJ>jCH_!3)<j=7)N}#s2k2Mb;n=V z^~Q(G`{9Q@{<yedC`yth;Fr^{;8)$NxEKvwhy>o9MGj#g2ZBC7hFo5@!bSQoqpa}W z94nljX~h`wBvL}G$c+e=an|HU-jX}Z7wJ#Wv}O$F5G>nlxSgQCNPj-k1|Rc_<l_Z4 z>@V9JAwRYeV+fWn(dWn7;?hD}d>z}EWjlPe&<>Yko8VGhQ{;2Lmlrk1<;BgBzqkdy zCN3{=z~_tF;FH+)C|KSRe~xj&doi6*w8<SmZ0d=kExl2+wKs~l_Mw;XLdiC76ekkW zZ<p{v@s57DvR?ZBDA_pxCA$Zrcqg%IAj^YLviC`1FpBAK?PD(Y4Z*Gb!*J_>A4(4R z<Hy4RxOIr2zkYBWemFK2-(39*ZvX2hO8A{qO8g)33-K%Q8}a|dzlh(7+r)^7>j;ZH zseDI8M@J(fA_C#z;g~UF2BuG+j%m}TAtWROQ>IKoP*4yiO`25IpTvLFc71)fle)Vw zt-g_k*4S1C>h$)_o7*&(W=X#mI(^e4Cr+G5CQckZb}YF%JAUFwGo8MP43}2ss_T(# zr_(=FZGc&0Yn{GTN^)`v|5;)uTI%!;DJhl(%K;sA`u3@ePf1CYt|m+ApwqWYO-)Uf zu)tE<>hxVKjFrQscGl@TrlqD?Ftieq+DWH(N>59-INn94cTP{YI6nPhoxW>&dWNOr zr+00LuP#?IKRq%m&VPDF51rmMJKNIyXJokQ^xd+vvy+qgs?iwO{r<;$N;(!9`SjB1 zdn)`b>A*mb(|UIc;tdI5pnIO)O~zN=$DC<)wp*@#NaeAW5zNjWlB<8h(s;&YKbfn4 zOnOW0@m&3Yx9`H9I;HR5Z_1+~zVqgV_y&i}3z;|1H<&P3aB#4%#Jpf%df%BZ3|jGy zK1?$ysBfUxWN$BTuQ6l2z57lM4D>cwU+=)c$z#2S1q|)$=kMJcZB`C{S3mKk=O6JI zKW@gtsRNh9zY@Q6aO8poFB;5e`m|ZIqvwx&X8Dp)qa&;`vz~r6M?W_q>8*nY4!?O| z=l(-mH*ep!chBzKy9~Bt&BpbwuUqxn>J4k(*p#@f&xkE^_~rgw?6O5M&nh+{G&D+D zT$x2hg-<ZF@O{F|i(~5hwLmTS8*b;6XB#Y5^a=86(5mc`u)!M=QB@vn_zX!#*j3D9 zRe3J|+^XvP)MZhtm3;?|)!^{6-EfFFNF-@o@%Ff$NE+vXxRKsiHo6~TpY}#9%TfMb zhzsz++Mr<w9v_HF?0e{$E;!5wYDt=I^c+WmW5fk`BZBdh$7zr?dl0hcK84IVL-Ao^ zH2$(<F%Av`c<X|b;REo=_DFoZEeb)54V@N(!+aih&>uK3obV%9-p}$o^L>#sw?FpI z8jR0&%*RJNqA_K>2FFGNZwC;gfF$}4qWj?eC@=ge!W+5;KDe}Z4$iEbhOhR#gbTap z;{2|8n9P28LEO(Xz}f%@oQ?IwM+<x7%Kq8N-xrQ^;XoGKkMmjJg(a>yzt|0*#_>M( z@JtjOnuQDVfX`nd<`S|zpI88#r$0A`;I^}}J<=9mF71p<@viu0l_v_;dgA+S15nC) zwtpP<!&mDbN8yg4C_Xd>r6)ph^H><ZeKQo-h;tlI$9v)nk=D2nWy5<;TNK7O#`i0l z<N9)Y-f!CT-jksJYOw>(zif{y32ksSp)JuKS6`LrfUC=i6^`^yC|J=E1uHw^Dp9bq z6AE7IjFJs5C|LC{N;bLDyWqzyZYbI8j?zR=q8EPL)(2O}`_}fpxV57%{=TapN_Y0d z&-;B*y1PGa?e@h_dpIWr15vv7anA2a{B&RlzI=oCuScH8x2X|0nzSENL#E*Rh2tpr zJR4u1(-P93#KljukpFoOE?+o>%U_&AK7IZdxdiK9z03R8_i^>FpW&bUP^s#k)oaf0 z%KfT*?iv#lqui$|CwaqLg$(4~f6J-P^72|b$lJgcX69(`)U;_cx179(>>9VBwYP0# zV`}YeZ96n++bSoovsSV6)C@!6&U=>Dr*%$V7p+!a#&EOw)r?mAFxxw6Gc$SZTZv_A zyISYub<<|0r)5+Yk)d^EyO%aQqw*0lwB38;<n_^Jr=_J;GJJZ5)|>5vwAxBrd4HoF z!uH3iX&=n?fz`A>$@T$Cd!-Dtk9W+;^Ve!QzshEiseO8APM#n8v$bLZ(zMzUY=5?j z`K7U4!}ihaZ?bnoF(WG@o9)j%l9Trg_kU*!Y1&LB8yRW*r=89AV76CkSz7IjY!A6} zz$=tyv3*L)iK9o49C`Z)?db8Nyh=TK>`>BMZyr8)AbI!xoV<X3?jF57dwF<xczSsB z^ziJ}t5@&-qg;F+bsj$KsZ%+5bAkfLjDLRoxR>V6ojiX0q_N{CgpUlHIq`)VeNQ4h zHz)7q^?P>in4Y+4*M>K?Z`-<M-RiY#R=mFHwT+vnJrO!@AOE^yrmjj@x_Hqmi{h5W zzq)eyl2;ZjjEahlj*M6^fA9VO<Ev>8hU*8z`!#+#oFNkK53D%0jp_bmSzf2y`Q4%F z>lB9Jm5F2V+t2@t4P*LYt;Pp=389D%9D?;@9>F>yG3YV8HuY&-%G`rB)BSPf)SGxC z%pb3Z`lH~~0sQ*&-;uRo0JhB<iY+htVdG3cTtB@R*WTHOlK1zbP`4YWL!0Atm_!S_ z`+_~aJ-q|b3Li&1<HNX~_-yrH>{&b+H}yO53&%YDq64mFuS9BM9B!<4#djOs@IRY8 zadTrYe7Bj{*c&%D^}%-%Tl(VW7H?eN{3r?&`{UZ~02E$5kDFIM!VUU=a=hZp@8bI9 zPf%EJp4-l`d=`b*F5w32x5e*#HhY`TXm3~gyp}0NVqzjzu3U-u_;@T^whT*`E|uwP zu!aoO+YAJn+cVETXEe=djcrpqyC!x9Yh=?{)7-kX+o0A4vu@o?V?S!-$fwI}WI!`b zt5N<&8!^0vrbD@UOHF&zx}Sr_X_Ws6V~1hwG(GOLj~Fqmt;TWGr~sPbZB!dg&!K~# z95CRi0RtWz^2ET$T{Z5`UAuI7xNFBwox8a_WaXjh@7vGYtM4N|y*&H$ezg0e=Ci9% z7ebqvfb?`!L?&RJ18B2=jEr*aR_W<Nq-O|Wog+VI@BD7*TyM{V2IBQ11CC@_A0d+~ zd9Npq)H7_9+_}y`)Maq}gWx)d3LMLF?Ra>MTLITY2nnv6P`p}KeO;R$*KY6$r*ghH za!rTe@9ToUsT;xP6vnc;oxi^e{{F5&wm)d_cYlSG<jOTDM*duvQjTk7ywo{V*7iqi z<9Zq+f3BB#;JLilIdh$lkw4e{2(H60&Ot4!{$BU>pYAWu1+G^z^5^;`g}>xmS2>&K zfNQCY{JFkLa1D%c4l-7qi`;JBW<J(~u1juQ4`$@gHDU@!m8;~VmZg8t{A${t<j=Kj zM*dvGR;T%z&qwBzYwwKwxgJk&{gg5X>CNNoT3zzz`avUqt|=5;`=!i5`ntx~oR8$s zb&f{<T=%H(m)z?Ef60;SHI4kae$&XG>+kA({w06OS-t*g;QwHcSwsFGY`)Due;V>% zxAM<5?m~WU%Htwoe!S{ZUGkG$C1>^Xlk4=k#b9;)^I!6lkepTi)EktsH#jxlvZj{n zf;S~eeMAHQ2Yh_0$iEZyD8{C`aGq4f!AOz?>SqMkCLH76Ko{z2Oq=S|Id3`_Q<BsH z2`;}#CVv-dgG`(LaQ>2v%G<oG5|y0WwQHA3{@ti=Qa3AJ_BAzitp9{p$F1#HYJbVO zLx&Cue`=@H&5Ez>*bkzgN>p-I`BMj`ZmzTZ%MoOSx-}zzYTC@3>wKO1JC(l+wRwUX zuX+XQ1m)jviv0YfzEDtaD5&WZ)Eo+G`UG`{^eW2gQ|M)zvR(Czk+Di!S-etLx0`!8 zmWr}|rgb^CQdj%kiKUj19IXZQkAnI>`T2RA{GF&Z6x1&Y>JtU^iGo^6deB2qt0<_e zG?a~AZYNkbw9(6cvX9AjwcXUqv6Vh*tQ=pKxi9K21@)DJI!uKF^_PPBOC_FKPeFaE zpsrL<mnf*ul;2-R$={LMN<lrOpw3cI`zfda71UnRv;H#6v39J}FKjHRdlb|<3Tht} zPyM5y{!>sl$v6Y3wPe4_A;+dplVeFRhM?Ax<wk<~P(fX&png)>4|Sq~8c~kbNKjWR zs7n;oB?@Xu1$CD4`fa=9PaUVA_EJ#qD5!T7)IkdBAq91if;vd0OzotgPEt@GDX6U^ z`U&bP1@)7HI!Zx3rJ$~|46<A~sKXT0aSG}+1@)UO_aVFlHJ*Z6PeGlhpq^7u=P9V| zWSoznj#E&_DX6s-)WQntI|VhUl0R21!>%9}KGeVpYD@*Sq=Fh#LG7uaHnwu`xKQJ& zfLc{i0kKU4wW?L4tPi!Y9D`$3wI9>%@?3~*EU0}|xMfbqM9H0Ku!amYWS|~rz;Lls zQD>4M=cMXW>hb*k5bDfZRe3evF4t)}6GI6rWhn{^Er<rI%NgK*?{kk<{p{{>aCWbL zeA9azN^AI%Kdjx2)i^$%6dGQ}QH@(_EU-)U<MXFhzW8Hu?OrvG&quW!nK|LB7Q3i% zd}e?n*LoH;j!!96txY~ks44#pV3^@mResoNY%*lhaNI2!zZT><tYI&fjIT`bp5CfI zKWo9?*u_Ar`tc3<H>US)3+!Iw_#D%aPs96N?ZT4rd6;T<{#$Z<jmfM<!IJR}`DY|w zRb|Gssp0&${6H|bv>MM(Ls+ffs~`V<w{m*-_^O`aJq}(&_N(7_L+gFWfa!T&3bcF> zFx{uTPiaLs6IRMQ3ssv8eTZm%7m)GI2-%kkdPSD_D!nCG&bTFn=77d6cg=|Ig)4@; z6iX~G^J?AP$3Nv<yvpD8*4UnH&ar>Q#q?djQFAD$9Te313F`BdvaDAIH8#q>SAp!G ze{%m%GH>d71b)RSYwN1=>Y9K^KaVT2|CN)wl>YoukzXt|f?q7$*KH9q!d>bAP0o&5 z^^YBC=>NCe?RVXu+C;H9z)jizjl4u-f62{~IZ)#$mX7YB^#AUiEyn&e^_AmG$o>h> z8TuEWG4SVRdHYcgRc({oS3K)t$Y1)>pQybQ)L{zhF$J}n3aG`rQ|2~mG>K0Hb)16w zP4Rlz;LGy(<%QY(LhY!aj#N-jS_TKDPOT}uL<>P(si3}8P@gKOa}~Q6PyCeq$6j1y zf9A#p&z}m{b}cGg-Kprt8mFQgt2!3lSlgxOhOEEVw&>gCt&0j*IThVp?O61;HLk^H c<9&YA&ubpR{!NKL)DkdAe)rrp<S~%;Z_f<Dvj6}9 literal 0 HcmV?d00001 diff --git a/rosapps/notepad/notepad.rc b/rosapps/notepad/notepad.rc index 893ba4e7637..05ec07e336e 100644 --- a/rosapps/notepad/notepad.rc +++ b/rosapps/notepad/notepad.rc @@ -1,259 +1,3 @@ -#include <windows.h> -#include <reactos/resource.h> -#include "resource.h" - - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_NOTEPAD ICON DISCARDABLE "res/notepad.ico" -IDI_SMALL ICON DISCARDABLE "res/small.ico" - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDC_NOTEPAD MENU DISCARDABLE -BEGIN - POPUP "&File" - BEGIN - MENUITEM "E&xit", ID_FILE_EXIT - END - POPUP "&Help" - BEGIN - MENUITEM "&About ...", ID_HELP_ABOUT - END -END - -IDR_NOTEPAD_MENU MENU DISCARDABLE -BEGIN - POPUP "&File" - BEGIN - MENUITEM "&New\tCtrl+N", ID_FILE_NEW - MENUITEM "&Open...\tCtrl+O", ID_FILE_OPEN - MENUITEM "&Save\tCtrl+S", ID_FILE_SAVE - MENUITEM "Save &As...", ID_FILE_SAVEAS - MENUITEM SEPARATOR - MENUITEM "Page Set&up", ID_FILE_PAGESETUP, GRAYED - MENUITEM "&Print\tCtrl+P", ID_FILE_PRINT, GRAYED - MENUITEM SEPARATOR - MENUITEM "E&xit", ID_FILE_EXIT - END - POPUP "&Edit" - BEGIN - MENUITEM "&Undo", ID_EDIT_UNDO, GRAYED - MENUITEM SEPARATOR - MENUITEM "Cu&t\tCtrl+X", ID_EDIT_CUT - MENUITEM "&Copy\tCtrl+C", ID_EDIT_COPY - MENUITEM "&Paste\tCtrl+V", ID_EDIT_PASTE - MENUITEM "De&lete\tDel", ID_EDIT_DELETE - MENUITEM SEPARATOR - MENUITEM "&Find...\tCtrl+F", ID_EDIT_FIND, GRAYED - MENUITEM "Find Ne&xt\tF3", ID_EDIT_FINDNEXT, GRAYED - MENUITEM "&Replace...\tCtrl+H", ID_EDIT_REPLACE, GRAYED - MENUITEM "&Go To...\tCtrl+G", ID_EDIT_GOTO, GRAYED - MENUITEM SEPARATOR - MENUITEM "Select &All..\tCtrl+A", ID_EDIT_SELECTALL - MENUITEM "Time/&Date...\tF5", ID_EDIT_TIMEDATE - END - POPUP "&View" - BEGIN - MENUITEM "&Status Bar", ID_VIEW_STATUSBAR, GRAYED - MENUITEM "&Tool Bar", ID_VIEW_TOOLBAR, GRAYED - MENUITEM SEPARATOR - MENUITEM "&Refresh\tF5", ID_VIEW_REFRESH, GRAYED - END - POPUP "F&ormat" - BEGIN - MENUITEM "&Word Wrap", ID_FORMAT_WORDWRAP, GRAYED - MENUITEM "&Font...", ID_FORMAT_FONT - END - POPUP "&Help" - BEGIN - MENUITEM "&Help Topics", ID_HELP_HELPTOPICS - MENUITEM SEPARATOR - MENUITEM "&About Notepad", ID_HELP_ABOUT - END -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_ABOUTBOX DIALOG DISCARDABLE 22, 17, 230, 75 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -CAPTION "About" -FONT 8, "System" -BEGIN - ICON IDI_NOTEPAD,IDI_NOTEPAD,14,9,16,16 - LTEXT "ReactOS Notepad Version 1.0",IDC_STATIC,49,10,119,8, - SS_NOPREFIX - LTEXT "Copyright (C) 2002 ReactOS Team",IDC_STATIC,49,20,119,8 - DEFPUSHBUTTON "OK",IDOK,195,6,30,11,WS_GROUP -END - -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 "Cancel",IDCANCEL,130,24,50,14 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -(1) VERSIONINFO - FILEVERSION 0,0,21,3 - PRODUCTVERSION 0,0,21,0 - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x40004L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "Comments", "Absolutely no warranties whatsoever - Use at your own risk\0" - VALUE "CompanyName", "ReactOS Development Team\0" - VALUE "FileDescription", "ReactOS Notepad by Robert Dickenson\0" - VALUE "FileVersion", "1, 0, 0, 1\0" - VALUE "InternalName", "notepad\0" - VALUE "LegalCopyright", "Copyright 2002 Robert Dickenson\0" - VALUE "LegalTrademarks", "\0" - VALUE "OriginalFilename", "notepad.exe\0" - VALUE "PrivateBuild", "\0" - VALUE "ProductName", "ReactOS Operating System\0" - VALUE "ProductVersion", "0.0.21\0" - VALUE "SpecialBuild", "Non-versioned Development Beta Release\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0xc09, 1200 - END -END - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_APP_TITLE "ReactOS Notepad" - IDC_NOTEPAD "NOTEPAD" - IDC_NOTEPAD_FRAME "NOTEPAD_FRAME" -END - -STRINGTABLE DISCARDABLE -BEGIN - ID_FILE_MENU "Contains commands for loading and saving files" - ID_EDIT_MENU "Contains commands for editing the current text" - ID_VIEW_MENU "Contains commands for manipulating notepad's options" - ID_FORMAT_MENU "Contains commands for customising the look of the text" - ID_HELP_MENU "Contains commands for displaying help and information about notepad" -END - -STRINGTABLE DISCARDABLE -BEGIN - ID_FILE_NEW "Creates and empty un-named text buffer" - ID_FILE_OPEN "Opens a text file into notepads buffer" - ID_FILE_SAVE "Saves the current text buffer to file" - ID_FILE_SAVEAS "Saves the current text buffer to a new file" - ID_FILE_PAGESETUP "Modify the setup options for printing the text" - ID_FILE_PRINT "Prints all or part of the current text buffer" - ID_HELP_HELPTOPICS "Opens notepad help" - ID_HELP_ABOUT "Displays program information, version number and copyright" - ID_FILE_EXIT "Quits this notepad text editor" -END - -STRINGTABLE DISCARDABLE -BEGIN - ID_EDIT_UNDO "Undo the last buffer editing operation performed" - ID_EDIT_CUT "Removes the selected text and places it on the clipboard" - ID_EDIT_COPY "Copies the selected text to the clipboard" - ID_EDIT_PASTE "Pastes the contents of the clipboard at the cursor location" - ID_EDIT_DELETE "Deletes the selected text" - ID_EDIT_FIND "Finds a text string in the buffer" - ID_EDIT_FINDNEXT "Finds next occurrence of text specified in previous search" - ID_EDIT_GOTO "Jump to specified line number in buffer" - ID_EDIT_SELECTALL "Selects the entire text buffer" - ID_EDIT_TIMEDATE "Inserts the current date and time at the cursor location" - ID_VIEW_STATUSBAR "Shows or hides the status bar" - ID_VIEW_TOOLBAR "Shows or hides the tool bar" - ID_VIEW_SPLIT "Change position of split between two panes" - ID_VIEW_REFRESH "Refreshes the text buffer from it's file" - ID_FORMAT_WORDWRAP "Toggles word-wrap display mode" - ID_FORMAT_FONT "Select font for displaying and printing buffer text" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////// -// English (Australia) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENA) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_AUS -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - ID_HELP_HELPTOPICS "Opens Registry Editor Help." - ID_HELP_ABOUT "Displays program information, version number, and copyright." -END - -#endif // English (Australia) resources -///////////////////////////////////////////////////////////////////////////// +// Compatiblity Include +#include "rsrc.rc" diff --git a/rosapps/notepad/notepad_res.h b/rosapps/notepad/notepad_res.h new file mode 100644 index 00000000000..e9ad744f00c --- /dev/null +++ b/rosapps/notepad/notepad_res.h @@ -0,0 +1,78 @@ +/* + * Constants, used in resources. + * + * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> + * Copyright 2002 Andriy Palamarchuk + * + * 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 MAIN_MENU 0x201 +#define DIALOG_PAGESETUP 0x202 +#define ID_ACCEL 0x203 + +/* Commands */ +#define CMD_NEW 0x100 +#define CMD_OPEN 0x101 +#define CMD_SAVE 0x102 +#define CMD_SAVE_AS 0x103 +#define CMD_PRINT 0x104 +#define CMD_PAGE_SETUP 0x105 +#define CMD_PRINTER_SETUP 0x106 +#define CMD_EXIT 0x108 + +#define CMD_UNDO 0x110 +#define CMD_CUT 0x111 +#define CMD_COPY 0x112 +#define CMD_PASTE 0x113 +#define CMD_DELETE 0x114 +#define CMD_SELECT_ALL 0x116 +#define CMD_TIME_DATE 0x117 + +#define CMD_SEARCH 0x120 +#define CMD_SEARCH_NEXT 0x121 + +#define CMD_WRAP 0x119 +#define CMD_FONT 0x140 + +#define CMD_HELP_CONTENTS 0x130 +#define CMD_HELP_SEARCH 0x131 +#define CMD_HELP_ON_HELP 0x132 +#define CMD_LICENSE 0x135 +#define CMD_NO_WARRANTY 0x136 +#define CMD_ABOUT_WINE 0x137 + +/* Strings */ +#define STRING_PAGESETUP_HEADERVALUE 0x160 +#define STRING_PAGESETUP_FOOTERVALUE 0x161 +#define STRING_PAGESETUP_LEFTVALUE 0x162 +#define STRING_PAGESETUP_RIGHTVALUE 0x163 +#define STRING_PAGESETUP_TOPVALUE 0x164 +#define STRING_PAGESETUP_BOTTOMVALUE 0x165 + +#define STRING_NOTEPAD 0x170 +#define STRING_ERROR 0x171 +#define STRING_WARNING 0x172 +#define STRING_INFO 0x173 +#define STRING_UNTITLED 0x174 +#define STRING_ALL_FILES 0x175 +#define STRING_TEXT_FILES_TXT 0x176 +#define STRING_TOOLARGE 0x177 +#define STRING_NOTEXT 0x178 +#define STRING_DOESNOTEXIST 0x179 +#define STRING_NOTSAVED 0x17A + +#define STRING_NOTFOUND 0x17B +#define STRING_OUT_OF_MEMORY 0x17C diff --git a/rosapps/notepad/res/notepad.ico b/rosapps/notepad/res/notepad.ico deleted file mode 100644 index 386883523bcc032db77b69b047cbc5c15ae3b7fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmeH_K@!3s3`IZHwe$$AoF2oYaWszOk{jR)NR>_(PRDWOZ<G8GXgc9bPLo2IWw=k$ zl{n8WUz~I~NegQMyJ1deycF5Hk4TY9j4j}ySX4@hLaDDxF^2Kj5-$7VrCfZ@!g)^) z2c`N~o@EQ<I4EaY4)g1ItG~gv4xrrt_S<J^O>gV)&%Zp6VccBVa2?uQ&sh9LW;!?J w2dwKn!S@jnH5GJS10MR3&V{nkc?%F^XS#jrb=7ItXV>BJ*yg?&H~)SR4}%AClK=n! diff --git a/rosapps/notepad/res/small.ico b/rosapps/notepad/res/small.ico deleted file mode 100644 index 8f94d9aa8285725af1920f17fa4ba90a7dad97fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmbu1u@S&92m|H2^tei$GGj6tBe4N_?3C#ONWzj2Y0z^{b=^ZcTR}S)7&>4n7JrdT ujNG@ttiTl!1hqz0y#czdCNotgVrj}ml}kwpjQ><xKQTJ~h4;=r`=1~8qePSd diff --git a/rosapps/notepad/resource.h b/rosapps/notepad/resource.h deleted file mode 100644 index c8ad736f8be..00000000000 --- a/rosapps/notepad/resource.h +++ /dev/null @@ -1,59 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Developer Studio generated include file. -// Used by notepad.rc -// -#define ID_FILE_MENU 0 -#define ID_EDIT_MENU 1 -#define ID_FORMAT_MENU 2 -#define ID_HELP_MENU 3 -#define ID_VIEW_MENU 4 - -#define IDD_ABOUTBOX 103 -#define IDS_APP_TITLE 104 -#define IDI_NOTEPAD 107 -#define IDI_SMALL 108 -#define IDC_NOTEPAD 109 -#define IDC_NOTEPAD_FRAME 110 -#define IDR_NOTEPAD_MENU 130 -#define IDD_DIALOG1 131 -#define IDD_DIALOG2 135 - -#define ID_FILE_NEW 32773 -#define ID_FILE_OPEN 32774 -#define ID_FILE_SAVE 32775 -#define ID_FILE_SAVEAS 32776 -#define ID_FILE_PAGESETUP 32777 -#define ID_FILE_PRINT 32778 -#define ID_FILE_EXIT 32779 -#define ID_EDIT_UNDO 32780 -#define ID_EDIT_CUT 32781 -#define ID_EDIT_COPY 32782 -#define ID_EDIT_PASTE 32783 -#define ID_EDIT_DELETE 32784 -#define ID_EDIT_FIND 32785 -#define ID_EDIT_FINDNEXT 32786 -#define ID_EDIT_REPLACE 32787 -#define ID_EDIT_GOTO 32788 -#define ID_EDIT_SELECTALL 32789 -#define ID_EDIT_TIMEDATE 32790 -#define ID_VIEW_STATUSBAR 32791 -#define ID_VIEW_TOOLBAR 32792 -#define ID_VIEW_SPLIT 32793 -#define ID_VIEW_REFRESH 32794 -#define ID_FORMAT_WORDWRAP 32795 -#define ID_FORMAT_FONT 32796 -#define ID_HELP_HELPTOPICS 32797 -#define ID_HELP_ABOUT 32798 - -#define IDC_STATIC -1 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 133 -#define _APS_NEXT_COMMAND_VALUE 32836 -#define _APS_NEXT_CONTROL_VALUE 1000 -#define _APS_NEXT_SYMED_VALUE 110 -#endif -#endif diff --git a/rosapps/notepad/rsrc.rc b/rosapps/notepad/rsrc.rc new file mode 100644 index 00000000000..abb0b08b26b --- /dev/null +++ b/rosapps/notepad/rsrc.rc @@ -0,0 +1,58 @@ +/* + * Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch> + * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> + * + * 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 "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "main.h" +#include "winnls.h" +#include "commctrl.h" +#include "notepad_res.h" + +ID_ACCEL ACCELERATORS +{ + "^A", CMD_SELECT_ALL + "^C", CMD_COPY + "^F", CMD_SEARCH + "^O", CMD_OPEN + "^S", CMD_SAVE + "^V", CMD_PASTE + "^X", CMD_CUT + "^Z", CMD_UNDO + VK_F3, CMD_SEARCH_NEXT, VIRTKEY + VK_F5, CMD_TIME_DATE, VIRTKEY +} + +#include "Da.rc" +#include "De.rc" +#include "En.rc" +#include "Es.rc" +#include "Fi.rc" +#include "Fr.rc" +#include "Hu.rc" +#include "It.rc" +#include "Nl.rc" +#include "Pt.rc" +#include "Ru.rc" +#include "Si.rc" +#include "Sk.rc" +#include "Sw.rc" +#include "Th.rc" +#include "Wa.rc" +#include "Zh.rc" diff --git a/rosapps/notepad/small.ico b/rosapps/notepad/small.ico new file mode 100644 index 0000000000000000000000000000000000000000..b7481b412cf6f25e447fbf80fda2d91fc143fab8 GIT binary patch literal 22534 zcmeHP3s_Xu+I|5MZ=mK4yakFNs0bNqR%!|+W)0p_6udy1m=|sdY6_`&N%M;LyHVb_ zg9DPyc<MZz%1X1+Q0aJ5vOmD+{D0?E|H*aUwTC?p!)?T)!E^YWcfPgu`qtX-`u1jK z?>*}kutF0!JGX+g@2!DV^sQPM>OHN1`8I&Jx6+KG4#4(CV0>A<2{5>gj5pM0+XCNp zGKud2Jm+E(-vao@2$Oh@wSOGYlilTzLkTNzW3`q5@P&i~gX24kL;}v7Il~5_ydZ=u z5&S1N@$I;ovALYZmbZwwHRUWKE}o+p?U#mnyfGOpFdyae7gsTVeyR<Xd5?%wt9~OB z)-*||rmh557_Z#!Vq+uB4sV5Oxr6-&ROERs|5Tib2XUTrH;R?zDI(5rxbEH?22hSq zX=$l?oYdnHp&kb{;p%>C>t&wgN6vIYem+%Yk#p8zNz_)Q`K__;cyo+94hOnp%gF9H zGR~Fgfw#uG;jM9QNTN?-OzQ06NS^3|6VG?UapLHN?u0A0ga;yHau=d2QiC2w+9YSB z5V=#Ga5AJL(Fs{oIwLE%3r^2ykG$!QI7Q@6bHblrY(=!jnHSnZ7uF7+&TWRXFWKY6 zaC>|d?tl+wx5NkGEs-?S10Sys#HmmaR>&ptW32IYv^6rPS>wbMYaAy|h1uX@lr8cX zHpZ6`jd3#67GFf#;lhF@_&lNsF2^;)x%o|TdUjJ>jCH_!3)<j=7)N}#s2k2Mb;n=V z^~Q(G`{9Q@{<yedC`yth;Fr^{;8)$NxEKvwhy>o9MGj#g2ZBC7hFo5@!bSQoqpa}W z94nljX~h`wBvL}G$c+e=an|HU-jX}Z7wJ#Wv}O$F5G>nlxSgQCNPj-k1|Rc_<l_Z4 z>@V9JAwRYeV+fWn(dWn7;?hD}d>z}EWjlPe&<>Yko8VGhQ{;2Lmlrk1<;BgBzqkdy zCN3{=z~_tF;FH+)C|KSRe~xj&doi6*w8<SmZ0d=kExl2+wKs~l_Mw;XLdiC76ekkW zZ<p{v@s57DvR?ZBDA_pxCA$Zrcqg%IAj^YLviC`1FpBAK?PD(Y4Z*Gb!*J_>A4(4R z<Hy4RxOIr2zkYBWemFK2-(39*ZvX2hO8A{qO8g)33-K%Q8}a|dzlh(7+r)^7>j;ZH zseDI8M@J(fA_C#z;g~UF2BuG+j%m}TAtWROQ>IKoP*4yiO`25IpTvLFc71)fle)Vw zt-g_k*4S1C>h$)_o7*&(W=X#mI(^e4Cr+G5CQckZb}YF%JAUFwGo8MP43}2ss_T(# zr_(=FZGc&0Yn{GTN^)`v|5;)uTI%!;DJhl(%K;sA`u3@ePf1CYt|m+ApwqWYO-)Uf zu)tE<>hxVKjFrQscGl@TrlqD?Ftieq+DWH(N>59-INn94cTP{YI6nPhoxW>&dWNOr zr+00LuP#?IKRq%m&VPDF51rmMJKNIyXJokQ^xd+vvy+qgs?iwO{r<;$N;(!9`SjB1 zdn)`b>A*mb(|UIc;tdI5pnIO)O~zN=$DC<)wp*@#NaeAW5zNjWlB<8h(s;&YKbfn4 zOnOW0@m&3Yx9`H9I;HR5Z_1+~zVqgV_y&i}3z;|1H<&P3aB#4%#Jpf%df%BZ3|jGy zK1?$ysBfUxWN$BTuQ6l2z57lM4D>cwU+=)c$z#2S1q|)$=kMJcZB`C{S3mKk=O6JI zKW@gtsRNh9zY@Q6aO8poFB;5e`m|ZIqvwx&X8Dp)qa&;`vz~r6M?W_q>8*nY4!?O| z=l(-mH*ep!chBzKy9~Bt&BpbwuUqxn>J4k(*p#@f&xkE^_~rgw?6O5M&nh+{G&D+D zT$x2hg-<ZF@O{F|i(~5hwLmTS8*b;6XB#Y5^a=86(5mc`u)!M=QB@vn_zX!#*j3D9 zRe3J|+^XvP)MZhtm3;?|)!^{6-EfFFNF-@o@%Ff$NE+vXxRKsiHo6~TpY}#9%TfMb zhzsz++Mr<w9v_HF?0e{$E;!5wYDt=I^c+WmW5fk`BZBdh$7zr?dl0hcK84IVL-Ao^ zH2$(<F%Av`c<X|b;REo=_DFoZEeb)54V@N(!+aih&>uK3obV%9-p}$o^L>#sw?FpI z8jR0&%*RJNqA_K>2FFGNZwC;gfF$}4qWj?eC@=ge!W+5;KDe}Z4$iEbhOhR#gbTap z;{2|8n9P28LEO(Xz}f%@oQ?IwM+<x7%Kq8N-xrQ^;XoGKkMmjJg(a>yzt|0*#_>M( z@JtjOnuQDVfX`nd<`S|zpI88#r$0A`;I^}}J<=9mF71p<@viu0l_v_;dgA+S15nC) zwtpP<!&mDbN8yg4C_Xd>r6)ph^H><ZeKQo-h;tlI$9v)nk=D2nWy5<;TNK7O#`i0l z<N9)Y-f!CT-jksJYOw>(zif{y32ksSp)JuKS6`LrfUC=i6^`^yC|J=E1uHw^Dp9bq z6AE7IjFJs5C|LC{N;bLDyWqzyZYbI8j?zR=q8EPL)(2O}`_}fpxV57%{=TapN_Y0d z&-;B*y1PGa?e@h_dpIWr15vv7anA2a{B&RlzI=oCuScH8x2X|0nzSENL#E*Rh2tpr zJR4u1(-P93#KljukpFoOE?+o>%U_&AK7IZdxdiK9z03R8_i^>FpW&bUP^s#k)oaf0 z%KfT*?iv#lqui$|CwaqLg$(4~f6J-P^72|b$lJgcX69(`)U;_cx179(>>9VBwYP0# zV`}YeZ96n++bSoovsSV6)C@!6&U=>Dr*%$V7p+!a#&EOw)r?mAFxxw6Gc$SZTZv_A zyISYub<<|0r)5+Yk)d^EyO%aQqw*0lwB38;<n_^Jr=_J;GJJZ5)|>5vwAxBrd4HoF z!uH3iX&=n?fz`A>$@T$Cd!-Dtk9W+;^Ve!QzshEiseO8APM#n8v$bLZ(zMzUY=5?j z`K7U4!}ihaZ?bnoF(WG@o9)j%l9Trg_kU*!Y1&LB8yRW*r=89AV76CkSz7IjY!A6} zz$=tyv3*L)iK9o49C`Z)?db8Nyh=TK>`>BMZyr8)AbI!xoV<X3?jF57dwF<xczSsB z^ziJ}t5@&-qg;F+bsj$KsZ%+5bAkfLjDLRoxR>V6ojiX0q_N{CgpUlHIq`)VeNQ4h zHz)7q^?P>in4Y+4*M>K?Z`-<M-RiY#R=mFHwT+vnJrO!@AOE^yrmjj@x_Hqmi{h5W zzq)eyl2;ZjjEahlj*M6^fA9VO<Ev>8hU*8z`!#+#oFNkK53D%0jp_bmSzf2y`Q4%F z>lB9Jm5F2V+t2@t4P*LYt;Pp=389D%9D?;@9>F>yG3YV8HuY&-%G`rB)BSPf)SGxC z%pb3Z`lH~~0sQ*&-;uRo0JhB<iY+htVdG3cTtB@R*WTHOlK1zbP`4YWL!0Atm_!S_ z`+_~aJ-q|b3Li&1<HNX~_-yrH>{&b+H}yO53&%YDq64mFuS9BM9B!<4#djOs@IRY8 zadTrYe7Bj{*c&%D^}%-%Tl(VW7H?eN{3r?&`{UZ~02E$5kDFIM!VUU=a=hZp@8bI9 zPf%EJp4-l`d=`b*F5w32x5e*#HhY`TXm3~gyp}0NVqzjzu3U-u_;@T^whT*`E|uwP zu!aoO+YAJn+cVETXEe=djcrpqyC!x9Yh=?{)7-kX+o0A4vu@o?V?S!-$fwI}WI!`b zt5N<&8!^0vrbD@UOHF&zx}Sr_X_Ws6V~1hwG(GOLj~Fqmt;TWGr~sPbZB!dg&!K~# z95CRi0RtWz^2ET$T{Z5`UAuI7xNFBwox8a_WaXjh@7vGYtM4N|y*&H$ezg0e=Ci9% z7ebqvfb?`!L?&RJ18B2=jEr*aR_W<Nq-O|Wog+VI@BD7*TyM{V2IBQ11CC@_A0d+~ zd9Npq)H7_9+_}y`)Maq}gWx)d3LMLF?Ra>MTLITY2nnv6P`p}KeO;R$*KY6$r*ghH za!rTe@9ToUsT;xP6vnc;oxi^e{{F5&wm)d_cYlSG<jOTDM*duvQjTk7ywo{V*7iqi z<9Zq+f3BB#;JLilIdh$lkw4e{2(H60&Ot4!{$BU>pYAWu1+G^z^5^;`g}>xmS2>&K zfNQCY{JFkLa1D%c4l-7qi`;JBW<J(~u1juQ4`$@gHDU@!m8;~VmZg8t{A${t<j=Kj zM*dvGR;T%z&qwBzYwwKwxgJk&{gg5X>CNNoT3zzz`avUqt|=5;`=!i5`ntx~oR8$s zb&f{<T=%H(m)z?Ef60;SHI4kae$&XG>+kA({w06OS-t*g;QwHcSwsFGY`)Due;V>% zxAM<5?m~WU%Htwoe!S{ZUGkG$C1>^Xlk4=k#b9;)^I!6lkepTi)EktsH#jxlvZj{n zf;S~eeMAHQ2Yh_0$iEZyD8{C`aGq4f!AOz?>SqMkCLH76Ko{z2Oq=S|Id3`_Q<BsH z2`;}#CVv-dgG`(LaQ>2v%G<oG5|y0WwQHA3{@ti=Qa3AJ_BAzitp9{p$F1#HYJbVO zLx&Cue`=@H&5Ez>*bkzgN>p-I`BMj`ZmzTZ%MoOSx-}zzYTC@3>wKO1JC(l+wRwUX zuX+XQ1m)jviv0YfzEDtaD5&WZ)Eo+G`UG`{^eW2gQ|M)zvR(Czk+Di!S-etLx0`!8 zmWr}|rgb^CQdj%kiKUj19IXZQkAnI>`T2RA{GF&Z6x1&Y>JtU^iGo^6deB2qt0<_e zG?a~AZYNkbw9(6cvX9AjwcXUqv6Vh*tQ=pKxi9K21@)DJI!uKF^_PPBOC_FKPeFaE zpsrL<mnf*ul;2-R$={LMN<lrOpw3cI`zfda71UnRv;H#6v39J}FKjHRdlb|<3Tht} zPyM5y{!>sl$v6Y3wPe4_A;+dplVeFRhM?Ax<wk<~P(fX&png)>4|Sq~8c~kbNKjWR zs7n;oB?@Xu1$CD4`fa=9PaUVA_EJ#qD5!T7)IkdBAq91if;vd0OzotgPEt@GDX6U^ z`U&bP1@)7HI!Zx3rJ$~|46<A~sKXT0aSG}+1@)UO_aVFlHJ*Z6PeGlhpq^7u=P9V| zWSoznj#E&_DX6s-)WQntI|VhUl0R21!>%9}KGeVpYD@*Sq=Fh#LG7uaHnwu`xKQJ& zfLc{i0kKU4wW?L4tPi!Y9D`$3wI9>%@?3~*EU0}|xMfbqM9H0Ku!amYWS|~rz;Lls zQD>4M=cMXW>hb*k5bDfZRe3evF4t)}6GI6rWhn{^Er<rI%NgK*?{kk<{p{{>aCWbL zeA9azN^AI%Kdjx2)i^$%6dGQ}QH@(_EU-)U<MXFhzW8Hu?OrvG&quW!nK|LB7Q3i% zd}e?n*LoH;j!!96txY~ks44#pV3^@mResoNY%*lhaNI2!zZT><tYI&fjIT`bp5CfI zKWo9?*u_Ar`tc3<H>US)3+!Iw_#D%aPs96N?ZT4rd6;T<{#$Z<jmfM<!IJR}`DY|w zRb|Gssp0&${6H|bv>MM(Ls+ffs~`V<w{m*-_^O`aJq}(&_N(7_L+gFWfa!T&3bcF> zFx{uTPiaLs6IRMQ3ssv8eTZm%7m)GI2-%kkdPSD_D!nCG&bTFn=77d6cg=|Ig)4@; z6iX~G^J?AP$3Nv<yvpD8*4UnH&ar>Q#q?djQFAD$9Te313F`BdvaDAIH8#q>SAp!G ze{%m%GH>d71b)RSYwN1=>Y9K^KaVT2|CN)wl>YoukzXt|f?q7$*KH9q!d>bAP0o&5 z^^YBC=>NCe?RVXu+C;H9z)jizjl4u-f62{~IZ)#$mX7YB^#AUiEyn&e^_AmG$o>h> z8TuEWG4SVRdHYcgRc({oS3K)t$Y1)>pQybQ)L{zhF$J}n3aG`rQ|2~mG>K0Hb)16w zP4Rlz;LGy(<%QY(LhY!aj#N-jS_TKDPOT}uL<>P(si3}8P@gKOa}~Q6PyCeq$6j1y zf9A#p&z}m{b}cGg-Kprt8mFQgt2!3lSlgxOhOEEVw&>gCt&0j*IThVp?O61;HLk^H c<9&YA&ubpR{!NKL)DkdAe)rrp<S~%;Z_f<Dvj6}9 literal 0 HcmV?d00001 From f396c8299f26dacc3743207d94741fcb967d3d5b Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Wed, 17 Mar 2004 14:46:23 +0000 Subject: [PATCH 0547/1463] Simplify LoadUserProfileW() and check for loaded profile. svn path=/trunk/; revision=8774 --- reactos/lib/userenv/profile.c | 88 +++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 40 deletions(-) diff --git a/reactos/lib/userenv/profile.c b/reactos/lib/userenv/profile.c index f05d242b4e9..a6335bee3cf 100644 --- a/reactos/lib/userenv/profile.c +++ b/reactos/lib/userenv/profile.c @@ -1,4 +1,4 @@ -/* $Id: profile.c,v 1.7 2004/03/14 18:15:59 ekohl Exp $ +/* $Id: profile.c,v 1.8 2004/03/17 14:46:23 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -582,9 +582,42 @@ GetUserProfileDirectoryW (HANDLE hToken, szImagePath); return TRUE; -#if 0 - return GetDefaultUserProfileDirectoryW (lpProfileDir, lpcchSize); -#endif +} + + +static BOOL +CheckForLoadedProfile (HANDLE hToken) +{ + UNICODE_STRING SidString; + HKEY hKey; + + DPRINT ("CheckForLoadedProfile() called \n"); + + if (!GetUserSidFromToken (hToken, + &SidString)) + { + DPRINT1 ("GetUserSidFromToken() failed\n"); + return FALSE; + } + + if (RegOpenKeyExW (HKEY_USERS, + SidString.Buffer, + 0, + KEY_ALL_ACCESS, + &hKey)) + { + DPRINT ("Profile not loaded\n"); + RtlFreeUnicodeString (&SidString); + return FALSE; + } + + RegCloseKey (hKey); + + RtlFreeUnicodeString (&SidString); + + DPRINT ("Profile already loaded\n"); + + return TRUE; } @@ -592,12 +625,9 @@ BOOL WINAPI LoadUserProfileW (HANDLE hToken, LPPROFILEINFOW lpProfileInfo) { - WCHAR szRawProfilesPath[MAX_PATH]; - WCHAR szProfilesPath[MAX_PATH]; WCHAR szUserHivePath[MAX_PATH]; UNICODE_STRING SidString; DWORD dwLength; - HKEY hKey; DPRINT ("LoadUserProfileW() called\n"); @@ -610,43 +640,21 @@ LoadUserProfileW (HANDLE hToken, return FALSE; } - if (RegOpenKeyExW (HKEY_LOCAL_MACHINE, - L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList", - 0, - KEY_ALL_ACCESS, - &hKey)) + /* Don't load a profile twice */ + if (CheckForLoadedProfile (hToken)) { - DPRINT1("Error: %lu\n", GetLastError()); + DPRINT ("Profile already loaded\n"); + lpProfileInfo->hProfile = NULL; + return TRUE; + } + + if (!GetProfilesDirectoryW (szUserHivePath, + &dwLength)) + { + DPRINT1("GetProfilesDirectoryW() failed\n", GetLastError()); return FALSE; } - /* Get profiles path */ - dwLength = MAX_PATH * sizeof(WCHAR); - if (RegQueryValueExW (hKey, - L"ProfilesDirectory", - NULL, - NULL, - (LPBYTE)szRawProfilesPath, - &dwLength)) - { - DPRINT1("Error: %lu\n", GetLastError()); - RegCloseKey (hKey); - return FALSE; - } - - /* Expand it */ - if (!ExpandEnvironmentStringsW (szRawProfilesPath, - szProfilesPath, - MAX_PATH)) - { - DPRINT1("Error: %lu\n", GetLastError()); - RegCloseKey (hKey); - return FALSE; - } - - RegCloseKey (hKey); - - wcscpy (szUserHivePath, szProfilesPath); wcscat (szUserHivePath, L"\\"); wcscat (szUserHivePath, lpProfileInfo->lpUserName); if (!AppendSystemPostfix (szUserHivePath, MAX_PATH)) From 31ac5158a6eec36b07930d508437329ec5f2a937 Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes <hardon@online.no> Date: Wed, 17 Mar 2004 15:00:39 +0000 Subject: [PATCH 0548/1463] fix pipe create flags traslation svn path=/trunk/; revision=8775 --- reactos/lib/kernel32/file/npipe.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/lib/kernel32/file/npipe.c b/reactos/lib/kernel32/file/npipe.c index 70806160325..c144206c9f8 100644 --- a/reactos/lib/kernel32/file/npipe.c +++ b/reactos/lib/kernel32/file/npipe.c @@ -1,4 +1,4 @@ -/* $Id: npipe.c,v 1.17 2004/01/23 21:16:03 ekohl Exp $ +/* $Id: npipe.c,v 1.18 2004/03/17 15:00:39 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -110,9 +110,9 @@ CreateNamedPipeW(LPCWSTR lpName, { CreateOptions = CreateOptions | FILE_WRITE_THROUGH; } - if (dwOpenMode & FILE_FLAG_OVERLAPPED) + if (!(dwOpenMode & FILE_FLAG_OVERLAPPED)) { - CreateOptions = CreateOptions | FILE_SYNCHRONOUS_IO_ALERT; + CreateOptions = CreateOptions | FILE_SYNCHRONOUS_IO_NONALERT; } if (dwOpenMode & PIPE_ACCESS_DUPLEX) { From ff055ed11b48a1a6380446d9277ccdc486445959 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Wed, 17 Mar 2004 16:05:29 +0000 Subject: [PATCH 0549/1463] - Fixed few bugs related to SUROBJ initialization. svn path=/trunk/; revision=8776 --- reactos/subsys/win32k/eng/surface.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/eng/surface.c b/reactos/subsys/win32k/eng/surface.c index 9ced7dcd2eb..9d26608510a 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.33 2004/03/06 01:22:03 navaraf Exp $ +/* $Id: surface.c,v 1.34 2004/03/17 16:05:29 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -373,11 +373,14 @@ EngCreateBitmap(IN SIZEL Size, SurfObj->dhsurf = 0; // device managed surface SurfObj->hsurf = 0; + 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); @@ -414,6 +417,7 @@ EngCreateDeviceSurface(IN DHSURF dhsurf, SurfObj->iBitmapFormat = Format; SurfObj->lDelta = DIB_GetDIBWidthBytes(Size.cx, BitsPerFormat(Format)); SurfObj->iType = STYPE_DEVICE; + SurfObj->iUniq = 0; InitializeFuncs(SurfGDI, Format); @@ -451,6 +455,7 @@ EngAssociateSurface(IN HSURF Surface, // Associate the hdev SurfObj->hdev = Dev; + SurfObj->dhpdev = Device->PDev; // Hook up specified functions if(Hooks & HOOK_BITBLT) SurfGDI->BitBlt = Device->DriverFunctions.BitBlt; From fd4ab47d6943a581670a05d5f9ab47d8c43f0cf0 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Wed, 17 Mar 2004 20:57:06 +0000 Subject: [PATCH 0550/1463] minor speed-improvement svn path=/trunk/; revision=8778 --- reactos/subsys/win32k/objects/text.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index cf8bcff99de..ffa074a5a05 100644 --- a/reactos/subsys/win32k/objects/text.c +++ b/reactos/subsys/win32k/objects/text.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: text.c,v 1.79 2004/03/04 00:07:03 navaraf Exp $ */ +/* $Id: text.c,v 1.80 2004/03/17 20:57:06 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -209,8 +209,8 @@ IntGdiAddFontResource(PUNICODE_STRING Filename, DWORD fl) FontGDI->face = face; // FIXME: Complete text metrics - FontGDI->TextMetric.tmAscent = (face->size->metrics.ascender + 32) / 64; // units above baseline - FontGDI->TextMetric.tmDescent = (- face->size->metrics.descender + 32) / 64; // units below baseline + FontGDI->TextMetric.tmAscent = (face->size->metrics.ascender + 32) >> 6; // units above baseline + 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); @@ -748,9 +748,9 @@ NtGdiExtTextOut( if (dc->w.textAlign & TA_BASELINE) yoff = 0; else if (dc->w.textAlign & TA_BOTTOM) - yoff = -face->size->metrics.descender / 64; + yoff = -face->size->metrics.descender >> 6; else /* TA_TOP */ - yoff = face->size->metrics.ascender / 64; + yoff = face->size->metrics.ascender >> 6; use_kerning = FT_HAS_KERNING(face); previous = 0; @@ -865,9 +865,9 @@ NtGdiExtTextOut( if (fuOptions & ETO_OPAQUE) { DestRect.left = BackgroundLeft; - DestRect.right = TextLeft + (glyph->advance.x + 32) / 64; - DestRect.top = TextTop + yoff - (face->size->metrics.ascender + 32) / 64; - DestRect.bottom = TextTop + yoff + (- face->size->metrics.descender + 32) / 64; + DestRect.right = TextLeft + ((glyph->advance.x + 32) >> 6); + DestRect.top = TextTop + yoff - ((face->size->metrics.ascender + 32) >> 6); + DestRect.bottom = TextTop + yoff + ((32 - face->size->metrics.descender) >> 6); IntEngBitBlt( SurfObj, NULL, @@ -921,7 +921,7 @@ NtGdiExtTextOut( EngDeleteSurface(HSourceGlyph); - TextLeft += (glyph->advance.x + 32) / 64; + TextLeft += (glyph->advance.x + 32) >> 6; previous = glyph_index; String++; @@ -1580,12 +1580,12 @@ NtGdiGetTextMetrics(HDC hDC, } else { - SafeTm.tmAveCharWidth = (pOS2->xAvgCharWidth + 32) / 64; + SafeTm.tmAveCharWidth = (pOS2->xAvgCharWidth + 32) >> 6; } - SafeTm.tmAscent = (Face->size->metrics.ascender + 32) / 64; // units above baseline - SafeTm.tmDescent = (- Face->size->metrics.descender + 32) / 64; // units below baseline + SafeTm.tmAscent = (Face->size->metrics.ascender + 32) >> 6; // units above baseline + SafeTm.tmDescent = (32 - Face->size->metrics.descender) >> 6; // units below baseline SafeTm.tmHeight = SafeTm.tmAscent + SafeTm.tmDescent; - SafeTm.tmMaxCharWidth = (Face->size->metrics.max_advance + 32) / 64; + SafeTm.tmMaxCharWidth = (Face->size->metrics.max_advance + 32) >> 6; Status = MmCopyToCaller(tm, &SafeTm, sizeof(TEXTMETRICW)); } } From 810644856daa8998ad2e739720b6a6a9c0d41562 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Thu, 18 Mar 2004 00:28:45 +0000 Subject: [PATCH 0551/1463] first version of Explorer NotifyHook DLL svn path=/trunk/; revision=8779 --- reactos/subsys/system/explorer/Makefile | 6 +- reactos/subsys/system/explorer/explorer.dsp | 8 +- reactos/subsys/system/explorer/explorer.dsw | 12 ++ .../system/explorer/notifyhook/.cvsignore | 2 + .../system/explorer/notifyhook/notifyhook.c | 116 ++++++++++++++++++ .../system/explorer/notifyhook/notifyhook.dsp | 101 +++++++++++++++ .../system/explorer/notifyhook/notifyhook.h | 50 ++++++++ .../system/explorer/taskbar/desktopbar.cpp | 2 - .../system/explorer/taskbar/traynotify.cpp | 66 ++++++++-- .../system/explorer/taskbar/traynotify.h | 18 +++ .../subsys/system/explorer/utility/window.h | 4 +- 11 files changed, 365 insertions(+), 20 deletions(-) create mode 100644 reactos/subsys/system/explorer/notifyhook/.cvsignore create mode 100644 reactos/subsys/system/explorer/notifyhook/notifyhook.c create mode 100644 reactos/subsys/system/explorer/notifyhook/notifyhook.dsp create mode 100644 reactos/subsys/system/explorer/notifyhook/notifyhook.h diff --git a/reactos/subsys/system/explorer/Makefile b/reactos/subsys/system/explorer/Makefile index b63bfbbbcd1..da94f3ab375 100644 --- a/reactos/subsys/system/explorer/Makefile +++ b/reactos/subsys/system/explorer/Makefile @@ -128,12 +128,15 @@ ever: buildno.h: ../../../include/reactos/buildno.h $(CD_PREFIX)updatebuildno -$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) +$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) notifyhook.dll $(LINK) $(LFLAGS) -o $@ $^ $(addprefix -l,$(LIBS)) $(addprefix -l,$(DELAYIMPORTS)) explorer$(RES_SUFFIX): $(PROGRAM)_intres.rc res/*.bmp res/*.ico $(RC) $(RCFLAGS) -o $@ $(PROGRAM)_intres.rc +notifyhook.dll: notifyhook/notifyhook.c notifyhook/notifyhook.h + $(CC) -D_WIN32_IE=0x0600 -Wall -D_NOTIFYHOOK_IMPL -Os -s notifyhook/notifyhook.c -shared -o $@ + clean: $(TOOLS_PATH)/rdel $(TARGET) $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) @@ -152,6 +155,7 @@ implib: install: -$(TOOLS_PATH)/rcopy $(TARGET) $(INSTALL_DIR)/$(TARGET) + -$(TOOLS_PATH)/rcopy notifyhook.dll $(INSTALL_DIR)/$(TARGET) bootcd: diff --git a/reactos/subsys/system/explorer/explorer.dsp b/reactos/subsys/system/explorer/explorer.dsp index 4d603e52c1b..35d182f529f 100644 --- a/reactos/subsys/system/explorer/explorer.dsp +++ b/reactos/subsys/system/explorer/explorer.dsp @@ -57,7 +57,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /machine:I386 /delayload:oleaut32.dll /delayload:wsock32.dll +# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /machine:I386 /libpath:"Release" /delayload:oleaut32.dll /delayload:wsock32.dll # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "explorer - Win32 Debug" @@ -82,7 +82,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /delayload:oleaut32.dll /delayload:wsock32.dll +# ADD LINK32 kernel32.lib shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"Debug" /delayload:oleaut32.dll /delayload:wsock32.dll # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "explorer - Win32 Debug Release" @@ -134,7 +134,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /machine:I386 /delayload:oleaut32.dll /delayload:wsock32.dll +# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /machine:I386 /libpath:"Release" /delayload:oleaut32.dll /delayload:wsock32.dll # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "explorer - Win32 Unicode Debug" @@ -160,7 +160,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /delayload:oleaut32.dll /delayload:wsock32.dll +# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"Debug" /delayload:oleaut32.dll /delayload:wsock32.dll # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "explorer - Win32 _NO_COMUTIL" diff --git a/reactos/subsys/system/explorer/explorer.dsw b/reactos/subsys/system/explorer/explorer.dsw index 92fff86f51d..51e9b3bd73e 100644 --- a/reactos/subsys/system/explorer/explorer.dsw +++ b/reactos/subsys/system/explorer/explorer.dsw @@ -27,6 +27,18 @@ Package=<4> ############################################################################### +Project: "notifyhook"=.\notifyhook\notifyhook.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + Global: Package=<5> diff --git a/reactos/subsys/system/explorer/notifyhook/.cvsignore b/reactos/subsys/system/explorer/notifyhook/.cvsignore new file mode 100644 index 00000000000..0f3a6b1b966 --- /dev/null +++ b/reactos/subsys/system/explorer/notifyhook/.cvsignore @@ -0,0 +1,2 @@ +Debug +Release diff --git a/reactos/subsys/system/explorer/notifyhook/notifyhook.c b/reactos/subsys/system/explorer/notifyhook/notifyhook.c new file mode 100644 index 00000000000..41cd5de1610 --- /dev/null +++ b/reactos/subsys/system/explorer/notifyhook/notifyhook.c @@ -0,0 +1,116 @@ +/* + * Copyright 2004 Martin Fuchs + * + * 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 + */ + + + // + // NotifyHook DLL for ROS Explorer + // + // notifyhook.cpp + // + // Martin Fuchs, 17.03.2004 + // + + +#include "../utility/utility.h" + +#include "notifyhook.h" + + +static HINSTANCE s_hInstance; +static UINT WM_GETMODULEPATH; +static HHOOK s_hNotifyHook; + + +BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID param) +{ + switch(dwReason) { + case DLL_PROCESS_ATTACH: + s_hInstance = hInst; + DisableThreadLibraryCalls(hInst); + WM_GETMODULEPATH = RegisterWindowMessageA("WM_GETMODULEPATH"); + break; + } + + return TRUE; +} + + +struct COPYDATA_STRUCT { + HWND _hwnd; + int _len; + char _path[MAX_PATH]; +}; + +LRESULT CALLBACK NotifyHookProc(int code, WPARAM wparam, LPARAM lparam) +{ + MSG* pmsg = (MSG*)lparam; + + if (pmsg->message == WM_GETMODULEPATH) { + struct COPYDATA_STRUCT cds; + COPYDATASTRUCT data; + + cds._hwnd = pmsg->hwnd; + cds._len = GetWindowModuleFileNameA(pmsg->hwnd, cds._path, MAX_PATH); + + data.dwData = WM_GETMODULEPATH; + data.cbData = sizeof(cds); + data.lpData = &cds; + + SendMessage((HWND)pmsg->wParam, WM_COPYDATA, (WPARAM)pmsg->hwnd, (LPARAM)&data); + + return 0; + } + + return CallNextHookEx(s_hNotifyHook, code, wparam, lparam); +} + + +UINT InstallNotifyHook() +{ + s_hNotifyHook = SetWindowsHookEx(WH_GETMESSAGE, NotifyHookProc, s_hInstance, 0); + + return WM_GETMODULEPATH; +} + +void DeinstallNotifyHook() +{ + UnhookWindowsHookEx(s_hNotifyHook); + s_hNotifyHook = 0; +} + + +void GetWindowModulePath(HWND hwnd) +{ + SendMessage(hwnd, WM_GETMODULEPATH, 0, 0); +} + + // retrieve module path by receiving WM_COPYDATA message +DECL_NOTIFYHOOK int GetWindowModulePathCopyData(LPARAM lparam, HWND* phwnd, LPSTR buffer, int size) +{ + PCOPYDATASTRUCT data = (PCOPYDATASTRUCT) lparam; + + if (data->dwData == WM_GETMODULEPATH) { + struct COPYDATA_STRUCT* cds = (struct COPYDATA_STRUCT*) data->lpData; + + *phwnd = cds->_hwnd; + strncpy(buffer, cds->_path, size); + + return cds->_len; + } else + return 0; +} diff --git a/reactos/subsys/system/explorer/notifyhook/notifyhook.dsp b/reactos/subsys/system/explorer/notifyhook/notifyhook.dsp new file mode 100644 index 00000000000..2c1b2bf9938 --- /dev/null +++ b/reactos/subsys/system/explorer/notifyhook/notifyhook.dsp @@ -0,0 +1,101 @@ +# Microsoft Developer Studio Project File - Name="notifyhook" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=notifyhook - 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 "notifyhook.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 "notifyhook.mak" CFG="notifyhook - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "notifyhook - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "notifyhook - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "notifyhook - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "shellhook___Win32_Release" +# PROP BASE Intermediate_Dir "shellhook___Win32_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_NOTIFYHOOK_IMPL" /FD /c +# SUBTRACT CPP /YX +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 +# ADD LINK32 user32.lib /nologo /subsystem:windows /dll /machine:I386 + +!ELSEIF "$(CFG)" == "notifyhook - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "shellhook___Win32_Debug" +# PROP BASE Intermediate_Dir "shellhook___Win32_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_NOTIFYHOOK_IMPL" /FR /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 user32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "notifyhook - Win32 Release" +# Name "notifyhook - Win32 Debug" +# Begin Source File + +SOURCE=.\notifyhook.c +# End Source File +# Begin Source File + +SOURCE=.\notifyhook.h +# End Source File +# End Target +# End Project diff --git a/reactos/subsys/system/explorer/notifyhook/notifyhook.h b/reactos/subsys/system/explorer/notifyhook/notifyhook.h new file mode 100644 index 00000000000..11ebd8c284f --- /dev/null +++ b/reactos/subsys/system/explorer/notifyhook/notifyhook.h @@ -0,0 +1,50 @@ +/* + * Copyright 2004 Martin Fuchs + * + * 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 + */ + + + // + // NotifyHook DLL for ROS Explorer + // + // notifyhook.h + // + // Martin Fuchs, 17.03.2004 + // + + +#ifdef _NOTIFYHOOK_IMPL +#define DECL_NOTIFYHOOK __declspec(dllexport) +#else +#define DECL_NOTIFYHOOK __declspec(dllimport) +#ifdef _MSC_VER +#pragma comment(lib, "notifyhook") +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +DECL_NOTIFYHOOK UINT InstallNotifyHook(); +DECL_NOTIFYHOOK void DeinstallNotifyHook(); + +DECL_NOTIFYHOOK void GetWindowModulePath(HWND hwnd); +DECL_NOTIFYHOOK int GetWindowModulePathCopyData(LPARAM lparam, HWND* phwnd, LPSTR buffer, int size); + +#ifdef __cplusplus +}; +#endif diff --git a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp index 3293a7674f9..8658393b09f 100644 --- a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp @@ -361,8 +361,6 @@ LRESULT DesktopBar::ProcessCopyData(COPYDATASTRUCT* pcd) if (pcd->dwData == 1) { TrayNotifyCDS* ptr = (TrayNotifyCDS*) pcd->lpData; - ///@todo process the differnt versions of the NOTIFYICONDATA structure (look at cbSize to decide which one) - NotifyArea* notify_area = GET_WINDOW(NotifyArea, _hwndNotify); if (notify_area) diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index 687fdaf9cec..71e86bb043c 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -34,6 +34,37 @@ #include "traynotify.h" +#include "../notifyhook/notifyhook.h" + +NotifyHook::NotifyHook() + : WM_GETMODULEPATH(InstallNotifyHook()) +{ +} + +NotifyHook::~NotifyHook() +{ + DeinstallNotifyHook(); +} + +void NotifyHook::GetModulePath(HWND hwnd, HWND hwndCallback) +{ + PostMessage(hwnd, WM_GETMODULEPATH, (WPARAM)hwndCallback, 0); +} + +bool NotifyHook::ModulePathCopyData(LPARAM lparam, HWND* phwnd, String& path) +{ + char buffer[MAX_PATH]; + + int l = GetWindowModulePathCopyData(lparam, phwnd, buffer, MAX_PATH); + + if (l) { + path.assign(buffer, l); + return true; + } else + return false; +} + + NotifyIconIndex::NotifyIconIndex(NOTIFYICONDATA* pnid) { _hWnd = pnid->hWnd; @@ -222,6 +253,17 @@ LRESULT NotifyArea::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) case WM_CONTEXTMENU: break; // don't let WM_CONTEXTMENU go through to the desktop bar + case WM_COPYDATA: { // receive NotifyHook answers + String path; + HWND hwnd; + + if (_hook.ModulePathCopyData(lparam, &hwnd, path)) { + _window_modules[hwnd] = path; + //@@ -> trigger DetermineHideState() + } + + break;} + default: if (nmsg>=WM_MOUSEFIRST && nmsg<=WM_MOUSELAST) { // close startup menu and other popup menus @@ -460,23 +502,14 @@ NotifyIconSet::iterator NotifyArea::IconHitTest(const POINT& pos) #if NOTIFYICON_VERSION>=3 // as of 21.08.2003 missing in MinGW headers bool NotifyArea::DetermineHideState(NotifyInfo& entry) { -/* - DWORD pid; - - if (GetWindowThreadProcessId(entry._hWnd, &pid)) { - - //@@ look for executable path - - } -*/ - TCHAR title[MAX_PATH]; - if (entry._tipText == TEXT("FRITZ!fon")) return true; if (entry._tipText == TEXT("FRITZ!fax")) return true; + TCHAR title[MAX_PATH]; + if (GetWindowText(entry._hWnd, title, MAX_PATH)) { if (_tcsstr(title, TEXT("Task Manager"))) return false; @@ -491,6 +524,17 @@ bool NotifyArea::DetermineHideState(NotifyInfo& entry) return true; } + const String& modulePath = _window_modules[entry._hWnd]; + + // request module path for new windows (We will get an asynchronous answer by a WM_COPYDATA message.) + if (modulePath.empty()) { + _hook.GetModulePath(entry._hWnd, _hwnd); + return false; + } + + if (modulePath == TEXT("xyz")) //@@ + return true; + return false; } #endif diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.h b/reactos/subsys/system/explorer/taskbar/traynotify.h index d5f780b86c6..4f1e53a9108 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.h +++ b/reactos/subsys/system/explorer/taskbar/traynotify.h @@ -35,6 +35,8 @@ #define NOTIFYICON_DIST 20 #define NOTIFYAREA_SPACE 10 +#define PM_GETMODULEPATH_CB (WM_APP+0x21) + /// NotifyIconIndex is used for maintaining the order of notification icons. struct NotifyIconIndex @@ -75,6 +77,19 @@ typedef map<NotifyIconIndex, NotifyInfo> NotifyIconMap; typedef set<NotifyInfo> NotifyIconSet; +struct NotifyHook +{ + NotifyHook(); + ~NotifyHook(); + + void GetModulePath(HWND hwnd, HWND hwndCallback); + bool ModulePathCopyData(LPARAM lparam, HWND* phwnd, String& path); + +protected: + const UINT WM_GETMODULEPATH; +}; + + /// tray notification area aka "tray" struct NotifyArea : public Window { @@ -111,6 +126,9 @@ protected: NotifyIconSet::iterator IconHitTest(const POINT& pos); bool DetermineHideState(NotifyInfo& entry); + + NotifyHook _hook; + map<HWND, String> _window_modules; }; diff --git a/reactos/subsys/system/explorer/utility/window.h b/reactos/subsys/system/explorer/utility/window.h index 4aa7dcbf6f7..701d31ec766 100644 --- a/reactos/subsys/system/explorer/utility/window.h +++ b/reactos/subsys/system/explorer/utility/window.h @@ -315,7 +315,7 @@ protected: String _statusText; }; -#define PM_SETSTATUSTEXT (WM_APP+0x1D) +#define PM_SETSTATUSTEXT (WM_APP+0x1E) /** @@ -957,7 +957,7 @@ protected: enum {TRAYBUTTON_LEFT=0, TRAYBUTTON_RIGHT, TRAYBUTTON_MIDDLE}; -#define PM_TRAYICON (WM_APP+0x1E) +#define PM_TRAYICON (WM_APP+0x20) #define WINMSG_TASKBARCREATED TEXT("TaskbarCreated") From 7cda28d4152f9ccdf687bea18901304a0c343424 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Thu, 18 Mar 2004 16:19:26 +0000 Subject: [PATCH 0552/1463] 1. implemented SetFileValidData() 2. updated FILE_INFORMATION_CLASS svn path=/trunk/; revision=8780 --- reactos/include/ddk/fstypes.h | 6 +++++- reactos/include/napi/types.h | 20 ++++++++--------- reactos/lib/kernel32/file/file.c | 36 ++++++++++++++++++++++++++++++- reactos/lib/kernel32/misc/stubs.c | 16 +------------- 4 files changed, 51 insertions(+), 27 deletions(-) diff --git a/reactos/include/ddk/fstypes.h b/reactos/include/ddk/fstypes.h index c8d7519e4d7..ba198a1c0fb 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.14 2004/03/14 09:21:41 weiden Exp $ */ +/* $Id: fstypes.h,v 1.15 2004/03/18 16:19:25 weiden Exp $ */ #ifndef __USE_W32API @@ -21,6 +21,10 @@ typedef struct _FILE_LINK_INFORMATION { WCHAR FileName[1]; } FILE_LINK_INFORMATION, *PFILE_LINK_INFORMATION; +typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION { + LARGE_INTEGER ValidDataLength; +} FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION; + typedef NTSTATUS (*PCOMPLETE_LOCK_IRP_ROUTINE) ( IN PVOID Context, IN PIRP Irp diff --git a/reactos/include/napi/types.h b/reactos/include/napi/types.h index d8a35f93997..30287b3492d 100644 --- a/reactos/include/napi/types.h +++ b/reactos/include/napi/types.h @@ -64,19 +64,19 @@ typedef enum _FILE_INFORMATION_CLASS FileMailslotQueryInformation, FileMailslotSetInformation, FileCompressionInformation, - FileCopyOnWriteInformation, + FileObjectIdInformation, FileCompletionInformation, FileMoveClusterInformation, - FileOleClassIdInformation, - FileOleStateBitsInformation, + FileQuotaInformation, + FileReparsePointInformation, FileNetworkOpenInformation, - FileObjectIdInformation, - FileOleAllInformation, - FileOleDirectoryInformation, - FileContentIndexInformation, - FileInheritContentIndexInformation, - FileOleInformation, - FileMaximumInformation, + FileAttributeTagInformation, + FileTrackingInformation, + FileIdBothDirectoryInformation, + FileIdFullDirectoryInformation, + FileValidDataLengthInformation, + FileShortNameInformation, + FileMaximumInformation } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS; typedef enum _SECTION_INHERIT { diff --git a/reactos/lib/kernel32/file/file.c b/reactos/lib/kernel32/file/file.c index 731daa1cc55..330ff3975e6 100644 --- a/reactos/lib/kernel32/file/file.c +++ b/reactos/lib/kernel32/file/file.c @@ -1,4 +1,4 @@ -/* $Id: file.c,v 1.51 2004/03/14 13:20:10 weiden Exp $ +/* $Id: file.c,v 1.52 2004/03/18 16:19:25 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -13,6 +13,7 @@ /* INCLUDES *****************************************************************/ #include <k32.h> +#include <ddk/ntifs.h> #define NDEBUG #include "../include/debug.h" @@ -1158,4 +1159,37 @@ SetEndOfFile(HANDLE hFile) } + +/* + * @implemented + */ +BOOL +STDCALL +SetFileValidData( + HANDLE hFile, + LONGLONG ValidDataLength + ) +{ + IO_STATUS_BLOCK IoStatusBlock; + FILE_VALID_DATA_LENGTH_INFORMATION ValidDataLengthInformation; + NTSTATUS Status; + + ValidDataLengthInformation.ValidDataLength.QuadPart = ValidDataLength; + + Status = NtSetInformationFile( + hFile, + &IoStatusBlock, //out + &ValidDataLengthInformation, + sizeof(FILE_VALID_DATA_LENGTH_INFORMATION), + FileValidDataLengthInformation + ); + + if (!NT_SUCCESS(Status)){ + SetLastErrorByStatus(Status); + return FALSE; + } + + return TRUE; +} + /* EOF */ diff --git a/reactos/lib/kernel32/misc/stubs.c b/reactos/lib/kernel32/misc/stubs.c index db38a68e8b4..df17c38f70a 100644 --- a/reactos/lib/kernel32/misc/stubs.c +++ b/reactos/lib/kernel32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.68 2004/03/14 18:16:39 weiden Exp $ +/* $Id: stubs.c,v 1.69 2004/03/18 16:19:26 weiden Exp $ * * KERNEL32.DLL stubs (unimplemented functions) * Remove from this file, if you implement them. @@ -1393,20 +1393,6 @@ SetCriticalSectionSpinCount( return 0; } -/* - * @unimplemented - */ -BOOL -STDCALL -SetFileValidData( - HANDLE hFile, - LONGLONG ValidDataLength - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented */ From 280a5aa36178e7ffb620f2db65f8729373c9c9fc Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Thu, 18 Mar 2004 16:43:56 +0000 Subject: [PATCH 0553/1463] - Fixed return status of IoGetDeviceProperty. svn path=/trunk/; revision=8781 --- reactos/ntoskrnl/io/pnpmgr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/io/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr.c index ce5968a670c..37db669385d 100644 --- a/reactos/ntoskrnl/io/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr.c @@ -1,4 +1,4 @@ -/* $Id: pnpmgr.c,v 1.24 2004/03/14 17:10:48 navaraf Exp $ +/* $Id: pnpmgr.c,v 1.25 2004/03/18 16:43:56 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -165,7 +165,7 @@ IoGetDeviceProperty( return STATUS_BUFFER_TOO_SMALL; RtlCopyMemory(PropertyBuffer, Data, Length); - return STATUS_NOT_IMPLEMENTED; + return STATUS_SUCCESS; } /* From 27f458a08418bc04d331d25c6ff7394446196fc9 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III <royce3@ev1.net> Date: Thu, 18 Mar 2004 18:15:28 +0000 Subject: [PATCH 0554/1463] fixed several serious bugs in info.c and added a couple undocumented compatibilities based on analysis of ms's version.dll's behavior. Removed 16-bit exe support from info.c b/c it was very wrong in most cases, and MSDN says 16-bit exe isn't supported anyways. This gets winzip further towards working. svn path=/trunk/; revision=8782 --- reactos/lib/version/info.c | 755 ++++++++++++++----------------------- 1 file changed, 277 insertions(+), 478 deletions(-) diff --git a/reactos/lib/version/info.c b/reactos/lib/version/info.c index 2a81a6ab8fb..7aa7fe46459 100644 --- a/reactos/lib/version/info.c +++ b/reactos/lib/version/info.c @@ -23,7 +23,7 @@ * o Verify VerQueryValue() */ #include "config.h" -#include "wine/port.h" +//#include "wine/port.h" #include <stdarg.h> #include <stdlib.h> @@ -38,16 +38,61 @@ #include "wine/debug.h" #include "wine/unicode.h" -#ifdef __REACTOS__ +/*#ifdef __REACTOS__ DWORD WINAPI GetFileResourceSize16( LPCSTR lpszFileName, LPCSTR lpszResType, LPCSTR lpszResId, LPDWORD lpdwFileOffset ); DWORD WINAPI GetFileResource16( LPCSTR lpszFileName, LPCSTR lpszResType, LPCSTR lpszResId, DWORD dwFileOffset, DWORD dwResLen, LPVOID lpvData ) -#endif +#endif*/ WINE_DEFAULT_DEBUG_CHANNEL(ver); +static +void +VERSION_A2W ( LPWSTR wide_str, LPCSTR ansi_str, int len ) +{ + MultiByteToWideChar ( CP_ACP, 0, ansi_str, -1, wide_str, len ); +} + +static +void +VERSION_W2A ( LPSTR ansi_str, LPCWSTR wide_str, int len ) +{ + WideCharToMultiByte ( CP_ACP, 0, wide_str, -1, ansi_str, len, NULL, NULL ); +} + +static +LPWSTR +VERSION_AllocA2W ( LPCSTR ansi_str ) +{ + int len = MultiByteToWideChar ( CP_ACP, 0, ansi_str, -1, NULL, 0 ); + LPWSTR wide_str = HeapAlloc ( GetProcessHeap(), 0, len * sizeof(WCHAR) ); + if ( !wide_str ) + return NULL; + VERSION_A2W ( wide_str, ansi_str, len ); + return wide_str; +} + +static +LPSTR +VERSION_AllocW2A ( LPCWSTR wide_str ) +{ + int len = WideCharToMultiByte ( CP_ACP, 0, wide_str, -1, NULL, 0, NULL, NULL ); + LPSTR ansi_str = HeapAlloc(GetProcessHeap(), 0, len * sizeof(char)); + if (!ansi_str) + return NULL; + VERSION_W2A ( ansi_str, wide_str, len ); + return ansi_str; +} + +static +void +VERSION_Free ( LPVOID lpvoid ) +{ + HeapFree ( GetProcessHeap(), 0, lpvoid ); +} + /****************************************************************************** * @@ -57,7 +102,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(ver); * Added this function to clean up the code. * *****************************************************************************/ -static void print_vffi_debug(VS_FIXEDFILEINFO *vffi) +static +void +print_vffi_debug(VS_FIXEDFILEINFO *vffi) { TRACE(" structversion=%u.%u, fileversion=%u.%u.%u.%u, productversion=%u.%u.%u.%u, flagmask=0x%lx, flags=%s%s%s%s%s%s\n", HIWORD(vffi->dwStrucVersion),LOWORD(vffi->dwStrucVersion), @@ -74,7 +121,7 @@ static void print_vffi_debug(VS_FIXEDFILEINFO *vffi) (vffi->dwFileFlags & VS_FF_SPECIALBUILD) ? "SPECIALBUILD," : "" ); - TRACE("("); + TRACE("("); TRACE(" OS=0x%x.0x%x ", HIWORD(vffi->dwFileOS), LOWORD(vffi->dwFileOS) @@ -148,7 +195,7 @@ static void print_vffi_debug(VS_FIXEDFILEINFO *vffi) } break; case VFT_FONT: - TRACE("filetype=FONT."); + TRACE("filetype=FONT."); switch (vffi->dwFileSubtype) { default: TRACE("UNKNOWN(0x%lx)",vffi->dwFileSubtype); @@ -161,7 +208,7 @@ static void print_vffi_debug(VS_FIXEDFILEINFO *vffi) case VFT_VXD:TRACE("filetype=VXD");break; case VFT_STATIC_LIB:TRACE("filetype=STATIC_LIB");break; } - TRACE("\n"); + TRACE("\n"); TRACE(" filedata=0x%lx.0x%lx\n", vffi->dwFileDateMS,vffi->dwFileDateLS); } @@ -171,19 +218,6 @@ static void print_vffi_debug(VS_FIXEDFILEINFO *vffi) * Version Info Structure */ -typedef struct -{ - WORD wLength; - WORD wValueLength; - CHAR szKey[1]; -#if 0 /* variable length structure */ - /* DWORD aligned */ - BYTE Value[]; - /* DWORD aligned */ - VS_VERSION_INFO_STRUCT16 Children[]; -#endif -} VS_VERSION_INFO_STRUCT16; - typedef struct { WORD wLength; @@ -197,99 +231,35 @@ typedef struct VS_VERSION_INFO_STRUCT32 Children[]; #endif } VS_VERSION_INFO_STRUCT32; - +/* #define VersionInfoIs16( ver ) \ ( ((VS_VERSION_INFO_STRUCT16 *)ver)->szKey[0] >= ' ' ) - +*/ #define DWORD_ALIGN( base, ptr ) \ ( (LPBYTE)(base) + ((((LPBYTE)(ptr) - (LPBYTE)(base)) + 3) & ~3) ) - +/* #define VersionInfo16_Value( ver ) \ DWORD_ALIGN( (ver), (ver)->szKey + strlen((ver)->szKey) + 1 ) +*/ #define VersionInfo32_Value( ver ) \ DWORD_ALIGN( (ver), (ver)->szKey + strlenW((ver)->szKey) + 1 ) - +/* #define VersionInfo16_Children( ver ) \ (VS_VERSION_INFO_STRUCT16 *)( VersionInfo16_Value( ver ) + \ ( ( (ver)->wValueLength + 3 ) & ~3 ) ) +*/ #define VersionInfo32_Children( ver ) \ (VS_VERSION_INFO_STRUCT32 *)( VersionInfo32_Value( ver ) + \ ( ( (ver)->wValueLength * \ ((ver)->bText? 2 : 1) + 3 ) & ~3 ) ) +/* #define VersionInfo16_Next( ver ) \ (VS_VERSION_INFO_STRUCT16 *)( (LPBYTE)ver + (((ver)->wLength + 3) & ~3) ) +*/ #define VersionInfo32_Next( ver ) \ (VS_VERSION_INFO_STRUCT32 *)( (LPBYTE)ver + (((ver)->wLength + 3) & ~3) ) -/*********************************************************************** - * ConvertVersionInfo32To16 [internal] - */ -void ConvertVersionInfo32To16( VS_VERSION_INFO_STRUCT32 *info32, - VS_VERSION_INFO_STRUCT16 *info16 ) -{ - /* Copy data onto local stack to prevent overwrites */ - WORD wLength = info32->wLength; - WORD wValueLength = info32->wValueLength; - WORD bText = info32->bText; - LPBYTE lpValue = VersionInfo32_Value( info32 ); - VS_VERSION_INFO_STRUCT32 *child32 = VersionInfo32_Children( info32 ); - VS_VERSION_INFO_STRUCT16 *child16; - - TRACE("Converting %p to %p\n", info32, info16 ); - TRACE("wLength %d, wValueLength %d, bText %d, value %p, child %p\n", - wLength, wValueLength, bText, lpValue, child32 ); - - /* Convert key */ - WideCharToMultiByte( CP_ACP, 0, info32->szKey, -1, info16->szKey, 0x7fffffff, NULL, NULL ); - - TRACE("Copied key from %p to %p: %s\n", info32->szKey, info16->szKey, - debugstr_a(info16->szKey) ); - - /* Convert value */ - if ( wValueLength == 0 ) - { - info16->wValueLength = 0; - TRACE("No value present\n" ); - } - else if ( bText ) - { - info16->wValueLength = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)lpValue, -1, NULL, 0, NULL, NULL ); - WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)lpValue, -1, - VersionInfo16_Value( info16 ), info16->wValueLength, NULL, NULL ); - - TRACE("Copied value from %p to %p: %s\n", lpValue, - VersionInfo16_Value( info16 ), - debugstr_a(VersionInfo16_Value( info16 )) ); - } - else - { - info16->wValueLength = wValueLength; - memmove( VersionInfo16_Value( info16 ), lpValue, wValueLength ); - - TRACE("Copied value from %p to %p: %d bytes\n", lpValue, - VersionInfo16_Value( info16 ), wValueLength ); - } - - /* Convert children */ - child16 = VersionInfo16_Children( info16 ); - while ( (DWORD)child32 < (DWORD)info32 + wLength && child32->wLength != 0 ) - { - VS_VERSION_INFO_STRUCT32 *nextChild = VersionInfo32_Next( child32 ); - - ConvertVersionInfo32To16( child32, child16 ); - - child16 = VersionInfo16_Next( child16 ); - child32 = nextChild; - } - - /* Fixup length */ - info16->wLength = (DWORD)child16 - (DWORD)info16; - - TRACE("Finished, length is %d (%p - %p)\n", - info16->wLength, info16, child16 ); -} - /*********************************************************************** * VERSION_GetFileVersionInfo_PE [internal] * @@ -297,448 +267,277 @@ void ConvertVersionInfo32To16( VS_VERSION_INFO_STRUCT32 *info32, * in the case if file exists, but VERSION_INFO not found. * FIXME: handle is not used. */ -static DWORD VERSION_GetFileVersionInfo_PE( LPCSTR filename, LPDWORD handle, - DWORD datasize, LPVOID data ) +static +DWORD +VERSION_GetFileVersionInfo_PE ( + LPCWSTR filename, LPDWORD handle, + DWORD datasize, LPVOID data ) { - VS_FIXEDFILEINFO *vffi; - DWORD len; - BYTE *buf; - HMODULE hModule; - HRSRC hRsrc; - HGLOBAL hMem; + VS_FIXEDFILEINFO *vffi; + DWORD len; + BYTE *buf; + HMODULE hModule; + HRSRC hRsrc; + HGLOBAL hMem; - TRACE("(%s,%p)\n", debugstr_a(filename), handle ); + TRACE("(%s,%p)\n", debugstr_w(filename), handle ); - hModule = GetModuleHandleA(filename); - if(!hModule) - hModule = LoadLibraryExA(filename, 0, LOAD_LIBRARY_AS_DATAFILE); - else - hModule = LoadLibraryExA(filename, 0, 0); - if(!hModule) - { - WARN("Could not load %s\n", debugstr_a(filename)); - return 0; - } - hRsrc = FindResourceW(hModule, - MAKEINTRESOURCEW(VS_VERSION_INFO), - MAKEINTRESOURCEW(VS_FILE_INFO)); - if(!hRsrc) - { - WARN("Could not find VS_VERSION_INFO in %s\n", debugstr_a(filename)); - FreeLibrary(hModule); - return 0xFFFFFFFF; - } - len = SizeofResource(hModule, hRsrc); - hMem = LoadResource(hModule, hRsrc); - if(!hMem) - { - WARN("Could not load VS_VERSION_INFO from %s\n", debugstr_a(filename)); - FreeLibrary(hModule); - return 0xFFFFFFFF; - } - buf = LockResource(hMem); - - vffi = (VS_FIXEDFILEINFO *)VersionInfo32_Value( (VS_VERSION_INFO_STRUCT32 *)buf ); - - if ( vffi->dwSignature != VS_FFI_SIGNATURE ) - { - WARN("vffi->dwSignature is 0x%08lx, but not 0x%08lx!\n", - vffi->dwSignature, VS_FFI_SIGNATURE ); - len = 0xFFFFFFFF; - goto END; - } - - if ( TRACE_ON(ver) ) - print_vffi_debug( vffi ); - - if(data) - { - if(datasize < len) - len = datasize; /* truncate data */ - if(len) - memcpy(data, buf, len); + hModule = GetModuleHandleW(filename); + if(!hModule) + hModule = LoadLibraryExW(filename, 0, LOAD_LIBRARY_AS_DATAFILE); else - len = 0xFFFFFFFF; - } + hModule = LoadLibraryExW(filename, 0, 0); + if ( !hModule ) + { + WARN("Could not load %s\n", debugstr_w(filename)); + return 0; + } + hRsrc = FindResourceW(hModule, + MAKEINTRESOURCEW(VS_VERSION_INFO), + MAKEINTRESOURCEW(VS_FILE_INFO)); + if ( !hRsrc ) + { + WARN("Could not find VS_VERSION_INFO in %s\n", debugstr_w(filename)); + FreeLibrary(hModule); + return 0xFFFFFFFF; + } + len = SizeofResource(hModule, hRsrc); + hMem = LoadResource(hModule, hRsrc); + if(!hMem) + { + WARN("Could not load VS_VERSION_INFO from %s\n", debugstr_a(filename)); + FreeLibrary(hModule); + return 0xFFFFFFFF; + } + buf = LockResource(hMem); + + vffi = (VS_FIXEDFILEINFO *)VersionInfo32_Value( (VS_VERSION_INFO_STRUCT32 *)buf ); + + if ( vffi->dwSignature != VS_FFI_SIGNATURE ) + { + WARN("vffi->dwSignature is 0x%08lx, but not 0x%08lx!\n", + vffi->dwSignature, VS_FFI_SIGNATURE ); + len = 0xFFFFFFFF; + goto END; + } + + if ( TRACE_ON(ver) ) + print_vffi_debug( vffi ); + + if(data) + { + if(datasize < len) + len = datasize; /* truncate data */ + if(len) + memcpy(data, buf, len); + else + len = 0xFFFFFFFF; + } END: - FreeResource(hMem); - FreeLibrary(hModule); + FreeResource(hMem); + FreeLibrary(hModule); - return len; -} - -/*********************************************************************** - * VERSION_GetFileVersionInfo_16 [internal] - * - * NOTE: returns size of the 16-bit VERSION resource or 0xFFFFFFFF - * in the case if file exists, but VERSION_INFO not found. - * FIXME: handle is not used. - */ -static DWORD VERSION_GetFileVersionInfo_16( LPCSTR filename, LPDWORD handle, - DWORD datasize, LPVOID data ) -{ -#ifndef __MINGW32__ - VS_FIXEDFILEINFO *vffi; - DWORD len; - BYTE *buf; - HMODULE16 hModule; - HRSRC16 hRsrc; - HGLOBAL16 hMem; - - TRACE("(%s,%p)\n", debugstr_a(filename), handle ); - - hModule = LoadLibrary16(filename); - if(hModule < 32) - { - WARN("Could not load %s\n", debugstr_a(filename)); - return 0; - } - hRsrc = FindResource16(hModule, - MAKEINTRESOURCEA(VS_VERSION_INFO), - MAKEINTRESOURCEA(VS_FILE_INFO)); - if(!hRsrc) - { - WARN("Could not find VS_VERSION_INFO in %s\n", debugstr_a(filename)); - FreeLibrary16(hModule); - return 0xFFFFFFFF; - } - len = SizeofResource16(hModule, hRsrc); - hMem = LoadResource16(hModule, hRsrc); - if(!hMem) - { - WARN("Could not load VS_VERSION_INFO from %s\n", debugstr_a(filename)); - FreeLibrary16(hModule); - return 0xFFFFFFFF; - } - buf = LockResource16(hMem); - - if(!VersionInfoIs16(buf)) - goto END; - - vffi = (VS_FIXEDFILEINFO *)VersionInfo16_Value( (VS_VERSION_INFO_STRUCT16 *)buf ); - - if ( vffi->dwSignature != VS_FFI_SIGNATURE ) - { - WARN("vffi->dwSignature is 0x%08lx, but not 0x%08lx!\n", - vffi->dwSignature, VS_FFI_SIGNATURE ); - len = 0xFFFFFFFF; - goto END; - } - - if ( TRACE_ON(ver) ) - print_vffi_debug( vffi ); - - if(data) - { - if(datasize < len) - len = datasize; /* truncate data */ - if(len) - memcpy(data, buf, len); - else - len = 0xFFFFFFFF; - } -END: - FreeResource16(hMem); - FreeLibrary16(hModule); - - return len; -#else /* __MINGW32__ */ -FIXME("No Support for 16bit version information on ReactOS\n"); -return 0; -#endif /* __MINGW32__ */ -} - -/*********************************************************************** - * GetFileVersionInfoSizeA [VERSION.@] - */ -DWORD WINAPI GetFileVersionInfoSizeA( LPSTR filename, LPDWORD handle ) -{ - VS_FIXEDFILEINFO *vffi; - DWORD len, ret, offset; - BYTE buf[144]; - - TRACE("(%s,%p)\n", debugstr_a(filename), handle ); - - len = VERSION_GetFileVersionInfo_PE(filename, handle, 0, NULL); - /* 0xFFFFFFFF means: file exists, but VERSION_INFO not found */ - if(len == 0xFFFFFFFF) - { - SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND); - return 0; - } - if(len) return len; - len = VERSION_GetFileVersionInfo_16(filename, handle, 0, NULL); - /* 0xFFFFFFFF means: file exists, but VERSION_INFO not found */ - if(len == 0xFFFFFFFF) - { - SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND); - return 0; - } - if(len) return len; - - len = GetFileResourceSize16( filename, - MAKEINTRESOURCEA(VS_FILE_INFO), - MAKEINTRESOURCEA(VS_VERSION_INFO), - &offset ); - if (!len) return 0; - - ret = GetFileResource16( filename, - MAKEINTRESOURCEA(VS_FILE_INFO), - MAKEINTRESOURCEA(VS_VERSION_INFO), - offset, sizeof( buf ), buf ); - if (!ret) return 0; - - if ( handle ) *handle = offset; - - if ( VersionInfoIs16( buf ) ) - vffi = (VS_FIXEDFILEINFO *)VersionInfo16_Value( (VS_VERSION_INFO_STRUCT16 *)buf ); - else - vffi = (VS_FIXEDFILEINFO *)VersionInfo32_Value( (VS_VERSION_INFO_STRUCT32 *)buf ); - - if ( vffi->dwSignature != VS_FFI_SIGNATURE ) - { - WARN("vffi->dwSignature is 0x%08lx, but not 0x%08lx!\n", - vffi->dwSignature, VS_FFI_SIGNATURE ); - return 0; - } - - if ( ((VS_VERSION_INFO_STRUCT16 *)buf)->wLength < len ) - len = ((VS_VERSION_INFO_STRUCT16 *)buf)->wLength; - - if ( TRACE_ON(ver) ) - print_vffi_debug( vffi ); - - return len; + return len; } /*********************************************************************** * GetFileVersionInfoSizeW [VERSION.@] */ -DWORD WINAPI GetFileVersionInfoSizeW( LPWSTR filename, LPDWORD handle ) +DWORD +WINAPI +GetFileVersionInfoSizeW ( LPWSTR filename, LPDWORD handle ) { - DWORD ret, len = WideCharToMultiByte( CP_ACP, 0, filename, -1, NULL, 0, NULL, NULL ); - LPSTR fn = HeapAlloc( GetProcessHeap(), 0, len ); - WideCharToMultiByte( CP_ACP, 0, filename, -1, fn, len, NULL, NULL ); - ret = GetFileVersionInfoSizeA( fn, handle ); - HeapFree( GetProcessHeap(), 0, fn ); - return ret; + DWORD len; + + TRACE("(%s,%p)\n", debugstr_w(filename), handle ); + if ( handle ) *handle = 0; //offset; + + len = VERSION_GetFileVersionInfo_PE ( filename, handle, 0, NULL ); + /* 0xFFFFFFFF means: file exists, but VERSION_INFO not found */ + if ( len == 0xFFFFFFFF ) + { + SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND); + return 0; + } + if ( len ) return (len<<1) + 4; // This matches MS's version.dll behavior, from what I can tell + + /* there used to be a bunch of 16-bit stuff here, but MS's docs say 16-bit not supported */ + + return 0; } /*********************************************************************** - * GetFileVersionInfoA [VERSION.@] + * GetFileVersionInfoSizeA [VERSION.@] */ -BOOL WINAPI GetFileVersionInfoA( LPSTR filename, DWORD handle, - DWORD datasize, LPVOID data ) +DWORD +WINAPI +GetFileVersionInfoSizeA ( LPSTR filename, LPDWORD handle ) { - DWORD len; - - TRACE("(%s,%ld,size=%ld,data=%p)\n", - debugstr_a(filename), handle, datasize, data ); - - len = VERSION_GetFileVersionInfo_PE(filename, &handle, datasize, data); - /* 0xFFFFFFFF means: file exists, but VERSION_INFO not found */ - if(len == 0xFFFFFFFF) return FALSE; - if(len) - goto DO_CONVERT; - len = VERSION_GetFileVersionInfo_16(filename, &handle, datasize, data); - /* 0xFFFFFFFF means: file exists, but VERSION_INFO not found */ - if(len == 0xFFFFFFFF) return FALSE; - if(len) - goto DO_CONVERT; - - if ( !GetFileResource16( filename, MAKEINTRESOURCEA(VS_FILE_INFO), - MAKEINTRESOURCEA(VS_VERSION_INFO), - handle, datasize, data ) ) - return FALSE; -DO_CONVERT: - if ( datasize >= sizeof(VS_VERSION_INFO_STRUCT16) - && datasize >= ((VS_VERSION_INFO_STRUCT16 *)data)->wLength - && !VersionInfoIs16( data ) ) - { - /* convert resource from PE format to NE format */ - ConvertVersionInfo32To16( (VS_VERSION_INFO_STRUCT32 *)data, - (VS_VERSION_INFO_STRUCT16 *)data ); - } - - return TRUE; + LPWSTR filenameW = VERSION_AllocA2W(filename); + DWORD ret = GetFileVersionInfoSizeW ( filenameW, handle ); + VERSION_Free ( filenameW ); + return ret; } /*********************************************************************** * GetFileVersionInfoW [VERSION.@] */ -BOOL WINAPI GetFileVersionInfoW( LPWSTR filename, DWORD handle, - DWORD datasize, LPVOID data ) +BOOL +WINAPI +GetFileVersionInfoW ( + LPWSTR filename, DWORD handle, + DWORD datasize, LPVOID data ) { - DWORD len = WideCharToMultiByte( CP_ACP, 0, filename, -1, NULL, 0, NULL, NULL ); - LPSTR fn = HeapAlloc( GetProcessHeap(), 0, len ); - DWORD retv = TRUE; + DWORD len, extradata; + VS_VERSION_INFO_STRUCT32* vvis = (VS_VERSION_INFO_STRUCT32*)data; - WideCharToMultiByte( CP_ACP, 0, filename, -1, fn, len, NULL, NULL ); + TRACE("(%s,%ld,size=%ld,data=%p)\n", + debugstr_w(filename), handle, datasize, data ); - TRACE("(%s,%ld,size=%ld,data=%p)\n", - debugstr_w(filename), handle, datasize, data ); + len = VERSION_GetFileVersionInfo_PE(filename, &handle, datasize, data); - if(VERSION_GetFileVersionInfo_PE(fn, &handle, datasize, data)) - goto END; - if(VERSION_GetFileVersionInfo_16(fn, &handle, datasize, data)) - goto END; + if ( len == 0xFFFFFFFF ) + return FALSE; - if ( !GetFileResource16( fn, MAKEINTRESOURCEA(VS_FILE_INFO), - MAKEINTRESOURCEA(VS_VERSION_INFO), - handle, datasize, data ) ) - retv = FALSE; + extradata = datasize - vvis->wLength; + memmove ( ((char*)(data))+vvis->wLength, "FE2X", extradata > 4 ? 4 : extradata ); - else if ( datasize >= sizeof(VS_VERSION_INFO_STRUCT16) - && datasize >= ((VS_VERSION_INFO_STRUCT16 *)data)->wLength - && VersionInfoIs16( data ) ) - { - ERR("Cannot access NE resource in %s\n", debugstr_a(fn) ); - retv = FALSE; - } -END: - HeapFree( GetProcessHeap(), 0, fn ); - return retv; + return TRUE; } - /*********************************************************************** - * VersionInfo16_FindChild [internal] + * GetFileVersionInfoA [VERSION.@] */ -static VS_VERSION_INFO_STRUCT16 *VersionInfo16_FindChild( VS_VERSION_INFO_STRUCT16 *info, - LPCSTR szKey, UINT cbKey ) +BOOL +WINAPI +GetFileVersionInfoA ( + LPSTR filename, DWORD handle, + DWORD datasize, LPVOID data ) { - VS_VERSION_INFO_STRUCT16 *child = VersionInfo16_Children( info ); - - while ( (DWORD)child < (DWORD)info + info->wLength ) - { - if ( !strncmp( child->szKey, szKey, cbKey ) ) - return child; - - if (!(child->wLength)) return NULL; - child = VersionInfo16_Next( child ); - } - - return NULL; + LPWSTR filenameW = VERSION_AllocA2W ( filename ); + BOOL ret = GetFileVersionInfoW ( filenameW, handle, datasize, data ); + VERSION_Free ( filenameW ); + return ret; } /*********************************************************************** * VersionInfo32_FindChild [internal] */ -static VS_VERSION_INFO_STRUCT32 *VersionInfo32_FindChild( VS_VERSION_INFO_STRUCT32 *info, - LPCWSTR szKey, UINT cbKey ) +static +VS_VERSION_INFO_STRUCT32* +VersionInfo32_FindChild ( + VS_VERSION_INFO_STRUCT32 *info, + LPCWSTR szKey, UINT cbKey ) { - VS_VERSION_INFO_STRUCT32 *child = VersionInfo32_Children( info ); + VS_VERSION_INFO_STRUCT32 *child = VersionInfo32_Children( info ); - while ( (DWORD)child < (DWORD)info + info->wLength ) - { - if ( !strncmpiW( child->szKey, szKey, cbKey ) ) - return child; + while ( (DWORD)child < (DWORD)info + info->wLength ) + { + if ( !strncmpiW( child->szKey, szKey, cbKey ) ) + return child; - child = VersionInfo32_Next( child ); - } + child = VersionInfo32_Next( child ); + } - return NULL; + return NULL; } -/*********************************************************************** - * VerQueryValueA [VERSION.@] - */ -BOOL WINAPI VerQueryValueA( const LPVOID pBlock, LPSTR lpSubBlock, - LPVOID *lplpBuffer, UINT *puLen ) +static +VS_VERSION_INFO_STRUCT32* +VERSION_VerQueryValue ( VS_VERSION_INFO_STRUCT32* info, LPCWSTR lpSubBlock ) { - VS_VERSION_INFO_STRUCT16 *info = (VS_VERSION_INFO_STRUCT16 *)pBlock; - if ( !VersionInfoIs16( info ) ) - { - INT len; - LPWSTR wide_str; - DWORD give; + while ( *lpSubBlock ) + { + /* Find next path component */ + LPCWSTR lpNextSlash; + for ( lpNextSlash = lpSubBlock; *lpNextSlash; lpNextSlash++ ) + { + if ( *lpNextSlash == '\\' ) + break; + } - /* <lawson_whitney@juno.com> Feb 2001 */ - /* AOL 5.0 does this, expecting to get this: */ - len = MultiByteToWideChar(CP_ACP, 0, lpSubBlock, -1, NULL, 0); - wide_str = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); - MultiByteToWideChar(CP_ACP, 0, lpSubBlock, -1, wide_str, len); + /* Skip empty components */ + if ( lpNextSlash == lpSubBlock ) + { + lpSubBlock++; + continue; + } - give = VerQueryValueW(pBlock, wide_str, lplpBuffer, puLen); - HeapFree(GetProcessHeap(), 0, wide_str); - return give; - } + /* We have a non-empty component: search info for key */ + info = VersionInfo32_FindChild ( info, lpSubBlock, lpNextSlash-lpSubBlock ); + if ( !info ) return NULL; - TRACE("(%p,%s,%p,%p)\n", - pBlock, debugstr_a(lpSubBlock), lplpBuffer, puLen ); - - while ( *lpSubBlock ) - { - /* Find next path component */ - LPSTR lpNextSlash; - for ( lpNextSlash = lpSubBlock; *lpNextSlash; lpNextSlash++ ) - if ( *lpNextSlash == '\\' ) - break; - - /* Skip empty components */ - if ( lpNextSlash == lpSubBlock ) - { - lpSubBlock++; - continue; - } - - /* We have a non-empty component: search info for key */ - info = VersionInfo16_FindChild( info, lpSubBlock, lpNextSlash-lpSubBlock ); - if ( !info ) return FALSE; - - /* Skip path component */ - lpSubBlock = lpNextSlash; - } - - /* Return value */ - *lplpBuffer = VersionInfo16_Value( info ); - *puLen = info->wValueLength; - - return TRUE; + /* Skip path component */ + lpSubBlock = lpNextSlash; + } + return info; } /*********************************************************************** * VerQueryValueW [VERSION.@] */ -BOOL WINAPI VerQueryValueW( const LPVOID pBlock, LPWSTR lpSubBlock, - LPVOID *lplpBuffer, UINT *puLen ) +BOOL +WINAPI +VerQueryValueW ( + const LPVOID pBlock, + LPWSTR lpSubBlock, + LPVOID *lplpBuffer, + UINT *puLen ) { - VS_VERSION_INFO_STRUCT32 *info = (VS_VERSION_INFO_STRUCT32 *)pBlock; - if ( VersionInfoIs16( info ) ) - { - ERR("called on NE resource!\n" ); - return FALSE; - } + VS_VERSION_INFO_STRUCT32 *info = (VS_VERSION_INFO_STRUCT32 *)pBlock; - TRACE("(%p,%s,%p,%p)\n", - pBlock, debugstr_w(lpSubBlock), lplpBuffer, puLen ); + TRACE("(%p,%s,%p,%p)\n", + pBlock, debugstr_a(lpSubBlock), lplpBuffer, puLen ); - while ( *lpSubBlock ) - { - /* Find next path component */ - LPWSTR lpNextSlash; - for ( lpNextSlash = lpSubBlock; *lpNextSlash; lpNextSlash++ ) - if ( *lpNextSlash == '\\' ) - break; + info = VERSION_VerQueryValue ( info, lpSubBlock ); + if ( !info ) + { + // FIXME: what should SetLastError be set to??? + return FALSE; + } - /* Skip empty components */ - if ( lpNextSlash == lpSubBlock ) - { - lpSubBlock++; - continue; - } + *lplpBuffer = VersionInfo32_Value ( info ); + *puLen = info->wValueLength; - /* We have a non-empty component: search info for key */ - info = VersionInfo32_FindChild( info, lpSubBlock, lpNextSlash-lpSubBlock ); - if ( !info ) return FALSE; - - /* Skip path component */ - lpSubBlock = lpNextSlash; - } - - /* Return value */ - *lplpBuffer = VersionInfo32_Value( info ); - *puLen = info->wValueLength; - - return TRUE; + return TRUE; +} + +/*********************************************************************** + * VerQueryValueA [VERSION.@] + */ +BOOL +WINAPI +VerQueryValueA ( + LPVOID pBlock, + LPSTR lpSubBlockA, + LPVOID *lplpBuffer, + UINT *puLen ) +{ + VS_VERSION_INFO_STRUCT32 *info = (VS_VERSION_INFO_STRUCT32 *)pBlock; + LPWSTR lpSubBlockW = VERSION_AllocA2W ( lpSubBlockA ); + + TRACE("(%p,%s,%p,%p)\n", + pBlock, debugstr_a(lpSubBlockA), lplpBuffer, puLen ); + + info = VERSION_VerQueryValue ( info, lpSubBlockW ); + + VERSION_Free ( lpSubBlockW ); + + if ( !info ) + { + // FIXME: what should SetLastError be set to??? + return FALSE; + } + + *lplpBuffer = VersionInfo32_Value ( info ); + *puLen = info->wValueLength; + + if ( info->bText ) + { + LPSTR str = VERSION_AllocW2A ( *lplpBuffer ); + memmove ( *lplpBuffer, str, info->wValueLength + 1 ); + VERSION_Free ( str ); + } + + return TRUE; } From 177645b96cf93193910ddd0944a477ae26caccd6 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Thu, 18 Mar 2004 18:29:19 +0000 Subject: [PATCH 0555/1463] implemented SetFileShortName() svn path=/trunk/; revision=8783 --- reactos/lib/kernel32/file/file.c | 94 ++++++++++++++++++++++++++++++- reactos/lib/kernel32/misc/stubs.c | 30 +--------- 2 files changed, 93 insertions(+), 31 deletions(-) diff --git a/reactos/lib/kernel32/file/file.c b/reactos/lib/kernel32/file/file.c index 330ff3975e6..80d24faea74 100644 --- a/reactos/lib/kernel32/file/file.c +++ b/reactos/lib/kernel32/file/file.c @@ -1,4 +1,4 @@ -/* $Id: file.c,v 1.52 2004/03/18 16:19:25 weiden Exp $ +/* $Id: file.c,v 1.53 2004/03/18 18:29:18 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -1183,7 +1183,7 @@ SetFileValidData( sizeof(FILE_VALID_DATA_LENGTH_INFORMATION), FileValidDataLengthInformation ); - + if (!NT_SUCCESS(Status)){ SetLastErrorByStatus(Status); return FALSE; @@ -1192,4 +1192,94 @@ SetFileValidData( return TRUE; } + +/* + * @implemented + */ +BOOL +STDCALL +SetFileShortNameW( + HANDLE hFile, + LPCWSTR lpShortName) +{ + NTSTATUS Status; + ULONG NeededSize; + UNICODE_STRING ShortName; + IO_STATUS_BLOCK IoStatusBlock; + PFILE_NAME_INFORMATION FileNameInformation; + + if(!lpShortName) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + RtlInitUnicodeString(&ShortName, lpShortName); + + NeededSize = sizeof(FILE_NAME_INFORMATION) + ShortName.Length + sizeof(WCHAR); + if(!(FileNameInformation = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, NeededSize))) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + + FileNameInformation->FileNameLength = ShortName.Length; + RtlCopyMemory(FileNameInformation->FileName, ShortName.Buffer, ShortName.Length); + + Status = NtSetInformationFile(hFile, + &IoStatusBlock, //out + FileNameInformation, + NeededSize, + FileShortNameInformation); + + RtlFreeHeap(RtlGetProcessHeap(), 0, FileNameInformation); + if(!NT_SUCCESS(Status)) + { + + SetLastErrorByStatus(Status); + } + + return NT_SUCCESS(Status); +} + + +/* + * @implemented + */ +BOOL +STDCALL +SetFileShortNameA( + HANDLE hFile, + LPCSTR lpShortName + ) +{ + NTSTATUS Status; + BOOL Ret; + ANSI_STRING ShortNameA; + UNICODE_STRING ShortName; + + if(!lpShortName) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + RtlInitAnsiString(&ShortNameA, (LPSTR)lpShortName); + + if(bIsFileApiAnsi) + Status = RtlAnsiStringToUnicodeString(&ShortName, &ShortNameA, TRUE); + else + Status = RtlOemStringToUnicodeString(&ShortName, &ShortNameA, TRUE); + if(!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return FALSE; + } + + Ret = SetFileShortNameW(hFile, ShortName.Buffer); + + RtlFreeUnicodeString(&ShortName); + return Ret; +} + /* EOF */ diff --git a/reactos/lib/kernel32/misc/stubs.c b/reactos/lib/kernel32/misc/stubs.c index df17c38f70a..dbc3daf39ba 100644 --- a/reactos/lib/kernel32/misc/stubs.c +++ b/reactos/lib/kernel32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.69 2004/03/18 16:19:26 weiden Exp $ +/* $Id: stubs.c,v 1.70 2004/03/18 18:29:19 weiden Exp $ * * KERNEL32.DLL stubs (unimplemented functions) * Remove from this file, if you implement them. @@ -1880,20 +1880,6 @@ SetDllDirectoryW( return 0; } -/* - * @unimplemented - */ -BOOL -STDCALL -SetFileShortNameW( - HANDLE hFile, - LPCWSTR lpShortName - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented */ @@ -2254,20 +2240,6 @@ SetDllDirectoryA( return 0; } -/* - * @unimplemented - */ -BOOL -STDCALL -SetFileShortNameA( - HANDLE hFile, - LPCSTR lpShortName - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented */ From 5ab4f36e65a480c247985fcba14e4b53e35152bd Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Thu, 18 Mar 2004 19:58:35 +0000 Subject: [PATCH 0556/1463] - Fixed crash on reboot. Sorry. svn path=/trunk/; revision=8784 --- reactos/hal/halx86/halinit.c | 8 +++++++- reactos/hal/halx86/reboot.c | 10 ++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/reactos/hal/halx86/halinit.c b/reactos/hal/halx86/halinit.c index 696381ab01b..c1986c12948 100644 --- a/reactos/hal/halx86/halinit.c +++ b/reactos/hal/halx86/halinit.c @@ -1,4 +1,4 @@ -/* $Id: halinit.c,v 1.6 2003/09/02 20:11:43 ea Exp $ +/* $Id: halinit.c,v 1.7 2004/03/18 19:58:35 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -22,6 +22,10 @@ #define NDEBUG #include <internal/debug.h> +/* GLOBALS *****************************************************************/ + +PVOID HalpZeroPageMapping = NULL; + /* FUNCTIONS ***************************************************************/ NTSTATUS @@ -68,6 +72,8 @@ HalInitSystem (ULONG BootPhase, { /* Go to blue screen */ HalClearDisplay (0x17); /* grey on blue */ + + HalpZeroPageMapping = MmMapIoSpace((LARGE_INTEGER)0LL, PAGE_SIZE, FALSE); } return TRUE; diff --git a/reactos/hal/halx86/reboot.c b/reactos/hal/halx86/reboot.c index ca7a1c27098..20aa51cd9c9 100644 --- a/reactos/hal/halx86/reboot.c +++ b/reactos/hal/halx86/reboot.c @@ -1,4 +1,4 @@ -/* $Id: reboot.c,v 1.5 2003/12/28 22:38:09 fireball Exp $ +/* $Id: reboot.c,v 1.6 2004/03/18 19:58:35 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -18,13 +18,11 @@ static VOID HalReboot (VOID) { char data; - BYTE *mem; + extern PVOID HalpZeroPageMapping; /* enable warm reboot */ - mem = (BYTE *)(0xd0000000 + 0x0000); -// mem = HalMapPhysicalMemory (0, 1); - mem[0x472] = 0x34; - mem[0x473] = 0x12; + ((PUCHAR)HalpZeroPageMapping)[0x472] = 0x34; + ((PUCHAR)HalpZeroPageMapping)[0x473] = 0x12; /* disable interrupts */ #if defined(__GNUC__) From 3398afcf639818da67875632d5c7833ea3a4bc52 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III <royce3@ev1.net> Date: Thu, 18 Mar 2004 22:03:40 +0000 Subject: [PATCH 0557/1463] simple hack to keep winzip from bugchecking us svn path=/trunk/; revision=8786 --- reactos/subsys/win32k/objects/text.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index ffa074a5a05..b234d33940d 100644 --- a/reactos/subsys/win32k/objects/text.c +++ b/reactos/subsys/win32k/objects/text.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: text.c,v 1.80 2004/03/17 20:57:06 weiden Exp $ */ +/* $Id: text.c,v 1.81 2004/03/18 22:03:40 royce Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -685,8 +685,13 @@ NtGdiExtTextOut( /* Create the brushes */ PalDestGDI = PALETTE_LockPalette(dc->w.hPalette); - Mode = PalDestGDI->Mode; - PALETTE_UnlockPalette(dc->w.hPalette); + if ( !PalDestGDI ) + Mode = PAL_RGB; + else + { + Mode = PalDestGDI->Mode; + PALETTE_UnlockPalette(dc->w.hPalette); + } XlateObj = (PXLATEOBJ)IntEngCreateXlate(Mode, PAL_RGB, dc->w.hPalette, NULL); hBrushFg = NtGdiCreateSolidBrush(XLATEOBJ_iXlate(XlateObj, dc->w.textColor)); BrushFg = BRUSHOBJ_LockBrush(hBrushFg); From f3eb637ea48bdab76a082eefe40e02a00553f83e Mon Sep 17 00:00:00 2001 From: Aleksey Bragin <aleksey@reactos.org> Date: Fri, 19 Mar 2004 06:11:28 +0000 Subject: [PATCH 0558/1463] Committing my in-progress work with mmdrv, but it's still incomplete, and it still contains MS-specific things (in comments only!). svn path=/trunk/; revision=8787 --- reactos/lib/mmdrv/Makefile | 1 + reactos/lib/mmdrv/entry.c | 71 +------ reactos/lib/mmdrv/midi.c | 45 ++++- reactos/lib/mmdrv/mmdrv.h | 4 +- reactos/lib/mmdrv/utils.c | 2 +- reactos/lib/mmdrv/wave.c | 366 ++++++++++++++++++++----------------- reactos/lib/mmdrv/wave.h | 80 ++++++++ 7 files changed, 332 insertions(+), 237 deletions(-) create mode 100644 reactos/lib/mmdrv/wave.h diff --git a/reactos/lib/mmdrv/Makefile b/reactos/lib/mmdrv/Makefile index 9d5e88eb6e7..7f1ab6cbf92 100644 --- a/reactos/lib/mmdrv/Makefile +++ b/reactos/lib/mmdrv/Makefile @@ -17,6 +17,7 @@ TARGET_LFLAGS = TARGET_SDKLIBS = winmm.a TARGET_OBJECTS = \ + auxil.o \ entry.o \ midi.o \ utils.o \ diff --git a/reactos/lib/mmdrv/entry.c b/reactos/lib/mmdrv/entry.c index 29de81ba565..09428ed81c3 100644 --- a/reactos/lib/mmdrv/entry.c +++ b/reactos/lib/mmdrv/entry.c @@ -1,12 +1,14 @@ /* * * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel + * PROJECT: ReactOS Multimedia * FILE: lib/mmdrv/entry.c * PURPOSE: Multimedia User Mode Driver * PROGRAMMER: Andrew Greenwood + * Aleksey Bragin * UPDATE HISTORY: - * Jan 30, 2004: Imported into ReactOS tree + * Jan 30, 2004: Imported into ReactOS tree (Greenwood) + * Mar 16, 2004: Cleaned up a bit (Bragin) */ @@ -129,67 +131,4 @@ BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD Reason, LPVOID Reserved) return TRUE; } - - -/* -EXPORT DWORD midMessage(DWORD id, DWORD msg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2) -{ - printf("midMessage\n"); - - switch (msg) { - - case MIDM_GETNUMDEVS: - printf("MIDM_GETNUMDEVS"); - return GetNumDevs(MidiInDevice); - - case MIDM_GETDEVCAPS: - printf("MIDM_GETDEVCAPS"); - return MMSYSERR_NOERROR; - - case MIDM_OPEN: - printf("MIDM_OPEN"); - return MMSYSERR_NOERROR; - - case MIDM_CLOSE: - printf("MIDM_CLOSE"); - return MMSYSERR_NOERROR; - - case MIDM_ADDBUFFER: - printf("MIDM_ADDBUFFER"); - return MMSYSERR_NOERROR; - - case MIDM_STOP: - printf("MIDM_PAUSE"); - return MMSYSERR_NOERROR; - - case MIDM_START: - printf("MIDM_RESTART"); - return MMSYSERR_NOERROR; - - case MIDM_RESET: - printf("MIDM_RESET"); - return MMSYSERR_NOERROR; - - default: - return MMSYSERR_NOTSUPPORTED; - } - - // - // Should not get here - // - - return MMSYSERR_NOTSUPPORTED; -} -*/ - - -APIENTRY DWORD auxMessage(UINT uDevice, - UINT uMsg, - DWORD dwUser, - DWORD dwParam1, - DWORD dwParam2) - -{ - printf("auxMessage\n"); - return MMSYSERR_NOERROR; -} +/* EOF */ diff --git a/reactos/lib/mmdrv/midi.c b/reactos/lib/mmdrv/midi.c index 9cae3d1b5cd..083c38c12e2 100644 --- a/reactos/lib/mmdrv/midi.c +++ b/reactos/lib/mmdrv/midi.c @@ -1,7 +1,7 @@ /* * * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel + * PROJECT: ReactOS Multimedia * FILE: lib/mmdrv/midi.c * PURPOSE: Multimedia User Mode Driver * PROGRAMMER: Andrew Greenwood @@ -172,10 +172,51 @@ static int GetMidiLength(PMIDIALLOC pClient, BYTE b) Exported functions ----------------------------------------------------------------------------- */ -APIENTRY DWORD midMessage(DWORD ID, DWORD Message, DWORD User, DWORD Param1, DWORD Param2) +APIENTRY DWORD midMessage(DWORD dwId, DWORD dwMessage, DWORD dwUser, DWORD dwParam1, DWORD dwParam2) { printf("midMessage\n"); return MMSYSERR_NOERROR; + + switch (dwMessage) { + case MIDM_GETNUMDEVS: + printf("MIDM_GETNUMDEVS"); + return 0; + + case MIDM_GETDEVCAPS: + printf("MIDM_GETDEVCAPS"); + return MMSYSERR_NOERROR; + + case MIDM_OPEN: + printf("MIDM_OPEN"); + return MMSYSERR_NOERROR; + + case MIDM_CLOSE: + printf("MIDM_CLOSE"); + return MMSYSERR_NOERROR; + + case MIDM_ADDBUFFER: + printf("MIDM_ADDBUFFER"); + return MMSYSERR_NOERROR; + + case MIDM_STOP: + printf("MIDM_PAUSE"); + return MMSYSERR_NOERROR; + + case MIDM_START: + printf("MIDM_RESTART"); + return MMSYSERR_NOERROR; + + case MIDM_RESET: + printf("MIDM_RESET"); + return MMSYSERR_NOERROR; + + default: + return MMSYSERR_NOTSUPPORTED; + } + + // the function should never get to this point + //FIXME: Would it be wise to assert here? + return MMSYSERR_NOTSUPPORTED; } APIENTRY DWORD modMessage(DWORD ID, DWORD Message, DWORD User, DWORD Param1, DWORD Param2) diff --git a/reactos/lib/mmdrv/mmdrv.h b/reactos/lib/mmdrv/mmdrv.h index a018d5554e0..6891333fadb 100644 --- a/reactos/lib/mmdrv/mmdrv.h +++ b/reactos/lib/mmdrv/mmdrv.h @@ -1,10 +1,11 @@ /* * * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel + * PROJECT: ReactOS Multimedia * FILE: lib/mmdrv/mmdrv.h * PURPOSE: Multimedia User Mode Driver (header) * PROGRAMMER: Andrew Greenwood + * Aleksey Bragin * UPDATE HISTORY: * Jan 30, 2004: Imported into ReactOS tree */ @@ -102,7 +103,6 @@ HANDLE Heap; AuxDevice }; - MMRESULT OpenDevice(UINT DeviceType, DWORD ID, PHANDLE pDeviceHandle, DWORD Access); diff --git a/reactos/lib/mmdrv/utils.c b/reactos/lib/mmdrv/utils.c index cc38d23c7c9..e335d53b581 100644 --- a/reactos/lib/mmdrv/utils.c +++ b/reactos/lib/mmdrv/utils.c @@ -1,7 +1,7 @@ /* * * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel + * PROJECT: ReactOS Multimedia * FILE: lib/mmdrv/utils.c * PURPOSE: Multimedia User Mode Driver (utility functions) * PROGRAMMER: Andrew Greenwood diff --git a/reactos/lib/mmdrv/wave.c b/reactos/lib/mmdrv/wave.c index 4cd1b62bedb..d3f3d1cbc38 100644 --- a/reactos/lib/mmdrv/wave.c +++ b/reactos/lib/mmdrv/wave.c @@ -1,16 +1,24 @@ /* * * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel + * PROJECT: ReactOS Multimedia * FILE: lib/mmdrv/wave.c * PURPOSE: Multimedia User Mode Driver * PROGRAMMER: Andrew Greenwood + * Aleksey Bragin (aleksey at studiocerebral.com) * UPDATE HISTORY: - * Jan 30, 2004: Imported into ReactOS tree + * Jan 30, 2004: Imported into ReactOS tree (Greenwood) + * Mar 16, 2004: Implemented some funcs (Bragin) */ #include "mmdrv.h" +#include "wave.h" +/* ============================ + * INTERNAL + * functions start here + * ============================ + */ static MMRESULT GetDeviceCapabilities(DWORD ID, UINT DeviceType, LPBYTE pCaps, DWORD Size) @@ -47,233 +55,259 @@ static MMRESULT GetDeviceCapabilities(DWORD ID, UINT DeviceType, return Result; } - -APIENTRY DWORD wodMessage(DWORD ID, DWORD Message, DWORD User, DWORD Param1, DWORD Param2) +static MMRESULT OpenWaveDevice(UINT DeviceType, + DWORD id, + DWORD dwUser, + DWORD dwParam1, + DWORD dwParam2) { -// PWAVEALLOC pOutClient; - MMRESULT Result; + // TODO: Implement + return MMSYSERR_NOERROR; +} - switch (Message) { +//FIXME: Params are MS-specific +static MMRESULT ThreadCallWaveDevice(WAVETHREADFUNCTION Function, PWAVEALLOC pClient) +{ + return MMSYSERR_NOERROR; +} + +//FIXME: Params are MS-specific +static void CallbackWaveDevice(PWAVEALLOC pWave, DWORD msg, DWORD dw1) +{ +} + +//FIXME: Params are MS-specific +static MMRESULT WriteWaveDevice(LPWAVEHDR pHdr, PWAVEALLOC pClient) +{ + return MMSYSERR_NOERROR; +} + +//FIXME: MS-specific code, except for name of the func! +MMRESULT GetPositionWaveDevice(PWAVEALLOC pClient, LPMMTIME lpmmt, DWORD dwSize) +{ + /* + WAVE_DD_POSITION PositionData; + MMRESULT mErr; + + if (dwSize < sizeof(MMTIME)) + return MMSYSERR_ERROR; + + // + // Get the current position from the driver + // + mErr = sndGetHandleData(pClient->hDev, + sizeof(PositionData), + &PositionData, + IOCTL_WAVE_GET_POSITION, + pClient->Event); + + if (mErr == MMSYSERR_NOERROR) { + if (lpmmt->wType == TIME_BYTES) { + lpmmt->u.cb = PositionData.ByteCount; + } + + // default is samples. + else { + lpmmt->wType = TIME_SAMPLES; + lpmmt->u.sample = PositionData.SampleCount; + } + } + + return mErr;*/ return MMSYSERR_NOERROR; +} + +//FIXME: Params are MS-specific +MMRESULT soundSetData(UINT DeviceType, UINT DeviceId, UINT Length, PBYTE Data, + ULONG Ioctl) +{ + return MMSYSERR_NOERROR; +} + +//FIXME: Params are MS-specific +MMRESULT soundGetData(UINT DeviceType, UINT DeviceId, UINT Length, PBYTE Data, + ULONG Ioctl) +{ + return MMSYSERR_NOERROR; +} + + +/* ============================ + * EXPORT + * functions start here + * ============================ + */ + +/* + * @implemented + */ +APIENTRY DWORD wodMessage(DWORD dwId, DWORD dwMessage, DWORD dwUser, DWORD dwParam1, DWORD dwParam2) +{ + switch (dwMessage) { case WODM_GETNUMDEVS: - printf(("WODM_GETNUMDEVS")); + printf("WODM_GETNUMDEVS"); return GetDeviceCount(WaveOutDevice); case WODM_GETDEVCAPS: - printf(("WODM_GETDEVCAPS")); - return GetDeviceCapabilities(ID, WaveOutDevice, (LPBYTE)Param1, - (DWORD)Param2); + printf("WODM_GETDEVCAPS"); + return GetDeviceCapabilities(dwId, WaveOutDevice, (LPBYTE)dwParam1, + (DWORD)dwParam2); case WODM_OPEN: - printf(("WODM_OPEN")); -// return waveOpen(WaveOutDevice, id, dwUser, dwParam1, dwParam2); + printf("WODM_OPEN"); + return OpenWaveDevice(WaveOutDevice, dwId, dwUser, dwParam1, dwParam2); case WODM_CLOSE: - printf(("WODM_CLOSE")); -// pOutClient = (PWAVEALLOC)dwUser; + { + MMRESULT Result; + PWAVEALLOC pTask = (PWAVEALLOC)dwUser; + printf("WODM_CLOSE"); - // - // Call our task to see if it's ready to complete - // -// Result = waveThreadCall(WaveThreadClose, pOutClient); - if (Result != MMSYSERR_NOERROR) { - return Result; - } + // 1. Check if the task is ready to complete + Result = ThreadCallWaveDevice(WaveThreadClose, pTask); + if (Result != MMSYSERR_NOERROR) { + return Result; + } + else + CallbackWaveDevice(pTask, WOM_CLOSE, 0L); + + // 2. Close the device + if (pTask->hDev != INVALID_HANDLE_VALUE) { + CloseHandle(pTask->hDev); -// waveCallback(pOutClient, WOM_CLOSE, 0L); + EnterCriticalSection(&CS); + pTask->hDev = INVALID_HANDLE_VALUE; + LeaveCriticalSection(&CS); + } - // - // Close our device - // -// if (pOutClient->hDev != INVALID_HANDLE_VALUE) { -// CloseHandle(pOutClient->hDev); - - EnterCriticalSection(&CS); -// pOutClient->hDev = INVALID_HANDLE_VALUE; - LeaveCriticalSection(&CS); -// } - - return MMSYSERR_NOERROR; + return MMSYSERR_NOERROR; + }; case WODM_WRITE: - printf(("WODM_WRITE")); -/* WinAssert(dwParam1 != 0); - WinAssert(!(((LPWAVEHDR)dwParam1)->dwFlags & - ~(WHDR_INQUEUE|WHDR_DONE|WHDR_PREPARED| - WHDR_BEGINLOOP|WHDR_ENDLOOP))); + { + LPWAVEHDR pWaveHdr = (LPWAVEHDR)dwParam1; - ((LPWAVEHDR)dwParam1)->dwFlags &= - (WHDR_INQUEUE|WHDR_DONE|WHDR_PREPARED| - WHDR_BEGINLOOP|WHDR_ENDLOOP); + printf("WODM_WRITE"); - WinAssert(((LPWAVEHDR)dwParam1)->dwFlags & WHDR_PREPARED); + if (dwParam1 != 0) + return MMSYSERR_INVALPARAM; - // check if it's been prepared - if (!(((LPWAVEHDR)dwParam1)->dwFlags & WHDR_PREPARED)) - return WAVERR_UNPREPARED; + if ((pWaveHdr->dwFlags & ~(WHDR_INQUEUE|WHDR_DONE|WHDR_PREPARED|WHDR_BEGINLOOP|WHDR_ENDLOOP))) + return MMSYSERR_INVALPARAM; - WinAssert(!(((LPWAVEHDR)dwParam1)->dwFlags & WHDR_INQUEUE)); + pWaveHdr->dwFlags &= (WHDR_INQUEUE|WHDR_DONE|WHDR_PREPARED|WHDR_BEGINLOOP|WHDR_ENDLOOP); - // if it is already in our Q, then we cannot do this - if ( ((LPWAVEHDR)dwParam1)->dwFlags & WHDR_INQUEUE ) - return ( WAVERR_STILLPLAYING ); + if ((pWaveHdr->dwFlags & WHDR_PREPARED) == 0) + return MMSYSERR_INVALPARAM; - // store the pointer to my WAVEALLOC structure in the wavehdr - pOutClient = (PWAVEALLOC)dwUser; - ((LPWAVEHDR)dwParam1)->reserved = (DWORD)(LPSTR)pOutClient; + // Check, if the wave header is already prepared + if (!(pWaveHdr->dwFlags & WHDR_PREPARED)) + return WAVERR_UNPREPARED; + + // If it's already located in the queue, this op is impossible + if (pWaveHdr->dwFlags & WHDR_INQUEUE ) + return ( WAVERR_STILLPLAYING ); + + // save WAVEALLOC pointer in the WaveHeader + pWaveHdr->reserved = dwUser; + + return WriteWaveDevice(pWaveHdr, (PWAVEALLOC)dwUser); + } - return waveWrite((LPWAVEHDR)dwParam1, pOutClient); -*/ case WODM_PAUSE: - printf(("WODM_PAUSE")); -/* - pOutClient = (PWAVEALLOC)dwUser; - pOutClient->AuxParam.State = WAVE_DD_STOP; - return waveThreadCall(WaveThreadSetState, pOutClient); -*/ + printf("WODM_PAUSE"); + ((PWAVEALLOC)dwUser)->AuxParam.State = WAVE_DD_STOP; + return ThreadCallWaveDevice(WaveThreadSetState, (PWAVEALLOC)dwUser); case WODM_RESTART: - printf(("WODM_RESTART")); -/* - pOutClient = (PWAVEALLOC)dwUser; - pOutClient->AuxParam.State = WAVE_DD_PLAY; - return waveThreadCall(WaveThreadSetState, pOutClient); -*/ + printf("WODM_RESTART"); + ((PWAVEALLOC)dwUser)->AuxParam.State = WAVE_DD_PLAY; + return ThreadCallWaveDevice(WaveThreadSetState, (PWAVEALLOC)dwUser); case WODM_RESET: - printf(("WODM_RESET")); - -/* - pOutClient = (PWAVEALLOC)dwUser; - pOutClient->AuxParam.State = WAVE_DD_RESET; - return waveThreadCall(WaveThreadSetState, pOutClient); -*/ + printf("WODM_RESET"); + ((PWAVEALLOC)dwUser)->AuxParam.State = WAVE_DD_RESET; + return ThreadCallWaveDevice(WaveThreadSetState, (PWAVEALLOC)dwUser); case WODM_BREAKLOOP: -/* - pOutClient = (PWAVEALLOC)dwUser; - printf(("WODM_BREAKLOOP")); - return waveThreadCall(WaveThreadBreakLoop, pOutClient); -*/ - + printf("WODM_BREAKLOOP"); + return ThreadCallWaveDevice(WaveThreadBreakLoop, (PWAVEALLOC)dwUser); case WODM_GETPOS: - printf(("WODM_GETPOS")); - /* - pOutClient = (PWAVEALLOC)dwUser; - return waveGetPos(pOutClient, (LPMMTIME)dwParam1, dwParam2); - */ + printf("WODM_GETPOS"); + return GetPositionWaveDevice(((PWAVEALLOC)dwUser), (LPMMTIME)dwParam1, dwParam2); case WODM_SETPITCH: - printf(("WODM_SETPITCH")); - /* - pOutClient = (PWAVEALLOC)dwUser; - pOutClient->AuxParam.GetSetData.pData = (PBYTE)&dwParam1; - pOutClient->AuxParam.GetSetData.DataLen = sizeof(DWORD); - pOutClient->AuxParam.GetSetData.Function = IOCTL_WAVE_SET_PITCH; - return waveThreadCall(WaveThreadSetData, pOutClient); - */ + printf("WODM_SETPITCH"); + ((PWAVEALLOC)dwUser)->AuxParam.GetSetData.pData = (PBYTE)&dwParam1; + ((PWAVEALLOC)dwUser)->AuxParam.GetSetData.DataLen = sizeof(DWORD); + ((PWAVEALLOC)dwUser)->AuxParam.GetSetData.Function = IOCTL_WAVE_SET_PITCH; + return ThreadCallWaveDevice(WaveThreadSetData, ((PWAVEALLOC)dwUser)); case WODM_SETVOLUME: - printf(("WODM_SETVOLUME"));// i didnt do this - AG - //pOutClient = (PWAVEALLOC)dwUser; - //pOutClient->AuxParam.GetSetData.pData = *(PBYTE *)&dwParam1; - //pOutClient->AuxParam.GetSetData.DataLen = sizeof(DWORD); - //pOutClient->AuxParam.GetSetData.Function = IOCTL_WAVE_SET_VOLUME; - //return waveThreadCall(WaveThreadSetData, pOutClient); - + printf("WODM_SETVOLUME"); { - // - // Translate to device volume structure - // + WAVE_DD_VOLUME Vol; + Vol.Left = LOWORD(dwParam1) << 16; + Vol.Right = HIWORD(dwParam1) << 16; -// WAVE_DD_VOLUME Volume; -// Volume.Left = LOWORD(dwParam1) << 16; -// Volume.Right = HIWORD(dwParam1) << 16; - -// return sndSetData(WaveOutDevice, id, sizeof(Volume), -// (PBYTE)&Volume, IOCTL_WAVE_SET_VOLUME); + return soundSetData(WaveOutDevice, dwId, sizeof(Vol), + (PBYTE)&Vol, IOCTL_WAVE_SET_VOLUME); } - case WODM_SETPLAYBACKRATE: - /* - printf(("WODM_SETPLAYBACKRATE")); - pOutClient = (PWAVEALLOC)dwUser; - pOutClient->AuxParam.GetSetData.pData = (PBYTE)&dwParam1; - pOutClient->AuxParam.GetSetData.DataLen = sizeof(DWORD); - pOutClient->AuxParam.GetSetData.Function = - IOCTL_WAVE_SET_PLAYBACK_RATE; - return waveThreadCall(WaveThreadSetData, pOutClient); - */ + printf("WODM_SETPLAYBACKRATE"); + ((PWAVEALLOC)dwUser)->AuxParam.GetSetData.pData = (PBYTE)&dwParam1; + ((PWAVEALLOC)dwUser)->AuxParam.GetSetData.DataLen = sizeof(DWORD); + ((PWAVEALLOC)dwUser)->AuxParam.GetSetData.Function = IOCTL_WAVE_SET_PLAYBACK_RATE; + return ThreadCallWaveDevice(WaveThreadSetData, (PWAVEALLOC)dwUser); case WODM_GETPITCH: - /* - printf(("WODM_GETPITCH")); - pOutClient = (PWAVEALLOC)dwUser; - pOutClient->AuxParam.GetSetData.pData = (PBYTE)dwParam1; - pOutClient->AuxParam.GetSetData.DataLen = sizeof(DWORD); - pOutClient->AuxParam.GetSetData.Function = IOCTL_WAVE_GET_PITCH; - return waveThreadCall(WaveThreadGetData, pOutClient); - */ + printf("WODM_GETPITCH"); + ((PWAVEALLOC)dwUser)->AuxParam.GetSetData.pData = (PBYTE)dwParam1; + ((PWAVEALLOC)dwUser)->AuxParam.GetSetData.DataLen = sizeof(DWORD); + ((PWAVEALLOC)dwUser)->AuxParam.GetSetData.Function = IOCTL_WAVE_GET_PITCH; + return ThreadCallWaveDevice(WaveThreadGetData, (PWAVEALLOC)dwUser); case WODM_GETVOLUME: - printf(("WODM_GETVOLUME")); - //pOutClient = (PWAVEALLOC)dwUser; - //pOutClient->AuxParam.GetSetData.pData = *(PBYTE *)&dwParam1; - //pOutClient->AuxParam.GetSetData.DataLen = sizeof(DWORD); - //pOutClient->AuxParam.GetSetData.Function = IOCTL_WAVE_GET_VOLUME; - //return waveThreadCall(WaveThreadGetData, pOutClient); - + printf("WODM_GETVOLUME"); { - // - // Translate to device volume structure - // -/* - WAVE_DD_VOLUME Volume; - DWORD rc; + WAVE_DD_VOLUME Vol; + DWORD res; - rc = sndGetData(WaveOutDevice, id, sizeof(Volume), - (PBYTE)&Volume, IOCTL_WAVE_GET_VOLUME); + res = soundGetData(WaveOutDevice, dwId, sizeof(Vol), + (PBYTE)&Vol, IOCTL_WAVE_GET_VOLUME); - if (rc == MMSYSERR_NOERROR) { - *(LPDWORD)dwParam1 = - (DWORD)MAKELONG(HIWORD(Volume.Left), - HIWORD(Volume.Right)); - } - - return rc; - */ + if (res == MMSYSERR_NOERROR) + *(LPDWORD)dwParam1 = (DWORD)MAKELONG(HIWORD(Vol.Left), HIWORD(Vol.Right)); + + return res; } case WODM_GETPLAYBACKRATE: - printf(("WODM_GETPLAYBACKRATE")); - /* - pOutClient = (PWAVEALLOC)dwUser; - pOutClient->AuxParam.GetSetData.pData = (PBYTE)dwParam1; - pOutClient->AuxParam.GetSetData.DataLen = sizeof(DWORD); - pOutClient->AuxParam.GetSetData.Function = - IOCTL_WAVE_GET_PLAYBACK_RATE; - return waveThreadCall(WaveThreadGetData, pOutClient); - */ + printf("WODM_GETPLAYBACKRATE"); + ((PWAVEALLOC)dwUser)->AuxParam.GetSetData.pData = (PBYTE)dwParam1; + ((PWAVEALLOC)dwUser)->AuxParam.GetSetData.DataLen = sizeof(DWORD); + ((PWAVEALLOC)dwUser)->AuxParam.GetSetData.Function = IOCTL_WAVE_GET_PLAYBACK_RATE; + return ThreadCallWaveDevice(WaveThreadGetData, (PWAVEALLOC)dwUser); default: return MMSYSERR_NOTSUPPORTED; } - // - // Should not get here - // - + // This point of execution should never be reached return MMSYSERR_NOTSUPPORTED; } -APIENTRY DWORD widMessage(DWORD id, DWORD msg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2) +/* + * @unimplemented + */ +APIENTRY DWORD widMessage(DWORD dwId, DWORD dwMessage, DWORD dwUser, DWORD dwParam1, DWORD dwParam2) { printf("widMessage\n"); - switch (msg) { + switch (dwMessage) { case WIDM_GETNUMDEVS: return GetDeviceCount(WaveInDevice); default : diff --git a/reactos/lib/mmdrv/wave.h b/reactos/lib/mmdrv/wave.h new file mode 100644 index 00000000000..97f9d9ad82b --- /dev/null +++ b/reactos/lib/mmdrv/wave.h @@ -0,0 +1,80 @@ + +// FIXME: Should be moved somewhere else? +typedef struct _WAVE_DD_VOLUME { + ULONG Left; + ULONG Right; +} WAVE_DD_VOLUME, *PWAVE_DD_VOLUME; + +// driver +#define WAVE_DD_STOP 0x0001 +#define WAVE_DD_PLAY 0x0002 // output devices only +#define WAVE_DD_RECORD 0x0003 // input devices only +#define WAVE_DD_RESET 0x0004 + +// ioctl +#define WAVE_DD_IDLE 0x0000 +#define WAVE_DD_STOPPED 0x0001 // stopped +#define WAVE_DD_PLAYING 0x0002 // output devices only +#define WAVE_DD_RECORDING 0x0003 // input devices only + + + +typedef enum { + WaveThreadInvalid, + WaveThreadAddBuffer, + WaveThreadSetState, + WaveThreadSetData, + WaveThreadGetData, + WaveThreadBreakLoop, + WaveThreadClose, + WaveThreadTerminate +} WAVETHREADFUNCTION; + +// WARNING: MS code below!! +typedef struct { + OVERLAPPED Ovl; + LPWAVEHDR WaveHdr; +} WAVEOVL, *PWAVEOVL; + +// WARNING: MS code below!! +// per allocation structure for wave +typedef struct tag_WAVEALLOC { + struct tag_WAVEALLOC *Next; // Chaining + UINT DeviceNumber; // Which device + UINT DeviceType; // WaveInput or WaveOutput + DWORD dwCallback; // client's callback + DWORD dwInstance; // client's instance data + DWORD dwFlags; // Open flags + HWAVE hWave; // handle for stream + + HANDLE hDev; // Wave device handle + LPWAVEHDR DeviceQueue; // Buffers queued by application + LPWAVEHDR NextBuffer; // Next buffer to send to device + DWORD BufferPosition; // How far we're into a large buffer + DWORD BytesOutstanding; + // Bytes being processed by device + LPWAVEHDR LoopHead; // Start of loop if any + DWORD LoopCount; // Number more loops to go + + WAVEOVL DummyWaveOvl; // For break loop + // + HANDLE Event; // Event for driver syncrhonization + // and notification of auxiliary + // task operation completion. + WAVETHREADFUNCTION AuxFunction; // Function for thread to perform + union { + LPWAVEHDR pHdr; // Buffer to pass in aux task + ULONG State; // State to set + struct { + ULONG Function; // IOCTL to use + PBYTE pData; // Data to set or get + ULONG DataLen; // Length of data + } GetSetData; + + } AuxParam; + // 0 means terminate task. + HANDLE AuxEvent1; // Aux thread waits on this + HANDLE AuxEvent2; // Caller of Aux thread waits on this + HANDLE ThreadHandle; // Handle for thread termination ONLY + MMRESULT AuxReturnCode; // Return code from Aux task +}WAVEALLOC, *PWAVEALLOC; From 494bb081b9186c6244341091681882b591bb09e6 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Fri, 19 Mar 2004 09:18:52 +0000 Subject: [PATCH 0559/1463] merge WineHQ commit: Rein Klazes <rklazes@xs4all.nl> In SHELL_ExecuteW, if a new current directory is specified, change to it before calling CreateProcess so that it will find the correct executable. Patch: http://cvs.winehq.org/patch.py?id=11578 svn path=/trunk/; revision=8788 --- reactos/lib/shell32/shlexec.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/reactos/lib/shell32/shlexec.c b/reactos/lib/shell32/shlexec.c index 920185624c6..8b47d8bdf57 100644 --- a/reactos/lib/shell32/shlexec.c +++ b/reactos/lib/shell32/shlexec.c @@ -301,9 +301,18 @@ static UINT SHELL_ExecuteW(const WCHAR *lpCmd, void *env, BOOL shWait, STARTUPINFOW startup; PROCESS_INFORMATION info; UINT retval = 31; + UINT gcdret = 0; + WCHAR curdir[MAX_PATH]; TRACE("Execute %s from directory %s\n", debugstr_w(lpCmd), debugstr_w(psei->lpDirectory)); + /* ShellExecute specifies the command from psei->lpDirectory + * if present. Not from the current dir as CreateProcess does */ + if( psei->lpDirectory && psei->lpDirectory[0] ) + if( ( gcdret = GetCurrentDirectoryW( MAX_PATH, curdir))) + if( !SetCurrentDirectoryW( psei->lpDirectory)) + ERR("cannot set directory %s\n", debugstr_w(psei->lpDirectory)); + ZeroMemory(&startup, sizeof(startup)); startup.cb = sizeof(STARTUPINFOW); startup.dwFlags = STARTF_USESHOWWINDOW; @@ -335,6 +344,11 @@ static UINT SHELL_ExecuteW(const WCHAR *lpCmd, void *env, BOOL shWait, TRACE("returning %u\n", retval); psei_out->hInstApp = (HINSTANCE)retval; + + if( gcdret ) + if( !SetCurrentDirectoryW( curdir)) + ERR("cannot return to directory %s\n", debugstr_w(curdir)); + return retval; } @@ -800,7 +814,7 @@ static unsigned dde_connect(WCHAR * key, WCHAR* start, WCHAR* ddeexec, } } - SHELL_ArgifyW(res, sizeof(res), exec, lpFile, pidl, szCommandline); + SHELL_ArgifyW(res, sizeof(res)/sizeof(WCHAR), exec, lpFile, pidl, szCommandline); TRACE("%s %s => %s\n", debugstr_w(exec), debugstr_w(lpFile), debugstr_w(res)); ret = (DdeClientTransaction((LPBYTE)res, (strlenW(res) + 1) * sizeof(WCHAR), hConv, 0L, 0, @@ -1039,7 +1053,17 @@ BOOL WINAPI ShellExecuteExW32 (LPSHELLEXECUTEINFOW psei, SHELL_ExecuteW32 execfu if (ext && !strcmpiW(ext, wExtLnk)) /* or check for: shell_attribs & SFGAO_LINK */ { - HRESULT hr = SHELL_ResolveShortCutW((LPWSTR)sei_tmp.lpFile, (LPWSTR)sei_tmp.lpParameters, (LPWSTR)sei_tmp.lpDirectory, + HRESULT hr; + + /* expand paths before reading shell link */ + if (ExpandEnvironmentStringsW(sei_tmp.lpFile, buffer, MAX_PATH)) + lstrcpyW(wszApplicationName/*sei_tmp.lpFile*/, buffer); + + if (*sei_tmp.lpParameters) + if (ExpandEnvironmentStringsW(sei_tmp.lpParameters, buffer, MAX_PATH)) + lstrcpyW(wszParameters/*sei_tmp.lpParameters*/, buffer); + + hr = SHELL_ResolveShortCutW((LPWSTR)sei_tmp.lpFile, (LPWSTR)sei_tmp.lpParameters, (LPWSTR)sei_tmp.lpDirectory, sei_tmp.hwnd, sei_tmp.lpVerb?sei_tmp.lpVerb:wszEmpty, &sei_tmp.nShow, (LPITEMIDLIST*)&sei_tmp.lpIDList); if (psei->lpIDList) @@ -1184,7 +1208,7 @@ BOOL WINAPI ShellExecuteExW32 (LPSHELLEXECUTEINFOW psei, SHELL_ExecuteW32 execfu if (sei_tmp.lpIDList!=psei->lpIDList && sei_tmp.lpIDList) SHFree(sei_tmp.lpIDList); - TRACE("execfunc: retval=%d sei_tmp.hInstApp=%p\n", retval, sei_tmp.hInstApp); + TRACE("execfunc: retval=%d psei->hInstApp=%p\n", retval, psei->hInstApp); return TRUE; } From d3d3ab535d3f23e68bac685c24822ea308198512 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Fri, 19 Mar 2004 12:38:07 +0000 Subject: [PATCH 0560/1463] Enable environment inheritance. svn path=/trunk/; revision=8789 --- reactos/lib/ntdll/rtl/env.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/reactos/lib/ntdll/rtl/env.c b/reactos/lib/ntdll/rtl/env.c index 62e00aa416d..205781189f9 100644 --- a/reactos/lib/ntdll/rtl/env.c +++ b/reactos/lib/ntdll/rtl/env.c @@ -1,4 +1,4 @@ -/* $Id: env.c,v 1.21 2003/09/12 17:51:48 vizzini Exp $ +/* $Id: env.c,v 1.22 2004/03/19 12:38:07 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -29,6 +29,7 @@ NTSTATUS STDCALL RtlCreateEnvironment(BOOLEAN Inherit, PWSTR *Environment) { + MEMORY_BASIC_INFORMATION MemInfo; PVOID EnvPtr = NULL; NTSTATUS Status = STATUS_SUCCESS; ULONG RegionSize = PAGE_SIZE; @@ -36,7 +37,7 @@ RtlCreateEnvironment(BOOLEAN Inherit, if (Inherit == TRUE) { RtlAcquirePebLock(); -#if 0 + if (NtCurrentPeb()->ProcessParameters->Environment != NULL) { Status = NtQueryVirtualMemory(NtCurrentProcess(), @@ -72,7 +73,7 @@ RtlCreateEnvironment(BOOLEAN Inherit, *Environment = EnvPtr; } -#endif + RtlReleasePebLock (); } else @@ -326,9 +327,9 @@ found: { Status = NtQueryVirtualMemory(NtCurrentProcess(), env, - 0, + MemoryBasicInformation, &mbi, - sizeof(mbi), + sizeof(MEMORY_BASIC_INFORMATION), NULL); if (!NT_SUCCESS(Status)) { From d037d068ff56c1bb595a9e0f90cf6329a1dfc003 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Fri, 19 Mar 2004 12:40:49 +0000 Subject: [PATCH 0561/1463] Implement CreateEnvironmentBlock() and DestroyEnvironmentBlock(). svn path=/trunk/; revision=8790 --- reactos/lib/userenv/environment.c | 103 ++++++++++++++++++++++++++++++ reactos/lib/userenv/makefile | 3 +- reactos/lib/userenv/userenv.def | 4 +- reactos/lib/userenv/userenv.edf | 4 +- 4 files changed, 111 insertions(+), 3 deletions(-) create mode 100644 reactos/lib/userenv/environment.c diff --git a/reactos/lib/userenv/environment.c b/reactos/lib/userenv/environment.c new file mode 100644 index 00000000000..372aa5c3bcb --- /dev/null +++ b/reactos/lib/userenv/environment.c @@ -0,0 +1,103 @@ +/* $Id: environment.c,v 1.1 2004/03/19 12:40:49 ekohl Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * FILE: lib/userenv/environment.c + * PURPOSE: User environment functions + * PROGRAMMER: Eric Kohl + */ + +#define NTOS_MODE_USER +#include <ntos.h> +#include <windows.h> +#include <userenv.h> + +#include "internal.h" + + +static BOOL +SetUserEnvironmentVariable (LPVOID *Environment, + LPWSTR lpName, + LPWSTR lpValue) +{ + UNICODE_STRING Name; + UNICODE_STRING Value; + NTSTATUS Status; + + RtlInitUnicodeString (&Name, lpName); + RtlInitUnicodeString (&Value, lpValue); + + Status = RtlSetEnvironmentVariable ((PWSTR*)Environment, + &Name, + &Value); + if (!NT_SUCCESS(Status)) + { + DPRINT1 ("RtlSetEnvironmentVariable() failed (Status %lx)\n", Status); + return FALSE; + } + + return TRUE; +} + + +BOOL WINAPI +CreateEnvironmentBlock (LPVOID *lpEnvironment, + HANDLE hToken, + BOOL bInherit) +{ + WCHAR Buffer[MAX_PATH]; + DWORD Length; + NTSTATUS Status; + + DPRINT1 ("CreateEnvironmentBlock() called\n"); + + if (lpEnvironment == NULL) + return FALSE; + + Status = RtlCreateEnvironment ((BOOLEAN)bInherit, + (PWSTR*)lpEnvironment); + if (!NT_SUCCESS (Status)) + { + DPRINT1 ("RtlCreateEnvironment() failed (Status %lx)\n", Status); + return FALSE; + } + + /* Set 'COMPUTERNAME' variable */ + Length = MAX_PATH; + if (GetComputerNameW (Buffer, + &Length)) + { + SetUserEnvironmentVariable (lpEnvironment, + L"COMPUTERNAME", + Buffer); + } + + /* Set 'USERPROFILE' variable */ + Length = MAX_PATH; + if (GetUserProfileDirectoryW (hToken, + Buffer, + &Length)) + { + SetUserEnvironmentVariable (lpEnvironment, + L"USERPROFILE", + Buffer); + } + + return TRUE; +} + + +BOOL WINAPI +DestroyEnvironmentBlock (LPVOID lpEnvironment) +{ + DPRINT ("DestroyEnvironmentBlock() called\n"); + + if (lpEnvironment == NULL) + return FALSE; + + RtlDestroyEnvironment (lpEnvironment); + + return TRUE; +} + +/* EOF */ diff --git a/reactos/lib/userenv/makefile b/reactos/lib/userenv/makefile index 0f3a083dd59..032ca9cbcf9 100644 --- a/reactos/lib/userenv/makefile +++ b/reactos/lib/userenv/makefile @@ -15,7 +15,8 @@ TARGET_LFLAGS = -nostdlib -nostartfiles TARGET_SDKLIBS = ntdll.a kernel32.a advapi32.a -TARGET_OBJECTS = directory.o profile.o misc.o registry.o setup.o userenv.o +TARGET_OBJECTS = directory.o environment.o profile.o misc.o registry.o \ + setup.o userenv.o DEP_OBJECTS = $(TARGET_OBJECTS) diff --git a/reactos/lib/userenv/userenv.def b/reactos/lib/userenv/userenv.def index 3be07e7d780..8d7e1ae31e3 100644 --- a/reactos/lib/userenv/userenv.def +++ b/reactos/lib/userenv/userenv.def @@ -1,11 +1,13 @@ LIBRARY userenv.dll EXPORTS InitializeProfiles@0 @100 NONAME +CreateUserProfileW@8 @110 NONAME +CreateEnvironmentBlock@12 +DestroyEnvironmentBlock@4 GetAllUsersProfileDirectoryW@8 GetDefaultUserProfileDirectoryW@8 GetProfilesDirectoryW@8 GetUserProfileDirectoryW@12 -CreateUserProfileW@8 LoadUserProfileW@8 UnloadUserProfile@8 ;EOF diff --git a/reactos/lib/userenv/userenv.edf b/reactos/lib/userenv/userenv.edf index e79f6d00eb1..25f8b5dbbba 100644 --- a/reactos/lib/userenv/userenv.edf +++ b/reactos/lib/userenv/userenv.edf @@ -1,11 +1,13 @@ LIBRARY userenv.dll EXPORTS InitializeProfiles=InitializeProfiles@0 @100 NONAME +CreateUserProfileW=CreateUserProfileW@8 @110 NONAME +CreateEnvironmentBlock=CreateEnvironmentBlock@12 +DestroyEnvironmentBlock=DestroyEnvironmentBlock@4 GetAllUsersProfileDirectoryW=GetAllUsersProfileDirectoryW@8 GetDefaultUserProfileDirectoryW=GetDefaultUserProfileDirectoryW@8 GetProfilesDirectoryW=GetProfilesDirectoryW@8 GetUserProfileDirectoryW=GetUserProfileDirectoryW@12 -CreateUserProfileW=CreateUserProfileW@8 LoadUserProfileW=LoadUserProfileW@8 UnloadUserProfile=UnloadUserProfile@8 ;EOF From c89688b59d5ed516cae1d812a0c68c7325294b6b Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Fri, 19 Mar 2004 12:45:07 +0000 Subject: [PATCH 0562/1463] Fix NtOpenThreadToken() and NtSetInformationThread(). svn path=/trunk/; revision=8791 --- reactos/ntoskrnl/ps/create.c | 120 ++++++++++++++++++++++------------- reactos/ntoskrnl/ps/tinfo.c | 110 +++++++++++++++++--------------- 2 files changed, 134 insertions(+), 96 deletions(-) diff --git a/reactos/ntoskrnl/ps/create.c b/reactos/ntoskrnl/ps/create.c index de169fa12cb..dd653e88bf7 100644 --- a/reactos/ntoskrnl/ps/create.c +++ b/reactos/ntoskrnl/ps/create.c @@ -1,4 +1,4 @@ -/* $Id: create.c,v 1.71 2004/03/14 18:12:07 ekohl Exp $ +/* $Id: create.c,v 1.72 2004/03/19 12:45:07 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -58,7 +58,7 @@ PsAssignImpersonationToken(PETHREAD Thread, PACCESS_TOKEN Token; SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; NTSTATUS Status; - + if (TokenHandle != NULL) { Status = ObReferenceObjectByHandle(TokenHandle, @@ -78,7 +78,7 @@ PsAssignImpersonationToken(PETHREAD Thread, Token = NULL; ImpersonationLevel = 0; } - + PsImpersonateClient(Thread, Token, 0, @@ -183,51 +183,56 @@ NtImpersonateThread(IN HANDLE ThreadHandle, IN HANDLE ThreadToImpersonateHandle, IN PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService) { - PETHREAD Thread; - PETHREAD ThreadToImpersonate; - NTSTATUS Status; - SECURITY_CLIENT_CONTEXT ClientContext; - - Status = ObReferenceObjectByHandle(ThreadHandle, + SECURITY_CLIENT_CONTEXT ClientContext; + PETHREAD Thread; + PETHREAD ThreadToImpersonate; + NTSTATUS Status; + + Status = ObReferenceObjectByHandle (ThreadHandle, 0, PsThreadType, UserMode, (PVOID*)&Thread, NULL); - if (!NT_SUCCESS(Status)) - { - return(Status); - } - - Status = ObReferenceObjectByHandle(ThreadToImpersonateHandle, + if (!NT_SUCCESS (Status)) + { + return Status; + } + + Status = ObReferenceObjectByHandle (ThreadToImpersonateHandle, 0, PsThreadType, UserMode, (PVOID*)&ThreadToImpersonate, NULL); - if (!NT_SUCCESS(Status)) - { - ObDereferenceObject(Thread); - return(Status); - } - - Status = SeCreateClientSecurity(ThreadToImpersonate, + if (!NT_SUCCESS(Status)) + { + ObDereferenceObject (Thread); + return Status; + } + + Status = SeCreateClientSecurity (ThreadToImpersonate, SecurityQualityOfService, 0, &ClientContext); - if (!NT_SUCCESS(Status)) - { - ObDereferenceObject(Thread); - ObDereferenceObject(ThreadToImpersonate); - return(Status); + if (!NT_SUCCESS(Status)) + { + ObDereferenceObject (ThreadToImpersonate); + ObDereferenceObject (Thread); + return Status; } - - SeImpersonateClient(&ClientContext, Thread); - if (ClientContext.Token != NULL) - { - ObDereferenceObject(ClientContext.Token); - } - return(STATUS_SUCCESS); + + SeImpersonateClient (&ClientContext, + Thread); + if (ClientContext.Token != NULL) + { + ObDereferenceObject (ClientContext.Token); + } + + ObDereferenceObject (ThreadToImpersonate); + ObDereferenceObject (Thread); + + return STATUS_SUCCESS; } @@ -237,12 +242,11 @@ NtOpenThreadToken (IN HANDLE ThreadHandle, IN BOOLEAN OpenAsSelf, OUT PHANDLE TokenHandle) { -#if 0 - PETHREAD Thread; - NTSTATUS Status; - PACCESS_TOKEN Token; - - Status = ObReferenceObjectByHandle(ThreadHandle, + PACCESS_TOKEN Token; + PETHREAD Thread; + NTSTATUS Status; + + Status = ObReferenceObjectByHandle (ThreadHandle, 0, PsThreadType, UserMode, @@ -252,11 +256,37 @@ NtOpenThreadToken (IN HANDLE ThreadHandle, { return(Status); } - - Token = PsReferencePrimaryToken(Thread->ThreadsProcess); - SepCreateImpersonationTokenDacl(Token); -#endif - return STATUS_NO_TOKEN; + + if (OpenAsSelf) + { + if (Thread->ActiveImpersonationInfo == FALSE) + { + ObDereferenceObject (Thread); + return STATUS_NO_TOKEN; + } + + Token = Thread->ImpersonationInfo->Token; + } + else + { + Token = Thread->ThreadsProcess->Token; + } + + if (Token == NULL) + { + ObDereferenceObject (Thread); + return STATUS_NO_TOKEN; + } + + Status = ObCreateHandle (PsGetCurrentProcess(), + Token, + DesiredAccess, + FALSE, + TokenHandle); + + ObDereferenceObject (Thread); + + return Status; } diff --git a/reactos/ntoskrnl/ps/tinfo.c b/reactos/ntoskrnl/ps/tinfo.c index 4df8058175e..aaccdf22f14 100644 --- a/reactos/ntoskrnl/ps/tinfo.c +++ b/reactos/ntoskrnl/ps/tinfo.c @@ -1,4 +1,4 @@ -/* $Id: tinfo.c,v 1.24 2003/12/30 18:52:05 fireball Exp $ +/* $Id: tinfo.c,v 1.25 2004/03/19 12:45:07 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -22,28 +22,28 @@ /* FUNCTIONS *****************************************************************/ -NTSTATUS STDCALL -NtSetInformationThread(HANDLE ThreadHandle, - THREADINFOCLASS ThreadInformationClass, - PVOID ThreadInformation, - ULONG ThreadInformationLength) +NTSTATUS STDCALL +NtSetInformationThread (IN HANDLE ThreadHandle, + IN THREADINFOCLASS ThreadInformationClass, + IN PVOID ThreadInformation, + IN ULONG ThreadInformationLength) { - PETHREAD Thread; - NTSTATUS Status; - - Status = ObReferenceObjectByHandle(ThreadHandle, + PETHREAD Thread; + NTSTATUS Status; + + Status = ObReferenceObjectByHandle (ThreadHandle, THREAD_SET_INFORMATION, PsThreadType, - ExGetPreviousMode(), + ExGetPreviousMode (), (PVOID*)&Thread, NULL); if (!NT_SUCCESS(Status)) { return Status; } - - switch (ThreadInformationClass) - { + + switch (ThreadInformationClass) + { case ThreadBasicInformation: /* Can only be queried */ Status = STATUS_INVALID_INFO_CLASS; @@ -57,7 +57,7 @@ NtSetInformationThread(HANDLE ThreadHandle, case ThreadPriority: { KPRIORITY Priority; - + if (ThreadInformationLength != sizeof(KPRIORITY)) { Status = STATUS_INFO_LENGTH_MISMATCH; @@ -77,17 +77,18 @@ NtSetInformationThread(HANDLE ThreadHandle, case ThreadBasePriority: { LONG Increment; + if (ThreadInformationLength != sizeof(LONG)) { Status = STATUS_INFO_LENGTH_MISMATCH; break; } - Status = MmCopyFromCaller(&Increment, - ThreadInformation, - sizeof(ULONG)); - if (NT_SUCCESS(Status)) - { - KeSetBasePriorityThread (&Thread->Tcb, Increment); + Status = MmCopyFromCaller(&Increment, + ThreadInformation, + sizeof(ULONG)); + if (NT_SUCCESS(Status)) + { + KeSetBasePriorityThread (&Thread->Tcb, Increment); } } break; @@ -106,7 +107,8 @@ NtSetInformationThread(HANDLE ThreadHandle, break; } TokenHandle = *((PHANDLE)ThreadInformation); - Status = PsAssignImpersonationToken(Thread, TokenHandle); + Status = PsAssignImpersonationToken (Thread, + TokenHandle); break; } @@ -158,49 +160,51 @@ NtSetInformationThread(HANDLE ThreadHandle, Thread->u2.Win32StartAddress = (PVOID)*((PULONG)ThreadInformation); Status = STATUS_SUCCESS; break; - + case ThreadZeroTlsCell: { Status = STATUS_NOT_IMPLEMENTED; break; } - + case ThreadPerformanceCount: /* Can only be queried */ Status = STATUS_INVALID_INFO_CLASS; break; - + case ThreadAmILastThread: /* Can only be queried */ Status = STATUS_INVALID_INFO_CLASS; break; - - case ThreadIdealProcessor: - Status = STATUS_NOT_IMPLEMENTED; - break; - - case ThreadPriorityBoost: - Status = STATUS_NOT_IMPLEMENTED; - break; - - case ThreadSetTlsArrayAddress: - Status = STATUS_NOT_IMPLEMENTED; - break; - case ThreadIsIoPending: - /* Can only be queried */ - Status = STATUS_INVALID_INFO_CLASS; - break; + case ThreadIdealProcessor: + Status = STATUS_NOT_IMPLEMENTED; + break; - case ThreadHideFromDebugger: - Status = STATUS_NOT_IMPLEMENTED; - break; + case ThreadPriorityBoost: + Status = STATUS_NOT_IMPLEMENTED; + break; + + case ThreadSetTlsArrayAddress: + Status = STATUS_NOT_IMPLEMENTED; + break; + + case ThreadIsIoPending: + /* Can only be queried */ + Status = STATUS_INVALID_INFO_CLASS; + break; + + case ThreadHideFromDebugger: + Status = STATUS_NOT_IMPLEMENTED; + break; default: Status = STATUS_UNSUCCESSFUL; - } - ObDereferenceObject(Thread); - return Status; + } + + ObDereferenceObject (Thread); + + return Status; } @@ -364,27 +368,31 @@ NtQueryInformationThread (IN HANDLE ThreadHandle, return(Status); } -VOID KeSetPreviousMode(ULONG Mode) + +VOID +KeSetPreviousMode (ULONG Mode) { - PsGetCurrentThread()->Tcb.PreviousMode = (UCHAR)Mode; + PsGetCurrentThread()->Tcb.PreviousMode = (UCHAR)Mode; } + /* * @implemented */ ULONG STDCALL KeGetPreviousMode (VOID) { - return (ULONG)PsGetCurrentThread()->Tcb.PreviousMode; + return (ULONG)PsGetCurrentThread()->Tcb.PreviousMode; } + /* * @implemented */ KPROCESSOR_MODE STDCALL ExGetPreviousMode (VOID) { - return (KPROCESSOR_MODE)PsGetCurrentThread()->Tcb.PreviousMode; + return (KPROCESSOR_MODE)PsGetCurrentThread()->Tcb.PreviousMode; } /* EOF */ From be092c4712b66188893415ea928a8f983272b875 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Fri, 19 Mar 2004 12:47:17 +0000 Subject: [PATCH 0563/1463] Clean-up NtQueryInformationToken(). svn path=/trunk/; revision=8792 --- reactos/ntoskrnl/se/token.c | 92 ++++++++++++++++++------------------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/reactos/ntoskrnl/se/token.c b/reactos/ntoskrnl/se/token.c index 0b2c612dbd2..36a8c2d0323 100644 --- a/reactos/ntoskrnl/se/token.c +++ b/reactos/ntoskrnl/se/token.c @@ -1,4 +1,4 @@ -/* $Id: token.c,v 1.33 2004/03/13 19:25:47 jfilby Exp $ +/* $Id: token.c,v 1.34 2004/03/19 12:47:17 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -500,7 +500,7 @@ NtQueryInformationToken(IN HANDLE TokenHandle, PVOID UnusedInfo; PVOID EndMem; PACCESS_TOKEN Token; - ULONG uLength; + ULONG Length; PTOKEN_GROUPS PtrTokenGroups; PTOKEN_DEFAULT_DACL PtrDefaultDacl; PTOKEN_STATISTICS PtrTokenStatistics; @@ -519,11 +519,11 @@ NtQueryInformationToken(IN HANDLE TokenHandle, switch (TokenInformationClass) { case TokenUser: - DPRINT("NtQueryInformationToken(TokenUser)\n"); - uLength = RtlLengthSidAndAttributes(1, Token->UserAndGroups); - if (TokenInformationLength < uLength) + DPRINT("NtQueryInformationToken(TokenUser)\n"); + Length = RtlLengthSidAndAttributes(1, Token->UserAndGroups); + if (TokenInformationLength < Length) { - Status = MmCopyToCaller(ReturnLength, &uLength, sizeof(ULONG)); + Status = MmCopyToCaller(ReturnLength, &Length, sizeof(ULONG)); if (NT_SUCCESS(Status)) Status = STATUS_BUFFER_TOO_SMALL; } @@ -535,21 +535,21 @@ NtQueryInformationToken(IN HANDLE TokenHandle, TokenInformation, (char*)TokenInformation + 8, &UnusedInfo, - &uLength); + &Length); if (NT_SUCCESS(Status)) { - uLength = TokenInformationLength - uLength; - Status = MmCopyToCaller(ReturnLength, &uLength, sizeof(ULONG)); + Length = TokenInformationLength - Length; + Status = MmCopyToCaller(ReturnLength, &Length, sizeof(ULONG)); } } break; case TokenGroups: - DPRINT("NtQueryInformationToken(TokenGroups)\n"); - uLength = RtlLengthSidAndAttributes(Token->UserAndGroupCount - 1, &Token->UserAndGroups[1]) + sizeof(DWORD); - if (TokenInformationLength < uLength) + DPRINT("NtQueryInformationToken(TokenGroups)\n"); + Length = RtlLengthSidAndAttributes(Token->UserAndGroupCount - 1, &Token->UserAndGroups[1]) + sizeof(ULONG); + if (TokenInformationLength < Length) { - Status = MmCopyToCaller(ReturnLength, &uLength, sizeof(ULONG)); + Status = MmCopyToCaller(ReturnLength, &Length, sizeof(ULONG)); if (NT_SUCCESS(Status)) Status = STATUS_BUFFER_TOO_SMALL; } @@ -564,21 +564,21 @@ NtQueryInformationToken(IN HANDLE TokenHandle, PtrTokenGroups->Groups, EndMem, &UnusedInfo, - &uLength); + &Length); if (NT_SUCCESS(Status)) { - uLength = TokenInformationLength - uLength; - Status = MmCopyToCaller(ReturnLength, &uLength, sizeof(ULONG)); + Length = TokenInformationLength - Length; + Status = MmCopyToCaller(ReturnLength, &Length, sizeof(ULONG)); } } break; case TokenPrivileges: - DPRINT("NtQueryInformationToken(TokenPrivileges)\n"); - uLength = sizeof(DWORD) + Token->PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES); - if (TokenInformationLength < uLength) + DPRINT("NtQueryInformationToken(TokenPrivileges)\n"); + Length = sizeof(ULONG) + Token->PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES); + if (TokenInformationLength < Length) { - Status = MmCopyToCaller(ReturnLength, &uLength, sizeof(ULONG)); + Status = MmCopyToCaller(ReturnLength, &Length, sizeof(ULONG)); if (NT_SUCCESS(Status)) Status = STATUS_BUFFER_TOO_SMALL; } @@ -598,11 +598,11 @@ NtQueryInformationToken(IN HANDLE TokenHandle, break; case TokenOwner: - DPRINT("NtQueryInformationToken(TokenOwner)\n"); - uLength = RtlLengthSid(Token->UserAndGroups[Token->DefaultOwnerIndex].Sid) + sizeof(TOKEN_OWNER); - if (TokenInformationLength < uLength) + DPRINT("NtQueryInformationToken(TokenOwner)\n"); + Length = RtlLengthSid(Token->UserAndGroups[Token->DefaultOwnerIndex].Sid) + sizeof(TOKEN_OWNER); + if (TokenInformationLength < Length) { - Status = MmCopyToCaller(ReturnLength, &uLength, sizeof(ULONG)); + Status = MmCopyToCaller(ReturnLength, &Length, sizeof(ULONG)); if (NT_SUCCESS(Status)) Status = STATUS_BUFFER_TOO_SMALL; } @@ -618,12 +618,12 @@ NtQueryInformationToken(IN HANDLE TokenHandle, break; case TokenPrimaryGroup: - DPRINT("NtQueryInformationToken(TokenPrimaryGroup)," + DPRINT("NtQueryInformationToken(TokenPrimaryGroup)," "Token->PrimaryGroup = 0x%08x\n", Token->PrimaryGroup); - uLength = RtlLengthSid(Token->PrimaryGroup) + sizeof(TOKEN_PRIMARY_GROUP); - if (TokenInformationLength < uLength) + Length = RtlLengthSid(Token->PrimaryGroup) + sizeof(TOKEN_PRIMARY_GROUP); + if (TokenInformationLength < Length) { - Status = MmCopyToCaller(ReturnLength, &uLength, sizeof(ULONG)); + Status = MmCopyToCaller(ReturnLength, &Length, sizeof(ULONG)); if (NT_SUCCESS(Status)) Status = STATUS_BUFFER_TOO_SMALL; } @@ -639,19 +639,19 @@ NtQueryInformationToken(IN HANDLE TokenHandle, break; case TokenDefaultDacl: - DPRINT("NtQueryInformationToken(TokenDefaultDacl)\n"); + DPRINT("NtQueryInformationToken(TokenDefaultDacl)\n"); PtrDefaultDacl = (PTOKEN_DEFAULT_DACL) TokenInformation; - uLength = (Token->DefaultDacl ? Token->DefaultDacl->AclSize : 0) + sizeof(TOKEN_DEFAULT_DACL); - if (TokenInformationLength < uLength) + Length = (Token->DefaultDacl ? Token->DefaultDacl->AclSize : 0) + sizeof(TOKEN_DEFAULT_DACL); + if (TokenInformationLength < Length) { - Status = MmCopyToCaller(ReturnLength, &uLength, sizeof(ULONG)); + Status = MmCopyToCaller(ReturnLength, &Length, sizeof(ULONG)); if (NT_SUCCESS(Status)) Status = STATUS_BUFFER_TOO_SMALL; } else if (!Token->DefaultDacl) { PtrDefaultDacl->DefaultDacl = 0; - Status = MmCopyToCaller(ReturnLength, &uLength, sizeof(ULONG)); + Status = MmCopyToCaller(ReturnLength, &Length, sizeof(ULONG)); } else { @@ -659,16 +659,16 @@ NtQueryInformationToken(IN HANDLE TokenHandle, memmove(PtrDefaultDacl->DefaultDacl, Token->DefaultDacl, Token->DefaultDacl->AclSize); - Status = MmCopyToCaller(ReturnLength, &uLength, sizeof(ULONG)); + Status = MmCopyToCaller(ReturnLength, &Length, sizeof(ULONG)); } break; case TokenSource: - DPRINT("NtQueryInformationToken(TokenSource)\n"); + DPRINT("NtQueryInformationToken(TokenSource)\n"); if (TokenInformationLength < sizeof(TOKEN_SOURCE)) { - uLength = sizeof(TOKEN_SOURCE); - Status = MmCopyToCaller(ReturnLength, &uLength, sizeof(ULONG)); + Length = sizeof(TOKEN_SOURCE); + Status = MmCopyToCaller(ReturnLength, &Length, sizeof(ULONG)); if (NT_SUCCESS(Status)) Status = STATUS_BUFFER_TOO_SMALL; } @@ -679,11 +679,11 @@ NtQueryInformationToken(IN HANDLE TokenHandle, break; case TokenType: - DPRINT("NtQueryInformationToken(TokenType)\n"); + DPRINT("NtQueryInformationToken(TokenType)\n"); if (TokenInformationLength < sizeof(TOKEN_TYPE)) { - uLength = sizeof(TOKEN_TYPE); - Status = MmCopyToCaller(ReturnLength, &uLength, sizeof(ULONG)); + Length = sizeof(TOKEN_TYPE); + Status = MmCopyToCaller(ReturnLength, &Length, sizeof(ULONG)); if (NT_SUCCESS(Status)) Status = STATUS_BUFFER_TOO_SMALL; } @@ -694,11 +694,11 @@ NtQueryInformationToken(IN HANDLE TokenHandle, break; case TokenImpersonationLevel: - DPRINT("NtQueryInformationToken(TokenImpersonationLevel)\n"); + DPRINT("NtQueryInformationToken(TokenImpersonationLevel)\n"); if (TokenInformationLength < sizeof(SECURITY_IMPERSONATION_LEVEL)) { - uLength = sizeof(SECURITY_IMPERSONATION_LEVEL); - Status = MmCopyToCaller(ReturnLength, &uLength, sizeof(ULONG)); + Length = sizeof(SECURITY_IMPERSONATION_LEVEL); + Status = MmCopyToCaller(ReturnLength, &Length, sizeof(ULONG)); if (NT_SUCCESS(Status)) Status = STATUS_BUFFER_TOO_SMALL; } @@ -709,11 +709,11 @@ NtQueryInformationToken(IN HANDLE TokenHandle, break; case TokenStatistics: - DPRINT("NtQueryInformationToken(TokenStatistics)\n"); + DPRINT("NtQueryInformationToken(TokenStatistics)\n"); if (TokenInformationLength < sizeof(TOKEN_STATISTICS)) { - uLength = sizeof(TOKEN_STATISTICS); - Status = MmCopyToCaller(ReturnLength, &uLength, sizeof(ULONG)); + Length = sizeof(TOKEN_STATISTICS); + Status = MmCopyToCaller(ReturnLength, &Length, sizeof(ULONG)); if (NT_SUCCESS(Status)) Status = STATUS_BUFFER_TOO_SMALL; } From 91c3d64bf54503fc649663ea995b94b0c8b52bcb Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 19 Mar 2004 17:37:57 +0000 Subject: [PATCH 0564/1463] - Lower IRQL in error case of IoAllocateDriverObjectExtension. svn path=/trunk/; revision=8794 --- reactos/ntoskrnl/io/driver.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/io/driver.c b/reactos/ntoskrnl/io/driver.c index 045390e3cd3..e46b6ca5950 100644 --- a/reactos/ntoskrnl/io/driver.c +++ b/reactos/ntoskrnl/io/driver.c @@ -1,4 +1,4 @@ -/* $Id: driver.c,v 1.36 2004/03/14 17:10:48 navaraf Exp $ +/* $Id: driver.c,v 1.37 2004/03/19 17:37:57 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1280,7 +1280,10 @@ IoAllocateDriverObjectExtension( { if (DriverExtensions->ClientIdentificationAddress == ClientIdentificationAddress) + { + KfLowerIrql(OldIrql); return STATUS_OBJECT_NAME_COLLISION; + } } DriverObject->DriverSection = NewDriverExtension; From d621be6ce66540dd5ab0cebfcf7d9412e2ac15ae Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 19 Mar 2004 20:58:32 +0000 Subject: [PATCH 0565/1463] Merged changes from videoport_pnp_14032004 branch: - Better support for W2K+ video miniport driver incl. the basic implementation of PnP driver model. - Return Win32 error codes instead of NT equivalents. - Fixed a few bugs. svn path=/trunk/; revision=8796 --- reactos/drivers/video/videoprt/Makefile | 10 +- reactos/drivers/video/videoprt/dispatch.c | 316 +++ reactos/drivers/video/videoprt/dma.c | 119 + reactos/drivers/video/videoprt/event.c | 111 + reactos/drivers/video/videoprt/int10.c | 151 +- reactos/drivers/video/videoprt/interrupt.c | 94 +- reactos/drivers/video/videoprt/resource.c | 657 +++++ reactos/drivers/video/videoprt/services.c | 29 +- reactos/drivers/video/videoprt/spinlock.c | 8 +- reactos/drivers/video/videoprt/timer.c | 92 + reactos/drivers/video/videoprt/videoprt.c | 2643 +++++++------------- reactos/drivers/video/videoprt/videoprt.h | 144 +- reactos/drivers/video/videoprt/videoprt.rc | 4 +- 13 files changed, 2475 insertions(+), 1903 deletions(-) create mode 100644 reactos/drivers/video/videoprt/dispatch.c create mode 100644 reactos/drivers/video/videoprt/dma.c create mode 100644 reactos/drivers/video/videoprt/event.c create mode 100644 reactos/drivers/video/videoprt/resource.c create mode 100644 reactos/drivers/video/videoprt/timer.c diff --git a/reactos/drivers/video/videoprt/Makefile b/reactos/drivers/video/videoprt/Makefile index a7bbc0a056e..d5d535fc56d 100644 --- a/reactos/drivers/video/videoprt/Makefile +++ b/reactos/drivers/video/videoprt/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.3 2004/03/09 17:28:49 navaraf Exp $ +# $Id: Makefile,v 1.4 2004/03/19 20:58:31 navaraf Exp $ PATH_TO_TOP = ../../.. @@ -9,11 +9,17 @@ TARGET_NAME = videoprt TARGET_CFLAGS += -Wall -Werror -D__USE_W32API -I$(PATH_TO_TOP)/ntoskrnl/include TARGET_OBJECTS = \ + dispatch.o \ + dma.o \ + event.o \ int10.o \ interrupt.o \ videoprt.o \ + resource.o \ services.o \ - spinlock.o + spinlock.o \ + timer.o + include $(PATH_TO_TOP)/rules.mak diff --git a/reactos/drivers/video/videoprt/dispatch.c b/reactos/drivers/video/videoprt/dispatch.c new file mode 100644 index 00000000000..617ef9d99a8 --- /dev/null +++ b/reactos/drivers/video/videoprt/dispatch.c @@ -0,0 +1,316 @@ +/* + * VideoPort driver + * + * Copyright (C) 2002, 2003, 2004 ReactOS Team + * + * 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; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Id: dispatch.c,v 1.2 2004/03/19 20:58:32 navaraf Exp $ + */ + +#include "videoprt.h" + +/* EXTERNAL FUNCTIONS *********************************************************/ + +typedef PVOID PHAL_RESET_DISPLAY_PARAMETERS; +VOID STDCALL HalAcquireDisplayOwnership(IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters); +VOID STDCALL HalReleaseDisplayOwnership(); + +/* GLOBAL VARIABLES ***********************************************************/ + +PVIDEO_PORT_DEVICE_EXTENSION ResetDisplayParametersDeviceExtension = NULL; + +/* PRIVATE FUNCTIONS **********************************************************/ + +/* + * Reset display to blue screen + */ + +BOOLEAN STDCALL +IntVideoPortResetDisplayParameters(ULONG Columns, ULONG Rows) +{ + PVIDEO_PORT_DRIVER_EXTENSION DriverExtension; + + if (ResetDisplayParametersDeviceExtension == NULL) + return FALSE; + + DriverExtension = ResetDisplayParametersDeviceExtension->DriverExtension; + + ASSERT(DriverExtension->InitializationData.HwResetHw != NULL); + + if (!DriverExtension->InitializationData.HwResetHw( + &ResetDisplayParametersDeviceExtension->MiniPortDeviceExtension, + Columns, Rows)) + { + return FALSE; + } + + ResetDisplayParametersDeviceExtension = NULL; + + return TRUE; +} + +NTSTATUS STDCALL +IntVideoPortAddDevice( + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT PhysicalDeviceObject) +{ + PVIDEO_PORT_DRIVER_EXTENSION DriverExtension; + + /* + * Get the initialization data we saved in VideoPortInitialize. + */ + + DriverExtension = IoGetDriverObjectExtension(DriverObject, DriverObject); + + /* + * Use generic routine to find the adapter and create device object. + */ + + return IntVideoPortFindAdapter( + DriverObject, + DriverExtension, + PhysicalDeviceObject); +} + +/* + * IntVideoPortDispatchOpen + * + * Answer requests for Open calls. + * + * Run Level + * PASSIVE_LEVEL + */ + +NTSTATUS STDCALL +IntVideoPortDispatchOpen( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + PVIDEO_PORT_DRIVER_EXTENSION DriverExtension; + + DPRINT("IntVideoPortDispatchOpen\n"); + + if (CsrssInitialized == FALSE) + { + /* + * We know the first open call will be from the CSRSS process + * to let us know its handle. + */ + + DPRINT("Referencing CSRSS\n"); + Csrss = PsGetCurrentProcess(); + DPRINT("Csrss %p\n", Csrss); + + CsrssInitialized = TRUE; + + Irp->IoStatus.Information = FILE_OPENED; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return STATUS_SUCCESS; + } + + DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + DriverExtension = DeviceExtension->DriverExtension; + + if (DriverExtension->InitializationData.HwInitialize(&DeviceExtension->MiniPortDeviceExtension)) + { + Irp->IoStatus.Status = STATUS_SUCCESS; + + /* + * Storing the device extension pointer in a static variable is an + * ugly hack. Unfortunately, we need it in VideoPortResetDisplayParameters + * and HalAcquireDisplayOwnership doesn't allow us to pass a userdata + * parameter. On the bright side, the DISPLAY device is opened + * exclusively, so there can be only one device extension active at + * any point in time. + */ + + ResetDisplayParametersDeviceExtension = DeviceExtension; + HalAcquireDisplayOwnership(IntVideoPortResetDisplayParameters); + } + else + { + Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + } + + Irp->IoStatus.Information = FILE_OPENED; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return STATUS_SUCCESS; +} + +/* + * IntVideoPortDispatchClose + * + * Answer requests for Close calls. + * + * Run Level + * PASSIVE_LEVEL + */ + +NTSTATUS STDCALL +IntVideoPortDispatchClose( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + DPRINT("IntVideoPortDispatchClose\n"); + + if (ResetDisplayParametersDeviceExtension != NULL) + HalReleaseDisplayOwnership(); + + Irp->IoStatus.Status = STATUS_SUCCESS; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return STATUS_SUCCESS; +} + +/* + * IntVideoPortDispatchDeviceControl + * + * Answer requests for device control calls. + * + * Run Level + * PASSIVE_LEVEL + */ + +NTSTATUS STDCALL +IntVideoPortDispatchDeviceControl( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + PIO_STACK_LOCATION IrpStack; + PVIDEO_PORT_DRIVER_EXTENSION DriverExtension; + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + PVIDEO_REQUEST_PACKET vrp; + NTSTATUS Status; + + DPRINT("IntVideoPortDispatchDeviceControl\n"); + + IrpStack = IoGetCurrentIrpStackLocation(Irp); + DeviceExtension = DeviceObject->DeviceExtension; + DriverExtension = DeviceExtension->DriverExtension; + + /* Translate the IRP to a VRP */ + vrp = ExAllocatePool(NonPagedPool, sizeof(VIDEO_REQUEST_PACKET)); + if (NULL == vrp) + { + return STATUS_NO_MEMORY; + } + + vrp->StatusBlock = (PSTATUS_BLOCK)&(Irp->IoStatus); + vrp->IoControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode; + + DPRINT("- IoControlCode: %x\n", vrp->IoControlCode); + + /* We're assuming METHOD_BUFFERED */ + vrp->InputBuffer = Irp->AssociatedIrp.SystemBuffer; + vrp->InputBufferLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength; + vrp->OutputBuffer = Irp->AssociatedIrp.SystemBuffer; + vrp->OutputBufferLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength; + + /* Call the Miniport Driver with the VRP */ + DriverExtension->InitializationData.HwStartIO( + &DeviceExtension->MiniPortDeviceExtension, + vrp); + + /* Free the VRP */ + ExFreePool(vrp); + + DPRINT("- Returned status: %x\n", Irp->IoStatus.Status); + + if (Irp->IoStatus.Status != STATUS_SUCCESS) + { + /* Map from win32 error codes to NT status values. */ + switch (Irp->IoStatus.Status) + { + case ERROR_NOT_ENOUGH_MEMORY: Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; break; + case ERROR_MORE_DATA: Irp->IoStatus.Status = STATUS_BUFFER_OVERFLOW; break; + case ERROR_INVALID_FUNCTION: Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; break; + case ERROR_INVALID_PARAMETER: Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; break; + case ERROR_INSUFFICIENT_BUFFER: Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; break; + case ERROR_DEV_NOT_EXIST: Irp->IoStatus.Status = STATUS_DEVICE_DOES_NOT_EXIST; break; + case ERROR_IO_PENDING: Irp->IoStatus.Status = STATUS_PENDING; break; + } + } + + Status = Irp->IoStatus.Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return Status; +} + +NTSTATUS STDCALL +IntVideoPortDispatchPnp( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + PIO_STACK_LOCATION IrpSp; + + IrpSp = IoGetCurrentIrpStackLocation(Irp); + + switch (IrpSp->MinorFunction) + { + case IRP_MN_START_DEVICE: + + case IRP_MN_REMOVE_DEVICE: + case IRP_MN_QUERY_REMOVE_DEVICE: + case IRP_MN_CANCEL_REMOVE_DEVICE: + case IRP_MN_SURPRISE_REMOVAL: + + case IRP_MN_STOP_DEVICE: + case IRP_MN_QUERY_STOP_DEVICE: + case IRP_MN_CANCEL_STOP_DEVICE: + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return STATUS_SUCCESS; + } + + return STATUS_NOT_IMPLEMENTED; +} + +NTSTATUS STDCALL +IntVideoPortDispatchCleanup( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + + DeviceExtension = DeviceObject->DeviceExtension; + RtlFreeUnicodeString(&DeviceExtension->RegistryPath); + + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return STATUS_SUCCESS; +} + +NTSTATUS STDCALL +IntVideoPortDispatchPower( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + return STATUS_NOT_IMPLEMENTED; +} + +VOID STDCALL +IntVideoPortUnload(PDRIVER_OBJECT DriverObject) +{ +} diff --git a/reactos/drivers/video/videoprt/dma.c b/reactos/drivers/video/videoprt/dma.c new file mode 100644 index 00000000000..b7fe295856e --- /dev/null +++ b/reactos/drivers/video/videoprt/dma.c @@ -0,0 +1,119 @@ +/* + * VideoPort driver + * + * Copyright (C) 2002, 2003, 2004 ReactOS Team + * + * 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; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Id: dma.c,v 1.2 2004/03/19 20:58:32 navaraf Exp $ + */ + +#include "videoprt.h" + +/* PUBLIC FUNCTIONS ***********************************************************/ + +/* + * @implemented + */ + +PVOID STDCALL +VideoPortAllocateCommonBuffer( + IN PVOID HwDeviceExtension, + IN PVP_DMA_ADAPTER VpDmaAdapter, + IN ULONG DesiredLength, + OUT PPHYSICAL_ADDRESS LogicalAddress, + IN BOOLEAN CacheEnabled, + PVOID Reserved) +{ + return HalAllocateCommonBuffer( + (PADAPTER_OBJECT)VpDmaAdapter, + DesiredLength, + LogicalAddress, + CacheEnabled); +} + +/* + * @implemented + */ + +VOID STDCALL +VideoPortReleaseCommonBuffer( + IN PVOID HwDeviceExtension, + IN PVP_DMA_ADAPTER VpDmaAdapter, + IN ULONG Length, + IN PHYSICAL_ADDRESS LogicalAddress, + IN PVOID VirtualAddress, + IN BOOLEAN CacheEnabled) +{ + HalFreeCommonBuffer( + (PADAPTER_OBJECT)VpDmaAdapter, + Length, + LogicalAddress, + VirtualAddress, + CacheEnabled); +} + +/* + * @unimplemented + */ + +VOID STDCALL +VideoPortPutDmaAdapter( + IN PVOID HwDeviceExtension, + IN PVP_DMA_ADAPTER VpDmaAdapter) +{ + DPRINT("VideoPortPutDmaAdapter: Unimplemented.\n"); +} + +/* + * @unimplemented + */ + +PVP_DMA_ADAPTER STDCALL +VideoPortGetDmaAdapter( + IN PVOID HwDeviceExtension, + IN PVP_DEVICE_DESCRIPTION VpDeviceExtension) +{ + DEVICE_DESCRIPTION DeviceDescription; + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + ULONG NumberOfMapRegisters; + PVP_DMA_ADAPTER Adapter; + + DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); + + DPRINT("VideoPortGetDmaAdapter\n"); + + DeviceDescription.Version = DEVICE_DESCRIPTION_VERSION; + DeviceDescription.Master = TRUE /* ?? */; + DeviceDescription.ScatterGather = VpDeviceExtension->ScatterGather; + DeviceDescription.DemandMode = FALSE /* ?? */; + DeviceDescription.AutoInitialize = FALSE /* ?? */; + DeviceDescription.Dma32BitAddresses = VpDeviceExtension->Dma32BitAddresses; + DeviceDescription.IgnoreCount = FALSE /* ?? */; + DeviceDescription.Reserved1 = FALSE; + DeviceDescription.BusNumber = DeviceExtension->SystemIoBusNumber; + DeviceDescription.DmaChannel = 0 /* ?? */; + DeviceDescription.InterfaceType = DeviceExtension->AdapterInterfaceType; + DeviceDescription.DmaWidth = Width8Bits; + DeviceDescription.DmaSpeed = Compatible; + DeviceDescription.MaximumLength = VpDeviceExtension->MaximumLength; + DeviceDescription.DmaPort = 0; + + Adapter = + (PVP_DMA_ADAPTER)HalGetAdapter(&DeviceDescription, &NumberOfMapRegisters); + DPRINT("Adapter %X\n", Adapter); + return(Adapter); +} diff --git a/reactos/drivers/video/videoprt/event.c b/reactos/drivers/video/videoprt/event.c new file mode 100644 index 00000000000..170eb408444 --- /dev/null +++ b/reactos/drivers/video/videoprt/event.c @@ -0,0 +1,111 @@ +/* + * VideoPort driver + * + * Copyright (C) 2002, 2003, 2004 ReactOS Team + * + * 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; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Id: event.c,v 1.2 2004/03/19 20:58:32 navaraf Exp $ + */ + +#include "videoprt.h" + +/* PUBLIC FUNCTIONS ***********************************************************/ + +/* + * @implemented + */ + +VP_STATUS STDCALL +VideoPortCreateEvent( + IN PVOID HwDeviceExtension, + IN ULONG EventFlag, + IN PVOID Unused, + OUT PEVENT *Event) +{ + EVENT_TYPE Type; + + (*Event) = ExAllocatePoolWithTag( + NonPagedPool, + sizeof(KEVENT), + TAG_VIDEO_PORT); + + if ((*Event) == NULL) + return ERROR_NOT_ENOUGH_MEMORY; + + if (EventFlag & NOTIFICATION_EVENT) + Type = NotificationEvent; + else + Type = SynchronizationEvent; + + KeInitializeEvent((PKEVENT)*Event, Type, EventFlag & INITIAL_EVENT_SIGNALED); + return NO_ERROR; +} + +/* + * @implemented + */ + +VP_STATUS STDCALL +VideoPortDeleteEvent( + IN PVOID HwDeviceExtension, + IN PEVENT Event) +{ + ExFreePool(Event); + return NO_ERROR; +} + +/* + * @implemented + */ + +LONG STDCALL +VideoPortSetEvent( + IN PVOID HwDeviceExtension, + IN PEVENT Event) +{ + return KeSetEvent((PKEVENT)Event, IO_NO_INCREMENT, FALSE); +} + +/* + * @implemented + */ + +VOID STDCALL +VideoPortClearEvent( + IN PVOID HwDeviceExtension, + IN PEVENT Event) +{ + KeClearEvent((PKEVENT)Event); +} + +/* + * @implemented + */ + +VP_STATUS STDCALL +VideoPortWaitForSingleObject( + IN PVOID HwDeviceExtension, + IN PVOID Object, + IN PLARGE_INTEGER Timeout OPTIONAL) +{ + return KeWaitForSingleObject( + Object, + Executive, + KernelMode, + FALSE, + Timeout); +} diff --git a/reactos/drivers/video/videoprt/int10.c b/reactos/drivers/video/videoprt/int10.c index f822c295fd4..ad517aac6fd 100644 --- a/reactos/drivers/video/videoprt/int10.c +++ b/reactos/drivers/video/videoprt/int10.c @@ -18,84 +18,13 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: int10.c,v 1.4 2004/03/08 21:45:39 navaraf Exp $ + * $Id: int10.c,v 1.5 2004/03/19 20:58:31 navaraf Exp $ */ #include "videoprt.h" #include "internal/v86m.h" -VOID FASTCALL -IntAttachToCSRSS(PEPROCESS *CallingProcess, PEPROCESS *PrevAttachedProcess) -{ - *CallingProcess = PsGetCurrentProcess(); - if (*CallingProcess != Csrss) - { - if (NULL != PsGetCurrentThread()->OldProcess) - { - *PrevAttachedProcess = *CallingProcess; - KeDetachProcess(); - } - else - { - *PrevAttachedProcess = NULL; - } - KeAttachProcess(Csrss); - } -} - -VOID FASTCALL -IntDetachFromCSRSS(PEPROCESS *CallingProcess, PEPROCESS *PrevAttachedProcess) -{ - if (*CallingProcess != Csrss) - { - KeDetachProcess(); - if (NULL != *PrevAttachedProcess) - { - KeAttachProcess(*PrevAttachedProcess); - } - } -} - - -/* - * @implemented - */ - -VP_STATUS STDCALL -VideoPortInt10( - IN PVOID HwDeviceExtension, - IN PVIDEO_X86_BIOS_ARGUMENTS BiosArguments) -{ - KV86M_REGISTERS Regs; - NTSTATUS Status; - PEPROCESS CallingProcess; - PEPROCESS PrevAttachedProcess; - - DPRINT("VideoPortInt10\n"); - - IntAttachToCSRSS(&CallingProcess, &PrevAttachedProcess); - - memset(&Regs, 0, sizeof(Regs)); - DPRINT("- Input register Eax: %x\n", BiosArguments->Eax); - Regs.Eax = BiosArguments->Eax; - DPRINT("- Input register Ebx: %x\n", BiosArguments->Ebx); - Regs.Ebx = BiosArguments->Ebx; - DPRINT("- Input register Ecx: %x\n", BiosArguments->Ecx); - Regs.Ecx = BiosArguments->Ecx; - DPRINT("- Input register Edx: %x\n", BiosArguments->Edx); - Regs.Edx = BiosArguments->Edx; - DPRINT("- Input register Esi: %x\n", BiosArguments->Esi); - Regs.Esi = BiosArguments->Esi; - DPRINT("- Input register Edi: %x\n", BiosArguments->Edi); - Regs.Edi = BiosArguments->Edi; - DPRINT("- Input register Ebp: %x\n", BiosArguments->Ebp); - Regs.Ebp = BiosArguments->Ebp; - Status = Ke386CallBios(0x10, &Regs); - - IntDetachFromCSRSS(&CallingProcess, &PrevAttachedProcess); - - return Status; -} +/* PRIVATE FUNCTIONS **********************************************************/ VP_STATUS STDCALL IntInt10AllocateBuffer( @@ -106,8 +35,8 @@ IntInt10AllocateBuffer( { PVOID MemoryAddress; NTSTATUS Status; - PEPROCESS CallingProcess; - PEPROCESS PrevAttachedProcess; + PEPROCESS CallingProcess; + PEPROCESS PrevAttachedProcess; DPRINT("IntInt10AllocateBuffer\n"); @@ -116,17 +45,21 @@ IntInt10AllocateBuffer( MemoryAddress = (PVOID)0x20000; Status = ZwAllocateVirtualMemory(NtCurrentProcess(), &MemoryAddress, 0, Length, MEM_COMMIT, PAGE_EXECUTE_READWRITE); + if (!NT_SUCCESS(Status)) { DPRINT("- ZwAllocateVirtualMemory failed\n"); - return STATUS_NO_MEMORY; + IntDetachFromCSRSS(&CallingProcess, &PrevAttachedProcess); + return ERROR_NOT_ENOUGH_MEMORY; } + if (MemoryAddress > (PVOID)(0x100000 - *Length)) { ZwFreeVirtualMemory(NtCurrentProcess(), &MemoryAddress, Length, MEM_RELEASE); DPRINT("- Unacceptable memory allocated\n"); - return STATUS_NO_MEMORY; + IntDetachFromCSRSS(&CallingProcess, &PrevAttachedProcess); + return ERROR_NOT_ENOUGH_MEMORY; } *Seg = (ULONG)MemoryAddress >> 4; @@ -138,7 +71,7 @@ IntInt10AllocateBuffer( IntDetachFromCSRSS(&CallingProcess, &PrevAttachedProcess); - return STATUS_SUCCESS; + return NO_ERROR; } VP_STATUS STDCALL @@ -149,8 +82,8 @@ IntInt10FreeBuffer( { PVOID MemoryAddress = (PVOID)((Seg << 4) + Off); NTSTATUS Status; - PEPROCESS CallingProcess; - PEPROCESS PrevAttachedProcess; + PEPROCESS CallingProcess; + PEPROCESS PrevAttachedProcess; DPRINT("IntInt10FreeBuffer\n"); DPRINT("- Segment: %x\n", Seg); @@ -172,8 +105,8 @@ IntInt10ReadMemory( OUT PVOID Buffer, IN ULONG Length) { - PEPROCESS CallingProcess; - PEPROCESS PrevAttachedProcess; + PEPROCESS CallingProcess; + PEPROCESS PrevAttachedProcess; DPRINT("IntInt10ReadMemory\n"); DPRINT("- Segment: %x\n", Seg); @@ -185,7 +118,7 @@ IntInt10ReadMemory( RtlCopyMemory(Buffer, (PVOID)((Seg << 4) + Off), Length); IntDetachFromCSRSS(&CallingProcess, &PrevAttachedProcess); - return STATUS_SUCCESS; + return NO_ERROR; } VP_STATUS STDCALL @@ -196,8 +129,8 @@ IntInt10WriteMemory( IN PVOID Buffer, IN ULONG Length) { - PEPROCESS CallingProcess; - PEPROCESS PrevAttachedProcess; + PEPROCESS CallingProcess; + PEPROCESS PrevAttachedProcess; DPRINT("IntInt10WriteMemory\n"); DPRINT("- Segment: %x\n", Seg); @@ -209,7 +142,7 @@ IntInt10WriteMemory( RtlCopyMemory((PVOID)((Seg << 4) + Off), Buffer, Length); IntDetachFromCSRSS(&CallingProcess, &PrevAttachedProcess); - return STATUS_SUCCESS; + return NO_ERROR; } VP_STATUS STDCALL @@ -219,8 +152,8 @@ IntInt10CallBios( { KV86M_REGISTERS Regs; NTSTATUS Status; - PEPROCESS CallingProcess; - PEPROCESS PrevAttachedProcess; + PEPROCESS CallingProcess; + PEPROCESS PrevAttachedProcess; DPRINT("IntInt10CallBios\n"); @@ -260,3 +193,45 @@ IntInt10CallBios( return Status; } + +/* PUBLIC FUNCTIONS ***********************************************************/ + +/* + * @implemented + */ + +VP_STATUS STDCALL +VideoPortInt10( + IN PVOID HwDeviceExtension, + IN PVIDEO_X86_BIOS_ARGUMENTS BiosArguments) +{ + KV86M_REGISTERS Regs; + NTSTATUS Status; + PEPROCESS CallingProcess; + PEPROCESS PrevAttachedProcess; + + DPRINT("VideoPortInt10\n"); + + IntAttachToCSRSS(&CallingProcess, &PrevAttachedProcess); + + memset(&Regs, 0, sizeof(Regs)); + DPRINT("- Input register Eax: %x\n", BiosArguments->Eax); + Regs.Eax = BiosArguments->Eax; + DPRINT("- Input register Ebx: %x\n", BiosArguments->Ebx); + Regs.Ebx = BiosArguments->Ebx; + DPRINT("- Input register Ecx: %x\n", BiosArguments->Ecx); + Regs.Ecx = BiosArguments->Ecx; + DPRINT("- Input register Edx: %x\n", BiosArguments->Edx); + Regs.Edx = BiosArguments->Edx; + DPRINT("- Input register Esi: %x\n", BiosArguments->Esi); + Regs.Esi = BiosArguments->Esi; + DPRINT("- Input register Edi: %x\n", BiosArguments->Edi); + Regs.Edi = BiosArguments->Edi; + DPRINT("- Input register Ebp: %x\n", BiosArguments->Ebp); + Regs.Ebp = BiosArguments->Ebp; + Status = Ke386CallBios(0x10, &Regs); + + IntDetachFromCSRSS(&CallingProcess, &PrevAttachedProcess); + + return Status; +} diff --git a/reactos/drivers/video/videoprt/interrupt.c b/reactos/drivers/video/videoprt/interrupt.c index 248ae5e7fbf..0f3249d72bc 100644 --- a/reactos/drivers/video/videoprt/interrupt.c +++ b/reactos/drivers/video/videoprt/interrupt.c @@ -18,11 +18,89 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: interrupt.c,v 1.1 2004/03/04 18:51:58 navaraf Exp $ + * $Id: interrupt.c,v 1.2 2004/03/19 20:58:31 navaraf Exp $ */ #include "videoprt.h" +/* PRIVATE FUNCTIONS **********************************************************/ + +BOOLEAN STDCALL +IntVideoPortInterruptRoutine( + IN struct _KINTERRUPT *Interrupt, + IN PVOID ServiceContext) +{ + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension = ServiceContext; + + ASSERT(DeviceExtension->DriverExtension->InitializationData.HwInterrupt != NULL); + + return DeviceExtension->DriverExtension->InitializationData.HwInterrupt( + &DeviceExtension->MiniPortDeviceExtension); +} + +BOOLEAN STDCALL +IntVideoPortSetupInterrupt( + IN PDEVICE_OBJECT DeviceObject, + IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, + IN PVIDEO_PORT_CONFIG_INFO ConfigInfo) +{ + NTSTATUS Status; + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + + DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + + if (ConfigInfo->BusInterruptVector == 0) + ConfigInfo->BusInterruptVector = DeviceExtension->InterruptVector; + + if (ConfigInfo->BusInterruptLevel == 0) + ConfigInfo->BusInterruptLevel = DeviceExtension->InterruptLevel; + + if (DriverExtension->InitializationData.HwInterrupt != NULL) + { + ULONG InterruptVector; + KIRQL Irql; + KAFFINITY Affinity; + + InterruptVector = HalGetInterruptVector( + ConfigInfo->AdapterInterfaceType, + ConfigInfo->SystemIoBusNumber, + ConfigInfo->BusInterruptLevel, + ConfigInfo->BusInterruptVector, + &Irql, + &Affinity); + + if (InterruptVector == 0) + { + DPRINT("HalGetInterruptVector failed\n"); + return FALSE; + } + + KeInitializeSpinLock(&DeviceExtension->InterruptSpinLock); + Status = IoConnectInterrupt( + &DeviceExtension->InterruptObject, + IntVideoPortInterruptRoutine, + DeviceExtension, + &DeviceExtension->InterruptSpinLock, + InterruptVector, + Irql, + Irql, + ConfigInfo->InterruptMode, + FALSE, + Affinity, + FALSE); + + if (!NT_SUCCESS(Status)) + { + DPRINT("IoConnectInterrupt failed with status 0x%08x\n", Status); + return FALSE; + } + } + + return TRUE; +} + +/* PUBLIC FUNCTIONS ***********************************************************/ + /* * @implemented */ @@ -35,17 +113,14 @@ VideoPortEnableInterrupt(IN PVOID HwDeviceExtension) DPRINT("VideoPortEnableInterrupt\n"); - DeviceExtension = CONTAINING_RECORD( - HwDeviceExtension, - VIDEO_PORT_DEVICE_EXTENSION, - MiniPortDeviceExtension); + DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); Status = HalEnableSystemInterrupt( DeviceExtension->InterruptVector, 0, DeviceExtension->InterruptLevel); - return Status ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL; + return Status ? NO_ERROR : ERROR_INVALID_ACCESS; } /* @@ -60,14 +135,11 @@ VideoPortDisableInterrupt(IN PVOID HwDeviceExtension) DPRINT("VideoPortDisableInterrupt\n"); - DeviceExtension = CONTAINING_RECORD( - HwDeviceExtension, - VIDEO_PORT_DEVICE_EXTENSION, - MiniPortDeviceExtension); + DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); Status = HalDisableSystemInterrupt( DeviceExtension->InterruptVector, 0); - return Status ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL; + return Status ? NO_ERROR : ERROR_INVALID_ACCESS; } diff --git a/reactos/drivers/video/videoprt/resource.c b/reactos/drivers/video/videoprt/resource.c new file mode 100644 index 00000000000..d37e5f82cb7 --- /dev/null +++ b/reactos/drivers/video/videoprt/resource.c @@ -0,0 +1,657 @@ +/* + * VideoPort driver + * + * Copyright (C) 2002, 2003, 2004 ReactOS Team + * + * 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; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Id: resource.c,v 1.2 2004/03/19 20:58:32 navaraf Exp $ + */ + +#include "videoprt.h" + +/* PRIVATE FUNCTIONS **********************************************************/ + +PVOID STDCALL +IntVideoPortMapMemory( + IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension, + IN PHYSICAL_ADDRESS IoAddress, + IN ULONG NumberOfUchars, + IN UCHAR InIoSpace, + OUT VP_STATUS *Status) +{ + PHYSICAL_ADDRESS TranslatedAddress; + PVIDEO_PORT_ADDRESS_MAPPING AddressMapping; + ULONG AddressSpace; + PVOID MappedAddress; + PLIST_ENTRY Entry; + + DPRINT("- IoAddress: %lx\n", IoAddress.u.LowPart); + DPRINT("- NumberOfUchars: %lx\n", NumberOfUchars); + DPRINT("- InIoSpace: %x\n", InIoSpace); + + InIoSpace &= ~VIDEO_MEMORY_SPACE_DENSE; + if ((InIoSpace & VIDEO_MEMORY_SPACE_P6CACHE) != 0) + { + DPRINT("VIDEO_MEMORY_SPACE_P6CACHE not supported, turning off\n"); + InIoSpace &= ~VIDEO_MEMORY_SPACE_P6CACHE; + } + + if (!IsListEmpty(&DeviceExtension->AddressMappingListHead)) + { + Entry = DeviceExtension->AddressMappingListHead.Flink; + while (Entry != &DeviceExtension->AddressMappingListHead) + { + AddressMapping = CONTAINING_RECORD( + Entry, + VIDEO_PORT_ADDRESS_MAPPING, + List); + if (IoAddress.QuadPart == AddressMapping->IoAddress.QuadPart && + NumberOfUchars <= AddressMapping->NumberOfUchars) + { + AddressMapping->MappingCount++; + if (Status) + *Status = NO_ERROR; + + return AddressMapping->MappedAddress; + } + Entry = Entry->Flink; + } + } + + AddressSpace = (ULONG)InIoSpace; + if (HalTranslateBusAddress( + DeviceExtension->AdapterInterfaceType, + DeviceExtension->SystemIoBusNumber, + IoAddress, + &AddressSpace, + &TranslatedAddress) == FALSE) + { + if (Status) + *Status = ERROR_NOT_ENOUGH_MEMORY; + + return NULL; + } + + /* I/O space */ + if (AddressSpace != 0) + { + ASSERT(0 == TranslatedAddress.u.HighPart); + if (Status) + *Status = NO_ERROR; + + return (PVOID)TranslatedAddress.u.LowPart; + } + + MappedAddress = MmMapIoSpace( + TranslatedAddress, + NumberOfUchars, + FALSE); + + if (MappedAddress) + { + if (Status) + { + *Status = NO_ERROR; + } + + AddressMapping = ExAllocatePoolWithTag( + PagedPool, + sizeof(VIDEO_PORT_ADDRESS_MAPPING), + TAG_VIDEO_PORT); + + if (AddressMapping == NULL) + return MappedAddress; + + AddressMapping->MappedAddress = MappedAddress; + AddressMapping->NumberOfUchars = NumberOfUchars; + AddressMapping->IoAddress = IoAddress; + AddressMapping->SystemIoBusNumber = DeviceExtension->SystemIoBusNumber; + AddressMapping->MappingCount = 1; + + InsertHeadList( + &DeviceExtension->AddressMappingListHead, + &AddressMapping->List); + + return MappedAddress; + } + else + { + if (Status) + *Status = NO_ERROR; + + return NULL; + } +} + +VOID STDCALL +IntVideoPortUnmapMemory( + IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension, + IN PVOID MappedAddress) +{ + PVIDEO_PORT_ADDRESS_MAPPING AddressMapping; + PLIST_ENTRY Entry; + + Entry = DeviceExtension->AddressMappingListHead.Flink; + while (Entry != &DeviceExtension->AddressMappingListHead) + { + AddressMapping = CONTAINING_RECORD( + Entry, + VIDEO_PORT_ADDRESS_MAPPING, + List); + if (AddressMapping->MappedAddress == MappedAddress) + { + ASSERT(AddressMapping->MappingCount >= 0); + AddressMapping->MappingCount--; + if (AddressMapping->MappingCount == 0) + { + MmUnmapIoSpace( + AddressMapping->MappedAddress, + AddressMapping->NumberOfUchars); + RemoveEntryList(Entry); + ExFreePool(AddressMapping); + + return; + } + } + + Entry = Entry->Flink; + } +} + +/* PUBLIC FUNCTIONS ***********************************************************/ + +/* + * @implemented + */ + +PVOID STDCALL +VideoPortGetDeviceBase( + IN PVOID HwDeviceExtension, + IN PHYSICAL_ADDRESS IoAddress, + IN ULONG NumberOfUchars, + IN UCHAR InIoSpace) +{ + DPRINT("VideoPortGetDeviceBase\n"); + return IntVideoPortMapMemory( + VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension), + IoAddress, + NumberOfUchars, + InIoSpace, + NULL); +} + +/* + * @implemented + */ + +VOID STDCALL +VideoPortFreeDeviceBase( + IN PVOID HwDeviceExtension, + IN PVOID MappedAddress) +{ + DPRINT("VideoPortFreeDeviceBase\n"); + IntVideoPortUnmapMemory( + VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension), + MappedAddress); +} + +/* + * @unimplemented + */ + +VP_STATUS STDCALL +VideoPortMapBankedMemory( + IN PVOID HwDeviceExtension, + IN PHYSICAL_ADDRESS PhysicalAddress, + IN PULONG Length, + IN PULONG InIoSpace, + OUT PVOID *VirtualAddress, + IN ULONG BankLength, + IN UCHAR ReadWriteBank, + IN PBANKED_SECTION_ROUTINE BankRoutine, + IN PVOID Context) +{ + DPRINT("VideoPortMapBankedMemory\n"); + UNIMPLEMENTED; + return ERROR_CALL_NOT_IMPLEMENTED; +} + + +/* + * @implemented + */ + +VP_STATUS STDCALL +VideoPortMapMemory( + IN PVOID HwDeviceExtension, + IN PHYSICAL_ADDRESS PhysicalAddress, + IN PULONG Length, + IN PULONG InIoSpace, + OUT PVOID *VirtualAddress) +{ + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + NTSTATUS Status; + + DPRINT("VideoPortMapMemory\n"); + + DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); + *VirtualAddress = IntVideoPortMapMemory( + DeviceExtension, + PhysicalAddress, + *Length, + *InIoSpace, + &Status); + + return Status; +} + +/* + * @implemented + */ + +VP_STATUS STDCALL +VideoPortUnmapMemory( + IN PVOID HwDeviceExtension, + IN PVOID VirtualAddress, + IN HANDLE ProcessHandle) +{ + DPRINT("VideoPortFreeDeviceBase\n"); + + IntVideoPortUnmapMemory( + VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension), + VirtualAddress); + + return NO_ERROR; +} + +/* + * @implemented + */ + +VP_STATUS STDCALL +VideoPortGetAccessRanges( + IN PVOID HwDeviceExtension, + IN ULONG NumRequestedResources, + IN PIO_RESOURCE_DESCRIPTOR RequestedResources OPTIONAL, + IN ULONG NumAccessRanges, + IN PVIDEO_ACCESS_RANGE AccessRanges, + IN PVOID VendorId, + IN PVOID DeviceId, + IN PULONG Slot) +{ + PCI_SLOT_NUMBER PciSlotNumber; + ULONG FunctionNumber; + PCI_COMMON_CONFIG Config; + PCM_RESOURCE_LIST AllocatedResources; + NTSTATUS Status; + UINT AssignedCount; + CM_FULL_RESOURCE_DESCRIPTOR *FullList; + CM_PARTIAL_RESOURCE_DESCRIPTOR *Descriptor; + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + USHORT VendorIdToFind; + USHORT DeviceIdToFind; + ULONG SlotIdToFind; + ULONG ReturnedLength; + + DPRINT("VideoPortGetAccessRanges\n"); + + DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); + + if (NumRequestedResources == 0 && + DeviceExtension->AdapterInterfaceType == PCIBus) + { + if (DeviceExtension->PhysicalDeviceObject != NULL) + { + PciSlotNumber.u.AsULONG = DeviceExtension->SystemIoSlotNumber; + + ReturnedLength = HalGetBusData( + PCIConfiguration, + DeviceExtension->SystemIoBusNumber, + PciSlotNumber.u.AsULONG, + &Config, + sizeof(PCI_COMMON_CONFIG)); + + if (ReturnedLength != sizeof(PCI_COMMON_CONFIG)) + { + return ERROR_NO_SYSTEM_RESOURCES; + } + } + else + { + VendorIdToFind = VendorId != NULL ? *(PUSHORT)VendorId : 0; + DeviceIdToFind = DeviceId != NULL ? *(PUSHORT)DeviceId : 0; + SlotIdToFind = Slot != NULL ? *Slot : 0; + PciSlotNumber.u.AsULONG = SlotIdToFind; + + DPRINT("Looking for VendorId 0x%04x DeviceId 0x%04x\n", + VendorIdToFind, DeviceIdToFind); + + /* + * Search for the device id and vendor id on this bus. + */ + + for (FunctionNumber = 0; FunctionNumber < 8; FunctionNumber++) + { + DPRINT("- Function number: %d\n", FunctionNumber); + PciSlotNumber.u.bits.FunctionNumber = FunctionNumber; + ReturnedLength = HalGetBusData( + PCIConfiguration, + DeviceExtension->SystemIoBusNumber, + PciSlotNumber.u.AsULONG, + &Config, + sizeof(PCI_COMMON_CONFIG)); + DPRINT("- Length of data: %x\n", ReturnedLength); + if (ReturnedLength == sizeof(PCI_COMMON_CONFIG)) + { + DPRINT("- Slot 0x%02x (Device %d Function %d) VendorId 0x%04x " + "DeviceId 0x%04x\n", + PciSlotNumber.u.AsULONG, + PciSlotNumber.u.bits.DeviceNumber, + PciSlotNumber.u.bits.FunctionNumber, + Config.VendorID, + Config.DeviceID); + + if ((VendorIdToFind == 0 || Config.VendorID == VendorIdToFind) && + (DeviceIdToFind == 0 || Config.DeviceID == DeviceIdToFind)) + { + break; + } + } + } + + if (FunctionNumber == 8) + { + DPRINT("Didn't find device.\n"); + return ERROR_NO_SYSTEM_RESOURCES; + } + } + + Status = HalAssignSlotResources( + NULL, NULL, NULL, NULL, + DeviceExtension->AdapterInterfaceType, + DeviceExtension->SystemIoBusNumber, + PciSlotNumber.u.AsULONG, + &AllocatedResources); + + if (!NT_SUCCESS(Status)) + { + return Status; + } + + AssignedCount = 0; + for (FullList = AllocatedResources->List; + FullList < AllocatedResources->List + AllocatedResources->Count; + FullList++) + { + ASSERT(FullList->InterfaceType == PCIBus && + FullList->BusNumber == DeviceExtension->SystemIoBusNumber && + 1 == FullList->PartialResourceList.Version && + 1 == FullList->PartialResourceList.Revision); + for (Descriptor = FullList->PartialResourceList.PartialDescriptors; + Descriptor < FullList->PartialResourceList.PartialDescriptors + FullList->PartialResourceList.Count; + Descriptor++) + { + if ((Descriptor->Type == CmResourceTypeMemory || + Descriptor->Type == CmResourceTypePort) && + AssignedCount >= NumAccessRanges) + { + DPRINT1("Too many access ranges found\n"); + ExFreePool(AllocatedResources); + return ERROR_NO_SYSTEM_RESOURCES; + } + if (Descriptor->Type == CmResourceTypeMemory) + { + if (NumAccessRanges <= AssignedCount) + { + DPRINT1("Too many access ranges found\n"); + ExFreePool(AllocatedResources); + return ERROR_NO_SYSTEM_RESOURCES; + } + DPRINT("Memory range starting at 0x%08x length 0x%08x\n", + Descriptor->u.Memory.Start.u.LowPart, Descriptor->u.Memory.Length); + AccessRanges[AssignedCount].RangeStart = Descriptor->u.Memory.Start; + AccessRanges[AssignedCount].RangeLength = Descriptor->u.Memory.Length; + AccessRanges[AssignedCount].RangeInIoSpace = 0; + AccessRanges[AssignedCount].RangeVisible = 0; /* FIXME: Just guessing */ + AccessRanges[AssignedCount].RangeShareable = + (Descriptor->ShareDisposition == CmResourceShareShared); + AssignedCount++; + } + else if (Descriptor->Type == CmResourceTypePort) + { + DPRINT("Port range starting at 0x%04x length %d\n", + Descriptor->u.Memory.Start.u.LowPart, Descriptor->u.Memory.Length); + AccessRanges[AssignedCount].RangeStart = Descriptor->u.Port.Start; + AccessRanges[AssignedCount].RangeLength = Descriptor->u.Port.Length; + AccessRanges[AssignedCount].RangeInIoSpace = 1; + AccessRanges[AssignedCount].RangeVisible = 0; /* FIXME: Just guessing */ + AccessRanges[AssignedCount].RangeShareable = 0; + AssignedCount++; + } + else if (Descriptor->Type == CmResourceTypeInterrupt) + { + DeviceExtension->InterruptLevel = Descriptor->u.Interrupt.Level; + DeviceExtension->InterruptVector = Descriptor->u.Interrupt.Vector; + } + } + } + ExFreePool(AllocatedResources); + } + else + { + UNIMPLEMENTED + } + + return NO_ERROR; +} + +/* + * @unimplemented + */ + +VP_STATUS STDCALL +VideoPortVerifyAccessRanges( + IN PVOID HwDeviceExtension, + IN ULONG NumAccessRanges, + IN PVIDEO_ACCESS_RANGE AccessRanges) +{ + DPRINT1("VideoPortVerifyAccessRanges not implemented\n"); + return NO_ERROR; +} + +/* + * @unimplemented + */ + +VP_STATUS STDCALL +VideoPortGetDeviceData( + IN PVOID HwDeviceExtension, + IN VIDEO_DEVICE_DATA_TYPE DeviceDataType, + IN PMINIPORT_QUERY_DEVICE_ROUTINE CallbackRoutine, + IN PVOID Context) +{ + DPRINT("VideoPortGetDeviceData\n"); + UNIMPLEMENTED; + return ERROR_CALL_NOT_IMPLEMENTED; +} + +/* + * @implemented + */ + +PVOID STDCALL +VideoPortAllocatePool( + IN PVOID HwDeviceExtension, + IN VP_POOL_TYPE PoolType, + IN SIZE_T NumberOfBytes, + IN ULONG Tag) +{ + DPRINT("VideoPortAllocatePool\n"); + return ExAllocatePoolWithTag(PoolType, NumberOfBytes, Tag); +} + +/* + * @implemented + */ + +VOID STDCALL +VideoPortFreePool( + IN PVOID HwDeviceExtension, + IN PVOID Ptr) +{ + ExFreePool(Ptr); +} + +/* + * @implemented + */ + +VP_STATUS STDCALL +VideoPortAllocateBuffer( + IN PVOID HwDeviceExtension, + IN ULONG Size, + OUT PVOID *Buffer) +{ + DPRINT("VideoPortAllocateBuffer\n"); + *Buffer = ExAllocatePool(PagedPool, Size); + return *Buffer == NULL ? ERROR_NOT_ENOUGH_MEMORY : NO_ERROR; +} + +/* + * @implemented + */ + +VOID STDCALL +VideoPortReleaseBuffer( + IN PVOID HwDeviceExtension, + IN PVOID Ptr) +{ + DPRINT("VideoPortReleaseBuffer\n"); + ExFreePool(Ptr); +} + +/* + * @unimplemented + */ + +PVOID STDCALL +VideoPortLockBuffer( + IN PVOID HwDeviceExtension, + IN PVOID BaseAddress, + IN ULONG Length, + IN VP_LOCK_OPERATION Operation) +{ + DPRINT1("VideoPortLockBuffer: Unimplemented.\n"); + return NULL; +} + +/* + * @unimplemented + */ + +VOID STDCALL +VideoPortUnlockBuffer( + IN PVOID HwDeviceExtension, + IN PVOID Mdl) +{ + DPRINT1("VideoPortUnlockBuffer: Unimplemented.\n"); +} + +/* + * @unimplemented + */ + +VP_STATUS STDCALL +VideoPortSetTrappedEmulatorPorts( + IN PVOID HwDeviceExtension, + IN ULONG NumAccessRanges, + IN PVIDEO_ACCESS_RANGE AccessRange) +{ + DPRINT("VideoPortSetTrappedEmulatorPorts\n"); + /* Should store the ranges in the device extension for use by ntvdm. */ + return NO_ERROR; +} + +/* + * @implemented + */ + +ULONG STDCALL +VideoPortGetBusData( + IN PVOID HwDeviceExtension, + IN BUS_DATA_TYPE BusDataType, + IN ULONG SlotNumber, + OUT PVOID Buffer, + IN ULONG Offset, + IN ULONG Length) +{ + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + + DPRINT("VideoPortGetBusData\n"); + + DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); + + if (BusDataType != Cmos) + { + /* Legacy vs. PnP behaviour */ + if (DeviceExtension->PhysicalDeviceObject != NULL) + SlotNumber = DeviceExtension->SystemIoSlotNumber; + } + + return HalGetBusDataByOffset( + BusDataType, + DeviceExtension->SystemIoBusNumber, + SlotNumber, + Buffer, + Offset, + Length); +} + +/* + * @implemented + */ + +ULONG STDCALL +VideoPortSetBusData( + IN PVOID HwDeviceExtension, + IN BUS_DATA_TYPE BusDataType, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length) +{ + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + + DPRINT("VideoPortSetBusData\n"); + + DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); + + if (BusDataType != Cmos) + { + /* Legacy vs. PnP behaviour */ + if (DeviceExtension->PhysicalDeviceObject != NULL) + SlotNumber = DeviceExtension->SystemIoSlotNumber; + } + + return HalSetBusDataByOffset( + BusDataType, + DeviceExtension->SystemIoBusNumber, + SlotNumber, + Buffer, + Offset, + Length); +} diff --git a/reactos/drivers/video/videoprt/services.c b/reactos/drivers/video/videoprt/services.c index 67dd27eed72..8e773a2c872 100644 --- a/reactos/drivers/video/videoprt/services.c +++ b/reactos/drivers/video/videoprt/services.c @@ -18,7 +18,7 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: services.c,v 1.2 2004/03/06 08:39:06 jimtabor Exp $ + * $Id: services.c,v 1.3 2004/03/19 20:58:32 navaraf Exp $ */ #include "videoprt.h" @@ -35,8 +35,7 @@ IntInterfaceDereference(PVOID Context) /* Do nothing */ } -VP_STATUS -STDCALL +VP_STATUS STDCALL VideoPortQueryServices( IN PVOID HwDeviceExtension, IN VIDEO_PORT_SERVICES ServicesType, @@ -58,32 +57,28 @@ VideoPortQueryServices( Int10Interface->Int10ReadMemory = IntInt10ReadMemory; Int10Interface->Int10WriteMemory = IntInt10WriteMemory; Int10Interface->Int10CallBios = IntInt10CallBios; - return STATUS_SUCCESS; + return NO_ERROR; } break; case VideoPortServicesAGP: case VideoPortServicesI2C: case VideoPortServicesHeadless: - return STATUS_NOT_IMPLEMENTED; + return ERROR_CALL_NOT_IMPLEMENTED; default: break; } - return STATUS_UNSUCCESSFUL; + return ERROR_INVALID_FUNCTION; } - -BOOLEAN -STDCALL -VideoPortGetAgpServices(IN PVOID HwDeviceExtension, - IN PVIDEO_PORT_AGP_SERVICES AgpServices) +BOOLEAN STDCALL +VideoPortGetAgpServices( + IN PVOID HwDeviceExtension, + IN PVIDEO_PORT_AGP_SERVICES AgpServices) { - - DPRINT("VideoPortGetAgpServices\n"); - UNIMPLEMENTED; - return FALSE; + DPRINT("VideoPortGetAgpServices\n"); + UNIMPLEMENTED; + return FALSE; } - - diff --git a/reactos/drivers/video/videoprt/spinlock.c b/reactos/drivers/video/videoprt/spinlock.c index 3aa4721d37f..c66fea908f3 100644 --- a/reactos/drivers/video/videoprt/spinlock.c +++ b/reactos/drivers/video/videoprt/spinlock.c @@ -18,7 +18,7 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: spinlock.c,v 1.1 2004/03/09 17:28:49 navaraf Exp $ + * $Id: spinlock.c,v 1.2 2004/03/19 20:58:32 navaraf Exp $ */ #include "videoprt.h" @@ -35,9 +35,9 @@ VideoPortCreateSpinLock( DPRINT("VideoPortCreateSpinLock\n"); *SpinLock = ExAllocatePool(NonPagedPool, sizeof(KSPIN_LOCK)); if (*SpinLock == NULL) - return STATUS_UNSUCCESSFUL; + return ERROR_NOT_ENOUGH_MEMORY; KeInitializeSpinLock((PKSPIN_LOCK)*SpinLock); - return STATUS_SUCCESS; + return NO_ERROR; } /* @@ -51,7 +51,7 @@ VideoPortDeleteSpinLock( { DPRINT("VideoPortDeleteSpinLock\n"); ExFreePool(SpinLock); - return STATUS_SUCCESS; + return NO_ERROR; } /* diff --git a/reactos/drivers/video/videoprt/timer.c b/reactos/drivers/video/videoprt/timer.c new file mode 100644 index 00000000000..dcb63bb6038 --- /dev/null +++ b/reactos/drivers/video/videoprt/timer.c @@ -0,0 +1,92 @@ +/* + * VideoPort driver + * + * Copyright (C) 2002, 2003, 2004 ReactOS Team + * + * 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; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Id: timer.c,v 1.2 2004/03/19 20:58:32 navaraf Exp $ + */ + +#include "videoprt.h" + +/* PRIVATE FUNCTIONS **********************************************************/ + +VOID STDCALL +IntVideoPortTimerRoutine( + IN PDEVICE_OBJECT DeviceObject, + IN PVOID ServiceContext) +{ + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension = ServiceContext; + + ASSERT(DeviceExtension->DriverExtension->InitializationData.HwTimer != NULL); + + DeviceExtension->DriverExtension->InitializationData.HwTimer( + &DeviceExtension->MiniPortDeviceExtension); +} + +BOOLEAN STDCALL +IntVideoPortSetupTimer( + IN PDEVICE_OBJECT DeviceObject, + IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension) +{ + NTSTATUS Status; + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + + DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + + if (DriverExtension->InitializationData.HwTimer != NULL) + { + DPRINT("Initializing timer\n"); + + Status = IoInitializeTimer( + DeviceObject, + IntVideoPortTimerRoutine, + DeviceExtension); + + if (!NT_SUCCESS(Status)) + { + DPRINT("IoInitializeTimer failed with status 0x%08x\n", Status); + return FALSE; + } + } + + return TRUE; +} + +/* PUBLIC FUNCTIONS ***********************************************************/ + +/* + * @implemented + */ + +VOID STDCALL +VideoPortStartTimer(IN PVOID HwDeviceExtension) +{ + DPRINT("VideoPortStartTimer\n"); + IoStartTimer(VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension)->FunctionalDeviceObject); +} + +/* + * @implemented + */ + +VOID STDCALL +VideoPortStopTimer(IN PVOID HwDeviceExtension) +{ + DPRINT("VideoPortStopTimer\n"); + IoStopTimer(VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension)->FunctionalDeviceObject); +} diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index 349f90bb2bb..3fc4bb3e2e2 100644 --- a/reactos/drivers/video/videoprt/videoprt.c +++ b/reactos/drivers/video/videoprt/videoprt.c @@ -18,1059 +18,576 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: videoprt.c,v 1.23 2004/03/14 19:25:34 dwelch Exp $ + * $Id: videoprt.c,v 1.24 2004/03/19 20:58:32 navaraf Exp $ */ #include "videoprt.h" +#include "internal/ps.h" -BOOLEAN CsrssInitialized = FALSE; +/* GLOBAL VARIABLES ***********************************************************/ + +ULONG CsrssInitialized = FALSE; PEPROCESS Csrss = NULL; -PVIDEO_PORT_DEVICE_EXTENSION ResetDisplayParametersDeviceExtension = NULL; -static PVOID RomImageBuffer = NULL; -VOID STDCALL STATIC -VideoPortDeferredRoutine( +/* PRIVATE FUNCTIONS **********************************************************/ + +NTSTATUS STDCALL +DriverEntry( + IN PDRIVER_OBJECT DriverObject, + IN PUNICODE_STRING RegistryPath) +{ + return STATUS_SUCCESS; +} + +PVOID STDCALL +IntVideoPortImageDirectoryEntryToData( + PVOID BaseAddress, + ULONG Directory) +{ + 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; + + return (PVOID)(BaseAddress + Va); +} + +PVOID STDCALL +IntVideoPortGetProcAddress( + IN PVOID HwDeviceExtension, + IN PUCHAR FunctionName) +{ + SYSTEM_LOAD_IMAGE GdiDriverInfo; + PVOID BaseAddress; + PIMAGE_EXPORT_DIRECTORY ExportDir; + PUSHORT OrdinalPtr; + PULONG NamePtr; + PULONG AddressPtr; + ULONG i = 0; + NTSTATUS Status; + + DPRINT("VideoPortGetProcAddress(%s)\n", FunctionName); + + RtlInitUnicodeString(&GdiDriverInfo.ModuleName, L"videoprt"); + Status = ZwSetSystemInformation( + SystemLoadImage, + &GdiDriverInfo, + sizeof(SYSTEM_LOAD_IMAGE)); + if (!NT_SUCCESS(Status)) + { + DPRINT("Couldn't get our own module handle?\n"); + return NULL; + } + + BaseAddress = GdiDriverInfo.ModuleBase; + + /* Get the pointer to the export directory */ + ExportDir = (PIMAGE_EXPORT_DIRECTORY)IntVideoPortImageDirectoryEntryToData( + BaseAddress, + IMAGE_DIRECTORY_ENTRY_EXPORT); + + /* Search by name */ + AddressPtr = (PULONG) + ((ULONG_PTR)BaseAddress + (ULONG_PTR)ExportDir->AddressOfFunctions); + OrdinalPtr = (PUSHORT) + ((ULONG_PTR)BaseAddress + (ULONG_PTR)ExportDir->AddressOfNameOrdinals); + NamePtr = (PULONG) + ((ULONG_PTR)BaseAddress + (ULONG_PTR)ExportDir->AddressOfNames); + for (i = 0; i < ExportDir->NumberOfNames; i++, NamePtr++, OrdinalPtr++) + { + if (!_strnicmp(FunctionName, (char*)(BaseAddress + *NamePtr), + strlen(FunctionName))) + { + return (PVOID)((ULONG_PTR)BaseAddress + + (ULONG_PTR)AddressPtr[*OrdinalPtr]); + } + } + + DPRINT("VideoPortGetProcAddress: Can't resolve symbol %s\n", FunctionName); + + return NULL; +} + +VOID STDCALL +IntVideoPortDeferredRoutine( IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, - IN PVOID SystemArgument2 - ); -PVOID STDCALL -VideoPortGetProcAddress(IN PVOID HwDeviceExtension, - IN PUCHAR FunctionName); - -// ------------------------------------------------------- Public Interface - -// DriverEntry -// -// DESCRIPTION: -// This function initializes the driver. -// -// RUN LEVEL: -// PASSIVE_LEVEL -// -// ARGUMENTS: -// IN PDRIVER_OBJECT DriverObject System allocated Driver Object -// for this driver -// IN PUNICODE_STRING RegistryPath Name of registry driver service -// key -// -// RETURNS: -// NTSTATUS - -NTSTATUS STDCALL -DriverEntry(IN PDRIVER_OBJECT DriverObject, - IN PUNICODE_STRING RegistryPath) + IN PVOID SystemArgument2) { - DPRINT("DriverEntry()\n"); - return(STATUS_SUCCESS); + PVOID HwDeviceExtension = + &((PVIDEO_PORT_DEVICE_EXTENSION)DeferredContext)->MiniPortDeviceExtension; + ((PMINIPORT_DPC_ROUTINE)SystemArgument1)(HwDeviceExtension, SystemArgument2); } -/* - * @implemented - */ -VOID -VideoPortDebugPrint(IN VIDEO_DEBUG_LEVEL DebugPrintLevel, - IN PCHAR DebugMessage, ...) -{ - char Buffer[256]; - va_list ap; - -/* - if (DebugPrintLevel > InternalDebugLevel) - return; -*/ - va_start (ap, DebugMessage); - vsprintf (Buffer, DebugMessage, ap); - va_end (ap); - - DbgPrint (Buffer); -} - - -/* - * @implemented - */ -VOID -STDCALL -VideoPortFreeDeviceBase(IN PVOID HwDeviceExtension, - IN PVOID MappedAddress) -{ - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - - DPRINT("VideoPortFreeDeviceBase\n"); - - DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, - VIDEO_PORT_DEVICE_EXTENSION, - MiniPortDeviceExtension); - - InternalUnmapMemory(DeviceExtension, MappedAddress); -} - - -/* - * @implemented - */ -ULONG -STDCALL -VideoPortGetBusData(IN PVOID HwDeviceExtension, - IN BUS_DATA_TYPE BusDataType, - IN ULONG SlotNumber, - OUT PVOID Buffer, - IN ULONG Offset, - IN ULONG Length) -{ - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - - DPRINT("VideoPortGetBusData\n"); - - DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, - VIDEO_PORT_DEVICE_EXTENSION, - MiniPortDeviceExtension); - - return HalGetBusDataByOffset(BusDataType, - DeviceExtension->SystemIoBusNumber, - SlotNumber, - Buffer, - Offset, - Length); -} - - -/* - * @implemented - */ -UCHAR -STDCALL -VideoPortGetCurrentIrql(VOID) -{ - return KeGetCurrentIrql(); -} - - -/* - * @implemented - */ -PVOID -STDCALL -VideoPortGetDeviceBase(IN PVOID HwDeviceExtension, - IN PHYSICAL_ADDRESS IoAddress, - IN ULONG NumberOfUchars, - IN UCHAR InIoSpace) -{ - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - - DPRINT("VideoPortGetDeviceBase\n"); - - DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, - VIDEO_PORT_DEVICE_EXTENSION, - MiniPortDeviceExtension); - - return InternalMapMemory(DeviceExtension, IoAddress, NumberOfUchars, InIoSpace, NULL); -} - - -/* - * @unimplemented - */ -VP_STATUS -STDCALL -VideoPortGetDeviceData(IN PVOID HwDeviceExtension, - IN VIDEO_DEVICE_DATA_TYPE DeviceDataType, - IN PMINIPORT_QUERY_DEVICE_ROUTINE CallbackRoutine, - IN PVOID Context) -{ - DPRINT("VideoPortGetDeviceData\n"); - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; -} - - -/* - * @implemented - */ -VP_STATUS -STDCALL -VideoPortGetAccessRanges(IN PVOID HwDeviceExtension, - IN ULONG NumRequestedResources, - IN PIO_RESOURCE_DESCRIPTOR RequestedResources OPTIONAL, - IN ULONG NumAccessRanges, - IN PVIDEO_ACCESS_RANGE AccessRanges, - IN PVOID VendorId, - IN PVOID DeviceId, - IN PULONG Slot) -{ - PCI_SLOT_NUMBER PciSlotNumber; - ULONG FunctionNumber; - PCI_COMMON_CONFIG Config; - PCM_RESOURCE_LIST AllocatedResources; - NTSTATUS Status; - UINT AssignedCount; - CM_FULL_RESOURCE_DESCRIPTOR *FullList; - CM_PARTIAL_RESOURCE_DESCRIPTOR *Descriptor; - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - USHORT VendorIdToFind; - USHORT DeviceIdToFind; - ULONG SlotIdToFind; - - DPRINT("VideoPortGetAccessRanges\n"); - - DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, - VIDEO_PORT_DEVICE_EXTENSION, - MiniPortDeviceExtension); - - if (0 == NumRequestedResources && - PCIBus == DeviceExtension->AdapterInterfaceType) - { - VendorIdToFind = VendorId != NULL ? *(PUSHORT)VendorId : 0; - DeviceIdToFind = DeviceId != NULL ? *(PUSHORT)DeviceId : 0; - SlotIdToFind = Slot != NULL ? *Slot : 0; - - DPRINT("Looking for VendorId 0x%04x DeviceId 0x%04x SlotId 0x%04x\n", - VendorIdToFind, DeviceIdToFind, SlotIdToFind); - - PciSlotNumber.u.AsULONG = SlotIdToFind; - - /* - Search for the device id and vendor id on this bus. - */ - for (FunctionNumber = 0; FunctionNumber < 8; FunctionNumber++) - { - ULONG ReturnedLength; - DPRINT("- Function number: %d\n", FunctionNumber); - PciSlotNumber.u.bits.FunctionNumber = FunctionNumber; - ReturnedLength = HalGetBusData(PCIConfiguration, - DeviceExtension->SystemIoBusNumber, - PciSlotNumber.u.AsULONG, - &Config, - sizeof(PCI_COMMON_CONFIG)); - DPRINT("- Length of data: %x\n", ReturnedLength); - if (sizeof(PCI_COMMON_CONFIG) == ReturnedLength) - { - DPRINT("- Slot 0x%02x (Device %d Function %d) VendorId 0x%04x " - "DeviceId 0x%04x\n", - PciSlotNumber.u.AsULONG, - PciSlotNumber.u.bits.DeviceNumber, - PciSlotNumber.u.bits.FunctionNumber, - Config.VendorID, - Config.DeviceID); - - if ((VendorIdToFind == 0 || Config.VendorID == VendorIdToFind) && - (DeviceIdToFind == 0 || Config.DeviceID == DeviceIdToFind)) - { - break; - } - } - } - if (FunctionNumber == 8) - { - DPRINT("Didn't find device.\n"); - return STATUS_UNSUCCESSFUL; - } - - Status = HalAssignSlotResources(NULL, NULL, NULL, NULL, - DeviceExtension->AdapterInterfaceType, - DeviceExtension->SystemIoBusNumber, - PciSlotNumber.u.AsULONG, - &AllocatedResources); - if (! NT_SUCCESS(Status)) - { - return Status; - } - AssignedCount = 0; - for (FullList = AllocatedResources->List; - FullList < AllocatedResources->List + AllocatedResources->Count; - FullList++) - { - assert(FullList->InterfaceType == PCIBus && - FullList->BusNumber == DeviceExtension->SystemIoBusNumber && - 1 == FullList->PartialResourceList.Version && - 1 == FullList->PartialResourceList.Revision); - for (Descriptor = FullList->PartialResourceList.PartialDescriptors; - Descriptor < FullList->PartialResourceList.PartialDescriptors + FullList->PartialResourceList.Count; - Descriptor++) - { - if ((CmResourceTypeMemory == Descriptor->Type - || CmResourceTypePort == Descriptor->Type) - && NumAccessRanges <= AssignedCount) - { - DPRINT1("Too many access ranges found\n"); - ExFreePool(AllocatedResources); - return STATUS_UNSUCCESSFUL; - } - if (CmResourceTypeMemory == Descriptor->Type) - { - if (NumAccessRanges <= AssignedCount) - { - DPRINT1("Too many access ranges found\n"); - ExFreePool(AllocatedResources); - return STATUS_UNSUCCESSFUL; - } - DPRINT("Memory range starting at 0x%08x length 0x%08x\n", - Descriptor->u.Memory.Start.u.LowPart, Descriptor->u.Memory.Length); - AccessRanges[AssignedCount].RangeStart = Descriptor->u.Memory.Start; - AccessRanges[AssignedCount].RangeLength = Descriptor->u.Memory.Length; - AccessRanges[AssignedCount].RangeInIoSpace = 0; - AccessRanges[AssignedCount].RangeVisible = 0; /* FIXME: Just guessing */ - AccessRanges[AssignedCount].RangeShareable = - (CmResourceShareShared == Descriptor->ShareDisposition); - AssignedCount++; - } - else if (CmResourceTypePort == Descriptor->Type) - { - DPRINT("Port range starting at 0x%04x length %d\n", - Descriptor->u.Memory.Start.u.LowPart, Descriptor->u.Memory.Length); - AccessRanges[AssignedCount].RangeStart = Descriptor->u.Port.Start; - AccessRanges[AssignedCount].RangeLength = Descriptor->u.Port.Length; - AccessRanges[AssignedCount].RangeInIoSpace = 1; - AccessRanges[AssignedCount].RangeVisible = 0; /* FIXME: Just guessing */ - AccessRanges[AssignedCount].RangeShareable = 0; - AssignedCount++; - } - else if (CmResourceTypeInterrupt == Descriptor->Type) - { - DeviceExtension->InterruptLevel = Descriptor->u.Interrupt.Level; - DeviceExtension->InterruptVector = Descriptor->u.Interrupt.Vector; - } - } - } - ExFreePool(AllocatedResources); - } - else - { - UNIMPLEMENTED - } - - return STATUS_SUCCESS; -} - -typedef struct QueryRegistryCallbackContext -{ - PVOID HwDeviceExtension; - PVOID HwContext; - PMINIPORT_GET_REGISTRY_ROUTINE HwGetRegistryRoutine; -} QUERY_REGISTRY_CALLBACK_CONTEXT, *PQUERY_REGISTRY_CALLBACK_CONTEXT; - -static NTSTATUS STDCALL -QueryRegistryCallback(IN PWSTR ValueName, - IN ULONG ValueType, - IN PVOID ValueData, - IN ULONG ValueLength, - IN PVOID Context, - IN PVOID EntryContext) -{ - PQUERY_REGISTRY_CALLBACK_CONTEXT CallbackContext = (PQUERY_REGISTRY_CALLBACK_CONTEXT) Context; - - DPRINT("Found registry value for name %S: type %d, length %d\n", - ValueName, ValueType, ValueLength); - return (*(CallbackContext->HwGetRegistryRoutine))(CallbackContext->HwDeviceExtension, - CallbackContext->HwContext, - ValueName, - ValueData, - ValueLength); -} - -/* - * @unimplemented - */ -VP_STATUS -STDCALL -VideoPortGetRegistryParameters(IN PVOID HwDeviceExtension, - IN PWSTR ParameterName, - IN UCHAR IsParameterFileName, - IN PMINIPORT_GET_REGISTRY_ROUTINE GetRegistryRoutine, - IN PVOID HwContext) -{ - RTL_QUERY_REGISTRY_TABLE QueryTable[2]; - QUERY_REGISTRY_CALLBACK_CONTEXT Context; - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - - DPRINT("VideoPortGetRegistryParameters ParameterName %S\n", ParameterName); - - DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, - VIDEO_PORT_DEVICE_EXTENSION, - MiniPortDeviceExtension); - - if (IsParameterFileName) - { - UNIMPLEMENTED; - } - - Context.HwDeviceExtension = HwDeviceExtension; - Context.HwContext = HwContext; - Context.HwGetRegistryRoutine = GetRegistryRoutine; - - QueryTable[0].QueryRoutine = QueryRegistryCallback; - QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED; - QueryTable[0].Name = ParameterName; - QueryTable[0].EntryContext = NULL; - QueryTable[0].DefaultType = REG_NONE; - QueryTable[0].DefaultData = NULL; - QueryTable[0].DefaultLength = 0; - - QueryTable[1].QueryRoutine = NULL; - QueryTable[1].Name = NULL; - - return NT_SUCCESS(RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE, - DeviceExtension->RegistryPath.Buffer, - QueryTable, &Context, NULL)) - ? ERROR_SUCCESS : ERROR_INVALID_PARAMETER; -} - - -/* - * @implemented - */ -VP_STATUS -STDCALL -VideoPortGetVgaStatus(IN PVOID HwDeviceExtension, - OUT PULONG VgaStatus) -{ - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - - DPRINT("VideoPortGetVgaStatus = %x \n", VgaStatus); - - DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, - VIDEO_PORT_DEVICE_EXTENSION, - MiniPortDeviceExtension); - - if(KeGetCurrentIrql() == PASSIVE_LEVEL) - { - DPRINT("VideoPortGetVgaStatus1 = %x \n", VgaStatus); - - if ( PCIBus == DeviceExtension->AdapterInterfaceType) - { -/* - VgaStatus 0 == VGA not enabled, 1 == VGA enabled. - */ - DPRINT("VideoPortGetVgaStatus2 = %x \n", VgaStatus); - - /* Assumed for now */ - - VgaStatus = (PULONG) 1; - - return STATUS_SUCCESS; - } - } - DPRINT("VideoPortGetVgaStatus3 = %x \n", VgaStatus); - - return ERROR_INVALID_FUNCTION; -} - -static BOOLEAN STDCALL -VPInterruptRoutine(IN struct _KINTERRUPT *Interrupt, - IN PVOID ServiceContext) -{ - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - - DeviceExtension = ServiceContext; - assert(NULL != DeviceExtension->HwInterrupt); - - return DeviceExtension->HwInterrupt(&DeviceExtension->MiniPortDeviceExtension); -} - -static VOID STDCALL -VPTimerRoutine(IN PDEVICE_OBJECT DeviceObject, - IN PVOID Context) -{ - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - - DeviceExtension = Context; - assert(DeviceExtension == DeviceObject->DeviceExtension - && NULL != DeviceExtension->HwTimer); - - DeviceExtension->HwTimer(&DeviceExtension->MiniPortDeviceExtension); -} - -/* - * @implemented - */ ULONG STDCALL -VideoPortInitialize(IN PVOID Context1, - IN PVOID Context2, - IN PVIDEO_HW_INITIALIZATION_DATA HwInitializationData, - IN PVOID HwContext) +IntVideoPortAllocateDeviceNumber(VOID) { - PUNICODE_STRING RegistryPath; - UCHAR Again = FALSE; - WCHAR DeviceBuffer[20]; - WCHAR SymlinkBuffer[20]; - WCHAR DeviceVideoBuffer[20]; - NTSTATUS Status; - PDRIVER_OBJECT MPDriverObject = (PDRIVER_OBJECT) Context1; - PDEVICE_OBJECT MPDeviceObject; - VIDEO_PORT_CONFIG_INFO ConfigInfo; - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - ULONG DisplayNumber; - UNICODE_STRING DeviceName; - UNICODE_STRING SymlinkName; - ULONG MaxBus; - ULONG MaxLen; - KIRQL IRQL; - KAFFINITY Affinity; - ULONG InterruptVector; - OBJECT_ATTRIBUTES Obj; - HANDLE ObjHandle; + NTSTATUS Status; + ULONG DeviceNumber; + WCHAR SymlinkBuffer[20]; + UNICODE_STRING SymlinkName; - DPRINT("VideoPortInitialize\n"); + for (DeviceNumber = 0;;) + { + OBJECT_ATTRIBUTES Obj; + HANDLE ObjHandle; - RegistryPath = (PUNICODE_STRING) Context2; - - /* Build Dispatch table from passed data */ - MPDriverObject->DriverStartIo = (PDRIVER_STARTIO) HwInitializationData->HwStartIO; - - /* Find the first free device number */ - for (DisplayNumber = 0;;) - { - swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DisplayNumber + 1); + swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DeviceNumber + 1); RtlInitUnicodeString(&SymlinkName, SymlinkBuffer); InitializeObjectAttributes(&Obj, &SymlinkName, 0, NULL, NULL); Status = ZwOpenSymbolicLinkObject(&ObjHandle, GENERIC_READ, &Obj); if (NT_SUCCESS(Status)) - { - ZwClose(ObjHandle); - DisplayNumber++; - continue; - } + { + ZwClose(ObjHandle); + DeviceNumber++; + continue; + } else if (Status == STATUS_NOT_FOUND || Status == STATUS_UNSUCCESSFUL) - { - break; - } + break; else - { - return Status; - } - } + return 0xFFFFFFFF; + } - DPRINT("- DisplayNumber: %d\n", DisplayNumber); + return DeviceNumber; +} - Again = FALSE; +NTSTATUS STDCALL +IntVideoPortFindAdapter( + IN PDRIVER_OBJECT DriverObject, + IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, + IN PDEVICE_OBJECT PhysicalDeviceObject) +{ + WCHAR DeviceVideoBuffer[20]; + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + ULONG DeviceNumber; + ULONG Size; + NTSTATUS Status; + VIDEO_PORT_CONFIG_INFO ConfigInfo; + SYSTEM_BASIC_INFORMATION SystemBasicInfo; + UCHAR Again = FALSE; + WCHAR DeviceBuffer[20]; + UNICODE_STRING DeviceName; + WCHAR SymlinkBuffer[20]; + UNICODE_STRING SymlinkName; + PDEVICE_OBJECT DeviceObject; + BOOL LegacyDetection; - do - { - /* Create a unicode device name. */ - swprintf(DeviceBuffer, L"\\Device\\Video%lu", DisplayNumber); - RtlInitUnicodeString(&DeviceName, DeviceBuffer); + /* + * Find the first free device number that can be used for video device + * object names and symlinks. + */ - /* Create the device. */ - Status = IoCreateDevice( - MPDriverObject, - HwInitializationData->HwDeviceExtensionSize + - sizeof(VIDEO_PORT_DEVICE_EXTENSION), - &DeviceName, - FILE_DEVICE_VIDEO, - 0, - TRUE, - &MPDeviceObject); + DeviceNumber = IntVideoPortAllocateDeviceNumber(); + if (DeviceNumber == 0xFFFFFFFF) + { + DPRINT("Can't find free device number\n"); + return STATUS_UNSUCCESSFUL; + } + + /* + * Create the device object, we need it even for calling HwFindAdapter :( + */ + + /* Create a unicode device name. */ + swprintf(DeviceBuffer, L"\\Device\\Video%lu", DeviceNumber); + RtlInitUnicodeString(&DeviceName, DeviceBuffer); + + /* Create the device object. */ + Status = IoCreateDevice( + DriverObject, + sizeof(VIDEO_PORT_DEVICE_EXTENSION) + + DriverExtension->InitializationData.HwDeviceExtensionSize, + &DeviceName, + FILE_DEVICE_VIDEO, + 0, + TRUE, + &DeviceObject); + + if (!NT_SUCCESS(Status)) + { + DPRINT("IoCreateDevice call failed with status 0x%08x\n", Status); + return Status; + } + + /* + * Set the buffering strategy here. If you change this, remember + * to change VidDispatchDeviceControl too. + */ + + DeviceObject->Flags |= DO_BUFFERED_IO; + + /* + * Initialize device extension. + */ + + DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + DeviceExtension->PhysicalDeviceObject = PhysicalDeviceObject; + DeviceExtension->FunctionalDeviceObject = DeviceObject; + DeviceExtension->DriverExtension = DriverExtension; + + DeviceExtension->RegistryPath.Length = + DeviceExtension->RegistryPath.MaximumLength = + DriverExtension->RegistryPath.Length + (9 * sizeof(WCHAR)); + DeviceExtension->RegistryPath.Length -= sizeof(WCHAR); + DeviceExtension->RegistryPath.Buffer = ExAllocatePoolWithTag( + NonPagedPool, + DeviceExtension->RegistryPath.MaximumLength, + TAG_VIDEO_PORT); + swprintf(DeviceExtension->RegistryPath.Buffer, L"%s\\Device0", + DriverExtension->RegistryPath.Buffer); + + if (PhysicalDeviceObject == NULL) + { + LegacyDetection = TRUE; + } + else + { + /* Get bus number from the upper level bus driver. */ + Size = sizeof(ULONG); + Status = IoGetDeviceProperty( + PhysicalDeviceObject, + DevicePropertyBusNumber, + Size, + &DeviceExtension->SystemIoBusNumber, + &Size); if (!NT_SUCCESS(Status)) - { - DPRINT("IoCreateDevice call failed with status 0x%08x\n", Status); - return Status; - } + { + DPRINT("Couldn't get an information from bus driver. We will try to\n" + "use legacy detection method, but even that doesn't mean that\n" + "it will work.\n"); + DeviceExtension->PhysicalDeviceObject = NULL; + LegacyDetection = TRUE; + } + } - MPDriverObject->DeviceObject = MPDeviceObject; + DeviceExtension->AdapterInterfaceType = + DriverExtension->InitializationData.AdapterInterfaceType; - /* Initialize the miniport drivers dispatch table */ - MPDriverObject->MajorFunction[IRP_MJ_CREATE] = VidDispatchOpen; - MPDriverObject->MajorFunction[IRP_MJ_CLOSE] = VidDispatchClose; - MPDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = VidDispatchDeviceControl; + if (PhysicalDeviceObject != NULL) + { + /* Get bus type from the upper level bus driver. */ + Size = sizeof(ULONG); + IoGetDeviceProperty( + PhysicalDeviceObject, + DevicePropertyLegacyBusType, + Size, + &DeviceExtension->AdapterInterfaceType, + &Size); - /* Initialize our device extension */ - DeviceExtension = - (PVIDEO_PORT_DEVICE_EXTENSION) MPDeviceObject->DeviceExtension; - DeviceExtension->DeviceObject = MPDeviceObject; - DeviceExtension->HwInitialize = HwInitializationData->HwInitialize; - DeviceExtension->HwResetHw = HwInitializationData->HwResetHw; - DeviceExtension->AdapterInterfaceType = HwInitializationData->AdapterInterfaceType; - DeviceExtension->SystemIoBusNumber = 0; - KeInitializeDpc(&DeviceExtension->DpcObject, VideoPortDeferredRoutine, - (PVOID)DeviceExtension); - MaxLen = (wcslen(RegistryPath->Buffer) + 10) * sizeof(WCHAR); - DeviceExtension->RegistryPath.MaximumLength = MaxLen; - DeviceExtension->RegistryPath.Buffer = ExAllocatePoolWithTag(PagedPool, - MaxLen, - TAG_VIDEO_PORT); - swprintf(DeviceExtension->RegistryPath.Buffer, L"%s\\Device0", - RegistryPath->Buffer); - DeviceExtension->RegistryPath.Length = wcslen(DeviceExtension->RegistryPath.Buffer) * - sizeof(WCHAR); + /* Get bus device address from the upper level bus driver. */ + Size = sizeof(ULONG); + IoGetDeviceProperty( + PhysicalDeviceObject, + DevicePropertyAddress, + Size, + &DeviceExtension->SystemIoSlotNumber, + &Size); + } - MaxBus = (DeviceExtension->AdapterInterfaceType == PCIBus) ? 8 : 1; - DPRINT("MaxBus: %lu\n", MaxBus); - InitializeListHead(&DeviceExtension->AddressMappingListHead); - - /* Set the buffering strategy here... */ - /* If you change this, remember to change VidDispatchDeviceControl too */ - MPDeviceObject->Flags |= DO_BUFFERED_IO; + InitializeListHead(&DeviceExtension->AddressMappingListHead); + KeInitializeDpc( + &DeviceExtension->DpcObject, + IntVideoPortDeferredRoutine, + DeviceExtension); - do - { - RtlZeroMemory(&DeviceExtension->MiniPortDeviceExtension, - HwInitializationData->HwDeviceExtensionSize); - DPRINT("Searching on bus %d\n", DeviceExtension->SystemIoBusNumber); - /* Setup configuration info */ - RtlZeroMemory(&ConfigInfo, sizeof(VIDEO_PORT_CONFIG_INFO)); - ConfigInfo.Length = sizeof(VIDEO_PORT_CONFIG_INFO); - ConfigInfo.AdapterInterfaceType = DeviceExtension->AdapterInterfaceType; - ConfigInfo.SystemIoBusNumber = DeviceExtension->SystemIoBusNumber; - ConfigInfo.InterruptMode = (PCIBus == DeviceExtension->AdapterInterfaceType) ? - LevelSensitive : Latched; - ConfigInfo.DriverRegistryPath = RegistryPath->Buffer; - ConfigInfo.VideoPortGetProcAddress = VideoPortGetProcAddress; + /* + * Uff, the DeviceExtension is setup. Now it's needed to setup + * a ConfigInfo structure that we will pass to HwFindAdapter. + */ - /* Call HwFindAdapter entry point */ - /* FIXME: Need to figure out what string to pass as param 3 */ - Status = HwInitializationData->HwFindAdapter(&DeviceExtension->MiniPortDeviceExtension, - Context2, - NULL, - &ConfigInfo, - &Again); - if (NO_ERROR != Status) - { - DPRINT("HwFindAdapter call failed with error %X\n", Status); - DeviceExtension->SystemIoBusNumber++; - } - } - while (NO_ERROR != Status && DeviceExtension->SystemIoBusNumber < MaxBus); + RtlZeroMemory(&ConfigInfo, sizeof(VIDEO_PORT_CONFIG_INFO)); + ConfigInfo.Length = sizeof(VIDEO_PORT_CONFIG_INFO); + ConfigInfo.AdapterInterfaceType = DeviceExtension->AdapterInterfaceType; + if (ConfigInfo.AdapterInterfaceType == PCIBus) + ConfigInfo.InterruptMode = LevelSensitive; + else + ConfigInfo.InterruptMode = Latched; + ConfigInfo.DriverRegistryPath = DriverExtension->RegistryPath.Buffer; + ConfigInfo.VideoPortGetProcAddress = IntVideoPortGetProcAddress; + ConfigInfo.SystemIoBusNumber = DeviceExtension->SystemIoBusNumber; - if (NO_ERROR != Status) - { - RtlFreeUnicodeString(&DeviceExtension->RegistryPath); - IoDeleteDevice(MPDeviceObject); + Size = sizeof(SystemBasicInfo); + Status = ZwQuerySystemInformation( + SystemBasicInformation, + &SystemBasicInfo, + Size, + &Size); - return Status; - } - DPRINT("Found adapter\n"); + if (NT_SUCCESS(Status)) + { + ConfigInfo.SystemMemorySize = + SystemBasicInfo.NumberOfPhysicalPages * + SystemBasicInfo.PhysicalPageSize; + } - /* create symbolic link "\??\DISPLAYx" */ - swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DisplayNumber + 1); - RtlInitUnicodeString (&SymlinkName, - SymlinkBuffer); - IoCreateSymbolicLink (&SymlinkName, - &DeviceName); + /* + * Call miniport HwVidFindAdapter entry point to detect if + * particular device is present. There are two possible code + * paths. The first one is for Legacy drivers (NT4) and cases + * when we don't have information about what bus we're on. The + * second case is the standard one for Plug & Play drivers. + */ + + if (LegacyDetection) + { + ULONG BusNumber, MaxBuses; - /* Add entry to DEVICEMAP\VIDEO key in registry */ - swprintf(DeviceVideoBuffer, L"\\Device\\Video%d", DisplayNumber); - RtlWriteRegistryValue(RTL_REGISTRY_DEVICEMAP, - L"VIDEO", - DeviceVideoBuffer, - REG_SZ, - DeviceExtension->RegistryPath.Buffer, - DeviceExtension->RegistryPath.Length + sizeof(WCHAR)); + MaxBuses = DeviceExtension->AdapterInterfaceType == PCIBus ? 8 : 1; - /* FIXME: Allocate hardware resources for device */ + for (BusNumber = 0; BusNumber < MaxBuses; BusNumber++) + { + DeviceExtension->SystemIoBusNumber = + ConfigInfo.SystemIoBusNumber = BusNumber; - /* Allocate interrupt for device */ - DeviceExtension->HwInterrupt = HwInitializationData->HwInterrupt; - if (0 == ConfigInfo.BusInterruptVector) - { - ConfigInfo.BusInterruptVector = DeviceExtension->InterruptVector; - } - if (0 == ConfigInfo.BusInterruptLevel) - { - ConfigInfo.BusInterruptLevel = DeviceExtension->InterruptLevel; - } - if (NULL != HwInitializationData->HwInterrupt) - { - InterruptVector = - HalGetInterruptVector(ConfigInfo.AdapterInterfaceType, - ConfigInfo.SystemIoBusNumber, - ConfigInfo.BusInterruptLevel, - ConfigInfo.BusInterruptVector, - &IRQL, - &Affinity); - if (0 == InterruptVector) - { - DPRINT1("HalGetInterruptVector failed\n"); - IoDeleteDevice(MPDeviceObject); - - return STATUS_INSUFFICIENT_RESOURCES; - } - KeInitializeSpinLock(&DeviceExtension->InterruptSpinLock); - Status = IoConnectInterrupt(&DeviceExtension->InterruptObject, - VPInterruptRoutine, - DeviceExtension, - &DeviceExtension->InterruptSpinLock, - InterruptVector, - IRQL, - IRQL, - ConfigInfo.InterruptMode, - FALSE, - Affinity, - FALSE); - if (!NT_SUCCESS(Status)) - { - DPRINT1("IoConnectInterrupt failed with status 0x%08x\n", Status); - IoDeleteDevice(MPDeviceObject); - - return Status; - } - } - DisplayNumber++; - } - while (Again); + RtlZeroMemory(&DeviceExtension->MiniPortDeviceExtension, + DriverExtension->InitializationData.HwDeviceExtensionSize); + + /* FIXME: Need to figure out what string to pass as param 3. */ + Status = DriverExtension->InitializationData.HwFindAdapter( + &DeviceExtension->MiniPortDeviceExtension, + DriverExtension->HwContext, + NULL, + &ConfigInfo, + &Again); + + if (Status == ERROR_DEV_NOT_EXIST) + { + continue; + } + else if (Status == NO_ERROR) + { + break; + } + else + { + DPRINT("HwFindAdapter call failed with error %X\n", Status); + RtlFreeUnicodeString(&DeviceExtension->RegistryPath); + IoDeleteDevice(DeviceObject); + + return Status; + } + } + } + else + { + /* FIXME: Need to figure out what string to pass as param 3. */ + Status = DriverExtension->InitializationData.HwFindAdapter( + &DeviceExtension->MiniPortDeviceExtension, + DriverExtension->HwContext, + NULL, + &ConfigInfo, + &Again); + } + + if (Status != NO_ERROR) + { + DPRINT("HwFindAdapter call failed with error %X\n", Status); + RtlFreeUnicodeString(&DeviceExtension->RegistryPath); + IoDeleteDevice(DeviceObject); + return Status; + } + + /* + * Now we know the device is present, so let's do all additional tasks + * such as creating symlinks or setting up interrupts and timer. + */ + + /* Create symbolic link "\??\DISPLAYx" */ + swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DeviceNumber + 1); + RtlInitUnicodeString(&SymlinkName, SymlinkBuffer); + IoCreateSymbolicLink(&SymlinkName, &DeviceName); + + /* Add entry to DEVICEMAP\VIDEO key in registry. */ + swprintf(DeviceVideoBuffer, L"\\Device\\Video%d", DeviceNumber); + RtlWriteRegistryValue( + RTL_REGISTRY_DEVICEMAP, + L"VIDEO", + DeviceVideoBuffer, + REG_SZ, + DeviceExtension->RegistryPath.Buffer, + DeviceExtension->RegistryPath.MaximumLength); + + /* FIXME: Allocate hardware resources for device. */ + + /* + * Allocate interrupt for device. + */ + + if (!IntVideoPortSetupInterrupt(DeviceObject, DriverExtension, &ConfigInfo)) + { + RtlFreeUnicodeString(&DeviceExtension->RegistryPath); + IoDeleteDevice(DeviceObject); + return STATUS_INSUFFICIENT_RESOURCES; + } + + /* + * Allocate timer for device. + */ + + if (!IntVideoPortSetupTimer(DeviceObject, DriverExtension)) + { + if (DeviceExtension->InterruptObject != NULL) + IoDisconnectInterrupt(DeviceExtension->InterruptObject); + RtlFreeUnicodeString(&DeviceExtension->RegistryPath); + IoDeleteDevice(DeviceObject); + DPRINT("STATUS_INSUFFICIENT_RESOURCES\n"); + return STATUS_INSUFFICIENT_RESOURCES; + } + + if (PhysicalDeviceObject != NULL) + IoAttachDeviceToDeviceStack(DeviceObject, PhysicalDeviceObject); + + DPRINT("STATUS_SUCCESS\n"); + return STATUS_SUCCESS; +} + +VOID FASTCALL +IntAttachToCSRSS(PEPROCESS *CallingProcess, PEPROCESS *PrevAttachedProcess) +{ + *CallingProcess = PsGetCurrentProcess(); + if (*CallingProcess != Csrss) + { + if (PsGetCurrentThread()->OldProcess != NULL) + { + *PrevAttachedProcess = *CallingProcess; + KeDetachProcess(); + } + else + { + *PrevAttachedProcess = NULL; + } + KeAttachProcess(Csrss); + } +} + +VOID FASTCALL +IntDetachFromCSRSS(PEPROCESS *CallingProcess, PEPROCESS *PrevAttachedProcess) +{ + if (*CallingProcess != Csrss) + { + KeDetachProcess(); + if (NULL != *PrevAttachedProcess) + { + KeAttachProcess(*PrevAttachedProcess); + } + } +} + +/* PUBLIC FUNCTIONS ***********************************************************/ + +/* + * @implemented + */ + +ULONG STDCALL +VideoPortInitialize( + IN PVOID Context1, + IN PVOID Context2, + IN PVIDEO_HW_INITIALIZATION_DATA HwInitializationData, + IN PVOID HwContext) +{ + PDRIVER_OBJECT DriverObject = Context1; + PUNICODE_STRING RegistryPath = Context2; + NTSTATUS Status; + PVIDEO_PORT_DRIVER_EXTENSION DriverExtension; + BOOL LegacyDetection = FALSE; + + DPRINT("VideoPortInitialize\n"); + + /* + * NOTE: + * The driver extension can be already allocated in case that we were + * called by legacy driver and failed detecting device. Some miniport + * drivers in that case adjust parameters and calls VideoPortInitialize + * again. + */ + + DriverExtension = IoGetDriverObjectExtension(DriverObject, DriverObject); + if (DriverExtension == NULL) + { + Status = IoAllocateDriverObjectExtension( + DriverObject, + DriverObject, + sizeof(VIDEO_PORT_DRIVER_EXTENSION), + (PVOID *)&DriverExtension); - DeviceExtension->HwTimer = HwInitializationData->HwTimer; - if (HwInitializationData->HwTimer != NULL) - { - DPRINT("Initializing timer\n"); - Status = IoInitializeTimer(MPDeviceObject, - VPTimerRoutine, - DeviceExtension); if (!NT_SUCCESS(Status)) - { - DPRINT("IoInitializeTimer failed with status 0x%08x\n", Status); - - if (HwInitializationData->HwInterrupt != NULL) - { - IoDisconnectInterrupt(DeviceExtension->InterruptObject); - } - IoDeleteDevice(MPDeviceObject); - - return Status; - } - } + { + return Status; + } + } - return STATUS_SUCCESS; -} + /* + * Copy the correct miniport initializtation data to the device extension. + */ -/* - * @unimplemented - */ -VOID -STDCALL -VideoPortLogError(IN PVOID HwDeviceExtension, - IN PVIDEO_REQUEST_PACKET Vrp OPTIONAL, - IN VP_STATUS ErrorCode, - IN ULONG UniqueId) -{ - DPRINT1("VideoPortLogError ErrorCode %d (0x%x) UniqueId %lu (0x%lx)\n", - ErrorCode, ErrorCode, UniqueId, UniqueId); - if (NULL != Vrp) - { - DPRINT1("Vrp->IoControlCode %lu (0x%lx)\n", Vrp->IoControlCode, Vrp->IoControlCode); - } -} + RtlCopyMemory( + &DriverExtension->InitializationData, + HwInitializationData, + sizeof(VIDEO_HW_INITIALIZATION_DATA)); + DriverExtension->HwContext = HwContext; + RtlCopyMemory(&DriverExtension->RegistryPath, RegistryPath, sizeof(UNICODE_STRING)); -/* - * @unimplemented - */ -VP_STATUS -STDCALL -VideoPortMapBankedMemory(IN PVOID HwDeviceExtension, - IN PHYSICAL_ADDRESS PhysicalAddress, - IN PULONG Length, - IN PULONG InIoSpace, - OUT PVOID *VirtualAddress, - IN ULONG BankLength, - IN UCHAR ReadWriteBank, - IN PBANKED_SECTION_ROUTINE BankRoutine, - IN PVOID Context) -{ - DPRINT("VideoPortMapBankedMemory\n"); - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; -} + switch (HwInitializationData->HwInitDataSize) + { + /* + * NT4 drivers are special case, because we must use legacy method + * of detection instead of the Plug & Play one. + */ + case SIZE_OF_NT4_VIDEO_HW_INITIALIZATION_DATA: + DPRINT("We were loaded by a Windows NT miniport driver.\n"); + LegacyDetection = TRUE; + break; -/* - * @implemented - */ -VP_STATUS -STDCALL -VideoPortMapMemory(IN PVOID HwDeviceExtension, - IN PHYSICAL_ADDRESS PhysicalAddress, - IN PULONG Length, - IN PULONG InIoSpace, - OUT PVOID *VirtualAddress) -{ - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - NTSTATUS Status; + case SIZE_OF_W2K_VIDEO_HW_INITIALIZATION_DATA: + DPRINT("We were loaded by a Windows 2000 miniport driver.\n"); + break; - DPRINT("VideoPortMapMemory\n"); + case sizeof(VIDEO_HW_INITIALIZATION_DATA): + DPRINT("We were loaded by a Windows XP or later miniport driver.\n"); + break; - DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, - VIDEO_PORT_DEVICE_EXTENSION, - MiniPortDeviceExtension); - *VirtualAddress = InternalMapMemory(DeviceExtension, PhysicalAddress, - *Length, *InIoSpace, &Status); + default: + DPRINT("Invalid HwInitializationData size.\n"); + return STATUS_UNSUCCESSFUL; + } - return Status; -} + DriverObject->MajorFunction[IRP_MJ_CREATE] = IntVideoPortDispatchOpen; + DriverObject->MajorFunction[IRP_MJ_CLOSE] = IntVideoPortDispatchClose; + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IntVideoPortDispatchDeviceControl; + DriverObject->DriverUnload = IntVideoPortUnload; + /* + * Plug & Play drivers registers the device in AddDevice routine. For + * legacy drivers we must do it now. + */ -/* - * @implemented - */ -BOOLEAN -STDCALL -VideoPortScanRom(IN PVOID HwDeviceExtension, - IN PUCHAR RomBase, - IN ULONG RomLength, - IN PUCHAR String) -{ - ULONG StringLength; - BOOLEAN Found; - PUCHAR SearchLocation; + if (LegacyDetection) + { + Status = IntVideoPortFindAdapter(DriverObject, DriverExtension, NULL); + DPRINT("IntVideoPortFindAdapter returned 0x%x\n", Status); + return Status; + } + else + { + DriverObject->DriverExtension->AddDevice = IntVideoPortAddDevice; + DriverObject->MajorFunction[IRP_MJ_PNP] = IntVideoPortDispatchPnp; + DriverObject->MajorFunction[IRP_MJ_POWER] = IntVideoPortDispatchPower; - DPRINT("VideoPortScanRom RomBase %p RomLength 0x%x String %s\n", RomBase, RomLength, String); - - StringLength = strlen(String); - Found = FALSE; - SearchLocation = RomBase; - for (SearchLocation = RomBase; - ! Found && SearchLocation < RomBase + RomLength - StringLength; - SearchLocation++) - { - Found = (RtlCompareMemory(SearchLocation, String, StringLength) == StringLength); - if (Found) - { - DPRINT("Match found at %p\n", SearchLocation); - } - } - - return Found; -} - - -/* - * @implemented - */ -ULONG -STDCALL -VideoPortSetBusData(IN PVOID HwDeviceExtension, - IN BUS_DATA_TYPE BusDataType, - IN ULONG SlotNumber, - IN PVOID Buffer, - IN ULONG Offset, - IN ULONG Length) -{ - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - - DPRINT("VideoPortSetBusData\n"); - - DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, - VIDEO_PORT_DEVICE_EXTENSION, - MiniPortDeviceExtension); - - return HalSetBusDataByOffset(BusDataType, - DeviceExtension->SystemIoBusNumber, - SlotNumber, - Buffer, - Offset, - Length); -} - - -/* - * @implemented - */ -VP_STATUS -STDCALL -VideoPortSetRegistryParameters(IN PVOID HwDeviceExtension, - IN PWSTR ValueName, - IN PVOID ValueData, - IN ULONG ValueLength) -{ - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - - DPRINT("VideoSetRegistryParameters\n"); - - assert_irql(PASSIVE_LEVEL); - - DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, - VIDEO_PORT_DEVICE_EXTENSION, - MiniPortDeviceExtension); - return RtlWriteRegistryValue(RTL_REGISTRY_ABSOLUTE, - DeviceExtension->RegistryPath.Buffer, - ValueName, - REG_BINARY, - ValueData, - ValueLength); -} - - -/* - * @unimplemented - */ -VP_STATUS -STDCALL -VideoPortSetTrappedEmulatorPorts(IN PVOID HwDeviceExtension, - IN ULONG NumAccessRanges, - IN PVIDEO_ACCESS_RANGE AccessRange) -{ - DPRINT("VideoPortSetTrappedEmulatorPorts\n"); - /* Should store the ranges in the device extension for use by ntvdm. */ - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -VOID -STDCALL -VideoPortStartTimer(IN PVOID HwDeviceExtension) -{ - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - - DPRINT("VideoPortStartTimer\n"); - - DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, - VIDEO_PORT_DEVICE_EXTENSION, - MiniPortDeviceExtension); - IoStartTimer(DeviceExtension->DeviceObject); -} - - -/* - * @implemented - */ -VOID -STDCALL -VideoPortStopTimer(IN PVOID HwDeviceExtension) -{ - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - - DPRINT("VideoPortStopTimer\n"); - - DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, - VIDEO_PORT_DEVICE_EXTENSION, - MiniPortDeviceExtension); - IoStopTimer(DeviceExtension->DeviceObject); -} - - -/* - * @implemented - */ -BOOLEAN -STDCALL -VideoPortSynchronizeExecution(IN PVOID HwDeviceExtension, - IN VIDEO_SYNCHRONIZE_PRIORITY Priority, - IN PMINIPORT_SYNCHRONIZE_ROUTINE SynchronizeRoutine, - OUT PVOID Context) -{ - BOOLEAN Ret; - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - KIRQL OldIrql; - - switch(Priority) - { - case VpLowPriority: - Ret = (*SynchronizeRoutine)(Context); - break; - case VpMediumPriority: - DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, - VIDEO_PORT_DEVICE_EXTENSION, - MiniPortDeviceExtension); - if (NULL == DeviceExtension->InterruptObject) - { - Ret = (*SynchronizeRoutine)(Context); - } - else - { - Ret = KeSynchronizeExecution(DeviceExtension->InterruptObject, - SynchronizeRoutine, - Context); - } - break; - case VpHighPriority: - OldIrql = KeGetCurrentIrql(); - if (OldIrql < SYNCH_LEVEL) - { - OldIrql = KfRaiseIrql(SYNCH_LEVEL); - } - Ret = (*SynchronizeRoutine)(Context); - if (OldIrql < SYNCH_LEVEL) - { - KfLowerIrql(OldIrql); - } - break; - default: - Ret = FALSE; - } - - return Ret; -} - - -/* - * @implemented - */ -VP_STATUS -STDCALL -VideoPortUnmapMemory(IN PVOID HwDeviceExtension, - IN PVOID VirtualAddress, - IN HANDLE ProcessHandle) -{ - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - - DPRINT("VideoPortFreeDeviceBase\n"); - - DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, - VIDEO_PORT_DEVICE_EXTENSION, - MiniPortDeviceExtension); - - InternalUnmapMemory(DeviceExtension, VirtualAddress); - - return STATUS_SUCCESS; -} - - -/* - * @unimplemented - */ -VP_STATUS -STDCALL -VideoPortVerifyAccessRanges(IN PVOID HwDeviceExtension, - IN ULONG NumAccessRanges, - IN PVIDEO_ACCESS_RANGE AccessRanges) -{ - DPRINT1("VideoPortVerifyAccessRanges not implemented\n"); - return NO_ERROR; -} - - -/* - * Reset display to blue screen - */ -static BOOLEAN STDCALL -VideoPortResetDisplayParameters(Columns, Rows) -{ - if (NULL == ResetDisplayParametersDeviceExtension) - { - return(FALSE); - } - if (NULL == ResetDisplayParametersDeviceExtension->HwResetHw) - { - return(FALSE); - } - if (!ResetDisplayParametersDeviceExtension->HwResetHw(&ResetDisplayParametersDeviceExtension->MiniPortDeviceExtension, - Columns, Rows)) - { - return(FALSE); - } - - ResetDisplayParametersDeviceExtension = NULL; - - return TRUE; -} - -/* - * @implemented - */ - -PVOID -STDCALL -VideoPortAllocatePool( - IN PVOID HwDeviceExtension, - IN VP_POOL_TYPE PoolType, - IN SIZE_T NumberOfBytes, - IN ULONG Tag) -{ - return ExAllocatePoolWithTag(PoolType, NumberOfBytes, Tag); + return STATUS_SUCCESS; + } } /* @@ -1078,347 +595,321 @@ VideoPortAllocatePool( */ VOID -STDCALL -VideoPortFreePool( - IN PVOID HwDeviceExtension, - IN PVOID Ptr) +VideoPortDebugPrint( + IN VIDEO_DEBUG_LEVEL DebugPrintLevel, + IN PCHAR DebugMessage, ...) { - ExFreePool(Ptr); + char Buffer[256]; + va_list ap; + + va_start(ap, DebugMessage); + vsprintf(Buffer, DebugMessage, ap); + va_end(ap); + + DbgPrint(Buffer); } -// VidDispatchOpen -// -// DESCRIPTION: -// Answer requests for Open calls -// -// RUN LEVEL: -// PASSIVE_LEVEL -// -// ARGUMENTS: -// Standard dispatch arguments -// -// RETURNS: -// NTSTATUS -// - -NTSTATUS STDCALL -VidDispatchOpen(IN PDEVICE_OBJECT pDO, - IN PIRP Irp) -{ - PIO_STACK_LOCATION IrpStack; - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - - DPRINT("VidDispatchOpen() called\n"); - - IrpStack = IoGetCurrentIrpStackLocation(Irp); - - if (! CsrssInitialized) - { - DPRINT("Referencing CSRSS\n"); - Csrss = PsGetCurrentProcess(); - DPRINT("Csrss %p\n", Csrss); - } - else - { - DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION) pDO->DeviceExtension; - if (DeviceExtension->HwInitialize(&DeviceExtension->MiniPortDeviceExtension)) - { - Irp->IoStatus.Status = STATUS_SUCCESS; - /* Storing the device extension pointer in a static variable is an ugly - * hack. Unfortunately, we need it in VideoPortResetDisplayParameters - * and HalAcquireDisplayOwnership doesn't allow us to pass a userdata - * parameter. On the bright side, the DISPLAY device is opened - * exclusively, so there can be only one device extension active at - * any point in time. */ - ResetDisplayParametersDeviceExtension = DeviceExtension; - HalAcquireDisplayOwnership(VideoPortResetDisplayParameters); - } - else - { - Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; - } - } - - Irp->IoStatus.Information = FILE_OPENED; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - - return STATUS_SUCCESS; -} - -// VidDispatchClose -// -// DESCRIPTION: -// Answer requests for Close calls -// -// RUN LEVEL: -// PASSIVE_LEVEL -// -// ARGUMENTS: -// Standard dispatch arguments -// -// RETURNS: -// NTSTATUS -// - -NTSTATUS STDCALL -VidDispatchClose(IN PDEVICE_OBJECT pDO, - IN PIRP Irp) -{ - PIO_STACK_LOCATION IrpStack; - - DPRINT("VidDispatchClose() called\n"); - - IrpStack = IoGetCurrentIrpStackLocation(Irp); - - if (! CsrssInitialized) - { - CsrssInitialized = TRUE; - } - else - { - HalReleaseDisplayOwnership(); - } - - Irp->IoStatus.Status = STATUS_SUCCESS; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - - return STATUS_SUCCESS; -} - -// VidDispatchDeviceControl -// -// DESCRIPTION: -// Answer requests for device control calls -// -// RUN LEVEL: -// PASSIVE_LEVEL -// -// ARGUMENTS: -// Standard dispatch arguments -// -// RETURNS: -// NTSTATUS -// - -NTSTATUS STDCALL -VidDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp) -{ - PIO_STACK_LOCATION IrpStack; - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - PVIDEO_REQUEST_PACKET vrp; - BOOLEAN Ret; - NTSTATUS Status; - - DPRINT("VidDispatchDeviceControl\n"); - IrpStack = IoGetCurrentIrpStackLocation(Irp); - DeviceExtension = DeviceObject->DeviceExtension; - - /* Translate the IRP to a VRP */ - vrp = ExAllocatePool(NonPagedPool, sizeof(VIDEO_REQUEST_PACKET)); - if (NULL == vrp) - { - return STATUS_NO_MEMORY; - } - vrp->StatusBlock = (PSTATUS_BLOCK) &(Irp->IoStatus); - vrp->IoControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode; - - DPRINT("- IoControlCode: %x\n", vrp->IoControlCode); - - /* We're assuming METHOD_BUFFERED */ - vrp->InputBuffer = Irp->AssociatedIrp.SystemBuffer; - vrp->InputBufferLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength; - vrp->OutputBuffer = Irp->AssociatedIrp.SystemBuffer; - vrp->OutputBufferLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength; - - /* Call the Miniport Driver with the VRP */ - Ret = ((PDRIVER_STARTIO)DeviceObject->DriverObject->DriverStartIo)((PVOID) &DeviceExtension->MiniPortDeviceExtension, (PIRP)vrp); - assert(Ret); - - /* Free the VRP */ - ExFreePool(vrp); - - DPRINT("- Returned status: %x/%d\n", Irp->IoStatus.Status, - Irp->IoStatus.Information); - if (Irp->IoStatus.Status != STATUS_SUCCESS) - { - if (Irp->IoStatus.Status != ERROR_MORE_DATA) - { - Irp->IoStatus.Information = 0; - } - /* Map from win32 error codes to ntstatus values. */ - switch (Irp->IoStatus.Status) - { - case ERROR_NOT_ENOUGH_MEMORY: - Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; - break; - case ERROR_MORE_DATA: - Irp->IoStatus.Status = STATUS_BUFFER_OVERFLOW; - break; - case ERROR_INVALID_FUNCTION: - Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; - break; - case ERROR_INVALID_PARAMETER: - Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; - break; - case ERROR_INSUFFICIENT_BUFFER: - Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; - break; - case ERROR_DEV_NOT_EXIST: - Irp->IoStatus.Status = STATUS_DEVICE_DOES_NOT_EXIST; - break; - case ERROR_IO_PENDING: - Irp->IoStatus.Status = STATUS_PENDING; - break; - } - } - - Status = Irp->IoStatus.Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - - return Status; -} - -PVOID STDCALL -InternalMapMemory(IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension, - IN PHYSICAL_ADDRESS IoAddress, - IN ULONG NumberOfUchars, - IN UCHAR InIoSpace, - OUT NTSTATUS *Status) -{ - PHYSICAL_ADDRESS TranslatedAddress; - PVIDEO_PORT_ADDRESS_MAPPING AddressMapping; - ULONG AddressSpace; - PVOID MappedAddress; - PLIST_ENTRY Entry; - - DPRINT("- IoAddress: %lx\n", IoAddress.u.LowPart); - DPRINT("- NumberOfUchars: %lx\n", NumberOfUchars); - DPRINT("- InIoSpace: %x\n", InIoSpace); - InIoSpace &= ~VIDEO_MEMORY_SPACE_DENSE; - if (0 != (InIoSpace & VIDEO_MEMORY_SPACE_P6CACHE)) - { - DPRINT("VIDEO_MEMORY_SPACE_P6CACHE not supported, turning off\n"); - InIoSpace &= ~VIDEO_MEMORY_SPACE_P6CACHE; - } - if (! IsListEmpty(&DeviceExtension->AddressMappingListHead)) - { - Entry = DeviceExtension->AddressMappingListHead.Flink; - while (Entry != &DeviceExtension->AddressMappingListHead) - { - AddressMapping = CONTAINING_RECORD(Entry, - VIDEO_PORT_ADDRESS_MAPPING, - List); - if (IoAddress.QuadPart == AddressMapping->IoAddress.QuadPart && - NumberOfUchars <= AddressMapping->NumberOfUchars) - { - AddressMapping->MappingCount++; - if (Status) - { - *Status = STATUS_SUCCESS; - } - return AddressMapping->MappedAddress; - } - Entry = Entry->Flink; - } - } - - AddressSpace = (ULONG)InIoSpace; - if (HalTranslateBusAddress(DeviceExtension->AdapterInterfaceType, - DeviceExtension->SystemIoBusNumber, - IoAddress, - &AddressSpace, - &TranslatedAddress) == FALSE) - { - if (Status) - { - *Status = STATUS_NO_MEMORY; - } - return NULL; - } - - /* i/o space */ - if (AddressSpace != 0) - { - assert(0 == TranslatedAddress.u.HighPart); - if (Status) - { - *Status = STATUS_SUCCESS; - } - return (PVOID) TranslatedAddress.u.LowPart; - } - - MappedAddress = MmMapIoSpace(TranslatedAddress, - NumberOfUchars, - FALSE); - - if (MappedAddress) - { - if (Status) - { - *Status = STATUS_SUCCESS; - } - - AddressMapping = ExAllocatePoolWithTag(PagedPool, - sizeof(VIDEO_PORT_ADDRESS_MAPPING), - TAG_VIDEO_PORT); - if (AddressMapping == NULL) - return MappedAddress; - - AddressMapping->MappedAddress = MappedAddress; - AddressMapping->NumberOfUchars = NumberOfUchars; - AddressMapping->IoAddress = IoAddress; - AddressMapping->SystemIoBusNumber = DeviceExtension->SystemIoBusNumber; - AddressMapping->MappingCount = 1; - - InsertHeadList(&DeviceExtension->AddressMappingListHead, - &AddressMapping->List); - - return MappedAddress; - } - else - { - if (Status) - { - *Status = STATUS_NO_MEMORY; - } - - return NULL; - } -} +/* + * @unimplemented + */ VOID STDCALL -InternalUnmapMemory(IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension, - IN PVOID MappedAddress) +VideoPortLogError( + IN PVOID HwDeviceExtension, + IN PVIDEO_REQUEST_PACKET Vrp OPTIONAL, + IN VP_STATUS ErrorCode, + IN ULONG UniqueId) { - PVIDEO_PORT_ADDRESS_MAPPING AddressMapping; - PLIST_ENTRY Entry; - - Entry = DeviceExtension->AddressMappingListHead.Flink; - while (Entry != &DeviceExtension->AddressMappingListHead) - { - AddressMapping = CONTAINING_RECORD(Entry, - VIDEO_PORT_ADDRESS_MAPPING, - List); - if (AddressMapping->MappedAddress == MappedAddress) - { - assert(0 <= AddressMapping->MappingCount); - AddressMapping->MappingCount--; - if (0 == AddressMapping->MappingCount) - { - MmUnmapIoSpace(AddressMapping->MappedAddress, - AddressMapping->NumberOfUchars); - RemoveEntryList(Entry); - ExFreePool(AddressMapping); - - return; - } - } - - Entry = Entry->Flink; - } + DPRINT1("VideoPortLogError ErrorCode %d (0x%x) UniqueId %lu (0x%lx)\n", + ErrorCode, ErrorCode, UniqueId, UniqueId); + if (NULL != Vrp) + { + DPRINT1("Vrp->IoControlCode %lu (0x%lx)\n", Vrp->IoControlCode, Vrp->IoControlCode); + } } +/* + * @implemented + */ + +UCHAR STDCALL +VideoPortGetCurrentIrql(VOID) +{ + return KeGetCurrentIrql(); +} + +typedef struct QueryRegistryCallbackContext +{ + PVOID HwDeviceExtension; + PVOID HwContext; + PMINIPORT_GET_REGISTRY_ROUTINE HwGetRegistryRoutine; +} QUERY_REGISTRY_CALLBACK_CONTEXT, *PQUERY_REGISTRY_CALLBACK_CONTEXT; + +static NTSTATUS STDCALL +QueryRegistryCallback( + IN PWSTR ValueName, + IN ULONG ValueType, + IN PVOID ValueData, + IN ULONG ValueLength, + IN PVOID Context, + IN PVOID EntryContext) +{ + PQUERY_REGISTRY_CALLBACK_CONTEXT CallbackContext = (PQUERY_REGISTRY_CALLBACK_CONTEXT) Context; + + DPRINT("Found registry value for name %S: type %d, length %d\n", + ValueName, ValueType, ValueLength); + return (*(CallbackContext->HwGetRegistryRoutine))( + CallbackContext->HwDeviceExtension, + CallbackContext->HwContext, + ValueName, + ValueData, + ValueLength); +} + +/* + * @unimplemented + */ + +VP_STATUS STDCALL +VideoPortGetRegistryParameters( + IN PVOID HwDeviceExtension, + IN PWSTR ParameterName, + IN UCHAR IsParameterFileName, + IN PMINIPORT_GET_REGISTRY_ROUTINE GetRegistryRoutine, + IN PVOID HwContext) +{ + RTL_QUERY_REGISTRY_TABLE QueryTable[2]; + QUERY_REGISTRY_CALLBACK_CONTEXT Context; + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + + DPRINT("VideoPortGetRegistryParameters ParameterName %S\n", ParameterName); + + DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); + + if (IsParameterFileName) + { + UNIMPLEMENTED; + } + + Context.HwDeviceExtension = HwDeviceExtension; + Context.HwContext = HwContext; + Context.HwGetRegistryRoutine = GetRegistryRoutine; + + QueryTable[0].QueryRoutine = QueryRegistryCallback; + QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED; + QueryTable[0].Name = ParameterName; + QueryTable[0].EntryContext = NULL; + QueryTable[0].DefaultType = REG_NONE; + QueryTable[0].DefaultData = NULL; + QueryTable[0].DefaultLength = 0; + + QueryTable[1].QueryRoutine = NULL; + QueryTable[1].Name = NULL; + + return NT_SUCCESS(RtlQueryRegistryValues( + RTL_REGISTRY_ABSOLUTE, + DeviceExtension->RegistryPath.Buffer, + QueryTable, + &Context, + NULL)) ? ERROR_SUCCESS : ERROR_INVALID_PARAMETER; +} + +/* + * @implemented + */ + +VP_STATUS STDCALL +VideoPortSetRegistryParameters( + IN PVOID HwDeviceExtension, + IN PWSTR ValueName, + IN PVOID ValueData, + IN ULONG ValueLength) +{ + DPRINT("VideoPortSetRegistryParameters\n"); + assert_irql(PASSIVE_LEVEL); + return RtlWriteRegistryValue( + RTL_REGISTRY_ABSOLUTE, + VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension)->RegistryPath.Buffer, + ValueName, + REG_BINARY, + ValueData, + ValueLength); +} + +/* + * @implemented + */ + +VP_STATUS STDCALL +VideoPortGetVgaStatus( + IN PVOID HwDeviceExtension, + OUT PULONG VgaStatus) +{ + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + + DPRINT("VideoPortGetVgaStatus\n"); + + DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); + if (KeGetCurrentIrql() == PASSIVE_LEVEL) + { + if (DeviceExtension->AdapterInterfaceType == PCIBus) + { + /* VgaStatus: 0 == VGA not enabled, 1 == VGA enabled. */ + /* Assumed for now */ + *VgaStatus = 1; + return NO_ERROR; + } + } + + return ERROR_INVALID_FUNCTION; +} + +/* + * @implemented + */ + +PVOID STDCALL +VideoPortGetRomImage( + IN PVOID HwDeviceExtension, + IN PVOID Unused1, + IN ULONG Unused2, + IN ULONG Length) +{ + static PVOID RomImageBuffer = NULL; + PEPROCESS CallingProcess; + PEPROCESS PrevAttachedProcess; + + DPRINT("VideoPortGetRomImage(HwDeviceExtension 0x%X Length 0x%X)\n", + HwDeviceExtension, Length); + + /* If the length is zero then free the existing buffer. */ + if (Length == 0) + { + if (RomImageBuffer != NULL) + { + ExFreePool(RomImageBuffer); + RomImageBuffer = NULL; + } + return NULL; + } + else + { + /* + * The DDK says we shouldn't use the legacy C0000 method but get the + * rom base address from the corresponding pci or acpi register but + * lets ignore that and use C0000 anyway. We have already mapped the + * bios area into memory so we'll copy from there. + */ + + /* Copy the bios. */ + Length = min(Length, 0x10000); + if (RomImageBuffer != NULL) + { + ExFreePool(RomImageBuffer); + } + + RomImageBuffer = ExAllocatePool(PagedPool, Length); + if (RomImageBuffer == NULL) + { + return NULL; + } + + IntAttachToCSRSS(&CallingProcess, &PrevAttachedProcess); + RtlCopyMemory(RomImageBuffer, (PUCHAR)0xC0000, Length); + IntDetachFromCSRSS(&CallingProcess, &PrevAttachedProcess); + + return RomImageBuffer; + } +} + +/* + * @implemented + */ + +BOOLEAN STDCALL +VideoPortScanRom( + IN PVOID HwDeviceExtension, + IN PUCHAR RomBase, + IN ULONG RomLength, + IN PUCHAR String) +{ + ULONG StringLength; + BOOLEAN Found; + PUCHAR SearchLocation; + + DPRINT("VideoPortScanRom RomBase %p RomLength 0x%x String %s\n", RomBase, RomLength, String); + + StringLength = strlen(String); + Found = FALSE; + SearchLocation = RomBase; + for (SearchLocation = RomBase; + !Found && SearchLocation < RomBase + RomLength - StringLength; + SearchLocation++) + { + Found = (RtlCompareMemory(SearchLocation, String, StringLength) == StringLength); + if (Found) + { + DPRINT("Match found at %p\n", SearchLocation); + } + } + + return Found; +} + +/* + * @implemented + */ + +BOOLEAN STDCALL +VideoPortSynchronizeExecution( + IN PVOID HwDeviceExtension, + IN VIDEO_SYNCHRONIZE_PRIORITY Priority, + IN PMINIPORT_SYNCHRONIZE_ROUTINE SynchronizeRoutine, + OUT PVOID Context) +{ + BOOLEAN Ret; + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + KIRQL OldIrql; + + switch (Priority) + { + case VpLowPriority: + Ret = (*SynchronizeRoutine)(Context); + break; + + case VpMediumPriority: + DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); + if (DeviceExtension->InterruptObject == NULL) + Ret = (*SynchronizeRoutine)(Context); + else + Ret = KeSynchronizeExecution( + DeviceExtension->InterruptObject, + SynchronizeRoutine, + Context); + break; + + case VpHighPriority: + OldIrql = KeGetCurrentIrql(); + if (OldIrql < SYNCH_LEVEL) + OldIrql = KfRaiseIrql(SYNCH_LEVEL); + + Ret = (*SynchronizeRoutine)(Context); + + if (OldIrql < SYNCH_LEVEL) + KfLowerIrql(OldIrql); + break; + + default: + Ret = FALSE; + } + + return Ret; +} + +/* + * @unimplemented + */ + BOOLEAN STDCALL VideoPortDDCMonitorHelper( PVOID HwDeviceExtension, @@ -1432,252 +923,67 @@ VideoPortDDCMonitorHelper( } /* - * @implemented + * @unimplemented */ -VP_STATUS -STDCALL -VideoPortAllocateBuffer(IN PVOID HwDeviceExtension, - IN ULONG Size, - OUT PVOID *Buffer) + +VP_STATUS STDCALL +VideoPortEnumerateChildren( + IN PVOID HwDeviceExtension, + IN PVOID Reserved) { - DPRINT("VideoPortAllocateBuffer()\n"); - - Buffer = ExAllocatePool(PagedPool, Size); - return STATUS_SUCCESS; - + DPRINT1("VideoPortEnumerateChildren(): Unimplemented.\n"); + return NO_ERROR; +} + +/* + * @unimplemented + */ + +VP_STATUS STDCALL +VideoPortCreateSecondaryDisplay( + IN PVOID HwDeviceExtension, + IN OUT PVOID *SecondaryDeviceExtension, + IN ULONG Flag) +{ + DPRINT1("VideoPortCreateSecondaryDisplay: Unimplemented.\n"); + return NO_ERROR; } /* * @implemented */ -VOID -STDCALL -VideoPortReleaseBuffer( IN PVOID HwDeviceExtension, - IN PVOID Ptr) + +BOOLEAN STDCALL +VideoPortQueueDpc( + IN PVOID HwDeviceExtension, + IN PMINIPORT_DPC_ROUTINE CallbackRoutine, + IN PVOID Context) { - DPRINT("VideoPortReleaseBuffer()\n"); - - ExFreePool(Ptr); -} - - -VP_STATUS -STDCALL -VideoPortEnumerateChildren ( IN PVOID HwDeviceExtension, - IN PVOID Reserved ) -{ - DPRINT1("VideoPortEnumerateChildren(): Unimplemented.\n"); - return STATUS_SUCCESS; + return KeInsertQueueDpc( + &VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension)->DpcObject, + (PVOID)CallbackRoutine, + (PVOID)Context); } -PVOID -STDCALL -VideoPortGetRomImage ( IN PVOID HwDeviceExtension, - IN PVOID Unused1, - IN ULONG Unused2, - IN ULONG Length ) +/* + * @unimplemented + */ + +PVOID STDCALL +VideoPortGetAssociatedDeviceExtension(IN PVOID DeviceObject) { - DPRINT("VideoPortGetRomImage(HwDeviceExtension 0x%X Length 0x%X)\n", - HwDeviceExtension, Length); - - /* If the length is zero then free the existing buffer. */ - if (Length == 0) - { - if (RomImageBuffer != NULL) - { - ExFreePool(RomImageBuffer); - RomImageBuffer = NULL; - } - return NULL; - } - else - { - PEPROCESS CallingProcess, PrevAttachedProcess; - - /* - The DDK says we shouldn't use the legacy C000 method but get the - rom base address from the corresponding pci or acpi register but - lets ignore that and use C000 anyway. CSRSS has already mapped the - bios area into memory so we'll copy from there. - */ - CallingProcess = PsGetCurrentProcess(); - if (CallingProcess != Csrss) - { - if (NULL != PsGetCurrentThread()->OldProcess) - { - PrevAttachedProcess = CallingProcess; - KeDetachProcess(); - } - else - { - PrevAttachedProcess = NULL; - } - KeAttachProcess(Csrss); - } - - /* - Copy the bios. - */ - Length = min(Length, 0x10000); - if (RomImageBuffer != NULL) - { - ExFreePool(RomImageBuffer); - } - RomImageBuffer = ExAllocatePool(PagedPool, Length); - if (RomImageBuffer == NULL) - { - return(NULL); - } - RtlCopyMemory(RomImageBuffer, (PUCHAR)0xC0000, Length); - - /* - Detach from csrss if we attached. - */ - if (CallingProcess != Csrss) - { - KeDetachProcess(); - if (NULL != PrevAttachedProcess) - { - KeAttachProcess(PrevAttachedProcess); - } - } - - return(RomImageBuffer); - } + DPRINT1("VideoPortGetAssociatedDeviceExtension: Unimplemented.\n"); + return NULL; } -VOID -STDCALL -STATIC -VideoPortDeferredRoutine ( IN PKDPC Dpc, - IN PVOID DeferredContext, - IN PVOID SystemArgument1, - IN PVOID SystemArgument2 ) -{ - PVOID HwDeviceExtension = - ((PVIDEO_PORT_DEVICE_EXTENSION)DeferredContext)->MiniPortDeviceExtension; - ((PMINIPORT_DPC_ROUTINE)SystemArgument1)(HwDeviceExtension, SystemArgument2); -} - -BOOLEAN -STDCALL -VideoPortQueueDpc ( IN PVOID HwDeviceExtension, - IN PMINIPORT_DPC_ROUTINE CallbackRoutine, - IN PVOID Context ) -{ - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - - DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, - VIDEO_PORT_DEVICE_EXTENSION, - MiniPortDeviceExtension); - return KeInsertQueueDpc(&DeviceExtension->DpcObject, - (PVOID)CallbackRoutine, - (PVOID)Context); -} - -PVOID -STDCALL -VideoPortGetAssociatedDeviceExtension ( IN PVOID DeviceObject ) -{ - DPRINT1("VideoPortGetAssociatedDeviceExtension(): Unimplemented.\n"); - return(NULL); -} - -PVOID -STDCALL -VideoPortAllocateCommonBuffer ( IN PVOID HwDeviceExtension, - IN PVP_DMA_ADAPTER VpDmaAdapter, - IN ULONG DesiredLength, - OUT PPHYSICAL_ADDRESS LogicalAddress, - IN BOOLEAN CacheEnabled, - PVOID Reserved ) -{ - return HalAllocateCommonBuffer((PADAPTER_OBJECT)VpDmaAdapter, - DesiredLength, - LogicalAddress, - CacheEnabled); -} - -VOID -STDCALL -VideoPortReleaseCommonBuffer ( IN PVOID HwDeviceExtension, - IN PVP_DMA_ADAPTER VpDmaAdapter, - IN ULONG Length, - IN PHYSICAL_ADDRESS LogicalAddress, - IN PVOID VirtualAddress, - IN BOOLEAN CacheEnabled ) -{ - HalFreeCommonBuffer((PADAPTER_OBJECT)VpDmaAdapter, - Length, - LogicalAddress, - VirtualAddress, - CacheEnabled); -} - -VP_STATUS -STDCALL -VideoPortCreateSecondaryDisplay ( IN PVOID HwDeviceExtension, - IN OUT PVOID *SecondaryDeviceExtension, - IN ULONG Flag ) -{ - DPRINT1("VideoPortCreateSecondaryDisplay(): Unimplemented.\n"); - return STATUS_UNSUCCESSFUL; -} - -VOID -STDCALL -VideoPortPutDmaAdapter ( IN PVOID HwDeviceExtension, - IN PVP_DMA_ADAPTER VpDmaAdapter ) -{ - DPRINT("VideoPortPutDmaAdapter(): Unimplemented.\n"); -} - -PVP_DMA_ADAPTER -STDCALL -VideoPortGetDmaAdapter ( IN PVOID HwDeviceExtension, - IN PVP_DEVICE_DESCRIPTION VpDeviceExtension ) -{ - DEVICE_DESCRIPTION DeviceDescription; - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - ULONG NumberOfMapRegisters; - PVP_DMA_ADAPTER Adapter; - - DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, - VIDEO_PORT_DEVICE_EXTENSION, - MiniPortDeviceExtension); - - DPRINT("VideoPortGetDmaAdapter()\n"); - - DeviceDescription.Version = DEVICE_DESCRIPTION_VERSION; - DeviceDescription.Master = TRUE /* ?? */; - DeviceDescription.ScatterGather = VpDeviceExtension->ScatterGather; - DeviceDescription.DemandMode = FALSE /* ?? */; - DeviceDescription.AutoInitialize = FALSE /* ?? */; - DeviceDescription.Dma32BitAddresses = VpDeviceExtension->Dma32BitAddresses; - DeviceDescription.IgnoreCount = FALSE /* ?? */; - DeviceDescription.Reserved1 = FALSE; - DeviceDescription.BusNumber = DeviceExtension->SystemIoBusNumber; - DeviceDescription.DmaChannel = 0 /* ?? */; - DeviceDescription.InterfaceType = DeviceExtension->AdapterInterfaceType; - DeviceDescription.DmaWidth = Width8Bits; - DeviceDescription.DmaSpeed = Compatible; - DeviceDescription.MaximumLength = VpDeviceExtension->MaximumLength; - DeviceDescription.DmaPort = 0; - - Adapter = - (PVP_DMA_ADAPTER)HalGetAdapter(&DeviceDescription, &NumberOfMapRegisters); - DPRINT("Adapter %X\n", Adapter); - return(Adapter); -} - - /* * @implemented */ -VP_STATUS -STDCALL -VideoPortGetVersion ( IN PVOID HwDeviceExtension, - IN OUT PVPOSVERSIONINFO VpOsVersionInfo ) + +VP_STATUS STDCALL +VideoPortGetVersion( + IN PVOID HwDeviceExtension, + IN OUT PVPOSVERSIONINFO VpOsVersionInfo) { RTL_OSVERSIONINFOEXW Version; @@ -1692,202 +998,58 @@ VideoPortGetVersion ( IN PVOID HwDeviceExtension, VpOsVersionInfo->BuildNumber = Version.dwBuildNumber; VpOsVersionInfo->ServicePackMajor = Version.wServicePackMajor; VpOsVersionInfo->ServicePackMinor = Version.wServicePackMinor; - return STATUS_SUCCESS; + return NO_ERROR; } - return STATUS_UNSUCCESSFUL; + return ERROR_INVALID_PARAMETER; #else VpOsVersionInfo->MajorVersion = 5; VpOsVersionInfo->MinorVersion = 0; VpOsVersionInfo->BuildNumber = 2195; VpOsVersionInfo->ServicePackMajor = 4; VpOsVersionInfo->ServicePackMinor = 0; - return(STATUS_SUCCESS); + return NO_ERROR; #endif } return ERROR_INVALID_PARAMETER; } -PVOID -STDCALL -VideoPortLockBuffer ( IN PVOID HwDeviceExtension, - IN PVOID BaseAddress, - IN ULONG Length, - IN VP_LOCK_OPERATION Operation ) +/* + * @unimplemented + */ + +BOOLEAN STDCALL +VideoPortCheckForDeviceExistence( + IN PVOID HwDeviceExtension, + IN USHORT VendorId, + IN USHORT DeviceId, + IN UCHAR RevisionId, + IN USHORT SubVendorId, + IN USHORT SubSystemId, + IN ULONG Flags) { - DPRINT1("VideoPortLockBuffer(): Unimplemented.\n"); - return NULL; + DPRINT1("VideoPortCheckForDeviceExistence: Unimplemented.\n"); + return TRUE; } -VOID -STDCALL -VideoPortUnlockBuffer ( IN PVOID HwDeviceExtension, - IN PVOID Mdl ) +/* + * @unimplemented + */ + +VP_STATUS STDCALL +VideoPortRegisterBugcheckCallback( + IN PVOID HwDeviceExtension, + IN ULONG BugcheckCode, + IN PVOID Callback, + IN ULONG BugcheckDataSize) { - DPRINT1("VideoPortUnlockBuffer(): Unimplemented.\n"); + DPRINT1("VideoPortRegisterBugcheckCallback(): Unimplemented.\n"); + return NO_ERROR; } -VP_STATUS -STDCALL -VideoPortCreateEvent ( IN PVOID HwDeviceExtension, - IN ULONG EventFlag, - IN PVOID Unused, - OUT PEVENT *Event) -{ - EVENT_TYPE Type; - (*Event) = ExAllocatePoolWithTag(NonPagedPool, sizeof(KEVENT), - TAG_VIDEO_PORT); - if ((*Event) == NULL) - { - return STATUS_NO_MEMORY; - } - if (EventFlag & NOTIFICATION_EVENT) - { - Type = NotificationEvent; - } - else - { - Type = SynchronizationEvent; - } - KeInitializeEvent((PKEVENT)*Event, Type, EventFlag & INITIAL_EVENT_SIGNALED); - return STATUS_SUCCESS; -} - -VP_STATUS -STDCALL -VideoPortDeleteEvent ( IN PVOID HwDeviceExtension, - IN PEVENT Event) -{ - ExFreePool(Event); - return STATUS_SUCCESS; -} - -LONG -STDCALL -VideoPortSetEvent ( IN PVOID HwDeviceExtension, - IN PEVENT Event ) -{ - return KeSetEvent((PKEVENT)Event, IO_NO_INCREMENT, FALSE); -} - -VOID -STDCALL -VideoPortClearEvent ( IN PVOID HwDeviceExtension, - IN PEVENT Event ) -{ - KeClearEvent((PKEVENT)Event); -} - -VP_STATUS -STDCALL -VideoPortWaitForSingleObject ( IN PVOID HwDeviceExtension, - IN PVOID Object, - IN PLARGE_INTEGER Timeout OPTIONAL ) -{ - return KeWaitForSingleObject(Object, - Executive, - KernelMode, - FALSE, - Timeout); -} - -BOOLEAN -STDCALL -VideoPortCheckForDeviceExistence ( IN PVOID HwDeviceExtension, - IN USHORT VendorId, - IN USHORT DeviceId, - IN UCHAR RevisionId, - IN USHORT SubVendorId, - IN USHORT SubSystemId, - IN ULONG Flags ) -{ - DPRINT1("VideoPortCheckForDeviceExistence(): Unimplemented.\n"); - return TRUE; -} - -VP_STATUS -STDCALL -VideoPortRegisterBugcheckCallback ( IN PVOID HwDeviceExtension, - IN ULONG BugcheckCode, - IN PVOID Callback, - IN ULONG BugcheckDataSize ) -{ - DPRINT1("VideoPortRegisterBugcheckCallback(): Unimplemented.\n"); - return STATUS_UNSUCCESSFUL; -} - -PVOID -STDCALL -VideoPortImageDirectoryEntryToData ( PVOID BaseAddress, - ULONG Directory ) -{ - 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; - - return (PVOID)(BaseAddress + Va); -} - -PVOID STDCALL -VideoPortGetProcAddress(IN PVOID HwDeviceExtension, - IN PUCHAR FunctionName) -{ - SYSTEM_LOAD_IMAGE GdiDriverInfo; - PVOID BaseAddress; - PIMAGE_EXPORT_DIRECTORY ExportDir; - PUSHORT OrdinalPtr; - PULONG NamePtr; - PULONG AddressPtr; - ULONG i = 0; - NTSTATUS Status; - - DPRINT("VideoPortGetProcAddress(%s)\n", FunctionName); - - RtlInitUnicodeString(&GdiDriverInfo.ModuleName, L"videoprt"); - Status = ZwSetSystemInformation(SystemLoadImage, &GdiDriverInfo, - sizeof(SYSTEM_LOAD_IMAGE)); - if (!NT_SUCCESS(Status)) - { - DPRINT("Couldn't get our own module handle?\n"); - return NULL; - } - - BaseAddress = GdiDriverInfo.ModuleBase; - - /* Get the pointer to the export directory */ - ExportDir = (PIMAGE_EXPORT_DIRECTORY) - VideoPortImageDirectoryEntryToData (BaseAddress, - IMAGE_DIRECTORY_ENTRY_EXPORT); - - /* search by name */ - AddressPtr = (PULONG) - ((ULONG_PTR)BaseAddress + (ULONG_PTR)ExportDir->AddressOfFunctions); - OrdinalPtr = (PUSHORT) - ((ULONG_PTR)BaseAddress + (ULONG_PTR)ExportDir->AddressOfNameOrdinals); - NamePtr = (PULONG) - ((ULONG_PTR)BaseAddress + (ULONG_PTR)ExportDir->AddressOfNames); - for (i = 0; i < ExportDir->NumberOfNames; i++, NamePtr++, OrdinalPtr++) - { - if (!_strnicmp(FunctionName, (char*)(BaseAddress + *NamePtr), - strlen(FunctionName))) - { - return (PVOID)((ULONG_PTR)BaseAddress + - (ULONG_PTR)AddressPtr[*OrdinalPtr]); - } - } - DPRINT("VideoPortGetProcAddress: Can't resolve symbol %s\n", FunctionName); - return(NULL); -} +/* + * @implemented + */ LONGLONG STDCALL VideoPortQueryPerformanceCounter( @@ -1900,4 +1062,3 @@ VideoPortQueryPerformanceCounter( Result = KeQueryPerformanceCounter((PLARGE_INTEGER)PerformanceFrequency); return Result.QuadPart; } - diff --git a/reactos/drivers/video/videoprt/videoprt.h b/reactos/drivers/video/videoprt/videoprt.h index a25d544a702..54fa8c27801 100644 --- a/reactos/drivers/video/videoprt/videoprt.h +++ b/reactos/drivers/video/videoprt/videoprt.h @@ -18,7 +18,7 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: videoprt.h,v 1.6 2004/03/09 18:56:32 navaraf Exp $ + * $Id: videoprt.h,v 1.7 2004/03/19 20:58:32 navaraf Exp $ */ #ifndef VIDEOPRT_H @@ -27,25 +27,19 @@ #include <ddk/miniport.h> #include <ddk/video.h> #include <ddk/ntddvdeo.h> -#include "internal/ps.h" -#define NDEBUG +#include <ddk/ntapi.h> +/* #define NDEBUG */ #include <debug.h> -/* - * FIXME: Definition missing from w32api! - */ -#ifndef SYNCH_LEVEL -#define SYNCH_LEVEL (IPI_LEVEL - 2) -#endif -VOID FASTCALL KfLowerIrql(IN KIRQL NewIrql); -#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) -KIRQL FASTCALL KfRaiseIrql(IN KIRQL NewIrql); -NTKERNELAPI VOID HalAcquireDisplayOwnership(IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters); +int swprintf(wchar_t *buf, const wchar_t *fmt, ...); +int vsprintf(char *buf, const char *fmt, va_list args); +BOOLEAN STDCALL HalDisableSystemInterrupt(ULONG Vector, ULONG Unknown2); +BOOLEAN STDCALL HalEnableSystemInterrupt(ULONG Vector, ULONG Unknown2, ULONG Unknown3); +PIMAGE_NT_HEADERS STDCALL RtlImageNtHeader(IN PVOID BaseAddress); +#define NtCurrentProcess() ((HANDLE)0xFFFFFFFF) #define TAG_VIDEO_PORT TAG('V', 'I', 'D', 'P') -extern PEPROCESS Csrss; - typedef struct _VIDEO_PORT_ADDRESS_MAPPING { LIST_ENTRY List; @@ -56,46 +50,115 @@ typedef struct _VIDEO_PORT_ADDRESS_MAPPING UINT MappingCount; } VIDEO_PORT_ADDRESS_MAPPING, *PVIDEO_PORT_ADDRESS_MAPPING; +typedef struct _VIDEO_PORT_DRIVER_EXTENSION +{ + VIDEO_HW_INITIALIZATION_DATA InitializationData; + PVOID HwContext; + UNICODE_STRING RegistryPath; +} VIDEO_PORT_DRIVER_EXTENSION, *PVIDEO_PORT_DRIVER_EXTENSION; + typedef struct _VIDEO_PORT_DEVICE_EXTENSTION { - PDEVICE_OBJECT DeviceObject; + PDEVICE_OBJECT PhysicalDeviceObject; + PDEVICE_OBJECT FunctionalDeviceObject; + UNICODE_STRING RegistryPath; PKINTERRUPT InterruptObject; KSPIN_LOCK InterruptSpinLock; ULONG InterruptVector; ULONG InterruptLevel; - PVIDEO_HW_INITIALIZE HwInitialize; - PVIDEO_HW_RESET_HW HwResetHw; - PVIDEO_HW_TIMER HwTimer; - PVIDEO_HW_INTERRUPT HwInterrupt; - LIST_ENTRY AddressMappingListHead; - INTERFACE_TYPE AdapterInterfaceType; + ULONG AdapterInterfaceType; ULONG SystemIoBusNumber; - UNICODE_STRING RegistryPath; + ULONG SystemIoSlotNumber; + LIST_ENTRY AddressMappingListHead; KDPC DpcObject; - UCHAR MiniPortDeviceExtension[1]; /* must be the last entry */ + VIDEO_PORT_DRIVER_EXTENSION *DriverExtension; + CHAR MiniPortDeviceExtension[1]; } VIDEO_PORT_DEVICE_EXTENSION, *PVIDEO_PORT_DEVICE_EXTENSION; -NTSTATUS STDCALL -VidDispatchOpen(IN PDEVICE_OBJECT pDO, IN PIRP Irp); +#define VIDEO_PORT_GET_DEVICE_EXTENSION(MiniportExtension) \ + CONTAINING_RECORD( \ + HwDeviceExtension, \ + VIDEO_PORT_DEVICE_EXTENSION, \ + MiniPortDeviceExtension) + +/* dispatch.c */ NTSTATUS STDCALL -VidDispatchClose(IN PDEVICE_OBJECT pDO, IN PIRP Irp); +IntVideoPortAddDevice( + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT PhysicalDeviceObject); NTSTATUS STDCALL -VidDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); +IntVideoPortDispatchOpen( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp); -PVOID STDCALL -InternalMapMemory( - IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension, - IN PHYSICAL_ADDRESS IoAddress, - IN ULONG NumberOfUchars, - IN UCHAR InIoSpace, - OUT NTSTATUS *Status); +NTSTATUS STDCALL +IntVideoPortDispatchClose( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp); + +NTSTATUS STDCALL +IntVideoPortDispatchCleanup( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp); + +NTSTATUS STDCALL +IntVideoPortDispatchDeviceControl( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp); + +NTSTATUS STDCALL +IntVideoPortDispatchPnp( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp); + +NTSTATUS STDCALL +IntVideoPortDispatchPower( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp); VOID STDCALL -InternalUnmapMemory( - IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension, - IN PVOID MappedAddress); +IntVideoPortUnload(PDRIVER_OBJECT DriverObject); + +/* timer.c */ + +BOOLEAN STDCALL +IntVideoPortSetupTimer( + IN PDEVICE_OBJECT DeviceObject, + IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension); + +/* interrupt.c */ + +BOOLEAN STDCALL +IntVideoPortSetupInterrupt( + IN PDEVICE_OBJECT DeviceObject, + IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, + IN PVIDEO_PORT_CONFIG_INFO ConfigInfo); + +/* videoprt.c */ + +extern ULONG CsrssInitialized; +extern PEPROCESS Csrss; + +PVOID STDCALL +VideoPortGetProcAddress( + IN PVOID HwDeviceExtension, + IN PUCHAR FunctionName); + +VOID FASTCALL +IntAttachToCSRSS(PEPROCESS *CallingProcess, PEPROCESS *PrevAttachedProcess); + +VOID FASTCALL +IntDetachFromCSRSS(PEPROCESS *CallingProcess, PEPROCESS *PrevAttachedProcess); + +NTSTATUS STDCALL +IntVideoPortFindAdapter( + IN PDRIVER_OBJECT DriverObject, + IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, + IN PDEVICE_OBJECT PhysicalDeviceObject); + +/* int10.c */ VP_STATUS STDCALL IntInt10AllocateBuffer( @@ -131,4 +194,9 @@ IntInt10CallBios( IN PVOID Context, IN OUT PINT10_BIOS_ARGUMENTS BiosArguments); +VP_STATUS STDCALL +VideoPortInt10( + IN PVOID HwDeviceExtension, + IN PVIDEO_X86_BIOS_ARGUMENTS BiosArguments); + #endif /* VIDEOPRT_H */ diff --git a/reactos/drivers/video/videoprt/videoprt.rc b/reactos/drivers/video/videoprt/videoprt.rc index c2900509d77..21c500e06c7 100644 --- a/reactos/drivers/video/videoprt/videoprt.rc +++ b/reactos/drivers/video/videoprt/videoprt.rc @@ -24,9 +24,9 @@ BEGIN VALUE "CompanyName", RES_STR_COMPANY_NAME VALUE "FileDescription", "Videoport Driver\0" VALUE "FileVersion", "0.0.0\0" - VALUE "InternalName", "vidport\0" + VALUE "InternalName", "videoprt\0" VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT - VALUE "OriginalFilename", "vidport.sys\0" + VALUE "OriginalFilename", "videoprt.sys\0" VALUE "ProductName", RES_STR_PRODUCT_NAME VALUE "ProductVersion", RES_STR_PRODUCT_VERSION END From d0dca2b24f4afcad40b5efef6d411b52411d29a6 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 19 Mar 2004 21:02:55 +0000 Subject: [PATCH 0566/1463] - Load the PCI bus driver. - Move the VGA driver from "Video" to "Video Save" group. svn path=/trunk/; revision=8797 --- reactos/bootdata/hivesys.inf | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/reactos/bootdata/hivesys.inf b/reactos/bootdata/hivesys.inf index 3b37cdcd343..083838046c6 100644 --- a/reactos/bootdata/hivesys.inf +++ b/reactos/bootdata/hivesys.inf @@ -64,6 +64,7 @@ HKLM,"SYSTEM\CurrentControlSet\Control\ServiceGroupOrder","List",0x00010000, \ "Debug", \ "Video Init", \ "Video", \ + "Video Save", \ "File System", \ "Event log", \ "NDIS", \ @@ -103,7 +104,6 @@ HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\KnownDlls","kernel32",0x0 HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management","PagingFiles",0x00010000, \ "C:\reactos\pagefile.sys" - ; 3Com 3c905 Driver HKLM,"SYSTEM\CurrentControlSet\Services\3c90x","ErrorControl",0x00010001,0x00000000 HKLM,"SYSTEM\CurrentControlSet\Services\3c90x","Group",0x00000000,"NDIS" @@ -253,7 +253,6 @@ HKLM,"SYSTEM\CurrentControlSet\Services\Keyboard","Type",0x00010001,0x00000001 ;HKLM,"SYSTEM\CurrentControlSet\Services\sb16snd\Parameters\Device0\Devices","SBWaveIn0",0x00010001,0x00000001 ;HKLM,"SYSTEM\CurrentControlSet\Services\sb16snd\Parameters\Device0\Devices","SBWaveOut0",0x00010001,0x00000002 - HKLM,"SYSTEM\CurrentControlSet\Services\sb16snd","Group",0x00000000,"Base" HKLM,"SYSTEM\CurrentControlSet\Services\sb16snd","ServiceType",0x00010001,0x00000001 HKLM,"SYSTEM\CurrentControlSet\Services\sb16snd","Type",0x00010001,0x00000001 @@ -261,7 +260,6 @@ HKLM,"SYSTEM\CurrentControlSet\Services\sb16snd","Start",0x00010001,0x00000001 HKLM,"SYSTEM\CurrentControlSet\Services\sb16snd","ErrorControl",0x00010001,0x00000001 HKLM,"SYSTEM\CurrentControlSet\Services\sb16snd","ImagePath",0x00020000,"system32\drivers\sndblst.sys" - HKLM,"SYSTEM\CurrentControlSet\Services\es137140","Group",0x00000000,"Base" HKLM,"SYSTEM\CurrentControlSet\Services\es137140","ServiceType",0x00010001,0x00000001 HKLM,"SYSTEM\CurrentControlSet\Services\es137140","Type",0x00010001,0x00000001 @@ -282,7 +280,6 @@ HKLM,"SYSTEM\CurrentControlSet\Services\es137140\Parameters\Device0\Devices","EA HKLM,"SYSTEM\CurrentControlSet\Services\es137140\Parameters\Device0\Devices","EAPMixer0",0x00010001,0x00000006 HKLM,"SYSTEM\CurrentControlSet\Services\es137140\Parameters\Device0\Devices","EAPAux0",0x00010001,0x00000005 - ; MPU-401 MIDI driver HKLM,"SYSTEM\CurrentControlSet\Services\mpu401","Group",0x00000000,"Base" HKLM,"SYSTEM\CurrentControlSet\Services\mpu401","ServiceType",0x00010001,0x00000001 @@ -360,12 +357,12 @@ HKLM,"SYSTEM\CurrentControlSet\Services\Ne20001\Parameters\Tcpip","SubnetMask",0 HKLM,"SYSTEM\CurrentControlSet\Services\Pci","ErrorControl",0x00010001,0x00000000 HKLM,"SYSTEM\CurrentControlSet\Services\Pci","Group",0x00000000,"Boot Bus Extender" HKLM,"SYSTEM\CurrentControlSet\Services\Pci","ImagePath",0x00020000,"system32\drivers\pci.sys" -HKLM,"SYSTEM\CurrentControlSet\Services\Pci","Start",0x00010001,0x00000004 +HKLM,"SYSTEM\CurrentControlSet\Services\Pci","Start",0x00010001,0x00000003 HKLM,"SYSTEM\CurrentControlSet\Services\Pci","Tag",0x00010001,0x00000002 HKLM,"SYSTEM\CurrentControlSet\Services\Pci","Type",0x00010001,0x00000001 -;HKLM,"SYSTEM\CurrentControlSet\Enum\Root\PCI\0000","Service",0x00000000,"Pci" -;HKLM,"SYSTEM\CurrentControlSet\Enum\Root\PCI\0000","Class",0x00000000,"Computer" -;HKLM,"SYSTEM\CurrentControlSet\Enum\Root\PCI\0000","ClassGUID",0x00000000,"{4D36E966-E325-11CE-BFC1-08002BE10318}" +HKLM,"SYSTEM\CurrentControlSet\Enum\Root\PCI\0000","Service",0x00000000,"Pci" +HKLM,"SYSTEM\CurrentControlSet\Enum\Root\PCI\0000","Class",0x00000000,"Computer" +HKLM,"SYSTEM\CurrentControlSet\Enum\Root\PCI\0000","ClassGUID",0x00000000,"{4D36E966-E325-11CE-BFC1-08002BE10318}" ; AMD PCNet NIC driver HKLM,"SYSTEM\CurrentControlSet\Services\PCNet","ErrorControl",0x00010001,0x00000000 @@ -552,7 +549,7 @@ HKLM,"SYSTEM\CurrentControlSet\Services\Vfatfs","Type",0x00010001,0x00000002 ; VGA miniport driver HKLM,"SYSTEM\CurrentControlSet\Services\Vga","ErrorControl",0x00010001,0x00000000 -HKLM,"SYSTEM\CurrentControlSet\Services\Vga","Group",0x00000000,"Video" +HKLM,"SYSTEM\CurrentControlSet\Services\Vga","Group",0x00000000,"Video Save" HKLM,"SYSTEM\CurrentControlSet\Services\Vga","ImagePath",0x00020000,"system32\drivers\vgamp.sys" HKLM,"SYSTEM\CurrentControlSet\Services\Vga","Start",0x00010001,0x00000001 HKLM,"SYSTEM\CurrentControlSet\Services\Vga","Type",0x00010001,0x00000001 From 45dbc2f5d1c1277677256cd84a4572f2d1dc9ebb Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Fri, 19 Mar 2004 21:33:48 +0000 Subject: [PATCH 0567/1463] - Added definitions for NtCurrentProcess and NtCurrentThread. svn path=/trunk/; revision=8798 --- reactos/w32api/include/ddk/ntapi.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reactos/w32api/include/ddk/ntapi.h b/reactos/w32api/include/ddk/ntapi.h index a9a6b6e5ccb..2875826a619 100644 --- a/reactos/w32api/include/ddk/ntapi.h +++ b/reactos/w32api/include/ddk/ntapi.h @@ -48,6 +48,12 @@ typedef PVOID POBJECT_TYPE_LIST; typedef PVOID PEXECUTION_STATE; typedef PVOID PLANGID; +#ifndef NtCurrentProcess +#define NtCurrentProcess() ( (HANDLE) 0xFFFFFFFF ) +#endif /* NtCurrentProcess */ +#ifndef NtCurrentThread +#define NtCurrentThread() ( (HANDLE) 0xFFFFFFFE ) +#endif /* NtCurrentThread */ /* System information and control */ From dd4a8621129e1e7411d55df32a4fa08786328d60 Mon Sep 17 00:00:00 2001 From: David Welch <welch@cwcom.net> Date: Fri, 19 Mar 2004 21:34:49 +0000 Subject: [PATCH 0568/1463] - Removed local definition of NtCurrentProcess. svn path=/trunk/; revision=8799 --- reactos/drivers/video/videoprt/videoprt.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/reactos/drivers/video/videoprt/videoprt.h b/reactos/drivers/video/videoprt/videoprt.h index 54fa8c27801..452edbe0822 100644 --- a/reactos/drivers/video/videoprt/videoprt.h +++ b/reactos/drivers/video/videoprt/videoprt.h @@ -18,7 +18,7 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: videoprt.h,v 1.7 2004/03/19 20:58:32 navaraf Exp $ + * $Id: videoprt.h,v 1.8 2004/03/19 21:34:49 dwelch Exp $ */ #ifndef VIDEOPRT_H @@ -36,7 +36,6 @@ int vsprintf(char *buf, const char *fmt, va_list args); BOOLEAN STDCALL HalDisableSystemInterrupt(ULONG Vector, ULONG Unknown2); BOOLEAN STDCALL HalEnableSystemInterrupt(ULONG Vector, ULONG Unknown2, ULONG Unknown3); PIMAGE_NT_HEADERS STDCALL RtlImageNtHeader(IN PVOID BaseAddress); -#define NtCurrentProcess() ((HANDLE)0xFFFFFFFF) #define TAG_VIDEO_PORT TAG('V', 'I', 'D', 'P') From c082e0250f1cb47981eed5cca1161ca435e2f7a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Fri, 19 Mar 2004 22:58:10 +0000 Subject: [PATCH 0569/1463] Fix link warnings svn path=/trunk/; revision=8800 --- reactos/lib/msvcrt/msvcrt.def | 4 +- reactos/lib/msvcrt/wine/cpp.c | 77 +++++++++++++++++++---------------- 2 files changed, 44 insertions(+), 37 deletions(-) diff --git a/reactos/lib/msvcrt/msvcrt.def b/reactos/lib/msvcrt/msvcrt.def index 314b8dbfb23..d4e1f487f78 100644 --- a/reactos/lib/msvcrt/msvcrt.def +++ b/reactos/lib/msvcrt/msvcrt.def @@ -1,4 +1,4 @@ -; $Id: msvcrt.def,v 1.32 2004/02/28 16:54:22 navaraf Exp $ +; $Id: msvcrt.def,v 1.33 2004/03/19 22:58:09 gvg Exp $ ; ; ReactOS MSVCRT Compatibility Library ; @@ -57,7 +57,7 @@ $I10_OUTPUT=MSVCRT_I10_OUTPUT @1 ?terminate@@YAXXZ=MSVCRT_terminate @49 ?unexpected@@YAXXZ=MSVCRT_unexpected @50 ?what@exception@@UBEPBDXZ=__thiscall_MSVCRT_what_exception @51 -??1type_info@@UAE@XZ=MSVCRT_type_info_dtor +??1type_info@@UAE@XZ=MSVCRT_type_info_dtor@4 ;?name@type_info@@QBEPBDXZ=__thiscall_MSVCRT_type_info_name @44 ;??0bad_cast@@QAE@PBD@Z diff --git a/reactos/lib/msvcrt/wine/cpp.c b/reactos/lib/msvcrt/wine/cpp.c index c57a2c843fd..aebf87cedee 100644 --- a/reactos/lib/msvcrt/wine/cpp.c +++ b/reactos/lib/msvcrt/wine/cpp.c @@ -96,13 +96,20 @@ typedef struct _rtti_object_locator #ifdef __i386__ /* thiscall functions are i386-specific */ -#define DEFINE_THISCALL_WRAPPER(func) \ +#define DEFINE_THISCALL_WRAPPER0(func) \ extern void __thiscall_ ## func(); \ __ASM_GLOBAL_FUNC(__thiscall_ ## func, \ "popl %eax\n\t" \ "pushl %ecx\n\t" \ "pushl %eax\n\t" \ - "jmp " __ASM_NAME(#func) ) + "jmp " __ASM_NAME(#func) "@4" ) +#define DEFINE_THISCALL_WRAPPER1(func) \ + extern void __thiscall_ ## func(); \ + __ASM_GLOBAL_FUNC(__thiscall_ ## func, \ + "popl %eax\n\t" \ + "pushl %ecx\n\t" \ + "pushl %eax\n\t" \ + "jmp " __ASM_NAME(#func) "@8" ) const exception_vtable MSVCRT_exception_vtable; const exception_vtable MSVCRT_bad_typeid_vtable; @@ -132,7 +139,7 @@ static void WINAPI EXCEPTION_ctor(exception *_this, const char** name) /****************************************************************** * ??0exception@@QAE@ABQBD@Z (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT_exception_ctor); +DEFINE_THISCALL_WRAPPER1(MSVCRT_exception_ctor); exception * __stdcall MSVCRT_exception_ctor(exception * _this, const char ** name) { TRACE("(%p,%s)\n", _this, *name); @@ -143,7 +150,7 @@ exception * __stdcall MSVCRT_exception_ctor(exception * _this, const char ** nam /****************************************************************** * ??0exception@@QAE@ABV0@@Z (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT_exception_copy_ctor); +DEFINE_THISCALL_WRAPPER1(MSVCRT_exception_copy_ctor); exception * __stdcall MSVCRT_exception_copy_ctor(exception * _this, const exception * rhs) { TRACE("(%p,%p)\n", _this, rhs); @@ -163,7 +170,7 @@ exception * __stdcall MSVCRT_exception_copy_ctor(exception * _this, const except /****************************************************************** * ??0exception@@QAE@XZ (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT_exception_default_ctor); +DEFINE_THISCALL_WRAPPER0(MSVCRT_exception_default_ctor); exception * __stdcall MSVCRT_exception_default_ctor(exception * _this) { static const char* empty = NULL; @@ -176,7 +183,7 @@ exception * __stdcall MSVCRT_exception_default_ctor(exception * _this) /****************************************************************** * ??1exception@@UAE@XZ (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT_exception_dtor); +DEFINE_THISCALL_WRAPPER0(MSVCRT_exception_dtor); void __stdcall MSVCRT_exception_dtor(exception * _this) { TRACE("(%p)\n", _this); @@ -188,7 +195,7 @@ void __stdcall MSVCRT_exception_dtor(exception * _this) /****************************************************************** * ??4exception@@QAEAAV0@ABV0@@Z (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT_exception_opequals); +DEFINE_THISCALL_WRAPPER1(MSVCRT_exception_opequals); exception * __stdcall MSVCRT_exception_opequals(exception * _this, const exception * rhs) { TRACE("(%p %p)\n", _this, rhs); @@ -204,7 +211,7 @@ exception * __stdcall MSVCRT_exception_opequals(exception * _this, const excepti /****************************************************************** * ??_Eexception@@UAEPAXI@Z (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT_exception_vector_dtor); +DEFINE_THISCALL_WRAPPER1(MSVCRT_exception_vector_dtor); void * __stdcall MSVCRT_exception_vector_dtor(exception * _this, unsigned int flags) { TRACE("(%p %x)\n", _this, flags); @@ -227,7 +234,7 @@ void * __stdcall MSVCRT_exception_vector_dtor(exception * _this, unsigned int fl /****************************************************************** * ??_Gexception@@UAEPAXI@Z (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT_exception_scalar_dtor); +DEFINE_THISCALL_WRAPPER1(MSVCRT_exception_scalar_dtor); void * __stdcall MSVCRT_exception_scalar_dtor(exception * _this, unsigned int flags) { TRACE("(%p %x)\n", _this, flags); @@ -239,7 +246,7 @@ void * __stdcall MSVCRT_exception_scalar_dtor(exception * _this, unsigned int fl /****************************************************************** * ?what@exception@@UBEPBDXZ (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT_what_exception); +DEFINE_THISCALL_WRAPPER0(MSVCRT_what_exception); const char * __stdcall MSVCRT_what_exception(exception * _this) { TRACE("(%p) returning %s\n", _this, _this->name); @@ -249,7 +256,7 @@ const char * __stdcall MSVCRT_what_exception(exception * _this) /****************************************************************** * ??0bad_typeid@@QAE@ABV0@@Z (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT_bad_typeid_copy_ctor); +DEFINE_THISCALL_WRAPPER1(MSVCRT_bad_typeid_copy_ctor); bad_typeid * __stdcall MSVCRT_bad_typeid_copy_ctor(bad_typeid * _this, const bad_typeid * rhs) { TRACE("(%p %p)\n", _this, rhs); @@ -261,7 +268,7 @@ bad_typeid * __stdcall MSVCRT_bad_typeid_copy_ctor(bad_typeid * _this, const bad /****************************************************************** * ??0bad_typeid@@QAE@PBD@Z (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT_bad_typeid_ctor); +DEFINE_THISCALL_WRAPPER1(MSVCRT_bad_typeid_ctor); bad_typeid * __stdcall MSVCRT_bad_typeid_ctor(bad_typeid * _this, const char * name) { TRACE("(%p %s)\n", _this, name); @@ -273,7 +280,7 @@ bad_typeid * __stdcall MSVCRT_bad_typeid_ctor(bad_typeid * _this, const char * n /****************************************************************** * ??1bad_typeid@@UAE@XZ (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT_bad_typeid_dtor); +DEFINE_THISCALL_WRAPPER0(MSVCRT_bad_typeid_dtor); void __stdcall MSVCRT_bad_typeid_dtor(bad_typeid * _this) { TRACE("(%p)\n", _this); @@ -283,7 +290,7 @@ void __stdcall MSVCRT_bad_typeid_dtor(bad_typeid * _this) /****************************************************************** * ??4bad_typeid@@QAEAAV0@ABV0@@Z (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT_bad_typeid_opequals); +DEFINE_THISCALL_WRAPPER1(MSVCRT_bad_typeid_opequals); bad_typeid * __stdcall MSVCRT_bad_typeid_opequals(bad_typeid * _this, const bad_typeid * rhs) { TRACE("(%p %p)\n", _this, rhs); @@ -294,7 +301,7 @@ bad_typeid * __stdcall MSVCRT_bad_typeid_opequals(bad_typeid * _this, const bad_ /****************************************************************** * ??_Ebad_typeid@@UAEPAXI@Z (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT_bad_typeid_vector_dtor); +DEFINE_THISCALL_WRAPPER1(MSVCRT_bad_typeid_vector_dtor); void * __stdcall MSVCRT_bad_typeid_vector_dtor(bad_typeid * _this, unsigned int flags) { TRACE("(%p %x)\n", _this, flags); @@ -317,7 +324,7 @@ void * __stdcall MSVCRT_bad_typeid_vector_dtor(bad_typeid * _this, unsigned int /****************************************************************** * ??_Gbad_typeid@@UAEPAXI@Z (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT_bad_typeid_scalar_dtor); +DEFINE_THISCALL_WRAPPER1(MSVCRT_bad_typeid_scalar_dtor); void * __stdcall MSVCRT_bad_typeid_scalar_dtor(bad_typeid * _this, unsigned int flags) { TRACE("(%p %x)\n", _this, flags); @@ -329,7 +336,7 @@ void * __stdcall MSVCRT_bad_typeid_scalar_dtor(bad_typeid * _this, unsigned int /****************************************************************** * ??0__non_rtti_object@@QAE@ABV0@@Z (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT___non_rtti_object_copy_ctor); +DEFINE_THISCALL_WRAPPER1(MSVCRT___non_rtti_object_copy_ctor); __non_rtti_object * __stdcall MSVCRT___non_rtti_object_copy_ctor(__non_rtti_object * _this, const __non_rtti_object * rhs) { @@ -342,7 +349,7 @@ __non_rtti_object * __stdcall MSVCRT___non_rtti_object_copy_ctor(__non_rtti_obje /****************************************************************** * ??0__non_rtti_object@@QAE@PBD@Z (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT___non_rtti_object_ctor); +DEFINE_THISCALL_WRAPPER1(MSVCRT___non_rtti_object_ctor); __non_rtti_object * __stdcall MSVCRT___non_rtti_object_ctor(__non_rtti_object * _this, const char * name) { @@ -355,7 +362,7 @@ __non_rtti_object * __stdcall MSVCRT___non_rtti_object_ctor(__non_rtti_object * /****************************************************************** * ??1__non_rtti_object@@UAE@XZ (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT___non_rtti_object_dtor); +DEFINE_THISCALL_WRAPPER0(MSVCRT___non_rtti_object_dtor); void __stdcall MSVCRT___non_rtti_object_dtor(__non_rtti_object * _this) { TRACE("(%p)\n", _this); @@ -365,7 +372,7 @@ void __stdcall MSVCRT___non_rtti_object_dtor(__non_rtti_object * _this) /****************************************************************** * ??4__non_rtti_object@@QAEAAV0@ABV0@@Z (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT___non_rtti_object_opequals); +DEFINE_THISCALL_WRAPPER1(MSVCRT___non_rtti_object_opequals); __non_rtti_object * __stdcall MSVCRT___non_rtti_object_opequals(__non_rtti_object * _this, const __non_rtti_object *rhs) { @@ -377,7 +384,7 @@ __non_rtti_object * __stdcall MSVCRT___non_rtti_object_opequals(__non_rtti_objec /****************************************************************** * ??_E__non_rtti_object@@UAEPAXI@Z (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT___non_rtti_object_vector_dtor); +DEFINE_THISCALL_WRAPPER1(MSVCRT___non_rtti_object_vector_dtor); void * __stdcall MSVCRT___non_rtti_object_vector_dtor(__non_rtti_object * _this, unsigned int flags) { TRACE("(%p %x)\n", _this, flags); @@ -400,7 +407,7 @@ void * __stdcall MSVCRT___non_rtti_object_vector_dtor(__non_rtti_object * _this, /****************************************************************** * ??_G__non_rtti_object@@UAEPAXI@Z (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT___non_rtti_object_scalar_dtor); +DEFINE_THISCALL_WRAPPER1(MSVCRT___non_rtti_object_scalar_dtor); void * __stdcall MSVCRT___non_rtti_object_scalar_dtor(__non_rtti_object * _this, unsigned int flags) { TRACE("(%p %x)\n", _this, flags); @@ -412,7 +419,7 @@ void * __stdcall MSVCRT___non_rtti_object_scalar_dtor(__non_rtti_object * _this, /****************************************************************** * ??0bad_cast@@QAE@ABQBD@Z (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT_bad_cast_ctor); +DEFINE_THISCALL_WRAPPER1(MSVCRT_bad_cast_ctor); bad_cast * __stdcall MSVCRT_bad_cast_ctor(bad_cast * _this, const char ** name) { TRACE("(%p %s)\n", _this, *name); @@ -424,7 +431,7 @@ bad_cast * __stdcall MSVCRT_bad_cast_ctor(bad_cast * _this, const char ** name) /****************************************************************** * ??0bad_cast@@QAE@ABV0@@Z (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT_bad_cast_copy_ctor); +DEFINE_THISCALL_WRAPPER1(MSVCRT_bad_cast_copy_ctor); bad_cast * __stdcall MSVCRT_bad_cast_copy_ctor(bad_cast * _this, const bad_cast * rhs) { TRACE("(%p %p)\n", _this, rhs); @@ -436,7 +443,7 @@ bad_cast * __stdcall MSVCRT_bad_cast_copy_ctor(bad_cast * _this, const bad_cast /****************************************************************** * ??1bad_cast@@UAE@XZ (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT_bad_cast_dtor); +DEFINE_THISCALL_WRAPPER0(MSVCRT_bad_cast_dtor); void __stdcall MSVCRT_bad_cast_dtor(bad_cast * _this) { TRACE("(%p)\n", _this); @@ -446,7 +453,7 @@ void __stdcall MSVCRT_bad_cast_dtor(bad_cast * _this) /****************************************************************** * ??4bad_cast@@QAEAAV0@ABV0@@Z (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT_bad_cast_opequals); +DEFINE_THISCALL_WRAPPER1(MSVCRT_bad_cast_opequals); bad_cast * __stdcall MSVCRT_bad_cast_opequals(bad_cast * _this, const bad_cast * rhs) { TRACE("(%p %p)\n", _this, rhs); @@ -457,7 +464,7 @@ bad_cast * __stdcall MSVCRT_bad_cast_opequals(bad_cast * _this, const bad_cast * /****************************************************************** * ??_Ebad_cast@@UAEPAXI@Z (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT_bad_cast_vector_dtor); +DEFINE_THISCALL_WRAPPER1(MSVCRT_bad_cast_vector_dtor); void * __stdcall MSVCRT_bad_cast_vector_dtor(bad_cast * _this, unsigned int flags) { TRACE("(%p %x)\n", _this, flags); @@ -480,7 +487,7 @@ void * __stdcall MSVCRT_bad_cast_vector_dtor(bad_cast * _this, unsigned int flag /****************************************************************** * ??_Gbad_cast@@UAEPAXI@Z (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT_bad_cast_scalar_dtor); +DEFINE_THISCALL_WRAPPER1(MSVCRT_bad_cast_scalar_dtor); void * __stdcall MSVCRT_bad_cast_scalar_dtor(bad_cast * _this, unsigned int flags) { TRACE("(%p %x)\n", _this, flags); @@ -492,7 +499,7 @@ void * __stdcall MSVCRT_bad_cast_scalar_dtor(bad_cast * _this, unsigned int flag /****************************************************************** * ??8type_info@@QBEHABV0@@Z (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT_type_info_opequals_equals); +DEFINE_THISCALL_WRAPPER1(MSVCRT_type_info_opequals_equals); int __stdcall MSVCRT_type_info_opequals_equals(type_info * _this, const type_info * rhs) { int ret = !strcmp(_this->mangled + 1, rhs->mangled + 1); @@ -503,7 +510,7 @@ int __stdcall MSVCRT_type_info_opequals_equals(type_info * _this, const type_inf /****************************************************************** * ??9type_info@@QBEHABV0@@Z (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT_type_info_opnot_equals); +DEFINE_THISCALL_WRAPPER1(MSVCRT_type_info_opnot_equals); int __stdcall MSVCRT_type_info_opnot_equals(type_info * _this, const type_info * rhs) { int ret = !!strcmp(_this->mangled + 1, rhs->mangled + 1); @@ -514,7 +521,7 @@ int __stdcall MSVCRT_type_info_opnot_equals(type_info * _this, const type_info * /****************************************************************** * ?before@type_info@@QBEHABV1@@Z (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT_type_info_before); +DEFINE_THISCALL_WRAPPER1(MSVCRT_type_info_before); int __stdcall MSVCRT_type_info_before(type_info * _this, const type_info * rhs) { int ret = strcmp(_this->mangled + 1, rhs->mangled + 1) < 0; @@ -525,7 +532,7 @@ int __stdcall MSVCRT_type_info_before(type_info * _this, const type_info * rhs) /****************************************************************** * ??1type_info@@UAE@XZ (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT_type_info_dtor); +DEFINE_THISCALL_WRAPPER0(MSVCRT_type_info_dtor); void __stdcall MSVCRT_type_info_dtor(type_info * _this) { TRACE("(%p)\n", _this); @@ -537,7 +544,7 @@ void __stdcall MSVCRT_type_info_dtor(type_info * _this) /****************************************************************** * ?name@type_info@@QBEPBDXZ (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT_type_info_name); +DEFINE_THISCALL_WRAPPER0(MSVCRT_type_info_name); const char * __stdcall MSVCRT_type_info_name(type_info * _this) { if (!_this->name) @@ -576,7 +583,7 @@ const char * __stdcall MSVCRT_type_info_name(type_info * _this) /****************************************************************** * ?raw_name@type_info@@QBEPBDXZ (MSVCRT.@) */ -DEFINE_THISCALL_WRAPPER(MSVCRT_type_info_raw_name); +DEFINE_THISCALL_WRAPPER0(MSVCRT_type_info_raw_name); const char * __stdcall MSVCRT_type_info_raw_name(type_info * _this) { TRACE("(%p) returning %s\n", _this, _this->mangled); @@ -584,7 +591,7 @@ const char * __stdcall MSVCRT_type_info_raw_name(type_info * _this) } /* Unexported */ -DEFINE_THISCALL_WRAPPER(MSVCRT_type_info_vector_dtor); +DEFINE_THISCALL_WRAPPER1(MSVCRT_type_info_vector_dtor); void * __stdcall MSVCRT_type_info_vector_dtor(type_info * _this, unsigned int flags) { TRACE("(%p %x)\n", _this, flags); From 896376d3c1fab553d6bba117467146147b1f30a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Fri, 19 Mar 2004 22:59:23 +0000 Subject: [PATCH 0570/1463] Handle characters outside first page svn path=/trunk/; revision=8801 --- reactos/lib/msvcrt/stdlib/wctomb.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/lib/msvcrt/stdlib/wctomb.c b/reactos/lib/msvcrt/stdlib/wctomb.c index a5158a173aa..e4926d43195 100644 --- a/reactos/lib/msvcrt/stdlib/wctomb.c +++ b/reactos/lib/msvcrt/stdlib/wctomb.c @@ -47,6 +47,8 @@ int wctomb(char* dst, wchar_t ch) #else if (dst == NULL) { return 1; + } else if (0 != (ch & 0xff00)) { + return -1; } *dst = ch; return 1; From 77eb2df0b27388b896bef2a4e22dc39cdd7782e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Fri, 19 Mar 2004 23:00:35 +0000 Subject: [PATCH 0571/1463] Handle invalid Unicode strings for %S format like MS does svn path=/trunk/; revision=8802 --- reactos/lib/msvcrt/stdio/vfprintf.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/reactos/lib/msvcrt/stdio/vfprintf.c b/reactos/lib/msvcrt/stdio/vfprintf.c index c95864f3d75..4b5419659eb 100644 --- a/reactos/lib/msvcrt/stdio/vfprintf.c +++ b/reactos/lib/msvcrt/stdio/vfprintf.c @@ -679,9 +679,20 @@ static int stringw(FILE *f, const wchar_t* sw, int len, int field_width, int pre } for (i = 0; i < len; ++i) { - if (putc((unsigned char)(*sw++), f) == EOF) - return -1; - done++; +#define MB_CUR_MAX 1 + char mb[MB_CUR_MAX]; + int mbcount, j; + mbcount = wctomb(mb, *sw++); + if (mbcount <= 0) + { + break; + } + for (j = 0; j < mbcount; j++) + { + if (putc(mb[j], f) == EOF) + return -1; + done++; + } } while (len < field_width--) { From ffc7f0a6a8aebdc35cdaae51a329800f74a6e99c Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Sat, 20 Mar 2004 04:32:06 +0000 Subject: [PATCH 0572/1463] Enable stub for ImpersonateLoggedOnUser. This gets taskmgr to load again. svn path=/trunk/; revision=8803 --- reactos/lib/advapi32/advapi32.def | 4 ++-- reactos/lib/advapi32/advapi32.edf | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/lib/advapi32/advapi32.def b/reactos/lib/advapi32/advapi32.def index 390bfcda831..2ffc4ab06ed 100644 --- a/reactos/lib/advapi32/advapi32.def +++ b/reactos/lib/advapi32/advapi32.def @@ -1,4 +1,4 @@ -; $Id: advapi32.def,v 1.16 2004/03/08 18:09:04 sedwards Exp $ +; $Id: advapi32.def,v 1.17 2004/03/20 04:32:05 sedwards Exp $ ; ; advapi32.def ; @@ -176,7 +176,7 @@ GetUserNameW@8 ;I_ScGetCurrentGroupStateW@12 ;I_ScSetServiceBitsA@20 ;I_ScSetServiceBitsW@20 -;ImpersonateLoggedOnUser@4 +ImpersonateLoggedOnUser@4 ;ImpersonateNamedPipeClient@4 ImpersonateSelf@4 InitializeAcl@12 diff --git a/reactos/lib/advapi32/advapi32.edf b/reactos/lib/advapi32/advapi32.edf index b857f922b07..dd17a7313e7 100644 --- a/reactos/lib/advapi32/advapi32.edf +++ b/reactos/lib/advapi32/advapi32.edf @@ -1,4 +1,4 @@ -; $Id: advapi32.edf,v 1.36 2004/03/10 21:37:18 navaraf Exp $ +; $Id: advapi32.edf,v 1.37 2004/03/20 04:32:06 sedwards Exp $ ; ; advapi32.edf ; @@ -172,7 +172,7 @@ GetUserNameW=GetUserNameW@8 ;I_ScGetCurrentGroupStateW=I_ScGetCurrentGroupStateW@12 ;I_ScSetServiceBitsA=I_ScSetServiceBitsA@20 ;I_ScSetServiceBitsW=I_ScSetServiceBitsW@20 -;ImpersonateLoggedOnUser=ImpersonateLoggedOnUser@4 +ImpersonateLoggedOnUser=ImpersonateLoggedOnUser@4 ;ImpersonateNamedPipeClient=ImpersonateNamedPipeClient@4 ImpersonateSelf=ImpersonateSelf@4 InitializeAcl=InitializeAcl@12 From 05cd23fc5ccd3b71464e5173ce797edbf6a2ea39 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Sat, 20 Mar 2004 04:36:16 +0000 Subject: [PATCH 0573/1463] Add notepad to the list of targets. svn path=/trunk/; revision=8804 --- rosapps/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/rosapps/Makefile b/rosapps/Makefile index 130925ca581..2a82178398f 100644 --- a/rosapps/Makefile +++ b/rosapps/Makefile @@ -14,6 +14,7 @@ APPS = calc \ dflat32 \ hcalc \ mc \ + notepad \ notevil \ sysutils \ demos$(SEP)maze\ From 347477b0e91c2844df9f5bcff72b0ce00b806fad Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sat, 20 Mar 2004 09:11:13 +0000 Subject: [PATCH 0574/1463] fix for installation target by James Tabor svn path=/trunk/; revision=8805 --- reactos/subsys/system/explorer/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/subsys/system/explorer/Makefile b/reactos/subsys/system/explorer/Makefile index da94f3ab375..b7d5cd39ff5 100644 --- a/reactos/subsys/system/explorer/Makefile +++ b/reactos/subsys/system/explorer/Makefile @@ -155,7 +155,7 @@ implib: install: -$(TOOLS_PATH)/rcopy $(TARGET) $(INSTALL_DIR)/$(TARGET) - -$(TOOLS_PATH)/rcopy notifyhook.dll $(INSTALL_DIR)/$(TARGET) + -$(TOOLS_PATH)/rcopy notifyhook.dll $(INSTALL_DIR)/system32/notifyhook.dll bootcd: From 5ac21480585bc0213c983292aa0e50a12f07e4fd Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sat, 20 Mar 2004 09:16:17 +0000 Subject: [PATCH 0575/1463] added notifyhook.dll svn path=/trunk/; revision=8806 --- 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 f9c85199709..59a81348dea 100755 --- a/reactos/bootdata/packages/reactos.dff +++ b/reactos/bootdata/packages/reactos.dff @@ -96,6 +96,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\notifyhook.dll 1 subsys\system\format\format.exe 1 subsys\system\regedit\regedit.exe 4 subsys\system\services\services.exe 1 From f06e49faea870640ec180deb40b23ab4276bca24 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sat, 20 Mar 2004 11:42:22 +0000 Subject: [PATCH 0576/1463] auto-hiding of inactive notification icons svn path=/trunk/; revision=8807 --- reactos/subsys/system/explorer/Makefile.MinGW | 5 +- reactos/subsys/system/explorer/doc/TODO.txt | 1 - .../system/explorer/taskbar/traynotify.cpp | 156 ++++++++++++++---- .../system/explorer/taskbar/traynotify.h | 36 +++- 4 files changed, 162 insertions(+), 36 deletions(-) diff --git a/reactos/subsys/system/explorer/Makefile.MinGW b/reactos/subsys/system/explorer/Makefile.MinGW index e9a2bc63d73..44a78f592ed 100644 --- a/reactos/subsys/system/explorer/Makefile.MinGW +++ b/reactos/subsys/system/explorer/Makefile.MinGW @@ -77,12 +77,15 @@ DELAYIMPORTS = oleaut32 wsock32 all: $(TARGET) -$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) +$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) notifyhook.dll $(LINK) $(LFLAGS) -o $@ $^ $(addprefix -l,$(LIBS)) $(addprefix -l,$(DELAYIMPORTS)) explorer$(RES_SUFFIX): $(PROGRAM)_intres.rc res/*.bmp res/*.ico windres $(RCFLAGS) -o $@ $(PROGRAM)_intres.rc +notifyhook.dll: notifyhook/notifyhook.c notifyhook/notifyhook.h + $(CC) -D_WIN32_IE=0x0600 -Wall -D_NOTIFYHOOK_IMPL -Os -s notifyhook/notifyhook.c -shared -o $@ + clean: rm -f $(TARGET) $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) diff --git a/reactos/subsys/system/explorer/doc/TODO.txt b/reactos/subsys/system/explorer/doc/TODO.txt index cb5301c2165..2c3452cf651 100644 --- a/reactos/subsys/system/explorer/doc/TODO.txt +++ b/reactos/subsys/system/explorer/doc/TODO.txt @@ -1,5 +1,4 @@ - read "DESCRIPT.ION" files to display file descriptions -- hiding of notification icons - context menus for quick launch bar - detect display mode changes and adjust desktop bar size - handling of full screen applications diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index 71e86bb043c..e14e8b5b852 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -89,6 +89,9 @@ NotifyInfo::NotifyInfo() _dwState = 0; _uCallbackMessage = 0; _version = 0; + + _mode = NIM_AUTO; + _lastChange = GetTickCount(); } @@ -150,6 +153,9 @@ NotifyInfo& NotifyInfo::operator=(NOTIFYICONDATA* pnid) _tipText.assign(txt, l); } + ///@todo test for real changes + _lastChange = GetTickCount(); + return *this; } @@ -162,6 +168,46 @@ NotifyArea::NotifyArea(HWND hwnd) _clock_width = 0; _last_icon_count = 0; _show_hidden = false; + + ///@todo read from config file --> + NotifyIconConfig cfg; + + cfg._tipText = TEXT("FRITZ!fon"); + cfg._mode = NIM_HIDE; + _cfg.push_back(cfg); + + cfg._tipText = TEXT("FRITZ!fax"); + cfg._mode = NIM_HIDE; + _cfg.push_back(cfg); + + cfg._tipText = TEXT("Volume"); + cfg._mode = NIM_SHOW; + _cfg.push_back(cfg); + + cfg._tipText.erase(); + + cfg._windowTitle = TEXT("Task Manager"); + cfg._mode = NIM_SHOW; + _cfg.push_back(cfg); + + cfg._windowTitle = TEXT("AntiVir"); + cfg._mode = NIM_HIDE; + _cfg.push_back(cfg); + + cfg._windowTitle = TEXT("Apache"); + cfg._mode = NIM_HIDE; + _cfg.push_back(cfg); + + cfg._windowTitle = TEXT("FRITZ!web"); + cfg._mode = NIM_HIDE; + _cfg.push_back(cfg); + + cfg._windowTitle.erase(); + + cfg._modulePath = TEXT("xyz"); //@@ + cfg._mode = NIM_HIDE; + _cfg.push_back(cfg); + /// <-- } LRESULT NotifyArea::Init(LPCREATESTRUCT pcs) @@ -257,10 +303,8 @@ LRESULT NotifyArea::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) String path; HWND hwnd; - if (_hook.ModulePathCopyData(lparam, &hwnd, path)) { + if (_hook.ModulePathCopyData(lparam, &hwnd, path)) _window_modules[hwnd] = path; - //@@ -> trigger DetermineHideState() - } break;} @@ -357,7 +401,7 @@ LRESULT NotifyArea::ProcessTrayNotification(int notify_code, NOTIFYICONDATA* pni entry._idx = ++_next_idx; #if NOTIFYICON_VERSION>=3 // as of 21.08.2003 missing in MinGW headers - if (DetermineHideState(entry)) + if (DetermineHideState(entry) && entry._mode==NIM_HIDE) entry._dwState |= NIS_HIDDEN; #endif @@ -464,7 +508,7 @@ void NotifyArea::TimerTick() bool do_refresh = false; // Look for task icons without valid owner window. - // This is an advanced feature, which is missing in MS Windows. + // This is an extended feature missing in MS Windows. for(NotifyIconSet::const_iterator it=_sorted_icons.begin(); it!=_sorted_icons.end(); ++it) { const NotifyInfo& entry = *it; @@ -473,6 +517,40 @@ void NotifyArea::TimerTick() ++do_refresh; } + DWORD now = GetTickCount(); + + // handle icon hiding + for(NotifyIconMap::iterator it=_icon_map.begin(); it!=_icon_map.end(); ++it) { + NotifyInfo& entry = it->second; + + DetermineHideState(entry); + + switch(entry._mode) { + case NIM_HIDE: + if (!(entry._dwState & NIS_HIDDEN)) { + entry._dwState |= NIS_HIDDEN; + ++do_refresh; + } + break; + + case NIM_SHOW: + if (entry._dwState&NIS_HIDDEN) { + entry._dwState &= ~NIS_HIDDEN; + ++do_refresh; + } + break; + + case NIM_AUTO: + // automatically hide icons after long periods of inactivity + if (!(entry._dwState & NIS_HIDDEN)) + if (now-entry._lastChange > ICON_AUTOHIDE_SECONDS*1000) { + entry._dwState |= NIS_HIDDEN; + ++do_refresh; + } + break; + } + } + if (do_refresh) Refresh(); } @@ -499,44 +577,56 @@ NotifyIconSet::iterator NotifyArea::IconHitTest(const POINT& pos) return it; } + #if NOTIFYICON_VERSION>=3 // as of 21.08.2003 missing in MinGW headers -bool NotifyArea::DetermineHideState(NotifyInfo& entry) + +bool NotifyIconConfig::match(const NotifyIconProps& props) const { - if (entry._tipText == TEXT("FRITZ!fon")) - return true; - - if (entry._tipText == TEXT("FRITZ!fax")) - return true; - - TCHAR title[MAX_PATH]; - - if (GetWindowText(entry._hWnd, title, MAX_PATH)) { - if (_tcsstr(title, TEXT("Task Manager"))) - return false; - - if (_tcsstr(title, TEXT("AntiVir"))) + if (!_tipText.empty() && !props._tipText.empty()) + if (props._tipText == _tipText) return true; - if (_tcsstr(title, TEXT("Apache"))) + if (!_windowTitle.empty() && !props._windowTitle.empty()) + if (_tcsstr(props._windowTitle, _windowTitle)) return true; - if (_tcsstr(title, TEXT("FRITZ!web"))) + if (!_modulePath.empty() && !props._modulePath.empty()) + if (!_tcsicmp(props._modulePath, _modulePath)) return true; - } - - const String& modulePath = _window_modules[entry._hWnd]; - - // request module path for new windows (We will get an asynchronous answer by a WM_COPYDATA message.) - if (modulePath.empty()) { - _hook.GetModulePath(entry._hWnd, _hwnd); - return false; - } - - if (modulePath == TEXT("xyz")) //@@ - return true; return false; } + +bool NotifyArea::DetermineHideState(NotifyInfo& entry) +{ + for(NotifyIconCfgList::const_iterator it=_cfg.begin(); it!=_cfg.end(); ++it) { + const NotifyIconConfig& cfg = *it; + + NotifyIconProps props; + + props._tipText = entry._tipText; + + TCHAR title[MAX_PATH]; + if (GetWindowText(entry._hWnd, title, MAX_PATH)) + props._windowTitle = title; + + const String& modulePath = _window_modules[entry._hWnd]; + + // request module path for new windows (We will get an asynchronous answer by a WM_COPYDATA message.) + if (!modulePath.empty()) + props._modulePath = modulePath; + else + _hook.GetModulePath(entry._hWnd, _hwnd); + + if (cfg.match(props)) { + entry._mode = cfg._mode; + return true; + } + } + + return false; +} + #endif diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.h b/reactos/subsys/system/explorer/taskbar/traynotify.h index 4f1e53a9108..07a8f229460 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.h +++ b/reactos/subsys/system/explorer/taskbar/traynotify.h @@ -37,6 +37,8 @@ #define PM_GETMODULEPATH_CB (WM_APP+0x21) +#define ICON_AUTOHIDE_SECONDS 300 + /// NotifyIconIndex is used for maintaining the order of notification icons. struct NotifyIconIndex @@ -54,7 +56,34 @@ protected: NotifyIconIndex(); }; - /// structure for maintaining informations of one notification icons + +enum NOTIFYICONMODE { + NIM_AUTO, NIM_SHOW, NIM_HIDE +}; + + /// properties used to identify a notification icon +struct NotifyIconProps +{ + String _tipText; + String _windowTitle; // To look at the window title and at the window module path of the notify icon owner window + String _modulePath; // to identify notification icons is an extension above XP's behaviour. +}; // (XP seems to store icon image data in the registry instead.) + + /// configuration for the display mode of a notification icon +struct NotifyIconConfig : public NotifyIconProps +{ + NotifyIconConfig() : _mode(NIM_AUTO) {} + + bool match(const NotifyIconProps& props) const; + + NOTIFYICONMODE _mode; +}; + + /// list of NotifyIconConfig structures +typedef list<NotifyIconConfig> NotifyIconCfgList; + + + /// structure for maintaining informations about one notification icon struct NotifyInfo : public NotifyIconIndex { NotifyInfo(); @@ -71,6 +100,9 @@ struct NotifyInfo : public NotifyIconIndex UINT _uCallbackMessage; UINT _version; String _tipText; + + NOTIFYICONMODE _mode; + DWORD _lastChange; // timer tick value of the last change }; typedef map<NotifyIconIndex, NotifyInfo> NotifyIconMap; @@ -127,6 +159,8 @@ protected: NotifyIconSet::iterator IconHitTest(const POINT& pos); bool DetermineHideState(NotifyInfo& entry); + NotifyIconCfgList _cfg; + NotifyHook _hook; map<HWND, String> _window_modules; }; From 18e827f8459d023fcde1bc18c25a76c69814d845 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sat, 20 Mar 2004 13:13:40 +0000 Subject: [PATCH 0577/1463] context menu for notification area svn path=/trunk/; revision=8808 --- reactos/subsys/system/explorer/explorer-jp.rc | 6 +- .../subsys/system/explorer/explorer_intres.h | 6 +- .../subsys/system/explorer/explorer_intres.rc | 277 +++++++++--------- .../system/explorer/taskbar/desktopbar.cpp | 8 +- .../system/explorer/taskbar/taskbar.cpp | 2 + .../system/explorer/taskbar/traynotify.cpp | 39 ++- .../system/explorer/taskbar/traynotify.h | 1 + 7 files changed, 198 insertions(+), 141 deletions(-) diff --git a/reactos/subsys/system/explorer/explorer-jp.rc b/reactos/subsys/system/explorer/explorer-jp.rc index 806afe31286..721ee7b8591 100644 --- a/reactos/subsys/system/explorer/explorer-jp.rc +++ b/reactos/subsys/system/explorer/explorer-jp.rc @@ -167,8 +167,10 @@ IDM_DESKTOPBAR MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER //FIXME? - MENUITEM "&Settings...", ID_DESKTOPBAR_SETTINGS //FIXME? + MENUITEM "&Settings...", ID_DESKTOPBAR_SETTINGS //FIXME? + MENUITEM "&Task Manager...", ID_TASKMGR + MENUITEM SEPARATOR, + MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER //FIXME? END END diff --git a/reactos/subsys/system/explorer/explorer_intres.h b/reactos/subsys/system/explorer/explorer_intres.h index dc2d3dc7078..52630a24f5d 100644 --- a/reactos/subsys/system/explorer/explorer_intres.h +++ b/reactos/subsys/system/explorer/explorer_intres.h @@ -77,6 +77,7 @@ #define IDI_COMPUTER 149 #define IDM_DESKTOPBAR 150 #define IDM_VOLUME 151 +#define IDM_NOTIFYAREA 152 #define IDD_DESKBAR_TASKBAR 153 #define IDB_ICON_ALIGN_0 153 #define IDD_DESKBAR_STARTMENU 154 @@ -144,6 +145,9 @@ #define ID_BROWSE_UP 40013 #define ID_TRAY_VOLUME 40014 #define ID_VOLUME_PROPERTIES 40015 +#define ID_SHOW_HIDDEN_ICONS 40016 +#define ID_CONFIG_NOTIFYAREA 40017 +#define ID_CONFIG_TIME 40018 #define ID_SWITCH_DESKTOP_1 50000 #define ID_WINDOW_NEW 0xE130 #define ID_WINDOW_ARRANGE 0xE131 @@ -162,7 +166,7 @@ #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 163 -#define _APS_NEXT_COMMAND_VALUE 40016 +#define _APS_NEXT_COMMAND_VALUE 40019 #define _APS_NEXT_CONTROL_VALUE 1003 #define _APS_NEXT_SYMED_VALUE 101 #endif diff --git a/reactos/subsys/system/explorer/explorer_intres.rc b/reactos/subsys/system/explorer/explorer_intres.rc index 6cabee94679..07f108bdc8d 100644 --- a/reactos/subsys/system/explorer/explorer_intres.rc +++ b/reactos/subsys/system/explorer/explorer_intres.rc @@ -523,11 +523,138 @@ END ///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources +// French (France) resources -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FRA) #ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +LANGUAGE LANG_FRENCH, SUBLANG_FRENCH +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MAINFRAME MENU PRELOAD DISCARDABLE +BEGIN + POPUP "&Fichier" + BEGIN + MENUITEM "&Fermer", ID_FILE_EXIT + END + POPUP "&Affichage" + BEGIN + MENUITEM "Barre d'&outils", ID_VIEW_TOOL_BAR + MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR + MENUITEM "&Drivebar", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "Barre d'&閠at", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + END + POPUP "&Window" + BEGIN + MENUITEM "New &Window", ID_WINDOW_NEW + MENUITEM "Cascading\tShift+F5", ID_WINDOW_CASCADE + MENUITEM "Tile &Horizontally", ID_WINDOW_TILE_HORZ + MENUITEM "Tile &Vertically\tShift+F4", ID_WINDOW_TILE_VERT + MENUITEM "Arrange Automatically", ID_WINDOW_AUTOSORT + MENUITEM "Arrange &Symbols", ID_WINDOW_ARRANGE + MENUITEM "&Refresh\tF5", ID_REFRESH + END + POPUP "A&ide" + BEGIN + MENUITEM "&FAQ Explorateur...", ID_EXPLORER_FAQ + MENUITEM "A propos de l'&explorateur...", ID_ABOUT_WINDOWS + MENUITEM "A propos de l'&OS...", 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 "&OK",1,158,6,47,14 + PUSHBUTTON "&Cancel",2,158,23,47,14 + PUSHBUTTON "&Help",254,158,43,47,14 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "Explorateur Reactos" + IDS_START "D閙arrer" + IDS_LOGOFF "D閏onnexion ..." + IDS_SHUTDOWN "Arr阾er..." + IDS_LAUNCH "Ex閏uter..." + IDS_START_HELP "Aide" + IDS_SEARCH_FILES "Rechercher Fichiers..." + IDS_DOCUMENTS "Documents" + IDS_FAVORITES "Favoris" + IDS_PROGRAMS "Programmes" + IDS_SETTINGS "Param鑤res" + IDS_EXPLORE "Explorer" + IDS_EMPTY "(Vide)" + IDS_RECENT "Documents r閏ents" + IDS_ADMIN "Administration" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "R閟eaux" + IDS_CONNECTIONS "Connexions r閟eaux" + IDS_DRIVES "Disques" + IDS_SEARCH_COMPUTER "Recherche Ordinateurs..." + IDS_SETTINGS_MENU "Barre des t鈉hes et menu d閙arrer" + IDS_CONTROL_PANEL "Panneau de configuration" + IDS_PRINTERS "Imprimantes" + IDS_BROWSE "Parcourir" + IDS_SEARCH_PRG "Recherche Programme..." + IDS_ALL_USERS "Tous les utilisateurs\\" + IDS_SEARCH "Rechercher" + IDS_ABOUT_EXPLORER "A propos de l'explorateur..." + IDS_LAUNCH_MANY_PROGRAMS + "You have selected more than one program.\nAre you sure you want to launch all of them?" + IDS_DESKTOPBAR_SETTINGS "Bureau" + IDS_DESKTOP "Bureau" + IDS_TASKBAR "Taskbar" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "Startmenu" + IDS_MINIMIZE_ALL "mimimize all windows" + IDS_DESKTOP_NUM "Bureau %d" + IDS_VOLUME "Volume" +END + +#endif // French (France) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// English (U.K.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK #pragma code_page(1252) #endif //_WIN32 @@ -682,9 +809,10 @@ IDM_DESKTOPBAR MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER MENUITEM "&Settings...", ID_DESKTOPBAR_SETTINGS MENUITEM "&Task Manager...", ID_TASKMGR + MENUITEM SEPARATOR + MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER END END @@ -697,6 +825,18 @@ BEGIN END END +IDM_NOTIFYAREA MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Show hidden icons", ID_SHOW_HIDDEN_ICONS + MENUITEM "&Configure Notifications...", ID_CONFIG_NOTIFYAREA + MENUITEM "Adjust Date/&Time...", ID_CONFIG_TIME + MENUITEM SEPARATOR + MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER + END +END + ///////////////////////////////////////////////////////////////////////////// // @@ -877,134 +1017,7 @@ BEGIN IDS_VOLUME "Volume" END -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////// -// French (France) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FRA) -#ifdef _WIN32 -LANGUAGE LANG_FRENCH, SUBLANG_FRENCH -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDM_MAINFRAME MENU PRELOAD DISCARDABLE -BEGIN - POPUP "&Fichier" - BEGIN - MENUITEM "&Fermer", ID_FILE_EXIT - END - POPUP "&Affichage" - BEGIN - MENUITEM "Barre d'&outils", ID_VIEW_TOOL_BAR - MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR - MENUITEM "&Drivebar", ID_VIEW_DRIVE_BAR, CHECKED - MENUITEM "Barre d'&閠at", ID_VIEW_STATUSBAR - MENUITEM SEPARATOR - MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN - END - POPUP "&Window" - BEGIN - MENUITEM "New &Window", ID_WINDOW_NEW - MENUITEM "Cascading\tShift+F5", ID_WINDOW_CASCADE - MENUITEM "Tile &Horizontally", ID_WINDOW_TILE_HORZ - MENUITEM "Tile &Vertically\tShift+F4", ID_WINDOW_TILE_VERT - MENUITEM "Arrange Automatically", ID_WINDOW_AUTOSORT - MENUITEM "Arrange &Symbols", ID_WINDOW_ARRANGE - MENUITEM "&Refresh\tF5", ID_REFRESH - END - POPUP "A&ide" - BEGIN - MENUITEM "&FAQ Explorateur...", ID_EXPLORER_FAQ - MENUITEM "A propos de l'&explorateur...", ID_ABOUT_WINDOWS - MENUITEM "A propos de l'&OS...", 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 "&OK",1,158,6,47,14 - PUSHBUTTON "&Cancel",2,158,23,47,14 - PUSHBUTTON "&Help",254,158,43,47,14 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TITLE "Explorateur Reactos" - IDS_START "D閙arrer" - IDS_LOGOFF "D閏onnexion ..." - IDS_SHUTDOWN "Arr阾er..." - IDS_LAUNCH "Ex閏uter..." - IDS_START_HELP "Aide" - IDS_SEARCH_FILES "Rechercher Fichiers..." - IDS_DOCUMENTS "Documents" - IDS_FAVORITES "Favoris" - IDS_PROGRAMS "Programmes" - IDS_SETTINGS "Param鑤res" - IDS_EXPLORE "Explorer" - IDS_EMPTY "(Vide)" - IDS_RECENT "Documents r閏ents" - IDS_ADMIN "Administration" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NETWORK "R閟eaux" - IDS_CONNECTIONS "Connexions r閟eaux" - IDS_DRIVES "Disques" - IDS_SEARCH_COMPUTER "Recherche Ordinateurs..." - IDS_SETTINGS_MENU "Barre des t鈉hes et menu d閙arrer" - IDS_CONTROL_PANEL "Panneau de configuration" - IDS_PRINTERS "Imprimantes" - IDS_BROWSE "Parcourir" - IDS_SEARCH_PRG "Recherche Programme..." - IDS_ALL_USERS "Tous les utilisateurs\\" - IDS_SEARCH "Rechercher" - IDS_ABOUT_EXPLORER "A propos de l'explorateur..." - IDS_LAUNCH_MANY_PROGRAMS - "You have selected more than one program.\nAre you sure you want to launch all of them?" - IDS_DESKTOPBAR_SETTINGS "Bureau" - IDS_DESKTOP "Bureau" - IDS_TASKBAR "Taskbar" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STARTMENU "Startmenu" - IDS_MINIMIZE_ALL "mimimize all windows" - IDS_DESKTOP_NUM "Bureau %d" - IDS_VOLUME "Volume" -END - -#endif // French (France) resources +#endif // English (U.K.) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp index 8658393b09f..0a55bc2f454 100644 --- a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp @@ -229,9 +229,11 @@ LRESULT DesktopBar::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) case WM_COPYDATA: return ProcessCopyData((COPYDATASTRUCT*)lparam); - case WM_CONTEXTMENU: - PopupMenu(IDM_DESKTOPBAR).TrackPopupMenu(_hwnd, MAKEPOINTS(lparam)); - break; + case WM_CONTEXTMENU: { + PopupMenu menu(IDM_DESKTOPBAR); + SetMenuDefaultItem(menu, 0, MF_BYPOSITION); + menu.TrackPopupMenu(_hwnd, MAKEPOINTS(lparam)); + break;} case PM_GET_LAST_ACTIVE: if (_hwndTaskBar) diff --git a/reactos/subsys/system/explorer/taskbar/taskbar.cpp b/reactos/subsys/system/explorer/taskbar/taskbar.cpp index c7ce5caa480..62860d7b0af 100644 --- a/reactos/subsys/system/explorer/taskbar/taskbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/taskbar.cpp @@ -122,8 +122,10 @@ LRESULT TaskBar::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) case WM_CONTEXTMENU: { Point pt(lparam); ScreenToClient(_htoolbar, &pt); + if ((HWND)wparam==_htoolbar && SendMessage(_htoolbar, TB_HITTEST, 0, (LPARAM)&pt)>0) break; // avoid displaying context menu for application button _and_ desktop bar at the same time + goto def;} /* //#define PM_SHELLHOOK_NOTIFY (WM_APP+0x10) diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index e14e8b5b852..ab381d81c11 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -31,6 +31,8 @@ #include "../explorer.h" #include "../globals.h" +#include "../explorer_intres.h" + #include "traynotify.h" @@ -296,8 +298,17 @@ LRESULT NotifyArea::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) case PM_GET_WIDTH: return _sorted_icons.size()*NOTIFYICON_DIST + NOTIFYAREA_SPACE + _clock_width; - case WM_CONTEXTMENU: - break; // don't let WM_CONTEXTMENU go through to the desktop bar + case WM_CONTEXTMENU: { + Point pt(lparam); + ScreenToClient(_hwnd, &pt); + + if (IconHitTest(pt) == _sorted_icons.end()) { // display menu only when no icon clicked + PopupMenu menu(IDM_NOTIFYAREA); + SetMenuDefaultItem(menu, 0, MF_BYPOSITION); + CheckMenuItem(menu, ID_SHOW_HIDDEN_ICONS, MF_BYCOMMAND|(_show_hidden?MF_CHECKED:MF_UNCHECKED)); + menu.TrackPopupMenu(_hwnd, MAKEPOINTS(lparam)); + } + break;} case WM_COPYDATA: { // receive NotifyHook answers String path; @@ -305,7 +316,6 @@ LRESULT NotifyArea::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) if (_hook.ModulePathCopyData(lparam, &hwnd, path)) _window_modules[hwnd] = path; - break;} default: @@ -360,6 +370,29 @@ LRESULT NotifyArea::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) return 0; } +int NotifyArea::Command(int id, int code) +{ + switch(id) { + case ID_SHOW_HIDDEN_ICONS: + _show_hidden = !_show_hidden; + Refresh(); + break; + + case ID_CONFIG_NOTIFYAREA: + ///@todo + break; + + case ID_CONFIG_TIME: + RunDLL(_hwnd, TEXT("shell32"), "Control_RunDLL", TEXT("timedate.cpl"), SW_SHOWNORMAL); + break; + + default: + SendParent(WM_COMMAND, MAKELONG(id,code), 0); + } + + return 0; +} + int NotifyArea::Notify(int id, NMHDR* pnmh) { if (pnmh->code == TTN_GETDISPINFO) { diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.h b/reactos/subsys/system/explorer/taskbar/traynotify.h index 07a8f229460..7418cd10e53 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.h +++ b/reactos/subsys/system/explorer/taskbar/traynotify.h @@ -149,6 +149,7 @@ protected: LRESULT Init(LPCREATESTRUCT pcs); LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + int Command(int id, int code); int Notify(int id, NMHDR* pnmh); void Refresh(); From f7b3421484dc153ed9ff28fa1b0ef2c8c499b588 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sat, 20 Mar 2004 13:25:28 +0000 Subject: [PATCH 0578/1463] fix japanese resource script svn path=/trunk/; revision=8809 --- reactos/subsys/system/explorer/explorer-jp.rc | 731 +++++++++--------- 1 file changed, 376 insertions(+), 355 deletions(-) diff --git a/reactos/subsys/system/explorer/explorer-jp.rc b/reactos/subsys/system/explorer/explorer-jp.rc index 721ee7b8591..a7b8392e193 100644 --- a/reactos/subsys/system/explorer/explorer-jp.rc +++ b/reactos/subsys/system/explorer/explorer-jp.rc @@ -1,356 +1,377 @@ -///////////////////////////////////////////////////////////////////////////// -// Japanese (JA) resources -// -// =Memo for future Japanese maintainer= -// For future ease of maintenance, I marked "FIXME?" on strings I suspect I have -// mistranslated or I haven't translated(especially, "IDM_WINEFILE" have many -// suspected strings because I haven't tested under WINE). Others are set as is in -// purpose. BTW, I feel it strange that the word;"directory" turns into "folder" for -// Japanese Windows(..or English Windows also use "folder" instead of "directory"? I -// have no idea). I obeyed as the MS do. Also, there might be some menus which have -// different shortcut keys between EN-Win and JA-Win but I dunno which ones are =D -// Despite I'm not sure that we can use "MS UI Gothic" under ROS, I changed "MS Sans -// Serif" to "MS UI Gothic" because it's lear that MS Sans Serif doesn't suit for -// the Japanese(most of you know this, I suppose). -// - M.T - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JAP) -#ifdef _WIN32 -LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT -#pragma code_page(932) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDM_MAINFRAME MENU PRELOAD DISCARDABLE -BEGIN - POPUP "僼傽僀儖(&F)" - BEGIN - MENUITEM "廔椆(&X)", ID_FILE_EXIT - END - POPUP "昞\帵(&V)" - BEGIN - MENUITEM "僣乕儖僶乕(&T)", ID_VIEW_TOOL_BAR - MENUITEM "僗僥乕僞僗僶乕(&S)", ID_VIEW_STATUSBAR - END - POPUP "僂傿儞僪僂(&W)" - BEGIN - MENUITEM "怴偟偄僂傿儞僪僂(&W)", ID_WINDOW_NEW - MENUITEM "僇僗働乕僪\tShift+F5", ID_WINDOW_CASCADE - MENUITEM "悈暯偵惍楍(&H)", ID_WINDOW_TILE_HORZ - MENUITEM "悅捈偵惍楍(&V)\tShift+F4", ID_WINDOW_TILE_VERT - MENUITEM "帺摦惍楍", ID_WINDOW_AUTOSORT - MENUITEM "嵟彫壔偝傟偨巕僂傿儞僪僂傪惍楍(&S)", ID_WINDOW_ARRANGE //FIXME? - MENUITEM "嵟怴偺忣曬偵峏怴(&R)\tF5", ID_REFRESH - END - POPUP "僿儖僾(&H)" - BEGIN - MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ - MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER - MENUITEM "About &OS...", ID_ABOUT_WINDOWS - END -END - -IDM_WINEFILE MENU FIXED IMPURE -BEGIN - POPUP "僼傽僀儖(&F)" - BEGIN - MENUITEM "奐偔(&O)\tEnter", 101 - MENUITEM "堏摦(&M)...\tF7", 106 - MENUITEM "僐僺乕(&C)...\tF8", 107 - MENUITEM "僋儕僢僾儃乕僪傊(&I)...\tF9", 118 //FIXME? - MENUITEM "嶍彍(&D)\tDel", 108 - MENUITEM "柤慜偺曄峏(&N)...", 109 - MENUITEM "僾儘僷僥傿(&I)...\tAlt+Enter", ID_EDIT_PROPERTIES - MENUITEM SEPARATOR - MENUITEM "埑弅(&O)...", 119 - MENUITEM "揥奐(&O)...", 120 - MENUITEM SEPARATOR - MENUITEM "幚峴(&R)...", ID_EXECUTE - MENUITEM "報嶞(&P)...", 102 - MENUITEM "娭楢晅偗...", 103 //FIXME? - MENUITEM SEPARATOR - MENUITEM "僼僅儖僟傪嶌惉(&E)...", ID_EXECUTE //FIXME? - MENUITEM "専嶕(&H)...", 104 - MENUITEM "僼傽僀儖傪慖戰(&S)...", 116 - MENUITEM SEPARATOR - MENUITEM "廔椆(&X)\tAlt+X", ID_FILE_EXIT - END - POPUP "僨傿僗僋(&D)" - BEGIN - MENUITEM "僨傿僗僋傪僐僺乕(&C)...", 201 - MENUITEM "僨傿僗僋偵儔儀儖傪偮偗傞(&L)...", 202 - MENUITEM SEPARATOR - MENUITEM "僼僅乕儅僢僩(&F)...", 203 - MENUITEM SEPARATOR - MENUITEM "僱僢僩儚乕僋僪儔僀僽傪愙懕(&N)", 252 - MENUITEM "僱僢僩儚乕僋僪儔僀僽傪愗抐(&D)", 253 - MENUITEM SEPARATOR - MENUITEM "柤慜傪晅偗偰嫟桳...", 254 - MENUITEM "嫟桳夝彍(&R)...", 255 - MENUITEM SEPARATOR - MENUITEM "僪儔僀僽傪慖戰(&S)...", 251 - END - POPUP "僨傿儗僋僩儕(&D)" - BEGIN - MENUITEM "師偺奒憌傊(&N)\t+", 301 //FIXME? - MENUITEM "僣儕乕傪揥奐(&T)\t*", 302 - MENUITEM "慡偰揥奐(&A)\tStrg+*", 303 - MENUITEM "僣儕乕傪忯傓(&T)\t-", 304 - MENUITEM SEPARATOR - MENUITEM "巕僲乕僪傪儅乕僋(&M)", 505 //FIXME? - END - POPUP "昞\帵(&V)" - BEGIN - MENUITEM "僣儕乕偲僼僅儖僟(&R)", 413 - MENUITEM "僣儕乕偺傒(&E)", 411 - MENUITEM "僼僅儖僟偺傒(&O)", 412 - MENUITEM SEPARATOR - MENUITEM "暘妱(&L)", 414 //FIXME? - MENUITEM SEPARATOR - MENUITEM "柤慜(&N)", ID_VIEW_NAME //FIXME? - MENUITEM "僼傽僀儖偺慡徻嵶(&A)", ID_VIEW_ALL_ATTRIBUTES - , CHECKED - MENUITEM "徻嵶傪慖戰昞\帵(&P)...", ID_VIEW_SELECTED_ATTRIBUTES //FIXME? - MENUITEM SEPARATOR - MENUITEM "柤慜弴偵惍楍(&S)", 404 - MENUITEM "庬椶弴偵惍楍(&B)", 405 - MENUITEM "僒僀僘弴偵惍楍(&Z)", 406 - MENUITEM "擔晅弴偵惍楍(&D)", 407 - MENUITEM SEPARATOR - MENUITEM "徻嵶傪巜掕偟偰惍楍&...", 409 //FIXME? - END - POPUP "僆僾僔儑儞(&O)" - BEGIN - MENUITEM "妋擣(&C)...", 65535 //FIXME? - MENUITEM "僼僅儞僩(&F)...", 65535 - MENUITEM "僣乕儖僶乕傪僇僗僞儅僀僘(&B)...", 65535 - MENUITEM SEPARATOR - MENUITEM "僣乕儖僶乕(&T)", ID_VIEW_TOOL_BAR, CHECKED - MENUITEM "僪儔僀僽僶乕(&D)", ID_VIEW_DRIVE_BAR, CHECKED - MENUITEM "僗僥乕僞僗僶乕(&S)", ID_VIEW_STATUSBAR, CHECKED - MENUITEM "慡夋柺昞\帵(&U)\tCtrl+Shift+S", ID_VIEW_FULLSCREEN - MENUITEM SEPARATOR - MENUITEM "傾僾儕働乕僔儑儞婲摦屻偵僄僋僗僾儘乕儔傪嵟彫壔(&S)", 65535 //FIXME? - MENUITEM "廔椆帪偺愝掕傪曐懚(&E)", 511 //FIXME? - END - POPUP "僙僉儏儕僥傿(&S)" - BEGIN - MENUITEM "傾僋僙僗(&A)...", 605 - MENUITEM "儘僌(&L)...", 606 //FIXME? - MENUITEM "強桳幰(&O)...", 607 //FIXME? - END - POPUP "僂傿儞僪僂(&W)" - BEGIN - MENUITEM "怴偟偄僂傿儞僪僂(&W)", ID_WINDOW_NEW - MENUITEM "僇僗働乕僪\tCtrl+F5", ID_WINDOW_CASCADE - MENUITEM "悈暯偵惍楍(&H)", ID_WINDOW_TILE_HORZ - MENUITEM "悅捈偵暲楍(&V)\tCtrl+F4", ID_WINDOW_TILE_VERT - MENUITEM "帺摦惍楍", ID_WINDOW_AUTOSORT - MENUITEM "嵟彫壔偝傟偨巕僂傿儞僪僂傪惍楍(&S)", ID_WINDOW_ARRANGE - MENUITEM "嵟怴偺忣曬偵峏怴(&R)\tF5", ID_REFRESH - END - POPUP "&?" - BEGIN - MENUITEM "僿儖僾僩僺僢僋(&H)\tF1", ID_HELP - MENUITEM "僿儖僾偺専嶕(&S)...\tF1", ID_HELP - MENUITEM "僿儖僾偺巊偄曽(&U)\tF1", ID_HELP_USING //FIXME? - MENUITEM SEPARATOR - MENUITEM "&Winefile偵娭偡傞忣曬...", ID_ABOUT_WINEFILE - END -END - -IDM_DESKTOPBAR MENU DISCARDABLE -BEGIN - POPUP "" - BEGIN - MENUITEM "&Settings...", ID_DESKTOPBAR_SETTINGS //FIXME? +// =Memo for future Japanese maintainer= +// For future ease of maintenance, I marked "FIXME?" on strings I suspect I have +// mistranslated or I haven't translated(especially, "IDM_WINEFILE" have many +// suspected strings because I haven't tested under WINE). Others are set as is in +// purpose. BTW, I feel it strange that the word;"directory" turns into "folder" for +// Japanese Windows(..or English Windows also use "folder" instead of "directory"? I +// have no idea). I obeyed as the MS do. Also, there might be some menus which have +// different shortcut keys between EN-Win and JA-Win but I dunno which ones are =D +// Despite I'm not sure that we can use "MS UI Gothic" under ROS, I changed "MS Sans +// Serif" to "MS UI Gothic" because it's lear that MS Sans Serif doesn't suit for +// the Japanese(most of you know this, I suppose). +// - M.T + +//Microsoft Developer Studio generated resource script. +// +#include "explorer_intres.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include <windows.h> + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Japanese resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) +#ifdef _WIN32 +LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT +#pragma code_page(932) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MAINFRAME MENU PRELOAD DISCARDABLE +BEGIN + POPUP "僼傽僀儖(&F)" + BEGIN + MENUITEM "廔椆(&X)", ID_FILE_EXIT + END + POPUP "昞\\帵(&V)" + BEGIN + MENUITEM "僣乕儖僶乕(&T)", ID_VIEW_TOOL_BAR + MENUITEM "僗僥乕僞僗僶乕(&S)", ID_VIEW_STATUSBAR + END + POPUP "僂傿儞僪僂(&W)" + BEGIN + MENUITEM "怴偟偄僂傿儞僪僂(&W)", ID_WINDOW_NEW + MENUITEM "僇僗働乕僪\tShift+F5", ID_WINDOW_CASCADE + MENUITEM "悈暯偵惍楍(&H)", ID_WINDOW_TILE_HORZ + MENUITEM "悅捈偵惍楍(&V)\tShift+F4", ID_WINDOW_TILE_VERT + MENUITEM "帺摦惍楍", ID_WINDOW_AUTOSORT + MENUITEM "嵟彫壔偝傟偨巕僂傿儞僪僂傪惍楍(&S)", ID_WINDOW_ARRANGE + MENUITEM "嵟怴偺忣曬偵峏怴(&R)\tF5", ID_REFRESH + END + POPUP "僿儖僾(&H)" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER + MENUITEM "About &OS...", ID_ABOUT_WINDOWS + END +END + +IDM_WINEFILE MENU FIXED IMPURE +BEGIN + POPUP "僼傽僀儖(&F)" + BEGIN + MENUITEM "奐偔(&O)\tEnter", 101 + MENUITEM "堏摦(&M)...\tF7", 106 + MENUITEM "僐僺乕(&C)...\tF8", 107 + MENUITEM "僋儕僢僾儃乕僪傊(&I)...\tF9", 118 + MENUITEM "嶍彍(&D)\tDel", 108 + MENUITEM "柤慜偺曄峏(&N)...", 109 + MENUITEM "僾儘僷僥傿(&I)...\tAlt+Enter", ID_EDIT_PROPERTIES + MENUITEM SEPARATOR + MENUITEM "埑弅(&O)...", 119 + MENUITEM "揥奐(&O)...", 120 + MENUITEM SEPARATOR + MENUITEM "幚峴(&R)...", ID_EXECUTE + MENUITEM "報嶞(&P)...", 102 + MENUITEM "娭楢晅偗...", 103 + MENUITEM SEPARATOR + MENUITEM "僼僅儖僟傪嶌惉(&E)...", ID_EXECUTE + MENUITEM "専嶕(&H)...", 104 + MENUITEM "僼傽僀儖傪慖戰(&S)...", 116 + MENUITEM SEPARATOR + MENUITEM "廔椆(&X)\tAlt+X", ID_FILE_EXIT + END + POPUP "僨傿僗僋(&D)" + BEGIN + MENUITEM "僨傿僗僋傪僐僺乕(&C)...", 201 + MENUITEM "僨傿僗僋偵儔儀儖傪偮偗傞(&L)...", 202 + MENUITEM SEPARATOR + MENUITEM "僼僅乕儅僢僩(&F)...", 203 + MENUITEM SEPARATOR + MENUITEM "僱僢僩儚乕僋僪儔僀僽傪愙懕(&N)", 252 + MENUITEM "僱僢僩儚乕僋僪儔僀僽傪愗抐(&D)", 253 + MENUITEM SEPARATOR + MENUITEM "柤慜傪晅偗偰嫟桳...", 254 + MENUITEM "嫟桳夝彍(&R)...", 255 + MENUITEM SEPARATOR + MENUITEM "僪儔僀僽傪慖戰(&S)...", 251 + END + POPUP "僨傿儗僋僩儕(&D)" + BEGIN + MENUITEM "師偺奒憌傊(&N)\t+", 301 + MENUITEM "僣儕乕傪揥奐(&T)\t*", 302 + MENUITEM "慡偰揥奐(&A)\tStrg+*", 303 + MENUITEM "僣儕乕傪忯傓(&T)\t-", 304 + MENUITEM SEPARATOR + MENUITEM "巕僲乕僪傪儅乕僋(&M)", 505 + END + POPUP "昞\\帵(&V)" + BEGIN + MENUITEM "僣儕乕偲僼僅儖僟(&R)", 413 + MENUITEM "僣儕乕偺傒(&E)", 411 + MENUITEM "僼僅儖僟偺傒(&O)", 412 + MENUITEM SEPARATOR + MENUITEM "暘妱(&L)", 414 + MENUITEM SEPARATOR + MENUITEM "柤慜(&N)", ID_VIEW_NAME + MENUITEM "僼傽僀儖偺慡徻嵶(&A)", ID_VIEW_ALL_ATTRIBUTES + , CHECKED + MENUITEM "徻嵶傪慖戰昞\\帵(&P)...", ID_VIEW_SELECTED_ATTRIBUTES + MENUITEM SEPARATOR + MENUITEM "柤慜弴偵惍楍(&S)", 404 + MENUITEM "庬椶弴偵惍楍(&B)", 405 + MENUITEM "僒僀僘弴偵惍楍(&Z)", 406 + MENUITEM "擔晅弴偵惍楍(&D)", 407 + MENUITEM SEPARATOR + MENUITEM "徻嵶傪巜掕偟偰惍楍&...", 409 + END + POPUP "僆僾僔儑儞(&O)" + BEGIN + MENUITEM "妋擣(&C)...", 65535 + MENUITEM "僼僅儞僩(&F)...", 65535 + MENUITEM "僣乕儖僶乕傪僇僗僞儅僀僘(&B)...", 65535 + MENUITEM SEPARATOR + MENUITEM "僣乕儖僶乕(&T)", ID_VIEW_TOOL_BAR, CHECKED + MENUITEM "僪儔僀僽僶乕(&D)", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "僗僥乕僞僗僶乕(&S)", ID_VIEW_STATUSBAR, CHECKED + MENUITEM "慡夋柺昞\\帵(&U)\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM SEPARATOR + MENUITEM "傾僾儕働乕僔儑儞婲摦屻偵僄僋僗僾儘乕儔傪嵟彫壔(&S)", 65535 + MENUITEM "廔椆帪偺愝掕傪曐懚(&E)", 511 + END + POPUP "僙僉儏儕僥傿(&S)" + BEGIN + MENUITEM "傾僋僙僗(&A)...", 605 + MENUITEM "儘僌(&L)...", 606 + MENUITEM "強桳幰(&O)...", 607 + END + POPUP "僂傿儞僪僂(&W)" + BEGIN + MENUITEM "怴偟偄僂傿儞僪僂(&W)", ID_WINDOW_NEW + MENUITEM "僇僗働乕僪\tCtrl+F5", ID_WINDOW_CASCADE + MENUITEM "悈暯偵惍楍(&H)", ID_WINDOW_TILE_HORZ + MENUITEM "悅捈偵暲楍(&V)\tCtrl+F4", ID_WINDOW_TILE_VERT + MENUITEM "帺摦惍楍", ID_WINDOW_AUTOSORT + MENUITEM "嵟彫壔偝傟偨巕僂傿儞僪僂傪惍楍(&S)", ID_WINDOW_ARRANGE + MENUITEM "嵟怴偺忣曬偵峏怴(&R)\tF5", ID_REFRESH + END + POPUP "&?" + BEGIN + MENUITEM "僿儖僾僩僺僢僋(&H)\tF1", ID_HELP + MENUITEM "僿儖僾偺専嶕(&S)...\tF1", ID_HELP + MENUITEM "僿儖僾偺巊偄曽(&U)\tF1", ID_HELP_USING + MENUITEM SEPARATOR + MENUITEM "&Winefile偵娭偡傞忣曬...", ID_ABOUT_WINEFILE + END +END + +IDM_DESKTOPBAR MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Settings...", ID_DESKTOPBAR_SETTINGS MENUITEM "&Task Manager...", ID_TASKMGR - MENUITEM SEPARATOR, - MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER //FIXME? - 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 UI Gothic" -BEGIN - CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,162,10 //FIXME? - CONTROL "&Command:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3, //FIXME? - 18,60,10 //FIXME? - EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL - CONTROL "As &Symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3, - 45,71,12 //FIXME? - DEFPUSHBUTTON "&OK",1,158,6,47,14 - PUSHBUTTON "&Cancel",2,158,23,47,14 //FIXME? - PUSHBUTTON "&Help",254,158,43,47,14 //FIXME? -END - -IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 144, 65 -STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU | WS_THICKFRAME -EXSTYLE WS_EX_APPWINDOW -CAPTION "僗僞乕僩儊僯儏乕偐傜僾儘僌儔儉傪専嶕" //FIXME? -FONT 9, "MS UI Gothic", 0, 0, 0x1 //FIXME? -BEGIN - LTEXT "&Filter:",IDC_STATIC,7,9,18,8 //FIXME? - EDITTEXT IDC_TOPIC,34,7,103,14,ES_AUTOHSCROLL - CONTROL "List1",IDC_MAILS_FOUND,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | - WS_TABSTOP,7,25,130,33 -END - -IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 172 -STYLE WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "僨僗僋僩僢僾偺僾儘僷僥傿" //FIXME? -FONT 9, "MS UI Gothic" -BEGIN - LTEXT "Please select your prefered icon alignment algorithm:", - IDC_STATIC,7,7,166,8 //FIXME? - CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | - BS_BOTTOM | WS_TABSTOP,7,25,46,44 - CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | - BS_BOTTOM | WS_TABSTOP,57,25,46,44 - CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | - BS_BOTTOM | WS_TABSTOP,110,25,46,44 - CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | - BS_BOTTOM | WS_TABSTOP,159,25,46,44 - CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | - BS_BOTTOM | WS_TABSTOP,7,73,46,44 - CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | - BS_BOTTOM | WS_TABSTOP,57,73,46,44 - CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | - BS_BOTTOM | WS_TABSTOP,110,73,46,44 - CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | - BS_BOTTOM | WS_TABSTOP,159,73,46,44 - CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | - BS_BOTTOM | WS_TABSTOP,7,121,46,44 - CONTROL "border 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 -END - -IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 154 -STYLE WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "僞僗僋僶乕偺僾儘僷僥傿" -FONT 9, "MS UI Gothic" -BEGIN -END - -IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 154 -STYLE WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "僗僞乕僩儊僯儏乕偺僾儘僷僥傿" -FONT 9, "MS UI Gothic" -BEGIN -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_SEARCH_PROGRAM, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 137 - TOPMARGIN, 7 - BOTTOMMARGIN, 58 - END - - IDD_DESKBAR_DESKTOP, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 205 - TOPMARGIN, 7 - BOTTOMMARGIN, 165 - END - - IDD_DESKBAR_TASKBAR, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 203 - TOPMARGIN, 7 - BOTTOMMARGIN, 147 - END - - IDD_DESKBAR_STARTMENU, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 203 - TOPMARGIN, 7 - BOTTOMMARGIN, 147 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TITLE "ReactOS Explorer" - IDS_START "嚼澳" - IDS_LOGOFF "儘僌僆僼..." - IDS_SHUTDOWN "僔儍僢僩僟僂儞..." - IDS_LAUNCH "僼傽僀儖柤傪巜掕偟偰幚峴..." - IDS_START_HELP "僿儖僾" - IDS_SEARCH "専嶕" - IDS_DOCUMENTS "儅僀僪僉儏儊儞僩" - IDS_FAVORITES "偍婥偵擖傝" - IDS_PROGRAMS "僾儘僌儔儉" - IDS_SETTINGS "愝掕" - IDS_EXPLORE "僄僋僗僾儘乕儔" //FIXME? - IDS_EMPTY "(Empty)" //FIXME? - IDS_RECENT "嵟嬤巊偭偨僼傽僀儖" //FIXME? - IDS_ADMIN "娗棟僣乕儖" //FIXME? -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NETWORK "僱僢僩儚乕僋" - IDS_CONNECTIONS "僱僢僩儚乕僋愙懕" - IDS_DRIVES "儘乕僇儖僨傿僗僋" - IDS_SEARCH_COMPUTER "僐儞僺儏乕僞偺専嶕..." - IDS_SETTINGS_MENU "愝掕儊僯儏乕" //FIXME? - IDS_CONTROL_PANEL "僐儞僩儘乕儖僷僱儖" - IDS_PRINTERS "僾儕儞僞" - IDS_BROWSE "僼傽僀儖傪僽儔僂僘" - IDS_SEARCH_PRG "僾儘僌儔儉傪専嶕..." - IDS_ALL_USERS "All Users\\" //FIXME? - IDS_SEARCH_FILES "僼傽僀儖傗僼僅儖僟..." - IDS_ABOUT_EXPLORER "&About Explorer..." - IDS_LAUNCH_MANY_PROGRAMS - "擇偮埲忋偺僾儘僌儔儉偑慖戰偝傟傑偟偨丅\n幚峴偟傑偡偐?" - IDS_DESKTOPBAR_SETTINGS "僨僗僋僩僢僾偺愝掕" - IDS_DESKTOP "僨僗僋僩僢僾" - IDS_TASKBAR "僞僗僋僶乕" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STARTMENU "僗僞乕僩儊僯儏乕" - IDS_MINIMIZE_ALL "慡僂傿儞僪僂傪嵟彫壔" -END - -#endif // Japanese (JA) resources -///////////////////////////////////////////////////////////////////////////// + MENUITEM SEPARATOR + MENUITEM "&About 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 UI Gothic" +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 "&OK",1,158,6,47,14 + PUSHBUTTON "&Cancel",2,158,23,47,14 + PUSHBUTTON "&Help",254,158,43,47,14 +END + +IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 144, 65 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "僗僞乕僩儊僯儏乕偐傜僾儘僌儔儉傪専嶕" +FONT 9, "MS UI Gothic", 0, 0, 0x1 +BEGIN + LTEXT "&Filter:",IDC_STATIC,7,9,18,8 + EDITTEXT IDC_TOPIC,34,7,103,14,ES_AUTOHSCROLL + CONTROL "List1",IDC_MAILS_FOUND,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | + WS_TABSTOP,7,25,130,33 +END + +IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 172 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "僨僗僋僩僢僾偺僾儘僷僥傿" +FONT 9, "MS UI Gothic" +BEGIN + LTEXT "Please select your prefered icon alignment algorithm:", + IDC_STATIC,7,7,166,8 + CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,25,46,44 + CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,25,46,44 + CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,25,46,44 + CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,25,46,44 + CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,73,46,44 + CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,73,46,44 + CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,73,46,44 + CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,73,46,44 + CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,121,46,44 + CONTROL "border 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 +END + +IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 154 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "僞僗僋僶乕偺僾儘僷僥傿" +FONT 9, "MS UI Gothic" +BEGIN +END + +IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 154 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "僗僞乕僩儊僯儏乕偺僾儘僷僥傿" +FONT 9, "MS UI Gothic" +BEGIN +END + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "ReactOS Explorer" + IDS_START "嚼澳" + IDS_LOGOFF "儘僌僆僼..." + IDS_SHUTDOWN "僔儍僢僩僟僂儞..." + IDS_LAUNCH "僼傽僀儖柤傪巜掕偟偰幚峴..." + IDS_START_HELP "僿儖僾" + IDS_SEARCH_FILES "僼傽僀儖傗僼僅儖僟..." + IDS_DOCUMENTS "儅僀僪僉儏儊儞僩" + IDS_FAVORITES "偍婥偵擖傝" + IDS_PROGRAMS "僾儘僌儔儉" + IDS_SETTINGS "愝掕" + IDS_EXPLORE "僄僋僗僾儘乕儔" + IDS_EMPTY "(Empty)" + IDS_RECENT "嵟嬤巊偭偨僼傽僀儖" + IDS_ADMIN "娗棟僣乕儖" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "僱僢僩儚乕僋" + IDS_CONNECTIONS "僱僢僩儚乕僋愙懕" + IDS_DRIVES "儘乕僇儖僨傿僗僋" + IDS_SEARCH_COMPUTER "僐儞僺儏乕僞偺専嶕..." + IDS_SETTINGS_MENU "愝掕儊僯儏乕" + IDS_CONTROL_PANEL "僐儞僩儘乕儖僷僱儖" + IDS_PRINTERS "僾儕儞僞" + IDS_BROWSE "僼傽僀儖傪僽儔僂僘" + IDS_SEARCH_PRG "僾儘僌儔儉傪専嶕..." + IDS_ALL_USERS "All Users\\" + IDS_SEARCH "専嶕" + IDS_ABOUT_EXPLORER "&About Explorer..." + IDS_LAUNCH_MANY_PROGRAMS + "擇偮埲忋偺僾儘僌儔儉偑慖戰偝傟傑偟偨丅\n幚峴偟傑偡偐?" + IDS_DESKTOPBAR_SETTINGS "僨僗僋僩僢僾偺愝掕" + IDS_DESKTOP "僨僗僋僩僢僾" + IDS_TASKBAR "僞僗僋僶乕" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "僗僞乕僩儊僯儏乕" + IDS_MINIMIZE_ALL "慡僂傿儞僪僂傪嵟彫壔" +END + +#endif // Japanese resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// German (Germany) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) +#ifdef _WIN32 +LANGUAGE LANG_GERMAN, SUBLANG_GERMAN +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "explorer_intres.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include <windows.h>\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // German (Germany) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED From 9de0deb4cc7e0ef2809cc29336a098d01ab4ae89 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sat, 20 Mar 2004 13:31:09 +0000 Subject: [PATCH 0579/1463] adjust for windres svn path=/trunk/; revision=8810 --- reactos/subsys/system/explorer/explorer-jp.rc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/subsys/system/explorer/explorer-jp.rc b/reactos/subsys/system/explorer/explorer-jp.rc index a7b8392e193..203636628f7 100644 --- a/reactos/subsys/system/explorer/explorer-jp.rc +++ b/reactos/subsys/system/explorer/explorer-jp.rc @@ -45,7 +45,7 @@ BEGIN BEGIN MENUITEM "廔椆(&X)", ID_FILE_EXIT END - POPUP "昞\\帵(&V)" + POPUP "昞\帵(&V)" BEGIN MENUITEM "僣乕儖僶乕(&T)", ID_VIEW_TOOL_BAR MENUITEM "僗僥乕僞僗僶乕(&S)", ID_VIEW_STATUSBAR @@ -117,7 +117,7 @@ BEGIN MENUITEM SEPARATOR MENUITEM "巕僲乕僪傪儅乕僋(&M)", 505 END - POPUP "昞\\帵(&V)" + POPUP "昞\帵(&V)" BEGIN MENUITEM "僣儕乕偲僼僅儖僟(&R)", 413 MENUITEM "僣儕乕偺傒(&E)", 411 @@ -128,7 +128,7 @@ BEGIN MENUITEM "柤慜(&N)", ID_VIEW_NAME MENUITEM "僼傽僀儖偺慡徻嵶(&A)", ID_VIEW_ALL_ATTRIBUTES , CHECKED - MENUITEM "徻嵶傪慖戰昞\\帵(&P)...", ID_VIEW_SELECTED_ATTRIBUTES + MENUITEM "徻嵶傪慖戰昞\帵(&P)...", ID_VIEW_SELECTED_ATTRIBUTES MENUITEM SEPARATOR MENUITEM "柤慜弴偵惍楍(&S)", 404 MENUITEM "庬椶弴偵惍楍(&B)", 405 @@ -146,7 +146,7 @@ BEGIN MENUITEM "僣乕儖僶乕(&T)", ID_VIEW_TOOL_BAR, CHECKED MENUITEM "僪儔僀僽僶乕(&D)", ID_VIEW_DRIVE_BAR, CHECKED MENUITEM "僗僥乕僞僗僶乕(&S)", ID_VIEW_STATUSBAR, CHECKED - MENUITEM "慡夋柺昞\\帵(&U)\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "慡夋柺昞\帵(&U)\tCtrl+Shift+S", ID_VIEW_FULLSCREEN MENUITEM SEPARATOR MENUITEM "傾僾儕働乕僔儑儞婲摦屻偵僄僋僗僾儘乕儔傪嵟彫壔(&S)", 65535 MENUITEM "廔椆帪偺愝掕傪曐懚(&E)", 511 From 0f69a9471a259ebefe0b175c303ea90f0f88ca35 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sat, 20 Mar 2004 13:49:13 +0000 Subject: [PATCH 0580/1463] - Copyright notices for 2004 - launch_cpanel() utility function svn path=/trunk/; revision=8811 --- reactos/subsys/system/explorer/desktop/desktop.cpp | 2 +- reactos/subsys/system/explorer/desktop/desktop.h | 2 +- .../subsys/system/explorer/dialogs/searchprogram.cpp | 2 +- .../subsys/system/explorer/dialogs/searchprogram.h | 2 +- reactos/subsys/system/explorer/dialogs/settings.h | 2 +- reactos/subsys/system/explorer/doxy-footer.html | 2 +- reactos/subsys/system/explorer/explorer.cpp | 2 +- reactos/subsys/system/explorer/explorer.h | 2 +- reactos/subsys/system/explorer/externals.h | 2 +- reactos/subsys/system/explorer/globals.h | 2 +- reactos/subsys/system/explorer/shell/entries.cpp | 2 +- reactos/subsys/system/explorer/shell/entries.h | 2 +- reactos/subsys/system/explorer/shell/filechild.cpp | 2 +- reactos/subsys/system/explorer/shell/filechild.h | 2 +- reactos/subsys/system/explorer/shell/mainframe.cpp | 2 +- reactos/subsys/system/explorer/shell/mainframe.h | 2 +- reactos/subsys/system/explorer/shell/pane.cpp | 2 +- reactos/subsys/system/explorer/shell/pane.h | 2 +- .../subsys/system/explorer/shell/shellbrowser.cpp | 2 +- reactos/subsys/system/explorer/shell/shellbrowser.h | 2 +- reactos/subsys/system/explorer/shell/shellfs.cpp | 2 +- reactos/subsys/system/explorer/shell/shellfs.h | 2 +- reactos/subsys/system/explorer/shell/unixfs.cpp | 2 +- reactos/subsys/system/explorer/shell/winfs.cpp | 2 +- reactos/subsys/system/explorer/shell/winfs.h | 2 +- .../subsys/system/explorer/taskbar/desktopbar.cpp | 4 ++-- reactos/subsys/system/explorer/taskbar/desktopbar.h | 2 +- .../subsys/system/explorer/taskbar/quicklaunch.cpp | 2 +- reactos/subsys/system/explorer/taskbar/quicklaunch.h | 2 +- reactos/subsys/system/explorer/taskbar/startmenu.cpp | 2 +- reactos/subsys/system/explorer/taskbar/startmenu.h | 2 +- reactos/subsys/system/explorer/taskbar/taskbar.cpp | 2 +- reactos/subsys/system/explorer/taskbar/taskbar.h | 2 +- .../subsys/system/explorer/taskbar/traynotify.cpp | 12 ++++++------ reactos/subsys/system/explorer/taskbar/traynotify.h | 2 +- .../subsys/system/explorer/utility/shellclasses.cpp | 2 +- .../subsys/system/explorer/utility/shellclasses.h | 2 +- reactos/subsys/system/explorer/utility/utility.cpp | 11 ++++++++++- reactos/subsys/system/explorer/utility/utility.h | 7 +++++-- reactos/subsys/system/explorer/utility/window.cpp | 2 +- reactos/subsys/system/explorer/utility/window.h | 2 +- reactos/subsys/system/explorer/winefile/license.c | 2 +- reactos/subsys/system/explorer/winefile/resource.h | 2 +- reactos/subsys/system/explorer/winefile/winefile.c | 2 +- reactos/subsys/system/explorer/winefile/winefile.h | 2 +- 45 files changed, 64 insertions(+), 52 deletions(-) diff --git a/reactos/subsys/system/explorer/desktop/desktop.cpp b/reactos/subsys/system/explorer/desktop/desktop.cpp index ec7d6632d7c..6f472e7b384 100644 --- a/reactos/subsys/system/explorer/desktop/desktop.cpp +++ b/reactos/subsys/system/explorer/desktop/desktop.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/desktop/desktop.h b/reactos/subsys/system/explorer/desktop/desktop.h index d857836372f..25380afb55f 100644 --- a/reactos/subsys/system/explorer/desktop/desktop.h +++ b/reactos/subsys/system/explorer/desktop/desktop.h @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/dialogs/searchprogram.cpp b/reactos/subsys/system/explorer/dialogs/searchprogram.cpp index 0894caa57c0..83ae75e8bf6 100644 --- a/reactos/subsys/system/explorer/dialogs/searchprogram.cpp +++ b/reactos/subsys/system/explorer/dialogs/searchprogram.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/dialogs/searchprogram.h b/reactos/subsys/system/explorer/dialogs/searchprogram.h index 1eaa5704723..52e493f67a6 100644 --- a/reactos/subsys/system/explorer/dialogs/searchprogram.h +++ b/reactos/subsys/system/explorer/dialogs/searchprogram.h @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/dialogs/settings.h b/reactos/subsys/system/explorer/dialogs/settings.h index a95ba887b37..b3deba1daf6 100644 --- a/reactos/subsys/system/explorer/dialogs/settings.h +++ b/reactos/subsys/system/explorer/dialogs/settings.h @@ -1,5 +1,5 @@ /* - * Copyright 2004 Martin Fuchs + * Copyright 2004, 2004 Martin Fuchs * * 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/subsys/system/explorer/doxy-footer.html b/reactos/subsys/system/explorer/doxy-footer.html index 76e430b17cf..8233b142f01 100644 --- a/reactos/subsys/system/explorer/doxy-footer.html +++ b/reactos/subsys/system/explorer/doxy-footer.html @@ -3,7 +3,7 @@ <tr> <td><address style="align: right;"><small> ROS Explorer Source Code Documentation -<br>generated on 15.03.2004 by <a href="http://www.doxygen.org/index.html"> +<br>generated on 20.03.2004 by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border=0> </small></address> </td> diff --git a/reactos/subsys/system/explorer/explorer.cpp b/reactos/subsys/system/explorer/explorer.cpp index 081083c8a23..1f136e67cdc 100644 --- a/reactos/subsys/system/explorer/explorer.cpp +++ b/reactos/subsys/system/explorer/explorer.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/explorer.h b/reactos/subsys/system/explorer/explorer.h index 31c69f1acac..b46f54e05ab 100644 --- a/reactos/subsys/system/explorer/explorer.h +++ b/reactos/subsys/system/explorer/explorer.h @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/externals.h b/reactos/subsys/system/explorer/externals.h index 29c7dd29a38..eee42742ece 100644 --- a/reactos/subsys/system/explorer/externals.h +++ b/reactos/subsys/system/explorer/externals.h @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/globals.h b/reactos/subsys/system/explorer/globals.h index 8e0c80eba4f..9fa916f877a 100644 --- a/reactos/subsys/system/explorer/globals.h +++ b/reactos/subsys/system/explorer/globals.h @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/shell/entries.cpp b/reactos/subsys/system/explorer/shell/entries.cpp index add7c202914..063ebfdc3a7 100644 --- a/reactos/subsys/system/explorer/shell/entries.cpp +++ b/reactos/subsys/system/explorer/shell/entries.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/shell/entries.h b/reactos/subsys/system/explorer/shell/entries.h index b55330a3d47..b229713a267 100644 --- a/reactos/subsys/system/explorer/shell/entries.h +++ b/reactos/subsys/system/explorer/shell/entries.h @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/shell/filechild.cpp b/reactos/subsys/system/explorer/shell/filechild.cpp index ae84d494bcd..f32e21e3958 100644 --- a/reactos/subsys/system/explorer/shell/filechild.cpp +++ b/reactos/subsys/system/explorer/shell/filechild.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/shell/filechild.h b/reactos/subsys/system/explorer/shell/filechild.h index 8f038900247..2be5f5d0f08 100644 --- a/reactos/subsys/system/explorer/shell/filechild.h +++ b/reactos/subsys/system/explorer/shell/filechild.h @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/shell/mainframe.cpp b/reactos/subsys/system/explorer/shell/mainframe.cpp index a532b62c3ff..4dc4412edb3 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.cpp +++ b/reactos/subsys/system/explorer/shell/mainframe.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/shell/mainframe.h b/reactos/subsys/system/explorer/shell/mainframe.h index 48d46b2db48..11b3bd27bb5 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.h +++ b/reactos/subsys/system/explorer/shell/mainframe.h @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/shell/pane.cpp b/reactos/subsys/system/explorer/shell/pane.cpp index ddbf5d81838..5dcc4a17e36 100644 --- a/reactos/subsys/system/explorer/shell/pane.cpp +++ b/reactos/subsys/system/explorer/shell/pane.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/shell/pane.h b/reactos/subsys/system/explorer/shell/pane.h index 7f4c1565ee8..e594fdab38b 100644 --- a/reactos/subsys/system/explorer/shell/pane.h +++ b/reactos/subsys/system/explorer/shell/pane.h @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/shell/shellbrowser.cpp b/reactos/subsys/system/explorer/shell/shellbrowser.cpp index a2c67edfa9b..617a0edacf4 100644 --- a/reactos/subsys/system/explorer/shell/shellbrowser.cpp +++ b/reactos/subsys/system/explorer/shell/shellbrowser.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/shell/shellbrowser.h b/reactos/subsys/system/explorer/shell/shellbrowser.h index 7ff89de3e2f..55aaafe392a 100644 --- a/reactos/subsys/system/explorer/shell/shellbrowser.h +++ b/reactos/subsys/system/explorer/shell/shellbrowser.h @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/shell/shellfs.cpp b/reactos/subsys/system/explorer/shell/shellfs.cpp index 6d24f4ce184..b9457dcc400 100644 --- a/reactos/subsys/system/explorer/shell/shellfs.cpp +++ b/reactos/subsys/system/explorer/shell/shellfs.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/shell/shellfs.h b/reactos/subsys/system/explorer/shell/shellfs.h index 86739a2da93..9d3fd859eb0 100644 --- a/reactos/subsys/system/explorer/shell/shellfs.h +++ b/reactos/subsys/system/explorer/shell/shellfs.h @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/shell/unixfs.cpp b/reactos/subsys/system/explorer/shell/unixfs.cpp index ee3b47c1a79..3c10d1d294d 100644 --- a/reactos/subsys/system/explorer/shell/unixfs.cpp +++ b/reactos/subsys/system/explorer/shell/unixfs.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/shell/winfs.cpp b/reactos/subsys/system/explorer/shell/winfs.cpp index e30ad5e1318..53dad9b49df 100644 --- a/reactos/subsys/system/explorer/shell/winfs.cpp +++ b/reactos/subsys/system/explorer/shell/winfs.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/shell/winfs.h b/reactos/subsys/system/explorer/shell/winfs.h index 1a3b716d1c4..e5e30463753 100644 --- a/reactos/subsys/system/explorer/shell/winfs.h +++ b/reactos/subsys/system/explorer/shell/winfs.h @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/taskbar/desktopbar.cpp b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp index 0a55bc2f454..f330bb9b0b1 100644 --- a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -329,7 +329,7 @@ int DesktopBar::Command(int id, int code) break; case ID_VOLUME_PROPERTIES: - RunDLL(_hwnd, TEXT("shell32"), "Control_RunDLL", TEXT("mmsys.cpl"), SW_SHOWNORMAL); + launch_cpanel(_hwnd, TEXT("mmsys.cpl")); break; default: diff --git a/reactos/subsys/system/explorer/taskbar/desktopbar.h b/reactos/subsys/system/explorer/taskbar/desktopbar.h index 9deb6ae39f7..efcdc77b894 100644 --- a/reactos/subsys/system/explorer/taskbar/desktopbar.h +++ b/reactos/subsys/system/explorer/taskbar/desktopbar.h @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/taskbar/quicklaunch.cpp b/reactos/subsys/system/explorer/taskbar/quicklaunch.cpp index dfeb11de6a5..be7af0f4eee 100644 --- a/reactos/subsys/system/explorer/taskbar/quicklaunch.cpp +++ b/reactos/subsys/system/explorer/taskbar/quicklaunch.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/taskbar/quicklaunch.h b/reactos/subsys/system/explorer/taskbar/quicklaunch.h index d6d475811f6..3447a7affe9 100644 --- a/reactos/subsys/system/explorer/taskbar/quicklaunch.h +++ b/reactos/subsys/system/explorer/taskbar/quicklaunch.h @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/taskbar/startmenu.cpp b/reactos/subsys/system/explorer/taskbar/startmenu.cpp index 922a086e593..ff68d1c726e 100644 --- a/reactos/subsys/system/explorer/taskbar/startmenu.cpp +++ b/reactos/subsys/system/explorer/taskbar/startmenu.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/taskbar/startmenu.h b/reactos/subsys/system/explorer/taskbar/startmenu.h index b8a563cd4dc..8cd968709b5 100644 --- a/reactos/subsys/system/explorer/taskbar/startmenu.h +++ b/reactos/subsys/system/explorer/taskbar/startmenu.h @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/taskbar/taskbar.cpp b/reactos/subsys/system/explorer/taskbar/taskbar.cpp index 62860d7b0af..f02bb855148 100644 --- a/reactos/subsys/system/explorer/taskbar/taskbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/taskbar.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/taskbar/taskbar.h b/reactos/subsys/system/explorer/taskbar/taskbar.h index 9b8a7cd4c1a..6337ec3cbe5 100644 --- a/reactos/subsys/system/explorer/taskbar/taskbar.h +++ b/reactos/subsys/system/explorer/taskbar/taskbar.h @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index ab381d81c11..df8f0808a9c 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -35,6 +35,8 @@ #include "traynotify.h" +#include "../dialogs/settings.h" + #include "../notifyhook/notifyhook.h" @@ -379,11 +381,11 @@ int NotifyArea::Command(int id, int code) break; case ID_CONFIG_NOTIFYAREA: - ///@todo + ExplorerPropertySheet(_hwnd); break; case ID_CONFIG_TIME: - RunDLL(_hwnd, TEXT("shell32"), "Control_RunDLL", TEXT("timedate.cpl"), SW_SHOWNORMAL); + launch_cpanel(_hwnd, TEXT("timedate.cpl")); break; default: @@ -704,9 +706,7 @@ LRESULT ClockWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) break; case WM_LBUTTONDBLCLK: - //launch_file(_hwnd, TEXT("timedate.cpl"), SW_SHOWNORMAL); // This would be enough, but we want the fastest solution. - //launch_file(_hwnd, TEXT("rundll32.exe /d shell32.dll,Control_RunDLL timedate.cpl"), SW_SHOWNORMAL); - RunDLL(_hwnd, TEXT("shell32"), "Control_RunDLL", TEXT("timedate.cpl"), SW_SHOWNORMAL); + launch_cpanel(_hwnd, TEXT("timedate.cpl")); break; default: diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.h b/reactos/subsys/system/explorer/taskbar/traynotify.h index 7418cd10e53..603fef1e645 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.h +++ b/reactos/subsys/system/explorer/taskbar/traynotify.h @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/utility/shellclasses.cpp b/reactos/subsys/system/explorer/utility/shellclasses.cpp index f48565e993d..3c806042685 100644 --- a/reactos/subsys/system/explorer/utility/shellclasses.cpp +++ b/reactos/subsys/system/explorer/utility/shellclasses.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/utility/shellclasses.h b/reactos/subsys/system/explorer/utility/shellclasses.h index e31d7d14c5f..4a92013c17e 100644 --- a/reactos/subsys/system/explorer/utility/shellclasses.h +++ b/reactos/subsys/system/explorer/utility/shellclasses.h @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/utility/utility.cpp b/reactos/subsys/system/explorer/utility/utility.cpp index 80f443f9f9c..f10b92f5ec0 100644 --- a/reactos/subsys/system/explorer/utility/utility.cpp +++ b/reactos/subsys/system/explorer/utility/utility.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -265,6 +265,15 @@ BOOL RunDLL(HWND hwnd, LPCTSTR dllname, LPCSTR procname, LPCTSTR cmdline, UINT n } +BOOL launch_cpanel(HWND hwnd, LPCTSTR applet) +{ + //launch_file(_hwnd, applet, SW_SHOWNORMAL); // This would be enough, but we want the fastest solution. + //launch_file(_hwnd, TEXT("rundll32.exe /d shell32.dll,Control_RunDLL ")+applet, SW_SHOWNORMAL); + + return RunDLL(hwnd, TEXT("shell32"), "Control_RunDLL", applet, SW_SHOWNORMAL); +} + + BOOL RecursiveCreateDirectory(LPCTSTR path_in) { TCHAR path[MAX_PATH], hole_path[MAX_PATH]; diff --git a/reactos/subsys/system/explorer/utility/utility.h b/reactos/subsys/system/explorer/utility/utility.h index 3688495ba42..36d11da1a39 100644 --- a/reactos/subsys/system/explorer/utility/utility.h +++ b/reactos/subsys/system/explorer/utility/utility.h @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -195,7 +195,10 @@ extern BOOL launch_fileA(HWND hwnd, LPSTR cmd, UINT nCmdShow, LPCSTR parameters= #endif // call an DLL export like rundll32 -BOOL RunDLL(HWND hwnd, LPCTSTR dllname, LPCSTR procname, LPCTSTR cmdline, UINT nCmdShow); +extern BOOL RunDLL(HWND hwnd, LPCTSTR dllname, LPCSTR procname, LPCTSTR cmdline, UINT nCmdShow); + + // launch control panel applet +extern BOOL launch_cpanel(HWND hwnd, LPCTSTR applet); /// initialization of windows common controls diff --git a/reactos/subsys/system/explorer/utility/window.cpp b/reactos/subsys/system/explorer/utility/window.cpp index 55a5f28d350..72f866f0fc0 100644 --- a/reactos/subsys/system/explorer/utility/window.cpp +++ b/reactos/subsys/system/explorer/utility/window.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/utility/window.h b/reactos/subsys/system/explorer/utility/window.h index 701d31ec766..7c284e22f0e 100644 --- a/reactos/subsys/system/explorer/utility/window.h +++ b/reactos/subsys/system/explorer/utility/window.h @@ -1,5 +1,5 @@ /* - * Copyright 2003 Martin Fuchs + * Copyright 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/winefile/license.c b/reactos/subsys/system/explorer/winefile/license.c index 8e666970819..3d11572998c 100644 --- a/reactos/subsys/system/explorer/winefile/license.c +++ b/reactos/subsys/system/explorer/winefile/license.c @@ -1,5 +1,5 @@ /* - * Copyright 2000 Martin Fuchs + * Copyright 2000, 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/winefile/resource.h b/reactos/subsys/system/explorer/winefile/resource.h index f8e26f8911a..712b1cd1338 100644 --- a/reactos/subsys/system/explorer/winefile/resource.h +++ b/reactos/subsys/system/explorer/winefile/resource.h @@ -1,5 +1,5 @@ /* - * Copyright 2000 Martin Fuchs + * Copyright 2000, 2003 Martin Fuchs * * 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/subsys/system/explorer/winefile/winefile.c b/reactos/subsys/system/explorer/winefile/winefile.c index e7839e625d1..dce4fb4c708 100644 --- a/reactos/subsys/system/explorer/winefile/winefile.c +++ b/reactos/subsys/system/explorer/winefile/winefile.c @@ -1,7 +1,7 @@ /* * Winefile * - * Copyright 2000 Martin Fuchs + * Copyright 2000, 2003, 2004 Martin Fuchs * * 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/subsys/system/explorer/winefile/winefile.h b/reactos/subsys/system/explorer/winefile/winefile.h index 0fa34f88ccb..e84d036b04b 100644 --- a/reactos/subsys/system/explorer/winefile/winefile.h +++ b/reactos/subsys/system/explorer/winefile/winefile.h @@ -1,5 +1,5 @@ /* - * Copyright 2000 Martin Fuchs + * Copyright 2000, 2003 Martin Fuchs * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public From baaf29305f36bcd22c0eed0503628a1bf8ec36d3 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Sat, 20 Mar 2004 15:56:00 +0000 Subject: [PATCH 0581/1463] Fully implement RtlFormatCurrentUserKeyPath(). svn path=/trunk/; revision=8813 --- reactos/lib/ntdll/rtl/registry.c | 130 ++++++++++++++++++++++++------- reactos/ntoskrnl/cm/rtlfunc.c | 96 ++++++++++++++++++++--- 2 files changed, 191 insertions(+), 35 deletions(-) diff --git a/reactos/lib/ntdll/rtl/registry.c b/reactos/lib/ntdll/rtl/registry.c index a2c6b4ebc36..a3bc3219f44 100644 --- a/reactos/lib/ntdll/rtl/registry.c +++ b/reactos/lib/ntdll/rtl/registry.c @@ -1,4 +1,4 @@ -/* $Id: registry.c,v 1.27 2003/11/17 02:12:50 hyperion Exp $ +/* $Id: registry.c,v 1.28 2004/03/20 15:56:00 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -13,15 +13,12 @@ * TODO: * - finish RtlQueryRegistryValues() * - support RTL_QUERY_REGISTRY_DELETE - * - * - finish RtlFormatCurrentUserKeyPath() */ /* INCLUDES ****************************************************************/ #include <ddk/ntddk.h> #include <ntdll/rtl.h> -#include <rosrtl/string.h> #include <ntos/minmax.h> #define NDEBUG @@ -36,6 +33,7 @@ RtlpGetRegistryHandle(ULONG RelativeTo, BOOLEAN Create, PHANDLE KeyHandle) { + UNICODE_STRING KeyPath; UNICODE_STRING KeyName; WCHAR KeyBuffer[MAX_PATH]; OBJECT_ATTRIBUTES ObjectAttributes; @@ -94,9 +92,14 @@ RtlpGetRegistryHandle(ULONG RelativeTo, break; case RTL_REGISTRY_USER: - Status = RtlFormatCurrentUserKeyPath(&KeyName); + Status = RtlFormatCurrentUserKeyPath (&KeyPath); if (!NT_SUCCESS(Status)) return(Status); + RtlAppendUnicodeStringToString (&KeyName, + &KeyPath); + RtlFreeUnicodeString (&KeyPath); + RtlAppendUnicodeToString (&KeyName, + L"\\"); break; /* ReactOS specific */ @@ -222,17 +225,88 @@ RtlDeleteRegistryValue(IN ULONG RelativeTo, /* - * @unimplemented + * @implemented */ NTSTATUS STDCALL -RtlFormatCurrentUserKeyPath(PUNICODE_STRING KeyPath) +RtlFormatCurrentUserKeyPath (OUT PUNICODE_STRING KeyPath) { - /* FIXME: !!! */ -#if 0 - RtlCreateUnicodeString(KeyPath, - L"\\Registry\\User\\.Default"); -#endif - return(STATUS_SUCCESS); + HANDLE TokenHandle; + UCHAR Buffer[256]; + PSID_AND_ATTRIBUTES SidBuffer; + ULONG Length; + UNICODE_STRING SidString; + NTSTATUS Status; + + DPRINT ("RtlFormatCurrentUserKeyPath() called\n"); + + Status = NtOpenThreadToken (NtCurrentThread (), + TOKEN_READ, + TRUE, + &TokenHandle); + if (!NT_SUCCESS (Status)) + { + if (Status != STATUS_NO_TOKEN) + { + DPRINT1 ("NtOpenThreadToken() failed (Status %lx)\n", Status); + return Status; + } + + Status = NtOpenProcessToken (NtCurrentProcess (), + TOKEN_READ, + &TokenHandle); + if (!NT_SUCCESS (Status)) + { + DPRINT1 ("NtOpenProcessToken() failed (Status %lx)\n", Status); + return Status; + } + } + + SidBuffer = (PSID_AND_ATTRIBUTES)Buffer; + Status = NtQueryInformationToken (TokenHandle, + TokenUser, + (PVOID)SidBuffer, + 256, + &Length); + NtClose (TokenHandle); + if (!NT_SUCCESS(Status)) + { + DPRINT1 ("NtQueryInformationToken() failed (Status %lx)\n", Status); + return Status; + } + + Status = RtlConvertSidToUnicodeString (&SidString, + SidBuffer[0].Sid, + TRUE); + if (!NT_SUCCESS(Status)) + { + DPRINT1 ("RtlConvertSidToUnicodeString() failed (Status %lx)\n", Status); + return Status; + } + + DPRINT ("SidString: '%wZ'\n", &SidString); + + Length = SidString.Length + sizeof(L"\\Registry\\User\\"); + DPRINT ("Length: %lu\n", Length); + + KeyPath->Length = 0; + KeyPath->MaximumLength = Length; + KeyPath->Buffer = RtlAllocateHeap (RtlGetProcessHeap (), + 0, + KeyPath->MaximumLength); + if (KeyPath->Buffer == NULL) + { + DPRINT1 ("RtlAllocateHeap() failed\n"); + RtlFreeUnicodeString (&SidString); + return STATUS_NO_TOKEN; + } + + RtlAppendUnicodeToString (KeyPath, + L"\\Registry\\User\\"); + RtlAppendUnicodeStringToString (KeyPath, + &SidString); + RtlFreeUnicodeString (&SidString); + + return STATUS_SUCCESS; } @@ -244,8 +318,8 @@ RtlOpenCurrentUser(IN ACCESS_MASK DesiredAccess, OUT PHANDLE KeyHandle) { OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING KeyPath; NTSTATUS Status; - UNICODE_STRING KeyPath = ROS_STRING_INITIALIZER(L"\\Registry\\User\\.Default"); Status = RtlFormatCurrentUserKeyPath(&KeyPath); if (NT_SUCCESS(Status)) @@ -258,11 +332,15 @@ RtlOpenCurrentUser(IN ACCESS_MASK DesiredAccess, Status = NtOpenKey(KeyHandle, DesiredAccess, &ObjectAttributes); - if (NT_SUCCESS(Status)) { - RtlFreeUnicodeString(&KeyPath); - return(STATUS_SUCCESS); - } + RtlFreeUnicodeString(&KeyPath); + if (NT_SUCCESS(Status)) + { + return STATUS_SUCCESS; + } } + + RtlInitUnicodeString (&KeyPath, + L"\\Registry\\User\\.Default"); InitializeObjectAttributes(&ObjectAttributes, &KeyPath, OBJ_CASE_INSENSITIVE, @@ -271,8 +349,8 @@ RtlOpenCurrentUser(IN ACCESS_MASK DesiredAccess, Status = NtOpenKey(KeyHandle, DesiredAccess, &ObjectAttributes); - RtlFreeUnicodeString(&KeyPath); - return(Status); + + return Status; } @@ -656,7 +734,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo, FullValueInfo = RtlAllocateHeap(RtlGetProcessHeap(), 0, BufferSize); - if (FullValueInfo == NULL) + if (FullValueInfo == NULL) { Status = STATUS_NO_MEMORY; break; @@ -670,7 +748,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo, Status = STATUS_NO_MEMORY; break; } - Index = 0; + Index = 0; while (TRUE) { Status = NtEnumerateValueKey(CurrentKeyHandle, @@ -701,9 +779,9 @@ RtlQueryRegistryValues(IN ULONG RelativeTo, 0, ValueName); ValueNameSize = FullValueInfo->NameLength + sizeof(WCHAR); - ValueName = RtlAllocateHeap(RtlGetProcessHeap(), - 0, - ValueNameSize); + ValueName = RtlAllocateHeap(RtlGetProcessHeap(), + 0, + ValueNameSize); if (ValueName == NULL) { Status = STATUS_NO_MEMORY; @@ -712,7 +790,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo, } memcpy(ValueName, - FullValueInfo->Name, + FullValueInfo->Name, FullValueInfo->NameLength); ValueName[FullValueInfo->NameLength / sizeof(WCHAR)] = 0; diff --git a/reactos/ntoskrnl/cm/rtlfunc.c b/reactos/ntoskrnl/cm/rtlfunc.c index ae19f6fd4ee..c6bd9696221 100644 --- a/reactos/ntoskrnl/cm/rtlfunc.c +++ b/reactos/ntoskrnl/cm/rtlfunc.c @@ -29,6 +29,7 @@ RtlpGetRegistryHandle(ULONG RelativeTo, BOOLEAN Create, PHANDLE KeyHandle) { + UNICODE_STRING KeyPath; UNICODE_STRING KeyName; WCHAR KeyBuffer[MAX_PATH]; OBJECT_ATTRIBUTES ObjectAttributes; @@ -80,10 +81,14 @@ RtlpGetRegistryHandle(ULONG RelativeTo, break; case RTL_REGISTRY_USER: - Status = RtlFormatCurrentUserKeyPath(&KeyName); + Status = RtlFormatCurrentUserKeyPath (&KeyPath); if (!NT_SUCCESS(Status)) return(Status); - RtlAppendUnicodeToString(&KeyName, L"\\"); + RtlAppendUnicodeStringToString (&KeyName, + &KeyPath); + RtlFreeUnicodeString (&KeyPath); + RtlAppendUnicodeToString (&KeyName, + L"\\"); break; /* ReactOS specific */ @@ -207,16 +212,87 @@ RtlDeleteRegistryValue(IN ULONG RelativeTo, /* - * @unimplemented + * @implemented */ NTSTATUS STDCALL -RtlFormatCurrentUserKeyPath(IN OUT PUNICODE_STRING KeyPath) +RtlFormatCurrentUserKeyPath (OUT PUNICODE_STRING KeyPath) { - /* FIXME: !!! */ - KeyPath->Length = 0; - RtlAppendUnicodeToString(KeyPath, L"\\Registry\\User\\.Default"); + HANDLE TokenHandle; + UCHAR Buffer[256]; + PSID_AND_ATTRIBUTES SidBuffer; + ULONG Length; + UNICODE_STRING SidString; + NTSTATUS Status; - return(STATUS_SUCCESS); + DPRINT ("RtlFormatCurrentUserKeyPath() called\n"); + + Status = NtOpenThreadToken (NtCurrentThread (), + TOKEN_READ, + TRUE, + &TokenHandle); + if (!NT_SUCCESS (Status)) + { + if (Status != STATUS_NO_TOKEN) + { + DPRINT1 ("NtOpenThreadToken() failed (Status %lx)\n", Status); + return Status; + } + + Status = NtOpenProcessToken (NtCurrentProcess (), + TOKEN_READ, + &TokenHandle); + if (!NT_SUCCESS (Status)) + { + DPRINT1 ("NtOpenProcessToken() failed (Status %lx)\n", Status); + return Status; + } + } + + SidBuffer = (PSID_AND_ATTRIBUTES)Buffer; + Status = NtQueryInformationToken (TokenHandle, + TokenUser, + (PVOID)SidBuffer, + 256, + &Length); + NtClose (TokenHandle); + if (!NT_SUCCESS(Status)) + { + DPRINT1 ("NtQueryInformationToken() failed (Status %lx)\n", Status); + return Status; + } + + Status = RtlConvertSidToUnicodeString (&SidString, + SidBuffer[0].Sid, + TRUE); + if (!NT_SUCCESS(Status)) + { + DPRINT1 ("RtlConvertSidToUnicodeString() failed (Status %lx)\n", Status); + return Status; + } + + DPRINT ("SidString: '%wZ'\n", &SidString); + + Length = SidString.Length + sizeof(L"\\Registry\\User\\"); + DPRINT ("Length: %lu\n", Length); + + KeyPath->Length = 0; + KeyPath->MaximumLength = Length; + KeyPath->Buffer = ExAllocatePool (NonPagedPool, + KeyPath->MaximumLength); + if (KeyPath->Buffer == NULL) + { + DPRINT1 ("RtlAllocateHeap() failed\n"); + RtlFreeUnicodeString (&SidString); + return STATUS_NO_TOKEN; + } + + RtlAppendUnicodeToString (KeyPath, + L"\\Registry\\User\\"); + RtlAppendUnicodeStringToString (KeyPath, + &SidString); + RtlFreeUnicodeString (&SidString); + + return STATUS_SUCCESS; } @@ -225,7 +301,7 @@ RtlOpenCurrentUser(IN ACCESS_MASK DesiredAccess, OUT PHANDLE KeyHandle) { OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING KeyPath = ROS_STRING_INITIALIZER(L"\\Registry\\User\\.Default"); + UNICODE_STRING KeyPath; NTSTATUS Status; Status = RtlFormatCurrentUserKeyPath(&KeyPath); @@ -244,6 +320,8 @@ RtlOpenCurrentUser(IN ACCESS_MASK DesiredAccess, return(STATUS_SUCCESS); } + RtlInitUnicodeString (&KeyPath, + L"\\Registry\\User\\.Default"); InitializeObjectAttributes(&ObjectAttributes, &KeyPath, OBJ_CASE_INSENSITIVE, From 8b50600e9528c6cdabe2c549f200ecc31991f86e Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Sat, 20 Mar 2004 15:58:16 +0000 Subject: [PATCH 0582/1463] Load user profile and create user environment upon user logon. svn path=/trunk/; revision=8814 --- reactos/subsys/system/winlogon/makefile | 6 +- reactos/subsys/system/winlogon/winlogon.c | 71 ++++++++++++++++++----- 2 files changed, 59 insertions(+), 18 deletions(-) diff --git a/reactos/subsys/system/winlogon/makefile b/reactos/subsys/system/winlogon/makefile index 4132546008c..23cde0a4994 100644 --- a/reactos/subsys/system/winlogon/makefile +++ b/reactos/subsys/system/winlogon/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.8 2003/12/01 18:21:04 weiden Exp $ +# $Id: makefile,v 1.9 2004/03/20 15:58:16 ekohl Exp $ PATH_TO_TOP = ../../.. @@ -10,9 +10,9 @@ TARGET_NAME = winlogon TARGET_INSTALLDIR = system32 -TARGET_SDKLIBS = ntdll.a kernel32.a user32.a secur32.a +TARGET_SDKLIBS = ntdll.a kernel32.a user32.a advapi32.a userenv.a secur32.a -TARGET_OBJECTS = $(TARGET_NAME).o setup.o wlx.o +TARGET_OBJECTS = setup.o winlogon.o wlx.o TARGET_CFLAGS = -Wall -Werror -DUNICODE -I./ -I../../../include diff --git a/reactos/subsys/system/winlogon/winlogon.c b/reactos/subsys/system/winlogon/winlogon.c index 4eaab42a5b0..338f25bab75 100644 --- a/reactos/subsys/system/winlogon/winlogon.c +++ b/reactos/subsys/system/winlogon/winlogon.c @@ -1,4 +1,4 @@ -/* $Id: winlogon.c,v 1.27 2004/03/09 15:08:12 ekohl Exp $ +/* $Id: winlogon.c,v 1.28 2004/03/20 15:58:16 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -11,11 +11,13 @@ /* INCLUDES *****************************************************************/ +#define NTOS_MODE_USER #include <ntos.h> #include <windows.h> #include <stdio.h> #include <ntsecapi.h> #include <wchar.h> +#include <userenv.h> #include "setup.h" #include "winlogon.h" @@ -285,7 +287,7 @@ static BOOL RestartShell(void) */ #if SUPPORT_CONSOLESTART -static BOOL StartIntoGUI(void) +static BOOL StartIntoGUI(VOID) { HANDLE WinLogonKey; DWORD Type, Size, Value; @@ -365,7 +367,9 @@ DoLogonUser (PWCHAR Name, WCHAR CommandLine[MAX_PATH]; WCHAR CurrentDirectory[MAX_PATH]; HANDLE hToken; + PROFILEINFOW ProfileInfo; BOOL Result; + LPVOID lpEnvironment = NULL; Result = LogonUserW (Name, NULL, @@ -375,11 +379,39 @@ DoLogonUser (PWCHAR Name, &hToken); if (!Result) { - DbgPrint ("WL: LogonUserW failed\n"); + DbgPrint ("WL: LogonUserW() failed\n"); + RtlDestroyEnvironment (lpEnvironment); return FALSE; } - GetWindowsDirectoryW(CurrentDirectory, MAX_PATH); + /* Load the user profile */ + ProfileInfo.dwSize = sizeof(PROFILEINFOW); + ProfileInfo.dwFlags = 0; + ProfileInfo.lpUserName = Name; + ProfileInfo.lpProfilePath = NULL; + ProfileInfo.lpDefaultPath = NULL; + ProfileInfo.lpServerName = NULL; + ProfileInfo.lpPolicyPath = NULL; + ProfileInfo.hProfile = NULL; + + if (!LoadUserProfileW (hToken, + &ProfileInfo)) + { + DbgPrint ("WL: LoadUserProfileW() failed\n"); + CloseHandle (hToken); + RtlDestroyEnvironment (lpEnvironment); + return FALSE; + } + + if (!CreateEnvironmentBlock (&lpEnvironment, + hToken, + TRUE)) + { + DbgPrint ("WL: CreateEnvironmentBlock() failed\n"); + return FALSE; + } + + GetWindowsDirectoryW (CurrentDirectory, MAX_PATH); StartupInfo.cb = sizeof(StartupInfo); StartupInfo.lpReserved = NULL; @@ -395,24 +427,33 @@ DoLogonUser (PWCHAR Name, NULL, NULL, FALSE, - CREATE_NEW_CONSOLE, - NULL, + CREATE_NEW_CONSOLE,// | CREATE_UNICODE_ENVIRONMENT, + lpEnvironment, // NULL, CurrentDirectory, &StartupInfo, &ProcessInformation); - if (!Result) - { - DbgPrint ("WL: Failed to execute user shell %s\n", CommandLine); - CloseHandle (hToken); - return FALSE; - } + if (!Result) + { + DbgPrint ("WL: Failed to execute user shell %s\n", CommandLine); + UnloadUserProfile (hToken, + ProfileInfo.hProfile); + CloseHandle (hToken); + DestroyEnvironmentBlock (lpEnvironment); + return FALSE; + } - WaitForSingleObject (ProcessInformation.hProcess, INFINITE); - CloseHandle (ProcessInformation.hProcess); - CloseHandle (ProcessInformation.hThread); + WaitForSingleObject (ProcessInformation.hProcess, INFINITE); + CloseHandle (ProcessInformation.hProcess); + CloseHandle (ProcessInformation.hThread); + + /* Unload user profile */ + UnloadUserProfile (hToken, + ProfileInfo.hProfile); CloseHandle (hToken); + RtlDestroyEnvironment (lpEnvironment); + return TRUE; } #endif From bea41fd8f83698092d31e43f870d3201bc3be58c Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Sat, 20 Mar 2004 15:59:19 +0000 Subject: [PATCH 0583/1463] Run second stage setup at first boot after install. svn path=/trunk/; revision=8815 --- reactos/bootdata/hivesys.inf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/bootdata/hivesys.inf b/reactos/bootdata/hivesys.inf index 083838046c6..e07cc797caa 100644 --- a/reactos/bootdata/hivesys.inf +++ b/reactos/bootdata/hivesys.inf @@ -602,7 +602,7 @@ HKLM,"SYSTEM\Select","LastKnownGood",0x00010001,0x00000000 ; System setup settings HKLM,"SYSTEM\Setup","CmdLine",0x00000000,"setup -newsetup" HKLM,"SYSTEM\Setup","OsLoaderPath",0x00000000,"\" -HKLM,"SYSTEM\Setup","SetupType",0x00010001,0x00000000 +HKLM,"SYSTEM\Setup","SetupType",0x00010001,0x00000001 HKLM,"SYSTEM\Setup","SystemPartition",0x00000000,"\Device\Harddisk0\Partition1" HKLM,"SYSTEM\Setup","SystemSetupInProgress",0x00010001,0x00000000 From 9d3fa4fe4b0c739f7352a705fa86a1e57d98cb46 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 20 Mar 2004 17:33:10 +0000 Subject: [PATCH 0584/1463] - Unlock surface in error case of EngModifySurface. svn path=/trunk/; revision=8816 --- reactos/subsys/win32k/eng/surface.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/eng/surface.c b/reactos/subsys/win32k/eng/surface.c index 9d26608510a..820ea1f4673 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.34 2004/03/17 16:05:29 navaraf Exp $ +/* $Id: surface.c,v 1.35 2004/03/20 17:33:10 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -506,6 +506,8 @@ EngModifySurface( if (!EngAssociateSurface(hsurf, hdev, flHooks)) { + EngUnlockSurface(pso); + return FALSE; } From 72bf171b1bd08795f284f9891a9ab45f2b3d1d98 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 20 Mar 2004 17:34:25 +0000 Subject: [PATCH 0585/1463] - Minor correction to IopGetSystemPowerDeviceObject. svn path=/trunk/; revision=8817 --- reactos/ntoskrnl/io/pnpmgr.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/reactos/ntoskrnl/io/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr.c index 37db669385d..cad12813c67 100644 --- a/reactos/ntoskrnl/io/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr.c @@ -1,4 +1,4 @@ -/* $Id: pnpmgr.c,v 1.25 2004/03/18 16:43:56 navaraf Exp $ +/* $Id: pnpmgr.c,v 1.26 2004/03/20 17:34:25 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -240,13 +240,16 @@ IopGetSystemPowerDeviceObject(PDEVICE_OBJECT *DeviceObject) { KIRQL OldIrql; - assert(PopSystemPowerDeviceNode); + if (PopSystemPowerDeviceNode) + { + KeAcquireSpinLock(&IopDeviceTreeLock, &OldIrql); + *DeviceObject = PopSystemPowerDeviceNode->Pdo; + KeReleaseSpinLock(&IopDeviceTreeLock, OldIrql); - KeAcquireSpinLock(&IopDeviceTreeLock, &OldIrql); - *DeviceObject = PopSystemPowerDeviceNode->Pdo; - KeReleaseSpinLock(&IopDeviceTreeLock, OldIrql); + return STATUS_SUCCESS; + } - return STATUS_SUCCESS; + return STATUS_UNSUCCESSFUL; } /********************************************************************** From 767572551182d23f2424f9f90960337286d7b83b Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Sat, 20 Mar 2004 17:41:24 +0000 Subject: [PATCH 0586/1463] Make install works. This closes out bug 221 svn path=/trunk/; revision=8818 --- rosapps/install.bat | 49 ----------------------------------------- rosapps/installapps.bat | 49 ----------------------------------------- 2 files changed, 98 deletions(-) delete mode 100644 rosapps/install.bat delete mode 100644 rosapps/installapps.bat diff --git a/rosapps/install.bat b/rosapps/install.bat deleted file mode 100644 index f4a858f16ac..00000000000 --- a/rosapps/install.bat +++ /dev/null @@ -1,49 +0,0 @@ -@echo off -if "%1" == "" goto NoParameter -set ROS_INSTALL=%1 -goto Install -:NoParameter -set ROS_INSTALL=c:\reactos -:Install -echo Installing ReactOS user programs to %ROS_INSTALL%\bin -@echo off - -copy ..\rosapps\cmd\cmd.exe %ROS_INSTALL%\bin -copy ..\rosapps\calc\calc.exe %ROS_INSTALL%\bin -copy ..\rosapps\cmdutils\tee.exe %ROS_INSTALL%\bin -copy ..\rosapps\cmdutils\more.exe %ROS_INSTALL%\bin -copy ..\rosapps\cmdutils\y.exe %ROS_INSTALL%\bin -copy ..\rosapps\cmdutils\mode\mode.exe %ROS_INSTALL%\bin -copy ..\rosapps\cmdutils\touch\touch.exe %ROS_INSTALL%\bin -copy ..\rosapps\control\control.exe %ROS_INSTALL%\bin -copy ..\rosapps\ctlpanel\roscfg\roscfg.cpl %ROS_INSTALL%\system32 -copy ..\rosapps\ctlpanel\rospower\rospower.cpl %ROS_INSTALL%\system32 -copy ..\rosapps\dflat32\edit.exe %ROS_INSTALL%\bin -copy ..\rosapps\hcalc\hcalc.exe %ROS_INSTALL%\bin -copy ..\rosapps\mc\release\mc.exe %ROS_INSTALL%\bin -copy ..\rosapps\net\arp\arp.exe %ROS_INSTALL%\bin -copy ..\rosapps\net\echo\echo.exe %ROS_INSTALL%\bin -copy ..\rosapps\net\finger\finger.exe %ROS_INSTALL%\bin -copy ..\rosapps\net\ipconfig\ipconfig.exe %ROS_INSTALL%\bin -copy ..\rosapps\net\ipecho\ipecho.exe %ROS_INSTALL%\bin -copy ..\rosapps\net\ncftp\ncftp.exe %ROS_INSTALL%\bin -copy ..\rosapps\net\netstat\netstat.exe %ROS_INSTALL%\bin -copy ..\rosapps\net\niclist\niclist.exe %ROS_INSTALL%\bin -copy ..\rosapps\net\ping\ping.exe %ROS_INSTALL%\bin -copy ..\rosapps\net\route\route.exe %ROS_INSTALL%\bin -copy ..\rosapps\net\telnet\telnet.exe %ROS_INSTALL%\bin -copy ..\rosapps\net\telnet\telnet.cfg %ROS_INSTALL%\bin -copy ..\rosapps\net\telnet\telnet.ini %ROS_INSTALL%\bin -copy ..\rosapps\net\whois\whois.exe %ROS_INSTALL%\bin -copy ..\rosapps\notevil\notevil.exe %ROS_INSTALL%\bin -copy ..\rosapps\sysutils\chkdsk.exe %ROS_INSTALL%\bin -copy ..\rosapps\sysutils\chklib.exe %ROS_INSTALL%\bin -copy ..\rosapps\sysutils\format.exe %ROS_INSTALL%\bin -copy ..\rosapps\sysutils\ldd.exe %ROS_INSTALL%\bin -copy ..\rosapps\sysutils\pedump.exe %ROS_INSTALL%\bin -copy ..\rosapps\sysutils\regexpl\regexpl.exe %ROS_INSTALL%\bin -copy ..\rosapps\sysutils\tlist\tlist.exe %ROS_INSTALL%\bin -copy ..\rosapps\regedit\regedit.exe %ROS_INSTALL%\bin -copy ..\rosapps\regedt32\regedt32.exe %ROS_INSTALL%\bin -copy ..\rosapps\taskmgr\taskmgr.exe %ROS_INSTALL%\bin -copy ..\rosapps\winfile\winfile.exe %ROS_INSTALL%\bin diff --git a/rosapps/installapps.bat b/rosapps/installapps.bat deleted file mode 100644 index 407404991dc..00000000000 --- a/rosapps/installapps.bat +++ /dev/null @@ -1,49 +0,0 @@ -@echo off -if "%1" == "" goto NoParameter -set ROS_INSTALL=%1 -goto Install -:NoParameter -set ROS_INSTALL=c:\reactos -:Install -echo Installing ReactOS user programs to %ROS_INSTALL%\bin -@echo off - -copy cmd\cmd.exe %ROS_INSTALL%\bin -copy calc\calc.exe %ROS_INSTALL%\bin -copy cmdutils\tee.exe %ROS_INSTALL%\bin -copy cmdutils\more.exe %ROS_INSTALL%\bin -copy cmdutils\y.exe %ROS_INSTALL%\bin -copy cmdutils\mode\mode.exe %ROS_INSTALL%\bin -copy cmdutils\touch\touch.exe %ROS_INSTALL%\bin -copy control\control.exe %ROS_INSTALL%\bin -copy ctlpanel\roscfg\roscfg.cpl %ROS_INSTALL%\system32 -copy ctlpanel\rospower\rospower.cpl %ROS_INSTALL%\system32 -copy dflat32\edit.exe %ROS_INSTALL%\bin -copy hcalc\hcalc.exe %ROS_INSTALL%\bin -copy mc\release\mc.exe %ROS_INSTALL%\bin -copy net\arp\arp.exe %ROS_INSTALL%\bin -copy net\echo\echo.exe %ROS_INSTALL%\bin -copy net\finger\finger.exe %ROS_INSTALL%\bin -copy net\ipconfig\ipconfig.exe %ROS_INSTALL%\bin -copy net\ipecho\ipecho.exe %ROS_INSTALL%\bin -copy net\ncftp\ncftp.exe %ROS_INSTALL%\bin -copy net\netstat\netstat.exe %ROS_INSTALL%\bin -copy net\niclist\niclist.exe %ROS_INSTALL%\bin -copy net\ping\ping.exe %ROS_INSTALL%\bin -copy net\route\route.exe %ROS_INSTALL%\bin -copy net\telnet\telnet.exe %ROS_INSTALL%\bin -copy net\telnet\telnet.cfg %ROS_INSTALL%\bin -copy net\telnet\telnet.ini %ROS_INSTALL%\bin -copy net\whois\whois.exe %ROS_INSTALL%\bin -copy notevil\notevil.exe %ROS_INSTALL%\bin -copy sysutils\chkdsk.exe %ROS_INSTALL%\bin -copy sysutils\chklib.exe %ROS_INSTALL%\bin -copy sysutils\format.exe %ROS_INSTALL%\bin -copy sysutils\ldd.exe %ROS_INSTALL%\bin -copy sysutils\pedump.exe %ROS_INSTALL%\bin -copy sysutils\regexpl\regexpl.exe %ROS_INSTALL%\bin -copy sysutils\tlist\tlist.exe %ROS_INSTALL%\bin -copy regedit\regedit.exe %ROS_INSTALL%\bin -copy regedt32\regedt32.exe %ROS_INSTALL%\bin -copy taskmgr\taskmgr.exe %ROS_INSTALL%\bin -copy winfile\winfile.exe %ROS_INSTALL%\bin From 5a868930cafd23405938e8a77590ef378cd0acd4 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Sat, 20 Mar 2004 18:16:23 +0000 Subject: [PATCH 0587/1463] Fix the rendering of the GPL. svn path=/trunk/; revision=8819 --- reactos/lib/cpl/sysdm/resources/gpl.txt | Bin 30820 -> 36648 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/reactos/lib/cpl/sysdm/resources/gpl.txt b/reactos/lib/cpl/sysdm/resources/gpl.txt index 4b6523f5f96d946638a722ebf8d5582b18821dc7..f12440c4ef2a039cb752c52d3aff6e5f15badfae 100644 GIT binary patch delta 4376 zcmb`K&2LoK8OD$C2QkGp!5Cwlk*}RZ#*%@Ws;Nm3jZ31~QNc-Lk|2eau^HO~;~C>I zI3uN+B2`_crSGy*15y@Qb<q#0n=ZQRHrZugsZy&-=|9lq`JH!;?~EapDpjMIx%b@j zen0PX-ut&Nx<2{MfdgOu$Nq49;lbN~YG&bo{k#yq8@?l{%b^(R`eb1~+zX{JqpM3= z+YBpVJCwuCu-;m|tQ}eSRyY@C!?(lvxbtdwOREFF|4G;1?==U)p>R0x+ponfeM+G! z1?BL5cu}GYp%!-azoUQ5v7-_ix?T<&+FRF`>yiv_Mwfi&HSNEvwJcoGGc>%RyP6!^ zj*ix&&4F7oOcoZyntmHmD3ke8jH{yiEv*;zt+v!`b*LfoVsto{-i<3edQz6#$@LZc zbZ)4L`I4UR=(nz40^gDqvRPL4Dq7FvxQFGT?8HDb?YkRyl*4MwV_IKn>B<ylF{Z}l zirTj!tsV=0Y&@r1%I3emZBs(GqgmXQL-uI1V1K=R*ghUUGLT6L0cJRE#f1@jrTe(O zGIw+!xfnBV*AI=1-c%r&^w*+$1i2$wIbomA6$VLRO)I#s;B9bi*lx@mYMzk{1@MI7 zU0qUZt)NIy3TIEB_IU7{@d~Rc86>qRU(r^JMJ3%N!aV~M*w6H=OuA1-VN`5N0P#$Z z*Kol8GCef4s?};l1E5Q0N`mLA#Hm!79d>=9Fq@E&n`{}8WL+)*$%@dG>AHwcn|Ns` zwm{N5DXn0xAvenc>xL{&YJWv{ATUQ8m;^bjgC?NviQ1JE_v}u3*P`W$R@#dYfpAfa zYtc3O?u_?Et1YO^1wC`qxf5<^UB>U((#%+KO5vdz3fS+YQvxZ)9Ib`xUK?BmC#h9H z5RGvrT#SAsg1TfA6GIPvd-zf#;v1)OW3H;G2#L0)$XyudBn8WQ;-KHM`-?;NaPygw zm-IAs{63I(s}=0a!NOp>4%X)9rtE|6Gxo6WXty}fKHnJY-`itjz0cb-eaG#ml^*-- z<S{$BerWLAUa+wiRy;TSG(PT0>G>&p@NA)L+WxrleBto|?Du{0M<>MH)IF~+aYLQH z(w@>??X2jNi92}i+~Rnc>F{DDW-trys2P_<yi4J#{vq8f;hO&6(bW(2(fxaRa4nEP z)O*@VKdr-o(C%7Un1Hh(BA^dRZR<m`?8I_Xz_xVQ<vSDIN|Dv?ERMe=sT5YJeOGu* zZe6weeY3BEUf@pyJM2LjJV5B63GHnb<U6g{(Ui9I`nY{KdBT2qp~rsS{hUgC#2&8n z9Be_z{yaJMYzsoNlAk1Gp&Zd2TgzrE=k4X*p57>DW0kRAbv@POocMp9o_R>~F+}*Q zsPvLxkl`tT+9BMUjbH3-(#9}P`+@50<}^+DQa`N3!jz=DBu3ha0avAIHQIqFV4q^d zoTuKCo%`h{YQ%ipyKTSt-k|+%`ee*S=b-}~03S{`ynrB_FP+FcISVNHfrWNTLTR1# zh!8*`pAG^)@OTmrGTS^odKRbvk{2I?#%sz_EkfyD)a~s4^!iZ$3$6Jjkx|ph=)VzB zJLaCKSWZy_SQ9r>H_>$8*O;^veh{1RRsGX~SG2O%h<3f&|0d{5`0qqLRM3b8%EFCS zI+=rZ!&Ivy9w$d7(>~Jaf8$`!Y&y&mB<NZ?aaX^UJ+H9>_*&D!G|6v|`mWN6Ux0*j zmx2P7s+~PP@?*SzvX`s!^6MhYK?XJA(?*Px>4JNoF^ZvLkEVx9`(w|K(Do;8uk(=h zJD)z?4uJOokl(T*;pkPo_Ul_?_Orej`(mMQY$>t<b!FOMPNMyzZ+Il!IQyhAk7j7Z ztT{z<7(v<2m&{Y(!@*wFP(ZtQq-2$=2<*qI{56p_m0C|cK{3_1t3H|J1dcP5l3sCF zPirULx2paFu8DRbeCU+om$bhgPV18nch`ukb?qvL-W`PP-+iO@kIAFW&YTlD5ohrg zBBvz8QO!wGlhcl<Q&QJHxbH@nZfh?uDEvZG?QBgZx5Kp7-TB7Lx}Z!%T32N7V@*aV znJXu`jaCV9jEQeuYp#CM#wUggys#i$kx33bj7(}rY)yM}W;C)M`mn<|6^CHS&{hpK zB+a-G<p8uFG|qzzRfJuNRU<+9yyvh?6ja~GXB=~Y?Ph2&FgXqvb+syk1c*3Y?R39C z2+yF9X!9pVhB;Q;u)n(CWHp9HNVtDPXYv!sGj{T+2nV3UB%bIW3mhZ7{x}2r=;EBX zB@2X24^gpQT>&w?ApP$3>rE+01iGMW(1}n^6F7H4O1y5EpyK4&XUAn_i8oj(U)A(T zYG(E2brX}7cz-_3=>$l@<}&9ILgbC86f-a$*-8f9)*1yznD4T(0M}}IvFt#Py<7g~ zHyGb|hgF1j|JKMs@~vK{PxKb%*{>mO|2j5O*pF+b9KwvpZtSfO7yC3OI)r#}qzgD+ z(M0GpGOG?i{7<};^AUBZ#>6EKC;#n}R{J=a&Vs#2j>gRxs;VY2Ap7UB(SF>DFY?wk zKXf@i^qka4P^WWkp-E$!<h@4{%e36LM@NPRd5s{T7QxzT-`Q>wcc(NyfEUaLyoTJg H!t~Tviar_L delta 140 zcmZ26kLk$=M&bYe6d2Ip<h^3f6TNn%nle}dr9v1|8FCp47;=EL0z&|hPGm?1vUPyG zV1`nLOokG$j4^{Tg8^97i6Nh%7$}<0kO$`bGB|>*FkmoZFa$$gAPG`!&Y-Zlobh8B E05laEZvX%Q From 50ec7d086b95d32c6517fd4a31ccaa2823d79dc1 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Sat, 20 Mar 2004 21:21:03 +0000 Subject: [PATCH 0588/1463] Merge Winehq commit: Yoshiro Takeno <taro-x@justsystem.co.jp> In Windows, the leading byte for multibyte characters are set to upper byte. If single byte character is used, the upper byte is set to 0. svn path=/trunk/; revision=8820 --- reactos/lib/user32/controls/edit.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/user32/controls/edit.c b/reactos/lib/user32/controls/edit.c index bf7bf0a447b..34202d66362 100644 --- a/reactos/lib/user32/controls/edit.c +++ b/reactos/lib/user32/controls/edit.c @@ -293,7 +293,6 @@ const struct builtin_class_descr EDIT_builtin_class = { #ifdef __REACTOS__ L"Edit", /* name */ - /* FIXME: Add CS_PARENTDC when the handling of WM_ERASEBKGND will be fixed! */ CS_GLOBALCLASS | CS_DBLCLKS | CS_PARENTDC, /* style */ (WNDPROC)EditWndProcW, /* procW */ (WNDPROC)EditWndProcA, /* procA */ @@ -858,7 +857,8 @@ static LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg, strng[0] = wParam >> 8; strng[1] = wParam & 0xff; - MultiByteToWideChar(CP_ACP, 0, strng, 2, &charW, 1); + if (strng[0]) MultiByteToWideChar(CP_ACP, 0, strng, 2, &charW, 1); + else MultiByteToWideChar(CP_ACP, 0, &strng[1], 1, &charW, 1); EDIT_WM_Char(es, charW); break; } From 537dc19b03f433f9537864d85119ae54941d2a83 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Sat, 20 Mar 2004 21:53:36 +0000 Subject: [PATCH 0589/1463] Merge setupapi with Winehq. svn path=/trunk/; revision=8821 --- reactos/include/wine/setupapi.h | 98 ++++++++++++++++++++++++++++++++- 1 file changed, 96 insertions(+), 2 deletions(-) diff --git a/reactos/include/wine/setupapi.h b/reactos/include/wine/setupapi.h index 4700d3ca5e5..f0835583e9b 100644 --- a/reactos/include/wine/setupapi.h +++ b/reactos/include/wine/setupapi.h @@ -37,6 +37,8 @@ typedef PVOID HDEVINFO; /* Define type for setup file queue */ typedef PVOID HSPFILEQ; +typedef PVOID HDSKSPC; + /* inf structure. */ typedef struct _INFCONTEXT { @@ -112,10 +114,37 @@ typedef struct _SP_FILE_COPY_PARAMS_W DECL_WINELIB_SETUPAPI_TYPE_AW(SP_FILE_COPY_PARAMS) DECL_WINELIB_SETUPAPI_TYPE_AW(PSP_FILE_COPY_PARAMS) +typedef struct _SP_REGISTER_CONTROL_STATUSA +{ + DWORD cbSize; + PCSTR FileName; + DWORD Win32Error; + DWORD FailureCode; +} SP_REGISTER_CONTROL_STATUSA, *PSP_REGISTER_CONTROL_STATUSA; + +typedef struct _SP_REGISTER_CONTROL_STATUSW +{ + DWORD cbSize; + PCWSTR FileName; + DWORD Win32Error; + DWORD FailureCode; +} SP_REGISTER_CONTROL_STATUSW, *PSP_REGISTER_CONTROL_STATUSW; + +DECL_WINELIB_TYPE_AW(SP_REGISTER_CONTROL_STATUS) +DECL_WINELIB_TYPE_AW(PSP_REGISTER_CONTROL_STATUS) + +#define SPREG_SUCCESS 0x00000000 +#define SPREG_LOADLIBRARY 0x00000001 +#define SPREG_GETPROCADDR 0x00000002 +#define SPREG_REGSVR 0x00000003 +#define SPREG_DLLINSTALL 0x00000004 +#define SPREG_TIMEOUT 0x00000005 +#define SPREG_UNKNOWN 0xffffffff + typedef UINT (CALLBACK *PSP_FILE_CALLBACK_A)( PVOID Context, UINT Notification, - UINT Param1, UINT Param2 ); + UINT_PTR Param1, UINT_PTR Param2 ); typedef UINT (CALLBACK *PSP_FILE_CALLBACK_W)( PVOID Context, UINT Notification, - UINT Param1, UINT Param2 ); + UINT_PTR Param1, UINT_PTR Param2 ); DECL_WINELIB_SETUPAPI_TYPE_AW(PSP_FILE_CALLBACK) #define LINE_LEN 256 @@ -219,6 +248,12 @@ typedef struct _CABINET_INFO_W { DECL_WINELIB_SETUPAPI_TYPE_AW(CABINET_INFO); DECL_WINELIB_SETUPAPI_TYPE_AW(PCABINET_INFO); +typedef struct _SP_INF_INFORMATION { + DWORD InfStyle; + DWORD InfCount; + BYTE VersionData[ANYSIZE_ARRAY]; +} SP_INF_INFORMATION, *PSP_INF_INFORMATION; + #define INF_STYLE_NONE 0x00 #define INF_STYLE_OLDNT 0x01 #define INF_STYLE_WIN4 0x02 @@ -359,6 +394,9 @@ DECL_WINELIB_SETUPAPI_TYPE_AW(PFILEPATHS) #define FLG_DELREG_OPERATION_MASK (0x000000FE) #define FLG_DELREG_MULTI_SZ_DELSTRING (FLG_DELREG_TYPE_MULTI_SZ | FLG_ADDREG_DELREG_BIT | 0x00000002) +#define FLG_REGSVR_DLLREGISTER 0x00000001 +#define FLG_REGSVR_DLLINSTALL 0x00000002 + /* Class installer function codes */ #define DIF_SELECTDEVICE 0x01 #define DIF_INSTALLDEVICE 0x02 @@ -518,6 +556,54 @@ DECL_WINELIB_SETUPAPI_TYPE_AW(PFILEPATHS) #define ERROR_NO_SUCH_INTERFACE_DEVICE ERROR_NO_SUCH_DEVICE_INTERFACE #define ERROR_NOT_INSTALLED (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x1000) +/* flags for SetupDiGetClassDevs */ +#define DIGCF_DEFAULT 0x00000001 +#define DIGCF_PRESENT 0x00000002 +#define DIGCF_ALLCLASSES 0x00000004 +#define DIGCF_PROFILE 0x00000008 +#define DIGCF_DEVICEINTERFACE 0x00000010 + +/* setup device registry property codes */ +#define SPDRP_DEVICEDESC 0x00000000 +#define SPDRP_HARDWAREID 0x00000001 +#define SPDRP_COMPATIBLEIDS 0x00000002 +#define SPDRP_UNUSED0 0x00000003 +#define SPDRP_SERVICE 0x00000004 +#define SPDRP_UNUSED1 0x00000005 +#define SPDRP_UNUSED2 0x00000006 +#define SPDRP_CLASS 0x00000007 +#define SPDRP_CLASSGUID 0x00000008 +#define SPDRP_DRIVER 0x00000009 +#define SPDRP_CONFIGFLAGS 0x0000000a +#define SPDRP_MFG 0x0000000b +#define SPDRP_FRIENDLYNAME 0x0000000c +#define SPDRP_LOCATION_INFORMATION 0x0000000d +#define SPDRP_PHYSICAL_DEVICE_OBJECT_NAME 0x0000000e +#define SPDRP_CAPABILITIES 0x0000000f +#define SPDRP_UI_NUMBER 0x00000010 +#define SPDRP_UPPERFILTERS 0x00000011 +#define SPDRP_LOWERFILTERS 0x00000012 +#define SPDRP_BUSTYPEGUID 0x00000013 +#define SPDRP_LEGACYBUSTYPE 0x00000014 +#define SPDRP_BUSNUMBER 0x00000015 +#define SPDRP_ENUMERATOR_NAME 0x00000016 +#define SPDRP_SECURITY 0x00000017 +#define SPDRP_SECURITY_SDS 0x00000018 +#define SPDRP_DEVTYPE 0x00000019 +#define SPDRP_EXCLUSIVE 0x0000001a +#define SPDRP_CHARACTERISTICS 0x0000001b +#define SPDRP_ADDRESS 0x0000001c +#define SPDRP_UI_NUMBER_DESC_FORMAT 0x0000001d +#define SPDRP_DEVICE_POWER_DATA 0x0000001e +#define SPDRP_REMOVAL_POLICY 0x0000001f +#define SPDRP_REMOVAL_POLICY_HW_DEFAULT 0x00000020 +#define SPDRP_REMOVAL_POLICY_OVERRIDE 0x00000021 +#define SPDRP_INSTALL_STATE 0x00000022 +#define SPDRP_MAXIMUM_PROPERTY 0x00000023 + +void WINAPI InstallHinfSectionA( HWND hwnd, HINSTANCE handle, LPCSTR cmdline, INT show ); +void WINAPI InstallHinfSectionW( HWND hwnd, HINSTANCE handle, LPCWSTR cmdline, INT show ); +#define InstallHinfSection WINELIB_NAME_AW(InstallHinfSection) HINF WINAPI SetupOpenInfFileA( PCSTR name, PCSTR pszclass, DWORD style, UINT *error ); HINF WINAPI SetupOpenInfFileW( PCWSTR name, PCWSTR pszclass, DWORD style, UINT *error ); #define SetupOpenInfFile WINELIB_NAME_AW(SetupOpenInfFile) @@ -597,9 +683,17 @@ void WINAPI SetupTermDefaultQueueCallback( PVOID ); UINT WINAPI SetupDefaultQueueCallbackA( PVOID, UINT, UINT_PTR, UINT_PTR ); UINT WINAPI SetupDefaultQueueCallbackW( PVOID, UINT, UINT_PTR, UINT_PTR ); #define SetupDefaultQueueCallback WINELIB_NAME_AW(SetupDefaultQueueCallback) +BOOL WINAPI SetupDiDestroyDeviceInfoList(HDEVINFO); +BOOL WINAPI SetupDiEnumDeviceInterfaces(HDEVINFO, PSP_DEVINFO_DATA, const GUID *, DWORD, PSP_DEVICE_INTERFACE_DATA); HDEVINFO WINAPI SetupDiGetClassDevsA(CONST GUID *,LPCSTR,HWND,DWORD); HDEVINFO WINAPI SetupDiGetClassDevsW(CONST GUID *,LPCWSTR,HWND,DWORD); #define SetupDiGetClassDevs WINELIB_NAME_AW(SetupDiGetClassDevs) +BOOL WINAPI SetupDiGetDeviceInterfaceDetailA(HDEVINFO, PSP_DEVICE_INTERFACE_DATA, PSP_DEVICE_INTERFACE_DETAIL_DATA_A, + DWORD, PDWORD, PSP_DEVINFO_DATA); +BOOL WINAPI SetupDiGetDeviceInterfaceDetailW(HDEVINFO, PSP_DEVICE_INTERFACE_DATA, PSP_DEVICE_INTERFACE_DETAIL_DATA_W, + DWORD, PDWORD, PSP_DEVINFO_DATA); +#define SetupDiGetDeviceInterfaceDetail WINELIB_NAME_AW(SetupDiGetDeviceInterfaceDetail) +BOOL WINAPI SetupDiGetDeviceRegistryPropertyA(HDEVINFO, PSP_DEVINFO_DATA, DWORD, PDWORD, PBYTE, DWORD, PDWORD); BOOL WINAPI SetupInstallFilesFromInfSectionA( HINF, HINF, HSPFILEQ, PCSTR, PCSTR, UINT ); BOOL WINAPI SetupInstallFilesFromInfSectionW( HINF, HINF, HSPFILEQ, PCWSTR, PCWSTR, UINT ); #define SetupInstallFilesFromInfSection WINELIB_NAME_AW(SetupInstallFilesFromInfSection) From a9f6fe5ffba37bff709a0cdc33b3a54e54fed614 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Sat, 20 Mar 2004 21:55:24 +0000 Subject: [PATCH 0590/1463] Merge setupapi with Winehq. This should give us a working InstallHInfSection for loading drivers if not check the attic for Alex's implementation. svn path=/trunk/; revision=8822 --- reactos/lib/setupapi/En.rc | 34 ++ reactos/lib/setupapi/Es.rc | 34 ++ reactos/lib/setupapi/Fr.rc | 35 +++ reactos/lib/setupapi/It.rc | 35 +++ reactos/lib/setupapi/Makefile.in | 2 +- reactos/lib/setupapi/Nl.rc | 34 ++ reactos/lib/setupapi/Pt.rc | 34 ++ reactos/lib/setupapi/Ru.rc | 34 ++ reactos/lib/setupapi/devinst16.c | 10 + reactos/lib/setupapi/dirid.c | 3 - reactos/lib/setupapi/diskspace.c | 156 ++++++++++ reactos/lib/setupapi/install.c | 294 +++++++++++++++++- reactos/lib/setupapi/parser.c | 34 +- reactos/lib/setupapi/queue.c | 37 ++- reactos/lib/setupapi/setupapi.rc | 67 ++-- reactos/lib/setupapi/setupapi.spec | 24 +- reactos/lib/setupapi/setupapi_main.c | 392 ------------------------ reactos/lib/setupapi/setupapi_private.h | 1 + reactos/lib/setupapi/setupx.spec | 269 ++++++++++++++++ reactos/lib/setupapi/setupx_main.c | 129 +------- reactos/lib/setupapi/stubs.c | 41 ++- 21 files changed, 1100 insertions(+), 599 deletions(-) create mode 100644 reactos/lib/setupapi/En.rc create mode 100644 reactos/lib/setupapi/Es.rc create mode 100644 reactos/lib/setupapi/Fr.rc create mode 100644 reactos/lib/setupapi/It.rc create mode 100644 reactos/lib/setupapi/Nl.rc create mode 100644 reactos/lib/setupapi/Pt.rc create mode 100644 reactos/lib/setupapi/Ru.rc create mode 100644 reactos/lib/setupapi/diskspace.c delete mode 100644 reactos/lib/setupapi/setupapi_main.c create mode 100644 reactos/lib/setupapi/setupx.spec diff --git a/reactos/lib/setupapi/En.rc b/reactos/lib/setupapi/En.rc new file mode 100644 index 00000000000..088f6aaa035 --- /dev/null +++ b/reactos/lib/setupapi/En.rc @@ -0,0 +1,34 @@ +/* + * English resources for SETUPAPI + * + * Copyright 2001 Andreas Mohr + * + * 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_ENGLISH, SUBLANG_DEFAULT + +COPYFILEDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 208, 105 +STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "Copying Files..." +FONT 8, "MS Sans Serif" +BEGIN + PUSHBUTTON "Cancel", IDCANCEL, 79, 84, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + LTEXT "Source:", -1, 7, 7, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "", SOURCESTRORD, 7, 18, 194, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "Destination:", -1, 7, 30, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "", DESTSTRORD, 7, 41, 194, 22, WS_CHILD | WS_VISIBLE | WS_GROUP + CONTROL "", PROGRESSORD, "setupx_progress", 7, 63, 194, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END diff --git a/reactos/lib/setupapi/Es.rc b/reactos/lib/setupapi/Es.rc new file mode 100644 index 00000000000..efa01ea412c --- /dev/null +++ b/reactos/lib/setupapi/Es.rc @@ -0,0 +1,34 @@ +/* + * Spanish resources for SETUPAPI + * + * Copyright 2003 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 + +COPYFILEDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 208, 105 +STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "Copiando archivos..." +FONT 8, "MS Sans Serif" +BEGIN + PUSHBUTTON "Cancelar", IDCANCEL, 79, 84, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + LTEXT "Origen:", -1, 7, 7, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "", SOURCESTRORD, 7, 18, 194, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "Destino:", -1, 7, 30, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "", DESTSTRORD, 7, 41, 194, 22, WS_CHILD | WS_VISIBLE | WS_GROUP + CONTROL "", PROGRESSORD, "setupx_progress", 7, 63, 194, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END diff --git a/reactos/lib/setupapi/Fr.rc b/reactos/lib/setupapi/Fr.rc new file mode 100644 index 00000000000..1821aac661b --- /dev/null +++ b/reactos/lib/setupapi/Fr.rc @@ -0,0 +1,35 @@ +/* + * French resources for SETUPAPI + * + * Copyright 2001 Andreas Mohr + * Copyright 2003 Vincent B閞on + * + * 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_FRENCH, SUBLANG_NEUTRAL + +COPYFILEDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 208, 105 +STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "Copie de fichiers..." +FONT 8, "MS Sans Serif" +BEGIN + PUSHBUTTON "Annuler", IDCANCEL, 79, 84, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + LTEXT "Source:", -1, 7, 7, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "", SOURCESTRORD, 7, 18, 194, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "Destination:", -1, 7, 30, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "", DESTSTRORD, 7, 41, 194, 22, WS_CHILD | WS_VISIBLE | WS_GROUP + CONTROL "", PROGRESSORD, "setupx_progress", 7, 63, 194, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END diff --git a/reactos/lib/setupapi/It.rc b/reactos/lib/setupapi/It.rc new file mode 100644 index 00000000000..816aa47067c --- /dev/null +++ b/reactos/lib/setupapi/It.rc @@ -0,0 +1,35 @@ +/* + * Italian resources for SETUPAPI + * + * Copyright 2001 Andreas Mohr + * Copyright 2003 Ivan Leo Murray-Smith + * + * 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_ITALIAN, SUBLANG_DEFAULT + +COPYFILEDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 208, 105 +STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "Copia dei file in corso..." +FONT 8, "MS Sans Serif" +BEGIN + PUSHBUTTON "Anulla", IDCANCEL, 79, 84, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + LTEXT "Origine:", -1, 7, 7, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "", SOURCESTRORD, 7, 18, 194, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "Destinazione:", -1, 7, 30, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "", DESTSTRORD, 7, 41, 194, 22, WS_CHILD | WS_VISIBLE | WS_GROUP + CONTROL "", PROGRESSORD, "setupx_progress", 7, 63, 194, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END diff --git a/reactos/lib/setupapi/Makefile.in b/reactos/lib/setupapi/Makefile.in index a908ec6b07a..df4fea256e5 100644 --- a/reactos/lib/setupapi/Makefile.in +++ b/reactos/lib/setupapi/Makefile.in @@ -13,11 +13,11 @@ SPEC_SRCS16 = $(ALTNAMES:.dll=.spec) C_SRCS = \ devinst.c \ dirid.c \ + diskspace.c \ install.c \ parser.c \ queue.c \ setupcab.c \ - setupapi_main.c \ stubs.c C_SRCS16 = \ diff --git a/reactos/lib/setupapi/Nl.rc b/reactos/lib/setupapi/Nl.rc new file mode 100644 index 00000000000..a60d3528bfa --- /dev/null +++ b/reactos/lib/setupapi/Nl.rc @@ -0,0 +1,34 @@ +/* + * setupapi (Dutch resources) + * + * Copyright 2003 Hans Leidekker + * + * 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_DUTCH, SUBLANG_DEFAULT + +COPYFILEDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 208, 105 +STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "Bestanden worden gekopi毛erd..." +FONT 8, "MS Sans Serif" +BEGIN + PUSHBUTTON "Annuleren", IDCANCEL, 79, 84, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + LTEXT "Bron:", -1, 7, 7, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "", SOURCESTRORD, 7, 18, 194, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "Bestemming:", -1, 7, 30, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "", DESTSTRORD, 7, 41, 194, 22, WS_CHILD | WS_VISIBLE | WS_GROUP + CONTROL "", PROGRESSORD, "setupx_progress", 7, 63, 194, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END diff --git a/reactos/lib/setupapi/Pt.rc b/reactos/lib/setupapi/Pt.rc new file mode 100644 index 00000000000..ab1f3b78988 --- /dev/null +++ b/reactos/lib/setupapi/Pt.rc @@ -0,0 +1,34 @@ +/* + * Portuguese resources for SETUPAPI + * + * Copyright 2003 Marcelo Duarte + * + * 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_PORTUGUESE, SUBLANG_DEFAULT + +COPYFILEDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 208, 105 +STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "Copiando arquivos..." +FONT 8, "MS Sans Serif" +BEGIN + PUSHBUTTON "Cancelar", IDCANCEL, 79, 84, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + LTEXT "Origem:", -1, 7, 7, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "", SOURCESTRORD, 7, 18, 194, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "Destino:", -1, 7, 30, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "", DESTSTRORD, 7, 41, 194, 22, WS_CHILD | WS_VISIBLE | WS_GROUP + CONTROL "", PROGRESSORD, "setupx_progress", 7, 63, 194, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END diff --git a/reactos/lib/setupapi/Ru.rc b/reactos/lib/setupapi/Ru.rc new file mode 100644 index 00000000000..dc8523a8c4c --- /dev/null +++ b/reactos/lib/setupapi/Ru.rc @@ -0,0 +1,34 @@ +/* + * SETUPAPI (Russian resources) + * + * Copyright 2003 Igor Stepin + * + * 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_RUSSIAN, SUBLANG_DEFAULT + +COPYFILEDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 208, 105 +STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "暑镨痤忄龛 羿殡钼..." +FONT 8, "MS Sans Serif" +BEGIN + PUSHBUTTON "悟戾磬", IDCANCEL, 79, 84, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + LTEXT "悟牦溧:", -1, 7, 7, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "", SOURCESTRORD, 7, 18, 194, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "鼠溧:", -1, 7, 30, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "", DESTSTRORD, 7, 41, 194, 22, WS_CHILD | WS_VISIBLE | WS_GROUP + CONTROL "", PROGRESSORD, "setupx_progress", 7, 63, 194, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END diff --git a/reactos/lib/setupapi/devinst16.c b/reactos/lib/setupapi/devinst16.c index 0c402621410..54e5e10c5b1 100644 --- a/reactos/lib/setupapi/devinst16.c +++ b/reactos/lib/setupapi/devinst16.c @@ -55,6 +55,16 @@ RETERR16 WINAPI DiBuildCompatDrvList16(LPDEVICE_INFO16 lpdi) return FALSE; } +/*********************************************************************** + * DiBuildClassDrvList (SETUPX.301) + */ +RETERR16 WINAPI DiBuildClassDrvList16(LPDEVICE_INFO16 lpdi) +{ + FIXME("(%p): stub\n", lpdi); + lpdi->lpCompatDrvList = NULL; + return FALSE; +} + /*********************************************************************** * DiCallClassInstaller (SETUPX.308) */ diff --git a/reactos/lib/setupapi/dirid.c b/reactos/lib/setupapi/dirid.c index 98fd99e0a32..63f2e86377b 100644 --- a/reactos/lib/setupapi/dirid.c +++ b/reactos/lib/setupapi/dirid.c @@ -18,9 +18,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include "config.h" -#include "wine/port.h" - #include <stdarg.h> #include "windef.h" diff --git a/reactos/lib/setupapi/diskspace.c b/reactos/lib/setupapi/diskspace.c new file mode 100644 index 00000000000..c851d61c93c --- /dev/null +++ b/reactos/lib/setupapi/diskspace.c @@ -0,0 +1,156 @@ +/* + * SetupAPI DiskSpace functions + * + * Copyright 2004 CodeWeavers (Aric Stewart) + * + * 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 "config.h" +#include "wine/port.h" + +#include <stdarg.h> + +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "winnls.h" +#include "winreg.h" +#include "setupapi.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(setupapi); + +typedef struct { + WCHAR lpzName[20]; + LONGLONG dwFreeSpace; + LONGLONG dwWantedSpace; +} DRIVE_ENTRY, *LPDRIVE_ENTRY; + +typedef struct { + DWORD dwDriveCount; + DRIVE_ENTRY Drives[26]; +} DISKSPACELIST, *LPDISKSPACELIST; + + +/*********************************************************************** + * SetupCreateDiskSpaceListW (SETUPAPI.@) + */ +HDSKSPC WINAPI SetupCreateDiskSpaceListW(PVOID Reserved1, DWORD Reserved2, UINT Flags) +{ + WCHAR drives[255]; + DWORD rc; + WCHAR *ptr; + LPDISKSPACELIST list=NULL; + + rc = GetLogicalDriveStringsW(255,drives); + + if (rc == 0) + return NULL; + + list = (LPDISKSPACELIST)HeapAlloc(GetProcessHeap(),0,sizeof(DISKSPACELIST)); + + list->dwDriveCount = 0; + + ptr = drives; + + while (*ptr) + { + DWORD type = GetDriveTypeW(ptr); + DWORD len; + if (type == DRIVE_FIXED) + { + DWORD clusters; + DWORD sectors; + DWORD bytes; + DWORD total; + lstrcpyW(list->Drives[list->dwDriveCount].lpzName,ptr); + GetDiskFreeSpaceW(ptr,§ors,&bytes,&clusters,&total); + list->Drives[list->dwDriveCount].dwFreeSpace = clusters * sectors * + bytes; + list->Drives[list->dwDriveCount].dwWantedSpace = 0; + list->dwDriveCount++; + } + len = lstrlenW(ptr); + len++; + ptr+=sizeof(WCHAR)*len; + } + return (HANDLE)list; +} + + +/*********************************************************************** + * SetupCreateDiskSpaceListA (SETUPAPI.@) + */ +HDSKSPC WINAPI SetupCreateDiskSpaceListA(PVOID Reserved1, DWORD Reserved2, UINT Flags) +{ + return SetupCreateDiskSpaceListW( Reserved1, Reserved2, Flags ); +} + + +/*********************************************************************** + * SetupAddInstallSectionToDiskSpaceListA (SETUPAPI.@) + */ +BOOL WINAPI SetupAddInstallSectionToDiskSpaceListA(HDSKSPC DiskSpace, + HINF InfHandle, HINF LayoutInfHandle, + LPSTR SectionName, PVOID Reserved1, UINT Reserved2) +{ + FIXME ("Stub\n"); + return TRUE; +} + +/*********************************************************************** +* SetupQuerySpaceRequiredOnDriveA (SETUPAPI.@) +*/ +BOOL WINAPI SetupQuerySpaceRequiredOnDriveA(HDSKSPC DiskSpace, + LPSTR DriveSpec, LONGLONG* SpaceRequired, + PVOID Reserved1, UINT Reserved2) +{ + WCHAR driveW[20]; + int i; + LPDISKSPACELIST list = (LPDISKSPACELIST)DiskSpace; + BOOL rc = FALSE; + WCHAR bkslsh[]= {'\\',0}; + + MultiByteToWideChar(CP_ACP,0,DriveSpec,-1,driveW,20); + + lstrcatW(driveW,bkslsh); + + TRACE("Looking for drive %s\n",debugstr_w(driveW)); + + for (i = 0; i < list->dwDriveCount; i++) + { + TRACE("checking drive %s\n",debugstr_w(list->Drives[i].lpzName)); + if (lstrcmpW(driveW,list->Drives[i].lpzName)==0) + { + rc = TRUE; + *SpaceRequired = list->Drives[i].dwWantedSpace; + break; + } + } + + return rc; +} + +/*********************************************************************** +* SetupDestroyDiskSpaceList (SETUPAPI.@) +*/ +BOOL WINAPI SetupDestroyDiskSpaceList(HDSKSPC DiskSpace) +{ + LPDISKSPACELIST list = (LPDISKSPACELIST)DiskSpace; + HeapFree(GetProcessHeap(),0,list); + return TRUE; +} diff --git a/reactos/lib/setupapi/install.c b/reactos/lib/setupapi/install.c index abf7645666f..eeedd91d77f 100644 --- a/reactos/lib/setupapi/install.c +++ b/reactos/lib/setupapi/install.c @@ -18,9 +18,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include "config.h" -#include "wine/port.h" - #include <stdarg.h> #include "windef.h" @@ -54,6 +51,14 @@ struct registry_callback_info BOOL delete; }; +/* info passed to callback functions dealing with registering dlls */ +struct register_dll_info +{ + PSP_FILE_CALLBACK_W callback; + PVOID callback_context; + BOOL unregister; +}; + typedef BOOL (*iterate_fields_func)( HINF hinf, PCWSTR field, void *arg ); /* Unicode constants */ @@ -64,8 +69,13 @@ static const WCHAR Ini2Reg[] = {'I','n','i','2','R','e','g',0}; static const WCHAR LogConf[] = {'L','o','g','C','o','n','f',0}; static const WCHAR AddReg[] = {'A','d','d','R','e','g',0}; static const WCHAR DelReg[] = {'D','e','l','R','e','g',0}; +static const WCHAR BitReg[] = {'B','i','t','R','e','g',0}; static const WCHAR UpdateInis[] = {'U','p','d','a','t','e','I','n','i','s',0}; +static const WCHAR CopyINF[] = {'C','o','p','y','I','N','F',0}; static const WCHAR UpdateIniFields[] = {'U','p','d','a','t','e','I','n','i','F','i','e','l','d','s',0}; +static const WCHAR RegisterDlls[] = {'R','e','g','i','s','t','e','r','D','l','l','s',0}; +static const WCHAR UnregisterDlls[] = {'U','n','r','e','g','i','s','t','e','r','D','l','l','s',0}; +static const WCHAR ProfileItems[] = {'P','r','o','f','i','l','e','I','t','e','m','s',0}; /*********************************************************************** @@ -423,6 +433,158 @@ static BOOL registry_callback( HINF hinf, PCWSTR field, void *arg ) } +/*********************************************************************** + * do_register_dll + * + * Register or unregister a dll. + */ +static BOOL do_register_dll( const struct register_dll_info *info, const WCHAR *path, + INT flags, INT timeout, const WCHAR *args ) +{ + HMODULE module; + HRESULT res; + SP_REGISTER_CONTROL_STATUSW status; + + status.cbSize = sizeof(status); + status.FileName = path; + status.FailureCode = SPREG_SUCCESS; + status.Win32Error = ERROR_SUCCESS; + + if (info->callback) + { + switch(info->callback( info->callback_context, SPFILENOTIFY_STARTREGISTRATION, + (UINT_PTR)&status, !info->unregister )) + { + case FILEOP_ABORT: + SetLastError( ERROR_OPERATION_ABORTED ); + return FALSE; + case FILEOP_SKIP: + return TRUE; + case FILEOP_DOIT: + break; + } + } + + if (!(module = LoadLibraryExW( path, 0, LOAD_WITH_ALTERED_SEARCH_PATH ))) + { + WARN( "could not load %s\n", debugstr_w(path) ); + status.FailureCode = SPREG_LOADLIBRARY; + status.Win32Error = GetLastError(); + goto done; + } + + if (flags & FLG_REGSVR_DLLREGISTER) + { + const char *entry_point = info->unregister ? "DllUnregisterServer" : "DllRegisterServer"; + HRESULT (WINAPI *func)(void) = (void *)GetProcAddress( module, entry_point ); + + if (!func) + { + status.FailureCode = SPREG_GETPROCADDR; + status.Win32Error = GetLastError(); + goto done; + } + + TRACE( "calling %s in %s\n", entry_point, debugstr_w(path) ); + res = func(); + + if (FAILED(res)) + { + WARN( "calling %s in %s returned error %lx\n", entry_point, debugstr_w(path), res ); + status.FailureCode = SPREG_REGSVR; + status.Win32Error = res; + goto done; + } + } + + if (flags & FLG_REGSVR_DLLINSTALL) + { + HRESULT (WINAPI *func)(BOOL,LPCWSTR) = (void *)GetProcAddress( module, "DllInstall" ); + + if (!func) + { + status.FailureCode = SPREG_GETPROCADDR; + status.Win32Error = GetLastError(); + goto done; + } + + TRACE( "calling DllInstall(%d,%s) in %s\n", + !info->unregister, debugstr_w(args), debugstr_w(path) ); + res = func( !info->unregister, args ); + + if (FAILED(res)) + { + WARN( "calling DllInstall in %s returned error %lx\n", debugstr_w(path), res ); + status.FailureCode = SPREG_REGSVR; + status.Win32Error = res; + goto done; + } + } + +done: + if (module) FreeLibrary( module ); + if (info->callback) info->callback( info->callback_context, SPFILENOTIFY_ENDREGISTRATION, + (UINT_PTR)&status, !info->unregister ); + return TRUE; +} + + +/*********************************************************************** + * register_dlls_callback + * + * Called once for each RegisterDlls entry in a given section. + */ +static BOOL register_dlls_callback( HINF hinf, PCWSTR field, void *arg ) +{ + struct register_dll_info *info = arg; + INFCONTEXT context; + BOOL ret = TRUE; + BOOL ok = SetupFindFirstLineW( hinf, field, NULL, &context ); + + for (; ok; ok = SetupFindNextLine( &context, &context )) + { + WCHAR *path, *args, *p; + WCHAR buffer[MAX_INF_STRING_LENGTH]; + INT flags, timeout; + + /* get directory */ + if (!(path = PARSER_get_dest_dir( &context ))) continue; + + /* get dll name */ + if (!SetupGetStringFieldW( &context, 3, buffer, sizeof(buffer)/sizeof(WCHAR), NULL )) + goto done; + if (!(p = HeapReAlloc( GetProcessHeap(), 0, path, + (strlenW(path) + strlenW(buffer) + 2) * sizeof(WCHAR) ))) goto done; + path = p; + p += strlenW(p); + if (p == path || p[-1] != '\\') *p++ = '\\'; + strcpyW( p, buffer ); + + /* get flags */ + if (!SetupGetIntField( &context, 4, &flags )) flags = 0; + + /* get timeout */ + if (!SetupGetIntField( &context, 5, &timeout )) timeout = 60; + + /* get command line */ + args = NULL; + if (SetupGetStringFieldW( &context, 6, buffer, sizeof(buffer)/sizeof(WCHAR), NULL )) + args = buffer; + + ret = do_register_dll( info, path, flags, timeout, args ); + + done: + HeapFree( GetProcessHeap(), 0, path ); + if (!ret) break; + } + return ret; +} + +/*********************************************************************** + * update_ini_callback + * + * Called once for each UpdateInis entry in a given section. + */ static BOOL update_ini_callback( HINF hinf, PCWSTR field, void *arg ) { INFCONTEXT context; @@ -490,6 +652,24 @@ static BOOL logconf_callback( HINF hinf, PCWSTR field, void *arg ) return TRUE; } +static BOOL bitreg_callback( HINF hinf, PCWSTR field, void *arg ) +{ + FIXME( "should do bitreg %s\n", debugstr_w(field) ); + return TRUE; +} + +static BOOL profile_items_callback( HINF hinf, PCWSTR field, void *arg ) +{ + FIXME( "should do profile items %s\n", debugstr_w(field) ); + return TRUE; +} + +static BOOL copy_inf_callback( HINF hinf, PCWSTR field, void *arg ) +{ + FIXME( "should do copy inf %s\n", debugstr_w(field) ); + return TRUE; +} + /*********************************************************************** * iterate_section_fields @@ -515,7 +695,8 @@ static BOOL iterate_section_fields( HINF hinf, PCWSTR section, PCWSTR key, goto done; if (!callback( hinf, buffer, arg )) { - ERR("callback failed for %s %s\n", debugstr_w(section), debugstr_w(buffer) ); + WARN("callback failed for %s %s err %ld\n", + debugstr_w(section), debugstr_w(buffer), GetLastError() ); goto done; } } @@ -650,13 +831,41 @@ BOOL WINAPI SetupInstallFromInfSectionW( HWND owner, HINF hinf, PCWSTR section, if (!iterate_section_fields( hinf, section, Ini2Reg, ini2reg_callback, NULL )) return FALSE; } - if (flags & SPINST_LOGCONFIG) { if (!iterate_section_fields( hinf, section, LogConf, logconf_callback, NULL )) return FALSE; } + if (flags & SPINST_REGSVR) + { + struct register_dll_info info; + info.unregister = FALSE; + if (flags & SPINST_REGISTERCALLBACKAWARE) + { + info.callback = callback; + info.callback_context = context; + } + else info.callback = NULL; + + if (!iterate_section_fields( hinf, section, RegisterDlls, register_dlls_callback, &info )) + return FALSE; + } + if (flags & SPINST_UNREGSVR) + { + struct register_dll_info info; + + info.unregister = TRUE; + if (flags & SPINST_REGISTERCALLBACKAWARE) + { + info.callback = callback; + info.callback_context = context; + } + else info.callback = NULL; + + if (!iterate_section_fields( hinf, section, UnregisterDlls, register_dlls_callback, &info )) + return FALSE; + } if (flags & SPINST_REGISTRY) { struct registry_callback_info info; @@ -669,7 +878,78 @@ BOOL WINAPI SetupInstallFromInfSectionW( HWND owner, HINF hinf, PCWSTR section, if (!iterate_section_fields( hinf, section, AddReg, registry_callback, &info )) return FALSE; } - if (flags & (SPINST_BITREG|SPINST_REGSVR|SPINST_UNREGSVR|SPINST_PROFILEITEMS|SPINST_COPYINF)) - FIXME( "unsupported flags %x\n", flags ); + if (flags & SPINST_BITREG) + { + if (!iterate_section_fields( hinf, section, BitReg, bitreg_callback, NULL )) + return FALSE; + } + if (flags & SPINST_PROFILEITEMS) + { + if (!iterate_section_fields( hinf, section, ProfileItems, profile_items_callback, NULL )) + return FALSE; + } + if (flags & SPINST_COPYINF) + { + if (!iterate_section_fields( hinf, section, CopyINF, copy_inf_callback, NULL )) + return FALSE; + } + return TRUE; } + + +/*********************************************************************** + * InstallHinfSectionW (SETUPAPI.@) + * + * NOTE: 'cmdline' is <section> <mode> <path> from + * RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection <section> <mode> <path> + */ +void WINAPI InstallHinfSectionW( HWND hwnd, HINSTANCE handle, LPCWSTR cmdline, INT show ) +{ + WCHAR *p, *path, section[MAX_PATH]; + void *callback_context; + UINT mode; + HINF hinf; + + TRACE("hwnd %p, handle %p, cmdline %s\n", hwnd, handle, debugstr_w(cmdline)); + + lstrcpynW( section, cmdline, sizeof(section)/sizeof(WCHAR) ); + + if (!(p = strchrW( section, ' ' ))) return; + *p++ = 0; + while (*p == ' ') p++; + mode = atoiW( p ); + + if (!(p = strchrW( p, ' ' ))) return; + path = p + 1; + while (*path == ' ') path++; + + hinf = SetupOpenInfFileW( path, NULL, INF_STYLE_WIN4, NULL ); + if (hinf == INVALID_HANDLE_VALUE) return; + + callback_context = SetupInitDefaultQueueCallback( hwnd ); + SetupInstallFromInfSectionW( hwnd, hinf, section, SPINST_ALL, NULL, NULL, SP_COPY_NEWER, + SetupDefaultQueueCallbackW, callback_context, + NULL, NULL ); + SetupTermDefaultQueueCallback( callback_context ); + SetupCloseInfFile( hinf ); + + /* FIXME: should check the mode and maybe reboot */ + /* there isn't much point in doing that since we */ + /* don't yet handle deferred file copies anyway. */ +} + + +/*********************************************************************** + * InstallHinfSectionA (SETUPAPI.@) + */ +void WINAPI InstallHinfSectionA( HWND hwnd, HINSTANCE handle, LPCSTR cmdline, INT show ) +{ + UNICODE_STRING cmdlineW; + + if (RtlCreateUnicodeStringFromAsciiz( &cmdlineW, cmdline )) + { + InstallHinfSectionW( hwnd, handle, cmdlineW.Buffer, show ); + RtlFreeUnicodeString( &cmdlineW ); + } +} diff --git a/reactos/lib/setupapi/parser.c b/reactos/lib/setupapi/parser.c index 9d3f2c08cbc..8c760f01b75 100644 --- a/reactos/lib/setupapi/parser.c +++ b/reactos/lib/setupapi/parser.c @@ -36,6 +36,7 @@ #include "winternl.h" #include "winerror.h" #include "setupapi.h" +#include "setupapi_private.h" #include "wine/unicode.h" #include "wine/debug.h" @@ -568,7 +569,7 @@ static void close_current_line( struct parser *parser ) static const WCHAR *line_start_state( struct parser *parser, const WCHAR *pos ) { const WCHAR *p; - + for (p = pos; !is_eof( parser, p ); p++) { switch(*p) @@ -795,7 +796,7 @@ static const WCHAR *quotes_state( struct parser *parser, const WCHAR *pos ) static const WCHAR *leading_spaces_state( struct parser *parser, const WCHAR *pos ) { const WCHAR *p; - + for (p = pos; !is_eol( parser, p ); p++) { if (*p == '\\') @@ -945,7 +946,7 @@ static struct inf_file *parse_file( HANDLE handle, const WCHAR *class, UINT *err file->string_pos = file->strings; file->strings_section = -1; - if (TRUE)//(!RtlIsTextUnicode( buffer, size, NULL )) // Fireball, 07 Feb 04, temp fix + if (!RtlIsTextUnicode( buffer, size, NULL )) { WCHAR *new_buff = HeapAlloc( GetProcessHeap(), 0, size * sizeof(WCHAR) ); if (new_buff) @@ -999,6 +1000,32 @@ const WCHAR *PARSER_get_src_root( HINF hinf ) } +/*********************************************************************** + * PARSER_get_dest_dir + * + * retrieve a destination dir of the form "dirid,relative_path" in the given entry. + * returned buffer must be freed by caller. + */ +WCHAR *PARSER_get_dest_dir( INFCONTEXT *context ) +{ + const WCHAR *dir; + WCHAR *ptr, *ret; + INT dirid; + DWORD len1, len2; + + if (!SetupGetIntField( context, 1, &dirid )) return NULL; + if (!(dir = DIRID_get_string( context->Inf, dirid ))) return NULL; + len1 = strlenW(dir) + 1; + if (!SetupGetStringFieldW( context, 2, NULL, 0, &len2 )) len2 = 0; + if (!(ret = HeapAlloc( GetProcessHeap(), 0, (len1+len2) * sizeof(WCHAR) ))) return NULL; + strcpyW( ret, dir ); + ptr = ret + strlenW(ret); + if (len2 && ptr > ret && ptr[-1] != '\\') *ptr++ = '\\'; + if (!SetupGetStringFieldW( context, 2, ptr, len2, NULL )) *ptr = 0; + return ret; +} + + /*********************************************************************** * SetupOpenInfFileA (SETUPAPI.@) */ @@ -1067,6 +1094,7 @@ HINF WINAPI SetupOpenInfFileW( PCWSTR name, PCWSTR class, DWORD style, UINT *err handle = CreateFileW( path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0 ); } } + if (handle != INVALID_HANDLE_VALUE) { file = parse_file( handle, class, error ); diff --git a/reactos/lib/setupapi/queue.c b/reactos/lib/setupapi/queue.c index d7578683ba1..38b11151e07 100644 --- a/reactos/lib/setupapi/queue.c +++ b/reactos/lib/setupapi/queue.c @@ -18,9 +18,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include "config.h" -#include "wine/port.h" - #include <stdarg.h> #include "windef.h" @@ -249,6 +246,22 @@ UINT CALLBACK QUEUE_callback_WtoA( void *context, UINT notification, MultiByteToWideChar( CP_ACP, 0, buffer, -1, (WCHAR *)old_param2, MAX_PATH ); break; + case SPFILENOTIFY_STARTREGISTRATION: + case SPFILENOTIFY_ENDREGISTRATION: + { + SP_REGISTER_CONTROL_STATUSW *statusW = (SP_REGISTER_CONTROL_STATUSW *)param1; + SP_REGISTER_CONTROL_STATUSA statusA; + + statusA.cbSize = sizeof(statusA); + statusA.FileName = strdupWtoA( statusW->FileName ); + statusA.Win32Error = statusW->Win32Error; + statusA.FailureCode = statusW->FailureCode; + ret = callback_ctx->orig_handler( callback_ctx->orig_context, notification, + (UINT_PTR)&statusA, param2 ); + HeapFree( GetProcessHeap(), 0, (LPSTR)statusA.FileName ); + } + break; + case SPFILENOTIFY_NEEDMEDIA: case SPFILENOTIFY_QUEUESCAN: FIXME("mapping for %d not implemented\n",notification); @@ -260,7 +273,7 @@ UINT CALLBACK QUEUE_callback_WtoA( void *context, UINT notification, ret = callback_ctx->orig_handler( callback_ctx->orig_context, notification, param1, param2 ); break; } - return ret; + return ret; } @@ -351,25 +364,11 @@ static WCHAR *get_destination_dir( HINF hinf, const WCHAR *section ) { static const WCHAR Dest[] = {'D','e','s','t','i','n','a','t','i','o','n','D','i','r','s',0}; static const WCHAR Def[] = {'D','e','f','a','u','l','t','D','e','s','t','D','i','r',0}; - - const WCHAR *dir; - WCHAR *ptr, *ret; INFCONTEXT context; - INT dirid; - DWORD len1, len2; if (!SetupFindFirstLineW( hinf, Dest, section, &context ) && !SetupFindFirstLineW( hinf, Dest, Def, &context )) return NULL; - if (!SetupGetIntField( &context, 1, &dirid )) return NULL; - if (!(dir = DIRID_get_string( hinf, dirid ))) return NULL; - len1 = strlenW(dir) + 1; - if (!SetupGetStringFieldW( &context, 2, NULL, 0, &len2 )) len2 = 0; - if (!(ret = HeapAlloc( GetProcessHeap(), 0, (len1+len2) * sizeof(WCHAR) ))) return NULL; - strcpyW( ret, dir ); - ptr = ret + strlenW(ret); - if (len2 && ptr > ret && ptr[-1] != '\\') *ptr++ = '\\'; - if (!SetupGetStringFieldW( &context, 2, ptr, len2, NULL )) *ptr = 0; - return ret; + return PARSER_get_dest_dir( &context ); } diff --git a/reactos/lib/setupapi/setupapi.rc b/reactos/lib/setupapi/setupapi.rc index e218c3c1910..d8edbda926b 100644 --- a/reactos/lib/setupapi/setupapi.rc +++ b/reactos/lib/setupapi/setupapi.rc @@ -1,38 +1,33 @@ -#include <defines.h> -#include <reactos/resource.h> +/* + * Top level resource file for SETUPX + * + * Copyright 2001 Andreas Mohr + * + * 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_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", "WINE IMM32 API Client DLL\0" - VALUE "FileVersion", RES_STR_FILE_VERSION - VALUE "InternalName", "imm32\0" - VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT - VALUE "OriginalFilename", "imm32.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 +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "winnls.h" +#include "setupapi_private.h" +#include "En.rc" +#include "Es.rc" +#include "Fr.rc" +#include "It.rc" +#include "Nl.rc" +#include "Pt.rc" +#include "Ru.rc" diff --git a/reactos/lib/setupapi/setupapi.spec b/reactos/lib/setupapi/setupapi.spec index fbd58dd929d..6f5413d1a30 100644 --- a/reactos/lib/setupapi/setupapi.spec +++ b/reactos/lib/setupapi/setupapi.spec @@ -27,9 +27,9 @@ @ stub GetSetFileTimestamp @ stub GetVersionInfoFromImage @ stub InfIsFromOemLocation -@ stdcall InstallHinfSection(long long str long) -@ stub InstallHinfSectionA -@ stub InstallHinfSectionW +@ stdcall InstallHinfSection(long long str long) InstallHinfSectionA +@ stdcall InstallHinfSectionA(long long str long) +@ stdcall InstallHinfSectionW(long long wstr long) @ stub InstallStop @ stub IsUserAdmin @ stub LookUpStringInTable @@ -50,7 +50,7 @@ @ stub RetrieveServiceConfig @ stub SearchForInfFile @ stub SetArrayToMultiSzValue -@ stub SetupAddInstallSectionToDiskSpaceListA +@ stdcall SetupAddInstallSectionToDiskSpaceListA(long long long str ptr long) @ stub SetupAddInstallSectionToDiskSpaceListW @ stub SetupAddSectionToDiskSpaceListA @ stub SetupAddSectionToDiskSpaceListW @@ -70,8 +70,8 @@ @ stub SetupCopyErrorW @ stdcall SetupCopyOEMInfA(str str long long ptr long ptr ptr) @ stub SetupCopyOEMInfW -@ stub SetupCreateDiskSpaceListA -@ stub SetupCreateDiskSpaceListW +@ stdcall SetupCreateDiskSpaceListA(ptr long long) +@ stdcall SetupCreateDiskSpaceListW(ptr long long) @ stub SetupDecompressOrCopyFileA @ stub SetupDecompressOrCopyFileW @ stub SetupDefaultQueueCallback @@ -79,7 +79,7 @@ @ stdcall SetupDefaultQueueCallbackW(ptr long long long) @ stub SetupDeleteErrorA @ stub SetupDeleteErrorW -@ stub SetupDestroyDiskSpaceList +@ stdcall SetupDestroyDiskSpaceList(long) @ stub SetupDiAskForOEMDisk @ stub SetupDiBuildClassInfoList @ stdcall SetupDiBuildClassInfoListExW(long ptr long ptr wstr ptr) @@ -195,7 +195,7 @@ @ stdcall SetupGetFileQueueFlags(long ptr) @ stub SetupGetInfFileListA @ stub SetupGetInfFileListW -@ stub SetupGetInfInformationA +@ stdcall SetupGetInfInformationA(ptr long ptr long ptr) @ stub SetupGetInfInformationW @ stdcall SetupGetIntField(ptr long ptr) @ stdcall SetupGetLineByIndexA(long str long ptr) @@ -218,8 +218,8 @@ @ stub SetupGetTargetPathW @ stdcall SetupInitDefaultQueueCallback(long) @ stdcall SetupInitDefaultQueueCallbackEx(long long long long ptr) -@ stub SetupInitializeFileLogA -@ stub SetupInitializeFileLogW +@ stdcall SetupInitializeFileLogA (str long) +@ stdcall SetupInitializeFileLogW (wstr long) @ stub SetupInstallFileA @ stub SetupInstallFileExA @ stub SetupInstallFileExW @@ -254,7 +254,7 @@ @ stub SetupQueryInfOriginalFileInformationW @ stub SetupQuerySourceListA @ stub SetupQuerySourceListW -@ stub SetupQuerySpaceRequiredOnDriveA +@ stdcall SetupQuerySpaceRequiredOnDriveA(long str ptr ptr long) @ stub SetupQuerySpaceRequiredOnDriveW @ stdcall SetupQueueCopyA(long str str str str str str str long) @ stdcall SetupQueueCopyIndirectA(ptr) @@ -297,7 +297,7 @@ @ stub SetupSetSourceListA @ stub SetupSetSourceListW @ stdcall SetupTermDefaultQueueCallback(ptr) -@ stub SetupTerminateFileLog +@ stdcall SetupTerminateFileLog(long) @ stub ShouldDeviceBeExcluded @ stub StampFileSecurity @ stub StringTableAddString diff --git a/reactos/lib/setupapi/setupapi_main.c b/reactos/lib/setupapi/setupapi_main.c deleted file mode 100644 index 441c5b8fbe6..00000000000 --- a/reactos/lib/setupapi/setupapi_main.c +++ /dev/null @@ -1,392 +0,0 @@ -/* - * SETUPAPI library functions - * 32-bit version of setupx_main.c - * - * Copyright 2004 Aleksey Bragin - * - * 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 <stdlib.h> -#include <stdarg.h> -#include <stdio.h> -#include <string.h> -#include "windef.h" -#include "winbase.h" -#include "winreg.h" -#include "winerror.h" -#include "wine/winuser16.h" -#include "wownt32.h" -#include "wingdi.h" -#include "winuser.h" -#include "winnls.h" -#include "setupapi.h" -#include "setupx16.h" -#include "setupapi_private.h" -#include "winerror.h" -#include "wine/debug.h" - -//WINE_DEFAULT_DEBUG_CHANNEL(setupapi); - -/* - * Returns pointer to a string list with the first entry being number - * of strings. - * - * Hmm. Should this be InitSubstrData(), GetFirstSubstr() and GetNextSubstr() - * instead? - */ -static LPSTR *SETUPX_GetSubStrings(LPSTR start, char delimiter) -{ - LPSTR p, q; - LPSTR *res = NULL; - DWORD count = 0; - int len; - - p = start; - - while (1) - { - /* find beginning of real substring */ - while ( (*p == ' ') || (*p == '\t') || (*p == '"') ) p++; - - /* find end of real substring */ - q = p; - while ( (*q) - && (*q != ' ') && (*q != '\t') && (*q != '"') - && (*q != ';') && (*q != delimiter) ) q++; - if (q == p) - break; - len = (int)q - (int)p; - - /* alloc entry for new substring in steps of 32 units and copy over */ - if (count % 32 == 0) - { /* 1 for count field + current count + 32 */ - if (res) - res = HeapReAlloc(GetProcessHeap(), 0, res, (1+count+32)*sizeof(LPSTR)); - else - res = HeapAlloc(GetProcessHeap(), 0, (1+count+32)*sizeof(LPSTR)); - } - *(res+1+count) = HeapAlloc(GetProcessHeap(), 0, len+1); - strncpy(*(res+1+count), p, len); - (*(res+1+count))[len] = '\0'; - count++; - - /* we are still within last substring (before delimiter), - * so get out of it */ - while ((*q) && (*q != ';') && (*q != delimiter)) q++; - if ((!*q) || (*q == ';')) - break; - p = q+1; - } - - /* put number of entries at beginning of list */ - *(DWORD *)res = count; - return res; -} - -static void SETUPX_FreeSubStrings(LPSTR *substr) -{ - DWORD count = *(DWORD *)substr; - LPSTR *pStrings = substr+1; - DWORD n; - - for (n=0; n < count; n++) - HeapFree(GetProcessHeap(), 0, *pStrings++); - - HeapFree(GetProcessHeap(), 0, substr); -} - -// Temp for debugging -#ifdef FIREBALL_DOING_DEBUG -int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, - LPSTR lpszCmdLine, int nCmdShow ) -{ - void WINAPI InstallHinfSection(HWND hwnd, HINSTANCE handle, LPCSTR lpszCmdLine, INT nCmdShow); - - InstallHinfSection(NULL, hInstance, lpszCmdLine, nCmdShow); - return 0; -} -#endif - - -/*********************************************************************** - * InstallHinfSection (SETUPAPI.@) - * - * hwnd = parent window - * handle = instance of SETUPAPI.DLL - * lpszCmdLine = e.g. "DefaultInstall 132 C:\MYINSTALL\MYDEV.INF" - * Here "DefaultInstall" is the .inf file section to be installed (optional). - * The 132 value is made of the HOW_xxx flags and sometimes 128 (-> setupx16.h). - * - * nCmdShow = nCmdShow of CreateProcess - */ - -// In development now, current status: -// Currently it does registry settings + file operations -// Registry settings tested -// File operations - not tested, just done according to MSDN (file queus) -// Flags - taken from WINE implementation - -void WINAPI InstallHinfSection(HWND hwnd, HINSTANCE handle, LPCSTR lpszCmdLine, INT nCmdShow) -{ - LPSTR *pSub; - DWORD count; - HINF hInf = 0; - WORD wFlags; - BOOL reboot = FALSE; - BOOL err; - HSPFILEQ fQueue; - PVOID cbContext; - - TRACE("(%04x, %04x, %s, %d);\n", hwnd, hinst, lpszCmdLine, nCmdShow); - - pSub = SETUPX_GetSubStrings((LPSTR)lpszCmdLine, ' '); - count = *(DWORD *)pSub; - - if (count < 2) /* invalid number of arguments ? */ - { - SETUPX_FreeSubStrings(pSub); - return; - } - - hInf = SetupOpenInfFileA(*(pSub+count), NULL, INF_STYLE_WIN4, NULL); - if (hInf == (HINF)INVALID_HANDLE_VALUE) - { - SetLastError(ERROR_FILE_NOT_FOUND); - SETUPX_FreeSubStrings(pSub); - return; - } - - // Deal with registry settings - err = SetupInstallFromInfSectionA(hwnd, hInf, (PCSTR)(*(pSub+1)), SPINST_ALL ^ SPINST_FILES/*flags*/, - NULL/*HKEY key_root*/, NULL/*PCWSTR src_root*/, 0/*UINT copy_flags*/, - NULL/*PSP_FILE_CALLBACK_W callback*/, NULL/*PVOID context*/, - NULL/*HDEVINFO devinfo*/, NULL/*PSP_DEVINFO_DATA devinfo_data*/); - - if (err) - { - // TODO: Show some message box saying installing from INF section has failed - // FIXME: Use strings from resources, and do it the way Windows does - MessageBox(hwnd, "InstallFromHinfSection", "Installing registry settings from an INF section failed", MB_OK); - - // release alloced memory - SetupCloseInfFile(hInf); - SETUPX_FreeSubStrings(pSub); - return; - } - - // Deal with files now - fQueue = SetupOpenFileQueue(); - - if (fQueue == INVALID_HANDLE_VALUE) - { - // TODO: Show some message box saying creating a file queue has failed - MessageBox(hwnd, "InstallFromHinfSection", "File queue opening failed", MB_OK); - - // release alloced memory - SetupCloseInfFile(hInf); - SETUPX_FreeSubStrings(pSub); - return; - } - - cbContext = SetupInitDefaultQueueCallback(hwnd); - - // Fullfill the file queue - //FIXME: Is the flag (SP_COPY_NEWER) right for this call? - SetupInstallFilesFromInfSectionA(hInf, /*HINF hlayout*/NULL, fQueue, - (PCSTR)(*(pSub+1)), /*PCSTR src_root*/NULL, SP_COPY_NEWER); - - err = SetupCommitFileQueueA(hwnd, fQueue, SetupDefaultQueueCallbackA, cbContext); - - - // Release all alloced handles and memory - SetupCloseFileQueue(fQueue); - SetupTermDefaultQueueCallback(cbContext); - SetupCloseInfFile(hInf); - SETUPX_FreeSubStrings(pSub); - - // Deal with flags now - wFlags = atoi(*(pSub+count-1)) & ~128; - switch (wFlags) - { - case HOW_ALWAYS_SILENT_REBOOT: - case HOW_SILENT_REBOOT: - reboot = TRUE; - break; - case HOW_ALWAYS_PROMPT_REBOOT: - case HOW_PROMPT_REBOOT: - // FIXME: What is the SetupPromptReboot() function is for? - // Anyway it isn't implemented - if (MessageBoxA(hwnd, "You must restart ReactOS before the new settings will take effect.\n\nDo you want to exit ReactOS now ?", "Systems Settings Change", MB_YESNO|MB_ICONQUESTION) == IDYES) - reboot = TRUE; - break; - default: - ERR("invalid flags %d !\n", wFlags); - return; - } - - if (reboot) - { - ExitWindowsEx(EWX_REBOOT, 0); - } -} - -typedef struct -{ - LPCSTR RegValName; - LPCSTR StdString; /* fallback string; sub dir of windows directory */ -} LDID_DATA; - -static const LDID_DATA LDID_Data[34] = -{ - { /* 0 (LDID_NULL) -- not defined */ - NULL, - NULL - }, - { /* 1 (LDID_SRCPATH) = source of installation. hmm, what to do here ? */ - "SourcePath", /* hmm, does SETUPX have to care about updating it ?? */ - NULL - }, - { /* 2 (LDID_SETUPTEMP) = setup temp dir */ - "SetupTempDir", - NULL - }, - { /* 3 (LDID_UNINSTALL) = uninstall backup dir */ - "UninstallDir", - NULL - }, - { /* 4 (LDID_BACKUP) = backup dir */ - "BackupDir", - NULL - }, - { /* 5 (LDID_SETUPSCRATCH) = setup scratch dir */ - "SetupScratchDir", - NULL - }, - { /* 6 -- not defined */ - NULL, - NULL - }, - { /* 7 -- not defined */ - NULL, - NULL - }, - { /* 8 -- not defined */ - NULL, - NULL - }, - { /* 9 -- not defined */ - NULL, - NULL - }, - { /* 10 (LDID_WIN) = windows dir */ - "WinDir", - "" - }, - { /* 11 (LDID_SYS) = system dir */ - "SysDir", - NULL /* call GetSystemDirectory() instead */ - }, - { /* 12 (LDID_IOS) = IOSubSys dir */ - NULL, /* FIXME: registry string ? */ - "SYSTEM\\IOSUBSYS" - }, - { /* 13 (LDID_CMD) = COMMAND dir */ - NULL, /* FIXME: registry string ? */ - "COMMAND" - }, - { /* 14 (LDID_CPL) = control panel dir */ - NULL, - "" - }, - { /* 15 (LDID_PRINT) = windows printer dir */ - NULL, - "SYSTEM" /* correct ?? */ - }, - { /* 16 (LDID_MAIL) = destination mail dir */ - NULL, - "" - }, - { /* 17 (LDID_INF) = INF dir */ - "SetupScratchDir", /* correct ? */ - "INF" - }, - { /* 18 (LDID_HELP) = HELP dir */ - NULL, /* ??? */ - "HELP" - }, - { /* 19 (LDID_WINADMIN) = Admin dir */ - "WinAdminDir", - "" - }, - { /* 20 (LDID_FONTS) = Fonts dir */ - NULL, /* ??? */ - "FONTS" - }, - { /* 21 (LDID_VIEWERS) = Viewers */ - NULL, /* ??? */ - "SYSTEM\\VIEWERS" - }, - { /* 22 (LDID_VMM32) = VMM32 dir */ - NULL, /* ??? */ - "SYSTEM\\VMM32" - }, - { /* 23 (LDID_COLOR) = ICM dir */ - "ICMPath", - "SYSTEM\\COLOR" - }, - { /* 24 (LDID_APPS) = root of boot drive ? */ - "AppsDir", - "C:\\" - }, - { /* 25 (LDID_SHARED) = shared dir */ - "SharedDir", - "" - }, - { /* 26 (LDID_WINBOOT) = Windows boot dir */ - "WinBootDir", - "" - }, - { /* 27 (LDID_MACHINE) = machine specific files */ - "MachineDir", - NULL - }, - { /* 28 (LDID_HOST_WINBOOT) = Host Windows boot dir */ - "HostWinBootDir", - NULL - }, - { /* 29 -- not defined */ - NULL, - NULL - }, - { /* 30 (LDID_BOOT) = Root of boot drive */ - "BootDir", - NULL - }, - { /* 31 (LDID_BOOT_HOST) = Root of boot drive host */ - "BootHost", - NULL - }, - { /* 32 (LDID_OLD_WINBOOT) = subdir of root */ - "OldWinBootDir", - NULL - }, - { /* 33 (LDID_OLD_WIN) = old win dir */ - "OldWinDir", - NULL - } - /* the rest (34-38) isn't too interesting, so I'll forget about it */ -}; diff --git a/reactos/lib/setupapi/setupapi_private.h b/reactos/lib/setupapi/setupapi_private.h index 443c3e4e73a..7cd40e4f146 100644 --- a/reactos/lib/setupapi/setupapi_private.h +++ b/reactos/lib/setupapi/setupapi_private.h @@ -38,6 +38,7 @@ extern unsigned int PARSER_string_substA( struct inf_file *file, const WCHAR *te extern unsigned int PARSER_string_substW( struct inf_file *file, const WCHAR *text, WCHAR *buffer, unsigned int size ); extern const WCHAR *PARSER_get_src_root( HINF hinf ); +extern WCHAR *PARSER_get_dest_dir( INFCONTEXT *context ); /* support for Ascii queue callback functions */ diff --git a/reactos/lib/setupapi/setupx.spec b/reactos/lib/setupapi/setupx.spec new file mode 100644 index 00000000000..be6bcfd640f --- /dev/null +++ b/reactos/lib/setupapi/setupx.spec @@ -0,0 +1,269 @@ +1 stub WEP +2 pascal -ret16 IpOpen(str ptr) IpOpen16 +3 stub IpOpenAppend #(str word) +4 pascal -ret16 IpClose(word) IpClose16 +5 stub IpGetLongField #(word ptr word ptr) +6 stub IpGetStringField #(word ptr word ptr word ptr) +7 stub IpFindFirstLine #(word str str ptr) +8 stub IpGetLineCount #(word str ptr) +9 stub IpGetFieldCount #(word ptr ptr) +10 stub IpGetIntField #(word ptr word ptr) +11 stub IpFindNextLine #(word ptr) +12 stub IpGetFileName #(word ptr word) +13 pascal -ret16 VcpQueueCopy(str str str str word word ptr word long) VcpQueueCopy16 +14 stub NOAUTORUNWNDPROC +15 stub __DEBUGMSG +16 stub __ASSERTMSG +17 pascal -ret16 VcpQueueDelete(str str word long) VcpQueueDelete16 +18 stub TpOpenFile #(str ptr word) +19 stub TpCloseFile #(word) +20 stub TpOpenSection #(word ptr str word) +21 stub TpCloseSection #(word) +22 stub TpCommitSection #(word word str word) +23 stub TpGetLine #(word str str word word ptr) +24 stub TpGetNextLine #(word str str ptr) +25 stub TpInsertLine #(word str str word word word) +26 stub TpReplaceLine #(word str str word word word) +27 stub TpDeleteLine #(word word word word) +28 stub TpMoveLine #(word word word word word word) +29 stub TpGetLineContents #(word ptr word ptr word word word) +30 stub TpGetPrivateProfileString #(str str str ptr word str) +31 stub TpWritePrivateProfileString #(str str str str) +32 stub TpGetProfileString #(str str str ptr word) +33 pascal -ret16 CtlSetLdd(ptr) CtlSetLdd16 +34 pascal -ret16 CtlGetLdd(ptr) CtlGetLdd16 +35 pascal -ret16 CtlFindLdd(ptr) CtlFindLdd16 +36 pascal -ret16 CtlAddLdd(ptr) CtlAddLdd16 +37 pascal -ret16 CtlDelLdd(word) CtlDelLdd16 +38 pascal -ret16 CtlGetLddPath(word ptr) CtlGetLddPath16 +39 stub SURegCloseKey #(word) +40 stub SURegCreateKey #(word) +41 stub SURegDeleteKey #(word str) +42 stub SURegDeleteValue #(word str) +43 stub SURegEnumKey #(word long ptr long) +44 stub SURegEnumValue #(word long str ptr ptr ptr ptr ptr) +45 stub SURegFlush #() +46 stub SURegInit #() +47 pascal SURegOpenKey(word str ptr) SURegOpenKey +48 stub SURegQueryValue +49 stub SURegQueryValue16 #(word str ptr ptr) +50 pascal SURegQueryValueEx(long str ptr ptr ptr ptr) SURegQueryValueEx +51 stub SURegSetValue +52 stub SURegSetValue16 #(word str long ptr long) +53 stub SURegSetValueEx #(word str long long ptr long) +54 stub SURegSaveKey #(word str ptr) +55 stub SURegLoadKey #(word str str) +56 stub SURegUnLoadKey #(word str) +60 stub DiskInfoFromLdid #(word ptr) +61 pascal suErrorToIds(word word) suErrorToIds16 +62 pascal -ret16 TPWriteProfileString(str str str) TPWriteProfileString16 +63 stub SURPLSETUP +# does SUSTORELDIDPATH set the path of an LDID in the registry ? +64 stub SUSTORELDIDPATH +65 stub WILDCARDSTRCMPI +101 pascal -ret16 GenInstall(word str word) GenInstall16 +102 stub GenWinInitRename #(str str word) +103 pascal GenFormStrWithoutPlaceHolders(str str word) GenFormStrWithoutPlaceHolders16 +104 stub SETUPX +105 stub CfgSetupMerge #(word) +106 stub INITDEPENDANTLDIDS +107 stub CFGOBJFINDKEYCMD +108 stub GenSURegSetValueEx +109 stub GENINSTALLWITHQUEUE +110 stub GenInstallEx #(word str word word ptr long) +111 stub GenCopyLogConfig2Reg #(word word str) +112 stub SUGetSetSetupFlags #(ptr word) +114 stub CFGPARSELINE # returns array +115 stub CFGSETAUTOPROCESS +116 stub CFGOBJTOSTR +117 stub CFGLNTOOBJ +118 stub MATCHCMDEXT +119 stub IpFindNextMatchLine #(word str ptr) +120 stub P_SETDEFAULTOPTION +121 stub CFGCLEANBOOT +122 stub CFGMATCHCMDEXT +123 stub CFGWASFILEUPDATED +124 stub AUTOMATCHCMDEXT +125 stub P_VALIDATEOC +126 stub GENMAPROOTREGSTR2KEY +127 stub P_CDROMOC +128 stub P_MEDIAOC +129 stub CFGCLEAN1STBOOT +130 stub suFormatMessage +131 stub suvFormatMessage #(word str str word ptr) +132 stub suFormatMessageBox +#133 stub suHelp # W98SE conflict !! +135 stub suHelp #(word word) +#135 stub P_WEBTVOC # W98SE conflict !! +136 stub P_WBEMOC +137 stub P_THEMESOC +138 stub P_IMAGINGOC +139 stub P_SCHEMESOC +140 stub suVerConflict #(word ptr word ptr) +141 stub suVerConflictInit #(word) +142 stub suVerConflictTerm #(ptr) +# Emergency Boot Disk +143 stub suCreateEBD #(word ptr long) +144 stub suCopyToEBD +145 stub sxIsMSDOS7Running #() +150 stub DS_INIT +151 stub DS_DESTROY +152 stub DS_SSYNCDRIVES +153 stub DS_GETDRIVEDATA +154 stub DS_ADDSECTION +155 stub DS_ENABLESECTION +156 stub DS_DISABLESECTION +157 stub DS_SETSWAPSIZE +158 stub DS_SETREQUIREDPAD +159 stub DS_SETAVAILABLEPAD +160 stub SXUPDATEDS +170 stub SUSETMEM +171 stub WriteDMFBootData #(word ptr word) +200 pascal VcpOpen(segptr ptr) VcpOpen16 +201 pascal VcpClose(word str) VcpClose16 +202 pascal -ret16 vcpDefCallbackProc(ptr word word long long) vcpDefCallbackProc16 +203 stub vcpEnumFiles #(ptr long) +204 pascal -ret16 VcpQueueRename(str str str str word word long) VcpQueueRename16 +205 pascal -ret16 vsmGetStringName(word ptr word) vsmGetStringName16 +206 pascal -ret16 vsmStringDelete(word) vsmStringDelete16 +207 pascal -ret16 vsmStringAdd(str) vsmStringAdd16 +208 pascal vsmGetStringRawName(word) vsmGetStringRawName16 +209 stub IpSaveRestorePosition #(word word) +210 pascal -ret16 IpGetProfileString(word str str ptr word) IpGetProfileString16 +211 stub IpOpenEx #(str ptr word) +212 stub IpOpenAppendEx #(str word word) +213 pascal -ret16 vcpUICallbackProc(ptr word word long long) vcpUICallbackProc16 +214 stub VcpAddMRUPath #(str) +300 pascal -ret16 DiBuildCompatDrvList (ptr) DiBuildCompatDrvList16 +301 pascal -ret16 DiBuildClassDrvList (ptr) DiBuildClassDrvList16 +302 stub DiDestroyDriverNodeList #(ptr) +303 pascal -ret16 DiCreateDeviceInfo (ptr str long long str str word) DiCreateDeviceInfo16 +304 pascal -ret16 DiGetClassDevs(ptr str word word) DiGetClassDevs16 +305 pascal -ret16 DiDestroyDeviceInfoList (ptr) DiDestroyDeviceInfoList16 +306 stub DiRemoveDevice #(ptr) +308 pascal -ret16 DiCallClassInstaller (word ptr) DiCallClassInstaller16 +309 stub DiCreateDriverNode #(ptr word word word str str str str str str long) +310 stub DiDrawMiniIcon +311 stub DiGetClassBitmapIndex #(str ptr) +312 stub DiSelectDevice #(ptr) +313 stub DiInstallDevice #(ptr) +314 stub DiLoadClassIcon #(str ptr ptr) +315 stub DiAskForOEMDisk #(ptr) +316 stub Display_SetMode #(ptr word word word) +317 stub Display_ClassInstaller #(word ptr) +318 pascal -ret16 DiCreateDevRegKey (ptr ptr word str word) DiCreateDevRegKey16 +319 pascal -ret16 DiOpenDevRegKey (ptr ptr word) DiOpenDevRegKey16 +320 stub DiInstallDrvSection #(str str str str long) +321 stub DiInstallClass #(str long) +322 stub DiOpenClassRegKey #(ptr str) +323 stub Display_SetFontSize #(str) +324 stub Display_OpenFontSizeKey #(ptr) +325 stub DiBuildClassDrvListFromOldInf #(ptr str ptr long) +326 stub DiIsThereNeedToCopy #(word long) +333 stub DiChangeState #(ptr long long long) +334 stub WALKSUBTREE +340 stub GetFctn #(word str str ptr ptr) +341 stub DiBuildClassInfoList #(ptr) +342 stub DiDestroyClassInfoList #(ptr) +343 stub DiGetDeviceClassInfo #(ptr ptr) +344 pascal -ret16 DiDeleteDevRegKey (ptr word) DiDeleteDevRegKey16 +350 stub DiSelectOEMDrv #(word ptr) +351 stub DiGetINFClass #(str word str long) +353 stub DIPICKBESTDRIVER +355 stub COPYINFFILE +360 stub GenInfLCToDevNode #(word str word word long) +361 stub GETDOSMESSAGE +362 stub Mouse_ClassInstaller #(word ptr) +363 stub sxCompareDosAppVer #(str str) +364 stub MONITOR_CLASSINSTALLER +365 stub FCEGETRESDESOFFSET +366 stub FCEGETALLOCVALUE +367 stub FCEADDRESDES +368 stub FCEDELETERESDES +369 stub FCEINIT +370 stub FCEGETRESDES +371 stub FCEGETFIRSTVALUE +372 stub FCEGETOTHERVALUE +373 stub FCEGETVALIDATEVALUE +374 stub FCEWRITETHISFORCEDCONFIGNOW +375 stub SUCreatePropertySheetPage #(ptr) +376 stub SUDestroyPropertySheetPage #(word) +377 stub SUPropertySheet #(ptr) +380 stub DiReadRegLogConf #(ptr str ptr ptr) +381 stub DiReadRegConf #(ptr ptr ptr long) +390 stub DiBuildPotentialDuplicatesList #(ptr ptr long ptr ptr) +395 stub InitSubstrData #(ptr str) +396 stub GetFirstSubstr #(ptr) +397 stub GetNextSubstr #(ptr) +398 stub INITSUBSTRDATAEX +400 stub bIsFileInVMM32 #(str) +401 stub DiInstallDriverFiles #(ptr) +405 stub DiBuildClassInfoListEx #(ptr long) +406 stub DiGetClassDevsEx #(ptr str str word word) +407 stub DiCopyRegSubKeyValue #(word str str str) +408 stub IPGETDRIVERDATE +409 stub IPGETDRIVERVERSION +410 stub IpGetVersionString #(str str ptr word str) +411 pascal VcpExplain(ptr long) VcpExplain16 +412 stub DiBuildDriverIndex #(word) +413 stub DiAddSingleInfToDrvIdx #(str word word) +414 stub FCEGETFLAGS +450 stub UiMakeDlgNonBold #(word) +451 stub UiDeleteNonBoldFont #(word) +500 stub SUEBDPAGE +501 stub SUOCPAGE +502 stub SXLISTSUBPROC +503 stub SXFILLLB +504 stub SXOCPAGEDLG +506 stub SXOCBATCHSETTINGS +507 stub SXOCFIXNEEDS +508 pascal -ret16 CtlSetLddPath(word str) CtlSetLddPath16 +509 stub SXCALLOCPROC +510 stub BUILDINFOCS +511 stub BUILDREGOCS +512 stub DELETEOCS +520 stub DiBuildClassDrvInfoList #(ptr) +521 stub DiBuildCompatDrvInfoList #(ptr) +522 stub DiDestroyDrvInfoList #(ptr) +523 stub DiConvertDriverInfoToDriverNode #(ptr ptr) +524 stub DISELECTBESTCOMPATDRV +525 stub FirstBootMoveToDOSSTART #(str word) +526 stub DOSOptEnableCurCfg #(str) +527 pascal -ret16 InstallHinfSection(word word str word) InstallHinfSection16 +528 stub SXMAKEUNCPATH +529 stub SXISSBSSERVERFILE +530 stub SXFINDBATCHFILES +531 stub ISPANEUROPEAN +532 stub UPGRADENIGGLINGS +533 stub DISPLAY_ISSECONDDISPLAY +534 stub ISWINDOWSFILE +540 stub VERIFYSELECTEDDRIVER +575 stub SXCALLMIGRATIONDLLS +576 stub SXCALLMIGRATIONDLLS_RUNDLL +600 stub PidConstruct #(str str str word) +601 stub PidValidate #(str str) +602 stub GETJAPANESEKEYBOARDTYPE +610 stub CRC32COMPUTE +621 stub SXSAVEINFO +622 stub SXADDPAGEEX +623 stub OPKREMOVEINSTALLEDNETDEVICE +640 stub DOFIRSTRUNSCREENS +700 stub SXSHOWREBOOTDLG +701 stub SXSHOWREBOOTDLG_RUNDLL +750 stub UIPOSITIONDIALOG +775 stub ASPICLEAN +800 stub EXTRACTCABFILE +825 stub PIDGEN3 +826 stub GETSETUPINFO +827 stub SETSETUPINFO +828 stub GETKEYBOARDOPTIONS +829 stub GETLOCALEOPTIONS +830 stub SETINTLOPTIONS +831 stub GETPRODUCTTYPE +832 stub ISOPKMODE +833 stub AUDITONETIMEINSTALL +834 stub DISKDUP +835 stub OPKPREINSTALL +836 stub ISAUDITMODE +837 stub ISAUDITAUTO +838 stub GETVALIDEULA diff --git a/reactos/lib/setupapi/setupx_main.c b/reactos/lib/setupapi/setupx_main.c index 4f5b9525c3b..ca3ac711792 100644 --- a/reactos/lib/setupapi/setupx_main.c +++ b/reactos/lib/setupapi/setupx_main.c @@ -76,6 +76,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(setupapi); +#define HINSTANCE_32(h16) ((HINSTANCE)(ULONG_PTR)(h16)) + /*********************************************************************** * SURegOpenKey (SETUPX.47) */ @@ -98,74 +100,6 @@ DWORD WINAPI SURegQueryValueEx( HKEY hkey, LPSTR lpszValueName, lpbData, lpcbData ); } -/* - * Returns pointer to a string list with the first entry being number - * of strings. - * - * Hmm. Should this be InitSubstrData(), GetFirstSubstr() and GetNextSubstr() - * instead? - */ -static LPSTR *SETUPX_GetSubStrings(LPSTR start, char delimiter) -{ - LPSTR p, q; - LPSTR *res = NULL; - DWORD count = 0; - int len; - - p = start; - - while (1) - { - /* find beginning of real substring */ - while ( (*p == ' ') || (*p == '\t') || (*p == '"') ) p++; - - /* find end of real substring */ - q = p; - while ( (*q) - && (*q != ' ') && (*q != '\t') && (*q != '"') - && (*q != ';') && (*q != delimiter) ) q++; - if (q == p) - break; - len = (int)q - (int)p; - - /* alloc entry for new substring in steps of 32 units and copy over */ - if (count % 32 == 0) - { /* 1 for count field + current count + 32 */ - if (res) - res = HeapReAlloc(GetProcessHeap(), 0, res, (1+count+32)*sizeof(LPSTR)); - else - res = HeapAlloc(GetProcessHeap(), 0, (1+count+32)*sizeof(LPSTR)); - } - *(res+1+count) = HeapAlloc(GetProcessHeap(), 0, len+1); - strncpy(*(res+1+count), p, len); - (*(res+1+count))[len] = '\0'; - count++; - - /* we are still within last substring (before delimiter), - * so get out of it */ - while ((*q) && (*q != ';') && (*q != delimiter)) q++; - if ((!*q) || (*q == ';')) - break; - p = q+1; - } - - /* put number of entries at beginning of list */ - *(DWORD *)res = count; - return res; -} - -static void SETUPX_FreeSubStrings(LPSTR *substr) -{ - DWORD count = *(DWORD *)substr; - LPSTR *pStrings = substr+1; - DWORD n; - - for (n=0; n < count; n++) - HeapFree(GetProcessHeap(), 0, *pStrings++); - - HeapFree(GetProcessHeap(), 0, substr); -} - /*********************************************************************** * InstallHinfSection (SETUPX.527) @@ -180,63 +114,8 @@ static void SETUPX_FreeSubStrings(LPSTR *substr) */ RETERR16 WINAPI InstallHinfSection16( HWND16 hwnd, HINSTANCE16 hinst, LPCSTR lpszCmdLine, INT16 nCmdShow) { - LPSTR *pSub; - DWORD count; - HINF16 hInf = 0; - RETERR16 res = OK, tmp; - WORD wFlags; - BOOL reboot = FALSE; - - TRACE("(%04x, %04x, %s, %d);\n", hwnd, hinst, lpszCmdLine, nCmdShow); - - pSub = SETUPX_GetSubStrings((LPSTR)lpszCmdLine, ' '); - - count = *(DWORD *)pSub; - if (count < 2) /* invalid number of arguments ? */ - goto end; - if (IpOpen16(*(pSub+count), &hInf) != OK) - { - res = ERROR_FILE_NOT_FOUND; /* yes, correct */ - goto end; - } - if (VcpOpen16(NULL, 0)) - goto end; - if (GenInstall16(hInf, *(pSub+count-2), GENINSTALL_DO_ALL) != OK) - goto end; - wFlags = atoi(*(pSub+count-1)) & ~128; - switch (wFlags) - { - case HOW_ALWAYS_SILENT_REBOOT: - case HOW_SILENT_REBOOT: - reboot = TRUE; - break; - case HOW_ALWAYS_PROMPT_REBOOT: - case HOW_PROMPT_REBOOT: - if (MessageBoxA(HWND_32(hwnd), "You must restart Wine before the new settings will take effect.\n\nDo you want to exit Wine now ?", "Systems Settings Change", MB_YESNO|MB_ICONQUESTION) == IDYES) - reboot = TRUE; - break; - default: - ERR("invalid flags %d !\n", wFlags); - goto end; - } - - res = OK; -end: - tmp = VcpClose16(VCPFL_ALL, NULL); - if (tmp != OK) - res = tmp; - tmp = IpClose16(hInf); - if (tmp != OK) - res = tmp; - SETUPX_FreeSubStrings(pSub); - if (reboot) - { - /* FIXME: we should have a means of terminating all wine + wineserver */ - MESSAGE("Program or user told me to restart. Exiting Wine...\n"); - ExitProcess(1); - } - - return res; + InstallHinfSectionA( HWND_32(hwnd), HINSTANCE_32(hinst), lpszCmdLine, nCmdShow ); + return OK; } typedef struct diff --git a/reactos/lib/setupapi/stubs.c b/reactos/lib/setupapi/stubs.c index 4208acb0a5f..8465b35f9fa 100644 --- a/reactos/lib/setupapi/stubs.c +++ b/reactos/lib/setupapi/stubs.c @@ -186,4 +186,43 @@ BOOL WINAPI SetupCopyOEMInfA(PCSTR sourceinffile, PCSTR sourcemedialoc, { FIXME("stub: source %s location %s...\n",sourceinffile, sourcemedialoc); return FALSE; -} \ No newline at end of file +} + +/*********************************************************************** + * SetupGetInfInformationA (SETUPAPI.@) + */ +BOOL WINAPI SetupGetInfInformationA( LPCVOID InfSpec, DWORD SearchControl, + PSP_INF_INFORMATION ReturnBuffer, + DWORD ReturnBufferSize, PDWORD RequiredSize) +{ + FIXME("(%p, %ld, %p, %ld, %p) Stub!\n", + InfSpec, SearchControl, ReturnBuffer, ReturnBufferSize, RequiredSize ); + return TRUE; +} + +/*********************************************************************** + * SetupInitializeFileLogW(SETUPAPI.@) + */ +HANDLE WINAPI SetupInitializeFileLogW(LPWSTR LogFileName, DWORD Flags) +{ + FIXME("Stub %s, 0x%lx\n",debugstr_w(LogFileName),Flags); + return INVALID_HANDLE_VALUE; +} + +/*********************************************************************** + * SetupInitializeFileLogA(SETUPAPI.@) + */ +HANDLE WINAPI SetupInitializeFileLogA(LPSTR LogFileName, DWORD Flags) +{ + FIXME("Stub %s, 0x%lx\n",debugstr_a(LogFileName),Flags); + return INVALID_HANDLE_VALUE; +} + +/*********************************************************************** + * SetupTerminateFileLog(SETUPAPI.@) + */ +BOOL WINAPI SetupTerminateFileLog(HANDLE FileLogHandle) +{ + FIXME ("Stub %p\n",FileLogHandle); + return TRUE; +} From 6a7304ac0199b7496e66fd300e93a73e14a47005 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 21 Mar 2004 00:31:14 +0000 Subject: [PATCH 0591/1463] configuration dialog for notification icons svn path=/trunk/; revision=8823 --- .../system/explorer/dialogs/searchprogram.cpp | 33 +- .../system/explorer/dialogs/searchprogram.h | 4 +- .../system/explorer/dialogs/settings.cpp | 40 +- .../subsys/system/explorer/dialogs/settings.h | 4 +- reactos/subsys/system/explorer/explorer.cpp | 14 + reactos/subsys/system/explorer/explorer.dsp | 32 ++ reactos/subsys/system/explorer/explorer.h | 2 + .../subsys/system/explorer/explorer_intres.h | 28 +- .../subsys/system/explorer/explorer_intres.rc | 341 ++++++++++------ reactos/subsys/system/explorer/globals.h | 7 + reactos/subsys/system/explorer/res/dot.ico | Bin 0 -> 3750 bytes .../subsys/system/explorer/res/dot_red.ico | Bin 0 -> 3750 bytes .../subsys/system/explorer/res/dot_trans.ico | Bin 0 -> 3750 bytes .../system/explorer/shell/shellbrowser.cpp | 26 +- .../system/explorer/taskbar/desktopbar.cpp | 5 + .../system/explorer/taskbar/desktopbar.h | 2 - .../system/explorer/taskbar/quicklaunch.h | 1 - .../system/explorer/taskbar/taskbar.cpp | 32 +- .../system/explorer/taskbar/traynotify.cpp | 379 ++++++++++++++++-- .../system/explorer/taskbar/traynotify.h | 74 ++-- .../subsys/system/explorer/utility/window.cpp | 45 ++- .../subsys/system/explorer/utility/window.h | 15 + 22 files changed, 826 insertions(+), 258 deletions(-) create mode 100644 reactos/subsys/system/explorer/res/dot.ico create mode 100644 reactos/subsys/system/explorer/res/dot_red.ico create mode 100644 reactos/subsys/system/explorer/res/dot_trans.ico diff --git a/reactos/subsys/system/explorer/dialogs/searchprogram.cpp b/reactos/subsys/system/explorer/dialogs/searchprogram.cpp index 83ae75e8bf6..8b8e28327d9 100644 --- a/reactos/subsys/system/explorer/dialogs/searchprogram.cpp +++ b/reactos/subsys/system/explorer/dialogs/searchprogram.cpp @@ -94,7 +94,6 @@ void CollectProgramsThread::free_dirs() FindProgramDlg::FindProgramDlg(HWND hwnd) : super(hwnd), _list_ctrl(GetDlgItem(hwnd, IDC_MAILS_FOUND)), - //_himl(ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR32, 0, 0)), _thread(collect_programs_callback, hwnd, this), _sort(_list_ctrl, CompareFunc/*, (LPARAM)this*/) { @@ -108,8 +107,6 @@ FindProgramDlg::FindProgramDlg(HWND hwnd) _haccel = LoadAccelerators(g_Globals._hInstance, MAKEINTRESOURCE(IDA_SEARCH_PROGRAM)); ListView_SetImageList(_list_ctrl, g_Globals._icon_cache.get_sys_imagelist(), LVSIL_SMALL); - //ListView_SetImageList(_list_ctrl, _himl, LVSIL_SMALL); - //_idxNoIcon = ImageList_AddIcon(_himl, SmallIcon(IDI_APPICON)); LV_COLUMN column = {LVCF_FMT|LVCF_WIDTH|LVCF_TEXT, LVCFMT_LEFT, 250}; @@ -137,11 +134,13 @@ FindProgramDlg::FindProgramDlg(HWND hwnd) CenterWindow(hwnd); Refresh(); + + register_pretranslate(hwnd); } FindProgramDlg::~FindProgramDlg() { - //ImageList_Destroy(_himl); + unregister_pretranslate(_hwnd); } @@ -261,6 +260,24 @@ void FindProgramDlg::add_entry(const FPDEntry& cache_entry) ListView_SetItem(_list_ctrl, &item); } +LRESULT FindProgramDlg::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + switch(nmsg) { + case PM_TRANSLATE_MSG: { + MSG* pmsg = (MSG*) lparam; + + if (TranslateAccelerator(_hwnd, _haccel, pmsg)) + return TRUE; + + return FALSE;} + + default: + return super::WndProc(nmsg, wparam, lparam); + } + + return 0; +} + int FindProgramDlg::Command(int id, int code) { if (code == BN_CLICKED) { @@ -277,7 +294,7 @@ int FindProgramDlg::Command(int id, int code) return super::Command(id, code); } - return TRUE; + return 0; } else if (code == EN_CHANGE) { switch(id) { @@ -286,10 +303,10 @@ int FindProgramDlg::Command(int id, int code) break; } - return TRUE; + return 0; } - return FALSE; + return 1; } void FindProgramDlg::LaunchSelected() @@ -326,7 +343,7 @@ int FindProgramDlg::Notify(int id, NMHDR* pnmh) if (entry->_icon_id == ICID_UNKNOWN) entry->extract_icon(); - pDispInfo->item.iImage = g_Globals._icon_cache.get_icon(entry->_icon_id).get_sysiml_idx();//ImageList_AddIcon(_himl, g_Globals._icon_cache.get_icon(entry->_icon_id).get_hicon()); + pDispInfo->item.iImage = g_Globals._icon_cache.get_icon(entry->_icon_id).get_sysiml_idx(); pDispInfo->item.mask |= LVIF_DI_SETITEM; return 1; diff --git a/reactos/subsys/system/explorer/dialogs/searchprogram.h b/reactos/subsys/system/explorer/dialogs/searchprogram.h index 52e493f67a6..73d84b53768 100644 --- a/reactos/subsys/system/explorer/dialogs/searchprogram.h +++ b/reactos/subsys/system/explorer/dialogs/searchprogram.h @@ -85,11 +85,8 @@ struct FindProgramDlg : public ResizeController<Dialog> ~FindProgramDlg(); protected: - CommonControlInit _usingCmnCtrl; HWND _list_ctrl; HACCEL _haccel; - //HIMAGELIST _himl; - //int _idxNoIcon; // replacement icon String _lwr_filter; CollectProgramsThread _thread; @@ -99,6 +96,7 @@ protected: ListSort _sort; + virtual LRESULT WndProc(UINT, WPARAM, LPARAM); virtual int Command(int id, int code); virtual int Notify(int id, NMHDR* pnmh); diff --git a/reactos/subsys/system/explorer/dialogs/settings.cpp b/reactos/subsys/system/explorer/dialogs/settings.cpp index 3663748384e..0a6eddd37ec 100644 --- a/reactos/subsys/system/explorer/dialogs/settings.cpp +++ b/reactos/subsys/system/explorer/dialogs/settings.cpp @@ -35,6 +35,7 @@ #include "../externals.h" #include "../explorer_intres.h" #include "../desktop/desktop.h" +#include "../taskbar/traynotify.h" #include "settings.h" @@ -136,10 +137,10 @@ int DesktopSettingsDlg::Command(int id, int code) SendMessage(g_Globals._hwndShellView, PM_SET_ICON_ALGORITHM, alignment, 0); } - return TRUE; + return 0; } - return FALSE; + return 1; } @@ -148,19 +149,15 @@ TaskbarSettingsDlg::TaskbarSettingsDlg(HWND hwnd) { } -LRESULT TaskbarSettingsDlg::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +int TaskbarSettingsDlg::Command(int id, int code) { - switch(nmsg) { - case WM_PAINT: { - PaintCanvas canvas(_hwnd); - FillRect(canvas, &canvas.rcPaint, GetStockBrush(GRAY_BRUSH)); - break;} - - default: - return super::WndProc(nmsg, wparam, lparam); + switch(id) { + case ID_CONFIG_NOTIFYAREA: + Dialog::DoModal(IDD_NOTIFYAREA, WINDOW_CREATOR(TrayNotifyDlg), _hwnd); + return 0; } - return 0; + return 1; } @@ -169,17 +166,14 @@ StartmenuSettingsDlg::StartmenuSettingsDlg(HWND hwnd) { } -LRESULT StartmenuSettingsDlg::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +int StartmenuSettingsDlg::Command(int id, int code) { - switch(nmsg) { - case WM_PAINT: { - PaintCanvas canvas(_hwnd); - FillRect(canvas, &canvas.rcPaint, GetStockBrush(DKGRAY_BRUSH)); - break;} - - default: - return super::WndProc(nmsg, wparam, lparam); +/* + switch(id) { + case ID_CONFIG_NOTIFYAREA: + Dialog::DoModal(IDD_NOTIFYAREA, WINDOW_CREATOR(TrayNotifyDlg), _hwnd); + return 0; } - - return 0; +*/ + return 1; } diff --git a/reactos/subsys/system/explorer/dialogs/settings.h b/reactos/subsys/system/explorer/dialogs/settings.h index b3deba1daf6..88bcd4e4567 100644 --- a/reactos/subsys/system/explorer/dialogs/settings.h +++ b/reactos/subsys/system/explorer/dialogs/settings.h @@ -66,7 +66,7 @@ struct TaskbarSettingsDlg : public PropSheetPageDlg TaskbarSettingsDlg(HWND hwnd); - LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + virtual int Command(int id, int code); }; @@ -77,5 +77,5 @@ struct StartmenuSettingsDlg : public PropSheetPageDlg StartmenuSettingsDlg(HWND hwnd); - LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + virtual int Command(int id, int code); }; diff --git a/reactos/subsys/system/explorer/explorer.cpp b/reactos/subsys/system/explorer/explorer.cpp index 1f136e67cdc..a542ffe9c04 100644 --- a/reactos/subsys/system/explorer/explorer.cpp +++ b/reactos/subsys/system/explorer/explorer.cpp @@ -254,6 +254,17 @@ HBITMAP create_bitmap_from_icon(HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd) return hbmp; } +int ImageList_AddAlphaIcon(HIMAGELIST himl, HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd) +{ + HBITMAP hbmp = create_bitmap_from_icon(hIcon, hbrush_bkgnd, hdc_wnd); + + int ret = ImageList_Add(himl, hbmp, 0); + + DeleteObject(hbmp); + + return ret; +} + int IconCache::s_next_id = ICID_DYNAMIC; @@ -732,6 +743,9 @@ int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdL // initialize COM and OLE before creating the desktop window OleInit usingCOM; + // init common controls library + CommonControlInit usingCmnCtrl; + if (startup_desktop) { g_Globals._desktops.init(); diff --git a/reactos/subsys/system/explorer/explorer.dsp b/reactos/subsys/system/explorer/explorer.dsp index 35d182f529f..c90b07e2882 100644 --- a/reactos/subsys/system/explorer/explorer.dsp +++ b/reactos/subsys/system/explorer/explorer.dsp @@ -369,6 +369,18 @@ SOURCE=.\res\documents.ico # End Source File # Begin Source File +SOURCE=.\res\dot.ico +# End Source File +# Begin Source File + +SOURCE=.\res\dot_red.ico +# End Source File +# Begin Source File + +SOURCE=.\res\dot_trans.ico +# End Source File +# Begin Source File + SOURCE=.\res\drivebar.bmp # End Source File # Begin Source File @@ -446,6 +458,10 @@ SOURCE=.\res\icoalig9.bmp # End Source File # Begin Source File +SOURCE=.\res\icon.ico +# End Source File +# Begin Source File + SOURCE=.\res\images.bmp # End Source File # Begin Source File @@ -474,6 +490,18 @@ SOURCE=.\res\network.ico # End Source File # Begin Source File +SOURCE=.\res\notify.ico +# End Source File +# Begin Source File + +SOURCE=.\res\notify_h.ico +# End Source File +# Begin Source File + +SOURCE=.\res\notify_t.ico +# End Source File +# Begin Source File + SOURCE=.\res\printer.ico # End Source File # Begin Source File @@ -518,6 +546,10 @@ SOURCE=.\taskbar\desktopbar.h # End Source File # Begin Source File +SOURCE=.\notifyhook\notifyhook.h +# End Source File +# Begin Source File + SOURCE=.\taskbar\quicklaunch.cpp # End Source File # Begin Source File diff --git a/reactos/subsys/system/explorer/explorer.h b/reactos/subsys/system/explorer/explorer.h index b46f54e05ab..31c341e7ab4 100644 --- a/reactos/subsys/system/explorer/explorer.h +++ b/reactos/subsys/system/explorer/explorer.h @@ -54,6 +54,8 @@ #define PM_RESIZE_CHILDREN (WM_APP+0x17) #define PM_GET_WIDTH (WM_APP+0x18) +#define PM_REFRESH (WM_APP+0x1B) + #define CLASSNAME_FRAME TEXT("CabinetWClass") // same class name for frame window as in MS Explorer diff --git a/reactos/subsys/system/explorer/explorer_intres.h b/reactos/subsys/system/explorer/explorer_intres.h index 52630a24f5d..f58d5577221 100644 --- a/reactos/subsys/system/explorer/explorer_intres.h +++ b/reactos/subsys/system/explorer/explorer_intres.h @@ -37,6 +37,13 @@ #define IDS_MINIMIZE_ALL 33 #define IDS_DESKTOP_NUM 34 #define IDS_VOLUME 35 +#define IDS_ITEMS_CUR 36 +#define IDS_ITEMS_CONFIGURED 37 +#define IDS_ITEMS_VISIBLE 38 +#define IDS_ITEMS_HIDDEN 39 +#define IDS_NOTIFY_SHOW 40 +#define IDS_NOTIFY_HIDE 41 +#define IDS_NOTIFY_AUTOHIDE 42 #define IDI_REACTOS 100 #define IDI_EXPLORER 101 #define IDI_STARTMENU 102 @@ -60,6 +67,7 @@ #define IDB_LOGOV256 130 #define IDA_SEARCH_PROGRAM 133 #define IDI_APPICON 134 +#define IDA_TRAYNOTIFY 134 #define IDI_FLOATING 135 #define IDD_ABOUT_EXPLORER 135 #define IDI_REACTOS_BIG 137 @@ -83,6 +91,7 @@ #define IDD_DESKBAR_STARTMENU 154 #define IDB_ICON_ALIGN_1 154 #define IDB_ICON_ALIGN_2 155 +#define IDD_NOTIFYAREA 155 #define IDB_ICON_ALIGN_3 156 #define IDB_ICON_ALIGN_4 157 #define IDB_ICON_ALIGN_5 158 @@ -92,7 +101,10 @@ #define IDB_ICON_ALIGN_9 162 #define IDI_SPEAKER 162 #define IDB_ICON_ALIGN_10 163 +#define IDI_DOT 163 #define IDB_LOGOV16 164 +#define IDI_DOT_TRANS 164 +#define IDI_DOT_RED 165 #define ID_VIEW_NAME 401 #define ID_VIEW_ALL_ATTRIBUTES 402 #define ID_VIEW_SELECTED_ATTRIBUTES 403 @@ -103,19 +115,31 @@ #define IDC_ROS_EXPLORER 1000 #define IDC_ICON_ALIGN_0 1002 #define IDC_ICON_ALIGN_1 1003 +#define IDC_NOTIFY_ICONS 1003 #define IDC_ICON_ALIGN_2 1004 #define IDC_ICON_ALIGN_3 1005 #define IDC_ICON_ALIGN_4 1006 +#define IDC_NOTIFY_TOOLTIP 1006 #define IDC_ICON_ALIGN_5 1007 +#define IDC_NOTIFY_TITLE 1007 #define IDC_ICON_ALIGN_6 1008 +#define IDC_NOTIFY_MODULE 1008 #define IDC_ICON_ALIGN_7 1009 +#define IDC_LABEL1 1009 #define IDC_ICON_ALIGN_8 1010 +#define IDC_LABEL2 1010 #define IDC_ICON_ALIGN_9 1011 +#define IDC_LABEL3 1011 #define IDC_ICON_ALIGN_10 1012 #define IDC_WWW 1012 #define IDC_ICON_ALIGN_11 1013 #define IDC_TOPIC 1017 #define IDC_MAILS_FOUND 1018 +#define IDC_PICTURE 1019 +#define IDC_NOTIFY_SHOW 1020 +#define IDC_NOTIFY_HIDE 1021 +#define IDC_NOTIFY_AUTOHIDE 1022 +#define IDC_LABEL4 1023 #define ID_REFRESH 1704 #define ID_ABOUT_WINEFILE 1705 #define IDC_FILETREE 10001 @@ -165,9 +189,9 @@ // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 163 +#define _APS_NEXT_RESOURCE_VALUE 166 #define _APS_NEXT_COMMAND_VALUE 40019 -#define _APS_NEXT_CONTROL_VALUE 1003 +#define _APS_NEXT_CONTROL_VALUE 1024 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/reactos/subsys/system/explorer/explorer_intres.rc b/reactos/subsys/system/explorer/explorer_intres.rc index 07f108bdc8d..e1685e8d92e 100644 --- a/reactos/subsys/system/explorer/explorer_intres.rc +++ b/reactos/subsys/system/explorer/explorer_intres.rc @@ -133,6 +133,13 @@ BEGIN IDS_MINIMIZE_ALL "mimimize all windows" IDS_DESKTOP_NUM "Desktop %d" IDS_VOLUME "Volume" + IDS_ITEMS_CUR "current items" + IDS_ITEMS_CONFIGURED "configuration" + IDS_ITEMS_VISIBLE "visible" + IDS_ITEMS_HIDDEN "hidden" + IDS_NOTIFY_SHOW "show" + IDS_NOTIFY_HIDE "hide" + IDS_NOTIFY_AUTOHIDE "autohide" END #endif // Romanian resources @@ -177,6 +184,11 @@ BEGIN VK_F5, ID_REFRESH, VIRTKEY, NOINVERT END +IDA_TRAYNOTIFY ACCELERATORS DISCARDABLE +BEGIN + VK_F5, ID_REFRESH, VIRTKEY, NOINVERT +END + #endif // Neutral resources ///////////////////////////////////////////////////////////////////////////// @@ -445,6 +457,9 @@ IDI_PRINTER ICON DISCARDABLE "res/printer.ico" IDI_NETWORK ICON DISCARDABLE "res/network.ico" IDI_COMPUTER ICON DISCARDABLE "res/computer.ico" IDI_SPEAKER ICON DISCARDABLE "res/speaker.ico" +IDI_DOT ICON DISCARDABLE "res/dot.ico" +IDI_DOT_TRANS ICON DISCARDABLE "res/dot_trans.ico" +IDI_DOT_RED ICON DISCARDABLE "res/dot_red.ico" ///////////////////////////////////////////////////////////////////////////// // @@ -516,6 +531,13 @@ BEGIN IDS_MINIMIZE_ALL "alle Fenster minimieren" IDS_DESKTOP_NUM "Desktop %d" IDS_VOLUME "Lautst鋜ke" + IDS_ITEMS_CUR "aktuelle Icons" + IDS_ITEMS_CONFIGURED "Konfiguratrion" + IDS_ITEMS_VISIBLE "sichtbar" + IDS_ITEMS_HIDDEN "unsichtbar" + IDS_NOTIFY_SHOW "sichtbar" + IDS_NOTIFY_HIDE "versteckt" + IDS_NOTIFY_AUTOHIDE "automatisch" END #endif // German (Germany) resources @@ -523,138 +545,11 @@ END ///////////////////////////////////////////////////////////////////////////// -// French (France) resources +// English (U.S.) resources -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FRA) +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 -LANGUAGE LANG_FRENCH, SUBLANG_FRENCH -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDM_MAINFRAME MENU PRELOAD DISCARDABLE -BEGIN - POPUP "&Fichier" - BEGIN - MENUITEM "&Fermer", ID_FILE_EXIT - END - POPUP "&Affichage" - BEGIN - MENUITEM "Barre d'&outils", ID_VIEW_TOOL_BAR - MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR - MENUITEM "&Drivebar", ID_VIEW_DRIVE_BAR, CHECKED - MENUITEM "Barre d'&閠at", ID_VIEW_STATUSBAR - MENUITEM SEPARATOR - MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN - END - POPUP "&Window" - BEGIN - MENUITEM "New &Window", ID_WINDOW_NEW - MENUITEM "Cascading\tShift+F5", ID_WINDOW_CASCADE - MENUITEM "Tile &Horizontally", ID_WINDOW_TILE_HORZ - MENUITEM "Tile &Vertically\tShift+F4", ID_WINDOW_TILE_VERT - MENUITEM "Arrange Automatically", ID_WINDOW_AUTOSORT - MENUITEM "Arrange &Symbols", ID_WINDOW_ARRANGE - MENUITEM "&Refresh\tF5", ID_REFRESH - END - POPUP "A&ide" - BEGIN - MENUITEM "&FAQ Explorateur...", ID_EXPLORER_FAQ - MENUITEM "A propos de l'&explorateur...", ID_ABOUT_WINDOWS - MENUITEM "A propos de l'&OS...", 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 "&OK",1,158,6,47,14 - PUSHBUTTON "&Cancel",2,158,23,47,14 - PUSHBUTTON "&Help",254,158,43,47,14 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TITLE "Explorateur Reactos" - IDS_START "D閙arrer" - IDS_LOGOFF "D閏onnexion ..." - IDS_SHUTDOWN "Arr阾er..." - IDS_LAUNCH "Ex閏uter..." - IDS_START_HELP "Aide" - IDS_SEARCH_FILES "Rechercher Fichiers..." - IDS_DOCUMENTS "Documents" - IDS_FAVORITES "Favoris" - IDS_PROGRAMS "Programmes" - IDS_SETTINGS "Param鑤res" - IDS_EXPLORE "Explorer" - IDS_EMPTY "(Vide)" - IDS_RECENT "Documents r閏ents" - IDS_ADMIN "Administration" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_NETWORK "R閟eaux" - IDS_CONNECTIONS "Connexions r閟eaux" - IDS_DRIVES "Disques" - IDS_SEARCH_COMPUTER "Recherche Ordinateurs..." - IDS_SETTINGS_MENU "Barre des t鈉hes et menu d閙arrer" - IDS_CONTROL_PANEL "Panneau de configuration" - IDS_PRINTERS "Imprimantes" - IDS_BROWSE "Parcourir" - IDS_SEARCH_PRG "Recherche Programme..." - IDS_ALL_USERS "Tous les utilisateurs\\" - IDS_SEARCH "Rechercher" - IDS_ABOUT_EXPLORER "A propos de l'explorateur..." - IDS_LAUNCH_MANY_PROGRAMS - "You have selected more than one program.\nAre you sure you want to launch all of them?" - IDS_DESKTOPBAR_SETTINGS "Bureau" - IDS_DESKTOP "Bureau" - IDS_TASKBAR "Taskbar" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_STARTMENU "Startmenu" - IDS_MINIMIZE_ALL "mimimize all windows" - IDS_DESKTOP_NUM "Bureau %d" - IDS_VOLUME "Volume" -END - -#endif // French (France) resources -///////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////// -// English (U.K.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 @@ -911,6 +806,7 @@ STYLE WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Taskbar Properties" FONT 8, "MS Sans Serif" BEGIN + PUSHBUTTON "&Notifications...",ID_CONFIG_NOTIFYAREA,153,133,50,14 END IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 154 @@ -920,6 +816,33 @@ 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 "&Tooltip Text:",IDC_LABEL1,7,44,40,8 + EDITTEXT IDC_NOTIFY_TOOLTIP,55,42,145,14,ES_AUTOHSCROLL + LTEXT "&Window Title:",IDC_LABEL2,7,63,44,8 + EDITTEXT IDC_NOTIFY_TITLE,55,60,145,14,ES_AUTOHSCROLL + LTEXT "&Module Path:",IDC_LABEL3,7,81,43,8 + EDITTEXT IDC_NOTIFY_MODULE,55,78,145,14,ES_AUTOHSCROLL + GROUPBOX "&Display Mode",IDC_LABEL4,7,95,157,28 + CONTROL "&show",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,15,107,33,10 + CONTROL "&hide",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66, + 107,29,10 + CONTROL "a&utohide",IDC_NOTIFY_AUTOHIDE,"Button", + BS_AUTORADIOBUTTON,112,107,43,10 + DEFPUSHBUTTON "&OK",IDOK,91,129,50,14,WS_GROUP + PUSHBUTTON "&Cancel",IDCANCEL,150,129,50,14 + ICON "",IDC_PICTURE,173,100,20,20 +END + ///////////////////////////////////////////////////////////////////////////// // @@ -960,6 +883,14 @@ BEGIN TOPMARGIN, 7 BOTTOMMARGIN, 147 END + + IDD_NOTIFYAREA, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 200 + TOPMARGIN, 7 + BOTTOMMARGIN, 143 + END END #endif // APSTUDIO_INVOKED @@ -1015,9 +946,150 @@ BEGIN IDS_MINIMIZE_ALL "mimimize all windows" IDS_DESKTOP_NUM "Desktop %d" IDS_VOLUME "Volume" + IDS_ITEMS_CUR "current items" + IDS_ITEMS_CONFIGURED "configuration" + IDS_ITEMS_VISIBLE "visible" + IDS_ITEMS_HIDDEN "hidden" + IDS_NOTIFY_SHOW "show" + IDS_NOTIFY_HIDE "hide" + IDS_NOTIFY_AUTOHIDE "autohide" END -#endif // English (U.K.) resources +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// French (France) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FRA) +#ifdef _WIN32 +LANGUAGE LANG_FRENCH, SUBLANG_FRENCH +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MAINFRAME MENU PRELOAD DISCARDABLE +BEGIN + POPUP "&Fichier" + BEGIN + MENUITEM "&Fermer", ID_FILE_EXIT + END + POPUP "&Affichage" + BEGIN + MENUITEM "Barre d'&outils", ID_VIEW_TOOL_BAR + MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR + MENUITEM "&Drivebar", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "Barre d'&閠at", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + END + POPUP "&Window" + BEGIN + MENUITEM "New &Window", ID_WINDOW_NEW + MENUITEM "Cascading\tShift+F5", ID_WINDOW_CASCADE + MENUITEM "Tile &Horizontally", ID_WINDOW_TILE_HORZ + MENUITEM "Tile &Vertically\tShift+F4", ID_WINDOW_TILE_VERT + MENUITEM "Arrange Automatically", ID_WINDOW_AUTOSORT + MENUITEM "Arrange &Symbols", ID_WINDOW_ARRANGE + MENUITEM "&Refresh\tF5", ID_REFRESH + END + POPUP "A&ide" + BEGIN + MENUITEM "&FAQ Explorateur...", ID_EXPLORER_FAQ + MENUITEM "A propos de l'&explorateur...", ID_ABOUT_WINDOWS + MENUITEM "A propos de l'&OS...", 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 "&OK",1,158,6,47,14 + PUSHBUTTON "&Cancel",2,158,23,47,14 + PUSHBUTTON "&Help",254,158,43,47,14 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "Explorateur Reactos" + IDS_START "D閙arrer" + IDS_LOGOFF "D閏onnexion ..." + IDS_SHUTDOWN "Arr阾er..." + IDS_LAUNCH "Ex閏uter..." + IDS_START_HELP "Aide" + IDS_SEARCH_FILES "Rechercher Fichiers..." + IDS_DOCUMENTS "Documents" + IDS_FAVORITES "Favoris" + IDS_PROGRAMS "Programmes" + IDS_SETTINGS "Param鑤res" + IDS_EXPLORE "Explorer" + IDS_EMPTY "(Vide)" + IDS_RECENT "Documents r閏ents" + IDS_ADMIN "Administration" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "R閟eaux" + IDS_CONNECTIONS "Connexions r閟eaux" + IDS_DRIVES "Disques" + IDS_SEARCH_COMPUTER "Recherche Ordinateurs..." + IDS_SETTINGS_MENU "Barre des t鈉hes et menu d閙arrer" + IDS_CONTROL_PANEL "Panneau de configuration" + IDS_PRINTERS "Imprimantes" + IDS_BROWSE "Parcourir" + IDS_SEARCH_PRG "Recherche Programme..." + IDS_ALL_USERS "Tous les utilisateurs\\" + IDS_SEARCH "Rechercher" + IDS_ABOUT_EXPLORER "A propos de l'explorateur..." + IDS_LAUNCH_MANY_PROGRAMS + "You have selected more than one program.\nAre you sure you want to launch all of them?" + IDS_DESKTOPBAR_SETTINGS "Bureau" + IDS_DESKTOP "Bureau" + IDS_TASKBAR "Taskbar" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "Startmenu" + IDS_MINIMIZE_ALL "mimimize all windows" + IDS_DESKTOP_NUM "Bureau %d" + IDS_VOLUME "Volume" + IDS_ITEMS_CUR "current items" + IDS_ITEMS_CONFIGURED "configuration" + IDS_ITEMS_VISIBLE "visible" + IDS_ITEMS_HIDDEN "hidden" + IDS_NOTIFY_SHOW "show" + IDS_NOTIFY_HIDE "hide" + IDS_NOTIFY_AUTOHIDE "autohide" +END + +#endif // French (France) resources ///////////////////////////////////////////////////////////////////////////// @@ -1218,6 +1290,13 @@ BEGIN IDS_MINIMIZE_ALL "mimimize all windows" IDS_DESKTOP_NUM "Desktop %d" IDS_VOLUME "Volume" + IDS_ITEMS_CUR "current items" + IDS_ITEMS_CONFIGURED "configuration" + IDS_ITEMS_VISIBLE "visible" + IDS_ITEMS_HIDDEN "hidden" + IDS_NOTIFY_SHOW "show" + IDS_NOTIFY_HIDE "hide" + IDS_NOTIFY_AUTOHIDE "autohide" END #endif // Portuguese (Portugal) resources diff --git a/reactos/subsys/system/explorer/globals.h b/reactos/subsys/system/explorer/globals.h index 9fa916f877a..d0cf6929840 100644 --- a/reactos/subsys/system/explorer/globals.h +++ b/reactos/subsys/system/explorer/globals.h @@ -141,6 +141,13 @@ protected: /// create a bitmap from an icon extern HBITMAP create_bitmap_from_icon(HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd); + /// add icon with alpha channel to imagelist using the specified background color +extern int ImageList_AddAlphaIcon(HIMAGELIST himl, HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd); + + /// retrieve icon from window +extern HICON get_window_icon_small(HWND hwnd); +extern HICON get_window_icon_big(HWND hwnd, bool allow_from_class=true); + /// desktop management #ifdef _USE_HDESK diff --git a/reactos/subsys/system/explorer/res/dot.ico b/reactos/subsys/system/explorer/res/dot.ico new file mode 100644 index 0000000000000000000000000000000000000000..9ddbb8a41c7472dca30197bd6541898b0df64bc8 GIT binary patch literal 3750 zcmds(e@xV69LL`$5GQhirG^T4nHi86V#TSbrzmB{4_oBs2-sYW^#_r(eUEA5=nuHm zKit$!UF~w&7HdPD>DbJ;N)l_%xj`d!4U~QuO>KE-Kjx?R=li{5IPPwh{gFMl=brEL z>+}42J<t0C*btA@R4`3LZ5&Vxgz|ROCIIa$v+CoKWdo*;59ghzjR%${0a@CI(aETG z%)owkS@^8uz$+E*g)@^1GVJ_dHpT+>w0c(MKe%kk;(~&L+}zyRvz&S9$*mh}B6c~~ zbLQpBwUw2XRaI5%*RL-tD=RE4%+Ai9pE)t&C><Z{YuNZ|V`Jl{O`AL(PhDMIb#--7 zQPI4)Ih@$oA==-2d&`zBJ9qBfy?ghL9XncETMfggsi|?h-G#FpW80tn<fFE>wnK*w z9XWEOy}jM<_p^ILLqkPH#qv3m#<u_QyNl<~pX=-E>+S9B?(RN(`0(Dnd%a%ohMMY# z^SOCr`07tX!^6YDU~q77u&b+U|Ni|gEiDx*@*}R7BVM~QbY<xBty{O)YhYmD__1Rf z%G}ZR)0*KgKVQA@)!EZ0jvsCFzqR%C?vIa-o%w&NL<9)On=`rQ6revba@0C)6K=2R z?f1-Xt&MjwQXq{WULej;1_&rf9EcFeD~K&fF9;&^%n37iJRmY4X&|E@4j`@|xFES8 zgy5+_&zwAi#}85l@(J<^5(I(=A`8L`(u=01Cg?HpzJP}WQUj6zG73Tm;tGNbk_$ow zvIyb~o+$_o$SH^@cqKq!LH0muK|r7^>8TTE5Cf1i5Kr*Bfuw?TfY5^Mf=q!Zf+&Na zfqW`+AVeUgAa)?OAc5fhkF=#DWgeRg_H>82^ZKn(Lw&ppfhi7~m){c@?Vmer2h*%} z%*GD1*TKHA8r7%oGONE_`KuA=Pqv-j8Z`P6T`1TdG_<0dWgU|pwwoMN>pIe`I%g*P zO{0C*X`DXJ8l{%=j^n2en#VS)m}ap~7%uh&4YhNS?STZ;&)5Z`3SFs|hu6&PsNfoD zW2a#|dwSA?hKP>f!iTh><?nMH*L=SjKC@0l=ihvJwb@3E={hvsmaz*u-*DaYOHLX! zfiH}8;}Wi~<2*0W&V@^>(f@9#Ip@ljQly?+WA<N}S!|}^wL3D3O?v^_biG-k=JETf zB53{feFtzNcz{Z11=TX$gA|UT<7>X5vEencEP0_ePNrI(%k^kqEiYT#WBfr|3z(W4 z%ROhY8MLj&%^W}Vxn$ezcR9LdzO$&*G7$O?+qtc9R7UInQCO4~SDv<Lr0YYDr1ACy z+w4$*d)nkF_f48`&$v*F$1@(7<xHQNni!gSUe4UyN3v(mND1v>;esbzk3E``d2h01 z;K`Lm%a;|*dw6=Ned+3wXNs5RXH5)``1Dg{C94+RA07`_vtr5oIg3Z;^LIW*znS`m z-q|~At;ic?0%ke?yrB;-tV|#fFyA^p+l0w_$Mr*h`lu5xt%(v6o9*>l)r=y2iV}T3 z*jQlq`FuJM^FA+6I?*s#!}NyX@#O(2H^gYxjv|I$RHPUl%|;3T?mjuKQLOEXGUETI z*qvc3XY8cD3iU$tTg(2+3SU^3<)_{X^;f9FLOmAhvrx0ujz5--ZN^LG)Lx+`3pH7& z&qA#h>bOwfg_^H6qRwOA_BT4I)k1w1>a$R*h59YjcA@SI{R49?(dIyH7V5T8vxS;1 z)Ni4d3w2-U3kdxOp}!FoZfdnq(}h|t)N!G<3pL-gN&i9Ua|r#BsQoW}^K~cnT&U|p zjTh>@&?gZ34np5T=##{p|Iqi}mQ(wMdN0&{p-&+68-%`w&@U1CKr#1E_vMGdem{K( zp|4=tp>HAdM})qS_KkUd;e9>dbEf?4sZTrUw+MY5+5F<Ooon-_MLoB0zq>KL(|6`i DK928Q literal 0 HcmV?d00001 diff --git a/reactos/subsys/system/explorer/res/dot_red.ico b/reactos/subsys/system/explorer/res/dot_red.ico new file mode 100644 index 0000000000000000000000000000000000000000..4d176eef1d552bb3ca84b8562a8cce458b818a76 GIT binary patch literal 3750 zcmds3eN0nV6hDQQ7FunmPSK%O-4wqDn@);G-lKi}!hwY`q<pnvhi##tqCS-=SBHuU z8^*C2Lv)J!Vt#H@(Pe~0gVCwk<}}9b5B3qGOST|^#BIjz+}9643)5_WI8SokJ?D4M z@7!~5@4K%6A`pX01%f!k0SssbeF?xJ#8iGDRs=9SvR7OTkQ4<FOF5`&R1rku6M#kD z|4&veEip3*=A>C@{A2ei9Ah*Z^m@Hcr%PrTW0Gb7O6GjG#p+7WDYj%6y_{|}8jV`5 z*2pA=q||OcRIp$}PVu&!l3J^KYnEeOdTxoyJWr?7hHPxfqSLmOdkSCw#If#3VMSBH z@&>D`IwRL(GMQ4?ga@Zs<N3w4<xI(&mppZsi)+poz0r*H?8Q}Snf8?A5G@^i|H`?# zo3#gSY;C$xvHM5QTVFdWKg}!Kk&#&%vLBpr-^aI)p6xi&*3od{SH7X$xv8a~d{?T; z_+T?Zq;XH@sY{*6+Ij3&+1uZz&$9+Y{TaL8{idSyrl;`2#>%?>avmSt>jentT?XLJ zSbz>CK)bZBQjErEP9UF-ecv;gZ(;aOh7yL+0?Sw+naKl&MVm_n){p_LX#udh0$|Nn zNKVN`%>$dw1}3csv=%pLGfF}G$}-e)&}A-1T?x9ZHL%dO3@R%t!NfFy&Pq_%1D8_; zTz(C31+}2JZHGm+YS7zvfWB}i7#t1YcI<`~rF$SXc^}N@TEN160fwTzU|9SC7+fEL z(bWV-_W>}Jd<LmYkAtQBIOJ8FfP%FrpsctBJS)D0UG`>JT-6Njjm@yS?j)?)eiAmk za|##+H|H@DXP5?@B?=LXJ<+R=`WBBuMD=0Xv?Dj$HE?cMbiGjOEA9_oRi+SK+}6!s zlWHKLuA8TUXvDIezB)A49PNwkA5{-_tS!VazC<G2RKzLL2))t<KgS$Bj<I3%%z3>( zUF+s)KNidfkU-andcb1}lu2=a4fJ}8CYU3`O^_jTRZKVU_0kzMpuzqrK5b+@bX5Pz zR|_$(m-fH@mRZQ5)#y6tsKTCT&w*Ih+_SvB^*n!BE{VG=2e4zEAAUANdt;i=bKa&j zP+gxV@VPMtVGOK&&}f5DkHeapEvd9T{B=$TG~TuMFr4W=j9)^Z&~F*t110VSouB&U ztIL<;`S-^AbJRFed^)a&aw$H4&UgG>tTh8iy0LW65f+5zQU#nZevv}d_g(gVGld^R z$nJT(H#@DzK`U6N58C4hbM&~6U?~z46}{3E1qlM-kx^0!LVjS(pdmw_8Y~wFD9?_H z8U4&il{}Czanj_evFcIE2tQ%MjQF_cr;HsY3rz81!mO93kBbiO54@mBm^lqMJSgLz z8}W3|c_gFvo%!$YS>LH3{d6GU_#l3RfX``dZAFX#UfXz>=y~!PUcZCKivo`(Vvge| zL+o%k=%{FGYh&qn^@0yLyIJr-#@Em|z=bouG34{V-6yqg4spn-o>Y*<g%Q6}`yoZ5 z#zfMO(%66^fjK06*i0fGt|8$=<4Kr2h9IH0_RCj6BRe!ApU9@TiEL^qkxq7!i1ArO zJYqJ1u!uknw!Z=~;x-bMu$9P@8i*o!KatPfMIvWb5ov4@)|eCE(=nt>h`K`tr=2Fs z%x{S*>pD@UUnGMJM}?Zwi8d0ZoJ5dFHKgRs^|HrworGE2L1wS+Amd%X6V<C%i9-7! zk;U;OJTi$Okqt@qgZZAjgm3I3EB1AfteQ>|^V)A@aLOrM#|8o*MIBfiX0Ljo^&Z)D zuv@5O*>amGb8nI`m_WJef!RILxMBC$aq@d)2wWjDNMm~<PnLE6JwyNBQf&|Mzn9|o H|L^@9U3C)K literal 0 HcmV?d00001 diff --git a/reactos/subsys/system/explorer/res/dot_trans.ico b/reactos/subsys/system/explorer/res/dot_trans.ico new file mode 100644 index 0000000000000000000000000000000000000000..d5ede5a3800b73330b00e593381058f609df517e GIT binary patch literal 3750 zcmds(4@}f$7{{N>Kb(q+Wr`+pqA8e|e=1HzIYC{nCDulBj^vtaV{JO~+<wPw@~DG5 z$%TM421_`@1vkV@pf<ySAR_2A#YT#Xz(S|1YvZIp&g=X9?v5cGNUOH;+1}stzR&YM z&-?H5`~6-b4GpJ&0D=yr#9>5hh&*jAC5|8}h0X0BPN5p2Nu#`N9VHGYS}~d^RANwc zD3V7N#Qp!omXnc{ye(_j7F3=%`|LD6kp9X3{rfEz%icYlzH9p+AxH9a^Yily3JMM# zI+T->lb)WQl9H0nCZ8c+mw#oq7au)(w6wGo&!VCt1ZHMtS}iF)CstQmT~SeS^5n_N z%1S)T%gakjN^CY;Mn*>V?rr^txN`YYU0q#6L&N#==j-e1tE(m4Znx*<<$bz$NB{ok z>d)S~b@RrJ8!as@SFc`eY-~Jr>eTV$#}C^Ie9i|M?sRtESEaqZy{W0GrlzK>tSm2c zU;pGimd?%}9S#SA+S=MKUA%aB2uDy`bNc%$mmBJ8kJ-QI$@8DBxLicu@-T|%*I**Y zc%oLn$BWp+Cw;vAML+(YY2E9@JLyZnFbR>snFKT8K+YDR638PkOTdYMF9AjZ%mkWA zjtJNgXd`e+K!SiQ0bY``mQw-C1Rx275fC8Rd@xF27R640kAN+KUIHZqoC&8-;F16u z0Z{^}1c(Ui5#S)4BmrXrmxS{qAV)xx04aet0;vQj2<Q@yoWK+TMFNooFbRATxFO(1 z07>{GphO^wl9Q8tY|$9(oRoi8%o;rzyZkj9e(~2x-CO#Ox&eLGqfcLZ?{-&Uw%Tl5 z^_x<(#b0ybW2e&Wr>BSmPDLDF!nWSw&Lh5W0^PpCso5mst3LRrKI6`si22B8S_Umc zpViQz@VOvu%}zz;^E&zyji9c{*#t~Uk0N$iM}N`x^wA=*7Ln#@PQ~St5%i?T{KY<R zN;WyHzbjVN=W@yXci&yB_K}>j4$%Ralg!!cduRDs#aPv#OdL7l&cu;KM&xN}UrVi@ zuT$q7pSq3$uDzkgubRF_)!wy_4O*k-TZNqZeQ!#7`r}*-iNDKsjB1_7@F#SO{L5qy z#$zvJd}*7KOgq4lYk{Ya4qEKtSdYYtJ$6}>@({TeL(9g>p2Mt)^p!#w&+(qW=J9uV z;D2Vp(sgRQ_tBHbYv`lZG5Xks)|@m<GpSe4vE#;!^7DWKbKvt+CO+%0^={Fu=`%uR z1WlPR+7mK=PH0%@Y~9oVTp2_nUS9m_qL=0bKZj!yS-3oM+0s|$&V0c;#LDRCs3r4W z#Fx$^hM4FTuTA#0pu_bGruAz6g=+6_=HLI$x|hrYjIY}9U{8g~-KeUnf{h8EZNMZv zxhpPD19*vHATe81kJf5ssaPylE0mvEu~@f3D~cixKc!nSi%y0Cn!3BY%}_Mnr8bEa z^}`@0AM(%clg>SYd%Jv$_Vk$yK^nu7;L#irq-CiOb%pOnh3Zx>n#obimvKZy1c!%* z^Q;gZFPP>pd2~<8^FjPu93LOgn>KCYjT<*|Y-}t?Mn-a2SQsyyK8^>Aw;kAHFm3;k zlai8n=gysMHk*0t)~%e7kiao9F+6|X+(Fk;dgL=sOH1Q}2M;pt2b`6a#kfnb0BAHC z*<dhmWXRY7=Ww?ATP`jxX50%H_W{NofpND`bDB&hj*E-qm9r-d7~g*L2gCL2*SNX4 zneqQ;+!6T1i4&Zgn~T?td9yKL(D}>W{Cxi&KX~wfolYlrbae2UGiSK4u#i(zQ#mer z(ST!1tjL{?R^3nc?((BYkJLQ3Z{KFzyLof0VMyoa&O-FvxzmOVwUt~^oX;P<|F*$v Wf7*24?~L4UrL_9E_lmvmz4uRwx7!&2 literal 0 HcmV?d00001 diff --git a/reactos/subsys/system/explorer/shell/shellbrowser.cpp b/reactos/subsys/system/explorer/shell/shellbrowser.cpp index 617a0edacf4..2537e7928f6 100644 --- a/reactos/subsys/system/explorer/shell/shellbrowser.cpp +++ b/reactos/subsys/system/explorer/shell/shellbrowser.cpp @@ -34,20 +34,6 @@ #include "../explorer_intres.h" -static LPARAM TreeView_GetItemData(HWND hwndTreeView, HTREEITEM hItem) -{ - TVITEM tvItem; - - tvItem.mask = TVIF_PARAM; - tvItem.hItem = hItem; - - if (!TreeView_GetItem(hwndTreeView, &tvItem)) - return 0; - - return tvItem.lParam; -} - - ShellBrowserChild::ShellBrowserChild(HWND hwnd, const ShellChildWndInfo& info) : super(hwnd, info), _create_info(info) @@ -132,20 +118,18 @@ void ShellBrowserChild::InitializeTree() TreeView_SetImageList(_left_hwnd, _himlSmall, TVSIL_NORMAL); TreeView_SetScrollTime(_left_hwnd, 100); - TV_ITEM tvItem; + TV_INSERTSTRUCT tvInsert; + tvInsert.hParent = 0; + tvInsert.hInsertAfter = TVI_LAST; + + TV_ITEM& tvItem = tvInsert.item; tvItem.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN; tvItem.lParam = (LPARAM)_root._entry; tvItem.pszText = LPSTR_TEXTCALLBACK; tvItem.iImage = tvItem.iSelectedImage = I_IMAGECALLBACK; tvItem.cChildren = 1; - TV_INSERTSTRUCT tvInsert; - - tvInsert.hParent = 0; - tvInsert.hInsertAfter = TVI_LAST; - tvInsert.item = tvItem; - HTREEITEM hItem = TreeView_InsertItem(_left_hwnd, &tvInsert); TreeView_SelectItem(_left_hwnd, hItem); TreeView_Expand(_left_hwnd, hItem, TVE_EXPAND); diff --git a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp index f330bb9b0b1..088331a7c7d 100644 --- a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp @@ -46,6 +46,8 @@ DesktopBar::DesktopBar(HWND hwnd) : super(hwnd), _trayIcon(hwnd, ID_TRAY_VOLUME) { + SetWindowIcon(hwnd, IDI_REACTOS/*IDI_SEARCH*/); // icon in for TrayNotifyDlg + SystemParametersInfo(SPI_GETWORKAREA, 0, &_work_area_org, 0); } @@ -247,6 +249,9 @@ LRESULT DesktopBar::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) } break; + case PM_GET_NOTIFYAREA: + return (LRESULT)(HWND)_hwndNotify; + default: def: return super::WndProc(nmsg, wparam, lparam); } diff --git a/reactos/subsys/system/explorer/taskbar/desktopbar.h b/reactos/subsys/system/explorer/taskbar/desktopbar.h index efcdc77b894..beb8467ccce 100644 --- a/reactos/subsys/system/explorer/taskbar/desktopbar.h +++ b/reactos/subsys/system/explorer/taskbar/desktopbar.h @@ -73,8 +73,6 @@ struct DesktopBar : public TrayIconControllerTemplate< static HWND Create(); protected: - CommonControlInit _usingCmnCtrl; - RECT _work_area_org; int _taskbar_pos; diff --git a/reactos/subsys/system/explorer/taskbar/quicklaunch.h b/reactos/subsys/system/explorer/taskbar/quicklaunch.h index 3447a7affe9..3f269a4f72d 100644 --- a/reactos/subsys/system/explorer/taskbar/quicklaunch.h +++ b/reactos/subsys/system/explorer/taskbar/quicklaunch.h @@ -31,7 +31,6 @@ #define IDW_QUICKLAUNCHBAR 101 -#define PM_REFRESH (WM_APP+0x1B) #define PM_UPDATE_DESKTOP (WM_APP+0x1C) #define IDC_FIRST_QUICK_ID 0x4000 diff --git a/reactos/subsys/system/explorer/taskbar/taskbar.cpp b/reactos/subsys/system/explorer/taskbar/taskbar.cpp index f02bb855148..9e567ff939b 100644 --- a/reactos/subsys/system/explorer/taskbar/taskbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/taskbar.cpp @@ -246,7 +246,7 @@ void TaskBar::ShowAppSystemMenu(TaskBarMap::iterator it) } -static HICON get_window_icon(HWND hwnd) +HICON get_window_icon_small(HWND hwnd) { HICON hIcon = 0; @@ -267,8 +267,31 @@ static HICON get_window_icon(HWND hwnd) if (!hIcon) SendMessageTimeout(hwnd, WM_QUERYDRAGICON, 0, 0, 0, 1000, (LPDWORD)&hIcon); + return hIcon; +} + +HICON get_window_icon_big(HWND hwnd, bool allow_from_class) +{ + HICON hIcon = 0; + + SendMessageTimeout(hwnd, WM_GETICON, ICON_BIG, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&hIcon); + if (!hIcon) - hIcon = LoadIcon(0, IDI_APPLICATION); + 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 (allow_from_class) { + if (!hIcon) + hIcon = (HICON)GetClassLong(hwnd, GCL_HICON); + + if (!hIcon) + hIcon = (HICON)GetClassLong(hwnd, GCL_HICONSM); + } + + if (!hIcon) + SendMessageTimeout(hwnd, WM_QUERYDRAGICON, 0, 0, 0, 1000, (LPDWORD)&hIcon); return hIcon; } @@ -298,7 +321,10 @@ BOOL CALLBACK TaskBar::EnumWndProc(HWND hwnd, LPARAM lparam) found->second._id = pThis->_next_id++; } else { HBITMAP hbmp; - HICON hIcon = get_window_icon(hwnd); + HICON hIcon = get_window_icon_small(hwnd); + + if (!hIcon) + hIcon = LoadIcon(0, IDI_APPLICATION); if (hIcon) { hbmp = create_bitmap_from_icon(hIcon, GetSysColorBrush(COLOR_BTNFACE), WindowCanvas(pThis->_htoolbar)); diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index df8f0808a9c..7b0574ea00f 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -35,8 +35,6 @@ #include "traynotify.h" -#include "../dialogs/settings.h" - #include "../notifyhook/notifyhook.h" @@ -157,6 +155,11 @@ NotifyInfo& NotifyInfo::operator=(NOTIFYICONDATA* pnid) _tipText.assign(txt, l); } + TCHAR title[MAX_PATH]; + + if (GetWindowText(_hWnd, title, MAX_PATH)) + _windowTitle = title; + ///@todo test for real changes _lastChange = GetTickCount(); @@ -173,7 +176,7 @@ NotifyArea::NotifyArea(HWND hwnd) _last_icon_count = 0; _show_hidden = false; - ///@todo read from config file --> +/*@todo read/write from/to config file/registry NotifyIconConfig cfg; cfg._tipText = TEXT("FRITZ!fon"); @@ -207,11 +210,7 @@ NotifyArea::NotifyArea(HWND hwnd) _cfg.push_back(cfg); cfg._windowTitle.erase(); - - cfg._modulePath = TEXT("xyz"); //@@ - cfg._mode = NIM_HIDE; - _cfg.push_back(cfg); - /// <-- +*/ } LRESULT NotifyArea::Init(LPCREATESTRUCT pcs) @@ -292,6 +291,10 @@ LRESULT NotifyArea::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) clock_window->TimerTick(); break;} + case PM_REFRESH: + TimerTick(); + break; + case WM_SIZE: { int cx = LOWORD(lparam); SetWindowPos(_hwndClock, 0, cx-_clock_width, 0, 0, 0, SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE); @@ -331,10 +334,20 @@ LRESULT NotifyArea::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) ) CancelModes(); - NotifyIconSet::iterator found = IconHitTest(Point(lparam)); + NotifyIconSet::const_iterator found = IconHitTest(Point(lparam)); if (found != _sorted_icons.end()) { - NotifyInfo& entry = const_cast<NotifyInfo&>(*found); // Why does GCC 3.3 need this additional const_cast ?! + const NotifyInfo& entry = const_cast<NotifyInfo&>(*found); // Why does GCC 3.3 need this additional const_cast ?! + + // set activation time stamp + if (nmsg == WM_LBUTTONDOWN || // Some programs need PostMessage() instead of SendMessage(). + nmsg == WM_MBUTTONDOWN || // So call SendMessage() only for BUTTONUP and BLCLK messages +#ifdef WM_XBUTTONDOWN + nmsg == WM_XBUTTONDOWN || +#endif + nmsg == WM_RBUTTONDOWN) { + _icon_map[entry]._lastChange = GetTickCount(); + } // Notify the message if the owner is still alive if (IsWindow(entry._hWnd)) { @@ -381,7 +394,7 @@ int NotifyArea::Command(int id, int code) break; case ID_CONFIG_NOTIFYAREA: - ExplorerPropertySheet(_hwnd); + Dialog::DoModal(IDD_NOTIFYAREA, WINDOW_CREATOR(TrayNotifyDlg), GetParent(_hwnd)); break; case ID_CONFIG_TIME: @@ -615,7 +628,7 @@ NotifyIconSet::iterator NotifyArea::IconHitTest(const POINT& pos) #if NOTIFYICON_VERSION>=3 // as of 21.08.2003 missing in MinGW headers -bool NotifyIconConfig::match(const NotifyIconProps& props) const +bool NotifyIconConfig::match(const NotifyIconConfig& props) const { if (!_tipText.empty() && !props._tipText.empty()) if (props._tipText == _tipText) @@ -634,26 +647,20 @@ bool NotifyIconConfig::match(const NotifyIconProps& props) const bool NotifyArea::DetermineHideState(NotifyInfo& entry) { - for(NotifyIconCfgList::const_iterator it=_cfg.begin(); it!=_cfg.end(); ++it) { - const NotifyIconConfig& cfg = *it; - - NotifyIconProps props; - - props._tipText = entry._tipText; - - TCHAR title[MAX_PATH]; - if (GetWindowText(entry._hWnd, title, MAX_PATH)) - props._windowTitle = title; - + if (entry._modulePath.empty()) { const String& modulePath = _window_modules[entry._hWnd]; // request module path for new windows (We will get an asynchronous answer by a WM_COPYDATA message.) if (!modulePath.empty()) - props._modulePath = modulePath; + entry._modulePath = modulePath; else _hook.GetModulePath(entry._hWnd, _hwnd); + } - if (cfg.match(props)) { + for(NotifyIconCfgList::const_iterator it=_cfg.begin(); it!=_cfg.end(); ++it) { + const NotifyIconConfig& cfg = *it; + + if (cfg.match(entry)) { entry._mode = cfg._mode; return true; } @@ -665,6 +672,328 @@ bool NotifyArea::DetermineHideState(NotifyInfo& entry) #endif +TrayNotifyDlg::TrayNotifyDlg(HWND hwnd) + : super(hwnd), + _tree_ctrl(GetDlgItem(hwnd, IDC_NOTIFY_ICONS)), + _himl(ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR24, 2, 0)), + _pNotifyArea(static_cast<NotifyArea*>(Window::get_window((HWND)SendMessage(g_Globals._hwndDesktopBar, PM_GET_NOTIFYAREA, 0, 0)))) +{ + _selectedItem = 0; + + SetWindowIcon(hwnd, IDI_REACTOS/*IDI_SEARCH*/); + + _haccel = LoadAccelerators(g_Globals._hInstance, MAKEINTRESOURCE(IDA_TRAYNOTIFY)); + + { + WindowCanvas canvas(_hwnd); + HBRUSH hbkgnd = GetStockBrush(WHITE_BRUSH); + + ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_DOT), hbkgnd, canvas); + ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_DOT_TRANS), hbkgnd, canvas); + ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_DOT_RED), hbkgnd, canvas); + } + + TreeView_SetImageList(_tree_ctrl, _himl, TVSIL_NORMAL); + + _resize_mgr.Add(IDC_NOTIFY_ICONS, RESIZE); + _resize_mgr.Add(IDC_LABEL1, MOVE_Y); + _resize_mgr.Add(IDC_NOTIFY_TOOLTIP, RESIZE_X|MOVE_Y); + _resize_mgr.Add(IDC_LABEL2, MOVE_Y); + _resize_mgr.Add(IDC_NOTIFY_TITLE, RESIZE_X|MOVE_Y); + _resize_mgr.Add(IDC_LABEL3, MOVE_Y); + _resize_mgr.Add(IDC_NOTIFY_MODULE, RESIZE_X|MOVE_Y); + + _resize_mgr.Add(IDC_LABEL4, MOVE_Y); + _resize_mgr.Add(IDC_NOTIFY_SHOW, MOVE_Y); + _resize_mgr.Add(IDC_NOTIFY_HIDE, MOVE_Y); + _resize_mgr.Add(IDC_NOTIFY_AUTOHIDE,MOVE_Y); + + _resize_mgr.Add(IDC_PICTURE, MOVE); + + _resize_mgr.Add(IDOK, MOVE); + _resize_mgr.Add(IDCANCEL, MOVE); + + _resize_mgr.Resize(+150, +200); + + Refresh(); + + SetTimer(_hwnd, 0, 3000, NULL); + register_pretranslate(hwnd); +} + +TrayNotifyDlg::~TrayNotifyDlg() +{ + KillTimer(_hwnd, 0); + unregister_pretranslate(_hwnd); + ImageList_Destroy(_himl); +} + +void TrayNotifyDlg::Refresh() +{ + ///@todo refresh incrementally + + HiddenWindow hide(_tree_ctrl); + + TreeView_DeleteAllItems(_tree_ctrl); + + TV_INSERTSTRUCT tvi; + + tvi.hParent = 0; + tvi.hInsertAfter = TVI_LAST; + + TV_ITEM& tv = tvi.item; + tv.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE; + + ResString str_cur(IDS_ITEMS_CUR); + tv.pszText = (LPTSTR)str_cur.c_str(); + tv.iSelectedImage = tv.iImage = 0; // IDI_DOT + _hitemCurrent = TreeView_InsertItem(_tree_ctrl, &tvi); + + ResString str_conf(IDS_ITEMS_CONFIGURED); + tv.pszText = (LPTSTR)str_conf.c_str(); + tv.iSelectedImage = tv.iImage = 2; // IDI_DOT_RED + _hitemConfig = TreeView_InsertItem(_tree_ctrl, &tvi); + + tvi.hParent = _hitemCurrent; + + ResString str_visible(IDS_ITEMS_VISIBLE); + tv.pszText = (LPTSTR)str_visible.c_str(); + tv.iSelectedImage = tv.iImage = 0; // IDI_DOT + _hitemCurrent_visible = TreeView_InsertItem(_tree_ctrl, &tvi); + + ResString str_hidden(IDS_ITEMS_HIDDEN); + tv.pszText = (LPTSTR)str_hidden.c_str(); + tv.iSelectedImage = tv.iImage = 1; // IDI_DOT_TRANS + _hitemCurrent_hidden = TreeView_InsertItem(_tree_ctrl, &tvi); + + if (_pNotifyArea) { + tv.mask |= TVIF_PARAM; + + WindowCanvas canvas(_hwnd); + + // insert current (visible and hidden) items + for(NotifyIconMap::const_iterator it=_pNotifyArea->_icon_map.begin(); it!=_pNotifyArea->_icon_map.end(); ++it) { + const NotifyInfo& entry = it->second; + + InsertItem(entry._dwState&NIS_HIDDEN? _hitemCurrent_hidden: _hitemCurrent_visible, TVI_LAST, entry, canvas); + } + + // insert configured items in tree view + const NotifyIconCfgList& cfg = _pNotifyArea->_cfg; + for(NotifyIconCfgList::const_iterator it=cfg.begin(); it!=cfg.end(); ++it) { + const NotifyIconConfig& cfg_entry = *it; + + HICON hicon = 0; + + if (!cfg_entry._modulePath.empty()) { + if ((int)ExtractIconEx(cfg_entry._modulePath, 0, NULL, &hicon, 1) <= 0) + hicon = 0; + + if (!hicon) { + SHFILEINFO sfi; + + if (SHGetFileInfo(cfg_entry._modulePath, 0, &sfi, sizeof(sfi), SHGFI_ICON|SHGFI_SMALLICON)) + hicon = sfi.hIcon; + } + } + + InsertItem(_hitemConfig, TVI_SORT, cfg_entry, canvas, hicon, cfg_entry._mode); + + if (hicon) + DestroyIcon(hicon); + } + + // insert new configuration entry + } + + TreeView_Expand(_tree_ctrl, _hitemCurrent_visible, TVE_EXPAND); + TreeView_Expand(_tree_ctrl, _hitemCurrent_hidden, TVE_EXPAND); + TreeView_Expand(_tree_ctrl, _hitemCurrent, TVE_EXPAND); + TreeView_Expand(_tree_ctrl, _hitemConfig, TVE_EXPAND); +} + +void TrayNotifyDlg::InsertItem(HTREEITEM hparent, HTREEITEM after, const NotifyInfo& entry, HDC hdc) +{ + InsertItem(hparent, after, entry, hdc, entry._hIcon, entry._mode); +} + +void TrayNotifyDlg::InsertItem(HTREEITEM hparent, HTREEITEM after, const NotifyIconConfig& entry, + HDC hdc, HICON hicon, NOTIFYICONMODE mode) +{ + String mode_str; + + switch(mode) { + case NIM_SHOW: mode_str = ResString(IDS_NOTIFY_SHOW); break; + case NIM_HIDE: mode_str = ResString(IDS_NOTIFY_HIDE); break; + case NIM_AUTO: mode_str = ResString(IDS_NOTIFY_AUTOHIDE); + } + + FmtString txt(TEXT("%s - %s [%s]"), entry._tipText.c_str(), entry._windowTitle.c_str(), mode_str.c_str()); + + TV_INSERTSTRUCT tvi; + + tvi.hParent = hparent; + tvi.hInsertAfter = after; + + TV_ITEM& tv = tvi.item; + tv.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_PARAM; + + tv.lParam = (LPARAM)&entry; + tv.pszText = (LPTSTR)txt.c_str(); + tv.iSelectedImage = tv.iImage = ImageList_AddAlphaIcon(_himl, hicon, GetStockBrush(WHITE_BRUSH), hdc); + TreeView_InsertItem(_tree_ctrl, &tvi); +} + +LRESULT TrayNotifyDlg::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + switch(nmsg) { + case PM_TRANSLATE_MSG: { + MSG* pmsg = (MSG*) lparam; + + if (TranslateAccelerator(_hwnd, _haccel, pmsg)) + return TRUE; + + return FALSE;} + + case WM_TIMER: + Refresh(); + break; + + default: + return super::WndProc(nmsg, wparam, lparam); + } + + return 0; +} + +int TrayNotifyDlg::Command(int id, int code) +{ + if (code == BN_CLICKED) { + switch(id) { + case ID_REFRESH: + Refresh(); + break; + + case IDC_NOTIFY_SHOW: + SetIconMode(NIM_SHOW); + break; + + case IDC_NOTIFY_HIDE: + SetIconMode(NIM_HIDE); + break; + + case IDC_NOTIFY_AUTOHIDE: + SetIconMode(NIM_AUTO); + break; + + case IDOK: + case IDCANCEL: + EndDialog(_hwnd, id); + break; + } + + return 0; + } + + return 1; +} + +int TrayNotifyDlg::Notify(int id, NMHDR* pnmh) +{ + switch(pnmh->code) { + case TVN_SELCHANGED: { + NMTREEVIEW* pnmtv = (NMTREEVIEW*)pnmh; + LPARAM lparam = pnmtv->itemNew.lParam; + + if (lparam) { + const NotifyIconConfig& entry = *(NotifyIconConfig*)lparam; + + SetDlgItemText(_hwnd, IDC_NOTIFY_TOOLTIP, entry._tipText); + SetDlgItemText(_hwnd, IDC_NOTIFY_TITLE, entry._windowTitle); + SetDlgItemText(_hwnd, IDC_NOTIFY_MODULE, entry._modulePath); + + CheckRadioButton(_hwnd, IDC_NOTIFY_SHOW, IDC_NOTIFY_AUTOHIDE, IDC_NOTIFY_SHOW+entry._mode); + + HICON hicon = 0; //get_window_icon_big(entry._hWnd, false); + + // If we could not find an icon associated with the owner window, try to load one from the owning module. + if (!hicon && !entry._modulePath.empty()) { + hicon = ExtractIcon(g_Globals._hInstance, entry._modulePath, 0); + + if (!hicon) { + SHFILEINFO sfi; + + if (SHGetFileInfo(entry._modulePath, 0, &sfi, sizeof(sfi), SHGFI_ICON|SHGFI_LARGEICON)) + hicon = sfi.hIcon; + } + } + + if (hicon) { + SendMessage(GetDlgItem(_hwnd, IDC_PICTURE), STM_SETICON, (LPARAM)hicon, 0); + DestroyIcon(hicon); + } else + SendMessage(GetDlgItem(_hwnd, IDC_PICTURE), STM_SETICON, 0, 0); + + _selectedItem = pnmtv->itemNew.hItem; + } else { + /* + SetDlgItemText(_hwnd, IDC_NOTIFY_TOOLTIP, NULL); + SetDlgItemText(_hwnd, IDC_NOTIFY_TITLE, NULL); + SetDlgItemText(_hwnd, IDC_NOTIFY_MODULE, NULL); + */ + CheckRadioButton(_hwnd, IDC_NOTIFY_SHOW, IDC_NOTIFY_AUTOHIDE, 0); + } + break;} + } + + return 0; +} + +void TrayNotifyDlg::SetIconMode(NOTIFYICONMODE mode) +{ + LPARAM lparam = TreeView_GetItemData(_tree_ctrl, _selectedItem); + + if (!lparam) + return; + + NotifyIconConfig& entry = *(NotifyIconConfig*)lparam; + + if (entry._mode != mode) { + entry._mode = mode; + + // trigger refresh in notify area and this dialog + SendMessage(*_pNotifyArea, PM_REFRESH, 0, 0); + } + + if (_pNotifyArea) { + bool found = false; + + NotifyIconCfgList& cfg = _pNotifyArea->_cfg; + for(NotifyIconCfgList::iterator it=cfg.begin(); it!=cfg.end(); ++it) { + NotifyIconConfig& cfg_entry = *it; + + if (cfg_entry.match(entry)) { + cfg_entry._mode = mode; + ++found; + break; + } + } + + if (!found) { + // insert new configuration entry + NotifyIconConfig cfg_entry = entry; + + cfg_entry._mode = mode; + + _pNotifyArea->_cfg.push_back(cfg_entry); + } + } + + Refresh(); + ///@todo select treeview item at new position in tree view -> refresh HTREEITEM in _selectedItem +} + + ClockWindow::ClockWindow(HWND hwnd) : super(hwnd), _tooltip(hwnd) diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.h b/reactos/subsys/system/explorer/taskbar/traynotify.h index 603fef1e645..e29852a8a23 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.h +++ b/reactos/subsys/system/explorer/taskbar/traynotify.h @@ -35,10 +35,11 @@ #define NOTIFYICON_DIST 20 #define NOTIFYAREA_SPACE 10 -#define PM_GETMODULEPATH_CB (WM_APP+0x21) - #define ICON_AUTOHIDE_SECONDS 300 +#define PM_GETMODULEPATH_CB (WM_APP+0x21) +#define PM_GET_NOTIFYAREA (WM_APP+0x22) + /// NotifyIconIndex is used for maintaining the order of notification icons. struct NotifyIconIndex @@ -58,25 +59,22 @@ protected: enum NOTIFYICONMODE { - NIM_AUTO, NIM_SHOW, NIM_HIDE + NIM_SHOW, NIM_HIDE, NIM_AUTO }; - /// properties used to identify a notification icon -struct NotifyIconProps -{ - String _tipText; - String _windowTitle; // To look at the window title and at the window module path of the notify icon owner window - String _modulePath; // to identify notification icons is an extension above XP's behaviour. -}; // (XP seems to store icon image data in the registry instead.) - /// configuration for the display mode of a notification icon -struct NotifyIconConfig : public NotifyIconProps +struct NotifyIconConfig { NotifyIconConfig() : _mode(NIM_AUTO) {} - bool match(const NotifyIconProps& props) const; + bool match(const NotifyIconConfig& props) const; - NOTIFYICONMODE _mode; + // properties used to identify a notification icon + String _tipText; + String _windowTitle; // To look at the window title and at the window module path of the notify icon owner window + String _modulePath; // to identify notification icons is an extension above XP's behaviour. + // (XP seems to store icon image data in the registry instead.) + NOTIFYICONMODE _mode; }; /// list of NotifyIconConfig structures @@ -84,7 +82,7 @@ typedef list<NotifyIconConfig> NotifyIconCfgList; /// structure for maintaining informations about one notification icon -struct NotifyInfo : public NotifyIconIndex +struct NotifyInfo : public NotifyIconIndex, public NotifyIconConfig { NotifyInfo(); @@ -99,9 +97,7 @@ struct NotifyInfo : public NotifyIconIndex DWORD _dwState; UINT _uCallbackMessage; UINT _version; - String _tipText; - NOTIFYICONMODE _mode; DWORD _lastChange; // timer tick value of the last change }; @@ -138,12 +134,8 @@ protected: WindowHandle _hwndClock; int _clock_width; - NotifyIconMap _icon_map; - NotifyIconSet _sorted_icons; - int _next_idx; - size_t _last_icon_count; - ToolTip _tooltip; + NotifyHook _hook; bool _show_hidden; @@ -160,10 +152,46 @@ protected: NotifyIconSet::iterator IconHitTest(const POINT& pos); bool DetermineHideState(NotifyInfo& entry); +public: // for TrayNotifyDlg NotifyIconCfgList _cfg; - NotifyHook _hook; map<HWND, String> _window_modules; + + NotifyIconMap _icon_map; + NotifyIconSet _sorted_icons; + int _next_idx; + size_t _last_icon_count; +}; + + + /// configuration dialog for notification icons +struct TrayNotifyDlg : public ResizeController<Dialog> +{ + typedef ResizeController<Dialog> super; + + TrayNotifyDlg(HWND hwnd); + ~TrayNotifyDlg(); + +protected: + HWND _tree_ctrl; + HACCEL _haccel; + HIMAGELIST _himl; + NotifyArea* _pNotifyArea; + + HTREEITEM _hitemCurrent; + HTREEITEM _hitemCurrent_visible; + HTREEITEM _hitemCurrent_hidden; + HTREEITEM _hitemConfig; + HTREEITEM _selectedItem; + + virtual LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + virtual int Command(int id, int code); + virtual int Notify(int id, NMHDR* pnmh); + + void Refresh(); + void InsertItem(HTREEITEM hparent, HTREEITEM after, const NotifyInfo&, HDC); + void InsertItem(HTREEITEM hparent, HTREEITEM after, const NotifyIconConfig&, HDC, HICON, NOTIFYICONMODE); + void SetIconMode(NOTIFYICONMODE mode); }; diff --git a/reactos/subsys/system/explorer/utility/window.cpp b/reactos/subsys/system/explorer/utility/window.cpp index 72f866f0fc0..f1124a99ac4 100644 --- a/reactos/subsys/system/explorer/utility/window.cpp +++ b/reactos/subsys/system/explorer/utility/window.cpp @@ -649,6 +649,11 @@ Dialog::~Dialog() unregister_dialog(_hwnd); } +LRESULT Dialog::Init(LPCREATESTRUCT pcs) +{ + return TRUE; // set standard focus +} + int Dialog::DoModal(UINT nid, CREATORFUNC creator, HWND hwndParent) { Lock lock(GetStaticWindowData()._create_crit_sect); // protect access to s_window_creator and s_new_info @@ -656,6 +661,8 @@ int Dialog::DoModal(UINT nid, CREATORFUNC creator, HWND hwndParent) s_window_creator = creator; s_new_info = NULL; + ///@todo call Window::pretranslate_msg() + return DialogBoxParam(g_Globals._hInstance, MAKEINTRESOURCE(nid), hwndParent, DialogProc, 0/*lpParam*/); } @@ -666,6 +673,8 @@ int Dialog::DoModal(UINT nid, CREATORFUNC_INFO creator, const void* info, HWND h s_window_creator = (CREATORFUNC) creator; s_new_info = NULL; + ///@todo call Window::pretranslate_msg() + return DialogBoxParam(g_Globals._hInstance, MAKEINTRESOURCE(nid), hwndParent, DialogProc, 0/*lpParam*/); } @@ -676,7 +685,7 @@ INT_PTR CALLBACK Window::DialogProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM if (pThis) { switch(nmsg) { case WM_COMMAND: - pThis->Command(LOWORD(wparam), HIWORD(wparam)); + SetWindowLong(hwnd, DWL_MSGRESULT, (LPARAM)pThis->Command(LOWORD(wparam), HIWORD(wparam))); return TRUE; // message has been processed case WM_NOTIFY: @@ -699,6 +708,8 @@ INT_PTR CALLBACK Window::DialogProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM if (pThis) return pThis->Init(NULL); + + return TRUE; } return FALSE; // message has not been processed @@ -713,10 +724,10 @@ int Dialog::Command(int id, int code) { if (code == BN_CLICKED) { EndDialog(_hwnd, id); - return TRUE; // message has been processed + return 0; // message has been processed } - return FALSE; + return 1; } @@ -751,8 +762,8 @@ void ResizeManager::HandleSize(int cx, int cy) const ResizeEntry& e = *it; RECT move = {0}; - if (e._flags & MOVE_LEFT) // Die verschiedenen Transformationsmatrizen in move lie遝n sich eigentlich - move.left += dx; // cachen oder vorausberechnen, da sie nur von _flags und der Gr鲞en鋘derung abh鋘gig sind. + if (e._flags & MOVE_LEFT) + move.left += dx; if (e._flags & MOVE_RIGHT) move.right += dx; @@ -773,15 +784,18 @@ void ResizeManager::HandleSize(int cx, int cy) if (flags != (SWP_NOMOVE|SWP_NOSIZE)) { HWND hwnd = GetDlgItem(_hwnd, e._id); - WindowRect rect(hwnd); - ScreenToClient(_hwnd, rect); - rect.left += move.left; - rect.right += move.right; - rect.top += move.top; - rect.bottom += move.bottom; + if (hwnd) { + WindowRect rect(hwnd); + ScreenToClient(_hwnd, rect); - hDWP = DeferWindowPos(hDWP, hwnd, 0, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, flags|SWP_NOACTIVATE|SWP_NOZORDER); + rect.left += move.left; + rect.right += move.right; + rect.top += move.top; + rect.bottom += move.bottom; + + hDWP = DeferWindowPos(hDWP, hwnd, 0, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, flags|SWP_NOACTIVATE|SWP_NOZORDER); + } } } @@ -791,6 +805,7 @@ void ResizeManager::HandleSize(int cx, int cy) void ResizeManager::Resize(int dx, int dy) { ::SetWindowPos(_hwnd, 0, 0, 0, _min_wnd_size.cx+dx, _min_wnd_size.cy+dy, SWP_NOMOVE|SWP_NOACTIVATE); + MoveVisible(_hwnd); ClientRect clnt_rect(_hwnd); HandleSize(clnt_rect.right, clnt_rect.bottom); @@ -1358,7 +1373,7 @@ INT_PTR CALLBACK PropSheetPageDlg::DialogProc(HWND hwnd, UINT nmsg, WPARAM wpara if (pThis) { switch(nmsg) { case WM_COMMAND: - pThis->Command(LOWORD(wparam), HIWORD(wparam)); + SetWindowLong(hwnd, DWL_MSGRESULT, (LPARAM)pThis->Command(LOWORD(wparam), HIWORD(wparam))); return TRUE; // message has been processed case WM_NOTIFY: @@ -1386,6 +1401,8 @@ INT_PTR CALLBACK PropSheetPageDlg::DialogProc(HWND hwnd, UINT nmsg, WPARAM wpara if (pThis) return pThis->Init(NULL); } + + return TRUE; } return FALSE; // message has not been processed @@ -1395,5 +1412,5 @@ int PropSheetPageDlg::Command(int id, int code) { // override call to EndDialog in Dialog::Command(); - return FALSE; + return 1; } diff --git a/reactos/subsys/system/explorer/utility/window.h b/reactos/subsys/system/explorer/utility/window.h index 7c284e22f0e..19d20e45210 100644 --- a/reactos/subsys/system/explorer/utility/window.h +++ b/reactos/subsys/system/explorer/utility/window.h @@ -371,6 +371,7 @@ struct Dialog : public Window static int DoModal(UINT nid, CREATORFUNC_INFO creator, const void* info, HWND hwndParent=0); protected: + LRESULT Init(LPCREATESTRUCT pcs); LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); int Command(int id, int code); }; @@ -955,6 +956,20 @@ protected: }; +inline LPARAM TreeView_GetItemData(HWND hwndTreeView, HTREEITEM hItem) +{ + TVITEM tvItem; + + tvItem.mask = TVIF_PARAM; + tvItem.hItem = hItem; + + if (!TreeView_GetItem(hwndTreeView, &tvItem)) + return 0; + + return tvItem.lParam; +} + + enum {TRAYBUTTON_LEFT=0, TRAYBUTTON_RIGHT, TRAYBUTTON_MIDDLE}; #define PM_TRAYICON (WM_APP+0x20) From a8f59cffef7a001022b8acad53eedb2229f503ca Mon Sep 17 00:00:00 2001 From: Royce Mitchell III <royce3@ev1.net> Date: Sun, 21 Mar 2004 04:17:33 +0000 Subject: [PATCH 0592/1463] 1000+% performance increase in 1bpp dib -> 1bpp dib blitting. svn path=/trunk/; revision=8824 --- reactos/subsys/win32k/dib/dib.c | 3 +- reactos/subsys/win32k/dib/dib.h | 3 +- reactos/subsys/win32k/dib/dib1bpp.c | 601 ++++++++++++++++------------ 3 files changed, 346 insertions(+), 261 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib.c b/reactos/subsys/win32k/dib/dib.c index 55bb4a11196..f9ace456c05 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.6 2004/01/24 11:59:00 navaraf Exp $ */ +/* $Id: dib.c,v 1.7 2004/03/21 04:17:33 royce Exp $ */ #include <windows.h> #include <ddk/winddi.h> @@ -29,7 +29,6 @@ unsigned char notmask[2] = { 0x0f, 0xf0 }; unsigned char altnotmask[2] = { 0xf0, 0x0f }; -unsigned char mask1Bpp[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }; ULONG DIB_GetSource(SURFOBJ* SourceSurf, SURFGDI* SourceGDI, ULONG sx, ULONG sy, XLATEOBJ* ColorTranslation) diff --git a/reactos/subsys/win32k/dib/dib.h b/reactos/subsys/win32k/dib/dib.h index 2aed559c6ea..b1eeca695ac 100644 --- a/reactos/subsys/win32k/dib/dib.h +++ b/reactos/subsys/win32k/dib/dib.h @@ -1,6 +1,6 @@ extern unsigned char notmask[2]; extern unsigned char altnotmask[2]; -extern unsigned char mask1Bpp[8]; +#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); @@ -93,3 +93,4 @@ BOOLEAN DIB_32BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL* BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Mode); + diff --git a/reactos/subsys/win32k/dib/dib1bpp.c b/reactos/subsys/win32k/dib/dib1bpp.c index a6eab5e3b70..9c8f3213035 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.14 2003/12/08 18:05:30 fireball Exp $ */ +/* $Id: dib1bpp.c,v 1.15 2004/03/21 04:17:33 royce Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> @@ -31,18 +31,12 @@ VOID DIB_1BPP_PutPixel(PSURFOBJ SurfObj, LONG x, LONG y, ULONG c) { - PBYTE addr = SurfObj->pvScan0; + PBYTE addr = SurfObj->pvScan0 + y * SurfObj->lDelta + (x >> 3); - addr += y * SurfObj->lDelta + (x >> 3); - - if(c == 0) - { - *addr = (*addr & (~ mask1Bpp[x % 8])); - } - else - { - *addr = (*addr | mask1Bpp[x % 8]); - } + if ( !c ) + *addr &= ~MASK1BPP(x); + else + *addr |= MASK1BPP(x); } ULONG @@ -50,7 +44,7 @@ DIB_1BPP_GetPixel(PSURFOBJ SurfObj, LONG x, LONG y) { PBYTE addr = SurfObj->pvScan0 + y * SurfObj->lDelta + (x >> 3); - return (*addr & mask1Bpp[x % 8] ? 1 : 0); + return (*addr & MASK1BPP(x) ? 1 : 0); } VOID @@ -71,272 +65,363 @@ DIB_1BPP_VLine(PSURFOBJ SurfObj, LONG x, LONG y1, LONG y2, ULONG c) } } -BOOLEAN -DIB_1BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, - PRECTL DestRect, POINTL *SourcePoint, - XLATEOBJ *ColorTranslation) +static +void +DIB_1BPP_BitBltSrcCopy_From1BPP ( + SURFOBJ* DestSurf, SURFOBJ* SourceSurf, + PRECTL DestRect, POINTL *SourcePoint ) { - LONG i, j, sx, sy = SourcePoint->y; + // the 'window' in this sense is the x-position that corresponds + // to the left-edge of the 8-pixel byte we are currently working with. + // dwx is current x-window, dwx2 is the 'last' window we need to process + int dwx, dwx2; // destination window x-position + int swx; // source window y-position - switch(SourceGDI->BitsPerPixel) - { - case 1: - if (DestRect->top < SourcePoint->y) + // left and right edges of source and dest rectangles + int dl = DestRect->left; // dest left + int dr = DestRect->right-1; // dest right (inclusive) + int sl = SourcePoint->x; // source left + int sr = sl + dr - dl; // source right (inclusive) + + // which direction are we going? + int xinc; + int yinc; + + // following 4 variables are used for the y-sweep + int dy; // dest y + int dy1; // dest y start + int dy2; // dest y end + int sy1; // src y start + + int shift; + BYTE srcmask, dstmask; + + // 'd' and 's' are the dest & src buffer pointers that I use on my x-sweep + // 'pd' and 'ps' are the dest & src buffer pointers used on the inner y-sweep + PBYTE d, pd; // dest ptrs + PBYTE s, ps; // src ptrs + + shift = (dl-sl)&7; + + if ( DestRect->top <= SourcePoint->y ) { - for (j = DestRect->top; j < DestRect->bottom; j++) - { - if (DestRect->left < SourcePoint->x) - { - sx = SourcePoint->x; - for (i=DestRect->left; i<DestRect->right; i++) - { - if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) - { - DIB_1BPP_PutPixel(DestSurf, i, j, 0); - } - else - { - DIB_1BPP_PutPixel(DestSurf, i, j, 1); - } - sx++; - } - } - else - { - sx = SourcePoint->x + DestRect->right - DestRect->left - 1; - for (i = DestRect->right - 1; DestRect->left <= i; i--) - { - if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) - { - DIB_1BPP_PutPixel(DestSurf, i, j, 0); - } - else - { - DIB_1BPP_PutPixel(DestSurf, i, j, 1); - } - sx--; - } - } - sy++; - } + // moving up ( scan top -> bottom ) + dy1 = DestRect->top; + dy2 = DestRect->bottom - 1; + sy1 = SourcePoint->y; + yinc = 1; } - else + else { - sy = SourcePoint->y + DestRect->bottom - DestRect->top - 1; - for (j = DestRect->bottom - 1; DestRect->top <= j; j--) - { - if (DestRect->left < SourcePoint->x) - { - sx = SourcePoint->x; - for (i=DestRect->left; i<DestRect->right; i++) - { - if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) - { - DIB_1BPP_PutPixel(DestSurf, i, j, 0); - } - else - { - DIB_1BPP_PutPixel(DestSurf, i, j, 1); - } - sx++; - } - } - else - { - sx = SourcePoint->x + DestRect->right - DestRect->left - 1; - for (i = DestRect->right - 1; DestRect->left <= i; i--) - { - if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) - { - DIB_1BPP_PutPixel(DestSurf, i, j, 0); - } - else - { - DIB_1BPP_PutPixel(DestSurf, i, j, 1); - } - sx--; - } - } - sy--; - } + // moving down ( scan bottom -> top ) + dy1 = DestRect->bottom - 1; + dy2 = DestRect->top; + sy1 = SourcePoint->y + dy1 - dy2; + yinc = -1; } - break; + if ( DestRect->left <= SourcePoint->x ) + { + // moving left ( scan left->right ) + dwx = dl&~7; + swx = (sl-(dl&7))&~7; + dwx2 = dr&~7; + xinc = 1; + } + else + { + // moving right ( scan right->left ) + dwx = dr&~7; + swx = (sr-(dr&7))&~7; //(sr-7)&~7; // we need the left edge of this block... thus the -7 + dwx2 = dl&~7; + xinc = -1; + } + d = &(((PBYTE)DestSurf->pvScan0)[dy1*DestSurf->lDelta + (dwx>>3)]); + s = &(((PBYTE)SourceSurf->pvScan0)[sy1*SourceSurf->lDelta + (swx>>3)]); + for ( ;; ) + { + dy = dy1; + pd = d; + ps = s; + srcmask = 0xff; + int dx = dwx; /* dest x for this pass */ + if ( dwx < dl ) + { + int diff = dl-dwx; + srcmask &= (1<<(8-diff))-1; + dx = dl; + } + if ( dwx+7 > dr ) + { + int diff = dr-dwx+1; + srcmask &= ~((1<<(8-diff))-1); + } + dstmask = ~srcmask; - case 4: - for (j=DestRect->top; j<DestRect->bottom; j++) - { - sx = SourcePoint->x; - for (i=DestRect->left; i<DestRect->right; i++) - { - if(XLATEOBJ_iXlate(ColorTranslation, DIB_4BPP_GetPixel(SourceSurf, sx, sy)) == 0) - { - DIB_1BPP_PutPixel(DestSurf, i, j, 0); - } else { - DIB_1BPP_PutPixel(DestSurf, i, j, 1); - } - sx++; - } - sy++; - } - break; + // we unfortunately *must* have 5 different versions of the inner + // loop to be certain we don't try to read from memory that is not + // needed and may in fact be invalid + if ( !shift ) + { + for ( ;; ) + { + *pd = (BYTE)((*pd & dstmask) | (*ps & srcmask)); - case 8: - for (j=DestRect->top; j<DestRect->bottom; j++) - { - sx = SourcePoint->x; - for (i=DestRect->left; i<DestRect->right; i++) - { - if(XLATEOBJ_iXlate(ColorTranslation, DIB_8BPP_GetPixel(SourceSurf, sx, sy)) == 0) - { - DIB_1BPP_PutPixel(DestSurf, i, j, 0); - } else { - DIB_1BPP_PutPixel(DestSurf, i, j, 1); - } - sx++; - } - sy++; - } - break; + // this *must* be here, because we could be going up *or* down... + if ( dy == dy2 ) + break; + dy += yinc; + pd += yinc * DestSurf->lDelta; + ps += yinc * SourceSurf->lDelta; + } + } + else if ( !(0xFF00 & (srcmask<<shift) ) ) // check if ps[0] not needed... + { + for ( ;; ) + { + *pd = (BYTE)((*pd & dstmask) + | ( ( ps[1] >> shift ) & srcmask )); - case 16: - for (j=DestRect->top; j<DestRect->bottom; j++) - { - sx = SourcePoint->x; - for (i=DestRect->left; i<DestRect->right; i++) - { - if(XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy)) == 0) - { - DIB_1BPP_PutPixel(DestSurf, i, j, 0); - } else { - DIB_1BPP_PutPixel(DestSurf, i, j, 1); - } - sx++; - } - sy++; - } - break; + // this *must* be here, because we could be going up *or* down... + if ( dy == dy2 ) + break; + dy += yinc; + pd += yinc * DestSurf->lDelta; + ps += yinc * SourceSurf->lDelta; + } + } + else if ( !(0xFF & (srcmask<<shift) ) ) // check if ps[1] not needed... + { + for ( ;; ) + { + *pd = (*pd & dstmask) + | ( ( ps[0] << ( 8 - shift ) ) & srcmask ); - case 24: - for (j=DestRect->top; j<DestRect->bottom; j++) - { - sx = SourcePoint->x; - for (i=DestRect->left; i<DestRect->right; i++) - { - if(XLATEOBJ_iXlate(ColorTranslation, DIB_24BPP_GetPixel(SourceSurf, sx, sy)) == 0) - { - DIB_1BPP_PutPixel(DestSurf, i, j, 0); - } else { - DIB_1BPP_PutPixel(DestSurf, i, j, 1); - } - sx++; - } - sy++; - } - break; + // this *must* be here, because we could be going up *or* down... + if ( dy == dy2 ) + break; + dy += yinc; + pd += yinc * DestSurf->lDelta; + ps += yinc * SourceSurf->lDelta; + } + } + else // both ps[0] and ps[1] are needed + { + for ( ;; ) + { + *pd = (*pd & dstmask) + | ( ( ( (ps[1])|(ps[0]<<8) ) >> shift ) & srcmask ); - case 32: - for (j=DestRect->top; j<DestRect->bottom; j++) - { - sx = SourcePoint->x; - for (i=DestRect->left; i<DestRect->right; i++) - { - if(XLATEOBJ_iXlate(ColorTranslation, DIB_32BPP_GetPixel(SourceSurf, sx, sy)) == 0) - { - DIB_1BPP_PutPixel(DestSurf, i, j, 0); - } else { - DIB_1BPP_PutPixel(DestSurf, i, j, 1); - } - sx++; - } - sy++; - } - break; + // this *must* be here, because we could be going up *or* down... + if ( dy == dy2 ) + break; + dy += yinc; + pd += yinc * DestSurf->lDelta; + ps += yinc * SourceSurf->lDelta; + } + } - default: - DbgPrint("DIB_1BPP_BitBlt: Unhandled Source BPP: %u\n", SourceGDI->BitsPerPixel); - return FALSE; - } - - return TRUE; + // this *must* be here, because we could be going right *or* left... + if ( dwx == dwx2 ) + break; + d += xinc; + s += xinc; + dwx += xinc<<3; + swx += xinc<<3; + } } BOOLEAN -DIB_1BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, - PRECTL DestRect, POINTL *SourcePoint, - PBRUSHOBJ Brush, PPOINTL BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Rop4) +DIB_1BPP_BitBltSrcCopy( + SURFOBJ *DestSurf, SURFOBJ *SourceSurf, + SURFGDI *DestGDI, SURFGDI *SourceGDI, + PRECTL DestRect, POINTL *SourcePoint, + XLATEOBJ *ColorTranslation) { - LONG i, j, k, sx, sy; - ULONG Dest, Source, Pattern; - PULONG DestBits; - BOOL UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); - BOOL UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); - LONG RoundedRight = DestRect->right - ((DestRect->right - DestRect->left) & 0x7); + LONG i, j, sx, sy = SourcePoint->y; - if (Rop4 == SRCCOPY) - { - return(DIB_1BPP_BitBltSrcCopy(DestSurf, SourceSurf, DestGDI, SourceGDI, DestRect, SourcePoint, ColorTranslation)); - } - else - { - sy = SourcePoint->y; + switch ( SourceGDI->BitsPerPixel ) + { + case 1: + DIB_1BPP_BitBltSrcCopy_From1BPP ( DestSurf, SourceSurf, DestRect, SourcePoint ); + break; - for (j=DestRect->top; j<DestRect->bottom; j++) - { - sx = SourcePoint->x; - DestBits = (PULONG)(DestSurf->pvScan0 + (DestRect->left>>3) + j * DestSurf->lDelta); - for (i=DestRect->left; i<RoundedRight; i+=32, DestBits++) - { - Dest = *DestBits; - if (UsesSource) - { - Source = 0; - for (k = 0; k < 32; k++) - { - Source |= (DIB_GetSource(SourceSurf, SourceGDI, sx + (i - DestRect->left) + k, sy, ColorTranslation) << k); - } - } - if (UsesPattern) - { - /* FIXME: No support for pattern brushes. */ - Pattern = Brush->iSolidColor ? 0xFFFFFFFF : 0x00000000; - } - *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); - } - if (i < DestRect->right) - { - Dest = *DestBits; - for (; i < DestRect->right; i++) - { - if (UsesSource) - { - Source = DIB_GetSource(SourceSurf, SourceGDI, sx + (i - DestRect->left), sy, ColorTranslation); - } - if (UsesPattern) - { - /* FIXME: No support for pattern brushes. */ - Pattern = Brush->iSolidColor ? 0xFFFFFFFF : 0x00000000; - } - DIB_1BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF); - Dest >>= 1; - } - } - sy++; - } - } - return TRUE; + case 4: + for (j=DestRect->top; j<DestRect->bottom; j++) + { + sx = SourcePoint->x; + for (i=DestRect->left; i<DestRect->right; i++) + { + if(XLATEOBJ_iXlate(ColorTranslation, DIB_4BPP_GetPixel(SourceSurf, sx, sy)) == 0) + { + DIB_1BPP_PutPixel(DestSurf, i, j, 0); + } else { + DIB_1BPP_PutPixel(DestSurf, i, j, 1); + } + sx++; + } + sy++; + } + break; + + case 8: + for (j=DestRect->top; j<DestRect->bottom; j++) + { + sx = SourcePoint->x; + for (i=DestRect->left; i<DestRect->right; i++) + { + if(XLATEOBJ_iXlate(ColorTranslation, DIB_8BPP_GetPixel(SourceSurf, sx, sy)) == 0) + { + DIB_1BPP_PutPixel(DestSurf, i, j, 0); + } else { + DIB_1BPP_PutPixel(DestSurf, i, j, 1); + } + sx++; + } + sy++; + } + break; + + case 16: + for (j=DestRect->top; j<DestRect->bottom; j++) + { + sx = SourcePoint->x; + for (i=DestRect->left; i<DestRect->right; i++) + { + if(XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy)) == 0) + { + DIB_1BPP_PutPixel(DestSurf, i, j, 0); + } else { + DIB_1BPP_PutPixel(DestSurf, i, j, 1); + } + sx++; + } + sy++; + } + break; + + case 24: + for (j=DestRect->top; j<DestRect->bottom; j++) + { + sx = SourcePoint->x; + for (i=DestRect->left; i<DestRect->right; i++) + { + if(XLATEOBJ_iXlate(ColorTranslation, DIB_24BPP_GetPixel(SourceSurf, sx, sy)) == 0) + { + DIB_1BPP_PutPixel(DestSurf, i, j, 0); + } else { + DIB_1BPP_PutPixel(DestSurf, i, j, 1); + } + sx++; + } + sy++; + } + break; + + case 32: + for (j=DestRect->top; j<DestRect->bottom; j++) + { + sx = SourcePoint->x; + for (i=DestRect->left; i<DestRect->right; i++) + { + if(XLATEOBJ_iXlate(ColorTranslation, DIB_32BPP_GetPixel(SourceSurf, sx, sy)) == 0) + { + DIB_1BPP_PutPixel(DestSurf, i, j, 0); + } else { + DIB_1BPP_PutPixel(DestSurf, i, j, 1); + } + sx++; + } + sy++; + } + break; + + default: + DbgPrint("DIB_1BPP_BitBlt: Unhandled Source BPP: %u\n", SourceGDI->BitsPerPixel); + return FALSE; + } + + return TRUE; } -BOOLEAN DIB_1BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, - RECTL* DestRect, RECTL *SourceRect, - POINTL* MaskOrigin, POINTL* BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Mode) +BOOLEAN +DIB_1BPP_BitBlt( + SURFOBJ *DestSurf, SURFOBJ *SourceSurf, + SURFGDI *DestGDI, SURFGDI *SourceGDI, + PRECTL DestRect, POINTL *SourcePoint, + PBRUSHOBJ Brush, PPOINTL BrushOrigin, + XLATEOBJ *ColorTranslation, ULONG Rop4) { - DbgPrint("DIB_1BPP_StretchBlt: Source BPP: %u\n", SourceGDI->BitsPerPixel); - return FALSE; + LONG i, j, k, sx, sy; + ULONG Dest, Source, Pattern; + PULONG DestBits; + BOOL UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); + BOOL UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); + LONG RoundedRight = DestRect->right - ((DestRect->right - DestRect->left) & 0x7); + + if (Rop4 == SRCCOPY) + { + return(DIB_1BPP_BitBltSrcCopy(DestSurf, SourceSurf, DestGDI, SourceGDI, DestRect, SourcePoint, ColorTranslation)); + } + else + { + sy = SourcePoint->y; + + for (j=DestRect->top; j<DestRect->bottom; j++) + { + sx = SourcePoint->x; + DestBits = (PULONG)(DestSurf->pvScan0 + (DestRect->left>>3) + j * DestSurf->lDelta); + for (i=DestRect->left; i<RoundedRight; i+=32, DestBits++) + { + Dest = *DestBits; + if (UsesSource) + { + Source = 0; + for (k = 0; k < 32; k++) + { + Source |= (DIB_GetSource(SourceSurf, SourceGDI, sx + (i - DestRect->left) + k, sy, ColorTranslation) << k); + } + } + if (UsesPattern) + { + /* FIXME: No support for pattern brushes. */ + Pattern = Brush->iSolidColor ? 0xFFFFFFFF : 0x00000000; + } + *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); + } + if (i < DestRect->right) + { + Dest = *DestBits; + for (; i < DestRect->right; i++) + { + if (UsesSource) + { + Source = DIB_GetSource(SourceSurf, SourceGDI, sx + (i - DestRect->left), sy, ColorTranslation); + } + if (UsesPattern) + { + /* FIXME: No support for pattern brushes. */ + Pattern = Brush->iSolidColor ? 0xFFFFFFFF : 0x00000000; + } + DIB_1BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF); + Dest >>= 1; + } + } + sy++; + } + } + return TRUE; +} + +BOOLEAN +DIB_1BPP_StretchBlt ( + SURFOBJ *DestSurf, SURFOBJ *SourceSurf, + SURFGDI *DestGDI, SURFGDI *SourceGDI, + RECTL* DestRect, RECTL *SourceRect, + POINTL* MaskOrigin, POINTL* BrushOrigin, + XLATEOBJ *ColorTranslation, ULONG Mode) +{ + DbgPrint("DIB_1BPP_StretchBlt: Source BPP: %u\n", SourceGDI->BitsPerPixel); + return FALSE; } /* EOF */ From de1f68d59035a5a1b44d2702bdf08fff161b6600 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sun, 21 Mar 2004 10:18:33 +0000 Subject: [PATCH 0593/1463] fixed clipping issue svn path=/trunk/; revision=8825 --- reactos/subsys/win32k/eng/gradient.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/eng/gradient.c b/reactos/subsys/win32k/eng/gradient.c index 8db04065306..063606170ec 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.5 2004/02/24 13:27:02 weiden Exp $ +/* $Id: gradient.c,v 1.6 2004/03/21 10:18:33 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -274,7 +274,7 @@ IntEngGradientFillRect( FINITCOL(linefrom, lineto, 2); \ for(g = sx[linefrom]; g != sx[lineto]; g += gxi) \ { \ - if(g >= FillRect.left && g < FillRect.right) \ + 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); \ @@ -383,6 +383,8 @@ IntEngGradientFillTriangle( { if(NtGdiIntersectRect(&FillRect, &RectEnum.arcl[i], prclExtents)) { + BOOL InY; + DOINIT(v1, v3, 0); DOINIT(v1, v2, 1); DOINIT(v2, v3, 2); @@ -393,6 +395,7 @@ IntEngGradientFillTriangle( while(sy < bt) { + InY = !(sy < FillRect.top || sy >= FillRect.bottom); GOLINE(v1, v3, 0); DOLINE(v1, v3, 0); ENDLINE(v1, v3, 0); From d8f0a4b49f96a8a8b7f5108239bd2603e78949b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Sun, 21 Mar 2004 12:31:19 +0000 Subject: [PATCH 0594/1463] Silence debug messages svn path=/trunk/; revision=8826 --- reactos/drivers/video/videoprt/videoprt.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/video/videoprt/videoprt.h b/reactos/drivers/video/videoprt/videoprt.h index 452edbe0822..cb37851c8b1 100644 --- a/reactos/drivers/video/videoprt/videoprt.h +++ b/reactos/drivers/video/videoprt/videoprt.h @@ -18,7 +18,7 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: videoprt.h,v 1.8 2004/03/19 21:34:49 dwelch Exp $ + * $Id: videoprt.h,v 1.9 2004/03/21 12:31:19 gvg Exp $ */ #ifndef VIDEOPRT_H @@ -28,7 +28,7 @@ #include <ddk/video.h> #include <ddk/ntddvdeo.h> #include <ddk/ntapi.h> -/* #define NDEBUG */ +#define NDEBUG #include <debug.h> int swprintf(wchar_t *buf, const wchar_t *fmt, ...); From 8f6061137ae90e79f43dee7848fdddd34d5f0b2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Sun, 21 Mar 2004 12:34:02 +0000 Subject: [PATCH 0595/1463] Fix calling convention of various callback function prototypes svn path=/trunk/; revision=8827 --- reactos/include/base.h | 162 +++++++++++++++++++------------------- reactos/include/epsapi.h | 10 +-- reactos/include/structs.h | 28 +++---- 3 files changed, 100 insertions(+), 100 deletions(-) diff --git a/reactos/include/base.h b/reactos/include/base.h index 848727e9453..6e1210168ce 100644 --- a/reactos/include/base.h +++ b/reactos/include/base.h @@ -150,7 +150,7 @@ typedef HANDLE HWND; typedef HANDLE HRAWINPUT; typedef HANDLE HTASK; typedef HANDLE HWINEVENTHOOK; -typedef VOID CALLBACK(* WINEVENTPROC)(HWINEVENTHOOK hWinEventHook,DWORD event,HWND hwnd,LONG idObject,LONG idChild,DWORD idEventThread,DWORD dwmsEventTime); +typedef VOID (CALLBACK *WINEVENTPROC)(HWINEVENTHOOK hWinEventHook,DWORD event,HWND hwnd,LONG idObject,LONG idChild,DWORD idEventThread,DWORD dwmsEventTime); typedef unsigned short LANGID; /*typedef DWORD LCID; */ typedef DWORD LCTYPE; @@ -498,71 +498,71 @@ typedef enum _AUDIT_EVENT_TYPE { AuditEventObjectAccess, AuditEventDirectoryServiceAccess } AUDIT_EVENT_TYPE, *PAUDIT_EVENT_TYPE; -typedef int CALLBACK (*BFFCALLBACK) (HWND, UINT, LPARAM, LPARAM); -typedef UINT CALLBACK (*LPCCHOOKPROC) (HWND, UINT, WPARAM, LPARAM); -typedef UINT CALLBACK (*LPCFHOOKPROC) (HWND, UINT, WPARAM, LPARAM); -typedef DWORD CALLBACK (*EDITSTREAMCALLBACK) (DWORD, LPBYTE, LONG, LONG); -typedef UINT CALLBACK (*LPFRHOOKPROC) (HWND, UINT, WPARAM, LPARAM); -typedef UINT CALLBACK (*LPOFNHOOKPROC) (HWND, UINT, WPARAM, LPARAM); -typedef UINT CALLBACK (*LPPRINTHOOKPROC) (HWND, UINT, WPARAM, LPARAM); -typedef UINT CALLBACK (*LPSETUPHOOKPROC) (HWND, UINT, WPARAM, LPARAM); -typedef WINBOOL CALLBACK (*DLGPROC) (HWND, UINT, WPARAM, LPARAM); -typedef int CALLBACK (*PFNPROPSHEETCALLBACK) (HWND, UINT, LPARAM); -typedef VOID CALLBACK (*LPSERVICE_MAIN_FUNCTIONA) (DWORD, LPSTR*); -typedef VOID CALLBACK (*LPSERVICE_MAIN_FUNCTIONW) (DWORD, LPWSTR*); -typedef int CALLBACK (*PFNTVCOMPARE) (LPARAM, LPARAM, LPARAM); -typedef LRESULT CALLBACK (*WNDPROC) (HWND, UINT, WPARAM, LPARAM); -typedef int CALLBACK (*FARPROC)(void); +typedef int (CALLBACK *BFFCALLBACK) (HWND, UINT, LPARAM, LPARAM); +typedef UINT (CALLBACK *LPCCHOOKPROC) (HWND, UINT, WPARAM, LPARAM); +typedef UINT (CALLBACK *LPCFHOOKPROC) (HWND, UINT, WPARAM, LPARAM); +typedef DWORD (CALLBACK *EDITSTREAMCALLBACK) (DWORD, LPBYTE, LONG, LONG); +typedef UINT (CALLBACK *LPFRHOOKPROC) (HWND, UINT, WPARAM, LPARAM); +typedef UINT (CALLBACK *LPOFNHOOKPROC) (HWND, UINT, WPARAM, LPARAM); +typedef UINT (CALLBACK *LPPRINTHOOKPROC) (HWND, UINT, WPARAM, LPARAM); +typedef UINT (CALLBACK *LPSETUPHOOKPROC) (HWND, UINT, WPARAM, LPARAM); +typedef WINBOOL (CALLBACK *DLGPROC) (HWND, UINT, WPARAM, LPARAM); +typedef int (CALLBACK *PFNPROPSHEETCALLBACK) (HWND, UINT, LPARAM); +typedef VOID (CALLBACK *LPSERVICE_MAIN_FUNCTIONA) (DWORD, LPSTR*); +typedef VOID (CALLBACK *LPSERVICE_MAIN_FUNCTIONW) (DWORD, LPWSTR*); +typedef int (CALLBACK *PFNTVCOMPARE) (LPARAM, LPARAM, LPARAM); +typedef LRESULT (CALLBACK *WNDPROC) (HWND, UINT, WPARAM, LPARAM); +typedef int (CALLBACK *FARPROC)(void); typedef FARPROC PROC; -typedef WINBOOL CALLBACK (*ENUMRESTYPEPROCA) (HANDLE, LPSTR, LONG); -typedef WINBOOL CALLBACK (*ENUMRESTYPEPROCW) (HANDLE, LPWSTR, LONG); -typedef WINBOOL CALLBACK (*ENUMRESNAMEPROCA) (HANDLE, LPCSTR, LPSTR, LONG); -typedef WINBOOL CALLBACK (*ENUMRESNAMEPROCW) (HANDLE, LPCWSTR, LPWSTR, LONG); -typedef WINBOOL CALLBACK (*ENUMRESLANGPROCA) (HANDLE, LPCSTR, LPCSTR, WORD, LONG); -typedef WINBOOL CALLBACK (*ENUMRESLANGPROCW) (HANDLE, LPCWSTR, LPCWSTR, WORD, LONG); -typedef WINBOOL CALLBACK (*DESKTOPENUMPROCA) (LPSTR, LPARAM); -typedef WINBOOL CALLBACK (*DESKTOPENUMPROCW) (LPWSTR, LPARAM); -typedef WINBOOL CALLBACK (*ENUMWINDOWSPROC) (HWND, LPARAM); -typedef WINBOOL CALLBACK (*ENUMWINDOWSTATIONPROCA) (LPSTR, LPARAM); -typedef WINBOOL CALLBACK (*ENUMWINDOWSTATIONPROCW) (LPWSTR, LPARAM); -typedef VOID CALLBACK (*SENDASYNCPROC) (HWND, UINT, DWORD, LRESULT); -typedef VOID CALLBACK (*TIMERPROC) (HWND, UINT, UINT, DWORD); -typedef WINBOOL CALLBACK (*GRAYSTRINGPROC) (HDC, LPARAM, int); -typedef WINBOOL CALLBACK (*DRAWSTATEPROC) (HDC, LPARAM, WPARAM, int, int); -typedef WINBOOL CALLBACK (*PROPENUMPROCEXA) (HWND, LPCSTR, HANDLE, DWORD); -typedef WINBOOL CALLBACK (*PROPENUMPROCEXW) (HWND, LPCWSTR, HANDLE, DWORD); -typedef WINBOOL CALLBACK (*PROPENUMPROCA) (HWND, LPCSTR, HANDLE); -typedef WINBOOL CALLBACK (*PROPENUMPROCW) (HWND, LPCWSTR, HANDLE); -typedef LRESULT CALLBACK (*HOOKPROC) (int, WPARAM, LPARAM); -typedef VOID CALLBACK (*ENUMOBJECTSPROC) (LPVOID, LPARAM); -typedef VOID CALLBACK (*LINEDDAPROC) (int, int, LPARAM); -typedef WINBOOL CALLBACK (*ABORTPROC) (HDC, int); -typedef UINT CALLBACK (*LPPAGEPAINTHOOK) (HWND, UINT, WPARAM, LPARAM ); -typedef UINT CALLBACK (*LPPAGESETUPHOOK) (HWND, UINT, WPARAM, LPARAM ); -typedef int CALLBACK (*ICMENUMPROCA) (LPSTR, LPARAM); -typedef int CALLBACK (*ICMENUMPROCW) (LPWSTR, LPARAM); +typedef WINBOOL (CALLBACK *ENUMRESTYPEPROCA) (HANDLE, LPSTR, LONG); +typedef WINBOOL (CALLBACK *ENUMRESTYPEPROCW) (HANDLE, LPWSTR, LONG); +typedef WINBOOL (CALLBACK *ENUMRESNAMEPROCA) (HANDLE, LPCSTR, LPSTR, LONG); +typedef WINBOOL (CALLBACK *ENUMRESNAMEPROCW) (HANDLE, LPCWSTR, LPWSTR, LONG); +typedef WINBOOL (CALLBACK *ENUMRESLANGPROCA) (HANDLE, LPCSTR, LPCSTR, WORD, LONG); +typedef WINBOOL (CALLBACK *ENUMRESLANGPROCW) (HANDLE, LPCWSTR, LPCWSTR, WORD, LONG); +typedef WINBOOL (CALLBACK *DESKTOPENUMPROCA) (LPSTR, LPARAM); +typedef WINBOOL (CALLBACK *DESKTOPENUMPROCW) (LPWSTR, LPARAM); +typedef WINBOOL (CALLBACK *ENUMWINDOWSPROC) (HWND, LPARAM); +typedef WINBOOL (CALLBACK *ENUMWINDOWSTATIONPROCA) (LPSTR, LPARAM); +typedef WINBOOL (CALLBACK *ENUMWINDOWSTATIONPROCW) (LPWSTR, LPARAM); +typedef VOID (CALLBACK *SENDASYNCPROC) (HWND, UINT, DWORD, LRESULT); +typedef VOID (CALLBACK *TIMERPROC) (HWND, UINT, UINT, DWORD); +typedef WINBOOL (CALLBACK *GRAYSTRINGPROC) (HDC, LPARAM, int); +typedef WINBOOL (CALLBACK *DRAWSTATEPROC) (HDC, LPARAM, WPARAM, int, int); +typedef WINBOOL (CALLBACK *PROPENUMPROCEXA) (HWND, LPCSTR, HANDLE, DWORD); +typedef WINBOOL (CALLBACK *PROPENUMPROCEXW) (HWND, LPCWSTR, HANDLE, DWORD); +typedef WINBOOL (CALLBACK *PROPENUMPROCA) (HWND, LPCSTR, HANDLE); +typedef WINBOOL (CALLBACK *PROPENUMPROCW) (HWND, LPCWSTR, HANDLE); +typedef LRESULT (CALLBACK *HOOKPROC) (int, WPARAM, LPARAM); +typedef VOID (CALLBACK *ENUMOBJECTSPROC) (LPVOID, LPARAM); +typedef VOID (CALLBACK *LINEDDAPROC) (int, int, LPARAM); +typedef WINBOOL (CALLBACK *ABORTPROC) (HDC, int); +typedef UINT (CALLBACK *LPPAGEPAINTHOOK) (HWND, UINT, WPARAM, LPARAM ); +typedef UINT (CALLBACK *LPPAGESETUPHOOK) (HWND, UINT, WPARAM, LPARAM ); +typedef int (CALLBACK *ICMENUMPROCA) (LPSTR, LPARAM); +typedef int (CALLBACK *ICMENUMPROCW) (LPWSTR, LPARAM); typedef LONG (*EDITWORDBREAKPROCEX) (char *, LONG, BYTE, INT); -typedef int CALLBACK (*PFNLVCOMPARE) (LPARAM, LPARAM, LPARAM); -typedef WINBOOL CALLBACK (*LOCALE_ENUMPROCA) (LPSTR); -typedef WINBOOL CALLBACK (*LOCALE_ENUMPROCW) (LPWSTR); -typedef WINBOOL CALLBACK (*CODEPAGE_ENUMPROCA) (LPSTR); -typedef WINBOOL CALLBACK (*CODEPAGE_ENUMPROCW) (LPWSTR); -typedef WINBOOL CALLBACK (*DATEFMT_ENUMPROCA) (LPSTR); -typedef WINBOOL CALLBACK (*DATEFMT_ENUMPROCW) (LPWSTR); -typedef WINBOOL CALLBACK (*TIMEFMT_ENUMPROCA) (LPSTR); -typedef WINBOOL CALLBACK (*TIMEFMT_ENUMPROCW) (LPWSTR); -typedef WINBOOL CALLBACK (*CALINFO_ENUMPROCA) (LPSTR); -typedef int CALLBACK (*EMFPLAYPROC)( HDC hdc, INT iFunction, HANDLE hPageQuery ); -typedef WINBOOL CALLBACK (*CALINFO_ENUMPROCW) (LPWSTR); -typedef WINBOOL CALLBACK (*PHANDLER_ROUTINE) (DWORD); -typedef VOID CALLBACK (*LPHANDLER_FUNCTION) (DWORD); -typedef DWORD CALLBACK (*LPHANDLER_FUNCTION_EX)(DWORD,DWORD,LPVOID,LPVOID); -typedef UINT CALLBACK (*PFNGETPROFILEPATHA) (LPCSTR, LPSTR, UINT); -typedef UINT CALLBACK (*PFNGETPROFILEPATHW) (LPCWSTR, LPWSTR, UINT); -typedef UINT CALLBACK (*PFNRECONCILEPROFILEA) (LPCSTR, LPCSTR, DWORD); -typedef UINT CALLBACK (*PFNRECONCILEPROFILEW) (LPCWSTR, LPCWSTR, DWORD); -typedef WINBOOL CALLBACK (*PFNPROCESSPOLICIESA) (HWND, LPCSTR, LPCSTR, LPCSTR, DWORD); -typedef WINBOOL CALLBACK (*PFNPROCESSPOLICIESW) (HWND, LPCWSTR, LPCWSTR, LPCWSTR, DWORD); +typedef int (CALLBACK *PFNLVCOMPARE) (LPARAM, LPARAM, LPARAM); +typedef WINBOOL (CALLBACK *LOCALE_ENUMPROCA) (LPSTR); +typedef WINBOOL (CALLBACK *LOCALE_ENUMPROCW) (LPWSTR); +typedef WINBOOL (CALLBACK *CODEPAGE_ENUMPROCA) (LPSTR); +typedef WINBOOL (CALLBACK *CODEPAGE_ENUMPROCW) (LPWSTR); +typedef WINBOOL (CALLBACK *DATEFMT_ENUMPROCA) (LPSTR); +typedef WINBOOL (CALLBACK *DATEFMT_ENUMPROCW) (LPWSTR); +typedef WINBOOL (CALLBACK *TIMEFMT_ENUMPROCA) (LPSTR); +typedef WINBOOL (CALLBACK *TIMEFMT_ENUMPROCW) (LPWSTR); +typedef WINBOOL (CALLBACK *CALINFO_ENUMPROCA) (LPSTR); +typedef int (CALLBACK *EMFPLAYPROC)( HDC hdc, INT iFunction, HANDLE hPageQuery ); +typedef WINBOOL (CALLBACK *CALINFO_ENUMPROCW) (LPWSTR); +typedef WINBOOL (CALLBACK *PHANDLER_ROUTINE) (DWORD); +typedef VOID (CALLBACK *LPHANDLER_FUNCTION) (DWORD); +typedef DWORD (CALLBACK *LPHANDLER_FUNCTION_EX)(DWORD,DWORD,LPVOID,LPVOID); +typedef UINT (CALLBACK *PFNGETPROFILEPATHA) (LPCSTR, LPSTR, UINT); +typedef UINT (CALLBACK *PFNGETPROFILEPATHW) (LPCWSTR, LPWSTR, UINT); +typedef UINT (CALLBACK *PFNRECONCILEPROFILEA) (LPCSTR, LPCSTR, DWORD); +typedef UINT (CALLBACK *PFNRECONCILEPROFILEW) (LPCWSTR, LPCWSTR, DWORD); +typedef WINBOOL (CALLBACK *PFNPROCESSPOLICIESA) (HWND, LPCSTR, LPCSTR, LPCSTR, DWORD); +typedef WINBOOL (CALLBACK *PFNPROCESSPOLICIESW) (HWND, LPCWSTR, LPCWSTR, LPCWSTR, DWORD); #ifndef _DISABLE_TIDENTS #ifdef UNICODE @@ -636,18 +636,18 @@ typedef WINBOOL CALLBACK (*PFNPROCESSPOLICIESW) (HWND, LPCWSTR, LPCWSTR, LPCWSTR #define SE_CHANGE_NOTIFY_NAME TEXT("SeChangeNotifyPrivilege") #define SE_REMOTE_SHUTDOWN_NAME TEXT("SeRemoteShutdownPrivilege") -typedef BOOL CALLBACK (*LANGUAGEGROUP_ENUMPROCA)(LGRPID, LPSTR, LPSTR, DWORD, LONG_PTR); -typedef BOOL CALLBACK (*LANGGROUPLOCALE_ENUMPROCA)(LGRPID, LCID, LPSTR, LONG_PTR); -typedef BOOL CALLBACK (*UILANGUAGE_ENUMPROCA)(LPSTR, LONG_PTR); -typedef BOOL CALLBACK (*DATEFMT_ENUMPROCEXA)(LPSTR, CALID); -typedef BOOL CALLBACK (*CALINFO_ENUMPROCEXA)(LPSTR, CALID); +typedef BOOL (CALLBACK *LANGUAGEGROUP_ENUMPROCA)(LGRPID, LPSTR, LPSTR, DWORD, LONG_PTR); +typedef BOOL (CALLBACK *LANGGROUPLOCALE_ENUMPROCA)(LGRPID, LCID, LPSTR, LONG_PTR); +typedef BOOL (CALLBACK *UILANGUAGE_ENUMPROCA)(LPSTR, LONG_PTR); +typedef BOOL (CALLBACK *DATEFMT_ENUMPROCEXA)(LPSTR, CALID); +typedef BOOL (CALLBACK *CALINFO_ENUMPROCEXA)(LPSTR, CALID); -typedef BOOL CALLBACK (*LANGUAGEGROUP_ENUMPROCW)(LGRPID, LPWSTR, LPWSTR, DWORD, LONG_PTR); -typedef BOOL CALLBACK (*LANGGROUPLOCALE_ENUMPROCW)(LGRPID, LCID, LPWSTR, LONG_PTR); -typedef BOOL CALLBACK (*UILANGUAGE_ENUMPROCW)(LPWSTR, LONG_PTR); -typedef BOOL CALLBACK (*DATEFMT_ENUMPROCEXW)(LPWSTR, CALID); -typedef BOOL CALLBACK (*CALINFO_ENUMPROCEXW)(LPWSTR, CALID); -typedef BOOL CALLBACK (*GEO_ENUMPROC)(GEOID); +typedef BOOL (CALLBACK *LANGUAGEGROUP_ENUMPROCW)(LGRPID, LPWSTR, LPWSTR, DWORD, LONG_PTR); +typedef BOOL (CALLBACK *LANGGROUPLOCALE_ENUMPROCW)(LGRPID, LCID, LPWSTR, LONG_PTR); +typedef BOOL (CALLBACK *UILANGUAGE_ENUMPROCW)(LPWSTR, LONG_PTR); +typedef BOOL (CALLBACK *DATEFMT_ENUMPROCEXW)(LPWSTR, CALID); +typedef BOOL (CALLBACK *CALINFO_ENUMPROCEXW)(LPWSTR, CALID); +typedef BOOL (CALLBACK *GEO_ENUMPROC)(GEOID); #define SERVICES_ACTIVE_DATABASEW L"ServicesActive" #define SERVICES_FAILED_DATABASEW L"ServicesFailed" @@ -700,13 +700,13 @@ typedef enum { LT_LOWEST_LATENCY } LATENCY_TIME; -typedef LONG CALLBACK (*PVECTORED_EXCEPTION_HANDLER)( +typedef LONG (CALLBACK *PVECTORED_EXCEPTION_HANDLER)( struct _EXCEPTION_POINTERS *ExceptionInfo ); typedef VOID -CALLBACK (*PAPCFUNC)( +(CALLBACK *PAPCFUNC)( ULONG_PTR dwParam ); @@ -716,10 +716,10 @@ CALLBACK (*PAPCFUNC)( #define REFGUID const GUID * #endif -typedef DWORD CALLBACK (*PFE_EXPORT_FUNC)(PBYTE pbData,PVOID pvCallbackContext,ULONG ulLength); +typedef DWORD (CALLBACK *PFE_EXPORT_FUNC)(PBYTE pbData,PVOID pvCallbackContext,ULONG ulLength); -typedef DWORD CALLBACK (*PFE_IMPORT_FUNC)(PBYTE pbData,PVOID pvCallbackContext,PULONG ulLength); -typedef VOID CALLBACK (*PFIBER_START_ROUTINE)( +typedef DWORD (CALLBACK *PFE_IMPORT_FUNC)(PBYTE pbData,PVOID pvCallbackContext,PULONG ulLength); +typedef VOID (CALLBACK *PFIBER_START_ROUTINE)( LPVOID lpFiberParameter ); typedef PFIBER_START_ROUTINE LPFIBER_START_ROUTINE; @@ -729,7 +729,7 @@ typedef enum _MEMORY_RESOURCE_NOTIFICATION_TYPE { HighMemoryResourceNotification } MEMORY_RESOURCE_NOTIFICATION_TYPE; -typedef VOID CALLBACK (*WAITORTIMERCALLBACKFUNC) (PVOID, BOOLEAN ); +typedef VOID (CALLBACK *WAITORTIMERCALLBACKFUNC) (PVOID, BOOLEAN ); typedef WAITORTIMERCALLBACKFUNC WAITORTIMERCALLBACK; /* End of stuff from ddeml.h in old Cygnus headers */ /* ----------------------------------------------- */ diff --git a/reactos/include/epsapi.h b/reactos/include/epsapi.h index 01db5edcc42..cac0fcd3a65 100644 --- a/reactos/include/epsapi.h +++ b/reactos/include/epsapi.h @@ -1,4 +1,4 @@ -/* $Id: epsapi.h,v 1.3 2003/06/01 14:59:01 chorns Exp $ +/* $Id: epsapi.h,v 1.4 2004/03/21 12:34:02 gvg Exp $ */ /* * epsapi.h @@ -32,25 +32,25 @@ /* OBJECTS */ /* TYPES */ -typedef NTSTATUS NTAPI (*PPROC_ENUM_ROUTINE) +typedef NTSTATUS (NTAPI *PPROC_ENUM_ROUTINE) ( IN PSYSTEM_PROCESSES CurrentProcess, IN OUT PVOID CallbackContext ); -typedef NTSTATUS NTAPI (*PTHREAD_ENUM_ROUTINE) +typedef NTSTATUS (NTAPI *PTHREAD_ENUM_ROUTINE) ( IN PSYSTEM_THREADS CurrentThread, IN OUT PVOID CallbackContext ); -typedef NTSTATUS NTAPI (*PSYSMOD_ENUM_ROUTINE) +typedef NTSTATUS (NTAPI *PSYSMOD_ENUM_ROUTINE) ( IN PSYSTEM_MODULE_INFORMATION_ENTRY CurrentModule, IN OUT PVOID CallbackContext ); -typedef NTSTATUS NTAPI (*PPROCMOD_ENUM_ROUTINE) +typedef NTSTATUS (NTAPI *PPROCMOD_ENUM_ROUTINE) ( IN HANDLE ProcessHandle, IN PLDR_MODULE CurrentModule, diff --git a/reactos/include/structs.h b/reactos/include/structs.h index db33b5bdeb2..8bc4bec495e 100644 --- a/reactos/include/structs.h +++ b/reactos/include/structs.h @@ -3447,7 +3447,7 @@ typedef struct tagMSG { POINT pt; } MSG, *LPMSG; -typedef void CALLBACK (*MSGBOXCALLBACK) (LPHELPINFO lpHelpInfo); +typedef void (CALLBACK *MSGBOXCALLBACK) (LPHELPINFO lpHelpInfo); typedef struct { UINT cbSize; @@ -4492,7 +4492,7 @@ typedef struct _PROCESS_INFORMATION { DWORD dwThreadId; } PROCESS_INFORMATION, *LPPROCESS_INFORMATION; -typedef UINT CALLBACK (*LPFNPSPCALLBACK) (HWND, UINT, LPVOID); +typedef UINT (CALLBACK *LPFNPSPCALLBACK) (HWND, UINT, LPVOID); typedef struct _PROPSHEETPAGEA { DWORD dwSize; @@ -4591,8 +4591,8 @@ typedef_tident(LPPROPSHEETHEADER) typedef_tident(LPCPROPSHEETHEADER) /* PropertySheet callbacks */ -typedef WINBOOL CALLBACK (*LPFNADDPROPSHEETPAGE) (HPROPSHEETPAGE, LPARAM); -typedef WINBOOL CALLBACK (*LPFNADDPROPSHEETPAGES) (LPVOID, +typedef WINBOOL (CALLBACK *LPFNADDPROPSHEETPAGE) (HPROPSHEETPAGE, LPARAM); +typedef WINBOOL (CALLBACK *LPFNADDPROPSHEETPAGES) (LPVOID, LPFNADDPROPSHEETPAGE, LPARAM); @@ -5799,26 +5799,26 @@ typedef struct _NETCONNECTINFOSTRUCT{ DWORD dwOptDataSize; } NETCONNECTINFOSTRUCT, *LPNETCONNECTINFOSTRUCT; -typedef int CALLBACK (*ENUMMETAFILEPROC) (HDC, HANDLETABLE, +typedef int (CALLBACK *ENUMMETAFILEPROC) (HDC, HANDLETABLE, METARECORD, int, LPARAM); -typedef int CALLBACK (*ENHMETAFILEPROC) (HDC, HANDLETABLE, +typedef int (CALLBACK *ENHMETAFILEPROC) (HDC, HANDLETABLE, ENHMETARECORD, int, LPARAM); -typedef int CALLBACK (*ENUMFONTSPROCA) (LPLOGFONTA, LPTEXTMETRICA, DWORD, LPARAM); -typedef int CALLBACK (*ENUMFONTSPROCW) (LPLOGFONTW, LPTEXTMETRICW, DWORD, LPARAM); +typedef int (CALLBACK *ENUMFONTSPROCA) (LPLOGFONTA, LPTEXTMETRICA, DWORD, LPARAM); +typedef int (CALLBACK *ENUMFONTSPROCW) (LPLOGFONTW, LPTEXTMETRICW, DWORD, LPARAM); typedef_tident(ENUMFONTSPROC) -typedef int CALLBACK (*FONTENUMPROCA) (ENUMLOGFONTA *, NEWTEXTMETRICA *, +typedef int (CALLBACK *FONTENUMPROCA) (ENUMLOGFONTA *, NEWTEXTMETRICA *, int, LPARAM); -typedef int CALLBACK (*FONTENUMPROCW) (ENUMLOGFONTW *, NEWTEXTMETRICW *, +typedef int (CALLBACK *FONTENUMPROCW) (ENUMLOGFONTW *, NEWTEXTMETRICW *, int, LPARAM); typedef_tident(FONTENUMPROC) -typedef int CALLBACK (*FONTENUMEXPROCA) (ENUMLOGFONTEXA *, NEWTEXTMETRICEXA *, +typedef int (CALLBACK *FONTENUMEXPROCA) (ENUMLOGFONTEXA *, NEWTEXTMETRICEXA *, int, LPARAM); -typedef int CALLBACK (*FONTENUMEXPROCW) (ENUMLOGFONTEXW *, NEWTEXTMETRICEXW *, +typedef int (CALLBACK *FONTENUMEXPROCW) (ENUMLOGFONTEXW *, NEWTEXTMETRICEXW *, int, LPARAM); typedef_tident(FONTENUMEXPROC) -typedef VOID CALLBACK (*LPOVERLAPPED_COMPLETION_ROUTINE) (DWORD, DWORD, +typedef VOID (CALLBACK *LPOVERLAPPED_COMPLETION_ROUTINE) (DWORD, DWORD, LPOVERLAPPED); /* @@ -5991,7 +5991,7 @@ typedef struct _DISPLAY_DEVICE { typedef HANDLE HMONITOR; typedef HANDLE HDEVNOTIFY; -typedef BOOL CALLBACK (*MonitorEnumProc)( +typedef BOOL (CALLBACK *MonitorEnumProc)( HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, From c4a7a3aa63fff41d1e17eca4da5f951907100e92 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 21 Mar 2004 14:35:19 +0000 Subject: [PATCH 0596/1463] - Fixed language definition and line endings. svn path=/trunk/; revision=8828 --- reactos/lib/cards/cards.rc | 254 ++++++++++++++++++------------------- 1 file changed, 127 insertions(+), 127 deletions(-) diff --git a/reactos/lib/cards/cards.rc b/reactos/lib/cards/cards.rc index e4f8eb33c79..b9a50db6212 100644 --- a/reactos/lib/cards/cards.rc +++ b/reactos/lib/cards/cards.rc @@ -1,127 +1,127 @@ -/* - * ReactOS Cards - * - * Copyright (C) 2003 Filip Navara <xnavara@volny.org> - * - * 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 <windows.h> -#include <reactos/resource.h> - -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US - -1 BITMAP "res/Clubs_Ace.bmp" -2 BITMAP "res/Clubs_Two.bmp" -3 BITMAP "res/Clubs_Three.bmp" -4 BITMAP "res/Clubs_Four.bmp" -5 BITMAP "res/Clubs_Five.bmp" -6 BITMAP "res/Clubs_Six.bmp" -7 BITMAP "res/Clubs_Seven.bmp" -8 BITMAP "res/Clubs_Eight.bmp" -9 BITMAP "res/Clubs_Nine.bmp" -10 BITMAP "res/Clubs_Ten.bmp" -11 BITMAP "res/Clubs_Jack.bmp" -12 BITMAP "res/Clubs_Queen.bmp" -13 BITMAP "res/Clubs_King.bmp" -14 BITMAP "res/Diamonds_Ace.bmp" -15 BITMAP "res/Diamonds_Two.bmp" -16 BITMAP "res/Diamonds_Three.bmp" -17 BITMAP "res/Diamonds_Four.bmp" -18 BITMAP "res/Diamonds_Five.bmp" -19 BITMAP "res/Diamonds_Six.bmp" -20 BITMAP "res/Diamonds_Seven.bmp" -21 BITMAP "res/Diamonds_Eight.bmp" -22 BITMAP "res/Diamonds_Nine.bmp" -23 BITMAP "res/Diamonds_Ten.bmp" -24 BITMAP "res/Diamonds_Jack.bmp" -25 BITMAP "res/Diamonds_Queen.bmp" -26 BITMAP "res/Diamonds_King.bmp" -27 BITMAP "res/Hearts_Ace.bmp" -28 BITMAP "res/Hearts_Two.bmp" -29 BITMAP "res/Hearts_Three.bmp" -30 BITMAP "res/Hearts_Four.bmp" -31 BITMAP "res/Hearts_Five.bmp" -32 BITMAP "res/Hearts_Six.bmp" -33 BITMAP "res/Hearts_Seven.bmp" -34 BITMAP "res/Hearts_Eight.bmp" -35 BITMAP "res/Hearts_Nine.bmp" -36 BITMAP "res/Hearts_Ten.bmp" -37 BITMAP "res/Hearts_Jack.bmp" -38 BITMAP "res/Hearts_Queen.bmp" -39 BITMAP "res/Hearts_King.bmp" -40 BITMAP "res/Spades_Ace.bmp" -41 BITMAP "res/Spades_Two.bmp" -42 BITMAP "res/Spades_Three.bmp" -43 BITMAP "res/Spades_Four.bmp" -44 BITMAP "res/Spades_Five.bmp" -45 BITMAP "res/Spades_Six.bmp" -46 BITMAP "res/Spades_Seven.bmp" -47 BITMAP "res/Spades_Eight.bmp" -48 BITMAP "res/Spades_Nine.bmp" -49 BITMAP "res/Spades_Ten.bmp" -50 BITMAP "res/Spades_Jack.bmp" -51 BITMAP "res/Spades_Queen.bmp" -52 BITMAP "res/Spades_King.bmp" -53 BITMAP "res/FreeCard.bmp" -54 BITMAP "res/Background_1.bmp" -55 BITMAP "res/Background_1.bmp" -56 BITMAP "res/Background_1.bmp" -57 BITMAP "res/Background_1.bmp" -58 BITMAP "res/Background_1.bmp" -59 BITMAP "res/Background_1.bmp" -60 BITMAP "res/Background_1.bmp" -61 BITMAP "res/Background_1.bmp" -62 BITMAP "res/Background_1.bmp" -63 BITMAP "res/Background_1.bmp" -64 BITMAP "res/Background_1.bmp" -65 BITMAP "res/Background_1.bmp" -66 BITMAP "res/Joker.bmp" -67 BITMAP "res/XSign.bmp" -68 BITMAP "res/OSign.bmp" - - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 5,1,2600,0 - 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", "Cardplaying Helper DLL\0" - VALUE "FileVersion", "5.1.2600\0" - VALUE "InternalName", "cards\0" - VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT - VALUE "OriginalFilename", "cards.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 +/* + * ReactOS Cards + * + * Copyright (C) 2003 Filip Navara <xnavara@volny.org> + * + * 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 <windows.h> +#include <reactos/resource.h> + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +1 BITMAP "res/Clubs_Ace.bmp" +2 BITMAP "res/Clubs_Two.bmp" +3 BITMAP "res/Clubs_Three.bmp" +4 BITMAP "res/Clubs_Four.bmp" +5 BITMAP "res/Clubs_Five.bmp" +6 BITMAP "res/Clubs_Six.bmp" +7 BITMAP "res/Clubs_Seven.bmp" +8 BITMAP "res/Clubs_Eight.bmp" +9 BITMAP "res/Clubs_Nine.bmp" +10 BITMAP "res/Clubs_Ten.bmp" +11 BITMAP "res/Clubs_Jack.bmp" +12 BITMAP "res/Clubs_Queen.bmp" +13 BITMAP "res/Clubs_King.bmp" +14 BITMAP "res/Diamonds_Ace.bmp" +15 BITMAP "res/Diamonds_Two.bmp" +16 BITMAP "res/Diamonds_Three.bmp" +17 BITMAP "res/Diamonds_Four.bmp" +18 BITMAP "res/Diamonds_Five.bmp" +19 BITMAP "res/Diamonds_Six.bmp" +20 BITMAP "res/Diamonds_Seven.bmp" +21 BITMAP "res/Diamonds_Eight.bmp" +22 BITMAP "res/Diamonds_Nine.bmp" +23 BITMAP "res/Diamonds_Ten.bmp" +24 BITMAP "res/Diamonds_Jack.bmp" +25 BITMAP "res/Diamonds_Queen.bmp" +26 BITMAP "res/Diamonds_King.bmp" +27 BITMAP "res/Hearts_Ace.bmp" +28 BITMAP "res/Hearts_Two.bmp" +29 BITMAP "res/Hearts_Three.bmp" +30 BITMAP "res/Hearts_Four.bmp" +31 BITMAP "res/Hearts_Five.bmp" +32 BITMAP "res/Hearts_Six.bmp" +33 BITMAP "res/Hearts_Seven.bmp" +34 BITMAP "res/Hearts_Eight.bmp" +35 BITMAP "res/Hearts_Nine.bmp" +36 BITMAP "res/Hearts_Ten.bmp" +37 BITMAP "res/Hearts_Jack.bmp" +38 BITMAP "res/Hearts_Queen.bmp" +39 BITMAP "res/Hearts_King.bmp" +40 BITMAP "res/Spades_Ace.bmp" +41 BITMAP "res/Spades_Two.bmp" +42 BITMAP "res/Spades_Three.bmp" +43 BITMAP "res/Spades_Four.bmp" +44 BITMAP "res/Spades_Five.bmp" +45 BITMAP "res/Spades_Six.bmp" +46 BITMAP "res/Spades_Seven.bmp" +47 BITMAP "res/Spades_Eight.bmp" +48 BITMAP "res/Spades_Nine.bmp" +49 BITMAP "res/Spades_Ten.bmp" +50 BITMAP "res/Spades_Jack.bmp" +51 BITMAP "res/Spades_Queen.bmp" +52 BITMAP "res/Spades_King.bmp" +53 BITMAP "res/FreeCard.bmp" +54 BITMAP "res/Background_1.bmp" +55 BITMAP "res/Background_1.bmp" +56 BITMAP "res/Background_1.bmp" +57 BITMAP "res/Background_1.bmp" +58 BITMAP "res/Background_1.bmp" +59 BITMAP "res/Background_1.bmp" +60 BITMAP "res/Background_1.bmp" +61 BITMAP "res/Background_1.bmp" +62 BITMAP "res/Background_1.bmp" +63 BITMAP "res/Background_1.bmp" +64 BITMAP "res/Background_1.bmp" +65 BITMAP "res/Background_1.bmp" +66 BITMAP "res/Joker.bmp" +67 BITMAP "res/XSign.bmp" +68 BITMAP "res/OSign.bmp" + + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 5,1,2600,0 + 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", "Cardplaying Helper DLL\0" + VALUE "FileVersion", "5.1.2600\0" + VALUE "InternalName", "cards\0" + VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT + VALUE "OriginalFilename", "cards.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 From 722728fd5c5f2963574cdac26e218121199c8795 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 21 Mar 2004 14:37:19 +0000 Subject: [PATCH 0597/1463] - A message box with timeout informing about successful installation and restart. svn path=/trunk/; revision=8829 --- reactos/lib/syssetup/Makefile | 10 +++--- reactos/lib/syssetup/dllmain.c | 9 ++--- reactos/lib/syssetup/install.c | 51 +++++++++++++++++++++++++++-- reactos/lib/syssetup/resource.h | 25 ++++++++++++++ reactos/lib/syssetup/syssetup.rc | 13 ++++++-- reactos/lib/syssetup/syssetup_Cz.rc | 31 ++++++++++++++++++ reactos/lib/syssetup/syssetup_En.rc | 31 ++++++++++++++++++ 7 files changed, 155 insertions(+), 15 deletions(-) create mode 100644 reactos/lib/syssetup/resource.h create mode 100644 reactos/lib/syssetup/syssetup_Cz.rc create mode 100644 reactos/lib/syssetup/syssetup_En.rc diff --git a/reactos/lib/syssetup/Makefile b/reactos/lib/syssetup/Makefile index 40dbc727040..e5c237bcbcb 100644 --- a/reactos/lib/syssetup/Makefile +++ b/reactos/lib/syssetup/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.5 2004/01/23 10:34:23 ekohl Exp $ +# $Id: Makefile,v 1.6 2004/03/21 14:37:18 navaraf Exp $ PATH_TO_TOP = ../.. @@ -8,20 +8,18 @@ TARGET_NAME = syssetup TARGET_BASE = 0x74A30000 -TARGET_SDKLIBS = ntdll.a kernel32.a advapi32.a gdi32.a user32.a samlib.a userenv.a -# comctl32.a +TARGET_SDKLIBS = ntdll.a kernel32.a advapi32.a gdi32.a user32.a samlib.a userenv.a comctl32.a TARGET_CFLAGS = -Wall -Werror -fno-builtin -# require os code to explicitly request A/W version of structs/functions -TARGET_CFLAGS += -D_DISABLE_TIDENTS +TARGET_CFLAGS += -D__USE_W32API -D_WIN32_IE=0x0500 +TARGET_RCFLAGS += -D__USE_W32API -D_WIN32_IE=0x0500 TARGET_LFLAGS = -nostartfiles -nostdlib TARGET_OBJECTS = dllmain.o install.o logfile.o # wizard.o - include $(PATH_TO_TOP)/rules.mak include $(TOOLS_PATH)/helper.mk diff --git a/reactos/lib/syssetup/dllmain.c b/reactos/lib/syssetup/dllmain.c index 0306eef43e6..cc9485bdf73 100644 --- a/reactos/lib/syssetup/dllmain.c +++ b/reactos/lib/syssetup/dllmain.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: dllmain.c,v 1.1 2003/05/02 18:07:55 ekohl Exp $ +/* $Id: dllmain.c,v 1.2 2004/03/21 14:37:19 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -28,11 +28,10 @@ /* INCLUDES *****************************************************************/ #include <windows.h> - +#include <commctrl.h> /* GLOBALS *******************************************************************/ - /* FUNCTIONS *****************************************************************/ BOOL STDCALL @@ -40,8 +39,10 @@ DllMain (HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { + if (dwReason == DLL_PROCESS_ATTACH) + InitCommonControls(); - return TRUE; + return TRUE; } /* EOF */ diff --git a/reactos/lib/syssetup/install.c b/reactos/lib/syssetup/install.c index e0a6f247f45..840f0d572d4 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.8 2004/01/23 16:51:41 navaraf Exp $ +/* $Id: install.c,v 1.9 2004/03/21 14:37:19 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -29,11 +29,14 @@ #include <ntos.h> #include <windows.h> +#include <commctrl.h> #include <stdio.h> #include <samlib.h> #include <syssetup.h> +#include "resource.h" + // #define NO_GUI #if 0 @@ -132,6 +135,44 @@ AppendRidToSid (PSID *Dst, Dst); } +INT_PTR CALLBACK +RestartDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) + { + case WM_INITDIALOG: + SendDlgItemMessage(hWnd, IDC_RESTART_PROGRESS, PBM_SETRANGE, 0, + MAKELPARAM(0, 300)); + SetTimer(hWnd, 0, 50, NULL); + return TRUE; + + case WM_TIMER: + { + INT Position; + HWND hWndProgress; + + hWndProgress = GetDlgItem(hWnd, IDC_RESTART_PROGRESS); + Position = SendMessage(hWndProgress, PBM_GETPOS, 0, 0); + if (Position == 300) + EndDialog(hWnd, 0); + else + SendMessage(hWndProgress, PBM_SETPOS, Position + 1, 0); + } + return TRUE; + + case WM_COMMAND: + switch (wParam) + { + case IDOK: + case IDCANCEL: + EndDialog(hWnd, 0); + return TRUE; + } + break; + } + + return FALSE; +} DWORD STDCALL InstallReactOS (HINSTANCE hInstance) @@ -225,12 +266,16 @@ InstallReactOS (HINSTANCE hInstance) RtlFreeSid (AdminSid); RtlFreeSid (DomainSid); - DebugPrint ("System setup successful\n"); - #if 0 Wizard (); #endif + DialogBox( + GetModuleHandle(TEXT("syssetup.dll")), + MAKEINTRESOURCE(IDD_RESTART), + NULL, + RestartDlgProc); + return 0; } diff --git a/reactos/lib/syssetup/resource.h b/reactos/lib/syssetup/resource.h new file mode 100644 index 00000000000..08113f24434 --- /dev/null +++ b/reactos/lib/syssetup/resource.h @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2004 Filip Navara + * + * 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. + */ + +#ifndef RESOURCE_H +#define RESOURCE_H + +#define IDD_RESTART 1001 +#define IDC_RESTART_PROGRESS 1002 + +#endif /* RESOURCE_H */ diff --git a/reactos/lib/syssetup/syssetup.rc b/reactos/lib/syssetup/syssetup.rc index 318dfa28a2e..a844e8c4afd 100644 --- a/reactos/lib/syssetup/syssetup.rc +++ b/reactos/lib/syssetup/syssetup.rc @@ -1,7 +1,8 @@ -#include <defines.h> +#include <windows.h> #include <reactos/resource.h> +#include "resource.h" -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL VS_VERSION_INFO VERSIONINFO FILEVERSION RES_UINT_FV_MAJOR,RES_UINT_FV_MINOR,RES_UINT_FV_REVISION,RES_UINT_FV_BUILD @@ -36,3 +37,11 @@ BEGIN END END +/* + * Everything specific to any language goes in one of the specific + * files. Note that you can and may override resources which also have + * a neutral version. This is to get localized bitmaps for example. + */ + +#include "syssetup_En.rc" +#include "syssetup_Cz.rc" diff --git a/reactos/lib/syssetup/syssetup_Cz.rc b/reactos/lib/syssetup/syssetup_Cz.rc new file mode 100644 index 00000000000..4057d9b9955 --- /dev/null +++ b/reactos/lib/syssetup/syssetup_Cz.rc @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2004 Filip Navara + * + * 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. + */ + +LANGUAGE LANG_CZECH, SUBLANG_DEFAULT + +IDD_RESTART DIALOG 6, 18, 245, 116 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "Instatalace ReactOSu" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Instalace ReactOSu byla 鷖p鞖n dokon鑕na.", -1, 13, 12, 212, 16 + LTEXT "Pro pokra鑟v醤 pot鴈buje instala鑞 program restartovat V釟 po桧ta. Po桧ta bude automaticky restartov醤 za 15 sekund nebo zm徼knete-li tla桧tko Restartovat.", -1, 13, 33, 212, 32 +/* GROUPBOX "", -1, 7, 3, 231, 106 */ + CONTROL "", IDC_RESTART_PROGRESS, "msctls_progress32", PBS_SMOOTH | WS_CHILD | WS_VISIBLE | WS_BORDER, 13, 70, 212, 8 + PUSHBUTTON "&Restartovat", IDOK, 98, 87, 50, 14 +END diff --git a/reactos/lib/syssetup/syssetup_En.rc b/reactos/lib/syssetup/syssetup_En.rc new file mode 100644 index 00000000000..9754203df54 --- /dev/null +++ b/reactos/lib/syssetup/syssetup_En.rc @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2004 Filip Navara + * + * 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. + */ + +LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT + +IDD_RESTART DIALOG 6, 18, 245, 116 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "ReactOS Installation" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Installation of ReactOS was successfully completed.", -1, 13, 12, 212, 16 + LTEXT "In order to continue, the installation program needs to restart your computer. The computer will be automatically restarted in 15 seconds or if you press the Restart button.", -1, 13, 33, 212, 32 +/* GROUPBOX "", -1, 7, 3, 231, 106 */ + CONTROL "", IDC_RESTART_PROGRESS, "msctls_progress32", PBS_SMOOTH | WS_CHILD | WS_VISIBLE | WS_BORDER, 13, 70, 212, 8 + PUSHBUTTON "&Restart", IDOK, 98, 87, 50, 14 +END From bb917ce9752819ad7cff2fd64b0fbd6f65035ee5 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 21 Mar 2004 18:58:53 +0000 Subject: [PATCH 0598/1463] - Support for upper level filter drivers. NOTE: Although the support for lower level filter driver is very similar, it's practically impossible to incorporate it with the current design without avoiding bugs such as #262 or #263. I don't want to extend the current mess beyond it's borders, so I ommited the call for initializing lower level filter drivers. The code needs a major cleanup and simplification on some places to make this support possible while maintaining a reasonable stable system. svn path=/trunk/; revision=8830 --- reactos/ntoskrnl/include/internal/io.h | 16 +++- reactos/ntoskrnl/io/device.c | 128 ++++++++++++++++++++++++- reactos/ntoskrnl/io/driver.c | 25 +++-- reactos/ntoskrnl/io/pnpmgr.c | 12 ++- 4 files changed, 158 insertions(+), 23 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/io.h b/reactos/ntoskrnl/include/internal/io.h index 7aa02e4bb15..082f9202512 100644 --- a/reactos/ntoskrnl/include/internal/io.h +++ b/reactos/ntoskrnl/include/internal/io.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: io.h,v 1.39 2004/03/14 17:10:48 navaraf Exp $ +/* $Id: io.h,v 1.40 2004/03/21 18:58:52 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -386,6 +386,19 @@ NTSTATUS PnpRootCreateDevice( PDEVICE_OBJECT *PhysicalDeviceObject); +/* device.c */ + +NTSTATUS +IopAttachFilterDrivers( + PDEVICE_NODE DeviceNode, + BOOLEAN Lower); + +NTSTATUS +IopInitializeService( + PDEVICE_NODE DeviceNode, + PUNICODE_STRING ServiceName, + PUNICODE_STRING ImagePath); + /* driver.c */ VOID @@ -399,6 +412,7 @@ IopInitializeSystemDrivers( NTSTATUS IopInitializeDeviceNodeService( PDEVICE_NODE DeviceNode, + PUNICODE_STRING ServiceName, BOOLEAN BootDriverOnly); VOID diff --git a/reactos/ntoskrnl/io/device.c b/reactos/ntoskrnl/io/device.c index ecfee43cd38..5b9cfeb120f 100644 --- a/reactos/ntoskrnl/io/device.c +++ b/reactos/ntoskrnl/io/device.c @@ -1,4 +1,4 @@ -/* $Id: device.c,v 1.67 2004/03/14 17:10:48 navaraf Exp $ +/* $Id: device.c,v 1.68 2004/03/21 18:58:53 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -345,13 +345,130 @@ IopCreateDriverObject(PDRIVER_OBJECT *DriverObject, return STATUS_SUCCESS; } -NTSTATUS -IopAttachFilterDrivers(PDEVICE_NODE DeviceNode, - BOOLEAN Lower) + +NTSTATUS STDCALL +IopAttachFilterDriversCallback( + PWSTR ValueName, + ULONG ValueType, + PVOID ValueData, + ULONG ValueLength, + PVOID Context, + PVOID EntryContext) { + PDEVICE_NODE DeviceNode = Context; + UNICODE_STRING ServiceName; + PWCHAR Filters; + + Filters = ValueData; + while (((ULONG_PTR)Filters - (ULONG_PTR)ValueData) < ValueLength && + *Filters != 0) + { + DPRINT1("Filter Driver: %S (%wZ)\n", Filters, &DeviceNode->InstancePath); + ServiceName.Buffer = Filters; + ServiceName.MaximumLength = + ServiceName.Length = wcslen(Filters) * sizeof(WCHAR); + IopInitializeDeviceNodeService( + DeviceNode, + &ServiceName, + FALSE); + Filters += (ServiceName.Length / sizeof(WCHAR)) + 1; + } + return STATUS_SUCCESS; } + +NTSTATUS +IopAttachFilterDrivers( + PDEVICE_NODE DeviceNode, + BOOLEAN Lower) +{ + RTL_QUERY_REGISTRY_TABLE QueryTable[2]; + PWCHAR KeyBuffer; + UNICODE_STRING Class; + WCHAR ClassBuffer[40]; + NTSTATUS Status; + + /* + * First load the device filters + */ + + QueryTable[0].QueryRoutine = IopAttachFilterDriversCallback; + if (Lower) + QueryTable[0].Name = L"LowerFilters"; + else + QueryTable[0].Name = L"UpperFilters"; + QueryTable[0].EntryContext = NULL; + QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED; + QueryTable[1].QueryRoutine = NULL; + QueryTable[1].Name = NULL; + + KeyBuffer = ExAllocatePool( + PagedPool, + (49 * sizeof(WCHAR)) + DeviceNode->InstancePath.Length); + wcscpy(KeyBuffer, L"\\Registry\\Machine\\System\\CurrentControlSet\\Enum\\"); + wcscat(KeyBuffer, DeviceNode->InstancePath.Buffer); + + RtlQueryRegistryValues( + RTL_REGISTRY_ABSOLUTE, + KeyBuffer, + QueryTable, + DeviceNode, + NULL); + + /* + * Now get the class GUID + */ + + Class.Length = 0; + Class.MaximumLength = 40 * sizeof(WCHAR); + Class.Buffer = ClassBuffer; + QueryTable[0].QueryRoutine = NULL; + QueryTable[0].Name = L"ClassGUID"; + QueryTable[0].EntryContext = &Class; + QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED | RTL_QUERY_REGISTRY_DIRECT; + + Status = RtlQueryRegistryValues( + RTL_REGISTRY_ABSOLUTE, + KeyBuffer, + QueryTable, + DeviceNode, + NULL); + + ExFreePool(KeyBuffer); + + /* + * Load the class filter driver + */ + + if (NT_SUCCESS(Status)) + { + QueryTable[0].QueryRoutine = IopAttachFilterDriversCallback; + if (Lower) + QueryTable[0].Name = L"LowerFilters"; + else + QueryTable[0].Name = L"UpperFilters"; + QueryTable[0].EntryContext = NULL; + QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED; + + KeyBuffer = ExAllocatePool(PagedPool, (58 * sizeof(WCHAR)) + Class.Length); + wcscpy(KeyBuffer, L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Class\\"); + wcscat(KeyBuffer, ClassBuffer); + + RtlQueryRegistryValues( + RTL_REGISTRY_ABSOLUTE, + KeyBuffer, + QueryTable, + DeviceNode, + NULL); + + ExFreePool(KeyBuffer); + } + + return STATUS_SUCCESS; +} + + NTSTATUS IopInitializeDevice(PDEVICE_NODE DeviceNode, BOOLEAN BootDriver) @@ -443,12 +560,13 @@ IopInitializeDevice(PDEVICE_NODE DeviceNode, NTSTATUS IopInitializeService( PDEVICE_NODE DeviceNode, + PUNICODE_STRING ServiceName, PUNICODE_STRING ImagePath) { PMODULE_OBJECT ModuleObject; NTSTATUS Status; - ModuleObject = LdrGetModuleObject(&DeviceNode->ServiceName); + ModuleObject = LdrGetModuleObject(ServiceName); if (ModuleObject == NULL) { /* The module is currently not loaded, so load it now */ diff --git a/reactos/ntoskrnl/io/driver.c b/reactos/ntoskrnl/io/driver.c index e46b6ca5950..b5f7973b1c3 100644 --- a/reactos/ntoskrnl/io/driver.c +++ b/reactos/ntoskrnl/io/driver.c @@ -1,4 +1,4 @@ -/* $Id: driver.c,v 1.37 2004/03/19 17:37:57 navaraf Exp $ +/* $Id: driver.c,v 1.38 2004/03/21 18:58:53 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -33,11 +33,6 @@ /* ke/main.c */ extern LOADER_PARAMETER_BLOCK EXPORTED KeLoaderBlock; -NTSTATUS -IopInitializeService( - PDEVICE_NODE DeviceNode, - PUNICODE_STRING ImagePath); - NTSTATUS LdrProcessModule(PVOID ModuleLoadBase, PUNICODE_STRING ModuleName, @@ -799,13 +794,16 @@ IopGetDriverNameFromServiceKey( */ NTSTATUS -IopInitializeDeviceNodeService(PDEVICE_NODE DeviceNode, BOOLEAN BootDriverOnly) +IopInitializeDeviceNodeService( + PDEVICE_NODE DeviceNode, + PUNICODE_STRING ServiceName, + BOOLEAN BootDriverOnly) { NTSTATUS Status; ULONG ServiceStart; RTL_QUERY_REGISTRY_TABLE QueryTable[2]; - if (DeviceNode->ServiceName.Buffer == NULL) + if (ServiceName == NULL || ServiceName->Buffer == NULL) { return STATUS_UNSUCCESSFUL; } @@ -819,7 +817,7 @@ IopInitializeDeviceNodeService(PDEVICE_NODE DeviceNode, BOOLEAN BootDriverOnly) QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT; QueryTable[0].EntryContext = &ServiceStart; Status = RtlQueryRegistryValues(RTL_REGISTRY_SERVICES, - DeviceNode->ServiceName.Buffer, QueryTable, NULL, NULL); + ServiceName->Buffer, QueryTable, NULL, NULL); if (!NT_SUCCESS(Status)) { DPRINT("RtlQueryRegistryValues() failed (Status %x)\n", Status); @@ -840,8 +838,7 @@ IopInitializeDeviceNodeService(PDEVICE_NODE DeviceNode, BOOLEAN BootDriverOnly) ULONG ModuleStart, ModuleSize; PCHAR ModuleName; - /* FIXME: Guard for buffer overflow */ - sprintf(SearchName, "%S.sys", DeviceNode->ServiceName.Buffer); + _snprintf(SearchName, sizeof(SearchName), "%wZ.sys", ServiceName); for (i = 1; i < KeLoaderBlock.ModsCount; i++) { ModuleStart = KeLoaderModules[i].ModStart; @@ -869,7 +866,7 @@ IopInitializeDeviceNodeService(PDEVICE_NODE DeviceNode, BOOLEAN BootDriverOnly) * Get service path */ Status = IopGetDriverNameFromServiceKey(RTL_REGISTRY_SERVICES, - DeviceNode->ServiceName.Buffer, &ImagePath); + ServiceName->Buffer, &ImagePath); if (!NT_SUCCESS(Status)) { DPRINT("IopGetDriverNameFromKeyNode() failed (Status %x)\n", Status); @@ -879,12 +876,12 @@ IopInitializeDeviceNodeService(PDEVICE_NODE DeviceNode, BOOLEAN BootDriverOnly) /* * Display loading message */ - IopDisplayLoadingMessage(DeviceNode->ServiceName.Buffer); + IopDisplayLoadingMessage(ServiceName->Buffer); /* * Load the service */ - Status = IopInitializeService(DeviceNode, &ImagePath); + Status = IopInitializeService(DeviceNode, ServiceName, &ImagePath); /* * Free the service path diff --git a/reactos/ntoskrnl/io/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr.c index cad12813c67..5f5da1a80a2 100644 --- a/reactos/ntoskrnl/io/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr.c @@ -1,4 +1,4 @@ -/* $Id: pnpmgr.c,v 1.26 2004/03/20 17:34:25 navaraf Exp $ +/* $Id: pnpmgr.c,v 1.27 2004/03/21 18:58:53 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -897,7 +897,9 @@ IopActionInterrogateDeviceStack( * Create registry key for the instance id, if it doesn't exist yet */ - KeyBuffer = ExAllocatePool(PagedPool, (49 + DeviceNode->InstancePath.Length) * sizeof(WCHAR)); + KeyBuffer = ExAllocatePool( + PagedPool, + (49 * sizeof(WCHAR)) + DeviceNode->InstancePath.Length); wcscpy(KeyBuffer, L"\\Registry\\Machine\\System\\CurrentControlSet\\Enum\\"); wcscat(KeyBuffer, DeviceNode->InstancePath.Buffer); IopCreateDeviceKeyPath(KeyBuffer); @@ -1066,9 +1068,13 @@ IopActionInitChildServices( !IopDeviceNodeHasFlag(DeviceNode, DNF_ADDED) && !IopDeviceNodeHasFlag(DeviceNode, DNF_STARTED)) { - Status = IopInitializeDeviceNodeService(DeviceNode, BootDrivers); + Status = IopInitializeDeviceNodeService( + DeviceNode, + &DeviceNode->ServiceName, + BootDrivers); if (NT_SUCCESS(Status)) { + IopAttachFilterDrivers(DeviceNode, FALSE); IopDeviceNodeSetFlag(DeviceNode, DNF_STARTED); } else { From 3b9f0dd221ce6259ebd9205f65f724f5e921abe5 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 21 Mar 2004 23:36:24 +0000 Subject: [PATCH 0599/1463] storage of configuration settings in user specific XML file svn path=/trunk/; revision=8831 --- reactos/subsys/system/explorer/.cvsignore | 3 + reactos/subsys/system/explorer/Jamfile | 3 + reactos/subsys/system/explorer/Makefile | 5 +- reactos/subsys/system/explorer/Makefile.MinGW | 5 +- reactos/subsys/system/explorer/Makefile.Wine | 3 +- .../subsys/system/explorer/doxy-footer.html | 2 +- reactos/subsys/system/explorer/expat.license | 22 + .../system/explorer/explorer-cfg-template.xml | 47 + reactos/subsys/system/explorer/explorer.cpp | 13 +- reactos/subsys/system/explorer/explorer.dsp | 8 + reactos/subsys/system/explorer/globals.h | 5 + reactos/subsys/system/explorer/libexpat.dll | Bin 0 -> 139264 bytes .../subsys/system/explorer/shell/webchild.cpp | 19 +- .../system/explorer/taskbar/traynotify.cpp | 124 +- .../system/explorer/taskbar/traynotify.h | 8 + .../subsys/system/explorer/utility/expat.h | 1080 +++++++++++++++++ .../explorer/utility/shellbrowserimpl.cpp | 2 +- .../explorer/utility/shellbrowserimpl.h | 2 +- .../system/explorer/utility/shellclasses.cpp | 4 +- .../system/explorer/utility/shellclasses.h | 6 +- .../subsys/system/explorer/utility/utility.h | 10 +- .../system/explorer/utility/xmlstorage.cpp | 108 ++ .../system/explorer/utility/xmlstorage.h | 448 +++++++ 23 files changed, 1876 insertions(+), 51 deletions(-) create mode 100644 reactos/subsys/system/explorer/expat.license create mode 100644 reactos/subsys/system/explorer/explorer-cfg-template.xml create mode 100644 reactos/subsys/system/explorer/libexpat.dll create mode 100644 reactos/subsys/system/explorer/utility/expat.h create mode 100644 reactos/subsys/system/explorer/utility/xmlstorage.cpp create mode 100644 reactos/subsys/system/explorer/utility/xmlstorage.h diff --git a/reactos/subsys/system/explorer/.cvsignore b/reactos/subsys/system/explorer/.cvsignore index 8ba457cfd02..a333904e49b 100644 --- a/reactos/subsys/system/explorer/.cvsignore +++ b/reactos/subsys/system/explorer/.cvsignore @@ -12,6 +12,9 @@ UDebug URelease _NO_COMUTIL doxy-doc +Win32 +WineDll +WineRelease *.ncb *.opt *.aps diff --git a/reactos/subsys/system/explorer/Jamfile b/reactos/subsys/system/explorer/Jamfile index 6aaa45f9215..42aafe75256 100644 --- a/reactos/subsys/system/explorer/Jamfile +++ b/reactos/subsys/system/explorer/Jamfile @@ -38,6 +38,7 @@ exe explorer : utility/shellclasses.cpp utility/utility.cpp utility/window.cpp + utility/xmlstorage.cpp dialogs/searchprogram.cpp dialogs/settings.cpp i386-stub-win32.c @@ -50,5 +51,7 @@ exe explorer : <find-shared-library>uuid <find-shared-library>wsock32 <find-shared-library>oleaut32 + <linkflags>notifyhook.dll + <linkflags>libexpat.dll ; diff --git a/reactos/subsys/system/explorer/Makefile b/reactos/subsys/system/explorer/Makefile index b7d5cd39ff5..c90c82f05e3 100644 --- a/reactos/subsys/system/explorer/Makefile +++ b/reactos/subsys/system/explorer/Makefile @@ -101,7 +101,8 @@ OBJECTS = \ quicklaunch.o \ searchprogram.o \ settings.o \ - i386-stub-win32.o + i386-stub-win32.o \ + xmlstorage.o LIBS = gdi32 comctl32 ole32 uuid DELAYIMPORTS = oleaut32 wsock32 @@ -128,7 +129,7 @@ ever: buildno.h: ../../../include/reactos/buildno.h $(CD_PREFIX)updatebuildno -$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) notifyhook.dll +$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) notifyhook.dll libexpat.dll $(LINK) $(LFLAGS) -o $@ $^ $(addprefix -l,$(LIBS)) $(addprefix -l,$(DELAYIMPORTS)) explorer$(RES_SUFFIX): $(PROGRAM)_intres.rc res/*.bmp res/*.ico diff --git a/reactos/subsys/system/explorer/Makefile.MinGW b/reactos/subsys/system/explorer/Makefile.MinGW index 44a78f592ed..4eb220c29d3 100644 --- a/reactos/subsys/system/explorer/Makefile.MinGW +++ b/reactos/subsys/system/explorer/Makefile.MinGW @@ -70,14 +70,15 @@ OBJECTS = \ quicklaunch.o \ searchprogram.o \ settings.o \ - i386-stub-win32.o + i386-stub-win32.o \ + xmlstorage.o LIBS = gdi32 comctl32 ole32 uuid DELAYIMPORTS = oleaut32 wsock32 all: $(TARGET) -$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) notifyhook.dll +$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) notifyhook.dll libexpat.dll $(LINK) $(LFLAGS) -o $@ $^ $(addprefix -l,$(LIBS)) $(addprefix -l,$(DELAYIMPORTS)) explorer$(RES_SUFFIX): $(PROGRAM)_intres.rc res/*.bmp res/*.ico diff --git a/reactos/subsys/system/explorer/Makefile.Wine b/reactos/subsys/system/explorer/Makefile.Wine index f02c47b6508..7899fe67a9d 100644 --- a/reactos/subsys/system/explorer/Makefile.Wine +++ b/reactos/subsys/system/explorer/Makefile.Wine @@ -6,7 +6,7 @@ MODULE = explorer.exe APPMODE = gui IMPORTS = shell32 comctl32 ole32 user32 gdi32 kernel32 advapi32 oleaut32 EXTRADEFS = -D__WINE__ -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -D__MINGW32__ -#EXTRA_OBJS = explorer_intres.res +EXTRA_OBJS = notifyhook.dll libexpat.dll EXTRALIBS = $(LIBUUID) C_SRCS = \ @@ -21,6 +21,7 @@ CPP_SRCS = \ utility/window.cpp \ utility/dragdropimpl.cpp \ utility/shellbrowserimpl.cpp \ + utility/xmlstorage.cpp \ shell/entries.cpp \ shell/winfs.cpp \ shell/unixfs.cpp \ diff --git a/reactos/subsys/system/explorer/doxy-footer.html b/reactos/subsys/system/explorer/doxy-footer.html index 8233b142f01..59424244acb 100644 --- a/reactos/subsys/system/explorer/doxy-footer.html +++ b/reactos/subsys/system/explorer/doxy-footer.html @@ -3,7 +3,7 @@ <tr> <td><address style="align: right;"><small> ROS Explorer Source Code Documentation -<br>generated on 20.03.2004 by <a href="http://www.doxygen.org/index.html"> +<br>generated on 21.03.2004 by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border=0> </small></address> </td> diff --git a/reactos/subsys/system/explorer/expat.license b/reactos/subsys/system/explorer/expat.license new file mode 100644 index 00000000000..5c5d524a1f8 --- /dev/null +++ b/reactos/subsys/system/explorer/expat.license @@ -0,0 +1,22 @@ +Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + and Clark Cooper +Copyright (c) 2001, 2002, 2003 Expat maintainers. + +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. diff --git a/reactos/subsys/system/explorer/explorer-cfg-template.xml b/reactos/subsys/system/explorer/explorer-cfg-template.xml new file mode 100644 index 00000000000..feddd349456 --- /dev/null +++ b/reactos/subsys/system/explorer/explorer-cfg-template.xml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="UTF-8"?> +<explorer-cfg> + <general> + <look-and-feel name="classic"/> + <language name="EN"/> + </general> + + <desktop> + <icon-alignment algorithm="simple" start="left-top" direction="horizontal"/> + </desktop> + + <desktopbar> + <positions> + <bar name="quicklaunch" left="10" top="2" width="250" height="22"/> + <bar name="taskbar" left="300" top="2" width="400" height="22"/> + </positions> + </desktopbar> + + <taskbar> + </taskbar> + + <notify-icons> + <icon name="Volume Control" text="Volume" show="show"/> + </notify-icons> + + <startmenu> + <order> + </order> + </startmenu> + + <quicklaunch> + <order> + </order> + </quicklaunch> + + <launchbar> + <entry type="startmenu"/> + + <entry type="programs"> + </entry> + + <entry type="settings"/> + <entry type="desktops"/> + <entry type="notify-area"/> + <entry type="clock"/> + </launchbar> +</explorer-cfg> diff --git a/reactos/subsys/system/explorer/explorer.cpp b/reactos/subsys/system/explorer/explorer.cpp index a542ffe9c04..5195dfe628a 100644 --- a/reactos/subsys/system/explorer/explorer.cpp +++ b/reactos/subsys/system/explorer/explorer.cpp @@ -24,7 +24,7 @@ // // Martin Fuchs, 23.07.2003 // - // Credits: Thanks to Leon Finker for his explorer window example + // Credits: Thanks to Leon Finker for his explorer cabinet window example // @@ -746,6 +746,13 @@ int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdL // init common controls library CommonControlInit usingCmnCtrl; + // read configuration file + String cfg_dir = FmtString(TEXT("%s\\ReactOS"), (LPCTSTR)SpecialFolderFSPath(CSIDL_APPDATA,0)); + String cfg_path = FmtString(TEXT("%s\\ros-explorer.xml"), cfg_dir.c_str()); + + if (!g_Globals._cfg.read(cfg_path)) + g_Globals._cfg.read("explorer-cfg-template.xml"); + if (startup_desktop) { g_Globals._desktops.init(); @@ -771,5 +778,9 @@ int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdL int ret = explorer_main(hInstance, lpCmdLine, nShowCmd); + // write configuration file + RecursiveCreateDirectory(cfg_dir); + g_Globals._cfg.write(cfg_path); + return ret; } diff --git a/reactos/subsys/system/explorer/explorer.dsp b/reactos/subsys/system/explorer/explorer.dsp index c90b07e2882..9f7fb436fd2 100644 --- a/reactos/subsys/system/explorer/explorer.dsp +++ b/reactos/subsys/system/explorer/explorer.dsp @@ -331,6 +331,14 @@ SOURCE=.\utility\window.cpp SOURCE=.\utility\window.h # End Source File +# Begin Source File + +SOURCE=.\utility\xmlstorage.cpp +# End Source File +# Begin Source File + +SOURCE=.\utility\xmlstorage.h +# End Source File # End Group # Begin Group "resources" diff --git a/reactos/subsys/system/explorer/globals.h b/reactos/subsys/system/explorer/globals.h index d0cf6929840..55433a99f57 100644 --- a/reactos/subsys/system/explorer/globals.h +++ b/reactos/subsys/system/explorer/globals.h @@ -26,6 +26,9 @@ // +#include "utility/xmlstorage.h" + + /// management of file types struct FileTypeInfo { String _classname; @@ -244,6 +247,8 @@ extern struct ExplorerGlobals HWND _hwndDesktop; Desktops _desktops; + + XMLDoc _cfg; } g_Globals; diff --git a/reactos/subsys/system/explorer/libexpat.dll b/reactos/subsys/system/explorer/libexpat.dll new file mode 100644 index 0000000000000000000000000000000000000000..4f400f071034b81c2bb7600d1ff8760358578792 GIT binary patch literal 139264 zcmeEvdtg+>_5a=M5*A#zH@d>AsV=f=Y*HH`Z4)<YLY_!~-GuB?A&*x2{YFHkcvonR z7~I{kcgID1fc>@=X=_{CT8pjF_-sNj0Us66R+RQzwbpJLtoY*LYk!|}=I&+#sQBye z_n(3Ln#Y+lXU?2CbLPzK>`T`wRz*>4xKb%a>A{o!D)|1%w<Mw`p7GE`<$-ZePwBBV zJUwMz$K}_!moB^dzn6XEO7~^oxaz8_b@w;F<z5!L%6<7&?&`Ts?klfe^sVzIOc?Jm zL9csg@|Sk){m#nt_1yEPtb7*V&pm(b%E$3+eAcsaH^;A7xt_z%HlJs$+{xcl`Pq2+ zWgP_L<1qHsC`yCHru2kcD$;3QQYKD0!7_HdveBX_T{1M<igyj~oA9JJddEfdp}+J~ zDbA7U5QaDWArYm`JmshFpB81kT~P{Nu_y%;{c(R<j#BRWxX6+4-j^*({m3WdN$v1) zf9L7nTA?Gd`gXHkR9D7xB!^p3+Rt0I=o|Vs6y>#x5l(flFrRp&|0)oAo=m26oruu= zCM<ep{Z%MR?|I9<wdCr{6y>4Q5rMiXZb~32MQ`+1p(r!><@4L;6!@G1pHtv-3Vcq1 z&nfUZ1wN<1=M?yy0-saha|--_r$9jLj~)n$kMu7jen5qZI!#<_^QD@cL0sW&_UHle zQD~^Gwf`yp6V)D@QDHN`o_b0&cx+<TOPBzL4_WjR!-uT;gm|^b9$Phpu<5=1J*NU{ zCixNRos?b$OnbCfUDq31_4=s9D3Qt&^)|0PG#*9S4ZBfq>lgFzrZG^C@9IEVvJCm% zb;NgM^fv$jgu|#WF?^*XxKRZO7pjv{S(1ite#?X-@#ROvR~+$Oo&L5F;<CJY!`HyU zOv};b)u+>&<;jFxAF6o0Z=kCL)ySfynV;cj;w?wP&nkbO;hTR{yjkA7Bg&TvN9w!q zi1_yOcNY9bhOgt};4ez2H_MX=N8m3xB7SM+JKC$8dGvmwhf$$t3K_}2BAq@9pH5@# zq0uDEq+iv=5hLG`BfeuteBUI$NAdf~#J?KBFjnnD<MeO?f$KBv>u(YZJq{7(9+J#a zBYq^QS0i3LM3uWaAg;+5+l^|E6Hr`*fAsbR)iozm<aI95WG_6JD9ROsg<Hk;Rfoy= zv~tXY^so*YOFWubf-L_k!`lrd-tB7QuRyV|PaLwo8A#YJ@HHkUR#_A=D_>N(!rL5$ z&lC=}wHj5f76U<j3%=ejbmTu68uJ)|MEROXSr2&kcfJ=$H95lDY|&mI<_c+Ttu2G$ zd?1DY3i2f!#o`)Q^nfwTt+xV8@$bTat@==+_b9`<E?+!d_($tAVprc#jyP2K?%O{V zPlR8#zJ0f-vXgY7>Q#I4MH3RDq{3&c+pW9WtjSj63YSr3Z!r+Dl~A0OZ{3anpbX4K zRX%V*utX;x=uGd;e4dg1%uwHyA2Fi-Lu7m^d_tc)GmieG7e;pIrSVu2F?gFW*hTeo zGlc%ZF3Lb=QQ4p)31o@=##%}sBV|rmcE6NY9LwS=PjtPCltyJ*Vv=kTx401&-K~!k zm7c=N0_)cP@b;AC8IE7&q4-{Xf-pGc4&7SV*UxMPqS-{u44oo;c7Qpx@ClZP<MAo# z^ZCnRj29JlnJ0@JPX*BCcCp3;aGqFSfTFxlEc1x&wWx0}@!0ne5cD_tQoa(=P3gkh zG^3l6wTW(utVoXq1ouCL_d~$T2A7e)zLekjb&v%0<-U(^;z;WM4pW}meEw9U7T#tb z>20#TqrEF9gbz)*#x88p;{6san+iQ0n-MTV5u#@x_#n_w#34g{s0}ZV*>N+1He<Ox zGw!8xaGU?+5kURPcHDX%Ao%G>Je!))DIMa@C4d;+8wl!G5vR}ch$dTI!dB+pskaCq z)>L3USh&mk*2?05Kh;c?KyzOrnmlDqj*!);a)?=4bca5+@Ck7LEDasbsPY)I3ao=- zmR($9Gy7GhR~c0{aawe5=vH)(O_l}ycuebEK=f<yXxv8e^~8vg-QW~Wy}dW+L(QFj zv4&c`(dS=m2_$>#hzQ|r`O#G9#6a@=R4N6MM|!!=dX9kf=qFgtcy6ROqye-eT&Cz_ zd#Go%_BT&|J<_X>i&vj#sX_d~py>2y@zr~%*k0XI(<JU%!Bo+UyjQqZqVH>okSoxb z3Yzuz8rQf0-fdKAqRM8hrqsh<Tb!Q?I>a7e65Xr2C<ngjs~71)c}=Mx)D+u-wiZUS zwci9HuG7TROeW(BC(#KNcd`VE-)N#V7DSF!pPK?DT&PSwmu)p>IiPSDv+P|LDWOwD zd=ao%)%QJA(c2dqH&_8t3AC)nd>UswqRhC?W}G4}S%l`ABv#mjA{uQ6|8`nx>PJCe zV`>)!FL0aQYjSzB*cX2F(5ih-lDL7+=<c8zIRJnV01qlCDbeY%zx^vQ+nxa9`$RVl zUw+?U#N*;}6$P)9m;UgYZ@#8>qa5f^ky{a-Jm<?6#g_`0RO;T3u+W(z;?a<r#mY?{ zJ6`>%ouC|(txf!+r9ZxAA5unkJm_n(XrVC=`es=)aXTk%#FKJ2Ccr+B4XBm|NaqL% z$&58vh8Sz!0T^Tb2e?n~Wyl{}HmxFXigXtW@3S`t#bd=F#q`&`AL=)VI=j(LpK<W3 zafM@`%54#AiV$GTwHuG|OPfQiFQt&6W_;PW+7_#Gf`P;p_V}zR)?{P{MllBvx9fAn znpaU`V>3iY9vH&4SV^Ga(G575`a}`p0?D)dB=?Gk%NDypN9q(d?}uu11-e8V6Rd^g zj#xvbE+%-Qn;=lu?^aXR{Ah2e8Vq9h4(aajV=p0{H8i;pU8W5THrVY#z|M%GF&xxM z5kZJ$s;99&Q#tx<;}mJ~$nk~8Dk*j1b_`C_x(-i3$E&wgM0SMU?ibtRTGx9MLh68J zeB5WLtmt}gd?<I=8q33LsS<j5z>?7-<Fo2P^2m;$IE2b;q3gXHNFp?cPE2&uD3rL5 zh5!)IKI|0t5oU?mHUsra-0eX+Mbs9HK#>nr)cgi|SP*n}H#Vi3$^ou`dldo<i>NIs z+}Y?8wU}E3d<ZWwW|PWM65i(a4u*PK+L)jLTj3$<HUS^_nS(MlmoLZyJ|`h-4~A@! z-TE{!$1%M(x?`nN%yEj8_guYBtaMa_`yAfE&Nq=DPt-!VhQ`Nh#z87sjjQaURx7J@ zglZ5vb#eP(tw!=bqw&-_LxpYAdt3U=hVBR4M7ff%-O%?^4)~_YlvaC<m6}oO6ty%S zITOwbQR__D)*AJ8=ocE8t{_$~J6FgWtFZ&k$~I$;qa}N^c<Lz#88IOKtXG=!jF0a+ zJYJv34cc|st=nSu;R)UWeSFu76ut%&cSZaX%M7&hpAdQig@(oqRHT&t0iGJf$4~DC zN1QgCE9Y~U_g2kN6?Myw>3wFt*GC}`-sj>W%Oh$)r9d!5eV~LS$waiZsL?t|Dh<@w zatCYd6+|bEdjm+GGOkzD$Z80G^rYekDe~=KC9gvlf%p>pXHI={=xmB?@D#`MBD)8{ zUPz+E=6Q<rsqwAmd{g&mmmiQg_D<g)ue4M~dJP1I{vlfIkjR>tt<0MGwkW@U8Wq{# zap_kJ$Ngg51$m*#7-5PF52KN1$LFb*$_w)Jx8nehc0LWoYNG$(&Z&LVcf@DgW<Hw~ zPeK<xv(I5sw`}*mdCfR+y}j_T_26($;hQKUTz<czpNw3t;f*92gzdMaYKFJDNap}W zLgVobZIeRcH8#=g0O0L2pZ!;Kw;H(+MEa-~fFHw)^6YCd2oewv=(-c-o2lACR4PBw zngabu>Vkf|slTX^TB7qa;yoU#Ao^KN{w11Y`VI_nkWSaG6g7&l#aJ8n=!=Awob(Zh zOdZxK4uUq0P1AN``0*xYVt@x#P^x(L;O?o<13OvkU0qM0+E1X`6OqeR*k|2OxvB2q z@=Z!;JMwr8$0iV54uv)LO7C_mec6pvdb8$BHQGULCs7DAE;d4TDjU5x)@&2b`%xz} z&~E*!ApRuAfQUaxbbq$*UpZ%PP1AimQMYiH^{p(zhn~PJsRRUT0(oXDhV6dQtcdd8 zN<yXdv&54b@({DpI1UmisJW4ss&O!ZHl^DuTV$Z~2dAf^z1N;?^4mn=d=LVlF$G;Y z7w`vdJ=8o%SLZ#n?4`k42Yt4sJ4q&g+CGw<zt#=_lx;{%1WZ3*A|R8O@DP<yRD>lo z22+6HNf<Iu3<@o}TYSf6lp;uM4ef6mB%V<QE4h0NRx$#El_ZpuelZrkQa@45b&6u> zzyu!_nSs#1MI8VmBFGVqBN3z2>8CIbQnywkG@WIoGIWk%g_3dtR7P2_I3ZDKC!Nc0 zv+itz?rAjHH(6TyY5KX#>$6?&6LxWuK{}bZMl)vFpn?|u(bPc0gLcE3QA355)UGCn z*k1TdxX*6gm8iEHO%7<V!e_($E)CfV5w14@orKTseIhgyDlt0YEa$G*5&=8Z3%?Dc z0r=e-%57<z2HnY6Y6I*mOxRC{d+iJ!SX&2LfHRfCI9J&VtF#Mg4$2eJPHUn_5lzlS z4Q8Du67hQVUmG1ZRNpS3=v||E|7ckClg#=gR@g`CGP))x0LUh)3+!fj8kP4{Q-DU! z-;<Ikx`~sf@AdYF^2O@s5JCfnR93zH2FL34hD&tci*#k(n{Zz?SFE`kPw$iZ8CUd{ zVt8R?*xRq4A=Xf`T`wE_9CmkfVM3aQ78={u3YBp|{~!Z%Bc;(zfCPgTkMaAO2N06* zS&a2mme_g4?tJU>DC)~%3!y3+)_icq4ye6ln)Mm)+xplm4&)ov7rDf@o!+-GQdT-@ zjY`e<wi8x^OI^mLPUBL|xYR+@ip(E+x*d|l1~?c;?qNEt<HBuuG*@sLxk7$dkGC1M zw(v!^V2E@BkI;;O-HdA(Zx>qpl-Q{$r3*6(6(3)>RGOcmH=#uuwGN|JgFx;VQ3gNH zP8Jil0qqQcG=XPn!g*`oD>>Hpj8YSB=XeLH2YbCwUR!T0glM->9+Gt;p!xC4r{ON& zx~nnh<N3}NseFVMVNehEVOrs=^6sG_M<lq+PSv&Sv9`fl?wW+lQ%^y80tY<I^<K?X zzWE*^x~(f=TLnXhL+s}+8_Gq4k;?c7N|bQ^Az@ojDrqC@rWhK1fy5l=Vx@_OjO5QC z-%)y-7~o79YCrW93`RQUm))dLhLbsulITz)WcYzmX%G*HM@`Jh7qzY?(dr2%R=TWD z1g$UnjaCn2tj8BH?xVbNMsLi?H|7+?HoS_E)OylMS+6&`$rz%4LC*i%78tAwN~Lwv zX^PfL>XF1D+S{qZ^1JeDu!M!iJW4Y`F<IIY5^KH(DA29RcF^c&gTiFM2Rybqw2H@D z`Z1?_rftC>*M~B<_8_s+0=^~`$lSt($xkw}@aG6YnwTD@g8eY%)m54J3o<bnrnW%L zaS<hg(9ewxRQ;nXn=jV85z%I>_uw(At^mRKp{^6X{VTu9Rekuls+z88|APK_H&Gcg z;V0U%sw)sPQk%3rrPc>Ib&=>MeLLFQq)&zfuCR#>ucA)=Wc@olF<$@?%{U8g9>I!x zWAclcSb`hgr!|3R-UL^>#rn0#FZOs}6qX=c_VP^izD7wrM%5l3XX^OZ+YF4Z7^pD~ zb^6S40v*Fosy!KGJmFr*Xf1rG$WYbQ?Z_*~S9MF*-CtC+lqVX)L)4a|BBzRgZLtMY zgvtKKfojhg<7wXM7<z?}p_;0Zz4Qvb#5dH>fykvsNc_c{>La_==uH$FK({RRL1}XH z9K#RPJU*UjG+?GdDv3I3mO)ac6sYnPqfd=o3m|K$TK^fK&?CcN7P|l!N=&0)%(3w_ z+A%zd>!P1TRBIG{$sfPPt%QV55+O9*N%vYc@<ZT)4jZL<N$e%1k4@ihk_QmNvz3;f z$;bj7R0CT#fVP-d5CX#|9Z|Xmr4x=2J|Ke!NEI3O>Al8y*;R6|+Cu75efXu*85s0c zd{Ytzj`tq&+%rG8WLx?hGx1{ZF{^?Em@;D8k;#~QR6;Z@kl}=utc1>VLXm0#x0K-W z;JUp4A_mt(=PKGSaVfbLB`25utTujp!fi};XTrOmXE&Nin5_Q-sNsafE)6*oo2kPm z62$n%MQ9^!c!Jo>Q`~?JY(@qyw{Z~(RU{+s^asIi4pf;Yw(fKfIM2vaSKoy+>Xx-y z5%K=I4+_EiHPne|amy7H?<Q~CFWEtoA|F6JhQ-Jcn@Jo^?+t&H-6XJkBVC)3i)LW5 zf4v_>F96XeqGXRz29kr0Une_X50g790YSbXI{`^5GNorgG7o*d{|R9E3tZpBbt$f4 zT#5~}wjJ-EmDlq?;&TIH(;`$PUIPgSZS#95a@dObNcjb7^agy0G8l8t6)7=ip?A*w zkR#FROSZq8N})>M5rKvAv9TOHX4H8<Gy)4lFJvbxlgSzpKais!M%1=fF18zU7Wxu% z%Kgc*H;J;a3P7)!(_UuB#3ZoL2(-gShqToFDsAx^vPr7ZE6IQZngLaXt)!shDEZ6s z5(X%$j95+G6jQ5SqtoM1Bj2Zbbl-~@Z}&a8hfYdt*obHH4v1Vpk30uTLv2IQfaOA& zGQMUHK4F(JIHS0OK#K1=b<5o8uSZiW>y7}`V1hCT6l@(L#u@yY3C{7wm|bk3BC2Y< zZy5Y0`a2)|tpzo8h{|#?vpV63k;Gy8d;4GjDFCZRUx&nZhC(o6zQIY)6@8)}3T=X{ zJ1%chpOjeSQN;C1_;Fh_rAEJlGQ3GlG`K?EHKS_$)3;@f;nl2&^;}~#4Og+PqQ$Ih z_a?+jS#>>uj9d-sW3pZ>b9mQ}0@-MSyqQ2Uqyfc|l2p51>AF~fjbx@t-XpM?Y-XK@ ztnslDI{1n4no(!)697V6k6D)&AS$W#CS}#-Lh%??D!!gtuP(CN;7>8zCT2RtAjt}S z%uIS<Zn<OS46_j@oBXiagt(2`n(PpmA<xj_wh`30S`~HP!;(~;kD;wup8nP{G!w!; zKGz-Dp+^1-uSXF~HA|VorRd*0l2{~RE<Pr`(mDT$9)pfo@JX~9AaMa~{{A6)jI?{u zLPy6Vs8edv^c@&jz)DsuN@3~QsGn!lw;S~fjr#e<(nUsnhf%-8s9#~!>qh-jV`(Q$ zVK9st^$slHFV$l8E~7r*sCOInPGhMjR$pY)7t?BdeSxvGG*(|>)K?qz^+tWUv9uu; z3!}(bj3%%~j5GlwM#9{PMd-fic77*;V{l)I#WwOg&2Ws^-F&BckP#z=!ibUnZNx}P zAL#1B-4ctf!Xp;D5%+#khj~muEO#b~x~K1jJ@H-ipWN_(&D*a=34r%q^q+&tyWdEq z62B)5Vs{aK$=fJkxicyFS&$6#vpjhnJ?Hw8Z}YPwIgF=R&C@R!w|vH3jQL&E%VT$K z#65*s(anUm-?)pC;TsbN46%1{UGCz#+{Jadi|cY1)g^WpSK=<J#K7t<+_4H&HeXXC z7mz`&-iZMR1`4(l44s1@bDZS*Ca!h{L`X^Gcdx}XP}Ub3So9fy!Ay|q`_8}9^-T`p z6$9EU6tcV^`655dle;Onj>bG#D;6DPt(b=h*k?tMqq6K3qOJo`r<nFnF}L%mtV^=v zgB+ig9|NNn>BX$b2{oAs3k!3agpznce%N^SSdVozHF9!>D9$uda+oMhVvndI3v=QM zM`&E~QB(>&rHWRqn*&f`UH)JyNSdWPyv+#<?9}A<WfC{cC5=deUgH~;B=lENrD3i} zeTeJ@V!wC+MR=?1fZvkNJj)TE6w5<+1ugz<kLT9Hjs{e;Rv1qf^kdc|$0_805fBK) zpg0T&r%4E9(E}?BNIs?^TV?o^_+;2QB;+}DShBBj+_0A{A5~b@XV7gK*u)ZqAK9c| z(7(vzM+V;SUS~?28lNQLH92O~!X`qCWP1rs6UQd;f=~1(H}eFRtSxy+?ww^1O-O#5 zA%tN1#DuEJfw4S=s#c+PCNI(hl(nS|34uh5&oABrIFf@9H~`mzoZcoP-I)@h24D!& zH-TE9VK!O5*p-;=Z1N}190EUL^6iKo(9bD5U3ZA)cB6SArqpCas99*#w4*RBkSsfB z0uTM2wW@4%%=K-lxWmDT=6?G5$Orm|CK%mG^bl4iTKf}gSQj`As6t`j7%Yuq_`uR= zX8G?aat9%cr1x)Xgxq<W#jlp&5%9i&1=U|I#jE!Xz1Db`-o%HZ&Lgf=d{94J<TJ6n zh=_1NKTXWh#7gM>O-^`fz)oS0ro_R}5ZPy?+m>y5YWQC9yCQ;j5RiXIOG(~?y3=@= z-mv6wExTa=-thm5@Ct+_-+TcC3+wdy8eS6*bA7HGrdO&*aw%Tp;Ur!oy{#=+QDn16 zG=){!CP$;V?JtOdG5q#kU-GB#6HV<x#1KY!iraSLt&!eL2as7sGW@1=cz8c(#l9io z5AYV==0bZrgm?!Za;Xy9H!5pu%i<U`1q_7&ScrA<Yaq2P+~-TK`+!;@lmp9QcL&1E zcA(UQ>@5bE>A)=R1OHR|WV!38$c%~Fdq_@;PR{7-fkAfWLAatue}OxIVzn<8eicFb zwbI=tag8hB_ca;e0t8~+K6RT5FPLe8HQ19T6p)3$rcg!plM*s2l!-|qOk-O@d=JU} zLQr<obTSFKF$&y9LA>G);~!%JO;O3Hv?A<Ayb<=`J{YD#*<i!Mr@1M4<z8+V5OyC) z%%HhM&T9$ow}0y6)raP$x9?8ghVF&V17(@YNgHFR@5(Q-#iWH&76qj}Ce9Y6$X*cB zNzMjf%zOw>CzeU6dch{Y_+#=L7zvpoq2(Z<6F6Nd)-Vt4&`%9E`2x}i^U`EROMc~V zoVE>OChf?e-o8~P*nfqhH6p!)?OUt_k_XO4vy6B${P+J-?u;jcoje&9pi|O43wL@w zUi<^eAM>;WXoox|`dLVKVQDw%p2bZ*s;uxnvXd_H6krZ|2=j4FrEzJv+_+$V#p+6Q zA83Rj?FI4HAP9qTDb=I#l6+5>-=e|#;iPqV58X=XRzkO;#zcbJ-XDZsS|KOAP5uDc zS_(*5(X@wH1qyk7fAm1;9B8Ia?ib$ep;N^=>N>F-Nq;Dd?!$X1*Vs%?!PXZt$lQWB zWGco|)5Ri64M|2lw|JCZF(|>@f<ABEpGXkc<eP_C5~6l$B#!}Y!`+B(r+4l%y2s3` zdkPAdSDX1BOy_f{kr!l<ti2$Q%MTSC-YTheHz5MdGkmI?W}nm~?qn<mp_vrC%*`#L zB%M+9>B#8@d-=pVPE%j)y`&n-g0zbigD{5Ha}v@rX$-CzBGFedl|-S)dV-1DmtN!f zBN(5kXcFUDGjaKG5aln2(nOIh0$Rvo0SgxCcawYn%E-&|#Qx;N|G@W0C&K*|7A`{B z(8w%IE0g(P-ta!MN4QCBkuxFI7)3X=By~9tx|{}!6509+Xko!L*%hj*_kt6^g(YiY zuY2iYw%0v^M-wy`j4_a?>P?fanE${wg{9{F@F6#r6=yrduEJ)t=GDkuT8RnWf8mAt zwIBNJ2^KU6a-uK~8V)hj4*<@Z8B|oW!`o~Rsp7B6D^MS3R9~U00AhSzi4)pMi=(R6 zyWePWbUrtfM;V|SH;KoSR~}$$kTUunYL%I~Loz{CueSE1Gz}UcOe5f7ECe=dSbKUx zjXZ_av^cItw&Kk!{{)mj{3@5f8Hur&o~m&S{fH9Ok+X(YxZQ8<C-tou1w?wWitEt} z%*-bt^L?CIjp*o-D3vM@vk;6H69&*O+;8ot)>zd~y?~UVdtktzfg4@Oi;SiQGa=b- zLOYuRM`<x?<V1vFHGlv$C4(;^0WC}1!hL6dqRI#Syh-C0>QSM~#VQR?u<1GR@Qq+7 z(AObuDMA=6GY^lC-?j>&a15Zq8C>0f?!RbNAC2$cAvL-YkpS-&mC)YJZVq{Z7SbBU z-^82A=Os@Le>WZ`Kmb2JQ_us^18M{YIwf9vCK`doj0=gtpN{@`t(&YaG=hs-43cWp zj+8J5)0#PrDOg@@wr-_GnBvBPT6p%{@+#8$8vV(sn0K-YfM6w5X>z|NS=vV|T@IE8 zpA>^e<s+=!{Y7N-K1LlK5^MuWM7EjIKt?Fx$-URnZzdW~^)%Sik=V<Y#(gx5Pl=kC z&PC}?NPl=AWHhMj78&gHNzsm@qG5bBRuQHYtsWIUDz}!77O6KcQnZK5741~?-1qT* z2i~{g8hfFlO~muh2vaQf9IKuFY-8-XWBKi4ZfrUY?{o6_<Q7pU5DJLRBux^n9UyrA zAcx^w340ZC(ilV^z?Tv_Ie8m|F52IL8c+hz+DU%;)H+2ZjEd62i2U_TLF86fuZ5Hu z9-olTM3}!o9xbY7c~pT%JemYB0_){LMva_J!U3Jt>}ZKQiHWI`Rlyo!cCynEl$mwB zkG@0JopBVHnRU=qL5;i%L}e$-PlO}*@Fn;C1zjz%i4yMzyI{hUxECL4WEbuxI}=V= z?ni&?5H(9_U>OLL4FHVoLOA?|FhnsoH|uZ?OEoVAF`~W1$XMziIGmh%hKE4)$JzD} zi**6U5Dk^_+o&7IZsP!ji?fM2cI$QtcAe}b&B-}DF9IfLodSj*Z3cmco<?r4wUfnY zxVIyD7Aq?xf};1!I5(z$+?;4bVm(UlrY?eJOAA&pXQ`;wz1z|Jm~h?yH<p}o?lvA1 zuHnnG$BT;q1Z|v;vEZL$M#cgR;#5f*3s#n4{tt~%G%Xdg^l*QNcULGcc`1WcBON3K zG1{W#Fev0>P?+VYq(NbpqjLv1sRWVP-M<2i1ZWjm%mi<D8abRpTOb3dKB(iJRJoCw zjvrN1DaB&pt|Mqdc_l3*-|^;?VuST76K;lf)SXAt9~pb{C&nT&E3a8ruEhCBNF-uL z%K7B9B*czNOJYbf))769gni8PCLZ9A0$MQ0&NBl0swzcu&QP=-JYU82Vx^*e0pAzl z+E9Tw^x{!6$d-GQ_!*m}gZly6!4gP=hJ0Aeu88h{syf?8RvYTCG*);pD!rSme4cwe z$xKv<S2*TYC-Uo|?_i-j6?CJ%9<ks0wiFVL5E7@uC_=p&@_;&Q#<=lk^m>eH%fNC2 z*fD`Mo+@nydKFw(z;ybhVjT$qV;#$dy6RmoiS0y!!oC0vMDA431GaOM7<xobn;;a< z%2+B^Na&dPlBEJ=!0n`xc277$a4@Ig2#YfV$@BlrqdZxQ1Aa)23ScUpOg@AuTUH&j zXvOmt_BWTLss^b}XHw}aY2bc0c{)JSggH&3egO)V%q$#8IO38jV!t0)=Q7r0UpXs7 zldUKhG;x|V$;KMaCp@79(w%<-(m)vaRzv**zT>m;?Wgv%rwuw{_CoLM`5_H<o#bT< zUX84wc4+36otlLeq`|t4nuW-fFK3M{J|gS4_GP5|I^y57P3a3Jlr9Qn>7Gqq2o;1c zcGM<n3Ie{Q28JQ$I|sYoL65xzv1QXx#o6t&y1KB1x15*_0wieJwx&J4Y9DZ<G2~pN zkHa@}Md%w{D=k-s7Idx5SrTgQT4}v1G`DM|?V8Zcc<mSv&0c;%=pqbTC%3J7ob0=; z#$sE`z>IMgE?}`eJdhg*KVIIPyq?;8o+lqjfu_a`TP6{?ae}uXK7R)QU578wPmVVf zvxo0nl(ZVFJ+wiFoZBef%JZbXPLg;+()uDd-(pbG6?c3MB#w;-{VU<FhMIOhj{tA; ze2DcIVe0|Pl`x4BccR*}+ZWsYiRSW(MzlooMQUNlb@Eo5-7Yks3b}nM@`Gm0?ZDnH z=_Z*1tW08NHezM)XoiKqOcNZu56M{y5ZAC$A>P1lCM>X(VC=#QVmV&Pv4u#!8PD<y zv2cf{T<8$%xfepq$9!UmN0SsDq5<=WwKRomrbb?)yu1j6dT0Y!sJf53GhC%`Uu^e< z`^szl28Sj0J%`#RiAP>nBfq9pH2_Nq*{@O~<5KCrcn(*C(OggpMo6wQLD6x<>nwHU z4!xe+1C+g3;(Y{im+c|4tC5+202?hYvSG}VOM7*4VJ|+m+!1>8nAtsM_VI)OXC}cV zmz5Ih$%xmOy$T1bNOK^0@gJ!dK^0M>yFo6ohUx|XGTdps$Wlk^oZ^k4pHL(d?1(kG z`_O|3>D!SYP7V!}6$_FKqOwMUqP85qY*haA!qZipU!N~C5~GmmR<7|eGK&>|W3uB} zQ%b|%xx#Jfx*m45F*O8MHktTPRt-3-(Wfxfx6z&#NT2>T+Vw&&8K$H4T=By69k7Y8 z+d4VY*kPu(ts=>tzt+1Q7V5HaAJ!+4#1+beG2{)fZd!?jpT*ZQ(&jhltyKN5qSo<T z$Qvv&N{fAbQZ2UDY!5w$fdl<<mTB@>?4jYR2=>U`S!{KX$h%yli4!l4r-hl%1phq6 zH#y?D01q7q;{<~b{doj9F9OwQq7IFzpY26A3gx0C=kR3lBz3Cf?f)bm1%m<>0-Q#T zQ`C_q<BJf{%Q;eCX4JS~K&i8fxi;}^@<%chhH;y~)(ZG=FVBaud3t6X+XP7fe)h&E zqSk2jY}{T<<EG~uHTm(nDY2R<@wsP`9FNUDlO*ZTEl^gaj0nSh#cUy(;qnG0v@K1R zNa#D+q|g*3ySK-9j1-oXk9XT3WBAZV#v0Nn)yR6J4<AbD%fg2op(4>25YIe>2&~6v zMvG_y-x<Ff{o;DPhzcN)3%f{`g>kUE6j?d<jwguyusnig0-z7v$pMl)V=#G?UNISG zt`J#Y@(s9Kn9*ZU-iWUkq5;7umC@{}afHp0>hF+axY(Q~K)zf>Y6?J+DM*pw7s~Ug zQofT<7B53J2F#cnhU1A>fjJB{d1&AXD3TOk7Z1@Omwp}*=?p~W1)BoR$y0cyg!;j< zOPo&1pL~<ZQ&=vCp^aD-!|EXBTO$ob7&!gSL7z0hy5}gGY$oW69^|A=0_-BDa)X_2 zHrVPPAqq}1f0@fpGCg=mucaF4yB37k)RL!ppdUWZ+?o~)B!}31;(&`&pWLn%5YH!V z2RR+F_(njbM#?m^IBf6+NBtZ1`VxtC2H{Ucu)7U&5UTz-fJEz)a~e7fJJu0$&pd@* zEZ2gz*}{i%cuRoE5sU#WamdcjP{ccKYI$x30!qvUI!oL#bkDd2K0|4aV4n$q>P~z6 zj5z!Bi&Q>{cPXxQxK`o%Hm?6cJKT%w23#lNTN%-`$qHZ_`GhIJF12pvKWxaUhNZBn z(U-gzYdm3Ec?n$**&D)i)&WmhGO6i~czvoKTT<W{Oo0w>z#ck5{BQF6yI3krKvELs zwb+fbfK6Yhth7%;{4g82pr)=U7Zq?&Sxv&0{7t-v!LVb)gU~%glf8#SZxiE)$^tR7 zIN^-J3(GaUL=;0|G))8<Sv-}CRU^$XAbg6joQ5PA<`XsLzNCZsi)R3*QBD#}w5tmQ zaI*gk0@!D!81qW#=m-v-%04qR?O5u>{@R3X4T4=myNK^<7J6$;jrNwEa&+j276VNS z<8cbg)J4GEl%NxmSD8sRlA@!IlA@F0Ws)u7uSb%K#SUOy;7bOG@vxrZATOHBDDxb9 zY%Vr3(TqM)0sP~Eaj1eP795A;8^(~%>D?cim`Ko@G1oSfPj#FGYXnmv7w`bhsIv`O zW#wHaeZBj!3FdV8J4E-wz~fY-Xj1|;Owbe8`<lfw$$MbKHcc(hgQ+1KJc&dE>HLXq zdLT)3B*_Cv5?>!icx)Zr<K12K9;JJH%_@3N&^^BXMtWaI_jvb4dXLgwI>;N+1A9IB zIvDHd4jqEt*(pP?r+b@`pm9;G@4>y*SVxb{Kn{DcH8I<lybkstBH9;#)?$}0(d=wY z9)!ftkk^I?v<!Ma?I9{i*eckKKaXo{)M3XCkIz*wbz|nBF-g%xzvEE@B()>6QHTGu zVS>}xq18a0ZcN^sPGb{wC}0qs4k#+>n(Ht$PCvl>SLGCrT#=UsyO2<u>ojZ=v5Nu2 zeY|0kE!L20qp#{o@C+eD&lFolb*`PN_rt%*^wksXv^4}t5MMHU0<sPw2^B|uUChN6 zxdDf_51g!Z#?ge%p##!rQV=w^v1AOT8D)ybgY<Z<(MYX{)ih?w@jBoG$9OPOhk2CN z+i2MNO8C&k(1`>ejwIvbt9hX6)n@~Vd>=MX46b&8-dzn?E_;(jI*+^QbQnJ|^Jp{9 z=i$}(J*fg1gH0)E0+VBKn=x&4A~}SG_Z6V1QbBW2taq69Of0|${fSm*6ELn|Eu+&@ zkleqWdj-#@JfT?_+3Q74Vva9ahxJ3^nF*jDc%~^ikew2CiLqeW1kVz8=qLHGZt)K} z@up0B5J{a!)H}qw7%^A0lkPBGHS$VbgQwo-$I>?WFgJ(<NA6G9XxK;lU}+4gidVwK ztr?uN?<Jd0L<y2Fy>(oTEJG<?7{d*YSV?Z8)xH3O1sqxM^j=ug=0O)ko2zU7004M% zn@G`HKH1YNuvOY=hjtNgV=aUfhElk$(gti7WCE<YYGe#m$%^p+K5Ef>s4^ISu?f*4 ztcLADRMrHVaA@&LM;$iw!GR&9$E)m--T|2UEl?`wdCF;VV&%Db^N3|m@n_a=yr=5m z%&iWnwB?;|4WEGS7oXQ{i^;{WVkEBciAuYeX-jP0h?1L=7ht&%DnCdaokDm?<1JOw z@zC(M#J4FeShXS%rS$&fsj$XyUj`Cv+Z9{|SUK623`dpi=yRC7!%=0}0nv>KqjXe3 zlNDhz7pWQ;mkir2YUF*eBDU^DX&z)md1A_)zC1o_9JXOjMdAh|#zuR`L;faTbMld1 zDxIfb*MLLkLaQMi^Q5{8v_<~Fj8x9Br4B(Fa=DSa0K_0R00F7l$opNri97@eDzTOE zXcsj=g?;(~xFh+6JzhyldOaHZqm>P7%N#fACE?y2Y=(Vj_(CtMnAo331tf@tz)Wau zX%!>|gd_xJPzC))G=k{i@q_%tAdxE5J>_6Wu+By#BE}?tBOb1uRu~B}waSZMnu6M} zK+Lzp6=$CKHhHUjwd*_M6nzR1ZfL}UbaS%j4<-%tX;d#1%O!&M@@t6#0G&S!O9=Q0 zAc@`v_Uu*I>%d%T+K>l!IWr22Fwmtyz3FOTNpvBoL{^Ac+e5%r$w=DBEDZYb=<P(Z zg`oSowRpp}P3vBB<L0yPQ^kOMFis}Ee6jP{_de>2?hYO3I&6(4DC0F_2N-}g&YxyR zk+=zQ3EQ>2OBg_kM>^-9P^b~5_+hMkh1}sMQlQHzGO^4UPCDic+U!K<(Ce3AG75$_ zBz9}IV8BoB=jE28rZ2g%Yh@~Dpf-g$a0?QE9wm$6`%)0_qqap<>*N{RKo88EW<Vrk zoB#u%^Zt?&*E`v9wPP*d6^VNIrmE7$>0L+t84I7~p~<pCBp)1<dW}k?Lj-ds_ngaj z)5hJHMfRggbxW^YEdee?(|3wWCmEZ-v7P^e32fJU7laP2#k85TQVHG!l?5+q?s!SR zS<cU8ZQSwP%Xbibi5TX>cTz7?w?J}KO@G4RFZPpzd~}C?2KFgHn-)*oEe_9_dQdz% z(jLN5>V4AOMS`^6hEiLo*c24irS|wK7r3xDzmLY>2$qH3`2hM9_McslZ`a?zel#`m z3PPZs(R7ww|Let0Y_Hvg4ZzF-eaRf`v^{etZ?fI$-G4ouRaH>9-TEf>xbBw?OsL5Q zFUz-^E6CB;(Mss7jZ%Qb*X<$N`$!or0_&Gi|6<FtY?Tb9&KZy`ay^nmjb!N)v#0nO zXGL<m49o~a3>_?-pw1eOwPKw~8_=v6{A!e7grFdNyA55l$uFZpv!^ir>ZdT*K{F;n z!u?IX=^AJY!)KtL)YBlLuBVMJ&b8o6PDG5^`4*xY1T9RvGW?5CFb`cD5{p#+{b^?x zHS$d=pT<dwfM>{jsGxE=`7}^TN{DKV$fa?$4(8C%p<x$FED_%)*I8Q4n<4>FiUbjM z`T<x_J8{qeDhW;P1ThYdD~`DHe3)uNhbYv*aUHXqM!hCZ6647~d8u=HZ`?Vyf)bF1 zHH(F=b-=pS+qbeKu@q;IG&`gsNIirXyHTo%-7Fdx%0(ZYKyr;n2OqtM-K5*)u}9G* zNQjE%K@afG(lCqiIfyjyu5H3@<Yp4)u=v|(Bkna&9myM96T7SfXp<5?L}_Gas`SAr zl>7q!aNZ{$n^&AdJ*EK%Em5wCK4cmx9y@TM&d|&>EpDY&$NC(pMr?#h&+(zqxv+D_ z2TR)$=pTFr1kdRU!tBDv2AGu%;7^!d)W`;qfb~4@lc9;}39TA=6~S;!ay2%|Ij@|G z`+ef@QLt|KeSFO^Y#0R@8wUL2unipagQ=8M&ZcG@wK10+eU8VH!N#HKyOY<$D$eZ} zYRs4m^sm%|_AZQ2kPR554U1_P>Y5F$bOA3J$udAfp5Nz4V~@E-iVWWFG-cCvt+dWe zmJ@rtn{-35CW$+a(<yGG<5hY#`Yf71!L{)x){{xKkvGPHCr%RVKk7?9{a_kjvY`=w zX~5Ni<C#nxi{}By|9*#3X|(e@ysv^a-3Ad|1ct+myVJ7}g1^9AFq|Zv#1eOU5DUTS zf=1_t5)v(<Z;%1gUOe1zgP!MUC%Rzcx9(Ylw{}+Z1MGW&<uz%L>m7rF!-q~ZPEc1r z0ObK2|L%rAo~Wy){Nzuwb(BBNNwm;_?R}VKHfJ^k%Kd<k6OCxolp5JWuPBl15-wiJ zn)fghVrV19ph{GL4uUiQNf^oCbki5^=cS?xU~1(iRwH-Aj+2>tzXi>UjJG#aU}h!m zI;_N{U}04w%PAaV$YKRHr+++xk#kPF*c0zwg%UA*LW!NTQ2%DU`$l|2JDd;c^xvXp z1*%fs6hviY<1ud3Qbai*hi&H3mq1$V)m0-NtUkk;bOIhg+CB6W(&KoW80i}AzM-vv zO`_~4pk%xX{xoXjr~K;1YxL)M#R+Jn>HdOWNl=!=qa}b3jPfKl_lXlQ-yB*DO=7Wv zHNao?r0Eg;1*$l7DJe<pwooVD9l&WiN&AyDy}_%ZM!rpeXW{5MIHS#SHi~B5kK<TO z4+b@I5k>P*f{8bZ9da-<ZZr$MqRO=7=R*D3QTUybe~11-HQl@vIj|Y~ZGF6$WUQmF z;ljnxljJ68@7rqREoktI-BQS6&wQ;%&Y!})ZlkuqXe~<A7J)m91xr%{9*QJYjaJQQ zb&9#natT`=IJDM=^<SeFV<MS#VJ8u-cIzHw#pW>&9v(5LV5T3!si3h5#?}sGS?H;k zp8cgF;6Xi>7H$o1%lDEw-J@TIY@)TGaL=y4H)YMbs%XN2`Afp#0<PArcrU_+YGlC% z?1Fka7RT*xL;>w`PXGfh27NmCkT%GBr*|vZ#1py;#!XWBYGHEoBw8IfqX8ptBQ5Gw zdlohMg3ZbE(+;O<^d%~{rUcDDRjTpgB=(GyTTv4Un&~80J(@}lEu~34v)IXiPaPVK zN=w65$rfhXW=dO4X{m25ueR!*c1+H3@Ci6l!JKWO1q8JY1f;G8XV3oRE?!L{`$Gx( z6YXb6YjUdr&744;EY&?ShB3oP=AlwpA1zfQDVjpDmIFHRNkZj*bESQrr=t-Sr}?Kj zXZk1ROr~n1drD2Eh6yprBt)~#kHu(O<ptLBK&4V3=$6DHYrGqZ70uqpiyB)1O-U}R z!)HUUod-qibV({YL4`>LE?!7ZnSb8GeaIwM0SN~kb3x2)L`?^#gdbsF<|Hv*pl~kR zE)pxy1PSn6F^q_I<5Bv=#&{fNHN%F}PM9sJBR};%V4<GW$|#jQhnkbClT;j!IpJ*; z<Yqd*EJ2K{M$WMT4s$&Uj8Yde)^Q)mrRFubiwSarxCCwxx@RG|LCm2IMBY9%`XkD` z9nSwaP2>IPyWjqq8eKy{3>%c1i8kSP{o1r%hL)Nqf|}lpqh0)>E?=}c;^VFTnA>VR zUys>wtWX7=NA#}Lx*|JZchaXK`5E!V9^i)*<13Dp9+pLclih0I&}%lsnIA*`;ASR2 z<5GtyIF?kI?8}ReqI(@?Gd5#xkyu9*H?Wa+Gm}0SRKU@(g0hGDGW3shK`;%~y~mBv z-k9b78pCWy%r1w@=teItfmc)B%jA7hV}sPFAe76&lS3M1m4lXrUQNdFb053w0mgf1 z7$yoH_0-5(U?pbL$T!b3ztImKZ8x{W4{)M-)Xt6sw5R*DG&#_+*ip_P8vqi#*MSiZ zEVBgVb@)h*<p&zYpm;jzVEY2ri`3}DR0H&PdcPdN+gb;sE)?%8#j#`1V3@UNESB3F z;z8bOPp1Hjnj+C$Oh;49N1vRJ0vbF^<i@9Y9-YcGPU18+4Dd8Ol#7U`i!y>zVI1g% z-S!7z0S2Np5V&y$$bSqm^w7}V1d?{%xAV?>CKCGj&`lH$Li*V{P5v?nrE1-c+74Ys zu_XHX$aekIU${vqwwq#o6f4`W#!Q$d^~=ANt@kB_Lq05le31GEx+|1ubIW^0zcF2E zG?UT&`Iv)tKIWi9w(Brt4=p3n9E$as4sOQ?fRD7}e8Pte31uu8Le)fLGJB@mDN{a% z4yp{5ucg}%O@#bwR%Y_6k$D)4k)~$?8bvlV#$?K5Pdm6)(2jD{NsShmX(5MY+N{Fb z84=`@+x9C))}V-cs07p5RereAASlL>{b72w%4Fme$5>%H#T$B%8pxZNLOK(sr}kiw zlR*T{^stox^3pNsI`~-)A-!^Td~Q9Y(fOjLSTyr+(oP4{EefEMETIlwPP~ZW9j%q- zUa;)&SBS5~pGR@lNZS$rKtju*bNi+v+79|Use8qQCpw)(S~exlgMgCFO_|jg#6hrE zr&|}fnWN<C3l;smqzGWL<x+oGtY|;KT+z<Kg(G6L_wh{Py5gJi(iSNiU3Y&A>#F~) zXqV$!gDcpsXyfqQ-l1r}MZVYY1UAQa9w>IvY{ItctX(uye#QM^^m(Aze<0WPvgR8e z2oBAhZ=9G|M>7pM>p(j=amGS|<{F7g8<LR+XEFK#*|>Q<FuE7Sa2n@>$x9#{-4;W; z;as$GIeH&#ifVMT6M3t!`f6J~7LyG<%ylX{xEBygC|9sCkccWM0g4)&mB`v%ToFEW zp}P7Y0_k89$^y*>q$p^{obYm941+GMMuU?e!+8G(a(RYcMFvqb4_s9N97~X?0Ammq zyI8-<gS`p^X0!sS%;WOdv}LdbdN5j#aQdTaD1*^z^K+;p4ONYNi(c1JLXn{O#g;~~ zj^K@Gb52>>AQwa6lE3&JhAeU$%2YynJ^To2yqx$%Z$=N3n_WP1&k%ds!_Q(MI)rS> z0DJLUWX;N`MuKNkOc9z%nH4OCnTaY$_+isymJcLXX|YE-O?No&w`jiPZ+}C@L+%>U za%2eQQE#B)z{Oa6L-EuTsD)5s0dV*Daq3da2L+6VtH`z3ffEmRAp@GaPB0Kq{zByN zh#557D*<kUiCI4JUUJ>zU`?D{uYW)J(0zF2)W%Xc4=*%kwPSSzU@*{=UgsXI*HOtO zz{W#*-ADH_$+D(sKCl<2XkWnt35&SdsmXyh=G>%Gm8M8NBtwYUGc=o2W^NjwS~#jH z6-=INJUY$;7n&q}{r*&ni6@vJfa1hBHwsPlegmXYpf<pBPK)4eSVWqeDT1bKY9xYJ z5T4grO~RLf0Oo*aK%0ptsF9&?jS~rCHSDn;=nf;BB782GdK-n$DQa|o<6>GrS_<3< z?#VcbHO|REt}`>UT$iX>f|}(CbFige64?mJZnBc7;h}3CP49RLJoIaNrA7vgh_#xN z=fVojd}&1I10OZ=cMxspUP8$1h1A48e`9m<kMJ;Jb}*s~IcX1)4n*7WjvmxN5Bv>8 zzd>)qOJs~i#<;+R!(W$iW{{hLYGt&C-Y<~vMf852d@rH*Gv#|Zy-$+w_4JO_4=U7$ zci^hUV_hhh4raKQ+npMN2(p1H^m__|bd9g#L<n9zD$#fNi@<@PV|zLXeqI;{Sh{-_ z;$0upvjh)we)VMXnyqrpaSKe(pie=X6UmJ^*k@8yjod-e=7gMJ4;3GUhQb9CJ;i2f zfa$yA>xiPT4*az-zK&?=OWys<3=>r|$aLMd@|Q$gjXZ#_xV`Iefv$EPo})%7Ro4p3 z+|Wun&pX1TzY;QmIQvbS<*@u1$T?TO2sZxD5U{Ko9Fv(n&NMSULYa8dNHYaFdt}jC zA#D#vg0M2@fUxG`Op1>@>g|30#mW##AW%(<-<WQU_Xrw^I+zKF?cO4y;vCE;(&Pva z_!^txS@f^J5G8m$u^!9w)b3(MyP&fzAXttjV-QsIP1~LP<}Wf7%wf#a6zt-!GzFL8 z>oZWW9G#nG15GZDmx5!>Oy8wUpOJ!R69t1H4w)(PVf<T1n41;1V|XGK5;-(L(LPM7 zWO$p)6mJuMjgD|1l{$*{E9J}xem!KODFG`N;4on80L^s;MlF%x_M!t#-NLsbi~(VX z{td%#!-uHXVJlfj35-i{ygd#SS&^3S7?z<?ELMzZasZG552xTS26Ou{5o}bq_@)Rs zni94&EQGgtSOVjCAfHbDG<#^`g&o19Zpne_SmWfyA3sjo{~*Un8o{wRPT-ClD@l@2 zG!2#Mt#epTG9^6xtd1dO%gD%M4uhfdA@pw}Vzbb1Ojh4xa+@4&;YW{I%3uX4;8<j& z(KbDnno}_okQy1HX%2OSBgXt$zU0M^5$a6p8JbB_d0s{_Wl9exqG_Sg)IPMH!q7WL zq#}o83W`y@ITEXp@6s2I31~4GUpSShcL^UnXwXznZYp$LIKIe3;6`y!Im05%NZy`D zU(g3oI*&2pMQ8<V?~<HkRAOb9S!zZ;rC$cm5>d6#sA`A57NqYqAVRkE0wXVtNInKf zpdm-c48t@p1aA-hm9l3lazA~MKqfskL#6EeG_=w`oU$rAiOF_Dx67;<1&H;ZVjjD3 zY9W(^+HYtMr5n|R|ASzz@gOxF)%LbWkY+y)k~oM%-w(jn>j^X^&-)p3g?BK`6)O-^ zR*dnxs@(tq9wnj-y@5beQId`QU6&-oK*bcL?9sm<O-L<!w1}Sa1dCy;cu3O5D$gu? zl<K2K?g5ygK7!TMZZs{-!ha0~j>7*(Y5dbFG-|Nx;gK5bgpX%hpTtg$|N7|>_1J`X zuE(r)11g@Z$2nX!@uEcESb>8&sfGiUQ!F1}53X};My4Jw0rt>g+$52*>M=lpv)kcH zvE7Ky17IWS!yOv~C?bmiP4Sm{ND2a(=mV_E$Wc+w2!_^CF3fJhIjkPxICQ9(w1+;e z123~vm#6H+wsn*~tEbX{wconcEbLYkMk=rxxeWy+fA<r7vaB~YOH?-j%+M5qVM2u8 zeN8*q-=7UsE}rz8KriGPz@?CIM<>BA8>}N}KsCzq7Mvyv6q_OYVfJZ<^2oB(%&q<$ zlr$(SQwv4CCQJMq_f&#sG2ty%hJT$lZxK%{ga(L2rBKQ*{}DAlEiaL)K`GOSNmUFp zR0W2N0?faq+8X^C5e(!6xuRc1!D$<pR+hGLL83>W1I}ep8}7@N1F0slZYSQYy}m|+ z<3>C+>S@Xg72JqY3VEV0a@2?f!RUKA2d!oPT!$Jt4T<HkzQdly?m-6S2BT-zh#80) zc^eMb1XM5zvhV?0j_Kt{qk9V#`*`v<pdV^-(^kqr%fGigK>g-^a%41Y>#yj|Pp#q* z<8Fk&T?E!}@JkomIV+E6ip;`+(r;ttKawd-&vRD7f+r~^t-eAPzep_2bjMP(rT z31371rl561Ex{Ft+j7d`H}YrLhbVje7S6j{$CNx&DpnD4CZhA!ejrv6YB*?EP`Tm5 zR{i8bg)B?yLi91rF(SbQFrovtyw0IUDity#JvmJejaAuuG}A+;8l6hXY0y+7E_%(H zpG3zZfF_@q%$t+XtWJa>2%V^pM5yog$asiU06&&i@KX>xzy=$W|J;ZO9I`|*Q$#gT zLdxi?(&b}&JsUCL!L|e2>%}URL>snvd%cchmT&+8D$QHs)yN<D74uLvx|4`VUc36& zN%b#B2Jye*U0>36Co?_q@ouCUx*Ql`m;QE66&JMV7!zH%tI=Xa@lu}}p>4hBjEgNn zx#Tf4jpHy=)SJ?KlIOU{gS*y=HDlhBJR5tG@tZSp;wSecyKFS|ra2<}=ebeHtu&L& z-i5pei!h@Ceu02=qpFb~(ATJG-?T08Y2AU23<cku`2Fh*B!b3Z#E6UKQEUTU8}V)# zT0sC<o1kx+W7TI0kgjcuo#wjW0H&Y>2|6kYc#k{?3!t^)jBsNqd^j99Va`{Hg;!eL z&Pyw-;1JRPy8s-GDR~eo#=wnKoHF#RiCR2H-&Fh#3R%nC&FG4T_y=MwbN7z?L0cXf z`m*Ye)I$&8hJ%+*BG*b~*zt!PdW`u4ryNzaE0GXCvO{h{C9qq$hgH;pj*%%ToKX$a zlN-X|#}Mcw3^xB8c%Wk-g&Ry6W(*DhgIu(lA_RRKo#&IhG$-6W52Sf1vVt;~irZwO zY4}ZnxUCGoun;<A5%*B`Xcz9(i|81)p|^3HzGL_#{yn5&$Ahv04{`-qAKQr3BsT6P zxMtpTk46o}S{6^6h-#M@^251aY+{^u=Nk>v@Z(jK1iN{o?SO#;M%=L0mf&oS-`>sj zjXaLMs9YDRC}OA)%s#@7A&1)!bfOKDl5>>7E~*Iq4NWAh%)u2WhrtW2Ir*!8A_gx9 zTmi^KS~?A>a9DY5PCl5nPhc}1rT8~);rA!1(Lwrp2{*Qssgd8)_fGm|T6CdEqQyoE z$*707Qlei`5RJ8J<VO1b0ev@kN=Hok7?#jmAf=4Fv_+oJrjWkPKsejdPGcB3y?77d zOl}rDalaEjO2iX@nKmTjyp2Q>tVbJxyoaQB5;dKi*Fe<>`h2S%SCC@y2hFKw^aK3< zVoIi?mQJSw$l{FiHwjYHUJv*gTNR&$iZSgdTh%H6lI{iHg+jL`f=`~Z_>;H%Akz{r z4}%`-*gECQSf_Y0AS&Q1J6mtWhQ*AKf^P=Q`=4Z;GQBU@I+a6{O?mQj5$IDuh9$Z1 zMF&MC-_KrKb@Yedcj%LG{O<et5XCeHOxPYLTBKXRTxpQaVXk$^4_BIEL?Lsn0}Ulh z=9ZP_d`Gr9-_Z}Bsh_XHIUP$B?fZCQ>x1@PTndcRlkq%=@bhj|w6pL&<w`}%3n|(V zp38AnU5$M{%N6bGD-`W3h!5&G;{)*>S1H=X*JA$<u1hK3cd!>9SKzyfwiM6nmnzz$ zxOU?DJFYiyy^m|`w-xOqTxZ~#V_xUt*^Ib9;YrutW%5ehfIa;yfv<Tv@cnndKd}q@ z{c%mg<-s+%6Zx)FG(X}O;%dfq8LnN3dl%Ous7ELAC6JD;%zlE8+y9r+<bhw*o9X<T zt&P;E7|f(M8FmQ<ct2x!8<t-d^!v%-${~LsD$2V)Lv}v@rS<FmSg5$1)|+wKP!K=< zV%=js6t9^Ad*}J`*PEbT;&?||Hb7zU1A@`Fs8Otc6%Fn81)CZJ$%+3Y7A_wCf(%6x zh$8r-YlsCNH@ryEH06xGh)m!G7rN}^^v^#{EUdA$88wcU1vn3o&tujGYTR(fwTtz| z=#_^2Su0=q2d@}6Qr6v&|2Wsl+-ku%%AI#~%oqq{y3PUX5|cnUsNEzG9i)~FyvBI9 zwJbon(m@YY^oR{K*TYF;7;!LwjvS{(veS*KQ;9w(IeT$jIQg6<?|gx4C;^d=+kfca z_WG>^5B(O#5IH9&Lu;0Q8y}?hJS>=D>ECu7{DPFx-W#gYR0-h=`dZdDP1+NA8u=4W zK)GMTei9q1$(uW&dC3=2tQYi?Pvd0JA6pAe+B^MVI9gU3;mUmG%8~XU{&Z!?&;0rP ztAsyX2N(1wx=H>vnL8&dx*?Iqok?C%q$s_wtMU{{F_?T7t8FyxZW`?&C=Zr2HjwO0 z{%t#$tkw>vA)_|mINfNq8LcHoYpKy%ZnRbyt<^?rz0ulWwEB$Jc}DAeqjjOt+HSNi zGH{+x>k^}NsnNQ^*wBT_8XHJb8yjMLzlrXx9;3Cu*g*C^W5Yte)8yLNP{DUHXBivn z`Ob#e4L*LS>0)dH8JJ@m$hIth2Ew>j$7y#K93lY8YHY~oq;9@@_+G$wvN;$VO8LHo z?>gVR_`aW!qr)MM4e#)s_*ed-Lu^A5@39TE_+f0=hx<Tx3GO%sH|>j=;aAa3`M?(V z$)eW&Cb5BvitY{S7dMOUrFa+bi_?s;>@0$X`}<ZPC;{h@ox+0Ut#gg_6cGAnbnjqY z5ztVK$0$>%za{;P4f>Rfzcc@o9exJK%v@%0R}cMDbW_cM!ztpi(eRN(!WV0(!v0hM z{3lPuq=^H5>yGNq3ct-fbaee4IHYq;4*(_wUWsLsx02bP&oNKbI(*5gm|KF!dXk$g zTJl;L`r7dO5&v=j{nE|p{ySUn;hSK7=fJ8k5VVMHClErnb~M683f40G`iAb59Ytvc z<99u4c54~7i8@0*78uN~&dr9ynCYOzz25gb_5+&k!RlL*`pPh7qy&C!BIJO7$y}Q; z$0mYy{HDzCxk(p}H^?OW4U!?zVD4KBE!tqMZNsJXuzv{;{&6#-#cs4<`re6j8W5*# z)i~~1?xYG$gr;QrD3I50hXP@dPEk_?%WZlmmQyA)Pju-YLkW!<wxZ+g=tw^x8|;%y ztz+CtO>Eprd}G{M%=hQ`zLV}PoyMJqkYOOY2cJ`7ckaVS>`wA(H}1TN)2+olcIWN% zzWD(T*~s_1`M!zo_wxN7x^I38ck!-qCozd}=OcXI&i8G6@5MdYN=p@k`1PSn%I-{} zu+WU=<R!eWL1)NN{gdxwT0+EGg!Gt;lHbK_oa74sb>7?ttB^?uI?#l2U_5rg<#Wma zA8TnzUh+5)h`tKw@!Yl;SCD=Q2B0^BMlz;NhJXXY`<5^ZJmTp>4l%b>1k1@+K+LV6 ziIbRHj}`8G5v;~nftc%~^==Vtz*n)D+m5dy5nPC`QZcs!UnO+@wEVTEHkx@=h`CF} zml07ef=lpSkMpPTRV{)m@Z}RXvs9#gd3R9x2%9f%X6ZN&esOoOv?RX~u-`m5PTnz} zXbImPF;_>xqWB#pGGK|g*@?H<?H&Rn?${@Tb#ar&EMaN<4&Jl?ivkvzSH$LdP739S zf%whT^pPFDM4dxFC4MvU1N0JCjA(F^hfrzs504kO^DB(!$tTc*%(KhXNEwo&>&f4A zBRBP0vZr~BT3Q4vHs+M0dlneAWO^$%0<@e0|J8Z~mKe2*5Lj;nX#ZNN{3V47qjo6* z=i$c{5Lj)@=|IW`qnqml_a-B-1mQko&I*LjH@XQs?-F>61v(MF(BRnsqA>oH80(pM zYnWo^;rG$5vSCH$S{vXm@eb<PWUj|0wXlXyPBcr6$4F|6N0?&KRBS!b7I5`gH+PIR zOw{#6XZ+A-gJ*?UPfSYE4~L3e!)vCP2jZ8t29u!&X<1Eo;-`3ANYma1mk@cV=92zE zGRS6hljXzPmYAcqZ=jpT7)$c!uq;7Fn3<J$R%W12dsb}$tghqT=}%rjeQG~OJ$Nge zC3ga#<kO@ee!Yi1WhVrZe`k|7_8j6@eFjE;!woP97NAY<O};@>n~wwa;|!?p9UBzO zQxKE<UkN7EUCobuSk6X(zWtLx*JVIocqC}l)t;z)7drr!e+g&zZCcA`_x%tL{4zk# z*T4Y%J*9Lfq6}I#{Q^gY(fo=gN?6{*PvM152p`T5<@R_fbWoub_+>MiC$#{|Ww<WI zbvdr@;KJ{d*hc?8iIwY>z7am6FPv2M^Wkz&h3HtC`S@Z6l?p)RZIAuzyERH%;NMR+ z;mrU%I1+yf+Eh)<2co?_?w=^U%j0ewj$z?b9sAi?Zgc^JZ}>1_d-$~D!S<ye0o${g ztW!*~a{g)I!{lN3DYeDkqsl>LBcW7}a~gn3R{6(~U*_$(fJ)}<oL|zr;y<Aew)9Gl zz;BkPo06Yt{7S=zPyF=yp*3$+w808H&D48nFh7#!X?Vv=Z}%;r_k<BZ>HNUwxZ2Ca zhs+3k#BhHPy^hq8;7R&jO7trYC&zz=YL0*foMZBxlTjZjlaHDSf2hLXhnVn(PVB+g zzYzZLG<b(20A=H_n+1ak^VwMl!4JLZ7*gj{r{|#^f59)P2dz)yXz2jVa5TH3wN%cQ z!`Y_FY_-)Lo-LHL-<O>f(>yA{!bv?cX`s5JhoL@8`_3~^)5vsDBM`d-8H8b(7AM`Q z;Scla0G0(TIq-A6gtjR?TKdi8^m_vK@F7*76+U#bULHQ=K^G=c`K3rWG$MIeHj(5Z z`ezvF9F*E~9&ToE@ArTT1)5Dr?U$&0Gkj>Wy83PeLk5<tXBp_kL#8Bvsd`&z!f2>p zN<%$HT&Bch#C`b_@)dI&i(2h}Q2sRjhP)rl;qUX)c|S=ewyuNy2-hN9Kg89As|VL} zxZc5~jHN%z*s(eM!Z)jJOfGfU5&pUnMTI{+5&VU{c4-?1SgGSxYU!qtcFv<V<<{#( zJJU}Kc06}fk~G&S=->S7gU87Slr~$SNb}GD4G_iD;pWwczD(t#9kq^qD3(TTH?7H< zTu46?ZXe9qh;mtcV|b<^lv&Ub{wN<S<TP@%jtpH$L7n<z27!^GeUyAVUU{^i@E~7k zQ?OA{pJn{$x()fso@)vsstomyYU&?2tiyG@{bN4?N)JI8*}Hy_{>~<MrvLrN@Rc8a zBK!-Wf#_$251o6w_`h^J;7w;jWOZjA&$vIIy8IjH%a5QF!DV<O^(9UQdf8GHww@x& z3F4#X71TW#5-C=LIsE+<j+c^z;!BQ5|J8K-Cv`;VKwm`37vd_$H5*q8t}Ag}k4wqT zwa`!D$=}AqkK>I=|1h2<(*~cFKlYQ<${O!R`tv=&SoUY#jqxIM4M-uoZT6V!Kq^S- z?EYR%gFse)r@fIfBQrA%)#&p1N2N-4`K~*Fl1xQ8k4yT?<e<U`{xsb%<<b1(#IKlm zoW{;i#IKj|lc|myKbai(QTv$u<^jL`1-%ITwlmY2B#S9D>d-H4@F?_2Ec1Qj+=y!v zE+r?&V#zty-!b{)xb&-b!o*FOWIDgZ|K#Nj!2c=qQsCc%2WWA`Fq#?gMvsGXtmCdU zGP+XkPpapwC;>nBrCo~a+qk}mOW~g_wAe;X5UiQ5z%N<-;kfGS{yyqUherQj%G;OF zPe;jXQ{F<<o_O4%ig18`c3Ng<*C<_|!ti1GL5ok({|A*L#VC)5iCQQyr>d)ef-=yE zhc<8{?!kkF9uH`|qgnW>JDljKek)86*aMdyB(Fr#cC;!Qp{Ec)<RCd%VWX+uAXcUj zP7+fNjaecS0X)2BWTu%@;Q$hvqq30Hlqo)C08X6&<d@<)8`peXt8m?l>nFG#zy%$~ zLi&qUsxT0pX<cTdZxEeF<j4O9`Nz!hsq(M*PEhavR{oj%Ax{y;9Eyx-(Dx5d#t%G# zm}obM;+8=rGkn8fN8U2nwTD9?@~0mVj?Me`qs4J*Zz?EtqEJz7_#=DgKRWDSg{*M> z><qYG!kM%KfTOuVqINP$$swfyA!NHENzU_fm8SpD<6Bsd;)5tNdOQviWEEqC<44-# zAwW0BBTx84)Mr(uK9~q7Xk+l71!2s2M~q27JVL>wx!kD1j0XFjFX9H#zv8$OpUa84 zUdJ;(p#q?qB0cM0IN#z#(!VAhuTa=eeT}%n)I!{M;d>l?j}QxQ)c)r9;zie<|6}gj z^>`rWm@`HuI7MQLMlfOP`t)IEZ5|-L2iwGCJkP<USS>l$WB%og#?P$(XV%{~Z3J!w zgj@D>EJM%F43DRyXEMBOmgCKBTA~IU&fI~Zy4nhk0v$VHLcuuKj>m|Zd(<p>6ERJ~ zIqT>NE%i3C;!xwEGt8;(==`L#J3-BKS3=s`KPhb&r6taiaH)SDfkUlibl|X*x+v)( z^6XbK)yX$9*U7hX35gZ4mO;x-vXoh6*inkuvAgfu8L)zl0hLr-Gx0tZ&r@)H4Hxv+ z>^}<>S;d+OvE|YalF;yw!1+~&&R*_Qx5V5(m5N2mld#h(E8ITltguGGxP@&46K6`( zmi$V}apHvVdm|J5w2`167JB;-{azpR>=%H~c3dyvdJNZ-xIVz8j5+GhG7^#_U#+$b zPg8%B_MBRpUY;LL+ClM89hS*h$opN>bBd2MN)r6=VF$sK#yD6`%g`kKSaq<&bIdmM z1S*t4hx&tU`VI(GPzwhgfi_3WhtD#9^Z^e0D4Et$iO=!dFO{DmKdr8t`P2Oi3dnfs zUuzJB{?-0-?q3afpadSGEEyV^V+su@8RIR&j$_UNwr2z+6CZod0qq1h(s=aQSY4!C zz;+ArK7s4UxX#2k?A4~ZS}LMw50>|zSw3|EAUi6IHdCAW8yn#N3xr#G4-;-a9<-Fe z7I-|UPqQYKQR8lc93eLkSAsl4GnyP7aRyCpDNyJ7r`4~F;r@8kFZ8Fs0l;gx_TqXS z*O`P6E@cd6B-W80G-k|5-yyEes*k#Qon(d;SQ3D+osS2x+n}Wv0C}N=bw~Q@p@Cka zHmGm_$+I-_9AJ_F+6bzMjgZwHL<08KNH{LZviO`SRnlw{Fik!a3I2$>K8ovaxE{py z8(jNworOw#6_<kH(KaTnbJCN|XPN%G7HJ17G^!T*EcS4k-Bw!Nv-&p(qHeLMTV`6s z&c1);gkKq}Zn?Ge5sMan$(pdO6}$TWH75LuC1IN(Y|&B-2;rB{;QhkSzA|+y^be3w z-7*6JF3C~1oQPk44ZouHy<+S8cTV^<Ro!y?wBv)-O2F_(4Rj2A9{zub&vC)Z;De^? zD&4wFi&t18z26z<=`HWo=~t_nV^DwK8?VekRB1e~>%BLcLR!~%EPn`%|J|b(>^ZIX z;GSV*De66d_ljumg3yUw@4XZ{DPCzQ-?%K7fQ1SrBpe)9NhQ45_1^2D@%P_#!S<ta zhyHYA>q&aWE3L@*MMljdk@*6DOeU1}hbF~mTDlIeU1slkxwq@^u}XXgCEk2oC6fMZ zM=N{Z4XP2W#4BAFeMyb(!Aq_8T{%k-9~OQzJT`GR+2$dOC#qYjPiY7rI!#?IIAE>o z*VG@^DR_iaIqFSO1P7W@x6x{ASnix$jiB&APWX+S;RWH8wewpP-;s_Fm4yea;Ww<q z7l%`}&Y2XqBokMK!>7Y<*oLRp&c%;!p9TCvF5sr0)^*WE`bB6jr#uh1rJoY0(M#ci z(AEmWJuLzBVDQ5WxEiVGKw!CIKn|_^j__KFU=tVOQm@<#-$`7T;kp6W4{$w#OQC@u zee@XP|0sdw-HM-=&=;y(!1WCvQ{TSu;jznafPV59kSEYsk&FW+P-Q`Xg^_FOaTVUJ z`nd@@X$AC6XFM1_eDd;Ib&KJ+kI0+&0Qr$H^jB03eq;3(?-Tkv>Xtl|b1KT=<Y*hC zNGA8-fdXjFYeBz}OP&{30K%Vfg^qYqSSzllac#hL4=xJBmYB?+VzFBIBS)ktj?!Z3 zJM))$RYqhHy%qLN-;JNL9n2-|HdGt8l+V}4m#@%IkiCQ@4?0R^`D_GVIXalQyg?t= zb$Cf=0?rSjUOJdd21T>45`5-gcm#Pr#L<q9P;MJHyt)NauiDiR?tLF7?ByU!tn_}S zq8krzgJxXNMhs9l{B7}g;ULcL@0=3^+s)6g-8gWThNJdd`on`c!?VPn3ZD<ZXYDMY zR0}hyPQciq;Z%Qu6&|z>PZduWJ`+A{yWZYrvL2;xPp8)-;X#}C!vH*(5hUI%JUALt z{Qe#DKunj|&cmZ_&TwP+qnyq~1gRkdsTF92|D7}Z)$m8w&U%XTW#Z-lmGHl<!>5Kn zvUL_w+`LR&9xw?18%TsAt&&*OIa*D6w5HKUy$~oXMt!Umq~IO{swCj&4WEfAU}P-z z{ptU(_b%{JRp-KYCNl|>5ZD6*2pA<wR5V^tya2-`V7LkxKoT(qw6zvFwnd#SSQ8vN znVQLFG`8B>Q(N`e`#Gn_*IG)eVnUFMD55CfrHa<e#6d-+5+E?&|5<DAxr7Ai>3QGZ z`+dJJ`8~7tUVB}h^{lm?^{i(-YprSiBSyoo!CRMyK|=8d!?;UStlaPL8&#P5n{lKd zKNW<MyurNRF37bM#8`a?{Z+oFc*82YFy$1+SY2a(Px1#NJPt2isCe<TIsPMoQ-TvG zaQYosOYKY()TwE{a564oonog-QjKYx*yevui6~9ruOwiEa|kPBAOSIwDIgIm@j2b9 z=)dTRz^6RFX9MGRx)76-<K~|~53<jX2>Up&4Jdgm%l8rR1D?MC3V9}OFSk-Wd6WR) z&gmsld*u?>%lE~=9l%e4XMop$F8nCTgQP#`qdWb7H@%D2V*CUDGuGrPLs{J^I`WOX zI;a|Cs0aR#<%5};y=pYa3{I#u!hhwPc;?kC!q7wF3#-kY)4o9}c^0QK*Kib(nry># zVa4l>HG_h6LuciiE}2gj*T7!Y>;;M?gZCmb@2{5a3?0g@m$Wr+&KN1MX0+q09<?z$ zKA#@7jeTQv+cJg>ZNXb(^K^!f_}O&ijT{40_sfj&gMgqQ2<sF*aTh382kwwz%}PKS zhbYUx2AkLoL14BUa2U(#%na<z8|*P`tc+n}G7vJ)w#TqjWDGku0|!$sP>?Y!TZSmp zqKqYr6_I4-qlhH$(A0j%GK+VHCH+o2_}$}KK7sda_=3)KEzdsyo&@CE1wbVb2KnB= znZRYhVjv4;xX75~Cu}qMmm2@gT-^kc6j8j>xa&Sx2ZY)FM@5*mIEsJj!E|bTsU~}N z-83n3SN_R~Rc+8LUZLyVU3aR4O7c&Ab&}McFixr&#+lwOQjF7rf>LdDQf-+iF8>bb z6|7O{?FBulw<VHIidlXwz20WYw-mFSmtJop<y(qb4$P>xMq8{%mnKpohA0dju_9e4 zp?_?Odu{QF`<3nX)^dQOa+hxb^@}v>BXFeG{WUEYEt}*xjYMP>8j1ZbBaaqiXdf3o zfnFQ99XKB-1%3xHj>nhU2=g{@7??}ge+32ur8a23q<NAsCVQHu_|i(kGy!7(<bdR& zQfBLV{&~)zzZ99KX;!~k!GlG&oF6<mWck_U_@0`Scl5XZfui8S!MAan-jL;a1Tfzh z+lxpq2L19#FTLbKtCjhn*T0dgAOmCN*o+lsUU>`?XGA`@+?HTnzga`fGbDqP)Om!- zy!!_RleF1elKw~rzC|R?khVyYU#!xXrTDMv4@#DJVy$Xy58!0<1(79SLC6x)jC$$| zB1^ynktHNlvM+FXPO3&vq)RmDE}_o=l5QdAm8aU5NIpq<Vz0({JI>TAkSFLO*GulH zF0#n(B9{njn=ao{U1W~kMTQD%J4e2yx=26WMQFGUX${vAw!gA_P-bb>j2EJ-R;<vs zAUf5>{bT)<pzMKz(7q@93HuXZH4vl}e%z5Z(EO5G!rWXmhHQltj~wECK$vX8p8_lc z-sSx=-0Ojic%o<|9)C*D=rBmFkCImBgZ-dWDz<iSLSF!~S!REl5sD$DYbtiyv(vvd z{bk1kecbo7W=~JiV)O`Ttj>iQXVihwFiOO<joIyQuui7i5+c!Cykyje(a>9kbGQFN z!fD27td?s5GU~<%H{%syM~gPR25s4jv<=i@G*SwZ$$|&deHg(R2boCNT>rQ7WlgX` z;T=8)XKMSDWNu9IrrWtCTY2Di!TeMSquaN!y3`JnY~z6iw50YUWNQ!B#_B9POp?`e z4JY`tze*tL4@8XyIZi4y@$4HY3U%bw<)a~7xkt=Y-bfbFsTmb(v5G~pkW4~}g21Vv zM4v!$C?Qc3`77TDB?bm|in!ryZ)}^2rFEfXSgNAxn)GjCODEI_b$FM*B|3g+p=k~k zCWEEWJSol^;W2nYiTEFqWRR<cBv4YO<z^BU$Q{2sNe2<gBv6`QJ6HwswBG<dFwW(M zH9AJ@YV3#gtorWL2|&v%Y@bdDRpx&|l1){m3^B%C+jUjmr>n9-s#3~Wu7cXLdArt| zRM6(lD(L;ckdoRQ?Ha)?RoB-`2}e7k*+lu6s$@o6H;0v~R^X{SO+F@Tm$gP2$c^w8 zBvTqDJxH%DKyjW#R&zGR%B-Ciy_;3!Orv2nkwg~llTmF-##FH!6)h3f&}kny*Jgwl z5L3o&m4WQCt!Zoi+MgN2fX9L6zo6#_h5~Q!{zqH^c!bw27pB{{rMYu*MK<^LqHUJ& zy#iPQNW8Q-5+?PRHW#=P4j`}^c;Lw_-x1=SfqOZy43KZ{<35Y~6X4eX<Ex%}^DBMA zhu^utOdvh1;NYaK@zzM^fWAAIE8h4^zgt;&oZ@c<S^)%iE3#hWT3Z-X*Ky?A%CB*4 ztKwt#;Y^KxE6K_(@5&5}hVev@MlwCg$Ij@=4LGVn1xiVO#%kBG?BEN$RHLDHi}@-X z>n^+;`8}O)Ex!|<)v0g{zaltZ(LO{vk!YoU&4V<><dDaFPjxWSO0|DZx{Q3r>YyDg zIr?$>x(X%=s`jla81vADcCh3?$QkT>qg`^ir`|0swmEW^Uf3e62>yaUkKn%vC&|#X zj^bG+$|Khcb?-02Q7G>xaAv=I2$G5tZK}fc75jU#>lqEhNZB5(Ph+$;RzGHkN%laa zVFzB$sBMJ*LeFzLqUvO4lf<$5KAS`Qn7ClNOk+9=hdAbI$ppCQRgFj4bz?IzzfKy% zRJ$?Moh%=dXa{Z*j&YXFG3wRgzvc%LEDiIY;S1(;;-a|=s;stHZHF*J*;=F)fuOz3 zE~FxqTv4mG7u2YE>U_;Rh@H-3Bpk8qU7r*uP)6M}p~M(h7#K9}B-5-`jQ6FF6ysHS z!HCOZp(DBId2AlWF$r$^W|MF1y`!JzK8FF5%0mZp>pn%eByBHbLk;I#l&upi=M(@q zxk^y`e4CR>9G~Q%)_m@|EZ;m}IdB85+6Alt&gQ)dS3vr^{$m+I9-RITPOlQK6BzzX zmhULAxdj~punoUiyic@&H1gbTPoDhc0PfsgB1YwTNu!Z4zX6^HB;J$6mw3cU@i}=) z<8_k>vlyrYE(Dx>C-N+DC5^A*Q)>N3<gP;h0d7ZE`V5iub7=zwNGx77(fRX@y9Uu{ z8JyqSphWWGdDSvh4%0(r4RZq-Fe=5<dM#GO!9b#c#d|8L=G82gV<njoC^bfYx*B7# zQe&ufqv9Ic$p!Yi6ORmtr?e)rIE8nh-By-}7F<TK8d{fHoZ6)3253ICj%`s})!f9r zNx{L^Q;>xOmd-NG+NI|S+azF8cu1;9)Z|4v&M7*eXg&y-6d=r9bQRHd99Up9Yy_L= zqU`9mT{3-^3%?3c9B0o89Yh%<nrAe}rOztn?!!^+=il(=Nc`p`jz(Bc9@Q);^lWyh zEj#{A#fToTLne_l!cu(Ah(gc0Lv8N(c$qv*mh@5>j?!!>^sFb;=0RkjlKip2Y;Jh2 zHS_$t1D6H;69VT=y<*B`++|m6geOC8D!!x^qF$hsBUBB_5_!Kc{T&>WbVu1zi?U_0 z^F47#8~QY$4eqrYIFskAfz`kt0r~bR{)2H}ra{#My?_gV8i10~Y~3E5^!Xy13pj+< zwrQP`@XR5`T{kFh-x%Ad$oo7FIQ!r^qLKQiH7H)q@lRBPVl=3RDQh~yuey%&%@m6H zO35aLD>eoH*UlG<!Ib%;rlhh;;w?3UrfdNk^1lL40*^uUn{jUd*6~aQ=DJhHB^XQF zb4It77{vDrfjPj#K!4y?;66a&CI7maGoFzC;LXj7x*KpZTEhQr`h#J{T|dz6p>T`B zxC4wG{lN_~HqVmACrf;RYc*S7Jp%o~O!=0SpaPYe5wIQs3ph`{CB>$|07nuL{lVJ3 zssllk<Z|5!X%LhGL1aUvD_BXZ{RQwma0jr=2I{WIvFZ#;HW^q1JPw=&gn?fHx~-%d zi?kJ`Cvc0hAy*r6*a`!we_Nc^)5Z*aWk(<5u2q_%H$A5)dL@oxwz5Jhlu2W@5xi`w z&K0VDQ@$rztU1f3>cv9U%jH{&u};xcjSqoaQe#|LY#^phgP89t3hSlP>v?vRHn!j@ zEGb2DTT&8F>ZB-gp<G<9x*4b2rvzB$nFE)<hgjI43Uz-S4vCzkD#S_*;Wa=5dH{F= z*baOMq_1IkJXT@`;f4W3bJi8po-~1bln2t*H(HK{I!;?)+_eV|4KFL)t|;B|qUvoW zN;Ftn5Su5m<OU93(b7SQk`9*kiH%M3XYAzcZ<S2uM0thsYo4x>zJD~1h!z2iWOrFx zV+Y=07|2LBcIDrc%%OeN2sTHCu#+k4qBi3CH*tEC@@KVbEvL32R){olVRR0*81@_| zmKP|R9vBje^;S1e*u$Wq((u0+*gJI+;>=4hL3_Z{U#K}<=-3q;MN4l@qE=foRmR0L zR02A8CF2ZH9%OIk6Lu|!#b_bN9Ih}m8ct*0792f+dk)m#OCy!>_cWbOGW(%j(;b|d zE+;RMZnAWu5yz<DWHr+au27^6UyqZ9S*cD^<tk$P+Tm$=s=}O}mZ?x!G<8b+gC;7# zz_b9Wv|{t9#Rx4mj$!L_l1f@=Ggc2_#wlGar2^?gsh<`r{Pth+Bj1wD5Csy!`QEO^ zS}n#It3{<H;ZpOSe7dkoBd)ZuNsj3x;6@01QLT#@tAA|APELmc#P;aeXGpS1o@z9_ zCTtnuFHe1*8qb~j^Z<~Q*8DUs1TD4>qA>0<{=@GdA|@TVMK|pGaF|2a6Gt(r0X7b4 zCA~vsr6#2dl`QzFO^vj|h;W|9tc=w%jqZZ-87hogCF?i!3Jkde!$L>SGIJE-g0TNH zBRq!|BWFV_KCpXH8y*cmA)!nW=IOKWQtK)mstnORI3Qnlb(bpoBjIfB`mk_UHD66b zTBKha>7a1fp&1AVY!2Ig9VkgBk@>1_XOWQ##YJs+t96FZkpY33x>u?eSVGE(_(ukq zeRR{dg?`<cRI`@7Jt_!SP${mUTIwmvR|j)u6;5xHSp)UicPndu&tqTv0%vIf_W~w< zklYu;|1J3Im%u@u58?MB-**9z!5w$-J`ew|186#YyKu!nt5BrfLbgPB^9toJzjtmy zpMpMp`V{sxeEkXw`wwWop73*kF~Fk|CuuxFT=~o5UmS4UM7qBO?gQ2Uc6f$V_UiDb z_wDFMS+N|ljXiI`b-+Z@jspF8Mw6}LF6I47K&9i#&L^Av{Cp3<qt@5u_j2dEz07WR z66Z@`ke$YNaPQ^4JK2DAx>zG(pH(5|QnDJbk)58hx-JI>UBe*{+nx0$+wkXT=-`0m zC(E?zWi|d};cyjdymzR@9na-j#kfn>qP9_;MKzIZdv=0>&$q;9UR8N)8Dlk!h;w=D zFjB_^c!4HSR9?d=0<xyAyv9gU-kRh*)*GxFBJ)@|!9%5<3@Il|O62U+RvrSl?ChI= z^b+eUz#`!5z!KmI;1S?0;9EeJ%S(Ik<|u`tRyririb5Z9C;-h|MIJ>Ru`qMiM;!a6 zBkY)0^r_gP=u?Vw41Lx^9}2t3MzE%hVlES(xmZ$Fs$;agoTBC5D1PQ{@m;EQC}MUr zh||v&)y%{ck!XKX1z$wLg%&C$)(O{(k%Y|tYZ!=pwh=?Qlcx?T5hb21#-nCRJWNfl zl-dLufscS)z#1S5Wc8xW_sX>9RE8ZGb<UN>Qi$#<AgAESje62mPznBmUu4H3>#(!F zJp$E+SIdiHsqu<pW5((~6R>JQ;{G&2@fo~qR(6%*!J><hFezbih0V%F3oE-_zNLgk z(-szskqW=SdS=3@CM=l80l^71W^Mu;<<$slc~R-?7mBsr7lF@EeVFg5#}CkZn6FX) z1ZF-kZaUWIzW8Q{R|>CEOHd2dA(p}^Yt(Ufe9)>=-Z**_HfRS+Mp9dD2;97a;tL$1 zl?=u`8~7Q|t-w2gd=m+gm|k_sY2oB6{JR2jO-w-(maLoUl^19;xuMHXrB{xARkgYi zIOFm-)lJF2%8D4<OYgYSfM;B}*=MqUm)Wv-En^e?Oj^a_NI&U?%?9!IlcyWE7a;78 zK=Q{<7k;yo9`?*YJM5d1x-U^niK9NA7M<pTPQ{Y_pCuRW*Y!0GGuG_jUTd^7>yLyE zu@Uc0K4HfD)GopK{$?BwJm|+!IwkeFkqH~87PwSo3ST^JGTRvJ-}oPU3>I3SjonpR z(5B-Abz_2+3fg`R6(|R`P6exU9CY@&7~s%;5#d4yvjb<TK)oPeu^h^!&{IdrO6wPU zK1sVhS3=j}5g(NviBH_x*Cmo{NLG<v5@DT4eT?v0{0LSuYK#A)dUs@{u%Ti`X`iM@ z`>!PEK^KN$_>bCR`!*}zY_neBxV)*Vfcuk|`B!=Z!-9uP%%KvvssGp=0U!O=XRLWy z)r)_JIZM7wn+)wWCeyl2{sKGsQ&jSD+fjO)0rpqn$##{sCtybUxT}RSo?k^>|AzMU zB5(*8&-=|l<xbiF@D?xvxDCIoeE3ej$HPF)(3b;v^YZg#7|ctyK`KE^th{BLL+#mt zB{Kq-&oEbtA;oop;lYD9o3}Jgca;YZn&yrA;XCHF+~*Q7uU681oAz90UhaII%-37Z zaeB{HaP)QN1^Uak%n^K9W}c=Gr%`DPYRVe-P0T!RG7HwqR-(4G6XZ9;2pasnP5sme zYphu>y+pLUqi2O;Ibz8<hxMI{UXxxBF2Uit_eo>7o7XhuHuY0a^O8@~ou_ziQ|_dx zW7nIPG+`@?sai6%+a7Pq9qkGXSKOgujAJc20QvVSmB;;+I7-dxuz=>4-SBzf_rNQ_ zCjhd85>}EwBIuw<7yVj)QWy+SP-jl7T|C6EtGx^@!PkWOxzIsTA<)miEih=b%k1AY z*)?f0M>T)S{R7(;aXf7slW}_+K&pPJTWnrP#skOeH!IYh6FOML@Vk7JEuTb2yskK3 zAx_uvR$CuCv2J_0jFYFV#3$hY1<(N;0s0cN$1*1|(GSwrY<#qxPu?xq`Q+c06FfN3 zWKKQZCEm2Syjx>Z76~u4?&Hj_D<Fa%Dt)0B5{~>pC%p1PIOE~ap`7KXzz#d?f(#JB zs;>xEc~-y4ksCdce&yC&&tz`DnCme)&1-QR{^h*(3-nfl{e?<IB4m8mpGf2>pcU8# zyaj9oz(;g+g~GN+@=_$o6<G%NVSiNiTG=Q5zpgyRYAur+;Wytp$VxO-CW7y_1P=wx zUe@60{`Jd0@ox@bw?C<I&{Y3s^GlK_i5P0!V?D^Age7X&b55m{@>^a%y;L+wg;kb` zY#@dJO21JZU73w0oLi8;r13PN8Q2arFmL!M$7uK+UNZyBX9fn`V61DoA(AU1!KUm< z?T_=p&n8}@L7uqZXs#=?r&sG90(iu5_T7oS*NbnqcsVa_=Y?JRTsq8NlKj&X3~{TT z%i5il)hFxCtgIU%Rh>6Prger|J@L6D8hm%6%Gp@=vd)?$dT(a~L#gs_eU~@l91XR) z<ENGmBP<_X`Xdqe4!TZ|Y-oVSzb~T#^e@63GCyKwVGJadz?)aUIj+;}6q!`V8FNZt zhJ+P5GTioU%4^ti`)M40t}MB;>&|X^spX^G;BzgFgDv0W;5!o|zTlQ%JlFF1Uk&tW z%ui%leJ63<b6>M<aV;`tsy$ow3}9Peq_j{ql+U*f{H%UR9fPf+8;mt4-4GcXa%EdZ zmsvafJ0nHr-$W(kAZok1zIBU#F>sD*@gQ7W<)n83>yZO2UsM0aK?#>Na;mk{zbi7* z{7{-RX&7r-az@C=*>UFbGiCAnuZlVD#Zhu@n?A}cc<?COMGhvGtF11gb)sKyCD2R2 zF5o=?U&W*}`|9yGW5X`^>kA)!NL}@EBKf6wl{8hmnlJ?aeAUr6NYuEiResm}y!max z?q@-q;KAUnh0q%D&<MZH=SY2)S_!3_T~k_G_EzX{c3nL9+`jgI=c6@(Mo?PzYUmJ4 z+Rv-R*vOO{`oP`#L3Zz*ldacV4`&Cr?rW?iXz*Qk(`&)!I$Gk{!M_<(A|qPf_2loc z{@ysq@&(^<PmcJS7Q2I6I%sVz?-0bDzt#G@X>il)ytTx0^S3tkwMI;#HCr!4Mu<!v zd@k77FFrAa8Fm7*Av!VQp5WF!ji*pC!FP?w$l!B(nqF&pS0%GU@=G=>)u3q7Wa>X? zgx_H3PnMWgimAP<VK?9SR+jI3z>k4q$mEO~J=VtmOFxLgsB{70t-23r!MNBuui83P zc0~Gs_1DmcN6TLGzrC_=Q*9#nw~pZ9-KIPAakl>jw#(@KNY(`ZAx`x3j(Vf%c30Do z8zRF(x!KlesBFFHe<3p3d`r>Q?rmy(>9)NNZn^?)nryG@b$cy;SGCuXI2rAA51*5@ z*R{R=2Ol%q>kBHef3Ce|AJbmxVgFEro%PQ(*w?#nutVNqtqhn3ya4?F?bU9tN0aUK z*`wXJ*D*~CU0>N={k!yvV&GcDKe;jH2^v#yEPM2XEi#K^xS3)dDEr**4=R+IZ>(X? z%Lb@;ucrK%Txf@CeK~?{W8Hg7_`4oQ_TpS8^T1C?1o;SECC2*fCPKJU+lSg^`_RPD zdf6`&f71yW*s1f_3Kr%@jX|6CIw?4If;kAUMUe$r_Le%woL{_T?FgB8A(_YjMq9z{ z0}KWB$@>ZHv70Y@y>^L}+Fg{tyV8CnCP6W7vgl>pC1<oSRcLsht#_am`@KxKIH;AQ z+}CF>UVAE^BZJfnWE>;*)5#PeAr?T2eh;V=^JJ0hYKGV+NR32)ful-qZWT2zTk>XR zvk3D=(`0sUN)6;WDdfefQYj$w24B%BJdd+j?a&h>m}iIsePYn#yL|h57gzjV!*3bx zd4L}fzoe>_u^@e)o_v$A=~EA<e>xM7vdt*U4(8hX^S;64joU&N8S6My;Hm&8v3A+1 zH{H#Yfe_<Vh}jaN%ceai#86`$CbMkc3w0c4``+_%j*NBC+U-AVeTsdLty@BTXn48F zs51MCp3GR&3Mog<iuZ0>AM1Spfe=qUAvEq1t3pWXX;+o9H-_q4Ch6ZB&9-1R1gQPa zQP29+F6VHe+V*TT>_w`U(fF{@APW?FeqrY<^=D_=i%fsS&2mnLVn;}Z<vPO>96Lky zSRX$_wNxS*nm<|Ol(g(^<QyY9hD7mGs|cvO#Mf=8yX(66dW`5rnPJs#ycfA3NOTRd zi|u1!43bS?vbCdZSJO23hD^0Y0Rt^DnW9x2vGv>p$4P&}6@md>m}_v@oK^P-(L)~z zqU)20%7%rAY{mP?9sfXyVJk%JWcu)tC;qAvA@HKkZi8&WdxpVXG+REt$_B$)N|wYn zgq{O6;Zlw113KCqi8cc~Q_<MFXA>m5etZ{VAclQGp(VW9<i{pgO*@1{8LuRNm9hE& zCcKSaEXMFkxAJ2e%Wr}8z^5Nz4+Olyb9ZY2VmKgs`Idc{<@-MHAn-VFE#a@ly$E<g z$L(=1-xGXy0YiW@fJ=c~pbOti?&TAq1wGBdf_e`Orft*~@^7l7XP766nPJOj%nbWY zqC<+I;RkH?6)Quv*EcoGfCTn@dY8Rk!7O-F+4|qO0)0Yzj+!~7ytpko&ZiikTFK}# zdi*OF$YEn=+$9IZ!uM9h9ln=aqav%AMtB{cgJan~s20{_V3Gw1+6d`ut~yAD2iccd z1mCRTqN5Q+S=>fTYhT5aVy1zAPjcY25p0mg0pV|bw#1jnqMN5I$j&M?J>9|M#j@wn zAJ(5=qdJo=Ejy6wK4nyk7wgZSx_21X;(aA{O$4nkSO~^dY$#_eO`?!C2>ei%6*}@& zcUcPwWCRdOFo@<8*B(SwQxxoEt$;)sO$XYe=^hzP-?m579jY;swH>helaJ6P0S9e3 z1Gg1;8Q25Jw>yBxfF<NR5|{(j02c#axxa6xv%jw?e}2=|u7)=p7B^bhL0jw(*c>=4 z?o!R-uK!pSa~6)VhUJl<!&6^tjpsx?ZSd4537NIyZ{cE_ryjBEai`IMf*=chh-B52 z-zBrDX_-AoIMRMtXBJFlX7kgYGi!D-Gk;=lUoHEb`l!Dnxwll_-Sz*H@$RXwNxn;^ z?+jd=QQu?qp#Lbh&4pr&UIoiB2M%u5=sks_BAHw5ENggG;!Y0O)V9^6$vNxxqDuna z0xkmv1LY)eJpPg%=M%zTK={XS8&YxMFWv9S8%|gWuks)h=PzByNO7-D7FT+hs{Z_# zTvdmHwQdp?i+7IGbh$wIjYyqRd(stb(ln~D{R2Ze<#?q}BJ|cYd0E(0WB^)8-XjB& zoA#2kFZLT$S)ciLDt(8wJMcA~{IKBI6=nf(Vzt69P`2ni)9@=)c@8lz)u^4-9bWsm z%1w?<I|-D`z8a-n%Dzdqm<V3Dc=M=G6P=Eht~vkWtNO<eC2^&MHtzE1{&D3#)jvk# zoM``$#;!|nqb+ZA+ds}o%S>C`2UqLNmZdWLivAH0*`8wkETeDCO16F7H^ybWd+N_g zz9$=Yo@&@6R&70NZL{s8JT<7|l8xO;y#6Wcpuizu2snNn_fp_oo@t6nlgY08^U~wx z6ZU!H{Gz*f-Pl@6vtoSn*n9N274lVP2S&pyh=kqqoo(0`I+gebibcnMYQL()2XO34 z{0h1n4eLn1{d#`5*E1|CRU!1N>x2~=4b?qnJ~x^9^08#RPiMS4m9Z_c_Q>$U`^Z8D z4pbU4Xvtc%%GzjnhcDfAiNA8O9=BGp?akRSw@r4;ZIN+GQeiQ(rj2Ddv69M?`H!96 zz3J)E4Fj-=Jf@OSxu|bn=x70FD<AE{!M{iIjMX=aAb2!?CBxmoz`9HXxu}dJS*t75 z?cM*X(I5hBcgT(;aW?MWAUo}zV|*?6JNox$%ht1_)>thYDdSJDxrEUjxo;k?GNAub z2SDH}S3aKj57kyVGDRdl1p^J{dq~B1|BBBvmO_+^#qGBV#!_ke;EE(NX$<F4+3lhD zzj4<&#AWVW4nCX>FcL>a4t%@2h)Y#OS*<ee`a+t-n#O>RSc#(;sT{AQ22<;^)=wBo zH!_l{=Ck92@J04Ws+Kclo}<tVpM$t8(v~O*%RUMnVb1WmS}C;W49e48e+B{cBtm&G zTX_DMP;5`msD4R~$;P9{1oYH>dQ8CV`qMJAaM$<C^zhXE84t~EZ5m$&xizWY7ZGp| zJb8UKLG0~%$ydmXfrSwsM0j$RYXnp)&97<u#TT5L1w02l_8DvMz`Z=5i`xm`cmx+d z)8k&fw+Z_N;HA4sJd^NtoE~k0rx4bGw$HJr0-Aw`fd2)^w=+pAfIG(y%UoM&WX0%7 zY@LenKNpw)q=$_X?^;08(0F&hSI-`wFgQ|*50f24G=ti<u2S3xEyaB-7ZTc|)FW^r z+S$V$iow<4oaiX^O=40*qdxZUG8$f_QXFpDpP4uNM)b^BX5mV7T#=UPIXct#bf!<G zGKH(guMU4~g!6Uc{#{Q?bq8)ee%i%pX>V8EFj#a@6(|emL<{sIVoF=wWrQ!FZLtoc zh*)+=tQw;$_==b6H??izNq6}AF`jg$IT@ZR#lYiml)@w<NSiTShuy4G7Xyh%U0kJ6 zzX(S~Ha9t_bm0r_tsmz^E1u1QF(@+act3oO%@{<45M@^NJodjG5yjGm0#ac##&dCG z&?2?r4NaaZZ-dY2d+Y`$CjHL{i|Q;H8cSy6Ry*{&%$hUGa+a2c?-x_FjzZaaeUf>( zWX}z~*UI3s!J{&dPDbG#n}b}hUaL@sE#QoxlSPnGTdi2Q+oa+hi7k=YoE?u{I)ju= zIeq2hFWIYq067_$M$75It-;O1|F7`QWjsq?(SOJ8b4!nZ4so9Zo&#Pd{vu!=V5iaJ zKDYEVB;M~+aeCwv>2YpM%lB72uK*mpk=qsO$J>u9^L4d`iHV7}FJzQ&%bc&HBrMkR z^=i@UWG9UzP>|)vKEl#meAJvhPUSL^-gj78Q5Vgn;;LyjztS7y(1XehxKgUKE%uq( z7H2C*$)4SI3<)SUGa7_F2WSv`_Kti#BPWf;Ol56rIX%C}P|Eg@rlnGo&2mm^SD`8} z=c`YF_jLw785`sf3`tDn5)=dRk=9l{pD)!WwwfBr`Fub9*`Ck4ReB3JUQ6x8{UZ8Z zPjqRvGoOc4a+ePLtHPyQ^)v6PLM&g(82t()VsLN4kvU{FAxl_ewP)xc!&IL3D~fU1 z(8gI`av)XRZatw7v4d@sCw{I!9@wZAz=PB#HXmBJKQ>LyVLp?CZYxkK+vYe*QCVO4 zcNk$YA7-diS!t~SB~<Sutc=ZS+EyLnymH`m*v39!KF{|8{{}n;$hRC|GLQ%U69Eq} z1ULtv4bW}6>{r_<hL3u`TGz3})(AYpE(XQF*ur**B;a4;jwse!f^(v*w}qHeEjt6> zRQmO9=R21;Ss^psqq7R=tgcFB^%Zh?V4=#U%Y3IIIiJz<or^NwJ@uu@_vCy>Z!A-D z8+%(>+C1mEPU->p2*?As1-NGc19^tXJ?<$>k9UahPXYI(#Y;|*y3BJ<cz*iD+jeb1 zLNURow%$CdYHI_|iPn~*yW1H!?)>!oPG;;F_@2(JFrhN*NM-g_^~ExiJwLU#eQE8@ z#mO4cHFkQ&yQh9&@?BSv-u9KOBF2$Aa99mI2)Kb=)XiF4>ZeB@o*w5v2zwJy0od`V z*Av_Sm0YhY7eylaFGqhOQwt@e<;SMKC2XgUT8|r%<r207Zc3F{E}Wt3dR&>UK~(E; zr`Q@qXFaaXd>KvaNzTSDM~Z=c`652OTZ=7Vk$y=;`h&>XHvjvpv>9|<1DC%_dns4A zgh%5zo41-bQ>}LZ&A`uq-vL1&U1u$Ow|Wt2oAOVsFr}VS3LqKZw6)7u>7#8mrE~zF zqdv5y++GUrY<7878F#&=wqgbM<p?3e58?>_l#y=1lVV&NyAhcN8HAaWQWuxVaJS$| zF(Hl3N&6(N5tTK;WS*5d=-E=xJ#VJ^*w=KnrMW8GLLB7b5)!dCSueyEFg)rE1s7Ww z@@aeiBqE#~u>Pp%fW;mMCH&-UXBQYjB4gApFk3MlnAzR>uHBwG-cZ#jd&7!lZ`fcx zfYhi<1|$7QS*=XA>k>Y#M>fgVQ2EMxrL{>=KN5RWZ4u+pB_WnQ4rSLUBTh+4$0evl zmu+G;er7%~)J8Ffa_7qcf3_+UlWY+yXS!K9EYjP?oDr@@nU$temSknySVrcuZA^k_ z{8dh}b<D{Lkvpw(#b3AE^hwLB8P=~<^%E_Z`cWggjeBX=Ok^Wj3J*J!Y$kJ1sZm?W zQb9mf)(z5#G_boQWOtbkWo?p135`dn4Q86g_H3h&Ns&+xI#DiJMr=j&H`csis|AcT zmMGs_V>!`+&Ebopa&U8?*E-pL7B7~MFx#kyFZLv11M`h_vgJ$BEO3W2$%0lgd9(Y` zGq2h088&_<Il}`U)a`j0jy-041sgXS)RwsQ+42756*|f}YoVj;+fupHp~Bo=T3d5q z_u@90O#U2&jE&1W*{Ic}W1r_BRJ8mVka<NT^VC0p%(c>^K_+a^?J9Xs5mr2z#`!Zm zr3Mv}Qnz-r25`%a#+1;L5ly94zbF+dbaa5xum_Pjtx1%Sj%vE{ZA0ca+2fV`_M6Oa zveQd7HPumSFbx2=L-5!Ovt7O|9+z*K+vR%;_YRlK_XD7U_YHi18>r@a7~%dCcPkJE zz938lzXyQ=-~#;afmfc$-mWFYtpxmlijy=rICgJWA?bcX`fmUn8SE<sC<~_1-S6#6 zFUuE{=T>mK6n7lZ8>r^p52$p$Vs95`$@>NZX9F9E`v5Ql=x*F+JXd?WWIR&lqG-yK z`?>V;#OoRMAZe<>#+}k_7=8vUXFa`fv{wz`g*c*-^fExl)l6ik*$U4o##mJ^^RZKF zhk1v1sTtSC*qx%>5OWl@aZm+RTfBCdn`lGDvQ|-}CQ*@oD(*z-%{$G!#m+{r<e)BU z2YY7r(W@kynwjbBWoo82u*j>PXQ&kA&MTb{IG&jnNUcjsw#ZW}dLa-1(}4-VWx&4z z4ZvPN{CnCH_TQoJ2q{6#EhbAs-}~|ueFHcrKwml9#G&sn(ZJaB6?&!@U4oe#?27n6 z?HS`@47F#hl?s_Lyj5!Jq5pn8eC?I5sD~tp*U@r*1N<C#6gZ8N762dG{>R%-rt}5e z;lzx;Sl0DNy}`<UFIM*5>%~wiFctBsuqXR4TYgx(LooF&7y0Rxd?kn)s~@5<2t!xG z=oa)#NJVNEY^)aMXp5wOlR5BmTO{4-gb!@j4fEOH*i+4xr0-v}?|%iy)|kJ$EdEIH z!z22`k3?j+H|c9>-=I=iEoXSrU&3z$PQJYTn=())b=|^odDF`o)U0~(>CIzp&1)!= zz<8h!a1-DGh5;i1`Q}KdDf@9TVUK6CM~|a|*^l7JUsYn6)Yloe)KqzW?6#M|P6X+p z%P(QvTH9L*g}=eUSmR<gH<)56u1>ZS#Ri@^#=2Ix#OB0rgOnuD53iH)k_%~BIw&`N zWbgmNY(_1~P>xodidKi=NqqWbgtRMxZvZQR6WxCn+UvCqZAX1f7Se7;s6*J<cvdKz z&!SVan-<BMeP8yam6-j-5Z4hJq%A3p@AqGl^3p?-d((nf_Elv*2Pgcp5#9*a?0G6> zf7+!Rrxm!QQpitbCA&_3%0=I@fh`$8eUVU8%Ozu>eoJ=y%@C)@kUC6SXjx~#ekpLK zN?7cjN+MUt4e}*_LB7gzf6hvm+HmGx-#%EvQm+N^3(}*ofh<zpHHyp?i1MDu7DQpQ z*@yU$Zt19({V_J1EtgAuN~VN1Nwo<j1@}Kn@I$iUjBi-k=@LDpe6x-4FGxc0G@}2? zQ`58ptUDV-`Qcyg2~5B~W2|ZqCFX@qQ?V#S%glB(V;vTEC4phuqRTCf3eNA9>0IyF zz86_PqlD~D(-eg8S%OJfx0npnn3%FRt+ZZlU=yl4aSkAmKp4}o{Ux2h;ivbeF`sH{ z-rongqrm065%?kS8t;9m|5l#&16T0gpZBah<b*u6FU>w#%<IZ?$thzl+3zC<bbHHM ze^R#or4EKwWGIL*UF-0s8{vddN3PN^!uxqN*119**9EQ&b=+)(|E9jVL#^zXGQzL& z793+5Vc8(SB^tK3GE5rt9c`GD^8U379WcT_=fU3HmW<P+J}%Rj$T@M$<-sxEVTYU@ z%3Km0bF2Avz4c9DXjTQsTxZTr2ACEc^DT37@^y4@%rbM7-Vlc;b$CYb_UwRJq9YGc zMf)Z;l~_#nv_mdAo=VRxu=NWW_BA=N*b7u$OzoGegd5%DQ$6!49QMmi9=q8*g}rh4 z>ZvgKl<zzR{zL6}Ys#HGb!@BoMN@WDU!FDx?$_Q^ZF>;3saoRb8(Wde58viymEZl1 zIL@{?E3waT`91*N0`mA$0w9+qx6G*rwQ{ES&3X7fN5Z5VugcCjJjBnjX@MTe{c_lr zusjtQ%7(cTY^&))L)bSrkYR+DAUo$iaCXks$ksWvrN^NsN{K_q$a|Qaiv9Eh&nM~0 ze*VTQ`zd*(0*4VP{(=Z4n?>krv(}ewVvEmtd>I9d2F3%FQ<u#7)n#x?8It)s<4d}} z$j-k=@@M_tK&)FywGPB;kBncj)+5rT^eKT_Wxl8P7qekbpGTOUUXd=(=B;*la+VKa z$gk|L1uIJ9iT7sHQ{>y8h?vh<b3BvSY&6GX{+U@0li1vHeDTSJzD~L#c@EL(E|YX^ z$&)nV&oEBqk@x{<&<V(MG2jB6@iwV1TNoUh#jpWsg5Pyv-u@I%D!0HyWs*k^H`%o( zOXo6u^)}6P#S+g+hT5?GrU9x}uEY_Wysr^g%P!BR4BKbhQj1cgQI@WT?Vw=3AlaLu z4MBR^AU<c~Gr=r{OG$k%LVT9-ptdbt)wW2K0cvlW&v_&`Va0b8IBlTJuK^zbUjSQx zbRAlzVls8?gj)4A8Z2^@ZJ|jL&@>bYI=4t&7AkA^-w}xVTvo^}oM2iNQ)3MWOp4}2 z8@ms1^hx8L_GTwKQ|Nkuo#?MsqDn8g5C-xv36gFzjv|ZsoYIgf-A-VCQ<g?+raPH} zJNAuK3b2G=i%wxJj<$CP59YM|?u0f=@qV|9D}I~syAF34PzH!!a_UK6O1E{FZxS}0 zU38~^%(QpEAvikAyv|rR-PMD+y9gm@ttRLo-P*g`K~6H(l`}GZmBG8VRgzjgV!h33 zz80&S1~<H1WwK#znj9h}D^%2PU$!J+dp>kC8U;L^rR0+lW#B@w!K%G)$1&E(-X+KA z{Wuoy@4`LB-kSSbWI<Z-J93srB`HY#=j%*=xyfb`tS0Cqfr6YCF0H_Wla?Xcq2pwD zvy-9uW809tt?W}}ymBF5lGfbH69vn~$9STwIXA--`|%>{MOG_EA-#yTd%N%nDHGdZ z*xC7q2~E9dkD8RT6e*F8yp$^T(njGH+Ti^vU6^tlF?fH76vW{Dh}r7kDfaG-w!Qm@ z%HCZ~LA1U5PA7a|dvIcwxoPxbm$@ERtj=-Zo3?frV|R`0_Ys^hcK?P(^g)R;D|jbd zWvWPU$UsFZlGwUy0@aW0N}Sal6j(w#mhLJbc29f6Kh4lxbhJr3_qOlRK7I)NJMhjx zm+uLnjpy!kBEo~j#{IfMF5hi{1w0JQCj30y(}6WQZjUzZKj-`Bgv-Mn1e^&R;Jpj4 zOWL@1wQrXWS&WhU*n1ndrJJ{Z*u8nX8b6h~234ch-!M*fYu^r|)8_5YD8gu{Sm>WO zNV~wm{WZ-$uNvy`IorTpjZDw*k%6Fl`*s;72CHGBd-L}1Nh4Jw%712XaR-G<Gz$L* z?AtR2Q^oWdycHQ9Z&PGY2JR0)0{VJ`P$I*?{aMul9X$$z$%z`cZyUn;5b&A}y>K4^ z9tT<g`F1tX49p<ge!%&_IA9QP;`Z(Hn}#C!IhD)=Js(j41NWELQ$8gX8+XZe8+d3% zvErfU;Bem|9MCaxw|ca}Y&dFHB^K^~<<ZGZkrEA@o!K|iGSl0YgF%&9_}a|Oo}!!e zoY}ojX6BDGta$5^YoL0K^rnn=PyIE?cWHGy1D80h&OuYvcuT8LgkfHrxc^2Y_#lpo zWj^;6ChiZP<nlcRv;e0A9n{lsVjqvUq{rD#oI=9?0QVb!9k)mO_FTeBcomLJoIhtS zATlL|t#JygWJMZ)D(sFHY2IB7+?hY6%Rkhg3j1pnwi^TYmk@l8Z{VJ3-+rA+{$zyZ zakhcGoSh>E?(ExVz;%$jL}fU{9IdPC>~68@XJeIa-o8^=vh{4<-i>{GX8%BxwwvtZ z&!qZ?HgIpeXqf6BMK~wiKejkc77GH|Pic2X)$mwGwKJQNmYHqfev`^9T$!2KQ^)Ba zoH;A4+x%%p-?%*4_I2OzXS{pr%aZTP;zQj#6B(>5;ILT3z<rG9MKDiO2JT3ye6tcy zox+?2coR4TOaY33zMxA}Oqy?WwQo<4x0mq02g2RO>tgre%#UP#r)0*$DsA7+N$70x zLk6_>4|LD$-hVn(nQN#KnBCgpsxt4xNvq7`(HGlK@@Y5u5leSDcuWZHSh_F4Kcjk6 z?C*wT_RHm#`MoOZ@GF^FKY5(0MePHN7S)reb(J-kF0VpB@7?USlk9y;x_P?6`wL?5 zzL{|=r6EQQC`LYFpKGW0Ah|i|3EL2RcWJ7z2TAW3gLgRxO$^@Gi^02EPfubgYC6)y z;JrxAzs1CSVp`%E40s}mWAOfM$Kc&t3P~J;_kST)n!&p|G&IBDeI@~9%Kk&jR!E+6 zqp}9@Y%H%+wO=uM|967Wf{Fwy^hJg3-xAEF4z+qMy~s&s^xG#1V_Uw9@J-tp2Vz*M zoP(oc2fov7%<rg}qIgQ0zAw`;XW{5p$2!^xn!d}%0T2xjL3ox4Cprkn^j#|=(=FY* zGkt%Wh{RHh>ULCR`krbCw(0wQ#{|@-@0kJr+ota#9e${!!*`OV?wq89Qa||$nRzwB zqLrpP<)AQ?IhOBM;-S-!+kt0+hf7?(_kq<s50+>6PZSp()T8bD>xBITaMS-J-nE3c z<7BEG((Z03C#(ZcoQj?oSOqi#{|3mnQ%URFxHIgq%)OO{%dveQjQ<E=43HkSk$5$L zq@nTd*)CSwzp+J}P5=9n*6%%yVV|(y)RFNXhCR`AA3Rev-4!@#Z11?dr{Nn!rSWO| zcd@rtY>qkQOj*aU4M^>g?2fc7&(&G((OIrlSt^kdE*q~F<M-Y=Wykpa=Hn!MT3W)d z=x$gzLY1X6l`!Q{SoJJI{)DK~kuZI~gvRCAo7;8{vLzia)kTt~?>8Ld$uxX!hNnsq z(|0XDb)k%sp}zj7R8@$wfvUJtqdyWy#W&YG*mPkHJ(p%Hl_Bh|s+tt$&5iw4*}wag z&3V$I9U7-B+Iv%IHGyl!S302){ytC1z@GHLZ!z>|a5hKNc>fwogZ=wpv45W-cI*pc zla%?pTqDA%7L&#N{rsf)do>;lVurGQ*Vg$->-U-6S-&^OPIvi^0R7K!`KD682XGhS z=Hd4y%=6nkOJC{9_B}oRnZ$h(cn)}#_%*;4fSpE<w(sd_NW9;q;`GQT(&KzHE#F6Z zz725j?#cFD$u|s7J{H@LZ|^RGIt^{Ii~8qCIa%~7kP-UO6N+VenZj2acZoVkX0B&5 zlA=~o7FSziYcM@mh5&7hg0iJ*E*hkFdbD@9=LBm0ptMJ1^Fy+6l-t6gQ}*qW4@ssh z;CV?mco+76m8cHPdFo5x1M%sn287;rQYmwHZ2j5qR-ZC=SN8Ar_Vs?U6+rH|RomB< zk;x7*cb9WctS_QVJ<;!qxqCXPgj+dfc<~Ra49k}=25*2u5b7};v3FkpA{j>LGPA!@ z>&rz8_N+TTA>G~`J=n9Jcp2vH8%3KnDEM7>t?9%3{ZH7vXPLRd@8*cLySk&AQe*Zm z*6v@E;SHfK-LPK2BgoiR|5jqzS=cuLTVWJ?fC`?2z`ejjfPDKq{-baY0_RhP{kVC! z#Q?;htMqK|-qYyu*yE5#Gz1vDA0!P});Z@Wj_boY;n73Z8>OPLc!xjsF#mC~LQ=Y0 zWfi<$Wfh*Dnbq;+^MEkHW9C1Tlk*!r|G6;Z-BW*B@?Fn=L=u)c4&H;3k9yjJeEd`y z^B&+$;1Dnk7z*ToCPePh-aS3uUc&z#2&ctMPMEsPdycht@2R%3|Ce1`NrU&s=g(EO z^#sld*Or{8q-*PV^VRzwvolK>ynD`59VnKW*>UUZ@??EwSiEQMNpPp_Nst=!)EA~| zY|&aVch}XGtfOy(!b;$7;P2GSX5hCxQ$IcO?esW5C+s5NV!)2~kK4OXvhCf|d8ada zR{xjq9c}Ple7>q9500o7%OS}z>vaD!2Jbc|^JHZMgLfsByzqOeN42u`3QX`Kg-rMy z9LM6FHvea8_9kEza5wN%;AS9Qhb=bm2l0DG`KMNzQcrpYFXNjsVfVjkk8fxbnBt|M zzk>L1j!!jnWr>*7U9tvb3z>ry+G6m|5Enyafi>;BND=Zu9ATlA5VFcTqD|g!P$~>= zma8E*7`qIE@=+PR&q(_y4f0iXdMy&8cXpMg*PgS)_>=#1I@<Ef$+z@km2V-AJ=tZ> zDfaF<H$i0q(oa>apE7snZay0cnd}^`QO53(erm0hDUPzDh5%TozrYPBYT8p1Ia}Gj z>s^Vj1}eHmD_fzZZbV60y_2AA^=_vbP*(4+nokLhRCek++1IIwdKJj4^U*L9REVlz zkVT9(&!Deq0;-8xjk0(b+%?&_r%>Cx*S5)se!d#x&yr=)XPI6@Wm(J^!pJBWrP%3u zB;C`}(ydYU?kR%US&PkkMm}Qko~j_FMsSvEJO15n)ZCu3RZT&HSE@=1mrErn&4(nr zwp4gWlJs^?V)&j>NHKa(g%W(_bO5Kq>{w#!o)Jsz+*Pa;T}Ns=cSTowrY+lpg=!Fo z(j=MmS}|_ddhl_F(~p&TS{u4QqYT~8*WrU=>~0-w{gj>an+W_2vx}@9ABM--w(pyH zf5x$We>G5_F$Ak6PPHDe{&#k>hNUk<0RTIAP*ZIgP7*bpThB9+tH}+TXzTZcSidK* zepmU^vqBaIAy~iHwu#E+el#<J%`?jMoh1sV8tra=zJpTH@^zr|ibm(De*~RhiSh?@ zLiQm6KjJ+_aPed=w<^O^8i+zus?Uzr07)~Wu{=97BbrL9eo-n^D1nXp8H7n|aV2)E zP~Y-1ziIn-8o9*#1PMJY-YIrG?WOGBYui4BO`mZAwiBaVzN;?8mI!zGNO&}G9`AqT z`^&&2o(B-_N4T4SZvpLuxdXqufh^!8{O*Buo{0T>HF3*<bAhD*xY?FG$J)R5Cf)Z* z|7D;9P<b5B{ynWMU+{b@I9-f87VrYqy!!!_?^oHs6K)`IHn4%XKL(}&-N^wIAZh>J zb-%HULIsXJRCgo7UB8yDlQe)o=TbEycyYuQDrEq_!<2K(Il{p<Ip@+1)DS;_esEt= z@5vReSAR%iiu=k?r2@-ri1l2xlD(K<nAF&NiSd=mH`A*;v=;PQ*-+daitqi3R2?gL z2M4i&S1I>bIjNNUDf>OtZ0LkRR9ouTwAEjN^%^h(m<Ut=4*?P2Z-DrBXY=0OeD*8p zd8r_qGI(DxTG8_=oMY*ki6->;IE|KlKS<J&FFVq{?C)aXzNki7xbHH5pCpC7(?AhO z#IkOQ>~Jh4P2Ks+G$K2QX(H>Yv`ySO*Z99^96tf>0qz4l6z&t;Er9qR&&J(Z3lUe* zH{IU-<4k+^X~-lQ_U`G8qsW#5H~m8J)&}ou$0$M6Sp7p92c_1+=w_5UNJM(ucb#oE z_MuFGzhj$?z3zk!yds1DRtEo5&1aLI&xq$5JZsFyro?}p^#8T^|6EB54<tQ*Af6FC zCzv7a8U8qM^6d6oY2PUYHY7!Y>A}eTrxZirY~U!gt;YR3t`GNQK)wn6zS6#Z5a#W3 zTwUzjfApv{P{d|!-~PZ@X`taooc~?+?KhJ4NMH(Z6(B5^3X;F$-mh{(_U)%&-abd} zUFpfb{a61c<<<7>yOi=WIC8uyvlmC~+gtHXH(wX|4(sXvuh_T03!N#_KV#o68%VT$ z`~5uG_U&R<E%xnWFwwZ!wr@XIXs4_Q2V&_yt|Wj-`(|Os%-cAq!P_*)9UJ&a52o!S zWioS&k^NBRo85zHdne;YSJU>GS^|=b+r+fpO1wCZJ!gLSJa8-U1n)865uRTG&gc1K z;CQy}ieGhO-~Itaz`p(W$_dL_dvFZ4uZMXz)=hGWd3&`oZx>}I*C*I^>~fNR@OBsW z?Js5cw`qS2++~F}6<!XACOj7IkMQJJxI3vu^;b;XLus+h+llcV^HwJn^G4p2M(&`A zCi8aJb>_Tefa$y|BX^y!Ihyxn=7o-xyRhHWgSWc_<}iuP1_mi$&qnTwzbiX#W!2T} z2=9(9hb<}RJR}`dRvMSjla+;uYQ!wZQ6}!Yzrw`*w{njul7m>bZ#6$}!uVaR-2?a9 z{<+$uwMtY6V^tG$#eVSfWR_ymx<X|cUWSw0ql4~X#{|YSpcVKS$l*KkSC4k?9}?yw z36pNP+KrvNv?ck2K1q9br7Z{y!QA~6q3w{-lU$~pL}XjLf9P1dr{5DJ^p$u?d-wG5 z(V6l8`e(_aioyHzaz)+IIE+s5=S3*NK-v>uZyUT*?qPf^1<nG_11PgCBijxI<WJeW z>yqf-BtBj2kyU*=_zV_&jx~VaAqMd2iD~*c=L-ZDDSN*z_VDTDb>x9RJ!qF#8^m8b zNef<-wkL!5wOtM3Pj#eFB_KIAb&Dk7G>iCk%|l7s3-kfx`COns;1q+Kdi0Kqao5%5 zj{EMN*`7Vz%~Z$T9pAmv9c<mhmW<vs&Nu8U$z;2z6IHpGHh3Oe$9(4x4<r)!FdlLq zo;xzD)Dz{X#Cg!W5D)L%dHfd5txQyogVh%CZE$EqA=lycLhKP1XsoL!b<0CW^3R9l zme#?`Syc#5pR7j2avX(?T;$Yz32);7Y0gPqn7;8ywQ4m!%RVwW2lVgOZd2{oTvWSB zH4nYlO>zaHA@ibaW~v0w63{PPz(eue>Im20B&r4J62hFLk(N`8<7}yul^BJfao5>e z5#pPohix2XkKtZkL8?O}Ro`3^D3PNH7w}L#FPStM5=JGxSsjp^k@RwUf8$7%Y;*(; z_bLy9s>PInEMc_pbCwrn6k!aDjQod6Vl>=BbX|~+gwb$4Z=sIy9BHcQE}W-Q7il^U zrHMZj85O@aGRp2h|Bdo(QKX|aL?@}bC6DH1Dv$e@;Dip2H)VCG*na_=!MKIRzRXWb zNN#kmO|c)zh`PaRZH~Rk6PC_HoiBCCFYDD8^MlaA(*lK|gJ%Y0XIZIz0ic~&(`zE+ zN|KQaVv~qqtb2n`{<gq0yL=3eb+G;Kt{fifm?TeEuN)HU7%5L<R<c3nJZ{D9I9K*i zE;i40kT`(iK_$a{w7NpFb?+3jqO_`-1uFXXK|#ez?4b=GsOY&J%l8W}>-qbi`1bqb zd~e}f|Kp_Z^t#Yq*&bJ<Ou$C6&9?)sKdl__0fpAIifExXTJSw8=9~k&qs5bHxg#o7 zd*-RAaz4MMbf3|&?<peq#Ag0d8Y*Le538<*GI^$ZEm`)G%Qv^GI#FF5+CV5%HUyU9 zt|aM^&JB*7H7CvbBC0r7@QQfDALEV)xFfT($aRGD*<#7RXr9VC*4xR}lzU!A5O}0a zVqA>BDlvtIIYeh>gvAg`raX2hA~(TpMJ8@~KMW-(!rXFGtVpfyvH)y1js7$ZWA$X! zb*?t<5o2GH9|z9a+|652S{`nJ1C8LElxY?08Q4CLQbRs+ngvP`S6VrQN2+pgrpqLi zjUu4jzU2^b4wE!URJf!8Bqb@EfJQ@$gi=J**LDzNg!P?@CCvo1HkLgL62+AZk`cIK zu%fgAEYIJ>{x*!i&IG?D_etPwWt-=w1-#l0n5(&_BEkTDYjvy!mo$c@_<{PoU!CjX zjg3>E%^25tHr$7l+)d?DKamk~NWQ8csjp<uP?bNDI3uJE#Vk+4IBiv2Fq7j}S3gPt z#s~SSSKB)qU8+Xg#%FOxef>$0+RK$<hjL3NasgLCuyK;Bv7b7(kPsBU{wya%0XHf& z_ETZGkV%3EC3tq@T$egMRKoYms=w3;-=7<!boc_o%f(G|UB|?BH_pvoD~2DLcMl5w zYgeGZNGlQL@m9)@)fk{s<|dk#NxRzM{VjF|iGW<ECCOuu(4^GTJm-Yo?G-J2&f08w z?iclS6*_AB7?<H2yA0RrzPl4m|4CZH|7`kZxwX0Vpm){5w;{%zgH|2nYPYQVGOhwG zX=;3G1JnC0@xoOH6Zo2a#~;NF^c|lNr&qY8P71H9RVb(bs0Vd(U4b<v%in4=G!m5t z7$_|kdA`tEz|vK|v995s6-?*R)s#k8tH()jnz7bBLSx0Z=FLs~*rs%4?AMG0Wv4)N zf7_jxsw9RQYp(In5)meP<$xpcUS+57sdzGX%vgh(hBOYf22GwcJu=ArjH)XhGbPLX zK6>g}>Q$}9DZzQnd4Vbs5N*Whr(@jQn8E1R?*^-(dIgx=08*z~cd3f6)cC0H+_^Uv zR)J)de<bdj6zOXXxFM1qa%Yb@&s@Xd5t5PpH&-$&`13Mo$x>6<3+tp%O@*#TU-=yK zz^E2Y=HS8NK%a&!fjr1pIL5QeoKUVhPu-sCs5+i>)R!UxMV}U`&8PnrTg8uu4kygw zjTPt3a^0}Wl}K#t<=QySmDOHG26FD#!nW`m^{0dmcN(kz4X?-CXSX#Hcw?_Df@9X} z=4aL6pj7w;O(Ci5am4{Pp$EMFw~X+2_!@pgM{qT=y(#BOsrMTqL)yh4&T4Dz@Q#0* zCmD(EoIhSQoUcQ#e4Q5QELa7@M3}i}IB8j1=><wVvg2I}$@)q}t@)5n4wn(isYZqR zRHF-|NQ2^6j3;iE`Q)m@s@ZvUV&?ynuTp|!f#c(y^qx{@AXx=!9ccJ-2VNVxCHT(K zU~6&Xtn+3?t6lTv$7(^Tu@{Y^gzCE?Qe<tO%4~_F8&@3_o(qwSjMWbcUnB^_gop)E zssBh=DlRZ(t#1ZO;P5QvRjGcj<ag~d<$aa%5L4Yq_*(JauDnHxi-hGe=15qsUB+Z= z)0A=LGg+RPQoaWVy~Dybd{wnMO-H%m1ovp?LW#Edqgtx0gjE>!eMSThm(%-u3kEd} zot!a62p*RC!eN;&wC!Pf+lvj1yV-J39_q-gdq#G{I+q!e!(9I+r4p28T4d(csyn;6 z9z|$cW!*e0I^E@e(Y%h=!loHBf(PA=vr7BcaeHUZ$_noFTy;>+8objNI3v6zz`ecW z0_U~=mJ+TyDEnlL)jw0uQj^9#>P&HBgHB%Pu*+x&@=>c<7q&I!H5EzHqqa1~8?Pxf znyxAB+q4zdLpsJiA4viYf8ux5!K`uA!#7qPe3G1vu(UfmaS;icWrC%#ZpI8QCvK2N z7dq%M8iuL|?#Jw>9^6KQmxt(dxvXhbaLhACxPvsfJ2WyS%bMrqINI8^eeuym(53bS zD6tz}pmQ=Bo|SB87A~l+oEzzzDEtW`6Ei}{Hd785FFMv==(lhNTCYCIG*+o>vsJdf z^lTv>6bn=~%_=n@)|pQE@}+#i+h^o(vE@wPF?lq+Apy;EAw^(Bx5y=tINeFI*ddu! z&~!|K?0r?p6{aJX(K;C~n_JmXnDV6G$cnQ^X>Vj;^DWJq`<D?k+1R~sal{36ZDle- zH{o4&`0Kh0uhNZuAVOtFVzH^lU$SeQBzJv!Ba>!ra+O!ouO@kxDd(aVCf5;fa+q4R zSC%%btS3rW<5pWwl|FzQU0o_WtYt!2AQEh$aJA}aL+Qi#R#qjd##s%eVq_=N%}wTL zO6Xm?7RgK^aMVd`3b%zIb@dCatjIQdFXlM0RU0IuHf-_>VwY-k`M`YL{$P2+LY2kN zyG;>FAu@6)Jf1`OU_x_wE0Jk?m)BzXS~_>$l0B3&_Np=}9ntpu+LD$NsE-P%50{e6 zPpCdr_?MLY+a<iNk1F}pQ+;fotLh_bo;d%9>f?`C-u7G{zZO}!Bhj@!q?G@BeJrD# zu_<b~jryRHq(2l;fm)87JFhbK;Q{Fh%p?N6HU`BSd2q4^iD**LG$)(2gi$TQgDa}d zD_E+S8a(I^d|UQY8SA!0=WY)jx@7t3#+tuebERlEo}Pu%y2sOdeO#Pqg?CGw>wV?n zw^}^D$xg#;iI0$^hR1u^^8-oG6O2|&+O9)Rc0zv8on%;wWH|g7$*`Z640|cbkUgxj zS3}My`tyAD1_E1v?EnR}|D5G>r5MW86Q;lE4Sq>pArC^wrkR|7;hA4Gs-<B|wOK2d z$6UqflISMkmcFK;!NdMQfJYQUTRCHCOCoyn_Rvv9v31Q06vcu#La~iKP^|91u=tUI z5)0#0qQf#0O()v~QH<{R=SZf`b&6A!p96=1Y>;#)mNGf`$7p7^Cl6OWYjQ0Mu5<~# zR1>2-eW-BNx@ZZSSgGc<wn`D}H#o;@UUiSl1&CBR?K3zbE14umBG^f0l4@gieD^;` zs<!4La2f`T0L};gyL4J$?XBjL?E-7I&#L!Yt=3EKjsByzdHo&6_v(-n4s1f=&N2&I z+p|OOx<d!Ox19CGFS&Gl+*Jr+oBkpnL+zeh3PO9_?#--;R#pqiqO<tijJuuJ=4<&` z4Lk-6f2k?Au~*YnSK~BS)6{H|ZJb7DmjlHm@#m9?(|?j-RVbGnAcZ|Op?;MN)vUvW zHo64CO&nw4y`?evl{7|yNC{8`_y8}E1$2PRKESHD`@KlTJ@4VhaAUZ8arffx!`+9w zA9p`)2W|&$CvIodBMV4b?tShKhZ+ef^p(K1Kmf3&co!|+($*{`PJh;=w|&4dgCdZ_ z2^$Su&>5{8(`na1X{rwT9Qopxo#eZFA-N<DyauHkc_b~TP7dliDU&*R6I=)(ft&a8 z?BiiHz-r_0ml~&Wq`RWtr;2)yrzI`8*<n(3#p&&zs#<7F3)!3&juKEpyUsW*{!^)0 z<9k);iPB<__G)mr4|ovx1@Irh6TnlzivYAPhSr=9aW@LTdr-*TjbL&QdbGPy{@o+r z3vdf?y||n~cDD!DlUX;KMlsUc2V`B%9%{g$F?d6Pw7O95ls2s%bQtZIQFluVmh66s z(e41|d6wx7e;K$cG(M1>?Q@&uOFgj&s+5JHZ**o=#SX}0WXgLCd3jZpu>oj-7A_3U z?o7mbOAo4lFUveRVS3~FMEe=jorP^xOS2LeFC(qQz^uo}V;gz2EiGIUlMKHv8P;>@ zGgnmhO_)enXfYSIH_&0}%bc56P#s$gy%)C2Jl4j^2%pDGr1rhg(LKgppOG(_y)T(X zYCEfAS85dZ_}h$zU+~d?@wMc>d{$L;Wo$GDNh7*~eNLqQz4+*=SPo|=OMy^LpKVR+ zoF19-rhnrt+1AF&>V)}TYytL%)iD=IMyBi`fzx;jZ73R3`<{6@=;e<3a%zMd&o&yN z5BBj;HQy<#m$K?)hj)|gQOZsFdtxtxHnOOq;1wV{rgo2c8VS2eIF)L3GFgvK))Iux zYsZ}YABUxjR>gimf(y~th2Lk+8=o@j4Pk}#UI;Uo`|K8?AA?xS2iYlCWhO{c1MQ^x zRK=$0q|E0>wZu-v8nlhp(IJ)f8qAs2;k1nNY{H&FCf}4ybPIU`+hifAD$*#51g@wP zhKIj2T~l>jS0GoHEv;<`y<(4(LmOF;;<c#t7PfIppJ&hV(-MJFPt2qpgj*JxgT^pH z2>6uWPr*<8-a><wxLAmRw>S2zG?|5Mj0x5h?$2;l8R0!(vi3fHV%evH)BdVWx$>46 zSV+dAOTS3k+#Fw|&l99#P4zt5B5sv8GH`=D+*YvagT$Rw*1_z^#cS~i6s+2o6{KCL zx7Iyg_xh!-N1x(L>=GI=Sm^`sVuOn0&CHK2!@K<jLE)2OlCzJTA6-G)j6H>!<f9db zi2B1J61eWXSTDSID2Z)7Nj(f+niX5jo&hOs??g^Hf!lu|X)We^?5CLV#(z#O=ZsOG zR^FKCBSFUG>;oY)C-yZ0#4eJc%jD^O3LCFtf09|TMCMORU9m-=Y3&Ptxo~0NoT|jd z&7VWdfmxkGoT@-!tcqw069WstIW)(Uh~&lx$DU=juy9mMoT~%fR9aT7lZ_{Mlt;hO zxu|x1K^85?`!c0^h<P~Pv<jN#sD%H3Suke2;Ab@af!rhYo&J3+^&HJMFL<O5g7`ND z3KFKT3Qm&PPOLHY?->nYLfW3O(`e<=yEX-Gv1)zuC1C7>66vHc1((^Exn2HzI+!=s z!Q|6_KoWPGXX$|N;{~bQZ~zhx3~;i{SD#ge(s*gN@uAj~y_VO?tDGCViR5Wh);D7E zk-m{bp(x`cvnU5`EYOEE`-a9>@`{!%_6p5Rwb3hyxI{E3iGkNLF(Hl6cxhwVW}nb_ zX=FLKAkvk$Ep=Z-H>GiVmS!3EwJedd`709xi&gu4R5)nh>=-9~FynDQD$LnDWl0Be zOY9`w+)TsaJw-&JLr9`dXT5R$s5i!(d=;@4Smz2KUOA=8y7(I2tF7@RQmGpYmSmNK zX%_h=E=lZKB8?l~&12#=P_h$$HMFttGQUcxZrkET36)0bYi&(B5^Yu0qrQCRDk0Fg zzu!dRUFIoK&)=8u6dAqbVOVcsWN1@S>@!G2!(JFDm>N1-TK6)TGxG?Qs*tpt_-FI2 zlS{#}YMsQbwkCuVfdQeF9;jZO*ijwx%c{s3u%M0JRYx0Xx^-`=kc+Kc8L1?s>8?!d zNPYhRMVjId-o!=EN}`E@Bgmk(ZK-!jk+j)30~)L-dXYi`>YZZVva~4nBWd%T`gPds z6MGi4H)S!TWW^^g&5wPJ2N{A0sS8&fD<Z@~__8^?I`(6>xW;~vjIuNlowBbowha$P zB+58AG9lipI<|~pdPL15Jtz@-5KP)gf3|Qn8|kX3#yW(UKA<u-&E}2XrTt?6Li1io zwGBLn@}R<AQch=2*3dv<wBeRVrRq(Ws0Tfv)34+uD|EUvkE}<p=a<FFJ~C=<%2~oM z4Kb^{?GgDLEeJj$QKJQo@&3%=JY|&yTw6n%xg{^uQs{5J<s(`igbnTWS+l*?B$ST~ z;?~i!+ZiQ0TR%0d7jN9+p~Xg5yDC5|GJBuZcgB~kuE^|8BfN_b^P|NVSOX#p_FGk* zkp&&rg8g5vcSULo%s}fQ&&<%FiMP3zPQ2Q>+~dF8YfcUwDtQw0g0~K_p4$<R&dT;2 z*m3GLYb%cCnZrTg)FJWW=*&IIFAuKWKxjVZ%EyHstG2+J@3m??*6dFA?ER6eJ=TH( zi(eFo^S$82p=jy3)^>#c1~U7N@I9ncW_DP$9j%8wOD8h;U%try)@|9=TkhE%I+lMY z3E;ES|9W7NHM_vN+2g<2Yx+ZnOV%lz2U}Zrd~#stsR8hv<@TVL1gQ(+L!+1PQT|V8 zY~_=}_h!%}6|XhJ!)cB>MQesPGRF&%<8G_g8>-)*WqSRu8x28nux9Uz7QAFFB(yiO z$P*#{9Dcq0`saAfYnvcf<80$-D^zUc`PS2e^#&_M)^m!cJL2GzH$*)v>Q=0+$SaDU zr2_dNYg(v<9^U^VrP}dPv_avWhj7{%$&FNu?6lCUd5!P^zCR+3O$OXI1;IWy@n&5t z97wUB)^`l|^nxda_spN0*r~s(D0bR;m0tB~mHYI^&@URLN_D#U9-V%f4lvypy#2B) zRMgjcjw+wf3U9)^aXwvPSwUi_@=7d2t?6(qVT-DfTLV=S_h6=zZEaQo%Qi=6_1il) zI=ygiWvrR);Yiwa+e9Df6#g73(`}y6x4ea_cc?x@h)2agGG5BaqQDm2g{(f(r>YqS zTg{826_HAEsnmS5+CfFcJjO7_1&-#@eNgpSjb0x?uWHGLN%U*4juK^Ne$lFg>fQcL zk*Pk38^3I+XGvCx&D5(C14pW4BU1~^{)yXs$=syi@$I2G-b7?VWThvOBZac2`a<3W z3ed&Uo#)P_DOi)dECJpO?r+51FYUQ3+){tgYP+#Tb?1hW(w*rDQ#!7WlzSuPo=}T- zrn!Hq$2zRWvepj`_w5WaRIQB)e9?=-q5Wr6U-ZXW%aGL%MHX}}zs!2B?8Vmhg6K5g zq|o$^M5uAE3>DGlPMnAjmrH~<m3Quw*GkW(V2lTO$&oR0hPl;RK#S|h=>VbV6$O#$ zp2#F`bS4idmOY{Ce_oL_Dlskc)X$~iG)=v%Y4g$6h8F6pan5C?J8y+YwKe+YM+aU$ zwbE;GyhqIz&D78@2vdU$Cc_YG;=9V`!q^74eq>nBbzyA#tt&d27R>N}CX-)lSY)=3 z(ZRTT0cd^M<}$)lcyPbQ3jRHQp5Q>O2R$=F2PZ~mcifh{bmBr>Yq7__*lS+KVbPk+ z4V6yW5uN2ye6Cse+!?|(hQx=3TH$l4j}JCW@zPk`6<$({!1Fjt`%Z7<b}zb;vTd%} zouT^9EaUE9656WogsZeBJXeGg6Qi>(=oDVN*s9$hEj}En^}#14eyuOE&>OkjBaG#8 zFTehUUbDJsRxg;z0GLSvX41=ZYjLoCfH0F6)7Zq2Xhm~{^<un4ee*@H=)yx96w-J* z-Q6ercy?#B;=;~|H!{oB37cC`5S{9ZOh$ikVMqHoNH?mbeKd{{JzwZpTX2@?<BG?~ z<(<)MMs-qCtw%j`LPsYuh~OthTJ+_VPAVWMMK(L_&*}rj@n0e1%F*PwvW?Lrkn7O9 zZ)#kbqsA5W<rrc!u0ZeQisy2w_!WxnnoOuWBT0O8hO_ra3qG@M7g9#<Q1rc=U#~sD zLDpQGM<0c(xr(fcM{j!u?1MW#6&^iCk#(Dpm2VV&Puj=ZJyDyibJEB<#TRi$DvCOl ztmQQCLJ~`3fuYvHp?CJpXN;z0R>5PcX`Us~ao<B?ukRh&me}!0Xm&>;-iM|~M;`U% zju_ql5s@IQ-4S!Y|Lu4o<*@w2XLk%g+WSSbcc`t<U)vd}_1^L!E{E~H9`BbCB40x6 zmH;vTZcJM!W8`F&;AK9GGd>eAh(MvWTD23auDQZV`Vvcd4PVe9^U&z@3hRR5=KkJ0 zEpxv)*t)lYg!q=2(iv*?SYyCuSD;<^#Ie10R&&Lu#PDtAx9nWVVQI<Y_@dAq-YiuD zumky9K9v%jK?(BImlWpv{JYJ*F@wbkYj^k!LI;ZG$Nt3YLhEv0#ARLP3yn?~;ZlS) zTJCpgvoF0fExZM0I(xr$<w1{?UxrllnbT@#cdV2q>px&L$g$bhOpkx2*Sv;qraD&r z8P<!^?@_UhrjbT!_YS|Nu_6K-HOx`g?7fHur}mDYL#NWgR;vM1hdy=4QG*y<*H{ZX z*n8^bTzR6zhz|1cTHp0VZugL(^<Ci?MnhCOOtQhw^hO9UR{})ldTqQG=?2>yKA;<H z{qSIYZwRMaq_u6wr+I!W)pk4c>KZFVq##J2RJ+Z)LnN~3QySGddz8Gi<CDBg;cu)^ z_m1R8X7v+Z0E;yDxnGj*j@O0s_Wf4h@RsQ9uE+#)sQ+Xcfw}x(cBfy78koguX&0Y} zH#%813vZD{n<Wk3a`~=*gz{xo%36=QLgA)TU)i4dSnEych<qbfi8!-q3X5$r_v}D= zzy47P-iDNQeWZ^(E|k>fwpCqr;mE5l8#z*m!3>$zG&A_Y6z_p@5BeTfyZ@bE(y-`+ zQ#zxhep#n=Yk_r#cYf?fCfaPH>)jH#BXl$osE-!hW}yq@ePPvt=)d?zy)kObsFz25 zIVzFZUb~2N`7&|EbQO0Z3IgI1s%m~LpkA;kylp9`9o^%N9l*o#+!MJBMdLl_+*0Wf zS+cq4p7`puQjYj=5pSk@^m1!_pyazWF+X;yPEuR-)lyjN{aVIFF#<cwn#4-xq@v1L zCn__HGHTa*vL5*j(_1EBhD?ML+nM48)Kphb5&m2H`n}&l8PkovJ_~<z!<{&yuMdjr z<7XUjEs)f~A5UK|iKEX=hV5QoFQIzY*V}3QjX>Lh%|HvV7I+N!4e&64j`x2+U$3Z< zkV1Qwp$`X20V?l*v%bFZW^&Q``q4Z>GpA0{_4TX4MKt<^Xnv6A79a*VI`(e$^%9!& zoG{1H*Q<2X!hN;A-cEZQSyTYCfGdG(fa`&qfI9)|=6^t6FPT}12l#y$cnsJeK2F{I zGy3`^7onj@3>^2E>Rp4Dl=6zIXtaLM)xAyq4!j7z=a-@qMPy!xawFDDJ+M82D*{A0 zlAYMjnxY@I=`EiwYI~#-eu-}{oyNkd>OU9k<8+K7e%OZcqV?IWgAv;&3Xdh~OA__K zEg$1`&XOJVRPP_?{p+#_ZEbwUi{sz4@Kz%|qXV~m#;j(M=vm4|&%%(N0Ikyntx*XC z3pC$jF5WL{OP}cf239<#3RjL3xmeVhO;ddTwikCyeSvxDnDNuWI56yy3Y<{P^XUK6 z-nYO-S*8EK1A~r;G8q~r+Ei$^UYh&;hBAl+Itl{jm1GnMfrWPzTTu*b!I5%zt+jsb zrmO9`)o#{WOPdu236+(%Eh<VXs@HH0S5s`s`G24DzQawee*fM7|G&Tg`to@=_uF%x zbIx;~^PDqe+9JraBr?E3LikzmV8_R~D%7Pe4*vvboCW9QP9S$YxlcisC<<I40p%>^ zO8*Tttb7t5{v3fiFg8i>=M|`D^WO-Mf&#T}$cNk%c#0C#$P&B3hI|>kIN=7#8626s zTc)IWkff<lRN#lBm*kMCRt{tG)#Kxk8&(^6lRLd0QJUN_Sm2=|mJuB3MN&}=8)ylR z>_&S@I_sYilGpwbq7q47J9&V-mXB*n67x%9`SlaqD)N;=GG08JmlhnEf-<nfo8OSH z%=J=doQ3cSLN5~0Mps1<vyl`J6b|+Z@8J=Ud4Z%!qU#OOr59Z<iY~k8dP;O9imvUV zD_L~?LUg4&sI`>sJ>-!;Oc+mSMdt^SmWXoQtAh%Ev@PPq1u@<o6ptM#R02WyQNq_J z;DObc@D)hP!RZW2NDV41Ws~@bK=P#E5KEb!Y<jY($)+Zon{4jjkU(-uux1Yu+amUS zjWR|!mXI;jV)mn2LF^;N;#7!|A$-t|(uAvl9rUJ-P=q?aNLXaY6;Z;|qMdbX<@q3g z6ZI-a#o*au-+6_HKuIKP=oPFt2p{5in`sj)d;pmp7R8Lr+%4z^abyR&AmqF&V4zW* zTMh5b;5)f%$lTEdYJj7dIfyji$Yl-^*azRKbdV>vgGkLkVfzB)u!DTIXOWHKY)^-+ zDS|SpDuo}#%$>qh+2jXW-9Z)Q6LdjFaMLpd=#_*BZsI_KyG|mwnzb=~i7n97F<1zK zV-iQaGItj$Dg5j#BeLkH{82UjHg+yV1D}rbR{25#>*+nGUx9^fwlVAoPlt1%Z-KIT zH<Wj$3AaO4s^_5THmY2CJ1{l^$7=aFv+H1dR21|str;OHi6|c-#QMis9PI3DOoosF zEgp7uwi4sEV>m=<D5vc>>)a+`ENa_Oc_KOOg$g-@Qo;kEL^_0Fl8X;PemmSU5|pa& zpNOTln&Negh47?uiGthjmIERp1H&j<WqthmeH0Es=|{NzPAY1c5(>~6%W&3}#EHLy z0OCm|5!r{-DsycvPJ(YGO}07?=dHG`HDQ4+i-QU*pZQWEj5Hw#0wwm!Tq#zhW{^~m zQ3LBS9CZkP1Lc2?xm(O-&C4Bwa0-BobRTR8uFXgB$^fn_1^M)isT^dpe9GB<3ja{l zG#53+@?a0V5ooAvyS`RlzwdlRAgY!c2LY6rvS!dm4_BQeuT6?#LVmBHge;p0_@@Mu z6qU$cKFwo0w&p>cQ!>2N%0EErN@vhtwBdvONl=`Q%s-pe5sgh{$Lc^s^0}7L^_BHs zqXIdoK%lD<D*G--k)-PA$I<x;j<dk?52~0ccVkP2BPltoirz{DfIL=--=h*8kt`lX zshC#zkMQVCCFuR2fv|vs8k9mbOSg!VF)Z<uAlTB<se`8Wr>uXkt6Znx_{iGnQK%Fh zO#}v2HpNG<zU?acBxn?V*A_aHfKsv>>(QE*u<WsOm=w4&GI2<BGgixhflmG~<(~GB z=uq1oyli@gPzz3b9;6Pkjf1QW{x56gFM?<|uW$|CXQI=Gc{Prs7^mW`wk$D=xg9^s z5Ymas7d#bC$2|VpxxyEp;P|UyUd>?MgyVV>io<bzlRW%u^H~4kAS+q8a10xoF;t0~ z>zg8|rZlPQ>gN%Mk7HFTNO+G$A}jStJBb9-u=&s(w#-#z){F|AZz4T(4w~<&ib{_{ zUSp{+-{^-LFfQ3|+2;-%diutW$-zOuV8lj6b@cR&xM}g8`)s8w2;LQ^ePT##_4U); zRj(mqUW=cL+gpL(NQ1`i5dSksDBnLl$kFB=&oM<;y@S#=;yR@iVUWAyRC341EQq$n zmF4K3-pT~SbstRA9qtHoPpvR7;LlU##^YSUe?1Am_$a7HS6FWJ%LDs5!f0n?!D+;n zeGuOt`f|fzei$o#@Pg^VLAT+Tv=q?rPo{MKNGjif3i4+BoZ%EiyEgi{Luc<1TQvyn zbO#5q_IBXO%h%4X7X!lK8yw_5o(qZ-v*wUBT78^Y2e613V&Ro4E*QR8l+4VYja{TJ zXmJqbfNs9R`jjgN!e3Hg;?Bt29})E}Cj8*YVo>7tGDLz9*wBvN;s*mIxSok~iCRy$ zH?!8?rF$*VAka_eLiB~5?Y_^$!uNZH7eTHVSWu1#ic~d@;@3twDG3rpQUXtR^1L0* z$QJZ>00xZ_)NuCf?Mjr7A0)(SVik>@5Aeu&Lw?vo|KuRv`?a0sqnaWp3eiZ%SdqJ_ z>?-pQ3B0<4{5v984md~kmt!C(q*SYyS;hwT^TWemU1o{(pBIh42OJeBBP}g$;{LQl zU2bniS{i0YJ<<qxxKcY;I0a%Qs>ejb-;|a%*9$H!9<hS&VznI(hf)~wA*~*GuM`^8 zIA|WZhK6uMhu8Kh?oBk%Hnk%$II@g<srsGfv3#W49P9rF{X08xzdInz6>3lp8;y{* z2RnwM`9eI-27pB5$WvOp8U=N7Fy2wQb+q<9K$2@ud)y~@m9Cr_r8g2u<FGk^$%!8d zW_2(`a-nnPN>97I<FCR)NJe=yQy#O$JmSSX$oN5d%%wbfbTAzxDlZ*=t|h#&vR=M{ z+Y;cs4YP3(N3s4m1x==Z8)Ra%6BC;QjT>Zvk8u|6mV4QO00>e@{~GOwwq0i+BYk_~ zX|(rsi-jLn8|SXv7gZbgu<ebKuWIG)TKPS;=2AI=!Z07a7F{(0WDuCAV6w63Dx%}c ze?&lyCR>4N$9=q;#xGqg_zadnQWj(+(Br5{$_hYw--UA|5+wyjno;0(JN|{gVmnxV zbFF+1o!6{QugozkxPXI#17j$BYWT6r`Y79xHJ^}_YsmWZ_i<c(VC@3`kfx*s#7}nQ ztUtdQe#~P%d8DmB|Fe)s6?sfufBqLC57I>F(5ycXX_%Pg9`aDFKYxG7<6iQJUVk1M z8sGs@3cZ&RT)6;@$dP$9YZr73rncfh8Y5~R8b)*K5a>SzM^=Ms*qEwYTDqc*v;q9X zK(Gq0@KX#xP?C7C55<GIwNJ+Lm@d|zAVz(A=Q%XDb_>c$%c$8<4O4eG6I-^ZSCfGP z9zXfkb#=+9K<B>C!)^DGSM&yY&N-yM5M6Z)NpNo*N(oGbA-d`<c&tB9oe^C{7dP01 zQ|qbl&Z&NYa3an&7*R@i<~F{AZJO{`oQBVvS6f~YXz~ip5Q?E#`@EGmlJj{u1CX0l zR0_8I@bIqOdL+pdv^cn_Y=q?@ga@BXp>AstHo;Mw7#=qd7dqxuwsi})gGCOs=I%tA zG@%g1WTpwLVB~INJ_WFfiPMB7<gHZ6xZE-p_6G8*Y@F1AORXCSLEc(c3fAcH2$|;% z8uQPHoCVhMP3VBy#|W{3TEe361?q<$S^w%LxNwHoSKs4DA$^Y<atTjDF8XMD4CXW9 z#jvwxdLP0Z>bVB=qC7ZqGqMMbzoOu<=Tf|j;d~Fa4%=f{8ox<Y4UzHjeKrD^7Dnc_ zq9v#uZ3cEokt6GVzFu<C6hh=9>dUls#FO3%7a)BYX)?iVgQp0w*8mB!eIGQ!NNvxB z(i?;T&06*JMgSIe5?IncHrIO(_5;|RoV)>V1Of#l?IVSOa|uk0$?jsX+usUk0^nE4 z>!6K7o7YTY1HJhda<h;@PS5~fE~jQ383<7YvJ`>hC=zZ?f!HCQpHQn`8HoB5?rbS) zlA|iu{7KIFN8q>0DfXWff*Z+#>3>pmH00bLL3v<$MP)D$asuc+(CBJ86@*tOXGaC* zL|JAl{1M_kk+j(_Bx6_C5h+=~o6srCG<nTkQS;_wE5{_XDmu+m1QsdIHiY{}=WHi2 zK#fO%WjK(mu)PN+pd`wcB`?Lie7qC2$_%WH0t1R|GUlp};GsKQGZ&|X0R`>+6t>r+ zE9qpfvP{nL;X#jLDosA`u54p0NlYNA%jW5hzUM|nu|aQ;t~G5}q5A{>SpNlw>nFOi z8|v4Nu-KoS0MBUlJ4H#h&NV0V<7z!^UhLW*0S(aZfG(!3FYiKaag>z?$63#r1AImx zwSC!oOX?lb8|e2c0txo;ee2C$4~d;gZ*tlCve=<WK;=(-Z&_v8ATIjP$#_db78`x< zFqR_9)>0B3n5_suXnVhO(Ak8WEBveSWx2ViPjKW`vGff=;s=IN#W%bbIJEX^D67W9 zVKMWH+aQP8aCqGraB!3JqvzY+SQi#}Pj`632Wv*u${(O+1=Le*M{3N03u{kSo>!I+ zPN-oyf#!M(IsPk@fMs|cZnxj}Gb(Kil^v?c5ujkh-SCz$#ZO^atSt_1IJ-s}@(iE3 z`pky2<=D_F%Llo4P<0WbBaDy5N_3X$Q_Je3Ot8I$`h2tYWT*~Dj*mg+n3&mYj14b| zlmt?9ofjBJLZ(3HcJc}wns^Ym7;Jwpo%uZ5o}DTU3%nKn7W4#0;rGvJ!{NWCazA(s zF$Y=5GYmia$ugQajPlt*|Mr~^gJw+)^RBT}Mo>BOK+~dz+zNEFaP7M+Ll)I9&yUS& z0F%gS!Nguz8o(pO(xfsOkMRi+kdZLvqFf=^Frkrl9F2KWECRzJOhcpwL7*9cCMV%# z#G#$mxt4j@^xy)EB9LS!MTLm1z#G355|+gf0YOBP6-Xl4PaLeVwum+o(qQs`_6Raq zX%{BYtO{X~x;IL@6y@hql;2{Co;NSJa*|LX`INz=L~dI|D@7iQ#MdGJQC?vof&xj2 zlP{p&USXCL(QAv?Le+{x#8^w+9t8SPiM^4SE>?Pl2`pNMpdu3+uMFY0KnGZrnK`y$ zB=U)_dJIYM!_Tktw+0d*FtWXZDI2Hz`jAB(vbaN*lwdWLvz^k{B;_zOC^{|PNql6$ zJ*mg3C#Sy0sV1ko$LS`gTXF{6DZvWL7<IYYa+M#P1CvG#o-O!6guqG;1g25ByIRn- zb0C0#0PM_r2%z2-ZoEX-<{}bO2-i}qhRHiIGxIlMSmIezVHh8k%r3mw$+4+ys2jol z%dtCdsJn{nnfY$){$A#=H9P&p<GT7Cat`#_iC)<u;NQziIG=dp38omb{zNP$WyXDg zP0OhD2+(Dr_`#98Fj~RTzr<luiQYg{i>|)9DndYu+|aQ;v(a<1s($|la;tb_TJ7Ag zGU-nFbM>};tHw-hPQW{|$HQv(vIKQ1e5aqF+sEOjAD_CB{S5G-#q&v`Ms=#)AV4B3 zmh8=d3z>SM)j9^GNO7n}@C6T%(G!djNlAqSEbx8eKwQ-uCzpemRf=~lV^kLC>X!vJ zd8jy&jEt(Nrahf<<E9A8y}DY3k~-qf?hE6UVvvf0kZH%K`zt7rqsH&;NW=o%l~8gm zUOrhB6UwByVxLON;`++2?2@bTLdvS)p?sPvj;lJ_`sDHwPB9k=Nzh4`)KlVEN3it_ zI`yZ~Bbm`v>4bUcR9bd-oyB<ZRo1JgIyymZC4Zyt!d6A<spt(iAS!i!Ww{{hA%Gf& zy_zwEtmu1BAYn!MN$`ZEqEVar)kgg0eRS0y;D~-M0k7{KJ`T>A<r2!FHfqkkkL6I< zf4ue~1=!S$;epc~w`|OiRUPKXvma3V#@4h7Zwj<;{COv;sMt&>b=#U&ew~!Gk>2n+ z62#Qi0PVJRdC5L3%#0$NB8VhWW2nFa^|dwKNE<lC$n&ws7^yziu~<Z&97A~JnS_Lj z)j`nW43LWMwS>SvF;L-Vchtch?-vfCr&!XOVU&Bvpqepc>gq#O-!aTGri|vD;lfeG z6}s>bs}$XqLvLWQ5T3(;c#W<&)X{L=@i8Xh)V3f5#tH9WFtRg_8V6;8hE#T4@Q-MU zAQv?xIC3WjO~=H_u5bH$ZzFH~I&il?x;OUr79<0wVv8X1j;<oPN5DWL^BR9El%C}l zC$G#^fr5o&2Wc9?6$SENM@-!TpbX+uh|T>)HO}pnLrs!=J2kc@NwJ+e8;W931O?{1 zBFdG^0#P0s_{(Zil9cWafrU7TODi9?v6|+J>J)XHyW_YRK!d(qxseTr>P_k~aJoA_ zuVJ;TEN=_?V{FXMM`Z}*Z=xz4(8q4;vpls4J0X#10NUmrMKCm(N%jHGF#lU&8%>H$ z5#&Kw!@5WJ3F(0n@E!atyvC4752KyO&%Kst&b@~@gO8ecsCqD6tU509pT(s$=<Dwz zLkZ(`+z7)|!w)+B1d>OJ@xG*Z$Ob<{icMGp-H%mt6iT-(aep6WWuDtd94~+MMm*If z!%GPc(Zl~0!exI6UbwI}{9t8gQ1=RSPJWM9wAS-NAfX!(Z>nnNulqgv8}D$yfTB2l zf4p`zG-+yAU+7TOuKpH}0<7*vAyHBpV>VtzWgO<0RbPW<NCkb_5m5uDoRt-jNu>o4 zRVwdeq|jHL<!?Us3M*{{nXI^`nrp=7EfX#Kr-yNi8zjf#hH5D^Bru@%N>zyuHFsvH zxgdB<1v}&W7~kD~E!rP1w*Tth_9rl`PTbc}n{a{3W43R5Y=jQ-V@$h}2~yW!06>ts zB6q@j#G5{eQ9|;V=ql{hF%)RGlpBX29GyVtnPT&6a-&3#+%62y%pDc*q!W`p5NCz$ zsDcZ6^{o`d(rltM!*Ux%j~&%;Zl`}F1SgFKeoSp@_w4+r+SJb3`7-R#C;_|&o%KML zb*-r3FE5F#NFAZ-xCIl10XBKZ_1mdj#2XbnNJ>Kd@a<GIJR;J_2Nxa0{T%pxsy1Un zLw!Lea1oVBvJ|=mg7;6}1G^S;Za>i@C{^hn3WAQ_umR4Fn>XURjVwg{{6x^-tzu07 zXKao2XIFk24l3@6h8U*G4jG;##zt;FG(g3hd;F+SCec+}k+XE4?@KWgUJOLCv-1~; zq{V0xBaVMmB+x-20v(032XR2Of<PyMK*vf18YL2_zp>_;j@b2(USltIO~-K9P#|n_ zY_^Evu|^?Znx8PL<!n@=5z!k~VQLT68b{1#^tGUB75QK~uNC~n!O!a_WXlf^is$6E zVI)O?TKw^S$OaqqWJ><=2S_emhqK~n=x&-z8DH&JWC)*;3-c(tZfIa-cjd_;HU4%e zCiz8Po5lp@J80=+(j_iKyb8CQD76#o&CAFfXNc{{cg5Q@&oRE69`ss|sSP(TgvHIM z%Swfi$;>EW7BiK?bY{i~E@s9GCNhnJnmJX%1ZKtyDrQa)VwpKfP%=|3D43}iIA+EP zT}@PsS?FY@T@YYaHoAi=-NJ{=D^d6>Gn0iknVBNI%1nrknVBv;%gij{56oO3(2tJ? zS1u8L#mpSx0cPe3wahFKHZZeTC}$=w_?cNItYGFE!3UG7@LUCuC}fiFb5&$bVOA!c zNnlnI%?L(jg&dC)CNe9@dIS}-61fT^ne`E}Ml$O*vIh54zB|c!hFN!!^*F4M8DZZ* z`ykwiOb-kS3_H;UjRw5LYKzzl8y#TpLp<>3aw#l9PJ#7O;7%5}Qn8(-D^?)P(8$6v zglY=w$v(R3b(9)NiVEcuMfo&K`796%fyO(_C_zbq2c$rk7#I@@jG@4TQs9kZU~DKb zmI9ATfe~V0TqrP(0$Zd&x<rSDsX~D&3T%}E-(Z0&<E4hhBh1jo!ZL)XC~V;KSR_}% zJ%6wCkqR$#e8M8>a?UHV=qKdy9j73Kp*#NgEzf;8_F_T%Wzjq2@uepN`zjk%P@wOf z0qO1u=0L@{S7^%f+XG=%nSTlrjkjjY{Np0q`7!$hr8ObUe=R((vSx?-l~@(AQ;%%- z9}a+JYuG%x{!m+Gy{zHfE5t?cu^Yos7i9AVDu6_-=UxHp#PK_q1rR{_zXjj@l>e*9 z|3y4F)KML(5#}7aR(c!N3j(me(<D6fT`(5BncmUi_^UP!w?_N3FcT9OBFOkL8;5Va z#(c={!NvWJnKIaHbS)g0!-X*ar`WLunsFJO_>zgIf5+b(nAsi3>_#l5`D=gFzT?V$ zUn=1WGk;x&?77kPiz{1#iyBae#=xjRwE1;31Es{7Px?P1%hl^YCJtczC-mQT$p0EV zQAmDVZuK!ta^2ufb!RPxHY_%NL#?OX3l;gy+$x0OoV6a)6>?V8I4HbhWbXk^WK#rr z5u&z}1&6Srv>39jDwKs&SqPih<n3?8algeM>sLsOYitHC?$J7jy@_8H{Xl)K{8hr0 zH|UQIj@-)@^P2LO4R}A3^gn6Jt&MZx;JH4WB*K<2Aky#&fipG!qqx<PA#~w50>VLJ zB0EM(a!=s~?2dG2$uEGc&ib#(%nuWOd<--Sei-9=d6TD&3eA-20+pUn>1gp)U{tX~ zB0VI+0d5D=WX=!H5Sm}1@!@IhC=4u&vwegMI%AsA{y=#wJ@piD5O1C)49Bi|9!}EP zbqrF88B3DY+EnFiG~1ggXb_J3#H=PC;tmmt>$~*VF&v<lC@_;1*i`Fl7B)hL)MqRZ z4Pty{f(=MjetI)_0i4O;O|rlL@!WgiZv-wtqv7;#Hzr}rW1Svc6@kl;$HUGY3hcwm z-ZP|r*!aZnpwYm@jR$dHo~lg(#%W~cn{&4k9qj?LPFD>T*gyEqX=zZM%3xHKOFIH^ zGtD7VGEkHOq(ojsN|uE&YexrCW1t{A!yL;i+_pFTXE8ZolQnUl%oDSnA~I5IMXq$y z`zTCCY8POkJ=W2hh0Qe!4_Fqedgx7s6F`Pv(A&cJe)Oi2=nXrhgY={#$&V%NqFT98 zBDiKKSrEZBN`kbG(IFz+D@UQw^k!>*p!{gSe~_+-$04m(SlR$eK@zIw5|%IhvJD5S zY8R_RBqvpX<hq|DFpch_BAAKv8O{P-XcMuvO$a{g87Ai^TNcKlrf}NI<D&0>3Kl#h z2kIS|^f)bqXboYuR_>Bo^9@u9q}H%~S8r=hVoIgfFz--n+WfId>lGd#GNgTD1MhC~ z9H5raP4<ChV(i?ImWCSo<!NahgT#taM05e#N(Z=5Vp({A$FWzN@ROI3sbyg^x!Q#l z<O(z$pO4II7Pg=_7dBcJD$tKK!m#1(*QvCb{T=X+N<pF$^plvL<QO)O3O`4K>ZPUC zrp92r;rzs}5?)4BjJO(43tDiLQ3U)&JU3FU*d`ey@Eat>eH{r~2f&IFwz_M|_hzJJ z3Y)}p-VQp<p~G6?d0-dE-q`DR2XQ;}rl7x7$O9Y6E{pOSIFTwtOx5IRB)q{77{P!C zyWd*@dV!z;^TpYY@gml0J*{5EQw9C?f=sM^p!3{EqtBlEi1^Gp%fdz;_e)JLp|FnY z#58^9k>E(NU6zF{gx?ln7{v_iuk}4CxDR0_5jRv!bcAjj?3nqv`vw0@$nv_dpJ^eS z_`7xfuHeX{u<JTS4KFeeGB@304URlO@jPdAo=#mS^fZZ&#@aw8WrrCeHx_NqUGgy| ziTlAbOCrPe?NJ!Yy4P&`cwCU`mJo4Jd{p8%z3?U>xZ@<mCCU7#m+i=*X+sM{0M%_W z<x59_$c~tob72>Kn=uW&^gMj4Q`^KN%MGoF?1d&CX-D9^@@jTiSu1)AH+BLW^J;%Z zkpc}~VFdaJr;bB$aJh0EdC1@qXc41V3Yzei{BU-3iStMHIuxe)k0_7YM0J!zEx(57 zf-Oy%8Nw?#cYm1<DPi9ad+uITFhh6&*0c;^4-5qS0Y>myYE*`>og(!dUuFnVjA-on z;X(lOzQk}y^F4dzVRtYP#H_4k8@P=(gTF90@+T)H*sr696IEgR<O%n-^>dor__waB zkHfRf^=uJf6p(_GyL@?;@G%z0z!^GjY9ZmEc-+LV3M_1`_3S}Uw^2{0)@`R9Gh`O$ z-o5F<#Pfm9nM9J6pP#DSe^vBTr@~L$F5v!Ji5rtLzX0Rt1yU#wGY$H?d$LvGAVTKp z-mp;MKRN69n=IgIfz*<ZK(BWs+PX?f5yNiVUm9NH@6MNF^1uj3YBlP>DnMeRZl)hL zjuen;Q_swHV?2woS`n+(w@W<1$rK*L+7u|uu{oH==V0M+0q!pF_feJWCg3Lm2CW^Q zufU@0!%zkv(GeM#l^p$?JfX6UDdZ$|v_wBQJgM^h<iH`Uq30+1<>bar^t^gaWaW9w zIxMVe_VyAT1V+`$D{AEl6s6<C%5NqwUgQru*CGzKC`SGHgV5Ak&lzv79Js+ew%_v& zM1XrlDrIk>M^doh264=TbWxZOQebQCZW>0(keh{u5iNNKFgFD}F@e~ch4nS%jTkRB zPgFGYI|(lbXL|z%67-T-gI86SAC&p8tMwdYlOK5vV_t)$xye%A$X|z-NqISBwV0fg z!Z)O%8|cJ)C(ShNG$V%px=g$z;>VdB<B%A~hUv2zGR7=)OYh2g--qIOXsuaTM{6R^ z?r*2VDT!ITCNzoi5K2Pb`UA$UA)jOZu^C|3UIE>MU2B1xW_LO%Y4Yqvvmp7vtk}N> zw1ie7$Wk85t1>ZhvL%sTgMfMktvhJzvVaFGz=4iM)QC};_%NsUM1aQ6IeuCOgatEL z!H5aYO^ZlSHR_E9$tm8fIUu}LhuQ)Acn71rK8SOj)R-C>P_(elQoffToF@E=A_P1K zFyZ2GR(KHOTWESioOowLvjxg$cn%ZI!TI#6A%Pjm(SMdFbfjmn2Z=KSt3iZ+KbyEp zR<U>yADtgo?fJHPZufrA1um;2vf6_ieEU7$a&C0Ok7I&Ame-~ZpY0{xE!2PP8A5U# z=De`i8lwN~8Ge&TDYASdpuzr0IkcH1NzlWBkn`NfuPC{+a~}s<DD+%Td`!4#`#Ai_ zd<2E|I{o;~p|A0&bbMYO_2+~?-SM1?_I2YU+cys8Z^oQ-leph8cb5z@x2_5c``p|G zTMKOa&5gKB2Wjjf-D{YxhCB}%50-?Td#^uV8Y(jbRf-u}@25u<aX}*<nuq63Nfm`w zOP~SORR)>^`^gMH)G-})((WR$FdB2{_@NIDeR-&5=xhEn=T2k!MB@+x;;nO^haV~# zZbQ6Pijrs>;;tMrb0Pvp<1KLA2e2t%i#qrIxt7ZJxxnjzBjB%5&Z7PZsht|cyKj;R zG$$Ub7RjK~0xgg<qY~0Sl^?k=5_?SZd;HtbA)GC3UOR@iWa1&-Pn8)%TLO_UliU~& zn4QzTfmgZCSDp%z2>ET@e(YVbhl3Q^A2*H(laG)g^DEX9$5`QST(lTJu-6cn+HG#( zjgaAeWp3qfhNSfi?1bSp5?-zF8U(MS9S<&AEY^AI1*F3dpMNVF-DCvEZNWf6u2;S* z7`TFgD;T(ffh!oef`Ka-xPpNz7`TFg{{a{<e=6e=0doM006gGcz=MFDfM)>pfEGX} zK+!JaVgcg;W<UyH34jMw05$`*0Uig`0rmr000Q7FK=GN38w)T4ynuW_1>j-8bAVR> z9|67uaG%RKCEz;1cz_l#6)+R91W*E~20RRS9Pk&wQ9wK38$iq#NC%*=Y(;@1m*<PE zx8AyH)v770bW@5-mfxC{nsTegVlm%Zn7zVRTAaPqM{#cgOiN5iPk=cikzkG|iP>SM zahzvn`i%5>k~zZzAC8-unm+4x&&-f1`prsDNS`rl<^+VV0g#Cj7f+itGu@MwzIf`q zbe5R>64Mj8(!9HUMaw3TGi6$CcF8S>-^VZH#VyS)EG*(xrT)@lUtx|auTbSH<9#KC z*#)ZN>=LvD4wbKv&*N8f@F>kIT&`M{SD06t>&rowJ$~7D7M1YuqBuy=C(qt^@R!OF z{rrV@7Wq+VafxqPUKtmv%hKHJ!sR|ysgLKWw4%bLKB@~VIybvib*FE+zmUo<@%`BE zD@CcQWxj0QU*c1dPhN?yR3)JS<rNpBV$?2AS#dVciA_=E_?8xAmmnnqE^4R0&{tOM zTS^&A%_-%xd7o;ss<^<HT}o9$t+Q2k`j?|b${%+PikA9UAahk-sn~cvyD%rapr{a3 z;43L9Dq$s+6fO0YvWE0vS*j3F;4AT=sc4tKaA`qNDN1LAgVL7rc|~Y3f{StpCFrZA zdCT&|>Z7SrbFwKKRUi)$OG=Q8^17?AXcc-@N=tYH{q{>ios|t5;Io0LqGi1lAoY7s z-Bf(hz(8tNHqV#j-RbA4?)~E4nOB%yvN}XQ{loGKS7sOF<*3lxCE36=XvV+dPG1S~ z$Sz%7xHPw<s1QFU8%m7U_(1|IeUb+d--9sF5D2Ic=#VOmJn{+(e9JFE#C_A{139Yf zWmI-g_xTEZ)Qwz@zqlZ8DfN19>sI8IuE^$>g7Q^-_Hsu1d>+c^X#&da={vsYE+6`g zaJ$M^P%wE}QOOD<oDga^3%>>7Dyc}-G8zoXf<yE9>@pQ28*&%<S+}h4ttcv44L7JW zn_sM%VlhlHQ+UG6d0awzddiHn^q#pUan`i-dANb$N%5p&j^RA1UYcga`9_*&LUT{j zj4ThPrc2IGGp5g+HOGUnRBy@*#F{a4TFTr+4>wbq)4pr2qPlsd$<I4?YRZgh95=@^ zd+v-mtT--hURt^*m12GOM^d`)`lQryoMh02H5|T+Uof~1$q48>z3u`ez4+F#|M(Y; z6O&+217%v$6`+sY(kJ8Sq1#J-Zd{4@2Sr=AF8$kJG<V?`Iq17^4F7`RQa+Df3&-0o zDI3%*xGs$S@5vQjgT?Any)Q5;#bDo>;JRD6C5X$a84TV8EAoc>(ero?{#CN>4(GzT zwx5!F1-Tb-TpZW-6l(YF-zYvwc%}Gnk{j{iZgRX6+w?M7+1GXqi23#_=4Ro&Zg;Pn z6^+s^{#cFI4dYx=(1YVTFZ{7!nCkigQR(`Qn9G2GOE?JwE{4Z-+~3}3i1Et2ntPtO za}vdNbFWo=&3qNIFov!E|DyXi!;zDV-1z@E8DtLzk1cM!{_W`C^{uR$?v&n2h&|Hl zu7LFd8s5`0!R!0jgM(TB3~X#~a)}zmQbYe;-xChK|Nh?+&__S|u0X!)kR3r#ic41M zWArQbR>+IWB%k{4q2HfKHNHIkUI>E1UKmC3`p_>8y&$kHeV|{QIyi#i_&pu^P6u6M zgKwj%Cm$txef7wrmWthPgCN>P`aSYf3%95qxIHP-@9CFq9JjA0{+p-ox76=$fcu0< zzYR@}3a)~}MS5*G=2*h9@LspO*Bxwl8}Z3K@Du4bI2fp82ovcyXj|;+q1NzV__kL> z`n?c57X9*tpz8uo?7r^{UQdy>0WJiceQ4(TWxcc%Too2Bj~Fx<S~)`^heiz>9<9U+ z^S$4QtGSq77uiPQ$@9y9>^ENimH%*uv-kUNWE|U@>bq^%hF>>2Zp>JYyIys}jW@-Q z8`%Ew1KNM{|7Y!IOXPge$?KeQ^DCUP{%KCR<Oru!9paSk!<@3B1@IpH0p9l!_E)&m zWXiU8VZvR1lv64{fE_^dy|_z}a6S@u(}rA(|B=e5tK-Io4`V1Fece^p_I%fj2pc{$ zIxd!dqb~8q#L44EeMfj)d|X_d;-CB?zULb>;2TU|Pcvn*`rqU1|8Y*a8>ScLX35?L zlY0WV0{na6d(;(t|FiUsXO{+kSLplyAbtP0@O_28f5`k@--`MELvjA@N6Y_@=5I{l zKkysX8*fzHb#Yi4=)1(aL0*^h4@K_@?}vlSIR2UW`(KCee+_;2BJuld|1<Gj4B8IS z_rC*wav75PxAOjH==)!X?|%(_|63vUGL;GO;Y&D~vf@0aJcw7Rb`QaC-wnb$I0~6^ zTQuI(Rl*G@z6$*JQ261uHj9VDA8rnA^+%ktxQ$~s3i>hPSLX4{V4dUsJ@Eanq4V#X zy?ev|-_7Iy$MF5%;tT&Z`^;W^exL0>9pC>s^c|YVy|-d+o`AVI7W1?j^R@vme3&q| zJK=U={st7g@kYEA@8-|N9PfY~?lubmbGYhLX&&!8b6uIo`(mS?{oe!M|2cHN(uWgK z91Qn8+r=Sn&$;tzUn$NPadwwBYqHsFuuRr)+}yOu32D=2%%F~&o1Qe84iL%I7(?b% zoc4w6Da=m7d-AKeL)6a>xi8G`@BYhzUib9HGG!Kk(uLw5%$6yq6_t3(@_4U!63%fe zN^w-}^G(SqDCmiIduji4^ZmF%BGn-e_N0Q+B&6YBruq1c>;gZtPw!(-C@3geN@d># zT?Su)PRj})4}77#tgCv<*;|gW59kSBi#LJ+C4T5WtiY)=JHzL=VGyULr_4%A6Me|Z zrOlW*y^oVioRyj|V`i_<9HUxm85TKNm7a^k`RroxWSP$DCG86oqVhAf06rH7&N%MJ zIk(iibRbW@sd-CFib{)?@v12^J?W}BV!a~0qDI2fA{-en<yp)=1>9WPqXEJDvRB}U zxkQCSWFJoL={%Y#3`}8dpgNkVj{d^zI}3bt(hn^UI^KpNi7MBZUCg3!6wgHQ=wRE2 z6Z+-3P)C5W3(LEpXjNXHge?EwbjHi3E9G;(Bb|ZL6_b9)%DfWZj}!N0IA&+c4okBO z3VQ0Vzij@Cp@#vgyA|j8FmQU0Cic`z!}_MT-9^xZQ30W)MZiOjZ)M)nK5-=+^(crC zW_o)X=i5fLhT*4=63GgG0rY2bOMKZmDv;$}1LI#FFH)kMY(5*+9Ts^J0g*mTuNn-| zi9{IGflzE%0Syf3Frdw(rvWM}^p_F>S7ooB@~@;FHN)X0X~I{CUMngjtqQaO_)#+) zUNUZW$#SMeQyS`1wU+vHSwRs<35qYpMR`!Mp``H1@#Tnp*gG^b@>uJpO`O<+hm^cK zOQ3{8<2n+9HH01yjprL8BQX&zhnkaBh43j;rf~LR(L+UATtFAoo^fIh?HLTyN-!)y zcWI(pPC{W$T5(?CG$?OC-G+TMzXaFIl*8~sD0zhDn_KP`-72pCUoNz{#J~Rjmv$xN z0OPy<s<?~)`o~`{>;3zo=Xrf|xJTCe7bg2*f1&g$;6o-Ic=jB3j<`Bz<fv<6uVu%8 z(jnmZn<w1zqluFyPq|gC(dzUDqseTs+UyRe%bhTFTB0Xudh(3hZcj;_Im<hHPFgzN z!Oog@$NU8g7cE|redkgr1TD|a%fG8&MPX6#k4s8<|H@TmtMC5Fn)0>ldiq0N-M@dD zH_4P(M5MJTGp{hGXjK|Czi5qx|6C}x&AKxm-9Dpt_Dn!~5SEf%$|taS+gnuZFJ^wC zTg-+_h2B^8a^KXVvINeLjQXxfL?1W&Or{(MKz2R#`vcs`$<`Gstfi&opM!6bDixoK zEUWQxsj0W-<lG7iJ}-1>5&((5r9MfOikn%qvd2DaDPKeyR%yOsKIEC;U+ymj;ojyi zV0qkzd5iK&C@#q>fSH<IvNRWFlJCwEzch|+%PwSAltcM*$d~fukQe0xC`7u|ln14! zv>eiKX{4l=g8<5}B#+tBbD`EH`DOZY3Vo6z9h!aQomvET1}V~@8^uiM@F6XSbR6Py zh(~cKoU;9o{w|&`Li5Um0W;3UG0Ep&Ftc#$d;VnH5Bm$v3}oKZ=PwM;VE&N5P<qvW zbl;1Ozqnujv(}c2+yCG5`MwcAv=)QE5Y3UR*RG_ivHy*4VEiAplJ>^J)0hKRUwRr- zTt8&Llqn+sA$Q(?$&@PqwAL(p2v1rA$gY1_rZfZk@<9pEY+eTKS{2rg655-HTG!x; zbD$2+^rBbg<}J--{-kN_$9e*tSa6>b_jGe<Bp5YOjhyLDPf=m>(-R!p_mpNY^A)Tn zUK`w<ADgT)X!$a}9-COz3M@>KP+o?@cP}fOGbNIn+P`+8O5Gri0jyo5GVKSO2GwJ> zZNnBSqzAn;8>{bkH7N2j4FUuGLmPxFF54h5uNOB66`w2VY4_B8S$19lZF%~%j{58M zM`X&k09fy^>|yo8B8asROCnZR<b!n<%Pm%2EWTKSu@qxP#=?yC8Ot<QYg)9WkMjHD zHktAn0C^>c0{%BldUQqkiTILIC^>%Kl*23eA!m>2{iN5=NOvlB_qux`!SbJSpCl?Q z8M{a((tyB`>~nmg0AmnyiFT(9eC9Mi^!f|=bheqC0c~*w^DSDj0wX2`I`9eHG4ja} zMMEBNn~^M!L|l|8DO$}bm}?sLqNJ|BGCV`vQM1DD2Ip9S5k6pt!%YuM@nx^P$eX*L z^U#<W7@aE(<tj;Gp5pq7e6~{kh{sOI$-z|(aJH++C$%WYU*JndGYZfMZdQ1DX!k1d z;~ZyYZ51&P@=Om;FDRAD866IB5OLycbB8+s6u*yqF2!Xn%_Lio>?ng=gfu2ex`uKQ z>mhCGo~C@#_#Dv_O4j5~$}8}tuP*j+Pl=(pJK-;;jRE+3@)6rZv1Vc?i5C40e5=pr z>D>*d;nqaq^3nt@mEvC<z@5BIicIdO;hA|kzG=8RkzSNa(uJw3(Vep{olhoC*uv)) z;#Lh%o8u{43icmc8dMFP$8lT2Gci^AsHWVtVVB+Ka<7NY;S1&#uEMs6yB_h7n1mTD zN94WS$NePK@3Z|r+HrqPJEMeYUOX~FHJjy0C3`pdPV*9~xa6=D?Bk^^I&d_CQD+)N zP8?T2X;O-?)AosI<(?rQ5o?5b#J?-7r}gPYA(U{>_K%15Tf<VOrDhk4X_3y>*NyOB zhOsJpeI-mRhHE&i>w%uXQeNqKOYf3s!A5Rr6iPIRVOY;fT#dU(E7Bn?Oekg40UNhE zgcC%jwUgss=#9&8aJy&DOixPR{b1iYuUo7`bv5;u*tO@gv7WZW77_uY=;p4`nG zcMv+Uoun6g4fIIyG-*9%^d(nw+-97~6$9K94s-Wt=>H>ZH|z&tDowDDLz?>$4)6ks z4af&+>md_f0$pS^zzf(0s0XwGI!6GIUWK@u;a0+}f>{hxN#(-a25<u^0BQpGyD1LR zRlwxnN4maCU>*dh0NW@}#8boUtVVh8Q=?68xHqE>+W@-(WN(W>_;}O}ZHWecZUkrn z(*Rk3Re()^t$^PGUIM%WI0cC8ka42{QvgYTI{-z1`v4CEb^-nj*atWS_yq7ZV8{vF zSp-Y~SO95&#elm34+5S9yaM<L&;=OrH^c>)0U3Z&z$U;GfJQ(&VDL#9cN4$`xC6ig zwgR34yaDI{M1CdX#sQK5Ie-m-2LMk1{sK4vfMkUW<H9*PXXPTeLEK>cHpmbzk{imI zxhQTJE=>&Q9Gs1_bJ3iVy9($h)p8^5ZH(kbfpB8EYq{&V(YQe}h8xRW&#AZ@xEpbU zF`gU8jpuHLjOrHdN8Chi5@*71bxq-J<<y*p({ega&p9~@XW&w1O!Z`W6VjQqo!!Cn zEz8FIBn=pLW06hH;z$(Tbel<9uP*XnBZM;YNVgKP;()L7vRj7IDn`LHwN3-qg|!hA zudje*gpoQG*Y$erjBO0Lq$<(GDGqJQrgv<U{|wwKD;p4hT2X<2Md3{Gs#^afwEXrD zU`?Hd`h+q`67MOd<U!;jC7zL!5V}6sue=$B#eSYOsjMe1H5*F?$)x<Hp$yVOmjQe7 z>1|J{Zv|WLs4Uo1v)QqT<eKB_buxsq9GOkzuzTHD;~B$1Df{AnX4*w@7N@56@#`sF zOf|<>>JwW78zjA=FN=>w7Y!%?X278qh)ZorD5R$w5o;Pr!zJPCfM~QJ;uOSJl87h+ z!@whfItKVAiuC!NzI1UEYaX>7#U~am<+1o&qLLo*>fq%=29)9nUCESk_7vuPN81qk z9Yq)BNTpv?Mh>wb?1bi06=S36QUU#j+Z^Arf%#r0JfUQH2vOfv?#v>r<3K9AAUhyy zgfWrpC29q7$zIVr17IkG3X_&%_{=CQ<xBkRbZ9`vb9@j#7S2pdFUi9_UXcvZp=o#J z6&HhxVW=381eGlLE`np>m+ux9eCdv1LEnWUX+szyk^vQ)TUbm}pj7Kipo)amGzvlp z%34uyQ7pcwxX%DYiX<Ej<}ELz`{P8D@DalkN~Pkdd%ydeguQ7f#@icY%0rN;huoJk zvz~>F8=wco0OWwqJ<z`Z902SFYyy-4766g~Du5i&@+X;c7hnru2_P8|3+R4Erfdf6 z1QY|@05u>EAP1az8u<hE00yB_+h9`N=>Eti$xau+swBG{_F}S=rO#J|y4C|40S5rP z0XqR_0NsGChu{Y62GjxS0S5rZjgYrA!T%-Xc~AuN>yo<xb$b<ceo>~}{FVsK&7wP} z6nku`d|K`43z?#;*ZqC|mkYmKK9`Fh@(-Dz^#2Yf$v5b$phNl}@I`=~#4k0lZw&0A z?tZY3y%u)d)MMX$ee7VHd;B-|vHz@({pWq`zvyEpS|i%S6A0ke!0Q9Nc)XR$iHAwo zx4Ql+Q&QLxm_!45n8ZTMVS+{G+K$SI?dJBtq>FcJU|tI|9p-f~<6wgI=h}~89KhTQ z6K&*TVN$sYm~=4Hby%jn8>Rr0eqOR2CMka$g-Lx3wwu+D>PYn_lkh}k0)OB#IgZ8@ z)tTB91)z42Nq%HfJ1C5B9SWm-DJ_}N0LquzNq*8+0sN}ye}m*t+Z2kIAi1YWZZAwq zGe`1IlT2*%SpM^1QrQKP{|cBYKrw)DQv#s6Qah+V6#%O9dda*8CWTi5D7*?l^+aET zL*}?&OYZG3seU^FRNn6Z6z|Ufs^41x3V#<s;jusp;YStm3+lR_kJ?3_Of<gpKgAgs zkA63zZ=#A1WXdkc>&TCO^Nq}bX~=Kj7pliV|Nq<Wf0ug5!srL=(7)lp<2|eIxj{n2 zZ;y$V?T?A(`bXPnC~@w!70ld)`1^Leze6PkU-W<d1<}hbna}>f_z6<{=Mewx-?abc zI_|UI2*1I_(g9yj{%g0h6tgjKXTQJbeHFL({rvZ}17d^jkF<Q$cAn!jYeOl;DD=oS z(b1asF^2$nKrx^IkPFBGEC8efQUGp%9xw@@0>lAg0Wkn2APS%W$N?On8^46p1vmrf z1PFjuz)`>f0L5>FxfiepunVvaumw;Jr~*^~c)$`sI$#JUs}QZzIJoCSnQ{u6Q-?9K z`P=V@b<#&;DwIzMVdSQ~LjDz)P{`hi7nCWE7w>cYGoLr{pG&Vg4?F;9O$^mzpnWU? zY=Aoev@ZM-@GRgc;56VWG)N7Y30MK3^pwU5pm}u_;6cD1z!AXT0feYq0jYojz?JU` z2CiV>3I?uV;QuoWfRm(sK%4QD(P*-n+@_J%IO`f4r{W+p2LE6jV@fmMVXn4rvTn9+ zv2L|KV%=t)Wy`R2Lntk`E9_BrPA$g$#Pl0;gE`Z(%kq>Z+#YG)>#BD(x|&@FTnAl8 zT`jIw7cz9?j2Ol*)DNrO`b2%QK1J`<r|Yxy3-n9$az~<*cmBj#=Ng!n^Ky`TbKJf9 zI2Z5w337&G2?x12^vu+!O*?J7Y){&D+xFP%Y<q3>wnkgC?SSo|?WnEA)@p0Bwc7;S z30uAWv^~-JBBjMT9}nYo^@r-?>aW!@%`nZinsJ)dnhlywnj*t9hIg%81$Yd^@o7(J zd0m-qjjlphrK{F$(rwml(QVZ|qT8n1soSM{Qny>TM^~rYtE<;F>Y8;2bO&`ubuGG9 zU7N05C+JS-I(27sUAk@v-Q{|PK1#3D$LM4Aae9?LUOz!UNw3!H^=7?Ye=$aK^tt*1 zeX*X`m+9B&Uowm^rW@xQw;5-e)|yUPVyvUBtE>U*3F~R=H`YO}X|B6nue!L+;9Ia} ztJJg98R{bS&(x2ox2bokcd4ILcd5fP$(lPf*_z*Kc56P@oY9Qes<pY=yS3}J`?UwP zqjV}=hHi=O54u0&w}9W%#p-qXS^7o#yY)5t$MkROhZ?Rms10d`I}AmJfZ=zB2E+S? zFAY(~7-Ot4&ZsiR8z&ei8PW3BN)<8I@-#$l!jrWDg+(=yX<O}kB>n>tMs%@*?v zbHMzN`S<1y^Lg|2mhqNpmNd&!OR41n%QnkSP|%Z>-IhI;I?Eud(wb;pYAv_cSa(?8 zw1(Tp*lw{+v#qe*Z+p=8TlBKn$K&m4`z(8geTjXQ{XY9{d!2o+z24qvZ?=zes2mxN zC5{IjI~|`pIvp|2(N3*1)#-DtbpF)2)%knpo6Z(ztFz77?i8FSoSn`y&P3NzSGlXk zwZru$(aJW^8Str4$EzLcOm(69m+BVvIrUYVc#Tt2q<KQ~yyi8{SDLdLxpt^_jMk-1 z)~0B^+H~y`+UK?Z&<@d=bWYto-AdgC-EVYH>)z6RsQX4YNuL3V@7upm>Hnf{)SuBS z3{eK9A;u7Eh%=NMerouo;YEXB7!Ry2GZq_vY5cYE3FFJa>?z~7#u!rqu<JFYo3cy` zO#fy2z3HIoUDJ8fHRcKC6myn&fq98J$DC^}Fz+-!VSX0l^QieVbGP|A%S6j8OO|DU zWr-!nl4~ij6kB-9R?9n<la?E;R_ikBTI(~`*R6WH&CWUG4uvDip>)JJ?r{9V@v!3+ z$7_yON1LPFAvjI|r)L~pj&29%lsgs9c;^J?d%)&TUH1|0c4OQEcj@Z+Y8CJ`K{H9C z*620qnk>x%%@R$HCRbCSDb{S(Y|(7hJfhjA*$GT?y20N&zOKdSsnfr#FE!k4s59&} z)EgQN&4vSp6NXO18AF$$+rSy+MukL=<4lu)myb+a&5xM30T;W>Pnvg|4+0x4=2ml? zx!o*a=2~QlwvMviXnWuGu`L2K+X;K8{fxcK-ra+PNe;C`?=U;;4mW5j$C2wOa1=Xu zN10=dqry?;sCH~}YzC$6ay;qS?bzd}bL@50I~pC=JI6a4oUc2}T~#iw9x?;q<Yx60 zbz+}(@6tSpF}X)`RMVnq)wF5aHG<}ZrW0edOB1V&)2g)b+6mf85^ZH^7igDgb1-%b zv@dJBb>aGUy`Vp#?*s*P>AUruL2l?vNh-s9!<~k~#^J^T#)HPA#uj6%vCY_Sl$#W$ zD3j6@V~RD!nS7=K(9T$Mqq*69K*CQK=!LV$EecDNMQO<cr8un~Yq~Ydy1=@`nq$qi zuCZ2Fk67QgPO%wmHTKQ+!Or2%H=Ku^^#kVrHdnh#aGh{<y3V+|T-`(;2RZHx3{EXq zE7VbHrP{2vtKI5Eb&fh$U7#*j^Xe_?t$k*&-ReE+I`v+4o4Q>ss86Un)o0Xcn9(?` zT&vJVX_eX-t%$8s%xdwv3A#x-wN9@y>+CwW?jhY){UiEq`kne+`X}|f^?N`=$APm6 zhDn&$^oCy<b{aODwwSh>9x-h*?KJH&J&9RskEzbI!~D2;uw}SKWr?>;uuQV3EnZ8y z<x|U-n1y4pW~!|5)<0Rhtld`5CbubUQMP(VQ_tvFg!!fdeP8X`<l@@IHV@Z~)Tp(3 ztyyc=w&}jm^_>g;s=vwbBZJRSV5l-w8#Wm>8@3p>8XhrhL;ZFco;2(Rr5`lZVIFwR z_?ht*liFl8Wth&IzBQdNcbd<b#Xjq;tKMR^*!zw4Cos;(*(TY_Y-?;4wklh-ZIf-Y zZHsNI?Gf8HTkm=rWxv`!#%{5%wpZ9U+J9@0bzJXAad;i+jx5IljDcRN-{RQnctoQ2 zNiLns;hN`q$hFP&xNE<Q>%@`^nh*7EvN}cWWxZRbUZbv1SE;Mjr`YN=R+F#!vF0b5 zUurgK<8(La=IR#c@^zJ$=(iSqtG-R5`ra8+Wr#O~dedyM8@z^eLzZEIVTmEfkPCbk z8x9-ZGkj_Y8m1d(8ncW$jE@`lU_>ke?cal5Ut_K?SDCBLo6MWdTg)_H>^0Z-8xJ&J z^p1xZi-=pdCDD>>Nnup+j^#Y4;9^|%=S{}i$JuYS-)^T7^RWFnyUG#onBWM_Fd}wC zGt2?U5yyv)^A3yC?Yzyo%-QH{b{=pZbRNap)#dDVaxS?`;fiu8UB#|dY-GteIq)5h z5f!73RmZ7SSiK1Q&#UXzxbLJnsC`%au<mzQ=l6jx8LYobKUrU^-=hCDR-wLhwx{3h zdeCsx&|+vcv>Dp5CY>;Z)_u1z(U@#ZF?z8=@y0Ua8e@gA%2;jOWZZ1rV%%!nYpgdm z8k^bNqXVtRm}AXxW|cV}>(nH(+N?MK!u+tAx0G4dSSl=4mTJo;%VrB_J!);Swp!b) z?N$L?PN(&Z)niNP;q@$bw|$aR?bJKXPCGD@=uCE|IK9pzuJ>tffe^zC986Q+rp{6? zP%mL~O0{~E`X<efG>PDYQZ!!8X$`H^q1p6#ZM`;Kmj#+zqRY|c>Kb%0`q5aa7xwUA z75XZDwSJR+GjK(7Nu7SL{`VM<FB#r7TxYz&cq{Pmh4G~Epy{Zo#nftQGqs!KW`#M* ztTcyO?KUTxld(Q~&FSWi=5TO1!}`po1=eCKZ!Kf9YLzv_dH)S<53`N7-C@hN6=Agg z!xm<r1g=MKH{0#N!xDRrJ=b1fFShgcGW#0)Bld0fo%UhQ80U>noAYkxdguMlUCvln zoJ-}3cTI3ja;aTjSGp_9wZOH+mE+0<&OUa1MR-#|Uj=wmsOJJ}`RYn_xn>mj8m~4} z>(j2)Zn<b}KH7)dRa}<8?aS$lbKN0*i~e(cP@ibH-7uHUy?->kVOU^X3hH^tSY}#d zsxVcVs!f|r;+$M(+H0yeHJX}D2f*iu`0X}v<`8~~j?8Aexfj1p=Hr%5OD`6;vi-|W z>n`h)*4@@U);jB6YrQqvHp&)nbJ*^-tp{JZ%ciu)*kkQ+c9lKeKEa-BPqBOL>Gmx9 z0$}+?aFvJc9rhnNG!7T$z&$-{eDeTqDBGFqJn8(}85)@}u2_ck$6Zgmm_QCVzEORP zx=HhvW|elccBl45?YCOFZiH?k_87m=ZP)!pH*l@mtFH%-*sMRGKd3(n?DfuoF^peS z8Qg|ML$V<S^IoxmH<TIH7%KX$A$xl`rGo~&(Pr$s`m0Rw;MS{50aIVjvDnO;Pnqj1 zdoA^rMoY8hfaRd&sHMd+&N``wI<K{<Y#|;o))5DuTb#?DbH3=j1(fD?CAyMbDWJGw z?B76RZs@|nh*6L3S@Gq4_(5LNsF|qMYTepI>`LC%-mIIV+o5}0H&{QM@y9g7Q!8mk z|Hkm3(Pqjq{mf(oPy1ikeGau|+DdF)wnY0~_Hz3R_E+sUfM=WKxXV%E*x{hfQ5<lu z!S3i@b%XkK^&#~{aG}p=_F+dfN}Hy=Lz}IALEEjJs{5nvS>3pvJ!+f&3w>4(K8In~ zQ)%2~d=mSdJ;n*xJ5M*wk~r}VrYB6V_0TBI0fOm-$=E}ie>6W2-tz;A^BiK)S$q-? z-a7*x298@TZI*V6+B(&GA9ml{t?yW)K&2J7L$-HqU)XL0b!zQ1L6<)JR{P`j-QZSl zaabKw9k)9cqP45g+Fg!k9LF5rIKsf2yPZkSOlP(8H_qpslU(_()vgCzzjpo3^%{2Q z$6RM=-B=>yTG1~<)FZKGj8jiir>PgK^VC09|3tlB9Z>%qoY;Q#VeEhYft}=N&18*E zW7piS`BW3Gy;^%Mc+|<@Xsp_)*aM|$=W8DZpY=!3>zkm|&-8!Sf2)r++-R6=&>74I zCq{j)q0q3}u-0%dc$^2p-#m@g<|XhphcTOeXy`DUGmJEj$Bxp0J+IB0fI0C^tHN=$ zV>CwJy;%D?o#&iEX@nVE^U<OZm$lio#kJM-i0ktnev=rGboBcow5JMf*~~c0=hdI8 zM{43Usy@3Dv*sR6HRJ%aEBOd~_}{>TE5N7Srk$lN)s}0kFjimIzOFq4$~>n1QhQ2! zUK`XZbtAER9;b8Z?$zC=dl=Gzr?Iv+;Wybjb!T-lQ0_RrM*pb3Nk7q`HLSw^`60uj zti7)r-e&D>$6opr+8i`Q7^93=8AlmMV^2Na_#><;dZX1i)tGHuZY(kW1bgeh7~eKt zWxB?6lj$zgk4--}{lWB!>A2||(*(2DoM|osx7uR<+-$ZuF(y`6?zj93d+JXtUs=Xm zHCBuDc54Raz_qqtf{p|me#j8=9JzhI{Z6bOciVqqf7Jej{Tcg5cC{nPagXEYj$b<- zbG+mD#BtnF;`|i*<S=j>b*@t`t^#_S!0Ax+Sj=R0wGWiC6Ff$X`b+g$^&rjl8m-0x z?mQ11-B!(Gny0W=-lu8O9MrsvJ<eyEFEwK@!Z&D7Y8ASxFxndM+qh}^dHUs$cs#6s z8msF|`oDs9{)Symm|+xnV!L6EVG%gvEs#F^0dks`4Eq_SbYdQuX)G|_4_@Ol<5<%o zNE}vR1qqlQ#;&;D^jFg~bE<g`aI*l|DK}R__HfP|4cUXvGShOGWwqsA%Y%?Q?6tgw zQP*V|X`KwoL#j2+dM~72b=H@x$E=@W4gLpK;i0w(SS_a6Znw>`Ed=kp&GtvgonE!Q z4O!D?wv)DRY-+5^Zu?w&k-ZutbEo}?z1{w~^DC?d5w1vAjBB*(Cf6-4jmzY6VqTo( z%ET(X8WM-?u4i0t(EPYr#x=tjjNP(Hlcbrgc}Vl9h9om3x^ht0Ls%PL)xE3x1d^qo z?kdQVrsysD+rg<U*O%xg8qG$LyIo?u3;fuxjjtHpra30wwBEGeR0<Ba7Sfj;kO(|y zK4u<n(OUjwdDEi6=z0`0%%@g^?K#^pyUsoXEm(-T<;V7Q_Mf61zrh^yK3dXg|HeMj zG1jrzalhlg9IrZVbIx}zb#8YagA66YH3mHY3z$!iQ#-an_ZG$|?BmX=uhEz_i#2XN zJa*$ZJYcvTiH_uc`-u?88`@KEa&C5Rft=<M=Qig~a4=6gcRTku>zsR?_5HZu);<y( z%wzR3ZV%{^>)BWKa={ZYtEtuco^?mui=<0DVgaNPyrxXEMpL1w>X`*XvWZ>N9=%Sp zS5uEQs#$XYwA`v~)3$2`$O${OXS7{dIXInMr_e>|l)4yQtS%1oLi~W8Xh^14F@T@! z-J6DZ?9P7jj3}eBN809<R+}YQ{c^E$FGdgd=bCzV@vYKYbE41wkoNRutKI4br6*fc ztloaR`Vb$w>w6`ueOLTm`AFZM{r)~gUmcWjxiG%J&)Ogr;n-eZg>@ziQjp!+z2Mvr zfL9<{hRU=Xdp5hpjosKL*Ji8&+g!U`PrCMC&O-ie_-z;%IgmZ=(bQ?WNg=vZ#_2&X za<*T(9BuT<B+7brt(&BE<dGg3>u$&=8r28YtxPu2rS68xwOpgnL}`?o7)|U&YmHsw z?%9o`OLDOkT{`w4Il2NJ54m#{_`xlZH}8b3c@N~wjgT=Pg?xD{lLhQCoH2Eo`tre{ zeMax@sy|np-cK?}{9T!O%|-j(ZIF=dx#aHmgn1jJwA58szAG5Gf`Ka-xPpNz7`TFg I|9KerUr!tnPyhe` literal 0 HcmV?d00001 diff --git a/reactos/subsys/system/explorer/shell/webchild.cpp b/reactos/subsys/system/explorer/shell/webchild.cpp index f6e6dc74159..f421eed1a57 100644 --- a/reactos/subsys/system/explorer/shell/webchild.cpp +++ b/reactos/subsys/system/explorer/shell/webchild.cpp @@ -33,6 +33,22 @@ #include "webchild.h" + +#ifdef _MSC_VER + +#if _MSC_VER>=1300 // vtMissing for VS.Net +#include <comutil.h> +#pragma comment(lib, "comsupp") +#endif + +#else + +#ifdef __MINGW32__ // MinGW is lacking vtMissing (as of 07.02.2004) +static Variant vtMissing; +#endif + +#endif + //#include <mshtml.h> @@ -207,9 +223,6 @@ WebChildWindow::WebChildWindow(HWND hwnd, const WebChildWndInfo& info) _connector = auto_ptr<EventConnector>(new EventConnector(_control, DIID_DWebBrowserEvents2, this)); -#ifdef __MINGW32__ // MinGW is lacking vtMissing (as of 07.02.2004) - Variant vtMissing; -#endif _control->Navigate(BStr(info._path), &vtMissing, &vtMissing, &vtMissing, &vtMissing); //browser->Navigate2(&Variant(info._path), &vtMissing, &vtMissing, &vtMissing, &vtMissing); } diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index 7b0574ea00f..7ed28241d74 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -160,6 +160,8 @@ NotifyInfo& NotifyInfo::operator=(NOTIFYICONDATA* pnid) if (GetWindowText(_hWnd, title, MAX_PATH)) _windowTitle = title; + create_name(); + ///@todo test for real changes _lastChange = GetTickCount(); @@ -176,41 +178,83 @@ NotifyArea::NotifyArea(HWND hwnd) _last_icon_count = 0; _show_hidden = false; -/*@todo read/write from/to config file/registry - NotifyIconConfig cfg; + read_config(); +} - cfg._tipText = TEXT("FRITZ!fon"); - cfg._mode = NIM_HIDE; - _cfg.push_back(cfg); +NotifyArea::~NotifyArea() +{ + KillTimer(_hwnd, 0); - cfg._tipText = TEXT("FRITZ!fax"); - cfg._mode = NIM_HIDE; - _cfg.push_back(cfg); + write_config(); +} - cfg._tipText = TEXT("Volume"); - cfg._mode = NIM_SHOW; - _cfg.push_back(cfg); +void NotifyArea::read_config() +{ + // read notification icon settings from XML configuration + XMLPos pos(&g_Globals._cfg); - cfg._tipText.erase(); + if (pos.go_down("explorer-cfg")) { + if (pos.go_down("notify-icons")) { + const XMLNode::Children& children = pos->get_children(); - cfg._windowTitle = TEXT("Task Manager"); - cfg._mode = NIM_SHOW; - _cfg.push_back(cfg); + for(XMLNode::Children::const_iterator it=children.begin(); it!=children.end(); ++it) { + const XMLNode& node = **it; + assert(node=="icon"); - cfg._windowTitle = TEXT("AntiVir"); - cfg._mode = NIM_HIDE; - _cfg.push_back(cfg); + NotifyIconConfig cfg; - cfg._windowTitle = TEXT("Apache"); - cfg._mode = NIM_HIDE; - _cfg.push_back(cfg); + cfg._name = node["name"]; + cfg._tipText = node["text"]; + cfg._windowTitle = node["window"]; + cfg._modulePath = node["module"]; + const string& mode = node["show"]; - cfg._windowTitle = TEXT("FRITZ!web"); - cfg._mode = NIM_HIDE; - _cfg.push_back(cfg); + if (mode == "show") + cfg._mode = NIM_SHOW; + else if (mode == "hide") + cfg._mode = NIM_HIDE; + else //if (mode == "auto") + cfg._mode = NIM_HIDE; - cfg._windowTitle.erase(); -*/ + _cfg.push_back(cfg); + } + + pos.back(); + } + + pos.back(); + } +} + +void NotifyArea::write_config() +{ + // write notification icon settings to XML configuration + XMLPos pos(&g_Globals._cfg); + + ///@todo pos.create("\\explorer-cfg\\startmenu"); + pos.create("explorer-cfg"); + pos.create("notify-icons"); + + for(NotifyIconCfgList::iterator it=_cfg.begin(); it!=_cfg.end(); ++it) { + NotifyIconConfig& cfg = *it; + + // search for the corresponding node using the original name + pos.create("icon", "name", cfg._name); + + // refresh name + cfg.create_name(); + + pos["name"] = cfg._name; + pos["text"] = cfg._tipText; + pos["window"] = cfg._windowTitle; + pos["module"] = cfg._modulePath; + pos["show"] = string_from_mode(cfg._mode); + + pos.back(); + } + + pos.back(); + pos.back(); } LRESULT NotifyArea::Init(LPCREATESTRUCT pcs) @@ -253,11 +297,6 @@ LRESULT NotifyArea::Init(LPCREATESTRUCT pcs) return 0; } -NotifyArea::~NotifyArea() -{ - KillTimer(_hwnd, 0); -} - HWND NotifyArea::Create(HWND hwndParent) { static BtnWindowClass wcTrayNotify(CLASSNAME_TRAYNOTIFY, CS_DBLCLKS); @@ -626,6 +665,12 @@ NotifyIconSet::iterator NotifyArea::IconHitTest(const POINT& pos) } +void NotifyIconConfig::create_name() +{ + _name = FmtString(TEXT("'%s' - '%s' - '%s'"), _tipText.c_str(), _windowTitle.c_str(), _modulePath.c_str()); +} + + #if NOTIFYICON_VERSION>=3 // as of 21.08.2003 missing in MinGW headers bool NotifyIconConfig::match(const NotifyIconConfig& props) const @@ -672,6 +717,21 @@ bool NotifyArea::DetermineHideState(NotifyInfo& entry) #endif +String string_from_mode(NOTIFYICONMODE mode) +{ + switch(mode) { + case NIM_SHOW: + return ResString(IDS_NOTIFY_SHOW); + + case NIM_HIDE: + return ResString(IDS_NOTIFY_HIDE); + + default: //case NIM_AUTO + return ResString(IDS_NOTIFY_AUTOHIDE); + } +} + + TrayNotifyDlg::TrayNotifyDlg(HWND hwnd) : super(hwnd), _tree_ctrl(GetDlgItem(hwnd, IDC_NOTIFY_ICONS)), @@ -820,7 +880,7 @@ void TrayNotifyDlg::InsertItem(HTREEITEM hparent, HTREEITEM after, const NotifyI void TrayNotifyDlg::InsertItem(HTREEITEM hparent, HTREEITEM after, const NotifyIconConfig& entry, HDC hdc, HICON hicon, NOTIFYICONMODE mode) { - String mode_str; + String mode_str = string_from_mode(mode); switch(mode) { case NIM_SHOW: mode_str = ResString(IDS_NOTIFY_SHOW); break; diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.h b/reactos/subsys/system/explorer/taskbar/traynotify.h index e29852a8a23..4f42b30167d 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.h +++ b/reactos/subsys/system/explorer/taskbar/traynotify.h @@ -62,11 +62,14 @@ enum NOTIFYICONMODE { NIM_SHOW, NIM_HIDE, NIM_AUTO }; +extern String string_from_mode(NOTIFYICONMODE mode); + /// configuration for the display mode of a notification icon struct NotifyIconConfig { NotifyIconConfig() : _mode(NIM_AUTO) {} + void create_name(); bool match(const NotifyIconConfig& props) const; // properties used to identify a notification icon @@ -75,6 +78,8 @@ struct NotifyIconConfig String _modulePath; // to identify notification icons is an extension above XP's behaviour. // (XP seems to store icon image data in the registry instead.) NOTIFYICONMODE _mode; + + String _name; /// unique name used to identify the entry in the configuration file }; /// list of NotifyIconConfig structures @@ -152,6 +157,9 @@ protected: NotifyIconSet::iterator IconHitTest(const POINT& pos); bool DetermineHideState(NotifyInfo& entry); + void read_config(); + void write_config(); + public: // for TrayNotifyDlg NotifyIconCfgList _cfg; diff --git a/reactos/subsys/system/explorer/utility/expat.h b/reactos/subsys/system/explorer/utility/expat.h new file mode 100644 index 00000000000..d6e06d1694d --- /dev/null +++ b/reactos/subsys/system/explorer/utility/expat.h @@ -0,0 +1,1080 @@ +/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#ifndef XmlParse_INCLUDED +#define XmlParse_INCLUDED 1 + +#ifdef __VMS +/* 0 1 2 3 0 1 2 3 + 1234567890123456789012345678901 1234567890123456789012345678901 */ +#define XML_SetProcessingInstructionHandler XML_SetProcessingInstrHandler +#define XML_SetUnparsedEntityDeclHandler XML_SetUnparsedEntDeclHandler +#define XML_SetStartNamespaceDeclHandler XML_SetStartNamespcDeclHandler +#define XML_SetExternalEntityRefHandlerArg XML_SetExternalEntRefHandlerArg +#endif + +#include <stdlib.h> + +#if defined(_MSC_EXTENSIONS) && !defined(__BEOS__) && !defined(__CYGWIN__) +#define XML_USE_MSC_EXTENSIONS 1 +#endif + +/* Expat tries very hard to make the API boundary very specifically + defined. There are two macros defined to control this boundary; + each of these can be defined before including this header to + achieve some different behavior, but doing so it not recommended or + tested frequently. + + XMLCALL - The calling convention to use for all calls across the + "library boundary." This will default to cdecl, and + try really hard to tell the compiler that's what we + want. + + XMLIMPORT - Whatever magic is needed to note that a function is + to be imported from a dynamically loaded library + (.dll, .so, or .sl, depending on your platform). + + The XMLCALL macro was added in Expat 1.95.7. The only one which is + expected to be directly useful in client code is XMLCALL. + + Note that on at least some Unix versions, the Expat library must be + compiled with the cdecl calling convention as the default since + system headers may assume the cdecl convention. +*/ +#ifndef XMLCALL +#if defined(XML_USE_MSC_EXTENSIONS) +#define XMLCALL __cdecl +#elif defined(__GNUC__) && defined(__i386) +#define XMLCALL __attribute__((cdecl)) +#else +/* For any platform which uses this definition and supports more than + one calling convention, we need to extend this definition to + declare the convention used on that platform, if it's possible to + do so. + + If this is the case for your platform, please file a bug report + with information on how to identify your platform via the C + pre-processor and how to specify the same calling convention as the + platform's malloc() implementation. +*/ +#define XMLCALL +#endif +#endif /* not defined XMLCALL */ + + +#if !defined(XML_STATIC) && !defined(XMLIMPORT) +#ifndef XML_BUILDING_EXPAT +/* using Expat from an application */ + +#ifdef XML_USE_MSC_EXTENSIONS +#define XMLIMPORT __declspec(dllimport) +#endif + +#endif +#endif /* not defined XML_STATIC */ + +/* If we didn't define it above, define it away: */ +#ifndef XMLIMPORT +#define XMLIMPORT +#endif + + +#define XMLPARSEAPI(type) XMLIMPORT type XMLCALL + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef XML_UNICODE_WCHAR_T +#define XML_UNICODE +#endif + +struct XML_ParserStruct; +typedef struct XML_ParserStruct *XML_Parser; + +#ifdef XML_UNICODE /* Information is UTF-16 encoded. */ +#ifdef XML_UNICODE_WCHAR_T +typedef wchar_t XML_Char; +typedef wchar_t XML_LChar; +#else +typedef unsigned short XML_Char; +typedef char XML_LChar; +#endif /* XML_UNICODE_WCHAR_T */ +#else /* Information is UTF-8 encoded. */ +typedef char XML_Char; +typedef char XML_LChar; +#endif /* XML_UNICODE */ + +/* Should this be defined using stdbool.h when C99 is available? */ +typedef unsigned char XML_Bool; +#define XML_TRUE ((XML_Bool) 1) +#define XML_FALSE ((XML_Bool) 0) + +/* The XML_Status enum gives the possible return values for several + API functions. The preprocessor #defines are included so this + stanza can be added to code that still needs to support older + versions of Expat 1.95.x: + + #ifndef XML_STATUS_OK + #define XML_STATUS_OK 1 + #define XML_STATUS_ERROR 0 + #endif + + Otherwise, the #define hackery is quite ugly and would have been + dropped. +*/ +enum XML_Status { + XML_STATUS_ERROR = 0, +#define XML_STATUS_ERROR XML_STATUS_ERROR + XML_STATUS_OK = 1, +#define XML_STATUS_OK XML_STATUS_OK + XML_STATUS_SUSPENDED = 2, +#define XML_STATUS_SUSPENDED XML_STATUS_SUSPENDED +}; + +enum XML_Error { + XML_ERROR_NONE, + XML_ERROR_NO_MEMORY, + XML_ERROR_SYNTAX, + XML_ERROR_NO_ELEMENTS, + XML_ERROR_INVALID_TOKEN, + XML_ERROR_UNCLOSED_TOKEN, + XML_ERROR_PARTIAL_CHAR, + XML_ERROR_TAG_MISMATCH, + XML_ERROR_DUPLICATE_ATTRIBUTE, + XML_ERROR_JUNK_AFTER_DOC_ELEMENT, + XML_ERROR_PARAM_ENTITY_REF, + XML_ERROR_UNDEFINED_ENTITY, + XML_ERROR_RECURSIVE_ENTITY_REF, + XML_ERROR_ASYNC_ENTITY, + XML_ERROR_BAD_CHAR_REF, + XML_ERROR_BINARY_ENTITY_REF, + XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF, + XML_ERROR_MISPLACED_XML_PI, + XML_ERROR_UNKNOWN_ENCODING, + XML_ERROR_INCORRECT_ENCODING, + XML_ERROR_UNCLOSED_CDATA_SECTION, + XML_ERROR_EXTERNAL_ENTITY_HANDLING, + XML_ERROR_NOT_STANDALONE, + XML_ERROR_UNEXPECTED_STATE, + XML_ERROR_ENTITY_DECLARED_IN_PE, + XML_ERROR_FEATURE_REQUIRES_XML_DTD, + XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING, + XML_ERROR_UNBOUND_PREFIX, + XML_ERROR_SUSPENDED, + XML_ERROR_NOT_SUSPENDED, + XML_ERROR_ABORTED, + XML_ERROR_FINISHED, + XML_ERROR_SUSPEND_PE +}; + +enum XML_Content_Type { + XML_CTYPE_EMPTY = 1, + XML_CTYPE_ANY, + XML_CTYPE_MIXED, + XML_CTYPE_NAME, + XML_CTYPE_CHOICE, + XML_CTYPE_SEQ +}; + +enum XML_Content_Quant { + XML_CQUANT_NONE, + XML_CQUANT_OPT, + XML_CQUANT_REP, + XML_CQUANT_PLUS +}; + +/* If type == XML_CTYPE_EMPTY or XML_CTYPE_ANY, then quant will be + XML_CQUANT_NONE, and the other fields will be zero or NULL. + If type == XML_CTYPE_MIXED, then quant will be NONE or REP and + numchildren will contain number of elements that may be mixed in + and children point to an array of XML_Content cells that will be + all of XML_CTYPE_NAME type with no quantification. + + If type == XML_CTYPE_NAME, then the name points to the name, and + the numchildren field will be zero and children will be NULL. The + quant fields indicates any quantifiers placed on the name. + + CHOICE and SEQ will have name NULL, the number of children in + numchildren and children will point, recursively, to an array + of XML_Content cells. + + The EMPTY, ANY, and MIXED types will only occur at top level. +*/ + +typedef struct XML_cp XML_Content; + +struct XML_cp { + enum XML_Content_Type type; + enum XML_Content_Quant quant; + XML_Char * name; + unsigned int numchildren; + XML_Content * children; +}; + + +/* This is called for an element declaration. See above for + description of the model argument. It's the caller's responsibility + to free model when finished with it. +*/ +typedef void (XMLCALL *XML_ElementDeclHandler) (void *userData, + const XML_Char *name, + XML_Content *model); + +XMLPARSEAPI(void) +XML_SetElementDeclHandler(XML_Parser parser, + XML_ElementDeclHandler eldecl); + +/* The Attlist declaration handler is called for *each* attribute. So + a single Attlist declaration with multiple attributes declared will + generate multiple calls to this handler. The "default" parameter + may be NULL in the case of the "#IMPLIED" or "#REQUIRED" + keyword. The "isrequired" parameter will be true and the default + value will be NULL in the case of "#REQUIRED". If "isrequired" is + true and default is non-NULL, then this is a "#FIXED" default. +*/ +typedef void (XMLCALL *XML_AttlistDeclHandler) ( + void *userData, + const XML_Char *elname, + const XML_Char *attname, + const XML_Char *att_type, + const XML_Char *dflt, + int isrequired); + +XMLPARSEAPI(void) +XML_SetAttlistDeclHandler(XML_Parser parser, + XML_AttlistDeclHandler attdecl); + +/* The XML declaration handler is called for *both* XML declarations + and text declarations. The way to distinguish is that the version + parameter will be NULL for text declarations. The encoding + parameter may be NULL for XML declarations. The standalone + parameter will be -1, 0, or 1 indicating respectively that there + was no standalone parameter in the declaration, that it was given + as no, or that it was given as yes. +*/ +typedef void (XMLCALL *XML_XmlDeclHandler) (void *userData, + const XML_Char *version, + const XML_Char *encoding, + int standalone); + +XMLPARSEAPI(void) +XML_SetXmlDeclHandler(XML_Parser parser, + XML_XmlDeclHandler xmldecl); + + +typedef struct { + void *(XMLCALL *malloc_fcn)(size_t size); + void *(XMLCALL *realloc_fcn)(void *ptr, size_t size); + void (XMLCALL *free_fcn)(void *ptr); +} XML_Memory_Handling_Suite; + +/* Constructs a new parser; encoding is the encoding specified by the + external protocol or NULL if there is none specified. +*/ +XMLPARSEAPI(XML_Parser) +XML_ParserCreate(const XML_Char *encoding); + +/* Constructs a new parser and namespace processor. Element type + names and attribute names that belong to a namespace will be + expanded; unprefixed attribute names are never expanded; unprefixed + element type names are expanded only if there is a default + namespace. The expanded name is the concatenation of the namespace + URI, the namespace separator character, and the local part of the + name. If the namespace separator is '\0' then the namespace URI + and the local part will be concatenated without any separator. + When a namespace is not declared, the name and prefix will be + passed through without expansion. +*/ +XMLPARSEAPI(XML_Parser) +XML_ParserCreateNS(const XML_Char *encoding, XML_Char namespaceSeparator); + + +/* Constructs a new parser using the memory management suite referred to + by memsuite. If memsuite is NULL, then use the standard library memory + suite. If namespaceSeparator is non-NULL it creates a parser with + namespace processing as described above. The character pointed at + will serve as the namespace separator. + + All further memory operations used for the created parser will come from + the given suite. +*/ +XMLPARSEAPI(XML_Parser) +XML_ParserCreate_MM(const XML_Char *encoding, + const XML_Memory_Handling_Suite *memsuite, + const XML_Char *namespaceSeparator); + +/* Prepare a parser object to be re-used. This is particularly + valuable when memory allocation overhead is disproportionatly high, + such as when a large number of small documnents need to be parsed. + All handlers are cleared from the parser, except for the + unknownEncodingHandler. The parser's external state is re-initialized + except for the values of ns and ns_triplets. + + Added in Expat 1.95.3. +*/ +XMLPARSEAPI(XML_Bool) +XML_ParserReset(XML_Parser parser, const XML_Char *encoding); + +/* atts is array of name/value pairs, terminated by 0; + names and values are 0 terminated. +*/ +typedef void (XMLCALL *XML_StartElementHandler) (void *userData, + const XML_Char *name, + const XML_Char **atts); + +typedef void (XMLCALL *XML_EndElementHandler) (void *userData, + const XML_Char *name); + + +/* s is not 0 terminated. */ +typedef void (XMLCALL *XML_CharacterDataHandler) (void *userData, + const XML_Char *s, + int len); + +/* target and data are 0 terminated */ +typedef void (XMLCALL *XML_ProcessingInstructionHandler) ( + void *userData, + const XML_Char *target, + const XML_Char *data); + +/* data is 0 terminated */ +typedef void (XMLCALL *XML_CommentHandler) (void *userData, + const XML_Char *data); + +typedef void (XMLCALL *XML_StartCdataSectionHandler) (void *userData); +typedef void (XMLCALL *XML_EndCdataSectionHandler) (void *userData); + +/* This is called for any characters in the XML document for which + there is no applicable handler. This includes both characters that + are part of markup which is of a kind that is not reported + (comments, markup declarations), or characters that are part of a + construct which could be reported but for which no handler has been + supplied. The characters are passed exactly as they were in the XML + document except that they will be encoded in UTF-8 or UTF-16. + Line boundaries are not normalized. Note that a byte order mark + character is not passed to the default handler. There are no + guarantees about how characters are divided between calls to the + default handler: for example, a comment might be split between + multiple calls. +*/ +typedef void (XMLCALL *XML_DefaultHandler) (void *userData, + const XML_Char *s, + int len); + +/* This is called for the start of the DOCTYPE declaration, before + any DTD or internal subset is parsed. +*/ +typedef void (XMLCALL *XML_StartDoctypeDeclHandler) ( + void *userData, + const XML_Char *doctypeName, + const XML_Char *sysid, + const XML_Char *pubid, + int has_internal_subset); + +/* This is called for the start of the DOCTYPE declaration when the + closing > is encountered, but after processing any external + subset. +*/ +typedef void (XMLCALL *XML_EndDoctypeDeclHandler)(void *userData); + +/* This is called for entity declarations. The is_parameter_entity + argument will be non-zero if the entity is a parameter entity, zero + otherwise. + + For internal entities (<!ENTITY foo "bar">), value will + be non-NULL and systemId, publicID, and notationName will be NULL. + The value string is NOT nul-terminated; the length is provided in + the value_length argument. Since it is legal to have zero-length + values, do not use this argument to test for internal entities. + + For external entities, value will be NULL and systemId will be + non-NULL. The publicId argument will be NULL unless a public + identifier was provided. The notationName argument will have a + non-NULL value only for unparsed entity declarations. + + Note that is_parameter_entity can't be changed to XML_Bool, since + that would break binary compatibility. +*/ +typedef void (XMLCALL *XML_EntityDeclHandler) ( + void *userData, + const XML_Char *entityName, + int is_parameter_entity, + const XML_Char *value, + int value_length, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId, + const XML_Char *notationName); + +XMLPARSEAPI(void) +XML_SetEntityDeclHandler(XML_Parser parser, + XML_EntityDeclHandler handler); + +/* OBSOLETE -- OBSOLETE -- OBSOLETE + This handler has been superceded by the EntityDeclHandler above. + It is provided here for backward compatibility. + + This is called for a declaration of an unparsed (NDATA) entity. + The base argument is whatever was set by XML_SetBase. The + entityName, systemId and notationName arguments will never be + NULL. The other arguments may be. +*/ +typedef void (XMLCALL *XML_UnparsedEntityDeclHandler) ( + void *userData, + const XML_Char *entityName, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId, + const XML_Char *notationName); + +/* This is called for a declaration of notation. The base argument is + whatever was set by XML_SetBase. The notationName will never be + NULL. The other arguments can be. +*/ +typedef void (XMLCALL *XML_NotationDeclHandler) ( + void *userData, + const XML_Char *notationName, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId); + +/* When namespace processing is enabled, these are called once for + each namespace declaration. The call to the start and end element + handlers occur between the calls to the start and end namespace + declaration handlers. For an xmlns attribute, prefix will be + NULL. For an xmlns="" attribute, uri will be NULL. +*/ +typedef void (XMLCALL *XML_StartNamespaceDeclHandler) ( + void *userData, + const XML_Char *prefix, + const XML_Char *uri); + +typedef void (XMLCALL *XML_EndNamespaceDeclHandler) ( + void *userData, + const XML_Char *prefix); + +/* This is called if the document is not standalone, that is, it has an + external subset or a reference to a parameter entity, but does not + have standalone="yes". If this handler returns XML_STATUS_ERROR, + then processing will not continue, and the parser will return a + XML_ERROR_NOT_STANDALONE error. + If parameter entity parsing is enabled, then in addition to the + conditions above this handler will only be called if the referenced + entity was actually read. +*/ +typedef int (XMLCALL *XML_NotStandaloneHandler) (void *userData); + +/* This is called for a reference to an external parsed general + entity. The referenced entity is not automatically parsed. The + application can parse it immediately or later using + XML_ExternalEntityParserCreate. + + The parser argument is the parser parsing the entity containing the + reference; it can be passed as the parser argument to + XML_ExternalEntityParserCreate. The systemId argument is the + system identifier as specified in the entity declaration; it will + not be NULL. + + The base argument is the system identifier that should be used as + the base for resolving systemId if systemId was relative; this is + set by XML_SetBase; it may be NULL. + + The publicId argument is the public identifier as specified in the + entity declaration, or NULL if none was specified; the whitespace + in the public identifier will have been normalized as required by + the XML spec. + + The context argument specifies the parsing context in the format + expected by the context argument to XML_ExternalEntityParserCreate; + context is valid only until the handler returns, so if the + referenced entity is to be parsed later, it must be copied. + context is NULL only when the entity is a parameter entity. + + The handler should return XML_STATUS_ERROR if processing should not + continue because of a fatal error in the handling of the external + entity. In this case the calling parser will return an + XML_ERROR_EXTERNAL_ENTITY_HANDLING error. + + Note that unlike other handlers the first argument is the parser, + not userData. +*/ +typedef int (XMLCALL *XML_ExternalEntityRefHandler) ( + XML_Parser parser, + const XML_Char *context, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId); + +/* This is called in two situations: + 1) An entity reference is encountered for which no declaration + has been read *and* this is not an error. + 2) An internal entity reference is read, but not expanded, because + XML_SetDefaultHandler has been called. + Note: skipped parameter entities in declarations and skipped general + entities in attribute values cannot be reported, because + the event would be out of sync with the reporting of the + declarations or attribute values +*/ +typedef void (XMLCALL *XML_SkippedEntityHandler) ( + void *userData, + const XML_Char *entityName, + int is_parameter_entity); + +/* This structure is filled in by the XML_UnknownEncodingHandler to + provide information to the parser about encodings that are unknown + to the parser. + + The map[b] member gives information about byte sequences whose + first byte is b. + + If map[b] is c where c is >= 0, then b by itself encodes the + Unicode scalar value c. + + If map[b] is -1, then the byte sequence is malformed. + + If map[b] is -n, where n >= 2, then b is the first byte of an + n-byte sequence that encodes a single Unicode scalar value. + + The data member will be passed as the first argument to the convert + function. + + The convert function is used to convert multibyte sequences; s will + point to a n-byte sequence where map[(unsigned char)*s] == -n. The + convert function must return the Unicode scalar value represented + by this byte sequence or -1 if the byte sequence is malformed. + + The convert function may be NULL if the encoding is a single-byte + encoding, that is if map[b] >= -1 for all bytes b. + + When the parser is finished with the encoding, then if release is + not NULL, it will call release passing it the data member; once + release has been called, the convert function will not be called + again. + + Expat places certain restrictions on the encodings that are supported + using this mechanism. + + 1. Every ASCII character that can appear in a well-formed XML document, + other than the characters + + $@\^`{}~ + + must be represented by a single byte, and that byte must be the + same byte that represents that character in ASCII. + + 2. No character may require more than 4 bytes to encode. + + 3. All characters encoded must have Unicode scalar values <= + 0xFFFF, (i.e., characters that would be encoded by surrogates in + UTF-16 are not allowed). Note that this restriction doesn't + apply to the built-in support for UTF-8 and UTF-16. + + 4. No Unicode character may be encoded by more than one distinct + sequence of bytes. +*/ +typedef struct { + int map[256]; + void *data; + int (XMLCALL *convert)(void *data, const char *s); + void (XMLCALL *release)(void *data); +} XML_Encoding; + +/* This is called for an encoding that is unknown to the parser. + + The encodingHandlerData argument is that which was passed as the + second argument to XML_SetUnknownEncodingHandler. + + The name argument gives the name of the encoding as specified in + the encoding declaration. + + If the callback can provide information about the encoding, it must + fill in the XML_Encoding structure, and return XML_STATUS_OK. + Otherwise it must return XML_STATUS_ERROR. + + If info does not describe a suitable encoding, then the parser will + return an XML_UNKNOWN_ENCODING error. +*/ +typedef int (XMLCALL *XML_UnknownEncodingHandler) ( + void *encodingHandlerData, + const XML_Char *name, + XML_Encoding *info); + +XMLPARSEAPI(void) +XML_SetElementHandler(XML_Parser parser, + XML_StartElementHandler start, + XML_EndElementHandler end); + +XMLPARSEAPI(void) +XML_SetStartElementHandler(XML_Parser parser, + XML_StartElementHandler handler); + +XMLPARSEAPI(void) +XML_SetEndElementHandler(XML_Parser parser, + XML_EndElementHandler handler); + +XMLPARSEAPI(void) +XML_SetCharacterDataHandler(XML_Parser parser, + XML_CharacterDataHandler handler); + +XMLPARSEAPI(void) +XML_SetProcessingInstructionHandler(XML_Parser parser, + XML_ProcessingInstructionHandler handler); +XMLPARSEAPI(void) +XML_SetCommentHandler(XML_Parser parser, + XML_CommentHandler handler); + +XMLPARSEAPI(void) +XML_SetCdataSectionHandler(XML_Parser parser, + XML_StartCdataSectionHandler start, + XML_EndCdataSectionHandler end); + +XMLPARSEAPI(void) +XML_SetStartCdataSectionHandler(XML_Parser parser, + XML_StartCdataSectionHandler start); + +XMLPARSEAPI(void) +XML_SetEndCdataSectionHandler(XML_Parser parser, + XML_EndCdataSectionHandler end); + +/* This sets the default handler and also inhibits expansion of + internal entities. These entity references will be passed to the + default handler, or to the skipped entity handler, if one is set. +*/ +XMLPARSEAPI(void) +XML_SetDefaultHandler(XML_Parser parser, + XML_DefaultHandler handler); + +/* This sets the default handler but does not inhibit expansion of + internal entities. The entity reference will not be passed to the + default handler. +*/ +XMLPARSEAPI(void) +XML_SetDefaultHandlerExpand(XML_Parser parser, + XML_DefaultHandler handler); + +XMLPARSEAPI(void) +XML_SetDoctypeDeclHandler(XML_Parser parser, + XML_StartDoctypeDeclHandler start, + XML_EndDoctypeDeclHandler end); + +XMLPARSEAPI(void) +XML_SetStartDoctypeDeclHandler(XML_Parser parser, + XML_StartDoctypeDeclHandler start); + +XMLPARSEAPI(void) +XML_SetEndDoctypeDeclHandler(XML_Parser parser, + XML_EndDoctypeDeclHandler end); + +XMLPARSEAPI(void) +XML_SetUnparsedEntityDeclHandler(XML_Parser parser, + XML_UnparsedEntityDeclHandler handler); + +XMLPARSEAPI(void) +XML_SetNotationDeclHandler(XML_Parser parser, + XML_NotationDeclHandler handler); + +XMLPARSEAPI(void) +XML_SetNamespaceDeclHandler(XML_Parser parser, + XML_StartNamespaceDeclHandler start, + XML_EndNamespaceDeclHandler end); + +XMLPARSEAPI(void) +XML_SetStartNamespaceDeclHandler(XML_Parser parser, + XML_StartNamespaceDeclHandler start); + +XMLPARSEAPI(void) +XML_SetEndNamespaceDeclHandler(XML_Parser parser, + XML_EndNamespaceDeclHandler end); + +XMLPARSEAPI(void) +XML_SetNotStandaloneHandler(XML_Parser parser, + XML_NotStandaloneHandler handler); + +XMLPARSEAPI(void) +XML_SetExternalEntityRefHandler(XML_Parser parser, + XML_ExternalEntityRefHandler handler); + +/* If a non-NULL value for arg is specified here, then it will be + passed as the first argument to the external entity ref handler + instead of the parser object. +*/ +XMLPARSEAPI(void) +XML_SetExternalEntityRefHandlerArg(XML_Parser parser, + void *arg); + +XMLPARSEAPI(void) +XML_SetSkippedEntityHandler(XML_Parser parser, + XML_SkippedEntityHandler handler); + +XMLPARSEAPI(void) +XML_SetUnknownEncodingHandler(XML_Parser parser, + XML_UnknownEncodingHandler handler, + void *encodingHandlerData); + +/* This can be called within a handler for a start element, end + element, processing instruction or character data. It causes the + corresponding markup to be passed to the default handler. +*/ +XMLPARSEAPI(void) +XML_DefaultCurrent(XML_Parser parser); + +/* If do_nst is non-zero, and namespace processing is in effect, and + a name has a prefix (i.e. an explicit namespace qualifier) then + that name is returned as a triplet in a single string separated by + the separator character specified when the parser was created: URI + + sep + local_name + sep + prefix. + + If do_nst is zero, then namespace information is returned in the + default manner (URI + sep + local_name) whether or not the name + has a prefix. + + Note: Calling XML_SetReturnNSTriplet after XML_Parse or + XML_ParseBuffer has no effect. +*/ + +XMLPARSEAPI(void) +XML_SetReturnNSTriplet(XML_Parser parser, int do_nst); + +/* This value is passed as the userData argument to callbacks. */ +XMLPARSEAPI(void) +XML_SetUserData(XML_Parser parser, void *userData); + +/* Returns the last value set by XML_SetUserData or NULL. */ +#define XML_GetUserData(parser) (*(void **)(parser)) + +/* This is equivalent to supplying an encoding argument to + XML_ParserCreate. On success XML_SetEncoding returns non-zero, + zero otherwise. + Note: Calling XML_SetEncoding after XML_Parse or XML_ParseBuffer + has no effect and returns XML_STATUS_ERROR. +*/ +XMLPARSEAPI(enum XML_Status) +XML_SetEncoding(XML_Parser parser, const XML_Char *encoding); + +/* If this function is called, then the parser will be passed as the + first argument to callbacks instead of userData. The userData will + still be accessible using XML_GetUserData. +*/ +XMLPARSEAPI(void) +XML_UseParserAsHandlerArg(XML_Parser parser); + +/* If useDTD == XML_TRUE is passed to this function, then the parser + will assume that there is an external subset, even if none is + specified in the document. In such a case the parser will call the + externalEntityRefHandler with a value of NULL for the systemId + argument (the publicId and context arguments will be NULL as well). + Note: If this function is called, then this must be done before + the first call to XML_Parse or XML_ParseBuffer, since it will + have no effect after that. Returns + XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING. + Note: If the document does not have a DOCTYPE declaration at all, + then startDoctypeDeclHandler and endDoctypeDeclHandler will not + be called, despite an external subset being parsed. + Note: If XML_DTD is not defined when Expat is compiled, returns + XML_ERROR_FEATURE_REQUIRES_XML_DTD. +*/ +XMLPARSEAPI(enum XML_Error) +XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD); + + +/* Sets the base to be used for resolving relative URIs in system + identifiers in declarations. Resolving relative identifiers is + left to the application: this value will be passed through as the + base argument to the XML_ExternalEntityRefHandler, + XML_NotationDeclHandler and XML_UnparsedEntityDeclHandler. The base + argument will be copied. Returns XML_STATUS_ERROR if out of memory, + XML_STATUS_OK otherwise. +*/ +XMLPARSEAPI(enum XML_Status) +XML_SetBase(XML_Parser parser, const XML_Char *base); + +XMLPARSEAPI(const XML_Char *) +XML_GetBase(XML_Parser parser); + +/* Returns the number of the attribute/value pairs passed in last call + to the XML_StartElementHandler that were specified in the start-tag + rather than defaulted. Each attribute/value pair counts as 2; thus + this correspondds to an index into the atts array passed to the + XML_StartElementHandler. +*/ +XMLPARSEAPI(int) +XML_GetSpecifiedAttributeCount(XML_Parser parser); + +/* Returns the index of the ID attribute passed in the last call to + XML_StartElementHandler, or -1 if there is no ID attribute. Each + attribute/value pair counts as 2; thus this correspondds to an + index into the atts array passed to the XML_StartElementHandler. +*/ +XMLPARSEAPI(int) +XML_GetIdAttributeIndex(XML_Parser parser); + +/* Parses some input. Returns XML_STATUS_ERROR if a fatal error is + detected. The last call to XML_Parse must have isFinal true; len + may be zero for this call (or any other). + + Though the return values for these functions has always been + described as a Boolean value, the implementation, at least for the + 1.95.x series, has always returned exactly one of the XML_Status + values. +*/ +XMLPARSEAPI(enum XML_Status) +XML_Parse(XML_Parser parser, const char *s, int len, int isFinal); + +XMLPARSEAPI(void *) +XML_GetBuffer(XML_Parser parser, int len); + +XMLPARSEAPI(enum XML_Status) +XML_ParseBuffer(XML_Parser parser, int len, int isFinal); + +/* Stops parsing, causing XML_Parse() or XML_ParseBuffer() to return. + Must be called from within a call-back handler, except when aborting + (resumable = 0) an already suspended parser. Some call-backs may + still follow because they would otherwise get lost. Examples: + - endElementHandler() for empty elements when stopped in + startElementHandler(), + - endNameSpaceDeclHandler() when stopped in endElementHandler(), + and possibly others. + + Can be called from most handlers, including DTD related call-backs, + except when parsing an external parameter entity and resumable != 0. + Returns XML_STATUS_OK when successful, XML_STATUS_ERROR otherwise. + Possible error codes: + - XML_ERROR_SUSPENDED: when suspending an already suspended parser. + - XML_ERROR_FINISHED: when the parser has already finished. + - XML_ERROR_SUSPEND_PE: when suspending while parsing an external PE. + + When resumable != 0 (true) then parsing is suspended, that is, + XML_Parse() and XML_ParseBuffer() return XML_STATUS_SUSPENDED. + Otherwise, parsing is aborted, that is, XML_Parse() and XML_ParseBuffer() + return XML_STATUS_ERROR with error code XML_ERROR_ABORTED. + + *Note*: + This will be applied to the current parser instance only, that is, if + there is a parent parser then it will continue parsing when the + externalEntityRefHandler() returns. It is up to the implementation of + the externalEntityRefHandler() to call XML_StopParser() on the parent + parser (recursively), if one wants to stop parsing altogether. + + When suspended, parsing can be resumed by calling XML_ResumeParser(). +*/ +XMLPARSEAPI(enum XML_Status) +XML_StopParser(XML_Parser parser, XML_Bool resumable); + +/* Resumes parsing after it has been suspended with XML_StopParser(). + Must not be called from within a handler call-back. Returns same + status codes as XML_Parse() or XML_ParseBuffer(). + Additional error code XML_ERROR_NOT_SUSPENDED possible. + + *Note*: + This must be called on the most deeply nested child parser instance + first, and on its parent parser only after the child parser has finished, + to be applied recursively until the document entity's parser is restarted. + That is, the parent parser will not resume by itself and it is up to the + application to call XML_ResumeParser() on it at the appropriate moment. +*/ +XMLPARSEAPI(enum XML_Status) +XML_ResumeParser(XML_Parser parser); + +enum XML_Parsing { + XML_INITIALIZED, + XML_PARSING, + XML_FINISHED, + XML_SUSPENDED +}; + +typedef struct { + enum XML_Parsing parsing; + XML_Bool finalBuffer; +} XML_ParsingStatus; + +/* Returns status of parser with respect to being initialized, parsing, + finished, or suspended and processing the final buffer. + XXX XML_Parse() and XML_ParseBuffer() should return XML_ParsingStatus, + XXX with XML_FINISHED_OK or XML_FINISHED_ERROR replacing XML_FINISHED +*/ +XMLPARSEAPI(void) +XML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status); + +/* Creates an XML_Parser object that can parse an external general + entity; context is a '\0'-terminated string specifying the parse + context; encoding is a '\0'-terminated string giving the name of + the externally specified encoding, or NULL if there is no + externally specified encoding. The context string consists of a + sequence of tokens separated by formfeeds (\f); a token consisting + of a name specifies that the general entity of the name is open; a + token of the form prefix=uri specifies the namespace for a + particular prefix; a token of the form =uri specifies the default + namespace. This can be called at any point after the first call to + an ExternalEntityRefHandler so longer as the parser has not yet + been freed. The new parser is completely independent and may + safely be used in a separate thread. The handlers and userData are + initialized from the parser argument. Returns NULL if out of memory. + Otherwise returns a new XML_Parser object. +*/ +XMLPARSEAPI(XML_Parser) +XML_ExternalEntityParserCreate(XML_Parser parser, + const XML_Char *context, + const XML_Char *encoding); + +enum XML_ParamEntityParsing { + XML_PARAM_ENTITY_PARSING_NEVER, + XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE, + XML_PARAM_ENTITY_PARSING_ALWAYS +}; + +/* Controls parsing of parameter entities (including the external DTD + subset). If parsing of parameter entities is enabled, then + references to external parameter entities (including the external + DTD subset) will be passed to the handler set with + XML_SetExternalEntityRefHandler. The context passed will be 0. + + Unlike external general entities, external parameter entities can + only be parsed synchronously. If the external parameter entity is + to be parsed, it must be parsed during the call to the external + entity ref handler: the complete sequence of + XML_ExternalEntityParserCreate, XML_Parse/XML_ParseBuffer and + XML_ParserFree calls must be made during this call. After + XML_ExternalEntityParserCreate has been called to create the parser + for the external parameter entity (context must be 0 for this + call), it is illegal to make any calls on the old parser until + XML_ParserFree has been called on the newly created parser. + If the library has been compiled without support for parameter + entity parsing (ie without XML_DTD being defined), then + XML_SetParamEntityParsing will return 0 if parsing of parameter + entities is requested; otherwise it will return non-zero. + Note: If XML_SetParamEntityParsing is called after XML_Parse or + XML_ParseBuffer, then it has no effect and will always return 0. +*/ +XMLPARSEAPI(int) +XML_SetParamEntityParsing(XML_Parser parser, + enum XML_ParamEntityParsing parsing); + +/* If XML_Parse or XML_ParseBuffer have returned XML_STATUS_ERROR, then + XML_GetErrorCode returns information about the error. +*/ +XMLPARSEAPI(enum XML_Error) +XML_GetErrorCode(XML_Parser parser); + +/* These functions return information about the current parse + location. They may be called from any callback called to report + some parse event; in this case the location is the location of the + first of the sequence of characters that generated the event. When + called from callbacks generated by declarations in the document + prologue, the location identified isn't as neatly defined, but will + be within the relevant markup. When called outside of the callback + functions, the position indicated will be just past the last parse + event (regardless of whether there was an associated callback). + + They may also be called after returning from a call to XML_Parse + or XML_ParseBuffer. If the return value is XML_STATUS_ERROR then + the location is the location of the character at which the error + was detected; otherwise the location is the location of the last + parse event, as described above. +*/ +XMLPARSEAPI(int) XML_GetCurrentLineNumber(XML_Parser parser); +XMLPARSEAPI(int) XML_GetCurrentColumnNumber(XML_Parser parser); +XMLPARSEAPI(long) XML_GetCurrentByteIndex(XML_Parser parser); + +/* Return the number of bytes in the current event. + Returns 0 if the event is in an internal entity. +*/ +XMLPARSEAPI(int) +XML_GetCurrentByteCount(XML_Parser parser); + +/* If XML_CONTEXT_BYTES is defined, returns the input buffer, sets + the integer pointed to by offset to the offset within this buffer + of the current parse position, and sets the integer pointed to by size + to the size of this buffer (the number of input bytes). Otherwise + returns a NULL pointer. Also returns a NULL pointer if a parse isn't + active. + + NOTE: The character pointer returned should not be used outside + the handler that makes the call. +*/ +XMLPARSEAPI(const char *) +XML_GetInputContext(XML_Parser parser, + int *offset, + int *size); + +/* For backwards compatibility with previous versions. */ +#define XML_GetErrorLineNumber XML_GetCurrentLineNumber +#define XML_GetErrorColumnNumber XML_GetCurrentColumnNumber +#define XML_GetErrorByteIndex XML_GetCurrentByteIndex + +/* Frees the content model passed to the element declaration handler */ +XMLPARSEAPI(void) +XML_FreeContentModel(XML_Parser parser, XML_Content *model); + +/* Exposing the memory handling functions used in Expat */ +XMLPARSEAPI(void *) +XML_MemMalloc(XML_Parser parser, size_t size); + +XMLPARSEAPI(void *) +XML_MemRealloc(XML_Parser parser, void *ptr, size_t size); + +XMLPARSEAPI(void) +XML_MemFree(XML_Parser parser, void *ptr); + +/* Frees memory used by the parser. */ +XMLPARSEAPI(void) +XML_ParserFree(XML_Parser parser); + +/* Returns a string describing the error. */ +XMLPARSEAPI(const XML_LChar *) +XML_ErrorString(enum XML_Error code); + +/* Return a string containing the version number of this expat */ +XMLPARSEAPI(const XML_LChar *) +XML_ExpatVersion(void); + +typedef struct { + int major; + int minor; + int micro; +} XML_Expat_Version; + +/* Return an XML_Expat_Version structure containing numeric version + number information for this version of expat. +*/ +XMLPARSEAPI(XML_Expat_Version) +XML_ExpatVersionInfo(void); + +/* Added in Expat 1.95.5. */ +enum XML_FeatureEnum { + XML_FEATURE_END = 0, + XML_FEATURE_UNICODE, + XML_FEATURE_UNICODE_WCHAR_T, + XML_FEATURE_DTD, + XML_FEATURE_CONTEXT_BYTES, + XML_FEATURE_MIN_SIZE, + XML_FEATURE_SIZEOF_XML_CHAR, + XML_FEATURE_SIZEOF_XML_LCHAR + /* Additional features must be added to the end of this enum. */ +}; + +typedef struct { + enum XML_FeatureEnum feature; + const XML_LChar *name; + long int value; +} XML_Feature; + +XMLPARSEAPI(const XML_Feature *) +XML_GetFeatureList(void); + + +/* Expat follows the GNU/Linux convention of odd number minor version for + beta/development releases and even number minor version for stable + releases. Micro is bumped with each release, and set to 0 with each + change to major or minor version. +*/ +#define XML_MAJOR_VERSION 1 +#define XML_MINOR_VERSION 95 +#define XML_MICRO_VERSION 8 + +#ifdef __cplusplus +} +#endif + +#endif /* not XmlParse_INCLUDED */ diff --git a/reactos/subsys/system/explorer/utility/shellbrowserimpl.cpp b/reactos/subsys/system/explorer/utility/shellbrowserimpl.cpp index 1f7eb74866e..a72cb60e845 100644 --- a/reactos/subsys/system/explorer/utility/shellbrowserimpl.cpp +++ b/reactos/subsys/system/explorer/utility/shellbrowserimpl.cpp @@ -24,7 +24,7 @@ // // Martin Fuchs, 28.09.2003 // - // Credits: Thanks to Leon Finker for his explorer window example + // Credits: Thanks to Leon Finker for his explorer cabinet window example // diff --git a/reactos/subsys/system/explorer/utility/shellbrowserimpl.h b/reactos/subsys/system/explorer/utility/shellbrowserimpl.h index de3a0e80830..933a001c534 100644 --- a/reactos/subsys/system/explorer/utility/shellbrowserimpl.h +++ b/reactos/subsys/system/explorer/utility/shellbrowserimpl.h @@ -24,7 +24,7 @@ // // Martin Fuchs, 23.07.2003 // - // Credits: Thanks to Leon Finker for his explorer window example + // Credits: Thanks to Leon Finker for his explorer cabinet window example // diff --git a/reactos/subsys/system/explorer/utility/shellclasses.cpp b/reactos/subsys/system/explorer/utility/shellclasses.cpp index 3c806042685..afd648e1f7c 100644 --- a/reactos/subsys/system/explorer/utility/shellclasses.cpp +++ b/reactos/subsys/system/explorer/utility/shellclasses.cpp @@ -87,11 +87,11 @@ void HandleException(COMException& e, HWND hwnd) if (hwnd && !IsWindowVisible(hwnd)) hwnd = 0; - MessageBox(hwnd, msg, TEXT("ShellClasses COM Exception"), MB_ICONHAND|MB_OK); + MessageBox(hwnd, msg, TEXT("ShellClasses Exception"), MB_ICONHAND|MB_OK); // If displaying the error message box _with_ parent was not successfull, display it now without a parent window. if (GetLastError() == ERROR_INVALID_WINDOW_HANDLE) - MessageBox(0, msg, TEXT("ShellClasses COM Exception"), MB_ICONHAND|MB_OK); + MessageBox(0, msg, TEXT("ShellClasses Exception"), MB_ICONHAND|MB_OK); } diff --git a/reactos/subsys/system/explorer/utility/shellclasses.h b/reactos/subsys/system/explorer/utility/shellclasses.h index 4a92013c17e..d62c4d984e7 100644 --- a/reactos/subsys/system/explorer/utility/shellclasses.h +++ b/reactos/subsys/system/explorer/utility/shellclasses.h @@ -46,7 +46,7 @@ using namespace _com_util; #endif - // COM Exception Handling + // Exception Handling #ifndef _NO_COMUTIL @@ -78,7 +78,7 @@ struct COMExceptionBase LocalFree(pBuf); } else { TCHAR buffer[128]; - _stprintf(buffer, TEXT("unknown COM Exception: 0x%08X"), _hr); + _stprintf(buffer, TEXT("unknown Exception: 0x%08X"), _hr); _msg = buffer; } } @@ -94,7 +94,7 @@ protected: #endif - /// COM Exception with context information + /// Exception with context information struct COMException : public COMExceptionBase { diff --git a/reactos/subsys/system/explorer/utility/utility.h b/reactos/subsys/system/explorer/utility/utility.h index 36d11da1a39..4ef04b7041b 100644 --- a/reactos/subsys/system/explorer/utility/utility.h +++ b/reactos/subsys/system/explorer/utility/utility.h @@ -42,8 +42,8 @@ #ifndef _MSC_VER #include <objbase.h> -#include <oleauto.h> // for VARIANT #endif +#include <oleauto.h> // for VARIANT #include <malloc.h> // for alloca() #include <assert.h> @@ -70,7 +70,7 @@ extern "C" { #define COUNTOF(x) (sizeof(x)/sizeof(x[0])) -#define BUFFER_LEN 1024 +#define BUFFER_LEN 2048 extern void _log_(LPCTSTR txt); @@ -766,6 +766,12 @@ struct String operator LPCTSTR() const {return c_str();} +#ifdef UNICODE + operator string() const {char b[BUFFER_LEN]; return string(b, WideCharToMultiByte(CP_ACP, 0, c_str(), -1, b, BUFFER_LEN, 0, 0));} +#else + operator wstring() const {WCHAR b[BUFFER_LEN]; return wstring(b, MultiByteToWideChar(CP_ACP, 0, c_str(), -1, b, BUFFER_LEN));} +#endif + String& printf(LPCTSTR fmt, ...) { va_list l; diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.cpp b/reactos/subsys/system/explorer/utility/xmlstorage.cpp new file mode 100644 index 00000000000..61796cead60 --- /dev/null +++ b/reactos/subsys/system/explorer/utility/xmlstorage.cpp @@ -0,0 +1,108 @@ +/* + * Copyright 2004 Martin Fuchs + * + * 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 + */ + + + // + // XML storage classes + // + // xmlstorage.cpp + // + // Martin Fuchs, 22.03.2004 + // + + +#include "utility.h" + +#include "xmlstorage.h" + + +void xml_test() //@@ +{ + XMLDoc doc; + + doc.read("explorer-cfg.xml"); + doc.write("out.xml"); + + XMLPos pos(&doc); + + if (pos.go("\\explorer-cfg\\startmenu")) { + + pos.back(); + } +} + + + /// move X-Path like to position in XML tree +bool XMLPos::go(const char* path) +{ + + ///@todo + + return false; +} + + + /// store XML version and encoding into XML reader +void XMLCALL XMLReader::XML_XmlDeclHandler(void* userData, const XML_Char* version, const XML_Char* encoding, int standalone) +{ + XMLReader* pThis = (XMLReader*) userData; + + if (version) { + pThis->_xml_version = version; + pThis->_encoding = encoding; + } +} + + /// notifications about XML tag start +void XMLCALL XMLReader::XML_StartElementHandler(void* userData, const XML_Char* name, const XML_Char** atts) +{ + XMLReader* pThis = (XMLReader*) userData; + XMLNode* node = new XMLNode(name); + + pThis->_pos.add_down(node); + + while(*atts) { + const XML_Char* name = *atts++; + const XML_Char* value = *atts++; + + (*node)[name] = value; + } + + pThis->_in_tag = true; +} + + /// notifications about XML tag end +void XMLCALL XMLReader::XML_EndElementHandler(void* userData, const XML_Char* name) +{ + XMLReader* pThis = (XMLReader*) userData; + + pThis->_pos.back(); + + pThis->_in_tag = false; +} + + /// store content, white space and comments +void XMLCALL XMLReader::XML_DefaultHandler(void* userData, const XML_Char* s, int len) +{ + XMLReader* pThis = (XMLReader*) userData; + + if (pThis->_in_tag) + pThis->_pos->append_content(s, len); + else + pThis->_pos->append_trailing(s, len); +} diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.h b/reactos/subsys/system/explorer/utility/xmlstorage.h new file mode 100644 index 00000000000..860197ea60d --- /dev/null +++ b/reactos/subsys/system/explorer/utility/xmlstorage.h @@ -0,0 +1,448 @@ +/* + * Copyright 2004 Martin Fuchs + * + * 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 + */ + + + // + // XML storage classes + // + // xmlstorage.h + // + // Martin Fuchs, 22.03.2004 + // + + +#include "expat.h" + +#include <fstream> +#include <sstream> +#include <stack> + +#ifdef _MSC_VER +#pragma comment(lib, "libexpat.lib") +#endif + + + // write XML files with 2 spaces indenting +#define XML_INDENT_SPACE " " + + + /// in memory representation of an XML node +struct XMLNode : public string +{ + typedef map<string, string> AttributeMap; + typedef list<XMLNode*> Children; + + XMLNode(const string& name) + : string(name) + { + } + + ~XMLNode() + { + while(!_children.empty()) { + delete _children.back(); + _children.pop_back(); + } + } + + /// add a new child node + void add_child(XMLNode* child) + { + _children.push_back(child); + } + + /// write access to an attribute + string& operator[](const string& attr_name) + { + return _attributes[attr_name]; + } + + /// read only access to an attribute + string operator[](const string& attr_name) const + { + AttributeMap::const_iterator found = _attributes.find(attr_name); + + if (found != _attributes.end()) + return found->second; + else + return ""; + } + + const Children& get_children() const + { + return _children; + } + + XMLNode* get_first_child() const + { + if (!_children.empty()) + return _children.front(); + else + return NULL; + } + + XMLNode* find_first(const string& name) const + { + for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) + if (**it == name) + return *it; + + return NULL; + } + + XMLNode* find_first(const string& name, const string& attr_name, const string& attr_value) const + { + for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) { + const XMLNode& node = **it; + + if (node==name && +#ifdef UNICODE + !strcmp(node[attr_name].c_str(), attr_value.c_str()) // workaround because of STL bug +#else + node[attr_name]==attr_value +#endif + ) + return *it; + } + + return NULL; + } + + void append_content(const char* s, int l) + { + if (_children.empty()) + _content.append(s, l); + else + _children.back()->_content.append(s, l); + } + + void append_trailing(const char* s, int l) + { + if (_children.empty()) + _trailing.append(s, l); + else + _children.back()->_trailing.append(s, l); + } + + /// write XML stream preserving original white space and comments + ostream& write(ostream& out) + { + out << "<" << *this; + + for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it) + out << " " << it->first << "=\"" << it->second << "\""; + + if (!_children.empty() || !_content.empty()) { + out << ">" << _content; + + for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) + (*it)->write(out); + + out << "</" << *this << ">" << _trailing; + } else { + out << "/>" << _trailing; + } + + return out; + } + + /// print write node to stream without preserving original white space + ostream& write_formating(ostream& out, int indent=0) + { + for(int i=indent; i--; ) + out << XML_INDENT_SPACE; + + out << "<" << *this; + + for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it) + out << " " << it->first << "=\"" << it->second << "\""; + + if (!_children.empty()) { + out << ">\n"; + + for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) + (*it)->write_formating(out, indent+1); + + for(int i=indent; i--; ) + out << XML_INDENT_SPACE; + + out << "</" << *this << ">\n"; + } else { + out << "/>\n"; + } + + return out; + } + +protected: + Children _children; + AttributeMap _attributes; + + string _content; + string _trailing; +}; + + + /// iterator for XML trees +struct XMLPos +{ + XMLPos(XMLNode* root) + : _root(root), + _cur(root) + { + } + + /// access to current node + XMLNode* operator->() {return _cur;} + const XMLNode* operator->() const {return _cur;} + + XMLNode& operator*() {return *_cur;} + const XMLNode& operator*() const {return *_cur;} + + /// attribute access + string& operator[](const string& attr_name) {return (*_cur)[attr_name];} + string operator[](const string& attr_name) const {return (*_cur)[attr_name];} + + /// insert children when building tree + void add_down(XMLNode* child) + { + _cur->add_child(child); + go_to(child); + } + + /// go back to previous position + bool back() + { + if (!_stack.empty()) { + _cur = _stack.top(); + _stack.pop(); + return true; + } else + return false; + } + + /// go down to first child + bool go_down() + { + XMLNode* node = _cur->get_first_child(); + + if (node) { + go_to(node); + return true; + } else + return false; + } + + /// search for child and go down + bool go_down(const string& name) + { + XMLNode* node = _cur->find_first(name); + + if (node) { + go_to(node); + return true; + } else + return false; + } + + /// create node if not already existing and move to it + void create(const string& name) + { + XMLNode* node = _cur->find_first(name); + + if (node) + go_to(node); + else + add_down(new XMLNode(name)); + } + + /// search matching child node identified by key name and an attribute value + void create(const string& name, const string& attr_name, const string& attr_value) + { + XMLNode* node = _cur->find_first(name, attr_name, attr_value); + + if (node) + go_to(node); + else { + XMLNode* node = new XMLNode(name); + add_down(node); + (*node)[attr_name] = attr_value; + } + } + + bool go(const char* path); + +protected: + XMLNode* _root; + XMLNode* _cur; + stack<XMLNode*> _stack; + + /// go to specified node + void go_to(XMLNode* child) + { + _stack.push(_cur); + _cur = child; + } +}; + + +#ifdef _MSC_VER +#pragma warning(disable: 4355) +#endif + + /// XML file reader +struct XMLReader +{ + XMLReader(XMLNode* node) + : _pos(node), + _parser(XML_ParserCreate(NULL)) + { + XML_SetUserData(_parser, this); + XML_SetXmlDeclHandler(_parser, XML_XmlDeclHandler); + XML_SetElementHandler(_parser, XML_StartElementHandler, XML_EndElementHandler); + XML_SetDefaultHandler(_parser, XML_DefaultHandler); + + _in_tag = false; + } + + ~XMLReader() + { + XML_ParserFree(_parser); + } + + XML_Status read(istream& in) + { + XML_Status status = XML_STATUS_OK; + + while(in.good() && status==XML_STATUS_OK) { + char* buffer = (char*) XML_GetBuffer(_parser, BUFFER_LEN); + + in.read(buffer, BUFFER_LEN); + + status = XML_ParseBuffer(_parser, in.gcount(), false); + } + + if (status != XML_STATUS_ERROR) + status = XML_ParseBuffer(_parser, 0, true); + + /* + if (status == XML_STATUS_ERROR) + cerr << path << get_error_string(); + */ + + return status; + } + + string get_position() const + { + int line = XML_GetCurrentLineNumber(_parser); + int column = XML_GetCurrentColumnNumber(_parser); + + ostringstream out; + out << "(" << line << ") : [column " << column << "]"; + + return out.str(); + } + + string get_error_string() const + { + XML_Error error = XML_GetErrorCode(_parser); + + ostringstream out; + out << get_position() << " XML parser error #" << error << "\n"; + + return out.str(); + } + +protected: + XMLPos _pos; + XML_Parser _parser; + string _xml_version; + string _encoding; + bool _in_tag; + + static void XMLCALL XML_XmlDeclHandler(void* userData, const XML_Char* version, const XML_Char* encoding, int standalone); + static void XMLCALL XML_StartElementHandler(void* userData, const XML_Char* name, const XML_Char** atts); + static void XMLCALL XML_EndElementHandler(void* userData, const XML_Char* name); + static void XMLCALL XML_DefaultHandler(void* userData, const XML_Char* s, int len); +}; + + +struct XMLDoc : public XMLNode +{ + XMLDoc() + : XMLNode("") + { + } + + XMLDoc(const string& path) + : XMLNode("") + { + read(path); + } + + istream& read(istream& in) + { + XMLReader(this).read(in); + + return in; + } + + bool read(const string& path) + { + ifstream in(path.c_str()); + + return XMLReader(this).read(in) != XML_STATUS_ERROR; + } + + /// write XML stream preserving previous white space and comments + ostream& write(ostream& out, const string& xml_version="1.0", const string& encoding="UTF-8") + { + out << "<?xml version=\"" << xml_version << "\" encoding=\"" << encoding << "\"?>\n"; + + if (!_children.empty()) + _children.front()->write(out); + + return out; + } + + /// write XML stream with formating + ostream& write_formating(ostream& out) + { + out << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; + + if (!_children.empty()) + _children.front()->write_formating(out); + + return out; + } + + void write(const string& path, const string& xml_version="1.0", const string& encoding="UTF-8") + { + ofstream out(path.c_str()); + + write(out, xml_version); + } + + void write_formating(const string& path) + { + ofstream out(path.c_str()); + + write_formating(out); + } +}; From 10328e2c9edc20cc4f45d37a6643fe643e03489d Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 21 Mar 2004 23:44:28 +0000 Subject: [PATCH 0600/1463] install expat library svn path=/trunk/; revision=8832 --- reactos/bootdata/packages/reactos.dff | 1 + reactos/subsys/system/explorer/.cvsignore | 1 + reactos/subsys/system/explorer/Makefile | 1 + 3 files changed, 3 insertions(+) diff --git a/reactos/bootdata/packages/reactos.dff b/reactos/bootdata/packages/reactos.dff index 59a81348dea..434e7c7d32d 100755 --- a/reactos/bootdata/packages/reactos.dff +++ b/reactos/bootdata/packages/reactos.dff @@ -97,6 +97,7 @@ subsys\system\autochk\autochk.exe 1 subsys\system\cmd\cmd.exe 1 subsys\system\explorer\explorer.exe 4 subsys\system\explorer\notifyhook.dll 1 +subsys\system\explorer\libexpat.dll 1 subsys\system\format\format.exe 1 subsys\system\regedit\regedit.exe 4 subsys\system\services\services.exe 1 diff --git a/reactos/subsys/system/explorer/.cvsignore b/reactos/subsys/system/explorer/.cvsignore index a333904e49b..ac5b1cd318b 100644 --- a/reactos/subsys/system/explorer/.cvsignore +++ b/reactos/subsys/system/explorer/.cvsignore @@ -22,3 +22,4 @@ WineRelease *.plg *.suo buildno.h +notifyhook.dll diff --git a/reactos/subsys/system/explorer/Makefile b/reactos/subsys/system/explorer/Makefile index c90c82f05e3..910b51de54f 100644 --- a/reactos/subsys/system/explorer/Makefile +++ b/reactos/subsys/system/explorer/Makefile @@ -157,6 +157,7 @@ implib: install: -$(TOOLS_PATH)/rcopy $(TARGET) $(INSTALL_DIR)/$(TARGET) -$(TOOLS_PATH)/rcopy notifyhook.dll $(INSTALL_DIR)/system32/notifyhook.dll + -$(TOOLS_PATH)/rcopy libexpat.dll $(INSTALL_DIR)/system32/libexpat.dll bootcd: From c4c05052cb4ec03385814cafabd23de92e4fef0d Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Mon, 22 Mar 2004 09:05:19 +0000 Subject: [PATCH 0601/1463] - Renamed TaggedQueueing to TaggedQueuing. svn path=/trunk/; revision=8833 --- reactos/w32api/include/ddk/srb.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/w32api/include/ddk/srb.h b/reactos/w32api/include/ddk/srb.h index 93563f283b3..43648df15bb 100644 --- a/reactos/w32api/include/ddk/srb.h +++ b/reactos/w32api/include/ddk/srb.h @@ -240,7 +240,7 @@ typedef struct _PORT_CONFIGURATION_INFORMATION { BOOLEAN DemandMode; BOOLEAN MapBuffers; BOOLEAN NeedPhysicalAddresses; - BOOLEAN TaggedQueueing; + BOOLEAN TaggedQueuing; BOOLEAN AutoRequestSense; BOOLEAN MultipleRequestPerLu; BOOLEAN ReceiveEvent; @@ -372,7 +372,7 @@ typedef struct _HW_INITIALIZATION_DATA { PVOID Reserved; BOOLEAN MapBuffers; BOOLEAN NeedPhysicalAddresses; - BOOLEAN TaggedQueueing; + BOOLEAN TaggedQueuing; BOOLEAN AutoRequestSense; BOOLEAN MultipleRequestPerLu; BOOLEAN ReceiveEvent; From a3695d5fcbb0aec22063c3055f8fda60b3ddd0b9 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Mon, 22 Mar 2004 09:06:16 +0000 Subject: [PATCH 0602/1463] - Make PCI a boot driver. svn path=/trunk/; revision=8834 --- reactos/bootdata/hivesys.inf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/bootdata/hivesys.inf b/reactos/bootdata/hivesys.inf index e07cc797caa..11d2c4a1b96 100644 --- a/reactos/bootdata/hivesys.inf +++ b/reactos/bootdata/hivesys.inf @@ -357,7 +357,7 @@ HKLM,"SYSTEM\CurrentControlSet\Services\Ne20001\Parameters\Tcpip","SubnetMask",0 HKLM,"SYSTEM\CurrentControlSet\Services\Pci","ErrorControl",0x00010001,0x00000000 HKLM,"SYSTEM\CurrentControlSet\Services\Pci","Group",0x00000000,"Boot Bus Extender" HKLM,"SYSTEM\CurrentControlSet\Services\Pci","ImagePath",0x00020000,"system32\drivers\pci.sys" -HKLM,"SYSTEM\CurrentControlSet\Services\Pci","Start",0x00010001,0x00000003 +HKLM,"SYSTEM\CurrentControlSet\Services\Pci","Start",0x00010001,0x00000000 HKLM,"SYSTEM\CurrentControlSet\Services\Pci","Tag",0x00010001,0x00000002 HKLM,"SYSTEM\CurrentControlSet\Services\Pci","Type",0x00010001,0x00000001 HKLM,"SYSTEM\CurrentControlSet\Enum\Root\PCI\0000","Service",0x00000000,"Pci" From cebfd8825341a50c06d2c33e1c5ad6640d774be2 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Mon, 22 Mar 2004 14:58:56 +0000 Subject: [PATCH 0603/1463] fixed wrong rendering of clipped characters svn path=/trunk/; revision=8835 --- reactos/subsys/win32k/eng/bitblt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/eng/bitblt.c b/reactos/subsys/win32k/eng/bitblt.c index edd4835eec4..532974773d8 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.42 2004/02/24 13:27:02 weiden Exp $ +/* $Id: bitblt.c,v 1.43 2004/03/22 14:58:56 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -892,7 +892,7 @@ AlphaBltMask(SURFOBJ* Dest, g = (int)GetGValue(BrushColor); b = (int)GetBValue(BrushColor); - tMask = Mask->pvBits + MaskPoint->y * Mask->lDelta + MaskPoint->x; + tMask = Mask->pvBits + (SourcePoint->y * Mask->lDelta) + SourcePoint->x; for (j = 0; j < dy; j++) { lMask = tMask; From bcce3e20b1dadc859ea777c3f08767a841a0657e Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Mon, 22 Mar 2004 16:00:38 +0000 Subject: [PATCH 0604/1463] - Compile the VGA driver using w32api. svn path=/trunk/; revision=8836 --- reactos/drivers/video/displays/vga/makefile | 4 ++-- reactos/drivers/video/displays/vga/vgaddi.h | 2 +- reactos/drivers/video/displays/vga/vgavideo/vgavideo.c | 3 +-- reactos/drivers/video/miniport/vga/initvga.c | 3 ++- reactos/drivers/video/miniport/vga/makefile | 4 ++-- reactos/drivers/video/miniport/vga/vgamp.c | 5 +++-- reactos/drivers/video/miniport/vga/vgavideo.h | 2 +- 7 files changed, 12 insertions(+), 11 deletions(-) diff --git a/reactos/drivers/video/displays/vga/makefile b/reactos/drivers/video/displays/vga/makefile index 71bb62480a3..6b8aeb7b0ec 100644 --- a/reactos/drivers/video/displays/vga/makefile +++ b/reactos/drivers/video/displays/vga/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.1 2004/01/10 14:39:20 navaraf Exp $ +# $Id: makefile,v 1.2 2004/03/22 16:00:37 navaraf Exp $ PATH_TO_TOP = ../../../.. @@ -8,7 +8,7 @@ TARGET_TYPE = gdi_driver TARGET_NAME = vgaddi -TARGET_CFLAGS = -Wall -Werror +TARGET_CFLAGS = -Wall -Werror -D__USE_W32API MAIN_OBJECTS = \ main/enable.o diff --git a/reactos/drivers/video/displays/vga/vgaddi.h b/reactos/drivers/video/displays/vga/vgaddi.h index 47ae7ab4c55..71088babe21 100644 --- a/reactos/drivers/video/displays/vga/vgaddi.h +++ b/reactos/drivers/video/displays/vga/vgaddi.h @@ -1,6 +1,6 @@ #include <ddk/ntddk.h> #include <ddk/winddi.h> -#include <ddk/ntddvid.h> +#include <ddk/ntddvdeo.h> #define DS_SOLIDBRUSH 0x00000001 #define DS_GREYBRUSH 0x00000002 diff --git a/reactos/drivers/video/displays/vga/vgavideo/vgavideo.c b/reactos/drivers/video/displays/vga/vgavideo/vgavideo.c index eb11205c2a7..f740b797d39 100644 --- a/reactos/drivers/video/displays/vga/vgavideo/vgavideo.c +++ b/reactos/drivers/video/displays/vga/vgavideo/vgavideo.c @@ -1,5 +1,4 @@ -#include <ddk/ntddk.h> -#include <ddk/ntddvid.h> +#include <ddk/ntddvdeo.h> #include <ddk/winddi.h> #include <ntos/minmax.h> #include <stdlib.h> diff --git a/reactos/drivers/video/miniport/vga/initvga.c b/reactos/drivers/video/miniport/vga/initvga.c index b01aa64b246..8b3bf18792f 100644 --- a/reactos/drivers/video/miniport/vga/initvga.c +++ b/reactos/drivers/video/miniport/vga/initvga.c @@ -1,4 +1,5 @@ -#include <ntddk.h> +#include <ddk/miniport.h> +#include <ddk/video.h> #include "vgavideo.h" #define NDEBUG diff --git a/reactos/drivers/video/miniport/vga/makefile b/reactos/drivers/video/miniport/vga/makefile index ca8becdd80d..69cb4a11318 100644 --- a/reactos/drivers/video/miniport/vga/makefile +++ b/reactos/drivers/video/miniport/vga/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.2 2004/03/04 18:49:58 navaraf Exp $ +# $Id: makefile,v 1.3 2004/03/22 16:00:38 navaraf Exp $ PATH_TO_TOP = ../../../.. @@ -8,7 +8,7 @@ TARGET_NAME = vgamp TARGET_DDKLIBS = videoprt.a -TARGET_CFLAGS = -Werror -Wall +TARGET_CFLAGS = -Werror -Wall -D__USE_W32API TARGET_OBJECTS = \ initvga.o \ diff --git a/reactos/drivers/video/miniport/vga/vgamp.c b/reactos/drivers/video/miniport/vga/vgamp.c index e2178f006e3..4117b824f37 100644 --- a/reactos/drivers/video/miniport/vga/vgamp.c +++ b/reactos/drivers/video/miniport/vga/vgamp.c @@ -3,8 +3,9 @@ * */ -#include <ddk/ntddk.h> -#include <ddk/ntddvid.h> +#include <ddk/miniport.h> +#include <ddk/video.h> +#include <ddk/ntddvdeo.h> #define UNIMPLEMENTED do {DbgPrint("%s:%d: Function not implemented", __FILE__, __LINE__); for(;;);} while (0) diff --git a/reactos/drivers/video/miniport/vga/vgavideo.h b/reactos/drivers/video/miniport/vga/vgavideo.h index 27fce45dedb..d4cdfea085c 100644 --- a/reactos/drivers/video/miniport/vga/vgavideo.h +++ b/reactos/drivers/video/miniport/vga/vgavideo.h @@ -1,5 +1,5 @@ #include <ddk/ntddk.h> -#include <ddk/ntddvid.h> +#include <ddk/ntddvdeo.h> #define VGA_NORMAL 0 #define VGA_AND 8 From ccecaee56df4fd39886fa631efe3de084658b214 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Mon, 22 Mar 2004 19:59:31 +0000 Subject: [PATCH 0605/1463] - Added allocation of SrbExtension. - Correctly set ConfigInfo->BusInterruptVector. - Corrected the INQUIRY request. svn path=/trunk/; revision=8837 --- reactos/drivers/storage/scsiport/scsiport.c | 68 +++++++++------------ 1 file changed, 28 insertions(+), 40 deletions(-) diff --git a/reactos/drivers/storage/scsiport/scsiport.c b/reactos/drivers/storage/scsiport/scsiport.c index 49efe04bca6..5e3b7454164 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.47 2004/02/29 11:19:21 hbirr Exp $ +/* $Id: scsiport.c,v 1.48 2004/03/22 19:59:31 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -33,7 +33,7 @@ #include <ddk/ntddscsi.h> #include <rosrtl/string.h> -#define NDEBUG +//#define NDEBUG #include <debug.h> @@ -41,7 +41,7 @@ #include "scsiport_int.h" -//#define USE_DEVICE_QUEUES +/* #define USE_DEVICE_QUEUES */ /* TYPES *********************************************************************/ @@ -567,7 +567,8 @@ ScsiPortGetUncachedExtension(IN PVOID HwDeviceExtension, } /* Allocate a common DMA buffer */ - DeviceExtension->CommonBufferLength = NumberOfBytes; + DeviceExtension->CommonBufferLength = + NumberOfBytes + DeviceExtension->SrbExtensionSize; DeviceExtension->VirtualAddress = HalAllocateCommonBuffer(DeviceExtension->AdapterObject, DeviceExtension->CommonBufferLength, @@ -580,7 +581,8 @@ ScsiPortGetUncachedExtension(IN PVOID HwDeviceExtension, return NULL; } - return DeviceExtension->VirtualAddress; + return (PVOID)((ULONG_PTR)DeviceExtension->VirtualAddress + + DeviceExtension->SrbExtensionSize); } @@ -683,11 +685,10 @@ ScsiPortInitialize(IN PVOID Argument1, return(STATUS_INVALID_PARAMETER); DriverObject->DriverStartIo = ScsiPortStartIo; - DriverObject->MajorFunction[IRP_MJ_CREATE] = (PDRIVER_DISPATCH)ScsiPortCreateClose; - DriverObject->MajorFunction[IRP_MJ_CLOSE] = (PDRIVER_DISPATCH)ScsiPortCreateClose; - DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = (PDRIVER_DISPATCH)ScsiPortDeviceControl; - DriverObject->MajorFunction[IRP_MJ_SCSI] = (PDRIVER_DISPATCH)ScsiPortDispatchScsi; - + DriverObject->MajorFunction[IRP_MJ_CREATE] = ScsiPortCreateClose; + DriverObject->MajorFunction[IRP_MJ_CLOSE] = ScsiPortCreateClose; + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ScsiPortDeviceControl; + DriverObject->MajorFunction[IRP_MJ_SCSI] = ScsiPortDispatchScsi; SystemConfig = IoGetConfigurationInformation(); @@ -790,8 +791,6 @@ ScsiPortInitialize(IN PVOID Argument1, PortConfig->Length = sizeof(PORT_CONFIGURATION_INFORMATION); PortConfig->SystemIoBusNumber = BusNumber; PortConfig->AdapterInterfaceType = HwInitializationData->AdapterInterfaceType; -// PortConfig->BusInterruptLevel = oz_dev_pci_conf_inb (pciconfp, OZ_DEV_PCI_CONF_B_INTLINE); -// PortConfig->BusInterruptVector = ; PortConfig->InterruptMode = (PortConfig->AdapterInterfaceType == PCIBus) ? LevelSensitive : Latched; PortConfig->MaximumTransferLength = SP_UNINITIALIZED_VALUE; @@ -868,7 +867,7 @@ ScsiPortInitialize(IN PVOID Argument1, if (Result == SP_RETURN_FOUND) { - DPRINT("ScsiPortInitialize(): Found HBA!\n"); + DPRINT("ScsiPortInitialize(): Found HBA! (%x)\n", PortConfig->BusInterruptVector); /* Register an interrupt handler for this device */ MappedIrq = HalGetInterruptVector(PortConfig->AdapterInterfaceType, @@ -1238,7 +1237,8 @@ SpiGetPciConfigData (IN struct _HW_INITIALIZATION_DATA *HwInitializationData, SlotNumber.u.bits.DeviceNumber, SlotNumber.u.bits.FunctionNumber); - PortConfig->BusInterruptLevel = PciConfig.u.type0.InterruptLine; + PortConfig->BusInterruptLevel = + PortConfig->BusInterruptVector = PciConfig.u.type0.InterruptLine; PortConfig->SlotNumber = SlotNumber.u.AsULONG; /* Initialize access ranges */ @@ -1423,6 +1423,7 @@ ScsiPortDispatchScsi(IN PDEVICE_OBJECT DeviceObject, #ifdef USE_DEVICE_QUEUES if (Srb->SrbFlags & SRB_FLAGS_BYPASS_FROZEN_QUEUE) { + IoMarkIrpPending(Irp); IoStartPacket (DeviceObject, Irp, NULL, NULL); } else @@ -1437,12 +1438,14 @@ ScsiPortDispatchScsi(IN PDEVICE_OBJECT DeviceObject, Srb->QueueSortKey)) { Srb->SrbStatus = SRB_STATUS_SUCCESS; + IoMarkIrpPending(Irp); IoStartPacket (DeviceObject, Irp, NULL, NULL); } KeLowerIrql (oldIrql); } #else + IoMarkIrpPending(Irp); IoStartPacket (DeviceObject, Irp, NULL, NULL); #endif return(STATUS_PENDING); @@ -1451,6 +1454,7 @@ ScsiPortDispatchScsi(IN PDEVICE_OBJECT DeviceObject, case SRB_FUNCTION_FLUSH: if (DeviceExtension->PortConfig->CachesData == TRUE) { + IoMarkIrpPending(Irp); IoStartPacket(DeviceObject, Irp, NULL, NULL); return(STATUS_PENDING); } @@ -1623,7 +1627,7 @@ ScsiPortStartIo(IN PDEVICE_OBJECT DeviceObject, Srb->Lun); if (LunExtension == NULL) { - DPRINT("No IRP_MJ_SCSI!\n"); + DPRINT("Can't get LunExtension!\n"); Irp->IoStatus.Status = STATUS_NO_SUCH_DEVICE; Irp->IoStatus.Information = 0; IoCompleteRequest (Irp, @@ -1648,17 +1652,10 @@ ScsiPortStartIo(IN PDEVICE_OBJECT DeviceObject, Irp->IoStatus.Information = Srb->DataTransferLength; /* Allocte SRB extension */ -#if 0 if (DeviceExtension->SrbExtensionSize != 0) { - Srb->SrbExtension = ExAllocatePool (NonPagedPool, - DeviceExtension->SrbExtensionSize); - if (Srb->SrbExtension == NULL) - { - DPRINT1("Failed to allocate the SRB-Extension!\n"); - } + Srb->SrbExtension = DeviceExtension->VirtualAddress; } -#endif DeviceExtension->CurrentIrp = Irp; @@ -1668,14 +1665,6 @@ ScsiPortStartIo(IN PDEVICE_OBJECT DeviceObject, { DPRINT("Synchronization failed!\n"); -#if 0 - if (Srb->SrbExtension != NULL) - { - ExFreePool (Srb->SrbExtension); - Srb->SrbExtension = NULL; - } -#endif - Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, @@ -1900,6 +1889,7 @@ SpiScanAdapter (IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension) { PSCSI_PORT_LUN_EXTENSION LunExtension; SCSI_REQUEST_BLOCK Srb; + PCDB Cdb; ULONG Bus; ULONG Target; ULONG Lun; @@ -1913,7 +1903,11 @@ SpiScanAdapter (IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension) Srb.DataBuffer = ExAllocatePool(NonPagedPool, 256); Srb.Function = SRB_FUNCTION_EXECUTE_SCSI; Srb.DataTransferLength = 256; - Srb.Cdb[0] = SCSIOP_INQUIRY; + Srb.CdbLength = 6; + + Cdb = (PCDB) &Srb.Cdb; + + Cdb->CDB6INQUIRY.OperationCode = SCSIOP_INQUIRY; for (Bus = 0; Bus < DeviceExtension->PortConfig->NumberOfBuses; Bus++) { @@ -1928,6 +1922,8 @@ SpiScanAdapter (IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension) Srb.Lun = Lun; Srb.SrbStatus = SRB_STATUS_SUCCESS; + Cdb->CDB6INQUIRY.LogicalUnitNumber = Lun; + LunExtension = SpiAllocateLunExtension (DeviceExtension, Bus, Target, @@ -2099,14 +2095,6 @@ ScsiPortDpcForIsr(IN PKDPC Dpc, IrpStack = IoGetCurrentIrpStackLocation(DeviceExtension->CurrentIrp); Srb = IrpStack->Parameters.Scsi.Srb; -#if 0 - if (Srb->SrbExtension != NULL) - { - ExFreePool (Srb->SrbExtension); - Srb->SrbExtension = NULL; - } -#endif - if (DeviceExtension->OriginalSrb != NULL) { DPRINT("Got sense data!\n"); From d8eb783e69f322baf6fa03551c489a379a377aef Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Mon, 22 Mar 2004 20:14:29 +0000 Subject: [PATCH 0606/1463] fixed a couple of dead-locks in the region code svn path=/trunk/; revision=8838 --- reactos/include/win32k/region.h | 8 +- reactos/subsys/win32k/include/window.h | 2 + reactos/subsys/win32k/ntuser/painting.c | 11 ++- reactos/subsys/win32k/ntuser/winpos.c | 36 +++++++-- reactos/subsys/win32k/objects/cliprgn.c | 28 +++++-- reactos/subsys/win32k/objects/region.c | 101 +++++++++++++----------- 6 files changed, 117 insertions(+), 69 deletions(-) diff --git a/reactos/include/win32k/region.h b/reactos/include/win32k/region.h index 0588984b665..607bebffdc0 100644 --- a/reactos/include/win32k/region.h +++ b/reactos/include/win32k/region.h @@ -151,9 +151,9 @@ NtGdiGetRegionData(HRGN hrgn, HRGN STDCALL REGION_CropRgn(HRGN hDst, HRGN hSrc, const PRECT lpRect, PPOINT lpPt); -HRGN STDCALL UnsafeIntCreateRectRgnIndirect(CONST PRECT rc); -INT STDCALL UnsafeIntGetRgnBox(HRGN hRgn, LPRECT pRect); -HRGN FASTCALL UnsafeIntUnionRectWithRgn(HRGN hDest, CONST PRECT Rect); -BOOL FASTCALL UnsafeIntRectInRegion(HRGN hRgn, CONST LPRECT rc); +HRGN FASTCALL UnsafeIntCreateRectRgnIndirect(CONST PRECT rc); +INT FASTCALL UnsafeIntGetRgnBox(PROSRGNDATA Rgn, LPRECT pRect); +VOID FASTCALL UnsafeIntUnionRectWithRgn(PROSRGNDATA RgnDest, CONST PRECT Rect); +BOOL FASTCALL UnsafeIntRectInRegion(PROSRGNDATA Rgn, CONST LPRECT rc); #endif diff --git a/reactos/subsys/win32k/include/window.h b/reactos/subsys/win32k/include/window.h index 9a8ee46c634..aed7a412300 100644 --- a/reactos/subsys/win32k/include/window.h +++ b/reactos/subsys/win32k/include/window.h @@ -60,6 +60,8 @@ typedef struct _WINDOW_OBJECT /* Handle of region of the window to be updated. */ HANDLE UpdateRegion; HANDLE NCUpdateRegion; + /* Handle of the window region. */ + HANDLE WindowRegion; /* Lock to be held when manipulating (NC)UpdateRegion */ FAST_MUTEX UpdateLock; /* Pointer to the owning thread's message queue. */ diff --git a/reactos/subsys/win32k/ntuser/painting.c b/reactos/subsys/win32k/ntuser/painting.c index f5240746ca2..910fb6940e8 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.76 2004/03/13 17:33:53 gvg Exp $ + * $Id: painting.c,v 1.77 2004/03/22 20:14:29 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -212,12 +212,12 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags) * Clip the given region with window rectangle (or region) */ -#ifdef TODO + IntLockWindowUpdate(Window); if (!Window->WindowRegion) -#endif { HRGN hRgnWindow; + IntUnLockWindowUpdate(Window); hRgnWindow = UnsafeIntCreateRectRgnIndirect(&Window->WindowRect); NtGdiOffsetRgn(hRgnWindow, -Window->WindowRect.left, @@ -225,12 +225,11 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags) RgnType = NtGdiCombineRgn(hRgn, hRgn, hRgnWindow, RGN_AND); NtGdiDeleteObject(hRgnWindow); } -#ifdef TODO else { - RgnType = NtGdiCombineRgn(hRgn, hRgn, Window->WindowRegion, RGN_AND); + RgnType = NtGdiCombineRgn(hRgn, hRgn, Window->WindowRegion, RGN_AND); + IntUnLockWindowUpdate(Window); } -#endif /* * Save current state of pending updates diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index 041b87de0e3..c120edda7f9 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.101 2004/02/26 22:23:55 weiden Exp $ +/* $Id: winpos.c,v 1.102 2004/03/22 20:14:29 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -774,6 +774,7 @@ WinPosSetWindowPos(HWND Wnd, HWND WndInsertAfter, INT x, INT y, INT cx, WINDOWPOS WinPos; RECT NewWindowRect; RECT NewClientRect; + PROSRGNDATA VisRgn; HRGN VisBefore = NULL; HRGN VisAfter = NULL; HRGN DirtyRgn = NULL; @@ -845,13 +846,19 @@ WinPosSetWindowPos(HWND Wnd, HWND WndInsertAfter, INT x, INT y, INT cx, (SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER)) { VisBefore = VIS_ComputeVisibleRegion(Window, FALSE, FALSE, TRUE); + VisRgn = NULL; - if (VisBefore != NULL && - UnsafeIntGetRgnBox(VisBefore, &TempRect) == NULLREGION) + if (VisBefore != NULL && (VisRgn = (PROSRGNDATA)RGNDATA_LockRgn(VisBefore)) && + UnsafeIntGetRgnBox(VisRgn, &TempRect) == NULLREGION) { + RGNDATA_UnlockRgn(VisBefore); NtGdiDeleteObject(VisBefore); VisBefore = NULL; } + else if(VisRgn) + { + RGNDATA_UnlockRgn(VisBefore); + } } WvrFlags = WinPosDoNCCALCSize(Window, &WinPos, &NewWindowRect, &NewClientRect); @@ -940,13 +947,19 @@ WinPosSetWindowPos(HWND Wnd, HWND WndInsertAfter, INT x, INT y, INT cx, /* Determine the new visible region */ VisAfter = VIS_ComputeVisibleRegion(Window, FALSE, FALSE, TRUE); + VisRgn = NULL; - if (VisAfter != NULL && - UnsafeIntGetRgnBox(VisAfter, &TempRect) == NULLREGION) + if (VisAfter != NULL && (VisRgn = (PROSRGNDATA)RGNDATA_LockRgn(VisAfter)) && + UnsafeIntGetRgnBox(VisRgn, &TempRect) == NULLREGION) { + RGNDATA_UnlockRgn(VisAfter); NtGdiDeleteObject(VisAfter); VisAfter = NULL; } + else if(VisRgn) + { + RGNDATA_UnlockRgn(VisAfter); + } /* * Determine which pixels can be copied from the old window position @@ -995,15 +1008,22 @@ WinPosSetWindowPos(HWND Wnd, HWND WndInsertAfter, INT x, INT y, INT cx, * there's nothing to copy. Also, it's no use copying bits onto * themselves. */ - if (UnsafeIntGetRgnBox(CopyRgn, &CopyRect) == NULLREGION) + VisRgn = NULL; + if ((VisRgn = (PROSRGNDATA)RGNDATA_LockRgn(CopyRgn)) && + UnsafeIntGetRgnBox(VisRgn, &CopyRect) == NULLREGION) { /* Nothing to copy, clean up */ + RGNDATA_UnlockRgn(CopyRgn); NtGdiDeleteObject(CopyRgn); CopyRgn = NULL; } else if (OldWindowRect.left != NewWindowRect.left || OldWindowRect.top != NewWindowRect.top) { + if(VisRgn) + { + RGNDATA_UnlockRgn(CopyRgn); + } /* * Small trick here: there is no function to bitblt a region. So * we set the region as the clipping region, take the bounding box @@ -1026,6 +1046,10 @@ WinPosSetWindowPos(HWND Wnd, HWND WndInsertAfter, INT x, INT y, INT cx, NtUserReleaseDC(Wnd, Dc); IntValidateParent(Window, CopyRgn); } + else if(VisRgn) + { + RGNDATA_UnlockRgn(CopyRgn); + } } else { diff --git a/reactos/subsys/win32k/objects/cliprgn.c b/reactos/subsys/win32k/objects/cliprgn.c index 7be727cc1da..d7a6579f4c8 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.29 2003/12/21 18:38:37 navaraf Exp $ */ +/* $Id: cliprgn.c,v 1.30 2004/03/22 20:14:29 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> @@ -162,12 +162,19 @@ int FASTCALL IntGdiGetClipBox(HDC hDC, LPRECT rc) { + PROSRGNDATA Rgn; int retval; PDC dc; if (!(dc = DC_LockDc(hDC))) return ERROR; - retval = UnsafeIntGetRgnBox(dc->w.hGCClipRgn, rc); + if(!(Rgn = RGNDATA_LockRgn(dc->w.hGCClipRgn))) + { + DC_UnlockDc( hDC ); + return ERROR; + } + retval = UnsafeIntGetRgnBox(Rgn, rc); + RGNDATA_UnlockRgn(dc->w.hGCClipRgn); IntDPtoLP(dc, (LPPOINT)rc, 2); DC_UnlockDc( hDC ); return(retval); @@ -260,6 +267,8 @@ BOOL STDCALL NtGdiPtVisible(HDC hDC, BOOL STDCALL NtGdiRectVisible(HDC hDC, CONST PRECT UnsafeRect) { + NTSTATUS Status; + PROSRGNDATA Rgn; PDC dc = DC_LockDc(hDC); BOOL Result = FALSE; RECT Rect; @@ -269,12 +278,21 @@ BOOL STDCALL NtGdiRectVisible(HDC hDC, return FALSE; } - MmCopyFromCaller(&Rect, UnsafeRect, sizeof(RECT)); + Status = MmCopyFromCaller(&Rect, UnsafeRect, sizeof(RECT)); + if(!NT_SUCCESS(Status)) + { + DC_UnlockDc(hDC); + return FALSE; + } if (dc->w.hGCClipRgn) { - IntLPtoDP(dc, (LPPOINT)&Rect, 2); - Result = UnsafeIntRectInRegion(dc->w.hGCClipRgn, &Rect); + if((Rgn = (PROSRGNDATA)RGNDATA_LockRgn(dc->w.hGCClipRgn))) + { + IntLPtoDP(dc, (LPPOINT)&Rect, 2); + Result = UnsafeIntRectInRegion(Rgn, &Rect); + RGNDATA_UnlockRgn(dc->w.hGCClipRgn); + } } DC_UnlockDc(hDC); diff --git a/reactos/subsys/win32k/objects/region.c b/reactos/subsys/win32k/objects/region.c index 3ae533bc2d3..6e3fc35b901 100644 --- a/reactos/subsys/win32k/objects/region.c +++ b/reactos/subsys/win32k/objects/region.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: region.c,v 1.42 2004/02/19 21:12:10 weiden Exp $ */ +/* $Id: region.c,v 1.43 2004/03/22 20:14:29 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> #include <ddk/ntddk.h> @@ -1674,7 +1674,7 @@ NtGdiCreateRectRgnIndirect(CONST PRECT rc) return(UnsafeIntCreateRectRgnIndirect(&SafeRc)); } -HRGN STDCALL +HRGN FASTCALL UnsafeIntCreateRectRgnIndirect(CONST PRECT rc) { return(NtGdiCreateRectRgn(rc->left, rc->top, rc->right, rc->bottom)); @@ -1735,10 +1735,10 @@ NtGdiCreateRoundRectRgn(INT left, INT top, INT right, INT bottom, /* move toward center */ rect.top = top++; rect.bottom = rect.top + 1; - UnsafeIntUnionRectWithRgn( hrgn, &rect ); + UnsafeIntUnionRectWithRgn( obj, &rect ); rect.top = --bottom; rect.bottom = rect.top + 1; - UnsafeIntUnionRectWithRgn( hrgn, &rect ); + UnsafeIntUnionRectWithRgn( obj, &rect ); yd -= 2*asq; d -= yd; } @@ -1747,7 +1747,6 @@ NtGdiCreateRoundRectRgn(INT left, INT top, INT right, INT bottom, xd += 2*bsq; d += bsq + xd; } - /* Loop to draw second half of quadrant */ d += (3 * (asq-bsq) / 2 - (xd+yd)) / 2; @@ -1756,10 +1755,10 @@ NtGdiCreateRoundRectRgn(INT left, INT top, INT right, INT bottom, /* next vertical point */ rect.top = top++; rect.bottom = rect.top + 1; - UnsafeIntUnionRectWithRgn( hrgn, &rect ); + UnsafeIntUnionRectWithRgn( obj, &rect ); rect.top = --bottom; rect.bottom = rect.top + 1; - UnsafeIntUnionRectWithRgn( hrgn, &rect ); + UnsafeIntUnionRectWithRgn( obj, &rect ); if (d < 0) /* if nearest pixel is outside ellipse */ { rect.left--; /* move away from center */ @@ -1770,14 +1769,13 @@ NtGdiCreateRoundRectRgn(INT left, INT top, INT right, INT bottom, yd -= 2*asq; d += asq - yd; } - /* Add the inside rectangle */ if (top <= bottom) { rect.top = top; rect.bottom = bottom; - UnsafeIntUnionRectWithRgn( hrgn, &rect ); + UnsafeIntUnionRectWithRgn( obj, &rect ); } RGNDATA_UnlockRgn( hrgn ); return hrgn; @@ -1888,18 +1886,16 @@ NtGdiFrameRgn(HDC hDC, UNIMPLEMENTED; } -INT STDCALL -UnsafeIntGetRgnBox(HRGN hRgn, +INT FASTCALL +UnsafeIntGetRgnBox(PROSRGNDATA Rgn, LPRECT pRect) { - PROSRGNDATA rgn = RGNDATA_LockRgn(hRgn); DWORD ret; - if (rgn) + if (Rgn) { - *pRect = rgn->rdh.rcBound; - ret = rgn->rdh.iType; - RGNDATA_UnlockRgn( hRgn ); + *pRect = Rgn->rdh.rcBound; + ret = Rgn->rdh.iType; return ret; } @@ -1911,10 +1907,17 @@ INT STDCALL NtGdiGetRgnBox(HRGN hRgn, LPRECT pRect) { + PROSRGNDATA Rgn; RECT SafeRect; DWORD ret; - ret = UnsafeIntGetRgnBox(hRgn, &SafeRect); + if (!(Rgn = RGNDATA_LockRgn(hRgn))) + { + return ERROR; + } + + ret = UnsafeIntGetRgnBox(Rgn, &SafeRect); + RGNDATA_UnlockRgn(hRgn); if (ERROR == ret) { return ret; @@ -2066,31 +2069,25 @@ NtGdiPtInRegion(HRGN hRgn, BOOL FASTCALL -UnsafeIntRectInRegion(HRGN hRgn, +UnsafeIntRectInRegion(PROSRGNDATA Rgn, CONST LPRECT rc) { - PROSRGNDATA rgn; PRECT pCurRect, pRectEnd; - BOOL bRet = FALSE; - - if( !( rgn = RGNDATA_LockRgn(hRgn) ) ) - return ERROR; // this is (just) a useful optimization - if((rgn->rdh.nCount > 0) && EXTENTCHECK(&rgn->rdh.rcBound, rc)) + if((Rgn->rdh.nCount > 0) && EXTENTCHECK(&Rgn->rdh.rcBound, rc)) { - for (pCurRect = (PRECT)rgn->Buffer, pRectEnd = pCurRect + rgn->rdh.nCount; pCurRect < pRectEnd; pCurRect++) + for (pCurRect = (PRECT)Rgn->Buffer, pRectEnd = pCurRect + Rgn->rdh.nCount; pCurRect < pRectEnd; pCurRect++) { if (pCurRect->bottom <= rc->top) continue; // not far enough down yet if (pCurRect->top >= rc->bottom) break; // too far down if (pCurRect->right <= rc->left) continue; // not far enough over yet if (pCurRect->left >= rc->right) continue; - bRet = TRUE; - break; + + return TRUE; } } - RGNDATA_UnlockRgn(hRgn); - return bRet; + return FALSE; } BOOL @@ -2098,15 +2095,25 @@ STDCALL NtGdiRectInRegion(HRGN hRgn, CONST LPRECT unsaferc) { + PROSRGNDATA Rgn; RECT rc; + BOOL Ret; + + if(!(Rgn = RGNDATA_LockRgn(hRgn))) + { + return ERROR; + } if (!NT_SUCCESS(MmCopyFromCaller(&rc, unsaferc, sizeof(RECT)))) { + RGNDATA_UnlockRgn(hRgn); DPRINT1("NtGdiRectInRegion: bogus rc\n"); return ERROR; } - - return UnsafeIntRectInRegion(hRgn, &rc); + + Ret = UnsafeIntRectInRegion(Rgn, &rc); + RGNDATA_UnlockRgn(hRgn); + return Ret; } BOOL @@ -2145,36 +2152,34 @@ NtGdiSetRectRgn(HRGN hRgn, return TRUE; } -HRGN FASTCALL -UnsafeIntUnionRectWithRgn(HRGN hDest, CONST PRECT Rect) +VOID FASTCALL +UnsafeIntUnionRectWithRgn(PROSRGNDATA RgnDest, CONST PRECT Rect) { - PROSRGNDATA pRgn; - - pRgn = RGNDATA_LockRgn(hDest); - if (NULL == pRgn) - { - SetLastWin32Error(ERROR_INVALID_HANDLE); - return NULL; - } - - REGION_UnionRectWithRegion(Rect, pRgn); - RGNDATA_UnlockRgn(hDest); - - return hDest; + REGION_UnionRectWithRegion(Rect, RgnDest); } HRGN STDCALL NtGdiUnionRectWithRgn(HRGN hDest, CONST PRECT UnsafeRect) { RECT SafeRect; + PROSRGNDATA Rgn; + + if(!(Rgn = (PROSRGNDATA)RGNDATA_UnlockRgn(hDest))) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return NULL; + } if (! NT_SUCCESS(MmCopyFromCaller(&SafeRect, UnsafeRect, sizeof(RECT)))) { + RGNDATA_UnlockRgn(hDest); SetLastWin32Error(ERROR_INVALID_PARAMETER); return NULL; } - - return UnsafeIntUnionRectWithRgn(hDest, &SafeRect); + + UnsafeIntUnionRectWithRgn(Rgn, &SafeRect); + RGNDATA_UnlockRgn(hDest); + return hDest; } /*! From c6df043a6120a1c09161024e0a9dfef093f32d88 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III <royce3@ev1.net> Date: Mon, 22 Mar 2004 20:46:33 +0000 Subject: [PATCH 0607/1463] Reformatting plus change to NtGdiGetPixel to handle device DCs in addition to DIB DCs. This fixes bug #264. svn path=/trunk/; revision=8839 --- reactos/subsys/win32k/objects/bitmaps.c | 1956 ++++++++++++----------- 1 file changed, 1017 insertions(+), 939 deletions(-) diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index de38d9e09d3..9de50b601c8 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.63 2004/03/16 02:15:06 royce Exp $ */ +/* $Id: bitmaps.c,v 1.64 2004/03/22 20:46:33 royce Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> #include <stdlib.h> @@ -38,496 +38,558 @@ #define NDEBUG #include <win32k/debug1.h> -BOOL STDCALL NtGdiBitBlt(HDC hDCDest, - INT XDest, - INT YDest, - INT Width, - INT Height, - HDC hDCSrc, - INT XSrc, - INT YSrc, - DWORD ROP) +BOOL STDCALL +NtGdiBitBlt( + HDC hDCDest, + INT XDest, + INT YDest, + INT Width, + INT Height, + HDC hDCSrc, + INT XSrc, + INT YSrc, + DWORD ROP) { - PDC DCDest = NULL; - PDC DCSrc = NULL; - PSURFOBJ SurfDest, SurfSrc; - PSURFGDI SurfGDIDest, SurfGDISrc; - RECTL DestRect; - POINTL SourcePoint; - BOOL Status; - PPALGDI PalDestGDI, PalSourceGDI; - PXLATEOBJ XlateObj = NULL; - HPALETTE SourcePalette, DestPalette; - ULONG SourceMode, DestMode; - PBRUSHOBJ BrushObj; - BOOL UsesSource = ((ROP & 0xCC0000) >> 2) != (ROP & 0x330000); - BOOL UsesPattern = TRUE;//((ROP & 0xF00000) >> 4) != (ROP & 0x0F0000); - HPALETTE Mono = NULL; + PDC DCDest = NULL; + PDC DCSrc = NULL; + PSURFOBJ SurfDest, SurfSrc; + PSURFGDI SurfGDIDest, SurfGDISrc; + RECTL DestRect; + POINTL SourcePoint; + BOOL Status; + PPALGDI PalDestGDI, PalSourceGDI; + PXLATEOBJ XlateObj = NULL; + HPALETTE SourcePalette, DestPalette; + ULONG SourceMode, DestMode; + PBRUSHOBJ BrushObj; + BOOL UsesSource = ((ROP & 0xCC0000) >> 2) != (ROP & 0x330000); + BOOL UsesPattern = TRUE;//((ROP & 0xF00000) >> 4) != (ROP & 0x0F0000); + HPALETTE Mono = NULL; - DCDest = DC_LockDc(hDCDest); - if (NULL == DCDest) - { - DPRINT1("Invalid destination dc handle (0x%08x) passed to NtGdiBitBlt\n", hDCDest); - SetLastWin32Error(ERROR_INVALID_HANDLE); - return FALSE; - } + DCDest = DC_LockDc(hDCDest); + if (NULL == DCDest) + { + DPRINT1("Invalid destination dc handle (0x%08x) passed to NtGdiBitBlt\n", hDCDest); + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } - if (UsesSource) - { - if (hDCSrc != hDCDest) - { - DCSrc = DC_LockDc(hDCSrc); - if (NULL == DCSrc) - { - DC_UnlockDc(hDCDest); - DPRINT1("Invalid source dc handle (0x%08x) passed to NtGdiBitBlt\n", hDCSrc); - SetLastWin32Error(ERROR_INVALID_HANDLE); - return FALSE; - } - } - else - { - DCSrc = DCDest; - } - } - else - { - DCSrc = NULL; - } + if (UsesSource) + { + if (hDCSrc != hDCDest) + { + DCSrc = DC_LockDc(hDCSrc); + if (NULL == DCSrc) + { + DC_UnlockDc(hDCDest); + DPRINT1("Invalid source dc handle (0x%08x) passed to NtGdiBitBlt\n", hDCSrc); + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } + } + else + { + DCSrc = DCDest; + } + } + else + { + DCSrc = NULL; + } - /* Offset the destination and source by the origin of their DCs. */ - XDest += DCDest->w.DCOrgX; - YDest += DCDest->w.DCOrgY; - if (UsesSource) - { - XSrc += DCSrc->w.DCOrgX; - YSrc += DCSrc->w.DCOrgY; - } + /* Offset the destination and source by the origin of their DCs. */ + XDest += DCDest->w.DCOrgX; + YDest += DCDest->w.DCOrgY; + if (UsesSource) + { + XSrc += DCSrc->w.DCOrgX; + YSrc += DCSrc->w.DCOrgY; + } - DestRect.left = XDest; - DestRect.top = YDest; - DestRect.right = XDest+Width; - DestRect.bottom = YDest+Height; + DestRect.left = XDest; + DestRect.top = YDest; + DestRect.right = XDest+Width; + DestRect.bottom = YDest+Height; - SourcePoint.x = XSrc; - SourcePoint.y = YSrc; + SourcePoint.x = XSrc; + SourcePoint.y = YSrc; - /* Determine surfaces to be used in the bitblt */ - SurfDest = (PSURFOBJ)AccessUserObject((ULONG)DCDest->Surface); - SurfGDIDest = (PSURFGDI)AccessInternalObjectFromUserObject(SurfDest); - if (UsesSource) - { - SurfSrc = (PSURFOBJ)AccessUserObject((ULONG)DCSrc->Surface); - SurfGDISrc = (PSURFGDI)AccessInternalObjectFromUserObject(SurfSrc); - } - else - { - SurfSrc = NULL; - SurfGDISrc = NULL; - } + /* Determine surfaces to be used in the bitblt */ + SurfDest = (PSURFOBJ)AccessUserObject((ULONG)DCDest->Surface); + SurfGDIDest = (PSURFGDI)AccessInternalObjectFromUserObject(SurfDest); + if (UsesSource) + { + SurfSrc = (PSURFOBJ)AccessUserObject((ULONG)DCSrc->Surface); + SurfGDISrc = (PSURFGDI)AccessInternalObjectFromUserObject(SurfSrc); + } + else + { + SurfSrc = NULL; + SurfGDISrc = NULL; + } - if (UsesPattern) - { - BrushObj = BRUSHOBJ_LockBrush(DCDest->w.hBrush); - if (NULL == BrushObj) - { - if (UsesSource && hDCSrc != hDCDest) - { - DC_UnlockDc(hDCSrc); - } - DC_UnlockDc(hDCDest); - SetLastWin32Error(ERROR_INVALID_HANDLE); - return FALSE; - } - } - else - { - BrushObj = NULL; - } + if (UsesPattern) + { + BrushObj = BRUSHOBJ_LockBrush(DCDest->w.hBrush); + if (NULL == BrushObj) + { + if (UsesSource && hDCSrc != hDCDest) + { + DC_UnlockDc(hDCSrc); + } + DC_UnlockDc(hDCDest); + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } + } + else + { + BrushObj = NULL; + } - if (DCDest->w.hPalette != 0) - { - DestPalette = DCDest->w.hPalette; - } - else - { - DestPalette = NtGdiGetStockObject(DEFAULT_PALETTE); - } + if (DCDest->w.hPalette != 0) + { + DestPalette = DCDest->w.hPalette; + } + else + { + DestPalette = NtGdiGetStockObject(DEFAULT_PALETTE); + } - if (UsesSource && DCSrc->w.hPalette != 0) - { - SourcePalette = DCSrc->w.hPalette; - } - else - { - SourcePalette = NtGdiGetStockObject(DEFAULT_PALETTE); - } + if (UsesSource && DCSrc->w.hPalette != 0) + { + SourcePalette = DCSrc->w.hPalette; + } + else + { + SourcePalette = NtGdiGetStockObject(DEFAULT_PALETTE); + } - 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); + 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); - } + 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); + } - /* KB41464 details how to convert between mono and color */ - if (DCDest->w.bitsPerPixel == 1) - { - XlateObj = (PXLATEOBJ)IntEngCreateMonoXlate(SourceMode, DestPalette, - SourcePalette, DCSrc->w.backgroundColor); - } - else if (UsesSource && 1 == DCSrc->w.bitsPerPixel) - { - ULONG Colors[2]; + /* KB41464 details how to convert between mono and color */ + if (DCDest->w.bitsPerPixel == 1) + { + XlateObj = (PXLATEOBJ)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 = EngCreatePalette(PAL_INDEXED, 2, Colors, 0, 0, 0); - if (NULL != Mono) - { - XlateObj = (PXLATEOBJ)IntEngCreateXlate(DestMode, PAL_INDEXED, DestPalette, Mono); - } - else - { - XlateObj = NULL; - } - } - else - { - XlateObj = (PXLATEOBJ)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; - } + Colors[0] = DCSrc->w.textColor; + Colors[1] = DCSrc->w.backgroundColor; + Mono = EngCreatePalette(PAL_INDEXED, 2, Colors, 0, 0, 0); + if (NULL != Mono) + { + XlateObj = (PXLATEOBJ)IntEngCreateXlate(DestMode, PAL_INDEXED, DestPalette, Mono); + } + else + { + XlateObj = NULL; + } + } + else + { + XlateObj = (PXLATEOBJ)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(SurfDest, SurfSrc, NULL, DCDest->CombinedClip, XlateObj, - &DestRect, &SourcePoint, NULL, BrushObj, NULL, ROP); + /* Perform the bitblt operation */ + Status = IntEngBitBlt(SurfDest, SurfSrc, NULL, DCDest->CombinedClip, XlateObj, + &DestRect, &SourcePoint, NULL, BrushObj, NULL, ROP); - EngDeleteXlate(XlateObj); - if (NULL != Mono) - { - EngDeletePalette(Mono); - } - if (UsesPattern) - { - BRUSHOBJ_UnlockBrush(DCDest->w.hBrush); - } - if (UsesSource && hDCSrc != hDCDest) - { - DC_UnlockDc(hDCSrc); - } - DC_UnlockDc(hDCDest); + EngDeleteXlate(XlateObj); + if (NULL != Mono) + { + EngDeletePalette(Mono); + } + if (UsesPattern) + { + BRUSHOBJ_UnlockBrush(DCDest->w.hBrush); + } + if (UsesSource && hDCSrc != hDCDest) + { + DC_UnlockDc(hDCSrc); + } + DC_UnlockDc(hDCDest); - return Status; + return Status; } -HBITMAP STDCALL NtGdiCreateBitmap(INT Width, - INT Height, - UINT Planes, - UINT BitsPerPel, - CONST VOID *Bits) +HBITMAP STDCALL +NtGdiCreateBitmap( + INT Width, + INT Height, + UINT Planes, + UINT BitsPerPel, + CONST VOID *Bits) { - PBITMAPOBJ bmp; - HBITMAP hBitmap; + PBITMAPOBJ bmp; + HBITMAP hBitmap; - Planes = (BYTE) Planes; - BitsPerPel = (BYTE) BitsPerPel; + Planes = (BYTE) Planes; + BitsPerPel = (BYTE) BitsPerPel; - /* 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) + { + Width = 1; + Height = 1; + } + if (Planes != 1) + { + DPRINT("NtGdiCreateBitmap - UNIMPLEMENTED\n"); + return 0; + } + if (Height < 0) + { + Height = -Height; + } + if (Width < 0) + { + Width = -Width; + } - /* Create the BITMAPOBJ */ - hBitmap = BITMAPOBJ_AllocBitmap (); - if (!hBitmap) - { - DPRINT("NtGdiCreateBitmap: BITMAPOBJ_AllocBitmap returned 0\n"); - return 0; - } + /* Create the BITMAPOBJ */ + hBitmap = BITMAPOBJ_AllocBitmap (); + if (!hBitmap) + { + DPRINT("NtGdiCreateBitmap: BITMAPOBJ_AllocBitmap returned 0\n"); + return 0; + } - bmp = BITMAPOBJ_LockBitmap( hBitmap ); + bmp = BITMAPOBJ_LockBitmap( hBitmap ); - DPRINT("NtGdiCreateBitmap:%dx%d, %d (%d BPP) colors returning %08x\n", Width, Height, - 1 << (Planes * BitsPerPel), BitsPerPel, bmp); + DPRINT("NtGdiCreateBitmap:%dx%d, %d (%d BPP) colors returning %08x\n", Width, Height, + 1 << (Planes * BitsPerPel), BitsPerPel, bmp); - 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; + 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; - // Allocate memory for bitmap bits - bmp->bitmap.bmBits = ExAllocatePoolWithTag(PagedPool, bmp->bitmap.bmWidthBytes * bmp->bitmap.bmHeight, TAG_BITMAP); + // Allocate memory for bitmap bits + bmp->bitmap.bmBits = ExAllocatePoolWithTag(PagedPool, bmp->bitmap.bmWidthBytes * bmp->bitmap.bmHeight, TAG_BITMAP); - 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); - } + BITMAPOBJ_UnlockBitmap( hBitmap ); - return 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; } -BOOL FASTCALL Bitmap_InternalDelete( PBITMAPOBJ pBmp ) +BOOL FASTCALL +Bitmap_InternalDelete( PBITMAPOBJ pBmp ) { - ASSERT( pBmp ); + ASSERT( pBmp ); - if (NULL != pBmp->bitmap.bmBits) - { - if (NULL != pBmp->dib) + if (NULL != pBmp->bitmap.bmBits) { - if (NULL == pBmp->dib->dshSection) - { - EngFreeUserMem(pBmp->bitmap.bmBits); - } - else - { - /* This is a file-mapped section */ - UNIMPLEMENTED; - } + if (NULL != pBmp->dib) + { + if (NULL == pBmp->dib->dshSection) + { + EngFreeUserMem(pBmp->bitmap.bmBits); + } + else + { + /* This is a file-mapped section */ + UNIMPLEMENTED; + } + } + else + { + ExFreePool(pBmp->bitmap.bmBits); + } } - else - { - ExFreePool(pBmp->bitmap.bmBits); - } - } - return TRUE; + return TRUE; } HBITMAP FASTCALL -IntCreateCompatibleBitmap(PDC Dc, - INT Width, - INT Height) +IntCreateCompatibleBitmap( + PDC Dc, + INT Width, + INT Height) { - HBITMAP Bmp; + HBITMAP Bmp; - Bmp = NULL; + Bmp = NULL; - if ((Width >= 0x10000) || (Height >= 0x10000)) - { - DPRINT1("got bad width %d or height %d, please look for reason\n", Width, Height); - return NULL; - } + if ((Width >= 0x10000) || (Height >= 0x10000)) + { + DPRINT1("got bad width %d or height %d, please look for reason\n", Width, Height); + return NULL; + } - /* MS doc says if width or height is 0, return 1-by-1 pixel, monochrome bitmap */ - if (0 == Width || 0 == Height) - { - Bmp = NtGdiCreateBitmap (1, 1, 1, 1, NULL); - } - else - { - Bmp = NtGdiCreateBitmap(Width, Height, 1, Dc->w.bitsPerPixel, NULL); - } + /* MS doc says if width or height is 0, return 1-by-1 pixel, monochrome bitmap */ + if (0 == Width || 0 == Height) + { + Bmp = NtGdiCreateBitmap (1, 1, 1, 1, NULL); + } + else + { + Bmp = NtGdiCreateBitmap(Width, Height, 1, Dc->w.bitsPerPixel, NULL); + } - return Bmp; + return Bmp; } HBITMAP STDCALL -NtGdiCreateCompatibleBitmap(HDC hDC, - INT Width, - INT Height) +NtGdiCreateCompatibleBitmap( + HDC hDC, + INT Width, + INT Height) { - HBITMAP Bmp; - PDC Dc; + HBITMAP Bmp; + PDC Dc; - Dc = DC_LockDc(hDC); + Dc = DC_LockDc(hDC); - DPRINT("NtGdiCreateCompatibleBitmap(%04x,%d,%d, bpp:%d) = \n", hDC, Width, Height, dc->w.bitsPerPixel); + DPRINT("NtGdiCreateCompatibleBitmap(%04x,%d,%d, bpp:%d) = \n", hDC, Width, Height, dc->w.bitsPerPixel); - if (NULL == Dc) - { - return NULL; - } + if (NULL == Dc) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return NULL; + } - Bmp = IntCreateCompatibleBitmap(Dc, Width, Height); + Bmp = IntCreateCompatibleBitmap(Dc, Width, Height); - DPRINT ("\t\t%04x\n", Bmp); - DC_UnlockDc(hDC); - return Bmp; + DPRINT ("\t\t%04x\n", Bmp); + DC_UnlockDc(hDC); + return Bmp; } -HBITMAP STDCALL NtGdiCreateBitmapIndirect(CONST BITMAP *BM) +HBITMAP STDCALL +NtGdiCreateBitmapIndirect(CONST BITMAP *BM) { - return NtGdiCreateBitmap (BM->bmWidth, - BM->bmHeight, - BM->bmPlanes, - BM->bmBitsPixel, - BM->bmBits); + return NtGdiCreateBitmap (BM->bmWidth, + BM->bmHeight, + BM->bmPlanes, + BM->bmBitsPixel, + BM->bmBits); } -HBITMAP STDCALL NtGdiCreateDiscardableBitmap(HDC hDC, - INT Width, - INT Height) +HBITMAP STDCALL +NtGdiCreateDiscardableBitmap( + HDC hDC, + INT Width, + INT Height) { - /* FIXME: this probably should do something else */ - return NtGdiCreateCompatibleBitmap(hDC, Width, Height); + /* FIXME: this probably should do something else */ + return NtGdiCreateCompatibleBitmap(hDC, Width, Height); } -BOOL STDCALL NtGdiExtFloodFill(HDC hDC, - INT XStart, - INT YStart, - COLORREF Color, - UINT FillType) +BOOL STDCALL +NtGdiExtFloodFill( + HDC hDC, + INT XStart, + INT YStart, + COLORREF Color, + UINT FillType) { - UNIMPLEMENTED; + UNIMPLEMENTED; } -BOOL STDCALL NtGdiFloodFill(HDC hDC, - INT XStart, - INT YStart, - COLORREF Fill) +BOOL STDCALL +NtGdiFloodFill( + HDC hDC, + INT XStart, + INT YStart, + COLORREF Fill) { - return NtGdiExtFloodFill(hDC, XStart, YStart, Fill, FLOODFILLBORDER ); + return NtGdiExtFloodFill(hDC, XStart, YStart, Fill, FLOODFILLBORDER ); } -BOOL STDCALL NtGdiGetBitmapDimensionEx(HBITMAP hBitmap, - LPSIZE Dimension) +BOOL STDCALL +NtGdiGetBitmapDimensionEx( + HBITMAP hBitmap, + LPSIZE Dimension) { - PBITMAPOBJ bmp; + PBITMAPOBJ bmp; - bmp = BITMAPOBJ_LockBitmap(hBitmap); - if (bmp == NULL) - { - return FALSE; - } + bmp = BITMAPOBJ_LockBitmap(hBitmap); + if (bmp == NULL) + { + return FALSE; + } - *Dimension = bmp->dimension; + *Dimension = bmp->dimension; - BITMAPOBJ_UnlockBitmap(hBitmap); + BITMAPOBJ_UnlockBitmap(hBitmap); - return TRUE; + return TRUE; } -COLORREF -STDCALL +COLORREF STDCALL NtGdiGetPixel(HDC hDC, INT XPos, INT YPos) { - PDC dc = NULL; - COLORREF clrSource, Result = (COLORREF)CLR_INVALID; // default to failure - PSURFGDI Surface; - PSURFOBJ SurfaceObject; - HPALETTE Pal; - PPALGDI PalGDI; - USHORT PalMode; - PXLATEOBJ XlateObj; + PDC dc = NULL; + COLORREF Result = (COLORREF)CLR_INVALID; // default to failure + BOOL bInRect = FALSE; + PSURFGDI Surface; + PSURFOBJ SurfaceObject; + HPALETTE Pal; + PPALGDI PalGDI; + USHORT PalMode; + PXLATEOBJ XlateObj; - dc = DC_LockDc (hDC); - if (dc != NULL) - { - if ( IN_RECT(dc->CombinedClip->rclBounds,XPos,YPos) ) - { - SurfaceObject = (PSURFOBJ)AccessUserObject((ULONG)dc->Surface); - ASSERT(SurfaceObject); - Surface = (PSURFGDI)AccessInternalObjectFromUserObject(SurfaceObject); - if ( Surface && Surface->DIB_GetPixel ) - { - clrSource = Surface->DIB_GetPixel(SurfaceObject, XPos, YPos); - if (dc->w.hPalette != 0) - Pal = dc->w.hPalette; - else - Pal = NtGdiGetStockObject(DEFAULT_PALETTE); - PalGDI = PALETTE_LockPalette(Pal); - if ( PalGDI ) - { - PalMode = PalGDI->Mode; - PALETTE_UnlockPalette(Pal); + dc = DC_LockDc (hDC); - XlateObj = (PXLATEOBJ)IntEngCreateXlate ( PAL_RGB, PalMode, NULL, Pal ); - if ( XlateObj ) - { - Result = XLATEOBJ_iXlate(XlateObj, clrSource); - EngDeleteXlate(XlateObj); - } - } - } - } - DC_UnlockDc(hDC); - } + if ( !dc ) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return Result; + } + if ( IN_RECT(dc->CombinedClip->rclBounds,XPos,YPos) ) + { + bInRect = TRUE; + SurfaceObject = (PSURFOBJ)AccessUserObject((ULONG)dc->Surface); + ASSERT(SurfaceObject); + Surface = (PSURFGDI)AccessInternalObjectFromUserObject(SurfaceObject); + if ( Surface ) + { + if ( dc->w.hPalette != 0 ) + Pal = dc->w.hPalette; + else + Pal = NtGdiGetStockObject(DEFAULT_PALETTE); + PalGDI = PALETTE_LockPalette(Pal); + if ( PalGDI ) + { + PalMode = PalGDI->Mode; + PALETTE_UnlockPalette(Pal); - return Result; + XlateObj = (PXLATEOBJ)IntEngCreateXlate ( PAL_RGB, PalMode, NULL, Pal ); + if ( XlateObj ) + { + // 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 ) ); + } + EngDeleteXlate(XlateObj); + } + } + } + } + DC_UnlockDc(hDC); + + // if Result is still CLR_INVALID, then the "quick" method above didn't work + if ( bInRect && Result == CLR_INVALID ) + { + // FIXME: create a 1x1 32BPP DIB, and blit to it + HDC hDCTmp = NtGdiCreateCompatableDC(hDC); + if ( hDCTmp ) + { + static const BITMAPINFOHEADER bih = { sizeof(BITMAPINFOHEADER), 1, 1, 1, 32, BI_RGB, 0, 0, 0, 0, 0 }; + BITMAPINFO bi; + RtlMoveMemory ( &(bi.bmiHeader), &bih, sizeof(bih) ); + HBITMAP hBmpTmp = NtGdiCreateDIBitmap ( hDC, &bi.bmiHeader, 0, NULL, &bi, DIB_RGB_COLORS ); + //HBITMAP hBmpTmp = NtGdiCreateBitmap ( 1, 1, 1, 32, NULL); + if ( hBmpTmp ) + { + HBITMAP hBmpOld = (HBITMAP)NtGdiSelectObject ( hDCTmp, hBmpTmp ); + if ( hBmpOld ) + { + PBITMAPOBJ bmpobj; + + NtGdiBitBlt ( hDCTmp, 0, 0, 1, 1, hDC, XPos, YPos, SRCCOPY ); + NtGdiSelectObject ( hDCTmp, hBmpOld ); + + // our bitmap is no longer selected, so we can access it's stuff... + bmpobj = BITMAPOBJ_LockBitmap ( hBmpTmp ); + if ( bmpobj ) + { + Result = *(COLORREF*)bmpobj->bitmap.bmBits; + BITMAPOBJ_UnlockBitmap ( hBmpTmp ); + } + } + NtGdiDeleteObject ( hBmpTmp ); + } + NtGdiDeleteDC ( hDCTmp ); + } + } + + return Result; } /*********************************************************************** * MaskBlt * Ported from WINE by sedwards 11-4-03 - * - * Someone thought it would be faster to do it here and then switch back - * to GDI32. I dunno. Write a test and let me know. + * + * Someone thought it would be faster to do it here and then switch back + * to GDI32. I dunno. Write a test and let me know. */ -static inline BYTE SwapROP3_SrcDst(BYTE bRop3) +static inline BYTE +SwapROP3_SrcDst(BYTE bRop3) { - return (bRop3 & 0x99) | ((bRop3 & 0x22) << 1) | ((bRop3 & 0x44) >> 1); + return (bRop3 & 0x99) | ((bRop3 & 0x22) << 1) | ((bRop3 & 0x44) >> 1); } #define FRGND_ROP3(ROP4) ((ROP4) & 0x00FFFFFF) @@ -535,538 +597,552 @@ static inline BYTE SwapROP3_SrcDst(BYTE bRop3) #define DSTCOPY 0x00AA0029 #define DSTERASE 0x00220326 /* dest = dest & (~src) : DSna */ -BOOL STDCALL NtGdiMaskBlt(HDC hdcDest, INT nXDest, INT nYDest, - INT nWidth, INT nHeight, HDC hdcSrc, - INT nXSrc, INT nYSrc, HBITMAP hbmMask, - INT xMask, INT yMask, DWORD dwRop) +BOOL STDCALL +NtGdiMaskBlt ( + HDC hdcDest, INT nXDest, INT nYDest, + INT nWidth, INT nHeight, HDC hdcSrc, + INT nXSrc, INT nYSrc, HBITMAP hbmMask, + INT xMask, INT yMask, DWORD dwRop) { - HBITMAP hOldMaskBitmap, hBitmap2, hOldBitmap2, hBitmap3, hOldBitmap3; - HDC hDCMask, hDC1, hDC2; - static const DWORD ROP3Table[256] = - { - 0x00000042, 0x00010289, - 0x00020C89, 0x000300AA, - 0x00040C88, 0x000500A9, - 0x00060865, 0x000702C5, - 0x00080F08, 0x00090245, - 0x000A0329, 0x000B0B2A, - 0x000C0324, 0x000D0B25, - 0x000E08A5, 0x000F0001, - 0x00100C85, 0x001100A6, - 0x00120868, 0x001302C8, - 0x00140869, 0x001502C9, - 0x00165CCA, 0x00171D54, - 0x00180D59, 0x00191CC8, - 0x001A06C5, 0x001B0768, - 0x001C06CA, 0x001D0766, - 0x001E01A5, 0x001F0385, - 0x00200F09, 0x00210248, - 0x00220326, 0x00230B24, - 0x00240D55, 0x00251CC5, - 0x002606C8, 0x00271868, - 0x00280369, 0x002916CA, - 0x002A0CC9, 0x002B1D58, - 0x002C0784, 0x002D060A, - 0x002E064A, 0x002F0E2A, - 0x0030032A, 0x00310B28, - 0x00320688, 0x00330008, - 0x003406C4, 0x00351864, - 0x003601A8, 0x00370388, - 0x0038078A, 0x00390604, - 0x003A0644, 0x003B0E24, - 0x003C004A, 0x003D18A4, - 0x003E1B24, 0x003F00EA, - 0x00400F0A, 0x00410249, - 0x00420D5D, 0x00431CC4, - 0x00440328, 0x00450B29, - 0x004606C6, 0x0047076A, - 0x00480368, 0x004916C5, - 0x004A0789, 0x004B0605, - 0x004C0CC8, 0x004D1954, - 0x004E0645, 0x004F0E25, - 0x00500325, 0x00510B26, - 0x005206C9, 0x00530764, - 0x005408A9, 0x00550009, - 0x005601A9, 0x00570389, - 0x00580785, 0x00590609, - 0x005A0049, 0x005B18A9, - 0x005C0649, 0x005D0E29, - 0x005E1B29, 0x005F00E9, - 0x00600365, 0x006116C6, - 0x00620786, 0x00630608, - 0x00640788, 0x00650606, - 0x00660046, 0x006718A8, - 0x006858A6, 0x00690145, - 0x006A01E9, 0x006B178A, - 0x006C01E8, 0x006D1785, - 0x006E1E28, 0x006F0C65, - 0x00700CC5, 0x00711D5C, - 0x00720648, 0x00730E28, - 0x00740646, 0x00750E26, - 0x00761B28, 0x007700E6, - 0x007801E5, 0x00791786, - 0x007A1E29, 0x007B0C68, - 0x007C1E24, 0x007D0C69, - 0x007E0955, 0x007F03C9, - 0x008003E9, 0x00810975, - 0x00820C49, 0x00831E04, - 0x00840C48, 0x00851E05, - 0x008617A6, 0x008701C5, - 0x008800C6, 0x00891B08, - 0x008A0E06, 0x008B0666, - 0x008C0E08, 0x008D0668, - 0x008E1D7C, 0x008F0CE5, - 0x00900C45, 0x00911E08, - 0x009217A9, 0x009301C4, - 0x009417AA, 0x009501C9, - 0x00960169, 0x0097588A, - 0x00981888, 0x00990066, - 0x009A0709, 0x009B07A8, - 0x009C0704, 0x009D07A6, - 0x009E16E6, 0x009F0345, - 0x00A000C9, 0x00A11B05, - 0x00A20E09, 0x00A30669, - 0x00A41885, 0x00A50065, - 0x00A60706, 0x00A707A5, - 0x00A803A9, 0x00A90189, - 0x00AA0029, 0x00AB0889, - 0x00AC0744, 0x00AD06E9, - 0x00AE0B06, 0x00AF0229, - 0x00B00E05, 0x00B10665, - 0x00B21974, 0x00B30CE8, - 0x00B4070A, 0x00B507A9, - 0x00B616E9, 0x00B70348, - 0x00B8074A, 0x00B906E6, - 0x00BA0B09, 0x00BB0226, - 0x00BC1CE4, 0x00BD0D7D, - 0x00BE0269, 0x00BF08C9, - 0x00C000CA, 0x00C11B04, - 0x00C21884, 0x00C3006A, - 0x00C40E04, 0x00C50664, - 0x00C60708, 0x00C707AA, - 0x00C803A8, 0x00C90184, - 0x00CA0749, 0x00CB06E4, - 0x00CC0020, 0x00CD0888, - 0x00CE0B08, 0x00CF0224, - 0x00D00E0A, 0x00D1066A, - 0x00D20705, 0x00D307A4, - 0x00D41D78, 0x00D50CE9, - 0x00D616EA, 0x00D70349, - 0x00D80745, 0x00D906E8, - 0x00DA1CE9, 0x00DB0D75, - 0x00DC0B04, 0x00DD0228, - 0x00DE0268, 0x00DF08C8, - 0x00E003A5, 0x00E10185, - 0x00E20746, 0x00E306EA, - 0x00E40748, 0x00E506E5, - 0x00E61CE8, 0x00E70D79, - 0x00E81D74, 0x00E95CE6, - 0x00EA02E9, 0x00EB0849, - 0x00EC02E8, 0x00ED0848, - 0x00EE0086, 0x00EF0A08, - 0x00F00021, 0x00F10885, - 0x00F20B05, 0x00F3022A, - 0x00F40B0A, 0x00F50225, - 0x00F60265, 0x00F708C5, - 0x00F802E5, 0x00F90845, - 0x00FA0089, 0x00FB0A09, - 0x00FC008A, 0x00FD0A0A, - 0x00FE02A9, 0x00FF0062, - }; + HBITMAP hOldMaskBitmap, hBitmap2, hOldBitmap2, hBitmap3, hOldBitmap3; + HDC hDCMask, hDC1, hDC2; + static const DWORD ROP3Table[256] = + { + 0x00000042, 0x00010289, + 0x00020C89, 0x000300AA, + 0x00040C88, 0x000500A9, + 0x00060865, 0x000702C5, + 0x00080F08, 0x00090245, + 0x000A0329, 0x000B0B2A, + 0x000C0324, 0x000D0B25, + 0x000E08A5, 0x000F0001, + 0x00100C85, 0x001100A6, + 0x00120868, 0x001302C8, + 0x00140869, 0x001502C9, + 0x00165CCA, 0x00171D54, + 0x00180D59, 0x00191CC8, + 0x001A06C5, 0x001B0768, + 0x001C06CA, 0x001D0766, + 0x001E01A5, 0x001F0385, + 0x00200F09, 0x00210248, + 0x00220326, 0x00230B24, + 0x00240D55, 0x00251CC5, + 0x002606C8, 0x00271868, + 0x00280369, 0x002916CA, + 0x002A0CC9, 0x002B1D58, + 0x002C0784, 0x002D060A, + 0x002E064A, 0x002F0E2A, + 0x0030032A, 0x00310B28, + 0x00320688, 0x00330008, + 0x003406C4, 0x00351864, + 0x003601A8, 0x00370388, + 0x0038078A, 0x00390604, + 0x003A0644, 0x003B0E24, + 0x003C004A, 0x003D18A4, + 0x003E1B24, 0x003F00EA, + 0x00400F0A, 0x00410249, + 0x00420D5D, 0x00431CC4, + 0x00440328, 0x00450B29, + 0x004606C6, 0x0047076A, + 0x00480368, 0x004916C5, + 0x004A0789, 0x004B0605, + 0x004C0CC8, 0x004D1954, + 0x004E0645, 0x004F0E25, + 0x00500325, 0x00510B26, + 0x005206C9, 0x00530764, + 0x005408A9, 0x00550009, + 0x005601A9, 0x00570389, + 0x00580785, 0x00590609, + 0x005A0049, 0x005B18A9, + 0x005C0649, 0x005D0E29, + 0x005E1B29, 0x005F00E9, + 0x00600365, 0x006116C6, + 0x00620786, 0x00630608, + 0x00640788, 0x00650606, + 0x00660046, 0x006718A8, + 0x006858A6, 0x00690145, + 0x006A01E9, 0x006B178A, + 0x006C01E8, 0x006D1785, + 0x006E1E28, 0x006F0C65, + 0x00700CC5, 0x00711D5C, + 0x00720648, 0x00730E28, + 0x00740646, 0x00750E26, + 0x00761B28, 0x007700E6, + 0x007801E5, 0x00791786, + 0x007A1E29, 0x007B0C68, + 0x007C1E24, 0x007D0C69, + 0x007E0955, 0x007F03C9, + 0x008003E9, 0x00810975, + 0x00820C49, 0x00831E04, + 0x00840C48, 0x00851E05, + 0x008617A6, 0x008701C5, + 0x008800C6, 0x00891B08, + 0x008A0E06, 0x008B0666, + 0x008C0E08, 0x008D0668, + 0x008E1D7C, 0x008F0CE5, + 0x00900C45, 0x00911E08, + 0x009217A9, 0x009301C4, + 0x009417AA, 0x009501C9, + 0x00960169, 0x0097588A, + 0x00981888, 0x00990066, + 0x009A0709, 0x009B07A8, + 0x009C0704, 0x009D07A6, + 0x009E16E6, 0x009F0345, + 0x00A000C9, 0x00A11B05, + 0x00A20E09, 0x00A30669, + 0x00A41885, 0x00A50065, + 0x00A60706, 0x00A707A5, + 0x00A803A9, 0x00A90189, + 0x00AA0029, 0x00AB0889, + 0x00AC0744, 0x00AD06E9, + 0x00AE0B06, 0x00AF0229, + 0x00B00E05, 0x00B10665, + 0x00B21974, 0x00B30CE8, + 0x00B4070A, 0x00B507A9, + 0x00B616E9, 0x00B70348, + 0x00B8074A, 0x00B906E6, + 0x00BA0B09, 0x00BB0226, + 0x00BC1CE4, 0x00BD0D7D, + 0x00BE0269, 0x00BF08C9, + 0x00C000CA, 0x00C11B04, + 0x00C21884, 0x00C3006A, + 0x00C40E04, 0x00C50664, + 0x00C60708, 0x00C707AA, + 0x00C803A8, 0x00C90184, + 0x00CA0749, 0x00CB06E4, + 0x00CC0020, 0x00CD0888, + 0x00CE0B08, 0x00CF0224, + 0x00D00E0A, 0x00D1066A, + 0x00D20705, 0x00D307A4, + 0x00D41D78, 0x00D50CE9, + 0x00D616EA, 0x00D70349, + 0x00D80745, 0x00D906E8, + 0x00DA1CE9, 0x00DB0D75, + 0x00DC0B04, 0x00DD0228, + 0x00DE0268, 0x00DF08C8, + 0x00E003A5, 0x00E10185, + 0x00E20746, 0x00E306EA, + 0x00E40748, 0x00E506E5, + 0x00E61CE8, 0x00E70D79, + 0x00E81D74, 0x00E95CE6, + 0x00EA02E9, 0x00EB0849, + 0x00EC02E8, 0x00ED0848, + 0x00EE0086, 0x00EF0A08, + 0x00F00021, 0x00F10885, + 0x00F20B05, 0x00F3022A, + 0x00F40B0A, 0x00F50225, + 0x00F60265, 0x00F708C5, + 0x00F802E5, 0x00F90845, + 0x00FA0089, 0x00FB0A09, + 0x00FC008A, 0x00FD0A0A, + 0x00FE02A9, 0x00FF0062, + }; - if (!hbmMask) - return NtGdiBitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, FRGND_ROP3(dwRop)); + if (!hbmMask) + return NtGdiBitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, FRGND_ROP3(dwRop)); - /* 1. make mask bitmap's dc */ - hDCMask = NtGdiCreateCompatableDC(hdcDest); - hOldMaskBitmap = (HBITMAP)NtGdiSelectObject(hDCMask, hbmMask); + /* 1. make mask bitmap's dc */ + hDCMask = NtGdiCreateCompatableDC(hdcDest); + hOldMaskBitmap = (HBITMAP)NtGdiSelectObject(hDCMask, hbmMask); - /* 2. make masked Background bitmap */ + /* 2. make masked Background bitmap */ - /* 2.1 make bitmap */ - hDC1 = NtGdiCreateCompatableDC(hdcDest); - hBitmap2 = NtGdiCreateCompatibleBitmap(hdcDest, nWidth, nHeight); - hOldBitmap2 = (HBITMAP)NtGdiSelectObject(hDC1, hBitmap2); + /* 2.1 make bitmap */ + hDC1 = NtGdiCreateCompatableDC(hdcDest); + hBitmap2 = NtGdiCreateCompatibleBitmap(hdcDest, nWidth, nHeight); + hOldBitmap2 = (HBITMAP)NtGdiSelectObject(hDC1, hBitmap2); - /* 2.2 draw dest bitmap and mask */ - NtGdiBitBlt(hDC1, 0, 0, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, SRCCOPY); - NtGdiBitBlt(hDC1, 0, 0, nWidth, nHeight, hdcDest, nXDest, nYDest, BKGND_ROP3(dwRop)); - NtGdiBitBlt(hDC1, 0, 0, nWidth, nHeight, hDCMask, xMask, yMask, DSTERASE); + /* 2.2 draw dest bitmap and mask */ + NtGdiBitBlt(hDC1, 0, 0, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, SRCCOPY); + NtGdiBitBlt(hDC1, 0, 0, nWidth, nHeight, hdcDest, nXDest, nYDest, BKGND_ROP3(dwRop)); + NtGdiBitBlt(hDC1, 0, 0, nWidth, nHeight, hDCMask, xMask, yMask, DSTERASE); - /* 3. make masked Foreground bitmap */ + /* 3. make masked Foreground bitmap */ - /* 3.1 make bitmap */ - hDC2 = NtGdiCreateCompatableDC(hdcDest); - hBitmap3 = NtGdiCreateCompatibleBitmap(hdcDest, nWidth, nHeight); - hOldBitmap3 = (HBITMAP)NtGdiSelectObject(hDC2, hBitmap3); + /* 3.1 make bitmap */ + hDC2 = NtGdiCreateCompatableDC(hdcDest); + hBitmap3 = NtGdiCreateCompatibleBitmap(hdcDest, nWidth, nHeight); + hOldBitmap3 = (HBITMAP)NtGdiSelectObject(hDC2, hBitmap3); - /* 3.2 draw src bitmap and mask */ - NtGdiBitBlt(hDC2, 0, 0, nWidth, nHeight, hdcDest, nXDest, nYDest, SRCCOPY); - NtGdiBitBlt(hDC2, 0, 0, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, FRGND_ROP3(dwRop)); - NtGdiBitBlt(hDC2, 0, 0, nWidth, nHeight, hDCMask, xMask, yMask, SRCAND); + /* 3.2 draw src bitmap and mask */ + NtGdiBitBlt(hDC2, 0, 0, nWidth, nHeight, hdcDest, nXDest, nYDest, SRCCOPY); + NtGdiBitBlt(hDC2, 0, 0, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, FRGND_ROP3(dwRop)); + NtGdiBitBlt(hDC2, 0, 0, nWidth, nHeight, hDCMask, xMask, yMask, SRCAND); - /* 4. combine two bitmap and copy it to hdcDest */ - NtGdiBitBlt(hDC1, 0, 0, nWidth, nHeight, hDC2, 0, 0, SRCPAINT); - NtGdiBitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hDC1, 0, 0, SRCCOPY); + /* 4. combine two bitmap and copy it to hdcDest */ + NtGdiBitBlt(hDC1, 0, 0, nWidth, nHeight, hDC2, 0, 0, SRCPAINT); + NtGdiBitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hDC1, 0, 0, SRCCOPY); - /* 5. restore all object */ - NtGdiSelectObject(hDCMask, hOldMaskBitmap); - NtGdiSelectObject(hDC1, hOldBitmap2); - NtGdiSelectObject(hDC2, hOldBitmap3); + /* 5. restore all object */ + NtGdiSelectObject(hDCMask, hOldMaskBitmap); + NtGdiSelectObject(hDC1, hOldBitmap2); + NtGdiSelectObject(hDC2, hOldBitmap3); - /* 6. delete all temp object */ - NtGdiDeleteObject(hBitmap2); - NtGdiDeleteObject(hBitmap3); + /* 6. delete all temp object */ + NtGdiDeleteObject(hBitmap2); + NtGdiDeleteObject(hBitmap3); - NtGdiDeleteDC(hDC1); - NtGdiDeleteDC(hDC2); - NtGdiDeleteDC(hDCMask); + NtGdiDeleteDC(hDC1); + NtGdiDeleteDC(hDC2); + NtGdiDeleteDC(hDCMask); - return TRUE; + return TRUE; } -BOOL STDCALL NtGdiPlgBlt(HDC hDCDest, - CONST POINT *Point, - HDC hDCSrc, - INT XSrc, - INT YSrc, - INT Width, - INT Height, - HBITMAP hMaskBitmap, - INT xMask, - INT yMask) +BOOL STDCALL +NtGdiPlgBlt( + HDC hDCDest, + CONST POINT *Point, + HDC hDCSrc, + INT XSrc, + INT YSrc, + INT Width, + INT Height, + HBITMAP hMaskBitmap, + INT xMask, + INT yMask) { - UNIMPLEMENTED; + UNIMPLEMENTED; } -LONG STDCALL NtGdiSetBitmapBits(HBITMAP hBitmap, - DWORD Bytes, - CONST VOID *Bits) +LONG STDCALL +NtGdiSetBitmapBits( + HBITMAP hBitmap, + DWORD Bytes, + CONST VOID *Bits) { - LONG height, ret; - PBITMAPOBJ bmp; + LONG height, ret; + PBITMAPOBJ bmp; - bmp = BITMAPOBJ_LockBitmap(hBitmap); - if (bmp == NULL || Bits == NULL) - { - return 0; - } + bmp = BITMAPOBJ_LockBitmap(hBitmap); + if (bmp == NULL || Bits == NULL) + { + return 0; + } - if (Bytes < 0) - { - DPRINT ("(%ld): Negative number of bytes passed???\n", Bytes ); - Bytes = -Bytes; - } + if (Bytes < 0) + { + DPRINT ("(%ld): Negative number of bytes passed???\n", Bytes ); + Bytes = -Bytes; + } - /* Only get entire lines */ - height = Bytes / bmp->bitmap.bmWidthBytes; - if (height > bmp->bitmap.bmHeight) - { - height = bmp->bitmap.bmHeight; - } - Bytes = height * bmp->bitmap.bmWidthBytes; - 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, - height); + /* Only get entire lines */ + height = Bytes / bmp->bitmap.bmWidthBytes; + if (height > bmp->bitmap.bmHeight) + { + height = bmp->bitmap.bmHeight; + } + Bytes = height * bmp->bitmap.bmWidthBytes; + 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, + height); #if 0 - /* FIXME: call DDI specific function here if available */ - if(bmp->DDBitmap) - { - DPRINT ("Calling device specific BitmapBits\n"); - if (bmp->DDBitmap->funcs->pBitmapBits) - { - ret = bmp->DDBitmap->funcs->pBitmapBits(hBitmap, (void *) Bits, Bytes, DDB_SET); - } - else - { - DPRINT ("BitmapBits == NULL??\n"); - ret = 0; - } - } - else + /* FIXME: call DDI specific function here if available */ + if(bmp->DDBitmap) + { + DPRINT ("Calling device specific BitmapBits\n"); + if (bmp->DDBitmap->funcs->pBitmapBits) + { + ret = bmp->DDBitmap->funcs->pBitmapBits(hBitmap, (void *) Bits, Bytes, DDB_SET); + } + else + { + DPRINT ("BitmapBits == NULL??\n"); + ret = 0; + } + } + 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; - } - } + { + /* 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; + } + } - BITMAPOBJ_UnlockBitmap(hBitmap); + BITMAPOBJ_UnlockBitmap(hBitmap); - return ret; + return ret; } -BOOL STDCALL NtGdiSetBitmapDimensionEx(HBITMAP hBitmap, - INT Width, - INT Height, - LPSIZE Size) +BOOL STDCALL +NtGdiSetBitmapDimensionEx( + HBITMAP hBitmap, + INT Width, + INT Height, + LPSIZE Size) { - PBITMAPOBJ bmp; + PBITMAPOBJ bmp; - bmp = BITMAPOBJ_LockBitmap(hBitmap); - if (bmp == NULL) - { - return FALSE; - } + bmp = BITMAPOBJ_LockBitmap(hBitmap); + if (bmp == NULL) + { + return FALSE; + } - if (Size) - { - *Size = bmp->dimension; - } - bmp->dimension.cx = Width; - bmp->dimension.cy = Height; + if (Size) + { + *Size = bmp->dimension; + } + bmp->dimension.cx = Width; + bmp->dimension.cy = Height; - BITMAPOBJ_UnlockBitmap (hBitmap); + BITMAPOBJ_UnlockBitmap (hBitmap); - return TRUE; + return TRUE; } -COLORREF STDCALL NtGdiSetPixel(HDC hDC, - INT X, - INT Y, - COLORREF Color) +COLORREF STDCALL +NtGdiSetPixel( + HDC hDC, + INT X, + INT Y, + COLORREF Color) { - COLORREF cr = NtGdiGetPixel(hDC,X,Y); - if(cr != CLR_INVALID && NtGdiSetPixelV(hDC,X,Y,Color)) - { - return(cr); - } - return ((COLORREF) -1); + COLORREF cr = NtGdiGetPixel(hDC,X,Y); + if(cr != CLR_INVALID && NtGdiSetPixelV(hDC,X,Y,Color)) + { + return(cr); + } + return ((COLORREF) -1); } -BOOL STDCALL NtGdiSetPixelV(HDC hDC, - INT X, - INT Y, - COLORREF Color) +BOOL STDCALL +NtGdiSetPixelV( + HDC hDC, + INT X, + INT Y, + COLORREF Color) { - HBRUSH NewBrush = NtGdiCreateSolidBrush(Color); - HGDIOBJ OldBrush; - - if (NewBrush == NULL) - return(FALSE); - OldBrush = NtGdiSelectObject(hDC, NewBrush); - if (OldBrush == NULL) - return(FALSE); - NtGdiPatBlt(hDC, X, Y, 1, 1, PATCOPY); - NtGdiSelectObject(hDC, OldBrush); - NtGdiDeleteObject(NewBrush); - return TRUE; + HBRUSH NewBrush = NtGdiCreateSolidBrush(Color); + HGDIOBJ OldBrush; + + if (NewBrush == NULL) + return(FALSE); + OldBrush = NtGdiSelectObject(hDC, NewBrush); + if (OldBrush == NULL) + return(FALSE); + NtGdiPatBlt(hDC, X, Y, 1, 1, PATCOPY); + NtGdiSelectObject(hDC, OldBrush); + NtGdiDeleteObject(NewBrush); + return TRUE; } -BOOL STDCALL NtGdiStretchBlt(HDC hDCDest, - INT XOriginDest, - INT YOriginDest, - INT WidthDest, - INT HeightDest, - HDC hDCSrc, - INT XOriginSrc, - INT YOriginSrc, - INT WidthSrc, - INT HeightSrc, - DWORD ROP) +BOOL STDCALL +NtGdiStretchBlt( + HDC hDCDest, + INT XOriginDest, + INT YOriginDest, + INT WidthDest, + INT HeightDest, + HDC hDCSrc, + INT XOriginSrc, + INT YOriginSrc, + INT WidthSrc, + INT HeightSrc, + DWORD ROP) { - PDC DCDest = NULL; - PDC DCSrc = NULL; - PSURFOBJ SurfDest, SurfSrc; - PSURFGDI SurfGDIDest, SurfGDISrc; - RECTL DestRect; - RECTL SourceRect; - BOOL Status; - PPALGDI PalDestGDI, PalSourceGDI; - PXLATEOBJ XlateObj = NULL; - HPALETTE SourcePalette, DestPalette; - ULONG SourceMode, DestMode; - PBRUSHOBJ BrushObj; - BOOL UsesSource = ((ROP & 0xCC0000) >> 2) != (ROP & 0x330000); - BOOL UsesPattern = ((ROP & 0xF00000) >> 4) != (ROP & 0x0F0000); + PDC DCDest = NULL; + PDC DCSrc = NULL; + PSURFOBJ SurfDest, SurfSrc; + PSURFGDI SurfGDIDest, SurfGDISrc; + RECTL DestRect; + RECTL SourceRect; + BOOL Status; + PPALGDI PalDestGDI, PalSourceGDI; + PXLATEOBJ XlateObj = NULL; + HPALETTE SourcePalette, DestPalette; + ULONG SourceMode, DestMode; + PBRUSHOBJ BrushObj; + BOOL UsesSource = ((ROP & 0xCC0000) >> 2) != (ROP & 0x330000); + BOOL UsesPattern = ((ROP & 0xF00000) >> 4) != (ROP & 0x0F0000); - if (0 == WidthDest || 0 == HeightDest || 0 == WidthSrc || 0 == HeightSrc) - { - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return FALSE; - } - DCDest = DC_LockDc(hDCDest); - if (NULL == DCDest) - { - DPRINT1("Invalid destination dc handle (0x%08x) passed to NtGdiStretchBlt\n", hDCDest); - SetLastWin32Error(ERROR_INVALID_HANDLE); - return FALSE; - } + if (0 == WidthDest || 0 == HeightDest || 0 == WidthSrc || 0 == HeightSrc) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return FALSE; + } + DCDest = DC_LockDc(hDCDest); + if (NULL == DCDest) + { + DPRINT1("Invalid destination dc handle (0x%08x) passed to NtGdiStretchBlt\n", hDCDest); + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } - if (UsesSource) - { - if (hDCSrc != hDCDest) - { - DCSrc = DC_LockDc(hDCSrc); - if (NULL == DCSrc) - { - DC_UnlockDc(hDCDest); - DPRINT1("Invalid source dc handle (0x%08x) passed to NtGdiStretchBlt\n", hDCSrc); - SetLastWin32Error(ERROR_INVALID_HANDLE); - return FALSE; - } - } - else - { - DCSrc = DCDest; - } - } - else - { - DCSrc = NULL; - } + if (UsesSource) + { + if (hDCSrc != hDCDest) + { + DCSrc = DC_LockDc(hDCSrc); + if (NULL == DCSrc) + { + DC_UnlockDc(hDCDest); + DPRINT1("Invalid source dc handle (0x%08x) passed to NtGdiStretchBlt\n", hDCSrc); + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } + } + else + { + DCSrc = DCDest; + } + } + else + { + DCSrc = NULL; + } - /* Offset the destination and source by the origin of their DCs. */ - XOriginDest += DCDest->w.DCOrgX; - YOriginDest += DCDest->w.DCOrgY; - if (UsesSource) - { - XOriginSrc += DCSrc->w.DCOrgX; - YOriginSrc += DCSrc->w.DCOrgY; - } + /* Offset the destination and source by the origin of their DCs. */ + XOriginDest += DCDest->w.DCOrgX; + YOriginDest += DCDest->w.DCOrgY; + if (UsesSource) + { + XOriginSrc += DCSrc->w.DCOrgX; + YOriginSrc += DCSrc->w.DCOrgY; + } - DestRect.left = XOriginDest; - DestRect.top = YOriginDest; - DestRect.right = XOriginDest+WidthDest; - DestRect.bottom = YOriginDest+HeightDest; + DestRect.left = XOriginDest; + DestRect.top = YOriginDest; + DestRect.right = XOriginDest+WidthDest; + DestRect.bottom = YOriginDest+HeightDest; - SourceRect.left = XOriginSrc; - SourceRect.top = YOriginSrc; - SourceRect.right = XOriginSrc+WidthSrc; - SourceRect.bottom = YOriginSrc+HeightSrc; + SourceRect.left = XOriginSrc; + SourceRect.top = YOriginSrc; + SourceRect.right = XOriginSrc+WidthSrc; + SourceRect.bottom = YOriginSrc+HeightSrc; - /* Determine surfaces to be used in the bitblt */ - SurfDest = (PSURFOBJ)AccessUserObject((ULONG)DCDest->Surface); - SurfGDIDest = (PSURFGDI)AccessInternalObjectFromUserObject(SurfDest); - if (UsesSource) - { - SurfSrc = (PSURFOBJ)AccessUserObject((ULONG)DCSrc->Surface); - SurfGDISrc = (PSURFGDI)AccessInternalObjectFromUserObject(SurfSrc); - } - else - { - SurfSrc = NULL; - SurfGDISrc = NULL; - } + /* Determine surfaces to be used in the bitblt */ + SurfDest = (PSURFOBJ)AccessUserObject((ULONG)DCDest->Surface); + SurfGDIDest = (PSURFGDI)AccessInternalObjectFromUserObject(SurfDest); + if (UsesSource) + { + SurfSrc = (PSURFOBJ)AccessUserObject((ULONG)DCSrc->Surface); + SurfGDISrc = (PSURFGDI)AccessInternalObjectFromUserObject(SurfSrc); + } + else + { + SurfSrc = NULL; + SurfGDISrc = NULL; + } - if (UsesPattern) - { - BrushObj = BRUSHOBJ_LockBrush(DCDest->w.hBrush); - if (NULL == BrushObj) - { - if (UsesSource && hDCSrc != hDCDest) - { - DC_UnlockDc(hDCSrc); - } - DC_UnlockDc(hDCDest); - SetLastWin32Error(ERROR_INVALID_HANDLE); - return FALSE; - } - } - else - { - BrushObj = NULL; - } + if (UsesPattern) + { + BrushObj = BRUSHOBJ_LockBrush(DCDest->w.hBrush); + if (NULL == BrushObj) + { + if (UsesSource && hDCSrc != hDCDest) + { + DC_UnlockDc(hDCSrc); + } + DC_UnlockDc(hDCDest); + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } + } + else + { + BrushObj = NULL; + } - if (DCDest->w.hPalette != 0) - { - DestPalette = DCDest->w.hPalette; - } - else - { - DestPalette = NtGdiGetStockObject(DEFAULT_PALETTE); - } + if (DCDest->w.hPalette != 0) + { + DestPalette = DCDest->w.hPalette; + } + else + { + DestPalette = NtGdiGetStockObject(DEFAULT_PALETTE); + } - if (UsesSource && DCSrc->w.hPalette != 0) - { - SourcePalette = DCSrc->w.hPalette; - } - else - { - SourcePalette = NtGdiGetStockObject(DEFAULT_PALETTE); - } + if (UsesSource && DCSrc->w.hPalette != 0) + { + SourcePalette = DCSrc->w.hPalette; + } + else + { + SourcePalette = NtGdiGetStockObject(DEFAULT_PALETTE); + } - 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); + 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); - } + 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); + } - XlateObj = (PXLATEOBJ)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; - } + XlateObj = (PXLATEOBJ)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; + } - /* Perform the bitblt operation */ - Status = IntEngStretchBlt(SurfDest, SurfSrc, NULL, DCDest->CombinedClip, - XlateObj, &DestRect, &SourceRect, NULL, NULL, NULL, COLORONCOLOR); + /* Perform the bitblt operation */ + Status = IntEngStretchBlt(SurfDest, SurfSrc, NULL, DCDest->CombinedClip, + XlateObj, &DestRect, &SourceRect, NULL, NULL, NULL, COLORONCOLOR); - EngDeleteXlate(XlateObj); - if (UsesPattern) - { - BRUSHOBJ_UnlockBrush(DCDest->w.hBrush); - } - if (UsesSource && hDCSrc != hDCDest) - { - DC_UnlockDc(hDCSrc); - } - DC_UnlockDc(hDCDest); + EngDeleteXlate(XlateObj); + if (UsesPattern) + { + BRUSHOBJ_UnlockBrush(DCDest->w.hBrush); + } + if (UsesSource && hDCSrc != hDCDest) + { + DC_UnlockDc(hDCSrc); + } + DC_UnlockDc(hDCDest); - return Status; + return Status; } /* Internal Functions */ @@ -1075,86 +1151,88 @@ INT FASTCALL BITMAPOBJ_GetWidthBytes (INT bmWidth, INT bpp) { #if 0 - switch(bpp) - { - case 1: - return 2 * ((bmWidth+15) >> 4); + switch(bpp) + { + case 1: + return 2 * ((bmWidth+15) >> 4); - case 24: - bmWidth *= 3; /* fall through */ - case 8: - return bmWidth + (bmWidth & 1); + case 24: + bmWidth *= 3; /* fall through */ + case 8: + return bmWidth + (bmWidth & 1); - case 32: - return bmWidth * 4; + case 32: + return bmWidth * 4; - case 16: - case 15: - return bmWidth * 2; + case 16: + case 15: + return bmWidth * 2; - case 4: - return 2 * ((bmWidth+3) >> 2); + case 4: + return 2 * ((bmWidth+3) >> 2); - default: - DPRINT ("stub"); - } + default: + DPRINT ("stub"); + } - return -1; + return -1; #endif - return ((bmWidth * bpp + 31) & ~31) >> 3; + return ((bmWidth * bpp + 31) & ~31) >> 3; } -HBITMAP FASTCALL BITMAPOBJ_CopyBitmap(HBITMAP hBitmap) +HBITMAP FASTCALL +BITMAPOBJ_CopyBitmap(HBITMAP hBitmap) { - PBITMAPOBJ bmp; - HBITMAP res; - BITMAP bm; + PBITMAPOBJ bmp; + HBITMAP res; + BITMAP bm; - bmp = BITMAPOBJ_LockBitmap(hBitmap); - if (bmp == NULL) - { - return 0; - } - res = 0; + bmp = BITMAPOBJ_LockBitmap(hBitmap); + if (bmp == NULL) + { + return 0; + } + res = 0; - bm = bmp->bitmap; - bm.bmBits = NULL; - BITMAPOBJ_UnlockBitmap(hBitmap); - res = NtGdiCreateBitmapIndirect(&bm); - if(res) - { - char *buf; + bm = bmp->bitmap; + bm.bmBits = NULL; + BITMAPOBJ_UnlockBitmap(hBitmap); + res = NtGdiCreateBitmapIndirect(&bm); + if(res) + { + char *buf; - buf = ExAllocatePoolWithTag (NonPagedPool, bm.bmWidthBytes * bm.bmHeight, TAG_BITMAP); - NtGdiGetBitmapBits (hBitmap, bm.bmWidthBytes * bm.bmHeight, buf); - NtGdiSetBitmapBits (res, bm.bmWidthBytes * bm.bmHeight, buf); - ExFreePool (buf); - } + buf = ExAllocatePoolWithTag (NonPagedPool, bm.bmWidthBytes * bm.bmHeight, TAG_BITMAP); + NtGdiGetBitmapBits (hBitmap, bm.bmWidthBytes * bm.bmHeight, buf); + NtGdiSetBitmapBits (res, bm.bmWidthBytes * bm.bmHeight, buf); + ExFreePool (buf); + } - return res; + return res; } -INT STDCALL BITMAP_GetObject(BITMAPOBJ * bmp, INT count, LPVOID buffer) +INT STDCALL +BITMAP_GetObject(BITMAPOBJ * bmp, INT count, LPVOID buffer) { - if(bmp->dib) - { - if(count < (INT) sizeof(DIBSECTION)) - { - if (count > (INT) sizeof(BITMAP)) count = sizeof(BITMAP); - } - else - { - if (count > (INT) sizeof(DIBSECTION)) count = sizeof(DIBSECTION); - } - memcpy(buffer, bmp->dib, count); - return count; - } - else - { - if (count > (INT) sizeof(BITMAP)) count = sizeof(BITMAP); - memcpy(buffer, &bmp->bitmap, count); - return count; - } + if(bmp->dib) + { + if(count < (INT) sizeof(DIBSECTION)) + { + if (count > (INT) sizeof(BITMAP)) count = sizeof(BITMAP); + } + else + { + if (count > (INT) sizeof(DIBSECTION)) count = sizeof(DIBSECTION); + } + memcpy(buffer, bmp->dib, count); + return count; + } + else + { + if (count > (INT) sizeof(BITMAP)) count = sizeof(BITMAP); + memcpy(buffer, &bmp->bitmap, count); + return count; + } } /* EOF */ From d52dd4c5cce9d0f88207a3472be7561eb81565be Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Mon, 22 Mar 2004 20:58:16 +0000 Subject: [PATCH 0608/1463] implemented UTF-8 conversion svn path=/trunk/; revision=8840 --- .../subsys/system/explorer/doxy-footer.html | 2 +- reactos/subsys/system/explorer/explorer.cpp | 33 +++++++--- reactos/subsys/system/explorer/globals.h | 6 +- .../system/explorer/taskbar/traynotify.cpp | 2 +- .../subsys/system/explorer/utility/utility.h | 42 ++++++++++-- .../system/explorer/utility/xmlstorage.cpp | 9 +-- .../system/explorer/utility/xmlstorage.h | 65 +++++++++++-------- 7 files changed, 112 insertions(+), 47 deletions(-) diff --git a/reactos/subsys/system/explorer/doxy-footer.html b/reactos/subsys/system/explorer/doxy-footer.html index 59424244acb..4fd39a8383f 100644 --- a/reactos/subsys/system/explorer/doxy-footer.html +++ b/reactos/subsys/system/explorer/doxy-footer.html @@ -3,7 +3,7 @@ <tr> <td><address style="align: right;"><small> ROS Explorer Source Code Documentation -<br>generated on 21.03.2004 by <a href="http://www.doxygen.org/index.html"> +<br>generated on 22.03.2004 by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border=0> </small></address> </td> diff --git a/reactos/subsys/system/explorer/explorer.cpp b/reactos/subsys/system/explorer/explorer.cpp index 5195dfe628a..e390d7119a9 100644 --- a/reactos/subsys/system/explorer/explorer.cpp +++ b/reactos/subsys/system/explorer/explorer.cpp @@ -81,6 +81,29 @@ void ExplorerGlobals::init(HINSTANCE hInstance) _icon_cache.init(); } +bool ExplorerGlobals::read_cfg() +{ + // read configuration file + _cfg_dir.printf(TEXT("%s\\ReactOS"), (LPCTSTR)SpecialFolderFSPath(CSIDL_APPDATA,0)); + _cfg_path.printf(TEXT("%s\\ros-explorer.xml"), _cfg_dir.c_str()); + + if (_cfg.read(_cfg_path)) + return true; + + if (_cfg.read("explorer-cfg-template.xml")) + return true; + + return false; +} + +void ExplorerGlobals::write_cfg() +{ + // write configuration file + RecursiveCreateDirectory(_cfg_dir); + + _cfg.write(_cfg_path); +} + void _log_(LPCTSTR txt) { @@ -746,12 +769,7 @@ int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdL // init common controls library CommonControlInit usingCmnCtrl; - // read configuration file - String cfg_dir = FmtString(TEXT("%s\\ReactOS"), (LPCTSTR)SpecialFolderFSPath(CSIDL_APPDATA,0)); - String cfg_path = FmtString(TEXT("%s\\ros-explorer.xml"), cfg_dir.c_str()); - - if (!g_Globals._cfg.read(cfg_path)) - g_Globals._cfg.read("explorer-cfg-template.xml"); + g_Globals.read_cfg(); if (startup_desktop) { g_Globals._desktops.init(); @@ -779,8 +797,7 @@ int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdL int ret = explorer_main(hInstance, lpCmdLine, nShowCmd); // write configuration file - RecursiveCreateDirectory(cfg_dir); - g_Globals._cfg.write(cfg_path); + g_Globals.write_cfg(); return ret; } diff --git a/reactos/subsys/system/explorer/globals.h b/reactos/subsys/system/explorer/globals.h index 55433a99f57..4aa271ab3d3 100644 --- a/reactos/subsys/system/explorer/globals.h +++ b/reactos/subsys/system/explorer/globals.h @@ -224,7 +224,9 @@ extern struct ExplorerGlobals { ExplorerGlobals(); - void init(HINSTANCE hInstance); + void init(HINSTANCE hInstance); + bool read_cfg(); + void write_cfg(); HINSTANCE _hInstance; ATOM _hframeClass; @@ -249,6 +251,8 @@ extern struct ExplorerGlobals Desktops _desktops; XMLDoc _cfg; + String _cfg_dir; + String _cfg_path; } g_Globals; diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index 7ed28241d74..6c14807a1dd 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -199,7 +199,7 @@ void NotifyArea::read_config() for(XMLNode::Children::const_iterator it=children.begin(); it!=children.end(); ++it) { const XMLNode& node = **it; - assert(node=="icon"); + assert(node==TEXT("icon")); NotifyIconConfig cfg; diff --git a/reactos/subsys/system/explorer/utility/utility.h b/reactos/subsys/system/explorer/utility/utility.h index 4ef04b7041b..7fb8d68a459 100644 --- a/reactos/subsys/system/explorer/utility/utility.h +++ b/reactos/subsys/system/explorer/utility/utility.h @@ -680,7 +680,7 @@ struct BStr WCHAR b[BUFFER_LEN]; if (s) - _p = SysAllocStringLen(b, MultiByteToWideChar(CP_ACP, 0, s, -1, b, BUFFER_LEN)); + _p = SysAllocStringLen(b, MultiByteToWideChar(CP_ACP, 0, s, -1, b, BUFFER_LEN)-1); else _p = NULL; } @@ -744,7 +744,7 @@ struct String String(LPCSTR s, int l) {assign(s, l);} String(const 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));} else erase();} + 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(const BStr& s) {int l = s.length(); super::assign(s, l);} #else @@ -752,7 +752,7 @@ struct String String(LPCWSTR s, int l) {assign(s, l);} String(const 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));} else erase();} + 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(const BStr& s) {int l = s.length(); if (l) {char b[BUFFER_LEN]; super::assign(b, WideCharToMultiByte(CP_ACP, 0, s, l, b, BUFFER_LEN, 0, 0));} else erase();} #endif @@ -767,11 +767,43 @@ struct String operator LPCTSTR() const {return c_str();} #ifdef UNICODE - operator string() const {char b[BUFFER_LEN]; return string(b, WideCharToMultiByte(CP_ACP, 0, c_str(), -1, b, BUFFER_LEN, 0, 0));} + operator string() const {char b[BUFFER_LEN]; return string(b, WideCharToMultiByte(CP_ACP, 0, c_str(), -1, b, BUFFER_LEN, 0, 0)-1);} #else - operator wstring() const {WCHAR b[BUFFER_LEN]; return wstring(b, MultiByteToWideChar(CP_ACP, 0, c_str(), -1, b, BUFFER_LEN));} + operator wstring() const {WCHAR b[BUFFER_LEN]; return wstring(b, MultiByteToWideChar(CP_ACP, 0, c_str(), -1, b, BUFFER_LEN)-1);} #endif + void assign_utf8(const char* str) + { + TCHAR buffer[BUFFER_LEN]; + +#ifdef UNICODE + int l = MultiByteToWideChar(CP_UTF8, 0, str, -1, buffer, BUFFER_LEN) - 1; +#else + WCHAR wbuffer[BUFFER_LEN]; + + int l = MultiByteToWideChar(CP_UTF8, 0, str, -1, wbuffer, BUFFER_LEN) - 1; + l = WideCharToMultiByte(CP_ACP, 0, wbuffer, l, buffer, BUFFER_LEN, 0, 0); +#endif + + assign(buffer, l); + } + + string get_utf8() const + { + char buffer[BUFFER_LEN]; + +#ifdef UNICODE + int l = WideCharToMultiByte(CP_UTF8, 0, c_str(), length(), buffer, BUFFER_LEN, 0, 0); +#else + WCHAR wbuffer[BUFFER_LEN]; + + int l = MultiByteToWideChar(CP_ACP, 0, c_str(), length(), wbuffer, BUFFER_LEN); + l = WideCharToMultiByte(CP_UTF8, 0, wbuffer, l, buffer, BUFFER_LEN, 0, 0); +#endif + + return string(buffer, l); + } + String& printf(LPCTSTR fmt, ...) { va_list l; diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.cpp b/reactos/subsys/system/explorer/utility/xmlstorage.cpp index 61796cead60..0f44e77a4dd 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.cpp +++ b/reactos/subsys/system/explorer/utility/xmlstorage.cpp @@ -72,15 +72,16 @@ void XMLCALL XMLReader::XML_XmlDeclHandler(void* userData, const XML_Char* versi void XMLCALL XMLReader::XML_StartElementHandler(void* userData, const XML_Char* name, const XML_Char** atts) { XMLReader* pThis = (XMLReader*) userData; - XMLNode* node = new XMLNode(name); + + XMLNode* node = new XMLNode(String_from_XML_Char(name)); pThis->_pos.add_down(node); while(*atts) { - const XML_Char* name = *atts++; - const XML_Char* value = *atts++; + const XML_Char* attr_name = *atts++; + const XML_Char* attr_value = *atts++; - (*node)[name] = value; + (*node)[String_from_XML_Char(attr_name)] = String_from_XML_Char(attr_value); } pThis->_in_tag = true; diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.h b/reactos/subsys/system/explorer/utility/xmlstorage.h index 860197ea60d..0c1a7099328 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.h +++ b/reactos/subsys/system/explorer/utility/xmlstorage.h @@ -41,14 +41,31 @@ #define XML_INDENT_SPACE " " - /// in memory representation of an XML node -struct XMLNode : public string +#ifdef XML_UNICODE // Are XML_Char strings UTF-16 encoded? + +typedef String String_from_XML_Char; + +#else + +struct String_from_XML_Char : public String { - typedef map<string, string> AttributeMap; + String_from_XML_Char(const XML_Char* str) + { + assign_utf8(str); + } +}; + +#endif + + + /// in memory representation of an XML node +struct XMLNode : public String +{ + typedef map<String, String> AttributeMap; typedef list<XMLNode*> Children; - XMLNode(const string& name) - : string(name) + XMLNode(const String& name) + : String(name) { } @@ -67,13 +84,13 @@ struct XMLNode : public string } /// write access to an attribute - string& operator[](const string& attr_name) + String& operator[](const String& attr_name) { return _attributes[attr_name]; } /// read only access to an attribute - string operator[](const string& attr_name) const + String operator[](const String& attr_name) const { AttributeMap::const_iterator found = _attributes.find(attr_name); @@ -96,7 +113,7 @@ struct XMLNode : public string return NULL; } - XMLNode* find_first(const string& name) const + XMLNode* find_first(const String& name) const { for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) if (**it == name) @@ -105,18 +122,12 @@ struct XMLNode : public string return NULL; } - XMLNode* find_first(const string& name, const string& attr_name, const string& attr_value) const + XMLNode* find_first(const String& name, const String& attr_name, const String& attr_value) const { for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) { const XMLNode& node = **it; - if (node==name && -#ifdef UNICODE - !strcmp(node[attr_name].c_str(), attr_value.c_str()) // workaround because of STL bug -#else - node[attr_name]==attr_value -#endif - ) + if (node==name && node[attr_name]==attr_value) return *it; } @@ -142,10 +153,10 @@ struct XMLNode : public string /// write XML stream preserving original white space and comments ostream& write(ostream& out) { - out << "<" << *this; + out << "<" << get_utf8(); for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it) - out << " " << it->first << "=\"" << it->second << "\""; + out << " " << it->first.get_utf8() << "=\"" << it->second.get_utf8() << "\""; if (!_children.empty() || !_content.empty()) { out << ">" << _content; @@ -153,7 +164,7 @@ struct XMLNode : public string for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) (*it)->write(out); - out << "</" << *this << ">" << _trailing; + out << "</" << get_utf8() << ">" << _trailing; } else { out << "/>" << _trailing; } @@ -167,10 +178,10 @@ struct XMLNode : public string for(int i=indent; i--; ) out << XML_INDENT_SPACE; - out << "<" << *this; + out << "<" << get_utf8(); for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it) - out << " " << it->first << "=\"" << it->second << "\""; + out << " " << it->first.get_utf8() << "=\"" << it->second.get_utf8() << "\""; if (!_children.empty()) { out << ">\n"; @@ -181,7 +192,7 @@ struct XMLNode : public string for(int i=indent; i--; ) out << XML_INDENT_SPACE; - out << "</" << *this << ">\n"; + out << "</" << get_utf8() << ">\n"; } else { out << "/>\n"; } @@ -215,8 +226,8 @@ struct XMLPos const XMLNode& operator*() const {return *_cur;} /// attribute access - string& operator[](const string& attr_name) {return (*_cur)[attr_name];} - string operator[](const string& attr_name) const {return (*_cur)[attr_name];} + String& operator[](const String& attr_name) {return (*_cur)[attr_name];} + String operator[](const String& attr_name) const {return (*_cur)[attr_name];} /// insert children when building tree void add_down(XMLNode* child) @@ -249,7 +260,7 @@ struct XMLPos } /// search for child and go down - bool go_down(const string& name) + bool go_down(const String& name) { XMLNode* node = _cur->find_first(name); @@ -261,7 +272,7 @@ struct XMLPos } /// create node if not already existing and move to it - void create(const string& name) + void create(const String& name) { XMLNode* node = _cur->find_first(name); @@ -272,7 +283,7 @@ struct XMLPos } /// search matching child node identified by key name and an attribute value - void create(const string& name, const string& attr_name, const string& attr_value) + void create(const String& name, const String& attr_name, const String& attr_value) { XMLNode* node = _cur->find_first(name, attr_name, attr_value); From e6bd3bc673cee0ce1ab35989aa0be46a609894e5 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Mon, 22 Mar 2004 21:40:12 +0000 Subject: [PATCH 0609/1463] merge Wine commit: - Mike McCormack <mike@codeweavers.com> Unicode-ify the icon cache and SHGetFileInfo. - fix by M. Fuchs svn path=/trunk/; revision=8841 --- reactos/lib/shell32/folders.c | 1 - reactos/lib/shell32/iconcache.c | 83 ++++++++++++++----------- reactos/lib/shell32/shell32_main.c | 98 ++++++++++++++++-------------- reactos/lib/shell32/shell32_main.h | 3 +- 4 files changed, 99 insertions(+), 86 deletions(-) diff --git a/reactos/lib/shell32/folders.c b/reactos/lib/shell32/folders.c index 184d8811441..ca3f3e3f1f6 100644 --- a/reactos/lib/shell32/folders.c +++ b/reactos/lib/shell32/folders.c @@ -151,7 +151,6 @@ static ULONG WINAPI IExtractIconW_fnRelease(IExtractIconW * iface) } WCHAR swShell32Name[MAX_PATH]; -char sShell32Name[MAX_PATH]; /************************************************************************** * IExtractIconW_GetIconLocation diff --git a/reactos/lib/shell32/iconcache.c b/reactos/lib/shell32/iconcache.c index a5ea881698d..3be5f0fd34f 100644 --- a/reactos/lib/shell32/iconcache.c +++ b/reactos/lib/shell32/iconcache.c @@ -53,7 +53,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell); typedef struct { - LPSTR sSourceFile; /* file (not path!) containing the icon */ + LPWSTR sSourceFile; /* file (not path!) containing the icon */ DWORD dwSourceIndex; /* index within the file, if it is a resoure ID it will be negated */ DWORD dwListIndex; /* index within the iconlist */ DWORD dwFlags; /* GIL_* flags */ @@ -83,7 +83,7 @@ static INT CALLBACK SIC_CompareEntries( LPVOID p1, LPVOID p2, LPARAM lparam) if (((LPSIC_ENTRY)p1)->dwSourceIndex != ((LPSIC_ENTRY)p2)->dwSourceIndex) /* first the faster one*/ return 1; - if (strcasecmp(((LPSIC_ENTRY)p1)->sSourceFile,((LPSIC_ENTRY)p2)->sSourceFile)) + if (strcmpiW(((LPSIC_ENTRY)p1)->sSourceFile,((LPSIC_ENTRY)p2)->sSourceFile)) return 1; return 0; @@ -94,17 +94,17 @@ static INT CALLBACK SIC_CompareEntries( LPVOID p1, LPVOID p2, LPARAM lparam) * NOTES * appends an icon pair to the end of the cache */ -static INT SIC_IconAppend (LPCSTR sSourceFile, INT dwSourceIndex, HICON hSmallIcon, HICON hBigIcon) +static INT SIC_IconAppend (LPCWSTR sSourceFile, INT dwSourceIndex, HICON hSmallIcon, HICON hBigIcon) { LPSIC_ENTRY lpsice; INT ret, index, index1; - char path[MAX_PATH]; - TRACE("%s %i %p %p\n", sSourceFile, dwSourceIndex, hSmallIcon ,hBigIcon); + WCHAR path[MAX_PATH]; + TRACE("%s %i %p %p\n", debugstr_w(sSourceFile), dwSourceIndex, hSmallIcon ,hBigIcon); lpsice = (LPSIC_ENTRY) SHAlloc (sizeof (SIC_ENTRY)); - GetFullPathNameA(sSourceFile, MAX_PATH, path, NULL); - lpsice->sSourceFile = HeapAlloc( GetProcessHeap(), 0, strlen(path)+1 ); - strcpy( lpsice->sSourceFile, path ); + GetFullPathNameW(sSourceFile, MAX_PATH, path, NULL); + lpsice->sSourceFile = HeapAlloc( GetProcessHeap(), 0, (strlenW(path)+1)*sizeof(WCHAR) ); + strcpyW( lpsice->sSourceFile, path ); lpsice->dwSourceIndex = dwSourceIndex; @@ -139,30 +139,30 @@ static INT SIC_IconAppend (LPCSTR sSourceFile, INT dwSourceIndex, HICON hSmallIc * NOTES * gets small/big icon by number from a file */ -static INT SIC_LoadIcon (LPCSTR sSourceFile, INT dwSourceIndex) +static INT SIC_LoadIcon (LPCWSTR sSourceFile, INT dwSourceIndex) { HICON hiconLarge=0; HICON hiconSmall=0; #if defined(__CYGWIN__) || defined (__MINGW32__) || defined(_MSC_VER) - static UINT (WINAPI*PrivateExtractIconExA)(LPCSTR,int,HICON*,HICON*,UINT) = NULL; + static UINT (WINAPI*PrivateExtractIconExW)(LPCWSTR,int,HICON*,HICON*,UINT) = NULL; - if (!PrivateExtractIconExA) { + if (!PrivateExtractIconExW) { HMODULE hUser32 = GetModuleHandleA("user32"); - PrivateExtractIconExA = (UINT(WINAPI*)(LPCSTR,int,HICON*,HICON*,UINT)) GetProcAddress(hUser32, "PrivateExtractIconExA"); + PrivateExtractIconExW = (UINT(WINAPI*)(LPCWSTR,int,HICON*,HICON*,UINT)) GetProcAddress(hUser32, "PrivateExtractIconExW"); } - if (PrivateExtractIconExA) - PrivateExtractIconExA(sSourceFile, dwSourceIndex, &hiconLarge, &hiconSmall, 1); + if (PrivateExtractIconExW) + PrivateExtractIconExW(sSourceFile, dwSourceIndex, &hiconLarge, &hiconSmall, 1); else #endif { - PrivateExtractIconsA(sSourceFile, dwSourceIndex, 32, 32, &hiconLarge, NULL, 1, 0); - PrivateExtractIconsA(sSourceFile, dwSourceIndex, 16, 16, &hiconSmall, NULL, 1, 0); + PrivateExtractIconsW(sSourceFile, dwSourceIndex, 32, 32, &hiconLarge, NULL, 1, 0); + PrivateExtractIconsW(sSourceFile, dwSourceIndex, 16, 16, &hiconSmall, NULL, 1, 0); } if ( !hiconLarge || !hiconSmall) { - WARN("failure loading icon %i from %s (%p %p)\n", dwSourceIndex, sSourceFile, hiconLarge, hiconSmall); + WARN("failure loading icon %i from %s (%p %p)\n", dwSourceIndex, debugstr_w(sSourceFile), hiconLarge, hiconSmall); return -1; } return SIC_IconAppend (sSourceFile, dwSourceIndex, hiconSmall, hiconLarge); @@ -178,14 +178,15 @@ static INT SIC_LoadIcon (LPCSTR sSourceFile, INT dwSourceIndex) * look in the cache for a proper icon. if not available the icon is taken * from the file and cached */ -INT SIC_GetIconIndex (LPCSTR sSourceFile, INT dwSourceIndex ) -{ SIC_ENTRY sice; +INT SIC_GetIconIndex (LPCWSTR sSourceFile, INT dwSourceIndex ) +{ + SIC_ENTRY sice; INT ret, index = INVALID_INDEX; - char path[MAX_PATH]; + WCHAR path[MAX_PATH]; - TRACE("%s %i\n", sSourceFile, dwSourceIndex); + TRACE("%s %i\n", debugstr_w(sSourceFile), dwSourceIndex); - GetFullPathNameA(sSourceFile, MAX_PATH, path, NULL); + GetFullPathNameW(sSourceFile, MAX_PATH, path, NULL); sice.sSourceFile = path; sice.dwSourceIndex = dwSourceIndex; @@ -216,10 +217,10 @@ INT SIC_GetIconIndex (LPCSTR sSourceFile, INT dwSourceIndex ) * NOTES * retrieves the specified icon from the iconcache. */ -static HICON WINE_UNUSED SIC_GetIcon (LPCSTR sSourceFile, INT dwSourceIndex, BOOL bSmallIcon ) +static HICON WINE_UNUSED SIC_GetIcon (LPCWSTR sSourceFile, INT dwSourceIndex, BOOL bSmallIcon ) { INT index; - TRACE("%s %i\n", sSourceFile, dwSourceIndex); + TRACE("%s %i\n", debugstr_w(sSourceFile), dwSourceIndex); index = SIC_GetIconIndex(sSourceFile, dwSourceIndex); @@ -280,7 +281,7 @@ BOOL SIC_Initialize(void) hSm = LoadImageA(shell32_hInstance, MAKEINTRESOURCEA(1), IMAGE_ICON, cx_small, cy_small, LR_SHARED); hLg = LoadImageA(shell32_hInstance, MAKEINTRESOURCEA(1), IMAGE_ICON, cx_large, cy_large, LR_SHARED); } - SIC_IconAppend (sShell32Name, index, hSm, hLg); + SIC_IconAppend (swShell32Name, index, hSm, hLg); } TRACE("hIconSmall=%p hIconBig=%p\n",ShellSmallIconList, ShellBigIconList); @@ -349,22 +350,22 @@ BOOL PidlToSicIndex ( UINT uFlags, int * pIndex) { - IExtractIconA *ei; - char szIconFile[MAX_PATH]; /* file containing the icon */ + IExtractIconW *ei; + WCHAR szIconFile[MAX_PATH]; /* file containing the icon */ INT iSourceIndex; /* index or resID(negated) in this file */ BOOL ret = FALSE; UINT dwFlags = 0; TRACE("sf=%p pidl=%p %s\n", sh, pidl, bBigIcon?"Big":"Small"); - if (SUCCEEDED (IShellFolder_GetUIObjectOf(sh, 0, 1, &pidl, &IID_IExtractIconA, 0, (void **)&ei))) + if (SUCCEEDED (IShellFolder_GetUIObjectOf(sh, 0, 1, &pidl, &IID_IExtractIconW, 0, (void **)&ei))) { - if (SUCCEEDED(IExtractIconA_GetIconLocation(ei, uFlags, szIconFile, MAX_PATH, &iSourceIndex, &dwFlags))) + if (SUCCEEDED(IExtractIconW_GetIconLocation(ei, uFlags, szIconFile, MAX_PATH, &iSourceIndex, &dwFlags))) { *pIndex = SIC_GetIconIndex(szIconFile, iSourceIndex); ret = TRUE; } - IExtractIconA_Release(ei); + IExtractIconW_Release(ei); } if (INVALID_INDEX == *pIndex) /* default icon when failed */ @@ -408,19 +409,27 @@ int WINAPI SHMapPIDLToSystemImageListIndex( */ INT WINAPI Shell_GetCachedImageIndexA(LPCSTR szPath, INT nIndex, BOOL bSimulateDoc) { + INT ret, len; + LPWSTR szTemp; + WARN("(%s,%08x,%08x) semi-stub.\n",debugstr_a(szPath), nIndex, bSimulateDoc); - return SIC_GetIconIndex(szPath, nIndex); + + len = MultiByteToWideChar( CP_ACP, 0, szPath, -1, NULL, 0 ); + szTemp = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ); + MultiByteToWideChar( CP_ACP, 0, szPath, -1, szTemp, len ); + + ret = SIC_GetIconIndex( szTemp, nIndex ); + + HeapFree( GetProcessHeap(), 0, szTemp ); + + return ret; } INT WINAPI Shell_GetCachedImageIndexW(LPCWSTR szPath, INT nIndex, BOOL bSimulateDoc) -{ INT ret; - LPSTR sTemp = HEAP_strdupWtoA (GetProcessHeap(),0,szPath); - +{ WARN("(%s,%08x,%08x) semi-stub.\n",debugstr_w(szPath), nIndex, bSimulateDoc); - ret = SIC_GetIconIndex(sTemp, nIndex); - HeapFree(GetProcessHeap(),0,sTemp); - return ret; + return SIC_GetIconIndex(szPath, nIndex); } INT WINAPI Shell_GetCachedImageIndexAW(LPCVOID szPath, INT nIndex, BOOL bSimulateDoc) diff --git a/reactos/lib/shell32/shell32_main.c b/reactos/lib/shell32/shell32_main.c index ff55e46fe24..fa79faf559b 100644 --- a/reactos/lib/shell32/shell32_main.c +++ b/reactos/lib/shell32/shell32_main.c @@ -208,21 +208,21 @@ LPWSTR* WINAPI CommandLineToArgvW(LPCWSTR lpCmdline, int* numargs) * */ -DWORD WINAPI SHGetFileInfoA(LPCSTR path,DWORD dwFileAttributes, - SHFILEINFOA *psfi, UINT sizeofpsfi, +DWORD WINAPI SHGetFileInfoW(LPCWSTR path,DWORD dwFileAttributes, + SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags ) { - char szLocation[MAX_PATH], szFullPath[MAX_PATH]; + WCHAR szLocation[MAX_PATH], szFullPath[MAX_PATH]; int iIndex; DWORD ret = TRUE, dwAttributes = 0; IShellFolder * psfParent = NULL; - IExtractIconA * pei = NULL; + IExtractIconW * pei = NULL; LPITEMIDLIST pidlLast = NULL, pidl = NULL; HRESULT hr = S_OK; BOOL IconNotYetLoaded=TRUE; TRACE("(%s fattr=0x%lx sfi=%p(attr=0x%08lx) size=0x%x flags=0x%x)\n", - (flags & SHGFI_PIDL)? "pidl" : path, dwFileAttributes, psfi, psfi->dwAttributes, sizeofpsfi, flags); + (flags & SHGFI_PIDL)? "pidl" : debugstr_w(path), dwFileAttributes, psfi, psfi->dwAttributes, sizeofpsfi, flags); if ((flags & SHGFI_USEFILEATTRIBUTES) && (flags & (SHGFI_ATTRIBUTES|SHGFI_EXETYPE|SHGFI_PIDL))) return FALSE; @@ -236,11 +236,11 @@ DWORD WINAPI SHGetFileInfoA(LPCSTR path,DWORD dwFileAttributes, if (!(flags & SHGFI_PIDL)){ /* SHGitFileInfo should work with absolute and relative paths */ - if (PathIsRelativeA(path)){ - GetCurrentDirectoryA(MAX_PATH, szLocation); - PathCombineA(szFullPath, szLocation, path); + if (PathIsRelativeW(path)){ + GetCurrentDirectoryW(MAX_PATH, szLocation); + PathCombineW(szFullPath, szLocation, path); } else { - lstrcpynA(szFullPath, path, MAX_PATH); + lstrcpynW(szFullPath, path, MAX_PATH); } } @@ -255,12 +255,12 @@ DWORD WINAPI SHGetFileInfoA(LPCSTR path,DWORD dwFileAttributes, if (flags != SHGFI_EXETYPE) return 0; - status = GetBinaryTypeA (szFullPath, &BinaryType); + status = GetBinaryTypeW (szFullPath, &BinaryType); if (!status) return 0; if ((BinaryType == SCS_DOS_BINARY) || (BinaryType == SCS_PIF_BINARY)) return 0x4d5a; - hfile = CreateFileA( szFullPath, GENERIC_READ, FILE_SHARE_READ, + hfile = CreateFileW( szFullPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0 ); if ( hfile == INVALID_HANDLE_VALUE ) return 0; @@ -313,7 +313,7 @@ DWORD WINAPI SHGetFileInfoA(LPCSTR path,DWORD dwFileAttributes, if (flags & SHGFI_PIDL) { pidl = ILClone((LPCITEMIDLIST)path); } else if (!(flags & SHGFI_USEFILEATTRIBUTES)) { - hr = SHILCreateFromPathA(szFullPath, &pidl, &dwAttributes); + hr = SHILCreateFromPathW(szFullPath, &pidl, &dwAttributes); } if ((flags & SHGFI_PIDL) || !(flags & SHGFI_USEFILEATTRIBUTES)) @@ -343,34 +343,40 @@ DWORD WINAPI SHGetFileInfoA(LPCSTR path,DWORD dwFileAttributes, { if (flags & SHGFI_USEFILEATTRIBUTES) { - strcpy (psfi->szDisplayName, PathFindFileNameA(szFullPath)); + lstrcpyW (psfi->szDisplayName, PathFindFileNameW(szFullPath)); } else { STRRET str; hr = IShellFolder_GetDisplayNameOf(psfParent, pidlLast, SHGDN_INFOLDER, &str); - StrRetToStrNA (psfi->szDisplayName, MAX_PATH, &str, pidlLast); + StrRetToStrNW (psfi->szDisplayName, MAX_PATH, &str, pidlLast); } } /* get the type name */ if (SUCCEEDED(hr) && (flags & SHGFI_TYPENAME)) { + WCHAR szFile[] = { 'F','i','l','e',0 }; + WCHAR szDashFile[] = { '-','f','i','l','e',0 }; if (!(flags & SHGFI_USEFILEATTRIBUTES)) - _ILGetFileType(pidlLast, psfi->szTypeName, 80); + { + char ftype[80]; + _ILGetFileType(pidlLast, ftype, 80); + MultiByteToWideChar(CP_ACP, 0, ftype, -1, psfi->szTypeName, 80 ); + } else { if (dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - strcat (psfi->szTypeName, "File"); + strcatW (psfi->szTypeName, szFile); else { - char sTemp[64]; - strcpy(sTemp,PathFindExtensionA(szFullPath)); - if (!( HCR_MapTypeToValueA(sTemp, sTemp, 64, TRUE) - && HCR_MapTypeToValueA(sTemp, psfi->szTypeName, 80, FALSE ))) + WCHAR sTemp[64]; + lstrcpyW(sTemp,PathFindExtensionW(szFullPath)); + if (!( HCR_MapTypeToValueW(sTemp, sTemp, 64, TRUE) + && HCR_MapTypeToValueW(sTemp, psfi->szTypeName, 80, FALSE ))) { - lstrcpynA (psfi->szTypeName, sTemp, 64); - strcat (psfi->szTypeName, "-file"); + lstrcpynW (psfi->szTypeName, sTemp, 64); + strcatW (psfi->szTypeName, szDashFile); } } } @@ -394,11 +400,11 @@ DWORD WINAPI SHGetFileInfoA(LPCSTR path,DWORD dwFileAttributes, if (SUCCEEDED(hr)) { - hr = IExtractIconA_GetIconLocation(pei, (flags & SHGFI_OPENICON)? GIL_OPENICON : 0,szLocation, MAX_PATH, &iIndex, &uFlags); + hr = IExtractIconW_GetIconLocation(pei, (flags & SHGFI_OPENICON)? GIL_OPENICON : 0,szLocation, MAX_PATH, &iIndex, &uFlags); psfi->iIcon = iIndex; if(uFlags != GIL_NOTFILENAME) - strcpy (psfi->szDisplayName, szLocation); + lstrcpyW (psfi->szDisplayName, szLocation); else ret = FALSE; @@ -412,23 +418,24 @@ DWORD WINAPI SHGetFileInfoA(LPCSTR path,DWORD dwFileAttributes, if (flags & SHGFI_USEFILEATTRIBUTES) { - char sTemp [MAX_PATH]; - char * szExt; + WCHAR sTemp [MAX_PATH]; + WCHAR * szExt; DWORD dwNr=0; - lstrcpynA(sTemp, szFullPath, MAX_PATH); + lstrcpynW(sTemp, szFullPath, MAX_PATH); if (dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) psfi->iIcon = 2; else { + WCHAR p1W[] = {'%','1',0}; psfi->iIcon = 0; - szExt = (LPSTR) PathFindExtensionA(sTemp); - if ( szExt && HCR_MapTypeToValueA(szExt, sTemp, MAX_PATH, TRUE) - && HCR_GetDefaultIconA(sTemp, sTemp, MAX_PATH, &dwNr)) + szExt = (LPWSTR) PathFindExtensionW(sTemp); + if ( szExt && HCR_MapTypeToValueW(szExt, sTemp, MAX_PATH, TRUE) + && HCR_GetDefaultIconW(sTemp, sTemp, MAX_PATH, &dwNr)) { - if (!strcmp("%1",sTemp)) /* icon is in the file */ - strcpy(sTemp, szFullPath); + if (!lstrcmpW(p1W,sTemp)) /* icon is in the file */ + strcpyW(sTemp, szFullPath); if (flags & SHGFI_SYSICONINDEX) { @@ -438,7 +445,7 @@ DWORD WINAPI SHGetFileInfoA(LPCSTR path,DWORD dwFileAttributes, else { IconNotYetLoaded=FALSE; - PrivateExtractIconsA(sTemp,dwNr,(flags & SHGFI_SMALLICON) ? + PrivateExtractIconsW(sTemp,dwNr,(flags & SHGFI_SMALLICON) ? GetSystemMetrics(SM_CXSMICON) : GetSystemMetrics(SM_CXICON), (flags & SHGFI_SMALLICON) ? GetSystemMetrics(SM_CYSMICON) : GetSystemMetrics(SM_CYICON), &psfi->hIcon,0,1,0); @@ -477,7 +484,7 @@ DWORD WINAPI SHGetFileInfoA(LPCSTR path,DWORD dwFileAttributes, if(pidlLast) SHFree(pidlLast); #ifdef MORE_DEBUG TRACE ("icon=%p index=0x%08x attr=0x%08lx name=%s type=%s ret=0x%08lx\n", - psfi->hIcon, psfi->iIcon, psfi->dwAttributes, psfi->szDisplayName, psfi->szTypeName, ret); + psfi->hIcon, psfi->iIcon, psfi->dwAttributes, debugstr_w(psfi->szDisplayName), debugstr_w(psfi->szTypeName), ret); #endif return ret; } @@ -486,28 +493,28 @@ DWORD WINAPI SHGetFileInfoA(LPCSTR path,DWORD dwFileAttributes, * SHGetFileInfoW [SHELL32.@] */ -DWORD WINAPI SHGetFileInfoW(LPCWSTR path,DWORD dwFileAttributes, - SHFILEINFOW *psfi, UINT sizeofpsfi, +DWORD WINAPI SHGetFileInfoA(LPCSTR path,DWORD dwFileAttributes, + SHFILEINFOA *psfi, UINT sizeofpsfi, UINT flags ) { INT len; - LPSTR temppath; + LPWSTR temppath; DWORD ret; - SHFILEINFOA temppsfi; + SHFILEINFOW temppsfi; if (flags & SHGFI_PIDL) { /* path contains a pidl */ - temppath = (LPSTR) path; + temppath = (LPWSTR) path; } else { - len = WideCharToMultiByte(CP_ACP, 0, path, -1, NULL, 0, NULL, NULL); - temppath = HeapAlloc(GetProcessHeap(), 0, len); - WideCharToMultiByte(CP_ACP, 0, path, -1, temppath, len, NULL, NULL); + len = MultiByteToWideChar(CP_ACP, 0, path, -1, NULL, 0); + temppath = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, path, -1, temppath, len); } if(psfi && (flags & SHGFI_ATTR_SPECIFIED)) temppsfi.dwAttributes=psfi->dwAttributes; - ret = SHGetFileInfoA(temppath, dwFileAttributes, (psfi == NULL)? NULL : &temppsfi, sizeof(temppsfi), flags); + ret = SHGetFileInfoW(temppath, dwFileAttributes, (psfi == NULL)? NULL : &temppsfi, sizeof(temppsfi), flags); if (psfi) { @@ -518,9 +525,9 @@ DWORD WINAPI SHGetFileInfoW(LPCWSTR path,DWORD dwFileAttributes, if(flags & SHGFI_ATTRIBUTES) psfi->dwAttributes=temppsfi.dwAttributes; if(flags & (SHGFI_DISPLAYNAME|SHGFI_ICONLOCATION)) - MultiByteToWideChar(CP_ACP, 0, temppsfi.szDisplayName, -1, psfi->szDisplayName, sizeof(psfi->szDisplayName)); + WideCharToMultiByte(CP_ACP, 0, temppsfi.szDisplayName, -1, psfi->szDisplayName, sizeof(psfi->szDisplayName), NULL, NULL); if(flags & SHGFI_TYPENAME) - MultiByteToWideChar(CP_ACP, 0, temppsfi.szTypeName, -1, psfi->szTypeName, sizeof(psfi->szTypeName)); + WideCharToMultiByte(CP_ACP, 0, temppsfi.szTypeName, -1, psfi->szTypeName, sizeof(psfi->szTypeName), NULL, NULL); } if(!(flags & SHGFI_PIDL)) HeapFree(GetProcessHeap(), 0, temppath); return ret; @@ -916,7 +923,6 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad) /* get full path to this DLL for IExtractIconW_fnGetIconLocation() */ GetModuleFileNameW(hinstDLL, swShell32Name, MAX_PATH); - WideCharToMultiByte(CP_ACP, 0, swShell32Name, -1, sShell32Name, MAX_PATH, NULL, NULL); InitCommonControlsEx(NULL); diff --git a/reactos/lib/shell32/shell32_main.h b/reactos/lib/shell32/shell32_main.h index 9db2043324a..97e3ee92095 100644 --- a/reactos/lib/shell32/shell32_main.h +++ b/reactos/lib/shell32/shell32_main.h @@ -53,7 +53,7 @@ BOOL WINAPI Shell_GetImageList(HIMAGELIST * lpBigList, HIMAGELIST * lpSmallList) BOOL SIC_Initialize(void); void SIC_Destroy(void); BOOL PidlToSicIndex (IShellFolder * sh, LPCITEMIDLIST pidl, BOOL bBigIcon, UINT uFlags, int * pIndex); -INT SIC_GetIconIndex (LPCSTR sSourceFile, INT dwSourceIndex ); +INT SIC_GetIconIndex (LPCWSTR sSourceFile, INT dwSourceIndex ); /* Classes Root */ BOOL HCR_MapTypeToValueW(LPCWSTR szExtension, LPWSTR szFileType, DWORD len, BOOL bPrependDot); @@ -248,6 +248,5 @@ 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]; -extern char sShell32Name[MAX_PATH]; #endif From d26e06ebdfa7f86e93adf51264269c3c7146d811 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Mon, 22 Mar 2004 22:56:04 +0000 Subject: [PATCH 0610/1463] - Merged partial Wine commit: Mike McCormack <mike@codeweavers.com> Update path from relative path on loading. - moved GetFullPathName() from IShellLink_ConstructFromFile() into IShellLinkA/W_fnSetPath() svn path=/trunk/; revision=8842 --- reactos/lib/shell32/shelllink.c | 50 ++++++++++++++++----------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/reactos/lib/shell32/shelllink.c b/reactos/lib/shell32/shelllink.c index 47a1d75e6a3..1b0b8219924 100644 --- a/reactos/lib/shell32/shelllink.c +++ b/reactos/lib/shell32/shelllink.c @@ -157,6 +157,7 @@ typedef struct #define _ICOM_THIS_From_IPersistStream(class, name) class* This = (class*)(((char*)name)-_IPersistStream_Offset) #define _IPersistStream_From_ICOM_THIS(class, name) class* StreamThis = (class*)(((char*)name)+_IPersistStream_Offset) +static HRESULT ShellLink_UpdatePath(LPWSTR sPathRel, LPCWSTR path, LPCWSTR sWorkDir, LPWSTR* psPath); /* strdup on the process heap */ inline static LPWSTR HEAP_strdupAtoW( HANDLE heap, DWORD flags, LPCSTR str) @@ -238,6 +239,7 @@ static HRESULT WINAPI IPersistFile_fnLoad(IPersistFile* iface, LPCOLESTR pszFile if( SUCCEEDED( r ) ) { r = IPersistStream_Load(StreamThis, stm); + ShellLink_UpdatePath(This->sPathRel, pszFileName, This->sWorkDir, &This->sPath); IStream_Release( stm ); } @@ -828,10 +830,10 @@ static BOOL SHELL_ExistsFileW(LPCWSTR path) } /************************************************************************** - * SHELL_ShellLink_UpdatePath + * ShellLink_UpdatePath * update absolute path in sPath using relative path in sPathRel */ -static HRESULT SHELL_ShellLink_UpdatePath(LPWSTR sPathRel, LPCWSTR path, LPCWSTR sWorkDir, LPWSTR* psPath) +static HRESULT ShellLink_UpdatePath(LPWSTR sPathRel, LPCWSTR path, LPCWSTR sWorkDir, LPWSTR* psPath) { if (!path || !psPath) return E_INVALIDARG; @@ -910,27 +912,13 @@ HRESULT WINAPI IShellLink_ConstructFromFile ( if (SUCCEEDED(hr)) { WCHAR path[MAX_PATH]; - if (SHGetPathFromIDListW(pidl, path)) { + hr = SHELL_GetPathFromIDListW(pidl, path, MAX_PATH); + + if (SUCCEEDED(hr)) { hr = IPersistFile_Load(ppf, path, 0); - if (SUCCEEDED(hr)) { + if (SUCCEEDED(hr)) *ppv = (IUnknown*) psl; - - /* - The following code is here, not in IPersistStream_fnLoad() because - to be able to convert the relative path into the absolute path, - we need to know the path of the shell link file. - */ - if (IsEqualIID(riid, &IID_IShellLinkW)) { - _ICOM_THIS_From_IShellLinkW(IShellLinkImpl, psl); - - hr = SHELL_ShellLink_UpdatePath(This->sPathRel, path, This->sWorkDir, &This->sPath); - } else { - ICOM_THIS(IShellLinkImpl, psl); - - hr = SHELL_ShellLink_UpdatePath(This->sPathRel, path, This->sWorkDir, &This->sPath); - } - } } IPersistFile_Release(ppf); @@ -1320,7 +1308,7 @@ static HRESULT WINAPI IShellLinkA_fnSetRelativePath(IShellLinkA * iface, LPCSTR This->sPathRel = HEAP_strdupAtoW(GetProcessHeap(), 0, pszPathRel); This->bDirty = TRUE; - return SHELL_ShellLink_UpdatePath(This->sPathRel, This->sPath, This->sWorkDir, &This->sPath); + return ShellLink_UpdatePath(This->sPathRel, This->sPath, This->sWorkDir, &This->sPath); } static HRESULT WINAPI IShellLinkA_fnResolve(IShellLinkA * iface, HWND hwnd, DWORD fFlags) @@ -1367,12 +1355,18 @@ static HRESULT WINAPI IShellLinkA_fnResolve(IShellLinkA * iface, HWND hwnd, DWOR static HRESULT WINAPI IShellLinkA_fnSetPath(IShellLinkA * iface, LPCSTR pszFile) { ICOM_THIS(IShellLinkImpl, iface); + char buffer[MAX_PATH]; + LPCSTR fname; TRACE("(%p)->(path=%s)\n",This, pszFile); + if (!GetFullPathNameA(pszFile, MAX_PATH, buffer, &fname)) + return E_FAIL; + if (This->sPath) HeapFree(GetProcessHeap(), 0, This->sPath); - This->sPath = HEAP_strdupAtoW(GetProcessHeap(), 0, pszFile); + + This->sPath = HEAP_strdupAtoW(GetProcessHeap(), 0, buffer); if( !This->sPath ) return E_OUTOFMEMORY; @@ -1749,7 +1743,7 @@ static HRESULT WINAPI IShellLinkW_fnSetRelativePath(IShellLinkW * iface, LPCWSTR lstrcpyW( This->sPathRel, pszPathRel ); This->bDirty = TRUE; - return SHELL_ShellLink_UpdatePath(This->sPathRel, This->sPath, This->sWorkDir, &This->sPath); + return ShellLink_UpdatePath(This->sPathRel, This->sPath, This->sWorkDir, &This->sPath); } static HRESULT WINAPI IShellLinkW_fnResolve(IShellLinkW * iface, HWND hwnd, DWORD fFlags) @@ -1796,17 +1790,23 @@ static HRESULT WINAPI IShellLinkW_fnResolve(IShellLinkW * iface, HWND hwnd, DWOR static HRESULT WINAPI IShellLinkW_fnSetPath(IShellLinkW * iface, LPCWSTR pszFile) { _ICOM_THIS_From_IShellLinkW(IShellLinkImpl, iface); + WCHAR buffer[MAX_PATH]; + LPCSTR fname; TRACE("(%p)->(path=%s)\n",This, debugstr_w(pszFile)); + if (!GetFullPathNameW(pszFile, MAX_PATH, buffer, &fname)) + return E_FAIL; + if (This->sPath) HeapFree(GetProcessHeap(), 0, This->sPath); + This->sPath = HeapAlloc( GetProcessHeap(), 0, - (lstrlenW( pszFile )+1) * sizeof (WCHAR) ); + (lstrlenW( buffer )+1) * sizeof (WCHAR) ); if ( !This->sPath ) return E_OUTOFMEMORY; - lstrcpyW( This->sPath, pszFile ); + lstrcpyW( This->sPath, buffer ); This->bDirty = TRUE; return S_OK; From 4aae87650041b5f78c7e94f35ce9a100b20a09ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Tue, 23 Mar 2004 00:12:24 +0000 Subject: [PATCH 0611/1463] Silence debug messages svn path=/trunk/; revision=8843 --- reactos/drivers/storage/scsiport/scsiport.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/storage/scsiport/scsiport.c b/reactos/drivers/storage/scsiport/scsiport.c index 5e3b7454164..0fe70eca30a 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.48 2004/03/22 19:59:31 navaraf Exp $ +/* $Id: scsiport.c,v 1.49 2004/03/23 00:12:24 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -33,7 +33,7 @@ #include <ddk/ntddscsi.h> #include <rosrtl/string.h> -//#define NDEBUG +#define NDEBUG #include <debug.h> From c718f507e968cfd6da692738ec3829976f926cd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Tue, 23 Mar 2004 00:18:54 +0000 Subject: [PATCH 0612/1463] Implement EnumFontFamilies(Ex)A/W() and TranslateCharsetInfo() svn path=/trunk/; revision=8844 --- reactos/bootdata/hivesft.inf | 6 + reactos/iface/addsys/w32ksvc.db | 3 +- reactos/include/defines.h | 19 + reactos/include/structs.h | 8 +- reactos/include/win32k/font.h | 26 + reactos/include/win32k/kapi.h | 1 + reactos/include/win32k/text.h | 21 - reactos/lib/gdi32/include/internal/font.h | 21 + reactos/lib/gdi32/makefile | 3 +- reactos/lib/gdi32/misc/stubs.c | 18 +- reactos/lib/gdi32/misc/stubsa.c | 62 +- reactos/lib/gdi32/misc/stubsw.c | 45 +- reactos/lib/gdi32/objects/font.c | 332 ++++++++ reactos/lib/gdi32/objects/text.c | 133 +-- reactos/subsys/win32k/objects/text.c | 955 +++++++++++++++++++++- 15 files changed, 1335 insertions(+), 318 deletions(-) create mode 100644 reactos/include/win32k/font.h create mode 100644 reactos/lib/gdi32/include/internal/font.h create mode 100644 reactos/lib/gdi32/objects/font.c diff --git a/reactos/bootdata/hivesft.inf b/reactos/bootdata/hivesft.inf index b2dcf0d67c0..9f2adb591eb 100644 --- a/reactos/bootdata/hivesft.inf +++ b/reactos/bootdata/hivesft.inf @@ -37,4 +37,10 @@ HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","StartServices",0x000 HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","StartGUI",0x00010001,0x00000000 HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","Userinit",0x00020000,"%SystemRoot%\system32\userinit.exe" +; Font substitutes +; SysFontSubstitutes are also returned by EnumFontFamilies, FontSubstitutes aren't +HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SysFontSubstitutes","Arial",0x00000000,"Bitstream Vera Sans" +HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SysFontSubstitutes","Courier New",0x00000000,"Bitstream Vera Sans Mono" +HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SysFontSubstitutes","Times New Roman",0x00000000,"Bitstream Vera Serif" + ; EOF diff --git a/reactos/iface/addsys/w32ksvc.db b/reactos/iface/addsys/w32ksvc.db index c7d66aa2dbf..11c8d75ede3 100644 --- a/reactos/iface/addsys/w32ksvc.db +++ b/reactos/iface/addsys/w32ksvc.db @@ -66,8 +66,6 @@ NtGdiEndDoc 1 NtGdiEndPage 1 NtGdiEndPath 1 NtGdiEnumEnhMetaFile 5 -NtGdiEnumFontFamilies 4 -NtGdiEnumFontFamiliesEx 5 NtGdiEnumFonts 4 NtGdiEnumICMProfiles 3 NtGdiEnumMetaFile 4 @@ -126,6 +124,7 @@ NtGdiGetEnhMetaFileDescription 3 NtGdiGetEnhMetaFileHeader 3 NtGdiGetEnhMetaFilePaletteEntries 3 NtGdiGetEnhMetaFilePixelFormat 3 +NtGdiGetFontFamilyInfo 4 NtGdiGetFontLanguageInfo 1 #NtGdiGetFontResourceInfo ? NtGdiGetGlyphOutline 7 diff --git a/reactos/include/defines.h b/reactos/include/defines.h index 4efbc97f542..e71c52138cd 100644 --- a/reactos/include/defines.h +++ b/reactos/include/defines.h @@ -468,10 +468,12 @@ extern "C" { #define SYMBOL_CHARSET (2) #define SHIFTJIS_CHARSET (128) #define HANGEUL_CHARSET (129) +#define JOHAB_CHARSET (130) #define GB2312_CHARSET (134) #define CHINESEBIG5_CHARSET (136) #define GREEK_CHARSET (161) #define TURKISH_CHARSET (162) +#define VIETNAMESE_CHARSET (163) #define HEBREW_CHARSET (177) #define ARABIC_CHARSET (178) #define BALTIC_CHARSET (186) @@ -3276,6 +3278,18 @@ extern "C" { #define PAN_XHEIGHT_DUCKING_SMALL (5) #define PAN_XHEIGHT_DUCKING_STD (6) #define PAN_XHEIGHT_DUCKING_LARGE (7) +#define PANOSE_COUNT (10) +#define PAN_FAMILYTYPE_INDEX (0) +#define PAN_SERIFSTYLE_INDEX (1) +#define PAN_WEIGTH_INDEX (2) +#define PAN_PROPORTION_INDEX (3) +#define PAN_CONTRAST_INDEX (4) +#define PAN_STROKEVARIATION_INDEX (5) +#define PAN_ARMSTYLE_INDEX (6) +#define PAN_LETTERFORM_INDEX (7) +#define PAN_MIDLINE_INDEX (8) +#define PAN_XHEIGHT_INDEX (9) +#define PAN_CULTURE_LATIN (0) /* PALETTENTRY structure */ #define PC_EXPLICIT (2) @@ -4777,6 +4791,11 @@ extern "C" { #define TMPF_TRUETYPE (0x4) #define TMPF_DEVICE (0x8) +/* NEWTEXTMETRIC structure */ +#define NTM_ITALIC (0x01) +#define NTM_BOLD (0x20) +#define NTM_REGULAR (0x40) + /* CopyFileEx options */ #define COPY_FILE_FAIL_IF_EXISTS (1) diff --git a/reactos/include/structs.h b/reactos/include/structs.h index 8bc4bec495e..7029477246b 100644 --- a/reactos/include/structs.h +++ b/reactos/include/structs.h @@ -3634,13 +3634,13 @@ typedef struct tagNEWTEXTMETRICW { typedef_tident(NEWTEXTMETRIC) typedef struct tagNEWTEXTMETRICEXA { - NEWTEXTMETRICA ntmentm; - FONTSIGNATURE ntmeFontSignature; + NEWTEXTMETRICA ntmTm; + FONTSIGNATURE ntmFontSig; } NEWTEXTMETRICEXA; typedef struct tagNEWTEXTMETRICEXW { - NEWTEXTMETRICW ntmentm; - FONTSIGNATURE ntmeFontSignature; + NEWTEXTMETRICW ntmTm; + FONTSIGNATURE ntmFontSig; } NEWTEXTMETRICEXW; typedef_tident(NEWTEXTMETRICEX) diff --git a/reactos/include/win32k/font.h b/reactos/include/win32k/font.h new file mode 100644 index 00000000000..bea3c9f3ac6 --- /dev/null +++ b/reactos/include/win32k/font.h @@ -0,0 +1,26 @@ +/* $Id: font.h,v 1.1 2004/03/23 00:18:54 gvg Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * FILE: include/win32k/font.h + * PURPOSE: GDI32/Win32k font interface + * PROGRAMMER: + * + */ + +#ifndef WIN32K_FONT_H_INCLUDED +#define WIN32K_FONT_H_INCLUDED + +#include <windows.h> + +typedef struct tagFONTFAMILYINFO +{ + ENUMLOGFONTEXW EnumLogFontEx; + NEWTEXTMETRICEXW NewTextMetricEx; + DWORD FontType; +} FONTFAMILYINFO, *PFONTFAMILYINFO; + +int STDCALL NtGdiGetFontFamilyInfo(HDC Dc, LPLOGFONTW LogFont, PFONTFAMILYINFO Info, DWORD Size); +BOOL STDCALL NtGdiTranslateCharsetInfo(PDWORD Src, LPCHARSETINFO CSI, DWORD Flags); + +#endif /* WIN32K_FONT_H_INCLUDED */ diff --git a/reactos/include/win32k/kapi.h b/reactos/include/win32k/kapi.h index 5806a614806..0836fe64dee 100644 --- a/reactos/include/win32k/kapi.h +++ b/reactos/include/win32k/kapi.h @@ -9,6 +9,7 @@ #include <win32k/dc.h> #include <win32k/debug.h> #include <win32k/fillshap.h> +#include <win32k/font.h> #include <win32k/icm.h> #include <win32k/line.h> #include <win32k/metafile.h> diff --git a/reactos/include/win32k/text.h b/reactos/include/win32k/text.h index 94c7c008d0a..8129784095b 100644 --- a/reactos/include/win32k/text.h +++ b/reactos/include/win32k/text.h @@ -53,21 +53,6 @@ NtGdiCreateScalableFontResource(DWORD Hidden, LPCWSTR FontFile, LPCWSTR CurrentPath); -int -STDCALL -NtGdiEnumFontFamilies(HDC hDC, - LPCWSTR Family, - FONTENUMPROCW EnumFontFamProc, - LPARAM lParam); - -int -STDCALL -NtGdiEnumFontFamiliesEx(HDC hDC, - LPLOGFONTW Logfont, - FONTENUMEXPROCW EnumFontFamExProc, - LPARAM lParam, - DWORD Flags); - int STDCALL NtGdiEnumFonts(HDC hDC, @@ -250,11 +235,5 @@ NtGdiTextOut(HDC hDC, LPCWSTR String, int Count); -UINT -STDCALL -NtGdiTranslateCharsetInfo(PDWORD Src, - LPCHARSETINFO CSI, - DWORD Flags); - #endif diff --git a/reactos/lib/gdi32/include/internal/font.h b/reactos/lib/gdi32/include/internal/font.h new file mode 100644 index 00000000000..35b0cf01da2 --- /dev/null +++ b/reactos/lib/gdi32/include/internal/font.h @@ -0,0 +1,21 @@ +/* $Id: font.h,v 1.1 2004/03/23 00:18:54 gvg Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * FILE: lib/gdi32/include/internal/font.h + * PURPOSE: + * PROGRAMMER: + * + */ + +#ifndef GDI32_FONT_H_INCLUDED +#define GDI32_FONT_H_INCLUDED + +#include <windows.h> + +BOOL FASTCALL TextMetricW2A(TEXTMETRICA *tma, TEXTMETRICW *tmw); +BOOL FASTCALL NewTextMetricW2A(NEWTEXTMETRICA *tma, NEWTEXTMETRICW *tmw); +BOOL FASTCALL NewTextMetricExW2A(NEWTEXTMETRICEXA *tma, NEWTEXTMETRICEXW *tmw); + +#endif + diff --git a/reactos/lib/gdi32/makefile b/reactos/lib/gdi32/makefile index e944af61166..86831eac0e3 100644 --- a/reactos/lib/gdi32/makefile +++ b/reactos/lib/gdi32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.35 2003/11/16 22:44:39 sedwards Exp $ +# $Id: makefile,v 1.36 2004/03/23 00:18:54 gvg Exp $ PATH_TO_TOP = ../.. @@ -38,6 +38,7 @@ OBJECTS_OBJECTS = \ objects/clip.o \ objects/dc.o \ objects/fillshap.o \ + objects/font.o \ objects/line.o \ objects/linedda.o \ objects/metafile.o \ diff --git a/reactos/lib/gdi32/misc/stubs.c b/reactos/lib/gdi32/misc/stubs.c index 8a587a9a417..376399cc06f 100644 --- a/reactos/lib/gdi32/misc/stubs.c +++ b/reactos/lib/gdi32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.49 2004/02/14 00:31:38 sedwards Exp $ +/* $Id: stubs.c,v 1.50 2004/03/23 00:18:54 gvg Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -380,22 +380,6 @@ GetTextCharsetInfo( } -/* - * @unimplemented - */ -BOOL -STDCALL -TranslateCharsetInfo( - DWORD FAR *lpSrc, - LPCHARSETINFO lpCs, - DWORD dwFlags - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - /* * @unimplemented */ diff --git a/reactos/lib/gdi32/misc/stubsa.c b/reactos/lib/gdi32/misc/stubsa.c index 106bb36530f..531307de99f 100644 --- a/reactos/lib/gdi32/misc/stubsa.c +++ b/reactos/lib/gdi32/misc/stubsa.c @@ -1,4 +1,4 @@ -/* $Id: stubsa.c,v 1.27 2004/01/24 08:23:12 ekohl Exp $ +/* $Id: stubsa.c,v 1.28 2004/03/23 00:18:54 gvg Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -175,66 +175,6 @@ DeviceCapabilitiesExA( } -/* - * @unimplemented - */ -int -STDCALL -EnumFontFamiliesExA ( - HDC hdc, - LPLOGFONTA lpLogFont, - FONTENUMEXPROCA lpEnumFontFamProc, - LPARAM lParam, - DWORD dwFlags - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -#if 0 - LOGFONTW LogFontW; - - RosRtlLogFontA2W ( &LogFontW, lpLogFont ); - - /* no need to convert LogFontW back to lpLogFont b/c it's an [in] parameter only */ - return NtGdiEnumFontFamiliesEx ( hdc, &LogFontW, lpEnumFontFamProc, lParam, dwFlags ); -#endif -} - - -/* - * @unimplemented - */ -int -STDCALL -EnumFontFamiliesA( - HDC hdc, - LPCSTR lpszFamily, - FONTENUMPROCA lpEnumFontFamProc, - LPARAM lParam - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -#if 0 - NTSTATUS Status; - LPWSTR lpszFamilyW; - int rc = 0; - - Status = HEAP_strdupA2W ( &lpszFamilyW, lpszFamily ); - if (!NT_SUCCESS (Status)) - SetLastError (RtlNtStatusToDosError(Status)); - else - { - rc = NtGdiEnumFontFamilies ( hdc, lpszFamilyW, lpEnumFontFamProc, lParam ); - - HEAP_free ( lpszFamilyW ); - } - - return rc; -#endif -} - - /* * @implemented */ diff --git a/reactos/lib/gdi32/misc/stubsw.c b/reactos/lib/gdi32/misc/stubsw.c index b22e8087e76..be9db44c9ae 100644 --- a/reactos/lib/gdi32/misc/stubsw.c +++ b/reactos/lib/gdi32/misc/stubsw.c @@ -1,4 +1,4 @@ -/* $Id: stubsw.c,v 1.24 2004/01/24 08:23:12 ekohl Exp $ +/* $Id: stubsw.c,v 1.25 2004/03/23 00:18:54 gvg Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -112,49 +112,6 @@ DeviceCapabilitiesExW( } -/* - * @unimplemented - */ -int -STDCALL -EnumFontFamiliesExW( - HDC hdc, - LPLOGFONTW lpLogFont, - FONTENUMEXPROCW lpEnumFontFamProc, - LPARAM lParam, - DWORD dwFlags - ) -{ -#if 0 - return NtGdiEnumFontFamiliesEx ( hdc, lpLogFont, lpEnumFontFamProc, lParam, dwFlags ); -#else - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -#endif -} - - -/* - * @unimplemented - */ -int -STDCALL -EnumFontFamiliesW( - HDC hdc, - LPCWSTR lpszFamily, - FONTENUMPROCW lpEnumFontFamProc, - LPARAM lParam - ) -{ -#if 0 - return NtGdiEnumFontFamilies ( hdc, lpszFamily, lpEnumFontFamProc, lParam ); -#else - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -#endif -} - - /* * @unimplemented */ diff --git a/reactos/lib/gdi32/objects/font.c b/reactos/lib/gdi32/objects/font.c new file mode 100644 index 00000000000..f7f301d6ac2 --- /dev/null +++ b/reactos/lib/gdi32/objects/font.c @@ -0,0 +1,332 @@ +/* $Id: font.c,v 1.1 2004/03/23 00:18:54 gvg Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * FILE: lib/gdi32/object/font.c + * PURPOSE: + * PROGRAMMER: + * + */ + +#ifdef UNICODE +#undef UNICODE +#endif + +#include <windows.h> +#include <rosrtl/logfont.h> +#include <win32k/font.h> +#include <internal/font.h> + +#define NDEBUG +#include <debug.h> + +#define INITIAL_FAMILY_COUNT 64 + +static BOOL FASTCALL +MetricsCharConvert(WCHAR w, CHAR *b) + { + UNICODE_STRING WString; + WCHAR WBuf[2]; + ANSI_STRING AString; + CHAR ABuf[2]; + NTSTATUS Status; + + if (L'\0' == w) + { + *b = '\0'; + } + else + { + WBuf[0] = w; + WBuf[1] = L'\0'; + RtlInitUnicodeString(&WString, WBuf); + ABuf[0] = '*'; + ABuf[1] = L'\0'; + RtlInitAnsiString(&AString, ABuf); + + Status = RtlUnicodeStringToAnsiString(&AString, &WString, FALSE); + if (! NT_SUCCESS(Status)) + { + SetLastError(RtlNtStatusToDosError(Status)); + return FALSE; + } + *b = ABuf[0]; + } + + return TRUE; +} + +BOOL FASTCALL +TextMetricW2A(TEXTMETRICA *tma, TEXTMETRICW *tmw) +{ + UNICODE_STRING WString; + WCHAR WBuf[256]; + ANSI_STRING AString; + CHAR ABuf[256]; + UINT Letter; + NTSTATUS Status; + + tma->tmHeight = tmw->tmHeight; + tma->tmAscent = tmw->tmAscent; + tma->tmDescent = tmw->tmDescent; + tma->tmInternalLeading = tmw->tmInternalLeading; + tma->tmExternalLeading = tmw->tmExternalLeading; + tma->tmAveCharWidth = tmw->tmAveCharWidth; + tma->tmMaxCharWidth = tmw->tmMaxCharWidth; + tma->tmWeight = tmw->tmWeight; + tma->tmOverhang = tmw->tmOverhang; + tma->tmDigitizedAspectX = tmw->tmDigitizedAspectX; + tma->tmDigitizedAspectY = tmw->tmDigitizedAspectY; + + /* The Unicode FirstChar/LastChar need not correspond to the ANSI + FirstChar/LastChar. For example, if the font contains glyphs for + letters A-Z and an accented version of the letter e, the Unicode + FirstChar would be A and the Unicode LastChar would be the accented + e. If you just translate those to ANSI, the range would become + letters A-E instead of A-Z. + We translate all possible ANSI chars to Unicode and find the first + and last translated character which fall into the Unicode FirstChar/ + LastChar range and return the corresponding ANSI char. */ + + /* Setup an Ansi string containing all possible letters (note: skip '\0' at + the beginning since that would be interpreted as end-of-string, handle + '\0' special later */ + for (Letter = 1; Letter < 256; Letter++) + { + ABuf[Letter - 1] = (CHAR) Letter; + WBuf[Letter - 1] = L' '; + } + ABuf[255] = '\0'; + WBuf[255] = L'\0'; + RtlInitAnsiString(&AString, ABuf); + RtlInitUnicodeString(&WString, WBuf); + + /* Find the corresponding Unicode characters */ + Status = RtlAnsiStringToUnicodeString(&WString, &AString, FALSE); + if (! NT_SUCCESS(Status)) + { + SetLastError(RtlNtStatusToDosError(Status)); + return FALSE; + } + + /* Scan for the first ANSI character which maps to an Unicode character + in the range */ + tma->tmFirstChar = '\0'; + if (L'\0' != tmw->tmFirstChar) + { + for (Letter = 1; Letter < 256; Letter++) + { + if (tmw->tmFirstChar <= WBuf[Letter - 1] && + WBuf[Letter - 1] <= tmw->tmLastChar) + { + tma->tmFirstChar = (CHAR) Letter; + break; + } + } + } + + /* Scan for the last ANSI character which maps to an Unicode character + in the range */ + tma->tmLastChar = '\0'; + if (L'\0' != tmw->tmLastChar) + { + for (Letter = 255; 0 < Letter; Letter--) + { + if (tmw->tmFirstChar <= WBuf[Letter - 1] && + WBuf[Letter - 1] <= tmw->tmLastChar) + { + tma->tmLastChar = (CHAR) Letter; + break; + } + } + } + + if (! MetricsCharConvert(tmw->tmDefaultChar, &tma->tmDefaultChar) || + ! MetricsCharConvert(tmw->tmBreakChar, &tma->tmBreakChar)) + { + return FALSE; + } + + tma->tmItalic = tmw->tmItalic; + tma->tmUnderlined = tmw->tmUnderlined; + tma->tmStruckOut = tmw->tmStruckOut; + tma->tmPitchAndFamily = tmw->tmPitchAndFamily; + tma->tmCharSet = tmw->tmCharSet; + + return TRUE; +} + +BOOL FASTCALL +NewTextMetricW2A(NEWTEXTMETRICA *tma, NEWTEXTMETRICW *tmw) +{ + if (! TextMetricW2A((TEXTMETRICA *) tma, (TEXTMETRICW *) tmw)) + { + return FALSE; + } + + tma->ntmFlags = tmw->ntmFlags; + tma->ntmSizeEM = tmw->ntmSizeEM; + tma->ntmCellHeight = tmw->ntmCellHeight; + tma->ntmAvgWidth = tmw->ntmAvgWidth; + + return TRUE; +} + +BOOL FASTCALL +NewTextMetricExW2A(NEWTEXTMETRICEXA *tma, NEWTEXTMETRICEXW *tmw) +{ + if (! NewTextMetricW2A(&tma->ntmTm, &tmw->ntmTm)) + { + return FALSE; + } + + tma->ntmFontSig = tmw->ntmFontSig; + + return TRUE; +} + +/* + * @implemented + */ +BOOL +STDCALL +TranslateCharsetInfo(DWORD *Src, LPCHARSETINFO Cs, DWORD Flags) +{ + return NtGdiTranslateCharsetInfo(Src, Cs, Flags); +} + +static int FASTCALL +IntEnumFontFamilies(HDC Dc, LPLOGFONTW LogFont, PVOID EnumProc, LPARAM lParam, + BOOL Unicode) +{ + int FontFamilyCount; + unsigned FontFamilySize; + PFONTFAMILYINFO Info; + int Ret; + unsigned i; + ENUMLOGFONTEXA EnumLogFontExA; + NEWTEXTMETRICEXA NewTextMetricExA; + + Info = RtlAllocateHeap(GetProcessHeap(), 0, + INITIAL_FAMILY_COUNT * sizeof(FONTFAMILYINFO)); + if (NULL == Info) + { + return 0; + } + FontFamilyCount = NtGdiGetFontFamilyInfo(Dc, LogFont, Info, INITIAL_FAMILY_COUNT); + if (FontFamilyCount < 0) + { + RtlFreeHeap(GetProcessHeap(), 0, Info); + return 0; + } + if (INITIAL_FAMILY_COUNT < FontFamilyCount) + { + FontFamilySize = FontFamilyCount; + RtlFreeHeap(GetProcessHeap(), 0, Info); + Info = RtlAllocateHeap(GetProcessHeap(), 0, + FontFamilyCount * sizeof(FONTFAMILYINFO)); + if (NULL == Info) + { + return 0; + } + FontFamilyCount = NtGdiGetFontFamilyInfo(Dc, LogFont, Info, FontFamilySize); + if (FontFamilyCount < 0 || FontFamilySize < FontFamilyCount) + { + RtlFreeHeap(GetProcessHeap(), 0, Info); + return 0; + } + } + + for (i = 0; i < FontFamilyCount; i++) + { + if (Unicode) + { + Ret = ((FONTENUMEXPROCW) EnumProc)(&Info[i].EnumLogFontEx, &Info[i].NewTextMetricEx, + Info[i].FontType, lParam); + } + else + { + RosRtlLogFontW2A(&EnumLogFontExA.elfLogFont, &Info[i].EnumLogFontEx.elfLogFont); + WideCharToMultiByte(CP_THREAD_ACP, 0, Info[i].EnumLogFontEx.elfFullName, -1, + EnumLogFontExA.elfFullName, LF_FULLFACESIZE, NULL, NULL); + WideCharToMultiByte(CP_THREAD_ACP, 0, Info[i].EnumLogFontEx.elfStyle, -1, + EnumLogFontExA.elfStyle, LF_FACESIZE, NULL, NULL); + WideCharToMultiByte(CP_THREAD_ACP, 0, Info[i].EnumLogFontEx.elfScript, -1, + EnumLogFontExA.elfScript, LF_FACESIZE, NULL, NULL); + NewTextMetricExW2A(&NewTextMetricExA, + &Info[i].NewTextMetricEx); + Ret = ((FONTENUMEXPROCA) EnumProc)(&EnumLogFontExA, &NewTextMetricExA, + Info[i].FontType, lParam); + } + } + + RtlFreeHeap(GetProcessHeap(), 0, Info); + + return Ret; +} + +/* + * @implemented + */ +int STDCALL +EnumFontFamiliesExW(HDC Dc, LPLOGFONTW LogFont, FONTENUMEXPROCW EnumFontFamProc, + LPARAM lParam, DWORD Flags) +{ + return IntEnumFontFamilies(Dc, LogFont, EnumFontFamProc, lParam, TRUE); +} + + +/* + * @implemented + */ +int STDCALL +EnumFontFamiliesW(HDC Dc, LPCWSTR Family, FONTENUMPROCW EnumFontFamProc, + LPARAM lParam) +{ + LOGFONTW LogFont; + + ZeroMemory(&LogFont, sizeof(LOGFONTW)); + LogFont.lfCharSet = DEFAULT_CHARSET; + if (NULL != Family) + { + lstrcpynW(LogFont.lfFaceName, Family, LF_FACESIZE); + } + + return IntEnumFontFamilies(Dc, &LogFont, EnumFontFamProc, lParam, TRUE); +} + + +/* + * @implemented + */ +int STDCALL +EnumFontFamiliesExA (HDC Dc, LPLOGFONTA LogFont, FONTENUMEXPROCA EnumFontFamProc, + LPARAM lParam, DWORD dwFlags) +{ + LOGFONTW LogFontW; + + RosRtlLogFontA2W(&LogFontW, LogFont); + + /* no need to convert LogFontW back to lpLogFont b/c it's an [in] parameter only */ + return IntEnumFontFamilies(Dc, &LogFontW, EnumFontFamProc, lParam, FALSE); +} + + +/* + * @implemented + */ +int STDCALL +EnumFontFamiliesA(HDC Dc, LPCSTR Family, FONTENUMPROCA EnumFontFamProc, + LPARAM lParam) +{ + LOGFONTW LogFont; + + ZeroMemory(&LogFont, sizeof(LOGFONTW)); + LogFont.lfCharSet = DEFAULT_CHARSET; + if (NULL != Family) + { + MultiByteToWideChar(CP_THREAD_ACP, 0, Family, -1, LogFont.lfFaceName, LF_FACESIZE); + } + + return IntEnumFontFamilies(Dc, &LogFont, EnumFontFamProc, lParam, FALSE); +} diff --git a/reactos/lib/gdi32/objects/text.c b/reactos/lib/gdi32/objects/text.c index 56de5c6014e..459e2a7e807 100644 --- a/reactos/lib/gdi32/objects/text.c +++ b/reactos/lib/gdi32/objects/text.c @@ -7,6 +7,7 @@ #include <windows.h> #include <ddk/ntddk.h> #include <win32k/kapi.h> +#include <internal/font.h> /* @@ -78,41 +79,6 @@ SetTextColor(HDC hDC, COLORREF color) } -static BOOL -MetricsCharConvert(WCHAR w, CHAR *b) - { - UNICODE_STRING WString; - WCHAR WBuf[2]; - ANSI_STRING AString; - CHAR ABuf[2]; - NTSTATUS Status; - - if (L'\0' == w) - { - *b = '\0'; - } - else - { - WBuf[0] = w; - WBuf[1] = L'\0'; - RtlInitUnicodeString(&WString, WBuf); - ABuf[0] = '*'; - ABuf[1] = L'\0'; - RtlInitAnsiString(&AString, ABuf); - - Status = RtlUnicodeStringToAnsiString(&AString, &WString, FALSE); - if (! NT_SUCCESS(Status)) - { - SetLastError(RtlNtStatusToDosError(Status)); - return FALSE; - } - *b = ABuf[0]; - } - - return TRUE; - } - - /* * @implemented */ @@ -124,106 +90,13 @@ GetTextMetricsA( ) { TEXTMETRICW tmw; - UNICODE_STRING WString; - WCHAR WBuf[256]; - ANSI_STRING AString; - CHAR ABuf[256]; - UINT Letter; - NTSTATUS Status; if (! NtGdiGetTextMetrics(hdc, &tmw)) { return FALSE; } - tm->tmHeight = tmw.tmHeight; - tm->tmAscent = tmw.tmAscent; - tm->tmDescent = tmw.tmDescent; - tm->tmInternalLeading = tmw.tmInternalLeading; - tm->tmExternalLeading = tmw.tmExternalLeading; - tm->tmAveCharWidth = tmw.tmAveCharWidth; - tm->tmMaxCharWidth = tmw.tmMaxCharWidth; - tm->tmWeight = tmw.tmWeight; - tm->tmOverhang = tmw.tmOverhang; - tm->tmDigitizedAspectX = tmw.tmDigitizedAspectX; - tm->tmDigitizedAspectY = tmw.tmDigitizedAspectY; - - /* The Unicode FirstChar/LastChar need not correspond to the ANSI - FirstChar/LastChar. For example, if the font contains glyphs for - letters A-Z and an accented version of the letter e, the Unicode - FirstChar would be A and the Unicode LastChar would be the accented - e. If you just translate those to ANSI, the range would become - letters A-E instead of A-Z. - We translate all possible ANSI chars to Unicode and find the first - and last translated character which fall into the Unicode FirstChar/ - LastChar range and return the corresponding ANSI char. */ - - /* Setup an Ansi string containing all possible letters (note: skip '\0' at - the beginning since that would be interpreted as end-of-string, handle - '\0' special later */ - for (Letter = 1; Letter < 256; Letter++) - { - ABuf[Letter - 1] = (CHAR) Letter; - WBuf[Letter - 1] = L' '; - } - ABuf[255] = '\0'; - WBuf[255] = L'\0'; - RtlInitAnsiString(&AString, ABuf); - RtlInitUnicodeString(&WString, WBuf); - - /* Find the corresponding Unicode characters */ - Status = RtlAnsiStringToUnicodeString(&WString, &AString, FALSE); - if (! NT_SUCCESS(Status)) - { - SetLastError(RtlNtStatusToDosError(Status)); - return FALSE; - } - - /* Scan for the first ANSI character which maps to an Unicode character - in the range */ - tm->tmFirstChar = '\0'; - if (L'\0' != tmw.tmFirstChar) - { - for (Letter = 1; Letter < 256; Letter++) - { - if (tmw.tmFirstChar <= WBuf[Letter - 1] && - WBuf[Letter - 1] <= tmw.tmLastChar) - { - tm->tmFirstChar = (CHAR) Letter; - break; - } - } - } - - /* Scan for the last ANSI character which maps to an Unicode character - in the range */ - tm->tmLastChar = '\0'; - if (L'\0' != tmw.tmLastChar) - { - for (Letter = 255; 0 < Letter; Letter--) - { - if (tmw.tmFirstChar <= WBuf[Letter - 1] && - WBuf[Letter - 1] <= tmw.tmLastChar) - { - tm->tmLastChar = (CHAR) Letter; - break; - } - } - } - - if (! MetricsCharConvert(tmw.tmDefaultChar, &tm->tmDefaultChar) || - ! MetricsCharConvert(tmw.tmBreakChar, &tm->tmBreakChar)) - { - return FALSE; - } - - tm->tmItalic = tmw.tmItalic; - tm->tmUnderlined = tmw.tmUnderlined; - tm->tmStruckOut = tmw.tmStruckOut; - tm->tmPitchAndFamily = tmw.tmPitchAndFamily; - tm->tmCharSet = tmw.tmCharSet; - - return TRUE; + return TextMetricW2A(tm, &tmw); } @@ -237,7 +110,7 @@ GetTextMetricsW( LPTEXTMETRICW tm ) { - return NtGdiGetTextMetrics(hdc, tm); + return NtGdiGetTextMetrics(hdc, tm); } diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index b234d33940d..b890f7528a7 100644 --- a/reactos/subsys/win32k/objects/text.c +++ b/reactos/subsys/win32k/objects/text.c @@ -1,22 +1,28 @@ /* - * ReactOS W32 Subsystem - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team + * 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. + * Parts based on Wine code + * Copyright 1993 Alexandre Julliard + * 1997 Alex Korobka + * Copyright 2002,2003 Shachar Shemesh + * Copyright 2001 Huw D M Davies for CodeWeavers. * - * 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. + * 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. * - * 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. + * 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: text.c,v 1.81 2004/03/18 22:03:40 royce Exp $ */ +/* $Id: text.c,v 1.82 2004/03/23 00:18:54 gvg Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -63,6 +69,74 @@ static FAST_MUTEX FontListLock; static INT FontsLoaded = 0; /* number of all fonts loaded (including private fonts */ static BOOL RenderingEnabled = TRUE; +static PWCHAR ElfScripts[32] = { /* these are in the order of the fsCsb[0] bits */ + L"Western", /*00*/ + L"Central_European", + L"Cyrillic", + L"Greek", + L"Turkish", + L"Hebrew", + L"Arabic", + L"Baltic", + L"Vietnamese", /*08*/ + NULL, NULL, NULL, NULL, NULL, NULL, NULL, /*15*/ + L"Thai", + L"Japanese", + L"CHINESE_GB2312", + L"Hangul", + L"CHINESE_BIG5", + L"Hangul(Johab)", + NULL, NULL, /*23*/ + NULL, NULL, NULL, NULL, NULL, NULL, NULL, + L"Symbol" /*31*/ +}; + +/* + * For NtGdiTranslateCharsetInfo + */ +#define FS(x) {{0,0,0,0},{0x1<<(x),0}} +#define MAXTCIINDEX 32 +static CHARSETINFO FontTci[MAXTCIINDEX] = { + /* ANSI */ + { ANSI_CHARSET, 1252, FS(0)}, + { EASTEUROPE_CHARSET, 1250, FS(1)}, + { RUSSIAN_CHARSET, 1251, FS(2)}, + { GREEK_CHARSET, 1253, FS(3)}, + { TURKISH_CHARSET, 1254, FS(4)}, + { HEBREW_CHARSET, 1255, FS(5)}, + { ARABIC_CHARSET, 1256, FS(6)}, + { BALTIC_CHARSET, 1257, FS(7)}, + { VIETNAMESE_CHARSET, 1258, FS(8)}, + /* reserved by ANSI */ + { DEFAULT_CHARSET, 0, FS(0)}, + { DEFAULT_CHARSET, 0, FS(0)}, + { DEFAULT_CHARSET, 0, FS(0)}, + { DEFAULT_CHARSET, 0, FS(0)}, + { DEFAULT_CHARSET, 0, FS(0)}, + { DEFAULT_CHARSET, 0, FS(0)}, + { DEFAULT_CHARSET, 0, FS(0)}, + /* ANSI and OEM */ + { THAI_CHARSET, 874, FS(16)}, + { SHIFTJIS_CHARSET, 932, FS(17)}, + { GB2312_CHARSET, 936, FS(18)}, + { HANGEUL_CHARSET, 949, FS(19)}, + { CHINESEBIG5_CHARSET, 950, FS(20)}, + { JOHAB_CHARSET, 1361, FS(21)}, + /* reserved for alternate ANSI and OEM */ + { DEFAULT_CHARSET, 0, FS(0)}, + { DEFAULT_CHARSET, 0, FS(0)}, + { DEFAULT_CHARSET, 0, FS(0)}, + { DEFAULT_CHARSET, 0, FS(0)}, + { DEFAULT_CHARSET, 0, FS(0)}, + { DEFAULT_CHARSET, 0, FS(0)}, + { DEFAULT_CHARSET, 0, FS(0)}, + { DEFAULT_CHARSET, 0, FS(0)}, + /* reserved for system */ + { DEFAULT_CHARSET, 0, FS(0)}, + { SYMBOL_CHARSET, CP_SYMBOL, FS(31)}, +}; + + BOOL FASTCALL IntIsFontRenderingEnabled(VOID) { @@ -546,25 +620,839 @@ NtGdiCreateScalableFontResource(DWORD Hidden, UNIMPLEMENTED; } -int -STDCALL -NtGdiEnumFontFamilies(HDC hDC, - LPCWSTR Family, - FONTENUMPROCW EnumFontFamProc, - LPARAM lParam) +/************************************************************************* + * TranslateCharsetInfo + * + * Fills a CHARSETINFO structure for a character set, code page, or + * font. This allows making the correspondance between different labelings + * (character set, Windows, ANSI, and OEM codepages, and Unicode ranges) + * of the same encoding. + * + * Only one codepage will be set in Cs->fs. If TCI_SRCFONTSIG is used, + * only one codepage should be set in *Src. + * + * RETURNS + * TRUE on success, FALSE on failure. + * + */ +static BOOLEAN STDCALL +IntTranslateCharsetInfo(PDWORD Src, /* [in] + if flags == TCI_SRCFONTSIG: pointer to fsCsb of a FONTSIGNATURE + if flags == TCI_SRCCHARSET: a character set value + if flags == TCI_SRCCODEPAGE: a code page value */ + LPCHARSETINFO Cs, /* [out] structure to receive charset information */ + DWORD Flags /* [in] determines interpretation of lpSrc */) { - UNIMPLEMENTED; + int Index = 0; + + switch (Flags) + { + case TCI_SRCFONTSIG: + while (0 == (*Src >> Index & 0x0001) && Index < MAXTCIINDEX) + { + Index++; + } + break; + case TCI_SRCCODEPAGE: + while ((UINT) (Src) != FontTci[Index].ciACP && Index < MAXTCIINDEX) + { + Index++; + } + break; + case TCI_SRCCHARSET: + while ((UINT) (Src) != FontTci[Index].ciCharset && Index < MAXTCIINDEX) + { + Index++; + } + break; + default: + return FALSE; + } + + if (MAXTCIINDEX <= Index || DEFAULT_CHARSET == FontTci[Index].ciCharset) + { + return FALSE; + } + + memcpy(Cs, &FontTci[Index], sizeof(CHARSETINFO)); + + return TRUE; } -int -STDCALL -NtGdiEnumFontFamiliesEx(HDC hDC, - LPLOGFONTW Logfont, - FONTENUMEXPROCW EnumFontFamExProc, - LPARAM lParam, - DWORD Flags) +BOOL STDCALL +NtGdiTranslateCharsetInfo(PDWORD Src, + LPCHARSETINFO UnsafeCs, + DWORD Flags) { - UNIMPLEMENTED; + CHARSETINFO Cs; + BOOLEAN Ret; + NTSTATUS Status; + + Ret = IntTranslateCharsetInfo(Src, &Cs, Flags); + if (Ret) + { + Status = MmCopyToCaller(UnsafeCs, &Cs, sizeof(CHARSETINFO)); + if (! NT_SUCCESS(Status)) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return FALSE; + } + } + + return (BOOL) Ret; +} + + +/************************************************************* + * IntGetOutlineTextMetrics + * + */ +static unsigned FASTCALL +IntGetOutlineTextMetrics(PFONTGDI FontGDI, UINT Size, + OUTLINETEXTMETRICW *Otm) +{ + unsigned Needed; + TT_OS2 *pOS2; + TT_HoriHeader *pHori; + TT_Postscript *pPost; + FT_Fixed XScale, YScale; + ANSI_STRING FamilyNameA, StyleNameA; + UNICODE_STRING FamilyNameW, StyleNameW, Regular; + char *Cp; + int Ascent, Descent; + TEXTMETRICW *TM; + + Needed = sizeof(OUTLINETEXTMETRICW); + + RtlInitAnsiString(&FamilyNameA, FontGDI->face->family_name); + RtlAnsiStringToUnicodeString(&FamilyNameW, &FamilyNameA, TRUE); + + RtlInitAnsiString(&StyleNameA, FontGDI->face->style_name); + RtlAnsiStringToUnicodeString(&StyleNameW, &StyleNameA, TRUE); + + /* These names should be read from the TT name table */ + + /* length of otmpFamilyName */ + Needed += FamilyNameW.Length + sizeof(WCHAR); + + RtlInitUnicodeString(&Regular, L"regular"); + /* length of otmpFaceName */ + if (0 == RtlCompareUnicodeString(&StyleNameW, &Regular, TRUE)) + { + Needed += FamilyNameW.Length + sizeof(WCHAR); /* just the family name */ + } + else + { + Needed += FamilyNameW.Length + StyleNameW.Length + 2 * sizeof(WCHAR); /* family + " " + style */ + } + + /* length of otmpStyleName */ + Needed += StyleNameW.Length + sizeof(WCHAR); + + /* length of otmpFullName */ + Needed += FamilyNameW.Length + StyleNameW.Length + 2 * sizeof(WCHAR); + + if (Size < Needed) + { + RtlFreeUnicodeString(&FamilyNameW); + RtlFreeUnicodeString(&StyleNameW); + return Needed; + } + + XScale = FontGDI->face->size->metrics.x_scale; + YScale = FontGDI->face->size->metrics.y_scale; + + IntLockFreeType; + pOS2 = FT_Get_Sfnt_Table(FontGDI->face, ft_sfnt_os2); + if (NULL == pOS2) + { + IntUnLockFreeType; + DPRINT1("Can't find OS/2 table - not TT font?\n"); + RtlFreeUnicodeString(&StyleNameW); + RtlFreeUnicodeString(&FamilyNameW); + return 0; + } + + pHori = FT_Get_Sfnt_Table(FontGDI->face, ft_sfnt_hhea); + if (NULL == pHori) + { + IntUnLockFreeType; + DPRINT1("Can't find HHEA table - not TT font?\n"); + RtlFreeUnicodeString(&StyleNameW); + RtlFreeUnicodeString(&FamilyNameW); + return 0; + } + + pPost = FT_Get_Sfnt_Table(FontGDI->face, ft_sfnt_post); /* we can live with this failing */ + IntUnLockFreeType; + + Otm->otmSize = Needed; + + if (0 == pOS2->usWinAscent + pOS2->usWinDescent) + { + Ascent = pHori->Ascender; + Descent = -pHori->Descender; + } + else + { + Ascent = pOS2->usWinAscent; + Descent = pOS2->usWinDescent; + } + + TM = &Otm->otmTextMetrics; + TM->tmAscent = (FT_MulFix(Ascent, YScale) + 32) >> 6; + TM->tmDescent = (FT_MulFix(Descent, YScale) + 32) >> 6; + TM->tmInternalLeading = (FT_MulFix(Ascent + Descent + - FontGDI->face->units_per_EM, YScale) + 32) >> 6; + + TM->tmHeight = TM->tmAscent + TM->tmDescent; + + /* MSDN says: + * el = MAX(0, LineGap - ((WinAscent + WinDescent) - (Ascender - Descender))) + */ + TM->tmExternalLeading = max(0, (FT_MulFix(pHori->Line_Gap + - ((Ascent + Descent) + - (pHori->Ascender - pHori->Descender)), + YScale) + 32) >> 6); + + TM->tmAveCharWidth = (FT_MulFix(pOS2->xAvgCharWidth, XScale) + 32) >> 6; + if (0 == TM->tmAveCharWidth) + { + TM->tmAveCharWidth = 1; + } + TM->tmMaxCharWidth = (FT_MulFix(FontGDI->face->bbox.xMax - FontGDI->face->bbox.xMin, + XScale) + 32) >> 6; + TM->tmWeight = pOS2->usWeightClass; + TM->tmOverhang = 0; + TM->tmDigitizedAspectX = 300; + TM->tmDigitizedAspectY = 300; + TM->tmFirstChar = pOS2->usFirstCharIndex; + TM->tmLastChar = pOS2->usLastCharIndex; + TM->tmDefaultChar = pOS2->usDefaultChar; + TM->tmBreakChar = L'\0' != pOS2->usBreakChar ? pOS2->usBreakChar : ' '; + TM->tmItalic = (FontGDI->face->style_flags & FT_STYLE_FLAG_ITALIC) ? 255 : 0; + TM->tmUnderlined = 0; /* entry in OS2 table */ + TM->tmStruckOut = 0; /* entry in OS2 table */ + + /* Yes TPMF_FIXED_PITCH is correct; braindead api */ + if (! FT_IS_FIXED_WIDTH(FontGDI->face)) + { + TM->tmPitchAndFamily = TMPF_FIXED_PITCH; + } + else + { + TM->tmPitchAndFamily = 0; + } + + switch (pOS2->panose[PAN_FAMILYTYPE_INDEX]) + { + case PAN_FAMILY_SCRIPT: + TM->tmPitchAndFamily |= FF_SCRIPT; + break; + case PAN_FAMILY_DECORATIVE: + case PAN_FAMILY_PICTORIAL: + TM->tmPitchAndFamily |= FF_DECORATIVE; + break; + case PAN_FAMILY_TEXT_DISPLAY: + if (0 == TM->tmPitchAndFamily) /* fixed */ + { + TM->tmPitchAndFamily = FF_MODERN; + } + else + { + switch (pOS2->panose[PAN_SERIFSTYLE_INDEX]) + { + case PAN_SERIF_NORMAL_SANS: + case PAN_SERIF_OBTUSE_SANS: + case PAN_SERIF_PERP_SANS: + TM->tmPitchAndFamily |= FF_SWISS; + break; + default: + TM->tmPitchAndFamily |= FF_ROMAN; + break; + } + } + break; + default: + TM->tmPitchAndFamily |= FF_DONTCARE; + } + + if (FT_IS_SCALABLE(FontGDI->face)) + { + TM->tmPitchAndFamily |= TMPF_VECTOR; + } + if (FT_IS_SFNT(FontGDI->face)) + { + TM->tmPitchAndFamily |= TMPF_TRUETYPE; + } + +#ifndef TODO + TM->tmCharSet = DEFAULT_CHARSET; +#endif + + Otm->otmFiller = 0; + memcpy(&Otm->otmPanoseNumber, pOS2->panose, PANOSE_COUNT); + Otm->otmfsSelection = pOS2->fsSelection; + Otm->otmfsType = pOS2->fsType; + Otm->otmsCharSlopeRise = pHori->caret_Slope_Rise; + Otm->otmsCharSlopeRun = pHori->caret_Slope_Run; + Otm->otmItalicAngle = 0; /* POST table */ + Otm->otmEMSquare = FontGDI->face->units_per_EM; + Otm->otmAscent = (FT_MulFix(pOS2->sTypoAscender, YScale) + 32) >> 6; + Otm->otmDescent = (FT_MulFix(pOS2->sTypoDescender, YScale) + 32) >> 6; + Otm->otmLineGap = (FT_MulFix(pOS2->sTypoLineGap, YScale) + 32) >> 6; + Otm->otmsCapEmHeight = (FT_MulFix(pOS2->sCapHeight, YScale) + 32) >> 6; + Otm->otmsXHeight = (FT_MulFix(pOS2->sxHeight, YScale) + 32) >> 6; + Otm->otmrcFontBox.left = (FT_MulFix(FontGDI->face->bbox.xMin, XScale) + 32) >> 6; + Otm->otmrcFontBox.right = (FT_MulFix(FontGDI->face->bbox.xMax, XScale) + 32) >> 6; + Otm->otmrcFontBox.top = (FT_MulFix(FontGDI->face->bbox.yMax, YScale) + 32) >> 6; + Otm->otmrcFontBox.bottom = (FT_MulFix(FontGDI->face->bbox.yMin, YScale) + 32) >> 6; + Otm->otmMacAscent = 0; /* where do these come from ? */ + Otm->otmMacDescent = 0; + Otm->otmMacLineGap = 0; + Otm->otmusMinimumPPEM = 0; /* TT Header */ + Otm->otmptSubscriptSize.x = (FT_MulFix(pOS2->ySubscriptXSize, XScale) + 32) >> 6; + Otm->otmptSubscriptSize.y = (FT_MulFix(pOS2->ySubscriptYSize, YScale) + 32) >> 6; + Otm->otmptSubscriptOffset.x = (FT_MulFix(pOS2->ySubscriptXOffset, XScale) + 32) >> 6; + Otm->otmptSubscriptOffset.y = (FT_MulFix(pOS2->ySubscriptYOffset, YScale) + 32) >> 6; + Otm->otmptSuperscriptSize.x = (FT_MulFix(pOS2->ySuperscriptXSize, XScale) + 32) >> 6; + Otm->otmptSuperscriptSize.y = (FT_MulFix(pOS2->ySuperscriptYSize, YScale) + 32) >> 6; + Otm->otmptSuperscriptOffset.x = (FT_MulFix(pOS2->ySuperscriptXOffset, XScale) + 32) >> 6; + Otm->otmptSuperscriptOffset.y = (FT_MulFix(pOS2->ySuperscriptYOffset, YScale) + 32) >> 6; + Otm->otmsStrikeoutSize = (FT_MulFix(pOS2->yStrikeoutSize, YScale) + 32) >> 6; + Otm->otmsStrikeoutPosition = (FT_MulFix(pOS2->yStrikeoutPosition, YScale) + 32) >> 6; + if (NULL == pPost) + { + Otm->otmsUnderscoreSize = 0; + Otm->otmsUnderscorePosition = 0; + } + else + { + Otm->otmsUnderscoreSize = (FT_MulFix(pPost->underlineThickness, YScale) + 32) >> 6; + Otm->otmsUnderscorePosition = (FT_MulFix(pPost->underlinePosition, YScale) + 32) >> 6; + } + + /* otmp* members should clearly have type ptrdiff_t, but M$ knows best */ + Cp = (char*) Otm + sizeof(OUTLINETEXTMETRICW); + Otm->otmpFamilyName = (LPSTR)(Cp - (char*) Otm); + wcscpy((WCHAR*) Cp, FamilyNameW.Buffer); + Cp += FamilyNameW.Length + sizeof(WCHAR); + Otm->otmpStyleName = (LPSTR)(Cp - (char*) Otm); + wcscpy((WCHAR*) Cp, StyleNameW.Buffer); + Cp += StyleNameW.Length + sizeof(WCHAR); + Otm->otmpFaceName = (LPSTR)(Cp - (char*) Otm); + wcscpy((WCHAR*) Cp, FamilyNameW.Buffer); + if (0 != RtlCompareUnicodeString(&StyleNameW, &Regular, TRUE)) + { + wcscat((WCHAR*) Cp, L" "); + wcscat((WCHAR*) Cp, StyleNameW.Buffer); + Cp += FamilyNameW.Length + StyleNameW.Length + 2 * sizeof(WCHAR); + } + else + { + Cp += FamilyNameW.Length + sizeof(WCHAR); + } + Otm->otmpFullName = (LPSTR)(Cp - (char*) Otm); + wcscpy((WCHAR*) Cp, FamilyNameW.Buffer); + wcscat((WCHAR*) Cp, L" "); + wcscat((WCHAR*) Cp, StyleNameW.Buffer); + + RtlFreeUnicodeString(&StyleNameW); + RtlFreeUnicodeString(&FamilyNameW); + + return Needed; +} + +static PFONTGDI FASTCALL +FindFaceNameInList(PUNICODE_STRING FaceName, PLIST_ENTRY Head) +{ + PLIST_ENTRY Entry; + PFONT_ENTRY CurrentEntry; + ANSI_STRING EntryFaceNameA; + UNICODE_STRING EntryFaceNameW; + PFONTGDI FontGDI; + + Entry = Head->Flink; + while (Entry != Head) + { + CurrentEntry = (PFONT_ENTRY) CONTAINING_RECORD(Entry, FONT_ENTRY, ListEntry); + + if (NULL == (FontGDI = AccessInternalObject((ULONG) CurrentEntry->hFont))) + { + Entry = Entry->Flink; + continue; + } + RtlInitAnsiString(&EntryFaceNameA, FontGDI->face->family_name); + RtlAnsiStringToUnicodeString(&EntryFaceNameW, &EntryFaceNameA, TRUE); + if ((LF_FACESIZE - 1) * sizeof(WCHAR) < EntryFaceNameW.Length) + { + EntryFaceNameW.Length = (LF_FACESIZE - 1) * sizeof(WCHAR); + EntryFaceNameW.Buffer[LF_FACESIZE - 1] = L'\0'; + } + + if (0 == RtlCompareUnicodeString(FaceName, &EntryFaceNameW, TRUE)) + { + RtlFreeUnicodeString(&EntryFaceNameW); + return FontGDI; + } + + RtlFreeUnicodeString(&EntryFaceNameW); + Entry = Entry->Flink; + } + + return NULL; +} + +static PFONTGDI FASTCALL +FindFaceNameInLists(PUNICODE_STRING FaceName) +{ + PW32PROCESS Win32Process; + PFONTGDI Font; + + /* Search the process local list */ + Win32Process = PsGetWin32Process(); + IntLockProcessPrivateFonts(Win32Process); + Font = FindFaceNameInList(FaceName, &Win32Process->PrivateFontListHead); + IntUnLockProcessPrivateFonts(Win32Process); + if (NULL != Font) + { + return Font; + } + + /* Search the global list */ + IntLockGlobalFonts; + Font = FindFaceNameInList(FaceName, &FontListHead); + IntUnLockGlobalFonts; + + return Font; +} + +static void FASTCALL +FontFamilyFillInfo(PFONTFAMILYINFO Info, PCWSTR FaceName, PFONTGDI FontGDI) +{ + ANSI_STRING StyleA; + UNICODE_STRING StyleW; + TT_OS2 *pOS2; + FONTSIGNATURE fs; + DWORD fs_fsCsb0; + CHARSETINFO CharSetInfo; + unsigned i, Size; + OUTLINETEXTMETRICW *Otm; + LOGFONTW *Lf; + TEXTMETRICW *TM; + NEWTEXTMETRICW *Ntm; + + ZeroMemory(Info, sizeof(FONTFAMILYINFO)); + Size = IntGetOutlineTextMetrics(FontGDI, 0, NULL); + Otm = ExAllocatePoolWithTag(PagedPool, Size, TAG_GDITEXT); + if (NULL == Otm) + { + return; + } + IntGetOutlineTextMetrics(FontGDI, Size, Otm); + + Lf = &Info->EnumLogFontEx.elfLogFont; + TM = &Otm->otmTextMetrics; + + Lf->lfHeight = TM->tmHeight; + Lf->lfWidth = TM->tmAveCharWidth; + Lf->lfWeight = TM->tmWeight; + Lf->lfPitchAndFamily = (TM->tmPitchAndFamily & 0xf1) + 1; + Lf->lfCharSet = TM->tmCharSet; + Lf->lfOutPrecision = OUT_STROKE_PRECIS; + Lf->lfClipPrecision = CLIP_STROKE_PRECIS; + Lf->lfQuality = DRAFT_QUALITY; + + Ntm = &Info->NewTextMetricEx.ntmTm; + Ntm->tmHeight = TM->tmHeight; + Ntm->tmAscent = TM->tmAscent; + Ntm->tmDescent = TM->tmDescent; + Ntm->tmInternalLeading = TM->tmInternalLeading; + Ntm->tmExternalLeading = TM->tmExternalLeading; + Ntm->tmAveCharWidth = TM->tmAveCharWidth; + Ntm->tmMaxCharWidth = TM->tmMaxCharWidth; + Ntm->tmWeight = TM->tmWeight; + Ntm->tmOverhang = TM->tmOverhang; + Ntm->tmDigitizedAspectX = TM->tmDigitizedAspectX; + Ntm->tmDigitizedAspectY = TM->tmDigitizedAspectY; + Ntm->tmFirstChar = TM->tmFirstChar; + Ntm->tmLastChar = TM->tmLastChar; + Ntm->tmDefaultChar = TM->tmDefaultChar; + Ntm->tmBreakChar = TM->tmBreakChar; + Ntm->tmItalic = TM->tmItalic; + Ntm->tmUnderlined = TM->tmUnderlined; + Ntm->tmStruckOut = TM->tmStruckOut; + Ntm->tmPitchAndFamily = TM->tmPitchAndFamily; + Ntm->tmCharSet = TM->tmCharSet; + Ntm->ntmFlags = TM->tmItalic ? NTM_ITALIC : 0; + if (550 < TM->tmWeight) + { + Ntm->ntmFlags |= NTM_BOLD; + } + if (0 == Ntm->ntmFlags) + { + Ntm->ntmFlags = NTM_REGULAR; + } + + Ntm->ntmSizeEM = Otm->otmEMSquare; + Ntm->ntmCellHeight = 0; + Ntm->ntmAvgWidth = 0; + + Info->FontType = (0 != (TM->tmPitchAndFamily & TMPF_TRUETYPE) + ? TRUETYPE_FONTTYPE : 0); + if (0 == (TM->tmPitchAndFamily & TMPF_VECTOR)) + { + Info->FontType |= RASTER_FONTTYPE; + } + + ExFreePool(Otm); + + wcsncpy(Info->EnumLogFontEx.elfLogFont.lfFaceName, FaceName, LF_FACESIZE); + wcsncpy(Info->EnumLogFontEx.elfFullName, FaceName, LF_FULLFACESIZE); + RtlInitAnsiString(&StyleA, FontGDI->face->style_name); + RtlAnsiStringToUnicodeString(&StyleW, &StyleA, TRUE); + wcsncpy(Info->EnumLogFontEx.elfStyle, StyleW.Buffer, LF_FACESIZE); + RtlFreeUnicodeString(&StyleW); + + Info->EnumLogFontEx.elfLogFont.lfCharSet = DEFAULT_CHARSET; + Info->EnumLogFontEx.elfScript[0] = L'\0'; + IntLockFreeType; + pOS2 = FT_Get_Sfnt_Table(FontGDI->face, ft_sfnt_os2); + IntUnLockFreeType; + if (NULL != pOS2) + { + Info->NewTextMetricEx.ntmFontSig.fsCsb[0] = pOS2->ulCodePageRange1; + Info->NewTextMetricEx.ntmFontSig.fsCsb[1] = pOS2->ulCodePageRange2; + Info->NewTextMetricEx.ntmFontSig.fsUsb[0] = pOS2->ulUnicodeRange1; + Info->NewTextMetricEx.ntmFontSig.fsUsb[1] = pOS2->ulUnicodeRange2; + Info->NewTextMetricEx.ntmFontSig.fsUsb[2] = pOS2->ulUnicodeRange3; + Info->NewTextMetricEx.ntmFontSig.fsUsb[3] = pOS2->ulUnicodeRange4; + + fs_fsCsb0 = pOS2->ulCodePageRange1; + if (0 == pOS2->version) + { + FT_UInt Dummy; + + if (FT_Get_First_Char(FontGDI->face, &Dummy) < 0x100) + { + fs_fsCsb0 |= 1; + } + else + { + fs_fsCsb0 |= 1L << 31; + } + } + if (0 == fs_fsCsb0) + { /* let's see if we can find any interesting cmaps */ + for (i = 0; i < FontGDI->face->num_charmaps; i++) + { + switch (FontGDI->face->charmaps[i]->encoding) + { + case ft_encoding_unicode: + case ft_encoding_apple_roman: + fs_fsCsb0 |= 1; + break; + case ft_encoding_symbol: + fs_fsCsb0 |= 1L << 31; + break; + default: + break; + } + } + } + + for(i = 0; i < 32; i++) + { + if (0 != (fs_fsCsb0 & (1L << i))) + { + fs.fsCsb[0] = 1L << i; + fs.fsCsb[1] = 0; + if (! IntTranslateCharsetInfo(fs.fsCsb, &CharSetInfo, TCI_SRCFONTSIG)) + { + CharSetInfo.ciCharset = DEFAULT_CHARSET; + } + if (31 == i) + { + CharSetInfo.ciCharset = SYMBOL_CHARSET; + } + if (DEFAULT_CHARSET != CharSetInfo.ciCharset) + { + Info->EnumLogFontEx.elfLogFont.lfCharSet = CharSetInfo.ciCharset; + if (NULL != ElfScripts[i]) + { + wcscpy(Info->EnumLogFontEx.elfScript, ElfScripts[i]); + } + else + { + DPRINT1("Unknown elfscript for bit %d\n", i); + } + } + } + } + } +} + +static int FASTCALL +FindFaceNameInInfo(PUNICODE_STRING FaceName, PFONTFAMILYINFO Info, DWORD InfoEntries) +{ + DWORD i; + UNICODE_STRING InfoFaceName; + + for (i = 0; i < InfoEntries; i++) + { + RtlInitUnicodeString(&InfoFaceName, Info[i].EnumLogFontEx.elfLogFont.lfFaceName); + if (0 == RtlCompareUnicodeString(&InfoFaceName, FaceName, TRUE)) + { + return i; + } + } + + return -1; +} + +static BOOLEAN FASTCALL +FontFamilyInclude(LPLOGFONTW LogFont, PUNICODE_STRING FaceName, + PFONTFAMILYINFO Info, DWORD InfoEntries) +{ + UNICODE_STRING LogFontFaceName; + + RtlInitUnicodeString(&LogFontFaceName, LogFont->lfFaceName); + if (0 != LogFontFaceName.Length + && 0 != RtlCompareUnicodeString(&LogFontFaceName, FaceName, TRUE)) + { + return FALSE; + } + + return FindFaceNameInInfo(FaceName, Info, InfoEntries) < 0; +} + +static BOOLEAN FASTCALL +GetFontFamilyInfoForList(LPLOGFONTW LogFont, + PFONTFAMILYINFO Info, + DWORD *Count, + DWORD Size, + PLIST_ENTRY Head) +{ + PLIST_ENTRY Entry; + PFONT_ENTRY CurrentEntry; + ANSI_STRING EntryFaceNameA; + UNICODE_STRING EntryFaceNameW; + PFONTGDI FontGDI; + + Entry = Head->Flink; + while (Entry != Head) + { + CurrentEntry = (PFONT_ENTRY) CONTAINING_RECORD(Entry, FONT_ENTRY, ListEntry); + + if (NULL == (FontGDI = AccessInternalObject((ULONG) CurrentEntry->hFont))) + { + Entry = Entry->Flink; + continue; + } + RtlInitAnsiString(&EntryFaceNameA, FontGDI->face->family_name); + RtlAnsiStringToUnicodeString(&EntryFaceNameW, &EntryFaceNameA, TRUE); + if ((LF_FACESIZE - 1) * sizeof(WCHAR) < EntryFaceNameW.Length) + { + EntryFaceNameW.Length = (LF_FACESIZE - 1) * sizeof(WCHAR); + EntryFaceNameW.Buffer[LF_FACESIZE - 1] = L'\0'; + } + + if (FontFamilyInclude(LogFont, &EntryFaceNameW, Info, min(*Count, Size))) + { + if (*Count < Size) + { + FontFamilyFillInfo(Info + *Count, EntryFaceNameW.Buffer, FontGDI); + } + (*Count)++; + } + RtlFreeUnicodeString(&EntryFaceNameW); + Entry = Entry->Flink; + } + + return TRUE; +} + +typedef struct FontFamilyInfoCallbackContext +{ + LPLOGFONTW LogFont; + PFONTFAMILYINFO Info; + DWORD Count; + DWORD Size; +} FONT_FAMILY_INFO_CALLBACK_CONTEXT, *PFONT_FAMILY_INFO_CALLBACK_CONTEXT; + +static NTSTATUS STDCALL +FontFamilyInfoQueryRegistryCallback(IN PWSTR ValueName, IN ULONG ValueType, + IN PVOID ValueData, IN ULONG ValueLength, + IN PVOID Context, IN PVOID EntryContext) +{ + PFONT_FAMILY_INFO_CALLBACK_CONTEXT InfoContext; + UNICODE_STRING RegistryName, RegistryValue; + int Existing; + PFONTGDI FontGDI; + + if (REG_SZ != ValueType) + { + return STATUS_SUCCESS; + } + InfoContext = (PFONT_FAMILY_INFO_CALLBACK_CONTEXT) Context; + RtlInitUnicodeString(&RegistryName, ValueName); + + /* Do we need to include this font family? */ + if (FontFamilyInclude(InfoContext->LogFont, &RegistryName, InfoContext->Info, + min(InfoContext->Count, InfoContext->Size))) + { + RtlInitUnicodeString(&RegistryValue, (PCWSTR) ValueData); + Existing = FindFaceNameInInfo(&RegistryValue, InfoContext->Info, + min(InfoContext->Count, InfoContext->Size)); + if (0 <= Existing) + { + /* We already have the information about the "real" font. Just copy it */ + if (InfoContext->Count < InfoContext->Size) + { + InfoContext->Info[InfoContext->Count] = InfoContext->Info[Existing]; + wcsncpy(InfoContext->Info[InfoContext->Count].EnumLogFontEx.elfLogFont.lfFaceName, + RegistryName.Buffer, LF_FACESIZE); + } + InfoContext->Count++; + return STATUS_SUCCESS; + } + + /* Try to find information about the "real" font */ + FontGDI = FindFaceNameInLists(&RegistryValue); + if (NULL == FontGDI) + { + /* "Real" font not found, discard this registry entry */ + return STATUS_SUCCESS; + } + + /* Return info about the "real" font but with the name of the alias */ + if (InfoContext->Count < InfoContext->Size) + { + FontFamilyFillInfo(InfoContext->Info + InfoContext->Count, + RegistryName.Buffer, FontGDI); + } + InfoContext->Count++; + return STATUS_SUCCESS; + } + + return STATUS_SUCCESS; +} + +static BOOLEAN FASTCALL +GetFontFamilyInfoForSubstitutes(LPLOGFONTW LogFont, + PFONTFAMILYINFO Info, + DWORD *Count, + DWORD Size) +{ + RTL_QUERY_REGISTRY_TABLE QueryTable[2]; + FONT_FAMILY_INFO_CALLBACK_CONTEXT Context; + NTSTATUS Status; + + /* Enumerate font families found in HKLM\Software\Microsoft\Windows NT\CurrentVersion\SysFontSubstitutes + The real work is done in the registry callback function */ + Context.LogFont = LogFont; + Context.Info = Info; + Context.Count = *Count; + Context.Size = Size; + + QueryTable[0].QueryRoutine = FontFamilyInfoQueryRegistryCallback; + QueryTable[0].Flags = 0; + QueryTable[0].Name = NULL; + QueryTable[0].EntryContext = NULL; + QueryTable[0].DefaultType = REG_NONE; + QueryTable[0].DefaultData = NULL; + QueryTable[0].DefaultLength = 0; + + QueryTable[1].QueryRoutine = NULL; + QueryTable[1].Name = NULL; + + Status = RtlQueryRegistryValues(RTL_REGISTRY_WINDOWS_NT, + L"SysFontSubstitutes", + QueryTable, + &Context, + NULL); + if (NT_SUCCESS(Status)) + { + *Count = Context.Count; + } + + return NT_SUCCESS(Status) || STATUS_OBJECT_NAME_NOT_FOUND == Status; +} + +int STDCALL +NtGdiGetFontFamilyInfo(HDC Dc, + LPLOGFONTW UnsafeLogFont, + PFONTFAMILYINFO UnsafeInfo, + DWORD Size) +{ + NTSTATUS Status; + LOGFONTW LogFont; + PFONTFAMILYINFO Info; + DWORD Count; + PW32PROCESS Win32Process; + + /* Make a safe copy */ + Status = MmCopyFromCaller(&LogFont, UnsafeLogFont, sizeof(LOGFONTW)); + if (! NT_SUCCESS(Status)) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return -1; + } + + /* Allocate space for a safe copy */ + Info = ExAllocatePoolWithTag(PagedPool, Size * sizeof(FONTFAMILYINFO), TAG_GDITEXT); + if (NULL == Info) + { + SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); + return -1; + } + + /* Enumerate font families in the global list */ + IntLockGlobalFonts; + Count = 0; + if (! GetFontFamilyInfoForList(&LogFont, Info, &Count, Size, &FontListHead) ) + { + IntUnLockGlobalFonts; + ExFreePool(Info); + return -1; + } + IntUnLockGlobalFonts; + + /* Enumerate font families in the process local list */ + Win32Process = PsGetWin32Process(); + IntLockProcessPrivateFonts(Win32Process); + if (! GetFontFamilyInfoForList(&LogFont, Info, &Count, Size, + &Win32Process->PrivateFontListHead)) + { + IntUnLockProcessPrivateFonts(Win32Process); + ExFreePool(Info); + return -1; + } + IntUnLockProcessPrivateFonts(Win32Process); + + /* Enumerate font families in the registry */ + if (! GetFontFamilyInfoForSubstitutes(&LogFont, Info, &Count, Size)) + { + ExFreePool(Info); + return -1; + } + + /* Return data to caller */ + if (0 != Count) + { + Status = MmCopyToCaller(UnsafeInfo, Info, + (Count < Size ? Count : Size) * sizeof(FONTFAMILYINFO)); + if (! NT_SUCCESS(Status)) + { + ExFreePool(Info); + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return -1; + } + } + + ExFreePool(Info); + + return Count; } int @@ -1689,15 +2577,6 @@ NtGdiTextOut( return NtGdiExtTextOut(hDC, XStart, YStart, 0, NULL, String, Count, NULL); } -UINT -STDCALL -NtGdiTranslateCharsetInfo(PDWORD Src, - LPCHARSETINFO CSI, - DWORD Flags) -{ - UNIMPLEMENTED; -} - NTSTATUS FASTCALL TextIntRealizeFont(HFONT FontHandle) { From 75543614da115b5d5cf07ddd5b7d2a9ad22918e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Tue, 23 Mar 2004 07:59:47 +0000 Subject: [PATCH 0613/1463] - Implement GetCharWidthA/W() - Fix memory overwrite in NtGdiGetCharWidth32() Fixes bug #258 svn path=/trunk/; revision=8845 --- reactos/iface/addsys/w32ksvc.db | 1 - reactos/include/win32k/text.h | 7 --- reactos/lib/gdi32/misc/stubsa.c | 36 +-------------- reactos/lib/gdi32/misc/stubsw.c | 34 +------------- reactos/lib/gdi32/objects/font.c | 69 +++++++++++++++++++++++++++- reactos/subsys/win32k/objects/text.c | 17 ++----- 6 files changed, 73 insertions(+), 91 deletions(-) diff --git a/reactos/iface/addsys/w32ksvc.db b/reactos/iface/addsys/w32ksvc.db index 11c8d75ede3..3a28544c83a 100644 --- a/reactos/iface/addsys/w32ksvc.db +++ b/reactos/iface/addsys/w32ksvc.db @@ -104,7 +104,6 @@ NtGdiGetBrushOrgEx 2 NtGdiGetCharABCWidths 4 NtGdiGetCharABCWidthsFloat 4 NtGdiGetCharacterPlacement 6 -NtGdiGetCharWidth 4 NtGdiGetCharWidth32 4 NtGdiGetCharWidthFloat 4 NtGdiGetClipBox 2 diff --git a/reactos/include/win32k/text.h b/reactos/include/win32k/text.h index 8129784095b..c75715483b3 100644 --- a/reactos/include/win32k/text.h +++ b/reactos/include/win32k/text.h @@ -99,13 +99,6 @@ NtGdiGetCharacterPlacement(HDC hDC, LPGCP_RESULTSW Results, DWORD Flags); -BOOL -STDCALL -NtGdiGetCharWidth(HDC hDC, - UINT FirstChar, - UINT LastChar, - LPINT Buffer); - BOOL STDCALL NtGdiGetCharWidth32(HDC hDC, diff --git a/reactos/lib/gdi32/misc/stubsa.c b/reactos/lib/gdi32/misc/stubsa.c index 531307de99f..baa66c4a87d 100644 --- a/reactos/lib/gdi32/misc/stubsa.c +++ b/reactos/lib/gdi32/misc/stubsa.c @@ -1,4 +1,4 @@ -/* $Id: stubsa.c,v 1.28 2004/03/23 00:18:54 gvg Exp $ +/* $Id: stubsa.c,v 1.29 2004/03/23 07:59:47 gvg Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -208,40 +208,6 @@ EnumFontsA ( } -/* - * @unimplemented - */ -BOOL -STDCALL -GetCharWidthA ( - HDC hdc, - UINT iFirstChar, - UINT iLastChar, - LPINT lpBuffer - ) -{ - /* FIXME what to do with iFirstChar and iLastChar ??? */ - return NtGdiGetCharWidth ( hdc, iFirstChar, iLastChar, lpBuffer ); -} - - -/* - * @unimplemented - */ -BOOL -STDCALL -GetCharWidth32A( - HDC hdc, - UINT iFirstChar, - UINT iLastChar, - LPINT lpBuffer - ) -{ - /* FIXME what to do with iFirstChar and iLastChar ??? */ - return NtGdiGetCharWidth32 ( hdc, iFirstChar, iLastChar, lpBuffer ); -} - - /* * @unimplemented */ diff --git a/reactos/lib/gdi32/misc/stubsw.c b/reactos/lib/gdi32/misc/stubsw.c index be9db44c9ae..12e1b752ed0 100644 --- a/reactos/lib/gdi32/misc/stubsw.c +++ b/reactos/lib/gdi32/misc/stubsw.c @@ -1,4 +1,4 @@ -/* $Id: stubsw.c,v 1.25 2004/03/23 00:18:54 gvg Exp $ +/* $Id: stubsw.c,v 1.26 2004/03/23 07:59:47 gvg Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -133,38 +133,6 @@ EnumFontsW( } -/* - * @implemented - */ -BOOL -STDCALL -GetCharWidthW ( - HDC hdc, - UINT iFirstChar, - UINT iLastChar, - LPINT lpBuffer - ) -{ - return NtGdiGetCharWidth ( hdc, iFirstChar, iLastChar, lpBuffer ); -} - - -/* - * @implemented - */ -BOOL -STDCALL -GetCharWidth32W( - HDC hdc, - UINT iFirstChar, - UINT iLastChar, - LPINT lpBuffer - ) -{ - return NtGdiGetCharWidth32 ( hdc, iFirstChar, iLastChar, lpBuffer ); -} - - /* * @implemented */ diff --git a/reactos/lib/gdi32/objects/font.c b/reactos/lib/gdi32/objects/font.c index f7f301d6ac2..bfcbe7f9a33 100644 --- a/reactos/lib/gdi32/objects/font.c +++ b/reactos/lib/gdi32/objects/font.c @@ -1,4 +1,4 @@ -/* $Id: font.c,v 1.1 2004/03/23 00:18:54 gvg Exp $ +/* $Id: font.c,v 1.2 2004/03/23 07:59:47 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -15,6 +15,7 @@ #include <windows.h> #include <rosrtl/logfont.h> #include <win32k/font.h> +#include <win32k/text.h> #include <internal/font.h> #define NDEBUG @@ -330,3 +331,69 @@ EnumFontFamiliesA(HDC Dc, LPCSTR Family, FONTENUMPROCA EnumFontFamProc, return IntEnumFontFamilies(Dc, &LogFont, EnumFontFamProc, lParam, FALSE); } + + +/* + * @implemented + */ +BOOL +STDCALL +GetCharWidthA ( + HDC hdc, + UINT iFirstChar, + UINT iLastChar, + LPINT lpBuffer + ) +{ + /* FIXME what to do with iFirstChar and iLastChar ??? */ + return NtGdiGetCharWidth32 ( hdc, iFirstChar, iLastChar, lpBuffer ); +} + + +/* + * @implemented + */ +BOOL +STDCALL +GetCharWidth32A( + HDC hdc, + UINT iFirstChar, + UINT iLastChar, + LPINT lpBuffer + ) +{ + /* FIXME what to do with iFirstChar and iLastChar ??? */ + return NtGdiGetCharWidth32 ( hdc, iFirstChar, iLastChar, lpBuffer ); +} + + +/* + * @implemented + */ +BOOL +STDCALL +GetCharWidthW ( + HDC hdc, + UINT iFirstChar, + UINT iLastChar, + LPINT lpBuffer + ) +{ + return NtGdiGetCharWidth32 ( hdc, iFirstChar, iLastChar, lpBuffer ); +} + + +/* + * @implemented + */ +BOOL +STDCALL +GetCharWidth32W( + HDC hdc, + UINT iFirstChar, + UINT iLastChar, + LPINT lpBuffer + ) +{ + return NtGdiGetCharWidth32 ( hdc, iFirstChar, iLastChar, lpBuffer ); +} diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index b890f7528a7..505ab2525e2 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.82 2004/03/23 00:18:54 gvg Exp $ */ +/* $Id: text.c,v 1.83 2004/03/23 07:59:47 gvg Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -1892,17 +1892,6 @@ NtGdiGetCharacterPlacement(HDC hDC, UNIMPLEMENTED; } -BOOL -STDCALL -NtGdiGetCharWidth(HDC hDC, - UINT FirstChar, - UINT LastChar, - LPINT Buffer) -{ - DPRINT1("NtGdiGetCharWidth isnt really unimplemented - keep going anyway\n"); - return 1; -} - BOOL STDCALL NtGdiGetCharWidth32(HDC hDC, @@ -1924,7 +1913,7 @@ NtGdiGetCharWidth32(HDC hDC, return FALSE; } - BufferSize = (LastChar - FirstChar) * sizeof(INT); + BufferSize = (LastChar - FirstChar + 1) * sizeof(INT); SafeBuffer = ExAllocatePoolWithTag(PagedPool, BufferSize, TAG_GDITEXT); if (SafeBuffer == NULL) { @@ -1982,7 +1971,7 @@ NtGdiGetCharWidth32(HDC hDC, { glyph_index = FT_Get_Char_Index(face, i); FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT); - SafeBuffer[i] = face->glyph->advance.x >> 6; + SafeBuffer[i - FirstChar] = face->glyph->advance.x >> 6; } IntUnLockFreeType; TEXTOBJ_UnlockText(dc->w.hFont); From c4e75c424ff8da5d554b1c0adfad4caf6c13a72f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Tue, 23 Mar 2004 11:20:58 +0000 Subject: [PATCH 0614/1463] Implement GetUpdateRect() and harden NtUserGetUpdateRect() svn path=/trunk/; revision=8846 --- reactos/lib/user32/windows/paint.c | 15 ++++---- reactos/subsys/win32k/ntuser/painting.c | 47 +++++++++++++++++++------ 2 files changed, 43 insertions(+), 19 deletions(-) diff --git a/reactos/lib/user32/windows/paint.c b/reactos/lib/user32/windows/paint.c index ada6e1be3f0..31f793a4d8b 100644 --- a/reactos/lib/user32/windows/paint.c +++ b/reactos/lib/user32/windows/paint.c @@ -16,10 +16,10 @@ * 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.22 2004/01/26 08:44:51 weiden Exp $ +/* $Id: paint.c,v 1.23 2004/03/23 11:20:58 gvg Exp $ * * PROJECT: ReactOS user32.dll - * FILE: lib/user32/windows/input.c + * FILE: lib/user32/windows/paint.c * PURPOSE: Input * PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net) * UPDATE HISTORY: @@ -120,17 +120,16 @@ ExcludeUpdateRgn( /* - * @unimplemented + * @implemented */ BOOL STDCALL GetUpdateRect( - HWND hWnd, - LPRECT lpRect, - BOOL bErase) + HWND Wnd, + LPRECT Rect, + BOOL Erase) { - UNIMPLEMENTED; - return FALSE; + return NtUserGetUpdateRect(Wnd, Rect, Erase); } diff --git a/reactos/subsys/win32k/ntuser/painting.c b/reactos/subsys/win32k/ntuser/painting.c index 910fb6940e8..091ecd3d4e2 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.77 2004/03/22 20:14:29 weiden Exp $ + * $Id: painting.c,v 1.78 2004/03/23 11:20:58 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -892,21 +892,46 @@ NtUserGetUpdateRgn(HWND hWnd, HRGN hRgn, BOOL bErase) */ BOOL STDCALL -NtUserGetUpdateRect(HWND hWnd, LPRECT lpRect, BOOL fErase) +NtUserGetUpdateRect(HWND Wnd, LPRECT UnsafeRect, BOOL Erase) { - HRGN hRgn = NtGdiCreateRectRgn(0, 0, 0, 0); + RECT Rect; + HRGN Rgn; + PROSRGNDATA RgnData; + NTSTATUS Status; - if (!lpRect) - { + Rgn = NtGdiCreateRectRgn(0, 0, 0, 0); + if (NULL == Rgn) + { + NtGdiDeleteObject(Rgn); + SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); + return FALSE; + } + NtUserGetUpdateRgn(Wnd, Rgn, Erase); + RgnData = RGNDATA_LockRgn(Rgn); + if (NULL == RgnData) + { + NtGdiDeleteObject(Rgn); + SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); + return FALSE; + } + if (ERROR == UnsafeIntGetRgnBox(RgnData, &Rect)) + { + RGNDATA_UnlockRgn(Rgn); + NtGdiDeleteObject(Rgn); + SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); + return FALSE; + } + RGNDATA_UnlockRgn(Rgn); + NtGdiDeleteObject(Rgn); + + Status = MmCopyToCaller(UnsafeRect, &Rect, sizeof(RECT)); + if (! NT_SUCCESS(Status)) + { SetLastWin32Error(ERROR_INVALID_PARAMETER); return FALSE; - } + } - NtUserGetUpdateRgn(hWnd, hRgn, fErase); - NtGdiGetRgnBox(hRgn, lpRect); - NtGdiDeleteObject(hRgn); - - return lpRect->left < lpRect->right && lpRect->top < lpRect->bottom; + return Rect.left < Rect.right && Rect.top < Rect.bottom; } /* From 93f83462c0634c235686b47678a4698a5baffaca Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Tue, 23 Mar 2004 12:30:15 +0000 Subject: [PATCH 0615/1463] Changes to make AHA-2940 detect devices: - Set proper inquiry buffer size. - Check inquiry buffer for valid LUN. svn path=/trunk/; revision=8847 --- reactos/drivers/storage/scsiport/scsiport.c | 32 ++++++++++++--------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/reactos/drivers/storage/scsiport/scsiport.c b/reactos/drivers/storage/scsiport/scsiport.c index 0fe70eca30a..2c283af483f 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.49 2004/03/23 00:12:24 gvg Exp $ +/* $Id: scsiport.c,v 1.50 2004/03/23 12:30:15 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -450,23 +450,23 @@ ScsiPortGetPhysicalAddress(IN PVOID HwDeviceExtension, { EndAddress = Srb->DataBuffer + Srb->DataTransferLength; if (VirtualAddress == NULL) - { + { VirtualAddress = Srb->DataBuffer; } else if (VirtualAddress < Srb->DataBuffer || VirtualAddress >= EndAddress) - { + { PhysicalAddress.QuadPart = 0LL; return PhysicalAddress; } - + PhysicalAddress = MmGetPhysicalAddress(VirtualAddress); if (PhysicalAddress.QuadPart == 0LL) - { + { return PhysicalAddress; } - + Offset = (ULONG_PTR)VirtualAddress & (PAGE_SIZE - 1); -#if 1 +#if 1 /* * FIXME: * MmGetPhysicalAddress doesn't return the offset within the page. @@ -476,7 +476,7 @@ ScsiPortGetPhysicalAddress(IN PVOID HwDeviceExtension, #endif BufferLength += PAGE_SIZE - Offset; while (VirtualAddress + BufferLength < EndAddress) - { + { NextPhysicalAddress = MmGetPhysicalAddress(VirtualAddress + BufferLength); if (PhysicalAddress.QuadPart + (ULONGLONG)BufferLength != NextPhysicalAddress.QuadPart) { @@ -485,7 +485,7 @@ ScsiPortGetPhysicalAddress(IN PVOID HwDeviceExtension, BufferLength += PAGE_SIZE; } if (VirtualAddress + BufferLength >= EndAddress) - { + { BufferLength = EndAddress - VirtualAddress; } } @@ -523,7 +523,7 @@ ScsiPortGetUncachedExtension(IN PVOID HwDeviceExtension, PSCSI_PORT_DEVICE_EXTENSION DeviceExtension; DEVICE_DESCRIPTION DeviceDescription; - DPRINT1("ScsiPortGetUncachedExtension(%p %p %lu)\n", + DPRINT("ScsiPortGetUncachedExtension(%p %p %lu)\n", HwDeviceExtension, ConfigInfo, NumberOfBytes); DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, @@ -1111,6 +1111,8 @@ ScsiPortNotification(IN SCSI_NOTIFICATION_TYPE NotificationType, // DeviceExtension->IrpFlags |= IRP_FLAG_NEXT_LU; + /* Hack! */ + DeviceExtension->IrpFlags |= IRP_FLAG_NEXT; } break; @@ -1902,12 +1904,13 @@ SpiScanAdapter (IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension) Srb.SrbFlags = SRB_FLAGS_DATA_IN; Srb.DataBuffer = ExAllocatePool(NonPagedPool, 256); Srb.Function = SRB_FUNCTION_EXECUTE_SCSI; - Srb.DataTransferLength = 256; + Srb.DataTransferLength = 255; //256; Srb.CdbLength = 6; Cdb = (PCDB) &Srb.Cdb; Cdb->CDB6INQUIRY.OperationCode = SCSIOP_INQUIRY; + Cdb->CDB6INQUIRY.AllocationLength = 255; for (Bus = 0; Bus < DeviceExtension->PortConfig->NumberOfBuses; Bus++) { @@ -1937,9 +1940,12 @@ SpiScanAdapter (IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension) Status = SpiSendInquiry (DeviceExtension->DeviceObject, &Srb); - DPRINT("Status %lx Srb.SrbStatus %lx\n", Status, Srb.SrbStatus); + DPRINT ("Status %lx Srb.SrbStatus %x\n", Status, Srb.SrbStatus); - if (NT_SUCCESS(Status) && Srb.SrbStatus == SRB_STATUS_SUCCESS) + if (NT_SUCCESS(Status) && + (Srb.SrbStatus == SRB_STATUS_SUCCESS || + Srb.SrbStatus == SRB_STATUS_DATA_OVERRUN) && + ((PINQUIRYDATA)Srb.DataBuffer)->DeviceTypeQualifier == 0) { /* Copy inquiry data */ RtlCopyMemory (&LunExtension->InquiryData, From e207cba2722a3cfc4a989e0df864f5789d550799 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Tue, 23 Mar 2004 16:32:20 +0000 Subject: [PATCH 0616/1463] Implemented SetWindowRgn() and added support for window regions svn path=/trunk/; revision=8848 --- reactos/include/win32k/ntuser.h | 8 ++-- reactos/lib/user32/windows/paint.c | 9 ++--- reactos/subsys/win32k/ntuser/vis.c | 56 ++++++++++++++++++++------ reactos/subsys/win32k/ntuser/windc.c | 24 +++++++++-- reactos/subsys/win32k/ntuser/window.c | 49 +++++++++++++++++----- reactos/subsys/win32k/ntuser/winpos.c | 8 ++-- reactos/subsys/win32k/objects/region.c | 8 ++-- 7 files changed, 121 insertions(+), 41 deletions(-) diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index b73cef82de3..7b3e224ead9 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -1425,12 +1425,12 @@ STDCALL NtUserSetWindowPos( UINT uFlags ); -DWORD +INT STDCALL NtUserSetWindowRgn( - DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2); + HWND hWnd, + HRGN hRgn, + BOOL bRedraw); DWORD STDCALL diff --git a/reactos/lib/user32/windows/paint.c b/reactos/lib/user32/windows/paint.c index 31f793a4d8b..207770c7e32 100644 --- a/reactos/lib/user32/windows/paint.c +++ b/reactos/lib/user32/windows/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.23 2004/03/23 11:20:58 gvg Exp $ +/* $Id: paint.c,v 1.24 2004/03/23 16:32:20 weiden Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/paint.c @@ -191,7 +191,7 @@ RedrawWindow( /* - * @unimplemented + * @implemented */ BOOL STDCALL ScrollDC(HDC hDC, int dx, int dy, CONST RECT *lprcScroll, CONST RECT *lprcClip, @@ -203,7 +203,7 @@ ScrollDC(HDC hDC, int dx, int dy, CONST RECT *lprcScroll, CONST RECT *lprcClip, /* - * @unimplemented + * @implemented */ int STDCALL @@ -212,8 +212,7 @@ SetWindowRgn( HRGN hRgn, BOOL bRedraw) { - UNIMPLEMENTED; - return 0; + return (int)NtUserSetWindowRgn(hWnd, hRgn, bRedraw); } diff --git a/reactos/subsys/win32k/ntuser/vis.c b/reactos/subsys/win32k/ntuser/vis.c index cb97fe8f918..4f7b736b4a9 100644 --- a/reactos/subsys/win32k/ntuser/vis.c +++ b/reactos/subsys/win32k/ntuser/vis.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: vis.c,v 1.23 2004/03/14 20:31:55 gvg Exp $ + * $Id: vis.c,v 1.24 2004/03/23 16:32:20 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -52,17 +52,28 @@ VIS_ComputeVisibleRegion( if (ClientArea) { - VisRgn = UnsafeIntCreateRectRgnIndirect(&Window->ClientRect); - LeftOffset = Window->ClientRect.left; - TopOffset = Window->ClientRect.top; - } - else - { - VisRgn = UnsafeIntCreateRectRgnIndirect(&Window->WindowRect); - LeftOffset = Window->WindowRect.left; - TopOffset = Window->WindowRect.top; + if(!(ClipRgn = VIS_ComputeVisibleRegion(Window, FALSE, ClipChildren, ClipSiblings))) + { + return NULL; + } + if(!(VisRgn = UnsafeIntCreateRectRgnIndirect(&Window->ClientRect))) + { + NtGdiDeleteObject(VisRgn); + return NULL; + } + LeftOffset = Window->ClientRect.left - Window->WindowRect.left; + TopOffset = Window->ClientRect.top - Window->WindowRect.top; + NtGdiOffsetRgn(VisRgn, -Window->WindowRect.left, -Window->WindowRect.top); + NtGdiCombineRgn(VisRgn, VisRgn, ClipRgn, RGN_AND); + NtGdiDeleteObject(ClipRgn); + NtGdiOffsetRgn(VisRgn, -LeftOffset, -TopOffset); + return VisRgn; } + VisRgn = UnsafeIntCreateRectRgnIndirect(&Window->WindowRect); + LeftOffset = Window->WindowRect.left; + TopOffset = Window->WindowRect.top; + /* * Walk through all perent windows and for each clip the visble region * to the parent's client area and exclude all siblings that are over @@ -92,6 +103,13 @@ VIS_ComputeVisibleRegion( if (CurrentSibling->Style & WS_VISIBLE) { ClipRgn = UnsafeIntCreateRectRgnIndirect(&CurrentSibling->WindowRect); + /* Combine it with the window region if available */ + if(CurrentSibling->WindowRegion) + { + NtGdiOffsetRgn(ClipRgn, -CurrentSibling->WindowRect.left, -CurrentSibling->WindowRect.top); + NtGdiCombineRgn(ClipRgn, ClipRgn, CurrentSibling->WindowRegion, RGN_AND); + NtGdiOffsetRgn(ClipRgn, CurrentSibling->WindowRect.left, CurrentSibling->WindowRect.top); + } NtGdiCombineRgn(VisRgn, VisRgn, ClipRgn, RGN_DIFF); NtGdiDeleteObject(ClipRgn); } @@ -114,6 +132,13 @@ VIS_ComputeVisibleRegion( if (CurrentWindow->Style & WS_VISIBLE) { ClipRgn = UnsafeIntCreateRectRgnIndirect(&CurrentWindow->WindowRect); + /* Combine it with the window region if available */ + if(CurrentWindow->WindowRegion) + { + NtGdiOffsetRgn(ClipRgn, -CurrentWindow->WindowRect.left, -CurrentWindow->WindowRect.top); + NtGdiCombineRgn(ClipRgn, ClipRgn, CurrentWindow->WindowRegion, RGN_AND); + NtGdiOffsetRgn(ClipRgn, CurrentWindow->WindowRect.left, CurrentWindow->WindowRect.top); + } NtGdiCombineRgn(VisRgn, VisRgn, ClipRgn, RGN_DIFF); NtGdiDeleteObject(ClipRgn); } @@ -121,9 +146,16 @@ VIS_ComputeVisibleRegion( } IntUnLockRelatives(Window); } - + + if(Window->WindowRegion) + { + NtGdiOffsetRgn(VisRgn, -LeftOffset, -TopOffset); + NtGdiCombineRgn(VisRgn, VisRgn, Window->WindowRegion, RGN_AND); + return VisRgn; + } + NtGdiOffsetRgn(VisRgn, -LeftOffset, -TopOffset); - + return VisRgn; } diff --git a/reactos/subsys/win32k/ntuser/windc.c b/reactos/subsys/win32k/ntuser/windc.c index 684f99796cf..c96812ec591 100644 --- a/reactos/subsys/win32k/ntuser/windc.c +++ b/reactos/subsys/win32k/ntuser/windc.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: windc.c,v 1.59 2004/02/24 01:30:57 weiden Exp $ +/* $Id: windc.c,v 1.60 2004/03/23 16:32:20 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -485,6 +485,8 @@ NtUserGetDCEx(HWND hWnd, HANDLE ClipRegion, ULONG Flags) if (Dce->hClipRgn && Window->UpdateRegion) { NtGdiCombineRgn(Dce->hClipRgn, Window->UpdateRegion, NULL, RGN_COPY); + if(Window->WindowRegion) + NtGdiCombineRgn(Dce->hClipRgn, Dce->hClipRgn, Window->WindowRegion, RGN_AND); if (!(Flags & DCX_WINDOW)) { NtGdiOffsetRgn(Dce->hClipRgn, @@ -500,14 +502,25 @@ NtUserGetDCEx(HWND hWnd, HANDLE ClipRegion, ULONG Flags) if (!(Flags & DCX_WINDOW)) { Dce->hClipRgn = UnsafeIntCreateRectRgnIndirect(&Window->ClientRect); - NtGdiOffsetRgn(Dce->hClipRgn, -Window->ClientRect.left, - -Window->ClientRect.top); + if(Window->WindowRegion) + { + NtGdiOffsetRgn(Dce->hClipRgn, -Window->WindowRect.left, -Window->WindowRect.top); + NtGdiCombineRgn(Dce->hClipRgn, Dce->hClipRgn, Window->WindowRegion, RGN_AND); + NtGdiOffsetRgn(Dce->hClipRgn, -(Window->ClientRect.left - Window->WindowRect.left), + -(Window->ClientRect.top - Window->WindowRect.top)); + } + else + { + NtGdiOffsetRgn(Dce->hClipRgn, -Window->ClientRect.left, -Window->ClientRect.top); + } } else { Dce->hClipRgn = UnsafeIntCreateRectRgnIndirect(&Window->WindowRect); NtGdiOffsetRgn(Dce->hClipRgn, -Window->WindowRect.left, -Window->WindowRect.top); + if(Window->WindowRegion) + NtGdiCombineRgn(Dce->hClipRgn, Dce->hClipRgn, Window->WindowRegion, RGN_AND); } } else if (NULL != ClipRegion) @@ -515,7 +528,10 @@ NtUserGetDCEx(HWND hWnd, HANDLE ClipRegion, ULONG Flags) Dce->hClipRgn = NtGdiCreateRectRgn(0, 0, 0, 0); if (Dce->hClipRgn) { - NtGdiCombineRgn(Dce->hClipRgn, ClipRegion, NULL, RGN_COPY); + if(Window->WindowRegion) + NtGdiCombineRgn(Dce->hClipRgn, ClipRegion, Window->WindowRegion, RGN_AND); + else + NtGdiCombineRgn(Dce->hClipRgn, ClipRegion, NULL, RGN_COPY); } NtGdiDeleteObject(ClipRegion); } diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index d3a712dcc09..b1033d2d020 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.199 2004/03/13 23:12:19 gvg Exp $ +/* $Id: window.c,v 1.200 2004/03/23 16:32:20 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -417,6 +417,11 @@ static LRESULT IntDestroyWindow(PWINDOW_OBJECT Window, ObmDereferenceObject(Window->Class); Window->Class = NULL; + if(Window->WindowRegion) + { + NtGdiDeleteObject(Window->WindowRegion); + } + IntReleaseWindowObject(Window); return 0; @@ -3390,16 +3395,42 @@ NtUserSetWindowPos( /* - * @unimplemented + * @implemented */ -DWORD STDCALL -NtUserSetWindowRgn(DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2) +INT STDCALL +NtUserSetWindowRgn( + HWND hWnd, + HRGN hRgn, + BOOL bRedraw) { - UNIMPLEMENTED - - return 0; + PWINDOW_OBJECT WindowObject; + + WindowObject = IntGetWindowObject(hWnd); + if (WindowObject == NULL) + { + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + return 0; + } + + /* FIXME - Verify if hRgn is a valid handle!!!! + Propably make this operation thread-safe, but maybe it's not necessary */ + + if(WindowObject->WindowRegion) + { + /* Delete no longer needed region handle */ + NtGdiDeleteObject(WindowObject->WindowRegion); + } + WindowObject->WindowRegion = hRgn; + + /* FIXME - send WM_WINDOWPOSCHANGING and WM_WINDOWPOSCHANGED messages to the window */ + + if(bRedraw) + { + IntRedrawWindow(WindowObject, NULL, NULL, RDW_INVALIDATE); + } + + IntReleaseWindowObject(WindowObject); + return (INT)hRgn; } diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index c120edda7f9..31856982a38 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.102 2004/03/22 20:14:29 weiden Exp $ +/* $Id: winpos.c,v 1.103 2004/03/23 16:32:20 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1337,8 +1337,10 @@ WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, BOOL SendHitTestMessage, POINT *Po (Point->x >= Current->WindowRect.left && Point->x < Current->WindowRect.right && Point->y >= Current->WindowRect.top && - Point->y < Current->WindowRect.bottom)) - /* FIXME - check if Point is in window region */ + Point->y < Current->WindowRect.bottom) && + (!Current->WindowRegion || NtGdiPtInRegion(Current->WindowRegion, + (INT)(Point->x - Current->WindowRect.left), (INT)(Point->y - Current->WindowRect.top))) + ) { if(*Window) { diff --git a/reactos/subsys/win32k/objects/region.c b/reactos/subsys/win32k/objects/region.c index 6e3fc35b901..3df445d4eb1 100644 --- a/reactos/subsys/win32k/objects/region.c +++ b/reactos/subsys/win32k/objects/region.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: region.c,v 1.43 2004/03/22 20:14:29 weiden Exp $ */ +/* $Id: region.c,v 1.44 2004/03/23 16:32:20 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> #include <ddk/ntddk.h> @@ -2051,10 +2051,10 @@ NtGdiPtInRegion(HRGN hRgn, { PROSRGNDATA rgn; ULONG i; - - if( (rgn = RGNDATA_LockRgn(hRgn) ) ) + + if(!(rgn = RGNDATA_LockRgn(hRgn) ) ) return FALSE; - + if(rgn->rdh.nCount > 0 && INRECT(rgn->rdh.rcBound, X, Y)){ for(i = 0; i < rgn->rdh.nCount; i++) { if(INRECT(*(PRECT)&rgn->Buffer[i], X, Y)){ From 4e955d6423d6dc012f317b9ae7ec49bdafeff794 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Tue, 23 Mar 2004 17:07:41 +0000 Subject: [PATCH 0617/1463] Fix incorrect pointer arithmetic in NtGdiPtInRegion() svn path=/trunk/; revision=8849 --- reactos/subsys/win32k/objects/region.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/reactos/subsys/win32k/objects/region.c b/reactos/subsys/win32k/objects/region.c index 3df445d4eb1..510fed04d53 100644 --- a/reactos/subsys/win32k/objects/region.c +++ b/reactos/subsys/win32k/objects/region.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: region.c,v 1.44 2004/03/23 16:32:20 weiden Exp $ */ +/* $Id: region.c,v 1.45 2004/03/23 17:07:41 gvg Exp $ */ #undef WIN32_LEAN_AND_MEAN #include <windows.h> #include <ddk/ntddk.h> @@ -2051,16 +2051,19 @@ NtGdiPtInRegion(HRGN hRgn, { PROSRGNDATA rgn; ULONG i; - + PRECT r; + if(!(rgn = RGNDATA_LockRgn(hRgn) ) ) return FALSE; if(rgn->rdh.nCount > 0 && INRECT(rgn->rdh.rcBound, X, Y)){ + r = (PRECT) rgn->Buffer; for(i = 0; i < rgn->rdh.nCount; i++) { - if(INRECT(*(PRECT)&rgn->Buffer[i], X, Y)){ - RGNDATA_UnlockRgn(hRgn); - return TRUE; - } + if(INRECT(*r, X, Y)){ + RGNDATA_UnlockRgn(hRgn); + return TRUE; + } + r++; } } RGNDATA_UnlockRgn(hRgn); From 4a2de9a81cf2df3b5034283e721eca18ffa0e682 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Tue, 23 Mar 2004 18:08:07 +0000 Subject: [PATCH 0618/1463] don't use the window region when minimized svn path=/trunk/; revision=8850 --- reactos/subsys/win32k/ntuser/painting.c | 4 ++-- reactos/subsys/win32k/ntuser/vis.c | 8 ++++---- reactos/subsys/win32k/ntuser/windc.c | 22 +++++++++++----------- reactos/subsys/win32k/ntuser/winpos.c | 7 ++++--- 4 files changed, 21 insertions(+), 20 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/painting.c b/reactos/subsys/win32k/ntuser/painting.c index 091ecd3d4e2..cd925335faf 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.78 2004/03/23 11:20:58 gvg Exp $ + * $Id: painting.c,v 1.79 2004/03/23 18:08:07 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -213,7 +213,7 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags) */ IntLockWindowUpdate(Window); - if (!Window->WindowRegion) + if (!Window->WindowRegion || (Window->Style & WS_MINIMIZE)) { HRGN hRgnWindow; diff --git a/reactos/subsys/win32k/ntuser/vis.c b/reactos/subsys/win32k/ntuser/vis.c index 4f7b736b4a9..3fc1110de84 100644 --- a/reactos/subsys/win32k/ntuser/vis.c +++ b/reactos/subsys/win32k/ntuser/vis.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: vis.c,v 1.24 2004/03/23 16:32:20 weiden Exp $ + * $Id: vis.c,v 1.25 2004/03/23 18:08:07 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -104,7 +104,7 @@ VIS_ComputeVisibleRegion( { ClipRgn = UnsafeIntCreateRectRgnIndirect(&CurrentSibling->WindowRect); /* Combine it with the window region if available */ - if(CurrentSibling->WindowRegion) + if(CurrentSibling->WindowRegion && !(CurrentSibling->Style & WS_MINIMIZE)) { NtGdiOffsetRgn(ClipRgn, -CurrentSibling->WindowRect.left, -CurrentSibling->WindowRect.top); NtGdiCombineRgn(ClipRgn, ClipRgn, CurrentSibling->WindowRegion, RGN_AND); @@ -133,7 +133,7 @@ VIS_ComputeVisibleRegion( { ClipRgn = UnsafeIntCreateRectRgnIndirect(&CurrentWindow->WindowRect); /* Combine it with the window region if available */ - if(CurrentWindow->WindowRegion) + if(CurrentWindow->WindowRegion && !(CurrentWindow->Style & WS_MINIMIZE)) { NtGdiOffsetRgn(ClipRgn, -CurrentWindow->WindowRect.left, -CurrentWindow->WindowRect.top); NtGdiCombineRgn(ClipRgn, ClipRgn, CurrentWindow->WindowRegion, RGN_AND); @@ -147,7 +147,7 @@ VIS_ComputeVisibleRegion( IntUnLockRelatives(Window); } - if(Window->WindowRegion) + if(Window->WindowRegion && !(Window->Style & WS_MINIMIZE)) { NtGdiOffsetRgn(VisRgn, -LeftOffset, -TopOffset); NtGdiCombineRgn(VisRgn, VisRgn, Window->WindowRegion, RGN_AND); diff --git a/reactos/subsys/win32k/ntuser/windc.c b/reactos/subsys/win32k/ntuser/windc.c index c96812ec591..2aaf0bd586b 100644 --- a/reactos/subsys/win32k/ntuser/windc.c +++ b/reactos/subsys/win32k/ntuser/windc.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: windc.c,v 1.60 2004/03/23 16:32:20 weiden Exp $ +/* $Id: windc.c,v 1.61 2004/03/23 18:08:07 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -485,7 +485,7 @@ NtUserGetDCEx(HWND hWnd, HANDLE ClipRegion, ULONG Flags) if (Dce->hClipRgn && Window->UpdateRegion) { NtGdiCombineRgn(Dce->hClipRgn, Window->UpdateRegion, NULL, RGN_COPY); - if(Window->WindowRegion) + if(Window->WindowRegion && !(Window->Style & WS_MINIMIZE)) NtGdiCombineRgn(Dce->hClipRgn, Dce->hClipRgn, Window->WindowRegion, RGN_AND); if (!(Flags & DCX_WINDOW)) { @@ -502,24 +502,24 @@ NtUserGetDCEx(HWND hWnd, HANDLE ClipRegion, ULONG Flags) if (!(Flags & DCX_WINDOW)) { Dce->hClipRgn = UnsafeIntCreateRectRgnIndirect(&Window->ClientRect); - if(Window->WindowRegion) + if(!Window->WindowRegion || (Window->Style & WS_MINIMIZE)) + { + NtGdiOffsetRgn(Dce->hClipRgn, -Window->ClientRect.left, -Window->ClientRect.top); + } + else { NtGdiOffsetRgn(Dce->hClipRgn, -Window->WindowRect.left, -Window->WindowRect.top); NtGdiCombineRgn(Dce->hClipRgn, Dce->hClipRgn, Window->WindowRegion, RGN_AND); NtGdiOffsetRgn(Dce->hClipRgn, -(Window->ClientRect.left - Window->WindowRect.left), -(Window->ClientRect.top - Window->WindowRect.top)); } - else - { - NtGdiOffsetRgn(Dce->hClipRgn, -Window->ClientRect.left, -Window->ClientRect.top); - } } else { Dce->hClipRgn = UnsafeIntCreateRectRgnIndirect(&Window->WindowRect); NtGdiOffsetRgn(Dce->hClipRgn, -Window->WindowRect.left, -Window->WindowRect.top); - if(Window->WindowRegion) + if(Window->WindowRegion && !(Window->Style & WS_MINIMIZE)) NtGdiCombineRgn(Dce->hClipRgn, Dce->hClipRgn, Window->WindowRegion, RGN_AND); } } @@ -528,10 +528,10 @@ NtUserGetDCEx(HWND hWnd, HANDLE ClipRegion, ULONG Flags) Dce->hClipRgn = NtGdiCreateRectRgn(0, 0, 0, 0); if (Dce->hClipRgn) { - if(Window->WindowRegion) - NtGdiCombineRgn(Dce->hClipRgn, ClipRegion, Window->WindowRegion, RGN_AND); - else + if(!Window->WindowRegion || (Window->Style & WS_MINIMIZE)) NtGdiCombineRgn(Dce->hClipRgn, ClipRegion, NULL, RGN_COPY); + else + NtGdiCombineRgn(Dce->hClipRgn, ClipRegion, Window->WindowRegion, RGN_AND); } NtGdiDeleteObject(ClipRegion); } diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index 31856982a38..cd46cacda5b 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.103 2004/03/23 16:32:20 weiden Exp $ +/* $Id: winpos.c,v 1.104 2004/03/23 18:08:07 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1338,8 +1338,9 @@ WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, BOOL SendHitTestMessage, POINT *Po Point->x < Current->WindowRect.right && Point->y >= Current->WindowRect.top && Point->y < Current->WindowRect.bottom) && - (!Current->WindowRegion || NtGdiPtInRegion(Current->WindowRegion, - (INT)(Point->x - Current->WindowRect.left), (INT)(Point->y - Current->WindowRect.top))) + (!Current->WindowRegion || (Current->Style & WS_MINIMIZE) || + NtGdiPtInRegion(Current->WindowRegion, (INT)(Point->x - Current->WindowRect.left), + (INT)(Point->y - Current->WindowRect.top))) ) { if(*Window) From 82e886d635051c1bf0ecb29423699d7a6116a731 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Tue, 23 Mar 2004 19:46:50 +0000 Subject: [PATCH 0619/1463] Implement GetObjectA/W() for fonts svn path=/trunk/; revision=8851 --- reactos/lib/gdi32/misc/stubsa.c | 17 +----- reactos/lib/gdi32/misc/stubsw.c | 17 +----- reactos/lib/gdi32/objects/dc.c | 53 ++++++++++++++++++ reactos/subsys/win32k/include/text.h | 1 + reactos/subsys/win32k/objects/dc.c | 83 +++++++++++++++------------- reactos/subsys/win32k/objects/text.c | 16 +++++- 6 files changed, 117 insertions(+), 70 deletions(-) diff --git a/reactos/lib/gdi32/misc/stubsa.c b/reactos/lib/gdi32/misc/stubsa.c index baa66c4a87d..5faf385615c 100644 --- a/reactos/lib/gdi32/misc/stubsa.c +++ b/reactos/lib/gdi32/misc/stubsa.c @@ -1,4 +1,4 @@ -/* $Id: stubsa.c,v 1.29 2004/03/23 07:59:47 gvg Exp $ +/* $Id: stubsa.c,v 1.30 2004/03/23 19:46:49 gvg Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -407,21 +407,6 @@ StartDocA( } -/* - * @unimplemented - */ -int -STDCALL -GetObjectA( - HGDIOBJ a0, - int a1, - LPVOID a2 - ) -{ - return NtGdiGetObject ( a0, a1, a2 ); -} - - /* * @unimplemented */ diff --git a/reactos/lib/gdi32/misc/stubsw.c b/reactos/lib/gdi32/misc/stubsw.c index 12e1b752ed0..66240e38c4b 100644 --- a/reactos/lib/gdi32/misc/stubsw.c +++ b/reactos/lib/gdi32/misc/stubsw.c @@ -1,4 +1,4 @@ -/* $Id: stubsw.c,v 1.26 2004/03/23 07:59:47 gvg Exp $ +/* $Id: stubsw.c,v 1.27 2004/03/23 19:46:49 gvg Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -296,21 +296,6 @@ StartDocW( } -/* - * @unimplemented - */ -int -STDCALL -GetObjectW( - HGDIOBJ a0, - int a1, - LPVOID a2 - ) -{ - return NtGdiGetObject ( a0, a1, a2 ); -} - - /* * @unimplemented */ diff --git a/reactos/lib/gdi32/objects/dc.c b/reactos/lib/gdi32/objects/dc.c index c37da44a82f..09c0f879f57 100644 --- a/reactos/lib/gdi32/objects/dc.c +++ b/reactos/lib/gdi32/objects/dc.c @@ -6,6 +6,7 @@ #include <windows.h> #include <ddk/ntddk.h> #include <win32k/kapi.h> +#include <rosrtl/logfont.h> /* @@ -940,3 +941,55 @@ ExtEscape( { return NtGdiExtEscape(a0, a1, a2, a3, a4, a5); } + + +/* + * @unimplemented + */ +int +STDCALL +GetObjectA(HGDIOBJ Handle, int Size, LPVOID Buffer) +{ + LOGFONTW LogFontW; + DWORD Type; + int Result; + + Type = GetObjectType(Handle); + if (0 == Type) + { + return 0; + } + + if (OBJ_FONT == Type) + { + if (Size < sizeof(LOGFONTA)) + { + SetLastError(ERROR_BUFFER_OVERFLOW); + return 0; + } + Result = NtGdiGetObject(Handle, sizeof(LOGFONTW), &LogFontW); + if (0 == Result) + { + return 0; + } + RosRtlLogFontW2A((LPLOGFONTA) Buffer, &LogFontW); + Result = sizeof(LOGFONTA); + } + else + { + Result = NtGdiGetObject(Handle, Size, Buffer); + } + + return Result; +} + + +/* + * @unimplemented + */ +int +STDCALL +GetObjectW(HGDIOBJ Handle, int Size, LPVOID Buffer) +{ + return NtGdiGetObject(Handle, Size, Buffer); +} diff --git a/reactos/subsys/win32k/include/text.h b/reactos/subsys/win32k/include/text.h index ebb8afcc149..2dca5b27da2 100644 --- a/reactos/subsys/win32k/include/text.h +++ b/reactos/subsys/win32k/include/text.h @@ -5,6 +5,7 @@ BOOL FASTCALL InitFontSupport(VOID); BOOL FASTCALL IntIsFontRenderingEnabled(VOID); BOOL FASTCALL IntIsFontRenderingEnabled(VOID); VOID FASTCALL IntEnableFontRendering(BOOL Enable); +INT FASTCALL FontGetObject(PTEXTOBJ TextObj, INT Count, PVOID Buffer); #define IntLockProcessPrivateFonts(W32Process) \ ExAcquireFastMutex(&W32Process->PrivateFontListLock) diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index f0c8c23ebff..6733eb45118 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.124 2004/03/15 22:02:31 gvg Exp $ +/* $Id: dc.c,v 1.125 2004/03/23 19:46:50 gvg Exp $ * * DC.C - Device context functions * @@ -53,6 +53,7 @@ #include <include/intgdi.h> #include <include/cleanup.h> #include <include/tags.h> +#include <include/text.h> #define NDEBUG #include <win32k/debug1.h> @@ -1425,47 +1426,55 @@ DC_GET_VAL( INT, NtGdiGetMapMode, w.MapMode ) DC_GET_VAL( INT, NtGdiGetPolyFillMode, w.polyFillMode ) INT FASTCALL -IntGdiGetObject(HANDLE handle, INT count, LPVOID buffer) +IntGdiGetObject(HANDLE Handle, INT Count, LPVOID Buffer) { - PGDIOBJHDR gdiObject; - INT result = 0; - DWORD objectType; + PGDIOBJHDR GdiObject; + INT Result = 0; + DWORD ObjectType; - gdiObject = GDIOBJ_LockObj(handle, GDI_OBJECT_TYPE_DONTCARE); - if (gdiObject == 0) - return 0; + GdiObject = GDIOBJ_LockObj(Handle, GDI_OBJECT_TYPE_DONTCARE); + if (NULL == GdiObject) + { + return 0; + } - objectType = GDIOBJ_GetObjectType(handle); - switch(objectType) - { -/* case GDI_OBJECT_TYPE_PEN: - result = PEN_GetObject((PENOBJ *)gdiObject, count, buffer); - break; - case GDI_OBJECT_TYPE_BRUSH: - result = BRUSH_GetObject((BRUSHOBJ *)gdiObject, count, buffer); - break; */ - case GDI_OBJECT_TYPE_BITMAP: - result = BITMAP_GetObject((BITMAPOBJ *)gdiObject, count, buffer); - break; -/* case GDI_OBJECT_TYPE_FONT: - result = FONT_GetObjectW((FONTOBJ *)gdiObject, count, buffer); + ObjectType = GDIOBJ_GetObjectType(Handle); + switch (ObjectType) + { +#if 0 + case GDI_OBJECT_TYPE_PEN: + Result = PEN_GetObject((PENOBJ *) GdiObject, Count, Buffer); + break; + case GDI_OBJECT_TYPE_BRUSH: + Result = BRUSH_GetObject((BRUSHOBJ *) GdiObject, Count, Buffer); + break; +#endif + case GDI_OBJECT_TYPE_BITMAP: + Result = BITMAP_GetObject((BITMAPOBJ *) GdiObject, Count, Buffer); + break; + case GDI_OBJECT_TYPE_FONT: + Result = FontGetObject((PTEXTOBJ) GdiObject, Count, Buffer); +#if 0 + // Fix the LOGFONT structure for the stock fonts + if (FIRST_STOCK_HANDLE <= Handle && Handle <= LAST_STOCK_HANDLE) + { + FixStockFontSizeW(Handle, Count, Buffer); + } +#endif + break; +#if 0 + case GDI_OBJECT_TYPE_PALETTE: + Result = PALETTE_GetObject((PALETTEOBJ *) GdiObject, Count, Buffer); + break; +#endif + default: + DPRINT1("GDI object type 0x%08x not implemented\n", ObjectType); + break; + } - // Fix the LOGFONT structure for the stock fonts + GDIOBJ_UnlockObj(Handle, GDI_OBJECT_TYPE_DONTCARE); - if ( (handle >= FIRST_STOCK_HANDLE) && (handle <= LAST_STOCK_HANDLE) ) - FixStockFontSizeW(handle, count, buffer); - break; - case GDI_OBJECT_TYPE_PALETTE: - result = PALETTE_GetObject((PALETTEOBJ *)gdiObject, count, buffer); - break; */ - default: - DPRINT1("GDI object type 0x%08x not implemented\n", objectType); - break; - } - - GDIOBJ_UnlockObj(handle, GDI_OBJECT_TYPE_DONTCARE); - - return result; + return Result; } INT STDCALL diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index 505ab2525e2..450e7118899 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.83 2004/03/23 07:59:47 gvg Exp $ */ +/* $Id: text.c,v 1.84 2004/03/23 19:46:50 gvg Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -2657,4 +2657,18 @@ TextIntRealizeFont(HFONT FontHandle) return Status; } +INT FASTCALL +FontGetObject(PTEXTOBJ Font, INT Count, PVOID Buffer) +{ + if (Count < sizeof(LOGFONTW)) + { + SetLastWin32Error(ERROR_BUFFER_OVERFLOW); + return 0; + } + + RtlCopyMemory(Buffer, &Font->logfont, sizeof(LOGFONTW)); + + return sizeof(LOGFONTW); +} + /* EOF */ From 022bd7dd681baa4618e23a3a2469c388d3bc98ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Tue, 23 Mar 2004 21:30:18 +0000 Subject: [PATCH 0620/1463] Check for valid ClientRect svn path=/trunk/; revision=8852 --- reactos/subsys/win32k/ntuser/winpos.c | 48 +++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index cd46cacda5b..942494a0104 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.104 2004/03/23 18:08:07 weiden Exp $ +/* $Id: winpos.c,v 1.105 2004/03/23 21:30:18 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -441,6 +441,43 @@ WinPosGetMinMaxInfo(PWINDOW_OBJECT Window, POINT* MaxSize, POINT* MaxPos, return 0; //FIXME: what does it return? } +STATIC VOID FASTCALL +FixClientRect(PRECT ClientRect, PRECT WindowRect) +{ + if (ClientRect->left < WindowRect->left) + { + ClientRect->left = WindowRect->left; + } + else if (WindowRect->right < ClientRect->left) + { + ClientRect->left = WindowRect->right; + } + if (ClientRect->right < WindowRect->left) + { + ClientRect->right = WindowRect->left; + } + else if (WindowRect->right < ClientRect->right) + { + ClientRect->right = WindowRect->right; + } + if (ClientRect->top < WindowRect->top) + { + ClientRect->top = WindowRect->top; + } + else if (WindowRect->bottom < ClientRect->top) + { + ClientRect->top = WindowRect->bottom; + } + if (ClientRect->bottom < WindowRect->top) + { + ClientRect->bottom = WindowRect->top; + } + else if (WindowRect->bottom < ClientRect->bottom) + { + ClientRect->bottom = WindowRect->bottom; + } +} + LONG STATIC FASTCALL WinPosDoNCCALCSize(PWINDOW_OBJECT Window, PWINDOWPOS WinPos, RECT* WindowRect, RECT* ClientRect) @@ -482,6 +519,7 @@ WinPosDoNCCALCSize(PWINDOW_OBJECT Window, PWINDOWPOS WinPos, NtGdiOffsetRect(ClientRect, Parent->ClientRect.left, Parent->ClientRect.top); } + FixClientRect(ClientRect, WindowRect); } /* FIXME: WVR_ALIGNxxx */ @@ -1137,8 +1175,14 @@ WinPosSetWindowPos(HWND Wnd, HWND WndInsertAfter, INT x, INT y, INT cx, LRESULT FASTCALL WinPosGetNonClientSize(HWND Wnd, RECT* WindowRect, RECT* ClientRect) { + LRESULT Result; + *ClientRect = *WindowRect; - return(IntSendMessage(Wnd, WM_NCCALCSIZE, FALSE, (LPARAM) ClientRect)); + Result = IntSendMessage(Wnd, WM_NCCALCSIZE, FALSE, (LPARAM) ClientRect); + + FixClientRect(ClientRect, WindowRect); + + return Result; } BOOLEAN FASTCALL From 39c67567650de810b0f2f534e0d9c1c75edf4646 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Tue, 23 Mar 2004 21:47:37 +0000 Subject: [PATCH 0621/1463] Implemented GetWindowRgn() and GetWindowRgnBox() svn path=/trunk/; revision=8853 --- reactos/include/win32k/ntuser.h | 2 + reactos/lib/user32/misc/stubs.c | 15 +---- reactos/lib/user32/windows/paint.c | 21 ++++-- reactos/subsys/win32k/include/window.h | 6 ++ reactos/subsys/win32k/ntuser/misc.c | 19 +++++- reactos/subsys/win32k/ntuser/window.c | 88 +++++++++++++++++++++++++- 6 files changed, 131 insertions(+), 20 deletions(-) diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index 7b3e224ead9..91019b8720d 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -178,6 +178,8 @@ NtUserCallOneParam( DWORD Param, DWORD Routine); +#define TWOPARAM_ROUTINE_GETWINDOWRGNBOX 0x48 +#define TWOPARAM_ROUTINE_GETWINDOWRGN 0x49 #define TWOPARAM_ROUTINE_SETMENUBARHEIGHT 0x50 #define TWOPARAM_ROUTINE_SETMENUITEMRECT 0x51 #define TWOPARAM_ROUTINE_SETGUITHRDHANDLE 0x52 diff --git a/reactos/lib/user32/misc/stubs.c b/reactos/lib/user32/misc/stubs.c index 0fe06e8cd29..9644a96064f 100644 --- a/reactos/lib/user32/misc/stubs.c +++ b/reactos/lib/user32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.56 2004/01/23 23:38:26 ekohl Exp $ +/* $Id: stubs.c,v 1.57 2004/03/23 21:47:36 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -802,19 +802,6 @@ GetRegisteredRawInputDevices( return FALSE; } -/* - * @unimplemented - */ -int -STDCALL -GetWindowRgnBox( - HWND hWnd, - LPRECT lprc) -{ - UNIMPLEMENTED; - return FALSE; -} - /* * @unimplemented */ diff --git a/reactos/lib/user32/windows/paint.c b/reactos/lib/user32/windows/paint.c index 207770c7e32..3744850c103 100644 --- a/reactos/lib/user32/windows/paint.c +++ b/reactos/lib/user32/windows/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.24 2004/03/23 16:32:20 weiden Exp $ +/* $Id: paint.c,v 1.25 2004/03/23 21:47:37 weiden Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/paint.c @@ -256,7 +256,7 @@ ValidateRgn( /* - * @unimplemented + * @implemented */ int STDCALL @@ -264,10 +264,23 @@ GetWindowRgn( HWND hWnd, HRGN hRgn) { - UNIMPLEMENTED; - return 0; + return (int)NtUserCallTwoParam((DWORD)hWnd, (DWORD)hRgn, TWOPARAM_ROUTINE_GETWINDOWRGN); } + +/* + * @implemented + */ +int +STDCALL +GetWindowRgnBox( + HWND hWnd, + LPRECT lprc) +{ + return (int)NtUserCallTwoParam((DWORD)hWnd, (DWORD)lprc, TWOPARAM_ROUTINE_GETWINDOWRGNBOX); +} + + const BYTE MappingTable[33] = {5,9,2,3,5,7,0,0,0,7,5,5,3,2,7,5,3,3,0,5,7,10,5,0,11,4,1,1,3,8,6,12,7}; /* * @implemented diff --git a/reactos/subsys/win32k/include/window.h b/reactos/subsys/win32k/include/window.h index aed7a412300..863f405f80f 100644 --- a/reactos/subsys/win32k/include/window.h +++ b/reactos/subsys/win32k/include/window.h @@ -188,6 +188,12 @@ IntGetParent(PWINDOW_OBJECT Wnd); PWINDOW_OBJECT FASTCALL IntGetParentObject(PWINDOW_OBJECT Wnd); +INT FASTCALL +IntGetWindowRgn(HWND hWnd, HRGN hRgn); + +INT FASTCALL +IntGetWindowRgnBox(HWND hWnd, RECT *Rect); + DWORD IntRemoveWndProcHandle(WNDPROC Handle); DWORD IntRemoveProcessWndProcHandles(HANDLE ProcessID); DWORD IntAddWndProcHandle(WNDPROC WindowProc, BOOL IsUnicode); diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index e718e99e698..ab1233850f1 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.54 2004/03/07 11:59:43 navaraf Exp $ +/* $Id: misc.c,v 1.55 2004/03/23 21:47:37 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -197,6 +197,23 @@ NtUserCallTwoParam( switch(Routine) { + case TWOPARAM_ROUTINE_GETWINDOWRGNBOX: + { + DWORD Ret; + RECT rcRect; + Ret = (DWORD)IntGetWindowRgnBox((HWND)Param1, &rcRect); + Status = MmCopyToCaller((PVOID)Param2, &rcRect, sizeof(RECT)); + if(!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return ERROR; + } + return Ret; + } + case TWOPARAM_ROUTINE_GETWINDOWRGN: + { + return (DWORD)IntGetWindowRgn((HWND)Param1, (HRGN)Param2); + } case TWOPARAM_ROUTINE_SETMENUBARHEIGHT: { DWORD Ret; diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index b1033d2d020..6eb1d317579 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.200 2004/03/23 16:32:20 weiden Exp $ +/* $Id: window.c,v 1.201 2004/03/23 21:47:37 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -3394,6 +3394,92 @@ NtUserSetWindowPos( } +INT FASTCALL +IntGetWindowRgn(HWND hWnd, HRGN hRgn) +{ + INT Ret; + PWINDOW_OBJECT WindowObject; + HRGN VisRgn; + ROSRGNDATA *pRgn; + + if(!(WindowObject = IntGetWindowObject(hWnd))) + { + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + return ERROR; + } + if(!hRgn) + { + IntReleaseWindowObject(WindowObject); + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return ERROR; + } + + /* Create a new window region using the window rectangle */ + VisRgn = UnsafeIntCreateRectRgnIndirect(&WindowObject->WindowRect); + NtGdiOffsetRgn(VisRgn, -WindowObject->WindowRect.left, -WindowObject->WindowRect.top); + /* if there's a region assigned to the window, combine them both */ + if(WindowObject->WindowRegion && !(WindowObject->Style & WS_MINIMIZE)) + NtGdiCombineRgn(VisRgn, VisRgn, WindowObject->WindowRegion, RGN_AND); + /* Copy the region into hRgn */ + NtGdiCombineRgn(hRgn, VisRgn, NULL, RGN_COPY); + + if((pRgn = RGNDATA_LockRgn(hRgn))) + { + Ret = pRgn->rdh.iType; + RGNDATA_UnlockRgn(hRgn); + } + else + Ret = ERROR; + + NtGdiDeleteObject(VisRgn); + + IntReleaseWindowObject(WindowObject); + return Ret; +} + +INT FASTCALL +IntGetWindowRgnBox(HWND hWnd, RECT *Rect) +{ + INT Ret; + PWINDOW_OBJECT WindowObject; + HRGN VisRgn; + ROSRGNDATA *pRgn; + + if(!(WindowObject = IntGetWindowObject(hWnd))) + { + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + return ERROR; + } + if(!Rect) + { + IntReleaseWindowObject(WindowObject); + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return ERROR; + } + + /* Create a new window region using the window rectangle */ + VisRgn = UnsafeIntCreateRectRgnIndirect(&WindowObject->WindowRect); + NtGdiOffsetRgn(VisRgn, -WindowObject->WindowRect.left, -WindowObject->WindowRect.top); + /* if there's a region assigned to the window, combine them both */ + if(WindowObject->WindowRegion && !(WindowObject->Style & WS_MINIMIZE)) + NtGdiCombineRgn(VisRgn, VisRgn, WindowObject->WindowRegion, RGN_AND); + + if((pRgn = RGNDATA_LockRgn(VisRgn))) + { + Ret = pRgn->rdh.iType; + *Rect = pRgn->rdh.rcBound; + RGNDATA_UnlockRgn(VisRgn); + } + else + Ret = ERROR; + + NtGdiDeleteObject(VisRgn); + + IntReleaseWindowObject(WindowObject); + return Ret; +} + + /* * @implemented */ From 68d825d0da732469b262d88730cc59386098c24b Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Tue, 23 Mar 2004 22:24:27 +0000 Subject: [PATCH 0622/1463] fixed accessing memory that has already been freed svn path=/trunk/; revision=8854 --- reactos/subsys/win32k/ntuser/msgqueue.c | 28 ++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index 430558ee2d1..241b1583f57 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.76 2004/03/11 16:17:25 weiden Exp $ +/* $Id: msgqueue.c,v 1.77 2004/03/23 22:24:27 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -240,7 +240,7 @@ MsqIsDblClk(PWINDOW_OBJECT Window, PUSER_MESSAGE Message, BOOL Remove) BOOL STATIC STDCALL MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, - PUSER_MESSAGE Message, BOOL Remove, PBOOL Freed, + PUSER_MESSAGE Message, BOOL Remove, PBOOL Freed, BOOL RemoveWhenFreed, PWINDOW_OBJECT ScopeWin, PUSHORT HitTest, PPOINT ScreenPoint, BOOL FromGlobalQueue) { @@ -298,6 +298,10 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, else { IntReleaseWindowObject(Window); + if(RemoveWhenFreed) + { + RemoveEntryList(&Message->ListEntry); + } ExFreePool(Message); *Freed = TRUE; return(FALSE); @@ -346,6 +350,10 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, if (Window == NULL) { + if(RemoveWhenFreed) + { + RemoveEntryList(&Message->ListEntry); + } ExFreePool(Message); *Freed = TRUE; return(FALSE); @@ -377,6 +385,10 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, { /* we do not hold more than one WM_MOUSEMOVE message in the queue */ Window->MessageQueue->MouseMoveMsg->Msg = Message->Msg; + if(RemoveWhenFreed) + { + RemoveEntryList(&Message->ListEntry); + } ExFreePool(Message); *Freed = TRUE; } @@ -404,6 +416,10 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, { /* we do not hold more than one WM_MOUSEMOVE message in the queue */ Window->MessageQueue->MouseMoveMsg->Msg = Message->Msg; + if(RemoveWhenFreed) + { + RemoveEntryList(&Message->ListEntry); + } ExFreePool(Message); *Freed = TRUE; } @@ -527,7 +543,7 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, Current->Msg.message <= WM_MOUSELAST) { Accept = MsqTranslateMouseMessage(hWnd, FilterLow, FilterHigh, - Current, Remove, &Freed, + Current, Remove, &Freed, TRUE, DesktopWindow, &HitTest, &ScreenPoint, FALSE); if (Accept) @@ -546,9 +562,7 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, IntReleaseWindowObject(DesktopWindow); return(TRUE); } - - if(Freed) - RemoveEntryList(&Current->ListEntry); + } } IntUnLockHardwareMessageQueue(MessageQueue); @@ -598,7 +612,7 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, const ULONG ActiveStamp = HardwareMessageQueueStamp; /* Translate the message. */ Accept = MsqTranslateMouseMessage(hWnd, FilterLow, FilterHigh, - Current, Remove, &Freed, + Current, Remove, &Freed, FALSE, DesktopWindow, &HitTest, &ScreenPoint, TRUE); if (Accept) From 45931d5f5d31eff354783d9e5ab20a5d7c8a3a2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Tue, 23 Mar 2004 22:50:14 +0000 Subject: [PATCH 0623/1463] Prevent deletion of system-owned objects like brushes returned by GetSysColorBrush() svn path=/trunk/; revision=8855 --- reactos/lib/gdi32/objects/dc.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/reactos/lib/gdi32/objects/dc.c b/reactos/lib/gdi32/objects/dc.c index 09c0f879f57..b6c901fe9e0 100644 --- a/reactos/lib/gdi32/objects/dc.c +++ b/reactos/lib/gdi32/objects/dc.c @@ -8,6 +8,8 @@ #include <win32k/kapi.h> #include <rosrtl/logfont.h> +#define NDEBUG +#include <debug.h> /* * @implemented @@ -555,11 +557,15 @@ SetWindowOrgEx( */ BOOL STDCALL -DeleteObject( - HGDIOBJ a0 - ) +DeleteObject(HGDIOBJ Obj) { - return NtGdiDeleteObject(a0); + if (0 != ((DWORD) Obj & 0x00800000)) + { + DPRINT1("Trying to delete system object 0x%x\n", Obj); + return FALSE; + } + + return NtGdiDeleteObject(Obj); } From 7e4896289fb7cfcf2e4325008b74ed4a2784193d Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Wed, 24 Mar 2004 00:05:27 +0000 Subject: [PATCH 0624/1463] checked in expat source code svn path=/trunk/; revision=8856 --- reactos/Makefile | 4 +- reactos/lib/expat/COPYING | 22 + reactos/lib/expat/Changes | 124 + reactos/lib/expat/MANIFEST | 101 + reactos/lib/expat/Makefile | 48 + reactos/lib/expat/Makefile.in | 173 + reactos/lib/expat/README | 119 + reactos/lib/expat/bcb5/README.txt | 87 + reactos/lib/expat/bcb5/all_projects.bpg | 49 + reactos/lib/expat/bcb5/elements.bpf | 4 + reactos/lib/expat/bcb5/elements.bpr | 149 + reactos/lib/expat/bcb5/elements.mak | 186 + reactos/lib/expat/bcb5/expat.bpf | 6 + reactos/lib/expat/bcb5/expat.bpr | 140 + reactos/lib/expat/bcb5/expat.mak | 187 + reactos/lib/expat/bcb5/expat_static.bpf | 5 + reactos/lib/expat/bcb5/expat_static.bpr | 143 + reactos/lib/expat/bcb5/expat_static.mak | 189 + reactos/lib/expat/bcb5/expatw.bpf | 6 + reactos/lib/expat/bcb5/expatw.bpr | 146 + reactos/lib/expat/bcb5/expatw.mak | 187 + reactos/lib/expat/bcb5/expatw_static.bpf | 5 + reactos/lib/expat/bcb5/expatw_static.bpr | 152 + reactos/lib/expat/bcb5/expatw_static.mak | 190 + reactos/lib/expat/bcb5/libexpat_mtd.def | 141 + reactos/lib/expat/bcb5/libexpatw_mtd.def | 140 + reactos/lib/expat/bcb5/makefile.mak | 37 + reactos/lib/expat/bcb5/outline.bpf | 4 + reactos/lib/expat/bcb5/outline.bpr | 132 + reactos/lib/expat/bcb5/outline.mak | 186 + reactos/lib/expat/bcb5/setup.bat | 9 + reactos/lib/expat/bcb5/xmlwf.bpf | 7 + reactos/lib/expat/bcb5/xmlwf.bpr | 136 + reactos/lib/expat/bcb5/xmlwf.mak | 187 + reactos/lib/expat/buildconf.sh | 102 + reactos/lib/expat/configure.in | 124 + reactos/lib/expat/conftools/.cvsignore | 3 + reactos/lib/expat/conftools/PrintPath | 116 + .../expat/conftools/ac_c_bigendian_cross.m4 | 81 + reactos/lib/expat/conftools/config.guess | 1344 ++++ reactos/lib/expat/conftools/config.sub | 1507 ++++ reactos/lib/expat/conftools/expat.m4 | 43 + reactos/lib/expat/conftools/get-version.sh | 46 + reactos/lib/expat/conftools/install-sh | 251 + reactos/lib/expat/conftools/mkinstalldirs | 40 + reactos/lib/expat/doc/expat.png | Bin 0 -> 1717 bytes reactos/lib/expat/doc/reference.html | 2035 ++++++ reactos/lib/expat/doc/style.css | 90 + reactos/lib/expat/doc/valid-xhtml10.png | Bin 0 -> 2414 bytes reactos/lib/expat/doc/xmlwf.1 | 251 + reactos/lib/expat/doc/xmlwf.sgml | 473 ++ reactos/lib/expat/examples/.cvsignore | 8 + reactos/lib/expat/examples/elements.c | 50 + reactos/lib/expat/examples/elements.dsp | 103 + reactos/lib/expat/examples/outline.c | 90 + reactos/lib/expat/examples/outline.dsp | 103 + reactos/lib/expat/expat.dsw | 110 + reactos/lib/expat/expat.spec | 86 + reactos/lib/expat/gennmtab/.cvsignore | 3 + reactos/lib/expat/gennmtab/gennmtab.c | 429 ++ reactos/lib/expat/gennmtab/gennmtab.dsp | 101 + reactos/lib/expat/lib/Makefile.MPW | 206 + reactos/lib/expat/lib/ascii.h | 85 + reactos/lib/expat/lib/asciitab.h | 36 + reactos/lib/expat/lib/expat.dsp | 168 + reactos/lib/expat/lib/expat.h | 1080 +++ reactos/lib/expat/lib/expat_config.h | 30 + reactos/lib/expat/lib/expat_static.dsp | 146 + reactos/lib/expat/lib/expatw.dsp | 169 + reactos/lib/expat/lib/expatw_static.dsp | 146 + reactos/lib/expat/lib/iasciitab.h | 37 + reactos/lib/expat/lib/internal.h | 73 + reactos/lib/expat/lib/latin1tab.h | 36 + reactos/lib/expat/lib/libexpat.def | 73 + reactos/lib/expat/lib/libexpatw.def | 73 + reactos/lib/expat/lib/macconfig.h | 53 + reactos/lib/expat/lib/nametab.h | 150 + reactos/lib/expat/lib/utf8tab.h | 37 + reactos/lib/expat/lib/winconfig.h | 30 + reactos/lib/expat/lib/xmlparse.c | 6165 +++++++++++++++++ reactos/lib/expat/lib/xmlrole.c | 1325 ++++ reactos/lib/expat/lib/xmlrole.h | 114 + reactos/lib/expat/lib/xmltok.c | 1634 +++++ reactos/lib/expat/lib/xmltok.h | 315 + reactos/lib/expat/lib/xmltok_impl.c | 1779 +++++ reactos/lib/expat/lib/xmltok_impl.h | 46 + reactos/lib/expat/lib/xmltok_ns.c | 106 + reactos/lib/expat/make-release.sh | 76 + reactos/lib/expat/tests/.cvsignore | 5 + reactos/lib/expat/tests/README.txt | 14 + reactos/lib/expat/tests/benchmark/README.txt | 16 + reactos/lib/expat/tests/benchmark/benchmark.c | 101 + .../lib/expat/tests/benchmark/benchmark.dsp | 88 + .../lib/expat/tests/benchmark/benchmark.dsw | 44 + reactos/lib/expat/tests/chardata.c | 132 + reactos/lib/expat/tests/chardata.h | 32 + reactos/lib/expat/tests/runtests.c | 1434 ++++ reactos/lib/expat/tests/xmltest.sh | 137 + reactos/lib/expat/vms/README.vms | 23 + reactos/lib/expat/vms/descrip.mms | 70 + reactos/lib/expat/vms/expat_config.h | 52 + reactos/lib/expat/win32/.cvsignore | 10 + reactos/lib/expat/win32/MANIFEST.txt | 29 + reactos/lib/expat/win32/README.txt | 59 + reactos/lib/expat/win32/expat.iss | 62 + reactos/lib/expat/xmlwf/.cvsignore | 6 + reactos/lib/expat/xmlwf/codepage.c | 68 + reactos/lib/expat/xmlwf/codepage.h | 6 + reactos/lib/expat/xmlwf/ct.c | 147 + reactos/lib/expat/xmlwf/filemap.h | 17 + reactos/lib/expat/xmlwf/readfilemap.c | 78 + reactos/lib/expat/xmlwf/unixfilemap.c | 58 + reactos/lib/expat/xmlwf/win32filemap.c | 96 + reactos/lib/expat/xmlwf/xmlfile.c | 233 + reactos/lib/expat/xmlwf/xmlfile.h | 10 + reactos/lib/expat/xmlwf/xmlmime.c | 163 + reactos/lib/expat/xmlwf/xmlmime.h | 19 + reactos/lib/expat/xmlwf/xmltchar.h | 36 + reactos/lib/expat/xmlwf/xmlurl.h | 13 + reactos/lib/expat/xmlwf/xmlwf.c | 842 +++ reactos/lib/expat/xmlwf/xmlwf.dsp | 139 + reactos/lib/expat/xmlwf/xmlwin32url.cxx | 395 ++ 122 files changed, 29810 insertions(+), 2 deletions(-) create mode 100644 reactos/lib/expat/COPYING create mode 100644 reactos/lib/expat/Changes create mode 100644 reactos/lib/expat/MANIFEST create mode 100644 reactos/lib/expat/Makefile create mode 100644 reactos/lib/expat/Makefile.in create mode 100644 reactos/lib/expat/README create mode 100644 reactos/lib/expat/bcb5/README.txt create mode 100644 reactos/lib/expat/bcb5/all_projects.bpg create mode 100644 reactos/lib/expat/bcb5/elements.bpf create mode 100644 reactos/lib/expat/bcb5/elements.bpr create mode 100644 reactos/lib/expat/bcb5/elements.mak create mode 100644 reactos/lib/expat/bcb5/expat.bpf create mode 100644 reactos/lib/expat/bcb5/expat.bpr create mode 100644 reactos/lib/expat/bcb5/expat.mak create mode 100644 reactos/lib/expat/bcb5/expat_static.bpf create mode 100644 reactos/lib/expat/bcb5/expat_static.bpr create mode 100644 reactos/lib/expat/bcb5/expat_static.mak create mode 100644 reactos/lib/expat/bcb5/expatw.bpf create mode 100644 reactos/lib/expat/bcb5/expatw.bpr create mode 100644 reactos/lib/expat/bcb5/expatw.mak create mode 100644 reactos/lib/expat/bcb5/expatw_static.bpf create mode 100644 reactos/lib/expat/bcb5/expatw_static.bpr create mode 100644 reactos/lib/expat/bcb5/expatw_static.mak create mode 100644 reactos/lib/expat/bcb5/libexpat_mtd.def create mode 100644 reactos/lib/expat/bcb5/libexpatw_mtd.def create mode 100644 reactos/lib/expat/bcb5/makefile.mak create mode 100644 reactos/lib/expat/bcb5/outline.bpf create mode 100644 reactos/lib/expat/bcb5/outline.bpr create mode 100644 reactos/lib/expat/bcb5/outline.mak create mode 100755 reactos/lib/expat/bcb5/setup.bat create mode 100644 reactos/lib/expat/bcb5/xmlwf.bpf create mode 100644 reactos/lib/expat/bcb5/xmlwf.bpr create mode 100644 reactos/lib/expat/bcb5/xmlwf.mak create mode 100644 reactos/lib/expat/buildconf.sh create mode 100644 reactos/lib/expat/configure.in create mode 100644 reactos/lib/expat/conftools/.cvsignore create mode 100644 reactos/lib/expat/conftools/PrintPath create mode 100644 reactos/lib/expat/conftools/ac_c_bigendian_cross.m4 create mode 100644 reactos/lib/expat/conftools/config.guess create mode 100644 reactos/lib/expat/conftools/config.sub create mode 100644 reactos/lib/expat/conftools/expat.m4 create mode 100644 reactos/lib/expat/conftools/get-version.sh create mode 100644 reactos/lib/expat/conftools/install-sh create mode 100644 reactos/lib/expat/conftools/mkinstalldirs create mode 100644 reactos/lib/expat/doc/expat.png create mode 100644 reactos/lib/expat/doc/reference.html create mode 100644 reactos/lib/expat/doc/style.css create mode 100644 reactos/lib/expat/doc/valid-xhtml10.png create mode 100644 reactos/lib/expat/doc/xmlwf.1 create mode 100644 reactos/lib/expat/doc/xmlwf.sgml create mode 100644 reactos/lib/expat/examples/.cvsignore create mode 100644 reactos/lib/expat/examples/elements.c create mode 100644 reactos/lib/expat/examples/elements.dsp create mode 100644 reactos/lib/expat/examples/outline.c create mode 100644 reactos/lib/expat/examples/outline.dsp create mode 100644 reactos/lib/expat/expat.dsw create mode 100644 reactos/lib/expat/expat.spec create mode 100644 reactos/lib/expat/gennmtab/.cvsignore create mode 100644 reactos/lib/expat/gennmtab/gennmtab.c create mode 100644 reactos/lib/expat/gennmtab/gennmtab.dsp create mode 100644 reactos/lib/expat/lib/Makefile.MPW create mode 100644 reactos/lib/expat/lib/ascii.h create mode 100644 reactos/lib/expat/lib/asciitab.h create mode 100644 reactos/lib/expat/lib/expat.dsp create mode 100644 reactos/lib/expat/lib/expat.h create mode 100644 reactos/lib/expat/lib/expat_config.h create mode 100644 reactos/lib/expat/lib/expat_static.dsp create mode 100644 reactos/lib/expat/lib/expatw.dsp create mode 100644 reactos/lib/expat/lib/expatw_static.dsp create mode 100644 reactos/lib/expat/lib/iasciitab.h create mode 100644 reactos/lib/expat/lib/internal.h create mode 100644 reactos/lib/expat/lib/latin1tab.h create mode 100644 reactos/lib/expat/lib/libexpat.def create mode 100644 reactos/lib/expat/lib/libexpatw.def create mode 100644 reactos/lib/expat/lib/macconfig.h create mode 100644 reactos/lib/expat/lib/nametab.h create mode 100644 reactos/lib/expat/lib/utf8tab.h create mode 100644 reactos/lib/expat/lib/winconfig.h create mode 100644 reactos/lib/expat/lib/xmlparse.c create mode 100644 reactos/lib/expat/lib/xmlrole.c create mode 100644 reactos/lib/expat/lib/xmlrole.h create mode 100644 reactos/lib/expat/lib/xmltok.c create mode 100644 reactos/lib/expat/lib/xmltok.h create mode 100644 reactos/lib/expat/lib/xmltok_impl.c create mode 100644 reactos/lib/expat/lib/xmltok_impl.h create mode 100644 reactos/lib/expat/lib/xmltok_ns.c create mode 100644 reactos/lib/expat/make-release.sh create mode 100644 reactos/lib/expat/tests/.cvsignore create mode 100644 reactos/lib/expat/tests/README.txt create mode 100644 reactos/lib/expat/tests/benchmark/README.txt create mode 100644 reactos/lib/expat/tests/benchmark/benchmark.c create mode 100644 reactos/lib/expat/tests/benchmark/benchmark.dsp create mode 100644 reactos/lib/expat/tests/benchmark/benchmark.dsw create mode 100644 reactos/lib/expat/tests/chardata.c create mode 100644 reactos/lib/expat/tests/chardata.h create mode 100644 reactos/lib/expat/tests/runtests.c create mode 100644 reactos/lib/expat/tests/xmltest.sh create mode 100644 reactos/lib/expat/vms/README.vms create mode 100644 reactos/lib/expat/vms/descrip.mms create mode 100644 reactos/lib/expat/vms/expat_config.h create mode 100644 reactos/lib/expat/win32/.cvsignore create mode 100644 reactos/lib/expat/win32/MANIFEST.txt create mode 100644 reactos/lib/expat/win32/README.txt create mode 100644 reactos/lib/expat/win32/expat.iss create mode 100644 reactos/lib/expat/xmlwf/.cvsignore create mode 100644 reactos/lib/expat/xmlwf/codepage.c create mode 100644 reactos/lib/expat/xmlwf/codepage.h create mode 100644 reactos/lib/expat/xmlwf/ct.c create mode 100644 reactos/lib/expat/xmlwf/filemap.h create mode 100644 reactos/lib/expat/xmlwf/readfilemap.c create mode 100644 reactos/lib/expat/xmlwf/unixfilemap.c create mode 100644 reactos/lib/expat/xmlwf/win32filemap.c create mode 100644 reactos/lib/expat/xmlwf/xmlfile.c create mode 100644 reactos/lib/expat/xmlwf/xmlfile.h create mode 100644 reactos/lib/expat/xmlwf/xmlmime.c create mode 100644 reactos/lib/expat/xmlwf/xmlmime.h create mode 100644 reactos/lib/expat/xmlwf/xmltchar.h create mode 100644 reactos/lib/expat/xmlwf/xmlurl.h create mode 100644 reactos/lib/expat/xmlwf/xmlwf.c create mode 100644 reactos/lib/expat/xmlwf/xmlwf.dsp create mode 100644 reactos/lib/expat/xmlwf/xmlwin32url.cxx diff --git a/reactos/Makefile b/reactos/Makefile index 446fd8d0ead..a02dd6f19c1 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.211 2004/02/22 17:30:32 chorns Exp $ +# $Id: Makefile,v 1.212 2004/03/24 00:05:27 mf 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 fmifs freetype gdi32 \ +DLLS = advapi32 cabinet cards comctl32 crtdll comdlg32 d3d8thk expat fmifs freetype gdi32 \ imm32 iphlpapi kernel32 lzexpand mpr msafd msgina msimg32 msvcrt msvcrt20 mswsock \ ntdll ole32 oleaut32 oledlg packet psapi richedit rpcrt4 samlib secur32 shell32 shlwapi \ snmpapi syssetup twain unicode user32 userenv version wininet winmm winspool \ diff --git a/reactos/lib/expat/COPYING b/reactos/lib/expat/COPYING new file mode 100644 index 00000000000..5c5d524a1f8 --- /dev/null +++ b/reactos/lib/expat/COPYING @@ -0,0 +1,22 @@ +Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + and Clark Cooper +Copyright (c) 2001, 2002, 2003 Expat maintainers. + +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. diff --git a/reactos/lib/expat/Changes b/reactos/lib/expat/Changes new file mode 100644 index 00000000000..b724f96a5f9 --- /dev/null +++ b/reactos/lib/expat/Changes @@ -0,0 +1,124 @@ +Release 1.95.7 Mon Oct 20 2003 + - Fixed enum XML_Status issue (reported on SourceForge many + times), so compilers that are properly picky will be happy. + - Introduced an XMLCALL macro to control the calling + convention used by the Expat API; this macro should be used + to annotate prototypes and definitions of callback + implementations in code compiled with a calling convention + other than the default convention for the host platform. + - Improved ability to build without the configure-generated + expat_config.h header. This is useful for applications + which embed Expat rather than linking in the library. + - Fixed a variety of bugs: see SF issues 458907, 609603, + 676844, 679754, 692878, 692964, 695401, 699323, 699487, + 820946. + - Improved hash table lookups. + - Added more regression tests and improved documentation. + +Release 1.95.6 Tue Jan 28 2003 + - Added XML_FreeContentModel(). + - Added XML_MemMalloc(), XML_MemRealloc(), XML_MemFree(). + - Fixed a variety of bugs: see SF issues 615606, 616863, + 618199, 653180, 673791. + - Enhanced the regression test suite. + - Man page improvements: includes SF issue 632146. + +Release 1.95.5 Fri Sep 6 2002 + - Added XML_UseForeignDTD() for improved SAX2 support. + - Added XML_GetFeatureList(). + - Defined XML_Bool type and the values XML_TRUE and XML_FALSE. + - Use an incomplete struct instead of a void* for the parser + (may not retain). + - Fixed UTF-8 decoding bug that caused legal UTF-8 to be rejected. + - Finally fixed bug where default handler would report DTD + events that were already handled by another handler. + Initial patch contributed by Darryl Miles. + - Removed unnecessary DllMain() function that caused static + linking into a DLL to be difficult. + - Added VC++ projects for building static libraries. + - Reduced line-length for all source code and headers to be + no longer than 80 characters, to help with AS/400 support. + - Reduced memory copying during parsing (SF patch #600964). + - Fixed a variety of bugs: see SF issues 580793, 434664, + 483514, 580503, 581069, 584041, 584183, 584832, 585537, + 596555, 596678, 598352, 598944, 599715, 600479, 600971. + +Release 1.95.4 Fri Jul 12 2002 + - Added support for VMS, contributed by Craig Berry. See + vms/README.vms for more information. + - Added Mac OS (classic) support, with a makefile for MPW, + contributed by Thomas Wegner and Daryle Walker. + - Added Borland C++ Builder 5 / BCC 5.5 support, contributed + by Patrick McConnell (SF patch #538032). + - Fixed a variety of bugs: see SF issues 441449, 563184, + 564342, 566334, 566901, 569461, 570263, 575168, 579196. + - Made skippedEntityHandler conform to SAX2 (see source comment) + - Re-implemented WFC: Entity Declared from XML 1.0 spec and + added a new error "entity declared in parameter entity": + see SF bug report 569461 and SF patch 578161 + - Re-implemented section 5.1 from XML 1.0 spec: + see SF bug report 570263 and SF patch 578161 + +Release 1.95.3 Mon Jun 3 2002 + - Added a project to the MSVC workspace to create a wchar_t + version of the library; the DLLs are named libexpatw.dll. + - Changed the name of the Windows DLLs from expat.dll to + libexpat.dll; this fixes SF bug #432456. + - Added the XML_ParserReset() API function. + - Fixed XML_SetReturnNSTriplet() to work for element names. + - Made the XML_UNICODE builds usable (thanks, Karl!). + - Allow xmlwf to read from standard input. + - Install a man page for xmlwf on Unix systems. + - Fixed many bugs; see SF bug reports 231864, 461380, 464837, + 466885, 469226, 477667, 484419, 487840, 494749, 496505, + 547350. Other bugs which we can't test as easily may also + have been fixed, especially in the area of build support. + +Release 1.95.2 Fri Jul 27 2001 + - More changes to make MSVC happy with the build; add a single + workspace to support both the library and xmlwf application. + - Added a Windows installer for Windows users; includes + xmlwf.exe. + - Added compile-time constants that can be used to determine the + Expat version + - Removed a lot of GNU-specific dependencies to aide portability + among the various Unix flavors. + - Fix the UTF-8 BOM bug. + - Cleaned up warning messages for several compilers. + - Added the -Wall, -Wstrict-prototypes options for GCC. + +Release 1.95.1 Sun Oct 22 15:11:36 EDT 2000 + - Changes to get expat to build under Microsoft compiler + - Removed all aborts and instead return an UNEXPECTED_STATE error. + - Fixed a bug where a stray '%' in an entity value would cause an + abort. + - Defined XML_SetEndNamespaceDeclHandler. Thanks to Darryl Miles for + finding this oversight. + - Changed default patterns in lib/Makefile.in to fit non-GNU makes + Thanks to robin@unrated.net for reporting and providing an + account to test on. + - The reference had the wrong label for XML_SetStartNamespaceDecl. + Reported by an anonymous user. + +Release 1.95.0 Fri Sep 29 2000 + - XML_ParserCreate_MM + Allows you to set a memory management suite to replace the + standard malloc,realloc, and free. + - XML_SetReturnNSTriplet + If you turn this feature on when namespace processing is in + effect, then qualified, prefixed element and attribute names + are returned as "uri|name|prefix" where '|' is whatever + separator character is used in namespace processing. + - Merged in features from perl-expat + o XML_SetElementDeclHandler + o XML_SetAttlistDeclHandler + o XML_SetXmlDeclHandler + o XML_SetEntityDeclHandler + o StartDoctypeDeclHandler takes 3 additional parameters: + sysid, pubid, has_internal_subset + o Many paired handler setters (like XML_SetElementHandler) + now have corresponding individual handler setters + o XML_GetInputContext for getting the input context of + the current parse position. + - Added reference material + - Packaged into a distribution that builds a sharable library diff --git a/reactos/lib/expat/MANIFEST b/reactos/lib/expat/MANIFEST new file mode 100644 index 00000000000..28541205fe9 --- /dev/null +++ b/reactos/lib/expat/MANIFEST @@ -0,0 +1,101 @@ +Changes +COPYING +MANIFEST +Makefile.in +README +configure +configure.in +expat_config.h.in +expat.dsw +bcb5/README.txt +bcb5/elements.bpf +bcb5/elements.bpr +bcb5/elements.mak +bcb5/expat.bpf +bcb5/expat.bpr +bcb5/expat.mak +bcb5/expat_static.bpf +bcb5/expat_static.bpr +bcb5/expat_static.mak +bcb5/expatw.bpf +bcb5/expatw.bpr +bcb5/expatw.mak +bcb5/expatw_static.bpf +bcb5/expatw_static.bpr +bcb5/expatw_static.mak +bcb5/libexpat_mtd.def +bcb5/libexpatw_mtd.def +bcb5/makefile.mak +bcb5/outline.bpf +bcb5/outline.bpr +bcb5/outline.mak +bcb5/setup.bat +bcb5/xmlwf.bpf +bcb5/xmlwf.bpr +bcb5/xmlwf.mak +conftools/PrintPath +conftools/ac_c_bigendian_cross.m4 +conftools/config.guess +conftools/config.sub +conftools/expat.m4 +conftools/install-sh +conftools/libtool.m4 +conftools/ltmain.sh +conftools/mkinstalldirs +doc/reference.html +doc/style.css +doc/valid-xhtml10.png +doc/xmlwf.1 +doc/xmlwf.sgml +examples/elements.c +examples/elements.dsp +examples/outline.c +examples/outline.dsp +lib/ascii.h +lib/asciitab.h +lib/expat.dsp +lib/expat.h +lib/expatw.dsp +lib/expat_static.dsp +lib/expatw_static.dsp +lib/iasciitab.h +lib/internal.h +lib/latin1tab.h +lib/libexpatw.def +lib/nametab.h +lib/utf8tab.h +lib/xmlparse.c +lib/xmlrole.c +lib/xmlrole.h +lib/xmltok.c +lib/xmltok.h +lib/xmltok_impl.c +lib/xmltok_impl.h +lib/xmltok_ns.c +lib/winconfig.h +tests/README.txt +tests/chardata.c +tests/chardata.h +tests/runtests.c +tests/xmltest.sh +vms/descrip.mms +vms/expat_config.h +vms/README.vms +win32/expat.iss +win32/MANIFEST.txt +xmlwf/codepage.c +xmlwf/codepage.h +xmlwf/ct.c +xmlwf/filemap.h +xmlwf/readfilemap.c +xmlwf/unixfilemap.c +xmlwf/win32filemap.c +xmlwf/xmlfile.c +xmlwf/xmlfile.h +xmlwf/xmlmime.c +xmlwf/xmlmime.h +xmlwf/xmltchar.h +xmlwf/xmlurl.h +xmlwf/xmlwf.c +xmlwf/xmlwf.dsp +xmlwf/xmlwin32url.cxx diff --git a/reactos/lib/expat/Makefile b/reactos/lib/expat/Makefile new file mode 100644 index 00000000000..9db75454e81 --- /dev/null +++ b/reactos/lib/expat/Makefile @@ -0,0 +1,48 @@ +# +# MinGW Makefile for expat +# +# Martin Fuchs, 24.03.2003 +# + +PATH_TO_TOP = ../.. +TOOLS_PATH = $(PATH_TO_TOP)/tools + +CC = gcc +LINK = gcc + +CFLAGS = -O2 -Wall -Wmissing-prototypes -Wstrict-prototypes -fexceptions -DWIN32 -DHAVE_EXPAT_CONFIG_H +LFLAGS = -shared + +ifdef DEBUG +CFLAGS += -g +LFLAGS += -g +else +CFLAGS += -Os +LFLAGS += -s +endif + +VPATH = lib + +DLL_SUFIX = .dll + +LIBRARY = libexpat$(DLL_SUFIX) + +LIB_OBJS = \ + xmlparse.o \ + xmlrole.o \ + xmltok.o + +all: $(LIBRARY) + +$(LIBRARY): $(LIB_OBJS) libexpat.def + $(LINK) $(LFLAGS) -o $@ $^ + +clean: + $(TOOLS_PATH)/rdel $(LIBRARY) $(LIB_OBJS) + +implib: + +install: + -$(TOOLS_PATH)/rcopy $(LIBRARY) $(INSTALL_DIR)/system32/$(LIBRARY) + +bootcd: diff --git a/reactos/lib/expat/Makefile.in b/reactos/lib/expat/Makefile.in new file mode 100644 index 00000000000..f85920c188f --- /dev/null +++ b/reactos/lib/expat/Makefile.in @@ -0,0 +1,173 @@ +################################################################ +# Process this file with top-level configure script to produce Makefile +# +# Copyright 2000 Clark Cooper +# +# This file is part of EXPAT. +# +# EXPAT is free software; you can redistribute it and/or modify it +# under the terms of the License (based on the MIT/X license) contained +# in the file COPYING that comes with this distribution. +# +# EXPAT 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 EXPAT. +# + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +libdir = @libdir@ +includedir = @includedir@ +man1dir = @mandir@/man1 + +top_builddir = . + + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +mkinstalldirs = $(SHELL) $(top_srcdir)/conftools/mkinstalldirs + +MANFILE = $(srcdir)/doc/xmlwf.1 +APIHEADER = $(srcdir)/lib/expat.h +LIBRARY = libexpat.la + + +default: buildlib xmlwf/xmlwf + +buildlib: $(LIBRARY) + +all: $(LIBRARY) xmlwf/xmlwf examples/elements examples/outline + +clean: + cd lib && rm -f $(LIBRARY) *.o *.lo && rm -rf .libs _libs + cd xmlwf && rm -f xmlwf *.o *.lo && rm -rf .libs _libs + cd examples && rm -f elements outline *.o *.lo && rm -rf .libs _libs + cd tests && rm -rf .libs runtests runtests.o chardata.o + rm -rf .libs libexpat.la + rm -f examples/core tests/core xmlwf/core + +clobber: clean + +distclean: clean + rm -f expat_config.h config.status config.log config.cache libtool + rm -f Makefile + +extraclean: distclean + rm -f expat_config.h.in configure + rm -f conftools/ltconfig conftools/ltmain.sh conftools/libtool.m4 + +check: tests/runtests + tests/runtests + +install: xmlwf/xmlwf installlib + $(mkinstalldirs) $(bindir) $(man1dir) + $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) xmlwf/xmlwf $(bindir)/xmlwf + $(INSTALL_DATA) $(MANFILE) $(man1dir) + +installlib: $(LIBRARY) $(APIHEADER) + $(mkinstalldirs) $(libdir) $(includedir) + $(LIBTOOL) --mode=install $(INSTALL) $(LIBRARY) $(libdir)/$(LIBRARY) + $(INSTALL_DATA) $(APIHEADER) $(includedir) + +uninstall: uninstalllib + $(LIBTOOL) --mode=uninstall rm -f $(bindir)/xmlwf + rm -f $(man1dir)/xmlwf.1 + +uninstalllib: + $(LIBTOOL) --mode=uninstall rm -f $(libdir)/$(LIBRARY) + rm -f $(includedir)/$(APIHEADER) + +# for VPATH builds (invoked by configure) +mkdir-init: + @for d in lib xmlwf examples tests ; do \ + (mkdir $$d 2> /dev/null || test 1) ; \ + done + +CC = @CC@ +LIBTOOL = @LIBTOOL@ + +INCLUDES = -I$(srcdir)/lib -I. +LDFLAGS = @LDFLAGS@ +CPPFLAGS = @CPPFLAGS@ +CFLAGS = @CFLAGS@ -DHAVE_EXPAT_CONFIG_H +VSNFLAG = -version-info @LIBCURRENT@:@LIBREVISION@:@LIBAGE@ + +### autoconf this? +LTFLAGS = --silent + +COMPILE = $(CC) $(CFLAGS) $(DEFS) $(CPPFLAGS) $(INCLUDES) +LTCOMPILE = $(LIBTOOL) $(LTFLAGS) --mode=compile $(COMPILE) +LINK_LIB = $(LIBTOOL) $(LTFLAGS) --mode=link $(COMPILE) -no-undefined $(VSNFLAG) -rpath $(libdir) $(LDFLAGS) -o $@ +LINK_EXE = $(LIBTOOL) $(LTFLAGS) --mode=link $(COMPILE) $(LDFLAGS) -o $@ + +LIB_OBJS = lib/xmlparse.lo lib/xmltok.lo lib/xmlrole.lo +$(LIBRARY): $(LIB_OBJS) + $(LINK_LIB) $(LIB_OBJS) + +lib/xmlparse.lo: lib/xmlparse.c lib/expat.h lib/xmlrole.h lib/xmltok.h \ + $(top_builddir)/expat_config.h lib/internal.h + +lib/xmlrole.lo: lib/xmlrole.c lib/ascii.h lib/xmlrole.h \ + $(top_builddir)/expat_config.h lib/internal.h + +lib/xmltok.lo: lib/xmltok.c lib/xmltok_impl.c lib/xmltok_ns.c \ + lib/ascii.h lib/asciitab.h lib/iasciitab.h lib/latin1tab.h \ + lib/nametab.h lib/utf8tab.h lib/xmltok.h lib/xmltok_impl.h \ + $(top_builddir)/expat_config.h + + +XMLWF_OBJS = xmlwf/xmlwf.o xmlwf/xmlfile.o xmlwf/codepage.o xmlwf/@FILEMAP@.o +xmlwf/xmlwf.o: xmlwf/xmlwf.c +xmlwf/xmlfile.o: xmlwf/xmlfile.c +xmlwf/codepage.o: xmlwf/codepage.c +xmlwf/@FILEMAP@.o: xmlwf/@FILEMAP@.c +xmlwf/xmlwf: $(XMLWF_OBJS) $(LIBRARY) + $(LINK_EXE) $(XMLWF_OBJS) $(LIBRARY) + +examples/elements.o: examples/elements.c +examples/elements: examples/elements.o $(LIBRARY) + $(LINK_EXE) $< $(LIBRARY) + +examples/outline.o: examples/outline.c +examples/outline: examples/outline.o $(LIBRARY) + $(LINK_EXE) $< $(LIBRARY) + +tests/chardata.o: tests/chardata.c tests/chardata.h +tests/runtests.o: tests/runtests.c tests/chardata.h +tests/runtests: tests/runtests.o tests/chardata.o $(LIBRARY) + $(LINK_EXE) $^ -lcheck + +tests/xmlts.zip: + wget --output-document=tests/xmlts.zip \ + http://www.w3.org/XML/Test/xmlts20020606.zip + +tests/XML-Test-Suite: tests/xmlts.zip + cd tests && unzip -q xmlts.zip + +run-xmltest: xmlwf/xmlwf tests/XML-Test-Suite + tests/xmltest.sh + +.SUFFIXES: .c .lo .o + +.c.o: + $(COMPILE) -o $@ -c $< +.c.lo: + $(LTCOMPILE) -o $@ -c $< + +.PHONY: buildlib all \ + clean distclean extraclean maintainer-clean \ + dist distdir \ + install uninstall diff --git a/reactos/lib/expat/README b/reactos/lib/expat/README new file mode 100644 index 00000000000..d391c7e1935 --- /dev/null +++ b/reactos/lib/expat/README @@ -0,0 +1,119 @@ + + Expat, Release 1.95.7 + +This is Expat, a C library for parsing XML, written by James Clark. +Expat is a stream-oriented XML parser. This means that you register +handlers with the parser before starting the parse. These handlers +are called when the parser discovers the associated structures in the +document being parsed. A start tag is an example of the kind of +structures for which you may register handlers. + +Windows users should use the expat_win32bin package, which includes +both precompiled libraries and executalbes, and source code for +developers. + +Expat is free software. You may copy, distribute, and modify it under +the terms of the License contained in the file COPYING distributed +with this package. This license is the same as the MIT/X Consortium +license. + +Versions of Expat that have an odd minor version (the middle number in +the release above), are development releases and should be considered +as beta software. Releases with even minor version numbers are +intended to be production grade software. + +If you are building Expat from a check-out from the CVS repository, +you need to run a script that generates the configure script using the +GNU autoconf and libtool tools. To do this, you need to have +autoconf 2.52 or newer and libtool 1.4 or newer. Run the script like +this: + + ./buildconf.sh + +Once this has been done, follow the same instructions as for building +from a source distribution. + +To build Expat from a source distribution, you first run the +configuration shell script in the top level distribution directory: + + ./configure + +There are many options which you may provide to configure (which you +can discover by running configure with the --help option). But the +one of most interest is the one that sets the installation directory. +By default, the configure script will set things up to install +libexpat into /usr/local/lib, expat.h into /usr/local/include, and +xmlwf into /usr/local/bin. If, for example, you'd prefer to install +into /home/me/mystuff/lib, /home/me/mystuff/include, and +/home/me/mystuff/bin, you can tell configure about that with: + + ./configure --prefix=/home/me/mystuff + +After running the configure script, the "make" command will build +things and "make install" will install things into their proper +location. Note that you need to have write permission into the +directories into which things will be installed. + +If you are interested in building Expat to provide document +information in UTF-16 rather than the default UTF-8, following these +instructions: + + 1. For UTF-16 output as unsigned short (and version/error + strings as char), run: + + ./configure CPPFLAGS=-DXML_UNICODE + + For UTF-16 output as wchar_t (incl. version/error strings), + run: + + ./configure CFLAGS="-g -O2 -fshort-wchar" \ + CPPFLAGS=-DXML_UNICODE_WCHAR_T + + 2. Edit the MakeFile, changing: + + LIBRARY = libexpat.la + + to: + + LIBRARY = libexpatw.la + + (Note the additional "w" in the library name.) + + 3. Run "make buildlib" (which builds the library only). + + 4. Run "make installlib" (which installs the library only). + +Note for Solaris users: The "ar" command is usually located in +"/usr/ccs/bin", which is not in the default PATH. You will need to +add this to your path for the "make" command, and probably also switch +to GNU make (the "make" found in /usr/ccs/bin does not seem to work +properly -- appearantly it does not understand .PHONY directives). If +you're using ksh or bash, use this command to build: + + PATH=/usr/ccs/bin:$PATH make + +The unit and regression tests for Expat require the "check" library on +Unix; more information is available at http://check.sourceforge.net/, +and downloadable packages are available from the library's project +page on SourceForge: http://sourceforge.net/projects/check/. You do +not need to install the check library to build and use Expat, only to +build and run Expat's test suite. + +When using Expat with a project using autoconf for configuration, you +can use the probing macro in conftools/expat.m4 to determine how to +include Expat. See the comments at the top of that file for more +information. + +A reference manual is available in the file doc/reference.html in this +distribution. + +The homepage for this project is http://www.libexpat.org/. There +are links there to connect you to the bug reports page. If you need +to report a bug when you don't have access to a browser, you may also +send a bug report by email to expat-bugs@mail.libexpat.org. + +Discussion related to the direction of future expat development takes +place on expat-discuss@mail.libexpat.org. Archives of this list and +other Expat-related lists may be found at: + + http://mail.libexpat.org/mailman-21/listinfo/ diff --git a/reactos/lib/expat/bcb5/README.txt b/reactos/lib/expat/bcb5/README.txt new file mode 100644 index 00000000000..486f1ca85d6 --- /dev/null +++ b/reactos/lib/expat/bcb5/README.txt @@ -0,0 +1,87 @@ + + Using a Borland compiler product + +The files in this directory support using both the free Borland command-line +compiler tools and the Borland C++ Builder IDE. The project files have been +tested with both versions 5 and 6 of the C++ Builder product. + + Using the free BCC32 command line compiler + +After downloading and installing the free C++ Builder commandline version, +perform the following steps (assuming it was installed under C:\Borland\BCC55): + +1) Add "C:\Borland\BCC55\BIN" to your path +2) Set the environment variable BCB to "C:\Borland\BCC55". +3) edit makefile.mak: enable or comment out the appropriate commands under + clean & distclean, depending on whether your OS can use deltree /y or + del /s/f/q. + +After that, you should simply cd to the bcb5 directory in your Expat directory +tree (same structure as CVS) and run "make all" or just "make". + + Naming + +The libraries have the base name "libexpat" followed optionally by an "s" +(static) or a "w" (unicode version), then an underscore and optionally +"mt" (multi-threaded) and "d" (dynamic RTL). + +To change the name of the library a project file produces, edit the project +option source (see step 1 under Unicode below) and change the name contained in +the PROJECT tag. In a make file, change the value assigned to the PROJECT +variable. Also, the LIBRARY entry in the .def file has to be changed to +correspond to the new executable name. + + + Unicode Considerations + +There are no facilities in the BCB 5 GUI to create a unicode-enabled +application. Fortunately, it is not hard to do by hand. + +1. The startup .obj system file must be changed to the unicode version. + Go to Project|Edit Option Source, and scroll down to the ALLOBJ tag. Change + c0x32.obj to c0x32w.obj. Editing this file can be quirky, but usually the + following kludge will make the change stick. Close and save the file + (CTRL-F4) then open the options dialog (CTRL-Shift-F11), then click OK on + the dialog immediately without changing anything in it. If this doesn't work, + you will have to close the project completely and edit the .bpr file by hand. + + If you are using a make file, just change the startup .obj file assigned + to the ALLOBJ variable. + +2. Add the macro define XML_UNICODE_WCHAR_T. In the GUI that goes in the options + dialog, Directories/Conditionals tab, in the Conditional define box. In a + make file, put it in the USERDEFINES variable. + +3. Of course, your code has to be written for unicode. As a start, the "main" + function is called "wmain". The tchar macros are an interesting way to + write code that can easily switch between unicode and utf-8. If these macros + are used, then simply adding the conditional define _UNICODE as well as + XML_UNICODE_WCHAR_T will bring in the unicode versions of the tchar macros. + Otherwise the utf-8 versions are used. xmlwf uses its own versions of the + tchar macros which are switched on and off by the XML_UNICODE macro, which + itself is set by the XML_UNICODE_WCHAR_T define. + + Threading + +The libexpat libraries are all built to link with the multi-threaded dynamic RTL's. +That means they require CC32xxMT.DLL present on the installation target. +To create single-threaded libs, do the following: + +1. The compiler option for multi-threading must be turned off. Following the + instructions above to edit the option source, remove the -tWM option from + the CFLAG1 tag. In a make file, remove it from the CFLAG1 variable. + +2. The single threaded RTL must be called. change the RTL in the ALLLIB tag or + variable (GUI or makefile repectively) to the version without the "mt" in the + name. For example, change cw32mti.lib to cw32i.lib. + + Static RTL's + +To build the libs with static RTL's do the following, + +1. For the static expatlibs, in the Tlib tab on the options dialog, uncheck the + "Use dynamic RTL" box. For the dynamic expatlibs, in the Linker tab on the + options dialog, uncheck "Use dynamic RTL". If you are using a make file, + remove the _RTLDLL assignment to the SYSDEFINES variable, and change the RTL + to the version without an "i" in the ALLLIB variable. For example, + cw32mti.lib would become cw32mt.lib. diff --git a/reactos/lib/expat/bcb5/all_projects.bpg b/reactos/lib/expat/bcb5/all_projects.bpg new file mode 100644 index 00000000000..27c9a1cba57 --- /dev/null +++ b/reactos/lib/expat/bcb5/all_projects.bpg @@ -0,0 +1,49 @@ +#------------------------------------------------------------------------------ +VERSION = BWS.01 +#------------------------------------------------------------------------------ +!ifndef ROOT +ROOT = $(MAKEDIR)\.. +!endif +#------------------------------------------------------------------------------ +MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$** +DCC = $(ROOT)\bin\dcc32.exe $** +BRCC = $(ROOT)\bin\brcc32.exe $** +#------------------------------------------------------------------------------ +PROJECTS = setup libexpat_mtd.dll libexpats_mtd.lib libexpatw_mtd.dll \ + libexpatws_mtd.lib elements.exe outline.exe xmlwf.exe +#------------------------------------------------------------------------------ +default: $(PROJECTS) +#------------------------------------------------------------------------------ + +libexpat_mtd.dll: expat.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +libexpats_mtd.lib: expat_static.bpr + $(ROOT)\bin\bpr2mak -t$(ROOT)\bin\deflib.bmk $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +libexpatw_mtd.dll: expatw.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +libexpatws_mtd.lib: expatw_static.bpr + $(ROOT)\bin\bpr2mak -t$(ROOT)\bin\deflib.bmk $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +elements.exe: elements.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +outline.exe: outline.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +xmlwf.exe: xmlwf.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +setup: setup.bat + call $** + + diff --git a/reactos/lib/expat/bcb5/elements.bpf b/reactos/lib/expat/bcb5/elements.bpf new file mode 100644 index 00000000000..5c1e878d671 --- /dev/null +++ b/reactos/lib/expat/bcb5/elements.bpf @@ -0,0 +1,4 @@ +USEUNIT("..\examples\elements.c"); +USELIB("Release\libexpats_mtd.lib"); +//--------------------------------------------------------------------------- +main diff --git a/reactos/lib/expat/bcb5/elements.bpr b/reactos/lib/expat/bcb5/elements.bpr new file mode 100644 index 00000000000..c21c0f59f29 --- /dev/null +++ b/reactos/lib/expat/bcb5/elements.bpr @@ -0,0 +1,149 @@ +<?xml version='1.0' encoding='utf-8' ?> +<!-- C++Builder XML Project --> +<PROJECT> + <MACROS> + <VERSION value="BCB.05.03"/> + <PROJECT value="Release\elements.exe"/> + <OBJFILES value="Release\obj\examples\elements.obj"/> + <RESFILES value=""/> + <IDLFILES value=""/> + <IDLGENFILES value=""/> + <DEFFILE value=""/> + <RESDEPEN value="$(RESFILES)"/> + <LIBFILES value="Release\libexpats_mtd.lib"/> + <LIBRARIES value=""/> + <SPARELIBS value=""/> + <PACKAGES value="VCL50.bpi VCLX50.bpi bcbsmp50.bpi QRPT50.bpi VCLDB50.bpi VCLBDE50.bpi + ibsmp50.bpi VCLDBX50.bpi TEEUI50.bpi TEEDB50.bpi TEE50.bpi TEEQR50.bpi + VCLIB50.bpi bcbie50.bpi VCLIE50.bpi INETDB50.bpi INET50.bpi NMFAST50.bpi + dclocx50.bpi bcb2kaxserver50.bpi dclusr50.bpi"/> + <PATHCPP value=".;..\examples"/> + <PATHPAS value=".;"/> + <PATHRC value=".;"/> + <PATHASM value=".;"/> + <DEBUGLIBPATH value="$(BCB)\lib\debug"/> + <RELEASELIBPATH value="$(BCB)\lib\release"/> + <LINKER value="ilink32"/> + <USERDEFINES value="WIN32;NDEBUG;_CONSOLE;XML_STATIC"/> + <SYSDEFINES value="_NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL"/> + <MAINSOURCE value="elements.bpf"/> + <INCLUDEPATH value="..\examples;$(BCB)\include"/> + <LIBPATH value="..\examples;$(BCB)\lib;$(RELEASELIBPATH)"/> + <WARNINGS value="-w-par -w-8027 -w-8026"/> + </MACROS> + <OPTIONS> + <IDLCFLAGS value="-I$(BCB)\include"/> + <CFLAG1 value="-O2 -X- -a8 -b -k- -vi -q -tWM -I..\lib -c"/> + <PFLAGS value="-N2Release\obj\examples -N0Release\obj\examples -$Y- -$L- -$D-"/> + <RFLAGS value="/l 0x409 /d "NDEBUG" /i$(BCB)\include"/> + <AFLAGS value="/mx /w2 /zn"/> + <LFLAGS value="-IRelease\obj\examples -D"" -ap -Tpe -x -Gn -q -L..\LIB\RELEASE_STATIC"/> + </OPTIONS> + <LINKER> + <ALLOBJ value="c0x32.obj $(OBJFILES)"/> + <ALLRES value="$(RESFILES)"/> + <ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cw32mti.lib"/> + </LINKER> + <IDEOPTIONS> +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=4 +Item0=..\examples;$(BCB)\include +Item1=$(BCB)\include +Item2=$(BCB)\include;$(BCB)\include\mfc;$(BCB)\include\atl +Item3=$(BCB)\include;$(BCB)\include\mfc;$(BCB)\include\atl; + +[HistoryLists\hlLibraryPath] +Count=8 +Item0=..\examples;$(BCB)\lib;$(RELEASELIBPATH) +Item1=..\examples;$(BCB)\lib;..\examples\$(RELEASELIBPATH) +Item2=$(BCB)\lib;$(RELEASELIBPATH) +Item3=$(BCB)\lib;$(RELEASELIBPATH);..\lib\Release-w_static +Item4=$(BCB)\lib;$(RELEASELIBPATH);..\lib\Release_static +Item5=$(BCB)\lib;$(RELEASELIBPATH);C:\src\expat\lib\Release_static +Item6=$(BCB)\lib;$(RELEASELIBPATH);$(BCB)\lib\psdk +Item7=$(BCB)\lib;$(RELEASELIBPATH);;$(BCB)\lib\psdk; + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=17 +Item0=WIN32;NDEBUG;_CONSOLE;XML_STATIC +Item1=WIN32;NDEBUG;_CONSOLE;_DEBUG;XML_STATIC +Item2=WIN32;NDEBUG;_CONSOLE;_DEBUG;XML_UNICODE_WCHAR_T;_UNICODE;XML_STATIC +Item3=WIN32;NDEBUG;_CONSOLE;_DEBUG;XML_UNICODE_WCHAR_T;_UNICODE +Item4=WIN32;NDEBUG;_CONSOLE;_DEBUG +Item5=WIN32;NDEBUG;_CONSOLE;XML_STATIC;_DEBUG +Item6=WIN32;NDEBUG;_CONSOLE;XML_STATIC;_DEBUG;_UNICODE +Item7=WIN32;NDEBUG;_CONSOLE;XML_STATIC;_DEBUG;XML_UNICODE_WCHAR_T +Item8=WIN32;NDEBUG;_CONSOLE;_MBCS;XML_STATIC;_DEBUG;XML_UNICODE_WCHAR_T +Item9=WIN32;NDEBUG;_CONSOLE;_UNICODE;XML_STATIC;_DEBUG;XML_UNICODE_WCHAR_T +Item10=WIN32;NDEBUG;_CONSOLE;_UNICODE;XML_STATIC;_DEBUG;XML_UNICODE +Item11=WIN32;NDEBUG;_CONSOLE;_MBCS;XML_STATIC;_DEBUG;XML_UNICODE_WCHAR_T;__WCHAR_T +Item12=WIN32;NDEBUG;_CONSOLE;_MBCS;XML_STATIC;_DEBUG;XML_UNICODE_WCHAR_T;_UNICODE +Item13=WIN32;NDEBUG;_CONSOLE;_MBCS;XML_STATIC;_DEBUG;XML_UNICODE;_UNICODE +Item14=WIN32;NDEBUG;_CONSOLE;_MBCS;XML_STATIC;_DEBUG;XML_UNICODE +Item15=WIN32;NDEBUG;_CONSOLE;_MBCS;XML_STATIC;_DEBUG +Item16=WIN32;NDEBUG;_CONSOLE;_MBCS;XML_STATIC + +[HistoryLists\hlIntOutputDir] +Count=5 +Item0=Release\obj\examples +Item1=Release\obj\elements +Item2=Release\obj\mts +Item3=..\examples\Release +Item4=Release + +[HistoryLists\hlFinalOutputDir] +Count=1 +Item0=Release\ + +[Debugging] +DebugSourceDirs= + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + </IDEOPTIONS> +</PROJECT> \ No newline at end of file diff --git a/reactos/lib/expat/bcb5/elements.mak b/reactos/lib/expat/bcb5/elements.mak new file mode 100644 index 00000000000..d4427fd5129 --- /dev/null +++ b/reactos/lib/expat/bcb5/elements.mak @@ -0,0 +1,186 @@ +# --------------------------------------------------------------------------- +!if !$d(BCB) +BCB = $(MAKEDIR)\.. +!endif + +# --------------------------------------------------------------------------- +# IDE SECTION +# --------------------------------------------------------------------------- +# The following section of the project makefile is managed by the BCB IDE. +# It is recommended to use the IDE to change any of the values in this +# section. +# --------------------------------------------------------------------------- + +VERSION = BCB.05.03 +# --------------------------------------------------------------------------- +PROJECT = Release\elements.exe +OBJFILES = Release\obj\examples\elements.obj +RESFILES = +MAINSOURCE = elements.bpf +RESDEPEN = $(RESFILES) +LIBFILES = Release\libexpats_mtd.lib +IDLFILES = +IDLGENFILES = +LIBRARIES = +PACKAGES = VCL50.bpi VCLX50.bpi bcbsmp50.bpi QRPT50.bpi VCLDB50.bpi VCLBDE50.bpi \ + ibsmp50.bpi VCLDBX50.bpi TEEUI50.bpi TEEDB50.bpi TEE50.bpi TEEQR50.bpi \ + VCLIB50.bpi bcbie50.bpi VCLIE50.bpi INETDB50.bpi INET50.bpi NMFAST50.bpi \ + dclocx50.bpi bcb2kaxserver50.bpi dclusr50.bpi +SPARELIBS = +DEFFILE = +# --------------------------------------------------------------------------- +PATHCPP = .;..\examples +PATHASM = .; +PATHPAS = .; +PATHRC = .; +DEBUGLIBPATH = $(BCB)\lib\debug +RELEASELIBPATH = $(BCB)\lib\release +USERDEFINES = WIN32;NDEBUG;_CONSOLE;XML_STATIC +SYSDEFINES = _NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL +INCLUDEPATH = ..\examples;$(BCB)\include +LIBPATH = ..\examples;$(BCB)\lib;$(RELEASELIBPATH) +WARNINGS= -w-par -w-8027 -w-8026 +# --------------------------------------------------------------------------- +CFLAG1 = -O2 -X- -a8 -b -k- -vi -q -I..\lib -c +IDLCFLAGS = -I$(BCB)\include +PFLAGS = -N2Release\obj\examples -N0Release\obj\examples -$Y- -$L- -$D- +RFLAGS = /l 0x409 /d "NDEBUG" /i$(BCB)\include +AFLAGS = /mx /w2 /zn +LFLAGS = -IRelease\obj\examples -D"" -ap -Tpe -x -Gn -q -L..\LIB\RELEASE_STATIC +# --------------------------------------------------------------------------- +ALLOBJ = c0x32.obj $(OBJFILES) +ALLRES = $(RESFILES) +ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cw32mti.lib +# --------------------------------------------------------------------------- +!ifdef IDEOPTIONS + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +!endif + + + + + +# --------------------------------------------------------------------------- +# MAKE SECTION +# --------------------------------------------------------------------------- +# This section of the project file is not used by the BCB IDE. It is for +# the benefit of building from the command-line using the MAKE utility. +# --------------------------------------------------------------------------- + +.autodepend +# --------------------------------------------------------------------------- +!if "$(USERDEFINES)" != "" +AUSERDEFINES = -d$(USERDEFINES:;= -d) +!else +AUSERDEFINES = +!endif + +!if !$d(BCC32) +BCC32 = bcc32 +!endif + +!if !$d(CPP32) +CPP32 = cpp32 +!endif + +!if !$d(DCC32) +DCC32 = dcc32 +!endif + +!if !$d(TASM32) +TASM32 = tasm32 +!endif + +!if !$d(LINKER) +LINKER = ilink32 +!endif + +!if !$d(BRCC32) +BRCC32 = brcc32 +!endif + + +# --------------------------------------------------------------------------- +!if $d(PATHCPP) +.PATH.CPP = $(PATHCPP) +.PATH.C = $(PATHCPP) +!endif + +!if $d(PATHPAS) +.PATH.PAS = $(PATHPAS) +!endif + +!if $d(PATHASM) +.PATH.ASM = $(PATHASM) +!endif + +!if $d(PATHRC) +.PATH.RC = $(PATHRC) +!endif +# --------------------------------------------------------------------------- +$(PROJECT): $(IDLGENFILES) $(OBJFILES) $(RESDEPEN) $(DEFFILE) + $(BCB)\BIN\$(LINKER) @&&! + $(LFLAGS) -L$(LIBPATH) + + $(ALLOBJ), + + $(PROJECT),, + + $(ALLLIB), + + $(DEFFILE), + + $(ALLRES) +! +# --------------------------------------------------------------------------- +.pas.hpp: + $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< } + +.pas.obj: + $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< } + +.cpp.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< } + +.c.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< } + +.c.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< } + +.cpp.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< } + +.asm.obj: + $(BCB)\BIN\$(TASM32) $(AFLAGS) -i$(INCLUDEPATH:;= -i) $(AUSERDEFINES) -d$(SYSDEFINES:;= -d) $<, $@ + +.rc.res: + $(BCB)\BIN\$(BRCC32) $(RFLAGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -fo$@ $< +# --------------------------------------------------------------------------- + + + + diff --git a/reactos/lib/expat/bcb5/expat.bpf b/reactos/lib/expat/bcb5/expat.bpf new file mode 100644 index 00000000000..2c423283f10 --- /dev/null +++ b/reactos/lib/expat/bcb5/expat.bpf @@ -0,0 +1,6 @@ +USEUNIT("..\lib\xmlparse.c"); +USEUNIT("..\lib\xmlrole.c"); +USEUNIT("..\lib\xmltok.c"); +USEDEF("libexpat_mtd.def"); +//--------------------------------------------------------------------------- +#define DllEntryPoint diff --git a/reactos/lib/expat/bcb5/expat.bpr b/reactos/lib/expat/bcb5/expat.bpr new file mode 100644 index 00000000000..291b8cafc1d --- /dev/null +++ b/reactos/lib/expat/bcb5/expat.bpr @@ -0,0 +1,140 @@ +<?xml version='1.0' encoding='utf-8' ?> +<!-- C++Builder XML Project --> +<PROJECT> + <MACROS> + <VERSION value="BCB.05.03"/> + <PROJECT value="Release\libexpat_mtd.dll"/> + <OBJFILES value="Release\obj\libexpat\xmlparse.obj Release\obj\libexpat\xmlrole.obj + Release\obj\libexpat\xmltok.obj"/> + <RESFILES value=""/> + <IDLFILES value=""/> + <IDLGENFILES value=""/> + <DEFFILE value="libexpat_mtd.def"/> + <RESDEPEN value="$(RESFILES)"/> + <LIBFILES value=""/> + <LIBRARIES value=""/> + <SPARELIBS value=""/> + <PACKAGES value="VCL50.bpi VCLX50.bpi bcbsmp50.bpi QRPT50.bpi VCLDB50.bpi VCLBDE50.bpi + ibsmp50.bpi VCLDBX50.bpi TEEUI50.bpi TEEDB50.bpi TEE50.bpi TEEQR50.bpi + VCLIB50.bpi bcbie50.bpi VCLIE50.bpi INETDB50.bpi INET50.bpi NMFAST50.bpi + dclocx50.bpi bcb2kaxserver50.bpi dclusr50.bpi"/> + <PATHCPP value=".;..\lib"/> + <PATHPAS value=".;"/> + <PATHRC value=".;"/> + <PATHASM value=".;"/> + <DEBUGLIBPATH value="$(BCB)\lib\debug"/> + <RELEASELIBPATH value="$(BCB)\lib\release"/> + <LINKER value="ilink32"/> + <USERDEFINES value="_WINDOWS;WIN32;NDEBUG;_USRDLL;COMPILED_FROM_DSP;EXPAT_EXPORTS"/> + <SYSDEFINES value="_NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL"/> + <MAINSOURCE value="expat.bpf"/> + <INCLUDEPATH value="..\lib;$(BCB)\include"/> + <LIBPATH value="..\lib;$(BCB)\lib;$(RELEASELIBPATH)"/> + <WARNINGS value="-w-rch -w-par -w-8027 -w-8026 -w-ccc"/> + </MACROS> + <OPTIONS> + <IDLCFLAGS value="-I$(BCB)\include"/> + <CFLAG1 value="-WD -O2 -X- -a8 -b -k- -vi -q -tWM -c -tWD"/> + <PFLAGS value="-N2Release\obj\libexpat -N0Release\obj\libexpat -$Y- -$L- -$D-"/> + <RFLAGS value="/l 0x409 /d "NDEBUG" /i$(BCB)\include"/> + <AFLAGS value="/mx /w2 /zn"/> + <LFLAGS value="-IRelease\obj\libexpat -D"" -aa -Tpd -x -Gn -Gi -q"/> + </OPTIONS> + <LINKER> + <ALLOBJ value="c0d32.obj $(OBJFILES)"/> + <ALLRES value="$(RESFILES)"/> + <ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cw32mti.lib"/> + </LINKER> + <IDEOPTIONS> +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=4 +Item0=..\lib;$(BCB)\include +Item1=$(BCB)\include +Item2=$(BCB)\include;$(BCB)\include\mfc;$(BCB)\include\atl +Item3=$(BCB)\include;$(BCB)\include\mfc;$(BCB)\include\atl; + +[HistoryLists\hlLibraryPath] +Count=5 +Item0=..\lib;$(BCB)\lib;$(RELEASELIBPATH) +Item1=..\lib;$(BCB)\lib;..\lib\$(RELEASELIBPATH) +Item2=$(BCB)\lib;$(RELEASELIBPATH) +Item3=$(BCB)\lib;$(RELEASELIBPATH);$(BCB)\lib\psdk +Item4=$(BCB)\lib;$(RELEASELIBPATH);;$(BCB)\lib\psdk; + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=8 +Item0=_WINDOWS;WIN32;NDEBUG;_USRDLL;COMPILED_FROM_DSP;EXPAT_EXPORTS +Item1=_WINDOWS;WIN32;NDEBUG;_DEBUG;_USRDLL;COMPILED_FROM_DSP;EXPAT_EXPORTS +Item2=WIN32;_WINDOWS;NDEBUG;_DEBUG;_USRDLL;COMPILED_FROM_DSP;EXPAT_EXPORTS +Item3=WIN32;_WINDOWS;NDEBUG;_DEBUG;_USRDLL;EXPAT_EXPORTS;COMPILED_FROM_DSP +Item4=NDEBUG;WIN32;_WINDOWS;_USRDLL;_DEBUG;EXPAT_EXPORTS;COMPILED_FROM_DSP +Item5=NDEBUG;WIN32;_WINDOWS;_USRDLL;EXPAT_EXPORTS;COMPILED_FROM_DSP;_DEBUG +Item6=NDEBUG;WIN32;_WINDOWS;_MBCS;_USRDLL;EXPAT_EXPORTS;COMPILED_FROM_DSP;_DEBUG +Item7=NDEBUG;WIN32;_WINDOWS;_MBCS;_USRDLL;EXPAT_EXPORTS;COMPILED_FROM_DSP + +[HistoryLists\hlIntOutputDir] +Count=7 +Item0=Release\obj\libexpat +Item1=Release\obj\libexpat_static +Item2=Release\obj\mtd +Item3=Release\obj\mt +Item4=Release\obj +Item5=Release +Item6=..\lib\Release + +[HistoryLists\hlFinalOutputDir] +Count=1 +Item0=Release\ + +[Debugging] +DebugSourceDirs= + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + </IDEOPTIONS> +</PROJECT> \ No newline at end of file diff --git a/reactos/lib/expat/bcb5/expat.mak b/reactos/lib/expat/bcb5/expat.mak new file mode 100644 index 00000000000..7c9c23f52b8 --- /dev/null +++ b/reactos/lib/expat/bcb5/expat.mak @@ -0,0 +1,187 @@ +# --------------------------------------------------------------------------- +!if !$d(BCB) +BCB = $(MAKEDIR)\.. +!endif + +# --------------------------------------------------------------------------- +# IDE SECTION +# --------------------------------------------------------------------------- +# The following section of the project makefile is managed by the BCB IDE. +# It is recommended to use the IDE to change any of the values in this +# section. +# --------------------------------------------------------------------------- + +VERSION = BCB.05.03 +# --------------------------------------------------------------------------- +PROJECT = Release\libexpat_mtd.dll +OBJFILES = Release\obj\libexpat\xmlparse.obj Release\obj\libexpat\xmlrole.obj \ + Release\obj\libexpat\xmltok.obj +RESFILES = +MAINSOURCE = expat.bpf +RESDEPEN = $(RESFILES) +LIBFILES = +IDLFILES = +IDLGENFILES = +LIBRARIES = +PACKAGES = VCL50.bpi VCLX50.bpi bcbsmp50.bpi QRPT50.bpi VCLDB50.bpi VCLBDE50.bpi \ + ibsmp50.bpi VCLDBX50.bpi TEEUI50.bpi TEEDB50.bpi TEE50.bpi TEEQR50.bpi \ + VCLIB50.bpi bcbie50.bpi VCLIE50.bpi INETDB50.bpi INET50.bpi NMFAST50.bpi \ + dclocx50.bpi bcb2kaxserver50.bpi dclusr50.bpi +SPARELIBS = +DEFFILE = libexpat_mtd.def +# --------------------------------------------------------------------------- +PATHCPP = .;..\lib +PATHASM = .; +PATHPAS = .; +PATHRC = .; +DEBUGLIBPATH = $(BCB)\lib\debug +RELEASELIBPATH = $(BCB)\lib\release +USERDEFINES = _WINDOWS;WIN32;NDEBUG;_USRDLL;COMPILED_FROM_DSP +SYSDEFINES = _NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL +INCLUDEPATH = ..\lib;$(BCB)\include +LIBPATH = ..\lib;$(BCB)\lib;$(RELEASELIBPATH) +WARNINGS= -w-rch -w-par -w-8027 -w-8026 -w-ccc +# --------------------------------------------------------------------------- +CFLAG1 = -WD -O2 -X- -a8 -b -k- -vi -q -tWM -c -tWD +IDLCFLAGS = -I$(BCB)\include +PFLAGS = -N2Release\obj\libexpat -N0Release\obj\libexpat -$Y- -$L- -$D- +RFLAGS = /l 0x409 /d "NDEBUG" /i$(BCB)\include +AFLAGS = /mx /w2 /zn +LFLAGS = -IRelease\obj\libexpat -D"" -aa -Tpd -x -Gn -Gi -q +# --------------------------------------------------------------------------- +ALLOBJ = c0d32.obj $(OBJFILES) +ALLRES = $(RESFILES) +ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cw32mti.lib +# --------------------------------------------------------------------------- +!ifdef IDEOPTIONS + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +!endif + + + + + +# --------------------------------------------------------------------------- +# MAKE SECTION +# --------------------------------------------------------------------------- +# This section of the project file is not used by the BCB IDE. It is for +# the benefit of building from the command-line using the MAKE utility. +# --------------------------------------------------------------------------- + +.autodepend +# --------------------------------------------------------------------------- +!if "$(USERDEFINES)" != "" +AUSERDEFINES = -d$(USERDEFINES:;= -d) +!else +AUSERDEFINES = +!endif + +!if !$d(BCC32) +BCC32 = bcc32 +!endif + +!if !$d(CPP32) +CPP32 = cpp32 +!endif + +!if !$d(DCC32) +DCC32 = dcc32 +!endif + +!if !$d(TASM32) +TASM32 = tasm32 +!endif + +!if !$d(LINKER) +LINKER = ilink32 +!endif + +!if !$d(BRCC32) +BRCC32 = brcc32 +!endif + + +# --------------------------------------------------------------------------- +!if $d(PATHCPP) +.PATH.CPP = $(PATHCPP) +.PATH.C = $(PATHCPP) +!endif + +!if $d(PATHPAS) +.PATH.PAS = $(PATHPAS) +!endif + +!if $d(PATHASM) +.PATH.ASM = $(PATHASM) +!endif + +!if $d(PATHRC) +.PATH.RC = $(PATHRC) +!endif +# --------------------------------------------------------------------------- +$(PROJECT): $(IDLGENFILES) $(OBJFILES) $(RESDEPEN) $(DEFFILE) + $(BCB)\BIN\$(LINKER) @&&! + $(LFLAGS) -L$(LIBPATH) + + $(ALLOBJ), + + $(PROJECT),, + + $(ALLLIB), + + $(DEFFILE), + + $(ALLRES) +! +# --------------------------------------------------------------------------- +.pas.hpp: + $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< } + +.pas.obj: + $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< } + +.cpp.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< } + +.c.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< } + +.c.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< } + +.cpp.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< } + +.asm.obj: + $(BCB)\BIN\$(TASM32) $(AFLAGS) -i$(INCLUDEPATH:;= -i) $(AUSERDEFINES) -d$(SYSDEFINES:;= -d) $<, $@ + +.rc.res: + $(BCB)\BIN\$(BRCC32) $(RFLAGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -fo$@ $< +# --------------------------------------------------------------------------- + + + + diff --git a/reactos/lib/expat/bcb5/expat_static.bpf b/reactos/lib/expat/bcb5/expat_static.bpf new file mode 100644 index 00000000000..5ca458edcae --- /dev/null +++ b/reactos/lib/expat/bcb5/expat_static.bpf @@ -0,0 +1,5 @@ +USEUNIT("..\lib\xmlparse.c"); +USEUNIT("..\lib\xmlrole.c"); +USEUNIT("..\lib\xmltok.c"); +//--------------------------------------------------------------------------- +#define Library diff --git a/reactos/lib/expat/bcb5/expat_static.bpr b/reactos/lib/expat/bcb5/expat_static.bpr new file mode 100644 index 00000000000..2f6ec4d3bd9 --- /dev/null +++ b/reactos/lib/expat/bcb5/expat_static.bpr @@ -0,0 +1,143 @@ +<?xml version='1.0' encoding='utf-8' ?> +<!-- C++Builder XML Project --> +<PROJECT> + <MACROS> + <VERSION value="BCB.05.03"/> + <PROJECT value="Release\libexpats_mtd.lib"/> + <OBJFILES value="Release\obj\libexpat_static\xmlparse.obj + Release\obj\libexpat_static\xmlrole.obj + Release\obj\libexpat_static\xmltok.obj"/> + <RESFILES value=""/> + <IDLFILES value=""/> + <IDLGENFILES value=""/> + <DEFFILE value=""/> + <RESDEPEN value="$(RESFILES)"/> + <LIBFILES value=""/> + <LIBRARIES value=""/> + <SPARELIBS value=""/> + <PACKAGES value=""/> + <PATHCPP value=".;..\lib"/> + <PATHPAS value=".;"/> + <PATHRC value=".;"/> + <PATHASM value=".;"/> + <DEBUGLIBPATH value="$(BCB)\lib\debug"/> + <RELEASELIBPATH value="$(BCB)\lib\release"/> + <LINKER value="TLib"/> + <USERDEFINES value="_WINDOWS;WIN32;NDEBUG;_LIB;COMPILED_FROM_DSP;XML_STATIC"/> + <SYSDEFINES value="_NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL"/> + <MAINSOURCE value="expat_static.bpf"/> + <INCLUDEPATH value="..\lib;$(BCB)\include"/> + <LIBPATH value="..\lib;$(BCB)\lib;$(RELEASELIBPATH)"/> + <WARNINGS value="-w-rch -w-par -w-8027 -w-8026 -w-ccc"/> + <LISTFILE value=""/> + </MACROS> + <OPTIONS> + <IDLCFLAGS value="-I$(BCB)\include"/> + <CFLAG1 value="-O2 -X- -a8 -b -k- -vi -q -tWM -c"/> + <PFLAGS value="-N2Release\obj\libexpat_static -N0Release\obj\libexpat_static -$Y- -$L- -$D-"/> + <RFLAGS value="/l 0x409 /d "NDEBUG" /i$(BCB)\include"/> + <AFLAGS value="/mx /w2 /zn"/> + <LFLAGS value=""/> + </OPTIONS> + <LINKER> + <ALLOBJ value="$(OBJFILES)"/> + <ALLRES value="$(RESFILES)"/> + <ALLLIB value="$(LIBFILES) $(LIBRARIES)"/> + </LINKER> + <IDEOPTIONS> +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=4 +Item0=..\lib;$(BCB)\include +Item1=$(BCB)\include +Item2=$(BCB)\include;$(BCB)\include\mfc;$(BCB)\include\atl +Item3=$(BCB)\include;$(BCB)\include\mfc;$(BCB)\include\atl; + +[HistoryLists\hlLibraryPath] +Count=5 +Item0=..\lib;$(BCB)\lib;$(RELEASELIBPATH) +Item1=..\lib;$(BCB)\lib;..\lib\$(RELEASELIBPATH) +Item2=$(BCB)\lib;$(RELEASELIBPATH) +Item3=$(BCB)\lib;$(RELEASELIBPATH);$(BCB)\lib\psdk +Item4=$(BCB)\lib;$(RELEASELIBPATH);;$(BCB)\lib\psdk; + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=7 +Item0=_WINDOWS;WIN32;NDEBUG;_LIB;COMPILED_FROM_DSP;XML_STATIC +Item1=_WINDOWS;WIN32;NDEBUG;_DEBUG;_LIB;COMPILED_FROM_DSP;XML_STATIC +Item2=WIN32;_WINDOWS;NDEBUG;_DEBUG;_LIB;COMPILED_FROM_DSP;XML_STATIC +Item3=WIN32;_WINDOWS;NDEBUG;_LIB;COMPILED_FROM_DSP;_DEBUG +Item4=WIN32;_WINDOWS;NDEBUG;_LIB;COMPILED_FROM_DSP +Item5=WIN32;_WINDOWS;NDEBUG;_LIB;COMPILED_FROM_DSP;_MBCS +Item6=WIN32;_WINDOWS;NDEBUG;_MBCS;_LIB;COMPILED_FROM_DSP + +[HistoryLists\hlIntOutputDir] +Count=6 +Item0=Release\obj\libexpat_static +Item1=Release\obj\mts +Item2=Release\obj\mt +Item3=Release +Item4=..\lib\Release_static +Item5=Release_static + +[HistoryLists\hlFinalOutputDir] +Count=3 +Item0=Release\ +Item1=Release +Item2=Release_static\ + +[HistoryLists\hlTlibPageSize] +Count=1 +Item0=0x0010 + +[Debugging] +DebugSourceDirs= + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + </IDEOPTIONS> +</PROJECT> \ No newline at end of file diff --git a/reactos/lib/expat/bcb5/expat_static.mak b/reactos/lib/expat/bcb5/expat_static.mak new file mode 100644 index 00000000000..9137d3b5346 --- /dev/null +++ b/reactos/lib/expat/bcb5/expat_static.mak @@ -0,0 +1,189 @@ +# --------------------------------------------------------------------------- +!if !$d(BCB) +BCB = $(MAKEDIR)\.. +!endif + +# --------------------------------------------------------------------------- +# IDE SECTION +# --------------------------------------------------------------------------- +# The following section of the project makefile is managed by the BCB IDE. +# It is recommended to use the IDE to change any of the values in this +# section. +# --------------------------------------------------------------------------- + +VERSION = BCB.05.03 +# --------------------------------------------------------------------------- +PROJECT = Release\libexpats_mtd.lib +OBJFILES = Release\obj\libexpat_static\xmlparse.obj \ + Release\obj\libexpat_static\xmlrole.obj \ + Release\obj\libexpat_static\xmltok.obj +RESFILES = +MAINSOURCE = expat_static.bpf +RESDEPEN = $(RESFILES) +LIBFILES = +IDLFILES = +IDLGENFILES = +LIBRARIES = +PACKAGES = +SPARELIBS = +DEFFILE = +# --------------------------------------------------------------------------- +PATHCPP = .;..\lib +PATHASM = .; +PATHPAS = .; +PATHRC = .; +LINKER = TLib +DEBUGLIBPATH = $(BCB)\lib\debug +RELEASELIBPATH = $(BCB)\lib\release +USERDEFINES = _WINDOWS;WIN32;NDEBUG;_LIB;COMPILED_FROM_DSP;XML_STATIC +SYSDEFINES = _NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL +INCLUDEPATH = ..\lib;$(BCB)\include +LIBPATH = ..\lib;$(BCB)\lib;$(RELEASELIBPATH) +WARNINGS = -w-rch -w-par -w-8027 -w-8026 -w-ccc +LISTFILE = +# --------------------------------------------------------------------------- +CFLAG1 = -O2 -X- -a8 -b -k- -vi -q -tWM -c +IDLCFLAGS = -I$(BCB)\include +PFLAGS = -N2Release\obj\libexpat_static -N0Release\obj\libexpat_static -$Y- -$L- -$D- +RFLAGS = /l 0x409 /d "NDEBUG" /i$(BCB)\include +AFLAGS = /mx /w2 /zn +LFLAGS = +# --------------------------------------------------------------------------- +ALLOBJ = $(OBJFILES) +ALLRES = $(RESFILES) +ALLLIB = $(LIBFILES) $(LIBRARIES) +# --------------------------------------------------------------------------- +!ifdef IDEOPTIONS + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +!endif + + + + + +# --------------------------------------------------------------------------- +# MAKE SECTION +# --------------------------------------------------------------------------- +# This section of the project file is not used by the BCB IDE. It is for +# the benefit of building from the command-line using the MAKE utility. +# --------------------------------------------------------------------------- + +.autodepend +# --------------------------------------------------------------------------- +!if "$(USERDEFINES)" != "" +AUSERDEFINES = -d$(USERDEFINES:;= -d) +!else +AUSERDEFINES = +!endif + +!if !$d(BCC32) +BCC32 = bcc32 +!endif + +!if !$d(CPP32) +CPP32 = cpp32 +!endif + +!if !$d(DCC32) +DCC32 = dcc32 +!endif + +!if !$d(TASM32) +TASM32 = tasm32 +!endif + +!if !$d(LINKER) +LINKER = TLib +!endif + +!if !$d(BRCC32) +BRCC32 = brcc32 +!endif + + +# --------------------------------------------------------------------------- +!if $d(PATHCPP) +.PATH.CPP = $(PATHCPP) +.PATH.C = $(PATHCPP) +!endif + +!if $d(PATHPAS) +.PATH.PAS = $(PATHPAS) +!endif + +!if $d(PATHASM) +.PATH.ASM = $(PATHASM) +!endif + +!if $d(PATHRC) +.PATH.RC = $(PATHRC) +!endif +# --------------------------------------------------------------------------- +!if "$(LISTFILE)" == "" +COMMA = +!else +COMMA = , +!endif + +$(PROJECT): $(IDLGENFILES) $(OBJFILES) $(RESDEPEN) $(DEFFILE) + $(BCB)\BIN\$(LINKER) /u $@ @&&! + $(LFLAGS) $? $(COMMA) $(LISTFILE) + +! +# --------------------------------------------------------------------------- +.pas.hpp: + $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< } + +.pas.obj: + $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< } + +.cpp.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< } + +.c.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< } + +.c.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< } + +.cpp.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< } + +.asm.obj: + $(BCB)\BIN\$(TASM32) $(AFLAGS) -i$(INCLUDEPATH:;= -i) $(AUSERDEFINES) -d$(SYSDEFINES:;= -d) $<, $@ + +.rc.res: + $(BCB)\BIN\$(BRCC32) $(RFLAGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -fo$@ $< +# --------------------------------------------------------------------------- + + + + diff --git a/reactos/lib/expat/bcb5/expatw.bpf b/reactos/lib/expat/bcb5/expatw.bpf new file mode 100644 index 00000000000..188a6d54ead --- /dev/null +++ b/reactos/lib/expat/bcb5/expatw.bpf @@ -0,0 +1,6 @@ +USEUNIT("..\lib\xmlparse.c"); +USEUNIT("..\lib\xmlrole.c"); +USEUNIT("..\lib\xmltok.c"); +USEDEF("libexpatw_mtd.def"); +//--------------------------------------------------------------------------- +#define DllEntryPoint diff --git a/reactos/lib/expat/bcb5/expatw.bpr b/reactos/lib/expat/bcb5/expatw.bpr new file mode 100644 index 00000000000..9ec50010b72 --- /dev/null +++ b/reactos/lib/expat/bcb5/expatw.bpr @@ -0,0 +1,146 @@ +<?xml version='1.0' encoding='utf-8' ?> +<!-- C++Builder XML Project --> +<PROJECT> + <MACROS> + <VERSION value="BCB.05.03"/> + <PROJECT value="Release\libexpatw_mtd.dll"/> + <OBJFILES value="Release\obj\libexpatw\xmlparse.obj Release\obj\libexpatw\xmlrole.obj + Release\obj\libexpatw\xmltok.obj"/> + <RESFILES value=""/> + <IDLFILES value=""/> + <IDLGENFILES value=""/> + <DEFFILE value="libexpatw_mtd.def"/> + <RESDEPEN value="$(RESFILES)"/> + <LIBFILES value=""/> + <LIBRARIES value=""/> + <SPARELIBS value=""/> + <PACKAGES value="VCL50.bpi VCLX50.bpi bcbsmp50.bpi QRPT50.bpi VCLDB50.bpi VCLBDE50.bpi + ibsmp50.bpi VCLDBX50.bpi TEEUI50.bpi TEEDB50.bpi TEE50.bpi TEEQR50.bpi + VCLIB50.bpi bcbie50.bpi VCLIE50.bpi INETDB50.bpi INET50.bpi NMFAST50.bpi + dclocx50.bpi bcb2kaxserver50.bpi dclusr50.bpi"/> + <PATHCPP value=".;..\lib"/> + <PATHPAS value=".;"/> + <PATHRC value=".;"/> + <PATHASM value=".;"/> + <DEBUGLIBPATH value="$(BCB)\lib\debug"/> + <RELEASELIBPATH value="$(BCB)\lib\release"/> + <LINKER value="ilink32"/> + <USERDEFINES value="_WINDOWS;WIN32;NDEBUG;_USRDLL;COMPILED_FROM_DSP;EXPAT_EXPORTS;XML_UNICODE_WCHAR_T"/> + <SYSDEFINES value="_NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL"/> + <MAINSOURCE value="expatw.bpf"/> + <INCLUDEPATH value="..\lib;$(BCB)\include"/> + <LIBPATH value="..\lib;$(BCB)\lib;$(RELEASELIBPATH)"/> + <WARNINGS value="-w-rch -w-par -w-8027 -w-8026 -w-ccc"/> + </MACROS> + <OPTIONS> + <IDLCFLAGS value="-I$(BCB)\include"/> + <CFLAG1 value="-WD -O2 -X- -a8 -b -k- -vi -q -tWM -c -tWD"/> + <PFLAGS value="-N2Release\obj\libexpatw -N0Release\obj\libexpatw -$Y- -$L- -$D-"/> + <RFLAGS value="/l 0x409 /d "NDEBUG" /i$(BCB)\include"/> + <AFLAGS value="/mx /w2 /zn"/> + <LFLAGS value="-IRelease\obj\libexpatw -D"" -aa -Tpd -x -Gn -Gi -w -q"/> + </OPTIONS> + <LINKER> + <ALLOBJ value="c0d32w.obj $(OBJFILES)"/> + <ALLRES value="$(RESFILES)"/> + <ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cw32mti.lib"/> + </LINKER> + <IDEOPTIONS> +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=4 +Item0=..\lib;$(BCB)\include +Item1=$(BCB)\include +Item2=$(BCB)\include;$(BCB)\include\mfc;$(BCB)\include\atl +Item3=$(BCB)\include;$(BCB)\include\mfc;$(BCB)\include\atl; + +[HistoryLists\hlLibraryPath] +Count=5 +Item0=..\lib;$(BCB)\lib;$(RELEASELIBPATH) +Item1=..\lib;$(BCB)\lib;..\lib\$(RELEASELIBPATH) +Item2=$(BCB)\lib;$(RELEASELIBPATH) +Item3=$(BCB)\lib;$(RELEASELIBPATH);$(BCB)\lib\psdk +Item4=$(BCB)\lib;$(RELEASELIBPATH);;$(BCB)\lib\psdk; + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=9 +Item0=_WINDOWS;WIN32;NDEBUG;_USRDLL;COMPILED_FROM_DSP;EXPAT_EXPORTS;XML_UNICODE_WCHAR_T +Item1=_WINDOWS;WIN32;NDEBUG;_DEBUG;_USRDLL;COMPILED_FROM_DSP;EXPAT_EXPORTS;XML_UNICODE_WCHAR_T +Item2=_WINDOWS;WIN32;NDEBUG;_DEBUG;_USRDLL;EXPAT_EXPORTS;COMPILED_FROM_DSP;XML_UNICODE_WCHAR_T +Item3=NDEBUG;COMPILED_FROM_DSP;WIN32;_WINDOWS;_USRDLL;EXPAT_EXPORTS;_DEBUG;XML_UNICODE_WCHAR_T +Item4=NDEBUG;COMPILED_FROM_DSP;WIN32;_WINDOWS;_USRDLL;EXPAT_EXPORTS;XML_UNICODE_WCHAR_T;_DEBUG +Item5=NDEBUG;COMPILED_FROM_DSP;WIN32;_WINDOWS;_UNICODE;_USRDLL;EXPAT_EXPORTS;XML_UNICODE_WCHAR_T;_DEBUG +Item6=NDEBUG;COMPILED_FROM_DSP;WIN32;_WINDOWS;_UNICODE;_USRDLL;EXPAT_EXPORTS;XML_UNICODE_WCHAR_T +Item7=NDEBUG;COMPILED_FROM_DSP;WIN32;_WINDOWS;_MBCS;_USRDLL;EXPAT_EXPORTS;XML_UNICODE_WCHAR_T;XML_UNICODE +Item8=NDEBUG;COMPILED_FROM_DSP;WIN32;_WINDOWS;_MBCS;_USRDLL;EXPAT_EXPORTS;XML_UNICODE_WCHAR_T + +[HistoryLists\hlIntOutputDir] +Count=8 +Item0=Release\obj\libexpatw +Item1=Release\obj\libexpat +Item2=Release\obj\mtd +Item3=Release\obj\mt +Item4=Release_w\obj +Item5=Release-w\obj +Item6=Release-w +Item7=..\lib\Release-w + +[HistoryLists\hlFinalOutputDir] +Count=5 +Item0=Release\ +Item1=Release +Item2=Release_w\ +Item3=Release-w\ +Item4=Release-w + +[Debugging] +DebugSourceDirs= + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + </IDEOPTIONS> +</PROJECT> \ No newline at end of file diff --git a/reactos/lib/expat/bcb5/expatw.mak b/reactos/lib/expat/bcb5/expatw.mak new file mode 100644 index 00000000000..08e17d003b8 --- /dev/null +++ b/reactos/lib/expat/bcb5/expatw.mak @@ -0,0 +1,187 @@ +# --------------------------------------------------------------------------- +!if !$d(BCB) +BCB = $(MAKEDIR)\.. +!endif + +# --------------------------------------------------------------------------- +# IDE SECTION +# --------------------------------------------------------------------------- +# The following section of the project makefile is managed by the BCB IDE. +# It is recommended to use the IDE to change any of the values in this +# section. +# --------------------------------------------------------------------------- + +VERSION = BCB.05.03 +# --------------------------------------------------------------------------- +PROJECT = Release\libexpatw_mtd.dll +OBJFILES = Release\obj\libexpatw\xmlparse.obj Release\obj\libexpatw\xmlrole.obj \ + Release\obj\libexpatw\xmltok.obj +RESFILES = +MAINSOURCE = expatw.bpf +RESDEPEN = $(RESFILES) +LIBFILES = +IDLFILES = +IDLGENFILES = +LIBRARIES = +PACKAGES = VCL50.bpi VCLX50.bpi bcbsmp50.bpi QRPT50.bpi VCLDB50.bpi VCLBDE50.bpi \ + ibsmp50.bpi VCLDBX50.bpi TEEUI50.bpi TEEDB50.bpi TEE50.bpi TEEQR50.bpi \ + VCLIB50.bpi bcbie50.bpi VCLIE50.bpi INETDB50.bpi INET50.bpi NMFAST50.bpi \ + dclocx50.bpi bcb2kaxserver50.bpi dclusr50.bpi +SPARELIBS = +DEFFILE = libexpatw_mtd.def +# --------------------------------------------------------------------------- +PATHCPP = .;..\lib +PATHASM = .; +PATHPAS = .; +PATHRC = .; +DEBUGLIBPATH = $(BCB)\lib\debug +RELEASELIBPATH = $(BCB)\lib\release +USERDEFINES = _WINDOWS;WIN32;NDEBUG;_USRDLL;COMPILED_FROM_DSP;XML_UNICODE_WCHAR_T +SYSDEFINES = _NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL +INCLUDEPATH = ..\lib;$(BCB)\include +LIBPATH = ..\lib;$(BCB)\lib;$(RELEASELIBPATH) +WARNINGS= -w-rch -w-par -w-8027 -w-8026 -w-ccc +# --------------------------------------------------------------------------- +CFLAG1 = -WD -O2 -X- -a8 -b -k- -vi -q -tWM -c -tWD +IDLCFLAGS = -I$(BCB)\include +PFLAGS = -N2Release\obj\libexpatw -N0Release\obj\libexpatw -$Y- -$L- -$D- +RFLAGS = /l 0x409 /d "NDEBUG" /i$(BCB)\include +AFLAGS = /mx /w2 /zn +LFLAGS = -IRelease\obj\libexpatw -D"" -aa -Tpd -x -Gn -Gi -w -q +# --------------------------------------------------------------------------- +ALLOBJ = c0d32w.obj $(OBJFILES) +ALLRES = $(RESFILES) +ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cw32mti.lib +# --------------------------------------------------------------------------- +!ifdef IDEOPTIONS + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +!endif + + + + + +# --------------------------------------------------------------------------- +# MAKE SECTION +# --------------------------------------------------------------------------- +# This section of the project file is not used by the BCB IDE. It is for +# the benefit of building from the command-line using the MAKE utility. +# --------------------------------------------------------------------------- + +.autodepend +# --------------------------------------------------------------------------- +!if "$(USERDEFINES)" != "" +AUSERDEFINES = -d$(USERDEFINES:;= -d) +!else +AUSERDEFINES = +!endif + +!if !$d(BCC32) +BCC32 = bcc32 +!endif + +!if !$d(CPP32) +CPP32 = cpp32 +!endif + +!if !$d(DCC32) +DCC32 = dcc32 +!endif + +!if !$d(TASM32) +TASM32 = tasm32 +!endif + +!if !$d(LINKER) +LINKER = ilink32 +!endif + +!if !$d(BRCC32) +BRCC32 = brcc32 +!endif + + +# --------------------------------------------------------------------------- +!if $d(PATHCPP) +.PATH.CPP = $(PATHCPP) +.PATH.C = $(PATHCPP) +!endif + +!if $d(PATHPAS) +.PATH.PAS = $(PATHPAS) +!endif + +!if $d(PATHASM) +.PATH.ASM = $(PATHASM) +!endif + +!if $d(PATHRC) +.PATH.RC = $(PATHRC) +!endif +# --------------------------------------------------------------------------- +$(PROJECT): $(IDLGENFILES) $(OBJFILES) $(RESDEPEN) $(DEFFILE) + $(BCB)\BIN\$(LINKER) @&&! + $(LFLAGS) -L$(LIBPATH) + + $(ALLOBJ), + + $(PROJECT),, + + $(ALLLIB), + + $(DEFFILE), + + $(ALLRES) +! +# --------------------------------------------------------------------------- +.pas.hpp: + $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< } + +.pas.obj: + $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< } + +.cpp.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< } + +.c.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< } + +.c.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< } + +.cpp.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< } + +.asm.obj: + $(BCB)\BIN\$(TASM32) $(AFLAGS) -i$(INCLUDEPATH:;= -i) $(AUSERDEFINES) -d$(SYSDEFINES:;= -d) $<, $@ + +.rc.res: + $(BCB)\BIN\$(BRCC32) $(RFLAGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -fo$@ $< +# --------------------------------------------------------------------------- + + + + diff --git a/reactos/lib/expat/bcb5/expatw_static.bpf b/reactos/lib/expat/bcb5/expatw_static.bpf new file mode 100644 index 00000000000..5ca458edcae --- /dev/null +++ b/reactos/lib/expat/bcb5/expatw_static.bpf @@ -0,0 +1,5 @@ +USEUNIT("..\lib\xmlparse.c"); +USEUNIT("..\lib\xmlrole.c"); +USEUNIT("..\lib\xmltok.c"); +//--------------------------------------------------------------------------- +#define Library diff --git a/reactos/lib/expat/bcb5/expatw_static.bpr b/reactos/lib/expat/bcb5/expatw_static.bpr new file mode 100644 index 00000000000..3f12644b64c --- /dev/null +++ b/reactos/lib/expat/bcb5/expatw_static.bpr @@ -0,0 +1,152 @@ +<?xml version='1.0' encoding='utf-8' ?> +<!-- C++Builder XML Project --> +<PROJECT> + <MACROS> + <VERSION value="BCB.05.03"/> + <PROJECT value="Release\libexpatws_mtd.lib"/> + <OBJFILES value="Release\obj\libexpatw_static\xmlparse.obj + Release\obj\libexpatw_static\xmlrole.obj + Release\obj\libexpatw_static\xmltok.obj"/> + <RESFILES value=""/> + <IDLFILES value=""/> + <IDLGENFILES value=""/> + <DEFFILE value=""/> + <RESDEPEN value="$(RESFILES)"/> + <LIBFILES value=""/> + <LIBRARIES value=""/> + <SPARELIBS value=""/> + <PACKAGES value=""/> + <PATHCPP value=".;..\lib"/> + <PATHPAS value=".;"/> + <PATHRC value=".;"/> + <PATHASM value=".;"/> + <DEBUGLIBPATH value="$(BCB)\lib\debug"/> + <RELEASELIBPATH value="$(BCB)\lib\release"/> + <LINKER value="TLib"/> + <USERDEFINES value="_WINDOWS;WIN32;NDEBUG;_LIB;COMPILED_FROM_DSP;XML_STATIC;XML_UNICODE_WCHAR_T"/> + <SYSDEFINES value="_NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL"/> + <MAINSOURCE value="expatw_static.bpf"/> + <INCLUDEPATH value="..\lib;$(BCB)\include"/> + <LIBPATH value="..\lib;$(BCB)\lib;$(RELEASELIBPATH)"/> + <WARNINGS value="-w-rch -w-par -w-8027 -w-8026 -w-ccc"/> + <LISTFILE value=""/> + </MACROS> + <OPTIONS> + <IDLCFLAGS value="-I$(BCB)\include"/> + <CFLAG1 value="-O2 -X- -a8 -b -k- -vi -q -tWM -c"/> + <PFLAGS value="-N2Release\obj\libexpatw_static -N0Release\obj\libexpatw_static -$Y- -$L- + -$D-"/> + <RFLAGS value="/l 0x409 /d "NDEBUG" /i$(BCB)\include"/> + <AFLAGS value="/mx /w2 /zn"/> + <LFLAGS value=""/> + </OPTIONS> + <LINKER> + <ALLOBJ value="$(OBJFILES)"/> + <ALLRES value="$(RESFILES)"/> + <ALLLIB value="$(LIBFILES) $(LIBRARIES)"/> + </LINKER> + <IDEOPTIONS> +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=4 +Item0=..\lib;$(BCB)\include +Item1=$(BCB)\include +Item2=$(BCB)\include;$(BCB)\include\mfc;$(BCB)\include\atl +Item3=$(BCB)\include;$(BCB)\include\mfc;$(BCB)\include\atl; + +[HistoryLists\hlLibraryPath] +Count=5 +Item0=..\lib;$(BCB)\lib;$(RELEASELIBPATH) +Item1=..\lib;$(BCB)\lib;..\lib\$(RELEASELIBPATH) +Item2=$(BCB)\lib;$(RELEASELIBPATH) +Item3=$(BCB)\lib;$(RELEASELIBPATH);$(BCB)\lib\psdk +Item4=$(BCB)\lib;$(RELEASELIBPATH);;$(BCB)\lib\psdk; + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=15 +Item0=_WINDOWS;WIN32;NDEBUG;_LIB;COMPILED_FROM_DSP;XML_STATIC;XML_UNICODE_WCHAR_T +Item1=_WINDOWS;WIN32;NDEBUG;_DEBUG;_LIB;COMPILED_FROM_DSP;XML_STATIC;XML_UNICODE_WCHAR_T +Item2=WIN32;_WINDOWS;NDEBUG;_DEBUG;_LIB;COMPILED_FROM_DSP;XML_STATIC;XML_UNICODE_WCHAR_T +Item3=WIN32;_WINDOWS;NDEBUG;_DEBUG;_LIB;XML_STATIC;COMPILED_FROM_DSP;XML_UNICODE_WCHAR_T +Item4=WIN32;_WINDOWS;NDEBUG;_LIB;COMPILED_FROM_DSP;_DEBUG;XML_UNICODE_WCHAR_T +Item5=WIN32;_WINDOWS;NDEBUG;_UNICODE;_LIB;COMPILED_FROM_DSP;XML_UNICODE_WCHAR_T;_DEBUG +Item6=WIN32;_WINDOWS;NDEBUG;_UNICODE;_LIB;COMPILED_FROM_DSP;XML_UNICODE_WCHAR_T;_DEBUG;__cplusplus +Item7=WIN32;_WINDOWS;NDEBUG;_UNICODE;_LIB;COMPILED_FROM_DSP;XML_UNICODE;_DEBUG +Item8=WIN32;_WINDOWS;NDEBUG;_MBCS;_LIB;COMPILED_FROM_DSP;XML_UNICODE;_DEBUG +Item9=WIN32;_WINDOWS;NDEBUG;_MBCS;_LIB;COMPILED_FROM_DSP;XML_UNICODE_WCHAR_T;_DEBUG;__WCHAR_T +Item10=WIN32;_WINDOWS;NDEBUG;_MBCS;_LIB;COMPILED_FROM_DSP;XML_UNICODE_WCHAR_T;_DEBUG;_UNICODE +Item11=WIN32;_WINDOWS;NDEBUG;_MBCS;_LIB;COMPILED_FROM_DSP;XML_UNICODE;_DEBUG;_UNICODE +Item12=WIN32;_WINDOWS;NDEBUG;_MBCS;_LIB;COMPILED_FROM_DSP;XML_UNICODE_WCHAR_T;_DEBUG +Item13=WIN32;_WINDOWS;NDEBUG;_MBCS;_LIB;COMPILED_FROM_DSP;XML_UNICODE_WCHAR_T +Item14=WIN32;_WINDOWS;NDEBUG;_MBCS;_LIB;COMPILED_FROM_DSP;XML_UNICODE_WCHAR_T;XML_UNICODE + +[HistoryLists\hlIntOutputDir] +Count=6 +Item0=Release\obj\libexpatw_static +Item1=Release\obj\libexpat_static +Item2=Release\obj\mts +Item3=Release\obj\mt +Item4=..\lib\Release-w_static +Item5=Release-w_static + +[HistoryLists\hlFinalOutputDir] +Count=3 +Item0=Release\ +Item1=Release +Item2=Release-w_static\ + +[HistoryLists\hlTlibPageSize] +Count=1 +Item0=0x0010 + +[Debugging] +DebugSourceDirs= + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + </IDEOPTIONS> +</PROJECT> \ No newline at end of file diff --git a/reactos/lib/expat/bcb5/expatw_static.mak b/reactos/lib/expat/bcb5/expatw_static.mak new file mode 100644 index 00000000000..16b7e5b90ec --- /dev/null +++ b/reactos/lib/expat/bcb5/expatw_static.mak @@ -0,0 +1,190 @@ +# --------------------------------------------------------------------------- +!if !$d(BCB) +BCB = $(MAKEDIR)\.. +!endif + +# --------------------------------------------------------------------------- +# IDE SECTION +# --------------------------------------------------------------------------- +# The following section of the project makefile is managed by the BCB IDE. +# It is recommended to use the IDE to change any of the values in this +# section. +# --------------------------------------------------------------------------- + +VERSION = BCB.05.03 +# --------------------------------------------------------------------------- +PROJECT = Release\libexpatws_mtd.lib +OBJFILES = Release\obj\libexpatw_static\xmlparse.obj \ + Release\obj\libexpatw_static\xmlrole.obj \ + Release\obj\libexpatw_static\xmltok.obj +RESFILES = +MAINSOURCE = expatw_static.bpf +RESDEPEN = $(RESFILES) +LIBFILES = +IDLFILES = +IDLGENFILES = +LIBRARIES = +PACKAGES = +SPARELIBS = +DEFFILE = +# --------------------------------------------------------------------------- +PATHCPP = .;..\lib +PATHASM = .; +PATHPAS = .; +PATHRC = .; +LINKER = TLib +DEBUGLIBPATH = $(BCB)\lib\debug +RELEASELIBPATH = $(BCB)\lib\release +USERDEFINES = _WINDOWS;WIN32;NDEBUG;_LIB;COMPILED_FROM_DSP;XML_STATIC;XML_UNICODE_WCHAR_T +SYSDEFINES = _NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL +INCLUDEPATH = ..\lib;$(BCB)\include +LIBPATH = ..\lib;$(BCB)\lib;$(RELEASELIBPATH) +WARNINGS = -w-rch -w-par -w-8027 -w-8026 -w-ccc +LISTFILE = +# --------------------------------------------------------------------------- +CFLAG1 = -O2 -X- -a8 -b -k- -vi -q -tWM -c +IDLCFLAGS = -I$(BCB)\include +PFLAGS = -N2Release\obj\libexpatw_static -N0Release\obj\libexpatw_static -$Y- -$L- \ + -$D- +RFLAGS = /l 0x409 /d "NDEBUG" /i$(BCB)\include +AFLAGS = /mx /w2 /zn +LFLAGS = +# --------------------------------------------------------------------------- +ALLOBJ = $(OBJFILES) +ALLRES = $(RESFILES) +ALLLIB = $(LIBFILES) $(LIBRARIES) +# --------------------------------------------------------------------------- +!ifdef IDEOPTIONS + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +!endif + + + + + +# --------------------------------------------------------------------------- +# MAKE SECTION +# --------------------------------------------------------------------------- +# This section of the project file is not used by the BCB IDE. It is for +# the benefit of building from the command-line using the MAKE utility. +# --------------------------------------------------------------------------- + +.autodepend +# --------------------------------------------------------------------------- +!if "$(USERDEFINES)" != "" +AUSERDEFINES = -d$(USERDEFINES:;= -d) +!else +AUSERDEFINES = +!endif + +!if !$d(BCC32) +BCC32 = bcc32 +!endif + +!if !$d(CPP32) +CPP32 = cpp32 +!endif + +!if !$d(DCC32) +DCC32 = dcc32 +!endif + +!if !$d(TASM32) +TASM32 = tasm32 +!endif + +!if !$d(LINKER) +LINKER = TLib +!endif + +!if !$d(BRCC32) +BRCC32 = brcc32 +!endif + + +# --------------------------------------------------------------------------- +!if $d(PATHCPP) +.PATH.CPP = $(PATHCPP) +.PATH.C = $(PATHCPP) +!endif + +!if $d(PATHPAS) +.PATH.PAS = $(PATHPAS) +!endif + +!if $d(PATHASM) +.PATH.ASM = $(PATHASM) +!endif + +!if $d(PATHRC) +.PATH.RC = $(PATHRC) +!endif +# --------------------------------------------------------------------------- +!if "$(LISTFILE)" == "" +COMMA = +!else +COMMA = , +!endif + +$(PROJECT): $(IDLGENFILES) $(OBJFILES) $(RESDEPEN) $(DEFFILE) + $(BCB)\BIN\$(LINKER) /u $@ @&&! + $(LFLAGS) $? $(COMMA) $(LISTFILE) + +! +# --------------------------------------------------------------------------- +.pas.hpp: + $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< } + +.pas.obj: + $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< } + +.cpp.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< } + +.c.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< } + +.c.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< } + +.cpp.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< } + +.asm.obj: + $(BCB)\BIN\$(TASM32) $(AFLAGS) -i$(INCLUDEPATH:;= -i) $(AUSERDEFINES) -d$(SYSDEFINES:;= -d) $<, $@ + +.rc.res: + $(BCB)\BIN\$(BRCC32) $(RFLAGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -fo$@ $< +# --------------------------------------------------------------------------- + + + + diff --git a/reactos/lib/expat/bcb5/libexpat_mtd.def b/reactos/lib/expat/bcb5/libexpat_mtd.def new file mode 100644 index 00000000000..fc1cb9554fa --- /dev/null +++ b/reactos/lib/expat/bcb5/libexpat_mtd.def @@ -0,0 +1,141 @@ +; DEF file for BCB5 +LIBRARY LIBEXPAT_MTD +DESCRIPTION "Implements an XML parser." +EXPORTS + _XML_DefaultCurrent @1 + _XML_ErrorString @2 + _XML_ExpatVersion @3 + _XML_ExpatVersionInfo @4 + _XML_ExternalEntityParserCreate @5 + _XML_GetBase @6 + _XML_GetBuffer @7 + _XML_GetCurrentByteCount @8 + _XML_GetCurrentByteIndex @9 + _XML_GetCurrentColumnNumber @10 + _XML_GetCurrentLineNumber @11 + _XML_GetErrorCode @12 + _XML_GetIdAttributeIndex @13 + _XML_GetInputContext @14 + _XML_GetSpecifiedAttributeCount @15 + _XML_Parse @16 + _XML_ParseBuffer @17 + _XML_ParserCreate @18 + _XML_ParserCreateNS @19 + _XML_ParserCreate_MM @20 + _XML_ParserFree @21 + _XML_SetAttlistDeclHandler @22 + _XML_SetBase @23 + _XML_SetCdataSectionHandler @24 + _XML_SetCharacterDataHandler @25 + _XML_SetCommentHandler @26 + _XML_SetDefaultHandler @27 + _XML_SetDefaultHandlerExpand @28 + _XML_SetDoctypeDeclHandler @29 + _XML_SetElementDeclHandler @30 + _XML_SetElementHandler @31 + _XML_SetEncoding @32 + _XML_SetEndCdataSectionHandler @33 + _XML_SetEndDoctypeDeclHandler @34 + _XML_SetEndElementHandler @35 + _XML_SetEndNamespaceDeclHandler @36 + _XML_SetEntityDeclHandler @37 + _XML_SetExternalEntityRefHandler @38 + _XML_SetExternalEntityRefHandlerArg @39 + _XML_SetNamespaceDeclHandler @40 + _XML_SetNotStandaloneHandler @41 + _XML_SetNotationDeclHandler @42 + _XML_SetParamEntityParsing @43 + _XML_SetProcessingInstructionHandler @44 + _XML_SetReturnNSTriplet @45 + _XML_SetStartCdataSectionHandler @46 + _XML_SetStartDoctypeDeclHandler @47 + _XML_SetStartElementHandler @48 + _XML_SetStartNamespaceDeclHandler @49 + _XML_SetUnknownEncodingHandler @50 + _XML_SetUnparsedEntityDeclHandler @51 + _XML_SetUserData @52 + _XML_SetXmlDeclHandler @53 + _XML_UseParserAsHandlerArg @54 +; added with version 1.95.3 + _XML_ParserReset @55 + _XML_SetSkippedEntityHandler @56 +; added with version 1.95.5 + _XML_GetFeatureList @57 + _XML_UseForeignDTD @58 +; added with version 1.95.6 + _XML_FreeContentModel @59 + _XML_MemMalloc @60 + _XML_MemRealloc @61 + _XML_MemFree @62 +; added with version 1.95.8 + _XML_StopParser @63 + _XML_ResumeParser @64 + _XML_GetParsingStatus @65 + +; Aliases for MS compatible names + XML_DefaultCurrent = _XML_DefaultCurrent + XML_ErrorString = _XML_ErrorString + XML_ExpatVersion = _XML_ExpatVersion + XML_ExpatVersionInfo = _XML_ExpatVersionInfo + XML_ExternalEntityParserCreate = _XML_ExternalEntityParserCreate + XML_GetBase = _XML_GetBase + XML_GetBuffer = _XML_GetBuffer + XML_GetCurrentByteCount = _XML_GetCurrentByteCount + XML_GetCurrentByteIndex = _XML_GetCurrentByteIndex + XML_GetCurrentColumnNumber = _XML_GetCurrentColumnNumber + XML_GetCurrentLineNumber = _XML_GetCurrentLineNumber + XML_GetErrorCode = _XML_GetErrorCode + XML_GetIdAttributeIndex = _XML_GetIdAttributeIndex + XML_GetInputContext = _XML_GetInputContext + XML_GetSpecifiedAttributeCount = _XML_GetSpecifiedAttributeCount + XML_Parse = _XML_Parse + XML_ParseBuffer = _XML_ParseBuffer + XML_ParserCreate = _XML_ParserCreate + XML_ParserCreateNS = _XML_ParserCreateNS + XML_ParserCreate_MM = _XML_ParserCreate_MM + XML_ParserFree = _XML_ParserFree + XML_SetAttlistDeclHandler = _XML_SetAttlistDeclHandler + XML_SetBase = _XML_SetBase + XML_SetCdataSectionHandler = _XML_SetCdataSectionHandler + XML_SetCharacterDataHandler = _XML_SetCharacterDataHandler + XML_SetCommentHandler = _XML_SetCommentHandler + XML_SetDefaultHandler = _XML_SetDefaultHandler + XML_SetDefaultHandlerExpand = _XML_SetDefaultHandlerExpand + XML_SetDoctypeDeclHandler = _XML_SetDoctypeDeclHandler + XML_SetElementDeclHandler = _XML_SetElementDeclHandler + XML_SetElementHandler = _XML_SetElementHandler + XML_SetEncoding = _XML_SetEncoding + XML_SetEndCdataSectionHandler = _XML_SetEndCdataSectionHandler + XML_SetEndDoctypeDeclHandler = _XML_SetEndDoctypeDeclHandler + XML_SetEndElementHandler = _XML_SetEndElementHandler + XML_SetEndNamespaceDeclHandler = _XML_SetEndNamespaceDeclHandler + XML_SetEntityDeclHandler = _XML_SetEntityDeclHandler + XML_SetExternalEntityRefHandler = _XML_SetExternalEntityRefHandler + XML_SetExternalEntityRefHandlerArg = _XML_SetExternalEntityRefHandlerArg + XML_SetNamespaceDeclHandler = _XML_SetNamespaceDeclHandler + XML_SetNotStandaloneHandler = _XML_SetNotStandaloneHandler + XML_SetNotationDeclHandler = _XML_SetNotationDeclHandler + XML_SetParamEntityParsing = _XML_SetParamEntityParsing + XML_SetProcessingInstructionHandler = _XML_SetProcessingInstructionHandler + XML_SetReturnNSTriplet = _XML_SetReturnNSTriplet + XML_SetStartCdataSectionHandler = _XML_SetStartCdataSectionHandler + XML_SetStartDoctypeDeclHandler = _XML_SetStartDoctypeDeclHandler + XML_SetStartElementHandler = _XML_SetStartElementHandler + XML_SetStartNamespaceDeclHandler = _XML_SetStartNamespaceDeclHandler + XML_SetUnknownEncodingHandler = _XML_SetUnknownEncodingHandler + XML_SetUnparsedEntityDeclHandler = _XML_SetUnparsedEntityDeclHandler + XML_SetUserData = _XML_SetUserData + XML_SetXmlDeclHandler = _XML_SetXmlDeclHandler + XML_UseParserAsHandlerArg = _XML_UseParserAsHandlerArg + XML_ParserReset = _XML_ParserReset + XML_SetSkippedEntityHandler = _XML_SetSkippedEntityHandler + XML_GetFeatureList = _XML_GetFeatureList + XML_UseForeignDTD = _XML_UseForeignDTD + XML_FreeContentModel = _XML_FreeContentModel + XML_MemMalloc = _XML_MemMalloc + XML_MemRealloc = _XML_MemRealloc + XML_MemFree = _XML_MemFree + XML_StopParser = _XML_StopParser + XML_ResumeParser = _XML_ResumeParser + XML_GetParsingStatus = _XML_GetParsingStatus + diff --git a/reactos/lib/expat/bcb5/libexpatw_mtd.def b/reactos/lib/expat/bcb5/libexpatw_mtd.def new file mode 100644 index 00000000000..418462df5a4 --- /dev/null +++ b/reactos/lib/expat/bcb5/libexpatw_mtd.def @@ -0,0 +1,140 @@ +; DEF file for BCB5 +LIBRARY LIBEXPATW_MTD +DESCRIPTION "Implements an XML parser." +EXPORTS + _XML_DefaultCurrent @1 + _XML_ErrorString @2 + _XML_ExpatVersion @3 + _XML_ExpatVersionInfo @4 + _XML_ExternalEntityParserCreate @5 + _XML_GetBase @6 + _XML_GetBuffer @7 + _XML_GetCurrentByteCount @8 + _XML_GetCurrentByteIndex @9 + _XML_GetCurrentColumnNumber @10 + _XML_GetCurrentLineNumber @11 + _XML_GetErrorCode @12 + _XML_GetIdAttributeIndex @13 + _XML_GetInputContext @14 + _XML_GetSpecifiedAttributeCount @15 + _XML_Parse @16 + _XML_ParseBuffer @17 + _XML_ParserCreate @18 + _XML_ParserCreateNS @19 + _XML_ParserCreate_MM @20 + _XML_ParserFree @21 + _XML_SetAttlistDeclHandler @22 + _XML_SetBase @23 + _XML_SetCdataSectionHandler @24 + _XML_SetCharacterDataHandler @25 + _XML_SetCommentHandler @26 + _XML_SetDefaultHandler @27 + _XML_SetDefaultHandlerExpand @28 + _XML_SetDoctypeDeclHandler @29 + _XML_SetElementDeclHandler @30 + _XML_SetElementHandler @31 + _XML_SetEncoding @32 + _XML_SetEndCdataSectionHandler @33 + _XML_SetEndDoctypeDeclHandler @34 + _XML_SetEndElementHandler @35 + _XML_SetEndNamespaceDeclHandler @36 + _XML_SetEntityDeclHandler @37 + _XML_SetExternalEntityRefHandler @38 + _XML_SetExternalEntityRefHandlerArg @39 + _XML_SetNamespaceDeclHandler @40 + _XML_SetNotStandaloneHandler @41 + _XML_SetNotationDeclHandler @42 + _XML_SetParamEntityParsing @43 + _XML_SetProcessingInstructionHandler @44 + _XML_SetReturnNSTriplet @45 + _XML_SetStartCdataSectionHandler @46 + _XML_SetStartDoctypeDeclHandler @47 + _XML_SetStartElementHandler @48 + _XML_SetStartNamespaceDeclHandler @49 + _XML_SetUnknownEncodingHandler @50 + _XML_SetUnparsedEntityDeclHandler @51 + _XML_SetUserData @52 + _XML_SetXmlDeclHandler @53 + _XML_UseParserAsHandlerArg @54 +; added with version 1.95.3 + _XML_ParserReset @55 + _XML_SetSkippedEntityHandler @56 +; added with version 1.95.5 + _XML_GetFeatureList @57 + _XML_UseForeignDTD @58 +; added with version 1.95.6 + _XML_FreeContentModel @59 + _XML_MemMalloc @60 + _XML_MemRealloc @61 + _XML_MemFree @62 +; added with version 1.95.8 + _XML_StopParser @63 + _XML_ResumeParser @64 + _XML_GetParsingStatus @65 + +; Aliases for MS compatible names + XML_DefaultCurrent = _XML_DefaultCurrent + XML_ErrorString = _XML_ErrorString + XML_ExpatVersion = _XML_ExpatVersion + XML_ExpatVersionInfo = _XML_ExpatVersionInfo + XML_ExternalEntityParserCreate = _XML_ExternalEntityParserCreate + XML_GetBase = _XML_GetBase + XML_GetBuffer = _XML_GetBuffer + XML_GetCurrentByteCount = _XML_GetCurrentByteCount + XML_GetCurrentByteIndex = _XML_GetCurrentByteIndex + XML_GetCurrentColumnNumber = _XML_GetCurrentColumnNumber + XML_GetCurrentLineNumber = _XML_GetCurrentLineNumber + XML_GetErrorCode = _XML_GetErrorCode + XML_GetIdAttributeIndex = _XML_GetIdAttributeIndex + XML_GetInputContext = _XML_GetInputContext + XML_GetSpecifiedAttributeCount = _XML_GetSpecifiedAttributeCount + XML_Parse = _XML_Parse + XML_ParseBuffer = _XML_ParseBuffer + XML_ParserCreate = _XML_ParserCreate + XML_ParserCreateNS = _XML_ParserCreateNS + XML_ParserCreate_MM = _XML_ParserCreate_MM + XML_ParserFree = _XML_ParserFree + XML_SetAttlistDeclHandler = _XML_SetAttlistDeclHandler + XML_SetBase = _XML_SetBase + XML_SetCdataSectionHandler = _XML_SetCdataSectionHandler + XML_SetCharacterDataHandler = _XML_SetCharacterDataHandler + XML_SetCommentHandler = _XML_SetCommentHandler + XML_SetDefaultHandler = _XML_SetDefaultHandler + XML_SetDefaultHandlerExpand = _XML_SetDefaultHandlerExpand + XML_SetDoctypeDeclHandler = _XML_SetDoctypeDeclHandler + XML_SetElementDeclHandler = _XML_SetElementDeclHandler + XML_SetElementHandler = _XML_SetElementHandler + XML_SetEncoding = _XML_SetEncoding + XML_SetEndCdataSectionHandler = _XML_SetEndCdataSectionHandler + XML_SetEndDoctypeDeclHandler = _XML_SetEndDoctypeDeclHandler + XML_SetEndElementHandler = _XML_SetEndElementHandler + XML_SetEndNamespaceDeclHandler = _XML_SetEndNamespaceDeclHandler + XML_SetEntityDeclHandler = _XML_SetEntityDeclHandler + XML_SetExternalEntityRefHandler = _XML_SetExternalEntityRefHandler + XML_SetExternalEntityRefHandlerArg = _XML_SetExternalEntityRefHandlerArg + XML_SetNamespaceDeclHandler = _XML_SetNamespaceDeclHandler + XML_SetNotStandaloneHandler = _XML_SetNotStandaloneHandler + XML_SetNotationDeclHandler = _XML_SetNotationDeclHandler + XML_SetParamEntityParsing = _XML_SetParamEntityParsing + XML_SetProcessingInstructionHandler = _XML_SetProcessingInstructionHandler + XML_SetReturnNSTriplet = _XML_SetReturnNSTriplet + XML_SetStartCdataSectionHandler = _XML_SetStartCdataSectionHandler + XML_SetStartDoctypeDeclHandler = _XML_SetStartDoctypeDeclHandler + XML_SetStartElementHandler = _XML_SetStartElementHandler + XML_SetStartNamespaceDeclHandler = _XML_SetStartNamespaceDeclHandler + XML_SetUnknownEncodingHandler = _XML_SetUnknownEncodingHandler + XML_SetUnparsedEntityDeclHandler = _XML_SetUnparsedEntityDeclHandler + XML_SetUserData = _XML_SetUserData + XML_SetXmlDeclHandler = _XML_SetXmlDeclHandler + XML_UseParserAsHandlerArg = _XML_UseParserAsHandlerArg + XML_ParserReset = _XML_ParserReset + XML_SetSkippedEntityHandler = _XML_SetSkippedEntityHandler + XML_GetFeatureList = _XML_GetFeatureList + XML_UseForeignDTD = _XML_UseForeignDTD + XML_FreeContentModel = _XML_FreeContentModel + XML_MemMalloc = _XML_MemMalloc + XML_MemRealloc = _XML_MemRealloc + XML_MemFree = _XML_MemFree + XML_StopParser = _XML_StopParser + XML_ResumeParser = _XML_ResumeParser + XML_GetParsingStatus = _XML_GetParsingStatus diff --git a/reactos/lib/expat/bcb5/makefile.mak b/reactos/lib/expat/bcb5/makefile.mak new file mode 100644 index 00000000000..548815eafe7 --- /dev/null +++ b/reactos/lib/expat/bcb5/makefile.mak @@ -0,0 +1,37 @@ +all: setup expat expatw expat_static expatw_static elements outline xmlwf + +setup: + setup + +expat: + make -l -fexpat.mak + +expatw: + make -l -fexpatw.mak + +expat_static: + make -l -fexpat_static.mak + +expatw_static: + make -l -fexpatw_static.mak + +elements: + make -l -felements.mak + +outline: + make -l -foutline.mak + +xmlwf: + make -l -fxmlwf.mak + +clean: +# works on Win98/ME +# deltree /y release\obj +# works on WinNT/2000 + del /s/f/q release\obj + +distclean: +# works on Win98/ME +# deltree /y release\*.* +# works on WinNT/2000 + del /s/f/q release\* diff --git a/reactos/lib/expat/bcb5/outline.bpf b/reactos/lib/expat/bcb5/outline.bpf new file mode 100644 index 00000000000..52dce830163 --- /dev/null +++ b/reactos/lib/expat/bcb5/outline.bpf @@ -0,0 +1,4 @@ +USEUNIT("..\examples\outline.c"); +USELIB("Release\libexpat_mtd.lib"); +//--------------------------------------------------------------------------- +main diff --git a/reactos/lib/expat/bcb5/outline.bpr b/reactos/lib/expat/bcb5/outline.bpr new file mode 100644 index 00000000000..e0ae5cdeebd --- /dev/null +++ b/reactos/lib/expat/bcb5/outline.bpr @@ -0,0 +1,132 @@ +<?xml version='1.0' encoding='utf-8' ?> +<!-- C++Builder XML Project --> +<PROJECT> + <MACROS> + <VERSION value="BCB.05.03"/> + <PROJECT value="Release\outline.exe"/> + <OBJFILES value="Release\obj\examples\outline.obj"/> + <RESFILES value=""/> + <IDLFILES value=""/> + <IDLGENFILES value=""/> + <DEFFILE value=""/> + <RESDEPEN value="$(RESFILES)"/> + <LIBFILES value="Release\libexpat_mtd.lib"/> + <LIBRARIES value=""/> + <SPARELIBS value=""/> + <PACKAGES value="VCL50.bpi VCLX50.bpi bcbsmp50.bpi QRPT50.bpi VCLDB50.bpi VCLBDE50.bpi + ibsmp50.bpi VCLDBX50.bpi TEEUI50.bpi TEEDB50.bpi TEE50.bpi TEEQR50.bpi + VCLIB50.bpi bcbie50.bpi VCLIE50.bpi INETDB50.bpi INET50.bpi NMFAST50.bpi + dclocx50.bpi bcb2kaxserver50.bpi dclusr50.bpi"/> + <PATHCPP value=".;..\examples"/> + <PATHPAS value=".;"/> + <PATHRC value=".;"/> + <PATHASM value=".;"/> + <DEBUGLIBPATH value="$(BCB)\lib\debug"/> + <RELEASELIBPATH value="$(BCB)\lib\release"/> + <LINKER value="ilink32"/> + <USERDEFINES value="WIN32;NDEBUG;_CONSOLE"/> + <SYSDEFINES value="_NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL"/> + <MAINSOURCE value="outline.bpf"/> + <INCLUDEPATH value="..\examples;$(BCB)\include"/> + <LIBPATH value="..\examples;$(BCB)\lib;$(RELEASELIBPATH)"/> + <WARNINGS value="-w-par -w-8027 -w-8026"/> + </MACROS> + <OPTIONS> + <IDLCFLAGS value="-I$(BCB)\include"/> + <CFLAG1 value="-O2 -X- -a8 -b -k- -vi -q -tWM -I..\lib -c"/> + <PFLAGS value="-N2Release\obj\examples -N0Release\obj\examples -$Y- -$L- -$D-"/> + <RFLAGS value="/l 0x409 /d "NDEBUG" /i$(BCB)\include"/> + <AFLAGS value="/mx /w2 /zn"/> + <LFLAGS value="-IRelease\obj\examples -D"" -ap -Tpe -x -Gn -q"/> + </OPTIONS> + <LINKER> + <ALLOBJ value="c0x32.obj $(OBJFILES)"/> + <ALLRES value="$(RESFILES)"/> + <ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cw32mti.lib"/> + </LINKER> + <IDEOPTIONS> +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=3 +Item0=..\examples;$(BCB)\include +Item1=$(BCB)\include +Item2=$(BCB)\include;$(BCB)\include\mfc;$(BCB)\include\atl; + +[HistoryLists\hlLibraryPath] +Count=4 +Item0=..\examples;$(BCB)\lib;$(RELEASELIBPATH) +Item1=..\examples;$(BCB)\lib;..\examples\$(RELEASELIBPATH) +Item2=$(BCB)\lib;$(RELEASELIBPATH) +Item3=$(BCB)\lib;$(RELEASELIBPATH);;$(BCB)\lib\psdk; + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=6 +Item0=WIN32;NDEBUG;_CONSOLE +Item1=WIN32;NDEBUG;_CONSOLE;XML_STATIC +Item2=WIN32;NDEBUG;_CONSOLE;_DEBUG;XML_STATIC +Item3=WIN32;NDEBUG;_CONSOLE;_DEBUG;XML_UNICODE_WCHAR_T;_UNICODE;XML_STATIC +Item4=WIN32;NDEBUG;_CONSOLE;_DEBUG;XML_UNICODE_WCHAR_T;_UNICODE +Item5=WIN32;NDEBUG;_CONSOLE;_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=4 +Item0=Release\obj\examples +Item1=Release\obj\outline +Item2=..\examples\Release +Item3=Release + +[HistoryLists\hlFinalOutputDir] +Count=1 +Item0=Release\ + +[Debugging] +DebugSourceDirs= + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + </IDEOPTIONS> +</PROJECT> \ No newline at end of file diff --git a/reactos/lib/expat/bcb5/outline.mak b/reactos/lib/expat/bcb5/outline.mak new file mode 100644 index 00000000000..510b541f647 --- /dev/null +++ b/reactos/lib/expat/bcb5/outline.mak @@ -0,0 +1,186 @@ +# --------------------------------------------------------------------------- +!if !$d(BCB) +BCB = $(MAKEDIR)\.. +!endif + +# --------------------------------------------------------------------------- +# IDE SECTION +# --------------------------------------------------------------------------- +# The following section of the project makefile is managed by the BCB IDE. +# It is recommended to use the IDE to change any of the values in this +# section. +# --------------------------------------------------------------------------- + +VERSION = BCB.05.03 +# --------------------------------------------------------------------------- +PROJECT = Release\outline.exe +OBJFILES = Release\obj\examples\outline.obj +RESFILES = +MAINSOURCE = outline.bpf +RESDEPEN = $(RESFILES) +LIBFILES = Release\libexpat_mtd.lib +IDLFILES = +IDLGENFILES = +LIBRARIES = +PACKAGES = VCL50.bpi VCLX50.bpi bcbsmp50.bpi QRPT50.bpi VCLDB50.bpi VCLBDE50.bpi \ + ibsmp50.bpi VCLDBX50.bpi TEEUI50.bpi TEEDB50.bpi TEE50.bpi TEEQR50.bpi \ + VCLIB50.bpi bcbie50.bpi VCLIE50.bpi INETDB50.bpi INET50.bpi NMFAST50.bpi \ + dclocx50.bpi bcb2kaxserver50.bpi dclusr50.bpi +SPARELIBS = +DEFFILE = +# --------------------------------------------------------------------------- +PATHCPP = .;..\examples +PATHASM = .; +PATHPAS = .; +PATHRC = .; +DEBUGLIBPATH = $(BCB)\lib\debug +RELEASELIBPATH = $(BCB)\lib\release +USERDEFINES = WIN32;NDEBUG;_CONSOLE +SYSDEFINES = _NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL +INCLUDEPATH = ..\examples;$(BCB)\include +LIBPATH = ..\examples;$(BCB)\lib;$(RELEASELIBPATH) +WARNINGS= -w-par -w-8027 -w-8026 +# --------------------------------------------------------------------------- +CFLAG1 = -O2 -X- -a8 -b -k- -vi -q -tWM -I..\lib -c +IDLCFLAGS = -I$(BCB)\include +PFLAGS = -N2Release\obj\examples -N0Release\obj\examples -$Y- -$L- -$D- +RFLAGS = /l 0x409 /d "NDEBUG" /i$(BCB)\include +AFLAGS = /mx /w2 /zn +LFLAGS = -IRelease\obj\examples -D"" -ap -Tpe -x -Gn -q +# --------------------------------------------------------------------------- +ALLOBJ = c0x32.obj $(OBJFILES) +ALLRES = $(RESFILES) +ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cw32mti.lib +# --------------------------------------------------------------------------- +!ifdef IDEOPTIONS + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +!endif + + + + + +# --------------------------------------------------------------------------- +# MAKE SECTION +# --------------------------------------------------------------------------- +# This section of the project file is not used by the BCB IDE. It is for +# the benefit of building from the command-line using the MAKE utility. +# --------------------------------------------------------------------------- + +.autodepend +# --------------------------------------------------------------------------- +!if "$(USERDEFINES)" != "" +AUSERDEFINES = -d$(USERDEFINES:;= -d) +!else +AUSERDEFINES = +!endif + +!if !$d(BCC32) +BCC32 = bcc32 +!endif + +!if !$d(CPP32) +CPP32 = cpp32 +!endif + +!if !$d(DCC32) +DCC32 = dcc32 +!endif + +!if !$d(TASM32) +TASM32 = tasm32 +!endif + +!if !$d(LINKER) +LINKER = ilink32 +!endif + +!if !$d(BRCC32) +BRCC32 = brcc32 +!endif + + +# --------------------------------------------------------------------------- +!if $d(PATHCPP) +.PATH.CPP = $(PATHCPP) +.PATH.C = $(PATHCPP) +!endif + +!if $d(PATHPAS) +.PATH.PAS = $(PATHPAS) +!endif + +!if $d(PATHASM) +.PATH.ASM = $(PATHASM) +!endif + +!if $d(PATHRC) +.PATH.RC = $(PATHRC) +!endif +# --------------------------------------------------------------------------- +$(PROJECT): $(IDLGENFILES) $(OBJFILES) $(RESDEPEN) $(DEFFILE) + $(BCB)\BIN\$(LINKER) @&&! + $(LFLAGS) -L$(LIBPATH) + + $(ALLOBJ), + + $(PROJECT),, + + $(ALLLIB), + + $(DEFFILE), + + $(ALLRES) +! +# --------------------------------------------------------------------------- +.pas.hpp: + $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< } + +.pas.obj: + $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< } + +.cpp.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< } + +.c.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< } + +.c.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< } + +.cpp.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< } + +.asm.obj: + $(BCB)\BIN\$(TASM32) $(AFLAGS) -i$(INCLUDEPATH:;= -i) $(AUSERDEFINES) -d$(SYSDEFINES:;= -d) $<, $@ + +.rc.res: + $(BCB)\BIN\$(BRCC32) $(RFLAGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -fo$@ $< +# --------------------------------------------------------------------------- + + + + diff --git a/reactos/lib/expat/bcb5/setup.bat b/reactos/lib/expat/bcb5/setup.bat new file mode 100755 index 00000000000..6f4b573179e --- /dev/null +++ b/reactos/lib/expat/bcb5/setup.bat @@ -0,0 +1,9 @@ +REM CommandInterpreter: $(COMSPEC) +if not exist .\release\nul mkdir release +if not exist .\release\obj\nul mkdir release\obj +if not exist .\release\obj\libexpat\nul mkdir release\obj\libexpat +if not exist .\release\obj\libexpatw\nul mkdir release\obj\libexpatw +if not exist .\release\obj\libexpat_static\nul mkdir release\obj\libexpat_static +if not exist .\release\obj\libexpatw_static\nul mkdir release\obj\libexpatw_static +if not exist .\release\obj\examples\nul mkdir release\obj\examples +if not exist .\release\obj\xmlwf\nul mkdir release\obj\xmlwf diff --git a/reactos/lib/expat/bcb5/xmlwf.bpf b/reactos/lib/expat/bcb5/xmlwf.bpf new file mode 100644 index 00000000000..d06208e811b --- /dev/null +++ b/reactos/lib/expat/bcb5/xmlwf.bpf @@ -0,0 +1,7 @@ +USEUNIT("..\xmlwf\codepage.c"); +USEUNIT("..\xmlwf\win32filemap.c"); +USEUNIT("..\xmlwf\xmlfile.c"); +USEUNIT("..\xmlwf\xmlwf.c"); +USELIB("Release\libexpat_mtd.lib"); +//--------------------------------------------------------------------------- +main diff --git a/reactos/lib/expat/bcb5/xmlwf.bpr b/reactos/lib/expat/bcb5/xmlwf.bpr new file mode 100644 index 00000000000..d33a1538764 --- /dev/null +++ b/reactos/lib/expat/bcb5/xmlwf.bpr @@ -0,0 +1,136 @@ +<?xml version='1.0' encoding='utf-8' ?> +<!-- C++Builder XML Project --> +<PROJECT> + <MACROS> + <VERSION value="BCB.05.03"/> + <PROJECT value="Release\xmlwf.exe"/> + <OBJFILES value="Release\obj\xmlwf\codepage.obj Release\obj\xmlwf\win32filemap.obj + Release\obj\xmlwf\xmlfile.obj Release\obj\xmlwf\xmlwf.obj"/> + <RESFILES value=""/> + <IDLFILES value=""/> + <IDLGENFILES value=""/> + <DEFFILE value=""/> + <RESDEPEN value="$(RESFILES)"/> + <LIBFILES value="Release\libexpat_mtd.lib"/> + <LIBRARIES value=""/> + <SPARELIBS value=""/> + <PACKAGES value="VCL50.bpi VCLX50.bpi bcbsmp50.bpi QRPT50.bpi VCLDB50.bpi VCLBDE50.bpi + ibsmp50.bpi VCLDBX50.bpi TEEUI50.bpi TEEDB50.bpi TEE50.bpi TEEQR50.bpi + VCLIB50.bpi bcbie50.bpi VCLIE50.bpi INETDB50.bpi INET50.bpi NMFAST50.bpi + dclocx50.bpi bcb2kaxserver50.bpi dclusr50.bpi"/> + <PATHCPP value=".;..\xmlwf"/> + <PATHPAS value=".;"/> + <PATHRC value=".;"/> + <PATHASM value=".;"/> + <DEBUGLIBPATH value="$(BCB)\lib\debug"/> + <RELEASELIBPATH value="$(BCB)\lib\release"/> + <LINKER value="ilink32"/> + <USERDEFINES value="NDEBUG;WIN32;_CONSOLE;COMPILED_FROM_DSP"/> + <SYSDEFINES value="_NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL"/> + <MAINSOURCE value="xmlwf.bpf"/> + <INCLUDEPATH value="..\xmlwf;$(BCB)\include"/> + <LIBPATH value="..\xmlwf;$(BCB)\lib;$(RELEASELIBPATH)"/> + <WARNINGS value="-w-8065 -w-par -w-8027 -w-8026"/> + </MACROS> + <OPTIONS> + <IDLCFLAGS value="-I$(BCB)\include"/> + <CFLAG1 value="-O2 -X- -a8 -b -k- -vi -q -tWM -I..\lib -c"/> + <PFLAGS value="-N2Release\obj\xmlwf -N0Release\obj\xmlwf -$Y- -$L- -$D-"/> + <RFLAGS value="/l 0x409 /d "NDEBUG" /i$(BCB)\include"/> + <AFLAGS value="/mx /w2 /zn"/> + <LFLAGS value="-IRelease\obj\xmlwf -D"" -ap -Tpe -x -Gn -q"/> + </OPTIONS> + <LINKER> + <ALLOBJ value="c0x32.obj $(OBJFILES)"/> + <ALLRES value="$(RESFILES)"/> + <ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cw32mti.lib"/> + </LINKER> + <IDEOPTIONS> +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=4 +Item0=..\xmlwf;$(BCB)\include +Item1=$(BCB)\include +Item2=$(BCB)\include;$(BCB)\include\mfc;$(BCB)\include\atl +Item3=$(BCB)\include;$(BCB)\include\mfc;$(BCB)\include\atl; + +[HistoryLists\hlLibraryPath] +Count=5 +Item0=..\xmlwf;$(BCB)\lib;$(RELEASELIBPATH) +Item1=..\xmlwf;$(BCB)\lib;..\xmlwf\$(RELEASELIBPATH) +Item2=$(BCB)\lib;$(RELEASELIBPATH) +Item3=$(BCB)\lib;$(RELEASELIBPATH);$(BCB)\lib\psdk +Item4=$(BCB)\lib;$(RELEASELIBPATH);;$(BCB)\lib\psdk; + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=6 +Item0=NDEBUG;WIN32;_CONSOLE;COMPILED_FROM_DSP +Item1=NDEBUG;WIN32;_CONSOLE;COMPILED_FROM_DSP;_DEBUG;XML_UNICODE_WCHAR_T;_UNICODE +Item2=NDEBUG;WIN32;_CONSOLE;COMPILED_FROM_DSP;_DEBUG;XML_UNICODE_WCHAR_T +Item3=NDEBUG;WIN32;_CONSOLE;COMPILED_FROM_DSP;_DEBUG +Item4=NDEBUG;WIN32;_CONSOLE;COMPILED_FROM_DSP;_DEBUG;_UNICODE;XML_UNICODE_WCHAR_T +Item5=NDEBUG;WIN32;_CONSOLE;COMPILED_FROM_DSP;_DEBUG;_UNICODE + +[HistoryLists\hlIntOutputDir] +Count=3 +Item0=Release\obj\xmlwf +Item1=..\xmlwf\Release +Item2=Release + +[HistoryLists\hlFinalOutputDir] +Count=3 +Item0=Release\ +Item1=Release +Item2=.\Release\ + +[Debugging] +DebugSourceDirs= + +[Parameters] +RunParams=sample.xml +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + </IDEOPTIONS> +</PROJECT> \ No newline at end of file diff --git a/reactos/lib/expat/bcb5/xmlwf.mak b/reactos/lib/expat/bcb5/xmlwf.mak new file mode 100644 index 00000000000..f74126e454a --- /dev/null +++ b/reactos/lib/expat/bcb5/xmlwf.mak @@ -0,0 +1,187 @@ +# --------------------------------------------------------------------------- +!if !$d(BCB) +BCB = $(MAKEDIR)\.. +!endif + +# --------------------------------------------------------------------------- +# IDE SECTION +# --------------------------------------------------------------------------- +# The following section of the project makefile is managed by the BCB IDE. +# It is recommended to use the IDE to change any of the values in this +# section. +# --------------------------------------------------------------------------- + +VERSION = BCB.05.03 +# --------------------------------------------------------------------------- +PROJECT = Release\xmlwf.exe +OBJFILES = Release\obj\xmlwf\codepage.obj Release\obj\xmlwf\win32filemap.obj \ + Release\obj\xmlwf\xmlfile.obj Release\obj\xmlwf\xmlwf.obj +RESFILES = +MAINSOURCE = xmlwf.bpf +RESDEPEN = $(RESFILES) +LIBFILES = Release\libexpat_mtd.lib +IDLFILES = +IDLGENFILES = +LIBRARIES = +PACKAGES = VCL50.bpi VCLX50.bpi bcbsmp50.bpi QRPT50.bpi VCLDB50.bpi VCLBDE50.bpi \ + ibsmp50.bpi VCLDBX50.bpi TEEUI50.bpi TEEDB50.bpi TEE50.bpi TEEQR50.bpi \ + VCLIB50.bpi bcbie50.bpi VCLIE50.bpi INETDB50.bpi INET50.bpi NMFAST50.bpi \ + dclocx50.bpi bcb2kaxserver50.bpi dclusr50.bpi +SPARELIBS = +DEFFILE = +# --------------------------------------------------------------------------- +PATHCPP = .;..\xmlwf +PATHASM = .; +PATHPAS = .; +PATHRC = .; +DEBUGLIBPATH = $(BCB)\lib\debug +RELEASELIBPATH = $(BCB)\lib\release +USERDEFINES = NDEBUG;WIN32;_CONSOLE;COMPILED_FROM_DSP +SYSDEFINES = _NO_VCL;_ASSERTE;NO_STRICT;_RTLDLL +INCLUDEPATH = ..\xmlwf;$(BCB)\include +LIBPATH = ..\xmlwf;$(BCB)\lib;$(RELEASELIBPATH) +WARNINGS= -w-8065 -w-par -w-8027 -w-8026 +# --------------------------------------------------------------------------- +CFLAG1 = -O2 -X- -a8 -b -k- -vi -q -tWM -I..\lib -c +IDLCFLAGS = -I$(BCB)\include +PFLAGS = -N2Release\obj\xmlwf -N0Release\obj\xmlwf -$Y- -$L- -$D- +RFLAGS = /l 0x409 /d "NDEBUG" /i$(BCB)\include +AFLAGS = /mx /w2 /zn +LFLAGS = -IRelease\obj\xmlwf -D"" -ap -Tpe -x -Gn -q +# --------------------------------------------------------------------------- +ALLOBJ = c0x32.obj $(OBJFILES) +ALLRES = $(RESFILES) +ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cw32mti.lib +# --------------------------------------------------------------------------- +!ifdef IDEOPTIONS + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +!endif + + + + + +# --------------------------------------------------------------------------- +# MAKE SECTION +# --------------------------------------------------------------------------- +# This section of the project file is not used by the BCB IDE. It is for +# the benefit of building from the command-line using the MAKE utility. +# --------------------------------------------------------------------------- + +.autodepend +# --------------------------------------------------------------------------- +!if "$(USERDEFINES)" != "" +AUSERDEFINES = -d$(USERDEFINES:;= -d) +!else +AUSERDEFINES = +!endif + +!if !$d(BCC32) +BCC32 = bcc32 +!endif + +!if !$d(CPP32) +CPP32 = cpp32 +!endif + +!if !$d(DCC32) +DCC32 = dcc32 +!endif + +!if !$d(TASM32) +TASM32 = tasm32 +!endif + +!if !$d(LINKER) +LINKER = ilink32 +!endif + +!if !$d(BRCC32) +BRCC32 = brcc32 +!endif + + +# --------------------------------------------------------------------------- +!if $d(PATHCPP) +.PATH.CPP = $(PATHCPP) +.PATH.C = $(PATHCPP) +!endif + +!if $d(PATHPAS) +.PATH.PAS = $(PATHPAS) +!endif + +!if $d(PATHASM) +.PATH.ASM = $(PATHASM) +!endif + +!if $d(PATHRC) +.PATH.RC = $(PATHRC) +!endif +# --------------------------------------------------------------------------- +$(PROJECT): $(IDLGENFILES) $(OBJFILES) $(RESDEPEN) $(DEFFILE) + $(BCB)\BIN\$(LINKER) @&&! + $(LFLAGS) -L$(LIBPATH) + + $(ALLOBJ), + + $(PROJECT),, + + $(ALLLIB), + + $(DEFFILE), + + $(ALLRES) +! +# --------------------------------------------------------------------------- +.pas.hpp: + $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< } + +.pas.obj: + $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< } + +.cpp.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< } + +.c.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< } + +.c.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< } + +.cpp.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< } + +.asm.obj: + $(BCB)\BIN\$(TASM32) $(AFLAGS) -i$(INCLUDEPATH:;= -i) $(AUSERDEFINES) -d$(SYSDEFINES:;= -d) $<, $@ + +.rc.res: + $(BCB)\BIN\$(BRCC32) $(RFLAGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -fo$@ $< +# --------------------------------------------------------------------------- + + + + diff --git a/reactos/lib/expat/buildconf.sh b/reactos/lib/expat/buildconf.sh new file mode 100644 index 00000000000..2fc5932a3a8 --- /dev/null +++ b/reactos/lib/expat/buildconf.sh @@ -0,0 +1,102 @@ +#! /bin/sh + +#-------------------------------------------------------------------------- +# autoconf 2.52 or newer +# +ac_version="`${AUTOCONF:-autoconf} --version 2> /dev/null | head -1 | sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`" +if test -z "$ac_version"; then + echo "ERROR: autoconf not found." + echo " You need autoconf version 2.52 or newer installed." + exit 1 +fi +IFS=.; set $ac_version; IFS=' ' +if test "$1" = "2" -a "$2" -lt "52" || test "$1" -lt "2"; then + echo "ERROR: autoconf version $ac_version found." + echo " You need autoconf version 2.52 or newer installed." + exit 1 +fi + +echo "found: autoconf version $ac_version (ok)" + +#-------------------------------------------------------------------------- +# libtool 1.4 or newer +# + +# +# find libtoolize, or glibtoolize on MacOS X +# +libtoolize=`conftools/PrintPath glibtoolize libtoolize` +if [ "x$libtoolize" = "x" ]; then + echo "ERROR: libtoolize not found." + echo " You need libtool version 1.4 or newer installed" + exit 1 +fi + +lt_pversion="`$libtoolize --version 2> /dev/null | sed -e 's/^[^0-9]*//'`" + +# convert something like 1.4p1 to 1.4.p1 +lt_version="`echo $lt_pversion | sed -e 's/\([a-z]*\)$/.\1/'`" + +IFS=.; set $lt_version; IFS=' ' +if test "$1" = "1" -a "$2" -lt "4"; then + echo "ERROR: libtool version $lt_pversion found." + echo " You need libtool version 1.4 or newer installed" + exit 1 +fi + +echo "found: libtool version $lt_pversion (ok)" + +#-------------------------------------------------------------------------- + +# Remove any libtool files so one can switch between libtool 1.3 +# and libtool 1.4 by simply rerunning the buildconf script. +(cd conftools/; rm -f ltmain.sh ltconfig) + +# +# Create the libtool helper files +# +echo "Copying libtool helper files ..." + +# +# Note: we don't use --force (any more) since we have a special +# config.guess/config.sub that we want to ensure is used. +# +# --copy to avoid symlinks; we want originals for the distro +# --automake to make it shut up about "things to do" +# +$libtoolize --copy --automake + +# +# Find the libtool.m4 file. The developer/packager can set the LIBTOOL_M4 +# environment variable to specify its location. If that variable is not +# set, then we'll assume a "standard" libtool installation and try to +# derive its location. +# +ltpath=`dirname $libtoolize` +ltfile=${LIBTOOL_M4-`cd $ltpath/../share/aclocal ; pwd`/libtool.m4} +cp $ltfile conftools/libtool.m4 + +echo "Using libtool.m4 from ${ltfile}." + +#-------------------------------------------------------------------------- + +### for a little while... remove stray aclocal.m4 files from +### developers' working copies. we no longer use it. (nothing else +### will remove it, and leaving it creates big problems) +rm -f aclocal.m4 + +# +# Generate the autoconf header template (expat_config.h.in) and ./configure +# +echo "Creating expat_config.h.in ..." +${AUTOHEADER:-autoheader} + +echo "Creating configure ..." +### do some work to toss config.cache? +${AUTOCONF:-autoconf} + +# toss this; it gets created by autoconf on some systems +rm -rf autom4te*.cache + +# exit with the right value, so any calling script can continue +exit 0 diff --git a/reactos/lib/expat/configure.in b/reactos/lib/expat/configure.in new file mode 100644 index 00000000000..035cd421595 --- /dev/null +++ b/reactos/lib/expat/configure.in @@ -0,0 +1,124 @@ +dnl configuration script for expat +dnl Process this file with autoconf to produce a configure script. +dnl +dnl Copyright 2000 Clark Cooper +dnl +dnl This file is part of EXPAT. +dnl +dnl EXPAT is free software; you can redistribute it and/or modify it +dnl under the terms of the License (based on the MIT/X license) contained +dnl in the file COPYING that comes with this distribution. +dnl + +dnl Ensure that Expat is configured with autoconf 2.52 or newer +AC_PREREQ(2.52) + +dnl Get the version number of Expat, using m4's esyscmd() command to run +dnl the command at m4-generation time. This allows us to create an m4 +dnl symbol holding the correct version number. AC_INIT() requires the +dnl version number at m4-time, rather than when ./configure is run, so +dnl all this must happen as part of m4, not as part of the shell code +dnl contained in ./configure. +dnl +dnl NOTE: esyscmd() is a GNU M4 extension. Thus, we wrap it in an appropriate +dnl test. I believe this test will work, but I don't have a place with non- +dnl GNU M4 to test it right now. +define([expat_version], ifdef([__gnu__], + [esyscmd(conftools/get-version.sh lib/expat.h)], + [1.95.x])) +AC_INIT(expat, expat_version, expat-bugs@mail.libexpat.org) +undefine([expat_version]) + +AC_CONFIG_SRCDIR(Makefile.in) +AC_CONFIG_AUX_DIR(conftools) + + +dnl +dnl Increment LIBREVISION if source code has changed at all +dnl +dnl If the API has changed, increment LIBCURRENT and set LIBREVISION to 0 +dnl +dnl If the API changes compatibly (i.e. simply adding a new function +dnl without changing or removing earlier interfaces), then increment LIBAGE. +dnl +dnl If the API changes incompatibly set LIBAGE back to 0 +dnl + +LIBCURRENT=5 +LIBREVISION=0 +LIBAGE=5 + +AC_CONFIG_HEADER(expat_config.h) + +sinclude(conftools/libtool.m4) +sinclude(conftools/ac_c_bigendian_cross.m4) + +AC_LIBTOOL_WIN32_DLL +AC_PROG_LIBTOOL + +AC_SUBST(LIBCURRENT) +AC_SUBST(LIBREVISION) +AC_SUBST(LIBAGE) + +dnl Checks for programs. +AC_PROG_CC +AC_PROG_INSTALL + +if test "$GCC" = yes ; then + dnl + dnl Be careful about adding the -fexceptions option; some versions of + dnl GCC don't support it and it causes extra warnings that are only + dnl distracting; avoid. + dnl + OLDCFLAGS="$CFLAGS -Wall -Wmissing-prototypes -Wstrict-prototypes" + CFLAGS="$OLDCFLAGS -fexceptions" + AC_MSG_CHECKING(whether gcc accepts -fexceptions) + AC_TRY_COMPILE(,(void)1, + AC_MSG_RESULT(yes), + AC_MSG_RESULT(no); CFLAGS="$OLDCFLAGS") +fi + +dnl Checks for header files. +AC_HEADER_STDC + +dnl Checks for typedefs, structures, and compiler characteristics. + +dnl Note: Avoid using AC_C_BIGENDIAN because it does not +dnl work in a cross compile. +AC_C_BIGENDIAN_CROSS + +AC_C_CONST +AC_TYPE_SIZE_T +AC_CHECK_FUNCS(memmove bcopy) + +dnl Only needed for xmlwf: +AC_CHECK_HEADERS(fcntl.h unistd.h) +AC_TYPE_OFF_T +AC_FUNC_MMAP + +if test "$ac_cv_func_mmap_fixed_mapped" = "yes"; then + FILEMAP=unixfilemap +else + FILEMAP=readfilemap +fi +AC_SUBST(FILEMAP) + +dnl Only needed for regression tests: +AC_CHECK_HEADERS(check.h) + +dnl Some basic configuration: +AC_DEFINE([XML_NS], 1, + [Define to make XML Namespaces functionality available.]) +AC_DEFINE([XML_DTD], 1, + [Define to make parameter entity parsing functionality available.]) +AC_DEFINE([XML_CONTEXT_BYTES], 1024, + [Define to specify how much context to retain around the current parse point.]) + +AC_CONFIG_FILES(Makefile) +AC_OUTPUT + +abs_srcdir="`cd $srcdir && pwd`" +abs_builddir="`pwd`" +if test "$abs_srcdir" != "$abs_builddir"; then + make mkdir-init +fi diff --git a/reactos/lib/expat/conftools/.cvsignore b/reactos/lib/expat/conftools/.cvsignore new file mode 100644 index 00000000000..159a91484a7 --- /dev/null +++ b/reactos/lib/expat/conftools/.cvsignore @@ -0,0 +1,3 @@ +libtool.m4 +ltconfig +ltmain.sh diff --git a/reactos/lib/expat/conftools/PrintPath b/reactos/lib/expat/conftools/PrintPath new file mode 100644 index 00000000000..869f2aa762a --- /dev/null +++ b/reactos/lib/expat/conftools/PrintPath @@ -0,0 +1,116 @@ +#!/bin/sh +# Look for program[s] somewhere in $PATH. +# +# Options: +# -s +# Do not print out full pathname. (silent) +# -pPATHNAME +# Look in PATHNAME instead of $PATH +# +# Usage: +# PrintPath [-s] [-pPATHNAME] program [program ...] +# +# Initially written by Jim Jagielski for the Apache configuration mechanism +# (with kudos to Kernighan/Pike) +# +# This script falls under the Apache License. +# See http://www.apache.org/licenses/LICENSE + +## +# Some "constants" +## +pathname=$PATH +echo="yes" + +## +# Find out what OS we are running for later on +## +os=`(uname) 2>/dev/null` + +## +# Parse command line +## +for args in $* +do + case $args in + -s ) echo="no" ;; + -p* ) pathname="`echo $args | sed 's/^..//'`" ;; + * ) programs="$programs $args" ;; + esac +done + +## +# Now we make the adjustments required for OS/2 and everyone +# else :) +# +# First of all, all OS/2 programs have the '.exe' extension. +# Next, we adjust PATH (or what was given to us as PATH) to +# be whitespace seperated directories. +# Finally, we try to determine the best flag to use for +# test/[] to look for an executable file. OS/2 just has '-r' +# but with other OSs, we do some funny stuff to check to see +# if test/[] knows about -x, which is the prefered flag. +## + +if [ "x$os" = "xOS/2" ] +then + ext=".exe" + pathname=`echo -E $pathname | + sed 's/^;/.;/ + s/;;/;.;/g + s/;$/;./ + s/;/ /g + s/\\\\/\\//g' ` + test_exec_flag="-r" +else + ext="" # No default extensions + pathname=`echo $pathname | + sed 's/^:/.:/ + s/::/:.:/g + s/:$/:./ + s/:/ /g' ` + # Here is how we test to see if test/[] can handle -x + testfile="pp.t.$$" + + cat > $testfile <<ENDTEST +#!/bin/sh +if [ -x / ] || [ -x /bin ] || [ -x /bin/ls ]; then + exit 0 +fi +exit 1 +ENDTEST + + if `/bin/sh $testfile 2>/dev/null`; then + test_exec_flag="-x" + else + test_exec_flag="-r" + fi + rm -f $testfile +fi + +for program in $programs +do + for path in $pathname + do + if [ $test_exec_flag $path/${program}${ext} ] && \ + [ ! -d $path/${program}${ext} ]; then + if [ "x$echo" = "xyes" ]; then + echo $path/${program}${ext} + fi + exit 0 + fi + +# Next try without extension (if one was used above) + if [ "x$ext" != "x" ]; then + if [ $test_exec_flag $path/${program} ] && \ + [ ! -d $path/${program} ]; then + if [ "x$echo" = "xyes" ]; then + echo $path/${program} + fi + exit 0 + fi + fi + done +done +exit 1 + diff --git a/reactos/lib/expat/conftools/ac_c_bigendian_cross.m4 b/reactos/lib/expat/conftools/ac_c_bigendian_cross.m4 new file mode 100644 index 00000000000..6a2fc3d9004 --- /dev/null +++ b/reactos/lib/expat/conftools/ac_c_bigendian_cross.m4 @@ -0,0 +1,81 @@ +dnl @synopsis AC_C_BIGENDIAN_CROSS +dnl +dnl Check endianess even when crosscompiling +dnl (partially based on the original AC_C_BIGENDIAN). +dnl +dnl The implementation will create a binary, and instead of running +dnl the binary it will be grep'ed for some symbols that will look +dnl different for different endianess of the binary. +dnl +dnl @version $Id: ac_c_bigendian_cross.m4,v 1.1 2004/03/24 00:04:44 mf Exp $ +dnl @author Guido Draheim <guidod@gmx.de> +dnl +AC_DEFUN([AC_C_BIGENDIAN_CROSS], +[AC_CACHE_CHECK(whether byte ordering is bigendian, ac_cv_c_bigendian, +[ac_cv_c_bigendian=unknown +# See if sys/param.h defines the BYTE_ORDER macro. +AC_TRY_COMPILE([#include <sys/types.h> +#include <sys/param.h>], [ +#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN + bogus endian macros +#endif], [# It does; now see whether it defined to BIG_ENDIAN or not. +AC_TRY_COMPILE([#include <sys/types.h> +#include <sys/param.h>], [ +#if BYTE_ORDER != BIG_ENDIAN + not big endian +#endif], ac_cv_c_bigendian=yes, ac_cv_c_bigendian=no)]) +if test $ac_cv_c_bigendian = unknown; then +AC_TRY_RUN([main () { + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long l; + char c[sizeof (long)]; + } u; + u.l = 1; + exit (u.c[sizeof (long) - 1] == 1); +}], ac_cv_c_bigendian=no, ac_cv_c_bigendian=yes, +[ echo $ac_n "cross-compiling... " 2>&AC_FD_MSG ]) +fi]) +if test $ac_cv_c_bigendian = unknown; then +AC_MSG_CHECKING(to probe for byte ordering) +[ +cat >conftest.c <<EOF +short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; +short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; +void _ascii() { char* s = (char*) ascii_mm; s = (char*) ascii_ii; } +short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; +short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; +void _ebcdic() { char* s = (char*) ebcdic_mm; s = (char*) ebcdic_ii; } +int main() { _ascii (); _ebcdic (); return 0; } +EOF +] if test -f conftest.c ; then + if ${CC-cc} -c conftest.c -o conftest.o && test -f conftest.o ; then + if test `grep -l BIGenDianSyS conftest.o` ; then + echo $ac_n ' big endian probe OK, ' 1>&AC_FD_MSG + ac_cv_c_bigendian=yes + fi + if test `grep -l LiTTleEnDian conftest.o` ; then + echo $ac_n ' little endian probe OK, ' 1>&AC_FD_MSG + if test $ac_cv_c_bigendian = yes ; then + ac_cv_c_bigendian=unknown; + else + ac_cv_c_bigendian=no + fi + fi + echo $ac_n 'guessing bigendian ... ' >&AC_FD_MSG + fi + fi +AC_MSG_RESULT($ac_cv_c_bigendian) +fi +if test $ac_cv_c_bigendian = yes; then + AC_DEFINE(WORDS_BIGENDIAN, 1, [whether byteorder is bigendian]) + BYTEORDER=4321 +else + BYTEORDER=1234 +fi +AC_DEFINE_UNQUOTED(BYTEORDER, $BYTEORDER, [1234 = LIL_ENDIAN, 4321 = BIGENDIAN]) +if test $ac_cv_c_bigendian = unknown; then + AC_MSG_ERROR(unknown endianess - sorry, please pre-set ac_cv_c_bigendian) +fi +]) diff --git a/reactos/lib/expat/conftools/config.guess b/reactos/lib/expat/conftools/config.guess new file mode 100644 index 00000000000..6cfac28c854 --- /dev/null +++ b/reactos/lib/expat/conftools/config.guess @@ -0,0 +1,1344 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002 Free Software Foundation, Inc. + +timestamp='2002-03-20' + +# This file 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +##################################################################### +# This file contains changes for Apache, clearly marked below. +# These changes are hereby donated to the public domain. +##################################################################### + +# Originally written by Per Bothner <per@bothner.com>. +# Please send patches to <config-patches@gnu.org>. Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to <config-patches@gnu.org>." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + + +dummy=dummy-$$ +trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int dummy(){}" > $dummy.c ; + for c in cc gcc c89 c99 ; do + ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ; + if test $? = 0 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + rm -f $dummy.c $dummy.o $dummy.rel ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit 0 ;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + arc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + macppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvmeppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + pmax:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mipseb-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sun3:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + wgrisc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + alpha:OSF1:*:*) + if test $UNAME_RELEASE = "V4.0"; then + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + fi + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + cat <<EOF >$dummy.s + .data +\$Lformat: + .byte 37,100,45,37,120,10,0 # "%d-%x\n" + + .text + .globl main + .align 4 + .ent main +main: + .frame \$30,16,\$26,0 + ldgp \$29,0(\$27) + .prologue 1 + .long 0x47e03d80 # implver \$0 + lda \$2,-1 + .long 0x47e20c21 # amask \$2,\$1 + lda \$16,\$Lformat + mov \$0,\$17 + not \$1,\$18 + jsr \$26,printf + ldgp \$29,0(\$26) + mov 0,\$16 + jsr \$26,exit + .end main +EOF + eval $set_cc_for_build + $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null + if test "$?" = 0 ; then + case `./$dummy` in + 0-0) + UNAME_MACHINE="alpha" + ;; + 1-0) + UNAME_MACHINE="alphaev5" + ;; + 1-1) + UNAME_MACHINE="alphaev56" + ;; + 1-101) + UNAME_MACHINE="alphapca56" + ;; + 2-303) + UNAME_MACHINE="alphaev6" + ;; + 2-307) + UNAME_MACHINE="alphaev67" + ;; + 2-1307) + UNAME_MACHINE="alphaev68" + ;; + esac + fi + rm -f $dummy.s $dummy + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit 0 ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit 0 ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit 0 ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit 0;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit 0 ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit 0 ;; +######################### +# Apache changes +# +# *:OS/390:*:*) +# echo i370-ibm-openedition +# exit 0 ;; + *:OS390:*:* | *:OS/390:*:*) + echo s390-ibm-os390 + exit 0 ;; + *:OS400:*:* | *:OS/400:*:*) + echo as400-ibm-os400 + exit 0 ;; + *:OS/2:*:*) + echo "i386-pc-os2_emx" + exit 0;; +# +# end Apache changes +######################### + *:OS/390:*:*) + echo i370-ibm-openedition + exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit 0;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit 0 ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit 0 ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit 0 ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit 0 ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit 0 ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit 0 ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include <stdio.h> /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD $dummy.c -o $dummy \ + && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit 0 ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit 0 ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit 0 ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit 0 ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit 0 ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit 0 ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit 0 ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include <sys/systemcfg.h> + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo rs6000-ibm-aix3.2.5 + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit 0 ;; + *:AIX:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit 0 ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit 0 ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit 0 ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit 0 ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit 0 ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include <stdlib.h> + #include <unistd.h> + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null) && HP_ARCH=`./$dummy` + if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi + rm -f $dummy.c $dummy + fi ;; + esac + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit 0 ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include <unistd.h> + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit 0 ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit 0 ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit 0 ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit 0 ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3D:*:*:*) + echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit 0 ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:FreeBSD:*:*) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit 0 ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit 0 ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit 0 ;; + x86:Interix*:3*) + echo i386-pc-interix3 + exit 0 ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i386-pc-interix + exit 0 ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit 0 ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + *:GNU:*:*) + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit 0 ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit 0 ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + rm -f $dummy.c + test x"${CPU}" != x && echo "${CPU}-pc-linux-gnu" && exit 0 + ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit 0 ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit 0 ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit 0 ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit 0 ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit 0 ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit 0 ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit 0 ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit 0 ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit 0 ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit 0 ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include <features.h> + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #ifdef __INTEL_COMPILER + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + rm -f $dummy.c + test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 + test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit 0 ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit 0 ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit 0 ;; + i*86:*:5:[78]*) + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit 0 ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name` + echo ${UNAME_MACHINE}-pc-isc$UNAME_REL + elif /bin/uname -X 2>/dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` + (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit 0 ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit 0 ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit 0 ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit 0 ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit 0 ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit 0 ;; + M68*:*:R3V[567]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4.3${OS_REL} && exit 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit 0 ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says <Richard.M.Bartel@ccMail.Census.GOV> + echo i586-unisys-sysv4 + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes <hewes@openmarket.com>. + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit 0 ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit 0 ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit 0 ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit 0 ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit 0 ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit 0 ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit 0 ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit 0 ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit 0 ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit 0 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Darwin:*:*) + echo `uname -p`-apple-darwin${UNAME_RELEASE} + exit 0 ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit 0 ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit 0 ;; + NSR-[GKLNPTVW]:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit 0 ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit 0 ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit 0 ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit 0 ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit 0 ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit 0 ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit 0 ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit 0 ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit 0 ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit 0 ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit 0 ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit 0 ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit 0 ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit 0 ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c <<EOF +#ifdef _SEQUENT_ +# include <sys/types.h> +# include <sys/utsname.h> +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include <sys/param.h> + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include <sys/param.h> +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0 +rm -f $dummy.c $dummy + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac +fi + +cat >&2 <<EOF +$0: unable to guess system type + +This script, last modified $timestamp, has failed to recognize +the operating system you are using. It is advised that you +download the most up to date version of the config scripts from + + ftp://ftp.gnu.org/pub/gnu/config/ + +If the version you run ($0) is already up to date, please +send the following data and any information you think might be +pertinent to <config-patches@gnu.org> in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/reactos/lib/expat/conftools/config.sub b/reactos/lib/expat/conftools/config.sub new file mode 100644 index 00000000000..043d45b3982 --- /dev/null +++ b/reactos/lib/expat/conftools/config.sub @@ -0,0 +1,1507 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002 Free Software Foundation, Inc. + +timestamp='2002-03-07' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file 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., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +##################################################################### +# This file contains changes for Apache, clearly marked below. +# These changes are hereby donated to the public domain. +##################################################################### + +# Please send patches to <config-patches@gnu.org>. Submit a context +# diff and a properly formatted ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to <config-patches@gnu.org>." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit 0;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +######################## +# changes for Apache +# + tpf | os390 | vmcms) + os=-$maybe_os + basic_machine=s390; + ;; + os400) + os=-$maybe_os + basic_machine=as400; + ;; + mvs) + os=-mvs + basic_machine=i370; + ;; +# +# end Apache changes +######################## + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ + | c4x | clipper \ + | d10v | d30v | dsp16xx \ + | fr30 \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | m32r | m68000 | m68k | m88k | mcore \ + | mips | mips16 | mips64 | mips64el | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el | mips64vr4300 \ + | mips64vr4300el | mips64vr5000 | mips64vr5000el \ + | mipsbe | mipseb | mipsel | mipsle | mipstx39 | mipstx39el \ + | mipsisa32 | mipsisa64 \ + | mn10200 | mn10300 \ + | ns16k | ns32k \ + | openrisc | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | sh | sh[34] | sh[34]eb | shbe | shle | sh64 \ + | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ + | strongarm \ + | tahoe | thumb | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xscale | xstormy16 | xtensa \ + | z8k) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armv*-* \ + | avr-* \ + | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c54x-* \ + | clipper-* | cydra-* \ + | d10v-* | d30v-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fr30-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | m32r-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | mcore-* \ + | mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \ + | mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipseb-* \ + | mipsle-* | mipsel-* | mipstx39-* | mipstx39el-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* | sh64-* \ + | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ + | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ + | xtensa-* \ + | ymp-* \ + | z8k-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + mmix*) + basic_machine=mmix-knuth + os=-mmixware + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + or32 | or32-*) + basic_machine=or32-unknown + os=-coff + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon) + basic_machine=i686-pc + ;; + pentiumii | pentium2) + basic_machine=i686-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; +######################## +# changes for Apache +# + as400*) + basic_machine=as400-ibm + ;; +# +# end Apache changes +######################## + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3d) + basic_machine=alpha-cray + os=-unicos + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + windows32) + basic_machine=i386-pc + os=-windows32-msvcrt + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh3 | sh4 | sh3eb | sh4eb) + basic_machine=sh-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparc | sparcv9 | sparcv9b) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + c4x*) + basic_machine=c4x-none + os=-coff + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; +######################## +# changes for Apache +# + -os2_emx | -tpf* | -os390* | -vmcms* | -os400* ) + ;; +# +# end Apache changes +######################## + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ + | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto*) + os=-nto-qnx + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; +######################## +# changes for Apache +# +# *-ibm) +# os=-aix +# ;; +# + *-ibm) + case $basic_machine in + s390*) + os=-os390; + ;; + i370*) + os=-mvs; + ;; + as400*) + os=-os400; + ;; + *) + os=-aix + ;; + esac + ;; +# +# end Apache changes +######################## + + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -vxsim* | -vxworks*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/reactos/lib/expat/conftools/expat.m4 b/reactos/lib/expat/conftools/expat.m4 new file mode 100644 index 00000000000..e5d4871c9eb --- /dev/null +++ b/reactos/lib/expat/conftools/expat.m4 @@ -0,0 +1,43 @@ +dnl Check if --with-expat[=PREFIX] is specified and +dnl Expat >= 1.95.0 is installed in the system. +dnl If yes, substitute EXPAT_CFLAGS, EXPAT_LIBS with regard to +dnl the specified PREFIX and set with_expat to PREFIX, or 'yes' if PREFIX +dnl has not been specified. Also HAVE_LIBEXPAT, HAVE_EXPAT_H are defined. +dnl If --with-expat has not been specified, set with_expat to 'no'. +dnl In addition, an Automake conditional EXPAT_INSTALLED is set accordingly. +dnl This is necessary to adapt a whole lot of packages that have expat +dnl bundled as a static library. +AC_DEFUN(AM_WITH_EXPAT, +[ AC_ARG_WITH(expat, + [ --with-expat=PREFIX Use system Expat library], + , with_expat=no) + + AM_CONDITIONAL(EXPAT_INSTALLED, test $with_expat != no) + + EXPAT_CFLAGS= + EXPAT_LIBS= + if test $with_expat != no; then + if test $with_expat != yes; then + EXPAT_CFLAGS="-I$with_expat/include" + EXPAT_LIBS="-L$with_expat/lib" + fi + AC_CHECK_LIB(expat, XML_ParserCreate, + [ EXPAT_LIBS="$EXPAT_LIBS -lexpat" + expat_found=yes ], + [ expat_found=no ], + "$EXPAT_LIBS") + if test $expat_found = no; then + AC_MSG_ERROR([Could not find the Expat library]) + fi + expat_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $EXPAT_CFLAGS" + AC_CHECK_HEADERS(expat.h, , expat_found=no) + if test $expat_found = no; then + AC_MSG_ERROR([Could not find expat.h]) + fi + CFLAGS="$expat_save_CFLAGS" + fi + + AC_SUBST(EXPAT_CFLAGS) + AC_SUBST(EXPAT_LIBS) +]) diff --git a/reactos/lib/expat/conftools/get-version.sh b/reactos/lib/expat/conftools/get-version.sh new file mode 100644 index 00000000000..a70e0fb47a8 --- /dev/null +++ b/reactos/lib/expat/conftools/get-version.sh @@ -0,0 +1,46 @@ +#!/bin/sh +# +# USAGE: get-version.sh path/to/expat.h +# +# This script will print Expat's version number on stdout. For example: +# +# $ ./conftools/get-version.sh ./lib/expat.h +# 1.95.3 +# $ +# + +if test $# = 0; then + echo "ERROR: pathname for expat.h was not provided." + echo "" + echo "USAGE: $0 path/to/expat.h" + exit 1 +fi +if test $# != 1; then + echo "ERROR: too many arguments were provided." + echo "" + echo "USAGE: $0 path/to/expat.h" + exit 1 +fi + +hdr="$1" +if test ! -r "$hdr"; then + echo "ERROR: '$hdr' does not exist, or is not readable." + exit 1 +fi + +MAJOR_VERSION="`sed -n -e '/MAJOR_VERSION/s/[^0-9]*//gp' $hdr`" +MINOR_VERSION="`sed -n -e '/MINOR_VERSION/s/[^0-9]*//gp' $hdr`" +MICRO_VERSION="`sed -n -e '/MICRO_VERSION/s/[^0-9]*//gp' $hdr`" + +# Determine how to tell echo not to print the trailing \n. This is +# similar to Autoconf's @ECHO_C@ and @ECHO_N@; however, we don't +# generate this file via autoconf (in fact, get-version.sh is used +# to *create* ./configure), so we just do something similar inline. +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ;; + *c*,* ) ECHO_N=-n ECHO_C= ;; + *) ECHO_N= ECHO_C='\c' ;; +esac + +echo $ECHO_N "$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION$ECHO_C" diff --git a/reactos/lib/expat/conftools/install-sh b/reactos/lib/expat/conftools/install-sh new file mode 100644 index 00000000000..e9de23842dc --- /dev/null +++ b/reactos/lib/expat/conftools/install-sh @@ -0,0 +1,251 @@ +#!/bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5 (mit/util/scripts/install.sh). +# +# Copyright 1991 by the Massachusetts Institute of Technology +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of M.I.T. not be used in advertising or +# publicity pertaining to distribution of the software without specific, +# written prior permission. M.I.T. makes no representations about the +# suitability of this software for any purpose. It is provided "as is" +# without express or implied warranty. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. It can only install one file at a time, a restriction +# shared with many OS's install programs. + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + true +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + chmodcmd="" + else + instcmd=mkdir + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + true + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + true + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + true + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' +' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + true + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + true + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 diff --git a/reactos/lib/expat/conftools/mkinstalldirs b/reactos/lib/expat/conftools/mkinstalldirs new file mode 100644 index 00000000000..8279b265306 --- /dev/null +++ b/reactos/lib/expat/conftools/mkinstalldirs @@ -0,0 +1,40 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman <friedman@prep.ai.mit.edu> +# Created: 1993-05-16 +# Public domain + +# $Id: mkinstalldirs,v 1.1 2004/03/24 00:04:44 mf Exp $ + +errstatus=0 + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# mkinstalldirs ends here diff --git a/reactos/lib/expat/doc/expat.png b/reactos/lib/expat/doc/expat.png new file mode 100644 index 0000000000000000000000000000000000000000..c41a7e63b7217d6f7863de1d11d6522ec9e21d29 GIT binary patch literal 1717 zcmb7_|34FmAIF!lv$4>bXhfD;oP1fijibqz`P$a`HnZeN`Ep{!=uDxOK5j@3V_BFl z7qUdimv%eWxtiEX$(NYStc+Wl<=aR9!RPaMKVI+m<N10#UcbKHxi~)$Es!Ay003xt zVqMSd+}<6zf1|RqH^(}^g6ai~F9rbM<byZD)pl6@CvOi|!1mW+_0$#ZI2s99LJ|M~ z*8QqoBa_sP9TS-B>FWj@QPTi`ZM7s}$9ICZo~{^wO2tQ}v{-sXlV9`$(H(0f`o#UD zQ%C2ln`Gn(ffC;OwI?tmxazZf_>(Ug4AIrJg?#Nj(^o3QO4gB&8>@?;BbB$jJano? z@HzF#-<lpZa=ZDzBXejz<%v-~U$jE$3{9~LVawl4$P~-8wiIzy0Q$gl(aQ1^tuFwr zR+V{UBHrF<O!*50F(j7Dl@oQpJ6LO;TC0|J2_=tGSL7Z#Kth(nse~<CFMW=BeBtNv zeK+n&yJ{^tB%XDgzeV$>&HsdAVKD{0vcLWmBK3sb72*5xY?{p8pn~kk?IL-N-B8kp zg({Jx%W5Mg?@ixbw`J@4q5awAfnjaX15l}I^Oyzod%77_w?`n8$>v96faw0fvmNbU zcupYFWVL&$$~E@W`h`RHPHMegEH(&pBEE3&2^JzRlP)xoHrs;H){NZoke&rS9dBA$ zQ=U!6w2W1!#ok@*JV2egBCb&TUK|tRhh8kOfp|suECmRWgxK}o12;_XfGhd>DI|N% zQyiyz8ZY$?BV33K1}^UM)x`P)6JMdf(q)&_n}21G8xPCBa$4Xp9M#Qzc0E18k&|32 zV-4j;@%B_h$OjVyh2aj*%aQOPP|h&SnK%<afjt@PwG*_*vrviPq9t%Umm%`_jt~kP z+=zj_J?1D`pF)W%cn=3oU^jkTKHK4yn-29l48=gO6Es?8#$n-pl~;v+-&{;sPb!Mn zZFqY3JoOKXEXl05BeMUq-2i;E90_``d@8G^tj7L2`s@)V16kwdvU?1a{hJpJ#_T_8 z{&`+&z+n%Wwv6K}nXrp$xLnGa(RWob;}q8HK1}28`y`(UbWM4IH!V4j^6s`lnw=>6 zW@h*%#8lOr_Rq!J=7~{0h>o)0NEOL)tDdJ-LCY&Ejcf*c?;=J}TYT7+0)uO`;FVCQ z{vtfGF}o;NA49|fn>9m*L}V3R{;<|aS#5Oj!^F>U3>$A+L!6HdK;Ysg4a*BLugQ{= zD5$jHekr93yS86Jf!Ka(eMQa4812jHmTN2i*`3d?-nwp@Ay`2&osq|L8lG=bhuqGA z3DmU&G_!e3x|(jpPlWLo2C_~wY8%XRwomm8p0lFP@LuBV0M0MVel8xI)Ty<I>GoSt zl-e$dp>`+In1@;e=#hre<7xU{z!cn%Bn}s9{Oz9u#8^+~(6GI>2FHxLA+-2RlEkvI z$z*Oe)<V+waD*3;n43K7sMl?R@|~+)em}z9<$I7G>OTM8Ct?g;3{D-qO;)3`2z{OB zI;m`$#bgK#`zZ7gNJ4pLtV8?DhLFf>S=&mNG};oI^h|(r*SaWe0ihK^Ds{iFwNUS! z?WFTA{jHb7#Bj=1M+mmW@1{?i640@roV??QaX%!f26qo;PisE~@xI(7YV@<T#Qjb6 zCG@!V@r!oWEdql;VWKJ|wRDxCFt*oKHwaECrq|7zWZ_YQyK%VDP~)aMkPjTMqD$$j zI>GX}?%uA~@PU032rk=Z`212{YZR?u!u)CkV+@MGnP)lS?mqZ8p6nC2SAQvC+2HkD zFC<VsrM2^KjhQKxBqO5`q`j)=6LWM#^E|wyo!nm-J=+7eWEuhu96$^d)L)JV#;>|7 zVjp)MD$R+S(<HSXVsyY3x|CGQabs^<-dpnVGP~3lRotkUPFjghr{7h>gVM@uL@en< zUpeeUA$aNb+X`)R;EjQIlb4293M?!~&f6;Vl=o3<K@ahfx%dX()=|eH+Q$dKsng|F z+YQ5V<y>D}hEruiX1=2zD7vw2rr<th?hfo%wW>2R#kxXazk!%I=J)Tb4)@@+3MZ<8 zpzmnV?0d4tG1>Z-SX@_Y>yY8v-F9Lc%2jS`ot*B>HjAD$bDmk>)+XTvd;7GD1w{Fm z(~k1`<f)ReEjh}~usI#!AnM7#mG=0}B5Ne=0y*q*j|Ms%;o^_JrCm%v7+E(N`M!^q e{{Qs#HsHaFU)6=2KfpT=1>ouC=i2OYF6+OUzc(EK literal 0 HcmV?d00001 diff --git a/reactos/lib/expat/doc/reference.html b/reactos/lib/expat/doc/reference.html new file mode 100644 index 00000000000..16a0050ea30 --- /dev/null +++ b/reactos/lib/expat/doc/reference.html @@ -0,0 +1,2035 @@ +<?xml version="1.0" encoding="iso-8859-1"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html> +<head> +<!-- Copyright 1999,2000 Clark Cooper <coopercc@netheaven.com> + All rights reserved. + This is free software. You may distribute or modify according to + the terms of the MIT/X License --> + <title>Expat XML Parser + + + + + + + + + + + + + + +
(Expat logo)
Release 1.95.7
+
+ +

Expat is a library, written in C, for parsing XML documents. It's +the underlying XML parser for the open source Mozilla project, Perl's +XML::Parser, Python's xml.parsers.expat, and +other open-source XML parsers.

+ +

This library is the creation of James Clark, who's also given us +groff (an nroff look-alike), Jade (an implemention of ISO's DSSSL +stylesheet language for SGML), XP (a Java XML parser package), XT (a +Java XSL engine). James was also the technical lead on the XML +Working Group at W3C that produced the XML specification.

+ +

This is free software, licensed under the MIT/X Consortium license. You may download it +from the Expat home page. +

+ +

The bulk of this document was originally commissioned as an article +by XML.com. They graciously allowed +Clark Cooper to retain copyright and to distribute it with Expat. +This version has been substantially extended to include documentation +on features which have been added since the original article was +published, and additional information on using the original +interface.

+ +
+

Table of Contents

+ + +
+

Overview

+ +

Expat is a stream-oriented parser. You register callback (or +handler) functions with the parser and then start feeding it the +document. As the parser recognizes parts of the document, it will +call the appropriate handler for that part (if you've registered one.) +The document is fed to the parser in pieces, so you can start parsing +before you have all the document. This also allows you to parse really +huge documents that won't fit into memory.

+ +

Expat can be intimidating due to the many kinds of handlers and +options you can set. But you only need to learn four functions in +order to do 90% of what you'll want to do with it:

+ +
+ +
XML_ParserCreate
+
Create a new parser object.
+ +
XML_SetElementHandler
+
Set handlers for start and end tags.
+ +
XML_SetCharacterDataHandler
+
Set handler for text.
+ +
XML_Parse
+
Pass a buffer full of document to the parser
+
+ +

These functions and others are described in the reference part of this document. The reference +section also describes in detail the parameters passed to the +different types of handlers.

+ +

Let's look at a very simple example program that only uses 3 of the +above functions (it doesn't need to set a character handler.) The +program outline.c prints an +element outline, indenting child elements to distinguish them from the +parent element that contains them. The start handler does all the +work. It prints two indenting spaces for every level of ancestor +elements, then it prints the element and attribute +information. Finally it increments the global Depth +variable.

+ +
+int Depth;
+
+void XMLCALL
+start(void *data, const char *el, const char **attr) {
+  int i;
+
+  for (i = 0; i < Depth; i++)
+    printf("  ");
+
+  printf("%s", el);
+
+  for (i = 0; attr[i]; i += 2) {
+    printf(" %s='%s'", attr[i], attr[i + 1]);
+  }
+
+  printf("\n");
+  Depth++;
+}  /* End of start handler */
+
+ +

The end tag simply does the bookkeeping work of decrementing +Depth.

+
+void XMLCALL
+end(void *data, const char *el) {
+  Depth--;
+}  /* End of end handler */
+
+ +

Note the XMLCALL annotation used for the callbacks. +This is used to ensure that the Expat and the callbacks are using the +same calling convention in case the compiler options used for Expat +itself and the client code are different. Expat tries not to care +what the default calling convention is, though it may require that it +be compiled with a default convention of "cdecl" on some platforms. +For code which uses Expat, however, the calling convention is +specified by the XMLCALL annotation on most platforms; +callbacks should be defined using this annotation.

+ +

The XMLCALL annotation was added in Expat 1.95.7, but +existing working Expat applications don't need to add it (since they +are already using the "cdecl" calling convention, or they wouldn't be +working). The annotation is only needed if the default calling +convention may be something other than "cdecl". To use the annotation +safely with older versions of Expat, you can conditionally define it +after including Expat's header file:

+ +
+#include <expat.h>
+
+#ifndef XMLCALL
+#if defined(_MSC_EXTENSIONS) && !defined(__BEOS__) && !defined(__CYGWIN__)
+#define XMLCALL __cdecl
+#elif defined(__GNUC__)
+#define XMLCALL __attribute__((cdecl))
+#else
+#define XMLCALL
+#endif
+#endif
+
+ +

After creating the parser, the main program just has the job of +shoveling the document to the parser so that it can do its work.

+ +
+

Building and Installing Expat

+ +

The Expat distribution comes as a compressed (with GNU gzip) tar +file. You may download the latest version from Source Forge. After +unpacking this, cd into the directory. Then follow either the Win32 +directions or Unix directions below.

+ +

Building under Win32

+ +

If you're using the GNU compiler under cygwin, follow the Unix +directions in the next section. Otherwise if you have Microsoft's +Developer Studio installed, then from Windows Explorer double-click on +"expat.dsp" in the lib directory and build and install in the usual +manner.

+ +

Alternatively, you may download the Win32 binary package that +contains the "expat.h" include file and a pre-built DLL.

+ +

Building under Unix (or GNU)

+ +

First you'll need to run the configure shell script in order to +configure the Makefiles and headers for your system.

+ +

If you're happy with all the defaults that configure picks for you, +and you have permission on your system to install into /usr/local, you +can install Expat with this sequence of commands:

+ +
+./configure
+make
+make install
+
+ +

There are some options that you can provide to this script, but the +only one we'll mention here is the --prefix option. You +can find out all the options available by running configure with just +the --help option.

+ +

By default, the configure script sets things up so that the library +gets installed in /usr/local/lib and the associated +header file in /usr/local/include. But if you were to +give the option, --prefix=/home/me/mystuff, then the +library and header would get installed in +/home/me/mystuff/lib and +/home/me/mystuff/include respectively.

+ +

Configuring Expat Using the Pre-Processor

+ +

Expat's feature set can be configured using a small number of +pre-processor definitions. The definition of this symbols does not +affect the set of entry points for Expat, only the behavior of the API +and the definition of character types in the case of +XML_UNICODE_WCHAR_T. The symbols are:

+ +
+
XML_DTD
+
Include support for using and reporting DTD-based content. If +this is defined, default attribute values from the DTD are reported +and attribute value normalization occurs based on the type of +attributes. Callbacks can be registered which report information from +the DTD (including content models and attribute definitions) only if +this is defined. Without this, Expat has a smaller memory footprint +and can be faster.
+ +
XML_NS
+
When defined, support for the Namespaces in XML +specification is included.
+ +
XML_UNICODE
+
When defined, character data reported to the application is +encoded in UTF-16 using wide characters of the type +XML_Char. This is implied if +XML_UNICODE_WCHAR_T is defined.
+ +
XML_UNICODE_WCHAR_T
+
If defined, causes the XML_Char character type to be +defined using the wchar_t type; otherwise, unsigned +short is used. Defining this implies +XML_UNICODE.
+ +
XML_CONTEXT_BYTES
+
The number of input bytes of markup context which the parser will +ensure are available for reporting via XML_GetInputContext. This is +normally set to 1024. If this is not defined, the input context will +not be available and XML_GetInputContext will always report NULL. Without +this, Expat has a smaller memory footprint and can be faster.
+ +
XML_STATIC
+
On Windows, this should be set if Expat is going to be linked +statically with the code that calls it; this is required to get all +the right MSVC magic annotations correct. This is ignored on other +platforms.
+
+ +
+

Using Expat

+ +

Compiling and Linking Against Expat

+ +

Unless you installed Expat in a location not expected by your +compiler and linker, all you have to do to use Expat in your programs +is to include the Expat header (#include <expat.h>) +in your files that make calls to it and to tell the linker that it +needs to link against the Expat library. On Unix systems, this would +usually be done with the -lexpat argument. Otherwise, +you'll need to tell the compiler where to look for the Expat header +and the linker where to find the Expat library. You may also need to +take steps to tell the operating system where to find this libary at +run time.

+ +

On a Unix-based system, here's what a Makefile might look like when +Expat is installed in a standard location:

+ +
+CC=cc
+LDFLAGS=
+LIBS= -lexpat
+xmlapp: xmlapp.o
+        $(CC) $(LDFLAGS) -o xmlapp xmlapp.o $(LIBS)
+
+ +

If you installed Expat in, say, /home/me/mystuff, then +the Makefile would look like this:

+ +
+CC=cc
+CFLAGS= -I/home/me/mystuff/include
+LDFLAGS=
+LIBS= -L/home/me/mystuff/lib -lexpat
+xmlapp: xmlapp.o
+        $(CC) $(LDFLAGS) -o xmlapp xmlapp.o $(LIBS)
+
+ +

You'd also have to set the environment variable +LD_LIBRARY_PATH to /home/me/mystuff/lib (or +to ${LD_LIBRARY_PATH}:/home/me/mystuff/lib if +LD_LIBRARY_PATH already has some directories in it) in order to run +your application.

+ +

Expat Basics

+ +

As we saw in the example in the overview, the first step in parsing +an XML document with Expat is to create a parser object. There are three functions in the Expat API for creating a +parser object. However, only two of these (XML_ParserCreate and XML_ParserCreateNS) can be used for +constructing a parser for a top-level document. The object returned +by these functions is an opaque pointer (i.e. "expat.h" declares it as +void *) to data with further internal structure. In order to free the +memory associated with this object you must call XML_ParserFree. Note that if you have +provided any user data that gets stored in the +parser, then your application is responsible for freeing it prior to +calling XML_ParserFree.

+ +

The objects returned by the parser creation functions are good for +parsing only one XML document or external parsed entity. If your +application needs to parse many XML documents, then it needs to create +a parser object for each one. The best way to deal with this is to +create a higher level object that contains all the default +initialization you want for your parser objects.

+ +

Walking through a document hierarchy with a stream oriented parser +will require a good stack mechanism in order to keep track of current +context. For instance, to answer the simple question, "What element +does this text belong to?" requires a stack, since the parser may have +descended into other elements that are children of the current one and +has encountered this text on the way out.

+ +

The things you're likely to want to keep on a stack are the +currently opened element and it's attributes. You push this +information onto the stack in the start handler and you pop it off in +the end handler.

+ +

For some tasks, it is sufficient to just keep information on what +the depth of the stack is (or would be if you had one.) The outline +program shown above presents one example. Another such task would be +skipping over a complete element. When you see the start tag for the +element you want to skip, you set a skip flag and record the depth at +which the element started. When the end tag handler encounters the +same depth, the skipped element has ended and the flag may be +cleared. If you follow the convention that the root element starts at +1, then you can use the same variable for skip flag and skip +depth.

+ +
+void
+init_info(Parseinfo *info) {
+  info->skip = 0;
+  info->depth = 1;
+  /* Other initializations here */
+}  /* End of init_info */
+
+void XMLCALL
+rawstart(void *data, const char *el, const char **attr) {
+  Parseinfo *inf = (Parseinfo *) data;
+
+  if (! inf->skip) {
+    if (should_skip(inf, el, attr)) {
+      inf->skip = inf->depth;
+    }
+    else
+      start(inf, el, attr);     /* This does rest of start handling */
+  }
+
+  inf->depth++;
+}  /* End of rawstart */
+
+void XMLCALL
+rawend(void *data, const char *el) {
+  Parseinfo *inf = (Parseinfo *) data;
+
+  inf->depth--;
+
+  if (! inf->skip)
+    end(inf, el);              /* This does rest of end handling */
+
+  if (inf->skip == inf->depth)
+    inf->skip = 0;
+}  /* End rawend */
+
+ +

Notice in the above example the difference in how depth is +manipulated in the start and end handlers. The end tag handler should +be the mirror image of the start tag handler. This is necessary to +properly model containment. Since, in the start tag handler, we +incremented depth after the main body of start tag code, then +in the end handler, we need to manipulate it before the main +body. If we'd decided to increment it first thing in the start +handler, then we'd have had to decrement it last thing in the end +handler.

+ +

Communicating between handlers

+ +

In order to be able to pass information between different handlers +without using globals, you'll need to define a data structure to hold +the shared variables. You can then tell Expat (with the XML_SetUserData function) to pass a +pointer to this structure to the handlers. This is the first +argument received by most handlers. In the reference section, an argument to a callback function is named +userData and have type void * if the user +data is passed; it will have the type XML_Parser if the +parser itself is passed. When the parser is passed, the user data may +be retrieved using XML_GetUserData.

+ +

One common case where multiple calls to a single handler may need +to communicate using an application data structure is the case when +content passed to the character data handler (set by XML_SetCharacterDataHandler) needs to be accumulated. A +common first-time mistake with any of the event-oriented interfaces to +an XML parser is to expect all the text contained in an element to be +reported by a single call to the character data handler. Expat, like +many other XML parsers, reports such data as a sequence of calls; +there's no way to know when the end of the sequence is reached until a +different callback is made. A buffer referenced by the user data +structure proves both an effective and convenient place to accumulate +character data.

+ + + + +

XML Version

+ +

Expat is an XML 1.0 parser, and as such never complains based on +the value of the version pseudo-attribute in the XML +declaration, if present.

+ +

If an application needs to check the version number (to support +alternate processing), it should use the XML_SetXmlDeclHandler function to +set a handler that uses the information in the XML declaration to +determine what to do. This example shows how to check that only a +version number of "1.0" is accepted:

+ +
+static int wrong_version;
+static XML_Parser parser;
+
+static void XMLCALL
+xmldecl_handler(void            *userData,
+                const XML_Char  *version,
+                const XML_Char  *encoding,
+                int              standalone)
+{
+  static const XML_Char Version_1_0[] = {'1', '.', '0', 0};
+
+  int i;
+
+  for (i = 0; i < (sizeof(Version_1_0) / sizeof(Version_1_0[0])); ++i) {
+    if (version[i] != Version_1_0[i]) {
+      wrong_version = 1;
+      /* also clear all other handlers: */
+      XML_SetCharacterDataHandler(parser, NULL);
+      ...
+      return;
+    }
+  }
+  ...
+}
+
+ +

Namespace Processing

+ +

When the parser is created using the XML_ParserCreateNS, function, Expat +performs namespace processing. Under namespace processing, Expat +consumes xmlns and xmlns:... attributes, +which declare namespaces for the scope of the element in which they +occur. This means that your start handler will not see these +attributes. Your application can still be informed of these +declarations by setting namespace declaration handlers with XML_SetNamespaceDeclHandler.

+ +

Element type and attribute names that belong to a given namespace +are passed to the appropriate handler in expanded form. By default +this expanded form is a concatenation of the namespace URI, the +separator character (which is the 2nd argument to XML_ParserCreateNS), and the local +name (i.e. the part after the colon). Names with undeclared prefixes +are passed through to the handlers unchanged, with the prefix and +colon still attached. Unprefixed attribute names are never expanded, +and unprefixed element names are only expanded when they are in the +scope of a default namespace.

+ +

However if XML_SetReturnNSTriplet has been called with a non-zero +do_nst parameter, then the expanded form for names with +an explicit prefix is a concatenation of: URI, separator, local name, +separator, prefix.

+ +

You can set handlers for the start of a namespace declaration and +for the end of a scope of a declaration with the XML_SetNamespaceDeclHandler +function. The StartNamespaceDeclHandler is called prior to the start +tag handler and the EndNamespaceDeclHandler is called before the +corresponding end tag that ends the namespace's scope. The namespace +start handler gets passed the prefix and URI for the namespace. For a +default namespace declaration (xmlns='...'), the prefix will be null. +The URI will be null for the case where the default namespace is being +unset. The namespace end handler just gets the prefix for the closing +scope.

+ +

These handlers are called for each declaration. So if, for +instance, a start tag had three namespace declarations, then the +StartNamespaceDeclHandler would be called three times before the start +tag handler is called, once for each declaration.

+ +

Character Encodings

+ +

While XML is based on Unicode, and every XML processor is required +to recognized UTF-8 and UTF-16 (1 and 2 byte encodings of Unicode), +other encodings may be declared in XML documents or entities. For the +main document, an XML declaration may contain an encoding +declaration:

+
+<?xml version="1.0" encoding="ISO-8859-2"?>
+
+ +

External parsed entities may begin with a text declaration, which +looks like an XML declaration with just an encoding declaration:

+
+<?xml encoding="Big5"?>
+
+ +

With Expat, you may also specify an encoding at the time of +creating a parser. This is useful when the encoding information may +come from a source outside the document itself (like a higher level +protocol.)

+ +

There are four built-in encodings +in Expat:

+
    +
  • UTF-8
  • +
  • UTF-16
  • +
  • ISO-8859-1
  • +
  • US-ASCII
  • +
+ +

Anything else discovered in an encoding declaration or in the +protocol encoding specified in the parser constructor, triggers a call +to the UnknownEncodingHandler. This handler gets passed +the encoding name and a pointer to an XML_Encoding data +structure. Your handler must fill in this structure and return +XML_STATUS_OK if it knows how to deal with the +encoding. Otherwise the handler should return +XML_STATUS_ERROR. The handler also gets passed a pointer +to an optional application data structure that you may indicate when +you set the handler.

+ +

Expat places restrictions on character encodings that it can +support by filling in the XML_Encoding structure. +include file:

+
    +
  1. Every ASCII character that can appear in a well-formed XML document +must be represented by a single byte, and that byte must correspond to +it's ASCII encoding (except for the characters $@\^'{}~)
  2. +
  3. Characters must be encoded in 4 bytes or less.
  4. +
  5. All characters encoded must have Unicode scalar values less than or +equal to 65535 (0xFFFF)This does not apply to the built-in support +for UTF-16 and UTF-8
  6. +
  7. No character may be encoded by more that one distinct sequence of +bytes
  8. +
+ +

XML_Encoding contains an array of integers that +correspond to the 1st byte of an encoding sequence. If the value in +the array for a byte is zero or positive, then the byte is a single +byte encoding that encodes the Unicode scalar value contained in the +array. A -1 in this array indicates a malformed byte. If the value is +-2, -3, or -4, then the byte is the beginning of a 2, 3, or 4 byte +sequence respectively. Multi-byte sequences are sent to the convert +function pointed at in the XML_Encoding structure. This +function should return the Unicode scalar value for the sequence or -1 +if the sequence is malformed.

+ +

One pitfall that novice Expat users are likely to fall into is that +although Expat may accept input in various encodings, the strings that +it passes to the handlers are always encoded in UTF-8 or UTF-16 +(depending on how Expat was compiled). Your application is responsible +for any translation of these strings into other encodings.

+ +

Handling External Entity References

+ +

Expat does not read or parse external entities directly. Note that +any external DTD is a special case of an external entity. If you've +set no ExternalEntityRefHandler, then external entity +references are silently ignored. Otherwise, it calls your handler with +the information needed to read and parse the external entity.

+ +

Your handler isn't actually responsible for parsing the entity, but +it is responsible for creating a subsidiary parser with XML_ExternalEntityParserCreate that will do the job. This +returns an instance of XML_Parser that has handlers and +other data structures initialized from the parent parser. You may then +use XML_Parse or XML_ParseBuffer calls against this +parser. Since external entities my refer to other external entities, +your handler should be prepared to be called recursively.

+ +

Parsing DTDs

+ +

In order to parse parameter entities, before starting the parse, +you must call XML_SetParamEntityParsing with one of the following +arguments:

+
+
XML_PARAM_ENTITY_PARSING_NEVER
+
Don't parse parameter entities or the external subset
+
XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE
+
Parse parameter entites and the external subset unless +standalone was set to "yes" in the XML declaration.
+
XML_PARAM_ENTITY_PARSING_ALWAYS
+
Always parse parameter entities and the external subset
+
+ +

In order to read an external DTD, you also have to set an external +entity reference handler as described above.

+ +
+ + +

Expat Reference

+ +

Parser Creation

+ +
+XML_Parser XMLCALL
+XML_ParserCreate(const XML_Char *encoding);
+
+
+Construct a new parser. If encoding is non-null, it specifies a +character encoding to use for the document. This overrides the document +encoding declaration. There are four built-in encodings: +
    +
  • US-ASCII
  • +
  • UTF-8
  • +
  • UTF-16
  • +
  • ISO-8859-1
  • +
+Any other value will invoke a call to the UnknownEncodingHandler. +
+ +
+XML_Parser XMLCALL
+XML_ParserCreateNS(const XML_Char *encoding,
+                   XML_Char sep);
+
+
+Constructs a new parser that has namespace processing in effect. Namespace +expanded element names and attribute names are returned as a concatenation +of the namespace URI, sep, and the local part of the name. This +means that you should pick a character for sep that can't be +part of a legal URI.
+ +
+XML_Parser XMLCALL
+XML_ParserCreate_MM(const XML_Char *encoding,
+                    const XML_Memory_Handling_Suite *ms,
+		    const XML_Char *sep);
+
+
+typedef struct {
+  void *(XMLCALL *malloc_fcn)(size_t size);
+  void *(XMLCALL *realloc_fcn)(void *ptr, size_t size);
+  void (XMLCALL *free_fcn)(void *ptr);
+} XML_Memory_Handling_Suite;
+
+
+

Construct a new parser using the suite of memory handling functions +specified in ms. If ms is NULL, then use the +standard set of memory management functions. If sep is +non NULL, then namespace processing is enabled in the created parser +and the character pointed at by sep is used as the separator between +the namespace URI and the local part of the name.

+
+ +
+XML_Parser XMLCALL
+XML_ExternalEntityParserCreate(XML_Parser p,
+                               const XML_Char *context,
+                               const XML_Char *encoding);
+
+
+Construct a new XML_Parser object for parsing an external +general entity. Context is the context argument passed in a call to a +ExternalEntityRefHandler. Other state information such as handlers, +user data, namespace processing is inherited from the parser passed as +the 1st argument. So you shouldn't need to call any of the behavior +changing functions on this parser (unless you want it to act +differently than the parent parser). +
+ +
+void XMLCALL
+XML_ParserFree(XML_Parser p);
+
+
+Free memory used by the parser. Your application is responsible for +freeing any memory associated with user data. +
+ +
+XML_Bool XMLCALL
+XML_ParserReset(XML_Parser p,
+                const XML_Char *encoding);
+
+
+Clean up the memory structures maintained by the parser so that it may +be used again. After this has been called, parser is +ready to start parsing a new document. This function may not be used +on a parser created using XML_ExternalEntityParserCreate; it will return XML_FALSE in that case. Returns +XML_TRUE on success. Your application is responsible for +dealing with any memory associated with user data. +
+ +

Parsing

+ +

To state the obvious: the three parsing functions XML_Parse, +XML_ParseBuffer and +XML_GetBuffer must not be +called from within a handler unless they operate on a separate parser +instance, that is, one that did not call the handler. For example, it +is OK to call the parsing functions from within an +XML_ExternalEntityRefHandler, if they apply to the parser +created by XML_ExternalEntityParserCreate.

+ +
+enum XML_Status XMLCALL
+XML_Parse(XML_Parser p,
+          const char *s,
+          int len,
+          int isFinal);
+
+
+enum XML_Status {
+  XML_STATUS_ERROR = 0,
+  XML_STATUS_OK = 1
+};
+
+
+Parse some more of the document. The string s is a buffer +containing part (or perhaps all) of the document. The number of bytes of s +that are part of the document is indicated by len. This means +that s doesn't have to be null terminated. It also means that +if len is larger than the number of bytes in the block of +memory that s points at, then a memory fault is likely. The +isFinal parameter informs the parser that this is the last +piece of the document. Frequently, the last piece is empty (i.e. +len is zero.) +If a parse error occurred, it returns XML_STATUS_ERROR. +Otherwise it returns XML_STATUS_OK value. +
+ +
+enum XML_Status XMLCALL
+XML_ParseBuffer(XML_Parser p,
+                int len,
+                int isFinal);
+
+
+This is just like XML_Parse, +except in this case Expat provides the buffer. By obtaining the +buffer from Expat with the XML_GetBuffer function, the application can avoid double +copying of the input. +
+ +
+void * XMLCALL
+XML_GetBuffer(XML_Parser p,
+              int len);
+
+
+Obtain a buffer of size len to read a piece of the document +into. A NULL value is returned if Expat can't allocate enough memory for +this buffer. This has to be called prior to every call to +XML_ParseBuffer. A +typical use would look like this: + +
+for (;;) {
+  int bytes_read;
+  void *buff = XML_GetBuffer(p, BUFF_SIZE);
+  if (buff == NULL) {
+    /* handle error */
+  }
+
+  bytes_read = read(docfd, buff, BUFF_SIZE);
+  if (bytes_read < 0) {
+    /* handle error */
+  }
+
+  if (! XML_ParseBuffer(p, bytes_read, bytes_read == 0)) {
+    /* handle parse error */
+  }
+
+  if (bytes_read == 0)
+    break;
+}
+
+
+ +

Handler Setting

+ +

Although handlers are typically set prior to parsing and left alone, an +application may choose to set or change the handler for a parsing event +while the parse is in progress. For instance, your application may choose +to ignore all text not descended from a para element. One +way it could do this is to set the character handler when a para start tag +is seen, and unset it for the corresponding end tag.

+ +

A handler may be unset by providing a NULL pointer to the +appropriate handler setter. None of the handler setting functions have +a return value.

+ +

Your handlers will be receiving strings in arrays of type +XML_Char. This type is defined in expat.h as char +* and contains bytes encoding UTF-8. Note that you'll receive +them in this form independent of the original encoding of the +document.

+ +
+
+void XMLCALL
+XML_SetStartElementHandler(XML_Parser p,
+                           XML_StartElementHandler start);
+
+
+typedef void
+(XMLCALL *XML_StartElementHandler)(void *userData,
+                                   const XML_Char *name,
+                                   const XML_Char **atts);
+
+

Set handler for start (and empty) tags. Attributes are passed to the start +handler as a pointer to a vector of char pointers. Each attribute seen in +a start (or empty) tag occupies 2 consecutive places in this vector: the +attribute name followed by the attribute value. These pairs are terminated +by a null pointer.

+

Note that an empty tag generates a call to both start and end handlers +(in that order).

+
+ +
+
+void XMLCALL
+XML_SetEndElementHandler(XML_Parser p,
+                         XML_EndElementHandler);
+
+
+typedef void
+(XMLCALL *XML_EndElementHandler)(void *userData,
+                                 const XML_Char *name);
+
+

Set handler for end (and empty) tags. As noted above, an empty tag +generates a call to both start and end handlers.

+
+ +
+
+void XMLCALL
+XML_SetElementHandler(XML_Parser p,
+                      XML_StartElementHandler start,
+                      XML_EndElementHandler end);
+
+

Set handlers for start and end tags with one call.

+
+ +
+
+void XMLCALL
+XML_SetCharacterDataHandler(XML_Parser p,
+                            XML_CharacterDataHandler charhndl)
+
+
+typedef void
+(XMLCALL *XML_CharacterDataHandler)(void *userData,
+                                    const XML_Char *s,
+                                    int len);
+
+

Set a text handler. The string your handler receives +is NOT nul-terminated. You have to use the length argument +to deal with the end of the string. A single block of contiguous text +free of markup may still result in a sequence of calls to this handler. +In other words, if you're searching for a pattern in the text, it may +be split across calls to this handler.

+
+ +
+
+void XMLCALL
+XML_SetProcessingInstructionHandler(XML_Parser p,
+                                    XML_ProcessingInstructionHandler proc)
+
+
+typedef void
+(XMLCALL *XML_ProcessingInstructionHandler)(void *userData,
+                                            const XML_Char *target,
+                                            const XML_Char *data);
+
+
+

Set a handler for processing instructions. The target is the first word +in the processing instruction. The data is the rest of the characters in +it after skipping all whitespace after the initial word.

+
+ +
+
+void XMLCALL
+XML_SetCommentHandler(XML_Parser p,
+                      XML_CommentHandler cmnt)
+
+
+typedef void
+(XMLCALL *XML_CommentHandler)(void *userData,
+                              const XML_Char *data);
+
+

Set a handler for comments. The data is all text inside the comment +delimiters.

+
+ +
+
+void XMLCALL
+XML_SetStartCdataSectionHandler(XML_Parser p,
+                                XML_StartCdataSectionHandler start);
+
+
+typedef void
+(XMLCALL *XML_StartCdataSectionHandler)(void *userData);
+
+

Set a handler that gets called at the beginning of a CDATA section.

+
+ +
+
+void XMLCALL
+XML_SetEndCdataSectionHandler(XML_Parser p,
+                              XML_EndCdataSectionHandler end);
+
+
+typedef void
+(XMLCALL *XML_EndCdataSectionHandler)(void *userData);
+
+

Set a handler that gets called at the end of a CDATA section.

+
+ +
+
+void XMLCALL
+XML_SetCdataSectionHandler(XML_Parser p,
+                           XML_StartCdataSectionHandler start,
+                           XML_EndCdataSectionHandler end)
+
+

Sets both CDATA section handlers with one call.

+
+ +
+
+void XMLCALL
+XML_SetDefaultHandler(XML_Parser p,
+                      XML_DefaultHandler hndl)
+
+
+typedef void
+(XMLCALL *XML_DefaultHandler)(void *userData,
+                              const XML_Char *s,
+                              int len);
+
+ +

Sets a handler for any characters in the document which wouldn't +otherwise be handled. This includes both data for which no handlers +can be set (like some kinds of DTD declarations) and data which could +be reported but which currently has no handler set. The characters +are passed exactly as they were present in the XML document except +that they will be encoded in UTF-8 or UTF-16. Line boundaries are not +normalized. Note that a byte order mark character is not passed to the +default handler. There are no guarantees about how characters are +divided between calls to the default handler: for example, a comment +might be split between multiple calls. Setting the handler with +this call has the side effect of turning off expansion of references +to internally defined general entities. Instead these references are +passed to the default handler.

+ +

See also XML_DefaultCurrent.

+
+ +
+
+void XMLCALL
+XML_SetDefaultHandlerExpand(XML_Parser p,
+                            XML_DefaultHandler hndl)
+
+
+typedef void
+(XMLCALL *XML_DefaultHandler)(void *userData,
+                              const XML_Char *s,
+                              int len);
+
+

This sets a default handler, but doesn't inhibit the expansion of +internal entity references. The entity reference will not be passed +to the default handler.

+ +

See also XML_DefaultCurrent.

+
+ +
+
+void XMLCALL
+XML_SetExternalEntityRefHandler(XML_Parser p,
+                                XML_ExternalEntityRefHandler hndl)
+
+
+typedef int
+(XMLCALL *XML_ExternalEntityRefHandler)(XML_Parser p,
+                                        const XML_Char *context,
+                                        const XML_Char *base,
+                                        const XML_Char *systemId,
+                                        const XML_Char *publicId);
+
+

Set an external entity reference handler. This handler is also +called for processing an external DTD subset if parameter entity parsing +is in effect. (See +XML_SetParamEntityParsing.)

+ +

The context parameter specifies the parsing context in +the format expected by the context argument to XML_ExternalEntityParserCreate. code is +valid only until the handler returns, so if the referenced entity is +to be parsed later, it must be copied. context is NULL +only when the entity is a parameter entity, which is how one can +differentiate between general and parameter entities.

+ +

The base parameter is the base to use for relative +system identifiers. It is set by XML_SetBase and may be NULL. The +publicId parameter is the public id given in the entity +declaration and may be NULL. systemId is the system +identifier specified in the entity declaration and is never NULL.

+ +

There are a couple of ways in which this handler differs from +others. First, this handler returns a status indicator (an +integer). XML_STATUS_OK should be returned for successful +handling of the external entity reference. Returning +XML_STATUS_ERROR indicates failure, and causes the +calling parser to return an +XML_ERROR_EXTERNAL_ENTITY_HANDLING error.

+ +

Second, instead of having the user data as its first argument, it +receives the parser that encountered the entity reference. This, along +with the context parameter, may be used as arguments to a call to +XML_ExternalEntityParserCreate. Using the returned +parser, the body of the external entity can be recursively parsed.

+ +

Since this handler may be called recursively, it should not be saving +information into global or static variables.

+
+ +
+void XMLCALL
+XML_SetExternalEntityRefHandlerArg(XML_Parser p,
+                                   void *arg)
+
+
+

Set the argument passed to the ExternalEntityRefHandler. If +arg is not NULL, it is the new value passed to the +handler set using XML_SetExternalEntityRefHandler; if arg is +NULL, the argument passed to the handler function will be the parser +object itself.

+ +

Note: +The type of arg and the type of the first argument to the +ExternalEntityRefHandler do not match. This function takes a +void * to be passed to the handler, while the handler +accepts an XML_Parser. This is a historical accident, +but will not be corrected before Expat 2.0 (at the earliest) to avoid +causing compiler warnings for code that's known to work with this +API. It is the responsibility of the application code to know the +actual type of the argument passed to the handler and to manage it +properly.

+
+ +
+
+void XMLCALL
+XML_SetSkippedEntityHandler(XML_Parser p,
+                            XML_SkippedEntityHandler handler)
+
+
+typedef void
+(XMLCALL *XML_SkippedEntityHandler)(void *userData,
+                                    const XML_Char *entityName,
+                                    int is_parameter_entity);
+
+

Set a skipped entity handler. This is called in two situations:

+
    +
  1. An entity reference is encountered for which no declaration + has been read and this is not an error.
  2. +
  3. An internal entity reference is read, but not expanded, because + XML_SetDefaultHandler + has been called.
  4. +
+

The is_parameter_entity argument will be non-zero for +a parameter entity and zero for a general entity.

Note: skipped +parameter entities in declarations and skipped general entities in +attribute values cannot be reported, because the event would be out of +sync with the reporting of the declarations or attribute values

+
+ +
+
+void XMLCALL
+XML_SetUnknownEncodingHandler(XML_Parser p,
+                              XML_UnknownEncodingHandler enchandler,
+			      void *encodingHandlerData)
+
+
+typedef int
+(XMLCALL *XML_UnknownEncodingHandler)(void *encodingHandlerData,
+                                      const XML_Char *name,
+                                      XML_Encoding *info);
+
+typedef struct {
+  int map[256];
+  void *data;
+  int (XMLCALL *convert)(void *data, const char *s);
+  void (XMLCALL *release)(void *data);
+} XML_Encoding;
+
+

Set a handler to deal with encodings other than the built in set. This should be done before +XML_Parse or XML_ParseBuffer have been called on the +given parser.

If the handler knows how to deal with an encoding +with the given name, it should fill in the info data +structure and return XML_STATUS_ERROR. Otherwise it +should return XML_STATUS_OK. The handler will be called +at most once per parsed (external) entity. The optional application +data pointer encodingHandlerData will be passed back to +the handler.

+ +

The map array contains information for every possible possible leading +byte in a byte sequence. If the corresponding value is >= 0, then it's +a single byte sequence and the byte encodes that Unicode value. If the +value is -1, then that byte is invalid as the initial byte in a sequence. +If the value is -n, where n is an integer > 1, then n is the number of +bytes in the sequence and the actual conversion is accomplished by a +call to the function pointed at by convert. This function may return -1 +if the sequence itself is invalid. The convert pointer may be null if +there are only single byte codes. The data parameter passed to the convert +function is the data pointer from XML_Encoding. The +string s is NOT nul-terminated and points at the sequence of +bytes to be converted.

+ +

The function pointed at by release is called by the +parser when it is finished with the encoding. It may be NULL.

+
+ +
+
+void XMLCALL
+XML_SetStartNamespaceDeclHandler(XML_Parser p,
+			         XML_StartNamespaceDeclHandler start);
+
+
+typedef void
+(XMLCALL *XML_StartNamespaceDeclHandler)(void *userData,
+                                         const XML_Char *prefix,
+                                         const XML_Char *uri);
+
+

Set a handler to be called when a namespace is declared. Namespace +declarations occur inside start tags. But the namespace declaration start +handler is called before the start tag handler for each namespace declared +in that start tag.

+
+ +
+
+void XMLCALL
+XML_SetEndNamespaceDeclHandler(XML_Parser p,
+			       XML_EndNamespaceDeclHandler end);
+
+
+typedef void
+(XMLCALL *XML_EndNamespaceDeclHandler)(void *userData,
+                                       const XML_Char *prefix);
+
+

Set a handler to be called when leaving the scope of a namespace +declaration. This will be called, for each namespace declaration, +after the handler for the end tag of the element in which the +namespace was declared.

+
+ +
+
+void XMLCALL
+XML_SetNamespaceDeclHandler(XML_Parser p,
+                            XML_StartNamespaceDeclHandler start,
+                            XML_EndNamespaceDeclHandler end)
+
+

Sets both namespace declaration handlers with a single call.

+
+ +
+
+void XMLCALL
+XML_SetXmlDeclHandler(XML_Parser p,
+		      XML_XmlDeclHandler xmldecl);
+
+
+typedef void
+(XMLCALL *XML_XmlDeclHandler)(void            *userData,
+                              const XML_Char  *version,
+                              const XML_Char  *encoding,
+                              int             standalone);
+
+

Sets a handler that is called for XML declarations and also for +text declarations discovered in external entities. The way to +distinguish is that the version parameter will be NULL +for text declarations. The encoding parameter may be NULL +for an XML declaration. The standalone argument will +contain -1, 0, or 1 indicating respectively that there was no +standalone parameter in the declaration, that it was given as no, or +that it was given as yes.

+
+ +
+
+void XMLCALL
+XML_SetStartDoctypeDeclHandler(XML_Parser p,
+			       XML_StartDoctypeDeclHandler start);
+
+
+typedef void
+(XMLCALL *XML_StartDoctypeDeclHandler)(void           *userData,
+                                       const XML_Char *doctypeName,
+                                       const XML_Char *sysid,
+                                       const XML_Char *pubid,
+                                       int            has_internal_subset);
+
+

Set a handler that is called at the start of a DOCTYPE declaration, +before any external or internal subset is parsed. Both sysid +and pubid may be NULL. The has_internal_subset +will be non-zero if the DOCTYPE declaration has an internal subset.

+
+ +
+
+void XMLCALL
+XML_SetEndDoctypeDeclHandler(XML_Parser p,
+			     XML_EndDoctypeDeclHandler end);
+
+
+typedef void
+(XMLCALL *XML_EndDoctypeDeclHandler)(void *userData);
+
+

Set a handler that is called at the end of a DOCTYPE declaration, +after parsing any external subset.

+
+ +
+
+void XMLCALL
+XML_SetDoctypeDeclHandler(XML_Parser p,
+			  XML_StartDoctypeDeclHandler start,
+			  XML_EndDoctypeDeclHandler end);
+
+

Set both doctype handlers with one call.

+
+ +
+
+void XMLCALL
+XML_SetElementDeclHandler(XML_Parser p,
+			  XML_ElementDeclHandler eldecl);
+
+
+typedef void
+(XMLCALL *XML_ElementDeclHandler)(void *userData,
+                                  const XML_Char *name,
+                                  XML_Content *model);
+
+
+enum XML_Content_Type {
+  XML_CTYPE_EMPTY = 1,
+  XML_CTYPE_ANY,
+  XML_CTYPE_MIXED,
+  XML_CTYPE_NAME,
+  XML_CTYPE_CHOICE,
+  XML_CTYPE_SEQ
+};
+
+enum XML_Content_Quant {
+  XML_CQUANT_NONE,
+  XML_CQUANT_OPT,
+  XML_CQUANT_REP,
+  XML_CQUANT_PLUS
+};
+
+typedef struct XML_cp XML_Content;
+
+struct XML_cp {
+  enum XML_Content_Type		type;
+  enum XML_Content_Quant	quant;
+  const XML_Char *		name;
+  unsigned int			numchildren;
+  XML_Content *			children;
+};
+
+

Sets a handler for element declarations in a DTD. The handler gets +called with the name of the element in the declaration and a pointer +to a structure that contains the element model. It is the +application's responsibility to free this data structure using +XML_FreeContentModel.

+ +

The model argument is the root of a tree of +XML_Content nodes. If type equals +XML_CTYPE_EMPTY or XML_CTYPE_ANY, then +quant will be XML_CQUANT_NONE, and the other +fields will be zero or NULL. If type is +XML_CTYPE_MIXED, then quant will be +XML_CQUANT_NONE or XML_CQUANT_REP and +numchildren will contain the number of elements that are +allowed to be mixed in and children points to an array of +XML_Content structures that will all have type +XML_CTYPE_NAME with no quantification. Only the root node can be type +XML_CTYPE_EMPTY, XML_CTYPE_ANY, or +XML_CTYPE_MIXED.

+ +

For type XML_CTYPE_NAME, the name field +points to the name and the numchildren and +children fields will be zero and NULL. The +quant field will indicate any quantifiers placed on the +name.

+ +

Types XML_CTYPE_CHOICE and XML_CTYPE_SEQ +indicate a choice or sequence respectively. The +numchildren field indicates how many nodes in the choice +or sequence and children points to the nodes.

+
+ +
+
+void XMLCALL
+XML_SetAttlistDeclHandler(XML_Parser p,
+                          XML_AttlistDeclHandler attdecl);
+
+
+typedef void
+(XMLCALL *XML_AttlistDeclHandler)(void           *userData,
+                                  const XML_Char *elname,
+                                  const XML_Char *attname,
+                                  const XML_Char *att_type,
+                                  const XML_Char *dflt,
+                                  int            isrequired);
+
+

Set a handler for attlist declarations in the DTD. This handler is +called for each attribute. So a single attlist declaration +with multiple attributes declared will generate multiple calls to this +handler. The elname parameter returns the name of the +element for which the attribute is being declared. The attribute name +is in the attname parameter. The attribute type is in the +att_type parameter. It is the string representing the +type in the declaration with whitespace removed.

+ +

The dflt parameter holds the default value. It will be +NULL in the case of "#IMPLIED" or "#REQUIRED" attributes. You can +distinguish these two cases by checking the isrequired +parameter, which will be true in the case of "#REQUIRED" attributes. +Attributes which are "#FIXED" will have also have a true +isrequired, but they will have the non-NULL fixed value +in the dflt parameter.

+
+ +
+
+void XMLCALL
+XML_SetEntityDeclHandler(XML_Parser p,
+			 XML_EntityDeclHandler handler);
+
+
+typedef void
+(XMLCALL *XML_EntityDeclHandler)(void           *userData,
+                                 const XML_Char *entityName,
+                                 int            is_parameter_entity,
+                                 const XML_Char *value,
+                                 int            value_length, 
+                                 const XML_Char *base,
+                                 const XML_Char *systemId,
+                                 const XML_Char *publicId,
+                                 const XML_Char *notationName);
+
+

Sets a handler that will be called for all entity declarations. +The is_parameter_entity argument will be non-zero in the +case of parameter entities and zero otherwise.

+ +

For internal entities (<!ENTITY foo "bar">), +value will be non-NULL and systemId, +publicId, and notationName will all be NULL. +The value string is not NULL terminated; the length is +provided in the value_length parameter. Do not use +value_length to test for internal entities, since it is +legal to have zero-length values. Instead check for whether or not +value is NULL.

The notationName +argument will have a non-NULL value only for unparsed entity +declarations.

+
+ +
+
+void XMLCALL
+XML_SetUnparsedEntityDeclHandler(XML_Parser p,
+                                 XML_UnparsedEntityDeclHandler h)
+
+
+typedef void
+(XMLCALL *XML_UnparsedEntityDeclHandler)(void *userData,
+                                         const XML_Char *entityName, 
+                                         const XML_Char *base,
+                                         const XML_Char *systemId,
+                                         const XML_Char *publicId,
+                                         const XML_Char *notationName);
+
+

Set a handler that receives declarations of unparsed entities. These +are entity declarations that have a notation (NDATA) field:

+ +
+<!ENTITY logo SYSTEM "images/logo.gif" NDATA gif>
+
+

This handler is obsolete and is provided for backwards +compatibility. Use instead XML_SetEntityDeclHandler.

+
+ +
+
+void XMLCALL
+XML_SetNotationDeclHandler(XML_Parser p,
+                           XML_NotationDeclHandler h)
+
+
+typedef void
+(XMLCALL *XML_NotationDeclHandler)(void *userData, 
+                                   const XML_Char *notationName,
+                                   const XML_Char *base,
+                                   const XML_Char *systemId,
+                                   const XML_Char *publicId);
+
+

Set a handler that receives notation declarations.

+
+ +
+
+void XMLCALL
+XML_SetNotStandaloneHandler(XML_Parser p,
+                            XML_NotStandaloneHandler h)
+
+
+typedef int 
+(XMLCALL *XML_NotStandaloneHandler)(void *userData);
+
+

Set a handler that is called if the document is not "standalone". +This happens when there is an external subset or a reference to a +parameter entity, but does not have standalone set to "yes" in an XML +declaration. If this handler returns XML_STATUS_ERROR, +then the parser will throw an XML_ERROR_NOT_STANDALONE +error.

+
+ +

Parse position and error reporting functions

+ +

These are the functions you'll want to call when the parse +functions return XML_STATUS_ERROR (a parse error has +occurred), although the position reporting functions are useful outside +of errors. The position reported is the byte position (in the original +document or entity encoding) of the first of the sequence of +characters that generated the current event (or the error that caused +the parse functions to return XML_STATUS_ERROR.) The +exceptions are callbacks trigged by declarations in the document +prologue, in which case they exact position reported is somewhere in the +relevant markup, but not necessarily as meaningful as for other +events.

+ +

The position reporting functions are accurate only outside of the +DTD. In other words, they usually return bogus information when +called from within a DTD declaration handler.

+ +
+enum XML_Error XMLCALL
+XML_GetErrorCode(XML_Parser p);
+
+
+Return what type of error has occurred. +
+ +
+const XML_LChar * XMLCALL
+XML_ErrorString(enum XML_Error code);
+
+
+Return a string describing the error corresponding to code. +The code should be one of the enums that can be returned from +XML_GetErrorCode. +
+ +
+long XMLCALL
+XML_GetCurrentByteIndex(XML_Parser p);
+
+
+Return the byte offset of the position. This always corresponds to +the values returned by XML_GetCurrentLineNumber and XML_GetCurrentColumnNumber. +
+ +
+int XMLCALL
+XML_GetCurrentLineNumber(XML_Parser p);
+
+
+Return the line number of the position. The first line is reported as +1. +
+ +
+int XMLCALL
+XML_GetCurrentColumnNumber(XML_Parser p);
+
+
+Return the offset, from the beginning of the current line, of +the position. +
+ +
+int XMLCALL
+XML_GetCurrentByteCount(XML_Parser p);
+
+
+Return the number of bytes in the current event. Returns +0 if the event is inside a reference to an internal +entity and for the end-tag event for empty element tags (the later can +be used to distinguish empty-element tags from empty elements using +separate start and end tags). +
+ +
+const char * XMLCALL
+XML_GetInputContext(XML_Parser p,
+                    int *offset,
+                    int *size);
+
+
+ +

Returns the parser's input buffer, sets the integer pointed at by +offset to the offset within this buffer of the current +parse position, and set the integer pointed at by size to +the size of the returned buffer.

+ +

This should only be called from within a handler during an active +parse and the returned buffer should only be referred to from within +the handler that made the call. This input buffer contains the +untranslated bytes of the input.

+ +

Only a limited amount of context is kept, so if the event +triggering a call spans over a very large amount of input, the actual +parse position may be before the beginning of the buffer.

+
+ +

Miscellaneous functions

+ +

The functions in this section either obtain state information from +the parser or can be used to dynamicly set parser options.

+ +
+void XMLCALL
+XML_SetUserData(XML_Parser p,
+                void *userData);
+
+
+This sets the user data pointer that gets passed to handlers. It +overwrites any previous value for this pointer. Note that the +application is responsible for freeing the memory associated with +userData when it is finished with the parser. So if you +call this when there's already a pointer there, and you haven't freed +the memory associated with it, then you've probably just leaked +memory. +
+ +
+void * XMLCALL
+XML_GetUserData(XML_Parser p);
+
+
+This returns the user data pointer that gets passed to handlers. +It is actually implemented as a macro. +
+ +
+void XMLCALL
+XML_UseParserAsHandlerArg(XML_Parser p);
+
+
+After this is called, handlers receive the parser in their +userData arguments. The user data can still be obtained +using the XML_GetUserData function. +
+ +
+enum XML_Status XMLCALL
+XML_SetBase(XML_Parser p,
+            const XML_Char *base);
+
+
+Set the base to be used for resolving relative URIs in system +identifiers. The return value is XML_STATUS_ERROR if +there's no memory to store base, otherwise it's +XML_STATUS_OK. +
+ +
+const XML_Char * XMLCALL
+XML_GetBase(XML_Parser p);
+
+
+Return the base for resolving relative URIs. +
+ +
+int XMLCALL
+XML_GetSpecifiedAttributeCount(XML_Parser p);
+
+
+When attributes are reported to the start handler in the atts vector, +attributes that were explicitly set in the element occur before any +attributes that receive their value from default information in an +ATTLIST declaration. This function returns the number of attributes +that were explicitly set times two, thus giving the offset in the +atts array passed to the start tag handler of the first +attribute set due to defaults. It supplies information for the last +call to a start handler. If called inside a start handler, then that +means the current call. +
+ +
+int XMLCALL
+XML_GetIdAttributeIndex(XML_Parser p);
+
+
+Returns the index of the ID attribute passed in the atts array in the +last call to XML_StartElementHandler, or -1 if there is no ID +attribute. If called inside a start handler, then that means the +current call. +
+ +
+enum XML_Status XMLCALL
+XML_SetEncoding(XML_Parser p,
+                const XML_Char *encoding);
+
+
+Set the encoding to be used by the parser. It is equivalent to +passing a non-null encoding argument to the parser creation functions. +It must not be called after XML_Parse or XML_ParseBuffer have been called on the given parser. +Returns XML_STATUS_OK on success or +XML_STATUS_ERROR on error. +
+ +
+int XMLCALL
+XML_SetParamEntityParsing(XML_Parser p,
+                          enum XML_ParamEntityParsing code);
+
+
+This enables parsing of parameter entities, including the external +parameter entity that is the external DTD subset, according to +code. +The choices for code are: +
    +
  • XML_PARAM_ENTITY_PARSING_NEVER
  • +
  • XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE
  • +
  • XML_PARAM_ENTITY_PARSING_ALWAYS
  • +
+
+ +
+enum XML_Error XMLCALL
+XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD);
+
+
+

This function allows an application to provide an external subset +for the document type declaration for documents which do not specify +an external subset of their own. For documents which specify an +external subset in their DOCTYPE declaration, the application-provided +subset will be ignored. If the document does not contain a DOCTYPE +declaration at all and useDTD is true, the +application-provided subset will be parsed, but the +startDoctypeDeclHandler and +endDoctypeDeclHandler functions, if set, will not be +called. The setting of parameter entity parsing, controlled using +XML_SetParamEntityParsing, will be honored.

+ +

The application-provided external subset is read by calling the +external entity reference handler set via XML_SetExternalEntityRefHandler with both +publicId and systemId set to NULL.

+ +

If this function is called after parsing has begun, it returns +XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING and ignores +useDTD. If called when Expat has been compiled without +DTD support, it returns +XML_ERROR_FEATURE_REQUIRES_XML_DTD. Otherwise, it +returns XML_ERROR_NONE.

+
+ +
+void XMLCALL
+XML_SetReturnNSTriplet(XML_Parser parser,
+                       int        do_nst);
+
+
+

+This function only has an effect when using a parser created with +XML_ParserCreateNS, +i.e. when namespace processing is in effect. The do_nst +sets whether or not prefixes are returned with names qualified with a +namespace prefix. If this function is called with do_nst +non-zero, then afterwards namespace qualified names (that is qualified +with a prefix as opposed to belonging to a default namespace) are +returned as a triplet with the three parts separated by the namespace +separator specified when the parser was created. The order of +returned parts is URI, local name, and prefix.

If +do_nst is zero, then namespaces are reported in the +default manner, URI then local_name separated by the namespace +separator.

+
+ +
+void XMLCALL
+XML_DefaultCurrent(XML_Parser parser);
+
+
+This can be called within a handler for a start element, end element, +processing instruction or character data. It causes the corresponding +markup to be passed to the default handler set by XML_SetDefaultHandler or +XML_SetDefaultHandlerExpand. It does nothing if there is +not a default handler. +
+ +
+XML_LChar * XMLCALL
+XML_ExpatVersion();
+
+
+Return the library version as a string (e.g. "expat_1.95.1"). +
+ +
+struct XML_Expat_Version XMLCALL
+XML_ExpatVersionInfo();
+
+
+typedef struct {
+  int major;
+  int minor;
+  int micro;
+} XML_Expat_Version;
+
+
+Return the library version information as a structure. +Some macros are also defined that support compile-time tests of the +library version: +
    +
  • XML_MAJOR_VERSION
  • +
  • XML_MINOR_VERSION
  • +
  • XML_MICRO_VERSION
  • +
+Testing these constants is currently the best way to determine if +particular parts of the Expat API are available. +
+ +
+const XML_Feature * XMLCALL
+XML_GetFeatureList();
+
+
+enum XML_FeatureEnum {
+  XML_FEATURE_END = 0,
+  XML_FEATURE_UNICODE,
+  XML_FEATURE_UNICODE_WCHAR_T,
+  XML_FEATURE_DTD,
+  XML_FEATURE_CONTEXT_BYTES,
+  XML_FEATURE_MIN_SIZE,
+  XML_FEATURE_SIZEOF_XML_CHAR,
+  XML_FEATURE_SIZEOF_XML_LCHAR
+};
+
+typedef struct {
+  enum XML_FeatureEnum  feature;
+  XML_LChar            *name;
+  long int              value;
+} XML_Feature;
+
+
+

Returns a list of "feature" records, providing details on how +Expat was configured at compile time. Most applications should not +need to worry about this, but this information is otherwise not +available from Expat. This function allows code that does need to +check these features to do so at runtime.

+ +

The return value is an array of XML_Feature, +terminated by a record with a feature of +XML_FEATURE_END and name of NULL, +identifying the feature-test macros Expat was compiled with. Since an +application that requires this kind of information needs to determine +the type of character the name points to, records for the +XML_FEATURE_SIZEOF_XML_CHAR and +XML_FEATURE_SIZEOF_XML_LCHAR will be located at the +beginning of the list, followed by XML_FEATURE_UNICODE +and XML_FEATURE_UNICODE_WCHAR_T, if they are present at +all.

+ +

Some features have an associated value. If there isn't an +associated value, the value field is set to 0. At this +time, the following features have been defined to have values:

+ +
+
XML_FEATURE_SIZEOF_XML_CHAR
+
The number of bytes occupied by one XML_Char + character.
+
XML_FEATURE_SIZEOF_XML_LCHAR
+
The number of bytes occupied by one XML_LChar + character.
+
XML_FEATURE_CONTEXT_BYTES
+
The maximum number of characters of context which can be + reported by XML_GetInputContext.
+
+
+ +
+void XMLCALL
+XML_FreeContentModel(XML_Parser parser, XML_Content *model);
+
+
+Function to deallocate the model argument passed to the +XML_ElementDeclHandler callback set using XML_ElementDeclHandler. +This function should not be used for any other purpose. +
+ +

The following functions allow external code to share the memory +allocator an XML_Parser has been configured to use. This +is especially useful for third-party libraries that interact with a +parser object created by application code, or heavily layered +applications. This can be essential when using dynamically loaded +libraries which use different C standard libraries (this can happen on +Windows, at least).

+ +
+void * XMLCALL
+XML_MemMalloc(XML_Parser parser, size_t size);
+
+
+Allocate size bytes of memory using the allocator the +parser object has been configured to use. Returns a +pointer to the memory or NULL on failure. Memory allocated in this +way must be freed using XML_MemFree. +
+ +
+void * XMLCALL
+XML_MemRealloc(XML_Parser parser, void *ptr, size_t size);
+
+
+Allocate size bytes of memory using the allocator the +parser object has been configured to use. +ptr must point to a block of memory allocated by XML_MemMalloc or +XML_MemRealloc, or be NULL. This function tries to +expand the block pointed to by ptr if possible. Returns +a pointer to the memory or NULL on failure. On success, the original +block has either been expanded or freed. On failure, the original +block has not been freed; the caller is responsible for freeing the +original block. Memory allocated in this way must be freed using +XML_MemFree. +
+ +
+void XMLCALL
+XML_MemFree(XML_Parser parser, void *ptr);
+
+
+Free a block of memory pointed to by ptr. The block must +have been allocated by XML_MemMalloc or XML_MemRealloc, or be NULL. +
+ +
+

Valid XHTML 1.0!

+
+ + diff --git a/reactos/lib/expat/doc/style.css b/reactos/lib/expat/doc/style.css new file mode 100644 index 00000000000..8f19fbd55fd --- /dev/null +++ b/reactos/lib/expat/doc/style.css @@ -0,0 +1,90 @@ +body { + background-color: white; + border: 0px; + margin: 0px; + padding: 0px; +} + +.corner { + width: 200px; + height: 80px; + text-align: center; +} + +.banner { + background-color: rgb(110,139,61); + color: rgb(255,236,176); + padding-left: 2em; +} + +.banner h1 { + font-size: 200%; +} + +.content { + padding: 0em 2em 1em 2em; +} + +.releaseno { + background-color: rgb(110,139,61); + color: rgb(255,236,176); + padding-bottom: 0.3em; + padding-top: 0.5em; + text-align: center; + font-weight: bold; +} + +.noborder { + border-width: 0px; +} + +.eg { + padding-left: 1em; + padding-top: .5em; + padding-bottom: .5em; + border: solid thin; + margin: 1em 0; + background-color: tan; + margin-left: 2em; + margin-right: 10%; +} + +.handler { + width: 100%; + border-top-width: thin; + margin-bottom: 1em; +} + +.handler p { + margin-left: 2em; +} + +.setter { + font-weight: bold; +} + +.signature { + color: navy; +} + +.fcndec { + width: 100%; + border-top-width: thin; + font-weight: bold; +} + +.fcndef { + margin-left: 2em; + margin-bottom: 2em; +} + +dd { + margin-bottom: 2em; +} + +.cpp-symbols dt { + font-family: monospace; +} +.cpp-symbols dd { + margin-bottom: 1em; +} diff --git a/reactos/lib/expat/doc/valid-xhtml10.png b/reactos/lib/expat/doc/valid-xhtml10.png new file mode 100644 index 0000000000000000000000000000000000000000..2275ee6ea17da3a4c67a5d90c2f2105bc0d6c5a0 GIT binary patch literal 2414 zcmbVNX;2f{7H-8QAWIODU~n`nVqipj2Gj;bX`?`kfGr|4qYzsVCn7@Qf~~j^Hfd)> zn-Mi2E>Q=K8%9xVQNW<`XaTj|FfKSoRA>apxQ%(Kd9SAC*VLg_1e7?aP$)DM%n^`I zg_w9A$8lBxvN)(w;HXlopcx24R9a3Y0CWn43IKF!jMlPRNCZKU8kLGf0-A(K925x! zGy#Di$fyvFM5x#60gz;9L?{3#1qet}A{3}pA|x=-#3^7qv_CIi8!Fd<575s6SJWLQ1J zFc6^@AQXxskU}jG2v7u(m=m;Gy%q;xCB1R#LGv!&%S0pQ{$~nPfoWNo$&~qD@1Mc? zuW;61?EfSS{-F-|TTEaw$^Pd44>UcfED-<(GGVgd=rs>YVu})m&2SmjRP#nY^TC#i zIRoMfEMK{Kdzfkq@ z<=3+8?`u|{6TNTco7rwQ+gMZkaZ0kSBk{(5+SN0p>)Si@M!zT1ug0B9qEFh-bQcXi zxo3XCfDZdh;@_j}Dtpw|V&2Tm^i(@iVE=UyCq!br;TflQw2%$PgTVHmx}UN`Cmh4P>C+b$TT>%9`kEIZNJu1_`{p73S$s^MM6&4OFC*OOzFXH#e2A1Vrx z-8=0f+Or%|e0h$2w}Oz!JGZ;wF3FW+a>6LNzkT%SU!N4E6B$!}+saw^MlS!CO|0G5 z@Vs^0?Snr$oi7z%yDHCUUv~kAx{549x_MKqnpn)x;?yU~q zcEv5k#WytJtY7z*-NDvVYS%O@vWHGyZWWF4+Lsx4I^j2(OyVxS56@>aXAVI61sLC06LqmCfTT^sdd; z39l!Khb39WchxuF$g^0Q+q~o&(iEU-XR3}JKXEMm?2^Ni{DbF2uFdEXJ8%Brus8AN zoJr+T^1Je)l<|FRUb@wj-8peFGoe+*&a|vMG@0TyR_0d>Km2$rzUA z-!N{_*{i3|ywA38AWmk818OsE1p(70jl8R$+D;v@wtIQ2A?>iZZoOUHJU{;J^nrp6 zf?n@b+8=Nb1r2>Om+v)xF=c z*&`?HVk-h~T~-LX8Z*9wKW_SwrX*`4#pAxVgI0gU+yq}XrN-IVq?bSG%k1Go3O!FO z9N)%ywo}-IISUHv)xu{X^|9>qqT%Oux9q1EFDMNk>eIRFN!`4}r1kJgrH(v)W$jw@ z7<19pTLen(o>ZiJpE@+Q)FaMub9_sZPy6n?s0UKoCAKiHx3~9-UO8X}tTQap7I1ILGop zxuz!TapO_#@ms@Z&0<=gAkc zaC^GD<7O~+W>MH8@vCP+FPy#7ZnWl>>@j~N~=^S=R$XZ5)N literal 0 HcmV?d00001 diff --git a/reactos/lib/expat/doc/xmlwf.1 b/reactos/lib/expat/doc/xmlwf.1 new file mode 100644 index 00000000000..907d6c37b5a --- /dev/null +++ b/reactos/lib/expat/doc/xmlwf.1 @@ -0,0 +1,251 @@ +.\" This manpage has been automatically generated by docbook2man +.\" from a DocBook document. This tool can be found at: +.\" +.\" Please send any bug reports, improvements, comments, patches, +.\" etc. to Steve Cheng . +.TH "XMLWF" "1" "24 January 2003" "" "" +.SH NAME +xmlwf \- Determines if an XML document is well-formed +.SH SYNOPSIS + +\fBxmlwf\fR [ \fB-s\fR] [ \fB-n\fR] [ \fB-p\fR] [ \fB-x\fR] [ \fB-e \fIencoding\fB\fR] [ \fB-w\fR] [ \fB-d \fIoutput-dir\fB\fR] [ \fB-c\fR] [ \fB-m\fR] [ \fB-r\fR] [ \fB-t\fR] [ \fB-v\fR] [ \fBfile ...\fR] + +.SH "DESCRIPTION" +.PP +\fBxmlwf\fR uses the Expat library to +determine if an XML document is well-formed. It is +non-validating. +.PP +If you do not specify any files on the command-line, and you +have a recent version of \fBxmlwf\fR, the +input file will be read from standard input. +.SH "WELL-FORMED DOCUMENTS" +.PP +A well-formed document must adhere to the +following rules: +.TP 0.2i +\(bu +The file begins with an XML declaration. For instance, +. +\fBNOTE:\fR +\fBxmlwf\fR does not currently +check for a valid XML declaration. +.TP 0.2i +\(bu +Every start tag is either empty () +or has a corresponding end tag. +.TP 0.2i +\(bu +There is exactly one root element. This element must contain +all other elements in the document. Only comments, white +space, and processing instructions may come after the close +of the root element. +.TP 0.2i +\(bu +All elements nest properly. +.TP 0.2i +\(bu +All attribute values are enclosed in quotes (either single +or double). +.PP +If the document has a DTD, and it strictly complies with that +DTD, then the document is also considered \fBvalid\fR. +\fBxmlwf\fR is a non-validating parser -- +it does not check the DTD. However, it does support +external entities (see the \fB-x\fR option). +.SH "OPTIONS" +.PP +When an option includes an argument, you may specify the argument either +separately ("\fB-d\fR output") or concatenated with the +option ("\fB-d\fRoutput"). \fBxmlwf\fR +supports both. +.TP +\fB-c\fR +If the input file is well-formed and \fBxmlwf\fR +doesn't encounter any errors, the input file is simply copied to +the output directory unchanged. +This implies no namespaces (turns off \fB-n\fR) and +requires \fB-d\fR to specify an output file. +.TP +\fB-d output-dir\fR +Specifies a directory to contain transformed +representations of the input files. +By default, \fB-d\fR outputs a canonical representation +(described below). +You can select different output formats using \fB-c\fR +and \fB-m\fR. + +The output filenames will +be exactly the same as the input filenames or "STDIN" if the input is +coming from standard input. Therefore, you must be careful that the +output file does not go into the same directory as the input +file. Otherwise, \fBxmlwf\fR will delete the +input file before it generates the output file (just like running +cat < file > file in most shells). + +Two structurally equivalent XML documents have a byte-for-byte +identical canonical XML representation. +Note that ignorable white space is considered significant and +is treated equivalently to data. +More on canonical XML can be found at +http://www.jclark.com/xml/canonxml.html . +.TP +\fB-e encoding\fR +Specifies the character encoding for the document, overriding +any document encoding declaration. \fBxmlwf\fR +supports four built-in encodings: +US-ASCII, +UTF-8, +UTF-16, and +ISO-8859-1. +Also see the \fB-w\fR option. +.TP +\fB-m\fR +Outputs some strange sort of XML file that completely +describes the the input file, including character postitions. +Requires \fB-d\fR to specify an output file. +.TP +\fB-n\fR +Turns on namespace processing. (describe namespaces) +\fB-c\fR disables namespaces. +.TP +\fB-p\fR +Tells xmlwf to process external DTDs and parameter +entities. + +Normally \fBxmlwf\fR never parses parameter +entities. \fB-p\fR tells it to always parse them. +\fB-p\fR implies \fB-x\fR. +.TP +\fB-r\fR +Normally \fBxmlwf\fR memory-maps the XML file +before parsing; this can result in faster parsing on many +platforms. +\fB-r\fR turns off memory-mapping and uses normal file +IO calls instead. +Of course, memory-mapping is automatically turned off +when reading from standard input. + +Use of memory-mapping can cause some platforms to report +substantially higher memory usage for +\fBxmlwf\fR, but this appears to be a matter of +the operating system reporting memory in a strange way; there is +not a leak in \fBxmlwf\fR. +.TP +\fB-s\fR +Prints an error if the document is not standalone. +A document is standalone if it has no external subset and no +references to parameter entities. +.TP +\fB-t\fR +Turns on timings. This tells Expat to parse the entire file, +but not perform any processing. +This gives a fairly accurate idea of the raw speed of Expat itself +without client overhead. +\fB-t\fR turns off most of the output options +(\fB-d\fR, \fB-m\fR, \fB-c\fR, +\&...). +.TP +\fB-v\fR +Prints the version of the Expat library being used, including some +information on the compile-time configuration of the library, and +then exits. +.TP +\fB-w\fR +Enables support for Windows code pages. +Normally, \fBxmlwf\fR will throw an error if it +runs across an encoding that it is not equipped to handle itself. With +\fB-w\fR, xmlwf will try to use a Windows code +page. See also \fB-e\fR. +.TP +\fB-x\fR +Turns on parsing external entities. + +Non-validating parsers are not required to resolve external +entities, or even expand entities at all. +Expat always expands internal entities (?), +but external entity parsing must be enabled explicitly. + +External entities are simply entities that obtain their +data from outside the XML file currently being parsed. + +This is an example of an internal entity: + +.nf + +.fi + +And here are some examples of external entities: + +.nf + (parsed) + (unparsed) +.fi +.TP +\fB--\fR +(Two hyphens.) +Terminates the list of options. This is only needed if a filename +starts with a hyphen. For example: + +.nf +xmlwf -- -myfile.xml +.fi + +will run \fBxmlwf\fR on the file +\fI-myfile.xml\fR. +.PP +Older versions of \fBxmlwf\fR do not support +reading from standard input. +.SH "OUTPUT" +.PP +If an input file is not well-formed, +\fBxmlwf\fR prints a single line describing +the problem to standard output. If a file is well formed, +\fBxmlwf\fR outputs nothing. +Note that the result code is \fBnot\fR set. +.SH "BUGS" +.PP +According to the W3C standard, an XML file without a +declaration at the beginning is not considered well-formed. +However, \fBxmlwf\fR allows this to pass. +.PP +\fBxmlwf\fR returns a 0 - noerr result, +even if the file is not well-formed. There is no good way for +a program to use \fBxmlwf\fR to quickly +check a file -- it must parse \fBxmlwf\fR's +standard output. +.PP +The errors should go to standard error, not standard output. +.PP +There should be a way to get \fB-d\fR to send its +output to standard output rather than forcing the user to send +it to a file. +.PP +I have no idea why anyone would want to use the +\fB-d\fR, \fB-c\fR, and +\fB-m\fR options. If someone could explain it to +me, I'd like to add this information to this manpage. +.SH "ALTERNATIVES" +.PP +Here are some XML validators on the web: + +.nf +http://www.hcrc.ed.ac.uk/~richard/xml-check.html +http://www.stg.brown.edu/service/xmlvalid/ +http://www.scripting.com/frontier5/xml/code/xmlValidator.html +http://www.xml.com/pub/a/tools/ruwf/check.html +.fi +.SH "SEE ALSO" +.PP + +.nf +The Expat home page: http://www.libexpat.org/ +The W3 XML specification: http://www.w3.org/TR/REC-xml +.fi +.SH "AUTHOR" +.PP +This manual page was written by Scott Bronson for +the Debian GNU/Linux system (but may be used by others). Permission is +granted to copy, distribute and/or modify this document under +the terms of the GNU Free Documentation +License, Version 1.1. diff --git a/reactos/lib/expat/doc/xmlwf.sgml b/reactos/lib/expat/doc/xmlwf.sgml new file mode 100644 index 00000000000..139c95e1f11 --- /dev/null +++ b/reactos/lib/expat/doc/xmlwf.sgml @@ -0,0 +1,473 @@ + manpage.1'. You may view + the manual page with: `docbook-to-man manpage.sgml | nroff -man | + less'. A typical entry in a Makefile or Makefile.am is: + +manpage.1: manpage.sgml + docbook-to-man $< > $@ + --> + + + Scott"> + Bronson"> + + December 5, 2001"> + + 1"> + bronson@rinspin.com"> + + XMLWF"> + + + Debian GNU/Linux"> + GNU"> +]> + + + +
+ &dhemail; +
+ + &dhfirstname; + &dhsurname; + + + 2001 + &dhusername; + + &dhdate; +
+ + &dhucpackage; + + &dhsection; + + + &dhpackage; + + Determines if an XML document is well-formed + + + + &dhpackage; + + + + + + + + + + + + + + + + + + file ... + + + + + DESCRIPTION + + + &dhpackage; uses the Expat library to + determine if an XML document is well-formed. It is + non-validating. + + + + If you do not specify any files on the command-line, and you + have a recent version of &dhpackage;, the + input file will be read from standard input. + + + + + + WELL-FORMED DOCUMENTS + + + A well-formed document must adhere to the + following rules: + + + + + The file begins with an XML declaration. For instance, + <?xml version="1.0" standalone="yes"?>. + NOTE: + &dhpackage; does not currently + check for a valid XML declaration. + + + Every start tag is either empty (<tag/>) + or has a corresponding end tag. + + + There is exactly one root element. This element must contain + all other elements in the document. Only comments, white + space, and processing instructions may come after the close + of the root element. + + + All elements nest properly. + + + All attribute values are enclosed in quotes (either single + or double). + + + + + If the document has a DTD, and it strictly complies with that + DTD, then the document is also considered valid. + &dhpackage; is a non-validating parser -- + it does not check the DTD. However, it does support + external entities (see the option). + + + + + OPTIONS + + +When an option includes an argument, you may specify the argument either +separately (" output") or concatenated with the +option ("output"). &dhpackage; +supports both. + + + + + + + + + If the input file is well-formed and &dhpackage; + doesn't encounter any errors, the input file is simply copied to + the output directory unchanged. + This implies no namespaces (turns off ) and + requires to specify an output file. + + + + + + + + + Specifies a directory to contain transformed + representations of the input files. + By default, outputs a canonical representation + (described below). + You can select different output formats using + and . + + + The output filenames will + be exactly the same as the input filenames or "STDIN" if the input is + coming from standard input. Therefore, you must be careful that the + output file does not go into the same directory as the input + file. Otherwise, &dhpackage; will delete the + input file before it generates the output file (just like running + cat < file > file in most shells). + + + Two structurally equivalent XML documents have a byte-for-byte + identical canonical XML representation. + Note that ignorable white space is considered significant and + is treated equivalently to data. + More on canonical XML can be found at + http://www.jclark.com/xml/canonxml.html . + + + + + + + + + Specifies the character encoding for the document, overriding + any document encoding declaration. &dhpackage; + supports four built-in encodings: + US-ASCII, + UTF-8, + UTF-16, and + ISO-8859-1. + Also see the option. + + + + + + + + + Outputs some strange sort of XML file that completely + describes the the input file, including character postitions. + Requires to specify an output file. + + + + + + + + + Turns on namespace processing. (describe namespaces) + disables namespaces. + + + + + + + + + Tells xmlwf to process external DTDs and parameter + entities. + + + Normally &dhpackage; never parses parameter + entities. tells it to always parse them. + implies . + + + + + + + + + Normally &dhpackage; memory-maps the XML file + before parsing; this can result in faster parsing on many + platforms. + turns off memory-mapping and uses normal file + IO calls instead. + Of course, memory-mapping is automatically turned off + when reading from standard input. + + + Use of memory-mapping can cause some platforms to report + substantially higher memory usage for + &dhpackage;, but this appears to be a matter of + the operating system reporting memory in a strange way; there is + not a leak in &dhpackage;. + + + + + + + + + Prints an error if the document is not standalone. + A document is standalone if it has no external subset and no + references to parameter entities. + + + + + + + + + Turns on timings. This tells Expat to parse the entire file, + but not perform any processing. + This gives a fairly accurate idea of the raw speed of Expat itself + without client overhead. + turns off most of the output options + (, , , + ...). + + + + + + + + + Prints the version of the Expat library being used, including some + information on the compile-time configuration of the library, and + then exits. + + + + + + + + + Enables support for Windows code pages. + Normally, &dhpackage; will throw an error if it + runs across an encoding that it is not equipped to handle itself. With + , &dhpackage; will try to use a Windows code + page. See also . + + + + + + + + + Turns on parsing external entities. + + + Non-validating parsers are not required to resolve external + entities, or even expand entities at all. + Expat always expands internal entities (?), + but external entity parsing must be enabled explicitly. + + + External entities are simply entities that obtain their + data from outside the XML file currently being parsed. + + + This is an example of an internal entity: + +<!ENTITY vers '1.0.2'> + + + + And here are some examples of external entities: + + +<!ENTITY header SYSTEM "header-&vers;.xml"> (parsed) +<!ENTITY logo SYSTEM "logo.png" PNG> (unparsed) + + + + + + + + + + + (Two hyphens.) + Terminates the list of options. This is only needed if a filename + starts with a hyphen. For example: + + +&dhpackage; -- -myfile.xml + + + will run &dhpackage; on the file + -myfile.xml. + + + + + + + Older versions of &dhpackage; do not support + reading from standard input. + + + + + OUTPUT + + If an input file is not well-formed, + &dhpackage; prints a single line describing + the problem to standard output. If a file is well formed, + &dhpackage; outputs nothing. + Note that the result code is not set. + + + + + BUGS + + According to the W3C standard, an XML file without a + declaration at the beginning is not considered well-formed. + However, &dhpackage; allows this to pass. + + + &dhpackage; returns a 0 - noerr result, + even if the file is not well-formed. There is no good way for + a program to use &dhpackage; to quickly + check a file -- it must parse &dhpackage;'s + standard output. + + + The errors should go to standard error, not standard output. + + + There should be a way to get to send its + output to standard output rather than forcing the user to send + it to a file. + + + I have no idea why anyone would want to use the + , , and + options. If someone could explain it to + me, I'd like to add this information to this manpage. + + + + + ALTERNATIVES + + Here are some XML validators on the web: + + +http://www.hcrc.ed.ac.uk/~richard/xml-check.html +http://www.stg.brown.edu/service/xmlvalid/ +http://www.scripting.com/frontier5/xml/code/xmlValidator.html +http://www.xml.com/pub/a/tools/ruwf/check.html + + + + + + + SEE ALSO + + + +The Expat home page: http://www.libexpat.org/ +The W3 XML specification: http://www.w3.org/TR/REC-xml + + + + + + + AUTHOR + + This manual page was written by &dhusername; &dhemail; for + the &debian; system (but may be used by others). Permission is + granted to copy, distribute and/or modify this document under + the terms of the GNU Free Documentation + License, Version 1.1. + + +
+ + diff --git a/reactos/lib/expat/examples/.cvsignore b/reactos/lib/expat/examples/.cvsignore new file mode 100644 index 00000000000..88a46969cd6 --- /dev/null +++ b/reactos/lib/expat/examples/.cvsignore @@ -0,0 +1,8 @@ +Makefile +elements +elements.plg +outline +outline.plg +Debug +Release +.libs diff --git a/reactos/lib/expat/examples/elements.c b/reactos/lib/expat/examples/elements.c new file mode 100644 index 00000000000..78d7d933407 --- /dev/null +++ b/reactos/lib/expat/examples/elements.c @@ -0,0 +1,50 @@ +/* This is simple demonstration of how to use expat. This program + reads an XML document from standard input and writes a line with + the name of each element to standard output indenting child + elements by one tab stop more than their parent element. +*/ + +#include +#include "expat.h" + +static void XMLCALL +startElement(void *userData, const char *name, const char **atts) +{ + int i; + int *depthPtr = userData; + for (i = 0; i < *depthPtr; i++) + putchar('\t'); + puts(name); + *depthPtr += 1; +} + +static void XMLCALL +endElement(void *userData, const char *name) +{ + int *depthPtr = userData; + *depthPtr -= 1; +} + +int +main(int argc, char *argv[]) +{ + char buf[BUFSIZ]; + XML_Parser parser = XML_ParserCreate(NULL); + int done; + int depth = 0; + XML_SetUserData(parser, &depth); + XML_SetElementHandler(parser, startElement, endElement); + do { + size_t len = fread(buf, 1, sizeof(buf), stdin); + done = len < sizeof(buf); + if (XML_Parse(parser, buf, len, done) == XML_STATUS_ERROR) { + fprintf(stderr, + "%s at line %d\n", + XML_ErrorString(XML_GetErrorCode(parser)), + XML_GetCurrentLineNumber(parser)); + return 1; + } + } while (!done); + XML_ParserFree(parser); + return 0; +} diff --git a/reactos/lib/expat/examples/elements.dsp b/reactos/lib/expat/examples/elements.dsp new file mode 100644 index 00000000000..8caa2798dee --- /dev/null +++ b/reactos/lib/expat/examples/elements.dsp @@ -0,0 +1,103 @@ +# Microsoft Developer Studio Project File - Name="elements" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=elements - 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 "elements.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 "elements.mak" CFG="elements - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "elements - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "elements - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "elements - 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 Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\lib" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "XML_STATIC" /FD /c +# SUBTRACT CPP /X /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 odbccp32.lib libexpatMT.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib /nologo /subsystem:console /pdb:none /machine:I386 /libpath:"..\lib\Release_static" + +!ELSEIF "$(CFG)" == "elements - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /GX /ZI /Od /I "..\lib" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "XML_STATIC" /FR /FD /GZ /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 odbccp32.lib libexpatMT.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib /nologo /subsystem:console /pdb:none /debug /machine:I386 /libpath:"..\lib\Debug_static" + +!ENDIF + +# Begin Target + +# Name "elements - Win32 Release" +# Name "elements - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\elements.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/reactos/lib/expat/examples/outline.c b/reactos/lib/expat/examples/outline.c new file mode 100644 index 00000000000..43ee74b6d40 --- /dev/null +++ b/reactos/lib/expat/examples/outline.c @@ -0,0 +1,90 @@ +/***************************************************************** + * outline.c + * + * Copyright 1999, Clark Cooper + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the license contained in the + * COPYING file that comes with the expat distribution. + * + * 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. + * + * Read an XML document from standard input and print an element + * outline on standard output. + */ + + +#include +#include + +#define BUFFSIZE 8192 + +char Buff[BUFFSIZE]; + +int Depth; + +static void XMLCALL +start(void *data, const char *el, const char **attr) +{ + int i; + + for (i = 0; i < Depth; i++) + printf(" "); + + printf("%s", el); + + for (i = 0; attr[i]; i += 2) { + printf(" %s='%s'", attr[i], attr[i + 1]); + } + + printf("\n"); + Depth++; +} + +static void XMLCALL +end(void *data, const char *el) +{ + Depth--; +} + +int +main(int argc, char *argv[]) +{ + XML_Parser p = XML_ParserCreate(NULL); + if (! p) { + fprintf(stderr, "Couldn't allocate memory for parser\n"); + exit(-1); + } + + XML_SetElementHandler(p, start, end); + + for (;;) { + int done; + int len; + + len = fread(Buff, 1, BUFFSIZE, stdin); + if (ferror(stdin)) { + fprintf(stderr, "Read error\n"); + exit(-1); + } + done = feof(stdin); + + if (XML_Parse(p, Buff, len, done) == XML_STATUS_ERROR) { + fprintf(stderr, "Parse error at line %d:\n%s\n", + XML_GetCurrentLineNumber(p), + XML_ErrorString(XML_GetErrorCode(p))); + exit(-1); + } + + if (done) + break; + } + return 0; +} diff --git a/reactos/lib/expat/examples/outline.dsp b/reactos/lib/expat/examples/outline.dsp new file mode 100644 index 00000000000..c74481d9c20 --- /dev/null +++ b/reactos/lib/expat/examples/outline.dsp @@ -0,0 +1,103 @@ +# Microsoft Developer Studio Project File - Name="outline" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=outline - 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 "outline.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 "outline.mak" CFG="outline - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "outline - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "outline - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "outline - 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 Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\lib" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c +# SUBTRACT CPP /X /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /pdb:none /machine:I386 + +!ELSEIF "$(CFG)" == "outline - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\lib" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /pdb:none /debug /machine:I386 + +!ENDIF + +# Begin Target + +# Name "outline - Win32 Release" +# Name "outline - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\outline.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/reactos/lib/expat/expat.dsw b/reactos/lib/expat/expat.dsw new file mode 100644 index 00000000000..2d62eec5f6c --- /dev/null +++ b/reactos/lib/expat/expat.dsw @@ -0,0 +1,110 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "elements"=.\examples\elements.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name expat_static + End Project Dependency +}}} + +############################################################################### + +Project: "expat"=.\lib\expat.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "expat_static"=.\lib\expat_static.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "expatw"=.\lib\expatw.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "expatw_static"=.\lib\expatw_static.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "outline"=.\examples\outline.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name expat + End Project Dependency +}}} + +############################################################################### + +Project: "xmlwf"=.\xmlwf\xmlwf.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name expat + End Project Dependency +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/reactos/lib/expat/expat.spec b/reactos/lib/expat/expat.spec new file mode 100644 index 00000000000..33ba187a877 --- /dev/null +++ b/reactos/lib/expat/expat.spec @@ -0,0 +1,86 @@ +%define version 1.95.7 +%define release 1 + +Summary: Expat is an XML 1.0 parser written in C. +Name: expat +Version: %{version} +Release: %{release} +Copyright: MIT/X +Group: Utilities/parsers +URL: http://www.libexpat.org/ +Source: http://download.sourceforge.net/expat/expat-%{version}.tar.gz +BuildRoot: /var/tmp/%{name}-buildroot + +%description +Expat is an XML 1.0 parser written in C by James Clark. It aims to be +fully conforming. It is not a validating XML parser. + +%prep +%setup + +%build +./configure +make lib xmlwf + +%install +rm -rf $RPM_BUILD_ROOT +mkdir -p $RPM_BUILD_ROOT/usr/bin +mkdir -p $RPM_BUILD_ROOT/usr/lib +mkdir -p $RPM_BUILD_ROOT/usr/include +make install prefix=$RPM_BUILD_ROOT/usr +install -D xmlwf/xmlwf $RPM_BUILD_ROOT/usr/bin/xmlwf + +%files +%doc COPYING Changes MANIFEST README doc/reference.html doc/style.css doc/*.png +/usr/bin/xmlwf +/usr/lib +/usr/include/expat.h +/usr/man/man1/xmlwf.1.gz + +%changelog +* Tue Oct 21 2003 Fred L. Drake, Jr. +- Update list of documentation files; we missed a .png file in the + previous release. + +* Mon Oct 20 2003 Fred L. Drake, Jr. +[Release 1.95.7-1] +- Updated for the 1.95.7 release. + +* Sat Jan 25 2003 Fred L. Drake, Jr. +[Release 1.95.6-1] +- Updated for the 1.95.6 release. + +* Wed Sep 4 2002 Fred L. Drake, Jr. +[Release 1.95.5-1] +- Updated for the 1.95.5 release. +- Updated URL for Expat home page to point to www.libexpat.org. +- Added "Valid XHTML 1.0" icon to the installed documentation. + +* Sat Jun 29 2002 Fred L. Drake, Jr. +[Release 1.95.4-1] +- Updated for the 1.95.4 release. + +* Fri May 17 2002 Fred L. Drake, Jr. +[Release 1.95.3-1] +- Updated for the 1.95.3 release. +- Added xmlwf man page to the list of files. + +* Wed Jul 25 2001 Fred L. Drake, Jr. +[Release 1.95.2-1] +- Updated for the 1.95.2 release. + +* Sun Feb 18 2001 Sean Reifschneider +[Release 1.95.1-1tummy] +- Updated to 1.95.1 release. +- Removed the "/usr/include/expat" directory for headers, as it now uses + "expat.h" instead of "xmlparser.h". + +* Thu Jan 25 2001 Sean Reifschneider +[Release 1.1-3tummy] +- Moved xmlparse.h into "/usr/include/expat" directory to prevent conflict + with w3c-libwww-devel package. + +* Wed Sep 6 2000 Sean Reifschneider +- Modified to install into /usr. +- Modified to use RPM_BUILD_ROOT instead of writing directly to install + location. diff --git a/reactos/lib/expat/gennmtab/.cvsignore b/reactos/lib/expat/gennmtab/.cvsignore new file mode 100644 index 00000000000..f966c45cfd1 --- /dev/null +++ b/reactos/lib/expat/gennmtab/.cvsignore @@ -0,0 +1,3 @@ +Debug +Release +gennmtab.plg diff --git a/reactos/lib/expat/gennmtab/gennmtab.c b/reactos/lib/expat/gennmtab/gennmtab.c new file mode 100644 index 00000000000..8a4ff347262 --- /dev/null +++ b/reactos/lib/expat/gennmtab/gennmtab.c @@ -0,0 +1,429 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#include +#include +#include + +struct range { + int start; + int end; +}; + +struct range nmstrt[] = { + { '_' }, + { ':' }, + /* BaseChar */ + { 0x0041, 0x005a }, + { 0x0061, 0x007a }, + { 0x00c0, 0x00d6 }, + { 0x00d8, 0x00f6 }, + { 0x00f8, 0x00ff }, + { 0x0100, 0x0131 }, + { 0x0134, 0x013e }, + { 0x0141, 0x0148 }, + { 0x014a, 0x017e }, + { 0x0180, 0x01c3 }, + { 0x01cd, 0x01f0 }, + { 0x01f4, 0x01f5 }, + { 0x01fa, 0x0217 }, + { 0x0250, 0x02a8 }, + { 0x02bb, 0x02c1 }, + { 0x0386 }, + { 0x0388, 0x038a }, + { 0x038c }, + { 0x038e, 0x03a1 }, + { 0x03a3, 0x03ce }, + { 0x03d0, 0x03d6 }, + { 0x03da }, + { 0x03dc }, + { 0x03de }, + { 0x03e0 }, + { 0x03e2, 0x03f3 }, + { 0x0401, 0x040c }, + { 0x040e, 0x044f }, + { 0x0451, 0x045c }, + { 0x045e, 0x0481 }, + { 0x0490, 0x04c4 }, + { 0x04c7, 0x04c8 }, + { 0x04cb, 0x04cc }, + { 0x04d0, 0x04eb }, + { 0x04ee, 0x04f5 }, + { 0x04f8, 0x04f9 }, + { 0x0531, 0x0556 }, + { 0x0559 }, + { 0x0561, 0x0586 }, + { 0x05d0, 0x05ea }, + { 0x05f0, 0x05f2 }, + { 0x0621, 0x063a }, + { 0x0641, 0x064a }, + { 0x0671, 0x06b7 }, + { 0x06ba, 0x06be }, + { 0x06c0, 0x06ce }, + { 0x06d0, 0x06d3 }, + { 0x06d5 }, + { 0x06e5, 0x06e6 }, + { 0x0905, 0x0939 }, + { 0x093d }, + { 0x0958, 0x0961 }, + { 0x0985, 0x098c }, + { 0x098f, 0x0990 }, + { 0x0993, 0x09a8 }, + { 0x09aa, 0x09b0 }, + { 0x09b2 }, + { 0x09b6, 0x09b9 }, + { 0x09dc, 0x09dd }, + { 0x09df, 0x09e1 }, + { 0x09f0, 0x09f1 }, + { 0x0a05, 0x0a0a }, + { 0x0a0f, 0x0a10 }, + { 0x0a13, 0x0a28 }, + { 0x0a2a, 0x0a30 }, + { 0x0a32, 0x0a33 }, + { 0x0a35, 0x0a36 }, + { 0x0a38, 0x0a39 }, + { 0x0a59, 0x0a5c }, + { 0x0a5e }, + { 0x0a72, 0x0a74 }, + { 0x0a85, 0x0a8b }, + { 0x0a8d }, + { 0x0a8f, 0x0a91 }, + { 0x0a93, 0x0aa8 }, + { 0x0aaa, 0x0ab0 }, + { 0x0ab2, 0x0ab3 }, + { 0x0ab5, 0x0ab9 }, + { 0x0abd }, + { 0x0ae0 }, + { 0x0b05, 0x0b0c }, + { 0x0b0f, 0x0b10 }, + { 0x0b13, 0x0b28 }, + { 0x0b2a, 0x0b30 }, + { 0x0b32, 0x0b33 }, + { 0x0b36, 0x0b39 }, + { 0x0b3d }, + { 0x0b5c, 0x0b5d }, + { 0x0b5f, 0x0b61 }, + { 0x0b85, 0x0b8a }, + { 0x0b8e, 0x0b90 }, + { 0x0b92, 0x0b95 }, + { 0x0b99, 0x0b9a }, + { 0x0b9c }, + { 0x0b9e, 0x0b9f }, + { 0x0ba3, 0x0ba4 }, + { 0x0ba8, 0x0baa }, + { 0x0bae, 0x0bb5 }, + { 0x0bb7, 0x0bb9 }, + { 0x0c05, 0x0c0c }, + { 0x0c0e, 0x0c10 }, + { 0x0c12, 0x0c28 }, + { 0x0c2a, 0x0c33 }, + { 0x0c35, 0x0c39 }, + { 0x0c60, 0x0c61 }, + { 0x0c85, 0x0c8c }, + { 0x0c8e, 0x0c90 }, + { 0x0c92, 0x0ca8 }, + { 0x0caa, 0x0cb3 }, + { 0x0cb5, 0x0cb9 }, + { 0x0cde }, + { 0x0ce0, 0x0ce1 }, + { 0x0d05, 0x0d0c }, + { 0x0d0e, 0x0d10 }, + { 0x0d12, 0x0d28 }, + { 0x0d2a, 0x0d39 }, + { 0x0d60, 0x0d61 }, + { 0x0e01, 0x0e2e }, + { 0x0e30 }, + { 0x0e32, 0x0e33 }, + { 0x0e40, 0x0e45 }, + { 0x0e81, 0x0e82 }, + { 0x0e84 }, + { 0x0e87, 0x0e88 }, + { 0x0e8a }, + { 0x0e8d }, + { 0x0e94, 0x0e97 }, + { 0x0e99, 0x0e9f }, + { 0x0ea1, 0x0ea3 }, + { 0x0ea5 }, + { 0x0ea7 }, + { 0x0eaa, 0x0eab }, + { 0x0ead, 0x0eae }, + { 0x0eb0 }, + { 0x0eb2, 0x0eb3 }, + { 0x0ebd }, + { 0x0ec0, 0x0ec4 }, + { 0x0f40, 0x0f47 }, + { 0x0f49, 0x0f69 }, + { 0x10a0, 0x10c5 }, + { 0x10d0, 0x10f6 }, + { 0x1100 }, + { 0x1102, 0x1103 }, + { 0x1105, 0x1107 }, + { 0x1109 }, + { 0x110b, 0x110c }, + { 0x110e, 0x1112 }, + { 0x113c }, + { 0x113e }, + { 0x1140 }, + { 0x114c }, + { 0x114e }, + { 0x1150 }, + { 0x1154, 0x1155 }, + { 0x1159 }, + { 0x115f, 0x1161 }, + { 0x1163 }, + { 0x1165 }, + { 0x1167 }, + { 0x1169 }, + { 0x116d, 0x116e }, + { 0x1172, 0x1173 }, + { 0x1175 }, + { 0x119e }, + { 0x11a8 }, + { 0x11ab }, + { 0x11ae, 0x11af }, + { 0x11b7, 0x11b8 }, + { 0x11ba }, + { 0x11bc, 0x11c2 }, + { 0x11eb }, + { 0x11f0 }, + { 0x11f9 }, + { 0x1e00, 0x1e9b }, + { 0x1ea0, 0x1ef9 }, + { 0x1f00, 0x1f15 }, + { 0x1f18, 0x1f1d }, + { 0x1f20, 0x1f45 }, + { 0x1f48, 0x1f4d }, + { 0x1f50, 0x1f57 }, + { 0x1f59 }, + { 0x1f5b }, + { 0x1f5d }, + { 0x1f5f, 0x1f7d }, + { 0x1f80, 0x1fb4 }, + { 0x1fb6, 0x1fbc }, + { 0x1fbe }, + { 0x1fc2, 0x1fc4 }, + { 0x1fc6, 0x1fcc }, + { 0x1fd0, 0x1fd3 }, + { 0x1fd6, 0x1fdb }, + { 0x1fe0, 0x1fec }, + { 0x1ff2, 0x1ff4 }, + { 0x1ff6, 0x1ffc }, + { 0x2126 }, + { 0x212a, 0x212b }, + { 0x212e }, + { 0x2180, 0x2182 }, + { 0x3041, 0x3094 }, + { 0x30a1, 0x30fa }, + { 0x3105, 0x312c }, + { 0xac00, 0xd7a3 }, + /* Ideographic */ + { 0x4e00, 0x9fa5 }, + { 0x3007 }, + { 0x3021, 0x3029 }, +}; + +/* name chars that are not name start chars */ +struct range name[] = { + { '.' }, + { '-' }, + /* CombiningChar */ + { 0x0300, 0x0345 }, + { 0x0360, 0x0361 }, + { 0x0483, 0x0486 }, + { 0x0591, 0x05a1 }, + { 0x05a3, 0x05b9 }, + { 0x05bb, 0x05bd }, + { 0x05bf }, + { 0x05c1, 0x05c2 }, + { 0x05c4 }, + { 0x064b, 0x0652 }, + { 0x0670 }, + { 0x06d6, 0x06dc }, + { 0x06dd, 0x06df }, + { 0x06e0, 0x06e4 }, + { 0x06e7, 0x06e8 }, + { 0x06ea, 0x06ed }, + { 0x0901, 0x0903 }, + { 0x093c }, + { 0x093e, 0x094c }, + { 0x094d }, + { 0x0951, 0x0954 }, + { 0x0962, 0x0963 }, + { 0x0981, 0x0983 }, + { 0x09bc }, + { 0x09be }, + { 0x09bf }, + { 0x09c0, 0x09c4 }, + { 0x09c7, 0x09c8 }, + { 0x09cb, 0x09cd }, + { 0x09d7 }, + { 0x09e2, 0x09e3 }, + { 0x0a02 }, + { 0x0a3c }, + { 0x0a3e }, + { 0x0a3f }, + { 0x0a40, 0x0a42 }, + { 0x0a47, 0x0a48 }, + { 0x0a4b, 0x0a4d }, + { 0x0a70, 0x0a71 }, + { 0x0a81, 0x0a83 }, + { 0x0abc }, + { 0x0abe, 0x0ac5 }, + { 0x0ac7, 0x0ac9 }, + { 0x0acb, 0x0acd }, + { 0x0b01, 0x0b03 }, + { 0x0b3c }, + { 0x0b3e, 0x0b43 }, + { 0x0b47, 0x0b48 }, + { 0x0b4b, 0x0b4d }, + { 0x0b56, 0x0b57 }, + { 0x0b82, 0x0b83 }, + { 0x0bbe, 0x0bc2 }, + { 0x0bc6, 0x0bc8 }, + { 0x0bca, 0x0bcd }, + { 0x0bd7 }, + { 0x0c01, 0x0c03 }, + { 0x0c3e, 0x0c44 }, + { 0x0c46, 0x0c48 }, + { 0x0c4a, 0x0c4d }, + { 0x0c55, 0x0c56 }, + { 0x0c82, 0x0c83 }, + { 0x0cbe, 0x0cc4 }, + { 0x0cc6, 0x0cc8 }, + { 0x0cca, 0x0ccd }, + { 0x0cd5, 0x0cd6 }, + { 0x0d02, 0x0d03 }, + { 0x0d3e, 0x0d43 }, + { 0x0d46, 0x0d48 }, + { 0x0d4a, 0x0d4d }, + { 0x0d57 }, + { 0x0e31 }, + { 0x0e34, 0x0e3a }, + { 0x0e47, 0x0e4e }, + { 0x0eb1 }, + { 0x0eb4, 0x0eb9 }, + { 0x0ebb, 0x0ebc }, + { 0x0ec8, 0x0ecd }, + { 0x0f18, 0x0f19 }, + { 0x0f35 }, + { 0x0f37 }, + { 0x0f39 }, + { 0x0f3e }, + { 0x0f3f }, + { 0x0f71, 0x0f84 }, + { 0x0f86, 0x0f8b }, + { 0x0f90, 0x0f95 }, + { 0x0f97 }, + { 0x0f99, 0x0fad }, + { 0x0fb1, 0x0fb7 }, + { 0x0fb9 }, + { 0x20d0, 0x20dc }, + { 0x20e1 }, + { 0x302a, 0x302f }, + { 0x3099 }, + { 0x309a }, + /* Digit */ + { 0x0030, 0x0039 }, + { 0x0660, 0x0669 }, + { 0x06f0, 0x06f9 }, + { 0x0966, 0x096f }, + { 0x09e6, 0x09ef }, + { 0x0a66, 0x0a6f }, + { 0x0ae6, 0x0aef }, + { 0x0b66, 0x0b6f }, + { 0x0be7, 0x0bef }, + { 0x0c66, 0x0c6f }, + { 0x0ce6, 0x0cef }, + { 0x0d66, 0x0d6f }, + { 0x0e50, 0x0e59 }, + { 0x0ed0, 0x0ed9 }, + { 0x0f20, 0x0f29 }, + /* Extender */ + { 0xb7 }, + { 0x02d0 }, + { 0x02d1 }, + { 0x0387 }, + { 0x0640 }, + { 0x0e46 }, + { 0x0ec6 }, + { 0x3005 }, + { 0x3031, 0x3035 }, + { 0x309d, 0x309e }, + { 0x30fc, 0x30fe }, +}; + +static void +setTab(char *tab, struct range *ranges, size_t nRanges) +{ + size_t i; + int j; + for (i = 0; i < nRanges; i++) { + if (ranges[i].end) { + for (j = ranges[i].start; j <= ranges[i].end; j++) + tab[j] = 1; + } + else + tab[ranges[i].start] = 1; + } +} + +static void +printTabs(char *tab) +{ + int nBitmaps = 2; + int i, j, k; + unsigned char pageIndex[512]; + + printf( +"static const unsigned namingBitmap[] = {\n\ +0x00000000, 0x00000000, 0x00000000, 0x00000000,\n\ +0x00000000, 0x00000000, 0x00000000, 0x00000000,\n\ +0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,\n\ +0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,\n"); + for (i = 0; i < 512; i++) { + int kind = tab[i*256]; + for (j = 1; j < 256; j++) + if (tab[i*256 +j] != kind) { + kind = -1; + break; + } + if (i >= 256 && memcmp(tab + (i - 256)*256, tab + i*256, 256) == 0) + pageIndex[i] = pageIndex[i - 256]; + else if (kind == -1) { + pageIndex[i] = nBitmaps++; + for (j = 0; j < 8; j++) { + unsigned val = 0; + for (k = 0; k < 32; k++) { + if (tab[i*256 + j*32 +k]) + val |= (1 << k); + } + printf("0x%08X,", val); + putchar((((j + 1) & 3) == 0) ? '\n' : ' '); + } + } + else + pageIndex[i] = kind; + } + printf("};\n"); + printf("static const unsigned char nmstrtPages[] = {\n"); + for (i = 0; i < 512; i++) { + if (i == 256) + printf("};\nstatic const unsigned char namePages[] = {\n"); + printf("0x%02X,", pageIndex[i]); + putchar((((i + 1) & 7) == 0) ? '\n' : ' '); + } + printf("};\n"); +} + +int +main() +{ + char tab[2*65536]; + memset(tab, 0, 65536); + setTab(tab, nmstrt, sizeof(nmstrt)/sizeof(nmstrt[0])); + memcpy(tab + 65536, tab, 65536); + setTab(tab + 65536, name, sizeof(name)/sizeof(name[0])); + printTabs(tab); + return 0; +} diff --git a/reactos/lib/expat/gennmtab/gennmtab.dsp b/reactos/lib/expat/gennmtab/gennmtab.dsp new file mode 100644 index 00000000000..bdbbe3cd36f --- /dev/null +++ b/reactos/lib/expat/gennmtab/gennmtab.dsp @@ -0,0 +1,101 @@ +# Microsoft Developer Studio Project File - Name="gennmtab" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=gennmtab - Win32 Release +!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 "gennmtab.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 "gennmtab.mak" CFG="gennmtab - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "gennmtab - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "gennmtab - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "gennmtab - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir ".\Release" +# PROP BASE Intermediate_Dir ".\Release" +# PROP BASE Target_Dir "." +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir ".\Release" +# PROP Intermediate_Dir ".\Release" +# PROP Target_Dir "." +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c +# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /FD /c +# ADD BASE RSC /l 0x809 /d "NDEBUG" +# ADD RSC /l 0x809 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "gennmtab - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir ".\Debug" +# PROP BASE Intermediate_Dir ".\Debug" +# PROP BASE Target_Dir "." +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir ".\Debug" +# PROP Intermediate_Dir ".\Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "." +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /FD /c +# ADD BASE RSC /l 0x809 /d "_DEBUG" +# ADD RSC /l 0x809 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 + +!ENDIF + +# Begin Target + +# Name "gennmtab - Win32 Release" +# Name "gennmtab - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat;for;f90" +# Begin Source File + +SOURCE=.\gennmtab.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/reactos/lib/expat/lib/Makefile.MPW b/reactos/lib/expat/lib/Makefile.MPW new file mode 100644 index 00000000000..046af005147 --- /dev/null +++ b/reactos/lib/expat/lib/Makefile.MPW @@ -0,0 +1,206 @@ +# File: Makefile.MPW +# Targets: All, Dynamic, Static (and Clean, Clean-All) +# Created: Tuesday, July 02, 2002 +# +# MPW Makefile for building expat under the "classic" (i.e. pre-X) Mac OS +# Copyright 2002 Daryle Walker +# Portions Copyright 2002 Thomas Wegner +# See the COPYING file for distribution information +# +# Description: +# This Makefile lets you build static, dynamic (i.e. shared) and stub +# versions of the expat library as well as the elements.c and outline.c +# examples (built as tools for MPW). This is for PPC only; it should be +# no problem to build a 68K version of the expat library, though. +# +# Usage: +# Buildprogram All +# or Buildprogram Dynamic +# or Buildprogram Static +# +# Note: You first have to rename this file to "Makefile", or the Buildprogram +# commando will not recognize it. +# + +MAKEFILE = Makefile +ondoBuild = {MAKEFILE} # Make blank to avoid rebuilds when makefile is modified + +ObjDir = : +SrcDir = : +HdrDir = : + +ToolDir = ::examples: + +Includes = -i {HdrDir} + +Sym-PPC = -sym off + +Defines = -d MACOS_CLASSIC + +PPCCOptions = {Includes} {Sym-PPC} -w 35 {Defines} + +FragName = libexpat + + +### Source Files ### + +SrcFiles = + "{SrcDir}xmlparse.c" + "{SrcDir}xmlrole.c" + "{SrcDir}xmltok.c" + +ToolSrcFiles = + "{ToolDir}elements.c" + "{ToolDir}outline.c" + + +### Object Files ### + +ObjFiles-PPC = + "{ObjDir}xmlparse.c.o" + "{ObjDir}xmlrole.c.o" + "{ObjDir}xmltok.c.o" + +ElementToolObjFile = "{ObjDir}elements.c.o" + +OutlineToolObjFile = "{ObjDir}outline.c.o" + + +### Libraries ### + +StLibFiles-PPC = + "{PPCLibraries}StdCRuntime.o" + "{PPCLibraries}PPCCRuntime.o" + "{PPCLibraries}PPCToolLibs.o" + +ShLibFiles-PPC = + "{SharedLibraries}InterfaceLib" + "{SharedLibraries}StdCLib" + "{SharedLibraries}MathLib" + +LibFiles-PPC = + {StLibFiles-PPC} + {ShLibFiles-PPC} + + +### Special Files ### + +ExportFile = "{ObjDir}{FragName}.exp" + +StLibFile = "{ObjDir}{FragName}.MrC.o" + +ShLibFile = "{ObjDir}{FragName}" + +StubFile = "{ObjDir}{FragName}.stub" + +ElementsTool = "{ToolDir}elements" + +OutlineTool = "{ToolDir}outline" + + +### Default Rules ### + +.c.o .c {ondoBuild + {PPCC} {depDir}{default}.c -o {targDir}{default}.c.o {PPCCOptions} + + +### Build Rules ### + +All Dynamic {ElementsTool} {OutlineTool} + +Static {StLibFile} + +Dynamic Static {ShLibFile} {StubFile} + +{StLibFile} 哪 {ObjFiles-PPC} {StLibFiles-PPC} {ondoBuild + PPCLink + -o {Targ} + {ObjFiles-PPC} + {StLibFiles-PPC} + {Sym-PPC} + -mf -d + -t 'XCOF' + -c 'MPS ' + -xm l + +{ShLibFile} 哪 {StLibFile} {ShLibFiles-PPC} {ExportFile} {ondoBuild + PPCLink + -o {Targ} + {StLibFile} + {ShLibFiles-PPC} + {Sym-PPC} + -@export {ExportFile} + -fragname {FragName} + -mf -d + -t 'shlb' + -c '????' + -xm s + +{StubFile} 哪 {ShLibFile} {ondoBuild + shlb2stub -o {Targ} {ShLibFile} + +{ElementsTool} 哪 {ElementToolObjFile} {StubFile} {LibFiles-PPC} {ondoBuild + PPCLink + -o {Targ} + {ElementToolObjFile} + {StLibFile} + {LibFiles-PPC} + {Sym-PPC} + -mf -d + -t 'MPST' + -c 'MPS ' + +{OutlineTool} 哪 {OutlineToolObjFile} {StubFile} {LibFiles-PPC} {ondoBuild + PPCLink + -o {Targ} + {OutlineToolObjFile} + {StLibFile} + {LibFiles-PPC} + {Sym-PPC} + -mf -d + -t 'MPST' + -c 'MPS ' + + +### Special Rules ### + +{ExportFile} 哪 "{HdrDir}expat.h" {ondoBuild + StreamEdit -d + -e "/('XMLPARSEAPI('') ')0,1'XML_'([A-Za-z0-9_]+)1'('/ Print 'XML_' 1" + "{HdrDir}expat.h" > {Targ} + + +### Required Dependencies ### + +"{ObjDir}xmlparse.c.o" "{SrcDir}xmlparse.c" +"{ObjDir}xmlrole.c.o" "{SrcDir}xmlrole.c" +"{ObjDir}xmltok.c.o" "{SrcDir}xmltok.c" + +"{ObjDir}elements.c.o" "{ToolDir}elements.c" +"{ObjDir}outline.c.o" "{ToolDir}outline.c" + + +### Optional Dependencies ### +### Build this target to clean out generated intermediate files. ### + +Clean + Delete {ObjFiles-PPC} {ExportFile} {ElementToolObjFile} {OutlineToolObjFile} + +### Build this target to clean out all generated files. ### + +Clean-All Clean + Delete {StLibFile} {ShLibFile} {StubFile} {ElementsTool} {OutlineTool} + +### Build this target to generate "include file" dependencies. ### + +Dependencies $OutOfDate + MakeDepend + -append {MAKEFILE} + -ignore "{CIncludes}" + -objdir "{ObjDir}" + -objext .o + {Defines} + {Includes} + {SrcFiles} + + diff --git a/reactos/lib/expat/lib/ascii.h b/reactos/lib/expat/lib/ascii.h new file mode 100644 index 00000000000..337e5bb7ea0 --- /dev/null +++ b/reactos/lib/expat/lib/ascii.h @@ -0,0 +1,85 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#define ASCII_A 0x41 +#define ASCII_B 0x42 +#define ASCII_C 0x43 +#define ASCII_D 0x44 +#define ASCII_E 0x45 +#define ASCII_F 0x46 +#define ASCII_G 0x47 +#define ASCII_H 0x48 +#define ASCII_I 0x49 +#define ASCII_J 0x4A +#define ASCII_K 0x4B +#define ASCII_L 0x4C +#define ASCII_M 0x4D +#define ASCII_N 0x4E +#define ASCII_O 0x4F +#define ASCII_P 0x50 +#define ASCII_Q 0x51 +#define ASCII_R 0x52 +#define ASCII_S 0x53 +#define ASCII_T 0x54 +#define ASCII_U 0x55 +#define ASCII_V 0x56 +#define ASCII_W 0x57 +#define ASCII_X 0x58 +#define ASCII_Y 0x59 +#define ASCII_Z 0x5A + +#define ASCII_a 0x61 +#define ASCII_b 0x62 +#define ASCII_c 0x63 +#define ASCII_d 0x64 +#define ASCII_e 0x65 +#define ASCII_f 0x66 +#define ASCII_g 0x67 +#define ASCII_h 0x68 +#define ASCII_i 0x69 +#define ASCII_j 0x6A +#define ASCII_k 0x6B +#define ASCII_l 0x6C +#define ASCII_m 0x6D +#define ASCII_n 0x6E +#define ASCII_o 0x6F +#define ASCII_p 0x70 +#define ASCII_q 0x71 +#define ASCII_r 0x72 +#define ASCII_s 0x73 +#define ASCII_t 0x74 +#define ASCII_u 0x75 +#define ASCII_v 0x76 +#define ASCII_w 0x77 +#define ASCII_x 0x78 +#define ASCII_y 0x79 +#define ASCII_z 0x7A + +#define ASCII_0 0x30 +#define ASCII_1 0x31 +#define ASCII_2 0x32 +#define ASCII_3 0x33 +#define ASCII_4 0x34 +#define ASCII_5 0x35 +#define ASCII_6 0x36 +#define ASCII_7 0x37 +#define ASCII_8 0x38 +#define ASCII_9 0x39 + +#define ASCII_TAB 0x09 +#define ASCII_SPACE 0x20 +#define ASCII_EXCL 0x21 +#define ASCII_QUOT 0x22 +#define ASCII_AMP 0x26 +#define ASCII_APOS 0x27 +#define ASCII_MINUS 0x2D +#define ASCII_PERIOD 0x2E +#define ASCII_COLON 0x3A +#define ASCII_SEMI 0x3B +#define ASCII_LT 0x3C +#define ASCII_EQUALS 0x3D +#define ASCII_GT 0x3E +#define ASCII_LSQB 0x5B +#define ASCII_RSQB 0x5D +#define ASCII_UNDERSCORE 0x5F diff --git a/reactos/lib/expat/lib/asciitab.h b/reactos/lib/expat/lib/asciitab.h new file mode 100644 index 00000000000..79a15c28ca1 --- /dev/null +++ b/reactos/lib/expat/lib/asciitab.h @@ -0,0 +1,36 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +/* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML, +/* 0x0C */ BT_NONXML, BT_CR, BT_NONXML, BT_NONXML, +/* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM, +/* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS, +/* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, +/* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL, +/* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, +/* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, +/* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI, +/* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST, +/* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, +/* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, +/* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB, +/* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT, +/* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, +/* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, +/* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, +/* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER, diff --git a/reactos/lib/expat/lib/expat.dsp b/reactos/lib/expat/lib/expat.dsp new file mode 100644 index 00000000000..0724cb5bd2f --- /dev/null +++ b/reactos/lib/expat/lib/expat.dsp @@ -0,0 +1,168 @@ +# Microsoft Developer Studio Project File - Name="expat" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=expat - 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 "expat.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 "expat.mak" CFG="expat - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "expat - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "expat - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "expat - 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 Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXPAT_EXPORTS" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILED_FROM_DSP" /FD /c +# SUBTRACT CPP /YX /Yc /Yu +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /pdb:none /machine:I386 /out:"Release\libexpat.dll" + +!ELSEIF "$(CFG)" == "expat - 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 /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXPAT_EXPORTS" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /GX /ZI /Od /D "_DEBUG" /D "COMPILED_FROM_DSP" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /FR /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /pdb:none /debug /machine:I386 /out:"Debug\libexpat.dll" + +!ENDIF + +# Begin Target + +# Name "expat - Win32 Release" +# Name "expat - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\libexpat.def +# End Source File +# Begin Source File + +SOURCE=.\xmlparse.c + +!IF "$(CFG)" == "expat - Win32 Release" + +!ELSEIF "$(CFG)" == "expat - Win32 Debug" + +# ADD CPP /GX- /Od + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\xmlrole.c +# End Source File +# Begin Source File + +SOURCE=.\xmltok.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\ascii.h +# End Source File +# Begin Source File + +SOURCE=.\asciitab.h +# End Source File +# Begin Source File + +SOURCE=.\expat.h +# End Source File +# Begin Source File + +SOURCE=.\iasciitab.h +# End Source File +# Begin Source File + +SOURCE=.\latin1tab.h +# End Source File +# Begin Source File + +SOURCE=.\nametab.h +# End Source File +# Begin Source File + +SOURCE=.\utf8tab.h +# End Source File +# Begin Source File + +SOURCE=.\xmlrole.h +# End Source File +# Begin Source File + +SOURCE=.\xmltok.h +# End Source File +# Begin Source File + +SOURCE=.\xmltok_impl.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/reactos/lib/expat/lib/expat.h b/reactos/lib/expat/lib/expat.h new file mode 100644 index 00000000000..d6e06d1694d --- /dev/null +++ b/reactos/lib/expat/lib/expat.h @@ -0,0 +1,1080 @@ +/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#ifndef XmlParse_INCLUDED +#define XmlParse_INCLUDED 1 + +#ifdef __VMS +/* 0 1 2 3 0 1 2 3 + 1234567890123456789012345678901 1234567890123456789012345678901 */ +#define XML_SetProcessingInstructionHandler XML_SetProcessingInstrHandler +#define XML_SetUnparsedEntityDeclHandler XML_SetUnparsedEntDeclHandler +#define XML_SetStartNamespaceDeclHandler XML_SetStartNamespcDeclHandler +#define XML_SetExternalEntityRefHandlerArg XML_SetExternalEntRefHandlerArg +#endif + +#include + +#if defined(_MSC_EXTENSIONS) && !defined(__BEOS__) && !defined(__CYGWIN__) +#define XML_USE_MSC_EXTENSIONS 1 +#endif + +/* Expat tries very hard to make the API boundary very specifically + defined. There are two macros defined to control this boundary; + each of these can be defined before including this header to + achieve some different behavior, but doing so it not recommended or + tested frequently. + + XMLCALL - The calling convention to use for all calls across the + "library boundary." This will default to cdecl, and + try really hard to tell the compiler that's what we + want. + + XMLIMPORT - Whatever magic is needed to note that a function is + to be imported from a dynamically loaded library + (.dll, .so, or .sl, depending on your platform). + + The XMLCALL macro was added in Expat 1.95.7. The only one which is + expected to be directly useful in client code is XMLCALL. + + Note that on at least some Unix versions, the Expat library must be + compiled with the cdecl calling convention as the default since + system headers may assume the cdecl convention. +*/ +#ifndef XMLCALL +#if defined(XML_USE_MSC_EXTENSIONS) +#define XMLCALL __cdecl +#elif defined(__GNUC__) && defined(__i386) +#define XMLCALL __attribute__((cdecl)) +#else +/* For any platform which uses this definition and supports more than + one calling convention, we need to extend this definition to + declare the convention used on that platform, if it's possible to + do so. + + If this is the case for your platform, please file a bug report + with information on how to identify your platform via the C + pre-processor and how to specify the same calling convention as the + platform's malloc() implementation. +*/ +#define XMLCALL +#endif +#endif /* not defined XMLCALL */ + + +#if !defined(XML_STATIC) && !defined(XMLIMPORT) +#ifndef XML_BUILDING_EXPAT +/* using Expat from an application */ + +#ifdef XML_USE_MSC_EXTENSIONS +#define XMLIMPORT __declspec(dllimport) +#endif + +#endif +#endif /* not defined XML_STATIC */ + +/* If we didn't define it above, define it away: */ +#ifndef XMLIMPORT +#define XMLIMPORT +#endif + + +#define XMLPARSEAPI(type) XMLIMPORT type XMLCALL + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef XML_UNICODE_WCHAR_T +#define XML_UNICODE +#endif + +struct XML_ParserStruct; +typedef struct XML_ParserStruct *XML_Parser; + +#ifdef XML_UNICODE /* Information is UTF-16 encoded. */ +#ifdef XML_UNICODE_WCHAR_T +typedef wchar_t XML_Char; +typedef wchar_t XML_LChar; +#else +typedef unsigned short XML_Char; +typedef char XML_LChar; +#endif /* XML_UNICODE_WCHAR_T */ +#else /* Information is UTF-8 encoded. */ +typedef char XML_Char; +typedef char XML_LChar; +#endif /* XML_UNICODE */ + +/* Should this be defined using stdbool.h when C99 is available? */ +typedef unsigned char XML_Bool; +#define XML_TRUE ((XML_Bool) 1) +#define XML_FALSE ((XML_Bool) 0) + +/* The XML_Status enum gives the possible return values for several + API functions. The preprocessor #defines are included so this + stanza can be added to code that still needs to support older + versions of Expat 1.95.x: + + #ifndef XML_STATUS_OK + #define XML_STATUS_OK 1 + #define XML_STATUS_ERROR 0 + #endif + + Otherwise, the #define hackery is quite ugly and would have been + dropped. +*/ +enum XML_Status { + XML_STATUS_ERROR = 0, +#define XML_STATUS_ERROR XML_STATUS_ERROR + XML_STATUS_OK = 1, +#define XML_STATUS_OK XML_STATUS_OK + XML_STATUS_SUSPENDED = 2, +#define XML_STATUS_SUSPENDED XML_STATUS_SUSPENDED +}; + +enum XML_Error { + XML_ERROR_NONE, + XML_ERROR_NO_MEMORY, + XML_ERROR_SYNTAX, + XML_ERROR_NO_ELEMENTS, + XML_ERROR_INVALID_TOKEN, + XML_ERROR_UNCLOSED_TOKEN, + XML_ERROR_PARTIAL_CHAR, + XML_ERROR_TAG_MISMATCH, + XML_ERROR_DUPLICATE_ATTRIBUTE, + XML_ERROR_JUNK_AFTER_DOC_ELEMENT, + XML_ERROR_PARAM_ENTITY_REF, + XML_ERROR_UNDEFINED_ENTITY, + XML_ERROR_RECURSIVE_ENTITY_REF, + XML_ERROR_ASYNC_ENTITY, + XML_ERROR_BAD_CHAR_REF, + XML_ERROR_BINARY_ENTITY_REF, + XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF, + XML_ERROR_MISPLACED_XML_PI, + XML_ERROR_UNKNOWN_ENCODING, + XML_ERROR_INCORRECT_ENCODING, + XML_ERROR_UNCLOSED_CDATA_SECTION, + XML_ERROR_EXTERNAL_ENTITY_HANDLING, + XML_ERROR_NOT_STANDALONE, + XML_ERROR_UNEXPECTED_STATE, + XML_ERROR_ENTITY_DECLARED_IN_PE, + XML_ERROR_FEATURE_REQUIRES_XML_DTD, + XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING, + XML_ERROR_UNBOUND_PREFIX, + XML_ERROR_SUSPENDED, + XML_ERROR_NOT_SUSPENDED, + XML_ERROR_ABORTED, + XML_ERROR_FINISHED, + XML_ERROR_SUSPEND_PE +}; + +enum XML_Content_Type { + XML_CTYPE_EMPTY = 1, + XML_CTYPE_ANY, + XML_CTYPE_MIXED, + XML_CTYPE_NAME, + XML_CTYPE_CHOICE, + XML_CTYPE_SEQ +}; + +enum XML_Content_Quant { + XML_CQUANT_NONE, + XML_CQUANT_OPT, + XML_CQUANT_REP, + XML_CQUANT_PLUS +}; + +/* If type == XML_CTYPE_EMPTY or XML_CTYPE_ANY, then quant will be + XML_CQUANT_NONE, and the other fields will be zero or NULL. + If type == XML_CTYPE_MIXED, then quant will be NONE or REP and + numchildren will contain number of elements that may be mixed in + and children point to an array of XML_Content cells that will be + all of XML_CTYPE_NAME type with no quantification. + + If type == XML_CTYPE_NAME, then the name points to the name, and + the numchildren field will be zero and children will be NULL. The + quant fields indicates any quantifiers placed on the name. + + CHOICE and SEQ will have name NULL, the number of children in + numchildren and children will point, recursively, to an array + of XML_Content cells. + + The EMPTY, ANY, and MIXED types will only occur at top level. +*/ + +typedef struct XML_cp XML_Content; + +struct XML_cp { + enum XML_Content_Type type; + enum XML_Content_Quant quant; + XML_Char * name; + unsigned int numchildren; + XML_Content * children; +}; + + +/* This is called for an element declaration. See above for + description of the model argument. It's the caller's responsibility + to free model when finished with it. +*/ +typedef void (XMLCALL *XML_ElementDeclHandler) (void *userData, + const XML_Char *name, + XML_Content *model); + +XMLPARSEAPI(void) +XML_SetElementDeclHandler(XML_Parser parser, + XML_ElementDeclHandler eldecl); + +/* The Attlist declaration handler is called for *each* attribute. So + a single Attlist declaration with multiple attributes declared will + generate multiple calls to this handler. The "default" parameter + may be NULL in the case of the "#IMPLIED" or "#REQUIRED" + keyword. The "isrequired" parameter will be true and the default + value will be NULL in the case of "#REQUIRED". If "isrequired" is + true and default is non-NULL, then this is a "#FIXED" default. +*/ +typedef void (XMLCALL *XML_AttlistDeclHandler) ( + void *userData, + const XML_Char *elname, + const XML_Char *attname, + const XML_Char *att_type, + const XML_Char *dflt, + int isrequired); + +XMLPARSEAPI(void) +XML_SetAttlistDeclHandler(XML_Parser parser, + XML_AttlistDeclHandler attdecl); + +/* The XML declaration handler is called for *both* XML declarations + and text declarations. The way to distinguish is that the version + parameter will be NULL for text declarations. The encoding + parameter may be NULL for XML declarations. The standalone + parameter will be -1, 0, or 1 indicating respectively that there + was no standalone parameter in the declaration, that it was given + as no, or that it was given as yes. +*/ +typedef void (XMLCALL *XML_XmlDeclHandler) (void *userData, + const XML_Char *version, + const XML_Char *encoding, + int standalone); + +XMLPARSEAPI(void) +XML_SetXmlDeclHandler(XML_Parser parser, + XML_XmlDeclHandler xmldecl); + + +typedef struct { + void *(XMLCALL *malloc_fcn)(size_t size); + void *(XMLCALL *realloc_fcn)(void *ptr, size_t size); + void (XMLCALL *free_fcn)(void *ptr); +} XML_Memory_Handling_Suite; + +/* Constructs a new parser; encoding is the encoding specified by the + external protocol or NULL if there is none specified. +*/ +XMLPARSEAPI(XML_Parser) +XML_ParserCreate(const XML_Char *encoding); + +/* Constructs a new parser and namespace processor. Element type + names and attribute names that belong to a namespace will be + expanded; unprefixed attribute names are never expanded; unprefixed + element type names are expanded only if there is a default + namespace. The expanded name is the concatenation of the namespace + URI, the namespace separator character, and the local part of the + name. If the namespace separator is '\0' then the namespace URI + and the local part will be concatenated without any separator. + When a namespace is not declared, the name and prefix will be + passed through without expansion. +*/ +XMLPARSEAPI(XML_Parser) +XML_ParserCreateNS(const XML_Char *encoding, XML_Char namespaceSeparator); + + +/* Constructs a new parser using the memory management suite referred to + by memsuite. If memsuite is NULL, then use the standard library memory + suite. If namespaceSeparator is non-NULL it creates a parser with + namespace processing as described above. The character pointed at + will serve as the namespace separator. + + All further memory operations used for the created parser will come from + the given suite. +*/ +XMLPARSEAPI(XML_Parser) +XML_ParserCreate_MM(const XML_Char *encoding, + const XML_Memory_Handling_Suite *memsuite, + const XML_Char *namespaceSeparator); + +/* Prepare a parser object to be re-used. This is particularly + valuable when memory allocation overhead is disproportionatly high, + such as when a large number of small documnents need to be parsed. + All handlers are cleared from the parser, except for the + unknownEncodingHandler. The parser's external state is re-initialized + except for the values of ns and ns_triplets. + + Added in Expat 1.95.3. +*/ +XMLPARSEAPI(XML_Bool) +XML_ParserReset(XML_Parser parser, const XML_Char *encoding); + +/* atts is array of name/value pairs, terminated by 0; + names and values are 0 terminated. +*/ +typedef void (XMLCALL *XML_StartElementHandler) (void *userData, + const XML_Char *name, + const XML_Char **atts); + +typedef void (XMLCALL *XML_EndElementHandler) (void *userData, + const XML_Char *name); + + +/* s is not 0 terminated. */ +typedef void (XMLCALL *XML_CharacterDataHandler) (void *userData, + const XML_Char *s, + int len); + +/* target and data are 0 terminated */ +typedef void (XMLCALL *XML_ProcessingInstructionHandler) ( + void *userData, + const XML_Char *target, + const XML_Char *data); + +/* data is 0 terminated */ +typedef void (XMLCALL *XML_CommentHandler) (void *userData, + const XML_Char *data); + +typedef void (XMLCALL *XML_StartCdataSectionHandler) (void *userData); +typedef void (XMLCALL *XML_EndCdataSectionHandler) (void *userData); + +/* This is called for any characters in the XML document for which + there is no applicable handler. This includes both characters that + are part of markup which is of a kind that is not reported + (comments, markup declarations), or characters that are part of a + construct which could be reported but for which no handler has been + supplied. The characters are passed exactly as they were in the XML + document except that they will be encoded in UTF-8 or UTF-16. + Line boundaries are not normalized. Note that a byte order mark + character is not passed to the default handler. There are no + guarantees about how characters are divided between calls to the + default handler: for example, a comment might be split between + multiple calls. +*/ +typedef void (XMLCALL *XML_DefaultHandler) (void *userData, + const XML_Char *s, + int len); + +/* This is called for the start of the DOCTYPE declaration, before + any DTD or internal subset is parsed. +*/ +typedef void (XMLCALL *XML_StartDoctypeDeclHandler) ( + void *userData, + const XML_Char *doctypeName, + const XML_Char *sysid, + const XML_Char *pubid, + int has_internal_subset); + +/* This is called for the start of the DOCTYPE declaration when the + closing > is encountered, but after processing any external + subset. +*/ +typedef void (XMLCALL *XML_EndDoctypeDeclHandler)(void *userData); + +/* This is called for entity declarations. The is_parameter_entity + argument will be non-zero if the entity is a parameter entity, zero + otherwise. + + For internal entities (), value will + be non-NULL and systemId, publicID, and notationName will be NULL. + The value string is NOT nul-terminated; the length is provided in + the value_length argument. Since it is legal to have zero-length + values, do not use this argument to test for internal entities. + + For external entities, value will be NULL and systemId will be + non-NULL. The publicId argument will be NULL unless a public + identifier was provided. The notationName argument will have a + non-NULL value only for unparsed entity declarations. + + Note that is_parameter_entity can't be changed to XML_Bool, since + that would break binary compatibility. +*/ +typedef void (XMLCALL *XML_EntityDeclHandler) ( + void *userData, + const XML_Char *entityName, + int is_parameter_entity, + const XML_Char *value, + int value_length, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId, + const XML_Char *notationName); + +XMLPARSEAPI(void) +XML_SetEntityDeclHandler(XML_Parser parser, + XML_EntityDeclHandler handler); + +/* OBSOLETE -- OBSOLETE -- OBSOLETE + This handler has been superceded by the EntityDeclHandler above. + It is provided here for backward compatibility. + + This is called for a declaration of an unparsed (NDATA) entity. + The base argument is whatever was set by XML_SetBase. The + entityName, systemId and notationName arguments will never be + NULL. The other arguments may be. +*/ +typedef void (XMLCALL *XML_UnparsedEntityDeclHandler) ( + void *userData, + const XML_Char *entityName, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId, + const XML_Char *notationName); + +/* This is called for a declaration of notation. The base argument is + whatever was set by XML_SetBase. The notationName will never be + NULL. The other arguments can be. +*/ +typedef void (XMLCALL *XML_NotationDeclHandler) ( + void *userData, + const XML_Char *notationName, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId); + +/* When namespace processing is enabled, these are called once for + each namespace declaration. The call to the start and end element + handlers occur between the calls to the start and end namespace + declaration handlers. For an xmlns attribute, prefix will be + NULL. For an xmlns="" attribute, uri will be NULL. +*/ +typedef void (XMLCALL *XML_StartNamespaceDeclHandler) ( + void *userData, + const XML_Char *prefix, + const XML_Char *uri); + +typedef void (XMLCALL *XML_EndNamespaceDeclHandler) ( + void *userData, + const XML_Char *prefix); + +/* This is called if the document is not standalone, that is, it has an + external subset or a reference to a parameter entity, but does not + have standalone="yes". If this handler returns XML_STATUS_ERROR, + then processing will not continue, and the parser will return a + XML_ERROR_NOT_STANDALONE error. + If parameter entity parsing is enabled, then in addition to the + conditions above this handler will only be called if the referenced + entity was actually read. +*/ +typedef int (XMLCALL *XML_NotStandaloneHandler) (void *userData); + +/* This is called for a reference to an external parsed general + entity. The referenced entity is not automatically parsed. The + application can parse it immediately or later using + XML_ExternalEntityParserCreate. + + The parser argument is the parser parsing the entity containing the + reference; it can be passed as the parser argument to + XML_ExternalEntityParserCreate. The systemId argument is the + system identifier as specified in the entity declaration; it will + not be NULL. + + The base argument is the system identifier that should be used as + the base for resolving systemId if systemId was relative; this is + set by XML_SetBase; it may be NULL. + + The publicId argument is the public identifier as specified in the + entity declaration, or NULL if none was specified; the whitespace + in the public identifier will have been normalized as required by + the XML spec. + + The context argument specifies the parsing context in the format + expected by the context argument to XML_ExternalEntityParserCreate; + context is valid only until the handler returns, so if the + referenced entity is to be parsed later, it must be copied. + context is NULL only when the entity is a parameter entity. + + The handler should return XML_STATUS_ERROR if processing should not + continue because of a fatal error in the handling of the external + entity. In this case the calling parser will return an + XML_ERROR_EXTERNAL_ENTITY_HANDLING error. + + Note that unlike other handlers the first argument is the parser, + not userData. +*/ +typedef int (XMLCALL *XML_ExternalEntityRefHandler) ( + XML_Parser parser, + const XML_Char *context, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId); + +/* This is called in two situations: + 1) An entity reference is encountered for which no declaration + has been read *and* this is not an error. + 2) An internal entity reference is read, but not expanded, because + XML_SetDefaultHandler has been called. + Note: skipped parameter entities in declarations and skipped general + entities in attribute values cannot be reported, because + the event would be out of sync with the reporting of the + declarations or attribute values +*/ +typedef void (XMLCALL *XML_SkippedEntityHandler) ( + void *userData, + const XML_Char *entityName, + int is_parameter_entity); + +/* This structure is filled in by the XML_UnknownEncodingHandler to + provide information to the parser about encodings that are unknown + to the parser. + + The map[b] member gives information about byte sequences whose + first byte is b. + + If map[b] is c where c is >= 0, then b by itself encodes the + Unicode scalar value c. + + If map[b] is -1, then the byte sequence is malformed. + + If map[b] is -n, where n >= 2, then b is the first byte of an + n-byte sequence that encodes a single Unicode scalar value. + + The data member will be passed as the first argument to the convert + function. + + The convert function is used to convert multibyte sequences; s will + point to a n-byte sequence where map[(unsigned char)*s] == -n. The + convert function must return the Unicode scalar value represented + by this byte sequence or -1 if the byte sequence is malformed. + + The convert function may be NULL if the encoding is a single-byte + encoding, that is if map[b] >= -1 for all bytes b. + + When the parser is finished with the encoding, then if release is + not NULL, it will call release passing it the data member; once + release has been called, the convert function will not be called + again. + + Expat places certain restrictions on the encodings that are supported + using this mechanism. + + 1. Every ASCII character that can appear in a well-formed XML document, + other than the characters + + $@\^`{}~ + + must be represented by a single byte, and that byte must be the + same byte that represents that character in ASCII. + + 2. No character may require more than 4 bytes to encode. + + 3. All characters encoded must have Unicode scalar values <= + 0xFFFF, (i.e., characters that would be encoded by surrogates in + UTF-16 are not allowed). Note that this restriction doesn't + apply to the built-in support for UTF-8 and UTF-16. + + 4. No Unicode character may be encoded by more than one distinct + sequence of bytes. +*/ +typedef struct { + int map[256]; + void *data; + int (XMLCALL *convert)(void *data, const char *s); + void (XMLCALL *release)(void *data); +} XML_Encoding; + +/* This is called for an encoding that is unknown to the parser. + + The encodingHandlerData argument is that which was passed as the + second argument to XML_SetUnknownEncodingHandler. + + The name argument gives the name of the encoding as specified in + the encoding declaration. + + If the callback can provide information about the encoding, it must + fill in the XML_Encoding structure, and return XML_STATUS_OK. + Otherwise it must return XML_STATUS_ERROR. + + If info does not describe a suitable encoding, then the parser will + return an XML_UNKNOWN_ENCODING error. +*/ +typedef int (XMLCALL *XML_UnknownEncodingHandler) ( + void *encodingHandlerData, + const XML_Char *name, + XML_Encoding *info); + +XMLPARSEAPI(void) +XML_SetElementHandler(XML_Parser parser, + XML_StartElementHandler start, + XML_EndElementHandler end); + +XMLPARSEAPI(void) +XML_SetStartElementHandler(XML_Parser parser, + XML_StartElementHandler handler); + +XMLPARSEAPI(void) +XML_SetEndElementHandler(XML_Parser parser, + XML_EndElementHandler handler); + +XMLPARSEAPI(void) +XML_SetCharacterDataHandler(XML_Parser parser, + XML_CharacterDataHandler handler); + +XMLPARSEAPI(void) +XML_SetProcessingInstructionHandler(XML_Parser parser, + XML_ProcessingInstructionHandler handler); +XMLPARSEAPI(void) +XML_SetCommentHandler(XML_Parser parser, + XML_CommentHandler handler); + +XMLPARSEAPI(void) +XML_SetCdataSectionHandler(XML_Parser parser, + XML_StartCdataSectionHandler start, + XML_EndCdataSectionHandler end); + +XMLPARSEAPI(void) +XML_SetStartCdataSectionHandler(XML_Parser parser, + XML_StartCdataSectionHandler start); + +XMLPARSEAPI(void) +XML_SetEndCdataSectionHandler(XML_Parser parser, + XML_EndCdataSectionHandler end); + +/* This sets the default handler and also inhibits expansion of + internal entities. These entity references will be passed to the + default handler, or to the skipped entity handler, if one is set. +*/ +XMLPARSEAPI(void) +XML_SetDefaultHandler(XML_Parser parser, + XML_DefaultHandler handler); + +/* This sets the default handler but does not inhibit expansion of + internal entities. The entity reference will not be passed to the + default handler. +*/ +XMLPARSEAPI(void) +XML_SetDefaultHandlerExpand(XML_Parser parser, + XML_DefaultHandler handler); + +XMLPARSEAPI(void) +XML_SetDoctypeDeclHandler(XML_Parser parser, + XML_StartDoctypeDeclHandler start, + XML_EndDoctypeDeclHandler end); + +XMLPARSEAPI(void) +XML_SetStartDoctypeDeclHandler(XML_Parser parser, + XML_StartDoctypeDeclHandler start); + +XMLPARSEAPI(void) +XML_SetEndDoctypeDeclHandler(XML_Parser parser, + XML_EndDoctypeDeclHandler end); + +XMLPARSEAPI(void) +XML_SetUnparsedEntityDeclHandler(XML_Parser parser, + XML_UnparsedEntityDeclHandler handler); + +XMLPARSEAPI(void) +XML_SetNotationDeclHandler(XML_Parser parser, + XML_NotationDeclHandler handler); + +XMLPARSEAPI(void) +XML_SetNamespaceDeclHandler(XML_Parser parser, + XML_StartNamespaceDeclHandler start, + XML_EndNamespaceDeclHandler end); + +XMLPARSEAPI(void) +XML_SetStartNamespaceDeclHandler(XML_Parser parser, + XML_StartNamespaceDeclHandler start); + +XMLPARSEAPI(void) +XML_SetEndNamespaceDeclHandler(XML_Parser parser, + XML_EndNamespaceDeclHandler end); + +XMLPARSEAPI(void) +XML_SetNotStandaloneHandler(XML_Parser parser, + XML_NotStandaloneHandler handler); + +XMLPARSEAPI(void) +XML_SetExternalEntityRefHandler(XML_Parser parser, + XML_ExternalEntityRefHandler handler); + +/* If a non-NULL value for arg is specified here, then it will be + passed as the first argument to the external entity ref handler + instead of the parser object. +*/ +XMLPARSEAPI(void) +XML_SetExternalEntityRefHandlerArg(XML_Parser parser, + void *arg); + +XMLPARSEAPI(void) +XML_SetSkippedEntityHandler(XML_Parser parser, + XML_SkippedEntityHandler handler); + +XMLPARSEAPI(void) +XML_SetUnknownEncodingHandler(XML_Parser parser, + XML_UnknownEncodingHandler handler, + void *encodingHandlerData); + +/* This can be called within a handler for a start element, end + element, processing instruction or character data. It causes the + corresponding markup to be passed to the default handler. +*/ +XMLPARSEAPI(void) +XML_DefaultCurrent(XML_Parser parser); + +/* If do_nst is non-zero, and namespace processing is in effect, and + a name has a prefix (i.e. an explicit namespace qualifier) then + that name is returned as a triplet in a single string separated by + the separator character specified when the parser was created: URI + + sep + local_name + sep + prefix. + + If do_nst is zero, then namespace information is returned in the + default manner (URI + sep + local_name) whether or not the name + has a prefix. + + Note: Calling XML_SetReturnNSTriplet after XML_Parse or + XML_ParseBuffer has no effect. +*/ + +XMLPARSEAPI(void) +XML_SetReturnNSTriplet(XML_Parser parser, int do_nst); + +/* This value is passed as the userData argument to callbacks. */ +XMLPARSEAPI(void) +XML_SetUserData(XML_Parser parser, void *userData); + +/* Returns the last value set by XML_SetUserData or NULL. */ +#define XML_GetUserData(parser) (*(void **)(parser)) + +/* This is equivalent to supplying an encoding argument to + XML_ParserCreate. On success XML_SetEncoding returns non-zero, + zero otherwise. + Note: Calling XML_SetEncoding after XML_Parse or XML_ParseBuffer + has no effect and returns XML_STATUS_ERROR. +*/ +XMLPARSEAPI(enum XML_Status) +XML_SetEncoding(XML_Parser parser, const XML_Char *encoding); + +/* If this function is called, then the parser will be passed as the + first argument to callbacks instead of userData. The userData will + still be accessible using XML_GetUserData. +*/ +XMLPARSEAPI(void) +XML_UseParserAsHandlerArg(XML_Parser parser); + +/* If useDTD == XML_TRUE is passed to this function, then the parser + will assume that there is an external subset, even if none is + specified in the document. In such a case the parser will call the + externalEntityRefHandler with a value of NULL for the systemId + argument (the publicId and context arguments will be NULL as well). + Note: If this function is called, then this must be done before + the first call to XML_Parse or XML_ParseBuffer, since it will + have no effect after that. Returns + XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING. + Note: If the document does not have a DOCTYPE declaration at all, + then startDoctypeDeclHandler and endDoctypeDeclHandler will not + be called, despite an external subset being parsed. + Note: If XML_DTD is not defined when Expat is compiled, returns + XML_ERROR_FEATURE_REQUIRES_XML_DTD. +*/ +XMLPARSEAPI(enum XML_Error) +XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD); + + +/* Sets the base to be used for resolving relative URIs in system + identifiers in declarations. Resolving relative identifiers is + left to the application: this value will be passed through as the + base argument to the XML_ExternalEntityRefHandler, + XML_NotationDeclHandler and XML_UnparsedEntityDeclHandler. The base + argument will be copied. Returns XML_STATUS_ERROR if out of memory, + XML_STATUS_OK otherwise. +*/ +XMLPARSEAPI(enum XML_Status) +XML_SetBase(XML_Parser parser, const XML_Char *base); + +XMLPARSEAPI(const XML_Char *) +XML_GetBase(XML_Parser parser); + +/* Returns the number of the attribute/value pairs passed in last call + to the XML_StartElementHandler that were specified in the start-tag + rather than defaulted. Each attribute/value pair counts as 2; thus + this correspondds to an index into the atts array passed to the + XML_StartElementHandler. +*/ +XMLPARSEAPI(int) +XML_GetSpecifiedAttributeCount(XML_Parser parser); + +/* Returns the index of the ID attribute passed in the last call to + XML_StartElementHandler, or -1 if there is no ID attribute. Each + attribute/value pair counts as 2; thus this correspondds to an + index into the atts array passed to the XML_StartElementHandler. +*/ +XMLPARSEAPI(int) +XML_GetIdAttributeIndex(XML_Parser parser); + +/* Parses some input. Returns XML_STATUS_ERROR if a fatal error is + detected. The last call to XML_Parse must have isFinal true; len + may be zero for this call (or any other). + + Though the return values for these functions has always been + described as a Boolean value, the implementation, at least for the + 1.95.x series, has always returned exactly one of the XML_Status + values. +*/ +XMLPARSEAPI(enum XML_Status) +XML_Parse(XML_Parser parser, const char *s, int len, int isFinal); + +XMLPARSEAPI(void *) +XML_GetBuffer(XML_Parser parser, int len); + +XMLPARSEAPI(enum XML_Status) +XML_ParseBuffer(XML_Parser parser, int len, int isFinal); + +/* Stops parsing, causing XML_Parse() or XML_ParseBuffer() to return. + Must be called from within a call-back handler, except when aborting + (resumable = 0) an already suspended parser. Some call-backs may + still follow because they would otherwise get lost. Examples: + - endElementHandler() for empty elements when stopped in + startElementHandler(), + - endNameSpaceDeclHandler() when stopped in endElementHandler(), + and possibly others. + + Can be called from most handlers, including DTD related call-backs, + except when parsing an external parameter entity and resumable != 0. + Returns XML_STATUS_OK when successful, XML_STATUS_ERROR otherwise. + Possible error codes: + - XML_ERROR_SUSPENDED: when suspending an already suspended parser. + - XML_ERROR_FINISHED: when the parser has already finished. + - XML_ERROR_SUSPEND_PE: when suspending while parsing an external PE. + + When resumable != 0 (true) then parsing is suspended, that is, + XML_Parse() and XML_ParseBuffer() return XML_STATUS_SUSPENDED. + Otherwise, parsing is aborted, that is, XML_Parse() and XML_ParseBuffer() + return XML_STATUS_ERROR with error code XML_ERROR_ABORTED. + + *Note*: + This will be applied to the current parser instance only, that is, if + there is a parent parser then it will continue parsing when the + externalEntityRefHandler() returns. It is up to the implementation of + the externalEntityRefHandler() to call XML_StopParser() on the parent + parser (recursively), if one wants to stop parsing altogether. + + When suspended, parsing can be resumed by calling XML_ResumeParser(). +*/ +XMLPARSEAPI(enum XML_Status) +XML_StopParser(XML_Parser parser, XML_Bool resumable); + +/* Resumes parsing after it has been suspended with XML_StopParser(). + Must not be called from within a handler call-back. Returns same + status codes as XML_Parse() or XML_ParseBuffer(). + Additional error code XML_ERROR_NOT_SUSPENDED possible. + + *Note*: + This must be called on the most deeply nested child parser instance + first, and on its parent parser only after the child parser has finished, + to be applied recursively until the document entity's parser is restarted. + That is, the parent parser will not resume by itself and it is up to the + application to call XML_ResumeParser() on it at the appropriate moment. +*/ +XMLPARSEAPI(enum XML_Status) +XML_ResumeParser(XML_Parser parser); + +enum XML_Parsing { + XML_INITIALIZED, + XML_PARSING, + XML_FINISHED, + XML_SUSPENDED +}; + +typedef struct { + enum XML_Parsing parsing; + XML_Bool finalBuffer; +} XML_ParsingStatus; + +/* Returns status of parser with respect to being initialized, parsing, + finished, or suspended and processing the final buffer. + XXX XML_Parse() and XML_ParseBuffer() should return XML_ParsingStatus, + XXX with XML_FINISHED_OK or XML_FINISHED_ERROR replacing XML_FINISHED +*/ +XMLPARSEAPI(void) +XML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status); + +/* Creates an XML_Parser object that can parse an external general + entity; context is a '\0'-terminated string specifying the parse + context; encoding is a '\0'-terminated string giving the name of + the externally specified encoding, or NULL if there is no + externally specified encoding. The context string consists of a + sequence of tokens separated by formfeeds (\f); a token consisting + of a name specifies that the general entity of the name is open; a + token of the form prefix=uri specifies the namespace for a + particular prefix; a token of the form =uri specifies the default + namespace. This can be called at any point after the first call to + an ExternalEntityRefHandler so longer as the parser has not yet + been freed. The new parser is completely independent and may + safely be used in a separate thread. The handlers and userData are + initialized from the parser argument. Returns NULL if out of memory. + Otherwise returns a new XML_Parser object. +*/ +XMLPARSEAPI(XML_Parser) +XML_ExternalEntityParserCreate(XML_Parser parser, + const XML_Char *context, + const XML_Char *encoding); + +enum XML_ParamEntityParsing { + XML_PARAM_ENTITY_PARSING_NEVER, + XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE, + XML_PARAM_ENTITY_PARSING_ALWAYS +}; + +/* Controls parsing of parameter entities (including the external DTD + subset). If parsing of parameter entities is enabled, then + references to external parameter entities (including the external + DTD subset) will be passed to the handler set with + XML_SetExternalEntityRefHandler. The context passed will be 0. + + Unlike external general entities, external parameter entities can + only be parsed synchronously. If the external parameter entity is + to be parsed, it must be parsed during the call to the external + entity ref handler: the complete sequence of + XML_ExternalEntityParserCreate, XML_Parse/XML_ParseBuffer and + XML_ParserFree calls must be made during this call. After + XML_ExternalEntityParserCreate has been called to create the parser + for the external parameter entity (context must be 0 for this + call), it is illegal to make any calls on the old parser until + XML_ParserFree has been called on the newly created parser. + If the library has been compiled without support for parameter + entity parsing (ie without XML_DTD being defined), then + XML_SetParamEntityParsing will return 0 if parsing of parameter + entities is requested; otherwise it will return non-zero. + Note: If XML_SetParamEntityParsing is called after XML_Parse or + XML_ParseBuffer, then it has no effect and will always return 0. +*/ +XMLPARSEAPI(int) +XML_SetParamEntityParsing(XML_Parser parser, + enum XML_ParamEntityParsing parsing); + +/* If XML_Parse or XML_ParseBuffer have returned XML_STATUS_ERROR, then + XML_GetErrorCode returns information about the error. +*/ +XMLPARSEAPI(enum XML_Error) +XML_GetErrorCode(XML_Parser parser); + +/* These functions return information about the current parse + location. They may be called from any callback called to report + some parse event; in this case the location is the location of the + first of the sequence of characters that generated the event. When + called from callbacks generated by declarations in the document + prologue, the location identified isn't as neatly defined, but will + be within the relevant markup. When called outside of the callback + functions, the position indicated will be just past the last parse + event (regardless of whether there was an associated callback). + + They may also be called after returning from a call to XML_Parse + or XML_ParseBuffer. If the return value is XML_STATUS_ERROR then + the location is the location of the character at which the error + was detected; otherwise the location is the location of the last + parse event, as described above. +*/ +XMLPARSEAPI(int) XML_GetCurrentLineNumber(XML_Parser parser); +XMLPARSEAPI(int) XML_GetCurrentColumnNumber(XML_Parser parser); +XMLPARSEAPI(long) XML_GetCurrentByteIndex(XML_Parser parser); + +/* Return the number of bytes in the current event. + Returns 0 if the event is in an internal entity. +*/ +XMLPARSEAPI(int) +XML_GetCurrentByteCount(XML_Parser parser); + +/* If XML_CONTEXT_BYTES is defined, returns the input buffer, sets + the integer pointed to by offset to the offset within this buffer + of the current parse position, and sets the integer pointed to by size + to the size of this buffer (the number of input bytes). Otherwise + returns a NULL pointer. Also returns a NULL pointer if a parse isn't + active. + + NOTE: The character pointer returned should not be used outside + the handler that makes the call. +*/ +XMLPARSEAPI(const char *) +XML_GetInputContext(XML_Parser parser, + int *offset, + int *size); + +/* For backwards compatibility with previous versions. */ +#define XML_GetErrorLineNumber XML_GetCurrentLineNumber +#define XML_GetErrorColumnNumber XML_GetCurrentColumnNumber +#define XML_GetErrorByteIndex XML_GetCurrentByteIndex + +/* Frees the content model passed to the element declaration handler */ +XMLPARSEAPI(void) +XML_FreeContentModel(XML_Parser parser, XML_Content *model); + +/* Exposing the memory handling functions used in Expat */ +XMLPARSEAPI(void *) +XML_MemMalloc(XML_Parser parser, size_t size); + +XMLPARSEAPI(void *) +XML_MemRealloc(XML_Parser parser, void *ptr, size_t size); + +XMLPARSEAPI(void) +XML_MemFree(XML_Parser parser, void *ptr); + +/* Frees memory used by the parser. */ +XMLPARSEAPI(void) +XML_ParserFree(XML_Parser parser); + +/* Returns a string describing the error. */ +XMLPARSEAPI(const XML_LChar *) +XML_ErrorString(enum XML_Error code); + +/* Return a string containing the version number of this expat */ +XMLPARSEAPI(const XML_LChar *) +XML_ExpatVersion(void); + +typedef struct { + int major; + int minor; + int micro; +} XML_Expat_Version; + +/* Return an XML_Expat_Version structure containing numeric version + number information for this version of expat. +*/ +XMLPARSEAPI(XML_Expat_Version) +XML_ExpatVersionInfo(void); + +/* Added in Expat 1.95.5. */ +enum XML_FeatureEnum { + XML_FEATURE_END = 0, + XML_FEATURE_UNICODE, + XML_FEATURE_UNICODE_WCHAR_T, + XML_FEATURE_DTD, + XML_FEATURE_CONTEXT_BYTES, + XML_FEATURE_MIN_SIZE, + XML_FEATURE_SIZEOF_XML_CHAR, + XML_FEATURE_SIZEOF_XML_LCHAR + /* Additional features must be added to the end of this enum. */ +}; + +typedef struct { + enum XML_FeatureEnum feature; + const XML_LChar *name; + long int value; +} XML_Feature; + +XMLPARSEAPI(const XML_Feature *) +XML_GetFeatureList(void); + + +/* Expat follows the GNU/Linux convention of odd number minor version for + beta/development releases and even number minor version for stable + releases. Micro is bumped with each release, and set to 0 with each + change to major or minor version. +*/ +#define XML_MAJOR_VERSION 1 +#define XML_MINOR_VERSION 95 +#define XML_MICRO_VERSION 8 + +#ifdef __cplusplus +} +#endif + +#endif /* not XmlParse_INCLUDED */ diff --git a/reactos/lib/expat/lib/expat_config.h b/reactos/lib/expat/lib/expat_config.h new file mode 100644 index 00000000000..dfff653a5c8 --- /dev/null +++ b/reactos/lib/expat/lib/expat_config.h @@ -0,0 +1,30 @@ +/*================================================================ +** Copyright 2000, Clark Cooper +** All rights reserved. +** +** This is free software. You are permitted to copy, distribute, or modify +** it under the terms of the MIT/X license (contained in the COPYING file +** with this distribution.) +*/ + +#ifndef WINCONFIG_H +#define WINCONFIG_H + +#define WIN32_LEAN_AND_MEAN +#include +#undef WIN32_LEAN_AND_MEAN + +#include +#include + +//MF #define XML_NS 1 +#define XML_DTD 1 +#define XML_CONTEXT_BYTES 1024 + +/* we will assume all Windows platforms are little endian */ +#define BYTEORDER 1234 + +/* Windows has memmove() available. */ +#define HAVE_MEMMOVE + +#endif /* ndef WINCONFIG_H */ diff --git a/reactos/lib/expat/lib/expat_static.dsp b/reactos/lib/expat/lib/expat_static.dsp new file mode 100644 index 00000000000..62e5530c221 --- /dev/null +++ b/reactos/lib/expat/lib/expat_static.dsp @@ -0,0 +1,146 @@ +# Microsoft Developer Studio Project File - Name="expat_static" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=expat_static - 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 "expat_static.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 "expat_static.mak" CFG="expat_static - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "expat_static - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "expat_static - 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)" == "expat_static - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "expat_static___Win32_Release" +# PROP BASE Intermediate_Dir "expat_static___Win32_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release_static" +# PROP Intermediate_Dir "Release_static" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "_WINDOWS" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "COMPILED_FROM_DSP" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x1009 /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 /out:"Release_static\libexpatMT.lib" + +!ELSEIF "$(CFG)" == "expat_static - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "expat_static___Win32_Debug" +# PROP BASE Intermediate_Dir "expat_static___Win32_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug_static" +# PROP Intermediate_Dir "Debug_static" +# 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 /MTd /W3 /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "COMPILED_FROM_DSP" /D "_MBCS" /D "_LIB" /FR /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x1009 /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 /out:"Debug_static\libexpatMT.lib" + +!ENDIF + +# Begin Target + +# Name "expat_static - Win32 Release" +# Name "expat_static - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\xmlparse.c +# End Source File +# Begin Source File + +SOURCE=.\xmlrole.c +# End Source File +# Begin Source File + +SOURCE=.\xmltok.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\ascii.h +# End Source File +# Begin Source File + +SOURCE=.\asciitab.h +# End Source File +# Begin Source File + +SOURCE=.\expat.h +# End Source File +# Begin Source File + +SOURCE=.\iasciitab.h +# End Source File +# Begin Source File + +SOURCE=.\latin1tab.h +# End Source File +# Begin Source File + +SOURCE=.\nametab.h +# End Source File +# Begin Source File + +SOURCE=.\utf8tab.h +# End Source File +# Begin Source File + +SOURCE=.\xmlrole.h +# End Source File +# Begin Source File + +SOURCE=.\xmltok.h +# End Source File +# Begin Source File + +SOURCE=.\xmltok_impl.h +# End Source File +# End Group +# End Target +# End Project diff --git a/reactos/lib/expat/lib/expatw.dsp b/reactos/lib/expat/lib/expatw.dsp new file mode 100644 index 00000000000..a902dfe1a7f --- /dev/null +++ b/reactos/lib/expat/lib/expatw.dsp @@ -0,0 +1,169 @@ +# Microsoft Developer Studio Project File - Name="expatw" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=expatw - 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 "expatw.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 "expatw.mak" CFG="expatw - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "expatw - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "expatw - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "expatw - 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-w" +# PROP Intermediate_Dir "Release-w" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXPAT_EXPORTS" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "COMPILED_FROM_DSP" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "XML_UNICODE_WCHAR_T" /FD /c +# SUBTRACT CPP /YX /Yc /Yu +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /pdb:none /machine:I386 /out:"Release-w\libexpatw.dll" + +!ELSEIF "$(CFG)" == "expatw - 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-w" +# PROP Intermediate_Dir "Debug-w" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXPAT_EXPORTS" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /GX /ZI /Od /D "_DEBUG" /D "COMPILED_FROM_DSP" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "XML_UNICODE_WCHAR_T" /FR /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /pdb:none /debug /machine:I386 /out:"Debug-w\libexpatw.dll" + +!ENDIF + +# Begin Target + +# Name "expatw - Win32 Release" +# Name "expatw - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\libexpatw.def +# End Source File +# Begin Source File + +SOURCE=.\xmlparse.c + +!IF "$(CFG)" == "expatw - Win32 Release" + +!ELSEIF "$(CFG)" == "expatw - Win32 Debug" + +# ADD CPP /GX- /Od + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\xmlrole.c +# End Source File +# Begin Source File + +SOURCE=.\xmltok.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\ascii.h +# End Source File +# Begin Source File + +SOURCE=.\asciitab.h +# End Source File +# Begin Source File + +SOURCE=.\expat.h +# End Source File +# Begin Source File + +SOURCE=.\iasciitab.h +# End Source File +# Begin Source File + +SOURCE=.\latin1tab.h +# End Source File +# Begin Source File + +SOURCE=.\nametab.h +# End Source File +# Begin Source File + +SOURCE=.\utf8tab.h +# End Source File +# Begin Source File + +SOURCE=.\xmlrole.h +# End Source File +# Begin Source File + +SOURCE=.\xmltok.h +# End Source File +# Begin Source File + +SOURCE=.\xmltok_impl.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/reactos/lib/expat/lib/expatw_static.dsp b/reactos/lib/expat/lib/expatw_static.dsp new file mode 100644 index 00000000000..c36604802ea --- /dev/null +++ b/reactos/lib/expat/lib/expatw_static.dsp @@ -0,0 +1,146 @@ +# Microsoft Developer Studio Project File - Name="expatw_static" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=expatw_static - 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 "expatw_static.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 "expatw_static.mak" CFG="expatw_static - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "expatw_static - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "expatw_static - 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)" == "expatw_static - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "expatw_static___Win32_Release" +# PROP BASE Intermediate_Dir "expatw_static___Win32_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release-w_static" +# PROP Intermediate_Dir "Release-w_static" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "_WINDOWS" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "COMPILED_FROM_DSP" /D "XML_UNICODE_WCHAR_T" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x1009 /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 /out:"Release-w_static\libexpatwMT.lib" + +!ELSEIF "$(CFG)" == "expatw_static - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "expatw_static___Win32_Debug" +# PROP BASE Intermediate_Dir "expatw_static___Win32_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug-w_static" +# PROP Intermediate_Dir "Debug-w_static" +# 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 /MTd /W3 /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "COMPILED_FROM_DSP" /D "_MBCS" /D "_LIB" /FR /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x1009 /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 /out:"Debug-w_static\libexpatwMT.lib" + +!ENDIF + +# Begin Target + +# Name "expatw_static - Win32 Release" +# Name "expatw_static - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\xmlparse.c +# End Source File +# Begin Source File + +SOURCE=.\xmlrole.c +# End Source File +# Begin Source File + +SOURCE=.\xmltok.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\ascii.h +# End Source File +# Begin Source File + +SOURCE=.\asciitab.h +# End Source File +# Begin Source File + +SOURCE=.\expat.h +# End Source File +# Begin Source File + +SOURCE=.\iasciitab.h +# End Source File +# Begin Source File + +SOURCE=.\latin1tab.h +# End Source File +# Begin Source File + +SOURCE=.\nametab.h +# End Source File +# Begin Source File + +SOURCE=.\utf8tab.h +# End Source File +# Begin Source File + +SOURCE=.\xmlrole.h +# End Source File +# Begin Source File + +SOURCE=.\xmltok.h +# End Source File +# Begin Source File + +SOURCE=.\xmltok_impl.h +# End Source File +# End Group +# End Target +# End Project diff --git a/reactos/lib/expat/lib/iasciitab.h b/reactos/lib/expat/lib/iasciitab.h new file mode 100644 index 00000000000..24a1d5ccc9a --- /dev/null +++ b/reactos/lib/expat/lib/iasciitab.h @@ -0,0 +1,37 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +/* Like asciitab.h, except that 0xD has code BT_S rather than BT_CR */ +/* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML, +/* 0x0C */ BT_NONXML, BT_S, BT_NONXML, BT_NONXML, +/* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM, +/* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS, +/* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, +/* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL, +/* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, +/* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, +/* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI, +/* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST, +/* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, +/* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, +/* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB, +/* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT, +/* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, +/* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, +/* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, +/* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER, diff --git a/reactos/lib/expat/lib/internal.h b/reactos/lib/expat/lib/internal.h new file mode 100644 index 00000000000..79ffc9e500d --- /dev/null +++ b/reactos/lib/expat/lib/internal.h @@ -0,0 +1,73 @@ +/* internal.h + + Internal definitions used by Expat. This is not needed to compile + client code. + + The following calling convention macros are defined for frequently + called functions: + + FASTCALL - Used for those internal functions that have a simple + body and a low number of arguments and local variables. + + PTRCALL - Used for functions called though function pointers. + + PTRFASTCALL - Like PTRCALL, but for low number of arguments. + + inline - Used for selected internal functions for which inlining + may improve performance on some platforms. + + Note: Use of these macros is based on judgement, not hard rules, + and therefore subject to change. +*/ + +#if defined(__GNUC__) && defined(__i386__) && !defined(__MINGW32__) //MF +/* We'll use this version by default only where we know it helps. + + regparm() generates warnings on Solaris boxes. See SF bug #692878. + + Instability reported with egcs on a RedHat Linux 7.3. + Let's comment out: + #define FASTCALL __attribute__((stdcall, regparm(3))) + and let's try this: +*/ +#define FASTCALL __attribute__((regparm(3))) +#define PTRFASTCALL __attribute__((regparm(3))) +#endif + +/* Using __fastcall seems to have an unexpected negative effect under + MS VC++, especially for function pointers, so we won't use it for + now on that platform. It may be reconsidered for a future release + if it can be made more effective. + Likely reason: __fastcall on Windows is like stdcall, therefore + the compiler cannot perform stack optimizations for call clusters. +*/ + +/* Make sure all of these are defined if they aren't already. */ + +#ifndef FASTCALL +#define FASTCALL +#endif + +#ifndef PTRCALL +#define PTRCALL +#endif + +#ifndef PTRFASTCALL +#define PTRFASTCALL +#endif + +#ifndef XML_MIN_SIZE +#if !defined(__cplusplus) && !defined(inline) +#ifdef __GNUC__ +#define inline __inline +#endif /* __GNUC__ */ +#endif +#endif /* XML_MIN_SIZE */ + +#ifdef __cplusplus +#define inline inline +#else +#ifndef inline +#define inline +#endif +#endif diff --git a/reactos/lib/expat/lib/latin1tab.h b/reactos/lib/expat/lib/latin1tab.h new file mode 100644 index 00000000000..53c25d76b26 --- /dev/null +++ b/reactos/lib/expat/lib/latin1tab.h @@ -0,0 +1,36 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +/* 0x80 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x84 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x88 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x8C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x90 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x94 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x98 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x9C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0xA0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0xA4 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0xA8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER, +/* 0xAC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0xB0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0xB4 */ BT_OTHER, BT_NMSTRT, BT_OTHER, BT_NAME, +/* 0xB8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER, +/* 0xBC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0xC0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xC4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xC8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xCC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xD0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xD4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, +/* 0xD8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xDC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xE0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xE4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xE8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xEC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xF0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xF4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, +/* 0xF8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xFC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, diff --git a/reactos/lib/expat/lib/libexpat.def b/reactos/lib/expat/lib/libexpat.def new file mode 100644 index 00000000000..d8f397b939b --- /dev/null +++ b/reactos/lib/expat/lib/libexpat.def @@ -0,0 +1,73 @@ +; DEF file for MS VC++ +LIBRARY LIBEXPAT +DESCRIPTION "Implements an XML parser." +EXPORTS + XML_DefaultCurrent @1 + XML_ErrorString @2 + XML_ExpatVersion @3 + XML_ExpatVersionInfo @4 + XML_ExternalEntityParserCreate @5 + XML_GetBase @6 + XML_GetBuffer @7 + XML_GetCurrentByteCount @8 + XML_GetCurrentByteIndex @9 + XML_GetCurrentColumnNumber @10 + XML_GetCurrentLineNumber @11 + XML_GetErrorCode @12 + XML_GetIdAttributeIndex @13 + XML_GetInputContext @14 + XML_GetSpecifiedAttributeCount @15 + XML_Parse @16 + XML_ParseBuffer @17 + XML_ParserCreate @18 + XML_ParserCreateNS @19 + XML_ParserCreate_MM @20 + XML_ParserFree @21 + XML_SetAttlistDeclHandler @22 + XML_SetBase @23 + XML_SetCdataSectionHandler @24 + XML_SetCharacterDataHandler @25 + XML_SetCommentHandler @26 + XML_SetDefaultHandler @27 + XML_SetDefaultHandlerExpand @28 + XML_SetDoctypeDeclHandler @29 + XML_SetElementDeclHandler @30 + XML_SetElementHandler @31 + XML_SetEncoding @32 + XML_SetEndCdataSectionHandler @33 + XML_SetEndDoctypeDeclHandler @34 + XML_SetEndElementHandler @35 + XML_SetEndNamespaceDeclHandler @36 + XML_SetEntityDeclHandler @37 + XML_SetExternalEntityRefHandler @38 + XML_SetExternalEntityRefHandlerArg @39 + XML_SetNamespaceDeclHandler @40 + XML_SetNotStandaloneHandler @41 + XML_SetNotationDeclHandler @42 + XML_SetParamEntityParsing @43 + XML_SetProcessingInstructionHandler @44 + XML_SetReturnNSTriplet @45 + XML_SetStartCdataSectionHandler @46 + XML_SetStartDoctypeDeclHandler @47 + XML_SetStartElementHandler @48 + XML_SetStartNamespaceDeclHandler @49 + XML_SetUnknownEncodingHandler @50 + XML_SetUnparsedEntityDeclHandler @51 + XML_SetUserData @52 + XML_SetXmlDeclHandler @53 + XML_UseParserAsHandlerArg @54 +; added with version 1.95.3 + XML_ParserReset @55 + XML_SetSkippedEntityHandler @56 +; added with version 1.95.5 + XML_GetFeatureList @57 + XML_UseForeignDTD @58 +; added with version 1.95.6 + XML_FreeContentModel @59 + XML_MemMalloc @60 + XML_MemRealloc @61 + XML_MemFree @62 +; added with version 1.95.8 + XML_StopParser @63 + XML_ResumeParser @64 + XML_GetParsingStatus @65 diff --git a/reactos/lib/expat/lib/libexpatw.def b/reactos/lib/expat/lib/libexpatw.def new file mode 100644 index 00000000000..49d0c29d366 --- /dev/null +++ b/reactos/lib/expat/lib/libexpatw.def @@ -0,0 +1,73 @@ +; DEF file for MS VC++ +LIBRARY LIBEXPATW +DESCRIPTION "Implements an XML parser." +EXPORTS + XML_DefaultCurrent @1 + XML_ErrorString @2 + XML_ExpatVersion @3 + XML_ExpatVersionInfo @4 + XML_ExternalEntityParserCreate @5 + XML_GetBase @6 + XML_GetBuffer @7 + XML_GetCurrentByteCount @8 + XML_GetCurrentByteIndex @9 + XML_GetCurrentColumnNumber @10 + XML_GetCurrentLineNumber @11 + XML_GetErrorCode @12 + XML_GetIdAttributeIndex @13 + XML_GetInputContext @14 + XML_GetSpecifiedAttributeCount @15 + XML_Parse @16 + XML_ParseBuffer @17 + XML_ParserCreate @18 + XML_ParserCreateNS @19 + XML_ParserCreate_MM @20 + XML_ParserFree @21 + XML_SetAttlistDeclHandler @22 + XML_SetBase @23 + XML_SetCdataSectionHandler @24 + XML_SetCharacterDataHandler @25 + XML_SetCommentHandler @26 + XML_SetDefaultHandler @27 + XML_SetDefaultHandlerExpand @28 + XML_SetDoctypeDeclHandler @29 + XML_SetElementDeclHandler @30 + XML_SetElementHandler @31 + XML_SetEncoding @32 + XML_SetEndCdataSectionHandler @33 + XML_SetEndDoctypeDeclHandler @34 + XML_SetEndElementHandler @35 + XML_SetEndNamespaceDeclHandler @36 + XML_SetEntityDeclHandler @37 + XML_SetExternalEntityRefHandler @38 + XML_SetExternalEntityRefHandlerArg @39 + XML_SetNamespaceDeclHandler @40 + XML_SetNotStandaloneHandler @41 + XML_SetNotationDeclHandler @42 + XML_SetParamEntityParsing @43 + XML_SetProcessingInstructionHandler @44 + XML_SetReturnNSTriplet @45 + XML_SetStartCdataSectionHandler @46 + XML_SetStartDoctypeDeclHandler @47 + XML_SetStartElementHandler @48 + XML_SetStartNamespaceDeclHandler @49 + XML_SetUnknownEncodingHandler @50 + XML_SetUnparsedEntityDeclHandler @51 + XML_SetUserData @52 + XML_SetXmlDeclHandler @53 + XML_UseParserAsHandlerArg @54 +; added with version 1.95.3 + XML_ParserReset @55 + XML_SetSkippedEntityHandler @56 +; added with version 1.95.5 + XML_GetFeatureList @57 + XML_UseForeignDTD @58 +; added with version 1.95.6 + XML_FreeContentModel @59 + XML_MemMalloc @60 + XML_MemRealloc @61 + XML_MemFree @62 +; added with version 1.95.8 + XML_StopParser @63 + XML_ResumeParser @64 + XML_GetParsingStatus @65 diff --git a/reactos/lib/expat/lib/macconfig.h b/reactos/lib/expat/lib/macconfig.h new file mode 100644 index 00000000000..2725caaf54a --- /dev/null +++ b/reactos/lib/expat/lib/macconfig.h @@ -0,0 +1,53 @@ +/*================================================================ +** Copyright 2000, Clark Cooper +** All rights reserved. +** +** This is free software. You are permitted to copy, distribute, or modify +** it under the terms of the MIT/X license (contained in the COPYING file +** with this distribution.) +** +*/ + +#ifndef MACCONFIG_H +#define MACCONFIG_H + + +/* 1234 = LIL_ENDIAN, 4321 = BIGENDIAN */ +#define BYTEORDER 4321 + +/* Define to 1 if you have the `bcopy' function. */ +#undef HAVE_BCOPY + +/* Define to 1 if you have the `memmove' function. */ +#define HAVE_MEMMOVE + +/* Define to 1 if you have a working `mmap' system call. */ +#undef HAVE_MMAP + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* whether byteorder is bigendian */ +#define WORDS_BIGENDIAN + +/* Define to specify how much context to retain around the current parse + point. */ +#undef XML_CONTEXT_BYTES + +/* Define to make parameter entity parsing functionality available. */ +#define XML_DTD + +/* Define to make XML Namespaces functionality available. */ +#define XML_NS + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to `long' if does not define. */ +#define off_t long + +/* Define to `unsigned' if does not define. */ +#undef size_t + + +#endif /* ifndef MACCONFIG_H */ diff --git a/reactos/lib/expat/lib/nametab.h b/reactos/lib/expat/lib/nametab.h new file mode 100644 index 00000000000..b05e62c77a6 --- /dev/null +++ b/reactos/lib/expat/lib/nametab.h @@ -0,0 +1,150 @@ +static const unsigned namingBitmap[] = { +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, +0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, +0x00000000, 0x04000000, 0x87FFFFFE, 0x07FFFFFE, +0x00000000, 0x00000000, 0xFF7FFFFF, 0xFF7FFFFF, +0xFFFFFFFF, 0x7FF3FFFF, 0xFFFFFDFE, 0x7FFFFFFF, +0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFE00F, 0xFC31FFFF, +0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF, +0xFFFFFFFF, 0xF80001FF, 0x00000003, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0xFFFFD740, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD, +0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF, +0xFFFF0003, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF, +0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE, +0x0000007F, 0x00000000, 0xFFFF0000, 0x000707FF, +0x00000000, 0x07FFFFFE, 0x000007FE, 0xFFFE0000, +0xFFFFFFFF, 0x7CFFFFFF, 0x002F7FFF, 0x00000060, +0xFFFFFFE0, 0x23FFFFFF, 0xFF000000, 0x00000003, +0xFFF99FE0, 0x03C5FDFF, 0xB0000000, 0x00030003, +0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001C0000, +0xFFFBAFE0, 0x23EDFDFF, 0x00000000, 0x00000001, +0xFFF99FE0, 0x23CDFDFF, 0xB0000000, 0x00000003, +0xD63DC7E0, 0x03BFC718, 0x00000000, 0x00000000, +0xFFFDDFE0, 0x03EFFDFF, 0x00000000, 0x00000003, +0xFFFDDFE0, 0x03EFFDFF, 0x40000000, 0x00000003, +0xFFFDDFE0, 0x03FFFDFF, 0x00000000, 0x00000003, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0xFFFFFFFE, 0x000D7FFF, 0x0000003F, 0x00000000, +0xFEF02596, 0x200D6CAE, 0x0000001F, 0x00000000, +0x00000000, 0x00000000, 0xFFFFFEFF, 0x000003FF, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0xFFFFFFFF, 0xFFFF003F, 0x007FFFFF, +0x0007DAED, 0x50000000, 0x82315001, 0x002C62AB, +0x40000000, 0xF580C900, 0x00000007, 0x02010800, +0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, +0x0FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, +0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF, +0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF, +0x00000000, 0x00004C40, 0x00000000, 0x00000000, +0x00000007, 0x00000000, 0x00000000, 0x00000000, +0x00000080, 0x000003FE, 0xFFFFFFFE, 0xFFFFFFFF, +0x001FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x07FFFFFF, +0xFFFFFFE0, 0x00001FFF, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, +0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000, +0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, +0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000, +0x00000000, 0x07FF6000, 0x87FFFFFE, 0x07FFFFFE, +0x00000000, 0x00800000, 0xFF7FFFFF, 0xFF7FFFFF, +0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF, +0xFFFFFFFF, 0xF80001FF, 0x00030003, 0x00000000, +0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000003, +0xFFFFD7C0, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD, +0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF, +0xFFFF007B, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF, +0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE, +0xFFFE007F, 0xBBFFFFFB, 0xFFFF0016, 0x000707FF, +0x00000000, 0x07FFFFFE, 0x0007FFFF, 0xFFFF03FF, +0xFFFFFFFF, 0x7CFFFFFF, 0xFFEF7FFF, 0x03FF3DFF, +0xFFFFFFEE, 0xF3FFFFFF, 0xFF1E3FFF, 0x0000FFCF, +0xFFF99FEE, 0xD3C5FDFF, 0xB080399F, 0x0003FFCF, +0xFFF987E4, 0xD36DFDFF, 0x5E003987, 0x001FFFC0, +0xFFFBAFEE, 0xF3EDFDFF, 0x00003BBF, 0x0000FFC1, +0xFFF99FEE, 0xF3CDFDFF, 0xB0C0398F, 0x0000FFC3, +0xD63DC7EC, 0xC3BFC718, 0x00803DC7, 0x0000FF80, +0xFFFDDFEE, 0xC3EFFDFF, 0x00603DDF, 0x0000FFC3, +0xFFFDDFEC, 0xC3EFFDFF, 0x40603DDF, 0x0000FFC3, +0xFFFDDFEC, 0xC3FFFDFF, 0x00803DCF, 0x0000FFC3, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0xFFFFFFFE, 0x07FF7FFF, 0x03FF7FFF, 0x00000000, +0xFEF02596, 0x3BFF6CAE, 0x03FF3F5F, 0x00000000, +0x03000000, 0xC2A003FF, 0xFFFFFEFF, 0xFFFE03FF, +0xFEBF0FDF, 0x02FE3FFF, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x1FFF0000, 0x00000002, +0x000000A0, 0x003EFFFE, 0xFFFFFFFE, 0xFFFFFFFF, +0x661FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x77FFFFFF, +}; +static const unsigned char nmstrtPages[] = { +0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, +0x00, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, +0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, +0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x15, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; +static const unsigned char namePages[] = { +0x19, 0x03, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x00, +0x00, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, +0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, +0x26, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x27, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; diff --git a/reactos/lib/expat/lib/utf8tab.h b/reactos/lib/expat/lib/utf8tab.h new file mode 100644 index 00000000000..7bb3e77603f --- /dev/null +++ b/reactos/lib/expat/lib/utf8tab.h @@ -0,0 +1,37 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + + +/* 0x80 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x84 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x88 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x8C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x90 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x94 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x98 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x9C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xA0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xA4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xA8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xAC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xB0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xB4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xB8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xBC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xC0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xC4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xC8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xCC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xD0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xD4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xD8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xDC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xE0 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, +/* 0xE4 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, +/* 0xE8 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, +/* 0xEC */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, +/* 0xF0 */ BT_LEAD4, BT_LEAD4, BT_LEAD4, BT_LEAD4, +/* 0xF4 */ BT_LEAD4, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0xF8 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0xFC */ BT_NONXML, BT_NONXML, BT_MALFORM, BT_MALFORM, diff --git a/reactos/lib/expat/lib/winconfig.h b/reactos/lib/expat/lib/winconfig.h new file mode 100644 index 00000000000..c1b791d62d0 --- /dev/null +++ b/reactos/lib/expat/lib/winconfig.h @@ -0,0 +1,30 @@ +/*================================================================ +** Copyright 2000, Clark Cooper +** All rights reserved. +** +** This is free software. You are permitted to copy, distribute, or modify +** it under the terms of the MIT/X license (contained in the COPYING file +** with this distribution.) +*/ + +#ifndef WINCONFIG_H +#define WINCONFIG_H + +#define WIN32_LEAN_AND_MEAN +#include +#undef WIN32_LEAN_AND_MEAN + +#include +#include + +#define XML_NS 1 +#define XML_DTD 1 +#define XML_CONTEXT_BYTES 1024 + +/* we will assume all Windows platforms are little endian */ +#define BYTEORDER 1234 + +/* Windows has memmove() available. */ +#define HAVE_MEMMOVE + +#endif /* ndef WINCONFIG_H */ diff --git a/reactos/lib/expat/lib/xmlparse.c b/reactos/lib/expat/lib/xmlparse.c new file mode 100644 index 00000000000..644f2631583 --- /dev/null +++ b/reactos/lib/expat/lib/xmlparse.c @@ -0,0 +1,6165 @@ +/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#include +#include /* memset(), memcpy() */ + +#define XML_BUILDING_EXPAT 1 + +#ifdef COMPILED_FROM_DSP +#include "winconfig.h" +#elif defined(MACOS_CLASSIC) +#include "macconfig.h" +#elif defined(HAVE_EXPAT_CONFIG_H) +#include "expat_config.h" +#endif /* ndef COMPILED_FROM_DSP */ + +#include "expat.h" + +#ifdef XML_UNICODE +#define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX +#define XmlConvert XmlUtf16Convert +#define XmlGetInternalEncoding XmlGetUtf16InternalEncoding +#define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS +#define XmlEncode XmlUtf16Encode +#define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((unsigned long)s) & 1)) +typedef unsigned short ICHAR; +#else +#define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX +#define XmlConvert XmlUtf8Convert +#define XmlGetInternalEncoding XmlGetUtf8InternalEncoding +#define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS +#define XmlEncode XmlUtf8Encode +#define MUST_CONVERT(enc, s) (!(enc)->isUtf8) +typedef char ICHAR; +#endif + + +#ifndef XML_NS + +#define XmlInitEncodingNS XmlInitEncoding +#define XmlInitUnknownEncodingNS XmlInitUnknownEncoding +#undef XmlGetInternalEncodingNS +#define XmlGetInternalEncodingNS XmlGetInternalEncoding +#define XmlParseXmlDeclNS XmlParseXmlDecl + +#endif + +#ifdef XML_UNICODE + +#ifdef XML_UNICODE_WCHAR_T +#define XML_T(x) (const wchar_t)x +#define XML_L(x) L ## x +#else +#define XML_T(x) (const unsigned short)x +#define XML_L(x) x +#endif + +#else + +#define XML_T(x) x +#define XML_L(x) x + +#endif + +/* Round up n to be a multiple of sz, where sz is a power of 2. */ +#define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1)) + +/* Handle the case where memmove() doesn't exist. */ +#ifndef HAVE_MEMMOVE +#ifdef HAVE_BCOPY +#define memmove(d,s,l) bcopy((s),(d),(l)) +#else +#error memmove does not exist on this platform, nor is a substitute available +#endif /* HAVE_BCOPY */ +#endif /* HAVE_MEMMOVE */ + +#include "internal.h" +#include "xmltok.h" +#include "xmlrole.h" + +typedef const XML_Char *KEY; + +typedef struct { + KEY name; +} NAMED; + +typedef struct { + NAMED **v; + unsigned char power; + size_t size; + size_t used; + const XML_Memory_Handling_Suite *mem; +} HASH_TABLE; + +/* Basic character hash algorithm, taken from Python's string hash: + h = h * 1000003 ^ character, the constant being a prime number. + +*/ +#ifdef XML_UNICODE +#define CHAR_HASH(h, c) \ + (((h) * 0xF4243) ^ (unsigned short)(c)) +#else +#define CHAR_HASH(h, c) \ + (((h) * 0xF4243) ^ (unsigned char)(c)) +#endif + +/* For probing (after a collision) we need a step size relative prime + to the hash table size, which is a power of 2. We use double-hashing, + since we can calculate a second hash value cheaply by taking those bits + of the first hash value that were discarded (masked out) when the table + index was calculated: index = hash & mask, where mask = table->size - 1. + We limit the maximum step size to table->size / 4 (mask >> 2) and make + it odd, since odd numbers are always relative prime to a power of 2. +*/ +#define SECOND_HASH(hash, mask, power) \ + ((((hash) & ~(mask)) >> ((power) - 1)) & ((mask) >> 2)) +#define PROBE_STEP(hash, mask, power) \ + ((unsigned char)((SECOND_HASH(hash, mask, power)) | 1)) + +typedef struct { + NAMED **p; + NAMED **end; +} HASH_TABLE_ITER; + +#define INIT_TAG_BUF_SIZE 32 /* must be a multiple of sizeof(XML_Char) */ +#define INIT_DATA_BUF_SIZE 1024 +#define INIT_ATTS_SIZE 16 +#define INIT_ATTS_VERSION 0xFFFFFFFF +#define INIT_BLOCK_SIZE 1024 +#define INIT_BUFFER_SIZE 1024 + +#define EXPAND_SPARE 24 + +typedef struct binding { + struct prefix *prefix; + struct binding *nextTagBinding; + struct binding *prevPrefixBinding; + const struct attribute_id *attId; + XML_Char *uri; + int uriLen; + int uriAlloc; +} BINDING; + +typedef struct prefix { + const XML_Char *name; + BINDING *binding; +} PREFIX; + +typedef struct { + const XML_Char *str; + const XML_Char *localPart; + const XML_Char *prefix; + int strLen; + int uriLen; + int prefixLen; +} TAG_NAME; + +/* TAG represents an open element. + The name of the element is stored in both the document and API + encodings. The memory buffer 'buf' is a separately-allocated + memory area which stores the name. During the XML_Parse()/ + XMLParseBuffer() when the element is open, the memory for the 'raw' + version of the name (in the document encoding) is shared with the + document buffer. If the element is open across calls to + XML_Parse()/XML_ParseBuffer(), the buffer is re-allocated to + contain the 'raw' name as well. + + A parser re-uses these structures, maintaining a list of allocated + TAG objects in a free list. +*/ +typedef struct tag { + struct tag *parent; /* parent of this element */ + const char *rawName; /* tagName in the original encoding */ + int rawNameLength; + TAG_NAME name; /* tagName in the API encoding */ + char *buf; /* buffer for name components */ + char *bufEnd; /* end of the buffer */ + BINDING *bindings; +} TAG; + +typedef struct { + const XML_Char *name; + const XML_Char *textPtr; + int textLen; /* length in XML_Chars */ + int processed; /* # of processed bytes - when suspended */ + const XML_Char *systemId; + const XML_Char *base; + const XML_Char *publicId; + const XML_Char *notation; + XML_Bool open; + XML_Bool is_param; + XML_Bool is_internal; /* true if declared in internal subset outside PE */ +} ENTITY; + +typedef struct { + enum XML_Content_Type type; + enum XML_Content_Quant quant; + const XML_Char * name; + int firstchild; + int lastchild; + int childcnt; + int nextsib; +} CONTENT_SCAFFOLD; + +#define INIT_SCAFFOLD_ELEMENTS 32 + +typedef struct block { + struct block *next; + int size; + XML_Char s[1]; +} BLOCK; + +typedef struct { + BLOCK *blocks; + BLOCK *freeBlocks; + const XML_Char *end; + XML_Char *ptr; + XML_Char *start; + const XML_Memory_Handling_Suite *mem; +} STRING_POOL; + +/* The XML_Char before the name is used to determine whether + an attribute has been specified. */ +typedef struct attribute_id { + XML_Char *name; + PREFIX *prefix; + XML_Bool maybeTokenized; + XML_Bool xmlns; +} ATTRIBUTE_ID; + +typedef struct { + const ATTRIBUTE_ID *id; + XML_Bool isCdata; + const XML_Char *value; +} DEFAULT_ATTRIBUTE; + +typedef struct { + unsigned long version; + unsigned long hash; + const XML_Char *uriName; +} NS_ATT; + +typedef struct { + const XML_Char *name; + PREFIX *prefix; + const ATTRIBUTE_ID *idAtt; + int nDefaultAtts; + int allocDefaultAtts; + DEFAULT_ATTRIBUTE *defaultAtts; +} ELEMENT_TYPE; + +typedef struct { + HASH_TABLE generalEntities; + HASH_TABLE elementTypes; + HASH_TABLE attributeIds; + HASH_TABLE prefixes; + STRING_POOL pool; + STRING_POOL entityValuePool; + /* false once a parameter entity reference has been skipped */ + XML_Bool keepProcessing; + /* true once an internal or external PE reference has been encountered; + this includes the reference to an external subset */ + XML_Bool hasParamEntityRefs; + XML_Bool standalone; +#ifdef XML_DTD + /* indicates if external PE has been read */ + XML_Bool paramEntityRead; + HASH_TABLE paramEntities; +#endif /* XML_DTD */ + PREFIX defaultPrefix; + /* === scaffolding for building content model === */ + XML_Bool in_eldecl; + CONTENT_SCAFFOLD *scaffold; + unsigned contentStringLen; + unsigned scaffSize; + unsigned scaffCount; + int scaffLevel; + int *scaffIndex; +} DTD; + +typedef struct open_internal_entity { + const char *internalEventPtr; + const char *internalEventEndPtr; + struct open_internal_entity *next; + ENTITY *entity; + int startTagLevel; + XML_Bool betweenDecl; /* WFC: PE Between Declarations */ +} OPEN_INTERNAL_ENTITY; + +typedef enum XML_Error PTRCALL Processor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr); + +static Processor prologProcessor; +static Processor prologInitProcessor; +static Processor contentProcessor; +static Processor cdataSectionProcessor; +#ifdef XML_DTD +static Processor ignoreSectionProcessor; +static Processor externalParEntProcessor; +static Processor externalParEntInitProcessor; +static Processor entityValueProcessor; +static Processor entityValueInitProcessor; +#endif /* XML_DTD */ +static Processor epilogProcessor; +static Processor errorProcessor; +static Processor externalEntityInitProcessor; +static Processor externalEntityInitProcessor2; +static Processor externalEntityInitProcessor3; +static Processor externalEntityContentProcessor; +static Processor internalEntityProcessor; + +static enum XML_Error +handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName); +static enum XML_Error +processXmlDecl(XML_Parser parser, int isGeneralTextEntity, + const char *s, const char *next); +static enum XML_Error +initializeEncoding(XML_Parser parser); +static enum XML_Error +doProlog(XML_Parser parser, const ENCODING *enc, const char *s, + const char *end, int tok, const char *next, const char **nextPtr, + XML_Bool haveMore); +static enum XML_Error +processInternalEntity(XML_Parser parser, ENTITY *entity, + XML_Bool betweenDecl); +static enum XML_Error +doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, + const char *start, const char *end, const char **endPtr, + XML_Bool haveMore); +static enum XML_Error +doCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr, + const char *end, const char **nextPtr, XML_Bool haveMore); +#ifdef XML_DTD +static enum XML_Error +doIgnoreSection(XML_Parser parser, const ENCODING *, const char **startPtr, + const char *end, const char **nextPtr, XML_Bool haveMore); +#endif /* XML_DTD */ + +static enum XML_Error +storeAtts(XML_Parser parser, const ENCODING *, const char *s, + TAG_NAME *tagNamePtr, BINDING **bindingsPtr); +static enum XML_Error +addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, + const XML_Char *uri, BINDING **bindingsPtr); +static int +defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, XML_Bool isCdata, + XML_Bool isId, const XML_Char *dfltValue, XML_Parser parser); +static enum XML_Error +storeAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata, + const char *, const char *, STRING_POOL *); +static enum XML_Error +appendAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata, + const char *, const char *, STRING_POOL *); +static ATTRIBUTE_ID * +getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, + const char *end); +static int +setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *); +static enum XML_Error +storeEntityValue(XML_Parser parser, const ENCODING *enc, const char *start, + const char *end); +static int +reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, + const char *start, const char *end); +static int +reportComment(XML_Parser parser, const ENCODING *enc, const char *start, + const char *end); +static void +reportDefault(XML_Parser parser, const ENCODING *enc, const char *start, + const char *end); + +static const XML_Char * getContext(XML_Parser parser); +static XML_Bool +setContext(XML_Parser parser, const XML_Char *context); + +static void FASTCALL normalizePublicId(XML_Char *s); + +static DTD * dtdCreate(const XML_Memory_Handling_Suite *ms); +/* do not call if parentParser != NULL */ +static void dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms); +static void +dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms); +static int +dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms); +static int +copyEntityTable(HASH_TABLE *, STRING_POOL *, const HASH_TABLE *); + +static NAMED * +lookup(HASH_TABLE *table, KEY name, size_t createSize); +static void FASTCALL +hashTableInit(HASH_TABLE *, const XML_Memory_Handling_Suite *ms); +static void FASTCALL hashTableClear(HASH_TABLE *); +static void FASTCALL hashTableDestroy(HASH_TABLE *); +static void FASTCALL +hashTableIterInit(HASH_TABLE_ITER *, const HASH_TABLE *); +static NAMED * FASTCALL hashTableIterNext(HASH_TABLE_ITER *); + +static void FASTCALL +poolInit(STRING_POOL *, const XML_Memory_Handling_Suite *ms); +static void FASTCALL poolClear(STRING_POOL *); +static void FASTCALL poolDestroy(STRING_POOL *); +static XML_Char * +poolAppend(STRING_POOL *pool, const ENCODING *enc, + const char *ptr, const char *end); +static XML_Char * +poolStoreString(STRING_POOL *pool, const ENCODING *enc, + const char *ptr, const char *end); +static XML_Bool FASTCALL poolGrow(STRING_POOL *pool); +static const XML_Char * FASTCALL +poolCopyString(STRING_POOL *pool, const XML_Char *s); +static const XML_Char * +poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n); +static const XML_Char * FASTCALL +poolAppendString(STRING_POOL *pool, const XML_Char *s); + +static int FASTCALL nextScaffoldPart(XML_Parser parser); +static XML_Content * build_model(XML_Parser parser); +static ELEMENT_TYPE * +getElementType(XML_Parser parser, const ENCODING *enc, + const char *ptr, const char *end); + +static XML_Parser +parserCreate(const XML_Char *encodingName, + const XML_Memory_Handling_Suite *memsuite, + const XML_Char *nameSep, + DTD *dtd); +static void +parserInit(XML_Parser parser, const XML_Char *encodingName); + +#define poolStart(pool) ((pool)->start) +#define poolEnd(pool) ((pool)->ptr) +#define poolLength(pool) ((pool)->ptr - (pool)->start) +#define poolChop(pool) ((void)--(pool->ptr)) +#define poolLastChar(pool) (((pool)->ptr)[-1]) +#define poolDiscard(pool) ((pool)->ptr = (pool)->start) +#define poolFinish(pool) ((pool)->start = (pool)->ptr) +#define poolAppendChar(pool, c) \ + (((pool)->ptr == (pool)->end && !poolGrow(pool)) \ + ? 0 \ + : ((*((pool)->ptr)++ = c), 1)) + +struct XML_ParserStruct { + /* The first member must be userData so that the XML_GetUserData + macro works. */ + void *m_userData; + void *m_handlerArg; + char *m_buffer; + const XML_Memory_Handling_Suite m_mem; + /* first character to be parsed */ + const char *m_bufferPtr; + /* past last character to be parsed */ + char *m_bufferEnd; + /* allocated end of buffer */ + const char *m_bufferLim; + long m_parseEndByteIndex; + const char *m_parseEndPtr; + XML_Char *m_dataBuf; + XML_Char *m_dataBufEnd; + XML_StartElementHandler m_startElementHandler; + XML_EndElementHandler m_endElementHandler; + XML_CharacterDataHandler m_characterDataHandler; + XML_ProcessingInstructionHandler m_processingInstructionHandler; + XML_CommentHandler m_commentHandler; + XML_StartCdataSectionHandler m_startCdataSectionHandler; + XML_EndCdataSectionHandler m_endCdataSectionHandler; + XML_DefaultHandler m_defaultHandler; + XML_StartDoctypeDeclHandler m_startDoctypeDeclHandler; + XML_EndDoctypeDeclHandler m_endDoctypeDeclHandler; + XML_UnparsedEntityDeclHandler m_unparsedEntityDeclHandler; + XML_NotationDeclHandler m_notationDeclHandler; + XML_StartNamespaceDeclHandler m_startNamespaceDeclHandler; + XML_EndNamespaceDeclHandler m_endNamespaceDeclHandler; + XML_NotStandaloneHandler m_notStandaloneHandler; + XML_ExternalEntityRefHandler m_externalEntityRefHandler; + XML_Parser m_externalEntityRefHandlerArg; + XML_SkippedEntityHandler m_skippedEntityHandler; + XML_UnknownEncodingHandler m_unknownEncodingHandler; + XML_ElementDeclHandler m_elementDeclHandler; + XML_AttlistDeclHandler m_attlistDeclHandler; + XML_EntityDeclHandler m_entityDeclHandler; + XML_XmlDeclHandler m_xmlDeclHandler; + const ENCODING *m_encoding; + INIT_ENCODING m_initEncoding; + const ENCODING *m_internalEncoding; + const XML_Char *m_protocolEncodingName; + XML_Bool m_ns; + XML_Bool m_ns_triplets; + void *m_unknownEncodingMem; + void *m_unknownEncodingData; + void *m_unknownEncodingHandlerData; + void (*m_unknownEncodingRelease)(void *); + PROLOG_STATE m_prologState; + Processor *m_processor; + enum XML_Error m_errorCode; + const char *m_eventPtr; + const char *m_eventEndPtr; + const char *m_positionPtr; + OPEN_INTERNAL_ENTITY *m_openInternalEntities; + OPEN_INTERNAL_ENTITY *m_freeInternalEntities; + XML_Bool m_defaultExpandInternalEntities; + int m_tagLevel; + ENTITY *m_declEntity; + const XML_Char *m_doctypeName; + const XML_Char *m_doctypeSysid; + const XML_Char *m_doctypePubid; + const XML_Char *m_declAttributeType; + const XML_Char *m_declNotationName; + const XML_Char *m_declNotationPublicId; + ELEMENT_TYPE *m_declElementType; + ATTRIBUTE_ID *m_declAttributeId; + XML_Bool m_declAttributeIsCdata; + XML_Bool m_declAttributeIsId; + DTD *m_dtd; + const XML_Char *m_curBase; + TAG *m_tagStack; + TAG *m_freeTagList; + BINDING *m_inheritedBindings; + BINDING *m_freeBindingList; + int m_attsSize; + int m_nSpecifiedAtts; + int m_idAttIndex; + ATTRIBUTE *m_atts; + NS_ATT *m_nsAtts; + unsigned long m_nsAttsVersion; + unsigned char m_nsAttsPower; + POSITION m_position; + STRING_POOL m_tempPool; + STRING_POOL m_temp2Pool; + char *m_groupConnector; + unsigned int m_groupSize; + XML_Char m_namespaceSeparator; + XML_Parser m_parentParser; + XML_ParsingStatus m_parsingStatus; +#ifdef XML_DTD + XML_Bool m_isParamEntity; + XML_Bool m_useForeignDTD; + enum XML_ParamEntityParsing m_paramEntityParsing; +#endif +}; + +#define MALLOC(s) (parser->m_mem.malloc_fcn((s))) +#define REALLOC(p,s) (parser->m_mem.realloc_fcn((p),(s))) +#define FREE(p) (parser->m_mem.free_fcn((p))) + +#define userData (parser->m_userData) +#define handlerArg (parser->m_handlerArg) +#define startElementHandler (parser->m_startElementHandler) +#define endElementHandler (parser->m_endElementHandler) +#define characterDataHandler (parser->m_characterDataHandler) +#define processingInstructionHandler \ + (parser->m_processingInstructionHandler) +#define commentHandler (parser->m_commentHandler) +#define startCdataSectionHandler \ + (parser->m_startCdataSectionHandler) +#define endCdataSectionHandler (parser->m_endCdataSectionHandler) +#define defaultHandler (parser->m_defaultHandler) +#define startDoctypeDeclHandler (parser->m_startDoctypeDeclHandler) +#define endDoctypeDeclHandler (parser->m_endDoctypeDeclHandler) +#define unparsedEntityDeclHandler \ + (parser->m_unparsedEntityDeclHandler) +#define notationDeclHandler (parser->m_notationDeclHandler) +#define startNamespaceDeclHandler \ + (parser->m_startNamespaceDeclHandler) +#define endNamespaceDeclHandler (parser->m_endNamespaceDeclHandler) +#define notStandaloneHandler (parser->m_notStandaloneHandler) +#define externalEntityRefHandler \ + (parser->m_externalEntityRefHandler) +#define externalEntityRefHandlerArg \ + (parser->m_externalEntityRefHandlerArg) +#define internalEntityRefHandler \ + (parser->m_internalEntityRefHandler) +#define skippedEntityHandler (parser->m_skippedEntityHandler) +#define unknownEncodingHandler (parser->m_unknownEncodingHandler) +#define elementDeclHandler (parser->m_elementDeclHandler) +#define attlistDeclHandler (parser->m_attlistDeclHandler) +#define entityDeclHandler (parser->m_entityDeclHandler) +#define xmlDeclHandler (parser->m_xmlDeclHandler) +#define encoding (parser->m_encoding) +#define initEncoding (parser->m_initEncoding) +#define internalEncoding (parser->m_internalEncoding) +#define unknownEncodingMem (parser->m_unknownEncodingMem) +#define unknownEncodingData (parser->m_unknownEncodingData) +#define unknownEncodingHandlerData \ + (parser->m_unknownEncodingHandlerData) +#define unknownEncodingRelease (parser->m_unknownEncodingRelease) +#define protocolEncodingName (parser->m_protocolEncodingName) +#define ns (parser->m_ns) +#define ns_triplets (parser->m_ns_triplets) +#define prologState (parser->m_prologState) +#define processor (parser->m_processor) +#define errorCode (parser->m_errorCode) +#define eventPtr (parser->m_eventPtr) +#define eventEndPtr (parser->m_eventEndPtr) +#define positionPtr (parser->m_positionPtr) +#define position (parser->m_position) +#define openInternalEntities (parser->m_openInternalEntities) +#define freeInternalEntities (parser->m_freeInternalEntities) +#define defaultExpandInternalEntities \ + (parser->m_defaultExpandInternalEntities) +#define tagLevel (parser->m_tagLevel) +#define buffer (parser->m_buffer) +#define bufferPtr (parser->m_bufferPtr) +#define bufferEnd (parser->m_bufferEnd) +#define parseEndByteIndex (parser->m_parseEndByteIndex) +#define parseEndPtr (parser->m_parseEndPtr) +#define bufferLim (parser->m_bufferLim) +#define dataBuf (parser->m_dataBuf) +#define dataBufEnd (parser->m_dataBufEnd) +#define _dtd (parser->m_dtd) +#define curBase (parser->m_curBase) +#define declEntity (parser->m_declEntity) +#define doctypeName (parser->m_doctypeName) +#define doctypeSysid (parser->m_doctypeSysid) +#define doctypePubid (parser->m_doctypePubid) +#define declAttributeType (parser->m_declAttributeType) +#define declNotationName (parser->m_declNotationName) +#define declNotationPublicId (parser->m_declNotationPublicId) +#define declElementType (parser->m_declElementType) +#define declAttributeId (parser->m_declAttributeId) +#define declAttributeIsCdata (parser->m_declAttributeIsCdata) +#define declAttributeIsId (parser->m_declAttributeIsId) +#define freeTagList (parser->m_freeTagList) +#define freeBindingList (parser->m_freeBindingList) +#define inheritedBindings (parser->m_inheritedBindings) +#define tagStack (parser->m_tagStack) +#define atts (parser->m_atts) +#define attsSize (parser->m_attsSize) +#define nSpecifiedAtts (parser->m_nSpecifiedAtts) +#define idAttIndex (parser->m_idAttIndex) +#define nsAtts (parser->m_nsAtts) +#define nsAttsVersion (parser->m_nsAttsVersion) +#define nsAttsPower (parser->m_nsAttsPower) +#define tempPool (parser->m_tempPool) +#define temp2Pool (parser->m_temp2Pool) +#define groupConnector (parser->m_groupConnector) +#define groupSize (parser->m_groupSize) +#define namespaceSeparator (parser->m_namespaceSeparator) +#define parentParser (parser->m_parentParser) +#define parsing (parser->m_parsingStatus.parsing) +#define finalBuffer (parser->m_parsingStatus.finalBuffer) +#ifdef XML_DTD +#define isParamEntity (parser->m_isParamEntity) +#define useForeignDTD (parser->m_useForeignDTD) +#define paramEntityParsing (parser->m_paramEntityParsing) +#endif /* XML_DTD */ + +XML_Parser XMLCALL +XML_ParserCreate(const XML_Char *encodingName) +{ + return XML_ParserCreate_MM(encodingName, NULL, NULL); +} + +XML_Parser XMLCALL +XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep) +{ + XML_Char tmp[2]; + *tmp = nsSep; + return XML_ParserCreate_MM(encodingName, NULL, tmp); +} + +static const XML_Char implicitContext[] = { + 'x', 'm', 'l', '=', 'h', 't', 't', 'p', ':', '/', '/', + 'w', 'w', 'w', '.', 'w', '3', '.', 'o', 'r', 'g', '/', + 'X', 'M', 'L', '/', '1', '9', '9', '8', '/', + 'n', 'a', 'm', 'e', 's', 'p', 'a', 'c', 'e', '\0' +}; + +XML_Parser XMLCALL +XML_ParserCreate_MM(const XML_Char *encodingName, + const XML_Memory_Handling_Suite *memsuite, + const XML_Char *nameSep) +{ + XML_Parser parser = parserCreate(encodingName, memsuite, nameSep, NULL); + if (parser != NULL && ns) { + /* implicit context only set for root parser, since child + parsers (i.e. external entity parsers) will inherit it + */ + if (!setContext(parser, implicitContext)) { + XML_ParserFree(parser); + return NULL; + } + } + return parser; +} + +static XML_Parser +parserCreate(const XML_Char *encodingName, + const XML_Memory_Handling_Suite *memsuite, + const XML_Char *nameSep, + DTD *dtd) +{ + XML_Parser parser; + + if (memsuite) { + XML_Memory_Handling_Suite *mtemp; + parser = (XML_Parser) + memsuite->malloc_fcn(sizeof(struct XML_ParserStruct)); + if (parser != NULL) { + mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem); + mtemp->malloc_fcn = memsuite->malloc_fcn; + mtemp->realloc_fcn = memsuite->realloc_fcn; + mtemp->free_fcn = memsuite->free_fcn; + } + } + else { + XML_Memory_Handling_Suite *mtemp; + parser = (XML_Parser)malloc(sizeof(struct XML_ParserStruct)); + if (parser != NULL) { + mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem); + mtemp->malloc_fcn = malloc; + mtemp->realloc_fcn = realloc; + mtemp->free_fcn = free; + } + } + + if (!parser) + return parser; + + buffer = NULL; + bufferLim = NULL; + + attsSize = INIT_ATTS_SIZE; + atts = (ATTRIBUTE *)MALLOC(attsSize * sizeof(ATTRIBUTE)); + if (atts == NULL) { + FREE(parser); + return NULL; + } + dataBuf = (XML_Char *)MALLOC(INIT_DATA_BUF_SIZE * sizeof(XML_Char)); + if (dataBuf == NULL) { + FREE(atts); + FREE(parser); + return NULL; + } + dataBufEnd = dataBuf + INIT_DATA_BUF_SIZE; + + if (dtd) + _dtd = dtd; + else { + _dtd = dtdCreate(&parser->m_mem); + if (_dtd == NULL) { + FREE(dataBuf); + FREE(atts); + FREE(parser); + return NULL; + } + } + + freeBindingList = NULL; + freeTagList = NULL; + freeInternalEntities = NULL; + + groupSize = 0; + groupConnector = NULL; + + unknownEncodingHandler = NULL; + unknownEncodingHandlerData = NULL; + + namespaceSeparator = '!'; + ns = XML_FALSE; + ns_triplets = XML_FALSE; + + nsAtts = NULL; + nsAttsVersion = 0; + nsAttsPower = 0; + + poolInit(&tempPool, &(parser->m_mem)); + poolInit(&temp2Pool, &(parser->m_mem)); + parserInit(parser, encodingName); + + if (encodingName && !protocolEncodingName) { + XML_ParserFree(parser); + return NULL; + } + + if (nameSep) { + ns = XML_TRUE; + internalEncoding = XmlGetInternalEncodingNS(); + namespaceSeparator = *nameSep; + } + else { + internalEncoding = XmlGetInternalEncoding(); + } + + return parser; +} + +static void +parserInit(XML_Parser parser, const XML_Char *encodingName) +{ + processor = prologInitProcessor; + XmlPrologStateInit(&prologState); + protocolEncodingName = (encodingName != NULL + ? poolCopyString(&tempPool, encodingName) + : NULL); + curBase = NULL; + XmlInitEncoding(&initEncoding, &encoding, 0); + userData = NULL; + handlerArg = NULL; + startElementHandler = NULL; + endElementHandler = NULL; + characterDataHandler = NULL; + processingInstructionHandler = NULL; + commentHandler = NULL; + startCdataSectionHandler = NULL; + endCdataSectionHandler = NULL; + defaultHandler = NULL; + startDoctypeDeclHandler = NULL; + endDoctypeDeclHandler = NULL; + unparsedEntityDeclHandler = NULL; + notationDeclHandler = NULL; + startNamespaceDeclHandler = NULL; + endNamespaceDeclHandler = NULL; + notStandaloneHandler = NULL; + externalEntityRefHandler = NULL; + externalEntityRefHandlerArg = parser; + skippedEntityHandler = NULL; + elementDeclHandler = NULL; + attlistDeclHandler = NULL; + entityDeclHandler = NULL; + xmlDeclHandler = NULL; + bufferPtr = buffer; + bufferEnd = buffer; + parseEndByteIndex = 0; + parseEndPtr = NULL; + declElementType = NULL; + declAttributeId = NULL; + declEntity = NULL; + doctypeName = NULL; + doctypeSysid = NULL; + doctypePubid = NULL; + declAttributeType = NULL; + declNotationName = NULL; + declNotationPublicId = NULL; + declAttributeIsCdata = XML_FALSE; + declAttributeIsId = XML_FALSE; + memset(&position, 0, sizeof(POSITION)); + errorCode = XML_ERROR_NONE; + eventPtr = NULL; + eventEndPtr = NULL; + positionPtr = NULL; + openInternalEntities = NULL; + defaultExpandInternalEntities = XML_TRUE; + tagLevel = 0; + tagStack = NULL; + inheritedBindings = NULL; + nSpecifiedAtts = 0; + unknownEncodingMem = NULL; + unknownEncodingRelease = NULL; + unknownEncodingData = NULL; + parentParser = NULL; + parsing = XML_INITIALIZED; +#ifdef XML_DTD + isParamEntity = XML_FALSE; + useForeignDTD = XML_FALSE; + paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; +#endif +} + +/* moves list of bindings to freeBindingList */ +static void FASTCALL +moveToFreeBindingList(XML_Parser parser, BINDING *bindings) +{ + while (bindings) { + BINDING *b = bindings; + bindings = bindings->nextTagBinding; + b->nextTagBinding = freeBindingList; + freeBindingList = b; + } +} + +XML_Bool XMLCALL +XML_ParserReset(XML_Parser parser, const XML_Char *encodingName) +{ + TAG *tStk; + OPEN_INTERNAL_ENTITY *openEntityList; + if (parentParser) + return XML_FALSE; + /* move tagStack to freeTagList */ + tStk = tagStack; + while (tStk) { + TAG *tag = tStk; + tStk = tStk->parent; + tag->parent = freeTagList; + moveToFreeBindingList(parser, tag->bindings); + tag->bindings = NULL; + freeTagList = tag; + } + /* move openInternalEntities to freeInternalEntities */ + openEntityList = openInternalEntities; + while (openEntityList) { + OPEN_INTERNAL_ENTITY *openEntity = openEntityList; + openEntityList = openEntity->next; + openEntity->next = freeInternalEntities; + freeInternalEntities = openEntity; + } + moveToFreeBindingList(parser, inheritedBindings); + FREE(unknownEncodingMem); + if (unknownEncodingRelease) + unknownEncodingRelease(unknownEncodingData); + poolClear(&tempPool); + poolClear(&temp2Pool); + parserInit(parser, encodingName); + dtdReset(_dtd, &parser->m_mem); + return setContext(parser, implicitContext); +} + +enum XML_Status XMLCALL +XML_SetEncoding(XML_Parser parser, const XML_Char *encodingName) +{ + /* Block after XML_Parse()/XML_ParseBuffer() has been called. + XXX There's no way for the caller to determine which of the + XXX possible error cases caused the XML_STATUS_ERROR return. + */ + if (parsing == XML_PARSING || parsing == XML_SUSPENDED) + return XML_STATUS_ERROR; + if (encodingName == NULL) + protocolEncodingName = NULL; + else { + protocolEncodingName = poolCopyString(&tempPool, encodingName); + if (!protocolEncodingName) + return XML_STATUS_ERROR; + } + return XML_STATUS_OK; +} + +XML_Parser XMLCALL +XML_ExternalEntityParserCreate(XML_Parser oldParser, + const XML_Char *context, + const XML_Char *encodingName) +{ + XML_Parser parser = oldParser; + DTD *newDtd = NULL; + DTD *oldDtd = _dtd; + XML_StartElementHandler oldStartElementHandler = startElementHandler; + XML_EndElementHandler oldEndElementHandler = endElementHandler; + XML_CharacterDataHandler oldCharacterDataHandler = characterDataHandler; + XML_ProcessingInstructionHandler oldProcessingInstructionHandler + = processingInstructionHandler; + XML_CommentHandler oldCommentHandler = commentHandler; + XML_StartCdataSectionHandler oldStartCdataSectionHandler + = startCdataSectionHandler; + XML_EndCdataSectionHandler oldEndCdataSectionHandler + = endCdataSectionHandler; + XML_DefaultHandler oldDefaultHandler = defaultHandler; + XML_UnparsedEntityDeclHandler oldUnparsedEntityDeclHandler + = unparsedEntityDeclHandler; + XML_NotationDeclHandler oldNotationDeclHandler = notationDeclHandler; + XML_StartNamespaceDeclHandler oldStartNamespaceDeclHandler + = startNamespaceDeclHandler; + XML_EndNamespaceDeclHandler oldEndNamespaceDeclHandler + = endNamespaceDeclHandler; + XML_NotStandaloneHandler oldNotStandaloneHandler = notStandaloneHandler; + XML_ExternalEntityRefHandler oldExternalEntityRefHandler + = externalEntityRefHandler; + XML_SkippedEntityHandler oldSkippedEntityHandler = skippedEntityHandler; + XML_UnknownEncodingHandler oldUnknownEncodingHandler + = unknownEncodingHandler; + XML_ElementDeclHandler oldElementDeclHandler = elementDeclHandler; + XML_AttlistDeclHandler oldAttlistDeclHandler = attlistDeclHandler; + XML_EntityDeclHandler oldEntityDeclHandler = entityDeclHandler; + XML_XmlDeclHandler oldXmlDeclHandler = xmlDeclHandler; + ELEMENT_TYPE * oldDeclElementType = declElementType; + + void *oldUserData = userData; + void *oldHandlerArg = handlerArg; + XML_Bool oldDefaultExpandInternalEntities = defaultExpandInternalEntities; + XML_Parser oldExternalEntityRefHandlerArg = externalEntityRefHandlerArg; +#ifdef XML_DTD + enum XML_ParamEntityParsing oldParamEntityParsing = paramEntityParsing; + int oldInEntityValue = prologState.inEntityValue; +#endif + XML_Bool oldns_triplets = ns_triplets; + +#ifdef XML_DTD + if (!context) + newDtd = oldDtd; +#endif /* XML_DTD */ + + /* Note that the magical uses of the pre-processor to make field + access look more like C++ require that `parser' be overwritten + here. This makes this function more painful to follow than it + would be otherwise. + */ + if (ns) { + XML_Char tmp[2]; + *tmp = namespaceSeparator; + parser = parserCreate(encodingName, &parser->m_mem, tmp, newDtd); + } + else { + parser = parserCreate(encodingName, &parser->m_mem, NULL, newDtd); + } + + if (!parser) + return NULL; + + startElementHandler = oldStartElementHandler; + endElementHandler = oldEndElementHandler; + characterDataHandler = oldCharacterDataHandler; + processingInstructionHandler = oldProcessingInstructionHandler; + commentHandler = oldCommentHandler; + startCdataSectionHandler = oldStartCdataSectionHandler; + endCdataSectionHandler = oldEndCdataSectionHandler; + defaultHandler = oldDefaultHandler; + unparsedEntityDeclHandler = oldUnparsedEntityDeclHandler; + notationDeclHandler = oldNotationDeclHandler; + startNamespaceDeclHandler = oldStartNamespaceDeclHandler; + endNamespaceDeclHandler = oldEndNamespaceDeclHandler; + notStandaloneHandler = oldNotStandaloneHandler; + externalEntityRefHandler = oldExternalEntityRefHandler; + skippedEntityHandler = oldSkippedEntityHandler; + unknownEncodingHandler = oldUnknownEncodingHandler; + elementDeclHandler = oldElementDeclHandler; + attlistDeclHandler = oldAttlistDeclHandler; + entityDeclHandler = oldEntityDeclHandler; + xmlDeclHandler = oldXmlDeclHandler; + declElementType = oldDeclElementType; + userData = oldUserData; + if (oldUserData == oldHandlerArg) + handlerArg = userData; + else + handlerArg = parser; + if (oldExternalEntityRefHandlerArg != oldParser) + externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg; + defaultExpandInternalEntities = oldDefaultExpandInternalEntities; + ns_triplets = oldns_triplets; + parentParser = oldParser; +#ifdef XML_DTD + paramEntityParsing = oldParamEntityParsing; + prologState.inEntityValue = oldInEntityValue; + if (context) { +#endif /* XML_DTD */ + if (!dtdCopy(_dtd, oldDtd, &parser->m_mem) + || !setContext(parser, context)) { + XML_ParserFree(parser); + return NULL; + } + processor = externalEntityInitProcessor; +#ifdef XML_DTD + } + else { + /* The DTD instance referenced by _dtd is shared between the document's + root parser and external PE parsers, therefore one does not need to + call setContext. In addition, one also *must* not call setContext, + because this would overwrite existing prefix->binding pointers in + _dtd with ones that get destroyed with the external PE parser. + This would leave those prefixes with dangling pointers. + */ + isParamEntity = XML_TRUE; + XmlPrologStateInitExternalEntity(&prologState); + processor = externalParEntInitProcessor; + } +#endif /* XML_DTD */ + return parser; +} + +static void FASTCALL +destroyBindings(BINDING *bindings, XML_Parser parser) +{ + for (;;) { + BINDING *b = bindings; + if (!b) + break; + bindings = b->nextTagBinding; + FREE(b->uri); + FREE(b); + } +} + +void XMLCALL +XML_ParserFree(XML_Parser parser) +{ + TAG *tagList; + OPEN_INTERNAL_ENTITY *entityList; + if (parser == NULL) + return; + /* free tagStack and freeTagList */ + tagList = tagStack; + for (;;) { + TAG *p; + if (tagList == NULL) { + if (freeTagList == NULL) + break; + tagList = freeTagList; + freeTagList = NULL; + } + p = tagList; + tagList = tagList->parent; + FREE(p->buf); + destroyBindings(p->bindings, parser); + FREE(p); + } + /* free openInternalEntities and freeInternalEntities */ + entityList = openInternalEntities; + for (;;) { + OPEN_INTERNAL_ENTITY *openEntity; + if (entityList == NULL) { + if (freeInternalEntities == NULL) + break; + entityList = freeInternalEntities; + freeInternalEntities = NULL; + } + openEntity = entityList; + entityList = entityList->next; + FREE(openEntity); + } + + destroyBindings(freeBindingList, parser); + destroyBindings(inheritedBindings, parser); + poolDestroy(&tempPool); + poolDestroy(&temp2Pool); +#ifdef XML_DTD + /* external parameter entity parsers share the DTD structure + parser->m_dtd with the root parser, so we must not destroy it + */ + if (!isParamEntity && _dtd) +#else + if (_dtd) +#endif /* XML_DTD */ + dtdDestroy(_dtd, (XML_Bool)!parentParser, &parser->m_mem); + FREE((void *)atts); + FREE(groupConnector); + FREE(buffer); + FREE(dataBuf); + FREE(nsAtts); + FREE(unknownEncodingMem); + if (unknownEncodingRelease) + unknownEncodingRelease(unknownEncodingData); + FREE(parser); +} + +void XMLCALL +XML_UseParserAsHandlerArg(XML_Parser parser) +{ + handlerArg = parser; +} + +enum XML_Error XMLCALL +XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD) +{ +#ifdef XML_DTD + /* block after XML_Parse()/XML_ParseBuffer() has been called */ + if (parsing == XML_PARSING || parsing == XML_SUSPENDED) + return XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING; + useForeignDTD = useDTD; + return XML_ERROR_NONE; +#else + return XML_ERROR_FEATURE_REQUIRES_XML_DTD; +#endif +} + +void XMLCALL +XML_SetReturnNSTriplet(XML_Parser parser, int do_nst) +{ + /* block after XML_Parse()/XML_ParseBuffer() has been called */ + if (parsing == XML_PARSING || parsing == XML_SUSPENDED) + return; + ns_triplets = do_nst ? XML_TRUE : XML_FALSE; +} + +void XMLCALL +XML_SetUserData(XML_Parser parser, void *p) +{ + if (handlerArg == userData) + handlerArg = userData = p; + else + userData = p; +} + +enum XML_Status XMLCALL +XML_SetBase(XML_Parser parser, const XML_Char *p) +{ + if (p) { + p = poolCopyString(&_dtd->pool, p); + if (!p) + return XML_STATUS_ERROR; + curBase = p; + } + else + curBase = NULL; + return XML_STATUS_OK; +} + +const XML_Char * XMLCALL +XML_GetBase(XML_Parser parser) +{ + return curBase; +} + +int XMLCALL +XML_GetSpecifiedAttributeCount(XML_Parser parser) +{ + return nSpecifiedAtts; +} + +int XMLCALL +XML_GetIdAttributeIndex(XML_Parser parser) +{ + return idAttIndex; +} + +void XMLCALL +XML_SetElementHandler(XML_Parser parser, + XML_StartElementHandler start, + XML_EndElementHandler end) +{ + startElementHandler = start; + endElementHandler = end; +} + +void XMLCALL +XML_SetStartElementHandler(XML_Parser parser, + XML_StartElementHandler start) { + startElementHandler = start; +} + +void XMLCALL +XML_SetEndElementHandler(XML_Parser parser, + XML_EndElementHandler end) { + endElementHandler = end; +} + +void XMLCALL +XML_SetCharacterDataHandler(XML_Parser parser, + XML_CharacterDataHandler handler) +{ + characterDataHandler = handler; +} + +void XMLCALL +XML_SetProcessingInstructionHandler(XML_Parser parser, + XML_ProcessingInstructionHandler handler) +{ + processingInstructionHandler = handler; +} + +void XMLCALL +XML_SetCommentHandler(XML_Parser parser, + XML_CommentHandler handler) +{ + commentHandler = handler; +} + +void XMLCALL +XML_SetCdataSectionHandler(XML_Parser parser, + XML_StartCdataSectionHandler start, + XML_EndCdataSectionHandler end) +{ + startCdataSectionHandler = start; + endCdataSectionHandler = end; +} + +void XMLCALL +XML_SetStartCdataSectionHandler(XML_Parser parser, + XML_StartCdataSectionHandler start) { + startCdataSectionHandler = start; +} + +void XMLCALL +XML_SetEndCdataSectionHandler(XML_Parser parser, + XML_EndCdataSectionHandler end) { + endCdataSectionHandler = end; +} + +void XMLCALL +XML_SetDefaultHandler(XML_Parser parser, + XML_DefaultHandler handler) +{ + defaultHandler = handler; + defaultExpandInternalEntities = XML_FALSE; +} + +void XMLCALL +XML_SetDefaultHandlerExpand(XML_Parser parser, + XML_DefaultHandler handler) +{ + defaultHandler = handler; + defaultExpandInternalEntities = XML_TRUE; +} + +void XMLCALL +XML_SetDoctypeDeclHandler(XML_Parser parser, + XML_StartDoctypeDeclHandler start, + XML_EndDoctypeDeclHandler end) +{ + startDoctypeDeclHandler = start; + endDoctypeDeclHandler = end; +} + +void XMLCALL +XML_SetStartDoctypeDeclHandler(XML_Parser parser, + XML_StartDoctypeDeclHandler start) { + startDoctypeDeclHandler = start; +} + +void XMLCALL +XML_SetEndDoctypeDeclHandler(XML_Parser parser, + XML_EndDoctypeDeclHandler end) { + endDoctypeDeclHandler = end; +} + +void XMLCALL +XML_SetUnparsedEntityDeclHandler(XML_Parser parser, + XML_UnparsedEntityDeclHandler handler) +{ + unparsedEntityDeclHandler = handler; +} + +void XMLCALL +XML_SetNotationDeclHandler(XML_Parser parser, + XML_NotationDeclHandler handler) +{ + notationDeclHandler = handler; +} + +void XMLCALL +XML_SetNamespaceDeclHandler(XML_Parser parser, + XML_StartNamespaceDeclHandler start, + XML_EndNamespaceDeclHandler end) +{ + startNamespaceDeclHandler = start; + endNamespaceDeclHandler = end; +} + +void XMLCALL +XML_SetStartNamespaceDeclHandler(XML_Parser parser, + XML_StartNamespaceDeclHandler start) { + startNamespaceDeclHandler = start; +} + +void XMLCALL +XML_SetEndNamespaceDeclHandler(XML_Parser parser, + XML_EndNamespaceDeclHandler end) { + endNamespaceDeclHandler = end; +} + +void XMLCALL +XML_SetNotStandaloneHandler(XML_Parser parser, + XML_NotStandaloneHandler handler) +{ + notStandaloneHandler = handler; +} + +void XMLCALL +XML_SetExternalEntityRefHandler(XML_Parser parser, + XML_ExternalEntityRefHandler handler) +{ + externalEntityRefHandler = handler; +} + +void XMLCALL +XML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg) +{ + if (arg) + externalEntityRefHandlerArg = (XML_Parser)arg; + else + externalEntityRefHandlerArg = parser; +} + +void XMLCALL +XML_SetSkippedEntityHandler(XML_Parser parser, + XML_SkippedEntityHandler handler) +{ + skippedEntityHandler = handler; +} + +void XMLCALL +XML_SetUnknownEncodingHandler(XML_Parser parser, + XML_UnknownEncodingHandler handler, + void *data) +{ + unknownEncodingHandler = handler; + unknownEncodingHandlerData = data; +} + +void XMLCALL +XML_SetElementDeclHandler(XML_Parser parser, + XML_ElementDeclHandler eldecl) +{ + elementDeclHandler = eldecl; +} + +void XMLCALL +XML_SetAttlistDeclHandler(XML_Parser parser, + XML_AttlistDeclHandler attdecl) +{ + attlistDeclHandler = attdecl; +} + +void XMLCALL +XML_SetEntityDeclHandler(XML_Parser parser, + XML_EntityDeclHandler handler) +{ + entityDeclHandler = handler; +} + +void XMLCALL +XML_SetXmlDeclHandler(XML_Parser parser, + XML_XmlDeclHandler handler) { + xmlDeclHandler = handler; +} + +int XMLCALL +XML_SetParamEntityParsing(XML_Parser parser, + enum XML_ParamEntityParsing peParsing) +{ + /* block after XML_Parse()/XML_ParseBuffer() has been called */ + if (parsing == XML_PARSING || parsing == XML_SUSPENDED) + return 0; +#ifdef XML_DTD + paramEntityParsing = peParsing; + return 1; +#else + return peParsing == XML_PARAM_ENTITY_PARSING_NEVER; +#endif +} + +enum XML_Status XMLCALL +XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) +{ + switch (parsing) { + case XML_SUSPENDED: + errorCode = XML_ERROR_SUSPENDED; + return XML_STATUS_ERROR; + case XML_FINISHED: + errorCode = XML_ERROR_FINISHED; + return XML_STATUS_ERROR; + default: + parsing = XML_PARSING; + } + + if (len == 0) { + finalBuffer = (XML_Bool)isFinal; + if (!isFinal) + return XML_STATUS_OK; + positionPtr = bufferPtr; + parseEndPtr = bufferEnd; + + /* If data are left over from last buffer, and we now know that these + data are the final chunk of input, then we have to check them again + to detect errors based on this information. + */ + errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr); + + if (errorCode == XML_ERROR_NONE) { + switch (parsing) { + case XML_SUSPENDED: + XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); + positionPtr = bufferPtr; + return XML_STATUS_SUSPENDED; + case XML_INITIALIZED: + case XML_PARSING: + parsing = XML_FINISHED; + /* fall through */ + default: + return XML_STATUS_OK; + } + } + eventEndPtr = eventPtr; + processor = errorProcessor; + return XML_STATUS_ERROR; + } +#ifndef XML_CONTEXT_BYTES + else if (bufferPtr == bufferEnd) { + const char *end; + int nLeftOver; + parseEndByteIndex += len; + positionPtr = s; + finalBuffer = (XML_Bool)isFinal; + enum XML_Error result; + + errorCode = processor(parser, s, parseEndPtr = s + len, &end); + + if (errorCode != XML_ERROR_NONE) { + eventEndPtr = eventPtr; + processor = errorProcessor; + return XML_STATUS_ERROR; + } + else { + switch (parsing) { + case XML_SUSPENDED: + result = XML_STATUS_SUSPENDED; + break; + case XML_INITIALIZED, XML_PARSING: + result = XML_STATUS_OK; + if (isFinal) { + parsing = XML_FINISHED; + return result; + } + } + } + + XmlUpdatePosition(encoding, positionPtr, end, &position); + positionPtr = end; + nLeftOver = s + len - end; + if (nLeftOver) { + if (buffer == NULL || nLeftOver > bufferLim - buffer) { + /* FIXME avoid integer overflow */ + char *temp; + temp = (buffer == NULL + ? (char *)MALLOC(len * 2) + : (char *)REALLOC(buffer, len * 2)); + if (temp == NULL) { + errorCode = XML_ERROR_NO_MEMORY; + return XML_STATUS_ERROR; + } + buffer = temp; + if (!buffer) { + errorCode = XML_ERROR_NO_MEMORY; + eventPtr = eventEndPtr = NULL; + processor = errorProcessor; + return XML_STATUS_ERROR; + } + bufferLim = buffer + len * 2; + } + memcpy(buffer, end, nLeftOver); + bufferPtr = buffer; + bufferEnd = buffer + nLeftOver; + } + return result; + } +#endif /* not defined XML_CONTEXT_BYTES */ + else { + void *buff = XML_GetBuffer(parser, len); + if (buff == NULL) + return XML_STATUS_ERROR; + else { + memcpy(buff, s, len); + return XML_ParseBuffer(parser, len, isFinal); + } + } +} + +enum XML_Status XMLCALL +XML_ParseBuffer(XML_Parser parser, int len, int isFinal) +{ + const char *start; + enum XML_Error result = XML_STATUS_OK; + + switch (parsing) { + case XML_SUSPENDED: + errorCode = XML_ERROR_SUSPENDED; + return XML_STATUS_ERROR; + case XML_FINISHED: + errorCode = XML_ERROR_FINISHED; + return XML_STATUS_ERROR; + default: + parsing = XML_PARSING; + } + + start = bufferPtr; + positionPtr = start; + bufferEnd += len; + parseEndPtr = bufferEnd; + parseEndByteIndex += len; + finalBuffer = (XML_Bool)isFinal; + + errorCode = processor(parser, start, parseEndPtr, &bufferPtr); + + if (errorCode != XML_ERROR_NONE) { + eventEndPtr = eventPtr; + processor = errorProcessor; + return XML_STATUS_ERROR; + } + else { + switch (parsing) { + case XML_SUSPENDED: + result = XML_STATUS_SUSPENDED; + break; + case XML_INITIALIZED: + case XML_PARSING: + if (isFinal) { + parsing = XML_FINISHED; + return result; + } + default: ; /* should not happen */ + } + } + + XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); + positionPtr = bufferPtr; + return result; +} + +void * XMLCALL +XML_GetBuffer(XML_Parser parser, int len) +{ + switch (parsing) { + case XML_SUSPENDED: + errorCode = XML_ERROR_SUSPENDED; + return NULL; + case XML_FINISHED: + errorCode = XML_ERROR_FINISHED; + return NULL; + default: ; + } + + if (len > bufferLim - bufferEnd) { + /* FIXME avoid integer overflow */ + int neededSize = len + (bufferEnd - bufferPtr); +#ifdef XML_CONTEXT_BYTES + int keep = bufferPtr - buffer; + + if (keep > XML_CONTEXT_BYTES) + keep = XML_CONTEXT_BYTES; + neededSize += keep; +#endif /* defined XML_CONTEXT_BYTES */ + if (neededSize <= bufferLim - buffer) { +#ifdef XML_CONTEXT_BYTES + if (keep < bufferPtr - buffer) { + int offset = (bufferPtr - buffer) - keep; + memmove(buffer, &buffer[offset], bufferEnd - bufferPtr + keep); + bufferEnd -= offset; + bufferPtr -= offset; + } +#else + memmove(buffer, bufferPtr, bufferEnd - bufferPtr); + bufferEnd = buffer + (bufferEnd - bufferPtr); + bufferPtr = buffer; +#endif /* not defined XML_CONTEXT_BYTES */ + } + else { + char *newBuf; + int bufferSize = bufferLim - bufferPtr; + if (bufferSize == 0) + bufferSize = INIT_BUFFER_SIZE; + do { + bufferSize *= 2; + } while (bufferSize < neededSize); + newBuf = (char *)MALLOC(bufferSize); + if (newBuf == 0) { + errorCode = XML_ERROR_NO_MEMORY; + return NULL; + } + bufferLim = newBuf + bufferSize; +#ifdef XML_CONTEXT_BYTES + if (bufferPtr) { + int keep = bufferPtr - buffer; + if (keep > XML_CONTEXT_BYTES) + keep = XML_CONTEXT_BYTES; + memcpy(newBuf, &bufferPtr[-keep], bufferEnd - bufferPtr + keep); + FREE(buffer); + buffer = newBuf; + bufferEnd = buffer + (bufferEnd - bufferPtr) + keep; + bufferPtr = buffer + keep; + } + else { + bufferEnd = newBuf + (bufferEnd - bufferPtr); + bufferPtr = buffer = newBuf; + } +#else + if (bufferPtr) { + memcpy(newBuf, bufferPtr, bufferEnd - bufferPtr); + FREE(buffer); + } + bufferEnd = newBuf + (bufferEnd - bufferPtr); + bufferPtr = buffer = newBuf; +#endif /* not defined XML_CONTEXT_BYTES */ + } + } + return bufferEnd; +} + +enum XML_Status XMLCALL +XML_StopParser(XML_Parser parser, XML_Bool resumable) +{ + switch (parsing) { + case XML_SUSPENDED: + if (resumable) { + errorCode = XML_ERROR_SUSPENDED; + return XML_STATUS_ERROR; + } + parsing = XML_FINISHED; + break; + case XML_FINISHED: + errorCode = XML_ERROR_FINISHED; + return XML_STATUS_ERROR; + default: + if (resumable) { +#ifdef XML_DTD //MF + if (isParamEntity) { + errorCode = XML_ERROR_SUSPEND_PE; + return XML_STATUS_ERROR; + } +#endif + parsing = XML_SUSPENDED; + } + else + parsing = XML_FINISHED; + } + return XML_STATUS_OK; +} + +enum XML_Status XMLCALL +XML_ResumeParser(XML_Parser parser) +{ + enum XML_Error result = XML_STATUS_OK; + + if (parsing != XML_SUSPENDED) { + errorCode = XML_ERROR_NOT_SUSPENDED; + return XML_STATUS_ERROR; + } + parsing = XML_PARSING; + + errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr); + + if (errorCode != XML_ERROR_NONE) { + eventEndPtr = eventPtr; + processor = errorProcessor; + return XML_STATUS_ERROR; + } + else { + switch (parsing) { + case XML_SUSPENDED: + result = XML_STATUS_SUSPENDED; + break; + case XML_INITIALIZED: + case XML_PARSING: + if (finalBuffer) { + parsing = XML_FINISHED; + return result; + } + default: ; + } + } + + XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); + positionPtr = bufferPtr; + return result; +} + +void XMLCALL +XML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status) +{ + *status = parser->m_parsingStatus; +} + +enum XML_Error XMLCALL +XML_GetErrorCode(XML_Parser parser) +{ + return errorCode; +} + +long XMLCALL +XML_GetCurrentByteIndex(XML_Parser parser) +{ + if (eventPtr) + return parseEndByteIndex - (parseEndPtr - eventPtr); + return -1; +} + +int XMLCALL +XML_GetCurrentByteCount(XML_Parser parser) +{ + if (eventEndPtr && eventPtr) + return eventEndPtr - eventPtr; + return 0; +} + +const char * XMLCALL +XML_GetInputContext(XML_Parser parser, int *offset, int *size) +{ +#ifdef XML_CONTEXT_BYTES + if (eventPtr && buffer) { + *offset = eventPtr - buffer; + *size = bufferEnd - buffer; + return buffer; + } +#endif /* defined XML_CONTEXT_BYTES */ + return (char *) 0; +} + +int XMLCALL +XML_GetCurrentLineNumber(XML_Parser parser) +{ + if (eventPtr && eventPtr >= positionPtr) { + XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); + positionPtr = eventPtr; + } + return position.lineNumber + 1; +} + +int XMLCALL +XML_GetCurrentColumnNumber(XML_Parser parser) +{ + if (eventPtr && eventPtr >= positionPtr) { + XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); + positionPtr = eventPtr; + } + return position.columnNumber; +} + +void XMLCALL +XML_FreeContentModel(XML_Parser parser, XML_Content *model) +{ + FREE(model); +} + +void * XMLCALL +XML_MemMalloc(XML_Parser parser, size_t size) +{ + return MALLOC(size); +} + +void * XMLCALL +XML_MemRealloc(XML_Parser parser, void *ptr, size_t size) +{ + return REALLOC(ptr, size); +} + +void XMLCALL +XML_MemFree(XML_Parser parser, void *ptr) +{ + FREE(ptr); +} + +void XMLCALL +XML_DefaultCurrent(XML_Parser parser) +{ + if (defaultHandler) { + if (openInternalEntities) + reportDefault(parser, + internalEncoding, + openInternalEntities->internalEventPtr, + openInternalEntities->internalEventEndPtr); + else + reportDefault(parser, encoding, eventPtr, eventEndPtr); + } +} + +const XML_LChar * XMLCALL +XML_ErrorString(enum XML_Error code) +{ + static const XML_LChar *message[] = { + 0, + XML_L("out of memory"), + XML_L("syntax error"), + XML_L("no element found"), + XML_L("not well-formed (invalid token)"), + XML_L("unclosed token"), + XML_L("partial character"), + XML_L("mismatched tag"), + XML_L("duplicate attribute"), + XML_L("junk after document element"), + XML_L("illegal parameter entity reference"), + XML_L("undefined entity"), + XML_L("recursive entity reference"), + XML_L("asynchronous entity"), + XML_L("reference to invalid character number"), + XML_L("reference to binary entity"), + XML_L("reference to external entity in attribute"), + XML_L("xml declaration not at start of external entity"), + XML_L("unknown encoding"), + XML_L("encoding specified in XML declaration is incorrect"), + XML_L("unclosed CDATA section"), + XML_L("error in processing external entity reference"), + XML_L("document is not standalone"), + XML_L("unexpected parser state - please send a bug report"), + XML_L("entity declared in parameter entity"), + XML_L("requested feature requires XML_DTD support in Expat"), + XML_L("cannot change setting once parsing has begun"), + XML_L("unbound prefix"), + XML_L("parser suspended"), + XML_L("parser not suspended"), + XML_L("parsing aborted"), + XML_L("parsing finished"), + XML_L("cannot suspend in external parameter entity") + }; + if (code > 0 && code < sizeof(message)/sizeof(message[0])) + return message[code]; + return NULL; +} + +const XML_LChar * XMLCALL +XML_ExpatVersion(void) { + + /* V1 is used to string-ize the version number. However, it would + string-ize the actual version macro *names* unless we get them + substituted before being passed to V1. CPP is defined to expand + a macro, then rescan for more expansions. Thus, we use V2 to expand + the version macros, then CPP will expand the resulting V1() macro + with the correct numerals. */ + /* ### I'm assuming cpp is portable in this respect... */ + +#define V1(a,b,c) XML_L(#a)XML_L(".")XML_L(#b)XML_L(".")XML_L(#c) +#define V2(a,b,c) XML_L("expat_")V1(a,b,c) + + return V2(XML_MAJOR_VERSION, XML_MINOR_VERSION, XML_MICRO_VERSION); + +#undef V1 +#undef V2 +} + +XML_Expat_Version XMLCALL +XML_ExpatVersionInfo(void) +{ + XML_Expat_Version version; + + version.major = XML_MAJOR_VERSION; + version.minor = XML_MINOR_VERSION; + version.micro = XML_MICRO_VERSION; + + return version; +} + +const XML_Feature * XMLCALL +XML_GetFeatureList(void) +{ + static XML_Feature features[] = { + {XML_FEATURE_SIZEOF_XML_CHAR, XML_L("sizeof(XML_Char)"), 0}, + {XML_FEATURE_SIZEOF_XML_LCHAR, XML_L("sizeof(XML_LChar)"), 0}, +#ifdef XML_UNICODE + {XML_FEATURE_UNICODE, XML_L("XML_UNICODE"), 0}, +#endif +#ifdef XML_UNICODE_WCHAR_T + {XML_FEATURE_UNICODE_WCHAR_T, XML_L("XML_UNICODE_WCHAR_T"), 0}, +#endif +#ifdef XML_DTD + {XML_FEATURE_DTD, XML_L("XML_DTD"), 0}, +#endif +#ifdef XML_CONTEXT_BYTES + {XML_FEATURE_CONTEXT_BYTES, XML_L("XML_CONTEXT_BYTES"), + XML_CONTEXT_BYTES}, +#endif +#ifdef XML_MIN_SIZE + {XML_FEATURE_MIN_SIZE, XML_L("XML_MIN_SIZE"), 0}, +#endif + {XML_FEATURE_END, NULL, 0} + }; + + features[0].value = sizeof(XML_Char); + features[1].value = sizeof(XML_LChar); + return features; +} + +/* Initially tag->rawName always points into the parse buffer; + for those TAG instances opened while the current parse buffer was + processed, and not yet closed, we need to store tag->rawName in a more + permanent location, since the parse buffer is about to be discarded. +*/ +static XML_Bool +storeRawNames(XML_Parser parser) +{ + TAG *tag = tagStack; + while (tag) { + int bufSize; + int nameLen = sizeof(XML_Char) * (tag->name.strLen + 1); + char *rawNameBuf = tag->buf + nameLen; + /* Stop if already stored. Since tagStack is a stack, we can stop + at the first entry that has already been copied; everything + below it in the stack is already been accounted for in a + previous call to this function. + */ + if (tag->rawName == rawNameBuf) + break; + /* For re-use purposes we need to ensure that the + size of tag->buf is a multiple of sizeof(XML_Char). + */ + bufSize = nameLen + ROUND_UP(tag->rawNameLength, sizeof(XML_Char)); + if (bufSize > tag->bufEnd - tag->buf) { + char *temp = (char *)REALLOC(tag->buf, bufSize); + if (temp == NULL) + return XML_FALSE; + /* if tag->name.str points to tag->buf (only when namespace + processing is off) then we have to update it + */ + if (tag->name.str == (XML_Char *)tag->buf) + tag->name.str = (XML_Char *)temp; + /* if tag->name.localPart is set (when namespace processing is on) + then update it as well, since it will always point into tag->buf + */ + if (tag->name.localPart) + tag->name.localPart = (XML_Char *)temp + (tag->name.localPart - + (XML_Char *)tag->buf); + tag->buf = temp; + tag->bufEnd = temp + bufSize; + rawNameBuf = temp + nameLen; + } + memcpy(rawNameBuf, tag->rawName, tag->rawNameLength); + tag->rawName = rawNameBuf; + tag = tag->parent; + } + return XML_TRUE; +} + +static enum XML_Error PTRCALL +contentProcessor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + enum XML_Error result = doContent(parser, 0, encoding, start, end, + endPtr, (XML_Bool)!finalBuffer); + if (result == XML_ERROR_NONE) { + if (!storeRawNames(parser)) + return XML_ERROR_NO_MEMORY; + } + return result; +} + +static enum XML_Error PTRCALL +externalEntityInitProcessor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + enum XML_Error result = initializeEncoding(parser); + if (result != XML_ERROR_NONE) + return result; + processor = externalEntityInitProcessor2; + return externalEntityInitProcessor2(parser, start, end, endPtr); +} + +static enum XML_Error PTRCALL +externalEntityInitProcessor2(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + const char *next = start; /* XmlContentTok doesn't always set the last arg */ + int tok = XmlContentTok(encoding, start, end, &next); + switch (tok) { + case XML_TOK_BOM: + /* If we are at the end of the buffer, this would cause the next stage, + i.e. externalEntityInitProcessor3, to pass control directly to + doContent (by detecting XML_TOK_NONE) without processing any xml text + declaration - causing the error XML_ERROR_MISPLACED_XML_PI in doContent. + */ + if (next == end && !finalBuffer) { + *endPtr = next; + return XML_ERROR_NONE; + } + start = next; + break; + case XML_TOK_PARTIAL: + if (!finalBuffer) { + *endPtr = start; + return XML_ERROR_NONE; + } + eventPtr = start; + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (!finalBuffer) { + *endPtr = start; + return XML_ERROR_NONE; + } + eventPtr = start; + return XML_ERROR_PARTIAL_CHAR; + } + processor = externalEntityInitProcessor3; + return externalEntityInitProcessor3(parser, start, end, endPtr); +} + +static enum XML_Error PTRCALL +externalEntityInitProcessor3(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + int tok; + const char *next = start; /* XmlContentTok doesn't always set the last arg */ + eventPtr = start; + tok = XmlContentTok(encoding, start, end, &next); + eventEndPtr = next; + + switch (tok) { + case XML_TOK_XML_DECL: + { + enum XML_Error result; + result = processXmlDecl(parser, 1, start, next); + if (result != XML_ERROR_NONE) + return result; + switch (parsing) { + case XML_SUSPENDED: + *endPtr = next; + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; + default: + start = next; + } + } + break; + case XML_TOK_PARTIAL: + if (!finalBuffer) { + *endPtr = start; + return XML_ERROR_NONE; + } + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (!finalBuffer) { + *endPtr = start; + return XML_ERROR_NONE; + } + return XML_ERROR_PARTIAL_CHAR; + } + processor = externalEntityContentProcessor; + tagLevel = 1; + return externalEntityContentProcessor(parser, start, end, endPtr); +} + +static enum XML_Error PTRCALL +externalEntityContentProcessor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + enum XML_Error result = doContent(parser, 1, encoding, start, end, + endPtr, (XML_Bool)!finalBuffer); + if (result == XML_ERROR_NONE) { + if (!storeRawNames(parser)) + return XML_ERROR_NO_MEMORY; + } + return result; +} + +static enum XML_Error +doContent(XML_Parser parser, + int startTagLevel, + const ENCODING *enc, + const char *s, + const char *end, + const char **nextPtr, + XML_Bool haveMore) +{ + /* save one level of indirection */ + DTD * const dtd = _dtd; + + const char **eventPP; + const char **eventEndPP; + if (enc == encoding) { + eventPP = &eventPtr; + eventEndPP = &eventEndPtr; + } + else { + eventPP = &(openInternalEntities->internalEventPtr); + eventEndPP = &(openInternalEntities->internalEventEndPtr); + } + *eventPP = s; + + for (;;) { + const char *next = s; /* XmlContentTok doesn't always set the last arg */ + int tok = XmlContentTok(enc, s, end, &next); + *eventEndPP = next; + switch (tok) { + case XML_TOK_TRAILING_CR: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + *eventEndPP = end; + if (characterDataHandler) { + XML_Char c = 0xA; + characterDataHandler(handlerArg, &c, 1); + } + else if (defaultHandler) + reportDefault(parser, enc, s, end); + /* We are at the end of the final buffer, should we check for + XML_SUSPENDED, XML_FINISHED? + */ + if (startTagLevel == 0) + return XML_ERROR_NO_ELEMENTS; + if (tagLevel != startTagLevel) + return XML_ERROR_ASYNC_ENTITY; + *nextPtr = end; + return XML_ERROR_NONE; + case XML_TOK_NONE: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + if (startTagLevel > 0) { + if (tagLevel != startTagLevel) + return XML_ERROR_ASYNC_ENTITY; + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_NO_ELEMENTS; + case XML_TOK_INVALID: + *eventPP = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_ENTITY_REF: + { + const XML_Char *name; + ENTITY *entity; + XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (ch) { + if (characterDataHandler) + characterDataHandler(handlerArg, &ch, 1); + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + } + name = poolStoreString(&dtd->pool, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!name) + return XML_ERROR_NO_MEMORY; + entity = (ENTITY *)lookup(&dtd->generalEntities, name, 0); + poolDiscard(&dtd->pool); + /* First, determine if a check for an existing declaration is needed; + if yes, check that the entity exists, and that it is internal, + otherwise call the skipped entity or default handler. + */ + if (!dtd->hasParamEntityRefs || dtd->standalone) { + if (!entity) + return XML_ERROR_UNDEFINED_ENTITY; + else if (!entity->is_internal) + return XML_ERROR_ENTITY_DECLARED_IN_PE; + } + else if (!entity) { + if (skippedEntityHandler) + skippedEntityHandler(handlerArg, name, 0); + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + } + if (entity->open) + return XML_ERROR_RECURSIVE_ENTITY_REF; + if (entity->notation) + return XML_ERROR_BINARY_ENTITY_REF; + if (entity->textPtr) { + enum XML_Error result; + if (!defaultExpandInternalEntities) { + if (skippedEntityHandler) + skippedEntityHandler(handlerArg, entity->name, 0); + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + } + result = processInternalEntity(parser, entity, XML_FALSE); + if (result != XML_ERROR_NONE) + return result; + } + else if (externalEntityRefHandler) { + const XML_Char *context; + entity->open = XML_TRUE; + context = getContext(parser); + entity->open = XML_FALSE; + if (!context) + return XML_ERROR_NO_MEMORY; + if (!externalEntityRefHandler(externalEntityRefHandlerArg, + context, + entity->base, + entity->systemId, + entity->publicId)) + return XML_ERROR_EXTERNAL_ENTITY_HANDLING; + poolDiscard(&tempPool); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + } + case XML_TOK_START_TAG_NO_ATTS: + /* fall through */ + case XML_TOK_START_TAG_WITH_ATTS: + { + TAG *tag; + enum XML_Error result; + XML_Char *toPtr; + if (freeTagList) { + tag = freeTagList; + freeTagList = freeTagList->parent; + } + else { + tag = (TAG *)MALLOC(sizeof(TAG)); + if (!tag) + return XML_ERROR_NO_MEMORY; + tag->buf = (char *)MALLOC(INIT_TAG_BUF_SIZE); + if (!tag->buf) { + FREE(tag); + return XML_ERROR_NO_MEMORY; + } + tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE; + } + tag->bindings = NULL; + tag->parent = tagStack; + tagStack = tag; + tag->name.localPart = NULL; + tag->name.prefix = NULL; + tag->rawName = s + enc->minBytesPerChar; + tag->rawNameLength = XmlNameLength(enc, tag->rawName); + ++tagLevel; + { + const char *rawNameEnd = tag->rawName + tag->rawNameLength; + const char *fromPtr = tag->rawName; + toPtr = (XML_Char *)tag->buf; + for (;;) { + int bufSize; + int convLen; + XmlConvert(enc, + &fromPtr, rawNameEnd, + (ICHAR **)&toPtr, (ICHAR *)tag->bufEnd - 1); + convLen = toPtr - (XML_Char *)tag->buf; + if (fromPtr == rawNameEnd) { + tag->name.strLen = convLen; + break; + } + bufSize = (tag->bufEnd - tag->buf) << 1; + { + char *temp = (char *)REALLOC(tag->buf, bufSize); + if (temp == NULL) + return XML_ERROR_NO_MEMORY; + tag->buf = temp; + tag->bufEnd = temp + bufSize; + toPtr = (XML_Char *)temp + convLen; + } + } + } + tag->name.str = (XML_Char *)tag->buf; + *toPtr = XML_T('\0'); + result = storeAtts(parser, enc, s, &(tag->name), &(tag->bindings)); + if (result) + return result; + if (startElementHandler) + startElementHandler(handlerArg, tag->name.str, + (const XML_Char **)atts); + else if (defaultHandler) + reportDefault(parser, enc, s, next); + poolClear(&tempPool); + break; + } + case XML_TOK_EMPTY_ELEMENT_NO_ATTS: + /* fall through */ + case XML_TOK_EMPTY_ELEMENT_WITH_ATTS: + { + const char *rawName = s + enc->minBytesPerChar; + enum XML_Error result; + BINDING *bindings = NULL; + XML_Bool noElmHandlers = XML_TRUE; + TAG_NAME name; + name.str = poolStoreString(&tempPool, enc, rawName, + rawName + XmlNameLength(enc, rawName)); + if (!name.str) + return XML_ERROR_NO_MEMORY; + poolFinish(&tempPool); + result = storeAtts(parser, enc, s, &name, &bindings); + if (result) + return result; + poolFinish(&tempPool); + if (startElementHandler) { + startElementHandler(handlerArg, name.str, (const XML_Char **)atts); + noElmHandlers = XML_FALSE; + } + if (endElementHandler) { + if (startElementHandler) + *eventPP = *eventEndPP; + endElementHandler(handlerArg, name.str); + noElmHandlers = XML_FALSE; + } + if (noElmHandlers && defaultHandler) + reportDefault(parser, enc, s, next); + poolClear(&tempPool); + while (bindings) { + BINDING *b = bindings; + if (endNamespaceDeclHandler) + endNamespaceDeclHandler(handlerArg, b->prefix->name); + bindings = bindings->nextTagBinding; + b->nextTagBinding = freeBindingList; + freeBindingList = b; + b->prefix->binding = b->prevPrefixBinding; + } + } + if (tagLevel == 0) + return epilogProcessor(parser, next, end, nextPtr); + break; + case XML_TOK_END_TAG: + if (tagLevel == startTagLevel) + return XML_ERROR_ASYNC_ENTITY; + else { + int len; + const char *rawName; + TAG *tag = tagStack; + tagStack = tag->parent; + tag->parent = freeTagList; + freeTagList = tag; + rawName = s + enc->minBytesPerChar*2; + len = XmlNameLength(enc, rawName); + if (len != tag->rawNameLength + || memcmp(tag->rawName, rawName, len) != 0) { + *eventPP = rawName; + return XML_ERROR_TAG_MISMATCH; + } + --tagLevel; + if (endElementHandler) { + const XML_Char *localPart; + const XML_Char *prefix; + XML_Char *uri; + localPart = tag->name.localPart; + if (ns && localPart) { + /* localPart and prefix may have been overwritten in + tag->name.str, since this points to the binding->uri + buffer which gets re-used; so we have to add them again + */ + uri = (XML_Char *)tag->name.str + tag->name.uriLen; + /* don't need to check for space - already done in storeAtts() */ + while (*localPart) *uri++ = *localPart++; + prefix = (XML_Char *)tag->name.prefix; + if (ns_triplets && prefix) { + *uri++ = namespaceSeparator; + while (*prefix) *uri++ = *prefix++; + } + *uri = XML_T('\0'); + } + endElementHandler(handlerArg, tag->name.str); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + while (tag->bindings) { + BINDING *b = tag->bindings; + if (endNamespaceDeclHandler) + endNamespaceDeclHandler(handlerArg, b->prefix->name); + tag->bindings = tag->bindings->nextTagBinding; + b->nextTagBinding = freeBindingList; + freeBindingList = b; + b->prefix->binding = b->prevPrefixBinding; + } + if (tagLevel == 0) + return epilogProcessor(parser, next, end, nextPtr); + } + break; + case XML_TOK_CHAR_REF: + { + int n = XmlCharRefNumber(enc, s); + if (n < 0) + return XML_ERROR_BAD_CHAR_REF; + if (characterDataHandler) { + XML_Char buf[XML_ENCODE_MAX]; + characterDataHandler(handlerArg, buf, XmlEncode(n, (ICHAR *)buf)); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + } + break; + case XML_TOK_XML_DECL: + return XML_ERROR_MISPLACED_XML_PI; + case XML_TOK_DATA_NEWLINE: + if (characterDataHandler) { + XML_Char c = 0xA; + characterDataHandler(handlerArg, &c, 1); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + case XML_TOK_CDATA_SECT_OPEN: + { + enum XML_Error result; + if (startCdataSectionHandler) + startCdataSectionHandler(handlerArg); +#if 0 + /* Suppose you doing a transformation on a document that involves + changing only the character data. You set up a defaultHandler + and a characterDataHandler. The defaultHandler simply copies + characters through. The characterDataHandler does the + transformation and writes the characters out escaping them as + necessary. This case will fail to work if we leave out the + following two lines (because & and < inside CDATA sections will + be incorrectly escaped). + + However, now we have a start/endCdataSectionHandler, so it seems + easier to let the user deal with this. + */ + else if (characterDataHandler) + characterDataHandler(handlerArg, dataBuf, 0); +#endif + else if (defaultHandler) + reportDefault(parser, enc, s, next); + result = doCdataSection(parser, enc, &next, end, nextPtr, haveMore); + if (result != XML_ERROR_NONE) + return result; + else if (!next) { + processor = cdataSectionProcessor; + return result; + } + } + break; + case XML_TOK_TRAILING_RSQB: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + if (characterDataHandler) { + if (MUST_CONVERT(enc, s)) { + ICHAR *dataPtr = (ICHAR *)dataBuf; + XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); + characterDataHandler(handlerArg, dataBuf, + dataPtr - (ICHAR *)dataBuf); + } + else + characterDataHandler(handlerArg, + (XML_Char *)s, + (XML_Char *)end - (XML_Char *)s); + } + else if (defaultHandler) + reportDefault(parser, enc, s, end); + /* We are at the end of the final buffer, should we check for + XML_SUSPENDED, XML_FINISHED? + */ + if (startTagLevel == 0) { + *eventPP = end; + return XML_ERROR_NO_ELEMENTS; + } + if (tagLevel != startTagLevel) { + *eventPP = end; + return XML_ERROR_ASYNC_ENTITY; + } + *nextPtr = end; + return XML_ERROR_NONE; + case XML_TOK_DATA_CHARS: + if (characterDataHandler) { + if (MUST_CONVERT(enc, s)) { + for (;;) { + ICHAR *dataPtr = (ICHAR *)dataBuf; + XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); + *eventEndPP = s; + characterDataHandler(handlerArg, dataBuf, + dataPtr - (ICHAR *)dataBuf); + if (s == next) + break; + *eventPP = s; + } + } + else + characterDataHandler(handlerArg, + (XML_Char *)s, + (XML_Char *)next - (XML_Char *)s); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + case XML_TOK_PI: + if (!reportProcessingInstruction(parser, enc, s, next)) + return XML_ERROR_NO_MEMORY; + break; + case XML_TOK_COMMENT: + if (!reportComment(parser, enc, s, next)) + return XML_ERROR_NO_MEMORY; + break; + default: + if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + } + *eventPP = s = next; + switch (parsing) { + case XML_SUSPENDED: + *nextPtr = next; + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; + default: ; + } + } + /* not reached */ +} + +/* Precondition: all arguments must be non-NULL; + Purpose: + - normalize attributes + - check attributes for well-formedness + - generate namespace aware attribute names (URI, prefix) + - build list of attributes for startElementHandler + - default attributes + - process namespace declarations (check and report them) + - generate namespace aware element name (URI, prefix) +*/ +static enum XML_Error +storeAtts(XML_Parser parser, const ENCODING *enc, + const char *attStr, TAG_NAME *tagNamePtr, + BINDING **bindingsPtr) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + ELEMENT_TYPE *elementType; + int nDefaultAtts; + const XML_Char **appAtts; /* the attribute list for the application */ + int attIndex = 0; + int prefixLen; + int i; + int n; + XML_Char *uri; + int nPrefixes = 0; + BINDING *binding; + const XML_Char *localPart; + + /* lookup the element type name */ + elementType = (ELEMENT_TYPE *)lookup(&dtd->elementTypes, tagNamePtr->str,0); + if (!elementType) { + const XML_Char *name = poolCopyString(&dtd->pool, tagNamePtr->str); + if (!name) + return XML_ERROR_NO_MEMORY; + elementType = (ELEMENT_TYPE *)lookup(&dtd->elementTypes, name, + sizeof(ELEMENT_TYPE)); + if (!elementType) + return XML_ERROR_NO_MEMORY; + if (ns && !setElementTypePrefix(parser, elementType)) + return XML_ERROR_NO_MEMORY; + } + nDefaultAtts = elementType->nDefaultAtts; + + /* get the attributes from the tokenizer */ + n = XmlGetAttributes(enc, attStr, attsSize, atts); + if (n + nDefaultAtts > attsSize) { + int oldAttsSize = attsSize; + ATTRIBUTE *temp; + attsSize = n + nDefaultAtts + INIT_ATTS_SIZE; + temp = (ATTRIBUTE *)REALLOC((void *)atts, attsSize * sizeof(ATTRIBUTE)); + if (temp == NULL) + return XML_ERROR_NO_MEMORY; + atts = temp; + if (n > oldAttsSize) + XmlGetAttributes(enc, attStr, n, atts); + } + + appAtts = (const XML_Char **)atts; + for (i = 0; i < n; i++) { + /* add the name and value to the attribute list */ + ATTRIBUTE_ID *attId = getAttributeId(parser, enc, atts[i].name, + atts[i].name + + XmlNameLength(enc, atts[i].name)); + if (!attId) + return XML_ERROR_NO_MEMORY; + /* Detect duplicate attributes by their QNames. This does not work when + namespace processing is turned on and different prefixes for the same + namespace are used. For this case we have a check further down. + */ + if ((attId->name)[-1]) { + if (enc == encoding) + eventPtr = atts[i].name; + return XML_ERROR_DUPLICATE_ATTRIBUTE; + } + (attId->name)[-1] = 1; + appAtts[attIndex++] = attId->name; + if (!atts[i].normalized) { + enum XML_Error result; + XML_Bool isCdata = XML_TRUE; + + /* figure out whether declared as other than CDATA */ + if (attId->maybeTokenized) { + int j; + for (j = 0; j < nDefaultAtts; j++) { + if (attId == elementType->defaultAtts[j].id) { + isCdata = elementType->defaultAtts[j].isCdata; + break; + } + } + } + + /* normalize the attribute value */ + result = storeAttributeValue(parser, enc, isCdata, + atts[i].valuePtr, atts[i].valueEnd, + &tempPool); + if (result) + return result; + appAtts[attIndex] = poolStart(&tempPool); + poolFinish(&tempPool); + } + else { + /* the value did not need normalizing */ + appAtts[attIndex] = poolStoreString(&tempPool, enc, atts[i].valuePtr, + atts[i].valueEnd); + if (appAtts[attIndex] == 0) + return XML_ERROR_NO_MEMORY; + poolFinish(&tempPool); + } + /* handle prefixed attribute names */ + if (attId->prefix) { + if (attId->xmlns) { + /* deal with namespace declarations here */ + enum XML_Error result = addBinding(parser, attId->prefix, attId, + appAtts[attIndex], bindingsPtr); + if (result) + return result; + --attIndex; + } + else { + /* deal with other prefixed names later */ + attIndex++; + nPrefixes++; + (attId->name)[-1] = 2; + } + } + else + attIndex++; + } + + /* set-up for XML_GetSpecifiedAttributeCount and XML_GetIdAttributeIndex */ + nSpecifiedAtts = attIndex; + if (elementType->idAtt && (elementType->idAtt->name)[-1]) { + for (i = 0; i < attIndex; i += 2) + if (appAtts[i] == elementType->idAtt->name) { + idAttIndex = i; + break; + } + } + else + idAttIndex = -1; + + /* do attribute defaulting */ + for (i = 0; i < nDefaultAtts; i++) { + const DEFAULT_ATTRIBUTE *da = elementType->defaultAtts + i; + if (!(da->id->name)[-1] && da->value) { + if (da->id->prefix) { + if (da->id->xmlns) { + enum XML_Error result = addBinding(parser, da->id->prefix, da->id, + da->value, bindingsPtr); + if (result) + return result; + } + else { + (da->id->name)[-1] = 2; + nPrefixes++; + appAtts[attIndex++] = da->id->name; + appAtts[attIndex++] = da->value; + } + } + else { + (da->id->name)[-1] = 1; + appAtts[attIndex++] = da->id->name; + appAtts[attIndex++] = da->value; + } + } + } + appAtts[attIndex] = 0; + + /* expand prefixed attribute names, check for duplicates, + and clear flags that say whether attributes were specified */ + i = 0; + if (nPrefixes) { + int j; /* hash table index */ + unsigned long version = nsAttsVersion; + int nsAttsSize = (int)1 << nsAttsPower; + /* size of hash table must be at least 2 * (# of prefixed attributes) */ + if ((nPrefixes << 1) >> nsAttsPower) { /* true for nsAttsPower = 0 */ + NS_ATT *temp; + /* hash table size must also be a power of 2 and >= 8 */ + while (nPrefixes >> nsAttsPower++); + if (nsAttsPower < 3) + nsAttsPower = 3; + nsAttsSize = (int)1 << nsAttsPower; + temp = (NS_ATT *)REALLOC(nsAtts, nsAttsSize * sizeof(NS_ATT)); + if (!temp) + return XML_ERROR_NO_MEMORY; + nsAtts = temp; + version = 0; /* force re-initialization of nsAtts hash table */ + } + /* using a version flag saves us from initializing nsAtts every time */ + if (!version) { /* initialize version flags when version wraps around */ + version = INIT_ATTS_VERSION; + for (j = nsAttsSize; j != 0; ) + nsAtts[--j].version = version; + } + nsAttsVersion = --version; + + /* expand prefixed names and check for duplicates */ + for (; i < attIndex; i += 2) { + const XML_Char *s = appAtts[i]; + if (s[-1] == 2) { /* prefixed */ + ATTRIBUTE_ID *id; + const BINDING *b; + unsigned long uriHash = 0; + ((XML_Char *)s)[-1] = 0; /* clear flag */ + id = (ATTRIBUTE_ID *)lookup(&dtd->attributeIds, s, 0); + b = id->prefix->binding; + if (!b) + return XML_ERROR_UNBOUND_PREFIX; + + /* as we expand the name we also calculate its hash value */ + for (j = 0; j < b->uriLen; j++) { + const XML_Char c = b->uri[j]; + if (!poolAppendChar(&tempPool, c)) + return XML_ERROR_NO_MEMORY; + uriHash = CHAR_HASH(uriHash, c); + } + while (*s++ != XML_T(':')) + ; + do { /* copies null terminator */ + const XML_Char c = *s; + if (!poolAppendChar(&tempPool, *s)) + return XML_ERROR_NO_MEMORY; + uriHash = CHAR_HASH(uriHash, c); + } while (*s++); + + { /* Check hash table for duplicate of expanded name (uriName). + Derived from code in lookup(HASH_TABLE *table, ...). + */ + unsigned char step = 0; + unsigned long mask = nsAttsSize - 1; + j = uriHash & mask; /* index into hash table */ + while (nsAtts[j].version == version) { + /* for speed we compare stored hash values first */ + if (uriHash == nsAtts[j].hash) { + const XML_Char *s1 = poolStart(&tempPool); + const XML_Char *s2 = nsAtts[j].uriName; + /* s1 is null terminated, but not s2 */ + for (; *s1 == *s2 && *s1 != 0; s1++, s2++); + if (*s1 == 0) + return XML_ERROR_DUPLICATE_ATTRIBUTE; + } + if (!step) + step = PROBE_STEP(uriHash, mask, nsAttsPower); + j < step ? ( j += nsAttsSize - step) : (j -= step); + } + } + + if (ns_triplets) { /* append namespace separator and prefix */ + tempPool.ptr[-1] = namespaceSeparator; + s = b->prefix->name; + do { + if (!poolAppendChar(&tempPool, *s)) + return XML_ERROR_NO_MEMORY; + } while (*s++); + } + + /* store expanded name in attribute list */ + s = poolStart(&tempPool); + poolFinish(&tempPool); + appAtts[i] = s; + + /* fill empty slot with new version, uriName and hash value */ + nsAtts[j].version = version; + nsAtts[j].hash = uriHash; + nsAtts[j].uriName = s; + + if (!--nPrefixes) + break; + } + else /* not prefixed */ + ((XML_Char *)s)[-1] = 0; /* clear flag */ + } + } + /* clear flags for the remaining attributes */ + for (; i < attIndex; i += 2) + ((XML_Char *)(appAtts[i]))[-1] = 0; + for (binding = *bindingsPtr; binding; binding = binding->nextTagBinding) + binding->attId->name[-1] = 0; + + if (!ns) + return XML_ERROR_NONE; + + /* expand the element type name */ + if (elementType->prefix) { + binding = elementType->prefix->binding; + if (!binding) + return XML_ERROR_UNBOUND_PREFIX; + localPart = tagNamePtr->str; + while (*localPart++ != XML_T(':')) + ; + } + else if (dtd->defaultPrefix.binding) { + binding = dtd->defaultPrefix.binding; + localPart = tagNamePtr->str; + } + else + return XML_ERROR_NONE; + prefixLen = 0; + if (ns_triplets && binding->prefix->name) { + for (; binding->prefix->name[prefixLen++];) + ; + } + tagNamePtr->localPart = localPart; + tagNamePtr->uriLen = binding->uriLen; + tagNamePtr->prefix = binding->prefix->name; + tagNamePtr->prefixLen = prefixLen; + for (i = 0; localPart[i++];) + ; + n = i + binding->uriLen + prefixLen; + if (n > binding->uriAlloc) { + TAG *p; + uri = (XML_Char *)MALLOC((n + EXPAND_SPARE) * sizeof(XML_Char)); + if (!uri) + return XML_ERROR_NO_MEMORY; + binding->uriAlloc = n + EXPAND_SPARE; + memcpy(uri, binding->uri, binding->uriLen * sizeof(XML_Char)); + for (p = tagStack; p; p = p->parent) + if (p->name.str == binding->uri) + p->name.str = uri; + FREE(binding->uri); + binding->uri = uri; + } + uri = binding->uri + binding->uriLen; + memcpy(uri, localPart, i * sizeof(XML_Char)); + if (prefixLen) { + uri = uri + (i - 1); + if (namespaceSeparator) + *uri = namespaceSeparator; + memcpy(uri + 1, binding->prefix->name, prefixLen * sizeof(XML_Char)); + } + tagNamePtr->str = binding->uri; + return XML_ERROR_NONE; +} + +/* addBinding() overwrites the value of prefix->binding without checking. + Therefore one must keep track of the old value outside of addBinding(). +*/ +static enum XML_Error +addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, + const XML_Char *uri, BINDING **bindingsPtr) +{ + BINDING *b; + int len; + + /* empty string is only valid when there is no prefix per XML NS 1.0 */ + if (*uri == XML_T('\0') && prefix->name) + return XML_ERROR_SYNTAX; + + for (len = 0; uri[len]; len++) + ; + if (namespaceSeparator) + len++; + if (freeBindingList) { + b = freeBindingList; + if (len > b->uriAlloc) { + XML_Char *temp = (XML_Char *)REALLOC(b->uri, + sizeof(XML_Char) * (len + EXPAND_SPARE)); + if (temp == NULL) + return XML_ERROR_NO_MEMORY; + b->uri = temp; + b->uriAlloc = len + EXPAND_SPARE; + } + freeBindingList = b->nextTagBinding; + } + else { + b = (BINDING *)MALLOC(sizeof(BINDING)); + if (!b) + return XML_ERROR_NO_MEMORY; + b->uri = (XML_Char *)MALLOC(sizeof(XML_Char) * (len + EXPAND_SPARE)); + if (!b->uri) { + FREE(b); + return XML_ERROR_NO_MEMORY; + } + b->uriAlloc = len + EXPAND_SPARE; + } + b->uriLen = len; + memcpy(b->uri, uri, len * sizeof(XML_Char)); + if (namespaceSeparator) + b->uri[len - 1] = namespaceSeparator; + b->prefix = prefix; + b->attId = attId; + b->prevPrefixBinding = prefix->binding; + /* NULL binding when default namespace undeclared */ + if (*uri == XML_T('\0') && prefix == &_dtd->defaultPrefix) + prefix->binding = NULL; + else + prefix->binding = b; + b->nextTagBinding = *bindingsPtr; + *bindingsPtr = b; + if (startNamespaceDeclHandler) + startNamespaceDeclHandler(handlerArg, prefix->name, + prefix->binding ? uri : 0); + return XML_ERROR_NONE; +} + +/* The idea here is to avoid using stack for each CDATA section when + the whole file is parsed with one call. +*/ +static enum XML_Error PTRCALL +cdataSectionProcessor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + enum XML_Error result = doCdataSection(parser, encoding, &start, end, + endPtr, (XML_Bool)!finalBuffer); + if (result != XML_ERROR_NONE) + return result; + if (start) { + if (parentParser) { /* we are parsing an external entity */ + processor = externalEntityContentProcessor; + return externalEntityContentProcessor(parser, start, end, endPtr); + } + else { + processor = contentProcessor; + return contentProcessor(parser, start, end, endPtr); + } + } + return result; +} + +/* startPtr gets set to non-null if the section is closed, and to null if + the section is not yet closed. +*/ +static enum XML_Error +doCdataSection(XML_Parser parser, + const ENCODING *enc, + const char **startPtr, + const char *end, + const char **nextPtr, + XML_Bool haveMore) +{ + const char *s = *startPtr; + const char **eventPP; + const char **eventEndPP; + if (enc == encoding) { + eventPP = &eventPtr; + *eventPP = s; + eventEndPP = &eventEndPtr; + } + else { + eventPP = &(openInternalEntities->internalEventPtr); + eventEndPP = &(openInternalEntities->internalEventEndPtr); + } + *eventPP = s; + *startPtr = NULL; + + for (;;) { + const char *next; + int tok = XmlCdataSectionTok(enc, s, end, &next); + *eventEndPP = next; + switch (tok) { + case XML_TOK_CDATA_SECT_CLOSE: + if (endCdataSectionHandler) + endCdataSectionHandler(handlerArg); +#if 0 + /* see comment under XML_TOK_CDATA_SECT_OPEN */ + else if (characterDataHandler) + characterDataHandler(handlerArg, dataBuf, 0); +#endif + else if (defaultHandler) + reportDefault(parser, enc, s, next); + *startPtr = next; + *nextPtr = next; + if (parsing == XML_FINISHED) + return XML_ERROR_ABORTED; + else + return XML_ERROR_NONE; + case XML_TOK_DATA_NEWLINE: + if (characterDataHandler) { + XML_Char c = 0xA; + characterDataHandler(handlerArg, &c, 1); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + case XML_TOK_DATA_CHARS: + if (characterDataHandler) { + if (MUST_CONVERT(enc, s)) { + for (;;) { + ICHAR *dataPtr = (ICHAR *)dataBuf; + XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); + *eventEndPP = next; + characterDataHandler(handlerArg, dataBuf, + dataPtr - (ICHAR *)dataBuf); + if (s == next) + break; + *eventPP = s; + } + } + else + characterDataHandler(handlerArg, + (XML_Char *)s, + (XML_Char *)next - (XML_Char *)s); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + case XML_TOK_INVALID: + *eventPP = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_PARTIAL: + case XML_TOK_NONE: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_UNCLOSED_CDATA_SECTION; + default: + *eventPP = next; + return XML_ERROR_UNEXPECTED_STATE; + } + + *eventPP = s = next; + switch (parsing) { + case XML_SUSPENDED: + *nextPtr = next; + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; + default: ; + } + } + /* not reached */ +} + +#ifdef XML_DTD + +/* The idea here is to avoid using stack for each IGNORE section when + the whole file is parsed with one call. +*/ +static enum XML_Error PTRCALL +ignoreSectionProcessor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + enum XML_Error result = doIgnoreSection(parser, encoding, &start, end, + endPtr, (XML_Bool)!finalBuffer); + if (result != XML_ERROR_NONE) + return result; + if (start) { + processor = prologProcessor; + return prologProcessor(parser, start, end, endPtr); + } + return result; +} + +/* startPtr gets set to non-null is the section is closed, and to null + if the section is not yet closed. +*/ +static enum XML_Error +doIgnoreSection(XML_Parser parser, + const ENCODING *enc, + const char **startPtr, + const char *end, + const char **nextPtr, + XML_Bool haveMore) +{ + const char *next; + int tok; + const char *s = *startPtr; + const char **eventPP; + const char **eventEndPP; + if (enc == encoding) { + eventPP = &eventPtr; + *eventPP = s; + eventEndPP = &eventEndPtr; + } + else { + eventPP = &(openInternalEntities->internalEventPtr); + eventEndPP = &(openInternalEntities->internalEventEndPtr); + } + *eventPP = s; + *startPtr = NULL; + tok = XmlIgnoreSectionTok(enc, s, end, &next); + *eventEndPP = next; + switch (tok) { + case XML_TOK_IGNORE_SECT: + if (defaultHandler) + reportDefault(parser, enc, s, next); + *startPtr = next; + *nextPtr = next; + if (parsing == XML_FINISHED) + return XML_ERROR_ABORTED; + else + return XML_ERROR_NONE; + case XML_TOK_INVALID: + *eventPP = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_PARTIAL: + case XML_TOK_NONE: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_SYNTAX; /* XML_ERROR_UNCLOSED_IGNORE_SECTION */ + default: + *eventPP = next; + return XML_ERROR_UNEXPECTED_STATE; + } + /* not reached */ +} + +#endif /* XML_DTD */ + +static enum XML_Error +initializeEncoding(XML_Parser parser) +{ + const char *s; +#ifdef XML_UNICODE + char encodingBuf[128]; + if (!protocolEncodingName) + s = NULL; + else { + int i; + for (i = 0; protocolEncodingName[i]; i++) { + if (i == sizeof(encodingBuf) - 1 + || (protocolEncodingName[i] & ~0x7f) != 0) { + encodingBuf[0] = '\0'; + break; + } + encodingBuf[i] = (char)protocolEncodingName[i]; + } + encodingBuf[i] = '\0'; + s = encodingBuf; + } +#else + s = protocolEncodingName; +#endif + if ((ns ? XmlInitEncodingNS : XmlInitEncoding)(&initEncoding, &encoding, s)) + return XML_ERROR_NONE; + return handleUnknownEncoding(parser, protocolEncodingName); +} + +static enum XML_Error +processXmlDecl(XML_Parser parser, int isGeneralTextEntity, + const char *s, const char *next) +{ + const char *encodingName = NULL; + const XML_Char *storedEncName = NULL; + const ENCODING *newEncoding = NULL; + const char *version = NULL; + const char *versionend; + const XML_Char *storedversion = NULL; + int standalone = -1; + if (!(ns + ? XmlParseXmlDeclNS + : XmlParseXmlDecl)(isGeneralTextEntity, + encoding, + s, + next, + &eventPtr, + &version, + &versionend, + &encodingName, + &newEncoding, + &standalone)) + return XML_ERROR_SYNTAX; + if (!isGeneralTextEntity && standalone == 1) { + _dtd->standalone = XML_TRUE; +#ifdef XML_DTD + if (paramEntityParsing == XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE) + paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; +#endif /* XML_DTD */ + } + if (xmlDeclHandler) { + if (encodingName != NULL) { + storedEncName = poolStoreString(&temp2Pool, + encoding, + encodingName, + encodingName + + XmlNameLength(encoding, encodingName)); + if (!storedEncName) + return XML_ERROR_NO_MEMORY; + poolFinish(&temp2Pool); + } + if (version) { + storedversion = poolStoreString(&temp2Pool, + encoding, + version, + versionend - encoding->minBytesPerChar); + if (!storedversion) + return XML_ERROR_NO_MEMORY; + } + xmlDeclHandler(handlerArg, storedversion, storedEncName, standalone); + } + else if (defaultHandler) + reportDefault(parser, encoding, s, next); + if (protocolEncodingName == NULL) { + if (newEncoding) { + if (newEncoding->minBytesPerChar != encoding->minBytesPerChar) { + eventPtr = encodingName; + return XML_ERROR_INCORRECT_ENCODING; + } + encoding = newEncoding; + } + else if (encodingName) { + enum XML_Error result; + if (!storedEncName) { + storedEncName = poolStoreString( + &temp2Pool, encoding, encodingName, + encodingName + XmlNameLength(encoding, encodingName)); + if (!storedEncName) + return XML_ERROR_NO_MEMORY; + } + result = handleUnknownEncoding(parser, storedEncName); + poolClear(&temp2Pool); + if (result == XML_ERROR_UNKNOWN_ENCODING) + eventPtr = encodingName; + return result; + } + } + + if (storedEncName || storedversion) + poolClear(&temp2Pool); + + return XML_ERROR_NONE; +} + +static enum XML_Error +handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName) +{ + if (unknownEncodingHandler) { + XML_Encoding info; + int i; + for (i = 0; i < 256; i++) + info.map[i] = -1; + info.convert = NULL; + info.data = NULL; + info.release = NULL; + if (unknownEncodingHandler(unknownEncodingHandlerData, encodingName, + &info)) { + ENCODING *enc; + unknownEncodingMem = MALLOC(XmlSizeOfUnknownEncoding()); + if (!unknownEncodingMem) { + if (info.release) + info.release(info.data); + return XML_ERROR_NO_MEMORY; + } + enc = (ns + ? XmlInitUnknownEncodingNS + : XmlInitUnknownEncoding)(unknownEncodingMem, + info.map, + info.convert, + info.data); + if (enc) { + unknownEncodingData = info.data; + unknownEncodingRelease = info.release; + encoding = enc; + return XML_ERROR_NONE; + } + } + if (info.release != NULL) + info.release(info.data); + } + return XML_ERROR_UNKNOWN_ENCODING; +} + +static enum XML_Error PTRCALL +prologInitProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + enum XML_Error result = initializeEncoding(parser); + if (result != XML_ERROR_NONE) + return result; + processor = prologProcessor; + return prologProcessor(parser, s, end, nextPtr); +} + +#ifdef XML_DTD + +static enum XML_Error PTRCALL +externalParEntInitProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + enum XML_Error result = initializeEncoding(parser); + if (result != XML_ERROR_NONE) + return result; + + /* we know now that XML_Parse(Buffer) has been called, + so we consider the external parameter entity read */ + _dtd->paramEntityRead = XML_TRUE; + + if (prologState.inEntityValue) { + processor = entityValueInitProcessor; + return entityValueInitProcessor(parser, s, end, nextPtr); + } + else { + processor = externalParEntProcessor; + return externalParEntProcessor(parser, s, end, nextPtr); + } +} + +static enum XML_Error PTRCALL +entityValueInitProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + int tok; + const char *start = s; + const char *next = start; + eventPtr = start; + + for (;;) { + tok = XmlPrologTok(encoding, start, end, &next); + eventEndPtr = next; + if (tok <= 0) { + if (!finalBuffer && tok != XML_TOK_INVALID) { + *nextPtr = s; + return XML_ERROR_NONE; + } + switch (tok) { + case XML_TOK_INVALID: + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_NONE: /* start == end */ + default: + break; + } + /* found end of entity value - can store it now */ + return storeEntityValue(parser, encoding, s, end); + } + else if (tok == XML_TOK_XML_DECL) { + enum XML_Error result; + result = processXmlDecl(parser, 0, start, next); + if (result != XML_ERROR_NONE) + return result; + switch (parsing) { + case XML_SUSPENDED: + *nextPtr = next; + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; + default: + *nextPtr = next; + } + /* stop scanning for text declaration - we found one */ + processor = entityValueProcessor; + return entityValueProcessor(parser, next, end, nextPtr); + } + /* If we are at the end of the buffer, this would cause XmlPrologTok to + return XML_TOK_NONE on the next call, which would then cause the + function to exit with *nextPtr set to s - that is what we want for other + tokens, but not for the BOM - we would rather like to skip it; + then, when this routine is entered the next time, XmlPrologTok will + return XML_TOK_INVALID, since the BOM is still in the buffer + */ + else if (tok == XML_TOK_BOM && next == end && !finalBuffer) { + *nextPtr = next; + return XML_ERROR_NONE; + } + start = next; + eventPtr = start; + } +} + +static enum XML_Error PTRCALL +externalParEntProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + const char *next = s; + int tok; + + tok = XmlPrologTok(encoding, s, end, &next); + if (tok <= 0) { + if (!finalBuffer && tok != XML_TOK_INVALID) { + *nextPtr = s; + return XML_ERROR_NONE; + } + switch (tok) { + case XML_TOK_INVALID: + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_NONE: /* start == end */ + default: + break; + } + } + /* This would cause the next stage, i.e. doProlog to be passed XML_TOK_BOM. + However, when parsing an external subset, doProlog will not accept a BOM + as valid, and report a syntax error, so we have to skip the BOM + */ + else if (tok == XML_TOK_BOM) { + s = next; + tok = XmlPrologTok(encoding, s, end, &next); + } + + processor = prologProcessor; + return doProlog(parser, encoding, s, end, tok, next, + nextPtr, (XML_Bool)!finalBuffer); +} + +static enum XML_Error PTRCALL +entityValueProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + const char *start = s; + const char *next = s; + const ENCODING *enc = encoding; + int tok; + + for (;;) { + tok = XmlPrologTok(enc, start, end, &next); + if (tok <= 0) { + if (!finalBuffer && tok != XML_TOK_INVALID) { + *nextPtr = s; + return XML_ERROR_NONE; + } + switch (tok) { + case XML_TOK_INVALID: + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_NONE: /* start == end */ + default: + break; + } + /* found end of entity value - can store it now */ + return storeEntityValue(parser, enc, s, end); + } + start = next; + } +} + +#endif /* XML_DTD */ + +static enum XML_Error PTRCALL +prologProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + const char *next = s; + int tok = XmlPrologTok(encoding, s, end, &next); + return doProlog(parser, encoding, s, end, tok, next, + nextPtr, (XML_Bool)!finalBuffer); +} + +static enum XML_Error +doProlog(XML_Parser parser, + const ENCODING *enc, + const char *s, + const char *end, + int tok, + const char *next, + const char **nextPtr, + XML_Bool haveMore) +{ +#ifdef XML_DTD + static const XML_Char externalSubsetName[] = { '#' , '\0' }; +#endif /* XML_DTD */ + static const XML_Char atypeCDATA[] = { 'C', 'D', 'A', 'T', 'A', '\0' }; + static const XML_Char atypeID[] = { 'I', 'D', '\0' }; + static const XML_Char atypeIDREF[] = { 'I', 'D', 'R', 'E', 'F', '\0' }; + static const XML_Char atypeIDREFS[] = { 'I', 'D', 'R', 'E', 'F', 'S', '\0' }; + static const XML_Char atypeENTITY[] = { 'E', 'N', 'T', 'I', 'T', 'Y', '\0' }; + static const XML_Char atypeENTITIES[] = + { 'E', 'N', 'T', 'I', 'T', 'I', 'E', 'S', '\0' }; + static const XML_Char atypeNMTOKEN[] = { + 'N', 'M', 'T', 'O', 'K', 'E', 'N', '\0' }; + static const XML_Char atypeNMTOKENS[] = { + 'N', 'M', 'T', 'O', 'K', 'E', 'N', 'S', '\0' }; + static const XML_Char notationPrefix[] = { + 'N', 'O', 'T', 'A', 'T', 'I', 'O', 'N', '(', '\0' }; + static const XML_Char enumValueSep[] = { '|', '\0' }; + static const XML_Char enumValueStart[] = { '(', '\0' }; + + /* save one level of indirection */ + DTD * const dtd = _dtd; + + const char **eventPP; + const char **eventEndPP; + enum XML_Content_Quant quant; + + if (enc == encoding) { + eventPP = &eventPtr; + eventEndPP = &eventEndPtr; + } + else { + eventPP = &(openInternalEntities->internalEventPtr); + eventEndPP = &(openInternalEntities->internalEventEndPtr); + } + + for (;;) { + int role; + XML_Bool handleDefault = XML_TRUE; + *eventPP = s; + *eventEndPP = next; + if (tok <= 0) { + if (haveMore && tok != XML_TOK_INVALID) { + *nextPtr = s; + return XML_ERROR_NONE; + } + switch (tok) { + case XML_TOK_INVALID: + *eventPP = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_NONE: +#ifdef XML_DTD + /* for internal PE NOT referenced between declarations */ + if (enc != encoding && !openInternalEntities->betweenDecl) { + *nextPtr = s; + return XML_ERROR_NONE; + } + /* WFC: PE Between Declarations - must check that PE contains + complete markup, not only for external PEs, but also for + internal PEs if the reference occurs between declarations. + */ + if (isParamEntity || enc != encoding) { + if (XmlTokenRole(&prologState, XML_TOK_NONE, end, end, enc) + == XML_ROLE_ERROR) + return XML_ERROR_SYNTAX; + *nextPtr = s; + return XML_ERROR_NONE; + } +#endif /* XML_DTD */ + return XML_ERROR_NO_ELEMENTS; + default: + tok = -tok; + next = end; + break; + } + } + role = XmlTokenRole(&prologState, tok, s, next, enc); + switch (role) { + case XML_ROLE_XML_DECL: + { + enum XML_Error result = processXmlDecl(parser, 0, s, next); + if (result != XML_ERROR_NONE) + return result; + enc = encoding; + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_DOCTYPE_NAME: + if (startDoctypeDeclHandler) { + doctypeName = poolStoreString(&tempPool, enc, s, next); + if (!doctypeName) + return XML_ERROR_NO_MEMORY; + poolFinish(&tempPool); + doctypePubid = NULL; + handleDefault = XML_FALSE; + } + doctypeSysid = NULL; /* always initialize to NULL */ + break; + case XML_ROLE_DOCTYPE_INTERNAL_SUBSET: + if (startDoctypeDeclHandler) { + startDoctypeDeclHandler(handlerArg, doctypeName, doctypeSysid, + doctypePubid, 1); + doctypeName = NULL; + poolClear(&tempPool); + handleDefault = XML_FALSE; + } + break; +#ifdef XML_DTD + case XML_ROLE_TEXT_DECL: + { + enum XML_Error result = processXmlDecl(parser, 1, s, next); + if (result != XML_ERROR_NONE) + return result; + enc = encoding; + handleDefault = XML_FALSE; + } + break; +#endif /* XML_DTD */ + case XML_ROLE_DOCTYPE_PUBLIC_ID: +#ifdef XML_DTD + useForeignDTD = XML_FALSE; +#endif /* XML_DTD */ + dtd->hasParamEntityRefs = XML_TRUE; + if (startDoctypeDeclHandler) { + doctypePubid = poolStoreString(&tempPool, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!doctypePubid) + return XML_ERROR_NO_MEMORY; + poolFinish(&tempPool); + handleDefault = XML_FALSE; + } +#ifdef XML_DTD + declEntity = (ENTITY *)lookup(&dtd->paramEntities, + externalSubsetName, + sizeof(ENTITY)); + if (!declEntity) + return XML_ERROR_NO_MEMORY; +#endif /* XML_DTD */ + /* fall through */ + case XML_ROLE_ENTITY_PUBLIC_ID: + if (!XmlIsPublicId(enc, s, next, eventPP)) + return XML_ERROR_SYNTAX; + if (dtd->keepProcessing && declEntity) { + XML_Char *tem = poolStoreString(&dtd->pool, + enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!tem) + return XML_ERROR_NO_MEMORY; + normalizePublicId(tem); + declEntity->publicId = tem; + poolFinish(&dtd->pool); + if (entityDeclHandler) + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_DOCTYPE_CLOSE: + if (doctypeName) { + startDoctypeDeclHandler(handlerArg, doctypeName, + doctypeSysid, doctypePubid, 0); + poolClear(&tempPool); + handleDefault = XML_FALSE; + } + /* doctypeSysid will be non-NULL in the case of a previous + XML_ROLE_DOCTYPE_SYSTEM_ID, even if startDoctypeDeclHandler + was not set, indicating an external subset + */ +#ifdef XML_DTD + if (doctypeSysid || useForeignDTD) { + dtd->hasParamEntityRefs = XML_TRUE; /* when docTypeSysid == NULL */ + if (paramEntityParsing && externalEntityRefHandler) { + ENTITY *entity = (ENTITY *)lookup(&dtd->paramEntities, + externalSubsetName, + sizeof(ENTITY)); + if (!entity) + return XML_ERROR_NO_MEMORY; + if (useForeignDTD) + entity->base = curBase; + dtd->paramEntityRead = XML_FALSE; + if (!externalEntityRefHandler(externalEntityRefHandlerArg, + 0, + entity->base, + entity->systemId, + entity->publicId)) + return XML_ERROR_EXTERNAL_ENTITY_HANDLING; + if (dtd->paramEntityRead && + !dtd->standalone && + notStandaloneHandler && + !notStandaloneHandler(handlerArg)) + return XML_ERROR_NOT_STANDALONE; + /* end of DTD - no need to update dtd->keepProcessing */ + } + useForeignDTD = XML_FALSE; + } +#endif /* XML_DTD */ + if (endDoctypeDeclHandler) { + endDoctypeDeclHandler(handlerArg); + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_INSTANCE_START: +#ifdef XML_DTD + /* if there is no DOCTYPE declaration then now is the + last chance to read the foreign DTD + */ + if (useForeignDTD) { + dtd->hasParamEntityRefs = XML_TRUE; + if (paramEntityParsing && externalEntityRefHandler) { + ENTITY *entity = (ENTITY *)lookup(&dtd->paramEntities, + externalSubsetName, + sizeof(ENTITY)); + if (!entity) + return XML_ERROR_NO_MEMORY; + entity->base = curBase; + dtd->paramEntityRead = XML_FALSE; + if (!externalEntityRefHandler(externalEntityRefHandlerArg, + 0, + entity->base, + entity->systemId, + entity->publicId)) + return XML_ERROR_EXTERNAL_ENTITY_HANDLING; + if (dtd->paramEntityRead && + !dtd->standalone && + notStandaloneHandler && + !notStandaloneHandler(handlerArg)) + return XML_ERROR_NOT_STANDALONE; + /* end of DTD - no need to update dtd->keepProcessing */ + } + } +#endif /* XML_DTD */ + processor = contentProcessor; + return contentProcessor(parser, s, end, nextPtr); + case XML_ROLE_ATTLIST_ELEMENT_NAME: + declElementType = getElementType(parser, enc, s, next); + if (!declElementType) + return XML_ERROR_NO_MEMORY; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_NAME: + declAttributeId = getAttributeId(parser, enc, s, next); + if (!declAttributeId) + return XML_ERROR_NO_MEMORY; + declAttributeIsCdata = XML_FALSE; + declAttributeType = NULL; + declAttributeIsId = XML_FALSE; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_CDATA: + declAttributeIsCdata = XML_TRUE; + declAttributeType = atypeCDATA; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_ID: + declAttributeIsId = XML_TRUE; + declAttributeType = atypeID; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_IDREF: + declAttributeType = atypeIDREF; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_IDREFS: + declAttributeType = atypeIDREFS; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_ENTITY: + declAttributeType = atypeENTITY; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_ENTITIES: + declAttributeType = atypeENTITIES; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN: + declAttributeType = atypeNMTOKEN; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS: + declAttributeType = atypeNMTOKENS; + checkAttListDeclHandler: + if (dtd->keepProcessing && attlistDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_ATTRIBUTE_ENUM_VALUE: + case XML_ROLE_ATTRIBUTE_NOTATION_VALUE: + if (dtd->keepProcessing && attlistDeclHandler) { + const XML_Char *prefix; + if (declAttributeType) { + prefix = enumValueSep; + } + else { + prefix = (role == XML_ROLE_ATTRIBUTE_NOTATION_VALUE + ? notationPrefix + : enumValueStart); + } + if (!poolAppendString(&tempPool, prefix)) + return XML_ERROR_NO_MEMORY; + if (!poolAppend(&tempPool, enc, s, next)) + return XML_ERROR_NO_MEMORY; + declAttributeType = tempPool.start; + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_IMPLIED_ATTRIBUTE_VALUE: + case XML_ROLE_REQUIRED_ATTRIBUTE_VALUE: + if (dtd->keepProcessing) { + if (!defineAttribute(declElementType, declAttributeId, + declAttributeIsCdata, declAttributeIsId, + 0, parser)) + return XML_ERROR_NO_MEMORY; + if (attlistDeclHandler && declAttributeType) { + if (*declAttributeType == XML_T('(') + || (*declAttributeType == XML_T('N') + && declAttributeType[1] == XML_T('O'))) { + /* Enumerated or Notation type */ + if (!poolAppendChar(&tempPool, XML_T(')')) + || !poolAppendChar(&tempPool, XML_T('\0'))) + return XML_ERROR_NO_MEMORY; + declAttributeType = tempPool.start; + poolFinish(&tempPool); + } + *eventEndPP = s; + attlistDeclHandler(handlerArg, declElementType->name, + declAttributeId->name, declAttributeType, + 0, role == XML_ROLE_REQUIRED_ATTRIBUTE_VALUE); + poolClear(&tempPool); + handleDefault = XML_FALSE; + } + } + break; + case XML_ROLE_DEFAULT_ATTRIBUTE_VALUE: + case XML_ROLE_FIXED_ATTRIBUTE_VALUE: + if (dtd->keepProcessing) { + const XML_Char *attVal; + enum XML_Error result = + storeAttributeValue(parser, enc, declAttributeIsCdata, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar, + &dtd->pool); + if (result) + return result; + attVal = poolStart(&dtd->pool); + poolFinish(&dtd->pool); + /* ID attributes aren't allowed to have a default */ + if (!defineAttribute(declElementType, declAttributeId, + declAttributeIsCdata, XML_FALSE, attVal, parser)) + return XML_ERROR_NO_MEMORY; + if (attlistDeclHandler && declAttributeType) { + if (*declAttributeType == XML_T('(') + || (*declAttributeType == XML_T('N') + && declAttributeType[1] == XML_T('O'))) { + /* Enumerated or Notation type */ + if (!poolAppendChar(&tempPool, XML_T(')')) + || !poolAppendChar(&tempPool, XML_T('\0'))) + return XML_ERROR_NO_MEMORY; + declAttributeType = tempPool.start; + poolFinish(&tempPool); + } + *eventEndPP = s; + attlistDeclHandler(handlerArg, declElementType->name, + declAttributeId->name, declAttributeType, + attVal, + role == XML_ROLE_FIXED_ATTRIBUTE_VALUE); + poolClear(&tempPool); + handleDefault = XML_FALSE; + } + } + break; + case XML_ROLE_ENTITY_VALUE: + if (dtd->keepProcessing) { + enum XML_Error result = storeEntityValue(parser, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (declEntity) { + declEntity->textPtr = poolStart(&dtd->entityValuePool); + declEntity->textLen = poolLength(&dtd->entityValuePool); + poolFinish(&dtd->entityValuePool); + if (entityDeclHandler) { + *eventEndPP = s; + entityDeclHandler(handlerArg, + declEntity->name, + declEntity->is_param, + declEntity->textPtr, + declEntity->textLen, + curBase, 0, 0, 0); + handleDefault = XML_FALSE; + } + } + else + poolDiscard(&dtd->entityValuePool); + if (result != XML_ERROR_NONE) + return result; + } + break; + case XML_ROLE_DOCTYPE_SYSTEM_ID: +#ifdef XML_DTD + useForeignDTD = XML_FALSE; +#endif /* XML_DTD */ + dtd->hasParamEntityRefs = XML_TRUE; + if (startDoctypeDeclHandler) { + doctypeSysid = poolStoreString(&tempPool, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (doctypeSysid == NULL) + return XML_ERROR_NO_MEMORY; + poolFinish(&tempPool); + handleDefault = XML_FALSE; + } +#ifdef XML_DTD + else + /* use externalSubsetName to make doctypeSysid non-NULL + for the case where no startDoctypeDeclHandler is set */ + doctypeSysid = externalSubsetName; +#endif /* XML_DTD */ + if (!dtd->standalone +#ifdef XML_DTD + && !paramEntityParsing +#endif /* XML_DTD */ + && notStandaloneHandler + && !notStandaloneHandler(handlerArg)) + return XML_ERROR_NOT_STANDALONE; +#ifndef XML_DTD + break; +#else /* XML_DTD */ + if (!declEntity) { + declEntity = (ENTITY *)lookup(&dtd->paramEntities, + externalSubsetName, + sizeof(ENTITY)); + if (!declEntity) + return XML_ERROR_NO_MEMORY; + declEntity->publicId = NULL; + } + /* fall through */ +#endif /* XML_DTD */ + case XML_ROLE_ENTITY_SYSTEM_ID: + if (dtd->keepProcessing && declEntity) { + declEntity->systemId = poolStoreString(&dtd->pool, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!declEntity->systemId) + return XML_ERROR_NO_MEMORY; + declEntity->base = curBase; + poolFinish(&dtd->pool); + if (entityDeclHandler) + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_ENTITY_COMPLETE: + if (dtd->keepProcessing && declEntity && entityDeclHandler) { + *eventEndPP = s; + entityDeclHandler(handlerArg, + declEntity->name, + declEntity->is_param, + 0,0, + declEntity->base, + declEntity->systemId, + declEntity->publicId, + 0); + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_ENTITY_NOTATION_NAME: + if (dtd->keepProcessing && declEntity) { + declEntity->notation = poolStoreString(&dtd->pool, enc, s, next); + if (!declEntity->notation) + return XML_ERROR_NO_MEMORY; + poolFinish(&dtd->pool); + if (unparsedEntityDeclHandler) { + *eventEndPP = s; + unparsedEntityDeclHandler(handlerArg, + declEntity->name, + declEntity->base, + declEntity->systemId, + declEntity->publicId, + declEntity->notation); + handleDefault = XML_FALSE; + } + else if (entityDeclHandler) { + *eventEndPP = s; + entityDeclHandler(handlerArg, + declEntity->name, + 0,0,0, + declEntity->base, + declEntity->systemId, + declEntity->publicId, + declEntity->notation); + handleDefault = XML_FALSE; + } + } + break; + case XML_ROLE_GENERAL_ENTITY_NAME: + { + if (XmlPredefinedEntityName(enc, s, next)) { + declEntity = NULL; + break; + } + if (dtd->keepProcessing) { + const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); + if (!name) + return XML_ERROR_NO_MEMORY; + declEntity = (ENTITY *)lookup(&dtd->generalEntities, name, + sizeof(ENTITY)); + if (!declEntity) + return XML_ERROR_NO_MEMORY; + if (declEntity->name != name) { + poolDiscard(&dtd->pool); + declEntity = NULL; + } + else { + poolFinish(&dtd->pool); + declEntity->publicId = NULL; + declEntity->is_param = XML_FALSE; + /* if we have a parent parser or are reading an internal parameter + entity, then the entity declaration is not considered "internal" + */ + declEntity->is_internal = !(parentParser || openInternalEntities); + if (entityDeclHandler) + handleDefault = XML_FALSE; + } + } + else { + poolDiscard(&dtd->pool); + declEntity = NULL; + } + } + break; + case XML_ROLE_PARAM_ENTITY_NAME: +#ifdef XML_DTD + if (dtd->keepProcessing) { + const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); + if (!name) + return XML_ERROR_NO_MEMORY; + declEntity = (ENTITY *)lookup(&dtd->paramEntities, + name, sizeof(ENTITY)); + if (!declEntity) + return XML_ERROR_NO_MEMORY; + if (declEntity->name != name) { + poolDiscard(&dtd->pool); + declEntity = NULL; + } + else { + poolFinish(&dtd->pool); + declEntity->publicId = NULL; + declEntity->is_param = XML_TRUE; + /* if we have a parent parser or are reading an internal parameter + entity, then the entity declaration is not considered "internal" + */ + declEntity->is_internal = !(parentParser || openInternalEntities); + if (entityDeclHandler) + handleDefault = XML_FALSE; + } + } + else { + poolDiscard(&dtd->pool); + declEntity = NULL; + } +#else /* not XML_DTD */ + declEntity = NULL; +#endif /* XML_DTD */ + break; + case XML_ROLE_NOTATION_NAME: + declNotationPublicId = NULL; + declNotationName = NULL; + if (notationDeclHandler) { + declNotationName = poolStoreString(&tempPool, enc, s, next); + if (!declNotationName) + return XML_ERROR_NO_MEMORY; + poolFinish(&tempPool); + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_NOTATION_PUBLIC_ID: + if (!XmlIsPublicId(enc, s, next, eventPP)) + return XML_ERROR_SYNTAX; + if (declNotationName) { /* means notationDeclHandler != NULL */ + XML_Char *tem = poolStoreString(&tempPool, + enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!tem) + return XML_ERROR_NO_MEMORY; + normalizePublicId(tem); + declNotationPublicId = tem; + poolFinish(&tempPool); + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_NOTATION_SYSTEM_ID: + if (declNotationName && notationDeclHandler) { + const XML_Char *systemId + = poolStoreString(&tempPool, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!systemId) + return XML_ERROR_NO_MEMORY; + *eventEndPP = s; + notationDeclHandler(handlerArg, + declNotationName, + curBase, + systemId, + declNotationPublicId); + handleDefault = XML_FALSE; + } + poolClear(&tempPool); + break; + case XML_ROLE_NOTATION_NO_SYSTEM_ID: + if (declNotationPublicId && notationDeclHandler) { + *eventEndPP = s; + notationDeclHandler(handlerArg, + declNotationName, + curBase, + 0, + declNotationPublicId); + handleDefault = XML_FALSE; + } + poolClear(&tempPool); + break; + case XML_ROLE_ERROR: + switch (tok) { + case XML_TOK_PARAM_ENTITY_REF: + /* PE references in internal subset are + not allowed within declarations. */ + return XML_ERROR_PARAM_ENTITY_REF; + case XML_TOK_XML_DECL: + return XML_ERROR_MISPLACED_XML_PI; + default: + return XML_ERROR_SYNTAX; + } +#ifdef XML_DTD + case XML_ROLE_IGNORE_SECT: + { + enum XML_Error result; + if (defaultHandler) + reportDefault(parser, enc, s, next); + handleDefault = XML_FALSE; + result = doIgnoreSection(parser, enc, &next, end, nextPtr, haveMore); + if (result != XML_ERROR_NONE) + return result; + else if (!next) { + processor = ignoreSectionProcessor; + return result; + } + } + break; +#endif /* XML_DTD */ + case XML_ROLE_GROUP_OPEN: + if (prologState.level >= groupSize) { + if (groupSize) { + char *temp = (char *)REALLOC(groupConnector, groupSize *= 2); + if (temp == NULL) + return XML_ERROR_NO_MEMORY; + groupConnector = temp; + if (dtd->scaffIndex) { + int *temp = (int *)REALLOC(dtd->scaffIndex, + groupSize * sizeof(int)); + if (temp == NULL) + return XML_ERROR_NO_MEMORY; + dtd->scaffIndex = temp; + } + } + else { + groupConnector = (char *)MALLOC(groupSize = 32); + if (!groupConnector) + return XML_ERROR_NO_MEMORY; + } + } + groupConnector[prologState.level] = 0; + if (dtd->in_eldecl) { + int myindex = nextScaffoldPart(parser); + if (myindex < 0) + return XML_ERROR_NO_MEMORY; + dtd->scaffIndex[dtd->scaffLevel] = myindex; + dtd->scaffLevel++; + dtd->scaffold[myindex].type = XML_CTYPE_SEQ; + if (elementDeclHandler) + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_GROUP_SEQUENCE: + if (groupConnector[prologState.level] == '|') + return XML_ERROR_SYNTAX; + groupConnector[prologState.level] = ','; + if (dtd->in_eldecl && elementDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_GROUP_CHOICE: + if (groupConnector[prologState.level] == ',') + return XML_ERROR_SYNTAX; + if (dtd->in_eldecl + && !groupConnector[prologState.level] + && (dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type + != XML_CTYPE_MIXED) + ) { + dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type + = XML_CTYPE_CHOICE; + if (elementDeclHandler) + handleDefault = XML_FALSE; + } + groupConnector[prologState.level] = '|'; + break; + case XML_ROLE_PARAM_ENTITY_REF: +#ifdef XML_DTD + case XML_ROLE_INNER_PARAM_ENTITY_REF: + dtd->hasParamEntityRefs = XML_TRUE; + if (!paramEntityParsing) + dtd->keepProcessing = dtd->standalone; + else { + const XML_Char *name; + ENTITY *entity; + name = poolStoreString(&dtd->pool, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!name) + return XML_ERROR_NO_MEMORY; + entity = (ENTITY *)lookup(&dtd->paramEntities, name, 0); + poolDiscard(&dtd->pool); + /* first, determine if a check for an existing declaration is needed; + if yes, check that the entity exists, and that it is internal, + otherwise call the skipped entity handler + */ + if (prologState.documentEntity && + (dtd->standalone + ? !openInternalEntities + : !dtd->hasParamEntityRefs)) { + if (!entity) + return XML_ERROR_UNDEFINED_ENTITY; + else if (!entity->is_internal) + return XML_ERROR_ENTITY_DECLARED_IN_PE; + } + else if (!entity) { + dtd->keepProcessing = dtd->standalone; + /* cannot report skipped entities in declarations */ + if ((role == XML_ROLE_PARAM_ENTITY_REF) && skippedEntityHandler) { + skippedEntityHandler(handlerArg, name, 1); + handleDefault = XML_FALSE; + } + break; + } + if (entity->open) + return XML_ERROR_RECURSIVE_ENTITY_REF; + if (entity->textPtr) { + enum XML_Error result; + XML_Bool betweenDecl = + (role == XML_ROLE_PARAM_ENTITY_REF ? XML_TRUE : XML_FALSE); + result = processInternalEntity(parser, entity, betweenDecl); + if (result != XML_ERROR_NONE) + return result; + handleDefault = XML_FALSE; + break; + } + if (externalEntityRefHandler) { + dtd->paramEntityRead = XML_FALSE; + entity->open = XML_TRUE; + if (!externalEntityRefHandler(externalEntityRefHandlerArg, + 0, + entity->base, + entity->systemId, + entity->publicId)) { + entity->open = XML_FALSE; + return XML_ERROR_EXTERNAL_ENTITY_HANDLING; + } + entity->open = XML_FALSE; + handleDefault = XML_FALSE; + if (!dtd->paramEntityRead) { + dtd->keepProcessing = dtd->standalone; + break; + } + } + else { + dtd->keepProcessing = dtd->standalone; + break; + } + } +#endif /* XML_DTD */ + if (!dtd->standalone && + notStandaloneHandler && + !notStandaloneHandler(handlerArg)) + return XML_ERROR_NOT_STANDALONE; + break; + + /* Element declaration stuff */ + + case XML_ROLE_ELEMENT_NAME: + if (elementDeclHandler) { + declElementType = getElementType(parser, enc, s, next); + if (!declElementType) + return XML_ERROR_NO_MEMORY; + dtd->scaffLevel = 0; + dtd->scaffCount = 0; + dtd->in_eldecl = XML_TRUE; + handleDefault = XML_FALSE; + } + break; + + case XML_ROLE_CONTENT_ANY: + case XML_ROLE_CONTENT_EMPTY: + if (dtd->in_eldecl) { + if (elementDeclHandler) { + XML_Content * content = (XML_Content *) MALLOC(sizeof(XML_Content)); + if (!content) + return XML_ERROR_NO_MEMORY; + content->quant = XML_CQUANT_NONE; + content->name = NULL; + content->numchildren = 0; + content->children = NULL; + content->type = ((role == XML_ROLE_CONTENT_ANY) ? + XML_CTYPE_ANY : + XML_CTYPE_EMPTY); + *eventEndPP = s; + elementDeclHandler(handlerArg, declElementType->name, content); + handleDefault = XML_FALSE; + } + dtd->in_eldecl = XML_FALSE; + } + break; + + case XML_ROLE_CONTENT_PCDATA: + if (dtd->in_eldecl) { + dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type + = XML_CTYPE_MIXED; + if (elementDeclHandler) + handleDefault = XML_FALSE; + } + break; + + case XML_ROLE_CONTENT_ELEMENT: + quant = XML_CQUANT_NONE; + goto elementContent; + case XML_ROLE_CONTENT_ELEMENT_OPT: + quant = XML_CQUANT_OPT; + goto elementContent; + case XML_ROLE_CONTENT_ELEMENT_REP: + quant = XML_CQUANT_REP; + goto elementContent; + case XML_ROLE_CONTENT_ELEMENT_PLUS: + quant = XML_CQUANT_PLUS; + elementContent: + if (dtd->in_eldecl) { + ELEMENT_TYPE *el; + const XML_Char *name; + int nameLen; + const char *nxt = (quant == XML_CQUANT_NONE + ? next + : next - enc->minBytesPerChar); + int myindex = nextScaffoldPart(parser); + if (myindex < 0) + return XML_ERROR_NO_MEMORY; + dtd->scaffold[myindex].type = XML_CTYPE_NAME; + dtd->scaffold[myindex].quant = quant; + el = getElementType(parser, enc, s, nxt); + if (!el) + return XML_ERROR_NO_MEMORY; + name = el->name; + dtd->scaffold[myindex].name = name; + nameLen = 0; + for (; name[nameLen++]; ); + dtd->contentStringLen += nameLen; + if (elementDeclHandler) + handleDefault = XML_FALSE; + } + break; + + case XML_ROLE_GROUP_CLOSE: + quant = XML_CQUANT_NONE; + goto closeGroup; + case XML_ROLE_GROUP_CLOSE_OPT: + quant = XML_CQUANT_OPT; + goto closeGroup; + case XML_ROLE_GROUP_CLOSE_REP: + quant = XML_CQUANT_REP; + goto closeGroup; + case XML_ROLE_GROUP_CLOSE_PLUS: + quant = XML_CQUANT_PLUS; + closeGroup: + if (dtd->in_eldecl) { + if (elementDeclHandler) + handleDefault = XML_FALSE; + dtd->scaffLevel--; + dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel]].quant = quant; + if (dtd->scaffLevel == 0) { + if (!handleDefault) { + XML_Content *model = build_model(parser); + if (!model) + return XML_ERROR_NO_MEMORY; + *eventEndPP = s; + elementDeclHandler(handlerArg, declElementType->name, model); + } + dtd->in_eldecl = XML_FALSE; + dtd->contentStringLen = 0; + } + } + break; + /* End element declaration stuff */ + + case XML_ROLE_PI: + if (!reportProcessingInstruction(parser, enc, s, next)) + return XML_ERROR_NO_MEMORY; + handleDefault = XML_FALSE; + break; + case XML_ROLE_COMMENT: + if (!reportComment(parser, enc, s, next)) + return XML_ERROR_NO_MEMORY; + handleDefault = XML_FALSE; + break; + case XML_ROLE_NONE: + switch (tok) { + case XML_TOK_BOM: + handleDefault = XML_FALSE; + break; + } + break; + case XML_ROLE_DOCTYPE_NONE: + if (startDoctypeDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_ENTITY_NONE: + if (dtd->keepProcessing && entityDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_NOTATION_NONE: + if (notationDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_ATTLIST_NONE: + if (dtd->keepProcessing && attlistDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_ELEMENT_NONE: + if (elementDeclHandler) + handleDefault = XML_FALSE; + break; + } /* end of big switch */ + + if (handleDefault && defaultHandler) + reportDefault(parser, enc, s, next); + + switch (parsing) { + case XML_SUSPENDED: + *nextPtr = next; + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; + default: + s = next; + tok = XmlPrologTok(enc, s, end, &next); + } + } + /* not reached */ +} + +static enum XML_Error PTRCALL +epilogProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + processor = epilogProcessor; + eventPtr = s; + for (;;) { + const char *next = NULL; + int tok = XmlPrologTok(encoding, s, end, &next); + eventEndPtr = next; + switch (tok) { + /* report partial linebreak - it might be the last token */ + case -XML_TOK_PROLOG_S: + if (defaultHandler) { + reportDefault(parser, encoding, s, next); + if (parsing == XML_FINISHED) + return XML_ERROR_ABORTED; + } + *nextPtr = next; + return XML_ERROR_NONE; + case XML_TOK_NONE: + *nextPtr = s; + return XML_ERROR_NONE; + case XML_TOK_PROLOG_S: + if (defaultHandler) + reportDefault(parser, encoding, s, next); + break; + case XML_TOK_PI: + if (!reportProcessingInstruction(parser, encoding, s, next)) + return XML_ERROR_NO_MEMORY; + break; + case XML_TOK_COMMENT: + if (!reportComment(parser, encoding, s, next)) + return XML_ERROR_NO_MEMORY; + break; + case XML_TOK_INVALID: + eventPtr = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + if (!finalBuffer) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (!finalBuffer) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_PARTIAL_CHAR; + default: + return XML_ERROR_JUNK_AFTER_DOC_ELEMENT; + } + eventPtr = s = next; + switch (parsing) { + case XML_SUSPENDED: + *nextPtr = next; + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; + default: ; + } + } +} + +static enum XML_Error +processInternalEntity(XML_Parser parser, ENTITY *entity, + XML_Bool betweenDecl) +{ + const char *textStart, *textEnd; + const char *next; + enum XML_Error result; + OPEN_INTERNAL_ENTITY *openEntity; + + if (freeInternalEntities) { + openEntity = freeInternalEntities; + freeInternalEntities = openEntity->next; + } + else { + openEntity = (OPEN_INTERNAL_ENTITY *)MALLOC(sizeof(OPEN_INTERNAL_ENTITY)); + if (!openEntity) + return XML_ERROR_NO_MEMORY; + } + entity->open = XML_TRUE; + entity->processed = 0; + openEntity->next = openInternalEntities; + openInternalEntities = openEntity; + openEntity->entity = entity; + openEntity->startTagLevel = tagLevel; + openEntity->betweenDecl = betweenDecl; + openEntity->internalEventPtr = NULL; + openEntity->internalEventEndPtr = NULL; + textStart = (char *)entity->textPtr; + textEnd = (char *)(entity->textPtr + entity->textLen); + +#ifdef XML_DTD + if (entity->is_param) { + int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next); + result = doProlog(parser, internalEncoding, textStart, textEnd, tok, + next, &next, XML_FALSE); + } + else +#endif /* XML_DTD */ + result = doContent(parser, tagLevel, internalEncoding, textStart, + textEnd, &next, XML_FALSE); + + if (result == XML_ERROR_NONE) { + if (textEnd != next && parsing == XML_SUSPENDED) { + entity->processed = next - textStart; + processor = internalEntityProcessor; + } + else { + entity->open = XML_FALSE; + openInternalEntities = openEntity->next; + /* put openEntity back in list of free instances */ + openEntity->next = freeInternalEntities; + freeInternalEntities = openEntity; + } + } + return result; +} + +static enum XML_Error PTRCALL +internalEntityProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + ENTITY *entity; + const char *textStart, *textEnd; + const char *next; + enum XML_Error result; + OPEN_INTERNAL_ENTITY *openEntity = openInternalEntities; + if (!openEntity) + return XML_ERROR_UNEXPECTED_STATE; + + entity = openEntity->entity; + textStart = ((char *)entity->textPtr) + entity->processed; + textEnd = (char *)(entity->textPtr + entity->textLen); + +#ifdef XML_DTD + if (entity->is_param) { + int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next); + result = doProlog(parser, internalEncoding, textStart, textEnd, tok, + next, &next, XML_FALSE); + } + else +#endif /* XML_DTD */ + result = doContent(parser, openEntity->startTagLevel, internalEncoding, + textStart, textEnd, &next, XML_FALSE); + + if (result != XML_ERROR_NONE) + return result; + else if (textEnd != next && parsing == XML_SUSPENDED) { + entity->processed = next - (char *)entity->textPtr; + return result; + } + else { + entity->open = XML_FALSE; + openInternalEntities = openEntity->next; + /* put openEntity back in list of free instances */ + openEntity->next = freeInternalEntities; + freeInternalEntities = openEntity; + } + +#ifdef XML_DTD + if (entity->is_param) { + int tok; + processor = prologProcessor; + tok = XmlPrologTok(encoding, s, end, &next); + return doProlog(parser, encoding, s, end, tok, next, nextPtr, + (XML_Bool)!finalBuffer); + } + else +#endif /* XML_DTD */ + { + processor = contentProcessor; + /* see externalEntityContentProcessor vs contentProcessor */ + return doContent(parser, parentParser ? 1 : 0, encoding, s, end, + nextPtr, (XML_Bool)!finalBuffer); + } +} + +static enum XML_Error PTRCALL +errorProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + return errorCode; +} + +static enum XML_Error +storeAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, + const char *ptr, const char *end, + STRING_POOL *pool) +{ + enum XML_Error result = appendAttributeValue(parser, enc, isCdata, ptr, + end, pool); + if (result) + return result; + if (!isCdata && poolLength(pool) && poolLastChar(pool) == 0x20) + poolChop(pool); + if (!poolAppendChar(pool, XML_T('\0'))) + return XML_ERROR_NO_MEMORY; + return XML_ERROR_NONE; +} + +static enum XML_Error +appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, + const char *ptr, const char *end, + STRING_POOL *pool) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + for (;;) { + const char *next; + int tok = XmlAttributeValueTok(enc, ptr, end, &next); + switch (tok) { + case XML_TOK_NONE: + return XML_ERROR_NONE; + case XML_TOK_INVALID: + if (enc == encoding) + eventPtr = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_CHAR_REF: + { + XML_Char buf[XML_ENCODE_MAX]; + int i; + int n = XmlCharRefNumber(enc, ptr); + if (n < 0) { + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_BAD_CHAR_REF; + } + if (!isCdata + && n == 0x20 /* space */ + && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) + break; + n = XmlEncode(n, (ICHAR *)buf); + if (!n) { + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_BAD_CHAR_REF; + } + for (i = 0; i < n; i++) { + if (!poolAppendChar(pool, buf[i])) + return XML_ERROR_NO_MEMORY; + } + } + break; + case XML_TOK_DATA_CHARS: + if (!poolAppend(pool, enc, ptr, next)) + return XML_ERROR_NO_MEMORY; + break; + case XML_TOK_TRAILING_CR: + next = ptr + enc->minBytesPerChar; + /* fall through */ + case XML_TOK_ATTRIBUTE_VALUE_S: + case XML_TOK_DATA_NEWLINE: + if (!isCdata && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) + break; + if (!poolAppendChar(pool, 0x20)) + return XML_ERROR_NO_MEMORY; + break; + case XML_TOK_ENTITY_REF: + { + const XML_Char *name; + ENTITY *entity; + char checkEntityDecl; + XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc, + ptr + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (ch) { + if (!poolAppendChar(pool, ch)) + return XML_ERROR_NO_MEMORY; + break; + } + name = poolStoreString(&temp2Pool, enc, + ptr + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!name) + return XML_ERROR_NO_MEMORY; + entity = (ENTITY *)lookup(&dtd->generalEntities, name, 0); + poolDiscard(&temp2Pool); + /* first, determine if a check for an existing declaration is needed; + if yes, check that the entity exists, and that it is internal, + otherwise call the default handler (if called from content) + */ + if (pool == &dtd->pool) /* are we called from prolog? */ + checkEntityDecl = +#ifdef XML_DTD + prologState.documentEntity && +#endif /* XML_DTD */ + (dtd->standalone + ? !openInternalEntities + : !dtd->hasParamEntityRefs); + else /* if (pool == &tempPool): we are called from content */ + checkEntityDecl = !dtd->hasParamEntityRefs || dtd->standalone; + if (checkEntityDecl) { + if (!entity) + return XML_ERROR_UNDEFINED_ENTITY; + else if (!entity->is_internal) + return XML_ERROR_ENTITY_DECLARED_IN_PE; + } + else if (!entity) { + /* cannot report skipped entity here - see comments on + skippedEntityHandler + if (skippedEntityHandler) + skippedEntityHandler(handlerArg, name, 0); + */ + if ((pool == &tempPool) && defaultHandler) + reportDefault(parser, enc, ptr, next); + break; + } + if (entity->open) { + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_RECURSIVE_ENTITY_REF; + } + if (entity->notation) { + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_BINARY_ENTITY_REF; + } + if (!entity->textPtr) { + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF; + } + else { + enum XML_Error result; + const XML_Char *textEnd = entity->textPtr + entity->textLen; + entity->open = XML_TRUE; + result = appendAttributeValue(parser, internalEncoding, isCdata, + (char *)entity->textPtr, + (char *)textEnd, pool); + entity->open = XML_FALSE; + if (result) + return result; + } + } + break; + default: + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_UNEXPECTED_STATE; + } + ptr = next; + } + /* not reached */ +} + +static enum XML_Error +storeEntityValue(XML_Parser parser, + const ENCODING *enc, + const char *entityTextPtr, + const char *entityTextEnd) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + STRING_POOL *pool = &(dtd->entityValuePool); + enum XML_Error result = XML_ERROR_NONE; +#ifdef XML_DTD + int oldInEntityValue = prologState.inEntityValue; + prologState.inEntityValue = 1; +#endif /* XML_DTD */ + /* never return Null for the value argument in EntityDeclHandler, + since this would indicate an external entity; therefore we + have to make sure that entityValuePool.start is not null */ + if (!pool->blocks) { + if (!poolGrow(pool)) + return XML_ERROR_NO_MEMORY; + } + + for (;;) { + const char *next; + int tok = XmlEntityValueTok(enc, entityTextPtr, entityTextEnd, &next); + switch (tok) { + case XML_TOK_PARAM_ENTITY_REF: +#ifdef XML_DTD + if (isParamEntity || enc != encoding) { + const XML_Char *name; + ENTITY *entity; + name = poolStoreString(&tempPool, enc, + entityTextPtr + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!name) { + result = XML_ERROR_NO_MEMORY; + goto endEntityValue; + } + entity = (ENTITY *)lookup(&dtd->paramEntities, name, 0); + poolDiscard(&tempPool); + if (!entity) { + /* not a well-formedness error - see XML 1.0: WFC Entity Declared */ + /* cannot report skipped entity here - see comments on + skippedEntityHandler + if (skippedEntityHandler) + skippedEntityHandler(handlerArg, name, 0); + */ + dtd->keepProcessing = dtd->standalone; + goto endEntityValue; + } + if (entity->open) { + if (enc == encoding) + eventPtr = entityTextPtr; + result = XML_ERROR_RECURSIVE_ENTITY_REF; + goto endEntityValue; + } + if (entity->systemId) { + if (externalEntityRefHandler) { + dtd->paramEntityRead = XML_FALSE; + entity->open = XML_TRUE; + if (!externalEntityRefHandler(externalEntityRefHandlerArg, + 0, + entity->base, + entity->systemId, + entity->publicId)) { + entity->open = XML_FALSE; + result = XML_ERROR_EXTERNAL_ENTITY_HANDLING; + goto endEntityValue; + } + entity->open = XML_FALSE; + if (!dtd->paramEntityRead) + dtd->keepProcessing = dtd->standalone; + } + else + dtd->keepProcessing = dtd->standalone; + } + else { + entity->open = XML_TRUE; + result = storeEntityValue(parser, + internalEncoding, + (char *)entity->textPtr, + (char *)(entity->textPtr + + entity->textLen)); + entity->open = XML_FALSE; + if (result) + goto endEntityValue; + } + break; + } +#endif /* XML_DTD */ + /* In the internal subset, PE references are not legal + within markup declarations, e.g entity values in this case. */ + eventPtr = entityTextPtr; + result = XML_ERROR_PARAM_ENTITY_REF; + goto endEntityValue; + case XML_TOK_NONE: + result = XML_ERROR_NONE; + goto endEntityValue; + case XML_TOK_ENTITY_REF: + case XML_TOK_DATA_CHARS: + if (!poolAppend(pool, enc, entityTextPtr, next)) { + result = XML_ERROR_NO_MEMORY; + goto endEntityValue; + } + break; + case XML_TOK_TRAILING_CR: + next = entityTextPtr + enc->minBytesPerChar; + /* fall through */ + case XML_TOK_DATA_NEWLINE: + if (pool->end == pool->ptr && !poolGrow(pool)) { + result = XML_ERROR_NO_MEMORY; + goto endEntityValue; + } + *(pool->ptr)++ = 0xA; + break; + case XML_TOK_CHAR_REF: + { + XML_Char buf[XML_ENCODE_MAX]; + int i; + int n = XmlCharRefNumber(enc, entityTextPtr); + if (n < 0) { + if (enc == encoding) + eventPtr = entityTextPtr; + result = XML_ERROR_BAD_CHAR_REF; + goto endEntityValue; + } + n = XmlEncode(n, (ICHAR *)buf); + if (!n) { + if (enc == encoding) + eventPtr = entityTextPtr; + result = XML_ERROR_BAD_CHAR_REF; + goto endEntityValue; + } + for (i = 0; i < n; i++) { + if (pool->end == pool->ptr && !poolGrow(pool)) { + result = XML_ERROR_NO_MEMORY; + goto endEntityValue; + } + *(pool->ptr)++ = buf[i]; + } + } + break; + case XML_TOK_PARTIAL: + if (enc == encoding) + eventPtr = entityTextPtr; + result = XML_ERROR_INVALID_TOKEN; + goto endEntityValue; + case XML_TOK_INVALID: + if (enc == encoding) + eventPtr = next; + result = XML_ERROR_INVALID_TOKEN; + goto endEntityValue; + default: + if (enc == encoding) + eventPtr = entityTextPtr; + result = XML_ERROR_UNEXPECTED_STATE; + goto endEntityValue; + } + entityTextPtr = next; + } +endEntityValue: +#ifdef XML_DTD + prologState.inEntityValue = oldInEntityValue; +#endif /* XML_DTD */ + return result; +} + +static void FASTCALL +normalizeLines(XML_Char *s) +{ + XML_Char *p; + for (;; s++) { + if (*s == XML_T('\0')) + return; + if (*s == 0xD) + break; + } + p = s; + do { + if (*s == 0xD) { + *p++ = 0xA; + if (*++s == 0xA) + s++; + } + else + *p++ = *s++; + } while (*s); + *p = XML_T('\0'); +} + +static int +reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, + const char *start, const char *end) +{ + const XML_Char *target; + XML_Char *data; + const char *tem; + if (!processingInstructionHandler) { + if (defaultHandler) + reportDefault(parser, enc, start, end); + return 1; + } + start += enc->minBytesPerChar * 2; + tem = start + XmlNameLength(enc, start); + target = poolStoreString(&tempPool, enc, start, tem); + if (!target) + return 0; + poolFinish(&tempPool); + data = poolStoreString(&tempPool, enc, + XmlSkipS(enc, tem), + end - enc->minBytesPerChar*2); + if (!data) + return 0; + normalizeLines(data); + processingInstructionHandler(handlerArg, target, data); + poolClear(&tempPool); + return 1; +} + +static int +reportComment(XML_Parser parser, const ENCODING *enc, + const char *start, const char *end) +{ + XML_Char *data; + if (!commentHandler) { + if (defaultHandler) + reportDefault(parser, enc, start, end); + return 1; + } + data = poolStoreString(&tempPool, + enc, + start + enc->minBytesPerChar * 4, + end - enc->minBytesPerChar * 3); + if (!data) + return 0; + normalizeLines(data); + commentHandler(handlerArg, data); + poolClear(&tempPool); + return 1; +} + +static void +reportDefault(XML_Parser parser, const ENCODING *enc, + const char *s, const char *end) +{ + if (MUST_CONVERT(enc, s)) { + const char **eventPP; + const char **eventEndPP; + if (enc == encoding) { + eventPP = &eventPtr; + eventEndPP = &eventEndPtr; + } + else { + eventPP = &(openInternalEntities->internalEventPtr); + eventEndPP = &(openInternalEntities->internalEventEndPtr); + } + do { + ICHAR *dataPtr = (ICHAR *)dataBuf; + XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); + *eventEndPP = s; + defaultHandler(handlerArg, dataBuf, dataPtr - (ICHAR *)dataBuf); + *eventPP = s; + } while (s != end); + } + else + defaultHandler(handlerArg, (XML_Char *)s, (XML_Char *)end - (XML_Char *)s); +} + + +static int +defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata, + XML_Bool isId, const XML_Char *value, XML_Parser parser) +{ + DEFAULT_ATTRIBUTE *att; + if (value || isId) { + /* The handling of default attributes gets messed up if we have + a default which duplicates a non-default. */ + int i; + for (i = 0; i < type->nDefaultAtts; i++) + if (attId == type->defaultAtts[i].id) + return 1; + if (isId && !type->idAtt && !attId->xmlns) + type->idAtt = attId; + } + if (type->nDefaultAtts == type->allocDefaultAtts) { + if (type->allocDefaultAtts == 0) { + type->allocDefaultAtts = 8; + type->defaultAtts = (DEFAULT_ATTRIBUTE *)MALLOC(type->allocDefaultAtts + * sizeof(DEFAULT_ATTRIBUTE)); + if (!type->defaultAtts) + return 0; + } + else { + DEFAULT_ATTRIBUTE *temp; + int count = type->allocDefaultAtts * 2; + temp = (DEFAULT_ATTRIBUTE *) + REALLOC(type->defaultAtts, (count * sizeof(DEFAULT_ATTRIBUTE))); + if (temp == NULL) + return 0; + type->allocDefaultAtts = count; + type->defaultAtts = temp; + } + } + att = type->defaultAtts + type->nDefaultAtts; + att->id = attId; + att->value = value; + att->isCdata = isCdata; + if (!isCdata) + attId->maybeTokenized = XML_TRUE; + type->nDefaultAtts += 1; + return 1; +} + +static int +setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + const XML_Char *name; + for (name = elementType->name; *name; name++) { + if (*name == XML_T(':')) { + PREFIX *prefix; + const XML_Char *s; + for (s = elementType->name; s != name; s++) { + if (!poolAppendChar(&dtd->pool, *s)) + return 0; + } + if (!poolAppendChar(&dtd->pool, XML_T('\0'))) + return 0; + prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&dtd->pool), + sizeof(PREFIX)); + if (!prefix) + return 0; + if (prefix->name == poolStart(&dtd->pool)) + poolFinish(&dtd->pool); + else + poolDiscard(&dtd->pool); + elementType->prefix = prefix; + + } + } + return 1; +} + +static ATTRIBUTE_ID * +getAttributeId(XML_Parser parser, const ENCODING *enc, + const char *start, const char *end) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + ATTRIBUTE_ID *id; + const XML_Char *name; + if (!poolAppendChar(&dtd->pool, XML_T('\0'))) + return NULL; + name = poolStoreString(&dtd->pool, enc, start, end); + if (!name) + return NULL; + /* skip quotation mark - its storage will be re-used (like in name[-1]) */ + ++name; + id = (ATTRIBUTE_ID *)lookup(&dtd->attributeIds, name, sizeof(ATTRIBUTE_ID)); + if (!id) + return NULL; + if (id->name != name) + poolDiscard(&dtd->pool); + else { + poolFinish(&dtd->pool); + if (!ns) + ; + else if (name[0] == XML_T('x') + && name[1] == XML_T('m') + && name[2] == XML_T('l') + && name[3] == XML_T('n') + && name[4] == XML_T('s') + && (name[5] == XML_T('\0') || name[5] == XML_T(':'))) { + if (name[5] == XML_T('\0')) + id->prefix = &dtd->defaultPrefix; + else + id->prefix = (PREFIX *)lookup(&dtd->prefixes, name + 6, sizeof(PREFIX)); + id->xmlns = XML_TRUE; + } + else { + int i; + for (i = 0; name[i]; i++) { + /* attributes without prefix are *not* in the default namespace */ + if (name[i] == XML_T(':')) { + int j; + for (j = 0; j < i; j++) { + if (!poolAppendChar(&dtd->pool, name[j])) + return NULL; + } + if (!poolAppendChar(&dtd->pool, XML_T('\0'))) + return NULL; + id->prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&dtd->pool), + sizeof(PREFIX)); + if (id->prefix->name == poolStart(&dtd->pool)) + poolFinish(&dtd->pool); + else + poolDiscard(&dtd->pool); + break; + } + } + } + } + return id; +} + +#define CONTEXT_SEP XML_T('\f') + +static const XML_Char * +getContext(XML_Parser parser) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + HASH_TABLE_ITER iter; + XML_Bool needSep = XML_FALSE; + + if (dtd->defaultPrefix.binding) { + int i; + int len; + if (!poolAppendChar(&tempPool, XML_T('='))) + return NULL; + len = dtd->defaultPrefix.binding->uriLen; + if (namespaceSeparator != XML_T('\0')) + len--; + for (i = 0; i < len; i++) + if (!poolAppendChar(&tempPool, dtd->defaultPrefix.binding->uri[i])) + return NULL; + needSep = XML_TRUE; + } + + hashTableIterInit(&iter, &(dtd->prefixes)); + for (;;) { + int i; + int len; + const XML_Char *s; + PREFIX *prefix = (PREFIX *)hashTableIterNext(&iter); + if (!prefix) + break; + if (!prefix->binding) + continue; + if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP)) + return NULL; + for (s = prefix->name; *s; s++) + if (!poolAppendChar(&tempPool, *s)) + return NULL; + if (!poolAppendChar(&tempPool, XML_T('='))) + return NULL; + len = prefix->binding->uriLen; + if (namespaceSeparator != XML_T('\0')) + len--; + for (i = 0; i < len; i++) + if (!poolAppendChar(&tempPool, prefix->binding->uri[i])) + return NULL; + needSep = XML_TRUE; + } + + + hashTableIterInit(&iter, &(dtd->generalEntities)); + for (;;) { + const XML_Char *s; + ENTITY *e = (ENTITY *)hashTableIterNext(&iter); + if (!e) + break; + if (!e->open) + continue; + if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP)) + return NULL; + for (s = e->name; *s; s++) + if (!poolAppendChar(&tempPool, *s)) + return 0; + needSep = XML_TRUE; + } + + if (!poolAppendChar(&tempPool, XML_T('\0'))) + return NULL; + return tempPool.start; +} + +static XML_Bool +setContext(XML_Parser parser, const XML_Char *context) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + const XML_Char *s = context; + + while (*context != XML_T('\0')) { + if (*s == CONTEXT_SEP || *s == XML_T('\0')) { + ENTITY *e; + if (!poolAppendChar(&tempPool, XML_T('\0'))) + return XML_FALSE; + e = (ENTITY *)lookup(&dtd->generalEntities, poolStart(&tempPool), 0); + if (e) + e->open = XML_TRUE; + if (*s != XML_T('\0')) + s++; + context = s; + poolDiscard(&tempPool); + } + else if (*s == XML_T('=')) { + PREFIX *prefix; + if (poolLength(&tempPool) == 0) + prefix = &dtd->defaultPrefix; + else { + if (!poolAppendChar(&tempPool, XML_T('\0'))) + return XML_FALSE; + prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&tempPool), + sizeof(PREFIX)); + if (!prefix) + return XML_FALSE; + if (prefix->name == poolStart(&tempPool)) { + prefix->name = poolCopyString(&dtd->pool, prefix->name); + if (!prefix->name) + return XML_FALSE; + } + poolDiscard(&tempPool); + } + for (context = s + 1; + *context != CONTEXT_SEP && *context != XML_T('\0'); + context++) + if (!poolAppendChar(&tempPool, *context)) + return XML_FALSE; + if (!poolAppendChar(&tempPool, XML_T('\0'))) + return XML_FALSE; + if (addBinding(parser, prefix, 0, poolStart(&tempPool), + &inheritedBindings) != XML_ERROR_NONE) + return XML_FALSE; + poolDiscard(&tempPool); + if (*context != XML_T('\0')) + ++context; + s = context; + } + else { + if (!poolAppendChar(&tempPool, *s)) + return XML_FALSE; + s++; + } + } + return XML_TRUE; +} + +static void FASTCALL +normalizePublicId(XML_Char *publicId) +{ + XML_Char *p = publicId; + XML_Char *s; + for (s = publicId; *s; s++) { + switch (*s) { + case 0x20: + case 0xD: + case 0xA: + if (p != publicId && p[-1] != 0x20) + *p++ = 0x20; + break; + default: + *p++ = *s; + } + } + if (p != publicId && p[-1] == 0x20) + --p; + *p = XML_T('\0'); +} + +static DTD * +dtdCreate(const XML_Memory_Handling_Suite *ms) +{ + DTD *p = (DTD *)ms->malloc_fcn(sizeof(DTD)); + if (p == NULL) + return p; + poolInit(&(p->pool), ms); + poolInit(&(p->entityValuePool), ms); + hashTableInit(&(p->generalEntities), ms); + hashTableInit(&(p->elementTypes), ms); + hashTableInit(&(p->attributeIds), ms); + hashTableInit(&(p->prefixes), ms); +#ifdef XML_DTD + p->paramEntityRead = XML_FALSE; + hashTableInit(&(p->paramEntities), ms); +#endif /* XML_DTD */ + p->defaultPrefix.name = NULL; + p->defaultPrefix.binding = NULL; + + p->in_eldecl = XML_FALSE; + p->scaffIndex = NULL; + p->scaffold = NULL; + p->scaffLevel = 0; + p->scaffSize = 0; + p->scaffCount = 0; + p->contentStringLen = 0; + + p->keepProcessing = XML_TRUE; + p->hasParamEntityRefs = XML_FALSE; + p->standalone = XML_FALSE; + return p; +} + +static void +dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms) +{ + HASH_TABLE_ITER iter; + hashTableIterInit(&iter, &(p->elementTypes)); + for (;;) { + ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter); + if (!e) + break; + if (e->allocDefaultAtts != 0) + ms->free_fcn(e->defaultAtts); + } + hashTableClear(&(p->generalEntities)); +#ifdef XML_DTD + p->paramEntityRead = XML_FALSE; + hashTableClear(&(p->paramEntities)); +#endif /* XML_DTD */ + hashTableClear(&(p->elementTypes)); + hashTableClear(&(p->attributeIds)); + hashTableClear(&(p->prefixes)); + poolClear(&(p->pool)); + poolClear(&(p->entityValuePool)); + p->defaultPrefix.name = NULL; + p->defaultPrefix.binding = NULL; + + p->in_eldecl = XML_FALSE; + + ms->free_fcn(p->scaffIndex); + p->scaffIndex = NULL; + ms->free_fcn(p->scaffold); + p->scaffold = NULL; + + p->scaffLevel = 0; + p->scaffSize = 0; + p->scaffCount = 0; + p->contentStringLen = 0; + + p->keepProcessing = XML_TRUE; + p->hasParamEntityRefs = XML_FALSE; + p->standalone = XML_FALSE; +} + +static void +dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms) +{ + HASH_TABLE_ITER iter; + hashTableIterInit(&iter, &(p->elementTypes)); + for (;;) { + ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter); + if (!e) + break; + if (e->allocDefaultAtts != 0) + ms->free_fcn(e->defaultAtts); + } + hashTableDestroy(&(p->generalEntities)); +#ifdef XML_DTD + hashTableDestroy(&(p->paramEntities)); +#endif /* XML_DTD */ + hashTableDestroy(&(p->elementTypes)); + hashTableDestroy(&(p->attributeIds)); + hashTableDestroy(&(p->prefixes)); + poolDestroy(&(p->pool)); + poolDestroy(&(p->entityValuePool)); + if (isDocEntity) { + ms->free_fcn(p->scaffIndex); + ms->free_fcn(p->scaffold); + } + ms->free_fcn(p); +} + +/* Do a deep copy of the DTD. Return 0 for out of memory, non-zero otherwise. + The new DTD has already been initialized. +*/ +static int +dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms) +{ + HASH_TABLE_ITER iter; + + /* Copy the prefix table. */ + + hashTableIterInit(&iter, &(oldDtd->prefixes)); + for (;;) { + const XML_Char *name; + const PREFIX *oldP = (PREFIX *)hashTableIterNext(&iter); + if (!oldP) + break; + name = poolCopyString(&(newDtd->pool), oldP->name); + if (!name) + return 0; + if (!lookup(&(newDtd->prefixes), name, sizeof(PREFIX))) + return 0; + } + + hashTableIterInit(&iter, &(oldDtd->attributeIds)); + + /* Copy the attribute id table. */ + + for (;;) { + ATTRIBUTE_ID *newA; + const XML_Char *name; + const ATTRIBUTE_ID *oldA = (ATTRIBUTE_ID *)hashTableIterNext(&iter); + + if (!oldA) + break; + /* Remember to allocate the scratch byte before the name. */ + if (!poolAppendChar(&(newDtd->pool), XML_T('\0'))) + return 0; + name = poolCopyString(&(newDtd->pool), oldA->name); + if (!name) + return 0; + ++name; + newA = (ATTRIBUTE_ID *)lookup(&(newDtd->attributeIds), name, + sizeof(ATTRIBUTE_ID)); + if (!newA) + return 0; + newA->maybeTokenized = oldA->maybeTokenized; + if (oldA->prefix) { + newA->xmlns = oldA->xmlns; + if (oldA->prefix == &oldDtd->defaultPrefix) + newA->prefix = &newDtd->defaultPrefix; + else + newA->prefix = (PREFIX *)lookup(&(newDtd->prefixes), + oldA->prefix->name, 0); + } + } + + /* Copy the element type table. */ + + hashTableIterInit(&iter, &(oldDtd->elementTypes)); + + for (;;) { + int i; + ELEMENT_TYPE *newE; + const XML_Char *name; + const ELEMENT_TYPE *oldE = (ELEMENT_TYPE *)hashTableIterNext(&iter); + if (!oldE) + break; + name = poolCopyString(&(newDtd->pool), oldE->name); + if (!name) + return 0; + newE = (ELEMENT_TYPE *)lookup(&(newDtd->elementTypes), name, + sizeof(ELEMENT_TYPE)); + if (!newE) + return 0; + if (oldE->nDefaultAtts) { + newE->defaultAtts = (DEFAULT_ATTRIBUTE *) + ms->malloc_fcn(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE)); + if (!newE->defaultAtts) { + ms->free_fcn(newE); + return 0; + } + } + if (oldE->idAtt) + newE->idAtt = (ATTRIBUTE_ID *) + lookup(&(newDtd->attributeIds), oldE->idAtt->name, 0); + newE->allocDefaultAtts = newE->nDefaultAtts = oldE->nDefaultAtts; + if (oldE->prefix) + newE->prefix = (PREFIX *)lookup(&(newDtd->prefixes), + oldE->prefix->name, 0); + for (i = 0; i < newE->nDefaultAtts; i++) { + newE->defaultAtts[i].id = (ATTRIBUTE_ID *) + lookup(&(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0); + newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata; + if (oldE->defaultAtts[i].value) { + newE->defaultAtts[i].value + = poolCopyString(&(newDtd->pool), oldE->defaultAtts[i].value); + if (!newE->defaultAtts[i].value) + return 0; + } + else + newE->defaultAtts[i].value = NULL; + } + } + + /* Copy the entity tables. */ + if (!copyEntityTable(&(newDtd->generalEntities), + &(newDtd->pool), + &(oldDtd->generalEntities))) + return 0; + +#ifdef XML_DTD + if (!copyEntityTable(&(newDtd->paramEntities), + &(newDtd->pool), + &(oldDtd->paramEntities))) + return 0; + newDtd->paramEntityRead = oldDtd->paramEntityRead; +#endif /* XML_DTD */ + + newDtd->keepProcessing = oldDtd->keepProcessing; + newDtd->hasParamEntityRefs = oldDtd->hasParamEntityRefs; + newDtd->standalone = oldDtd->standalone; + + /* Don't want deep copying for scaffolding */ + newDtd->in_eldecl = oldDtd->in_eldecl; + newDtd->scaffold = oldDtd->scaffold; + newDtd->contentStringLen = oldDtd->contentStringLen; + newDtd->scaffSize = oldDtd->scaffSize; + newDtd->scaffLevel = oldDtd->scaffLevel; + newDtd->scaffIndex = oldDtd->scaffIndex; + + return 1; +} /* End dtdCopy */ + +static int +copyEntityTable(HASH_TABLE *newTable, + STRING_POOL *newPool, + const HASH_TABLE *oldTable) +{ + HASH_TABLE_ITER iter; + const XML_Char *cachedOldBase = NULL; + const XML_Char *cachedNewBase = NULL; + + hashTableIterInit(&iter, oldTable); + + for (;;) { + ENTITY *newE; + const XML_Char *name; + const ENTITY *oldE = (ENTITY *)hashTableIterNext(&iter); + if (!oldE) + break; + name = poolCopyString(newPool, oldE->name); + if (!name) + return 0; + newE = (ENTITY *)lookup(newTable, name, sizeof(ENTITY)); + if (!newE) + return 0; + if (oldE->systemId) { + const XML_Char *tem = poolCopyString(newPool, oldE->systemId); + if (!tem) + return 0; + newE->systemId = tem; + if (oldE->base) { + if (oldE->base == cachedOldBase) + newE->base = cachedNewBase; + else { + cachedOldBase = oldE->base; + tem = poolCopyString(newPool, cachedOldBase); + if (!tem) + return 0; + cachedNewBase = newE->base = tem; + } + } + if (oldE->publicId) { + tem = poolCopyString(newPool, oldE->publicId); + if (!tem) + return 0; + newE->publicId = tem; + } + } + else { + const XML_Char *tem = poolCopyStringN(newPool, oldE->textPtr, + oldE->textLen); + if (!tem) + return 0; + newE->textPtr = tem; + newE->textLen = oldE->textLen; + } + if (oldE->notation) { + const XML_Char *tem = poolCopyString(newPool, oldE->notation); + if (!tem) + return 0; + newE->notation = tem; + } + newE->is_param = oldE->is_param; + newE->is_internal = oldE->is_internal; + } + return 1; +} + +#define INIT_POWER 6 + +static XML_Bool FASTCALL +keyeq(KEY s1, KEY s2) +{ + for (; *s1 == *s2; s1++, s2++) + if (*s1 == 0) + return XML_TRUE; + return XML_FALSE; +} + +static unsigned long FASTCALL +hash(KEY s) +{ + unsigned long h = 0; + while (*s) + h = CHAR_HASH(h, *s++); + return h; +} + +static NAMED * +lookup(HASH_TABLE *table, KEY name, size_t createSize) +{ + size_t i; + if (table->size == 0) { + size_t tsize; + if (!createSize) + return NULL; + table->power = INIT_POWER; + /* table->size is a power of 2 */ + table->size = (size_t)1 << INIT_POWER; + tsize = table->size * sizeof(NAMED *); + table->v = (NAMED **)table->mem->malloc_fcn(tsize); + if (!table->v) + return NULL; + memset(table->v, 0, tsize); + i = hash(name) & ((unsigned long)table->size - 1); + } + else { + unsigned long h = hash(name); + unsigned long mask = (unsigned long)table->size - 1; + unsigned char step = 0; + i = h & mask; + while (table->v[i]) { + if (keyeq(name, table->v[i]->name)) + return table->v[i]; + if (!step) + step = PROBE_STEP(h, mask, table->power); + i < step ? (i += table->size - step) : (i -= step); + } + if (!createSize) + return NULL; + + /* check for overflow (table is half full) */ + if (table->used >> (table->power - 1)) { + unsigned char newPower = table->power + 1; + size_t newSize = (size_t)1 << newPower; + unsigned long newMask = (unsigned long)newSize - 1; + size_t tsize = newSize * sizeof(NAMED *); + NAMED **newV = (NAMED **)table->mem->malloc_fcn(tsize); + if (!newV) + return NULL; + memset(newV, 0, tsize); + for (i = 0; i < table->size; i++) + if (table->v[i]) { + unsigned long newHash = hash(table->v[i]->name); + size_t j = newHash & newMask; + step = 0; + while (newV[j]) { + if (!step) + step = PROBE_STEP(newHash, newMask, newPower); + j < step ? (j += newSize - step) : (j -= step); + } + newV[j] = table->v[i]; + } + table->mem->free_fcn(table->v); + table->v = newV; + table->power = newPower; + table->size = newSize; + i = h & newMask; + step = 0; + while (table->v[i]) { + if (!step) + step = PROBE_STEP(h, newMask, newPower); + i < step ? (i += newSize - step) : (i -= step); + } + } + } + table->v[i] = (NAMED *)table->mem->malloc_fcn(createSize); + if (!table->v[i]) + return NULL; + memset(table->v[i], 0, createSize); + table->v[i]->name = name; + (table->used)++; + return table->v[i]; +} + +static void FASTCALL +hashTableClear(HASH_TABLE *table) +{ + size_t i; + for (i = 0; i < table->size; i++) { + table->mem->free_fcn(table->v[i]); + table->v[i] = NULL; + } + table->used = 0; +} + +static void FASTCALL +hashTableDestroy(HASH_TABLE *table) +{ + size_t i; + for (i = 0; i < table->size; i++) + table->mem->free_fcn(table->v[i]); + table->mem->free_fcn(table->v); +} + +static void FASTCALL +hashTableInit(HASH_TABLE *p, const XML_Memory_Handling_Suite *ms) +{ + p->power = 0; + p->size = 0; + p->used = 0; + p->v = NULL; + p->mem = ms; +} + +static void FASTCALL +hashTableIterInit(HASH_TABLE_ITER *iter, const HASH_TABLE *table) +{ + iter->p = table->v; + iter->end = iter->p + table->size; +} + +static NAMED * FASTCALL +hashTableIterNext(HASH_TABLE_ITER *iter) +{ + while (iter->p != iter->end) { + NAMED *tem = *(iter->p)++; + if (tem) + return tem; + } + return NULL; +} + +static void FASTCALL +poolInit(STRING_POOL *pool, const XML_Memory_Handling_Suite *ms) +{ + pool->blocks = NULL; + pool->freeBlocks = NULL; + pool->start = NULL; + pool->ptr = NULL; + pool->end = NULL; + pool->mem = ms; +} + +static void FASTCALL +poolClear(STRING_POOL *pool) +{ + if (!pool->freeBlocks) + pool->freeBlocks = pool->blocks; + else { + BLOCK *p = pool->blocks; + while (p) { + BLOCK *tem = p->next; + p->next = pool->freeBlocks; + pool->freeBlocks = p; + p = tem; + } + } + pool->blocks = NULL; + pool->start = NULL; + pool->ptr = NULL; + pool->end = NULL; +} + +static void FASTCALL +poolDestroy(STRING_POOL *pool) +{ + BLOCK *p = pool->blocks; + while (p) { + BLOCK *tem = p->next; + pool->mem->free_fcn(p); + p = tem; + } + p = pool->freeBlocks; + while (p) { + BLOCK *tem = p->next; + pool->mem->free_fcn(p); + p = tem; + } +} + +static XML_Char * +poolAppend(STRING_POOL *pool, const ENCODING *enc, + const char *ptr, const char *end) +{ + if (!pool->ptr && !poolGrow(pool)) + return NULL; + for (;;) { + XmlConvert(enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end); + if (ptr == end) + break; + if (!poolGrow(pool)) + return NULL; + } + return pool->start; +} + +static const XML_Char * FASTCALL +poolCopyString(STRING_POOL *pool, const XML_Char *s) +{ + do { + if (!poolAppendChar(pool, *s)) + return NULL; + } while (*s++); + s = pool->start; + poolFinish(pool); + return s; +} + +static const XML_Char * +poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n) +{ + if (!pool->ptr && !poolGrow(pool)) + return NULL; + for (; n > 0; --n, s++) { + if (!poolAppendChar(pool, *s)) + return NULL; + } + s = pool->start; + poolFinish(pool); + return s; +} + +static const XML_Char * FASTCALL +poolAppendString(STRING_POOL *pool, const XML_Char *s) +{ + while (*s) { + if (!poolAppendChar(pool, *s)) + return NULL; + s++; + } + return pool->start; +} + +static XML_Char * +poolStoreString(STRING_POOL *pool, const ENCODING *enc, + const char *ptr, const char *end) +{ + if (!poolAppend(pool, enc, ptr, end)) + return NULL; + if (pool->ptr == pool->end && !poolGrow(pool)) + return NULL; + *(pool->ptr)++ = 0; + return pool->start; +} + +static XML_Bool FASTCALL +poolGrow(STRING_POOL *pool) +{ + if (pool->freeBlocks) { + if (pool->start == 0) { + pool->blocks = pool->freeBlocks; + pool->freeBlocks = pool->freeBlocks->next; + pool->blocks->next = NULL; + pool->start = pool->blocks->s; + pool->end = pool->start + pool->blocks->size; + pool->ptr = pool->start; + return XML_TRUE; + } + if (pool->end - pool->start < pool->freeBlocks->size) { + BLOCK *tem = pool->freeBlocks->next; + pool->freeBlocks->next = pool->blocks; + pool->blocks = pool->freeBlocks; + pool->freeBlocks = tem; + memcpy(pool->blocks->s, pool->start, + (pool->end - pool->start) * sizeof(XML_Char)); + pool->ptr = pool->blocks->s + (pool->ptr - pool->start); + pool->start = pool->blocks->s; + pool->end = pool->start + pool->blocks->size; + return XML_TRUE; + } + } + if (pool->blocks && pool->start == pool->blocks->s) { + int blockSize = (pool->end - pool->start)*2; + pool->blocks = (BLOCK *) + pool->mem->realloc_fcn(pool->blocks, + (offsetof(BLOCK, s) + + blockSize * sizeof(XML_Char))); + if (pool->blocks == NULL) + return XML_FALSE; + pool->blocks->size = blockSize; + pool->ptr = pool->blocks->s + (pool->ptr - pool->start); + pool->start = pool->blocks->s; + pool->end = pool->start + blockSize; + } + else { + BLOCK *tem; + int blockSize = pool->end - pool->start; + if (blockSize < INIT_BLOCK_SIZE) + blockSize = INIT_BLOCK_SIZE; + else + blockSize *= 2; + tem = (BLOCK *)pool->mem->malloc_fcn(offsetof(BLOCK, s) + + blockSize * sizeof(XML_Char)); + if (!tem) + return XML_FALSE; + tem->size = blockSize; + tem->next = pool->blocks; + pool->blocks = tem; + if (pool->ptr != pool->start) + memcpy(tem->s, pool->start, + (pool->ptr - pool->start) * sizeof(XML_Char)); + pool->ptr = tem->s + (pool->ptr - pool->start); + pool->start = tem->s; + pool->end = tem->s + blockSize; + } + return XML_TRUE; +} + +static int FASTCALL +nextScaffoldPart(XML_Parser parser) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + CONTENT_SCAFFOLD * me; + int next; + + if (!dtd->scaffIndex) { + dtd->scaffIndex = (int *)MALLOC(groupSize * sizeof(int)); + if (!dtd->scaffIndex) + return -1; + dtd->scaffIndex[0] = 0; + } + + if (dtd->scaffCount >= dtd->scaffSize) { + CONTENT_SCAFFOLD *temp; + if (dtd->scaffold) { + temp = (CONTENT_SCAFFOLD *) + REALLOC(dtd->scaffold, dtd->scaffSize * 2 * sizeof(CONTENT_SCAFFOLD)); + if (temp == NULL) + return -1; + dtd->scaffSize *= 2; + } + else { + temp = (CONTENT_SCAFFOLD *)MALLOC(INIT_SCAFFOLD_ELEMENTS + * sizeof(CONTENT_SCAFFOLD)); + if (temp == NULL) + return -1; + dtd->scaffSize = INIT_SCAFFOLD_ELEMENTS; + } + dtd->scaffold = temp; + } + next = dtd->scaffCount++; + me = &dtd->scaffold[next]; + if (dtd->scaffLevel) { + CONTENT_SCAFFOLD *parent = &dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel-1]]; + if (parent->lastchild) { + dtd->scaffold[parent->lastchild].nextsib = next; + } + if (!parent->childcnt) + parent->firstchild = next; + parent->lastchild = next; + parent->childcnt++; + } + me->firstchild = me->lastchild = me->childcnt = me->nextsib = 0; + return next; +} + +static void +build_node(XML_Parser parser, + int src_node, + XML_Content *dest, + XML_Content **contpos, + XML_Char **strpos) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + dest->type = dtd->scaffold[src_node].type; + dest->quant = dtd->scaffold[src_node].quant; + if (dest->type == XML_CTYPE_NAME) { + const XML_Char *src; + dest->name = *strpos; + src = dtd->scaffold[src_node].name; + for (;;) { + *(*strpos)++ = *src; + if (!*src) + break; + src++; + } + dest->numchildren = 0; + dest->children = NULL; + } + else { + unsigned int i; + int cn; + dest->numchildren = dtd->scaffold[src_node].childcnt; + dest->children = *contpos; + *contpos += dest->numchildren; + for (i = 0, cn = dtd->scaffold[src_node].firstchild; + i < dest->numchildren; + i++, cn = dtd->scaffold[cn].nextsib) { + build_node(parser, cn, &(dest->children[i]), contpos, strpos); + } + dest->name = NULL; + } +} + +static XML_Content * +build_model (XML_Parser parser) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + XML_Content *ret; + XML_Content *cpos; + XML_Char * str; + int allocsize = (dtd->scaffCount * sizeof(XML_Content) + + (dtd->contentStringLen * sizeof(XML_Char))); + + ret = (XML_Content *)MALLOC(allocsize); + if (!ret) + return NULL; + + str = (XML_Char *) (&ret[dtd->scaffCount]); + cpos = &ret[1]; + + build_node(parser, 0, ret, &cpos, &str); + return ret; +} + +static ELEMENT_TYPE * +getElementType(XML_Parser parser, + const ENCODING *enc, + const char *ptr, + const char *end) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + const XML_Char *name = poolStoreString(&dtd->pool, enc, ptr, end); + ELEMENT_TYPE *ret; + + if (!name) + return NULL; + ret = (ELEMENT_TYPE *) lookup(&dtd->elementTypes, name, sizeof(ELEMENT_TYPE)); + if (!ret) + return NULL; + if (ret->name != name) + poolDiscard(&dtd->pool); + else { + poolFinish(&dtd->pool); + if (!setElementTypePrefix(parser, ret)) + return NULL; + } + return ret; +} diff --git a/reactos/lib/expat/lib/xmlrole.c b/reactos/lib/expat/lib/xmlrole.c new file mode 100644 index 00000000000..a2305c6a17c --- /dev/null +++ b/reactos/lib/expat/lib/xmlrole.c @@ -0,0 +1,1325 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#ifdef COMPILED_FROM_DSP +#include "winconfig.h" +#elif defined(MACOS_CLASSIC) +#include "macconfig.h" +#else +#ifdef HAVE_EXPAT_CONFIG_H +#include "expat_config.h" +#endif +#endif /* ndef COMPILED_FROM_DSP */ + +#include "internal.h" +#include "xmlrole.h" +#include "ascii.h" + +/* Doesn't check: + + that ,| are not mixed in a model group + content of literals + +*/ + +static const char KW_ANY[] = { + ASCII_A, ASCII_N, ASCII_Y, '\0' }; +static const char KW_ATTLIST[] = { + ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0' }; +static const char KW_CDATA[] = { + ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; +static const char KW_DOCTYPE[] = { + ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0' }; +static const char KW_ELEMENT[] = { + ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0' }; +static const char KW_EMPTY[] = { + ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0' }; +static const char KW_ENTITIES[] = { + ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, + '\0' }; +static const char KW_ENTITY[] = { + ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' }; +static const char KW_FIXED[] = { + ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0' }; +static const char KW_ID[] = { + ASCII_I, ASCII_D, '\0' }; +static const char KW_IDREF[] = { + ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' }; +static const char KW_IDREFS[] = { + ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' }; +static const char KW_IGNORE[] = { + ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0' }; +static const char KW_IMPLIED[] = { + ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0' }; +static const char KW_INCLUDE[] = { + ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0' }; +static const char KW_NDATA[] = { + ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; +static const char KW_NMTOKEN[] = { + ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' }; +static const char KW_NMTOKENS[] = { + ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, + '\0' }; +static const char KW_NOTATION[] = + { ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, + '\0' }; +static const char KW_PCDATA[] = { + ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; +static const char KW_PUBLIC[] = { + ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0' }; +static const char KW_REQUIRED[] = { + ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I, ASCII_R, ASCII_E, ASCII_D, + '\0' }; +static const char KW_SYSTEM[] = { + ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0' }; + +#ifndef MIN_BYTES_PER_CHAR +#define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar) +#endif + +#ifdef XML_DTD +#define setTopLevel(state) \ + ((state)->handler = ((state)->documentEntity \ + ? internalSubset \ + : externalSubset1)) +#else /* not XML_DTD */ +#define setTopLevel(state) ((state)->handler = internalSubset) +#endif /* not XML_DTD */ + +typedef int PTRCALL PROLOG_HANDLER(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc); + +static PROLOG_HANDLER + prolog0, prolog1, prolog2, + doctype0, doctype1, doctype2, doctype3, doctype4, doctype5, + internalSubset, + entity0, entity1, entity2, entity3, entity4, entity5, entity6, + entity7, entity8, entity9, entity10, + notation0, notation1, notation2, notation3, notation4, + attlist0, attlist1, attlist2, attlist3, attlist4, attlist5, attlist6, + attlist7, attlist8, attlist9, + element0, element1, element2, element3, element4, element5, element6, + element7, +#ifdef XML_DTD + externalSubset0, externalSubset1, + condSect0, condSect1, condSect2, +#endif /* XML_DTD */ + declClose, + error; + +static int FASTCALL common(PROLOG_STATE *state, int tok); + +static int PTRCALL +prolog0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + state->handler = prolog1; + return XML_ROLE_NONE; + case XML_TOK_XML_DECL: + state->handler = prolog1; + return XML_ROLE_XML_DECL; + case XML_TOK_PI: + state->handler = prolog1; + return XML_ROLE_PI; + case XML_TOK_COMMENT: + state->handler = prolog1; + return XML_ROLE_COMMENT; + case XML_TOK_BOM: + return XML_ROLE_NONE; + case XML_TOK_DECL_OPEN: + if (!XmlNameMatchesAscii(enc, + ptr + 2 * MIN_BYTES_PER_CHAR(enc), + end, + KW_DOCTYPE)) + break; + state->handler = doctype0; + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_INSTANCE_START: + state->handler = error; + return XML_ROLE_INSTANCE_START; + } + return common(state, tok); +} + +static int PTRCALL +prolog1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_PI: + return XML_ROLE_PI; + case XML_TOK_COMMENT: + return XML_ROLE_COMMENT; + case XML_TOK_BOM: + return XML_ROLE_NONE; + case XML_TOK_DECL_OPEN: + if (!XmlNameMatchesAscii(enc, + ptr + 2 * MIN_BYTES_PER_CHAR(enc), + end, + KW_DOCTYPE)) + break; + state->handler = doctype0; + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_INSTANCE_START: + state->handler = error; + return XML_ROLE_INSTANCE_START; + } + return common(state, tok); +} + +static int PTRCALL +prolog2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_PI: + return XML_ROLE_PI; + case XML_TOK_COMMENT: + return XML_ROLE_COMMENT; + case XML_TOK_INSTANCE_START: + state->handler = error; + return XML_ROLE_INSTANCE_START; + } + return common(state, tok); +} + +static int PTRCALL +doctype0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = doctype1; + return XML_ROLE_DOCTYPE_NAME; + } + return common(state, tok); +} + +static int PTRCALL +doctype1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_OPEN_BRACKET: + state->handler = internalSubset; + return XML_ROLE_DOCTYPE_INTERNAL_SUBSET; + case XML_TOK_DECL_CLOSE: + state->handler = prolog2; + return XML_ROLE_DOCTYPE_CLOSE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { + state->handler = doctype3; + return XML_ROLE_DOCTYPE_NONE; + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { + state->handler = doctype2; + return XML_ROLE_DOCTYPE_NONE; + } + break; + } + return common(state, tok); +} + +static int PTRCALL +doctype2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_LITERAL: + state->handler = doctype3; + return XML_ROLE_DOCTYPE_PUBLIC_ID; + } + return common(state, tok); +} + +static int PTRCALL +doctype3(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_LITERAL: + state->handler = doctype4; + return XML_ROLE_DOCTYPE_SYSTEM_ID; + } + return common(state, tok); +} + +static int PTRCALL +doctype4(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_OPEN_BRACKET: + state->handler = internalSubset; + return XML_ROLE_DOCTYPE_INTERNAL_SUBSET; + case XML_TOK_DECL_CLOSE: + state->handler = prolog2; + return XML_ROLE_DOCTYPE_CLOSE; + } + return common(state, tok); +} + +static int PTRCALL +doctype5(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_DECL_CLOSE: + state->handler = prolog2; + return XML_ROLE_DOCTYPE_CLOSE; + } + return common(state, tok); +} + +static int PTRCALL +internalSubset(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_DECL_OPEN: + if (XmlNameMatchesAscii(enc, + ptr + 2 * MIN_BYTES_PER_CHAR(enc), + end, + KW_ENTITY)) { + state->handler = entity0; + return XML_ROLE_ENTITY_NONE; + } + if (XmlNameMatchesAscii(enc, + ptr + 2 * MIN_BYTES_PER_CHAR(enc), + end, + KW_ATTLIST)) { + state->handler = attlist0; + return XML_ROLE_ATTLIST_NONE; + } + if (XmlNameMatchesAscii(enc, + ptr + 2 * MIN_BYTES_PER_CHAR(enc), + end, + KW_ELEMENT)) { + state->handler = element0; + return XML_ROLE_ELEMENT_NONE; + } + if (XmlNameMatchesAscii(enc, + ptr + 2 * MIN_BYTES_PER_CHAR(enc), + end, + KW_NOTATION)) { + state->handler = notation0; + return XML_ROLE_NOTATION_NONE; + } + break; + case XML_TOK_PI: + return XML_ROLE_PI; + case XML_TOK_COMMENT: + return XML_ROLE_COMMENT; + case XML_TOK_PARAM_ENTITY_REF: + return XML_ROLE_PARAM_ENTITY_REF; + case XML_TOK_CLOSE_BRACKET: + state->handler = doctype5; + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_NONE: + return XML_ROLE_NONE; + } + return common(state, tok); +} + +#ifdef XML_DTD + +static int PTRCALL +externalSubset0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + state->handler = externalSubset1; + if (tok == XML_TOK_XML_DECL) + return XML_ROLE_TEXT_DECL; + return externalSubset1(state, tok, ptr, end, enc); +} + +static int PTRCALL +externalSubset1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_COND_SECT_OPEN: + state->handler = condSect0; + return XML_ROLE_NONE; + case XML_TOK_COND_SECT_CLOSE: + if (state->includeLevel == 0) + break; + state->includeLevel -= 1; + return XML_ROLE_NONE; + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_CLOSE_BRACKET: + break; + case XML_TOK_NONE: + if (state->includeLevel) + break; + return XML_ROLE_NONE; + default: + return internalSubset(state, tok, ptr, end, enc); + } + return common(state, tok); +} + +#endif /* XML_DTD */ + +static int PTRCALL +entity0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_PERCENT: + state->handler = entity1; + return XML_ROLE_ENTITY_NONE; + case XML_TOK_NAME: + state->handler = entity2; + return XML_ROLE_GENERAL_ENTITY_NAME; + } + return common(state, tok); +} + +static int PTRCALL +entity1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_NAME: + state->handler = entity7; + return XML_ROLE_PARAM_ENTITY_NAME; + } + return common(state, tok); +} + +static int PTRCALL +entity2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { + state->handler = entity4; + return XML_ROLE_ENTITY_NONE; + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { + state->handler = entity3; + return XML_ROLE_ENTITY_NONE; + } + break; + case XML_TOK_LITERAL: + state->handler = declClose; + state->role_none = XML_ROLE_ENTITY_NONE; + return XML_ROLE_ENTITY_VALUE; + } + return common(state, tok); +} + +static int PTRCALL +entity3(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_LITERAL: + state->handler = entity4; + return XML_ROLE_ENTITY_PUBLIC_ID; + } + return common(state, tok); +} + +static int PTRCALL +entity4(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_LITERAL: + state->handler = entity5; + return XML_ROLE_ENTITY_SYSTEM_ID; + } + return common(state, tok); +} + +static int PTRCALL +entity5(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_DECL_CLOSE: + setTopLevel(state); + return XML_ROLE_ENTITY_COMPLETE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) { + state->handler = entity6; + return XML_ROLE_ENTITY_NONE; + } + break; + } + return common(state, tok); +} + +static int PTRCALL +entity6(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_NAME: + state->handler = declClose; + state->role_none = XML_ROLE_ENTITY_NONE; + return XML_ROLE_ENTITY_NOTATION_NAME; + } + return common(state, tok); +} + +static int PTRCALL +entity7(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { + state->handler = entity9; + return XML_ROLE_ENTITY_NONE; + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { + state->handler = entity8; + return XML_ROLE_ENTITY_NONE; + } + break; + case XML_TOK_LITERAL: + state->handler = declClose; + state->role_none = XML_ROLE_ENTITY_NONE; + return XML_ROLE_ENTITY_VALUE; + } + return common(state, tok); +} + +static int PTRCALL +entity8(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_LITERAL: + state->handler = entity9; + return XML_ROLE_ENTITY_PUBLIC_ID; + } + return common(state, tok); +} + +static int PTRCALL +entity9(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_LITERAL: + state->handler = entity10; + return XML_ROLE_ENTITY_SYSTEM_ID; + } + return common(state, tok); +} + +static int PTRCALL +entity10(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_DECL_CLOSE: + setTopLevel(state); + return XML_ROLE_ENTITY_COMPLETE; + } + return common(state, tok); +} + +static int PTRCALL +notation0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NOTATION_NONE; + case XML_TOK_NAME: + state->handler = notation1; + return XML_ROLE_NOTATION_NAME; + } + return common(state, tok); +} + +static int PTRCALL +notation1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NOTATION_NONE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { + state->handler = notation3; + return XML_ROLE_NOTATION_NONE; + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { + state->handler = notation2; + return XML_ROLE_NOTATION_NONE; + } + break; + } + return common(state, tok); +} + +static int PTRCALL +notation2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NOTATION_NONE; + case XML_TOK_LITERAL: + state->handler = notation4; + return XML_ROLE_NOTATION_PUBLIC_ID; + } + return common(state, tok); +} + +static int PTRCALL +notation3(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NOTATION_NONE; + case XML_TOK_LITERAL: + state->handler = declClose; + state->role_none = XML_ROLE_NOTATION_NONE; + return XML_ROLE_NOTATION_SYSTEM_ID; + } + return common(state, tok); +} + +static int PTRCALL +notation4(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NOTATION_NONE; + case XML_TOK_LITERAL: + state->handler = declClose; + state->role_none = XML_ROLE_NOTATION_NONE; + return XML_ROLE_NOTATION_SYSTEM_ID; + case XML_TOK_DECL_CLOSE: + setTopLevel(state); + return XML_ROLE_NOTATION_NO_SYSTEM_ID; + } + return common(state, tok); +} + +static int PTRCALL +attlist0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = attlist1; + return XML_ROLE_ATTLIST_ELEMENT_NAME; + } + return common(state, tok); +} + +static int PTRCALL +attlist1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_DECL_CLOSE: + setTopLevel(state); + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = attlist2; + return XML_ROLE_ATTRIBUTE_NAME; + } + return common(state, tok); +} + +static int PTRCALL +attlist2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_NAME: + { + static const char *types[] = { + KW_CDATA, + KW_ID, + KW_IDREF, + KW_IDREFS, + KW_ENTITY, + KW_ENTITIES, + KW_NMTOKEN, + KW_NMTOKENS, + }; + int i; + for (i = 0; i < (int)(sizeof(types)/sizeof(types[0])); i++) + if (XmlNameMatchesAscii(enc, ptr, end, types[i])) { + state->handler = attlist8; + return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i; + } + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) { + state->handler = attlist5; + return XML_ROLE_ATTLIST_NONE; + } + break; + case XML_TOK_OPEN_PAREN: + state->handler = attlist3; + return XML_ROLE_ATTLIST_NONE; + } + return common(state, tok); +} + +static int PTRCALL +attlist3(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_NMTOKEN: + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = attlist4; + return XML_ROLE_ATTRIBUTE_ENUM_VALUE; + } + return common(state, tok); +} + +static int PTRCALL +attlist4(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_CLOSE_PAREN: + state->handler = attlist8; + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_OR: + state->handler = attlist3; + return XML_ROLE_ATTLIST_NONE; + } + return common(state, tok); +} + +static int PTRCALL +attlist5(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_OPEN_PAREN: + state->handler = attlist6; + return XML_ROLE_ATTLIST_NONE; + } + return common(state, tok); +} + +static int PTRCALL +attlist6(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_NAME: + state->handler = attlist7; + return XML_ROLE_ATTRIBUTE_NOTATION_VALUE; + } + return common(state, tok); +} + +static int PTRCALL +attlist7(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_CLOSE_PAREN: + state->handler = attlist8; + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_OR: + state->handler = attlist6; + return XML_ROLE_ATTLIST_NONE; + } + return common(state, tok); +} + +/* default value */ +static int PTRCALL +attlist8(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_POUND_NAME: + if (XmlNameMatchesAscii(enc, + ptr + MIN_BYTES_PER_CHAR(enc), + end, + KW_IMPLIED)) { + state->handler = attlist1; + return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE; + } + if (XmlNameMatchesAscii(enc, + ptr + MIN_BYTES_PER_CHAR(enc), + end, + KW_REQUIRED)) { + state->handler = attlist1; + return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE; + } + if (XmlNameMatchesAscii(enc, + ptr + MIN_BYTES_PER_CHAR(enc), + end, + KW_FIXED)) { + state->handler = attlist9; + return XML_ROLE_ATTLIST_NONE; + } + break; + case XML_TOK_LITERAL: + state->handler = attlist1; + return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE; + } + return common(state, tok); +} + +static int PTRCALL +attlist9(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_LITERAL: + state->handler = attlist1; + return XML_ROLE_FIXED_ATTRIBUTE_VALUE; + } + return common(state, tok); +} + +static int PTRCALL +element0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = element1; + return XML_ROLE_ELEMENT_NAME; + } + return common(state, tok); +} + +static int PTRCALL +element1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) { + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + return XML_ROLE_CONTENT_EMPTY; + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) { + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + return XML_ROLE_CONTENT_ANY; + } + break; + case XML_TOK_OPEN_PAREN: + state->handler = element2; + state->level = 1; + return XML_ROLE_GROUP_OPEN; + } + return common(state, tok); +} + +static int PTRCALL +element2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_POUND_NAME: + if (XmlNameMatchesAscii(enc, + ptr + MIN_BYTES_PER_CHAR(enc), + end, + KW_PCDATA)) { + state->handler = element3; + return XML_ROLE_CONTENT_PCDATA; + } + break; + case XML_TOK_OPEN_PAREN: + state->level = 2; + state->handler = element6; + return XML_ROLE_GROUP_OPEN; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT; + case XML_TOK_NAME_QUESTION: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT_OPT; + case XML_TOK_NAME_ASTERISK: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT_REP; + case XML_TOK_NAME_PLUS: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT_PLUS; + } + return common(state, tok); +} + +static int PTRCALL +element3(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_CLOSE_PAREN: + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + return XML_ROLE_GROUP_CLOSE; + case XML_TOK_CLOSE_PAREN_ASTERISK: + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + return XML_ROLE_GROUP_CLOSE_REP; + case XML_TOK_OR: + state->handler = element4; + return XML_ROLE_ELEMENT_NONE; + } + return common(state, tok); +} + +static int PTRCALL +element4(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = element5; + return XML_ROLE_CONTENT_ELEMENT; + } + return common(state, tok); +} + +static int PTRCALL +element5(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_CLOSE_PAREN_ASTERISK: + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + return XML_ROLE_GROUP_CLOSE_REP; + case XML_TOK_OR: + state->handler = element4; + return XML_ROLE_ELEMENT_NONE; + } + return common(state, tok); +} + +static int PTRCALL +element6(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_OPEN_PAREN: + state->level += 1; + return XML_ROLE_GROUP_OPEN; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT; + case XML_TOK_NAME_QUESTION: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT_OPT; + case XML_TOK_NAME_ASTERISK: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT_REP; + case XML_TOK_NAME_PLUS: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT_PLUS; + } + return common(state, tok); +} + +static int PTRCALL +element7(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_CLOSE_PAREN: + state->level -= 1; + if (state->level == 0) { + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + } + return XML_ROLE_GROUP_CLOSE; + case XML_TOK_CLOSE_PAREN_ASTERISK: + state->level -= 1; + if (state->level == 0) { + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + } + return XML_ROLE_GROUP_CLOSE_REP; + case XML_TOK_CLOSE_PAREN_QUESTION: + state->level -= 1; + if (state->level == 0) { + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + } + return XML_ROLE_GROUP_CLOSE_OPT; + case XML_TOK_CLOSE_PAREN_PLUS: + state->level -= 1; + if (state->level == 0) { + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + } + return XML_ROLE_GROUP_CLOSE_PLUS; + case XML_TOK_COMMA: + state->handler = element6; + return XML_ROLE_GROUP_SEQUENCE; + case XML_TOK_OR: + state->handler = element6; + return XML_ROLE_GROUP_CHOICE; + } + return common(state, tok); +} + +#ifdef XML_DTD + +static int PTRCALL +condSect0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) { + state->handler = condSect1; + return XML_ROLE_NONE; + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) { + state->handler = condSect2; + return XML_ROLE_NONE; + } + break; + } + return common(state, tok); +} + +static int PTRCALL +condSect1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_OPEN_BRACKET: + state->handler = externalSubset1; + state->includeLevel += 1; + return XML_ROLE_NONE; + } + return common(state, tok); +} + +static int PTRCALL +condSect2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_OPEN_BRACKET: + state->handler = externalSubset1; + return XML_ROLE_IGNORE_SECT; + } + return common(state, tok); +} + +#endif /* XML_DTD */ + +static int PTRCALL +declClose(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return state->role_none; + case XML_TOK_DECL_CLOSE: + setTopLevel(state); + return state->role_none; + } + return common(state, tok); +} + +static int PTRCALL +error(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + return XML_ROLE_NONE; +} + +static int FASTCALL +common(PROLOG_STATE *state, int tok) +{ +#ifdef XML_DTD + if (!state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF) + return XML_ROLE_INNER_PARAM_ENTITY_REF; +#endif + state->handler = error; + return XML_ROLE_ERROR; +} + +void +XmlPrologStateInit(PROLOG_STATE *state) +{ + state->handler = prolog0; +#ifdef XML_DTD + state->documentEntity = 1; + state->includeLevel = 0; + state->inEntityValue = 0; +#endif /* XML_DTD */ +} + +#ifdef XML_DTD + +void +XmlPrologStateInitExternalEntity(PROLOG_STATE *state) +{ + state->handler = externalSubset0; + state->documentEntity = 0; + state->includeLevel = 0; +} + +#endif /* XML_DTD */ diff --git a/reactos/lib/expat/lib/xmlrole.h b/reactos/lib/expat/lib/xmlrole.h new file mode 100644 index 00000000000..4dd9f06f976 --- /dev/null +++ b/reactos/lib/expat/lib/xmlrole.h @@ -0,0 +1,114 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#ifndef XmlRole_INCLUDED +#define XmlRole_INCLUDED 1 + +#ifdef __VMS +/* 0 1 2 3 0 1 2 3 + 1234567890123456789012345678901 1234567890123456789012345678901 */ +#define XmlPrologStateInitExternalEntity XmlPrologStateInitExternalEnt +#endif + +#include "xmltok.h" + +#ifdef __cplusplus +extern "C" { +#endif + +enum { + XML_ROLE_ERROR = -1, + XML_ROLE_NONE = 0, + XML_ROLE_XML_DECL, + XML_ROLE_INSTANCE_START, + XML_ROLE_DOCTYPE_NONE, + XML_ROLE_DOCTYPE_NAME, + XML_ROLE_DOCTYPE_SYSTEM_ID, + XML_ROLE_DOCTYPE_PUBLIC_ID, + XML_ROLE_DOCTYPE_INTERNAL_SUBSET, + XML_ROLE_DOCTYPE_CLOSE, + XML_ROLE_GENERAL_ENTITY_NAME, + XML_ROLE_PARAM_ENTITY_NAME, + XML_ROLE_ENTITY_NONE, + XML_ROLE_ENTITY_VALUE, + XML_ROLE_ENTITY_SYSTEM_ID, + XML_ROLE_ENTITY_PUBLIC_ID, + XML_ROLE_ENTITY_COMPLETE, + XML_ROLE_ENTITY_NOTATION_NAME, + XML_ROLE_NOTATION_NONE, + XML_ROLE_NOTATION_NAME, + XML_ROLE_NOTATION_SYSTEM_ID, + XML_ROLE_NOTATION_NO_SYSTEM_ID, + XML_ROLE_NOTATION_PUBLIC_ID, + XML_ROLE_ATTRIBUTE_NAME, + XML_ROLE_ATTRIBUTE_TYPE_CDATA, + XML_ROLE_ATTRIBUTE_TYPE_ID, + XML_ROLE_ATTRIBUTE_TYPE_IDREF, + XML_ROLE_ATTRIBUTE_TYPE_IDREFS, + XML_ROLE_ATTRIBUTE_TYPE_ENTITY, + XML_ROLE_ATTRIBUTE_TYPE_ENTITIES, + XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN, + XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS, + XML_ROLE_ATTRIBUTE_ENUM_VALUE, + XML_ROLE_ATTRIBUTE_NOTATION_VALUE, + XML_ROLE_ATTLIST_NONE, + XML_ROLE_ATTLIST_ELEMENT_NAME, + XML_ROLE_IMPLIED_ATTRIBUTE_VALUE, + XML_ROLE_REQUIRED_ATTRIBUTE_VALUE, + XML_ROLE_DEFAULT_ATTRIBUTE_VALUE, + XML_ROLE_FIXED_ATTRIBUTE_VALUE, + XML_ROLE_ELEMENT_NONE, + XML_ROLE_ELEMENT_NAME, + XML_ROLE_CONTENT_ANY, + XML_ROLE_CONTENT_EMPTY, + XML_ROLE_CONTENT_PCDATA, + XML_ROLE_GROUP_OPEN, + XML_ROLE_GROUP_CLOSE, + XML_ROLE_GROUP_CLOSE_REP, + XML_ROLE_GROUP_CLOSE_OPT, + XML_ROLE_GROUP_CLOSE_PLUS, + XML_ROLE_GROUP_CHOICE, + XML_ROLE_GROUP_SEQUENCE, + XML_ROLE_CONTENT_ELEMENT, + XML_ROLE_CONTENT_ELEMENT_REP, + XML_ROLE_CONTENT_ELEMENT_OPT, + XML_ROLE_CONTENT_ELEMENT_PLUS, + XML_ROLE_PI, + XML_ROLE_COMMENT, +#ifdef XML_DTD + XML_ROLE_TEXT_DECL, + XML_ROLE_IGNORE_SECT, + XML_ROLE_INNER_PARAM_ENTITY_REF, +#endif /* XML_DTD */ + XML_ROLE_PARAM_ENTITY_REF +}; + +typedef struct prolog_state { + int (PTRCALL *handler) (struct prolog_state *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc); + unsigned level; + int role_none; +#ifdef XML_DTD + unsigned includeLevel; + int documentEntity; + int inEntityValue; +#endif /* XML_DTD */ +} PROLOG_STATE; + +void XmlPrologStateInit(PROLOG_STATE *); +#ifdef XML_DTD +void XmlPrologStateInitExternalEntity(PROLOG_STATE *); +#endif /* XML_DTD */ + +#define XmlTokenRole(state, tok, ptr, end, enc) \ + (((state)->handler)(state, tok, ptr, end, enc)) + +#ifdef __cplusplus +} +#endif + +#endif /* not XmlRole_INCLUDED */ diff --git a/reactos/lib/expat/lib/xmltok.c b/reactos/lib/expat/lib/xmltok.c new file mode 100644 index 00000000000..4198381aa0b --- /dev/null +++ b/reactos/lib/expat/lib/xmltok.c @@ -0,0 +1,1634 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#ifdef COMPILED_FROM_DSP +#include "winconfig.h" +#elif defined(MACOS_CLASSIC) +#include "macconfig.h" +#else +#ifdef HAVE_EXPAT_CONFIG_H +#include "expat_config.h" +#endif +#endif /* ndef COMPILED_FROM_DSP */ + +#include "internal.h" +#include "xmltok.h" +#include "nametab.h" + +#ifdef XML_DTD +#define IGNORE_SECTION_TOK_VTABLE , PREFIX(ignoreSectionTok) +#else +#define IGNORE_SECTION_TOK_VTABLE /* as nothing */ +#endif + +#define VTABLE1 \ + { PREFIX(prologTok), PREFIX(contentTok), \ + PREFIX(cdataSectionTok) IGNORE_SECTION_TOK_VTABLE }, \ + { PREFIX(attributeValueTok), PREFIX(entityValueTok) }, \ + PREFIX(sameName), \ + PREFIX(nameMatchesAscii), \ + PREFIX(nameLength), \ + PREFIX(skipS), \ + PREFIX(getAtts), \ + PREFIX(charRefNumber), \ + PREFIX(predefinedEntityName), \ + PREFIX(updatePosition), \ + PREFIX(isPublicId) + +#define VTABLE VTABLE1, PREFIX(toUtf8), PREFIX(toUtf16) + +#define UCS2_GET_NAMING(pages, hi, lo) \ + (namingBitmap[(pages[hi] << 3) + ((lo) >> 5)] & (1 << ((lo) & 0x1F))) + +/* A 2 byte UTF-8 representation splits the characters 11 bits between + the bottom 5 and 6 bits of the bytes. We need 8 bits to index into + pages, 3 bits to add to that index and 5 bits to generate the mask. +*/ +#define UTF8_GET_NAMING2(pages, byte) \ + (namingBitmap[((pages)[(((byte)[0]) >> 2) & 7] << 3) \ + + ((((byte)[0]) & 3) << 1) \ + + ((((byte)[1]) >> 5) & 1)] \ + & (1 << (((byte)[1]) & 0x1F))) + +/* A 3 byte UTF-8 representation splits the characters 16 bits between + the bottom 4, 6 and 6 bits of the bytes. We need 8 bits to index + into pages, 3 bits to add to that index and 5 bits to generate the + mask. +*/ +#define UTF8_GET_NAMING3(pages, byte) \ + (namingBitmap[((pages)[((((byte)[0]) & 0xF) << 4) \ + + ((((byte)[1]) >> 2) & 0xF)] \ + << 3) \ + + ((((byte)[1]) & 3) << 1) \ + + ((((byte)[2]) >> 5) & 1)] \ + & (1 << (((byte)[2]) & 0x1F))) + +#define UTF8_GET_NAMING(pages, p, n) \ + ((n) == 2 \ + ? UTF8_GET_NAMING2(pages, (const unsigned char *)(p)) \ + : ((n) == 3 \ + ? UTF8_GET_NAMING3(pages, (const unsigned char *)(p)) \ + : 0)) + +/* Detection of invalid UTF-8 sequences is based on Table 3.1B + of Unicode 3.2: http://www.unicode.org/unicode/reports/tr28/ + with the additional restriction of not allowing the Unicode + code points 0xFFFF and 0xFFFE (sequences EF,BF,BF and EF,BF,BE). + Implementation details: + (A & 0x80) == 0 means A < 0x80 + and + (A & 0xC0) == 0xC0 means A > 0xBF +*/ + +#define UTF8_INVALID2(p) \ + ((*p) < 0xC2 || ((p)[1] & 0x80) == 0 || ((p)[1] & 0xC0) == 0xC0) + +#define UTF8_INVALID3(p) \ + (((p)[2] & 0x80) == 0 \ + || \ + ((*p) == 0xEF && (p)[1] == 0xBF \ + ? \ + (p)[2] > 0xBD \ + : \ + ((p)[2] & 0xC0) == 0xC0) \ + || \ + ((*p) == 0xE0 \ + ? \ + (p)[1] < 0xA0 || ((p)[1] & 0xC0) == 0xC0 \ + : \ + ((p)[1] & 0x80) == 0 \ + || \ + ((*p) == 0xED ? (p)[1] > 0x9F : ((p)[1] & 0xC0) == 0xC0))) + +#define UTF8_INVALID4(p) \ + (((p)[3] & 0x80) == 0 || ((p)[3] & 0xC0) == 0xC0 \ + || \ + ((p)[2] & 0x80) == 0 || ((p)[2] & 0xC0) == 0xC0 \ + || \ + ((*p) == 0xF0 \ + ? \ + (p)[1] < 0x90 || ((p)[1] & 0xC0) == 0xC0 \ + : \ + ((p)[1] & 0x80) == 0 \ + || \ + ((*p) == 0xF4 ? (p)[1] > 0x8F : ((p)[1] & 0xC0) == 0xC0))) + +static int PTRFASTCALL +isNever(const ENCODING *enc, const char *p) +{ + return 0; +} + +static int PTRFASTCALL +utf8_isName2(const ENCODING *enc, const char *p) +{ + return UTF8_GET_NAMING2(namePages, (const unsigned char *)p); +} + +static int PTRFASTCALL +utf8_isName3(const ENCODING *enc, const char *p) +{ + return UTF8_GET_NAMING3(namePages, (const unsigned char *)p); +} + +#define utf8_isName4 isNever + +static int PTRFASTCALL +utf8_isNmstrt2(const ENCODING *enc, const char *p) +{ + return UTF8_GET_NAMING2(nmstrtPages, (const unsigned char *)p); +} + +static int PTRFASTCALL +utf8_isNmstrt3(const ENCODING *enc, const char *p) +{ + return UTF8_GET_NAMING3(nmstrtPages, (const unsigned char *)p); +} + +#define utf8_isNmstrt4 isNever + +static int PTRFASTCALL +utf8_isInvalid2(const ENCODING *enc, const char *p) +{ + return UTF8_INVALID2((const unsigned char *)p); +} + +static int PTRFASTCALL +utf8_isInvalid3(const ENCODING *enc, const char *p) +{ + return UTF8_INVALID3((const unsigned char *)p); +} + +static int PTRFASTCALL +utf8_isInvalid4(const ENCODING *enc, const char *p) +{ + return UTF8_INVALID4((const unsigned char *)p); +} + +struct normal_encoding { + ENCODING enc; + unsigned char type[256]; +#ifdef XML_MIN_SIZE + int (PTRFASTCALL *byteType)(const ENCODING *, const char *); + int (PTRFASTCALL *isNameMin)(const ENCODING *, const char *); + int (PTRFASTCALL *isNmstrtMin)(const ENCODING *, const char *); + int (PTRFASTCALL *byteToAscii)(const ENCODING *, const char *); + int (PTRCALL *charMatches)(const ENCODING *, const char *, int); +#endif /* XML_MIN_SIZE */ + int (PTRFASTCALL *isName2)(const ENCODING *, const char *); + int (PTRFASTCALL *isName3)(const ENCODING *, const char *); + int (PTRFASTCALL *isName4)(const ENCODING *, const char *); + int (PTRFASTCALL *isNmstrt2)(const ENCODING *, const char *); + int (PTRFASTCALL *isNmstrt3)(const ENCODING *, const char *); + int (PTRFASTCALL *isNmstrt4)(const ENCODING *, const char *); + int (PTRFASTCALL *isInvalid2)(const ENCODING *, const char *); + int (PTRFASTCALL *isInvalid3)(const ENCODING *, const char *); + int (PTRFASTCALL *isInvalid4)(const ENCODING *, const char *); +}; + +#define AS_NORMAL_ENCODING(enc) ((const struct normal_encoding *) (enc)) + +#ifdef XML_MIN_SIZE + +#define STANDARD_VTABLE(E) \ + E ## byteType, \ + E ## isNameMin, \ + E ## isNmstrtMin, \ + E ## byteToAscii, \ + E ## charMatches, + +#else + +#define STANDARD_VTABLE(E) /* as nothing */ + +#endif + +#define NORMAL_VTABLE(E) \ + E ## isName2, \ + E ## isName3, \ + E ## isName4, \ + E ## isNmstrt2, \ + E ## isNmstrt3, \ + E ## isNmstrt4, \ + E ## isInvalid2, \ + E ## isInvalid3, \ + E ## isInvalid4 + +static int FASTCALL checkCharRefNumber(int); + +#include "xmltok_impl.h" +#include "ascii.h" + +#ifdef XML_MIN_SIZE +#define sb_isNameMin isNever +#define sb_isNmstrtMin isNever +#endif + +#ifdef XML_MIN_SIZE +#define MINBPC(enc) ((enc)->minBytesPerChar) +#else +/* minimum bytes per character */ +#define MINBPC(enc) 1 +#endif + +#define SB_BYTE_TYPE(enc, p) \ + (((struct normal_encoding *)(enc))->type[(unsigned char)*(p)]) + +#ifdef XML_MIN_SIZE +static int PTRFASTCALL +sb_byteType(const ENCODING *enc, const char *p) +{ + return SB_BYTE_TYPE(enc, p); +} +#define BYTE_TYPE(enc, p) \ + (AS_NORMAL_ENCODING(enc)->byteType(enc, p)) +#else +#define BYTE_TYPE(enc, p) SB_BYTE_TYPE(enc, p) +#endif + +#ifdef XML_MIN_SIZE +#define BYTE_TO_ASCII(enc, p) \ + (AS_NORMAL_ENCODING(enc)->byteToAscii(enc, p)) +static int PTRFASTCALL +sb_byteToAscii(const ENCODING *enc, const char *p) +{ + return *p; +} +#else +#define BYTE_TO_ASCII(enc, p) (*(p)) +#endif + +#define IS_NAME_CHAR(enc, p, n) \ + (AS_NORMAL_ENCODING(enc)->isName ## n(enc, p)) +#define IS_NMSTRT_CHAR(enc, p, n) \ + (AS_NORMAL_ENCODING(enc)->isNmstrt ## n(enc, p)) +#define IS_INVALID_CHAR(enc, p, n) \ + (AS_NORMAL_ENCODING(enc)->isInvalid ## n(enc, p)) + +#ifdef XML_MIN_SIZE +#define IS_NAME_CHAR_MINBPC(enc, p) \ + (AS_NORMAL_ENCODING(enc)->isNameMin(enc, p)) +#define IS_NMSTRT_CHAR_MINBPC(enc, p) \ + (AS_NORMAL_ENCODING(enc)->isNmstrtMin(enc, p)) +#else +#define IS_NAME_CHAR_MINBPC(enc, p) (0) +#define IS_NMSTRT_CHAR_MINBPC(enc, p) (0) +#endif + +#ifdef XML_MIN_SIZE +#define CHAR_MATCHES(enc, p, c) \ + (AS_NORMAL_ENCODING(enc)->charMatches(enc, p, c)) +static int PTRCALL +sb_charMatches(const ENCODING *enc, const char *p, int c) +{ + return *p == c; +} +#else +/* c is an ASCII character */ +#define CHAR_MATCHES(enc, p, c) (*(p) == c) +#endif + +#define PREFIX(ident) normal_ ## ident +#include "xmltok_impl.c" + +#undef MINBPC +#undef BYTE_TYPE +#undef BYTE_TO_ASCII +#undef CHAR_MATCHES +#undef IS_NAME_CHAR +#undef IS_NAME_CHAR_MINBPC +#undef IS_NMSTRT_CHAR +#undef IS_NMSTRT_CHAR_MINBPC +#undef IS_INVALID_CHAR + +enum { /* UTF8_cvalN is value of masked first byte of N byte sequence */ + UTF8_cval1 = 0x00, + UTF8_cval2 = 0xc0, + UTF8_cval3 = 0xe0, + UTF8_cval4 = 0xf0 +}; + +static void PTRCALL +utf8_toUtf8(const ENCODING *enc, + const char **fromP, const char *fromLim, + char **toP, const char *toLim) +{ + char *to; + const char *from; + if (fromLim - *fromP > toLim - *toP) { + /* Avoid copying partial characters. */ + for (fromLim = *fromP + (toLim - *toP); fromLim > *fromP; fromLim--) + if (((unsigned char)fromLim[-1] & 0xc0) != 0x80) + break; + } + for (to = *toP, from = *fromP; from != fromLim; from++, to++) + *to = *from; + *fromP = from; + *toP = to; +} + +static void PTRCALL +utf8_toUtf16(const ENCODING *enc, + const char **fromP, const char *fromLim, + unsigned short **toP, const unsigned short *toLim) +{ + unsigned short *to = *toP; + const char *from = *fromP; + while (from != fromLim && to != toLim) { + switch (((struct normal_encoding *)enc)->type[(unsigned char)*from]) { + case BT_LEAD2: + *to++ = (unsigned short)(((from[0] & 0x1f) << 6) | (from[1] & 0x3f)); + from += 2; + break; + case BT_LEAD3: + *to++ = (unsigned short)(((from[0] & 0xf) << 12) + | ((from[1] & 0x3f) << 6) | (from[2] & 0x3f)); + from += 3; + break; + case BT_LEAD4: + { + unsigned long n; + if (to + 1 == toLim) + goto after; + n = ((from[0] & 0x7) << 18) | ((from[1] & 0x3f) << 12) + | ((from[2] & 0x3f) << 6) | (from[3] & 0x3f); + n -= 0x10000; + to[0] = (unsigned short)((n >> 10) | 0xD800); + to[1] = (unsigned short)((n & 0x3FF) | 0xDC00); + to += 2; + from += 4; + } + break; + default: + *to++ = *from++; + break; + } + } +after: + *fromP = from; + *toP = to; +} + +#ifdef XML_NS +static const struct normal_encoding utf8_encoding_ns = { + { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, + { +#include "asciitab.h" +#include "utf8tab.h" + }, + STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) +}; +#endif + +static const struct normal_encoding utf8_encoding = { + { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, + { +#define BT_COLON BT_NMSTRT +#include "asciitab.h" +#undef BT_COLON +#include "utf8tab.h" + }, + STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) +}; + +#ifdef XML_NS + +static const struct normal_encoding internal_utf8_encoding_ns = { + { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, + { +#include "iasciitab.h" +#include "utf8tab.h" + }, + STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) +}; + +#endif + +static const struct normal_encoding internal_utf8_encoding = { + { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, + { +#define BT_COLON BT_NMSTRT +#include "iasciitab.h" +#undef BT_COLON +#include "utf8tab.h" + }, + STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) +}; + +static void PTRCALL +latin1_toUtf8(const ENCODING *enc, + const char **fromP, const char *fromLim, + char **toP, const char *toLim) +{ + for (;;) { + unsigned char c; + if (*fromP == fromLim) + break; + c = (unsigned char)**fromP; + if (c & 0x80) { + if (toLim - *toP < 2) + break; + *(*toP)++ = (char)((c >> 6) | UTF8_cval2); + *(*toP)++ = (char)((c & 0x3f) | 0x80); + (*fromP)++; + } + else { + if (*toP == toLim) + break; + *(*toP)++ = *(*fromP)++; + } + } +} + +static void PTRCALL +latin1_toUtf16(const ENCODING *enc, + const char **fromP, const char *fromLim, + unsigned short **toP, const unsigned short *toLim) +{ + while (*fromP != fromLim && *toP != toLim) + *(*toP)++ = (unsigned char)*(*fromP)++; +} + +#ifdef XML_NS + +static const struct normal_encoding latin1_encoding_ns = { + { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 }, + { +#include "asciitab.h" +#include "latin1tab.h" + }, + STANDARD_VTABLE(sb_) +}; + +#endif + +static const struct normal_encoding latin1_encoding = { + { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 }, + { +#define BT_COLON BT_NMSTRT +#include "asciitab.h" +#undef BT_COLON +#include "latin1tab.h" + }, + STANDARD_VTABLE(sb_) +}; + +static void PTRCALL +ascii_toUtf8(const ENCODING *enc, + const char **fromP, const char *fromLim, + char **toP, const char *toLim) +{ + while (*fromP != fromLim && *toP != toLim) + *(*toP)++ = *(*fromP)++; +} + +#ifdef XML_NS + +static const struct normal_encoding ascii_encoding_ns = { + { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 }, + { +#include "asciitab.h" +/* BT_NONXML == 0 */ + }, + STANDARD_VTABLE(sb_) +}; + +#endif + +static const struct normal_encoding ascii_encoding = { + { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 }, + { +#define BT_COLON BT_NMSTRT +#include "asciitab.h" +#undef BT_COLON +/* BT_NONXML == 0 */ + }, + STANDARD_VTABLE(sb_) +}; + +static int PTRFASTCALL +unicode_byte_type(char hi, char lo) +{ + switch ((unsigned char)hi) { + case 0xD8: case 0xD9: case 0xDA: case 0xDB: + return BT_LEAD4; + case 0xDC: case 0xDD: case 0xDE: case 0xDF: + return BT_TRAIL; + case 0xFF: + switch ((unsigned char)lo) { + case 0xFF: + case 0xFE: + return BT_NONXML; + } + break; + } + return BT_NONASCII; +} + +#define DEFINE_UTF16_TO_UTF8(E) \ +static void PTRCALL \ +E ## toUtf8(const ENCODING *enc, \ + const char **fromP, const char *fromLim, \ + char **toP, const char *toLim) \ +{ \ + const char *from; \ + for (from = *fromP; from != fromLim; from += 2) { \ + int plane; \ + unsigned char lo2; \ + unsigned char lo = GET_LO(from); \ + unsigned char hi = GET_HI(from); \ + switch (hi) { \ + case 0: \ + if (lo < 0x80) { \ + if (*toP == toLim) { \ + *fromP = from; \ + return; \ + } \ + *(*toP)++ = lo; \ + break; \ + } \ + /* fall through */ \ + case 0x1: case 0x2: case 0x3: \ + case 0x4: case 0x5: case 0x6: case 0x7: \ + if (toLim - *toP < 2) { \ + *fromP = from; \ + return; \ + } \ + *(*toP)++ = ((lo >> 6) | (hi << 2) | UTF8_cval2); \ + *(*toP)++ = ((lo & 0x3f) | 0x80); \ + break; \ + default: \ + if (toLim - *toP < 3) { \ + *fromP = from; \ + return; \ + } \ + /* 16 bits divided 4, 6, 6 amongst 3 bytes */ \ + *(*toP)++ = ((hi >> 4) | UTF8_cval3); \ + *(*toP)++ = (((hi & 0xf) << 2) | (lo >> 6) | 0x80); \ + *(*toP)++ = ((lo & 0x3f) | 0x80); \ + break; \ + case 0xD8: case 0xD9: case 0xDA: case 0xDB: \ + if (toLim - *toP < 4) { \ + *fromP = from; \ + return; \ + } \ + plane = (((hi & 0x3) << 2) | ((lo >> 6) & 0x3)) + 1; \ + *(*toP)++ = ((plane >> 2) | UTF8_cval4); \ + *(*toP)++ = (((lo >> 2) & 0xF) | ((plane & 0x3) << 4) | 0x80); \ + from += 2; \ + lo2 = GET_LO(from); \ + *(*toP)++ = (((lo & 0x3) << 4) \ + | ((GET_HI(from) & 0x3) << 2) \ + | (lo2 >> 6) \ + | 0x80); \ + *(*toP)++ = ((lo2 & 0x3f) | 0x80); \ + break; \ + } \ + } \ + *fromP = from; \ +} + +#define DEFINE_UTF16_TO_UTF16(E) \ +static void PTRCALL \ +E ## toUtf16(const ENCODING *enc, \ + const char **fromP, const char *fromLim, \ + unsigned short **toP, const unsigned short *toLim) \ +{ \ + /* Avoid copying first half only of surrogate */ \ + if (fromLim - *fromP > ((toLim - *toP) << 1) \ + && (GET_HI(fromLim - 2) & 0xF8) == 0xD8) \ + fromLim -= 2; \ + for (; *fromP != fromLim && *toP != toLim; *fromP += 2) \ + *(*toP)++ = (GET_HI(*fromP) << 8) | GET_LO(*fromP); \ +} + +#define SET2(ptr, ch) \ + (((ptr)[0] = ((ch) & 0xff)), ((ptr)[1] = ((ch) >> 8))) +#define GET_LO(ptr) ((unsigned char)(ptr)[0]) +#define GET_HI(ptr) ((unsigned char)(ptr)[1]) + +DEFINE_UTF16_TO_UTF8(little2_) +DEFINE_UTF16_TO_UTF16(little2_) + +#undef SET2 +#undef GET_LO +#undef GET_HI + +#define SET2(ptr, ch) \ + (((ptr)[0] = ((ch) >> 8)), ((ptr)[1] = ((ch) & 0xFF))) +#define GET_LO(ptr) ((unsigned char)(ptr)[1]) +#define GET_HI(ptr) ((unsigned char)(ptr)[0]) + +DEFINE_UTF16_TO_UTF8(big2_) +DEFINE_UTF16_TO_UTF16(big2_) + +#undef SET2 +#undef GET_LO +#undef GET_HI + +#define LITTLE2_BYTE_TYPE(enc, p) \ + ((p)[1] == 0 \ + ? ((struct normal_encoding *)(enc))->type[(unsigned char)*(p)] \ + : unicode_byte_type((p)[1], (p)[0])) +#define LITTLE2_BYTE_TO_ASCII(enc, p) ((p)[1] == 0 ? (p)[0] : -1) +#define LITTLE2_CHAR_MATCHES(enc, p, c) ((p)[1] == 0 && (p)[0] == c) +#define LITTLE2_IS_NAME_CHAR_MINBPC(enc, p) \ + UCS2_GET_NAMING(namePages, (unsigned char)p[1], (unsigned char)p[0]) +#define LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p) \ + UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[1], (unsigned char)p[0]) + +#ifdef XML_MIN_SIZE + +static int PTRFASTCALL +little2_byteType(const ENCODING *enc, const char *p) +{ + return LITTLE2_BYTE_TYPE(enc, p); +} + +static int PTRFASTCALL +little2_byteToAscii(const ENCODING *enc, const char *p) +{ + return LITTLE2_BYTE_TO_ASCII(enc, p); +} + +static int PTRCALL +little2_charMatches(const ENCODING *enc, const char *p, int c) +{ + return LITTLE2_CHAR_MATCHES(enc, p, c); +} + +static int PTRFASTCALL +little2_isNameMin(const ENCODING *enc, const char *p) +{ + return LITTLE2_IS_NAME_CHAR_MINBPC(enc, p); +} + +static int PTRFASTCALL +little2_isNmstrtMin(const ENCODING *enc, const char *p) +{ + return LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p); +} + +#undef VTABLE +#define VTABLE VTABLE1, little2_toUtf8, little2_toUtf16 + +#else /* not XML_MIN_SIZE */ + +#undef PREFIX +#define PREFIX(ident) little2_ ## ident +#define MINBPC(enc) 2 +/* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */ +#define BYTE_TYPE(enc, p) LITTLE2_BYTE_TYPE(enc, p) +#define BYTE_TO_ASCII(enc, p) LITTLE2_BYTE_TO_ASCII(enc, p) +#define CHAR_MATCHES(enc, p, c) LITTLE2_CHAR_MATCHES(enc, p, c) +#define IS_NAME_CHAR(enc, p, n) 0 +#define IS_NAME_CHAR_MINBPC(enc, p) LITTLE2_IS_NAME_CHAR_MINBPC(enc, p) +#define IS_NMSTRT_CHAR(enc, p, n) (0) +#define IS_NMSTRT_CHAR_MINBPC(enc, p) LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p) + +#include "xmltok_impl.c" + +#undef MINBPC +#undef BYTE_TYPE +#undef BYTE_TO_ASCII +#undef CHAR_MATCHES +#undef IS_NAME_CHAR +#undef IS_NAME_CHAR_MINBPC +#undef IS_NMSTRT_CHAR +#undef IS_NMSTRT_CHAR_MINBPC +#undef IS_INVALID_CHAR + +#endif /* not XML_MIN_SIZE */ + +#ifdef XML_NS + +static const struct normal_encoding little2_encoding_ns = { + { VTABLE, 2, 0, +#if BYTEORDER == 1234 + 1 +#else + 0 +#endif + }, + { +#include "asciitab.h" +#include "latin1tab.h" + }, + STANDARD_VTABLE(little2_) +}; + +#endif + +static const struct normal_encoding little2_encoding = { + { VTABLE, 2, 0, +#if BYTEORDER == 1234 + 1 +#else + 0 +#endif + }, + { +#define BT_COLON BT_NMSTRT +#include "asciitab.h" +#undef BT_COLON +#include "latin1tab.h" + }, + STANDARD_VTABLE(little2_) +}; + +#if BYTEORDER != 4321 + +#ifdef XML_NS + +static const struct normal_encoding internal_little2_encoding_ns = { + { VTABLE, 2, 0, 1 }, + { +#include "iasciitab.h" +#include "latin1tab.h" + }, + STANDARD_VTABLE(little2_) +}; + +#endif + +static const struct normal_encoding internal_little2_encoding = { + { VTABLE, 2, 0, 1 }, + { +#define BT_COLON BT_NMSTRT +#include "iasciitab.h" +#undef BT_COLON +#include "latin1tab.h" + }, + STANDARD_VTABLE(little2_) +}; + +#endif + + +#define BIG2_BYTE_TYPE(enc, p) \ + ((p)[0] == 0 \ + ? ((struct normal_encoding *)(enc))->type[(unsigned char)(p)[1]] \ + : unicode_byte_type((p)[0], (p)[1])) +#define BIG2_BYTE_TO_ASCII(enc, p) ((p)[0] == 0 ? (p)[1] : -1) +#define BIG2_CHAR_MATCHES(enc, p, c) ((p)[0] == 0 && (p)[1] == c) +#define BIG2_IS_NAME_CHAR_MINBPC(enc, p) \ + UCS2_GET_NAMING(namePages, (unsigned char)p[0], (unsigned char)p[1]) +#define BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p) \ + UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[0], (unsigned char)p[1]) + +#ifdef XML_MIN_SIZE + +static int PTRFASTCALL +big2_byteType(const ENCODING *enc, const char *p) +{ + return BIG2_BYTE_TYPE(enc, p); +} + +static int PTRFASTCALL +big2_byteToAscii(const ENCODING *enc, const char *p) +{ + return BIG2_BYTE_TO_ASCII(enc, p); +} + +static int PTRCALL +big2_charMatches(const ENCODING *enc, const char *p, int c) +{ + return BIG2_CHAR_MATCHES(enc, p, c); +} + +static int PTRFASTCALL +big2_isNameMin(const ENCODING *enc, const char *p) +{ + return BIG2_IS_NAME_CHAR_MINBPC(enc, p); +} + +static int PTRFASTCALL +big2_isNmstrtMin(const ENCODING *enc, const char *p) +{ + return BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p); +} + +#undef VTABLE +#define VTABLE VTABLE1, big2_toUtf8, big2_toUtf16 + +#else /* not XML_MIN_SIZE */ + +#undef PREFIX +#define PREFIX(ident) big2_ ## ident +#define MINBPC(enc) 2 +/* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */ +#define BYTE_TYPE(enc, p) BIG2_BYTE_TYPE(enc, p) +#define BYTE_TO_ASCII(enc, p) BIG2_BYTE_TO_ASCII(enc, p) +#define CHAR_MATCHES(enc, p, c) BIG2_CHAR_MATCHES(enc, p, c) +#define IS_NAME_CHAR(enc, p, n) 0 +#define IS_NAME_CHAR_MINBPC(enc, p) BIG2_IS_NAME_CHAR_MINBPC(enc, p) +#define IS_NMSTRT_CHAR(enc, p, n) (0) +#define IS_NMSTRT_CHAR_MINBPC(enc, p) BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p) + +#include "xmltok_impl.c" + +#undef MINBPC +#undef BYTE_TYPE +#undef BYTE_TO_ASCII +#undef CHAR_MATCHES +#undef IS_NAME_CHAR +#undef IS_NAME_CHAR_MINBPC +#undef IS_NMSTRT_CHAR +#undef IS_NMSTRT_CHAR_MINBPC +#undef IS_INVALID_CHAR + +#endif /* not XML_MIN_SIZE */ + +#ifdef XML_NS + +static const struct normal_encoding big2_encoding_ns = { + { VTABLE, 2, 0, +#if BYTEORDER == 4321 + 1 +#else + 0 +#endif + }, + { +#include "asciitab.h" +#include "latin1tab.h" + }, + STANDARD_VTABLE(big2_) +}; + +#endif + +static const struct normal_encoding big2_encoding = { + { VTABLE, 2, 0, +#if BYTEORDER == 4321 + 1 +#else + 0 +#endif + }, + { +#define BT_COLON BT_NMSTRT +#include "asciitab.h" +#undef BT_COLON +#include "latin1tab.h" + }, + STANDARD_VTABLE(big2_) +}; + +#if BYTEORDER != 1234 + +#ifdef XML_NS + +static const struct normal_encoding internal_big2_encoding_ns = { + { VTABLE, 2, 0, 1 }, + { +#include "iasciitab.h" +#include "latin1tab.h" + }, + STANDARD_VTABLE(big2_) +}; + +#endif + +static const struct normal_encoding internal_big2_encoding = { + { VTABLE, 2, 0, 1 }, + { +#define BT_COLON BT_NMSTRT +#include "iasciitab.h" +#undef BT_COLON +#include "latin1tab.h" + }, + STANDARD_VTABLE(big2_) +}; + +#endif + +#undef PREFIX + +static int FASTCALL +streqci(const char *s1, const char *s2) +{ + for (;;) { + char c1 = *s1++; + char c2 = *s2++; + if (ASCII_a <= c1 && c1 <= ASCII_z) + c1 += ASCII_A - ASCII_a; + if (ASCII_a <= c2 && c2 <= ASCII_z) + c2 += ASCII_A - ASCII_a; + if (c1 != c2) + return 0; + if (!c1) + break; + } + return 1; +} + +static void PTRCALL +initUpdatePosition(const ENCODING *enc, const char *ptr, + const char *end, POSITION *pos) +{ + normal_updatePosition(&utf8_encoding.enc, ptr, end, pos); +} + +static int +toAscii(const ENCODING *enc, const char *ptr, const char *end) +{ + char buf[1]; + char *p = buf; + XmlUtf8Convert(enc, &ptr, end, &p, p + 1); + if (p == buf) + return -1; + else + return buf[0]; +} + +static int FASTCALL +isSpace(int c) +{ + switch (c) { + case 0x20: + case 0xD: + case 0xA: + case 0x9: + return 1; + } + return 0; +} + +/* Return 1 if there's just optional white space or there's an S + followed by name=val. +*/ +static int +parsePseudoAttribute(const ENCODING *enc, + const char *ptr, + const char *end, + const char **namePtr, + const char **nameEndPtr, + const char **valPtr, + const char **nextTokPtr) +{ + int c; + char open; + if (ptr == end) { + *namePtr = NULL; + return 1; + } + if (!isSpace(toAscii(enc, ptr, end))) { + *nextTokPtr = ptr; + return 0; + } + do { + ptr += enc->minBytesPerChar; + } while (isSpace(toAscii(enc, ptr, end))); + if (ptr == end) { + *namePtr = NULL; + return 1; + } + *namePtr = ptr; + for (;;) { + c = toAscii(enc, ptr, end); + if (c == -1) { + *nextTokPtr = ptr; + return 0; + } + if (c == ASCII_EQUALS) { + *nameEndPtr = ptr; + break; + } + if (isSpace(c)) { + *nameEndPtr = ptr; + do { + ptr += enc->minBytesPerChar; + } while (isSpace(c = toAscii(enc, ptr, end))); + if (c != ASCII_EQUALS) { + *nextTokPtr = ptr; + return 0; + } + break; + } + ptr += enc->minBytesPerChar; + } + if (ptr == *namePtr) { + *nextTokPtr = ptr; + return 0; + } + ptr += enc->minBytesPerChar; + c = toAscii(enc, ptr, end); + while (isSpace(c)) { + ptr += enc->minBytesPerChar; + c = toAscii(enc, ptr, end); + } + if (c != ASCII_QUOT && c != ASCII_APOS) { + *nextTokPtr = ptr; + return 0; + } + open = (char)c; + ptr += enc->minBytesPerChar; + *valPtr = ptr; + for (;; ptr += enc->minBytesPerChar) { + c = toAscii(enc, ptr, end); + if (c == open) + break; + if (!(ASCII_a <= c && c <= ASCII_z) + && !(ASCII_A <= c && c <= ASCII_Z) + && !(ASCII_0 <= c && c <= ASCII_9) + && c != ASCII_PERIOD + && c != ASCII_MINUS + && c != ASCII_UNDERSCORE) { + *nextTokPtr = ptr; + return 0; + } + } + *nextTokPtr = ptr + enc->minBytesPerChar; + return 1; +} + +static const char KW_version[] = { + ASCII_v, ASCII_e, ASCII_r, ASCII_s, ASCII_i, ASCII_o, ASCII_n, '\0' +}; + +static const char KW_encoding[] = { + ASCII_e, ASCII_n, ASCII_c, ASCII_o, ASCII_d, ASCII_i, ASCII_n, ASCII_g, '\0' +}; + +static const char KW_standalone[] = { + ASCII_s, ASCII_t, ASCII_a, ASCII_n, ASCII_d, ASCII_a, ASCII_l, ASCII_o, + ASCII_n, ASCII_e, '\0' +}; + +static const char KW_yes[] = { + ASCII_y, ASCII_e, ASCII_s, '\0' +}; + +static const char KW_no[] = { + ASCII_n, ASCII_o, '\0' +}; + +static int +doParseXmlDecl(const ENCODING *(*encodingFinder)(const ENCODING *, + const char *, + const char *), + int isGeneralTextEntity, + const ENCODING *enc, + const char *ptr, + const char *end, + const char **badPtr, + const char **versionPtr, + const char **versionEndPtr, + const char **encodingName, + const ENCODING **encoding, + int *standalone) +{ + const char *val = NULL; + const char *name = NULL; + const char *nameEnd = NULL; + ptr += 5 * enc->minBytesPerChar; + end -= 2 * enc->minBytesPerChar; + if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr) + || !name) { + *badPtr = ptr; + return 0; + } + if (!XmlNameMatchesAscii(enc, name, nameEnd, KW_version)) { + if (!isGeneralTextEntity) { + *badPtr = name; + return 0; + } + } + else { + if (versionPtr) + *versionPtr = val; + if (versionEndPtr) + *versionEndPtr = ptr; + if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) { + *badPtr = ptr; + return 0; + } + if (!name) { + if (isGeneralTextEntity) { + /* a TextDecl must have an EncodingDecl */ + *badPtr = ptr; + return 0; + } + return 1; + } + } + if (XmlNameMatchesAscii(enc, name, nameEnd, KW_encoding)) { + int c = toAscii(enc, val, end); + if (!(ASCII_a <= c && c <= ASCII_z) && !(ASCII_A <= c && c <= ASCII_Z)) { + *badPtr = val; + return 0; + } + if (encodingName) + *encodingName = val; + if (encoding) + *encoding = encodingFinder(enc, val, ptr - enc->minBytesPerChar); + if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) { + *badPtr = ptr; + return 0; + } + if (!name) + return 1; + } + if (!XmlNameMatchesAscii(enc, name, nameEnd, KW_standalone) + || isGeneralTextEntity) { + *badPtr = name; + return 0; + } + if (XmlNameMatchesAscii(enc, val, ptr - enc->minBytesPerChar, KW_yes)) { + if (standalone) + *standalone = 1; + } + else if (XmlNameMatchesAscii(enc, val, ptr - enc->minBytesPerChar, KW_no)) { + if (standalone) + *standalone = 0; + } + else { + *badPtr = val; + return 0; + } + while (isSpace(toAscii(enc, ptr, end))) + ptr += enc->minBytesPerChar; + if (ptr != end) { + *badPtr = ptr; + return 0; + } + return 1; +} + +static int FASTCALL +checkCharRefNumber(int result) +{ + switch (result >> 8) { + case 0xD8: case 0xD9: case 0xDA: case 0xDB: + case 0xDC: case 0xDD: case 0xDE: case 0xDF: + return -1; + case 0: + if (latin1_encoding.type[result] == BT_NONXML) + return -1; + break; + case 0xFF: + if (result == 0xFFFE || result == 0xFFFF) + return -1; + break; + } + return result; +} + +int FASTCALL +XmlUtf8Encode(int c, char *buf) +{ + enum { + /* minN is minimum legal resulting value for N byte sequence */ + min2 = 0x80, + min3 = 0x800, + min4 = 0x10000 + }; + + if (c < 0) + return 0; + if (c < min2) { + buf[0] = (char)(c | UTF8_cval1); + return 1; + } + if (c < min3) { + buf[0] = (char)((c >> 6) | UTF8_cval2); + buf[1] = (char)((c & 0x3f) | 0x80); + return 2; + } + if (c < min4) { + buf[0] = (char)((c >> 12) | UTF8_cval3); + buf[1] = (char)(((c >> 6) & 0x3f) | 0x80); + buf[2] = (char)((c & 0x3f) | 0x80); + return 3; + } + if (c < 0x110000) { + buf[0] = (char)((c >> 18) | UTF8_cval4); + buf[1] = (char)(((c >> 12) & 0x3f) | 0x80); + buf[2] = (char)(((c >> 6) & 0x3f) | 0x80); + buf[3] = (char)((c & 0x3f) | 0x80); + return 4; + } + return 0; +} + +int FASTCALL +XmlUtf16Encode(int charNum, unsigned short *buf) +{ + if (charNum < 0) + return 0; + if (charNum < 0x10000) { + buf[0] = (unsigned short)charNum; + return 1; + } + if (charNum < 0x110000) { + charNum -= 0x10000; + buf[0] = (unsigned short)((charNum >> 10) + 0xD800); + buf[1] = (unsigned short)((charNum & 0x3FF) + 0xDC00); + return 2; + } + return 0; +} + +struct unknown_encoding { + struct normal_encoding normal; + int (*convert)(void *userData, const char *p); + void *userData; + unsigned short utf16[256]; + char utf8[256][4]; +}; + +#define AS_UNKNOWN_ENCODING(enc) ((const struct unknown_encoding *) (enc)) + +int +XmlSizeOfUnknownEncoding(void) +{ + return sizeof(struct unknown_encoding); +} + +static int PTRFASTCALL +unknown_isName(const ENCODING *enc, const char *p) +{ + const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); + int c = uenc->convert(uenc->userData, p); + if (c & ~0xFFFF) + return 0; + return UCS2_GET_NAMING(namePages, c >> 8, c & 0xFF); +} + +static int PTRFASTCALL +unknown_isNmstrt(const ENCODING *enc, const char *p) +{ + const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); + int c = uenc->convert(uenc->userData, p); + if (c & ~0xFFFF) + return 0; + return UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xFF); +} + +static int PTRFASTCALL +unknown_isInvalid(const ENCODING *enc, const char *p) +{ + const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); + int c = uenc->convert(uenc->userData, p); + return (c & ~0xFFFF) || checkCharRefNumber(c) < 0; +} + +static void PTRCALL +unknown_toUtf8(const ENCODING *enc, + const char **fromP, const char *fromLim, + char **toP, const char *toLim) +{ + const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); + char buf[XML_UTF8_ENCODE_MAX]; + for (;;) { + const char *utf8; + int n; + if (*fromP == fromLim) + break; + utf8 = uenc->utf8[(unsigned char)**fromP]; + n = *utf8++; + if (n == 0) { + int c = uenc->convert(uenc->userData, *fromP); + n = XmlUtf8Encode(c, buf); + if (n > toLim - *toP) + break; + utf8 = buf; + *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP] + - (BT_LEAD2 - 2)); + } + else { + if (n > toLim - *toP) + break; + (*fromP)++; + } + do { + *(*toP)++ = *utf8++; + } while (--n != 0); + } +} + +static void PTRCALL +unknown_toUtf16(const ENCODING *enc, + const char **fromP, const char *fromLim, + unsigned short **toP, const unsigned short *toLim) +{ + const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); + while (*fromP != fromLim && *toP != toLim) { + unsigned short c = uenc->utf16[(unsigned char)**fromP]; + if (c == 0) { + c = (unsigned short) + uenc->convert(uenc->userData, *fromP); + *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP] + - (BT_LEAD2 - 2)); + } + else + (*fromP)++; + *(*toP)++ = c; + } +} + +ENCODING * +XmlInitUnknownEncoding(void *mem, + int *table, + CONVERTER convert, + void *userData) +{ + int i; + struct unknown_encoding *e = (struct unknown_encoding *)mem; + for (i = 0; i < (int)sizeof(struct normal_encoding); i++) + ((char *)mem)[i] = ((char *)&latin1_encoding)[i]; + for (i = 0; i < 128; i++) + if (latin1_encoding.type[i] != BT_OTHER + && latin1_encoding.type[i] != BT_NONXML + && table[i] != i) + return 0; + for (i = 0; i < 256; i++) { + int c = table[i]; + if (c == -1) { + e->normal.type[i] = BT_MALFORM; + /* This shouldn't really get used. */ + e->utf16[i] = 0xFFFF; + e->utf8[i][0] = 1; + e->utf8[i][1] = 0; + } + else if (c < 0) { + if (c < -4) + return 0; + e->normal.type[i] = (unsigned char)(BT_LEAD2 - (c + 2)); + e->utf8[i][0] = 0; + e->utf16[i] = 0; + } + else if (c < 0x80) { + if (latin1_encoding.type[c] != BT_OTHER + && latin1_encoding.type[c] != BT_NONXML + && c != i) + return 0; + e->normal.type[i] = latin1_encoding.type[c]; + e->utf8[i][0] = 1; + e->utf8[i][1] = (char)c; + e->utf16[i] = (unsigned short)(c == 0 ? 0xFFFF : c); + } + else if (checkCharRefNumber(c) < 0) { + e->normal.type[i] = BT_NONXML; + /* This shouldn't really get used. */ + e->utf16[i] = 0xFFFF; + e->utf8[i][0] = 1; + e->utf8[i][1] = 0; + } + else { + if (c > 0xFFFF) + return 0; + if (UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xff)) + e->normal.type[i] = BT_NMSTRT; + else if (UCS2_GET_NAMING(namePages, c >> 8, c & 0xff)) + e->normal.type[i] = BT_NAME; + else + e->normal.type[i] = BT_OTHER; + e->utf8[i][0] = (char)XmlUtf8Encode(c, e->utf8[i] + 1); + e->utf16[i] = (unsigned short)c; + } + } + e->userData = userData; + e->convert = convert; + if (convert) { + e->normal.isName2 = unknown_isName; + e->normal.isName3 = unknown_isName; + e->normal.isName4 = unknown_isName; + e->normal.isNmstrt2 = unknown_isNmstrt; + e->normal.isNmstrt3 = unknown_isNmstrt; + e->normal.isNmstrt4 = unknown_isNmstrt; + e->normal.isInvalid2 = unknown_isInvalid; + e->normal.isInvalid3 = unknown_isInvalid; + e->normal.isInvalid4 = unknown_isInvalid; + } + e->normal.enc.utf8Convert = unknown_toUtf8; + e->normal.enc.utf16Convert = unknown_toUtf16; + return &(e->normal.enc); +} + +/* If this enumeration is changed, getEncodingIndex and encodings +must also be changed. */ +enum { + UNKNOWN_ENC = -1, + ISO_8859_1_ENC = 0, + US_ASCII_ENC, + UTF_8_ENC, + UTF_16_ENC, + UTF_16BE_ENC, + UTF_16LE_ENC, + /* must match encodingNames up to here */ + NO_ENC +}; + +static const char KW_ISO_8859_1[] = { + ASCII_I, ASCII_S, ASCII_O, ASCII_MINUS, ASCII_8, ASCII_8, ASCII_5, ASCII_9, + ASCII_MINUS, ASCII_1, '\0' +}; +static const char KW_US_ASCII[] = { + ASCII_U, ASCII_S, ASCII_MINUS, ASCII_A, ASCII_S, ASCII_C, ASCII_I, ASCII_I, + '\0' +}; +static const char KW_UTF_8[] = { + ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_8, '\0' +}; +static const char KW_UTF_16[] = { + ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, '\0' +}; +static const char KW_UTF_16BE[] = { + ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, ASCII_B, ASCII_E, + '\0' +}; +static const char KW_UTF_16LE[] = { + ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, ASCII_L, ASCII_E, + '\0' +}; + +static int FASTCALL +getEncodingIndex(const char *name) +{ + static const char *encodingNames[] = { + KW_ISO_8859_1, + KW_US_ASCII, + KW_UTF_8, + KW_UTF_16, + KW_UTF_16BE, + KW_UTF_16LE, + }; + int i; + if (name == NULL) + return NO_ENC; + for (i = 0; i < (int)(sizeof(encodingNames)/sizeof(encodingNames[0])); i++) + if (streqci(name, encodingNames[i])) + return i; + return UNKNOWN_ENC; +} + +/* For binary compatibility, we store the index of the encoding + specified at initialization in the isUtf16 member. +*/ + +#define INIT_ENC_INDEX(enc) ((int)(enc)->initEnc.isUtf16) +#define SET_INIT_ENC_INDEX(enc, i) ((enc)->initEnc.isUtf16 = (char)i) + +/* This is what detects the encoding. encodingTable maps from + encoding indices to encodings; INIT_ENC_INDEX(enc) is the index of + the external (protocol) specified encoding; state is + XML_CONTENT_STATE if we're parsing an external text entity, and + XML_PROLOG_STATE otherwise. +*/ + + +static int +initScan(const ENCODING **encodingTable, + const INIT_ENCODING *enc, + int state, + const char *ptr, + const char *end, + const char **nextTokPtr) +{ + const ENCODING **encPtr; + + if (ptr == end) + return XML_TOK_NONE; + encPtr = enc->encPtr; + if (ptr + 1 == end) { + /* only a single byte available for auto-detection */ +#ifndef XML_DTD /* FIXME */ + /* a well-formed document entity must have more than one byte */ + if (state != XML_CONTENT_STATE) + return XML_TOK_PARTIAL; +#endif + /* so we're parsing an external text entity... */ + /* if UTF-16 was externally specified, then we need at least 2 bytes */ + switch (INIT_ENC_INDEX(enc)) { + case UTF_16_ENC: + case UTF_16LE_ENC: + case UTF_16BE_ENC: + return XML_TOK_PARTIAL; + } + switch ((unsigned char)*ptr) { + case 0xFE: + case 0xFF: + case 0xEF: /* possibly first byte of UTF-8 BOM */ + if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC + && state == XML_CONTENT_STATE) + break; + /* fall through */ + case 0x00: + case 0x3C: + return XML_TOK_PARTIAL; + } + } + else { + switch (((unsigned char)ptr[0] << 8) | (unsigned char)ptr[1]) { + case 0xFEFF: + if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC + && state == XML_CONTENT_STATE) + break; + *nextTokPtr = ptr + 2; + *encPtr = encodingTable[UTF_16BE_ENC]; + return XML_TOK_BOM; + /* 00 3C is handled in the default case */ + case 0x3C00: + if ((INIT_ENC_INDEX(enc) == UTF_16BE_ENC + || INIT_ENC_INDEX(enc) == UTF_16_ENC) + && state == XML_CONTENT_STATE) + break; + *encPtr = encodingTable[UTF_16LE_ENC]; + return XmlTok(*encPtr, state, ptr, end, nextTokPtr); + case 0xFFFE: + if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC + && state == XML_CONTENT_STATE) + break; + *nextTokPtr = ptr + 2; + *encPtr = encodingTable[UTF_16LE_ENC]; + return XML_TOK_BOM; + case 0xEFBB: + /* Maybe a UTF-8 BOM (EF BB BF) */ + /* If there's an explicitly specified (external) encoding + of ISO-8859-1 or some flavour of UTF-16 + and this is an external text entity, + don't look for the BOM, + because it might be a legal data. + */ + if (state == XML_CONTENT_STATE) { + int e = INIT_ENC_INDEX(enc); + if (e == ISO_8859_1_ENC || e == UTF_16BE_ENC + || e == UTF_16LE_ENC || e == UTF_16_ENC) + break; + } + if (ptr + 2 == end) + return XML_TOK_PARTIAL; + if ((unsigned char)ptr[2] == 0xBF) { + *nextTokPtr = ptr + 3; + *encPtr = encodingTable[UTF_8_ENC]; + return XML_TOK_BOM; + } + break; + default: + if (ptr[0] == '\0') { + /* 0 isn't a legal data character. Furthermore a document + entity can only start with ASCII characters. So the only + way this can fail to be big-endian UTF-16 if it it's an + external parsed general entity that's labelled as + UTF-16LE. + */ + if (state == XML_CONTENT_STATE && INIT_ENC_INDEX(enc) == UTF_16LE_ENC) + break; + *encPtr = encodingTable[UTF_16BE_ENC]; + return XmlTok(*encPtr, state, ptr, end, nextTokPtr); + } + else if (ptr[1] == '\0') { + /* We could recover here in the case: + - parsing an external entity + - second byte is 0 + - no externally specified encoding + - no encoding declaration + by assuming UTF-16LE. But we don't, because this would mean when + presented just with a single byte, we couldn't reliably determine + whether we needed further bytes. + */ + if (state == XML_CONTENT_STATE) + break; + *encPtr = encodingTable[UTF_16LE_ENC]; + return XmlTok(*encPtr, state, ptr, end, nextTokPtr); + } + break; + } + } + *encPtr = encodingTable[INIT_ENC_INDEX(enc)]; + return XmlTok(*encPtr, state, ptr, end, nextTokPtr); +} + + +#define NS(x) x +#define ns(x) x +#include "xmltok_ns.c" +#undef NS +#undef ns + +#ifdef XML_NS + +#define NS(x) x ## NS +#define ns(x) x ## _ns + +#include "xmltok_ns.c" + +#undef NS +#undef ns + +ENCODING * +XmlInitUnknownEncodingNS(void *mem, + int *table, + CONVERTER convert, + void *userData) +{ + ENCODING *enc = XmlInitUnknownEncoding(mem, table, convert, userData); + if (enc) + ((struct normal_encoding *)enc)->type[ASCII_COLON] = BT_COLON; + return enc; +} + +#endif /* XML_NS */ diff --git a/reactos/lib/expat/lib/xmltok.h b/reactos/lib/expat/lib/xmltok.h new file mode 100644 index 00000000000..3d776be71fc --- /dev/null +++ b/reactos/lib/expat/lib/xmltok.h @@ -0,0 +1,315 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#ifndef XmlTok_INCLUDED +#define XmlTok_INCLUDED 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* The following token may be returned by XmlContentTok */ +#define XML_TOK_TRAILING_RSQB -5 /* ] or ]] at the end of the scan; might be + start of illegal ]]> sequence */ +/* The following tokens may be returned by both XmlPrologTok and + XmlContentTok. +*/ +#define XML_TOK_NONE -4 /* The string to be scanned is empty */ +#define XML_TOK_TRAILING_CR -3 /* A CR at the end of the scan; + might be part of CRLF sequence */ +#define XML_TOK_PARTIAL_CHAR -2 /* only part of a multibyte sequence */ +#define XML_TOK_PARTIAL -1 /* only part of a token */ +#define XML_TOK_INVALID 0 + +/* The following tokens are returned by XmlContentTok; some are also + returned by XmlAttributeValueTok, XmlEntityTok, XmlCdataSectionTok. +*/ +#define XML_TOK_START_TAG_WITH_ATTS 1 +#define XML_TOK_START_TAG_NO_ATTS 2 +#define XML_TOK_EMPTY_ELEMENT_WITH_ATTS 3 /* empty element tag */ +#define XML_TOK_EMPTY_ELEMENT_NO_ATTS 4 +#define XML_TOK_END_TAG 5 +#define XML_TOK_DATA_CHARS 6 +#define XML_TOK_DATA_NEWLINE 7 +#define XML_TOK_CDATA_SECT_OPEN 8 +#define XML_TOK_ENTITY_REF 9 +#define XML_TOK_CHAR_REF 10 /* numeric character reference */ + +/* The following tokens may be returned by both XmlPrologTok and + XmlContentTok. +*/ +#define XML_TOK_PI 11 /* processing instruction */ +#define XML_TOK_XML_DECL 12 /* XML decl or text decl */ +#define XML_TOK_COMMENT 13 +#define XML_TOK_BOM 14 /* Byte order mark */ + +/* The following tokens are returned only by XmlPrologTok */ +#define XML_TOK_PROLOG_S 15 +#define XML_TOK_DECL_OPEN 16 /* */ +#define XML_TOK_NAME 18 +#define XML_TOK_NMTOKEN 19 +#define XML_TOK_POUND_NAME 20 /* #name */ +#define XML_TOK_OR 21 /* | */ +#define XML_TOK_PERCENT 22 +#define XML_TOK_OPEN_PAREN 23 +#define XML_TOK_CLOSE_PAREN 24 +#define XML_TOK_OPEN_BRACKET 25 +#define XML_TOK_CLOSE_BRACKET 26 +#define XML_TOK_LITERAL 27 +#define XML_TOK_PARAM_ENTITY_REF 28 +#define XML_TOK_INSTANCE_START 29 + +/* The following occur only in element type declarations */ +#define XML_TOK_NAME_QUESTION 30 /* name? */ +#define XML_TOK_NAME_ASTERISK 31 /* name* */ +#define XML_TOK_NAME_PLUS 32 /* name+ */ +#define XML_TOK_COND_SECT_OPEN 33 /* */ +#define XML_TOK_CLOSE_PAREN_QUESTION 35 /* )? */ +#define XML_TOK_CLOSE_PAREN_ASTERISK 36 /* )* */ +#define XML_TOK_CLOSE_PAREN_PLUS 37 /* )+ */ +#define XML_TOK_COMMA 38 + +/* The following token is returned only by XmlAttributeValueTok */ +#define XML_TOK_ATTRIBUTE_VALUE_S 39 + +/* The following token is returned only by XmlCdataSectionTok */ +#define XML_TOK_CDATA_SECT_CLOSE 40 + +/* With namespace processing this is returned by XmlPrologTok for a + name with a colon. +*/ +#define XML_TOK_PREFIXED_NAME 41 + +#ifdef XML_DTD +#define XML_TOK_IGNORE_SECT 42 +#endif /* XML_DTD */ + +#ifdef XML_DTD +#define XML_N_STATES 4 +#else /* not XML_DTD */ +#define XML_N_STATES 3 +#endif /* not XML_DTD */ + +#define XML_PROLOG_STATE 0 +#define XML_CONTENT_STATE 1 +#define XML_CDATA_SECTION_STATE 2 +#ifdef XML_DTD +#define XML_IGNORE_SECTION_STATE 3 +#endif /* XML_DTD */ + +#define XML_N_LITERAL_TYPES 2 +#define XML_ATTRIBUTE_VALUE_LITERAL 0 +#define XML_ENTITY_VALUE_LITERAL 1 + +/* The size of the buffer passed to XmlUtf8Encode must be at least this. */ +#define XML_UTF8_ENCODE_MAX 4 +/* The size of the buffer passed to XmlUtf16Encode must be at least this. */ +#define XML_UTF16_ENCODE_MAX 2 + +typedef struct position { + /* first line and first column are 0 not 1 */ + unsigned long lineNumber; + unsigned long columnNumber; +} POSITION; + +typedef struct { + const char *name; + const char *valuePtr; + const char *valueEnd; + char normalized; +} ATTRIBUTE; + +struct encoding; +typedef struct encoding ENCODING; + +typedef int (PTRCALL *SCANNER)(const ENCODING *, + const char *, + const char *, + const char **); + +struct encoding { + SCANNER scanners[XML_N_STATES]; + SCANNER literalScanners[XML_N_LITERAL_TYPES]; + int (PTRCALL *sameName)(const ENCODING *, + const char *, + const char *); + int (PTRCALL *nameMatchesAscii)(const ENCODING *, + const char *, + const char *, + const char *); + int (PTRFASTCALL *nameLength)(const ENCODING *, const char *); + const char *(PTRFASTCALL *skipS)(const ENCODING *, const char *); + int (PTRCALL *getAtts)(const ENCODING *enc, + const char *ptr, + int attsMax, + ATTRIBUTE *atts); + int (PTRFASTCALL *charRefNumber)(const ENCODING *enc, const char *ptr); + int (PTRCALL *predefinedEntityName)(const ENCODING *, + const char *, + const char *); + void (PTRCALL *updatePosition)(const ENCODING *, + const char *ptr, + const char *end, + POSITION *); + int (PTRCALL *isPublicId)(const ENCODING *enc, + const char *ptr, + const char *end, + const char **badPtr); + void (PTRCALL *utf8Convert)(const ENCODING *enc, + const char **fromP, + const char *fromLim, + char **toP, + const char *toLim); + void (PTRCALL *utf16Convert)(const ENCODING *enc, + const char **fromP, + const char *fromLim, + unsigned short **toP, + const unsigned short *toLim); + int minBytesPerChar; + char isUtf8; + char isUtf16; +}; + +/* Scan the string starting at ptr until the end of the next complete + token, but do not scan past eptr. Return an integer giving the + type of token. + + Return XML_TOK_NONE when ptr == eptr; nextTokPtr will not be set. + + Return XML_TOK_PARTIAL when the string does not contain a complete + token; nextTokPtr will not be set. + + Return XML_TOK_INVALID when the string does not start a valid + token; nextTokPtr will be set to point to the character which made + the token invalid. + + Otherwise the string starts with a valid token; nextTokPtr will be + set to point to the character following the end of that token. + + Each data character counts as a single token, but adjacent data + characters may be returned together. Similarly for characters in + the prolog outside literals, comments and processing instructions. +*/ + + +#define XmlTok(enc, state, ptr, end, nextTokPtr) \ + (((enc)->scanners[state])(enc, ptr, end, nextTokPtr)) + +#define XmlPrologTok(enc, ptr, end, nextTokPtr) \ + XmlTok(enc, XML_PROLOG_STATE, ptr, end, nextTokPtr) + +#define XmlContentTok(enc, ptr, end, nextTokPtr) \ + XmlTok(enc, XML_CONTENT_STATE, ptr, end, nextTokPtr) + +#define XmlCdataSectionTok(enc, ptr, end, nextTokPtr) \ + XmlTok(enc, XML_CDATA_SECTION_STATE, ptr, end, nextTokPtr) + +#ifdef XML_DTD + +#define XmlIgnoreSectionTok(enc, ptr, end, nextTokPtr) \ + XmlTok(enc, XML_IGNORE_SECTION_STATE, ptr, end, nextTokPtr) + +#endif /* XML_DTD */ + +/* This is used for performing a 2nd-level tokenization on the content + of a literal that has already been returned by XmlTok. +*/ +#define XmlLiteralTok(enc, literalType, ptr, end, nextTokPtr) \ + (((enc)->literalScanners[literalType])(enc, ptr, end, nextTokPtr)) + +#define XmlAttributeValueTok(enc, ptr, end, nextTokPtr) \ + XmlLiteralTok(enc, XML_ATTRIBUTE_VALUE_LITERAL, ptr, end, nextTokPtr) + +#define XmlEntityValueTok(enc, ptr, end, nextTokPtr) \ + XmlLiteralTok(enc, XML_ENTITY_VALUE_LITERAL, ptr, end, nextTokPtr) + +#define XmlSameName(enc, ptr1, ptr2) (((enc)->sameName)(enc, ptr1, ptr2)) + +#define XmlNameMatchesAscii(enc, ptr1, end1, ptr2) \ + (((enc)->nameMatchesAscii)(enc, ptr1, end1, ptr2)) + +#define XmlNameLength(enc, ptr) \ + (((enc)->nameLength)(enc, ptr)) + +#define XmlSkipS(enc, ptr) \ + (((enc)->skipS)(enc, ptr)) + +#define XmlGetAttributes(enc, ptr, attsMax, atts) \ + (((enc)->getAtts)(enc, ptr, attsMax, atts)) + +#define XmlCharRefNumber(enc, ptr) \ + (((enc)->charRefNumber)(enc, ptr)) + +#define XmlPredefinedEntityName(enc, ptr, end) \ + (((enc)->predefinedEntityName)(enc, ptr, end)) + +#define XmlUpdatePosition(enc, ptr, end, pos) \ + (((enc)->updatePosition)(enc, ptr, end, pos)) + +#define XmlIsPublicId(enc, ptr, end, badPtr) \ + (((enc)->isPublicId)(enc, ptr, end, badPtr)) + +#define XmlUtf8Convert(enc, fromP, fromLim, toP, toLim) \ + (((enc)->utf8Convert)(enc, fromP, fromLim, toP, toLim)) + +#define XmlUtf16Convert(enc, fromP, fromLim, toP, toLim) \ + (((enc)->utf16Convert)(enc, fromP, fromLim, toP, toLim)) + +typedef struct { + ENCODING initEnc; + const ENCODING **encPtr; +} INIT_ENCODING; + +int XmlParseXmlDecl(int isGeneralTextEntity, + const ENCODING *enc, + const char *ptr, + const char *end, + const char **badPtr, + const char **versionPtr, + const char **versionEndPtr, + const char **encodingNamePtr, + const ENCODING **namedEncodingPtr, + int *standalonePtr); + +int XmlInitEncoding(INIT_ENCODING *, const ENCODING **, const char *name); +const ENCODING *XmlGetUtf8InternalEncoding(void); +const ENCODING *XmlGetUtf16InternalEncoding(void); +int FASTCALL XmlUtf8Encode(int charNumber, char *buf); +int FASTCALL XmlUtf16Encode(int charNumber, unsigned short *buf); +int XmlSizeOfUnknownEncoding(void); + +typedef int (*CONVERTER)(void *userData, const char *p); + +ENCODING * +XmlInitUnknownEncoding(void *mem, + int *table, + CONVERTER convert, + void *userData); + +int XmlParseXmlDeclNS(int isGeneralTextEntity, + const ENCODING *enc, + const char *ptr, + const char *end, + const char **badPtr, + const char **versionPtr, + const char **versionEndPtr, + const char **encodingNamePtr, + const ENCODING **namedEncodingPtr, + int *standalonePtr); + +int XmlInitEncodingNS(INIT_ENCODING *, const ENCODING **, const char *name); +const ENCODING *XmlGetUtf8InternalEncodingNS(void); +const ENCODING *XmlGetUtf16InternalEncodingNS(void); +ENCODING * +XmlInitUnknownEncodingNS(void *mem, + int *table, + CONVERTER convert, + void *userData); +#ifdef __cplusplus +} +#endif + +#endif /* not XmlTok_INCLUDED */ diff --git a/reactos/lib/expat/lib/xmltok_impl.c b/reactos/lib/expat/lib/xmltok_impl.c new file mode 100644 index 00000000000..46569fe38aa --- /dev/null +++ b/reactos/lib/expat/lib/xmltok_impl.c @@ -0,0 +1,1779 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#ifndef IS_INVALID_CHAR +#define IS_INVALID_CHAR(enc, ptr, n) (0) +#endif + +#define INVALID_LEAD_CASE(n, ptr, nextTokPtr) \ + case BT_LEAD ## n: \ + if (end - ptr < n) \ + return XML_TOK_PARTIAL_CHAR; \ + if (IS_INVALID_CHAR(enc, ptr, n)) { \ + *(nextTokPtr) = (ptr); \ + return XML_TOK_INVALID; \ + } \ + ptr += n; \ + break; + +#define INVALID_CASES(ptr, nextTokPtr) \ + INVALID_LEAD_CASE(2, ptr, nextTokPtr) \ + INVALID_LEAD_CASE(3, ptr, nextTokPtr) \ + INVALID_LEAD_CASE(4, ptr, nextTokPtr) \ + case BT_NONXML: \ + case BT_MALFORM: \ + case BT_TRAIL: \ + *(nextTokPtr) = (ptr); \ + return XML_TOK_INVALID; + +#define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr) \ + case BT_LEAD ## n: \ + if (end - ptr < n) \ + return XML_TOK_PARTIAL_CHAR; \ + if (!IS_NAME_CHAR(enc, ptr, n)) { \ + *nextTokPtr = ptr; \ + return XML_TOK_INVALID; \ + } \ + ptr += n; \ + break; + +#define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) \ + case BT_NONASCII: \ + if (!IS_NAME_CHAR_MINBPC(enc, ptr)) { \ + *nextTokPtr = ptr; \ + return XML_TOK_INVALID; \ + } \ + case BT_NMSTRT: \ + case BT_HEX: \ + case BT_DIGIT: \ + case BT_NAME: \ + case BT_MINUS: \ + ptr += MINBPC(enc); \ + break; \ + CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr) \ + CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr) \ + CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr) + +#define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr) \ + case BT_LEAD ## n: \ + if (end - ptr < n) \ + return XML_TOK_PARTIAL_CHAR; \ + if (!IS_NMSTRT_CHAR(enc, ptr, n)) { \ + *nextTokPtr = ptr; \ + return XML_TOK_INVALID; \ + } \ + ptr += n; \ + break; + +#define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) \ + case BT_NONASCII: \ + if (!IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { \ + *nextTokPtr = ptr; \ + return XML_TOK_INVALID; \ + } \ + case BT_NMSTRT: \ + case BT_HEX: \ + ptr += MINBPC(enc); \ + break; \ + CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr) \ + CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr) \ + CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr) + +#ifndef PREFIX +#define PREFIX(ident) ident +#endif + +/* ptr points to character following " */ + switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) { + case BT_S: case BT_CR: case BT_LF: case BT_PERCNT: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + /* fall through */ + case BT_S: case BT_CR: case BT_LF: + *nextTokPtr = ptr; + return XML_TOK_DECL_OPEN; + case BT_NMSTRT: + case BT_HEX: + ptr += MINBPC(enc); + break; + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + } + return XML_TOK_PARTIAL; +} + +static int PTRCALL +PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, + const char *end, int *tokPtr) +{ + int upper = 0; + *tokPtr = XML_TOK_PI; + if (end - ptr != MINBPC(enc)*3) + return 1; + switch (BYTE_TO_ASCII(enc, ptr)) { + case ASCII_x: + break; + case ASCII_X: + upper = 1; + break; + default: + return 1; + } + ptr += MINBPC(enc); + switch (BYTE_TO_ASCII(enc, ptr)) { + case ASCII_m: + break; + case ASCII_M: + upper = 1; + break; + default: + return 1; + } + ptr += MINBPC(enc); + switch (BYTE_TO_ASCII(enc, ptr)) { + case ASCII_l: + break; + case ASCII_L: + upper = 1; + break; + default: + return 1; + } + if (upper) + return 0; + *tokPtr = XML_TOK_XML_DECL; + return 1; +} + +/* ptr points to character following " 1) { + size_t n = end - ptr; + if (n & (MINBPC(enc) - 1)) { + n &= ~(MINBPC(enc) - 1); + if (n == 0) + return XML_TOK_PARTIAL; + end = ptr + n; + } + } + switch (BYTE_TYPE(enc, ptr)) { + case BT_RSQB: + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_PARTIAL; + if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB)) + break; + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_PARTIAL; + if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { + ptr -= MINBPC(enc); + break; + } + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_CDATA_SECT_CLOSE; + case BT_CR: + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_PARTIAL; + if (BYTE_TYPE(enc, ptr) == BT_LF) + ptr += MINBPC(enc); + *nextTokPtr = ptr; + return XML_TOK_DATA_NEWLINE; + case BT_LF: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_DATA_NEWLINE; + INVALID_CASES(ptr, nextTokPtr) + default: + ptr += MINBPC(enc); + break; + } + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: \ + if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ + *nextTokPtr = ptr; \ + return XML_TOK_DATA_CHARS; \ + } \ + ptr += n; \ + break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_NONXML: + case BT_MALFORM: + case BT_TRAIL: + case BT_CR: + case BT_LF: + case BT_RSQB: + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + default: + ptr += MINBPC(enc); + break; + } + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; +} + +/* ptr points to character following " 1) { + size_t n = end - ptr; + if (n & (MINBPC(enc) - 1)) { + n &= ~(MINBPC(enc) - 1); + if (n == 0) + return XML_TOK_PARTIAL; + end = ptr + n; + } + } + switch (BYTE_TYPE(enc, ptr)) { + case BT_LT: + return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_AMP: + return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_CR: + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_TRAILING_CR; + if (BYTE_TYPE(enc, ptr) == BT_LF) + ptr += MINBPC(enc); + *nextTokPtr = ptr; + return XML_TOK_DATA_NEWLINE; + case BT_LF: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_DATA_NEWLINE; + case BT_RSQB: + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_TRAILING_RSQB; + if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB)) + break; + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_TRAILING_RSQB; + if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { + ptr -= MINBPC(enc); + break; + } + *nextTokPtr = ptr; + return XML_TOK_INVALID; + INVALID_CASES(ptr, nextTokPtr) + default: + ptr += MINBPC(enc); + break; + } + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: \ + if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ + *nextTokPtr = ptr; \ + return XML_TOK_DATA_CHARS; \ + } \ + ptr += n; \ + break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_RSQB: + if (ptr + MINBPC(enc) != end) { + if (!CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) { + ptr += MINBPC(enc); + break; + } + if (ptr + 2*MINBPC(enc) != end) { + if (!CHAR_MATCHES(enc, ptr + 2*MINBPC(enc), ASCII_GT)) { + ptr += MINBPC(enc); + break; + } + *nextTokPtr = ptr + 2*MINBPC(enc); + return XML_TOK_INVALID; + } + } + /* fall through */ + case BT_AMP: + case BT_LT: + case BT_NONXML: + case BT_MALFORM: + case BT_TRAIL: + case BT_CR: + case BT_LF: + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + default: + ptr += MINBPC(enc); + break; + } + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; +} + +/* ptr points to character following "%" */ + +static int PTRCALL +PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end, + const char **nextTokPtr) +{ + if (ptr == end) + return -XML_TOK_PERCENT; + switch (BYTE_TYPE(enc, ptr)) { + CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) + case BT_S: case BT_LF: case BT_CR: case BT_PERCNT: + *nextTokPtr = ptr; + return XML_TOK_PERCENT; + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { + CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) + case BT_SEMI: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_PARAM_ENTITY_REF; + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + } + return XML_TOK_PARTIAL; +} + +static int PTRCALL +PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end, + const char **nextTokPtr) +{ + if (ptr == end) + return XML_TOK_PARTIAL; + switch (BYTE_TYPE(enc, ptr)) { + CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { + CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) + case BT_CR: case BT_LF: case BT_S: + case BT_RPAR: case BT_GT: case BT_PERCNT: case BT_VERBAR: + *nextTokPtr = ptr; + return XML_TOK_POUND_NAME; + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + } + return -XML_TOK_POUND_NAME; +} + +static int PTRCALL +PREFIX(scanLit)(int open, const ENCODING *enc, + const char *ptr, const char *end, + const char **nextTokPtr) +{ + while (ptr != end) { + int t = BYTE_TYPE(enc, ptr); + switch (t) { + INVALID_CASES(ptr, nextTokPtr) + case BT_QUOT: + case BT_APOS: + ptr += MINBPC(enc); + if (t != open) + break; + if (ptr == end) + return -XML_TOK_LITERAL; + *nextTokPtr = ptr; + switch (BYTE_TYPE(enc, ptr)) { + case BT_S: case BT_CR: case BT_LF: + case BT_GT: case BT_PERCNT: case BT_LSQB: + return XML_TOK_LITERAL; + default: + return XML_TOK_INVALID; + } + default: + ptr += MINBPC(enc); + break; + } + } + return XML_TOK_PARTIAL; +} + +static int PTRCALL +PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, + const char **nextTokPtr) +{ + int tok; + if (ptr == end) + return XML_TOK_NONE; + if (MINBPC(enc) > 1) { + size_t n = end - ptr; + if (n & (MINBPC(enc) - 1)) { + n &= ~(MINBPC(enc) - 1); + if (n == 0) + return XML_TOK_PARTIAL; + end = ptr + n; + } + } + switch (BYTE_TYPE(enc, ptr)) { + case BT_QUOT: + return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_APOS: + return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_LT: + { + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_PARTIAL; + switch (BYTE_TYPE(enc, ptr)) { + case BT_EXCL: + return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_QUEST: + return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_NMSTRT: + case BT_HEX: + case BT_NONASCII: + case BT_LEAD2: + case BT_LEAD3: + case BT_LEAD4: + *nextTokPtr = ptr - MINBPC(enc); + return XML_TOK_INSTANCE_START; + } + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + case BT_CR: + if (ptr + MINBPC(enc) == end) { + *nextTokPtr = end; + /* indicate that this might be part of a CR/LF pair */ + return -XML_TOK_PROLOG_S; + } + /* fall through */ + case BT_S: case BT_LF: + for (;;) { + ptr += MINBPC(enc); + if (ptr == end) + break; + switch (BYTE_TYPE(enc, ptr)) { + case BT_S: case BT_LF: + break; + case BT_CR: + /* don't split CR/LF pair */ + if (ptr + MINBPC(enc) != end) + break; + /* fall through */ + default: + *nextTokPtr = ptr; + return XML_TOK_PROLOG_S; + } + } + *nextTokPtr = ptr; + return XML_TOK_PROLOG_S; + case BT_PERCNT: + return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_COMMA: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_COMMA; + case BT_LSQB: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_OPEN_BRACKET; + case BT_RSQB: + ptr += MINBPC(enc); + if (ptr == end) + return -XML_TOK_CLOSE_BRACKET; + if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) { + if (ptr + MINBPC(enc) == end) + return XML_TOK_PARTIAL; + if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) { + *nextTokPtr = ptr + 2*MINBPC(enc); + return XML_TOK_COND_SECT_CLOSE; + } + } + *nextTokPtr = ptr; + return XML_TOK_CLOSE_BRACKET; + case BT_LPAR: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_OPEN_PAREN; + case BT_RPAR: + ptr += MINBPC(enc); + if (ptr == end) + return -XML_TOK_CLOSE_PAREN; + switch (BYTE_TYPE(enc, ptr)) { + case BT_AST: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_CLOSE_PAREN_ASTERISK; + case BT_QUEST: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_CLOSE_PAREN_QUESTION; + case BT_PLUS: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_CLOSE_PAREN_PLUS; + case BT_CR: case BT_LF: case BT_S: + case BT_GT: case BT_COMMA: case BT_VERBAR: + case BT_RPAR: + *nextTokPtr = ptr; + return XML_TOK_CLOSE_PAREN; + } + *nextTokPtr = ptr; + return XML_TOK_INVALID; + case BT_VERBAR: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_OR; + case BT_GT: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_DECL_CLOSE; + case BT_NUM: + return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr); +#define LEAD_CASE(n) \ + case BT_LEAD ## n: \ + if (end - ptr < n) \ + return XML_TOK_PARTIAL_CHAR; \ + if (IS_NMSTRT_CHAR(enc, ptr, n)) { \ + ptr += n; \ + tok = XML_TOK_NAME; \ + break; \ + } \ + if (IS_NAME_CHAR(enc, ptr, n)) { \ + ptr += n; \ + tok = XML_TOK_NMTOKEN; \ + break; \ + } \ + *nextTokPtr = ptr; \ + return XML_TOK_INVALID; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_NMSTRT: + case BT_HEX: + tok = XML_TOK_NAME; + ptr += MINBPC(enc); + break; + case BT_DIGIT: + case BT_NAME: + case BT_MINUS: +#ifdef XML_NS + case BT_COLON: +#endif + tok = XML_TOK_NMTOKEN; + ptr += MINBPC(enc); + break; + case BT_NONASCII: + if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { + ptr += MINBPC(enc); + tok = XML_TOK_NAME; + break; + } + if (IS_NAME_CHAR_MINBPC(enc, ptr)) { + ptr += MINBPC(enc); + tok = XML_TOK_NMTOKEN; + break; + } + /* fall through */ + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { + CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) + case BT_GT: case BT_RPAR: case BT_COMMA: + case BT_VERBAR: case BT_LSQB: case BT_PERCNT: + case BT_S: case BT_CR: case BT_LF: + *nextTokPtr = ptr; + return tok; +#ifdef XML_NS + case BT_COLON: + ptr += MINBPC(enc); + switch (tok) { + case XML_TOK_NAME: + if (ptr == end) + return XML_TOK_PARTIAL; + tok = XML_TOK_PREFIXED_NAME; + switch (BYTE_TYPE(enc, ptr)) { + CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) + default: + tok = XML_TOK_NMTOKEN; + break; + } + break; + case XML_TOK_PREFIXED_NAME: + tok = XML_TOK_NMTOKEN; + break; + } + break; +#endif + case BT_PLUS: + if (tok == XML_TOK_NMTOKEN) { + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_NAME_PLUS; + case BT_AST: + if (tok == XML_TOK_NMTOKEN) { + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_NAME_ASTERISK; + case BT_QUEST: + if (tok == XML_TOK_NMTOKEN) { + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_NAME_QUESTION; + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + } + return -tok; +} + +static int PTRCALL +PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, + const char *end, const char **nextTokPtr) +{ + const char *start; + if (ptr == end) + return XML_TOK_NONE; + start = ptr; + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: ptr += n; break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_AMP: + if (ptr == start) + return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + case BT_LT: + /* this is for inside entity references */ + *nextTokPtr = ptr; + return XML_TOK_INVALID; + case BT_LF: + if (ptr == start) { + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_DATA_NEWLINE; + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + case BT_CR: + if (ptr == start) { + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_TRAILING_CR; + if (BYTE_TYPE(enc, ptr) == BT_LF) + ptr += MINBPC(enc); + *nextTokPtr = ptr; + return XML_TOK_DATA_NEWLINE; + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + case BT_S: + if (ptr == start) { + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_ATTRIBUTE_VALUE_S; + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + default: + ptr += MINBPC(enc); + break; + } + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; +} + +static int PTRCALL +PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, + const char *end, const char **nextTokPtr) +{ + const char *start; + if (ptr == end) + return XML_TOK_NONE; + start = ptr; + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: ptr += n; break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_AMP: + if (ptr == start) + return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + case BT_PERCNT: + if (ptr == start) { + int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), + end, nextTokPtr); + return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok; + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + case BT_LF: + if (ptr == start) { + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_DATA_NEWLINE; + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + case BT_CR: + if (ptr == start) { + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_TRAILING_CR; + if (BYTE_TYPE(enc, ptr) == BT_LF) + ptr += MINBPC(enc); + *nextTokPtr = ptr; + return XML_TOK_DATA_NEWLINE; + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + default: + ptr += MINBPC(enc); + break; + } + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; +} + +#ifdef XML_DTD + +static int PTRCALL +PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, + const char *end, const char **nextTokPtr) +{ + int level = 0; + if (MINBPC(enc) > 1) { + size_t n = end - ptr; + if (n & (MINBPC(enc) - 1)) { + n &= ~(MINBPC(enc) - 1); + end = ptr + n; + } + } + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { + INVALID_CASES(ptr, nextTokPtr) + case BT_LT: + if ((ptr += MINBPC(enc)) == end) + return XML_TOK_PARTIAL; + if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) { + if ((ptr += MINBPC(enc)) == end) + return XML_TOK_PARTIAL; + if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) { + ++level; + ptr += MINBPC(enc); + } + } + break; + case BT_RSQB: + if ((ptr += MINBPC(enc)) == end) + return XML_TOK_PARTIAL; + if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) { + if ((ptr += MINBPC(enc)) == end) + return XML_TOK_PARTIAL; + if (CHAR_MATCHES(enc, ptr, ASCII_GT)) { + ptr += MINBPC(enc); + if (level == 0) { + *nextTokPtr = ptr; + return XML_TOK_IGNORE_SECT; + } + --level; + } + } + break; + default: + ptr += MINBPC(enc); + break; + } + } + return XML_TOK_PARTIAL; +} + +#endif /* XML_DTD */ + +static int PTRCALL +PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end, + const char **badPtr) +{ + ptr += MINBPC(enc); + end -= MINBPC(enc); + for (; ptr != end; ptr += MINBPC(enc)) { + switch (BYTE_TYPE(enc, ptr)) { + case BT_DIGIT: + case BT_HEX: + case BT_MINUS: + case BT_APOS: + case BT_LPAR: + case BT_RPAR: + case BT_PLUS: + case BT_COMMA: + case BT_SOL: + case BT_EQUALS: + case BT_QUEST: + case BT_CR: + case BT_LF: + case BT_SEMI: + case BT_EXCL: + case BT_AST: + case BT_PERCNT: + case BT_NUM: +#ifdef XML_NS + case BT_COLON: +#endif + break; + case BT_S: + if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) { + *badPtr = ptr; + return 0; + } + break; + case BT_NAME: + case BT_NMSTRT: + if (!(BYTE_TO_ASCII(enc, ptr) & ~0x7f)) + break; + default: + switch (BYTE_TO_ASCII(enc, ptr)) { + case 0x24: /* $ */ + case 0x40: /* @ */ + break; + default: + *badPtr = ptr; + return 0; + } + break; + } + } + return 1; +} + +/* This must only be called for a well-formed start-tag or empty + element tag. Returns the number of attributes. Pointers to the + first attsMax attributes are stored in atts. +*/ + +static int PTRCALL +PREFIX(getAtts)(const ENCODING *enc, const char *ptr, + int attsMax, ATTRIBUTE *atts) +{ + enum { other, inName, inValue } state = inName; + int nAtts = 0; + int open = 0; /* defined when state == inValue; + initialization just to shut up compilers */ + + for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) { + switch (BYTE_TYPE(enc, ptr)) { +#define START_NAME \ + if (state == other) { \ + if (nAtts < attsMax) { \ + atts[nAtts].name = ptr; \ + atts[nAtts].normalized = 1; \ + } \ + state = inName; \ + } +#define LEAD_CASE(n) \ + case BT_LEAD ## n: START_NAME ptr += (n - MINBPC(enc)); break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_NONASCII: + case BT_NMSTRT: + case BT_HEX: + START_NAME + break; +#undef START_NAME + case BT_QUOT: + if (state != inValue) { + if (nAtts < attsMax) + atts[nAtts].valuePtr = ptr + MINBPC(enc); + state = inValue; + open = BT_QUOT; + } + else if (open == BT_QUOT) { + state = other; + if (nAtts < attsMax) + atts[nAtts].valueEnd = ptr; + nAtts++; + } + break; + case BT_APOS: + if (state != inValue) { + if (nAtts < attsMax) + atts[nAtts].valuePtr = ptr + MINBPC(enc); + state = inValue; + open = BT_APOS; + } + else if (open == BT_APOS) { + state = other; + if (nAtts < attsMax) + atts[nAtts].valueEnd = ptr; + nAtts++; + } + break; + case BT_AMP: + if (nAtts < attsMax) + atts[nAtts].normalized = 0; + break; + case BT_S: + if (state == inName) + state = other; + else if (state == inValue + && nAtts < attsMax + && atts[nAtts].normalized + && (ptr == atts[nAtts].valuePtr + || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE + || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE + || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open)) + atts[nAtts].normalized = 0; + break; + case BT_CR: case BT_LF: + /* This case ensures that the first attribute name is counted + Apart from that we could just change state on the quote. */ + if (state == inName) + state = other; + else if (state == inValue && nAtts < attsMax) + atts[nAtts].normalized = 0; + break; + case BT_GT: + case BT_SOL: + if (state != inValue) + return nAtts; + break; + default: + break; + } + } + /* not reached */ +} + +static int PTRFASTCALL +PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) +{ + int result = 0; + /* skip &# */ + ptr += 2*MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_x)) { + for (ptr += MINBPC(enc); + !CHAR_MATCHES(enc, ptr, ASCII_SEMI); + ptr += MINBPC(enc)) { + int c = BYTE_TO_ASCII(enc, ptr); + switch (c) { + case ASCII_0: case ASCII_1: case ASCII_2: case ASCII_3: case ASCII_4: + case ASCII_5: case ASCII_6: case ASCII_7: case ASCII_8: case ASCII_9: + result <<= 4; + result |= (c - ASCII_0); + break; + case ASCII_A: case ASCII_B: case ASCII_C: + case ASCII_D: case ASCII_E: case ASCII_F: + result <<= 4; + result += 10 + (c - ASCII_A); + break; + case ASCII_a: case ASCII_b: case ASCII_c: + case ASCII_d: case ASCII_e: case ASCII_f: + result <<= 4; + result += 10 + (c - ASCII_a); + break; + } + if (result >= 0x110000) + return -1; + } + } + else { + for (; !CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) { + int c = BYTE_TO_ASCII(enc, ptr); + result *= 10; + result += (c - ASCII_0); + if (result >= 0x110000) + return -1; + } + } + return checkCharRefNumber(result); +} + +static int PTRCALL +PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr, + const char *end) +{ + switch ((end - ptr)/MINBPC(enc)) { + case 2: + if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) { + switch (BYTE_TO_ASCII(enc, ptr)) { + case ASCII_l: + return ASCII_LT; + case ASCII_g: + return ASCII_GT; + } + } + break; + case 3: + if (CHAR_MATCHES(enc, ptr, ASCII_a)) { + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_m)) { + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_p)) + return ASCII_AMP; + } + } + break; + case 4: + switch (BYTE_TO_ASCII(enc, ptr)) { + case ASCII_q: + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_u)) { + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_o)) { + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_t)) + return ASCII_QUOT; + } + } + break; + case ASCII_a: + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_p)) { + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_o)) { + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_s)) + return ASCII_APOS; + } + } + break; + } + } + return 0; +} + +static int PTRCALL +PREFIX(sameName)(const ENCODING *enc, const char *ptr1, const char *ptr2) +{ + for (;;) { + switch (BYTE_TYPE(enc, ptr1)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: \ + if (*ptr1++ != *ptr2++) \ + return 0; + LEAD_CASE(4) LEAD_CASE(3) LEAD_CASE(2) +#undef LEAD_CASE + /* fall through */ + if (*ptr1++ != *ptr2++) + return 0; + break; + case BT_NONASCII: + case BT_NMSTRT: +#ifdef XML_NS + case BT_COLON: +#endif + case BT_HEX: + case BT_DIGIT: + case BT_NAME: + case BT_MINUS: + if (*ptr2++ != *ptr1++) + return 0; + if (MINBPC(enc) > 1) { + if (*ptr2++ != *ptr1++) + return 0; + if (MINBPC(enc) > 2) { + if (*ptr2++ != *ptr1++) + return 0; + if (MINBPC(enc) > 3) { + if (*ptr2++ != *ptr1++) + return 0; + } + } + } + break; + default: + if (MINBPC(enc) == 1 && *ptr1 == *ptr2) + return 1; + switch (BYTE_TYPE(enc, ptr2)) { + case BT_LEAD2: + case BT_LEAD3: + case BT_LEAD4: + case BT_NONASCII: + case BT_NMSTRT: +#ifdef XML_NS + case BT_COLON: +#endif + case BT_HEX: + case BT_DIGIT: + case BT_NAME: + case BT_MINUS: + return 0; + default: + return 1; + } + } + } + /* not reached */ +} + +static int PTRCALL +PREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1, + const char *end1, const char *ptr2) +{ + for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) { + if (ptr1 == end1) + return 0; + if (!CHAR_MATCHES(enc, ptr1, *ptr2)) + return 0; + } + return ptr1 == end1; +} + +static int PTRFASTCALL +PREFIX(nameLength)(const ENCODING *enc, const char *ptr) +{ + const char *start = ptr; + for (;;) { + switch (BYTE_TYPE(enc, ptr)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: ptr += n; break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_NONASCII: + case BT_NMSTRT: +#ifdef XML_NS + case BT_COLON: +#endif + case BT_HEX: + case BT_DIGIT: + case BT_NAME: + case BT_MINUS: + ptr += MINBPC(enc); + break; + default: + return ptr - start; + } + } +} + +static const char * PTRFASTCALL +PREFIX(skipS)(const ENCODING *enc, const char *ptr) +{ + for (;;) { + switch (BYTE_TYPE(enc, ptr)) { + case BT_LF: + case BT_CR: + case BT_S: + ptr += MINBPC(enc); + break; + default: + return ptr; + } + } +} + +static void PTRCALL +PREFIX(updatePosition)(const ENCODING *enc, + const char *ptr, + const char *end, + POSITION *pos) +{ + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: \ + ptr += n; \ + break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_LF: + pos->columnNumber = (unsigned)-1; + pos->lineNumber++; + ptr += MINBPC(enc); + break; + case BT_CR: + pos->lineNumber++; + ptr += MINBPC(enc); + if (ptr != end && BYTE_TYPE(enc, ptr) == BT_LF) + ptr += MINBPC(enc); + pos->columnNumber = (unsigned)-1; + break; + default: + ptr += MINBPC(enc); + break; + } + pos->columnNumber++; + } +} + +#undef DO_LEAD_CASE +#undef MULTIBYTE_CASES +#undef INVALID_CASES +#undef CHECK_NAME_CASE +#undef CHECK_NAME_CASES +#undef CHECK_NMSTRT_CASE +#undef CHECK_NMSTRT_CASES + diff --git a/reactos/lib/expat/lib/xmltok_impl.h b/reactos/lib/expat/lib/xmltok_impl.h new file mode 100644 index 00000000000..da0ea60a657 --- /dev/null +++ b/reactos/lib/expat/lib/xmltok_impl.h @@ -0,0 +1,46 @@ +/* +Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd +See the file COPYING for copying permission. +*/ + +enum { + BT_NONXML, + BT_MALFORM, + BT_LT, + BT_AMP, + BT_RSQB, + BT_LEAD2, + BT_LEAD3, + BT_LEAD4, + BT_TRAIL, + BT_CR, + BT_LF, + BT_GT, + BT_QUOT, + BT_APOS, + BT_EQUALS, + BT_QUEST, + BT_EXCL, + BT_SOL, + BT_SEMI, + BT_NUM, + BT_LSQB, + BT_S, + BT_NMSTRT, + BT_COLON, + BT_HEX, + BT_DIGIT, + BT_NAME, + BT_MINUS, + BT_OTHER, /* known not to be a name or name start character */ + BT_NONASCII, /* might be a name or name start character */ + BT_PERCNT, + BT_LPAR, + BT_RPAR, + BT_AST, + BT_PLUS, + BT_COMMA, + BT_VERBAR +}; + +#include diff --git a/reactos/lib/expat/lib/xmltok_ns.c b/reactos/lib/expat/lib/xmltok_ns.c new file mode 100644 index 00000000000..5610eb95ba7 --- /dev/null +++ b/reactos/lib/expat/lib/xmltok_ns.c @@ -0,0 +1,106 @@ +const ENCODING * +NS(XmlGetUtf8InternalEncoding)(void) +{ + return &ns(internal_utf8_encoding).enc; +} + +const ENCODING * +NS(XmlGetUtf16InternalEncoding)(void) +{ +#if BYTEORDER == 1234 + return &ns(internal_little2_encoding).enc; +#elif BYTEORDER == 4321 + return &ns(internal_big2_encoding).enc; +#else + const short n = 1; + return (*(const char *)&n + ? &ns(internal_little2_encoding).enc + : &ns(internal_big2_encoding).enc); +#endif +} + +static const ENCODING *NS(encodings)[] = { + &ns(latin1_encoding).enc, + &ns(ascii_encoding).enc, + &ns(utf8_encoding).enc, + &ns(big2_encoding).enc, + &ns(big2_encoding).enc, + &ns(little2_encoding).enc, + &ns(utf8_encoding).enc /* NO_ENC */ +}; + +static int PTRCALL +NS(initScanProlog)(const ENCODING *enc, const char *ptr, const char *end, + const char **nextTokPtr) +{ + return initScan(NS(encodings), (const INIT_ENCODING *)enc, + XML_PROLOG_STATE, ptr, end, nextTokPtr); +} + +static int PTRCALL +NS(initScanContent)(const ENCODING *enc, const char *ptr, const char *end, + const char **nextTokPtr) +{ + return initScan(NS(encodings), (const INIT_ENCODING *)enc, + XML_CONTENT_STATE, ptr, end, nextTokPtr); +} + +int +NS(XmlInitEncoding)(INIT_ENCODING *p, const ENCODING **encPtr, + const char *name) +{ + int i = getEncodingIndex(name); + if (i == UNKNOWN_ENC) + return 0; + SET_INIT_ENC_INDEX(p, i); + p->initEnc.scanners[XML_PROLOG_STATE] = NS(initScanProlog); + p->initEnc.scanners[XML_CONTENT_STATE] = NS(initScanContent); + p->initEnc.updatePosition = initUpdatePosition; + p->encPtr = encPtr; + *encPtr = &(p->initEnc); + return 1; +} + +static const ENCODING * +NS(findEncoding)(const ENCODING *enc, const char *ptr, const char *end) +{ +#define ENCODING_MAX 128 + char buf[ENCODING_MAX]; + char *p = buf; + int i; + XmlUtf8Convert(enc, &ptr, end, &p, p + ENCODING_MAX - 1); + if (ptr != end) + return 0; + *p = 0; + if (streqci(buf, KW_UTF_16) && enc->minBytesPerChar == 2) + return enc; + i = getEncodingIndex(buf); + if (i == UNKNOWN_ENC) + return 0; + return NS(encodings)[i]; +} + +int +NS(XmlParseXmlDecl)(int isGeneralTextEntity, + const ENCODING *enc, + const char *ptr, + const char *end, + const char **badPtr, + const char **versionPtr, + const char **versionEndPtr, + const char **encodingName, + const ENCODING **encoding, + int *standalone) +{ + return doParseXmlDecl(NS(findEncoding), + isGeneralTextEntity, + enc, + ptr, + end, + badPtr, + versionPtr, + versionEndPtr, + encodingName, + encoding, + standalone); +} diff --git a/reactos/lib/expat/make-release.sh b/reactos/lib/expat/make-release.sh new file mode 100644 index 00000000000..e07af09f6ba --- /dev/null +++ b/reactos/lib/expat/make-release.sh @@ -0,0 +1,76 @@ +#! /bin/bash +# +# make-release.sh: make an Expat release +# +# USAGE: make-release.sh tagname +# +# Note: tagname may be HEAD to just grab the head revision (e.g. for testing) +# + +CVSROOT=':ext:cvs.libexpat.org:/cvsroot/expat' +#CVSROOT=':pserver:anonymous@cvs.libexpat.org:/cvsroot/expat' + +if test $# != 1; then + echo "USAGE: $0 tagname" + exit 1 +fi + +tmpdir=expat-release.$$ +if test -e $tmpdir; then + echo "ERROR: oops. chose the $tmpdir subdir, but it exists." + exit 1 +fi + +echo "Checking out into temporary area: $tmpdir" +cvs -d "$CVSROOT" export -r "$1" -d $tmpdir expat || exit 1 + +echo "" +echo "----------------------------------------------------------------------" +echo "Preparing $tmpdir for release (running buildconf.sh)" +(cd $tmpdir && ./buildconf.sh) || exit 1 + +# figure out the release version +vsn="`$tmpdir/conftools/get-version.sh $tmpdir/lib/expat.h`" + +echo "" +echo "Release version: $vsn" + +if test "$1" = HEAD ; then + distdir=expat-`date '+%Y-%m-%d'` +else + distdir=expat-$vsn +fi +if test -e $distdir; then + echo "ERROR: for safety, you must manually remove $distdir." + rm -rf $tmpdir + exit 1 +fi +mkdir $distdir || exit 1 + +CPOPTS=-Pp +if (cp --version 2>/dev/null | grep -q 'Free Software Foundation') ; then + # If we're using GNU cp, we can avoid the warnings about forward + # compatibility of the options. + CPOPTS='--parents --preserve' +fi + +echo "" +echo "----------------------------------------------------------------------" +echo "Building $distdir based on the MANIFEST:" +files="`sed -e 's/[ ]:.*$//' $tmpdir/MANIFEST`" +for file in $files; do + echo "Copying $file..." + (cd $tmpdir && cp $CPOPTS $file ../$distdir) || exit 1 +done + +echo "" +echo "----------------------------------------------------------------------" +echo "Removing (temporary) checkout directory..." +rm -rf $tmpdir + +tarball=$distdir.tar.gz +echo "Constructing $tarball..." +tar cf - $distdir | gzip -9 > $tarball || exit $? +rm -r $distdir + +echo "Done." diff --git a/reactos/lib/expat/tests/.cvsignore b/reactos/lib/expat/tests/.cvsignore new file mode 100644 index 00000000000..4542fcf6b4a --- /dev/null +++ b/reactos/lib/expat/tests/.cvsignore @@ -0,0 +1,5 @@ +Makefile +runtests +xmlts.zip +XML-Test-Suite +.libs diff --git a/reactos/lib/expat/tests/README.txt b/reactos/lib/expat/tests/README.txt new file mode 100644 index 00000000000..1ee72edc520 --- /dev/null +++ b/reactos/lib/expat/tests/README.txt @@ -0,0 +1,14 @@ +This directory contains the (fledgling) test suite for Expat. The +tests provide general unit testing and regression coverage. The tests +are not expected to be useful examples of Expat usage; see the +examples/ directory for that. + +The Expat tests use the "Check" unit testing framework for C. More +information on Check can be found at: + + http://check.sourceforge.net/ + +Check 0.8 must be installed before the unit tests can be compiled & run. + +Since both Check and this test suite are young, it can all change in a +later version. diff --git a/reactos/lib/expat/tests/benchmark/README.txt b/reactos/lib/expat/tests/benchmark/README.txt new file mode 100644 index 00000000000..80a3ea3b3ac --- /dev/null +++ b/reactos/lib/expat/tests/benchmark/README.txt @@ -0,0 +1,16 @@ +Use this benchmark command line utility as follows: + + benchmark [-n] <# iterations> + +The command line arguments are: + + -n ... optional; if supplied, then namespace processing is turned on + ... name/path of test xml file + ... size of processing buffer; + the file is parsed in chunks of this size + <# iterations> ... how often will the file be parsed + +Returns: + + The time (in seconds) it takes to parse the test file, + averaged of the number of iterations. \ No newline at end of file diff --git a/reactos/lib/expat/tests/benchmark/benchmark.c b/reactos/lib/expat/tests/benchmark/benchmark.c new file mode 100644 index 00000000000..99c51a12e9c --- /dev/null +++ b/reactos/lib/expat/tests/benchmark/benchmark.c @@ -0,0 +1,101 @@ +#include +#include +#include +#include +#include "expat.h" + +static void +usage(const char *prog, int rc) +{ + fprintf(stderr, + "usage: %s [-n] filename bufferSize nr_of_loops\n", prog); + exit(rc); +} + +int main (int argc, char *argv[]) +{ + XML_Parser parser; + char *XMLBuf, *XMLBufEnd, *XMLBufPtr; + FILE *fd; + struct stat fileAttr; + int nrOfLoops, bufferSize, fileSize, i, isFinal; + int j = 0, ns = 0; + clock_t tstart, tend; + double cpuTime = 0.0; + + if (argc > 1) { + if (argv[1][0] == '-') { + if (argv[1][1] == 'n' && argv[1][2] == '\0') { + ns = 1; + j = 1; + } + else + usage(argv[0], 1); + } + } + + if (argc != j + 4) + usage(argv[0], 1); + + if (stat (argv[j + 1], &fileAttr) != 0) { + fprintf (stderr, "could not access file '%s'\n", argv[j + 1]); + return 2; + } + + fd = fopen (argv[j + 1], "r"); + if (!fd) { + fprintf (stderr, "could not open file '%s'\n", argv[j + 1]); + exit(2); + } + + bufferSize = atoi (argv[j + 2]); + nrOfLoops = atoi (argv[j + 3]); + if (bufferSize <= 0 || nrOfLoops <= 0) { + fprintf (stderr, + "buffer size and nr of loops must be greater than zero.\n"); + exit(3); + } + + XMLBuf = malloc (fileAttr.st_size); + fileSize = fread (XMLBuf, sizeof (char), fileAttr.st_size, fd); + fclose (fd); + + i = 0; + XMLBufEnd = XMLBuf + fileSize; + while (i < nrOfLoops) { + XMLBufPtr = XMLBuf; + isFinal = 0; + if (ns) + parser = XML_ParserCreateNS(NULL, '!'); + else + parser = XML_ParserCreate(NULL); + tstart = clock(); + do { + int parseBufferSize = XMLBufEnd - XMLBufPtr; + if (parseBufferSize <= bufferSize) + isFinal = 1; + else + parseBufferSize = bufferSize; + if (!XML_Parse (parser, XMLBufPtr, parseBufferSize, isFinal)) { + fprintf (stderr, "error '%s' at line %d character %d\n", + XML_ErrorString (XML_GetErrorCode (parser)), + XML_GetCurrentLineNumber (parser), + XML_GetCurrentColumnNumber (parser)); + free (XMLBuf); + XML_ParserFree (parser); + exit (4); + } + XMLBufPtr += bufferSize; + } while (!isFinal); + tend = clock(); + cpuTime += ((double) (tend - tstart)) / CLOCKS_PER_SEC; + XML_ParserFree (parser); + i++; + } + + free (XMLBuf); + + printf ("%d loops, with buffer size %d. Average time per loop: %f\n", + nrOfLoops, bufferSize, cpuTime / (double) nrOfLoops); + return 0; +} diff --git a/reactos/lib/expat/tests/benchmark/benchmark.dsp b/reactos/lib/expat/tests/benchmark/benchmark.dsp new file mode 100644 index 00000000000..be3f240bdea --- /dev/null +++ b/reactos/lib/expat/tests/benchmark/benchmark.dsp @@ -0,0 +1,88 @@ +# Microsoft Developer Studio Project File - Name="benchmark" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=benchmark - 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 "benchmark.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 "benchmark.mak" CFG="benchmark - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "benchmark - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "benchmark - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "benchmark - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /I "..\..\lib" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD BASE RSC /l 0x1009 /d "NDEBUG" +# ADD RSC /l 0x1009 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "benchmark - 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 "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\..\lib" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD BASE RSC /l 0x1009 /d "_DEBUG" +# ADD RSC /l 0x1009 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "benchmark - Win32 Release" +# Name "benchmark - Win32 Debug" +# Begin Source File + +SOURCE=.\benchmark.c +# End Source File +# End Target +# End Project diff --git a/reactos/lib/expat/tests/benchmark/benchmark.dsw b/reactos/lib/expat/tests/benchmark/benchmark.dsw new file mode 100644 index 00000000000..db8504c0f30 --- /dev/null +++ b/reactos/lib/expat/tests/benchmark/benchmark.dsw @@ -0,0 +1,44 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "benchmark"=.\benchmark.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name expat + End Project Dependency +}}} + +############################################################################### + +Project: "expat"=..\..\lib\expat.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/reactos/lib/expat/tests/chardata.c b/reactos/lib/expat/tests/chardata.c new file mode 100644 index 00000000000..5736afc6d3b --- /dev/null +++ b/reactos/lib/expat/tests/chardata.c @@ -0,0 +1,132 @@ +/* Copyright (c) 1998-2003 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. + + chardata.c +*/ + +#ifdef HAVE_EXPAT_CONFIG_H +#include +#endif +#ifdef HAVE_CHECK_H +#include +#else +#error This test suite requires the 'check' unit test framework (http://check.sf.net/) +#endif + +#include +#include +#include +#include + +#include "chardata.h" + + +static int +xmlstrlen(const XML_Char *s) +{ + int len = 0; + assert(s != NULL); + while (s[len] != 0) + ++len; + return len; +} + + +void +CharData_Init(CharData *storage) +{ + assert(storage != NULL); + storage->count = -1; +} + +void +CharData_AppendString(CharData *storage, const char *s) +{ + int maxchars = sizeof(storage->data) / sizeof(storage->data[0]); + int len; + + assert(s != NULL); + len = strlen(s); + if (storage->count < 0) + storage->count = 0; + if ((len + storage->count) > maxchars) { + len = (maxchars - storage->count); + } + if (len + storage->count < sizeof(storage->data)) { + memcpy(storage->data + storage->count, s, len); + storage->count += len; + } +} + +void +CharData_AppendXMLChars(CharData *storage, const XML_Char *s, int len) +{ + int maxchars; + + assert(storage != NULL); + assert(s != NULL); + maxchars = sizeof(storage->data) / sizeof(storage->data[0]); + if (storage->count < 0) + storage->count = 0; + if (len < 0) + len = xmlstrlen(s); + if ((len + storage->count) > maxchars) { + len = (maxchars - storage->count); + } + if (len + storage->count < sizeof(storage->data)) { + memcpy(storage->data + storage->count, s, + len * sizeof(storage->data[0])); + storage->count += len; + } +} + +int +CharData_CheckString(CharData *storage, const char *expected) +{ + char buffer[1280]; + int len; + int count; + + assert(storage != NULL); + assert(expected != NULL); + count = (storage->count < 0) ? 0 : storage->count; + len = strlen(expected); + if (len != count) { + if (sizeof(XML_Char) == 1) + sprintf(buffer, "wrong number of data characters:" + " got %d, expected %d:\n%s", count, len, storage->data); + else + sprintf(buffer, + "wrong number of data characters: got %d, expected %d", + count, len); + fail(buffer); + return 0; + } + if (memcmp(expected, storage->data, len) != 0) { + fail("got bad data bytes"); + return 0; + } + return 1; +} + +int +CharData_CheckXMLChars(CharData *storage, const XML_Char *expected) +{ + char buffer[1024]; + int len = xmlstrlen(expected); + int count; + + assert(storage != NULL); + count = (storage->count < 0) ? 0 : storage->count; + if (len != count) { + sprintf(buffer, "wrong number of data characters: got %d, expected %d", + count, len); + fail(buffer); + return 0; + } + if (memcmp(expected, storage->data, len * sizeof(storage->data[0])) != 0) { + fail("got bad data bytes"); + return 0; + } + return 1; +} diff --git a/reactos/lib/expat/tests/chardata.h b/reactos/lib/expat/tests/chardata.h new file mode 100644 index 00000000000..0f33c0dac3f --- /dev/null +++ b/reactos/lib/expat/tests/chardata.h @@ -0,0 +1,32 @@ +/* chardata.h + + Interface to some helper routines used to accumulate and check text + and attribute content. +*/ + +#ifndef XML_CHARDATA_H +#define XML_CHARDATA_H 1 + +#ifndef XML_VERSION +#include "expat.h" /* need XML_Char */ +#endif + + +typedef struct { + int count; /* # of chars, < 0 if not set */ + XML_Char data[1024]; +} CharData; + + +void CharData_Init(CharData *storage); + +void CharData_AppendString(CharData *storage, const char *s); + +void CharData_AppendXMLChars(CharData *storage, const XML_Char *s, int len); + +int CharData_CheckString(CharData *storage, const char *s); + +int CharData_CheckXMLChars(CharData *storage, const XML_Char *s); + + +#endif /* XML_CHARDATA_H */ diff --git a/reactos/lib/expat/tests/runtests.c b/reactos/lib/expat/tests/runtests.c new file mode 100644 index 00000000000..7df109a324e --- /dev/null +++ b/reactos/lib/expat/tests/runtests.c @@ -0,0 +1,1434 @@ +/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. + + runtest.c : run the Expat test suite +*/ + +#ifdef HAVE_EXPAT_CONFIG_H +#include +#endif + +#ifdef HAVE_CHECK_H +#include +#else +#error This test suite requires the 'check' unit test framework (http://check.sf.net/) +#endif + +#include +#include +#include +#include + +#include "expat.h" +#include "chardata.h" + + +static XML_Parser parser; + + +static void +basic_setup(void) +{ + parser = XML_ParserCreate(NULL); + if (parser == NULL) + fail("Parser not created."); +} + +static void +basic_teardown(void) +{ + if (parser != NULL) + XML_ParserFree(parser); +} + +/* Generate a failure using the parser state to create an error message; + this should be used when the parser reports an error we weren't + expecting. +*/ +static void +_xml_failure(XML_Parser parser, const char *file, int line) +{ + char buffer[1024]; + sprintf(buffer, + "\n %s (line %d, offset %d)\n reported from %s, line %d", + XML_ErrorString(XML_GetErrorCode(parser)), + XML_GetCurrentLineNumber(parser), + XML_GetCurrentColumnNumber(parser), + file, line); + _fail_unless(0, file, line, buffer); +} + +#define xml_failure(parser) _xml_failure((parser), __FILE__, __LINE__) + +static void +_expect_failure(char *text, enum XML_Error errorCode, char *errorMessage, + char *file, int lineno) +{ + if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_OK) + /* Hackish use of _fail_unless() macro, but let's us report + the right filename and line number. */ + _fail_unless(0, file, lineno, errorMessage); + if (XML_GetErrorCode(parser) != errorCode) + _xml_failure(parser, file, lineno); +} + +#define expect_failure(text, errorCode, errorMessage) \ + _expect_failure((text), (errorCode), (errorMessage), \ + __FILE__, __LINE__) + +/* Dummy handlers for when we need to set a handler to tickle a bug, + but it doesn't need to do anything. +*/ + +static void XMLCALL +dummy_start_doctype_handler(void *userData, + const XML_Char *doctypeName, + const XML_Char *sysid, + const XML_Char *pubid, + int has_internal_subset) +{} + +static void XMLCALL +dummy_end_doctype_handler(void *userData) +{} + +static void XMLCALL +dummy_entity_decl_handler(void *userData, + const XML_Char *entityName, + int is_parameter_entity, + const XML_Char *value, + int value_length, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId, + const XML_Char *notationName) +{} + +static void XMLCALL +dummy_notation_decl_handler(void *userData, + const XML_Char *notationName, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId) +{} + +static void XMLCALL +dummy_element_decl_handler(void *userData, + const XML_Char *name, + XML_Content *model) +{} + +static void XMLCALL +dummy_attlist_decl_handler(void *userData, + const XML_Char *elname, + const XML_Char *attname, + const XML_Char *att_type, + const XML_Char *dflt, + int isrequired) +{} + +static void XMLCALL +dummy_comment_handler(void *userData, const XML_Char *data) +{} + +static void XMLCALL +dummy_pi_handler(void *userData, const XML_Char *target, const XML_Char *data) +{} + +static void XMLCALL +dummy_start_element(void *userData, + const XML_Char *name, const XML_Char **atts) +{} + + +/* + * Character & encoding tests. + */ + +START_TEST(test_nul_byte) +{ + char text[] = "\0"; + + /* test that a NUL byte (in US-ASCII data) is an error */ + if (XML_Parse(parser, text, sizeof(text) - 1, XML_TRUE) == XML_STATUS_OK) + fail("Parser did not report error on NUL-byte."); + if (XML_GetErrorCode(parser) != XML_ERROR_INVALID_TOKEN) + xml_failure(parser); +} +END_TEST + + +START_TEST(test_u0000_char) +{ + /* test that a NUL byte (in US-ASCII data) is an error */ + expect_failure("", + XML_ERROR_BAD_CHAR_REF, + "Parser did not report error on NUL-byte."); +} +END_TEST + +START_TEST(test_bom_utf8) +{ + /* This test is really just making sure we don't core on a UTF-8 BOM. */ + char *text = "\357\273\277"; + + if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR) + xml_failure(parser); +} +END_TEST + +START_TEST(test_bom_utf16_be) +{ + char text[] = "\376\377\0<\0e\0/\0>"; + + if (XML_Parse(parser, text, sizeof(text)-1, XML_TRUE) == XML_STATUS_ERROR) + xml_failure(parser); +} +END_TEST + +START_TEST(test_bom_utf16_le) +{ + char text[] = "\377\376<\0e\0/\0>\0"; + + if (XML_Parse(parser, text, sizeof(text)-1, XML_TRUE) == XML_STATUS_ERROR) + xml_failure(parser); +} +END_TEST + +static void XMLCALL +accumulate_characters(void *userData, const XML_Char *s, int len) +{ + CharData_AppendXMLChars((CharData *)userData, s, len); +} + +static void XMLCALL +accumulate_attribute(void *userData, const XML_Char *name, + const XML_Char **atts) +{ + CharData *storage = (CharData *)userData; + if (storage->count < 0 && atts != NULL && atts[0] != NULL) { + /* "accumulate" the value of the first attribute we see */ + CharData_AppendXMLChars(storage, atts[1], -1); + } +} + + +static void +_run_character_check(XML_Char *text, XML_Char *expected, + const char *file, int line) +{ + CharData storage; + + CharData_Init(&storage); + XML_SetUserData(parser, &storage); + XML_SetCharacterDataHandler(parser, accumulate_characters); + if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR) + _xml_failure(parser, file, line); + CharData_CheckXMLChars(&storage, expected); +} + +#define run_character_check(text, expected) \ + _run_character_check(text, expected, __FILE__, __LINE__) + +static void +_run_attribute_check(XML_Char *text, XML_Char *expected, + const char *file, int line) +{ + CharData storage; + + CharData_Init(&storage); + XML_SetUserData(parser, &storage); + XML_SetStartElementHandler(parser, accumulate_attribute); + if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR) + _xml_failure(parser, file, line); + CharData_CheckXMLChars(&storage, expected); +} + +#define run_attribute_check(text, expected) \ + _run_attribute_check(text, expected, __FILE__, __LINE__) + +/* Regression test for SF bug #491986. */ +START_TEST(test_danish_latin1) +{ + char *text = + "\n" + "J鴕gen 骧迤嘏"; + run_character_check(text, + "J\xC3\xB8rgen \xC3\xA6\xC3\xB8\xC3\xA5\xC3\x86\xC3\x98\xC3\x85"); +} +END_TEST + + +/* Regression test for SF bug #514281. */ +START_TEST(test_french_charref_hexidecimal) +{ + char *text = + "\n" + "éèàçêÈ"; + run_character_check(text, + "\xC3\xA9\xC3\xA8\xC3\xA0\xC3\xA7\xC3\xAA\xC3\x88"); +} +END_TEST + +START_TEST(test_french_charref_decimal) +{ + char *text = + "\n" + "éèàçêÈ"; + run_character_check(text, + "\xC3\xA9\xC3\xA8\xC3\xA0\xC3\xA7\xC3\xAA\xC3\x88"); +} +END_TEST + +START_TEST(test_french_latin1) +{ + char *text = + "\n" + "\xE9\xE8\xE0\xE7\xEa\xC8"; + run_character_check(text, + "\xC3\xA9\xC3\xA8\xC3\xA0\xC3\xA7\xC3\xAA\xC3\x88"); +} +END_TEST + +START_TEST(test_french_utf8) +{ + char *text = + "\n" + "\xC3\xA9"; + run_character_check(text, "\xC3\xA9"); +} +END_TEST + +/* Regression test for SF bug #600479. + XXX There should be a test that exercises all legal XML Unicode + characters as PCDATA and attribute value content, and XML Name + characters as part of element and attribute names. +*/ +START_TEST(test_utf8_false_rejection) +{ + char *text = "\xEF\xBA\xBF"; + run_character_check(text, "\xEF\xBA\xBF"); +} +END_TEST + +/* Regression test for SF bug #477667. + This test assures that any 8-bit character followed by a 7-bit + character will not be mistakenly interpreted as a valid UTF-8 + sequence. +*/ +START_TEST(test_illegal_utf8) +{ + char text[100]; + int i; + + for (i = 128; i <= 255; ++i) { + sprintf(text, "%ccd", i); + if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_OK) { + sprintf(text, + "expected token error for '%c' (ordinal %d) in UTF-8 text", + i, i); + fail(text); + } + else if (XML_GetErrorCode(parser) != XML_ERROR_INVALID_TOKEN) + xml_failure(parser); + /* Reset the parser since we use the same parser repeatedly. */ + XML_ParserReset(parser, NULL); + } +} +END_TEST + +START_TEST(test_utf16) +{ + /* + some text + */ + char text[] = + "\000<\000?\000x\000m\000\154\000 \000v\000e\000r\000s\000i\000o" + "\000n\000=\000'\0001\000.\000\060\000'\000 \000e\000n\000c\000o" + "\000d\000i\000n\000g\000=\000'\000U\000T\000F\000-\0001\000\066" + "\000'\000?\000>\000\n" + "\000<\000d\000o\000c\000 \000a\000=\000'\0001\0002\0003\000'" + "\000>\000s\000o\000m\000e\000 \000t\000e\000x\000t\000<\000/" + "\000d\000o\000c\000>"; + if (XML_Parse(parser, text, sizeof(text)-1, XML_TRUE) == XML_STATUS_ERROR) + xml_failure(parser); +} +END_TEST + +START_TEST(test_utf16_le_epilog_newline) +{ + int first_chunk_bytes = 17; + char text[] = + "\xFF\xFE" /* BOM */ + "<\000e\000/\000>\000" /* document element */ + "\r\000\n\000\r\000\n\000"; /* epilog */ + + if (first_chunk_bytes >= sizeof(text) - 1) + fail("bad value of first_chunk_bytes"); + if ( XML_Parse(parser, text, first_chunk_bytes, XML_FALSE) + == XML_STATUS_ERROR) + xml_failure(parser); + else { + enum XML_Status rc; + rc = XML_Parse(parser, text + first_chunk_bytes, + sizeof(text) - first_chunk_bytes - 1, XML_TRUE); + if (rc == XML_STATUS_ERROR) + xml_failure(parser); + } +} +END_TEST + +/* Regression test for SF bug #481609, #774028. */ +START_TEST(test_latin1_umlauts) +{ + char *text = + "\n" + " ä ö ü ä ö ü >"; + char *utf8 = + "\xC3\xA4 \xC3\xB6 \xC3\xBC " + "\xC3\xA4 \xC3\xB6 \xC3\xBC " + "\xC3\xA4 \xC3\xB6 \xC3\xBC >"; + run_character_check(text, utf8); + XML_ParserReset(parser, NULL); + run_attribute_check(text, utf8); +} +END_TEST + +/* Regression test #1 for SF bug #653180. */ +START_TEST(test_line_number_after_parse) +{ + char *text = + "\n" + "\n" + "\n"; + int lineno; + + if (XML_Parse(parser, text, strlen(text), XML_FALSE) == XML_STATUS_ERROR) + xml_failure(parser); + lineno = XML_GetCurrentLineNumber(parser); + if (lineno != 4) { + char buffer[100]; + sprintf(buffer, "expected 4 lines, saw %d", lineno); + fail(buffer); + } +} +END_TEST + +/* Regression test #2 for SF bug #653180. */ +START_TEST(test_column_number_after_parse) +{ + char *text = ""; + int colno; + + if (XML_Parse(parser, text, strlen(text), XML_FALSE) == XML_STATUS_ERROR) + xml_failure(parser); + colno = XML_GetCurrentColumnNumber(parser); + if (colno != 11) { + char buffer[100]; + sprintf(buffer, "expected 11 columns, saw %d", colno); + fail(buffer); + } +} +END_TEST + +static void XMLCALL +start_element_event_handler2(void *userData, const XML_Char *name, + const XML_Char **attr) +{ + CharData *storage = (CharData *) userData; + char buffer[100]; + + sprintf(buffer, "<%s> at col:%d line:%d\n", name, + XML_GetCurrentColumnNumber(parser), + XML_GetCurrentLineNumber(parser)); + CharData_AppendString(storage, buffer); +} + +static void XMLCALL +end_element_event_handler2(void *userData, const XML_Char *name) +{ + CharData *storage = (CharData *) userData; + char buffer[100]; + + sprintf(buffer, " at col:%d line:%d\n", name, + XML_GetCurrentColumnNumber(parser), + XML_GetCurrentLineNumber(parser)); + CharData_AppendString(storage, buffer); +} + +/* Regression test #3 for SF bug #653180. */ +START_TEST(test_line_and_column_numbers_inside_handlers) +{ + char *text = + "\n" /* Unix end-of-line */ + " \r\n" /* Windows end-of-line */ + " \r" /* Mac OS end-of-line */ + " \n" + " \n" + " \n" + " \n" + ""; + char *expected = + " at col:0 line:1\n" + " at col:2 line:2\n" + " at col:4 line:3\n" + " at col:8 line:3\n" + " at col:2 line:4\n" + " at col:2 line:5\n" + " at col:4 line:6\n" + " at col:8 line:6\n" + " at col:2 line:7\n" + " at col:0 line:8\n"; + CharData storage; + + CharData_Init(&storage); + XML_SetUserData(parser, &storage); + XML_SetStartElementHandler(parser, start_element_event_handler2); + XML_SetEndElementHandler(parser, end_element_event_handler2); + if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR) + xml_failure(parser); + + CharData_CheckString(&storage, expected); +} +END_TEST + +/* Regression test #4 for SF bug #653180. */ +START_TEST(test_line_number_after_error) +{ + char *text = + "\n" + " \n" + " "; /* missing */ + int lineno; + if (XML_Parse(parser, text, strlen(text), XML_FALSE) != XML_STATUS_ERROR) + fail("Expected a parse error"); + + lineno = XML_GetCurrentLineNumber(parser); + if (lineno != 3) { + char buffer[100]; + sprintf(buffer, "expected 3 lines, saw %d", lineno); + fail(buffer); + } +} +END_TEST + +/* Regression test #5 for SF bug #653180. */ +START_TEST(test_column_number_after_error) +{ + char *text = + "\n" + " \n" + " "; /* missing */ + int colno; + if (XML_Parse(parser, text, strlen(text), XML_FALSE) != XML_STATUS_ERROR) + fail("Expected a parse error"); + + colno = XML_GetCurrentColumnNumber(parser); + if (colno != 4) { + char buffer[100]; + sprintf(buffer, "expected 4 columns, saw %d", colno); + fail(buffer); + } +} +END_TEST + +/* Regression test for SF bug #478332. */ +START_TEST(test_really_long_lines) +{ + /* This parses an input line longer than INIT_DATA_BUF_SIZE + characters long (defined to be 1024 in xmlparse.c). We take a + really cheesy approach to building the input buffer, because + this avoids writing bugs in buffer-filling code. + */ + char *text = + "" + /* 64 chars */ + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+" + /* until we have at least 1024 characters on the line: */ + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+" + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+" + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+" + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+" + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+" + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+" + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+" + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+" + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+" + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+" + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+" + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+" + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+" + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+" + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+" + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+" + ""; + if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR) + xml_failure(parser); +} +END_TEST + + +/* + * Element event tests. + */ + +static void XMLCALL +end_element_event_handler(void *userData, const XML_Char *name) +{ + CharData *storage = (CharData *) userData; + CharData_AppendString(storage, "/"); + CharData_AppendXMLChars(storage, name, -1); +} + +START_TEST(test_end_element_events) +{ + char *text = ""; + char *expected = "/c/b/f/d/a"; + CharData storage; + + CharData_Init(&storage); + XML_SetUserData(parser, &storage); + XML_SetEndElementHandler(parser, end_element_event_handler); + if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR) + xml_failure(parser); + CharData_CheckString(&storage, expected); +} +END_TEST + + +/* + * Attribute tests. + */ + +/* Helpers used by the following test; this checks any "attr" and "refs" + attributes to make sure whitespace has been normalized. + + Return true if whitespace has been normalized in a string, using + the rules for attribute value normalization. The 'is_cdata' flag + is needed since CDATA attributes don't need to have multiple + whitespace characters collapsed to a single space, while other + attribute data types do. (Section 3.3.3 of the recommendation.) +*/ +static int +is_whitespace_normalized(const XML_Char *s, int is_cdata) +{ + int blanks = 0; + int at_start = 1; + while (*s) { + if (*s == ' ') + ++blanks; + else if (*s == '\t' || *s == '\n' || *s == '\r') + return 0; + else { + if (at_start) { + at_start = 0; + if (blanks && !is_cdata) + /* illegal leading blanks */ + return 0; + } + else if (blanks > 1 && !is_cdata) + return 0; + blanks = 0; + } + ++s; + } + if (blanks && !is_cdata) + return 0; + return 1; +} + +/* Check the attribute whitespace checker: */ +static void +testhelper_is_whitespace_normalized(void) +{ + assert(is_whitespace_normalized("abc", 0)); + assert(is_whitespace_normalized("abc", 1)); + assert(is_whitespace_normalized("abc def ghi", 0)); + assert(is_whitespace_normalized("abc def ghi", 1)); + assert(!is_whitespace_normalized(" abc def ghi", 0)); + assert(is_whitespace_normalized(" abc def ghi", 1)); + assert(!is_whitespace_normalized("abc def ghi", 0)); + assert(is_whitespace_normalized("abc def ghi", 1)); + assert(!is_whitespace_normalized("abc def ghi ", 0)); + assert(is_whitespace_normalized("abc def ghi ", 1)); + assert(!is_whitespace_normalized(" ", 0)); + assert(is_whitespace_normalized(" ", 1)); + assert(!is_whitespace_normalized("\t", 0)); + assert(!is_whitespace_normalized("\t", 1)); + assert(!is_whitespace_normalized("\n", 0)); + assert(!is_whitespace_normalized("\n", 1)); + assert(!is_whitespace_normalized("\r", 0)); + assert(!is_whitespace_normalized("\r", 1)); + assert(!is_whitespace_normalized("abc\t def", 1)); +} + +static void XMLCALL +check_attr_contains_normalized_whitespace(void *userData, + const XML_Char *name, + const XML_Char **atts) +{ + int i; + for (i = 0; atts[i] != NULL; i += 2) { + const XML_Char *attrname = atts[i]; + const XML_Char *value = atts[i + 1]; + if (strcmp("attr", attrname) == 0 + || strcmp("ents", attrname) == 0 + || strcmp("refs", attrname) == 0) { + if (!is_whitespace_normalized(value, 0)) { + char buffer[256]; + sprintf(buffer, "attribute value not normalized: %s='%s'", + attrname, value); + fail(buffer); + } + } + } +} + +START_TEST(test_attr_whitespace_normalization) +{ + char *text = + "\n" + "]>\n" + "\n" + " \n" + " \n" + ""; + + XML_SetStartElementHandler(parser, + check_attr_contains_normalized_whitespace); + if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR) + xml_failure(parser); +} +END_TEST + + +/* + * XML declaration tests. + */ + +START_TEST(test_xmldecl_misplaced) +{ + expect_failure("\n" + "\n" + "", + XML_ERROR_MISPLACED_XML_PI, + "failed to report misplaced XML declaration"); +} +END_TEST + +/* Regression test for SF bug #584832. */ +static int XMLCALL +UnknownEncodingHandler(void *data,const XML_Char *encoding,XML_Encoding *info) +{ + if (strcmp(encoding,"unsupported-encoding") == 0) { + int i; + for (i = 0; i < 256; ++i) + info->map[i] = i; + info->data = NULL; + info->convert = NULL; + info->release = NULL; + return XML_STATUS_OK; + } + return XML_STATUS_ERROR; +} + +START_TEST(test_unknown_encoding_internal_entity) +{ + char *text = + "\n" + "]>\n" + ""; + + XML_SetUnknownEncodingHandler(parser, UnknownEncodingHandler, NULL); + if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR) + xml_failure(parser); +} +END_TEST + +/* Regression test for SF bug #620106. */ +static int XMLCALL +external_entity_loader_set_encoding(XML_Parser parser, + const XML_Char *context, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId) +{ + /* This text says it's an unsupported encoding, but it's really + UTF-8, which we tell Expat using XML_SetEncoding(). + */ + char *text = + "" + "\xC3\xA9"; + XML_Parser extparser; + + extparser = XML_ExternalEntityParserCreate(parser, context, NULL); + if (extparser == NULL) + fail("Could not create external entity parser."); + if (!XML_SetEncoding(extparser, "utf-8")) + fail("XML_SetEncoding() ignored for external entity"); + if ( XML_Parse(extparser, text, strlen(text), XML_TRUE) + == XML_STATUS_ERROR) { + xml_failure(parser); + return 0; + } + return 1; +} + +START_TEST(test_ext_entity_set_encoding) +{ + char *text = + "\n" + "]>\n" + "&en;"; + + XML_SetExternalEntityRefHandler(parser, + external_entity_loader_set_encoding); + run_character_check(text, "\xC3\xA9"); +} +END_TEST + +/* Test that no error is reported for unknown entities if we don't + read an external subset. This was fixed in Expat 1.95.5. +*/ +START_TEST(test_wfc_undeclared_entity_unread_external_subset) { + char *text = + "\n" + "&entity;"; + + if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR) + xml_failure(parser); +} +END_TEST + +/* Test that an error is reported for unknown entities if we don't + have an external subset. +*/ +START_TEST(test_wfc_undeclared_entity_no_external_subset) { + expect_failure("&entity;", + XML_ERROR_UNDEFINED_ENTITY, + "Parser did not report undefined entity w/out a DTD."); +} +END_TEST + +/* Test that an error is reported for unknown entities if we don't + read an external subset, but have been declared standalone. +*/ +START_TEST(test_wfc_undeclared_entity_standalone) { + char *text = + "\n" + "\n" + "&entity;"; + + expect_failure(text, + XML_ERROR_UNDEFINED_ENTITY, + "Parser did not report undefined entity (standalone)."); +} +END_TEST + +static int XMLCALL +external_entity_loader(XML_Parser parser, + const XML_Char *context, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId) +{ + char *text = (char *)XML_GetUserData(parser); + XML_Parser extparser; + + extparser = XML_ExternalEntityParserCreate(parser, context, NULL); + if (extparser == NULL) + fail("Could not create external entity parser."); + if ( XML_Parse(extparser, text, strlen(text), XML_TRUE) + == XML_STATUS_ERROR) { + xml_failure(parser); + return XML_STATUS_ERROR; + } + return XML_STATUS_OK; +} + +/* Test that an error is reported for unknown entities if we have read + an external subset, and standalone is true. +*/ +START_TEST(test_wfc_undeclared_entity_with_external_subset_standalone) { + char *text = + "\n" + "\n" + "&entity;"; + char *foo_text = + ""; + + XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS); + XML_SetUserData(parser, foo_text); + XML_SetExternalEntityRefHandler(parser, external_entity_loader); + expect_failure(text, + XML_ERROR_UNDEFINED_ENTITY, + "Parser did not report undefined entity (external DTD)."); +} +END_TEST + +/* Test that no error is reported for unknown entities if we have read + an external subset, and standalone is false. +*/ +START_TEST(test_wfc_undeclared_entity_with_external_subset) { + char *text = + "\n" + "\n" + "&entity;"; + char *foo_text = + ""; + + XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS); + XML_SetUserData(parser, foo_text); + XML_SetExternalEntityRefHandler(parser, external_entity_loader); + if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR) + xml_failure(parser); +} +END_TEST + +START_TEST(test_wfc_no_recursive_entity_refs) +{ + char *text = + "\n" + "]>\n" + "&entity;"; + + expect_failure(text, + XML_ERROR_RECURSIVE_ENTITY_REF, + "Parser did not report recursive entity reference."); +} +END_TEST + +/* Regression test for SF bug #483514. */ +START_TEST(test_dtd_default_handling) +{ + char *text = + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "]>"; + + XML_SetDefaultHandler(parser, accumulate_characters); + XML_SetDoctypeDeclHandler(parser, + dummy_start_doctype_handler, + dummy_end_doctype_handler); + XML_SetEntityDeclHandler(parser, dummy_entity_decl_handler); + XML_SetNotationDeclHandler(parser, dummy_notation_decl_handler); + XML_SetElementDeclHandler(parser, dummy_element_decl_handler); + XML_SetAttlistDeclHandler(parser, dummy_attlist_decl_handler); + XML_SetProcessingInstructionHandler(parser, dummy_pi_handler); + XML_SetCommentHandler(parser, dummy_comment_handler); + run_character_check(text, "\n\n\n\n\n\n\n"); +} +END_TEST + +/* See related SF bug #673791. + When namespace processing is enabled, setting the namespace URI for + a prefix is not allowed; this test ensures that it *is* allowed + when namespace processing is not enabled. + (See Namespaces in XML, section 2.) +*/ +START_TEST(test_empty_ns_without_namespaces) +{ + char *text = + "\n" + " \n" + ""; + + if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR) + xml_failure(parser); +} +END_TEST + +/* Regression test for SF bug #824420. + Checks that an xmlns:prefix attribute set in an attribute's default + value isn't misinterpreted. +*/ +START_TEST(test_ns_in_attribute_default_without_namespaces) +{ + char *text = + "\n" + " ]>\n" + ""; + + if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR) + xml_failure(parser); +} +END_TEST + + +/* + * Namespaces tests. + */ + +static void +namespace_setup(void) +{ + parser = XML_ParserCreateNS(NULL, ' '); + if (parser == NULL) + fail("Parser not created."); +} + +static void +namespace_teardown(void) +{ + basic_teardown(); +} + +/* Check that an element name and attribute name match the expected values. + The expected values are passed as an array reference of string pointers + provided as the userData argument; the first is the expected + element name, and the second is the expected attribute name. +*/ +static void XMLCALL +triplet_start_checker(void *userData, const XML_Char *name, + const XML_Char **atts) +{ + char **elemstr = (char **)userData; + char buffer[1024]; + if (strcmp(elemstr[0], name) != 0) { + sprintf(buffer, "unexpected start string: '%s'", name); + fail(buffer); + } + if (strcmp(elemstr[1], atts[0]) != 0) { + sprintf(buffer, "unexpected attribute string: '%s'", atts[0]); + fail(buffer); + } +} + +/* Check that the element name passed to the end-element handler matches + the expected value. The expected value is passed as the first element + in an array of strings passed as the userData argument. +*/ +static void XMLCALL +triplet_end_checker(void *userData, const XML_Char *name) +{ + char **elemstr = (char **)userData; + if (strcmp(elemstr[0], name) != 0) { + char buffer[1024]; + sprintf(buffer, "unexpected end string: '%s'", name); + fail(buffer); + } +} + +START_TEST(test_return_ns_triplet) +{ + char *text = + ""; + char *elemstr[] = { + "http://expat.sf.net/ e foo", + "http://expat.sf.net/ a bar" + }; + XML_SetReturnNSTriplet(parser, XML_TRUE); + XML_SetUserData(parser, elemstr); + XML_SetElementHandler(parser, triplet_start_checker, triplet_end_checker); + if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR) + xml_failure(parser); +} +END_TEST + +static void XMLCALL +overwrite_start_checker(void *userData, const XML_Char *name, + const XML_Char **atts) +{ + CharData *storage = (CharData *) userData; + CharData_AppendString(storage, "start "); + CharData_AppendXMLChars(storage, name, -1); + while (*atts != NULL) { + CharData_AppendString(storage, "\nattribute "); + CharData_AppendXMLChars(storage, *atts, -1); + atts += 2; + } + CharData_AppendString(storage, "\n"); +} + +static void XMLCALL +overwrite_end_checker(void *userData, const XML_Char *name) +{ + CharData *storage = (CharData *) userData; + CharData_AppendString(storage, "end "); + CharData_AppendXMLChars(storage, name, -1); + CharData_AppendString(storage, "\n"); +} + +static void +run_ns_tagname_overwrite_test(char *text, char *result) +{ + CharData storage; + CharData_Init(&storage); + XML_SetUserData(parser, &storage); + XML_SetElementHandler(parser, + overwrite_start_checker, overwrite_end_checker); + if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR) + xml_failure(parser); + CharData_CheckString(&storage, result); +} + +/* Regression test for SF bug #566334. */ +START_TEST(test_ns_tagname_overwrite) +{ + char *text = + "\n" + " \n" + " \n" + ""; + char *result = + "start http://xml.libexpat.org/ e\n" + "start http://xml.libexpat.org/ f\n" + "attribute http://xml.libexpat.org/ attr\n" + "end http://xml.libexpat.org/ f\n" + "start http://xml.libexpat.org/ g\n" + "attribute http://xml.libexpat.org/ attr2\n" + "end http://xml.libexpat.org/ g\n" + "end http://xml.libexpat.org/ e\n"; + run_ns_tagname_overwrite_test(text, result); +} +END_TEST + +/* Regression test for SF bug #566334. */ +START_TEST(test_ns_tagname_overwrite_triplet) +{ + char *text = + "\n" + " \n" + " \n" + ""; + char *result = + "start http://xml.libexpat.org/ e n\n" + "start http://xml.libexpat.org/ f n\n" + "attribute http://xml.libexpat.org/ attr n\n" + "end http://xml.libexpat.org/ f n\n" + "start http://xml.libexpat.org/ g n\n" + "attribute http://xml.libexpat.org/ attr2 n\n" + "end http://xml.libexpat.org/ g n\n" + "end http://xml.libexpat.org/ e n\n"; + XML_SetReturnNSTriplet(parser, XML_TRUE); + run_ns_tagname_overwrite_test(text, result); +} +END_TEST + + +/* Regression test for SF bug #620343. */ +static void XMLCALL +start_element_fail(void *userData, + const XML_Char *name, const XML_Char **atts) +{ + /* We should never get here. */ + fail("should never reach start_element_fail()"); +} + +static void XMLCALL +start_ns_clearing_start_element(void *userData, + const XML_Char *prefix, + const XML_Char *uri) +{ + XML_SetStartElementHandler((XML_Parser) userData, NULL); +} + +START_TEST(test_start_ns_clears_start_element) +{ + /* This needs to use separate start/end tags; using the empty tag + syntax doesn't cause the problematic path through Expat to be + taken. + */ + char *text = ""; + + XML_SetStartElementHandler(parser, start_element_fail); + XML_SetStartNamespaceDeclHandler(parser, start_ns_clearing_start_element); + XML_UseParserAsHandlerArg(parser); + if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR) + xml_failure(parser); +} +END_TEST + +/* Regression test for SF bug #616863. */ +static int XMLCALL +external_entity_handler(XML_Parser parser, + const XML_Char *context, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId) +{ + int callno = 1 + (int)XML_GetUserData(parser); + char *text; + XML_Parser p2; + + if (callno == 1) + text = ("\n" + "\n" + "\n"); + else + text = ("" + ""); + + XML_SetUserData(parser, (void *) callno); + p2 = XML_ExternalEntityParserCreate(parser, context, NULL); + if (XML_Parse(p2, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR) { + xml_failure(p2); + return 0; + } + XML_ParserFree(p2); + return 1; +} + +START_TEST(test_default_ns_from_ext_subset_and_ext_ge) +{ + char *text = + "\n" + "\n" + "]>\n" + "\n" + "&en;\n" + ""; + + XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS); + XML_SetExternalEntityRefHandler(parser, external_entity_handler); + /* We actually need to set this handler to tickle this bug. */ + XML_SetStartElementHandler(parser, dummy_start_element); + XML_SetUserData(parser, NULL); + if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR) + xml_failure(parser); +} +END_TEST + +/* Regression test #1 for SF bug #673791. */ +START_TEST(test_ns_prefix_with_empty_uri_1) +{ + char *text = + "\n" + " \n" + ""; + + expect_failure(text, + XML_ERROR_SYNTAX, + "Did not report re-setting namespace" + " URI with prefix to ''."); +} +END_TEST + +/* Regression test #2 for SF bug #673791. */ +START_TEST(test_ns_prefix_with_empty_uri_2) +{ + char *text = + "\n" + ""; + + expect_failure(text, + XML_ERROR_SYNTAX, + "Did not report setting namespace URI with prefix to ''."); +} +END_TEST + +/* Regression test #3 for SF bug #673791. */ +START_TEST(test_ns_prefix_with_empty_uri_3) +{ + char *text = + "\n" + " \n" + "]>\n" + ""; + + expect_failure(text, + XML_ERROR_SYNTAX, + "Didn't report attr default setting NS w/ prefix to ''."); +} +END_TEST + +/* Regression test #4 for SF bug #673791. */ +START_TEST(test_ns_prefix_with_empty_uri_4) +{ + char *text = + "\n" + " \n" + "]>\n" + ""; + /* Packaged info expected by the end element handler; + the weird structuring lets us re-use the triplet_end_checker() + function also used for another test. */ + char *elemstr[] = { + "http://xml.libexpat.org/ doc prefix" + }; + XML_SetReturnNSTriplet(parser, XML_TRUE); + XML_SetUserData(parser, elemstr); + XML_SetEndElementHandler(parser, triplet_end_checker); + if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR) + xml_failure(parser); +} +END_TEST + +START_TEST(test_ns_default_with_empty_uri) +{ + char *text = + "\n" + " \n" + ""; + if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR) + xml_failure(parser); +} +END_TEST + +/* Regression test for SF bug #692964: two prefixes for one namespace. */ +START_TEST(test_ns_duplicate_attrs_diff_prefixes) +{ + char *text = + ""; + expect_failure(text, + XML_ERROR_DUPLICATE_ATTRIBUTE, + "did not report multiple attributes with same URI+name"); +} +END_TEST + +/* Regression test for SF bug #695401: unbound prefix. */ +START_TEST(test_ns_unbound_prefix_on_attribute) +{ + char *text = ""; + expect_failure(text, + XML_ERROR_UNBOUND_PREFIX, + "did not report unbound prefix on attribute"); +} +END_TEST + +/* Regression test for SF bug #695401: unbound prefix. */ +START_TEST(test_ns_unbound_prefix_on_element) +{ + char *text = ""; + expect_failure(text, + XML_ERROR_UNBOUND_PREFIX, + "did not report unbound prefix on element"); +} +END_TEST + +static Suite * +make_suite(void) +{ + Suite *s = suite_create("basic"); + TCase *tc_basic = tcase_create("basic tests"); + TCase *tc_namespace = tcase_create("XML namespaces"); + + suite_add_tcase(s, tc_basic); + tcase_add_checked_fixture(tc_basic, basic_setup, basic_teardown); + tcase_add_test(tc_basic, test_nul_byte); + tcase_add_test(tc_basic, test_u0000_char); + tcase_add_test(tc_basic, test_bom_utf8); + tcase_add_test(tc_basic, test_bom_utf16_be); + tcase_add_test(tc_basic, test_bom_utf16_le); + tcase_add_test(tc_basic, test_illegal_utf8); + tcase_add_test(tc_basic, test_utf16); + tcase_add_test(tc_basic, test_utf16_le_epilog_newline); + tcase_add_test(tc_basic, test_latin1_umlauts); + /* Regression test for SF bug #491986. */ + tcase_add_test(tc_basic, test_danish_latin1); + /* Regression test for SF bug #514281. */ + tcase_add_test(tc_basic, test_french_charref_hexidecimal); + tcase_add_test(tc_basic, test_french_charref_decimal); + tcase_add_test(tc_basic, test_french_latin1); + tcase_add_test(tc_basic, test_french_utf8); + tcase_add_test(tc_basic, test_utf8_false_rejection); + tcase_add_test(tc_basic, test_line_number_after_parse); + tcase_add_test(tc_basic, test_column_number_after_parse); + tcase_add_test(tc_basic, test_line_and_column_numbers_inside_handlers); + tcase_add_test(tc_basic, test_line_number_after_error); + tcase_add_test(tc_basic, test_column_number_after_error); + tcase_add_test(tc_basic, test_really_long_lines); + tcase_add_test(tc_basic, test_end_element_events); + tcase_add_test(tc_basic, test_attr_whitespace_normalization); + tcase_add_test(tc_basic, test_xmldecl_misplaced); + tcase_add_test(tc_basic, test_unknown_encoding_internal_entity); + tcase_add_test(tc_basic, + test_wfc_undeclared_entity_unread_external_subset); + tcase_add_test(tc_basic, test_wfc_undeclared_entity_no_external_subset); + tcase_add_test(tc_basic, test_wfc_undeclared_entity_standalone); + tcase_add_test(tc_basic, test_wfc_undeclared_entity_with_external_subset); + tcase_add_test(tc_basic, + test_wfc_undeclared_entity_with_external_subset_standalone); + tcase_add_test(tc_basic, test_wfc_no_recursive_entity_refs); + tcase_add_test(tc_basic, test_ext_entity_set_encoding); + tcase_add_test(tc_basic, test_dtd_default_handling); + tcase_add_test(tc_basic, test_empty_ns_without_namespaces); + tcase_add_test(tc_basic, test_ns_in_attribute_default_without_namespaces); + + suite_add_tcase(s, tc_namespace); + tcase_add_checked_fixture(tc_namespace, + namespace_setup, namespace_teardown); + tcase_add_test(tc_namespace, test_return_ns_triplet); + tcase_add_test(tc_namespace, test_ns_tagname_overwrite); + tcase_add_test(tc_namespace, test_ns_tagname_overwrite_triplet); + tcase_add_test(tc_namespace, test_start_ns_clears_start_element); + tcase_add_test(tc_namespace, test_default_ns_from_ext_subset_and_ext_ge); + tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_1); + tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_2); + tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_3); + tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_4); + tcase_add_test(tc_namespace, test_ns_default_with_empty_uri); + tcase_add_test(tc_namespace, test_ns_duplicate_attrs_diff_prefixes); + tcase_add_test(tc_namespace, test_ns_unbound_prefix_on_attribute); + tcase_add_test(tc_namespace, test_ns_unbound_prefix_on_element); + + return s; +} + + +int +main(int argc, char *argv[]) +{ + int i, nf; + int forking = 0, forking_set = 0; + int verbosity = CK_NORMAL; + Suite *s = make_suite(); + SRunner *sr = srunner_create(s); + + /* run the tests for internal helper functions */ + testhelper_is_whitespace_normalized(); + + for (i = 1; i < argc; ++i) { + char *opt = argv[i]; + if (strcmp(opt, "-v") == 0 || strcmp(opt, "--verbose") == 0) + verbosity = CK_VERBOSE; + else if (strcmp(opt, "-q") == 0 || strcmp(opt, "--quiet") == 0) + verbosity = CK_SILENT; + else if (strcmp(opt, "-f") == 0 || strcmp(opt, "--fork") == 0) { + forking = 1; + forking_set = 1; + } + else if (strcmp(opt, "-n") == 0 || strcmp(opt, "--no-fork") == 0) { + forking = 0; + forking_set = 1; + } + else { + fprintf(stderr, "runtests: unknown option '%s'\n", opt); + return 2; + } + } + if (forking_set) + srunner_set_fork_status(sr, forking ? CK_FORK : CK_NOFORK); + if (verbosity != CK_SILENT) + printf("Expat version: %s\n", XML_ExpatVersion()); + srunner_run_all(sr, verbosity); + nf = srunner_ntests_failed(sr); + srunner_free(sr); + suite_free(s); + + return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE; +} diff --git a/reactos/lib/expat/tests/xmltest.sh b/reactos/lib/expat/tests/xmltest.sh new file mode 100644 index 00000000000..ecb16371510 --- /dev/null +++ b/reactos/lib/expat/tests/xmltest.sh @@ -0,0 +1,137 @@ +#! /bin/sh + +# EXPAT TEST SCRIPT FOR W3C XML TEST SUITE + +# This script can be used to exercise Expat against the +# w3c.org xml test suite, available from +# http://www.w3.org/XML/Test/xmlts20020606.zip. + +# To run this script, first set XMLWF so that xmlwf can be +# found, then set the output directory with OUTPUT. + +# The script lists all test cases where Expat shows a discrepancy +# from the expected result. Test cases where only the canonical +# output differs are prefixed with "Output differs:", and a diff file +# is generated in the appropriate subdirectory under $OUTPUT. + +# If there are output files provided, the script will use +# output from xmlwf and compare the desired output against it. +# However, one has to take into account that the canonical output +# produced by xmlwf conforms to an older definition of canonical XML +# and does not generate notation declarations. + +MYDIR="`dirname \"$0\"`" +cd "$MYDIR" +MYDIR="`pwd`" +XMLWF="`dirname \"$MYDIR\"`/xmlwf/xmlwf" +# XMLWF=/usr/local/bin/xmlwf +TS="$MYDIR/XML-Test-Suite" +# OUTPUT must terminate with the directory separator. +OUTPUT="$TS/out/" +# OUTPUT=/home/tmp/xml-testsuite-out/ + + +RunXmlwfNotWF() { + $XMLWF $1 $2 > outfile || return $? + read outdata < outfile + if test "$outdata" = "" ; then + echo "Well formed: $3$2" + return 1 + else + return 0 + fi +} + +RunXmlwfWF() { + $XMLWF $1 -d "$OUTPUT$3" $2 > outfile || return $? + read outdata < outfile + if test "$outdata" = "" ; then + if [ -f out/$2 ] ; then + diff "$OUTPUT$3$2" out/$2 > outfile + if [ -s outfile ] ; then + cp outfile $OUTPUT$3${2}.diff + echo "Output differs: $3$2" + return 1 + fi + fi + return 0 + else + echo "In $3: $outdata" + return 1 + fi +} + +SUCCESS=0 +ERROR=0 + +########################## +# well-formed test cases # +########################## + +cd "$TS/xmlconf" +for xmldir in ibm/valid/P*/ \ + ibm/invalid/P*/ \ + xmltest/valid/ext-sa/ \ + xmltest/valid/not-sa/ \ + xmltest/invalid/ \ + xmltest/invalid/not-sa/ \ + xmltest/valid/sa/ \ + sun/valid/ \ + sun/invalid/ ; do + cd "$TS/xmlconf/$xmldir" + mkdir -p "$OUTPUT$xmldir" + for xmlfile in *.xml ; do + if RunXmlwfWF -p "$xmlfile" "$xmldir" ; then + SUCCESS=`expr $SUCCESS + 1` + else + ERROR=`expr $ERROR + 1` + fi + done + rm outfile +done + +cd "$TS/xmlconf/oasis" +mkdir -p "$OUTPUT"oasis/ +for xmlfile in *pass*.xml ; do + if RunXmlwfWF -p "$xmlfile" "oasis/" ; then + SUCCESS=`expr $SUCCESS + 1` + else + ERROR=`expr $ERROR + 1` + fi +done +rm outfile + +############################## +# not well-formed test cases # +############################## + +cd "$TS/xmlconf" +for xmldir in ibm/not-wf/P*/ \ + ibm/not-wf/misc/ \ + xmltest/not-wf/ext-sa/ \ + xmltest/not-wf/not-sa/ \ + xmltest/not-wf/sa/ \ + sun/not-wf/ ; do + cd "$TS/xmlconf/$xmldir" + for xmlfile in *.xml ; do + if RunXmlwfNotWF -p "$xmlfile" "$xmldir" ; then + SUCCESS=`expr $SUCCESS + 1` + else + ERROR=`expr $ERROR + 1` + fi + done + rm outfile +done + +cd "$TS/xmlconf/oasis" +for xmlfile in *fail*.xml ; do + if RunXmlwfNotWF -p "$xmlfile" "oasis/" ; then + SUCCESS=`expr $SUCCESS + 1` + else + ERROR=`expr $ERROR + 1` + fi +done +rm outfile + +echo "Passed: $SUCCESS" +echo "Failed: $ERROR" diff --git a/reactos/lib/expat/vms/README.vms b/reactos/lib/expat/vms/README.vms new file mode 100644 index 00000000000..3dd2ca73fee --- /dev/null +++ b/reactos/lib/expat/vms/README.vms @@ -0,0 +1,23 @@ +4-jun-2002 Craig A. Berry + Added rudimentary build procedures for + OpenVMS based on work by Martin Vorlaender. + + +You'll need MMS or its freeware equivalent MMK. Just go to the +top-level directory and type + +$ MMS/DESCRIPTION=[.vms] + + or + +$ MMK/DESCRIPTION=[.vms] + +You'll end up with the object library expat.olb. For now, installation +consists merely of copying the object library, include files, and +documentation to a suitable location. + +To-do list: + + -- create a shareable image + -- build and run the tests and build the xmlwf utility + -- create an install target diff --git a/reactos/lib/expat/vms/descrip.mms b/reactos/lib/expat/vms/descrip.mms new file mode 100644 index 00000000000..d9ee3d98e41 --- /dev/null +++ b/reactos/lib/expat/vms/descrip.mms @@ -0,0 +1,70 @@ +# Bare bones description file (Makefile) for OpenVMS + +PACKAGE = expat +VERSION = 1.95.8 +EXPAT_MAJOR_VERSION=1 +EXPAT_MINOR_VERSION=95 +EXPAT_EDIT=8 + +O = .obj +OLB = .olb + +LIBRARY = expat$(OLB) +LIBDIR = [.lib] +SOURCES = $(LIBDIR)xmlparse.c $(LIBDIR)xmltok.c $(LIBDIR)xmlrole.c +OBJECTS = xmlparse$(O) xmltok$(O) xmlrole$(O) + +TEMPLATES = xmltok_impl.c xmltok_ns.c +APIHEADER = $(LIBDIR)expat.h +HEADERS = $(LIBDIR)ascii.h $(LIBDIR)iasciitab.h $(LIBDIR)utf8tab.h $(LIBDIR)xmltok.h \ + $(LIBDIR)asciitab.h $(LIBDIR)latin1tab.h \ + $(LIBDIR)nametab.h $(LIBDIR)xmldef.h $(LIBDIR)xmlrole.h $(LIBDIR)xmltok_impl.h + +CONFIG_HEADER = expat_config.h +INCLUDES = /INCLUDE=([],[.lib]) +DEFS = /DEFINE=(PACKAGE="""$(PACKAGE)""",VERSION="""$(PACKAGE)_$(VERSION)""",HAVE_EXPAT_CONFIG_H) +LIBREVISION = 0 +LIBCURRENT = 1 +LIBAGE = 0 +# +COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) +# +# DISTFILES = $(DIST_COMMON) $(SOURCES) $(TEMPLATES) $(APIHEADER) $(HEADERS) +# +# TAR = gtar +# GZIP_ENV = --best +# +.FIRST : + IF F$SEARCH("$(LIBRARY)") .EQS. "" THEN $(LIBR) /CREATE /OBJECT $(LIBRARY) + +all : $(LIBRARY) + @ write sys$output "All made." + +.SUFFIXES : +.SUFFIXES : $(OLB) $(O) .C .H + +.c$(O) : + $(COMPILE) $(MMS$SOURCE) + +$(O)$(OLB) : + @ IF F$SEARCH("$(MMS$TARGET)") .EQS. "" - + THEN LIBRARY/CREATE/LOG $(MMS$TARGET) + @ LIBRARY /REPLACE /LOG $(MMS$TARGET) $(MMS$SOURCE) + +clean : + DELETE $(LIBRARY);*,*$(O);* + +$(LIBRARY) : $(LIBRARY)( $(OBJECTS) ) + $(LIBR) /COMPRESS $(MMS$TARGET) + +$(CONFIG_HEADER) : [.vms]expat_config.h + COPY/LOG $(MMS$SOURCE) $(MMS$TARGET) + +xmlparse$(O) : $(LIBDIR)xmlparse.c $(LIBDIR)expat.h $(LIBDIR)xmlrole.h $(LIBDIR)xmltok.h $(CONFIG_HEADER) + +xmlrole$(O) : $(LIBDIR)xmlrole.c $(LIBDIR)ascii.h $(LIBDIR)xmlrole.h $(CONFIG_HEADER) + +xmltok$(O) : $(LIBDIR)xmltok.c $(LIBDIR)xmltok_impl.c $(LIBDIR)xmltok_ns.c \ + $(LIBDIR)ascii.h $(LIBDIR)asciitab.h $(LIBDIR)iasciitab.h $(LIBDIR)latin1tab.h \ + $(LIBDIR)nametab.h $(LIBDIR)utf8tab.h $(LIBDIR)xmltok.h $(LIBDIR)xmltok_impl.h $(CONFIG_HEADER) + diff --git a/reactos/lib/expat/vms/expat_config.h b/reactos/lib/expat/vms/expat_config.h new file mode 100644 index 00000000000..d5db89e56c6 --- /dev/null +++ b/reactos/lib/expat/vms/expat_config.h @@ -0,0 +1,52 @@ +/* Copyright 2000, Clark Cooper + All rights reserved. + + This is free software. You are permitted to copy, distribute, or modify + it under the terms of the MIT/X license (contained in the COPYING file + with this distribution.) +*/ + +/* Define to empty if the keyword does not work. */ +#undef const + +/* Define if you have a working `mmap' system call. */ +#undef HAVE_MMAP + +/* Define to `long' if doesn't define. */ +#undef off_t + +/* Define to `unsigned' if doesn't define. */ +#undef size_t + +/* Define if your processor stores words with the most significant + byte first (like Motorola and SPARC, unlike Intel and VAX). */ +#undef WORDS_BIGENDIAN + +/* Define if you have the bcopy function. */ +#undef HAVE_BCOPY + +/* Define if you have the memmove function. */ +#define HAVE_MEMMOVE 1 + +/* Define if you have the header file. */ +#define HAVE_UNISTD_H 1 + +#define XML_NS +#define XML_DTD + +#ifdef WORDS_BIGENDIAN +#define XML_BYTE_ORDER 21 +#else +#define XML_BYTE_ORDER 12 +#endif + +#define XML_CONTEXT_BYTES 1024 + +#ifndef HAVE_MEMMOVE +#ifdef HAVE_BCOPY +#define memmove(d,s,l) bcopy((s),(d),(l)) +#else +#define memmove(d,s,l) ;punting on memmove; +#endif + +#endif diff --git a/reactos/lib/expat/win32/.cvsignore b/reactos/lib/expat/win32/.cvsignore new file mode 100644 index 00000000000..e7546777b6f --- /dev/null +++ b/reactos/lib/expat/win32/.cvsignore @@ -0,0 +1,10 @@ +expat.IAB +expat.IAD +expat.IMB +expat.IMD +expat.PFI +expat.PO +expat.PR +expat.PRI +expat.PS +expat.WK3 diff --git a/reactos/lib/expat/win32/MANIFEST.txt b/reactos/lib/expat/win32/MANIFEST.txt new file mode 100644 index 00000000000..66b780ed34c --- /dev/null +++ b/reactos/lib/expat/win32/MANIFEST.txt @@ -0,0 +1,29 @@ + Overview of the Expat distribution + +The Expat distribution creates several subdirectories on your system. +Some of these directories contain components of interest to all Expat +users, and some contain material of interest to developers who wish to +use Expat in their applications. In the list below, is the +directory you specified to the installer. + + Directory Contents + -------------------------------------------------------------------- + \ The XML well-formedness checker and some general + information files. + + \Doc\ API documentation for developers. + + \Libs\ Pre-compiled dynamic libraries for developers. + + \StaticLibs\ Pre-compiled static libraries for developers. + + \Source\ Source code, which may interest some developers, + including a workspace for Microsft Visual C++. + The source code includes the parser, the well- + formedness checker, and a couple of small sample + applications. + + \Source\bcb5\ Project files for Borland C++ Builder 5 and BCC + 5.5. + + \Unistall\ The uninstaller and its data files. diff --git a/reactos/lib/expat/win32/README.txt b/reactos/lib/expat/win32/README.txt new file mode 100644 index 00000000000..bf01dc7fdf0 --- /dev/null +++ b/reactos/lib/expat/win32/README.txt @@ -0,0 +1,59 @@ + +Expat can be built on Windows in three ways: + using MS Visual C++ 6, Borland C++ Builder 5 or Cygwin. + +* Cygwin: + This follows the Unix build procedures. + +* C++ Builder 5: + Possible with make files in the BCB5 subdirectory. + Details can be found in the ReadMe file located there. + +* MS Visual C++ 6: + Based on workspace (.dsw) and project files (.dsp) + located in the lib subdirectory. + +* Special note about MS VC++ and runtime libraries: + + There are three possible configurations: using the + single threaded or multithreaded run-time library, + or using the multi-threaded run-time Dll. That is, + one can build three different Expat libraries depending + on the needs of the application. + + Dynamic Linking: + + By default the Expat Dlls are built to link statically + with the multi-threaded run-time library. + The libraries are named + - libexpat(w).dll + - libexpat(w).lib (import library) + The "w" indicates the UTF-16 version of the library. + + One rarely uses other versions of the Dll, but they can + be built easily by specifying a different RTL linkage in + the IDE on the C/C++ tab under the category Code Generation. + + Static Linking: + + The libraries should be named like this: + Single-theaded: libexpat(w)ML.lib + Multi-threaded: libexpat(w)MT.lib + Multi-threaded Dll: libexpat(w)MD.lib + The suffixes conform to the compiler switch settings + /ML, /MT and /MD for MS VC++. + + By default, the expat-static and expatw-static projects are set up + to link statically against the multithreaded run-time library, + so they will build libexpatMT.lib or libexpatwMT.lib files. + + To build the other versions of the static library, + go to Project - Settings: + - specify a different RTL linkage on the C/C++ tab + under the category Code Generation. + - then, on the Library tab, change the output file name + accordingly, as described above + + An application linking to the static libraries must + have the global macro XML_STATIC defined. + \ No newline at end of file diff --git a/reactos/lib/expat/win32/expat.iss b/reactos/lib/expat/win32/expat.iss new file mode 100644 index 00000000000..5bb963990a1 --- /dev/null +++ b/reactos/lib/expat/win32/expat.iss @@ -0,0 +1,62 @@ +; Basic setup script for the Inno Setep installer builder. For more +; information on the free installer builder, see www.jrsoftware.org. +; +; This script was contributed by Tim Peters. +; The current version is used with Inno Setup 2.0.19. + +[Setup] +AppName=expat +AppId=expat +AppVersion=1.95.7 +AppVerName=expat 1.95.7 +AppCopyright=Copyright 1998-2003 Thai Open Source Software Center, Clark Cooper, and the Expat maintainers +DefaultDirName={sd}\Expat-1.95.7 +AppPublisher=The Expat Developers +AppPublisherURL=http://www.libexpat.org/ +AppSupportURL=http://www.libexpat.org/ +AppUpdatesURL=http://www.libexpat.org/ +UninstallDisplayName=Expat XML Parser (version 1.95.7) +UninstallFilesDir={app}\Uninstall + +Compression=bzip/9 +SourceDir=.. +OutputDir=win32 +DisableStartupPrompt=yes +AllowNoIcons=yes +DisableProgramGroupPage=yes +DisableReadyPage=yes + +[Files] +CopyMode: alwaysoverwrite; Source: xmlwf\Release\*.exe; DestDir: "{app}" +CopyMode: alwaysoverwrite; Source: win32\MANIFEST.txt; DestDir: "{app}" +CopyMode: alwaysoverwrite; Source: Changes; DestDir: "{app}"; DestName: Changes.txt +CopyMode: alwaysoverwrite; Source: COPYING; DestDir: "{app}"; DestName: COPYING.txt +CopyMode: alwaysoverwrite; Source: README; DestDir: "{app}"; DestName: README.txt +CopyMode: alwaysoverwrite; Source: doc\*.html; DestDir: "{app}\Doc" +CopyMode: alwaysoverwrite; Source: doc\*.css; DestDir: "{app}\Doc" +CopyMode: alwaysoverwrite; Source: doc\*.png; DestDir: "{app}\Doc" +CopyMode: alwaysoverwrite; Source: lib\Release\*.dll; DestDir: "{app}\Libs" +CopyMode: alwaysoverwrite; Source: lib\Release\*.lib; DestDir: "{app}\Libs" +CopyMode: alwaysoverwrite; Source: lib\Release-w\*.dll; DestDir: "{app}\Libs" +CopyMode: alwaysoverwrite; Source: lib\Release-w\*.lib; DestDir: "{app}\Libs" +CopyMode: alwaysoverwrite; Source: lib\Release_static\*.lib; DestDir: "{app}\StaticLibs" +CopyMode: alwaysoverwrite; Source: lib\Release-w_static\*.lib; DestDir: "{app}\StaticLibs" +CopyMode: alwaysoverwrite; Source: expat.dsw; DestDir: "{app}\Source" +CopyMode: alwaysoverwrite; Source: win32\README.txt; DestDir: "{app}\Source" +CopyMode: alwaysoverwrite; Source: bcb5\*.*; DestDir: "{app}\Source\bcb5" +CopyMode: alwaysoverwrite; Source: lib\*.c; DestDir: "{app}\Source\lib" +CopyMode: alwaysoverwrite; Source: lib\*.h; DestDir: "{app}\Source\lib" +CopyMode: alwaysoverwrite; Source: lib\*.def; DestDir: "{app}\Source\lib" +CopyMode: alwaysoverwrite; Source: lib\*.dsp; DestDir: "{app}\Source\lib" +CopyMode: alwaysoverwrite; Source: examples\*.c; DestDir: "{app}\Source\examples" +CopyMode: alwaysoverwrite; Source: examples\*.dsp; DestDir: "{app}\Source\examples" +CopyMode: alwaysoverwrite; Source: tests\*.c; DestDir: "{app}\Source\tests" +CopyMode: alwaysoverwrite; Source: tests\*.h; DestDir: "{app}\Source\tests" +CopyMode: alwaysoverwrite; Source: tests\README.txt; DestDir: "{app}\Source\tests" +CopyMode: alwaysoverwrite; Source: xmlwf\*.c*; DestDir: "{app}\Source\xmlwf" +CopyMode: alwaysoverwrite; Source: xmlwf\*.h; DestDir: "{app}\Source\xmlwf" +CopyMode: alwaysoverwrite; Source: xmlwf\*.dsp; DestDir: "{app}\Source\xmlwf" + +[Messages] +WelcomeLabel1=Welcome to the Expat XML Parser Setup Wizard +WelcomeLabel2=This will install [name/ver] on your computer.%n%nExpat is an XML parser with a C-language API, and is primarily made available to allow developers to build applications which use XML using a portable API and fast implementation.%n%nIt is strongly recommended that you close all other applications you have running before continuing. This will help prevent any conflicts during the installation process. diff --git a/reactos/lib/expat/xmlwf/.cvsignore b/reactos/lib/expat/xmlwf/.cvsignore new file mode 100644 index 00000000000..90464b41331 --- /dev/null +++ b/reactos/lib/expat/xmlwf/.cvsignore @@ -0,0 +1,6 @@ +Debug +Release +xmlwf.plg +Makefile +xmlwf +.libs diff --git a/reactos/lib/expat/xmlwf/codepage.c b/reactos/lib/expat/xmlwf/codepage.c new file mode 100644 index 00000000000..b8fdb7a6c9a --- /dev/null +++ b/reactos/lib/expat/xmlwf/codepage.c @@ -0,0 +1,68 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#include "codepage.h" + +#ifdef WIN32 +#define STRICT 1 +#define WIN32_LEAN_AND_MEAN 1 + +#include + +int +codepageMap(int cp, int *map) +{ + int i; + CPINFO info; + if (!GetCPInfo(cp, &info) || info.MaxCharSize > 2) + return 0; + for (i = 0; i < 256; i++) + map[i] = -1; + if (info.MaxCharSize > 1) { + for (i = 0; i < MAX_LEADBYTES; i++) { + int j, lim; + if (info.LeadByte[i] == 0 && info.LeadByte[i + 1] == 0) + break; + lim = info.LeadByte[i + 1]; + for (j = info.LeadByte[i]; j < lim; j++) + map[j] = -2; + } + } + for (i = 0; i < 256; i++) { + if (map[i] == -1) { + char c = (char)i; + unsigned short n; + if (MultiByteToWideChar(cp, MB_PRECOMPOSED|MB_ERR_INVALID_CHARS, + &c, 1, &n, 1) == 1) + map[i] = n; + } + } + return 1; +} + +int +codepageConvert(int cp, const char *p) +{ + unsigned short c; + if (MultiByteToWideChar(cp, MB_PRECOMPOSED|MB_ERR_INVALID_CHARS, + p, 2, &c, 1) == 1) + return c; + return -1; +} + +#else /* not WIN32 */ + +int +codepageMap(int cp, int *map) +{ + return 0; +} + +int +codepageConvert(int cp, const char *p) +{ + return -1; +} + +#endif /* not WIN32 */ diff --git a/reactos/lib/expat/xmlwf/codepage.h b/reactos/lib/expat/xmlwf/codepage.h new file mode 100644 index 00000000000..6a4df68883e --- /dev/null +++ b/reactos/lib/expat/xmlwf/codepage.h @@ -0,0 +1,6 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +int codepageMap(int cp, int *map); +int codepageConvert(int cp, const char *p); diff --git a/reactos/lib/expat/xmlwf/ct.c b/reactos/lib/expat/xmlwf/ct.c new file mode 100644 index 00000000000..95903a34500 --- /dev/null +++ b/reactos/lib/expat/xmlwf/ct.c @@ -0,0 +1,147 @@ +#define CHARSET_MAX 41 + +static const char * +getTok(const char **pp) +{ + enum { inAtom, inString, init, inComment }; + int state = init; + const char *tokStart = 0; + for (;;) { + switch (**pp) { + case '\0': + return 0; + case ' ': + case '\r': + case '\t': + case '\n': + if (state == inAtom) + return tokStart; + break; + case '(': + if (state == inAtom) + return tokStart; + if (state != inString) + state++; + break; + case ')': + if (state > init) + --state; + else if (state != inString) + return 0; + break; + case ';': + case '/': + case '=': + if (state == inAtom) + return tokStart; + if (state == init) + return (*pp)++; + break; + case '\\': + ++*pp; + if (**pp == '\0') + return 0; + break; + case '"': + switch (state) { + case inString: + ++*pp; + return tokStart; + case inAtom: + return tokStart; + case init: + tokStart = *pp; + state = inString; + break; + } + break; + default: + if (state == init) { + tokStart = *pp; + state = inAtom; + } + break; + } + ++*pp; + } + /* not reached */ +} + +/* key must be lowercase ASCII */ + +static int +matchkey(const char *start, const char *end, const char *key) +{ + if (!start) + return 0; + for (; start != end; start++, key++) + if (*start != *key && *start != 'A' + (*key - 'a')) + return 0; + return *key == '\0'; +} + +void +getXMLCharset(const char *buf, char *charset) +{ + const char *next, *p; + + charset[0] = '\0'; + next = buf; + p = getTok(&next); + if (matchkey(p, next, "text")) + strcpy(charset, "us-ascii"); + else if (!matchkey(p, next, "application")) + return; + p = getTok(&next); + if (!p || *p != '/') + return; + p = getTok(&next); + if (matchkey(p, next, "xml")) + isXml = 1; + p = getTok(&next); + while (p) { + if (*p == ';') { + p = getTok(&next); + if (matchkey(p, next, "charset")) { + p = getTok(&next); + if (p && *p == '=') { + p = getTok(&next); + if (p) { + char *s = charset; + if (*p == '"') { + while (++p != next - 1) { + if (*p == '\\') + ++p; + if (s == charset + CHARSET_MAX - 1) { + charset[0] = '\0'; + break; + } + *s++ = *p; + } + *s++ = '\0'; + } + else { + if (next - p > CHARSET_MAX - 1) + break; + while (p != next) + *s++ = *p++; + *s = 0; + break; + } + } + } + } + } + else + p = getTok(&next); + } +} + +int +main(int argc, char **argv) +{ + char buf[CHARSET_MAX]; + getXMLCharset(argv[1], buf); + printf("charset = \"%s\"\n", buf); + return 0; +} diff --git a/reactos/lib/expat/xmlwf/filemap.h b/reactos/lib/expat/xmlwf/filemap.h new file mode 100644 index 00000000000..814edec2528 --- /dev/null +++ b/reactos/lib/expat/xmlwf/filemap.h @@ -0,0 +1,17 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#include + +#ifdef XML_UNICODE +int filemap(const wchar_t *name, + void (*processor)(const void *, size_t, + const wchar_t *, void *arg), + void *arg); +#else +int filemap(const char *name, + void (*processor)(const void *, size_t, + const char *, void *arg), + void *arg); +#endif diff --git a/reactos/lib/expat/xmlwf/readfilemap.c b/reactos/lib/expat/xmlwf/readfilemap.c new file mode 100644 index 00000000000..64c69850c2d --- /dev/null +++ b/reactos/lib/expat/xmlwf/readfilemap.c @@ -0,0 +1,78 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#include +#include +#include +#include +#include + +#ifndef S_ISREG +#ifndef S_IFREG +#define S_IFREG _S_IFREG +#endif +#ifndef S_IFMT +#define S_IFMT _S_IFMT +#endif +#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) +#endif /* not S_ISREG */ + +#ifndef O_BINARY +#ifdef _O_BINARY +#define O_BINARY _O_BINARY +#else +#define O_BINARY 0 +#endif +#endif + +#include "filemap.h" + +int +filemap(const char *name, + void (*processor)(const void *, size_t, const char *, void *arg), + void *arg) +{ + size_t nbytes; + int fd; + int n; + struct stat sb; + void *p; + + fd = open(name, O_RDONLY|O_BINARY); + if (fd < 0) { + perror(name); + return 0; + } + if (fstat(fd, &sb) < 0) { + perror(name); + return 0; + } + if (!S_ISREG(sb.st_mode)) { + fprintf(stderr, "%s: not a regular file\n", name); + return 0; + } + nbytes = sb.st_size; + p = malloc(nbytes); + if (!p) { + fprintf(stderr, "%s: out of memory\n", name); + return 0; + } + n = read(fd, p, nbytes); + if (n < 0) { + perror(name); + free(p); + close(fd); + return 0; + } + if (n != nbytes) { + fprintf(stderr, "%s: read unexpected number of bytes\n", name); + free(p); + close(fd); + return 0; + } + processor(p, nbytes, name, arg); + free(p); + close(fd); + return 1; +} diff --git a/reactos/lib/expat/xmlwf/unixfilemap.c b/reactos/lib/expat/xmlwf/unixfilemap.c new file mode 100644 index 00000000000..22048c82ed7 --- /dev/null +++ b/reactos/lib/expat/xmlwf/unixfilemap.c @@ -0,0 +1,58 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef MAP_FILE +#define MAP_FILE 0 +#endif + +#include "filemap.h" + +int +filemap(const char *name, + void (*processor)(const void *, size_t, const char *, void *arg), + void *arg) +{ + int fd; + size_t nbytes; + struct stat sb; + void *p; + + fd = open(name, O_RDONLY); + if (fd < 0) { + perror(name); + return 0; + } + if (fstat(fd, &sb) < 0) { + perror(name); + close(fd); + return 0; + } + if (!S_ISREG(sb.st_mode)) { + close(fd); + fprintf(stderr, "%s: not a regular file\n", name); + return 0; + } + + nbytes = sb.st_size; + p = (void *)mmap((caddr_t)0, (size_t)nbytes, PROT_READ, + MAP_FILE|MAP_PRIVATE, fd, (off_t)0); + if (p == (void *)-1) { + perror(name); + close(fd); + return 0; + } + processor(p, nbytes, name, arg); + munmap((caddr_t)p, nbytes); + close(fd); + return 1; +} diff --git a/reactos/lib/expat/xmlwf/win32filemap.c b/reactos/lib/expat/xmlwf/win32filemap.c new file mode 100644 index 00000000000..41dc35b614d --- /dev/null +++ b/reactos/lib/expat/xmlwf/win32filemap.c @@ -0,0 +1,96 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#define STRICT 1 +#define WIN32_LEAN_AND_MEAN 1 + +#ifdef XML_UNICODE_WCHAR_T +#ifndef XML_UNICODE +#define XML_UNICODE +#endif +#endif + +#ifdef XML_UNICODE +#define UNICODE +#define _UNICODE +#endif /* XML_UNICODE */ +#include +#include +#include +#include "filemap.h" + +static void win32perror(const TCHAR *); + +int +filemap(const TCHAR *name, + void (*processor)(const void *, size_t, const TCHAR *, void *arg), + void *arg) +{ + HANDLE f; + HANDLE m; + DWORD size; + DWORD sizeHi; + void *p; + + f = CreateFile(name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, + FILE_FLAG_SEQUENTIAL_SCAN, NULL); + if (f == INVALID_HANDLE_VALUE) { + win32perror(name); + return 0; + } + size = GetFileSize(f, &sizeHi); + if (size == (DWORD)-1) { + win32perror(name); + return 0; + } + if (sizeHi) { + _ftprintf(stderr, _T("%s: bigger than 2Gb\n"), name); + return 0; + } + /* CreateFileMapping barfs on zero length files */ + if (size == 0) { + static const char c = '\0'; + processor(&c, 0, name, arg); + CloseHandle(f); + return 1; + } + m = CreateFileMapping(f, NULL, PAGE_READONLY, 0, 0, NULL); + if (m == NULL) { + win32perror(name); + CloseHandle(f); + return 0; + } + p = MapViewOfFile(m, FILE_MAP_READ, 0, 0, 0); + if (p == NULL) { + win32perror(name); + CloseHandle(m); + CloseHandle(f); + return 0; + } + processor(p, size, name, arg); + UnmapViewOfFile(p); + CloseHandle(m); + CloseHandle(f); + return 1; +} + +static void +win32perror(const TCHAR *s) +{ + LPVOID buf; + if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER + | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &buf, + 0, + NULL)) { + _ftprintf(stderr, _T("%s: %s"), s, buf); + fflush(stderr); + LocalFree(buf); + } + else + _ftprintf(stderr, _T("%s: unknown Windows error\n"), s); +} diff --git a/reactos/lib/expat/xmlwf/xmlfile.c b/reactos/lib/expat/xmlwf/xmlfile.c new file mode 100644 index 00000000000..6cb071533c0 --- /dev/null +++ b/reactos/lib/expat/xmlwf/xmlfile.c @@ -0,0 +1,233 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#include +#include +#include +#include +#include +#ifdef COMPILED_FROM_DSP +#include "winconfig.h" +#else +#ifdef HAVE_EXPAT_CONFIG_H +#include "expat_config.h" +#endif +#endif +#include "expat.h" +#include "xmlfile.h" +#include "xmltchar.h" +#include "filemap.h" + +#ifdef _MSC_VER +#include +#endif + +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifndef O_BINARY +#ifdef _O_BINARY +#define O_BINARY _O_BINARY +#else +#define O_BINARY 0 +#endif +#endif + +#ifdef _DEBUG +#define READ_SIZE 16 +#else +#define READ_SIZE (1024*8) +#endif + + +typedef struct { + XML_Parser parser; + int *retPtr; +} PROCESS_ARGS; + +static void +reportError(XML_Parser parser, const XML_Char *filename) +{ + int code = XML_GetErrorCode(parser); + const XML_Char *message = XML_ErrorString(code); + if (message) + ftprintf(stdout, T("%s:%d:%d: %s\n"), + filename, + XML_GetErrorLineNumber(parser), + XML_GetErrorColumnNumber(parser), + message); + else + ftprintf(stderr, T("%s: (unknown message %d)\n"), filename, code); +} + +static void +processFile(const void *data, size_t size, + const XML_Char *filename, void *args) +{ + XML_Parser parser = ((PROCESS_ARGS *)args)->parser; + int *retPtr = ((PROCESS_ARGS *)args)->retPtr; + if (XML_Parse(parser, data, size, 1) == XML_STATUS_ERROR) { + reportError(parser, filename); + *retPtr = 0; + } + else + *retPtr = 1; +} + +#ifdef WIN32 + +static int +isAsciiLetter(XML_Char c) +{ + return (T('a') <= c && c <= T('z')) || (T('A') <= c && c <= T('Z')); +} + +#endif /* WIN32 */ + +static const XML_Char * +resolveSystemId(const XML_Char *base, const XML_Char *systemId, + XML_Char **toFree) +{ + XML_Char *s; + *toFree = 0; + if (!base + || *systemId == T('/') +#ifdef WIN32 + || *systemId == T('\\') + || (isAsciiLetter(systemId[0]) && systemId[1] == T(':')) +#endif + ) + return systemId; + *toFree = (XML_Char *)malloc((tcslen(base) + tcslen(systemId) + 2) + * sizeof(XML_Char)); + if (!*toFree) + return systemId; + tcscpy(*toFree, base); + s = *toFree; + if (tcsrchr(s, T('/'))) + s = tcsrchr(s, T('/')) + 1; +#ifdef WIN32 + if (tcsrchr(s, T('\\'))) + s = tcsrchr(s, T('\\')) + 1; +#endif + tcscpy(s, systemId); + return *toFree; +} + +static int +externalEntityRefFilemap(XML_Parser parser, + const XML_Char *context, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId) +{ + int result; + XML_Char *s; + const XML_Char *filename; + XML_Parser entParser = XML_ExternalEntityParserCreate(parser, context, 0); + PROCESS_ARGS args; + args.retPtr = &result; + args.parser = entParser; + filename = resolveSystemId(base, systemId, &s); + XML_SetBase(entParser, filename); + if (!filemap(filename, processFile, &args)) + result = 0; + free(s); + XML_ParserFree(entParser); + return result; +} + +static int +processStream(const XML_Char *filename, XML_Parser parser) +{ + /* passing NULL for filename means read intput from stdin */ + int fd = 0; /* 0 is the fileno for stdin */ + + if (filename != NULL) { + fd = topen(filename, O_BINARY|O_RDONLY); + if (fd < 0) { + tperror(filename); + return 0; + } + } + for (;;) { + int nread; + char *buf = XML_GetBuffer(parser, READ_SIZE); + if (!buf) { + if (filename != NULL) + close(fd); + ftprintf(stderr, T("%s: out of memory\n"), + filename != NULL ? filename : "xmlwf"); + return 0; + } + nread = read(fd, buf, READ_SIZE); + if (nread < 0) { + tperror(filename != NULL ? filename : "STDIN"); + if (filename != NULL) + close(fd); + return 0; + } + if (XML_ParseBuffer(parser, nread, nread == 0) == XML_STATUS_ERROR) { + reportError(parser, filename != NULL ? filename : "STDIN"); + if (filename != NULL) + close(fd); + return 0; + } + if (nread == 0) { + if (filename != NULL) + close(fd); + break;; + } + } + return 1; +} + +static int +externalEntityRefStream(XML_Parser parser, + const XML_Char *context, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId) +{ + XML_Char *s; + const XML_Char *filename; + int ret; + XML_Parser entParser = XML_ExternalEntityParserCreate(parser, context, 0); + filename = resolveSystemId(base, systemId, &s); + XML_SetBase(entParser, filename); + ret = processStream(filename, entParser); + free(s); + XML_ParserFree(entParser); + return ret; +} + +int +XML_ProcessFile(XML_Parser parser, + const XML_Char *filename, + unsigned flags) +{ + int result; + + if (!XML_SetBase(parser, filename)) { + ftprintf(stderr, T("%s: out of memory"), filename); + exit(1); + } + + if (flags & XML_EXTERNAL_ENTITIES) + XML_SetExternalEntityRefHandler(parser, + (flags & XML_MAP_FILE) + ? externalEntityRefFilemap + : externalEntityRefStream); + if (flags & XML_MAP_FILE) { + PROCESS_ARGS args; + args.retPtr = &result; + args.parser = parser; + if (!filemap(filename, processFile, &args)) + result = 0; + } + else + result = processStream(filename, parser); + return result; +} diff --git a/reactos/lib/expat/xmlwf/xmlfile.h b/reactos/lib/expat/xmlwf/xmlfile.h new file mode 100644 index 00000000000..d053365e342 --- /dev/null +++ b/reactos/lib/expat/xmlwf/xmlfile.h @@ -0,0 +1,10 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#define XML_MAP_FILE 01 +#define XML_EXTERNAL_ENTITIES 02 + +extern int XML_ProcessFile(XML_Parser parser, + const XML_Char *filename, + unsigned flags); diff --git a/reactos/lib/expat/xmlwf/xmlmime.c b/reactos/lib/expat/xmlwf/xmlmime.c new file mode 100644 index 00000000000..56a0e7f40e4 --- /dev/null +++ b/reactos/lib/expat/xmlwf/xmlmime.c @@ -0,0 +1,163 @@ +#include +#include "xmlmime.h" + +static const char * +getTok(const char **pp) +{ + /* inComment means one level of nesting; inComment+1 means two levels etc */ + enum { inAtom, inString, init, inComment }; + int state = init; + const char *tokStart = 0; + for (;;) { + switch (**pp) { + case '\0': + if (state == inAtom) + return tokStart; + return 0; + case ' ': + case '\r': + case '\t': + case '\n': + if (state == inAtom) + return tokStart; + break; + case '(': + if (state == inAtom) + return tokStart; + if (state != inString) + state++; + break; + case ')': + if (state > init) + --state; + else if (state != inString) + return 0; + break; + case ';': + case '/': + case '=': + if (state == inAtom) + return tokStart; + if (state == init) + return (*pp)++; + break; + case '\\': + ++*pp; + if (**pp == '\0') + return 0; + break; + case '"': + switch (state) { + case inString: + ++*pp; + return tokStart; + case inAtom: + return tokStart; + case init: + tokStart = *pp; + state = inString; + break; + } + break; + default: + if (state == init) { + tokStart = *pp; + state = inAtom; + } + break; + } + ++*pp; + } + /* not reached */ +} + +/* key must be lowercase ASCII */ + +static int +matchkey(const char *start, const char *end, const char *key) +{ + if (!start) + return 0; + for (; start != end; start++, key++) + if (*start != *key && *start != 'A' + (*key - 'a')) + return 0; + return *key == '\0'; +} + +void +getXMLCharset(const char *buf, char *charset) +{ + const char *next, *p; + + charset[0] = '\0'; + next = buf; + p = getTok(&next); + if (matchkey(p, next, "text")) + strcpy(charset, "us-ascii"); + else if (!matchkey(p, next, "application")) + return; + p = getTok(&next); + if (!p || *p != '/') + return; + p = getTok(&next); +#if 0 + if (!matchkey(p, next, "xml") && charset[0] == '\0') + return; +#endif + p = getTok(&next); + while (p) { + if (*p == ';') { + p = getTok(&next); + if (matchkey(p, next, "charset")) { + p = getTok(&next); + if (p && *p == '=') { + p = getTok(&next); + if (p) { + char *s = charset; + if (*p == '"') { + while (++p != next - 1) { + if (*p == '\\') + ++p; + if (s == charset + CHARSET_MAX - 1) { + charset[0] = '\0'; + break; + } + *s++ = *p; + } + *s++ = '\0'; + } + else { + if (next - p > CHARSET_MAX - 1) + break; + while (p != next) + *s++ = *p++; + *s = 0; + break; + } + } + } + break; + } + } + else + p = getTok(&next); + } +} + +#ifdef TEST + +#include + +int +main(int argc, char *argv[]) +{ + char buf[CHARSET_MAX]; + if (argc <= 1) + return 1; + printf("%s\n", argv[1]); + getXMLCharset(argv[1], buf); + printf("charset=\"%s\"\n", buf); + return 0; +} + +#endif /* TEST */ diff --git a/reactos/lib/expat/xmlwf/xmlmime.h b/reactos/lib/expat/xmlwf/xmlmime.h new file mode 100644 index 00000000000..bf0356df0d9 --- /dev/null +++ b/reactos/lib/expat/xmlwf/xmlmime.h @@ -0,0 +1,19 @@ +#ifdef __cplusplus +extern "C" { +#endif + +/* Registered charset names are at most 40 characters long. */ + +#define CHARSET_MAX 41 + +/* Figure out the charset to use from the ContentType. + buf contains the body of the header field (the part after "Content-Type:"). + charset gets the charset to use. It must be at least CHARSET_MAX chars + long. charset will be empty if the default charset should be used. +*/ + +void getXMLCharset(const char *buf, char *charset); + +#ifdef __cplusplus +} +#endif diff --git a/reactos/lib/expat/xmlwf/xmltchar.h b/reactos/lib/expat/xmlwf/xmltchar.h new file mode 100644 index 00000000000..1088575512d --- /dev/null +++ b/reactos/lib/expat/xmlwf/xmltchar.h @@ -0,0 +1,36 @@ +#ifdef XML_UNICODE +#ifndef XML_UNICODE_WCHAR_T +#error xmlwf requires a 16-bit Unicode-compatible wchar_t +#endif +#define T(x) L ## x +#define ftprintf fwprintf +#define tfopen _wfopen +#define fputts fputws +#define puttc putwc +#define tcscmp wcscmp +#define tcscpy wcscpy +#define tcscat wcscat +#define tcschr wcschr +#define tcsrchr wcsrchr +#define tcslen wcslen +#define tperror _wperror +#define topen _wopen +#define tmain wmain +#define tremove _wremove +#else /* not XML_UNICODE */ +#define T(x) x +#define ftprintf fprintf +#define tfopen fopen +#define fputts fputs +#define puttc putc +#define tcscmp strcmp +#define tcscpy strcpy +#define tcscat strcat +#define tcschr strchr +#define tcsrchr strrchr +#define tcslen strlen +#define tperror perror +#define topen open +#define tmain main +#define tremove remove +#endif /* not XML_UNICODE */ diff --git a/reactos/lib/expat/xmlwf/xmlurl.h b/reactos/lib/expat/xmlwf/xmlurl.h new file mode 100644 index 00000000000..d329913ac85 --- /dev/null +++ b/reactos/lib/expat/xmlwf/xmlurl.h @@ -0,0 +1,13 @@ +#ifdef __cplusplus +extern "C" { +#endif + +int XML_URLInit(); +void XML_URLUninit(); +int XML_ProcessURL(XML_Parser parser, + const XML_Char *url, + unsigned flags); + +#ifdef __cplusplus +} +#endif diff --git a/reactos/lib/expat/xmlwf/xmlwf.c b/reactos/lib/expat/xmlwf/xmlwf.c new file mode 100644 index 00000000000..94798753b7b --- /dev/null +++ b/reactos/lib/expat/xmlwf/xmlwf.c @@ -0,0 +1,842 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#include +#include +#include +#include + +#include "expat.h" +#include "codepage.h" +#include "xmlfile.h" +#include "xmltchar.h" + +#ifdef _MSC_VER +#include +#endif + +/* This ensures proper sorting. */ + +#define NSSEP T('\001') + +static void XMLCALL +characterData(void *userData, const XML_Char *s, int len) +{ + FILE *fp = userData; + for (; len > 0; --len, ++s) { + switch (*s) { + case T('&'): + fputts(T("&"), fp); + break; + case T('<'): + fputts(T("<"), fp); + break; + case T('>'): + fputts(T(">"), fp); + break; +#ifdef W3C14N + case 13: + fputts(T(" "), fp); + break; +#else + case T('"'): + fputts(T("""), fp); + break; + case 9: + case 10: + case 13: + ftprintf(fp, T("&#%d;"), *s); + break; +#endif + default: + puttc(*s, fp); + break; + } + } +} + +static void +attributeValue(FILE *fp, const XML_Char *s) +{ + puttc(T('='), fp); + puttc(T('"'), fp); + for (;;) { + switch (*s) { + case 0: + case NSSEP: + puttc(T('"'), fp); + return; + case T('&'): + fputts(T("&"), fp); + break; + case T('<'): + fputts(T("<"), fp); + break; + case T('"'): + fputts(T("""), fp); + break; +#ifdef W3C14N + case 9: + fputts(T(" "), fp); + break; + case 10: + fputts(T(" "), fp); + break; + case 13: + fputts(T(" "), fp); + break; +#else + case T('>'): + fputts(T(">"), fp); + break; + case 9: + case 10: + case 13: + ftprintf(fp, T("&#%d;"), *s); + break; +#endif + default: + puttc(*s, fp); + break; + } + s++; + } +} + +/* Lexicographically comparing UTF-8 encoded attribute values, +is equivalent to lexicographically comparing based on the character number. */ + +static int +attcmp(const void *att1, const void *att2) +{ + return tcscmp(*(const XML_Char **)att1, *(const XML_Char **)att2); +} + +static void XMLCALL +startElement(void *userData, const XML_Char *name, const XML_Char **atts) +{ + int nAtts; + const XML_Char **p; + FILE *fp = userData; + puttc(T('<'), fp); + fputts(name, fp); + + p = atts; + while (*p) + ++p; + nAtts = (p - atts) >> 1; + if (nAtts > 1) + qsort((void *)atts, nAtts, sizeof(XML_Char *) * 2, attcmp); + while (*atts) { + puttc(T(' '), fp); + fputts(*atts++, fp); + attributeValue(fp, *atts); + atts++; + } + puttc(T('>'), fp); +} + +static void XMLCALL +endElement(void *userData, const XML_Char *name) +{ + FILE *fp = userData; + puttc(T('<'), fp); + puttc(T('/'), fp); + fputts(name, fp); + puttc(T('>'), fp); +} + +static int +nsattcmp(const void *p1, const void *p2) +{ + const XML_Char *att1 = *(const XML_Char **)p1; + const XML_Char *att2 = *(const XML_Char **)p2; + int sep1 = (tcsrchr(att1, NSSEP) != 0); + int sep2 = (tcsrchr(att1, NSSEP) != 0); + if (sep1 != sep2) + return sep1 - sep2; + return tcscmp(att1, att2); +} + +static void XMLCALL +startElementNS(void *userData, const XML_Char *name, const XML_Char **atts) +{ + int nAtts; + int nsi; + const XML_Char **p; + FILE *fp = userData; + const XML_Char *sep; + puttc(T('<'), fp); + + sep = tcsrchr(name, NSSEP); + if (sep) { + fputts(T("n1:"), fp); + fputts(sep + 1, fp); + fputts(T(" xmlns:n1"), fp); + attributeValue(fp, name); + nsi = 2; + } + else { + fputts(name, fp); + nsi = 1; + } + + p = atts; + while (*p) + ++p; + nAtts = (p - atts) >> 1; + if (nAtts > 1) + qsort((void *)atts, nAtts, sizeof(XML_Char *) * 2, nsattcmp); + while (*atts) { + name = *atts++; + sep = tcsrchr(name, NSSEP); + puttc(T(' '), fp); + if (sep) { + ftprintf(fp, T("n%d:"), nsi); + fputts(sep + 1, fp); + } + else + fputts(name, fp); + attributeValue(fp, *atts); + if (sep) { + ftprintf(fp, T(" xmlns:n%d"), nsi++); + attributeValue(fp, name); + } + atts++; + } + puttc(T('>'), fp); +} + +static void XMLCALL +endElementNS(void *userData, const XML_Char *name) +{ + FILE *fp = userData; + const XML_Char *sep; + puttc(T('<'), fp); + puttc(T('/'), fp); + sep = tcsrchr(name, NSSEP); + if (sep) { + fputts(T("n1:"), fp); + fputts(sep + 1, fp); + } + else + fputts(name, fp); + puttc(T('>'), fp); +} + +#ifndef W3C14N + +static void XMLCALL +processingInstruction(void *userData, const XML_Char *target, + const XML_Char *data) +{ + FILE *fp = userData; + puttc(T('<'), fp); + puttc(T('?'), fp); + fputts(target, fp); + puttc(T(' '), fp); + fputts(data, fp); + puttc(T('?'), fp); + puttc(T('>'), fp); +} + +#endif /* not W3C14N */ + +static void XMLCALL +defaultCharacterData(void *userData, const XML_Char *s, int len) +{ + XML_DefaultCurrent((XML_Parser) userData); +} + +static void XMLCALL +defaultStartElement(void *userData, const XML_Char *name, + const XML_Char **atts) +{ + XML_DefaultCurrent((XML_Parser) userData); +} + +static void XMLCALL +defaultEndElement(void *userData, const XML_Char *name) +{ + XML_DefaultCurrent((XML_Parser) userData); +} + +static void XMLCALL +defaultProcessingInstruction(void *userData, const XML_Char *target, + const XML_Char *data) +{ + XML_DefaultCurrent((XML_Parser) userData); +} + +static void XMLCALL +nopCharacterData(void *userData, const XML_Char *s, int len) +{ +} + +static void XMLCALL +nopStartElement(void *userData, const XML_Char *name, const XML_Char **atts) +{ +} + +static void XMLCALL +nopEndElement(void *userData, const XML_Char *name) +{ +} + +static void XMLCALL +nopProcessingInstruction(void *userData, const XML_Char *target, + const XML_Char *data) +{ +} + +static void XMLCALL +markup(void *userData, const XML_Char *s, int len) +{ + FILE *fp = XML_GetUserData((XML_Parser) userData); + for (; len > 0; --len, ++s) + puttc(*s, fp); +} + +static void +metaLocation(XML_Parser parser) +{ + const XML_Char *uri = XML_GetBase(parser); + if (uri) + ftprintf(XML_GetUserData(parser), T(" uri=\"%s\""), uri); + ftprintf(XML_GetUserData(parser), + T(" byte=\"%ld\" nbytes=\"%d\" line=\"%d\" col=\"%d\""), + XML_GetCurrentByteIndex(parser), + XML_GetCurrentByteCount(parser), + XML_GetCurrentLineNumber(parser), + XML_GetCurrentColumnNumber(parser)); +} + +static void +metaStartDocument(void *userData) +{ + fputts(T("\n"), XML_GetUserData((XML_Parser) userData)); +} + +static void +metaEndDocument(void *userData) +{ + fputts(T("\n"), XML_GetUserData((XML_Parser) userData)); +} + +static void XMLCALL +metaStartElement(void *userData, const XML_Char *name, + const XML_Char **atts) +{ + XML_Parser parser = (XML_Parser) userData; + FILE *fp = XML_GetUserData(parser); + const XML_Char **specifiedAttsEnd + = atts + XML_GetSpecifiedAttributeCount(parser); + const XML_Char **idAttPtr; + int idAttIndex = XML_GetIdAttributeIndex(parser); + if (idAttIndex < 0) + idAttPtr = 0; + else + idAttPtr = atts + idAttIndex; + + ftprintf(fp, T("\n"), fp); + do { + ftprintf(fp, T("= specifiedAttsEnd) + fputts(T("\" defaulted=\"yes\"/>\n"), fp); + else if (atts == idAttPtr) + fputts(T("\" id=\"yes\"/>\n"), fp); + else + fputts(T("\"/>\n"), fp); + } while (*(atts += 2)); + fputts(T("\n"), fp); + } + else + fputts(T("/>\n"), fp); +} + +static void XMLCALL +metaEndElement(void *userData, const XML_Char *name) +{ + XML_Parser parser = (XML_Parser) userData; + FILE *fp = XML_GetUserData(parser); + ftprintf(fp, T("\n"), fp); +} + +static void XMLCALL +metaProcessingInstruction(void *userData, const XML_Char *target, + const XML_Char *data) +{ + XML_Parser parser = (XML_Parser) userData; + FILE *fp = XML_GetUserData(parser); + ftprintf(fp, T("\n"), fp); +} + +static void XMLCALL +metaComment(void *userData, const XML_Char *data) +{ + XML_Parser parser = (XML_Parser) userData; + FILE *fp = XML_GetUserData(parser); + fputts(T("\n"), fp); +} + +static void XMLCALL +metaStartCdataSection(void *userData) +{ + XML_Parser parser = (XML_Parser) userData; + FILE *fp = XML_GetUserData(parser); + fputts(T("\n"), fp); +} + +static void XMLCALL +metaEndCdataSection(void *userData) +{ + XML_Parser parser = (XML_Parser) userData; + FILE *fp = XML_GetUserData(parser); + fputts(T("\n"), fp); +} + +static void XMLCALL +metaCharacterData(void *userData, const XML_Char *s, int len) +{ + XML_Parser parser = (XML_Parser) userData; + FILE *fp = XML_GetUserData(parser); + fputts(T("\n"), fp); +} + +static void XMLCALL +metaStartDoctypeDecl(void *userData, + const XML_Char *doctypeName, + const XML_Char *sysid, + const XML_Char *pubid, + int has_internal_subset) +{ + XML_Parser parser = (XML_Parser) userData; + FILE *fp = XML_GetUserData(parser); + ftprintf(fp, T("\n"), fp); +} + +static void XMLCALL +metaEndDoctypeDecl(void *userData) +{ + XML_Parser parser = (XML_Parser) userData; + FILE *fp = XML_GetUserData(parser); + fputts(T("\n"), fp); +} + +static void XMLCALL +metaNotationDecl(void *userData, + const XML_Char *notationName, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId) +{ + XML_Parser parser = (XML_Parser) userData; + FILE *fp = XML_GetUserData(parser); + ftprintf(fp, T("\n"), fp); +} + + +static void XMLCALL +metaEntityDecl(void *userData, + const XML_Char *entityName, + int is_param, + const XML_Char *value, + int value_length, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId, + const XML_Char *notationName) +{ + XML_Parser parser = (XML_Parser) userData; + FILE *fp = XML_GetUserData(parser); + + if (value) { + ftprintf(fp, T("'), fp); + characterData(fp, value, value_length); + fputts(T("\n"), fp); + } + else if (notationName) { + ftprintf(fp, T("\n"), fp); + } + else { + ftprintf(fp, T("\n"), fp); + } +} + +static void XMLCALL +metaStartNamespaceDecl(void *userData, + const XML_Char *prefix, + const XML_Char *uri) +{ + XML_Parser parser = (XML_Parser) userData; + FILE *fp = XML_GetUserData(parser); + fputts(T("\n"), fp); + } + else + fputts(T("/>\n"), fp); +} + +static void XMLCALL +metaEndNamespaceDecl(void *userData, const XML_Char *prefix) +{ + XML_Parser parser = (XML_Parser) userData; + FILE *fp = XML_GetUserData(parser); + if (!prefix) + fputts(T("\n"), fp); + else + ftprintf(fp, T("\n"), prefix); +} + +static int XMLCALL +unknownEncodingConvert(void *data, const char *p) +{ + return codepageConvert(*(int *)data, p); +} + +static int XMLCALL +unknownEncoding(void *userData, const XML_Char *name, XML_Encoding *info) +{ + int cp; + static const XML_Char prefixL[] = T("windows-"); + static const XML_Char prefixU[] = T("WINDOWS-"); + int i; + + for (i = 0; prefixU[i]; i++) + if (name[i] != prefixU[i] && name[i] != prefixL[i]) + return 0; + + cp = 0; + for (; name[i]; i++) { + static const XML_Char digits[] = T("0123456789"); + const XML_Char *s = tcschr(digits, name[i]); + if (!s) + return 0; + cp *= 10; + cp += s - digits; + if (cp >= 0x10000) + return 0; + } + if (!codepageMap(cp, info->map)) + return 0; + info->convert = unknownEncodingConvert; + /* We could just cast the code page integer to a void *, + and avoid the use of release. */ + info->release = free; + info->data = malloc(sizeof(int)); + if (!info->data) + return 0; + *(int *)info->data = cp; + return 1; +} + +static int XMLCALL +notStandalone(void *userData) +{ + return 0; +} + +static void +showVersion(XML_Char *prog) +{ + XML_Char *s = prog; + XML_Char ch; + const XML_Feature *features = XML_GetFeatureList(); + while ((ch = *s) != 0) { + if (ch == '/' +#ifdef WIN32 + || ch == '\\' +#endif + ) + prog = s + 1; + ++s; + } + ftprintf(stdout, T("%s using %s\n"), prog, XML_ExpatVersion()); + if (features != NULL && features[0].feature != XML_FEATURE_END) { + int i = 1; + ftprintf(stdout, T("%s"), features[0].name); + if (features[0].value) + ftprintf(stdout, T("=%ld"), features[0].value); + while (features[i].feature != XML_FEATURE_END) { + ftprintf(stdout, T(", %s"), features[i].name); + if (features[i].value) + ftprintf(stdout, T("=%ld"), features[i].value); + ++i; + } + ftprintf(stdout, T("\n")); + } +} + +static void +usage(const XML_Char *prog, int rc) +{ + ftprintf(stderr, + T("usage: %s [-n] [-p] [-r] [-s] [-w] [-x] [-d output-dir] " + "[-e encoding] file ...\n"), prog); + exit(rc); +} + +int +tmain(int argc, XML_Char **argv) +{ + int i, j; + const XML_Char *outputDir = NULL; + const XML_Char *encoding = NULL; + unsigned processFlags = XML_MAP_FILE; + int windowsCodePages = 0; + int outputType = 0; + int useNamespaces = 0; + int requireStandalone = 0; + int paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; + int useStdin = 0; + +#ifdef _MSC_VER + _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF); +#endif + + i = 1; + j = 0; + while (i < argc) { + if (j == 0) { + if (argv[i][0] != T('-')) + break; + if (argv[i][1] == T('-') && argv[i][2] == T('\0')) { + i++; + break; + } + j++; + } + switch (argv[i][j]) { + case T('r'): + processFlags &= ~XML_MAP_FILE; + j++; + break; + case T('s'): + requireStandalone = 1; + j++; + break; + case T('n'): + useNamespaces = 1; + j++; + break; + case T('p'): + paramEntityParsing = XML_PARAM_ENTITY_PARSING_ALWAYS; + /* fall through */ + case T('x'): + processFlags |= XML_EXTERNAL_ENTITIES; + j++; + break; + case T('w'): + windowsCodePages = 1; + j++; + break; + case T('m'): + outputType = 'm'; + j++; + break; + case T('c'): + outputType = 'c'; + useNamespaces = 0; + j++; + break; + case T('t'): + outputType = 't'; + j++; + break; + case T('d'): + if (argv[i][j + 1] == T('\0')) { + if (++i == argc) + usage(argv[0], 2); + outputDir = argv[i]; + } + else + outputDir = argv[i] + j + 1; + i++; + j = 0; + break; + case T('e'): + if (argv[i][j + 1] == T('\0')) { + if (++i == argc) + usage(argv[0], 2); + encoding = argv[i]; + } + else + encoding = argv[i] + j + 1; + i++; + j = 0; + break; + case T('h'): + usage(argv[0], 0); + return 0; + case T('v'): + showVersion(argv[0]); + return 0; + case T('\0'): + if (j > 1) { + i++; + j = 0; + break; + } + /* fall through */ + default: + usage(argv[0], 2); + } + } + if (i == argc) { + useStdin = 1; + processFlags &= ~XML_MAP_FILE; + i--; + } + for (; i < argc; i++) { + FILE *fp = 0; + XML_Char *outName = 0; + int result; + XML_Parser parser; + if (useNamespaces) + parser = XML_ParserCreateNS(encoding, NSSEP); + else + parser = XML_ParserCreate(encoding); + if (requireStandalone) + XML_SetNotStandaloneHandler(parser, notStandalone); + XML_SetParamEntityParsing(parser, paramEntityParsing); + if (outputType == 't') { + /* This is for doing timings; this gives a more realistic estimate of + the parsing time. */ + outputDir = 0; + XML_SetElementHandler(parser, nopStartElement, nopEndElement); + XML_SetCharacterDataHandler(parser, nopCharacterData); + XML_SetProcessingInstructionHandler(parser, nopProcessingInstruction); + } + else if (outputDir) { + const XML_Char *file = useStdin ? T("STDIN") : argv[i]; + if (tcsrchr(file, T('/'))) + file = tcsrchr(file, T('/')) + 1; +#ifdef WIN32 + if (tcsrchr(file, T('\\'))) + file = tcsrchr(file, T('\\')) + 1; +#endif + outName = malloc((tcslen(outputDir) + tcslen(file) + 2) + * sizeof(XML_Char)); + tcscpy(outName, outputDir); + tcscat(outName, T("/")); + tcscat(outName, file); + fp = tfopen(outName, T("wb")); + if (!fp) { + tperror(outName); + exit(1); + } + setvbuf(fp, NULL, _IOFBF, 16384); +#ifdef XML_UNICODE + puttc(0xFEFF, fp); +#endif + XML_SetUserData(parser, fp); + switch (outputType) { + case 'm': + XML_UseParserAsHandlerArg(parser); + XML_SetElementHandler(parser, metaStartElement, metaEndElement); + XML_SetProcessingInstructionHandler(parser, metaProcessingInstruction); + XML_SetCommentHandler(parser, metaComment); + XML_SetCdataSectionHandler(parser, metaStartCdataSection, + metaEndCdataSection); + XML_SetCharacterDataHandler(parser, metaCharacterData); + XML_SetDoctypeDeclHandler(parser, metaStartDoctypeDecl, + metaEndDoctypeDecl); + XML_SetEntityDeclHandler(parser, metaEntityDecl); + XML_SetNotationDeclHandler(parser, metaNotationDecl); + XML_SetNamespaceDeclHandler(parser, metaStartNamespaceDecl, + metaEndNamespaceDecl); + metaStartDocument(parser); + break; + case 'c': + XML_UseParserAsHandlerArg(parser); + XML_SetDefaultHandler(parser, markup); + XML_SetElementHandler(parser, defaultStartElement, defaultEndElement); + XML_SetCharacterDataHandler(parser, defaultCharacterData); + XML_SetProcessingInstructionHandler(parser, + defaultProcessingInstruction); + break; + default: + if (useNamespaces) + XML_SetElementHandler(parser, startElementNS, endElementNS); + else + XML_SetElementHandler(parser, startElement, endElement); + XML_SetCharacterDataHandler(parser, characterData); +#ifndef W3C14N + XML_SetProcessingInstructionHandler(parser, processingInstruction); +#endif /* not W3C14N */ + break; + } + } + if (windowsCodePages) + XML_SetUnknownEncodingHandler(parser, unknownEncoding, 0); + result = XML_ProcessFile(parser, useStdin ? NULL : argv[i], processFlags); + if (outputDir) { + if (outputType == 'm') + metaEndDocument(parser); + fclose(fp); + if (!result) + tremove(outName); + free(outName); + } + XML_ParserFree(parser); + } + return 0; +} diff --git a/reactos/lib/expat/xmlwf/xmlwf.dsp b/reactos/lib/expat/xmlwf/xmlwf.dsp new file mode 100644 index 00000000000..a639bc61208 --- /dev/null +++ b/reactos/lib/expat/xmlwf/xmlwf.dsp @@ -0,0 +1,139 @@ +# Microsoft Developer Studio Project File - Name="xmlwf" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=xmlwf - Win32 Release +!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 "xmlwf.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 "xmlwf.mak" CFG="xmlwf - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "xmlwf - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "xmlwf - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "xmlwf - 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 Ignore_Export_Lib 0 +# PROP Target_Dir "." +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c +# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\lib" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "COMPILED_FROM_DSP" /FD /c +# SUBTRACT CPP /YX /Yc /Yu +# ADD BASE RSC /l 0x809 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 setargv.obj kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"Release\xmlwf.exe" +# SUBTRACT LINK32 /nodefaultlib + +!ELSEIF "$(CFG)" == "xmlwf - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir ".\Debug" +# PROP BASE Intermediate_Dir ".\Debug" +# PROP BASE Target_Dir "." +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir ".\Debug" +# PROP Intermediate_Dir ".\Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "." +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /c +# ADD CPP /nologo /MTd /W3 /GX /ZI /Od /I "..\lib" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "COMPILED_FROM_DSP" /FD /c +# SUBTRACT CPP /Fr /YX +# ADD BASE RSC /l 0x809 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 +# ADD LINK32 setargv.obj kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /pdb:none /debug /machine:I386 /out:"Debug\xmlwf.exe" + +!ENDIF + +# Begin Target + +# Name "xmlwf - Win32 Release" +# Name "xmlwf - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat;for;f90" +# Begin Source File + +SOURCE=.\codepage.c +# End Source File +# Begin Source File + +SOURCE=.\readfilemap.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=.\unixfilemap.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=.\win32filemap.c +# End Source File +# Begin Source File + +SOURCE=.\xmlfile.c +# End Source File +# Begin Source File + +SOURCE=.\xmlwf.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd" +# Begin Source File + +SOURCE=.\codepage.h +# End Source File +# Begin Source File + +SOURCE=.\xmlfile.h +# End Source File +# Begin Source File + +SOURCE=.\xmltchar.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/reactos/lib/expat/xmlwf/xmlwin32url.cxx b/reactos/lib/expat/xmlwf/xmlwin32url.cxx new file mode 100644 index 00000000000..bbfcce22c96 --- /dev/null +++ b/reactos/lib/expat/xmlwf/xmlwin32url.cxx @@ -0,0 +1,395 @@ +#include "expat.h" +#ifdef XML_UNICODE +#define UNICODE +#endif +#include +#include +#include +#include +#include +#include "xmlurl.h" +#include "xmlmime.h" + +static int +processURL(XML_Parser parser, IMoniker *baseMoniker, const XML_Char *url); + +typedef void (*StopHandler)(void *, HRESULT); + +class Callback : public IBindStatusCallback { +public: + // IUnknown methods + STDMETHODIMP QueryInterface(REFIID,void **); + STDMETHODIMP_(ULONG) AddRef(); + STDMETHODIMP_(ULONG) Release(); + // IBindStatusCallback methods + STDMETHODIMP OnStartBinding(DWORD, IBinding *); + STDMETHODIMP GetPriority(LONG *); + STDMETHODIMP OnLowResource(DWORD); + STDMETHODIMP OnProgress(ULONG, ULONG, ULONG, LPCWSTR); + STDMETHODIMP OnStopBinding(HRESULT, LPCWSTR); + STDMETHODIMP GetBindInfo(DWORD *, BINDINFO *); + STDMETHODIMP OnDataAvailable(DWORD, DWORD, FORMATETC *, STGMEDIUM *); + STDMETHODIMP OnObjectAvailable(REFIID, IUnknown *); + Callback(XML_Parser, IMoniker *, StopHandler, void *); + ~Callback(); + int externalEntityRef(const XML_Char *context, + const XML_Char *systemId, const XML_Char *publicId); +private: + XML_Parser parser_; + IMoniker *baseMoniker_; + DWORD totalRead_; + ULONG ref_; + IBinding *pBinding_; + StopHandler stopHandler_; + void *stopArg_; +}; + +STDMETHODIMP_(ULONG) +Callback::AddRef() +{ + return ref_++; +} + +STDMETHODIMP_(ULONG) +Callback::Release() +{ + if (--ref_ == 0) { + delete this; + return 0; + } + return ref_; +} + +STDMETHODIMP +Callback::QueryInterface(REFIID riid, void** ppv) +{ + if (IsEqualGUID(riid, IID_IUnknown)) + *ppv = (IUnknown *)this; + else if (IsEqualGUID(riid, IID_IBindStatusCallback)) + *ppv = (IBindStatusCallback *)this; + else + return E_NOINTERFACE; + ((LPUNKNOWN)*ppv)->AddRef(); + return S_OK; +} + +STDMETHODIMP +Callback::OnStartBinding(DWORD, IBinding* pBinding) +{ + pBinding_ = pBinding; + pBinding->AddRef(); + return S_OK; +} + +STDMETHODIMP +Callback::GetPriority(LONG *) +{ + return E_NOTIMPL; +} + +STDMETHODIMP +Callback::OnLowResource(DWORD) +{ + return E_NOTIMPL; +} + +STDMETHODIMP +Callback::OnProgress(ULONG, ULONG, ULONG, LPCWSTR) +{ + return S_OK; +} + +STDMETHODIMP +Callback::OnStopBinding(HRESULT hr, LPCWSTR szError) +{ + if (pBinding_) { + pBinding_->Release(); + pBinding_ = 0; + } + if (baseMoniker_) { + baseMoniker_->Release(); + baseMoniker_ = 0; + } + stopHandler_(stopArg_, hr); + return S_OK; +} + +STDMETHODIMP +Callback::GetBindInfo(DWORD* pgrfBINDF, BINDINFO* pbindinfo) +{ + *pgrfBINDF = BINDF_ASYNCHRONOUS; + return S_OK; +} + +static void +reportError(XML_Parser parser) +{ + int code = XML_GetErrorCode(parser); + const XML_Char *message = XML_ErrorString(code); + if (message) + _ftprintf(stderr, _T("%s:%d:%ld: %s\n"), + XML_GetBase(parser), + XML_GetErrorLineNumber(parser), + XML_GetErrorColumnNumber(parser), + message); + else + _ftprintf(stderr, _T("%s: (unknown message %d)\n"), + XML_GetBase(parser), code); +} + +STDMETHODIMP +Callback::OnDataAvailable(DWORD grfBSCF, + DWORD dwSize, + FORMATETC *pfmtetc, + STGMEDIUM* pstgmed) +{ + if (grfBSCF & BSCF_FIRSTDATANOTIFICATION) { + IWinInetHttpInfo *hp; + HRESULT hr = pBinding_->QueryInterface(IID_IWinInetHttpInfo, + (void **)&hp); + if (SUCCEEDED(hr)) { + char contentType[1024]; + DWORD bufSize = sizeof(contentType); + DWORD flags = 0; + contentType[0] = 0; + hr = hp->QueryInfo(HTTP_QUERY_CONTENT_TYPE, contentType, + &bufSize, 0, NULL); + if (SUCCEEDED(hr)) { + char charset[CHARSET_MAX]; + getXMLCharset(contentType, charset); + if (charset[0]) { +#ifdef XML_UNICODE + XML_Char wcharset[CHARSET_MAX]; + XML_Char *p1 = wcharset; + const char *p2 = charset; + while ((*p1++ = (unsigned char)*p2++) != 0) + ; + XML_SetEncoding(parser_, wcharset); +#else + XML_SetEncoding(parser_, charset); +#endif + } + } + hp->Release(); + } + } + if (!parser_) + return E_ABORT; + if (pstgmed->tymed == TYMED_ISTREAM) { + while (totalRead_ < dwSize) { +#define READ_MAX (64*1024) + DWORD nToRead = dwSize - totalRead_; + if (nToRead > READ_MAX) + nToRead = READ_MAX; + void *buf = XML_GetBuffer(parser_, nToRead); + if (!buf) { + _ftprintf(stderr, _T("out of memory\n")); + return E_ABORT; + } + DWORD nRead; + HRESULT hr = pstgmed->pstm->Read(buf, nToRead, &nRead); + if (SUCCEEDED(hr)) { + totalRead_ += nRead; + if (!XML_ParseBuffer(parser_, + nRead, + (grfBSCF & BSCF_LASTDATANOTIFICATION) != 0 + && totalRead_ == dwSize)) { + reportError(parser_); + return E_ABORT; + } + } + } + } + return S_OK; +} + +STDMETHODIMP +Callback::OnObjectAvailable(REFIID, IUnknown *) +{ + return S_OK; +} + +int +Callback::externalEntityRef(const XML_Char *context, + const XML_Char *systemId, + const XML_Char *publicId) +{ + XML_Parser entParser = XML_ExternalEntityParserCreate(parser_, context, 0); + XML_SetBase(entParser, systemId); + int ret = processURL(entParser, baseMoniker_, systemId); + XML_ParserFree(entParser); + return ret; +} + +Callback::Callback(XML_Parser parser, IMoniker *baseMoniker, + StopHandler stopHandler, void *stopArg) +: parser_(parser), + baseMoniker_(baseMoniker), + ref_(0), + pBinding_(0), + totalRead_(0), + stopHandler_(stopHandler), + stopArg_(stopArg) +{ + if (baseMoniker_) + baseMoniker_->AddRef(); +} + +Callback::~Callback() +{ + if (pBinding_) + pBinding_->Release(); + if (baseMoniker_) + baseMoniker_->Release(); +} + +static int +externalEntityRef(void *arg, + const XML_Char *context, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId) +{ + return ((Callback *)arg)->externalEntityRef(context, systemId, publicId); +} + + +static HRESULT +openStream(XML_Parser parser, + IMoniker *baseMoniker, + const XML_Char *uri, + StopHandler stopHandler, void *stopArg) +{ + if (!XML_SetBase(parser, uri)) + return E_OUTOFMEMORY; + HRESULT hr; + IMoniker *m; +#ifdef XML_UNICODE + hr = CreateURLMoniker(0, uri, &m); +#else + LPWSTR uriw = new wchar_t[strlen(uri) + 1]; + for (int i = 0;; i++) { + uriw[i] = uri[i]; + if (uriw[i] == 0) + break; + } + hr = CreateURLMoniker(baseMoniker, uriw, &m); + delete [] uriw; +#endif + if (FAILED(hr)) + return hr; + IBindStatusCallback *cb = new Callback(parser, m, stopHandler, stopArg); + XML_SetExternalEntityRefHandler(parser, externalEntityRef); + XML_SetExternalEntityRefHandlerArg(parser, cb); + cb->AddRef(); + IBindCtx *b; + if (FAILED(hr = CreateAsyncBindCtx(0, cb, 0, &b))) { + cb->Release(); + m->Release(); + return hr; + } + cb->Release(); + IStream *pStream; + hr = m->BindToStorage(b, 0, IID_IStream, (void **)&pStream); + if (SUCCEEDED(hr)) { + if (pStream) + pStream->Release(); + } + if (hr == MK_S_ASYNCHRONOUS) + hr = S_OK; + m->Release(); + b->Release(); + return hr; +} + +struct QuitInfo { + const XML_Char *url; + HRESULT hr; + int stop; +}; + +static void +winPerror(const XML_Char *url, HRESULT hr) +{ + LPVOID buf; + if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER + | FORMAT_MESSAGE_FROM_HMODULE, + GetModuleHandleA("urlmon.dll"), + hr, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &buf, + 0, + NULL) + || FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER + | FORMAT_MESSAGE_FROM_SYSTEM, + 0, + hr, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &buf, + 0, + NULL)) { + /* The system error messages seem to end with a newline. */ + _ftprintf(stderr, _T("%s: %s"), url, buf); + fflush(stderr); + LocalFree(buf); + } + else + _ftprintf(stderr, _T("%s: error %x\n"), url, hr); +} + +static void +threadQuit(void *p, HRESULT hr) +{ + QuitInfo *qi = (QuitInfo *)p; + qi->hr = hr; + qi->stop = 1; +} + +extern "C" +int +XML_URLInit(void) +{ + return SUCCEEDED(CoInitialize(0)); +} + +extern "C" +void +XML_URLUninit(void) +{ + CoUninitialize(); +} + +static int +processURL(XML_Parser parser, IMoniker *baseMoniker, + const XML_Char *url) +{ + QuitInfo qi; + qi.stop = 0; + qi.url = url; + + XML_SetBase(parser, url); + HRESULT hr = openStream(parser, baseMoniker, url, threadQuit, &qi); + if (FAILED(hr)) { + winPerror(url, hr); + return 0; + } + else if (FAILED(qi.hr)) { + winPerror(url, qi.hr); + return 0; + } + MSG msg; + while (!qi.stop && GetMessage (&msg, NULL, 0, 0)) { + TranslateMessage (&msg); + DispatchMessage (&msg); + } + return 1; +} + +extern "C" +int +XML_ProcessURL(XML_Parser parser, + const XML_Char *url, + unsigned flags) +{ + return processURL(parser, 0, url); +} From 9a854f33a4985126ef5622754f557b4d32422738 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III Date: Wed, 24 Mar 2004 00:13:31 +0000 Subject: [PATCH 0625/1463] implement SetPixelV svn path=/trunk/; revision=8857 --- reactos/lib/gdi32/misc/stubs.c | 19 +------------------ reactos/lib/gdi32/objects/bitblt.c | 13 ++++++++++++- 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/reactos/lib/gdi32/misc/stubs.c b/reactos/lib/gdi32/misc/stubs.c index 376399cc06f..8edf76fdb1e 100644 --- a/reactos/lib/gdi32/misc/stubs.c +++ b/reactos/lib/gdi32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.50 2004/03/23 00:18:54 gvg Exp $ +/* $Id: stubs.c,v 1.51 2004/03/24 00:13:31 royce Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -529,23 +529,6 @@ SetMetaFileBitsEx( } -/* - * @unimplemented - */ -BOOL -STDCALL -SetPixelV( - HDC a0, - int a1, - int a2, - COLORREF a3 - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - /* * @unimplemented */ diff --git a/reactos/lib/gdi32/objects/bitblt.c b/reactos/lib/gdi32/objects/bitblt.c index 93db1e0e3be..acd6804f487 100644 --- a/reactos/lib/gdi32/objects/bitblt.c +++ b/reactos/lib/gdi32/objects/bitblt.c @@ -1,4 +1,4 @@ -/* $Id: bitblt.c,v 1.18 2004/03/15 04:21:17 royce Exp $ +/* $Id: bitblt.c,v 1.19 2004/03/24 00:13:31 royce Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -348,6 +348,17 @@ SetPixel(HDC hDC, } +/* + * @implemented + */ +BOOL +STDCALL +SetPixelV ( HDC hDC, int XPos, int YPos, COLORREF Color ) +{ + return NtGdiSetPixelV ( hDC, XPos, YPos, Color ); +} + + /* * @implemented */ From ea02300a6a6bb1bf53934416ee2df1b72eb467ea Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Wed, 24 Mar 2004 00:19:16 +0000 Subject: [PATCH 0626/1463] use the new built expat library for explorer svn path=/trunk/; revision=8858 --- reactos/subsys/system/explorer/Makefile | 3 +- reactos/subsys/system/explorer/libexpat.dll | Bin 139264 -> 0 bytes .../system/explorer/notifyhook/notifyhook.dsp | 39 ++++++++++++++++-- 3 files changed, 36 insertions(+), 6 deletions(-) delete mode 100644 reactos/subsys/system/explorer/libexpat.dll diff --git a/reactos/subsys/system/explorer/Makefile b/reactos/subsys/system/explorer/Makefile index 910b51de54f..172c1119dda 100644 --- a/reactos/subsys/system/explorer/Makefile +++ b/reactos/subsys/system/explorer/Makefile @@ -129,7 +129,7 @@ ever: buildno.h: ../../../include/reactos/buildno.h $(CD_PREFIX)updatebuildno -$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) notifyhook.dll libexpat.dll +$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) notifyhook.dll ..\..\..\lib\expat\libexpat.dll $(LINK) $(LFLAGS) -o $@ $^ $(addprefix -l,$(LIBS)) $(addprefix -l,$(DELAYIMPORTS)) explorer$(RES_SUFFIX): $(PROGRAM)_intres.rc res/*.bmp res/*.ico @@ -157,7 +157,6 @@ implib: install: -$(TOOLS_PATH)/rcopy $(TARGET) $(INSTALL_DIR)/$(TARGET) -$(TOOLS_PATH)/rcopy notifyhook.dll $(INSTALL_DIR)/system32/notifyhook.dll - -$(TOOLS_PATH)/rcopy libexpat.dll $(INSTALL_DIR)/system32/libexpat.dll bootcd: diff --git a/reactos/subsys/system/explorer/libexpat.dll b/reactos/subsys/system/explorer/libexpat.dll deleted file mode 100644 index 4f400f071034b81c2bb7600d1ff8760358578792..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139264 zcmeEvdtg+>_5a=M5*A#zH@d>AsV=f=Y*HH`Z4)@=X=_{CT8pjF_-sNj0Us66R+RQzwbpJLtoY*LYk!|}=I&+#sQBye z_n(3Ln#Y+lXU?2CbLPzK>`T`wRz*>4xKb%a>A{o!D)|1%w#x5l(flFrRp&|0)oAo=m26oruu= zCM4Q5rMiXZb~32MQ`+1p(r!><@4L;6!@G1pHtv-3Vcq1 z&nfUZ1wN<1=M?yy0-saha|--_r$9jLj~)n$kMu7jen5qZI!#<_^QD@cL0sW&_UHle zQD~^Gwf`yp6V)D@QDHN`o_b0&cx+lgFzrZG^C@9IEVvJCm% zb;NgM^fv$jgu|#WF?^*XxKRZO7pjv{S(1ite#?X-@#ROvR~+$Oo&L5F;&<;jFxAF6o0Z=kCL)ySfynV;cj;w?wP&nkbO;hTR{yjkA7Bg&TvN9w!q zi1_yOcNY9bhOgt};4ez2H_MX=N8m3xB7SM+JKC$8dGvmwhf$$t3K_}2BAq@9pH5@# zq0uDEq+iv=5hLG`BfeuteBUI$NAdf~#J?KBFjnnDu(YZJq{7(9+J#a zBYq^QS0i3LM3uWaAg;+5+l^|E6Hr`*fAsbR)iozmN(!rL5$ z&lC=}wHj5f76UQ#I4MH3RDq{3&c+pW9WtjSj63YSr3Z!r+Dl~A0OZ{3anpbX4K zRX%V*utX;x=uGd;e4dg1%uwHyA2Fi-Lu7m^d_tc)GmieG7e;pIrSVu2F?gFW*hTeo zGlc%ZF3Lb=QQ4p)31o@=##%}sBV|rmcE6NY9LwS=PjtPCltyJ*Vv=kTx401&-K~!k zm7c=N0_)cP@b;AC8IE7&q4-{Xf-pGc4&7SV*UxMPqS-{u44oo;c7Qpx@ClZP20#TqrEF9gbz)*#x88p;{6san+iQ0n-MTV5u#@x_#n_w#34g{s0}ZV*>N+1HeJe!))DIMa@C4d;+8wl!G5vR}ch$dTI!dB+pskaCq z)>L3USh&mk*2?05Kh;c?KyzOrnmlDqj*!);a)?=4bca5+@Ck7LEDasbsPY)I3ao=- zmR($9Gy7GhR~c0{aawe5=vH)(O_l}ycuebEK=f#hzQ|r`O#G9#6a@=R4N6MM|!!=dX9kf=qFgtcy6ROqye-eT&Cz_ zd#Go%_BT&|J<_X>i&vj#sX_d~py>2y@zr~%*k0XI(okSoxb z3Yzuz8rQf0-fdKAqRM8hrqsha7e65Xr2CIiPSDv+P|LDWOwD zd=ao%)%QJA(c2dqH&_8t3AC)nd>UswqRhC?W}G4}S%l`ABv#mjA{uQ6|8`nx>PJCe zV`>)!FL0aQYjSzB*cX2F(5ih-lDL7+=qa5f^ky{a-Jm%ouC|(txf!+r9ZxAA5unkJm_n(XrVC=`es=)aXTk%#FKJ2Ccr+B4XBm|NaqL% z$&58vh8Sz!0T^Tb2e?n~Wyl{}HmxFXigXtW@3S`t#bd=F#q`&`AL=)VI=j(LpK3iY9vH&4SV^Ga(G575`a}`p0?D)dB=?Gk%NDypN9q(d?}uu11-e8V6Rd^g zj#xvbE+%-Qn;=lu?^aXR{Ah2e8Vq9h4(aajV=p0{H8i;pU8W5THrVY#z|M%GF&xxM z5kZJ$s;99&Q#tx<;}mJ~$nk~8Dk*j1b_`C_x(-i3$E&wgM0SMU?ibtRTGx9MLh68J zeB5WLtmt}gd??7-nr)cgi|SP*n}H#Vi3$^ou`dldoNIs z+}Y?8wU}E3d3wFt*GC}`-sj>W%Oh$)r9d!5eV~LS$waiZsL?t|Dh<@w zatCYd6+|bEdjm+GGOkzD$Z80G^rYekDe~=KC9gvlf%p>pXHI={=xmB?@D#`MBD)8{ zUPz+E=6Qtt<0MGwkW@U8Wq{# zap_kJ$Ngg51$m*#7-5PF52KN1$LFb*$_w)Jx8nehc0LWoYNG$(&Z&LVcf@DgWVkf|slTX^TB7qa;yoU#Ao^KN{w11Y`VI_nkWSaG6g7&l#aJ8n=!=Awob(Zh zOdZxK4uUq0P1AN``0*xYVt@x#P^x(L;O?o<13OvkU0qM0+E1X`6OqeR*k|2OxvB2q z@=Z!;JMwr8$0iV54uv)LO7C_mec6pvdb8$BHQGULCs7DAE;d4TDjU5x)@&2b`%xz} z&~E*!ApRuAfQUaxbbq$*UpZ%PP1AimQMYiH^{p(zhn~PJsRRUT0(oXDhV6dQtcdd8 zNlo z22+6HNf zzyu!_nSs#1MI8VmBFGVqBN3z2>8CIbQnywkG@WIoGIWk%g_3dtR7P2_I3ZDKC!Nc0 zv+itz?rAjHH(6TyY5KX#>$6?&6LxWuK{}bZMl)vFpn?|u(bPc0gLcE3QA355)UGCn z*k1TdxX*6gm8iEHO%7DC)~%3!y3+)_icq4ye6ln)Mm)+xplm4&)ov7rDf@o!+-GQdT-@ zjY`eqpl-Q{$r3*6(6(3)>RGOcmH=#uuwGN|JgFx;VQ3gNH zP8Jil0qqQcG=XPn!g*`oD>>Hpj8YSB=XeLH2YbCwUR!T0glM->9+Gt;p!xC4r{ON& zx~nnhXF1D+S{qZ^1JeDu!M!iJW4Y`F*M~B<_8_s+0=^~`$lSt($xkw}@aG6YnwTD@g8eY%)m54J3o_uw(At^mRKp{^6X{VTu9Rekuls+z88|APK_H&Gcg z;V0U%sw)sPQk%3rrPc>Ib&=>MeLLFQq)&zfuCR#>ucA)=Wc@olF<$@?%{U8g9>I!x zWAclcSb`hgr!|3R-UL^>#rn0#FZOs}6qX=c_VP^izD7wrM%5l3XX^OZ+YF4Z7^pD~ zb^6S40v*Fosy!KGJmFr*Xf1rG$WYbQ?Z_*~S9MF*-CtC+lqVX)L)4a|BBzRgZLtMY zgvtKKfojhg<7wXM7fykvsNc_c{>La_==uH$FK({RRL1}XH z9K#RPJU*UjG+?GdDv3I3mO)ac6sYnPqfd=o3m|K$TK^fK&?CcN7P|l!N=&0)%(3w_ z+A%zd>!P1TRBIG{$sfPPt%QV55+O9*N%vYc@Al8y*;R6|+Cu75efXu*85s0c zd{Ytzj`tq&+%rG8WLx?hGx1{ZF{^?Em@;D8k;#~QR6;Z@kl}=utc1>VLXm0#x0K-W z;JUp4A_mt(=PKGSaVfbLB`25utTujp!fi};XTrOmXE&Nin5_Q-sNsafE)6*oo2kPm z62$n%MQ9^!c!Jo>Q`~?JY(@qyw{Z~(RU{+s^asIi4pf;Yw(fKfIM2vaSKoy+>Xx-y z5%K=I4+_EiHPne|amy7H?F96XeqGXRz29kr0Une_X50g790YSbXI{`^5GNorgG7o*d{|R9E3tZpBbt$f4 zT#5~}wjJ-EmDlq?;&TIH(;`$PUIPgSZS#95a@dObNcjb7^agy0G8l8t6)7=ip?A*w zkR#FROSZq8N})>M5rKvAv9TOHX4H8y7}`V1hCT6l@(L#u@yY3C{7wm|bk3BC2Y< zZy5Y0`a2)|tpzo8h{|#?vpV63k;Gy8d;4GjDFCZRUx&nZhC(o6zQIY)6@8)}3T=X{ zJ1%chpOjeSQN;C1_;Fh_rAEJlGQ3GlG`K?EHKS_$)3;@f;nl2&^;}~#4Og+PqQ$Ih z_a?+jS#>>uj9d-sW3pZ>b9mQ}0@-MSyqQ2Uqyfc|l2p51>AF~fjbx@t-XpM?Y-XK@ ztnslDI{1n4no(!)697V6k6D)&AS$W#CS}#-Lh%??D!!gtuP(CN;7>8zCT2RtAjt}S z%uISqh-jV`(Q$ zVK9st^$slHFV$l8E~7r*sCOInPGhMjR$pY)7t?BdeSxvGG*(|>)K?qz^+tWUv9uu; z3!}(bj3%%~j5GlwM#9{PMd-fic77*;V{l)I#WwOg&2Ws^-F&BckP#z=!ibUnZNx}P zAL#1B-4ctf!Xp;D5%+#khj~muEO#b~x~K1jJ@H-ipWN_(&D*a=34r%q^q+&tyWdEq z62B)5Vs{aK$=fJkxicyFS&$6#vpjhnJ?Hw8Z}YPwIgF=R&C@R!w|vH3jQL&E%VT$K z#65*s(anUm-?)pC;TsbN46%1{UGCz#+{Jadi|cY1)g^WpSK=bG#D;6DPt(b=h*k?tMqq6K3qOJo`rBX$b2{oAs3k!3agpznce%N^SSdVozHF9!>D9$uda+oMhVvndI3v=QM zM`&E~QB(>&rHWRqn*&f`UH)JyNSdWPyv+#O-^`fz)oS0ro_R}5ZPy?+m>y5YWQC9yCQ;j5RiXIOG(~?y3=@= z-mv6wExTa=-thm5@Ct+_-+TcC3+wdy8eS6*bA7HGrdO&*aw%Tp;Ur!oy{#=+QDn16 zG=){!CP$;V?JtOdG5q#kU-GB#6HV@5bE>A)=R1OHR|WV!38$c%~Fdq_@;PR{7-fkAfWLAatue}OxIVzn<8eicFb zwbI=tag8hB_ca;e0t8~+K6RT5FPLe8HQ19T6p)3$rcg!plM*s2l!-|qOk-O@d=JU} zLQrG);~!%JO;O3Hv?ACzeU6dch{Y_+#=L7zvpoq2(Z<6F6Nd)-Vt4&`%9E`2x}i^U`EROMc~V zoVE>OChf?e-o8~P*nfqhH6p!)?OUt_k_XO4vy6B${P+J-?u;jcoje&9pi|O43wL@w zUi<^eAM>;WXoox|`dLVKVQDw%p2bZ*s;uxnvXd_H6krZ|2=j4FrEzJv+_+$V#p+6Q zA83Rj?FI4HAP9qTDb=I#l6+5>-=e|#;iPqV58X=XRzkO;#zcbJ-XDZsS|KOAP5uDc zS_(*5(X@wH1qyk7fAm1;9B8Ia?ib$ep;N^=>N>F-Nq;Dd?!$X1*Vs%?!PXZt$lQWB zWGco|)5Ri64M|2lw|JCZF(|>@fB#8@d-=pVPE%j)y`&n-g0zbigD{5Ha}v@rX$-CzBGFedl|-S)dV-1DmtN!f zBN(5kXcFUDGjaKG5aln2(nOIh0$Rvo0SgxCcawYn%E-&|#Qx;N|G@W0C&K*|7A`{B z(8w%IE0g(P-ta!MN4QCBkuxFI7)3X=By~9tx|{}!6509+Xko!L*%hj*_kt6^g(YiY zuY2iYw%0v^M-wy`j4_a?>P?fanE${wg{9{F@F6#r6=yrduEJ)t=GDkuT8RnWf8mAt zwIBNJ2^KU6a-uK~8V)hj4*<@Z8B|oW!`o~Rsp7B6D^MS3R9~U00AhSzi4)pMi=(R6 zyWePWbUrtfM;V|SH;KoSR~}$$kTUunYL%I~Loz{CueSE1Gz}UcOe5f7ECe=dSbKUx zjXZ_av^cItw&Kk!{{)mj{3@5f8Hur&o~m&S{fH9Ok+X(YxZQ8zd~y?~UVdtktzfg4@Oi;SiQGa=b- zLOYuRM`QSM~#VQR?u<1GR@Qq+7 z(AObuDMA=6GY^lC-?j>&a15Zq8C>0f?!RbNAC2$cAvL-YkpS-&mC)YJZVq{Z7SbBU z-^82A=Os@Le>WZ`Kmb2JQ_us^18M{YIwf9vCK`doj0=gtpN{@`t(&YaG=hs-43cWp zj+8J5)0#PrDOg@@wr-_GnBvBPT6p%{@+#8$8vV(sn0K-YfM6w5X>z|NS=vV|T@IE8 zpA>^e}ZKQiHWI`Rlyo!cCynEl$mwB zkG@0JopBVHnRU=qL5;i%L}e$-PlO}*@Fn;C1zjz%i4yMzyI{hUxECL4WEbuxI}=V= z?ni&?5H(9_U>OLL4FHVoLOA?|FhnsoH|uZ?OEoVAF`~W1$XMziIGmh%hKE4)$JzD} zi**6U5Dk^_+o&7IZsP!ji?fM2cI$QtcAe}b&B-}DF9IfLodSj*Z3cmcoP?+VYq(NbpqjLv1sRWVP-M<2i1ZWjm%mieH%fNC2 z*fD`Mo+@nydKFw(z;ybhVjT$qV;#$dy6RmoiS0y!!oC0vMDA431GaOM7m;?Wgv%rwuw{_CoLM`5_H7Gqq2o;1c zcGMIMgE?}`eJdhg*KVIIPyq?;8o+lqjfu_a`TP6{?ae}uXK7R)QU578wPmVVf zvxo0nl(ZVFJ+wiFoZBef%JZbXPLg;+()uDd-(pbG6?c3MB#w;-{VUP1lCM>X(VC=#QVmV&Pv4u#!8PDnBfq9pH2_Nq*{@O~<5KCrcn(*C(OggpMo6wQLD6x<>nwHU z4!xe+1C+g3;(Y{im+c|4tC5+202?hYvSG}VOM7*4VJ|+m+!1>8nAtsM_VI)OXC}cV zmz5Ih$%xmOy$T1bNOK^0@gJ!dK^0M>yFo6ohUx|XGTdps$Wlk^oZ^k4pHL(d?1(kG z`_O|3>D!SYP7V!}6$_FKqOwMUqP85qY*haA!qZipU!N~C5~GmmR<7|eGK&>|W3uB} zQ%b|%xx#Jfx*m45F*O8MHktTPRt-3-(Wfxfx6z&#NT2>T+Vw&&8K$H4T=By69k7Y8 z+d4VY*kPu(ts=>tzt+1Q7V5HaAJ!+4#1+beG2{)fZd!?jpT*ZQ(&jhltyKN5qSo?4jYR2=>U`S!{KX$h%yli4!l4r-hl%1phq6 zH#y?D01q7q;{<~b{doj9F9OwQq7IFzpY26A3gx0C=kR3lBz3Cf?f)bm1%m<>0-Q#T zQ`C_q25YIe>2&~6v zMvG_y-xkUE6j?dhF+axY(Q~K)zf>Y6?J+DM*pw7s~Ug zQofT<7B53J2F#cnhU1A>fjJB{d1&AXD3TOk7Z1@Omwp}*=?p~W1)BoR$y0cyg!;j< zOPo&1pL~P~z6 zj5z!Bi&Q>{cPXxQxK`o%Hm?6cJKT%w23#lNTN%-`$qHZ_`GhIJF12pvKWxaUhNZBn z(U-gzYdm3Ec?n$**&D)i)&WmhGO6i~czvoKTTz#ck5{BQF6yI3krKvELs zwb+fbfK6Yhth7%;{4g82pr)=U7Zq?&Sxv&0{7t-v!LVb)gU~%glf8#SZxiE)$^tR7 zIN^-J3(GaUL=;0|G))8{@R3X4T4=myNK^<7J6$;jrNwEa&+j276VNS z<8cbg)J4GEl%NxmSD8sRlA@!IlA@F0Ws)u7uSb%K#SUOy;7bOG@vxrZATOHBDDxb9 zY%Vr3(TqM)0sP~Eaj1eP795A;8^(~%>D?cim`Ko@G1oSfPj#FGYXnmv7w`bhsIv`O zW#wHaeZBj!3FdV8J4E-wz~fY-Xj1|;Owbe8`HLXq zdLT)3B*_Cv5?>!icx)Zr;N+1A9IB zIvDHd4jqEt*(pP?r+b@`pm9;G@4>y*SVxb{Kn{DcH8I6QHTGu zVS>}xq18a0ZcN^sPGb{wC}0qs4k#+>n(Ht$PCvl>SLGCrT#=UsyO2ojZ=v5Nu2 zeY|0kE!L20qp#{o@C+eD&lFolb*`PN_rt%*^wksXv^4}t5MMHU0ejwIvbt9hX6)n@~Vd>=MX46b&8-dzn?E_;(jI*+^QbQnJ|^Jp{9 z=i$}(J*fg1gH0)E0+VBKn=x&4A~}SG_Z6V1QbBW2taq69Of0|${fSm*6ELn|Eu+&@ zkleqWdj-#@JfT?_+3Q74Vva9ahxJ3^nF*jDc%~^ikew2CiLqeW1kVz8=qLHGZt)K} z@up0B5J{a!)H}qw7%^A0lkPBGHS$VbgQwo-$I>?WFgJ((oTEJGs4^ISu?f*4 ztcLADRMrHVaA@&LM;$iw!GR&9$E)m--T|2UEl?`wdCF;VV&%Db^N3|m@n_a=yr=5m z%&iWnwB?;|4WEGS7oXQ{i^;{WVkEBciAuYeX-jP0h?1L=7ht&%DnCdaokDm?<1JOw z@zC(M#J4FeShXS%rS$&fsj$XyUj`Cv+Z9{|SUK623`dpi=yRC7!%=0}0nv>KqjXe3 zlNDhz7pWQ;mkir2YUF*eBDU^DX&z)md1A_)zC1o_9JXOjMdAh|#zuR`L;faTbMld1 zDxIfb*MLLkLaQMi^Q5{8v_<~Fj8x9Br4B(Fa=DSa0K_0R00F7l$opNri97@eDzTOE zXcsj=g?;(~xFh+6JzhyldOaHZqm>P7%N#fACE?y2Y=(Vj_(CtMnAo331tf@tz)Wau zX%!>|gd_xJPzC))G=k{i@q_%tAdxE5J>_6Wu+By#BE}?tBOb1uRu~B}waSZMnu6M} zK+Lzp6=$CKHhHUjwd*_M6nzR1ZfL}UbaS%j4<-%tX;d#1%O!&M@@t6#0G&S!O9=Q0 zAc@`v_Uu*I>%d%T+K>l!IWr22Fwmtyz3FOTNpvBoL{^Ac+e5%r$w=DBEDZYb=2?hYO3I&6(4DC0F_2N-}g&YxyR zk+=zQ3EQ>2OBg_kM>^-9P^b~5_+hMkh1}sMQlQHzGO^4UPCDic+U!K<(Ce3AG75$_ zBz9}IV8BoB=jE28rZ2g%Yh@~Dpf-g$a0?QE9wm$6`%)0_qqap<>*N{RKo88EW0L+t84I7~p~cTz7?w?J}KO@G4RFZPpzd~}C?2KFgHn-)*oEe_9_dQdz% z(jLN5>V4AOMS`^6hEiLo*c24irS|wK7r3xDzmLY>2$qH3`2hM9_McslZ`a?zel#`m z3PPZs(R7ww|Let0Y_Hvg4ZzF-eaRf`v^{etZ?fI$-G4ouRaH>9-TEf>xbBw?OsL5Q zFUz-^E6CB;(Mss7jZ%Qb*X<$N`$!or0_&Gi|6_?-pw1eOwPKw~8_=v6{A!e7grFdNyA55l$uFZpv!^ir>ZdT*K{F;n z!u?IX=^AJY!)KtL)YBlLuBVMJ&b8o6PDG5^`4*xY1T9RvGW?5CFb`cD5{p#+{b^?x zHS$d=pT{jsGxE=`7}^TN{DKV$fa?$4(8C%pFiUbjM z`T7q!aNZ{$n^&AdJ*EK%Em5wCK4cmx9y@TM&d|&>EpDY&$NC(pMr?#h&+(zqxv+D_ z2TR)$=pTFr1kdRU!tBDv2AGu%;7^!d)W`;qfb~4@lc9;}39TA=6~S;!ay2%|Ij@|G z`+ef@QLt|KeSFO^Y#0R@8wUL2unipagQ=8M&ZcG@wK10+eU8VH!N#HKyOY<$D$eZ} zYRs4m^sm%|_AZQ2kPR554U1_P>Y5F$bOA3J$udAfp5Nz4V~@E-iVWWFG-cCvt+dWe zmJ@rtn{-35CW$+a(m7rF!-q~ZPEc1r z0ObK2|L%rAo~Wy){Nzuwb(BBNNwm;_?R}VKHfJ^k%KdtzXi>UjJG#aU}h!m zI;_N{U}04w%PAaV$YKRHr+++xk#kPF*c0zwg%UA*LW!NTQ2%DU`$l|2JDd;c^xvXp z1*%fs6hviY<1ud3Qbai*hi&H3mq1$V)m0-NtUkk;bOIhg+CB6W(&KoW80i}AzM-vv zO`_~4pk%xX{xoXjr~K;1YxL)M#R+Jn>HdOWNl=!=qa}b3jPfKl_lXlQ-yB*DO=7Wv zHNao?r0Eg;1*$l7DJeP*f{8bZ9da-&9v(5LV5T3!si3h5#?}sGS?H;k zp8cgF;6Xi>7H$o1%lDEw-J@TIY@)TGaL=y4H)YMbs%XN2`Afp#0w`PXGfh27NmCkT%GBr*|vZ#1py;#!XWBYGHEoBw8IfqX8ptBQ5Gw zdlohMg3ZbE(+;O<^d%~{rUcDDRjTpgB=(GyTTv4Un&~80J(@}lEu~34v)IXiPaPVK zN=w65$rfhXW=dO4X{m25ueR!*c1+H3@Ci6l!JKWO1q8JY1f;G8XV3oRE?!L{`$Gx( z6YXb6YjUdr&744;EY&?ShB3oP=AlwpA1zfQDVjpDmIFHRNkZj*bESQrr=t-Sr}?Kj zXZk1ROr~n1drD2Eh6yprBt)~#kHu(OLE?!7ZnSb8GeaIwM0SN~kb3x2)L`?^#gdbsF<|Hv*pl~kR zE)pxy1PSn6F^q_I<5Bv=#&{fNHN%F}PM9sJBR};%V4IPyWjqq8eKy{3>%c1i8kSP{o1r%hL)Nqf|}lpqh0)>E?=}c;^VFTnA>VR zUys>wtWX7=NA#}Lx*|JZchaXK`5E!V9^i)*<13Dp9+pLclih0I&}%lsnIA*`;ASR2 z<5GtyIF?kI?8}ReqI(@?Gd5#xkyu9*H?Wa+Gm}0SRKU@(g0hGDGW3shK`;%~y~mBv z-k9b78pCWy%r1w@=teItfmc)B%jA7hV}sPFAe76&lS3M1m4lXrUQNdFb053w0mgf1 z7$yoH_0-5(U?pbL$T!b3ztImKZ8x{W4{)M-)Xt6sw5R*DG&#_+*ip_P8vqi#*MSiZ zEVBgVb@)h*zVI1g% z-S!7z0S2Np5V&y$$bSqm^w7}V1d?{%xAV?>CKCGj&`lH$Li*V{P5v?nrE1-c+74Ys zu_XHX$aekIU${vqwwq#o6f4`W#!Q$d^~=ANt@kB_Lq05le31GEx+|1ubIW^0zcF2E zG?UT&`Iv)tKIWi9w(Brt4=p3n9E$as4sOQ?fRD7}e8Pte31uu8Le)fLGJB@mDN{a% z4yp{5ucg}%O@#bwR%Y_6k$D)4k)~$?8bvlV#$?K5Pdm6)(2jD{NsShmX(5MY+N{Fb z84=`@+x9C))}V-cs07p5RereAASlL>{b72w%4Fme$5>%H#T$B%8pxZNLOK(sr}kiw zlR*T{^stox^3pNsI`~-)A-!^Td~Q9Y(fOjLSTyr+(oP4{EefEMETIlwPP~ZW9j%q- zUa;)&SBS5~pGR@lNZS$rKtju*bNi+v+79|Use8qQCpw)(S~exlgMgCFO_|jg#6hrE zr&|}fnWN#F~) zXqV$!gDcpsXyfqQ-l1r}MZVYY1UAQa9w>IvY{ItctX(uye#QM^^m(Aze<0WPvgR8e z2oBAhZ=9G|M>7pM>p(j=amGS|<{F7g8Q$x9#{-4;W; z;as$GIeH&#ifVMT6M3t!`f6J~7LyG<%ylX{xEBygC|9sCkccWM0g4)&mB`v%ToFEW zp}P7Y0_k89$^y*>q$p^{obYm941+GMMuU?e!+8G(a(RYcMFvqb4_s9N97~X?0Ammq zyI8->AQwa6lE3&JhAeU$%2YynJ^To2yqx$%Z$=N3n_WP1&k%ds!_Q(MI)rS> z0DJLUWX;N`MuKNkOc9z%nH4OCnTaY$_+isymJcLXX|YE-O?No&w`jiPZ+}C@L+%>U za%2eQQE#B)z{Oa6L-EuTsD)5s0dV*Daq3da2L+6VtH`z3ffEmRAp@GaPB0Kq{zByN zh#557D*zU`?D{uYW)J(0zF2)W%Xc4=*%kwPSSzU@*{=UgsXI*HOtO zz{W#*-ADH_$+D(sKCl<2XkWnt35&SdsmXyh=G>%Gm8M8NBtwYUGc=o2W^NjwS~#jH z6-=INJUY$;7n&q}{r*&ni6@vJfa1hBHwsPlegmXYpfGrS_<3< z?#VcbHO|REt}`>UT$iX>f|}(CbFige64?mJZnBc7;h}3CP49RLJoIaNrA7vgh_#xN z=fVojd}&1I10OZ=cMxspUP8$1h1A48e`9m8 zzd>)qOJs~i#<;+R!(W$iW{{hLYGt&C-Y<~vMf852d@rH*Gv#|Zy-$+w_4JO_4=U7$ zci^hUV_hhh4raKQ+npMN2(p1H^m__|bd9g#LxiPT4*az-zK&?=OWys<3=>r|$aLMd@|Q$gjXZ#_xV`Iefv$EPo})%7Ro4p3 z+|Wun&pX1TzY;QmIQvbS<*@u1$T?TO2sZxD5U{Ko9Fv(n&NMSULYa8dNHYaFdt}jC zA#D#vg0M2@fUxG`Op1>@>g|30#mW##AW%(<-oZWW9G#nG15GZDmx5!>Oy8wUpOJ!R69t1H4w)(PVfd6#sA`A57NqYqAVRkE0wXVtNInKf zpdm-c48t@p1aA-hm9l3lazA~MKqfskL#6EeG_=w`oU$rAiOF_Dx67;<1&H;ZVjjD3 zY9W(^+HYtMr5n|R|ASzz@gOxF)%LbWkY+y)k~oM%-w(jn>j^X^&-)p3g?BK`6)O-^ zR*dnxs@(tq9wnj-y@5beQId`QU6&-oK*bcL?9sm7*(Y5dbFG-|Nx;gK5bgpX%hpTtg$|N7|>_1J`X zuE(r)11g@Z$2nX!@uEcESb>8&sfGiUQ!F1}53X};My4Jw0rt>g+$52*>M=lpv)kcH zvE7Ky17IWS!yOv~C?bmiP4Sm{ND2a(=mV_E$Wc+w2!_^CF3fJhIjkPxICQ9(w1+;e z123~vm#6H+wsn*~tEbX{wconcEbLYkMk=rxxeWy+fABA8>}N}KsCzq7Mvyv6q_OYVfJZ<^2oB(%&q<$ zlr$(SQwv4CCQJMq_f&#sG2ty%hJT$lZxK%{ga(L2rBKQ*{}DAlEiaL)K`GOSNmUFp zR0W2N0?faq+8X^C5e(!6xuRc1!D$W1I}ep8}7@N1F0slZYSQYy}m|+ z<3>C+>S@Xg72JqY3VEV0a@2?f!RUKA2d!oPT!$Jt4Tg-^a%41Y>#yj|Pp#q* z<8Fk&T?E!}@JkomIV+E6ip;`+(r;ttKawd-&vRD7f+r~^t-eAPzep_2bjMP(rT z31371rl561Ex{Ft+j7d`H}YrLhbVje7S6j{$CNx&DpnD4CZhA!ejrv6YB*?EP`Tm5 zR{i8bg)B?yLi91rF(SbQFrovtyw0IUDity#JvmJejaAuuG}A+;8l6hXY0y+7E_%(H zpG3zZfF_@q%$t+XtWJa>2%V^pM5yog$asiU06&&i@KX>xzy=$W|J;ZO9I`|*Q$#gT zLdxi?(&b}&JsUCL!L|e2>%}URL>snvd%cchmT&+8D$QHs)yN36Co?_q@ouCUx*Ql`m;QE66&JMV7!zH%tI=Xa@lu}}p>4hBjEgNn zx#Tf4jpHy=)SJ?KlIOU{gS*y=HDlhBJR5tG@tZSp;wSecyKFS|ra2<}=ebeHtu&L& z-i5pei!h@Ceu02=qpFb~(ATJG-?T08Y2AU232|6kYc#k{?3!t^)jBsNqd^j99Va`{Hg;!eL z&Pyw-;1JRPy8s-GDR~eo#=wnKoHF#RiCR2H-&Fh#3R%nC&FG4T_y=MwbN7z?L0cXf z`m*Ye)I$&8hJ%+*BG*b~*zt!PdW`u4ryNzaE0GXCvO{h{C9qq$hgH;pj*%%ToKX$a zlN-X|#}Mcw3^xB8c%Wk-g&Ry6W(*DhgIu(lA_RRKo#&IhG$-6W52Sf1vVt;~irZwO zY4}ZnxUCGoun;v@Z(jK1iN{o?SO#;M%=L0mf&oS-`>sj zjXaLMs9YDRC}OA)%s#@7A&1)!bfOKDl5>>7E~*Iq4NWAh%)u2WhrtW2Ir*!8A_gx9 zTmi^KS~?A>a9DY5PCl5nPhc}1rT8~);rA!1(Lwrp2{*Qssgd8)_fGm|T6CdEqQyoE z$*707Qlei`5RJ8JtVbJxyoaQB5;dKi*Fe<>`h2S%SCC@y2hFKw^aK3< zVoIi?mQJSw$l{FiHwjYHUJv*gTNR&$iZSgdTh%H6lI{iHg+jL`f=`~Z_>;H%Akz{r z4}%`-*gECQSf_Y0AS&Q1J6mtWhQ*AKf^P=Q`=4Z;GQBU@I+a6{O?mQj5$IDuh9$Z1 zMF&MC-_KrKb@Yedcj%LG{Ox1@PTndcRlkq%=@bhj|w6pL&S1H=X*JA$9SKzyfwiM6nmnzz$ zxOU?DJFYiyy^m|`w-xOqTxZ~#V_xUt*^Ib9;YrutW%5ehfIa;yfv^5B(O#5IH9&Lu;0Q8y}?hJS>=D>ECu7{DPFx-W#gYR0-h=`dZdDP1+NA8u=4W zK)GMTei9q1$(uW&dC3=2tQYi?Pvd0JA6pAe+B^MVI9gU3;mUmG%8~XU{&Z!?&;0rP ztAsyX2N(1wx=H>vnL8&dx*?Iqok?C%q$s_wtMU{{F_?T7t8FyxZW`?&C=Zr2HjwO0 z{%t#$tkw>vA)_|mINfNq8LcHoYpKy%ZnRbyt<^?rz0ulWwEB$Jc}DAeqjjOt+HSNi zGH{+x>k^}NsnNQ^*wBT_8XHJb8yjMLzlrXx9;3Cu*g*C^W5Yte)8yLNP{DUHXBivn z`Ob#e4L*LS>0)dH8JJ@m$hIth2Ew>j$7y#K93lY8YHY~oq;9@@_+G$wvN;$VO8LHo z?>gVR_`aW!qr)MM4e#)s_*ed-Lu^A5@39TE_+f0=hxj=;aAa3`M?(V z$)eW&Cb5BvitY{S7dMOUrFa+bi_?s;>@0$X`}%za{;P4f>Rfzcc@o9exJK%v@%0R}cMDbW_cM!ztpi(eRN(!WV0(!v0hM z{3lPuq=^H5>yGNq3ct-fbaee4IHYq;4*(_wUWsLsx02bP&oNKbI(*5gm|KF!dXk$g zTJl;L`r7dO5&v=j{nE|p{ySUn;hSK7=fJ8k5VVMHClErnb~M683f40G`iAb59Ytvc z<99u4c54~7i8@0*78uN~&dr9ynCYOzz25gb_5+&k!RlL*`pPh7qy&C!BIJO7$y}Q; z$0mYy{HDzCxk(p}H^?OW4U!?zVD4KBE!tqMZNsJXuzv{;{&6#-#cs4<`re6j8W5*# z)i~~1?xYG$gr;QrD3I50hXP@dPEk_?%WZlmmQyA)Pju-YLkW!Eprd}G{M%=hQ`zLV}PoyMJqkYOOY2cJ`7ckaVS>`wA(H}1TN)2+olcIWN% zzWD(T*~s_1`M!zo_wxN7x^I38ck!-qCozd}=OcXI&i8G6@5MdYN=p@k`1PSn%I-{} zu+WU=7?ttB^?uI?#l2U_5rg<#Wma zA8TnzUh+5)h`tKw@!Yl;SCD=Q2B0^BMlz;NhJXXY`<5^ZJmTp>4l%b>1k1@+K+LV6 ziIbRHj}`8G5v;~nftc%~^==Vtz*n)D+m5dy5nPC`QZcs!UnO+@wEVTEHkx@=h`CF} zml07ef=lpSkMpPTRV{)m@Z}RXvs9#gd3R9x2%9f%X6ZN&esOoOv?RX~u-`m5PTnz} zXbImPF;_>xqWB#pGGK|g*@?H&f4A zBRBP0vZr~BT3Q4vHs+M0dlneAWO^$%0<@e0|J8Z~mKe2*5Lj;nX#ZNN{3V47qjo6* z=i$c{5Lj)@=|IW`qnqml_a-B-1mQko&I*LjH@XQs?-F>61v(MF(BRnsqA>oH80(pM zYnWo^;rG$5vSCH$S{vXm@ebn~wwa;|!?p9UBzO zQxKEMiC$#{|Wwz7am6FPv2M^Wkz&h3HtC`S@Z6l?p)RZIAuzyERH%;NMR+ z;mrU%I1+yf+Eh)<2co?_?w=^U%j0ewj$z?b9sAi?Zgc^JZ}>1_d-$~D!SLBcW7}a~gn3R{6(~U*_$(fJ)}HNUwxZ2Ca zhs+3k#BhHPy^hq8;7R&jO7trYC&zz=YL0*foMZBxlTjZjlaHDSf2hLXhnVn(PVB+g zzYzZLGf(>yA{!bv?cX`s5JhoL@8`_3~^)5vsDBM`d-8H8b(7AM`Q z;Scla0G0(TIq-A6gtjR?TKdi8^m_vK@F7*76+U#bULHQ=K^G=c`K3rWG$MIeHj(5Z z`ezvF9F*E~9&ToE@ArTT1)5Dr?U$&0Gkj>Wy83PeLk5p zN<%$HT&Bch#C`b_@)dI&i(2h}Q2sRjhP)rl;qUX)c|S=ewyuNy2-hN9Kg89As|VL} zxZc5~jHN%z*s(eM!Z)jJOfGfU5&pUnMTI{+5&VU{c4-?1SgGSxYU!qtcFvS7gU87Slr~$SNb}GD4G_iD;pWwczD(t#9kq^qD3(TTH?7H< zTu46?ZXe9qh;mtcV|b<^lv&Ub{wN~I=|1h2<(*~cFKlYQ<${O!R`tv=&SoUY#jqxIM4M-uoZT6V!Kq^S- z?EYR%gFse)r@fIfBQrA%)#&p1N2N-4`K~*Fl1xQ8k4yT?d-H4@F?_2Ec1Qj+=y!v zE+r?&V#zty-!b{)xb&-b!o*FOWIDgZ|K#Nj!2c=qQsCc%2WWA`Fq#?gMvsGXtmCdU zGP+XkPpapwC;>nBrCo~a+qk}mOW~g_wAe;X5UiQ5z%N<-;kfGS{yyqUherQj%G;OF zPe;jXQ{F<d)ef-=yE zhc<8{?!kkF9uH`|qgnW>JDljKek)86*aMdyB(Fr#cC;!Qp{Ec)nFG#zy%$~ zLi&qUsxT0pX z>wx!kD1j0XFjFX9H#zv8$OpUa84 zUdJ;(p#q?qB0cM0IN#z#(!VAhuTa=eeT}%n)I!{M;d>l?j}QxQ)c)r9;zie<|6}gj z^>`rWm@`HuI7MQLMlfOP`t)IEZ5|-L2iwGCJkPl$WB%og#?P$(XV%{~Z3J!w zgj@D>EJM%F43DRyXEMBOmgCKBTA~IU&fI~Zy4nhk0v$VHLcuuKj>m|Zd(

6ERJ~ zIqT>NE%i3C;!xwEGt8;(==`L#J3-BKS3=s`KPhb&r6taiaH)SDfkUlibl|X*x+v)( z^6XbK)yX$9*U7hX35gZ4mO;x-vXoh6*inkuvAgfu8L)zl0hLr-Gx0tZ&r@)H4Hxv+ z>^}<>S;d+OvE|YalF;yw!1+~&&R*_Qx5V5(m5N2mld#h(E8ITltguGGxP@&46K6`( zmi$V}apHvVdm|J5w2`167JB;-{azpR>=%H~c3dyvdJNZ-xIVz8j5+GhG7^#_U#+$b zPg8%B_MBRpUY;LL+ClM89hS*h$opN>bBd2MN)r6=VF$sK#yD6`%g`kKSaq<&bIdmM z1S*t4hx&tU`VI(GPzwhgfi_3WhtD#9^Z^e0D4Et$iO=!dFO{DmKdr8t`P2Oi3dnfs zUuzJB{?-0-?q3afpadSGEEyV^V+su@8RIR&j$_UNwr2z+6CZod0qq1h(s=aQSY4!C zz;+ArK7s4UxX#2k?A4~ZS}LMw50>|zSw3|EAUi6IHdCAW8yn#N3xr#G4-;-a9<-Fe z7I-|UPqQYKQR8lc93eLkSAsl4GnyP7aRyCpDNyJ7r`4~F;r@8kFZ8Fs0l;gx_TqXS z*O`P6E@cd6B-W80G-k|5-yyEes*k#Qon(d;SQ3D+osS2x+n}Wv0C}N=bw~Q@p@Cka zHmGm_$+I-_9AJ_F+6bzMjgZwHL<08KNH{LZviO`SRnlw{Fik!a3I2$>K8ovaxE{py z8(jNworOw#6_%BLcLR!~%EPn`%|J|b(>^ZIX z;GSV*De66d_ljumg3yUw@4XZ{DPCzQ-?%K7fQ1SrBpe)9NhQ45_1^2D@%P_#!Sq&aWE3L@*MMljdk@*6DOeU1}hbF~mTDlIeU1slkxwq@^u}XXgCEk2oC6fMZ zM=N{Z4XP2W#4BAFeMyb(!Aq_8T{%k-9~OQzJT`GR+2$dOC#qYjPiY7rI!#?IIAE>o z*VG@^DR_iaIqFSO1P7W@x6x{ASnix$jiB&APWX+S;RWH8wewpP-;s_Fm4yea;Ww7Y<*oLRp&c%;!p9TCvF5sr0)^*WE`bB6jr#uh1rJoY0(M#ci z(AEmWJuLzBVDQ5WxEiVGKw!CIKn|_^j__KFU=tVOQm@<#-$`7T;kp6W4{$w#OQC@u zee@XP|0sdw-HM-=&=;y(!1WCvQ{TSu;jznafPV59kSEYsk&FW+P-Q`Xg^_FOaTVUJ z`nd@@X$AC6XFM1_eDd;Ib&KJ+kI0+&0Qr$H^jB03eq;3(?-Tkv>Xtl|b1KT=45`5-gcm#Pr#LPZduWJ`+A{yWZYrvL2;xPp8)-;X#}C!vH*(5hUI%JUALt z{Qe#DKunj|&cmZ_&TwP+qnyq~1gRkdsTF92|D7}Z)$m8w&U%XTW#Z-lmGHl5Kn zvUL_w+`LR&9xw?18%TsAt&&*OIa*D6w5HKUy$~oXMt!Umq~IO{swCj&4WEfAU}P-z z{ptU(_b%{JRp-KYCNl|>5ZD6*2pAQ(N`e`#Gn_*IG)eVnUFMD55CfrHa3QGZ z`+dJJ`8~7tUVB}h^{lm?^{i(-YprSiBSyoo!CRMyK|=8d!?;UStlaPL8&#P5n{lKd zKNWUp&4Jdgm%l8rR1D?MC3V9}OFSk-Wd6WR) z&gmsld*u?>%lE~=9l%e4XMop$F8nCTgQP#`qdWb7H@%D2V*CUDGuGrPLs{J^I`WOX zI;a|Cs0aR#<%5};y=pYa3{I#u!hhwPc;?kC!q7wF3#-kY)4o9}c^0QK*Kib(nry># zVa4l>HG_h6LuciiE}2gj*T7!Y>;;M?gZCmb@2{5a3?0g@m$Wr+&KN1MX0+q09ZNXb(^K^!f_}O&ijT{40_sfj&gMgqQ2?Y!TZSmp zqKqYr6_I4-qlhH$(A0j%GK+VHCH+o2_}$}KK7sda_=3)KEzdsyo&@CE1wbVb2KnB= znZRYhVjv4;xX75~Cu}qMmm2@gT-^kc6j8j>xa&Sx2ZY)FM@5*mIEsJj!E|bTsU~}N z-83n3SN_R~Rc+8LUZLyVU3aR4O7c&Ab&}McFixr&#+lwOQjF7rf>LdDQf-+iF8>bb z6|7O{?FBulwxMq8{%mnKpohA0dju_9e4 zp?_?Odu{QF`<3nX)^dQOa+hxb^@}v>BXFeG{WUEYEt}*xjYMP>8j1ZbBaaqiXdf3o zfnFQ99XKB-1%3xHj>nhU2=g{@7??}ge+32ur8a23q`?XGA`@+?HTnzga`fGbDqP)Om!- zy!!_RleF1elKw~rzC|R?khVyYU#!xXrTDMv4@#DJVy$Xy58!0<1(79SLC6x)jC$$| zB1^ynktHNlvM+FXPO3&vq)RmDE}_o=l5QdAm8aU5NIpqTAkSFLO*GulH zF0#n(B9{njn=ao{U1W~kMTQD%J4e2yx=26WMQFGUX${vAw!gA_P-bb>j2EJ-R;{bT)iQXVihwFiOO9kbGQFN z!fD27td?s5GU~<%H{%syM~gPR25s4jv<=i@G*SwZ$$|&deHg(R2boCNT>rQ7WlgX` z;T=8)XKMSDWNu9IrrWtCTY2Di!TeMSquaN!y3`JnY~z6iw50YUWNQ!B#_B9POp?`e z4JY`tze*tL4@8XyIZi4y@$4HY3U%bw<)a~7xkt=Y-bfbFsTmb(v5G~pkW4~}g21Vv zM4v!$C?Qc3`77TDB?bm|in!ryZ)}^2rFEfXSgNAxn)GjCODEI_b$FM*B|3g+p=k~k zCWEEWJSol^;W2nYiTEFqWRRn9-s#3~Wu7cXLdArt| zRM6(lD(L;ckdoRQ?Ha)?RoB-`2}e7k*+lu6s$@o6H;0v~R^X{SO+F@Tm$gP2$c^w8 zBvTqDJxH%DKyjW#R&zGR%B-Ciy_;3!Orv2nkwg~llTmF-##FH!6)h3f&}kny*Jgwl z5L3o&m4WQCt!Zoi+MgN2fX9L6zo6#_h5~Q!{zqH^c!bw27pB{{rMYu*MK<^LqHUJ& zy#iPQNW8Q-5+?PRHW#=P4j`}^c;Lw_-x1=SfqOZy43KZ{<35Y~6X4eXn^+;`8}O)Ex!|<)v0g{zaltZ(LO{vk!YoU&4V<>YyDg zIr?$>x(X%=s`jla81vADcCh3?$QkT>qg`^ir`|0swmEW^Uf3e62>yaUkKn%vC&|#X zj^bG+$|Khcb?-02Q7G>xaAv=I2$G5tZK}fc75jU#>lqEhNZB5(Ph+$;RzGHkN%laa zVFzB$sBMJ*LeFzLqUvO4lf<$5KAS`Qn7ClNOk+9=hdAbI$ppCQRgFj4bz?IzzfKy% zRJ$?Moh%=dXa{Z*j&YXFG3wRgzvc%LEDiIY;S1(;;-a|=s;stHZHF*J*;=F)fuOz3 zE~FxqTv4mG7u2YE>U_;Rh@H-3Bpk8qU7r*uP)6M}p~M(h7#K9}B-5-`jQ6FF6ysHS z!HCOZp(DBId2AlWF$r$^W|MF1y`!JzK8FF5%0mZp>pn%eByBHbLk;I#l&upi=M(@q zxk^y`e4CR>9G~Q%)_m@|EZ;m}IdB85+6Alt&gQ)dS3vr^{$m+I9-RITPOlQK6BzzX zmhULAxdj~punoUiyic@&H1gbTPoDhc0PfsgB1YwTNu!Z4zX6^HB;J$6mw3cU@i}=) z<8_k>vlyrYE(Dx>C-N+DC5^A*Q)>N3xOmd-NG+NI|S+azF8cu1;9)Z|4v&M7*eXg&y-6d=r9bQRHd99Up9Yy_L= zqU`9mT{3-^3%?3c9B0o89Yh%j?!!>^sFb;=0RkjlKip2Y;Jh2 zHS_$t1D6H;69VT=y<*B`++|m6geOC8D!!x^qF$hsBUBB_5_!Kc{T&>WbVu1zi?U_0 z^F47#8~QY$4eqrYIFskAfz`kt0r~bR{)2H}ra{#My?_gV8i10~Y~3E5^!Xy13pj+< zwrQP`@XR5`T{kFh-x%Ad$oo7FIQ!r^qLKQiH7H)q@lRBPVl=3RDQh~yuey%&%@m6H zO35aLD>eoH*UlGT`B zxC4wG{lN_~HqVmACrf;RYc*S7Jp%o~O!=0SpaPYe5wIQs3ph`{CB>$|07nuL{lVJ3 zssllkcv9U%jH{&u};xcjSqoaQe#|LY#^phgP89t3hSlP>v?vRHn!j@ zEGb2DTT&8F>ZB-gpzJD~1h!z2iWOrFx zV+Y=07|2LBcIDrc%%OeN2sTHCu#+k4qBi3CH*tEC@@KVbEvL32R){olVRR0*81@_| zmKP|R9vBje^;S1e*u$Wq((u0+*gJI+;>=4hL3_Z{U#K}<=-3q;MN4l@qE=foRmR0L zR02A8CF2ZH9%OIk6Lu|!#b_bN9Ih}m8ct*0792f+dk)m#OCy!>_cWbOGW(%j(;b|d zE+;RMZnAWu5yzqA>0<{=@GdA|@TVMK|pGaF|2a6Gt(r0X7b4 zCA~vsr6#2dl`QzFO^vj|h;W|9tc=w%jqZZ-87hogCF?i!3Jkde!$L>SGIJE-g0TNH zBRq!|BWFV_KCpXH8y*cmA)!nW=IOKWQtK)mstnORI3Qnlb(bpoBjIfB`mk_UHD66b zTBKha>7a1fp&1AVY!2Ig9VkgBk@>1_XOWQ##YJs+t96FZkpY33x>u?eSVGE(_(ukq zeRR{dg?`zG(pH(5|QnDJbk)58hx-JI>UBe*{+nx0$+wkXT=-`0m zC(E?zWi|d};cyjdymzR@9na-j#kfn>qP9_;MKzIZdv=0>&$q;9UR8N)8Dlk!h;w=D zFjB_^c!4HSR9?d=0Ru`qMiM;!a6 zBkY)0^r_gP=u?Vw41Lx^9}2t3MzE%hVlES(xmZ$Fs$;agoTBC5D1PQ{@m;EQC}MUr zh||v&)y%{ck!XKX1z$wLg%&C$)(O{(k%Y|tYZ!=pwh=?Qlcx?T5hb21#-nCRJWNfl zl-dLufscS)z#1S5Wc8xW_sX>9RE8ZGbQi$##(!F zJp$E+SIdiHsquJQ;{G&2@fo~qR(6%*!J>CEOHd2dA(p}^Yt(Ufe9)>=-Z**_HfRS+Mp9dD2;97a;tL$1 zl?=u`8~7Q|t-w2gd=m+gm|k_sY2oB6{JR2jO-w-(maLoUl^19;xuMHXrB{xARkgYi zIOFm-)lJF2%8D4yLyE zu@Uc0K4HfD)GopK{$?BwJm|+!IwkeFkqH~87PwSo3ST^JGTRvJ-}oPU3>I3SjonpR z(5B-Abz_2+3fg`R6(|R`P6exU9CY@&7~s%;5#d4yvjb!PEK^KN$_>bCR`!*}zY_neBxV)*Vfcuk|`B!=Z!-9uP%%KvvssGp=0U!O=XRLWy z)r)_JIZM7wn+)wWCeyl2{sKGsQ&jSD+fjO)0rpqn$##{sCtybUxT}RSo?k^>|AzMU zB5(*8&-=|ly+pLUqi2O;Ibz87o7XhuHuY0a^O8@~ou_ziQ|_dx zW7nIPG+`@?sai6%+a7Pq9qkGXSKOgujAJc20QvVSmB;;+I7-dxuz=>4-SBzf_rNQ_ zCjhd85>}EwBIuw<7yVj)QWy+SP-jl7T|C6EtGx^@!PkWOxzIsTA<)miEih=b%k1AY z*)?f0M>T)S{R7(;aXf7slW}_+K&pPJTWnrP#skOeH!IYh6FOML@Vk7JEuTb2yskK3 zAx_uvR$CuCv2J_0jFYFV#3$hY1<(N;0s0cN$1*1|(GSwrY<#qxPu?xq`Q+c06FfN3 zWKKQZCEm2Syjx>Z76~u4?&Hj_DpC%p1PIOE~ap`7KXzz#d?f(#JB zs;>xEc~-y4ksCdce&yC&&tz`DnCme)&1-QR{^h*(3-nfl{e?pcU8# zyaj9oz(;g+g~GN+@=_$o6^a%y;L+wg;kb` zY#@dJO21JZU73w0oLi8;r13PN8Q2arFmL!M$7uK+UNZyBX9fn`V61DoA(AU1!KUm< z?T_=p&n8}@L7uqZXs#=?r&sG90(iu5_T7oS*NbnqcsVa_=Y?JRTsq8NlKj&X3~{TT z%i5il)hFxCtgIU%Rh>6Prger|J@L6D8hm%6%Gp@=vd)?$dT(a~L#gs_eU~@l91XR) z&|X^spX^G;BzgFgDv0W;5!o|zTlQ%JlFF1Uk&tW z%ui%leJ63MsD*@gQ7W<)n83>yZO2UsM0aK?#>Na;mk{zbi7* z{7{-RX&7r-az@C=*>UFbGiCAnuZlVD#Zhu@n?A}cckA)!NL}@EBKf6wl{8hmnlJ?aeAUr6NYuEiResm}y!max z?q@-q;KAUnh0q%D&il)ytTx0^S3tkwMI;#HCr!4Mu)u3q7Wa>X? zgx_H3PnMWgimAPk4q$mEO~J=VtmOFxLgsB{70t-23r!MNBuui83P zc0~Gs_1DmcN6TLGzrC_=Q*9#nw~pZ9-KIPAakl>jw#(@KNY(`ZAx`x3j(Vf%c30Do z8zRF(x!KlesBFFHe<3p3d`r>Q?rmy(>9)NNZn^?)nryG@b$cy;SGCuXI2rAA51*5@ z*R{R=2Ol%q>kBHef3Ce|AJbmxVgFEro%PQ(*w?#nutVNqtqhn3ya4?F?bU9tN0aUK z*`wXJ*D*~CU0>N={k!yvV&GcDKe;jH2^v#yEPM2XEi#K^xS3)dDEr**4=R+IZ>(X? z%Lb@;ucrK%Txf@CeK~?{W8Hg7_`4oQ_TpS8^T1C?1o;SECC2*fCPKJU+lSg^`_RPD zdf6`&f71yW*s1f_3Kr%@jX|6CIw?4If;kAUMUe$r_Le%woL{_T?FgB8A(_YjMq9z{ z0}KWB$@>ZHv70Y@y>^L}+Fg{tyV8CnCP6W7vgl>pC1UVAE^BZJfnWE>;*)5#PeAr?T2eh;V=^JJ0hYKGV+NR32)ful-qZWT2zTk>XR zvk3D=(`0sUN)6;WDdfefQYj$w24B%BJdd+j?a&h>m}iIsePYn#yL|h57gzjV!*3bx zd4L}fzoe>_u^@e)o_v$A=~EAxM7vdt*U4(8hX^S;64joU&N8S6My;Hm&8v3A+1 zH{H#Yfe_AM1Spfe=qUAvEq1t3pWXX;+o9H-_q4Ch6ZB&9-1R1gQPa zQP29+F6VHe+V*TT>_w`U(fF{@APW?FeqrY<^=D_=i%fsS&2mnLVn;}Z96Lky zSRX$_wNxS*nm<|Ol(g(^p$4P&}6@md>m}_v@oK^P-(L)~z zqU)20%7%rAY{mP?9sfXyVJk%JWcu)tC;qAvA@HKkZi8&WdxpVXG+REt$_B$)N|wYn zgq{O6;Zlw113KCqi8cc~Q_m5etZ{VAclQGp(VW9fTYhT5aVy1zAPjcY25p0mg0pV|bw#1jnqMN5I$j&M?J>9|M#j@wn zAJ(5=qdJo=Ejy6wK4nyk7wgZSx_21X;(aA{O$4nkSO~^dY$#_eO`?!C2>ei%6*}@& zcUcPwWCRdOFo@<8*B(SwQxxoEt$;)sO$XYe=^hzP-?m579jY;swH>helaJ6P0S9e3 z1Gg1;8Q25Jw>yBxfF=4 z?o!R-uK!pSa~6)VhUJlC`2UqLNmZdWLivAH0*`8wkETeDCO16F7H^ybWd+N_g zz9$=Yo@&@6R&70NZL{s8JT<7|l8xO;y#6Wcpuizu2snNn_fp_oo@t6nlgY08^U~wx z6ZU!H{Gz*f-Pl@6vtoSn*n9N274lVP2S&pyh=kqqoo(0`I+gebibcnMYQL()2XO34 z{0h1n4eLn1{d#`5*E1|CRU!1N>x2~=4b?qnJ~x^9^08#RPiMS4m9Z_c_Q>$U`^Z8D z4pbU4Xvtc%%GzjnhcDfAiNA8O9=BGp?akRSw@r4;ZIN+GQeiQ(rj2Ddv69M?`H!96 zz3J)E4Fj-=Jf@OSxu|bn=x70FDthYDdSJDxrEUjxo;k?GNAub z2SDH}S3aKj57kyVGDRdl1p^J{dq~B1|BBBvmO_+^#qGBV#!_ke;EE(NX$FcL>a4t%@2h)Y#OS*RSc#(;sT{AQ22<;^)=wBo zH!_l{=Ck92@J04Ws+Kclo}dQ8CV`qMJAaM$V8EFj#a@6(|emL<{sIVoF=wWrQ!FZLtoc zh*)+=tQw;$_==b6H??izNq6}AF`jg$IT@ZR#lYiml)@w( zWX}z~*UI3s!J{&dPDbG#n}b}hUaL@sE#QoxlSPnGTdi2Q+oa+hi7k=YoE?u{I)ju= zIeq2hFWIYq067_$M$75It-;O1|F7`QWjsq?(SOJ8b4!nZ4so9Zo&#Pd{vu!=V5iaJ zKDYEVB;M~+aeCwv>2YpM%lB72uK*mpk=qsO$J>u9^L4d`iHV7}FJzQ&%bc&HBrMkR z^=i@UWG9UzP>|)vKEl#meAJvhPUSL^-gj78Q5Vgn;;LyjztS7y(1XehxKgUKE%uq( z7H2C*$)4SI3<)SUGa7_F2WSv`_Kti#BPWf;Ol56rIX%C}P|Eg@rlnGo&2mm^SD`8} z=c`YF_jLw785`sf3`tDn5)=dRk=9l{pD)!WwwfBr`Fub9*`Ck4ReB3JUQ6x8{UZ8Z zPjqRvGoOc4a+ePLtHPyQ^)v6PLM&g(82t()VsLN4kvU{FAxl_ewP)xc!&IL3D~fU1 z(8gI`av)XRZatw7v4d@sCw{I!9@wZAz=PB#HXmBJKQ>LyVLp?CZYxkK+vYe*QCVO4 zcNk$YA7-diS!t~SB~{r_ zRQmO9=R21;Ss^psqq7R=tgcFB^%Zh?V4=#U%Y3IIIiJzZ!A-D z8+%(>+C1mEPU->p2*?As1-NGc19^tXJ?<$>k9UahPXYI(#Y;|*y3BJ!oPG;;F_@2(JFrhN*NM-g_^~ExiJwLU#eQE8@ z#mO4cHFkQ&yQh9&@?BSv-u9KOBF2$Aa99mI2)Kb=)XiF4>ZeB@o*w5v2zwJy0od`V z*Av_Sm0YhY7eylaFGqhOQwt@e<;SMKC2XgUT8|r%UK~(E; zr`Q@qXFaaXd>KvaNzTSDM~Z=c`652OTZ=7Vk$y=;`h&>XHvjvpv>9|<1DC%_dns4A zgh%5zo41-bQ>}LZ&A`uq-vL1&U1u$Ow|Wt2oAOVsFr}VS3LqKZw6)7u>7#8mrE~zF zqdv5y++GUrY<7878F#&=wqgbM_l#y=1lVV&NyAhcN8HAaWQWuxVaJS$| zF(Hl3N&6(N5tTK;WS*5d=-E=xJ#VJ^*w=KnrMW8GLLB7b5)!dCSueyEFg)rE1s7Ww z@@aeiBqE#~u>Pp%fW;mMCH&-UXBQYjB4gApFk3MlnAzR>uHBwG-cZ#jd&7!lZ`fcx zfYhi<1|$7QS*=XA>k>Y#M>fgVQ2EMxrL{>=KN5RWZ4u+pB_WnQ4rSLUBTh+4$0evl zmu+G;er7%~)J8Ffa_7qcf3_+UlWY+yXS!K9EYjP?oDr@@nU$temSknySVrcuZA^k_ z{8dh}b!`+&Ebopa&U8?*E-pL7B7~MFx#kyFZLv11M`h_vgJ$BEO3W2$%0lgd9(Y` zGq2h088&_^K_+a^?J9Xs5mr2z#`!Zm zr3Mv}Qnz-r25`%a#+1;L5ly94zbF+dbaa5xum_Pjtx1%Sj%vE{ZA0ca+2fV`_M6Oa zveQd7HPumSFbx2=L-5!Ovt7O|9+z*K+vR%;_YRlK_XD7U_YHi18>r@a7~%dCcPkJE zz938lzXyQ=-~#;afmfc$-mWFYtpxmlijy=rICgJWA?bcX`fmUn8SEmK6n7lZ8>r^p52$p$Vs95`$@>NZX9F9E`v5Ql=x*F+JXd?WWIR&lqG-yK z`?>V;#OoRMAZe<>#+}k_7=8vUXFa`fv{wz`g*c*-^fExl)l6ik*$U4o##mJ^^RZKF zhk1v1sTtSC*qx%>5OWl@aZm+RTfBCdn`lGDvQ|-}CQ*@oD(*z-%{$G!#m+{rPXQ&kA&MTb{IG&jnNUcjsw#ZW}dLa-1(}4-VWx&4z z4ZvPN{CnCH_TQoJ2q{6#EhbAs-}~|ueFHcrKwml9#G&sn(ZJaB6?&!@U4oe#?27n6 z?HS`@47F#hl?s_Lyj5!Jq5pn8eC?I5sD~tp*U@r*1NR%-rt}5e z;lzx;Sl0DNy}`%~wiFctBsuqXR4TYgx(LooF&7y0Rxd?kn)s~@5<2t!xG z=oa)#NJVNEY^)aMXp5wOlR5BmTO{4-gb!@j4fEOH*i+4xr0-v}?|%iy)|kJ$EdEIH z!z22`k3?j+H|c9>-=I=iEoXSrU&3z$PQJYTn=())b=|^odDF`o)U0~(>CIzp&1)!= zz<8h!a1-DGh5;i1`Q}KdDf@9TVUK6CM~|a|*^l7JUsYn6)Yloe)KqzW?6#M|P6X+p z%P(QvTH9L*g}=eUSmRZS#Ri@^#=2Ix#OB0rgOnuD53iH)k_%~BIw&`N zWbgmNY(_1~P>xodidKi=NqqWbgtRMxZvZQR6WxCn+UvCqZAX1f7Se7;s6*J zf7+!Rrxm!QQpitbCA&_3%0=I@fh`$8eUVU8%Ozu>eoJ=y%@C)@kUC6SXjx~#ekpLK zN?7cjN+MUt4e}*_LB7gzf6hvm+HmGx-#%EvQm+N^3(}*ofh0IyF zz86_PqlD~D(-eg8S%OJfx0npnn3%FRt+ZZlU=yl4aSkAmKp4}o{Ux2h;ivbeF`sH{ z-rongqrm065%?kS8t;9m|5l#&16T0gpZBahw#%ZvgKl;3saoRb8(Wde58viymEZl1 zIL@{?E3waT`91*N0`mA$0w9+qx6G*rwQ{ES&3X7fN5Z5VugcCjJjBnjX@MTe{c_lr zusjtQ%7(cTY^&))L)bSrkYR+DAUo$iaCXks$ksWvrN^NsN{K_q$a|Qaiv9Eh&nM~0 ze*VTQ`zd*(0*4VP{(=Z4n?>krv(}ewVvEmtd>I9d2F3%FQy8h?vhbYI=4t&7AkA^-w}xVTvo^}oM2iNQ)3MWOp4}2 z8@ms1^hx8L_GTwKQ|Nkuo#?MsqDn8g5C-xv36gFzjv|ZsoYIgf-A-VCQkC8U;L^rR0+lW#B@w!K%G)$1&E(-X+KA z{Wuoy@4`LB-kSSbWI{MOG_EA-#yTd%N%nDHGdZ z*xC7q2~E9dkD8RT6e*F8yp$^T(njGH+Ti^vU6^tlF?fH76vW{Dh}r7kDfaG-w!Qm@ z%HCZ~LA1U5PA7a|dvIcwxoPxbm$@ERtj=-Zo3?frV|R`0_Ys^hcK?P(^g)R;D|jbd zWvWPU$UsFZlGwUy0@aW0N}Sal6j(w#mhLJbc29f6Kh4lxbhJr3_qOlRK7I)NJMhjx zm+uLnjpy!kBEo~j#{IfMF5hi{1w0JQCj30y(}6WQZjUzZKj-`Bgv-Mn1e^&R;Jpj4 zOWL@1wQrXWS&WhU*n1ndrJJ{Z*u8nX8b6h~234ch-!M*fYu^r|)8_5YD8gu{Sm>WO zNV~wm{WZ-$uNvy`IorTpjZDw*k%6Fl`*s;72CHGBd-L}1Nh4Jw%712XaR-GK4^ z9tTE?(ExVz;%$jL}fU{9IdPC>~68@XJeIa-o8^=vh{4<-i>{GX8%BxwwvtZ z&!qZ?HgIpeXqf6BMK~wiKejkc77GH|Pic2X)$mwGwKJQNmYHqfev`^9T$!2KQ^)Ba zoH;A4+x%%p-?%*4_I2OzXS{pr%aZTP;zQj#6B(>5;ILT3ztgre%#UP#r)0*$DsA7+N$70x zLk6_>4|LD$-hVn(nQN#KnBCgpsxt4xNvq7`(HGlK@@Y5u5leSDcuWZHSh_F4Kcjk6 z?C*wT_RHm#`MoOZ@GF^FKY5(0MePHN7S)reb(J-kF0VpB@7?USlk9y;x_P?6`wL?5 zzL{|=r6EQQC`LYFpKGW0Ah|i|3EL2RcWJ7z2TAW3gLgRxO$^@Gi^02EPfubgYC6)y z;JrxAzs1CSVp`%E40s}mWAOfM$Kc&t3P~J;_kST)n!&p|G&IBDeI@~9%Kk&jR!E+6 zqp}9@Y%H%+wO=uM|967Wf{Fwy^hJg3-xAEF4z+qMy~s&s^xG#1V_Uw9@J-tp2Vz*M zoP(oc2fov7%ULCR`krbCw(0wQ#{|@-@0kJr+ota#9e${!!*`OV?wq89Qa||$nRzwB zqLrpP<)AQ?IhOBM;-S-!+kt0+hf7?(_kq6PZSp()T8bD>xBITaMS-J-nE3c z<7BEG((Z03C#(ZcoQj?oSOqi#{|3mnQ%URFxHIgq%)OO{%dveQjQqkQOj*aU4M^>g?2fc7&(&G((OIrlSt^kdE*q~F8Ld$uxX!hNnsq z(|0XDb)k%sp}zj7R8@$wfvUJtqdyWy#W&YG*mPkHJ(p%Hl_Bh|s+tt$&5iw4*}wag z&3V$I9U7-B+Iv%IHGyl!S302){ytC1z@GHLZ!z>|a5hKNc>fwogZ=wpv45W-cI*pc zla%?pTqDA%7L&#N{rsf)do>;lVurGQ*Vg$->-U-6S-&^OPIvi^0R7K!`KD682XGhS z=Hd4y%=6nkOJC{9_B}oRnZ$h(cn)}#_%*;4fSpELGPA!@ z>&rz8_N+TTA>G~`J=n9Jcp2vH8%3KnDEM7>t?9%3{ZH7vXPLRd@8*cLySk&AQe*Zm z*6v@E;SHfK-LPK2BgoiR|5jqzS=cuLTVWJ?fC`?2z`ejjfPDKq{-baY0_RhP{kVC! z#Q?;htMqK|-qYyu*yE5#Gz1vDA0!P});Z@Wj_boY;n73Z8>OPLc!xjsF#mC~LQ=Y0 zWfi<$Wfh*Dnbq;+^MEkHW9C1Tlk*!r|G6;Z-BW*B@?Fn=L=u)c4&H;3k9yjJeEd`y z^B&+$;1Dnk7z*ToCPePh-aS3uUc&z#2&ctMPMEsPdycht@2R%3|Ce1`NrU&s=g(EO z^#sld*Or{8q-*PV^VRzwvolK>ynD`59VnKW*>UUZ@??EwSiEQMNpPp_Nst=!)EA~| zY|&aVch}XGtfOy(!b;$7;P2GSX5hCxQ$IcO?esW5C+s5NV!)2~kK4OXvhCf|d8ada zR{xjq9c}Ple7>q9500o7%OS}z>vaD!2Jbc|^JHZMgLfsByzqOeN42u`3QX`Kg-rMy z9LM6FHvea8_9kEza5wN%;AS9Qhb=bm2l0DG`KMNzQcrpYFXNjsVfVjkk8fxbnBt|M zzk>L1j!!jnWr>*7U9tvb3z>ry+G6m|5Enyafi>;BND=Zu9ATlA5VFcTqD|g!P$~>= zma8E*7`qIE@=+PR&q(_y4f0iXdMy&8cXpMg*PgS)_>=#1I@ zDfaFapE7snZay0cnd}^`QO53(erm0hDUPzDh5%TozrYPBYT8p1Ia}Gj z>s^Vj1}eHmD_fzZZbV60y_2AA^=_vbP*(4+nokLhRCek++1IIwdKJj4^U*L9REVlz zkVT9(&!Deq0;-8xjk0(b+%?&_r%>Cx*S5)se!d#x&yr=)XPI6@Wm(J^!pJBWrP%3u zB;C`}(ydYU?kR%US&PkkMm}Qko~j_FMsSvEJO15n)ZCu3RZT&HSE@=1mrErn&4(nr zwp4gWlJs^?V)&j>NHKa(g%W(_bO5Kq>{w#!o)Jsz+*Pa;T}Ns=cSTowrY+lpg=!Fo z(j=MmS}|_ddhl_F(~p&TS{u4QqYT~8*WrU=>~0-w{gj>an+W_2vx}@9ABM--w(pyH zf5x$We>G5_F$Ak6PPHDe{&#k>hNUk<0RTIAP*ZIgP7*bpThB9+tH}+TXzTZcSidK* zepmU^vqBaIAy~iHwu#E+el#HF3*J zb-%HULIsXJRCgo7UB8yDlQe)o=TbEycyYuQDrEq_!<2K(Il{pbIjNNUDf>OtZ0LkRR9ouTwAEjN^%^h(m;IE|KlKS~Jh4P2Ks+G$K2QX(H>Yv`ySO*Z99^96tf>0qz4l6z&t;Er9qR&&J(Z3lUe* zH{IU-<4k+^X~-lQ_U`G8qsW#5H~m8J)&}ou$0$M6Sp7p92c_1+=w_5UNJM(ucb#oE z_MuFGzhj$?z3zk!yds1DRtEo5&1aLI&xq$5JZsFyro?}p^#8T^|6EB54A}eTrxZirY~U!gt;YR3t`GNQK)wn6zS6#Z5a#W3 zTwUzjfApv{P{d|!-~PZ@X`taooc~?+?KhJ4NMH(Z6(B5^3X;F$-mh{(_U)%&-abd} zUFpfb{a61c<<<7>yOi=WIC8uyvlmC~+gtHXH(wX|4(sXvuh_T03!N#_KV#o68%VT$ z`~5uG_U&RGS^|=b+r+fpO1wCZJ!gLSJa8-U1n)865uRTG&gc1K z;CQy}ieGhO-~Itaz`p(W$_dL_dvFZ4uZMXz)=hGWd3&`oZx>}I*C*I^>~fNR@OBsW z?Js5cw`qS2++~F}6_Tefa$y|BX^y!Ihyxn=7o-xyRhHWgSWc_<}iuP1_mi$&qnTwzbiX#W!2T} z2=9(9hb<}RJR}`dRvMSjla+;uYQ!wZQ6}!Yzrw`*w{njul7m>bZ#6$}!uVaR-2?a9 z{<+$uwMtY6V^tG$#eVSfWR_ymxuZyUT*?qPf^1yqf-BtBj2kyU*=_zV_&jx~VaAqMd2iD~*c=L-ZDDSN*z_VDTDb>x9RJ!qF#8^m8b zNef<-wkL!5wOtM3Pj#eFB_KIAb&Dk7G>iCk%|l7s3-kfx`COns;1q+Kdi0Kqao5%5 zj{EMN*`7Vz%~Z$T9pAmv9czaHA@ibaW~v0w63{PPz(eue>Im20B&r4J62hFLk(N`8<7}yul^BJfao5>e z5#pPohix2XkKtZkL8?O}Ro`3^D3PNH7w}L#FPStM5=JGxSsjp^k@RwUf8$7%Y;*(; z_bLy9s>PInEMc_pbCwrn6k!aDjQod6Vl>=BbX|~+gwb$4Z=sIy9BHcQE}W-Q7il^U zrHMZj85O@aGRp2h|Bdo(QKX|aL?@}bC6DH1Dv$e@;Dip2H)VCG*na_=!MKIRzRXWb zNN#kmO|c)zh`PaRZH~Rk6PC_HoiBCCFYDD8^MlaA(*lK|gJ%Y0XIZIz0ic~&(`zE+ zN|KQaVv~qqtb2n`{-qbi`1bqb zd~e}f|Kp_Z^t#Yq*&bJBDlvtIIYeh>gvAg`raX2hA~(TpMJ8@~KMW-(!rXFGtVpfyvH)y1js7$ZWA$X! zb*?t<5o2GH9|z9a+|652S{`nJ1C8LElxY?08Q4CLQbRs+ngvP`S6VrQN2+pgrpqLi zjUu4jzU2^b4wE!URJf!8Bqb@EfJQ@$gi=J**LDzNg!P?@CCvo1HkLgL62+AZk`cIK zu%fgAEYIJ>{x*!i&IG?D_etPwWt-=w1-#l0n5(&_BEkTDYjvy!mo$c@_<{PoU!CjX zjg3>E%^25tHr$7l+)d?DKamk~NWQ8csjp$0+RK$g}>Q$}9DZzQnd4Vbs5N*Whr(@jQn8E1R?*^-(dIgx=08*z~cd3f6)cC0H+_^Uv zR)J)de6<3+tp%O@*#TU-=yK zz^E2Y=HS8NK%a&!fjr1pIL5QeoKUVhPu-sCs5+i>)R!UxMV}U`&8PnrTg8uu4kygw zjTPt3a^0}Wl}K#t<=QySmDOHG26FD#!nW`m^{0dmcN(kz4X?-CXSX#Hcw?_Df@9X} z=4aL6pj7w;O(Ci5am4{Pp$EMFw~X+2_!@pgM{qT=y(#BOsrMTqL)yh4&T4Dz@Q#0* zCmD(EoIhSQoUcQ#e4Q5QELa7@M3}i}IB8j1=>!eMSThm(%-u3kEd} zot!a62p*RC!eN;&wC!Pf+lvj1yV-J39_q-gdq#G{I+q!e!(9I+r4p28T4d(csyn;6 z9z|$cW!*e0I^E@e(Y%h=!loHBf(PA=vr7BcaeHUZ$_noFTy;>+8objNI3v6zz`ecW z0_U~=mJ+TyDEnlL)jw0uQj^9#>P&HBgHB%Pu*+x&@=>c<7q&I!H5EzHqqa1~8?Pxf znyxAB+q4zdLpsJiA4viYf8ux5!K`uA!#7qPe3G1vu(UfmaS;icWrC%#ZpI8QCvK2N z7dq%M8iuL|?#Jw>9^6KQmxt(dxvXhbaLhACxPvsfJ2WyS%bMrqINI8^eeuym(53bS zD6tz}pmQ=Bo|SB87A~l+oEzzzDEtW`6Ei}{Hd785FFMv==(lhNTCYCIG*+o>vsJdf z^lTv>6bn=~%_=n@)|pQE@}+#i+h^o(vE@wPF?lq+Apy;EAw^(Bx5y=tINeFI*ddu! z&~!|K?0r?p6{aJX(K;C~n_JmXnDV6G$cnQ^X>Vj;^DWJq`!ra+O!ouO@kxDd(aVCf5;fa+q4R zSC%%btS3rW<5pWwl|FzQU0o_WtYt!2AQEh$aJA}aL+Qi#R#qjd##s%eVq_=N%}wTL zO6Xm?7RgK^aMVd`3b%zIb@dCatjIQdFXlM0RU0IuHf-_>VwY-k`M`YL{$P2+LY2kN zyG;>FAu@6)Jf1`OU_x_wE0Jk?m)BzXS~_>$l0B3&_Np=}9ntpu+LD$NsE-P%50{e6 zPpCdr_?MLY+af?`C-u7G{zZO}!Bhj@!q?G@BeJrD# zu_wV?n zw^}^D$xg#;iI0$^hR1u^^8-oG6O2|&+O9)Rc0zv8on%;wWH|g7$*`Z640|cbkUgxj zS3}My`tyAD1_E1v?EnR}|D5G>r5MW86Q;lE4Sq>pArC^wrkR|7;hA4Gs-;#)mNGf`$7p7^Cl6OWYjQ0Mu5<~# zR1>2-eW-BNx@ZZSSgGc5{8(`na1X{rwT9Qopxo#eZFA-N?Q@&uOFgj&s+5JHZ**o=#SX}0WXgLCd3jZpu>oj-7A_3U z?o7mbOAo4lFUveRVS3~FMEe=jorP^xOS2LeFC(qQz^uo}V;gz2EiGIUlMKHv8P;>@ zGgnmhO_)enXfYSIH_&0}%bc56P#s$gy%)C2Jl4j^2%pDGr1rhg(LKgppOG(_y)T(X zYCEfAS85dZ_}h$zU+~d?@wMc>d{$L;Wo$GDNh7*~eNLqQz4+*=SPo|=OMy^LpKVR+ zoF19-rhnrt+1AF&>V)}TYytL%)iD=IMyBi`fzx;jZ73R3`<{6@=;e<3a%zMd&o&yN z5BBj;HQy<#m$K?)hj)|gQOZsFdtxtxHnOOq;1wV{rgo2c8VS2eIF)L3GFgvK))Iux zYsZ}YABUxjR>gimf(y~th2Lk+8=o@j4Pk}#UI;Uo`|K8?AA?xS2iYlCWhO{c1MQ^x zRK=$0q|E0>wZu-v8nlhp(IJ)f8qAs2;k1nNY{H&FCf}4ybPIU`+hifAD$*#51g@wP zhKIj2T~l>jS0GoHEv;<`y<(4(LmOF;;6uWPr*<8-a>S2zG?|5Mj0x5h?$2;l8R0!(vi3fHV%evH)BdVWx$>46 zSV+dAOTS3k+#Fw|&l99#P4zt5B5sv8GH`=D+*YvagT$Rw*1_z^#cS~i6s+2o6{KCL zx7Iyg_xh!-N1x(L>=GI=Sm^`sVuOn0&CHK2!@K!;oY)C-yZ0#4eJc%jD^O3LCFtf09|TMCMORU9m-=Y3&Ptxo~0NoT|jd z&7VWdfmxkGoT@-!tcqw069WstIW)(Uh~&lx$DU=juy9mMoT~%fR9aT7lZ_{Mlt;hO zxu|x1K^85?`!c0^hnYLfW3O(`e<=yEX-Gv1)zuC1C7>66vHc1((^Exn2HzI+!=s z!Q|6_KoWPGXX$|N;{~bQZ~zhx3~;i{SD#ge(s*gN@uAj~y_VO?tDGCViR5Wh);D7E zk-m{bp(x`cvnU5`EYOEE`-a9>@`{!%_6p5Rwb3hyxI{E3iGkNLF(Hl6cxhwVW}nb_ zX=FLKAkvk$Ep=Z-H>GiVmS!3EwJedd`709xi&gu4R5)nh>=-9~FynDQD$LnDWl0Be zOY9`w+)TsaJw-&JLr9`dXT5R$s5i!(d=;@4Smz2KUOA=8y7(I2tF7@RQmGpYmSmNK zX%_h=E=lZKB8?l~&12#=P_h$$HMFttGQUcxZrkET36)0bYi&(B5^Yu0qrQCRDk0Fg zzu!dRUFIoK&)=8u6dAqbVOVcsWN1@S>@!G2!(JFDm>N1-TK6)TGxG?Qs*tpt_-FI2 zlS{#}YMsQbwkCuVfdQeF9;jZO*ijwx%c{s3u%M0JRYx0Xx^-`=kc+Kc8L1?s>8?!d zNPYhRMVjId-o!=EN}`E@Bgmk(ZK-!jk+j)30~)L-dXYi`>YZZVva~4nBWd%T`gPds z6MGi4H)S!TWW^^g&5wPJ2N{A0sS8&fDxW;~vjIuNlowBbowha$P zB+58AG9lipI<|~pdPL15Jtz@-5KP)gf3|Qn8|kX3#yW(UKA+~dF8YfcUwDtQw0g0~K_p4$#c1~U7N@I9ncW_DP$9j%8wOD8h;U%try)@|9=TkhE%I+lMY z3E;ES|9W7NHM_vN+2g<2Yx+ZnOV%lz2U}Zrd~#stsR8hv<@TVL1gQ(+L!+1PQT|V8 zY~_=}_h!%}6|XhJ!)cB>MQesPGRF&%<8G_g8>-)*WqSRu8x28nux9Uz7QAFFB(yiO z$P*#{9Dcq0`saAfYnvcf<80$-D^zUc`PS2e^#&_M)^m!cJL2GzH$*)v>Q=0+$SaDU zr2_dNYg(v<9^U^VrP}dPv_avWhj7{%$&FNu?6lCUd5!P^zCR+3O$OXI1;IWy@n&5t z97wUB)^`l|^nxda_spN0*r~s(D0bR;m0tB~mHYI^&@URLN_D#U9-V%f4lvypy#2B) zRMgjcjw+wf3U9)^aXwvPSwUi_@=7d2t?6(qVT-DfTLV=S_h6=zZEaQo%Qi=6_1il) zI=ygiWvrR);Yiwa+e9Df6#g73(`}y6x4ea_cc?x@h)2agGG5BaqQDm2g{(f(r>YqS zTg{826_HAEsnmS5+CfFcJjO7_1&-#@eNgpSjb0x?uWHGLN%U*4juK^Ne$lFg>fQcL zk*Pk38^3I+XGvCx&D5(C14pW4BU1~^{)yXs$=syi@$I2G-b7?VWThvOBZac2`a<3W z3ed&Uo#)P_DOi)dECJpO?r+51FYUQ3+){tgYP+#Tb?1hW(w*rDQ#!7WlzSuPo=}T- zrn!Hq$2zRWvepj`_w5WaRIQB)e9?=-q5Wr6U-ZXW%aGL%MHX}}zs!2B?8Vmhg6K5g zq|o$^M5uAE3>DGlPMnAjmrH~VbV6$O#$ zp2#F`bS4idmOY{Ce_oL_Dlskc)X$~iG)=v%Y4g$6h8F6pan5C?J8y+YwKe+YM+aU$ zwbE;GyhqIz&D78@2vdU$Cc_YG;=9V`!q^74eq>nBbzyA#tt&d27R>N}CX-)lSY)=3 z(ZRTT0cd^M<}$)lcyPbQ3jRHQp5Q>O2R$=F2PZ~mcifh{bmBr>Yq7__*lS+KVbPk+ z4V6yW5uN2ye6Cse+!?|(hQx=3TH$l4j}JCW@zPk`6<$({!1Fjt`%Z7(=oDVN*s9$hEj}En^}#14eyuOE&>OkjBaG#8 zFTehUUbDJsRxg;z0GLSvX41=ZYjLoCfH0F6)7Zq2Xhm~{^5PcX`Us~ao;-iM|~M;`U% zju_ql5s@IQ-4S!Y|Lu4o<*@w2XLk%g+WSSbcc`teAh(MvWTD23auDQZV`Vvcd4PVe9^U&z@3hRR5=KkJ0 zEpxv)*t)lYg!q=2(iv*?SYyCuSD;<^#Ie10R&&Lu#PDtAx9nWVVQIpx&L$g$bhOpkx2*Sv;qraD&r z8PyKA;KZFVq##J2RJ+Z)LnN~3QySGddz8GifwpCqr;mE5l8#z*m!3>$zG&A_Y6z_p@5BeTfyZ@bE(y-`+ zQ#zxhep#n=Yk_r#cYf?fCfaPH>)jH#BXl$osE-!hW}yq@ePPvt=)d?zy)kObsFz25 zIVzFZUb~2N`7&|EbQO0Z3IgI1s%m~LpkA;kylp9`9o^%N9l*o#+!MJBMdLl_+*0Wf zS+cq4p7`puQjYj=5pSk@^m1!_pyazWF+X;yPEuR-)lyjN{aVIFF#Lh%|HvV7I+N!4e&64j`x2+U$3Z< zkV1Qwp$`X20V?l*v%bFZW^&Q``q4Z>GpA0{_4TX4MKt<^Xnv6A79a*VI`(e$^%9!& zoG{1H*Q<2X!hN;A-cEZQSyTYCfGdG(fa`&qfI9)|=6^t6FPT}12l#y$cnsJeK2F{I zGy3`^7onj@3>^2E>Rp4Dl=6zIXtaLM)xAyq4!j7z=a-@qMPy!xawFDDJ+M82D*{A0 zlAYMjnxY@I=`EiwYI~#-eu-}{oyNkd>OU9k<8+K7e%OZcqV?IWgAv;&3Xdh~OA__K zEg$1`&XOJVRPP_?{p+#_ZEbwUi{sz4@Kz%|qXV~m#;j(M=vm4|&%%(N0Ikyntx*XC z3pC$jF5WL{OP}cf239<#3RjL3xmeVhO;ddTwikCyeSvxDnDNuWI56yy3Y<{P^XUK6 z-nYO-S*8EK1A~r;G8q~r+Ei$^UYh&;hBAl+Itl{jm1GnMfrWPzTTu*b!I5%zt+jsb zrmO9`)o#{WOPdu236+(%Eh^ zO8*Tttb7t5{v3fiFg8i>=M|`D^WO-Mf&#T}$cNk%c#0C#$P&B3hI|>kIN=7#8626s zTc)IWkff_&S@I_sYilGpwbq7q47J9&V-mXB*n67x%9`SlaqD)N;=GG08JmlhnEf-sJ>-!;Oc+mSMdt^SmWXoQtAh%Ev@PPq1u@vgGkLkVfzB)u!DTIXOWHKY)^-+ zDS|SpDuo}#%$>qh+2jXW-9Z)Q6LdjFaMLpd=#_*BZsI_KyG|mwnzb=~i7n97F<1zK zV-iQaGItj$Dg5j#BeLkH{82UjHg+yV1D}rbR{25#>*+nGUx9^fwlVAoPlt1%Z-KIT zHm=>)a+`ENa_Oc_KOOg$g-@Qo;kEL^_0Fl8X;PemmSU5|pa& zpNOTln&Negh47?uiGthjmIERp1H&j~6%W&3}#EHLy z0OCm|5!r{-DsycvPJ(YGO}07?=dHG`HDQ4+i-QU*pZQWEj5Hw#0wwm!Tq#zhW{^~m zQ3LBS9CZkP1Lc2?xm(O-&C4Bwa0-BobRTR8uFXgB$^fn_1^M)isT^dpe9GB<3ja{l zG#53+@?a0V5ooAvyS`RlzwdlRAgY!c2LY6rvS!dm4_BQeuT6?#LVmBHge;p0_@@Mu z6qU$cKFwo0w&p>cQ!>2N%0EErN@vhtwBdvONl=`Q%s-pe5sgh{$Lc^s^0}7L^_BHs zqXIdoK%lDuXkt6Znx_{iGnQK%Fh zO#}v2HpNG>(QE*u?MgyVV>iozg8|rZlPQ>gN%Mk7HFTNO+G$A}jStJBb9-u=&s(w#-#z){F|AZz4T(4w~<&ib{_{ zUSp{+-{^-LFfQ3|+2;-%diutW$-zOuV8lj6b@cR&xM}g8`)s8w2;LQ^ePT##_4U); zRj(mqUW=cL+gpL(NQ1`i5dSksDBnLl$kFB=&oM<;y@S#=;yR@iVUWAyRC341EQq$n zmF4K3-pT~SbstRA9qtHoPpvR7;LlU##^YSUe?1Am_$a7HS6FWJ%LDs5!f0n?!D+;n zeGuOt`f|fzei$o#@Pg^VLAT+Tv=q?rPo{MKNGjif3i4+BoZ%EiyEgi{Luc<1TQvyn zbO#5q_IBXO%h%4X7X!lK8yw_5o(qZ-v*wUBT78^Y2e613V&Ro4E*QR8l+4VYja{TJ zXmJqbfNs9R`jjgN!e3Hg;?Bt29})E}Cj8*YVo>7tGDLz9*wBvN;s*mIxSok~iCRy$ zH?!8?rF$*VAka_eLiB~5?Y_^$!uNZH7eTHVSWu1#ic~d@;@3twDG3rpQUXtR^1L0* z$QJZ>00xZ_)NuCf?Mjr7A0)(SVik>@5Aeu&Lw?vo|KuRv`?a0sqnaWp3eiZ%SdqJ_ z>?-pQ3B0<4{5v984md~kmt!C(q*SYyS;hwT^TWemU1o{(pBIh42OJeBBP}g$;{LQl zU2bniS{i0YJ<ejb-;|a%*9$H!93lp8;y{* z2RnwM`9eI-27pB5$WvOp8U=N7Fy2wQb+q<9K$2@ud)y~@m9Cr_r8g2u97IZvk8u|6mV4QO00>e@{~GOwwq0i+BYk_~ zX|(rsi-jLn8|SXv7gZbgu4N$9=q;#xGqg_zadnQWj(+(Br5{$_hYw--UA|5+wyjno;0(JN|{gVmnxV zbFF+1o!6{QugozkxPXI#17j$BYWT6r`Y79xHJ^}_YsmWZ_iF(5ycXX_%Pg9`aDFKYxG7<6iQJUVk1M z8sGs@3cZ&RT)6;@$dP$9YZr73rncfh8Y5~R8b)*K5a>SzM^=Ms*qEwYTDqc*v;q9X zK(Gq0@KX#xP?C7C55c$%c$8<4O4eG6I-^ZSCfGP z9zXfkb#=+9KC!)^DGSM&yY&N-yM5M6Z)NpNo*N(oGbA-d`AstHo;Mw7#=qd7dqxuwsi})gGCOs=I%tA zG@%g1WTpwLVB~INJ_WFfiPMB7bVB=qC7ZqGqMMbzoOu<=Tf|j;d~Fa4%=f{8oxdUls#FO3%7a)BYX)?iVgQp0w*8mB!eIGQ!NNvxB z(i?;T&06*JMgSIe5?IncHrIO(_5;|RoV)>V1Of#l?IVSOa|uk0$?jsX+usUk0^nE4 z>!6K7o7YTY1HJhdahC=zZ?f!HCQpHQn`8HoB5?rbS) zlA|iu{7KIFN8q>0DfXWff*Z+#>3>pmH00bLL3v<$MP)D$asuc+(CBJ86@*tOXGaC* zL|JAl{1M_kk+j(_Bx6_C5h+=~o6srCG+6t>r+ zE9qpfvP{nL;X#jLDosA`u54p0NlYNA%jW5hzUM|nu|aQ;t~G5}q5A{>SpNlw>nFOi z8|v4Nu-KoS0MBUlJ4H#h&NV0V<7z!^UhLW*0S(aZfG(!3FYiKaag>z?$63#r1AImx zwSC!oOX?lb8|e2c0txo;ee2C$4~d;gZ*tlCve=0B3n5_suXnVhO(Ak8WEBveSWx2ViPjKW`vGff=;s=IN#W%bbIJEX^D67W9 zVKMWH+aQP8aCqGraB!3JqvzY+SQi#}Pj`632Wv*u${(O+1=Le*M{3N03u{kSo>!I+ zPN-oyf#!M(IsPk@fMs|cZnxj}Gb(Kil^v?c5ujkh-SCz$#ZO^atSt_1IJ-s}@(iE3 z`pky2<=D_F%Llo4P<0WbBaDy5N_3X$Q_Je3Ot8I$`h2tYWT*~Dj*mg+n3&mYj14b| zlmt?9ofjBJLZ(3HcJc}wns^Ym7;Jwpo%uZ5o}DTU3%nKn7W4#0;rGvJ!{NWCazA(s zF$Y=5GYmia$ugQajPlt*|Mr~^gJw+)^RBT}Mo>BOK+~dz+zNEFaP7M+Ll)I9&yUS& z0F%gS!Nguz8o(pO(xfsOkMRi+kdZLvqFf=^Frkrl9F2KWECRzJOhcpwL7*9cCMV%# z#G#$mxt4j@^xy)EB9LS!MTLm1z#G355|+gf0YOBP6-Xl4PaLeVwum+o(qQs`_6Raq zX%{BYtO{X~x;IL@6y@hql;2{Co;NSJa*|LX`INz=L~dI|D@7iQ#MdGJQC?vof&xj2 zlP{p&USXCL(QAv?Le+{x#8^w+9t8SPiM^4SE>?Pl2`pNMpdu3+uMFY0KnGZrnK`y$ zB=U)_dJIYM!_Tktw+0d*FtWXZDI2Hz`jAB(vbaN*lwdWLvz^k{B;_zOC^{|PNql6$ zJ*mg3C#Sy0sV1ko$LS`gTXF{6DZvWL7|)9DndYu+|aQ;v(a<1s($|la;tb_TJ7Ag zGU-nFbM>};tHw-hPQW{|$HQv(vIKQ1e5aqF+sEOjAD_CB{S5G-#q&v`Ms=#)AV4B3 zmh8=d3z>SM)j9^GNO7n}@C6T%(G!djNlAqSEbx8eKwQ-uCzpemRf=~lV^kLC>X!vJ zd8jy&jEt(Nrahf<4bUcR9bd-oyBAb=#U&ew~!Gk>2n+ z62#Qi0PVJRdC5L3%#0$NB8VhWW2nFa^|dwKNESvF;L-Vchtch?-vfCr&!XOVU&Bvpqepc>gq#O-!aTGri|vD;lfeG z6}s>bs}$XqLvLWQ5T3(;c#W<&)X{L=@i8Xh)V3f5#tH9WFtRg_8V6;8hE#T4@Q-MU zAQv?xIC3WjO~=H_u5bH$ZzFH~I&il?x;OUr79<0wVv8X1j;)HO}pnLrs!=J2kc@NwJ+e8;W931O?{1 zBFdG^0#P0s_{(Zil9cWafrU7TODi9?v6|+J>J)XHyW_YRK!d(qxseTr>P_k~aJoA_ zuVJ;TEN=_?V{FXMM`Z}*Z=xz4(8q4;vpls4J0X#10NUmrMKCm(N%jHGF#lU&8%>H$ z5#&Kw!@5WJ3F(0n@E!atyvC4752KyO&%Kst&b@~@gO8ecsCqD6tU509pT(s$=OJ@xG*Z$Ob<{icMGp-H%mt6iT-(aep6WWuDtd94~+MMm*If z!%GPc(Zl~0!exI6UbwI}{9t8gQ1=RSPJWM9wAS-NAfX!(Z>nnNulqgv8}D$yfTB2l zf4p`zG-+yAU+7TOuKpH}0<7*vAyHBpV>VtzWgO<0RbPWo4 zRVwdeq|jHLzyuHFsvH zxgdB<1v}&W7~kD~E!rP1w*Tth_9rl`PTbc}n{a{3W43R5Y=jQ-V@$h}2~yW!06>ts zB6q@j#G5{eQ9|;V=ql{hF%)RGlpBX29GyVtnPT&6a-&3#+%62y%pDc*q!W`p5NCz$ zsDcZ6^{o`d(rltM!*Ux%j~&%;Zl`}F1SgFKeoSp@_w4+r+SJb3`7-R#C;_|&o%KML zb*-r3FE5F#NFAZ-xCIl10XBKZ_1mdj#2XbnNJ>Kd@ai@C{^hn3WAQ_umR4Fn>XURjVwg{{6x^-tzu07 zXKao2XIFk24l3@6h8U*G4jG;##zt;FG(g3hd;F+SCec+}k+XE4?@KWgUJOLCv-1~; zq{V0xBaVMmB+x-20v(032XR2Of_;j@b2(USltIO~-K9P#|n_ zY_^Evu|^?Znx8PL<=2S_emhqK~n=x&-z8DH&JWC)*;3-c(tZfIa-cjd_;HU4%e zCiz8Po5lp@J80=+(j_iKyb8CQD76#o&CAFfXNc{{cg5Q@&oRE69`ss|sSP(TgvHIM z%Swfi$;>EW7BiK?bY{i~E@s9GCNhnJnmJX%1ZKtyDrQa)VwpKfP%=|3D43}iIA+EP zT}@PsS?FY@T@YYaHoAi=-NJ{=D^d6>Gn0iknVBNI%1nrknVBv;%gij{56oO3(2tJ? zS1u8L#mpSx0cPe3wahFKHZZeTC}$=w_?cNItYGFE!3UG7@LUCuC}fiFb5&$bVOA!c zNnlnI%?L(jg&dC)CNe9@dIS}-61fT^ne`E}Ml$O*vIh54zB|c!hFN!!^*F4M8DZZ* z`ykwiOb-kS3_H;UjRw5LYKzzl8y#TpLp<>3aw#l9PJ#7O;7%5}Qn8(-D^?)P(8$6v zglY=w$v(R3b(9)NiVEcuMfo&K`796%fyO(_C_zbq2c$rk7#I@@jG@4TQs9kZU~DKb zmI9ATfe~V0TqrP(0$Zd&xa?UHV=qKdy9j73Kp*#NgEzf;8_F_T%Wzjq2@uepN`zjk%P@wOf z0qO1u=0L@{S7^%f+XG=%nSTlrjkjjY{Np0q`7!$hr8ObUe=R((vSx?-l~@(AQ;%%- z9}a+JYuG%x{!m+Gy{zHfE5t?cu^Yos7i9AVDu6_-=UxHp#PK_q1rR{_zXjj@l>e*9 z|3y4F)KML(5#}7aR(c!N3j(me(zgIf5+b(nAsi3>_#l5`D=gFzT?V$ zUn=1WGk;x&?77kPiz{1#iyBae#=xjRwE1;31Es{7Px?P1%hl^YCJtczC-mQT$p0EV zQAmDVZuK!ta^2ufb!RPxHY_%NL#?OX3l;gy+$x0OoV6a)6>?V8I4HbhWbXk^WK#rr z5u&z}1&6Srv>39jDwKs&SqPihsLsOYitHC?$J7jy@_8H{Xl)K{8hr0 zH|UQIj@-)@^P2LO4R}A3^gn6Jt&MZx;JH4WB*K<2Aky#&fipG!qqxVLJ zB0EM(a!=s~?2dG2$uEGc&ib#(%nuWOd<--Sei-9=d6TD&3eA-20+pUn>1gp)U{tX~ zB0VI+0d5D=WX=!H5Sm}1@!@IhC=4u&vwegMI%AsA{y=#wJ@piD5O1C)49Bi|9!}EP zbqrF88B3DY+EnFiG~1ggXb_J3#H=PC;tmmt>$~*VF&vT*gyEqX=zZM%3xHKOFIH^ zGtD7VGEkHOq(ojsN|uE&YexrCW1t{A!yL;i+_pFTXE8ZolQnUl%oDSnA~I5IMXq$y z`zTCCY8POkJ=W2hh0Qe!4_Fqedgx7s6F`Pv(A&cJe)Oi2=nXrhgY={#$&V%NqFT98 zBDiKKSrEZBN`kbG(IFz+D@UQw^k!>*p!{gSe~_+-$04m(SlR$eK@zIw5|%IhvJD5S zY8R_RBqvpX3Kl#h z2kIS|^f)bqXboYuR_>Bo^9@u9q}H%~S8r=hVoIgfFz--n+WfId>lGd#GNgTD1MhC~ z9H5raP4ZPUC zrp92r;rzs}5?)4BjJO(43tDiLQ3U)&JU3FU*d`ey@Eat>eH{r~2f&IFwz_M|_hzJJ z3Y)}p-VQpE(NU6zF{gx?ln7{v_iuk}4CxDR0_5jRv!bcAjj?3nqv`vw0@$nv_dpJ^eS z_`7xfuHeX{uxZ@Kn=uW&^gMj4Q`^KN%MGoF?1d&CX-D9^@@jTiSu1)AH+BLW^J;%Z zkpc}~VFdaJr;bB$aJh0EdC1@qXc41V3Yzei{BU-3iStMHIuxe)k0_7YM0J!zEx(57 zf-Oy%8Nw?#cYm1myYE*`>og(!dUuFnVjA-on z;X(lOzQk}y^F4dzVRtYP#H_4k8@P=(gTF90@+T)H*sr696IEgRdor__waB zkHfRf^=uJf6p(_GyL@?;@G%z0z!^GjY9ZmEc-+LV3M_1`_3S}Uw^2{0)@`R9Gh`O$ z-o5F<#Pfm9nM9J6pP#DSe^vBTr@~L$F5v!Ji5rtLzX0Rt1yU#wGY$H?d$LvGAVTKp z-mp;MKRN69n=IgIfz*DnMeRZl)hL zjuen;Q_swHV?2woS`n+(w@W<1$rK*L+7u|uu{oH==V0M+0q!pF_feJWCg3Lm2CW^Q zufU@0!%zkv(GeM#l^p$?JfX6UDdZ$|v_wBQJgM^hbar^t^gaWaW9w zIxMVe_VyAT1V+`$D{AEl6s6M^doh264=TbWxZOQebQCZW>0(keh{u5iNNKFgFD}F@e~ch4nS%jTkRB zPgFGYI|(lbXL|z%67-T-gI86SAC&p8tMwdYlOK5vV_t)$xye%A$X|z-NqISBwV0fg z!Z)O%8|cJ)C(ShNG$V%px=g$z;>VdBMU2B1xW_LO%Y4Yqvvmp7vtk}N> zw1ie7$Wk85t1>ZhvL%sTgMfMktvhJzvVaFGz=4iM)QC};_%NsUM1aQ6IeuCOgatEL z!H5aYO^ZlSHR_E9$tm8fIUu}LhuQ)Acn71rK8SOj)R-C>P_(elQoffToF@E=A_P1K zFyZ2GR(KHOTWESioOowLvjxg$cn%ZI!TI#6A%Pjm(SMdFbfjmn2Z=KSt3iZ+KbyEp zRyADtgo?fJHPZufrA1um;2vf6_ieEU7$a&C0Ok7I&Ame-~ZpY0{xE!2PP8A5U# z=De`i8lwN~8Ge&TDYASdpuzr0IkcH1NzlWBkn`NfuPC{+a~}s^`^gMH)G-})((WR$FdB2{_@NIDeR-&5=xhEn=T2k!MB@+x;;nO^haV~# zZbQ6Pijrs>;;tMrb0Pvp<1KLA2e2t%i#qrIxt7ZJxxnjzBjB%5&Z7PZsht|cyKj;R zG$$Ub7RjK~0xggET@e(YVbhl3Q^A2*H(laG)g^DEX9$5`QST(lTJu-6cn+HG#( zjgaAeWp3qfhNSfi?1bSp5?-zF8U(MS9S<&AEY^AI1*F3dpMNVF-DCvEZNWf6u2;S* z7`TFgD;T(ffh!oef`Ka-xPpNz7`TFg{{a{pfEGX} zK+!JaVgcg;Wj-8bAVR> z9|67uaG%RKCEz;1cz_l#6)+R91W*E~20RRS9Pk&wQ9wK38$iq#NC%*=Y(;@1m*SM zahzvn`i%5>k~zZzAC8-unm+4x&&-f1`prsDNS`rl<^+VV0g#Cj7f+itGu@MwzIf`q zbe5R>64Mj8(!9HUMaw3TGi6$CcF8S>-^VZH#VyS)EG*(xrT)@lUtx|auTbSH<9#KC z*#)ZN>=LvD4wbKv&*N8f@F>kIT&`M{SD06t>&rowJ$~7D7M1YuqBuy=C(qt^@R!OF z{rrV@7Wq+VafxqPUKtmv%hKHJ!sR|ysgLKWw4%bLKB@~VIybvib*FE+zmUo<@%`BE zD@CcQWxj0QU*c1dPhN?yR3)JSZ7SrbFwKKRUi)$OG=Q8^17?AXcc-@N=tYH{q{>ios|t5;Io0LqGi1lAoY7s z-Bf(hz(8tNHqV#j-RbA4?)~E4nOB%yvN}XQ{loGKS7sOF<*3lxCE36=XvV+dPG1S~ z$Sz%7xHPwsI8IuE^$>g7Q^-_Hsu1d>+c^X#&da={vsYE+6`g zaJ$M^P%wE}QOOD>7Dyc}-G8zoXf@pQ28*&%wbq)4pr2qPlsd$z3u`ez4+F#|M(Y; z6O&+217%v$6`+sY(kJ8Sq1#J-Zd{4@2Sr=AF8$kJG;JRD6C5X$a84TV8EAoc>(ero?{#CN>4(GzT zwx5!F1-Tb-TpZW-6l(YF-zYvwc%}Gnk{j{iZgRX6+w?M7+1GXqi23#_=4Ro&Zg;Pn z6^+s^{#cFI4dYx=(1YVTFZ{7!nCkigQR(`Qn9G2GOE?JwE{4Z-+~3}3i1Et2ntPtO za}vdNbFWo=&3qNIFov!E|DyXi!;zDV-1z@E8DtLzk1cM!{_W`C^{uR$?v&n2h&|Hl zu7LFd8s5`0!R!0jgM(TB3~X#~a)}zmQbYe;-xChK|Nh?+&__S|u0X!)kR3r#ic41M zWArQbR>+IWB%k{4q2HfKHNHIkUI>E1UKmC3`p_>8y&$kHeV|{QIyi#i_&pu^P6u6M zgKwj%Cm$txef7wrmWthPgCN>P`aSYf3%95qxIHP-@9CFq9JjA0{+p-ox76=$fcu0< zzYR@}3a)~}MS5*G=2*h9@LspO*Bxwl8}Z3K@Du4bI2fp82ovcyXj|;+q1NzV__kL> z`n?c57X9*tpz8uo?7r^{UQdy>0WJiceQ4(TWxcc%Too2Bj~Fx9<9U+ z^S$4QtGSq77uiPQ$@9y9>^ENimH%*uv-kUNWE|U@>bq^%hF>>2Zp>JYyIys}jW@-Q z8`%Ew1KNM{|7Y!IOXPge$?KeQ^DCUP{%KCR;2TU|Pcvn*`rqU1|8Y*a8>ScLX35?L zlY0WV0{na6d(;(t|FiUsXO{+kSLplyAbtP0@O_28f5`k@--`MELvjA@N6Y_@=5I{l zKkysX8*fzHb#Yi4=)1(aL0*^h4@K_@?}vlSIR2UW`(KCee+_;2BJuld|1hPSLX4{V4dUsJ@Eanq4V#X zy?ev|-_7Iy$MF5%;tT&Z`^;W^exL0>9pC>s^c|YVy|-d+o`AVI7W1?j^R@vme3&q| zJK=U={st7g@kYEA@8-|N9PfY~?lubmbGYhLX&&!8b6uIo`(mS?{oe!M|2cHN(uWgK z91Qn8+r=Sn&$;tzUn$NPadwwBYqHsFuuRr)+}yOu32D=2%%F~&o1Qe84iL%I7(?b% zoc4w6Da=m7d-AKeL)6a>xi8G`@BYhzUib9HGG!Kk(uLw5%$6yq6_t3(@_4U!63%fe zN^w-}^G(SqDCmiIduji4^ZmF%BGn-e_N0Q+B&6YBruq1c>;gZtPw!(-C@3geN@d># zT?Su)PRj})4}77#tgCv<*;|gW59kSBi#LJ+C4T5WtiY)=JHzL=VGyULr_4%A6Me|Z zrOlW*y^oVioRyj|V`i_<9HUxm85TKNm7a^k`RroxWSP$DCG86oqVhAf06rH7&N%MJ zIk(iibRbW@sd-CFib{)?@v12^J?W}BV!a~0qDI2fA{-en9WPqXEJDvRB}U zxkQCSWFJoL={%Y#3`}8dpgNkVj{d^zI}3bt(hn^UI^KpNi7MBZUCg3!6wgHQ=wRE2 z6Z+-3P)C5W3(LEpXjNXHge?EwbjHi3E9G;(Bb|ZL6_b9)%DfWZj}!N0IA&+c4okBO z3VQ0Vzij@Cp@#vgyA|j8FmQU0Cic`z!}_MT-9^xZQ30W)MZiOjZ)M)nK5-=+^(crC zW_o)X=i5fLhT*4=63GgG0rY2bOMKZmDv;$}1LI#FFH)kMY(5*+9Ts^J0g*mTuNn-| zi9{IGflzE%0Syf3Frdw(rvWM}^p_F>S7ooB@~@;FHN)X0X~I{CUMngjtqQaO_)#+) zUNUZW$#SMeQyS`1wU+vHSwRs<35qYpMR`!Mp``H1@#Tnp*gG^b@>uJpO`O<+hm^cK zOQ3{8<2n+9HH01yjprL8BQX&zhnkaBh43j;rf~LR(L+UATtFAoo^fIh?HLTyN-!)y zcWI(pPC{W$T5(?CG$?OC-G+TMzXaFIl*8~sD0zhDn_KP`-72pCUoNz{#J~Rjmv$xN z0OPy;3zo=Xrf|xJTCe7bg2*f1&g$;6o-Ic=jB3j<`Bzldiq0N-M@dD zH_4P(M5MJTGp{hGXjK|Czi5qx|6C}x&AKxm-9Dpt_Dn!~5SEf%$|taS+gnuZFJ^wC zTg-+_h2B^8a^KXVvINeLjQXxfL?1W&Or{(MKz2R#`vcs`$<`Gstfi&opM!6bDixoK zEUWQxsj0W-5&((5r9MfOikn%qvd2DaDPKeyR%yOsKIEC;U+ymj;ojyi zV0qkzd5iK&C@#q>fSHeiKX{4l=g8<5}B#+tBbD`EH`DOZY3Vo6z9h!aQomvET1}V~@8^uiM@F6XSbR6Py zh(~cKoU;9o{w|&`Li5Um0W;3UG0Ep&Ftc#$d;VnH5Bm$v3}oKZ=PwM;VE&N5P^J)0hKRUwRr- zTt8&Llqn+sA$Q(?$&@PqwAL(p2v1rA$gY1_rZfZk@<9pEY+eTKS{2rg655-HTG!x; zbD$2+^rBbg<}J--{-kN_$9e*tSa6>b_jGe(-R!p_mpNY^A)Tn zUK`wKP+o?@cP}fOGbNIn+P`+8O5Gri0jyo5GVKSO2GwJ> zZNnBSqzAn;8>{bkH7N2j4FUuGLmPxFF54h5uNOB66`w2VY4_B8S$19lZF%~%j{58M zM`X&k09fy^>|yo8B8asROCnZRc0{%BldUQqkiTILIC^>%Kl*23eA!m>2{iN5=NOvlB_qux`!SbJSpCl?Q z8M{a((tyB`>~nmg0AmnyiFT(9eC9Mi^!f|=bheqC0c~*w^DSDj0wX2`I`9eHG4ja} zMMEBNn~^M!L|l|8DO$}bm}?sLqNJ|BGCV`vQM1DD2Ip9S5k6pt!%YuM@nx^P$eX*L z^U#?ng=gfu2ex`uKQ z>mhCGo~C@#_#Dv_O4j5~$}8}tuP*j+Pl=(pJK-;;jRE+3@)6rZv1Vc?i5C40e5=pr z>D>*d;nqaq^3nt@mEvC_K%15Tf*NyOB zhOsJpeI-mRhHE&i>w%uXQeNqKOYf3s!A5Rr6iPIRVOY;fT#dU(E7Bn?Oekg40UNhE zgcC%jwUgss=#9&8aJy&DOixPR{b1iYuUo7`bv5;u*tO@gv7WZW77_uY=;p4`nG zcMv+Uoun6g4fIIyG-*9%^d(nw+-97~6$9K94s-Wt=>H>ZH|z&tDowDDLz?>$4)6ks z4af&+>md_f0$pS^zzf(0s0XwGI!6GIUWK@u;a0+}f>{hxN#(-a25*dh0NW@}#8boUtVVh8Q=?68xHqE>+W@-(WN(W>_;}O}ZHWecZUkrn z(*Rk3Re()^t$^PGUIM%WI0cC8ka42{QvgYTI{-z1`v4CEb^-nj*atWS_yq7ZV8{vF zSp-Y~SO95&#elm34+5S9yaM)0U3Z&z$U;GfJQ(&VDL#9cN4$`xC6ig zwgR34yaDI{M1CdX#sQK5Ie-m-2LMk1{sK4vfMkUWcHpmbzk{imI zxhQTJE=>&Q9Gs1_bJ3iVy9($h)p8^5ZH(kbfpB8EYq{&V(YQe}h8xRW&#AZ@xEpbU zF`gU8jpuHLjOrHdN8Chi5@*71bxq-J<1|J{Zv|WLs4Uo1v)QqT>JwW78zjA=FN=>w7Y!%?X278qh)ZorD5R$w5o;Pr!zJPCfM~QJ;uOSJl87h+ z!@whfItKVAiuC!NzI1UEYaX>7#U~am<+1o&qLLo*>fq%=29)9nUCESk_7vuPN81qk z9Yq)BNTpv?Mh>wb?1bi06=S36QUU#j+Z^Arf%#r0JfUQH2vOfv?#v>r<3K9AAUhyy zgfWrpC29q7$zIVr17IkG3X_&%_{=CQm+ux9eCdv1LEnWUX+szyk^vQ)TUbm}pj7Kipo)amGzvlp z%34uyQ7pcwxX%DYiXF8=wco0OWwqJEAP1az8uEti$xau+swBG{_F}S=rO#J|y4C|40S5rP z0XqR_0NsGChu{Y62GjxS0S5rZjgYrA!T%-Xc~AuN>yo~}{FVsK&7wP} z6nku`d|K`43z?#;*ZqC|mkYmKK9`Fh@(-Dz^#2Yf$v5b$phNl}@I`=~#4k0lZw&0A z?tZY3y%u)d)MMX$ee7VHd;B-|vHz@({pWq`zvyEpS|i%S6A0ke!0Q9Nc)XR$iHAwo zx4Ql+Q&QLxm_!45n8ZTMVS+{G+K$SI?dJBtq>FcJU|tI|9p-f~<6wgI=h}~89KhTQ z6K&*TVN$sYm~=4Hby%jn8>Rr0eqOR2CMka$g-Lx3wwu+D>PYn_lkh}k0)OB#IgZ8@ z)tTB91)z42Nq%HfJ1C5B9SWm-DJ_}N0LquzNq*8+0sN}ye}m*t+Z2kIAi1YWZZAwq zGe`1IlT2*%SpM^1QrQKP{|cBYKrw)DQv#s6Qah+V6#%O9dda*8CWTi5D7*?l^+aET zL*}?&OYZG3seU^FRNn6Z6z|Ufs^41x3V#&TCO^Nq}bX~=Kj7pliV|Nqf_z6<{=Mewx-?abc zI_|UI2*1I_(g9yj{%g0h6tgjKXTQJbeHFL({rvZ}17d^jkFlAg0Wkn2APS%W$N?On8^46p1vmrf z1PFjuz)`>f0L5>FxfiepunVvaumw;Jr~*^~c)$`sI$#JUs}QZzIJoCSnQ{u6Q-?9K z`P=V@b<#&;DwIzMVdSQ~LjDz)P{`hi7nCWE7w>cYGoLr{pG&Vg4?F;9O$^mzpnWU? zY=Aoev@ZM-@GRgc;56VWG)N7Y30MK3^pwU5pm}u_;6cD1z!AXT0feYq0jYojz?JU` z2CiV>3I?uV;QuoWfRm(sK%4QD(P*-n+@_J%IO`f4r{W+p2LE6jV@fmMVXn4rvTn9+ zv2L|KV%=t)Wy`R2Lntk`E9_BrPA$g$#Pl0;gE`Z(%kq>Z+#YG)>#BD(x|&@FTnAl8 zT`jIw7cz9?j2Ol*)DNrO`b2%QK1J`wnkgC?SSo|?WnEA)@p0Bwc7;S z30uAWv^~-JBBjMT9}nYo^@r-?>aW!@%`nZinsJ)dnhlywnj*t9hIg%81$Yd^@o7(J zd0m-qjjlphrK{F$(rwml(QVZ|qT8n1soSM{Qny>TM^~rYtE<;F>Y8;2bO&`ubuGG9 zU7N05C+JS-I(27sUAk@v-Q{|PK1#3D$LM4Aae9?LUOz!UNw3!H^=7?Ye=$aK^tt*1 zeX*X`m+9B&Uowm^rW@xQw;5-e)|yUPVyvUBtE>U*3F~R=H`YO}X|B6nue!L+;9Ia} ztJJg98R{bS&(x2ox2bokcd4ILcd5fP$(lPf*_z*Kc56P@oY9Qesn>tMs%@*?v zbHMzN`S<1y^Lg|2mhqNpmNd&!OR41n%QnkSP|%Z>-IhI;I?Eud(wb;pYAv_cSa(?8 zw1(Tp*lw{+v#qe*Z+p=8TlBKn$K&m4`z(8geTjXQ{XY9{d!2o+z24qvZ?=zes2mxN zC5{IjI~|`pIvp|2(N3*1)#-DtbpF)2)%knpo6Z(ztFz77?i8FSoSn`y&P3NzSGlXk zwZru$(aJW^8Str4$EzLcOm(69m+BVvIrUYVc#Tt2q)z6RsQX4YNuL3V@7upm>Hnf{)SuBS z3{eK9A;u7Eh%=NMerouo;YEXB7!Ry2GZq_vY5cYE3FFJa>?z~7#u!rqu)JJ?r{9V@v!3+ z$7_yON1LPFAvjI|r)L~pj&29%lsgs9c;^J?d%)&TUH1|0c4OQEcj@Z+Y8CJ`K{H9C z*620qnk>x%%@R$HCRbCSDb{S(Y|(7hJfhjA*$GT?y20N&zOKdSsnfr#FE!k4s59&} z)EgQN&4vSp6NXO18AF$$+rSy+MukL=<4lu)myb+a&5xM30T;W>Pnvg|4+0x4=2ml? zx!o*a=2~QlwvMviXnWuGu`L2K+X;K8{fxcK-ra+PNe;C`?=U;;4mW5j$C2wOa1=Xu zN10=dqry?;sCH~}YzC$6ay;qS?bzd}bL@50I~pC=JI6a4oUc2}T~#iw9x?;qaGUy`Vp#?*s*P>AUruL2l?vNh-s9!<~k~#^J^T#)HPA#uj6%vCY_Sl$#W$ zD3j6@V~RD!nS7=K(9T$Mqq*69K*CQK=!LV$EecDNMQOss86Un)o0Xcn9(?` zT&vJVX_eX-t%$8s%xdwv3A#x-wN9@y>+CwW?jhY){UiEq`kne+`X}|f^?N`=$APm6 zhDn&$^oCy9x-h*?KJH&J&9RskEzbI!~D2;uw}SKWr?>;uuQV3EnZ8y zg;s=vwbBZJRSV5l-w8#Wm>8@3p>8XhrhL;ZFco;2(Rr5`lZVIFwR z_?ht*liFl8Wth&IzBQdNcbd%@`^nh*7EvN}cWWxZRbUZbv1SE;Mjr`YN=R+F#!vF0b5 zUurgK<8(La=IR#c@^zJ$=(iSqtG-R5`ra8+Wr#O~dedyM8@z^eLzZEIVTmEfkPCbk z8x9-ZGkj_Y8m1d(8ncW$jE@`lU_>ke?cal5Ut_K?SDCBLo6MWdTg)_H>^0Z-8xJ&J z^p1xZi-=pdCDD>>Nnup+j^#Y4;9^|%=S{}i$JuYS-)^T7^RWFnyUG#onBWM_Fd}wC zGt2?U5yyv)^A3yC?Yzyo%-QH{b{=pZbRNap)#dDVaxS?`;fiu8UB#|dY-GteIq)5h z5f!73RmZ7SSiK1Q&#UXzxbLJnsC`%auDp5CY>;Z)_u1z(U@#ZF?z8=@y0Ua8e@gA%2;jOWZZ1rV%%!nYpgdm z8k^bNqXVtRm}AXxW|cV}>(nH(+N?MK!u+tAx0G4dSSl=4mTJo;%VrB_J!);Swp!b) z?N$L?PN(&Z)niNP;q@$bw|$aR?bJKXPCGD@=uCE|IK9pzuJ>tffe^zC986Q+rp{6? zP%mL~O0{~E`XPDYQZ!!8X$`H^q1p6#ZM`;Kmj#+zqRY|c>Kb%0`q5aa7xwUA z75XZDwSJR+GjK(7Nu7SL{`VMnoAYkxdguMlUCvln zoJ-}3cTI3ja;aTjSGp_9wZOH+mE+0<&OUa1MR-#|Uj=wmsOJJ}`RYn_xn>mj8m~4} z>(j2)ZnkVOU^X3hH^tSY}#d zsxVcVs!f|r;+$M(+H0yeHJX}D2f*iu`0X}v<`8~~j?8Aexfj1p=Hr%5OD`6;vi-|W z>n`h)*4@@U);jB6YrQqvHp&)nbJ*^-tp{JZ%ciu)*kkQ+c9lKeKEa-BPqBOL>Gmx9 z0$}+?aFvJc9rhnNG!7T$z&$-{eDeTqDBGFqJn8(}85)@}u2_ck$6Zgmm_QCVzEORP zx=HhvW|elccBl45?YCOFZiH?k_87m=ZP)!pH*l@mtFH%-*sMRGKd3(n?DfuoF^peS z8Qg|ML$V`LC%-mIIV+o5}0H&{QM@y9g7Q!8mk z|Hkm3(Pqjq{mf(oPy1ikeGau|+DdF)wnY0~_Hz3R_E+sUfM=WKxXV%E*x{hfQ53pvJ!+f&3w>4(K8In~ zQ)%2~d=mSdJ;n*xJ5M*wk~r}VrYB6V_0TBI0fOm-$=E}ie>6W2-tz;A^BiK)S$q-? z-a7*x298@TZI*V6+B(&GA9ml{t?yW)K&2J7L$-HqU)XL0b!zQ1L6<)JR{P`j-QZSl zaabKw9k)9cqP45g+Fg!k9LF5rIKsf2yPZkSOlP(8H_qpslU(_()vgCzzjpo3^%{2Q z$6RM=-B=>yTG1~<)FZKGj8jiir>PgK^VC09|3tlB9Z>%qoY;Q#VeEhYft}=N&18*E zW7piS`BW3Gy;^%Mc+|<@Xsp_)*aM|$=W8DZpY=!3>zkm|&-8!Sf2)r++-R6=&>74I zCq{j)q0q3}u-0%dc$^2p-#m@g<|XhphcTOeXy`DUGmJEj$Bxp0J+IB0fI0C^tHN=$ zV>CwJy;%D?o#&iEX@nVE^UTE5N7Srk$lN)s}0kFjimIzOFq4$~>n1QhQ2! zUK`XZbtAER9;b8Z?$zC=dl=Gzr?Iv+;Wybjb!T-lQ0_RrM*pb3Nk7q`HLSw^`60uj zti7)r-e&D>$6opr+8i`Q7^93=8AlmMV^2Na_#><;dZX1i)tGHuZY(kW1bgeh7~eKt zWxB?6lj$zgk4--}{lWB!>A2||(*(2DoM|osx7uR<+-$ZuF(y`6?zj93d+JXtUs=Xm zHCBuDc54Raz_qqtf{p|me#j8=9JzhI{Z6bOciVqqf7Jej{Tcg5cC{nPagXEYj$b<- zbG+mD#BtnF;`|i*b*@t`t^#_S!0Ax+Sj=R0wGWiC6Ff$X`b+g$^&rjl8m-0x z?mQ11-B!(Gny0W=-lu8O9MrsvJ`Ed=kp&GtvgonE!Q z4O!D?wv)DRY-+5^Zu?w&k-ZutbEo}?z1{w~^DC?d5w1vAjBB*(Cf6-4jmzY6VqTo( z%ET(X8WM-?u4i0t(EPYr#x=tjjNP(Hlcbrgc}Vl9h9om3x^ht0Ls%PL)xE3x1d^qo z?kdQVrsysD+rgzsR?_5HZu);)BWKa={ZYtEtuco^?mui=<0DVgaNPyrxXEMpL1w>X`*XvWZ>N9=%Sp zS5uEQs#$XYwA`v~)3$2`$O${OXS7{dIXInMr_e>|l)4yQtS%1oLi~W8Xh^14F@T@! z-J6DZ?9P7jj3}eBN809w6`ueOLTm`AFZM{r)~gUmcWjxiG%J&)Ogr;n-eZg>@ziQjp!+z2Mvr zfL9<{hRU=Xdp5hpjosKL*Ji8&+g!U`PrCMC&O-ie_-z;%IgmZ=(bQ?WNg=vZ#_2&X za<*T(9BuTu$&=8r28YtxPu2rS68xwOpgnL}`?o7)|U&YmHsw z?%9o`OLDOkT{`w4Il2NJ54m#{_`xlZH}8b3c@N~wjgT=Pg?xD{lLhQCoH2Eo`tre{ zeMax@sy|np-cK?}{9T!O%|-j(ZIF=dx#aHmgn1jJwA58szAG5Gf`Ka-xPpNz7`TFg I|9KerUr!tnPyhe` diff --git a/reactos/subsys/system/explorer/notifyhook/notifyhook.dsp b/reactos/subsys/system/explorer/notifyhook/notifyhook.dsp index 2c1b2bf9938..0eaac0450de 100644 --- a/reactos/subsys/system/explorer/notifyhook/notifyhook.dsp +++ b/reactos/subsys/system/explorer/notifyhook/notifyhook.dsp @@ -4,7 +4,7 @@ # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 -CFG=notifyhook - Win32 Debug +CFG=notifyhook - Win32 !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE @@ -13,12 +13,13 @@ CFG=notifyhook - Win32 Debug !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 "notifyhook.mak" CFG="notifyhook - Win32 Debug" +!MESSAGE NMAKE /f "notifyhook.mak" CFG="notifyhook - Win32" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "notifyhook - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "notifyhook - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "notifyhook - Win32" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project @@ -60,8 +61,8 @@ LINK32=link.exe # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "shellhook___Win32_Debug" -# PROP BASE Intermediate_Dir "shellhook___Win32_Debug" +# PROP BASE Output_Dir "Win32" +# PROP BASE Intermediate_Dir "Win32" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 @@ -83,12 +84,42 @@ LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 user32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +!ELSEIF "$(CFG)" == "notifyhook - Win32" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "notifyhook___Win32_Win32" +# PROP BASE Intermediate_Dir "notifyhook___Win32_Win32" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "notifyhook___Win32_Win32" +# PROP Intermediate_Dir "notifyhook___Win32_Win32" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_NOTIFYHOOK_IMPL" /FR /FD /GZ /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_NOTIFYHOOK_IMPL" /FR /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 user32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept + !ENDIF # Begin Target # Name "notifyhook - Win32 Release" # Name "notifyhook - Win32 Debug" +# Name "notifyhook - Win32" # Begin Source File SOURCE=.\notifyhook.c From ac6bc94f0fc646557ba094289fa1b8302966891a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Wed, 24 Mar 2004 08:56:52 +0000 Subject: [PATCH 0627/1463] Fix filling of MENUITEMINFO in InsertMenu() svn path=/trunk/; revision=8859 --- reactos/lib/user32/windows/menu.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/reactos/lib/user32/windows/menu.c b/reactos/lib/user32/windows/menu.c index 21fccd6afe6..e54f7aa5684 100644 --- a/reactos/lib/user32/windows/menu.c +++ b/reactos/lib/user32/windows/menu.c @@ -21,7 +21,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: menu.c,v 1.56 2004/03/15 23:49:29 gvg Exp $ +/* $Id: menu.c,v 1.57 2004/03/24 08:56:52 gvg Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/menu.c @@ -3888,10 +3888,20 @@ InsertMenuA( if(uFlags & MF_BITMAP) { mii.fType |= MFT_BITMAP; + mii.fMask |= MIIM_BITMAP; + mii.hbmpItem = (HBITMAP) lpNewItem; } else if(uFlags & MF_OWNERDRAW) { mii.fType |= MFT_OWNERDRAW; + mii.fMask |= MIIM_DATA; + mii.dwItemData = (DWORD) lpNewItem; + } + else + { + mii.fMask |= MIIM_TYPE; + mii.dwTypeData = (LPSTR)lpNewItem; + mii.cch = (NULL == lpNewItem ? 0 : strlen(lpNewItem)); } if(uFlags & MF_RIGHTJUSTIFY) @@ -3915,9 +3925,9 @@ InsertMenuA( mii.fState |= MFS_GRAYED; } - mii.dwTypeData = (LPSTR)lpNewItem; if(uFlags & MF_POPUP) { + mii.fType |= MF_POPUP; mii.fMask |= MIIM_SUBMENU; mii.hSubMenu = (HMENU)uIDNewItem; } @@ -4048,10 +4058,20 @@ InsertMenuW( if(uFlags & MF_BITMAP) { mii.fType |= MFT_BITMAP; + mii.fMask |= MIIM_BITMAP; + mii.hbmpItem = (HBITMAP) lpNewItem; } else if(uFlags & MF_OWNERDRAW) { mii.fType |= MFT_OWNERDRAW; + mii.fMask |= MIIM_DATA; + mii.dwItemData = (DWORD) lpNewItem; + } + else + { + mii.fMask |= MIIM_TYPE; + mii.dwTypeData = (LPWSTR)lpNewItem; + mii.cch = (NULL == lpNewItem ? 0 : wcslen(lpNewItem)); } if(uFlags & MF_RIGHTJUSTIFY) @@ -4075,8 +4095,6 @@ InsertMenuW( mii.fState |= MFS_GRAYED; } - mii.dwTypeData = (LPWSTR)lpNewItem; - mii.cch = (NULL == lpNewItem ? 0 : wcslen(lpNewItem)); if(uFlags & MF_POPUP) { mii.fType |= MF_POPUP; From fdbc91f5b559493dec9b5e538f19c8cc95c9bbaf Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Wed, 24 Mar 2004 09:39:37 +0000 Subject: [PATCH 0628/1463] integration of expat with ROS build system svn path=/trunk/; revision=8860 --- reactos/baseaddress.cfg | 1 + reactos/lib/expat/Makefile | 55 +++++++++++++------------------------- 2 files changed, 19 insertions(+), 37 deletions(-) diff --git a/reactos/baseaddress.cfg b/reactos/baseaddress.cfg index d4002dc21a0..581caefe622 100644 --- a/reactos/baseaddress.cfg +++ b/reactos/baseaddress.cfg @@ -8,6 +8,7 @@ lib/comctl32 TARGET_BASE=0x76160000 lib/comdlg32 TARGET_BASE=0x76200000 lib/cabinet TARGET_BASE=0x75120000 lib/crtdll TARGET_BASE=0x77630000 +lib/expat TARGET_BASE=0x79000000 lib/fmifs TARGET_BASE=0x76df0000 lib/gdi32 TARGET_BASE=0x77ed0000 lib/imagehlp TARGET_BASE=0x76c90000 diff --git a/reactos/lib/expat/Makefile b/reactos/lib/expat/Makefile index 9db75454e81..c7c0db74b21 100644 --- a/reactos/lib/expat/Makefile +++ b/reactos/lib/expat/Makefile @@ -1,48 +1,29 @@ -# -# MinGW Makefile for expat -# -# Martin Fuchs, 24.03.2003 -# +# $Id: Makefile,v 1.2 2004/03/24 09:39:37 mf Exp $ PATH_TO_TOP = ../.. -TOOLS_PATH = $(PATH_TO_TOP)/tools -CC = gcc -LINK = gcc +TARGET_NAME = libexpat -CFLAGS = -O2 -Wall -Wmissing-prototypes -Wstrict-prototypes -fexceptions -DWIN32 -DHAVE_EXPAT_CONFIG_H -LFLAGS = -shared +TARGET_TYPE = dynlink +TARGET_BASE = 0x79000000 +TARGET_NORC = yes +TARGET_DEFONLY = yes +TARGET_DEFNAME = lib/libexpat -ifdef DEBUG -CFLAGS += -g -LFLAGS += -g -else -CFLAGS += -Os -LFLAGS += -s -endif +TARGET_CFLAGS = -D__USE_W32API -DHAVE_EXPAT_CONFIG_H -O2 -Wall -Wmissing-prototypes -Wstrict-prototypes -fexceptions +TARGET_LFLAGS = -nostartfiles -VPATH = lib +LIB_OBJECTS = \ + lib/xmlparse.o \ + lib/xmlrole.o \ + lib/xmltok.o -DLL_SUFIX = .dll +TARGET_OBJECTS = $(LIB_OBJECTS) -LIBRARY = libexpat$(DLL_SUFIX) +DEP_OBJECTS = $(TARGET_OBJECTS) -LIB_OBJS = \ - xmlparse.o \ - xmlrole.o \ - xmltok.o +include $(PATH_TO_TOP)/rules.mak -all: $(LIBRARY) +include $(TOOLS_PATH)/helper.mk -$(LIBRARY): $(LIB_OBJS) libexpat.def - $(LINK) $(LFLAGS) -o $@ $^ - -clean: - $(TOOLS_PATH)/rdel $(LIBRARY) $(LIB_OBJS) - -implib: - -install: - -$(TOOLS_PATH)/rcopy $(LIBRARY) $(INSTALL_DIR)/system32/$(LIBRARY) - -bootcd: +include $(TOOLS_PATH)/depend.mk From 7bd2a160e64f25c3ca698ff0b0a4dba149a1f0cf Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Wed, 24 Mar 2004 10:34:21 +0000 Subject: [PATCH 0629/1463] use libexpat.a svn path=/trunk/; revision=8861 --- reactos/subsys/system/explorer/Jamfile | 2 +- reactos/subsys/system/explorer/Makefile | 6 +++--- reactos/subsys/system/explorer/Makefile.MinGW | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/reactos/subsys/system/explorer/Jamfile b/reactos/subsys/system/explorer/Jamfile index 42aafe75256..2c1c84316d8 100644 --- a/reactos/subsys/system/explorer/Jamfile +++ b/reactos/subsys/system/explorer/Jamfile @@ -51,7 +51,7 @@ exe explorer : uuid wsock32 oleaut32 + libexpat notifyhook.dll - libexpat.dll ; diff --git a/reactos/subsys/system/explorer/Makefile b/reactos/subsys/system/explorer/Makefile index 172c1119dda..79bf63e82ec 100644 --- a/reactos/subsys/system/explorer/Makefile +++ b/reactos/subsys/system/explorer/Makefile @@ -104,7 +104,7 @@ OBJECTS = \ i386-stub-win32.o \ xmlstorage.o -LIBS = gdi32 comctl32 ole32 uuid +LIBS = gdi32 comctl32 ole32 uuid expat DELAYIMPORTS = oleaut32 wsock32 .PHONY: all depends implib clean install dist bootcd depends @@ -129,8 +129,8 @@ ever: buildno.h: ../../../include/reactos/buildno.h $(CD_PREFIX)updatebuildno -$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) notifyhook.dll ..\..\..\lib\expat\libexpat.dll - $(LINK) $(LFLAGS) -o $@ $^ $(addprefix -l,$(LIBS)) $(addprefix -l,$(DELAYIMPORTS)) +$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) notifyhook.dll + $(LINK) $(LFLAGS) -o $@ $^ $(addprefix -l,$(LIBS)) $(addprefix -l,$(DELAYIMPORTS)) -L$(PATH_TO_TOP)/dk/w32/lib explorer$(RES_SUFFIX): $(PROGRAM)_intres.rc res/*.bmp res/*.ico $(RC) $(RCFLAGS) -o $@ $(PROGRAM)_intres.rc diff --git a/reactos/subsys/system/explorer/Makefile.MinGW b/reactos/subsys/system/explorer/Makefile.MinGW index 4eb220c29d3..8a0ac4bdc84 100644 --- a/reactos/subsys/system/explorer/Makefile.MinGW +++ b/reactos/subsys/system/explorer/Makefile.MinGW @@ -73,12 +73,12 @@ OBJECTS = \ i386-stub-win32.o \ xmlstorage.o -LIBS = gdi32 comctl32 ole32 uuid +LIBS = gdi32 comctl32 ole32 uuid libexpat DELAYIMPORTS = oleaut32 wsock32 all: $(TARGET) -$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) notifyhook.dll libexpat.dll +$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) notifyhook.dll $(LINK) $(LFLAGS) -o $@ $^ $(addprefix -l,$(LIBS)) $(addprefix -l,$(DELAYIMPORTS)) explorer$(RES_SUFFIX): $(PROGRAM)_intres.rc res/*.bmp res/*.ico From 9915a75ce629d3603dfb7933c0edcb0ee210865e Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Wed, 24 Mar 2004 16:00:01 +0000 Subject: [PATCH 0630/1463] - Set user-specific environment variables. - Append 'PATH' environment variable if it already exists. svn path=/trunk/; revision=8862 --- reactos/lib/userenv/environment.c | 215 +++++++++++++++++++++++++++++- 1 file changed, 212 insertions(+), 3 deletions(-) diff --git a/reactos/lib/userenv/environment.c b/reactos/lib/userenv/environment.c index 372aa5c3bcb..e77be56f261 100644 --- a/reactos/lib/userenv/environment.c +++ b/reactos/lib/userenv/environment.c @@ -1,4 +1,4 @@ -/* $Id: environment.c,v 1.1 2004/03/19 12:40:49 ekohl Exp $ +/* $Id: environment.c,v 1.2 2004/03/24 16:00:01 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -24,8 +24,10 @@ SetUserEnvironmentVariable (LPVOID *Environment, UNICODE_STRING Value; NTSTATUS Status; - RtlInitUnicodeString (&Name, lpName); - RtlInitUnicodeString (&Value, lpValue); + RtlInitUnicodeString (&Name, + lpName); + RtlInitUnicodeString (&Value, + lpValue); Status = RtlSetEnvironmentVariable ((PWSTR*)Environment, &Name, @@ -40,6 +42,190 @@ SetUserEnvironmentVariable (LPVOID *Environment, } +static BOOL +AppendUserEnvironmentVariable (LPVOID *Environment, + LPWSTR lpName, + LPWSTR lpValue) +{ + UNICODE_STRING Name; + UNICODE_STRING Value; + NTSTATUS Status; + + RtlInitUnicodeString (&Name, + lpName); + + Value.Length = 0; + Value.MaximumLength = 1024 * sizeof(WCHAR); + Value.Buffer = LocalAlloc (LPTR, + 1024 * sizeof(WCHAR)); + if (Value.Buffer == NULL) + { + return FALSE; + } + Value.Buffer[0] = UNICODE_NULL; + + Status = RtlQueryEnvironmentVariable_U ((PWSTR)*Environment, + &Name, + &Value); + if (NT_SUCCESS(Status)) + { + RtlAppendUnicodeToString (&Value, + L";"); + } + + RtlAppendUnicodeToString (&Value, + lpValue); + + Status = RtlSetEnvironmentVariable ((PWSTR*)Environment, + &Name, + &Value); + LocalFree (Value.Buffer); + if (!NT_SUCCESS(Status)) + { + DPRINT1 ("RtlSetEnvironmentVariable() failed (Status %lx)\n", Status); + return FALSE; + } + + return TRUE; +} + + +static HKEY +GetCurrentUserKey (HANDLE hToken) +{ + UNICODE_STRING SidString; + HKEY hKey; + + if (!GetUserSidFromToken (hToken, + &SidString)) + { + DPRINT1 ("GetUserSidFromToken() failed\n"); + return NULL; + } + + if (RegOpenKeyExW (HKEY_USERS, + SidString.Buffer, + 0, + KEY_ALL_ACCESS, + &hKey)) + { + DPRINT1 ("RegOpenKeyExW() failed (Error %ld)\n", GetLastError()); + RtlFreeUnicodeString (&SidString); + return NULL; + } + + RtlFreeUnicodeString (&SidString); + + return hKey; +} + + +static BOOL +SetUserEnvironment (LPVOID *lpEnvironment, + HKEY hKey, + LPWSTR lpSubKeyName) +{ + HKEY hEnvKey; + DWORD dwValues; + DWORD dwMaxValueNameLength; + DWORD dwMaxValueDataLength; + DWORD dwValueNameLength; + DWORD dwValueDataLength; + DWORD dwType; + DWORD i; + LPWSTR lpValueName; + LPWSTR lpValueData; + + if (RegOpenKeyExW (hKey, + lpSubKeyName, + 0, + KEY_ALL_ACCESS, + &hEnvKey)) + { + DPRINT1 ("RegOpenKeyExW() failed (Error %ld)\n", GetLastError()); + return FALSE; + } + + if (RegQueryInfoKey (hEnvKey, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + &dwValues, + &dwMaxValueNameLength, + &dwMaxValueDataLength, + NULL, + NULL)) + { + DPRINT1 ("RegQueryInforKey() failed (Error %ld)\n", GetLastError()); + RegCloseKey (hEnvKey); + return FALSE; + } + + if (dwValues == 0) + { + RegCloseKey (hEnvKey); + return TRUE; + } + + /* Allocate buffers */ + lpValueName = LocalAlloc (LPTR, + dwMaxValueNameLength * sizeof(WCHAR)); + if (lpValueName == NULL) + { + RegCloseKey (hEnvKey); + return FALSE; + } + + lpValueData = LocalAlloc (LPTR, + dwMaxValueDataLength); + if (lpValueData == NULL) + { + LocalFree (lpValueName); + RegCloseKey (hEnvKey); + return FALSE; + } + + /* Enumerate values */ + for (i = 0; i < dwValues; i++) + { + dwValueNameLength = dwMaxValueNameLength; + dwValueDataLength = dwMaxValueDataLength; + RegEnumValueW (hEnvKey, + i, + lpValueName, + &dwValueNameLength, + NULL, + &dwType, + (LPBYTE)lpValueData, + &dwValueDataLength); + + if (!_wcsicmp (lpValueName, L"path")) + { + /* Append 'Path' environment variable */ + AppendUserEnvironmentVariable (lpEnvironment, + lpValueName, + lpValueData); + } + else + { + /* Set environment variable */ + SetUserEnvironmentVariable (lpEnvironment, + lpValueName, + lpValueData); + } + } + + LocalFree (lpValueData); + LocalFree (lpValueName); + RegCloseKey (hEnvKey); + + return TRUE; +} + + BOOL WINAPI CreateEnvironmentBlock (LPVOID *lpEnvironment, HANDLE hToken, @@ -47,6 +233,7 @@ CreateEnvironmentBlock (LPVOID *lpEnvironment, { WCHAR Buffer[MAX_PATH]; DWORD Length; + HKEY hKeyUser; NTSTATUS Status; DPRINT1 ("CreateEnvironmentBlock() called\n"); @@ -72,6 +259,17 @@ CreateEnvironmentBlock (LPVOID *lpEnvironment, Buffer); } + if (hToken == NULL) + return TRUE; + + hKeyUser = GetCurrentUserKey (hToken); + if (hKeyUser == NULL) + { + DPRINT1 ("GetCurrentUserKey() failed\n"); + RtlDestroyEnvironment (*lpEnvironment); + return FALSE; + } + /* Set 'USERPROFILE' variable */ Length = MAX_PATH; if (GetUserProfileDirectoryW (hToken, @@ -83,6 +281,17 @@ CreateEnvironmentBlock (LPVOID *lpEnvironment, Buffer); } + /* FIXME: Set 'USERDOMAIN' variable */ + + /* FIXME: Set 'USERNAME' variable */ + + /* Set user environment variables */ + SetUserEnvironment (lpEnvironment, + hKeyUser, + L"Environment"); + + RegCloseKey (hKeyUser); + return TRUE; } From 1bad49c3beab134a4fdc8683186893cfac7f8850 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Wed, 24 Mar 2004 16:21:59 +0000 Subject: [PATCH 0631/1463] * Always return STATUS_SUCCESS from ScsiPortInitialize if some device was found. * Minor correction to setting of SrbExtension. * Changed DPRINT1 to DPRINT on some places. svn path=/trunk/; revision=8863 --- reactos/drivers/storage/scsiport/scsiport.c | 23 ++++++++++++--------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/reactos/drivers/storage/scsiport/scsiport.c b/reactos/drivers/storage/scsiport/scsiport.c index 2c283af483f..35efa00fa92 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.50 2004/03/23 12:30:15 ekohl Exp $ +/* $Id: scsiport.c,v 1.51 2004/03/24 16:21:59 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -506,7 +506,7 @@ ScsiPortGetSrb(IN PVOID DeviceExtension, IN UCHAR Lun, IN LONG QueueTag) { - DPRINT1("ScsiPortGetSrb()\n"); + DPRINT1("ScsiPortGetSrb() unimplemented\n"); UNIMPLEMENTED; return NULL; } @@ -657,6 +657,7 @@ ScsiPortInitialize(IN PVOID Argument1, ULONG DeviceExtensionSize; ULONG PortConfigSize; BOOLEAN Again; + BOOLEAN DeviceFound = FALSE; ULONG i; ULONG Result; NTSTATUS Status; @@ -950,6 +951,7 @@ ScsiPortInitialize(IN PVOID Argument1, SystemConfig->ScsiPortCount++; PortDeviceObject = NULL; + DeviceFound = TRUE; } else { @@ -999,7 +1001,7 @@ ByeBye: DPRINT("ScsiPortInitialize() done!\n"); - return Status; + return (DeviceFound == FALSE) ? Status : STATUS_SUCCESS; } @@ -1109,6 +1111,7 @@ ScsiPortNotification(IN SCSI_NOTIFICATION_TYPE NotificationType, PathId, TargetId, Lun); /* FIXME: Implement it! */ + DeviceExtension->IrpFlags |= IRP_FLAG_NEXT; // DeviceExtension->IrpFlags |= IRP_FLAG_NEXT_LU; /* Hack! */ @@ -1283,7 +1286,7 @@ SpiGetPciConfigData (IN struct _HW_INITIALIZATION_DATA *HwInitializationData, PortConfig->AccessRanges[i].RangeInMemory = !(PciConfig.u.type0.BaseAddresses[i] & PCI_ADDRESS_IO_SPACE); - DPRINT1("RangeStart 0x%lX RangeLength 0x%lX RangeInMemory %s\n", + DPRINT("RangeStart 0x%lX RangeLength 0x%lX RangeInMemory %s\n", PciConfig.u.type0.BaseAddresses[i] & PCI_ADDRESS_IO_ADDRESS_MASK, -(RangeLength & PCI_ADDRESS_IO_ADDRESS_MASK), (PciConfig.u.type0.BaseAddresses[i] & PCI_ADDRESS_IO_SPACE)?"FALSE":"TRUE"); @@ -1653,12 +1656,6 @@ ScsiPortStartIo(IN PDEVICE_OBJECT DeviceObject, Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = Srb->DataTransferLength; - /* Allocte SRB extension */ - if (DeviceExtension->SrbExtensionSize != 0) - { - Srb->SrbExtension = DeviceExtension->VirtualAddress; - } - DeviceExtension->CurrentIrp = Irp; if (!KeSynchronizeExecution(DeviceExtension->Interrupt, @@ -1725,6 +1722,12 @@ ScsiPortStartPacket(IN OUT PVOID Context) IrpStack = IoGetCurrentIrpStackLocation(DeviceExtension->CurrentIrp); Srb = IrpStack->Parameters.Scsi.Srb; + /* Allocte SRB extension */ + if (DeviceExtension->SrbExtensionSize != 0) + { + Srb->SrbExtension = DeviceExtension->VirtualAddress; + } + return(DeviceExtension->HwStartIo(&DeviceExtension->MiniPortDeviceExtension, Srb)); } From f977f1fd59f711e7d413e514d34d5625421f1de6 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Wed, 24 Mar 2004 20:47:58 +0000 Subject: [PATCH 0632/1463] FIXME -> TRACE svn path=/trunk/; revision=8864 --- reactos/lib/shell32/shelllink.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/lib/shell32/shelllink.c b/reactos/lib/shell32/shelllink.c index 1b0b8219924..4cc02c2cf43 100644 --- a/reactos/lib/shell32/shelllink.c +++ b/reactos/lib/shell32/shelllink.c @@ -219,7 +219,7 @@ static HRESULT WINAPI IPersistFile_fnIsDirty(IPersistFile* iface) { _ICOM_THIS_From_IPersistFile(IShellLinkImpl, iface); - FIXME("(%p)\n",This); + TRACE("(%p)\n",This); if (This->bDirty) return S_OK; @@ -1356,7 +1356,7 @@ static HRESULT WINAPI IShellLinkA_fnSetPath(IShellLinkA * iface, LPCSTR pszFile) { ICOM_THIS(IShellLinkImpl, iface); char buffer[MAX_PATH]; - LPCSTR fname; + LPSTR fname; TRACE("(%p)->(path=%s)\n",This, pszFile); @@ -1791,7 +1791,7 @@ static HRESULT WINAPI IShellLinkW_fnSetPath(IShellLinkW * iface, LPCWSTR pszFile { _ICOM_THIS_From_IShellLinkW(IShellLinkImpl, iface); WCHAR buffer[MAX_PATH]; - LPCSTR fname; + LPWSTR fname; TRACE("(%p)->(path=%s)\n",This, debugstr_w(pszFile)); From bcbcab94ad28890b3c3e7d4f0e32fb8ec78dc696 Mon Sep 17 00:00:00 2001 From: Emanuele Aliberti Date: Wed, 24 Mar 2004 21:46:41 +0000 Subject: [PATCH 0633/1463] Visible build timestamp. svn path=/trunk/; revision=8865 --- reactos/include/reactos/resource.h | 1 + reactos/ntoskrnl/ntoskrnl.rc | 1 + 2 files changed, 2 insertions(+) diff --git a/reactos/include/reactos/resource.h b/reactos/include/reactos/resource.h index b0730be78bc..659cda97484 100644 --- a/reactos/include/reactos/resource.h +++ b/reactos/include/reactos/resource.h @@ -24,6 +24,7 @@ #define RES_STR_LEGAL_COPYRIGHT "Copyright (c) 1998-2004 ReactOS Team\0" #define RES_STR_PRODUCT_NAME "ReactOS Operating System\0" #define RES_STR_PRODUCT_VERSION KERNEL_VERSION_RC +#define RES_STR_BUILD_DATE KERNEL_VERSION_BUILD_RC /* FILE_VERSION defaults to PRODUCT_VERSION */ #define RES_STR_FILE_VERSION KERNEL_RELEASE_RC diff --git a/reactos/ntoskrnl/ntoskrnl.rc b/reactos/ntoskrnl/ntoskrnl.rc index 2d6864ded17..b4265cb1d19 100644 --- a/reactos/ntoskrnl/ntoskrnl.rc +++ b/reactos/ntoskrnl/ntoskrnl.rc @@ -28,6 +28,7 @@ BEGIN VALUE "OriginalFilename", "ntoskrnl.exe\0" VALUE "ProductName", RES_STR_PRODUCT_NAME VALUE "ProductVersion", RES_STR_PRODUCT_VERSION + VALUE "Build Date", RES_STR_BUILD_DATE END END BLOCK "VarFileInfo" From 458909a9c0cc97f23a0e7e2c751eb5883386b280 Mon Sep 17 00:00:00 2001 From: Emanuele Aliberti Date: Wed, 24 Mar 2004 22:00:39 +0000 Subject: [PATCH 0634/1463] Initialize LPC-related fields in ETHREAD. svn path=/trunk/; revision=8866 --- reactos/ntoskrnl/ps/create.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/ps/create.c b/reactos/ntoskrnl/ps/create.c index dd653e88bf7..afca150bba6 100644 --- a/reactos/ntoskrnl/ps/create.c +++ b/reactos/ntoskrnl/ps/create.c @@ -1,4 +1,4 @@ -/* $Id: create.c,v 1.72 2004/03/19 12:45:07 ekohl Exp $ +/* $Id: create.c,v 1.73 2004/03/24 22:00:39 ea Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -21,6 +21,8 @@ /* INCLUDES ****************************************************************/ +#include + #define NTOS_MODE_KERNEL #include #include @@ -445,7 +447,17 @@ PsInitializeThread(HANDLE ProcessHandle, Thread->Tcb.BasePriority = (CHAR)Thread->ThreadsProcess->Pcb.BasePriority; Thread->Tcb.Priority = Thread->Tcb.BasePriority; - return(STATUS_SUCCESS); + /* + * Local Procedure Call facility (LPC) + */ + KeInitializeSemaphore (& Thread->LpcReplySemaphore, 0, LONG_MAX); + Thread->LpcReplyMessage = NULL; + Thread->LpcReplyMessageId = 0; /* not valid */ + /* Thread->LpcReceiveMessageId = 0; */ + Thread->LpcExitThreadCalled = FALSE; + Thread->LpcReceivedMsgIdValid = FALSE; + + return(STATUS_SUCCESS); } From 29a9d5c51920c43a9bda8e1e7d352ac44391727e Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes Date: Wed, 24 Mar 2004 23:42:39 +0000 Subject: [PATCH 0635/1463] add RtlCreateCriticalSectionSpinCount svn path=/trunk/; revision=8867 --- reactos/lib/ntdll/def/ntdll.def | 3 ++- reactos/lib/ntdll/def/ntdll.edf | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/reactos/lib/ntdll/def/ntdll.def b/reactos/lib/ntdll/def/ntdll.def index 05025fa015a..aa7a4ccc3fc 100644 --- a/reactos/lib/ntdll/def/ntdll.def +++ b/reactos/lib/ntdll/def/ntdll.def @@ -1,4 +1,4 @@ -; $Id: ntdll.def,v 1.117 2004/02/25 19:34:32 ekohl Exp $ +; $Id: ntdll.def,v 1.118 2004/03/24 23:42:39 gdalsnes Exp $ ; ; ReactOS Operating System ; @@ -369,6 +369,7 @@ RtlDecompressFragment@32 RtlDeleteAce@8 RtlDeleteAtomFromAtomTable@8 RtlDeleteCriticalSection@4 +RtlSetCriticalSectionSpinCount@8 ;RtlDeleteElementGenericTable ;RtlDeleteNoSplay RtlDeleteOwnersRanges@8 diff --git a/reactos/lib/ntdll/def/ntdll.edf b/reactos/lib/ntdll/def/ntdll.edf index 54a4885f5cf..627e323b779 100644 --- a/reactos/lib/ntdll/def/ntdll.edf +++ b/reactos/lib/ntdll/def/ntdll.edf @@ -1,4 +1,4 @@ -; $Id: ntdll.edf,v 1.107 2004/02/25 19:34:32 ekohl Exp $ +; $Id: ntdll.edf,v 1.108 2004/03/24 23:42:39 gdalsnes Exp $ ; ; ReactOS Operating System ; @@ -369,6 +369,7 @@ RtlDecompressFragment=RtlDecompressFragment@32 RtlDeleteAce=RtlDeleteAce@8 RtlDeleteAtomFromAtomTable=RtlDeleteAtomFromAtomTable@8 RtlDeleteCriticalSection=RtlDeleteCriticalSection@4 +RtlSetCriticalSectionSpinCount=RtlSetCriticalSectionSpinCount@8 ;RtlDeleteElementGenericTable ;RtlDeleteNoSplay RtlDeleteOwnersRanges=RtlDeleteOwnersRanges@8 From 9d7050fddd526c007a54f11d4c773e3e71a098ed Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes Date: Wed, 24 Mar 2004 23:43:52 +0000 Subject: [PATCH 0636/1463] add RtlCreateCriticalSectionSpinCount + fix svn path=/trunk/; revision=8868 --- reactos/lib/ntdll/rtl/critical.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/reactos/lib/ntdll/rtl/critical.c b/reactos/lib/ntdll/rtl/critical.c index 9e4c6eef3a2..b856f548312 100644 --- a/reactos/lib/ntdll/rtl/critical.c +++ b/reactos/lib/ntdll/rtl/critical.c @@ -1,4 +1,4 @@ -/* $Id: critical.c,v 1.19 2004/02/01 20:48:06 ekohl Exp $ +/* $Id: critical.c,v 1.20 2004/03/24 23:43:52 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -29,6 +29,27 @@ RtlDeleteCriticalSection(PCRITICAL_SECTION CriticalSection) CriticalSection->LockCount = -1; } +/* + * @implemented + */ +DWORD STDCALL +RtlSetCriticalSectionSpinCount( + LPCRITICAL_SECTION CriticalSection, + DWORD SpinCount + ) +{ + +#ifdef MP + DWORD PrevSpinCount = CriticalSection->SpinCount; + CriticalSection->SpinCount = SpinCount; + return PrevSpinCount; +#else + return 0; +#endif + +} + + /* * @implemented */ @@ -141,7 +162,11 @@ RtlInitializeCriticalSectionAndSpinCount (PCRITICAL_SECTION CriticalSection, CriticalSection->LockCount = -1; CriticalSection->RecursionCount = 0; CriticalSection->OwningThread = (HANDLE)0; +#ifdef MP CriticalSection->SpinCount = SpinCount; +#else + CriticalSection->SpinCount = 0; +#endif return NtCreateSemaphore (&CriticalSection->LockSemaphore, SEMAPHORE_ALL_ACCESS, From 8a8167ab4de98ef166f44093f8754684f389ba5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Thu, 25 Mar 2004 08:51:44 +0000 Subject: [PATCH 0637/1463] Set correct colors before calling owner-drawn handler svn path=/trunk/; revision=8869 --- reactos/lib/user32/windows/menu.c | 72 +++++++++++++++---------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/reactos/lib/user32/windows/menu.c b/reactos/lib/user32/windows/menu.c index e54f7aa5684..758e7405372 100644 --- a/reactos/lib/user32/windows/menu.c +++ b/reactos/lib/user32/windows/menu.c @@ -21,7 +21,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: menu.c,v 1.57 2004/03/24 08:56:52 gvg Exp $ +/* $Id: menu.c,v 1.58 2004/03/25 08:51:44 gvg Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/menu.c @@ -581,6 +581,41 @@ MenuDrawMenuItem(HWND Wnd, PROSMENUINFO MenuInfo, HWND WndOwner, HDC Dc, return; } + /* Setup colors */ + + if (0 != (Item->fState & MF_HILITE)) + { + if (MenuBar) + { + SetTextColor(Dc, GetSysColor(COLOR_MENUTEXT)); + SetBkColor(Dc, GetSysColor(COLOR_MENU)); + } + else + { + if (0 != (Item->fState & MF_GRAYED)) + { + SetTextColor(Dc, GetSysColor(COLOR_GRAYTEXT)); + } + else + { + SetTextColor(Dc, GetSysColor(COLOR_HIGHLIGHTTEXT)); + } + SetBkColor(Dc, GetSysColor(COLOR_HIGHLIGHT)); + } + } + else + { + if (0 != (Item->fState & MF_GRAYED)) + { + SetTextColor(Dc, GetSysColor(COLOR_GRAYTEXT)); + } + else + { + SetTextColor(Dc, GetSysColor(COLOR_MENUTEXT)); + } + SetBkColor(Dc, GetSysColor(COLOR_MENU)); + } + if (0 != (Item->fType & MF_OWNERDRAW)) { /* @@ -679,41 +714,6 @@ MenuDrawMenuItem(HWND Wnd, PROSMENUINFO MenuInfo, HWND WndOwner, HDC Dc, } } - /* Setup colors */ - - if (0 != (Item->fState & MF_HILITE)) - { - if (MenuBar) - { - SetTextColor(Dc, GetSysColor(COLOR_MENUTEXT)); - SetBkColor(Dc, GetSysColor(COLOR_MENU)); - } - else - { - if (0 != (Item->fState & MF_GRAYED)) - { - SetTextColor(Dc, GetSysColor(COLOR_GRAYTEXT)); - } - else - { - SetTextColor(Dc, GetSysColor(COLOR_HIGHLIGHTTEXT)); - } - SetBkColor(Dc, GetSysColor(COLOR_HIGHLIGHT)); - } - } - else - { - if (0 != (Item->fState & MF_GRAYED)) - { - SetTextColor(Dc, GetSysColor(COLOR_GRAYTEXT)); - } - else - { - SetTextColor(Dc, GetSysColor(COLOR_MENUTEXT)); - } - SetBkColor(Dc, GetSysColor(COLOR_MENU)); - } - #if 0 /* helper lines for debugging */ FrameRect(Dc, &Rect, GetStockObject(BLACK_BRUSH)); From 9e558fcc6a4903efac798f4c40d9911fff18fc68 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Thu, 25 Mar 2004 11:30:07 +0000 Subject: [PATCH 0638/1463] - Implement ImpersonateLoggedOnUser(). - Moved some security related functions to better places. svn path=/trunk/; revision=8870 --- reactos/lib/advapi32/makefile | 6 +- reactos/lib/advapi32/sec/misc.c | 311 +++++++++++++++++++- reactos/lib/advapi32/sec/sec.c | 46 +-- reactos/lib/advapi32/sec/sid.c | 371 ++++++++++-------------- reactos/lib/advapi32/service/eventlog.c | 303 ++++++++++++------- reactos/lib/advapi32/token/privilege.c | 131 +-------- reactos/lib/advapi32/token/token.c | 4 +- 7 files changed, 663 insertions(+), 509 deletions(-) diff --git a/reactos/lib/advapi32/makefile b/reactos/lib/advapi32/makefile index eabcfe6330a..b744dab612a 100644 --- a/reactos/lib/advapi32/makefile +++ b/reactos/lib/advapi32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.38 2004/03/10 21:56:04 navaraf Exp $ +# $Id: makefile,v 1.39 2004/03/25 11:30:07 ekohl Exp $ PATH_TO_TOP = ../.. @@ -34,10 +34,10 @@ SECURITY_OBJECTS = \ sec/sid.o SERVICE_OBJECTS = \ + service/eventlog.o \ service/scm.o \ service/sctrl.o \ - service/undoc.o \ - service/eventlog.o + service/undoc.o TOKEN_OBJECTS = \ token/privilege.o \ diff --git a/reactos/lib/advapi32/sec/misc.c b/reactos/lib/advapi32/sec/misc.c index b0119b3f3c3..069c76eed77 100644 --- a/reactos/lib/advapi32/sec/misc.c +++ b/reactos/lib/advapi32/sec/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.11 2004/03/08 18:09:05 sedwards Exp $ +/* $Id: misc.c,v 1.12 2004/03/25 11:30:07 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -6,11 +6,13 @@ * PURPOSE: Miscellaneous security functions */ -#include #define NTOS_MODE_USER #include #include +#define NDEBUG +#include + /* * @implemented @@ -36,6 +38,40 @@ AreAnyAccessesGranted(DWORD GrantedAccess, } +/****************************************************************************** + * GetFileSecurityA [ADVAPI32.@] + * + * Obtains Specified information about the security of a file or directory. + * + * PARAMS + * lpFileName [I] Name of the file to get info for + * RequestedInformation [I] SE_ flags from "winnt.h" + * pSecurityDescriptor [O] Destination for security information + * nLength [I] Length of pSecurityDescriptor + * lpnLengthNeeded [O] Destination for length of returned security information + * + * RETURNS + * Success: TRUE. pSecurityDescriptor contains the requested information. + * Failure: FALSE. lpnLengthNeeded contains the required space to return the info. + * + * NOTES + * The information returned is constrained by the callers access rights and + * privileges. + * + * @unimplemented + */ +BOOL WINAPI +GetFileSecurityA (LPCSTR lpFileName, + SECURITY_INFORMATION RequestedInformation, + PSECURITY_DESCRIPTOR pSecurityDescriptor, + DWORD nLength, + LPDWORD lpnLengthNeeded) +{ + DPRINT("GetFileSecurityW : stub\n"); + return TRUE; +} + + /* * @implemented */ @@ -62,6 +98,22 @@ GetKernelObjectSecurity(HANDLE Handle, } +/****************************************************************************** + * SetFileSecurityA [ADVAPI32.@] + * Sets the security of a file or directory + * + * @unimplemented + */ +BOOL STDCALL +SetFileSecurityA (LPCSTR lpFileName, + SECURITY_INFORMATION RequestedInformation, + PSECURITY_DESCRIPTOR pSecurityDescriptor) +{ + DPRINT("SetFileSecurityA : stub\n"); + return TRUE; +} + + /* * @implemented */ @@ -78,9 +130,9 @@ SetKernelObjectSecurity(HANDLE Handle, if (!NT_SUCCESS(Status)) { SetLastError(RtlNtStatusToDosError(Status)); - return(FALSE); + return FALSE; } - return(TRUE); + return TRUE; } @@ -97,12 +149,85 @@ MapGenericMask(PDWORD AccessMask, /* - * @unimplemented + * @implemented */ BOOL STDCALL ImpersonateLoggedOnUser(HANDLE hToken) { - return FALSE; + SECURITY_QUALITY_OF_SERVICE Qos; + OBJECT_ATTRIBUTES ObjectAttributes; + HANDLE NewToken; + TOKEN_TYPE Type; + ULONG ReturnLength; + BOOL Duplicated; + NTSTATUS Status; + + /* Get the token type */ + Status = NtQueryInformationToken (hToken, + TokenType, + &Type, + sizeof(TOKEN_TYPE), + &ReturnLength); + if (!NT_SUCCESS(Status)) + { + SetLastError (RtlNtStatusToDosError (Status)); + return FALSE; + } + + if (Type == TokenPrimary) + { + /* Create a duplicate impersonation token */ + Qos.Length = sizeof(SECURITY_QUALITY_OF_SERVICE); + Qos.ImpersonationLevel = SecurityImpersonation; + Qos.ContextTrackingMode = SECURITY_DYNAMIC_TRACKING; + Qos.EffectiveOnly = FALSE; + + ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES); + ObjectAttributes.RootDirectory = NULL; + ObjectAttributes.ObjectName = NULL; + ObjectAttributes.Attributes = 0; + ObjectAttributes.SecurityDescriptor = NULL; + ObjectAttributes.SecurityQualityOfService = &Qos; + + Status = NtDuplicateToken (hToken, + TOKEN_IMPERSONATE | TOKEN_QUERY, + &ObjectAttributes, + FALSE, + TokenImpersonation, + &NewToken); + if (!NT_SUCCESS(Status)) + { + SetLastError (RtlNtStatusToDosError (Status)); + return FALSE; + } + + Duplicated = TRUE; + } + else + { + /* User the original impersonation token */ + NewToken = hToken; + Duplicated = FALSE; + } + + /* Impersonate the the current thread */ + Status = NtSetInformationThread (NtCurrentThread (), + ThreadImpersonationToken, + NewToken, + sizeof(HANDLE)); + + if (Duplicated == TRUE) + { + NtClose (NewToken); + } + + if (!NT_SUCCESS(Status)) + { + SetLastError (RtlNtStatusToDosError (Status)); + return FALSE; + } + + return TRUE; } @@ -118,9 +243,9 @@ ImpersonateSelf(SECURITY_IMPERSONATION_LEVEL ImpersonationLevel) if (!NT_SUCCESS(Status)) { SetLastError(RtlNtStatusToDosError(Status)); - return(FALSE); + return FALSE; } - return(TRUE); + return TRUE; } @@ -140,9 +265,9 @@ RevertToSelf(VOID) if (!NT_SUCCESS(Status)) { SetLastError(RtlNtStatusToDosError(Status)); - return(FALSE); + return FALSE; } - return(TRUE); + return TRUE; } @@ -207,4 +332,170 @@ GetUserNameW( LPWSTR lpszName, LPDWORD lpSize ) return TRUE; } + +/****************************************************************************** + * LookupAccountSidA [ADVAPI32.@] + * + * @unimplemented + */ +BOOL STDCALL +LookupAccountSidA (LPCSTR lpSystemName, + PSID lpSid, + LPSTR lpName, + LPDWORD cchName, + LPSTR lpReferencedDomainName, + LPDWORD cchReferencedDomainName, + PSID_NAME_USE peUse) +{ + DPRINT1("LookupAccountSidA is unimplemented, but returns success\n"); + return TRUE; +} + + +/****************************************************************************** + * LookupAccountSidW [ADVAPI32.@] + * + * @unimplemented + */ +BOOL STDCALL +LookupAccountSidW (LPCWSTR lpSystemName, + PSID lpSid, + LPWSTR lpName, + LPDWORD cchName, + LPWSTR lpReferencedDomainName, + LPDWORD cchReferencedDomainName, + PSID_NAME_USE peUse) +{ + DPRINT1("LookupAccountSidW is unimplemented, but returns success\n"); + return TRUE; +} + + +/********************************************************************** + * LookupPrivilegeValueA EXPORTED + * + * @implemented + */ +BOOL STDCALL +LookupPrivilegeValueA (LPCSTR lpSystemName, + LPCSTR lpName, + PLUID lpLuid) +{ + UNICODE_STRING SystemName; + UNICODE_STRING Name; + BOOL Result; + + /* Remote system? */ + if (lpSystemName != NULL) + { + RtlCreateUnicodeStringFromAsciiz (&SystemName, + (LPSTR)lpSystemName); + } + + /* Check the privilege name is not NULL */ + if (lpName == NULL) + { + SetLastError (ERROR_INVALID_PARAMETER); + return FALSE; + } + + RtlCreateUnicodeStringFromAsciiz (&Name, + (LPSTR)lpName); + + Result = LookupPrivilegeValueW ((lpSystemName != NULL) ? SystemName.Buffer : NULL, + Name.Buffer, + lpLuid); + + RtlFreeUnicodeString (&Name); + + /* Remote system? */ + if (lpSystemName != NULL) + { + RtlFreeUnicodeString (&SystemName); + } + + return Result; +} + + +/********************************************************************** + * LookupPrivilegeValueW EXPORTED + * + * @unimplemented + */ +BOOL STDCALL +LookupPrivilegeValueW (LPCWSTR lpSystemName, + LPCWSTR lpName, + PLUID lpLuid) +{ + SetLastError (ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + + +/********************************************************************** + * LookupPrivilegeDisplayNameA EXPORTED + * + * @unimplemented + */ +BOOL STDCALL +LookupPrivilegeDisplayNameA (LPCSTR lpSystemName, + LPCSTR lpName, + LPSTR lpDisplayName, + LPDWORD cbDisplayName, + LPDWORD lpLanguageId) +{ + SetLastError (ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + + +/********************************************************************** + * LookupPrivilegeDisplayNameW EXPORTED + * + * @unimplemented + */ +BOOL STDCALL +LookupPrivilegeDisplayNameW (LPCWSTR lpSystemName, + LPCWSTR lpName, + LPWSTR lpDisplayName, + LPDWORD cbDisplayName, + LPDWORD lpLanguageId) +{ + SetLastError (ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + + +/********************************************************************** + * LookupPrivilegeNameA EXPORTED + * + * @unimplemented + */ +BOOL STDCALL +LookupPrivilegeNameA (LPCSTR lpSystemName, + PLUID lpLuid, + LPSTR lpName, + LPDWORD cbName) +{ + SetLastError (ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + + +/********************************************************************** + * LookupPrivilegeNameW EXPORTED + * + * @unimplemented + */ +BOOL STDCALL +LookupPrivilegeNameW (LPCWSTR lpSystemName, + PLUID lpLuid, + LPWSTR lpName, + LPDWORD cbName) +{ + SetLastError (ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + /* EOF */ diff --git a/reactos/lib/advapi32/sec/sec.c b/reactos/lib/advapi32/sec/sec.c index 7937b602e5f..77d3b21f0d7 100644 --- a/reactos/lib/advapi32/sec/sec.c +++ b/reactos/lib/advapi32/sec/sec.c @@ -1,4 +1,4 @@ -/* $Id: sec.c,v 1.19 2004/02/25 23:54:13 sedwards Exp $ +/* $Id: sec.c,v 1.20 2004/03/25 11:30:07 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -11,41 +11,11 @@ * Created 01/11/98 */ -#include #define NTOS_MODE_USER #include #include -/****************************************************************************** - * GetFileSecurityA [ADVAPI32.@] - * - * Obtains Specified information about the security of a file or directory. - * - * PARAMS - * lpFileName [I] Name of the file to get info for - * RequestedInformation [I] SE_ flags from "winnt.h" - * pSecurityDescriptor [O] Destination for security information - * nLength [I] Length of pSecurityDescriptor - * lpnLengthNeeded [O] Destination for length of returned security information - * - * RETURNS - * Success: TRUE. pSecurityDescriptor contains the requested information. - * Failure: FALSE. lpnLengthNeeded contains the required space to return the info. - * - * NOTES - * The information returned is constrained by the callers access rights and - * privileges. - */ -BOOL WINAPI -GetFileSecurityA( LPCSTR lpFileName, - SECURITY_INFORMATION RequestedInformation, - PSECURITY_DESCRIPTOR pSecurityDescriptor, - DWORD nLength, LPDWORD lpnLengthNeeded ) -{ - DPRINT("GetFileSecurityW : stub\n"); - return TRUE; -} - +#include /* * @implemented @@ -320,18 +290,6 @@ MakeSelfRelativeSD ( return TRUE; } -/****************************************************************************** - * SetFileSecurityA [ADVAPI32.@] - * Sets the security of a file or directory - */ -BOOL STDCALL SetFileSecurityA( LPCSTR lpFileName, - SECURITY_INFORMATION RequestedInformation, - PSECURITY_DESCRIPTOR pSecurityDescriptor) -{ - DPRINT("SetFileSecurityA : stub\n"); - return TRUE; -} - /* * @implemented diff --git a/reactos/lib/advapi32/sec/sid.c b/reactos/lib/advapi32/sec/sid.c index 652d66379c1..5ddeb7ecb79 100644 --- a/reactos/lib/advapi32/sec/sid.c +++ b/reactos/lib/advapi32/sec/sid.c @@ -1,4 +1,4 @@ -/* $Id: sid.c,v 1.11 2004/03/10 21:34:42 fireball Exp $ +/* $Id: sid.c,v 1.12 2004/03/25 11:30:07 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -18,15 +18,16 @@ BOOL STDCALL AllocateLocallyUniqueId(PLUID Luid) { - NTSTATUS Status; + NTSTATUS Status; - Status = NtAllocateLocallyUniqueId(Luid); - if (!NT_SUCCESS(Status)) - { - SetLastError(RtlNtStatusToDosError(Status)); - return(FALSE); - } - return(TRUE); + Status = NtAllocateLocallyUniqueId (Luid); + if (!NT_SUCCESS (Status)) + { + SetLastError (RtlNtStatusToDosError (Status)); + return FALSE; + } + + return TRUE; } @@ -34,26 +35,24 @@ AllocateLocallyUniqueId(PLUID Luid) * @implemented */ BOOL STDCALL -AllocateAndInitializeSid ( - PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, - BYTE nSubAuthorityCount, - DWORD dwSubAuthority0, - DWORD dwSubAuthority1, - DWORD dwSubAuthority2, - DWORD dwSubAuthority3, - DWORD dwSubAuthority4, - DWORD dwSubAuthority5, - DWORD dwSubAuthority6, - DWORD dwSubAuthority7, - PSID *pSid -) +AllocateAndInitializeSid (PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, + BYTE nSubAuthorityCount, + DWORD dwSubAuthority0, + DWORD dwSubAuthority1, + DWORD dwSubAuthority2, + DWORD dwSubAuthority3, + DWORD dwSubAuthority4, + DWORD dwSubAuthority5, + DWORD dwSubAuthority6, + DWORD dwSubAuthority7, + PSID *pSid) { - NTSTATUS Status; + NTSTATUS Status; - Status = RtlAllocateAndInitializeSid (pIdentifierAuthority, - nSubAuthorityCount, - dwSubAuthority0, - dwSubAuthority1, + Status = RtlAllocateAndInitializeSid (pIdentifierAuthority, + nSubAuthorityCount, + dwSubAuthority0, + dwSubAuthority1, dwSubAuthority2, dwSubAuthority3, dwSubAuthority4, @@ -61,171 +60,13 @@ AllocateAndInitializeSid ( dwSubAuthority6, dwSubAuthority7, pSid); - if (!NT_SUCCESS(Status)) - { - SetLastError (RtlNtStatusToDosError (Status)); - return FALSE; - } + if (!NT_SUCCESS (Status)) + { + SetLastError (RtlNtStatusToDosError (Status)); + return FALSE; + } - return TRUE; -} - - -/* - * @implemented - */ -BOOL -STDCALL -CopySid ( - DWORD nDestinationSidLength, - PSID pDestinationSid, - PSID pSourceSid -) -{ - NTSTATUS Status; - - Status = RtlCopySid (nDestinationSidLength, - pDestinationSid, - pSourceSid); - if (!NT_SUCCESS(Status)) - { - SetLastError (RtlNtStatusToDosError (Status)); - return FALSE; - } - - return TRUE; -} - - -/* - * @implemented - */ -BOOL -STDCALL -EqualPrefixSid ( - PSID pSid1, - PSID pSid2 - ) -{ - return RtlEqualPrefixSid (pSid1, pSid2); -} - -/* - * @implemented - */ -BOOL -STDCALL -EqualSid ( - PSID pSid1, - PSID pSid2 - ) -{ - return RtlEqualSid (pSid1, pSid2); -} - - -/* - * @implemented - */ -PVOID -STDCALL -FreeSid ( - PSID pSid - ) -{ - return RtlFreeSid (pSid); -} - - -/* - * @implemented - */ -DWORD -STDCALL -GetLengthSid ( - PSID pSid - ) -{ - return (DWORD)RtlLengthSid (pSid); -} - - -/* - * @implemented - */ -PSID_IDENTIFIER_AUTHORITY -STDCALL -GetSidIdentifierAuthority ( - PSID pSid - ) -{ - return RtlIdentifierAuthoritySid (pSid); -} - - -/* - * @implemented - */ -DWORD -STDCALL -GetSidLengthRequired ( - UCHAR nSubAuthorityCount - ) -{ - return (DWORD)RtlLengthRequiredSid (nSubAuthorityCount); -} - - -/* - * @implemented - */ -PDWORD -STDCALL -GetSidSubAuthority ( - PSID pSid, - DWORD nSubAuthority - ) -{ - return (PDWORD)RtlSubAuthoritySid (pSid, nSubAuthority); -} - - -/* - * @implemented - */ -PUCHAR -STDCALL -GetSidSubAuthorityCount ( - PSID pSid - ) -{ - return RtlSubAuthorityCountSid (pSid); -} - - -/* - * @implemented - */ -BOOL -STDCALL -InitializeSid ( - PSID Sid, - PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, - BYTE nSubAuthorityCount - ) -{ - NTSTATUS Status; - - Status = RtlInitializeSid (Sid, - pIdentifierAuthority, - nSubAuthorityCount); - if (!NT_SUCCESS(Status)) - { - SetLastError (RtlNtStatusToDosError (Status)); - return FALSE; - } - - return TRUE; + return TRUE; } @@ -233,40 +74,138 @@ InitializeSid ( * @implemented */ BOOL STDCALL -IsValidSid(PSID pSid) +CopySid (DWORD nDestinationSidLength, + PSID pDestinationSid, + PSID pSourceSid) { - return((BOOL)RtlValidSid(pSid)); -} + NTSTATUS Status; -/****************************************************************************** - * LookupAccountSidA [ADVAPI32.@] - * - * @unimplemented - */ -BOOL STDCALL -LookupAccountSidA(LPCSTR lpSystemName, PSID lpSid, LPSTR lpName, - LPDWORD cchName, LPSTR lpReferencedDomainName, - LPDWORD cchReferencedDomainName, PSID_NAME_USE peUse) + Status = RtlCopySid (nDestinationSidLength, + pDestinationSid, + pSourceSid); + if (!NT_SUCCESS (Status)) + { + SetLastError (RtlNtStatusToDosError (Status)); + return FALSE; + } - -{ - DPRINT1("LookupAccountSidA is unimplemented, but returns success\n"); - return TRUE; + return TRUE; } -/****************************************************************************** - * LookupAccountSidW [ADVAPI32.@] - * - * @unimplemented +/* + * @implemented */ BOOL STDCALL -LookupAccountSidW(LPCWSTR lpSystemName, PSID lpSid, LPWSTR lpName, - LPDWORD cchName, LPWSTR lpReferencedDomainName, - LPDWORD cchReferencedDomainName, PSID_NAME_USE peUse) +EqualPrefixSid (PSID pSid1, + PSID pSid2) { - DPRINT1("LookupAccountSidW is unimplemented, but returns success\n"); - return TRUE; + return RtlEqualPrefixSid (pSid1, pSid2); +} + + +/* + * @implemented + */ +BOOL STDCALL +EqualSid (PSID pSid1, + PSID pSid2) +{ + return RtlEqualSid (pSid1, pSid2); +} + + +/* + * @implemented + */ +PVOID STDCALL +FreeSid (PSID pSid) +{ + return RtlFreeSid (pSid); +} + + +/* + * @implemented + */ +DWORD STDCALL +GetLengthSid (PSID pSid) +{ + return (DWORD)RtlLengthSid (pSid); +} + + +/* + * @implemented + */ +PSID_IDENTIFIER_AUTHORITY STDCALL +GetSidIdentifierAuthority (PSID pSid) +{ + return RtlIdentifierAuthoritySid (pSid); +} + + +/* + * @implemented + */ +DWORD STDCALL +GetSidLengthRequired (UCHAR nSubAuthorityCount) +{ + return (DWORD)RtlLengthRequiredSid (nSubAuthorityCount); +} + + +/* + * @implemented + */ +PDWORD STDCALL +GetSidSubAuthority (PSID pSid, + DWORD nSubAuthority) +{ + return (PDWORD)RtlSubAuthoritySid (pSid, nSubAuthority); +} + + +/* + * @implemented + */ +PUCHAR STDCALL +GetSidSubAuthorityCount (PSID pSid) +{ + return RtlSubAuthorityCountSid (pSid); +} + + +/* + * @implemented + */ +BOOL STDCALL +InitializeSid (PSID Sid, + PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, + BYTE nSubAuthorityCount) +{ + NTSTATUS Status; + + Status = RtlInitializeSid (Sid, + pIdentifierAuthority, + nSubAuthorityCount); + if (!NT_SUCCESS (Status)) + { + SetLastError (RtlNtStatusToDosError (Status)); + return FALSE; + } + + return TRUE; +} + + +/* + * @implemented + */ +BOOL STDCALL +IsValidSid (PSID pSid) +{ + return (BOOL)RtlValidSid (pSid); } /* EOF */ diff --git a/reactos/lib/advapi32/service/eventlog.c b/reactos/lib/advapi32/service/eventlog.c index e1eed3b6728..4c8266b69d6 100644 --- a/reactos/lib/advapi32/service/eventlog.c +++ b/reactos/lib/advapi32/service/eventlog.c @@ -20,29 +20,24 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#define __USE_W32API -#define _WIN32_WINNT 0x0501 +#define NTOS_MODE_USER +#include +#include #include -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "winreg.h" -#include "wine/winternl.h" +#define NDEBUG +#include -#define YDEBUG -#include "wine/debug.h" - -WINE_DEFAULT_DEBUG_CHANNEL(advapi); -WINE_DECLARE_DEBUG_CHANNEL(eventlog); /****************************************************************************** * BackupEventLogA [ADVAPI32.@] */ -BOOL WINAPI BackupEventLogA( HANDLE hEventLog, LPCSTR lpBackupFileName ) +BOOL WINAPI +BackupEventLogA (HANDLE hEventLog, + LPCSTR lpBackupFileName) { - FIXME("stub\n"); - return TRUE; + DPRINT1("stub\n"); + return TRUE; } /****************************************************************************** @@ -53,39 +48,49 @@ BOOL WINAPI BackupEventLogA( HANDLE hEventLog, LPCSTR lpBackupFileName ) * lpBackupFileName [] */ BOOL WINAPI -BackupEventLogW( HANDLE hEventLog, LPCWSTR lpBackupFileName ) +BackupEventLogW (HANDLE hEventLog, + LPCWSTR lpBackupFileName) { - FIXME("stub\n"); - return TRUE; + DPRINT1("stub\n"); + return TRUE; } + /****************************************************************************** * ClearEventLogA [ADVAPI32.@] */ -BOOL WINAPI ClearEventLogA ( HANDLE hEventLog, LPCSTR lpBackupFileName ) +BOOL WINAPI +ClearEventLogA (HANDLE hEventLog, + LPCSTR lpBackupFileName) { - FIXME("stub\n"); - return TRUE; + DPRINT1("stub\n"); + return TRUE; } + /****************************************************************************** * ClearEventLogW [ADVAPI32.@] */ -BOOL WINAPI ClearEventLogW ( HANDLE hEventLog, LPCWSTR lpBackupFileName ) +BOOL WINAPI +ClearEventLogW (HANDLE hEventLog, + LPCWSTR lpBackupFileName) { - FIXME("stub\n"); - return TRUE; + DPRINT1("stub\n"); + return TRUE; } + /****************************************************************************** * CloseEventLog [ADVAPI32.@] */ -BOOL WINAPI CloseEventLog ( HANDLE hEventLog ) +BOOL WINAPI +CloseEventLog (HANDLE hEventLog) { - FIXME("stub\n"); - return TRUE; + DPRINT1("stub\n"); + return TRUE; } + /****************************************************************************** * DeregisterEventSource [ADVAPI32.@] * Closes a handle to the specified event log @@ -95,12 +100,14 @@ BOOL WINAPI CloseEventLog ( HANDLE hEventLog ) * * RETURNS STD */ -BOOL WINAPI DeregisterEventSource( HANDLE hEventLog ) +BOOL WINAPI +DeregisterEventSource (HANDLE hEventLog) { - FIXME("(%p): stub\n",hEventLog); - return TRUE; + DPRINT1("(%p): stub\n",hEventLog); + return TRUE; } + /****************************************************************************** * GetNumberOfEventLogRecords [ADVAPI32.@] * @@ -109,12 +116,14 @@ BOOL WINAPI DeregisterEventSource( HANDLE hEventLog ) * NumberOfRecords [] */ BOOL WINAPI -GetNumberOfEventLogRecords( HANDLE hEventLog, PDWORD NumberOfRecords ) +GetNumberOfEventLogRecords (HANDLE hEventLog, + PDWORD NumberOfRecords) { - FIXME("stub\n"); - return TRUE; + DPRINT1("stub\n"); + return TRUE; } + /****************************************************************************** * GetOldestEventLogRecord [ADVAPI32.@] * @@ -123,12 +132,14 @@ GetNumberOfEventLogRecords( HANDLE hEventLog, PDWORD NumberOfRecords ) * OldestRecord [] */ BOOL WINAPI -GetOldestEventLogRecord( HANDLE hEventLog, PDWORD OldestRecord ) +GetOldestEventLogRecord (HANDLE hEventLog, + PDWORD OldestRecord) { - FIXME(":stub\n"); - return TRUE; + DPRINT1("stub\n"); + return TRUE; } + /****************************************************************************** * NotifyChangeEventLog [ADVAPI32.@] * @@ -136,22 +147,27 @@ GetOldestEventLogRecord( HANDLE hEventLog, PDWORD OldestRecord ) * hEventLog [] * hEvent [] */ -BOOL WINAPI NotifyChangeEventLog( HANDLE hEventLog, HANDLE hEvent ) +BOOL WINAPI +NotifyChangeEventLog (HANDLE hEventLog, + HANDLE hEvent) { - FIXME("stub\n"); - return TRUE; + DPRINT1("stub\n"); + return TRUE; } + /****************************************************************************** * OpenBackupEventLogA [ADVAPI32.@] */ HANDLE WINAPI -OpenBackupEventLogA( LPCSTR lpUNCServerName, LPCSTR lpFileName ) +OpenBackupEventLogA (LPCSTR lpUNCServerName, + LPCSTR lpFileName) { - FIXME("stub\n"); - return (HANDLE)1; + DPRINT1("stub\n"); + return (HANDLE)1; } + /****************************************************************************** * OpenBackupEventLogW [ADVAPI32.@] * @@ -160,21 +176,27 @@ OpenBackupEventLogA( LPCSTR lpUNCServerName, LPCSTR lpFileName ) * lpFileName [] */ HANDLE WINAPI -OpenBackupEventLogW( LPCWSTR lpUNCServerName, LPCWSTR lpFileName ) +OpenBackupEventLogW (LPCWSTR lpUNCServerName, + LPCWSTR lpFileName) { - FIXME("stub\n"); - return (HANDLE)1; + DPRINT1("stub\n"); + return (HANDLE)1; } + /****************************************************************************** * OpenEventLogA [ADVAPI32.@] */ -HANDLE WINAPI OpenEventLogA(LPCSTR uncname,LPCSTR source) +HANDLE WINAPI +OpenEventLogA (LPCSTR lpUNCServerName, + LPCSTR lpSourceName) { - FIXME("(%s,%s),stub!\n",uncname,source); - return (HANDLE)0xcafe4242; + DPRINT1("(%s,%s),stub!\n", + lpUNCServerName, lpSourceName); + return (HANDLE)0xcafe4242; } + /****************************************************************************** * OpenEventLogW [ADVAPI32.@] * @@ -183,22 +205,31 @@ HANDLE WINAPI OpenEventLogA(LPCSTR uncname,LPCSTR source) * source [] */ HANDLE WINAPI -OpenEventLogW( LPCWSTR uncname, LPCWSTR source ) +OpenEventLogW (LPCWSTR lpUNCServerName, + LPCWSTR lpSourceName) { - FIXME("stub\n"); - return (HANDLE)1; + DPRINT1("stub\n"); + return (HANDLE)1; } + /****************************************************************************** * ReadEventLogA [ADVAPI32.@] */ -BOOL WINAPI ReadEventLogA( HANDLE hEventLog, DWORD dwReadFlags, DWORD dwRecordOffset, - LPVOID lpBuffer, DWORD nNumberOfBytesToRead, DWORD *pnBytesRead, DWORD *pnMinNumberOfBytesNeeded ) +BOOL WINAPI +ReadEventLogA (HANDLE hEventLog, + DWORD dwReadFlags, + DWORD dwRecordOffset, + LPVOID lpBuffer, + DWORD nNumberOfBytesToRead, + DWORD *pnBytesRead, + DWORD *pnMinNumberOfBytesNeeded) { - FIXME("stub\n"); - return TRUE; + DPRINT1("stub\n"); + return TRUE; } + /****************************************************************************** * ReadEventLogW [ADVAPI32.@] * @@ -212,31 +243,45 @@ BOOL WINAPI ReadEventLogA( HANDLE hEventLog, DWORD dwReadFlags, DWORD dwRecordOf * pnMinNumberOfBytesNeeded [] */ BOOL WINAPI -ReadEventLogW( HANDLE hEventLog, DWORD dwReadFlags, DWORD dwRecordOffset, - LPVOID lpBuffer, DWORD nNumberOfBytesToRead, - DWORD *pnBytesRead, DWORD *pnMinNumberOfBytesNeeded ) +ReadEventLogW (HANDLE hEventLog, + DWORD dwReadFlags, + DWORD dwRecordOffset, + LPVOID lpBuffer, + DWORD nNumberOfBytesToRead, + DWORD *pnBytesRead, + DWORD *pnMinNumberOfBytesNeeded) { - FIXME("stub\n"); - return TRUE; + DPRINT1("stub\n"); + return TRUE; } + /****************************************************************************** * RegisterEventSourceA [ADVAPI32.@] */ -HANDLE WINAPI RegisterEventSourceA( LPCSTR lpUNCServerName, LPCSTR lpSourceName ) +HANDLE WINAPI +RegisterEventSourceA (LPCSTR lpUNCServerName, + LPCSTR lpSourceName) { - - UNICODE_STRING lpUNCServerNameW; - UNICODE_STRING lpSourceNameW; - HANDLE ret; - RtlCreateUnicodeStringFromAsciiz(&lpUNCServerNameW, lpUNCServerName); - RtlCreateUnicodeStringFromAsciiz(&lpSourceNameW, lpSourceName); - ret = RegisterEventSourceW(lpUNCServerNameW.Buffer,lpSourceNameW.Buffer); - RtlFreeUnicodeString (&lpUNCServerNameW); - RtlFreeUnicodeString (&lpSourceNameW); - return ret; + UNICODE_STRING UNCServerName; + UNICODE_STRING SourceName; + HANDLE ret; + + RtlCreateUnicodeStringFromAsciiz (&UNCServerName, + (PSTR)lpUNCServerName); + RtlCreateUnicodeStringFromAsciiz (&SourceName, + (PSTR)lpSourceName); + + ret = RegisterEventSourceW (UNCServerName.Buffer, + SourceName.Buffer); + + RtlFreeUnicodeString (&UNCServerName); + RtlFreeUnicodeString (&SourceName); + + return ret; } + /****************************************************************************** * RegisterEventSourceW [ADVAPI32.@] * Returns a registered handle to an event log @@ -250,43 +295,79 @@ HANDLE WINAPI RegisterEventSourceA( LPCSTR lpUNCServerName, LPCSTR lpSourceName * Failure: NULL */ HANDLE WINAPI -RegisterEventSourceW( LPCWSTR lpUNCServerName, LPCWSTR lpSourceName ) +RegisterEventSourceW (LPCWSTR lpUNCServerName, + LPCWSTR lpSourceName) { - FIXME("(%s,%s): stub\n", debugstr_w(lpUNCServerName), - debugstr_w(lpSourceName)); - return (HANDLE)1; + DPRINT1("(%S, %S): stub\n", + lpUNCServerName, lpSourceName); + return (HANDLE)1; } + /****************************************************************************** * ReportEventA [ADVAPI32.@] */ -BOOL WINAPI ReportEventA ( HANDLE hEventLog, WORD wType, WORD wCategory, DWORD dwEventID, - PSID lpUserSid, WORD wNumStrings, DWORD dwDataSize, LPCSTR *lpStrings, LPVOID lpRawData) +BOOL WINAPI +ReportEventA (HANDLE hEventLog, + WORD wType, + WORD wCategory, + DWORD dwEventID, + PSID lpUserSid, + WORD wNumStrings, + DWORD dwDataSize, + LPCSTR *lpStrings, + LPVOID lpRawData) { - LPCWSTR *wideStrArray; - UNICODE_STRING str; - int i; - BOOL ret; + LPCWSTR *wideStrArray; + UNICODE_STRING str; + int i; + BOOL ret; - if (wNumStrings == 0) return TRUE; - if (!lpStrings) return TRUE; + if (wNumStrings == 0) + return TRUE; - wideStrArray = HeapAlloc(GetProcessHeap(), 0, sizeof(LPCWSTR) * wNumStrings); - for (i = 0; i < wNumStrings; i++) + if (lpStrings == NULL) + return TRUE; + + wideStrArray = HeapAlloc (GetProcessHeap (), + 0, + sizeof(LPCWSTR) * wNumStrings); + + for (i = 0; i < wNumStrings; i++) { - RtlCreateUnicodeStringFromAsciiz(&str, lpStrings[i]); + RtlCreateUnicodeStringFromAsciiz (&str, + (PSTR)lpStrings[i]); wideStrArray[i] = str.Buffer; } - ret = ReportEventW(hEventLog, wType, wCategory, dwEventID, lpUserSid, - wNumStrings, dwDataSize, wideStrArray, lpRawData); - for (i = 0; i < wNumStrings; i++) + + ret = ReportEventW (hEventLog, + wType, + wCategory, + dwEventID, + lpUserSid, + wNumStrings, + dwDataSize, + wideStrArray, + lpRawData); + + for (i = 0; i < wNumStrings; i++) { - if (wideStrArray[i]) HeapFree( GetProcessHeap(), 0, (LPSTR)wideStrArray[i] ); + if (wideStrArray[i]) + { + HeapFree (GetProcessHeap (), + 0, + (LPSTR)wideStrArray[i]); + } } - HeapFree(GetProcessHeap(), 0, wideStrArray); - return ret; + + HeapFree (GetProcessHeap(), + 0, + wideStrArray); + + return ret; } + /****************************************************************************** * ReportEventW [ADVAPI32.@] * @@ -302,35 +383,47 @@ BOOL WINAPI ReportEventA ( HANDLE hEventLog, WORD wType, WORD wCategory, DWORD d * lpRawData [] */ BOOL WINAPI -ReportEventW( HANDLE hEventLog, WORD wType, WORD wCategory, - DWORD dwEventID, PSID lpUserSid, WORD wNumStrings, - DWORD dwDataSize, LPCWSTR *lpStrings, LPVOID lpRawData ) +ReportEventW (HANDLE hEventLog, + WORD wType, + WORD wCategory, + DWORD dwEventID, + PSID lpUserSid, + WORD wNumStrings, + DWORD dwDataSize, + LPCWSTR *lpStrings, + LPVOID lpRawData) { - int i; + int i; /* partial stub */ - if (wNumStrings == 0) return TRUE; - if (!lpStrings) return TRUE; + if (wNumStrings == 0) + return TRUE; - for (i = 0; i < wNumStrings; i++) + if (lpStrings == NULL) + return TRUE; + + for (i = 0; i < wNumStrings; i++) { - switch (wType) + switch (wType) { case EVENTLOG_SUCCESS: - TRACE_(eventlog)("%s\n", debugstr_w(lpStrings[i])); + DPRINT1("Success: %S\n", lpStrings[i]); break; + case EVENTLOG_ERROR_TYPE: - ERR_(eventlog)("%s\n", debugstr_w(lpStrings[i])); + DPRINT1("Error: %S\n", lpStrings[i]); break; + case EVENTLOG_WARNING_TYPE: - WARN_(eventlog)("%s\n", debugstr_w(lpStrings[i])); + DPRINT1("Warning: %S\n", lpStrings[i]); break; + default: - TRACE_(eventlog)("%s\n", debugstr_w(lpStrings[i])); + DPRINT1("Type %hu: %S\n", wType, lpStrings[i]); break; } } - return TRUE; + return TRUE; } diff --git a/reactos/lib/advapi32/token/privilege.c b/reactos/lib/advapi32/token/privilege.c index f290550c675..0a904961a1d 100644 --- a/reactos/lib/advapi32/token/privilege.c +++ b/reactos/lib/advapi32/token/privilege.c @@ -1,4 +1,4 @@ -/* $Id: privilege.c,v 1.6 2004/02/25 14:25:11 ekohl Exp $ +/* $Id: privilege.c,v 1.7 2004/03/25 11:30:07 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -8,138 +8,11 @@ * UPDATE HISTORY: * 20010317 ea stubs */ + #include #include -/********************************************************************** - * LookupPrivilegeValueA EXPORTED - * - * @implemented - */ -BOOL STDCALL -LookupPrivilegeValueA (LPCSTR lpSystemName, - LPCSTR lpName, - PLUID lpLuid) -{ - UNICODE_STRING SystemName; - UNICODE_STRING Name; - BOOL Result; - - /* Remote system? */ - if (lpSystemName != NULL) - { - RtlCreateUnicodeStringFromAsciiz (&SystemName, - (LPSTR)lpSystemName); - } - - /* Check the privilege name is not NULL */ - if (lpName == NULL) - { - SetLastError (ERROR_INVALID_PARAMETER); - return FALSE; - } - - RtlCreateUnicodeStringFromAsciiz (&Name, - (LPSTR)lpName); - - Result = LookupPrivilegeValueW ((lpSystemName != NULL) ? SystemName.Buffer : NULL, - Name.Buffer, - lpLuid); - - RtlFreeUnicodeString (&Name); - - /* Remote system? */ - if (lpSystemName != NULL) - { - RtlFreeUnicodeString (&SystemName); - } - - return Result; -} - - -/********************************************************************** - * LookupPrivilegeValueW EXPORTED - * - * @unimplemented - */ -BOOL STDCALL -LookupPrivilegeValueW (LPCWSTR lpSystemName, - LPCWSTR lpName, - PLUID lpLuid) -{ - SetLastError (ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - -/********************************************************************** - * LookupPrivilegeDisplayNameA EXPORTED - * - * @unimplemented - */ -BOOL STDCALL -LookupPrivilegeDisplayNameA (LPCSTR lpSystemName, - LPCSTR lpName, - LPSTR lpDisplayName, - LPDWORD cbDisplayName, - LPDWORD lpLanguageId) -{ - SetLastError (ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - -/********************************************************************** - * LookupPrivilegeDisplayNameW EXPORTED - * - * @unimplemented - */ -BOOL STDCALL -LookupPrivilegeDisplayNameW (LPCWSTR lpSystemName, - LPCWSTR lpName, - LPWSTR lpDisplayName, - LPDWORD cbDisplayName, - LPDWORD lpLanguageId) -{ - SetLastError (ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - -/********************************************************************** - * LookupPrivilegeNameA EXPORTED - * - * @unimplemented - */ -BOOL STDCALL -LookupPrivilegeNameA (LPCSTR lpSystemName, - PLUID lpLuid, - LPSTR lpName, - LPDWORD cbName) -{ - SetLastError (ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - -/********************************************************************** - * LookupPrivilegeNameW EXPORTED - * - * @unimplemented - */ -BOOL STDCALL -LookupPrivilegeNameW (LPCWSTR lpSystemName, - PLUID lpLuid, - LPWSTR lpName, - LPDWORD cbName) -{ - SetLastError (ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - /********************************************************************** * PrivilegeCheck EXPORTED * diff --git a/reactos/lib/advapi32/token/token.c b/reactos/lib/advapi32/token/token.c index 2127c56d8a1..2d48b6d853e 100644 --- a/reactos/lib/advapi32/token/token.c +++ b/reactos/lib/advapi32/token/token.c @@ -1,4 +1,4 @@ -/* $Id: token.c,v 1.9 2004/02/25 14:25:11 ekohl Exp $ +/* $Id: token.c,v 1.10 2004/03/25 11:30:07 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -283,7 +283,7 @@ DuplicateToken (HANDLE ExistingTokenHandle, PHANDLE DuplicateTokenHandle) { return DuplicateTokenEx (ExistingTokenHandle, - TOKEN_DUPLICATE|TOKEN_IMPERSONATE|TOKEN_QUERY, + TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_QUERY, NULL, ImpersonationLevel, TokenImpersonation, From 95d5ae34d268ffa02643626c3b2ce76f4d745aa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Thu, 25 Mar 2004 11:40:41 +0000 Subject: [PATCH 0639/1463] Don't reserve space for empty menubar svn path=/trunk/; revision=8871 --- reactos/lib/user32/windows/nonclient.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/reactos/lib/user32/windows/nonclient.c b/reactos/lib/user32/windows/nonclient.c index 260edf495ee..6ee6d0de02b 100644 --- a/reactos/lib/user32/windows/nonclient.c +++ b/reactos/lib/user32/windows/nonclient.c @@ -506,7 +506,6 @@ DefWndNCCalcSize(HWND hWnd, BOOL CalcSizeStruct, RECT *Rect) if (!(Style & WS_MINIMIZE)) { - ULONG menuheight; HMENU menu = GetMenu(hWnd); UserGetWindowBorders(Style, ExStyle, &WindowBorders, FALSE); @@ -529,9 +528,8 @@ DefWndNCCalcSize(HWND hWnd, BOOL CalcSizeStruct, RECT *Rect) CliRect.right -= OrigRect.left; CliRect.left -= OrigRect.left; CliRect.top -= OrigRect.top; - menuheight = (ULONG)MenuDrawMenuBar(hDC, &CliRect, hWnd, TRUE); + Rect->top += MenuDrawMenuBar(hDC, &CliRect, hWnd, TRUE); ReleaseDC(hWnd, hDC); - Rect->top += max(menuheight, GetSystemMetrics(SM_CYMENU)); } } From a4c2f8ebd347669701660fefb0b3c12bed9fdc53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Thu, 25 Mar 2004 12:32:13 +0000 Subject: [PATCH 0640/1463] Make sure submenus are marked as popups svn path=/trunk/; revision=8872 --- reactos/subsys/win32k/ntuser/menu.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/ntuser/menu.c b/reactos/subsys/win32k/ntuser/menu.c index 7ddb4aeff23..1a3dc6d679e 100644 --- a/reactos/subsys/win32k/ntuser/menu.c +++ b/reactos/subsys/win32k/ntuser/menu.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: menu.c,v 1.51 2004/03/09 14:03:18 gvg Exp $ +/* $Id: menu.c,v 1.52 2004/03/25 12:32:13 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -707,6 +707,7 @@ IntSetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, PROSMENUITEMINF { PUNICODE_STRING Source; UINT copylen = 0; + PMENU_OBJECT SubMenuObject; if(!MenuItem || !MenuObject || !lpmii) { @@ -749,6 +750,16 @@ IntSetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, PROSMENUITEMINF if(lpmii->fMask & MIIM_SUBMENU) { MenuItem->hSubMenu = lpmii->hSubMenu; + /* Make sure the submenu is marked as a popup menu */ + if (0 != (MenuItem->fType & MF_POPUP)) + { + SubMenuObject = IntGetMenuObject(MenuItem->hSubMenu); + if (NULL != SubMenuObject) + { + SubMenuObject->MenuInfo.Flags |= MF_POPUP; + IntReleaseMenuObject(SubMenuObject); + } + } } if((lpmii->fMask & (MIIM_TYPE | MIIM_STRING)) && (MENU_ITEM_TYPE(lpmii->fType) == MF_STRING)) From fcc80b75881320e72521d0986c890ca2fe7ab13c Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Thu, 25 Mar 2004 15:16:42 +0000 Subject: [PATCH 0641/1463] added missing .cvsignore file svn path=/trunk/; revision=8873 --- reactos/lib/expat/.cvsignore | 8 ++++++++ reactos/lib/expat/lib/.cvsignore | 8 ++++++++ 2 files changed, 16 insertions(+) create mode 100644 reactos/lib/expat/.cvsignore create mode 100644 reactos/lib/expat/lib/.cvsignore diff --git a/reactos/lib/expat/.cvsignore b/reactos/lib/expat/.cvsignore new file mode 100644 index 00000000000..9103a525d39 --- /dev/null +++ b/reactos/lib/expat/.cvsignore @@ -0,0 +1,8 @@ +*.coff +*.dll +*.d +*.a +*.o +*.sym +*.map +*.tmp diff --git a/reactos/lib/expat/lib/.cvsignore b/reactos/lib/expat/lib/.cvsignore new file mode 100644 index 00000000000..9103a525d39 --- /dev/null +++ b/reactos/lib/expat/lib/.cvsignore @@ -0,0 +1,8 @@ +*.coff +*.dll +*.d +*.a +*.o +*.sym +*.map +*.tmp From 1589b3aa3a87fc260e1c9e7711f0edc03a762deb Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Thu, 25 Mar 2004 18:02:56 +0000 Subject: [PATCH 0642/1463] add original .cvsignore entries svn path=/trunk/; revision=8874 --- reactos/lib/expat/lib/.cvsignore | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/reactos/lib/expat/lib/.cvsignore b/reactos/lib/expat/lib/.cvsignore index 9103a525d39..1441524f947 100644 --- a/reactos/lib/expat/lib/.cvsignore +++ b/reactos/lib/expat/lib/.cvsignore @@ -1,3 +1,21 @@ +Makefile +.libs +*.lo +expat.h +Debug +Debug-w +Release +Release-w +expat.ncb +expat.opt +expat.plg +Debug_static +Debug-w_static +Release_static +Release-w_static +expat_static.plg +expatw.plg +expatw_static.plg *.coff *.dll *.d From b2221ecb044c52c31258ac38d144df2644a8a668 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Fri, 26 Mar 2004 21:20:30 +0000 Subject: [PATCH 0643/1463] add original .cvsignore entries svn path=/trunk/; revision=8875 --- reactos/lib/expat/.cvsignore | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/reactos/lib/expat/.cvsignore b/reactos/lib/expat/.cvsignore index 9103a525d39..b747ce41195 100644 --- a/reactos/lib/expat/.cvsignore +++ b/reactos/lib/expat/.cvsignore @@ -1,8 +1,15 @@ -*.coff -*.dll -*.d -*.a -*.o -*.sym +Makefile +.libs +*.la +configure +config.cache +config.log +config.status +expat_config.h.in +expat_config.h +libtool +expat.ncb +expat.opt +libexpat.dll *.map -*.tmp +*.dll From c84ea8d62e07e519f4f1efc2ecfcb66e6dce5cc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Fri, 26 Mar 2004 23:01:44 +0000 Subject: [PATCH 0644/1463] libexpat.dll was moved svn path=/trunk/; revision=8876 --- reactos/bootdata/packages/reactos.dff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/bootdata/packages/reactos.dff b/reactos/bootdata/packages/reactos.dff index 434e7c7d32d..995edd40a1d 100755 --- a/reactos/bootdata/packages/reactos.dff +++ b/reactos/bootdata/packages/reactos.dff @@ -52,6 +52,7 @@ lib\cards\cards.dll 1 lib\comctl32\comctl32.dll 1 lib\comdlg32\comdlg32.dll 1 lib\crtdll\crtdll.dll 1 +lib\expat\libexpat.dll 1 lib\fmifs\fmifs.dll 1 lib\freetype\freetype.dll 1 lib\gdi32\gdi32.dll 1 @@ -97,7 +98,6 @@ subsys\system\autochk\autochk.exe 1 subsys\system\cmd\cmd.exe 1 subsys\system\explorer\explorer.exe 4 subsys\system\explorer\notifyhook.dll 1 -subsys\system\explorer\libexpat.dll 1 subsys\system\format\format.exe 1 subsys\system\regedit\regedit.exe 4 subsys\system\services\services.exe 1 From 367dea79d9768fef589d017b03dcaa081ddbd8a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Fri, 26 Mar 2004 23:13:58 +0000 Subject: [PATCH 0645/1463] Add riched32.dll svn path=/trunk/; revision=8877 --- 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 995edd40a1d..4320c969e3e 100755 --- a/reactos/bootdata/packages/reactos.dff +++ b/reactos/bootdata/packages/reactos.dff @@ -71,6 +71,7 @@ lib\msvcrt20\msvcrt20.dll 1 lib\ntdll\ntdll.dll 1 lib\ole32\ole32.dll 1 lib\oleaut32\oleaut32.dll 1 +lib\richedit\riched32.dll 1 lib\rpcrt4\rpcrt4.dll 1 lib\samlib\samlib.dll 1 lib\secur32\secur32.dll 1 From bf9c49bb8b91956feaa6383dce263032fa1f7bd3 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Fri, 26 Mar 2004 23:48:47 +0000 Subject: [PATCH 0646/1463] little speed-up svn path=/trunk/; revision=8878 --- reactos/subsys/win32k/dib/dib16bpp.c | 8 ++++---- reactos/subsys/win32k/dib/dib32bpp.c | 10 +++++----- reactos/subsys/win32k/dib/dib8bpp.c | 8 ++++---- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib16bpp.c b/reactos/subsys/win32k/dib/dib16bpp.c index efb81a620c0..a9abbe97c8f 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.19 2004/02/19 09:31:30 fireball Exp $ */ +/* $Id: dib16bpp.c,v 1.20 2004/03/26 23:48:47 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -393,7 +393,7 @@ void ScaleLineAvg16(PIXEL *Target, PIXEL *Source, int SrcWidth, int TgtWidth) int NumPixels = TgtWidth; int IntPart = SrcWidth / TgtWidth; int FractPart = SrcWidth % TgtWidth; - int Mid = TgtWidth / 2; + int Mid = TgtWidth >> 1; int E = 0; int skip; PIXEL p; @@ -422,9 +422,9 @@ void ScaleRectAvg16(PIXEL *Target, PIXEL *Source, int SrcWidth, int SrcHeight, int TgtWidth, int TgtHeight, int srcPitch, int dstPitch) { int NumPixels = TgtHeight; - int IntPart = ((SrcHeight / TgtHeight) * srcPitch) / 2; //(SrcHeight / TgtHeight) * SrcWidth; + int IntPart = ((SrcHeight / TgtHeight) * srcPitch) >> 1; //(SrcHeight / TgtHeight) * SrcWidth; int FractPart = SrcHeight % TgtHeight; - int Mid = TgtHeight / 2; + int Mid = TgtHeight >> 1; int E = 0; int skip; PIXEL *ScanLine, *ScanLineAhead; diff --git a/reactos/subsys/win32k/dib/dib32bpp.c b/reactos/subsys/win32k/dib/dib32bpp.c index 63e40058aac..500b878ee5a 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.12 2004/02/21 09:06:25 navaraf Exp $ */ +/* $Id: dib32bpp.c,v 1.13 2004/03/26 23:48:47 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -64,7 +64,7 @@ DIB_32BPP_VLine(PSURFOBJ SurfObj, LONG x, LONG y1, LONG y2, ULONG c) { PBYTE byteaddr = SurfObj->pvScan0 + y1 * SurfObj->lDelta; PDWORD addr = (PDWORD)byteaddr + x; - LONG lDelta = SurfObj->lDelta / sizeof(DWORD); + LONG lDelta = SurfObj->lDelta >> 2; /* >> 2 == / sizeof(DWORD) */ byteaddr = (PBYTE)addr; while(y1++ < y2) { @@ -309,7 +309,7 @@ void ScaleLineAvg32(PIXEL *Target, PIXEL *Source, int SrcWidth, int TgtWidth) int NumPixels = TgtWidth; int IntPart = SrcWidth / TgtWidth; int FractPart = SrcWidth % TgtWidth; - int Mid = TgtWidth / 2; + int Mid = TgtWidth >> 1; int E = 0; int skip; PIXEL p; @@ -338,9 +338,9 @@ void ScaleRectAvg32(PIXEL *Target, PIXEL *Source, int SrcWidth, int SrcHeight, int TgtWidth, int TgtHeight, int srcPitch, int dstPitch) { int NumPixels = TgtHeight; - int IntPart = ((SrcHeight / TgtHeight) * srcPitch) / 2; //(SrcHeight / TgtHeight) * SrcWidth; + int IntPart = ((SrcHeight / TgtHeight) * srcPitch) >> 1; //(SrcHeight / TgtHeight) * SrcWidth; int FractPart = SrcHeight % TgtHeight; - int Mid = TgtHeight / 2; + int Mid = TgtHeight >> 1; int E = 0; int skip; PIXEL *ScanLine, *ScanLineAhead; diff --git a/reactos/subsys/win32k/dib/dib8bpp.c b/reactos/subsys/win32k/dib/dib8bpp.c index 20727dd46bb..dcea5c29e1d 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.14 2004/02/21 09:06:25 navaraf Exp $ */ +/* $Id: dib8bpp.c,v 1.15 2004/03/26 23:48:47 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -364,7 +364,7 @@ void ScaleLineAvg8(PIXEL *Target, PIXEL *Source, int SrcWidth, int TgtWidth) int NumPixels = TgtWidth; int IntPart = SrcWidth / TgtWidth; int FractPart = SrcWidth % TgtWidth; - int Mid = TgtWidth / 2; + int Mid = TgtWidth >> 1; int E = 0; int skip; PIXEL p; @@ -393,9 +393,9 @@ void ScaleRectAvg8(PIXEL *Target, PIXEL *Source, int SrcWidth, int SrcHeight, int TgtWidth, int TgtHeight, int srcPitch, int dstPitch) { int NumPixels = TgtHeight; - int IntPart = ((SrcHeight / TgtHeight) * srcPitch) / 2; //(SrcHeight / TgtHeight) * SrcWidth; + int IntPart = ((SrcHeight / TgtHeight) * srcPitch) >> 1; //(SrcHeight / TgtHeight) * SrcWidth; int FractPart = SrcHeight % TgtHeight; - int Mid = TgtHeight / 2; + int Mid = TgtHeight >> 1; int E = 0; int skip; PIXEL *ScanLine, *ScanLineAhead; From 3868dbd0a013295db162a32364443756a960fe47 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 27 Mar 2004 00:35:02 +0000 Subject: [PATCH 0647/1463] a few more minor speed-up svn path=/trunk/; revision=8879 --- reactos/subsys/win32k/eng/lineto.c | 10 +++++----- reactos/subsys/win32k/objects/bezier.c | 6 +++--- reactos/subsys/win32k/objects/color.c | 4 ++-- reactos/subsys/win32k/objects/dib.c | 14 +++++++------- reactos/subsys/win32k/objects/fillshap.c | 20 ++++++++++---------- reactos/subsys/win32k/objects/palette.c | 4 ++-- reactos/subsys/win32k/objects/text.c | 8 ++++---- 7 files changed, 33 insertions(+), 33 deletions(-) diff --git a/reactos/subsys/win32k/eng/lineto.c b/reactos/subsys/win32k/eng/lineto.c index b99d5cd1737..00dcb8ff430 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.30 2004/02/24 13:27:02 weiden Exp $ + * $Id: lineto.c,v 1.31 2004/03/27 00:35:02 weiden Exp $ */ #include @@ -72,7 +72,7 @@ NWtoSE(SURFOBJ* OutputObj, SURFGDI* OutputGDI, CLIPOBJ* Clip, ClipRect = RectEnum.arcl; delta = max(deltax, deltay); i = 0; - error = delta / 2; + error = delta >> 1; while (i < delta && (ClipRect < RectEnum.arcl + RectEnum.c || EnumMore)) { while ((ClipRect < RectEnum.arcl + RectEnum.c /* there's still a current clip rect */ @@ -142,7 +142,7 @@ SWtoNE(SURFOBJ* OutputObj, SURFGDI* OutputGDI, CLIPOBJ* Clip, ClipRect = RectEnum.arcl; delta = max(deltax, deltay); i = 0; - error = delta / 2; + error = delta >> 1; while (i < delta && (ClipRect < RectEnum.arcl + RectEnum.c || EnumMore)) { while ((ClipRect < RectEnum.arcl + RectEnum.c @@ -211,7 +211,7 @@ NEtoSW(SURFOBJ* OutputObj, SURFGDI* OutputGDI, CLIPOBJ* Clip, ClipRect = RectEnum.arcl; delta = max(deltax, deltay); i = 0; - error = delta / 2; + error = delta >> 1; while (i < delta && (ClipRect < RectEnum.arcl + RectEnum.c || EnumMore)) { while ((ClipRect < RectEnum.arcl + RectEnum.c @@ -280,7 +280,7 @@ SEtoNW(SURFOBJ* OutputObj, SURFGDI* OutputGDI, CLIPOBJ* Clip, ClipRect = RectEnum.arcl; delta = max(deltax, deltay); i = 0; - error = delta / 2; + error = delta >> 1; while (i < delta && (ClipRect < RectEnum.arcl + RectEnum.c || EnumMore)) { while ((ClipRect < RectEnum.arcl + RectEnum.c diff --git a/reactos/subsys/win32k/objects/bezier.c b/reactos/subsys/win32k/objects/bezier.c index edf7c4e65ae..896bd785efb 100644 --- a/reactos/subsys/win32k/objects/bezier.c +++ b/reactos/subsys/win32k/objects/bezier.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: bezier.c,v 1.5 2004/02/19 21:12:10 weiden Exp $ */ +/* $Id: bezier.c,v 1.6 2004/03/27 00:35:02 weiden Exp $ */ #include #include #include @@ -62,8 +62,8 @@ * */ #define BEZIERMIDDLE(Mid, P1, P2) \ - (Mid).x=((P1).x+(P2).x + 1)/2;\ - (Mid).y=((P1).y+(P2).y + 1)/2; + (Mid).x=((P1).x+(P2).x + 1) >> 1;\ + (Mid).y=((P1).y+(P2).y + 1) >> 1; static int abs ( int __x ) { diff --git a/reactos/subsys/win32k/objects/color.c b/reactos/subsys/win32k/objects/color.c index 22599ca7aeb..24c3511d8f4 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.34 2004/02/24 13:27:03 weiden Exp $ */ +/* $Id: color.c,v 1.35 2004/03/27 00:35:02 weiden Exp $ */ // FIXME: Use PXLATEOBJ logicalToSystem instead of int *mapping @@ -120,7 +120,7 @@ HPALETTE STDCALL NtGdiCreateHalftonePalette(HDC hDC) for (i = 216; i < 246; i++) { - int v = (i - 216) * 8; + int v = (i - 216) << 3; Palette.aEntries[i].peRed = v; Palette.aEntries[i].peGreen = v; Palette.aEntries[i].peBlue = v; diff --git a/reactos/subsys/win32k/objects/dib.c b/reactos/subsys/win32k/objects/dib.c index b45b63dcfd7..6aa161d5c80 100644 --- a/reactos/subsys/win32k/objects/dib.c +++ b/reactos/subsys/win32k/objects/dib.c @@ -1,5 +1,5 @@ /* - * $Id: dib.c,v 1.43 2004/03/15 22:06:55 gvg Exp $ + * $Id: dib.c,v 1.44 2004/03/27 00:35:02 weiden Exp $ * * ReactOS W32 Subsystem * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team @@ -1190,12 +1190,12 @@ INT FASTCALL DIB_GetDIBWidthBytes (INT width, INT depth) switch(depth) { - case 1: words = (width + 31) / 32; break; - case 4: words = (width + 7) / 8; break; - case 8: words = (width + 3) / 4; break; + case 1: words = (width + 31) >> 5; break; + case 4: words = (width + 7) >> 3; break; + case 8: words = (width + 3) >> 2; break; case 15: - case 16: words = (width + 1) / 2; break; - case 24: words = (width * 3 + 3)/4; break; + case 16: words = (width + 1) >> 1; break; + case 24: words = (width * 3 + 3) >> 2; break; default: DPRINT("(%d): Unsupported depth\n", depth ); @@ -1203,7 +1203,7 @@ INT FASTCALL DIB_GetDIBWidthBytes (INT width, INT depth) case 32: words = width; } - return 4 * words; + return words << 2; } /*********************************************************************** diff --git a/reactos/subsys/win32k/objects/fillshap.c b/reactos/subsys/win32k/objects/fillshap.c index 09b52bfa761..12dc3e8b5d3 100644 --- a/reactos/subsys/win32k/objects/fillshap.c +++ b/reactos/subsys/win32k/objects/fillshap.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: fillshap.c,v 1.44 2004/03/04 01:50:26 royce Exp $ */ +/* $Id: fillshap.c,v 1.45 2004/03/27 00:35:02 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include @@ -435,7 +435,7 @@ CirclePoints(UINT *PointCount, PSHAPEPOINT ShapePoints, int Left, int Top, Even = (0 == (Right - Left) % 2); Right--; Bottom--; - Radius = (Right - Left) / 2; + Radius = (Right - Left) >> 1; if (Even) { @@ -443,8 +443,8 @@ CirclePoints(UINT *PointCount, PSHAPEPOINT ShapePoints, int Left, int Top, Y = Radius; d = 2 - Radius; X18 = Right; - X27 = (Left + Right) / 2 + 1; - X36 = (Left + Right) / 2; + X27 = ((Left + Right) >> 1) + 1; + X36 = (Left + Right) >> 1; X45 = Left; Y14 = Top + Radius; Y23 = Top; @@ -466,8 +466,8 @@ CirclePoints(UINT *PointCount, PSHAPEPOINT ShapePoints, int Left, int Top, Y = Radius; d = 1 - Radius; X18 = Right; - X27 = (Left + Right) / 2; - X36 = (Left + Right) / 2; + X27 = (Left + Right) >> 1; + X36 = (Left + Right) >> 1; X45 = Left; Y14 = Top + Radius; Y23 = Top; @@ -483,7 +483,7 @@ CirclePoints(UINT *PointCount, PSHAPEPOINT ShapePoints, int Left, int Top, { if (d < 0) { - d += 2 * X + (Even ? 4 : 3); + d += (X << 1) + (Even ? 4 : 3); X27++; X36--; @@ -492,7 +492,7 @@ CirclePoints(UINT *PointCount, PSHAPEPOINT ShapePoints, int Left, int Top, } else { - d += 2 * (X - Y) + 5; + d += ((X - Y) << 1) + 5; Y--; Y23++; @@ -524,8 +524,8 @@ LinePoints(UINT *PointCount, PSHAPEPOINT ShapePoints, int Left, int Top, LONG x, y, deltax, deltay, i, xchange, ychange, error; int Type; - x = (Right + Left) / 2; - y = (Bottom + Top) / 2; + x = (Right + Left) >> 1; + y = (Bottom + Top) >> 1; deltax = XTo - x; deltay = YTo - y; diff --git a/reactos/subsys/win32k/objects/palette.c b/reactos/subsys/win32k/objects/palette.c index 64f7279c6ee..2ed449cf537 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.15 2004/02/19 21:12:10 weiden Exp $ */ +/* $Id: palette.c,v 1.16 2004/03/27 00:35:02 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include @@ -158,7 +158,7 @@ static void FASTCALL PALETTE_FormatSystemPalette(void) int i, j = PALETTE_firstFree = NB_RESERVED_COLORS/2; COLOR_sysPal[j].peFlags = 0; - for(i = NB_RESERVED_COLORS/2 + 1 ; i < 256 - NB_RESERVED_COLORS/2 ; i++) + for(i = (NB_RESERVED_COLORS>>1) + 1 ; i < 256 - (NB_RESERVED_COLORS>>1) ; i++) { if( i < COLOR_gapStart || i > COLOR_gapEnd ) { diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index 450e7118899..f6899c0e9e5 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.84 2004/03/23 19:46:50 gvg Exp $ */ +/* $Id: text.c,v 1.85 2004/03/27 00:35:02 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -743,14 +743,14 @@ IntGetOutlineTextMetrics(PFONTGDI FontGDI, UINT Size, } else { - Needed += FamilyNameW.Length + StyleNameW.Length + 2 * sizeof(WCHAR); /* family + " " + style */ + Needed += FamilyNameW.Length + StyleNameW.Length + (sizeof(WCHAR) << 1); /* family + " " + style */ } /* length of otmpStyleName */ Needed += StyleNameW.Length + sizeof(WCHAR); /* length of otmpFullName */ - Needed += FamilyNameW.Length + StyleNameW.Length + 2 * sizeof(WCHAR); + Needed += FamilyNameW.Length + StyleNameW.Length + (sizeof(WCHAR) << 1); if (Size < Needed) { @@ -946,7 +946,7 @@ IntGetOutlineTextMetrics(PFONTGDI FontGDI, UINT Size, { wcscat((WCHAR*) Cp, L" "); wcscat((WCHAR*) Cp, StyleNameW.Buffer); - Cp += FamilyNameW.Length + StyleNameW.Length + 2 * sizeof(WCHAR); + Cp += FamilyNameW.Length + StyleNameW.Length + (sizeof(WCHAR) << 1); } else { From fa4663f158cd9e57db5485124b115185077cfa1a Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Sat, 27 Mar 2004 04:33:15 +0000 Subject: [PATCH 0648/1463] Define TOPDIR to . if not defined (for make bootcd) svn path=/trunk/; revision=8880 --- reactos/rules.mak | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/reactos/rules.mak b/reactos/rules.mak index f51874b828b..77ca54111cc 100644 --- a/reactos/rules.mak +++ b/reactos/rules.mak @@ -48,6 +48,10 @@ SEP := \$(EMPTY_VAR) PIPE := -pipe endif +# Sane TOPDIR for toplevel makefile +ifeq ($(TOPDIR),) +TOPDIR = . +endif # Use environment var ROS_INSTALL to override default install dir ifeq ($(ROS_INSTALL),) @@ -133,4 +137,4 @@ OS2_PATH_INC=$(OS2_PATH)/include # Other systems integration ROOT_PATH=$(PATH_TO_TOP)/.. -REGTESTS_PATH_INC=$(PATH_TO_TOP)/regtests/shared \ No newline at end of file +REGTESTS_PATH_INC=$(PATH_TO_TOP)/regtests/shared From 2673c9cd5ee31e8dec24cac67038ab64715c7024 Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Sat, 27 Mar 2004 06:23:37 +0000 Subject: [PATCH 0649/1463] Fixed make bootcd on windows and cross. svn path=/trunk/; revision=8881 --- reactos/ChangeLog | 4 ++++ reactos/rules.mak | 7 +++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/reactos/ChangeLog b/reactos/ChangeLog index 1f03662603e..1b490475bf9 100644 --- a/reactos/ChangeLog +++ b/reactos/ChangeLog @@ -1,3 +1,7 @@ +2004-03-27 Art Yerkes + + * Fixed make bootcd on windows + cross. Define TOPDIR as PATH_TO_TOP + 2004-03-10 Casper S. Hornstrup * subsys/system/usetup/bootsup.c (UpdateFreeLoaderIni): Use existing diff --git a/reactos/rules.mak b/reactos/rules.mak index 77ca54111cc..f8e6dedb250 100644 --- a/reactos/rules.mak +++ b/reactos/rules.mak @@ -48,10 +48,9 @@ SEP := \$(EMPTY_VAR) PIPE := -pipe endif -# Sane TOPDIR for toplevel makefile -ifeq ($(TOPDIR),) -TOPDIR = . -endif +# TOPDIR is used by make bootcd but not defined anywhere. Usurp pointed out +# that it has the same meaning as PATH_TO_TOP. +TOPDIR = $(PATH_TO_TOP) # Use environment var ROS_INSTALL to override default install dir ifeq ($(ROS_INSTALL),) From 63c5fcc117bb5cf1e2b01cfe44fd697cc9389f9b Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sat, 27 Mar 2004 09:07:42 +0000 Subject: [PATCH 0650/1463] merge Wine commit: Martin Fuchs - Fix handling of %2, %3, ... and lower case format characters in SHELL_ArgifyW(). - Move "%I" expansion from ShellExecuteEx() into common function SHELL_ArgifyW(). - Pass buffer length to SHELL_FindExecutable(). - FIXME comment for len paramater in SHELL_ArgifyW(). Ge van Geldorp - Add double quotation marks unless we already have them (e.g.: "%1" %* for exefile). - Remove unnecessary double quotation marks and command line arguments. Patch: http://cvs.winehq.org/patch.py?id=11706 svn path=/trunk/; revision=8882 --- reactos/lib/shell32/shlexec.c | 114 ++++++++++++++++++---------------- 1 file changed, 59 insertions(+), 55 deletions(-) diff --git a/reactos/lib/shell32/shlexec.c b/reactos/lib/shell32/shlexec.c index 8b47d8bdf57..2d618092447 100644 --- a/reactos/lib/shell32/shlexec.c +++ b/reactos/lib/shell32/shlexec.c @@ -82,31 +82,31 @@ static BOOL SHELL_ArgifyW(WCHAR* out, int len, const WCHAR* fmt, const WCHAR* lp { WCHAR xlpFile[1024]; BOOL done = FALSE; - LPVOID pv; PWSTR res = out; PCWSTR cmd; + LPVOID pv; while (*fmt) { - if (*fmt == '%') - { - switch (*++fmt) - { - case '\0': - case '%': - *res++ = '%'; - break; + if (*fmt == '%') + { + switch (*++fmt) + { + case '\0': + case '%': + *res++ = '%'; + break; - case '2': - case '3': + case '2': + case '3': case '4': case '5': - case '6': - case '7': + case '6': + case '7': case '8': case '9': case '0': - case '*': + case '*': if (args) { if (*fmt == '*') @@ -124,64 +124,65 @@ static BOOL SHELL_ArgifyW(WCHAR* out, int len, const WCHAR* fmt, const WCHAR* lp while(isspace(*args)) ++args; } + break; } - else + /* else fall through */ + case '1': + if (!done || (*fmt == '1')) { - case '1': - if (!done || (*fmt == '1')) - { - /*FIXME Is the call to SearchPathW() really needed? We already have separated out the parameter string in args. */ - if (SearchPathW(NULL, lpFile, wszExe, sizeof(xlpFile)/sizeof(WCHAR), xlpFile, NULL)) - cmd = xlpFile; - else - cmd = lpFile; + /*FIXME Is the call to SearchPathW() really needed? We already have separated out the parameter string in args. */ + if (SearchPathW(NULL, lpFile, wszExe, sizeof(xlpFile)/sizeof(WCHAR), xlpFile, NULL)) + cmd = xlpFile; + else + cmd = lpFile; - /* Add double quotation marks unless we already have them (e.g.: "%1" %* for exefile) */ - if (res != out && *(res - 1) == '"') - { - strcpyW(res, cmd); - res += strlenW(cmd); - } - else - { - strcpyW(res, cmd); - res += strlenW(cmd); - } + /* Add double quotation marks unless we already have them (e.g.: "%1" %* for exefile) */ + if (res==out || res[-1]!='"') + { + *res++ = '"'; + strcpyW(res, cmd); + res += strlenW(cmd); + *res++ = '"'; + } + else + { + strcpyW(res, cmd); + res += strlenW(cmd); } } - break; + break; - /* - * IE uses this alot for activating things such as windows media - * player. This is not verified to be fully correct but it appears - * to work just fine. - */ - case 'l': - case 'L': + /* + * IE uses this alot for activating things such as windows media + * player. This is not verified to be fully correct but it appears + * to work just fine. + */ + case 'l': + case 'L': if (lpFile) { strcpyW(res, lpFile); res += strlenW(lpFile); } - break; + break; - case 'i': - case 'I': + case 'i': + case 'I': if (pidl) { HGLOBAL hmem = SHAllocShared(pidl, ILGetSize(pidl), 0); pv = SHLockShared(hmem, 0); res += sprintfW(res, wszILPtr, pv); SHUnlockShared(pv); } - break; + break; - default: FIXME("Unknown escape sequence %%%c\n", *fmt); - } + default: FIXME("Unknown escape sequence %%%c\n", *fmt); + } - fmt++; - done = TRUE; - } - else - *res++ = *fmt++; + fmt++; + done = TRUE; + } + else + *res++ = *fmt++; } *res = '\0'; @@ -804,7 +805,7 @@ static unsigned dde_connect(WCHAR * key, WCHAR* start, WCHAR* ddeexec, TRACE("Couldn't connect. ret=%d\n", ret); DdeUninitialize(ddeInst); SetLastError(ERROR_DDE_FAIL); - return ret = 30; /* whatever */ + return 30; /* whatever */ } strcpyW(endkey, wIfexec); ifexeclen = sizeof(ifexec); @@ -820,8 +821,10 @@ static unsigned dde_connect(WCHAR * key, WCHAR* start, WCHAR* ddeexec, ret = (DdeClientTransaction((LPBYTE)res, (strlenW(res) + 1) * sizeof(WCHAR), hConv, 0L, 0, XTYP_EXECUTE, 10000, &tid) != DMLERR_NO_ERROR) ? 31 : 33; DdeDisconnect(hConv); + error: DdeUninitialize(ddeInst); + return ret; } @@ -943,8 +946,9 @@ BOOL WINAPI ShellExecuteExW32 (LPSHELLEXECUTEINFOW psei, SHELL_ExecuteW32 execfu static const WCHAR wExtLnk[] = {'.','l','n','k',0}; static const WCHAR wExplorer[] = {'e','x','p','l','o','r','e','r','.','e','x','e',0}; - WCHAR wszApplicationName[MAX_PATH+2], wszParameters[1024], wfileName[MAX_PATH], wszDir[MAX_PATH]; + WCHAR wszApplicationName[MAX_PATH+2], wszParameters[1024], wszDir[MAX_PATH]; SHELLEXECUTEINFOW sei_tmp; /* modifyable copy of SHELLEXECUTEINFO struct */ + WCHAR wfileName[MAX_PATH]; void *env; WCHAR wszProtocol[256]; LPCWSTR lpFile; From 9477018084dab387e98b4952f8fcc0c0c25ac959 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sat, 27 Mar 2004 09:08:10 +0000 Subject: [PATCH 0651/1463] merge Wine commit: Modified files: dlls/shell32 : shellole.c shell32_main.h pidl.h pidl.c folders.c enumidlist.c control.c Makefile.in Added files: dlls/shell32 : cpanelfolder.c cpanel.h Log message: Martin Fuchs Implementation of the control panel folder in shell namespace. Patch: http://cvs.winehq.org/patch.py?id=11721 svn path=/trunk/; revision=8883 --- reactos/lib/shell32/Makefile.in | 10 +++++----- reactos/lib/shell32/control.c | 3 +-- reactos/lib/shell32/{control.h => cpanel.h} | 4 ++++ reactos/lib/shell32/{shlcpanel.c => cpanelfolder.c} | 5 ++--- reactos/lib/shell32/enumidlist.c | 2 +- reactos/lib/shell32/iconcache.c | 2 +- 6 files changed, 14 insertions(+), 12 deletions(-) rename reactos/lib/shell32/{control.h => cpanel.h} (93%) rename reactos/lib/shell32/{shlcpanel.c => cpanelfolder.c} (99%) diff --git a/reactos/lib/shell32/Makefile.in b/reactos/lib/shell32/Makefile.in index bcb64c467e9..d74b19313c5 100644 --- a/reactos/lib/shell32/Makefile.in +++ b/reactos/lib/shell32/Makefile.in @@ -5,7 +5,7 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = shell32.dll # fixme: avoid ole32.dll import -IMPORTS = ole32 shlwapi comctl32 user32 gdi32 advapi32 kernel32 ntdll +IMPORTS = ole32 shlwapi comctl32 user32 gdi32 advapi32 kernel32 ALTNAMES = shell.dll EXTRALIBS = $(LIBUUID) $(LIBUNICODE) @@ -18,6 +18,7 @@ C_SRCS = \ classes.c \ clipboard.c \ control.c \ + cpanelfolder.c \ dataobject.c \ debughlp.c \ dialogs.c \ @@ -47,8 +48,7 @@ C_SRCS = \ shpolicy.c \ shv_bg_cmenu.c \ shv_item_cmenu.c \ - ros-systray.c \ - shlcpanel.c + ros-systray.c RC_SRCS = shres.rc version.rc RC_BINSRC = shres.rc @@ -73,10 +73,10 @@ version16.res: version16.rc $(LDPATH) $(RC16) $(RC16FLAGS) -fo$@ $(SRCDIR)/version16.rc shell.spec.c: shell.spec version16.res - $(WINEBUILD) $(DEFS) $(DLLFLAGS) -o $@ --main-module $(MODULE) --res version16.res --spec $(SRCDIR)/shell.spec + $(WINEBUILD) $(DEFS) $(DLLFLAGS) -o $@ --main-module $(MODULE) --res version16.res --dll $(SRCDIR)/shell.spec authors.c: $(TOPSRCDIR)/AUTHORS - (LANG=C; echo 'const char * const SHELL_Authors[] = {' && \ + (LC_ALL=C; export LC_ALL; echo 'const char * const SHELL_Authors[] = {' && \ sed -e '1,2d' -e 's/\(.*\)/ \"\1\",/' $(TOPSRCDIR)/AUTHORS && \ echo ' 0 };') >$@ || ($(RM) $@ && false) diff --git a/reactos/lib/shell32/control.c b/reactos/lib/shell32/control.c index d040273071b..72c697742a6 100644 --- a/reactos/lib/shell32/control.c +++ b/reactos/lib/shell32/control.c @@ -36,8 +36,7 @@ #define NO_SHLWAPI_REG #include "shlwapi.h" -#include "control.h" - +#include "cpanel.h" WINE_DEFAULT_DEBUG_CHANNEL(shlctrl); diff --git a/reactos/lib/shell32/control.h b/reactos/lib/shell32/cpanel.h similarity index 93% rename from reactos/lib/shell32/control.h rename to reactos/lib/shell32/cpanel.h index 7b6341fac42..1d37d985191 100644 --- a/reactos/lib/shell32/control.h +++ b/reactos/lib/shell32/cpanel.h @@ -17,6 +17,9 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#ifndef __WINE_SHELL_CPANEL_H +#define __WINE_SHELL_CPANEL_H + typedef struct CPlApplet { struct CPlApplet* next; /* linked list */ HWND hWnd; @@ -39,3 +42,4 @@ typedef struct CPanel { CPlApplet* Control_LoadApplet(HWND hWnd, LPCWSTR cmd, CPanel* panel); CPlApplet* Control_UnloadApplet(CPlApplet* applet); +#endif /* __WINE_SHELL_CPANEL_H */ diff --git a/reactos/lib/shell32/shlcpanel.c b/reactos/lib/shell32/cpanelfolder.c similarity index 99% rename from reactos/lib/shell32/shlcpanel.c rename to reactos/lib/shell32/cpanelfolder.c index 7baee8d4c30..0bf054b3101 100644 --- a/reactos/lib/shell32/shlcpanel.c +++ b/reactos/lib/shell32/cpanelfolder.c @@ -1,8 +1,7 @@ - /* - * control panel folder + * Control panel folder * - * Copyright 2003 Martin Fuchs + * Copyright 2003 Martin Fuchs * * 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/shell32/enumidlist.c b/reactos/lib/shell32/enumidlist.c index 4fbc0e2f3ae..cb129f4dcf3 100644 --- a/reactos/lib/shell32/enumidlist.c +++ b/reactos/lib/shell32/enumidlist.c @@ -35,7 +35,7 @@ #include "pidl.h" #include "shlguid.h" #include "shell32_main.h" -#include "control.h" +#include "cpanel.h" WINE_DEFAULT_DEBUG_CHANNEL(shell); diff --git a/reactos/lib/shell32/iconcache.c b/reactos/lib/shell32/iconcache.c index 3be5f0fd34f..75bd3afa6e4 100644 --- a/reactos/lib/shell32/iconcache.c +++ b/reactos/lib/shell32/iconcache.c @@ -317,7 +317,7 @@ void SIC_Destroy(void) * Shell_GetImageList [SHELL32.71] * * PARAMETERS - * imglist[1|2] [OUT] pointer which recive imagelist handles + * imglist[1|2] [OUT] pointer which receives imagelist handles * */ BOOL WINAPI Shell_GetImageList(HIMAGELIST * lpBigList, HIMAGELIST * lpSmallList) From 796ec351137152a80e3a7052d46c86e97ed4f221 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sat, 27 Mar 2004 09:12:05 +0000 Subject: [PATCH 0652/1463] Merge of Wine commit: Robert Shearman Allow passing NULL to ILFindLastID. Patch: http://cvs.winehq.org/patch.py?id=11621 svn path=/trunk/; revision=8884 --- reactos/lib/shell32/pidl.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/reactos/lib/shell32/pidl.c b/reactos/lib/shell32/pidl.c index 29f11875ade..524f67f44d2 100644 --- a/reactos/lib/shell32/pidl.c +++ b/reactos/lib/shell32/pidl.c @@ -183,10 +183,14 @@ BOOL WINAPI ILGetDisplayName(LPCITEMIDLIST pidl, LPVOID path) * observed: pidl=Desktop return=pidl */ LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl) -{ LPCITEMIDLIST pidlLast = pidl; +{ + LPCITEMIDLIST pidlLast = pidl; TRACE("(pidl=%p)\n",pidl); + if (!pidl) + return NULL; + while (pidl->mkid.cb) { pidlLast = pidl; @@ -1151,7 +1155,7 @@ HRESULT WINAPI SHGetSpecialFolderLocation( * SHGetFolderLocation [SHELL32.@] * * NOTES - * the pidl can be a simple one. since we cant get the path out of the pidl + * the pidl can be a simple one. since we can't get the path out of the pidl * we have to take all data from the pidl */ HRESULT WINAPI SHGetFolderLocation( @@ -1170,7 +1174,7 @@ HRESULT WINAPI SHGetFolderLocation( * SHGetDataFromIDListA [SHELL32.247] * * NOTES - * the pidl can be a simple one. since we cant get the path out of the pidl + * the pidl can be a simple one. since we can't get the path out of the pidl * we have to take all data from the pidl */ HRESULT WINAPI SHGetDataFromIDListA(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, int nFormat, LPVOID dest, int len) From 9b62efc1ca30b2f808321a8367833770edc7aa73 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sat, 27 Mar 2004 09:16:08 +0000 Subject: [PATCH 0653/1463] Merge of Wine commit: Martin Fuchs Implementation of IPersistFile::IsDirty(). svn path=/trunk/; revision=8885 --- reactos/lib/shell32/shelllink.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reactos/lib/shell32/shelllink.c b/reactos/lib/shell32/shelllink.c index 4cc02c2cf43..cb2e88e0d31 100644 --- a/reactos/lib/shell32/shelllink.c +++ b/reactos/lib/shell32/shelllink.c @@ -241,6 +241,7 @@ static HRESULT WINAPI IPersistFile_fnLoad(IPersistFile* iface, LPCOLESTR pszFile r = IPersistStream_Load(StreamThis, stm); ShellLink_UpdatePath(This->sPathRel, pszFileName, This->sWorkDir, &This->sPath); IStream_Release( stm ); + This->bDirty = TRUE; } return r; @@ -297,7 +298,11 @@ static HRESULT WINAPI IPersistFile_fnSave(IPersistFile* iface, LPCOLESTR pszFile IStream_Release( stm ); if( SUCCEEDED( r ) ) + { StartLinkProcessor( pszFileName ); + + This->bDirty = FALSE; + } else { DeleteFileW( pszFileName ); From 0529529902ff664442efbce7e625738d3fac709b Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sat, 27 Mar 2004 09:23:05 +0000 Subject: [PATCH 0654/1463] readll ntdll lib for DbgPrint svn path=/trunk/; revision=8886 --- reactos/lib/shell32/Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/shell32/Makefile.in b/reactos/lib/shell32/Makefile.in index d74b19313c5..7f2fe6052c1 100644 --- a/reactos/lib/shell32/Makefile.in +++ b/reactos/lib/shell32/Makefile.in @@ -5,7 +5,7 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = shell32.dll # fixme: avoid ole32.dll import -IMPORTS = ole32 shlwapi comctl32 user32 gdi32 advapi32 kernel32 +IMPORTS = ole32 shlwapi comctl32 user32 gdi32 advapi32 kernel32 ntdll ALTNAMES = shell.dll EXTRALIBS = $(LIBUUID) $(LIBUNICODE) From dd3a343e64001d5a0511c288bec705d98f930506 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sat, 27 Mar 2004 10:46:32 +0000 Subject: [PATCH 0655/1463] Implement scrollbar controls svn path=/trunk/; revision=8887 --- reactos/lib/user32/controls/regcontrol.c | 4 +- reactos/lib/user32/controls/scrollbar.c | 764 ++++++++++++++++++++--- reactos/subsys/win32k/ntuser/scrollbar.c | 391 ++++++------ 3 files changed, 860 insertions(+), 299 deletions(-) diff --git a/reactos/lib/user32/controls/regcontrol.c b/reactos/lib/user32/controls/regcontrol.c index 05f5ee1dac7..82c1ad12c80 100644 --- a/reactos/lib/user32/controls/regcontrol.c +++ b/reactos/lib/user32/controls/regcontrol.c @@ -1,4 +1,4 @@ -/* $Id: regcontrol.c,v 1.17 2003/12/07 23:02:57 gvg Exp $ +/* $Id: regcontrol.c,v 1.18 2004/03/27 10:46:32 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS User32 @@ -65,8 +65,8 @@ ControlsInit(LPCWSTR ClassName) &MDICLIENT_builtin_class, #if 0 &MENU_builtin_class, - &SCROLL_builtin_class, #endif + &SCROLL_builtin_class, &BUTTON_builtin_class, &LISTBOX_builtin_class, &EDIT_builtin_class, diff --git a/reactos/lib/user32/controls/scrollbar.c b/reactos/lib/user32/controls/scrollbar.c index 2e06abc573c..78232f2d247 100644 --- a/reactos/lib/user32/controls/scrollbar.c +++ b/reactos/lib/user32/controls/scrollbar.c @@ -36,6 +36,7 @@ #include #include #include +#include #include /* GLOBAL VARIABLES ***********************************************************/ @@ -54,6 +55,12 @@ #define SCROLL_TIMER 0 /* Scroll timer id */ + /* Minimum size of the rectangle between the arrows */ +#define SCROLL_MIN_RECT 4 + + /* Minimum size of the thumb in pixels */ +#define SCROLL_MIN_THUMB 6 + /* Thumb-tracking info */ static HWND ScrollTrackingWin = 0; static INT ScrollTrackingBar = 0; @@ -66,6 +73,24 @@ static BOOL ScrollTrackVertical; HBRUSH DefWndControlColor(HDC hDC, UINT ctlType); +static LRESULT WINAPI ScrollBarWndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); + + +/********************************************************************* + * scrollbar class descriptor + */ +const struct builtin_class_descr SCROLL_builtin_class = +{ + L"ScrollBar", /* name */ + CS_VREDRAW | CS_HREDRAW | CS_PARENTDC, /* style, Wine included CS_DBLCLK but then didn't + handle any WM_xBUTTONDBLCLK messages */ + ScrollBarWndProc, /* procW */ + NULL, /* procA (winproc is Unicode only) */ + sizeof(SCROLLBARINFO) + sizeof(SCROLLINFO), /* extra */ + IDC_ARROW, /* cursor */ + 0 /* brush */ +}; + /* PRIVATE FUNCTIONS **********************************************************/ @@ -269,67 +294,92 @@ IntScrollDrawMovingThumb(HDC Dc, PSCROLLBARINFO ScrollBarInfo, BOOL Vertical) ScrollMovingThumb = ! ScrollMovingThumb; } -void -IntDrawScrollBar(HWND hWnd, HDC hDC, INT nBar) +STATIC LONG FASTCALL +IntScrollGetObjectId(INT SBType) { - INT ThumbSize; - SCROLLBARINFO Info; - BOOL Vertical; + if (SB_VERT == SBType) + { + return OBJID_VSCROLL; + } + if (SB_HORZ == SBType) + { + return OBJID_HSCROLL; + } - /* - * Get scroll bar info. - */ + return OBJID_CLIENT; +} - Info.cbSize = sizeof(SCROLLBARINFO); - switch (nBar) - { +STATIC BOOL FASTCALL +IntGetScrollBarInfo(HWND Wnd, INT Bar, PSCROLLBARINFO ScrollBarInfo) +{ + ScrollBarInfo->cbSize = sizeof(SCROLLBARINFO); + + return NtUserGetScrollBarInfo(Wnd, IntScrollGetObjectId(Bar), ScrollBarInfo); +} + +void +IntDrawScrollBar(HWND Wnd, HDC DC, INT Bar) +{ + INT ThumbSize; + SCROLLBARINFO Info; + BOOL Vertical; + + /* + * Get scroll bar info. + */ + switch (Bar) + { case SB_HORZ: - Vertical = FALSE; - NtUserGetScrollBarInfo(hWnd, OBJID_HSCROLL, &Info); - break; + Vertical = FALSE; + break; case SB_VERT: - Vertical = TRUE; - NtUserGetScrollBarInfo(hWnd, OBJID_VSCROLL, &Info); - break; + Vertical = TRUE; + break; case SB_CTL: - Vertical = (GetWindowLongW(hWnd, GWL_STYLE) & SBS_VERT) != 0; - NtUserGetScrollBarInfo(hWnd, OBJID_CLIENT, &Info); - break; - } - - if (IsRectEmpty(&Info.rcScrollBar)) - { + Vertical = (GetWindowLongW(Wnd, GWL_STYLE) & SBS_VERT) != 0; + break; + } + if (! IntGetScrollBarInfo(Wnd, Bar, &Info)) + { return; - } + } + + if (IsRectEmpty(&Info.rcScrollBar)) + { + return; + } - ThumbSize = Info.xyThumbBottom - Info.xyThumbTop; + ThumbSize = Info.xyThumbBottom - Info.xyThumbTop; - /* - * Draw the arrows. - */ + /* + * Draw the arrows. + */ + if (Info.dxyLineButton) + { + IntDrawScrollArrows(DC, &Info, Vertical); + } - if (Info.dxyLineButton) - IntDrawScrollArrows(hDC, &Info, Vertical); + /* + * Draw the interior. + */ + IntDrawScrollInterior(Wnd, DC, Bar, Vertical, &Info); - /* - * Draw the interior. - */ - - IntDrawScrollInterior(hWnd, hDC, nBar, Vertical, &Info); - - /* - * If scroll bar has focus, reposition the caret. - */ - - if (hWnd == GetFocus() && nBar == SB_CTL) - { - if (nBar == SB_HORZ) - SetCaretPos(Info.dxyLineButton + 1, Info.rcScrollBar.top + 1); - else if (nBar == SB_VERT) - SetCaretPos(Info.rcScrollBar.top + 1, Info.dxyLineButton + 1); - } + /* + * If scroll bar has focus, reposition the caret. + */ + if (Wnd == GetFocus() && SB_CTL == Bar) + { + if (Vertical) + { + SetCaretPos(Info.rcScrollBar.top + 1, Info.dxyLineButton + 1); + } + else + { + SetCaretPos(Info.dxyLineButton + 1, Info.rcScrollBar.top + 1); + } + } } STATIC BOOL FASTCALL @@ -350,29 +400,6 @@ IntScrollPtInRectEx(LPRECT Rect, POINT Pt, BOOL Vertical) return PtInRect(&TempRect, Pt); } -STATIC LONG FASTCALL -IntScrollGetObjectId(INT SBType) -{ - if (SB_VERT == SBType) - { - return OBJID_VSCROLL; - } - if (SB_HORZ == SBType) - { - return OBJID_HSCROLL; - } - - return OBJID_CLIENT; -} - -STATIC BOOL FASTCALL -IntGetScrollBarInfo(HWND Wnd, INT SBType, PSCROLLBARINFO ScrollBarInfo) -{ - ScrollBarInfo->cbSize = sizeof(SCROLLBARINFO); - - return NtUserGetScrollBarInfo(Wnd, IntScrollGetObjectId(SBType), ScrollBarInfo); -} - STATIC DWORD FASTCALL IntScrollHitTest(PSCROLLBARINFO ScrollBarInfo, BOOL Vertical, POINT Pt, BOOL Dragging) { @@ -440,6 +467,162 @@ IntScrollHitTest(PSCROLLBARINFO ScrollBarInfo, BOOL Vertical, POINT Pt, BOOL Dra return SCROLL_THUMB; } + +/*********************************************************************** + * IntScrollGetScrollBarRect + * + * Compute the scroll bar rectangle, in drawing coordinates (i.e. client + * coords for SB_CTL, window coords for SB_VERT and SB_HORZ). + * 'arrowSize' returns the width or height of an arrow (depending on + * the orientation of the scrollbar), 'thumbSize' returns the size of + * the thumb, and 'thumbPos' returns the position of the thumb + * relative to the left or to the top. + * Return TRUE if the scrollbar is vertical, FALSE if horizontal. + */ +STATIC BOOL FASTCALL +IntScrollGetScrollBarRect(HWND Wnd, INT Bar, RECT *Rect, + INT *ArrowSize, INT *ThumbSize, + INT *ThumbPos) +{ + INT Pixels; + BOOL Vertical; + RECT ClientRect; + RECT WindowRect; + DWORD Style, ExStyle; + + GetClientRect(Wnd, &ClientRect); + if (SB_HORZ == Bar || SB_VERT == Bar) + { + ClientToScreen(Wnd, (LPPOINT) &ClientRect.left); + ClientToScreen(Wnd, (LPPOINT) &ClientRect.right); + GetWindowRect(Wnd, &WindowRect); + } + Style = GetWindowLongW(Wnd, GWL_STYLE); + + switch (Bar) + { + case SB_HORZ: + Rect->left = ClientRect.left - WindowRect.left; + Rect->top = ClientRect.bottom - WindowRect.top; + Rect->right = ClientRect.right - WindowRect.left; + Rect->bottom = Rect->top + GetSystemMetrics(SM_CYHSCROLL); + if (0 != (Style & WS_BORDER)) + { + Rect->left--; + Rect->right++; + } + else if (0 != (Style & WS_VSCROLL)) + { + Rect->right++; + } + Vertical = FALSE; + break; + + case SB_VERT: + ExStyle = GetWindowLongW(Wnd, GWL_EXSTYLE); + if (0 != (ExStyle & WS_EX_LEFTSCROLLBAR)) + { + Rect->left = ClientRect.left - WindowRect.left - GetSystemMetrics(SM_CXVSCROLL); + } + else + { + Rect->left = ClientRect.right - WindowRect.left; + } + Rect->top = ClientRect.top - WindowRect.top; + Rect->right = Rect->left + GetSystemMetrics(SM_CXVSCROLL); + Rect->bottom = ClientRect.bottom - WindowRect.top; + if (0 != (Style & WS_BORDER)) + { + Rect->top--; + Rect->bottom++; + } + else if (0 != (Style & WS_HSCROLL)) + { + Rect->bottom++; + } + Vertical = TRUE; + break; + + case SB_CTL: + *Rect = ClientRect; + Vertical = (0 != (Style & SBS_VERT)); + break; + + default: + return FALSE; + } + + if (Vertical) + { + Pixels = Rect->bottom - Rect->top; + } + else + { + Pixels = Rect->right - Rect->left; + } + + if (Pixels <= 2 * GetSystemMetrics(SM_CXVSCROLL) + SCROLL_MIN_RECT) + { + if (SCROLL_MIN_RECT < Pixels) + { + *ArrowSize = (Pixels - SCROLL_MIN_RECT) / 2; + } + else + { + *ArrowSize = 0; + } + *ThumbPos = *ThumbSize = 0; + } + else + { + SCROLLINFO Info; + + NtUserGetScrollInfo(Wnd, Bar, &Info); + *ArrowSize = GetSystemMetrics(SM_CXVSCROLL); + Pixels -= (2 * GetSystemMetrics(SM_CXVSCROLL)); + + if (0 != Info.nPage) + { + *ThumbSize = MulDiv(Pixels, Info.nPage, (Info.nMax - Info.nMin + 1)); + if (*ThumbSize < SCROLL_MIN_THUMB) + { + *ThumbSize = SCROLL_MIN_THUMB; + } + } + else + { + *ThumbSize = GetSystemMetrics(SM_CXVSCROLL); + } + +#if 0 /* FIXME */ + if (((pixels -= *ThumbSize ) < 0) || + ((info->flags & ESB_DISABLE_BOTH) == ESB_DISABLE_BOTH)) +#else + if ((Pixels -= *ThumbSize ) < 0) +#endif + { + /* Rectangle too small or scrollbar disabled -> no thumb */ + *ThumbPos = *ThumbSize = 0; + } + else + { + INT Max = Info.nMax - max(Info.nPage - 1, 0); + if (Max <= Info.nMin) + { + *ThumbPos = *ArrowSize; + } + else + { + *ThumbPos = *ArrowSize + + MulDiv(Pixels, (Info.nPos - Info.nMin), + (Max - Info.nMin)); + } + } + } + + return Vertical; +} + /*********************************************************************** * IntScrollGetThumbVal * @@ -512,6 +695,79 @@ STATIC POINT IntScrollClipPos(PRECT Rect, POINT Pt) return Pt; } +/*********************************************************************** + * IntScrollDrawSizeGrip + * + * Draw the size grip. + */ +STATIC void FASTCALL +IntScrollDrawSizeGrip(HWND Wnd, HDC Dc) +{ + RECT Rect; + + GetClientRect(Wnd, &Rect); + FillRect(Dc, &Rect, GetSysColorBrush(COLOR_SCROLLBAR)); + Rect.left = max(Rect.left, Rect.right - GetSystemMetrics(SM_CXVSCROLL) - 1); + Rect.top = max(Rect.top, Rect.bottom - GetSystemMetrics(SM_CYHSCROLL) - 1); + DrawFrameControl(Dc, &Rect, DFC_SCROLL, DFCS_SCROLLSIZEGRIP); +} + + + +/*********************************************************************** + * IntScrollHandleKbdEvent + * + * Handle a keyboard event (only for SB_CTL scrollbars with focus). + */ +STATIC void FASTCALL +IntScrollHandleKbdEvent( + HWND Wnd /* [in] Handle of window with scrollbar(s) */, + WPARAM wParam /* [in] Variable input including enable state */, + LPARAM lParam /* [in] Variable input including input point */) +{ + DPRINT("Wnd=%p wParam=%d lParam=%ld\n", Wnd, wParam, lParam); + + /* hide caret on first KEYDOWN to prevent flicker */ + if (0 == (lParam & PFD_DOUBLEBUFFER_DONTCARE)) + { + HideCaret(Wnd); + } + + switch(wParam) + { + case VK_PRIOR: + wParam = SB_PAGEUP; + break; + + case VK_NEXT: + wParam = SB_PAGEDOWN; + break; + + case VK_HOME: + wParam = SB_TOP; + break; + + case VK_END: + wParam = SB_BOTTOM; + break; + + case VK_UP: + wParam = SB_LINEUP; + break; + + case VK_DOWN: + wParam = SB_LINEDOWN; + break; + + default: + return; + } + + SendMessageW(GetParent(Wnd), + (0 != (GetWindowLongW(Wnd, GWL_STYLE ) & SBS_VERT) ? + WM_VSCROLL : WM_HSCROLL), wParam, (LPARAM) Wnd); +} + /*********************************************************************** * IntScrollHandleScrollEvent * @@ -799,6 +1055,122 @@ IntScrollHandleScrollEvent(HWND Wnd, INT SBType, UINT Msg, POINT Pt) } +/*********************************************************************** + * IntScrollCreateScrollBar + * + * Create a scroll bar + */ +static void IntScrollCreateScrollBar( + HWND Wnd /* [in] Handle of window with scrollbar(s) */, + LPCREATESTRUCTW lpCreate /* [in] The style and place of the scroll bar */) +{ + SCROLLINFO Info; + + Info.cbSize = sizeof(SCROLLINFO); + Info.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; + Info.nMin = 0; + Info.nMax = 100; + Info.nPage = 0; + Info.nPos = 0; + Info.nTrackPos = 0; + NtUserSetScrollInfo(Wnd, SB_CTL, &Info, FALSE); + + DPRINT("hwnd=%p lpCreate=%p\n", Wnd, lpCreate); + +#if 0 /* FIXME */ + if (lpCreate->style & WS_DISABLED) + { + info->flags = ESB_DISABLE_BOTH; + TRACE("Created WS_DISABLED scrollbar\n"); + } +#endif + + if (0 != (lpCreate->style & (SBS_SIZEGRIP | SBS_SIZEBOX))) + { + if (0 != (lpCreate->style & SBS_SIZEBOXTOPLEFTALIGN)) + { + MoveWindow(Wnd, lpCreate->x, lpCreate->y, GetSystemMetrics(SM_CXVSCROLL) + 1, + GetSystemMetrics(SM_CYHSCROLL) + 1, FALSE); + } + else if (0 != (lpCreate->style & SBS_SIZEBOXBOTTOMRIGHTALIGN)) + { + MoveWindow(Wnd, lpCreate->x + lpCreate->cx - GetSystemMetrics(SM_CXVSCROLL) - 1, + lpCreate->y + lpCreate->cy - GetSystemMetrics(SM_CYHSCROLL) - 1, + GetSystemMetrics(SM_CXVSCROLL) + 1, + GetSystemMetrics(SM_CYHSCROLL) + 1, FALSE); + } + } + else if (0 != (lpCreate->style & SBS_VERT)) + { + if (0 != (lpCreate->style & SBS_LEFTALIGN)) + { + MoveWindow(Wnd, lpCreate->x, lpCreate->y, + GetSystemMetrics(SM_CXVSCROLL) + 1, lpCreate->cy, FALSE); + } + else if (0 != (lpCreate->style & SBS_RIGHTALIGN)) + { + MoveWindow(Wnd, + lpCreate->x + lpCreate->cx - GetSystemMetrics(SM_CXVSCROLL) - 1, + lpCreate->y, + GetSystemMetrics(SM_CXVSCROLL) + 1, lpCreate->cy, FALSE); + } + } + else /* SBS_HORZ */ + { + if (0 != (lpCreate->style & SBS_TOPALIGN)) + { + MoveWindow(Wnd, lpCreate->x, lpCreate->y, + lpCreate->cx, GetSystemMetrics(SM_CYHSCROLL) + 1, FALSE); + } + else if (0 != (lpCreate->style & SBS_BOTTOMALIGN)) + { + MoveWindow(Wnd, + lpCreate->x, + lpCreate->y + lpCreate->cy - GetSystemMetrics(SM_CYHSCROLL) - 1, + lpCreate->cx, GetSystemMetrics(SM_CYHSCROLL) + 1, FALSE); + } + } +} + +STATIC INT FASTCALL +IntScrollGetScrollPos(HWND Wnd, INT Bar) +{ + SCROLLINFO ScrollInfo; + + ScrollInfo.cbSize = sizeof(SCROLLINFO); + ScrollInfo.fMask = SIF_POS; + if (! NtUserGetScrollInfo(Wnd, Bar, &ScrollInfo)) + { + return 0; + } + + return ScrollInfo.nPos; +} + +STATIC BOOL FASTCALL +IntScrollGetScrollRange(HWND Wnd, int Bar, LPINT MinPos, LPINT MaxPos) +{ + BOOL Result; + SCROLLINFO ScrollInfo; + + if (NULL == MinPos || NULL == MaxPos) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + ScrollInfo.cbSize = sizeof(SCROLLINFO); + ScrollInfo.fMask = SIF_RANGE; + Result = NtUserGetScrollInfo(Wnd, Bar, &ScrollInfo); + if (Result) + { + *MinPos = ScrollInfo.nMin; + *MaxPos = ScrollInfo.nMax; + } + + return Result; +} + /* USER32 INTERNAL FUNCTIONS **************************************************/ /*********************************************************************** @@ -871,6 +1243,211 @@ ScrollTrackScrollBar(HWND Wnd, INT SBType, POINT Pt) while (WM_LBUTTONUP != Msg.message); } + +/*********************************************************************** + * ScrollBarWndProc + */ +static LRESULT WINAPI +ScrollBarWndProc(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) +{ + if (! IsWindow(Wnd)) + { + return 0; + } + + switch (Msg) + { + case WM_CREATE: + IntScrollCreateScrollBar(Wnd, (LPCREATESTRUCTW) lParam); + break; + +#if 0 /* FIXME */ + case WM_ENABLE: + { + SCROLLBAR_INFO *infoPtr; + if ((infoPtr = SCROLL_GetScrollBarInfo( hwnd, SB_CTL ))) + { + infoPtr->flags = wParam ? ESB_ENABLE_BOTH : ESB_DISABLE_BOTH; + SCROLL_RefreshScrollBar(hwnd, SB_CTL, TRUE, TRUE); + } + } + return 0; +#endif + + case WM_LBUTTONDOWN: + { + POINT Pt; + + Pt.x = (short)LOWORD(lParam); + Pt.y = (short)HIWORD(lParam); + ScrollTrackScrollBar(Wnd, SB_CTL, Pt); + } + break; + + case WM_LBUTTONUP: + case WM_MOUSEMOVE: + case WM_SYSTIMER: + { + POINT Pt; + + Pt.x = (short)LOWORD(lParam); + Pt.y = (short)HIWORD(lParam); + IntScrollHandleScrollEvent(Wnd, SB_CTL, Msg, Pt); + } + break; + + case WM_KEYDOWN: + IntScrollHandleKbdEvent(Wnd, wParam, lParam); + break; + + case WM_KEYUP: + ShowCaret(Wnd); + break; + + case WM_SETFOCUS: + { + /* Create a caret when a ScrollBar get focus */ + RECT Rect; + int ArrowSize, ThumbSize, ThumbPos, Vertical; + + Vertical = IntScrollGetScrollBarRect(Wnd, SB_CTL, &Rect, + &ArrowSize, &ThumbSize, &ThumbPos); + if (! Vertical) + { + CreateCaret(Wnd, (HBITMAP) 1, ThumbSize - 2, Rect.bottom - Rect.top - 2); + SetCaretPos(ThumbPos + 1, Rect.top + 1); + } + else + { + CreateCaret(Wnd, (HBITMAP) 1, Rect.right - Rect.left - 2, ThumbSize - 2); + SetCaretPos(Rect.top + 1, ThumbPos + 1); + } + ShowCaret(Wnd); + } + break; + + case WM_KILLFOCUS: + { + RECT Rect; + int ArrowSize, ThumbSize, ThumbPos, Vertical; + + Vertical = IntScrollGetScrollBarRect(Wnd, SB_CTL, &Rect, + &ArrowSize, &ThumbSize, &ThumbPos); + if (! Vertical) + { + Rect.left = ThumbPos + 1; + Rect.right = Rect.left + ThumbSize; + } + else + { + Rect.top = ThumbPos + 1; + Rect.bottom = Rect.top + ThumbSize; + } + HideCaret(Wnd); + InvalidateRect(Wnd, &Rect, FALSE); + DestroyCaret(); + } + break; + + case WM_ERASEBKGND: + return 1; + + case WM_GETDLGCODE: + return DLGC_WANTARROWS; /* Windows returns this value */ + + case WM_PAINT: + { + PAINTSTRUCT Ps; + HDC Dc; + + Dc = (0 != wParam ? (HDC) wParam : BeginPaint(Wnd, &Ps)); + + if (GetWindowLongW(Wnd, GWL_STYLE) & SBS_SIZEGRIP) + { + IntScrollDrawSizeGrip(Wnd, Dc); + } + else if (0 != (GetWindowLongW(Wnd, GWL_STYLE) & SBS_SIZEBOX)) + { + RECT Rect; + GetClientRect(Wnd, &Rect); + FillRect(Dc, &Rect, GetSysColorBrush(COLOR_SCROLLBAR)); + } + else + { + IntDrawScrollBar(Wnd, Dc, SB_CTL/*, TRUE, TRUE*/); + } + + if (0 == wParam) + { + EndPaint(Wnd, &Ps); + } + } + break; + + case SBM_SETPOS: + return SetScrollPos(Wnd, SB_CTL, wParam, (BOOL) lParam); + + case SBM_GETPOS: + return IntScrollGetScrollPos(Wnd, SB_CTL); + + case SBM_SETRANGE: + { + INT OldPos = IntScrollGetScrollPos(Wnd, SB_CTL); + SetScrollRange(Wnd, SB_CTL, wParam, lParam, FALSE); + if (OldPos != IntScrollGetScrollPos(Wnd, SB_CTL)) + { + return OldPos; + } + } + return 0; + + case SBM_GETRANGE: + return IntScrollGetScrollRange(Wnd, SB_CTL, (LPINT) wParam, (LPINT) lParam); + + case SBM_ENABLE_ARROWS: + return EnableScrollBar(Wnd, SB_CTL, wParam); + + case SBM_SETRANGEREDRAW: + { + INT OldPos = IntScrollGetScrollPos(Wnd, SB_CTL); + SetScrollRange(Wnd, SB_CTL, wParam, lParam, TRUE); + if (OldPos != IntScrollGetScrollPos(Wnd, SB_CTL)) + { + return OldPos; + } + } + return 0; + + case SBM_SETSCROLLINFO: + return SetScrollInfo(Wnd, SB_CTL, (SCROLLINFO *) lParam, wParam); + + case SBM_GETSCROLLINFO: + return NtUserGetScrollInfo(Wnd, SB_CTL, (SCROLLINFO *) lParam); + + case 0x00e5: + case 0x00e7: + case 0x00e8: + case 0x00eb: + case 0x00ec: + case 0x00ed: + case 0x00ee: + case 0x00ef: + DPRINT("unknown Win32 msg %04x wp=%08x lp=%08lx\n", + Msg, wParam, lParam ); + break; + + default: + if (WM_USER <= Msg) + { + DPRINT("unknown msg %04x wp=%04x lp=%08lx\n", Msg, wParam, lParam); + } + return DefWindowProcW(Wnd, Msg, wParam, lParam ); + } + + return 0; +} + + /* PUBLIC FUNCTIONS ***********************************************************/ /* @@ -904,45 +1481,38 @@ GetScrollInfo(HWND Wnd, INT SBType, LPSCROLLINFO lpsi) * @implemented */ INT STDCALL -GetScrollPos(HWND hWnd, INT nBar) +GetScrollPos(HWND Wnd, INT Bar) { - SCROLLINFO ScrollInfo; - - ScrollInfo.cbSize = sizeof(SCROLLINFO); - ScrollInfo.fMask = SIF_POS; - if (! NtUserGetScrollInfo(hWnd, nBar, &ScrollInfo)) - { - return 0; - } + DPRINT("Wnd=%p Bar=%d\n", Wnd, Bar); - return ScrollInfo.nPos; + /* Refer SB_CTL requests to the window */ + if (SB_CTL == Bar) + { + return SendMessageW(Wnd, SBM_GETPOS, (WPARAM) 0, (LPARAM) 0); + } + else + { + return IntScrollGetScrollPos(Wnd, Bar); + } } /* * @implemented */ BOOL STDCALL -GetScrollRange(HWND hWnd, int nBar, LPINT lpMinPos, LPINT lpMaxPos) +GetScrollRange(HWND Wnd, int Bar, LPINT MinPos, LPINT MaxPos) { - BOOL Result; - SCROLLINFO ScrollInfo; - - if (NULL == lpMinPos || NULL == lpMaxPos) + DPRINT("Wnd=%x Bar=%d Min=%p Max=%p\n", Wnd, Bar, MinPos, MaxPos); + + /* Refer SB_CTL requests to the window */ + if (SB_CTL == Bar) { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; + return SendMessageW(Wnd, SBM_GETRANGE, (WPARAM) MinPos, (LPARAM) MaxPos); } - - ScrollInfo.cbSize = sizeof(SCROLLINFO); - ScrollInfo.fMask = SIF_RANGE; - Result = NtUserGetScrollInfo(hWnd, nBar, &ScrollInfo); - if (Result) + else { - *lpMinPos = ScrollInfo.nMin; - *lpMaxPos = ScrollInfo.nMax; + return IntScrollGetScrollRange(Wnd, Bar, MinPos, MaxPos); } - - return Result; } /* diff --git a/reactos/subsys/win32k/ntuser/scrollbar.c b/reactos/subsys/win32k/ntuser/scrollbar.c index e3f97e8b0de..91f5b5d26a1 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.27 2004/02/19 21:12:09 weiden Exp $ +/* $Id: scrollbar.c,v 1.28 2004/03/27 10:46:31 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -177,247 +177,244 @@ IntCalculateThumb(PWINDOW_OBJECT Window, LONG idObject, PSCROLLBARINFO psbi, LPS return TRUE; } -BOOL FASTCALL +static BOOL FASTCALL IntGetScrollInfo(PWINDOW_OBJECT Window, INT nBar, LPSCROLLINFO lpsi) { UINT Mask; LPSCROLLINFO psi; PSCROLLBARINFO Info; - switch(nBar) - { - case SB_HORZ: - Info = Window->pHScroll; - if(Info) + switch (nBar) + { + case SB_HORZ: + Info = Window->pHScroll; break; - /* fall through */ - case SB_VERT: - Info = Window->pVScroll; - if(Info) + case SB_VERT: + Info = Window->pVScroll; break; - /* fall through */ - case SB_CTL: - /* FIXME - Send a SBM_GETSCROLLINFO message to the window. Fail if the window - doesn't handle the message - */ - return 0; - - Info = Window->wExtra; - if(Info) + case SB_CTL: + if (Window->ExtraDataSize < sizeof(SCROLLBARINFO) + sizeof(SCROLLINFO)) + { + Info = NULL; + } + else + { + Info = (PSCROLLBARINFO) Window->ExtraData; + } break; - /* fall through */ - default: + default: + DPRINT1("Trying to get scrollinfo for unknown scrollbar type %d", nBar); + return FALSE; + } + + if (NULL == Info) + { + DPRINT1("No scrollinfo available\n"); return FALSE; - } + } - psi = (LPSCROLLINFO)((PSCROLLBARINFO)(Info + 1)); + psi = (LPSCROLLINFO)(Info + 1); - if(lpsi->fMask == SIF_ALL) - Mask = SIF_PAGE | SIF_POS | SIF_RANGE | SIF_TRACKPOS; + if (lpsi->fMask == SIF_ALL) + { + Mask = SIF_PAGE | SIF_POS | SIF_RANGE | SIF_TRACKPOS; + } else - Mask = lpsi->fMask; + { + Mask = lpsi->fMask; + } - if(Mask & SIF_PAGE) - { - lpsi->nPage = psi->nPage; - } + if (0 != (Mask & SIF_PAGE)) + { + lpsi->nPage = psi->nPage; + } - if(Mask & SIF_POS) - { - lpsi->nPos = psi->nPos; - } + if (0 != (Mask & SIF_POS)) + { + lpsi->nPos = psi->nPos; + } - if(Mask & SIF_RANGE) - { - lpsi->nMin = psi->nMin; - lpsi->nMax = psi->nMax; - } + if (0 != (Mask & SIF_RANGE)) + { + lpsi->nMin = psi->nMin; + lpsi->nMax = psi->nMax; + } - if(Mask & SIF_TRACKPOS) - { - lpsi->nTrackPos = psi->nTrackPos; - } + if (0 != (Mask & SIF_TRACKPOS)) + { + lpsi->nTrackPos = psi->nTrackPos; + } return TRUE; } -DWORD FASTCALL +static DWORD FASTCALL IntSetScrollInfo(PWINDOW_OBJECT Window, INT nBar, LPCSCROLLINFO lpsi, BOOL bRedraw) { - /* - * Update the scrollbar state and set action flags according to - * what has to be done graphics wise. - */ + /* + * Update the scrollbar state and set action flags according to + * what has to be done graphics wise. + */ - LPSCROLLINFO Info; - PSCROLLBARINFO psbi; + LPSCROLLINFO Info; + PSCROLLBARINFO psbi; /* UINT new_flags;*/ - BOOL bChangeParams = FALSE; /* don't show/hide scrollbar if params don't change */ + BOOL bChangeParams = FALSE; /* don't show/hide scrollbar if params don't change */ - if (lpsi->cbSize != sizeof(SCROLLINFO) && - lpsi->cbSize != (sizeof(SCROLLINFO) - sizeof(lpsi->nTrackPos))) - { + if (lpsi->cbSize != sizeof(SCROLLINFO) && + lpsi->cbSize != (sizeof(SCROLLINFO) - sizeof(lpsi->nTrackPos))) + { SetLastWin32Error(ERROR_INVALID_PARAMETER); return 0; - } - if (lpsi->fMask & ~(SIF_ALL | SIF_DISABLENOSCROLL)) - { + } + if (lpsi->fMask & ~(SIF_ALL | SIF_DISABLENOSCROLL)) + { SetLastWin32Error(ERROR_INVALID_PARAMETER); return 0; - } - switch(nBar) - { + } + switch (nBar) + { case SB_HORZ: - if (Window->pHScroll == NULL) - { + if (NULL == Window->pHScroll) + { SetLastWin32Error(ERROR_INVALID_PARAMETER); return 0; - } - psbi = Window->pHScroll; - Info = (LPSCROLLINFO)(Window->pHScroll + 1); - break; + } + psbi = Window->pHScroll; + break; case SB_VERT: - if (Window->pVScroll == NULL) - { + if (NULL == Window->pVScroll) + { SetLastWin32Error(ERROR_INVALID_PARAMETER); return 0; - } - psbi = Window->pVScroll; - Info = (LPSCROLLINFO)(Window->pVScroll + 1); - break; + } + psbi = Window->pVScroll; + break; case SB_CTL: - UNIMPLEMENTED; - break; + if (Window->ExtraDataSize < sizeof(SCROLLBARINFO) + sizeof(SCROLLINFO)) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return 0; + } + psbi = (PSCROLLBARINFO) Window->ExtraData; + break; default: - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return 0; - } + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return 0; + } - /* Set the page size */ - if (lpsi->fMask & SIF_PAGE) - { + Info = (LPSCROLLINFO)(psbi + 1); + + /* Set the page size */ + if (0 != (lpsi->fMask & SIF_PAGE)) + { if (Info->nPage != lpsi->nPage) - { - Info->nPage = lpsi->nPage; -#if 0 - *Action |= SA_SSI_REFRESH; -#endif - bChangeParams = TRUE; - } - } + { + Info->nPage = lpsi->nPage; + bChangeParams = TRUE; + } + } - /* Set the scroll pos */ - if (lpsi->fMask & SIF_POS) - { + /* Set the scroll pos */ + if (0 != (lpsi->fMask & SIF_POS)) + { if (Info->nPos != lpsi->nPos) - { - Info->nPos = lpsi->nPos; -#if 0 - *Action |= SA_SSI_REFRESH; -#endif - } - } + { + Info->nPos = lpsi->nPos; + } + } - /* Set the scroll range */ - if (lpsi->fMask & SIF_RANGE) - { + /* Set the scroll range */ + if (0 != (lpsi->fMask & SIF_RANGE)) + { /* Invalid range -> range is set to (0,0) */ if (lpsi->nMin > lpsi->nMax || - (UINT)(lpsi->nMax - lpsi->nMin) >= 0x80000000) - { - Info->nMin = 0; - Info->nMax = 0; - bChangeParams = TRUE; - } - else - { - if (Info->nMin != lpsi->nMin || Info->nMax != lpsi->nMax) - { -#if 0 - *Action |= SA_SSI_REFRESH; -#endif - Info->nMin = lpsi->nMin; - Info->nMax = lpsi->nMax; - bChangeParams = TRUE; - } - } - } + 0x80000000 <= (UINT)(lpsi->nMax - lpsi->nMin)) + { + Info->nMin = 0; + Info->nMax = 0; + bChangeParams = TRUE; + } + else if (Info->nMin != lpsi->nMin || Info->nMax != lpsi->nMax) + { + Info->nMin = lpsi->nMin; + Info->nMax = lpsi->nMax; + bChangeParams = TRUE; + } + } - /* Make sure the page size is valid */ - if (Info->nPage < 0) - { + /* Make sure the page size is valid */ + if (Info->nPage < 0) + { Info->nPage = 0; - } - else if (Info->nPage > Info->nMax - Info->nMin + 1) - { + } + else if (Info->nMax - Info->nMin + 1 < Info->nPage) + { Info->nPage = Info->nMax - Info->nMin + 1; - } + } - /* Make sure the pos is inside the range */ - if (Info->nPos < Info->nMin) - { + /* Make sure the pos is inside the range */ + if (Info->nPos < Info->nMin) + { Info->nPos = Info->nMin; - } - else if (Info->nPos > Info->nMax - max(Info->nPage - 1, 0)) - { + } + else if (Info->nPos > Info->nMax - max(Info->nPage - 1, 0)) + { Info->nPos = Info->nMax - max(Info->nPage - 1, 0); - } + } - /* - * Don't change the scrollbar state if SetScrollInfo is just called - * with SIF_DISABLENOSCROLL - */ - if (!(lpsi->fMask & SIF_ALL)) - { + /* + * Don't change the scrollbar state if SetScrollInfo is just called + * with SIF_DISABLENOSCROLL + */ + if (0 == (lpsi->fMask & SIF_ALL)) + { return Info->nPos; - } + } - /* Check if the scrollbar should be hidden or disabled */ - if (lpsi->fMask & (SIF_RANGE | SIF_PAGE | SIF_DISABLENOSCROLL)) - { -/* new_flags = Info->flags;*/ + /* Check if the scrollbar should be hidden or disabled */ + if (0 != (lpsi->fMask & (SIF_RANGE | SIF_PAGE | SIF_DISABLENOSCROLL))) + { if (Info->nMin >= Info->nMax - max(Info->nPage - 1, 0)) - { - /* Hide or disable scroll-bar */ - if (lpsi->fMask & SIF_DISABLENOSCROLL) - { + { + /* Hide or disable scroll-bar */ + if (0 != (lpsi->fMask & SIF_DISABLENOSCROLL)) + { /* new_flags = ESB_DISABLE_BOTH;*/ -#if 0 - *Action |= SA_SSI_REFRESH; -#endif - } - else if ((nBar != SB_CTL) && bChangeParams) - { - NtUserShowScrollBar(Window->Self, nBar, FALSE); - return Info->nPos; - } - } + } + else if ((nBar != SB_CTL) && bChangeParams) + { + NtUserShowScrollBar(Window->Self, nBar, FALSE); + return Info->nPos; + } + } else /* Show and enable scroll-bar */ - { + { /* new_flags = 0;*/ - if ((nBar != SB_CTL) && bChangeParams) - NtUserShowScrollBar(Window->Self, nBar, TRUE); - } + if ((nBar != SB_CTL) && bChangeParams) + { + NtUserShowScrollBar(Window->Self, nBar, TRUE); + } + } #if 0 if (infoPtr->flags != new_flags) /* check arrow flags */ - { - infoPtr->flags = new_flags; - *Action |= SA_SSI_REPAINT_ARROWS; - } + { + infoPtr->flags = new_flags; + *Action |= SA_SSI_REPAINT_ARROWS; + } #endif - } + } - if (bRedraw) - { + if (bRedraw) + { RECT UpdateRect = psbi->rcScrollBar; UpdateRect.left -= Window->ClientRect.left - Window->WindowRect.left; UpdateRect.right -= Window->ClientRect.left - Window->WindowRect.left; UpdateRect.top -= Window->ClientRect.top - Window->WindowRect.top; UpdateRect.bottom -= Window->ClientRect.top - Window->WindowRect.top; IntRedrawWindow(Window, &UpdateRect, 0, RDW_INVALIDATE | RDW_FRAME); - } + } /* Return current position */ return Info->nPos; @@ -431,44 +428,38 @@ IntGetScrollBarInfo(PWINDOW_OBJECT Window, LONG idObject, PSCROLLBARINFO psbi) LPSCROLLINFO psi; switch(idObject) - { - case OBJID_HSCROLL: - if(Window->pHScroll) - { + { + case OBJID_HSCROLL: Bar = SB_HORZ; sbi = Window->pHScroll; break; - } - /* fall through */ - case OBJID_VSCROLL: - if(Window->pVScroll) - { + case OBJID_VSCROLL: Bar = SB_VERT; sbi = Window->pVScroll; break; - } - /* fall through */ - case OBJID_CLIENT: - - /* FIXME - Send a SBM_GETSCROLLBARINFO message if Window is not a system scrollbar. - If the window doesn't handle the message return FALSE. - */ - return FALSE; - - if(Window->wExtra) - { + case OBJID_CLIENT: Bar = SB_CTL; - sbi = Window->wExtra; + if (Window->ExtraDataSize < sizeof(SCROLLBARINFO) + sizeof(SCROLLINFO)) + { + sbi = NULL; + } + else + { + sbi = (PSCROLLBARINFO) Window->ExtraData; + } break; - } - /* fall through */ - default: + default: + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return FALSE; + } + + if (NULL == sbi) + { SetLastWin32Error(ERROR_INVALID_PARAMETER); return FALSE; - } + } - psi = (LPSCROLLINFO)((PSCROLLBARINFO)(sbi + 1)); + psi = (LPSCROLLINFO)(sbi + 1); IntGetScrollBarRect(Window, Bar, &(sbi->rcScrollBar)); IntCalculateThumb(Window, Bar, sbi, psi); From 0fa710246c6a780bb6840f89573ddb50ca48354e Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sat, 27 Mar 2004 14:02:28 +0000 Subject: [PATCH 0656/1463] rollback changes when cancelling notify icon configuration dialog svn path=/trunk/; revision=8888 --- reactos/subsys/system/explorer/Jamfile | 3 +- reactos/subsys/system/explorer/Makefile.MinGW | 4 +- .../system/explorer/notifyhook/notifyhook.dsp | 8 +-- .../system/explorer/taskbar/traynotify.cpp | 61 +++++++++++++------ .../system/explorer/taskbar/traynotify.h | 10 ++- .../subsys/system/explorer/utility/utility.h | 2 +- 6 files changed, 61 insertions(+), 27 deletions(-) diff --git a/reactos/subsys/system/explorer/Jamfile b/reactos/subsys/system/explorer/Jamfile index 2c1c84316d8..9be72f6b573 100644 --- a/reactos/subsys/system/explorer/Jamfile +++ b/reactos/subsys/system/explorer/Jamfile @@ -51,7 +51,8 @@ exe explorer : uuid wsock32 oleaut32 - libexpat +# expat notifyhook.dll + libexpat.dll ; diff --git a/reactos/subsys/system/explorer/Makefile.MinGW b/reactos/subsys/system/explorer/Makefile.MinGW index 8a0ac4bdc84..4eb220c29d3 100644 --- a/reactos/subsys/system/explorer/Makefile.MinGW +++ b/reactos/subsys/system/explorer/Makefile.MinGW @@ -73,12 +73,12 @@ OBJECTS = \ i386-stub-win32.o \ xmlstorage.o -LIBS = gdi32 comctl32 ole32 uuid libexpat +LIBS = gdi32 comctl32 ole32 uuid DELAYIMPORTS = oleaut32 wsock32 all: $(TARGET) -$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) notifyhook.dll +$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) notifyhook.dll libexpat.dll $(LINK) $(LFLAGS) -o $@ $^ $(addprefix -l,$(LIBS)) $(addprefix -l,$(DELAYIMPORTS)) explorer$(RES_SUFFIX): $(PROGRAM)_intres.rc res/*.bmp res/*.ico diff --git a/reactos/subsys/system/explorer/notifyhook/notifyhook.dsp b/reactos/subsys/system/explorer/notifyhook/notifyhook.dsp index 0eaac0450de..84260c998f6 100644 --- a/reactos/subsys/system/explorer/notifyhook/notifyhook.dsp +++ b/reactos/subsys/system/explorer/notifyhook/notifyhook.dsp @@ -88,14 +88,14 @@ LINK32=link.exe # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "notifyhook___Win32_Win32" -# PROP BASE Intermediate_Dir "notifyhook___Win32_Win32" +# PROP BASE Output_Dir "Win32" +# PROP BASE Intermediate_Dir "Win32" # PROP BASE Ignore_Export_Lib 0 # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 -# PROP Output_Dir "notifyhook___Win32_Win32" -# PROP Intermediate_Dir "notifyhook___Win32_Win32" +# PROP Output_Dir "Win32" +# PROP Intermediate_Dir "Win32" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_NOTIFYHOOK_IMPL" /FR /FD /GZ /c diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index 6c14807a1dd..a298dafbd8d 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -322,7 +322,7 @@ LRESULT NotifyArea::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) break; case WM_TIMER: { - TimerTick(); + Refresh(); ClockWindow* clock_window = GET_WINDOW(ClockWindow, _hwndClock); @@ -331,7 +331,7 @@ LRESULT NotifyArea::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) break;} case PM_REFRESH: - TimerTick(); + Refresh(true); break; case WM_SIZE: { @@ -414,7 +414,7 @@ LRESULT NotifyArea::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) } } else if (_icon_map.erase(entry)) // delete icons without valid owner window - Refresh(); + UpdateIcons(); } } @@ -429,7 +429,7 @@ int NotifyArea::Command(int id, int code) switch(id) { case ID_SHOW_HIDDEN_ICONS: _show_hidden = !_show_hidden; - Refresh(); + UpdateIcons(); break; case ID_CONFIG_NOTIFYAREA: @@ -492,7 +492,7 @@ LRESULT NotifyArea::ProcessTrayNotification(int notify_code, NOTIFYICONDATA* pni entry._dwState |= NIS_HIDDEN; #endif - Refresh(); ///@todo call only if really changes occurred + UpdateIcons(); ///@todo call only if really changes occurred return TRUE; } @@ -505,7 +505,7 @@ LRESULT NotifyArea::ProcessTrayNotification(int notify_code, NOTIFYICONDATA* pni if (found->second._hIcon) DestroyIcon(found->second._hIcon); _icon_map.erase(found); - Refresh(); + UpdateIcons(); return TRUE; } break;} @@ -529,7 +529,7 @@ LRESULT NotifyArea::ProcessTrayNotification(int notify_code, NOTIFYICONDATA* pni return FALSE; } -void NotifyArea::Refresh() +void NotifyArea::UpdateIcons() { _sorted_icons.clear(); @@ -590,10 +590,8 @@ void NotifyArea::Paint() } } -void NotifyArea::TimerTick() +void NotifyArea::Refresh(bool update) { - bool do_refresh = false; - // Look for task icons without valid owner window. // This is an extended feature missing in MS Windows. for(NotifyIconSet::const_iterator it=_sorted_icons.begin(); it!=_sorted_icons.end(); ++it) { @@ -601,7 +599,7 @@ void NotifyArea::TimerTick() if (!IsWindow(entry._hWnd)) if (_icon_map.erase(entry)) // delete icons without valid owner window - ++do_refresh; + ++update; } DWORD now = GetTickCount(); @@ -616,14 +614,14 @@ void NotifyArea::TimerTick() case NIM_HIDE: if (!(entry._dwState & NIS_HIDDEN)) { entry._dwState |= NIS_HIDDEN; - ++do_refresh; + ++update; } break; case NIM_SHOW: if (entry._dwState&NIS_HIDDEN) { entry._dwState &= ~NIS_HIDDEN; - ++do_refresh; + ++update; } break; @@ -632,14 +630,14 @@ void NotifyArea::TimerTick() if (!(entry._dwState & NIS_HIDDEN)) if (now-entry._lastChange > ICON_AUTOHIDE_SECONDS*1000) { entry._dwState |= NIS_HIDDEN; - ++do_refresh; + ++update; } break; } } - if (do_refresh) - Refresh(); + if (update) + UpdateIcons(); } /// search for a icon at a given client coordinate position @@ -740,6 +738,14 @@ TrayNotifyDlg::TrayNotifyDlg(HWND hwnd) { _selectedItem = 0; + if (_pNotifyArea) { + // save original icon states and configuration data + for(NotifyIconMap::const_iterator it=_pNotifyArea->_icon_map.begin(); it!=_pNotifyArea->_icon_map.end(); ++it) + _icon_states_org[it->first] = IconStatePair(it->second._mode, it->second._dwState); + + _cfg_org = _pNotifyArea->_cfg; + } + SetWindowIcon(hwnd, IDI_REACTOS/*IDI_SEARCH*/); _haccel = LoadAccelerators(g_Globals._hInstance, MAKEINTRESOURCE(IDA_TRAYNOTIFY)); @@ -870,6 +876,8 @@ void TrayNotifyDlg::Refresh() TreeView_Expand(_tree_ctrl, _hitemCurrent_hidden, TVE_EXPAND); TreeView_Expand(_tree_ctrl, _hitemCurrent, TVE_EXPAND); TreeView_Expand(_tree_ctrl, _hitemConfig, TVE_EXPAND); + + TreeView_EnsureVisible(_tree_ctrl, _hitemCurrent_visible); } void TrayNotifyDlg::InsertItem(HTREEITEM hparent, HTREEITEM after, const NotifyInfo& entry, HDC hdc) @@ -947,7 +955,25 @@ int TrayNotifyDlg::Command(int id, int code) break; case IDOK: + EndDialog(_hwnd, id); + break; + case IDCANCEL: + // rollback changes + if (_pNotifyArea) { + // restore original icon states and configuration data + _pNotifyArea->_cfg = _cfg_org; + + for(IconStateMap::const_iterator it=_icon_states_org.begin(); it!=_icon_states_org.end(); ++it) { + NotifyInfo& info = _pNotifyArea->_icon_map[it->first]; + + info._mode = it->second.first; + info._dwState = it->second.second; + } + + SendMessage(*_pNotifyArea, PM_REFRESH, 0, 0); + } + EndDialog(_hwnd, id); break; } @@ -1022,7 +1048,8 @@ void TrayNotifyDlg::SetIconMode(NOTIFYICONMODE mode) entry._mode = mode; // trigger refresh in notify area and this dialog - SendMessage(*_pNotifyArea, PM_REFRESH, 0, 0); + if (_pNotifyArea) + SendMessage(*_pNotifyArea, PM_REFRESH, 0, 0); } if (_pNotifyArea) { diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.h b/reactos/subsys/system/explorer/taskbar/traynotify.h index 4f42b30167d..acfcf76a31f 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.h +++ b/reactos/subsys/system/explorer/taskbar/traynotify.h @@ -149,9 +149,9 @@ protected: int Command(int id, int code); int Notify(int id, NMHDR* pnmh); - void Refresh(); + void UpdateIcons(); void Paint(); - void TimerTick(); + void Refresh(bool do_refresh=false); void CancelModes(); NotifyIconSet::iterator IconHitTest(const POINT& pos); @@ -186,6 +186,12 @@ protected: HIMAGELIST _himl; NotifyArea* _pNotifyArea; + typedef pair IconStatePair; + typedef map IconStateMap; + + NotifyIconCfgList _cfg_org; + IconStateMap _icon_states_org; + HTREEITEM _hitemCurrent; HTREEITEM _hitemCurrent_visible; HTREEITEM _hitemCurrent_hidden; diff --git a/reactos/subsys/system/explorer/utility/utility.h b/reactos/subsys/system/explorer/utility/utility.h index 7fb8d68a459..45c858c6593 100644 --- a/reactos/subsys/system/explorer/utility/utility.h +++ b/reactos/subsys/system/explorer/utility/utility.h @@ -719,7 +719,7 @@ protected: }; - /// string class for convenience + /// string class for TCHAR strings struct String #ifdef UNICODE : public wstring From 287b32c8707780c2230b8678fccfbf593a8038b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sat, 27 Mar 2004 15:16:05 +0000 Subject: [PATCH 0657/1463] Return empty instead of NULL region for invisible windows svn path=/trunk/; revision=8889 --- reactos/subsys/win32k/ntuser/vis.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/vis.c b/reactos/subsys/win32k/ntuser/vis.c index 3fc1110de84..5943c2e0813 100644 --- a/reactos/subsys/win32k/ntuser/vis.c +++ b/reactos/subsys/win32k/ntuser/vis.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: vis.c,v 1.25 2004/03/23 18:08:07 weiden Exp $ + * $Id: vis.c,v 1.26 2004/03/27 15:16:05 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -54,12 +54,12 @@ VIS_ComputeVisibleRegion( { if(!(ClipRgn = VIS_ComputeVisibleRegion(Window, FALSE, ClipChildren, ClipSiblings))) { - return NULL; + return NtGdiCreateRectRgn(0, 0, 0, 0); } if(!(VisRgn = UnsafeIntCreateRectRgnIndirect(&Window->ClientRect))) { NtGdiDeleteObject(VisRgn); - return NULL; + return NtGdiCreateRectRgn(0, 0, 0, 0); } LeftOffset = Window->ClientRect.left - Window->WindowRect.left; TopOffset = Window->ClientRect.top - Window->WindowRect.top; @@ -75,7 +75,7 @@ VIS_ComputeVisibleRegion( TopOffset = Window->WindowRect.top; /* - * Walk through all perent windows and for each clip the visble region + * Walk through all parent windows and for each clip the visble region * to the parent's client area and exclude all siblings that are over * our window. */ @@ -87,7 +87,7 @@ VIS_ComputeVisibleRegion( if (!(CurrentWindow->Style & WS_VISIBLE)) { NtGdiDeleteObject(VisRgn); - return NULL; + return NtGdiCreateRectRgn(0, 0, 0, 0); } ClipRgn = UnsafeIntCreateRectRgnIndirect(&CurrentWindow->ClientRect); NtGdiCombineRgn(VisRgn, VisRgn, ClipRgn, RGN_AND); From bf1b24c1fb140c6033f85e0416c401fa7133926a Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sat, 27 Mar 2004 18:08:42 +0000 Subject: [PATCH 0658/1463] - XMLChildrenFilter iterator - correctly encode special characters while writing XML strings - MIT license for XmlStorage classes svn path=/trunk/; revision=8890 --- .../subsys/system/explorer/doxy-footer.html | 2 +- reactos/subsys/system/explorer/globals.h | 2 + .../system/explorer/taskbar/traynotify.cpp | 5 +- .../subsys/system/explorer/utility/utility.h | 34 +- .../system/explorer/utility/xmlstorage.cpp | 66 +-- .../system/explorer/utility/xmlstorage.h | 489 ++++++++++++++---- 6 files changed, 437 insertions(+), 161 deletions(-) diff --git a/reactos/subsys/system/explorer/doxy-footer.html b/reactos/subsys/system/explorer/doxy-footer.html index 4fd39a8383f..1552db4afb1 100644 --- a/reactos/subsys/system/explorer/doxy-footer.html +++ b/reactos/subsys/system/explorer/doxy-footer.html @@ -3,7 +3,7 @@

diff --git a/reactos/subsys/system/explorer/globals.h b/reactos/subsys/system/explorer/globals.h index 4aa271ab3d3..2712e3fe5a4 100644 --- a/reactos/subsys/system/explorer/globals.h +++ b/reactos/subsys/system/explorer/globals.h @@ -28,6 +28,8 @@ #include "utility/xmlstorage.h" +using namespace XMLStorage; + /// management of file types struct FileTypeInfo { diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index a298dafbd8d..c788b71117d 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -195,11 +195,10 @@ void NotifyArea::read_config() if (pos.go_down("explorer-cfg")) { if (pos.go_down("notify-icons")) { - const XMLNode::Children& children = pos->get_children(); + XMLChildrenFilter icons(pos, "icon"); - for(XMLNode::Children::const_iterator it=children.begin(); it!=children.end(); ++it) { + for(XMLChildrenFilter::iterator it=icons.begin(); it!=icons.end(); ++it) { const XMLNode& node = **it; - assert(node==TEXT("icon")); NotifyIconConfig cfg; diff --git a/reactos/subsys/system/explorer/utility/utility.h b/reactos/subsys/system/explorer/utility/utility.h index 45c858c6593..d4fd1255222 100644 --- a/reactos/subsys/system/explorer/utility/utility.h +++ b/reactos/subsys/system/explorer/utility/utility.h @@ -772,38 +772,6 @@ struct String operator wstring() const {WCHAR b[BUFFER_LEN]; return wstring(b, MultiByteToWideChar(CP_ACP, 0, c_str(), -1, b, BUFFER_LEN)-1);} #endif - void assign_utf8(const char* str) - { - TCHAR buffer[BUFFER_LEN]; - -#ifdef UNICODE - int l = MultiByteToWideChar(CP_UTF8, 0, str, -1, buffer, BUFFER_LEN) - 1; -#else - WCHAR wbuffer[BUFFER_LEN]; - - int l = MultiByteToWideChar(CP_UTF8, 0, str, -1, wbuffer, BUFFER_LEN) - 1; - l = WideCharToMultiByte(CP_ACP, 0, wbuffer, l, buffer, BUFFER_LEN, 0, 0); -#endif - - assign(buffer, l); - } - - string get_utf8() const - { - char buffer[BUFFER_LEN]; - -#ifdef UNICODE - int l = WideCharToMultiByte(CP_UTF8, 0, c_str(), length(), buffer, BUFFER_LEN, 0, 0); -#else - WCHAR wbuffer[BUFFER_LEN]; - - int l = MultiByteToWideChar(CP_ACP, 0, c_str(), length(), wbuffer, BUFFER_LEN); - l = WideCharToMultiByte(CP_UTF8, 0, wbuffer, l, buffer, BUFFER_LEN, 0, 0); -#endif - - return string(buffer, l); - } - String& printf(LPCTSTR fmt, ...) { va_list l; @@ -847,6 +815,8 @@ struct String } }; +#define _STRING_DEFINED + struct FmtString : public String { diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.cpp b/reactos/subsys/system/explorer/utility/xmlstorage.cpp index 0f44e77a4dd..e1b90f2b672 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.cpp +++ b/reactos/subsys/system/explorer/utility/xmlstorage.cpp @@ -1,50 +1,47 @@ -/* - * Copyright 2004 Martin Fuchs - * - * 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 - */ - // // XML storage classes // // xmlstorage.cpp // - // Martin Fuchs, 22.03.2004 + // Copyright (c) 2004, Martin Fuchs // +/* + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +*/ + #include "utility.h" #include "xmlstorage.h" -void xml_test() //@@ -{ - XMLDoc doc; - - doc.read("explorer-cfg.xml"); - doc.write("out.xml"); - - XMLPos pos(&doc); - - if (pos.go("\\explorer-cfg\\startmenu")) { - - pos.back(); - } -} +namespace XMLStorage { /// move X-Path like to position in XML tree @@ -107,3 +104,6 @@ void XMLCALL XMLReader::XML_DefaultHandler(void* userData, const XML_Char* s, in else pThis->_pos->append_trailing(s, len); } + + +} // namespace XMLStorage diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.h b/reactos/subsys/system/explorer/utility/xmlstorage.h index 0c1a7099328..6052d12d1a1 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.h +++ b/reactos/subsys/system/explorer/utility/xmlstorage.h @@ -1,42 +1,234 @@ -/* - * Copyright 2004 Martin Fuchs - * - * 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 - */ - // // XML storage classes // // xmlstorage.h // - // Martin Fuchs, 22.03.2004 + // Copyright (c) 2004, Martin Fuchs // -#include "expat.h" +/* -#include -#include -#include + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include "expat.h" #ifdef _MSC_VER #pragma comment(lib, "libexpat.lib") +#pragma warning(disable: 4786) #endif +#include // for LPCTSTR + +#ifdef UNICODE +#define _UNICODE +#endif +#include + +#include +#include +#include +#include +#include +#include + + +#ifndef BUFFER_LEN +#define BUFFER_LEN 2048 +#endif + + +namespace XMLStorage { + + +#ifndef _STRING_DEFINED + + /// string class for TCHAR strings + +struct String +#ifdef UNICODE + : public std::wstring +#else + : public std::string +#endif +{ +#ifdef UNICODE + typedef std::wstring super; +#else + typedef std::string super; +#endif + + String() {} + String(LPCTSTR s) {if (s) super::assign(s);} + String(LPCTSTR s, int l) : super(s, l) {} + String(const super& other) : super(other) {} + String(const String& other) : super(other) {} + +#ifdef UNICODE + String(LPCSTR s) {assign(s);} + 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();} +#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();} +#endif + + String& operator=(LPCTSTR s) {if (s) super::assign(s); else erase(); return *this;} + String& operator=(const super& s) {super::assign(s); return *this;} + void assign(LPCTSTR s) {super::assign(s);} + void assign(LPCTSTR s, int l) {super::assign(s, l);} + + 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);} +#else + operator std::wstring() const {WCHAR b[BUFFER_LEN]; return std::wstring(b, MultiByteToWideChar(CP_ACP, 0, c_str(), -1, b, BUFFER_LEN)-1);} +#endif + + String& printf(LPCTSTR fmt, ...) + { + va_list l; + TCHAR b[BUFFER_LEN]; + + va_start(l, fmt); + super::assign(b, _vstprintf(b, fmt, l)); + va_end(l); + + return *this; + } + + String& vprintf(LPCTSTR fmt, va_list l) + { + TCHAR b[BUFFER_LEN]; + + super::assign(b, _vstprintf(b, fmt, l)); + + return *this; + } + + String& appendf(LPCTSTR fmt, ...) + { + va_list l; + TCHAR b[BUFFER_LEN]; + + va_start(l, fmt); + super::append(b, _vstprintf(b, fmt, l)); + va_end(l); + + return *this; + } + + String& vappendf(LPCTSTR fmt, va_list l) + { + TCHAR b[BUFFER_LEN]; + + super::append(b, _vstprintf(b, fmt, l)); + + return *this; + } +}; + +#endif + + +inline void assign_utf8(String& s, const char* str) +{ + TCHAR buffer[BUFFER_LEN]; + +#ifdef UNICODE + int l = MultiByteToWideChar(CP_UTF8, 0, str, -1, buffer, BUFFER_LEN) - 1; +#else + WCHAR wbuffer[BUFFER_LEN]; + + int l = MultiByteToWideChar(CP_UTF8, 0, str, -1, wbuffer, BUFFER_LEN) - 1; + l = WideCharToMultiByte(CP_ACP, 0, wbuffer, l, buffer, BUFFER_LEN, 0, 0); +#endif + + s.assign(buffer, l); +} + +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); +#else + WCHAR wbuffer[BUFFER_LEN]; + + l = MultiByteToWideChar(CP_ACP, 0, s, l, wbuffer, BUFFER_LEN); + l = WideCharToMultiByte(CP_UTF8, 0, wbuffer, l, buffer, BUFFER_LEN, 0, 0); +#endif + + return std::string(buffer, l); +} + +inline std::string get_utf8(const String& s) +{ + return get_utf8(s.c_str(), s.length()); +} + +inline std::string XMLString(const String& s) +{ + TCHAR buffer[BUFFER_LEN]; + LPTSTR o = buffer; + + for(LPCTSTR p=s; *p; ++p) + switch(*p) { + case '&': + *o++ = '&'; *o++ = 'a'; *o++ = 'm'; *o++ = 'p'; *o++ = ';'; + break; + + case '<': + *o++ = '&'; *o++ = 'l'; *o++ = 't'; *o++ = ';'; + break; + + case '>': + *o++ = '&'; *o++ = 'g'; *o++ = 't'; *o++ = ';'; + break; + + default: + *o++ = *p; + } + + return get_utf8(buffer, o-buffer); +} + + // write XML files with 2 spaces indenting #define XML_INDENT_SPACE " " @@ -51,7 +243,7 @@ struct String_from_XML_Char : public String { String_from_XML_Char(const XML_Char* str) { - assign_utf8(str); + assign_utf8(*this, str); } }; @@ -61,8 +253,12 @@ struct String_from_XML_Char : public String /// in memory representation of an XML node struct XMLNode : public String { - typedef map AttributeMap; - typedef list Children; + typedef std::map AttributeMap; + typedef std::list Children; + + // access to protected class members for XMLPos anbd XMLReader + friend struct XMLPos; + friend struct XMLReader; XMLNode(const String& name) : String(name) @@ -105,6 +301,68 @@ struct XMLNode : public String return _children; } + Children& get_children() + { + return _children; + } + + /// write XML stream preserving original white space and comments + std::ostream& write(std::ostream& out) + { + out << "<" << XMLString(*this); + + for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it) + out << " " << XMLString(it->first) << "=\"" << XMLString(it->second) << "\""; + + if (!_children.empty() || !_content.empty()) { + out << ">" << _content; + + for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) + (*it)->write(out); + + out << "" << _trailing; + } else { + out << "/>" << _trailing; + } + + return out; + } + + /// print write node to stream without preserving original white space + std::ostream& write_formating(std::ostream& out, int indent=0) + { + for(int i=indent; i--; ) + out << XML_INDENT_SPACE; + + out << "<" << XMLString(*this); + + for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it) + out << " " << XMLString(it->first) << "=\"" << XMLString(it->second) << "\""; + + if (!_children.empty()) { + out << ">\n"; + + for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) + (*it)->write_formating(out, indent+1); + + for(int i=indent; i--; ) + out << XML_INDENT_SPACE; + + out << "\n"; + } else { + out << "/>\n"; + } + + return out; + } + +protected: + Children _children; + AttributeMap _attributes; + + std::string _content; + std::string _trailing; + XMLNode* get_first_child() const { if (!_children.empty()) @@ -149,63 +407,104 @@ struct XMLNode : public String else _children.back()->_trailing.append(s, l); } +}; - /// write XML stream preserving original white space and comments - ostream& write(ostream& out) + + /// iterator access to children nodes with name filtering +struct XMLChildrenFilter +{ + XMLChildrenFilter(XMLNode::Children& children, const String& name) + : _begin(children.begin(), children.end(), name), + _end(children.end(), children.end(), name) { - out << "<" << get_utf8(); - - for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it) - out << " " << it->first.get_utf8() << "=\"" << it->second.get_utf8() << "\""; - - if (!_children.empty() || !_content.empty()) { - out << ">" << _content; - - for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) - (*it)->write(out); - - out << "" << _trailing; - } else { - out << "/>" << _trailing; - } - - return out; } - /// print write node to stream without preserving original white space - ostream& write_formating(ostream& out, int indent=0) + XMLChildrenFilter(XMLNode* node, const String& name) + : _begin(node->get_children().begin(), node->get_children().end(), name), + _end(node->get_children().end(), node->get_children().end(), name) { - for(int i=indent; i--; ) - out << XML_INDENT_SPACE; + } - out << "<" << get_utf8(); + struct iterator + { + typedef XMLNode::Children::iterator BaseIterator; - for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it) - out << " " << it->first.get_utf8() << "=\"" << it->second.get_utf8() << "\""; - - if (!_children.empty()) { - out << ">\n"; - - for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) - (*it)->write_formating(out, indent+1); - - for(int i=indent; i--; ) - out << XML_INDENT_SPACE; - - out << "\n"; - } else { - out << "/>\n"; + iterator(BaseIterator begin, BaseIterator end, const String& filter_name) + : _cur(begin), + _end(end), + _filter_name(filter_name) + { + search_next(); } - return out; + operator BaseIterator() + { + return _cur; + } + + const XMLNode* operator*() const + { + return *_cur; + } + + XMLNode* operator*() + { + return *_cur; + } + + iterator& operator++() + { + ++_cur; + search_next(); + + return *this; + } + + iterator operator++(int) + { + iterator ret = *this; + + ++_cur; + search_next(); + + return ret; + } + + bool operator==(const BaseIterator& other) const + { + return _cur == other; + } + + bool operator!=(const BaseIterator& other) const + { + return _cur != other; + } + + protected: + BaseIterator _cur; + BaseIterator _end; + String _filter_name; + + void search_next() + { + while(_cur!=_end && **_cur!=_filter_name) + ++_cur; + } + }; + + iterator begin() + { + return _begin; + } + + iterator end() + { + return _end; } protected: - Children _children; - AttributeMap _attributes; - - string _content; - string _trailing; + iterator _begin; + iterator _end; }; @@ -219,11 +518,14 @@ struct XMLPos } /// access to current node - XMLNode* operator->() {return _cur;} - const XMLNode* operator->() const {return _cur;} + operator XMLNode*() {return _cur;} + operator const XMLNode*() const {return _cur;} + + const XMLNode* operator->() const {return _cur;} + XMLNode* operator->() {return _cur;} - XMLNode& operator*() {return *_cur;} const XMLNode& operator*() const {return *_cur;} + XMLNode& operator*() {return *_cur;} /// attribute access String& operator[](const String& attr_name) {return (*_cur)[attr_name];} @@ -301,7 +603,7 @@ struct XMLPos protected: XMLNode* _root; XMLNode* _cur; - stack _stack; + std::stack _stack; /// go to specified node void go_to(XMLNode* child) @@ -336,7 +638,7 @@ struct XMLReader XML_ParserFree(_parser); } - XML_Status read(istream& in) + XML_Status read(std::istream& in) { XML_Status status = XML_STATUS_OK; @@ -359,22 +661,22 @@ struct XMLReader return status; } - string get_position() const + std::string get_position() const { int line = XML_GetCurrentLineNumber(_parser); int column = XML_GetCurrentColumnNumber(_parser); - ostringstream out; + std::ostringstream out; out << "(" << line << ") : [column " << column << "]"; return out.str(); } - string get_error_string() const + std::string get_error_string() const { XML_Error error = XML_GetErrorCode(_parser); - ostringstream out; + std::ostringstream out; out << get_position() << " XML parser error #" << error << "\n"; return out.str(); @@ -383,8 +685,8 @@ struct XMLReader protected: XMLPos _pos; XML_Parser _parser; - string _xml_version; - string _encoding; + std::string _xml_version; + std::string _encoding; bool _in_tag; static void XMLCALL XML_XmlDeclHandler(void* userData, const XML_Char* version, const XML_Char* encoding, int standalone); @@ -401,28 +703,28 @@ struct XMLDoc : public XMLNode { } - XMLDoc(const string& path) + XMLDoc(const std::string& path) : XMLNode("") { read(path); } - istream& read(istream& in) + std::istream& read(std::istream& in) { XMLReader(this).read(in); return in; } - bool read(const string& path) + bool read(const std::string& path) { - ifstream in(path.c_str()); + std::ifstream in(path.c_str()); return XMLReader(this).read(in) != XML_STATUS_ERROR; } /// write XML stream preserving previous white space and comments - ostream& write(ostream& out, const string& xml_version="1.0", const string& encoding="UTF-8") + std::ostream& write(std::ostream& out, const std::string& xml_version="1.0", const std::string& encoding="UTF-8") { out << "\n"; @@ -433,7 +735,7 @@ struct XMLDoc : public XMLNode } /// write XML stream with formating - ostream& write_formating(ostream& out) + std::ostream& write_formating(std::ostream& out) { out << "\n"; @@ -443,17 +745,20 @@ struct XMLDoc : public XMLNode return out; } - void write(const string& path, const string& xml_version="1.0", const string& encoding="UTF-8") + void write(const std::string& path, const std::string& xml_version="1.0", const std::string& encoding="UTF-8") { - ofstream out(path.c_str()); + std::ofstream out(path.c_str()); write(out, xml_version); } - void write_formating(const string& path) + void write_formating(const std::string& path) { - ofstream out(path.c_str()); + std::ofstream out(path.c_str()); write_formating(out); } }; + + +} // namespace XMLStorage From 014d8e9588fe1366d34cfde74c7e0e55841037ef Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sat, 27 Mar 2004 19:41:32 +0000 Subject: [PATCH 0659/1463] - Rewritten some driver loading functions to get higher control of the driver loading and initialization process (Fixes bug #263). - Added support for lower level filter drivers. svn path=/trunk/; revision=8891 --- reactos/ntoskrnl/include/internal/io.h | 77 +- reactos/ntoskrnl/include/internal/ldr.h | 5 - reactos/ntoskrnl/io/device.c | 1190 +++++++++-------------- reactos/ntoskrnl/io/driver.c | 967 ++++++++++++------ reactos/ntoskrnl/io/iomgr.c | 27 +- reactos/ntoskrnl/io/pnpmgr.c | 70 +- reactos/ntoskrnl/ldr/loader.c | 103 +- 7 files changed, 1260 insertions(+), 1179 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/io.h b/reactos/ntoskrnl/include/internal/io.h index 082f9202512..45afb24d356 100644 --- a/reactos/ntoskrnl/include/internal/io.h +++ b/reactos/ntoskrnl/include/internal/io.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: io.h,v 1.40 2004/03/21 18:58:52 navaraf Exp $ +/* $Id: io.h,v 1.41 2004/03/27 19:41:31 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -32,6 +32,7 @@ #include #include +#include #ifndef __USE_W32API @@ -62,7 +63,6 @@ typedef struct _DEVICE_NODE struct _DEVICE_NODE *PrevSibling; struct _DEVICE_NODE *NextSibling; struct _DEVICE_NODE *Child; - PDRIVER_OBJECT DriverObject; PDEVICE_OBJECT Pdo; UNICODE_STRING InstancePath; UNICODE_STRING ServiceName; @@ -266,19 +266,6 @@ IopCreateDeviceNode(PDEVICE_NODE ParentNode, NTSTATUS IopFreeDeviceNode(PDEVICE_NODE DeviceNode); -NTSTATUS -IopCreateDriverObject(PDRIVER_OBJECT *DriverObject, - PUNICODE_STRING ServiceName, - BOOLEAN FileSystemDriver, - PVOID DriverImageStart, - ULONG DriverImageSize); -NTSTATUS -IopInitializeDriver(PDRIVER_INITIALIZE DriverEntry, - PDEVICE_NODE DeviceNode, - BOOLEAN FileSystemDriver, - PVOID DriverImageStart, - ULONG DriverImageSize, - BOOLEAN BootDriver); VOID IoInitCancelHandling(VOID); VOID @@ -388,37 +375,48 @@ PnpRootCreateDevice( /* device.c */ -NTSTATUS -IopAttachFilterDrivers( - PDEVICE_NODE DeviceNode, - BOOLEAN Lower); - -NTSTATUS -IopInitializeService( - PDEVICE_NODE DeviceNode, - PUNICODE_STRING ServiceName, - PUNICODE_STRING ImagePath); +NTSTATUS FASTCALL +IopInitializeDevice( + PDEVICE_NODE DeviceNode, + PDRIVER_OBJECT DriverObject); /* driver.c */ -VOID -IopInitializeBootDrivers( - VOID); +VOID FASTCALL +IopInitializeBootDrivers(VOID); -VOID -IopInitializeSystemDrivers( - VOID); +VOID FASTCALL +IopInitializeSystemDrivers(VOID); -NTSTATUS -IopInitializeDeviceNodeService( - PDEVICE_NODE DeviceNode, - PUNICODE_STRING ServiceName, - BOOLEAN BootDriverOnly); +NTSTATUS FASTCALL +IopCreateDriverObject( + PDRIVER_OBJECT *DriverObject, + PUNICODE_STRING ServiceName, + BOOLEAN FileSystemDriver, + PVOID DriverImageStart, + ULONG DriverImageSize); -VOID +NTSTATUS FASTCALL +IopLoadServiceModule( + IN PUNICODE_STRING ServiceName, + OUT PMODULE_OBJECT *ModuleObject); + +NTSTATUS FASTCALL +IopInitializeDriverModule( + IN PDEVICE_NODE DeviceNode, + IN PMODULE_OBJECT ModuleObject, + IN BOOLEAN FileSystemDriver, + OUT PDRIVER_OBJECT *DriverObject); + +NTSTATUS FASTCALL +IopAttachFilterDrivers( + PDEVICE_NODE DeviceNode, + BOOLEAN Lower); + +VOID FASTCALL IopMarkLastReinitializeDriver(VOID); -VOID +VOID FASTCALL IopReinitializeDrivers(VOID); /* pnpmgr.c */ @@ -431,7 +429,6 @@ IopInitializePnpServices( NTSTATUS IopInvalidateDeviceRelations( IN PDEVICE_NODE DeviceNode, - IN DEVICE_RELATION_TYPE Type, - IN BOOLEAN BootDriver); + IN DEVICE_RELATION_TYPE Type); #endif diff --git a/reactos/ntoskrnl/include/internal/ldr.h b/reactos/ntoskrnl/include/internal/ldr.h index 95feea6a3d2..ef93e8f0c19 100644 --- a/reactos/ntoskrnl/include/internal/ldr.h +++ b/reactos/ntoskrnl/include/internal/ldr.h @@ -34,11 +34,6 @@ LdrInitModuleManagement ( VOID ); -NTSTATUS -LdrInitializeBootStartDriver(IN PVOID ModuleLoadBase, - IN PCHAR FileName, - IN ULONG ModuleLength); - NTSTATUS LdrpMapSystemDll ( HANDLE ProcessHandle, diff --git a/reactos/ntoskrnl/io/device.c b/reactos/ntoskrnl/io/device.c index 5b9cfeb120f..ecf64fa8553 100644 --- a/reactos/ntoskrnl/io/device.c +++ b/reactos/ntoskrnl/io/device.c @@ -1,4 +1,4 @@ -/* $Id: device.c,v 1.68 2004/03/21 18:58:53 navaraf Exp $ +/* $Id: device.c,v 1.69 2004/03/27 19:41:32 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -9,7 +9,7 @@ * 15/05/98: Created */ -/* INCLUDES ****************************************************************/ +/* INCLUDES *******************************************************************/ #define NTOS_MODE_KERNEL #include @@ -22,99 +22,219 @@ #include #define NDEBUG -//#define DBG #include -/* GLOBALS *******************************************************************/ +#define ASSERT assert + +/* GLOBALS ********************************************************************/ -#define TAG_DRIVER TAG('D', 'R', 'V', 'R') -#define TAG_DRIVER_EXTENSION TAG('D', 'R', 'V', 'E') #define TAG_DEVICE_EXTENSION TAG('D', 'E', 'X', 'T') -#define DRIVER_REGISTRY_KEY_BASENAME L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\" +/* PRIVATE FUNCTIONS **********************************************************/ -/* FUNCTIONS ***************************************************************/ - -/* - * @implemented - */ -NTSTATUS STDCALL -IoAttachDeviceByPointer(IN PDEVICE_OBJECT SourceDevice, - IN PDEVICE_OBJECT TargetDevice) +NTSTATUS FASTCALL +IopInitializeDevice( + PDEVICE_NODE DeviceNode, + PDRIVER_OBJECT DriverObject) { - PDEVICE_OBJECT AttachedDevice; + IO_STATUS_BLOCK IoStatusBlock; + IO_STACK_LOCATION Stack; + PDEVICE_OBJECT Fdo; + NTSTATUS Status; - DPRINT("IoAttachDeviceByPointer(SourceDevice %x, TargetDevice %x)\n", - SourceDevice, - TargetDevice); + if (DriverObject->DriverExtension->AddDevice) + { + /* This is a Plug and Play driver */ + DPRINT("Plug and Play driver found\n"); - AttachedDevice = IoAttachDeviceToDeviceStack (SourceDevice, - TargetDevice); - if (AttachedDevice == NULL) - return STATUS_NO_SUCH_DEVICE; + ASSERT(DeviceNode->Pdo); - return STATUS_SUCCESS; + DPRINT("Calling driver AddDevice entrypoint at %08lx\n", + DriverObject->DriverExtension->AddDevice); + + Status = DriverObject->DriverExtension->AddDevice( + DriverObject, DeviceNode->Pdo); + + if (!NT_SUCCESS(Status)) + { + return Status; + } + + Fdo = IoGetAttachedDeviceReference(DeviceNode->Pdo); + + if (Fdo == DeviceNode->Pdo) + { + /* FIXME: What do we do? Unload the driver or just disable the device? */ + DbgPrint("An FDO was not attached\n"); + KEBUGCHECK(0); + } + + IopDeviceNodeSetFlag(DeviceNode, DNF_ADDED); + + DPRINT("Sending IRP_MN_START_DEVICE to driver\n"); + + /* FIXME: Put some resources in the IRP for the device */ + Stack.Parameters.StartDevice.AllocatedResources = NULL; + Stack.Parameters.StartDevice.AllocatedResourcesTranslated = NULL; + + Status = IopInitiatePnpIrp( + Fdo, + &IoStatusBlock, + IRP_MN_START_DEVICE, + &Stack); + + if (!NT_SUCCESS(Status)) + { + DPRINT("IopInitiatePnpIrp() failed\n"); + ObDereferenceObject(Fdo); + return Status; + } + + if (Fdo->DeviceType == FILE_DEVICE_BUS_EXTENDER) + { + DPRINT("Bus extender found\n"); + + Status = IopInvalidateDeviceRelations(DeviceNode, BusRelations); + + if (!NT_SUCCESS(Status)) + { + ObDereferenceObject(Fdo); + return Status; + } + } + else if (Fdo->DeviceType == FILE_DEVICE_ACPI) + { +#ifdef ACPI + static BOOLEAN SystemPowerDeviceNodeCreated = FALSE; + + /* There can be only one system power device */ + if (!SystemPowerDeviceNodeCreated) + { + PopSystemPowerDeviceNode = DeviceNode; + SystemPowerDeviceNodeCreated = TRUE; + } +#endif /* ACPI */ + } + ObDereferenceObject(Fdo); + } + + return STATUS_SUCCESS; } +NTSTATUS STDCALL +IopCreateDevice( + PVOID ObjectBody, + PVOID Parent, + PWSTR RemainingPath, + POBJECT_ATTRIBUTES ObjectAttributes) +{ + DPRINT("IopCreateDevice(ObjectBody %x, Parent %x, RemainingPath %S)\n", + ObjectBody, Parent, RemainingPath); + + if (RemainingPath != NULL && wcschr(RemainingPath + 1, '\\') != NULL) + return STATUS_UNSUCCESSFUL; + + return STATUS_SUCCESS; +} + +/* PUBLIC FUNCTIONS ***********************************************************/ /* - * @implemented + * IoAttachDeviceByPointer + * + * Status + * @implemented */ + +NTSTATUS STDCALL +IoAttachDeviceByPointer( + IN PDEVICE_OBJECT SourceDevice, + IN PDEVICE_OBJECT TargetDevice) +{ + PDEVICE_OBJECT AttachedDevice; + + DPRINT("IoAttachDeviceByPointer(SourceDevice %x, TargetDevice %x)\n", + SourceDevice, TargetDevice); + + AttachedDevice = IoAttachDeviceToDeviceStack(SourceDevice, TargetDevice); + if (AttachedDevice == NULL) + return STATUS_NO_SUCH_DEVICE; + + return STATUS_SUCCESS; +} + +/* + * IoDeleteDevice + * + * Status + * @implemented + */ + VOID STDCALL IoDeleteDevice(PDEVICE_OBJECT DeviceObject) { - PDEVICE_OBJECT Previous; + PDEVICE_OBJECT Previous; - if (DeviceObject->Flags & DO_SHUTDOWN_REGISTERED) - IoUnregisterShutdownNotification(DeviceObject); + if (DeviceObject->Flags & DO_SHUTDOWN_REGISTERED) + IoUnregisterShutdownNotification(DeviceObject); - /* remove the timer if it exists */ - if (DeviceObject->Timer) - { - IoStopTimer(DeviceObject); - ExFreePool(DeviceObject->Timer); - } + /* Remove the timer if it exists */ + if (DeviceObject->Timer) + { + IoStopTimer(DeviceObject); + ExFreePool(DeviceObject->Timer); + } - /* free device extension */ - if (DeviceObject->DeviceObjectExtension) - ExFreePool (DeviceObject->DeviceObjectExtension); + /* Free device extension */ + if (DeviceObject->DeviceObjectExtension) + ExFreePool(DeviceObject->DeviceObjectExtension); - /* remove device from driver device list */ - Previous = DeviceObject->DriverObject->DeviceObject; - if (Previous == DeviceObject) - { - DeviceObject->DriverObject->DeviceObject = DeviceObject->NextDevice; - } - else - { - while (Previous->NextDevice != DeviceObject) - Previous = Previous->NextDevice; - Previous->NextDevice = DeviceObject->NextDevice; - } + /* Remove device from driver device list */ + Previous = DeviceObject->DriverObject->DeviceObject; + if (Previous == DeviceObject) + { + DeviceObject->DriverObject->DeviceObject = DeviceObject->NextDevice; + } + else + { + while (Previous->NextDevice != DeviceObject) + Previous = Previous->NextDevice; + Previous->NextDevice = DeviceObject->NextDevice; + } - ObDereferenceObject (DeviceObject); + ObDereferenceObject(DeviceObject); } - /* - * @implemented + * IoGetRelatedDeviceObject + * + * Remarks + * See "Windows NT File System Internals", page 633 - 634. + * + * Status + * @implemented */ -PDEVICE_OBJECT -STDCALL -IoGetRelatedDeviceObject ( - IN PFILE_OBJECT FileObject - ) -{ - /*Win NT File System Internals, page 633-634*/ - /*get logical volume mounted on a physical/virtual/logical device*/ +PDEVICE_OBJECT STDCALL +IoGetRelatedDeviceObject( + IN PFILE_OBJECT FileObject) +{ + /* + * Get logical volume mounted on a physical/virtual/logical device + */ + if (FileObject->Vpb && FileObject->Vpb->DeviceObject) { return IoGetAttachedDevice(FileObject->Vpb->DeviceObject); } - /*check if fileobject has an associated device object mounted by some other file system*/ - if (FileObject->DeviceObject->Vpb && FileObject->DeviceObject->Vpb->DeviceObject) + /* + * Check if file object has an associated device object mounted by some + * other file system. + */ + + if (FileObject->DeviceObject->Vpb && + FileObject->DeviceObject->Vpb->DeviceObject) { return IoGetAttachedDevice(FileObject->DeviceObject->Vpb->DeviceObject); } @@ -122,636 +242,228 @@ IoGetRelatedDeviceObject ( return IoGetAttachedDevice(FileObject->DeviceObject); } - /* - * @implemented + * IoGetDeviceObjectPointer + * + * Status + * @implemented */ -NTSTATUS -STDCALL -IoGetDeviceObjectPointer ( - IN PUNICODE_STRING ObjectName, - IN ACCESS_MASK DesiredAccess, - OUT PFILE_OBJECT * FileObject, - OUT PDEVICE_OBJECT * DeviceObject) + +NTSTATUS STDCALL +IoGetDeviceObjectPointer( + IN PUNICODE_STRING ObjectName, + IN ACCESS_MASK DesiredAccess, + OUT PFILE_OBJECT *FileObject, + OUT PDEVICE_OBJECT *DeviceObject) { - OBJECT_ATTRIBUTES ObjectAttributes; - IO_STATUS_BLOCK StatusBlock; - PFILE_OBJECT LocalFileObject; - HANDLE FileHandle; - NTSTATUS Status; + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK StatusBlock; + PFILE_OBJECT LocalFileObject; + HANDLE FileHandle; + NTSTATUS Status; - DPRINT("IoGetDeviceObjectPointer(ObjectName %wZ, DesiredAccess %x, FileObject %p DeviceObject %p)\n", - ObjectName, - DesiredAccess, - FileObject, - DeviceObject); + DPRINT("IoGetDeviceObjectPointer(ObjectName %wZ, DesiredAccess %x, FileObject %p DeviceObject %p)\n", + ObjectName, DesiredAccess, FileObject, DeviceObject); - InitializeObjectAttributes (&ObjectAttributes, - ObjectName, - 0, - NULL, - NULL); + InitializeObjectAttributes( + &ObjectAttributes, + ObjectName, + 0, + NULL, + NULL); - Status = NtOpenFile (&FileHandle, - DesiredAccess, - &ObjectAttributes, - &StatusBlock, - 0, - FILE_NON_DIRECTORY_FILE); - if (!NT_SUCCESS(Status)) - return Status; + Status = NtOpenFile( + &FileHandle, + DesiredAccess, + &ObjectAttributes, + &StatusBlock, + 0, + FILE_NON_DIRECTORY_FILE); - Status = ObReferenceObjectByHandle (FileHandle, - 0, - IoFileObjectType, - KernelMode, - (PVOID*)&LocalFileObject, - NULL); - if (NT_SUCCESS(Status)) - { - *DeviceObject = IoGetRelatedDeviceObject (LocalFileObject); - *FileObject = LocalFileObject; - } - NtClose (FileHandle); + if (!NT_SUCCESS(Status)) + return Status; - return Status; + Status = ObReferenceObjectByHandle( + FileHandle, + 0, + IoFileObjectType, + KernelMode, + (PVOID*)&LocalFileObject, + NULL); + + if (NT_SUCCESS(Status)) + { + *DeviceObject = IoGetRelatedDeviceObject(LocalFileObject); + *FileObject = LocalFileObject; + } + + NtClose(FileHandle); + + return Status; } - /* - * @unimplemented + * IoDetachDevice + * + * Status + * @unimplemented */ -VOID -STDCALL + +VOID STDCALL IoDetachDevice(PDEVICE_OBJECT TargetDevice) { -// UNIMPLEMENTED; DPRINT("IoDetachDevice(TargetDevice %x) - UNIMPLEMENTED\n", TargetDevice); } - /* - * @implemented + * IoGetAttachedDevice + * + * Status + * @implemented */ -PDEVICE_OBJECT -STDCALL + +PDEVICE_OBJECT STDCALL IoGetAttachedDevice(PDEVICE_OBJECT DeviceObject) { PDEVICE_OBJECT Current = DeviceObject; -// DPRINT("IoGetAttachedDevice(DeviceObject %x)\n",DeviceObject); - - while (Current->AttachedDevice!=NULL) - { - Current = Current->AttachedDevice; -// DPRINT("Current %x\n",Current); - } + while (Current->AttachedDevice != NULL) + Current = Current->AttachedDevice; -// DPRINT("IoGetAttachedDevice() = %x\n",DeviceObject); - return(Current); + return Current; } /* - * @implemented + * IoGetAttachedDeviceReference + * + * Status + * @implemented */ -PDEVICE_OBJECT -STDCALL + +PDEVICE_OBJECT STDCALL IoGetAttachedDeviceReference(PDEVICE_OBJECT DeviceObject) { - PDEVICE_OBJECT Current = DeviceObject; - - while (Current->AttachedDevice!=NULL) - { - Current = Current->AttachedDevice; - } - + PDEVICE_OBJECT Current = IoGetAttachedDevice(DeviceObject); ObReferenceObject(Current); - return(Current); + return Current; } /* - * @implemented + * IoAttachDeviceToDeviceStack + * + * Status + * @implemented */ + PDEVICE_OBJECT STDCALL -IoAttachDeviceToDeviceStack(PDEVICE_OBJECT SourceDevice, - PDEVICE_OBJECT TargetDevice) +IoAttachDeviceToDeviceStack( + PDEVICE_OBJECT SourceDevice, + PDEVICE_OBJECT TargetDevice) { PDEVICE_OBJECT AttachedDevice; DPRINT("IoAttachDeviceToDeviceStack(SourceDevice %x, TargetDevice %x)\n", - SourceDevice,TargetDevice); + SourceDevice, TargetDevice); AttachedDevice = IoGetAttachedDevice(TargetDevice); AttachedDevice->AttachedDevice = SourceDevice; SourceDevice->AttachedDevice = NULL; SourceDevice->StackSize = AttachedDevice->StackSize + 1; SourceDevice->Vpb = AttachedDevice->Vpb; - return(AttachedDevice); + return AttachedDevice; } - -NTSTATUS STDCALL -IopDefaultDispatchFunction(PDEVICE_OBJECT DeviceObject, - PIRP Irp) -{ - Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; - Irp->IoStatus.Information = 0; - - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return(STATUS_NOT_IMPLEMENTED); -} - - -NTSTATUS -IopCreateDriverObject(PDRIVER_OBJECT *DriverObject, - PUNICODE_STRING ServiceName, - BOOLEAN FileSystem, - PVOID DriverImageStart, - ULONG DriverImageSize) -{ - PDRIVER_OBJECT Object; - ULONG i; - WCHAR NameBuffer[MAX_PATH]; - UNICODE_STRING DriverName; - OBJECT_ATTRIBUTES ObjectAttributes; - NTSTATUS Status; - - DPRINT("IopCreateDriverObject(%p '%wZ' %x %p %x)\n", DriverObject, ServiceName, FileSystem, - DriverImageStart, DriverImageSize); - - *DriverObject = NULL; - - /* Create ModuleName string */ - if ((ServiceName != NULL) && (ServiceName->Buffer != NULL)) - { - if (FileSystem == TRUE) - wcscpy(NameBuffer, FILESYSTEM_ROOT_NAME); - else - wcscpy(NameBuffer, DRIVER_ROOT_NAME); - wcscat(NameBuffer, ServiceName->Buffer); - - RtlInitUnicodeString(&DriverName, - NameBuffer); - DPRINT("Driver name: '%wZ'\n", &DriverName); - } - - /* Initialize ObjectAttributes for driver object */ - InitializeObjectAttributes(&ObjectAttributes, - ((ServiceName != NULL) && (ServiceName->Buffer != NULL))? &DriverName : NULL, - OBJ_PERMANENT, - NULL, - NULL); - - /* Create driver object */ - Status = ObCreateObject(KernelMode, - IoDriverObjectType, - &ObjectAttributes, - KernelMode, - NULL, - sizeof(DRIVER_OBJECT), - 0, - 0, - (PVOID*)&Object); - if (!NT_SUCCESS(Status)) - { - return(Status); - } - - /* Create driver extension */ - Object->DriverExtension = (PDRIVER_EXTENSION) - ExAllocatePoolWithTag(NonPagedPool, - sizeof(DRIVER_EXTENSION), - TAG_DRIVER_EXTENSION); - if (Object->DriverExtension == NULL) - { - ExFreePool(Object); - return(STATUS_INSUFFICIENT_RESOURCES); - } - - RtlZeroMemory(Object->DriverExtension, sizeof(DRIVER_EXTENSION)); - - Object->Type = InternalDriverType; - - Object->DriverStart = DriverImageStart; - Object->DriverSize = DriverImageSize; - - for (i=0; i<=IRP_MJ_MAXIMUM_FUNCTION; i++) - { - Object->MajorFunction[i] = (PDRIVER_DISPATCH) IopDefaultDispatchFunction; - } - - *DriverObject = Object; - - return STATUS_SUCCESS; -} - - -NTSTATUS STDCALL -IopAttachFilterDriversCallback( - PWSTR ValueName, - ULONG ValueType, - PVOID ValueData, - ULONG ValueLength, - PVOID Context, - PVOID EntryContext) -{ - PDEVICE_NODE DeviceNode = Context; - UNICODE_STRING ServiceName; - PWCHAR Filters; - - Filters = ValueData; - while (((ULONG_PTR)Filters - (ULONG_PTR)ValueData) < ValueLength && - *Filters != 0) - { - DPRINT1("Filter Driver: %S (%wZ)\n", Filters, &DeviceNode->InstancePath); - ServiceName.Buffer = Filters; - ServiceName.MaximumLength = - ServiceName.Length = wcslen(Filters) * sizeof(WCHAR); - IopInitializeDeviceNodeService( - DeviceNode, - &ServiceName, - FALSE); - Filters += (ServiceName.Length / sizeof(WCHAR)) + 1; - } - - return STATUS_SUCCESS; -} - - -NTSTATUS -IopAttachFilterDrivers( - PDEVICE_NODE DeviceNode, - BOOLEAN Lower) -{ - RTL_QUERY_REGISTRY_TABLE QueryTable[2]; - PWCHAR KeyBuffer; - UNICODE_STRING Class; - WCHAR ClassBuffer[40]; - NTSTATUS Status; - - /* - * First load the device filters - */ - - QueryTable[0].QueryRoutine = IopAttachFilterDriversCallback; - if (Lower) - QueryTable[0].Name = L"LowerFilters"; - else - QueryTable[0].Name = L"UpperFilters"; - QueryTable[0].EntryContext = NULL; - QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED; - QueryTable[1].QueryRoutine = NULL; - QueryTable[1].Name = NULL; - - KeyBuffer = ExAllocatePool( - PagedPool, - (49 * sizeof(WCHAR)) + DeviceNode->InstancePath.Length); - wcscpy(KeyBuffer, L"\\Registry\\Machine\\System\\CurrentControlSet\\Enum\\"); - wcscat(KeyBuffer, DeviceNode->InstancePath.Buffer); - - RtlQueryRegistryValues( - RTL_REGISTRY_ABSOLUTE, - KeyBuffer, - QueryTable, - DeviceNode, - NULL); - - /* - * Now get the class GUID - */ - - Class.Length = 0; - Class.MaximumLength = 40 * sizeof(WCHAR); - Class.Buffer = ClassBuffer; - QueryTable[0].QueryRoutine = NULL; - QueryTable[0].Name = L"ClassGUID"; - QueryTable[0].EntryContext = &Class; - QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED | RTL_QUERY_REGISTRY_DIRECT; - - Status = RtlQueryRegistryValues( - RTL_REGISTRY_ABSOLUTE, - KeyBuffer, - QueryTable, - DeviceNode, - NULL); - - ExFreePool(KeyBuffer); - - /* - * Load the class filter driver - */ - - if (NT_SUCCESS(Status)) - { - QueryTable[0].QueryRoutine = IopAttachFilterDriversCallback; - if (Lower) - QueryTable[0].Name = L"LowerFilters"; - else - QueryTable[0].Name = L"UpperFilters"; - QueryTable[0].EntryContext = NULL; - QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED; - - KeyBuffer = ExAllocatePool(PagedPool, (58 * sizeof(WCHAR)) + Class.Length); - wcscpy(KeyBuffer, L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Class\\"); - wcscat(KeyBuffer, ClassBuffer); - - RtlQueryRegistryValues( - RTL_REGISTRY_ABSOLUTE, - KeyBuffer, - QueryTable, - DeviceNode, - NULL); - - ExFreePool(KeyBuffer); - } - - return STATUS_SUCCESS; -} - - -NTSTATUS -IopInitializeDevice(PDEVICE_NODE DeviceNode, - BOOLEAN BootDriver) -{ - IO_STATUS_BLOCK IoStatusBlock; - PDRIVER_OBJECT DriverObject; - IO_STACK_LOCATION Stack; - PDEVICE_OBJECT Fdo; - NTSTATUS Status; - - DriverObject = DeviceNode->DriverObject; - - if (DriverObject->DriverExtension->AddDevice) - { - /* This is a Plug and Play driver */ - DPRINT("Plug and Play driver found\n"); - - assert(DeviceNode->Pdo); - - DPRINT("Calling driver AddDevice entrypoint at %08lx\n", - DriverObject->DriverExtension->AddDevice); - Status = DriverObject->DriverExtension->AddDevice( - DriverObject, DeviceNode->Pdo); - if (!NT_SUCCESS(Status)) - { - return(Status); - } - - IopDeviceNodeSetFlag(DeviceNode, DNF_ADDED); - - DPRINT("Sending IRP_MN_START_DEVICE to driver\n"); - - Fdo = IoGetAttachedDeviceReference(DeviceNode->Pdo); - - if (Fdo == DeviceNode->Pdo) - { - /* FIXME: What do we do? Unload the driver or just disable the device? */ - DbgPrint("An FDO was not attached\n"); - KEBUGCHECK(0); - } - - /* FIXME: Put some resources in the IRP for the device */ - Stack.Parameters.StartDevice.AllocatedResources = NULL; - Stack.Parameters.StartDevice.AllocatedResourcesTranslated = NULL; - - Status = IopInitiatePnpIrp( - Fdo, - &IoStatusBlock, - IRP_MN_START_DEVICE, - &Stack); - if (!NT_SUCCESS(Status)) - { - DPRINT("IopInitiatePnpIrp() failed\n"); - ObDereferenceObject(Fdo); - return(Status); - } - - if (Fdo->DeviceType == FILE_DEVICE_BUS_EXTENDER) - { - DPRINT("Bus extender found\n"); - - Status = IopInvalidateDeviceRelations( - DeviceNode, BusRelations, BootDriver); - if (!NT_SUCCESS(Status)) - { - ObDereferenceObject(Fdo); - return(Status); - } - } - else if (Fdo->DeviceType == FILE_DEVICE_ACPI) - { -#ifdef ACPI - static BOOLEAN SystemPowerDeviceNodeCreated = FALSE; - - /* There can be only one system power device */ - if (!SystemPowerDeviceNodeCreated) - { - PopSystemPowerDeviceNode = DeviceNode; - SystemPowerDeviceNodeCreated = TRUE; - } -#endif /* ACPI */ - } - ObDereferenceObject(Fdo); - } - - return STATUS_SUCCESS; -} - -NTSTATUS -IopInitializeService( - PDEVICE_NODE DeviceNode, - PUNICODE_STRING ServiceName, - PUNICODE_STRING ImagePath) -{ - PMODULE_OBJECT ModuleObject; - NTSTATUS Status; - - ModuleObject = LdrGetModuleObject(ServiceName); - if (ModuleObject == NULL) - { - /* The module is currently not loaded, so load it now */ - - Status = LdrLoadModule(ImagePath, &ModuleObject); - if (!NT_SUCCESS(Status)) - { - /* FIXME: Log the error */ - CPRINT("Driver load failed\n"); - return(Status); - } - - Status = IopInitializeDriver(ModuleObject->EntryPoint, DeviceNode, FALSE, - ModuleObject->Base, ModuleObject->Length, - FALSE); - if (!NT_SUCCESS(Status)) - { - LdrUnloadModule(ModuleObject); - - /* FIXME: Log the error */ - CPRINT("A driver failed to initialize\n"); - return(Status); - } - } else - { - /* FIXME: This doesn't work for two devices with the same driver */ - Status = IopInitializeDevice(DeviceNode, FALSE); - } - - return(Status); -} - -NTSTATUS -IopInitializeDriver(PDRIVER_INITIALIZE DriverEntry, - PDEVICE_NODE DeviceNode, - BOOLEAN FileSystemDriver, - PVOID DriverImageStart, - ULONG DriverImageSize, - BOOLEAN BootDriver) -/* - * FUNCTION: Called to initalize a loaded driver - * ARGUMENTS: - * DriverEntry = Pointer to driver entry routine - * DeviceNode = Pointer to device node - */ -{ - WCHAR RegistryKeyBuffer[MAX_PATH]; - PDRIVER_OBJECT DriverObject; - UNICODE_STRING RegistryKey; - NTSTATUS Status; - - DPRINT("IopInitializeDriver(DriverEntry %08lx, DeviceNode %08lx)\n", - DriverEntry, DeviceNode); - - Status = IopCreateDriverObject(&DriverObject, - &DeviceNode->ServiceName, - FileSystemDriver, - DriverImageStart, - DriverImageSize); - if (!NT_SUCCESS(Status)) - { - return(Status); - } - - DeviceNode->DriverObject = DriverObject; - - if (DeviceNode->ServiceName.Buffer) - { - wcscpy(RegistryKeyBuffer, DRIVER_REGISTRY_KEY_BASENAME); - wcscat(RegistryKeyBuffer, DeviceNode->ServiceName.Buffer); - RtlInitUnicodeString(&RegistryKey, RegistryKeyBuffer); - } - else - { - RtlInitUnicodeString(&RegistryKey, NULL); - } - - DPRINT("RegistryKey: %wZ\n", &RegistryKey); - DPRINT("Calling driver entrypoint at %08lx\n", DriverEntry); - - IopMarkLastReinitializeDriver(); - - Status = DriverEntry(DriverObject, &RegistryKey); - if (!NT_SUCCESS(Status)) - { - DeviceNode->DriverObject = NULL; - ExFreePool(DriverObject->DriverExtension); - ObMakeTemporaryObject(DriverObject); - ObDereferenceObject(DriverObject); - return(Status); - } - - IopReinitializeDrivers(); - - Status = IopInitializeDevice(DeviceNode, BootDriver); - - return(Status); -} - - /* - * @implemented + * IoAttachDevice + * + * Layers a device over the highest device in a device stack. + * + * Parameters + * SourceDevice + * Device to be attached. + * + * TargetDevice + * Name of the target device. + * + * AttachedDevice + * Caller storage for the device attached to. + * + * Status + * @implemented */ + NTSTATUS STDCALL -IoAttachDevice(PDEVICE_OBJECT SourceDevice, - PUNICODE_STRING TargetDeviceName, - PDEVICE_OBJECT* AttachedDevice) -/* - * FUNCTION: Layers a device over the highest device in a device stack - * ARGUMENTS: - * SourceDevice = Device to attached - * TargetDevice = Name of the target device - * AttachedDevice (OUT) = Caller storage for the device attached to - */ +IoAttachDevice( + PDEVICE_OBJECT SourceDevice, + PUNICODE_STRING TargetDeviceName, + PDEVICE_OBJECT *AttachedDevice) { - NTSTATUS Status; - PFILE_OBJECT FileObject; + NTSTATUS Status; + PFILE_OBJECT FileObject; PDEVICE_OBJECT TargetDevice; - Status = IoGetDeviceObjectPointer(TargetDeviceName, - FILE_READ_ATTRIBUTES, - &FileObject, - &TargetDevice); + Status = IoGetDeviceObjectPointer( + TargetDeviceName, + FILE_READ_ATTRIBUTES, + &FileObject, + &TargetDevice); if (!NT_SUCCESS(Status)) { return Status; } - *AttachedDevice = IoAttachDeviceToDeviceStack(SourceDevice, - TargetDevice); + *AttachedDevice = IoAttachDeviceToDeviceStack( + SourceDevice, + TargetDevice); ObDereferenceObject(FileObject); + return STATUS_SUCCESS; } +/* + * IoCreateDevice + * + * Allocates memory for and intializes a device object for use for + * a driver. + * + * Parameters + * DriverObject + * Driver object passed by IO Manager when the driver was loaded. + * + * DeviceExtensionSize + * Number of bytes for the device extension. + * + * DeviceName + * Unicode name of device. + * + * DeviceType + * Device type of the new device. + * + * DeviceCharacteristics + * Bit mask of device characteristics. + * + * Exclusive + * TRUE if only one thread can access the device at a time. + * + * DeviceObject + * On successful return this parameter is filled by pointer to + * allocated device object. + * + * Status + * @implemented + */ NTSTATUS STDCALL -IopCreateDevice(PVOID ObjectBody, - PVOID Parent, - PWSTR RemainingPath, - POBJECT_ATTRIBUTES ObjectAttributes) -{ - - DPRINT("IopCreateDevice(ObjectBody %x, Parent %x, RemainingPath %S)\n", - ObjectBody, Parent, RemainingPath); - - if (RemainingPath != NULL && wcschr(RemainingPath+1, '\\') != NULL) - { - return(STATUS_UNSUCCESSFUL); - } - - return(STATUS_SUCCESS); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -IoCreateDevice(PDRIVER_OBJECT DriverObject, - ULONG DeviceExtensionSize, - PUNICODE_STRING DeviceName, - DEVICE_TYPE DeviceType, - ULONG DeviceCharacteristics, - BOOLEAN Exclusive, - PDEVICE_OBJECT* DeviceObject) -/* - * FUNCTION: Allocates memory for and intializes a device object for use for - * a driver - * ARGUMENTS: - * DriverObject : Driver object passed by iomgr when the driver was - * loaded - * DeviceExtensionSize : Number of bytes for the device extension - * DeviceName : Unicode name of device - * DeviceType : Device type - * DeviceCharacteristics : Bit mask of device characteristics - * Exclusive : True if only one thread can access the device at a - * time - * RETURNS: - * Success or failure - * DeviceObject : Contains a pointer to allocated device object - * if the call succeeded - * NOTES: See the DDK documentation for more information - */ +IoCreateDevice( + PDRIVER_OBJECT DriverObject, + ULONG DeviceExtensionSize, + PUNICODE_STRING DeviceName, + DEVICE_TYPE DeviceType, + ULONG DeviceCharacteristics, + BOOLEAN Exclusive, + PDEVICE_OBJECT *DeviceObject) { PDEVICE_OBJECT CreatedDeviceObject; PDEVOBJ_EXTENSION DeviceObjectExtension; @@ -761,146 +473,160 @@ IoCreateDevice(PDRIVER_OBJECT DriverObject, assert_irql(PASSIVE_LEVEL); if (DeviceName != NULL) - { - DPRINT("IoCreateDevice(DriverObject %x, DeviceName %S)\n",DriverObject, - DeviceName->Buffer); - } + { + DPRINT("IoCreateDevice(DriverObject %x, DeviceName %S)\n", + DriverObject, DeviceName->Buffer); + } else - { - DPRINT("IoCreateDevice(DriverObject %x)\n",DriverObject); - } + { + DPRINT("IoCreateDevice(DriverObject %x)\n",DriverObject); + } if (DeviceName != NULL) - { - InitializeObjectAttributes(&ObjectAttributes,DeviceName,0,NULL,NULL); - Status = ObCreateObject(KernelMode, - IoDeviceObjectType, - &ObjectAttributes, - KernelMode, - NULL, - sizeof(DEVICE_OBJECT), - 0, - 0, - (PVOID*)&CreatedDeviceObject); - } + { + InitializeObjectAttributes(&ObjectAttributes, DeviceName, 0, NULL, NULL); + Status = ObCreateObject( + KernelMode, + IoDeviceObjectType, + &ObjectAttributes, + KernelMode, + NULL, + sizeof(DEVICE_OBJECT), + 0, + 0, + (PVOID*)&CreatedDeviceObject); + } else - { - Status = ObCreateObject(KernelMode, - IoDeviceObjectType, - NULL, - KernelMode, - NULL, - sizeof(DEVICE_OBJECT), - 0, - 0, - (PVOID*)&CreatedDeviceObject); - } + { + Status = ObCreateObject( + KernelMode, + IoDeviceObjectType, + NULL, + KernelMode, + NULL, + sizeof(DEVICE_OBJECT), + 0, + 0, + (PVOID*)&CreatedDeviceObject); + } *DeviceObject = NULL; if (!NT_SUCCESS(Status)) - { - DPRINT("IoCreateDevice() ObCreateObject failed, status: 0x%08X\n", Status); - return(Status); - } + { + DPRINT("IoCreateDevice() ObCreateObject failed, status: 0x%08X\n", Status); + return Status; + } if (DriverObject->DeviceObject == NULL) - { - DriverObject->DeviceObject = CreatedDeviceObject; - CreatedDeviceObject->NextDevice = NULL; - } + { + DriverObject->DeviceObject = CreatedDeviceObject; + CreatedDeviceObject->NextDevice = NULL; + } else - { - CreatedDeviceObject->NextDevice = DriverObject->DeviceObject; - DriverObject->DeviceObject = CreatedDeviceObject; - } + { + CreatedDeviceObject->NextDevice = DriverObject->DeviceObject; + DriverObject->DeviceObject = CreatedDeviceObject; + } - CreatedDeviceObject->Type = DeviceType; - CreatedDeviceObject->DriverObject = DriverObject; - CreatedDeviceObject->CurrentIrp = NULL; - CreatedDeviceObject->Flags = 0; + CreatedDeviceObject->Type = DeviceType; + CreatedDeviceObject->DriverObject = DriverObject; + CreatedDeviceObject->CurrentIrp = NULL; + CreatedDeviceObject->Flags = 0; - CreatedDeviceObject->DeviceExtension = - ExAllocatePoolWithTag(NonPagedPool, DeviceExtensionSize, - TAG_DEVICE_EXTENSION); - if (DeviceExtensionSize > 0 && CreatedDeviceObject->DeviceExtension == NULL) - { + CreatedDeviceObject->DeviceExtension = + ExAllocatePoolWithTag( + NonPagedPool, + DeviceExtensionSize, + TAG_DEVICE_EXTENSION); + + if (DeviceExtensionSize > 0 && CreatedDeviceObject->DeviceExtension == NULL) + { ExFreePool(CreatedDeviceObject); DPRINT("IoCreateDevice() ExAllocatePoolWithTag failed, returning: 0x%08X\n", STATUS_INSUFFICIENT_RESOURCES); - return(STATUS_INSUFFICIENT_RESOURCES); - } + return STATUS_INSUFFICIENT_RESOURCES; + } - if (DeviceExtensionSize > 0) - { - RtlZeroMemory(CreatedDeviceObject->DeviceExtension, - DeviceExtensionSize); - } + if (DeviceExtensionSize > 0) + { + RtlZeroMemory(CreatedDeviceObject->DeviceExtension, DeviceExtensionSize); + } - CreatedDeviceObject->Size = sizeof(DEVICE_OBJECT) + DeviceExtensionSize; - CreatedDeviceObject->ReferenceCount = 1; - CreatedDeviceObject->AttachedDevice = NULL; - CreatedDeviceObject->DeviceType = DeviceType; - CreatedDeviceObject->StackSize = 1; - CreatedDeviceObject->AlignmentRequirement = 1; - CreatedDeviceObject->Characteristics = DeviceCharacteristics; - CreatedDeviceObject->Timer = NULL; - CreatedDeviceObject->Vpb = NULL; - KeInitializeDeviceQueue(&CreatedDeviceObject->DeviceQueue); + CreatedDeviceObject->Size = sizeof(DEVICE_OBJECT) + DeviceExtensionSize; + CreatedDeviceObject->ReferenceCount = 1; + CreatedDeviceObject->AttachedDevice = NULL; + CreatedDeviceObject->DeviceType = DeviceType; + CreatedDeviceObject->StackSize = 1; + CreatedDeviceObject->AlignmentRequirement = 1; + CreatedDeviceObject->Characteristics = DeviceCharacteristics; + CreatedDeviceObject->Timer = NULL; + CreatedDeviceObject->Vpb = NULL; + KeInitializeDeviceQueue(&CreatedDeviceObject->DeviceQueue); - KeInitializeEvent(&CreatedDeviceObject->DeviceLock, - SynchronizationEvent, - TRUE); + KeInitializeEvent( + &CreatedDeviceObject->DeviceLock, + SynchronizationEvent, + TRUE); - /* FIXME: Do we need to add network drives too?! */ - if (CreatedDeviceObject->DeviceType == FILE_DEVICE_DISK || - CreatedDeviceObject->DeviceType == FILE_DEVICE_CD_ROM || - CreatedDeviceObject->DeviceType == FILE_DEVICE_TAPE) - { + /* FIXME: Do we need to add network drives too?! */ + if (CreatedDeviceObject->DeviceType == FILE_DEVICE_DISK || + CreatedDeviceObject->DeviceType == FILE_DEVICE_CD_ROM || + CreatedDeviceObject->DeviceType == FILE_DEVICE_TAPE) + { IoAttachVpb(CreatedDeviceObject); - } + } - DeviceObjectExtension = - ExAllocatePoolWithTag(NonPagedPool, sizeof(DEVOBJ_EXTENSION), - TAG_DEVICE_EXTENSION); + DeviceObjectExtension = + ExAllocatePoolWithTag( + NonPagedPool, + sizeof(DEVOBJ_EXTENSION), + TAG_DEVICE_EXTENSION); - DeviceObjectExtension->Type = 0 /* ?? */; - DeviceObjectExtension->Size = sizeof(DEVOBJ_EXTENSION); - DeviceObjectExtension->DeviceObject = CreatedDeviceObject; - DeviceObjectExtension->DeviceNode = NULL; + DeviceObjectExtension->Type = 0 /* ?? */; + DeviceObjectExtension->Size = sizeof(DEVOBJ_EXTENSION); + DeviceObjectExtension->DeviceObject = CreatedDeviceObject; + DeviceObjectExtension->DeviceNode = NULL; - CreatedDeviceObject->DeviceObjectExtension = DeviceObjectExtension; + CreatedDeviceObject->DeviceObjectExtension = DeviceObjectExtension; - *DeviceObject = CreatedDeviceObject; + *DeviceObject = CreatedDeviceObject; - return(STATUS_SUCCESS); + return STATUS_SUCCESS; } +/* + * IoOpenDeviceInstanceKey + * + * Status + * @unimplemented + */ -NTSTATUS -STDCALL -IoOpenDeviceInstanceKey ( - DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2, - DWORD Unknown3, - DWORD Unknown4 - ) +NTSTATUS STDCALL +IoOpenDeviceInstanceKey( + DWORD Unknown0, + DWORD Unknown1, + DWORD Unknown2, + DWORD Unknown3, + DWORD Unknown4) { - UNIMPLEMENTED; - return(STATUS_NOT_IMPLEMENTED); + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; } +/* + * IoQueryDeviceEnumInfo + * + * Status + * @unimplemented + */ -DWORD -STDCALL -IoQueryDeviceEnumInfo ( - DWORD Unknown0, - DWORD Unknown1 - ) +DWORD STDCALL +IoQueryDeviceEnumInfo( + DWORD Unknown0, + DWORD Unknown1) { - UNIMPLEMENTED; - return 0; + UNIMPLEMENTED; + return 0; } - /* EOF */ diff --git a/reactos/ntoskrnl/io/driver.c b/reactos/ntoskrnl/io/driver.c index b5f7973b1c3..3259c70eb41 100644 --- a/reactos/ntoskrnl/io/driver.c +++ b/reactos/ntoskrnl/io/driver.c @@ -1,4 +1,4 @@ -/* $Id: driver.c,v 1.38 2004/03/21 18:58:53 navaraf Exp $ +/* $Id: driver.c,v 1.39 2004/03/27 19:41:32 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -83,58 +83,611 @@ POBJECT_TYPE EXPORTED IoDriverObjectType = NULL; #define TAG_DRIVER TAG('D', 'R', 'V', 'R') #define TAG_DRIVER_EXTENSION TAG('D', 'R', 'V', 'E') +#define DRIVER_REGISTRY_KEY_BASENAME L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\" + /* PRIVATE FUNCTIONS **********************************************************/ NTSTATUS STDCALL -IopCreateDriver(PVOID ObjectBody, - PVOID Parent, - PWSTR RemainingPath, - POBJECT_ATTRIBUTES ObjectAttributes) +IopCreateDriver( + PVOID ObjectBody, + PVOID Parent, + PWSTR RemainingPath, + POBJECT_ATTRIBUTES ObjectAttributes) { - DPRINT("LdrCreateModule(ObjectBody %x, Parent %x, RemainingPath %S)\n", - ObjectBody, - Parent, - RemainingPath); - if (RemainingPath != NULL && wcschr(RemainingPath + 1, '\\') != NULL) - { - return(STATUS_UNSUCCESSFUL); - } + DPRINT("LdrCreateModule(ObjectBody %x, Parent %x, RemainingPath %S)\n", + ObjectBody, Parent, RemainingPath); - return(STATUS_SUCCESS); + if (RemainingPath != NULL && wcschr(RemainingPath + 1, '\\') != NULL) + return STATUS_UNSUCCESSFUL; + + return STATUS_SUCCESS; } VOID INIT_FUNCTION IopInitDriverImplementation(VOID) { - /* Register the process object type */ - IoDriverObjectType = ExAllocatePool(NonPagedPool, sizeof(OBJECT_TYPE)); - IoDriverObjectType->Tag = TAG('D', 'R', 'V', 'R'); - IoDriverObjectType->TotalObjects = 0; - IoDriverObjectType->TotalHandles = 0; - IoDriverObjectType->MaxObjects = ULONG_MAX; - IoDriverObjectType->MaxHandles = ULONG_MAX; - IoDriverObjectType->PagedPoolCharge = 0; - IoDriverObjectType->NonpagedPoolCharge = sizeof(DRIVER_OBJECT); - IoDriverObjectType->Dump = NULL; - IoDriverObjectType->Open = NULL; - IoDriverObjectType->Close = NULL; - IoDriverObjectType->Delete = NULL; - IoDriverObjectType->Parse = NULL; - IoDriverObjectType->Security = NULL; - IoDriverObjectType->QueryName = NULL; - IoDriverObjectType->OkayToClose = NULL; - IoDriverObjectType->Create = IopCreateDriver; - IoDriverObjectType->DuplicationNotify = NULL; - RtlRosInitUnicodeStringFromLiteral(&IoDriverObjectType->TypeName, L"Driver"); + /* Register the process object type */ + IoDriverObjectType = ExAllocatePool(NonPagedPool, sizeof(OBJECT_TYPE)); + IoDriverObjectType->Tag = TAG('D', 'R', 'V', 'R'); + IoDriverObjectType->TotalObjects = 0; + IoDriverObjectType->TotalHandles = 0; + IoDriverObjectType->MaxObjects = ULONG_MAX; + IoDriverObjectType->MaxHandles = ULONG_MAX; + IoDriverObjectType->PagedPoolCharge = 0; + IoDriverObjectType->NonpagedPoolCharge = sizeof(DRIVER_OBJECT); + IoDriverObjectType->Dump = NULL; + IoDriverObjectType->Open = NULL; + IoDriverObjectType->Close = NULL; + IoDriverObjectType->Delete = NULL; + IoDriverObjectType->Parse = NULL; + IoDriverObjectType->Security = NULL; + IoDriverObjectType->QueryName = NULL; + IoDriverObjectType->OkayToClose = NULL; + IoDriverObjectType->Create = IopCreateDriver; + IoDriverObjectType->DuplicationNotify = NULL; + RtlRosInitUnicodeStringFromLiteral(&IoDriverObjectType->TypeName, L"Driver"); - ObpCreateTypeObject(IoDriverObjectType); + ObpCreateTypeObject(IoDriverObjectType); - InitializeListHead(&DriverReinitListHead); - KeInitializeSpinLock(&DriverReinitListLock); - DriverReinitTailEntry = NULL; + InitializeListHead(&DriverReinitListHead); + KeInitializeSpinLock(&DriverReinitListLock); + DriverReinitTailEntry = NULL; } +NTSTATUS STDCALL +IopDefaultDispatchFunction( + PDEVICE_OBJECT DeviceObject, + PIRP Irp) +{ + Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_NOT_IMPLEMENTED; +} + +NTSTATUS FASTCALL +IopCreateDriverObject( + PDRIVER_OBJECT *DriverObject, + PUNICODE_STRING ServiceName, + BOOLEAN FileSystem, + PVOID DriverImageStart, + ULONG DriverImageSize) +{ + PDRIVER_OBJECT Object; + ULONG i; + WCHAR NameBuffer[MAX_PATH]; + UNICODE_STRING DriverName; + OBJECT_ATTRIBUTES ObjectAttributes; + NTSTATUS Status; + + DPRINT("IopCreateDriverObject(%p '%wZ' %x %p %x)\n", + DriverObject, ServiceName, FileSystem, DriverImageStart, DriverImageSize); + + *DriverObject = NULL; + + /* Create ModuleName string */ + if (ServiceName != NULL && ServiceName->Buffer != NULL) + { + if (FileSystem == TRUE) + wcscpy(NameBuffer, FILESYSTEM_ROOT_NAME); + else + wcscpy(NameBuffer, DRIVER_ROOT_NAME); + wcscat(NameBuffer, ServiceName->Buffer); + + RtlInitUnicodeString(&DriverName, NameBuffer); + DPRINT("Driver name: '%wZ'\n", &DriverName); + } + else + { + RtlInitUnicodeString(&DriverName, NULL); + } + + /* Initialize ObjectAttributes for driver object */ + InitializeObjectAttributes( + &ObjectAttributes, + &DriverName, + OBJ_PERMANENT, + NULL, + NULL); + + /* Create driver object */ + Status = ObCreateObject( + KernelMode, + IoDriverObjectType, + &ObjectAttributes, + KernelMode, + NULL, + sizeof(DRIVER_OBJECT), + 0, + 0, + (PVOID*)&Object); + + if (!NT_SUCCESS(Status)) + { + return Status; + } + + /* Create driver extension */ + Object->DriverExtension = (PDRIVER_EXTENSION) + ExAllocatePoolWithTag( + NonPagedPool, + sizeof(DRIVER_EXTENSION), + TAG_DRIVER_EXTENSION); + + if (Object->DriverExtension == NULL) + { + ExFreePool(Object); + return STATUS_NO_MEMORY; + } + + RtlZeroMemory(Object->DriverExtension, sizeof(DRIVER_EXTENSION)); + + Object->Type = InternalDriverType; + Object->DriverStart = DriverImageStart; + Object->DriverSize = DriverImageSize; + + for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) + Object->MajorFunction[i] = IopDefaultDispatchFunction; + + *DriverObject = Object; + + return STATUS_SUCCESS; +} + +/* + * IopDisplayLoadingMessage + * + * Display 'Loading XXX...' message. + */ + +VOID FASTCALL +IopDisplayLoadingMessage(PWCHAR ServiceName) +{ + CHAR TextBuffer[256]; + sprintf(TextBuffer, "Loading %S...\n", ServiceName); + HalDisplayString(TextBuffer); +} + +/* + * IopNormalizeImagePath + * + * Normalize an image path to contain complete path. + * + * Parameters + * ImagePath + * The input path and on exit the result path. ImagePath.Buffer + * must be allocated by ExAllocatePool on input. Caller is responsible + * for freeing the buffer when it's no longer needed. + * + * ServiceName + * Name of the service that ImagePath belongs to. + * + * Return Value + * Status + * + * Remarks + * The input image path isn't freed on error. + */ + +NTSTATUS FASTCALL +IopNormalizeImagePath( + IN OUT PUNICODE_STRING ImagePath, + IN PUNICODE_STRING ServiceName) +{ + UNICODE_STRING InputImagePath; + + RtlCopyMemory( + &InputImagePath, + ImagePath, + sizeof(UNICODE_STRING)); + + if (InputImagePath.Length == 0) + { + ImagePath->Length = (33 * sizeof(WCHAR)) + ServiceName->Length; + ImagePath->MaximumLength = ImagePath->Length + sizeof(UNICODE_NULL); + ImagePath->Buffer = ExAllocatePool(NonPagedPool, ImagePath->MaximumLength); + if (ImagePath->Buffer == NULL) + return STATUS_NO_MEMORY; + + wcscpy(ImagePath->Buffer, L"\\SystemRoot\\system32\\drivers\\"); + wcscat(ImagePath->Buffer, ServiceName->Buffer); + wcscat(ImagePath->Buffer, L".sys"); + } else + if (InputImagePath.Buffer[0] != L'\\') + { + ImagePath->Length = (12 * sizeof(WCHAR)) + InputImagePath.Length; + ImagePath->MaximumLength = ImagePath->Length + sizeof(UNICODE_NULL); + ImagePath->Buffer = ExAllocatePool(NonPagedPool, ImagePath->MaximumLength); + if (ImagePath->Buffer == NULL) + return STATUS_NO_MEMORY; + + wcscpy(ImagePath->Buffer, L"\\SystemRoot\\"); + wcscat(ImagePath->Buffer, InputImagePath.Buffer); + RtlFreeUnicodeString(&InputImagePath); + } + + return STATUS_SUCCESS; +} + +/* + * IopLoadServiceModule + * + * Load a module specified by registry settings for service. + * + * Parameters + * ServiceName + * Name of the service to load. + * + * Return Value + * Status + */ + +NTSTATUS FASTCALL +IopLoadServiceModule( + IN PUNICODE_STRING ServiceName, + OUT PMODULE_OBJECT *ModuleObject) +{ + RTL_QUERY_REGISTRY_TABLE QueryTable[3]; + ULONG ServiceStart; + UNICODE_STRING ServiceImagePath; + NTSTATUS Status; + + /* + * Get information about the service. + */ + + RtlZeroMemory(QueryTable, sizeof(QueryTable)); + + RtlInitUnicodeString(&ServiceImagePath, NULL); + + QueryTable[0].Name = L"Start"; + QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT; + QueryTable[0].EntryContext = &ServiceStart; + + QueryTable[1].Name = L"ImagePath"; + QueryTable[1].Flags = RTL_QUERY_REGISTRY_DIRECT; + QueryTable[1].EntryContext = &ServiceImagePath; + + Status = RtlQueryRegistryValues(RTL_REGISTRY_SERVICES, + ServiceName->Buffer, QueryTable, NULL, NULL); + + if (!NT_SUCCESS(Status)) + { + DPRINT("RtlQueryRegistryValues() failed (Status %x)\n", Status); + return Status; + } + + IopDisplayLoadingMessage(ServiceName->Buffer); + + /* + * Normalize the image path for all later processing. + */ + + Status = IopNormalizeImagePath(&ServiceImagePath, ServiceName); + + if (!NT_SUCCESS(Status)) + { + DPRINT("IopNormalizeImagePath() failed (Status %x)\n", Status); + return Status; + } + + /* + * Load the module. + */ + + *ModuleObject = LdrGetModuleObject(&ServiceImagePath); + + if (*ModuleObject == NULL) + { + /* + * Special case for boot modules that were loaded by boot loader. + */ + + if (ServiceStart == 0) + { + ULONG i; + CHAR SearchName[256]; + PCHAR ModuleName; + PLOADER_MODULE KeLoaderModules = + (PLOADER_MODULE)KeLoaderBlock.ModsAddr; + + Status = STATUS_UNSUCCESSFUL; + + /* + * FIXME: + * Improve this searching algorithm by using the image name + * stored in registry entry ImageName and use the whole path + * (requires change in FreeLoader). + */ + + _snprintf(SearchName, sizeof(SearchName), "%wZ.sys", ServiceName); + for (i = 1; i < KeLoaderBlock.ModsCount; i++) + { + ModuleName = (PCHAR)KeLoaderModules[i].String; + if (!strcmp(ModuleName, SearchName)) + { + /* Tell, that the module is already loaded */ + KeLoaderModules[i].Reserved = 1; + + Status = LdrProcessModule( + (PVOID)KeLoaderModules[i].ModStart, + &ServiceImagePath, + ModuleObject); + + break; + } + } + } + + /* + * Case for rest of the drivers (except disabled) + */ + + else if (ServiceStart < 4) + { + DPRINT("Loading module\n"); + Status = LdrLoadModule(&ServiceImagePath, ModuleObject); + } + } + else + { + DPRINT("Module already loaded\n"); + Status = STATUS_SUCCESS; + } + + RtlFreeUnicodeString(&ServiceImagePath); + + /* + * Now check if the module was loaded successfully. + */ + + if (!NT_SUCCESS(Status)) + { + DPRINT("Module loading failed (Status %x)\n", Status); + } + + DPRINT("Module loading (Status %x)\n", Status); + + return Status; +} + +/* + * IopInitializeDriverModule + * + * Initalize a loaded driver. + * + * Parameters + * DeviceNode + * Pointer to device node. + * + * ModuleObject + * Module object representing the driver. It can be retrieve by + * IopLoadServiceModule. + * + * FileSystemDriver + * Set to TRUE for file system drivers. + * + * DriverObject + * On successful return this contains the driver object representing + * the loaded driver. + */ + +NTSTATUS FASTCALL +IopInitializeDriverModule( + IN PDEVICE_NODE DeviceNode, + IN PMODULE_OBJECT ModuleObject, + IN BOOLEAN FileSystemDriver, + OUT PDRIVER_OBJECT *DriverObject) +{ + UNICODE_STRING RegistryKey; + PDRIVER_INITIALIZE DriverEntry = ModuleObject->EntryPoint; + NTSTATUS Status; + + Status = IopCreateDriverObject( + DriverObject, + &DeviceNode->ServiceName, + FileSystemDriver, + ModuleObject->Base, + ModuleObject->Length); + + if (!NT_SUCCESS(Status)) + { + DPRINT("IopCreateDriverObject failed (Status %x)\n", Status); + return Status; + } + + if (DeviceNode->ServiceName.Buffer) + { + RegistryKey.Length = DeviceNode->ServiceName.Length + + sizeof(DRIVER_REGISTRY_KEY_BASENAME); + RegistryKey.MaximumLength = RegistryKey.Length + sizeof(UNICODE_NULL); + RegistryKey.Buffer = ExAllocatePool(PagedPool, RegistryKey.MaximumLength); + wcscpy(RegistryKey.Buffer, DRIVER_REGISTRY_KEY_BASENAME); + wcscat(RegistryKey.Buffer, DeviceNode->ServiceName.Buffer); + } + else + { + RtlInitUnicodeString(&RegistryKey, NULL); + } + + DPRINT("RegistryKey: %wZ\n", &RegistryKey); + DPRINT("Calling driver entrypoint at %08lx\n", DriverEntry); + + IopMarkLastReinitializeDriver(); + + Status = DriverEntry(*DriverObject, &RegistryKey); + if (!NT_SUCCESS(Status)) + { + ExFreePool((*DriverObject)->DriverExtension); + ObMakeTemporaryObject(DriverObject); + ObDereferenceObject(DriverObject); + return Status; + } + + IopReinitializeDrivers(); + + return STATUS_SUCCESS; +} + +/* + * IopAttachFilterDriversCallback + * + * Internal routine used by IopAttachFilterDrivers. + */ + +NTSTATUS STDCALL +IopAttachFilterDriversCallback( + PWSTR ValueName, + ULONG ValueType, + PVOID ValueData, + ULONG ValueLength, + PVOID Context, + PVOID EntryContext) +{ + PDEVICE_NODE DeviceNode = Context; + UNICODE_STRING ServiceName; + PWCHAR Filters; + PMODULE_OBJECT ModuleObject; + PDRIVER_OBJECT DriverObject; + NTSTATUS Status; + + + for (Filters = ValueData; + ((ULONG_PTR)Filters - (ULONG_PTR)ValueData) < ValueLength && + *Filters != 0; + Filters += (ServiceName.Length / sizeof(WCHAR)) + 1) + { + DPRINT("Filter Driver: %S (%wZ)\n", Filters, &DeviceNode->InstancePath); + ServiceName.Buffer = Filters; + ServiceName.MaximumLength = + ServiceName.Length = wcslen(Filters) * sizeof(WCHAR); + + /* Load and initialize the filter driver */ + Status = IopLoadServiceModule(&ServiceName, &ModuleObject); + if (!NT_SUCCESS(Status)) + continue; + + Status = IopInitializeDriverModule(DeviceNode, ModuleObject, FALSE, &DriverObject); + if (!NT_SUCCESS(Status)) + continue; + + Status = IopInitializeDevice(DeviceNode, DriverObject); + if (!NT_SUCCESS(Status)) + continue; + } + + return STATUS_SUCCESS; +} + +/* + * IopAttachFilterDrivers + * + * Load filter drivers for specified device node. + * + * Parameters + * Lower + * Set to TRUE for loading lower level filters or FALSE for upper + * level filters. + */ + +NTSTATUS FASTCALL +IopAttachFilterDrivers( + PDEVICE_NODE DeviceNode, + BOOLEAN Lower) +{ + RTL_QUERY_REGISTRY_TABLE QueryTable[2]; + PWCHAR KeyBuffer; + UNICODE_STRING Class; + WCHAR ClassBuffer[40]; + NTSTATUS Status; + + /* + * First load the device filters + */ + + QueryTable[0].QueryRoutine = IopAttachFilterDriversCallback; + if (Lower) + QueryTable[0].Name = L"LowerFilters"; + else + QueryTable[0].Name = L"UpperFilters"; + QueryTable[0].EntryContext = NULL; + QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED; + QueryTable[1].QueryRoutine = NULL; + QueryTable[1].Name = NULL; + + KeyBuffer = ExAllocatePool( + PagedPool, + (49 * sizeof(WCHAR)) + DeviceNode->InstancePath.Length); + wcscpy(KeyBuffer, L"\\Registry\\Machine\\System\\CurrentControlSet\\Enum\\"); + wcscat(KeyBuffer, DeviceNode->InstancePath.Buffer); + + RtlQueryRegistryValues( + RTL_REGISTRY_ABSOLUTE, + KeyBuffer, + QueryTable, + DeviceNode, + NULL); + + /* + * Now get the class GUID + */ + + Class.Length = 0; + Class.MaximumLength = 40 * sizeof(WCHAR); + Class.Buffer = ClassBuffer; + QueryTable[0].QueryRoutine = NULL; + QueryTable[0].Name = L"ClassGUID"; + QueryTable[0].EntryContext = &Class; + QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED | RTL_QUERY_REGISTRY_DIRECT; + + Status = RtlQueryRegistryValues( + RTL_REGISTRY_ABSOLUTE, + KeyBuffer, + QueryTable, + DeviceNode, + NULL); + + ExFreePool(KeyBuffer); + + /* + * Load the class filter driver + */ + + if (NT_SUCCESS(Status)) + { + QueryTable[0].QueryRoutine = IopAttachFilterDriversCallback; + if (Lower) + QueryTable[0].Name = L"LowerFilters"; + else + QueryTable[0].Name = L"UpperFilters"; + QueryTable[0].EntryContext = NULL; + QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED; + + KeyBuffer = ExAllocatePool(PagedPool, (58 * sizeof(WCHAR)) + Class.Length); + wcscpy(KeyBuffer, L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Class\\"); + wcscat(KeyBuffer, ClassBuffer); + + RtlQueryRegistryValues( + RTL_REGISTRY_ABSOLUTE, + KeyBuffer, + QueryTable, + DeviceNode, + NULL); + + ExFreePool(KeyBuffer); + } + + return STATUS_SUCCESS; +} + + + + + + + + static NTSTATUS STDCALL IopCreateGroupListEntry(PWSTR ValueName, ULONG ValueType, @@ -419,27 +972,13 @@ MiFreeBootDriverMemory(PVOID StartAddress, ULONG Length) } } -/* - * IopDisplayLoadingMessage - * - * Display 'Loading XXX...' message. - */ - -VOID -IopDisplayLoadingMessage(PWCHAR ServiceName) -{ - CHAR TextBuffer[256]; - sprintf(TextBuffer, "Loading %S...\n", ServiceName); - HalDisplayString(TextBuffer); -} - /* * IopInitializeBuiltinDriver * * Initialize a driver that is already loaded in memory. */ -NTSTATUS INIT_FUNCTION +NTSTATUS FASTCALL IopInitializeBuiltinDriver( PDEVICE_NODE ModuleDeviceNode, PVOID ModuleLoadBase, @@ -448,6 +987,7 @@ IopInitializeBuiltinDriver( { PMODULE_OBJECT ModuleObject; PDEVICE_NODE DeviceNode; + PDRIVER_OBJECT DriverObject; NTSTATUS Status; CHAR TextBuffer[256]; PCHAR FileNameWithoutPath; @@ -516,15 +1056,19 @@ IopInitializeBuiltinDriver( /* * Initialize the driver */ - Status = IopInitializeDriver(ModuleObject->EntryPoint, DeviceNode, - FALSE, ModuleObject->Base, ModuleObject->Length, TRUE); + Status = IopInitializeDriverModule(DeviceNode, ModuleObject, FALSE, + &DriverObject); + if (!NT_SUCCESS(Status)) { if (ModuleDeviceNode == NULL) IopFreeDeviceNode(DeviceNode); CPRINT("Driver load failed, status (%x)\n", Status); + return Status; } + Status = IopInitializeDevice(DeviceNode, DriverObject); + return Status; } @@ -540,7 +1084,7 @@ IopInitializeBuiltinDriver( * None */ -VOID INIT_FUNCTION +VOID FASTCALL IopInitializeBootDrivers(VOID) { ULONG BootDriverCount; @@ -621,7 +1165,7 @@ IopInitializeBootDrivers(VOID) * None */ -VOID INIT_FUNCTION +VOID FASTCALL IopInitializeSystemDrivers(VOID) { PLIST_ENTRY GroupEntry; @@ -688,212 +1232,6 @@ IopInitializeSystemDrivers(VOID) DPRINT("IopInitializeSystemDrivers() done\n"); } -/* - * IopGetDriverNameFromServiceKey - * - * Returns a module path from service registry key. - * - * Parameters - * RelativeTo - * Relative path identifier. - * PathName - * Relative key path name. - * ImagePath - * The result path. - * - * Return Value - * Status - */ - -NTSTATUS STDCALL -IopGetDriverNameFromServiceKey( - ULONG RelativeTo, - PWSTR PathName, - PUNICODE_STRING ImagePath) -{ - RTL_QUERY_REGISTRY_TABLE QueryTable[2]; - UNICODE_STRING RegistryImagePath; - NTSTATUS Status; - PWSTR ServiceName; - - RtlZeroMemory(&QueryTable, sizeof(QueryTable)); - RtlInitUnicodeString(&RegistryImagePath, NULL); - - QueryTable[0].Name = L"ImagePath"; - QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT; - QueryTable[0].EntryContext = &RegistryImagePath; - - Status = RtlQueryRegistryValues(RelativeTo, - PathName, QueryTable, NULL, NULL); - if (!NT_SUCCESS(Status)) - { - DPRINT("RtlQueryRegistryValues() failed (Status %lx)\n", Status); - RtlFreeUnicodeString(&RegistryImagePath); - return STATUS_UNSUCCESSFUL; - } - - if (RegistryImagePath.Length == 0) - { - ServiceName = wcsrchr(PathName, L'\\'); - if (ServiceName == NULL) - { - ServiceName = PathName; - } - else - { - ServiceName++; - } - - ImagePath->Length = (33 + wcslen(ServiceName)) * sizeof(WCHAR); - ImagePath->MaximumLength = ImagePath->Length + sizeof(UNICODE_NULL); - ImagePath->Buffer = ExAllocatePool(NonPagedPool, ImagePath->MaximumLength); - if (ImagePath->Buffer == NULL) - { - return STATUS_UNSUCCESSFUL; - } - wcscpy(ImagePath->Buffer, L"\\SystemRoot\\system32\\drivers\\"); - wcscat(ImagePath->Buffer, ServiceName); - wcscat(ImagePath->Buffer, L".sys"); - } else - if (RegistryImagePath.Buffer[0] != L'\\') - { - ImagePath->Length = (12 + wcslen(RegistryImagePath.Buffer)) * sizeof(WCHAR); - ImagePath->MaximumLength = ImagePath->Length + sizeof(UNICODE_NULL); - ImagePath->Buffer = ExAllocatePool(NonPagedPool, ImagePath->MaximumLength); - if (ImagePath->Buffer == NULL) - { - RtlFreeUnicodeString(&RegistryImagePath); - return STATUS_UNSUCCESSFUL; - } - wcscpy(ImagePath->Buffer, L"\\SystemRoot\\"); - wcscat(ImagePath->Buffer, RegistryImagePath.Buffer); - RtlFreeUnicodeString(&RegistryImagePath); - } else - { - ImagePath->Length = RegistryImagePath.Length; - ImagePath->MaximumLength = RegistryImagePath.MaximumLength; - ImagePath->Buffer = RegistryImagePath.Buffer; - } - - return STATUS_SUCCESS; -} - -/* - * IopInitializeDeviceNodeService - * - * Initialize service for given device node. - * - * Parameters - * DeviceNode - * The device node to initialize service for. - * BootDriverOnly - * Initialize driver only if it's marked as boot start. - * - * Return Value - * Status - */ - -NTSTATUS -IopInitializeDeviceNodeService( - PDEVICE_NODE DeviceNode, - PUNICODE_STRING ServiceName, - BOOLEAN BootDriverOnly) -{ - NTSTATUS Status; - ULONG ServiceStart; - RTL_QUERY_REGISTRY_TABLE QueryTable[2]; - - if (ServiceName == NULL || ServiceName->Buffer == NULL) - { - return STATUS_UNSUCCESSFUL; - } - - /* - * Get service start value - */ - - RtlZeroMemory(QueryTable, sizeof(QueryTable)); - QueryTable[0].Name = L"Start"; - QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT; - QueryTable[0].EntryContext = &ServiceStart; - Status = RtlQueryRegistryValues(RTL_REGISTRY_SERVICES, - ServiceName->Buffer, QueryTable, NULL, NULL); - if (!NT_SUCCESS(Status)) - { - DPRINT("RtlQueryRegistryValues() failed (Status %x)\n", Status); - return Status; - } - - if (BootDriverOnly) - { - PLOADER_MODULE KeLoaderModules = (PLOADER_MODULE)KeLoaderBlock.ModsAddr; - - /* - * Find and initialize boot driver - */ - if (ServiceStart == 0 /*SERVICE_BOOT_START*/) - { - ULONG i; - CHAR SearchName[256]; - ULONG ModuleStart, ModuleSize; - PCHAR ModuleName; - - _snprintf(SearchName, sizeof(SearchName), "%wZ.sys", ServiceName); - for (i = 1; i < KeLoaderBlock.ModsCount; i++) - { - ModuleStart = KeLoaderModules[i].ModStart; - ModuleSize = KeLoaderModules[i].ModEnd - ModuleStart; - ModuleName = (PCHAR)KeLoaderModules[i].String; - if (!strcmp(ModuleName, SearchName)) - { - IopInitializeBuiltinDriver(DeviceNode, - (PVOID)ModuleStart, ModuleName, ModuleSize); - /* Tell, that the module is already loaded */ - KeLoaderModules[i].Reserved = 1; - } - } - return STATUS_SUCCESS; - } else - { - return STATUS_UNSUCCESSFUL; - } - } else - if (ServiceStart < 4) - { - UNICODE_STRING ImagePath; - - /* - * Get service path - */ - Status = IopGetDriverNameFromServiceKey(RTL_REGISTRY_SERVICES, - ServiceName->Buffer, &ImagePath); - if (!NT_SUCCESS(Status)) - { - DPRINT("IopGetDriverNameFromKeyNode() failed (Status %x)\n", Status); - return Status; - } - - /* - * Display loading message - */ - IopDisplayLoadingMessage(ServiceName->Buffer); - - /* - * Load the service - */ - Status = IopInitializeService(DeviceNode, ServiceName, &ImagePath); - - /* - * Free the service path - */ - RtlFreeUnicodeString(&ImagePath); - } - else - Status = STATUS_UNSUCCESSFUL; - - return Status; -} - /* * IopUnloadDriver * @@ -902,6 +1240,7 @@ IopInitializeDeviceNodeService( * Parameters * DriverServiceName * Name of the service to unload (registry key). + * * UnloadPnpDrivers * Whether to unload Plug & Plug or only legacy drivers. If this * parameter is set to FALSE, the routine will unload only legacy @@ -917,7 +1256,9 @@ IopInitializeDeviceNodeService( NTSTATUS STDCALL IopUnloadDriver(PUNICODE_STRING DriverServiceName, BOOLEAN UnloadPnpDrivers) { + RTL_QUERY_REGISTRY_TABLE QueryTable[2]; UNICODE_STRING ImagePath; + UNICODE_STRING ServiceName; UNICODE_STRING ObjectName; PDRIVER_OBJECT DriverObject; PMODULE_OBJECT ModuleObject; @@ -927,17 +1268,21 @@ IopUnloadDriver(PUNICODE_STRING DriverServiceName, BOOLEAN UnloadPnpDrivers) DPRINT("IopUnloadDriver('%wZ', %d)\n", DriverServiceName, UnloadPnpDrivers); /* - * Get the service name from the module name + * Get the service name from the registry key name */ + Start = wcsrchr(DriverServiceName->Buffer, L'\\'); if (Start == NULL) Start = DriverServiceName->Buffer; else Start++; + RtlInitUnicodeString(&ServiceName, Start); + /* * Construct the driver object name */ + ObjectName.Length = (wcslen(Start) + 8) * sizeof(WCHAR); ObjectName.MaximumLength = ObjectName.Length + sizeof(WCHAR); ObjectName.Buffer = ExAllocatePool(NonPagedPool, ObjectName.MaximumLength); @@ -948,8 +1293,10 @@ IopUnloadDriver(PUNICODE_STRING DriverServiceName, BOOLEAN UnloadPnpDrivers) /* * Find the driver object */ + Status = ObReferenceObjectByName(&ObjectName, 0, 0, 0, IoDriverObjectType, KernelMode, 0, (PVOID*)&DriverObject); + if (!NT_SUCCESS(Status)) { DPRINT("Can't locate driver object for %wZ\n", ObjectName); @@ -959,22 +1306,46 @@ IopUnloadDriver(PUNICODE_STRING DriverServiceName, BOOLEAN UnloadPnpDrivers) /* * Free the buffer for driver object name */ + ExFreePool(ObjectName.Buffer); /* * Get path of service... */ - Status = IopGetDriverNameFromServiceKey(RTL_REGISTRY_ABSOLUTE, - DriverServiceName->Buffer, &ImagePath); + + RtlZeroMemory(QueryTable, sizeof(QueryTable)); + + RtlInitUnicodeString(&ImagePath, NULL); + + QueryTable[0].Name = L"ImagePath"; + QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT; + QueryTable[0].EntryContext = &ImagePath; + + Status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE, + DriverServiceName->Buffer, QueryTable, NULL, NULL); + if (!NT_SUCCESS(Status)) { - DPRINT("IopGetDriverNameFromKeyNode() failed (Status %x)\n", Status); + DPRINT("RtlQueryRegistryValues() failed (Status %x)\n", Status); + return Status; + } + + /* + * Normalize the image path for all later processing. + */ + + Status = IopNormalizeImagePath(&ImagePath, &ServiceName); + + if (!NT_SUCCESS(Status)) + { + DPRINT("IopNormalizeImagePath() failed (Status %x)\n", Status); return Status; } /* * ... and check if it's loaded */ + ModuleObject = LdrGetModuleObject(&ImagePath); if (ModuleObject == NULL) { @@ -984,11 +1355,13 @@ IopUnloadDriver(PUNICODE_STRING DriverServiceName, BOOLEAN UnloadPnpDrivers) /* * Free the service path */ + RtlFreeUnicodeString(&ImagePath); /* * Unload the module and release the references to the device object */ + if (DriverObject->DriverUnload) (*DriverObject->DriverUnload)(DriverObject); ObDereferenceObject(DriverObject); @@ -1016,12 +1389,14 @@ IopUnloadDriver(PUNICODE_STRING DriverServiceName, BOOLEAN UnloadPnpDrivers) NTSTATUS STDCALL NtLoadDriver(IN PUNICODE_STRING DriverServiceName) { - RTL_QUERY_REGISTRY_TABLE QueryTable[2]; + RTL_QUERY_REGISTRY_TABLE QueryTable[3]; UNICODE_STRING ImagePath; + UNICODE_STRING ServiceName; NTSTATUS Status; ULONG Type; PDEVICE_NODE DeviceNode; PMODULE_OBJECT ModuleObject; + PDRIVER_OBJECT DriverObject; LPWSTR Start; DPRINT("NtLoadDriver('%wZ')\n", DriverServiceName); @@ -1029,6 +1404,7 @@ NtLoadDriver(IN PUNICODE_STRING DriverServiceName) /* * Check security privileges */ + #if 0 if (!SeSinglePrivilegeCheck(SeLoadDriverPrivilege, KeGetPreviousMode())) return STATUS_PRIVILEGE_NOT_HELD; @@ -1037,14 +1413,36 @@ NtLoadDriver(IN PUNICODE_STRING DriverServiceName) RtlInitUnicodeString(&ImagePath, NULL); /* - * Get service type + * Get the service name from the registry key name. */ + + Start = wcsrchr(DriverServiceName->Buffer, L'\\'); + if (Start == NULL) + Start = DriverServiceName->Buffer; + else + Start++; + + RtlInitUnicodeString(&ServiceName, Start); + + /* + * Get service type. + */ + RtlZeroMemory(&QueryTable, sizeof(QueryTable)); + + RtlInitUnicodeString(&ImagePath, NULL); + QueryTable[0].Name = L"Type"; QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; QueryTable[0].EntryContext = &Type; + + QueryTable[1].Name = L"ImagePath"; + QueryTable[1].Flags = RTL_QUERY_REGISTRY_DIRECT; + QueryTable[1].EntryContext = &ImagePath; + Status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE, DriverServiceName->Buffer, QueryTable, NULL, NULL); + if (!NT_SUCCESS(Status)) { DPRINT("RtlQueryRegistryValues() failed (Status %lx)\n", Status); @@ -1053,13 +1451,14 @@ NtLoadDriver(IN PUNICODE_STRING DriverServiceName) } /* - * Get module path + * Normalize the image path for all later processing. */ - Status = IopGetDriverNameFromServiceKey(RTL_REGISTRY_ABSOLUTE, - DriverServiceName->Buffer, &ImagePath); + + Status = IopNormalizeImagePath(&ImagePath, &ServiceName); + if (!NT_SUCCESS(Status)) { - DPRINT("IopGetDriverNameFromKeyNode() failed (Status %x)\n", Status); + DPRINT("IopNormalizeImagePath() failed (Status %x)\n", Status); return Status; } @@ -1078,8 +1477,10 @@ NtLoadDriver(IN PUNICODE_STRING DriverServiceName) /* * Create device node */ + /* Use IopRootDeviceNode for now */ Status = IopCreateDeviceNode(IopRootDeviceNode, NULL, &DeviceNode); + if (!NT_SUCCESS(Status)) { DPRINT("IopCreateDeviceNode() failed (Status %lx)\n", Status); @@ -1089,7 +1490,9 @@ NtLoadDriver(IN PUNICODE_STRING DriverServiceName) /* * Load the driver module */ + Status = LdrLoadModule(&ImagePath, &ModuleObject); + if (!NT_SUCCESS(Status)) { DPRINT("LdrLoadModule() failed (Status %lx)\n", Status); @@ -1100,6 +1503,7 @@ NtLoadDriver(IN PUNICODE_STRING DriverServiceName) /* * Set a service name for the device node */ + Start = wcsrchr(DriverServiceName->Buffer, L'\\'); if (Start == NULL) Start = DriverServiceName->Buffer; @@ -1110,21 +1514,24 @@ NtLoadDriver(IN PUNICODE_STRING DriverServiceName) /* * Initialize the driver module */ - Status = IopInitializeDriver( - ModuleObject->EntryPoint, + + Status = IopInitializeDriverModule( DeviceNode, + ModuleObject, (Type == 2 /*SERVICE_FILE_SYSTEM_DRIVER*/ || Type == 8 /*SERVICE_RECOGNIZER_DRIVER*/), - ModuleObject->Base, - ModuleObject->Length, - FALSE); + &DriverObject); + if (!NT_SUCCESS(Status)) { DPRINT1("IopInitializeDriver() failed (Status %lx)\n", Status); LdrUnloadModule(ModuleObject); IopFreeDeviceNode(DeviceNode); + return Status; } + IopInitializeDevice(DeviceNode, DriverObject); + return Status; } @@ -1173,7 +1580,7 @@ IoRegisterDriverReinitialization(PDRIVER_OBJECT DriverObject, } -VOID +VOID FASTCALL IopMarkLastReinitializeDriver(VOID) { KIRQL Irql; @@ -1195,7 +1602,7 @@ IopMarkLastReinitializeDriver(VOID) } -VOID +VOID FASTCALL IopReinitializeDrivers(VOID) { PDRIVER_REINIT_ITEM ReinitItem; diff --git a/reactos/ntoskrnl/io/iomgr.c b/reactos/ntoskrnl/io/iomgr.c index 02ab0269f52..061ba346157 100644 --- a/reactos/ntoskrnl/io/iomgr.c +++ b/reactos/ntoskrnl/io/iomgr.c @@ -1,4 +1,4 @@ -/* $Id: iomgr.c,v 1.45 2003/12/31 14:20:26 hbirr Exp $ +/* $Id: iomgr.c,v 1.46 2004/03/27 19:41:32 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -16,6 +16,7 @@ #include #include #include +#include #include #define NDEBUG @@ -367,6 +368,8 @@ VOID INIT_FUNCTION IoInit2(VOID) { PDEVICE_NODE DeviceNode; + PDRIVER_OBJECT DriverObject; + MODULE_OBJECT ModuleObject; NTSTATUS Status; KeInitializeSpinLock (&IoStatisticsLock); @@ -383,12 +386,15 @@ IoInit2(VOID) return; } - Status = IopInitializeDriver(RawFsDriverEntry, + ModuleObject.Base = NULL; + ModuleObject.Length = 0; + ModuleObject.EntryPoint = RawFsDriverEntry; + + Status = IopInitializeDriverModule( DeviceNode, + &ModuleObject, TRUE, - NULL, - 0, - FALSE); + &DriverObject); if (!NT_SUCCESS(Status)) { IopFreeDeviceNode(DeviceNode); @@ -396,13 +402,20 @@ IoInit2(VOID) return; } + Status = IopInitializeDevice(DeviceNode, DriverObject); + if (!NT_SUCCESS(Status)) + { + IopFreeDeviceNode(DeviceNode); + CPRINT("IopInitializeDevice() failed with status (%x)\n", Status); + return; + } + /* * Initialize PnP root releations */ IopInvalidateDeviceRelations( IopRootDeviceNode, - BusRelations, - TRUE); + BusRelations); } /* diff --git a/reactos/ntoskrnl/io/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr.c index 5f5da1a80a2..8b694857c45 100644 --- a/reactos/ntoskrnl/io/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr.c @@ -1,4 +1,4 @@ -/* $Id: pnpmgr.c,v 1.27 2004/03/21 18:58:53 navaraf Exp $ +/* $Id: pnpmgr.c,v 1.28 2004/03/27 19:41:32 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1068,15 +1068,28 @@ IopActionInitChildServices( !IopDeviceNodeHasFlag(DeviceNode, DNF_ADDED) && !IopDeviceNodeHasFlag(DeviceNode, DNF_STARTED)) { - Status = IopInitializeDeviceNodeService( - DeviceNode, - &DeviceNode->ServiceName, - BootDrivers); + PMODULE_OBJECT ModuleObject; + PDRIVER_OBJECT DriverObject; + + Status = IopLoadServiceModule(&DeviceNode->ServiceName, &ModuleObject); if (NT_SUCCESS(Status)) { - IopAttachFilterDrivers(DeviceNode, FALSE); - IopDeviceNodeSetFlag(DeviceNode, DNF_STARTED); - } else + Status = IopInitializeDriverModule(DeviceNode, ModuleObject, FALSE, &DriverObject); + if (NT_SUCCESS(Status)) + { + /* Attach lower level filter drivers. */ + IopAttachFilterDrivers(DeviceNode, TRUE); + /* Initialize the function driver for the device node */ + Status = IopInitializeDevice(DeviceNode, DriverObject); + if (NT_SUCCESS(Status)) + { + IopDeviceNodeSetFlag(DeviceNode, DNF_STARTED); + /* Attach upper level filter drivers. */ + IopAttachFilterDrivers(DeviceNode, FALSE); + } + } + } + else { /* * Don't disable when trying to load only boot drivers @@ -1138,6 +1151,7 @@ IopActionInitBootServices( * Parameters * DeviceNode * Top device node to start initializing services. + * * BootDrivers * When set to TRUE, only drivers marked as boot start will * be loaded. Otherwise, all drivers will be loaded. @@ -1177,15 +1191,18 @@ IopInitializePnpServices( NTSTATUS IopInvalidateDeviceRelations( - IN PDEVICE_NODE DeviceNode, - IN DEVICE_RELATION_TYPE Type, - IN BOOLEAN BootDriver) + IN PDEVICE_NODE DeviceNode, + IN DEVICE_RELATION_TYPE Type) { DEVICETREE_TRAVERSE_CONTEXT Context; PDEVICE_RELATIONS DeviceRelations; IO_STATUS_BLOCK IoStatusBlock; PDEVICE_NODE ChildDeviceNode; IO_STACK_LOCATION Stack; + BOOL BootDrivers; + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING LinkName; + HANDLE Handle; NTSTATUS Status; ULONG i; @@ -1276,12 +1293,39 @@ IopInvalidateDeviceRelations( return Status; } + /* + * Get the state of the system boot. If the \\SystemRoot link isn't + * created yet, we will assume that it's possible to load only boot + * drivers. + */ + + RtlInitUnicodeString(&LinkName, L"\\SystemRoot"); + + InitializeObjectAttributes( + &ObjectAttributes, + &LinkName, + 0, + NULL, + NULL); + + Status = NtOpenFile( + &Handle, + FILE_ALL_ACCESS, + &ObjectAttributes, + &IoStatusBlock, + 0, + 0); + + BootDrivers = NT_SUCCESS(Status) ? FALSE : TRUE; + + NtClose(Handle); + /* * Initialize services for discovered children. Only boot drivers will * be loaded from boot driver! */ - Status = IopInitializePnpServices(DeviceNode, BootDriver); + Status = IopInitializePnpServices(DeviceNode, BootDrivers); if (!NT_SUCCESS(Status)) { DPRINT("IopInitializePnpServices() failed with status (%x)\n", Status); @@ -1326,8 +1370,8 @@ PnpInit(VOID) CPRINT("Insufficient resources\n"); KEBUGCHECK(PHASE1_INITIALIZATION_FAILED); } + IopRootDeviceNode->Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE; - IopRootDeviceNode->DriverObject = IopRootDriverObject; PnpRootDriverEntry(IopRootDriverObject, NULL); IopRootDriverObject->DriverExtension->AddDevice( IopRootDriverObject, diff --git a/reactos/ntoskrnl/ldr/loader.c b/reactos/ntoskrnl/ldr/loader.c index b6b38ca5eb5..32455165706 100644 --- a/reactos/ntoskrnl/ldr/loader.c +++ b/reactos/ntoskrnl/ldr/loader.c @@ -1,4 +1,4 @@ -/* $Id: loader.c,v 1.140 2004/03/07 11:59:10 navaraf Exp $ +/* $Id: loader.c,v 1.141 2004/03/27 19:41:32 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -449,107 +449,6 @@ LdrUnloadModule(PMODULE_OBJECT ModuleObject) } -NTSTATUS INIT_FUNCTION -LdrInitializeBootStartDriver(PVOID ModuleLoadBase, - PCHAR FileName, - ULONG ModuleLength) -{ - PMODULE_OBJECT ModuleObject; - UNICODE_STRING ModuleName; - PDEVICE_NODE DeviceNode; - NTSTATUS Status; - - WCHAR Buffer[MAX_PATH]; - ULONG Length; - LPWSTR Start; - LPWSTR Ext; - PCHAR FileExt; - CHAR TextBuffer [256]; - ULONG x, y, cx, cy; - - HalQueryDisplayParameters(&x, &y, &cx, &cy); - RtlFillMemory(TextBuffer, x, ' '); - TextBuffer[x] = '\0'; - HalSetDisplayParameters(0, y-1); - HalDisplayString(TextBuffer); - - sprintf(TextBuffer, "Initializing %s...\n", FileName); - HalSetDisplayParameters(0, y-1); - HalDisplayString(TextBuffer); - HalSetDisplayParameters(cx, cy); - - /* Split the filename into base name and extension */ - FileExt = strrchr(FileName, '.'); - if (FileExt != NULL) - Length = FileExt - FileName; - else - Length = strlen(FileName); - - if ((FileExt != NULL) && (strcmp(FileExt, ".sym") == 0)) - { - KDB_SYMBOLFILE_HOOK(ModuleLoadBase, FileName, Length); - return(STATUS_SUCCESS); - } - else if ((FileExt != NULL) && !(strcmp(FileExt, ".sys") == 0)) - { - CPRINT("Ignoring non-driver file %s\n", FileName); - return STATUS_SUCCESS; - } - - /* Use IopRootDeviceNode for now */ - Status = IopCreateDeviceNode(IopRootDeviceNode, NULL, &DeviceNode); - if (!NT_SUCCESS(Status)) - { - CPRINT("Driver load failed, status (%x)\n", Status); - return(Status); - } - - RtlCreateUnicodeStringFromAsciiz(&ModuleName, - FileName); - Status = LdrProcessModule(ModuleLoadBase, - &ModuleName, - &ModuleObject); - RtlFreeUnicodeString(&ModuleName); - if (ModuleObject == NULL) - { - IopFreeDeviceNode(DeviceNode); - CPRINT("Driver load failed, status (%x)\n", Status); - return(STATUS_UNSUCCESSFUL); - } - - - /* Get the service name from the module name */ - Start = wcsrchr(ModuleObject->BaseName.Buffer, L'\\'); - if (Start == NULL) - Start = ModuleObject->BaseName.Buffer; - else - Start++; - - Ext = wcsrchr(ModuleObject->BaseName.Buffer, L'.'); - if (Ext != NULL) - Length = Ext - Start; - else - Length = wcslen(Start); - - wcsncpy(Buffer, Start, Length); - Buffer[Length] = 0; - RtlCreateUnicodeString(&DeviceNode->ServiceName, Buffer); - - Status = IopInitializeDriver(ModuleObject->EntryPoint, - DeviceNode, FALSE, - ModuleObject->Base, - ModuleObject->Length, - TRUE); - if (!NT_SUCCESS(Status)) - { - IopFreeDeviceNode(DeviceNode); - CPRINT("Driver load failed, status (%x)\n", Status); - } - - return(Status); -} - - NTSTATUS LdrProcessModule(PVOID ModuleLoadBase, PUNICODE_STRING ModuleName, From ac44e25672eb1139555738b46b2afc906eca670e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sat, 27 Mar 2004 21:07:33 +0000 Subject: [PATCH 0660/1463] Fix LOGFONT conversion in CreateFontIndirectA() svn path=/trunk/; revision=8892 --- reactos/include/rosrtl/logfont.h | 4 ++-- reactos/lib/gdi32/objects/text.c | 17 ++++------------- reactos/lib/rosrtl/misc/logfont.c | 4 ++-- 3 files changed, 8 insertions(+), 17 deletions(-) diff --git a/reactos/include/rosrtl/logfont.h b/reactos/include/rosrtl/logfont.h index 820e798d2be..173fe7288f5 100644 --- a/reactos/include/rosrtl/logfont.h +++ b/reactos/include/rosrtl/logfont.h @@ -7,10 +7,10 @@ extern "C" #endif void -RosRtlLogFontA2W ( LPLOGFONTW pW, const LPLOGFONTA pA ); +RosRtlLogFontA2W ( LPLOGFONTW pW, const LOGFONTA *pA ); void -RosRtlLogFontW2A ( LPLOGFONTA pA, const LPLOGFONTW pW ); +RosRtlLogFontW2A ( LPLOGFONTA pA, const LOGFONTW *pW ); #ifdef __cplusplus } diff --git a/reactos/lib/gdi32/objects/text.c b/reactos/lib/gdi32/objects/text.c index 459e2a7e807..f3e393255af 100644 --- a/reactos/lib/gdi32/objects/text.c +++ b/reactos/lib/gdi32/objects/text.c @@ -8,6 +8,7 @@ #include #include #include +#include /* @@ -260,21 +261,11 @@ CreateFontIndirectA( CONST LOGFONTA *lf ) { - ANSI_STRING StringA; - UNICODE_STRING StringU; - HFONT ret; - LOGFONTW tlf; + LOGFONTW tlf; - RtlInitAnsiString(&StringA, (LPSTR)lf->lfFaceName); - RtlAnsiStringToUnicodeString(&StringU, &StringA, TRUE); - memcpy(&tlf, lf, sizeof(LOGFONTA)); - memcpy(&tlf.lfFaceName, &StringU.Buffer, StringU.Length); + RosRtlLogFontA2W(&tlf, lf); - ret = CreateFontIndirectW(&tlf); - - RtlFreeUnicodeString(&StringU); - - return ret; + return NtGdiCreateFontIndirect(&tlf); } diff --git a/reactos/lib/rosrtl/misc/logfont.c b/reactos/lib/rosrtl/misc/logfont.c index 1838ba14960..b281fc9f3ce 100644 --- a/reactos/lib/rosrtl/misc/logfont.c +++ b/reactos/lib/rosrtl/misc/logfont.c @@ -3,7 +3,7 @@ #include void -RosRtlLogFontA2W ( LPLOGFONTW pW, const LPLOGFONTA pA ) +RosRtlLogFontA2W ( LPLOGFONTW pW, const LOGFONTA *pA ) { #define COPYS(f,len) MultiByteToWideChar ( CP_THREAD_ACP, 0, pA->f, len, pW->f, len ) #define COPYN(f) pW->f = pA->f @@ -28,7 +28,7 @@ RosRtlLogFontA2W ( LPLOGFONTW pW, const LPLOGFONTA pA ) } void -RosRtlLogFontW2A ( LPLOGFONTA pA, const LPLOGFONTW pW ) +RosRtlLogFontW2A ( LPLOGFONTA pA, const LOGFONTW *pW ) { #define COPYS(f,len) WideCharToMultiByte ( CP_THREAD_ACP, 0, pW->f, len, pA->f, len, NULL, NULL ) #define COPYN(f) pA->f = pW->f From 25c77834cec9c3e9854b031f8d3eaae6f8e9027e Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sat, 27 Mar 2004 21:19:27 +0000 Subject: [PATCH 0661/1463] Merge Wine commit: Martin Fuchs Call IShellExecuteHook interface for ShellExecute() calls with ID lists. svn path=/trunk/; revision=8893 --- reactos/lib/shell32/shlexec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/shell32/shlexec.c b/reactos/lib/shell32/shlexec.c index 2d618092447..40edc21e172 100644 --- a/reactos/lib/shell32/shlexec.c +++ b/reactos/lib/shell32/shlexec.c @@ -997,7 +997,7 @@ BOOL WINAPI ShellExecuteExW32 (LPSHELLEXECUTEINFOW psei, SHELL_ExecuteW32 execfu } /* process the IDList */ - if (sei_tmp.fMask & SEE_MASK_INVOKEIDLIST) /* 0x0c: includes SEE_MASK_IDLIST */ + if (sei_tmp.fMask & SEE_MASK_IDLIST) { IShellExecuteHookW* pSEH; From 7d9ce02db4349c9961e18a01a57c7cf8a9c6ef80 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 27 Mar 2004 23:24:51 +0000 Subject: [PATCH 0662/1463] implemented WlxDisplaySASNotice() svn path=/trunk/; revision=8894 --- reactos/lib/msgina/msgina.c | 20 ++++++++++++++++---- reactos/lib/msgina/stubs.c | 14 +------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/reactos/lib/msgina/msgina.c b/reactos/lib/msgina/msgina.c index ca32556981c..61fdab00692 100644 --- a/reactos/lib/msgina/msgina.c +++ b/reactos/lib/msgina/msgina.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: msgina.c,v 1.7 2003/12/27 11:09:58 weiden Exp $ +/* $Id: msgina.c,v 1.8 2004/03/27 23:24:51 weiden Exp $ * * PROJECT: ReactOS msgina.dll * FILE: lib/msgina/msgina.c @@ -203,7 +203,7 @@ WlxActivateUserShell( if(RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\ReactOS\\Windows NT\\CurrentVersion\\Winlogon", 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS) - { + {DbgPrint("GINA: Failed: 1\n"); VirtualFree(pEnvironment, 0, MEM_RELEASE); return FALSE; } @@ -211,7 +211,7 @@ WlxActivateUserShell( if((RegQueryValueEx(hKey, L"Userinit", NULL, &ValueType, (LPBYTE)pszUserInitApp, &BufSize) != ERROR_SUCCESS) || !((ValueType == REG_SZ) || (ValueType == REG_EXPAND_SZ))) - { + {DbgPrint("GINA: Failed: 2\n"); RegCloseKey(hKey); VirtualFree(pEnvironment, 0, MEM_RELEASE); return FALSE; @@ -243,7 +243,7 @@ WlxActivateUserShell( NULL, &si, &pi); - + if(!Ret) DbgPrint("GINA: Failed: 3\n"); VirtualFree(pEnvironment, 0, MEM_RELEASE); return Ret; } @@ -447,6 +447,18 @@ WlxRemoveStatusMessage( } +/* + * @implemented + */ +VOID WINAPI +WlxDisplaySASNotice( + PVOID pWlxContext) +{ + PGINA_CONTEXT pgContext = (PGINA_CONTEXT)pWlxContext; + pgContext->pWlxFuncs->WlxSasNotify(pgContext->hWlx, WLX_SAS_TYPE_CTRL_ALT_DEL); +} + + BOOL STDCALL DllMain( HINSTANCE hinstDLL, diff --git a/reactos/lib/msgina/stubs.c b/reactos/lib/msgina/stubs.c index 529a52ae893..e14df0d1161 100644 --- a/reactos/lib/msgina/stubs.c +++ b/reactos/lib/msgina/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.5 2003/12/01 18:21:04 weiden Exp $ +/* $Id: stubs.c,v 1.6 2004/03/27 23:24:51 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS msgina.dll @@ -50,18 +50,6 @@ WlxDisplayLockedNotice( } -/* - * @unimplemented - */ -VOID WINAPI -WlxDisplaySASNotice( - PVOID pWlxContext) -{ - UNIMPLEMENTED; - return; -} - - /* * @unimplemented */ From 5c7330b4d484487f78736db6df5510a953ea72cd Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sun, 28 Mar 2004 09:34:43 +0000 Subject: [PATCH 0663/1463] smart XML formating svn path=/trunk/; revision=8895 --- .../subsys/system/explorer/make_explorer.dsp | 2 +- .../system/explorer/utility/xmlstorage.cpp | 125 ++++++++++++++++++ .../system/explorer/utility/xmlstorage.h | 102 ++++---------- 3 files changed, 149 insertions(+), 80 deletions(-) diff --git a/reactos/subsys/system/explorer/make_explorer.dsp b/reactos/subsys/system/explorer/make_explorer.dsp index 07d7f7f4814..1631b01d435 100644 --- a/reactos/subsys/system/explorer/make_explorer.dsp +++ b/reactos/subsys/system/explorer/make_explorer.dsp @@ -108,7 +108,7 @@ CFG=make_explorer - Win32 bjam # PROP Use_Debug_Libraries 0 # PROP Output_Dir "URelease" # PROP Intermediate_Dir "URelease" -# PROP Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=1" +# PROP Cmd_Line "msdevfilt -gcc make -f Makefile.MinGW UNICODE=1" # PROP Rebuild_Opt "clean all" # PROP Target_File "explorer.exe" # PROP Bsc_Name "" diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.cpp b/reactos/subsys/system/explorer/utility/xmlstorage.cpp index e1b90f2b672..2acf857b160 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.cpp +++ b/reactos/subsys/system/explorer/utility/xmlstorage.cpp @@ -106,4 +106,129 @@ void XMLCALL XMLReader::XML_DefaultHandler(void* userData, const XML_Char* s, in } +std::string XMLString(LPCTSTR s) +{ + TCHAR buffer[BUFFER_LEN]; + LPTSTR o = buffer; + + for(LPCTSTR p=s; *p; ++p) + switch(*p) { + case '&': + *o++ = '&'; *o++ = 'a'; *o++ = 'm'; *o++ = 'p'; *o++ = ';'; + break; + + case '<': + *o++ = '&'; *o++ = 'l'; *o++ = 't'; *o++ = ';'; + break; + + case '>': + *o++ = '&'; *o++ = 'g'; *o++ = 't'; *o++ = ';'; + break; + + default: + *o++ = *p; + } + + return get_utf8(buffer, o-buffer); +} + + + /// write node with children tree to output stream +std::ostream& XMLNode::write_worker(std::ostream& out, WRITE_MODE mode, int indent) +{ + bool format = mode==FORMAT_PRETTY; + + if (format) + for(int i=indent; i--; ) + out << XML_INDENT_SPACE; + + out << '<' << XMLString(*this); + + for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it) + out << ' ' << XMLString(it->first) << "=\"" << XMLString(it->second) << "\""; + + if (!_children.empty() || !_content.empty()) { + out << '>'; + + if (format) + out << '\n'; + else + out << _content; + + for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) + (*it)->write_worker(out, mode, indent+1); + + if (format) + for(int i=indent; i--; ) + out << XML_INDENT_SPACE; + + out << "'; + } else { + out << "/>"; + } + + if (format) + out << '\n'; + else + out << _trailing; + + return out; +} + + + /// write node with children tree to output stream using smart formating +std::ostream& XMLNode::smart_write_worker(std::ostream& out, int indent, bool& next_format) +{ + bool format_pre, format_mid, format_post; + + format_pre = next_format; + format_mid = _content.empty(); + format_post = _trailing.empty(); + + if (format_pre) + for(int i=indent; i--; ) + out << XML_INDENT_SPACE; + + out << '<' << XMLString(*this); + + for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it) + out << ' ' << XMLString(it->first) << "=\"" << XMLString(it->second) << "\""; + + if (!_children.empty() || !_content.empty()) { + out << '>'; + + if (format_mid) + out << '\n'; + else + out << _content; + + Children::const_iterator it = _children.begin(); + + if (it != _children.end()) { + next_format = (*it)->_content.empty() && (*it)->_trailing.empty(); + + for(; it!=_children.end(); ++it) + (*it)->smart_write_worker(out, indent+1, next_format); + } + + if (next_format) + for(int i=indent; i--; ) + out << XML_INDENT_SPACE; + + out << "'; + } else { + out << "/>"; + } + + if (format_post) + out << '\n'; + else + out << _trailing; + + next_format = format_post; + + return out; +} + + } // namespace XMLStorage diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.h b/reactos/subsys/system/explorer/utility/xmlstorage.h index 6052d12d1a1..ac2df696293 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.h +++ b/reactos/subsys/system/explorer/utility/xmlstorage.h @@ -202,31 +202,7 @@ inline std::string get_utf8(const String& s) return get_utf8(s.c_str(), s.length()); } -inline std::string XMLString(const String& s) -{ - TCHAR buffer[BUFFER_LEN]; - LPTSTR o = buffer; - - for(LPCTSTR p=s; *p; ++p) - switch(*p) { - case '&': - *o++ = '&'; *o++ = 'a'; *o++ = 'm'; *o++ = 'p'; *o++ = ';'; - break; - - case '<': - *o++ = '&'; *o++ = 'l'; *o++ = 't'; *o++ = ';'; - break; - - case '>': - *o++ = '&'; *o++ = 'g'; *o++ = 't'; *o++ = ';'; - break; - - default: - *o++ = *p; - } - - return get_utf8(buffer, o-buffer); -} +extern std::string XMLString(LPCTSTR s); // write XML files with 2 spaces indenting @@ -306,54 +282,22 @@ struct XMLNode : public String return _children; } - /// write XML stream preserving original white space and comments - std::ostream& write(std::ostream& out) + enum WRITE_MODE { + FORMAT_SMART = 0, /// preserve original white space and comments if present; pretty print otherwise + FORMAT_ORIGINAL = 1, /// write XML stream preserving original white space and comments + FORMAT_PRETTY = 2 /// pretty print node to stream without preserving original white space + }; + + /// write node with children tree to output stream + std::ostream& write(std::ostream& out, WRITE_MODE mode=FORMAT_SMART, int indent=0) { - out << "<" << XMLString(*this); + if (mode) { + return write_worker(out, mode, indent); + } else { // FORMAT_SMART + bool next_format = _content.empty() && _trailing.empty(); - for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it) - out << " " << XMLString(it->first) << "=\"" << XMLString(it->second) << "\""; - - if (!_children.empty() || !_content.empty()) { - out << ">" << _content; - - for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) - (*it)->write(out); - - out << "" << _trailing; - } else { - out << "/>" << _trailing; + return smart_write_worker(out, indent, next_format); } - - return out; - } - - /// print write node to stream without preserving original white space - std::ostream& write_formating(std::ostream& out, int indent=0) - { - for(int i=indent; i--; ) - out << XML_INDENT_SPACE; - - out << "<" << XMLString(*this); - - for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it) - out << " " << XMLString(it->first) << "=\"" << XMLString(it->second) << "\""; - - if (!_children.empty()) { - out << ">\n"; - - for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) - (*it)->write_formating(out, indent+1); - - for(int i=indent; i--; ) - out << XML_INDENT_SPACE; - - out << "\n"; - } else { - out << "/>\n"; - } - - return out; } protected: @@ -407,6 +351,9 @@ protected: else _children.back()->_trailing.append(s, l); } + + std::ostream& write_worker(std::ostream& out, WRITE_MODE mode, int indent); + std::ostream& smart_write_worker(std::ostream& out, int indent, bool& next_format); }; @@ -724,7 +671,8 @@ struct XMLDoc : public XMLNode } /// write XML stream preserving previous white space and comments - std::ostream& write(std::ostream& out, const std::string& xml_version="1.0", const std::string& encoding="UTF-8") + std::ostream& write(std::ostream& out, WRITE_MODE mode=FORMAT_SMART, + const std::string& xml_version="1.0", const std::string& encoding="UTF-8") { out << "\n"; @@ -737,19 +685,15 @@ struct XMLDoc : public XMLNode /// write XML stream with formating std::ostream& write_formating(std::ostream& out) { - out << "\n"; - - if (!_children.empty()) - _children.front()->write_formating(out); - - return out; + return write(out, FORMAT_PRETTY); } - void write(const std::string& path, const std::string& xml_version="1.0", const std::string& encoding="UTF-8") + void write(const std::string& path, WRITE_MODE mode=FORMAT_SMART, + const std::string& xml_version="1.0", const std::string& encoding="UTF-8") { std::ofstream out(path.c_str()); - write(out, xml_version); + write(out, mode, xml_version, encoding); } void write_formating(const std::string& path) From c73475996489f0c938a266454b6b24247976869d Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sun, 28 Mar 2004 09:48:13 +0000 Subject: [PATCH 0664/1463] - Minor cleanup and fixed few memory leaks on driver unload. svn path=/trunk/; revision=8896 --- reactos/ntoskrnl/include/internal/io.h | 8 +- reactos/ntoskrnl/io/driver.c | 574 ++++++++++++++----------- 2 files changed, 321 insertions(+), 261 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/io.h b/reactos/ntoskrnl/include/internal/io.h index 45afb24d356..968b700d2ef 100644 --- a/reactos/ntoskrnl/include/internal/io.h +++ b/reactos/ntoskrnl/include/internal/io.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: io.h,v 1.41 2004/03/27 19:41:31 navaraf Exp $ +/* $Id: io.h,v 1.42 2004/03/28 09:48:13 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -57,6 +57,12 @@ typedef struct _DEVOBJ_EXTENSION { struct _DEVICE_NODE *DeviceNode; } DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION; +typedef struct _PRIVATE_DRIVER_EXTENSIONS { + struct _PRIVATE_DRIVER_EXTENSIONS *Link; + PVOID ClientIdentificationAddress; + CHAR Extension[1]; +} PRIVATE_DRIVER_EXTENSIONS, *PPRIVATE_DRIVER_EXTENSIONS; + typedef struct _DEVICE_NODE { struct _DEVICE_NODE *Parent; diff --git a/reactos/ntoskrnl/io/driver.c b/reactos/ntoskrnl/io/driver.c index 3259c70eb41..0b88897b97b 100644 --- a/reactos/ntoskrnl/io/driver.c +++ b/reactos/ntoskrnl/io/driver.c @@ -1,4 +1,4 @@ -/* $Id: driver.c,v 1.39 2004/03/27 19:41:32 navaraf Exp $ +/* $Id: driver.c,v 1.40 2004/03/28 09:48:13 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -85,24 +85,19 @@ POBJECT_TYPE EXPORTED IoDriverObjectType = NULL; #define DRIVER_REGISTRY_KEY_BASENAME L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\" -/* PRIVATE FUNCTIONS **********************************************************/ +/* DECLARATIONS ***************************************************************/ NTSTATUS STDCALL IopCreateDriver( PVOID ObjectBody, PVOID Parent, PWSTR RemainingPath, - POBJECT_ATTRIBUTES ObjectAttributes) -{ - DPRINT("LdrCreateModule(ObjectBody %x, Parent %x, RemainingPath %S)\n", - ObjectBody, Parent, RemainingPath); + POBJECT_ATTRIBUTES ObjectAttributes); - if (RemainingPath != NULL && wcschr(RemainingPath + 1, '\\') != NULL) - return STATUS_UNSUCCESSFUL; - - return STATUS_SUCCESS; -} +VOID STDCALL +IopDeleteDriver(PVOID ObjectBody); +/* PRIVATE FUNCTIONS **********************************************************/ VOID INIT_FUNCTION IopInitDriverImplementation(VOID) @@ -119,7 +114,7 @@ IopInitDriverImplementation(VOID) IoDriverObjectType->Dump = NULL; IoDriverObjectType->Open = NULL; IoDriverObjectType->Close = NULL; - IoDriverObjectType->Delete = NULL; + IoDriverObjectType->Delete = IopDeleteDriver; IoDriverObjectType->Parse = NULL; IoDriverObjectType->Security = NULL; IoDriverObjectType->QueryName = NULL; @@ -136,7 +131,7 @@ IopInitDriverImplementation(VOID) } NTSTATUS STDCALL -IopDefaultDispatchFunction( +IopInvalidDeviceRequest( PDEVICE_OBJECT DeviceObject, PIRP Irp) { @@ -146,6 +141,68 @@ IopDefaultDispatchFunction( return STATUS_NOT_IMPLEMENTED; } +NTSTATUS STDCALL +IopCreateDriver( + PVOID ObjectBody, + PVOID Parent, + PWSTR RemainingPath, + POBJECT_ATTRIBUTES ObjectAttributes) +{ + PDRIVER_OBJECT Object = ObjectBody; + ULONG i; + + DPRINT("IopCreateDriver(ObjectBody %x, Parent %x, RemainingPath %S)\n", + ObjectBody, Parent, RemainingPath); + + if (RemainingPath != NULL && wcschr(RemainingPath + 1, '\\') != NULL) + return STATUS_UNSUCCESSFUL; + + /* Create driver extension */ + Object->DriverExtension = (PDRIVER_EXTENSION) + ExAllocatePoolWithTag( + NonPagedPool, + sizeof(DRIVER_EXTENSION), + TAG_DRIVER_EXTENSION); + + if (Object->DriverExtension == NULL) + { + return STATUS_NO_MEMORY; + } + + RtlZeroMemory(Object->DriverExtension, sizeof(DRIVER_EXTENSION)); + + Object->Type = InternalDriverType; + + for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) + Object->MajorFunction[i] = IopInvalidDeviceRequest; + + return STATUS_SUCCESS; +} + +VOID STDCALL +IopDeleteDriver(PVOID ObjectBody) +{ + PDRIVER_OBJECT Object = ObjectBody; + KIRQL OldIrql; + PPRIVATE_DRIVER_EXTENSIONS DriverExtension, NextDriverExtension; + + DPRINT("IopDeleteDriver(ObjectBody %x)\n", ObjectBody); + + ExFreePool(Object->DriverExtension); + + OldIrql = KeRaiseIrqlToDpcLevel(); + + for (DriverExtension = Object->DriverSection; + DriverExtension != NULL; + DriverExtension = NextDriverExtension) + { + NextDriverExtension = DriverExtension->Link; + ExFreePool(DriverExtension); + } + + KfLowerIrql(OldIrql); +} + NTSTATUS FASTCALL IopCreateDriverObject( PDRIVER_OBJECT *DriverObject, @@ -155,7 +212,6 @@ IopCreateDriverObject( ULONG DriverImageSize) { PDRIVER_OBJECT Object; - ULONG i; WCHAR NameBuffer[MAX_PATH]; UNICODE_STRING DriverName; OBJECT_ATTRIBUTES ObjectAttributes; @@ -208,28 +264,9 @@ IopCreateDriverObject( return Status; } - /* Create driver extension */ - Object->DriverExtension = (PDRIVER_EXTENSION) - ExAllocatePoolWithTag( - NonPagedPool, - sizeof(DRIVER_EXTENSION), - TAG_DRIVER_EXTENSION); - - if (Object->DriverExtension == NULL) - { - ExFreePool(Object); - return STATUS_NO_MEMORY; - } - - RtlZeroMemory(Object->DriverExtension, sizeof(DRIVER_EXTENSION)); - - Object->Type = InternalDriverType; Object->DriverStart = DriverImageStart; Object->DriverSize = DriverImageSize; - for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) - Object->MajorFunction[i] = IopDefaultDispatchFunction; - *DriverObject = Object; return STATUS_SUCCESS; @@ -551,7 +588,6 @@ IopAttachFilterDriversCallback( PMODULE_OBJECT ModuleObject; PDRIVER_OBJECT DriverObject; NTSTATUS Status; - for (Filters = ValueData; ((ULONG_PTR)Filters - (ULONG_PTR)ValueData) < ValueLength && @@ -681,13 +717,6 @@ IopAttachFilterDrivers( return STATUS_SUCCESS; } - - - - - - - static NTSTATUS STDCALL IopCreateGroupListEntry(PWSTR ValueName, ULONG ValueType, @@ -964,12 +993,12 @@ IoDestroyDriverList(VOID) VOID STATIC MiFreeBootDriverMemory(PVOID StartAddress, ULONG Length) { - ULONG i; + ULONG i; - for (i = 0; i < PAGE_ROUND_UP(Length)/PAGE_SIZE; i++) - { - MmDeleteVirtualMapping(NULL, (char*)StartAddress + i * PAGE_SIZE, TRUE, NULL, NULL); - } + for (i = 0; i < PAGE_ROUND_UP(Length) / PAGE_SIZE; i++) + { + MmDeleteVirtualMapping(NULL, (char*)StartAddress + i * PAGE_SIZE, TRUE, NULL, NULL); + } } /* @@ -999,12 +1028,14 @@ IopInitializeBuiltinDriver( /* * Display 'Initializing XXX...' message */ + sprintf(TextBuffer, "Initializing %s...\n", FileName); HalDisplayString(TextBuffer); /* * Determine the right device object */ + if (ModuleDeviceNode == NULL) { /* Use IopRootDeviceNode for now */ @@ -1022,6 +1053,7 @@ IopInitializeBuiltinDriver( /* * Generate filename without path (not needed by freeldr) */ + FileNameWithoutPath = strrchr(FileName, '\\'); if (FileNameWithoutPath == NULL) { @@ -1031,6 +1063,7 @@ IopInitializeBuiltinDriver( /* * Load the module */ + RtlCreateUnicodeStringFromAsciiz(&DeviceNode->ServiceName, FileNameWithoutPath); Status = LdrProcessModule(ModuleLoadBase, &DeviceNode->ServiceName, @@ -1046,6 +1079,7 @@ IopInitializeBuiltinDriver( /* * Strip the file extension from ServiceName */ + FileExtension = wcsrchr(DeviceNode->ServiceName.Buffer, '.'); if (FileExtension != NULL) { @@ -1056,6 +1090,7 @@ IopInitializeBuiltinDriver( /* * Initialize the driver */ + Status = IopInitializeDriverModule(DeviceNode, ModuleObject, FALSE, &DriverObject); @@ -1112,6 +1147,7 @@ IopInitializeBootDrivers(VOID) /* * Pass symbol files to kernel debugger */ + if (!_stricmp(Extension, ".sym")) { KDB_SYMBOLFILE_HOOK((PVOID)ModuleStart, ModuleName, ModuleSize); @@ -1120,6 +1156,7 @@ IopInitializeBootDrivers(VOID) /* * Load builtin driver */ + if (!_stricmp(Extension, ".sys")) { if (!ModuleLoaded) @@ -1133,6 +1170,7 @@ IopInitializeBootDrivers(VOID) /* * Free memory for all boot files, except ntoskrnl.exe and hal.dll */ + #ifdef KDBG /* * Do not free the memory from symbol files, if the kernel debugger @@ -1371,215 +1409,6 @@ IopUnloadDriver(PUNICODE_STRING DriverServiceName, BOOLEAN UnloadPnpDrivers) return STATUS_SUCCESS; } -/* FUNCTIONS ******************************************************************/ - -/* - * NtLoadDriver - * - * Loads a device driver. - * - * Parameters - * DriverServiceName - * Name of the service to load (registry key). - * - * Return Value - * Status - */ - -NTSTATUS STDCALL -NtLoadDriver(IN PUNICODE_STRING DriverServiceName) -{ - RTL_QUERY_REGISTRY_TABLE QueryTable[3]; - UNICODE_STRING ImagePath; - UNICODE_STRING ServiceName; - NTSTATUS Status; - ULONG Type; - PDEVICE_NODE DeviceNode; - PMODULE_OBJECT ModuleObject; - PDRIVER_OBJECT DriverObject; - LPWSTR Start; - - DPRINT("NtLoadDriver('%wZ')\n", DriverServiceName); - - /* - * Check security privileges - */ - -#if 0 - if (!SeSinglePrivilegeCheck(SeLoadDriverPrivilege, KeGetPreviousMode())) - return STATUS_PRIVILEGE_NOT_HELD; -#endif - - RtlInitUnicodeString(&ImagePath, NULL); - - /* - * Get the service name from the registry key name. - */ - - Start = wcsrchr(DriverServiceName->Buffer, L'\\'); - if (Start == NULL) - Start = DriverServiceName->Buffer; - else - Start++; - - RtlInitUnicodeString(&ServiceName, Start); - - /* - * Get service type. - */ - - RtlZeroMemory(&QueryTable, sizeof(QueryTable)); - - RtlInitUnicodeString(&ImagePath, NULL); - - QueryTable[0].Name = L"Type"; - QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; - QueryTable[0].EntryContext = &Type; - - QueryTable[1].Name = L"ImagePath"; - QueryTable[1].Flags = RTL_QUERY_REGISTRY_DIRECT; - QueryTable[1].EntryContext = &ImagePath; - - Status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE, - DriverServiceName->Buffer, QueryTable, NULL, NULL); - - if (!NT_SUCCESS(Status)) - { - DPRINT("RtlQueryRegistryValues() failed (Status %lx)\n", Status); - RtlFreeUnicodeString(&ImagePath); - return Status; - } - - /* - * Normalize the image path for all later processing. - */ - - Status = IopNormalizeImagePath(&ImagePath, &ServiceName); - - if (!NT_SUCCESS(Status)) - { - DPRINT("IopNormalizeImagePath() failed (Status %x)\n", Status); - return Status; - } - - DPRINT("FullImagePath: '%S'\n", ImagePath.Buffer); - DPRINT("Type: %lx\n", Type); - - /* - * See, if the driver module isn't already loaded - */ - ModuleObject = LdrGetModuleObject(&ImagePath); - if (ModuleObject != NULL) - { - return STATUS_IMAGE_ALREADY_LOADED; - } - - /* - * Create device node - */ - - /* Use IopRootDeviceNode for now */ - Status = IopCreateDeviceNode(IopRootDeviceNode, NULL, &DeviceNode); - - if (!NT_SUCCESS(Status)) - { - DPRINT("IopCreateDeviceNode() failed (Status %lx)\n", Status); - return Status; - } - - /* - * Load the driver module - */ - - Status = LdrLoadModule(&ImagePath, &ModuleObject); - - if (!NT_SUCCESS(Status)) - { - DPRINT("LdrLoadModule() failed (Status %lx)\n", Status); - IopFreeDeviceNode(DeviceNode); - return Status; - } - - /* - * Set a service name for the device node - */ - - Start = wcsrchr(DriverServiceName->Buffer, L'\\'); - if (Start == NULL) - Start = DriverServiceName->Buffer; - else - Start++; - RtlCreateUnicodeString(&DeviceNode->ServiceName, Start); - - /* - * Initialize the driver module - */ - - Status = IopInitializeDriverModule( - DeviceNode, - ModuleObject, - (Type == 2 /*SERVICE_FILE_SYSTEM_DRIVER*/ || - Type == 8 /*SERVICE_RECOGNIZER_DRIVER*/), - &DriverObject); - - if (!NT_SUCCESS(Status)) - { - DPRINT1("IopInitializeDriver() failed (Status %lx)\n", Status); - LdrUnloadModule(ModuleObject); - IopFreeDeviceNode(DeviceNode); - return Status; - } - - IopInitializeDevice(DeviceNode, DriverObject); - - return Status; -} - -/* - * NtUnloadDriver - * - * Unloads a legacy device driver. - * - * Parameters - * DriverServiceName - * Name of the service to unload (registry key). - * - * Return Value - * Status - */ - -NTSTATUS STDCALL -NtUnloadDriver(IN PUNICODE_STRING DriverServiceName) -{ - return IopUnloadDriver(DriverServiceName, FALSE); -} - - -/* - * @implemented - */ -VOID STDCALL -IoRegisterDriverReinitialization(PDRIVER_OBJECT DriverObject, - PDRIVER_REINITIALIZE ReinitRoutine, - PVOID Context) -{ - PDRIVER_REINIT_ITEM ReinitItem; - - ReinitItem = ExAllocatePool(NonPagedPool, - sizeof(DRIVER_REINIT_ITEM)); - if (ReinitItem == NULL) - return; - - ReinitItem->DriverObject = DriverObject; - ReinitItem->ReinitRoutine = ReinitRoutine; - ReinitItem->Context = Context; - - ExInterlockedInsertTailList(&DriverReinitListHead, - &ReinitItem->ItemEntry, - &DriverReinitListLock); -} - - VOID FASTCALL IopMarkLastReinitializeDriver(VOID) { @@ -1645,11 +1474,229 @@ IopReinitializeDrivers(VOID) } } -typedef struct _PRIVATE_DRIVER_EXTENSIONS { - struct _PRIVATE_DRIVER_EXTENSIONS *Link; - PVOID ClientIdentificationAddress; - CHAR Extension[1]; -} PRIVATE_DRIVER_EXTENSIONS, *PPRIVATE_DRIVER_EXTENSIONS; +/* PUBLIC FUNCTIONS ***********************************************************/ + +/* + * NtLoadDriver + * + * Loads a device driver. + * + * Parameters + * DriverServiceName + * Name of the service to load (registry key). + * + * Return Value + * Status + * + * Status + * implemented + */ + +NTSTATUS STDCALL +NtLoadDriver(IN PUNICODE_STRING DriverServiceName) +{ + RTL_QUERY_REGISTRY_TABLE QueryTable[3]; + UNICODE_STRING ImagePath; + UNICODE_STRING ServiceName; + NTSTATUS Status; + ULONG Type; + PDEVICE_NODE DeviceNode; + PMODULE_OBJECT ModuleObject; + PDRIVER_OBJECT DriverObject; + LPWSTR Start; + + DPRINT("NtLoadDriver('%wZ')\n", DriverServiceName); + + /* + * Check security privileges + */ + + if (!SeSinglePrivilegeCheck(SeLoadDriverPrivilege, KeGetPreviousMode())) + return STATUS_PRIVILEGE_NOT_HELD; + + RtlInitUnicodeString(&ImagePath, NULL); + + /* + * Get the service name from the registry key name. + */ + + Start = wcsrchr(DriverServiceName->Buffer, L'\\'); + if (Start == NULL) + Start = DriverServiceName->Buffer; + else + Start++; + + RtlInitUnicodeString(&ServiceName, Start); + + /* + * Get service type. + */ + + RtlZeroMemory(&QueryTable, sizeof(QueryTable)); + + RtlInitUnicodeString(&ImagePath, NULL); + + QueryTable[0].Name = L"Type"; + QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; + QueryTable[0].EntryContext = &Type; + + QueryTable[1].Name = L"ImagePath"; + QueryTable[1].Flags = RTL_QUERY_REGISTRY_DIRECT; + QueryTable[1].EntryContext = &ImagePath; + + Status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE, + DriverServiceName->Buffer, QueryTable, NULL, NULL); + + if (!NT_SUCCESS(Status)) + { + DPRINT("RtlQueryRegistryValues() failed (Status %lx)\n", Status); + RtlFreeUnicodeString(&ImagePath); + return Status; + } + + /* + * Normalize the image path for all later processing. + */ + + Status = IopNormalizeImagePath(&ImagePath, &ServiceName); + + if (!NT_SUCCESS(Status)) + { + DPRINT("IopNormalizeImagePath() failed (Status %x)\n", Status); + return Status; + } + + DPRINT("FullImagePath: '%S'\n", ImagePath.Buffer); + DPRINT("Type: %lx\n", Type); + + /* + * See, if the driver module isn't already loaded + */ + + ModuleObject = LdrGetModuleObject(&ImagePath); + if (ModuleObject != NULL) + { + return STATUS_IMAGE_ALREADY_LOADED; + } + + /* + * Create device node + */ + + /* Use IopRootDeviceNode for now */ + Status = IopCreateDeviceNode(IopRootDeviceNode, NULL, &DeviceNode); + + if (!NT_SUCCESS(Status)) + { + DPRINT("IopCreateDeviceNode() failed (Status %lx)\n", Status); + return Status; + } + + /* + * Load the driver module + */ + + Status = LdrLoadModule(&ImagePath, &ModuleObject); + + if (!NT_SUCCESS(Status)) + { + DPRINT("LdrLoadModule() failed (Status %lx)\n", Status); + IopFreeDeviceNode(DeviceNode); + return Status; + } + + /* + * Set a service name for the device node + */ + + Start = wcsrchr(DriverServiceName->Buffer, L'\\'); + if (Start == NULL) + Start = DriverServiceName->Buffer; + else + Start++; + RtlCreateUnicodeString(&DeviceNode->ServiceName, Start); + + /* + * Initialize the driver module + */ + + Status = IopInitializeDriverModule( + DeviceNode, + ModuleObject, + (Type == 2 /* SERVICE_FILE_SYSTEM_DRIVER */ || + Type == 8 /* SERVICE_RECOGNIZER_DRIVER */), + &DriverObject); + + if (!NT_SUCCESS(Status)) + { + DPRINT("IopInitializeDriver() failed (Status %lx)\n", Status); + LdrUnloadModule(ModuleObject); + IopFreeDeviceNode(DeviceNode); + return Status; + } + + IopInitializeDevice(DeviceNode, DriverObject); + + return Status; +} + +/* + * NtUnloadDriver + * + * Unloads a legacy device driver. + * + * Parameters + * DriverServiceName + * Name of the service to unload (registry key). + * + * Return Value + * Status + * + * Status + * implemented + */ + +NTSTATUS STDCALL +NtUnloadDriver(IN PUNICODE_STRING DriverServiceName) +{ + return IopUnloadDriver(DriverServiceName, FALSE); +} + +/* + * IoRegisterDriverReinitialization + * + * Status + * @implemented + */ + +VOID STDCALL +IoRegisterDriverReinitialization( + PDRIVER_OBJECT DriverObject, + PDRIVER_REINITIALIZE ReinitRoutine, + PVOID Context) +{ + PDRIVER_REINIT_ITEM ReinitItem; + + ReinitItem = ExAllocatePool(NonPagedPool, sizeof(DRIVER_REINIT_ITEM)); + if (ReinitItem == NULL) + return; + + ReinitItem->DriverObject = DriverObject; + ReinitItem->ReinitRoutine = ReinitRoutine; + ReinitItem->Context = Context; + + ExInterlockedInsertTailList( + &DriverReinitListHead, + &ReinitItem->ItemEntry, + &DriverReinitListLock); +} + +/* + * IoAllocateDriverObjectExtension + * + * Status + * @implemented + */ NTSTATUS STDCALL IoAllocateDriverObjectExtension( @@ -1699,6 +1746,13 @@ IoAllocateDriverObjectExtension( return STATUS_SUCCESS; } +/* + * IoGetDriverObjectExtension + * + * Status + * @implemented + */ + PVOID STDCALL IoGetDriverObjectExtension( PDRIVER_OBJECT DriverObject, From 6d1dae4a753bb8d6cf7053502ce1907c0225e02a Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sun, 28 Mar 2004 09:52:18 +0000 Subject: [PATCH 0665/1463] - Fixed line endings. svn path=/trunk/; revision=8897 --- reactos/apps/utils/driver/load/load.c | 64 +++++++++++------------ reactos/apps/utils/driver/unload/unload.c | 64 +++++++++++------------ 2 files changed, 64 insertions(+), 64 deletions(-) diff --git a/reactos/apps/utils/driver/load/load.c b/reactos/apps/utils/driver/load/load.c index 61aaa89ca73..3b18003f1b1 100644 --- a/reactos/apps/utils/driver/load/load.c +++ b/reactos/apps/utils/driver/load/load.c @@ -1,32 +1,32 @@ -/* - * Load a device driver - */ -#include -#include - -int -main(int argc, char *argv[]) -{ - NTSTATUS Status; - UNICODE_STRING ServiceName; - - if (argc != 2) - { - printf("Usage: load \n"); - return 0; - } - ServiceName.Length = (strlen(argv[1]) + 52) * sizeof(WCHAR); - ServiceName.Buffer = (LPWSTR)malloc(ServiceName.Length + sizeof(UNICODE_NULL)); - wsprintf(ServiceName.Buffer, - L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\%S", - argv[1]); - wprintf(L"%s %d %d\n", ServiceName.Buffer, ServiceName.Length, wcslen(ServiceName.Buffer)); - Status = NtLoadDriver(&ServiceName); - free(ServiceName.Buffer); - if (!NT_SUCCESS(Status)) - { - printf("Failed: %X\n", Status); - return 1; - } - return 0; -} +/* + * Load a device driver + */ +#include +#include + +int +main(int argc, char *argv[]) +{ + NTSTATUS Status; + UNICODE_STRING ServiceName; + + if (argc != 2) + { + printf("Usage: load \n"); + return 0; + } + ServiceName.Length = (strlen(argv[1]) + 52) * sizeof(WCHAR); + ServiceName.Buffer = (LPWSTR)malloc(ServiceName.Length + sizeof(UNICODE_NULL)); + wsprintf(ServiceName.Buffer, + L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\%S", + argv[1]); + wprintf(L"%s %d %d\n", ServiceName.Buffer, ServiceName.Length, wcslen(ServiceName.Buffer)); + Status = NtLoadDriver(&ServiceName); + free(ServiceName.Buffer); + if (!NT_SUCCESS(Status)) + { + printf("Failed: %X\n", Status); + return 1; + } + return 0; +} diff --git a/reactos/apps/utils/driver/unload/unload.c b/reactos/apps/utils/driver/unload/unload.c index 09f8225a0f1..3e843d4e078 100644 --- a/reactos/apps/utils/driver/unload/unload.c +++ b/reactos/apps/utils/driver/unload/unload.c @@ -1,32 +1,32 @@ -/* - * Unload a device driver - */ -#include -#include - -int -main(int argc, char *argv[]) -{ - NTSTATUS Status; - UNICODE_STRING ServiceName; - - if (argc != 2) - { - printf("Usage: unload \n"); - return 0; - } - ServiceName.Length = (strlen(argv[1]) + 52) * sizeof(WCHAR); - ServiceName.Buffer = (LPWSTR)malloc(ServiceName.Length + sizeof(UNICODE_NULL)); - wsprintf(ServiceName.Buffer, - L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\%S", - argv[1]); - wprintf(L"%s %d %d\n", ServiceName.Buffer, ServiceName.Length, wcslen(ServiceName.Buffer)); - Status = NtUnloadDriver(&ServiceName); - free(ServiceName.Buffer); - if (!NT_SUCCESS(Status)) - { - printf("Failed: %X\n", Status); - return 1; - } - return 0; -} +/* + * Unload a device driver + */ +#include +#include + +int +main(int argc, char *argv[]) +{ + NTSTATUS Status; + UNICODE_STRING ServiceName; + + if (argc != 2) + { + printf("Usage: unload \n"); + return 0; + } + ServiceName.Length = (strlen(argv[1]) + 52) * sizeof(WCHAR); + ServiceName.Buffer = (LPWSTR)malloc(ServiceName.Length + sizeof(UNICODE_NULL)); + wsprintf(ServiceName.Buffer, + L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\%S", + argv[1]); + wprintf(L"%s %d %d\n", ServiceName.Buffer, ServiceName.Length, wcslen(ServiceName.Buffer)); + Status = NtUnloadDriver(&ServiceName); + free(ServiceName.Buffer); + if (!NT_SUCCESS(Status)) + { + printf("Failed: %X\n", Status); + return 1; + } + return 0; +} From bbc679d77944983181b2f77babf6e2efd66c2e74 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sun, 28 Mar 2004 12:00:46 +0000 Subject: [PATCH 0666/1463] make config option "show-hidden notification icons" persistent svn path=/trunk/; revision=8898 --- .../subsys/system/explorer/doxy-footer.html | 2 +- .../system/explorer/explorer-cfg-template.xml | 1 + .../system/explorer/taskbar/traynotify.cpp | 7 +- .../system/explorer/utility/xmlstorage.cpp | 71 ++++---- .../system/explorer/utility/xmlstorage.h | 168 ++++++++++++++++-- 5 files changed, 199 insertions(+), 50 deletions(-) diff --git a/reactos/subsys/system/explorer/doxy-footer.html b/reactos/subsys/system/explorer/doxy-footer.html index 1552db4afb1..451e0f066b6 100644 --- a/reactos/subsys/system/explorer/doxy-footer.html +++ b/reactos/subsys/system/explorer/doxy-footer.html @@ -3,7 +3,7 @@
ROS Explorer Source Code Documentation -
generated on 27.03.2004 by
+
generated on 28.03.2004 by
doxygen
diff --git a/reactos/subsys/system/explorer/explorer-cfg-template.xml b/reactos/subsys/system/explorer/explorer-cfg-template.xml index feddd349456..98feb73007b 100644 --- a/reactos/subsys/system/explorer/explorer-cfg-template.xml +++ b/reactos/subsys/system/explorer/explorer-cfg-template.xml @@ -20,6 +20,7 @@ + diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index c788b71117d..d964514e8f4 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -195,6 +195,8 @@ void NotifyArea::read_config() if (pos.go_down("explorer-cfg")) { if (pos.go_down("notify-icons")) { + _show_hidden = XMLBool(pos, "option", "show-hidden"); + XMLChildrenFilter icons(pos, "icon"); for(XMLChildrenFilter::iterator it=icons.begin(); it!=icons.end(); ++it) { @@ -227,13 +229,14 @@ void NotifyArea::read_config() void NotifyArea::write_config() { - // write notification icon settings to XML configuration + // write notification icon settings to XML configuration file XMLPos pos(&g_Globals._cfg); - ///@todo pos.create("\\explorer-cfg\\startmenu"); pos.create("explorer-cfg"); pos.create("notify-icons"); + XMLBoolRef(pos, "option", "show-hidden") = _show_hidden; + for(NotifyIconCfgList::iterator it=_cfg.begin(); it!=_cfg.end(); ++it) { NotifyIconConfig& cfg = *it; diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.cpp b/reactos/subsys/system/explorer/utility/xmlstorage.cpp index 2acf857b160..5f995d0a4ed 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.cpp +++ b/reactos/subsys/system/explorer/utility/xmlstorage.cpp @@ -133,14 +133,33 @@ std::string XMLString(LPCTSTR s) } - /// write node with children tree to output stream -std::ostream& XMLNode::write_worker(std::ostream& out, WRITE_MODE mode, int indent) + /// write node with children tree to output stream using original white space +void XMLNode::write_worker(std::ostream& out, WRITE_MODE mode, int indent) const { - bool format = mode==FORMAT_PRETTY; + out << '<' << XMLString(*this); - if (format) - for(int i=indent; i--; ) - out << XML_INDENT_SPACE; + for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it) + out << ' ' << XMLString(it->first) << "=\"" << XMLString(it->second) << "\""; + + if (!_children.empty() || !_content.empty()) { + out << '>' << _content; + + for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) + (*it)->write_worker(out, mode, indent+1); + + out << "'; + } else + out << "/>"; + + out << _trailing; +} + + + /// pretty print node with children tree to output stream +void XMLNode::pretty_write_worker(std::ostream& out, WRITE_MODE mode, int indent) const +{ + for(int i=indent; i--; ) + out << XML_INDENT_SPACE; out << '<' << XMLString(*this); @@ -148,36 +167,23 @@ std::ostream& XMLNode::write_worker(std::ostream& out, WRITE_MODE mode, int inde out << ' ' << XMLString(it->first) << "=\"" << XMLString(it->second) << "\""; if (!_children.empty() || !_content.empty()) { - out << '>'; - - if (format) - out << '\n'; - else - out << _content; + out << ">\n"; for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) - (*it)->write_worker(out, mode, indent+1); + (*it)->pretty_write_worker(out, mode, indent+1); - if (format) - for(int i=indent; i--; ) - out << XML_INDENT_SPACE; + for(int i=indent; i--; ) + out << XML_INDENT_SPACE; - out << "'; - } else { - out << "/>"; - } - - if (format) - out << '\n'; - else - out << _trailing; - - return out; + out << "\n"; + } else + out << "/>\n"; } + /// write node with children tree to output stream using smart formating -std::ostream& XMLNode::smart_write_worker(std::ostream& out, int indent, bool& next_format) +bool XMLNode::smart_write_worker(std::ostream& out, int indent, bool next_format) const { bool format_pre, format_mid, format_post; @@ -208,7 +214,7 @@ std::ostream& XMLNode::smart_write_worker(std::ostream& out, int indent, bool& n next_format = (*it)->_content.empty() && (*it)->_trailing.empty(); for(; it!=_children.end(); ++it) - (*it)->smart_write_worker(out, indent+1, next_format); + next_format = (*it)->smart_write_worker(out, indent+1, next_format); } if (next_format) @@ -216,18 +222,15 @@ std::ostream& XMLNode::smart_write_worker(std::ostream& out, int indent, bool& n out << XML_INDENT_SPACE; out << "'; - } else { + } else out << "/>"; - } if (format_post) out << '\n'; else out << _trailing; - next_format = format_post; - - return out; + return format_post; } diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.h b/reactos/subsys/system/explorer/utility/xmlstorage.h index ac2df696293..41378e149a1 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.h +++ b/reactos/subsys/system/explorer/utility/xmlstorage.h @@ -289,15 +289,22 @@ struct XMLNode : public String }; /// write node with children tree to output stream - std::ostream& write(std::ostream& out, WRITE_MODE mode=FORMAT_SMART, int indent=0) + std::ostream& write(std::ostream& out, WRITE_MODE mode=FORMAT_SMART, int indent=0) const { - if (mode) { - return write_worker(out, mode, indent); - } else { // FORMAT_SMART - bool next_format = _content.empty() && _trailing.empty(); + switch(mode) { + case FORMAT_PRETTY: + pretty_write_worker(out, mode, indent); + break; - return smart_write_worker(out, indent, next_format); + case FORMAT_ORIGINAL: + write_worker(out, mode, indent); + break; + + default: // FORMAT_SMART + smart_write_worker(out, indent, _content.empty() && _trailing.empty()); } + + return out; } protected: @@ -352,8 +359,9 @@ protected: _children.back()->_trailing.append(s, l); } - std::ostream& write_worker(std::ostream& out, WRITE_MODE mode, int indent); - std::ostream& smart_write_worker(std::ostream& out, int indent, bool& next_format); + void write_worker(std::ostream& out, WRITE_MODE mode, int indent) const; + void pretty_write_worker(std::ostream& out, WRITE_MODE mode, int indent) const; + bool smart_write_worker(std::ostream& out, int indent, bool next_format) const; }; @@ -520,6 +528,9 @@ struct XMLPos return false; } + /// move X-Path like to position in XML tree + bool go(const char* path); + /// create node if not already existing and move to it void create(const String& name) { @@ -545,7 +556,27 @@ struct XMLPos } } - bool go(const char* path); + String& value(const String& name, const String& attr_name) + { + XMLNode* node = _cur->find_first(name); + + if (!node) { + node = new XMLNode(name); + _cur->add_child(node); + } + + return (*node)[attr_name]; + } + + String value(const String& name, const String& attr_name) const + { + XMLNode* node = _cur->find_first(name); + + if (node) + return (*node)[attr_name]; + else + return ""; + } protected: XMLNode* _root; @@ -561,6 +592,117 @@ protected: }; +struct XMLBool +{ + XMLBool(bool value) + : _value(value) + { + } + + XMLBool(LPCTSTR value) + { + _value = !_tcsicmp(value, TEXT("TRUE")); + } + + XMLBool(XMLPos& pos, const String& name, const String& attr_name) + { + _value = !_tcsicmp(pos.value(name, attr_name), TEXT("TRUE")); + } + + operator bool() const + { + return _value; + } + + operator LPCTSTR() const + { + return _value? TEXT("TRUE"): TEXT("FALSE"); + } + +protected: + bool _value; + +private: + void operator=(const XMLBool&); // disallow assignment operations +}; + +struct XMLBoolRef +{ + XMLBoolRef(XMLPos& pos, const String& name, const String& attr_name) + : _ref(pos.value(name, attr_name)) + { + } + + XMLBoolRef& operator=(bool value) + { + _ref.assign(value? TEXT("TRUE"): TEXT("FALSE")); + + return *this; + } + +protected: + String& _ref; +}; + + +struct XMLNumber +{ + XMLNumber(int value) + : _value(value) + { + } + + XMLNumber(LPCTSTR value) + { + _value = _ttoi(value); + } + + XMLNumber(XMLPos& pos, const String& name, const String& attr_name) + { + _value = _ttoi(pos.value(name, attr_name)); + } + + operator int() const + { + return _value; + } + + operator String() const + { + TCHAR buffer[32]; + _stprintf(buffer, TEXT("%d"), _value); + return buffer; + } + +protected: + int _value; + +private: + void operator=(const XMLBool&); // disallow assignment operations +}; + +struct XMLNumberRef +{ + XMLNumberRef(XMLPos& pos, const String& name, const String& attr_name) + : _ref(pos.value(name, attr_name)) + { + } + + XMLNumberRef& operator=(int value) + { + TCHAR buffer[32]; + + _stprintf(buffer, TEXT("%d"), value); + _ref.assign(buffer); + + return *this; + } + +protected: + String& _ref; +}; + + #ifdef _MSC_VER #pragma warning(disable: 4355) #endif @@ -672,7 +814,7 @@ struct XMLDoc : public XMLNode /// write XML stream preserving previous white space and comments std::ostream& write(std::ostream& out, WRITE_MODE mode=FORMAT_SMART, - const std::string& xml_version="1.0", const std::string& encoding="UTF-8") + const std::string& xml_version="1.0", const std::string& encoding="UTF-8") const { out << "\n"; @@ -683,20 +825,20 @@ struct XMLDoc : public XMLNode } /// write XML stream with formating - std::ostream& write_formating(std::ostream& out) + std::ostream& write_formating(std::ostream& out) const { return write(out, FORMAT_PRETTY); } void write(const std::string& path, WRITE_MODE mode=FORMAT_SMART, - const std::string& xml_version="1.0", const std::string& encoding="UTF-8") + const std::string& xml_version="1.0", const std::string& encoding="UTF-8") const { std::ofstream out(path.c_str()); write(out, mode, xml_version, encoding); } - void write_formating(const std::string& path) + void write_formating(const std::string& path) const { std::ofstream out(path.c_str()); From a24291f78a94fc038248fc453471a6810cc6b777 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sun, 28 Mar 2004 12:03:25 +0000 Subject: [PATCH 0667/1463] - Fixed a minor bug in IopLoadServiceModule that caused crashes for disabled drivers. svn path=/trunk/; revision=8899 --- reactos/ntoskrnl/io/driver.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/io/driver.c b/reactos/ntoskrnl/io/driver.c index 0b88897b97b..b48d2519b16 100644 --- a/reactos/ntoskrnl/io/driver.c +++ b/reactos/ntoskrnl/io/driver.c @@ -1,4 +1,4 @@ -/* $Id: driver.c,v 1.40 2004/03/28 09:48:13 navaraf Exp $ +/* $Id: driver.c,v 1.41 2004/03/28 12:03:25 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -370,6 +370,8 @@ IopLoadServiceModule( UNICODE_STRING ServiceImagePath; NTSTATUS Status; + DPRINT("IopLoadServiceModule(%wZ, %x)\n", ServiceName, ModuleObject); + /* * Get information about the service. */ @@ -417,6 +419,8 @@ IopLoadServiceModule( if (*ModuleObject == NULL) { + Status = STATUS_UNSUCCESSFUL; + /* * Special case for boot modules that were loaded by boot loader. */ @@ -429,8 +433,6 @@ IopLoadServiceModule( PLOADER_MODULE KeLoaderModules = (PLOADER_MODULE)KeLoaderBlock.ModsAddr; - Status = STATUS_UNSUCCESSFUL; - /* * FIXME: * Improve this searching algorithm by using the image name @@ -444,6 +446,8 @@ IopLoadServiceModule( ModuleName = (PCHAR)KeLoaderModules[i].String; if (!strcmp(ModuleName, SearchName)) { + DPRINT("Initializing boot module\n"); + /* Tell, that the module is already loaded */ KeLoaderModules[i].Reserved = 1; From fa00201ce1197a3e6ba065d7bc09a5c7f044650e Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sun, 28 Mar 2004 12:19:07 +0000 Subject: [PATCH 0668/1463] basic implementation of WlxLoggedOutSAS() svn path=/trunk/; revision=8900 --- reactos/lib/msgina/msgina.c | 80 ++++++++++++++++++++++++++++++++++++- reactos/lib/msgina/stubs.c | 21 +--------- 2 files changed, 80 insertions(+), 21 deletions(-) diff --git a/reactos/lib/msgina/msgina.c b/reactos/lib/msgina/msgina.c index 61fdab00692..d6d81915402 100644 --- a/reactos/lib/msgina/msgina.c +++ b/reactos/lib/msgina/msgina.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: msgina.c,v 1.8 2004/03/27 23:24:51 weiden Exp $ +/* $Id: msgina.c,v 1.9 2004/03/28 12:19:07 weiden Exp $ * * PROJECT: ReactOS msgina.dll * FILE: lib/msgina/msgina.c @@ -459,6 +459,84 @@ WlxDisplaySASNotice( } +static PWSTR +DuplicationString(PWSTR Str) +{ + DWORD cb; + PWSTR NewStr; + + cb = (wcslen(Str) + 1) * sizeof(WCHAR); + if((NewStr = LocalAlloc(LMEM_FIXED, cb))) + { + memcpy(NewStr, Str, cb); + } + return NewStr; +} + + +/* + * @unimplemented + */ +int WINAPI +WlxLoggedOutSAS( + PVOID pWlxContext, + DWORD dwSasType, + PLUID pAuthenticationId, + PSID pLogonSid, + PDWORD pdwOptions, + PHANDLE phToken, + PWLX_MPR_NOTIFY_INFO pNprNotifyInfo, + PVOID *pProfile) +{ + PGINA_CONTEXT pgContext = (PGINA_CONTEXT)pWlxContext; + TOKEN_STATISTICS Stats; + DWORD cbStats; + + if(!phToken) + { + DbgPrint("msgina: phToken == NULL!\n"); + return WLX_SAS_ACTION_NONE; + } + + if(!LogonUser(L"Administrator", NULL, L"Secrect", + LOGON32_LOGON_INTERACTIVE, /* FIXME - use LOGON32_LOGON_UNLOCK instead! */ + LOGON32_PROVIDER_DEFAULT, + phToken)) + { + DbgPrint("msgina: Logonuser() failed\n"); + return WLX_SAS_ACTION_NONE; + } + + if(!(*phToken)) + { + DbgPrint("msgina: *phToken == NULL!\n"); + return WLX_SAS_ACTION_NONE; + } + + pgContext->UserToken =*phToken; + + *pdwOptions = 0; + *pProfile =NULL; + + if(!GetTokenInformation(*phToken, + TokenStatistics, + (PVOID)&Stats, + sizeof(TOKEN_STATISTICS), + &cbStats)) + { + DbgPrint("msgina: Couldn't get Autentication id from user token!\n"); + return WLX_SAS_ACTION_NONE; + } + *pAuthenticationId = Stats.AuthenticationId; + pNprNotifyInfo->pszUserName = DuplicationString(L"Administrator"); + pNprNotifyInfo->pszDomain = NULL; + pNprNotifyInfo->pszPassword = DuplicationString(L"Secret"); + pNprNotifyInfo->pszOldPassword = NULL; + + return WLX_SAS_ACTION_LOGON; +} + + BOOL STDCALL DllMain( HINSTANCE hinstDLL, diff --git a/reactos/lib/msgina/stubs.c b/reactos/lib/msgina/stubs.c index e14df0d1161..8a2106837c8 100644 --- a/reactos/lib/msgina/stubs.c +++ b/reactos/lib/msgina/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.6 2004/03/27 23:24:51 weiden Exp $ +/* $Id: stubs.c,v 1.7 2004/03/28 12:19:07 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS msgina.dll @@ -74,25 +74,6 @@ WlxIsLogoffOk( } -/* - * @unimplemented - */ -int WINAPI -WlxLoggedOutSAS( - PVOID pWlxContext, - DWORD dwSasType, - PLUID pAuthenticationId, - PSID pLogonSid, - PDWORD pdwOptions, - PHANDLE phToken, - PWLX_MPR_NOTIFY_INFO pNprNotifyInfo, - PVOID *pProfile) -{ - UNIMPLEMENTED; - return 0; -} - - /* * @unimplemented */ From 86d212c2443f25314619de213514eee3feb839bb Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sun, 28 Mar 2004 12:21:41 +0000 Subject: [PATCH 0669/1463] added basic sas window, some other modifications svn path=/trunk/; revision=8901 --- reactos/subsys/system/winlogon/makefile | 6 +- reactos/subsys/system/winlogon/sas.c | 167 ++++++++ reactos/subsys/system/winlogon/winlogon.c | 449 +++++++++++++--------- reactos/subsys/system/winlogon/winlogon.h | 80 +++- reactos/subsys/system/winlogon/wlx.c | 141 +++++-- 5 files changed, 617 insertions(+), 226 deletions(-) create mode 100644 reactos/subsys/system/winlogon/sas.c diff --git a/reactos/subsys/system/winlogon/makefile b/reactos/subsys/system/winlogon/makefile index 23cde0a4994..54cc7098998 100644 --- a/reactos/subsys/system/winlogon/makefile +++ b/reactos/subsys/system/winlogon/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.9 2004/03/20 15:58:16 ekohl Exp $ +# $Id: makefile,v 1.10 2004/03/28 12:21:41 weiden Exp $ PATH_TO_TOP = ../../.. @@ -12,9 +12,9 @@ TARGET_INSTALLDIR = system32 TARGET_SDKLIBS = ntdll.a kernel32.a user32.a advapi32.a userenv.a secur32.a -TARGET_OBJECTS = setup.o winlogon.o wlx.o +TARGET_OBJECTS = setup.o winlogon.o wlx.o sas.o -TARGET_CFLAGS = -Wall -Werror -DUNICODE -I./ -I../../../include +TARGET_CFLAGS = -Wall -Werror -DUNICODE -D_UNICODE -I./ -I../../../include include $(PATH_TO_TOP)/rules.mak diff --git a/reactos/subsys/system/winlogon/sas.c b/reactos/subsys/system/winlogon/sas.c new file mode 100644 index 00000000000..739baaf39b1 --- /dev/null +++ b/reactos/subsys/system/winlogon/sas.c @@ -0,0 +1,167 @@ +/* $Id: sas.c,v 1.1 2004/03/28 12:21:41 weiden Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: services/winlogon/sas.c + * PURPOSE: Secure Attention Sequence + * PROGRAMMER: Thomas Weidenmueller (w3seek@users.sourceforge.net) + * UPDATE HISTORY: + * Created 28/03/2004 + */ + +#define NTOS_MODE_USER +#include +#include +#include +#include +#include +#include + +#include "setup.h" +#include "winlogon.h" +#include "resource.h" + +#define SAS_CLASS L"SAS window class" +#define HK_CTRL_ALT_DEL 0 +#define HK_CTRL_SHIFT_ESC 1 + +void +DispatchSAS(PWLSESSION Session, DWORD dwSasType) +{ + Session->SASAction = dwSasType; + +} + +void +UninitSAS(PWLSESSION Session) +{ + if(Session->SASWindow) + { + DestroyWindow(Session->SASWindow); + Session->SASWindow = NULL; + } +} + +BOOL +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"); + return FALSE; + } + + /* Register Ctrl+Shift+Esc */ + 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"); + } + return TRUE; +} + +BOOL +DestroySAS(PWLSESSION Session, HWND hwndSAS) +{ + /* Unregister hotkeys */ + + UnregisterHotKey(hwndSAS, HK_CTRL_ALT_DEL); + + if(Session->TaskManHotkey) + { + UnregisterHotKey(hwndSAS, HK_CTRL_SHIFT_ESC); + } + + return TRUE; +} + +LRESULT CALLBACK +SASProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + PWLSESSION Session = (PWLSESSION)GetWindowLong(hwnd, GWL_USERDATA); + if(!Session) + { + return DefWindowProc(hwnd, uMsg, wParam, lParam); + } + switch(uMsg) + { + case WM_HOTKEY: + { + switch(wParam) + { + case HK_CTRL_ALT_DEL: + DbgPrint("SAS: CTR+ALT+DEL\n"); + break; + case HK_CTRL_SHIFT_ESC: + DbgPrint("SAS: CTR+SHIFT+ESC\n"); + break; + } + return 0; + } + case WM_CREATE: + { + if(!SetupSAS(Session, hwnd)) + { + /* Fail! */ + return 1; + } + return 0; + } + case WM_DESTROY: + { + DestroySAS(Session, hwnd); + return 0; + } + } + return DefWindowProc(hwnd, uMsg, wParam, lParam); +} + +BOOL +InitializeSAS(PWLSESSION Session) +{ + WNDCLASSEX swc; + + /* register SAS window class. + WARNING! MAKE SURE WE ARE IN THE WINLOGON DESKTOP! */ + swc.cbSize = sizeof(WNDCLASSEXW); + swc.style = CS_SAVEBITS; + swc.lpfnWndProc = SASProc; + swc.cbClsExtra = 0; + swc.cbWndExtra = 0; + swc.hInstance = hAppInstance; + swc.hIcon = NULL; + swc.hCursor = NULL; + swc.hbrBackground = NULL; + swc.lpszMenuName = NULL; + swc.lpszClassName = SAS_CLASS; + swc.hIconSm = NULL; + RegisterClassEx(&swc); + + /* create invisible SAS window */ + Session->SASWindow = CreateWindowEx(0, SAS_CLASS, L"SAS", WS_OVERLAPPEDWINDOW, + 0, 0, 0, 0, 0, 0, hAppInstance, NULL); + if(!Session->SASWindow) + { + DbgPrint("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)) + { + UninitSAS(Session); + DbgPrint("WL: Failed to register SAS window\n"); + return FALSE; + } + #endif + + return TRUE; +} + diff --git a/reactos/subsys/system/winlogon/winlogon.c b/reactos/subsys/system/winlogon/winlogon.c index 338f25bab75..7365f34609e 100644 --- a/reactos/subsys/system/winlogon/winlogon.c +++ b/reactos/subsys/system/winlogon/winlogon.c @@ -1,4 +1,4 @@ -/* $Id: winlogon.c,v 1.28 2004/03/20 15:58:16 ekohl Exp $ +/* $Id: winlogon.c,v 1.29 2004/03/28 12:21:41 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -33,16 +33,17 @@ BOOL LoadGina(PMSGINAFUNCTIONS Functions, DWORD *DllVersion); +PWLSESSION +MsGinaInit(void); +void +SessionLoop(PWLSESSION Session); BOOL -MsGinaInit(DWORD Version); +InitServices(void); +BOOL +WlxCreateWindowStationAndDesktops(PWLSESSION Session); HINSTANCE hAppInstance; -HWINSTA InteractiveWindowStation; /* WinSta0 */ -HDESK ApplicationDesktop; /* WinSta0\Default */ -HDESK WinlogonDesktop; /* WinSta0\Winlogon */ -HDESK ScreenSaverDesktop; /* WinSta0\Screen-Saver */ - -MSGINAFUNCTIONS MsGinaFunctions; +PWLSESSION WLSession = NULL; #if SUPPORT_CONSOLESTART BOOL StartConsole = TRUE; @@ -475,151 +476,10 @@ WinMain(HINSTANCE hInstance, LSA_OPERATIONAL_MODE Mode; ULONG AuthenticationPackage; #endif - DWORD GinaDllVersion; - HANDLE hShutdownEvent; - WCHAR StatusMsg[256]; - BOOL Success; NTSTATUS Status; hAppInstance = hInstance; - /* - * FIXME: Create a security descriptor with - * one ACE containing the Winlogon SID - */ - - /* - * Create the interactive window station - */ - InteractiveWindowStation = - CreateWindowStation(L"WinSta0", 0, GENERIC_ALL, NULL); - if (InteractiveWindowStation == NULL) - { - DbgPrint("WL: Failed to create window station (0x%X)\n", GetLastError()); - NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, 0, 0, 0); - ExitProcess(1); - } - - /* - * Set the process window station - */ - SetProcessWindowStation(InteractiveWindowStation); - - /* - * Create the application desktop - */ - ApplicationDesktop = - CreateDesktop(L"Default", - NULL, - NULL, - 0, /* FIXME: Set some flags */ - GENERIC_ALL, - NULL); - - /* - * Create the winlogon desktop - */ - WinlogonDesktop = CreateDesktop(L"Winlogon", - NULL, - NULL, - 0, /* FIXME: Set some flags */ - GENERIC_ALL, - NULL); - - /* - * Create the screen saver desktop - */ - ScreenSaverDesktop = CreateDesktop(L"Screen-Saver", - NULL, - NULL, - 0, /* FIXME: Set some flags */ - GENERIC_ALL, - NULL); - - /* - * Switch to winlogon desktop - */ - /* FIXME: Do start up in the application desktop for now. */ - Status = NtSetInformationProcess(NtCurrentProcess(), - ProcessDesktop, - &ApplicationDesktop, - sizeof(ApplicationDesktop)); - if (!NT_SUCCESS(Status)) - { - DbgPrint("WL: Cannot set default desktop for winlogon.\n"); - } - SetThreadDesktop(ApplicationDesktop); - Success = SwitchDesktop(ApplicationDesktop); - if (!Success) - { - DbgPrint("WL: Cannot switch to Winlogon desktop (0x%X)\n", GetLastError()); - } - - /* Check for pending setup */ - if (GetSetupType () != 0) - { - DPRINT ("Winlogon: CheckForSetup() in setup mode\n"); - - /* Run setup and reboot when done */ - RunSetup (); - - NtShutdownSystem (ShutdownReboot); - ExitProcess (0); - return 0; - } - -#if SUPPORT_CONSOLESTART - StartConsole = !StartIntoGUI(); - if(!StartConsole) - { -#endif - if(!LoadGina(&MsGinaFunctions, &GinaDllVersion)) - { - NtShutdownSystem(ShutdownReboot); - ExitProcess(0); - return(0); - } - - /* FIXME - better solution needed */ - hShutdownEvent = CreateEvent(NULL, - TRUE, - FALSE, - L"WinLogonShutdown"); - - if(!hShutdownEvent) - { - DbgPrint("WL: Failed to create WinLogonShutdown event!\n"); - NtShutdownSystem(ShutdownNoReboot); - ExitProcess(0); - return(0); - } - - if(!MsGinaInit(GinaDllVersion) || !MsGinaInst) - { - DbgPrint("WL: Failed to initialize winlogon!\n"); - NtShutdownSystem(ShutdownNoReboot); - ExitProcess(0); - return(0); - } - - LoadString(hAppInstance, IDS_REACTOSISSTARTINGUP, StatusMsg, 256 * sizeof(WCHAR)); - MsGinaInst->Functions->WlxDisplayStatusMessage(MsGinaInst->Context, - ApplicationDesktop, - 0, - NULL, - StatusMsg); -#if SUPPORT_CONSOLESTART - } -#endif - - /* start system processes (services.exe & lsass.exe) */ - if (StartProcess(L"StartServices")) - { - if (!StartServices()) - { - DbgPrint("WL: Failed to start Services (0x%X)\n", GetLastError()); - } - } #if START_LSASS if (StartProcess(L"StartLsass")) { @@ -629,6 +489,80 @@ WinMain(HINSTANCE hInstance, } } #endif + + if(!(WLSession = MsGinaInit())) + { + DbgPrint("WL: Failed to initialize msgina.dll\n"); + NtShutdownSystem(ShutdownNoReboot); + ExitProcess(0); + return 0; + } + + WLSession->LogonStatus = LOGON_INITIALIZING; +#if START_LSASS + if(!RegisterLogonProcess(GetCurrentProcessId(), TRUE)) + { + DbgPrint("WL: Could not register logon process\n"); + NtShutdownSystem(ShutdownNoReboot); + ExitProcess(0); + return 0; + } +#endif + + if(!WlxCreateWindowStationAndDesktops(WLSession)) + { + NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, 0, 0, 0); + ExitProcess(1); + return 1; + } + + /* + * Switch to winlogon desktop + */ + /* FIXME: Do start up in the application desktop for now. */ + Status = NtSetInformationProcess(NtCurrentProcess(), + ProcessDesktop, + &WLSession->ApplicationDesktop, + sizeof(HDESK)); + if(!NT_SUCCESS(Status)) + { + DbgPrint("WL: Cannot set default desktop for winlogon.\n"); + } + SetThreadDesktop(WLSession->ApplicationDesktop); + if(!SwitchDesktop(WLSession->ApplicationDesktop)) + { + DbgPrint("WL: Cannot switch to Winlogon desktop (0x%X)\n", GetLastError()); + } + + /* Check for pending setup */ + if (GetSetupType () != 0) + { + DPRINT ("Winlogon: CheckForSetup() in setup mode\n"); + + /* Run setup and reboot when done */ + RunSetup(); + + NtShutdownSystem(ShutdownReboot); + ExitProcess(0); + return 0; + } + +#if SUPPORT_CONSOLESTART + StartConsole = !StartIntoGUI(); + if(!StartConsole) + { +#endif + if(!InitializeSAS(WLSession)) + { + DbgPrint("WL: Failed to initialize SAS\n"); + ExitProcess(2); + return 2; + } +#if SUPPORT_CONSOLESTART + } +#endif + + InitServices(); #if 0 /* real winlogon uses "Winlogon" */ @@ -722,7 +656,188 @@ WinMain(HINSTANCE hInstance, else { #endif + + SessionLoop(WLSession); + + /* FIXME - Flush disks and registry, ... */ + + if(WLSession->LogonStatus == LOGON_SHUTDOWN) + { + /* FIXME - only show this dialog if it's a shutdown and the computer doesn't support APM */ + switch(DialogBox(hInstance, MAKEINTRESOURCE(IDD_SHUTDOWNCOMPUTER), 0, ShutdownComputerProc)) + { + case IDC_BTNSHTDOWNCOMPUTER: + NtShutdownSystem(ShutdownReboot); + break; + default: + NtShutdownSystem(ShutdownNoReboot); + break; + } + ExitProcess(0); + } + else + { + DbgPrint("WL: LogonStatus != LOGON_SHUTDOWN!!!\n"); + ExitProcess(0); + } +#if SUPPORT_CONSOLESTART + } +#endif + + return 0; +} +BOOL +DisplayStatusMessage(PWLSESSION Session, HDESK hDesktop, DWORD dwOptions, PWSTR pTitle, PWSTR pMessage) +{ + if(Session->SuppressStatus) + { + return TRUE; + } + + #if SUPPORT_CONSOLESTART + if(StartConsole) + { + if(pMessage) + { + DbgPrint("WL-Status: %ws\n", pMessage); + } + return TRUE; + } + #endif + + return Session->MsGina.Functions.WlxDisplayStatusMessage(Session->MsGina.Context, hDesktop, dwOptions, pTitle, pMessage); +} + +BOOL +InitServices(void) +{ + WCHAR StatusMsg[256]; + + LoadString(hAppInstance, IDS_REACTOSISSTARTINGUP, StatusMsg, 256 * sizeof(WCHAR)); + DisplayStatusMessage(WLSession, WLSession->ApplicationDesktop, 0, NULL, StatusMsg); + + /* start system processes (services.exe & lsass.exe) */ + if(StartProcess(L"StartServices")) + { + if(!StartServices()) + { + DbgPrint("WL: Failed to start Services (0x%X)\n", GetLastError()); + } + } + + return TRUE; +} + +DWORD +DoLogin(PWLSESSION Session) +{ + DWORD WlxAction, Options; + WLX_MPR_NOTIFY_INFO MprNotifyInfo; + PWLX_PROFILE_V2_0 Profile; + PSID LogonSid; + HANDLE Token; + + /* FIXME - Create a Logon Sid + if(!(LogonSid = CreateUserLogonSid(NULL))) + { + return WLX_SAS_ACTION_NONE; + } + */ + + Options = 0; + WlxAction = Session->MsGina.Functions.WlxLoggedOutSAS(Session->MsGina.Context, + Session->SASAction, + &Session->LogonId, + LogonSid, + &Options, + &Token, + &MprNotifyInfo, + (PVOID*)&Profile); + + return WlxAction; +} + +void +SessionLoop(PWLSESSION Session) +{ + //WCHAR StatusMsg[256]; + // HANDLE hShutdownEvent; + DWORD WlxAction; + MSG Msg; + + WlxAction = WLX_SAS_ACTION_NONE; + Session->LogonStatus = LOGON_NONE; + while(WlxAction == WLX_SAS_ACTION_NONE) + { + RemoveStatusMessage(Session); + if(Session->LogonStatus == LOGON_NONE) + { + Session->LogonStatus = LOGON_SHOWINGLOGON; + /* we're ready to display a logon window, + don't timeout dialogboxes here */ + WlxSetTimeout(Session->MsGina.Context, 0); + Session->SuppressStatus = TRUE; + /* tell msgina to show a window telling the user one can logon */ + #if SUPPORT_CONSOLESTART + if(!StartConsole) + #endif + DisplaySASNotice(Session); + Session->SuppressStatus = FALSE; + + if(Session->SASAction == WLX_SAS_ACTION_LOGOFF) + { + /* the system wants to log off here */ + Session->LogonStatus = LOGON_SHUTDOWN; + break; + } + } + + WlxAction = DoLogin(Session); + if(WlxAction == WLX_SAS_ACTION_LOGOFF) + { + /* the user doesn't want to login, instead pressed cancel + we should display the window again so one can logon again */ + /* FIXME - disconnect any connections in case we did a remote logon */ + DbgPrint("WL: DoLogin failed\n"); + WlxAction = WLX_SAS_ACTION_NONE; + } + if(WlxAction == WLX_SAS_ACTION_NONE) + { + if(Session->SASAction == WLX_SAS_ACTION_LOGOFF) + { + /* system is about to shut down, leave the main loop */ + Session->LogonStatus = LOGON_SHUTDOWN; + break; + } + Session->LogonStatus = LOGON_NONE; + continue; + } + + /* FIXME - don't leave the loop when suspending the computer */ + if(WLX_SUSPENDING(WlxAction)) + { + Session->LogonStatus = LOGON_NONE; + WlxAction = WLX_SAS_ACTION_NONE; + /* don't leave the loop */ + continue; + } + + if(WLX_SHUTTINGDOWN(WlxAction)) + { + Session->LogonStatus = LOGON_SHUTDOWN; + /* leave the loop here */ + break; + } + + /* Message loop for the SAS window */ + while(GetMessage(&Msg, 0, 0, 0)) + { + TranslateMessage(&Msg); + DispatchMessage(&Msg); + } + } + /* LoadString(hAppInstance, IDS_PREPARENETWORKCONNECTIONS, StatusMsg, 256 * sizeof(WCHAR)); MsGinaInst->Functions->WlxDisplayStatusMessage(MsGinaInst->Context, ApplicationDesktop, @@ -730,7 +845,7 @@ WinMain(HINSTANCE hInstance, NULL, StatusMsg); - /* FIXME */ + Sleep(150); LoadString(hAppInstance, IDS_APPLYINGCOMPUTERSETTINGS, StatusMsg, 256 * sizeof(WCHAR)); @@ -740,14 +855,14 @@ WinMain(HINSTANCE hInstance, NULL, StatusMsg); - /* FIXME */ + Sleep(150); MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context); MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context); MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context); - /* FIXME - call WlxLoggedOutSAS() to display the login dialog */ + Sleep(250); LoadString(hAppInstance, IDS_LOADINGYOURPERSONALSETTINGS, StatusMsg, 256 * sizeof(WCHAR)); @@ -756,8 +871,7 @@ WinMain(HINSTANCE hInstance, 0, NULL, StatusMsg); - - /* FIXME */ + Sleep(150); LoadString(hAppInstance, IDS_APPLYINGYOURPERSONALSETTINGS, StatusMsg, 256 * sizeof(WCHAR)); @@ -767,7 +881,7 @@ WinMain(HINSTANCE hInstance, NULL, StatusMsg); - /* FIXME */ + Sleep(150); MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context); @@ -794,7 +908,7 @@ WinMain(HINSTANCE hInstance, NULL, StatusMsg); - /* FIXME */ + Sleep(150); MsGinaInst->Functions->WlxShutdown(MsGinaInst->Context, WLX_SAS_ACTION_SHUTDOWN); @@ -806,28 +920,11 @@ WinMain(HINSTANCE hInstance, NULL, StatusMsg); - /* FIXME */ + Sleep(250); MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context); MsGinaInst->Functions->WlxRemoveStatusMessage(MsGinaInst->Context); - - /* FIXME - Flush disks and registry, ... */ - - /* FIXME - only show this dialog if it's a shutdown and the computer doesn't support APM */ - switch(DialogBox(hInstance, MAKEINTRESOURCE(IDD_SHUTDOWNCOMPUTER), 0, ShutdownComputerProc)) - { - case IDC_BTNSHTDOWNCOMPUTER: - NtShutdownSystem(ShutdownReboot); - break; - default: - NtShutdownSystem(ShutdownNoReboot); - break; - } - ExitProcess(0); -#if SUPPORT_CONSOLESTART - } -#endif - - return 0; + */ } + diff --git a/reactos/subsys/system/winlogon/winlogon.h b/reactos/subsys/system/winlogon/winlogon.h index 3df60f3b411..be205c49a5c 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.2 2003/12/07 00:04:20 weiden Exp $ +/* $Id: winlogon.h,v 1.3 2004/03/28 12:21:41 weiden Exp $ * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS winlogon * FILE: subsys/system/winlogon/winlogon.h @@ -29,6 +29,34 @@ #include +VOID WINAPI WlxUseCtrlAltDel(HANDLE hWlx); +VOID WINAPI WlxSetContextPointer(HANDLE hWlx, PVOID pWlxContext); +VOID WINAPI WlxSasNotify(HANDLE hWlx, DWORD dwSasType); +BOOL WINAPI WlxSetTimeout(HANDLE hWlx, DWORD Timeout); +int WINAPI WlxAssignShellProtection(HANDLE hWlx, HANDLE hToken, HANDLE hProcess, HANDLE hThread); +int WINAPI WlxMessageBox(HANDLE hWlx, HWND hwndOwner, LPWSTR lpszText, LPWSTR lpszTitle, UINT fuStyle); +int WINAPI WlxDialogBox(HANDLE hWlx, HANDLE hInst, LPWSTR lpszTemplate, HWND hwndOwner, DLGPROC dlgprc); +int WINAPI WlxDialogBoxParam(HANDLE hWlx, HANDLE hInst, LPWSTR lpszTemplate, HWND hwndOwner, DLGPROC dlgprc, LPARAM dwInitParam); +int WINAPI WlxDialogBoxIndirect(HANDLE hWlx, HANDLE hInst, LPCDLGTEMPLATE hDialogTemplate, HWND hwndOwner, DLGPROC dlgprc); +int WINAPI WlxDialogBoxIndirectParam(HANDLE hWlx, HANDLE hInst, LPCDLGTEMPLATE hDialogTemplate, HWND hwndOwner, DLGPROC dlgprc, LPARAM dwInitParam); +int WINAPI WlxSwitchDesktopToUser(HANDLE hWlx); +int WINAPI WlxSwitchDesktopToWinlogon(HANDLE hWlx); +int WINAPI WlxChangePasswordNotify(HANDLE hWlx, PWLX_MPR_NOTIFY_INFO pMprInfo, DWORD dwChangeInfo); +BOOL WINAPI WlxGetSourceDesktop(HANDLE hWlx, PWLX_DESKTOP* ppDesktop); +BOOL WINAPI WlxSetReturnDesktop(HANDLE hWlx, PWLX_DESKTOP pDesktop); +BOOL WINAPI WlxCreateUserDesktop(HANDLE hWlx, HANDLE hToken, DWORD Flags, PWSTR pszDesktopName, PWLX_DESKTOP* ppDesktop); +int WINAPI WlxChangePasswordNotifyEx(HANDLE hWlx, PWLX_MPR_NOTIFY_INFO pMprInfo, DWORD dwChangeInfo, PWSTR ProviderName, PVOID Reserved); +BOOL WINAPI WlxCloseUserDesktop(HANDLE hWlx, PWLX_DESKTOP pDesktop, HANDLE hToken); +BOOL WINAPI WlxSetOption(HANDLE hWlx, DWORD Option, ULONG_PTR Value, ULONG_PTR* OldValue); +BOOL WINAPI WlxGetOption(HANDLE hWlx, DWORD Option, ULONG_PTR* Value); +VOID WINAPI WlxWin31Migrate(HANDLE hWlx); +BOOL WINAPI WlxQueryClientCredentials(PWLX_CLIENT_CREDENTIALS_INFO_V1_0 pCred); +BOOL WINAPI WlxQueryInetConnectorCredentials(PWLX_CLIENT_CREDENTIALS_INFO_V1_0 pCred); +DWORD WINAPI WlxQueryConsoleSwitchCredentials(PWLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0 pCred); +BOOL WINAPI WlxQueryTsLogonCredentials(PWLX_CLIENT_CREDENTIALS_INFO_V2_0 pCred); +BOOL WINAPI WlxDisconnect(void); +DWORD WINAPI WlxQueryTerminalServicesData(HANDLE hWlx, PWLX_TERMINAL_SERVICES_DATA pTSData, WCHAR* UserName, WCHAR* Domain); + typedef BOOL (WINAPI * PFWLXNEGOTIATE) (DWORD, DWORD *); typedef BOOL (WINAPI * PFWLXINITIALIZE) (LPWSTR, HANDLE, PVOID, PVOID, PVOID *); typedef VOID (WINAPI * PFWLXDISPLAYSASNOTICE) (PVOID); @@ -83,20 +111,56 @@ typedef struct _MSGINAFUNCTIONS typedef struct _MSGINAINSTANCE { HANDLE hDllInstance; - PMSGINAFUNCTIONS Functions; + MSGINAFUNCTIONS Functions; PVOID Context; DWORD Version; } MSGINAINSTANCE, *PMSGINAINSTANCE; +typedef struct _WLSESSION +{ + MSGINAINSTANCE MsGina; + DWORD SASAction; + DWORD LogonStatus; + BOOL SuppressStatus; + BOOL TaskManHotkey; + HWND SASWindow; + HWINSTA InteractiveWindowStation; + HDESK ApplicationDesktop; + HDESK WinlogonDesktop; + HDESK ScreenSaverDesktop; + LUID LogonId; +} WLSESSION, *PWLSESSION; + extern HINSTANCE hAppInstance; -extern PMSGINAINSTANCE MsGinaInst; -extern HWINSTA InteractiveWindowStation; /* WinSta0 */ -extern HDESK ApplicationDesktop; /* WinSta0\Default */ -extern HDESK WinlogonDesktop; /* WinSta0\Winlogon */ -extern HDESK ScreenSaverDesktop; /* WinSta0\Screen-Saver */ +extern PWLSESSION WLSession; -extern MSGINAFUNCTIONS MsGinaFunctions; +BOOL +InitializeSAS(PWLSESSION Session); +void +DispatchSAS(PWLSESSION Session, DWORD dwSasType); +#define LOGON_INITIALIZING 1 +#define LOGON_NONE 2 +#define LOGON_SHOWINGLOGON 3 + +#define LOGON_SHUTDOWN 9 + +#define WLX_SHUTTINGDOWN(Status) \ + (((Status) == WLX_SAS_ACTION_SHUTDOWN) || \ + ((Status) == WLX_SAS_ACTION_SHUTDOWN_POWER_OFF) || \ + ((Status) == WLX_SAS_ACTION_SHUTDOWN_REBOOT) \ + ) + +#define WLX_SUSPENDING(Status) \ + (((Status) == WLX_SAS_ACTION_SHUTDOWN_SLEEP) || \ + ((Status) == WLX_SAS_ACTION_SHUTDOWN_SLEEP2) || \ + ((Status) == WLX_SAS_ACTION_SHUTDOWN_HIBERNATE) \ + ) + +#define RemoveStatusMessage(Session) \ + Session->MsGina.Functions.WlxRemoveStatusMessage(Session->MsGina.Context); +#define DisplaySASNotice(Session) \ + Session->MsGina.Functions.WlxDisplaySASNotice(Session->MsGina.Context); #endif /* __WINLOGON_MAIN_H__ */ diff --git a/reactos/subsys/system/winlogon/wlx.c b/reactos/subsys/system/winlogon/wlx.c index 47d4b099d5b..494bb7916d9 100644 --- a/reactos/subsys/system/winlogon/wlx.c +++ b/reactos/subsys/system/winlogon/wlx.c @@ -1,4 +1,4 @@ -/* $Id: wlx.c,v 1.3 2004/01/06 16:11:57 ekohl Exp $ +/* $Id: wlx.c,v 1.4 2004/03/28 12:21:41 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -26,21 +26,19 @@ #define Unimplemented DbgPrint("WL: %S() at %S:%i unimplemented!\n", __FUNCTION__, __FILE__, __LINE__) -PMSGINAINSTANCE MsGinaInst; - /* - * @unimplemented + * @implemented */ VOID WINAPI WlxUseCtrlAltDel( HANDLE hWlx ) { - Unimplemented; + WlxSetOption(hWlx, WLX_OPTION_USE_CTRL_ALT_DEL, TRUE, NULL); } /* - * @unimplemented + * @implemented */ VOID WINAPI WlxSetContextPointer( @@ -48,11 +46,11 @@ WlxSetContextPointer( PVOID pWlxContext ) { - Unimplemented; + WlxSetOption(hWlx, WLX_OPTION_CONTEXT_POINTER, (ULONG_PTR)pWlxContext, NULL); } /* - * @unimplemented + * @implemented */ VOID WINAPI WlxSasNotify( @@ -60,7 +58,7 @@ WlxSasNotify( DWORD dwSasType ) { - Unimplemented; + DispatchSAS((PWLSESSION)hWlx, dwSasType); } /* @@ -72,7 +70,7 @@ WlxSetTimeout( DWORD Timeout ) { - Unimplemented; + /* Unimplemented; */ return FALSE; } @@ -294,9 +292,9 @@ WlxSetOption( ULONG_PTR* OldValue ) { - PMSGINAINSTANCE Instance = (PMSGINAINSTANCE)hWlx; - Unimplemented; - if(Instance || !Value) + PWLSESSION Session = (PWLSESSION)hWlx; + + if(Session || !Value) { switch(Option) { @@ -304,8 +302,8 @@ WlxSetOption( return TRUE; case WLX_OPTION_CONTEXT_POINTER: { - *OldValue = (ULONG_PTR)Instance->Context; - Instance->Context = (PVOID)Value; + *OldValue = (ULONG_PTR)Session->MsGina.Context; + Session->MsGina.Context = (PVOID)Value; return TRUE; } case WLX_OPTION_USE_SMART_CARD: @@ -571,21 +569,19 @@ GinaLoadFailedProc( } BOOL -LoadGina(PMSGINAFUNCTIONS Functions, DWORD *DllVersion) +LoadGina(PMSGINAFUNCTIONS Functions, DWORD *DllVersion, HMODULE *GinaInstance) { HMODULE hGina; WCHAR GinaDll[MAX_PATH + 1]; - MsGinaInst = NULL; - GetMsGinaPath(GinaDll); - hGina = LoadLibrary(GinaDll); - if(!hGina) + if(!(hGina = LoadLibrary(GinaDll))) { DialogBoxParam(hAppInstance, MAKEINTRESOURCE(IDD_GINALOADFAILED), 0, GinaLoadFailedProc, (LPARAM)&GinaDll); return FALSE; } + *GinaInstance = hGina; Functions->WlxNegotiate = (PFWLXNEGOTIATE)GetProcAddress(hGina, "WlxNegotiate"); Functions->WlxInitialize = (PFWLXINITIALIZE)GetProcAddress(hGina, "WlxInitialize"); @@ -634,32 +630,99 @@ LoadGina(PMSGINAFUNCTIONS Functions, DWORD *DllVersion) return (Functions->WlxNegotiate != NULL) && (Functions->WlxInitialize != NULL); } -BOOL -MsGinaInit(DWORD Version) +PWLSESSION +MsGinaInit(void) { - PMSGINAINSTANCE Instance; + PWLSESSION WLSession; + DWORD GinaDllVersion; - Instance = (PMSGINAINSTANCE)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MSGINAINSTANCE)); - if(!Instance) + WLSession = (PWLSESSION)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WLSESSION)); + if(!WLSession) { - return 0; + return NULL; } - Instance->Functions = &MsGinaFunctions; - Instance->hDllInstance = NULL; /* FIXME */ - Instance->Context = NULL; - Instance->Version = Version; - - MsGinaInst = Instance; - - if(!Instance->Functions->WlxInitialize(InteractiveWindowStation, - (HANDLE)Instance, - NULL, - (PVOID)&FunctionTable, - &Instance->Context)) + if(!LoadGina(&WLSession->MsGina.Functions, &GinaDllVersion, &WLSession->MsGina.hDllInstance)) { - return 0; + HeapFree(GetProcessHeap(), 0, WLSession); + return NULL; } + + WLSession->MsGina.Context = NULL; + WLSession->MsGina.Version = GinaDllVersion; + WLSession->SuppressStatus = FALSE; + + if(!WLSession->MsGina.Functions.WlxInitialize(WLSession->InteractiveWindowStation, + (HANDLE)WLSession, + NULL, + (PVOID)&FunctionTable, + &WLSession->MsGina.Context)) + { + HeapFree(GetProcessHeap(), 0, WLSession); + return NULL; + } + return WLSession; +} + +BOOL +WlxCreateWindowStationAndDesktops(PWLSESSION Session) +{ + /* + * Create the interactive window station + */ + Session->InteractiveWindowStation = CreateWindowStation(L"WinSta0", 0, GENERIC_ALL, NULL); + if(!Session->InteractiveWindowStation) + { + DbgPrint("WL: Failed to create window station (0x%X)\n", GetLastError()); + return FALSE; + } + SetProcessWindowStation(Session->InteractiveWindowStation); + + /* + * Create the application desktop + */ + Session->ApplicationDesktop = CreateDesktop(L"Default", + NULL, + NULL, + 0, /* FIXME: Set some flags */ + GENERIC_ALL, + NULL); + if(!Session->ApplicationDesktop) + { + DbgPrint("WL: Failed to create Default desktop (0x%X)\n", GetLastError()); + return FALSE; + } + + /* + * Create the winlogon desktop + */ + Session->WinlogonDesktop = CreateDesktop(L"Winlogon", + NULL, + NULL, + 0, /* FIXME: Set some flags */ + GENERIC_ALL, + NULL); + if(!Session->WinlogonDesktop) + { + DbgPrint("WL: Failed to create Winlogon desktop (0x%X)\n", GetLastError()); + return FALSE; + } + + /* + * Create the screen saver desktop + */ + Session->ScreenSaverDesktop = CreateDesktop(L"Screen-Saver", + NULL, + NULL, + 0, /* FIXME: Set some flags */ + GENERIC_ALL, + NULL); + if(!Session->ScreenSaverDesktop) + { + DbgPrint("WL: Failed to create Screen-Saver desktop (0x%X)\n", GetLastError()); + return FALSE; + } + return TRUE; } From bdaa4495d0ad4003ad048e409f8657776da833be Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sun, 28 Mar 2004 14:55:18 +0000 Subject: [PATCH 0670/1463] more configuration options: - show/hide clock - disable automatic notification icon hiding svn path=/trunk/; revision=8902 --- .../system/explorer/dialogs/settings.cpp | 29 ++- .../subsys/system/explorer/dialogs/settings.h | 3 + .../system/explorer/explorer-cfg-template.xml | 3 +- reactos/subsys/system/explorer/explorer.cpp | 21 +++ reactos/subsys/system/explorer/explorer.h | 1 + .../subsys/system/explorer/explorer_intres.h | 4 +- .../subsys/system/explorer/explorer_intres.rc | 13 +- reactos/subsys/system/explorer/globals.h | 4 + .../system/explorer/taskbar/desktopbar.cpp | 4 + .../system/explorer/taskbar/quicklaunch.h | 2 +- .../system/explorer/taskbar/traynotify.cpp | 166 +++++++++++------- .../system/explorer/taskbar/traynotify.h | 7 +- .../system/explorer/utility/xmlstorage.h | 136 ++++++++++---- 13 files changed, 281 insertions(+), 112 deletions(-) diff --git a/reactos/subsys/system/explorer/dialogs/settings.cpp b/reactos/subsys/system/explorer/dialogs/settings.cpp index 0a6eddd37ec..1d6f80179e0 100644 --- a/reactos/subsys/system/explorer/dialogs/settings.cpp +++ b/reactos/subsys/system/explorer/dialogs/settings.cpp @@ -145,8 +145,11 @@ int DesktopSettingsDlg::Command(int id, int code) TaskbarSettingsDlg::TaskbarSettingsDlg(HWND hwnd) - : super(hwnd) + : super(hwnd), + _cfg_org(g_Globals._cfg) { + CheckDlgButton(hwnd, ID_SHOW_CLOCK, XMLBool(g_Globals.get_cfg("desktopbar"), "options", "show-clock", true)? BST_CHECKED: BST_UNCHECKED); + CheckDlgButton(hwnd, ID_HIDE_INACTIVE_ICONS, XMLBool(g_Globals.get_cfg("notify-icons"), "options", "hide-inactive", true)? BST_CHECKED: BST_UNCHECKED); } int TaskbarSettingsDlg::Command(int id, int code) @@ -154,10 +157,30 @@ int TaskbarSettingsDlg::Command(int id, int code) switch(id) { case ID_CONFIG_NOTIFYAREA: Dialog::DoModal(IDD_NOTIFYAREA, WINDOW_CREATOR(TrayNotifyDlg), _hwnd); - return 0; + break; + + case ID_SHOW_CLOCK: + XMLBoolRef(g_Globals.get_cfg("desktopbar"), "options", "show-clock", true).toggle(); + SendMessage(g_Globals._hwndDesktopBar, PM_REFRESH_CONFIG, 0, 0); + PropSheet_Changed(GetParent(_hwnd), _hwnd); + break; + + case ID_HIDE_INACTIVE_ICONS: + XMLBoolRef(g_Globals.get_cfg("notify-icons"), "options", "hide-inactive", true).toggle(); + SendMessage(g_Globals._hwndDesktopBar, PM_REFRESH_CONFIG, 0, 0); + PropSheet_Changed(GetParent(_hwnd), _hwnd); + break; + + case PSN_RESET: + g_Globals._cfg = _cfg_org; + SendMessage(g_Globals._hwndDesktopBar, PM_REFRESH_CONFIG, 0, 0); + break; + + default: + return 1; } - return 1; + return 0; } diff --git a/reactos/subsys/system/explorer/dialogs/settings.h b/reactos/subsys/system/explorer/dialogs/settings.h index 88bcd4e4567..e555194fd4f 100644 --- a/reactos/subsys/system/explorer/dialogs/settings.h +++ b/reactos/subsys/system/explorer/dialogs/settings.h @@ -67,6 +67,9 @@ struct TaskbarSettingsDlg : public PropSheetPageDlg TaskbarSettingsDlg(HWND hwnd); virtual int Command(int id, int code); + +protected: + XMLDoc _cfg_org; }; diff --git a/reactos/subsys/system/explorer/explorer-cfg-template.xml b/reactos/subsys/system/explorer/explorer-cfg-template.xml index 98feb73007b..82a29c14976 100644 --- a/reactos/subsys/system/explorer/explorer-cfg-template.xml +++ b/reactos/subsys/system/explorer/explorer-cfg-template.xml @@ -10,6 +10,7 @@ + @@ -20,7 +21,7 @@ - diff --git a/reactos/subsys/system/explorer/explorer.cpp b/reactos/subsys/system/explorer/explorer.cpp index e390d7119a9..17ecf23f1b7 100644 --- a/reactos/subsys/system/explorer/explorer.cpp +++ b/reactos/subsys/system/explorer/explorer.cpp @@ -81,6 +81,7 @@ void ExplorerGlobals::init(HINSTANCE hInstance) _icon_cache.init(); } + bool ExplorerGlobals::read_cfg() { // read configuration file @@ -105,6 +106,26 @@ void ExplorerGlobals::write_cfg() } +XMLPos ExplorerGlobals::get_cfg() +{ + XMLPos pos(&_cfg); + + pos.create("explorer-cfg"); + + return pos; +} + +XMLPos ExplorerGlobals::get_cfg(const String& name) +{ + XMLPos pos(&_cfg); + + pos.create("explorer-cfg"); + pos.create(name); + + return pos; +} + + void _log_(LPCTSTR txt) { FmtString msg(TEXT("%s\n"), txt); diff --git a/reactos/subsys/system/explorer/explorer.h b/reactos/subsys/system/explorer/explorer.h index 31c341e7ab4..f2343425eff 100644 --- a/reactos/subsys/system/explorer/explorer.h +++ b/reactos/subsys/system/explorer/explorer.h @@ -55,6 +55,7 @@ #define PM_GET_WIDTH (WM_APP+0x18) #define PM_REFRESH (WM_APP+0x1B) +#define PM_REFRESH_CONFIG (WM_APP+0x1C) #define CLASSNAME_FRAME TEXT("CabinetWClass") // same class name for frame window as in MS Explorer diff --git a/reactos/subsys/system/explorer/explorer_intres.h b/reactos/subsys/system/explorer/explorer_intres.h index f58d5577221..29fee0ad3a4 100644 --- a/reactos/subsys/system/explorer/explorer_intres.h +++ b/reactos/subsys/system/explorer/explorer_intres.h @@ -140,6 +140,8 @@ #define IDC_NOTIFY_HIDE 1021 #define IDC_NOTIFY_AUTOHIDE 1022 #define IDC_LABEL4 1023 +#define ID_HIDE_INACTIVE_ICONS 1025 +#define ID_SHOW_CLOCK 1026 #define ID_REFRESH 1704 #define ID_ABOUT_WINEFILE 1705 #define IDC_FILETREE 10001 @@ -191,7 +193,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 166 #define _APS_NEXT_COMMAND_VALUE 40019 -#define _APS_NEXT_CONTROL_VALUE 1024 +#define _APS_NEXT_CONTROL_VALUE 1026 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/reactos/subsys/system/explorer/explorer_intres.rc b/reactos/subsys/system/explorer/explorer_intres.rc index e1685e8d92e..a3f3eb07ba7 100644 --- a/reactos/subsys/system/explorer/explorer_intres.rc +++ b/reactos/subsys/system/explorer/explorer_intres.rc @@ -806,6 +806,11 @@ STYLE WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Taskbar Properties" FONT 8, "MS Sans Serif" BEGIN + CONTROL "show &clock",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,113,52,10 + CONTROL "&hide inactive notification icons", + ID_HIDE_INACTIVE_ICONS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,135,111,10 PUSHBUTTON "&Notifications...",ID_CONFIG_NOTIFYAREA,153,133,50,14 END @@ -821,13 +826,13 @@ 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 +FONT 8, "MS Sans Serif" BEGIN CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES | TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,193,31 LTEXT "&Tooltip Text:",IDC_LABEL1,7,44,40,8 EDITTEXT IDC_NOTIFY_TOOLTIP,55,42,145,14,ES_AUTOHSCROLL - LTEXT "&Window Title:",IDC_LABEL2,7,63,44,8 + LTEXT "W&indow Title:",IDC_LABEL2,7,63,44,8 EDITTEXT IDC_NOTIFY_TITLE,55,60,145,14,ES_AUTOHSCROLL LTEXT "&Module Path:",IDC_LABEL3,7,81,43,8 EDITTEXT IDC_NOTIFY_MODULE,55,78,145,14,ES_AUTOHSCROLL @@ -838,9 +843,11 @@ BEGIN 107,29,10 CONTROL "a&utohide",IDC_NOTIFY_AUTOHIDE,"Button", BS_AUTORADIOBUTTON,112,107,43,10 + ICON "",IDC_PICTURE,173,100,20,20 + CONTROL "sho&w hidden",ID_SHOW_HIDDEN_ICONS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,131,56,10 DEFPUSHBUTTON "&OK",IDOK,91,129,50,14,WS_GROUP PUSHBUTTON "&Cancel",IDCANCEL,150,129,50,14 - ICON "",IDC_PICTURE,173,100,20,20 END diff --git a/reactos/subsys/system/explorer/globals.h b/reactos/subsys/system/explorer/globals.h index 2712e3fe5a4..b42152755fd 100644 --- a/reactos/subsys/system/explorer/globals.h +++ b/reactos/subsys/system/explorer/globals.h @@ -227,9 +227,13 @@ extern struct ExplorerGlobals ExplorerGlobals(); void init(HINSTANCE hInstance); + bool read_cfg(); void write_cfg(); + XMLPos get_cfg(); + XMLPos get_cfg(const String& name); + HINSTANCE _hInstance; ATOM _hframeClass; UINT _cfStrFName; diff --git a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp index 088331a7c7d..59e003a25b4 100644 --- a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp @@ -242,6 +242,10 @@ LRESULT DesktopBar::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) return SendMessage(_hwndTaskBar, nmsg, wparam, lparam); break; + case PM_REFRESH_CONFIG: ///@todo read desktop bar settings + SendMessage(_hwndNotify, PM_REFRESH_CONFIG, 0, 0); + break; + case WM_TIMER: if (wparam == ID_TRAY_VOLUME) { KillTimer(_hwnd, wparam); diff --git a/reactos/subsys/system/explorer/taskbar/quicklaunch.h b/reactos/subsys/system/explorer/taskbar/quicklaunch.h index 3f269a4f72d..ff1230ca567 100644 --- a/reactos/subsys/system/explorer/taskbar/quicklaunch.h +++ b/reactos/subsys/system/explorer/taskbar/quicklaunch.h @@ -31,7 +31,7 @@ #define IDW_QUICKLAUNCHBAR 101 -#define PM_UPDATE_DESKTOP (WM_APP+0x1C) +#define PM_UPDATE_DESKTOP (WM_APP+0x23) #define IDC_FIRST_QUICK_ID 0x4000 diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index d964514e8f4..9ad323c0cce 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -177,8 +177,7 @@ NotifyArea::NotifyArea(HWND hwnd) _clock_width = 0; _last_icon_count = 0; _show_hidden = false; - - read_config(); + _hide_inactive = true; } NotifyArea::~NotifyArea() @@ -188,40 +187,68 @@ NotifyArea::~NotifyArea() write_config(); } +static bool get_hide_clock_from_registry() +{ + HKEY hkeyStuckRects = 0; + DWORD buffer[10]; + DWORD len = sizeof(buffer); + + bool hide_clock = false; + + // check if the clock should be hidden + if (!RegOpenKey(HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StuckRects2"), &hkeyStuckRects) && + !RegQueryValueEx(hkeyStuckRects, TEXT("Settings"), 0, NULL, (LPBYTE)buffer, &len) && + len==sizeof(buffer) && buffer[0]==sizeof(buffer)) + hide_clock = buffer[2] & 0x08? true: false; + + if (hkeyStuckRects) + RegCloseKey(hkeyStuckRects); + + return hide_clock; +} + void NotifyArea::read_config() { // read notification icon settings from XML configuration - XMLPos pos(&g_Globals._cfg); - - if (pos.go_down("explorer-cfg")) { - if (pos.go_down("notify-icons")) { - _show_hidden = XMLBool(pos, "option", "show-hidden"); - - XMLChildrenFilter icons(pos, "icon"); - - for(XMLChildrenFilter::iterator it=icons.begin(); it!=icons.end(); ++it) { - const XMLNode& node = **it; - - NotifyIconConfig cfg; - - cfg._name = node["name"]; - cfg._tipText = node["text"]; - cfg._windowTitle = node["window"]; - cfg._modulePath = node["module"]; - const string& mode = node["show"]; - - if (mode == "show") - cfg._mode = NIM_SHOW; - else if (mode == "hide") - cfg._mode = NIM_HIDE; - else //if (mode == "auto") - cfg._mode = NIM_HIDE; - - _cfg.push_back(cfg); - } + XMLPos pos = g_Globals.get_cfg(); +#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003) + if (!g_Globals._SHRestricted || !SHRestricted(REST_HIDECLOCK)) +#endif + { + if (pos.go_down("desktopbar")) { + bool show = XMLBoolRef(pos, "options", "show-clock", !get_hide_clock_from_registry()); + show_clock(show); pos.back(); } + } + + if (pos.go_down("notify-icons")) { + _hide_inactive = XMLBool(pos, "options", "hide-inactive", true); ///@todo read default setting from registry + _show_hidden = XMLBool(pos, "options", "show-hidden", false); ///@todo read default setting from registry + + XMLChildrenFilter icons(pos, "icon"); + + for(XMLChildrenFilter::iterator it=icons.begin(); it!=icons.end(); ++it) { + const XMLNode& node = **it; + + NotifyIconConfig cfg; + + cfg._name = node["name"]; + cfg._tipText = node["text"]; + cfg._windowTitle = node["window"]; + cfg._modulePath = node["module"]; + const string& mode = node["show"]; + + if (mode == "show") + cfg._mode = NIM_SHOW; + else if (mode == "hide") + cfg._mode = NIM_HIDE; + else //if (mode == "auto") + cfg._mode = NIM_HIDE; + + _cfg.push_back(cfg); + } pos.back(); } @@ -230,12 +257,16 @@ void NotifyArea::read_config() void NotifyArea::write_config() { // write notification icon settings to XML configuration file - XMLPos pos(&g_Globals._cfg); + XMLPos pos = g_Globals.get_cfg(); + + pos.create("desktopbar"); + XMLBoolRef(pos, "options", "show-clock") = _hwndClock!=0; + pos.back(); - pos.create("explorer-cfg"); pos.create("notify-icons"); - XMLBoolRef(pos, "option", "show-hidden") = _show_hidden; + XMLBoolRef(pos, "options", "hide-inactive") = _hide_inactive; + XMLBoolRef(pos, "options", "show-hidden") = _show_hidden; for(NotifyIconCfgList::iterator it=_cfg.begin(); it!=_cfg.end(); ++it) { NotifyIconConfig& cfg = *it; @@ -243,7 +274,7 @@ void NotifyArea::write_config() // search for the corresponding node using the original name pos.create("icon", "name", cfg._name); - // refresh name + // refresh unique name cfg.create_name(); pos["name"] = cfg._name; @@ -254,33 +285,14 @@ void NotifyArea::write_config() pos.back(); } - - pos.back(); - pos.back(); } -LRESULT NotifyArea::Init(LPCREATESTRUCT pcs) +void NotifyArea::show_clock(bool flag) { - if (super::Init(pcs)) - return 1; + bool vis = _hwndClock!=0; -#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003) - if (!g_Globals._SHRestricted || !SHRestricted(REST_HIDECLOCK)) -#endif - { - HKEY hkeyStuckRects = 0; - DWORD buffer[10]; - DWORD len = sizeof(buffer); - - bool hide_clock = false; - - // check if the clock should be hidden - if (!RegOpenKey(HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StuckRects2"), &hkeyStuckRects) && - !RegQueryValueEx(hkeyStuckRects, TEXT("Settings"), 0, NULL, (LPBYTE)buffer, &len) && - len==sizeof(buffer) && buffer[0]==sizeof(buffer)) - hide_clock = buffer[2] & 0x08? true: false; - - if (!hide_clock) { + if (vis != flag) { + if (flag) { // create clock window _hwndClock = ClockWindow::Create(_hwnd); @@ -288,11 +300,22 @@ LRESULT NotifyArea::Init(LPCREATESTRUCT pcs) ClientRect clock_size(_hwndClock); _clock_width = clock_size.right; } + } else { + DestroyWindow(_hwndClock); + _hwndClock = 0; + _clock_width = 0; } - if (hkeyStuckRects) - RegCloseKey(hkeyStuckRects); + SendMessage(GetParent(_hwnd), PM_RESIZE_CHILDREN, 0, 0); } +} + +LRESULT NotifyArea::Init(LPCREATESTRUCT pcs) +{ + if (super::Init(pcs)) + return 1; + + read_config(); SetTimer(_hwnd, 0, 1000, NULL); @@ -344,6 +367,10 @@ LRESULT NotifyArea::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) case PM_GET_WIDTH: return _sorted_icons.size()*NOTIFYICON_DIST + NOTIFYAREA_SPACE + _clock_width; + case PM_REFRESH_CONFIG: + read_config(); + break; + case WM_CONTEXTMENU: { Point pt(lparam); ScreenToClient(_hwnd, &pt); @@ -629,11 +656,12 @@ void NotifyArea::Refresh(bool update) case NIM_AUTO: // automatically hide icons after long periods of inactivity - if (!(entry._dwState & NIS_HIDDEN)) - if (now-entry._lastChange > ICON_AUTOHIDE_SECONDS*1000) { - entry._dwState |= NIS_HIDDEN; - ++update; - } + if (_hide_inactive) + if (!(entry._dwState & NIS_HIDDEN)) + if (now-entry._lastChange > ICON_AUTOHIDE_SECONDS*1000) { + entry._dwState |= NIS_HIDDEN; + ++update; + } break; } } @@ -746,6 +774,7 @@ TrayNotifyDlg::TrayNotifyDlg(HWND hwnd) _icon_states_org[it->first] = IconStatePair(it->second._mode, it->second._dwState); _cfg_org = _pNotifyArea->_cfg; + _show_hidden_org = _pNotifyArea->_show_hidden; } SetWindowIcon(hwnd, IDI_REACTOS/*IDI_SEARCH*/); @@ -777,6 +806,7 @@ TrayNotifyDlg::TrayNotifyDlg(HWND hwnd) _resize_mgr.Add(IDC_NOTIFY_AUTOHIDE,MOVE_Y); _resize_mgr.Add(IDC_PICTURE, MOVE); + _resize_mgr.Add(ID_SHOW_HIDDEN_ICONS,MOVE_Y); _resize_mgr.Add(IDOK, MOVE); _resize_mgr.Add(IDCANCEL, MOVE); @@ -871,7 +901,7 @@ void TrayNotifyDlg::Refresh() DestroyIcon(hicon); } - // insert new configuration entry + CheckDlgButton(_hwnd, ID_SHOW_HIDDEN_ICONS, _pNotifyArea->_show_hidden? BST_CHECKED: BST_UNCHECKED); } TreeView_Expand(_tree_ctrl, _hitemCurrent_visible, TVE_EXPAND); @@ -956,6 +986,11 @@ int TrayNotifyDlg::Command(int id, int code) SetIconMode(NIM_AUTO); break; + case ID_SHOW_HIDDEN_ICONS: + if (_pNotifyArea) + SendMessage(*_pNotifyArea, WM_COMMAND, MAKEWPARAM(id,code), 0); + break; + case IDOK: EndDialog(_hwnd, id); break; @@ -965,6 +1000,7 @@ int TrayNotifyDlg::Command(int id, int code) if (_pNotifyArea) { // restore original icon states and configuration data _pNotifyArea->_cfg = _cfg_org; + _pNotifyArea->_show_hidden = _show_hidden_org; for(IconStateMap::const_iterator it=_icon_states_org.begin(); it!=_icon_states_org.end(); ++it) { NotifyInfo& info = _pNotifyArea->_icon_map[it->first]; diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.h b/reactos/subsys/system/explorer/taskbar/traynotify.h index acfcf76a31f..df37640635e 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.h +++ b/reactos/subsys/system/explorer/taskbar/traynotify.h @@ -143,6 +143,7 @@ protected: NotifyHook _hook; bool _show_hidden; + bool _hide_inactive; LRESULT Init(LPCREATESTRUCT pcs); LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); @@ -160,7 +161,8 @@ protected: void read_config(); void write_config(); -public: // for TrayNotifyDlg + friend struct TrayNotifyDlg; + NotifyIconCfgList _cfg; map _window_modules; @@ -169,6 +171,8 @@ public: // for TrayNotifyDlg NotifyIconSet _sorted_icons; int _next_idx; size_t _last_icon_count; + + void show_clock(bool flag); }; @@ -191,6 +195,7 @@ protected: NotifyIconCfgList _cfg_org; IconStateMap _icon_states_org; + bool _show_hidden_org; HTREEITEM _hitemCurrent; HTREEITEM _hitemCurrent_visible; diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.h b/reactos/subsys/system/explorer/utility/xmlstorage.h index 41378e149a1..7b58322b5b1 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.h +++ b/reactos/subsys/system/explorer/utility/xmlstorage.h @@ -241,6 +241,15 @@ struct XMLNode : public String { } + XMLNode(const XMLNode& other) + : _content(other._content), + _trailing(other._trailing), + _attributes(other._attributes) + { + for(Children::const_iterator it=other._children.begin(); it!=other._children.end(); ++it) + _children.push_back(new XMLNode(**it)); + } + ~XMLNode() { while(!_children.empty()) { @@ -272,6 +281,30 @@ struct XMLNode : public String return ""; } + /// convenient value access in children node + String value(const String& name, const String& attr_name) const + { + XMLNode* node = find_first(name); + + if (node) + return (*node)[attr_name]; + else + return ""; + } + + /// convenient storage of distinct values in children node + String& value(const String& name, const String& attr_name) + { + XMLNode* node = find_first(name); + + if (!node) { + node = new XMLNode(name); + add_child(node); + } + + return (*node)[attr_name]; + } + const Children& get_children() const { return _children; @@ -470,6 +503,12 @@ struct XMLPos : _root(root), _cur(root) { + } + + XMLPos(const XMLPos& other) + : _root(other._root), + _cur(other._cur) + { // don't copy _stack } /// access to current node @@ -556,28 +595,6 @@ struct XMLPos } } - String& value(const String& name, const String& attr_name) - { - XMLNode* node = _cur->find_first(name); - - if (!node) { - node = new XMLNode(name); - _cur->add_child(node); - } - - return (*node)[attr_name]; - } - - String value(const String& name, const String& attr_name) const - { - XMLNode* node = _cur->find_first(name); - - if (node) - return (*node)[attr_name]; - else - return ""; - } - protected: XMLNode* _root; XMLNode* _cur; @@ -599,14 +616,22 @@ struct XMLBool { } - XMLBool(LPCTSTR value) + XMLBool(LPCTSTR value, bool def=false) { - _value = !_tcsicmp(value, TEXT("TRUE")); + if (value && *value) + _value = !_tcsicmp(value, TEXT("TRUE")); + else + _value = def; } - XMLBool(XMLPos& pos, const String& name, const String& attr_name) + XMLBool(XMLNode* node, const String& name, const String& attr_name, bool def=false) { - _value = !_tcsicmp(pos.value(name, attr_name), TEXT("TRUE")); + const String& value = node->value(name, attr_name); + + if (!value.empty()) + _value = !_tcsicmp(value, TEXT("TRUE")); + else + _value = def; } operator bool() const @@ -628,18 +653,35 @@ private: struct XMLBoolRef { - XMLBoolRef(XMLPos& pos, const String& name, const String& attr_name) - : _ref(pos.value(name, attr_name)) + XMLBoolRef(XMLNode* node, const String& name, const String& attr_name, bool def=false) + : _ref(node->value(name, attr_name)) { + if (_ref.empty()) + assign(def); + } + + operator bool() const + { + return !_tcsicmp(_ref, TEXT("TRUE")); } XMLBoolRef& operator=(bool value) { - _ref.assign(value? TEXT("TRUE"): TEXT("FALSE")); + assign(value); return *this; } + void assign(bool value) + { + _ref.assign(value? TEXT("TRUE"): TEXT("FALSE")); + } + + void toggle() + { + assign(!operator bool()); + } + protected: String& _ref; }; @@ -652,14 +694,22 @@ struct XMLNumber { } - XMLNumber(LPCTSTR value) + XMLNumber(LPCTSTR value, int def=0) { - _value = _ttoi(value); + if (value && *value) + _value = _ttoi(value); + else + _value = def; } - XMLNumber(XMLPos& pos, const String& name, const String& attr_name) + XMLNumber(XMLNode* node, const String& name, const String& attr_name, int def=0) { - _value = _ttoi(pos.value(name, attr_name)); + const String& value = node->value(name, attr_name); + + if (!value.empty()) + _value = _ttoi(node->value(name, attr_name)); + else + _value = def; } operator int() const @@ -683,19 +733,31 @@ private: struct XMLNumberRef { - XMLNumberRef(XMLPos& pos, const String& name, const String& attr_name) - : _ref(pos.value(name, attr_name)) + XMLNumberRef(XMLNode* node, const String& name, const String& attr_name, int def=0) + : _ref(node->value(name, attr_name)) { + if (_ref.empty()) + assign(def); } XMLNumberRef& operator=(int value) + { + assign(value); + + return *this; + } + + operator int() const + { + return _ttoi(_ref); + } + + void assign(int value) { TCHAR buffer[32]; _stprintf(buffer, TEXT("%d"), value); _ref.assign(buffer); - - return *this; } protected: From 352d841f3b195298b8c19098a8f7147557aea563 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sun, 28 Mar 2004 16:21:58 +0000 Subject: [PATCH 0671/1463] fixed a crash caused by removing a message twice from the queue svn path=/trunk/; revision=8903 --- reactos/subsys/win32k/ntuser/msgqueue.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index 241b1583f57..bc1c335253b 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.77 2004/03/23 22:24:27 weiden Exp $ +/* $Id: msgqueue.c,v 1.78 2004/03/28 16:21:58 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -385,11 +385,10 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, { /* we do not hold more than one WM_MOUSEMOVE message in the queue */ Window->MessageQueue->MouseMoveMsg->Msg = Message->Msg; - if(RemoveWhenFreed) + if(RemoveWhenFreed && FromGlobalQueue) { RemoveEntryList(&Message->ListEntry); } - ExFreePool(Message); *Freed = TRUE; } else @@ -403,6 +402,10 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, *Freed = FALSE; } IntUnLockHardwareMessageQueue(Window->MessageQueue); + if(*Freed) + { + ExFreePool(Message); + } KeSetEvent(&Window->MessageQueue->NewMessages, IO_NO_INCREMENT, FALSE); IntReleaseWindowObject(Window); return(FALSE); @@ -420,7 +423,6 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, { RemoveEntryList(&Message->ListEntry); } - ExFreePool(Message); *Freed = TRUE; } else @@ -434,6 +436,10 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, *Freed = FALSE; } IntUnLockHardwareMessageQueue(Window->MessageQueue); + if(*Freed) + { + ExFreePool(Message); + } KeSetEvent(&Window->MessageQueue->NewMessages, IO_NO_INCREMENT, FALSE); IntReleaseWindowObject(Window); return(FALSE); From c05238d39f467d74da44cb4d146a02641a93036d Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sun, 28 Mar 2004 17:01:10 +0000 Subject: [PATCH 0672/1463] - Fixed a dumb ExFreePool that I accidently left there. svn path=/trunk/; revision=8904 --- reactos/ntoskrnl/io/driver.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/io/driver.c b/reactos/ntoskrnl/io/driver.c index b48d2519b16..6acda77fcec 100644 --- a/reactos/ntoskrnl/io/driver.c +++ b/reactos/ntoskrnl/io/driver.c @@ -1,4 +1,4 @@ -/* $Id: driver.c,v 1.41 2004/03/28 12:03:25 navaraf Exp $ +/* $Id: driver.c,v 1.42 2004/03/28 17:01:10 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -560,7 +560,6 @@ IopInitializeDriverModule( Status = DriverEntry(*DriverObject, &RegistryKey); if (!NT_SUCCESS(Status)) { - ExFreePool((*DriverObject)->DriverExtension); ObMakeTemporaryObject(DriverObject); ObDereferenceObject(DriverObject); return Status; From 0831947d6ce2aa150f22dbc5ae30839854fbc069 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sun, 28 Mar 2004 17:08:55 +0000 Subject: [PATCH 0673/1463] - I accidently ommited two '*' and caused a random crashes when DriverEntry didn't return STATUS_SUCCESS. svn path=/trunk/; revision=8905 --- reactos/ntoskrnl/io/driver.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/io/driver.c b/reactos/ntoskrnl/io/driver.c index 6acda77fcec..d154dabd16c 100644 --- a/reactos/ntoskrnl/io/driver.c +++ b/reactos/ntoskrnl/io/driver.c @@ -1,4 +1,4 @@ -/* $Id: driver.c,v 1.42 2004/03/28 17:01:10 navaraf Exp $ +/* $Id: driver.c,v 1.43 2004/03/28 17:08:55 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -560,8 +560,8 @@ IopInitializeDriverModule( Status = DriverEntry(*DriverObject, &RegistryKey); if (!NT_SUCCESS(Status)) { - ObMakeTemporaryObject(DriverObject); - ObDereferenceObject(DriverObject); + ObMakeTemporaryObject(*DriverObject); + ObDereferenceObject(*DriverObject); return Status; } From 3bf2b751a9487cd990bf666c84db2a82560eb1d5 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sun, 28 Mar 2004 18:10:48 +0000 Subject: [PATCH 0674/1463] UNICODE optimizations svn path=/trunk/; revision=8906 --- .../system/explorer/utility/xmlstorage.h | 158 +++++++++++++++++- 1 file changed, 152 insertions(+), 6 deletions(-) diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.h b/reactos/subsys/system/explorer/utility/xmlstorage.h index 7b58322b5b1..c242e751b47 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.h +++ b/reactos/subsys/system/explorer/utility/xmlstorage.h @@ -223,16 +223,61 @@ struct String_from_XML_Char : public String } }; +#endif + + +#ifdef UNICODE + + // optimization for faster UNICODE/ASCII string comparison without temporary A/U conversion +inline bool operator==(const String& s1, const char* s2) +{ + LPCWSTR p = s1; + const char* q = s2; + + while(*p && *q) + if (*p++ != *q++) + return false; + + return *p == *q; +}; + #endif /// in memory representation of an XML node struct XMLNode : public String { +#ifdef UNICODE + // optimized read access without temporary A/U conversion when using ASCII attribute names + struct AttributeMap : public std::map + { + typedef std::map super; + + const_iterator find(const char* x) const + { + for(const_iterator it=begin(); it!=end(); ++it) + if (it->first == x) + return it; + + return end(); + } + + const_iterator find(const key_type& x) const + { + return super::find(x); + } + + iterator find(const key_type& x) + { + return super::find(x); + } + }; +#else typedef std::map AttributeMap; +#endif typedef std::list Children; - // access to protected class members for XMLPos anbd XMLReader + // access to protected class members for XMLPos and XMLReader friend struct XMLPos; friend struct XMLReader; @@ -242,9 +287,9 @@ struct XMLNode : public String } XMLNode(const XMLNode& other) - : _content(other._content), - _trailing(other._trailing), - _attributes(other._attributes) + : _attributes(other._attributes), + _content(other._content), + _trailing(other._trailing) { for(Children::const_iterator it=other._children.begin(); it!=other._children.end(); ++it) _children.push_back(new XMLNode(**it)); @@ -278,7 +323,7 @@ struct XMLNode : public String if (found != _attributes.end()) return found->second; else - return ""; + return TEXT(""); } /// convenient value access in children node @@ -289,7 +334,7 @@ struct XMLNode : public String if (node) return (*node)[attr_name]; else - return ""; + return TEXT(""); } /// convenient storage of distinct values in children node @@ -305,6 +350,43 @@ struct XMLNode : public String return (*node)[attr_name]; } +#ifdef UNICODE + /// read only access to an attribute + String operator[](const char* attr_name) const + { + AttributeMap::const_iterator found = _attributes.find(attr_name); + + if (found != _attributes.end()) + return found->second; + else + return TEXT(""); + } + + /// convenient value access in children node + String value(const char* name, const char* attr_name) const + { + XMLNode* node = find_first(name); + + if (node) + return (*node)[attr_name]; + else + return TEXT(""); + } + + /// convenient storage of distinct values in children node + String& value(const char* name, const String& attr_name) + { + XMLNode* node = find_first(name); + + if (!node) { + node = new XMLNode(name); + add_child(node); + } + + return (*node)[attr_name]; + } +#endif + const Children& get_children() const { return _children; @@ -376,6 +458,30 @@ protected: return NULL; } +#ifdef UNICODE + XMLNode* find_first(const char* name) const + { + for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) + if (**it == name) + return *it; + + return NULL; + } + + template + XMLNode* find_first(const char* name, const T& attr_name, const U& attr_value) const + { + for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) { + const XMLNode& node = **it; + + if (node==name && node[attr_name]==attr_value) + return *it; + } + + return NULL; + } +#endif + void append_content(const char* s, int l) { if (_children.empty()) @@ -595,6 +701,46 @@ struct XMLPos } } +#ifdef UNICODE + /// search for child and go down + bool go_down(const char* name) + { + XMLNode* node = _cur->find_first(name); + + if (node) { + go_to(node); + return true; + } else + return false; + } + + /// create node if not already existing and move to it + void create(const char* name) + { + XMLNode* node = _cur->find_first(name); + + if (node) + go_to(node); + else + add_down(new XMLNode(name)); + } + + /// search matching child node identified by key name and an attribute value + template + void create(const char* name, const T& attr_name, const U& attr_value) + { + XMLNode* node = _cur->find_first(name, attr_name, attr_value); + + if (node) + go_to(node); + else { + XMLNode* node = new XMLNode(name); + add_down(node); + (*node)[attr_name] = attr_value; + } + } +#endif + protected: XMLNode* _root; XMLNode* _cur; From f2d4a56a852ca4f623e29a65704a49420637c1ec Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sun, 28 Mar 2004 20:32:21 +0000 Subject: [PATCH 0675/1463] option "display version on desktop background" svn path=/trunk/; revision=8907 --- .../system/explorer/desktop/desktop.cpp | 84 +++++++++++-------- .../subsys/system/explorer/desktop/desktop.h | 5 ++ .../subsys/system/explorer/explorer_intres.h | 3 +- .../subsys/system/explorer/explorer_intres.rc | 22 ++--- 4 files changed, 67 insertions(+), 47 deletions(-) diff --git a/reactos/subsys/system/explorer/desktop/desktop.cpp b/reactos/subsys/system/explorer/desktop/desktop.cpp index 6f472e7b384..fa7cf78c0ad 100644 --- a/reactos/subsys/system/explorer/desktop/desktop.cpp +++ b/reactos/subsys/system/explorer/desktop/desktop.cpp @@ -257,56 +257,37 @@ BOOL IsAnyDesktopRunning() } -static void draw_desktop_background(HWND hwnd, HDC hdc) -{ - ClientRect rect(hwnd); - - PaintDesktop(hdc); -/* - HBRUSH bkgndBrush = CreateSolidBrush(RGB(0,32,160)); // dark blue - FillRect(hdc, &rect, bkgndBrush); - DeleteBrush(bkgndBrush); -*/ - - rect.left = rect.right - 280; - rect.top = rect.bottom - 56 - DESKTOPBARBAR_HEIGHT; - rect.right = rect.left + 250; - rect.bottom = rect.top + 40; - -#include "../buildno.h" - static const LPCTSTR BkgndText = TEXT("ReactOS ")TEXT(KERNEL_VERSION_STR)TEXT(" Explorer\nby Martin Fuchs"); - - BkMode bkMode(hdc, TRANSPARENT); - - TextColor textColor(hdc, RGB(128,128,192)); - DrawText(hdc, BkgndText, -1, &rect, DT_RIGHT); - - SetTextColor(hdc, RGB(255,255,255)); - --rect.right; - ++rect.top; - DrawText(hdc, BkgndText, -1, &rect, DT_RIGHT); -} - - BackgroundWindow::BackgroundWindow(HWND hwnd) : super(hwnd) { // set background brush for the short moment of displaying the // background color while moving foreground windows SetClassLong(hwnd, GCL_HBRBACKGROUND, COLOR_BACKGROUND+1); + + _display_version = RegGetDWORDValue(HKEY_CURRENT_USER, TEXT("Control Panel\\Desktop"), TEXT("PaintDesktopVersion"), 1); } LRESULT BackgroundWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) { switch(nmsg) { case WM_ERASEBKGND: - PaintDesktop((HDC)wparam); + DrawDesktopBkgnd((HDC)wparam); return TRUE; case WM_MBUTTONDBLCLK: explorer_show_frame(SW_SHOWNORMAL); break; + case PM_DISPLAY_VERSION: + if (lparam || wparam) { + DWORD or_mask = wparam; + DWORD reset_mask = LOWORD(lparam); + DWORD xor_mask = HIWORD(lparam); + _display_version = ((_display_version&~reset_mask) | or_mask) ^ xor_mask; + InvalidateRect(_hwnd, NULL, TRUE); + } + return _display_version; + default: return super::WndProc(nmsg, wparam, lparam); } @@ -314,6 +295,38 @@ LRESULT BackgroundWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) return 0; } +void BackgroundWindow::DrawDesktopBkgnd(HDC hdc) +{ + PaintDesktop(hdc); + +/* special solid background + HBRUSH bkgndBrush = CreateSolidBrush(RGB(0,32,160)); // dark blue + FillRect(hdc, &rect, bkgndBrush); + DeleteBrush(bkgndBrush); +*/ + if (_display_version) { + ClientRect rect(_hwnd); + + rect.left = rect.right - 280; + rect.top = rect.bottom - 56 - DESKTOPBARBAR_HEIGHT; + rect.right = rect.left + 250; + rect.bottom = rect.top + 40; + + #include "../buildno.h" + static const LPCTSTR BkgndText = TEXT("ReactOS ")TEXT(KERNEL_VERSION_STR)TEXT(" Explorer\nby Martin Fuchs"); + + BkMode bkMode(hdc, TRANSPARENT); + + TextColor textColor(hdc, RGB(128,128,192)); + DrawText(hdc, BkgndText, -1, &rect, DT_RIGHT); + + SetTextColor(hdc, RGB(255,255,255)); + --rect.right; + ++rect.top; + DrawText(hdc, BkgndText, -1, &rect, DT_RIGHT); + } +} + DesktopWindow::DesktopWindow(HWND hwnd) : super(hwnd) @@ -436,10 +449,6 @@ LRESULT DesktopWindow::Init(LPCREATESTRUCT pcs) LRESULT DesktopWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) { switch(nmsg) { - case WM_PAINT: - draw_desktop_background(_hwnd, PaintCanvas(_hwnd)); - break; - case WM_LBUTTONDBLCLK: case WM_RBUTTONDBLCLK: case WM_MBUTTONDBLCLK: @@ -554,6 +563,9 @@ LRESULT DesktopShellView::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) case PM_GET_ICON_ALGORITHM: return _icon_algo; + case PM_DISPLAY_VERSION: + return SendMessage(_hwndListView, nmsg, wparam, lparam); + default: return super::WndProc(nmsg, wparam, lparam); } diff --git a/reactos/subsys/system/explorer/desktop/desktop.h b/reactos/subsys/system/explorer/desktop/desktop.h index 25380afb55f..752a3de266f 100644 --- a/reactos/subsys/system/explorer/desktop/desktop.h +++ b/reactos/subsys/system/explorer/desktop/desktop.h @@ -28,6 +28,7 @@ #define PM_SET_ICON_ALGORITHM (WM_APP+0x19) #define PM_GET_ICON_ALGORITHM (WM_APP+0x1A) +#define PM_DISPLAY_VERSION (WM_APP+0x24) /// subclassed Background window behind the visible desktop window @@ -39,6 +40,10 @@ struct BackgroundWindow : public SubclassedWindow protected: LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + + void DrawDesktopBkgnd(HDC hdc); + + int _display_version; }; diff --git a/reactos/subsys/system/explorer/explorer_intres.h b/reactos/subsys/system/explorer/explorer_intres.h index 29fee0ad3a4..2c880508071 100644 --- a/reactos/subsys/system/explorer/explorer_intres.h +++ b/reactos/subsys/system/explorer/explorer_intres.h @@ -142,6 +142,7 @@ #define IDC_LABEL4 1023 #define ID_HIDE_INACTIVE_ICONS 1025 #define ID_SHOW_CLOCK 1026 +#define ID_DESKTOP_VERSION 1027 #define ID_REFRESH 1704 #define ID_ABOUT_WINEFILE 1705 #define IDC_FILETREE 10001 @@ -193,7 +194,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 166 #define _APS_NEXT_COMMAND_VALUE 40019 -#define _APS_NEXT_CONTROL_VALUE 1026 +#define _APS_NEXT_CONTROL_VALUE 1028 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/reactos/subsys/system/explorer/explorer_intres.rc b/reactos/subsys/system/explorer/explorer_intres.rc index a3f3eb07ba7..c8f6f558139 100644 --- a/reactos/subsys/system/explorer/explorer_intres.rc +++ b/reactos/subsys/system/explorer/explorer_intres.rc @@ -768,7 +768,7 @@ BEGIN WS_TABSTOP,7,25,130,33 END -IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 172 +IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194 STYLE WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Desktop Properties" FONT 8, "MS Sans Serif" @@ -799,22 +799,24 @@ BEGIN 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 "Display &Version Number",ID_DESKTOP_VERSION,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10 END -IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 154 +IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194 STYLE WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Taskbar Properties" FONT 8, "MS Sans Serif" BEGIN CONTROL "show &clock",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,7,113,52,10 + WS_TABSTOP,7,152,52,10 CONTROL "&hide inactive notification icons", ID_HIDE_INACTIVE_ICONS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,7,135,111,10 - PUSHBUTTON "&Notifications...",ID_CONFIG_NOTIFYAREA,153,133,50,14 + WS_TABSTOP,7,174,111,10 + PUSHBUTTON "&Notifications...",ID_CONFIG_NOTIFYAREA,153,173,50,14 END -IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 154 +IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194 STYLE WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Startmenu Properties" FONT 8, "MS Sans Serif" @@ -826,7 +828,7 @@ 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" +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 @@ -872,7 +874,7 @@ BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 205 TOPMARGIN, 7 - BOTTOMMARGIN, 165 + BOTTOMMARGIN, 187 END IDD_DESKBAR_TASKBAR, DIALOG @@ -880,7 +882,7 @@ BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 203 TOPMARGIN, 7 - BOTTOMMARGIN, 147 + BOTTOMMARGIN, 187 END IDD_DESKBAR_STARTMENU, DIALOG @@ -888,7 +890,7 @@ BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 203 TOPMARGIN, 7 - BOTTOMMARGIN, 147 + BOTTOMMARGIN, 187 END IDD_NOTIFYAREA, DIALOG From 9447d23bc18e2717ff83ad7b9c3bfae749aa35d4 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sun, 28 Mar 2004 20:32:23 +0000 Subject: [PATCH 0676/1463] option "display version on desktop background" svn path=/trunk/; revision=8908 --- .../system/explorer/dialogs/settings.cpp | 41 ++++++++++++++++--- .../subsys/system/explorer/dialogs/settings.h | 3 ++ .../system/explorer/utility/utility.cpp | 19 +++++++++ .../subsys/system/explorer/utility/utility.h | 3 ++ .../subsys/system/explorer/utility/window.cpp | 15 ++----- .../subsys/system/explorer/utility/window.h | 1 - .../system/explorer/utility/xmlstorage.h | 19 ++++++++- 7 files changed, 80 insertions(+), 21 deletions(-) diff --git a/reactos/subsys/system/explorer/dialogs/settings.cpp b/reactos/subsys/system/explorer/dialogs/settings.cpp index 1d6f80179e0..2260b448661 100644 --- a/reactos/subsys/system/explorer/dialogs/settings.cpp +++ b/reactos/subsys/system/explorer/dialogs/settings.cpp @@ -95,6 +95,9 @@ DesktopSettingsDlg::DesktopSettingsDlg(HWND hwnd) _alignment_cur = SendMessage(g_Globals._hwndShellView, PM_GET_ICON_ALGORITHM, 0, 0); _alignment_tmp = _alignment_cur; + + _display_version_org = SendMessage(g_Globals._hwndShellView, PM_DISPLAY_VERSION, 0, MAKELONG(0,0)); + CheckDlgButton(hwnd, ID_DESKTOP_VERSION, _display_version_org? BST_CHECKED: BST_UNCHECKED); } #ifndef PSN_QUERYINITIALFOCUS // currently (as of 18.01.2004) missing in MinGW headers @@ -110,11 +113,13 @@ int DesktopSettingsDlg::Notify(int id, NMHDR* pnmh) case PSN_APPLY: _alignment_cur = _alignment_tmp; + _display_version_org = SendMessage(g_Globals._hwndShellView, PM_DISPLAY_VERSION, 0, MAKELONG(0,0)); break; case PSN_RESET: if (_alignment_tmp != _alignment_cur) SendMessage(g_Globals._hwndShellView, PM_SET_ICON_ALGORITHM, _alignment_cur, 0); + SendMessage(g_Globals._hwndShellView, PM_DISPLAY_VERSION, _display_version_org, MAKELONG(1,0)); break; default: @@ -140,7 +145,17 @@ int DesktopSettingsDlg::Command(int id, int code) return 0; } - return 1; + switch(id) { + case ID_DESKTOP_VERSION: + SendMessage(g_Globals._hwndShellView, PM_DISPLAY_VERSION, 0, MAKELONG(0,1)); // toggle version display flag + PropSheet_Changed(GetParent(_hwnd), _hwnd); + break; + + default: + return 1; + } + + return 0; } @@ -152,6 +167,25 @@ TaskbarSettingsDlg::TaskbarSettingsDlg(HWND hwnd) CheckDlgButton(hwnd, ID_HIDE_INACTIVE_ICONS, XMLBool(g_Globals.get_cfg("notify-icons"), "options", "hide-inactive", true)? BST_CHECKED: BST_UNCHECKED); } +int TaskbarSettingsDlg::Notify(int id, NMHDR* pnmh) +{ + switch(pnmh->code) { + case PSN_APPLY: + _cfg_org = g_Globals._cfg; + break; + + case PSN_RESET: + g_Globals._cfg = _cfg_org; + SendMessage(g_Globals._hwndDesktopBar, PM_REFRESH_CONFIG, 0, 0); + break; + + default: + return super::Notify(id, pnmh); + } + + return 0; +} + int TaskbarSettingsDlg::Command(int id, int code) { switch(id) { @@ -171,11 +205,6 @@ int TaskbarSettingsDlg::Command(int id, int code) PropSheet_Changed(GetParent(_hwnd), _hwnd); break; - case PSN_RESET: - g_Globals._cfg = _cfg_org; - SendMessage(g_Globals._hwndDesktopBar, PM_REFRESH_CONFIG, 0, 0); - break; - default: return 1; } diff --git a/reactos/subsys/system/explorer/dialogs/settings.h b/reactos/subsys/system/explorer/dialogs/settings.h index e555194fd4f..6886fe6d551 100644 --- a/reactos/subsys/system/explorer/dialogs/settings.h +++ b/reactos/subsys/system/explorer/dialogs/settings.h @@ -54,6 +54,8 @@ protected: int _alignment_cur; int _alignment_tmp; + int _display_version_org; + virtual int Command(int id, int code); virtual int Notify(int id, NMHDR* pnmh); }; @@ -67,6 +69,7 @@ struct TaskbarSettingsDlg : public PropSheetPageDlg TaskbarSettingsDlg(HWND hwnd); virtual int Command(int id, int code); + virtual int Notify(int id, NMHDR* pnmh); protected: XMLDoc _cfg_org; diff --git a/reactos/subsys/system/explorer/utility/utility.cpp b/reactos/subsys/system/explorer/utility/utility.cpp index f10b92f5ec0..06fa618bd2d 100644 --- a/reactos/subsys/system/explorer/utility/utility.cpp +++ b/reactos/subsys/system/explorer/utility/utility.cpp @@ -333,3 +333,22 @@ BOOL RecursiveCreateDirectory(LPCTSTR path_in) return TRUE; } + + +DWORD RegGetDWORDValue(HKEY root, LPCTSTR path, LPCTSTR valueName, DWORD def) +{ + HKEY hkey; + DWORD ret; + + if (!RegOpenKey(root, path, &hkey)) { + DWORD len = sizeof(ret); + + if (RegQueryValueEx(hkey, valueName, 0, NULL, (LPBYTE)&ret, &len)) + ret = def; + + RegCloseKey(hkey); + + return ret; + } else + return def; +} diff --git a/reactos/subsys/system/explorer/utility/utility.h b/reactos/subsys/system/explorer/utility/utility.h index d4fd1255222..8ffaafe1da2 100644 --- a/reactos/subsys/system/explorer/utility/utility.h +++ b/reactos/subsys/system/explorer/utility/utility.h @@ -149,6 +149,9 @@ extern int find_window_class(LPCTSTR classname); // create a directory with all missing parent directories BOOL RecursiveCreateDirectory(LPCTSTR path_in); + // read DWORD value from registry +DWORD RegGetDWORDValue(HKEY root, LPCTSTR path, LPCTSTR valueName, DWORD def); + #ifdef __cplusplus } // extern "C" diff --git a/reactos/subsys/system/explorer/utility/window.cpp b/reactos/subsys/system/explorer/utility/window.cpp index f1124a99ac4..759d6c8ef45 100644 --- a/reactos/subsys/system/explorer/utility/window.cpp +++ b/reactos/subsys/system/explorer/utility/window.cpp @@ -649,11 +649,6 @@ Dialog::~Dialog() unregister_dialog(_hwnd); } -LRESULT Dialog::Init(LPCREATESTRUCT pcs) -{ - return TRUE; // set standard focus -} - int Dialog::DoModal(UINT nid, CREATORFUNC creator, HWND hwndParent) { Lock lock(GetStaticWindowData()._create_crit_sect); // protect access to s_window_creator and s_new_info @@ -685,7 +680,7 @@ INT_PTR CALLBACK Window::DialogProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM if (pThis) { switch(nmsg) { case WM_COMMAND: - SetWindowLong(hwnd, DWL_MSGRESULT, (LPARAM)pThis->Command(LOWORD(wparam), HIWORD(wparam))); + pThis->Command(LOWORD(wparam), HIWORD(wparam)); return TRUE; // message has been processed case WM_NOTIFY: @@ -708,8 +703,6 @@ INT_PTR CALLBACK Window::DialogProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM if (pThis) return pThis->Init(NULL); - - return TRUE; } return FALSE; // message has not been processed @@ -1373,7 +1366,7 @@ INT_PTR CALLBACK PropSheetPageDlg::DialogProc(HWND hwnd, UINT nmsg, WPARAM wpara if (pThis) { switch(nmsg) { case WM_COMMAND: - SetWindowLong(hwnd, DWL_MSGRESULT, (LPARAM)pThis->Command(LOWORD(wparam), HIWORD(wparam))); + pThis->Command(LOWORD(wparam), HIWORD(wparam)); return TRUE; // message has been processed case WM_NOTIFY: @@ -1401,8 +1394,6 @@ INT_PTR CALLBACK PropSheetPageDlg::DialogProc(HWND hwnd, UINT nmsg, WPARAM wpara if (pThis) return pThis->Init(NULL); } - - return TRUE; } return FALSE; // message has not been processed @@ -1412,5 +1403,5 @@ int PropSheetPageDlg::Command(int id, int code) { // override call to EndDialog in Dialog::Command(); - return 1; + return FALSE; } diff --git a/reactos/subsys/system/explorer/utility/window.h b/reactos/subsys/system/explorer/utility/window.h index 19d20e45210..5bd030bd531 100644 --- a/reactos/subsys/system/explorer/utility/window.h +++ b/reactos/subsys/system/explorer/utility/window.h @@ -371,7 +371,6 @@ struct Dialog : public Window static int DoModal(UINT nid, CREATORFUNC_INFO creator, const void* info, HWND hwndParent=0); protected: - LRESULT Init(LPCREATESTRUCT pcs); LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); int Command(int id, int code); }; diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.h b/reactos/subsys/system/explorer/utility/xmlstorage.h index c242e751b47..9ec09ef302a 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.h +++ b/reactos/subsys/system/explorer/utility/xmlstorage.h @@ -303,6 +303,21 @@ struct XMLNode : public String } } + XMLNode& operator=(const XMLNode& other) + { + _children.clear(); + + for(Children::const_iterator it=other._children.begin(); it!=other._children.end(); ++it) + _children.push_back(new XMLNode(**it)); + + _attributes = other._attributes; + + _content = other._content; + _trailing = other._trailing; + + return *this; + } + /// add a new child node void add_child(XMLNode* child) { @@ -329,7 +344,7 @@ struct XMLNode : public String /// convenient value access in children node String value(const String& name, const String& attr_name) const { - XMLNode* node = find_first(name); + const XMLNode* node = find_first(name); if (node) return (*node)[attr_name]; @@ -365,7 +380,7 @@ struct XMLNode : public String /// convenient value access in children node String value(const char* name, const char* attr_name) const { - XMLNode* node = find_first(name); + const XMLNode* node = find_first(name); if (node) return (*node)[attr_name]; From 741870b1343c661f677c3035c0794782bb62358a Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sun, 28 Mar 2004 20:44:09 +0000 Subject: [PATCH 0677/1463] DbgPrint -> DPRINT svn path=/trunk/; revision=8910 --- reactos/drivers/dd/sndblst/card.c | 12 +++---- reactos/drivers/dd/sndblst/dma.c | 51 +++++++++++++-------------- reactos/drivers/dd/sndblst/irq.c | 5 +-- reactos/drivers/dd/sndblst/portio.c | 25 +++++++------ reactos/drivers/dd/sndblst/settings.c | 4 --- reactos/drivers/dd/sndblst/sndblst.c | 5 --- reactos/drivers/dd/sndblst/sndblst.h | 3 ++ 7 files changed, 45 insertions(+), 60 deletions(-) diff --git a/reactos/drivers/dd/sndblst/card.c b/reactos/drivers/dd/sndblst/card.c index 8c204973d0c..434406b2688 100644 --- a/reactos/drivers/dd/sndblst/card.c +++ b/reactos/drivers/dd/sndblst/card.c @@ -5,14 +5,12 @@ */ #include - -#include #include "sndblst.h" VOID SetOutputSampleRate(UINT BasePort, UINT SampleRate) { // This only works for DSP v4.xx ONLY - need a workaround! - DbgPrint("Setting output sample rate\n"); + DPRINT("Setting output sample rate\n"); // WAIT // if (! WaitToSend(BasePort)) @@ -26,7 +24,7 @@ VOID SetOutputSampleRate(UINT BasePort, UINT SampleRate) VOID EnableSpeaker(UINT BasePort, BOOLEAN SpeakerOn) { - DbgPrint("Setting speaker status %d\n", SpeakerOn); + DPRINT("Setting speaker status %d\n", SpeakerOn); // if (! WaitForWrite(BasePort)) // return; @@ -37,7 +35,7 @@ VOID EnableSpeaker(UINT BasePort, BOOLEAN SpeakerOn) BOOLEAN IsSpeakerEnabled(UINT BasePort) { - DbgPrint("Obtaining speaker status\n"); + DPRINT("Obtaining speaker status\n"); // if (! WaitToSend(BasePort)) // return FALSE; @@ -54,7 +52,7 @@ VOID BeginPlayback(UINT BasePort, UINT BitDepth, UINT Channels, UINT BlockSize) { CHAR Command; - DbgPrint("BeginPlayback(%d, %d, %d, %d)\n", BasePort, BitDepth, Channels, BlockSize); + DPRINT("BeginPlayback(%d, %d, %d, %d)\n", BasePort, BitDepth, Channels, BlockSize); // switch(BitDepth) // { @@ -63,7 +61,7 @@ VOID BeginPlayback(UINT BasePort, UINT BitDepth, UINT Channels, UINT BlockSize) // default : Command = 0xc0; // } - DbgPrint("Initiating playback\n"); + DPRINT("Initiating playback\n"); // TEMPORARY: SB_WRITE_BYTE(BasePort, 0xc6); diff --git a/reactos/drivers/dd/sndblst/dma.c b/reactos/drivers/dd/sndblst/dma.c index 3638f4fb308..cf72c558917 100644 --- a/reactos/drivers/dd/sndblst/dma.c +++ b/reactos/drivers/dd/sndblst/dma.c @@ -3,9 +3,6 @@ */ #include - -#include - #include "sndblst.h" @@ -46,7 +43,7 @@ IO_ALLOCATION_ACTION STDCALL SoundProgramDMA( UINT zzz; PUCHAR VirtualAddress = (PUCHAR) MmGetMdlVirtualAddress(Device->Mdl); - DbgPrint("IoMapTransfer\n"); + DPRINT("IoMapTransfer\n"); IoMapTransfer(Device->Adapter, Device->Mdl, MapRegisterBase, @@ -54,14 +51,14 @@ IO_ALLOCATION_ACTION STDCALL SoundProgramDMA( &Device->BufferSize, // is this right? TRUE); - DbgPrint("VBuffer == 0x%x (really 0x%x?) Bufsize == %u\n", Device->VirtualBuffer, MmGetPhysicalAddress(Device->VirtualBuffer), Device->BufferSize); + DPRINT("VBuffer == 0x%x (really 0x%x?) Bufsize == %u\n", Device->VirtualBuffer, MmGetPhysicalAddress(Device->VirtualBuffer), Device->BufferSize); - DbgPrint("Writing %u bytes of garbage...\n", Device->BufferSize); + DPRINT("Writing %u bytes of garbage...\n", Device->BufferSize); // Write some garbage: for (zzz = 0; zzz < Device->BufferSize; zzz ++) *(VirtualAddress + zzz) = (UCHAR) zzz % 200; - DbgPrint("done\n"); + DPRINT("done\n"); KeSetEvent(Context, 0, FALSE); @@ -79,7 +76,7 @@ BOOLEAN CreateDMA(PDEVICE_OBJECT DeviceObject) // Buffersize should already be set but it isn't yet ! Device->BufferSize = SB_BUFSIZE; - DbgPrint("Bufsize == %u\n", Device->BufferSize); + DPRINT("Bufsize == %u\n", Device->BufferSize); RtlZeroMemory(&Desc, sizeof(DEVICE_DESCRIPTION)); @@ -102,74 +99,74 @@ BOOLEAN CreateDMA(PDEVICE_OBJECT DeviceObject) // Desc.MinimumLength = 0; Desc.DmaPort = 0; - DbgPrint("Calling HalGetAdapter(), asking for %d mapped regs\n", MappedRegs); + DPRINT("Calling HalGetAdapter(), asking for %d mapped regs\n", MappedRegs); Device->Adapter = HalGetAdapter(&Desc, &MappedRegs); - DbgPrint("Called\n"); + DPRINT("Called\n"); if (! Device->Adapter) { - DbgPrint("HalGetAdapter() FAILED\n"); + DPRINT("HalGetAdapter() FAILED\n"); return FALSE; } - DbgPrint("Bufsize == %u\n", Device->BufferSize); + DPRINT("Bufsize == %u\n", Device->BufferSize); if (MappedRegs < BYTES_TO_PAGES(Device->BufferSize)) { - DbgPrint("Could only allocate %u mapping registers\n", MappedRegs); + DPRINT("Could only allocate %u mapping registers\n", MappedRegs); if (MappedRegs == 0) return FALSE; Device->BufferSize = MappedRegs * PAGE_SIZE; - DbgPrint("Bufsize == %u\n", Device->BufferSize); + DPRINT("Bufsize == %u\n", Device->BufferSize); } - DbgPrint("Allocated %u mapping registers\n", MappedRegs); + DPRINT("Allocated %u mapping registers\n", MappedRegs); // Check if we already have memory here... // Check to make sure we're >= minimum - DbgPrint("Allocating buffer\n"); + DPRINT("Allocating buffer\n"); - DbgPrint("Bufsize == %u\n", Device->BufferSize); + DPRINT("Bufsize == %u\n", Device->BufferSize); Device->VirtualBuffer = HalAllocateCommonBuffer(Device->Adapter, Device->BufferSize, &Device->Buffer, FALSE); // For some reason BufferSize == 0 here?! - DbgPrint("Buffer == 0x%x Bufsize == %u\n", Device->Buffer, Device->BufferSize); + DPRINT("Buffer == 0x%x Bufsize == %u\n", Device->Buffer, Device->BufferSize); if (! Device->VirtualBuffer) { - DbgPrint("Could not allocate buffer :(\n"); + DPRINT("Could not allocate buffer :(\n"); // should try again with smaller buffer... return FALSE; } - DbgPrint("Buffer == 0x%x Bufsize == %u\n", Device->Buffer, Device->BufferSize); + DPRINT("Buffer == 0x%x Bufsize == %u\n", Device->Buffer, Device->BufferSize); - DbgPrint("Calling IoAllocateMdl()\n"); + DPRINT("Calling IoAllocateMdl()\n"); Device->Mdl = IoAllocateMdl(Device->VirtualBuffer, Device->BufferSize, FALSE, FALSE, NULL); - DbgPrint("Bufsize == %u\n", Device->BufferSize); + DPRINT("Bufsize == %u\n", Device->BufferSize); // IS THIS RIGHT: if (! Device->VirtualBuffer) { - DbgPrint("IoAllocateMdl() FAILED\n"); + DPRINT("IoAllocateMdl() FAILED\n"); // Free the HAL buffer return FALSE; } - DbgPrint("VBuffer == 0x%x Mdl == %u Bufsize == %u\n", Device->VirtualBuffer, Device->Mdl, Device->BufferSize); + DPRINT("VBuffer == 0x%x Mdl == %u Bufsize == %u\n", Device->VirtualBuffer, Device->Mdl, Device->BufferSize); - DbgPrint("Calling MmBuildMdlForNonPagedPool\n"); + DPRINT("Calling MmBuildMdlForNonPagedPool\n"); MmBuildMdlForNonPagedPool(Device->Mdl); - DbgPrint("Bufsize == %u\n", Device->BufferSize); + DPRINT("Bufsize == %u\n", Device->BufferSize); // part II: KeInitializeEvent(&DMAEvent, SynchronizationEvent, FALSE); @@ -177,7 +174,7 @@ BOOLEAN CreateDMA(PDEVICE_OBJECT DeviceObject) IoAllocateAdapterChannel(Device->Adapter, DeviceObject, BYTES_TO_PAGES(Device->BufferSize), SoundProgramDMA, &DMAEvent); - DbgPrint("VBuffer == 0x%x Bufsize == %u\n", Device->VirtualBuffer, Device->BufferSize); + DPRINT("VBuffer == 0x%x Bufsize == %u\n", Device->VirtualBuffer, Device->BufferSize); // Lower IRQL KeWaitForSingleObject(&DMAEvent, Executive, KernelMode, FALSE, NULL); diff --git a/reactos/drivers/dd/sndblst/irq.c b/reactos/drivers/dd/sndblst/irq.c index a92887be29e..1448f772ee8 100644 --- a/reactos/drivers/dd/sndblst/irq.c +++ b/reactos/drivers/dd/sndblst/irq.c @@ -1,7 +1,4 @@ #include - -#include - #include "sndblst.h" @@ -65,7 +62,7 @@ BOOLEAN ISR( PDEVICE_OBJECT DeviceObject = (PDEVICE_OBJECT)Context; PDEVICE_EXTENSION Parameters = DeviceObject->DeviceExtension; - DbgPrint("*** Processing ISR ***\n"); + DPRINT("*** Processing ISR ***\n"); // What do we do here then? diff --git a/reactos/drivers/dd/sndblst/portio.c b/reactos/drivers/dd/sndblst/portio.c index e1b3773e2b5..7e12e414e89 100644 --- a/reactos/drivers/dd/sndblst/portio.c +++ b/reactos/drivers/dd/sndblst/portio.c @@ -13,12 +13,11 @@ #include #include "sndblst.h" - BOOLEAN WaitToSend(UINT BasePort) { int TimeOut; - DbgPrint("WaitToSend "); + DPRINT("WaitToSend "); // Check if it's OK to send for (TimeOut = SB_TIMEOUT; @@ -28,11 +27,11 @@ BOOLEAN WaitToSend(UINT BasePort) // If a time-out occurs, we report failure if (! TimeOut) { - DbgPrint("FAILED\n"); + DPRINT("FAILED\n"); return FALSE; } - DbgPrint("SUCCEEDED\n"); + DPRINT("SUCCEEDED\n"); return TRUE; } @@ -41,7 +40,7 @@ BOOLEAN WaitToReceive(UINT BasePort) { int TimeOut; - DbgPrint("WaitToReceive "); + DPRINT("WaitToReceive "); // Check if it's OK to receive for (TimeOut = SB_TIMEOUT; @@ -51,11 +50,11 @@ BOOLEAN WaitToReceive(UINT BasePort) // If a time-out occurs, we report failure if (! TimeOut) { - DbgPrint("FAILED\n"); + DPRINT("FAILED\n"); return FALSE; } - DbgPrint("SUCCEEDED\n"); + DPRINT("SUCCEEDED\n"); return TRUE; } @@ -67,9 +66,9 @@ WORD InitSoundCard(UINT BasePort) BOOLEAN Status; UCHAR DSP_Major, DSP_Minor; - DbgPrint("InitSoundCard() called\n"); + DPRINT("InitSoundCard() called\n"); - DbgPrint("Resetting sound card\n"); + DPRINT("Resetting sound card\n"); // if (!WaitToSend(BasePort)) // return FALSE; @@ -79,7 +78,7 @@ WORD InitSoundCard(UINT BasePort) // Check if it's OK to receive (some cards will ignore the above reset // command and so will not issue an ACK, so time out is NOT an error) - DbgPrint("Waiting for an ACK\n"); + DPRINT("Waiting for an ACK\n"); if (WaitToReceive(BasePort)) { // Check to make sure the reset was acknowledged: @@ -88,7 +87,7 @@ WORD InitSoundCard(UINT BasePort) TimeOut --); } - DbgPrint("Querying DSP version\n"); + DPRINT("Querying DSP version\n"); if (! WaitToSend(BasePort)) return FALSE; @@ -100,9 +99,9 @@ WORD InitSoundCard(UINT BasePort) DSP_Major = SB_READ_DATA(BasePort); DSP_Minor = SB_READ_DATA(BasePort); - DbgPrint("DSP v%d.%d\n", DSP_Major, DSP_Minor); + DPRINT("DSP v%d.%d\n", DSP_Major, DSP_Minor); - DbgPrint("Sound card initialized!\n"); + DPRINT("Sound card initialized!\n"); return (DSP_Major * 256) + DSP_Minor; } diff --git a/reactos/drivers/dd/sndblst/settings.c b/reactos/drivers/dd/sndblst/settings.c index e6783fd6118..983918d7159 100644 --- a/reactos/drivers/dd/sndblst/settings.c +++ b/reactos/drivers/dd/sndblst/settings.c @@ -11,11 +11,7 @@ #include #include - #include "sndblst.h" - -// #define NDEBUG -#include #include "sbdebug.h" // our own debug helper diff --git a/reactos/drivers/dd/sndblst/sndblst.c b/reactos/drivers/dd/sndblst/sndblst.c index 59cfb961624..85f043a564c 100644 --- a/reactos/drivers/dd/sndblst/sndblst.c +++ b/reactos/drivers/dd/sndblst/sndblst.c @@ -12,12 +12,7 @@ /* INCLUDES ****************************************************************/ #include -//#include - -//#define NDEBUG -#include #include - #include "sndblst.h" diff --git a/reactos/drivers/dd/sndblst/sndblst.h b/reactos/drivers/dd/sndblst/sndblst.h index d3a0a267299..39f26614f77 100644 --- a/reactos/drivers/dd/sndblst/sndblst.h +++ b/reactos/drivers/dd/sndblst/sndblst.h @@ -14,6 +14,9 @@ #include +#define NDEBUG +#include + #define DEFAULT_PORT 0x220 #define DEFAULT_IRQ 5 #define DEFAULT_DMA 1 From 50c2bd5cc24e3f5118af40db4a30dab2c75fd63e Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sun, 28 Mar 2004 21:04:00 +0000 Subject: [PATCH 0678/1463] avoid GCC complaining about: "ISO C++ says that `String XMLStorage::XMLNode::operator[](const char *) const' and `String & XMLStorage::XMLNode::operator[](const String &)' are ambiguous even though the worst conversion for the former is better than the worst conversion for the latter svn path=/trunk/; revision=8911 --- reactos/subsys/system/explorer/utility/xmlstorage.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.h b/reactos/subsys/system/explorer/utility/xmlstorage.h index 9ec09ef302a..1ce331c4d47 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.h +++ b/reactos/subsys/system/explorer/utility/xmlstorage.h @@ -366,6 +366,7 @@ struct XMLNode : public String } #ifdef UNICODE +#ifndef __GNUC__ // avoid GCC complaining about: "ISO C++ says that `String XMLStorage::XMLNode::operator[](const char *) const' and `String & XMLStorage::XMLNode::operator[](const String &)' are ambiguous even though the worst conversion for the former is better than the worst conversion for the latter /// read only access to an attribute String operator[](const char* attr_name) const { @@ -376,6 +377,7 @@ struct XMLNode : public String else return TEXT(""); } +#endif /// convenient value access in children node String value(const char* name, const char* attr_name) const From 4309d1082eab8aadd5ba2f51a852b95f23e83fd8 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sun, 28 Mar 2004 21:46:26 +0000 Subject: [PATCH 0679/1463] Partly (not working) implementation of TransparentBlt() svn path=/trunk/; revision=8912 --- reactos/iface/addsys/w32ksvc.db | 1 + reactos/include/win32k/bitmaps.h | 17 ++++ reactos/lib/gdi32/objects/bitblt.c | 90 ++---------------- reactos/subsys/win32k/ntuser/msgqueue.c | 4 +- reactos/subsys/win32k/ntuser/window.c | 4 +- reactos/subsys/win32k/objects/bitmaps.c | 119 +++++++++++++++++++++++- 6 files changed, 145 insertions(+), 90 deletions(-) diff --git a/reactos/iface/addsys/w32ksvc.db b/reactos/iface/addsys/w32ksvc.db index 3a28544c83a..7d408072e4d 100644 --- a/reactos/iface/addsys/w32ksvc.db +++ b/reactos/iface/addsys/w32ksvc.db @@ -274,6 +274,7 @@ NtGdiStrokeAndFillPath 1 NtGdiStrokePath 1 NtGdiSwapBuffers 1 NtGdiTextOut 5 +NtGdiTransparentBlt 11 NtGdiTranslateCharsetInfo 3 NtGdiUnrealizeObject 2 NtGdiUpdateColors 1 diff --git a/reactos/include/win32k/bitmaps.h b/reactos/include/win32k/bitmaps.h index bbd9f917e87..3e2282fb6bb 100644 --- a/reactos/include/win32k/bitmaps.h +++ b/reactos/include/win32k/bitmaps.h @@ -304,5 +304,22 @@ NtGdiStretchDIBits ( UINT Usage, DWORD ROP ); + +BOOL +STDCALL +NtGdiTransparentBlt( + HDC hdcDst, + INT xDst, + INT yDst, + INT cxDst, + INT cyDst, + HDC hdcSrc, + INT xSrc, + INT ySrc, + INT cxSrc, + INT cySrc, + COLORREF TransColor + ); + #endif diff --git a/reactos/lib/gdi32/objects/bitblt.c b/reactos/lib/gdi32/objects/bitblt.c index acd6804f487..fa811ce72e0 100644 --- a/reactos/lib/gdi32/objects/bitblt.c +++ b/reactos/lib/gdi32/objects/bitblt.c @@ -1,13 +1,10 @@ -/* $Id: bitblt.c,v 1.19 2004/03/24 00:13:31 royce Exp $ +/* $Id: bitblt.c,v 1.20 2004/03/28 21:46:26 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries * FILE: lib/gdi32/object/bitblt.c * PURPOSE: * PROGRAMMER: - * - * GdiTransparentBlt Copyright Kevin Koltzau - * adapted from WINE 2-13-04 */ #ifdef UNICODE @@ -396,87 +393,12 @@ PolyPatBlt(HDC hDC,DWORD dwRop,PPATRECT pRects,int cRects,ULONG Reserved) */ WINBOOL STDCALL -GdiTransparentBlt( HDC hdcDst, int xDst, int yDst, int cxDst, int cyDst, - HDC hdcSrc, int xSrc, int ySrc, int cxSrc, int cySrc, - COLORREF TransColor ) +GdiTransparentBlt(HDC hdcDst, int xDst, int yDst, int cxDst, int cyDst, + HDC hdcSrc, int xSrc, int ySrc, int cxSrc, int cySrc, + COLORREF TransColor) { - BOOL ret = FALSE; - HDC hdcWork; - HBITMAP bmpWork; - HGDIOBJ oldWork; - HDC hdcMask = NULL; - HBITMAP bmpMask = NULL; - HBITMAP oldMask = NULL; - COLORREF oldBackground; - COLORREF oldForeground; - int oldStretchMode; - - if(cxDst < 0 || cyDst < 0 || cxSrc < 0 || cySrc < 0) { - DPRINT("Can not mirror\n"); - return FALSE; - } - - oldBackground = SetBkColor(hdcDst, RGB(255,255,255)); - oldForeground = SetTextColor(hdcDst, RGB(0,0,0)); - - /* Stretch bitmap */ - oldStretchMode = GetStretchBltMode(hdcSrc); - if(oldStretchMode == BLACKONWHITE || oldStretchMode == WHITEONBLACK) - SetStretchBltMode(hdcSrc, COLORONCOLOR); - hdcWork = CreateCompatibleDC(hdcDst); - bmpWork = CreateCompatibleBitmap(hdcDst, cxDst, cyDst); - oldWork = SelectObject(hdcWork, bmpWork); - if(!StretchBlt(hdcWork, 0, 0, cxDst, cyDst, hdcSrc, xSrc, ySrc, cxSrc, cySrc, SRCCOPY)) { - DPRINT("Failed to stretch\n"); - goto error; - } - SetBkColor(hdcWork, TransColor); - - /* Create mask */ - hdcMask = CreateCompatibleDC(hdcDst); - bmpMask = CreateCompatibleBitmap(hdcMask, cxDst, cyDst); - oldMask = SelectObject(hdcMask, bmpMask); - if(!BitBlt(hdcMask, 0, 0, cxDst, cyDst, hdcWork, 0, 0, SRCCOPY)) { - DPRINT("Failed to create mask\n"); - goto error; - } - - /* Replace transparent color with black */ - SetBkColor(hdcWork, RGB(0,0,0)); - SetTextColor(hdcWork, RGB(255,255,255)); - if(!BitBlt(hdcWork, 0, 0, cxDst, cyDst, hdcMask, 0, 0, SRCAND)) { - DPRINT("Failed to mask out background\n"); - goto error; - } - - /* Replace non-transparent area on destination with black */ - if(!BitBlt(hdcDst, xDst, yDst, cxDst, cyDst, hdcMask, 0, 0, SRCAND)) { - DPRINT("Failed to clear destination area\n"); - goto error; - } - - /* Draw the image */ - if(!BitBlt(hdcDst, xDst, yDst, cxDst, cyDst, hdcWork, 0, 0, SRCPAINT)) { - DPRINT("Failed to paint image\n"); - goto error; - } - - ret = TRUE; -error: - SetStretchBltMode(hdcSrc, oldStretchMode); - SetBkColor(hdcDst, oldBackground); - SetTextColor(hdcDst, oldForeground); - if(hdcWork) { - SelectObject(hdcWork, oldWork); - DeleteDC(hdcWork); - } - if(bmpWork) DeleteObject(bmpWork); - if(hdcMask) { - SelectObject(hdcMask, oldMask); - DeleteDC(hdcMask); - } - if(bmpMask) DeleteObject(bmpMask); - return ret; + return (WINBOOL)NtGdiTransparentBlt(hdcDst, xDst, yDst, cxDst, cyDst, hdcSrc, + xSrc, ySrc, cxSrc, cySrc, TransColor); } /* diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index bc1c335253b..7e8acfd9f40 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.78 2004/03/28 16:21:58 weiden Exp $ +/* $Id: msgqueue.c,v 1.79 2004/03/28 21:46:26 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -842,7 +842,7 @@ MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) IntLockMessageQueue(MessageQueue); if (IsListEmpty(&MessageQueue->SentMessagesListHead)) { - ExReleaseFastMutex(&MessageQueue->Lock); + IntUnLockMessageQueue(MessageQueue); return(FALSE); } Entry = RemoveHeadList(&MessageQueue->SentMessagesListHead); diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 6eb1d317579..6592b00d3cf 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.201 2004/03/23 21:47:37 weiden Exp $ +/* $Id: window.c,v 1.202 2004/03/28 21:46:26 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -3410,7 +3410,6 @@ IntGetWindowRgn(HWND hWnd, HRGN hRgn) if(!hRgn) { IntReleaseWindowObject(WindowObject); - SetLastWin32Error(ERROR_INVALID_PARAMETER); return ERROR; } @@ -3453,7 +3452,6 @@ IntGetWindowRgnBox(HWND hWnd, RECT *Rect) if(!Rect) { IntReleaseWindowObject(WindowObject); - SetLastWin32Error(ERROR_INVALID_PARAMETER); return ERROR; } diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index 9de50b601c8..77a8a77ac63 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.64 2004/03/22 20:46:33 royce Exp $ */ +/* $Id: bitmaps.c,v 1.65 2004/03/28 21:46:26 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -263,6 +263,123 @@ NtGdiBitBlt( return Status; } +BOOL STDCALL +NtGdiTransparentBlt( + HDC hdcDst, + INT xDst, + INT yDst, + INT cxDst, + INT cyDst, + HDC hdcSrc, + INT xSrc, + INT ySrc, + INT cxSrc, + INT cySrc, + COLORREF TransColor) +{ + PDC DCDest, DCSrc; + RECT rcDest, rcSrc; + PSURFOBJ SurfDest, SurfSrc; + PSURFGDI SurfGDIDest, SurfGDISrc; + PXLATEOBJ XlateObj; + HPALETTE SourcePalette, DestPalette; + PPALGDI PalDestGDI, PalSourceGDI; + USHORT PalDestMode, PalSrcMode; + + if(!(DCDest = DC_LockDc(hdcDst))) + { + DPRINT1("Invalid destination dc handle (0x%08x) passed to NtGdiTransparentBlt\n", hdcDst); + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } + + if((hdcDst != hdcSrc) && !(DCSrc = DC_LockDc(hdcSrc))) + { + DC_UnlockDc(hdcDst); + DPRINT1("Invalid source dc handle (0x%08x) passed to NtGdiTransparentBlt\n", hdcSrc); + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } + if(hdcDst == hdcSrc) + { + DCSrc = DCDest; + } + + if(DCDest->w.hPalette) + DestPalette = DCDest->w.hPalette; + else + DestPalette = NtGdiGetStockObject(DEFAULT_PALETTE); + + if(DCSrc->w.hPalette) + SourcePalette = DCSrc->w.hPalette; + else + SourcePalette = NtGdiGetStockObject(DEFAULT_PALETTE); + + if(!(PalSourceGDI = PALETTE_LockPalette(SourcePalette))) + { + DC_UnlockDc(hdcSrc); + DC_UnlockDc(hdcDst); + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } + if((DestPalette != SourcePalette) && !(PalDestGDI = PALETTE_LockPalette(DestPalette))) + { + PALETTE_UnlockPalette(SourcePalette); + DC_UnlockDc(hdcSrc); + DC_UnlockDc(hdcDst); + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } + if(DestPalette != SourcePalette) + { + PalDestMode = PalDestGDI->Mode; + PalSrcMode = PalSourceGDI->Mode; + PALETTE_UnlockPalette(DestPalette); + } + else + { + PalDestMode = PalSrcMode = PalSourceGDI->Mode; + } + PALETTE_UnlockPalette(SourcePalette); + + XlateObj = (PXLATEOBJ)IntEngCreateXlate(PalDestMode, PalSrcMode, DestPalette, SourcePalette); + + SurfDest = (PSURFOBJ)AccessUserObject((ULONG)DCDest->Surface); + ASSERT(SurfDest); + SurfGDIDest = (PSURFGDI)AccessInternalObjectFromUserObject(SurfDest); + ASSERT(SurfGDIDest); + SurfSrc = (PSURFOBJ)AccessUserObject((ULONG)DCSrc->Surface); + ASSERT(SurfSrc); + SurfGDISrc = (PSURFGDI)AccessInternalObjectFromUserObject(SurfSrc); + ASSERT(SurfGDISrc); + + rcDest.left = xDst; + rcDest.top = yDst; + rcDest.right = rcDest.left + cxDst; + rcDest.bottom = rcDest.bottom + cyDst; + rcSrc.left = xSrc; + rcSrc.top = ySrc; + rcSrc.right = rcDest.left + cxSrc; + rcSrc.bottom = rcDest.bottom + cySrc; + + if((cxDst != cxSrc) || (cyDst != cySrc)) + { + /* FIXME - Create a temporary bitmap and stretchblt it */ + } + + + DC_UnlockDc(hdcSrc); + if(hdcDst != hdcSrc) + { + DC_UnlockDc(hdcDst); + } + if(XlateObj) + { + EngDeleteXlate(XlateObj); + } + return TRUE; +} + HBITMAP STDCALL NtGdiCreateBitmap( INT Width, From 77684eece7be2cfd0f2d7013026998ce0adb3e15 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sun, 28 Mar 2004 22:17:49 +0000 Subject: [PATCH 0680/1463] compiler friendly access operator implemantation svn path=/trunk/; revision=8913 --- .../system/explorer/taskbar/traynotify.cpp | 10 ++++---- .../system/explorer/utility/xmlstorage.h | 25 +++++-------------- 2 files changed, 11 insertions(+), 24 deletions(-) diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index 9ad323c0cce..841aec1c757 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -234,11 +234,11 @@ void NotifyArea::read_config() NotifyIconConfig cfg; - cfg._name = node["name"]; - cfg._tipText = node["text"]; - cfg._windowTitle = node["window"]; - cfg._modulePath = node["module"]; - const string& mode = node["show"]; + cfg._name = node.get("name"); + cfg._tipText = node.get("text"); + cfg._windowTitle = node.get("window"); + cfg._modulePath = node.get("module"); + const string& mode = node.get("show"); if (mode == "show") cfg._mode = NIM_SHOW; diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.h b/reactos/subsys/system/explorer/utility/xmlstorage.h index 1ce331c4d47..9ea5bd75d2f 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.h +++ b/reactos/subsys/system/explorer/utility/xmlstorage.h @@ -331,7 +331,7 @@ struct XMLNode : public String } /// read only access to an attribute - String operator[](const String& attr_name) const + template String get(const T& attr_name) const { AttributeMap::const_iterator found = _attributes.find(attr_name); @@ -347,7 +347,7 @@ struct XMLNode : public String const XMLNode* node = find_first(name); if (node) - return (*node)[attr_name]; + return node->get(attr_name); else return TEXT(""); } @@ -366,26 +366,13 @@ struct XMLNode : public String } #ifdef UNICODE -#ifndef __GNUC__ // avoid GCC complaining about: "ISO C++ says that `String XMLStorage::XMLNode::operator[](const char *) const' and `String & XMLStorage::XMLNode::operator[](const String &)' are ambiguous even though the worst conversion for the former is better than the worst conversion for the latter - /// read only access to an attribute - String operator[](const char* attr_name) const - { - AttributeMap::const_iterator found = _attributes.find(attr_name); - - if (found != _attributes.end()) - return found->second; - else - return TEXT(""); - } -#endif - /// convenient value access in children node String value(const char* name, const char* attr_name) const { const XMLNode* node = find_first(name); if (node) - return (*node)[attr_name]; + return node->get(attr_name); else return TEXT(""); } @@ -468,7 +455,7 @@ protected: for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) { const XMLNode& node = **it; - if (node==name && node[attr_name]==attr_value) + if (node==name && node.get(attr_name)==attr_value) return *it; } @@ -491,7 +478,7 @@ protected: for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) { const XMLNode& node = **it; - if (node==name && node[attr_name]==attr_value) + if (node==name && node.get(attr_name)==attr_value) return *it; } @@ -646,7 +633,7 @@ struct XMLPos /// attribute access String& operator[](const String& attr_name) {return (*_cur)[attr_name];} - String operator[](const String& attr_name) const {return (*_cur)[attr_name];} + template String get(const T& attr_name) const {return (*_cur)[attr_name];} /// insert children when building tree void add_down(XMLNode* child) From cdaaa650965df8258f1e2d37f748107417c7d95f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sun, 28 Mar 2004 22:39:59 +0000 Subject: [PATCH 0681/1463] Simple font substitution and matching svn path=/trunk/; revision=8914 --- reactos/subsys/win32k/objects/text.c | 247 +++++++++++++++++++-------- 1 file changed, 172 insertions(+), 75 deletions(-) diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index f6899c0e9e5..03e215464b8 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.85 2004/03/27 00:35:02 weiden Exp $ */ +/* $Id: text.c,v 1.86 2004/03/28 22:39:59 gvg Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -1057,6 +1057,7 @@ FontFamilyFillInfo(PFONTFAMILYINFO Info, PCWSTR FaceName, PFONTGDI FontGDI) Lf->lfHeight = TM->tmHeight; Lf->lfWidth = TM->tmAveCharWidth; Lf->lfWeight = TM->tmWeight; + Lf->lfItalic = TM->tmItalic; Lf->lfPitchAndFamily = (TM->tmPitchAndFamily & 0xf1) + 1; Lf->lfCharSet = TM->tmCharSet; Lf->lfOutPrecision = OUT_STROKE_PRECIS; @@ -2566,93 +2567,189 @@ NtGdiTextOut( return NtGdiExtTextOut(hDC, XStart, YStart, 0, NULL, String, Count, NULL); } +static UINT FASTCALL +GetFontScore(LOGFONTW *LogFont, PUNICODE_STRING FaceName, PFONTGDI FontGDI) +{ + ANSI_STRING EntryFaceNameA; + UNICODE_STRING EntryFaceNameW; + unsigned Size; + OUTLINETEXTMETRICW *Otm; + LONG WeightDiff; + NTSTATUS Status; + UINT Score = 1; + + RtlInitAnsiString(&EntryFaceNameA, FontGDI->face->family_name); + Status = RtlAnsiStringToUnicodeString(&EntryFaceNameW, &EntryFaceNameA, TRUE); + if (NT_SUCCESS(Status)) + { + if ((LF_FACESIZE - 1) * sizeof(WCHAR) < EntryFaceNameW.Length) + { + EntryFaceNameW.Length = (LF_FACESIZE - 1) * sizeof(WCHAR); + EntryFaceNameW.Buffer[LF_FACESIZE - 1] = L'\0'; + } + if (0 == RtlCompareUnicodeString(FaceName, &EntryFaceNameW, TRUE)) + { + Score += 49; + } + RtlFreeUnicodeString(&EntryFaceNameW); + } + + Size = IntGetOutlineTextMetrics(FontGDI, 0, NULL); + Otm = ExAllocatePoolWithTag(PagedPool, Size, TAG_GDITEXT); + if (NULL == Otm) + { + return Score; + } + IntGetOutlineTextMetrics(FontGDI, Size, Otm); + + if ((0 != LogFont->lfItalic && 0 != Otm->otmTextMetrics.tmItalic) || + (0 == LogFont->lfItalic && 0 == Otm->otmTextMetrics.tmItalic)) + { + Score += 25; + } + if (LogFont->lfWeight < Otm->otmTextMetrics.tmWeight) + { + WeightDiff = Otm->otmTextMetrics.tmWeight - LogFont->lfWeight; + } + else + { + WeightDiff = LogFont->lfWeight - Otm->otmTextMetrics.tmWeight; + } + Score += (1000 - WeightDiff) / (1000 / 25); + + ExFreePool(Otm); + + return Score; +} + +static VOID FASTCALL +FindBestFontFromList(HFONT *Font, UINT *MatchScore, LOGFONTW *LogFont, + PUNICODE_STRING FaceName, PLIST_ENTRY Head) +{ + PLIST_ENTRY Entry; + PFONT_ENTRY CurrentEntry; + PFONTGDI FontGDI; + UINT Score; + + Entry = Head->Flink; + while (Entry != Head) + { + CurrentEntry = (PFONT_ENTRY) CONTAINING_RECORD(Entry, FONT_ENTRY, ListEntry); + if (NULL == (FontGDI = AccessInternalObject((ULONG) CurrentEntry->hFont))) + { + Entry = Entry->Flink; + continue; + } + Score = GetFontScore(LogFont, FaceName, FontGDI); + if (*MatchScore < Score) + { + *Font = CurrentEntry->hFont; + *MatchScore = Score; + } + Entry = Entry->Flink; + } +} + +static BOOLEAN FASTCALL +SubstituteFontFamilyKey(PUNICODE_STRING FaceName, + LPCWSTR Key) +{ + RTL_QUERY_REGISTRY_TABLE QueryTable[2]; + NTSTATUS Status; + UNICODE_STRING Value; + + RtlInitUnicodeString(&Value, NULL); + + QueryTable[0].QueryRoutine = NULL; + QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_NOEXPAND | + RTL_QUERY_REGISTRY_REQUIRED; + QueryTable[0].Name = FaceName->Buffer; + QueryTable[0].EntryContext = &Value; + QueryTable[0].DefaultType = REG_NONE; + QueryTable[0].DefaultData = NULL; + QueryTable[0].DefaultLength = 0; + + QueryTable[1].QueryRoutine = NULL; + QueryTable[1].Name = NULL; + + Status = RtlQueryRegistryValues(RTL_REGISTRY_WINDOWS_NT, + Key, + QueryTable, + NULL, + NULL); + if (NT_SUCCESS(Status)) + { + RtlFreeUnicodeString(FaceName); + *FaceName = Value; + } + + return NT_SUCCESS(Status); +} + +static void FASTCALL +SubstituteFontFamily(PUNICODE_STRING FaceName, UINT Level) +{ + if (10 < Level) /* Enough is enough */ + { + return; + } + + if (SubstituteFontFamilyKey(FaceName, L"SysFontSubstitutes") || + SubstituteFontFamilyKey(FaceName, L"FontSubstitutes")) + { + SubstituteFontFamily(FaceName, Level + 1); + } +} + NTSTATUS FASTCALL TextIntRealizeFont(HFONT FontHandle) { NTSTATUS Status = STATUS_SUCCESS; PTEXTOBJ TextObj; UNICODE_STRING FaceName; - PLIST_ENTRY Entry; - PFONT_ENTRY CurrentEntry; PW32PROCESS Win32Process; - BOOL Private = FALSE; + UINT MatchScore; TextObj = TEXTOBJ_LockText(FontHandle); - ASSERT(TextObj); - if (NULL != TextObj) + if (NULL == TextObj) { - RtlInitUnicodeString(&FaceName, TextObj->logfont.lfFaceName); - - /* find font in private fonts */ - Win32Process = PsGetWin32Process(); - - IntLockProcessPrivateFonts(Win32Process); - - Entry = Win32Process->PrivateFontListHead.Flink; - while(Entry != &Win32Process->PrivateFontListHead) - { - CurrentEntry = (PFONT_ENTRY)CONTAINING_RECORD(Entry, FONT_ENTRY, ListEntry); - - if (0 == RtlCompareUnicodeString(&CurrentEntry->FaceName, &FaceName, TRUE)) - { - TextObj->GDIFontHandle = CurrentEntry->hFont; - Private = TRUE; - goto check; - } - Entry = Entry->Flink; + return STATUS_INVALID_HANDLE; } - IntUnLockProcessPrivateFonts(Win32Process); - - /* find font in system fonts */ - IntLockGlobalFonts; - - Entry = FontListHead.Flink; - while(Entry != &FontListHead) - { - CurrentEntry = (PFONT_ENTRY)CONTAINING_RECORD(Entry, FONT_ENTRY, ListEntry); - - if (0 == RtlCompareUnicodeString(&CurrentEntry->FaceName, &FaceName, TRUE)) - { - TextObj->GDIFontHandle = CurrentEntry->hFont; - break; - } - Entry = Entry->Flink; - } - - check: - if (NULL == TextObj->GDIFontHandle) - { - Entry = (Private ? Win32Process->PrivateFontListHead.Flink : FontListHead.Flink); - - if(Entry != (Private ? &Win32Process->PrivateFontListHead : &FontListHead)) - { - DPRINT("Requested font %S not found, using first available font\n", - TextObj->logfont.lfFaceName) - CurrentEntry = (PFONT_ENTRY)CONTAINING_RECORD(Entry, FONT_ENTRY, ListEntry); - TextObj->GDIFontHandle = CurrentEntry->hFont; - } - else - { - DPRINT1("Requested font %S not found, no fonts loaded at all\n", - TextObj->logfont.lfFaceName); - Status = STATUS_NOT_FOUND; - } - - } - - if(Private) - IntUnLockProcessPrivateFonts(Win32Process); - else - IntUnLockGlobalFonts; - ASSERT(! NT_SUCCESS(Status) || NULL != TextObj->GDIFontHandle); + if (! RtlCreateUnicodeString(&FaceName, TextObj->logfont.lfFaceName)) + { + TEXTOBJ_UnlockText(FontHandle); + return STATUS_NO_MEMORY; + } + SubstituteFontFamily(&FaceName, 0); + MatchScore = 0; + TextObj->GDIFontHandle = NULL; + + /* First search private fonts */ + Win32Process = PsGetWin32Process(); + IntLockProcessPrivateFonts(Win32Process); + FindBestFontFromList(&TextObj->GDIFontHandle, &MatchScore, + &TextObj->logfont, &FaceName, + &Win32Process->PrivateFontListHead); + IntUnLockProcessPrivateFonts(Win32Process); + + /* Search system fonts */ + IntLockGlobalFonts; + FindBestFontFromList(&TextObj->GDIFontHandle, &MatchScore, + &TextObj->logfont, &FaceName, + &FontListHead); + IntUnLockGlobalFonts; - TEXTOBJ_UnlockText(FontHandle); - } - else - { - Status = STATUS_INVALID_HANDLE; - } + if (NULL == TextObj->GDIFontHandle) + { + DPRINT1("Requested font %S not found, no fonts loaded at all\n", + TextObj->logfont.lfFaceName); + Status = STATUS_NOT_FOUND; + } + + RtlFreeUnicodeString(&FaceName); + TEXTOBJ_UnlockText(FontHandle); + ASSERT(! NT_SUCCESS(Status) || NULL != TextObj->GDIFontHandle); return Status; } From acc112d9d4a95b43fcf4dcd9515353bfc1cd1854 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sun, 28 Mar 2004 23:24:57 +0000 Subject: [PATCH 0682/1463] - Fixed non-SRCCOPY BitBlts to 1bpp surfaces. svn path=/trunk/; revision=8915 --- reactos/subsys/win32k/dib/dib1bpp.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib1bpp.c b/reactos/subsys/win32k/dib/dib1bpp.c index 9c8f3213035..7cdacd83ad8 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.15 2004/03/21 04:17:33 royce Exp $ */ +/* $Id: dib1bpp.c,v 1.16 2004/03/28 23:24:57 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include @@ -376,9 +376,12 @@ DIB_1BPP_BitBlt( if (UsesSource) { Source = 0; - for (k = 0; k < 32; k++) + for (k = 0; k < 8; k++) { - Source |= (DIB_GetSource(SourceSurf, SourceGDI, sx + (i - DestRect->left) + k, sy, ColorTranslation) << k); + Source |= (DIB_GetSource(SourceSurf, SourceGDI, sx + (i - DestRect->left) + k, sy, ColorTranslation) << (7 - k)); + Source |= (DIB_GetSource(SourceSurf, SourceGDI, sx + (i - DestRect->left) + k + 8, sy, ColorTranslation) << (8 + (7 - k))); + Source |= (DIB_GetSource(SourceSurf, SourceGDI, sx + (i - DestRect->left) + k + 16, sy, ColorTranslation) << (16 + (7 - k))); + Source |= (DIB_GetSource(SourceSurf, SourceGDI, sx + (i - DestRect->left) + k + 24, sy, ColorTranslation) << (24 + (7 - k))); } } if (UsesPattern) From a1f1c3b257ae5976c43fad2d1aa2b31e07324264 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sun, 28 Mar 2004 23:25:48 +0000 Subject: [PATCH 0683/1463] - Fixed BitBlts from 4bpp surfaces. svn path=/trunk/; revision=8916 --- reactos/subsys/win32k/dib/dib16bpp.c | 4 ++-- reactos/subsys/win32k/dib/dib24bpp.c | 4 ++-- reactos/subsys/win32k/dib/dib32bpp.c | 4 ++-- reactos/subsys/win32k/dib/dib8bpp.c | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib16bpp.c b/reactos/subsys/win32k/dib/dib16bpp.c index a9abbe97c8f..94e79c817b1 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.20 2004/03/26 23:48:47 weiden Exp $ */ +/* $Id: dib16bpp.c,v 1.21 2004/03/28 23:25:48 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -122,7 +122,7 @@ DIB_16BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, for (i=DestRect->left; iright; i++) { xColor = XLATEOBJ_iXlate(ColorTranslation, - (*SourceLine_4BPP & altnotmask[sx&1]) >> (4 * (1-(sx & 1)))); + (*SourceLine_4BPP & altnotmask[f1]) >> (4 * (1 - f1))); DIB_16BPP_PutPixel(DestSurf, i, j, xColor); if(f1 == 1) { SourceLine_4BPP++; f1 = 0; } else { f1 = 1; } sx++; diff --git a/reactos/subsys/win32k/dib/dib24bpp.c b/reactos/subsys/win32k/dib/dib24bpp.c index 66d0b4d7f21..bb0aec678ca 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.16 2004/01/08 20:59:42 navaraf Exp $ */ +/* $Id: dib24bpp.c,v 1.17 2004/03/28 23:25:48 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -122,7 +122,7 @@ DIB_24BPP_BitBltSrcCopy( SURFOBJ *DestSurf, SURFOBJ *SourceSurf, for (i=DestRect->left; iright; i++) { xColor = XLATEOBJ_iXlate(ColorTranslation, - (*SourceLine_4BPP & altnotmask[sx&1]) >> (4 * (1-(sx & 1)))); + (*SourceLine_4BPP & altnotmask[f1]) >> (4 * (1 - f1))); *DestLine++ = xColor & 0xff; *(PWORD)DestLine = xColor >> 8; DestLine += 2; diff --git a/reactos/subsys/win32k/dib/dib32bpp.c b/reactos/subsys/win32k/dib/dib32bpp.c index 500b878ee5a..d8a971f2ddc 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.13 2004/03/26 23:48:47 weiden Exp $ */ +/* $Id: dib32bpp.c,v 1.14 2004/03/28 23:25:48 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -121,7 +121,7 @@ DIB_32BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, for (i=DestRect->left; iright; i++) { xColor = XLATEOBJ_iXlate(ColorTranslation, - (*SourceLine_4BPP & altnotmask[sx&1]) >> (4 * (1-(sx & 1)))); + (*SourceLine_4BPP & altnotmask[f1]) >> (4 * (1 - f1))); DIB_32BPP_PutPixel(DestSurf, i, j, xColor); if(f1 == 1) { SourceLine_4BPP++; f1 = 0; } else { f1 = 1; } sx++; diff --git a/reactos/subsys/win32k/dib/dib8bpp.c b/reactos/subsys/win32k/dib/dib8bpp.c index dcea5c29e1d..7a64a801c30 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.15 2004/03/26 23:48:47 weiden Exp $ */ +/* $Id: dib8bpp.c,v 1.16 2004/03/28 23:25:48 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -119,7 +119,7 @@ DIB_8BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, for (i=DestRect->left; iright; i++) { xColor = XLATEOBJ_iXlate(ColorTranslation, - (*SourceLine_4BPP & altnotmask[sx&1]) >> (4 * (1-(sx & 1)))); + (*SourceLine_4BPP & altnotmask[f1]) >> (4 * (1 - f1))); DIB_8BPP_PutPixel(DestSurf, i, j, xColor); if(f1 == 1) { SourceLine_4BPP++; f1 = 0; } else { f1 = 1; } sx++; From d6c2152ba925c6e6554161f037f538f574096284 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Mon, 29 Mar 2004 06:38:50 +0000 Subject: [PATCH 0684/1463] - Fixed handling of WM_GETICON message. - Don't allow destroying icons of foreign processes. svn path=/trunk/; revision=8917 --- reactos/lib/user32/windows/defwnd.c | 4 ++-- reactos/subsys/win32k/objects/cursoricon.c | 18 +++++++++++------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/reactos/lib/user32/windows/defwnd.c b/reactos/lib/user32/windows/defwnd.c index 035fabbba3c..1ca78e99d13 100644 --- a/reactos/lib/user32/windows/defwnd.c +++ b/reactos/lib/user32/windows/defwnd.c @@ -1,4 +1,4 @@ -/* $Id: defwnd.c,v 1.124 2004/02/22 23:40:58 gvg Exp $ +/* $Id: defwnd.c,v 1.125 2004/03/29 06:38:50 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -1384,7 +1384,7 @@ User32DefWindowProc(HWND hWnd, case WM_GETICON: { - INT Index = (wParam != 0) ? GCL_HICON : GCL_HICONSM; + INT Index = (wParam == ICON_BIG) ? GCL_HICON : GCL_HICONSM; return (GetClassLongW(hWnd, Index)); } diff --git a/reactos/subsys/win32k/objects/cursoricon.c b/reactos/subsys/win32k/objects/cursoricon.c index fd8c54e2034..d5fc5bf67be 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.51 2004/03/15 20:21:51 navaraf Exp $ */ +/* $Id: cursoricon.c,v 1.52 2004/03/29 06:38:50 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -368,7 +368,12 @@ IntDestroyCurIconObject(PWINSTATION_OBJECT WinStaObject, HANDLE Handle, BOOL Rem return FALSE; } - if(WinStaObject->SystemCursor.CurrentCursorObject == Object) + if (Object->Process != PsGetWin32Process()) + { + return FALSE; + } + + if (WinStaObject->SystemCursor.CurrentCursorObject == Object) { /* Hide the cursor if we're destroying the current cursor */ IntSetCursor(WinStaObject, NULL, TRUE); @@ -376,17 +381,14 @@ IntDestroyCurIconObject(PWINSTATION_OBJECT WinStaObject, HANDLE Handle, BOOL Rem bmpMask = Object->IconInfo.hbmMask; bmpColor = Object->IconInfo.hbmColor; - - - if(Object->Process && RemoveFromProcess) + + if (Object->Process && RemoveFromProcess) { IntLockProcessCursorIcons(Object->Process); RemoveEntryList(&Object->ListEntry); IntUnLockProcessCursorIcons(Object->Process); } - ObmDereferenceObject(Object); - Ret = NT_SUCCESS(ObmCloseHandle(HandleTable, Handle)); /* delete bitmaps */ @@ -394,6 +396,8 @@ IntDestroyCurIconObject(PWINSTATION_OBJECT WinStaObject, HANDLE Handle, BOOL Rem NtGdiDeleteObject(bmpMask); if(bmpColor) NtGdiDeleteObject(bmpColor); + +/* ObmDereferenceObject(Object);*/ return Ret; } From 1d7a5ffa0b1a38cec0699ed88310ceb29057bc28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Mon, 29 Mar 2004 12:49:07 +0000 Subject: [PATCH 0685/1463] Merge Wine change: Dmitry Timoshkov - Scrollbar should also react on WM_LBUTTONDBLCLK. svn path=/trunk/; revision=8921 --- reactos/lib/user32/controls/scrollbar.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/user32/controls/scrollbar.c b/reactos/lib/user32/controls/scrollbar.c index 78232f2d247..4830f56fd9d 100644 --- a/reactos/lib/user32/controls/scrollbar.c +++ b/reactos/lib/user32/controls/scrollbar.c @@ -82,8 +82,7 @@ static LRESULT WINAPI ScrollBarWndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPA const struct builtin_class_descr SCROLL_builtin_class = { L"ScrollBar", /* name */ - CS_VREDRAW | CS_HREDRAW | CS_PARENTDC, /* style, Wine included CS_DBLCLK but then didn't - handle any WM_xBUTTONDBLCLK messages */ + CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC, /* style */ ScrollBarWndProc, /* procW */ NULL, /* procA (winproc is Unicode only) */ sizeof(SCROLLBARINFO) + sizeof(SCROLLINFO), /* extra */ @@ -1274,6 +1273,7 @@ ScrollBarWndProc(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) return 0; #endif + case WM_LBUTTONDBLCLK: case WM_LBUTTONDOWN: { POINT Pt; From fdec2f548ed81814626206bb66a5ad8bfb96f796 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Mon, 29 Mar 2004 16:47:48 +0000 Subject: [PATCH 0686/1463] - Declare NMTBGETINFOTIP[AW] and TB_MARKBUTTON. svn path=/trunk/; revision=8922 --- reactos/w32api/include/commctrl.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/reactos/w32api/include/commctrl.h b/reactos/w32api/include/commctrl.h index e60656d192d..a96d2cac5dc 100644 --- a/reactos/w32api/include/commctrl.h +++ b/reactos/w32api/include/commctrl.h @@ -513,6 +513,9 @@ extern "C" { #define TB_PRESSBUTTON (WM_USER+3) #define TB_HIDEBUTTON (WM_USER+4) #define TB_INDETERMINATE (WM_USER+5) +#if (_WIN32_IE >= 0x0400) +#define TB_MARKBUTTON (WM_USER+6) +#endif #define TB_ISBUTTONENABLED (WM_USER+9) #define TB_ISBUTTONCHECKED (WM_USER+10) #define TB_ISBUTTONPRESSED (WM_USER+11) @@ -1883,6 +1886,22 @@ typedef struct { LPWSTR pszText; int cchText; } NMTBDISPINFOW, *LPNMTBDISPINFOW; +typedef struct tagNMTBGETINFOTIPA +{ + NMHDR hdr; + LPSTR pszText; + int cchTextMax; + int iItem; + LPARAM lParam; +} NMTBGETINFOTIPA, *LPNMTBGETINFOTIPA; +typedef struct tagNMTBGETINFOTIPW +{ + NMHDR hdr; + LPWSTR pszText; + int cchTextMax; + int iItem; + LPARAM lParam; +} NMTBGETINFOTIPW, *LPNMTBGETINFOTIPW; typedef struct tagNMMOUSE { NMHDR hdr; DWORD_PTR dwItemSpec; From 69a9b488f2583d85cd37c3e658b097c9d759be10 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Mon, 29 Mar 2004 17:02:22 +0000 Subject: [PATCH 0687/1463] - Fixed window-less timers. svn path=/trunk/; revision=8923 --- reactos/subsys/win32k/ntuser/timer.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/timer.c b/reactos/subsys/win32k/ntuser/timer.c index 375ceb7a2b7..6685eb26c86 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.27 2004/03/11 16:17:25 weiden Exp $ +/* $Id: timer.c,v 1.28 2004/03/29 17:02:22 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -174,8 +174,6 @@ IntSetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc, B } HintIndex = ++Index; - IntUnLockTimerList; - return Index; } else { From bdf6b9b5b7850883fc2a25ab0b5a4e5ee0e012c8 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 29 Mar 2004 19:50:21 +0000 Subject: [PATCH 0688/1463] updated system colors svn path=/trunk/; revision=8924 --- reactos/lib/user32/windows/defwnd.c | 68 +++++++++++++++-------------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/reactos/lib/user32/windows/defwnd.c b/reactos/lib/user32/windows/defwnd.c index 1ca78e99d13..34a06701b4f 100644 --- a/reactos/lib/user32/windows/defwnd.c +++ b/reactos/lib/user32/windows/defwnd.c @@ -1,4 +1,4 @@ -/* $Id: defwnd.c,v 1.125 2004/03/29 06:38:50 navaraf Exp $ +/* $Id: defwnd.c,v 1.126 2004/03/29 19:50:21 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -49,39 +49,41 @@ static HBITMAP hbScrRight; static COLORREF SysColors[] = - { - RGB(192, 192, 192) /* 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(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(128, 128, 128) /* COLOR_APPWORKSPACE */, - RGB(0, 0, 128) /* COLOR_HILIGHT */, - RGB(255, 255, 255) /* COLOR_HILIGHTTEXT */, - RGB(192, 192, 192) /* 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(255, 255, 255) /* COLOR_BTNHILIGHT */, - RGB(32, 32, 32) /* COLOR_3DDKSHADOW */, - RGB(192, 192, 192) /* 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(166, 202, 240) /* COLOR_GRADIENTACTIVECAPTION */, - RGB(192, 192, 192) /* COLOR_GRADIENTINACTIVECAPTION */, - }; +{ + 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(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(212, 208, 200), /* COLOR_ACTIVEBORDER */ + RGB(212, 208, 200), /* COLOR_INACTIVEBORDER */ + RGB(128, 128, 128), /* COLOR_APPWORKSPACE */ + RGB(10, 36, 106), /* COLOR_HIGHLIGHT */ + RGB(255, 255, 255), /* COLOR_HIGHLIGHTTEXT */ + 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(212, 208, 200), /* COLOR_INACTIVECAPTIONTEXT */ + RGB(255, 255, 255), /* COLOR_BTNHIGHLIGHT */ + RGB(64, 64, 64), /* COLOR_3DDKSHADOW */ + RGB(212, 208, 200), /* COLOR_3DLIGHT */ + RGB(0, 0, 0), /* COLOR_INFOTEXT */ + RGB(255, 255, 225), /* COLOR_INFOBK */ + RGB(181, 181, 181), /* COLOR_UNKNOWN */ + RGB(0, 0, 128), /* COLOR_HOTLIGHT */ + RGB(166, 202, 240), /* COLOR_GRADIENTACTIVECAPTION */ + RGB(192, 192, 192), /* COLOR_GRADIENTINACTIVECAPTION */ + RGB(49, 106, 197), /* COLOR_MENUHILIGHT */ + RGB(236, 233, 216) /* COLOR_MENUBAR */ +}; -#define NUM_SYSCOLORS (sizeof(SysColors) / sizeof(SysColors[0])) +#define NUM_SYSCOLORS 31 /* Bits in the dwKeyData */ #define KEYDATA_ALT 0x2000 From 3c8dee1caac4d494b3741eb77376a1baf119ee38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Mon, 29 Mar 2004 22:29:34 +0000 Subject: [PATCH 0689/1463] Allow GDB 6 to backtrace over a syscall svn path=/trunk/; revision=8926 --- reactos/ntoskrnl/ke/i386/syscall.S | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/ke/i386/syscall.S b/reactos/ntoskrnl/ke/i386/syscall.S index a2cb72b16fd..9e4a53a6e12 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.12 2003/06/20 16:21:11 ekohl Exp $ +/* $Id: syscall.S,v 1.13 2004/03/29 22:29:34 gvg Exp $ * * FILE: ntoskrnl/hal/x86/syscall.s * PURPOSE: 2E trap handler @@ -28,6 +28,7 @@ #include #include #include +#include #define KernelMode (0) #define UserMode (1) @@ -92,9 +93,17 @@ 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 + pushl %ebx /* DebugEIP */ + movl (%ebp), %ebx + pushl %ebx /* DebugEBP */ +#else movl 0x60(%esp), %ebx pushl %ebx /* DebugEIP */ pushl %ebp /* DebugEBP */ +#endif /* Load the segment registers */ movl $KERNEL_DS, %ebx @@ -134,6 +143,14 @@ L3: 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 +#endif + /* Allocate room for argument list from kernel stack */ movl %es:_KeServiceDescriptorTable + 12, %ecx movl %es:(%ecx, %eax, 4), %ecx @@ -184,6 +201,14 @@ new_useShadowTable: 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 +#endif + /* Allocate room for argument list from kernel stack */ movl %es:_KeServiceDescriptorTableShadow + 28, %ecx movl %es:(%ecx, %eax, 4), %ecx From 63c532f15c84ac5d02b9817a9bcf5bd862d8537a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Tue, 30 Mar 2004 09:28:44 +0000 Subject: [PATCH 0690/1463] Disable pool validation since it slows down execution too much svn path=/trunk/; revision=8927 --- reactos/ntoskrnl/mm/ppool.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/mm/ppool.c b/reactos/ntoskrnl/mm/ppool.c index 137bec2669b..f37237c66fe 100644 --- a/reactos/ntoskrnl/mm/ppool.c +++ b/reactos/ntoskrnl/mm/ppool.c @@ -1,4 +1,4 @@ -/* $Id: ppool.c,v 1.26 2004/03/04 00:07:02 navaraf Exp $ +/* $Id: ppool.c,v 1.27 2004/03/30 09:28:44 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -20,8 +20,8 @@ /* GLOBALS *******************************************************************/ -/* Enable strict checking of the paged pool on every allocation */ -#define ENABLE_VALIDATE_POOL +/* Define to enable strict checking of the paged pool on every allocation */ +/* #define ENABLE_VALIDATE_POOL */ #undef assert #define assert(x) if (!(x)) {DbgPrint("Assertion "#x" failed at %s:%d\n", __FILE__,__LINE__); KeBugCheck(0); } From a8a999793fa8697268b55f9224174b3b3d5ccc77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Tue, 30 Mar 2004 20:50:16 +0000 Subject: [PATCH 0691/1463] Implement TOPMOST windows svn path=/trunk/; revision=8928 --- reactos/subsys/win32k/ntuser/window.c | 66 +++++++++++++++++++++++---- reactos/subsys/win32k/ntuser/winpos.c | 51 +++++++++++++++++---- 2 files changed, 100 insertions(+), 17 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 6592b00d3cf..7ab8fd7e563 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.202 2004/03/28 21:46:26 weiden Exp $ +/* $Id: window.c,v 1.203 2004/03/30 20:50:15 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -873,7 +873,7 @@ IntSetOwner(HWND hWnd, HWND hWndNewOwner) PWINDOW_OBJECT FASTCALL IntSetParent(PWINDOW_OBJECT Wnd, PWINDOW_OBJECT WndNewParent) { - PWINDOW_OBJECT WndOldParent; + PWINDOW_OBJECT WndOldParent, Sibling, InsertAfter; HWND hWnd, hWndNewParent, hWndOldParent; BOOL WasVisible; BOOL MenuChanged; @@ -904,7 +904,29 @@ IntSetParent(PWINDOW_OBJECT Wnd, PWINDOW_OBJECT WndNewParent) if (WndNewParent != WndOldParent) { IntUnlinkWindow(Wnd); - IntLinkWindow(Wnd, WndNewParent, NULL /*prev sibling*/); + InsertAfter = NULL; + if (0 == (Wnd->ExStyle & WS_EX_TOPMOST)) + { + /* Not a TOPMOST window, put after TOPMOSTs of new parent */ + IntLockRelatives(WndNewParent); + Sibling = WndNewParent->FirstChild; + while (NULL != Sibling && 0 != (Sibling->ExStyle & WS_EX_TOPMOST)) + { + InsertAfter = Sibling; + Sibling = Sibling->NextSibling; + } + IntUnLockRelatives(WndNewParent); + } + if (NULL == InsertAfter) + { + IntLinkWindow(Wnd, WndNewParent, InsertAfter /*prev sibling*/); + } + else + { + IntReferenceWindowObject(InsertAfter); + IntLinkWindow(Wnd, WndNewParent, InsertAfter /*prev sibling*/); + IntReleaseWindowObject(InsertAfter); + } if (WndNewParent->Self != IntGetDesktopWindow()) /* a child window */ { @@ -917,12 +939,13 @@ IntSetParent(PWINDOW_OBJECT Wnd, PWINDOW_OBJECT WndNewParent) } /* - * SetParent additionally needs to make hwnd the topmost window - * in the x-order and send the expected WM_WINDOWPOSCHANGING and + * SetParent additionally needs to make hwnd the top window + * in the z-order and send the expected WM_WINDOWPOSCHANGING and * WM_WINDOWPOSCHANGED notification messages. */ - WinPosSetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, - SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | (WasVisible ? SWP_SHOWWINDOW : 0)); + WinPosSetWindowPos(hWnd, (0 == (Wnd->ExStyle & WS_EX_TOPMOST) ? HWND_TOP : HWND_TOPMOST), + 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE + | (WasVisible ? SWP_SHOWWINDOW : 0)); /* * FIXME: a WM_MOVE is also generated (in the DefWindowProc handler @@ -1613,8 +1636,33 @@ NtUserCreateWindowEx(DWORD dwExStyle, } else { - /* link window as top sibling */ - IntLinkWindow(WindowObject, ParentWindow, NULL /*prev sibling*/); + /* link window as top sibling (but after topmost siblings) */ + PWINDOW_OBJECT InsertAfter, Sibling; + if (0 == (dwExStyle & WS_EX_TOPMOST)) + { + IntLockRelatives(ParentWindow); + InsertAfter = NULL; + Sibling = ParentWindow->FirstChild; + while (NULL != Sibling && 0 != (Sibling->ExStyle & WS_EX_TOPMOST)) + { + InsertAfter = Sibling; + Sibling = Sibling->NextSibling; + } + IntUnLockRelatives(ParentWindow); + } + else + { + InsertAfter = NULL; + } + if (NULL != InsertAfter) + { + IntReferenceWindowObject(InsertAfter); + } + IntLinkWindow(WindowObject, ParentWindow, InsertAfter /* prev sibling */); + if (NULL != InsertAfter) + { + IntReleaseWindowObject(InsertAfter); + } } } diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index 942494a0104..d2a300a0e69 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.105 2004/03/23 21:30:18 gvg Exp $ +/* $Id: winpos.c,v 1.106 2004/03/30 20:50:16 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -745,7 +745,8 @@ WinPosFixupFlags(WINDOWPOS *WinPos, PWINDOW_OBJECT Window) if (!(WinPos->flags & SWP_NOACTIVATE)) { WinPos->flags &= ~SWP_NOZORDER; - WinPos->hwndInsertAfter = HWND_TOP; + WinPos->hwndInsertAfter = (0 != (Window->ExStyle & WS_EX_TOPMOST) ? + HWND_TOPMOST : HWND_TOP); return TRUE; } } @@ -763,16 +764,22 @@ WinPosFixupFlags(WINDOWPOS *WinPos, PWINDOW_OBJECT Window) WinPos->hwndInsertAfter = HWND_NOTOPMOST; } - /* FIXME: TOPMOST not supported yet */ - if ((WinPos->hwndInsertAfter == HWND_TOPMOST) || - (WinPos->hwndInsertAfter == HWND_NOTOPMOST)) + if (WinPos->hwndInsertAfter == HWND_NOTOPMOST) { WinPos->hwndInsertAfter = HWND_TOP; } + else if (HWND_TOP == WinPos->hwndInsertAfter + && 0 != (Window->ExStyle & WS_EX_TOPMOST)) + { + /* Keep it topmost when it's already topmost */ + WinPos->hwndInsertAfter = HWND_TOPMOST; + } /* hwndInsertAfter must be a sibling of the window */ - if ((WinPos->hwndInsertAfter != HWND_TOP) && - (WinPos->hwndInsertAfter != HWND_BOTTOM)) + if (HWND_TOPMOST != WinPos->hwndInsertAfter + && HWND_TOP != WinPos->hwndInsertAfter + && HWND_NOTOPMOST != WinPos->hwndInsertAfter + && HWND_BOTTOM != WinPos->hwndInsertAfter) { PWINDOW_OBJECT Parent = IntGetParentObject(Window); if (NtUserGetAncestor(WinPos->hwndInsertAfter, GA_PARENT) != @@ -905,12 +912,32 @@ WinPosSetWindowPos(HWND Wnd, HWND WndInsertAfter, INT x, INT y, INT cx, if (!(WinPos.flags & SWP_NOZORDER) && WinPos.hwnd != NtUserGetShellWindow()) { PWINDOW_OBJECT ParentWindow; + PWINDOW_OBJECT Sibling; PWINDOW_OBJECT InsertAfterWindow; if ((ParentWindow = IntGetParentObject(Window))) { - if (WinPos.hwndInsertAfter == HWND_TOP) + if (HWND_TOPMOST == WinPos.hwndInsertAfter) + { InsertAfterWindow = NULL; + } + else if (HWND_TOP == WinPos.hwndInsertAfter + || HWND_NOTOPMOST == WinPos.hwndInsertAfter) + { + InsertAfterWindow = NULL; + IntLockRelatives(ParentWindow); + Sibling = ParentWindow->FirstChild; + while (NULL != Sibling && 0 != (Sibling->ExStyle & WS_EX_TOPMOST)) + { + InsertAfterWindow = Sibling; + Sibling = Sibling->NextSibling; + } + if (NULL != InsertAfterWindow) + { + IntReferenceWindowObject(InsertAfterWindow); + } + IntUnLockRelatives(ParentWindow); + } else if (WinPos.hwndInsertAfter == HWND_BOTTOM) { IntLockRelatives(ParentWindow); @@ -934,6 +961,14 @@ WinPosSetWindowPos(HWND Wnd, HWND WndInsertAfter, INT x, INT y, INT cx, } if (InsertAfterWindow != NULL) IntReleaseWindowObject(InsertAfterWindow); + if (HWND_TOPMOST == WinPos.hwndInsertAfter) + { + Window->ExStyle |= WS_EX_TOPMOST; + } + else + { + Window->ExStyle &= ~ WS_EX_TOPMOST; + } IntReleaseWindowObject(ParentWindow); } From 942d7e47a75b689d41966dc237aa74a64a14458c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Tue, 30 Mar 2004 22:49:38 +0000 Subject: [PATCH 0692/1463] Fix IntIsChildWindow for case where parent is a toplevel window svn path=/trunk/; revision=8929 --- reactos/subsys/win32k/ntuser/window.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 7ab8fd7e563..696025f36c7 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.203 2004/03/30 20:50:15 gvg Exp $ +/* $Id: window.c,v 1.204 2004/03/30 22:49:38 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -711,12 +711,6 @@ IntIsChildWindow(HWND Parent, HWND Child) Window = BaseWindow; while (Window) { - if(!(Window->Style & WS_CHILD)) - { - if(Window != BaseWindow) - IntReleaseWindowObject(Window); - break; - } if (Window->Self == Parent) { if(Window != BaseWindow) @@ -724,6 +718,12 @@ IntIsChildWindow(HWND Parent, HWND Child) IntReleaseWindowObject(BaseWindow); return(TRUE); } + if(!(Window->Style & WS_CHILD)) + { + if(Window != BaseWindow) + IntReleaseWindowObject(Window); + break; + } Old = Window; Window = IntGetParentObject(Window); if(Old != BaseWindow) From 3b1c2903f6cf8d34df08d028925b6ec3ae3c340f Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 31 Mar 2004 03:33:48 +0000 Subject: [PATCH 0693/1463] Added removable mediachange support. svn path=/trunk/; revision=8930 --- reactos/drivers/fs/vfat/blockdev.c | 2 +- reactos/drivers/fs/vfat/create.c | 53 ++++++- reactos/drivers/fs/vfat/fsctl.c | 39 ++++-- reactos/drivers/fs/vfat/rw.c | 15 +- reactos/drivers/storage/disk/disk.c | 190 +++++++++++++++++++++++--- reactos/drivers/storage/disk/makefile | 4 +- 6 files changed, 264 insertions(+), 39 deletions(-) diff --git a/reactos/drivers/fs/vfat/blockdev.c b/reactos/drivers/fs/vfat/blockdev.c index 7de0fae949a..221142c4b59 100644 --- a/reactos/drivers/fs/vfat/blockdev.c +++ b/reactos/drivers/fs/vfat/blockdev.c @@ -161,7 +161,7 @@ VfatWriteDisk (IN PDEVICE_OBJECT pDeviceObject, if (!NT_SUCCESS (Status)) { - DPRINT1 ("IO failed!!! VfatWriteSectors : Error code: %x\n", Status); + DPRINT ("IO failed!!! VfatWriteSectors : Error code: %x\n", Status); return (Status); } diff --git a/reactos/drivers/fs/vfat/create.c b/reactos/drivers/fs/vfat/create.c index 5ecf1cc935c..2204b4b9273 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.66 2004/01/18 22:31:23 hbirr Exp $ +/* $Id: create.c,v 1.67 2004/03/31 03:30:36 jimtabor Exp $ * * PROJECT: ReactOS kernel * FILE: drivers/fs/vfat/create.c @@ -338,10 +338,14 @@ 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; +// PDEVICE_OBJECT DeviceObject = DeviceExt->StorageDevice->Vpb->DeviceObject; + DPRINT ("VfatOpenFile(%08lx, %08lx, '%wZ')\n", DeviceExt, FileObject, FileNameU); if (FileObject->RelatedFileObject) @@ -366,6 +370,53 @@ 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)) + { + DPRINT ("Status %lx\n", Status); + return Status; + } + } + + /* try first to find an existing FCB in memory */ DPRINT ("Checking for existing FCB in memory\n"); Fcb = vfatGrabFCBFromTable (DeviceExt, FileNameU); diff --git a/reactos/drivers/fs/vfat/fsctl.c b/reactos/drivers/fs/vfat/fsctl.c index 51adc4d8379..773f2c336e5 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.28 2004/03/16 08:30:28 arty Exp $ +/* $Id: fsctl.c,v 1.29 2004/03/31 03:30:36 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -66,12 +66,15 @@ VfatHasFileSystem(PDEVICE_OBJECT DeviceToMount, &DiskGeometry, &Size, FALSE); + DPRINT("VfatHasFileSystem start\n"); + + if (!NT_SUCCESS(Status)) { DPRINT("VfatBlockDeviceIoControl faild (%x)\n", Status); return Status; } - if (DiskGeometry.MediaType == FixedMedia) + if (DiskGeometry.MediaType == FixedMedia || RemovableMedia) { // We have found a hard disk Size = sizeof(PARTITION_INFORMATION); @@ -87,7 +90,7 @@ VfatHasFileSystem(PDEVICE_OBJECT DeviceToMount, DPRINT("VfatBlockDeviceIoControl faild (%x)\n", Status); return Status; } -#ifndef NDEBUG +/*#ifndef NDEBUG*/ DbgPrint("Partition Information:\n"); DbgPrint("StartingOffset %u\n", PartitionInfo.StartingOffset.QuadPart / 512); DbgPrint("PartitionLength %u\n", PartitionInfo.PartitionLength.QuadPart / 512); @@ -97,7 +100,7 @@ VfatHasFileSystem(PDEVICE_OBJECT DeviceToMount, DbgPrint("BootIndicator %u\n", PartitionInfo.BootIndicator); DbgPrint("RecognizedPartition %u\n", PartitionInfo.RecognizedPartition); DbgPrint("RewritePartition %u\n", PartitionInfo.RewritePartition); -#endif +/*#endif*/ if (PartitionInfo.PartitionType == PARTITION_FAT_12 || PartitionInfo.PartitionType == PARTITION_FAT_16 || PartitionInfo.PartitionType == PARTITION_HUGE || @@ -108,7 +111,7 @@ VfatHasFileSystem(PDEVICE_OBJECT DeviceToMount, *RecognizedFS = TRUE; } } - else if (DiskGeometry.MediaType > Unknown && DiskGeometry.MediaType <= RemovableMedia) + else if (DiskGeometry.MediaType > Unknown && DiskGeometry.MediaType <= RemovableMedia ) { *RecognizedFS = TRUE; } @@ -120,13 +123,19 @@ VfatHasFileSystem(PDEVICE_OBJECT DeviceToMount, Boot = ExAllocatePool(NonPagedPool, DiskGeometry.BytesPerSector); if (Boot == NULL) { + DPRINT("VfatHasFileSystem 1\n"); + *RecognizedFS=FALSE; return STATUS_INSUFFICIENT_RESOURCES; } + Offset.QuadPart = 0; + Status = VfatReadDisk(DeviceToMount, &Offset, DiskGeometry.BytesPerSector, (PUCHAR) Boot, FALSE); if (NT_SUCCESS(Status)) { + DPRINT("VfatHasFileSystem 2\n"); + if (Boot->BytesPerSector != 0) { FatInfo.VolumeID = Boot->VolumeID; @@ -167,9 +176,13 @@ VfatHasFileSystem(PDEVICE_OBJECT DeviceToMount, } else { + DPRINT("VfatHasFileSystem 3\n"); + Status = STATUS_INSUFFICIENT_RESOURCES; } } + DPRINT("VfatHasFileSystem end\n"); + ExFreePool(Boot); return Status; } @@ -191,6 +204,7 @@ VfatMountDevice(PDEVICE_EXTENSION DeviceExt, { return(Status); } + DPRINT("MountVfatdev %d, PAGE_SIZE = %d\n", DeviceExt->FatInfo.BytesPerCluster, PAGE_SIZE); if (DeviceExt->FatInfo.BytesPerCluster >= PAGE_SIZE && (DeviceExt->FatInfo.BytesPerCluster % PAGE_SIZE) != 0) @@ -398,7 +412,8 @@ VfatVerify (PVFAT_IRP_CONTEXT IrpContext) */ { PDEVICE_OBJECT DeviceToVerify; - NTSTATUS Status; + NTSTATUS Status = STATUS_SUCCESS; + DPRINT("VfatVerify(IrpContext %x)\n", IrpContext); @@ -412,16 +427,17 @@ VfatVerify (PVFAT_IRP_CONTEXT IrpContext) FALSE); if (!NT_SUCCESS(Status)) { - DPRINT1("VfatBlockDeviceIoControl() failed (Status %lx)\n", Status); + DPRINT("VfatBlockDeviceIoControl() failed (Status %lx)\n", Status); /* FIXME: Compare volume label */ - DPRINT1(" returning STATUS_WRONG_VOLUME\n"); + DPRINT(" returning STATUS_WRONG_VOLUME\n"); - return STATUS_WRONG_VOLUME; + Status = STATUS_WRONG_VOLUME; } - - return STATUS_SUCCESS; + DeviceToVerify->Flags &= ~DO_VERIFY_VOLUME; + + return Status; } @@ -598,6 +614,7 @@ NTSTATUS VfatFileSystemControl(PVFAT_IRP_CONTEXT IrpContext) break; case IRP_MN_VERIFY_VOLUME: + DPRINT("VFATFS: IRP_MN_VERIFY_VOLUME\n"); Status = VfatVerify(IrpContext); break; diff --git a/reactos/drivers/fs/vfat/rw.c b/reactos/drivers/fs/vfat/rw.c index e987e65dc4e..9c5f55ec34a 100644 --- a/reactos/drivers/fs/vfat/rw.c +++ b/reactos/drivers/fs/vfat/rw.c @@ -1,5 +1,5 @@ -/* $Id: rw.c,v 1.64 2004/01/28 20:53:46 ekohl Exp $ +/* $Id: rw.c,v 1.65 2004/03/31 03:30:36 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -460,7 +460,7 @@ VfatRead(PVFAT_IRP_CONTEXT IrpContext) PERESOURCE Resource = NULL; LARGE_INTEGER ByteOffset; PVOID Buffer; - /*PDEVICE_OBJECT DeviceToVerify;*/ + PDEVICE_OBJECT DeviceToVerify; ULONG BytesPerSector; assert(IrpContext); @@ -629,21 +629,22 @@ VfatRead(PVFAT_IRP_CONTEXT IrpContext) } Status = VfatReadFileData(IrpContext, Buffer, Length, ByteOffset, &ReturnedLength); -/* +/**/ if (Status == STATUS_VERIFY_REQUIRED) { DPRINT("VfatReadFile returned STATUS_VERIFY_REQUIRED\n"); - DeviceToVerify = IoGetDeviceToVerify(KeGetCurrentThread()); - IoSetDeviceToVerify(KeGetCurrentThread(), NULL); + DeviceToVerify = IoGetDeviceToVerify((struct _ETHREAD*)KeGetCurrentThread()); + IoSetDeviceToVerify((struct _ETHREAD*)KeGetCurrentThread(), NULL); Status = IoVerifyVolume (DeviceToVerify, FALSE); if (NT_SUCCESS(Status)) { Status = VfatReadFileData(IrpContext, Buffer, Length, - ByteOffset.u.LowPart, &ReturnedLength); + ByteOffset, &ReturnedLength); } + } -*/ +/**/ if (NT_SUCCESS(Status)) { IrpContext->Irp->IoStatus.Information = ReturnedLength; diff --git a/reactos/drivers/storage/disk/disk.c b/reactos/drivers/storage/disk/disk.c index 6f0a79819ff..5580410c74b 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.35 2004/02/14 12:29:33 navaraf Exp $ +/* $Id: disk.c,v 1.36 2004/03/31 03:33:48 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -53,8 +53,7 @@ typedef struct _DISK_DATA BOOLEAN BootIndicator; BOOLEAN DriveNotReady; } DISK_DATA, *PDISK_DATA; - - + BOOLEAN STDCALL DiskClassFindDevices(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath, @@ -69,6 +68,9 @@ NTSTATUS STDCALL DiskClassCheckReadWrite(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); +static VOID +DiskClassCreateMediaChangeEvent(IN PDEVICE_EXTENSION DeviceExtension, + IN ULONG DeviceNumber); static NTSTATUS DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, @@ -105,6 +107,20 @@ ScsiDiskCalcMbrCheckSum(IN PDEVICE_EXTENSION DeviceExtension, OUT PULONG Checksum); +static NTSTATUS +DiskBuildPartionTable(IN PDEVICE_OBJECT DiskDeviceObject, + IN PIRP Irp); + +VOID STDCALL +DiskClassStartIo (IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp); + +NTSTATUS STDCALL +DiskDeviceControlCompletion (IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context); + + /* FUNCTIONS ****************************************************************/ /********************************************************************** @@ -304,6 +320,28 @@ DiskClassFindDevices(PDRIVER_OBJECT DriverObject, } +static VOID +DiskClassCreateMediaChangeEvent(IN PDEVICE_EXTENSION DeviceExtension, + IN ULONG DeviceNumber) +{ + WCHAR NameBuffer[MAX_PATH]; + UNICODE_STRING Name; + + swprintf (NameBuffer, + L"\\Device\\MediaChangeEvent%lu", + DeviceNumber); + RtlInitUnicodeString (&Name, + NameBuffer); + + DeviceExtension->MediaChangeEvent = + IoCreateSynchronizationEvent (&Name, + &DeviceExtension->MediaChangeEventHandle); + + KeClearEvent (DeviceExtension->MediaChangeEvent); +} + + + /********************************************************************** * NAME EXPORTED * DiskClassCheckDevice @@ -590,7 +628,7 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, if (!NT_SUCCESS(Status) && (DiskDeviceObject->Characteristics & FILE_REMOVABLE_MEDIA) == 0) { - DPRINT1("Failed to retrieve drive capacity!\n"); + DPRINT("Failed to retrieve drive capacity!\n"); return(STATUS_SUCCESS); } else @@ -601,6 +639,18 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, DPRINT("SectorSize: %lu\n", DiskDeviceExtension->DiskGeometry->BytesPerSector); + if ((DiskDeviceObject->Characteristics & FILE_REMOVABLE_MEDIA) && + (DiskDeviceExtension->DiskGeometry->MediaType == RemovableMedia)) + { + + DiskClassCreateMediaChangeEvent(DiskDeviceExtension,DiskNumber); + if(DiskDeviceExtension->MediaChangeEvent != NULL) + { + DPRINT("Allocated media change event!\n"); + } + + } + /* Check disk for presence of a disk manager */ HalExamineMBR(DiskDeviceObject, DiskDeviceExtension->DiskGeometry->BytesPerSector, @@ -619,10 +669,9 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, ExFreePool(MbrBuffer); MbrBuffer = NULL; } - if ((DiskDeviceObject->Characteristics & FILE_REMOVABLE_MEDIA) && (DiskDeviceExtension->DiskGeometry->MediaType == RemovableMedia)) - { + { /* Allocate a partition list for a single entry. */ PartitionList = ExAllocatePool(NonPagedPool, sizeof(DRIVE_LAYOUT_INFORMATION)); @@ -729,7 +778,7 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, Status = ScsiClassCreateDeviceObject(DriverObject, NameBuffer2, DiskDeviceObject, - &PartitionDeviceObject, + &PartitionDeviceObject , InitializationData); DPRINT("ScsiClassCreateDeviceObject(): Status %x\n", Status); if (NT_SUCCESS(Status)) @@ -781,7 +830,7 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, } else { - DPRINT1("ScsiClassCreateDeviceObject() failed to create partition device object (Status %x)\n", Status); + DPRINT("ScsiClassCreateDeviceObject() failed to create partition device object (Status %x)\n", Status); break; } @@ -797,6 +846,88 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, } +static NTSTATUS +DiskBuildPartionTable(IN PDEVICE_OBJECT DiskDeviceObject, + IN PIRP Irp) +{ + PDRIVE_LAYOUT_INFORMATION PartitionList = NULL; + PDEVICE_EXTENSION DiskDeviceExtension; + PDISK_DATA DiskData; + PPARTITION_INFORMATION PartitionEntry; + ULONG PartitionNumber; + NTSTATUS Status; + + DPRINT("DiskBuildPartitionTable() start\n"); + + DiskDeviceExtension = (PDEVICE_EXTENSION)DiskDeviceObject->DeviceExtension; + DiskData = (PDISK_DATA)(DiskDeviceExtension + 1); + + if (DiskDeviceExtension->StartingOffset.QuadPart) + { + DPRINT("Partition already installed\n"); + return(STATUS_SUCCESS); + } + + /* Read partition table */ + Status = IoReadPartitionTable(DiskDeviceObject, + DiskDeviceExtension->DiskGeometry->BytesPerSector, + TRUE, + &PartitionList); + + + DPRINT("IoReadPartitionTable(): Status: %lx\n", Status); + + if (!NT_SUCCESS(Status)) + { + /* Drive is not ready. */ + DPRINT("Drive not ready\n"); + DiskData->DriveNotReady = TRUE; + + if (PartitionList != NULL) + ExFreePool(PartitionList); + return Status; + } + + if (NT_SUCCESS(Status)) + { + DPRINT("Read partition table!\n"); + DPRINT(" Number of partitions: %u\n", PartitionList->PartitionCount); + + /* Set disk signature */ + DiskData->Signature = PartitionList->Signature; + + for (PartitionNumber = 0; PartitionNumber < PartitionList->PartitionCount; PartitionNumber++) + { + PartitionEntry = &PartitionList->PartitionEntry[PartitionNumber]; + + 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; + + 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*/); + } + } + if (PartitionList != NULL) + ExFreePool(PartitionList); + + DPRINT("DiskBuildPartitionTable() done\n"); + + return(STATUS_SUCCESS); +} + + /********************************************************************** * NAME EXPORTED * DiskClassDeviceControl @@ -817,7 +948,7 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, NTSTATUS STDCALL DiskClassDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) -{ +{ PDEVICE_EXTENSION DeviceExtension; PIO_STACK_LOCATION IrpStack; ULONG ControlCode, InputLength, OutputLength; @@ -878,6 +1009,14 @@ DiskClassDeviceControl(IN PDEVICE_OBJECT DeviceObject, case IOCTL_DISK_GET_PARTITION_INFO: DPRINT("IOCTL_DISK_GET_PARTITION_INFO\n"); + + if ((DeviceObject->Characteristics & FILE_REMOVABLE_MEDIA) && + (DeviceExtension->DiskGeometry->MediaType == RemovableMedia)) + { + /* Allocate a partition list for a single entry. */ + Status = DiskBuildPartionTable(DeviceObject,Irp); + } + if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(PARTITION_INFORMATION)) { @@ -888,7 +1027,7 @@ DiskClassDeviceControl(IN PDEVICE_OBJECT DeviceObject, Status = STATUS_INVALID_DEVICE_REQUEST; } else - { + { PPARTITION_INFORMATION PartitionInfo; PartitionInfo = (PPARTITION_INFORMATION)Irp->AssociatedIrp.SystemBuffer; @@ -1051,6 +1190,23 @@ DiskClassDeviceControl(IN PDEVICE_OBJECT DeviceObject, ExFreePool (ModeData); } break; + + + case IOCTL_DISK_CHECK_VERIFY: + DPRINT("IOCTL_DISK_CHECK_VERIFY\n"); + if (DeviceObject->Flags & DO_VERIFY_VOLUME) + { + DPRINT("Do Verify Set\n"); + Status = STATUS_VERIFY_REQUIRED; + Information = 0; + } + else + { + DPRINT("Do Verify Clear\n"); + Status = STATUS_SUCCESS; + Information = 0; + } + break; case IOCTL_DISK_VERIFY: case IOCTL_DISK_FORMAT_TRACKS: @@ -1063,7 +1219,7 @@ DiskClassDeviceControl(IN PDEVICE_OBJECT DeviceObject, case IOCTL_DISK_REQUEST_STRUCTURE: case IOCTL_DISK_REQUEST_DATA: /* If we get here, something went wrong. Inform the requestor */ - DPRINT1("Unhandled control code: %lx\n", ControlCode); + DPRINT("Unhandled control code: %lx\n", ControlCode); Status = STATUS_INVALID_DEVICE_REQUEST; Information = 0; break; @@ -1290,7 +1446,7 @@ DiskClassUpdatePartitionDeviceObjects(IN PDEVICE_OBJECT DiskDeviceObject, DeviceExtension->PartitionLength.QuadPart)) continue; - DPRINT1("Found matching partition entry for partition %lu\n", + DPRINT("Found matching partition entry for partition %lu\n", DiskData->PartitionNumber); /* Found matching partition */ @@ -1392,7 +1548,7 @@ DiskClassUpdatePartitionDeviceObjects(IN PDEVICE_OBJECT DiskDeviceObject, &DeviceObject); if (!NT_SUCCESS(Status)) { - DPRINT1("IoCreateDevice() failed (Status %lx)\n", Status); + DPRINT("IoCreateDevice() failed (Status %lx)\n", Status); continue; } @@ -1745,7 +1901,7 @@ ScsiDiskUpdateFixedDiskGeometry(IN PDEVICE_EXTENSION DeviceExtension) 1024); if (ValueBuffer == NULL) { - DPRINT1("Failed to allocate value buffer\n"); + DPRINT("Failed to allocate value buffer\n"); ZwClose(SystemKey); return; } @@ -1808,7 +1964,7 @@ ScsiDiskUpdateFixedDiskGeometry(IN PDEVICE_EXTENSION DeviceExtension) #if 0 for (i = 0; i< DriveParameters[0].NumberDrives; i++) { - DPRINT1("Drive %lu: %lu Cylinders %hu Heads %hu Sectors\n", + DPRINT("Drive %lu: %lu Cylinders %hu Heads %hu Sectors\n", i, DriveParameters[i].MaxCylinders, DriveParameters[i].MaxHeads, @@ -1834,7 +1990,7 @@ ScsiDiskUpdateFixedDiskGeometry(IN PDEVICE_EXTENSION DeviceExtension) Length = TracksPerCylinder * SectorsPerTrack; if (Length == 0) { - DPRINT1("Invalid track length 0\n"); + DPRINT("Invalid track length 0\n"); ExFreePool(ValueBuffer); return; } @@ -1853,7 +2009,7 @@ ScsiDiskUpdateFixedDiskGeometry(IN PDEVICE_EXTENSION DeviceExtension) if (DeviceExtension->DMActive) { - DPRINT1("FIXME: Update geometry with respect to the installed disk manager!\n"); + DPRINT("FIXME: Update geometry with respect to the installed disk manager!\n"); /* FIXME: Update geometry for disk managers */ diff --git a/reactos/drivers/storage/disk/makefile b/reactos/drivers/storage/disk/makefile index c7e68e7d951..47037e0888e 100644 --- a/reactos/drivers/storage/disk/makefile +++ b/reactos/drivers/storage/disk/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.4 2003/11/13 14:19:23 ekohl Exp $ +# $Id: makefile,v 1.5 2004/03/31 03:33:48 jimtabor Exp $ PATH_TO_TOP = ../../.. @@ -12,7 +12,7 @@ TARGET_DDKLIBS = class2.a TARGET_OBJECTS = $(TARGET_NAME).o -TARGET_CFLAGS = -Werror -Wall +TARGET_CFLAGS = -Wall include $(PATH_TO_TOP)/rules.mak From bc0cf4f9cfac6865322f8b252c8be88e8eb04242 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 31 Mar 2004 03:34:42 +0000 Subject: [PATCH 0694/1463] Oops! svn path=/trunk/; revision=8931 --- reactos/drivers/storage/disk/makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/storage/disk/makefile b/reactos/drivers/storage/disk/makefile index 47037e0888e..1d26d39e95b 100644 --- a/reactos/drivers/storage/disk/makefile +++ b/reactos/drivers/storage/disk/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.5 2004/03/31 03:33:48 jimtabor Exp $ +# $Id: makefile,v 1.6 2004/03/31 03:34:42 jimtabor Exp $ PATH_TO_TOP = ../../.. @@ -12,7 +12,7 @@ TARGET_DDKLIBS = class2.a TARGET_OBJECTS = $(TARGET_NAME).o -TARGET_CFLAGS = -Wall +TARGET_CFLAGS = Werror -Wall include $(PATH_TO_TOP)/rules.mak From 1fb32b95345910645c2cffb80542b09074be3f47 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 31 Mar 2004 03:34:55 +0000 Subject: [PATCH 0695/1463] Added removable mediachange support. svn path=/trunk/; revision=8932 --- reactos/drivers/storage/class2/class2.c | 40 +++++++++++++++++++------ 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/reactos/drivers/storage/class2/class2.c b/reactos/drivers/storage/class2/class2.c index ad384a26d83..12852fe694a 100644 --- a/reactos/drivers/storage/class2/class2.c +++ b/reactos/drivers/storage/class2/class2.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: class2.c,v 1.50 2004/03/07 19:53:08 hbirr Exp $ +/* $Id: class2.c,v 1.51 2004/03/31 03:34:55 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -585,6 +585,7 @@ ScsiClassDeviceControl(IN PDEVICE_OBJECT DeviceObject, { if (OutputBufferLength < sizeof(ULONG)) { + DPRINT ("ScsiClassDeviceControl: IOCTL_DISK_CHECK_VERIFY SMALL\n"); Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; Irp->IoStatus.Information = 0; ExFreePool (Srb); @@ -598,6 +599,7 @@ ScsiClassDeviceControl(IN PDEVICE_OBJECT DeviceObject, FALSE); if (SubIrp == NULL) { + DPRINT ("ScsiClassDeviceControl: IOCTL_DISK_CHECK_VERIFY NotEnuf\n"); Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; Irp->IoStatus.Information = 0; ExFreePool (Srb); @@ -620,6 +622,8 @@ ScsiClassDeviceControl(IN PDEVICE_OBJECT DeviceObject, TRUE, TRUE); + DPRINT ("ScsiClassDeviceControl: IOCTL_DISK_CHECK_VERIFY IoSet\n"); + IoSetNextIrpStackLocation (SubIrp); NextStack = IoGetCurrentIrpStackLocation (SubIrp); NextStack->DeviceObject = DeviceObject; @@ -634,6 +638,8 @@ ScsiClassDeviceControl(IN PDEVICE_OBJECT DeviceObject, Srb->TimeOutValue = DeviceExtension->TimeOutValue; Cdb->CDB6GENERIC.OperationCode = SCSIOP_TEST_UNIT_READY; +DPRINT ("ScsiClassDeviceControl: IOCTL_DISK_CHECK_VERIFY SrbAsync\n"); + return(ScsiClassSendSrbAsynchronous(DeviceObject, Srb, Irp, @@ -642,7 +648,7 @@ ScsiClassDeviceControl(IN PDEVICE_OBJECT DeviceObject, FALSE)); default: - DPRINT1("Unknown device io control code %lx\n", + DPRINT("Unknown device io control code %lx\n", ModifiedControlCode); ExFreePool(Srb); @@ -1000,7 +1006,7 @@ NTSTATUS STDCALL ScsiClassInternalIoControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { - DPRINT1("ScsiClassInternalIoContol() called\n"); + DPRINT("ScsiClassInternalIoContol() called\n"); Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; @@ -1090,8 +1096,17 @@ ScsiClassInterpretSenseInfo(IN PDEVICE_OBJECT DeviceObject, case SCSI_ADSENSE_NO_MEDIA_IN_DEVICE: DPRINT("SCSI_ADSENSE_NO_MEDIA_IN_DEVICE\n"); - *Status = STATUS_NO_MEDIA_IN_DEVICE; + *Status = STATUS_NO_MEDIA_IN_DEVICE; Retry = FALSE; + + if((DeviceExtension->MediaChangeEvent != NULL) && + (!DeviceExtension->MediaChangeEvent)) + { + KeSetEvent(DeviceExtension->MediaChangeEvent, + 0, + FALSE); + DeviceExtension->MediaChangeNoMedia = TRUE; + } break; } break; @@ -1171,6 +1186,8 @@ ScsiClassInterpretSenseInfo(IN PDEVICE_OBJECT DeviceObject, if ((DeviceObject->Characteristics & FILE_REMOVABLE_MEDIA) && (DeviceObject->Vpb->Flags & VPB_MOUNTED)) { + DPRINT("SCSI_SENSE_UNIT_ATTENTION set DoVerifyVol\n"); + DeviceObject->Flags |= DO_VERIFY_VOLUME; *Status = STATUS_VERIFY_REQUIRED; Retry = FALSE; @@ -1196,7 +1213,7 @@ ScsiClassInterpretSenseInfo(IN PDEVICE_OBJECT DeviceObject, break; default: - DPRINT1("SCSI error (sense key: %x)\n", + DPRINT("SCSI error (sense key: %x)\n", SenseData->SenseKey & 0xf); *Status = STATUS_IO_DEVICE_ERROR; break; @@ -1234,7 +1251,7 @@ ScsiClassInterpretSenseInfo(IN PDEVICE_OBJECT DeviceObject, break; default: - DPRINT1("SCSI error (SRB status: %x)\n", + DPRINT("SCSI error (SRB status: %x)\n", SRB_STATUS(Srb->SrbStatus)); LogError = TRUE; *Status = STATUS_IO_DEVICE_ERROR; @@ -1260,7 +1277,7 @@ ScsiClassInterpretSenseInfo(IN PDEVICE_OBJECT DeviceObject, 5 * sizeof(ULONG)); if (LogPacket == NULL) { - DPRINT1 ("Failed to allocate a log packet!\n"); + DPRINT ("Failed to allocate a log packet!\n"); return Retry; } @@ -1740,6 +1757,10 @@ TryAgain: DeviceExtension->PartitionLength.QuadPart = (DeviceExtension->PartitionLength.QuadPart << DeviceExtension->SectorShift); + DeviceExtension->PartitionLength.QuadPart = + (DeviceExtension->PartitionLength.QuadPart - + DeviceExtension->StartingOffset.QuadPart); + if (DeviceObject->Characteristics & FILE_REMOVABLE_MEDIA) { DeviceExtension->DiskGeometry->MediaType = RemovableMedia; @@ -1752,7 +1773,8 @@ TryAgain: DeviceExtension->DiskGeometry->SectorsPerTrack = 32; DeviceExtension->DiskGeometry->TracksPerCylinder = 64; - DPRINT("SectorSize: %lu SectorCount: %lu\n", SectorSize, LastSector + 1); + DPRINT("SectorSize: %lu SectorCount: %lu PartitionLenght %I64d\n", SectorSize, LastSector + 1, + DeviceExtension->PartitionLength.QuadPart / 512 ); } /* Try again if device needs to be verified */ @@ -1917,7 +1939,7 @@ ScsiClassSendSrbAsynchronous(PDEVICE_OBJECT DeviceObject, FALSE, Irp)) { - DPRINT1("Mdl-Allocation failed\n"); + DPRINT("Mdl-Allocation failed\n"); return(STATUS_INSUFFICIENT_RESOURCES); } From 450a15d61f7b28394250b24f31e493fe67d9994d Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 31 Mar 2004 03:39:12 +0000 Subject: [PATCH 0696/1463] More Oops! svn path=/trunk/; revision=8933 --- reactos/drivers/storage/disk/disk.c | 11 +---------- reactos/drivers/storage/disk/makefile | 4 ++-- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/reactos/drivers/storage/disk/disk.c b/reactos/drivers/storage/disk/disk.c index 5580410c74b..4a72e2b06ce 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.36 2004/03/31 03:33:48 jimtabor Exp $ +/* $Id: disk.c,v 1.37 2004/03/31 03:39:12 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -111,15 +111,6 @@ static NTSTATUS DiskBuildPartionTable(IN PDEVICE_OBJECT DiskDeviceObject, IN PIRP Irp); -VOID STDCALL -DiskClassStartIo (IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp); - -NTSTATUS STDCALL -DiskDeviceControlCompletion (IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PVOID Context); - /* FUNCTIONS ****************************************************************/ diff --git a/reactos/drivers/storage/disk/makefile b/reactos/drivers/storage/disk/makefile index 1d26d39e95b..6753b8f231a 100644 --- a/reactos/drivers/storage/disk/makefile +++ b/reactos/drivers/storage/disk/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.6 2004/03/31 03:34:42 jimtabor Exp $ +# $Id: makefile,v 1.7 2004/03/31 03:39:12 jimtabor Exp $ PATH_TO_TOP = ../../.. @@ -12,7 +12,7 @@ TARGET_DDKLIBS = class2.a TARGET_OBJECTS = $(TARGET_NAME).o -TARGET_CFLAGS = Werror -Wall +TARGET_CFLAGS = -Werror -Wall include $(PATH_TO_TOP)/rules.mak From 22c413c3b4a9d93dff53c89d71c20a1fc90dab0e Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 31 Mar 2004 05:25:36 +0000 Subject: [PATCH 0697/1463] Removed ExFreePool and Spell error. svn path=/trunk/; revision=8934 --- reactos/drivers/storage/disk/disk.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/reactos/drivers/storage/disk/disk.c b/reactos/drivers/storage/disk/disk.c index 4a72e2b06ce..f4cf6d8f2e6 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.37 2004/03/31 03:39:12 jimtabor Exp $ +/* $Id: disk.c,v 1.38 2004/03/31 05:25:36 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -108,7 +108,7 @@ ScsiDiskCalcMbrCheckSum(IN PDEVICE_EXTENSION DeviceExtension, static NTSTATUS -DiskBuildPartionTable(IN PDEVICE_OBJECT DiskDeviceObject, +DiskBuildPartitionTable(IN PDEVICE_OBJECT DiskDeviceObject, IN PIRP Irp); @@ -838,7 +838,7 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, static NTSTATUS -DiskBuildPartionTable(IN PDEVICE_OBJECT DiskDeviceObject, +DiskBuildPartitionTable(IN PDEVICE_OBJECT DiskDeviceObject, IN PIRP Irp) { PDRIVE_LAYOUT_INFORMATION PartitionList = NULL; @@ -873,9 +873,6 @@ DiskBuildPartionTable(IN PDEVICE_OBJECT DiskDeviceObject, /* Drive is not ready. */ DPRINT("Drive not ready\n"); DiskData->DriveNotReady = TRUE; - - if (PartitionList != NULL) - ExFreePool(PartitionList); return Status; } @@ -910,8 +907,6 @@ DiskBuildPartionTable(IN PDEVICE_OBJECT DiskDeviceObject, DiskDeviceExtension->PartitionLength.QuadPart / 512 /* DrvParms.BytesPerSector*/); } } - if (PartitionList != NULL) - ExFreePool(PartitionList); DPRINT("DiskBuildPartitionTable() done\n"); @@ -1005,7 +1000,7 @@ DiskClassDeviceControl(IN PDEVICE_OBJECT DeviceObject, (DeviceExtension->DiskGeometry->MediaType == RemovableMedia)) { /* Allocate a partition list for a single entry. */ - Status = DiskBuildPartionTable(DeviceObject,Irp); + Status = DiskBuildPartitionTable(DeviceObject,Irp); } if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength < From 9ea765e409f8816d0b88bcf3de72b5c904660912 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 31 Mar 2004 14:12:04 +0000 Subject: [PATCH 0698/1463] revert patch due to problems with image lists svn path=/trunk/; revision=8935 --- reactos/lib/user32/windows/defwnd.c | 69 ++++++++++++++--------------- 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/reactos/lib/user32/windows/defwnd.c b/reactos/lib/user32/windows/defwnd.c index 34a06701b4f..730bcd9697d 100644 --- a/reactos/lib/user32/windows/defwnd.c +++ b/reactos/lib/user32/windows/defwnd.c @@ -1,4 +1,4 @@ -/* $Id: defwnd.c,v 1.126 2004/03/29 19:50:21 weiden Exp $ +/* $Id: defwnd.c,v 1.127 2004/03/31 14:12:04 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -49,41 +49,39 @@ static HBITMAP hbScrRight; static COLORREF SysColors[] = -{ - 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(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(212, 208, 200), /* COLOR_ACTIVEBORDER */ - RGB(212, 208, 200), /* COLOR_INACTIVEBORDER */ - RGB(128, 128, 128), /* COLOR_APPWORKSPACE */ - RGB(10, 36, 106), /* COLOR_HIGHLIGHT */ - RGB(255, 255, 255), /* COLOR_HIGHLIGHTTEXT */ - 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(212, 208, 200), /* COLOR_INACTIVECAPTIONTEXT */ - RGB(255, 255, 255), /* COLOR_BTNHIGHLIGHT */ - RGB(64, 64, 64), /* COLOR_3DDKSHADOW */ - RGB(212, 208, 200), /* COLOR_3DLIGHT */ - RGB(0, 0, 0), /* COLOR_INFOTEXT */ - RGB(255, 255, 225), /* COLOR_INFOBK */ - RGB(181, 181, 181), /* COLOR_UNKNOWN */ - RGB(0, 0, 128), /* COLOR_HOTLIGHT */ - RGB(166, 202, 240), /* COLOR_GRADIENTACTIVECAPTION */ - RGB(192, 192, 192), /* COLOR_GRADIENTINACTIVECAPTION */ - RGB(49, 106, 197), /* COLOR_MENUHILIGHT */ - RGB(236, 233, 216) /* COLOR_MENUBAR */ -}; + { + RGB(192, 192, 192) /* 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(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(128, 128, 128) /* COLOR_APPWORKSPACE */, + RGB(0, 0, 128) /* COLOR_HILIGHT */, + RGB(255, 255, 255) /* COLOR_HILIGHTTEXT */, + RGB(192, 192, 192) /* 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(255, 255, 255) /* COLOR_BTNHILIGHT */, + RGB(32, 32, 32) /* COLOR_3DDKSHADOW */, + RGB(192, 192, 192) /* 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(166, 202, 240) /* COLOR_GRADIENTACTIVECAPTION */, + RGB(192, 192, 192) /* COLOR_GRADIENTINACTIVECAPTION */, + }; -#define NUM_SYSCOLORS 31 +#define NUM_SYSCOLORS (sizeof(SysColors) / sizeof(SysColors[0])) /* Bits in the dwKeyData */ #define KEYDATA_ALT 0x2000 @@ -1564,3 +1562,4 @@ DefWindowProcW(HWND hWnd, return User32DefWindowProc(hWnd, Msg, wParam, lParam, TRUE); } + From 21beea176de694e998c5572b756ed11e1b396fd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Wed, 31 Mar 2004 18:37:12 +0000 Subject: [PATCH 0699/1463] Remove window timers when window is destroyed svn path=/trunk/; revision=8936 --- reactos/subsys/win32k/include/timer.h | 1 + reactos/subsys/win32k/ntuser/timer.c | 67 +++++++++++++++++++-------- reactos/subsys/win32k/ntuser/window.c | 5 +- 3 files changed, 52 insertions(+), 21 deletions(-) diff --git a/reactos/subsys/win32k/include/timer.h b/reactos/subsys/win32k/include/timer.h index f2a1d883f67..5bb392c8f82 100644 --- a/reactos/subsys/win32k/include/timer.h +++ b/reactos/subsys/win32k/include/timer.h @@ -11,6 +11,7 @@ typedef struct _MSG_TIMER_ENTRY{ NTSTATUS FASTCALL InitTimerImpl(VOID); VOID FASTCALL RemoveTimersThread(HANDLE ThreadID); +VOID FASTCALL RemoveTimersWindow(HWND hWnd); PMSG_TIMER_ENTRY FASTCALL IntRemoveTimer(HWND hWnd, UINT_PTR IDEvent, HANDLE ThreadID, BOOL SysTimer); UINT_PTR FASTCALL IntSetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc, BOOL SystemTimer); diff --git a/reactos/subsys/win32k/ntuser/timer.c b/reactos/subsys/win32k/ntuser/timer.c index 6685eb26c86..6bd70e98f53 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.28 2004/03/29 17:02:22 navaraf Exp $ +/* $Id: timer.c,v 1.29 2004/03/31 18:37:12 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -61,10 +61,10 @@ static HANDLE MsgTimerThreadHandle; static CLIENT_ID MsgTimerThreadId; -#define IntLockTimerList \ +#define IntLockTimerList() \ ExAcquireFastMutex(&Mutex) -#define IntUnLockTimerList \ +#define IntUnLockTimerList() \ ExReleaseFastMutex(&Mutex) /* FUNCTIONS *****************************************************************/ @@ -123,7 +123,7 @@ RemoveTimersThread(HANDLE ThreadID) PMSG_TIMER_ENTRY MsgTimer; PLIST_ENTRY EnumEntry; - IntLockTimerList; + IntLockTimerList(); EnumEntry = TimerListHead.Flink; while (EnumEntry != &TimerListHead) @@ -143,7 +143,35 @@ RemoveTimersThread(HANDLE ThreadID) } } - IntUnLockTimerList; + IntUnLockTimerList(); +} + + +/* + * NOTE: It doesn't kill the timer. It just removes them from the list. + */ +VOID FASTCALL +RemoveTimersWindow(HWND Wnd) +{ + PMSG_TIMER_ENTRY MsgTimer; + PLIST_ENTRY EnumEntry; + + IntLockTimerList(); + + EnumEntry = TimerListHead.Flink; + while (EnumEntry != &TimerListHead) + { + MsgTimer = CONTAINING_RECORD(EnumEntry, MSG_TIMER_ENTRY, ListEntry); + EnumEntry = EnumEntry->Flink; + + if (MsgTimer->Msg.hwnd == Wnd) + { + RemoveEntryList(&MsgTimer->ListEntry); + ExFreePool(MsgTimer); + } + } + + IntUnLockTimerList(); } @@ -157,10 +185,10 @@ IntSetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc, B PWINDOW_OBJECT WindowObject; HANDLE ThreadID; UINT_PTR Ret = 0; - + ThreadID = PsGetCurrentThreadId(); KeQuerySystemTime(&CurrentTime); - IntLockTimerList; + IntLockTimerList(); if((hWnd == NULL) && !SystemTimer) { @@ -169,7 +197,7 @@ IntSetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc, B if(Index == (ULONG) -1) { - IntUnLockTimerList; + IntUnLockTimerList(); return 0; } @@ -180,14 +208,14 @@ IntSetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc, B WindowObject = IntGetWindowObject(hWnd); if(!WindowObject) { - IntUnLockTimerList; + IntUnLockTimerList(); SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return 0; } if(WindowObject->OwnerThread != PsGetCurrentThread()) { - IntUnLockTimerList; + IntUnLockTimerList(); IntReleaseWindowObject(WindowObject); SetLastWin32Error(ERROR_ACCESS_DENIED); return 0; @@ -231,7 +259,7 @@ IntSetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc, B NewTimer = ExAllocatePoolWithTag(PagedPool, sizeof(MSG_TIMER_ENTRY), TAG_TIMER); if(!NewTimer) { - IntUnLockTimerList; + IntUnLockTimerList(); SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); return 0; } @@ -253,7 +281,7 @@ IntSetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc, B KeSetTimer(&Timer, NewTimer->Timeout, NULL); } - IntUnLockTimerList; + IntUnLockTimerList(); return Ret; } @@ -265,14 +293,14 @@ IntKillTimer(HWND hWnd, UINT_PTR uIDEvent, BOOL SystemTimer) PMSG_TIMER_ENTRY MsgTimer; PWINDOW_OBJECT WindowObject; - IntLockTimerList; + IntLockTimerList(); /* window-less timer? */ if((hWnd == NULL) && !SystemTimer) { if(!RtlAreBitsSet(&WindowLessTimersBitMap, uIDEvent - 1, 1)) { - IntUnLockTimerList; + IntUnLockTimerList(); /* bit was not set */ /* FIXME: set the last error */ return FALSE; @@ -285,13 +313,13 @@ IntKillTimer(HWND hWnd, UINT_PTR uIDEvent, BOOL SystemTimer) WindowObject = IntGetWindowObject(hWnd); if(!WindowObject) { - IntUnLockTimerList; + IntUnLockTimerList(); SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return FALSE; } if(WindowObject->OwnerThread != PsGetCurrentThread()) { - IntUnLockTimerList; + IntUnLockTimerList(); IntReleaseWindowObject(WindowObject); SetLastWin32Error(ERROR_ACCESS_DENIED); return FALSE; @@ -301,7 +329,7 @@ IntKillTimer(HWND hWnd, UINT_PTR uIDEvent, BOOL SystemTimer) MsgTimer = IntRemoveTimer(hWnd, uIDEvent, PsGetCurrentThreadId(), SystemTimer); - IntUnLockTimerList; + IntUnLockTimerList(); if(MsgTimer == NULL) { @@ -316,7 +344,6 @@ IntKillTimer(HWND hWnd, UINT_PTR uIDEvent, BOOL SystemTimer) return TRUE; } -extern VOID STDCALL ValidateNonPagedPool(VOID); static VOID STDCALL TimerThreadMain(PVOID StartContext) { @@ -343,7 +370,7 @@ TimerThreadMain(PVOID StartContext) ThreadsToDereferenceCount = ThreadsToDereferencePos = 0; - IntLockTimerList; + IntLockTimerList(); KeQuerySystemTime(&CurrentTime); @@ -412,7 +439,7 @@ TimerThreadMain(PVOID StartContext) KeSetTimer(&Timer, MsgTimer->Timeout, NULL); } - IntUnLockTimerList; + IntUnLockTimerList(); for (i = 0; i < ThreadsToDereferencePos; i++) ObDereferenceObject(ThreadsToDereference[i]); diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 696025f36c7..27f9d77fc99 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.204 2004/03/30 22:49:38 gvg Exp $ +/* $Id: window.c,v 1.205 2004/03/31 18:37:12 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -53,6 +53,7 @@ #include #include #include +#include #define NDEBUG #include @@ -292,6 +293,8 @@ static LRESULT IntDestroyWindow(PWINDOW_OBJECT Window, BOOL BelongsToThreadData; ASSERT(Window); + + RemoveTimersWindow(Window->Self); IntLockThreadWindows(Window->OwnerThread->Win32Thread); if(Window->Status & WINDOWSTATUS_DESTROYING) From dfa957c31031ebb133db5f5d1802164d458be655 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Wed, 31 Mar 2004 19:20:18 +0000 Subject: [PATCH 0700/1463] IntGetParentObject() does it's own locking, prevent double lock svn path=/trunk/; revision=8937 --- reactos/subsys/win32k/ntuser/window.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 27f9d77fc99..69cab7938fb 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.205 2004/03/31 18:37:12 gvg Exp $ +/* $Id: window.c,v 1.206 2004/03/31 19:20:18 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -2616,7 +2616,6 @@ NtUserGetWindow(HWND hWnd, UINT Relationship) return NULL; } - IntLockRelatives(WindowObject); switch (Relationship) { case GW_HWNDFIRST: @@ -2642,28 +2641,35 @@ NtUserGetWindow(HWND hWnd, UINT Relationship) break; case GW_HWNDNEXT: + IntLockRelatives(WindowObject); if (WindowObject->NextSibling) hWndResult = WindowObject->NextSibling->Self; + IntUnLockRelatives(WindowObject); break; case GW_HWNDPREV: + IntLockRelatives(WindowObject); if (WindowObject->PrevSibling) hWndResult = WindowObject->PrevSibling->Self; + IntUnLockRelatives(WindowObject); break; case GW_OWNER: + IntLockRelatives(WindowObject); if((Parent = IntGetWindowObject(WindowObject->Owner))) { hWndResult = Parent->Self; IntReleaseWindowObject(Parent); } + IntUnLockRelatives(WindowObject); break; case GW_CHILD: + IntLockRelatives(WindowObject); if (WindowObject->FirstChild) hWndResult = WindowObject->FirstChild->Self; + IntUnLockRelatives(WindowObject); break; } - IntUnLockRelatives(WindowObject); IntReleaseWindowObject(WindowObject); From 96a21f824fbae5bb3f43871c64ed7ac25aeb02ab Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 31 Mar 2004 19:44:34 +0000 Subject: [PATCH 0701/1463] fixed NtUserGetAncestor() svn path=/trunk/; revision=8938 --- reactos/subsys/win32k/ntuser/msgqueue.c | 8 ++--- reactos/subsys/win32k/ntuser/window.c | 48 ++++++++++++------------- 2 files changed, 25 insertions(+), 31 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index 7e8acfd9f40..597f4ab719c 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.79 2004/03/28 21:46:26 weiden Exp $ +/* $Id: msgqueue.c,v 1.80 2004/03/31 19:44:34 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -248,8 +248,6 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, USHORT Msg = Message->Msg.message; PWINDOW_OBJECT CaptureWin, Window = NULL; POINT Point; - LPARAM SpareLParam; - LRESULT Result; if (Msg == WM_LBUTTONDOWN || Msg == WM_MBUTTONDOWN || @@ -269,11 +267,11 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, { if(Window->Self != IntGetFocusWindow()) { - SpareLParam = MAKELONG(*HitTest, Msg); if(*HitTest != (USHORT)HTTRANSPARENT) { - Result = IntSendMessage(Window->Self, WM_MOUSEACTIVATE, (WPARAM)NtUserGetParent(Window->Self), (LPARAM)SpareLParam); + LRESULT Result; + Result = IntSendMessage(Window->Self, WM_MOUSEACTIVATE, (WPARAM)NtUserGetParent(Window->Self), (LPARAM)MAKELONG(*HitTest, Msg)); switch (Result) { diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 69cab7938fb..7c81158cbce 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.206 2004/03/31 19:20:18 gvg Exp $ +/* $Id: window.c,v 1.207 2004/03/31 19:44:34 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -2124,40 +2124,38 @@ NtUserGetAncestor(HWND hWnd, UINT Type) switch (Type) { case GA_PARENT: + { WndAncestor = IntGetParentObject(Wnd); break; + } case GA_ROOT: + { + PWINDOW_OBJECT tmp; WndAncestor = Wnd; Parent = NULL; -#if 0 - while (0 != (WndAncestor->Style & WS_CHILD)) - { - Parent = IntGetParentObject(WndAncestor); - if (WndAncestor != Wnd) - { - IntReleaseWindowObject(WndAncestor); - } - WndAncestor = Parent; - } -#else + for(;;) { - if(Parent) - { - IntReleaseWindowObject(Parent); - } - if(!(Parent = IntGetParentObject(WndAncestor)) || - !IntIsDesktopWindow(WndAncestor)) + tmp = Parent; + if(!(Parent = IntGetParentObject(WndAncestor))) { break; } + if(IntIsDesktopWindow(Parent)) + { + IntReleaseWindowObject(Parent); + break; + } + if(tmp) + IntReleaseWindowObject(tmp); WndAncestor = Parent; } -#endif break; + } case GA_ROOTOWNER: + { WndAncestor = Wnd; IntReferenceWindowObject(WndAncestor); for (;;) @@ -2173,21 +2171,19 @@ NtUserGetAncestor(HWND hWnd, UINT Type) WndAncestor = Parent; } break; + } default: + { IntReleaseWindowObject(Wnd); return NULL; + } } + hWndAncestor = (WndAncestor ? WndAncestor->Self : NULL); IntReleaseWindowObject(Wnd); - if(!WndAncestor) - { - return NULL; - } - - hWndAncestor = WndAncestor->Self; - if(WndAncestor != Wnd) + if(WndAncestor && (WndAncestor != Wnd)) IntReleaseWindowObject(WndAncestor); return hWndAncestor; From a75dfe1a82a0df89f0c52ac6207c9ca4f220fa53 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 31 Mar 2004 21:21:30 +0000 Subject: [PATCH 0702/1463] fixed DbgPrint line ending svn path=/trunk/; revision=8939 --- 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 d8a971f2ddc..ff9b19bafef 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.14 2004/03/28 23:25:48 navaraf Exp $ */ +/* $Id: dib32bpp.c,v 1.15 2004/03/31 21:21:30 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -227,7 +227,7 @@ DIB_32BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, else { /* FIXME */ - DPRINT1("DIB_32BPP_Bitblt: Unhandled ColorTranslation for 32 -> 32 copy"); + DPRINT1("DIB_32BPP_Bitblt: Unhandled ColorTranslation (0x%x) for 32 -> 32 copy\n", ColorTranslation->flXlate); return FALSE; } break; From a7456eb9686a1f49ba20381fbd939acd809b45fc Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Thu, 1 Apr 2004 13:53:08 +0000 Subject: [PATCH 0703/1463] Fix bugs in RegQueryValueExA() and RegQueryValueExW() that caused crashes or returned bogus information if the caller wants to retrieve the value data length only. This fixes some bugs with regedit. svn path=/trunk/; revision=8940 --- reactos/lib/advapi32/reg/reg.c | 102 +++++++++++++++++++-------------- 1 file changed, 60 insertions(+), 42 deletions(-) diff --git a/reactos/lib/advapi32/reg/reg.c b/reactos/lib/advapi32/reg/reg.c index ac1c5309084..c8ab9e66bc3 100644 --- a/reactos/lib/advapi32/reg/reg.c +++ b/reactos/lib/advapi32/reg/reg.c @@ -1,4 +1,4 @@ -/* $Id: reg.c,v 1.44 2004/02/25 14:25:10 ekohl Exp $ +/* $Id: reg.c,v 1.45 2004/04/01 13:53:08 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -2191,10 +2191,10 @@ RegQueryValueExW (HKEY hKey, ErrorCode = RtlNtStatusToDosError (Status); SetLastError (ErrorCode); MaxCopy = 0; - if (NULL != lpcbData) - { - ResultSize = sizeof(*ValueInfo) + *lpcbData; - } + if (lpcbData != NULL) + { + ResultSize = sizeof(*ValueInfo) + *lpcbData; + } } if (lpType != NULL) @@ -2202,27 +2202,35 @@ RegQueryValueExW (HKEY hKey, *lpType = ValueInfo->Type; } - if (NT_SUCCESS(Status)) - RtlMoveMemory (lpData, - ValueInfo->Data, - min(ValueInfo->DataLength,MaxCopy)); + if (NT_SUCCESS(Status) && lpData != NULL) + { + RtlMoveMemory (lpData, + ValueInfo->Data, + min(ValueInfo->DataLength, MaxCopy)); + } if ((ValueInfo->Type == REG_SZ) || (ValueInfo->Type == REG_MULTI_SZ) || (ValueInfo->Type == REG_EXPAND_SZ)) { - if (MaxCopy > ValueInfo->DataLength) - ((PWSTR)lpData)[ValueInfo->DataLength / sizeof(WCHAR)] = 0; - - if (lpcbData) { - *lpcbData = (ResultSize - sizeof(*ValueInfo)); - DPRINT("(string) Returning Size: %d\n", *lpcbData); - } + if (lpData != NULL && MaxCopy > ValueInfo->DataLength) + { + ((PWSTR)lpData)[ValueInfo->DataLength / sizeof(WCHAR)] = 0; + } + + if (lpcbData != NULL) + { + *lpcbData = (ResultSize - sizeof(*ValueInfo)); + DPRINT("(string) Returning Size: %lu\n", *lpcbData); + } } else - if (lpcbData) { - *lpcbData = ResultSize - sizeof(*ValueInfo); - DPRINT("(other) Returning Size: %d\n", *lpcbData); + { + if (lpcbData != NULL) + { + *lpcbData = ResultSize - sizeof(*ValueInfo); + DPRINT("(other) Returning Size: %lu\n", *lpcbData); + } } DPRINT("Type %d Size %d\n", ValueInfo->Type, ValueInfo->DataLength); @@ -2255,7 +2263,7 @@ RegQueryValueExA (HKEY hKey, DWORD Length; DWORD Type; - if ((lpData) && (!lpcbData)) + if (lpData != NULL && lpcbData == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return ERROR_INVALID_PARAMETER; @@ -2269,10 +2277,10 @@ RegQueryValueExA (HKEY hKey, 0, ValueData.MaximumLength); if (!ValueData.Buffer) - { - SetLastError(ERROR_OUTOFMEMORY); - return ERROR_OUTOFMEMORY; - } + { + SetLastError(ERROR_OUTOFMEMORY); + return ERROR_OUTOFMEMORY; + } } else { @@ -2284,42 +2292,52 @@ RegQueryValueExA (HKEY hKey, RtlCreateUnicodeStringFromAsciiz (&ValueName, (LPSTR)lpValueName); - /* Convert length from USHORT to DWORD */ - Length = ValueData.Length; + Length = *lpcbData * sizeof(WCHAR); ErrorCode = RegQueryValueExW (hKey, ValueName.Buffer, lpReserved, &Type, (LPBYTE)ValueData.Buffer, &Length); - if (lpType != NULL) - *lpType = Type; + DPRINT("ErrorCode %lu\n", ErrorCode); - if ((ErrorCode == ERROR_SUCCESS) && (ValueData.Buffer != NULL)) + if (ErrorCode == ERROR_SUCCESS || + ErrorCode == ERROR_MORE_DATA) { + if (lpType != NULL) + { + *lpType = Type; + } + if ((Type == REG_SZ) || (Type == REG_MULTI_SZ) || (Type == REG_EXPAND_SZ)) { - RtlInitAnsiString(&AnsiString, NULL); - AnsiString.Buffer = lpData; - AnsiString.MaximumLength = *lpcbData; - ValueData.Length = Length; - ValueData.MaximumLength = ValueData.Length + sizeof(WCHAR); - RtlUnicodeStringToAnsiString(&AnsiString, &ValueData, FALSE); + if (ErrorCode == ERROR_SUCCESS && ValueData.Buffer != NULL) + { + RtlInitAnsiString(&AnsiString, NULL); + AnsiString.Buffer = lpData; + AnsiString.MaximumLength = *lpcbData; + ValueData.Length = Length; + ValueData.MaximumLength = ValueData.Length + sizeof(WCHAR); + RtlUnicodeStringToAnsiString(&AnsiString, &ValueData, FALSE); + } Length = Length / sizeof(WCHAR); } else { Length = min(*lpcbData, Length); - RtlMoveMemory(lpData, ValueData.Buffer, Length); + if (ErrorCode == ERROR_SUCCESS && ValueData.Buffer != NULL) + { + RtlMoveMemory(lpData, ValueData.Buffer, Length); + } + } + + if (lpcbData != NULL) + { + *lpcbData = Length; } } - if (lpcbData != NULL) - { - *lpcbData = Length; - } - - if (ValueData.Buffer) + if (ValueData.Buffer != NULL) { RtlFreeHeap(ProcessHeap, 0, ValueData.Buffer); } From f8e193fbc68d7f6ecce9fe2f77c58d214176dccd Mon Sep 17 00:00:00 2001 From: James Tabor Date: Thu, 1 Apr 2004 15:01:35 +0000 Subject: [PATCH 0704/1463] Wrong to remove ExFreePool. svn path=/trunk/; revision=8941 --- reactos/drivers/storage/disk/disk.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/storage/disk/disk.c b/reactos/drivers/storage/disk/disk.c index f4cf6d8f2e6..870ec06c00e 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.38 2004/03/31 05:25:36 jimtabor Exp $ +/* $Id: disk.c,v 1.39 2004/04/01 15:01:35 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -873,6 +873,8 @@ DiskBuildPartitionTable(IN PDEVICE_OBJECT DiskDeviceObject, /* Drive is not ready. */ DPRINT("Drive not ready\n"); DiskData->DriveNotReady = TRUE; + if (PartitionList != NULL) + ExFreePool(PartitionList); return Status; } @@ -909,7 +911,8 @@ DiskBuildPartitionTable(IN PDEVICE_OBJECT DiskDeviceObject, } DPRINT("DiskBuildPartitionTable() done\n"); - + if (PartitionList != NULL) + ExFreePool(PartitionList); return(STATUS_SUCCESS); } From 2dabdb2ac15dcde17fa8332137c91e7d207e5860 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Thu, 1 Apr 2004 17:24:47 +0000 Subject: [PATCH 0705/1463] Added MediaChangeCount svn path=/trunk/; revision=8942 --- reactos/drivers/storage/disk/disk.c | 35 ++++++++++++++++------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/reactos/drivers/storage/disk/disk.c b/reactos/drivers/storage/disk/disk.c index 870ec06c00e..18206d34000 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.39 2004/04/01 15:01:35 jimtabor Exp $ +/* $Id: disk.c,v 1.40 2004/04/01 17:24:47 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -839,7 +839,7 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, static NTSTATUS DiskBuildPartitionTable(IN PDEVICE_OBJECT DiskDeviceObject, - IN PIRP Irp) + IN PIRP Irp) { PDRIVE_LAYOUT_INFORMATION PartitionList = NULL; PDEVICE_EXTENSION DiskDeviceExtension; @@ -912,7 +912,7 @@ DiskBuildPartitionTable(IN PDEVICE_OBJECT DiskDeviceObject, DPRINT("DiskBuildPartitionTable() done\n"); if (PartitionList != NULL) - ExFreePool(PartitionList); + ExFreePool(PartitionList); return(STATUS_SUCCESS); } @@ -1002,7 +1002,7 @@ DiskClassDeviceControl(IN PDEVICE_OBJECT DeviceObject, if ((DeviceObject->Characteristics & FILE_REMOVABLE_MEDIA) && (DeviceExtension->DiskGeometry->MediaType == RemovableMedia)) { - /* Allocate a partition list for a single entry. */ + /* Update a partition list for a single entry. */ Status = DiskBuildPartitionTable(DeviceObject,Irp); } @@ -1179,22 +1179,25 @@ DiskClassDeviceControl(IN PDEVICE_OBJECT DeviceObject, ExFreePool (ModeData); } break; - + case IOCTL_DISK_CHECK_VERIFY: - DPRINT("IOCTL_DISK_CHECK_VERIFY\n"); - if (DeviceObject->Flags & DO_VERIFY_VOLUME) + DPRINT("IOCTL_DISK_CHECK_VERIFY\n"); + Information = 0; + if (OutputLength != 0) { - DPRINT("Do Verify Set\n"); - Status = STATUS_VERIFY_REQUIRED; - Information = 0; - } - else - { - DPRINT("Do Verify Clear\n"); - Status = STATUS_SUCCESS; - Information = 0; + ((PULONG)(Irp->AssociatedIrp.SystemBuffer)) = + 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: From d945804c339d51ed0c3a9f72f4b0104703ed1c70 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Thu, 1 Apr 2004 17:29:53 +0000 Subject: [PATCH 0706/1463] Added MediaChangeNoMedia on/off svn path=/trunk/; revision=8943 --- reactos/drivers/storage/class2/class2.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/reactos/drivers/storage/class2/class2.c b/reactos/drivers/storage/class2/class2.c index 12852fe694a..2d4f399977f 100644 --- a/reactos/drivers/storage/class2/class2.c +++ b/reactos/drivers/storage/class2/class2.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: class2.c,v 1.51 2004/03/31 03:34:55 jimtabor Exp $ +/* $Id: class2.c,v 1.52 2004/04/01 17:29:53 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1172,6 +1172,13 @@ ScsiClassInterpretSenseInfo(IN PDEVICE_OBJECT DeviceObject, { case SCSI_ADSENSE_MEDIUM_CHANGED: DPRINT("SCSI_ADSENSE_MEDIUM_CHANGED\n"); + if(DeviceExtension->MediaChangeEvent != NULL) + { + KeSetEvent(DeviceExtension->MediaChangeEvent, + 0, + FALSE); + DeviceExtension->MediaChangeNoMedia = FALSE; + } break; case SCSI_ADSENSE_BUS_RESET: From 59fbb630834c4f38d8dc045d60f2329f577b73f5 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Thu, 1 Apr 2004 19:13:19 +0000 Subject: [PATCH 0707/1463] Merged Wine commit: Do not strip stdcall decoration in spec files. svn path=/trunk/; revision=8944 --- reactos/lib/shell32/shell32.spec | 50 ++++++++++++++++---------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/reactos/lib/shell32/shell32.spec b/reactos/lib/shell32/shell32.spec index ec7384ad548..d45db9bf719 100644 --- a/reactos/lib/shell32/shell32.spec +++ b/reactos/lib/shell32/shell32.spec @@ -6,10 +6,10 @@ 2 stdcall SHChangeNotifyRegister(long long long long long ptr) 4 stdcall SHChangeNotifyDeregister (long) 5 stdcall SHChangeNotifyUpdateEntryList (long long long long) - 9 stub PifMgr_OpenProperties@16 - 10 stub PifMgr_GetProperties@20 - 11 stub PifMgr_SetProperties@20 - 13 stub PifMgr_CloseProperties@8 + 9 stub PifMgr_OpenProperties + 10 stub PifMgr_GetProperties + 11 stub PifMgr_SetProperties + 13 stub PifMgr_CloseProperties 15 stdcall ILGetDisplayName(ptr ptr) 16 stdcall ILFindLastID(ptr) 17 stdcall ILRemoveLastID(ptr) @@ -202,7 +202,7 @@ 212 stub Printers_AddPrinterPropPages 213 stub Printers_RegisterWindowW 214 stub Printers_UnregisterWindow - 215 stub SHStartNetConnectionDialog@12 + 215 stub SHStartNetConnectionDialog 243 stdcall @(long long) shell32_243 244 stdcall SHInitRestricted(ptr ptr) 247 stdcall SHGetDataFromIDListA (ptr ptr long ptr long) @@ -219,8 +219,8 @@ 276 stub SheFullPathA 277 stub SheFullPathW 278 stub SheGetCurDrive - 279 stub SheGetDirA@8 - 280 stub SheGetDirExW@12 + 279 stub SheGetDirA + 280 stub SheGetDirExW 281 stdcall SheGetDirW (long long) 282 stub SheGetPathOffsetW 283 stub SheRemoveQuotesA @@ -272,7 +272,7 @@ 505 stdcall SHRegCloseKey (long) 506 stdcall SHRegOpenKeyA (long str long) 507 stdcall SHRegOpenKeyW (long wstr long) - 508 stub SHRegQueryValueA@16 + 508 stub SHRegQueryValueA 509 stdcall SHRegQueryValueExA(long str ptr ptr ptr ptr) 510 stdcall SHRegQueryValueW (long long long long) 511 stdcall SHRegQueryValueExW (long wstr ptr ptr ptr ptr) @@ -282,18 +282,18 @@ 521 stdcall SHLockShared (long long) 522 stdcall SHUnlockShared (long) 523 stdcall SHFreeShared (long long) - 524 stub RealDriveType@8 - 525 stub RealDriveTypeFlags@8 + 524 stub RealDriveType + 525 stub RealDriveTypeFlags 640 stdcall NTSHChangeNotifyRegister (long long long long long long) 641 stdcall NTSHChangeNotifyDeregister (long) - 643 stub SHChangeNotifyReceive@16 + 643 stub SHChangeNotifyReceive 644 stdcall SHChangeNotification_Lock(long long ptr ptr) 645 stdcall SHChangeNotification_Unlock(long) - 646 stub SHChangeRegistrationReceive@8 - 647 stub ReceiveAddToRecentDocs@8 - 648 stub SHWaitOp_Operate@8 + 646 stub SHChangeRegistrationReceive + 647 stub ReceiveAddToRecentDocs + 648 stub SHWaitOp_Operate 650 stdcall PathIsSameRoot(ptr ptr)PathIsSameRootAW @@ -373,33 +373,33 @@ @ stdcall SHCreateDirectoryExA(long str ptr) @ stdcall SHCreateDirectoryExW(long wstr ptr) @ stub ShellHookProc -@ stub SHEmptyRecycleBinA@12 -@ stub SHEmptyRecycleBinW@12 +@ stub SHEmptyRecycleBinA +@ stub SHEmptyRecycleBinW @ stdcall SHFileOperation(ptr)SHFileOperationAW @ stdcall SHFileOperationA(ptr) @ stdcall SHFileOperationW(ptr) -@ stub SHFormatDrive@16 -@ stub SHFreeNameMappings@4 +@ stub SHFormatDrive +@ stub SHFreeNameMappings @ stdcall SHGetDesktopFolder(ptr) @ stdcall SHGetFileInfo(ptr long ptr long long)SHGetFileInfoAW @ stdcall SHGetFileInfoA(ptr long ptr long long) @ stdcall SHGetFileInfoW(ptr long ptr long long) @ stdcall SHGetInstanceExplorer(long) @ stdcall SHGetMalloc(ptr) -@ stub SHGetNewLinkInfo@20 +@ stub SHGetNewLinkInfo @ stdcall SHGetPathFromIDList(ptr ptr)SHGetPathFromIDListAW @ stdcall SHGetPathFromIDListA(ptr ptr) @ stdcall SHGetPathFromIDListW(ptr ptr) @ stdcall SHGetSettings(ptr long) @ stdcall SHGetSpecialFolderLocation(long long ptr) @ stdcall SHHelpShortcuts_RunDLL(long long long long) -@ stub SHHelpShortcuts_RunDLLA@16 -@ stub SHHelpShortcuts_RunDLLW@16 +@ stub SHHelpShortcuts_RunDLLA +@ stub SHHelpShortcuts_RunDLLW @ stdcall SHLoadInProc(long) -@ stub SHQueryRecycleBinA@8 -@ stub SHQueryRecycleBinW@8 -@ stub SHUpdateRecycleBinIcon@0 -@ stub WOWShellExecute@28 +@ stub SHQueryRecycleBinA +@ stub SHQueryRecycleBinW +@ stub SHUpdateRecycleBinIcon +@ stub WOWShellExecute # # version 4.70 (IE3.0) From cd8132e2d26538aa994cf740ea005bfdf7e940af Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Thu, 1 Apr 2004 19:14:14 +0000 Subject: [PATCH 0708/1463] Merged Wine commit: Kevin Koltzau Added support for CSIDL_RESOURCES path. svn path=/trunk/; revision=8945 --- reactos/lib/shell32/shellpath.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/reactos/lib/shell32/shellpath.c b/reactos/lib/shell32/shellpath.c index 8d8521479e2..c1912ccce58 100644 --- a/reactos/lib/shell32/shellpath.c +++ b/reactos/lib/shell32/shellpath.c @@ -997,9 +997,9 @@ static const CSIDL_DATA CSIDL_Data[] = /*"Documents and Settings\\"*/"All Users\\Documents\\My Video" }, { /* CSIDL_RESOURCES */ - 0, 0, /* FIXME */ + 0, (HKEY)2, NULL, - NULL + "Resources" }, { /* CSIDL_RESOURCES_LOCALIZED */ 0, 0, /* FIXME */ @@ -1070,6 +1070,15 @@ HRESULT WINAPI SHGetFolderPathW( MultiByteToWideChar(CP_ACP, 0, CSIDL_Data[folder].szValueName, -1, szValueName, MAX_PATH); MultiByteToWideChar(CP_ACP, 0, CSIDL_Data[folder].szDefaultPath, -1, szDefaultPath, MAX_PATH); + /* Special case for some values that don't exist in registry */ + if (CSIDL_Data[folder].hRootKey == (HKEY)2) + { + GetWindowsDirectoryW(pszPath, MAX_PATH); + PathAddBackslashW(pszPath); + strcatW(pszPath, szDefaultPath); + return S_OK; + } + if (dwCsidlFlags & CSIDL_MYFLAG_SHFOLDER) { /* user shell folders */ From fc8f381519c39207cd13c94d1ecf7b552d04687e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Thu, 1 Apr 2004 19:31:05 +0000 Subject: [PATCH 0709/1463] Implement 32bpp -> 32bpp copy with color translation svn path=/trunk/; revision=8946 --- reactos/subsys/win32k/dib/dib32bpp.c | 61 ++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 4 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib32bpp.c b/reactos/subsys/win32k/dib/dib32bpp.c index ff9b19bafef..c869bdf747d 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.15 2004/03/31 21:21:30 weiden Exp $ */ +/* $Id: dib32bpp.c,v 1.16 2004/04/01 19:31:05 gvg Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -83,6 +83,7 @@ DIB_32BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, 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; @@ -226,9 +227,61 @@ DIB_32BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } else { - /* FIXME */ - DPRINT1("DIB_32BPP_Bitblt: Unhandled ColorTranslation (0x%x) for 32 -> 32 copy\n", ColorTranslation->flXlate); - return FALSE; + if (DestRect->top < SourcePoint->y) + { + SourceBits = (SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 4 * SourcePoint->x); + for (j = DestRect->top; j < DestRect->bottom; j++) + { + if (DestRect->left < SourcePoint->x) + { + Dest32 = (DWORD *) DestBits; + Source32 = (DWORD *) SourceBits; + for (i = DestRect->left; i < DestRect->right; i++) + { + *Dest32++ = XLATEOBJ_iXlate(ColorTranslation, *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-- = XLATEOBJ_iXlate(ColorTranslation, *Source32--); + } + } + SourceBits += SourceSurf->lDelta; + DestBits += DestSurf->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--) + { + if (DestRect->left < SourcePoint->x) + { + Dest32 = (DWORD *) DestBits; + Source32 = (DWORD *) SourceBits; + for (i = DestRect->left; i < DestRect->right; i++) + { + *Dest32++ = XLATEOBJ_iXlate(ColorTranslation, *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-- = XLATEOBJ_iXlate(ColorTranslation, *Source32--); + } + } + SourceBits -= SourceSurf->lDelta; + DestBits -= DestSurf->lDelta; + } + } } break; From f2bb2f6dcbcd22ec4ea6f11d6f62364b9c3f6a1a Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Thu, 1 Apr 2004 20:10:07 +0000 Subject: [PATCH 0710/1463] remove useless if cases svn path=/trunk/; revision=8947 --- reactos/lib/shell32/pidl.c | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/reactos/lib/shell32/pidl.c b/reactos/lib/shell32/pidl.c index 524f67f44d2..498c6b3a790 100644 --- a/reactos/lib/shell32/pidl.c +++ b/reactos/lib/shell32/pidl.c @@ -1600,16 +1600,8 @@ LPITEMIDLIST _ILCreateFolder( WIN32_FIND_DATAA * stffile ) memcpy (pbuff, stffile->cFileName, len); pbuff += len; - if (stffile->cAlternateFileName) - { - len1 = strlen (stffile->cAlternateFileName)+1; - memcpy (pbuff, stffile->cAlternateFileName, len1); - } - else - { - len1 = 1; - *pbuff = 0x00; - } + len1 = strlen (stffile->cAlternateFileName)+1; + memcpy (pbuff, stffile->cAlternateFileName, len1); pidl = _ILCreate(PT_FOLDER, (LPVOID)buff, len + len1); @@ -1640,16 +1632,8 @@ LPITEMIDLIST _ILCreateValue(WIN32_FIND_DATAA * stffile) memcpy (pbuff, stffile->cFileName, len); pbuff += len; - if (stffile->cAlternateFileName) - { - len1 = strlen (stffile->cAlternateFileName)+1; - memcpy (pbuff, stffile->cAlternateFileName, len1); - } - else - { - len1 = 1; - *pbuff = 0x00; - } + len1 = strlen (stffile->cAlternateFileName)+1; + memcpy (pbuff, stffile->cAlternateFileName, len1); pidl = _ILCreate(PT_VALUE, (LPVOID)buff, len + len1); From 81361062a2d539c6a40b9c7274fa495a819430da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Thu, 1 Apr 2004 23:16:21 +0000 Subject: [PATCH 0711/1463] Fix interaction between topmost and owner/owned windows svn path=/trunk/; revision=8948 --- reactos/subsys/win32k/ntuser/winpos.c | 33 +++++++++++++++++++++------ 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index d2a300a0e69..36a606d6505 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.106 2004/03/30 20:50:16 gvg Exp $ +/* $Id: winpos.c,v 1.107 2004/04/01 23:16:21 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -612,15 +612,15 @@ WinPosDoOwnedPopups(HWND hWnd, HWND hWndInsertAfter) HWND *List = NULL; HWND Owner = NtUserGetWindow(hWnd, GW_OWNER); LONG Style = NtUserGetWindowLong(hWnd, GWL_STYLE, FALSE); - PWINDOW_OBJECT DesktopWindow; + PWINDOW_OBJECT DesktopWindow, ChildObject; int i; if ((Style & WS_POPUP) && Owner) { /* Make sure this popup stays above the owner */ - HWND hWndLocalPrev = HWND_TOP; + HWND hWndLocalPrev = HWND_TOPMOST; - if (hWndInsertAfter != HWND_TOP) + if (hWndInsertAfter != HWND_TOPMOST) { DesktopWindow = IntGetWindowObject(IntGetDesktopWindow()); List = IntWinListChildren(DesktopWindow); @@ -630,6 +630,19 @@ WinPosDoOwnedPopups(HWND hWnd, HWND hWndInsertAfter) for (i = 0; List[i]; i++) { if (List[i] == Owner) break; + if (HWND_TOP == hWndInsertAfter) + { + ChildObject = IntGetWindowObject(List[i]); + if (NULL != ChildObject) + { + if (0 == (ChildObject->ExStyle & WS_EX_TOPMOST)) + { + IntReleaseWindowObject(ChildObject); + break; + } + IntReleaseWindowObject(ChildObject); + } + } if (List[i] != hWnd) hWndLocalPrev = List[i]; if (hWndLocalPrev == hWndInsertAfter) break; } @@ -961,7 +974,12 @@ WinPosSetWindowPos(HWND Wnd, HWND WndInsertAfter, INT x, INT y, INT cx, } if (InsertAfterWindow != NULL) IntReleaseWindowObject(InsertAfterWindow); - if (HWND_TOPMOST == WinPos.hwndInsertAfter) + if ((HWND_TOPMOST == WinPos.hwndInsertAfter) + || (0 != (Window->ExStyle & WS_EX_TOPMOST) + && NULL != Window->PrevSibling + && 0 != (Window->PrevSibling->ExStyle & WS_EX_TOPMOST)) + || (NULL != Window->NextSibling + && 0 != (Window->NextSibling->ExStyle & WS_EX_TOPMOST))) { Window->ExStyle |= WS_EX_TOPMOST; } @@ -1334,8 +1352,9 @@ WinPosShowWindow(HWND Wnd, INT Cmd) Swp |= SWP_NOACTIVATE | SWP_NOZORDER; } - WinPosSetWindowPos(Window->Self, HWND_TOP, NewPos.left, NewPos.top, - NewPos.right, NewPos.bottom, LOWORD(Swp)); + WinPosSetWindowPos(Window->Self, 0 != (Window->ExStyle & WS_EX_TOPMOST) + ? HWND_TOPMOST : HWND_TOP, + NewPos.left, NewPos.top, NewPos.right, NewPos.bottom, LOWORD(Swp)); if (Cmd == SW_HIDE) { From b408a6aeb8d86074bbfc093c67608e0741dba24f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Thu, 1 Apr 2004 23:17:28 +0000 Subject: [PATCH 0712/1463] Make popup menus topmost windows svn path=/trunk/; revision=8949 --- reactos/lib/user32/windows/menu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/user32/windows/menu.c b/reactos/lib/user32/windows/menu.c index 758e7405372..694dd40cf36 100644 --- a/reactos/lib/user32/windows/menu.c +++ b/reactos/lib/user32/windows/menu.c @@ -21,7 +21,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: menu.c,v 1.58 2004/03/25 08:51:44 gvg Exp $ +/* $Id: menu.c,v 1.59 2004/04/01 23:17:28 gvg Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/menu.c @@ -1763,7 +1763,7 @@ MenuShowPopup(HWND WndOwner, HMENU Menu, UINT Id, } /* Display the window */ - SetWindowPos(MenuInfo.Wnd, HWND_TOP, 0, 0, 0, 0, + SetWindowPos(MenuInfo.Wnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE); UpdateWindow(MenuInfo.Wnd); From eec82162fbea20c8560b07724138940c457cb13f Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Fri, 2 Apr 2004 15:43:01 +0000 Subject: [PATCH 0713/1463] - Fixed the initializing of the access ranges. svn path=/trunk/; revision=8950 --- reactos/drivers/storage/scsiport/scsiport.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/storage/scsiport/scsiport.c b/reactos/drivers/storage/scsiport/scsiport.c index 35efa00fa92..5f748eabd7a 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.51 2004/03/24 16:21:59 navaraf Exp $ +/* $Id: scsiport.c,v 1.52 2004/04/02 15:43:01 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1281,7 +1281,7 @@ SpiGetPciConfigData (IN struct _HW_INITIALIZATION_DATA *HwInitializationData, sizeof(ULONG)); if (RangeLength != 0) { - PortConfig->AccessRanges[0].RangeLength = + PortConfig->AccessRanges[i].RangeLength = -(RangeLength & PCI_ADDRESS_IO_ADDRESS_MASK); PortConfig->AccessRanges[i].RangeInMemory = !(PciConfig.u.type0.BaseAddresses[i] & PCI_ADDRESS_IO_SPACE); From 23e366974c81054d794ff57c4b9219eede5847cc Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Fri, 2 Apr 2004 19:00:56 +0000 Subject: [PATCH 0714/1463] properly initialize system menu items svn path=/trunk/; revision=8951 --- reactos/lib/user32/windows/defwnd.c | 20 ++++++++------- reactos/lib/user32/windows/menu.c | 38 ++++++++++++++++++++++++----- 2 files changed, 43 insertions(+), 15 deletions(-) diff --git a/reactos/lib/user32/windows/defwnd.c b/reactos/lib/user32/windows/defwnd.c index 730bcd9697d..53b6fafb6e8 100644 --- a/reactos/lib/user32/windows/defwnd.c +++ b/reactos/lib/user32/windows/defwnd.c @@ -1,4 +1,4 @@ -/* $Id: defwnd.c,v 1.127 2004/03/31 14:12:04 weiden Exp $ +/* $Id: defwnd.c,v 1.128 2004/04/02 19:00:56 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -30,6 +30,7 @@ LRESULT DefWndNCActivate(HWND hWnd, WPARAM wParam); LRESULT DefWndNCHitTest(HWND hWnd, POINT Point); LRESULT DefWndNCLButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam); LRESULT DefWndNCLButtonDblClk(HWND hWnd, WPARAM wParam, LPARAM lParam); +void FASTCALL MenuInitSysMenuPopup(HMENU Menu, DWORD Style, DWORD ClsStyle, LONG HitTest ); /* GLOBALS *******************************************************************/ @@ -1044,9 +1045,9 @@ User32DefWindowProc(HWND hWnd, } else { - LONG HitCode; POINT Pt; DWORD Style; + LONG HitCode; Style = GetWindowLongW(hWnd, GWL_STYLE); @@ -1062,18 +1063,19 @@ User32DefWindowProc(HWND hWnd, if (HitCode == HTCAPTION || HitCode == HTSYSMENU) { HMENU SystemMenu; - UINT DefItem = SC_CLOSE; + UINT Flags; if((SystemMenu = GetSystemMenu(hWnd, FALSE))) { + MenuInitSysMenuPopup(SystemMenu, GetWindowLongW(hWnd, GWL_STYLE), + GetClassLongW(hWnd, GCL_STYLE), HitCode); + if(HitCode == HTCAPTION) - DefItem = ((Style & (WS_MAXIMIZE | WS_MINIMIZE)) ? - SC_RESTORE : SC_MAXIMIZE); + Flags = TPM_LEFTBUTTON | TPM_RIGHTBUTTON; + else + Flags = TPM_LEFTBUTTON; - SetMenuDefaultItem(SystemMenu, DefItem, MF_BYCOMMAND); - - TrackPopupMenu(SystemMenu, - TPM_LEFTBUTTON | TPM_RIGHTBUTTON, + TrackPopupMenu(SystemMenu, Flags, Pt.x, Pt.y, 0, hWnd, NULL); } } diff --git a/reactos/lib/user32/windows/menu.c b/reactos/lib/user32/windows/menu.c index 694dd40cf36..b1315d9466b 100644 --- a/reactos/lib/user32/windows/menu.c +++ b/reactos/lib/user32/windows/menu.c @@ -21,7 +21,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: menu.c,v 1.59 2004/04/01 23:17:28 gvg Exp $ +/* $Id: menu.c,v 1.60 2004/04/02 19:00:56 weiden Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/menu.c @@ -1984,10 +1984,12 @@ MenuMoveSelection(HWND WndOwner, PROSMENUINFO MenuInfo, INT Offset) * * Grey the appropriate items in System menu. */ -static void FASTCALL -MenuInitSysMenuPopup(HMENU Menu, DWORD Style, DWORD ClsStyle ) +void FASTCALL +MenuInitSysMenuPopup(HMENU Menu, DWORD Style, DWORD ClsStyle, LONG HitTest ) { BOOL Gray; + UINT DefItem; + MENUITEMINFOW mii; Gray = 0 == (Style & WS_THICKFRAME) || 0 != (Style & (WS_MAXIMIZE | WS_MINIMIZE)); EnableMenuItem(Menu, SC_SIZE, (Gray ? MF_GRAYED : MF_ENABLED)); @@ -2006,6 +2008,31 @@ MenuInitSysMenuPopup(HMENU Menu, DWORD Style, DWORD ClsStyle ) { EnableMenuItem(Menu, SC_CLOSE, MF_GRAYED); } + + /* Set default menu item */ + if(Style & WS_MINIMIZE) + { + DefItem = SC_RESTORE; + } + else + { + if(HitTest == HTCAPTION) + { + DefItem = ((Style & (WS_MAXIMIZE | WS_MINIMIZE)) ? SC_RESTORE : SC_MAXIMIZE); + } + else + { + DefItem = SC_CLOSE; + } + } + mii.cbSize = sizeof(MENUITEMINFOW); + mii.fMask = MIIM_STATE; + if(GetMenuItemInfoW(Menu, DefItem, FALSE, &mii) && + (mii.fState & (MFS_GRAYED | MFS_DISABLED))) + { + DefItem = SC_CLOSE; + } + SetMenuDefaultItem(Menu, DefItem, MF_BYCOMMAND); } /*********************************************************************** @@ -2093,9 +2120,8 @@ MenuShowSubPopup(HWND WndOwner, PROSMENUINFO MenuInfo, BOOL SelectFirst, UINT Fl if (IS_SYSTEM_MENU(MenuInfo)) { - MenuInitSysMenuPopup(ItemInfo.hSubMenu, - GetWindowLongW(MenuInfo->Wnd, GWL_STYLE ), - GetClassLongW(MenuInfo->Wnd, GCL_STYLE)); + MenuInitSysMenuPopup(ItemInfo.hSubMenu, GetWindowLongW(MenuInfo->Wnd, GWL_STYLE), + GetClassLongW(MenuInfo->Wnd, GCL_STYLE), FALSE); NcGetSysPopupPos(MenuInfo->Wnd, &Rect); Rect.top = Rect.bottom; From b8560b708d66bda96d7ce71fb0303d406c05f152 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Fri, 2 Apr 2004 19:14:44 +0000 Subject: [PATCH 0715/1463] little fix svn path=/trunk/; revision=8952 --- reactos/lib/user32/windows/menu.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/reactos/lib/user32/windows/menu.c b/reactos/lib/user32/windows/menu.c index b1315d9466b..f293a3d3dde 100644 --- a/reactos/lib/user32/windows/menu.c +++ b/reactos/lib/user32/windows/menu.c @@ -21,7 +21,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: menu.c,v 1.60 2004/04/02 19:00:56 weiden Exp $ +/* $Id: menu.c,v 1.61 2004/04/02 19:14:44 weiden Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/menu.c @@ -1989,7 +1989,9 @@ MenuInitSysMenuPopup(HMENU Menu, DWORD Style, DWORD ClsStyle, LONG HitTest ) { BOOL Gray; UINT DefItem; + #if 0 MENUITEMINFOW mii; + #endif Gray = 0 == (Style & WS_THICKFRAME) || 0 != (Style & (WS_MAXIMIZE | WS_MINIMIZE)); EnableMenuItem(Menu, SC_SIZE, (Gray ? MF_GRAYED : MF_ENABLED)); @@ -2025,13 +2027,15 @@ MenuInitSysMenuPopup(HMENU Menu, DWORD Style, DWORD ClsStyle, LONG HitTest ) DefItem = SC_CLOSE; } } + #if 0 mii.cbSize = sizeof(MENUITEMINFOW); mii.fMask = MIIM_STATE; - if(GetMenuItemInfoW(Menu, DefItem, FALSE, &mii) && + if((DefItem != SC_CLOSE) && GetMenuItemInfoW(Menu, DefItem, FALSE, &mii) && (mii.fState & (MFS_GRAYED | MFS_DISABLED))) { DefItem = SC_CLOSE; } + #endif SetMenuDefaultItem(Menu, DefItem, MF_BYCOMMAND); } @@ -2121,7 +2125,7 @@ MenuShowSubPopup(HWND WndOwner, PROSMENUINFO MenuInfo, BOOL SelectFirst, UINT Fl if (IS_SYSTEM_MENU(MenuInfo)) { MenuInitSysMenuPopup(ItemInfo.hSubMenu, GetWindowLongW(MenuInfo->Wnd, GWL_STYLE), - GetClassLongW(MenuInfo->Wnd, GCL_STYLE), FALSE); + GetClassLongW(MenuInfo->Wnd, GCL_STYLE), HTSYSMENU); NcGetSysPopupPos(MenuInfo->Wnd, &Rect); Rect.top = Rect.bottom; From 6491031cc2ebc851bf95ead5a454f89e2b7acc6d Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Fri, 2 Apr 2004 20:51:08 +0000 Subject: [PATCH 0716/1463] implemented GetWindowInfo() svn path=/trunk/; revision=8953 --- reactos/include/win32k/ntuser.h | 1 + reactos/lib/user32/include/user32.h | 3 ++ reactos/lib/user32/windows/window.c | 7 ++-- reactos/subsys/win32k/include/window.h | 17 +++++++++ reactos/subsys/win32k/ntuser/misc.c | 36 ++++++++++++++++- reactos/subsys/win32k/ntuser/window.c | 44 ++++++++++++++++++++- reactos/subsys/win32k/ntuser/winpos.c | 53 ++------------------------ 7 files changed, 105 insertions(+), 56 deletions(-) diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index 91019b8720d..7276838bc7d 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -197,6 +197,7 @@ NtUserCallOneParam( #define TWOPARAM_ROUTINE_SETWNDCONTEXTHLPID 0x58 #define TWOPARAM_ROUTINE_CURSORPOSITION 0x59 #define TWOPARAM_ROUTINE_SETCARETPOS 0x60 +#define TWOPARAM_ROUTINE_GETWINDOWINFO 0x61 DWORD STDCALL NtUserCallTwoParam( diff --git a/reactos/lib/user32/include/user32.h b/reactos/lib/user32/include/user32.h index d44f29edf27..d33fb9010e6 100644 --- a/reactos/lib/user32/include/user32.h +++ b/reactos/lib/user32/include/user32.h @@ -55,6 +55,9 @@ void DrawCaret(HWND hWnd, PTHRDCARETINFO CaretInfo); #define NtUserSetMenuBarHeight(menu, height) \ (BOOL)NtUserCallTwoParam((DWORD)menu, (DWORD)height, TWOPARAM_ROUTINE_SETMENUBARHEIGHT) +#define NtUserGetWindowInfo(hwnd, pwi) \ + (BOOL)NtUserCallTwoParam((DWORD)hwnd, (DWORD)pwi, TWOPARAM_ROUTINE_GETWINDOWINFO) + #define NtUserSetCaretBlinkTime(uMSeconds) \ (BOOL)NtUserCallOneParam((DWORD)uMSeconds, ONEPARAM_ROUTINE_SETCARETBLINKTIME) diff --git a/reactos/lib/user32/windows/window.c b/reactos/lib/user32/windows/window.c index 604ce18487a..9b84f1f1002 100644 --- a/reactos/lib/user32/windows/window.c +++ b/reactos/lib/user32/windows/window.c @@ -1,4 +1,4 @@ -/* $Id: window.c,v 1.102 2004/03/14 11:27:33 gvg Exp $ +/* $Id: window.c,v 1.103 2004/04/02 20:51:07 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -890,14 +890,13 @@ GetTopWindow(HWND hWnd) /* - * @unimplemented + * @implemented */ BOOL STDCALL GetWindowInfo(HWND hwnd, PWINDOWINFO pwi) { - UNIMPLEMENTED; - return FALSE; + return NtUserGetWindowInfo(hwnd, pwi); } diff --git a/reactos/subsys/win32k/include/window.h b/reactos/subsys/win32k/include/window.h index 863f405f80f..5e0ca1b955f 100644 --- a/reactos/subsys/win32k/include/window.h +++ b/reactos/subsys/win32k/include/window.h @@ -108,6 +108,17 @@ typedef struct _WINDOW_OBJECT #define WINDOWSTATUS_DESTROYING (0x1) #define WINDOWSTATUS_DESTROYED (0x2) +#define HAS_DLGFRAME(Style, ExStyle) \ + (((ExStyle) & WS_EX_DLGMODALFRAME) || \ + (((Style) & WS_DLGFRAME) && (!((Style) & WS_THICKFRAME)))) + +#define HAS_THICKFRAME(Style, ExStyle) \ + (((Style) & WS_THICKFRAME) && \ + (!(((Style) & (WS_DLGFRAME | WS_BORDER)) == WS_DLGFRAME))) + +#define HAS_THINFRAME(Style, ExStyle) \ + (((Style) & WS_BORDER) || (!((Style) & (WS_CHILD | WS_POPUP)))) + #define IntIsDesktopWindow(WndObj) \ (WndObj->Parent == NULL) @@ -194,6 +205,12 @@ IntGetWindowRgn(HWND hWnd, HRGN hRgn); INT FASTCALL IntGetWindowRgnBox(HWND hWnd, RECT *Rect); +BOOL FASTCALL +IntGetWindowInfo(PWINDOW_OBJECT WindowObject, PWINDOWINFO pwi); + +VOID FASTCALL +IntGetWindowBorderMeasures(PWINDOW_OBJECT WindowObject, INT *cx, INT *cy); + DWORD IntRemoveWndProcHandle(WNDPROC Handle); DWORD IntRemoveProcessWndProcHandles(HANDLE ProcessID); DWORD IntAddWndProcHandle(WNDPROC WindowProc, BOOL IsUnicode); diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index ab1233850f1..6c37651c88f 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.55 2004/03/23 21:47:37 weiden Exp $ +/* $Id: misc.c,v 1.56 2004/04/02 20:51:08 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -369,6 +369,40 @@ NtUserCallTwoParam( case TWOPARAM_ROUTINE_SETCARETPOS: return (DWORD)IntSetCaretPos((int)Param1, (int)Param2); + + case TWOPARAM_ROUTINE_GETWINDOWINFO: + { + WINDOWINFO wi; + DWORD Ret; + + if(!(WindowObject = IntGetWindowObject((HWND)Param1))) + { + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + return FALSE; + } + + Status = MmCopyFromCaller(&wi.cbSize, (PVOID)Param2, sizeof(wi.cbSize)); + if(!NT_SUCCESS(Status)) + { + IntReleaseWindowObject(WindowObject); + SetLastNtError(Status); + return FALSE; + } + + if((Ret = (DWORD)IntGetWindowInfo(WindowObject, &wi))) + { + Status = MmCopyToCaller((PVOID)Param2, &wi, sizeof(WINDOWINFO)); + if(!NT_SUCCESS(Status)) + { + IntReleaseWindowObject(WindowObject); + SetLastNtError(Status); + return FALSE; + } + } + + IntReleaseWindowObject(WindowObject); + return Ret; + } } DPRINT1("Calling invalid routine number 0x%x in NtUserCallTwoParam()\n Param1=0x%x Parm2=0x%x\n", Routine, Param1, Param2); diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 7c81158cbce..47a95ba9aa6 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.207 2004/03/31 19:44:34 weiden Exp $ +/* $Id: window.c,v 1.208 2004/04/02 20:51:08 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -430,6 +430,48 @@ static LRESULT IntDestroyWindow(PWINDOW_OBJECT Window, return 0; } +VOID FASTCALL +IntGetWindowBorderMeasures(PWINDOW_OBJECT WindowObject, INT *cx, INT *cy) +{ + if(HAS_DLGFRAME(WindowObject->Style, WindowObject->ExStyle) && !(WindowObject->Style & WS_MINIMIZE)) + { + *cx = NtUserGetSystemMetrics(SM_CXDLGFRAME); + *cy = NtUserGetSystemMetrics(SM_CYDLGFRAME); + } + else + { + if(HAS_THICKFRAME(WindowObject->Style, WindowObject->ExStyle)&& !(WindowObject->Style & WS_MINIMIZE)) + { + *cx = NtUserGetSystemMetrics(SM_CXFRAME); + *cy = NtUserGetSystemMetrics(SM_CYFRAME); + } + else if(HAS_THINFRAME(WindowObject->Style, WindowObject->ExStyle)) + { + *cx = NtUserGetSystemMetrics(SM_CXBORDER); + *cy = NtUserGetSystemMetrics(SM_CYBORDER); + } + else + { + *cx = *cy = 0; + } + } +} + +BOOL FASTCALL +IntGetWindowInfo(PWINDOW_OBJECT WindowObject, PWINDOWINFO pwi) +{ + pwi->cbSize = sizeof(WINDOWINFO); + pwi->rcWindow = WindowObject->WindowRect; + pwi->rcClient = WindowObject->ClientRect; + pwi->dwStyle = WindowObject->Style; + pwi->dwExStyle = WindowObject->ExStyle; + pwi->dwWindowStatus = (NtUserGetForegroundWindow() == WindowObject->Self); /* WS_ACTIVECAPTION */ + IntGetWindowBorderMeasures(WindowObject, &pwi->cxWindowBorders, &pwi->cyWindowBorders); + pwi->atomWindowType = (WindowObject->Class ? WindowObject->Class->Atom : 0); + pwi->wCreatorVersion = 0x400; /* FIXME - return a real version number */ + return TRUE; +} + static BOOL FASTCALL IntSetMenu( PWINDOW_OBJECT WindowObject, diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index 36a606d6505..39eacc3f264 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.107 2004/04/01 23:16:21 gvg Exp $ +/* $Id: winpos.c,v 1.108 2004/04/02 20:51:08 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -66,17 +66,6 @@ /* FUNCTIONS *****************************************************************/ -#define HAS_DLGFRAME(Style, ExStyle) \ - (((ExStyle) & WS_EX_DLGMODALFRAME) || \ - (((Style) & WS_DLGFRAME) && (!((Style) & WS_THICKFRAME)))) - -#define HAS_THICKFRAME(Style, ExStyle) \ - (((Style) & WS_THICKFRAME) && \ - (!(((Style) & (WS_DLGFRAME | WS_BORDER)) == WS_DLGFRAME))) - -#define HAS_THINFRAME(Style, ExStyle) \ - (((Style) & WS_BORDER) || (!((Style) & (WS_CHILD | WS_POPUP)))) - BOOL FASTCALL IntGetClientOrigin(HWND hWnd, LPPOINT Point) { @@ -223,25 +212,7 @@ WinPosInitInternalPos(PWINDOW_OBJECT WindowObject, POINT *pt, PRECT RestoreRect) return NULL; } WindowObject->InternalPos->NormalRect = WindowObject->WindowRect; - if (HAS_DLGFRAME(WindowObject->Style, WindowObject->ExStyle) && !(WindowObject->Style & WS_MINIMIZE)) - { - XInc = NtUserGetSystemMetrics(SM_CXDLGFRAME); - YInc = NtUserGetSystemMetrics(SM_CYDLGFRAME); - } - else - { - XInc = YInc = 0; - if (HAS_THICKFRAME(WindowObject->Style, WindowObject->ExStyle)&& !(WindowObject->Style & WS_MINIMIZE)) - { - XInc += NtUserGetSystemMetrics(SM_CXFRAME); - YInc += NtUserGetSystemMetrics(SM_CYFRAME); - } - else if (HAS_THINFRAME(WindowObject->Style, WindowObject->ExStyle)) - { - XInc += NtUserGetSystemMetrics(SM_CXBORDER); - YInc += NtUserGetSystemMetrics(SM_CYBORDER); - } - } + IntGetWindowBorderMeasures(WindowObject, &XInc, &YInc); WindowObject->InternalPos->MaxPos.x = WorkArea.left - XInc; WindowObject->InternalPos->MaxPos.y = WorkArea.top - YInc; WindowObject->InternalPos->IconPos.x = WorkArea.left; @@ -385,25 +356,7 @@ WinPosFillMinMaxInfoStruct(PWINDOW_OBJECT Window, MINMAXINFO *Info) Info->ptMaxTrackSize.x = Info->ptMaxSize.x; Info->ptMaxTrackSize.y = Info->ptMaxSize.y; - if (HAS_DLGFRAME(Window->Style, Window->ExStyle)) - { - XInc = NtUserGetSystemMetrics(SM_CXDLGFRAME); - YInc = NtUserGetSystemMetrics(SM_CYDLGFRAME); - } - else - { - XInc = YInc = 0; - if (HAS_THICKFRAME(Window->Style, Window->ExStyle)) - { - XInc += NtUserGetSystemMetrics(SM_CXFRAME); - YInc += NtUserGetSystemMetrics(SM_CYFRAME); - } - else if (HAS_THINFRAME(Window->Style, Window->ExStyle)) - { - XInc += NtUserGetSystemMetrics(SM_CXBORDER); - YInc += NtUserGetSystemMetrics(SM_CYBORDER); - } - } + IntGetWindowBorderMeasures(Window, &XInc, &YInc); Info->ptMaxSize.x += 2 * XInc; Info->ptMaxSize.y += 2 * YInc; From 1c5f3e5775434092f27f760b849e869b22590757 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Fri, 2 Apr 2004 21:03:25 +0000 Subject: [PATCH 0717/1463] check parameter in GetWindowInfo() svn path=/trunk/; revision=8954 --- reactos/subsys/win32k/ntuser/misc.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index 6c37651c88f..385670048d6 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.56 2004/04/02 20:51:08 weiden Exp $ +/* $Id: misc.c,v 1.57 2004/04/02 21:03:25 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -389,6 +389,13 @@ NtUserCallTwoParam( return FALSE; } + if(wi.cbSize != sizeof(WINDOWINFO)) + { + IntReleaseWindowObject(WindowObject); + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return FALSE; + } + if((Ret = (DWORD)IntGetWindowInfo(WindowObject, &wi))) { Status = MmCopyToCaller((PVOID)Param2, &wi, sizeof(WINDOWINFO)); From bb7b8e638e33cc2a0c90a76267eb4a5f7aaab861 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Fri, 2 Apr 2004 22:16:09 +0000 Subject: [PATCH 0718/1463] implemented GetWindowModuleFileName() svn path=/trunk/; revision=8955 --- reactos/include/win32k/ntuser.h | 1 + reactos/lib/user32/include/user32.h | 3 +++ reactos/lib/user32/user32.edf | 2 +- reactos/lib/user32/windows/window.c | 40 ++++++++++++++--------------- reactos/subsys/win32k/ntuser/misc.c | 13 +++++++++- 5 files changed, 37 insertions(+), 22 deletions(-) diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index 7276838bc7d..9be873fbc9e 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -171,6 +171,7 @@ NtUserCallNoParam( #define ONEPARAM_ROUTINE_GETCARETINFO 0x07 #define ONEPARAM_ROUTINE_SWITCHCARETSHOWING 0x08 #define ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS 0x09 +#define ONEPARAM_ROUTINE_GETWINDOWINSTANCE 0x10 #define ONEPARAM_ROUTINE_SETMESSAGEEXTRAINFO 0x0a DWORD STDCALL diff --git a/reactos/lib/user32/include/user32.h b/reactos/lib/user32/include/user32.h index d33fb9010e6..a3cbc55ac5a 100644 --- a/reactos/lib/user32/include/user32.h +++ b/reactos/lib/user32/include/user32.h @@ -85,6 +85,9 @@ void DrawCaret(HWND hWnd, PTHRDCARETINFO CaretInfo); #define NtUserGetWindowContextHelpId(hwnd) \ NtUserCallOneParam((DWORD)hwnd, ONEPARAM_ROUTINE_GETWNDCONTEXTHLPID) +#define NtUserGetWindowInstance(hwnd) \ + (HINSTANCE)NtUserCallOneParam((DWORD)hwnd, ONEPARAM_ROUTINE_GETWINDOWINSTANCE) + LONG WINAPI RegCloseKey(HKEY); LONG WINAPI RegOpenKeyExW(HKEY,LPCWSTR,DWORD,REGSAM,PHKEY); LONG WINAPI RegQueryValueExW(HKEY,LPCWSTR,LPDWORD,LPDWORD,LPBYTE,LPDWORD); diff --git a/reactos/lib/user32/user32.edf b/reactos/lib/user32/user32.edf index 2ecd55b4208..84e875d2ebc 100644 --- a/reactos/lib/user32/user32.edf +++ b/reactos/lib/user32/user32.edf @@ -372,7 +372,7 @@ GetWindowDC=GetWindowDC@4 GetWindowInfo=GetWindowInfo@8 GetWindowLongA=GetWindowLongA@8 GetWindowLongW=GetWindowLongW@8 -GetWindowModuleFileName=GetWindowModuleFileName@12 +GetWindowModuleFileName=GetWindowModuleFileNameA@12 GetWindowModuleFileNameA=GetWindowModuleFileNameA@12 GetWindowModuleFileNameW=GetWindowModuleFileNameW@12 GetWindowPlacement=GetWindowPlacement@8 diff --git a/reactos/lib/user32/windows/window.c b/reactos/lib/user32/windows/window.c index 9b84f1f1002..a91fbb580c0 100644 --- a/reactos/lib/user32/windows/window.c +++ b/reactos/lib/user32/windows/window.c @@ -1,4 +1,4 @@ -/* $Id: window.c,v 1.103 2004/04/02 20:51:07 weiden Exp $ +/* $Id: window.c,v 1.104 2004/04/02 22:16:09 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -901,41 +902,40 @@ GetWindowInfo(HWND hwnd, /* - * @unimplemented - */ -UINT STDCALL -GetWindowModuleFileName(HWND hwnd, - LPSTR lpszFileName, - UINT cchFileNameMax) -{ - UNIMPLEMENTED; - return 0; -} - - -/* - * @unimplemented + * @implemented */ UINT STDCALL GetWindowModuleFileNameA(HWND hwnd, LPSTR lpszFileName, UINT cchFileNameMax) { - UNIMPLEMENTED; - return 0; + HINSTANCE hWndInst; + + if(!(hWndInst = NtUserGetWindowInstance(hwnd))) + { + return 0; + } + + return GetModuleFileNameA(hWndInst, lpszFileName, cchFileNameMax); } /* - * @unimplemented + * @implemented */ UINT STDCALL GetWindowModuleFileNameW(HWND hwnd, LPWSTR lpszFileName, UINT cchFileNameMax) { - UNIMPLEMENTED; - return 0; + HINSTANCE hWndInst; + + if(!(hWndInst = NtUserGetWindowInstance(hwnd))) + { + return 0; + } + + return GetModuleFileNameW(hWndInst, lpszFileName, cchFileNameMax); } diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index 385670048d6..f78f4e1c8ab 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.57 2004/04/02 21:03:25 weiden Exp $ +/* $Id: misc.c,v 1.58 2004/04/02 22:16:09 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -169,6 +169,17 @@ NtUserCallOneParam( case ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS: return (DWORD)IntEnumClipboardFormats((UINT)Param); + case ONEPARAM_ROUTINE_GETWINDOWINSTANCE: + if(!(WindowObject = IntGetWindowObject((HWND)Param))) + { + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + return FALSE; + } + + Result = (DWORD)WindowObject->Instance; + IntReleaseWindowObject(WindowObject); + return Result; + case ONEPARAM_ROUTINE_SETMESSAGEEXTRAINFO: return (DWORD)MsqSetMessageExtraInfo((LPARAM)Param); } From 8e52e23724a984dffb09c511ba17b782cfefa87b Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Fri, 2 Apr 2004 23:54:26 +0000 Subject: [PATCH 0719/1463] partially implemented IsHungAppWindow() svn path=/trunk/; revision=8956 --- reactos/include/win32k/ntuser.h | 3 +++ reactos/lib/user32/windows/window.c | 7 +++---- reactos/subsys/win32k/ntuser/window.c | 10 +++++++--- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index 9be873fbc9e..b20c47853f0 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -1065,6 +1065,9 @@ NtUserQueryUserCounters( DWORD Unknown3, DWORD Unknown4); +#define QUERY_WINDOW_UNIQUE_PROCESS_ID 0x00 +#define QUERY_WINDOW_UNIQUE_THREAD_ID 0x01 +#define QUERY_WINDOW_ISHUNG 0x04 DWORD STDCALL NtUserQueryWindow( diff --git a/reactos/lib/user32/windows/window.c b/reactos/lib/user32/windows/window.c index a91fbb580c0..72bb81d0419 100644 --- a/reactos/lib/user32/windows/window.c +++ b/reactos/lib/user32/windows/window.c @@ -1,4 +1,4 @@ -/* $Id: window.c,v 1.104 2004/04/02 22:16:09 weiden Exp $ +/* $Id: window.c,v 1.105 2004/04/02 23:54:26 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -1456,14 +1456,13 @@ InternalGetWindowText(HWND hWnd, LPWSTR lpString, int nMaxCount) } /* - * @unimplemented + * @implemented */ BOOL STDCALL IsHungAppWindow(HWND hwnd) { - /* FIXME: ReactOS doesnt identify hung app windows yet */ - return FALSE; + return (NtUserQueryWindow(hwnd, QUERY_WINDOW_ISHUNG) != 0); } /* diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 47a95ba9aa6..5b9ebc29d28 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.208 2004/04/02 20:51:08 weiden Exp $ +/* $Id: window.c,v 1.209 2004/04/02 23:54:26 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -3200,14 +3200,18 @@ NtUserQueryWindow(HWND hWnd, DWORD Index) switch(Index) { - case 0x00: + case QUERY_WINDOW_UNIQUE_PROCESS_ID: Result = (DWORD)IntGetWndProcessId(Window); break; - case 0x01: + case QUERY_WINDOW_UNIQUE_THREAD_ID: Result = (DWORD)IntGetWndThreadId(Window); break; + case QUERY_WINDOW_ISHUNG: + Result = (DWORD)MsqIsHung(Window->MessageQueue); + break; + default: Result = (DWORD)NULL; break; From 1f56a63145993a4fcdd0dd47fcccb7484129fe0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sat, 3 Apr 2004 13:12:43 +0000 Subject: [PATCH 0720/1463] Handle lpcbData == NULL case. svn path=/trunk/; revision=8957 --- reactos/lib/advapi32/reg/reg.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/reactos/lib/advapi32/reg/reg.c b/reactos/lib/advapi32/reg/reg.c index c8ab9e66bc3..843e9410f92 100644 --- a/reactos/lib/advapi32/reg/reg.c +++ b/reactos/lib/advapi32/reg/reg.c @@ -1,4 +1,4 @@ -/* $Id: reg.c,v 1.45 2004/04/01 13:53:08 ekohl Exp $ +/* $Id: reg.c,v 1.46 2004/04/03 13:12:43 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -2292,13 +2292,16 @@ RegQueryValueExA (HKEY hKey, RtlCreateUnicodeStringFromAsciiz (&ValueName, (LPSTR)lpValueName); - Length = *lpcbData * sizeof(WCHAR); + if (NULL != lpcbData) + { + Length = *lpcbData * sizeof(WCHAR); + } ErrorCode = RegQueryValueExW (hKey, ValueName.Buffer, lpReserved, &Type, (LPBYTE)ValueData.Buffer, - &Length); + NULL == lpcbData ? NULL : &Length); DPRINT("ErrorCode %lu\n", ErrorCode); if (ErrorCode == ERROR_SUCCESS || @@ -2322,7 +2325,7 @@ RegQueryValueExA (HKEY hKey, } Length = Length / sizeof(WCHAR); } - else + else if (lpcbData != NULL) { Length = min(*lpcbData, Length); if (ErrorCode == ERROR_SUCCESS && ValueData.Buffer != NULL) From 5f3ddeb0c97c53be64ea82e2453edddec7534514 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 3 Apr 2004 13:45:00 +0000 Subject: [PATCH 0721/1463] Silence a debug message. svn path=/trunk/; revision=8958 --- reactos/ntoskrnl/cm/rtlfunc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/cm/rtlfunc.c b/reactos/ntoskrnl/cm/rtlfunc.c index c6bd9696221..037479deee8 100644 --- a/reactos/ntoskrnl/cm/rtlfunc.c +++ b/reactos/ntoskrnl/cm/rtlfunc.c @@ -257,7 +257,7 @@ RtlFormatCurrentUserKeyPath (OUT PUNICODE_STRING KeyPath) NtClose (TokenHandle); if (!NT_SUCCESS(Status)) { - DPRINT1 ("NtQueryInformationToken() failed (Status %lx)\n", Status); + DPRINT ("NtQueryInformationToken() failed (Status %lx)\n", Status); return Status; } From 87ea1d498e1498f5664365f0394574bde23ef327 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sat, 3 Apr 2004 20:33:39 +0000 Subject: [PATCH 0722/1463] Use lookaside lists for better performance svn path=/trunk/; revision=8959 --- reactos/subsys/win32k/objects/gdiobj.c | 160 +++++++++---------------- 1 file changed, 57 insertions(+), 103 deletions(-) diff --git a/reactos/subsys/win32k/objects/gdiobj.c b/reactos/subsys/win32k/objects/gdiobj.c index 374304ecf25..a20bbcd68b9 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.63 2004/03/14 12:16:50 weiden Exp $ + * $Id: gdiobj.c,v 1.64 2004/04/03 20:33:39 gvg Exp $ * */ @@ -43,9 +43,6 @@ #define NDEBUG #include - -/* enable/disable GDI object caching */ -#define GDI_CACHE_OBJECTS 0 /* count all gdi objects */ #define GDI_COUNT_OBJECTS 1 @@ -94,44 +91,33 @@ typedef struct _GDI_HANDLE_TABLE #if GDI_COUNT_OBJECTS ULONG HandlesCount; #endif - #if GDI_CACHE_OBJECTS - ULONG ObjHdrSize; - PGDIOBJHDR *CachedObjects; - #endif + PPAGED_LOOKASIDE_LIST LookasideLists; PGDIOBJHDR Handles[1]; } GDI_HANDLE_TABLE, *PGDI_HANDLE_TABLE; -#if GDI_CACHE_OBJECTS - -#define N_OBJ_TYPES 16 - typedef struct { ULONG Type; ULONG Size; } GDI_OBJ_SIZE; -typedef struct _GDI_DONTCARE -{ - PVOID Data; -} GDI_DONTCARE, *PGDI_DONTCARE; - const -GDI_OBJ_SIZE ObjSizes[N_OBJ_TYPES] = +GDI_OBJ_SIZE ObjSizes[] = { - {GDI_OBJECT_TYPE_DC, sizeof(DC)}, - {GDI_OBJECT_TYPE_DCE, sizeof(DCE)}, - {GDI_OBJECT_TYPE_PALETTE, sizeof(PALGDI)}, - {GDI_OBJECT_TYPE_FONT, sizeof(TEXTOBJ)}, - {GDI_OBJECT_TYPE_BRUSH, sizeof(BRUSHOBJ)}, - {GDI_OBJECT_TYPE_PEN, sizeof(PENOBJ)}, + /* Testing shows that regions are the most used GDIObj type, + so put that one first for performance */ {GDI_OBJECT_TYPE_REGION, sizeof(ROSRGNDATA)}, {GDI_OBJECT_TYPE_BITMAP, sizeof(BITMAPOBJ)}, + {GDI_OBJECT_TYPE_DC, sizeof(DC)}, + {GDI_OBJECT_TYPE_PALETTE, sizeof(PALGDI)}, + {GDI_OBJECT_TYPE_BRUSH, sizeof(BRUSHOBJ)}, + {GDI_OBJECT_TYPE_PEN, sizeof(PENOBJ)}, + {GDI_OBJECT_TYPE_FONT, sizeof(TEXTOBJ)}, + {GDI_OBJECT_TYPE_DCE, sizeof(DCE)}, /* {GDI_OBJECT_TYPE_DIRECTDRAW, sizeof(DD_DIRECTDRAW)}, {GDI_OBJECT_TYPE_DD_SURFACE, sizeof(DD_SURFACE)}, */ - {GDI_OBJECT_TYPE_DONTCARE, sizeof(GDI_DONTCARE)}, {GDI_OBJECT_TYPE_EXTPEN, 0}, {GDI_OBJECT_TYPE_METADC, 0}, {GDI_OBJECT_TYPE_METAFILE, 0}, @@ -141,18 +127,7 @@ GDI_OBJ_SIZE ObjSizes[N_OBJ_TYPES] = {GDI_OBJECT_TYPE_EMF, 0} }; -ULONG FASTCALL -GDI_MaxGdiObjHeaderSize(VOID) -{ - ULONG i, Size; - for(i = 0, Size = 0; i < N_OBJ_TYPES; i++) - { - Size = max(Size, ObjSizes[i].Size); - } - return Size; -} - -#endif +#define OBJTYPE_COUNT (sizeof(ObjSizes) / sizeof(ObjSizes[0])) /* GDI stock objects */ @@ -233,12 +208,9 @@ GDIOBJ_iAllocHandleTable (WORD Size) { PGDI_HANDLE_TABLE handleTable; ULONG MemSize; + UINT ObjType; -#if GDI_CACHE_OBJECTS - MemSize = sizeof(GDI_HANDLE_TABLE) + sizeof(PGDIOBJ) * (Size << 1); -#else MemSize = sizeof(GDI_HANDLE_TABLE) + sizeof(PGDIOBJ) * Size; -#endif /* prevent APC delivery for the *FastMutexUnsafe calls */ const KIRQL PrevIrql = KfRaiseIrql(APC_LEVEL); @@ -248,13 +220,24 @@ GDIOBJ_iAllocHandleTable (WORD Size) memset (handleTable, 0, MemSize); #if GDI_COUNT_OBJECTS handleTable->HandlesCount = 0; -#endif -#if GDI_CACHE_OBJECTS - handleTable->CachedObjects = &handleTable->Handles[Size]; - handleTable->ObjHdrSize = sizeof(GDIOBJHDR) + GDI_MaxGdiObjHeaderSize(); #endif handleTable->wTableSize = Size; handleTable->AllocationHint = 1; + handleTable->LookasideLists = ExAllocatePoolWithTag(NonPagedPool, + OBJTYPE_COUNT * sizeof(PAGED_LOOKASIDE_LIST), + TAG_GDIHNDTBLE); + if (NULL == handleTable->LookasideLists) + { + ExFreePool(handleTable); + ExReleaseFastMutexUnsafe (&HandleTableMutex); + KfLowerIrql(PrevIrql); + return NULL; + } + for (ObjType = 0; ObjType < OBJTYPE_COUNT; ObjType++) + { + ExInitializePagedLookasideList(handleTable->LookasideLists + ObjType, NULL, NULL, 0, + ObjSizes[ObjType].Size + sizeof(GDIOBJHDR), TAG_GDIOBJ, 0); + } ExReleaseFastMutexUnsafe (&HandleTableMutex); KfLowerIrql(PrevIrql); @@ -310,6 +293,24 @@ GDIOBJ_iGetNextOpenHandleIndex (void) return 0; } +static PPAGED_LOOKASIDE_LIST FASTCALL +FindLookasideList(DWORD ObjectType) +{ + int Index; + + for (Index = 0; Index < OBJTYPE_COUNT; Index++) + { + if (ObjSizes[Index].Type == ObjectType) + { + return HandleTable->LookasideLists + Index; + } + } + + DPRINT1("Can't find lookaside list for object type 0x%08x\n", ObjectType); + + return NULL; +} + /*! * Allocate memory for GDI object and return handle to it. * @@ -328,10 +329,8 @@ GDIOBJ_AllocObj(WORD Size, DWORD ObjectType, GDICLEANUPPROC CleanupProc) PW32PROCESS W32Process; PGDIOBJHDR newObject; WORD Index; -#if GDI_CACHE_OBJECTS - PGDIOBJHDR *CachedObject; -#endif - + PPAGED_LOOKASIDE_LIST LookasideList; + ExAcquireFastMutex(&HandleTableMutex); Index = GDIOBJ_iGetNextOpenHandleIndex (); if (0 == Index) @@ -341,50 +340,20 @@ GDIOBJ_AllocObj(WORD Size, DWORD ObjectType, GDICLEANUPPROC CleanupProc) return NULL; } -#if GDI_CACHE_OBJECTS - CachedObject = (PGDIOBJHDR*)(HandleTable->CachedObjects + Index); - if(!(newObject = *CachedObject)) - { - /* allocate new gdi object */ - newObject = ExAllocatePoolWithTag(PagedPool, HandleTable->ObjHdrSize, TAG_GDIOBJ); - if(!newObject) + LookasideList = FindLookasideList(ObjectType); + if (NULL == LookasideList) { ExReleaseFastMutex(&HandleTableMutex); - DPRINT1("GDIOBJ_AllocObj: failed\n"); return NULL; } - RtlZeroMemory(newObject, HandleTable->ObjHdrSize); - *CachedObject = newObject; - } - /* Zero the memory when destroying the object */ - if(ObjectType == GDI_OBJECT_TYPE_DONTCARE) - { - PVOID *Data; - PGDI_DONTCARE dc; - - Data = ExAllocatePoolWithTag(PagedPool, sizeof(PVOID) + Size, TAG_GDIOBJ); - if(!Data) + newObject = ExAllocateFromPagedLookasideList(LookasideList); + if (NULL == newObject) { ExReleaseFastMutex(&HandleTableMutex); - DPRINT1("GDIOBJ_AllocObj failed: %d bytes for GDI_OBJECT_TYPE_DONTCARE\n", Size + sizeof(PVOID)); + DPRINT1("Unable to allocate GDI object from lookaside list\n"); return NULL; } - dc = (PGDI_DONTCARE)((PCHAR)newObject + sizeof(GDIOBJHDR)); - RtlZeroMemory((PVOID)(Data + 1), Size); - ((PGDI_DONTCARE)((PCHAR)newObject + sizeof(GDIOBJHDR)))->Data = Data; - *Data = newObject; - } -#else - DPRINT("GDIOBJ_AllocObj: handle: %d, size: %d, type: 0x%08x\n", Index, Size, ObjectType); - newObject = ExAllocatePoolWithTag(PagedPool, Size + sizeof (GDIOBJHDR), TAG_GDIOBJ); - if (newObject == NULL) - { - ExReleaseFastMutex(&HandleTableMutex); - DPRINT1("GDIOBJ_AllocObj: failed\n"); - return NULL; - } RtlZeroMemory (newObject, Size + sizeof(GDIOBJHDR)); -#endif newObject->wTableIndex = Index; @@ -431,6 +400,7 @@ GDIOBJ_FreeObj(HGDIOBJ hObj, DWORD ObjectType, DWORD Flag) PW32PROCESS W32Process; PGDIOBJHDR objectHeader; PGDIOBJ Obj; + PPAGED_LOOKASIDE_LIST LookasideList; BOOL bRet = TRUE; objectHeader = GDIOBJ_iGetObjectForIndex(GDI_HANDLE_GET_INDEX(hObj)); @@ -466,19 +436,11 @@ GDIOBJ_FreeObj(HGDIOBJ hObj, DWORD ObjectType, DWORD Flag) Obj = (PGDIOBJ)((PCHAR)objectHeader + sizeof(GDIOBJHDR)); bRet = (*(objectHeader->CleanupProc))(Obj); } -#if GDI_CACHE_OBJECTS - if(GDI_MAGIC_TO_TYPE(objectHeader->Magic) == GDI_OBJECT_TYPE_DONTCARE) - { - PGDI_DONTCARE dc = (PGDI_DONTCARE)((PCHAR)objectHeader + sizeof(GDIOBJHDR)); - if(dc->Data) + LookasideList = FindLookasideList(GDI_MAGIC_TO_TYPE(objectHeader->Magic)); + if (NULL != LookasideList) { - ExFreePool(dc->Data); + ExFreeToPagedLookasideList(LookasideList, objectHeader); } - RtlZeroMemory(objectHeader, HandleTable->ObjHdrSize); - } -#else - ExFreePool(objectHeader); -#endif ExAcquireFastMutexUnsafe (&HandleTableMutex); HandleTable->Handles[GDI_HANDLE_GET_INDEX(hObj)] = NULL; #if GDI_COUNT_OBJECTS @@ -787,15 +749,7 @@ GDIOBJ_LockObjDbg (const char* file, int line, HGDIOBJ hObj, DWORD ObjectType) ObjHdr->lockline = line; } -#if GDI_CACHE_OBJECTS - if(GDI_MAGIC_TO_TYPE(ObjHdr->Magic) != GDI_OBJECT_TYPE_DONTCARE) - { - return (PGDIOBJ)((PCHAR)ObjHdr + sizeof(GDIOBJHDR)); - } - return (PGDIOBJ)((PVOID)(((PGDI_DONTCARE)((PCHAR)ObjHdr + sizeof(GDIOBJHDR)))->Data) + 1); -#else return (PGDIOBJ)((PCHAR)ObjHdr + sizeof(GDIOBJHDR)); -#endif } #endif//GDIOBJ_LockObj From 06ed71caecc7cddcaf09926b3668b73cd8a432cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sat, 3 Apr 2004 20:36:56 +0000 Subject: [PATCH 0723/1463] Most regions (> 95% in testing) consist of only 1 rectangle. Add a single rectangle buffer to ROSRGNDATA to avoid dynamic memory allocation svn path=/trunk/; revision=8960 --- reactos/include/win32k/region.h | 5 +- reactos/subsys/win32k/objects/region.c | 68 ++++++++++++++++---------- 2 files changed, 46 insertions(+), 27 deletions(-) diff --git a/reactos/include/win32k/region.h b/reactos/include/win32k/region.h index 607bebffdc0..3e711a30511 100644 --- a/reactos/include/win32k/region.h +++ b/reactos/include/win32k/region.h @@ -7,7 +7,10 @@ /* Internal region data. Can't use RGNDATA structure because buffer is allocated statically */ typedef struct _ROSRGNDATA { RGNDATAHEADER rdh; - char* Buffer; + char* 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 510fed04d53..ea820837e1f 100644 --- a/reactos/subsys/win32k/objects/region.c +++ b/reactos/subsys/win32k/objects/region.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: region.c,v 1.45 2004/03/23 17:07:41 gvg Exp $ */ +/* $Id: region.c,v 1.46 2004/04/03 20:36:56 gvg Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -78,7 +78,8 @@ static inline int xmemcheck(ROSRGNDATA *reg, LPRECT *rect, LPRECT *firstrect ) { return 0; RtlCopyMemory( temp, *firstrect, reg->rdh.nRgnSize ); reg->rdh.nRgnSize *= 2; - ExFreePool( *firstrect ); + if (*firstrect != ®->BuiltInRect) + ExFreePool( *firstrect ); *firstrect = temp; *rect = (*firstrect)+reg->rdh.nCount; } @@ -141,7 +142,7 @@ static BOOL FASTCALL REGION_CopyRegion(PROSRGNDATA dst, PROSRGNDATA src) if( !temp ) return FALSE; - if( dst->Buffer ) + if( dst->Buffer && dst->Buffer != (char *) &dst->BuiltInRect ) ExFreePool( dst->Buffer ); //free the old buffer dst->Buffer = temp; dst->rdh.nRgnSize = src->rdh.nCount * sizeof(RECT); //size of region buffer @@ -216,7 +217,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 ) + if( rgnDst->Buffer && rgnDst->Buffer != (char *) &rgnDst->BuiltInRect ) ExFreePool( rgnDst->Buffer ); //free the old buffer. will be assigned to xrect below. } @@ -279,7 +280,7 @@ static BOOL FASTCALL REGION_CropAndOffsetRegion(const PPOINT off, const PRECT re if(!temp) return FALSE; - if( rgnDst->Buffer ) + if( rgnDst->Buffer && rgnDst->Buffer != (char *) &rgnDst->BuiltInRect ) ExFreePool( rgnDst->Buffer ); //free the old buffer (PRECT)rgnDst->Buffer = temp; rgnDst->rdh.nCount = i; @@ -817,7 +818,8 @@ REGION_RegionOp( else{ newReg->rdh.nRgnSize = newReg->rdh.nCount*sizeof(RECT); RtlCopyMemory( newReg->Buffer, prev_rects, newReg->rdh.nRgnSize ); - ExFreePool( prev_rects ); + if (prev_rects != &newReg->BuiltInRect) + ExFreePool( prev_rects ); } } else @@ -827,7 +829,8 @@ REGION_RegionOp( * the region is empty */ newReg->rdh.nRgnSize = sizeof(RECT); - ExFreePool( newReg->Buffer ); + if (newReg->Buffer != (char *) &newReg->BuiltInRect) + ExFreePool( newReg->Buffer ); newReg->Buffer = ExAllocatePoolWithTag( PagedPool, sizeof(RECT), TAG_REGION ); ASSERT( newReg->Buffer ); } @@ -838,7 +841,8 @@ REGION_RegionOp( else newReg->rdh.iType = (newReg->rdh.nCount > 1)? COMPLEXREGION : SIMPLEREGION; - ExFreePool( oldRects ); + if (oldRects != &newReg->BuiltInRect) + ExFreePool( oldRects ); return; } @@ -1473,33 +1477,45 @@ HRGN FASTCALL RGNDATA_AllocRgn(INT n) PROSRGNDATA pReg; BOOL bRet; - if((hReg = (HRGN)GDIOBJ_AllocObj(sizeof(ROSRGNDATA), GDI_OBJECT_TYPE_REGION, - (GDICLEANUPPROC) RGNDATA_InternalDelete))){ - if( (pReg = RGNDATA_LockRgn(hReg)) ){ + if ((hReg = (HRGN) GDIOBJ_AllocObj(sizeof(ROSRGNDATA), GDI_OBJECT_TYPE_REGION, + (GDICLEANUPPROC) RGNDATA_InternalDelete))) + { + if (NULL != (pReg = RGNDATA_LockRgn(hReg))) + { + if (1 == n) + { + pReg->Buffer = (char *) &pReg->BuiltInRect; + } + else + { + pReg->Buffer = ExAllocatePoolWithTag(PagedPool, n * sizeof(RECT), TAG_REGION); + } + if (NULL != pReg->Buffer) + { + EMPTY_REGION(pReg); + pReg->rdh.dwSize = sizeof(RGNDATAHEADER); + pReg->rdh.nCount = n; + pReg->rdh.nRgnSize = n*sizeof(RECT); - if ((pReg->Buffer = ExAllocatePoolWithTag(PagedPool, n * sizeof(RECT), TAG_REGION))){ - EMPTY_REGION(pReg); - pReg->rdh.dwSize = sizeof(RGNDATAHEADER); - pReg->rdh.nCount = n; - pReg->rdh.nRgnSize = n*sizeof(RECT); + bRet = RGNDATA_UnlockRgn(hReg); + ASSERT(bRet); - bRet = RGNDATA_UnlockRgn(hReg); - ASSERT(bRet); + return hReg; + } + } + else + { + RGNDATA_FreeRgn(hReg); + } + } - return hReg; - } - - } - else - RGNDATA_FreeRgn(hReg); - } return NULL; } BOOL FASTCALL RGNDATA_InternalDelete( PROSRGNDATA pRgn ) { ASSERT(pRgn); - if(pRgn->Buffer) + if(pRgn->Buffer && pRgn->Buffer != (char *) &pRgn->BuiltInRect) ExFreePool(pRgn->Buffer); return TRUE; } From 81a05c875c8c7507f86f60e0dd81097d245d3e0b Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 3 Apr 2004 21:25:20 +0000 Subject: [PATCH 0724/1463] some more work on TransparentBlt() (EngTransparentBlt() is still unimplemented) svn path=/trunk/; revision=8961 --- reactos/subsys/win32k/eng/transblt.c | 143 +++++++++++++----------- reactos/subsys/win32k/include/intgdi.h | 12 ++ reactos/subsys/win32k/objects/bitmaps.c | 34 ++++-- 3 files changed, 114 insertions(+), 75 deletions(-) diff --git a/reactos/subsys/win32k/eng/transblt.c b/reactos/subsys/win32k/eng/transblt.c index 36809670fd2..fca40f38777 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.12 2004/03/05 09:02:42 hbirr Exp $ +/* $Id: transblt.c,v 1.13 2004/04/03 21:25:20 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -35,12 +35,16 @@ #include #include #include +#include +#include #include "brush.h" #include "clip.h" #include "objects.h" -#include +#define NDEBUG +#include + BOOL STDCALL EngTransparentBlt(PSURFOBJ Dest, @@ -52,73 +56,84 @@ EngTransparentBlt(PSURFOBJ Dest, ULONG TransparentColor, ULONG Reserved) { - PSURFGDI DestGDI = (PSURFGDI)AccessInternalObjectFromUserObject(Dest), - SourceGDI = (PSURFGDI)AccessInternalObjectFromUserObject(Source); - HSURF hTemp; - PSURFOBJ TempSurf; - POINTL TempPoint, SourcePoint; - RECTL TempRect; - SIZEL TempSize; - BOOLEAN ret; - LONG dx, dy, sx, sy; + DPRINT1("EngTransparentBlt() unimplemented!\n"); + return FALSE; +} - dx = abs(DestRect->right - DestRect->left); - dy = abs(DestRect->bottom - DestRect->top); - - sx = abs(SourceRect->right - SourceRect->left); - sy = abs(SourceRect->bottom - SourceRect->top); - - if(sxleft, SourceRect->top, SourceRect->right, SourceRect->bottom); - MouseSafetyOnDrawStart(Dest, DestGDI, DestRect->left, DestRect->top, DestRect->right, DestRect->bottom); - - if(DestGDI->TransparentBlt != NULL) +BOOL FASTCALL +IntTransparentBlt(PSURFOBJ Dest, + PSURFOBJ Source, + PCLIPOBJ Clip, + PXLATEOBJ ColorTranslation, + PRECTL DestRect, + PRECTL SourceRect, + ULONG TransparentColor, + ULONG Reserved) +{ + BOOL Ret; + RECTL OutputRect, InputClippedRect; + PSURFGDI SurfGDIDest, SurfGDISrc; + + InputClippedRect = *DestRect; + if(InputClippedRect.right < InputClippedRect.left) { - // The destination is device managed, therefore get the source into a format compatible surface - TempPoint.x = 0; - TempPoint.y = 0; - TempRect.top = 0; - TempRect.left = 0; - TempRect.bottom = dy; - TempRect.right = dx; - TempSize.cx = TempRect.right; - TempSize.cy = TempRect.bottom; - - hTemp = EngCreateBitmap(TempSize, - DIB_GetDIBWidthBytes(dx, BitsPerFormat(Dest->iBitmapFormat)), - Dest->iBitmapFormat, 0, NULL); - TempSurf = (PSURFOBJ)AccessUserObject((ULONG)hTemp); - - SourcePoint.x = SourceRect->left; - SourcePoint.y = SourceRect->top; - - // FIXME: Skip creating a TempSurf if we have the same BPP and palette - EngBitBlt(TempSurf, Source, NULL, NULL, ColorTranslation, &TempRect, &SourcePoint, NULL, NULL, NULL, 0); - - IntLockGDIDriver(DestGDI); - ret = DestGDI->TransparentBlt(Dest, TempSurf, Clip, NULL, DestRect, SourceRect, - TransparentColor, Reserved); - IntUnLockGDIDriver(DestGDI); - - MouseSafetyOnDrawEnd(Dest, DestGDI); - MouseSafetyOnDrawEnd(Source, SourceGDI); - - if(EngDeleteSurface(hTemp) == FALSE) + InputClippedRect.left = DestRect->right; + InputClippedRect.right = DestRect->left; + } + if(InputClippedRect.bottom < InputClippedRect.top) + { + InputClippedRect.top = DestRect->bottom; + InputClippedRect.bottom = DestRect->top; + } + + /* Clip against the bounds of the clipping region so we won't try to write + * outside the surface */ + if(Clip) + { + if(!EngIntersectRect(&OutputRect, &InputClippedRect, &Clip->rclBounds)) { - DbgPrint("Win32k: Failed to delete surface: %d\n", hTemp); - return FALSE; + return TRUE; } - - return ret; + } + else + { + OutputRect = *DestRect; + } + + if(Source != Dest) + { + SurfGDISrc = (PSURFGDI)AccessInternalObjectFromUserObject(Source); + ASSERT(SurfGDISrc); + MouseSafetyOnDrawStart(Source, SurfGDISrc, 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, + OutputRect.right, OutputRect.bottom); + + if(SurfGDIDest->TransparentBlt) + { + Ret = SurfGDIDest->TransparentBlt(Dest, Source, Clip, ColorTranslation, &OutputRect, + SourceRect, TransparentColor, Reserved); + } + else + Ret = FALSE; + + if(!Ret) + { + Ret = EngTransparentBlt(Dest, Source, Clip, ColorTranslation, &OutputRect, + SourceRect, TransparentColor, Reserved); + } + + MouseSafetyOnDrawEnd(Dest, SurfGDIDest); + if(Source != Dest) + { + MouseSafetyOnDrawEnd(Source, SurfGDISrc); } - // Simulate a transparent blt - - MouseSafetyOnDrawEnd(Dest, DestGDI); - MouseSafetyOnDrawEnd(Source, SourceGDI); - - return TRUE; + return Ret; } + /* EOF */ diff --git a/reactos/subsys/win32k/include/intgdi.h b/reactos/subsys/win32k/include/intgdi.h index 830b7670e57..3edac2563a8 100644 --- a/reactos/subsys/win32k/include/intgdi.h +++ b/reactos/subsys/win32k/include/intgdi.h @@ -121,5 +121,17 @@ IntGdiCombineTransform(LPXFORM XFormResult, LPXFORM xform1, LPXFORM xform2); +/* Bitmap functions */ + +BOOL FASTCALL +IntTransparentBlt(PSURFOBJ Dest, + PSURFOBJ Source, + PCLIPOBJ Clip, + PXLATEOBJ ColorTranslation, + PRECTL DestRect, + PRECTL SourceRect, + ULONG TransparentColor, + ULONG Reserved); + #endif /* _WIN32K_INTGDI_H */ diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index 77a8a77ac63..27d9013cfef 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.65 2004/03/28 21:46:26 weiden Exp $ */ +/* $Id: bitmaps.c,v 1.66 2004/04/03 21:25:20 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -28,6 +28,7 @@ //#include #include "../eng/handle.h" #include +#include #include #include #include @@ -280,11 +281,12 @@ NtGdiTransparentBlt( PDC DCDest, DCSrc; RECT rcDest, rcSrc; PSURFOBJ SurfDest, SurfSrc; - PSURFGDI SurfGDIDest, SurfGDISrc; PXLATEOBJ XlateObj; HPALETTE SourcePalette, DestPalette; PPALGDI PalDestGDI, PalSourceGDI; USHORT PalDestMode, PalSrcMode; + ULONG TransparentColor; + BOOL Ret; if(!(DCDest = DC_LockDc(hdcDst))) { @@ -342,32 +344,42 @@ NtGdiTransparentBlt( } PALETTE_UnlockPalette(SourcePalette); - XlateObj = (PXLATEOBJ)IntEngCreateXlate(PalDestMode, PalSrcMode, DestPalette, SourcePalette); + if((XlateObj = (PXLATEOBJ)IntEngCreateXlate(PalDestMode, PalSrcMode, DestPalette, SourcePalette))) + { + /* FIXME - is color translation right? */ + TransparentColor = XLATEOBJ_iXlate(XlateObj, (ULONG)TransColor); + } + else + { + /* FIXME - what should be done here? */ + TransparentColor = (ULONG)TransColor; + } SurfDest = (PSURFOBJ)AccessUserObject((ULONG)DCDest->Surface); ASSERT(SurfDest); - SurfGDIDest = (PSURFGDI)AccessInternalObjectFromUserObject(SurfDest); - ASSERT(SurfGDIDest); SurfSrc = (PSURFOBJ)AccessUserObject((ULONG)DCSrc->Surface); ASSERT(SurfSrc); - SurfGDISrc = (PSURFGDI)AccessInternalObjectFromUserObject(SurfSrc); - ASSERT(SurfGDISrc); rcDest.left = xDst; rcDest.top = yDst; rcDest.right = rcDest.left + cxDst; - rcDest.bottom = rcDest.bottom + cyDst; + rcDest.bottom = rcDest.top + cyDst; rcSrc.left = xSrc; rcSrc.top = ySrc; - rcSrc.right = rcDest.left + cxSrc; - rcSrc.bottom = rcDest.bottom + cySrc; + rcSrc.right = rcSrc.left + cxSrc; + rcSrc.bottom = rcSrc.top + cySrc; if((cxDst != cxSrc) || (cyDst != cySrc)) { /* FIXME - Create a temporary bitmap and stretchblt it */ + DPRINT1("TransparentBlt() does not support stretching!\n"); + goto done; } + Ret = IntTransparentBlt(SurfDest, SurfSrc, DCDest->CombinedClip, XlateObj, &rcDest, &rcSrc, + TransparentColor, 0); +done: DC_UnlockDc(hdcSrc); if(hdcDst != hdcSrc) { @@ -377,7 +389,7 @@ NtGdiTransparentBlt( { EngDeleteXlate(XlateObj); } - return TRUE; + return Ret; } HBITMAP STDCALL From a20876b230d96c5ff85bdacdaf6f8329594bfd06 Mon Sep 17 00:00:00 2001 From: Richard Campbell Date: Sun, 4 Apr 2004 06:46:22 +0000 Subject: [PATCH 0725/1463] draw the border around the progress bar...code might not be entirely 'correct', can this border be disabled/hidden? svn path=/trunk/; revision=8962 --- reactos/lib/comctl32/progress.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/reactos/lib/comctl32/progress.c b/reactos/lib/comctl32/progress.c index 9de349dfad7..2bfcde9d278 100644 --- a/reactos/lib/comctl32/progress.c +++ b/reactos/lib/comctl32/progress.c @@ -121,15 +121,16 @@ static LRESULT PROGRESS_Draw (PROGRESS_INFO *infoPtr, HDC hdc) else hbrBar = CreateSolidBrush (infoPtr->ColorBar); - if (infoPtr->ColorBk == CLR_DEFAULT) - hbrBk = GetSysColorBrush(COLOR_3DFACE); - else - hbrBk = CreateSolidBrush(infoPtr->ColorBk); - - /* get client rectangle */ + /* Draw the border */ GetClientRect (infoPtr->Self, &rect); - FrameRect( hdc, &rect, hbrBk ); - InflateRect(&rect, -1, -1); + SelectObject( hdc, CreateSolidBrush( RGB(96, 96, 96) ) ); + PatBlt( hdc, rect.left, rect.top, rect.right - rect.left, 1, PATCOPY ); + PatBlt( hdc, rect.left, rect.top, 1, rect.bottom - rect.top, PATCOPY ); + + SelectObject( hdc, CreateSolidBrush(RGB(255,255,255) )); + PatBlt( hdc, rect.left, rect.bottom-1, rect.right - rect.left, 1, PATCOPY ); + PatBlt( hdc, rect.right-1, rect.top, 1, rect.bottom - rect.top, PATCOPY ); + InflateRect(&rect, -2, -2); /* get the window style */ dwStyle = GetWindowLongW (infoPtr->Self, GWL_STYLE); @@ -151,7 +152,7 @@ static LRESULT PROGRESS_Draw (PROGRESS_INFO *infoPtr, HDC hdc) rightMost = rect.right; } - /* now draw the bar */ + if (dwStyle & PBS_SMOOTH) { if (dwStyle & PBS_VERTICAL) From 4eb5cb108bd64fac9d7da0da8f689e811590381e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sun, 4 Apr 2004 15:28:43 +0000 Subject: [PATCH 0726/1463] Honour spacing requested by caller svn path=/trunk/; revision=8963 --- reactos/subsys/win32k/objects/text.c | 59 ++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 8 deletions(-) diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index 03e215464b8..f8031fb2987 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.86 2004/03/28 22:39:59 gvg Exp $ */ +/* $Id: text.c,v 1.87 2004/04/04 15:28:43 gvg Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -1475,7 +1475,7 @@ NtGdiExtTextOut( CONST RECT *lprc, LPCWSTR String, UINT Count, - CONST INT *lpDx) + CONST INT *UnsafeDx) { /* * FIXME: @@ -1508,11 +1508,27 @@ NtGdiExtTextOut( PXLATEOBJ XlateObj, XlateObj2; ULONG Mode; FT_Render_Mode RenderMode; - BOOL Render; + BOOLEAN Render; + NTSTATUS Status; + INT *Dx = NULL;; dc = DC_LockDc(hDC); if (!dc) return FALSE; + + if (NULL != UnsafeDx) + { + Dx = ExAllocatePoolWithTag(PagedPool, Count * sizeof(INT), TAG_GDITEXT); + if (NULL == Dx) + { + goto fail; + } + Status = MmCopyFromCaller(Dx, UnsafeDx, Count * sizeof(INT)); + if (! NT_SUCCESS(Status)) + { + goto fail; + } + } SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface); @@ -1655,14 +1671,26 @@ NtGdiExtTextOut( if (dc->w.textAlign & (TA_RIGHT | TA_CENTER)) { - UINT TextWidth; + UINT TextWidth = 0; LPCWSTR TempText = String; + int Start; /* * Calculate width of the text. */ - for (i = 0; i < Count; i++) + if (NULL != Dx) + { + Start = Count < 2 ? 0 : Count - 2; + TextWidth = Count < 2 ? 0 : Dx[Count - 2]; + } + else + { + Start = 0; + } + TempText = String + Start; + + for (i = Start; i < Count; i++) { IntLockFreeType; glyph_index = FT_Get_Char_Index(face, *TempText); @@ -1700,7 +1728,7 @@ NtGdiExtTextOut( } else { - XStart -= TextWidth >> 1; + XStart -= TextWidth / 2; } } @@ -1730,7 +1758,7 @@ NtGdiExtTextOut( glyph = face->glyph; /* retrieve kerning distance and move pen position */ - if (use_kerning && previous && glyph_index) + if (use_kerning && previous && glyph_index && NULL == Dx) { FT_Vector delta; IntLockFreeType; @@ -1815,7 +1843,14 @@ NtGdiExtTextOut( EngDeleteSurface(HSourceGlyph); - TextLeft += (glyph->advance.x + 32) >> 6; + if (NULL == Dx) + { + TextLeft += (glyph->advance.x + 32) >> 6; + } + else + { + TextLeft += Dx[i]; + } previous = glyph_index; String++; @@ -1831,6 +1866,10 @@ NtGdiExtTextOut( } BRUSHOBJ_UnlockBrush(hBrushFg); NtGdiDeleteObject(hBrushFg); + if (NULL != Dx) + { + ExFreePool(Dx); + } DC_UnlockDc(hDC); return TRUE; @@ -1847,6 +1886,10 @@ fail: BRUSHOBJ_UnlockBrush(hBrushFg); NtGdiDeleteObject(hBrushFg); } + if (NULL != Dx) + { + ExFreePool(Dx); + } DC_UnlockDc(hDC); return FALSE; From 776c1e9696cda135adf8e045ce2ac54f488b008c Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sun, 4 Apr 2004 16:04:34 +0000 Subject: [PATCH 0727/1463] import IE bookmarks and convert into XBEL format bookmark file svn path=/trunk/; revision=8964 --- reactos/subsys/system/explorer/Jamfile | 1 + reactos/subsys/system/explorer/Makefile | 1 + reactos/subsys/system/explorer/Makefile.MinGW | 1 + reactos/subsys/system/explorer/Makefile.Wine | 1 + .../subsys/system/explorer/doxy-footer.html | 2 +- reactos/subsys/system/explorer/explorer.cpp | 30 +- reactos/subsys/system/explorer/explorer.dsp | 8 + reactos/subsys/system/explorer/globals.h | 9 +- .../subsys/system/explorer/make_explorer.dsp | 2 +- .../subsys/system/explorer/shell/fatfs.cpp | 2 +- .../system/explorer/taskbar/favorites.cpp | 292 ++++++++++++ .../system/explorer/taskbar/favorites.h | 87 ++++ .../system/explorer/taskbar/startmenu.cpp | 2 +- .../system/explorer/taskbar/traynotify.cpp | 8 +- .../system/explorer/utility/xmlstorage.cpp | 168 +++++-- .../system/explorer/utility/xmlstorage.h | 446 +++++++++++++++--- 16 files changed, 929 insertions(+), 131 deletions(-) create mode 100644 reactos/subsys/system/explorer/taskbar/favorites.cpp create mode 100644 reactos/subsys/system/explorer/taskbar/favorites.h diff --git a/reactos/subsys/system/explorer/Jamfile b/reactos/subsys/system/explorer/Jamfile index 9be72f6b573..127ec3898f4 100644 --- a/reactos/subsys/system/explorer/Jamfile +++ b/reactos/subsys/system/explorer/Jamfile @@ -31,6 +31,7 @@ exe explorer : taskbar/startmenu.cpp taskbar/taskbar.cpp taskbar/traynotify.cpp + taskbar/favorites.cpp desktop/desktop.cpp # utility/splitpath.c utility/dragdropimpl.cpp diff --git a/reactos/subsys/system/explorer/Makefile b/reactos/subsys/system/explorer/Makefile index 79bf63e82ec..a1f5fe08fab 100644 --- a/reactos/subsys/system/explorer/Makefile +++ b/reactos/subsys/system/explorer/Makefile @@ -99,6 +99,7 @@ OBJECTS = \ startmenu.o \ traynotify.o \ quicklaunch.o \ + favorites.o \ searchprogram.o \ settings.o \ i386-stub-win32.o \ diff --git a/reactos/subsys/system/explorer/Makefile.MinGW b/reactos/subsys/system/explorer/Makefile.MinGW index 4eb220c29d3..1c5c13949cd 100644 --- a/reactos/subsys/system/explorer/Makefile.MinGW +++ b/reactos/subsys/system/explorer/Makefile.MinGW @@ -68,6 +68,7 @@ OBJECTS = \ startmenu.o \ traynotify.o \ quicklaunch.o \ + favorites.o \ searchprogram.o \ settings.o \ i386-stub-win32.o \ diff --git a/reactos/subsys/system/explorer/Makefile.Wine b/reactos/subsys/system/explorer/Makefile.Wine index 7899fe67a9d..464ada9b625 100644 --- a/reactos/subsys/system/explorer/Makefile.Wine +++ b/reactos/subsys/system/explorer/Makefile.Wine @@ -39,6 +39,7 @@ CPP_SRCS = \ taskbar/startmenu.cpp \ taskbar/traynotify.cpp \ taskbar/quicklaunch.cpp \ + taskbar/favorites.cpp \ dialogs/searchprogram.cpp \ dialogs/settings.cpp diff --git a/reactos/subsys/system/explorer/doxy-footer.html b/reactos/subsys/system/explorer/doxy-footer.html index 451e0f066b6..e9dcac1212c 100644 --- a/reactos/subsys/system/explorer/doxy-footer.html +++ b/reactos/subsys/system/explorer/doxy-footer.html @@ -3,7 +3,7 @@
ROS Explorer Source Code Documentation -
generated on 28.03.2004 by
+
generated on 04.04.2004 by
doxygen
diff --git a/reactos/subsys/system/explorer/explorer.cpp b/reactos/subsys/system/explorer/explorer.cpp index 17ecf23f1b7..ef1e911f08d 100644 --- a/reactos/subsys/system/explorer/explorer.cpp +++ b/reactos/subsys/system/explorer/explorer.cpp @@ -82,27 +82,31 @@ void ExplorerGlobals::init(HINSTANCE hInstance) } -bool ExplorerGlobals::read_cfg() +void ExplorerGlobals::read_persistent() { // read configuration file _cfg_dir.printf(TEXT("%s\\ReactOS"), (LPCTSTR)SpecialFolderFSPath(CSIDL_APPDATA,0)); - _cfg_path.printf(TEXT("%s\\ros-explorer.xml"), _cfg_dir.c_str()); + _cfg_path.printf(TEXT("%s\\ros-explorer-cfg.xml"), _cfg_dir.c_str()); - if (_cfg.read(_cfg_path)) - return true; + if (!_cfg.read(_cfg_path)) + _cfg.read(TEXT("explorer-cfg-template.xml")); - if (_cfg.read("explorer-cfg-template.xml")) - return true; + // read bookmarks + _favorites_path.printf(TEXT("%s\\ros-explorer-bookmarks.xml"), _cfg_dir.c_str()); - return false; + if (!_favorites.read(_favorites_path)) { + _favorites.import_IE_favorites(0); + _favorites.write(_favorites_path); + } } -void ExplorerGlobals::write_cfg() +void ExplorerGlobals::write_persistent() { // write configuration file RecursiveCreateDirectory(_cfg_dir); _cfg.write(_cfg_path); + _favorites.write(_favorites_path); } @@ -110,7 +114,7 @@ XMLPos ExplorerGlobals::get_cfg() { XMLPos pos(&_cfg); - pos.create("explorer-cfg"); + pos.smart_create("explorer-cfg"); return pos; } @@ -119,8 +123,8 @@ XMLPos ExplorerGlobals::get_cfg(const String& name) { XMLPos pos(&_cfg); - pos.create("explorer-cfg"); - pos.create(name); + pos.smart_create("explorer-cfg"); + pos.smart_create(name); return pos; } @@ -790,7 +794,7 @@ int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdL // init common controls library CommonControlInit usingCmnCtrl; - g_Globals.read_cfg(); + g_Globals.read_persistent(); if (startup_desktop) { g_Globals._desktops.init(); @@ -818,7 +822,7 @@ int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdL int ret = explorer_main(hInstance, lpCmdLine, nShowCmd); // write configuration file - g_Globals.write_cfg(); + g_Globals.write_persistent(); return ret; } diff --git a/reactos/subsys/system/explorer/explorer.dsp b/reactos/subsys/system/explorer/explorer.dsp index 9f7fb436fd2..f240ab90e46 100644 --- a/reactos/subsys/system/explorer/explorer.dsp +++ b/reactos/subsys/system/explorer/explorer.dsp @@ -554,6 +554,14 @@ SOURCE=.\taskbar\desktopbar.h # End Source File # Begin Source File +SOURCE=.\taskbar\favorites.cpp +# End Source File +# Begin Source File + +SOURCE=.\taskbar\favorites.h +# End Source File +# Begin Source File + SOURCE=.\notifyhook\notifyhook.h # End Source File # Begin Source File diff --git a/reactos/subsys/system/explorer/globals.h b/reactos/subsys/system/explorer/globals.h index b42152755fd..f0ac671f995 100644 --- a/reactos/subsys/system/explorer/globals.h +++ b/reactos/subsys/system/explorer/globals.h @@ -30,6 +30,8 @@ using namespace XMLStorage; +#include "taskbar/favorites.h" + /// management of file types struct FileTypeInfo { @@ -228,8 +230,8 @@ extern struct ExplorerGlobals void init(HINSTANCE hInstance); - bool read_cfg(); - void write_cfg(); + void read_persistent(); + void write_persistent(); XMLPos get_cfg(); XMLPos get_cfg(const String& name); @@ -259,6 +261,9 @@ extern struct ExplorerGlobals XMLDoc _cfg; String _cfg_dir; String _cfg_path; + + Favorites _favorites; + String _favorites_path; } g_Globals; diff --git a/reactos/subsys/system/explorer/make_explorer.dsp b/reactos/subsys/system/explorer/make_explorer.dsp index 1631b01d435..7500119cfab 100644 --- a/reactos/subsys/system/explorer/make_explorer.dsp +++ b/reactos/subsys/system/explorer/make_explorer.dsp @@ -108,7 +108,7 @@ CFG=make_explorer - Win32 bjam # PROP Use_Debug_Libraries 0 # PROP Output_Dir "URelease" # PROP Intermediate_Dir "URelease" -# PROP Cmd_Line "msdevfilt -gcc make -f Makefile.MinGW UNICODE=1" +# PROP Cmd_Line "make -f Makefile.MinGW UNICODE=1" # PROP Rebuild_Opt "clean all" # PROP Target_File "explorer.exe" # PROP Bsc_Name "" diff --git a/reactos/subsys/system/explorer/shell/fatfs.cpp b/reactos/subsys/system/explorer/shell/fatfs.cpp index a2c0b120bc6..96481ac7e7b 100644 --- a/reactos/subsys/system/explorer/shell/fatfs.cpp +++ b/reactos/subsys/system/explorer/shell/fatfs.cpp @@ -460,7 +460,7 @@ FATDrive::FATDrive(LPCTSTR path) _CacheDty = NULL; _Caches = 0; - _hDrive = CreateFile(path, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0); + _hDrive = CreateFile(path, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0); if (_hDrive != INVALID_HANDLE_VALUE) { _boot_sector.BytesPerSector = 512; diff --git a/reactos/subsys/system/explorer/taskbar/favorites.cpp b/reactos/subsys/system/explorer/taskbar/favorites.cpp new file mode 100644 index 00000000000..e4ab91fba18 --- /dev/null +++ b/reactos/subsys/system/explorer/taskbar/favorites.cpp @@ -0,0 +1,292 @@ +/* + * Copyright 2004 Martin Fuchs + * + * 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 + */ + + + // + // Explorer and Desktop clone + // + // favorites.cpp + // + // Martin Fuchs, 04.04.2004 + // + + +#include "../utility/utility.h" + +#include "../explorer.h" +#include "../globals.h" + +#include "startmenu.h" + + + /// read .URL file +bool Bookmark::read_url(LPCTSTR path) +{ + char line[BUFFER_LEN]; + + tifstream in(path); + + while(in.good()) { + in.getline(line, BUFFER_LEN); + + const char* p = line; + while(isspace(*p)) + ++p; + + const char* keyword = p; + const char* eq = strchr(p, '='); + + if (eq) { + const char* cont = eq + 1; + while(isspace(*cont)) + ++cont; + + if (!strnicmp(keyword, "URL", 3)) + _url = cont; + else if (!strnicmp(keyword, "IconFile", 8)) + _icon_path = cont; + } + } + + return true; +} + + /// convert XBEL bookmark node +bool Bookmark::read_xbel(const_XMLPos& pos) +{ + _url = pos.get("href"); + + if (!pos.go_down("title")) + return false; + + _name = pos->get_content(); + + pos.back(); + + return true; +} + + +BookmarkNode::BookmarkNode(const Bookmark& bm) + : _type(BMNT_BOOKMARK) +{ + _pbookmark = new Bookmark(bm); +} + +BookmarkNode::BookmarkNode(const BookmarkFolder& bmf) + : _type(BMNT_FOLDER) +{ + _pfolder = new BookmarkFolder(bmf); +} + +BookmarkNode::BookmarkNode(const BookmarkNode& other) + : _type(other._type) +{ + if (_type == BMNT_BOOKMARK) + _pbookmark = new Bookmark(*other._pbookmark); + else + _pfolder = new BookmarkFolder(*other._pfolder); +} + +BookmarkNode::~BookmarkNode() +{ + if (_type == BMNT_BOOKMARK) + delete _pbookmark; + else + delete _pfolder; +} + + + /// read bookmark list from XBEL formated XML tree +void BookmarkList::read(const_XMLPos& pos) +{ + const XMLNode::Children& children = pos->get_children(); + + for(XMLNode::Children::const_iterator it=children.begin(); it!=children.end(); ++it) { + const XMLNode& node = **it; + const_XMLPos sub_pos(&node); + + if (node == "folder") { + BookmarkFolder new_folder; + + if (sub_pos.go_down("title")) { + new_folder._name = sub_pos->get_content(); + sub_pos.back(); + } + + new_folder._bookmarks.read(sub_pos); + + push_back(new_folder); + } else if (node == "bookmark") { + Bookmark bookmark; + + if (bookmark.read_xbel(sub_pos)) + push_back(bookmark); + } + } +} + + /// write bookmark list into XBEL formated XML tree +void BookmarkList::write(XMLPos& pos) const +{ + for(const_iterator it=begin(); it!=end(); ++it) { + const BookmarkNode& node = *it; + + if (node._type == BookmarkNode::BMNT_FOLDER) { + BookmarkFolder& folder = *node._pfolder; + + pos.create("folder"); + + pos.create("title"); + pos->set_content(folder._name); + pos.back(); + + folder._bookmarks.write(pos); + + pos.back(); + } else { // node._type == BookmarkNode::BMNT_BOOKMARK + Bookmark& bookmark = *node._pbookmark; + + if (!bookmark._url.empty()) { + pos.create("bookmark"); + + pos["href"] = bookmark._url; + + pos.create("title"); + pos->set_content(bookmark._name); + pos.back(); + + pos.back(); + } + } + } +} + + +void BookmarkList::import_IE_favorites(ShellDirectory& dir, HWND hwnd) +{ + TCHAR path[MAX_PATH], ext[_MAX_EXT]; + + dir.smart_scan(SCAN_FILESYSTEM); + + for(Entry*entry=dir._down; entry; entry=entry->_next) { + if (entry->_shell_attribs & SFGAO_HIDDEN) // hide files like "desktop.ini" + continue; + + String name; + + if (entry->_etype == ET_SHELL) + name = dir._folder.get_name(static_cast(entry)->_pidl); + else + name = entry->_display_name; + + if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + BookmarkFolder new_folder; + + new_folder._name = name; + + if (entry->_etype == ET_SHELL) { + ShellDirectory new_dir(dir._folder, static_cast(entry)->_pidl, hwnd); + new_folder._bookmarks.import_IE_favorites(new_dir, hwnd); + } else { + entry->get_path(path); + ShellDirectory new_dir(GetDesktopFolder(), path, hwnd); + new_folder._bookmarks.import_IE_favorites(new_dir, hwnd); + } + + push_back(new_folder); + } else { + Bookmark bookmark; + + bookmark._name = name; + + entry->get_path(path); + _tsplitpath(path, NULL, NULL, NULL, ext); + + if (!_tcsicmp(ext, TEXT(".url"))) { + bookmark.read_url(path); + push_back(bookmark); + } else { + ///@todo read shell links + assert(0); + } + } + } +} + + + /// read XBEL bookmark file +bool Favorites::read(LPCTSTR path) +{ + XMLDoc xbel; + + if (!xbel.read(path)) + return false; + + const_XMLPos pos(&xbel); + + if (!pos.go_down("xbel")) + return false; + + super::read(pos); + + pos.back(); + + return true; +} + + /// write XBEL bookmark file +void Favorites::write(LPCTSTR path) const +{ + XMLDoc xbel; + + XMLPos pos(&xbel); + pos.create("xbel"); + super::write(pos); + pos.back(); + + xbel.write(path, XMLNode::FORMAT_SMART, XMLHeader("1.0", "UTF-8", "")); +} + + /// import Internet Explorer bookmarks from Favorites folder +bool Favorites::import_IE_favorites(HWND hwnd) +{ + WaitCursor wait; + + StartMenuShellDirs dirs; + + try { + dirs.push_back(ShellDirectory(GetDesktopFolder(), SpecialFolderPath(CSIDL_COMMON_FAVORITES, hwnd), hwnd)); + dirs.push_back(ShellDirectory(GetDesktopFolder(), SpecialFolderPath(CSIDL_FAVORITES, hwnd), hwnd)); + } catch(COMException&) { + } + + for(StartMenuShellDirs::iterator it=dirs.begin(); it!=dirs.end(); ++it) { + StartMenuDirectory& smd = *it; + ShellDirectory& dir = smd._dir; + + try { + super::import_IE_favorites(dir, hwnd); + } catch(COMException&) { + } + } + + return true; +} diff --git a/reactos/subsys/system/explorer/taskbar/favorites.h b/reactos/subsys/system/explorer/taskbar/favorites.h new file mode 100644 index 00000000000..68c08ff4d62 --- /dev/null +++ b/reactos/subsys/system/explorer/taskbar/favorites.h @@ -0,0 +1,87 @@ +/* + * Copyright 2004 Martin Fuchs + * + * 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 + */ + + + // + // Explorer and Desktop clone + // + // favorites.h + // + // Martin Fuchs, 04.04.2004 + // + + +struct Bookmark +{ + Bookmark() : _icon_idx(0) {} + + String _name; + String _url; + String _description; + String _icon_path; + int _icon_idx; + + bool read_url(LPCTSTR path); + bool read_xbel(const_XMLPos& pos); +}; + +struct BookmarkFolder; + +struct BookmarkNode +{ + BookmarkNode(const Bookmark& bm); + BookmarkNode(const BookmarkFolder& bmf); + BookmarkNode(const BookmarkNode& other); + ~BookmarkNode(); + + enum BOOKMARKNODE_TYPE { + BMNT_BOOKMARK, BMNT_FOLDER + }; + + BOOKMARKNODE_TYPE _type; + + union { + Bookmark* _pbookmark; + BookmarkFolder* _pfolder; + }; +}; + +struct BookmarkList : public list +{ + void import_IE_favorites(struct ShellDirectory& dir, HWND hwnd); + + void read(const_XMLPos& pos); + void write(XMLPos& pos) const; +}; + +struct BookmarkFolder +{ + String _name; + String _description; + BookmarkList _bookmarks; +}; + +struct Favorites : public BookmarkList +{ + typedef BookmarkList super; + + bool read(LPCTSTR path); + void write(LPCTSTR path) const; + + bool import_IE_favorites(HWND hwnd); +}; diff --git a/reactos/subsys/system/explorer/taskbar/startmenu.cpp b/reactos/subsys/system/explorer/taskbar/startmenu.cpp index ff68d1c726e..3c9ef74ab12 100644 --- a/reactos/subsys/system/explorer/taskbar/startmenu.cpp +++ b/reactos/subsys/system/explorer/taskbar/startmenu.cpp @@ -1616,7 +1616,7 @@ int StartMenuHandler::Command(int id, int code) break; case IDC_FAVORITES: - CreateSubmenu(id, CSIDL_FAVORITES, ResString(IDS_FAVORITES)); + CreateSubmenu(id, CSIDL_COMMON_FAVORITES, CSIDL_FAVORITES, ResString(IDS_FAVORITES)); break; case IDC_BROWSE: diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index 841aec1c757..d19a1fcec94 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -259,11 +259,11 @@ void NotifyArea::write_config() // write notification icon settings to XML configuration file XMLPos pos = g_Globals.get_cfg(); - pos.create("desktopbar"); + pos.smart_create("desktopbar"); XMLBoolRef(pos, "options", "show-clock") = _hwndClock!=0; pos.back(); - pos.create("notify-icons"); + pos.smart_create("notify-icons"); XMLBoolRef(pos, "options", "hide-inactive") = _hide_inactive; XMLBoolRef(pos, "options", "show-hidden") = _show_hidden; @@ -272,7 +272,7 @@ void NotifyArea::write_config() NotifyIconConfig& cfg = *it; // search for the corresponding node using the original name - pos.create("icon", "name", cfg._name); + pos.smart_create("icon", "name", cfg._name); // refresh unique name cfg.create_name(); @@ -293,7 +293,7 @@ void NotifyArea::show_clock(bool flag) if (vis != flag) { if (flag) { - // create clock window + // smart_create clock window _hwndClock = ClockWindow::Create(_hwnd); if (_hwndClock) { diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.cpp b/reactos/subsys/system/explorer/utility/xmlstorage.cpp index 5f995d0a4ed..05e9de6cb96 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.cpp +++ b/reactos/subsys/system/explorer/utility/xmlstorage.cpp @@ -54,6 +54,34 @@ bool XMLPos::go(const char* path) } + /// read XML stream into XML tree below _pos +XML_Status XMLReader::read(std::istream& in) +{ + XML_Status status = XML_STATUS_OK; + + while(in.good() && status==XML_STATUS_OK) { + char* buffer = (char*) XML_GetBuffer(_parser, BUFFER_LEN); + + in.read(buffer, BUFFER_LEN); + + status = XML_ParseBuffer(_parser, in.gcount(), false); + } + + if (status != XML_STATUS_ERROR) + status = XML_ParseBuffer(_parser, 0, true); + +/* + if (status == XML_STATUS_ERROR) + cerr << get_error_string(); +*/ + + _pos->append_trailing(_content.c_str(), _content.length()); + _content.erase(); + + return status; +} + + /// store XML version and encoding into XML reader void XMLCALL XMLReader::XML_XmlDeclHandler(void* userData, const XML_Char* version, const XML_Char* encoding, int standalone) { @@ -65,12 +93,31 @@ void XMLCALL XMLReader::XML_XmlDeclHandler(void* userData, const XML_Char* versi } } - /// notifications about XML tag start + /// notifications about XML start tag void XMLCALL XMLReader::XML_StartElementHandler(void* userData, const XML_Char* name, const XML_Char** atts) { XMLReader* pThis = (XMLReader*) userData; - XMLNode* node = new XMLNode(String_from_XML_Char(name)); + // search for end of first line + const char* s = pThis->_content.c_str(); + const char* p = s; + const char* e = p + pThis->_content.length(); + + for(; p_pos->append_trailing(s, p-s); + + std::string leading; + + if (p != e) + leading.assign(p, e-p); + + XMLNode* node = new XMLNode(String_from_XML_Char(name), leading); pThis->_pos.add_down(node); @@ -81,17 +128,41 @@ void XMLCALL XMLReader::XML_StartElementHandler(void* userData, const XML_Char* (*node)[String_from_XML_Char(attr_name)] = String_from_XML_Char(attr_value); } - pThis->_in_tag = true; + pThis->_in_node = true; + pThis->_content.erase(); } - /// notifications about XML tag end + /// notifications about XML end tag void XMLCALL XMLReader::XML_EndElementHandler(void* userData, const XML_Char* name) { XMLReader* pThis = (XMLReader*) userData; + // search for end of first line + const char* s = pThis->_content.c_str(); + const char* p = s; + const char* e = p + pThis->_content.length(); + + for(; p_pos->append_content(s, p-s); + + std::string leading; + + if (p != e) + leading.assign(p, e-p); + + if (leading.empty()) + pThis->_pos->_end_leading = leading; + pThis->_pos.back(); - pThis->_in_tag = false; + pThis->_in_node = false; + pThis->_content.erase(); } /// store content, white space and comments @@ -99,14 +170,11 @@ void XMLCALL XMLReader::XML_DefaultHandler(void* userData, const XML_Char* s, in { XMLReader* pThis = (XMLReader*) userData; - if (pThis->_in_tag) - pThis->_pos->append_content(s, len); - else - pThis->_pos->append_trailing(s, len); + pThis->_content.append(s, len); } -std::string XMLString(LPCTSTR s) +std::string EncodeXMLString(LPCTSTR s) { TCHAR buffer[BUFFER_LEN]; LPTSTR o = buffer; @@ -132,22 +200,46 @@ std::string XMLString(LPCTSTR s) return get_utf8(buffer, o-buffer); } +String DecodeXMLString(LPCTSTR s) +{ + TCHAR buffer[BUFFER_LEN]; + LPTSTR o = buffer; + + for(LPCTSTR p=s; *p; ++p) + if (*p == '&') { + if (!_tcsnicmp(p+1, TEXT("amp;"), 4)) { + *o++ = '&'; + p += 4; + } else if (!_tcsnicmp(p+1, TEXT("lt;"), 3)) { + *o++ = '<'; + p += 3; + } else if (!_tcsnicmp(p+1, TEXT("gt;"), 3)) { + *o++ = '>'; + p += 3; + } else + *o++ = *p; + } else + *o++ = *p; + + return String(buffer, o-buffer); +} + /// write node with children tree to output stream using original white space -void XMLNode::write_worker(std::ostream& out, WRITE_MODE mode, int indent) const +void XMLNode::write_worker(std::ostream& out, int indent) const { - out << '<' << XMLString(*this); + out << _leading << '<' << EncodeXMLString(*this); for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it) - out << ' ' << XMLString(it->first) << "=\"" << XMLString(it->second) << "\""; + out << ' ' << EncodeXMLString(it->first) << "=\"" << EncodeXMLString(it->second) << "\""; if (!_children.empty() || !_content.empty()) { out << '>' << _content; for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) - (*it)->write_worker(out, mode, indent+1); + (*it)->write_worker(out, indent+1); - out << "'; + out << _end_leading << "'; } else out << "/>"; @@ -156,81 +248,73 @@ void XMLNode::write_worker(std::ostream& out, WRITE_MODE mode, int indent) const /// pretty print node with children tree to output stream -void XMLNode::pretty_write_worker(std::ostream& out, WRITE_MODE mode, int indent) const +void XMLNode::pretty_write_worker(std::ostream& out, int indent) const { for(int i=indent; i--; ) out << XML_INDENT_SPACE; - out << '<' << XMLString(*this); + out << '<' << EncodeXMLString(*this); for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it) - out << ' ' << XMLString(it->first) << "=\"" << XMLString(it->second) << "\""; + out << ' ' << EncodeXMLString(it->first) << "=\"" << EncodeXMLString(it->second) << "\""; if (!_children.empty() || !_content.empty()) { out << ">\n"; for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) - (*it)->pretty_write_worker(out, mode, indent+1); + (*it)->pretty_write_worker(out, indent+1); for(int i=indent; i--; ) out << XML_INDENT_SPACE; - out << "\n"; + out << "\n"; } else out << "/>\n"; } - /// write node with children tree to output stream using smart formating -bool XMLNode::smart_write_worker(std::ostream& out, int indent, bool next_format) const +void XMLNode::smart_write_worker(std::ostream& out, int indent) const { - bool format_pre, format_mid, format_post; - - format_pre = next_format; - format_mid = _content.empty(); - format_post = _trailing.empty(); - - if (format_pre) + if (_leading.empty()) for(int i=indent; i--; ) out << XML_INDENT_SPACE; + else + out << _leading; - out << '<' << XMLString(*this); + out << '<' << EncodeXMLString(*this); for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it) - out << ' ' << XMLString(it->first) << "=\"" << XMLString(it->second) << "\""; + out << ' ' << EncodeXMLString(it->first) << "=\"" << EncodeXMLString(it->second) << "\""; if (!_children.empty() || !_content.empty()) { out << '>'; - if (format_mid) + if (_content.empty()) out << '\n'; else out << _content; Children::const_iterator it = _children.begin(); - if (it != _children.end()) { - next_format = (*it)->_content.empty() && (*it)->_trailing.empty(); - + if (it != _children.end()) for(; it!=_children.end(); ++it) - next_format = (*it)->smart_write_worker(out, indent+1, next_format); - } + (*it)->smart_write_worker(out, indent+1); - if (next_format) + if (_end_leading.empty()) for(int i=indent; i--; ) out << XML_INDENT_SPACE; + else + out << _end_leading; - out << "'; + out << "'; } else out << "/>"; - if (format_post) + if (_trailing.empty()) out << '\n'; else out << _trailing; - - return format_post; } diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.h b/reactos/subsys/system/explorer/utility/xmlstorage.h index 9ea5bd75d2f..06bfa3751f5 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.h +++ b/reactos/subsys/system/explorer/utility/xmlstorage.h @@ -47,7 +47,7 @@ #include // for LPCTSTR #ifdef UNICODE -#define _UNICODE +#define _UNICODE #endif #include @@ -202,11 +202,74 @@ inline std::string get_utf8(const String& s) return get_utf8(s.c_str(), s.length()); } -extern std::string XMLString(LPCTSTR s); +extern std::string EncodeXMLString(LPCTSTR s); +extern String DecodeXMLString(LPCTSTR s); + + +#ifdef __GNUC__ +#include +typedef __gnu_cxx::stdio_filebuf STDIO_FILEBUF; +#else +typedef std::filebuf STDIO_FILEBUF; +#endif + +struct tifstream : public std::istream +{ + typedef std::istream super; + + tifstream(LPCTSTR path) + : super(&_buf), + _pfile(_tfopen(path, TEXT("r"))), +#ifdef __GNUC__ + _buf(_pfile, ios::in) +#else + _buf(_pfile) +#endif + { + } + + ~tifstream() + { + if (_pfile) + fclose(_pfile); + } + +protected: + FILE* _pfile; + STDIO_FILEBUF _buf; +}; + +struct tofstream : public std::ostream +{ + typedef std::ostream super; + + tofstream(LPCTSTR path) + : super(&_buf), + _pfile(_tfopen(path, TEXT("w"))), +#ifdef __GNUC__ + _buf(_pfile, ios::out) +#else + _buf(_pfile) +#endif + { + } + + ~tofstream() + { + flush(); + + if (_pfile) + fclose(_pfile); + } + +protected: + FILE* _pfile; + STDIO_FILEBUF _buf; +}; // write XML files with 2 spaces indenting -#define XML_INDENT_SPACE " " +#define XML_INDENT_SPACE " " #ifdef XML_UNICODE // Are XML_Char strings UTF-16 encoded? @@ -279,6 +342,7 @@ struct XMLNode : public String // access to protected class members for XMLPos and XMLReader friend struct XMLPos; + friend struct const_XMLPos; friend struct XMLReader; XMLNode(const String& name) @@ -286,9 +350,17 @@ struct XMLNode : public String { } + XMLNode(const String& name, const std::string& leading) + : String(name), + _leading(leading) + { + } + XMLNode(const XMLNode& other) : _attributes(other._attributes), + _leading(other._leading), _content(other._content), + _end_leading(other._end_leading), _trailing(other._trailing) { for(Children::const_iterator it=other._children.begin(); it!=other._children.end(); ++it) @@ -312,7 +384,9 @@ struct XMLNode : public String _attributes = other._attributes; + _leading = other._leading; _content = other._content; + _end_leading = other._end_leading; _trailing = other._trailing; return *this; @@ -401,10 +475,24 @@ struct XMLNode : public String return _children; } + String get_content() const + { + String ret; + + assign_utf8(ret, _content.c_str()); + + return DecodeXMLString(ret); + } + + void set_content(const String& s) + { + _content.assign(EncodeXMLString(s)); + } + enum WRITE_MODE { FORMAT_SMART = 0, /// preserve original white space and comments if present; pretty print otherwise FORMAT_ORIGINAL = 1, /// write XML stream preserving original white space and comments - FORMAT_PRETTY = 2 /// pretty print node to stream without preserving original white space + FORMAT_PRETTY = 2 /// pretty print node to stream without preserving original white space }; /// write node with children tree to output stream @@ -412,15 +500,15 @@ struct XMLNode : public String { switch(mode) { case FORMAT_PRETTY: - pretty_write_worker(out, mode, indent); + pretty_write_worker(out, indent); break; case FORMAT_ORIGINAL: - write_worker(out, mode, indent); + write_worker(out, indent); break; default: // FORMAT_SMART - smart_write_worker(out, indent, _content.empty() && _trailing.empty()); + smart_write_worker(out, indent); } return out; @@ -430,8 +518,10 @@ protected: Children _children; AttributeMap _attributes; - std::string _content; - std::string _trailing; + std::string _leading; + std::string _content; + std::string _end_leading; + std::string _trailing; XMLNode* get_first_child() const { @@ -488,10 +578,10 @@ protected: void append_content(const char* s, int l) { - if (_children.empty()) + //if (_children.empty()) _content.append(s, l); - else - _children.back()->_content.append(s, l); + //else + // _children.back()->_content.append(s, l); } void append_trailing(const char* s, int l) @@ -502,9 +592,9 @@ protected: _children.back()->_trailing.append(s, l); } - void write_worker(std::ostream& out, WRITE_MODE mode, int indent) const; - void pretty_write_worker(std::ostream& out, WRITE_MODE mode, int indent) const; - bool smart_write_worker(std::ostream& out, int indent, bool next_format) const; + void write_worker(std::ostream& out, int indent) const; + void pretty_write_worker(std::ostream& out, int indent) const; + void smart_write_worker(std::ostream& out, int indent) const; }; @@ -606,6 +696,104 @@ protected: }; + /// read only iterator access to children nodes with name filtering +struct const_XMLChildrenFilter +{ + const_XMLChildrenFilter(const XMLNode::Children& children, const String& name) + : _begin(children.begin(), children.end(), name), + _end(children.end(), children.end(), name) + { + } + + const_XMLChildrenFilter(const XMLNode* node, const String& name) + : _begin(node->get_children().begin(), node->get_children().end(), name), + _end(node->get_children().end(), node->get_children().end(), name) + { + } + + struct const_iterator + { + typedef XMLNode::Children::const_iterator BaseIterator; + + const_iterator(BaseIterator begin, BaseIterator end, const String& filter_name) + : _cur(begin), + _end(end), + _filter_name(filter_name) + { + search_next(); + } + + operator BaseIterator() + { + return _cur; + } + + const XMLNode* operator*() const + { + return *_cur; + } + + XMLNode* operator*() + { + return *_cur; + } + + const_iterator& operator++() + { + ++_cur; + search_next(); + + return *this; + } + + const_iterator operator++(int) + { + const_iterator ret = *this; + + ++_cur; + search_next(); + + return ret; + } + + bool operator==(const BaseIterator& other) const + { + return _cur == other; + } + + bool operator!=(const BaseIterator& other) const + { + return _cur != other; + } + + protected: + BaseIterator _cur; + BaseIterator _end; + String _filter_name; + + void search_next() + { + while(_cur!=_end && **_cur!=_filter_name) + ++_cur; + } + }; + + const_iterator begin() + { + return _begin; + } + + const_iterator end() + { + return _end; + } + +protected: + const_iterator _begin; + const_iterator _end; +}; + + /// iterator for XML trees struct XMLPos { @@ -622,8 +810,8 @@ struct XMLPos } /// access to current node - operator XMLNode*() {return _cur;} operator const XMLNode*() const {return _cur;} + operator XMLNode*() {return _cur;} const XMLNode* operator->() const {return _cur;} XMLNode* operator->() {return _cur;} @@ -632,8 +820,8 @@ struct XMLPos XMLNode& operator*() {return *_cur;} /// attribute access - String& operator[](const String& attr_name) {return (*_cur)[attr_name];} template String get(const T& attr_name) const {return (*_cur)[attr_name];} + String& operator[](const String& attr_name) {return (*_cur)[attr_name];} /// insert children when building tree void add_down(XMLNode* child) @@ -680,8 +868,14 @@ struct XMLPos /// move X-Path like to position in XML tree bool go(const char* path); - /// create node if not already existing and move to it + /// create node and move to it void create(const String& name) + { + add_down(new XMLNode(name)); + } + + /// create node if not already existing and move to it + void smart_create(const String& name) { XMLNode* node = _cur->find_first(name); @@ -692,7 +886,7 @@ struct XMLPos } /// search matching child node identified by key name and an attribute value - void create(const String& name, const String& attr_name, const String& attr_value) + void smart_create(const String& name, const String& attr_name, const String& attr_value) { XMLNode* node = _cur->find_first(name, attr_name, attr_value); @@ -718,8 +912,14 @@ struct XMLPos return false; } - /// create node if not already existing and move to it + /// create node and move to it void create(const char* name) + { + add_down(new XMLNode(name)); + } + + /// create node if not already existing and move to it + void smart_create(const char* name) { XMLNode* node = _cur->find_first(name); @@ -731,7 +931,7 @@ struct XMLPos /// search matching child node identified by key name and an attribute value template - void create(const char* name, const T& attr_name, const U& attr_value) + void smart_create(const char* name, const T& attr_name, const U& attr_value) { XMLNode* node = _cur->find_first(name, attr_name, attr_value); @@ -759,6 +959,97 @@ protected: }; + /// iterator for XML trees +struct const_XMLPos +{ + const_XMLPos(const XMLNode* root) + : _root(root), + _cur(root) + { + } + + const_XMLPos(const const_XMLPos& other) + : _root(other._root), + _cur(other._cur) + { // don't copy _stack + } + + /// access to current node + operator const XMLNode*() const {return _cur;} + + const XMLNode* operator->() const {return _cur;} + + const XMLNode& operator*() const {return *_cur;} + + /// attribute access + template String get(const T& attr_name) const {return _cur->get(attr_name);} + + /// go back to previous position + bool back() + { + if (!_stack.empty()) { + _cur = _stack.top(); + _stack.pop(); + return true; + } else + return false; + } + + /// go down to first child + bool go_down() + { + const XMLNode* node = _cur->get_first_child(); + + if (node) { + go_to(node); + return true; + } else + return false; + } + + /// search for child and go down + bool go_down(const String& name) + { + XMLNode* node = _cur->find_first(name); + + if (node) { + go_to(node); + return true; + } else + return false; + } + + /// move X-Path like to position in XML tree + bool go(const char* path); + +#ifdef UNICODE + /// search for child and go down + bool go_down(const char* name) + { + XMLNode* node = _cur->find_first(name); + + if (node) { + go_to(node); + return true; + } else + return false; + } +#endif + +protected: + const XMLNode* _root; + const XMLNode* _cur; + std::stack _stack; + + /// go to specified node + void go_to(const XMLNode* child) + { + _stack.push(_cur); + _cur = child; + } +}; + + struct XMLBool { XMLBool(bool value) @@ -789,6 +1080,11 @@ struct XMLBool return _value; } + bool operator!() const + { + return !_value; + } + operator LPCTSTR() const { return _value? TEXT("TRUE"): TEXT("FALSE"); @@ -798,7 +1094,7 @@ protected: bool _value; private: - void operator=(const XMLBool&); // disallow assignment operations + void operator=(const XMLBool&); // disallow assignment operations }; struct XMLBoolRef @@ -815,6 +1111,11 @@ struct XMLBoolRef return !_tcsicmp(_ref, TEXT("TRUE")); } + bool operator!() const + { + return _tcsicmp(_ref, TEXT("TRUE"))? true: false; + } + XMLBoolRef& operator=(bool value) { assign(value); @@ -833,7 +1134,7 @@ struct XMLBoolRef } protected: - String& _ref; + String& _ref; }; @@ -875,10 +1176,10 @@ struct XMLNumber } protected: - int _value; + int _value; private: - void operator=(const XMLBool&); // disallow assignment operations + void operator=(const XMLBool&); // disallow assignment operations }; struct XMLNumberRef @@ -911,7 +1212,7 @@ struct XMLNumberRef } protected: - String& _ref; + String& _ref; }; @@ -931,7 +1232,7 @@ struct XMLReader XML_SetElementHandler(_parser, XML_StartElementHandler, XML_EndElementHandler); XML_SetDefaultHandler(_parser, XML_DefaultHandler); - _in_tag = false; + _in_node = false; } ~XMLReader() @@ -939,28 +1240,7 @@ struct XMLReader XML_ParserFree(_parser); } - XML_Status read(std::istream& in) - { - XML_Status status = XML_STATUS_OK; - - while(in.good() && status==XML_STATUS_OK) { - char* buffer = (char*) XML_GetBuffer(_parser, BUFFER_LEN); - - in.read(buffer, BUFFER_LEN); - - status = XML_ParseBuffer(_parser, in.gcount(), false); - } - - if (status != XML_STATUS_ERROR) - status = XML_ParseBuffer(_parser, 0, true); - - /* - if (status == XML_STATUS_ERROR) - cerr << path << get_error_string(); - */ - - return status; - } + XML_Status read(std::istream& in); std::string get_position() const { @@ -986,9 +1266,11 @@ struct XMLReader protected: XMLPos _pos; XML_Parser _parser; - std::string _xml_version; - std::string _encoding; - bool _in_tag; + std::string _xml_version; + std::string _encoding; + + std::string _content; + bool _in_node; static void XMLCALL XML_XmlDeclHandler(void* userData, const XML_Char* version, const XML_Char* encoding, int standalone); static void XMLCALL XML_StartElementHandler(void* userData, const XML_Char* name, const XML_Char** atts); @@ -997,6 +1279,29 @@ protected: }; +struct XMLHeader : public std::string +{ + XMLHeader(const std::string& xml_version="1.0", const std::string& encoding="UTF-8", const std::string& doctype="") + : _version(xml_version), + _encoding(encoding), + _doctype(doctype) + { + } + + void print(std::ostream& out) const + { + out << "\n"; + + if (!_doctype.empty()) + out << _doctype << '\n'; + } + + std::string _version; + std::string _encoding; + std::string _doctype; +}; + + struct XMLDoc : public XMLNode { XMLDoc() @@ -1004,7 +1309,7 @@ struct XMLDoc : public XMLNode { } - XMLDoc(const std::string& path) + XMLDoc(LPCTSTR path) : XMLNode("") { read(path); @@ -1012,23 +1317,33 @@ struct XMLDoc : public XMLNode std::istream& read(std::istream& in) { - XMLReader(this).read(in); + XMLReader reader(this); + /*XML_Status status = */reader.read(in); +/* + if (status == XML_STATUS_ERROR) + cerr << reader.get_error_string(); +*/ return in; } - bool read(const std::string& path) + bool read(LPCTSTR path) { - std::ifstream in(path.c_str()); + tifstream in(path); + XMLReader reader(this); - return XMLReader(this).read(in) != XML_STATUS_ERROR; + XML_Status status = reader.read(in); +/* + if (status == XML_STATUS_ERROR) + cerr << path << reader.get_error_string(); +*/ + return status != XML_STATUS_ERROR; } /// write XML stream preserving previous white space and comments - std::ostream& write(std::ostream& out, WRITE_MODE mode=FORMAT_SMART, - const std::string& xml_version="1.0", const std::string& encoding="UTF-8") const + std::ostream& write(std::ostream& out, WRITE_MODE mode=FORMAT_SMART, const XMLHeader& header=XMLHeader()) const { - out << "\n"; + header.print(out); if (!_children.empty()) _children.front()->write(out); @@ -1042,17 +1357,16 @@ struct XMLDoc : public XMLNode return write(out, FORMAT_PRETTY); } - void write(const std::string& path, WRITE_MODE mode=FORMAT_SMART, - const std::string& xml_version="1.0", const std::string& encoding="UTF-8") const + void write(LPCTSTR path, WRITE_MODE mode=FORMAT_SMART, const XMLHeader& header=XMLHeader()) const { - std::ofstream out(path.c_str()); + tofstream out(path); - write(out, mode, xml_version, encoding); + write(out, mode, header); } - void write_formating(const std::string& path) const + void write_formating(LPCTSTR path) const { - std::ofstream out(path.c_str()); + tofstream out(path); write_formating(out); } From 9af64d91894e56f276be245eb19d4fe468490504 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sun, 4 Apr 2004 16:40:05 +0000 Subject: [PATCH 0728/1463] Fix scanline increment for 32bpp stretch blts svn path=/trunk/; revision=8965 --- 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 c869bdf747d..a3ed08c273b 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.16 2004/04/01 19:31:05 gvg Exp $ */ +/* $Id: dib32bpp.c,v 1.17 2004/04/04 16:40:05 gvg Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -391,7 +391,7 @@ void ScaleRectAvg32(PIXEL *Target, PIXEL *Source, int SrcWidth, int SrcHeight, int TgtWidth, int TgtHeight, int srcPitch, int dstPitch) { int NumPixels = TgtHeight; - int IntPart = ((SrcHeight / TgtHeight) * srcPitch) >> 1; //(SrcHeight / TgtHeight) * SrcWidth; + int IntPart = ((SrcHeight / TgtHeight) * srcPitch) / 4; //(SrcHeight / TgtHeight) * SrcWidth; int FractPart = SrcHeight % TgtHeight; int Mid = TgtHeight >> 1; int E = 0; From b60d10254826f20107de8db11c6f31d9adb99f03 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sun, 4 Apr 2004 17:21:27 +0000 Subject: [PATCH 0729/1463] display bookmarks in sidebar svn path=/trunk/; revision=8966 --- reactos/subsys/system/explorer/explorer-jp.rc | 1 + reactos/subsys/system/explorer/explorer.h | 1 + .../subsys/system/explorer/explorer_intres.h | 1 + .../subsys/system/explorer/explorer_intres.rc | 6 +++ .../system/explorer/shell/mainframe.cpp | 47 +++++++++++++++---- .../subsys/system/explorer/shell/mainframe.h | 3 ++ .../system/explorer/taskbar/favorites.cpp | 32 +++++++++++++ .../system/explorer/taskbar/favorites.h | 2 + 8 files changed, 84 insertions(+), 9 deletions(-) diff --git a/reactos/subsys/system/explorer/explorer-jp.rc b/reactos/subsys/system/explorer/explorer-jp.rc index 203636628f7..32693228a93 100644 --- a/reactos/subsys/system/explorer/explorer-jp.rc +++ b/reactos/subsys/system/explorer/explorer-jp.rc @@ -145,6 +145,7 @@ BEGIN MENUITEM SEPARATOR MENUITEM "僣乕儖僶乕(&T)", ID_VIEW_TOOL_BAR, CHECKED MENUITEM "僪儔僀僽僶乕(&D)", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "&Side bar", ID_VIEW_SIDE_BAR MENUITEM "僗僥乕僞僗僶乕(&S)", ID_VIEW_STATUSBAR, CHECKED MENUITEM "慡夋柺昞\帵(&U)\tCtrl+Shift+S", ID_VIEW_FULLSCREEN MENUITEM SEPARATOR diff --git a/reactos/subsys/system/explorer/explorer.h b/reactos/subsys/system/explorer/explorer.h index f2343425eff..be9719bf3db 100644 --- a/reactos/subsys/system/explorer/explorer.h +++ b/reactos/subsys/system/explorer/explorer.h @@ -43,6 +43,7 @@ #define IDW_DRIVEBAR 0x103 #define IDW_ADDRESSBAR 0x104 #define IDW_COMMANDBAR 0x105 +#define IDW_SIDEBAR 0x106 #define IDW_FIRST_CHILD 0xC000 /*0x200*/ diff --git a/reactos/subsys/system/explorer/explorer_intres.h b/reactos/subsys/system/explorer/explorer_intres.h index 2c880508071..b37c6372527 100644 --- a/reactos/subsys/system/explorer/explorer_intres.h +++ b/reactos/subsys/system/explorer/explorer_intres.h @@ -112,6 +112,7 @@ #define ID_VIEW_DRIVE_BAR 507 #define ID_VIEW_TOOL_BAR 508 #define ID_VIEW_EXTRA_BAR 509 +#define ID_VIEW_SIDE_BAR 510 #define IDC_ROS_EXPLORER 1000 #define IDC_ICON_ALIGN_0 1002 #define IDC_ICON_ALIGN_1 1003 diff --git a/reactos/subsys/system/explorer/explorer_intres.rc b/reactos/subsys/system/explorer/explorer_intres.rc index c8f6f558139..5bc6adce71f 100644 --- a/reactos/subsys/system/explorer/explorer_intres.rc +++ b/reactos/subsys/system/explorer/explorer_intres.rc @@ -38,6 +38,7 @@ BEGIN MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR MENUITEM "&Drivebar", ID_VIEW_DRIVE_BAR, CHECKED MENUITEM "&Bara de stare", ID_VIEW_STATUSBAR + MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR MENUITEM SEPARATOR MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN END @@ -327,6 +328,7 @@ BEGIN MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR MENUITEM "Lauf&werkleiste", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR MENUITEM "&Status Bar", ID_VIEW_STATUSBAR MENUITEM SEPARATOR MENUITEM "&Vollbild\tCtrl+Shift+S", ID_VIEW_FULLSCREEN @@ -569,6 +571,7 @@ BEGIN MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR MENUITEM "&Drivebar", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR MENUITEM "&Status Bar", ID_VIEW_STATUSBAR MENUITEM SEPARATOR MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN @@ -668,6 +671,7 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR, CHECKED MENUITEM "&Drivebar", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR MENUITEM "&Status Bar", ID_VIEW_STATUSBAR, CHECKED MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN MENUITEM SEPARATOR @@ -993,6 +997,7 @@ BEGIN MENUITEM "Barre d'&outils", ID_VIEW_TOOL_BAR MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR MENUITEM "&Drivebar", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR MENUITEM "Barre d'&閠at", ID_VIEW_STATUSBAR MENUITEM SEPARATOR MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN @@ -1193,6 +1198,7 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Barra de Ferramentas", ID_VIEW_TOOL_BAR, CHECKED MENUITEM "Barra de Drives", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR MENUITEM "Barra de Estado", ID_VIEW_STATUSBAR, CHECKED MENUITEM "Ecr Cheio\tCtrl+Shift+S", ID_VIEW_FULLSCREEN MENUITEM SEPARATOR diff --git a/reactos/subsys/system/explorer/shell/mainframe.cpp b/reactos/subsys/system/explorer/shell/mainframe.cpp index 4dc4412edb3..0adce711475 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.cpp +++ b/reactos/subsys/system/explorer/shell/mainframe.cpp @@ -275,6 +275,14 @@ MainFrame::MainFrame(HWND hwnd) _hstatusbar = CreateStatusWindow(WS_CHILD|WS_VISIBLE, 0, hwnd, IDW_STATUSBAR); CheckMenuItem(_menu_info._hMenuView, ID_VIEW_STATUSBAR, MF_BYCOMMAND|MF_CHECKED); + + _hsidebar = CreateWindowEx(WS_EX_STATICEDGE, WC_TREEVIEW, TEXT("Sidebar"), + WS_CHILD|WS_TABSTOP|WS_BORDER|WS_VISIBLE|WS_CHILD|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|TVS_NOTOOLTIPS|TVS_SHOWSELALWAYS, + -1, -1, 200, 0, _hwnd, (HMENU)IDW_SIDEBAR, g_Globals._hInstance, 0); + + CheckMenuItem(_menu_info._hMenuView, ID_VIEW_SIDE_BAR, MF_BYCOMMAND|MF_CHECKED); + + FillBookmarks(); } @@ -602,6 +610,10 @@ int MainFrame::Command(int id, int code) toggle_child(_hwnd, id, _hstatusbar); break; + case ID_VIEW_SIDE_BAR: + toggle_child(_hwnd, id, _hsidebar); + break; + case ID_EXECUTE: { ExecuteDialog dlg = {{0}, 0}; @@ -761,27 +773,27 @@ void MainFrame::resize_frame_rect(PRECT prect) } else { if (IsWindowVisible(_htoolbar)) { SendMessage(_htoolbar, WM_SIZE, 0, 0); - ClientRect rt(_htoolbar); - prect->top = rt.bottom+3; - // prect->bottom -= rt.bottom+3; + WindowRect rt(_htoolbar); + prect->top = rt.bottom; + // prect->bottom -= rt.bottom; } if (IsWindowVisible(_hextrabar)) { SendMessage(_hextrabar, WM_SIZE, 0, 0); - ClientRect rt(_hextrabar); - int new_top = --prect->top + rt.bottom+3; + WindowRect rt(_hextrabar); + int new_top = --prect->top + rt.bottom; MoveWindow(_hextrabar, 0, prect->top, rt.right, new_top, TRUE); prect->top = new_top; - // prect->bottom -= rt.bottom+2; + // prect->bottom -= rt.bottom; } if (IsWindowVisible(_hdrivebar)) { SendMessage(_hdrivebar, WM_SIZE, 0, 0); - ClientRect rt(_hdrivebar); - int new_top = --prect->top + rt.bottom+3; + WindowRect rt(_hdrivebar); + int new_top = --prect->top + rt.bottom; MoveWindow(_hdrivebar, 0, prect->top, rt.right, new_top, TRUE); prect->top = new_top; - // prect->bottom -= rt.bottom+2; + // prect->bottom -= rt.bottom; } } @@ -803,6 +815,13 @@ void MainFrame::resize_frame_rect(PRECT prect) SetWindowPos(_hcommandedit, 0, mid+1, prect->bottom, prect->right-(mid+1), rt.bottom, SWP_NOACTIVATE|SWP_NOZORDER); } + if (IsWindowVisible(_hsidebar)) { + WindowRect rt(_hsidebar); + prect->left += rt.right-rt.left; + + SetWindowPos(_hsidebar, 0, -1, prect->top-1, rt.right-rt.left, prect->bottom-prect->top+1, SWP_NOACTIVATE|SWP_NOZORDER); + } + #ifndef _NO_MDI MoveWindow(_hmdiclient, prect->left-1, prect->top-1, prect->right-prect->left+2, prect->bottom-prect->top+1, TRUE); #endif @@ -986,4 +1005,14 @@ bool MainFrame::activate_child_window(LPCTSTR filesys) return false; } + +void MainFrame::FillBookmarks() +{ + HiddenWindow hide(_hsidebar); + + TreeView_DeleteAllItems(_hsidebar); + + g_Globals._favorites.fill_tree(_hsidebar, TVI_ROOT); +} + #endif diff --git a/reactos/subsys/system/explorer/shell/mainframe.h b/reactos/subsys/system/explorer/shell/mainframe.h index 11b3bd27bb5..2a951f8a743 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.h +++ b/reactos/subsys/system/explorer/shell/mainframe.h @@ -60,6 +60,7 @@ protected: WindowHandle _hdrivebar; WindowHandle _haddressedit; WindowHandle _hcommandedit; + WindowHandle _hsidebar; HMENU _hMenuFrame; HMENU _hMenuWindow; @@ -82,6 +83,8 @@ protected: BOOL toggle_fullscreen(); void fullscreen_move(); + void FillBookmarks(); + HACCEL _hAccel; TCHAR _drives[BUFFER_LEN]; }; diff --git a/reactos/subsys/system/explorer/taskbar/favorites.cpp b/reactos/subsys/system/explorer/taskbar/favorites.cpp index e4ab91fba18..c9c2612423c 100644 --- a/reactos/subsys/system/explorer/taskbar/favorites.cpp +++ b/reactos/subsys/system/explorer/taskbar/favorites.cpp @@ -178,6 +178,38 @@ void BookmarkList::write(XMLPos& pos) const } +void BookmarkList::fill_tree(HWND hwnd, HTREEITEM parent) const +{ + TV_INSERTSTRUCT tvi; + + tvi.hParent = parent; + tvi.hInsertAfter = TVI_LAST; + + TV_ITEM& tv = tvi.item; + tv.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE; + + for(const_iterator it=begin(); it!=end(); ++it) { + const BookmarkNode& node = *it; + + if (node._type == BookmarkNode::BMNT_FOLDER) { + const BookmarkFolder& folder = *node._pfolder; + + tv.pszText = (LPTSTR)folder._name.c_str(); + tv.iSelectedImage = tv.iImage = 0; + HTREEITEM hitem = TreeView_InsertItem(hwnd, &tvi); + + folder._bookmarks.fill_tree(hwnd, hitem); + } else { + const Bookmark& bookmark = *node._pbookmark; + + tv.pszText = (LPTSTR)bookmark._name.c_str(); + tv.iSelectedImage = tv.iImage = 0; + TreeView_InsertItem(hwnd, &tvi); + } + } +} + + void BookmarkList::import_IE_favorites(ShellDirectory& dir, HWND hwnd) { TCHAR path[MAX_PATH], ext[_MAX_EXT]; diff --git a/reactos/subsys/system/explorer/taskbar/favorites.h b/reactos/subsys/system/explorer/taskbar/favorites.h index 68c08ff4d62..0e8ee7848f8 100644 --- a/reactos/subsys/system/explorer/taskbar/favorites.h +++ b/reactos/subsys/system/explorer/taskbar/favorites.h @@ -67,6 +67,8 @@ struct BookmarkList : public list void read(const_XMLPos& pos); void write(XMLPos& pos) const; + + void fill_tree(HWND hwnd, HTREEITEM parent) const; }; struct BookmarkFolder From fad7ce3fb4e324e17ee3d5eb4f6a9f9874b76845 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sun, 4 Apr 2004 17:59:23 +0000 Subject: [PATCH 0730/1463] Hack to translate Ascii chars 128-255 to Unicode too svn path=/trunk/; revision=8967 --- reactos/lib/kernel32/misc/mbchars.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/kernel32/misc/mbchars.c b/reactos/lib/kernel32/misc/mbchars.c index 278d9a94e20..415abad9acf 100644 --- a/reactos/lib/kernel32/misc/mbchars.c +++ b/reactos/lib/kernel32/misc/mbchars.c @@ -1,4 +1,4 @@ -/* $Id: mbchars.c,v 1.4 2003/08/07 04:03:23 royce Exp $ +/* $Id: mbchars.c,v 1.5 2004/04/04 17:59:23 gvg Exp $ * */ #include @@ -141,7 +141,7 @@ MultiByteToWideChar( w++, cchConverted++) { - *w = (WCHAR)*r; + *w = (WCHAR)(unsigned char) *r; } /* * Return how many characters we From 199ffcb9bc42dba975213342f1184a2d1578da58 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sun, 4 Apr 2004 19:12:55 +0000 Subject: [PATCH 0731/1463] icons and tooltips for bookmarks svn path=/trunk/; revision=8968 --- .../subsys/system/explorer/doc/changes.txt | 7 +++++ .../system/explorer/shell/mainframe.cpp | 29 +++++++++++++++++-- .../subsys/system/explorer/shell/mainframe.h | 2 ++ .../system/explorer/shell/shellbrowser.cpp | 2 +- .../system/explorer/taskbar/favorites.cpp | 12 +++++--- .../system/explorer/taskbar/favorites.h | 2 +- .../subsys/system/explorer/utility/window.h | 2 +- 7 files changed, 47 insertions(+), 9 deletions(-) diff --git a/reactos/subsys/system/explorer/doc/changes.txt b/reactos/subsys/system/explorer/doc/changes.txt index 7715b521dce..634948856d1 100644 --- a/reactos/subsys/system/explorer/doc/changes.txt +++ b/reactos/subsys/system/explorer/doc/changes.txt @@ -68,3 +68,10 @@ If you search for more information, look into the CVS repository. 25.02.2004 m. fuchs rebar control for desktop bar 28.02.2004 m. fuchs "minimize all" functionality various fixes for notification icons, task bar and desktop switching +12.03.2004 m. fuchs automatic adjustment start button to text size +15.03.2004 m. fuchs implementation of volume control tray icon +20.03.2004 m. fuchs context menu for notification area +21.03.2004 m. fuchs configuration dialog for notification icons + XML storage for configuration options +28.03.2004 m. fuchs configuration options for showing/hiding clock, ... +04.04.2004 m. fuchs import of IE bookmarks; explorer sidebar with bookmark display diff --git a/reactos/subsys/system/explorer/shell/mainframe.cpp b/reactos/subsys/system/explorer/shell/mainframe.cpp index 0adce711475..00d72fb4657 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.cpp +++ b/reactos/subsys/system/explorer/shell/mainframe.cpp @@ -277,9 +277,12 @@ MainFrame::MainFrame(HWND hwnd) CheckMenuItem(_menu_info._hMenuView, ID_VIEW_STATUSBAR, MF_BYCOMMAND|MF_CHECKED); _hsidebar = CreateWindowEx(WS_EX_STATICEDGE, WC_TREEVIEW, TEXT("Sidebar"), - WS_CHILD|WS_TABSTOP|WS_BORDER|WS_VISIBLE|WS_CHILD|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|TVS_NOTOOLTIPS|TVS_SHOWSELALWAYS, + WS_CHILD|WS_TABSTOP|WS_BORDER|WS_VISIBLE|WS_CHILD|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|TVS_SHOWSELALWAYS|TVS_INFOTIP, -1, -1, 200, 0, _hwnd, (HMENU)IDW_SIDEBAR, g_Globals._hInstance, 0); + _himl = ImageList_LoadBitmap(g_Globals._hInstance, MAKEINTRESOURCE(IDB_IMAGES), 16, 0, RGB(0,255,0)); + TreeView_SetImageList(_hsidebar, _himl, TVSIL_NORMAL); + CheckMenuItem(_menu_info._hMenuView, ID_VIEW_SIDE_BAR, MF_BYCOMMAND|MF_CHECKED); FillBookmarks(); @@ -288,6 +291,8 @@ MainFrame::MainFrame(HWND hwnd) MainFrame::~MainFrame() { + ImageList_Destroy(_himl); + // don't exit desktop when closing file manager window if (!g_Globals._desktop_mode) PostQuitMessage(0); @@ -757,8 +762,25 @@ int MainFrame::Command(int id, int code) int MainFrame::Notify(int id, NMHDR* pnmh) { - if (pnmh->code == RBN_AUTOSIZE) + switch(pnmh->code) { + case RBN_AUTOSIZE: resize_frame_rect(ClientRect(_hwnd)); + break; + + case TVN_GETINFOTIP: { + NMTVGETINFOTIP* pnmgit = (NMTVGETINFOTIP*)pnmh; + const BookmarkNode& node = *(BookmarkNode*)pnmgit->lParam; + + if (node._type == BookmarkNode::BMNT_FOLDER) { + if (!node._pfolder->_description.empty()) + lstrcpyn(pnmgit->pszText, node._pfolder->_description.c_str(), pnmgit->cchTextMax); + } else // BookmarkNode::BMNT_BOOKMARK + if (!node._pbookmark->_description.empty()) + lstrcpyn(pnmgit->pszText, node._pbookmark->_description.c_str(), pnmgit->cchTextMax); + else + lstrcpyn(pnmgit->pszText, node._pbookmark->_url.c_str(), pnmgit->cchTextMax); + break;} + } return 0; } @@ -766,6 +788,9 @@ int MainFrame::Notify(int id, NMHDR* pnmh) void MainFrame::resize_frame_rect(PRECT prect) { + if (prect->bottom <= prect->top) + return; // avoid resizing children when receiving RBN_AUTOSIZE while getting minimized + if (_hwndrebar) { int height = ClientRect(_hwndrebar).bottom; MoveWindow(_hwndrebar, prect->left, prect->top, prect->right-prect->left, height, TRUE); diff --git a/reactos/subsys/system/explorer/shell/mainframe.h b/reactos/subsys/system/explorer/shell/mainframe.h index 2a951f8a743..e3b0085b614 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.h +++ b/reactos/subsys/system/explorer/shell/mainframe.h @@ -62,6 +62,8 @@ protected: WindowHandle _hcommandedit; WindowHandle _hsidebar; + HIMAGELIST _himl; + HMENU _hMenuFrame; HMENU _hMenuWindow; diff --git a/reactos/subsys/system/explorer/shell/shellbrowser.cpp b/reactos/subsys/system/explorer/shell/shellbrowser.cpp index 2537e7928f6..dbf08e0cc48 100644 --- a/reactos/subsys/system/explorer/shell/shellbrowser.cpp +++ b/reactos/subsys/system/explorer/shell/shellbrowser.cpp @@ -96,7 +96,7 @@ LRESULT ShellBrowserChild::Init(LPCREATESTRUCT pcs) // create explorer treeview if (_create_info._open_mode & OWM_EXPLORE) _left_hwnd = CreateWindowEx(0, WC_TREEVIEW, NULL, - WS_CHILD|WS_TABSTOP|WS_VISIBLE|WS_CHILD|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|TVS_NOTOOLTIPS|TVS_SHOWSELALWAYS, + WS_CHILD|WS_TABSTOP|WS_VISIBLE|WS_CHILD|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|TVS_SHOWSELALWAYS,//|TVS_NOTOOLTIPS 0, rect.top, _split_pos-SPLIT_WIDTH/2, rect.bottom-rect.top, _hwnd, (HMENU)IDC_FILETREE, g_Globals._hInstance, 0); diff --git a/reactos/subsys/system/explorer/taskbar/favorites.cpp b/reactos/subsys/system/explorer/taskbar/favorites.cpp index c9c2612423c..0fcbb0ee689 100644 --- a/reactos/subsys/system/explorer/taskbar/favorites.cpp +++ b/reactos/subsys/system/explorer/taskbar/favorites.cpp @@ -159,7 +159,7 @@ void BookmarkList::write(XMLPos& pos) const folder._bookmarks.write(pos); pos.back(); - } else { // node._type == BookmarkNode::BMNT_BOOKMARK + } else { // BookmarkNode::BMNT_BOOKMARK Bookmark& bookmark = *node._pbookmark; if (!bookmark._url.empty()) { @@ -186,16 +186,19 @@ void BookmarkList::fill_tree(HWND hwnd, HTREEITEM parent) const tvi.hInsertAfter = TVI_LAST; TV_ITEM& tv = tvi.item; - tv.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE; + tv.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_PARAM; for(const_iterator it=begin(); it!=end(); ++it) { const BookmarkNode& node = *it; + tv.lParam = (LPARAM)&node; + if (node._type == BookmarkNode::BMNT_FOLDER) { const BookmarkFolder& folder = *node._pfolder; tv.pszText = (LPTSTR)folder._name.c_str(); - tv.iSelectedImage = tv.iImage = 0; + tv.iImage = 3; + tv.iSelectedImage = 4; HTREEITEM hitem = TreeView_InsertItem(hwnd, &tvi); folder._bookmarks.fill_tree(hwnd, hitem); @@ -203,7 +206,8 @@ void BookmarkList::fill_tree(HWND hwnd, HTREEITEM parent) const const Bookmark& bookmark = *node._pbookmark; tv.pszText = (LPTSTR)bookmark._name.c_str(); - tv.iSelectedImage = tv.iImage = 0; + tv.iImage = 0; + tv.iSelectedImage = 1; TreeView_InsertItem(hwnd, &tvi); } } diff --git a/reactos/subsys/system/explorer/taskbar/favorites.h b/reactos/subsys/system/explorer/taskbar/favorites.h index 0e8ee7848f8..2143d75d626 100644 --- a/reactos/subsys/system/explorer/taskbar/favorites.h +++ b/reactos/subsys/system/explorer/taskbar/favorites.h @@ -31,8 +31,8 @@ struct Bookmark Bookmark() : _icon_idx(0) {} String _name; - String _url; String _description; + String _url; String _icon_path; int _icon_idx; diff --git a/reactos/subsys/system/explorer/utility/window.h b/reactos/subsys/system/explorer/utility/window.h index 5bd030bd531..82318b108fe 100644 --- a/reactos/subsys/system/explorer/utility/window.h +++ b/reactos/subsys/system/explorer/utility/window.h @@ -1017,7 +1017,7 @@ protected: }; if (tooltip) - _tcsncpy(nid.szTip, tooltip, COUNTOF(nid.szTip)); + lstrcpyn(nid.szTip, tooltip, COUNTOF(nid.szTip)); if (nid.szTip[0]) nid.uFlags |= NIF_TIP; From 9289b59c376e012dc6dc6c2e0528871edd8c092c Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sun, 4 Apr 2004 20:23:51 +0000 Subject: [PATCH 0732/1463] store icon information in metadata nodes svn path=/trunk/; revision=8969 --- .../system/explorer/shell/mainframe.cpp | 21 ++- .../system/explorer/taskbar/favorites.cpp | 156 ++++++++++++++---- .../system/explorer/taskbar/favorites.h | 8 +- .../system/explorer/utility/xmlstorage.h | 5 - 4 files changed, 143 insertions(+), 47 deletions(-) diff --git a/reactos/subsys/system/explorer/shell/mainframe.cpp b/reactos/subsys/system/explorer/shell/mainframe.cpp index 00d72fb4657..2fcf7b35a43 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.cpp +++ b/reactos/subsys/system/explorer/shell/mainframe.cpp @@ -772,13 +772,22 @@ int MainFrame::Notify(int id, NMHDR* pnmh) const BookmarkNode& node = *(BookmarkNode*)pnmgit->lParam; if (node._type == BookmarkNode::BMNT_FOLDER) { + // display tooltips for bookmark folders if (!node._pfolder->_description.empty()) lstrcpyn(pnmgit->pszText, node._pfolder->_description.c_str(), pnmgit->cchTextMax); - } else // BookmarkNode::BMNT_BOOKMARK - if (!node._pbookmark->_description.empty()) - lstrcpyn(pnmgit->pszText, node._pbookmark->_description.c_str(), pnmgit->cchTextMax); - else - lstrcpyn(pnmgit->pszText, node._pbookmark->_url.c_str(), pnmgit->cchTextMax); + } else { // BookmarkNode::BMNT_BOOKMARK + // display tooltips for bookmark folders + String txt = node._pbookmark->_description; + + if (!node._pbookmark->_url.empty()) { + if (!txt.empty()) + txt += TEXT(" - "); + + txt += node._pbookmark->_url; + } + + lstrcpyn(pnmgit->pszText, txt.c_str(), pnmgit->cchTextMax); + } break;} } @@ -1037,7 +1046,7 @@ void MainFrame::FillBookmarks() TreeView_DeleteAllItems(_hsidebar); - g_Globals._favorites.fill_tree(_hsidebar, TVI_ROOT); + g_Globals._favorites.fill_tree(_hsidebar, TVI_ROOT, _himl); } #endif diff --git a/reactos/subsys/system/explorer/taskbar/favorites.cpp b/reactos/subsys/system/explorer/taskbar/favorites.cpp index 0fcbb0ee689..e49eaffaa09 100644 --- a/reactos/subsys/system/explorer/taskbar/favorites.cpp +++ b/reactos/subsys/system/explorer/taskbar/favorites.cpp @@ -67,18 +67,113 @@ bool Bookmark::read_url(LPCTSTR path) } /// convert XBEL bookmark node -bool Bookmark::read_xbel(const_XMLPos& pos) +bool Bookmark::read(const_XMLPos& pos) { _url = pos.get("href"); - if (!pos.go_down("title")) - return false; + if (pos.go_down("title")) { + _name = pos->get_content(); + pos.back(); + } - _name = pos->get_content(); + if (pos.go_down("desc")) { + _description = pos->get_content(); + pos.back(); + } + + if (pos.go_down("info")) { + const_XMLChildrenFilter metadata(pos, "metadata"); + + for(const_XMLChildrenFilter::const_iterator it=metadata.begin(); it!=metadata.end(); ++it) { + const XMLNode& node = **it; + const_XMLPos sub_pos(&node); + + if (node.get("owner") == "ros-explorer") { + if (sub_pos.go_down("icon")) { + _icon_path = sub_pos.get("path"); + _icon_idx = _ttoi(sub_pos.get("index")); + + sub_pos.back(); // + } + } + } + + pos.back(); // + pos.back(); // + } + + return !_url.empty(); // _url is mandatory. +} + + /// write XBEL bookmark node +void Bookmark::write(XMLPos& pos) +{ + pos.create("bookmark"); + + pos["href"] = _url; + + if (!_name.empty()) { + pos.create("title"); + pos->set_content(_name); + pos.back(); + } + + if (!_description.empty()) { + pos.create("desc"); + pos->set_content(_description); + pos.back(); + } + + if (!_icon_path.empty()) { + pos.create("info"); + pos.create("metadata"); + pos["owner"] = "ros-explorer"; + pos.create("icon"); + pos["path"] = _icon_path; + pos["index"].printf(TEXT("%d"), _icon_idx); + pos.back(); // + pos.back(); // + pos.back(); // + } pos.back(); +} - return true; + + /// read bookmark folder from XBEL formated XML tree +void BookmarkFolder::read(const_XMLPos& pos) +{ + if (pos.go_down("title")) { + _name = pos->get_content(); + pos.back(); + } + + if (pos.go_down("desc")) { + _description = pos->get_content(); + pos.back(); + } + + _bookmarks.read(pos); +} + + /// write bookmark folder conten from XBEL formated XML tree +void BookmarkFolder::write(XMLPos& pos) +{ + pos.create("folder"); + + if (!_name.empty()) { + pos.create("title"); + pos->set_content(_name); + pos.back(); + } + + if (!_description.empty()) { + pos.create("desc"); + pos->set_content(_description); + pos.back(); + } + + _bookmarks.write(pos); } @@ -122,20 +217,15 @@ void BookmarkList::read(const_XMLPos& pos) const_XMLPos sub_pos(&node); if (node == "folder") { - BookmarkFolder new_folder; + BookmarkFolder folder; - if (sub_pos.go_down("title")) { - new_folder._name = sub_pos->get_content(); - sub_pos.back(); - } + folder.read(sub_pos); - new_folder._bookmarks.read(sub_pos); - - push_back(new_folder); + push_back(folder); } else if (node == "bookmark") { Bookmark bookmark; - if (bookmark.read_xbel(sub_pos)) + if (bookmark.read(sub_pos)) push_back(bookmark); } } @@ -150,36 +240,23 @@ void BookmarkList::write(XMLPos& pos) const if (node._type == BookmarkNode::BMNT_FOLDER) { BookmarkFolder& folder = *node._pfolder; - pos.create("folder"); - - pos.create("title"); - pos->set_content(folder._name); - pos.back(); - - folder._bookmarks.write(pos); + folder.write(pos); pos.back(); } else { // BookmarkNode::BMNT_BOOKMARK Bookmark& bookmark = *node._pbookmark; - if (!bookmark._url.empty()) { - pos.create("bookmark"); - - pos["href"] = bookmark._url; - - pos.create("title"); - pos->set_content(bookmark._name); - pos.back(); - - pos.back(); - } + if (!bookmark._url.empty()) + bookmark.write(pos); } } } -void BookmarkList::fill_tree(HWND hwnd, HTREEITEM parent) const +void BookmarkList::fill_tree(HWND hwnd, HTREEITEM parent, HIMAGELIST himagelist) const { + HDC hdc = GetDC(hwnd); + TV_INSERTSTRUCT tvi; tvi.hParent = parent; @@ -201,16 +278,27 @@ void BookmarkList::fill_tree(HWND hwnd, HTREEITEM parent) const tv.iSelectedImage = 4; HTREEITEM hitem = TreeView_InsertItem(hwnd, &tvi); - folder._bookmarks.fill_tree(hwnd, hitem); + folder._bookmarks.fill_tree(hwnd, hitem, himagelist); } else { const Bookmark& bookmark = *node._pbookmark; tv.pszText = (LPTSTR)bookmark._name.c_str(); tv.iImage = 0; tv.iSelectedImage = 1; + + if (!bookmark._icon_path.empty()) { + ///@todo retreive "http://.../favicon.ico" icons + const Icon& icon = g_Globals._icon_cache.extract(bookmark._icon_path, bookmark._icon_idx); + + if ((ICON_ID)icon != ICID_NONE) + tv.iImage = tv.iSelectedImage = ImageList_Add(himagelist, icon.create_bitmap(RGB(255,255,255), GetStockBrush(WHITE_BRUSH), hdc), 0); + } + TreeView_InsertItem(hwnd, &tvi); } } + + ReleaseDC(hwnd, hdc); } diff --git a/reactos/subsys/system/explorer/taskbar/favorites.h b/reactos/subsys/system/explorer/taskbar/favorites.h index 2143d75d626..f56194a0cb8 100644 --- a/reactos/subsys/system/explorer/taskbar/favorites.h +++ b/reactos/subsys/system/explorer/taskbar/favorites.h @@ -37,7 +37,8 @@ struct Bookmark int _icon_idx; bool read_url(LPCTSTR path); - bool read_xbel(const_XMLPos& pos); + bool read(const_XMLPos& pos); + void write(XMLPos& pos); }; struct BookmarkFolder; @@ -68,7 +69,7 @@ struct BookmarkList : public list void read(const_XMLPos& pos); void write(XMLPos& pos) const; - void fill_tree(HWND hwnd, HTREEITEM parent) const; + void fill_tree(HWND hwnd, HTREEITEM parent, HIMAGELIST) const; }; struct BookmarkFolder @@ -76,6 +77,9 @@ struct BookmarkFolder String _name; String _description; BookmarkList _bookmarks; + + void read(const_XMLPos& pos); + void write(XMLPos& pos); }; struct Favorites : public BookmarkList diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.h b/reactos/subsys/system/explorer/utility/xmlstorage.h index 06bfa3751f5..91c29d10d7a 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.h +++ b/reactos/subsys/system/explorer/utility/xmlstorage.h @@ -733,11 +733,6 @@ struct const_XMLChildrenFilter return *_cur; } - XMLNode* operator*() - { - return *_cur; - } - const_iterator& operator++() { ++_cur; From 0fd11b393ade74cfa60d9ddba0b78e9a63639033 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sun, 4 Apr 2004 21:05:32 +0000 Subject: [PATCH 0733/1463] add comments svn path=/trunk/; revision=8970 --- reactos/subsys/system/explorer/taskbar/favorites.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/system/explorer/taskbar/favorites.cpp b/reactos/subsys/system/explorer/taskbar/favorites.cpp index e49eaffaa09..71c4f207f69 100644 --- a/reactos/subsys/system/explorer/taskbar/favorites.cpp +++ b/reactos/subsys/system/explorer/taskbar/favorites.cpp @@ -253,6 +253,7 @@ void BookmarkList::write(XMLPos& pos) const } + /// fill treeview control with bookmark tree content void BookmarkList::fill_tree(HWND hwnd, HTREEITEM parent, HIMAGELIST himagelist) const { HDC hdc = GetDC(hwnd); @@ -302,6 +303,7 @@ void BookmarkList::fill_tree(HWND hwnd, HTREEITEM parent, HIMAGELIST himagelist) } + /// import Internet Explorer bookmarks from Favorites folder into bookmark list void BookmarkList::import_IE_favorites(ShellDirectory& dir, HWND hwnd) { TCHAR path[MAX_PATH], ext[_MAX_EXT]; @@ -309,7 +311,7 @@ void BookmarkList::import_IE_favorites(ShellDirectory& dir, HWND hwnd) dir.smart_scan(SCAN_FILESYSTEM); for(Entry*entry=dir._down; entry; entry=entry->_next) { - if (entry->_shell_attribs & SFGAO_HIDDEN) // hide files like "desktop.ini" + if (entry->_shell_attribs & SFGAO_HIDDEN) // ignore files like "desktop.ini" continue; String name; From 5f472ff726d6483a6b6430582c054ec56938f6e9 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sun, 4 Apr 2004 21:49:15 +0000 Subject: [PATCH 0734/1463] created stubs for devmgr.dll (based on lots of guesswork, trial&error and the very little resources on the www) svn path=/trunk/; revision=8971 --- reactos/lib/devmgr/.cvsignore | 8 + reactos/lib/devmgr/Makefile | 45 ++ reactos/lib/devmgr/devmgr.c | 55 ++ reactos/lib/devmgr/devmgr.def | 25 + reactos/lib/devmgr/devmgr.edf | 30 + reactos/lib/devmgr/devmgr.h | 155 +++++ reactos/lib/devmgr/devmgr.map.sbm | Bin 0 -> 39 bytes reactos/lib/devmgr/devmgr.rc | 42 ++ reactos/lib/devmgr/resource.h | 8 + reactos/lib/devmgr/resources/devmgr.ico | Bin 0 -> 8038 bytes reactos/lib/devmgr/stubs.c | 758 ++++++++++++++++++++++++ 11 files changed, 1126 insertions(+) create mode 100644 reactos/lib/devmgr/.cvsignore create mode 100644 reactos/lib/devmgr/Makefile create mode 100644 reactos/lib/devmgr/devmgr.c create mode 100644 reactos/lib/devmgr/devmgr.def create mode 100644 reactos/lib/devmgr/devmgr.edf create mode 100644 reactos/lib/devmgr/devmgr.h create mode 100644 reactos/lib/devmgr/devmgr.map.sbm create mode 100644 reactos/lib/devmgr/devmgr.rc create mode 100644 reactos/lib/devmgr/resource.h create mode 100644 reactos/lib/devmgr/resources/devmgr.ico create mode 100644 reactos/lib/devmgr/stubs.c diff --git a/reactos/lib/devmgr/.cvsignore b/reactos/lib/devmgr/.cvsignore new file mode 100644 index 00000000000..9103a525d39 --- /dev/null +++ b/reactos/lib/devmgr/.cvsignore @@ -0,0 +1,8 @@ +*.coff +*.dll +*.d +*.a +*.o +*.sym +*.map +*.tmp diff --git a/reactos/lib/devmgr/Makefile b/reactos/lib/devmgr/Makefile new file mode 100644 index 00000000000..0e66fd2705d --- /dev/null +++ b/reactos/lib/devmgr/Makefile @@ -0,0 +1,45 @@ +# $Id: Makefile,v 1.1 2004/04/04 21:49:15 weiden Exp $ + +PATH_TO_TOP = ../.. + +TARGET_TYPE = dynlink + +TARGET_NAME = devmgr + +TARGET_INSTALLDIR = system32 + +TARGET_BASE = 0x72A90000 + +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 = devmgr.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/devmgr/devmgr.c b/reactos/lib/devmgr/devmgr.c new file mode 100644 index 00000000000..a5c82ee8122 --- /dev/null +++ b/reactos/lib/devmgr/devmgr.c @@ -0,0 +1,55 @@ +/* + * 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: devmgr.c,v 1.1 2004/04/04 21:49:15 weiden Exp $ + * + * PROJECT: ReactOS devmgr.dll + * FILE: lib/devmgr/devmgr.c + * PURPOSE: ReactOS Device Manager + * PROGRAMMER: Thomas Weidenmueller (w3seek@users.sourceforge.net) + * UPDATE HISTORY: + * 04-04-2004 Created + */ +#include +#include "devmgr.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/devmgr/devmgr.def b/reactos/lib/devmgr/devmgr.def new file mode 100644 index 00000000000..3b5e0e8ab5f --- /dev/null +++ b/reactos/lib/devmgr/devmgr.def @@ -0,0 +1,25 @@ +LIBRARY devmgr.dll + +EXPORTS +DeviceProperties_RunDLLA@16 +DeviceProperties_RunDLLW@16 +DevicePropertiesA@20 +DevicePropertiesW@20 +DeviceManager_ExecuteA@16 +DeviceManager_ExecuteW@16 +DeviceProblemTextA@20 +DeviceProblemTextW@20 +DeviceProblemWizardA@12 +DeviceProblemWizardW@12 +DeviceManagerPrintA@20 +DeviceManagerPrintW@20 +DeviceAdvancedPropertiesA@12 +DeviceAdvancedPropertiesW@12 +DeviceCreateHardwarePage@8 +DeviceCreateHardwarePageEx@16 +DevicePropertiesExA@20 +DevicePropertiesExW@20 +DeviceProblemWizard_RunDLLA@16 +DeviceProblemWizard_RunDLLW@16 + +; EOF diff --git a/reactos/lib/devmgr/devmgr.edf b/reactos/lib/devmgr/devmgr.edf new file mode 100644 index 00000000000..9c394850e71 --- /dev/null +++ b/reactos/lib/devmgr/devmgr.edf @@ -0,0 +1,30 @@ +LIBRARY devmgr.dll + +EXPORTS +DeviceProperties_RunDLLA=DeviceProperties_RunDLLA@16 +DeviceProperties_RunDLLW=DeviceProperties_RunDLLW@16 +DevicePropertiesA=DevicePropertiesA@20 +DevicePropertiesW=DevicePropertiesW@20 +DeviceManager_ExecuteA=DeviceManager_ExecuteA@16 +DeviceManager_ExecuteW=DeviceManager_ExecuteW@16 +DeviceProblemTextA=DeviceProblemTextA@20 +DeviceProblemTextW=DeviceProblemTextW@20 +DeviceProblemWizardA=DeviceProblemWizardA@12 +DeviceProblemWizardW=DeviceProblemWizardW@12 +DeviceManagerPrintA=DeviceManagerPrintA@20 +DeviceManagerPrintW=DeviceManagerPrintW@20 +DeviceAdvancedPropertiesA=DeviceAdvancedPropertiesA@12 +DeviceAdvancedPropertiesW=DeviceAdvancedPropertiesW@12 +DeviceCreateHardwarePage=DeviceCreateHardwarePage@8 +DeviceCreateHardwarePageEx=DeviceCreateHardwarePageEx@16 +DevicePropertiesExA=DevicePropertiesExA@20 +DevicePropertiesExW=DevicePropertiesExW@20 +DeviceProblemWizard_RunDLLA=DeviceProblemWizard_RunDLLA@16 +DeviceProblemWizard_RunDLLW=DeviceProblemWizard_RunDLLW@16 + + +; Export these functions only for the sake of compatibility, they're obviously typos +DeviceProblenWizard_RunDLLA=DeviceProblemWizard_RunDLLA@16 +DeviceProblenWizard_RunDLLW=DeviceProblemWizard_RunDLLW@16 + +; EOF diff --git a/reactos/lib/devmgr/devmgr.h b/reactos/lib/devmgr/devmgr.h new file mode 100644 index 00000000000..8a27758e003 --- /dev/null +++ b/reactos/lib/devmgr/devmgr.h @@ -0,0 +1,155 @@ +#ifndef __DEVMGR_H +#define __DEVMGR_H + +HINSTANCE hDllInstance; + +WINBOOL +WINAPI +DeviceManager_ExecuteA(HWND hWndParent, + HINSTANCE hInst, + LPCSTR lpMachineName, + int nCmdShow); + +WINBOOL +WINAPI +DeviceManager_ExecuteW(HWND hWndParent, + HINSTANCE hInst, + LPCWSTR lpMachineName, + int nCmdShow); + +VOID +WINAPI +DeviceProperties_RunDLLA(HWND hWndParent, + HINSTANCE hInst, + LPCWSTR lpDeviceCmd, + int nCmdShow); + +VOID +WINAPI +DeviceProperties_RunDLLW(HWND hWndParent, + HINSTANCE hInst, + LPCSTR lpDeviceCmd, + int nCmdShow); + +int +WINAPI +DevicePropertiesA(HWND hWndParent, + HINSTANCE hInst, + LPCSTR lpMachineName, + LPCSTR lpDeviceID, + DWORD Unknown); + +int +WINAPI +DevicePropertiesW(HWND hWndParent, + HINSTANCE hInst, + LPCWSTR lpMachineName, + LPCWSTR lpDeviceID, + DWORD Unknown); + +UINT +WINAPI +DeviceProblemTextA(PVOID Unknown1, + PVOID Unknown2, + UINT uProblemId, + LPSTR lpString, + UINT uMaxString); + +UINT +WINAPI +DeviceProblemTextW(PVOID Unknown1, + PVOID Unknown2, + UINT uProblemId, + LPWSTR lpString, + UINT uMaxString); + +WINBOOL +WINAPI +DeviceProblemWizardA(HWND hWndParent, + LPCSTR lpMachineName, + LPCSTR lpDeviceID); + + +WINBOOL +WINAPI +DeviceProblemWizardW(HWND hWndParent, + LPCWSTR lpMachineName, + LPCWSTR lpDeviceID); + +VOID +WINAPI +DeviceProblemWizard_RunDLLA(HWND hWndParent, + HINSTANCE hInst, + LPCSTR lpDeviceCmd, + int nCmdShow); + +VOID +WINAPI +DeviceProblemWizard_RunDLLW(HWND hWndParent, + HINSTANCE hInst, + LPCWSTR lpDeviceCmd, + int nCmdShow); + +#define DEV_PRINT_ABSTRACT (0) +#define DEV_PRINT_SELECTED (1) +#define DEV_PRINT_ALL (2) + +WINBOOL +WINAPI +DeviceManagerPrintA(LPCSTR lpMachineName, + LPCSTR lpPrinter, + int nPrintMode, + UINT uNumberOfGuids, + LPGUID lpGuids); + +WINBOOL +WINAPI +DeviceManagerPrintW(LPCWSTR lpMachineName, + LPCWSTR lpPrinter, + int nPrintMode, + UINT uNumberOfGuids, + LPGUID lpGuids); + +int +WINAPI +DeviceAdvancedPropertiesA(HWND hWndParent, + LPCSTR lpMachineName, + LPCSTR lpDeviceID); + +int +WINAPI +DeviceAdvancedPropertiesW(HWND hWndParent, + LPCWSTR lpMachineName, + LPCWSTR lpDeviceID); + +HWND +WINAPI +DeviceCreateHardwarePage(HWND hWndParent, + LPGUID lpGuid); + +HWND +WINAPI +DeviceCreateHardwarePageEx(HWND hWndParent, + LPGUID lpGuids, + UINT uNumberOfGuids, + UINT Unknown); + +int +WINAPI +DevicePropertiesExA(HWND hWndParent, + HINSTANCE hInst, + LPCSTR lpMachineName, + LPCSTR lpDeviceID, + DWORD Unknown); + +int +WINAPI +DevicePropertiesExW(HWND hWndParent, + HINSTANCE hInst, + LPCWSTR lpMachineName, + LPCWSTR lpDeviceID, + DWORD Unknown); + +#endif /* __DEVMGR_H */ + +/* EOF */ diff --git a/reactos/lib/devmgr/devmgr.map.sbm b/reactos/lib/devmgr/devmgr.map.sbm new file mode 100644 index 0000000000000000000000000000000000000000..1e387d40eb94b2148bdabae15334c638dfa6b7f9 GIT binary patch literal 39 fcmWG`^3@G9G%{phVCZFJU?>A(4JaE%1Gx+UbKeAO literal 0 HcmV?d00001 diff --git a/reactos/lib/devmgr/devmgr.rc b/reactos/lib/devmgr/devmgr.rc new file mode 100644 index 00000000000..3380e6f844d --- /dev/null +++ b/reactos/lib/devmgr/devmgr.rc @@ -0,0 +1,42 @@ +#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 Device Manager\0" + VALUE "FileVersion", RES_STR_FILE_VERSION + VALUE "InternalName", "devmgr\0" + VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT + VALUE "OriginalFilename", "devmgr.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 + +IDI_DEVMGR ICON "resources/devmgr.ico" + + diff --git a/reactos/lib/devmgr/resource.h b/reactos/lib/devmgr/resource.h new file mode 100644 index 00000000000..89c5d02b7cf --- /dev/null +++ b/reactos/lib/devmgr/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/devmgr/resources/devmgr.ico b/reactos/lib/devmgr/resources/devmgr.ico new file mode 100644 index 0000000000000000000000000000000000000000..beb28a65a33482a867435d3cc444eace440daeae GIT binary patch literal 8038 zcmeHMd0f=T6(8glfn9N7murz@@c^nJiC3ZqQCl@JHJ*vu)C4ptVgy~hB3=!&Vr;5W zB#Eij1hp14pqvWGB`(ORD+qGmP>kR~qOafC15vQGY5HmZ$lKrielzc!dGmfV?>Ebs z4%1@}4h&Bt7HP!TG{%@fpl+|wXRIAKHC@ai2QfC^OiOoQEA$w9WX;$x$Up^~jKcM( z0JMHV$gx5u6bhN6qa*Y5^km-N-fZ5ydCb?>m&xUFwr$%s7VgPVJeh(&eR)A0PX(T& zs{7*U%M@TFlyER9P>4UlNGKs8A;5>TlP6EI#Kc6US9bOJs`G0hk}lBE28TO;9^zG*;D){>>nrLn<0$m68LjBcxlt zc5Ig%V<67Ec59b>{O`Nue2#hHQxq-cx){3x`ofcjEcXvx@*oR+HfCR!oZ}~gpFjT_ zfG|@*5ZlC9>%(o<0~niSd4Ro(e*7Rhzgd1TjMRmuG+YZ(=_Mi{jnr5=faf3Kl z3P%S6*PAEB^#Dunic;ac$1nB|@CjP$vo0`T@j9R1z8B~pusC4-vVe_vYzzqW@mmb) zYX5aU>p%`z{GPwx+Vz1x>v(J|M43IISkB|Y6VLZEy5uKr_wC zk<=bw2e7rZ)$c>smASjgWG*f)Qt;W?_NBYI~$khy~lfDU_UKXf~H09PQB zNnH$|*3Ufj+&JA%3I#H|K4c8gK*b<~38`LRIvDh&+=RQ#R`)4#k8|{m?ClI8tO1RS zv`zjrHt5|_F?e|B*}*0JvU7Hks$9t3Xsj{g;i0w*_lz7S!vOgR_|I6~4L-6FuES)* zh7WU*itN!h{O_0u?Q`p({L?a*UjC*OehkHEJR|l1b3m( zOemE0mUl1}at6&0(gG6~nN}Y5#b!bQu#n`s%|RAAx=0_}cQ6qQ(sBqu9wabvmDvqY z1(63rLu_gSo92+^z{#dkx1qh|P0$0Ca&ACiVrJqr+(Abp5Bnyn{tZzLg0q>J_Ua$> z^YIBqBC(}NH9nEh#C4=53Oq1=E1__(SR@fkxC6w4xeZ6Rp7F`t9R%=-gfrk0iMbBf z9yF&Ov_8 zQ-01R#5NHmvutS!p>m)EywarZg_9}U_u#cFVn^{OybPIE##Sn`jLURi>-9k9T zLIi}l4R5>HJ3FEOxSX81Jr`Yr9>54H&GG$!)K*(M&<;j7p0_;tJ*dgFc{2U~2|8LB zpaorBU44Ch+<$b3*Q{A{{`~pVr%#_aapL&#<42DkJ#yqoL`1~Fg9rET-@j+io}D{) z?%ut7?AWnC!UQH;sZ`=)sI9H7y1KfotgNW0C^t7ZJ3BiqEiEZ2DJCWc=3tb6N&ov` zV`EcaUl09v@80d|>biaVc57>EZEfw%n>UM#i?K^(WMrH=bqb@~w{M@Gp7!(Lxeb|` znnDls-@AA3{{8!R?%e6<=zxiunwrwm(!#>RoSdBK=;*k(xE(uoJh#>-7~y2-fAr|l z!-o&MySrhcuCA`Cs;aWG5+(`?3NBu}h*8X$Gv^7h=WYxiJ{%5#2{oYqa0uMq*w_es zNl6K2;9qh-hM(=uC1@CsjIGQsH(23sH`q6zojfKFHx2jT~p>4 zmE>K$itKOu_U--Zhf7;pTA=?{Ur=Tz7v?FhC=?hby4u%-v$L~WfAOhLGM3A7<>LysdtDEm zar2LFRvuhX^ZDYsBTMU!{HFHHCDn)DzO{c|Y1kXrc26(ZI!Up9Oy)|rj1?o5mtyk@ zis0CO^`rlYYV<$YmUr#w(P@;r>L_**GKh}RNBw_C0G#{5NKldvEFJ9d= zu5jDLq8(nvyQY-vno_*et1x&{{+0>38(z-#ACLny#VW%mb*fE z;zH}#*@BqYh02t(%CZXR?{_(MaB#rF0{uA=!O`9W;^vBy-nNB!s*g+hieVY6MrN*d z&-8Q0J^h0bX}+?Q-#VfX@e3reZw`*0ZWKLjAoQ13R7OTdK1+W?Lj&|@ezy7K1a@|Y zY0PY4+&rt~rBe6`Ix|+eWv=EI*Y6{{u+#z6Z)cfBO*1+*N$2zwgVMB^it1XtH2rRx zQmItEp``sO==h85)MVXrbB3h8FUwlQ?3i%j#j645>5lM^fqNWf0 zW<2}r6oax$v6ZzA&(e>>AT00bf9k#sU%$)}7FlQe{{pVQx@mj?pWoLovzTJsQ7`yt zBIX@b%noMZ+tSb^<{aj5$GxQ?`=o>#cAyKdP7xo66f71*zh&e6T`fBmcDaw%P zH}=dd`{Z@?g*q_6gNi7EiS*^JvA-U2^U}Hc=2omH$Tj-v$0-(;cl7_#XPeS}93fcv z(Zp-Jy-WAZEdLa**xah{1=ZmTaYr2(;6VkCV#CXbr8FPcip==NmiA}q$A*r*5Bf6> zf0Vs?Si#m;xbm=>xAxDeiC9$s=cSFumNgw;hCAxO01qm7^0&T{vu<>jpGRF@YUllK z_@{5@fx%{hjTQQn!q#T3a4OzD@kZ#hicjCDJv_hZ=+d^6J{^Bsc{_R)?x+I;JgDF) z4t_OngJ;@%PEGk~5a$Q={XviZ*su*T?+(8jGP`)+{2PasRD9)A6Y19w71$EHvGx3B z+))Pxc;%rbMf>Jo{rHWnE#A>fMm82@LqFEH{?s#(NQ5K`4DGG04Yk!R4Ye(eb*;FX z>iN~&(5Agm2L{w;Tn)9&^)-#P)%7*i_wV0>__O>2qkH%61;c*=ot>Qv7xLrWeqrFi zfp5L_R$yS@x<2sXvtg|k{QdnWO`6ni@b_!(Cqe#yod-Fn$MmnWSzWxtTa1j1PNPIV zRZfHE_b;3?dclGP-FbO=g#V-nc^qL`CM1g#78XXMMveLo^8YNe8^3w;<{x+@AvY(U zA|f*&q|B6%kU+?R?m?b^f;|gN$BY?soy&6I>&}fEH;Av#_+lX}MHvw6XA^xw-BcuU zEqu+z#{u!Z8y_AtVZwweaJ}>d=i|m;gjW#u|IhRd41N!ErlqANA#1|lc)o73HlTMJ2%#NV$75UEA?06$HIV*(+s~ zFx!X}dsk3gQVJOx8~4adtgRKzEv=NbeF4S4HJGqVQ`Q;}%K7jG!gfbUHYj?Ln$C05knizheiUCIygBqU{2eP}M#A9;srKVL)@pU$RhyS(V~DjAg?-9o7u z*@SuQv2O+W+S)qG*|(BPLT6Idk@u+OZy!=e{3dFTl~esUE9vIJcSy1MRl0RLjPfzh z2EF9r%T#2j)P1*;zH4u$&W={9 qzdfp_PMdyb%G7BcUQ?!`c=s*dQ#)Ssn$n5byaAbUT>d{j5BUd7D*nF! literal 0 HcmV?d00001 diff --git a/reactos/lib/devmgr/stubs.c b/reactos/lib/devmgr/stubs.c new file mode 100644 index 00000000000..1be4f61e99a --- /dev/null +++ b/reactos/lib/devmgr/stubs.c @@ -0,0 +1,758 @@ +/* $Id: stubs.c,v 1.1 2004/04/04 21:49:15 weiden Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS msgina.dll + * FILE: lib/devmgr/stubs.c + * PURPOSE: devmgr.dll stubs + * PROGRAMMER: Thomas Weidenmueller (w3seek@users.sourceforge.net) + * NOTES: If you implement a function, remove it from this file + * + * Some helpful resources: + * http://support.microsoft.com/default.aspx?scid=kb;%5BLN%5D;815320 + * http://www.jsiinc.com/SUBO/tip7400/rh7482.htm + * http://www.jsiinc.com/SUBM/tip6400/rh6490.htm + * + * UPDATE HISTORY: + * 04-04-2004 Created + */ +#include +#include "devmgr.h" + +#define UNIMPLEMENTED \ + DbgPrint("DEVMGR: %s at %s:%d is UNIMPLEMENTED!\n",__FUNCTION__,__FILE__,__LINE__) + + +/*************************************************************************** + * NAME EXPORTED + * DeviceManager_ExecuteA + * + * DESCRIPTION + * Starts the Device Manager + * + * ARGUMENTS + * hWndParent: Handle to the parent window + * hInst: Handle to the application instance + * lpMachineName: Machine Name, NULL is the local machine + * nCmdShow: Specifies how the window should be shown + * + * RETURN VALUE + * TRUE: if no errors occured + * FALSE: if the device manager could not be executed + * + * REVISIONS + * + * NOTE + * - Win runs the device manager in a separate process, so hWndParent is somehow + * obsolete. + * + * @unimplemented + */ +WINBOOL +WINAPI +DeviceManager_ExecuteA(HWND hWndParent, + HINSTANCE hInst, + LPCSTR lpMachineName, + int nCmdShow) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/*************************************************************************** + * NAME EXPORTED + * DeviceManager_ExecuteW + * + * DESCRIPTION + * Starts the Device Manager + * + * ARGUMENTS + * hWndParent: Handle to the parent window + * hInst: Handle to the application instance + * lpMachineName: Machine Name, NULL is the local machine + * nCmdShow: Specifies how the window should be shown + * + * RETURN VALUE + * TRUE: if no errors occured + * FALSE: if the device manager could not be executed + * + * REVISIONS + * + * NOTE + * - Win runs the device manager in a separate process, so hWndParent is somehow + * obsolete. + * + * @unimplemented + */ +WINBOOL +WINAPI +DeviceManager_ExecuteW(HWND hWndParent, + HINSTANCE hInst, + LPCWSTR lpMachineName, + int nCmdShow) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/*************************************************************************** + * NAME EXPORTED + * DeviceProperties_RunDLLA + * + * DESCRIPTION + * Invokes the device properties dialog + * + * ARGUMENTS + * hWndParent: Handle to the parent window + * hInst: Handle to the application instance + * lpDeviceCmd: A command that includes the DeviceID of the properties to be shown, + * also see NOTEs + * nCmdShow: Specifies how the window should be shown + * + * RETURN VALUE + * + * REVISIONS + * + * NOTE + * - lpDeviceCmd is a string in the form of "/MachineName MACHINE /DeviceID DEVICEPATH" + * (/MachineName is optional). This function only parses this string and eventually + * calls DeviceProperties(). + * + * @unimplemented + */ +VOID +WINAPI +DeviceProperties_RunDLLA(HWND hWndParent, + HINSTANCE hInst, + LPCWSTR lpDeviceCmd, + int nCmdShow) +{ + UNIMPLEMENTED; +} + + +/*************************************************************************** + * NAME EXPORTED + * DeviceProperties_RunDLLW + * + * DESCRIPTION + * Invokes the device properties dialog + * + * ARGUMENTS + * hWndParent: Handle to the parent window + * hInst: Handle to the application instance + * lpDeviceCmd: A command that includes the DeviceID of the properties to be shown, + * also see NOTEs + * nCmdShow: Specifies how the window should be shown + * + * RETURN VALUE + * + * REVISIONS + * + * NOTE + * - lpDeviceCmd is a string in the form of "/MachineName MACHINE /DeviceID DEVICEPATH" + * (/MachineName is optional). This function only parses this string and eventually + * calls DeviceProperties(). + * + * @unimplemented + */ +VOID +WINAPI +DeviceProperties_RunDLLW(HWND hWndParent, + HINSTANCE hInst, + LPCSTR lpDeviceCmd, + int nCmdShow) +{ + UNIMPLEMENTED; +} + + +/*************************************************************************** + * NAME EXPORTED + * DevicePropertiesA + * + * DESCRIPTION + * Invokes the device properties dialog directly + * + * ARGUMENTS + * hWndParent: Handle to the parent window + * hInst: Handle to the application instance + * lpMachineName: Machine Name, NULL is the local machine + * lpDeviceID: Specifies the device whose properties are to be shown + * Unknown: Unknown parameter, see NOTEs + * + * RETURN VALUE + * >=0: if no errors occured + * -1: if errors occured + * + * REVISIONS + * + * NOTE + * Unknown seems to be a BOOL, not sure what it does + * + * @unimplemented + */ +int +WINAPI +DevicePropertiesA(HWND hWndParent, + HINSTANCE hInst, + LPCSTR lpMachineName, + LPCSTR lpDeviceID, + DWORD Unknown) +{ + UNIMPLEMENTED; + return -1; +} + + +/*************************************************************************** + * NAME EXPORTED + * DevicePropertiesW + * + * DESCRIPTION + * Invokes the device properties dialog directly + * + * ARGUMENTS + * hWndParent: Handle to the parent window + * hInst: Handle to the application instance + * lpMachineName: Machine Name, NULL is the local machine + * lpDeviceID: Specifies the device whose properties are to be shown + * Unknown: Unknown parameter, see NOTEs + * + * RETURN VALUE + * >=0: if no errors occured + * -1: if errors occured + * + * REVISIONS + * + * NOTE + * Unknown seems to be a BOOL, not sure what it does + * + * @unimplemented + */ +int +WINAPI +DevicePropertiesW(HWND hWndParent, + HINSTANCE hInst, + LPCWSTR lpMachineName, + LPCWSTR lpDeviceID, + DWORD Unknown) +{ + UNIMPLEMENTED; + return -1; +} + + +/*************************************************************************** + * NAME EXPORTED + * DeviceProblemTextW + * + * DESCRIPTION + * Gets the problem text from a problem number displayed in the properties dialog + * + * ARGUMENTS + * Unknown1: Unknown parameter + * Unknown2: Unknown parameter + * uProblemId: Specifies the problem ID + * lpString: Pointer to a buffer where the string is to be copied to + * uMaxString: Size of the buffer + * + * RETURN VALUE + * The return value is the number of bytes copied into the string buffer. + * It returns 0 if an error occured. + * + * REVISIONS + * + * NOTE + * + * @unimplemented + */ +UINT +WINAPI +DeviceProblemTextA(PVOID Unknown1, + PVOID Unknown2, + UINT uProblemId, + LPSTR lpString, + UINT uMaxString) +{ + UNIMPLEMENTED; + return 0; +} + + +/*************************************************************************** + * NAME EXPORTED + * DeviceProblemTextW + * + * DESCRIPTION + * Gets the problem text from a problem number displayed in the properties dialog + * + * ARGUMENTS + * Unknown1: Unknown parameter + * Unknown2: Unknown parameter + * uProblemId: Specifies the problem ID + * lpString: Pointer to a buffer where the string is to be copied to + * uMaxString: Size of the buffer + * + * RETURN VALUE + * The return value is the number of bytes copied into the string buffer. + * It returns 0 if an error occured. + * + * REVISIONS + * + * NOTE + * + * @unimplemented + */ +UINT +WINAPI +DeviceProblemTextW(PVOID Unknown1, + PVOID Unknown2, + UINT uProblemId, + LPWSTR lpString, + UINT uMaxString) +{ + UNIMPLEMENTED; + return 0; +} + + +/*************************************************************************** + * NAME EXPORTED + * DeviceProblemWizardA + * + * DESCRIPTION + * Calls the device problem wizard + * + * ARGUMENTS + * hWndParent: Handle to the parent window + * lpMachineName: Machine Name, NULL is the local machine + * lpDeviceID: Specifies the device, also see NOTEs + * + * RETURN VALUE + * TRUE: if no errors occured + * FALSE: if errors occured + * + * REVISIONS + * + * NOTE + * + * @unimplemented + */ +WINBOOL +WINAPI +DeviceProblemWizardA(HWND hWndParent, + LPCSTR lpMachineName, + LPCSTR lpDeviceID) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/*************************************************************************** + * NAME EXPORTED + * DeviceProblemWizardW + * + * DESCRIPTION + * Calls the device problem wizard + * + * ARGUMENTS + * hWndParent: Handle to the parent window + * lpMachineName: Machine Name, NULL is the local machine + * lpDeviceID: Specifies the device, also see NOTEs + * + * RETURN VALUE + * TRUE: if no errors occured + * FALSE: if errors occured + * + * REVISIONS + * + * NOTE + * + * @unimplemented + */ +WINBOOL +WINAPI +DeviceProblemWizardW(HWND hWndParent, + LPCWSTR lpMachineName, + LPCWSTR lpDeviceID) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/*************************************************************************** + * NAME EXPORTED + * DeviceProblemWizard_RunDLLA + * + * DESCRIPTION + * Calls the device problem wizard + * + * ARGUMENTS + * hWndParent: Handle to the parent window + * hInst: Handle to the application instance + * lpDeviceCmd: A command that includes the DeviceID of the properties to be shown, + * also see NOTEs + * nCmdShow: Specifies how the window should be shown + * + * RETURN VALUE + * + * REVISIONS + * + * NOTE + * - Win XP exports this function as DeviceProblenWizard_RunDLLA, apparently it's + * a typo so we additionally export an alias function + * - lpDeviceCmd is a string in the form of "/MachineName MACHINE /DeviceID DEVICEPATH" + * (/MachineName is optional). This function only parses this string and eventually + * calls DeviceProperties(). + * + * @unimplemented + */ +VOID +WINAPI +DeviceProblemWizard_RunDLLA(HWND hWndParent, + HINSTANCE hInst, + LPCSTR lpDeviceCmd, + int nCmdShow) +{ + UNIMPLEMENTED; +} + + +/*************************************************************************** + * NAME EXPORTED + * DeviceProblemWizard_RunDLLW + * + * DESCRIPTION + * Calls the device problem wizard + * + * ARGUMENTS + * hWndParent: Handle to the parent window + * hInst: Handle to the application instance + * lpDeviceCmd: A command that includes the DeviceID of the properties to be shown, + * also see NOTEs + * nCmdShow: Specifies how the window should be shown + * + * RETURN VALUE + * + * REVISIONS + * + * NOTE + * - Win XP exports this function as DeviceProblenWizard_RunDLLA, apparently it's + * a typo so we additionally export an alias function + * - lpDeviceCmd is a string in the form of "/MachineName MACHINE /DeviceID DEVICEPATH" + * (/MachineName is optional). This function only parses this string and eventually + * calls DeviceProperties(). + * + * @unimplemented + */ +VOID +WINAPI +DeviceProblemWizard_RunDLLW(HWND hWndParent, + HINSTANCE hInst, + LPCWSTR lpDeviceCmd, + int nCmdShow) +{ + UNIMPLEMENTED; +} + + +/*************************************************************************** + * NAME EXPORTED + * DeviceManagerPrintA + * + * DESCRIPTION + * Calls the device problem wizard + * + * ARGUMENTS + * lpMachineName: Machine Name, NULL is the local machine + * lpPrinter: Filename of the printer where it should be printed on + * nPrintMode: Specifies what kind of information is to be printed + * DEV_PRINT_ABSTRACT: Prints an abstract of system information, the parameters + * uNumberOfGuids, Guids are ignored + * DEV_PRINT_SELECTED: Prints information about the devices listed in Guids + * DEV_PRINT_ALL: Prints an abstract of system information and all + * system devices + * uNumberOfGuids: Numbers of guids in the Guids array, this parameter is ignored unless + * nPrintMode is DEV_PRINT_SELECTED + * lpGuids: Array of device guids, this parameter is ignored unless + * nPrintMode is DEV_PRINT_SELECTED + * + * RETURN VALUE + * TRUE: if no errors occured + * FALSE: if errors occured + * + * REVISIONS + * + * NOTE + * + * @unimplemented + */ +WINBOOL +WINAPI +DeviceManagerPrintA(LPCSTR lpMachineName, + LPCSTR lpPrinter, + int nPrintMode, + UINT uNumberOfGuids, + LPGUID lpGuids) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/*************************************************************************** + * NAME EXPORTED + * DeviceManagerPrintW + * + * DESCRIPTION + * Calls the device problem wizard + * + * ARGUMENTS + * lpMachineName: Machine Name, NULL is the local machine + * lpPrinter: Filename of the printer where it should be printed on + * nPrintMode: Specifies what kind of information is to be printed + * DEV_PRINT_ABSTRACT: Prints an abstract of system information, the parameters + * uNumberOfGuids, Guids are ignored + * DEV_PRINT_SELECTED: Prints information about the devices listed in Guids + * DEV_PRINT_ALL: Prints an abstract of system information and all + * system devices + * uNumberOfGuids: Numbers of guids in the Guids array, this parameter is ignored unless + * nPrintMode is DEV_PRINT_SELECTED + * lpGuids: Array of device guids, this parameter is ignored unless + * nPrintMode is DEV_PRINT_SELECTED + * + * RETURN VALUE + * TRUE: if no errors occured + * FALSE: if errors occured + * + * REVISIONS + * + * NOTE + * + * @unimplemented + */ +WINBOOL +WINAPI +DeviceManagerPrintW(LPCWSTR lpMachineName, + LPCWSTR lpPrinter, + int nPrintMode, + UINT uNumberOfGuids, + LPGUID lpGuids) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/*************************************************************************** + * NAME EXPORTED + * DeviceAdvancedPropertiesA + * + * DESCRIPTION + * Invokes the device properties dialog, this version may add some property pages + * for some devices + * + * ARGUMENTS + * hWndParent: Handle to the parent window + * lpMachineName: Machine Name, NULL is the local machine + * lpDeviceID: Specifies the device whose properties are to be shown + * + * RETURN VALUE + * -1: if errors occured + * + * REVISIONS + * + * NOTE + * + * @unimplemented + */ +int +WINAPI +DeviceAdvancedPropertiesA(HWND hWndParent, + LPCSTR lpMachineName, + LPCSTR lpDeviceID) +{ + UNIMPLEMENTED; + return -1; +} + + +/*************************************************************************** + * NAME EXPORTED + * DeviceAdvancedPropertiesW + * + * DESCRIPTION + * Invokes the device properties dialog, this version may add some property pages + * for some devices + * + * ARGUMENTS + * hWndParent: Handle to the parent window + * lpMachineName: Machine Name, NULL is the local machine + * lpDeviceID: Specifies the device whose properties are to be shown + * + * RETURN VALUE + * -1: if errors occured + * + * REVISIONS + * + * NOTE + * + * @unimplemented + */ +int +WINAPI +DeviceAdvancedPropertiesW(HWND hWndParent, + LPCWSTR lpMachineName, + LPCWSTR lpDeviceID) +{ + UNIMPLEMENTED; + return -1; +} + + +/*************************************************************************** + * NAME EXPORTED + * DeviceCreateHardwarePage + * + * DESCRIPTION + * Creates a hardware page + * + * ARGUMENTS + * hWndParent: Handle to the parent window + * lpGuid: Guid of the device + * + * RETURN VALUE + * Returns the handle of the hardware page window that has been created or + * NULL if it failed. + * + * REVISIONS + * + * NOTE + * + * @unimplemented + */ +HWND +WINAPI +DeviceCreateHardwarePage(HWND hWndParent, + LPGUID lpGuid) +{ + UNIMPLEMENTED; + return NULL; +} + + +/*************************************************************************** + * NAME EXPORTED + * DeviceCreateHardwarePageEx + * + * DESCRIPTION + * Creates a hardware page + * + * ARGUMENTS + * hWndParent: Handle to the parent window + * lpGuids: An array of guids of devices that are to be listed + * uNumberOfGuids: Numbers of guids in the Guids array + * Unknown: Unknown parameter, see NOTEs + * + * RETURN VALUE + * Returns the handle of the hardware page window that has been created or + * NULL if it failed. + * + * REVISIONS + * + * NOTE + * uUnknown seems to be some kind of flag how the entries should be displayed, + * in Win it seems to be always 0x00000001 + * + * @unimplemented + */ +HWND +WINAPI +DeviceCreateHardwarePageEx(HWND hWndParent, + LPGUID lpGuids, + UINT uNumberOfGuids, + UINT Unknown) +{ + UNIMPLEMENTED; + return NULL; +} + + +/*************************************************************************** + * NAME EXPORTED + * DevicePropertiesExA + * + * DESCRIPTION + * Invokes the extended device properties dialog + * + * ARGUMENTS + * hWndParent: Handle to the parent window + * hInst: Handle to the application instance + * lpMachineName: Machine Name, NULL is the local machine + * lpDeviceID: Specifies the device whose properties are to be shown + * Unknown: Unknown parameter, see NOTEs + * + * RETURN VALUE + * >=0: if no errors occured + * -1: if errors occured + * + * REVISIONS + * + * NOTE + * Unknown seems to be a BOOL, not sure what it affects + * + * @unimplemented + */ +int +WINAPI +DevicePropertiesExA(HWND hWndParent, + HINSTANCE hInst, + LPCSTR lpMachineName, + LPCSTR lpDeviceID, + DWORD Unknown) +{ + UNIMPLEMENTED; + return -1; +} + + +/*************************************************************************** + * NAME EXPORTED + * DevicePropertiesExW + * + * DESCRIPTION + * Invokes the extended device properties dialog + * + * ARGUMENTS + * hWndParent: Handle to the parent window + * hInst: Handle to the application instance + * lpMachineName: Machine Name, NULL is the local machine + * lpDeviceID: Specifies the device whose properties are to be shown + * Unknown: Unknown parameter, see NOTEs + * + * RETURN VALUE + * >=0: if no errors occured + * -1: if errors occured + * + * REVISIONS + * + * NOTE + * Unknown seems to be a BOOL, not sure what it affects + * + * @unimplemented + */ +int +WINAPI +DevicePropertiesExW(HWND hWndParent, + HINSTANCE hInst, + LPCWSTR lpMachineName, + LPCWSTR lpDeviceID, + DWORD Unknown) +{ + UNIMPLEMENTED; + return -1; +} From 987fbb6dc12ec346f4da970eb4fbe9be91fadb06 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sun, 4 Apr 2004 21:55:56 +0000 Subject: [PATCH 0735/1463] accidently committed a temporary file, sorry svn path=/trunk/; revision=8972 --- reactos/lib/devmgr/devmgr.map.sbm | Bin 39 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 reactos/lib/devmgr/devmgr.map.sbm diff --git a/reactos/lib/devmgr/devmgr.map.sbm b/reactos/lib/devmgr/devmgr.map.sbm deleted file mode 100644 index 1e387d40eb94b2148bdabae15334c638dfa6b7f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39 fcmWG`^3@G9G%{phVCZFJU?>A(4JaE%1Gx+UbKeAO From 26a52566a6339339deacbb1475a86841b6258936 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sun, 4 Apr 2004 23:13:11 +0000 Subject: [PATCH 0736/1463] fix imagelist loading svn path=/trunk/; revision=8973 --- reactos/subsys/system/explorer/desktop/desktop.cpp | 4 +++- reactos/subsys/system/explorer/shell/mainframe.cpp | 3 ++- reactos/subsys/system/explorer/taskbar/desktopbar.cpp | 4 +++- reactos/subsys/system/explorer/taskbar/favorites.cpp | 10 +++------- reactos/subsys/system/explorer/taskbar/favorites.h | 2 +- 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/reactos/subsys/system/explorer/desktop/desktop.cpp b/reactos/subsys/system/explorer/desktop/desktop.cpp index fa7cf78c0ad..848b645188e 100644 --- a/reactos/subsys/system/explorer/desktop/desktop.cpp +++ b/reactos/subsys/system/explorer/desktop/desktop.cpp @@ -275,7 +275,9 @@ LRESULT BackgroundWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) return TRUE; case WM_MBUTTONDBLCLK: - explorer_show_frame(SW_SHOWNORMAL); + /* Imagelist icons are missing if MainFrame::Create() is called directly from here! + explorer_show_frame(SW_SHOWNORMAL); */ + PostMessage(g_Globals._hwndDesktop, nmsg, wparam, lparam); break; case PM_DISPLAY_VERSION: diff --git a/reactos/subsys/system/explorer/shell/mainframe.cpp b/reactos/subsys/system/explorer/shell/mainframe.cpp index 2fcf7b35a43..8147b7b6693 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.cpp +++ b/reactos/subsys/system/explorer/shell/mainframe.cpp @@ -1046,7 +1046,8 @@ void MainFrame::FillBookmarks() TreeView_DeleteAllItems(_hsidebar); - g_Globals._favorites.fill_tree(_hsidebar, TVI_ROOT, _himl); + WindowCanvas canvas(_hwnd); + g_Globals._favorites.fill_tree(_hsidebar, TVI_ROOT, _himl, canvas); } #endif diff --git a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp index 59e003a25b4..c5806b90646 100644 --- a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp @@ -173,7 +173,9 @@ void DesktopBar::RegisterHotkeys() void DesktopBar::ProcessHotKey(int id_hotkey) { switch(id_hotkey) { - case 0: explorer_show_frame(SW_SHOWNORMAL); break; + case 0: explorer_show_frame(SW_SHOWNORMAL); + break; + ///@todo implement all common hotkeys } } diff --git a/reactos/subsys/system/explorer/taskbar/favorites.cpp b/reactos/subsys/system/explorer/taskbar/favorites.cpp index 71c4f207f69..7244a2b28c1 100644 --- a/reactos/subsys/system/explorer/taskbar/favorites.cpp +++ b/reactos/subsys/system/explorer/taskbar/favorites.cpp @@ -254,10 +254,8 @@ void BookmarkList::write(XMLPos& pos) const /// fill treeview control with bookmark tree content -void BookmarkList::fill_tree(HWND hwnd, HTREEITEM parent, HIMAGELIST himagelist) const +void BookmarkList::fill_tree(HWND hwnd, HTREEITEM parent, HIMAGELIST himagelist, HDC hdc_wnd) const { - HDC hdc = GetDC(hwnd); - TV_INSERTSTRUCT tvi; tvi.hParent = parent; @@ -279,7 +277,7 @@ void BookmarkList::fill_tree(HWND hwnd, HTREEITEM parent, HIMAGELIST himagelist) tv.iSelectedImage = 4; HTREEITEM hitem = TreeView_InsertItem(hwnd, &tvi); - folder._bookmarks.fill_tree(hwnd, hitem, himagelist); + folder._bookmarks.fill_tree(hwnd, hitem, himagelist, hdc_wnd); } else { const Bookmark& bookmark = *node._pbookmark; @@ -292,14 +290,12 @@ void BookmarkList::fill_tree(HWND hwnd, HTREEITEM parent, HIMAGELIST himagelist) const Icon& icon = g_Globals._icon_cache.extract(bookmark._icon_path, bookmark._icon_idx); if ((ICON_ID)icon != ICID_NONE) - tv.iImage = tv.iSelectedImage = ImageList_Add(himagelist, icon.create_bitmap(RGB(255,255,255), GetStockBrush(WHITE_BRUSH), hdc), 0); + tv.iImage = tv.iSelectedImage = ImageList_Add(himagelist, icon.create_bitmap(RGB(255,255,255), GetStockBrush(WHITE_BRUSH), hdc_wnd), 0); } TreeView_InsertItem(hwnd, &tvi); } } - - ReleaseDC(hwnd, hdc); } diff --git a/reactos/subsys/system/explorer/taskbar/favorites.h b/reactos/subsys/system/explorer/taskbar/favorites.h index f56194a0cb8..ee56af7d9a4 100644 --- a/reactos/subsys/system/explorer/taskbar/favorites.h +++ b/reactos/subsys/system/explorer/taskbar/favorites.h @@ -69,7 +69,7 @@ struct BookmarkList : public list void read(const_XMLPos& pos); void write(XMLPos& pos) const; - void fill_tree(HWND hwnd, HTREEITEM parent, HIMAGELIST) const; + void fill_tree(HWND hwnd, HTREEITEM parent, HIMAGELIST, HDC hdc_wnd) const; }; struct BookmarkFolder From 7838aa4dc879d3d1e72b8efc78043ec62eda5e39 Mon Sep 17 00:00:00 2001 From: Richard Campbell Date: Mon, 5 Apr 2004 09:16:49 +0000 Subject: [PATCH 0737/1463] reverted change svn path=/trunk/; revision=8974 --- reactos/lib/comctl32/progress.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/reactos/lib/comctl32/progress.c b/reactos/lib/comctl32/progress.c index 2bfcde9d278..9de349dfad7 100644 --- a/reactos/lib/comctl32/progress.c +++ b/reactos/lib/comctl32/progress.c @@ -121,16 +121,15 @@ static LRESULT PROGRESS_Draw (PROGRESS_INFO *infoPtr, HDC hdc) else hbrBar = CreateSolidBrush (infoPtr->ColorBar); - /* Draw the border */ + if (infoPtr->ColorBk == CLR_DEFAULT) + hbrBk = GetSysColorBrush(COLOR_3DFACE); + else + hbrBk = CreateSolidBrush(infoPtr->ColorBk); + + /* get client rectangle */ GetClientRect (infoPtr->Self, &rect); - SelectObject( hdc, CreateSolidBrush( RGB(96, 96, 96) ) ); - PatBlt( hdc, rect.left, rect.top, rect.right - rect.left, 1, PATCOPY ); - PatBlt( hdc, rect.left, rect.top, 1, rect.bottom - rect.top, PATCOPY ); - - SelectObject( hdc, CreateSolidBrush(RGB(255,255,255) )); - PatBlt( hdc, rect.left, rect.bottom-1, rect.right - rect.left, 1, PATCOPY ); - PatBlt( hdc, rect.right-1, rect.top, 1, rect.bottom - rect.top, PATCOPY ); - InflateRect(&rect, -2, -2); + FrameRect( hdc, &rect, hbrBk ); + InflateRect(&rect, -1, -1); /* get the window style */ dwStyle = GetWindowLongW (infoPtr->Self, GWL_STYLE); @@ -152,7 +151,7 @@ static LRESULT PROGRESS_Draw (PROGRESS_INFO *infoPtr, HDC hdc) rightMost = rect.right; } - + /* now draw the bar */ if (dwStyle & PBS_SMOOTH) { if (dwStyle & PBS_VERTICAL) From c78a2cfb83d5d9da228e1478bd31af07a942a007 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 5 Apr 2004 12:00:11 +0000 Subject: [PATCH 0738/1463] Implement 'Edit DWORD' dialog. svn path=/trunk/; revision=8975 --- reactos/subsys/system/regedit/En.rc | 17 ++ reactos/subsys/system/regedit/edit.c | 292 +++++++++++++++++++---- reactos/subsys/system/regedit/resource.h | 4 + 3 files changed, 272 insertions(+), 41 deletions(-) diff --git a/reactos/subsys/system/regedit/En.rc b/reactos/subsys/system/regedit/En.rc index 96e52f0cf7c..8617b4a0a83 100644 --- a/reactos/subsys/system/regedit/En.rc +++ b/reactos/subsys/system/regedit/En.rc @@ -143,6 +143,23 @@ BEGIN 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 "Edit DWORD" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Value &name:",IDC_STATIC,6,6,134,8 + EDITTEXT IDC_VALUE_NAME,6,17,240,12,ES_AUTOHSCROLL | ES_READONLY + LTEXT "&Value data:",IDC_STATIC,6,35,161,8 + EDITTEXT IDC_VALUE_DATA,6,46,116,12,ES_AUTOHSCROLL + GROUPBOX "Base",IDC_STATIC,130,35,116,39 + AUTORADIOBUTTON "&Hexadecimal",IDC_FORMAT_HEX,141,46,60,10,WS_GROUP + AUTORADIOBUTTON "&Decimal",IDC_FORMAT_DEC,141,59,60,10 + DEFPUSHBUTTON "OK",IDOK,142,82,50,14 + PUSHBUTTON "Cancel",IDCANCEL,196,82,50,14 +END + /* * String Table */ diff --git a/reactos/subsys/system/regedit/edit.c b/reactos/subsys/system/regedit/edit.c index f11c150f554..7523f59773c 100644 --- a/reactos/subsys/system/regedit/edit.c +++ b/reactos/subsys/system/regedit/edit.c @@ -28,13 +28,25 @@ #include #include #include +#include #include "main.h" #include "regproc.h" #include "resource.h" + +typedef enum _EDIT_MODE +{ + EDIT_MODE_DEC, + EDIT_MODE_HEX +} EDIT_MODE; + + static const TCHAR* editValueName; static TCHAR* stringValueData; +static DWORD dwordValueData; +static EDIT_MODE dwordEditMode = EDIT_MODE_HEX; + void error(HWND hwnd, INT resId, ...) { @@ -79,30 +91,35 @@ INT_PTR CALLBACK modify_string_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, L SetFocus(GetDlgItem(hwndDlg, IDC_VALUE_DATA)); return FALSE; case WM_COMMAND: - switch (LOWORD(wParam)) { + switch (LOWORD(wParam)) + { case IDOK: - if ((hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA))) { - if ((len = GetWindowTextLength(hwndValue))) { - if(stringValueData) + if ((hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA))) + { + if ((len = GetWindowTextLength(hwndValue))) + { + if (stringValueData) { - if ((valueData = HeapReAlloc(GetProcessHeap(), 0, stringValueData, (len + 1) * sizeof(TCHAR)))) { - stringValueData = valueData; - if (!GetWindowText(hwndValue, stringValueData, len + 1)) - *stringValueData = 0; - } + if ((valueData = HeapReAlloc(GetProcessHeap(), 0, stringValueData, (len + 1) * sizeof(TCHAR)))) + { + stringValueData = valueData; + if (!GetWindowText(hwndValue, stringValueData, len + 1)) + *stringValueData = 0; + } } else { - if ((valueData = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(TCHAR)))) { - stringValueData = valueData; - if (!GetWindowText(hwndValue, stringValueData, len + 1)) - *stringValueData = 0; - } + if ((valueData = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(TCHAR)))) + { + stringValueData = valueData; + if (!GetWindowText(hwndValue, stringValueData, len + 1)) + *stringValueData = 0; + } } } else { - if(stringValueData) + if (stringValueData) *stringValueData = 0; } } @@ -116,6 +133,173 @@ INT_PTR CALLBACK modify_string_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, L return FALSE; } + +LRESULT CALLBACK DwordEditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + WNDPROC oldwndproc; + + oldwndproc = (WNDPROC)GetWindowLong(hwnd, GWL_USERDATA); + + switch (uMsg) + { + case WM_CHAR: + if (dwordEditMode == EDIT_MODE_DEC) + { + if (isdigit(wParam & 0xff)) + { + break; + } + else + { + return 0; + } + } + else if (dwordEditMode == EDIT_MODE_HEX) + { + if (isxdigit(wParam & 0xff)) + { + break; + } + else + { + return 0; + } + } + else + { + break; + } + } + + return CallWindowProc(oldwndproc, hwnd, uMsg, wParam, lParam); +} + + +INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + WNDPROC oldproc; + TCHAR* valueData; + HWND hwndValue; + int len; + TCHAR ValueString[32]; + LPTSTR Remainder; + DWORD Base; + DWORD Value; + + switch(uMsg) { + case WM_INITDIALOG: + dwordEditMode = EDIT_MODE_HEX; + + /* subclass the edit control */ + hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA); + oldproc = (WNDPROC)GetWindowLong(hwndValue, GWL_WNDPROC); + SetWindowLong(hwndValue, GWL_USERDATA, (LONG)oldproc); + SetWindowLong(hwndValue, GWL_WNDPROC, (LONG)DwordEditSubclassProc); + + if(editValueName && strcmp(editValueName, _T(""))) + { + SetDlgItemText(hwndDlg, IDC_VALUE_NAME, editValueName); + } + else + { + SetDlgItemText(hwndDlg, IDC_VALUE_NAME, _T("(Default)")); + } + CheckRadioButton (hwndDlg, IDC_FORMAT_HEX, IDC_FORMAT_DEC, IDC_FORMAT_HEX); + sprintf (ValueString, "%lx", dwordValueData); + SetDlgItemText(hwndDlg, IDC_VALUE_DATA, ValueString); + SetFocus(GetDlgItem(hwndDlg, IDC_VALUE_DATA)); + return FALSE; + + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDC_FORMAT_HEX: + if (HIWORD(wParam) == BN_CLICKED && dwordEditMode == EDIT_MODE_DEC) + { + dwordEditMode = EDIT_MODE_HEX; + if ((hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA))) + { + if ((len = GetWindowTextLength(hwndValue))) + { + if (!GetWindowText(hwndValue, ValueString, 32)) + { + Value = 0; + } + else + { + Value = strtoul (ValueString, &Remainder, 10); + } + } + else + { + Value = 0; + } + } + sprintf (ValueString, "%lx", Value); + SetDlgItemText(hwndDlg, IDC_VALUE_DATA, ValueString); + return TRUE; + } + break; + + case IDC_FORMAT_DEC: + if (HIWORD(wParam) == BN_CLICKED && dwordEditMode == EDIT_MODE_HEX) + { + dwordEditMode = EDIT_MODE_DEC; + if ((hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA))) + { + if ((len = GetWindowTextLength(hwndValue))) + { + if (!GetWindowText(hwndValue, ValueString, 32)) + { + Value = 0; + } + else + { + Value = strtoul (ValueString, &Remainder, 16); + } + } + else + { + Value = 0; + } + } + sprintf (ValueString, "%lu", Value); + SetDlgItemText(hwndDlg, IDC_VALUE_DATA, ValueString); + return TRUE; + } + break; + + case IDOK: + if ((hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA))) + { + if ((len = GetWindowTextLength(hwndValue))) + { + if (!GetWindowText(hwndValue, ValueString, 32)) + { + EndDialog(hwndDlg, IDCANCEL); + return TRUE; + } + + Base = (dwordEditMode == EDIT_MODE_HEX) ? 16 : 10; + dwordValueData = strtoul (ValueString, &Remainder, Base); + } + else + { + EndDialog(hwndDlg, IDCANCEL); + return TRUE; + } + } + EndDialog(hwndDlg, IDOK); + return TRUE; + + case IDCANCEL: + EndDialog(hwndDlg, IDCANCEL); + return TRUE; + } + } + return FALSE; +} + BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName) { DWORD valueDataLen; @@ -123,59 +307,85 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName) LONG lRet; BOOL result = FALSE; - if (!hKey) return FALSE; + if (!hKey) + return FALSE; editValueName = valueName; lRet = RegQueryValueEx(hKey, valueName, 0, &type, 0, &valueDataLen); - if(lRet != ERROR_SUCCESS && (!strcmp(valueName, _T("")) || valueName == NULL)) + if (lRet != ERROR_SUCCESS && (!_tcscmp(valueName, _T("")) || valueName == NULL)) { lRet = ERROR_SUCCESS; /* Allow editing of (Default) values which don't exist */ type = REG_SZ; valueDataLen = 0; stringValueData = NULL; } - - if (lRet != ERROR_SUCCESS) { + + if (lRet != ERROR_SUCCESS) + { error(hwnd, IDS_BAD_VALUE, valueName); goto done; } - if ( (type == REG_SZ) || (type == REG_EXPAND_SZ) ) { - if(valueDataLen > 0) + if ((type == REG_SZ) || (type == REG_EXPAND_SZ)) + { + if (valueDataLen > 0) { - if (!(stringValueData = HeapAlloc(GetProcessHeap(), 0, valueDataLen))) { - error(hwnd, IDS_TOO_BIG_VALUE, valueDataLen); - goto done; - } - lRet = RegQueryValueEx(hKey, valueName, 0, 0, stringValueData, &valueDataLen); - if (lRet != ERROR_SUCCESS) { - error(hwnd, IDS_BAD_VALUE, valueName); - goto done; - } + if (!(stringValueData = HeapAlloc(GetProcessHeap(), 0, valueDataLen))) + { + error(hwnd, IDS_TOO_BIG_VALUE, valueDataLen); + goto done; + } + lRet = RegQueryValueEx(hKey, valueName, 0, 0, stringValueData, &valueDataLen); + if (lRet != ERROR_SUCCESS) + { + error(hwnd, IDS_BAD_VALUE, valueName); + goto done; + } } else { - stringValueData = NULL; + stringValueData = NULL; } - if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_STRING), hwnd, modify_string_dlgproc) == IDOK) { - if(stringValueData) + + if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_STRING), hwnd, modify_string_dlgproc) == IDOK) + { + if (stringValueData) { - lRet = RegSetValueEx(hKey, valueName, 0, type, stringValueData, lstrlen(stringValueData) + 1); + lRet = RegSetValueEx(hKey, valueName, 0, type, stringValueData, lstrlen(stringValueData) + 1); } else - lRet = RegSetValueEx(hKey, valueName, 0, type, NULL, 0); - if (lRet == ERROR_SUCCESS) result = TRUE; + { + lRet = RegSetValueEx(hKey, valueName, 0, type, NULL, 0); + } + if (lRet == ERROR_SUCCESS) + result = TRUE; } - } else if ( type == REG_DWORD ) { - MessageBox(hwnd, "Can't edit dwords for now", "Error", MB_OK | MB_ICONERROR); - } else { + } + else if (type == REG_DWORD) + { + lRet = RegQueryValueEx(hKey, valueName, 0, 0, (LPBYTE)&dwordValueData, &valueDataLen); + if (lRet != ERROR_SUCCESS) + { + error(hwnd, IDS_BAD_VALUE, valueName); + goto done; + } + + if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_DWORD), hwnd, modify_dword_dlgproc) == IDOK) + { + lRet = RegSetValueEx(hKey, valueName, 0, type, (LPBYTE)&dwordValueData, sizeof(DWORD)); + if (lRet == ERROR_SUCCESS) + result = TRUE; + } + } + else + { error(hwnd, IDS_UNSUPPORTED_TYPE, type); } done: - if(stringValueData) - HeapFree(GetProcessHeap(), 0, stringValueData); + if (stringValueData) + HeapFree(GetProcessHeap(), 0, stringValueData); stringValueData = NULL; return result; diff --git a/reactos/subsys/system/regedit/resource.h b/reactos/subsys/system/regedit/resource.h index 5c161df3013..cccd1129d79 100644 --- a/reactos/subsys/system/regedit/resource.h +++ b/reactos/subsys/system/regedit/resource.h @@ -114,4 +114,8 @@ #define IDC_VALUE_NAME 2001 #define IDC_VALUE_DATA 2002 +#define IDD_EDIT_DWORD 2003 +#define IDC_FORMAT_HEX 2004 +#define IDC_FORMAT_DEC 2005 + #define IDC_STATIC -1 From 0c33860003efd4b582d1cff934c6250d27b902fd Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 5 Apr 2004 14:42:30 +0000 Subject: [PATCH 0739/1463] Fixed a crash caused by requesting a large number of extra class space svn path=/trunk/; revision=8976 --- reactos/subsys/win32k/ntuser/class.c | 40 ++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/class.c b/reactos/subsys/win32k/ntuser/class.c index 4420c6ded7a..e4d07315693 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.49 2004/03/09 21:21:39 dwelch Exp $ +/* $Id: class.c,v 1.50 2004/04/05 14:42:30 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -39,6 +39,7 @@ #include #include #include +#include #define NDEBUG #include @@ -273,7 +274,7 @@ IntCreateClass(CONST WNDCLASSEXW *lpwcx, RTL_ATOM Atom) { PWNDCLASS_OBJECT ClassObject; - WORD objectSize; + ULONG objectSize; NTSTATUS Status; /* Check for double registration of the class. */ @@ -343,7 +344,7 @@ IntCreateClass(CONST WNDCLASSEXW *lpwcx, if (ClassObject->cbClsExtra != 0) { ClassObject->ExtraData = (PCHAR)(ClassObject + 1); - RtlZeroMemory(ClassObject->ExtraData, ClassObject->cbClsExtra); + RtlZeroMemory(ClassObject->ExtraData, (ULONG)ClassObject->cbClsExtra); } else { @@ -373,10 +374,32 @@ NtUserRegisterClassExWOW( * Atom identifying the new class */ { + WNDCLASSEXW SafeClass; PWINSTATION_OBJECT WinStaObject; PWNDCLASS_OBJECT ClassObject; NTSTATUS Status; RTL_ATOM Atom; + + if(!lpwcx) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return (RTL_ATOM)0; + } + + Status = MmCopyFromCaller(&SafeClass, lpwcx, sizeof(WNDCLASSEXW)); + if (!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return (RTL_ATOM)0; + } + + /* Deny negative sizes */ + if(lpwcx->cbClsExtra < 0 || lpwcx->cbWndExtra < 0) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return (RTL_ATOM)0; + } + DPRINT("About to open window station handle (0x%X)\n", PROCESS_WINDOW_STATION()); Status = IntValidateWindowStationHandle(PROCESS_WINDOW_STATION(), @@ -389,10 +412,11 @@ NtUserRegisterClassExWOW( PROCESS_WINDOW_STATION()); return((RTL_ATOM)0); } - if (!IS_ATOM(lpwcx->lpszClassName)) + if (!IS_ATOM(SafeClass.lpszClassName)) { + /* FIXME - Safely copy/verify the buffer first!!! */ Status = RtlAddAtomToAtomTable(WinStaObject->AtomTable, - (LPWSTR)lpwcx->lpszClassName, + (LPWSTR)SafeClass.lpszClassName, &Atom); if (!NT_SUCCESS(Status)) { @@ -405,12 +429,12 @@ NtUserRegisterClassExWOW( } else { - Atom = (RTL_ATOM)(ULONG)lpwcx->lpszClassName; + Atom = (RTL_ATOM)(ULONG)SafeClass.lpszClassName; } - ClassObject = IntCreateClass(lpwcx, bUnicodeClass, wpExtra, Atom); + ClassObject = IntCreateClass(&SafeClass, bUnicodeClass, wpExtra, Atom); if (ClassObject == NULL) { - if (!IS_ATOM(lpwcx->lpszClassName)) + if (!IS_ATOM(SafeClass.lpszClassName)) { RtlDeleteAtomFromAtomTable(WinStaObject->AtomTable, Atom); } From c89da9713978ca858b1c564e469fa04af07b282d Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Mon, 5 Apr 2004 19:54:11 +0000 Subject: [PATCH 0740/1463] - Get the WS_EX_STATICEDGE style working. - Remove a WS_EX_STATICEDGE hack from Explorer. svn path=/trunk/; revision=8977 --- reactos/lib/user32/windows/nonclient.c | 24 +++++++++++++++++-- .../system/explorer/taskbar/traynotify.cpp | 14 ----------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/reactos/lib/user32/windows/nonclient.c b/reactos/lib/user32/windows/nonclient.c index 6ee6d0de02b..0cfdbeb0d63 100644 --- a/reactos/lib/user32/windows/nonclient.c +++ b/reactos/lib/user32/windows/nonclient.c @@ -314,7 +314,19 @@ DefWndNCPaint(HWND hWnd, HRGN hRgn) } else if (ExStyle & WS_EX_STATICEDGE) { +#if 0 DrawEdge(hDC, &CurrentRect, BDR_SUNKENINNER, BF_RECT | BF_ADJUST | BF_FLAT); +#else + SelectObject(hDC, GetSysColorBrush(COLOR_BTNSHADOW)); + PatBlt(hDC, CurrentRect.left, CurrentRect.top, CurrentRect.right - CurrentRect.left, 1, PATCOPY); + PatBlt(hDC, CurrentRect.left, CurrentRect.top, 1, CurrentRect.bottom - CurrentRect.top, PATCOPY); + + SelectObject(hDC, GetSysColorBrush(COLOR_BTNHIGHLIGHT)); + PatBlt(hDC, CurrentRect.left, CurrentRect.bottom - 1, CurrentRect.right - CurrentRect.left, 1, PATCOPY); + PatBlt(hDC, CurrentRect.right - 1, CurrentRect.top, 1, CurrentRect.bottom - CurrentRect.top, PATCOPY); + + InflateRect(&CurrentRect, -1, -1); +#endif } /* Firstly the "thick" frame */ @@ -508,8 +520,16 @@ DefWndNCCalcSize(HWND hWnd, BOOL CalcSizeStruct, RECT *Rect) { HMENU menu = GetMenu(hWnd); - UserGetWindowBorders(Style, ExStyle, &WindowBorders, FALSE); - InflateRect(Rect, -WindowBorders.cx, -WindowBorders.cy); + if (UserHasWindowEdge(Style, ExStyle)) + { + UserGetWindowBorders(Style, ExStyle, &WindowBorders, FALSE); + InflateRect(Rect, -WindowBorders.cx, -WindowBorders.cy); + } else + if (ExStyle & WS_EX_STATICEDGE) + { + InflateRect(Rect, -1, -1); + } + if ((Style & WS_CAPTION) == WS_CAPTION) { if (ExStyle & WS_EX_TOOLWINDOW) diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index d19a1fcec94..a97ddcd2ccd 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -328,15 +328,9 @@ HWND NotifyArea::Create(HWND hwndParent) ClientRect clnt(hwndParent); -#ifndef _ROS_ return Window::Create(WINDOW_CREATOR(NotifyArea), WS_EX_STATICEDGE, wcTrayNotify, TITLE_TRAYNOTIFY, WS_CHILD|WS_VISIBLE, clnt.right-(NOTIFYAREA_WIDTH_DEF+1), 1, NOTIFYAREA_WIDTH_DEF, clnt.bottom-2, hwndParent); -#else - return Window::Create(WINDOW_CREATOR(NotifyArea), 0, - wcTrayNotify, TITLE_TRAYNOTIFY, WS_CHILD|WS_VISIBLE, - clnt.right-(NOTIFYAREA_WIDTH_DEF+1), 1, NOTIFYAREA_WIDTH_DEF, clnt.bottom-2, hwndParent); -#endif } LRESULT NotifyArea::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) @@ -604,10 +598,6 @@ void NotifyArea::Paint() // first fill with the background color FillRect(canvas, &canvas.rcPaint, GetSysColorBrush(COLOR_BTNFACE)); -#ifdef _ROS_ - DrawEdge(canvas, ClientRect(_hwnd), BDR_SUNKENOUTER, BF_RECT); -#endif - // draw icons int x = 2; int y = 3; @@ -1210,10 +1200,6 @@ void ClockWindow::Paint() { PaintCanvas canvas(_hwnd); -#ifdef _ROS_ - DrawEdge(canvas, ClientRect(_hwnd), BDR_SUNKENOUTER, BF_TOP|BF_RIGHT); -#endif - BkMode bkmode(canvas, TRANSPARENT); FontSelection font(canvas, GetStockFont(ANSI_VAR_FONT)); From 0a205b8bd5da3eb2cb61f00c09120052e8e4601c Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 5 Apr 2004 20:46:15 +0000 Subject: [PATCH 0741/1463] made the DCE list thread-safe svn path=/trunk/; revision=8978 --- reactos/subsys/win32k/ntuser/windc.c | 52 +++++++++++++++++++++------- 1 file changed, 40 insertions(+), 12 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/windc.c b/reactos/subsys/win32k/ntuser/windc.c index 2aaf0bd586b..8aa9f5fbb6a 100644 --- a/reactos/subsys/win32k/ntuser/windc.c +++ b/reactos/subsys/win32k/ntuser/windc.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: windc.c,v 1.61 2004/03/23 18:08:07 weiden Exp $ +/* $Id: windc.c,v 1.62 2004/04/05 20:46:15 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -49,14 +49,26 @@ /* GLOBALS *******************************************************************/ +/* NOTE - I think we should store this per window station (including gdi objects) */ + +static FAST_MUTEX DceListLock; static PDCE FirstDce = NULL; static HDC defaultDCstate; +#define DCE_LockList ExAcquireFastMutex(&DceListLock) +#define DCE_UnlockList ExReleaseFastMutex(&DceListLock) + #define DCX_CACHECOMPAREMASK (DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN | \ DCX_CACHE | DCX_WINDOW | DCX_PARENTCLIP) /* FUNCTIONS *****************************************************************/ +VOID FASTCALL +DceInit(VOID) +{ + ExInitializeFastMutex(&DceListLock); +} + HRGN STDCALL DceGetVisRgn(HWND hWnd, ULONG Flags, HWND hWndChild, ULONG CFlags) { @@ -111,8 +123,10 @@ DceAllocDCE(HWND hWnd, DCE_TYPE Type) } Dce->hwndCurrent = hWnd; Dce->hClipRgn = NULL; + DCE_LockList; Dce->next = FirstDce; FirstDce = Dce; + DCE_UnlockList; if (Type != DCE_CACHE_DC) { @@ -408,6 +422,8 @@ NtUserGetDCEx(HWND hWnd, HANDLE ClipRegion, ULONG Flags) { DCE* DceEmpty = NULL; DCE* DceUnused = NULL; + + DCE_LockList; for (Dce = FirstDce; Dce != NULL; Dce = Dce->next) { @@ -430,6 +446,8 @@ NtUserGetDCEx(HWND hWnd, HANDLE ClipRegion, ULONG Flags) } } + DCE_UnlockList; + if (Dce == NULL) { Dce = (DceEmpty == NULL) ? DceEmpty : DceUnused; @@ -555,7 +573,9 @@ BOOL FASTCALL DCE_InternalDelete(PDCE Dce) { PDCE PrevInList; - + + DCE_LockList; + if (Dce == FirstDce) { FirstDce = Dce->next; @@ -574,6 +594,8 @@ DCE_InternalDelete(PDCE Dce) assert(NULL != PrevInList); } + DCE_UnlockList; + return NULL != PrevInList; } @@ -581,13 +603,17 @@ HWND FASTCALL IntWindowFromDC(HDC hDc) { DCE *Dce; + + DCE_LockList; for (Dce = FirstDce; Dce != NULL; Dce = Dce->next) { if(Dce->hDC == hDc) { + DCE_UnlockList; return Dce->hwndCurrent; } } + DCE_UnlockList; return 0; } @@ -597,7 +623,8 @@ NtUserReleaseDC(HWND hWnd, HDC hDc) DCE *dce; INT nRet = 0; - /* FIXME USER_Lock(); */ + DCE_LockList; + dce = FirstDce; DPRINT("%p %p\n", hWnd, hDc); @@ -612,7 +639,7 @@ NtUserReleaseDC(HWND hWnd, HDC hDc) nRet = DceReleaseDC(dce); } - /* FIXME USER_Unlock(); */ + DCE_UnlockList; return nRet; } @@ -631,16 +658,8 @@ DceFreeDCE(PDCE dce) return NULL; } -#if 0 /* FIXME */ - USER_Lock(); -#endif - ret = dce->next; -#if 0 /* FIXME */ - USER_Unlock(); -#endif - #if 0 /* FIXME */ SetDCHook(dce->hDC, NULL, 0L); #endif @@ -668,6 +687,8 @@ DceFreeWindowDCE(PWINDOW_OBJECT Window) { DCE *pDCE; + DCE_LockList; + pDCE = FirstDce; while (pDCE) { @@ -709,15 +730,18 @@ DceFreeWindowDCE(PWINDOW_OBJECT Window) } pDCE = pDCE->next; } + DCE_UnlockList; } void FASTCALL DceEmptyCache() { + DCE_LockList; while (FirstDce != NULL) { DceFreeDCE(FirstDce); } + DCE_UnlockList; } VOID FASTCALL @@ -732,6 +756,8 @@ DceResetActiveDCEs(PWINDOW_OBJECT Window, int DeltaX, int DeltaY) return; } + DCE_LockList; + pDCE = FirstDce; while (pDCE) { @@ -785,6 +811,8 @@ DceResetActiveDCEs(PWINDOW_OBJECT Window, int DeltaX, int DeltaY) } pDCE = pDCE->next; } + + DCE_UnlockList; } /* EOF */ From bd69e8d1211016fbc0696cb701022541988dc013 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 5 Apr 2004 21:15:34 +0000 Subject: [PATCH 0742/1463] little cosmetics... svn path=/trunk/; revision=8979 --- reactos/subsys/win32k/ntuser/windc.c | 43 +++++++++++++++------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/windc.c b/reactos/subsys/win32k/ntuser/windc.c index 8aa9f5fbb6a..4ee1b71e044 100644 --- a/reactos/subsys/win32k/ntuser/windc.c +++ b/reactos/subsys/win32k/ntuser/windc.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: windc.c,v 1.62 2004/04/05 20:46:15 weiden Exp $ +/* $Id: windc.c,v 1.63 2004/04/05 21:15:34 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -55,8 +55,10 @@ static FAST_MUTEX DceListLock; static PDCE FirstDce = NULL; static HDC defaultDCstate; -#define DCE_LockList ExAcquireFastMutex(&DceListLock) -#define DCE_UnlockList ExReleaseFastMutex(&DceListLock) +#define DCE_LockList() \ + ExAcquireFastMutex(&DceListLock) +#define DCE_UnlockList() \ + ExReleaseFastMutex(&DceListLock) #define DCX_CACHECOMPAREMASK (DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN | \ DCX_CACHE | DCX_WINDOW | DCX_PARENTCLIP) @@ -123,10 +125,10 @@ DceAllocDCE(HWND hWnd, DCE_TYPE Type) } Dce->hwndCurrent = hWnd; Dce->hClipRgn = NULL; - DCE_LockList; + DCE_LockList(); Dce->next = FirstDce; FirstDce = Dce; - DCE_UnlockList; + DCE_UnlockList(); if (Type != DCE_CACHE_DC) { @@ -423,7 +425,7 @@ NtUserGetDCEx(HWND hWnd, HANDLE ClipRegion, ULONG Flags) DCE* DceEmpty = NULL; DCE* DceUnused = NULL; - DCE_LockList; + DCE_LockList(); for (Dce = FirstDce; Dce != NULL; Dce = Dce->next) { @@ -446,7 +448,7 @@ NtUserGetDCEx(HWND hWnd, HANDLE ClipRegion, ULONG Flags) } } - DCE_UnlockList; + DCE_UnlockList(); if (Dce == NULL) { @@ -574,7 +576,7 @@ DCE_InternalDelete(PDCE Dce) { PDCE PrevInList; - DCE_LockList; + DCE_LockList(); if (Dce == FirstDce) { @@ -594,7 +596,7 @@ DCE_InternalDelete(PDCE Dce) assert(NULL != PrevInList); } - DCE_UnlockList; + DCE_UnlockList(); return NULL != PrevInList; } @@ -604,16 +606,16 @@ IntWindowFromDC(HDC hDc) { DCE *Dce; - DCE_LockList; + DCE_LockList(); for (Dce = FirstDce; Dce != NULL; Dce = Dce->next) { if(Dce->hDC == hDc) { - DCE_UnlockList; + DCE_UnlockList(); return Dce->hwndCurrent; } } - DCE_UnlockList; + DCE_UnlockList(); return 0; } @@ -623,7 +625,7 @@ NtUserReleaseDC(HWND hWnd, HDC hDc) DCE *dce; INT nRet = 0; - DCE_LockList; + DCE_LockList(); dce = FirstDce; @@ -639,7 +641,7 @@ NtUserReleaseDC(HWND hWnd, HDC hDc) nRet = DceReleaseDC(dce); } - DCE_UnlockList; + DCE_UnlockList(); return nRet; } @@ -687,7 +689,7 @@ DceFreeWindowDCE(PWINDOW_OBJECT Window) { DCE *pDCE; - DCE_LockList; + DCE_LockList(); pDCE = FirstDce; while (pDCE) @@ -730,18 +732,18 @@ DceFreeWindowDCE(PWINDOW_OBJECT Window) } pDCE = pDCE->next; } - DCE_UnlockList; + DCE_UnlockList(); } void FASTCALL DceEmptyCache() { - DCE_LockList; + DCE_LockList(); while (FirstDce != NULL) { DceFreeDCE(FirstDce); } - DCE_UnlockList; + DCE_UnlockList(); } VOID FASTCALL @@ -756,7 +758,7 @@ DceResetActiveDCEs(PWINDOW_OBJECT Window, int DeltaX, int DeltaY) return; } - DCE_LockList; + DCE_LockList(); pDCE = FirstDce; while (pDCE) @@ -809,10 +811,11 @@ DceResetActiveDCEs(PWINDOW_OBJECT Window, int DeltaX, int DeltaY) IntReleaseWindowObject(CurrentWindow); } } + pDCE = pDCE->next; } - DCE_UnlockList; + DCE_UnlockList(); } /* EOF */ From beedced608915077d6dd815f1d96613a1d5133cf Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Mon, 5 Apr 2004 21:19:48 +0000 Subject: [PATCH 0743/1463] merge Wine commits svn path=/trunk/; revision=8980 --- reactos/lib/shell32/shell32_It.rc | 2 +- reactos/lib/shell32/shelllink.c | 2 +- reactos/lib/shell32/shlexec.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/lib/shell32/shell32_It.rc b/reactos/lib/shell32/shell32_It.rc index 1a8026514ef..2ef2b8bc76d 100644 --- a/reactos/lib/shell32/shell32_It.rc +++ b/reactos/lib/shell32/shell32_It.rc @@ -1,6 +1,6 @@ /* * Copyright 1998 Juergen Schmied - * Copyright 2003 Ivan Leo Murray-Smith + * Copyright 2003-2004 Ivan Leo Murray-Smith * * 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/shell32/shelllink.c b/reactos/lib/shell32/shelllink.c index cb2e88e0d31..4f1a43e6aed 100644 --- a/reactos/lib/shell32/shelllink.c +++ b/reactos/lib/shell32/shelllink.c @@ -241,7 +241,7 @@ static HRESULT WINAPI IPersistFile_fnLoad(IPersistFile* iface, LPCOLESTR pszFile r = IPersistStream_Load(StreamThis, stm); ShellLink_UpdatePath(This->sPathRel, pszFileName, This->sWorkDir, &This->sPath); IStream_Release( stm ); - This->bDirty = TRUE; + This->bDirty = FALSE; } return r; diff --git a/reactos/lib/shell32/shlexec.c b/reactos/lib/shell32/shlexec.c index 40edc21e172..08d47116467 100644 --- a/reactos/lib/shell32/shlexec.c +++ b/reactos/lib/shell32/shlexec.c @@ -325,7 +325,7 @@ static UINT SHELL_ExecuteW(const WCHAR *lpCmd, void *env, BOOL shWait, /* Give 30 seconds to the app to come up, if desired. Probably only needed when starting app immediately before making a DDE connection. */ if (shWait) - if (WaitForInputIdle( info.hProcess, 30000 ) == -1) + if (WaitForInputIdle( info.hProcess, 30000 ) == WAIT_FAILED) WARN("WaitForInputIdle failed: Error %ld\n", GetLastError() ); retval = 33; From ba87a9d7a1b4b307ba0924cf86e02bc11a6e26e6 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Mon, 5 Apr 2004 21:26:25 +0000 Subject: [PATCH 0744/1463] - Changed the internal brush object to be (almost) Win32k compatible. - Changed Pen implementation to use brushes internally. - Added support for pattern brushes. - Fixed 8bpp StretchBlt. - Fixed 4bpp to 4bpp non-SRCCOPY blits. - Fixed 1bpp to 1bpp non-SRCCOPY blits to work when the destination doesn't start at exact byte. - Reenabled 55AA brush for scrollbar. - Fixed BITMAPOBJ_GetWidthBits to do WORD alignment and not DWORD. svn path=/trunk/; revision=8981 --- reactos/include/win32k/brush.h | 208 ++++--- reactos/include/win32k/pen.h | 45 +- reactos/lib/user32/windows/defwnd.c | 4 +- reactos/subsys/win32k/dib/dib16bpp.c | 180 ++++-- reactos/subsys/win32k/dib/dib1bpp.c | 231 +++++--- reactos/subsys/win32k/dib/dib24bpp.c | 130 +++-- reactos/subsys/win32k/dib/dib32bpp.c | 129 +++-- reactos/subsys/win32k/dib/dib4bpp.c | 223 +++++--- reactos/subsys/win32k/dib/dib8bpp.c | 184 ++++--- reactos/subsys/win32k/eng/bitblt.c | 108 ++-- reactos/subsys/win32k/include/object.h | 8 - reactos/subsys/win32k/objects/bitmaps.c | 10 +- reactos/subsys/win32k/objects/brush.c | 667 +++++++++++------------ reactos/subsys/win32k/objects/dc.c | 33 +- reactos/subsys/win32k/objects/fillshap.c | 97 ++-- reactos/subsys/win32k/objects/gdiobj.c | 6 +- reactos/subsys/win32k/objects/line.c | 54 +- reactos/subsys/win32k/objects/objconv.c | 34 +- reactos/subsys/win32k/objects/path.c | 3 +- reactos/subsys/win32k/objects/pen.c | 150 +++-- reactos/subsys/win32k/objects/region.c | 6 +- reactos/subsys/win32k/objects/text.c | 16 +- 22 files changed, 1533 insertions(+), 993 deletions(-) diff --git a/reactos/include/win32k/brush.h b/reactos/include/win32k/brush.h index 5e419e507e2..f7500dc389b 100644 --- a/reactos/include/win32k/brush.h +++ b/reactos/include/win32k/brush.h @@ -3,90 +3,136 @@ #include -/* Internal interface */ +/* Internal interface */ #define NB_HATCH_STYLES 6 -#define BRUSHOBJ_AllocBrush() \ - ((HBRUSH) GDIOBJ_AllocObj (sizeof (BRUSHOBJ), GDI_OBJECT_TYPE_BRUSH, NULL)) -#define BRUSHOBJ_FreeBrush(hBrush) GDIOBJ_FreeObj((HGDIOBJ)hBrush, GDI_OBJECT_TYPE_BRUSH, GDIOBJFLAG_DEFAULT) -#define BRUSHOBJ_LockBrush(hBrush) ((PBRUSHOBJ)GDIOBJ_LockObj((HGDIOBJ)hBrush, GDI_OBJECT_TYPE_BRUSH)) +/* + * The layout of this structure is taken from "Windows Graphics Programming" + * book written by Feng Yuan. + * + * DON'T MODIFY THIS STRUCTURE UNLESS REALLY NEEDED AND EVEN THEN ASK ON + * A MAILING LIST FIRST. + */ + +typedef struct +{ + ULONG AttrFlags; + COLORREF lbColor; +} BRUSHATTR, *PBRUSHATTR; + +typedef struct +{ + ULONG ulStyle; + HBITMAP hbmPattern; + HANDLE hbmClient; + ULONG flAttrs; + + ULONG ulBrushUnique; + BRUSHATTR *pBrushAttr; + BRUSHATTR BrushAttr; + ULONG Unknown30; + ULONG bCacheGrabbed; + 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; + ULONG dwStyleCount; + ULONG Unknown6C; +} GDIBRUSHOBJ, *PGDIBRUSHOBJ; + +/* GDI Brush Attributes */ + +#define GDIBRUSH_NEED_BK_CLR 0x0002 /* Background color is needed */ +#define GDIBRUSH_DITHER_OK 0x0004 /* Allow color dithering */ +#define GDIBRUSH_IS_SOLID 0x0010 /* Solid brush */ +#define GDIBRUSH_IS_HATCH 0x0020 /* Hatch brush */ +#define GDIBRUSH_IS_BITMAP 0x0040 /* DDB pattern brush */ +#define GDIBRUSH_IS_DIB 0x0080 /* DIB pattern brush */ +#define GDIBRUSH_IS_NULL 0x0100 /* Null/hollow brush */ +#define GDIBRUSH_IS_GLOBAL 0x0200 /* Stock objects */ +#define GDIBRUSH_IS_PEN 0x0400 /* Pen */ +#define GDIBRUSH_IS_OLDSTYLEPEN 0x0800 /* Geometric pen */ +#define GDIBRUSH_IS_MASKING 0x8000 /* Pattern bitmap is used as transparent mask (?) */ +#define GDIBRUSH_CACHED_IS_SOLID 0x80000000 + +#define BRUSHOBJ_AllocBrush() ((HBRUSH) GDIOBJ_AllocObj (sizeof(GDIBRUSHOBJ), GDI_OBJECT_TYPE_BRUSH, NULL)) +#define BRUSHOBJ_FreeBrush(hBrush) GDIOBJ_FreeObj((HGDIOBJ)hBrush, GDI_OBJECT_TYPE_BRUSH, GDIOBJFLAG_DEFAULT) +#define BRUSHOBJ_LockBrush(hBrush) ((PGDIBRUSHOBJ)GDIOBJ_LockObj((HGDIOBJ)hBrush, GDI_OBJECT_TYPE_BRUSH)) #define BRUSHOBJ_UnlockBrush(hBrush) GDIOBJ_UnlockObj((HGDIOBJ)hBrush, GDI_OBJECT_TYPE_BRUSH) -HBRUSH -STDCALL -NtGdiCreateBrushIndirect ( - CONST LOGBRUSH * lb - ); -HBRUSH -STDCALL -NtGdiCreateDIBPatternBrush ( - HGLOBAL hDIBPacked, - UINT ColorSpec - ); -HBRUSH -STDCALL -NtGdiCreateDIBPatternBrushPt ( - CONST VOID * PackedDIB, - UINT Usage - ); -HBRUSH -STDCALL -NtGdiCreateHatchBrush ( - INT Style, - COLORREF Color - ); -HBRUSH -STDCALL -NtGdiCreatePatternBrush ( - HBITMAP hBitmap - ); -HBRUSH -STDCALL -NtGdiCreateSolidBrush ( - COLORREF Color - ); -BOOL -STDCALL -NtGdiFixBrushOrgEx ( - VOID - ); -BOOL -STDCALL -NtGdiPatBlt ( - HDC hDC, - INT XLeft, - INT YLeft, - INT Width, - INT Height, - DWORD ROP - ); -BOOL -STDCALL -NtGdiPolyPatBlt( - HDC hDC, - DWORD dwRop, - PPATRECT pRects, - int cRects, - ULONG Reserved - ); -BOOL -STDCALL -NtGdiPatBlt ( - HDC hDC, - INT XLeft, - INT YLeft, - INT Width, - INT Height, - DWORD ROP - ); -BOOL -STDCALL -NtGdiSetBrushOrgEx ( - HDC hDC, - INT XOrg, - INT YOrg, - LPPOINT Point - ); -#endif +HBRUSH STDCALL +NtGdiCreateBrushIndirect( + CONST LOGBRUSH *LogBrush); +HBRUSH STDCALL +NtGdiCreateDIBPatternBrush( + HGLOBAL hDIBPacked, + UINT ColorSpec); + +HBRUSH STDCALL +NtGdiCreateDIBPatternBrushPt( + CONST VOID *PackedDIB, + UINT Usage); + +HBRUSH STDCALL +NtGdiCreateHatchBrush( + INT Style, + COLORREF Color); + +HBRUSH STDCALL +NtGdiCreatePatternBrush( + HBITMAP hBitmap); + +HBRUSH STDCALL +NtGdiCreateSolidBrush( + COLORREF Color); + +BOOL STDCALL +NtGdiFixBrushOrgEx( + VOID); + +BOOL STDCALL +NtGdiPatBlt( + HDC hDC, + INT XLeft, + INT YLeft, + INT Width, + INT Height, + DWORD ROP); + +BOOL STDCALL +NtGdiPolyPatBlt( + HDC hDC, + DWORD dwRop, + PPATRECT pRects, + INT cRects, + ULONG Reserved); + +BOOL STDCALL +NtGdiPatBlt( + HDC hDC, + INT XLeft, + INT YLeft, + INT Width, + INT Height, + DWORD ROP); + +BOOL STDCALL +NtGdiSetBrushOrgEx( + HDC hDC, + INT XOrg, + INT YOrg, + LPPOINT Point); + +#endif diff --git a/reactos/include/win32k/pen.h b/reactos/include/win32k/pen.h index f7842eca2e2..b934be08b0d 100644 --- a/reactos/include/win32k/pen.h +++ b/reactos/include/win32k/pen.h @@ -1,35 +1,32 @@ - #ifndef __WIN32K_PEN_H #define __WIN32K_PEN_H #include +#include -/* GDI logical pen object */ -typedef struct -{ - LOGPEN logpen; - ULONG iSolidColor; -} PENOBJ, *PPENOBJ; +/* Internal interface */ -/* Internal interface */ +#define PENOBJ_AllocPen() ((HPEN)GDIOBJ_AllocObj(sizeof(GDIBRUSHOBJ), GDI_OBJECT_TYPE_PEN, NULL)) +#define PENOBJ_FreePen(hBMObj) GDIOBJ_FreeObj((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_PEN, GDIOBJFLAG_DEFAULT) +#define PENOBJ_LockPen(hBMObj) ((PGDIBRUSHOBJ)GDIOBJ_LockObj((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_PEN)) +#define PENOBJ_UnlockPen(hBMObj) GDIOBJ_UnlockObj((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_PEN) -#define PENOBJ_AllocPen() \ - ((HPEN) GDIOBJ_AllocObj (sizeof (PENOBJ), GDI_OBJECT_TYPE_PEN, NULL)) -#define PENOBJ_FreePen(hBMObj) GDIOBJ_FreeObj((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_PEN, GDIOBJFLAG_DEFAULT) -#define PENOBJ_LockPen(hBMObj) ((PPENOBJ)GDIOBJ_LockObj ((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_PEN)) -#define PENOBJ_UnlockPen(hBMObj) GDIOBJ_UnlockObj ((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_PEN) +HPEN STDCALL +NtGdiCreatePen( + INT PenStyle, + INT Width, + COLORREF Color); -HPEN STDCALL NtGdiCreatePen(INT PenStyle, - INT Width, - COLORREF Color); +HPEN STDCALL +NtGdiCreatePenIndirect( + CONST PLOGPEN LogBrush); -HPEN STDCALL NtGdiCreatePenIndirect(CONST PLOGPEN lgpn); - -HPEN STDCALL NtGdiExtCreatePen(DWORD PenStyle, - DWORD Width, - CONST PLOGBRUSH lb, - DWORD StyleCount, - CONST PDWORD Style); +HPEN STDCALL +NtGdiExtCreatePen( + DWORD PenStyle, + DWORD Width, + CONST PLOGBRUSH LogBrush, + DWORD StyleCount, + CONST PDWORD Style); #endif - diff --git a/reactos/lib/user32/windows/defwnd.c b/reactos/lib/user32/windows/defwnd.c index 53b6fafb6e8..7dfd7928cbc 100644 --- a/reactos/lib/user32/windows/defwnd.c +++ b/reactos/lib/user32/windows/defwnd.c @@ -1,4 +1,4 @@ -/* $Id: defwnd.c,v 1.128 2004/04/02 19:00:56 weiden Exp $ +/* $Id: defwnd.c,v 1.129 2004/04/05 21:26:24 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -902,7 +902,6 @@ DefWndHandleWindowPosChanged(HWND hWnd, WINDOWPOS* Pos) HBRUSH DefWndControlColor(HDC hDC, UINT ctlType) { -#if 0 /* FIXME: Re-enable when pattern brushes are implemented */ if (CTLCOLOR_SCROLLBAR == ctlType) { HBRUSH hb = GetSysColorBrush(COLOR_SCROLLBAR); @@ -933,7 +932,6 @@ DefWndControlColor(HDC hDC, UINT ctlType) UnrealizeObject(hb); return hb; } -#endif SetTextColor(hDC, GetSysColor(COLOR_WINDOWTEXT)); diff --git a/reactos/subsys/win32k/dib/dib16bpp.c b/reactos/subsys/win32k/dib/dib16bpp.c index 94e79c817b1..8ae97a6b89d 100644 --- a/reactos/subsys/win32k/dib/dib16bpp.c +++ b/reactos/subsys/win32k/dib/dib16bpp.c @@ -16,15 +16,17 @@ * 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.21 2004/03/28 23:25:48 navaraf Exp $ */ +/* $Id: dib16bpp.c,v 1.22 2004/04/05 21:26:24 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include #include -#include -#include #include #include +#include +#include +#include +#include #include "../eng/objects.h" #include "dib.h" @@ -279,64 +281,128 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PBRUSHOBJ Brush, PPOINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Rop4) { - LONG i, j, sx, sy; - ULONG Dest, Source, Pattern; - PULONG DestBits; - BOOL UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); - BOOL UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); - LONG RoundedRight = DestRect->right - ((DestRect->right - DestRect->left) & 0x1); + ULONG X, Y; + ULONG SourceX, SourceY; + ULONG Dest, Source, Pattern = 0; + PULONG DestBits; + BOOL UsesSource; + BOOL UsesPattern; + LONG RoundedRight; + /* Pattern brushes */ + PGDIBRUSHOBJ GdiBrush; + HBITMAP PatternSurface = NULL; + PSURFOBJ PatternObj; + ULONG PatternWidth, PatternHeight; - if (Rop4 == SRCCOPY) - { - return(DIB_16BPP_BitBltSrcCopy(DestSurf, SourceSurf, DestGDI, SourceGDI, DestRect, SourcePoint, ColorTranslation)); - } - else - { - sy = SourcePoint->y; + if (Rop4 == SRCCOPY) + { + return DIB_16BPP_BitBltSrcCopy( + DestSurf, + SourceSurf, + DestGDI, + SourceGDI, + DestRect, + SourcePoint, + ColorTranslation); + } - for (j=DestRect->top; jbottom; j++) + UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); + UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); + + if (UsesPattern) + { + if (Brush == NULL) { - sx = SourcePoint->x; - DestBits = (PULONG)(DestSurf->pvScan0 + 2 * DestRect->left + j * DestSurf->lDelta); - for (i=DestRect->left; ileft), sy, ColorTranslation); - Source |= DIB_GetSource(SourceSurf, SourceGDI, sx + (i - DestRect->left) + 1, sy, ColorTranslation) << 16; - } - if (UsesPattern) - { - /* FIXME: No support for pattern brushes. */ - Pattern = (Brush->iSolidColor & 0xFFFF) | - ((Brush->iSolidColor & 0xFFFF) << 16); - } - *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); - } - if (i < DestRect->right) - { - Dest = *DestBits; - for (; i < DestRect->right; i++) - { - if (UsesSource) - { - Source = DIB_GetSource(SourceSurf, SourceGDI, sx + (i - DestRect->left), sy, ColorTranslation); - } - if (UsesPattern) - { - /* FIXME: No support for pattern brushes. */ - Pattern = (Brush->iSolidColor & 0xFFFF) | - ((Brush->iSolidColor & 0xFFFF) << 16); - } - DIB_16BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xFFFF); - Dest >>= 16; - } - } - sy++; + UsesPattern = FALSE; + } else + if (Brush->iSolidColor == 0xFFFFFFFF) + { + PBITMAPOBJ PatternBitmap; + + GdiBrush = CONTAINING_RECORD( + Brush, + GDIBRUSHOBJ, + BrushObject); + + PatternBitmap = BITMAPOBJ_LockBitmap(GdiBrush->hbmPattern); + PatternSurface = BitmapToSurf(PatternBitmap, NULL); + BITMAPOBJ_UnlockBitmap(GdiBrush->hbmPattern); + + PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); + PatternWidth = PatternObj->sizlBitmap.cx; + PatternHeight = PatternObj->sizlBitmap.cy; } - } - return TRUE; + } + + 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++) + { + SourceX = SourcePoint->x; + for (X = DestRect->left; X < RoundedRight; X += 2, DestBits++, SourceX += 2) + { + Dest = *DestBits; + + if (UsesSource) + { + Source = DIB_GetSource(SourceSurf, SourceGDI, SourceX, SourceY, ColorTranslation); + Source |= DIB_GetSource(SourceSurf, SourceGDI, SourceX + 1, SourceY, ColorTranslation) << 16; + } + + if (UsesPattern) + { + if (Brush->iSolidColor == 0xFFFFFFFF) + { + Pattern = (DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, Y % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack); + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + 1) % PatternWidth, Y % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 16; + } + else + { + Pattern = (Brush->iSolidColor & 0xFFFF) | + ((Brush->iSolidColor & 0xFFFF) << 16); + } + } + + *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); + } + + if (X < DestRect->right) + { + Dest = *((PUSHORT)DestBits); + + if (UsesSource) + { + Source = DIB_GetSource(SourceSurf, SourceGDI, SourceX, SourceY, ColorTranslation); + } + + if (UsesPattern) + { + if (Brush->iSolidColor == 0xFFFFFFFF) + Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, Y % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack; + else + Pattern = Brush->iSolidColor & 0xFFFF; + } + + DIB_16BPP_PutPixel(DestSurf, X, Y, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xFFFF); + DestBits = (PULONG)((ULONG_PTR)DestBits + 2); + } + + SourceY++; + DestBits = (PULONG)( + (ULONG_PTR)DestBits - + ((DestRect->right - DestRect->left) << 1) + + DestSurf->lDelta); + } + + if (PatternSurface != NULL) + EngDeleteSurface(PatternSurface); + + return TRUE; } diff --git a/reactos/subsys/win32k/dib/dib1bpp.c b/reactos/subsys/win32k/dib/dib1bpp.c index 7cdacd83ad8..b252dafcb03 100644 --- a/reactos/subsys/win32k/dib/dib1bpp.c +++ b/reactos/subsys/win32k/dib/dib1bpp.c @@ -16,13 +16,15 @@ * 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.16 2004/03/28 23:24:57 navaraf Exp $ */ +/* $Id: dib1bpp.c,v 1.17 2004/04/05 21:26:24 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include #include +#include #include +#include #include #include #include "../eng/objects.h" @@ -351,68 +353,175 @@ DIB_1BPP_BitBlt( PBRUSHOBJ Brush, PPOINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Rop4) { - LONG i, j, k, sx, sy; - ULONG Dest, Source, Pattern; - PULONG DestBits; - BOOL UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); - BOOL UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); - LONG RoundedRight = DestRect->right - ((DestRect->right - DestRect->left) & 0x7); + ULONG X, Y, SourceX, SourceY, k; + ULONG Dest, Source, Pattern; + PULONG DestBits; + BOOL UsesSource; + BOOL UsesPattern; + LONG RoundedRight; + BYTE NoBits; + /* Pattern brushes */ + PGDIBRUSHOBJ GdiBrush; + HBITMAP PatternSurface = NULL; + PSURFOBJ PatternObj; + ULONG PatternWidth, PatternHeight; - if (Rop4 == SRCCOPY) - { - return(DIB_1BPP_BitBltSrcCopy(DestSurf, SourceSurf, DestGDI, SourceGDI, DestRect, SourcePoint, ColorTranslation)); - } - else - { - sy = SourcePoint->y; + if (Rop4 == SRCCOPY) + { + return DIB_1BPP_BitBltSrcCopy( + DestSurf, + SourceSurf, + DestGDI, + SourceGDI, + DestRect, + SourcePoint, + ColorTranslation); + } - for (j=DestRect->top; jbottom; j++) - { - sx = SourcePoint->x; - DestBits = (PULONG)(DestSurf->pvScan0 + (DestRect->left>>3) + j * DestSurf->lDelta); - for (i=DestRect->left; ileft) + k, sy, ColorTranslation) << (7 - k)); - Source |= (DIB_GetSource(SourceSurf, SourceGDI, sx + (i - DestRect->left) + k + 8, sy, ColorTranslation) << (8 + (7 - k))); - Source |= (DIB_GetSource(SourceSurf, SourceGDI, sx + (i - DestRect->left) + k + 16, sy, ColorTranslation) << (16 + (7 - k))); - Source |= (DIB_GetSource(SourceSurf, SourceGDI, sx + (i - DestRect->left) + k + 24, sy, ColorTranslation) << (24 + (7 - k))); - } - } - if (UsesPattern) - { - /* FIXME: No support for pattern brushes. */ - Pattern = Brush->iSolidColor ? 0xFFFFFFFF : 0x00000000; - } - *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); - } - if (i < DestRect->right) - { - Dest = *DestBits; - for (; i < DestRect->right; i++) - { - if (UsesSource) - { - Source = DIB_GetSource(SourceSurf, SourceGDI, sx + (i - DestRect->left), sy, ColorTranslation); - } - if (UsesPattern) - { - /* FIXME: No support for pattern brushes. */ - Pattern = Brush->iSolidColor ? 0xFFFFFFFF : 0x00000000; - } - DIB_1BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF); - Dest >>= 1; - } - } - sy++; - } - } - return TRUE; + if (UsesPattern) + { + if (Brush == NULL) + { + UsesPattern = FALSE; + } else + if (Brush->iSolidColor == 0xFFFFFFFF) + { + PBITMAPOBJ PatternBitmap; + + GdiBrush = CONTAINING_RECORD( + Brush, + GDIBRUSHOBJ, + BrushObject); + + PatternBitmap = BITMAPOBJ_LockBitmap(GdiBrush->hbmPattern); + PatternSurface = BitmapToSurf(PatternBitmap, NULL); + BITMAPOBJ_UnlockBitmap(GdiBrush->hbmPattern); + + PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); + PatternWidth = PatternObj->sizlBitmap.cx; + PatternHeight = PatternObj->sizlBitmap.cy; + } + } + + UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); + UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); + RoundedRight = DestRect->right - ((DestRect->right - DestRect->left) & 0x7); + SourceY = SourcePoint->y; + + for (Y = DestRect->top; Y < DestRect->bottom; Y++) + { + SourceX = SourcePoint->x; + DestBits = (PULONG)( + DestSurf->pvScan0 + + (DestRect->left >> 3) + + Y * DestSurf->lDelta); + + X = DestRect->left; + if (X & 7) + { + Dest = *((PBYTE)DestBits); + NoBits = 7 - (X & 7); + + if (UsesSource) + { + Source = 0; + for (k = 7 - NoBits; k < NoBits; k++) + Source |= (DIB_GetSource(SourceSurf, SourceGDI, SourceX + k, SourceY, ColorTranslation) << (7 - k)); + } + + if (UsesPattern) + { + if (Brush->iSolidColor == 0xFFFFFFFF) + { + Pattern = 0; + for (k = 7 - NoBits; k < NoBits; k++) + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k) % PatternWidth, Y % PatternHeight) << (7 - k)); + } + else + { + Pattern = Brush->iSolidColor ? 0xFFFFFFFF : 0x00000000; + } + } + + Dest = DIB_DoRop(Rop4, Dest, Source, Pattern); + Dest &= ~((1 << (7 - NoBits)) - 1); + Dest |= *((PBYTE)DestBits) & ((1 << (7 - NoBits)) - 1); + + X += NoBits; + SourceX += NoBits; + } + + for (; X < RoundedRight; X += 32, DestBits++, SourceX++) + { + Dest = *DestBits; + + if (UsesSource) + { + 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))); + } + } + + if (UsesPattern) + { + if (Brush->iSolidColor == 0xFFFFFFFF) + { + Pattern = 0; + for (k = 0; k < 8; k++) + { + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k) % PatternWidth, Y % PatternHeight) << (7 - k)); + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k + 8) % PatternWidth, Y % PatternHeight) << (8 + (7 - k))); + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k + 16) % PatternWidth, Y % PatternHeight) << (16 + (7 - k))); + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k + 24) % PatternWidth, Y % PatternHeight) << (24 + (7 - k))); + } + } + else + { + Pattern = Brush->iSolidColor ? 0xFFFFFFFF : 0x00000000; + } + } + + *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); + } + + if (X < DestRect->right) + { +// Dest = *DestBits; + for (; X < DestRect->right; X++, SourceX++) + { +// Dest = *DestBits; + Dest = DIB_1BPP_GetPixel(DestSurf, X, Y); + + if (UsesSource) + { + Source = DIB_GetSource(SourceSurf, SourceGDI, SourceX, SourceY, ColorTranslation); + } + + if (UsesPattern) + { + if (Brush->iSolidColor == 0xFFFFFFFF) + Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, Y % PatternHeight); + else + Pattern = Brush->iSolidColor ? 0xFFFFFFFF : 0x00000000; + } + + DIB_1BPP_PutPixel(DestSurf, X, Y, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF); +// Dest >>= 1; + } + } + + SourceY++; + } + + if (PatternSurface != NULL) + EngDeleteSurface(PatternSurface); + + return TRUE; } BOOLEAN diff --git a/reactos/subsys/win32k/dib/dib24bpp.c b/reactos/subsys/win32k/dib/dib24bpp.c index bb0aec678ca..56b39f312ca 100644 --- a/reactos/subsys/win32k/dib/dib24bpp.c +++ b/reactos/subsys/win32k/dib/dib24bpp.c @@ -16,13 +16,15 @@ * 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.17 2004/03/28 23:25:48 navaraf Exp $ */ +/* $Id: dib24bpp.c,v 1.18 2004/04/05 21:26:24 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include #include +#include #include #include +#include #include #include "../eng/objects.h" #include "dib.h" @@ -251,44 +253,102 @@ DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PBRUSHOBJ Brush, PPOINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Rop4) { - LONG i, j, sx, sy; - ULONG Dest, Source, Pattern; - PBYTE DestBits; - BOOL UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); - BOOL UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); + ULONG X, Y; + ULONG SourceX, SourceY; + ULONG Dest, Source, Pattern; + PBYTE DestBits; + BOOL UsesSource; + BOOL UsesPattern; + /* Pattern brushes */ + PGDIBRUSHOBJ GdiBrush; + HBITMAP PatternSurface = NULL; + PSURFOBJ PatternObj; + ULONG PatternWidth, PatternHeight; - if (Rop4 == SRCCOPY) - { - return(DIB_24BPP_BitBltSrcCopy(DestSurf, SourceSurf, DestGDI, SourceGDI, DestRect, SourcePoint, ColorTranslation)); - } - else - { - sy = SourcePoint->y; + if (Rop4 == SRCCOPY) + { + return DIB_24BPP_BitBltSrcCopy( + DestSurf, + SourceSurf, + DestGDI, + SourceGDI, + DestRect, + SourcePoint, + ColorTranslation); + } - for (j = DestRect->top; j < DestRect->bottom; j++) + UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); + UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); + + if (UsesPattern) + { + if (Brush == NULL) { - sx = SourcePoint->x; - DestBits = (PBYTE)(DestSurf->pvScan0 + 3 * DestRect->left + j * DestSurf->lDelta); - for (i=DestRect->left; iright; i++, DestBits+=3) - { - Dest = *(PUSHORT)(DestBits) + (*(DestBits + 2) << 16); - if (UsesSource) - { - Source = DIB_GetSource(SourceSurf, SourceGDI, sx + (i - DestRect->left), sy, ColorTranslation) & 0x00ffffff; - } - if (UsesPattern) - { - /* FIXME: No support for pattern brushes. */ - Pattern = Brush->iSolidColor; - } - Dest = DIB_DoRop(Rop4, Dest, Source, Pattern); - *(PUSHORT)(DestBits) = Dest & 0xFFFF; - *(DestBits + 2) = Dest >> 16; - } - sy++; + UsesPattern = FALSE; + } else + if (Brush->iSolidColor == 0xFFFFFFFF) + { + PBITMAPOBJ PatternBitmap; + + GdiBrush = CONTAINING_RECORD( + Brush, + GDIBRUSHOBJ, + BrushObject); + + PatternBitmap = BITMAPOBJ_LockBitmap(GdiBrush->hbmPattern); + PatternSurface = BitmapToSurf(PatternBitmap, NULL); + BITMAPOBJ_UnlockBitmap(GdiBrush->hbmPattern); + + PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); + PatternWidth = PatternObj->sizlBitmap.cx; + PatternHeight = PatternObj->sizlBitmap.cy; } - } - return TRUE; + } + + SourceY = SourcePoint->y; + DestBits = (PBYTE)( + DestSurf->pvScan0 + + (DestRect->left << 1) + DestRect->left + + DestRect->top * DestSurf->lDelta); + + for (Y = DestRect->top; Y < DestRect->bottom; Y++) + { + SourceX = SourcePoint->x; + for (X = DestRect->left; X < DestRect->right; X++, DestBits += 3, SourceX++) + { + Dest = *((PUSHORT)DestBits) + (*(DestBits + 2) << 16); + + if (UsesSource) + { + Source = DIB_GetSource(SourceSurf, SourceGDI, SourceX, SourceY, ColorTranslation); + } + + if (UsesPattern) + { + if (Brush->iSolidColor == 0xFFFFFFFF) + { + Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, Y % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack; + } + else + { + Pattern = Brush->iSolidColor; + } + } + + Dest = DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xFFFFFF; + *(PUSHORT)(DestBits) = Dest & 0xFFFF; + *(DestBits + 2) = Dest >> 16; + } + + SourceY++; + DestBits -= (DestRect->right - DestRect->left) * 3; + DestBits += DestSurf->lDelta; + } + + if (PatternSurface != NULL) + EngDeleteSurface(PatternSurface); + + return TRUE; } BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, diff --git a/reactos/subsys/win32k/dib/dib32bpp.c b/reactos/subsys/win32k/dib/dib32bpp.c index a3ed08c273b..2fe3bd2978d 100644 --- a/reactos/subsys/win32k/dib/dib32bpp.c +++ b/reactos/subsys/win32k/dib/dib32bpp.c @@ -16,14 +16,16 @@ * 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.17 2004/04/04 16:40:05 gvg Exp $ */ +/* $Id: dib32bpp.c,v 1.18 2004/04/05 21:26:24 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include #include +#include #include #include #include +#include #include "../eng/objects.h" #include "dib.h" @@ -300,42 +302,103 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PBRUSHOBJ Brush, PPOINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Rop4) { - LONG i, j, sx, sy; - ULONG Dest, Source, Pattern; - PULONG DestBits; - BOOL UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); - BOOL UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); + ULONG X, Y; + ULONG SourceX, SourceY; + ULONG Dest, Source, Pattern; + PULONG DestBits; + BOOL UsesSource; + BOOL UsesPattern; + /* Pattern brushes */ + PGDIBRUSHOBJ GdiBrush; + HBITMAP PatternSurface = NULL; + PSURFOBJ PatternObj; + ULONG PatternWidth, PatternHeight; - if (Rop4 == SRCCOPY) - { - return(DIB_32BPP_BitBltSrcCopy(DestSurf, SourceSurf, DestGDI, SourceGDI, DestRect, SourcePoint, ColorTranslation)); - } - else - { - sy = SourcePoint->y; + if (Rop4 == SRCCOPY) + { + return DIB_32BPP_BitBltSrcCopy( + DestSurf, + SourceSurf, + DestGDI, + SourceGDI, + DestRect, + SourcePoint, + ColorTranslation); + } - for (j=DestRect->top; jbottom; j++) + UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); + UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); + + if (UsesPattern) + { + if (Brush == NULL) { - sx = SourcePoint->x; - DestBits = (PULONG)(DestSurf->pvScan0 + 4 * DestRect->left + j * DestSurf->lDelta); - for (i=DestRect->left; iright; i++, DestBits++) - { - Dest = *DestBits; - if (UsesSource) - { - Source = DIB_GetSource(SourceSurf, SourceGDI, sx + (i - DestRect->left), sy, ColorTranslation); - } - if (UsesPattern) - { - /* FIXME: No support for pattern brushes. */ - Pattern = Brush->iSolidColor; - } - *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); - } - sy++; + UsesPattern = FALSE; + } else + if (Brush->iSolidColor == 0xFFFFFFFF) + { + PBITMAPOBJ PatternBitmap; + + GdiBrush = CONTAINING_RECORD( + Brush, + GDIBRUSHOBJ, + BrushObject); + + PatternBitmap = BITMAPOBJ_LockBitmap(GdiBrush->hbmPattern); + PatternSurface = BitmapToSurf(PatternBitmap, NULL); + BITMAPOBJ_UnlockBitmap(GdiBrush->hbmPattern); + + PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); + PatternWidth = PatternObj->sizlBitmap.cx; + PatternHeight = PatternObj->sizlBitmap.cy; } - } - return TRUE; + } + + SourceY = SourcePoint->y; + DestBits = (PULONG)( + DestSurf->pvScan0 + + (DestRect->left << 2) + + DestRect->top * DestSurf->lDelta); + + for (Y = DestRect->top; Y < DestRect->bottom; Y++) + { + SourceX = SourcePoint->x; + + for (X = DestRect->left; X < DestRect->right; X++, DestBits++, SourceX++) + { + Dest = *DestBits; + + if (UsesSource) + { + Source = DIB_GetSource(SourceSurf, SourceGDI, SourceX, SourceY, ColorTranslation); + } + + if (UsesPattern) + { + if (Brush->iSolidColor == 0xFFFFFFFF) + { + Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, Y % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack; + } + else + { + Pattern = Brush->iSolidColor; + } + } + + *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); + } + + SourceY++; + DestBits = (PULONG)( + (ULONG_PTR)DestBits - + ((DestRect->right - DestRect->left) << 2) + + DestSurf->lDelta); + } + + if (PatternSurface != NULL) + EngDeleteSurface(PatternSurface); + + return TRUE; } /* diff --git a/reactos/subsys/win32k/dib/dib4bpp.c b/reactos/subsys/win32k/dib/dib4bpp.c index dfa08ef979a..e210aa881ea 100644 --- a/reactos/subsys/win32k/dib/dib4bpp.c +++ b/reactos/subsys/win32k/dib/dib4bpp.c @@ -16,13 +16,15 @@ * 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.23 2004/02/08 09:27:39 navaraf Exp $ */ +/* $Id: dib4bpp.c,v 1.24 2004/04/05 21:26:24 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include #include +#include #include #include +#include #include #include "../eng/objects.h" #include "dib.h" @@ -30,18 +32,15 @@ VOID DIB_4BPP_PutPixel(PSURFOBJ SurfObj, LONG x, LONG y, ULONG c) { - PBYTE addr = SurfObj->pvScan0; - - addr += (x>>1) + y * SurfObj->lDelta; - *addr = (*addr & notmask[x&1]) | (c << ((1-(x&1))<<2)); + PBYTE addr = SurfObj->pvScan0 + (x>>1) + y * SurfObj->lDelta; + *addr = (*addr & notmask[x&1]) | (c << ((1-(x&1))<<2)); } ULONG DIB_4BPP_GetPixel(PSURFOBJ SurfObj, LONG x, LONG y) { - PBYTE addr = SurfObj->pvScan0; - - return (addr[(x>>1) + y * SurfObj->lDelta] >> ((1-(x&1))<<2) ) & 0x0f; + PBYTE addr = SurfObj->pvScan0 + (x>>1) + y * SurfObj->lDelta; + return (*addr >> ((1-(x&1))<<2)) & 0x0f; } VOID @@ -141,8 +140,8 @@ DIB_4BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, for (i=DestRect->left; iright; i++) { - *DestLine = (*DestLine & notmask[i&1]) | - ((XLATEOBJ_iXlate(ColorTranslation, *SourceLine_8BPP)) << ((4 * (1-(i & 1))))); + *DestLine = (*DestLine & notmask[f2]) | + ((XLATEOBJ_iXlate(ColorTranslation, *SourceLine_8BPP)) << ((4 * (1 - f2)))); if(f2 == 1) { DestLine++; f2 = 0; } else { f2 = 1; } SourceLine_8BPP++; } @@ -165,8 +164,8 @@ DIB_4BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, for (i = DestRect->left; i < DestRect->right; i++) { xColor = *((PWORD) SourceBits); - *DestBits = (*DestBits & notmask[i&1]) | - ((XLATEOBJ_iXlate(ColorTranslation, xColor)) << ((4 * (1-(i & 1))))); + *DestBits = (*DestBits & notmask[f2]) | + ((XLATEOBJ_iXlate(ColorTranslation, xColor)) << ((4 * (1 - f2)))); if(f2 == 1) { DestBits++; f2 = 0; } else { f2 = 1; } SourceBits += 2; } @@ -190,8 +189,8 @@ DIB_4BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, xColor = (*(SourceLine_24BPP + 2) << 0x10) + (*(SourceLine_24BPP + 1) << 0x08) + (*(SourceLine_24BPP)); - *DestLine = (*DestLine & notmask[i&1]) | - ((XLATEOBJ_iXlate(ColorTranslation, xColor)) << ((4 * (1-(i & 1))))); + *DestLine = (*DestLine & notmask[f2]) | + ((XLATEOBJ_iXlate(ColorTranslation, xColor)) << ((4 * (1 - f2)))); if(f2 == 1) { DestLine++; f2 = 0; } else { f2 = 1; } SourceLine_24BPP+=3; } @@ -214,8 +213,8 @@ DIB_4BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, for (i = DestRect->left; i < DestRect->right; i++) { xColor = *((PDWORD) SourceBits); - *DestBits = (*DestBits & notmask[i&1]) | - ((XLATEOBJ_iXlate(ColorTranslation, xColor)) << ((4 * (1-(i & 1))))); + *DestBits = (*DestBits & notmask[f2]) | + ((XLATEOBJ_iXlate(ColorTranslation, xColor)) << ((4 * (1 - f2)))); if(f2 == 1) { DestBits++; f2 = 0; } else { f2 = 1; } SourceBits += 4; } @@ -242,9 +241,14 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, LONG i, j, sx, sy; ULONG Dest, Source, Pattern; PULONG DestBits; - BOOL UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); - BOOL UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); - LONG RoundedRight = DestRect->right - ((DestRect->right - DestRect->left) & 0x7); + BOOL UsesSource; + BOOL UsesPattern; + LONG RoundedRight; + /* Pattern brushes */ + PGDIBRUSHOBJ GdiBrush; + HBITMAP PatternSurface = NULL; + PSURFOBJ PatternObj; + ULONG PatternWidth, PatternHeight; static const ULONG ExpandSolidColor[16] = { 0x00000000 /* 0 */, @@ -267,74 +271,135 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (Rop4 == SRCCOPY) { - return(DIB_4BPP_BitBltSrcCopy(DestSurf, SourceSurf, DestGDI, SourceGDI, DestRect, SourcePoint, ColorTranslation)); + return DIB_4BPP_BitBltSrcCopy( + DestSurf, + SourceSurf, + DestGDI, + SourceGDI, + DestRect, + SourcePoint, + ColorTranslation); } - else + + UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); + UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); + + if (UsesPattern) { - sy = SourcePoint->y; - - for (j = DestRect->top; j < DestRect->bottom; j++, sy++) + if (Brush == NULL) { - DestBits = (PULONG)(DestSurf->pvScan0 + (DestRect->left >> 1) + j * DestSurf->lDelta); - sx = SourcePoint->x; + UsesPattern = FALSE; + } else + if (Brush->iSolidColor == 0xFFFFFFFF) + { + PBITMAPOBJ PatternBitmap; - /* Process all pixels on the left that aren't DWORD aligned */ - for (i = DestRect->left; i & 0x7; i++, sx++) - { - Dest = DIB_4BPP_GetPixel(DestSurf, i, j); - if (UsesSource) - { - Source = DIB_GetSource(SourceSurf, SourceGDI, sx, sy, ColorTranslation); - } - if (UsesPattern) - { - /* FIXME: No support for pattern brushes. */ - Pattern = ExpandSolidColor[Brush->iSolidColor & 0xF]; - } - DIB_4BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF); - } + GdiBrush = CONTAINING_RECORD( + Brush, + GDIBRUSHOBJ, + BrushObject); - /* Process all DWORD aligned pixels */ - for (; i < RoundedRight; i += 8, sx += 8, DestBits++) - { - Dest = *DestBits; - 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); - } - if (UsesPattern) - { - /* FIXME: No support for pattern brushes. */ - Pattern = ExpandSolidColor[Brush->iSolidColor & 0xF]; - } - *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); - } + PatternBitmap = BITMAPOBJ_LockBitmap(GdiBrush->hbmPattern); + PatternSurface = BitmapToSurf(PatternBitmap, NULL); + BITMAPOBJ_UnlockBitmap(GdiBrush->hbmPattern); - /* Process the rest of pixel on the line */ - for (; i < DestRect->right; i++, sx++) - { - Dest = DIB_4BPP_GetPixel(DestSurf, i, j); - if (UsesSource) - { - Source = DIB_GetSource(SourceSurf, SourceGDI, sx, sy, ColorTranslation); - } - if (UsesPattern) - { - /* FIXME: No support for pattern brushes. */ - Pattern = ExpandSolidColor[Brush->iSolidColor & 0xF]; - } - DIB_4BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF); - } + PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); + PatternWidth = PatternObj->sizlBitmap.cx; + PatternHeight = PatternObj->sizlBitmap.cy; } } + + sy = SourcePoint->y; + RoundedRight = DestRect->right - ((DestRect->right - DestRect->left) & 0x7); + + for (j = DestRect->top; j < DestRect->bottom; j++, sy++) + { + DestBits = (PULONG)(DestSurf->pvScan0 + (DestRect->left >> 1) + j * DestSurf->lDelta); + sx = SourcePoint->x; + i = DestRect->left; + + if (i & 0x1) + { + Dest = DIB_4BPP_GetPixel(DestSurf, i, j); + + if (UsesSource) + { + Source = DIB_GetSource(SourceSurf, SourceGDI, sx, sy, ColorTranslation); + } + + if (UsesPattern) + { + if (Brush->iSolidColor == 0xFFFFFFFF) + Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack; + else + Pattern = Brush->iSolidColor & 0xF; + } + + DIB_4BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF); + + i++; + sx++; + DestBits++; + } + + for (; i < RoundedRight; i += 8, sx += 8, DestBits++) + { + Dest = *DestBits; + 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); + } + if (UsesPattern) + { + if (Brush->iSolidColor == 0xFFFFFFFF) + { + Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 1) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 4; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 2) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 8; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 3) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 12; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 4) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 16; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 5) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 20; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 6) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 24; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 7) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 28; + } + else + { + Pattern = ExpandSolidColor[Brush->iSolidColor & 0xF]; + } + } + *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); + } + + /* Process the rest of pixel on the line */ + for (; i < DestRect->right; i++, sx++) + { + Dest = DIB_4BPP_GetPixel(DestSurf, i, j); + if (UsesSource) + { + Source = DIB_GetSource(SourceSurf, SourceGDI, sx, sy, ColorTranslation); + } + if (UsesPattern) + { + if (Brush->iSolidColor == 0xFFFFFFFF) + Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack; + else + Pattern = Brush->iSolidColor & 0xF; + } + DIB_4BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF); + } + } + + if (PatternSurface != NULL) + EngDeleteSurface(PatternSurface); + return TRUE; } diff --git a/reactos/subsys/win32k/dib/dib8bpp.c b/reactos/subsys/win32k/dib/dib8bpp.c index 7a64a801c30..c0d2e3c4cf1 100644 --- a/reactos/subsys/win32k/dib/dib8bpp.c +++ b/reactos/subsys/win32k/dib/dib8bpp.c @@ -16,13 +16,15 @@ * 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.16 2004/03/28 23:25:48 navaraf Exp $ */ +/* $Id: dib8bpp.c,v 1.17 2004/04/05 21:26:24 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include #include +#include #include #include +#include #include #include "../eng/objects.h" #include "dib.h" @@ -274,71 +276,127 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PBRUSHOBJ Brush, PPOINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Rop4) { - LONG i, j, k, sx, sy; - ULONG Dest, Source, Pattern; - PULONG DestBits; - BOOL UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); - BOOL UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); - LONG RoundedRight = DestRect->right - ((DestRect->right - DestRect->left) & 0x3); + LONG i, j, k, sx, sy; + ULONG Dest, Source, Pattern; + PULONG DestBits; + BOOL UsesSource; + BOOL UsesPattern; + LONG RoundedRight; + /* Pattern brushes */ + PGDIBRUSHOBJ GdiBrush; + HBITMAP PatternSurface = NULL; + PSURFOBJ PatternObj; + ULONG PatternWidth, PatternHeight; - if (Rop4 == SRCCOPY) - { - return(DIB_8BPP_BitBltSrcCopy(DestSurf, SourceSurf, DestGDI, SourceGDI, DestRect, SourcePoint, ColorTranslation)); - } - else - { - sy = SourcePoint->y; + if (Rop4 == SRCCOPY) + { + return DIB_8BPP_BitBltSrcCopy( + DestSurf, + SourceSurf, + DestGDI, + SourceGDI, + DestRect, + SourcePoint, + ColorTranslation); + } - for (j=DestRect->top; jbottom; j++) + UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); + UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); + + if (UsesPattern) + { + if (Brush == NULL) { - sx = SourcePoint->x; - DestBits = (PULONG)(DestSurf->pvScan0 + DestRect->left + j * DestSurf->lDelta); - for (i=DestRect->left; ileft) + k, sy, ColorTranslation) << (k * 8)); - } - } - if (UsesPattern) - { - /* FIXME: No support for pattern brushes. */ - Pattern = (Brush->iSolidColor & 0xFF) | - ((Brush->iSolidColor & 0xFF) << 8) | - ((Brush->iSolidColor & 0xFF) << 16) | - ((Brush->iSolidColor & 0xFF) << 24); - } - *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); - } - if (i < DestRect->right) - { - Dest = *DestBits; - for (; i < DestRect->right; i++) - { - if (UsesSource) - { - Source = DIB_GetSource(SourceSurf, SourceGDI, sx + (i - DestRect->left), sy, ColorTranslation); - } - if (UsesPattern) - { - /* FIXME: No support for pattern brushes. */ - Pattern = (Brush->iSolidColor & 0xFF) | - ((Brush->iSolidColor & 0xFF) << 8) | - ((Brush->iSolidColor & 0xFF) << 16) | - ((Brush->iSolidColor & 0xFF) << 24); - } - DIB_8BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xFFFF); - Dest >>= 8; - } - } - sy++; + UsesPattern = FALSE; + } else + if (Brush->iSolidColor == 0xFFFFFFFF) + { + PBITMAPOBJ PatternBitmap; + + GdiBrush = CONTAINING_RECORD( + Brush, + GDIBRUSHOBJ, + BrushObject); + + PatternBitmap = BITMAPOBJ_LockBitmap(GdiBrush->hbmPattern); + PatternSurface = BitmapToSurf(PatternBitmap, NULL); + BITMAPOBJ_UnlockBitmap(GdiBrush->hbmPattern); + + PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); + PatternWidth = PatternObj->sizlBitmap.cx; + PatternHeight = PatternObj->sizlBitmap.cy; } - } - return TRUE; + } + + RoundedRight = DestRect->right - ((DestRect->right - DestRect->left) & 0x3); + sy = SourcePoint->y; + + for (j = DestRect->top; j < DestRect->bottom; j++) + { + sx = SourcePoint->x; + DestBits = (PULONG)(DestSurf->pvScan0 + DestRect->left + j * DestSurf->lDelta); + + for (i = DestRect->left; i < RoundedRight; i += 4, DestBits++) + { + Dest = *DestBits; + + if (UsesSource) + { + Source = 0; + for (k = 0; k < 4; k++) + Source |= (DIB_GetSource(SourceSurf, SourceGDI, sx + (i - DestRect->left) + k, sy, ColorTranslation) << (k * 8)); + } + + if (UsesPattern) + { + if (Brush->iSolidColor == 0xFFFFFFFF) + { + Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 1) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 8; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 2) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 16; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 3) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 24; + } + else + { + Pattern = (Brush->iSolidColor & 0xFF) | + ((Brush->iSolidColor & 0xFF) << 8) | + ((Brush->iSolidColor & 0xFF) << 16) | + ((Brush->iSolidColor & 0xFF) << 24); + } + } + *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); + } + + if (i < DestRect->right) + { + Dest = *DestBits; + for (; i < DestRect->right; i++) + { + if (UsesSource) + { + Source = DIB_GetSource(SourceSurf, SourceGDI, sx + (i - DestRect->left), sy, ColorTranslation); + } + + if (UsesPattern) + { + if (Brush->iSolidColor == 0xFFFFFFFF) + Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack; + else + Pattern = Brush->iSolidColor & 0xFF; + } + + DIB_8BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xFFFF); + Dest >>= 8; + } + } + + sy++; + } + + if (PatternSurface != NULL) + EngDeleteSurface(PatternSurface); + + return TRUE; } /* @@ -393,7 +451,7 @@ void ScaleRectAvg8(PIXEL *Target, PIXEL *Source, int SrcWidth, int SrcHeight, int TgtWidth, int TgtHeight, int srcPitch, int dstPitch) { int NumPixels = TgtHeight; - int IntPart = ((SrcHeight / TgtHeight) * srcPitch) >> 1; //(SrcHeight / TgtHeight) * SrcWidth; + int IntPart = ((SrcHeight / TgtHeight) * srcPitch); //(SrcHeight / TgtHeight) * SrcWidth; int FractPart = SrcHeight % TgtHeight; int Mid = TgtHeight >> 1; int E = 0; diff --git a/reactos/subsys/win32k/eng/bitblt.c b/reactos/subsys/win32k/eng/bitblt.c index 532974773d8..bc094eefc3a 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.43 2004/03/22 14:58:56 weiden Exp $ +/* $Id: bitblt.c,v 1.44 2004/04/05 21:26:24 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -109,41 +109,74 @@ BltMask(SURFOBJ* Dest, POINTL* BrushPoint, ROP4 Rop4) { - LONG i, j, dx, dy, c8; - BYTE *tMask, *lMask; - static BYTE maskbit[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }; + LONG i, j, dx, dy, c8; + BYTE *tMask, *lMask; + static BYTE maskbit[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }; + /* Pattern brushes */ + PGDIBRUSHOBJ GdiBrush; + HBITMAP PatternSurface = NULL; + PSURFOBJ PatternObj; + ULONG PatternWidth, PatternHeight; - dx = DestRect->right - DestRect->left; - dy = DestRect->bottom - DestRect->top; + if (Mask == NULL) + { + return FALSE; + } - if (Mask != NULL) - { - tMask = Mask->pvBits + SourcePoint->y * Mask->lDelta + (SourcePoint->x >> 3); - for (j = 0; j < dy; j++) - { - lMask = tMask; - c8 = SourcePoint->x & 0x07; - for (i = 0; i < dx; i++) - { - if (0 != (*lMask & maskbit[c8])) - { - DestGDI->DIB_PutPixel(Dest, DestRect->left + i, DestRect->top + j, Brush->iSolidColor); - } - c8++; - if (8 == c8) - { - lMask++; - c8=0; - } - } - tMask += Mask->lDelta; - } - return TRUE; - } - else - { - return FALSE; - } + dx = DestRect->right - DestRect->left; + dy = DestRect->bottom - DestRect->top; + + if (Brush->iSolidColor == 0xFFFFFFFF) + { + PBITMAPOBJ PatternBitmap; + + GdiBrush = CONTAINING_RECORD( + Brush, + GDIBRUSHOBJ, + BrushObject); + + PatternBitmap = BITMAPOBJ_LockBitmap(GdiBrush->hbmPattern); + PatternSurface = BitmapToSurf(PatternBitmap, Dest->hdev); + BITMAPOBJ_UnlockBitmap(GdiBrush->hbmPattern); + + PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); + PatternWidth = PatternObj->sizlBitmap.cx; + PatternHeight = PatternObj->sizlBitmap.cy; + } + + tMask = Mask->pvScan0 + SourcePoint->y * Mask->lDelta + (SourcePoint->x >> 3); + for (j = 0; j < dy; j++) + { + lMask = tMask; + c8 = SourcePoint->x & 0x07; + for (i = 0; i < dx; i++) + { + if (0 != (*lMask & maskbit[c8])) + { + if (PatternSurface == NULL) + { + DestGDI->DIB_PutPixel(Dest, DestRect->left + i, DestRect->top + j, Brush->iSolidColor); + } + else + { + DestGDI->DIB_PutPixel(Dest, DestRect->left + i, DestRect->top + j, + DIB_1BPP_GetPixel(PatternObj, (DestRect->left + i) % PatternWidth, (DestRect->top + j) % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack); + } + } + c8++; + if (8 == c8) + { + lMask++; + c8 = 0; + } + } + tMask += Mask->lDelta; + } + + if (PatternSurface != NULL) + EngDeleteSurface(PatternSurface); + + return TRUE; } static BOOLEAN STDCALL @@ -345,7 +378,14 @@ EngBitBlt(SURFOBJ *DestObj, } else if (PATCOPY == Rop4) { +#if 0 BltRectFunc = BltPatCopy; +#else + if (Brush->iSolidColor == 0xFFFFFFFF) + BltRectFunc = CallDibBitBlt; + else + BltRectFunc = BltPatCopy; +#endif } else { diff --git a/reactos/subsys/win32k/include/object.h b/reactos/subsys/win32k/include/object.h index 4d166532a44..b2a2b931e7f 100644 --- a/reactos/subsys/win32k/include/object.h +++ b/reactos/subsys/win32k/include/object.h @@ -132,14 +132,6 @@ PPOINT FASTCALL GDI_Bezier (const POINT *Points, INT count, PINT nPtsOut); /* objects/objconv.c */ -BRUSHOBJ* -FASTCALL -PenToBrushObj(BRUSHOBJ *brush, PENOBJ *pen); - -BRUSHOBJ* -FASTCALL -HPenToBrushObj ( BRUSHOBJ *brush, HPEN hpen ); - HBITMAP FASTCALL BitmapToSurf ( PBITMAPOBJ BitmapObj, HDEV GDIDevice ); diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index 27d9013cfef..1181245dd7d 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.66 2004/04/03 21:25:20 weiden Exp $ */ +/* $Id: bitmaps.c,v 1.67 2004/04/05 21:26:25 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -62,7 +62,7 @@ NtGdiBitBlt( PXLATEOBJ XlateObj = NULL; HPALETTE SourcePalette, DestPalette; ULONG SourceMode, DestMode; - PBRUSHOBJ BrushObj; + PGDIBRUSHOBJ BrushObj; BOOL UsesSource = ((ROP & 0xCC0000) >> 2) != (ROP & 0x330000); BOOL UsesPattern = TRUE;//((ROP & 0xF00000) >> 4) != (ROP & 0x0F0000); HPALETTE Mono = NULL; @@ -244,7 +244,7 @@ NtGdiBitBlt( /* Perform the bitblt operation */ Status = IntEngBitBlt(SurfDest, SurfSrc, NULL, DCDest->CombinedClip, XlateObj, - &DestRect, &SourcePoint, NULL, BrushObj, NULL, ROP); + &DestRect, &SourcePoint, NULL, &BrushObj->BrushObject, NULL, ROP); EngDeleteXlate(XlateObj); if (NULL != Mono) @@ -1099,7 +1099,7 @@ NtGdiStretchBlt( PXLATEOBJ XlateObj = NULL; HPALETTE SourcePalette, DestPalette; ULONG SourceMode, DestMode; - PBRUSHOBJ BrushObj; + PGDIBRUSHOBJ BrushObj; BOOL UsesSource = ((ROP & 0xCC0000) >> 2) != (ROP & 0x330000); BOOL UsesPattern = ((ROP & 0xF00000) >> 4) != (ROP & 0x0F0000); @@ -1307,7 +1307,7 @@ BITMAPOBJ_GetWidthBytes (INT bmWidth, INT bpp) return -1; #endif - return ((bmWidth * bpp + 31) & ~31) >> 3; + return ((bmWidth * bpp + 15) & ~15) >> 3; } HBITMAP FASTCALL diff --git a/reactos/subsys/win32k/objects/brush.c b/reactos/subsys/win32k/objects/brush.c index 988633f644b..5e25bbef477 100644 --- a/reactos/subsys/win32k/objects/brush.c +++ b/reactos/subsys/win32k/objects/brush.c @@ -1,24 +1,24 @@ /* - * ReactOS W32 Subsystem - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team + * ReactOS Win32 Subsystem * - * 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. + * Copyright (C) 1998 - 2004 ReactOS Team * - * 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. + * 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. * - * 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. + * 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.c,v 1.33 2004/04/05 21:26:25 navaraf Exp $ */ -/* $Id: brush.c,v 1.32 2004/02/19 21:12:10 weiden Exp $ - */ - #undef WIN32_LEAN_AND_MEAN #include @@ -26,375 +26,352 @@ #include #include #include -//#include #include #include #include #include - #define NDEBUG #include HBRUSH FASTCALL -IntGdiCreateBrushIndirect(PLOGBRUSH lb) +IntGdiCreateBrushIndirect(PLOGBRUSH LogBrush) { - PBRUSHOBJ brushPtr; - HBRUSH hBrush; + PGDIBRUSHOBJ BrushObject; + HBRUSH hBrush; - hBrush = BRUSHOBJ_AllocBrush(); - if (hBrush == NULL) - { - return 0; - } + hBrush = BRUSHOBJ_AllocBrush(); + if (hBrush == NULL) + { + SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); + return NULL; + } - brushPtr = BRUSHOBJ_LockBrush (hBrush); -/* FIXME: Occurs! FiN */ -/* ASSERT( brushPtr ); *///I want to know if this ever occurs + BrushObject = BRUSHOBJ_LockBrush(hBrush); - if( brushPtr ){ - brushPtr->iSolidColor = lb->lbColor; - brushPtr->logbrush.lbStyle = lb->lbStyle; - brushPtr->logbrush.lbColor = lb->lbColor; - brushPtr->logbrush.lbHatch = lb->lbHatch; + switch (LogBrush->lbStyle) + { + case BS_NULL: + BrushObject->flAttrs = GDIBRUSH_IS_NULL; + break; + + /* FIXME */ + case BS_HATCHED: - BRUSHOBJ_UnlockBrush( hBrush ); - return hBrush; - } - return NULL; -} + 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; -HBRUSH FASTCALL -IntGdiCreateDIBPatternBrush(HGLOBAL hDIBPacked, - UINT ColorSpec) -{ - return NULL; -#if 0 - LOGBRUSH logbrush; - PBITMAPINFO info, newInfo; - INT size; + case BS_PATTERN: + BrushObject->flAttrs = GDIBRUSH_IS_BITMAP; + BrushObject->hbmPattern = BITMAPOBJ_CopyBitmap((HBITMAP)LogBrush->lbHatch); + BrushObject->BrushObject.iSolidColor = 0xFFFFFFFF; + /* FIXME: Fill in the rest of fields!!! */ + break; - DPRINT("%04x\n", hbitmap ); + default: + DPRINT1("Brush Style: %d\n", LogBrush->lbStyle); + UNIMPLEMENTED; + } - logbrush.lbStyle = BS_DIBPATTERN; - logbrush.lbColor = coloruse; - logbrush.lbHatch = 0; - - /* Make a copy of the bitmap */ - if (!(info = (BITMAPINFO *)GlobalLock( hbitmap ))) - { - return 0; - } - - - if (info->bmiHeader.biCompression) size = info->bmiHeader.biSizeImage; - else - size = DIB_GetDIBImageBytes(info->bmiHeader.biWidth, info->bmiHeader.biHeight, info->bmiHeader.biBitCount); - size += DIB_BitmapInfoSize(info, coloruse); - - if (!(logbrush.lbHatch = (INT)GlobalAlloc16( GMEM_MOVEABLE, size ))) - { - GlobalUnlock16( hbitmap ); - return 0; - } - newInfo = (BITMAPINFO *) GlobalLock16((HGLOBAL16)logbrush.lbHatch); - memcpy(newInfo, info, size); - GlobalUnlock16((HGLOBAL16)logbrush.lbHatch); - GlobalUnlock(hbitmap); - return IntGdiCreateBrushIndirect(&logbrush); -#endif -} - -HBRUSH FASTCALL -IntGdiCreateDIBPatternBrushPt(CONST VOID *PackedDIB, - UINT Usage) -{ - INT size; - LOGBRUSH logbrush; - PBITMAPINFO info; - PBITMAPINFO newInfo; - - info = (BITMAPINFO *) PackedDIB; - if (info == NULL) - { - return 0; - } - DPRINT ("%p %ldx%ld %dbpp\n", - info, - info->bmiHeader.biWidth, - info->bmiHeader.biHeight, - info->bmiHeader.biBitCount); - - logbrush.lbStyle = BS_DIBPATTERN; - logbrush.lbColor = Usage; - logbrush.lbHatch = 0; - - /* Make a copy of the bitmap */ - - if (info->bmiHeader.biCompression) - { - size = info->bmiHeader.biSizeImage; - } - else - { - size = DIB_GetDIBImageBytes (info->bmiHeader.biWidth, info->bmiHeader.biHeight, info->bmiHeader.biBitCount); - } - size += DIB_BitmapInfoSize (info, Usage); - - logbrush.lbHatch = (LONG) GDIOBJ_AllocObj(size, GDI_OBJECT_TYPE_DONTCARE, NULL); - if (logbrush.lbHatch == 0) - { - return 0; - } - newInfo = (PBITMAPINFO) GDIOBJ_LockObj ((HGDIOBJ) logbrush.lbHatch, GDI_OBJECT_TYPE_DONTCARE); - ASSERT(newInfo); - memcpy(newInfo, info, size); - GDIOBJ_UnlockObj((HGDIOBJ) logbrush.lbHatch, GDI_OBJECT_TYPE_DONTCARE); - - return IntGdiCreateBrushIndirect (&logbrush); + BRUSHOBJ_UnlockBrush(hBrush); + return hBrush; } BOOL FASTCALL -IntPatBlt(DC *dc, - INT XLeft, - INT YLeft, - INT Width, - INT Height, - DWORD ROP, - PBRUSHOBJ BrushObj) +IntPatBlt( + PDC dc, + INT XLeft, + INT YLeft, + INT Width, + INT Height, + DWORD ROP, + PGDIBRUSHOBJ BrushObj) { - RECT DestRect; - PSURFOBJ SurfObj; - BOOL ret; + RECT DestRect; + PSURFOBJ SurfObj; + BOOL ret; - SurfObj = (SURFOBJ*)AccessUserObject((ULONG)dc->Surface); - if (NULL == SurfObj) - { + SurfObj = (SURFOBJ *)AccessUserObject((ULONG)dc->Surface); + if (SurfObj == NULL) + { SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; - } + } - assert(BrushObj); - if (BrushObj->logbrush.lbStyle != BS_NULL) - { + ASSERT(BrushObj); + if (!(BrushObj->flAttrs & GDIBRUSH_IS_NULL)) + { if (Width > 0) - { - DestRect.left = XLeft + dc->w.DCOrgX; - DestRect.right = XLeft + Width + dc->w.DCOrgX; - } + { + DestRect.left = XLeft + dc->w.DCOrgX; + DestRect.right = XLeft + Width + dc->w.DCOrgX; + } else - { - DestRect.left = XLeft + Width + 1 + dc->w.DCOrgX; - DestRect.right = XLeft + dc->w.DCOrgX + 1; - } - if (Height > 0) - { - DestRect.top = YLeft + dc->w.DCOrgY; - DestRect.bottom = YLeft + Height + dc->w.DCOrgY; - } - else - { - DestRect.top = YLeft + Height + dc->w.DCOrgY + 1; - DestRect.bottom = YLeft + dc->w.DCOrgY + 1; - } - ret = IntEngBitBlt(SurfObj, - NULL, - NULL, - dc->CombinedClip, - NULL, - &DestRect, - NULL, - NULL, - BrushObj, - NULL, - ROP); - } + { + DestRect.left = XLeft + Width + 1 + dc->w.DCOrgX; + DestRect.right = XLeft + dc->w.DCOrgX + 1; + } - return ret; + if (Height > 0) + { + DestRect.top = YLeft + dc->w.DCOrgY; + DestRect.bottom = YLeft + Height + dc->w.DCOrgY; + } + else + { + DestRect.top = YLeft + Height + dc->w.DCOrgY + 1; + DestRect.bottom = YLeft + dc->w.DCOrgY + 1; + } + + ret = IntEngBitBlt( + SurfObj, + NULL, + NULL, + dc->CombinedClip, + NULL, + &DestRect, + NULL, + NULL, + &BrushObj->BrushObject, + NULL, + ROP); + } + + return ret; } BOOL FASTCALL -IntGdiPolyPatBlt(HDC hDC, - DWORD dwRop, - PPATRECT pRects, - int cRects, - ULONG Reserved) +IntGdiPolyPatBlt( + HDC hDC, + DWORD dwRop, + PPATRECT pRects, + int cRects, + ULONG Reserved) { - int i; - PPATRECT r; - PBRUSHOBJ BrushObj; - DC *dc; + int i; + PPATRECT r; + PGDIBRUSHOBJ BrushObj; + DC *dc; - dc = DC_LockDc(hDC); - if (dc == NULL) - { - SetLastWin32Error(ERROR_INVALID_HANDLE); - return(FALSE); - } - - for (r = pRects, i = 0; i < cRects; i++) - { - BrushObj = BRUSHOBJ_LockBrush(r->hBrush); - IntPatBlt(dc,r->r.left,r->r.top,r->r.right,r->r.bottom,dwRop,BrushObj); - BRUSHOBJ_UnlockBrush(r->hBrush); - r++; - } - DC_UnlockDc( hDC ); - - return(TRUE); -} - -/******************************************************************************/ - -HBRUSH STDCALL NtGdiCreateBrushIndirect(CONST LOGBRUSH *lb) -{ - LOGBRUSH Safelb; - NTSTATUS Status; - - Status = MmCopyFromCaller(&Safelb, lb, sizeof(LOGBRUSH)); - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return 0; - } - - return IntGdiCreateBrushIndirect(&Safelb); -} - -HBRUSH STDCALL NtGdiCreateDIBPatternBrush(HGLOBAL hDIBPacked, - UINT ColorSpec) -{ - /* IntGdiCreateDIBPatternBrush() */ - UNIMPLEMENTED; -} - -HBRUSH STDCALL NtGdiCreateDIBPatternBrushPt(CONST VOID *PackedDIB, - UINT Usage) -{ - /* FIXME - copy PackedDIB memory first! */ - return IntGdiCreateDIBPatternBrushPt(PackedDIB, Usage); -} - -HBRUSH STDCALL NtGdiCreateHatchBrush(INT Style, - COLORREF Color) -{ - LOGBRUSH logbrush; - - DPRINT("%d %06lx\n", Style, Color); - - if (Style < 0 || Style >= NB_HATCH_STYLES) - { - return 0; - } - logbrush.lbStyle = BS_HATCHED; - logbrush.lbColor = Color; - logbrush.lbHatch = Style; - - return IntGdiCreateBrushIndirect (&logbrush); -} - -HBRUSH STDCALL NtGdiCreatePatternBrush(HBITMAP hBitmap) -{ - LOGBRUSH logbrush = { BS_PATTERN, 0, 0 }; - - DPRINT ("%04x\n", hBitmap); - logbrush.lbHatch = (INT) BITMAPOBJ_CopyBitmap (hBitmap); - if(!logbrush.lbHatch) - { - return 0; - } - else - { - return IntGdiCreateBrushIndirect( &logbrush ); - } -} - -HBRUSH STDCALL NtGdiCreateSolidBrush(COLORREF Color) -{ - LOGBRUSH logbrush; - - logbrush.lbStyle = BS_SOLID; - logbrush.lbColor = Color; - logbrush.lbHatch = 0; - - return IntGdiCreateBrushIndirect(&logbrush); -} - -BOOL STDCALL NtGdiFixBrushOrgEx(VOID) -{ - return FALSE; -} - -BOOL STDCALL NtGdiPolyPatBlt(HDC hDC, - DWORD dwRop, - PPATRECT pRects, - int cRects, - ULONG Reserved) -{ - PPATRECT rb; - NTSTATUS Status; - BOOL Ret; - - if(cRects > 0) - { - rb = ExAllocatePoolWithTag(PagedPool, sizeof(PATRECT) * cRects, TAG_PATBLT); - if(!rb) - { - SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; - } - Status = MmCopyFromCaller(rb, pRects, sizeof(PATRECT) * cRects); - if(!NT_SUCCESS(Status)) - { - ExFreePool(rb); - SetLastNtError(Status); - return FALSE; - } - } - - Ret = IntGdiPolyPatBlt(hDC, dwRop, pRects, cRects, Reserved); - - if(cRects > 0) - ExFreePool(rb); - return Ret; -} - -BOOL STDCALL NtGdiPatBlt(HDC hDC, - INT XLeft, - INT YLeft, - INT Width, - INT Height, - DWORD ROP) -{ - PBRUSHOBJ BrushObj; - DC *dc = DC_LockDc(hDC); - BOOL ret; - - if (NULL == dc) - { + dc = DC_LockDc(hDC); + if (dc == NULL) + { SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; - } + } + + for (r = pRects, i = 0; i < cRects; i++) + { + BrushObj = BRUSHOBJ_LockBrush(r->hBrush); + IntPatBlt( + dc, + r->r.left, + r->r.top, + r->r.right, + r->r.bottom, + dwRop, + BrushObj); + BRUSHOBJ_UnlockBrush(r->hBrush); + r++; + } - BrushObj = BRUSHOBJ_LockBrush(dc->w.hBrush); - if (NULL == BrushObj) - { + DC_UnlockDc( hDC ); + + return TRUE; +} + +/* PUBLIC FUNCTIONS ***********************************************************/ + +HBRUSH STDCALL +NtGdiCreateBrushIndirect(CONST LOGBRUSH *LogBrush) +{ + LOGBRUSH SafeLogBrush; + NTSTATUS Status; + + Status = MmCopyFromCaller(&SafeLogBrush, LogBrush, sizeof(LOGBRUSH)); + if (!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return 0; + } + + return IntGdiCreateBrushIndirect(&SafeLogBrush); +} + +HBRUSH STDCALL +NtGdiCreateDIBPatternBrush(HGLOBAL hDIBPacked, UINT ColorSpec) +{ + UNIMPLEMENTED; + return 0; +} + +HBRUSH STDCALL +NtGdiCreateDIBPatternBrushPt(CONST VOID *PackedDIB, UINT Usage) +{ + UNIMPLEMENTED; + return 0; +} + +HBRUSH STDCALL +NtGdiCreateHatchBrush(INT Style, COLORREF Color) +{ + LOGBRUSH LogBrush; + + if (Style < 0 || Style >= NB_HATCH_STYLES) + return 0; + + LogBrush.lbStyle = BS_HATCHED; + LogBrush.lbColor = Color; + LogBrush.lbHatch = Style; + + return IntGdiCreateBrushIndirect(&LogBrush); +} + +HBRUSH STDCALL +NtGdiCreatePatternBrush(HBITMAP hBitmap) +{ + LOGBRUSH LogBrush; + + LogBrush.lbStyle = BS_PATTERN; + LogBrush.lbColor = 0; + LogBrush.lbHatch = (ULONG)hBitmap; + + return IntGdiCreateBrushIndirect(&LogBrush); +} + +HBRUSH STDCALL +NtGdiCreateSolidBrush(COLORREF Color) +{ + LOGBRUSH LogBrush; + + LogBrush.lbStyle = BS_SOLID; + LogBrush.lbColor = Color; + LogBrush.lbHatch = 0; + + return IntGdiCreateBrushIndirect(&LogBrush); +} + +BOOL STDCALL +NtGdiFixBrushOrgEx(VOID) +{ + return FALSE; +} + +/* + * NtGdiSetBrushOrgEx + * + * The NtGdiSetBrushOrgEx function sets the brush origin that GDI assigns to + * the next brush an application selects into the specified device context. + * + * Status + * @implemented + */ + +BOOL STDCALL +NtGdiSetBrushOrgEx(HDC hDC, INT XOrg, INT YOrg, LPPOINT Point) +{ + PDC dc = DC_LockDc(hDC); + if (dc == NULL) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } + + if (Point != NULL) + { + POINT SafePoint; + SafePoint.x = dc->w.brushOrgX; + SafePoint.y = dc->w.brushOrgY; + MmCopyToCaller(Point, &SafePoint, sizeof(POINT)); + } + + dc->w.brushOrgX = XOrg; + dc->w.brushOrgY = YOrg; + DC_UnlockDc(hDC); + + return TRUE; +} + +BOOL STDCALL +NtGdiPolyPatBlt( + HDC hDC, + DWORD dwRop, + PPATRECT pRects, + INT cRects, + ULONG Reserved) +{ + PPATRECT rb; + NTSTATUS Status; + BOOL Ret; + + if (cRects > 0) + { + rb = ExAllocatePoolWithTag(PagedPool, sizeof(PATRECT) * cRects, TAG_PATBLT); + if (!rb) + { + SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + Status = MmCopyFromCaller(rb, pRects, sizeof(PATRECT) * cRects); + if (!NT_SUCCESS(Status)) + { + ExFreePool(rb); + SetLastNtError(Status); + return FALSE; + } + } + + Ret = IntGdiPolyPatBlt(hDC, dwRop, pRects, cRects, Reserved); + + if (cRects > 0) + ExFreePool(rb); + + return Ret; +} + +BOOL STDCALL +NtGdiPatBlt( + HDC hDC, + INT XLeft, + INT YLeft, + INT Width, + INT Height, + DWORD ROP) +{ + PGDIBRUSHOBJ BrushObj; + DC *dc = DC_LockDc(hDC); + BOOL ret; + + if (dc == NULL) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } + + BrushObj = BRUSHOBJ_LockBrush(dc->w.hBrush); + if (BrushObj == NULL) + { SetLastWin32Error(ERROR_INVALID_HANDLE); DC_UnlockDc(hDC); return FALSE; - } + } - ret = IntPatBlt(dc,XLeft,YLeft,Width,Height,ROP,BrushObj); + ret = IntPatBlt( + dc, + XLeft, + YLeft, + Width, + Height, + ROP, + BrushObj); - BRUSHOBJ_UnlockBrush(dc->w.hBrush); - DC_UnlockDc(hDC); - return ret; + BRUSHOBJ_UnlockBrush(dc->w.hBrush); + DC_UnlockDc(hDC); + + return ret; } -BOOL STDCALL NtGdiSetBrushOrgEx(HDC hDC, - INT XOrg, - INT YOrg, - LPPOINT Point) -{ - UNIMPLEMENTED; -} /* EOF */ diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index 6733eb45118..c701346e884 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.125 2004/03/23 19:46:50 gvg Exp $ +/* $Id: dc.c,v 1.126 2004/04/05 21:26:25 navaraf Exp $ * * DC.C - Device context functions * @@ -995,13 +995,16 @@ NtGdiSetBkColor(HDC hDC, COLORREF color) { COLORREF oldColor; PDC dc = DC_LockDc(hDC); + HBRUSH hBrush; if ( !dc ) return 0x80000000; oldColor = dc->w.backgroundColor; dc->w.backgroundColor = color; + hBrush = dc->w.hBrush; DC_UnlockDc ( hDC ); + NtGdiSelectObject(hDC, hBrush); return oldColor; } @@ -1702,8 +1705,8 @@ NtGdiSelectObject(HDC hDC, HGDIOBJ hGDIObj) HGDIOBJ objOrg = NULL; // default to failure BITMAPOBJ *pb; PDC dc; - PPENOBJ pen; - PBRUSHOBJ brush; + PGDIBRUSHOBJ pen; + PGDIBRUSHOBJ brush; PXLATEOBJ XlateObj; PPALGDI PalGDI; DWORD objectType; @@ -1740,7 +1743,17 @@ NtGdiSelectObject(HDC hDC, HGDIOBJ hGDIObj) pen = PENOBJ_LockPen((HPEN) hGDIObj); if (NULL != pen) { - pen->iSolidColor = XLATEOBJ_iXlate(XlateObj, pen->logpen.lopnColor); + 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; @@ -1776,7 +1789,17 @@ NtGdiSelectObject(HDC hDC, HGDIOBJ hGDIObj) brush = BRUSHOBJ_LockBrush((HBRUSH) hGDIObj); if (NULL != brush) { - brush->iSolidColor = XLATEOBJ_iXlate(XlateObj, brush->logbrush.lbColor); + 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, dc->w.textColor); BRUSHOBJ_UnlockBrush((HBRUSH) hGDIObj); objOrg = (HGDIOBJ)dc->w.hBrush; dc->w.hBrush = (HBRUSH) hGDIObj; diff --git a/reactos/subsys/win32k/objects/fillshap.c b/reactos/subsys/win32k/objects/fillshap.c index 12dc3e8b5d3..4f63d61b8f5 100644 --- a/reactos/subsys/win32k/objects/fillshap.c +++ b/reactos/subsys/win32k/objects/fillshap.c @@ -16,11 +16,12 @@ * 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.45 2004/03/27 00:35:02 weiden Exp $ */ +/* $Id: fillshap.c,v 1.46 2004/04/05 21:26:25 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include +#include #include #include #include @@ -46,7 +47,7 @@ #define PUTPIXEL(x,y,brushObj) \ ret = ret && IntEngLineTo(SurfObj, \ dc->CombinedClip, \ - brushObj, \ + &brushObj->BrushObject, \ x, y, (x)+1, y, \ &RectBounds, \ dc->w.ROPmode); @@ -54,7 +55,7 @@ #define PUTLINE(x1,y1,x2,y2,brushObj) \ ret = ret && IntEngLineTo(SurfObj, \ dc->CombinedClip, \ - brushObj, \ + &brushObj->BrushObject, \ x1, y1, x2, y2, \ &RectBounds, \ dc->w.ROPmode); @@ -65,7 +66,7 @@ IntGdiPolygon(PDC dc, int Count) { SURFOBJ *SurfObj; - BRUSHOBJ PenBrushObj, *FillBrushObj; + PGDIBRUSHOBJ PenBrushObj, FillBrushObj; BOOL ret = FALSE; // default to failure PRECTL RectBounds; RECTL DestRect; @@ -113,16 +114,16 @@ IntGdiPolygon(PDC dc, /* 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 ); + if (!(FillBrushObj->flAttrs & GDIBRUSH_IS_NULL)) + ret = FillPolygon ( dc, SurfObj, &FillBrushObj->BrushObject, dc->w.ROPmode, UnsafePoints, Count, DestRect ); BRUSHOBJ_UnlockBrush(dc->w.hBrush); #endif - /* make BRUSHOBJ from current pen. */ - HPenToBrushObj ( &PenBrushObj, dc->w.hPen ); + /* get BRUSHOBJ from current pen. */ + PenBrushObj = PENOBJ_LockPen(dc->w.hPen); // Draw the Polygon Edges with the current pen ( if not a NULL pen ) - if ( PenBrushObj.logbrush.lbStyle != BS_NULL ) + if (!(PenBrushObj->flAttrs & GDIBRUSH_IS_NULL)) { for ( CurrentPoint = 0; CurrentPoint < Count; ++CurrentPoint ) { @@ -141,7 +142,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(SurfObj, dc->CombinedClip, - &PenBrushObj, + &PenBrushObj->BrushObject, From.x, From.y, To.x, @@ -160,6 +161,7 @@ IntGdiPolygon(PDC dc, #endif } + PENOBJ_UnlockPen( dc->w.hPen ); RGNDATA_UnlockRgn(dc->w.hGCClipRgn); return ret; @@ -239,8 +241,7 @@ NtGdiEllipse( int CenterX, CenterY; int RadiusX, RadiusY; int Temp; - BRUSHOBJ PenBrush; - PBRUSHOBJ FillBrush; + PGDIBRUSHOBJ FillBrush, PenBrush; PSURFOBJ SurfObj; RECTL RectBounds; PDC dc; @@ -275,8 +276,16 @@ NtGdiEllipse( return FALSE; } + PenBrush = PENOBJ_LockPen(dc->w.hPen); + if (NULL == PenBrush) + { + PENOBJ_UnlockPen(dc->w.hPen); + DC_UnlockDc(hDC); + SetLastWin32Error(ERROR_INTERNAL_ERROR); + return FALSE; + } + SurfObj = (PSURFOBJ)AccessUserObject((ULONG)dc->Surface); - HPenToBrushObj(&PenBrush, dc->w.hPen); nLeftRect += dc->w.DCOrgX; nRightRect += dc->w.DCOrgX - 1; @@ -370,32 +379,33 @@ NtGdiEllipse( if (Cond1) { - PUTPIXEL(CenterX + C, CenterY + B, &PenBrush); + PUTPIXEL(CenterX + C, CenterY + B, PenBrush); if (C) - PUTPIXEL(CenterX - C, CenterY + B, &PenBrush); + PUTPIXEL(CenterX - C, CenterY + B, PenBrush); if (B) { - PUTPIXEL(CenterX + C, CenterY - B, &PenBrush); + PUTPIXEL(CenterX + C, CenterY - B, PenBrush); if (C) - PUTPIXEL(CenterX - C, CenterY - B, &PenBrush); + PUTPIXEL(CenterX - C, CenterY - B, PenBrush); } } if (Cond2) { - PUTPIXEL(CenterX + D, CenterY + A, &PenBrush); + PUTPIXEL(CenterX + D, CenterY + A, PenBrush); if (D) - PUTPIXEL(CenterX - D, CenterY + A, &PenBrush); + PUTPIXEL(CenterX - D, CenterY + A, PenBrush); if (A) { - PUTPIXEL(CenterX + D, CenterY - A, &PenBrush); + PUTPIXEL(CenterX + D, CenterY - A, PenBrush); if (D) - PUTPIXEL(CenterX - D, CenterY - A, &PenBrush); + PUTPIXEL(CenterX - D, CenterY - A, PenBrush); } } } while (B > A); BRUSHOBJ_UnlockBrush(dc->w.hBrush); + PENOBJ_UnlockPen(dc->w.hPen); DC_UnlockDc(hDC); return ret; @@ -945,7 +955,7 @@ IntRectangle(PDC dc, int BottomRect) { SURFOBJ *SurfObj = (SURFOBJ*)AccessUserObject((ULONG)dc->Surface); - BRUSHOBJ PenBrushObj, *FillBrushObj; + PGDIBRUSHOBJ PenBrushObj, FillBrushObj; BOOL ret = FALSE; // default to failure RECTL DestRect; @@ -971,7 +981,7 @@ IntRectangle(PDC dc, if ( FillBrushObj ) { - if ( FillBrushObj->logbrush.lbStyle != BS_NULL ) + if (!(FillBrushObj->flAttrs & GDIBRUSH_IS_NULL)) { ret = IntEngBitBlt(SurfObj, NULL, @@ -981,7 +991,7 @@ IntRectangle(PDC dc, &DestRect, NULL, NULL, - FillBrushObj, + &FillBrushObj->BrushObject, NULL, PATCOPY); } @@ -989,43 +999,50 @@ IntRectangle(PDC dc, BRUSHOBJ_UnlockBrush(dc->w.hBrush); - /* make BRUSHOBJ from current pen. */ - HPenToBrushObj ( &PenBrushObj, dc->w.hPen ); + /* get BRUSHOBJ from current pen. */ + PenBrushObj = PENOBJ_LockPen(dc->w.hPen); + if (PenBrushObj == NULL) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } // Draw the rectangle with the current pen ret = TRUE; // change default to success - if ( PenBrushObj.logbrush.lbStyle != BS_NULL ) + if (!(PenBrushObj->flAttrs & GDIBRUSH_IS_NULL)) { ret = ret && IntEngLineTo(SurfObj, dc->CombinedClip, - &PenBrushObj, + &PenBrushObj->BrushObject, LeftRect, TopRect, RightRect, TopRect, &DestRect, // Bounding rectangle dc->w.ROPmode); // MIX ret = ret && IntEngLineTo(SurfObj, dc->CombinedClip, - &PenBrushObj, + &PenBrushObj->BrushObject, RightRect, TopRect, RightRect, BottomRect, &DestRect, // Bounding rectangle dc->w.ROPmode); // MIX ret = ret && IntEngLineTo(SurfObj, dc->CombinedClip, - &PenBrushObj, + &PenBrushObj->BrushObject, RightRect, BottomRect, LeftRect, BottomRect, &DestRect, // Bounding rectangle dc->w.ROPmode); // MIX ret = ret && IntEngLineTo(SurfObj, dc->CombinedClip, - &PenBrushObj, + &PenBrushObj->BrushObject, LeftRect, BottomRect, LeftRect, TopRect, &DestRect, // Bounding rectangle dc->w.ROPmode); // MIX */ } + + PENOBJ_UnlockPen(dc->w.hPen); } /* Move current position in DC? @@ -1071,7 +1088,7 @@ IntRoundRect( int yCurveDiameter) { SURFOBJ *SurfObj; - BRUSHOBJ PenBrush, *PenBrushObj, *FillBrushObj; + PGDIBRUSHOBJ PenBrushObj, FillBrushObj; RECTL RectBounds; int i, col, row, width, height, x1, x1start, x2, x2start, y1, y2; int xradius, yradius; @@ -1106,14 +1123,19 @@ IntRoundRect( FillBrushObj = BRUSHOBJ_LockBrush(dc->w.hBrush); ASSERT(FillBrushObj); - if ( FillBrushObj->logbrush.lbStyle == BS_NULL ) + if (FillBrushObj->flAttrs & GDIBRUSH_IS_NULL) + { + BRUSHOBJ_UnlockBrush(dc->w.hBrush); FillBrushObj = NULL; // make null brush check simpler... + } - HPenToBrushObj ( &PenBrush, dc->w.hPen ); - if ( PenBrush.logbrush.lbStyle != BS_NULL ) - PenBrushObj = &PenBrush; - else + PenBrushObj = PENOBJ_LockPen(dc->w.hPen); + ASSERT(PenBrushObj); + if (PenBrushObj->flAttrs & GDIBRUSH_IS_NULL) + { + PENOBJ_UnlockPen(dc->w.hPen); PenBrushObj = NULL; + } right--; bottom--; @@ -1292,6 +1314,7 @@ IntRoundRect( PUTLINE ( left, y2, left, y1, PenBrushObj ); } + PENOBJ_UnlockPen(dc->w.hPen); BRUSHOBJ_UnlockBrush(dc->w.hBrush); return ret; diff --git a/reactos/subsys/win32k/objects/gdiobj.c b/reactos/subsys/win32k/objects/gdiobj.c index a20bbcd68b9..07a2260dfac 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.64 2004/04/03 20:33:39 gvg Exp $ + * $Id: gdiobj.c,v 1.65 2004/04/05 21:26:25 navaraf Exp $ * */ @@ -110,8 +110,8 @@ GDI_OBJ_SIZE ObjSizes[] = {GDI_OBJECT_TYPE_BITMAP, sizeof(BITMAPOBJ)}, {GDI_OBJECT_TYPE_DC, sizeof(DC)}, {GDI_OBJECT_TYPE_PALETTE, sizeof(PALGDI)}, - {GDI_OBJECT_TYPE_BRUSH, sizeof(BRUSHOBJ)}, - {GDI_OBJECT_TYPE_PEN, sizeof(PENOBJ)}, + {GDI_OBJECT_TYPE_BRUSH, sizeof(GDIBRUSHOBJ)}, + {GDI_OBJECT_TYPE_PEN, sizeof(GDIBRUSHOBJ)}, {GDI_OBJECT_TYPE_FONT, sizeof(TEXTOBJ)}, {GDI_OBJECT_TYPE_DCE, sizeof(DCE)}, /* diff --git a/reactos/subsys/win32k/objects/line.c b/reactos/subsys/win32k/objects/line.c index 2048e216308..ae45f631531 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.27 2004/02/19 21:12:10 weiden Exp $ */ +/* $Id: line.c,v 1.28 2004/04/05 21:26:25 navaraf Exp $ */ // Some code from the WINE project source (www.winehq.com) @@ -71,7 +71,7 @@ IntGdiLineTo(DC *dc, { SURFOBJ *SurfObj; BOOL Ret; - BRUSHOBJ PenBrushObj; + PGDIBRUSHOBJ PenBrushObj; RECT Bounds; SurfObj = (SURFOBJ*)AccessUserObject ( (ULONG)dc->Surface ); @@ -119,16 +119,22 @@ IntGdiLineTo(DC *dc, Bounds.top += dc->w.DCOrgY; Bounds.bottom += dc->w.DCOrgY; - /* make BRUSHOBJ from current pen. */ - HPenToBrushObj ( &PenBrushObj, dc->w.hPen ); + /* get BRUSHOBJ from current pen. */ + PenBrushObj = PENOBJ_LockPen( dc->w.hPen ); + ASSERT(PenBrushObj); - Ret = IntEngLineTo(SurfObj, - dc->CombinedClip, - &PenBrushObj, - dc->w.DCOrgX + dc->w.CursPosX, dc->w.DCOrgY + dc->w.CursPosY, - dc->w.DCOrgX + XEnd, dc->w.DCOrgY + YEnd, - &Bounds, - dc->w.ROPmode); + if (!(PenBrushObj->flAttrs & GDIBRUSH_IS_NULL)) + { + Ret = IntEngLineTo(SurfObj, + dc->CombinedClip, + &PenBrushObj->BrushObject, + dc->w.DCOrgX + dc->w.CursPosX, dc->w.DCOrgY + dc->w.CursPosY, + dc->w.DCOrgX + XEnd, dc->w.DCOrgY + YEnd, + &Bounds, + dc->w.ROPmode); + } + + PENOBJ_UnlockPen( dc->w.hPen ); } if (Ret) @@ -209,7 +215,7 @@ IntGdiPolyline(DC *dc, BOOL ret = FALSE; // default to failure LONG i; PROSRGNDATA reg; - BRUSHOBJ PenBrushObj; + PGDIBRUSHOBJ PenBrushObj; POINT *pts; SurfObj = (SURFOBJ*)AccessUserObject((ULONG)dc->Surface); @@ -236,16 +242,22 @@ IntGdiPolyline(DC *dc, pts[i].y += dc->w.DCOrgY; } - /* make BRUSHOBJ from current pen. */ - HPenToBrushObj ( &PenBrushObj, dc->w.hPen ); + /* get BRUSHOBJ from current pen. */ + PenBrushObj = PENOBJ_LockPen( dc->w.hPen ); + ASSERT(PenBrushObj); - //get IntEngPolyline to do the drawing. - ret = IntEngPolyline(SurfObj, - dc->CombinedClip, - &PenBrushObj, - pts, - Count, - dc->w.ROPmode); + if (!(PenBrushObj->flAttrs & GDIBRUSH_IS_NULL)) + { + //get IntEngPolyline to do the drawing. + ret = IntEngPolyline(SurfObj, + dc->CombinedClip, + &PenBrushObj->BrushObject, + pts, + Count, + dc->w.ROPmode); + } + + PENOBJ_UnlockPen( dc->w.hPen ); } ExFreePool ( pts ); diff --git a/reactos/subsys/win32k/objects/objconv.c b/reactos/subsys/win32k/objects/objconv.c index c5d08647935..4858e3c2d00 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.15 2004/02/01 15:45:41 gvg Exp $ */ +/* $Id: objconv.c,v 1.16 2004/04/05 21:26:25 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include @@ -38,35 +38,6 @@ //#define NDEBUG #include - -BRUSHOBJ* -FASTCALL -PenToBrushObj ( BRUSHOBJ *brush, PENOBJ *pen ) -{ - ASSERT ( pen ); - ASSERT ( brush ); - memset ( brush, 0, sizeof(BRUSHOBJ) ); - if ( pen->logpen.lopnStyle == PS_NULL ) - brush->logbrush.lbStyle = BS_NULL; - else - brush->iSolidColor = pen->iSolidColor; - return brush; -} - -BRUSHOBJ* -FASTCALL -HPenToBrushObj ( BRUSHOBJ *brush, HPEN hpen ) -{ - PENOBJ *pen; - ASSERT ( hpen ); - ASSERT ( brush ); - pen = PENOBJ_LockPen(hpen); - ASSERT ( pen ); - PenToBrushObj ( brush, pen ); - PENOBJ_UnlockPen(hpen); - return brush; -} - HBITMAP FASTCALL BitmapToSurf(PBITMAPOBJ BitmapObj, HDEV GDIDevice) { HBITMAP BitmapHandle; @@ -87,11 +58,12 @@ HBITMAP FASTCALL BitmapToSurf(PBITMAPOBJ BitmapObj, HDEV GDIDevice) BitmapFormat(BitmapObj->bitmap.bmBitsPixel, BI_RGB), 0, BitmapObj->bitmap.bmBits); } - if (NULL != BitmapHandle) + if (NULL != BitmapHandle && NULL != GDIDevice) { EngAssociateSurface(BitmapHandle, GDIDevice, 0); } return BitmapHandle; } + /* EOF */ diff --git a/reactos/subsys/win32k/objects/path.c b/reactos/subsys/win32k/objects/path.c index 87516286efb..6e76b9ae936 100644 --- a/reactos/subsys/win32k/objects/path.c +++ b/reactos/subsys/win32k/objects/path.c @@ -16,10 +16,11 @@ * 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.18 2004/02/19 21:12:10 weiden Exp $ */ +/* $Id: path.c,v 1.19 2004/04/05 21:26:25 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include +#include #include #include #include diff --git a/reactos/subsys/win32k/objects/pen.c b/reactos/subsys/win32k/objects/pen.c index 71a7eba3fdd..72801cf1b03 100644 --- a/reactos/subsys/win32k/objects/pen.c +++ b/reactos/subsys/win32k/objects/pen.c @@ -1,95 +1,129 @@ /* - * ReactOS W32 Subsystem - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team + * ReactOS Win32 Subsystem * - * 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. + * Copyright (C) 1998 - 2004 ReactOS Team * - * 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. + * 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. * - * 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. + * 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: pen.c,v 1.14 2004/04/05 21:26:25 navaraf Exp $ */ -/* $Id: pen.c,v 1.13 2003/12/12 15:47:37 weiden Exp $ */ + #undef WIN32_LEAN_AND_MEAN #include #include +#include #include +#include #include #include - #define NDEBUG #include +/* PRIVATE FUNCTIONS **********************************************************/ + HPEN FASTCALL -IntGdiCreatePenIndirect(PLOGPEN lgpn) +IntGdiCreatePenIndirect(PLOGPEN LogPen) { - HPEN hpen; - PPENOBJ penPtr; + HPEN hPen; + PGDIBRUSHOBJ PenObject; + static const WORD wPatternAlternate[] = {0x5555}; - if (lgpn->lopnStyle > PS_INSIDEFRAME) return 0; + if (LogPen->lopnStyle > PS_INSIDEFRAME) + return 0; - hpen = PENOBJ_AllocPen(); - if (!hpen) return 0; + hPen = PENOBJ_AllocPen(); + if (!hPen) + { + SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); + DPRINT("Can't allocate pen\n"); + return 0; + } - penPtr = PENOBJ_LockPen( hpen ); - ASSERT( penPtr ); + PenObject = PENOBJ_LockPen(hPen); + 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) + { + case PS_NULL: + PenObject->flAttrs |= GDIBRUSH_IS_NULL; + break; - penPtr->logpen.lopnStyle = lgpn->lopnStyle; - penPtr->logpen.lopnWidth = lgpn->lopnWidth; - penPtr->logpen.lopnColor = lgpn->lopnColor; - PENOBJ_UnlockPen( hpen ); + case PS_SOLID: + PenObject->flAttrs |= GDIBRUSH_IS_SOLID; + break; + + case PS_ALTERNATE: + PenObject->flAttrs |= GDIBRUSH_IS_BITMAP; + PenObject->hbmPattern = NtGdiCreateBitmap(8, 1, 1, 1, wPatternAlternate); + break; + + default: + UNIMPLEMENTED; + } + + PENOBJ_UnlockPen(hPen); - return hpen; + return hPen; } -/******************************************************************************/ +/* PUBLIC FUNCTIONS ***********************************************************/ -HPEN -STDCALL -NtGdiCreatePen(INT PenStyle, INT Width, COLORREF Color) +HPEN STDCALL +NtGdiCreatePen( + INT PenStyle, + INT Width, + COLORREF Color) { - LOGPEN logpen; + LOGPEN LogPen; - logpen.lopnStyle = PenStyle; - logpen.lopnWidth.x = Width; - logpen.lopnWidth.y = 0; - logpen.lopnColor = Color; + LogPen.lopnStyle = PenStyle; + LogPen.lopnWidth.x = Width; + LogPen.lopnWidth.y = 0; + LogPen.lopnColor = Color; - return IntGdiCreatePenIndirect(&logpen); + return IntGdiCreatePenIndirect(&LogPen); } -HPEN -STDCALL -NtGdiCreatePenIndirect(CONST PLOGPEN lgpn) +HPEN STDCALL +NtGdiCreatePenIndirect(CONST PLOGPEN LogPen) { - LOGPEN Safelgpn; - NTSTATUS Status; + LOGPEN SafeLogPen; + NTSTATUS Status; - Status = MmCopyFromCaller(&Safelgpn, lgpn, sizeof(LOGPEN)); - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return 0; - } + Status = MmCopyFromCaller(&SafeLogPen, LogPen, sizeof(LOGPEN)); + if (!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return 0; + } - return IntGdiCreatePenIndirect(&Safelgpn); + return IntGdiCreatePenIndirect(&SafeLogPen); } -HPEN -STDCALL -NtGdiExtCreatePen(DWORD PenStyle, - DWORD Width, - CONST PLOGBRUSH lb, - DWORD StyleCount, - CONST PDWORD Style) +HPEN STDCALL +NtGdiExtCreatePen( + DWORD PenStyle, + DWORD Width, + CONST PLOGBRUSH LogBrush, + DWORD StyleCount, + CONST PDWORD Style) { - UNIMPLEMENTED; + UNIMPLEMENTED; } + /* EOF */ diff --git a/reactos/subsys/win32k/objects/region.c b/reactos/subsys/win32k/objects/region.c index ea820837e1f..e82bd3e85f0 100644 --- a/reactos/subsys/win32k/objects/region.c +++ b/reactos/subsys/win32k/objects/region.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: region.c,v 1.46 2004/04/03 20:36:56 gvg Exp $ */ +/* $Id: region.c,v 1.47 2004/04/05 21:26:25 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -2005,7 +2005,7 @@ NtGdiPaintRgn(HDC hDC, PROSRGNDATA visrgn; CLIPOBJ* ClipRegion; BOOL bRet = FALSE; - PBRUSHOBJ pBrush; + PGDIBRUSHOBJ pBrush; POINTL BrushOrigin; SURFOBJ *SurfObj; @@ -2048,7 +2048,7 @@ NtGdiPaintRgn(HDC hDC, bRet = IntEngPaint(SurfObj, ClipRegion, - pBrush, + &pBrush->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 f8031fb2987..437c9073025 100644 --- a/reactos/subsys/win32k/objects/text.c +++ b/reactos/subsys/win32k/objects/text.c @@ -22,12 +22,13 @@ * 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.87 2004/04/04 15:28:43 gvg Exp $ */ +/* $Id: text.c,v 1.88 2004/04/05 21:26:25 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include +#include #include #include #include @@ -1493,9 +1494,9 @@ NtGdiExtTextOut( RECTL DestRect, MaskRect; POINTL SourcePoint, BrushOrigin; HBRUSH hBrushFg = NULL; - PBRUSHOBJ BrushFg = NULL; + PGDIBRUSHOBJ BrushFg = NULL; HBRUSH hBrushBg = NULL; - PBRUSHOBJ BrushBg = NULL; + PGDIBRUSHOBJ BrushBg = NULL; HBITMAP HSourceGlyph; PSURFOBJ SourceGlyphSurf; SIZEL bitSize; @@ -1638,7 +1639,7 @@ NtGdiExtTextOut( &DestRect, &SourcePoint, &SourcePoint, - BrushBg, + &BrushBg->BrushObject, &BrushOrigin, PATCOPY); fuOptions &= ~ETO_OPAQUE; @@ -1799,7 +1800,7 @@ NtGdiExtTextOut( &DestRect, &SourcePoint, &SourcePoint, - BrushBg, + &BrushBg->BrushObject, &BrushOrigin, PATCOPY); BackgroundLeft = DestRect.right; @@ -1838,7 +1839,7 @@ NtGdiExtTextOut( &DestRect, &SourcePoint, (PPOINTL)&MaskRect, - BrushFg, + &BrushFg->BrushObject, &BrushOrigin); EngDeleteSurface(HSourceGlyph); @@ -2578,6 +2579,7 @@ NtGdiSetTextColor(HDC hDC, { COLORREF oldColor; PDC dc = DC_LockDc(hDC); + HBRUSH hBrush; if (!dc) { @@ -2586,7 +2588,9 @@ NtGdiSetTextColor(HDC hDC, oldColor = dc->w.textColor; dc->w.textColor = color; + hBrush = dc->w.hBrush; DC_UnlockDc( hDC ); + NtGdiSelectObject(hDC, hBrush); return oldColor; } From aa25fb6d2c8a23557255a7edba55b4009cefe704 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 5 Apr 2004 21:26:30 +0000 Subject: [PATCH 0745/1463] disable thread-safety, seems to cause some problems atm svn path=/trunk/; revision=8982 --- reactos/subsys/win32k/ntuser/windc.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/ntuser/windc.c b/reactos/subsys/win32k/ntuser/windc.c index 4ee1b71e044..4d060e71f6a 100644 --- a/reactos/subsys/win32k/ntuser/windc.c +++ b/reactos/subsys/win32k/ntuser/windc.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: windc.c,v 1.63 2004/04/05 21:15:34 weiden Exp $ +/* $Id: windc.c,v 1.64 2004/04/05 21:26:30 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -55,11 +55,18 @@ static FAST_MUTEX DceListLock; static PDCE FirstDce = NULL; static HDC defaultDCstate; +#if 0 + #define DCE_LockList() \ ExAcquireFastMutex(&DceListLock) #define DCE_UnlockList() \ ExReleaseFastMutex(&DceListLock) +#else +#define DCE_LockList() +#define DCE_UnlockList() +#endif + #define DCX_CACHECOMPAREMASK (DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN | \ DCX_CACHE | DCX_WINDOW | DCX_PARENTCLIP) From 9c418442a80f6edb9e637545d8f7d2b2617efa78 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Mon, 5 Apr 2004 21:29:28 +0000 Subject: [PATCH 0746/1463] - Removed useless code from ImageList_DrawIndirect, because there are problems with it in combination with the ReactOS code (propably due to XLATEOBJs) svn path=/trunk/; revision=8983 --- reactos/lib/comctl32/imagelist.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/lib/comctl32/imagelist.c b/reactos/lib/comctl32/imagelist.c index bf81080837a..b93e4db7b5a 100644 --- a/reactos/lib/comctl32/imagelist.c +++ b/reactos/lib/comctl32/imagelist.c @@ -1146,12 +1146,14 @@ 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); else if (clrBlend == CLR_NONE) clrBlend = GetTextColor (pimldp->hdcDst); From bea76aded57ac7e5a12122cb143d7f25e2d67ffd Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 5 Apr 2004 22:12:53 +0000 Subject: [PATCH 0747/1463] use patterned dragging rectangle svn path=/trunk/; revision=8984 --- reactos/lib/user32/windows/defwnd.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/reactos/lib/user32/windows/defwnd.c b/reactos/lib/user32/windows/defwnd.c index 7dfd7928cbc..f58bf3abd15 100644 --- a/reactos/lib/user32/windows/defwnd.c +++ b/reactos/lib/user32/windows/defwnd.c @@ -1,4 +1,4 @@ -/* $Id: defwnd.c,v 1.129 2004/04/05 21:26:24 navaraf Exp $ +/* $Id: defwnd.c,v 1.130 2004/04/05 22:12:53 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -432,17 +432,28 @@ DefWndStartSizeMove(HWND hWnd, WPARAM wParam, POINT *capturePoint) VOID STATIC UserDrawWindowFrame(HDC hdc, const RECT *rect, - ULONG width, ULONG height, DWORD rop ) + ULONG width, ULONG height) { - HBRUSH hbrush = SelectObject( hdc, GetStockObject( GRAY_BRUSH ) ); + static HBRUSH hDraggingRectBrush = NULL; + + if(!hDraggingRectBrush) + { + static HBITMAP hDraggingPattern = NULL; + const DWORD Pattern[4] = {0x5555AAAA, 0x5555AAAA, 0x5555AAAA, 0x5555AAAA}; + + hDraggingPattern = CreateBitmap(8, 8, 1, 1, Pattern); + hDraggingRectBrush = CreatePatternBrush(hDraggingPattern); + } + + HBRUSH hbrush = SelectObject( hdc, hDraggingRectBrush ); PatBlt( hdc, rect->left, rect->top, - rect->right - rect->left - width, height, rop ); + rect->right - rect->left - width, height, PATINVERT ); PatBlt( hdc, rect->left, rect->top + height, width, - rect->bottom - rect->top - height, rop ); + rect->bottom - rect->top - height, PATINVERT ); PatBlt( hdc, rect->left + width, rect->bottom - 1, - rect->right - rect->left - width, -height, rop ); + rect->right - rect->left - width, -height, PATINVERT ); PatBlt( hdc, rect->right - 1, rect->top, -width, - rect->bottom - rect->top - height, rop ); + rect->bottom - rect->top - height, PATINVERT ); SelectObject( hdc, hbrush ); } @@ -452,7 +463,7 @@ UserDrawMovingFrame(HDC hdc, RECT *rect, BOOL thickframe) if (thickframe) { UserDrawWindowFrame(hdc, rect, GetSystemMetrics(SM_CXFRAME), - GetSystemMetrics(SM_CYFRAME), DSTINVERT); + GetSystemMetrics(SM_CYFRAME)); } else DrawFocusRect( hdc, rect ); } From 0a552285f3349310ba1c27a4c92af16bf7316a50 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 5 Apr 2004 22:18:35 +0000 Subject: [PATCH 0748/1463] draw patterned focus rectangles svn path=/trunk/; revision=8985 --- reactos/lib/user32/windows/draw.c | 48 +++++++++++++------------------ 1 file changed, 20 insertions(+), 28 deletions(-) diff --git a/reactos/lib/user32/windows/draw.c b/reactos/lib/user32/windows/draw.c index 13234053ed1..6ed31ee4f1f 100644 --- a/reactos/lib/user32/windows/draw.c +++ b/reactos/lib/user32/windows/draw.c @@ -1843,39 +1843,31 @@ DrawAnimatedRects(HWND hWnd, int idAni, CONST RECT *lprcFrom, BOOL STDCALL DrawFocusRect(HDC hdc, CONST RECT *rect) { -/* FIXME PS_ALTERNATE and R2_XORPEN not yet implemented */ -#if 0 - HBRUSH hOldBrush; - HPEN hOldPen, hNewPen; - INT oldDrawMode, oldBkMode; - - hOldBrush = SelectObject(hdc, GetStockObject(NULL_BRUSH)); - hNewPen = CreatePen(PS_ALTERNATE, 1, GetSysColor(COLOR_WINDOWTEXT)); - hOldPen = SelectObject(hdc, hNewPen); - oldDrawMode = SetROP2(hdc, R2_XORPEN); - oldBkMode = SetBkMode(hdc, TRANSPARENT); - - Rectangle(hdc, rect->left, rect->top, rect->right, rect->bottom); - - SetBkMode(hdc, oldBkMode); - SetROP2(hdc, oldDrawMode); - SelectObject(hdc, hOldPen); - DeleteObject(hNewPen); - SelectObject(hdc, hOldBrush); - - return TRUE; -#else + static HBRUSH hFocusRectBrush = NULL; + HGDIOBJ OldObj; + + if(!hFocusRectBrush) + { + static HBITMAP hFocusPattern = NULL; + const DWORD Pattern[4] = {0x5555AAAA, 0x5555AAAA, 0x5555AAAA, 0x5555AAAA}; + + hFocusPattern = CreateBitmap(8, 8, 1, 1, Pattern); + hFocusRectBrush = CreatePatternBrush(hFocusPattern); + } + + OldObj = SelectObject(hdc, hFocusRectBrush); + PatBlt(hdc, rect->left, rect->top, - rect->right - rect->left - 1, 1, DSTINVERT); + rect->right - rect->left - 1, 1, PATINVERT); PatBlt(hdc, rect->left, rect->top + 1, 1, - rect->bottom - rect->top - 1, DSTINVERT); + rect->bottom - rect->top - 1, PATINVERT); PatBlt(hdc, rect->left + 1, rect->bottom - 1, - rect->right - rect->left - 1, -1, DSTINVERT); + rect->right - rect->left - 1, -1, PATINVERT); PatBlt(hdc, rect->right - 1, rect->top, -1, - rect->bottom - rect->top - 1, DSTINVERT); - + rect->bottom - rect->top - 1, PATINVERT); + + SelectObject(hdc, OldObj); return TRUE; -#endif } /* From 5aae8fca39698acb6bc9996c90498295a8acc0f9 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 5 Apr 2004 22:42:11 +0000 Subject: [PATCH 0749/1463] clip the moving rectangle to the desktop area. This doesn't work because our SelectObject() implementation doesn't handle regions right atm. svn path=/trunk/; revision=8986 --- reactos/lib/user32/windows/defwnd.c | 49 ++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/reactos/lib/user32/windows/defwnd.c b/reactos/lib/user32/windows/defwnd.c index f58bf3abd15..ed08b437b52 100644 --- a/reactos/lib/user32/windows/defwnd.c +++ b/reactos/lib/user32/windows/defwnd.c @@ -1,4 +1,4 @@ -/* $Id: defwnd.c,v 1.130 2004/04/05 22:12:53 weiden Exp $ +/* $Id: defwnd.c,v 1.131 2004/04/05 22:42:11 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -458,19 +458,32 @@ UserDrawWindowFrame(HDC hdc, const RECT *rect, } VOID STATIC -UserDrawMovingFrame(HDC hdc, RECT *rect, BOOL thickframe) +UserDrawMovingFrame(HDC hdc, RECT *rect, BOOL thickframe, HRGN ClipRgn) { - if (thickframe) - { - UserDrawWindowFrame(hdc, rect, GetSystemMetrics(SM_CXFRAME), - GetSystemMetrics(SM_CYFRAME)); - } - else DrawFocusRect( hdc, rect ); + HGDIOBJ OldObj; + + if(ClipRgn) + { + OldObj = SelectObject(hdc, ClipRgn); + } + + if(thickframe) + { + UserDrawWindowFrame(hdc, rect, GetSystemMetrics(SM_CXFRAME), GetSystemMetrics(SM_CYFRAME)); + } + else + DrawFocusRect( hdc, rect ); + + if(ClipRgn) + { + SelectObject(hdc, OldObj); + } } VOID STATIC DefWndDoSizeMove(HWND hwnd, WORD wParam) { + HRGN DesktopRgn; MSG msg; RECT sizingRect, mouseRect, origRect, clipRect; HDC hdc; @@ -589,10 +602,12 @@ DefWndDoSizeMove(HWND hwnd, WORD wParam) { /* Retrieve a default cache DC (without using the window style) */ hdc = GetDCEx(hWndParent, 0, DCX_CACHE); + DesktopRgn = NULL; } else { hdc = GetDC( 0 ); + DesktopRgn = CreateRectRgnIndirect(&clipRect); } if( iconic ) /* create a cursor for dragging */ @@ -606,7 +621,7 @@ DefWndDoSizeMove(HWND hwnd, WORD wParam) /* invert frame if WIN31_LOOK to indicate mouse click on caption */ if( !iconic && !DragFullWindows) { - UserDrawMovingFrame( hdc, &sizingRect, thickframe ); + UserDrawMovingFrame( hdc, &sizingRect, thickframe, DesktopRgn ); } for(;;) @@ -622,9 +637,9 @@ DefWndDoSizeMove(HWND hwnd, WORD wParam) if (msg.message == WM_PAINT) { - if(!iconic && !DragFullWindows) UserDrawMovingFrame( hdc, &sizingRect, thickframe ); + if(!iconic && !DragFullWindows) UserDrawMovingFrame( hdc, &sizingRect, thickframe, DesktopRgn ); UpdateWindow( msg.hwnd ); - if(!iconic && !DragFullWindows) UserDrawMovingFrame( hdc, &sizingRect, thickframe ); + if(!iconic && !DragFullWindows) UserDrawMovingFrame( hdc, &sizingRect, thickframe, DesktopRgn ); continue; } @@ -673,7 +688,7 @@ DefWndDoSizeMove(HWND hwnd, WORD wParam) else if (ON_RIGHT_BORDER(hittest)) newRect.right += dx; if (ON_TOP_BORDER(hittest)) newRect.top += dy; else if (ON_BOTTOM_BORDER(hittest)) newRect.bottom += dy; - if(!iconic && !DragFullWindows) UserDrawMovingFrame( hdc, &sizingRect, thickframe ); + if(!iconic && !DragFullWindows) UserDrawMovingFrame( hdc, &sizingRect, thickframe, DesktopRgn ); capturePoint = pt; /* determine the hit location */ @@ -684,7 +699,7 @@ DefWndDoSizeMove(HWND hwnd, WORD wParam) if (!iconic) { if(!DragFullWindows) - UserDrawMovingFrame( hdc, &newRect, thickframe ); + UserDrawMovingFrame( hdc, &newRect, thickframe, DesktopRgn ); else { /* To avoid any deadlocks, all the locks on the windows structures must be suspended before the SetWindowPos */ @@ -711,12 +726,18 @@ DefWndDoSizeMove(HWND hwnd, WORD wParam) DestroyCursor( hDragCursor ); } else if(!DragFullWindows) - UserDrawMovingFrame( hdc, &sizingRect, thickframe ); + UserDrawMovingFrame( hdc, &sizingRect, thickframe, DesktopRgn ); if (Style & WS_CHILD) ReleaseDC( hWndParent, hdc ); else + { ReleaseDC( 0, hdc ); + if(DesktopRgn) + { + DeleteObject(DesktopRgn); + } + } SendMessageA( hwnd, WM_EXITSIZEMOVE, 0, 0 ); SendMessageA( hwnd, WM_SETVISIBLE, !IsIconic(hwnd), 0L); From 1bc88e0f77b0058c8b567f5648de8446756e7f86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Tue, 6 Apr 2004 07:43:33 +0000 Subject: [PATCH 0750/1463] Handle regions in SelectObject() svn path=/trunk/; revision=8987 --- reactos/subsys/win32k/objects/dc.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index c701346e884..fd08bea6848 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.126 2004/04/05 21:26:25 navaraf Exp $ +/* $Id: dc.c,v 1.127 2004/04/06 07:43:33 gvg Exp $ * * DC.C - Device context functions * @@ -1902,12 +1902,10 @@ NtGdiSelectObject(HDC hDC, HGDIOBJ hGDIObj) return objOrg; -#if UPDATEREGIONS case GDI_OBJECT_TYPE_REGION: - DC_UnlockDc ( hDC ); - SelectClipRgn(hDC, (HRGN)hGDIObj); - return NULL; -#endif + DC_UnlockDc (hDC); + return (HGDIOBJ) NtGdiSelectClipRgn(hDC, (HRGN) hGDIObj); + default: break; } From 5424a511074933c1b7874cdfce28fd1e06125b12 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Tue, 6 Apr 2004 17:54:32 +0000 Subject: [PATCH 0751/1463] implemented TransparentBlt() on 32bpp surfaces, but there are still some clipping issues svn path=/trunk/; revision=8988 --- reactos/subsys/win32k/dib/dib.c | 25 +++- reactos/subsys/win32k/dib/dib.h | 25 ++++ reactos/subsys/win32k/dib/dib16bpp.c | 11 +- reactos/subsys/win32k/dib/dib1bpp.c | 11 +- reactos/subsys/win32k/dib/dib24bpp.c | 11 +- reactos/subsys/win32k/dib/dib32bpp.c | 52 ++++++- reactos/subsys/win32k/dib/dib4bpp.c | 11 +- reactos/subsys/win32k/dib/dib8bpp.c | 11 +- reactos/subsys/win32k/eng/objects.h | 46 +++--- reactos/subsys/win32k/eng/surface.c | 26 +++- reactos/subsys/win32k/eng/transblt.c | 190 ++++++++++++++++++++++-- reactos/subsys/win32k/include/inteng.h | 10 ++ reactos/subsys/win32k/include/intgdi.h | 12 -- reactos/subsys/win32k/objects/bitmaps.c | 28 ++-- 14 files changed, 388 insertions(+), 81 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib.c b/reactos/subsys/win32k/dib/dib.c index f9ace456c05..3825379d54f 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.7 2004/03/21 04:17:33 royce Exp $ */ +/* $Id: dib.c,v 1.8 2004/04/06 17:54:32 weiden Exp $ */ #include #include @@ -67,6 +67,29 @@ DIB_GetSource(SURFOBJ* SourceSurf, SURFGDI* SourceGDI, ULONG sx, ULONG sy, XLATE } } +ULONG +DIB_GetOriginalSource(SURFOBJ* SourceSurf, SURFGDI* SourceGDI, ULONG sx, ULONG sy) +{ + switch (SourceGDI->BitsPerPixel) + { + case 1: + return DIB_1BPP_GetPixel(SourceSurf, sx, sy); + case 4: + return DIB_4BPP_GetPixel(SourceSurf, sx, sy); + case 8: + return DIB_8BPP_GetPixel(SourceSurf, sx, sy); + case 16: + return DIB_16BPP_GetPixel(SourceSurf, sx, sy); + case 24: + return DIB_24BPP_GetPixel(SourceSurf, sx, sy); + case 32: + return DIB_32BPP_GetPixel(SourceSurf, sx, sy); + default: + DPRINT1("DIB_GetOriginalSource: Unhandled number of bits per pixel in source (%d).\n", SourceGDI->BitsPerPixel); + return(0); + } +} + ULONG DIB_DoRop(ULONG Rop, ULONG Dest, ULONG Source, ULONG Pattern) { diff --git a/reactos/subsys/win32k/dib/dib.h b/reactos/subsys/win32k/dib/dib.h index b1eeca695ac..fd71097f82e 100644 --- a/reactos/subsys/win32k/dib/dib.h +++ b/reactos/subsys/win32k/dib/dib.h @@ -3,6 +3,7 @@ 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_GetOriginalSource(SURFOBJ* SourceSurf, SURFGDI* SourceGDI, ULONG sx, ULONG sy); VOID DIB_1BPP_PutPixel(SURFOBJ* SurfObj, LONG x, LONG y, ULONG c); ULONG DIB_1BPP_GetPixel(SURFOBJ* SurfObj, LONG x, LONG y); @@ -18,6 +19,10 @@ BOOLEAN DIB_1BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL* BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Mode); +BOOLEAN DIB_1BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, + PSURFGDI DestGDI, PSURFGDI SourceGDI, + RECTL* DestRect, POINTL *SourcePoint, + XLATEOBJ *ColorTranslation, ULONG iTransColor); VOID DIB_4BPP_PutPixel(SURFOBJ* SurfObj, LONG x, LONG y, ULONG c); ULONG DIB_4BPP_GetPixel(SURFOBJ* SurfObj, LONG x, LONG y); @@ -33,6 +38,10 @@ BOOLEAN DIB_4BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL* BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Mode); +BOOLEAN DIB_4BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, + PSURFGDI DestGDI, PSURFGDI SourceGDI, + 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); @@ -48,6 +57,10 @@ BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL* BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Mode); +BOOLEAN DIB_8BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, + PSURFGDI DestGDI, PSURFGDI SourceGDI, + 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); @@ -63,6 +76,10 @@ BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL* BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Mode); +BOOLEAN DIB_16BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, + PSURFGDI DestGDI, PSURFGDI SourceGDI, + 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); @@ -78,6 +95,10 @@ BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL* BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Mode); +BOOLEAN DIB_24BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, + PSURFGDI DestGDI, PSURFGDI SourceGDI, + 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); @@ -93,4 +114,8 @@ BOOLEAN DIB_32BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL* BrushOrigin, 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 8ae97a6b89d..3b6b002b69b 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.22 2004/04/05 21:26:24 navaraf Exp $ */ +/* $Id: dib16bpp.c,v 1.23 2004/04/06 17:54:32 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -602,4 +602,13 @@ BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, return TRUE; } +BOOLEAN +DIB_16BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, + PSURFGDI DestGDI, PSURFGDI SourceGDI, + RECTL* DestRect, POINTL *SourcePoint, + XLATEOBJ *ColorTranslation, ULONG iTransColor) +{ + return FALSE; +} + /* EOF */ diff --git a/reactos/subsys/win32k/dib/dib1bpp.c b/reactos/subsys/win32k/dib/dib1bpp.c index b252dafcb03..ab66c9eb6a4 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.17 2004/04/05 21:26:24 navaraf Exp $ */ +/* $Id: dib1bpp.c,v 1.18 2004/04/06 17:54:32 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include @@ -536,4 +536,13 @@ DIB_1BPP_StretchBlt ( return FALSE; } +BOOLEAN +DIB_1BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, + PSURFGDI DestGDI, PSURFGDI SourceGDI, + RECTL* DestRect, POINTL *SourcePoint, + XLATEOBJ *ColorTranslation, ULONG iTransColor) +{ + return FALSE; +} + /* EOF */ diff --git a/reactos/subsys/win32k/dib/dib24bpp.c b/reactos/subsys/win32k/dib/dib24bpp.c index 56b39f312ca..36911add3fa 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.18 2004/04/05 21:26:24 navaraf Exp $ */ +/* $Id: dib24bpp.c,v 1.19 2004/04/06 17:54:32 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -361,4 +361,13 @@ BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, return FALSE; } +BOOLEAN +DIB_24BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, + PSURFGDI DestGDI, PSURFGDI SourceGDI, + RECTL* DestRect, POINTL *SourcePoint, + XLATEOBJ *ColorTranslation, ULONG iTransColor) +{ + return FALSE; +} + /* EOF */ diff --git a/reactos/subsys/win32k/dib/dib32bpp.c b/reactos/subsys/win32k/dib/dib32bpp.c index 2fe3bd2978d..09369cb5edb 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.18 2004/04/05 21:26:24 navaraf Exp $ */ +/* $Id: dib32bpp.c,v 1.19 2004/04/06 17:54:32 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -304,7 +304,7 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, { ULONG X, Y; ULONG SourceX, SourceY; - ULONG Dest, Source, Pattern; + ULONG Dest, Source, Pattern, wd; PULONG DestBits; BOOL UsesSource; BOOL UsesPattern; @@ -359,7 +359,8 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, 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++) { SourceX = SourcePoint->x; @@ -390,9 +391,7 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SourceY++; DestBits = (PULONG)( - (ULONG_PTR)DestBits - - ((DestRect->right - DestRect->left) << 2) + - DestSurf->lDelta); + (ULONG_PTR)DestBits - wd); } if (PatternSurface != NULL) @@ -567,4 +566,45 @@ BOOLEAN DIB_32BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, return TRUE; } +BOOLEAN +DIB_32BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, + PSURFGDI DestGDI, PSURFGDI SourceGDI, + RECTL* DestRect, POINTL *SourcePoint, + XLATEOBJ *ColorTranslation, ULONG iTransColor) +{ + ULONG X, Y; + ULONG SourceX, SourceY, Source, wd; + PULONG DestBits; + + 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++) + { + SourceX = SourcePoint->x; + for(X = DestRect->left; X < DestRect->right; X++, DestBits++, SourceX++) + { + Source = DIB_GetOriginalSource(SourceSurf, SourceGDI, SourceX, SourceY); + if(Source == iTransColor) + { + /* Skip transparent pixels */ + continue; + } + + if(ColorTranslation) + *DestBits = XLATEOBJ_iXlate(ColorTranslation, Source); + else + *DestBits = Source; + } + + SourceY++; + DestBits = (PULONG)((ULONG_PTR)DestBits - wd); + } + + return TRUE; +} + /* EOF */ diff --git a/reactos/subsys/win32k/dib/dib4bpp.c b/reactos/subsys/win32k/dib/dib4bpp.c index e210aa881ea..130deb8ea2e 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.24 2004/04/05 21:26:24 navaraf Exp $ */ +/* $Id: dib4bpp.c,v 1.25 2004/04/06 17:54:32 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -413,4 +413,13 @@ BOOLEAN DIB_4BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, return FALSE; } +BOOLEAN +DIB_4BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, + PSURFGDI DestGDI, PSURFGDI SourceGDI, + RECTL* DestRect, POINTL *SourcePoint, + XLATEOBJ *ColorTranslation, ULONG iTransColor) +{ + return FALSE; +} + /* EOF */ diff --git a/reactos/subsys/win32k/dib/dib8bpp.c b/reactos/subsys/win32k/dib/dib8bpp.c index c0d2e3c4cf1..93d73aa5321 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.17 2004/04/05 21:26:24 navaraf Exp $ */ +/* $Id: dib8bpp.c,v 1.18 2004/04/06 17:54:32 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -562,4 +562,13 @@ BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, return TRUE; } +BOOLEAN +DIB_8BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, + PSURFGDI DestGDI, PSURFGDI SourceGDI, + RECTL* DestRect, POINTL *SourcePoint, + XLATEOBJ *ColorTranslation, ULONG iTransColor) +{ + return FALSE; +} + /* EOF */ diff --git a/reactos/subsys/win32k/eng/objects.h b/reactos/subsys/win32k/eng/objects.h index 3c85a06d058..712804b476c 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.28 2004/02/08 21:37:52 weiden Exp $ +/* $Id: objects.h,v 1.29 2004/04/06 17:54:32 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -150,20 +150,23 @@ typedef BOOL STDCALL (*PFN_GradientFill)(SURFOBJ*, CLIPOBJ*, XLATEOBJ*, TRIVERTE /* 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, - XLATEOBJ *ColorTranslation, ULONG Mode); +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, + XLATEOBJ *ColorTranslation, ULONG Mode); +typedef BOOLEAN (*PFN_DIB_TransparentBlt) (SURFOBJ *, SURFOBJ *, PSURFGDI, PSURFGDI, + RECTL* , POINTL *, XLATEOBJ *,ULONG); + typedef struct _SURFGDI { ENGOBJ Header; @@ -191,12 +194,13 @@ typedef struct _SURFGDI { 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_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; diff --git a/reactos/subsys/win32k/eng/surface.c b/reactos/subsys/win32k/eng/surface.c index 820ea1f4673..d709c5af86a 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.35 2004/03/20 17:33:10 navaraf Exp $ +/* $Id: surface.c,v 1.36 2004/04/06 17:54:32 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -126,6 +126,14 @@ static BOOLEAN Dummy_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, 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)\ @@ -134,7 +142,8 @@ static BOOLEAN Dummy_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, 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_StretchBlt=SURF_METHOD(c,StretchBlt);\ + SurfGDI->DIB_TransparentBlt=SURF_METHOD(c,TransparentBlt); VOID FASTCALL InitializeFuncs(SURFGDI *SurfGDI, ULONG BitmapFormat) { @@ -160,12 +169,13 @@ VOID FASTCALL InitializeFuncs(SURFGDI *SurfGDI, ULONG BitmapFormat) 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_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; } } diff --git a/reactos/subsys/win32k/eng/transblt.c b/reactos/subsys/win32k/eng/transblt.c index fca40f38777..290317068c9 100644 --- a/reactos/subsys/win32k/eng/transblt.c +++ b/reactos/subsys/win32k/eng/transblt.c @@ -16,15 +16,15 @@ * 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.13 2004/04/03 21:25:20 weiden Exp $ +/* $Id: transblt.c,v 1.14 2004/04/06 17:54:32 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * PURPOSE: GDI TransparentBlt Function * FILE: subsys/win32k/eng/transblt.c - * PROGRAMER: Jason Filby + * PROGRAMER: Thomas Weidenmueller (w3seek@users.sourceforge.net) * REVISION HISTORY: - * 4/6/2001: Created + * 4/6/2004: Created */ #include @@ -53,22 +53,178 @@ EngTransparentBlt(PSURFOBJ Dest, PXLATEOBJ ColorTranslation, PRECTL DestRect, PRECTL SourceRect, - ULONG TransparentColor, + ULONG iTransColor, ULONG Reserved) { - DPRINT1("EngTransparentBlt() unimplemented!\n"); - return FALSE; + BOOL Ret; + BYTE ClippingType; + INTENG_ENTER_LEAVE EnterLeaveSource, EnterLeaveDest; + SURFOBJ *InputObj, *OutputObj; + SURFGDI *InputGDI, *OutputGDI; + RECTL OutputRect, InputRect; + POINTL Translate, InputPoint; + + InputRect.left = 0; + InputRect.right = DestRect->right - DestRect->left; + InputRect.top = 0; + InputRect.bottom = DestRect->bottom - DestRect->top; + + if(!IntEngEnter(&EnterLeaveSource, Source, &InputRect, TRUE, &Translate, &InputObj)) + { + return FALSE; + } + + InputPoint.x = SourceRect->left + Translate.x; + InputPoint.y = SourceRect->top + Translate.y; + + InputGDI = (InputObj ? (SURFGDI*)AccessInternalObjectFromUserObject(InputObj) : NULL); + ASSERT(InputGDI); + + OutputRect = *DestRect; + if(Clip) + { + if(OutputRect.left < Clip->rclBounds.left) + { + InputRect.left += Clip->rclBounds.left - OutputRect.left; + InputPoint.x += Clip->rclBounds.left - OutputRect.left; + OutputRect.left = Clip->rclBounds.left; + } + if(Clip->rclBounds.right < OutputRect.right) + { + InputRect.right -= OutputRect.right - Clip->rclBounds.right; + OutputRect.right = Clip->rclBounds.right; + } + if(OutputRect.top < Clip->rclBounds.top) + { + InputRect.top += Clip->rclBounds.top - OutputRect.top; + InputPoint.y += Clip->rclBounds.top - OutputRect.top; + OutputRect.top = Clip->rclBounds.top; + } + if(Clip->rclBounds.bottom < OutputRect.bottom) + { + InputRect.bottom -= OutputRect.bottom - Clip->rclBounds.bottom; + OutputRect.bottom = Clip->rclBounds.bottom; + } + } + + /* Check for degenerate case: if height or width of OutputRect is 0 pixels there's + nothing to do */ + if(OutputRect.right <= OutputRect.left || OutputRect.bottom <= OutputRect.top) + { + IntEngLeave(&EnterLeaveSource); + return TRUE; + } + + if(!IntEngEnter(&EnterLeaveDest, Dest, &OutputRect, FALSE, &Translate, &OutputObj)) + { + IntEngLeave(&EnterLeaveSource); + return FALSE; + } + + OutputRect.left = DestRect->left + Translate.x; + OutputRect.right = DestRect->right + Translate.x; + 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); + break; + } + case DC_RECT: + { + RECTL ClipRect, CombinedRect; + POINTL Pt; + + ClipRect.left = Clip->rclBounds.left + Translate.x; + ClipRect.right = Clip->rclBounds.right + Translate.x; + ClipRect.top = Clip->rclBounds.top + Translate.y; + ClipRect.bottom = Clip->rclBounds.bottom + Translate.y; + 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); + break; + } + case DC_COMPLEX: + { + ULONG Direction, i; + RECT_ENUM RectEnum; + BOOL EnumMore; + POINTL Pt; + + if(OutputObj == InputObj) + { + if(OutputRect.top < InputPoint.y) + { + Direction = OutputRect.left < (InputPoint.x ? CD_RIGHTDOWN : CD_LEFTDOWN); + } + else + { + Direction = OutputRect.left < (InputPoint.x ? CD_RIGHTUP : CD_LEFTUP); + } + } + else + { + Direction = CD_ANY; + } + + CLIPOBJ_cEnumStart(Clip, FALSE, CT_RECTANGLES, Direction, 0); + do + { + EnumMore = CLIPOBJ_bEnum(Clip, sizeof(RectEnum), (PVOID)&RectEnum); + for (i = 0; i < RectEnum.c; i++) + { + RECTL ClipRect, CombinedRect; + + ClipRect.left = RectEnum.arcl[i].left + Translate.x; + ClipRect.right = RectEnum.arcl[i].right + Translate.x; + ClipRect.top = RectEnum.arcl[i].top + Translate.y; + ClipRect.bottom = RectEnum.arcl[i].bottom + Translate.y; + 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); + if(!Ret) + { + break; + } + } + } while(EnumMore && Ret); + break; + } + default: + { + Ret = FALSE; + break; + } + } + + IntEngLeave(&EnterLeaveDest); + IntEngLeave(&EnterLeaveSource); + + return Ret; } BOOL FASTCALL -IntTransparentBlt(PSURFOBJ Dest, - PSURFOBJ Source, - PCLIPOBJ Clip, - PXLATEOBJ ColorTranslation, - PRECTL DestRect, - PRECTL SourceRect, - ULONG TransparentColor, - ULONG Reserved) +IntEngTransparentBlt(PSURFOBJ Dest, + PSURFOBJ Source, + PCLIPOBJ Clip, + PXLATEOBJ ColorTranslation, + PRECTL DestRect, + PRECTL SourceRect, + ULONG iTransColor, + ULONG Reserved) { BOOL Ret; RECTL OutputRect, InputClippedRect; @@ -115,8 +271,10 @@ IntTransparentBlt(PSURFOBJ Dest, if(SurfGDIDest->TransparentBlt) { + IntLockGDIDriver(SurfGDIDest); Ret = SurfGDIDest->TransparentBlt(Dest, Source, Clip, ColorTranslation, &OutputRect, - SourceRect, TransparentColor, Reserved); + SourceRect, iTransColor, Reserved); + IntUnLockGDIDriver(SurfGDIDest); } else Ret = FALSE; @@ -124,7 +282,7 @@ IntTransparentBlt(PSURFOBJ Dest, if(!Ret) { Ret = EngTransparentBlt(Dest, Source, Clip, ColorTranslation, &OutputRect, - SourceRect, TransparentColor, Reserved); + SourceRect, iTransColor, Reserved); } MouseSafetyOnDrawEnd(Dest, SurfGDIDest); diff --git a/reactos/subsys/win32k/include/inteng.h b/reactos/subsys/win32k/include/inteng.h index c63ca246b17..19e8ad70984 100644 --- a/reactos/subsys/win32k/include/inteng.h +++ b/reactos/subsys/win32k/include/inteng.h @@ -67,4 +67,14 @@ BOOL STDCALL IntEngPolyline(SURFOBJ *DestSurf, CLIPOBJ* STDCALL IntEngCreateClipRegion(ULONG count, PRECTL pRect, RECTL rcBounds); + +BOOL FASTCALL +IntEngTransparentBlt(PSURFOBJ Dest, + PSURFOBJ Source, + PCLIPOBJ Clip, + PXLATEOBJ ColorTranslation, + PRECTL DestRect, + PRECTL SourceRect, + ULONG iTransColor, + ULONG Reserved); #endif /* _WIN32K_INTENG_H */ diff --git a/reactos/subsys/win32k/include/intgdi.h b/reactos/subsys/win32k/include/intgdi.h index 3edac2563a8..830b7670e57 100644 --- a/reactos/subsys/win32k/include/intgdi.h +++ b/reactos/subsys/win32k/include/intgdi.h @@ -121,17 +121,5 @@ IntGdiCombineTransform(LPXFORM XFormResult, LPXFORM xform1, LPXFORM xform2); -/* Bitmap functions */ - -BOOL FASTCALL -IntTransparentBlt(PSURFOBJ Dest, - PSURFOBJ Source, - PCLIPOBJ Clip, - PXLATEOBJ ColorTranslation, - PRECTL DestRect, - PRECTL SourceRect, - ULONG TransparentColor, - ULONG Reserved); - #endif /* _WIN32K_INTGDI_H */ diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index 1181245dd7d..da4523b9de0 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.67 2004/04/05 21:26:25 navaraf Exp $ */ +/* $Id: bitmaps.c,v 1.68 2004/04/06 17:54:32 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -307,6 +307,12 @@ NtGdiTransparentBlt( DCSrc = DCDest; } + /* Offset positions */ + xDst += DCDest->w.DCOrgX; + yDst += DCDest->w.DCOrgY; + xSrc += DCSrc->w.DCOrgX; + ySrc += DCSrc->w.DCOrgY; + if(DCDest->w.hPalette) DestPalette = DCDest->w.hPalette; else @@ -344,16 +350,15 @@ NtGdiTransparentBlt( } PALETTE_UnlockPalette(SourcePalette); - if((XlateObj = (PXLATEOBJ)IntEngCreateXlate(PalDestMode, PalSrcMode, DestPalette, SourcePalette))) + /* Translate Transparent (RGB) Color to the source palette */ + if((XlateObj = (PXLATEOBJ)IntEngCreateXlate(PalSrcMode, PAL_RGB, SourcePalette, NULL))) { - /* FIXME - is color translation right? */ TransparentColor = XLATEOBJ_iXlate(XlateObj, (ULONG)TransColor); + EngDeleteXlate(XlateObj); } - else - { - /* FIXME - what should be done here? */ - TransparentColor = (ULONG)TransColor; - } + + /* Create the XLATE object to convert colors between source and destination */ + XlateObj = (PXLATEOBJ)IntEngCreateXlate(PalDestMode, PalSrcMode, DestPalette, SourcePalette); SurfDest = (PSURFOBJ)AccessUserObject((ULONG)DCDest->Surface); ASSERT(SurfDest); @@ -371,13 +376,12 @@ NtGdiTransparentBlt( if((cxDst != cxSrc) || (cyDst != cySrc)) { - /* FIXME - Create a temporary bitmap and stretchblt it */ - DPRINT1("TransparentBlt() does not support stretching!\n"); + DPRINT1("TransparentBlt() does not support stretching at the moment!\n"); goto done; } - Ret = IntTransparentBlt(SurfDest, SurfSrc, DCDest->CombinedClip, XlateObj, &rcDest, &rcSrc, - TransparentColor, 0); + Ret = IntEngTransparentBlt(SurfDest, SurfSrc, DCDest->CombinedClip, XlateObj, &rcDest, &rcSrc, + TransparentColor, 0); done: DC_UnlockDc(hdcSrc); From 39b17f59639fcdb9d89dc516afc0c5da760bc987 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Tue, 6 Apr 2004 20:03:17 +0000 Subject: [PATCH 0752/1463] A dummy uxtheme doesn't belong to ReactOS - it should be an external project. UxTheme says bye bye and good luck everyone svn path=/trunk/; revision=8989 --- reactos/lib/uxtheme/.cvsignore | 14 - reactos/lib/uxtheme/include/nostyle/button.h | 12 - reactos/lib/uxtheme/makefile | 31 - reactos/lib/uxtheme/nostyle/.cvsignore | 6 - reactos/lib/uxtheme/nostyle/button.c | 572 ------------------- reactos/lib/uxtheme/uxtheme.bpr | 124 ---- reactos/lib/uxtheme/uxtheme.def | 97 ---- reactos/lib/uxtheme/uxtheme.rc | 51 -- reactos/lib/uxtheme/uxthemedll.c | 263 --------- reactos/lib/uxtheme/uxthemedll.h | 73 --- 10 files changed, 1243 deletions(-) delete mode 100644 reactos/lib/uxtheme/.cvsignore delete mode 100644 reactos/lib/uxtheme/include/nostyle/button.h delete mode 100644 reactos/lib/uxtheme/makefile delete mode 100644 reactos/lib/uxtheme/nostyle/.cvsignore delete mode 100644 reactos/lib/uxtheme/nostyle/button.c delete mode 100644 reactos/lib/uxtheme/uxtheme.bpr delete mode 100644 reactos/lib/uxtheme/uxtheme.def delete mode 100644 reactos/lib/uxtheme/uxtheme.rc delete mode 100644 reactos/lib/uxtheme/uxthemedll.c delete mode 100644 reactos/lib/uxtheme/uxthemedll.h diff --git a/reactos/lib/uxtheme/.cvsignore b/reactos/lib/uxtheme/.cvsignore deleted file mode 100644 index 4d216868aec..00000000000 --- a/reactos/lib/uxtheme/.cvsignore +++ /dev/null @@ -1,14 +0,0 @@ -*.coff -*.dll -*.d -*.a -*.o -*.sym -*.map -*.tmp -*.~* -*.il? -*.res -*.tds -*.lib -*.xml diff --git a/reactos/lib/uxtheme/include/nostyle/button.h b/reactos/lib/uxtheme/include/nostyle/button.h deleted file mode 100644 index 01bc619d292..00000000000 --- a/reactos/lib/uxtheme/include/nostyle/button.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef UXTHEME_BUTTON_H__ -#define UXTHEME_BUTTON_H__ - -#include "uxthemedll.h" - -extern const UXTHEME_VTABLE Button_Vt; - - - -#endif - -/* EOF */ diff --git a/reactos/lib/uxtheme/makefile b/reactos/lib/uxtheme/makefile deleted file mode 100644 index 38c88faaa03..00000000000 --- a/reactos/lib/uxtheme/makefile +++ /dev/null @@ -1,31 +0,0 @@ -# $Id: makefile,v 1.3 2003/12/17 01:39:21 hyperion Exp $ - -PATH_TO_TOP = ../.. - -TARGET_DEFONLY = yes - -TARGET_TYPE = dynlink - -TARGET_NAME = uxtheme - -TARGET_SDKLIBS = kernel32.a user32.a gdi32.a - -TARGET_CFLAGS = -Wall -Werror -D_DISABLE_TIDENTS -D__USE_W32API -I./include - -TARGET_LFLAGS = -nostartfiles -Wl,--enable-stdcall-fixup - -TARGET_BASE = 0x5B180000 - -TARGET_OBJECTS = \ - uxthemedll.o \ - nostyle/button.o - -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/uxtheme/nostyle/.cvsignore b/reactos/lib/uxtheme/nostyle/.cvsignore deleted file mode 100644 index 962f3c27c2d..00000000000 --- a/reactos/lib/uxtheme/nostyle/.cvsignore +++ /dev/null @@ -1,6 +0,0 @@ -*.d -*.a -*.o -*.sym -*.obj -*.~* diff --git a/reactos/lib/uxtheme/nostyle/button.c b/reactos/lib/uxtheme/nostyle/button.c deleted file mode 100644 index 78205c02737..00000000000 --- a/reactos/lib/uxtheme/nostyle/button.c +++ /dev/null @@ -1,572 +0,0 @@ -#include "uxthemedll.h" -#include "nostyle/button.h" - -/* Functions */ -STDAPI Button_DrawBackground -( - IN OUT struct UXTHEME_DATA_ * pData, - IN HDC hdc, - IN int iPartId, - IN int iStateId, - IN const RECT * pRect, - IN const RECT * pClipRect -); - -STDAPI Button_DrawText -( - IN OUT struct UXTHEME_DATA_ * pData, - IN HDC hdc, - IN int iPartId, - IN int iStateId, - IN LPCWSTR pszText, - IN int iCharCount, - IN DWORD dwTextFlags, - IN DWORD dwTextFlags2, - IN const RECT * pRect -); - -STDAPI Button_GetBackgroundContentRect -( - IN OUT struct UXTHEME_DATA_ * pData, - IN HDC hdc, - IN int iPartId, - IN int iStateId, - IN const RECT * pBoundingRect, - OUT RECT * pContentRect -); - -STDAPI_(BOOL) Button_IsPartDefined -( - IN OUT struct UXTHEME_DATA_ * pData, - IN int iPartId, - IN int iStateId -); - -const UXTHEME_VTABLE Button_Vt = -{ - Button_DrawBackground, - Button_DrawText, - Button_GetBackgroundContentRect -}; - -/* - * - * DrawThemeBackground - * - */ - -/* BP_PUSHBUTTON */ -static const UINT Button_PushButton_State[] = -{ - DFCS_BUTTONPUSH, /* */ - DFCS_BUTTONPUSH, /* PBS_NORMAL */ - DFCS_BUTTONPUSH | DFCS_HOT, /* PBS_HOT */ - DFCS_BUTTONPUSH | DFCS_PUSHED, /* PBS_PRESSED */ - DFCS_BUTTONPUSH | DFCS_INACTIVE /* PBS_DISABLED */ - /* PBS_DEFAULTED */ -}; - -/* BP_RADIOBUTTON */ -static const UINT Button_RadioButton_State[] = -{ - DFCS_BUTTONRADIO, /* */ - DFCS_BUTTONRADIO, /* RBS_UNCHECKEDNORMAL */ - DFCS_BUTTONRADIO | DFCS_HOT, /* RBS_UNCHECKEDHOT */ - DFCS_BUTTONRADIO | DFCS_PUSHED, /* RBS_UNCHECKEDPRESSED */ - DFCS_BUTTONRADIO | DFCS_INACTIVE, /* RBS_UNCHECKEDDISABLED */ - DFCS_BUTTONRADIO | DFCS_CHECKED, /* RBS_CHECKEDNORMAL */ - DFCS_BUTTONRADIO | DFCS_CHECKED | DFCS_HOT, /* RBS_CHECKEDHOT */ - DFCS_BUTTONRADIO | DFCS_CHECKED | DFCS_PUSHED, /* RBS_CHECKEDPRESSED */ - DFCS_BUTTONRADIO | DFCS_CHECKED | DFCS_INACTIVE /* RBS_CHECKEDDISABLED */ -}; - -/* BP_CHECKBOX */ -static const UINT Button_CheckBox_State[] = -{ - DFCS_BUTTONCHECK, /* */ - DFCS_BUTTONCHECK, /* CBS_UNCHECKEDNORMAL */ - DFCS_BUTTONCHECK | DFCS_HOT, /* CBS_UNCHECKEDHOT */ - DFCS_BUTTONCHECK | DFCS_PUSHED, /* CBS_UNCHECKEDPRESSED */ - DFCS_BUTTONCHECK | DFCS_INACTIVE, /* CBS_UNCHECKEDDISABLED */ - DFCS_BUTTONCHECK | DFCS_CHECKED, /* CBS_CHECKEDNORMAL */ - DFCS_BUTTONCHECK | DFCS_CHECKED | DFCS_HOT, /* CBS_CHECKEDHOT */ - DFCS_BUTTONCHECK | DFCS_CHECKED | DFCS_PUSHED, /* CBS_CHECKEDPRESSED */ - DFCS_BUTTONCHECK | DFCS_CHECKED | DFCS_INACTIVE, /* CBS_CHECKEDDISABLED */ - DFCS_BUTTON3STATE | DFCS_CHECKED, /* CBS_MIXEDNORMAL */ - DFCS_BUTTON3STATE | DFCS_CHECKED | DFCS_HOT, /* CBS_MIXEDHOT */ - DFCS_BUTTON3STATE | DFCS_CHECKED | DFCS_PUSHED, /* CBS_MIXEDPRESSED */ - DFCS_BUTTON3STATE | DFCS_CHECKED | DFCS_INACTIVE /* CBS_MIXEDDISABLED */ -}; - -static UINT const * Button_Part_State[] = -{ - NULL, - Button_PushButton_State, - Button_RadioButton_State, - Button_CheckBox_State -}; - -STDAPI Button_DrawBackgroundSpecial -( - struct UXTHEME_DATA_ * pData, - HDC hdc, - int iPartId, - int iStateId, - const RECT * pRect -) -{ - HRESULT hres = S_FALSE; - - if(iPartId == BP_GROUPBOX) - { - if(!DrawEdge(hdc, (LPRECT)pRect, EDGE_ETCHED, BF_RECT)) - hres = HRESULT_FROM_WIN32(GetLastError()); - - hres = S_OK; - } - else if(iPartId == BP_PUSHBUTTON && iStateId == PBS_DEFAULTED) - { - RECT rcSave = *pRect; - - for(;;) - { - if(!FillRect(hdc, &rcSave, (HBRUSH)(COLOR_WINDOWFRAME + 1))) break; - if(!InflateRect(&rcSave, -1, -1)) break; - if(!DrawFrameControl(hdc, &rcSave, DFC_BUTTON, DFCS_BUTTONPUSH)) break; - hres = S_OK; - break; - } - - if(hres != S_OK) hres = HRESULT_FROM_WIN32(GetLastError()); - } - - return hres; -} - -STDAPI Button_DrawBackground -( - struct UXTHEME_DATA_ * pData, - HDC hdc, - int iPartId, - int iStateId, - const RECT * pRect, - const RECT * pClipRect -) -{ - UINT uState = 0; - HRGN hrgnSave; - HRESULT hres = S_OK; - - for(;;) - { - if(!Button_IsPartDefined(pData, iPartId, iStateId)) - { - hres = HRESULT_FROM_WIN32(ERROR_NOT_FOUND); - break; - } - - uState = Button_Part_State[iPartId][iStateId]; - - if(pClipRect && FAILED(hres = UxTheme_ClipDc(hdc, pClipRect, &hrgnSave))) - break; - - hres = Button_DrawBackgroundSpecial(pData, hdc, iPartId, iStateId, pRect); - - if(hres != S_FALSE) break; - - hres = S_OK; - - if(!DrawFrameControl(hdc, (LPRECT)pRect, DFC_BUTTON, uState)) - hres = HRESULT_FROM_WIN32(GetLastError()); - - if(pClipRect) UxTheme_UnclipDc(hdc, hrgnSave); - - break; - } - - return hres; -} - -/* - * - * DrawThemeText - * - */ -STDAPI_(BOOL) Button_TextGrayed -( - IN OUT struct UXTHEME_DATA_ * pData, - IN HDC hdc, - IN int iPartId, - IN int iStateId, - IN DWORD dwTextFlags2 -) -{ - if((dwTextFlags2 & DTT_GRAYED) == DTT_GRAYED) return TRUE; - - switch(iPartId) - { - case BP_PUSHBUTTON: - switch(iStateId) - { - case PBS_DISABLED: - return TRUE; - } - - break; - - case BP_RADIOBUTTON: - switch(iStateId) - { - case RBS_UNCHECKEDDISABLED: - case RBS_CHECKEDDISABLED: - return TRUE; - } - - break; - - case BP_CHECKBOX: - switch(iStateId) - { - case CBS_UNCHECKEDDISABLED: - case CBS_CHECKEDDISABLED: - case CBS_MIXEDDISABLED: - return TRUE; - } - - break; - - case BP_GROUPBOX: - switch(iStateId) - { - case GBS_DISABLED: - return TRUE; - } - - break; - - case BP_USERBUTTON: - case 0: - default: - break; - } - - return FALSE; -} - -struct Button_DrawTextString -{ - LPCWSTR pszText; - int iCharCount; -}; - -BOOL CALLBACK Button_DrawTextStateProc -( - HDC hdc, - LPARAM lData, - WPARAM wData, - int cx, - int cy -) -{ - RECT rc; - - rc.left = 0; - rc.top = 0; - rc.right = cx; - rc.bottom = cy; - - return DrawTextW - ( - hdc, - ((struct Button_DrawTextString *)lData)->pszText, - ((struct Button_DrawTextString *)lData)->iCharCount, - &rc, - (UINT)wData - ); -} - -STDAPI Button_DrawText -( - IN OUT struct UXTHEME_DATA_ * pData, - IN HDC hdc, - IN int iPartId, - IN int iStateId, - IN LPCWSTR pszText, - IN int iCharCount, - IN DWORD dwTextFlags, - IN DWORD dwTextFlags2, - IN const RECT * pRect -) -{ - BOOL bRet; - int nBkMode; - COLORREF clrOld; - struct Button_DrawTextString dtsString; - DWORD dwDSFlags = DST_COMPLEX; - HRESULT hres = S_OK; - - for(;;) - { - /* check if the part is supported */ - if(!Button_IsPartDefined(pData, iPartId, iStateId)) - { - hres = HRESULT_FROM_WIN32(ERROR_NOT_FOUND); - break; - } - - nBkMode = SetBkMode(hdc, TRANSPARENT); - clrOld = SetTextColor(hdc, GetSysColor(COLOR_BTNTEXT)); - - if(Button_TextGrayed(pData, hdc, iPartId, iStateId, dwTextFlags2)) - dwDSFlags |= DSS_DISABLED; - - dtsString.pszText = pszText; - dtsString.iCharCount = iCharCount; - - bRet = DrawStateW - ( - hdc, - NULL, - Button_DrawTextStateProc, - (LPARAM)&dtsString, - (WPARAM)dwTextFlags, - pRect->left, - pRect->top, - pRect->right - pRect->left, - pRect->bottom - pRect->top, - dwDSFlags - ); - - if(!bRet) hres = HRESULT_FROM_WIN32(GetLastError()); - - SetTextColor(hdc, clrOld); - SetBkMode(hdc, nBkMode); - - break; - } - - return hres; -} - -/* - * - * GetThemeBackgroundContentRect - * - */ -STDAPI Button_GetBackgroundContentRectSpecial -( - IN OUT struct UXTHEME_DATA_ * pData, - IN HDC hdc, - IN int iPartId, - IN int iStateId, - IN const RECT * pBoundingRect, - OUT RECT * pContentRect -) -{ - HRESULT hres = S_FALSE; - - if(iPartId == BP_GROUPBOX) - { - RECT rc = *pBoundingRect; - - if(!DrawEdge(hdc, &rc, EDGE_ETCHED, BF_RECT | BF_ADJUST)) - hres = HRESULT_FROM_WIN32(GetLastError()); - - *pContentRect = rc; - hres = S_OK; - } - else if(iPartId == BP_PUSHBUTTON && iStateId == PBS_DEFAULTED) - { - RECT rc = *pBoundingRect; - - InflateRect(&rc, -1, -1); - - if(!DrawFrameControl(hdc, &rc, DFC_BUTTON, DFCS_BUTTONPUSH | DFCS_ADJUSTRECT)) - hres = HRESULT_FROM_WIN32(GetLastError()); - else - { - *pContentRect = rc; - hres = S_OK; - } - } - - return hres; -} - -STDAPI Button_GetBackgroundContentRect -( - IN OUT struct UXTHEME_DATA_ * pData, - IN HDC hdc, - IN int iPartId, - IN int iStateId, - IN const RECT * pBoundingRect, - OUT RECT * pContentRect -) -{ - RECT rc; - HDC hdcCompat = NULL; - BOOL bRet; - HRESULT hres = S_OK; - - for(;;) - { - if(!Button_IsPartDefined(pData, iPartId, iStateId)) - { - hres = HRESULT_FROM_WIN32(ERROR_NOT_FOUND); - break; - } - - hdcCompat = CreateCompatibleDC(hdc); - - if(hdcCompat == NULL) - { - hres = HRESULT_FROM_WIN32(GetLastError()); - break; - } - - hres = Button_GetBackgroundContentRectSpecial - ( - pData, - hdcCompat, - iPartId, - iStateId, - pBoundingRect, - pContentRect - ); - - if(hres != S_FALSE) break; - - hres = S_OK; - rc = *pBoundingRect; - - bRet = DrawFrameControl - ( - hdcCompat, - &rc, - DFC_BUTTON, - Button_Part_State[iPartId][iStateId] | DFCS_ADJUSTRECT - ); - - if(!bRet) - { - hres = HRESULT_FROM_WIN32(GetLastError()); - break; - } - - *pContentRect = rc; - - break; - } - - DeleteDC(hdcCompat); - - return hres; -} - -/* - * - * IsThemePartDefined - * - */ -STDAPI_(BOOL) Button_IsPartDefined -( - struct UXTHEME_DATA_ * pData, - int iPartId, - int iStateId -) -{ - switch(iPartId) - { - case BP_PUSHBUTTON: - switch(iStateId) - { - case 0: - case PBS_NORMAL: - case PBS_HOT: - case PBS_PRESSED: - case PBS_DISABLED: - case PBS_DEFAULTED: - break; - - default: - return FALSE; - } - - break; - - case BP_RADIOBUTTON: - switch(iStateId) - { - case 0: - case RBS_UNCHECKEDNORMAL: - case RBS_UNCHECKEDHOT: - case RBS_UNCHECKEDPRESSED: - case RBS_UNCHECKEDDISABLED: - case RBS_CHECKEDNORMAL: - case RBS_CHECKEDHOT: - case RBS_CHECKEDPRESSED: - case RBS_CHECKEDDISABLED: - break; - - default: - return FALSE; - } - - break; - - case BP_CHECKBOX: - switch(iStateId) - { - case 0: - case CBS_UNCHECKEDNORMAL: - case CBS_UNCHECKEDHOT: - case CBS_UNCHECKEDPRESSED: - case CBS_UNCHECKEDDISABLED: - case CBS_CHECKEDNORMAL: - case CBS_CHECKEDHOT: - case CBS_CHECKEDPRESSED: - case CBS_CHECKEDDISABLED: - case CBS_MIXEDNORMAL: - case CBS_MIXEDHOT: - case CBS_MIXEDPRESSED: - case CBS_MIXEDDISABLED: - break; - - default: - return FALSE; - } - - break; - - case BP_GROUPBOX: - switch(iStateId) - { - case 0: - case GBS_DISABLED: - case GBS_NORMAL: - break; - - default: - return FALSE; - } - - break; - - case BP_USERBUTTON: - case 0: - default: - return FALSE; - } - - return TRUE; -} - -/* Initialization */ -#if 0 -STDAPI Button_Initialize(void) -{ -} -#endif - -/* EOF */ - diff --git a/reactos/lib/uxtheme/uxtheme.bpr b/reactos/lib/uxtheme/uxtheme.bpr deleted file mode 100644 index bee5c2fa03a..00000000000 --- a/reactos/lib/uxtheme/uxtheme.bpr +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -[Version Info] -IncludeVerInfo=0 -AutoIncBuild=0 -MajorVer=1 -MinorVer=0 -Release=0 -Build=0 -Debug=0 -PreRelease=0 -Special=0 -Private=0 -DLL=0 -Locale=1040 -CodePage=1252 - -[Version Info Keys] -CompanyName= -FileDescription= -FileVersion=1.0.0.0 -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion=1.0.0.0 -Comments= - -[Debugging] -DebugSourceDirs=$(BCB)\source\vcl - -[Parameters] -RunParams= -Launcher= -UseLauncher=0 -DebugCWD= -HostApplication=D:\misc\cvsroot\reactos\reactos\lib\uxtheme\XPThemeExplorer6.exe -RemoteHost= -RemotePath= -RemoteLauncher= -RemoteCWD= -RemoteDebug=0 - -[Compiler] -ShowInfoMsgs=0 -LinkDebugVcl=0 -LinkCGLIB=0 - -[CORBA] -AddServerUnit=1 -AddClientUnit=1 -PrecompiledHeaders=1 - -[Language] -ActiveLang= -ProjectLang= -RootDir= - -[Linker] -LibPrefix= -LibSuffix= -LibVersion= - - \ No newline at end of file diff --git a/reactos/lib/uxtheme/uxtheme.def b/reactos/lib/uxtheme/uxtheme.def deleted file mode 100644 index d1a172bb6b8..00000000000 --- a/reactos/lib/uxtheme/uxtheme.def +++ /dev/null @@ -1,97 +0,0 @@ -LIBRARY UXTHEME.DLL - -EXPORTS -; @0 -; @1 -; @2 -; @3 -; @4 -CloseThemeData @5 -DrawThemeBackground @6 -; @7 -; @8 -; @9 -; @10 -; @11 -;DrawThemeEdge @12 -; @13 -; @14 -; @15 -; @16 -; @17 -; @18 -; @19 -; @20 -; @21 -; @22 -; @23 -; @24 -; @25 -; @26 -; @27 -; @28 -; @29 -; @30 -; @31 -; @32 -; @33 -; @34 -; @35 -; @36 -;DrawThemeIcon @37 -DrawThemeParentBackground @38 -DrawThemeText @39 -;EnableThemeDialogTexture @40 -;EnableTheming @41 -;GetCurrentThemeName @42 -; @43 -; @44 -; @45 -; @46 -; @47 -; @48 -;GetThemeAppProperties @49 -GetThemeBackgroundContentRect @50 -;GetThemeBackgroundExtent @51 -;GetThemeBackgroundRegion @52 -;GetThemeBool @53 -;GetThemeColor @54 -;GetThemeDocumentationProperty @55 -;GetThemeEnumValue @56 -;GetThemeFilename @57 -;GetThemeFont @58 -;GetThemeInt @59 -; @60 -; @61 -; @62 -; @63 -;GetThemeIntList @64 -;GetThemeMargins @65 -;GetThemeMetric @66 -;GetThemePartSize @67 -;GetThemePosition @68 -;GetThemePropertyOrigin @69 -;GetThemeRect @70 -;GetThemeString @71 -;GetThemeSysBool @72 -;GetThemeSysColor @73 -;GetThemeSysColorBrush @74 -;GetThemeSysFont @75 -;GetThemeSysInt @76 -;GetThemeSysSize @77 -;GetThemeSysString @78 -;GetThemeTextExtent @79 -;GetThemeTextMetrics @80 -;GetWindowTheme @81 -;HitTestThemeBackground @82 -IsAppThemed @83 -;IsThemeActive @84 -IsThemeBackgroundPartiallyTransparent @85 -;IsThemeDialogTextureEnabled @86 -;IsThemePartDefined @87 -OpenThemeData @88 -;SetThemeAppProperties @89 -;SetWindowTheme @90 - -; EOF - diff --git a/reactos/lib/uxtheme/uxtheme.rc b/reactos/lib/uxtheme/uxtheme.rc deleted file mode 100644 index cfe2bbfbc89..00000000000 --- a/reactos/lib/uxtheme/uxtheme.rc +++ /dev/null @@ -1,51 +0,0 @@ -#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" - { - BLOCK "040904b0" - { - VALUE "CompanyName", RES_STR_COMPANY_NAME - VALUE "FileDescription", "ReactOS UxTheme\0" - VALUE "FileVersion", RES_STR_FILE_VERSION - VALUE "InternalName", "uxtheme\0" - VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT - VALUE "OriginalFilename", "uxtheme.dll\0" - VALUE "ProductName", RES_STR_PRODUCT_NAME - VALUE "ProductVersion", RES_STR_PRODUCT_VERSION - } - } - - BLOCK "VarFileInfo" - { - VALUE "Translation", 0x409, 1200 - } -END - -/* EOF */ diff --git a/reactos/lib/uxtheme/uxthemedll.c b/reactos/lib/uxtheme/uxthemedll.c deleted file mode 100644 index 9f74a792b6c..00000000000 --- a/reactos/lib/uxtheme/uxthemedll.c +++ /dev/null @@ -1,263 +0,0 @@ -#include "uxthemedll.h" -#include "nostyle/button.h" - -#include - -#define HTHEME_TO_UXTHEME_(H__) ((PUXTHEME_DATA)(H__)) - -STDAPI UxTheme_ClipDc(HDC hdc, const RECT * pClipRect, HRGN * phrgnSave) -{ - *phrgnSave = CreateRectRgn(0, 0, 0, 0); - - switch(GetClipRgn(hdc, *phrgnSave)) - { - /* no user-defined clipping region */ - case 0: - { - HRGN hrgnClip; - - /* no region to restore */ - DeleteObject(*phrgnSave); - *phrgnSave = NULL; - - /* create the clipping rectangle */ - if((hrgnClip = CreateRectRgnIndirect(pClipRect)) != NULL) - { - /* select the clipping rectangle */ - if(SelectClipRgn(hdc, hrgnClip) != ERROR) - { - /* success */ - DeleteObject(hrgnClip); - return S_OK; - } - - /* failure */ - DeleteObject(hrgnClip); - } - - break; - } - - /* user-defined clipping region */ - case 1: - { - HRGN hrgnClip; - - /* create the clipping rectangle */ - if((hrgnClip = CreateRectRgnIndirect(pClipRect)) != NULL) - { - /* select the clipping rectangle */ - if(ExtSelectClipRgn(hdc, hrgnClip, RGN_AND) != ERROR) - { - /* success */ - DeleteObject(hrgnClip); - return S_OK; - } - - /* failure */ - DeleteObject(hrgnClip); - } - - break; - } - - /* error */ - case -1: - { - /* no region to restore */ - DeleteObject(*phrgnSave); - *phrgnSave = NULL; - - break; - } - } - - /* failure */ - return HRESULT_FROM_WIN32(GetLastError()); -} - -STDAPI UxTheme_UnclipDc(HDC hdc, HRGN hrgnSave) -{ - HRESULT hres; - - if(hrgnSave == NULL) return S_FALSE; - - if(SelectClipRgn(hdc, hrgnSave) != ERROR) hres = S_OK; - else hres = HRESULT_FROM_WIN32(GetLastError()); - - DeleteObject(hrgnSave); - return hres; -} - -THEMEAPI DrawThemeBackground -( - HTHEME hTheme, - HDC hdc, - int iPartId, - int iStateId, - const RECT * pRect, - const RECT * pClipRect -) -{ - PUXTHEME_DATA pUxTheme = HTHEME_TO_UXTHEME_(hTheme); - - return pUxTheme->pvt->p_DrawBackground - ( - pUxTheme, - hdc, - iPartId, - iStateId, - pRect, - pClipRect - ); -} - -THEMEAPI DrawThemeEdge -( - HTHEME hTheme, - HDC hdc, - int iPartId, - int iStateId, - const RECT * pDestRect, - UINT uEdge, - UINT uFlags, - RECT * pContentRect -) -{ - return E_FAIL; -} - -THEMEAPI DrawThemeIcon -( - HTHEME hTheme, - HDC hdc, - int iPartId, - int iStateId, - const RECT * pRect, - HIMAGELIST himl, - int iImageIndex -) -{ - return E_FAIL; -} - -THEMEAPI DrawThemeParentBackground -( - HWND hwnd, - HDC hdc, - RECT * prc -) -{ - return E_FAIL; -} - -THEMEAPI DrawThemeText -( - IN HTHEME hTheme, - IN HDC hdc, - IN int iPartId, - IN int iStateId, - IN LPCWSTR pszText, - IN int iCharCount, - IN DWORD dwTextFlags, - IN DWORD dwTextFlags2, - IN const RECT * pRect -) -{ - PUXTHEME_DATA pUxTheme = HTHEME_TO_UXTHEME_(hTheme); - - return pUxTheme->pvt->p_DrawText - ( - pUxTheme, - hdc, - iPartId, - iStateId, - pszText, - iCharCount, - dwTextFlags, - dwTextFlags2, - pRect - ); -} - -THEMEAPI GetThemeBackgroundContentRect -( - IN HTHEME hTheme, - IN HDC hdc, - IN int iPartId, - IN int iStateId, - IN const RECT * pBoundingRect, - OUT RECT * pContentRect -) -{ - PUXTHEME_DATA pUxTheme = HTHEME_TO_UXTHEME_(hTheme); - - return pUxTheme->pvt->p_GetBackgroundContentRect - ( - pUxTheme, - hdc, - iPartId, - iStateId, - pBoundingRect, - pContentRect - ); -} - -THEMEAPI_(BOOL) IsThemeBackgroundPartiallyTransparent -( - HTHEME hTheme, - int iPartId, - int iStateId -) -{ - return FALSE; -} - -THEMEAPI_(BOOL) IsAppThemed(void) -{ - return TRUE; -} - -THEMEAPI_(HTHEME) OpenThemeData -( - HWND hwnd, - LPCWSTR pszClassList -) -{ - PUXTHEME_DATA pUxTheme; - PCUXTHEME_VTABLE pvt; - - /* FIXME: support class lists */ - if(_wcsicmp(pszClassList, L"Button") == 0) pvt = &Button_Vt; - else return NULL; - - pUxTheme = (PUXTHEME_DATA)malloc(sizeof(*pUxTheme)); - - if(pUxTheme == NULL) return NULL; - - pUxTheme->pvt = pvt; - - return (HTHEME)pUxTheme; -} - -THEMEAPI CloseThemeData -( - HTHEME hTheme -) -{ - return E_FAIL; -} - -BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved) -{ - (void)lpvReserved; - - if(fwdreason == DLL_PROCESS_ATTACH) - DisableThreadLibraryCalls(hinstDLL); - - return TRUE; -} - -/* EOF */ - - diff --git a/reactos/lib/uxtheme/uxthemedll.h b/reactos/lib/uxtheme/uxthemedll.h deleted file mode 100644 index a78f6670011..00000000000 --- a/reactos/lib/uxtheme/uxthemedll.h +++ /dev/null @@ -1,73 +0,0 @@ -#ifndef UXTHEMEDLL_H_INCLUDED__ -#define UXTHEMEDLL_H_INCLUDED__ - -#include - -#define _UXTHEME_ -#include -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - -struct UXTHEME_DATA_; -struct UXTHEME_VTABLE_; - -struct UXTHEME_VTABLE_ -{ - HRESULT (STDAPICALLTYPE * p_DrawBackground) - ( - IN OUT struct UXTHEME_DATA_ * pData, - IN HDC hdc, - IN int iPartId, - IN int iStateId, - IN const RECT * pRect, - IN const RECT * pClipRect - ); - - HRESULT (STDAPICALLTYPE * p_DrawText) - ( - IN OUT struct UXTHEME_DATA_ * pData, - IN HDC hdc, - IN int iPartId, - IN int iStateId, - IN LPCWSTR pszText, - IN int iCharCount, - IN DWORD dwTextFlags, - IN DWORD dwTextFlags2, - IN const RECT * pRect - ); - - HRESULT (STDAPICALLTYPE * p_GetBackgroundContentRect) - ( - IN OUT struct UXTHEME_DATA_ * pData, - IN HDC hdc, - IN int iPartId, - IN int iStateId, - IN const RECT * pBoundingRect, - OUT RECT * pContentRect - ); -}; - -typedef struct UXTHEME_VTABLE_ UXTHEME_VTABLE, * PUXTHEME_VTABLE; -typedef const struct UXTHEME_VTABLE_ * PCUXTHEME_VTABLE; - -typedef struct UXTHEME_DATA_ -{ - PCUXTHEME_VTABLE pvt; - PVOID pData; -} -UXTHEME_DATA, * PUXTHEME_DATA; - -STDAPI UxTheme_ClipDc(HDC hdc, const RECT * pClipRect, HRGN * phrgnSave); -STDAPI UxTheme_UnclipDc(HDC hdc, HRGN hrgnSave); - -#ifdef __cplusplus -} -#endif - -#endif - -/* EOF */ From 5fd4628dec01cf60e4b0b5200cc92cf2fe59cd48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Tue, 6 Apr 2004 20:59:40 +0000 Subject: [PATCH 0753/1463] Silence debug messages svn path=/trunk/; revision=8990 --- reactos/lib/kernel32/mem/global.c | 34 +++++++++++++++---------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/reactos/lib/kernel32/mem/global.c b/reactos/lib/kernel32/mem/global.c index 3184b896bf1..3aeefbade68 100644 --- a/reactos/lib/kernel32/mem/global.c +++ b/reactos/lib/kernel32/mem/global.c @@ -1,4 +1,4 @@ -/* $Id: global.c,v 1.21 2004/02/18 23:20:14 gvg Exp $ +/* $Id: global.c,v 1.22 2004/04/06 20:59:40 gvg Exp $ * * Win32 Global/Local heap functions (GlobalXXX, LocalXXX). * These functions included in Win32 for compatibility with 16 bit Windows @@ -47,10 +47,10 @@ typedef struct __GLOBAL_LOCAL_HANDLE static void DbgPrintStruct(PGLOBAL_HANDLE h) { - DbgPrint("Magic: 0x%X\n", h->Magic); - DbgPrint("Pointer: 0x%X\n", h->Pointer); - DbgPrint("Flags: 0x%X\n", h->Flags); - DbgPrint("LockCount: 0x%X\n", h->LockCount); + DPRINT("Magic: 0x%X\n", h->Magic); + DPRINT("Pointer: 0x%X\n", h->Pointer); + DPRINT("Flags: 0x%X\n", h->Flags); + DPRINT("LockCount: 0x%X\n", h->LockCount); } @@ -116,10 +116,10 @@ GlobalAlloc(UINT uFlags, } else { - DbgPrint("Allocated a 0 size movable block.\n"); + DPRINT("Allocated a 0 size movable block.\n"); DbgPrintStruct(phandle); - DbgPrint("Address of the struct: 0x%X\n", phandle); - DbgPrint("Address of pointer: 0x%X\n", &(phandle->Pointer)); + DPRINT("Address of the struct: 0x%X\n", phandle); + DPRINT("Address of pointer: 0x%X\n", &(phandle->Pointer)); } } HeapUnlock(hProcessHeap); @@ -170,11 +170,11 @@ GlobalFlags(HGLOBAL hMem) DWORD retval; PGLOBAL_HANDLE phandle; - DbgPrint("GlobalFlags( 0x%lX )\n", (ULONG)hMem); + DPRINT("GlobalFlags( 0x%lX )\n", (ULONG)hMem); if(!ISHANDLE(hMem)) { - DbgPrint("GlobalFlags: Fixed memory.\n"); + DPRINT("GlobalFlags: Fixed memory.\n"); retval = 0; } else @@ -198,7 +198,7 @@ GlobalFlags(HGLOBAL hMem) } else { - DbgPrint("GlobalSize: invalid handle\n"); + DPRINT1("GlobalSize: invalid handle\n"); retval = 0; } HeapUnlock(GetProcessHeap()); @@ -233,7 +233,7 @@ GlobalFree(HGLOBAL hMem) if(phandle->LockCount!=0) { - DbgPrint("Warning! GlobalFree(0x%X) Freeing a handle to a locked object.\n", hMem); + DPRINT1("Warning! GlobalFree(0x%X) Freeing a handle to a locked object.\n", hMem); SetLastError(ERROR_INVALID_HANDLE); } @@ -260,11 +260,11 @@ GlobalHandle(LPCVOID pMem) PGLOBAL_HANDLE test = 0; LPCVOID pointer_test = 0; - DbgPrint("GlobalHandle( 0x%lX )\n", (ULONG)pMem); + DPRINT("GlobalHandle( 0x%lX )\n", (ULONG)pMem); if (0 == pMem) /*Invalid argument */ { SetLastError(ERROR_INVALID_PARAMETER); - DbgPrint("Error: 0 handle.\n"); + DPRINT1("Error: 0 handle.\n"); return 0; } @@ -300,7 +300,7 @@ GlobalHandle(LPCVOID pMem) } else { - DbgPrint("GlobalHandle: Bad read pointer.\n"); + DPRINT1("GlobalHandle: Bad read pointer.\n"); SetLastError(ERROR_INVALID_HANDLE); handle = 0; } @@ -533,7 +533,7 @@ GlobalSize(HGLOBAL hMem) SIZE_T retval = 0; PGLOBAL_HANDLE phandle = 0; - DbgPrint("GlobalSize( 0x%lX )\n", (ULONG)hMem); + DPRINT("GlobalSize( 0x%lX )\n", (ULONG)hMem); if(ISPOINTER(hMem)) /*FIXED*/ { @@ -558,7 +558,7 @@ GlobalSize(HGLOBAL hMem) ** We should choose an error value to set as ** the last error. Which One? */ - DbgPrint("GlobalSize: RtlSizeHeap failed.\n"); + DPRINT("GlobalSize: RtlSizeHeap failed.\n"); retval = 0; } else /*Everything is ok*/ From 4466dbbf17edf6e4d2e247c4a35317124bba0325 Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Tue, 6 Apr 2004 21:04:42 +0000 Subject: [PATCH 0754/1463] Update the readme a bit. svn path=/trunk/; revision=8991 --- rosapps/readme.txt | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/rosapps/readme.txt b/rosapps/readme.txt index 509b36b8636..bd718adf95e 100644 --- a/rosapps/readme.txt +++ b/rosapps/readme.txt @@ -1,22 +1,19 @@ -$Id: readme.txt,v 1.4 2001/12/30 20:29:54 sedwards Exp $ +$Id: readme.txt,v 1.5 2004/04/06 21:04:42 sedwards Exp $ -This directory contains core applications that support the -ReactOS kernel. +This directory contains extra applicatons for ReactOS. +Make sure you also have a copy of the rest of the ReactOS +source before you attempt to build anything in this module. -Before you start to compile applications check the HOST -variable in 'rules.mak'. - -The following is a short decription of each. Check the +The following is a short decription of each. Check for a readme.txt under each application for more details. -CMD : This is Eric Kohl's port of COMMAND for ReactOS. +CALC : A clone of calc CMDUTILS: External commands for CMD. -DEVUTILS: -DFLAT32 : +DEVUTILS: Extra developer tools. +DFLAT32 : Console text editor +GAMES : The start of the ReactOS games collection MC : Midnight Commander -NET : Ping, Ncftp, Telnet +NET : Network tools: Arp, finger, Ping, Ncftp, Telnet, etc... +NOTEPAD : Notepad clone. NOTEVIL : ReactOS Coders Console Parade. -SYSUTILS: ReactOS System Utilities. -TASKMGR : Brian Palmer's Taskmanager - - +SYSUTILS: System Utilities. From 409aaad5d5d0cef8163eacded4179e89aadf7064 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Tue, 6 Apr 2004 21:19:44 +0000 Subject: [PATCH 0755/1463] - Fixed some dumb bugs in 1bpp code causing memory corruption. svn path=/trunk/; revision=8992 --- reactos/subsys/win32k/dib/dib1bpp.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib1bpp.c b/reactos/subsys/win32k/dib/dib1bpp.c index ab66c9eb6a4..9651343056f 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.18 2004/04/06 17:54:32 weiden Exp $ */ +/* $Id: dib1bpp.c,v 1.19 2004/04/06 21:19:44 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include @@ -405,7 +405,7 @@ DIB_1BPP_BitBlt( UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); - RoundedRight = DestRect->right - ((DestRect->right - DestRect->left) & 0x7); + RoundedRight = DestRect->right - ((DestRect->right - DestRect->left) & 0x31); SourceY = SourcePoint->y; for (Y = DestRect->top; Y < DestRect->bottom; Y++) @@ -417,16 +417,18 @@ DIB_1BPP_BitBlt( Y * DestSurf->lDelta); X = DestRect->left; - if (X & 7) + if (X & 31) { + /* FIXME: This case is completely untested!!! */ + Dest = *((PBYTE)DestBits); - NoBits = 7 - (X & 7); + NoBits = 31 - (X & 31); if (UsesSource) { Source = 0; - for (k = 7 - NoBits; k < NoBits; k++) - Source |= (DIB_GetSource(SourceSurf, SourceGDI, SourceX + k, SourceY, ColorTranslation) << (7 - k)); + for (k = 31 - NoBits; k < NoBits; k++) + Source |= (DIB_GetSource(SourceSurf, SourceGDI, SourceX + k, SourceY, ColorTranslation) << (31 - k)); } if (UsesPattern) @@ -434,8 +436,8 @@ DIB_1BPP_BitBlt( if (Brush->iSolidColor == 0xFFFFFFFF) { Pattern = 0; - for (k = 7 - NoBits; k < NoBits; k++) - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k) % PatternWidth, Y % PatternHeight) << (7 - k)); + for (k = 31 - NoBits; k < NoBits; k++) + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k) % PatternWidth, Y % PatternHeight) << (31 - k)); } else { @@ -444,8 +446,10 @@ DIB_1BPP_BitBlt( } Dest = DIB_DoRop(Rop4, Dest, Source, Pattern); - Dest &= ~((1 << (7 - NoBits)) - 1); - Dest |= *((PBYTE)DestBits) & ((1 << (7 - NoBits)) - 1); + Dest &= ~((1 << (31 - NoBits)) - 1); + Dest |= *((PBYTE)DestBits) & ((1 << (31 - NoBits)) - 1); + + *DestBits = Dest; X += NoBits; SourceX += NoBits; From 95057e2cf74acf51c9bbc2ad222079a3b4edefdd Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Tue, 6 Apr 2004 21:53:48 +0000 Subject: [PATCH 0756/1463] implemented TransparentBlt() on 16bpp and 24bpp surfaces svn path=/trunk/; revision=8993 --- reactos/subsys/win32k/dib/dib.c | 4 +- reactos/subsys/win32k/dib/dib.h | 2 +- reactos/subsys/win32k/dib/dib16bpp.c | 62 +++++++++++++++++++++++--- reactos/subsys/win32k/dib/dib24bpp.c | 31 ++++++++++++- reactos/subsys/win32k/dib/dib32bpp.c | 23 ++++------ reactos/subsys/win32k/eng/bitblt.c | 4 +- reactos/subsys/win32k/eng/gradient.c | 7 +-- reactos/subsys/win32k/eng/transblt.c | 20 ++++++++- reactos/subsys/win32k/include/inteng.h | 2 + 9 files changed, 120 insertions(+), 35 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib.c b/reactos/subsys/win32k/dib/dib.c index 3825379d54f..5023165be5a 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.8 2004/04/06 17:54:32 weiden Exp $ */ +/* $Id: dib.c,v 1.9 2004/04/06 21:53:48 weiden Exp $ */ #include #include @@ -68,7 +68,7 @@ DIB_GetSource(SURFOBJ* SourceSurf, SURFGDI* SourceGDI, ULONG sx, ULONG sy, XLATE } ULONG -DIB_GetOriginalSource(SURFOBJ* SourceSurf, SURFGDI* SourceGDI, ULONG sx, ULONG sy) +DIB_GetSourceIndex(SURFOBJ* SourceSurf, SURFGDI* SourceGDI, ULONG sx, ULONG sy) { switch (SourceGDI->BitsPerPixel) { diff --git a/reactos/subsys/win32k/dib/dib.h b/reactos/subsys/win32k/dib/dib.h index fd71097f82e..2c3dac2e035 100644 --- a/reactos/subsys/win32k/dib/dib.h +++ b/reactos/subsys/win32k/dib/dib.h @@ -3,7 +3,7 @@ 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_GetOriginalSource(SURFOBJ* SourceSurf, SURFGDI* SourceGDI, ULONG sx, ULONG sy); +ULONG DIB_GetSourceIndex(SURFOBJ* SourceSurf, SURFGDI* SourceGDI, ULONG sx, ULONG sy); VOID DIB_1BPP_PutPixel(SURFOBJ* SurfObj, LONG x, LONG y, ULONG c); ULONG DIB_1BPP_GetPixel(SURFOBJ* SurfObj, LONG x, LONG y); diff --git a/reactos/subsys/win32k/dib/dib16bpp.c b/reactos/subsys/win32k/dib/dib16bpp.c index 3b6b002b69b..60849250f4c 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.23 2004/04/06 17:54:32 weiden Exp $ */ +/* $Id: dib16bpp.c,v 1.24 2004/04/06 21:53:48 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -283,7 +283,7 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, { ULONG X, Y; ULONG SourceX, SourceY; - ULONG Dest, Source, Pattern = 0; + ULONG wd, Dest, Source, Pattern = 0; PULONG DestBits; BOOL UsesSource; BOOL UsesPattern; @@ -333,7 +333,8 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PatternHeight = PatternObj->sizlBitmap.cy; } } - + + wd = ((DestRect->right - DestRect->left) << 1) - DestSurf->lDelta; RoundedRight = DestRect->right - ((DestRect->right - DestRect->left) & 0x1); SourceY = SourcePoint->y; DestBits = (PULONG)( @@ -394,9 +395,7 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SourceY++; DestBits = (PULONG)( - (ULONG_PTR)DestBits - - ((DestRect->right - DestRect->left) << 1) + - DestSurf->lDelta); + (ULONG_PTR)DestBits - wd); } if (PatternSurface != NULL) @@ -608,7 +607,56 @@ DIB_16BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, RECTL* DestRect, POINTL *SourcePoint, XLATEOBJ *ColorTranslation, ULONG iTransColor) { - return FALSE; + ULONG X, Y, SourceX, SourceY, Source, wd, Dest; + LONG RoundedRight; + ULONG *DestBits; + + RoundedRight = DestRect->right - ((DestRect->right - DestRect->left) & 0x1); + SourceY = SourcePoint->y; + DestBits = (ULONG*)(DestSurf->pvScan0 + + (DestRect->left << 1) + + DestRect->top * DestSurf->lDelta); + wd = ((DestRect->right - DestRect->left) << 1) - DestSurf->lDelta; + + for(Y = DestRect->top; Y < DestRect->bottom; Y++) + { + SourceX = SourcePoint->x; + for(X = DestRect->left; X < RoundedRight; X += 2, DestBits++, SourceX += 2) + { + Dest = *DestBits; + + Source = DIB_GetSourceIndex(SourceSurf, SourceGDI, SourceX, SourceY); + if(Source != iTransColor) + { + Dest &= 0xFFFF0000; + Dest |= (XLATEOBJ_iXlate(ColorTranslation, Source) & 0xFFFF); + } + + Source = DIB_GetSourceIndex(SourceSurf, SourceGDI, SourceX + 1, SourceY); + if(Source != iTransColor) + { + Dest &= 0xFFFF; + Dest |= (XLATEOBJ_iXlate(ColorTranslation, Source) << 16); + } + + *DestBits = Dest; + } + + if(X < DestRect->right) + { + Source = DIB_GetSourceIndex(SourceSurf, SourceGDI, SourceX, SourceY); + if(Source != iTransColor) + { + *((USHORT*)DestBits) = (USHORT)(XLATEOBJ_iXlate(ColorTranslation, Source) << 16); + } + + DestBits = (PULONG)((ULONG_PTR)DestBits + 2); + } + SourceY++; + DestBits = (ULONG*)((ULONG_PTR)DestBits - wd); + } + + return TRUE; } /* EOF */ diff --git a/reactos/subsys/win32k/dib/dib24bpp.c b/reactos/subsys/win32k/dib/dib24bpp.c index 36911add3fa..e696ad73ed8 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.19 2004/04/06 17:54:32 weiden Exp $ */ +/* $Id: dib24bpp.c,v 1.20 2004/04/06 21:53:48 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -367,7 +367,34 @@ DIB_24BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, RECTL* DestRect, POINTL *SourcePoint, XLATEOBJ *ColorTranslation, ULONG iTransColor) { - return FALSE; + ULONG X, Y, SourceX, SourceY, Source, wd, Dest; + BYTE *DestBits; + + SourceY = SourcePoint->y; + DestBits = (BYTE*)(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++) + { + SourceX = SourcePoint->x; + for(X = DestRect->left; X < DestRect->right; X++, DestBits += 3, SourceX++) + { + Source = DIB_GetSourceIndex(SourceSurf, SourceGDI, SourceX, SourceY); + if(Source != iTransColor) + { + Dest = XLATEOBJ_iXlate(ColorTranslation, Source) & 0xFFFFFF; + *(PUSHORT)(DestBits) = Dest & 0xFFFF; + *(DestBits + 2) = Dest >> 16; + } + } + + SourceY++; + DestBits = (BYTE*)((ULONG_PTR)DestBits - wd); + } + + return TRUE; } /* EOF */ diff --git a/reactos/subsys/win32k/dib/dib32bpp.c b/reactos/subsys/win32k/dib/dib32bpp.c index 09369cb5edb..4206bed8df8 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.19 2004/04/06 17:54:32 weiden Exp $ */ +/* $Id: dib32bpp.c,v 1.20 2004/04/06 21:53:48 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -572,12 +572,11 @@ DIB_32BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, RECTL* DestRect, POINTL *SourcePoint, XLATEOBJ *ColorTranslation, ULONG iTransColor) { - ULONG X, Y; - ULONG SourceX, SourceY, Source, wd; - PULONG DestBits; + ULONG X, Y, SourceX, SourceY, Source, wd; + ULONG *DestBits; SourceY = SourcePoint->y; - DestBits = (PULONG)(DestSurf->pvScan0 + + DestBits = (ULONG*)(DestSurf->pvScan0 + (DestRect->left << 2) + DestRect->top * DestSurf->lDelta); wd = ((DestRect->right - DestRect->left) << 2) - DestSurf->lDelta; @@ -587,21 +586,15 @@ DIB_32BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SourceX = SourcePoint->x; for(X = DestRect->left; X < DestRect->right; X++, DestBits++, SourceX++) { - Source = DIB_GetOriginalSource(SourceSurf, SourceGDI, SourceX, SourceY); - if(Source == iTransColor) + Source = DIB_GetSourceIndex(SourceSurf, SourceGDI, SourceX, SourceY); + if(Source != iTransColor) { - /* Skip transparent pixels */ - continue; - } - - if(ColorTranslation) *DestBits = XLATEOBJ_iXlate(ColorTranslation, Source); - else - *DestBits = Source; + } } SourceY++; - DestBits = (PULONG)((ULONG_PTR)DestBits - wd); + DestBits = (ULONG*)((ULONG_PTR)DestBits - wd); } return TRUE; diff --git a/reactos/subsys/win32k/eng/bitblt.c b/reactos/subsys/win32k/eng/bitblt.c index bc094eefc3a..7e7d54a78de 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.44 2004/04/05 21:26:24 navaraf Exp $ +/* $Id: bitblt.c,v 1.45 2004/04/06 21:53:48 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -46,8 +46,6 @@ #define NDEBUG #include -#define ROP_NOOP 0x00AA0029 - typedef BOOLEAN STDCALL (*PBLTRECTFUNC)(SURFOBJ* OutputObj, SURFGDI* OutputGDI, SURFOBJ* InputObj, diff --git a/reactos/subsys/win32k/eng/gradient.c b/reactos/subsys/win32k/eng/gradient.c index 063606170ec..fb8902170b5 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.6 2004/03/21 10:18:33 weiden Exp $ +/* $Id: gradient.c,v 1.7 2004/04/06 21:53:48 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -570,13 +571,13 @@ IntEngGradientFill( { IntLockGDIDriver(SurfGDI); SurfGDI->BitBlt(psoDest, NULL, NULL, pco, pxlo, - prclExtents, pptlDitherOrg, NULL, NULL, NULL, 0x00AA0029); + prclExtents, pptlDitherOrg, NULL, NULL, NULL, ROP_NOOP); IntUnLockGDIDriver(SurfGDI); MouseSafetyOnDrawEnd(psoDest, SurfGDI); return TRUE; } EngBitBlt(psoDest, NULL, NULL, pco, pxlo, - prclExtents, pptlDitherOrg, NULL, NULL, NULL, 0x00AA0029); + prclExtents, pptlDitherOrg, NULL, NULL, NULL, ROP_NOOP); } MouseSafetyOnDrawEnd(psoDest, SurfGDI); return Ret; diff --git a/reactos/subsys/win32k/eng/transblt.c b/reactos/subsys/win32k/eng/transblt.c index 290317068c9..1fb12e1c772 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.14 2004/04/06 17:54:32 weiden Exp $ +/* $Id: transblt.c,v 1.15 2004/04/06 21:53:48 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -152,7 +152,7 @@ EngTransparentBlt(PSURFOBJ Dest, 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); + &Pt, ColorTranslation, iTransColor); break; } case DC_COMPLEX: @@ -285,6 +285,22 @@ IntEngTransparentBlt(PSURFOBJ Dest, 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) + { + IntLockGDIDriver(SurfGDIDest); + SurfGDIDest->BitBlt(Dest, 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) { diff --git a/reactos/subsys/win32k/include/inteng.h b/reactos/subsys/win32k/include/inteng.h index 19e8ad70984..f3211d81a73 100644 --- a/reactos/subsys/win32k/include/inteng.h +++ b/reactos/subsys/win32k/include/inteng.h @@ -1,6 +1,8 @@ #ifndef _WIN32K_INTENG_H #define _WIN32K_INTENG_H +#define ROP_NOOP 0x00AA0029 + /* Definitions of IntEngXxx functions */ BOOL STDCALL IntEngLineTo(SURFOBJ *Surface, From 6d0d4f988e46be75500f801f10891290479cc6e8 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Tue, 6 Apr 2004 22:15:25 +0000 Subject: [PATCH 0757/1463] fix clock visibility flag svn path=/trunk/; revision=8994 --- reactos/subsys/system/explorer/doxy-footer.html | 2 +- reactos/subsys/system/explorer/taskbar/traynotify.cpp | 7 +++++-- reactos/subsys/system/explorer/utility/xmlstorage.cpp | 7 +------ reactos/subsys/system/explorer/utility/xmlstorage.h | 2 +- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/reactos/subsys/system/explorer/doxy-footer.html b/reactos/subsys/system/explorer/doxy-footer.html index e9dcac1212c..85339d0cf5d 100644 --- a/reactos/subsys/system/explorer/doxy-footer.html +++ b/reactos/subsys/system/explorer/doxy-footer.html @@ -3,7 +3,7 @@
ROS Explorer Source Code Documentation -
generated on 04.04.2004 by
+
generated on 05.04.2004 by
doxygen
diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index a97ddcd2ccd..199806992ce 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -209,6 +209,8 @@ static bool get_hide_clock_from_registry() void NotifyArea::read_config() { + bool clock_visible = true; + // read notification icon settings from XML configuration XMLPos pos = g_Globals.get_cfg(); @@ -217,8 +219,7 @@ void NotifyArea::read_config() #endif { if (pos.go_down("desktopbar")) { - bool show = XMLBoolRef(pos, "options", "show-clock", !get_hide_clock_from_registry()); - show_clock(show); + clock_visible = XMLBoolRef(pos, "options", "show-clock", !get_hide_clock_from_registry()); pos.back(); } } @@ -252,6 +253,8 @@ void NotifyArea::read_config() pos.back(); } + + show_clock(clock_visible); } void NotifyArea::write_config() diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.cpp b/reactos/subsys/system/explorer/utility/xmlstorage.cpp index 05e9de6cb96..e8d970555d1 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.cpp +++ b/reactos/subsys/system/explorer/utility/xmlstorage.cpp @@ -151,13 +151,8 @@ void XMLCALL XMLReader::XML_EndElementHandler(void* userData, const XML_Char* na if (p != s) pThis->_pos->append_content(s, p-s); - std::string leading; - if (p != e) - leading.assign(p, e-p); - - if (leading.empty()) - pThis->_pos->_end_leading = leading; + pThis->_pos->_end_leading.assign(p, e-p); pThis->_pos.back(); diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.h b/reactos/subsys/system/explorer/utility/xmlstorage.h index 91c29d10d7a..5c9e9de3dff 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.h +++ b/reactos/subsys/system/explorer/utility/xmlstorage.h @@ -587,7 +587,7 @@ protected: void append_trailing(const char* s, int l) { if (_children.empty()) - _trailing.append(s, l); + _content.append(s, l); else _children.back()->_trailing.append(s, l); } From 6701beb03a75571d0f14aa8971d656cbe76bd9f1 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Tue, 6 Apr 2004 23:05:36 +0000 Subject: [PATCH 0758/1463] implemented TransparentBlt() on 8bpp surfaces svn path=/trunk/; revision=8995 --- reactos/subsys/win32k/dib/dib16bpp.c | 9 ++-- reactos/subsys/win32k/dib/dib24bpp.c | 6 +-- reactos/subsys/win32k/dib/dib32bpp.c | 6 +-- reactos/subsys/win32k/dib/dib8bpp.c | 68 +++++++++++++++++++++++++++- 4 files changed, 76 insertions(+), 13 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib16bpp.c b/reactos/subsys/win32k/dib/dib16bpp.c index 60849250f4c..c5503d55de0 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.24 2004/04/06 21:53:48 weiden Exp $ */ +/* $Id: dib16bpp.c,v 1.25 2004/04/06 23:05:36 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -607,8 +607,7 @@ DIB_16BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, RECTL* DestRect, POINTL *SourcePoint, XLATEOBJ *ColorTranslation, ULONG iTransColor) { - ULONG X, Y, SourceX, SourceY, Source, wd, Dest; - LONG RoundedRight; + ULONG RoundedRight, X, Y, SourceX, SourceY, Source, wd, Dest; ULONG *DestBits; RoundedRight = DestRect->right - ((DestRect->right - DestRect->left) & 0x1); @@ -616,7 +615,7 @@ DIB_16BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, DestBits = (ULONG*)(DestSurf->pvScan0 + (DestRect->left << 1) + DestRect->top * DestSurf->lDelta); - wd = ((DestRect->right - DestRect->left) << 1) - DestSurf->lDelta; + wd = DestSurf->lDelta - ((DestRect->right - DestRect->left) << 1); for(Y = DestRect->top; Y < DestRect->bottom; Y++) { @@ -653,7 +652,7 @@ DIB_16BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, DestBits = (PULONG)((ULONG_PTR)DestBits + 2); } SourceY++; - DestBits = (ULONG*)((ULONG_PTR)DestBits - wd); + DestBits = (ULONG*)((ULONG_PTR)DestBits + wd); } return TRUE; diff --git a/reactos/subsys/win32k/dib/dib24bpp.c b/reactos/subsys/win32k/dib/dib24bpp.c index e696ad73ed8..8bcc084ee60 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.20 2004/04/06 21:53:48 weiden Exp $ */ +/* $Id: dib24bpp.c,v 1.21 2004/04/06 23:05:36 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -374,7 +374,7 @@ DIB_24BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, DestBits = (BYTE*)(DestSurf->pvScan0 + (DestRect->left << 2) + DestRect->top * DestSurf->lDelta); - wd = ((DestRect->right - DestRect->left) << 2) - DestSurf->lDelta; + wd = DestSurf->lDelta - ((DestRect->right - DestRect->left) << 2); for(Y = DestRect->top; Y < DestRect->bottom; Y++) { @@ -391,7 +391,7 @@ DIB_24BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } SourceY++; - DestBits = (BYTE*)((ULONG_PTR)DestBits - wd); + DestBits = (BYTE*)((ULONG_PTR)DestBits + wd); } return TRUE; diff --git a/reactos/subsys/win32k/dib/dib32bpp.c b/reactos/subsys/win32k/dib/dib32bpp.c index 4206bed8df8..fa9fbbc79c1 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.20 2004/04/06 21:53:48 weiden Exp $ */ +/* $Id: dib32bpp.c,v 1.21 2004/04/06 23:05:36 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -579,7 +579,7 @@ DIB_32BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, DestBits = (ULONG*)(DestSurf->pvScan0 + (DestRect->left << 2) + DestRect->top * DestSurf->lDelta); - wd = ((DestRect->right - DestRect->left) << 2) - DestSurf->lDelta; + wd = DestSurf->lDelta - ((DestRect->right - DestRect->left) << 2); for(Y = DestRect->top; Y < DestRect->bottom; Y++) { @@ -594,7 +594,7 @@ DIB_32BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } SourceY++; - DestBits = (ULONG*)((ULONG_PTR)DestBits - wd); + DestBits = (ULONG*)((ULONG_PTR)DestBits + wd); } return TRUE; diff --git a/reactos/subsys/win32k/dib/dib8bpp.c b/reactos/subsys/win32k/dib/dib8bpp.c index 93d73aa5321..d498c6c22c2 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.18 2004/04/06 17:54:32 weiden Exp $ */ +/* $Id: dib8bpp.c,v 1.19 2004/04/06 23:05:36 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -568,7 +568,71 @@ DIB_8BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, RECTL* DestRect, POINTL *SourcePoint, XLATEOBJ *ColorTranslation, ULONG iTransColor) { - return FALSE; + ULONG RoundedRight, X, Y, SourceX, SourceY, Source, wd, Dest; + ULONG *DestBits; + + RoundedRight = DestRect->right - ((DestRect->right - DestRect->left) & 0x3); + SourceY = SourcePoint->y; + DestBits = (ULONG*)(DestSurf->pvScan0 + DestRect->left + + (DestRect->top * DestSurf->lDelta)); + wd = DestSurf->lDelta - (DestRect->right - DestRect->left); + + for(Y = DestRect->top; Y < DestRect->bottom; Y++) + { + DestBits = (ULONG*)(DestSurf->pvScan0 + DestRect->left + + (Y * DestSurf->lDelta)); + SourceX = SourcePoint->x; + for (X = DestRect->left; X < RoundedRight; X += 4, DestBits++) + { + Dest = *DestBits; + + Source = DIB_GetSourceIndex(SourceSurf, SourceGDI, SourceX++, SourceY); + if(Source != iTransColor) + { + Dest &= 0xFFFFFF00; + Dest |= (XLATEOBJ_iXlate(ColorTranslation, Source) & 0xFF); + } + + Source = DIB_GetSourceIndex(SourceSurf, SourceGDI, SourceX++, SourceY); + if(Source != iTransColor) + { + Dest &= 0xFFFF00FF; + Dest |= ((XLATEOBJ_iXlate(ColorTranslation, Source) << 8) & 0xFF00); + } + + Source = DIB_GetSourceIndex(SourceSurf, SourceGDI, SourceX++, SourceY); + if(Source != iTransColor) + { + Dest &= 0xFF00FFFF; + Dest |= ((XLATEOBJ_iXlate(ColorTranslation, Source) << 16) & 0xFF0000); + } + + Source = DIB_GetSourceIndex(SourceSurf, SourceGDI, SourceX++, SourceY); + if(Source != iTransColor) + { + Dest &= 0x00FFFFFF; + Dest |= ((XLATEOBJ_iXlate(ColorTranslation, Source) << 24) & 0xFF000000); + } + + *DestBits = Dest; + } + + if(X < DestRect->right) + { + for (; X < DestRect->right; X++) + { + Source = DIB_GetSourceIndex(SourceSurf, SourceGDI, SourceX++, SourceY); + if(Source != iTransColor) + { + *((BYTE*)DestBits) = (BYTE)(XLATEOBJ_iXlate(ColorTranslation, Source) & 0xFF); + } + DestBits = (PULONG)((ULONG_PTR)DestBits + 1); + } + } + SourceY++; + } + + return TRUE; } /* EOF */ From 9c7501f3ddffb1e5623fb49cd6e321be2c0745c7 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Wed, 7 Apr 2004 00:14:05 +0000 Subject: [PATCH 0759/1463] - SSPT elements are 8 bit wide on Windows. Made ReactOS binary compatible in this regard, since this affects a public function (KeAddSystemServiceTable) - use a function pointer for SSDT elements. Function pointers aren't guaranteed to have the same size as data pointers (and we were using ULONG, anyway) - SSPT and SSDT types no longer structures to avoid pesky alignment issues - genw32k and genntdll fixed accordingly svn path=/trunk/; revision=8996 --- reactos/iface/addsys/genw32k.c | 6 +++--- reactos/iface/native/genntdll.c | 6 +++--- reactos/include/ntos/service.h | 15 ++++----------- reactos/w32api/include/ddk/winddk.h | 9 +++------ 4 files changed, 13 insertions(+), 23 deletions(-) diff --git a/reactos/iface/addsys/genw32k.c b/reactos/iface/addsys/genw32k.c index 18ea4062c39..1f2146834dd 100644 --- a/reactos/iface/addsys/genw32k.c +++ b/reactos/iface/addsys/genw32k.c @@ -1,4 +1,4 @@ -/* $Id: genw32k.c,v 1.6 2003/12/03 21:50:49 gvg Exp $ +/* $Id: genw32k.c,v 1.7 2004/04/07 00:14:05 hyperion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS version of ntdll @@ -88,7 +88,7 @@ char *stmp; * Now write the current system call's name * in the service table. */ - fprintf(out,"\t\t{ (ULONG)%s }",name); + fprintf(out,"\t\t(PVOID (NTAPI *)(VOID))%s",name); /* Next system call index */ sys_call_idx++; @@ -143,7 +143,7 @@ char *stmp; * Now write the current system call's ID * in the service table along with its Parameters Size. */ - fprintf(out,"\t\t{ %d }",atoi(nr_args) * sizeof(void*)); + fprintf(out,"\t\t%d",atoi(nr_args) * sizeof(void*)); /* Next system call index */ sys_call_idx++; diff --git a/reactos/iface/native/genntdll.c b/reactos/iface/native/genntdll.c index 68bec3cf2aa..a4bb9495763 100644 --- a/reactos/iface/native/genntdll.c +++ b/reactos/iface/native/genntdll.c @@ -1,4 +1,4 @@ -/* $Id: genntdll.c,v 1.13 2003/12/17 01:46:08 hyperion Exp $ +/* $Id: genntdll.c,v 1.14 2004/04/07 00:14:05 hyperion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS version of ntdll @@ -135,7 +135,7 @@ char *stmp; * Now write the current system call's name * in the service table. */ - fprintf(out,"\t\t{ (ULONG)%s }",name); + fprintf(out,"\t\t(PVOID (NTAPI *)(VOID))%s",name); } } /* Close the service table (C syntax) */ @@ -194,7 +194,7 @@ char *stmp; * Now write the current system call's ID * in the service table along with its Parameters Size. */ - fprintf(out,"\t\t{ %s }",nr_args); + fprintf(out,"\t\t%s",nr_args); } } /* diff --git a/reactos/include/ntos/service.h b/reactos/include/ntos/service.h index 1e07fcc77ed..59e8b0ab934 100755 --- a/reactos/include/ntos/service.h +++ b/reactos/include/ntos/service.h @@ -9,28 +9,21 @@ #ifndef __USE_W32API -#pragma pack(1) - /* System Service Dispatch Table */ -typedef struct t_SSDT { - ULONG SysCallPtr; -} SSDT, *PSSDT; +typedef PVOID (NTAPI * SSDT)(VOID); +typedef SSDT * PSSDT; /* System Service Parameters Table */ -typedef struct t_SSPT { - unsigned int ParamBytes; -} SSPT, *PSSPT; +typedef UCHAR SSPT, *PSSPT; typedef struct t_KeServiceDescriptorTableEntry { PSSDT SSDT; PULONG ServiceCounterTable; - unsigned int NumberOfServices; + ULONG NumberOfServices; PSSPT SSPT; } SSDT_ENTRY, *PSSDT_ENTRY; -#pragma pack() - #endif /* __USE_W32API */ diff --git a/reactos/w32api/include/ddk/winddk.h b/reactos/w32api/include/ddk/winddk.h index 2625c8127d1..7eea53d20f9 100644 --- a/reactos/w32api/include/ddk/winddk.h +++ b/reactos/w32api/include/ddk/winddk.h @@ -7114,14 +7114,11 @@ KeAcquireSpinLock( OUT PKIRQL OldIrql); /* System Service Dispatch Table */ -typedef struct _SSDT { - ULONG SysCallPtr; -} SSDT, *PSSDT; +typedef PVOID (NTAPI * SSDT)(VOID); +typedef SSDT * PSSDT; /* System Service Parameters Table */ -typedef struct _SSPT { - ULONG ParamBytes; -} SSPT, *PSSPT; +typedef UCHAR SSPT, * PSSPT; typedef struct _SSDT_ENTRY { PSSDT SSDT; From 4783e5bae8b3ce956bca3870ced1e0267a5a871c Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 7 Apr 2004 00:58:05 +0000 Subject: [PATCH 0760/1463] fixed missing dereferences of threads svn path=/trunk/; revision=8997 --- reactos/subsys/win32k/include/hook.h | 3 +++ reactos/subsys/win32k/ntuser/hook.c | 31 ++++++++++++++++++++++++---- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/reactos/subsys/win32k/include/hook.h b/reactos/subsys/win32k/include/hook.h index 49c418d7833..da4d6d98147 100644 --- a/reactos/subsys/win32k/include/hook.h +++ b/reactos/subsys/win32k/include/hook.h @@ -4,6 +4,8 @@ #include #include +#define HOOK_THREAD_REFERENCED (0x1) + typedef struct tagHOOK { LIST_ENTRY Chain; /* Hook chain entry */ @@ -12,6 +14,7 @@ typedef struct tagHOOK int HookId; /* Hook table index */ HOOKPROC Proc; /* Hook function */ BOOLEAN Ansi; /* Is it an Ansi hook? */ + ULONG Flags; /* Some internal flags */ UNICODE_STRING ModuleName; /* Module name for global hooks */ } HOOK, *PHOOK; diff --git a/reactos/subsys/win32k/ntuser/hook.c b/reactos/subsys/win32k/ntuser/hook.c index eb284f77c88..222b1a56448 100644 --- a/reactos/subsys/win32k/ntuser/hook.c +++ b/reactos/subsys/win32k/ntuser/hook.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: hook.c,v 1.6 2004/02/24 13:27:03 weiden Exp $ +/* $Id: hook.c,v 1.7 2004/04/07 00:58:05 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -190,7 +190,12 @@ IntFreeHook(PHOOKTABLE Table, PHOOK Hook, PWINSTATION_OBJECT WinStaObj) { RemoveEntryList(&Hook->Chain); RtlFreeUnicodeString(&Hook->ModuleName); - + + /* Dereference thread if required */ + if(Hook->Flags & HOOK_THREAD_REFERENCED) + ObDereferenceObject(Hook->Thread); + + /* Close handle */ ObmCloseHandle(WinStaObj->HandleTable, Hook->Self); } @@ -438,7 +443,7 @@ NtUserSetWindowsHookEx( BOOL Ansi) { PWINSTATION_OBJECT WinStaObj; - BOOLEAN Global; + BOOLEAN Global, ReleaseThread; PETHREAD Thread; PHOOK Hook; UNICODE_STRING ModuleName; @@ -473,13 +478,16 @@ NtUserSetWindowsHookEx( } if (Thread->ThreadsProcess != PsGetCurrentProcess()) { + ObDereferenceObject(Thread); DPRINT1("Can't specify thread belonging to another process\n"); SetLastWin32Error(ERROR_INVALID_PARAMETER); return NULL; } + ReleaseThread = TRUE; } else /* system-global hook */ { + ReleaseThread = FALSE; if (HookId == WH_KEYBOARD_LL || HookId == WH_MOUSE_LL) { Mod = NULL; @@ -505,6 +513,8 @@ NtUserSetWindowsHookEx( #else DPRINT1("Not implemented: HookId %d Global %s\n", HookId, Global ? "TRUE" : "FALSE"); #endif + if(ReleaseThread) + ObDereferenceObject(Thread); SetLastWin32Error(ERROR_NOT_SUPPORTED); return NULL; } @@ -516,6 +526,8 @@ NtUserSetWindowsHookEx( if(! NT_SUCCESS(Status)) { + if(ReleaseThread && Thread) + ObDereferenceObject(Thread); SetLastNtError(Status); return (HANDLE) NULL; } @@ -523,10 +535,15 @@ NtUserSetWindowsHookEx( Hook = IntAddHook(Thread, HookId, Global, WinStaObj); if (NULL == Hook) { + if(ReleaseThread) + ObDereferenceObject(Thread); ObDereferenceObject(WinStaObj); return NULL; } - + + if(ReleaseThread) + Hook->Flags |= HOOK_THREAD_REFERENCED; + if (NULL != Mod) { Status = MmCopyFromCaller(&ModuleName, UnsafeModuleName, sizeof(UNICODE_STRING)); @@ -534,6 +551,8 @@ NtUserSetWindowsHookEx( { ObmDereferenceObject(Hook); IntRemoveHook(Hook, WinStaObj); + if(ReleaseThread) + ObDereferenceObject(Thread); ObDereferenceObject(WinStaObj); SetLastNtError(Status); return NULL; @@ -545,6 +564,8 @@ NtUserSetWindowsHookEx( { ObmDereferenceObject(Hook); IntRemoveHook(Hook, WinStaObj); + if(ReleaseThread) + ObDereferenceObject(Thread); ObDereferenceObject(WinStaObj); SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); return NULL; @@ -557,6 +578,8 @@ NtUserSetWindowsHookEx( { ObmDereferenceObject(Hook); IntRemoveHook(Hook, WinStaObj); + if(ReleaseThread) + ObDereferenceObject(Thread); ObDereferenceObject(WinStaObj); SetLastNtError(Status); return NULL; From c44ac169e6dcee32c6721ffe5d8182a3d0334d78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Wed, 7 Apr 2004 08:25:40 +0000 Subject: [PATCH 0761/1463] There can never be a parent/child relationship between windows if one of them is invalid. Fixes bug #217. svn path=/trunk/; revision=8998 --- reactos/lib/user32/windows/window.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/reactos/lib/user32/windows/window.c b/reactos/lib/user32/windows/window.c index 72bb81d0419..f2a60f70690 100644 --- a/reactos/lib/user32/windows/window.c +++ b/reactos/lib/user32/windows/window.c @@ -1,4 +1,4 @@ -/* $Id: window.c,v 1.105 2004/04/02 23:54:26 weiden Exp $ +/* $Id: window.c,v 1.106 2004/04/07 08:25:40 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -1018,6 +1018,11 @@ BOOL STDCALL IsChild(HWND hWndParent, HWND hWnd) { + if (! IsWindow(hWndParent) || ! IsWindow(hWnd)) + { + return FALSE; + } + do { hWnd = (HWND)NtUserGetWindowLong(hWnd, GWL_HWNDPARENT, FALSE); From bfde26a3f6da24b5cefd0f1557891f793642dc3b Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Wed, 7 Apr 2004 09:21:01 +0000 Subject: [PATCH 0762/1463] - Rewrote the code which handles processing of irp's and notifications from miniport driver. - Implemented support for srb extensions (very simple). svn path=/trunk/; revision=8999 --- reactos/drivers/storage/scsiport/scsiport.c | 718 +++++++++++------- .../drivers/storage/scsiport/scsiport_int.h | 21 +- 2 files changed, 460 insertions(+), 279 deletions(-) diff --git a/reactos/drivers/storage/scsiport/scsiport.c b/reactos/drivers/storage/scsiport/scsiport.c index 5f748eabd7a..af6653d5def 100644 --- a/reactos/drivers/storage/scsiport/scsiport.c +++ b/reactos/drivers/storage/scsiport/scsiport.c @@ -16,13 +16,14 @@ * 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.52 2004/04/02 15:43:01 hbirr Exp $ +/* $Id: scsiport.c,v 1.53 2004/04/07 09:21:01 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * FILE: services/storage/scsiport/scsiport.c * PURPOSE: SCSI port driver * PROGRAMMER: Eric Kohl (ekohl@rz-online.de) + * Hartmut Birr */ /* INCLUDES *****************************************************************/ @@ -41,17 +42,24 @@ #include "scsiport_int.h" -/* #define USE_DEVICE_QUEUES */ - /* TYPES *********************************************************************/ #define IRP_FLAG_COMPLETE 0x00000001 #define IRP_FLAG_NEXT 0x00000002 #define IRP_FLAG_NEXT_LU 0x00000004 +#define MAX_SRB_EXTENSIONS 32 /* GLOBALS *******************************************************************/ +static VOID +SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, + PIRP NextIrp); + +static VOID +SpiStartIo(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, + PIRP Irp); + static BOOLEAN SpiGetPciConfigData (IN struct _HW_INITIALIZATION_DATA *HwInitializationData, IN OUT PPORT_CONFIGURATION_INFORMATION PortConfig, @@ -70,10 +78,6 @@ static NTSTATUS STDCALL ScsiPortDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); -static VOID STDCALL -ScsiPortStartIo(IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp); - static BOOLEAN STDCALL ScsiPortStartPacket(IN OUT PVOID Context); @@ -119,16 +123,20 @@ ScsiPortIoTimer(PDEVICE_OBJECT DeviceObject, PVOID Context); static PSCSI_REQUEST_BLOCK -ScsiPortInitSenseRequestSrb(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, - PSCSI_REQUEST_BLOCK OriginalSrb); - -static VOID -ScsiPortFreeSenseRequestSrb(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension); +ScsiPortInitSenseRequestSrb(PSCSI_REQUEST_BLOCK OriginalSrb); static NTSTATUS SpiBuildDeviceMap (PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, PUNICODE_STRING RegistryPath); +static VOID +SpiAllocateSrbExtension(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, + PSCSI_REQUEST_BLOCK Srb); + +static VOID +SpiFreeSrbExtension(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, + PSCSI_REQUEST_BLOCK Srb); + /* FUNCTIONS *****************************************************************/ @@ -568,12 +576,13 @@ ScsiPortGetUncachedExtension(IN PVOID HwDeviceExtension, /* Allocate a common DMA buffer */ DeviceExtension->CommonBufferLength = - NumberOfBytes + DeviceExtension->SrbExtensionSize; + NumberOfBytes + PAGE_ROUND_UP(DeviceExtension->SrbExtensionSize * MAX_SRB_EXTENSIONS); DeviceExtension->VirtualAddress = HalAllocateCommonBuffer(DeviceExtension->AdapterObject, DeviceExtension->CommonBufferLength, &DeviceExtension->PhysicalAddress, FALSE); + DeviceExtension->VirtualAddressMap = 0; if (DeviceExtension->VirtualAddress == NULL) { DPRINT1("HalAllocateCommonBuffer() failed!\n"); @@ -582,7 +591,7 @@ ScsiPortGetUncachedExtension(IN PVOID HwDeviceExtension, } return (PVOID)((ULONG_PTR)DeviceExtension->VirtualAddress + - DeviceExtension->SrbExtensionSize); + PAGE_ROUND_UP(DeviceExtension->SrbExtensionSize * MAX_SRB_EXTENSIONS)); } @@ -685,7 +694,7 @@ ScsiPortInitialize(IN PVOID Argument1, (HwInitializationData->HwResetBus == NULL)) return(STATUS_INVALID_PARAMETER); - DriverObject->DriverStartIo = ScsiPortStartIo; + DriverObject->DriverStartIo = NULL; DriverObject->MajorFunction[IRP_MJ_CREATE] = ScsiPortCreateClose; DriverObject->MajorFunction[IRP_MJ_CLOSE] = ScsiPortCreateClose; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ScsiPortDeviceControl; @@ -738,6 +747,7 @@ ScsiPortInitialize(IN PVOID Argument1, PortDeviceObject->AlignmentRequirement = FILE_WORD_ALIGNMENT; DeviceExtension = PortDeviceObject->DeviceExtension; + RtlZeroMemory(DeviceExtension, DeviceExtensionSize); DeviceExtension->Length = DeviceExtensionSize; DeviceExtension->DeviceObject = PortDeviceObject; DeviceExtension->PortNumber = SystemConfig->ScsiPortCount; @@ -759,6 +769,12 @@ ScsiPortInitialize(IN PVOID Argument1, /* Initialize the device base list */ InitializeListHead (&DeviceExtension->DeviceBaseListHead); + /* Initialize the irp lists */ + InitializeListHead (&DeviceExtension->PendingIrpListHead); + InitializeListHead (&DeviceExtension->ActiveIrpListHead); + DeviceExtension->PendingIrpCount = 0; + DeviceExtension->ActiveIrpCount = 0; + /* Initialize LUN-Extension list */ InitializeListHead (&DeviceExtension->LunExtensionListHead); @@ -826,6 +842,9 @@ ScsiPortInitialize(IN PVOID Argument1, PortConfig->MaximumNumberOfTargets = SCSI_MAXIMUM_TARGETS; // PortConfig->MaximumNumberOfLogicalUnits = SCSI_MAXIMUM_LOGICAL_UNITS; + PortConfig->SrbExtensionSize = HwInitializationData->SrbExtensionSize; + PortConfig->SpecificLuExtensionSize = HwInitializationData->SpecificLuExtensionSize; + PortConfig->SlotNumber = SlotNumber.u.AsULONG; PortConfig->AccessRanges = (PACCESS_RANGE)(PortConfig + 1); @@ -870,13 +889,35 @@ ScsiPortInitialize(IN PVOID Argument1, { DPRINT("ScsiPortInitialize(): Found HBA! (%x)\n", PortConfig->BusInterruptVector); + + if (DeviceExtension->VirtualAddress == NULL && DeviceExtension->SrbExtensionSize) + { + ScsiPortGetUncachedExtension(&DeviceExtension->MiniPortDeviceExtension, + PortConfig, + 0); + } + /* Register an interrupt handler for this device */ MappedIrq = HalGetInterruptVector(PortConfig->AdapterInterfaceType, PortConfig->SystemIoBusNumber, PortConfig->BusInterruptLevel, +#if 1 +/* + * FIXME: + * Something is wrong in our interrupt conecting code. + * The promise Ultra100TX driver returns 0 for BusInterruptVector + * and a nonzero value for BusInterruptLevel. The driver does only + * work with this fix. + */ + PortConfig->BusInterruptLevel, +#else PortConfig->BusInterruptVector, +#endif &Dirql, &Affinity); + DPRINT("AdapterInterfaceType %x, SystemIoBusNumber %x, BusInterruptLevel %x, BusInterruptVector %x\n", + PortConfig->AdapterInterfaceType, PortConfig->SystemIoBusNumber, + PortConfig->BusInterruptLevel, PortConfig->BusInterruptVector); Status = IoConnectInterrupt(&DeviceExtension->Interrupt, ScsiPortIsr, DeviceExtension, @@ -1089,12 +1130,15 @@ ScsiPortNotification(IN SCSI_NOTIFICATION_TYPE NotificationType, DPRINT("Notify: RequestComplete (Srb %p)\n", Srb); DeviceExtension->IrpFlags |= IRP_FLAG_COMPLETE; + Srb->SrbFlags &= ~SRB_FLAGS_IS_ACTIVE; + InterlockedIncrement((PLONG)&DeviceExtension->CompleteRequestCount); } break; case NextRequest: DPRINT("Notify: NextRequest\n"); DeviceExtension->IrpFlags |= IRP_FLAG_NEXT; + InterlockedIncrement((PLONG)&DeviceExtension->NextRequestCount); break; case NextLuRequest: @@ -1102,20 +1146,25 @@ ScsiPortNotification(IN SCSI_NOTIFICATION_TYPE NotificationType, UCHAR PathId; UCHAR TargetId; UCHAR Lun; + PSCSI_PORT_LUN_EXTENSION LunExtension; PathId = (UCHAR) va_arg (ap, int); TargetId = (UCHAR) va_arg (ap, int); Lun = (UCHAR) va_arg (ap, int); - DPRINT1 ("Notify: NextLuRequest(PathId %u TargetId %u Lun %u)\n", + DPRINT ("Notify: NextLuRequest(PathId %u TargetId %u Lun %u)\n", PathId, TargetId, Lun); - /* FIXME: Implement it! */ - DeviceExtension->IrpFlags |= IRP_FLAG_NEXT; -// DeviceExtension->IrpFlags |= IRP_FLAG_NEXT_LU; - - /* Hack! */ - DeviceExtension->IrpFlags |= IRP_FLAG_NEXT; + LunExtension = SpiGetLunExtension(DeviceExtension, + PathId, + TargetId, + Lun); + if (LunExtension) + { + DeviceExtension->IrpFlags |= IRP_FLAG_NEXT_LU; + InterlockedIncrement((PLONG)&LunExtension->NextLuRequestCount); + InterlockedIncrement((PLONG)&DeviceExtension->NextLuRequestCount); + } } break; @@ -1425,34 +1474,10 @@ ScsiPortDispatchScsi(IN PDEVICE_OBJECT DeviceObject, { case SRB_FUNCTION_EXECUTE_SCSI: case SRB_FUNCTION_IO_CONTROL: -#ifdef USE_DEVICE_QUEUES - if (Srb->SrbFlags & SRB_FLAGS_BYPASS_FROZEN_QUEUE) - { - IoMarkIrpPending(Irp); - IoStartPacket (DeviceObject, Irp, NULL, NULL); - } - else - { - KIRQL oldIrql; - - KeRaiseIrql (DISPATCH_LEVEL, - &oldIrql); - - if (!KeInsertByKeyDeviceQueue (&LunExtension->DeviceQueue, - &Irp->Tail.Overlay.DeviceQueueEntry, - Srb->QueueSortKey)) - { - Srb->SrbStatus = SRB_STATUS_SUCCESS; - IoMarkIrpPending(Irp); - IoStartPacket (DeviceObject, Irp, NULL, NULL); - } - - KeLowerIrql (oldIrql); - } -#else IoMarkIrpPending(Irp); - IoStartPacket (DeviceObject, Irp, NULL, NULL); -#endif + Srb->OriginalRequest = LunExtension; + Irp->Tail.Overlay.DriverContext[3] = Srb; + SpiProcessRequests(DeviceExtension, Irp); return(STATUS_PENDING); case SRB_FUNCTION_SHUTDOWN: @@ -1460,7 +1485,9 @@ ScsiPortDispatchScsi(IN PDEVICE_OBJECT DeviceObject, if (DeviceExtension->PortConfig->CachesData == TRUE) { IoMarkIrpPending(Irp); - IoStartPacket(DeviceObject, Irp, NULL, NULL); + Srb->OriginalRequest = LunExtension; + Irp->Tail.Overlay.DriverContext[3] = Srb; + SpiProcessRequests(DeviceExtension, Irp); return(STATUS_PENDING); } break; @@ -1581,130 +1608,49 @@ ScsiPortDeviceControl(IN PDEVICE_OBJECT DeviceObject, return(STATUS_SUCCESS); } - -static VOID STDCALL -ScsiPortStartIo(IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp) +static VOID +SpiAllocateSrbExtension(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, + PSCSI_REQUEST_BLOCK Srb) { - PSCSI_PORT_DEVICE_EXTENSION DeviceExtension; - PSCSI_PORT_LUN_EXTENSION LunExtension; - PIO_STACK_LOCATION IrpStack; - PSCSI_REQUEST_BLOCK Srb; - KIRQL oldIrql; + ULONG i; + ULONG mask; - DPRINT("ScsiPortStartIo() called!\n"); + DPRINT("SpiAllocateSrbExtension\n"); - DeviceExtension = DeviceObject->DeviceExtension; - IrpStack = IoGetCurrentIrpStackLocation(Irp); + DPRINT("DeviceExtension->VirtualAddress %x, DeviceExtension->SrbExtensionSize %x\n", + DeviceExtension->VirtualAddress, DeviceExtension->SrbExtensionSize); - DPRINT("DeviceExtension %p\n", DeviceExtension); - - oldIrql = KeGetCurrentIrql(); - - if (IrpStack->MajorFunction != IRP_MJ_SCSI) + if (DeviceExtension->VirtualAddress != NULL && + DeviceExtension->SrbExtensionSize > 0) { - DPRINT("No IRP_MJ_SCSI!\n"); - Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; - Irp->IoStatus.Information = 0; - IoCompleteRequest (Irp, - IO_NO_INCREMENT); - if (oldIrql < DISPATCH_LEVEL) - { - KeRaiseIrql (DISPATCH_LEVEL, - &oldIrql); - IoStartNextPacket (DeviceObject, - FALSE); - KeLowerIrql (oldIrql); - } - else - { - IoStartNextPacket (DeviceObject, - FALSE); - } - return; - } - - Srb = IrpStack->Parameters.Scsi.Srb; - - LunExtension = SpiGetLunExtension(DeviceExtension, - Srb->PathId, - Srb->TargetId, - Srb->Lun); - if (LunExtension == NULL) - { - DPRINT("Can't get LunExtension!\n"); - Irp->IoStatus.Status = STATUS_NO_SUCH_DEVICE; - Irp->IoStatus.Information = 0; - IoCompleteRequest (Irp, - IO_NO_INCREMENT); - if (oldIrql < DISPATCH_LEVEL) - { - KeRaiseIrql (DISPATCH_LEVEL, - &oldIrql); - IoStartNextPacket (DeviceObject, - FALSE); - KeLowerIrql (oldIrql); - } - else - { - IoStartNextPacket (DeviceObject, - FALSE); - } - return; - } - - Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = Srb->DataTransferLength; - - DeviceExtension->CurrentIrp = Irp; - - if (!KeSynchronizeExecution(DeviceExtension->Interrupt, - ScsiPortStartPacket, - DeviceExtension)) - { - DPRINT("Synchronization failed!\n"); - - Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; - Irp->IoStatus.Information = 0; - IoCompleteRequest(Irp, - IO_NO_INCREMENT); - if (oldIrql < DISPATCH_LEVEL) - { - KeRaiseIrql (DISPATCH_LEVEL, - &oldIrql); - IoStartNextPacket (DeviceObject, - FALSE); - KeLowerIrql (oldIrql); - } - else - { - IoStartNextPacket (DeviceObject, - FALSE); + for (i = 0, mask = 1; i < MAX_SRB_EXTENSIONS; i++, mask <<= 1) + { + if (!(DeviceExtension->VirtualAddressMap & mask)) + { + DeviceExtension->VirtualAddressMap |= mask; + Srb->SrbExtension = DeviceExtension->VirtualAddress + i * DeviceExtension->SrbExtensionSize; + DPRINT("%x\n", Srb->SrbExtension); + return; + } } } + Srb->SrbExtension = NULL; +} - KeAcquireSpinLock(&DeviceExtension->IrpLock, &oldIrql); - if (DeviceExtension->IrpFlags & IRP_FLAG_COMPLETE) - { - DeviceExtension->IrpFlags &= ~IRP_FLAG_COMPLETE; - IoCompleteRequest(Irp, - IO_NO_INCREMENT); - } +static VOID +SpiFreeSrbExtension(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, + PSCSI_REQUEST_BLOCK Srb) +{ + ULONG i; - if (DeviceExtension->IrpFlags & IRP_FLAG_NEXT) + if (DeviceExtension->VirtualAddress != NULL && + DeviceExtension->SrbExtensionSize > 0 && + Srb->SrbExtension != NULL) { - DeviceExtension->IrpFlags &= ~IRP_FLAG_NEXT; - KeReleaseSpinLockFromDpcLevel(&DeviceExtension->IrpLock); - IoStartNextPacket(DeviceObject, - FALSE); - KeLowerIrql(oldIrql); + i = ((ULONG_PTR)Srb->SrbExtension - (ULONG_PTR)DeviceExtension->VirtualAddress) / DeviceExtension->SrbExtensionSize; + DeviceExtension->VirtualAddressMap &= ~(1 << i); } - else - { - KeReleaseSpinLock(&DeviceExtension->IrpLock, oldIrql); - } - - DPRINT("ScsiPortStartIo() done\n"); + Srb->SrbExtension = NULL; } @@ -1712,21 +1658,16 @@ static BOOLEAN STDCALL ScsiPortStartPacket(IN OUT PVOID Context) { PSCSI_PORT_DEVICE_EXTENSION DeviceExtension; - PIO_STACK_LOCATION IrpStack; PSCSI_REQUEST_BLOCK Srb; + PIRP Irp; + PIO_STACK_LOCATION IrpStack; DPRINT("ScsiPortStartPacket() called\n"); - - DeviceExtension = (PSCSI_PORT_DEVICE_EXTENSION)Context; - - IrpStack = IoGetCurrentIrpStackLocation(DeviceExtension->CurrentIrp); - Srb = IrpStack->Parameters.Scsi.Srb; - - /* Allocte SRB extension */ - if (DeviceExtension->SrbExtensionSize != 0) - { - Srb->SrbExtension = DeviceExtension->VirtualAddress; - } + + Srb = (PSCSI_REQUEST_BLOCK)Context; + Irp = (PIRP)Srb->OriginalRequest; + IrpStack = IoGetCurrentIrpStackLocation(Irp); + DeviceExtension = IrpStack->DeviceObject->DeviceExtension; return(DeviceExtension->HwStartIo(&DeviceExtension->MiniPortDeviceExtension, Srb)); @@ -1766,7 +1707,8 @@ SpiAllocateLunExtension (IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, LunExtension->TargetId = TargetId; LunExtension->Lun = Lun; - KeInitializeDeviceQueue (&LunExtension->DeviceQueue); + LunExtension->PendingIrpCount = 0; + LunExtension->ActiveIrpCount = 0; return LunExtension; } @@ -2064,7 +2006,7 @@ ScsiPortIsr(IN PKINTERRUPT Interrupt, if (DeviceExtension->IrpFlags) { IoRequestDpc(DeviceExtension->DeviceObject, - DeviceExtension->CurrentIrp, + NULL, DeviceExtension); } @@ -2090,96 +2032,13 @@ ScsiPortDpcForIsr(IN PKDPC Dpc, IN PVOID DpcContext) { PSCSI_PORT_DEVICE_EXTENSION DeviceExtension; - PIO_STACK_LOCATION IrpStack; - PSCSI_REQUEST_BLOCK Srb; DPRINT("ScsiPortDpcForIsr(Dpc %p DpcDeviceObject %p DpcIrp %p DpcContext %p)\n", Dpc, DpcDeviceObject, DpcIrp, DpcContext); DeviceExtension = (PSCSI_PORT_DEVICE_EXTENSION)DpcContext; - KeAcquireSpinLockAtDpcLevel(&DeviceExtension->IrpLock); - if (DeviceExtension->IrpFlags) - { - IrpStack = IoGetCurrentIrpStackLocation(DeviceExtension->CurrentIrp); - Srb = IrpStack->Parameters.Scsi.Srb; - - if (DeviceExtension->OriginalSrb != NULL) - { - DPRINT("Got sense data!\n"); - - DPRINT("Valid: %x\n", DeviceExtension->InternalSenseData.Valid); - DPRINT("ErrorCode: %x\n", DeviceExtension->InternalSenseData.ErrorCode); - DPRINT("SenseKey: %x\n", DeviceExtension->InternalSenseData.SenseKey); - DPRINT("SenseCode: %x\n", DeviceExtension->InternalSenseData.AdditionalSenseCode); - - /* Copy sense data */ - if (DeviceExtension->OriginalSrb->SenseInfoBufferLength != 0) - { - RtlCopyMemory(DeviceExtension->OriginalSrb->SenseInfoBuffer, - &DeviceExtension->InternalSenseData, - sizeof(SENSE_DATA)); - DeviceExtension->OriginalSrb->SrbStatus |= SRB_STATUS_AUTOSENSE_VALID; - } - - /* Clear current sense data */ - RtlZeroMemory(&DeviceExtension->InternalSenseData, sizeof(SENSE_DATA)); - - IrpStack->Parameters.Scsi.Srb = DeviceExtension->OriginalSrb; - ScsiPortFreeSenseRequestSrb (DeviceExtension); - } - else if ((SRB_STATUS(Srb->SrbStatus) != SRB_STATUS_SUCCESS) && - (Srb->ScsiStatus == SCSISTAT_CHECK_CONDITION)) - { - DPRINT("SCSIOP_REQUEST_SENSE required!\n"); - - DeviceExtension->OriginalSrb = Srb; - IrpStack->Parameters.Scsi.Srb = ScsiPortInitSenseRequestSrb(DeviceExtension, - Srb); - KeReleaseSpinLockFromDpcLevel(&DeviceExtension->IrpLock); - if (!KeSynchronizeExecution(DeviceExtension->Interrupt, - ScsiPortStartPacket, - DeviceExtension)) - { - DPRINT1("Synchronization failed!\n"); - - DpcIrp->IoStatus.Status = STATUS_UNSUCCESSFUL; - DpcIrp->IoStatus.Information = 0; - IoCompleteRequest(DpcIrp, - IO_NO_INCREMENT); - IoStartNextPacket(DpcDeviceObject, - FALSE); - } - - return; - } - - DeviceExtension->CurrentIrp = NULL; - -// DpcIrp->IoStatus.Information = 0; -// DpcIrp->IoStatus.Status = STATUS_SUCCESS; - - if (DeviceExtension->IrpFlags & IRP_FLAG_COMPLETE) - { - DeviceExtension->IrpFlags &= ~IRP_FLAG_COMPLETE; - IoCompleteRequest(DpcIrp, IO_NO_INCREMENT); - } - - if (DeviceExtension->IrpFlags & IRP_FLAG_NEXT) - { - DeviceExtension->IrpFlags &= ~IRP_FLAG_NEXT; - KeReleaseSpinLockFromDpcLevel(&DeviceExtension->IrpLock); - IoStartNextPacket(DpcDeviceObject, FALSE); - } - else - { - KeReleaseSpinLockFromDpcLevel(&DeviceExtension->IrpLock); - } - } - else - { - KeReleaseSpinLockFromDpcLevel(&DeviceExtension->IrpLock); - } + SpiProcessRequests(DeviceExtension, NULL); DPRINT("ScsiPortDpcForIsr() done\n"); } @@ -2205,27 +2064,29 @@ ScsiPortIoTimer(PDEVICE_OBJECT DeviceObject, static PSCSI_REQUEST_BLOCK -ScsiPortInitSenseRequestSrb(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, - PSCSI_REQUEST_BLOCK OriginalSrb) +ScsiPortInitSenseRequestSrb(PSCSI_REQUEST_BLOCK OriginalSrb) { PSCSI_REQUEST_BLOCK Srb; PCDB Cdb; - Srb = &DeviceExtension->InternalSrb; + Srb = ExAllocatePoolWithTag(NonPagedPool, + sizeof(SCSI_REQUEST_BLOCK) + sizeof(SENSE_DATA), + TAG('S', 'S', 'r', 'b')); RtlZeroMemory(Srb, - sizeof(SCSI_REQUEST_BLOCK)); + sizeof(SCSI_REQUEST_BLOCK) + sizeof(SENSE_DATA)); Srb->PathId = OriginalSrb->PathId; Srb->TargetId = OriginalSrb->TargetId; Srb->Function = SRB_FUNCTION_EXECUTE_SCSI; Srb->Length = sizeof(SCSI_REQUEST_BLOCK); Srb->SrbFlags = SRB_FLAGS_DATA_IN | SRB_FLAGS_DISABLE_SYNCH_TRANSFER; + Srb->OriginalRequest = OriginalSrb->OriginalRequest; Srb->TimeOutValue = 4; Srb->CdbLength = 6; - Srb->DataBuffer = &DeviceExtension->InternalSenseData; + Srb->DataBuffer = Srb + 1; Srb->DataTransferLength = sizeof(SENSE_DATA); Cdb = (PCDB)Srb->Cdb; @@ -2235,14 +2096,6 @@ ScsiPortInitSenseRequestSrb(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, return(Srb); } - -static VOID -ScsiPortFreeSenseRequestSrb(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension) -{ - DeviceExtension->OriginalSrb = NULL; -} - - /********************************************************************** * NAME INTERNAL * SpiBuildDeviceMap @@ -2666,4 +2519,321 @@ ByeBye: return Status; } +static VOID +SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, + IN PIRP NextIrp) +{ + /* + * Using of some fields from Srb and Irp while processing requests: + * + * NextIrp on entry: + * Srb->OriginalRequest -> LunExtension + * Irp->Tail.Overlay.DriverContext[3] -> original Srb + * IoStack->Parameters.Scsi.Srb -> original Srb + * + * Irp is within the pending irp list: + * Srb->OriginalRequest -> LunExtension + * Irp->Tail.Overlay.DriverContext[0] and DriverContext[1] -> ListEntry for queue + * Irp->Tail.Overlay.DriverContext[2] -> sort key (from Srb->QueueSortKey) + * Irp->Tail.Overlay.DriverContext[3] -> current Srb (original or sense request) + * IoStack->Parameters.Scsi.Srb -> original Srb + * + * Irp is within the active irp list or while other processing: + * Srb->OriginalRequest -> Irp + * Irp->Tail.Overlay.DriverContext[0] and DriverContext[1] -> ListEntry for queue + * Irp->Tail.Overlay.DriverContext[2] -> LunExtension + * Irp->Tail.Overlay.DriverContext[3] -> current Srb (original or sense request) + * IoStack->Parameters.Scsi.Srb -> original Srb + */ + PIO_STACK_LOCATION IrpStack; + PSCSI_PORT_LUN_EXTENSION LunExtension; + PLIST_ENTRY ListEntry; + KIRQL oldIrql; + PIRP Irp; + LIST_ENTRY NextIrpListHead; + LIST_ENTRY CompleteIrpListHead; + PSCSI_REQUEST_BLOCK Srb; + PSCSI_REQUEST_BLOCK OriginalSrb; + + DPRINT("SpiProcessRequests() called\n"); + + InitializeListHead(&NextIrpListHead); + InitializeListHead(&CompleteIrpListHead); + + KeAcquireSpinLock(&DeviceExtension->IrpLock, &oldIrql); + + if (NextIrp) + { + Srb = NextIrp->Tail.Overlay.DriverContext[3]; + NextIrp->Tail.Overlay.DriverContext[2] = (PVOID)Srb->QueueSortKey; + + ListEntry = DeviceExtension->PendingIrpListHead.Flink; + while (ListEntry != DeviceExtension->PendingIrpListHead.Flink) + { + Irp = CONTAINING_RECORD(ListEntry, IRP, Tail.Overlay.DriverContext[0]); + if ((ULONG)Irp->Tail.Overlay.DriverContext[2] > Srb->QueueSortKey) + { + break; + } + ListEntry = ListEntry->Flink; + } + InsertTailList(ListEntry, (PLIST_ENTRY)&NextIrp->Tail.Overlay.DriverContext[0]); + } + + while (DeviceExtension->CompleteRequestCount || + ((DeviceExtension->SrbExtensionSize == 0 || DeviceExtension->ActiveIrpCount < MAX_SRB_EXTENSIONS) && !IsListEmpty(&DeviceExtension->PendingIrpListHead) && + (DeviceExtension->NextRequestCount || DeviceExtension->NextLuRequestCount || IsListEmpty(&DeviceExtension->ActiveIrpListHead)))) + { + DPRINT("CompleteRequestCount %d, NextRequestCount %d, NextLuRequestCount %d, PendingIrpList is %s, ActiveIrpList is %s\n", + DeviceExtension->CompleteRequestCount, + DeviceExtension->NextRequestCount, + DeviceExtension->NextLuRequestCount, + IsListEmpty(&DeviceExtension->PendingIrpListHead) ? "EMPTY" : "NOT empty", + IsListEmpty(&DeviceExtension->ActiveIrpListHead) ? "EMPTY" : "NOT empty"); + + if (DeviceExtension->CompleteRequestCount > 0) + { + DeviceExtension->IrpFlags &= ~IRP_FLAG_COMPLETE; + ListEntry = DeviceExtension->ActiveIrpListHead.Flink; + while (ListEntry != &DeviceExtension->ActiveIrpListHead) + { + Irp = CONTAINING_RECORD(ListEntry, IRP, Tail.Overlay.DriverContext[0]); + ListEntry = ListEntry->Flink; + Srb = Irp->Tail.Overlay.DriverContext[3]; + if (!(Srb->SrbFlags & SRB_FLAGS_IS_ACTIVE)) + { + BOOLEAN CompleteThisRequest; + InterlockedDecrement((PLONG)&DeviceExtension->CompleteRequestCount); + LunExtension = Irp->Tail.Overlay.DriverContext[2]; + IrpStack = IoGetCurrentIrpStackLocation(Irp); + OriginalSrb = IrpStack->Parameters.Scsi.Srb; + + if (OriginalSrb != Srb) + { + SENSE_DATA* SenseInfoBuffer; + + SenseInfoBuffer = Srb->DataBuffer; + + DPRINT("Got sense data!\n"); + + DPRINT("Valid: %x\n", SenseInfoBuffer->Valid); + DPRINT("ErrorCode: %x\n", SenseInfoBuffer->ErrorCode); + DPRINT("SenseKey: %x\n", SenseInfoBuffer->SenseKey); + DPRINT("SenseCode: %x\n", SenseInfoBuffer->AdditionalSenseCode); + + /* Copy sense data */ + if (OriginalSrb->SenseInfoBufferLength != 0) + { + RtlCopyMemory(OriginalSrb->SenseInfoBuffer, + SenseInfoBuffer, + sizeof(SENSE_DATA)); + OriginalSrb->SrbStatus |= SRB_STATUS_AUTOSENSE_VALID; + } + ExFreePool(Srb); + CompleteThisRequest = TRUE; + } + else if ((SRB_STATUS(Srb->SrbStatus) != SRB_STATUS_SUCCESS) && + (Srb->ScsiStatus == SCSISTAT_CHECK_CONDITION)) + { + DPRINT("SCSIOP_REQUEST_SENSE required!\n"); + + Srb = ScsiPortInitSenseRequestSrb(OriginalSrb); + + if (Srb) + { + CompleteThisRequest = FALSE; + Irp->Tail.Overlay.DriverContext[3] = Srb; + RemoveEntryList((PLIST_ENTRY)&Irp->Tail.Overlay.DriverContext[0]); + SpiFreeSrbExtension(DeviceExtension, Srb); + LunExtension->ActiveIrpCount--; + DeviceExtension->ActiveIrpCount--; + + Srb->OriginalRequest = LunExtension; + Irp->Tail.Overlay.DriverContext[2] = 0; + + InsertHeadList(&DeviceExtension->PendingIrpListHead, (PLIST_ENTRY)&Irp->Tail.Overlay.DriverContext[0]); + DeviceExtension->PendingIrpCount++; + LunExtension->PendingIrpCount++; + } + else + { + CompleteThisRequest = TRUE; + } + } + else + { + DPRINT("Complete Request\n"); + CompleteThisRequest = TRUE; + } + if (CompleteThisRequest) + { + RemoveEntryList((PLIST_ENTRY)&Irp->Tail.Overlay.DriverContext[0]); + InsertHeadList(&CompleteIrpListHead, (PLIST_ENTRY)&Irp->Tail.Overlay.DriverContext[0]); + SpiFreeSrbExtension(DeviceExtension, OriginalSrb); + LunExtension->ActiveIrpCount--; + DeviceExtension->ActiveIrpCount--; + } + } + } + } + if (DeviceExtension->NextLuRequestCount || + DeviceExtension->NextRequestCount) + { + BOOLEAN StartThisRequest; + DeviceExtension->IrpFlags &= ~(IRP_FLAG_NEXT|IRP_FLAG_NEXT_LU); + ListEntry = DeviceExtension->PendingIrpListHead.Flink; + while (ListEntry != &DeviceExtension->PendingIrpListHead) + { + Irp = CONTAINING_RECORD(ListEntry, IRP, Tail.Overlay.DriverContext[0]); + ListEntry = ListEntry->Flink; + Srb = Irp->Tail.Overlay.DriverContext[3]; + LunExtension = Srb->OriginalRequest; + if (DeviceExtension->SrbExtensionSize > 0 && + DeviceExtension->ActiveIrpCount >= MAX_SRB_EXTENSIONS) + { + break; + } + if (LunExtension->NextLuRequestCount > 0) + { + StartThisRequest = TRUE; + InterlockedDecrement((PLONG)&LunExtension->NextLuRequestCount); + InterlockedDecrement((PLONG)&DeviceExtension->NextLuRequestCount); + } + else if (DeviceExtension->NextRequestCount > 0 && + LunExtension->ActiveIrpCount == 0) + { + InterlockedDecrement((PLONG)&DeviceExtension->NextRequestCount); + StartThisRequest = TRUE; + } + else + { + StartThisRequest = FALSE; + } + if (StartThisRequest) + { + LunExtension->PendingIrpCount--; + DeviceExtension->PendingIrpCount--; + RemoveEntryList((PLIST_ENTRY)&Irp->Tail.Overlay.DriverContext[0]); + LunExtension->ActiveIrpCount++; + DeviceExtension->ActiveIrpCount++; + SpiAllocateSrbExtension(DeviceExtension, Srb); + + Irp->Tail.Overlay.DriverContext[2] = LunExtension; + Srb->OriginalRequest = Irp; + + InsertHeadList(&NextIrpListHead, (PLIST_ENTRY)&Irp->Tail.Overlay.DriverContext[0]); + } + } + } + + if (!IsListEmpty(&NextIrpListHead)) + { + while (!IsListEmpty(&NextIrpListHead)) + { + ListEntry = RemoveTailList(&NextIrpListHead); + Irp = CONTAINING_RECORD(ListEntry, IRP, Tail.Overlay.DriverContext[0]); + InsertHeadList(&DeviceExtension->ActiveIrpListHead, (PLIST_ENTRY)&Irp->Tail.Overlay.DriverContext[0]); + KeReleaseSpinLockFromDpcLevel(&DeviceExtension->IrpLock); + + // Start this Irp + SpiStartIo(DeviceExtension, Irp); + KeAcquireSpinLockAtDpcLevel(&DeviceExtension->IrpLock); + } + } + + if (!IsListEmpty(&DeviceExtension->PendingIrpListHead) && + IsListEmpty(&DeviceExtension->ActiveIrpListHead) && + (DeviceExtension->SrbExtensionSize == 0 || DeviceExtension->ActiveIrpCount < MAX_SRB_EXTENSIONS)) + { + ListEntry = RemoveHeadList(&DeviceExtension->PendingIrpListHead); + Irp = CONTAINING_RECORD(ListEntry, IRP, Tail.Overlay.DriverContext[0]); + Srb = Irp->Tail.Overlay.DriverContext[3]; + LunExtension = Srb->OriginalRequest; + + LunExtension->PendingIrpCount--; + DeviceExtension->PendingIrpCount--; + InsertHeadList(&DeviceExtension->ActiveIrpListHead, (PLIST_ENTRY)&Irp->Tail.Overlay.DriverContext[0]); + LunExtension->ActiveIrpCount++; + DeviceExtension->ActiveIrpCount++; + SpiAllocateSrbExtension(DeviceExtension, Srb); + + Irp->Tail.Overlay.DriverContext[2] = LunExtension; + Srb->OriginalRequest = Irp; + + KeReleaseSpinLockFromDpcLevel(&DeviceExtension->IrpLock); + + // Start this irp + SpiStartIo(DeviceExtension, Irp); + KeAcquireSpinLockAtDpcLevel(&DeviceExtension->IrpLock); + } + + if (!IsListEmpty(&CompleteIrpListHead)) + { + KeReleaseSpinLockFromDpcLevel(&DeviceExtension->IrpLock); + while (!IsListEmpty(&CompleteIrpListHead)) + { + ListEntry = RemoveTailList(&CompleteIrpListHead); + Irp = CONTAINING_RECORD(ListEntry, IRP, Tail.Overlay.DriverContext[0]); + IoCompleteRequest(Irp, IO_NO_INCREMENT); + } + KeAcquireSpinLockAtDpcLevel(&DeviceExtension->IrpLock); + } + } + KeReleaseSpinLock(&DeviceExtension->IrpLock, oldIrql); + + DPRINT("SpiProcessRequests() done\n"); + } + +static VOID +SpiStartIo(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, + IN PIRP Irp) +{ + PSCSI_PORT_LUN_EXTENSION LunExtension; + PSCSI_REQUEST_BLOCK Srb; + PIO_STACK_LOCATION IrpStack; + + DPRINT("SpiStartIo() called!\n"); + + assert(KeGetCurrentIrql() == DISPATCH_LEVEL); + + Srb = Irp->Tail.Overlay.DriverContext[3]; + LunExtension = Irp->Tail.Overlay.DriverContext[2]; + + Srb->SrbFlags |= SRB_FLAGS_IS_ACTIVE; + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = Srb->DataTransferLength; + + if (!KeSynchronizeExecution(DeviceExtension->Interrupt, + ScsiPortStartPacket, + Srb)) + { + DPRINT1("Synchronization failed!\n"); + + Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + Irp->IoStatus.Information = 0; + + KeAcquireSpinLockAtDpcLevel(&DeviceExtension->IrpLock); + + RemoveEntryList((PLIST_ENTRY)Irp->Tail.Overlay.DriverContext[0]); + LunExtension = Irp->Tail.Overlay.DriverContext[2]; + LunExtension->ActiveIrpCount--; + SpiFreeSrbExtension(DeviceExtension, Srb); + IrpStack = IoGetCurrentIrpStackLocation(Irp); + if (IrpStack->Parameters.Scsi.Srb != Srb) + { + ExFreePool(Srb); + } + DeviceExtension->ActiveIrpCount--; + + KeReleaseSpinLockFromDpcLevel(&DeviceExtension->IrpLock); + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + } + + DPRINT("SpiStartIo() done\n"); +} + + + /* EOF */ diff --git a/reactos/drivers/storage/scsiport/scsiport_int.h b/reactos/drivers/storage/scsiport/scsiport_int.h index 1f0012c8918..a81275d5470 100644 --- a/reactos/drivers/storage/scsiport/scsiport_int.h +++ b/reactos/drivers/storage/scsiport/scsiport_int.h @@ -37,7 +37,9 @@ typedef struct _SCSI_PORT_LUN_EXTENSION INQUIRYDATA InquiryData; - KDEVICE_QUEUE DeviceQueue; + ULONG PendingIrpCount; + ULONG ActiveIrpCount; + ULONG NextLuRequestCount; /* More data? */ @@ -63,7 +65,6 @@ typedef struct _SCSI_PORT_DEVICE_EXTENSION KSPIN_LOCK IrpLock; KSPIN_LOCK SpinLock; PKINTERRUPT Interrupt; - PIRP CurrentIrp; ULONG IrpFlags; SCSI_PORT_TIMER_STATES TimerState; @@ -84,9 +85,6 @@ typedef struct _SCSI_PORT_DEVICE_EXTENSION PHW_STARTIO HwStartIo; PHW_INTERRUPT HwInterrupt; - PSCSI_REQUEST_BLOCK OriginalSrb; - SCSI_REQUEST_BLOCK InternalSrb; - SENSE_DATA InternalSenseData; /* DMA related stuff */ PADAPTER_OBJECT AdapterObject; @@ -94,7 +92,20 @@ typedef struct _SCSI_PORT_DEVICE_EXTENSION PHYSICAL_ADDRESS PhysicalAddress; PVOID VirtualAddress; + ULONG VirtualAddressMap; ULONG CommonBufferLength; + LIST_ENTRY PendingIrpListHead; + LIST_ENTRY ActiveIrpListHead; + ULONG PendingIrpCount; + ULONG ActiveIrpCount; + + ULONG CompleteRequestCount; + ULONG NextRequestCount; + ULONG NextLuRequestCount; + UCHAR MiniPortDeviceExtension[1]; /* must be the last entry */ } SCSI_PORT_DEVICE_EXTENSION, *PSCSI_PORT_DEVICE_EXTENSION; + + + From 9b45df9243dd401c61a49d1f2564b261c12c86e5 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 7 Apr 2004 10:19:34 +0000 Subject: [PATCH 0763/1463] 1. fixed crash in 1bpp blt code that was caused by an uninitialized variable. 2. speed improvements for patterned brushes svn path=/trunk/; revision=9000 --- reactos/subsys/win32k/dib/dib16bpp.c | 39 ++++++++++--------- reactos/subsys/win32k/dib/dib1bpp.c | 57 ++++++++++++++-------------- reactos/subsys/win32k/dib/dib24bpp.c | 27 ++++++++----- reactos/subsys/win32k/dib/dib32bpp.c | 34 +++++++++-------- reactos/subsys/win32k/dib/dib4bpp.c | 52 +++++++++++++------------ reactos/subsys/win32k/dib/dib8bpp.c | 44 +++++++++++---------- 6 files changed, 136 insertions(+), 117 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib16bpp.c b/reactos/subsys/win32k/dib/dib16bpp.c index c5503d55de0..bb400dbfeab 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.25 2004/04/06 23:05:36 weiden Exp $ */ +/* $Id: dib16bpp.c,v 1.26 2004/04/07 10:19:34 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -283,11 +283,11 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, { ULONG X, Y; ULONG SourceX, SourceY; - ULONG wd, Dest, Source, Pattern = 0; + ULONG wd, Dest, Source, Pattern = 0, PatternY; PULONG DestBits; BOOL UsesSource; - BOOL UsesPattern; - LONG RoundedRight; + BOOL UsesPattern, CalcPattern; + ULONG RoundedRight; /* Pattern brushes */ PGDIBRUSHOBJ GdiBrush; HBITMAP PatternSurface = NULL; @@ -309,11 +309,11 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); - if (UsesPattern) + if ((CalcPattern = UsesPattern)) { if (Brush == NULL) { - UsesPattern = FALSE; + UsesPattern = CalcPattern = FALSE; } else if (Brush->iSolidColor == 0xFFFFFFFF) { @@ -331,6 +331,13 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); PatternWidth = PatternObj->sizlBitmap.cx; PatternHeight = PatternObj->sizlBitmap.cy; + CalcPattern = TRUE; + } + else + { + CalcPattern = FALSE; + Pattern = (Brush->iSolidColor & 0xFFFF) | + ((Brush->iSolidColor & 0xFFFF) << 16); } } @@ -345,6 +352,10 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, for (Y = DestRect->top; Y < DestRect->bottom; Y++) { SourceX = SourcePoint->x; + + if(CalcPattern) + PatternY = Y % PatternHeight; + for (X = DestRect->left; X < RoundedRight; X += 2, DestBits++, SourceX += 2) { Dest = *DestBits; @@ -355,18 +366,10 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, Source |= DIB_GetSource(SourceSurf, SourceGDI, SourceX + 1, SourceY, ColorTranslation) << 16; } - if (UsesPattern) + if (UsesPattern && (Brush->iSolidColor == 0xFFFFFFFF)) { - if (Brush->iSolidColor == 0xFFFFFFFF) - { - Pattern = (DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, Y % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack); - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + 1) % PatternWidth, Y % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 16; - } - else - { - Pattern = (Brush->iSolidColor & 0xFFFF) | - ((Brush->iSolidColor & 0xFFFF) << 16); - } + Pattern = (DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack); + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + 1) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 16; } *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); @@ -384,7 +387,7 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (UsesPattern) { if (Brush->iSolidColor == 0xFFFFFFFF) - Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, Y % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack; + Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; else Pattern = Brush->iSolidColor & 0xFFFF; } diff --git a/reactos/subsys/win32k/dib/dib1bpp.c b/reactos/subsys/win32k/dib/dib1bpp.c index 9651343056f..a826936fabe 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.19 2004/04/06 21:19:44 navaraf Exp $ */ +/* $Id: dib1bpp.c,v 1.20 2004/04/07 10:19:34 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include @@ -354,11 +354,11 @@ DIB_1BPP_BitBlt( XLATEOBJ *ColorTranslation, ULONG Rop4) { ULONG X, Y, SourceX, SourceY, k; - ULONG Dest, Source, Pattern; + ULONG Dest, Source, Pattern = 0; PULONG DestBits; BOOL UsesSource; - BOOL UsesPattern; - LONG RoundedRight; + BOOL UsesPattern, CalcPattern; + ULONG RoundedRight; BYTE NoBits; /* Pattern brushes */ PGDIBRUSHOBJ GdiBrush; @@ -378,11 +378,14 @@ DIB_1BPP_BitBlt( ColorTranslation); } - if (UsesPattern) + UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); + UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); + + if ((CalcPattern = UsesPattern)) { if (Brush == NULL) { - UsesPattern = FALSE; + UsesPattern = CalcPattern = FALSE; } else if (Brush->iSolidColor == 0xFFFFFFFF) { @@ -400,22 +403,32 @@ DIB_1BPP_BitBlt( PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); PatternWidth = PatternObj->sizlBitmap.cx; PatternHeight = PatternObj->sizlBitmap.cy; + + CalcPattern = TRUE; + } + else + { + CalcPattern = FALSE; + Pattern = Brush->iSolidColor; } } - UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); - UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); RoundedRight = DestRect->right - ((DestRect->right - DestRect->left) & 0x31); SourceY = SourcePoint->y; - + for (Y = DestRect->top; Y < DestRect->bottom; Y++) { + ULONG PatternY; + SourceX = SourcePoint->x; DestBits = (PULONG)( DestSurf->pvScan0 + (DestRect->left >> 3) + Y * DestSurf->lDelta); + if(CalcPattern) + PatternY = Y % PatternHeight; + X = DestRect->left; if (X & 31) { @@ -431,18 +444,11 @@ DIB_1BPP_BitBlt( Source |= (DIB_GetSource(SourceSurf, SourceGDI, SourceX + k, SourceY, ColorTranslation) << (31 - k)); } - if (UsesPattern) + if (UsesPattern && (Brush->iSolidColor == 0xFFFFFFFF)) { - if (Brush->iSolidColor == 0xFFFFFFFF) - { - Pattern = 0; - for (k = 31 - NoBits; k < NoBits; k++) - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k) % PatternWidth, Y % PatternHeight) << (31 - k)); - } - else - { - Pattern = Brush->iSolidColor ? 0xFFFFFFFF : 0x00000000; - } + Pattern = 0; + for (k = 31 - NoBits; k < NoBits; k++) + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k) % PatternWidth, PatternY) << (31 - k)); } Dest = DIB_DoRop(Rop4, Dest, Source, Pattern); @@ -484,10 +490,6 @@ DIB_1BPP_BitBlt( Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k + 24) % PatternWidth, Y % PatternHeight) << (24 + (7 - k))); } } - else - { - Pattern = Brush->iSolidColor ? 0xFFFFFFFF : 0x00000000; - } } *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); @@ -506,12 +508,9 @@ DIB_1BPP_BitBlt( Source = DIB_GetSource(SourceSurf, SourceGDI, SourceX, SourceY, ColorTranslation); } - if (UsesPattern) + if (UsesPattern && (Brush->iSolidColor == 0xFFFFFFFF)) { - if (Brush->iSolidColor == 0xFFFFFFFF) - Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, Y % PatternHeight); - else - Pattern = Brush->iSolidColor ? 0xFFFFFFFF : 0x00000000; + Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, Y % PatternHeight); } DIB_1BPP_PutPixel(DestSurf, X, Y, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF); diff --git a/reactos/subsys/win32k/dib/dib24bpp.c b/reactos/subsys/win32k/dib/dib24bpp.c index 8bcc084ee60..e6243f5be94 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.21 2004/04/06 23:05:36 weiden Exp $ */ +/* $Id: dib24bpp.c,v 1.22 2004/04/07 10:19:34 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -255,10 +255,10 @@ DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, { ULONG X, Y; ULONG SourceX, SourceY; - ULONG Dest, Source, Pattern; + ULONG Dest, Source, Pattern = 0, PatternY; PBYTE DestBits; BOOL UsesSource; - BOOL UsesPattern; + BOOL UsesPattern, CalcPattern; /* Pattern brushes */ PGDIBRUSHOBJ GdiBrush; HBITMAP PatternSurface = NULL; @@ -280,11 +280,11 @@ DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); - if (UsesPattern) + if ((CalcPattern = UsesPattern)) { if (Brush == NULL) { - UsesPattern = FALSE; + UsesPattern = CalcPattern = FALSE; } else if (Brush->iSolidColor == 0xFFFFFFFF) { @@ -302,6 +302,13 @@ DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); PatternWidth = PatternObj->sizlBitmap.cx; PatternHeight = PatternObj->sizlBitmap.cy; + + CalcPattern = TRUE; + } + else + { + CalcPattern = FALSE; + Pattern = Brush->iSolidColor; } } @@ -314,6 +321,10 @@ DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, for (Y = DestRect->top; Y < DestRect->bottom; Y++) { SourceX = SourcePoint->x; + + if(CalcPattern) + PatternY = Y % PatternHeight; + for (X = DestRect->left; X < DestRect->right; X++, DestBits += 3, SourceX++) { Dest = *((PUSHORT)DestBits) + (*(DestBits + 2) << 16); @@ -327,11 +338,7 @@ DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, { if (Brush->iSolidColor == 0xFFFFFFFF) { - Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, Y % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack; - } - else - { - Pattern = Brush->iSolidColor; + Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; } } diff --git a/reactos/subsys/win32k/dib/dib32bpp.c b/reactos/subsys/win32k/dib/dib32bpp.c index fa9fbbc79c1..706077c743c 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.21 2004/04/06 23:05:36 weiden Exp $ */ +/* $Id: dib32bpp.c,v 1.22 2004/04/07 10:19:34 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -304,10 +304,10 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, { ULONG X, Y; ULONG SourceX, SourceY; - ULONG Dest, Source, Pattern, wd; + ULONG Dest, Source, Pattern = 0, wd; PULONG DestBits; BOOL UsesSource; - BOOL UsesPattern; + BOOL UsesPattern, CalcPattern; /* Pattern brushes */ PGDIBRUSHOBJ GdiBrush; HBITMAP PatternSurface = NULL; @@ -329,11 +329,11 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); - if (UsesPattern) + if ((CalcPattern = UsesPattern)) { if (Brush == NULL) { - UsesPattern = FALSE; + UsesPattern = CalcPattern = FALSE; } else if (Brush->iSolidColor == 0xFFFFFFFF) { @@ -351,6 +351,13 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); PatternWidth = PatternObj->sizlBitmap.cx; PatternHeight = PatternObj->sizlBitmap.cy; + + CalcPattern = TRUE; + } + else + { + CalcPattern = FALSE; + Pattern = Brush->iSolidColor; } } @@ -363,8 +370,12 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, for (Y = DestRect->top; Y < DestRect->bottom; Y++) { + ULONG PatternY; SourceX = SourcePoint->x; - + + if(CalcPattern) + PatternY = Y % PatternHeight; + for (X = DestRect->left; X < DestRect->right; X++, DestBits++, SourceX++) { Dest = *DestBits; @@ -374,16 +385,9 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, Source = DIB_GetSource(SourceSurf, SourceGDI, SourceX, SourceY, ColorTranslation); } - if (UsesPattern) + if (UsesPattern && (Brush->iSolidColor == 0xFFFFFFFF)) { - if (Brush->iSolidColor == 0xFFFFFFFF) - { - Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, Y % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack; - } - else - { - Pattern = Brush->iSolidColor; - } + Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; } *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); diff --git a/reactos/subsys/win32k/dib/dib4bpp.c b/reactos/subsys/win32k/dib/dib4bpp.c index 130deb8ea2e..0cf1433f77d 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.25 2004/04/06 17:54:32 weiden Exp $ */ +/* $Id: dib4bpp.c,v 1.26 2004/04/07 10:19:34 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -239,10 +239,10 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, XLATEOBJ *ColorTranslation, ULONG Rop4) { LONG i, j, sx, sy; - ULONG Dest, Source, Pattern; + ULONG Dest, Source, Pattern = 0, PatternY; PULONG DestBits; BOOL UsesSource; - BOOL UsesPattern; + BOOL UsesPattern, CalcPattern; LONG RoundedRight; /* Pattern brushes */ PGDIBRUSHOBJ GdiBrush; @@ -284,11 +284,11 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); - if (UsesPattern) + if ((CalcPattern = UsesPattern)) { if (Brush == NULL) { - UsesPattern = FALSE; + UsesPattern = CalcPattern = FALSE; } else if (Brush->iSolidColor == 0xFFFFFFFF) { @@ -306,6 +306,12 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); PatternWidth = PatternObj->sizlBitmap.cx; PatternHeight = PatternObj->sizlBitmap.cy; + CalcPattern = TRUE; + } + else + { + CalcPattern = FALSE; + Pattern = Brush->iSolidColor & 0xF; } } @@ -318,6 +324,9 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, sx = SourcePoint->x; i = DestRect->left; + if(CalcPattern) + PatternY = j % PatternHeight; + if (i & 0x1) { Dest = DIB_4BPP_GetPixel(DestSurf, i, j); @@ -327,12 +336,9 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, Source = DIB_GetSource(SourceSurf, SourceGDI, sx, sy, ColorTranslation); } - if (UsesPattern) + if (UsesPattern && (Brush->iSolidColor == 0xFFFFFFFF)) { - if (Brush->iSolidColor == 0xFFFFFFFF) - Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack; - else - Pattern = Brush->iSolidColor & 0xF; + Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; } DIB_4BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF); @@ -361,18 +367,19 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, { if (Brush->iSolidColor == 0xFFFFFFFF) { - Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 1) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 4; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 2) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 8; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 3) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 12; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 4) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 16; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 5) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 20; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 6) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 24; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 7) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 28; + Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 1) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 4; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 2) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 8; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 3) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 12; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 4) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 16; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 5) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 20; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 6) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 24; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 7) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 28; } else { - Pattern = ExpandSolidColor[Brush->iSolidColor & 0xF]; + *DestBits = DIB_DoRop(Rop4, Dest, Source, ExpandSolidColor[Brush->iSolidColor & 0xF]); + continue; } } *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); @@ -386,12 +393,9 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, { Source = DIB_GetSource(SourceSurf, SourceGDI, sx, sy, ColorTranslation); } - if (UsesPattern) + if (UsesPattern && (Brush->iSolidColor == 0xFFFFFFFF)) { - if (Brush->iSolidColor == 0xFFFFFFFF) - Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack; - else - Pattern = Brush->iSolidColor & 0xF; + Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack; } DIB_4BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF); } diff --git a/reactos/subsys/win32k/dib/dib8bpp.c b/reactos/subsys/win32k/dib/dib8bpp.c index d498c6c22c2..3b7331ce2ce 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.19 2004/04/06 23:05:36 weiden Exp $ */ +/* $Id: dib8bpp.c,v 1.20 2004/04/07 10:19:34 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -277,10 +277,10 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, XLATEOBJ *ColorTranslation, ULONG Rop4) { LONG i, j, k, sx, sy; - ULONG Dest, Source, Pattern; + ULONG Dest, Source, Pattern = 0, PatternY; PULONG DestBits; BOOL UsesSource; - BOOL UsesPattern; + BOOL UsesPattern, CalcPattern; LONG RoundedRight; /* Pattern brushes */ PGDIBRUSHOBJ GdiBrush; @@ -303,11 +303,11 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); - if (UsesPattern) + if ((CalcPattern = UsesPattern)) { if (Brush == NULL) { - UsesPattern = FALSE; + UsesPattern = CalcPattern = FALSE; } else if (Brush->iSolidColor == 0xFFFFFFFF) { @@ -325,6 +325,15 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); PatternWidth = PatternObj->sizlBitmap.cx; PatternHeight = PatternObj->sizlBitmap.cy; + CalcPattern = TRUE; + } + else + { + CalcPattern = FALSE; + Pattern = (Brush->iSolidColor & 0xFF) | + ((Brush->iSolidColor & 0xFF) << 8) | + ((Brush->iSolidColor & 0xFF) << 16) | + ((Brush->iSolidColor & 0xFF) << 24); } } @@ -336,6 +345,9 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, sx = SourcePoint->x; DestBits = (PULONG)(DestSurf->pvScan0 + DestRect->left + j * DestSurf->lDelta); + if(CalcPattern) + PatternY = j % PatternHeight; + for (i = DestRect->left; i < RoundedRight; i += 4, DestBits++) { Dest = *DestBits; @@ -347,22 +359,12 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, Source |= (DIB_GetSource(SourceSurf, SourceGDI, sx + (i - DestRect->left) + k, sy, ColorTranslation) << (k * 8)); } - if (UsesPattern) + if (UsesPattern && (Brush->iSolidColor == 0xFFFFFFFF)) { - if (Brush->iSolidColor == 0xFFFFFFFF) - { - Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 1) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 8; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 2) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 16; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 3) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 24; - } - else - { - Pattern = (Brush->iSolidColor & 0xFF) | - ((Brush->iSolidColor & 0xFF) << 8) | - ((Brush->iSolidColor & 0xFF) << 16) | - ((Brush->iSolidColor & 0xFF) << 24); - } + Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 1) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 8; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 2) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 16; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 3) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 24; } *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); } @@ -380,7 +382,7 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (UsesPattern) { if (Brush->iSolidColor == 0xFFFFFFFF) - Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack; + Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth,PatternY) ? GdiBrush->crFore : GdiBrush->crBack; else Pattern = Brush->iSolidColor & 0xFF; } From 45a89e2e7cfd65a5e6aa8b3b3d59df131ac0aeec Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 7 Apr 2004 10:20:23 +0000 Subject: [PATCH 0764/1463] little fix svn path=/trunk/; revision=9001 --- reactos/subsys/win32k/dib/dib4bpp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib4bpp.c b/reactos/subsys/win32k/dib/dib4bpp.c index 0cf1433f77d..b8e4862e84a 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.26 2004/04/07 10:19:34 weiden Exp $ */ +/* $Id: dib4bpp.c,v 1.27 2004/04/07 10:20:23 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -395,7 +395,7 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } if (UsesPattern && (Brush->iSolidColor == 0xFFFFFFFF)) { - Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack; + Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; } DIB_4BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF); } From 6d228618c2b1715415746cc97735b198347bc7da Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 7 Apr 2004 14:43:08 +0000 Subject: [PATCH 0765/1463] remove obsolete code svn path=/trunk/; revision=9002 --- reactos/subsys/win32k/dib/dib4bpp.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib4bpp.c b/reactos/subsys/win32k/dib/dib4bpp.c index b8e4862e84a..77620f97bfa 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.27 2004/04/07 10:20:23 weiden Exp $ */ +/* $Id: dib4bpp.c,v 1.28 2004/04/07 14:43:08 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -311,7 +311,7 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, else { CalcPattern = FALSE; - Pattern = Brush->iSolidColor & 0xF; + Pattern = ExpandSolidColor[Brush->iSolidColor & 0xF]; } } @@ -376,11 +376,6 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 6) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 24; Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 7) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 28; } - else - { - *DestBits = DIB_DoRop(Rop4, Dest, Source, ExpandSolidColor[Brush->iSolidColor & 0xF]); - continue; - } } *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); } From 879e613c5dab947d10ab0bbf74b2c8a97ef43b7e Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 7 Apr 2004 15:02:31 +0000 Subject: [PATCH 0766/1463] patch reverted because ros crashes ntoskrnl svn path=/trunk/; revision=9003 --- reactos/iface/addsys/genw32k.c | 7 ++++--- reactos/iface/native/genntdll.c | 7 ++++--- reactos/include/ntos/service.h | 17 ++++++++++++----- reactos/w32api/include/ddk/winddk.h | 10 +++++++--- 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/reactos/iface/addsys/genw32k.c b/reactos/iface/addsys/genw32k.c index 1f2146834dd..60d45cbb82e 100644 --- a/reactos/iface/addsys/genw32k.c +++ b/reactos/iface/addsys/genw32k.c @@ -1,4 +1,4 @@ -/* $Id: genw32k.c,v 1.7 2004/04/07 00:14:05 hyperion Exp $ +/* $Id: genw32k.c,v 1.8 2004/04/07 15:02:31 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS version of ntdll @@ -88,7 +88,7 @@ char *stmp; * Now write the current system call's name * in the service table. */ - fprintf(out,"\t\t(PVOID (NTAPI *)(VOID))%s",name); + fprintf(out,"\t\t{ (ULONG)%s }",name); /* Next system call index */ sys_call_idx++; @@ -143,7 +143,7 @@ char *stmp; * Now write the current system call's ID * in the service table along with its Parameters Size. */ - fprintf(out,"\t\t%d",atoi(nr_args) * sizeof(void*)); + fprintf(out,"\t\t{ %d }",atoi(nr_args) * sizeof(void*)); /* Next system call index */ sys_call_idx++; @@ -346,3 +346,4 @@ int main(int argc, char* argv[]) return(ret); } + diff --git a/reactos/iface/native/genntdll.c b/reactos/iface/native/genntdll.c index a4bb9495763..0180b6ce169 100644 --- a/reactos/iface/native/genntdll.c +++ b/reactos/iface/native/genntdll.c @@ -1,4 +1,4 @@ -/* $Id: genntdll.c,v 1.14 2004/04/07 00:14:05 hyperion Exp $ +/* $Id: genntdll.c,v 1.15 2004/04/07 15:02:31 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS version of ntdll @@ -135,7 +135,7 @@ char *stmp; * Now write the current system call's name * in the service table. */ - fprintf(out,"\t\t(PVOID (NTAPI *)(VOID))%s",name); + fprintf(out,"\t\t{ (ULONG)%s }",name); } } /* Close the service table (C syntax) */ @@ -194,7 +194,7 @@ char *stmp; * Now write the current system call's ID * in the service table along with its Parameters Size. */ - fprintf(out,"\t\t%s",nr_args); + fprintf(out,"\t\t{ %s }",nr_args); } } /* @@ -368,3 +368,4 @@ int main(int argc, char* argv[]) return(ret); } + diff --git a/reactos/include/ntos/service.h b/reactos/include/ntos/service.h index 59e8b0ab934..d042d38c5ce 100755 --- a/reactos/include/ntos/service.h +++ b/reactos/include/ntos/service.h @@ -1,4 +1,3 @@ - #ifndef __NTOS_SERVICE_H #define __NTOS_SERVICE_H @@ -9,21 +8,28 @@ #ifndef __USE_W32API +#pragma pack(1) + /* System Service Dispatch Table */ -typedef PVOID (NTAPI * SSDT)(VOID); -typedef SSDT * PSSDT; +typedef struct t_SSDT { + ULONG SysCallPtr; +} SSDT, *PSSDT; /* System Service Parameters Table */ -typedef UCHAR SSPT, *PSSPT; +typedef struct t_SSPT { + unsigned int ParamBytes; +} SSPT, *PSSPT; typedef struct t_KeServiceDescriptorTableEntry { PSSDT SSDT; PULONG ServiceCounterTable; - ULONG NumberOfServices; + unsigned int NumberOfServices; PSSPT SSPT; } SSDT_ENTRY, *PSSDT_ENTRY; +#pragma pack() + #endif /* __USE_W32API */ @@ -75,3 +81,4 @@ KeAddSystemServiceTable ( #endif /* __NTOS_SERVICE_H */ + diff --git a/reactos/w32api/include/ddk/winddk.h b/reactos/w32api/include/ddk/winddk.h index 7eea53d20f9..ee806ac299e 100644 --- a/reactos/w32api/include/ddk/winddk.h +++ b/reactos/w32api/include/ddk/winddk.h @@ -7114,11 +7114,14 @@ KeAcquireSpinLock( OUT PKIRQL OldIrql); /* System Service Dispatch Table */ -typedef PVOID (NTAPI * SSDT)(VOID); -typedef SSDT * PSSDT; +typedef struct _SSDT { + ULONG SysCallPtr; +} SSDT, *PSSDT; /* System Service Parameters Table */ -typedef UCHAR SSPT, * PSSPT; +typedef struct _SSPT { + ULONG ParamBytes; +} SSPT, *PSSPT; typedef struct _SSDT_ENTRY { PSSDT SSDT; @@ -9112,3 +9115,4 @@ extern NTOSAPI PBOOLEAN KdDebuggerEnabled; #endif #endif /* __WINDDK_H */ + From 933466640172120ac4ae653af2ddb3453f4b80c6 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Wed, 7 Apr 2004 15:33:55 +0000 Subject: [PATCH 0767/1463] Restore modification. svn path=/trunk/; revision=9004 --- reactos/iface/addsys/genw32k.c | 7 +++---- reactos/iface/native/genntdll.c | 7 +++---- reactos/include/ntos/service.h | 17 +++++------------ reactos/w32api/include/ddk/winddk.h | 10 +++------- 4 files changed, 14 insertions(+), 27 deletions(-) diff --git a/reactos/iface/addsys/genw32k.c b/reactos/iface/addsys/genw32k.c index 60d45cbb82e..c43c9775e1b 100644 --- a/reactos/iface/addsys/genw32k.c +++ b/reactos/iface/addsys/genw32k.c @@ -1,4 +1,4 @@ -/* $Id: genw32k.c,v 1.8 2004/04/07 15:02:31 weiden Exp $ +/* $Id: genw32k.c,v 1.9 2004/04/07 15:32:24 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS version of ntdll @@ -88,7 +88,7 @@ char *stmp; * Now write the current system call's name * in the service table. */ - fprintf(out,"\t\t{ (ULONG)%s }",name); + fprintf(out,"\t\t(PVOID (NTAPI *)(VOID))%s",name); /* Next system call index */ sys_call_idx++; @@ -143,7 +143,7 @@ char *stmp; * Now write the current system call's ID * in the service table along with its Parameters Size. */ - fprintf(out,"\t\t{ %d }",atoi(nr_args) * sizeof(void*)); + fprintf(out,"\t\t%d",atoi(nr_args) * sizeof(void*)); /* Next system call index */ sys_call_idx++; @@ -346,4 +346,3 @@ int main(int argc, char* argv[]) return(ret); } - diff --git a/reactos/iface/native/genntdll.c b/reactos/iface/native/genntdll.c index 0180b6ce169..795de62c820 100644 --- a/reactos/iface/native/genntdll.c +++ b/reactos/iface/native/genntdll.c @@ -1,4 +1,4 @@ -/* $Id: genntdll.c,v 1.15 2004/04/07 15:02:31 weiden Exp $ +/* $Id: genntdll.c,v 1.16 2004/04/07 15:32:41 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS version of ntdll @@ -135,7 +135,7 @@ char *stmp; * Now write the current system call's name * in the service table. */ - fprintf(out,"\t\t{ (ULONG)%s }",name); + fprintf(out,"\t\t(PVOID (NTAPI *)(VOID))%s",name); } } /* Close the service table (C syntax) */ @@ -194,7 +194,7 @@ char *stmp; * Now write the current system call's ID * in the service table along with its Parameters Size. */ - fprintf(out,"\t\t{ %s }",nr_args); + fprintf(out,"\t\t%s",nr_args); } } /* @@ -368,4 +368,3 @@ int main(int argc, char* argv[]) return(ret); } - diff --git a/reactos/include/ntos/service.h b/reactos/include/ntos/service.h index d042d38c5ce..59e8b0ab934 100755 --- a/reactos/include/ntos/service.h +++ b/reactos/include/ntos/service.h @@ -1,3 +1,4 @@ + #ifndef __NTOS_SERVICE_H #define __NTOS_SERVICE_H @@ -8,28 +9,21 @@ #ifndef __USE_W32API -#pragma pack(1) - /* System Service Dispatch Table */ -typedef struct t_SSDT { - ULONG SysCallPtr; -} SSDT, *PSSDT; +typedef PVOID (NTAPI * SSDT)(VOID); +typedef SSDT * PSSDT; /* System Service Parameters Table */ -typedef struct t_SSPT { - unsigned int ParamBytes; -} SSPT, *PSSPT; +typedef UCHAR SSPT, *PSSPT; typedef struct t_KeServiceDescriptorTableEntry { PSSDT SSDT; PULONG ServiceCounterTable; - unsigned int NumberOfServices; + ULONG NumberOfServices; PSSPT SSPT; } SSDT_ENTRY, *PSSDT_ENTRY; -#pragma pack() - #endif /* __USE_W32API */ @@ -81,4 +75,3 @@ KeAddSystemServiceTable ( #endif /* __NTOS_SERVICE_H */ - diff --git a/reactos/w32api/include/ddk/winddk.h b/reactos/w32api/include/ddk/winddk.h index ee806ac299e..7eea53d20f9 100644 --- a/reactos/w32api/include/ddk/winddk.h +++ b/reactos/w32api/include/ddk/winddk.h @@ -7114,14 +7114,11 @@ KeAcquireSpinLock( OUT PKIRQL OldIrql); /* System Service Dispatch Table */ -typedef struct _SSDT { - ULONG SysCallPtr; -} SSDT, *PSSDT; +typedef PVOID (NTAPI * SSDT)(VOID); +typedef SSDT * PSSDT; /* System Service Parameters Table */ -typedef struct _SSPT { - ULONG ParamBytes; -} SSPT, *PSSPT; +typedef UCHAR SSPT, * PSSPT; typedef struct _SSDT_ENTRY { PSSDT SSDT; @@ -9115,4 +9112,3 @@ extern NTOSAPI PBOOLEAN KdDebuggerEnabled; #endif #endif /* __WINDDK_H */ - From 586548d926aec385faf7fcbf11dbfec3e0220654 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Wed, 7 Apr 2004 15:35:14 +0000 Subject: [PATCH 0768/1463] Fixed crashes that were cause by the changes to the service parameter table. svn path=/trunk/; revision=9005 --- reactos/ntoskrnl/ke/i386/syscall.S | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/ke/i386/syscall.S b/reactos/ntoskrnl/ke/i386/syscall.S index 9e4a53a6e12..f843f97599c 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.13 2004/03/29 22:29:34 gvg Exp $ +/* $Id: syscall.S,v 1.14 2004/04/07 15:35:14 ekohl Exp $ * * FILE: ntoskrnl/hal/x86/syscall.s * PURPOSE: 2E trap handler @@ -153,7 +153,8 @@ new_serviceInRange: /* Allocate room for argument list from kernel stack */ movl %es:_KeServiceDescriptorTable + 12, %ecx - movl %es:(%ecx, %eax, 4), %ecx + movb %es:(%ecx, %eax), %cl + movzx %cl, %ecx subl %ecx, %esp /* Copy the arguments from the user stack to the kernel stack */ @@ -211,7 +212,8 @@ new_shadowServiceInRange: /* Allocate room for argument list from kernel stack */ movl %es:_KeServiceDescriptorTableShadow + 28, %ecx - movl %es:(%ecx, %eax, 4), %ecx + movb %es:(%ecx, %eax), %cl + movzx %cl, %ecx subl %ecx, %esp /* Copy the arguments from the user stack to the kernel stack */ From 54dbe4faf6056cb8365f621884eab42fc3e34341 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 7 Apr 2004 15:37:50 +0000 Subject: [PATCH 0769/1463] little clean-up svn path=/trunk/; revision=9006 --- reactos/subsys/win32k/dib/dib16bpp.c | 26 +++++++---------- reactos/subsys/win32k/dib/dib1bpp.c | 37 ++++++++++-------------- reactos/subsys/win32k/dib/dib24bpp.c | 23 ++++++--------- reactos/subsys/win32k/dib/dib32bpp.c | 20 ++++++------- reactos/subsys/win32k/dib/dib4bpp.c | 42 ++++++++++++---------------- reactos/subsys/win32k/dib/dib8bpp.c | 26 +++++++---------- 6 files changed, 69 insertions(+), 105 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib16bpp.c b/reactos/subsys/win32k/dib/dib16bpp.c index bb400dbfeab..866cd5b82c5 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.26 2004/04/07 10:19:34 weiden Exp $ */ +/* $Id: dib16bpp.c,v 1.27 2004/04/07 15:37:49 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -286,7 +286,7 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, ULONG wd, Dest, Source, Pattern = 0, PatternY; PULONG DestBits; BOOL UsesSource; - BOOL UsesPattern, CalcPattern; + BOOL UsesPattern; ULONG RoundedRight; /* Pattern brushes */ PGDIBRUSHOBJ GdiBrush; @@ -307,14 +307,10 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); - UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); + UsesPattern = (((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000)) && Brush; - if ((CalcPattern = UsesPattern)) + if (UsesPattern) { - if (Brush == NULL) - { - UsesPattern = CalcPattern = FALSE; - } else if (Brush->iSolidColor == 0xFFFFFFFF) { PBITMAPOBJ PatternBitmap; @@ -331,11 +327,12 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); PatternWidth = PatternObj->sizlBitmap.cx; PatternHeight = PatternObj->sizlBitmap.cy; - CalcPattern = TRUE; + + UsesPattern = TRUE; } else { - CalcPattern = FALSE; + UsesPattern = FALSE; Pattern = (Brush->iSolidColor & 0xFFFF) | ((Brush->iSolidColor & 0xFFFF) << 16); } @@ -353,7 +350,7 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, { SourceX = SourcePoint->x; - if(CalcPattern) + if(UsesPattern) PatternY = Y % PatternHeight; for (X = DestRect->left; X < RoundedRight; X += 2, DestBits++, SourceX += 2) @@ -366,7 +363,7 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, Source |= DIB_GetSource(SourceSurf, SourceGDI, SourceX + 1, SourceY, ColorTranslation) << 16; } - if (UsesPattern && (Brush->iSolidColor == 0xFFFFFFFF)) + if (UsesPattern) { Pattern = (DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack); Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + 1) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 16; @@ -386,10 +383,7 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (UsesPattern) { - if (Brush->iSolidColor == 0xFFFFFFFF) - Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; - else - Pattern = Brush->iSolidColor & 0xFFFF; + Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; } DIB_16BPP_PutPixel(DestSurf, X, Y, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xFFFF); diff --git a/reactos/subsys/win32k/dib/dib1bpp.c b/reactos/subsys/win32k/dib/dib1bpp.c index a826936fabe..cbcb434c64f 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.20 2004/04/07 10:19:34 weiden Exp $ */ +/* $Id: dib1bpp.c,v 1.21 2004/04/07 15:37:50 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include @@ -357,7 +357,7 @@ DIB_1BPP_BitBlt( ULONG Dest, Source, Pattern = 0; PULONG DestBits; BOOL UsesSource; - BOOL UsesPattern, CalcPattern; + BOOL UsesPattern; ULONG RoundedRight; BYTE NoBits; /* Pattern brushes */ @@ -379,14 +379,10 @@ DIB_1BPP_BitBlt( } UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); - UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); + UsesPattern = (((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000)) && Brush; - if ((CalcPattern = UsesPattern)) + if (UsesPattern) { - if (Brush == NULL) - { - UsesPattern = CalcPattern = FALSE; - } else if (Brush->iSolidColor == 0xFFFFFFFF) { PBITMAPOBJ PatternBitmap; @@ -404,11 +400,11 @@ DIB_1BPP_BitBlt( PatternWidth = PatternObj->sizlBitmap.cx; PatternHeight = PatternObj->sizlBitmap.cy; - CalcPattern = TRUE; + UsesPattern = TRUE; } else { - CalcPattern = FALSE; + UsesPattern = FALSE; Pattern = Brush->iSolidColor; } } @@ -426,7 +422,7 @@ DIB_1BPP_BitBlt( (DestRect->left >> 3) + Y * DestSurf->lDelta); - if(CalcPattern) + if(UsesPattern) PatternY = Y % PatternHeight; X = DestRect->left; @@ -444,7 +440,7 @@ DIB_1BPP_BitBlt( Source |= (DIB_GetSource(SourceSurf, SourceGDI, SourceX + k, SourceY, ColorTranslation) << (31 - k)); } - if (UsesPattern && (Brush->iSolidColor == 0xFFFFFFFF)) + if (UsesPattern) { Pattern = 0; for (k = 31 - NoBits; k < NoBits; k++) @@ -479,16 +475,13 @@ DIB_1BPP_BitBlt( if (UsesPattern) { - if (Brush->iSolidColor == 0xFFFFFFFF) + Pattern = 0; + for (k = 0; k < 8; k++) { - Pattern = 0; - for (k = 0; k < 8; k++) - { - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k) % PatternWidth, Y % PatternHeight) << (7 - k)); - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k + 8) % PatternWidth, Y % PatternHeight) << (8 + (7 - k))); - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k + 16) % PatternWidth, Y % PatternHeight) << (16 + (7 - k))); - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k + 24) % PatternWidth, Y % PatternHeight) << (24 + (7 - k))); - } + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k) % PatternWidth, Y % PatternHeight) << (7 - k)); + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k + 8) % PatternWidth, Y % PatternHeight) << (8 + (7 - k))); + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k + 16) % PatternWidth, Y % PatternHeight) << (16 + (7 - k))); + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k + 24) % PatternWidth, Y % PatternHeight) << (24 + (7 - k))); } } @@ -508,7 +501,7 @@ DIB_1BPP_BitBlt( Source = DIB_GetSource(SourceSurf, SourceGDI, SourceX, SourceY, ColorTranslation); } - if (UsesPattern && (Brush->iSolidColor == 0xFFFFFFFF)) + if (UsesPattern) { Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, Y % PatternHeight); } diff --git a/reactos/subsys/win32k/dib/dib24bpp.c b/reactos/subsys/win32k/dib/dib24bpp.c index e6243f5be94..3b4b73dc44d 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.22 2004/04/07 10:19:34 weiden Exp $ */ +/* $Id: dib24bpp.c,v 1.23 2004/04/07 15:37:50 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -258,7 +258,7 @@ DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, ULONG Dest, Source, Pattern = 0, PatternY; PBYTE DestBits; BOOL UsesSource; - BOOL UsesPattern, CalcPattern; + BOOL UsesPattern; /* Pattern brushes */ PGDIBRUSHOBJ GdiBrush; HBITMAP PatternSurface = NULL; @@ -278,14 +278,10 @@ DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); - UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); + UsesPattern = (((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000)) && Brush; - if ((CalcPattern = UsesPattern)) + if (UsesPattern) { - if (Brush == NULL) - { - UsesPattern = CalcPattern = FALSE; - } else if (Brush->iSolidColor == 0xFFFFFFFF) { PBITMAPOBJ PatternBitmap; @@ -303,11 +299,11 @@ DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PatternWidth = PatternObj->sizlBitmap.cx; PatternHeight = PatternObj->sizlBitmap.cy; - CalcPattern = TRUE; + UsesPattern = TRUE; } else { - CalcPattern = FALSE; + UsesPattern = FALSE; Pattern = Brush->iSolidColor; } } @@ -322,7 +318,7 @@ DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, { SourceX = SourcePoint->x; - if(CalcPattern) + if(UsesPattern) PatternY = Y % PatternHeight; for (X = DestRect->left; X < DestRect->right; X++, DestBits += 3, SourceX++) @@ -336,10 +332,7 @@ DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (UsesPattern) { - if (Brush->iSolidColor == 0xFFFFFFFF) - { - Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; - } + Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; } Dest = DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xFFFFFF; diff --git a/reactos/subsys/win32k/dib/dib32bpp.c b/reactos/subsys/win32k/dib/dib32bpp.c index 706077c743c..719b24f610f 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.22 2004/04/07 10:19:34 weiden Exp $ */ +/* $Id: dib32bpp.c,v 1.23 2004/04/07 15:37:50 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -307,7 +307,7 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, ULONG Dest, Source, Pattern = 0, wd; PULONG DestBits; BOOL UsesSource; - BOOL UsesPattern, CalcPattern; + BOOL UsesPattern; /* Pattern brushes */ PGDIBRUSHOBJ GdiBrush; HBITMAP PatternSurface = NULL; @@ -327,14 +327,10 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); - UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); + UsesPattern = (((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000)) && Brush; - if ((CalcPattern = UsesPattern)) + if (UsesPattern) { - if (Brush == NULL) - { - UsesPattern = CalcPattern = FALSE; - } else if (Brush->iSolidColor == 0xFFFFFFFF) { PBITMAPOBJ PatternBitmap; @@ -352,11 +348,11 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PatternWidth = PatternObj->sizlBitmap.cx; PatternHeight = PatternObj->sizlBitmap.cy; - CalcPattern = TRUE; + UsesPattern = TRUE; } else { - CalcPattern = FALSE; + UsesPattern = FALSE; Pattern = Brush->iSolidColor; } } @@ -373,7 +369,7 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, ULONG PatternY; SourceX = SourcePoint->x; - if(CalcPattern) + if(UsesPattern) PatternY = Y % PatternHeight; for (X = DestRect->left; X < DestRect->right; X++, DestBits++, SourceX++) @@ -385,7 +381,7 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, Source = DIB_GetSource(SourceSurf, SourceGDI, SourceX, SourceY, ColorTranslation); } - if (UsesPattern && (Brush->iSolidColor == 0xFFFFFFFF)) + if (UsesPattern) { Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; } diff --git a/reactos/subsys/win32k/dib/dib4bpp.c b/reactos/subsys/win32k/dib/dib4bpp.c index 77620f97bfa..6e5a337cb92 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.28 2004/04/07 14:43:08 weiden Exp $ */ +/* $Id: dib4bpp.c,v 1.29 2004/04/07 15:37:50 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -242,7 +242,7 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, ULONG Dest, Source, Pattern = 0, PatternY; PULONG DestBits; BOOL UsesSource; - BOOL UsesPattern, CalcPattern; + BOOL UsesPattern; LONG RoundedRight; /* Pattern brushes */ PGDIBRUSHOBJ GdiBrush; @@ -282,14 +282,10 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); - UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); + UsesPattern = (((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000)) && Brush; - if ((CalcPattern = UsesPattern)) + if (UsesPattern) { - if (Brush == NULL) - { - UsesPattern = CalcPattern = FALSE; - } else if (Brush->iSolidColor == 0xFFFFFFFF) { PBITMAPOBJ PatternBitmap; @@ -306,11 +302,12 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); PatternWidth = PatternObj->sizlBitmap.cx; PatternHeight = PatternObj->sizlBitmap.cy; - CalcPattern = TRUE; + + UsesPattern = TRUE; } else { - CalcPattern = FALSE; + UsesPattern = FALSE; Pattern = ExpandSolidColor[Brush->iSolidColor & 0xF]; } } @@ -324,7 +321,7 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, sx = SourcePoint->x; i = DestRect->left; - if(CalcPattern) + if(UsesPattern) PatternY = j % PatternHeight; if (i & 0x1) @@ -336,7 +333,7 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, Source = DIB_GetSource(SourceSurf, SourceGDI, sx, sy, ColorTranslation); } - if (UsesPattern && (Brush->iSolidColor == 0xFFFFFFFF)) + if (UsesPattern) { Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; } @@ -365,17 +362,14 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } if (UsesPattern) { - if (Brush->iSolidColor == 0xFFFFFFFF) - { - Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 1) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 4; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 2) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 8; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 3) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 12; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 4) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 16; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 5) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 20; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 6) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 24; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 7) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 28; - } + Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 1) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 4; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 2) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 8; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 3) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 12; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 4) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 16; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 5) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 20; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 6) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 24; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 7) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 28; } *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); } @@ -388,7 +382,7 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, { Source = DIB_GetSource(SourceSurf, SourceGDI, sx, sy, ColorTranslation); } - if (UsesPattern && (Brush->iSolidColor == 0xFFFFFFFF)) + if (UsesPattern) { Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; } diff --git a/reactos/subsys/win32k/dib/dib8bpp.c b/reactos/subsys/win32k/dib/dib8bpp.c index 3b7331ce2ce..ed7042b2817 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.20 2004/04/07 10:19:34 weiden Exp $ */ +/* $Id: dib8bpp.c,v 1.21 2004/04/07 15:37:50 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -280,7 +280,7 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, ULONG Dest, Source, Pattern = 0, PatternY; PULONG DestBits; BOOL UsesSource; - BOOL UsesPattern, CalcPattern; + BOOL UsesPattern; LONG RoundedRight; /* Pattern brushes */ PGDIBRUSHOBJ GdiBrush; @@ -301,14 +301,10 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); - UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); + UsesPattern = (((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000)) && Brush; - if ((CalcPattern = UsesPattern)) + if (UsesPattern) { - if (Brush == NULL) - { - UsesPattern = CalcPattern = FALSE; - } else if (Brush->iSolidColor == 0xFFFFFFFF) { PBITMAPOBJ PatternBitmap; @@ -325,11 +321,12 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); PatternWidth = PatternObj->sizlBitmap.cx; PatternHeight = PatternObj->sizlBitmap.cy; - CalcPattern = TRUE; + + UsesPattern = TRUE; } else { - CalcPattern = FALSE; + UsesPattern = FALSE; Pattern = (Brush->iSolidColor & 0xFF) | ((Brush->iSolidColor & 0xFF) << 8) | ((Brush->iSolidColor & 0xFF) << 16) | @@ -345,7 +342,7 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, sx = SourcePoint->x; DestBits = (PULONG)(DestSurf->pvScan0 + DestRect->left + j * DestSurf->lDelta); - if(CalcPattern) + if(UsesPattern) PatternY = j % PatternHeight; for (i = DestRect->left; i < RoundedRight; i += 4, DestBits++) @@ -359,7 +356,7 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, Source |= (DIB_GetSource(SourceSurf, SourceGDI, sx + (i - DestRect->left) + k, sy, ColorTranslation) << (k * 8)); } - if (UsesPattern && (Brush->iSolidColor == 0xFFFFFFFF)) + if (UsesPattern) { Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 1) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 8; @@ -381,10 +378,7 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (UsesPattern) { - if (Brush->iSolidColor == 0xFFFFFFFF) - Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth,PatternY) ? GdiBrush->crFore : GdiBrush->crBack; - else - Pattern = Brush->iSolidColor & 0xFF; + Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth,PatternY) ? GdiBrush->crFore : GdiBrush->crBack; } DIB_8BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xFFFF); From d8dd152253e8e813773b54aa3f8b908ce874992a Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 7 Apr 2004 16:38:27 +0000 Subject: [PATCH 0770/1463] little clean-up svn path=/trunk/; revision=9007 --- reactos/subsys/win32k/dib/dib1bpp.c | 12 ++++++------ reactos/subsys/win32k/eng/bitblt.c | 10 +++++++--- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib1bpp.c b/reactos/subsys/win32k/dib/dib1bpp.c index cbcb434c64f..77e01a683ea 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.21 2004/04/07 15:37:50 weiden Exp $ */ +/* $Id: dib1bpp.c,v 1.22 2004/04/07 16:38:27 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include @@ -478,10 +478,10 @@ DIB_1BPP_BitBlt( Pattern = 0; for (k = 0; k < 8; k++) { - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k) % PatternWidth, Y % PatternHeight) << (7 - k)); - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k + 8) % PatternWidth, Y % PatternHeight) << (8 + (7 - k))); - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k + 16) % PatternWidth, Y % PatternHeight) << (16 + (7 - k))); - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k + 24) % PatternWidth, Y % PatternHeight) << (24 + (7 - k))); + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k) % PatternWidth, PatternY) << (7 - k)); + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k + 8) % PatternWidth, PatternY) << (8 + (7 - k))); + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k + 16) % PatternWidth, PatternY) << (16 + (7 - k))); + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k + 24) % PatternWidth, PatternY) << (24 + (7 - k))); } } @@ -503,7 +503,7 @@ DIB_1BPP_BitBlt( if (UsesPattern) { - Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, Y % PatternHeight); + Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, PatternY); } DIB_1BPP_PutPixel(DestSurf, X, Y, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF); diff --git a/reactos/subsys/win32k/eng/bitblt.c b/reactos/subsys/win32k/eng/bitblt.c index 7e7d54a78de..9921c45d832 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.45 2004/04/06 21:53:48 weiden Exp $ +/* $Id: bitblt.c,v 1.46 2004/04/07 16:38:27 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -114,7 +114,7 @@ BltMask(SURFOBJ* Dest, PGDIBRUSHOBJ GdiBrush; HBITMAP PatternSurface = NULL; PSURFOBJ PatternObj; - ULONG PatternWidth, PatternHeight; + ULONG PatternWidth, PatternHeight, PatternY; if (Mask == NULL) { @@ -147,6 +147,10 @@ BltMask(SURFOBJ* Dest, { lMask = tMask; c8 = SourcePoint->x & 0x07; + + if(PatternSurface) + PatternY = (DestRect->top + j) % PatternHeight; + for (i = 0; i < dx; i++) { if (0 != (*lMask & maskbit[c8])) @@ -158,7 +162,7 @@ BltMask(SURFOBJ* Dest, else { DestGDI->DIB_PutPixel(Dest, DestRect->left + i, DestRect->top + j, - DIB_1BPP_GetPixel(PatternObj, (DestRect->left + i) % PatternWidth, (DestRect->top + j) % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack); + DIB_1BPP_GetPixel(PatternObj, (DestRect->left + i) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack); } } c8++; From d5bc2e4dc79867816f6d16bbbe0ff5b72f3c22c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Wed, 7 Apr 2004 17:42:05 +0000 Subject: [PATCH 0771/1463] Change to __stdcall calling convention svn path=/trunk/; revision=9008 --- reactos/lib/netapi32/browsr.c | 4 ++-- reactos/w32api/include/lmbrowsr.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/lib/netapi32/browsr.c b/reactos/lib/netapi32/browsr.c index 61ad3e32591..07677fc58b6 100644 --- a/reactos/lib/netapi32/browsr.c +++ b/reactos/lib/netapi32/browsr.c @@ -32,7 +32,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(netapi32); /************************************************************ * I_BrowserSetNetlogonState (NETAPI32.@) */ -NET_API_STATUS I_BrowserSetNetlogonState( +NET_API_STATUS WINAPI I_BrowserSetNetlogonState( LPWSTR ServerName, LPWSTR DomainName, LPWSTR EmulatedServerName, DWORD Role) { @@ -42,7 +42,7 @@ NET_API_STATUS I_BrowserSetNetlogonState( /************************************************************ * I_BrowserQueryEmulatedDomains (NETAPI32.@) */ -NET_API_STATUS I_BrowserQueryEmulatedDomains(LPWSTR ServerName,PBYTE* blah,PDWORD EntriesRead) +NET_API_STATUS WINAPI I_BrowserQueryEmulatedDomains(LPWSTR ServerName,PBYTE* blah,PDWORD EntriesRead) //NET_API_STATUS I_BrowserQueryEmulatedDomains( // LPWSTR ServerName, PBYTE *EmulatedDomains // PDWORD EntriesRead) diff --git a/reactos/w32api/include/lmbrowsr.h b/reactos/w32api/include/lmbrowsr.h index 4aee4646cd9..66078c67d7e 100644 --- a/reactos/w32api/include/lmbrowsr.h +++ b/reactos/w32api/include/lmbrowsr.h @@ -60,10 +60,10 @@ typedef struct _BROWSER_STATISTICS_101 { NET_API_STATUS WINAPI I_BrowserServerEnum(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,DWORD,LPCWSTR,PDWORD); NET_API_STATUS WINAPI I_BrowserServerEnumEx(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,DWORD,LPCWSTR,LPCWSTR); -NET_API_STATUS I_BrowserQueryEmulatedDomains(LPWSTR,PBYTE*,PDWORD); +NET_API_STATUS WINAPI I_BrowserQueryEmulatedDomains(LPWSTR,PBYTE*,PDWORD); NET_API_STATUS I_BrowserQueryOtherDomains(LPCWSTR,PBYTE*,PDWORD,PDWORD); NET_API_STATUS I_BrowserResetNetlogonState(LPCWSTR); -NET_API_STATUS I_BrowserSetNetlogonState(LPWSTR,LPWSTR,LPWSTR,DWORD); +NET_API_STATUS WINAPI I_BrowserSetNetlogonState(LPWSTR,LPWSTR,LPWSTR,DWORD); NET_API_STATUS I_BrowserQueryStatistics(LPCWSTR,LPBROWSER_STATISTICS*); NET_API_STATUS I_BrowserResetStatistics(LPCWSTR); WORD I_BrowserServerEnumForXactsrv(LPCWSTR,LPCWSTR,ULONG,USHORT,PVOID,WORD,DWORD,PDWORD,PDWORD,DWORD,LPCWSTR,LPCWSTR,PWORD); From 7a27e9d3bf8edc67c569afe890b2b978b730bccd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Wed, 7 Apr 2004 17:45:05 +0000 Subject: [PATCH 0772/1463] CVS maintenance svn path=/trunk/; revision=9009 --- reactos/lib/netapi32/.cvsignore | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/reactos/lib/netapi32/.cvsignore b/reactos/lib/netapi32/.cvsignore index bd5600152c0..0c1b0752c54 100644 --- a/reactos/lib/netapi32/.cvsignore +++ b/reactos/lib/netapi32/.cvsignore @@ -1,5 +1,10 @@ -netapi32.def -netapi32.dll -netapi32.dll.dbg.c -netapi32.spec.c +*.coff +*.dll +*.d +*.a +*.o +*.sym +*.map +*.tmp +Makefile.ros netapi32.spec.def From 7885bdaef7130c6eb372d1b1bdba2ee9da1814f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Wed, 7 Apr 2004 17:48:15 +0000 Subject: [PATCH 0773/1463] Include netapi32.dll and setupapi.dll in default build/setup svn path=/trunk/; revision=9010 --- reactos/Makefile | 8 ++++---- reactos/bootdata/packages/reactos.dff | 2 ++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/reactos/Makefile b/reactos/Makefile index a02dd6f19c1..ccdc18774e3 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.212 2004/03/24 00:05:27 mf Exp $ +# $Id: Makefile,v 1.213 2004/04/07 17:48:15 gvg Exp $ # # Global makefile # @@ -46,9 +46,9 @@ DLLS_CPL = cpl # imagehlp imm32 DLLS = advapi32 cabinet cards comctl32 crtdll comdlg32 d3d8thk expat fmifs freetype gdi32 \ imm32 iphlpapi kernel32 lzexpand mpr msafd msgina msimg32 msvcrt msvcrt20 mswsock \ - ntdll ole32 oleaut32 oledlg packet psapi richedit rpcrt4 samlib secur32 shell32 shlwapi \ - snmpapi syssetup twain unicode user32 userenv version wininet winmm winspool \ - ws2help ws2_32 wsock32 wshirda $(DLLS_KBD) $(DLLS_CPL) + netapi32.dll 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 $(DLLS_KBD) $(DLLS_CPL) SUBSYS = smss win32k csrss ntvdm diff --git a/reactos/bootdata/packages/reactos.dff b/reactos/bootdata/packages/reactos.dff index 4320c969e3e..186884c7079 100755 --- a/reactos/bootdata/packages/reactos.dff +++ b/reactos/bootdata/packages/reactos.dff @@ -68,6 +68,7 @@ lib\msafd\msafd.dll 1 lib\msgina\msgina.dll 1 lib\msvcrt\msvcrt.dll 1 lib\msvcrt20\msvcrt20.dll 1 +lib\netapi32\netapi32.dll 1 lib\ntdll\ntdll.dll 1 lib\ole32\ole32.dll 1 lib\oleaut32\oleaut32.dll 1 @@ -75,6 +76,7 @@ lib\richedit\riched32.dll 1 lib\rpcrt4\rpcrt4.dll 1 lib\samlib\samlib.dll 1 lib\secur32\secur32.dll 1 +lib\setupapi\setupapi.dll 1 lib\shell32\shell32.dll 1 lib\shlwapi\shlwapi.dll 1 lib\syssetup\syssetup.dll 1 From 335631830da2cef3350a10ae0d7c24f1bd535f59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Wed, 7 Apr 2004 17:52:32 +0000 Subject: [PATCH 0774/1463] - Pass args to MsqSendMessage in correct order - Implement message sending to HWND_BROADCAST svn path=/trunk/; revision=9011 --- reactos/subsys/win32k/ntuser/message.c | 89 +++++++++++++++++++------- 1 file changed, 65 insertions(+), 24 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/message.c b/reactos/subsys/win32k/ntuser/message.c index 54f1cbff359..17906afaafe 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.54 2004/03/11 16:17:25 weiden Exp $ +/* $Id: message.c,v 1.55 2004/04/07 17:52:32 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -725,14 +725,14 @@ IntSendMessage(HWND hWnd, return 0; } -LRESULT STDCALL -IntSendMessageTimeout(HWND hWnd, - UINT Msg, - WPARAM wParam, - LPARAM lParam, - UINT uFlags, - UINT uTimeout, - ULONG_PTR *uResult) +static LRESULT STDCALL +IntSendMessageTimeoutSingle(HWND hWnd, + UINT Msg, + WPARAM wParam, + LPARAM lParam, + UINT uFlags, + UINT uTimeout, + ULONG_PTR *uResult) { LRESULT Result; NTSTATUS Status; @@ -742,8 +742,6 @@ IntSendMessageTimeout(HWND hWnd, LPARAM lParamPacked; PW32THREAD Win32Thread; - /* FIXME: Check for a broadcast or topmost destination. */ - /* FIXME: Call hooks. */ Window = IntGetWindowObject(hWnd); if (!Window) @@ -814,7 +812,7 @@ IntSendMessageTimeout(HWND hWnd, } Status = MsqSendMessage(Window->MessageQueue, hWnd, Msg, wParam, lParam, - (uFlags & SMTO_BLOCK), uTimeout, &Result); + uTimeout, (uFlags & SMTO_BLOCK), &Result); if(Status == STATUS_TIMEOUT) { IntReleaseWindowObject(Window); @@ -828,6 +826,45 @@ IntSendMessageTimeout(HWND hWnd, return TRUE; } +LRESULT STDCALL +IntSendMessageTimeout(HWND hWnd, + UINT Msg, + WPARAM wParam, + LPARAM lParam, + UINT uFlags, + UINT uTimeout, + ULONG_PTR *uResult) +{ + PWINDOW_OBJECT DesktopWindow; + HWND *Children; + HWND *Child; + + if (HWND_BROADCAST != hWnd) + { + return IntSendMessageTimeoutSingle(hWnd, Msg, wParam, lParam, uFlags, uTimeout, uResult); + } + + DesktopWindow = IntGetWindowObject(IntGetDesktopWindow()); + if (NULL == DesktopWindow) + { + SetLastWin32Error(ERROR_INTERNAL_ERROR); + return 0; + } + Children = IntWinListChildren(DesktopWindow); + IntReleaseWindowObject(DesktopWindow); + if (NULL == Children) + { + return 0; + } + + for (Child = Children; NULL != *Child; Child++) + { + IntSendMessageTimeoutSingle(*Child, Msg, wParam, lParam, uFlags, uTimeout, uResult); + } + + return (LRESULT) TRUE; +} + static NTSTATUS FASTCALL CopyMsgToKernelMem(MSG *KernelModeMsg, MSG *UserModeMsg) { @@ -938,25 +975,26 @@ IntDoSendMessage(HWND Wnd, MSG UserModeMsg; MSG KernelModeMsg; - /* FIXME: Check for a broadcast or topmost destination. */ - RtlZeroMemory(&Info, sizeof(NTUSERSENDMESSAGEINFO)); /* FIXME: Call hooks. */ - Window = IntGetWindowObject(Wnd); - if (NULL == Window) + if (HWND_BROADCAST != Wnd) { - /* Tell usermode to not touch this one */ - Info.HandledByKernel = TRUE; - MmCopyToCaller(UnsafeInfo, &Info, sizeof(NTUSERSENDMESSAGEINFO)); - SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); - return 0; + Window = IntGetWindowObject(Wnd); + if (NULL == Window) + { + /* Tell usermode to not touch this one */ + Info.HandledByKernel = TRUE; + MmCopyToCaller(UnsafeInfo, &Info, sizeof(NTUSERSENDMESSAGEINFO)); + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + return 0; + } } /* FIXME: Check for an exiting window. */ /* See if the current thread can handle the message */ - if (NULL != PsGetWin32Thread() && + if (HWND_BROADCAST != Wnd && NULL != PsGetWin32Thread() && Window->MessageQueue == PsGetWin32Thread()->MessageQueue) { /* Gather the information usermode needs to call the window proc directly */ @@ -992,7 +1030,10 @@ IntDoSendMessage(HWND Wnd, else { /* Must be handled by other thread */ - IntReleaseWindowObject(Window); + if (HWND_BROADCAST != Wnd) + { + IntReleaseWindowObject(Window); + } Info.HandledByKernel = TRUE; UserModeMsg.hwnd = Wnd; UserModeMsg.message = Msg; @@ -1046,7 +1087,7 @@ NtUserSendMessageTimeout(HWND hWnd, { DOSENDMESSAGE dsm; LRESULT Result; - + dsm.uFlags = uFlags; dsm.uTimeout = uTimeout; Result = IntDoSendMessage(hWnd, Msg, wParam, lParam, &dsm, UnsafeInfo); From 87a878a82eadf84eb738aa508628d57b188b1f11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Wed, 7 Apr 2004 18:05:16 +0000 Subject: [PATCH 0775/1463] I should test small changes too before committing... Sorry. svn path=/trunk/; revision=9012 --- reactos/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/Makefile b/reactos/Makefile index ccdc18774e3..a284f9bfba6 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.213 2004/04/07 17:48:15 gvg Exp $ +# $Id: Makefile,v 1.214 2004/04/07 18:05:16 gvg Exp $ # # Global makefile # @@ -46,7 +46,7 @@ DLLS_CPL = cpl # imagehlp imm32 DLLS = advapi32 cabinet cards comctl32 crtdll comdlg32 d3d8thk expat fmifs freetype gdi32 \ imm32 iphlpapi kernel32 lzexpand mpr msafd msgina msimg32 msvcrt msvcrt20 mswsock \ - netapi32.dll ntdll ole32 oleaut32 oledlg packet psapi richedit rpcrt4 samlib secur32 \ + 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 $(DLLS_KBD) $(DLLS_CPL) From f38bef7c322a34a362b70b531a0adc79b2cd632f Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 7 Apr 2004 19:25:27 +0000 Subject: [PATCH 0776/1463] better statistics svn path=/trunk/; revision=9013 --- reactos/apps/utils/stats/stats.c | 57 +++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 16 deletions(-) diff --git a/reactos/apps/utils/stats/stats.c b/reactos/apps/utils/stats/stats.c index 3f058650824..5721b0d20a0 100644 --- a/reactos/apps/utils/stats/stats.c +++ b/reactos/apps/utils/stats/stats.c @@ -16,6 +16,8 @@ typedef struct _EXTENSION_INFO struct _EXTENSION_INFO * Next; struct _FILE_INFO * StatInfoList; TCHAR ExtName[16]; + TCHAR ExpandedExtName[128]; + DWORD nExtensions; TCHAR Description[256]; DWORD FileCount; DWORD LineCount; @@ -80,14 +82,28 @@ AddExtension(LPTSTR ExtName, { PEXTENSION_INFO ExtInfo; PEXTENSION_INFO Info; + TCHAR *t; + DWORD ln; ExtInfo = (PEXTENSION_INFO) HeapAlloc (GetProcessHeap(), 0, sizeof (EXTENSION_INFO)); if (!ExtInfo) return NULL; + + for(t = ExtName; *t != _T('\0'); t += _tcslen(t) + 1); + ln = (DWORD)t - (DWORD)ExtName; + ZeroMemory (ExtInfo, sizeof (EXTENSION_INFO)); - _tcscpy (ExtInfo->ExtName, ExtName); + memcpy (ExtInfo->ExtName, ExtName, ln); _tcscpy (ExtInfo->Description, Description); - + + for(t = ExtInfo->ExtName; *t != _T('\0'); t += _tcslen(t) + 1) + { + if(ExtInfo->nExtensions++ != 0) + _tcscat (ExtInfo->ExpandedExtName, _T(";")); + _tcscat (ExtInfo->ExpandedExtName, _T("*.")); + _tcscat (ExtInfo->ExpandedExtName, t); + } + if (ExtInfoList) { Info = ExtInfoList; @@ -273,14 +289,22 @@ PrintStatistics() TotalFileCount = 0; TotalLineCount = 0; Info = ExtInfoList; - - while (Info != NULL) + + for (Info = ExtInfoList; Info != NULL; Info = Info->Next) + { + TotalFileCount += Info->FileCount; + TotalLineCount += Info->LineCount; + } + + TotalAvgLF = (TotalFileCount ? TotalLineCount / TotalFileCount : 0); + + for (Info = ExtInfoList; Info != NULL; Info = Info->Next) { DWORD AvgLF; if (Info->FileCount != 0) { - AvgLF = Info->LineCount / Info->FileCount; + AvgLF = (Info->FileCount ? Info->LineCount / Info->FileCount : 0); } else { @@ -288,20 +312,14 @@ PrintStatistics() } _tprintf (_T("\n")); - _tprintf (_T("File extension : %s\n"), Info->ExtName); + _tprintf (_T("File extension%c : %s\n"), ((Info->nExtensions > 1) ? _T('s') : _T(' ')), Info->ExpandedExtName); _tprintf (_T("File ext. description : %s\n"), Info->Description); _tprintf (_T("Number of files : %lu\n"), Info->FileCount); _tprintf (_T("Number of lines : %lu\n"), Info->LineCount); + _tprintf (_T("Proportion of lines : %.2f %%\n"), (float)(TotalLineCount ? (((float)Info->LineCount * 100) / (float)TotalLineCount) : 0)); _tprintf (_T("Average no. lines/file : %lu\n"), AvgLF); - - TotalFileCount += Info->FileCount; - TotalLineCount += Info->LineCount; - - Info = Info->Next; } - TotalAvgLF = TotalLineCount / TotalFileCount; - _tprintf (_T("\n")); _tprintf (_T("Total number of files : %lu\n"), TotalFileCount); _tprintf (_T("Total number of lines : %lu\n"), TotalLineCount); @@ -316,16 +334,20 @@ ProcessFiles(LPTSTR Path) PEXTENSION_INFO Info; TCHAR SearchPath[256]; TCHAR FileName[256]; + TCHAR *Ext; HANDLE SearchHandle; BOOL More; Info = ExtInfoList; while (Info != NULL) { + Ext = Info->ExtName; + do + { ZeroMemory (&FindFile, sizeof (FindFile)); _tcscpy (SearchPath, Path); _tcscat (SearchPath, _T("\\*.")); - _tcscat (SearchPath, Info->ExtName); + _tcscat (SearchPath, Ext); _tcscpy (FindFile.cFileName, SearchPath); SearchHandle = FindFirstFile (SearchPath, &FindFile); if (SearchHandle != INVALID_HANDLE_VALUE) @@ -362,6 +384,8 @@ ProcessFiles(LPTSTR Path) } FindClose (SearchHandle); } + Ext += _tcslen(Ext) + 1; + } while(*Ext != _T('\0')); Info = Info->Next; } return TRUE; @@ -450,8 +474,9 @@ main (int argc, char * argv []) } Initialize(); - AddExtension (_T("c"), _T("Source files")); - AddExtension (_T("h"), _T("Header files")); + AddExtension (_T("c\0\0"), _T("Ansi C Source files")); + AddExtension (_T("cpp\0cxx\0\0"), _T("C++ Source files")); + AddExtension (_T("h\0\0"), _T("Header files")); Execute (argv[1]); Cleanup(); From 5a528bd57a5d3db1edd6bfe5fafcb4f130596470 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Wed, 7 Apr 2004 19:57:43 +0000 Subject: [PATCH 0777/1463] - Lock the surface even for GDI blits in IntEngBitBlt, because it mustn't be simulantously accessed. svn path=/trunk/; revision=9014 --- reactos/subsys/win32k/eng/bitblt.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/eng/bitblt.c b/reactos/subsys/win32k/eng/bitblt.c index 9921c45d832..3cb4cc7a173 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.46 2004/04/07 16:38:27 weiden Exp $ +/* $Id: bitblt.c,v 1.47 2004/04/07 19:57:43 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -571,9 +571,11 @@ IntEngBitBlt(SURFOBJ *DestObj, if (! ret) { + IntLockGDIDriver(DestGDI); ret = EngBitBlt(DestObj, SourceObj, Mask, ClipRegion, ColorTranslation, &OutputRect, &InputPoint, MaskOrigin, Brush, BrushOrigin, Rop4); + IntUnLockGDIDriver(DestGDI); } MouseSafetyOnDrawEnd(DestObj, DestGDI); From 578af8b93487d7e9337d526d66fc4a27e0b02ee2 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Wed, 7 Apr 2004 20:04:22 +0000 Subject: [PATCH 0778/1463] - Fixed a small and stupid bug. We were incrementing DestBits by sizeof(ULONG) instead of sizeof(BYTE). svn path=/trunk/; revision=9015 --- reactos/subsys/win32k/dib/dib4bpp.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib4bpp.c b/reactos/subsys/win32k/dib/dib4bpp.c index 6e5a337cb92..f715a44776c 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.29 2004/04/07 15:37:50 weiden Exp $ */ +/* $Id: dib4bpp.c,v 1.30 2004/04/07 20:04:22 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -321,8 +321,8 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, sx = SourcePoint->x; i = DestRect->left; - if(UsesPattern) - PatternY = j % PatternHeight; + if (UsesPattern) + PatternY = j % PatternHeight; if (i & 0x1) { @@ -342,7 +342,7 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, i++; sx++; - DestBits++; + DestBits = (PULONG)((ULONG_PTR)DestBits + 1); } for (; i < RoundedRight; i += 8, sx += 8, DestBits++) From 72776b9bcbe38db8fb900b2351afdd338f4e19c4 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Wed, 7 Apr 2004 20:23:38 +0000 Subject: [PATCH 0779/1463] - Fixed order of bits in a byte for pattern brushes. svn path=/trunk/; revision=9016 --- reactos/subsys/win32k/dib/dib4bpp.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib4bpp.c b/reactos/subsys/win32k/dib/dib4bpp.c index f715a44776c..80ee90b8bb7 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.30 2004/04/07 20:04:22 navaraf Exp $ */ +/* $Id: dib4bpp.c,v 1.31 2004/04/07 20:23:38 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -362,14 +362,14 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } if (UsesPattern) { - Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 1) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 4; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 2) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 8; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 3) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 12; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 4) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 16; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 5) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 20; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 6) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 24; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 7) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 28; + Pattern = DIB_1BPP_GetPixel(PatternObj, (i + 1) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 0) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 4; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 3) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 8; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 2) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 12; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 5) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 16; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 4) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 20; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 7) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 24; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 6) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 28; } *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); } From c3cb9779e329d8ea9435da74f80e3f32c1df495a Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Wed, 7 Apr 2004 20:41:31 +0000 Subject: [PATCH 0780/1463] Merge latest Wine commits: Juan Lang Use symbolic constants for magic numbers in SHGetFolderPathW, avoid doing MultiByteToWideChar on values that don't need it, Juan Lang Rename PT_MYCOMP to PT_GUID, and the corresponding union member from mycomp to guid. Martin Fuchs Resolve shell shortcuts and process ID lists in ShellExecute() functions. Juan Lang - comment fixes - improved error checking and conformance with Windows - remove some spurious error messages svn path=/trunk/; revision=9017 --- reactos/lib/shell32/cpanelfolder.c | 2 +- reactos/lib/shell32/debughlp.c | 14 +- reactos/lib/shell32/enumidlist.c | 10 +- reactos/lib/shell32/folders.c | 24 +- reactos/lib/shell32/pidl.c | 496 ++++++++++----------------- reactos/lib/shell32/pidl.h | 53 +-- reactos/lib/shell32/shelllink.c | 24 +- reactos/lib/shell32/shellpath.c | 223 +++++++++--- reactos/lib/shell32/shfldr_desktop.c | 7 +- reactos/lib/shell32/shfldr_mycomp.c | 8 +- reactos/lib/shell32/shlexec.c | 2 +- 11 files changed, 450 insertions(+), 413 deletions(-) diff --git a/reactos/lib/shell32/cpanelfolder.c b/reactos/lib/shell32/cpanelfolder.c index 0bf054b3101..e4531b5c9cb 100644 --- a/reactos/lib/shell32/cpanelfolder.c +++ b/reactos/lib/shell32/cpanelfolder.c @@ -131,7 +131,7 @@ HRESULT WINAPI IControlPanel_Constructor(IUnknown* pUnkOuter, REFIID riid, LPVOI sf->lpVtblPersistFolder2 = &vt_PersistFolder2; sf->lpVtblShellExecuteHookW = &vt_ShellExecuteHookW; sf->lpVtblShellExecuteHookA = &vt_ShellExecuteHookA; - sf->pidlRoot = _ILCreateControl(); /* my qualified pidl */ + sf->pidlRoot = _ILCreateControlPanel(); /* my qualified pidl */ sf->pUnkOuter = pUnkOuter ? pUnkOuter : _IUnknown_ (sf); if (!SUCCEEDED(IUnknown_QueryInterface(_IUnknown_(sf), riid, ppv))) { diff --git a/reactos/lib/shell32/debughlp.c b/reactos/lib/shell32/debughlp.c index 6f4d58725cc..2c3cb9d32cf 100644 --- a/reactos/lib/shell32/debughlp.c +++ b/reactos/lib/shell32/debughlp.c @@ -69,8 +69,8 @@ LPSTR _dbg_ILGetTextPointer(LPCITEMIDLIST pidl) { switch (pdata->type) { - case PT_MYCOMP: - case PT_SPECIAL: + case PT_GUID: + case PT_SHELLEXT: return NULL; case PT_DRIVE: @@ -128,9 +128,9 @@ REFIID _dbg_ILGetGUIDPointer(LPCITEMIDLIST pidl) { switch (pdata->type) { - case PT_SPECIAL: - case PT_MYCOMP: - return (REFIID) &(pdata->u.mycomp.guid); + case PT_SHELLEXT: + case PT_GUID: + return (REFIID) &(pdata->u.guid.guid); } } return NULL; @@ -230,8 +230,8 @@ BOOL pcheck (LPCITEMIDLIST pidl) { type = _dbg_ILGetDataPointer(pidltemp)->type; switch (type) { case PT_DESKTOP: - case PT_MYCOMP: - case PT_SPECIAL: + case PT_GUID: + case PT_SHELLEXT: case PT_DRIVE: case PT_DRIVE1: case PT_DRIVE2: diff --git a/reactos/lib/shell32/enumidlist.c b/reactos/lib/shell32/enumidlist.c index cb129f4dcf3..bb3b0529cd2 100644 --- a/reactos/lib/shell32/enumidlist.c +++ b/reactos/lib/shell32/enumidlist.c @@ -133,7 +133,7 @@ static BOOL CreateFolderEnumList( if( !(dwFlags & SHCONTF_INCLUDEHIDDEN) && (stffile.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) ) continue; if( (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strcmp (stffile.cFileName, ".") && strcmp (stffile.cFileName, "..")) { - pidl = _ILCreateFolder (&stffile); + pidl = _ILCreateFromFindDataA (&stffile); if(pidl && AddToEnumList((IEnumIDList*)This, pidl)) { continue; @@ -157,7 +157,7 @@ static BOOL CreateFolderEnumList( if( !(dwFlags & SHCONTF_INCLUDEHIDDEN) && (stffile.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) ) continue; if(! (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) { - pidl = _ILCreateValue(&stffile); + pidl = _ILCreateFromFindDataA(&stffile); if(pidl && AddToEnumList((IEnumIDList*)This, pidl)) { continue; @@ -259,7 +259,7 @@ int SHELL_RegisterCPanelFolders(IEnumIDList* list, HKEY hkey_root, LPCSTR szRepP break; if (*name == '{') { - LPITEMIDLIST pidl = _ILCreateSpecial(name); + LPITEMIDLIST pidl = _ILCreateGuidFromStrA(name); if (pidl && AddToEnumList(list, pidl)) ++cnt; @@ -364,7 +364,7 @@ static BOOL CreateDesktopEnumList( if(ERROR_SUCCESS!=RegEnumKeyExA(hkey, i, iid, &size, 0, NULL, NULL, NULL)) break; - pidl = _ILCreateSpecial(iid); + pidl = _ILCreateGuidFromStrA(iid); if(pidl) AddToEnumList((IEnumIDList*)This, pidl); @@ -435,7 +435,7 @@ static BOOL CreateMyCompEnumList( if(ERROR_SUCCESS!=RegEnumKeyExA(hkey, i, iid, &size, 0, NULL, NULL, NULL)) break; - pidl = _ILCreateSpecial(iid); + pidl = _ILCreateGuidFromStrA(iid); if(pidl) AddToEnumList((IEnumIDList*)This, pidl); diff --git a/reactos/lib/shell32/folders.c b/reactos/lib/shell32/folders.c index ca3f3e3f1f6..87bfa6c08bb 100644 --- a/reactos/lib/shell32/folders.c +++ b/reactos/lib/shell32/folders.c @@ -186,16 +186,19 @@ static HRESULT WINAPI IExtractIconW_fnGetIconLocation( /* my computer and other shell extensions */ else if ((riid = _ILGetGUIDPointer(pSimplePidl))) { - char xriid[50]; + static WCHAR fmt[] = { 'C','L','S','I','D','\\','{','%','0','8','l','x', + '-','%','0','4','x','-','%','0','4','x','-','%','0','2','x', + '%','0','2','x','-','%','0','2','x', '%','0','2','x', '%','0','2','x', + '%','0','2','x','%','0','2','x','%','0','2','x','}',0 }; + WCHAR xriid[50]; - sprintf(xriid, "CLSID\\{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", + sprintfW(xriid, fmt, riid->Data1, riid->Data2, riid->Data3, riid->Data4[0], riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4], riid->Data4[5], riid->Data4[6], riid->Data4[7]); - if (HCR_GetDefaultIconA(xriid, sTemp, MAX_PATH, &dwNr)) + if (HCR_GetDefaultIconW(xriid, szIconFile, cchMax, &dwNr)) { - MultiByteToWideChar(CP_ACP, 0, sTemp, -1, szIconFile, cchMax); *piIndex = dwNr; } else @@ -207,9 +210,10 @@ static HRESULT WINAPI IExtractIconW_fnGetIconLocation( else if (_ILIsDrive (pSimplePidl)) { - if (HCR_GetDefaultIconA("Drive", sTemp, MAX_PATH, &dwNr)) + static WCHAR drive[] = { 'D','r','i','v','e',0 }; + + if (HCR_GetDefaultIconW(drive, szIconFile, cchMax, &dwNr)) { - MultiByteToWideChar(CP_ACP, 0, sTemp, -1, szIconFile, cchMax); *piIndex = dwNr; } else @@ -221,11 +225,9 @@ static HRESULT WINAPI IExtractIconW_fnGetIconLocation( else if (_ILIsFolder (pSimplePidl)) { - if (HCR_GetDefaultIconA("Folder", sTemp, MAX_PATH, &dwNr)) - { - MultiByteToWideChar(CP_ACP, 0, sTemp, -1, szIconFile, cchMax); - } - else + static WCHAR folder[] = { 'F','o','l','d','e','r',0 }; + + if (!HCR_GetDefaultIconW(folder, szIconFile, cchMax, &dwNr)) { lstrcpynW(szIconFile, swShell32Name, cchMax); dwNr = 3; diff --git a/reactos/lib/shell32/pidl.c b/reactos/lib/shell32/pidl.c index 498c6b3a790..cd703cfa7ff 100644 --- a/reactos/lib/shell32/pidl.c +++ b/reactos/lib/shell32/pidl.c @@ -278,6 +278,7 @@ HRESULT WINAPI ILLoadFromStream (IStream * pStream, LPITEMIDLIST * ppPidl) DWORD dwBytesRead; HRESULT ret = E_FAIL; + TRACE_(shell)("%p %p\n", pStream , ppPidl); if (*ppPidl) @@ -699,7 +700,7 @@ LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) * * NOTES */ -HRESULT WINAPI SHGetRealIDL(LPSHELLFOLDER lpsf, LPCITEMIDLIST pidlSimple, LPITEMIDLIST* pidlReal) +HRESULT WINAPI SHGetRealIDL(LPSHELLFOLDER lpsf, LPCITEMIDLIST pidlSimple, LPITEMIDLIST *pidlReal) { IDataObject* pDataObj; HRESULT hr = IShellFolder_GetUIObjectOf(lpsf, 0, 1, &pidlSimple, &IID_IDataObject, 0, (LPVOID*)&pDataObj); @@ -1078,98 +1079,6 @@ LPITEMIDLIST WINAPI SHSimpleIDListFromPathAW(LPCVOID lpszPath) return SHSimpleIDListFromPathA (lpszPath); } -/************************************************************************* - * SHGetSpecialFolderLocation [SHELL32.@] - * - * gets the folder locations from the registry and creates a pidl - * creates missing reg keys and directories - * - * PARAMS - * hwndOwner [I] - * nFolder [I] CSIDL_xxxxx - * ppidl [O] PIDL of a special folder - * - * NOTES - * In NT5, SHGetSpecialFolderLocation needs the /Recent - * directory. If the directory is missing it returns a x80070002. - */ -HRESULT WINAPI SHGetSpecialFolderLocation( - HWND hwndOwner, - INT nFolder, - LPITEMIDLIST * ppidl) -{ - CHAR szPath[MAX_PATH]; - HRESULT hr = E_INVALIDARG; - - TRACE_(shell)("(%p,0x%x,%p)\n", hwndOwner,nFolder,ppidl); - - if (ppidl) - { - *ppidl = NULL; - switch (nFolder) - { - case CSIDL_DESKTOP: - *ppidl = _ILCreateDesktop(); - break; - - case CSIDL_DRIVES: - *ppidl = _ILCreateMyComputer(); - break; - - case CSIDL_NETWORK: - *ppidl = _ILCreateNetwork (); - break; - - case CSIDL_CONTROLS: - *ppidl = _ILCreateControl (); - break; - - case CSIDL_FONTS: - FIXME("virtual font folder"); - break; - - case CSIDL_PRINTERS: - *ppidl = _ILCreatePrinter (); - break; - - case CSIDL_BITBUCKET: - *ppidl = _ILCreateBitBucket (); - break; - - default: - if (SHGetSpecialFolderPathA(hwndOwner, szPath, nFolder, TRUE)) - { - DWORD attributes=0; - TRACE_(shell)("Value=%s\n",szPath); - hr = SHILCreateFromPathA(szPath, ppidl, &attributes); - } - } - if(*ppidl) hr = NOERROR; - } - - TRACE_(shell)("-- (new pidl %p)\n",*ppidl); - return hr; -} - -/************************************************************************* - * SHGetFolderLocation [SHELL32.@] - * - * NOTES - * the pidl can be a simple one. since we can't get the path out of the pidl - * we have to take all data from the pidl - */ -HRESULT WINAPI SHGetFolderLocation( - HWND hwnd, - int csidl, - HANDLE hToken, - DWORD dwFlags, - LPITEMIDLIST *ppidl) -{ - FIXME("%p 0x%08x %p 0x%08lx %p\n", - hwnd, csidl, hToken, dwFlags, ppidl); - return SHGetSpecialFolderLocation(hwnd, csidl, ppidl); -} - /************************************************************************* * SHGetDataFromIDListA [SHELL32.247] * @@ -1288,18 +1197,16 @@ HRESULT WINAPI SHGetDataFromIDListW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, int n */ HRESULT SHELL_GetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath, UINT uOutSize) { - LPSTR pstr = pszPath; - LPSTR end = pszPath + uOutSize; HRESULT hr = S_OK; - pszPath[0] = '\0'; + pszPath[0]=0; /* One case is a PIDL rooted at desktop level */ if (_ILIsValue(pidl) || _ILIsFolder(pidl)) { - hr = SHGetSpecialFolderPathA(0, pstr, CSIDL_DESKTOP, FALSE); + hr = SHGetSpecialFolderPathA(0, pszPath, CSIDL_DESKTOP, FALSE); if (SUCCEEDED(hr)) - pstr = PathAddBackslashA(pstr); + PathAddBackslashA(pszPath); } /* The only other valid case is a item ID list beginning at "My Computer" */ else if (_ILIsMyComputer(pidl)) @@ -1308,7 +1215,7 @@ HRESULT SHELL_GetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath, UINT uOutSiz if (SUCCEEDED(hr)) { LPSTR txt; - while(pidl && pidl->mkid.cb && pstrmkid.cb) { if (_ILIsSpecialFolder(pidl)) {hr = E_INVALIDARG; break;} @@ -1316,11 +1223,13 @@ HRESULT SHELL_GetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath, UINT uOutSiz if (!txt) {hr = E_INVALIDARG; break;} - /* make sure there's enough space for the next segment */ - if (pstr+lstrlenA(txt) >= end) - {hr = E_INVALIDARG; break;} + if (lstrlenA(txt) > pidl->mkid.cb) + ERR("pidl %p is borked\n",pidl); - lstrcpynA(pstr, txt, end-pstr); + /* make sure there's enough space for the next segment */ + if ( (lstrlenA(txt) + lstrlenA(pszPath)) > uOutSize) + {hr = E_INVALIDARG; break;} + lstrcatA( pszPath, txt ); pidl = ILGetNext(pidl); if (!pidl) @@ -1331,11 +1240,9 @@ HRESULT SHELL_GetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath, UINT uOutSiz break; } - if (pstr+1 >= end) + if( (lstrlenA(pszPath) + 1) > uOutSize) {hr = E_INVALIDARG; break;} - - pstr = PathAddBackslashA(pstr); - if (!pstr) + if (!PathAddBackslashA(pszPath)) {hr = E_INVALIDARG; break;} } } else @@ -1380,18 +1287,17 @@ BOOL WINAPI SHGetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath) */ HRESULT SHELL_GetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSize) { - LPWSTR pstr = pszPath; - LPWSTR end = pszPath + uOutSize; HRESULT hr = S_OK; + UINT len; - pszPath[0] = '\0'; + pszPath[0]=0; /* One case is a PIDL rooted at desktop level */ if (_ILIsValue(pidl) || _ILIsFolder(pidl)) { - hr = SHGetSpecialFolderPathW(0, pstr, CSIDL_DESKTOP, FALSE); + hr = SHGetSpecialFolderPathW(0, pszPath, CSIDL_DESKTOP, FALSE); if (SUCCEEDED(hr)) - pstr = PathAddBackslashW(pstr); + PathAddBackslashW(pszPath); } /* The only other valid case is a item ID list beginning at "My Computer" */ else if (_ILIsMyComputer(pidl)) @@ -1400,7 +1306,7 @@ HRESULT SHELL_GetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSi if (SUCCEEDED(hr)) { LPSTR txt; - while(pidl && pidl->mkid.cb && pstrmkid.cb) { if (_ILIsSpecialFolder(pidl)) {hr = E_INVALIDARG; break;} @@ -1408,12 +1314,14 @@ HRESULT SHELL_GetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSi if (!txt) {hr = E_INVALIDARG; break;} - /* make sure there's enough space for the next segment */ - if (pstr+lstrlenA(txt) >= end) + if (lstrlenA(txt) > pidl->mkid.cb) + ERR("pidl %p is borked\n",pidl); + len = MultiByteToWideChar(CP_ACP, 0, txt, -1, NULL, 0); + if ( (lstrlenW(pszPath) + len) > uOutSize ) {hr = E_INVALIDARG; break;} - if (!MultiByteToWideChar(CP_ACP, 0, txt, -1, pstr, uOutSize)) - {hr = E_OUTOFMEMORY; break;} + MultiByteToWideChar(CP_ACP, 0, txt, -1, + &pszPath[lstrlenW(pszPath)], len); pidl = ILGetNext(pidl); if (!pidl) @@ -1424,11 +1332,9 @@ HRESULT SHELL_GetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSi break; } - if (pstr+1 >= end) + if ( (lstrlenW(pszPath) + 1) > uOutSize ) {hr = E_INVALIDARG; break;} - - pstr = PathAddBackslashW(pstr); - if (!pstr) + if (!PathAddBackslashW(pszPath)) {hr = E_INVALIDARG; break;} } } else @@ -1466,7 +1372,6 @@ BOOL WINAPI SHGetPathFromIDListAW(LPCITEMIDLIST pidl,LPVOID pszPath) if (SHELL_OsIsUnicode()) return SHGetPathFromIDListW(pidl,pszPath); - return SHGetPathFromIDListA(pidl,pszPath); } @@ -1519,11 +1424,10 @@ HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCI ILFree (pidlChild); SHFree (pidlParent); - - if (psf) - IShellFolder_Release(psf); + if (psf) IShellFolder_Release(psf); } + TRACE_(shell)("-- psf=%p pidl=%p ret=0x%08lx\n", *ppv, (ppidlLast)?*ppidlLast:NULL, hr); return hr; } @@ -1535,119 +1439,169 @@ HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCI * ### 1. section creating pidls ### * ************************************************************************* - * _ILCreateDesktop() - * _ILCreateIExplore() - * _ILCreateMyComputer() - * _ILCreateDrive() - * _ILCreateFolder() - * _ILCreateValue() */ LPITEMIDLIST _ILCreateDesktop() { TRACE("()\n"); - return _ILCreate(PT_DESKTOP, NULL, 0); + return _ILCreateWithTypeAndSize(PT_DESKTOP, 0); } LPITEMIDLIST _ILCreateMyComputer() { TRACE("()\n"); - return _ILCreate(PT_MYCOMP, &CLSID_MyComputer, sizeof(GUID)); + return _ILCreateGuid(PT_GUID, &CLSID_MyComputer); } LPITEMIDLIST _ILCreateIExplore() { TRACE("()\n"); - return _ILCreate(PT_MYCOMP, &CLSID_Internet, sizeof(GUID)); + return _ILCreateGuid(PT_GUID, &CLSID_Internet); } -LPITEMIDLIST _ILCreateControl() -{ TRACE("()\n"); - return _ILCreate(PT_SPECIAL, &CLSID_ControlPanel, sizeof(GUID)); +LPITEMIDLIST _ILCreateControlPanel() +{ + LPITEMIDLIST parent = _ILCreateGuid(PT_GUID, &CLSID_MyComputer), ret = NULL; + + TRACE("()\n"); + if (parent) + { + LPITEMIDLIST cpl = _ILCreateGuid(PT_GUID, &CLSID_ControlPanel); + + if (cpl) + { + ret = ILCombine(parent, cpl); + SHFree(cpl); + } + SHFree(parent); + } + return ret; } -LPITEMIDLIST _ILCreatePrinter() -{ TRACE("()\n"); - return _ILCreate(PT_SPECIAL, &CLSID_Printers, sizeof(GUID)); +LPITEMIDLIST _ILCreatePrinters() +{ + LPITEMIDLIST parent = _ILCreateGuid(PT_GUID, &CLSID_MyComputer), ret = NULL; + + TRACE("()\n"); + if (parent) + { + LPITEMIDLIST printers = _ILCreateGuid(PT_GUID, &CLSID_ControlPanel); + + if (printers) + { + ret = ILCombine(parent, printers); + SHFree(printers); + } + SHFree(parent); + } + return ret; } LPITEMIDLIST _ILCreateNetwork() { TRACE("()\n"); - return _ILCreate(PT_MYCOMP, &CLSID_NetworkPlaces, sizeof(GUID)); + return _ILCreateGuid(PT_GUID, &CLSID_NetworkPlaces); } LPITEMIDLIST _ILCreateBitBucket() { TRACE("()\n"); - return _ILCreate(PT_MYCOMP, &CLSID_RecycleBin, sizeof(GUID)); + return _ILCreateGuid(PT_GUID, &CLSID_RecycleBin); } -LPITEMIDLIST _ILCreateDrive( LPCSTR lpszNew) -{ char sTemp[4]; - lstrcpynA (sTemp,lpszNew,4); - sTemp[2]='\\'; - sTemp[3]=0x00; - TRACE("(%s)\n",sTemp); - return _ILCreate(PT_DRIVE,(LPVOID)&sTemp[0],4); -} - -LPITEMIDLIST _ILCreateFolder( WIN32_FIND_DATAA * stffile ) +LPITEMIDLIST _ILCreateGuid(PIDLTYPE type, REFIID guid) { - char buff[MAX_PATH + 14 +1]; /* see WIN32_FIND_DATA */ - char * pbuff = buff; - ULONG len, len1; - LPITEMIDLIST pidl; + LPITEMIDLIST pidlOut; - TRACE("(%s, %s)\n",stffile->cAlternateFileName, stffile->cFileName); + if (type == PT_SHELLEXT || type == PT_GUID) + { + pidlOut = _ILCreateWithTypeAndSize(type, 2 + 2 + sizeof(GUID)); + if (pidlOut) + { + LPPIDLDATA pData = _ILGetDataPointer(pidlOut); - /* prepare buffer with both names */ - len = strlen (stffile->cFileName) + 1; - memcpy (pbuff, stffile->cFileName, len); - pbuff += len; + memcpy(&(pData->u.guid.guid), guid, sizeof(GUID)); + TRACE("-- create GUID-pidl %s\n", + debugstr_guid(&(pData->u.guid.guid))); + } + } + else + { + WARN("%d: invalid type for GUID\n", type); + pidlOut = NULL; + } + return pidlOut; +} + +LPITEMIDLIST _ILCreateGuidFromStrA(LPCSTR szGUID) +{ + IID iid; + + if (!SUCCEEDED(SHCLSIDFromStringA(szGUID, &iid))) + { + ERR("%s is not a GUID\n", szGUID); + return NULL; + } + return _ILCreateGuid(PT_GUID, &iid); +} + +LPITEMIDLIST _ILCreateWithTypeAndSize(PIDLTYPE type, UINT size) +{ + LPITEMIDLIST pidlOut = NULL, pidlTemp = NULL; + LPPIDLDATA pData; + + if(!(pidlOut = SHAlloc(size + 2))) return NULL; + ZeroMemory(pidlOut, size + 2); + pidlOut->mkid.cb = size; + + if ((pData = _ILGetDataPointer(pidlOut))) + pData->type = type; + + if ((pidlTemp = ILGetNext(pidlOut))) + pidlTemp->mkid.cb = 0x00; + + TRACE("-- (pidl=%p, size=%u)\n", pidlOut, size); + return pidlOut; +} + +LPITEMIDLIST _ILCreateFromFindDataA(WIN32_FIND_DATAA * stffile ) +{ + char buff[MAX_PATH + 14 +1]; /* see WIN32_FIND_DATA */ + char * pbuff = buff; + ULONG len, len1; + LPITEMIDLIST pidl; + PIDLTYPE type; + + if (!stffile) + return NULL; + + TRACE("(%s, %s)\n",stffile->cAlternateFileName, stffile->cFileName); + + /* prepare buffer with both names */ + len = strlen (stffile->cFileName) + 1; + memcpy (pbuff, stffile->cFileName, len); + pbuff += len; len1 = strlen (stffile->cAlternateFileName)+1; memcpy (pbuff, stffile->cAlternateFileName, len1); - pidl = _ILCreate(PT_FOLDER, (LPVOID)buff, len + len1); + type = (stffile->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? PT_FOLDER : + PT_VALUE; + /* FIXME: magic #s! */ + if ((pidl = _ILCreateWithTypeAndSize(type, 2 + 12 + len + len1))) + { + LPPIDLDATA pData; + LPSTR pszDest; - /* set attributes */ - if (pidl) - { - LPPIDLDATA pData; - pData = _ILGetDataPointer(pidl); - FileTimeToDosDateTime(&(stffile->ftLastWriteTime),&pData->u.folder.uFileDate,&pData->u.folder.uFileTime); - pData->u.folder.dwFileSize = stffile->nFileSizeLow; - pData->u.folder.uFileAttribs = (WORD)stffile->dwFileAttributes; - } - - return pidl; -} - -LPITEMIDLIST _ILCreateValue(WIN32_FIND_DATAA * stffile) -{ - char buff[MAX_PATH + 14 +1]; /* see WIN32_FIND_DATA */ - char * pbuff = buff; - ULONG len, len1; - LPITEMIDLIST pidl; - - TRACE("(%s, %s)\n",stffile->cAlternateFileName, stffile->cFileName); - - /* prepare buffer with both names */ - len = strlen (stffile->cFileName) + 1; - memcpy (pbuff, stffile->cFileName, len); - pbuff += len; - - len1 = strlen (stffile->cAlternateFileName)+1; - memcpy (pbuff, stffile->cAlternateFileName, len1); - - pidl = _ILCreate(PT_VALUE, (LPVOID)buff, len + len1); - - /* set attributes */ - if (pidl) - { - LPPIDLDATA pData; - pData = _ILGetDataPointer(pidl); - FileTimeToDosDateTime(&(stffile->ftLastWriteTime),&pData->u.folder.uFileDate,&pData->u.folder.uFileTime); - pData->u.folder.dwFileSize = stffile->nFileSizeLow; - pData->u.folder.uFileAttribs = (WORD)stffile->dwFileAttributes; - } - - return pidl; + /* set attributes */ + if ((pData = _ILGetDataPointer(pidl))) + { + pData->type = type; + FileTimeToDosDateTime(&(stffile->ftLastWriteTime),&pData->u.folder.uFileDate,&pData->u.folder.uFileTime); + pData->u.folder.dwFileSize = stffile->nFileSizeLow; + pData->u.folder.uFileAttribs = (WORD)stffile->dwFileAttributes; + } + if ((pszDest = _ILGetTextPointer(pidl))) + { + memcpy(pszDest, buff, len + len1); + TRACE("-- create Value: %s\n",debugstr_a(pszDest)); + } + } + return pidl; } LPITEMIDLIST _ILCreateFromPathA(LPCSTR szPath) @@ -1659,25 +1613,35 @@ LPITEMIDLIST _ILCreateFromPathA(LPCSTR szPath) hFile = FindFirstFileA(szPath, &stffile); if (hFile != INVALID_HANDLE_VALUE) { - if (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - pidl = _ILCreateFolder(&stffile); - else - pidl = _ILCreateValue(&stffile); + pidl = _ILCreateFromFindDataA(&stffile); FindClose(hFile); } return pidl; } -LPITEMIDLIST _ILCreateSpecial(LPCSTR szGUID) +LPITEMIDLIST _ILCreateDrive( LPCSTR lpszNew) { - IID iid; + char sTemp[4]; + LPITEMIDLIST pidlOut; - if (!SUCCEEDED(SHCLSIDFromStringA(szGUID, &iid))) - { - ERR("%s is not a GUID\n", szGUID); - return NULL; - } - return _ILCreate(PT_MYCOMP, &iid, sizeof(IID)); + sTemp[0]=lpszNew[0]; + sTemp[1]=':'; + sTemp[2]='\\'; + sTemp[3]=0x00; + TRACE("(%s)\n",sTemp); + + /* FIXME: magic #s! */ + if ((pidlOut = _ILCreateWithTypeAndSize(PT_DRIVE, 25))) + { + LPSTR pszDest; + + if ((pszDest = _ILGetTextPointer(pidlOut))) + { + memcpy(pszDest, sTemp, sizeof(sTemp)); + TRACE("-- create Drive: %s\n", debugstr_a(pszDest)); + } + } + return pidlOut; } LPITEMIDLIST _ILCreateCPanel(LPCSTR name, LPCSTR displayName, LPCSTR comment, int iconIdx) @@ -1723,88 +1687,6 @@ LPITEMIDLIST _ILCreateCPanel(LPCSTR name, LPCSTR displayName, LPCSTR comment, in return pidl; } -/************************************************************************** - * _ILCreate() - * Creates a new PIDL - * type = PT_DESKTOP | PT_DRIVE | PT_FOLDER | PT_VALUE - * pIn = data - * uInSize = size of data (raw) - */ - -LPITEMIDLIST _ILCreate(PIDLTYPE type, LPCVOID pIn, UINT uInSize) -{ - LPITEMIDLIST pidlOut = NULL, pidlTemp = NULL; - LPPIDLDATA pData; - UINT uSize = 0; - LPSTR pszDest; - - TRACE("(0x%02x %p %i)\n",type,pIn,uInSize); - - switch (type) - { - case PT_DESKTOP: - uSize = 0; - break; - case PT_SPECIAL: - case PT_MYCOMP: - uSize = 2 + 2 + sizeof(GUID); - break; - case PT_DRIVE: - uSize = 2 + 23; - break; - case PT_FOLDER: - case PT_VALUE: - uSize = 2 + 12 + uInSize; - break; - default: - FIXME("can't create type: 0x%08x\n",type); - return NULL; - } - - if(!(pidlOut = SHAlloc(uSize + 2))) return NULL; - ZeroMemory(pidlOut, uSize + 2); - pidlOut->mkid.cb = uSize; - - switch (type) - { - case PT_DESKTOP: - TRACE("- create Desktop\n"); - break; - - case PT_SPECIAL: - case PT_MYCOMP: - pData = _ILGetDataPointer(pidlOut); - pData->type = type; - memcpy(&(pData->u.mycomp.guid), pIn, uInSize); - TRACE("-- create GUID-pidl %s\n", debugstr_guid(&(pData->u.mycomp.guid))); - break; - - case PT_DRIVE: - pData = _ILGetDataPointer(pidlOut); - pData->type = type; - pszDest = _ILGetTextPointer(pidlOut); - memcpy(pszDest, pIn, uInSize); - TRACE("-- create Drive: %s\n",debugstr_a(pszDest)); - break; - - case PT_FOLDER: - case PT_VALUE: - pData = _ILGetDataPointer(pidlOut); - pData->type = type; - pszDest = _ILGetTextPointer(pidlOut); - memcpy(pszDest, pIn, uInSize); - TRACE("-- create Value: %s\n",debugstr_a(pszDest)); - break; - } - - pidlTemp = ILGetNext(pidlOut); - if (pidlTemp) - pidlTemp->mkid.cb = 0x00; - - TRACE("-- (pidl=%p, size=%u)\n", pidlOut, uSize); - return pidlOut; -} - /************************************************************************** * _ILGetDrive() * @@ -1858,7 +1740,7 @@ BOOL _ILIsSpecialFolder (LPCITEMIDLIST pidl) { LPPIDLDATA lpPData = _ILGetDataPointer(pidl); TRACE("(%p)\n",pidl); - return (pidl && ( (lpPData && (PT_MYCOMP== lpPData->type || PT_SPECIAL== lpPData->type)) || + return (pidl && ( (lpPData && (PT_GUID== lpPData->type || PT_SHELLEXT== lpPData->type)) || (pidl && pidl->mkid.cb == 0x00) )); } @@ -2024,8 +1906,8 @@ LPSTR _ILGetTextPointer(LPCITEMIDLIST pidl) { switch (pdata->type) { - case PT_MYCOMP: - case PT_SPECIAL: + case PT_GUID: + case PT_SHELLEXT: return NULL; case PT_DRIVE: @@ -2060,7 +1942,7 @@ LPSTR _ILGetTextPointer(LPCITEMIDLIST pidl) LPSTR _ILGetSTextPointer(LPCITEMIDLIST pidl) {/* TRACE(pidl,"(pidl%p)\n", pidl);*/ - LPPIDLDATA pdata = _ILGetDataPointer(pidl); + LPPIDLDATA pdata =_ILGetDataPointer(pidl); if (pdata) { @@ -2087,7 +1969,7 @@ LPSTR _ILGetSTextPointer(LPCITEMIDLIST pidl) */ REFIID _ILGetGUIDPointer(LPCITEMIDLIST pidl) { - LPPIDLDATA pdata = _ILGetDataPointer(pidl); + LPPIDLDATA pdata =_ILGetDataPointer(pidl); TRACE("%p\n", pidl); @@ -2096,9 +1978,9 @@ REFIID _ILGetGUIDPointer(LPCITEMIDLIST pidl) TRACE("pdata->type 0x%04x\n", pdata->type); switch (pdata->type) { - case PT_SPECIAL: - case PT_MYCOMP: - return (REFIID) &(pdata->u.mycomp.guid); + case PT_SHELLEXT: + case PT_GUID: + return (REFIID) &(pdata->u.guid.guid); default: TRACE("Unknown pidl type 0x%04x\n", pdata->type); diff --git a/reactos/lib/shell32/pidl.h b/reactos/lib/shell32/pidl.h index 0b73bc0b6be..7a2456ecb2b 100644 --- a/reactos/lib/shell32/pidl.h +++ b/reactos/lib/shell32/pidl.h @@ -53,13 +53,13 @@ * object ! first byte / ! format ! living space * ! size * ---------------------------------------------------------------- -* my computer 0x1F/20 mycomp (2) (usual) -* network 0x1F mycomp -* bitbucket 0x1F mycomp +* my computer 0x1F/20 guid (2) (usual) +* network 0x1F guid +* bitbucket 0x1F guid * drive 0x23/25 drive (usual) * drive 0x25/25 drive (lnk/persistent) * drive 0x29/25 drive -* shell extension 0x2E mycomp +* shell extension 0x2E guid * drive 0x2F drive (lnk/persistent) * folder/file 0x30 folder/file (1) (lnk/persistent) * folder 0x31 folder (usual) @@ -77,20 +77,20 @@ * * (1) dummy byte is used, attributes are empty * (2) IID_MyComputer = 20D04FE0L-3AEA-1069-A2D8-08002B30309D -* (3) two strings "workgroup" "microsoft network" -* (4) one string "\\sirius" -* (5) one string "whole network" -* (6) one string "\\sirius\c" +* (3) two strings "workgroup" "Microsoft Network" +* (4) two strings "\\sirius" "Microsoft Network" +* (5) one string "Entire Network" +* (6) two strings "\\sirius\c" "Microsoft Network" * (7) contains string "mk:@MSITStore:C:\path\file.chm::/path/filename.htm" * GUID 871C5380-42A0-1069-A2EA-08002B30309D */ #define PT_DESKTOP 0x00 /* internal */ -#define PT_MYCOMP 0x1F +#define PT_GUID 0x1F #define PT_DRIVE 0x23 #define PT_DRIVE2 0x25 #define PT_DRIVE3 0x29 -#define PT_SPECIAL 0x2E +#define PT_SHELLEXT 0x2E #define PT_DRIVE1 0x2F #define PT_FOLDER1 0x30 #define PT_FOLDER 0x31 @@ -123,7 +123,7 @@ typedef struct tagPIDLDATA { BYTE dummy; /*01*/ GUID guid; /*02*/ BYTE dummy1; /*18*/ - } mycomp; + } guid; struct { CHAR szDriveName[20]; /*01*/ DWORD dwUnknown; /*21*/ @@ -136,7 +136,7 @@ typedef struct tagPIDLDATA WORD uFileTime; /*08*/ WORD uFileAttribs; /*10*/ CHAR szNames[1]; /*12*/ - /* Here are comming two strings. The first is the long name. + /* Here are coming two strings. The first is the long name. The second the dos name when needed or just 0x00 */ } file, folder, generic; struct @@ -180,22 +180,35 @@ BOOL _ILIsPidlSimple (LPCITEMIDLIST pidl); BOOL _ILIsCPanelStruct (LPCITEMIDLIST pidl); /* - * simple pidls from strings + * simple pidls */ -LPITEMIDLIST _ILCreate (PIDLTYPE,LPCVOID,UINT); +/* Basic PIDL constructor. Allocates size + 2 bytes (to include space for the + * NULL PIDL terminator), and sets type to type. + */ +LPITEMIDLIST _ILCreateWithTypeAndSize(PIDLTYPE type, UINT size); + +/* Creates a PIDL with guid format and type type, which must be either PT_GUID + * or PT_SHELLEXT. + */ +LPITEMIDLIST _ILCreateGuid(PIDLTYPE type, REFIID guid); + +/* Like _ILCreateGuid, but using the string szGUID. */ +LPITEMIDLIST _ILCreateGuidFromStrA(LPCSTR szGUID); + +/* Commonly used PIDLs representing file system objects. */ LPITEMIDLIST _ILCreateDesktop (void); +LPITEMIDLIST _ILCreateFromFindDataA(WIN32_FIND_DATAA *stffile); +LPITEMIDLIST _ILCreateFromPathA (LPCSTR szPath); + +/* Other helpers */ LPITEMIDLIST _ILCreateMyComputer (void); LPITEMIDLIST _ILCreateIExplore (void); -LPITEMIDLIST _ILCreateControl (void); -LPITEMIDLIST _ILCreatePrinter (void); +LPITEMIDLIST _ILCreateControlPanel (void); +LPITEMIDLIST _ILCreatePrinters (void); LPITEMIDLIST _ILCreateNetwork (void); LPITEMIDLIST _ILCreateBitBucket (void); LPITEMIDLIST _ILCreateDrive (LPCSTR); -LPITEMIDLIST _ILCreateFolder (WIN32_FIND_DATAA * stffile); -LPITEMIDLIST _ILCreateValue (WIN32_FIND_DATAA * stffile); -LPITEMIDLIST _ILCreateSpecial (LPCSTR szGUID); -LPITEMIDLIST _ILCreateFromPathA (LPCSTR szPath); LPITEMIDLIST _ILCreateCPanel (LPCSTR name, LPCSTR displayName, LPCSTR comment, int iconIdx); /* diff --git a/reactos/lib/shell32/shelllink.c b/reactos/lib/shell32/shelllink.c index 4f1a43e6aed..7a0503d1f56 100644 --- a/reactos/lib/shell32/shelllink.c +++ b/reactos/lib/shell32/shelllink.c @@ -24,6 +24,7 @@ */ #include "config.h" +#include "wine/port.h" #include #include @@ -38,7 +39,6 @@ # include #endif #include "wine/debug.h" -#include "wine/port.h" #include "winerror.h" #include "windef.h" #include "winbase.h" @@ -135,14 +135,14 @@ typedef struct SYSTEMTIME time2; SYSTEMTIME time3; - DWORD iShowCmd; - LPWSTR sIcoPath; - INT iIcoNdx; - LPWSTR sPath; - LPWSTR sArgs; - LPWSTR sWorkDir; - LPWSTR sDescription; - LPWSTR sPathRel; + DWORD iShowCmd; + LPWSTR sIcoPath; + INT iIcoNdx; + LPWSTR sPath; + LPWSTR sArgs; + LPWSTR sWorkDir; + LPWSTR sDescription; + LPWSTR sPathRel; BOOL bDirty; } IShellLinkImpl; @@ -303,7 +303,7 @@ static HRESULT WINAPI IPersistFile_fnSave(IPersistFile* iface, LPCOLESTR pszFile This->bDirty = FALSE; } - else + else { DeleteFileW( pszFileName ); WARN("Failed to create shortcut %s\n", debugstr_w(pszFileName) ); @@ -1808,10 +1808,10 @@ static HRESULT WINAPI IShellLinkW_fnSetPath(IShellLinkW * iface, LPCWSTR pszFile This->sPath = HeapAlloc( GetProcessHeap(), 0, (lstrlenW( buffer )+1) * sizeof (WCHAR) ); - if ( !This->sPath ) + if (!This->sPath) return E_OUTOFMEMORY; - lstrcpyW( This->sPath, buffer ); + lstrcpyW(This->sPath, buffer); This->bDirty = TRUE; return S_OK; diff --git a/reactos/lib/shell32/shellpath.c b/reactos/lib/shell32/shellpath.c index c1912ccce58..1de67af0c86 100644 --- a/reactos/lib/shell32/shellpath.c +++ b/reactos/lib/shell32/shellpath.c @@ -40,6 +40,7 @@ #include "shlobj.h" #include "shell32_main.h" #include "undocshell.h" +#include "pidl.h" #include "wine/unicode.h" #include "shlwapi.h" @@ -714,6 +715,10 @@ typedef struct #define HKLM HKEY_LOCAL_MACHINE #define HKCU HKEY_CURRENT_USER +#define HKEY_DISALLOWED (HKEY)0 +#define HKEY_UNIMPLEMENTED (HKEY)1 +#define HKEY_WINDOWSPATH (HKEY)2 +#define HKEY_NONEXISTENT (HKEY)3 static const CSIDL_DATA CSIDL_Data[] = { { /* CSIDL_DESKTOP */ @@ -722,14 +727,14 @@ static const CSIDL_DATA CSIDL_Data[] = "Desktop" }, { /* CSIDL_INTERNET */ - 0, (HKEY)1, /* FIXME */ + 0, HKEY_DISALLOWED, NULL, NULL, }, { /* CSIDL_PROGRAMS */ - 9, HKCU, - "Programs", - "Start Menu\\Programs" + 0, HKEY_DISALLOWED, + NULL, + NULL, }, { /* CSIDL_CONTROLS (.CPL files) */ 10, HKLM, @@ -767,9 +772,9 @@ static const CSIDL_DATA CSIDL_Data[] = "SendTo" }, { /* CSIDL_BITBUCKET - Recycle Bin */ - 0, (HKEY)1, /* FIXME */ + 0, HKEY_DISALLOWED, + NULL, NULL, - "recycled" }, { /* CSIDL_STARTMENU */ 9, HKCU, @@ -777,7 +782,7 @@ static const CSIDL_DATA CSIDL_Data[] = "Start Menu" }, { /* CSIDL_MYDOCUMENTS */ - 0, (HKEY)1, /* FIXME */ + 0, HKEY_UNIMPLEMENTED, /* FIXME */ NULL, NULL }, @@ -786,7 +791,7 @@ static const CSIDL_DATA CSIDL_Data[] = "My Music", "My Documents\\My Music" }, - { /* CSIDL_MYMUSIC */ + { /* CSIDL_MYVIDEO */ 1, HKCU, "My Video", "My Documents\\My Video" @@ -802,14 +807,14 @@ static const CSIDL_DATA CSIDL_Data[] = "Desktop" }, { /* CSIDL_DRIVES */ - 0, (HKEY)1, /* FIXME */ + 0, HKEY_DISALLOWED, + NULL, NULL, - "My Computer" }, { /* CSIDL_NETWORK */ - 0, (HKEY)1, /* FIXME */ + 0, HKEY_DISALLOWED, + NULL, NULL, - "Network Neighborhood" }, { /* CSIDL_NETHOOD */ 9, HKCU, @@ -862,12 +867,12 @@ static const CSIDL_DATA CSIDL_Data[] = "Local Settings\\Application Data", }, { /* CSIDL_ALTSTARTUP */ - 0, (HKEY)1, /* FIXME */ + 0, HKEY_NONEXISTENT, NULL, NULL }, { /* CSIDL_COMMON_ALTSTARTUP */ - 0, (HKEY)1, /* FIXME */ + 0, HKEY_NONEXISTENT, NULL, NULL }, @@ -962,22 +967,22 @@ static const CSIDL_DATA CSIDL_Data[] = "Start Menu\\Programs\\Administrative Tools" }, { /* CSIDL_CONNECTIONS */ - 0, 0, /* FIXME */ + 0, HKEY_DISALLOWED, NULL, NULL }, { /* unassigned 32 */ - 0, 0, + 0, HKEY_DISALLOWED, NULL, NULL }, { /* unassigned 33 */ - 0, 0, + 0, HKEY_DISALLOWED, NULL, NULL }, { /* unassigned 34 */ - 0, 0, + 0, HKEY_DISALLOWED, NULL, NULL }, @@ -997,7 +1002,7 @@ static const CSIDL_DATA CSIDL_Data[] = /*"Documents and Settings\\"*/"All Users\\Documents\\My Video" }, { /* CSIDL_RESOURCES */ - 0, (HKEY)2, + 0, HKEY_WINDOWSPATH, NULL, "Resources" }, @@ -1053,25 +1058,23 @@ HRESULT WINAPI SHGetFolderPathW( TRACE("%p,%p,csidl=0x%04x\n", hwndOwner,pszPath,csidl); + if (!pszPath) + return E_INVALIDARG; + + *pszPath = '\0'; if ((folder >= sizeof(CSIDL_Data) / sizeof(CSIDL_Data[0])) || - (CSIDL_Data[folder].hRootKey == 0)) - { - ERR("folder 0x%04lx unknown or not allowed\n", folder); - return E_FAIL; - } - if (CSIDL_Data[folder].hRootKey == (HKEY)1) + (CSIDL_Data[folder].hRootKey == HKEY_DISALLOWED)) + return E_INVALIDARG; + if (CSIDL_Data[folder].hRootKey == HKEY_UNIMPLEMENTED) { FIXME("folder 0x%04lx unknown, please add.\n", folder); return E_FAIL; } - - dwCsidlFlags = CSIDL_Data[folder].dwFlags; - hRootKey = CSIDL_Data[folder].hRootKey; - MultiByteToWideChar(CP_ACP, 0, CSIDL_Data[folder].szValueName, -1, szValueName, MAX_PATH); - MultiByteToWideChar(CP_ACP, 0, CSIDL_Data[folder].szDefaultPath, -1, szDefaultPath, MAX_PATH); + if (CSIDL_Data[folder].hRootKey == HKEY_NONEXISTENT) + return S_FALSE; /* Special case for some values that don't exist in registry */ - if (CSIDL_Data[folder].hRootKey == (HKEY)2) + if (CSIDL_Data[folder].hRootKey == HKEY_WINDOWSPATH) { GetWindowsDirectoryW(pszPath, MAX_PATH); PathAddBackslashW(pszPath); @@ -1079,6 +1082,11 @@ HRESULT WINAPI SHGetFolderPathW( return S_OK; } + dwCsidlFlags = CSIDL_Data[folder].dwFlags; + hRootKey = CSIDL_Data[folder].hRootKey; + MultiByteToWideChar(CP_ACP, 0, CSIDL_Data[folder].szValueName, -1, szValueName, MAX_PATH); + MultiByteToWideChar(CP_ACP, 0, CSIDL_Data[folder].szDefaultPath, -1, szDefaultPath, MAX_PATH); + if (dwCsidlFlags & CSIDL_MYFLAG_SHFOLDER) { /* user shell folders */ @@ -1203,19 +1211,21 @@ HRESULT WINAPI SHGetFolderPathA( DWORD dwFlags, LPSTR pszPath) { - WCHAR szTemp[MAX_PATH]; - HRESULT hr; + WCHAR szTemp[MAX_PATH]; + HRESULT hr; - hr = SHGetFolderPathW(hwndOwner, csidl, hToken, dwFlags, szTemp); - if (hr == S_OK) - { - if (!WideCharToMultiByte( CP_ACP, 0, szTemp, -1, pszPath, MAX_PATH, NULL, NULL )) - pszPath[MAX_PATH - 1] = 0; - } + if (!pszPath) + return E_INVALIDARG; - TRACE("%p,%p,csidl=0x%04x\n",hwndOwner,pszPath,csidl); + *pszPath = '\0'; + hr = SHGetFolderPathW(hwndOwner, csidl, hToken, dwFlags, szTemp); + if (SUCCEEDED(hr)) + WideCharToMultiByte(CP_ACP, 0, szTemp, -1, pszPath, MAX_PATH, NULL, + NULL); - return hr; + TRACE("%p,%p,csidl=0x%04x\n",hwndOwner,pszPath,csidl); + + return hr; } /************************************************************************* @@ -1266,3 +1276,134 @@ BOOL WINAPI SHGetSpecialFolderPathAW ( return SHGetSpecialFolderPathW (hwndOwner, szPath, csidl, bCreate); return SHGetSpecialFolderPathA (hwndOwner, szPath, csidl, bCreate); } + +/************************************************************************* + * SHGetSpecialFolderLocation [SHELL32.@] + * + * gets the folder locations from the registry and creates a pidl + * creates missing reg keys and directories + * + * PARAMS + * hwndOwner [I] + * nFolder [I] CSIDL_xxxxx + * ppidl [O] PIDL of a special folder + * + * NOTES + * In NT5, SHGetSpecialFolderLocation needs the /Recent + * directory. If the directory is missing it returns a x80070002. + * In most cases, this forwards to SHGetSpecialFolderPath, but + * CSIDLs with virtual folders (not real paths) must be handled + * here. + */ +HRESULT WINAPI SHGetSpecialFolderLocation( + HWND hwndOwner, + INT nFolder, + LPITEMIDLIST * ppidl) +{ + HRESULT hr = E_INVALIDARG; + + TRACE("(%p,0x%x,%p)\n", hwndOwner,nFolder,ppidl); + + if (!ppidl) + return E_INVALIDARG; + + *ppidl = NULL; + switch (nFolder) + { + case CSIDL_DESKTOP: + *ppidl = _ILCreateDesktop(); + break; + + case CSIDL_INTERNET: + *ppidl = _ILCreateIExplore(); + break; + + case CSIDL_CONTROLS: + *ppidl = _ILCreateControlPanel(); + break; + + case CSIDL_FONTS: + FIXME("virtual font folder"); + break; + + case CSIDL_PRINTERS: + *ppidl = _ILCreatePrinters(); + break; + + case CSIDL_BITBUCKET: + *ppidl = _ILCreateBitBucket(); + break; + + case CSIDL_DRIVES: + *ppidl = _ILCreateMyComputer(); + break; + + case CSIDL_NETWORK: + *ppidl = _ILCreateNetwork(); + break; + + case CSIDL_ALTSTARTUP: + case CSIDL_COMMON_ALTSTARTUP: + hr = E_FAIL; + break; + + case CSIDL_COMPUTERSNEARME: + hr = E_FAIL; + break; + + default: + { + WCHAR szPath[MAX_PATH]; + + if (SHGetSpecialFolderPathW(hwndOwner, szPath, nFolder, TRUE)) + { + DWORD attributes=0; + + TRACE("Value=%s\n", debugstr_w(szPath)); + hr = SHILCreateFromPathW(szPath, ppidl, &attributes); + } + } + } + if(*ppidl) + hr = NOERROR; + + TRACE("-- (new pidl %p)\n",*ppidl); + return hr; +} + +/************************************************************************* + * SHGetFolderLocation [SHELL32.@] + * + * NOTES + * the pidl can be a simple one. since we can't get the path out of the pidl + * we have to take all data from the pidl + * Mostly we forward to SHGetSpecialFolderLocation, but a few special cases + * we handle here. + */ +HRESULT WINAPI SHGetFolderLocation( + HWND hwnd, + int csidl, + HANDLE hToken, + DWORD dwFlags, + LPITEMIDLIST *ppidl) +{ + HRESULT hr; + + TRACE_(shell)("%p 0x%08x %p 0x%08lx %p\n", + hwnd, csidl, hToken, dwFlags, ppidl); + + if (!ppidl) + return E_INVALIDARG; + + switch (csidl) + { + case CSIDL_ALTSTARTUP: + case CSIDL_COMMON_ALTSTARTUP: + *ppidl = NULL; + hr = S_FALSE; + break; + default: + hr = SHGetSpecialFolderLocation(hwnd, csidl, ppidl); + } + return hr; +} diff --git a/reactos/lib/shell32/shfldr_desktop.c b/reactos/lib/shell32/shfldr_desktop.c index 9eb17dc74e9..ef053570855 100644 --- a/reactos/lib/shell32/shfldr_desktop.c +++ b/reactos/lib/shell32/shfldr_desktop.c @@ -216,7 +216,7 @@ static HRESULT WINAPI ISF_Desktop_fnParseDisplayName (IShellFolder2 * iface, szNext = GetNextElementW (lpszDisplayName, szElement, MAX_PATH); TRACE ("-- element: %s\n", debugstr_w (szElement)); SHCLSIDFromStringW (szElement + 2, &clsid); - pidlTemp = _ILCreate (PT_MYCOMP, &clsid, sizeof (clsid)); + pidlTemp = _ILCreateGuid (PT_GUID, &clsid); } else if (PathGetDriveNumberW (lpszDisplayName) >= 0) { /* it's a filesystem path with a drive. Let MyComputer parse it */ pidlTemp = _ILCreateMyComputer (); @@ -466,7 +466,7 @@ static HRESULT WINAPI ISF_Desktop_fnGetDisplayNameOf (IShellFolder2 * iface, GUID const *clsid; HRESULT hr = S_OK; - *szPath = '\0'; + *szPath = '\0'; TRACE ("(%p)->(pidl=%p,0x%08lx,%p)\n", This, pidl, dwFlags, strRet); pdump (pidl); @@ -681,5 +681,4 @@ static ICOM_VTABLE (IShellFolder2) vt_MCFldr_ShellFolder2 = ISF_Desktop_fnGetDefaultColumnState, ISF_Desktop_fnGetDetailsEx, ISF_Desktop_fnGetDetailsOf, - ISF_Desktop_fnMapColumnToSCID -}; + ISF_Desktop_fnMapColumnToSCID}; diff --git a/reactos/lib/shell32/shfldr_mycomp.c b/reactos/lib/shell32/shfldr_mycomp.c index 61fc25c7ec5..9923ab7d0aa 100644 --- a/reactos/lib/shell32/shfldr_mycomp.c +++ b/reactos/lib/shell32/shfldr_mycomp.c @@ -212,7 +212,7 @@ ISF_MyComputer_fnParseDisplayName (IShellFolder2 * iface, szNext = GetNextElementW (lpszDisplayName, szElement, MAX_PATH); TRACE ("-- element: %s\n", debugstr_w (szElement)); SHCLSIDFromStringW (szElement + 2, &clsid); - pidlTemp = _ILCreate (PT_MYCOMP, &clsid, sizeof (clsid)); + pidlTemp = _ILCreateGuid (PT_GUID, &clsid); } /* do we have an absolute path name ? */ else if (PathGetDriveNumberW (lpszDisplayName) >= 0 && lpszDisplayName[2] == (WCHAR) '\\') { @@ -433,7 +433,7 @@ static HRESULT WINAPI ISF_MyComputer_fnGetDisplayNameOf (IShellFolder2 * iface, ICOM_THIS (IGenericSFImpl, iface); char szPath[MAX_PATH], - szDrive[18]; + szDrive[18]; int len = 0; BOOL bSimplePidl; HRESULT hr = S_OK; @@ -658,7 +658,7 @@ static HRESULT WINAPI ISF_MyComputer_fnMapColumnToSCID (IShellFolder2 * iface, U static ICOM_VTABLE (IShellFolder2) vt_ShellFolder2 = { - ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE ISF_MyComputer_fnQueryInterface, ISF_MyComputer_fnAddRef, ISF_MyComputer_fnRelease, @@ -673,7 +673,7 @@ static ICOM_VTABLE (IShellFolder2) vt_ShellFolder2 = ISF_MyComputer_fnGetDisplayNameOf, ISF_MyComputer_fnSetNameOf, /* ShellFolder2 */ - ISF_MyComputer_fnGetDefaultSearchGUID, + ISF_MyComputer_fnGetDefaultSearchGUID, ISF_MyComputer_fnEnumSearches, ISF_MyComputer_fnGetDefaultColumn, ISF_MyComputer_fnGetDefaultColumnState, diff --git a/reactos/lib/shell32/shlexec.c b/reactos/lib/shell32/shlexec.c index 08d47116467..fac6240f332 100644 --- a/reactos/lib/shell32/shlexec.c +++ b/reactos/lib/shell32/shlexec.c @@ -230,7 +230,7 @@ HRESULT SHELL_GetPathFromIDListForExecuteW(LPCITEMIDLIST pidl, LPWSTR pszPath, U /************************************************************************* * SHELL_ResolveShortCutW [Internal] - * read shortcut file at 'wcmd' and fill psei with its content + * read shortcut file at 'wcmd' */ static HRESULT SHELL_ResolveShortCutW(LPWSTR wcmd, LPWSTR wargs, LPWSTR wdir, HWND hwnd, LPCWSTR lpVerb, int* pshowcmd, LPITEMIDLIST* ppidl) { From 9edefdbda21d8db86b7250186afbbba9a9d7940c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Wed, 7 Apr 2004 21:12:08 +0000 Subject: [PATCH 0781/1463] - When SendMessageTimeout times out, the CompletionEvent goes out of scope, so tell the target thread not to signal it - Replace message queue hardware lock FAST_MUTEX with KMUTEX so it can be recursively acquired svn path=/trunk/; revision=9018 --- reactos/subsys/win32k/include/msgqueue.h | 6 +++--- reactos/subsys/win32k/ntuser/msgqueue.c | 21 ++++++++++++++++++--- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/reactos/subsys/win32k/include/msgqueue.h b/reactos/subsys/win32k/include/msgqueue.h index e0c35d48059..ea7a032bd47 100644 --- a/reactos/subsys/win32k/include/msgqueue.h +++ b/reactos/subsys/win32k/include/msgqueue.h @@ -50,7 +50,7 @@ typedef struct _USER_MESSAGE_QUEUE /* Queue for hardware messages for the queue. */ LIST_ENTRY HardwareMessagesListHead; /* Lock for the hardware message list. */ - FAST_MUTEX HardwareLock; + KMUTEX HardwareLock; /* Lock for the queue. */ FAST_MUTEX Lock; /* Pointer to the current WM_MOUSEMOVE message */ @@ -189,10 +189,10 @@ LPARAM FASTCALL MsqGetMessageExtraInfo(VOID); ExReleaseFastMutex(&MsgQueue->Lock) #define IntLockHardwareMessageQueue(MsgQueue) \ - ExAcquireFastMutex(&MsgQueue->HardwareLock) + KeWaitForMutexObject(&MsgQueue->HardwareLock, UserRequest, KernelMode, FALSE, NULL) #define IntUnLockHardwareMessageQueue(MsgQueue) \ - ExReleaseFastMutex(&MsgQueue->HardwareLock) + KeReleaseMutex(&MsgQueue->HardwareLock, FALSE) /* check the queue status */ #define MsqIsSignaled(MsgQueue) \ diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index 597f4ab719c..d87b4f771d0 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.80 2004/03/31 19:44:34 weiden Exp $ +/* $Id: msgqueue.c,v 1.81 2004/04/07 21:12:08 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -906,6 +906,7 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, LRESULT Result; PUSER_MESSAGE_QUEUE ThreadQueue; LARGE_INTEGER Timeout; + PLIST_ENTRY Entry; KeInitializeEvent(&CompletionEvent, NotificationEvent, FALSE); @@ -944,7 +945,21 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, WaitStatus = KeWaitForMultipleObjects(2, WaitObjects, WaitAny, UserRequest, UserMode, FALSE, (uTimeout ? &Timeout : NULL), NULL); if(WaitStatus == STATUS_TIMEOUT) - {DbgPrint("MsqSendMessage timed out\n"); + { + IntLockMessageQueue(MessageQueue); + Entry = MessageQueue->SentMessagesListHead.Flink; + while (Entry != &MessageQueue->SentMessagesListHead) + { + if ((PUSER_SENT_MESSAGE) CONTAINING_RECORD(Entry, USER_SENT_MESSAGE, ListEntry) + == Message) + { + Message->CompletionEvent = NULL; + break; + } + Entry = Entry->Flink; + } + IntUnLockMessageQueue(MessageQueue); + DbgPrint("MsqSendMessage timed out\n"); break; } while (MsqDispatchOneSentMessage(ThreadQueue)) @@ -1066,7 +1081,7 @@ MsqInitializeMessageQueue(struct _ETHREAD *Thread, PUSER_MESSAGE_QUEUE MessageQu InitializeListHead(&MessageQueue->PostedMessagesListHead); InitializeListHead(&MessageQueue->SentMessagesListHead); InitializeListHead(&MessageQueue->HardwareMessagesListHead); - ExInitializeFastMutex(&MessageQueue->HardwareLock); + KeInitializeMutex(&MessageQueue->HardwareLock, 0); ExInitializeFastMutex(&MessageQueue->Lock); MessageQueue->QuitPosted = FALSE; MessageQueue->QuitExitCode = 0; From bb60332c705502a32beae7a4944a6a6d10f4ea61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Wed, 7 Apr 2004 21:12:40 +0000 Subject: [PATCH 0782/1463] Fix memory leak, thanks to Thomas for spotting this svn path=/trunk/; revision=9019 --- reactos/subsys/win32k/ntuser/message.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/ntuser/message.c b/reactos/subsys/win32k/ntuser/message.c index 17906afaafe..aaa52f0605a 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.55 2004/04/07 17:52:32 gvg Exp $ +/* $Id: message.c,v 1.56 2004/04/07 21:12:40 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -862,6 +862,8 @@ IntSendMessageTimeout(HWND hWnd, IntSendMessageTimeoutSingle(*Child, Msg, wParam, lParam, uFlags, uTimeout, uResult); } + ExFreePool(Children); + return (LRESULT) TRUE; } From 0e07c33bcc2074d49e87c12a00e8c4d5c7bc3ec3 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 7 Apr 2004 22:09:09 +0000 Subject: [PATCH 0783/1463] fixed handling left-over pixels in TransparentBlt() svn path=/trunk/; revision=9020 --- reactos/subsys/win32k/dib/dib16bpp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib16bpp.c b/reactos/subsys/win32k/dib/dib16bpp.c index 866cd5b82c5..67387ae967c 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.27 2004/04/07 15:37:49 weiden Exp $ */ +/* $Id: dib16bpp.c,v 1.28 2004/04/07 22:09:09 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -643,7 +643,7 @@ DIB_16BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, Source = DIB_GetSourceIndex(SourceSurf, SourceGDI, SourceX, SourceY); if(Source != iTransColor) { - *((USHORT*)DestBits) = (USHORT)(XLATEOBJ_iXlate(ColorTranslation, Source) << 16); + *((USHORT*)DestBits) = (USHORT)XLATEOBJ_iXlate(ColorTranslation, Source); } DestBits = (PULONG)((ULONG_PTR)DestBits + 2); From f53f1a1b98974571e7d896d603c3b0bf6d11fb81 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Wed, 7 Apr 2004 22:11:24 +0000 Subject: [PATCH 0784/1463] better looking bookmark icons svn path=/trunk/; revision=9021 --- reactos/subsys/system/explorer/explorer.cpp | 43 +++++++++-- reactos/subsys/system/explorer/globals.h | 4 ++ .../subsys/system/explorer/res/favorites.ico | Bin 9062 -> 9374 bytes reactos/subsys/system/explorer/res/images.bmp | Bin 1158 -> 1262 bytes .../system/explorer/shell/mainframe.cpp | 67 +++++++++++++----- .../system/explorer/taskbar/favorites.cpp | 10 +-- .../system/explorer/taskbar/traynotify.cpp | 2 +- 7 files changed, 96 insertions(+), 30 deletions(-) diff --git a/reactos/subsys/system/explorer/explorer.cpp b/reactos/subsys/system/explorer/explorer.cpp index ef1e911f08d..fe269286a11 100644 --- a/reactos/subsys/system/explorer/explorer.cpp +++ b/reactos/subsys/system/explorer/explorer.cpp @@ -185,7 +185,7 @@ const FileTypeInfo& FileTypeManager::operator[](String ext) ftype._neverShowExt = false; HKEY hkey; - TCHAR value[MAX_PATH], display_name[MAX_PATH];; + TCHAR value[MAX_PATH], display_name[MAX_PATH]; LONG valuelen = sizeof(value); if (!RegQueryValue(HKEY_CLASSES_ROOT, ext, value, &valuelen)) { @@ -287,17 +287,39 @@ HBITMAP Icon::create_bitmap(COLORREF bk_color, HBRUSH hbrBkgnd, HDC hdc_wnd) con return create_bitmap_from_icon(_hicon, hbrBkgnd, hdc_wnd); } +HICON Icon::create_icon(COLORREF bk_color, HDC hdc_wnd) const +{ + if (_itype == IT_SYSCACHE) { + return 0; /*@@todo + HIMAGELIST himl = g_Globals._icon_cache.get_sys_imagelist(); + + int cx, cy; + ImageList_GetIconSize(himl, &cx, &cy); + + HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, cx, cy); + HDC hdc = CreateCompatibleDC(hdc_wnd); + HBITMAP hbmp_old = SelectBitmap(hdc, hbmp); + ImageList_DrawEx(himl, _sys_idx, hdc, 0, 0, cx, cy, bk_color, CLR_DEFAULT, ILD_NORMAL); + SelectBitmap(hdc, hbmp_old); + DeleteDC(hdc); + return hbmp; +*/ } else + return (HICON) CopyImage(_hicon, IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0); +} + HBITMAP create_bitmap_from_icon(HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd) { - HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, 16, 16); + int cx = GetSystemMetrics(SM_CXSMICON); + int cy = GetSystemMetrics(SM_CYSMICON); + HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, cx, cy); MemCanvas canvas; BitmapSelection sel(canvas, hbmp); - RECT rect = {0, 0, 16, 16}; + RECT rect = {0, 0, cx, cy}; FillRect(canvas, &rect, hbrush_bkgnd); - DrawIconEx(canvas, 0, 0, hIcon, 16, 16, 0, hbrush_bkgnd, DI_NORMAL); + DrawIconEx(canvas, 0, 0, hIcon, cx, cy, 0, hbrush_bkgnd, DI_NORMAL); return hbmp; } @@ -313,6 +335,17 @@ int ImageList_AddAlphaIcon(HIMAGELIST himl, HICON hIcon, HBRUSH hbrush_bkgnd, HD return ret; } +int ImageList_AddAlphaIcon(HIMAGELIST himl, const Icon& icon, HDC hdc_wnd) +{ + HICON hicon = icon.create_icon(ImageList_GetBkColor(himl), hdc_wnd); + + int ret = ImageList_AddIcon(himl, hicon); + + DeleteObject(hicon); + + return ret; +} + int IconCache::s_next_id = ICID_DYNAMIC; @@ -322,7 +355,7 @@ void IconCache::init() _icons[ICID_NONE] = Icon(IT_STATIC, ICID_NONE, (HICON)0); _icons[ICID_FOLDER] = Icon(ICID_FOLDER, IDI_FOLDER); - //_icons[ICID_DOCUMENT] = Icon(ICID_DOCUMENT, IDI_DOCUMENT); + //_icons[ICID_DOCUMENT] = Icon(ICID_DOCUMENT, IDI_DOCUMENT); _icons[ICID_EXPLORER] = Icon(ICID_EXPLORER, IDI_EXPLORER); _icons[ICID_APP] = Icon(ICID_APP, IDI_APPICON); diff --git a/reactos/subsys/system/explorer/globals.h b/reactos/subsys/system/explorer/globals.h index f0ac671f995..fe5961da328 100644 --- a/reactos/subsys/system/explorer/globals.h +++ b/reactos/subsys/system/explorer/globals.h @@ -94,6 +94,7 @@ struct Icon { void draw(HDC hdc, int x, int y, int cx, int cy, COLORREF bk_color, HBRUSH bk_brush) const; HBITMAP create_bitmap(COLORREF bk_color, HBRUSH hbrBkgnd, HDC hdc_wnd) const; + HICON create_icon(COLORREF bk_color, HDC hdc_wnd) const; int get_sysiml_idx() const {return _itype==IT_SYSCACHE? _sys_idx: -1;} @@ -151,6 +152,9 @@ extern HBITMAP create_bitmap_from_icon(HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc /// add icon with alpha channel to imagelist using the specified background color extern int ImageList_AddAlphaIcon(HIMAGELIST himl, HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd); + /// add Icon object to image list +extern int ImageList_AddAlphaIcon(HIMAGELIST himl, const Icon& icon, HDC hdc_wnd); + /// retrieve icon from window extern HICON get_window_icon_small(HWND hwnd); extern HICON get_window_icon_big(HWND hwnd, bool allow_from_class=true); diff --git a/reactos/subsys/system/explorer/res/favorites.ico b/reactos/subsys/system/explorer/res/favorites.ico index e58a9cd9f1492949b74955341bbe594e6a58c88a..558748e9ed09ff9d3cd195744f3e56625f8b72e6 100644 GIT binary patch delta 656 zcmd5)ze~el5PfM=jM&yH{=gzOScf`0cCdp8Lcyg-MR5|z>SD%z;L@R6=<1?i9i^^H zg^Crv(Op5Xs}72YG`?#ZLH_~|F7MvEcb6mNdG%|HwgoLTEMNmbDiv@i2K1-} zeH#txd&#hG!!dzmCgdh^25^u)U-^v8*{4HX#8D!*;Huemi!*f`Uv%9Uc-ztWNZIvN zbZ0ZcuESi<-@A`=ED?8a-rTcSasG*P9nO2)kRv7T=#lz_y1Yd~xMa+Gh-XJ-LpV`R z*S#^T)VwqohyKff!#@W$M-p38lR4hYuMC@MfZvy)ynS;zulgm~pip2z(rUE`3cmFD z@CSuIAinQ&exhRa=YU#Aj4-t>2o|+&2edELG@}DcKx;*pL?J}#?ILy5MB^r_3RIOW h`W147WUm5zEdw7JZy`B8tN4S2d3^{x-3B(Xegm-6s(Ana delta 389 zcmbQ|`OM9Qfq{{Mg+W09L~}5#;9y{IV_;wq5PqL%N=yMxlP568MREgW zBY@c7`bzl&pbBFkopSVR`O1$Vl|Tt(AT^a?Lp%>7$Wb705~v2mUIG*c+6@LEJ_xf+ le$S)K4>AF!BSLEGWJQjU&1YFO*$0aQIpGf6EX^A&1^_+MQ?>vA diff --git a/reactos/subsys/system/explorer/res/images.bmp b/reactos/subsys/system/explorer/res/images.bmp index aaf3413b88a620739a5bf0d973573eb18417b5a0..ff9f97a0a7a743b595e6de7d0f45431f1ea14c38 100644 GIT binary patch delta 178 zcmZqUe8;Km!=LIkRi>H>Lm% ruo93WH)bTxG$044Y@#Gc*)!%qpmwQ+K<%b1fgGz=bgWv{(X|QyW79#d delta 90 zcmaFI*~Y2tlParam; - if (node._type == BookmarkNode::BMNT_FOLDER) { - // display tooltips for bookmark folders - if (!node._pfolder->_description.empty()) - lstrcpyn(pnmgit->pszText, node._pfolder->_description.c_str(), pnmgit->cchTextMax); - } else { // BookmarkNode::BMNT_BOOKMARK - // display tooltips for bookmark folders - String txt = node._pbookmark->_description; + if (pnmgit->lParam) { + const BookmarkNode& node = *(BookmarkNode*)pnmgit->lParam; - if (!node._pbookmark->_url.empty()) { - if (!txt.empty()) - txt += TEXT(" - "); + if (node._type == BookmarkNode::BMNT_FOLDER) { + // display tooltips for bookmark folders + if (!node._pfolder->_description.empty()) + lstrcpyn(pnmgit->pszText, node._pfolder->_description.c_str(), pnmgit->cchTextMax); + } else { // BookmarkNode::BMNT_BOOKMARK + // display tooltips for bookmark folders + String txt = node._pbookmark->_description; - txt += node._pbookmark->_url; + if (!node._pbookmark->_url.empty()) { + if (!txt.empty()) + txt += TEXT(" - "); + + txt += node._pbookmark->_url; + } + + lstrcpyn(pnmgit->pszText, txt.c_str(), pnmgit->cchTextMax); } - - lstrcpyn(pnmgit->pszText, txt.c_str(), pnmgit->cchTextMax); } break;} } @@ -1043,11 +1046,37 @@ bool MainFrame::activate_child_window(LPCTSTR filesys) void MainFrame::FillBookmarks() { HiddenWindow hide(_hsidebar); + WindowCanvas canvas(_hwnd); TreeView_DeleteAllItems(_hsidebar); - WindowCanvas canvas(_hwnd); - g_Globals._favorites.fill_tree(_hsidebar, TVI_ROOT, _himl, canvas); + HBRUSH hbr_bkgnd = GetStockBrush(WHITE_BRUSH); + ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_FAVORITES), hbr_bkgnd, canvas); + ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_DOT_TRANS), hbr_bkgnd, canvas); + ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_DOT), hbr_bkgnd, canvas); + ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_FOLDER), hbr_bkgnd, canvas); + ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_FOLDER), hbr_bkgnd, canvas); +/*@@ This does not produce the expected result because CopyImage() seems not to duplicate 32 BIT alpha blended images: + ImageList_AddAlphaIcon(_himl, g_Globals._icon_cache.get_icon(ICID_FAVORITES), canvas); + ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_DOT_TRANS), hbr_bkgnd, canvas); + ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_DOT), hbr_bkgnd, canvas); + ImageList_AddAlphaIcon(_himl, g_Globals._icon_cache.get_icon(ICID_FOLDER), canvas); + ImageList_AddAlphaIcon(_himl, g_Globals._icon_cache.get_icon(ICID_FOLDER), canvas); +*/ + TV_INSERTSTRUCT tvi; + + tvi.hParent = TVI_ROOT; + tvi.hInsertAfter = TVI_LAST; + tvi.item.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE; + ResString sFavorites(IDS_FAVORITES); + tvi.item.pszText = (LPTSTR)sFavorites.c_str(); + tvi.item.iSelectedImage = tvi.item.iImage = 0; + + HTREEITEM hitem_bookmarks = TreeView_InsertItem(_hsidebar, &tvi); + + g_Globals._favorites.fill_tree(_hsidebar, hitem_bookmarks, _himl, canvas); + + TreeView_Expand(_hsidebar, hitem_bookmarks, TVE_EXPAND); } #endif diff --git a/reactos/subsys/system/explorer/taskbar/favorites.cpp b/reactos/subsys/system/explorer/taskbar/favorites.cpp index 7244a2b28c1..d6dad9d4162 100644 --- a/reactos/subsys/system/explorer/taskbar/favorites.cpp +++ b/reactos/subsys/system/explorer/taskbar/favorites.cpp @@ -273,8 +273,8 @@ void BookmarkList::fill_tree(HWND hwnd, HTREEITEM parent, HIMAGELIST himagelist, const BookmarkFolder& folder = *node._pfolder; tv.pszText = (LPTSTR)folder._name.c_str(); - tv.iImage = 3; - tv.iSelectedImage = 4; + tv.iImage = 3; // folder + tv.iSelectedImage = 4; // open folder HTREEITEM hitem = TreeView_InsertItem(hwnd, &tvi); folder._bookmarks.fill_tree(hwnd, hitem, himagelist, hdc_wnd); @@ -282,15 +282,15 @@ void BookmarkList::fill_tree(HWND hwnd, HTREEITEM parent, HIMAGELIST himagelist, const Bookmark& bookmark = *node._pbookmark; tv.pszText = (LPTSTR)bookmark._name.c_str(); - tv.iImage = 0; - tv.iSelectedImage = 1; + tv.iImage = 1; // bookmark + tv.iSelectedImage = 2; // selected bookmark if (!bookmark._icon_path.empty()) { ///@todo retreive "http://.../favicon.ico" icons const Icon& icon = g_Globals._icon_cache.extract(bookmark._icon_path, bookmark._icon_idx); if ((ICON_ID)icon != ICID_NONE) - tv.iImage = tv.iSelectedImage = ImageList_Add(himagelist, icon.create_bitmap(RGB(255,255,255), GetStockBrush(WHITE_BRUSH), hdc_wnd), 0); + tv.iImage = tv.iSelectedImage = ImageList_AddAlphaIcon(himagelist, icon, hdc_wnd); } TreeView_InsertItem(hwnd, &tvi); diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index 199806992ce..9c3bfb38bd5 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -756,7 +756,7 @@ String string_from_mode(NOTIFYICONMODE mode) TrayNotifyDlg::TrayNotifyDlg(HWND hwnd) : super(hwnd), _tree_ctrl(GetDlgItem(hwnd, IDC_NOTIFY_ICONS)), - _himl(ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR24, 2, 0)), + _himl(ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR24, 3, 0)), _pNotifyArea(static_cast(Window::get_window((HWND)SendMessage(g_Globals._hwndDesktopBar, PM_GET_NOTIFYAREA, 0, 0)))) { _selectedItem = 0; From 7aee09070d679780d4eaa691c50609708dda90e6 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 7 Apr 2004 22:17:36 +0000 Subject: [PATCH 0785/1463] fixed clipping bug in TransparentBlt(). Thanks to Filip for fixing it svn path=/trunk/; revision=9022 --- reactos/subsys/win32k/eng/transblt.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/eng/transblt.c b/reactos/subsys/win32k/eng/transblt.c index 1fb12e1c772..be93adf6605 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.15 2004/04/06 21:53:48 weiden Exp $ +/* $Id: transblt.c,v 1.16 2004/04/07 22:17:36 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -250,6 +250,10 @@ IntEngTransparentBlt(PSURFOBJ Dest, { return TRUE; } + SourceRect->left += OutputRect.left - DestRect->left; + SourceRect->top += OutputRect.top - DestRect->top; + SourceRect->right += OutputRect.left - DestRect->left; + SourceRect->bottom += OutputRect.top - DestRect->top; } else { From 3cb07b0ba8cfeb4b87355a68fa8496d3d9506bc1 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Thu, 8 Apr 2004 09:43:35 +0000 Subject: [PATCH 0786/1463] - Fixed initalization of VIDEO_HW_INITIALIZATION_DATA, because the Video Port driver now checks the values. svn path=/trunk/; revision=9023 --- reactos/drivers/video/miniport/vbe/vbemp.c | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/drivers/video/miniport/vbe/vbemp.c b/reactos/drivers/video/miniport/vbe/vbemp.c index 2b8e800a60f..b559bc3b4e9 100644 --- a/reactos/drivers/video/miniport/vbe/vbemp.c +++ b/reactos/drivers/video/miniport/vbe/vbemp.c @@ -34,6 +34,7 @@ DriverEntry(IN PVOID Context1, IN PVOID Context2) VIDEO_HW_INITIALIZATION_DATA InitData; VideoPortZeroMemory(&InitData, sizeof(InitData)); + InitData.HwInitDataSize = sizeof(VIDEO_HW_INITIALIZATION_DATA); InitData.HwFindAdapter = VBEFindAdapter; InitData.HwInitialize = VBEInitialize; InitData.HwStartIO = VBEStartIO; From a7270ad893ac3d03dde2c28be45df56ee60c7e7b Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Thu, 8 Apr 2004 09:43:55 +0000 Subject: [PATCH 0787/1463] - Fixed releasing of display ownership. svn path=/trunk/; revision=9024 --- reactos/drivers/video/videoprt/dispatch.c | 15 ++++++++++++--- reactos/drivers/video/videoprt/videoprt.h | 3 ++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/reactos/drivers/video/videoprt/dispatch.c b/reactos/drivers/video/videoprt/dispatch.c index 617ef9d99a8..91ffe8635a0 100644 --- a/reactos/drivers/video/videoprt/dispatch.c +++ b/reactos/drivers/video/videoprt/dispatch.c @@ -18,7 +18,7 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: dispatch.c,v 1.2 2004/03/19 20:58:32 navaraf Exp $ + * $Id: dispatch.c,v 1.3 2004/04/08 09:43:55 navaraf Exp $ */ #include "videoprt.h" @@ -55,11 +55,11 @@ IntVideoPortResetDisplayParameters(ULONG Columns, ULONG Rows) &ResetDisplayParametersDeviceExtension->MiniPortDeviceExtension, Columns, Rows)) { + ResetDisplayParametersDeviceExtension = NULL; return FALSE; } ResetDisplayParametersDeviceExtension = NULL; - return TRUE; } @@ -131,6 +131,8 @@ IntVideoPortDispatchOpen( { Irp->IoStatus.Status = STATUS_SUCCESS; + InterlockedIncrement(&DeviceExtension->DeviceOpened); + /* * Storing the device extension pointer in a static variable is an * ugly hack. Unfortunately, we need it in VideoPortResetDisplayParameters @@ -168,10 +170,17 @@ IntVideoPortDispatchClose( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + DPRINT("IntVideoPortDispatchClose\n"); - if (ResetDisplayParametersDeviceExtension != NULL) + DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + if (DeviceExtension->DeviceOpened > 1 && + InterlockedDecrement(&DeviceExtension->DeviceOpened) == 0) + { + ResetDisplayParametersDeviceExtension = DeviceExtension; HalReleaseDisplayOwnership(); + } Irp->IoStatus.Status = STATUS_SUCCESS; IoCompleteRequest(Irp, IO_NO_INCREMENT); diff --git a/reactos/drivers/video/videoprt/videoprt.h b/reactos/drivers/video/videoprt/videoprt.h index cb37851c8b1..d33d7139eb3 100644 --- a/reactos/drivers/video/videoprt/videoprt.h +++ b/reactos/drivers/video/videoprt/videoprt.h @@ -18,7 +18,7 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: videoprt.h,v 1.9 2004/03/21 12:31:19 gvg Exp $ + * $Id: videoprt.h,v 1.10 2004/04/08 09:43:55 navaraf Exp $ */ #ifndef VIDEOPRT_H @@ -71,6 +71,7 @@ typedef struct _VIDEO_PORT_DEVICE_EXTENSTION LIST_ENTRY AddressMappingListHead; KDPC DpcObject; VIDEO_PORT_DRIVER_EXTENSION *DriverExtension; + ULONG DeviceOpened; CHAR MiniPortDeviceExtension[1]; } VIDEO_PORT_DEVICE_EXTENSION, *PVIDEO_PORT_DEVICE_EXTENSION; From 638280971cf8ffb2fef9d1603de656d0e0d6f65e Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Thu, 8 Apr 2004 09:44:21 +0000 Subject: [PATCH 0788/1463] - Implement brush origin for 4bpp blits. svn path=/trunk/; revision=9025 --- reactos/subsys/win32k/dib/dib4bpp.c | 34 +++++++++++++++++++---------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib4bpp.c b/reactos/subsys/win32k/dib/dib4bpp.c index 80ee90b8bb7..ef85ff83607 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.31 2004/04/07 20:23:38 navaraf Exp $ */ +/* $Id: dib4bpp.c,v 1.32 2004/04/08 09:44:21 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -249,6 +249,7 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, HBITMAP PatternSurface = NULL; PSURFOBJ PatternObj; ULONG PatternWidth, PatternHeight; + POINTL PatternOrigin; static const ULONG ExpandSolidColor[16] = { 0x00000000 /* 0 */, @@ -302,6 +303,15 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); PatternWidth = PatternObj->sizlBitmap.cx; PatternHeight = PatternObj->sizlBitmap.cy; + + if (BrushOrigin != NULL) + { + PatternOrigin = *BrushOrigin; + } + else + { + PatternOrigin.x = PatternOrigin.y = 0; + } UsesPattern = TRUE; } @@ -322,7 +332,7 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, i = DestRect->left; if (UsesPattern) - PatternY = j % PatternHeight; + PatternY = (j + PatternOrigin.y) % PatternHeight; if (i & 0x1) { @@ -335,7 +345,7 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (UsesPattern) { - Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; + Pattern = DIB_1BPP_GetPixel(PatternObj, (i + PatternOrigin.x) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; } DIB_4BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF); @@ -362,14 +372,14 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } if (UsesPattern) { - Pattern = DIB_1BPP_GetPixel(PatternObj, (i + 1) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 0) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 4; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 3) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 8; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 2) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 12; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 5) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 16; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 4) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 20; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 7) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 24; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 6) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 28; + Pattern = DIB_1BPP_GetPixel(PatternObj, (i + PatternOrigin.x + 1) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + PatternOrigin.x + 0) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 4; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + PatternOrigin.x + 3) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 8; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + PatternOrigin.x + 2) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 12; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + PatternOrigin.x + 5) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 16; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + PatternOrigin.x + 4) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 20; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + PatternOrigin.x + 7) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 24; + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + PatternOrigin.x + 6) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 28; } *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); } @@ -384,7 +394,7 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } if (UsesPattern) { - Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; + Pattern = DIB_1BPP_GetPixel(PatternObj, (i + PatternOrigin.x) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; } DIB_4BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF); } From f051684bf82b8063a8bb9f8e46ad0aef4ef5968b Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Thu, 8 Apr 2004 09:44:26 +0000 Subject: [PATCH 0789/1463] - Add registry entries for SVGA VBE driver. - Include the driver on the Boot CD. svn path=/trunk/; revision=9026 --- reactos/bootdata/hivesys.inf | 8 ++++++++ reactos/bootdata/packages/reactos.dff | 2 ++ 2 files changed, 10 insertions(+) diff --git a/reactos/bootdata/hivesys.inf b/reactos/bootdata/hivesys.inf index 11d2c4a1b96..5deb2c7c880 100644 --- a/reactos/bootdata/hivesys.inf +++ b/reactos/bootdata/hivesys.inf @@ -64,6 +64,7 @@ HKLM,"SYSTEM\CurrentControlSet\Control\ServiceGroupOrder","List",0x00010000, \ "Debug", \ "Video Init", \ "Video", \ + "Video Save SVGA", \ "Video Save", \ "File System", \ "Event log", \ @@ -546,6 +547,13 @@ HKLM,"SYSTEM\CurrentControlSet\Services\Vfatfs","ImagePath",0x00020000,"system32 HKLM,"SYSTEM\CurrentControlSet\Services\Vfatfs","Start",0x00010001,0x00000000 HKLM,"SYSTEM\CurrentControlSet\Services\Vfatfs","Type",0x00010001,0x00000002 +; VBE SVGA driver +HKLM,"SYSTEM\CurrentControlSet\Services\VBE","ErrorControl",0x00010001,0x00000000 +HKLM,"SYSTEM\CurrentControlSet\Services\VBE","Group",0x00000000,"Video Save SVGA" +HKLM,"SYSTEM\CurrentControlSet\Services\VBE","ImagePath",0x00020000,"system32\drivers\vbemp.sys" +HKLM,"SYSTEM\CurrentControlSet\Services\VBE","Start",0x00010001,0x00000001 +HKLM,"SYSTEM\CurrentControlSet\Services\VBE","Type",0x00010001,0x00000001 +HKLM,"SYSTEM\CurrentControlSet\Services\VBE\Device0","InstalledDisplayDrivers",0x00010000,"framebuf" ; VGA miniport driver HKLM,"SYSTEM\CurrentControlSet\Services\Vga","ErrorControl",0x00010001,0x00000000 diff --git a/reactos/bootdata/packages/reactos.dff b/reactos/bootdata/packages/reactos.dff index 186884c7079..a5864253240 100755 --- a/reactos/bootdata/packages/reactos.dff +++ b/reactos/bootdata/packages/reactos.dff @@ -32,7 +32,9 @@ drivers\dd\bootvid\bootvid.sys 2 drivers\dd\null\null.sys 2 drivers\dd\serial\serial.sys 2 drivers\video\displays\vga\vgaddi.dll 1 +drivers\video\displays\framebuf\framebuf.dll 1 drivers\video\miniport\vga\vgamp.sys 2 +drivers\video\miniport\vbe\vbemp.sys 2 drivers\video\videoprt\videoprt.sys 2 drivers\fs\fs_rec\fs_rec.sys 2 drivers\fs\ms\msfs.sys 2 From b351485907f1cb2660ead9259c7981239c2a52ee Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Thu, 8 Apr 2004 12:25:00 +0000 Subject: [PATCH 0790/1463] some fixes that caused crashes svn path=/trunk/; revision=9027 --- reactos/apps/utils/stats/stats.c | 118 +++++++++---------------------- 1 file changed, 35 insertions(+), 83 deletions(-) diff --git a/reactos/apps/utils/stats/stats.c b/reactos/apps/utils/stats/stats.c index 5721b0d20a0..6ef949cd8d8 100644 --- a/reactos/apps/utils/stats/stats.c +++ b/reactos/apps/utils/stats/stats.c @@ -28,20 +28,13 @@ typedef struct _FILE_INFO struct _FILE_INFO * Next; struct _FILE_INFO * StatInfoListNext; PEXTENSION_INFO ExtInfo; - TCHAR FileName[256]; + TCHAR FileName[MAX_PATH]; DWORD LineCount; DWORD FunctionCount; } FILE_INFO, *PFILE_INFO; - +HANDLE FileHandle; DWORD TotalLineCount; -PCHAR FileBuffer; -DWORD FileBufferSize; -CHAR Line[256]; -DWORD CurrentOffset; -DWORD CurrentChar; -DWORD CurrentLine; -DWORD LineLength; PEXTENSION_INFO ExtInfoList; PFILE_INFO StatInfoList; @@ -50,11 +43,6 @@ VOID Initialize() { TotalLineCount = 0; - FileBuffer = NULL; - FileBufferSize = 0; - CurrentOffset = 0; - CurrentLine = 0; - LineLength = 0; ExtInfoList = NULL; StatInfoList = NULL; } @@ -171,19 +159,14 @@ AddFile(LPTSTR FileName, VOID CleanupAfterFile() { - if (FileBuffer) - { - HeapFree (GetProcessHeap(), 0, FileBuffer); - FileBuffer = NULL; - } + if(FileHandle != INVALID_HANDLE_VALUE) + CloseHandle (FileHandle); } BOOL LoadFile(LPTSTR FileName) { - HANDLE FileHandle; - DWORD BytesRead; LONG FileSize; FileHandle = CreateFile (FileName, // Create this file @@ -197,84 +180,53 @@ LoadFile(LPTSTR FileName) return FALSE; FileSize = GetFileSize (FileHandle, NULL); - if (FileSize < 0) + if (FileSize <= 0) { CloseHandle (FileHandle); return FALSE; } - FileBufferSize = (DWORD) FileSize; - - FileBuffer = (PCHAR) HeapAlloc (GetProcessHeap(), 0, FileBufferSize); - if (!FileBuffer) - { - CloseHandle (FileHandle); - return FALSE; - } - - if (!ReadFile (FileHandle, FileBuffer, FileBufferSize, &BytesRead, NULL)) - { - CloseHandle(FileHandle); - HeapFree (GetProcessHeap(), 0, FileBuffer); - FileBuffer = NULL; - return FALSE; - } - - CloseHandle (FileHandle); - - CurrentOffset = 0; - CurrentLine = 0; - CurrentChar = 0; - return TRUE; } -BOOL -ReadLine() -/* - * FUNCTION: Reads the next line into the line buffer - * RETURNS: - * TRUE if there is a new line, FALSE if not - */ +DWORD +ReadLines() { - ULONG i, j; - TCHAR ch; - - if (CurrentOffset >= FileBufferSize) - return FALSE; - - i = 0; - while ((((j = CurrentOffset + i) < FileBufferSize) && (i < sizeof (Line)) && - ((ch = FileBuffer[j]) != 0x0D && (ch = FileBuffer[j]) != 0x0A))) - { - Line[i] = ch; - i++; - } - - Line[i] = '\0'; - LineLength = i; + DWORD ReadBytes, LineLen, Lines = 0; + static TCHAR FileBuffer[1024]; + TCHAR LastChar = _T('\0'); + TCHAR *Current; - if ((FileBuffer[CurrentOffset + i] == 0x0D) && (FileBuffer[CurrentOffset + i + 1] == 0x0A)) - CurrentOffset++; - - CurrentOffset += i + 1; - - CurrentChar = 0; - - CurrentLine++; - - return TRUE; + LineLen = 0; + while(ReadFile (FileHandle, FileBuffer, sizeof(FileBuffer), &ReadBytes, NULL) && ReadBytes >= sizeof(TCHAR)) + { + if(ReadBytes & 0x1) + ReadBytes--; + + for(Current = FileBuffer; ReadBytes > 0; ReadBytes -= sizeof(TCHAR), Current++) + { + if(*Current == 0x0A && LastChar == 0x0D) + { + LastChar = _T('\0'); + if(LineLen > 0) + Lines++; + LineLen = 0; + } + LineLen++; + LastChar = *Current; + } + } + + Lines += (LineLen > 0); + return Lines; } VOID DoStatisticsForFile(PFILE_INFO StatInfo) { - while (ReadLine()) - { - } - StatInfo->LineCount = CurrentLine; + StatInfo->LineCount = ReadLines(); } @@ -400,7 +352,7 @@ ProcessDirectories(LPTSTR Path) HANDLE SearchHandle; BOOL More; - _tprintf (_T("Processing directory %s\n"), Path); + _tprintf (_T("Processing %s ...\n"), Path); _tcscpy (SearchPath, Path); _tcscat (SearchPath, _T("\\*.*")); From 7cb3dcec2c953b86b41220697e45a4d5e9097641 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Thu, 8 Apr 2004 12:47:49 +0000 Subject: [PATCH 0791/1463] some fixes so it can also be compiled as a unicode app svn path=/trunk/; revision=9028 --- reactos/apps/utils/stats/stats.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/reactos/apps/utils/stats/stats.c b/reactos/apps/utils/stats/stats.c index 6ef949cd8d8..521c6f3c3ed 100644 --- a/reactos/apps/utils/stats/stats.c +++ b/reactos/apps/utils/stats/stats.c @@ -194,21 +194,21 @@ DWORD ReadLines() { DWORD ReadBytes, LineLen, Lines = 0; - static TCHAR FileBuffer[1024]; - TCHAR LastChar = _T('\0'); - TCHAR *Current; + static char FileBuffer[1024]; + char LastChar = '\0'; + char *Current; LineLen = 0; - while(ReadFile (FileHandle, FileBuffer, sizeof(FileBuffer), &ReadBytes, NULL) && ReadBytes >= sizeof(TCHAR)) + while(ReadFile (FileHandle, FileBuffer, sizeof(FileBuffer), &ReadBytes, NULL) && ReadBytes >= sizeof(char)) { if(ReadBytes & 0x1) ReadBytes--; - for(Current = FileBuffer; ReadBytes > 0; ReadBytes -= sizeof(TCHAR), Current++) + for(Current = FileBuffer; ReadBytes > 0; ReadBytes -= sizeof(char), Current++) { - if(*Current == 0x0A && LastChar == 0x0D) + if(*Current == '\n' && LastChar == '\r') { - LastChar = _T('\0'); + LastChar = '\0'; if(LineLen > 0) Lines++; LineLen = 0; @@ -417,6 +417,10 @@ Execute(LPTSTR Path) int main (int argc, char * argv []) { +#if UNICODE + TCHAR Path[MAX_PATH + 1]; +#endif + _tprintf (_T("\nReactOS project statistics generator.\n\n")); if (argc < 2) @@ -429,7 +433,13 @@ main (int argc, char * argv []) AddExtension (_T("c\0\0"), _T("Ansi C Source files")); AddExtension (_T("cpp\0cxx\0\0"), _T("C++ Source files")); AddExtension (_T("h\0\0"), _T("Header files")); +#if UNICODE + ZeroMemory(Path, sizeof(Path)); + if(MultiByteToWideChar(CP_ACP, 0, argv[1], -1, Path, MAX_PATH) > 0) + Execute (Path); +#else Execute (argv[1]); +#endif Cleanup(); return 0; From 9358255f84b793404050d174734b135767f87cc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Thu, 8 Apr 2004 15:36:36 +0000 Subject: [PATCH 0792/1463] HwResetHw can be (and sometimes is) NULL svn path=/trunk/; revision=9030 --- reactos/drivers/video/videoprt/dispatch.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/reactos/drivers/video/videoprt/dispatch.c b/reactos/drivers/video/videoprt/dispatch.c index 91ffe8635a0..96b684f209d 100644 --- a/reactos/drivers/video/videoprt/dispatch.c +++ b/reactos/drivers/video/videoprt/dispatch.c @@ -18,7 +18,7 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: dispatch.c,v 1.3 2004/04/08 09:43:55 navaraf Exp $ + * $Id: dispatch.c,v 1.4 2004/04/08 15:36:36 gvg Exp $ */ #include "videoprt.h" @@ -49,9 +49,8 @@ IntVideoPortResetDisplayParameters(ULONG Columns, ULONG Rows) DriverExtension = ResetDisplayParametersDeviceExtension->DriverExtension; - ASSERT(DriverExtension->InitializationData.HwResetHw != NULL); - - if (!DriverExtension->InitializationData.HwResetHw( + if (NULL == DriverExtension->InitializationData.HwResetHw || + !DriverExtension->InitializationData.HwResetHw( &ResetDisplayParametersDeviceExtension->MiniPortDeviceExtension, Columns, Rows)) { From 57e1e034b89265c142aa2c5dfade23c7732ac1f7 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Thu, 8 Apr 2004 15:45:17 +0000 Subject: [PATCH 0793/1463] - Fixed a typo: 0x31 -> 31 svn path=/trunk/; revision=9032 --- reactos/subsys/win32k/dib/dib1bpp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib1bpp.c b/reactos/subsys/win32k/dib/dib1bpp.c index 77e01a683ea..6854ec957d4 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.22 2004/04/07 16:38:27 weiden Exp $ */ +/* $Id: dib1bpp.c,v 1.23 2004/04/08 15:45:17 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include @@ -409,7 +409,7 @@ DIB_1BPP_BitBlt( } } - RoundedRight = DestRect->right - ((DestRect->right - DestRect->left) & 0x31); + RoundedRight = DestRect->right - ((DestRect->right - DestRect->left) & 31); SourceY = SourcePoint->y; for (Y = DestRect->top; Y < DestRect->bottom; Y++) From ba54c6c8925af4d8ebe0a8afb94df84076a7adad Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Thu, 8 Apr 2004 15:45:18 +0000 Subject: [PATCH 0794/1463] - Fixed minor bug in VGA driver. svn path=/trunk/; revision=9033 --- reactos/drivers/video/displays/vga/objects/bitblt.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reactos/drivers/video/displays/vga/objects/bitblt.c b/reactos/drivers/video/displays/vga/objects/bitblt.c index 1a97f14c705..2f8b8e30cfa 100644 --- a/reactos/drivers/video/displays/vga/objects/bitblt.c +++ b/reactos/drivers/video/displays/vga/objects/bitblt.c @@ -261,8 +261,14 @@ VGADDI_BltBrush(SURFOBJ* Dest, SURFOBJ* Source, SURFOBJ* MaskSurf, Video = (PUCHAR)vidmem + i * 80 + (Left >> 3); for (j = 0; j < Length; j++, Video++) { +#if 0 (VOID)READ_REGISTER_UCHAR(Video); WRITE_REGISTER_UCHAR(Video, 0xFF); +#else + char volatile Temp = *Video; + Temp |= 0; + *Video = 0xFF; +#endif } } From 9f3885512a86eda2383c108a46ae980b8e72fe1c Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Thu, 8 Apr 2004 16:01:47 +0000 Subject: [PATCH 0795/1463] - Don't bugcheck if FDO wasn't attached. svn path=/trunk/; revision=9036 --- reactos/ntoskrnl/io/device.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/io/device.c b/reactos/ntoskrnl/io/device.c index ecf64fa8553..d461ae0f444 100644 --- a/reactos/ntoskrnl/io/device.c +++ b/reactos/ntoskrnl/io/device.c @@ -1,4 +1,4 @@ -/* $Id: device.c,v 1.69 2004/03/27 19:41:32 navaraf Exp $ +/* $Id: device.c,v 1.70 2004/04/08 16:01:47 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -66,7 +66,8 @@ IopInitializeDevice( { /* FIXME: What do we do? Unload the driver or just disable the device? */ DbgPrint("An FDO was not attached\n"); - KEBUGCHECK(0); + IopDeviceNodeSetFlag(DeviceNode, DNF_DISABLED); + return STATUS_UNSUCCESSFUL; } IopDeviceNodeSetFlag(DeviceNode, DNF_ADDED); From 41d4ef6885a47f789db647cc17107d2317ce8143 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Thu, 8 Apr 2004 17:53:30 +0000 Subject: [PATCH 0796/1463] Export _wcmdln svn path=/trunk/; revision=9038 --- reactos/lib/msvcrt/msvcrt.def | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/msvcrt/msvcrt.def b/reactos/lib/msvcrt/msvcrt.def index d4e1f487f78..102fa31fdeb 100644 --- a/reactos/lib/msvcrt/msvcrt.def +++ b/reactos/lib/msvcrt/msvcrt.def @@ -1,4 +1,4 @@ -; $Id: msvcrt.def,v 1.33 2004/03/19 22:58:09 gvg Exp $ +; $Id: msvcrt.def,v 1.34 2004/04/08 17:53:30 gvg Exp $ ; ; ReactOS MSVCRT Compatibility Library ; @@ -561,7 +561,7 @@ _waccess _wasctime _wchdir _wchmod -;_wcmdln +_wcmdln=MSVCRT__wcmdln _wcreat _wcsdup ;_wcserror From 9108d0353af22c6e47f165423bf037e7283d5079 Mon Sep 17 00:00:00 2001 From: Jason Filby Date: Thu, 8 Apr 2004 20:05:08 +0000 Subject: [PATCH 0797/1463] Fix MmIsAddressValid to check if VirtualAddress >= KERNEL_BASE svn path=/trunk/; revision=9039 --- reactos/ntoskrnl/mm/mm.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/reactos/ntoskrnl/mm/mm.c b/reactos/ntoskrnl/mm/mm.c index df19bc5b00e..8c272ff6726 100644 --- a/reactos/ntoskrnl/mm/mm.c +++ b/reactos/ntoskrnl/mm/mm.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: mm.c,v 1.69 2004/03/13 19:14:15 dwelch Exp $ +/* $Id: mm.c,v 1.70 2004/04/08 20:05:08 jfilby Exp $ * * COPYRIGHT: See COPYING in the top directory * PROJECT: ReactOS kernel @@ -144,12 +144,19 @@ BOOLEAN STDCALL MmIsAddressValid(PVOID VirtualAddress) MEMORY_AREA* MemoryArea; PMADDRESS_SPACE AddressSpace; - AddressSpace = &PsGetCurrentProcess()->AddressSpace; + if ((ULONG)VirtualAddress >= KERNEL_BASE) + { + AddressSpace = MmGetKernelAddressSpace(); + } + else + { + AddressSpace = &PsGetCurrentProcess()->AddressSpace; + } MmLockAddressSpace(AddressSpace); MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace, - VirtualAddress); - + VirtualAddress); + if (MemoryArea == NULL || MemoryArea->DeleteInProgress) { MmUnlockAddressSpace(AddressSpace); From 7b4c7821eceb93bb62d652de86fd67fa3ac76e32 Mon Sep 17 00:00:00 2001 From: Jason Filby Date: Thu, 8 Apr 2004 20:27:10 +0000 Subject: [PATCH 0798/1463] Implement MmIsNonPagedSystemAddressValid as a call to MmIsAddressValid svn path=/trunk/; revision=9040 --- reactos/ntoskrnl/mm/mm.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/ntoskrnl/mm/mm.c b/reactos/ntoskrnl/mm/mm.c index 8c272ff6726..c02f0f944e0 100644 --- a/reactos/ntoskrnl/mm/mm.c +++ b/reactos/ntoskrnl/mm/mm.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: mm.c,v 1.70 2004/04/08 20:05:08 jfilby Exp $ +/* $Id: mm.c,v 1.71 2004/04/08 20:27:10 jfilby Exp $ * * COPYRIGHT: See COPYING in the top directory * PROJECT: ReactOS kernel @@ -118,12 +118,11 @@ NTSTATUS MmReleaseMmInfo(PEPROCESS Process) } /* - * @unimplemented + * @implemented */ BOOLEAN STDCALL MmIsNonPagedSystemAddressValid(PVOID VirtualAddress) { - UNIMPLEMENTED; - return FALSE; + return MmIsAddressValid(VirtualAddress); } /* @@ -156,6 +155,7 @@ BOOLEAN STDCALL MmIsAddressValid(PVOID VirtualAddress) MmLockAddressSpace(AddressSpace); MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace, VirtualAddress); +DbgPrint("validating: MemoryArea: %08x\n", MemoryArea); if (MemoryArea == NULL || MemoryArea->DeleteInProgress) { From 80198861f18382bfa8ad8364bc0e09b889240fd0 Mon Sep 17 00:00:00 2001 From: Jason Filby Date: Thu, 8 Apr 2004 20:49:15 +0000 Subject: [PATCH 0799/1463] Remove a DbgPrint used in testing svn path=/trunk/; revision=9041 --- reactos/ntoskrnl/mm/mm.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/mm/mm.c b/reactos/ntoskrnl/mm/mm.c index c02f0f944e0..b843e5bedbf 100644 --- a/reactos/ntoskrnl/mm/mm.c +++ b/reactos/ntoskrnl/mm/mm.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: mm.c,v 1.71 2004/04/08 20:27:10 jfilby Exp $ +/* $Id: mm.c,v 1.72 2004/04/08 20:49:15 jfilby Exp $ * * COPYRIGHT: See COPYING in the top directory * PROJECT: ReactOS kernel @@ -155,7 +155,6 @@ BOOLEAN STDCALL MmIsAddressValid(PVOID VirtualAddress) MmLockAddressSpace(AddressSpace); MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace, VirtualAddress); -DbgPrint("validating: MemoryArea: %08x\n", MemoryArea); if (MemoryArea == NULL || MemoryArea->DeleteInProgress) { From c7da1f1e6a88cdfdd2b8b0013439628d69e0197e Mon Sep 17 00:00:00 2001 From: Jason Filby Date: Thu, 8 Apr 2004 20:50:02 +0000 Subject: [PATCH 0800/1463] Correct test of value returned from MmQuerySystemSize svn path=/trunk/; revision=9042 --- reactos/regtests/kmregtests/tests/mm-1.c | 38 +++++++++++++----------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/reactos/regtests/kmregtests/tests/mm-1.c b/reactos/regtests/kmregtests/tests/mm-1.c index 6c3a89e1c9f..046fa979429 100644 --- a/reactos/regtests/kmregtests/tests/mm-1.c +++ b/reactos/regtests/kmregtests/tests/mm-1.c @@ -18,7 +18,7 @@ static int RunTest(char *Buffer) HighestAcceptableAddress); if (pmem1 == 0) { - DbgPrint("MmAllocateContiguousMemory() for pmem1 failed\n"); + strcpy(Buffer, "MmAllocateContiguousMemory() for pmem1 failed\n"); return TS_FAILED; } @@ -33,7 +33,7 @@ static int RunTest(char *Buffer) MmNonCached); if (pmem2 == 0) { - DbgPrint("MmAllocateContiguousMemorySpecifyCache() for pmem2 failed\n"); + strcpy(Buffer, "MmAllocateContiguousMemorySpecifyCache() for pmem2 failed\n"); return TS_FAILED; } @@ -48,7 +48,7 @@ static int RunTest(char *Buffer) MmCached); if (pmem3 == 0) { - DbgPrint("MmAllocateContiguousMemorySpecifyCache() for pmem3 failed\n"); + strcpy(Buffer, "MmAllocateContiguousMemorySpecifyCache() for pmem3 failed\n"); return TS_FAILED; } @@ -64,7 +64,7 @@ static int RunTest(char *Buffer) MmWriteCombined); if (pmem4 == 0) { - DbgPrint("MmAllocateContiguousMemorySpecifyCache() for pmem4 failed\n"); + strcpy(Buffer, "MmAllocateContiguousMemorySpecifyCache() for pmem4 failed\n"); return TS_FAILED; } @@ -72,7 +72,7 @@ static int RunTest(char *Buffer) pmem5 = MmAllocateNonCachedMemory(AllocSize5); if (pmem5 == 0) { - DbgPrint("MmAllocateNonCachedMemory() for pmem5 failed\n"); + strcpy(Buffer, "MmAllocateNonCachedMemory() for pmem5 failed\n"); return TS_FAILED; } @@ -80,68 +80,70 @@ static int RunTest(char *Buffer) PhysicalAddress = MmGetPhysicalAddress(pmem1); if (PhysicalAddress.QuadPart == 0) { - DbgPrint("MmGetPhysicalAddress() failed\n"); + strcpy(Buffer, "MmGetPhysicalAddress() failed\n"); return TS_FAILED; } if (MmIsAddressValid(pmem1) == FALSE) { - DbgPrint("MmIsAddressValid() failed for pmem1\n"); + strcpy(Buffer, "MmIsAddressValid() failed for pmem1\n"); return TS_FAILED; } if (MmIsAddressValid(pmem2) == FALSE) { - DbgPrint("MmIsAddressValid() failed for pmem2\n"); + strcpy(Buffer, "MmIsAddressValid() failed for pmem2\n"); return TS_FAILED; } if (MmIsAddressValid(pmem3) == FALSE) { - DbgPrint("MmIsAddressValid() failed for pmem3\n"); + strcpy(Buffer, "MmIsAddressValid() failed for pmem3\n"); return TS_FAILED; } if (MmIsAddressValid(pmem4) == FALSE) { - DbgPrint("MmIsAddressValid() failed for pmem4\n"); + strcpy(Buffer, "MmIsAddressValid() failed for pmem4\n"); return TS_FAILED; } if (MmIsAddressValid(pmem5) == FALSE) { - DbgPrint("MmIsAddressValid() failed for pmem5\n"); + strcpy(Buffer, "MmIsAddressValid() failed for pmem5\n"); return TS_FAILED; } if (MmIsNonPagedSystemAddressValid(pmem1) == FALSE) { - DbgPrint("MmIsAddressValid() failed for pmem1\n"); + strcpy(Buffer, "MmIsAddressValid() failed for pmem1\n"); return TS_FAILED; } if (MmIsNonPagedSystemAddressValid(pmem2) == FALSE) { - DbgPrint("MmIsAddressValid() failed for pmem2\n"); + strcpy(Buffer, "MmIsAddressValid() failed for pmem2\n"); return TS_FAILED; } if (MmIsNonPagedSystemAddressValid(pmem3) == FALSE) { - DbgPrint("MmIsAddressValid() failed for pmem3\n"); + strcpy(Buffer, "MmIsAddressValid() failed for pmem3\n"); return TS_FAILED; } if (MmIsNonPagedSystemAddressValid(pmem4) == FALSE) { - DbgPrint("MmIsAddressValid() failed for pmem4\n"); + strcpy(Buffer, "MmIsAddressValid() failed for pmem4\n"); return TS_FAILED; } if (MmIsNonPagedSystemAddressValid(pmem5) == FALSE) { - DbgPrint("MmIsAddressValid() failed for pmem5\n"); + strcpy(Buffer, "MmIsAddressValid() failed for pmem5\n"); return TS_FAILED; } /* Misc functions */ Server = MmIsThisAnNtAsSystem(); MemSize = MmQuerySystemSize(); - if (MemSize == 0) + if (MemSize != MmSmallSystem && + MemSize != MmMediumSystem && + MemSize != MmLargeSystem) { - DbgPrint("MmQuerySystemSize() failed\n"); + strcpy(Buffer, "MmQuerySystemSize() failed\n"); return TS_FAILED; } From d7d8c7ba0f5616cd31fff2cdbc150b6fa542c1c3 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Thu, 8 Apr 2004 21:14:18 +0000 Subject: [PATCH 0801/1463] - Fix a small bug in RtlUnwind. svn path=/trunk/; revision=9043 --- reactos/lib/ntdll/rtl/exception.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/reactos/lib/ntdll/rtl/exception.c b/reactos/lib/ntdll/rtl/exception.c index 16ce69ffe62..43285853751 100644 --- a/reactos/lib/ntdll/rtl/exception.c +++ b/reactos/lib/ntdll/rtl/exception.c @@ -1,4 +1,4 @@ -/* $Id: exception.c,v 1.16 2003/09/13 06:17:51 vizzini Exp $ +/* $Id: exception.c,v 1.17 2004/04/08 21:14:18 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -40,8 +40,6 @@ KiUserExceptionDispatcher(PEXCEPTION_RECORD ExceptionRecord, EXCEPTION_RECORD NestedExceptionRecord; NTSTATUS Status; - DPRINT("KiUserExceptionDispatcher()\n"); - if (RtlpDispatchException(ExceptionRecord, Context) != ExceptionContinueExecution) { Status = NtContinue(Context, FALSE); From 37bfcac65a7798ddaee33d93e15a2d1ae26a1f60 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Thu, 8 Apr 2004 21:14:21 +0000 Subject: [PATCH 0802/1463] - Register the standard control classes in GetClassInfo[Ex][AW] if needed. svn path=/trunk/; revision=9044 --- reactos/lib/user32/windows/class.c | 79 ++++------------------------- reactos/lib/user32/windows/window.c | 4 +- 2 files changed, 12 insertions(+), 71 deletions(-) diff --git a/reactos/lib/user32/windows/class.c b/reactos/lib/user32/windows/class.c index e422b4d8cec..03b88a02ada 100644 --- a/reactos/lib/user32/windows/class.c +++ b/reactos/lib/user32/windows/class.c @@ -1,4 +1,4 @@ -/* $Id: class.c,v 1.44 2004/01/23 23:38:26 ekohl Exp $ +/* $Id: class.c,v 1.45 2004/04/08 21:14:21 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -15,6 +15,7 @@ #include #include #include +#include @@ -40,6 +41,8 @@ static BOOL GetClassInfoExCommon( str = (LPWSTR)lpszClass; else { + extern BOOL ControlsInitialized; + if (unicode) { str = HEAP_strdupW ( lpszClass, wcslen(lpszClass) ); @@ -61,6 +64,12 @@ static BOOL GetClassInfoExCommon( return FALSE; } } + + /* Register built-in controls if not already done */ + if ( !ControlsInitialized ) + { + ControlsInitialized = ControlsInit(str); + } } str2.Length = str3.Length = 0; @@ -139,74 +148,6 @@ GetClassInfoExW( LPWNDCLASSEXW lpwcx) { return GetClassInfoExCommon(hinst, lpszClass, lpwcx, TRUE); - - // AG: I've kept this here (commented out) in case of bugs with my - // own "common" routine (see above): - -/*LPWSTR str; - UNICODE_STRING str2; - WNDCLASSEXW w; - BOOL retval; - - if ( !lpszClass || !lpwcx ) - { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - - if(IS_ATOM(lpszClass)) - str = (LPWSTR)lpszClass; - else - { - str = HEAP_strdupW ( lpszClass, wcslen(lpszClass) ); - if ( !str ) - { - SetLastError (RtlNtStatusToDosError(STATUS_NO_MEMORY)); - return FALSE; - } - } - - str2.Length = str3.Length = 0; - str2.MaximumLength = str3.MaximumLength = 255; - str2.Buffer = (PWSTR)HEAP_alloc ( str2.MaximumLength * sizeof(WCHAR) ); - if ( !str2.Buffer ) - { - SetLastError (RtlNtStatusToDosError(STATUS_NO_MEMORY)); - if ( !IS_ATOM(str) ) - HEAP_free ( str ); - return FALSE; - } - - str3.Buffer = (PWSTR)HEAP_alloc ( str3.MaximumLength * sizeof(WCHAR) ); - if ( !str3.Buffer ) - { - SetLastError (RtlNtStatusToDosError(STATUS_NO_MEMORY)); - if ( !IS_ATOM(str) ) - HEAP_free ( str ); - HEAP_free ( str2.Buffer ); - return FALSE; - } - - w.lpszMenuName = (LPCWSTR)&str2; - w.lpszClassName = (LPCWSTR)&str3; - retval = (BOOL)NtUserGetClassInfo(hinst, str, &w, TRUE, 0); - if ( !IS_ATOM(str) ) - HEAP_free(str); - RtlCopyMemory ( lpwcx, &w, sizeof(WNDCLASSEXW) ); - - if ( !IS_INTRESOURCE(w.lpszMenuName) && w.lpszMenuName ) - { - lpwcx->lpszMenuName = heap_string_poolW ( str2.Buffer, str2.Length ); - } - if ( !IS_ATOM(w.lpszClassName) && w.lpszClassName ) - { - lpwcx->lpszClassName = heap_string_poolW ( str3.Buffer, str3.Length ); - } - - HEAP_free ( str2.Buffer ); - HEAP_free ( str3.Buffer ); - - return retval;*/ } diff --git a/reactos/lib/user32/windows/window.c b/reactos/lib/user32/windows/window.c index f2a60f70690..37b09e0429a 100644 --- a/reactos/lib/user32/windows/window.c +++ b/reactos/lib/user32/windows/window.c @@ -1,4 +1,4 @@ -/* $Id: window.c,v 1.106 2004/04/07 08:25:40 gvg Exp $ +/* $Id: window.c,v 1.107 2004/04/08 21:14:21 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -22,7 +22,7 @@ #define NDEBUG #include -static BOOL ControlsInitialized = FALSE; +BOOL ControlsInitialized = FALSE; /* FUNCTIONS *****************************************************************/ From 7f72303d64b70912c23b1934210a549071fade85 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Fri, 9 Apr 2004 11:51:37 +0000 Subject: [PATCH 0803/1463] fix XML formating svn path=/trunk/; revision=9045 --- .../system/explorer/utility/xmlstorage.cpp | 80 ++++++++++++------- .../system/explorer/utility/xmlstorage.h | 20 +---- 2 files changed, 53 insertions(+), 47 deletions(-) diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.cpp b/reactos/subsys/system/explorer/utility/xmlstorage.cpp index e8d970555d1..b4fc7d9eac6 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.cpp +++ b/reactos/subsys/system/explorer/utility/xmlstorage.cpp @@ -75,7 +75,11 @@ XML_Status XMLReader::read(std::istream& in) cerr << get_error_string(); */ - _pos->append_trailing(_content.c_str(), _content.length()); + if (_pos->_children.empty()) + _pos->_trailing.append(_content); + else + _pos->_children.back()->_trailing.append(_content); + _content.erase(); return status; @@ -85,23 +89,24 @@ XML_Status XMLReader::read(std::istream& in) /// store XML version and encoding into XML reader void XMLCALL XMLReader::XML_XmlDeclHandler(void* userData, const XML_Char* version, const XML_Char* encoding, int standalone) { - XMLReader* pThis = (XMLReader*) userData; + XMLReader* pReader = (XMLReader*) userData; if (version) { - pThis->_xml_version = version; - pThis->_encoding = encoding; + pReader->_xml_version = version; + pReader->_encoding = encoding; } } /// notifications about XML start tag void XMLCALL XMLReader::XML_StartElementHandler(void* userData, const XML_Char* name, const XML_Char** atts) { - XMLReader* pThis = (XMLReader*) userData; + XMLReader* pReader = (XMLReader*) userData; + XMLPos& pos = pReader->_pos; // search for end of first line - const char* s = pThis->_content.c_str(); + const char* s = pReader->_content.c_str(); const char* p = s; - const char* e = p + pThis->_content.length(); + const char* e = p + pReader->_content.length(); for(; p_pos->append_trailing(s, p-s); + if (pos->_children.empty()) { // no children in last node? + if (pReader->_last_tag == TAG_START) + pos->_content.append(s, p-s); + else if (pReader->_last_tag == TAG_END) + pos->_trailing.append(s, p-s); + // else TAG_NONE -> don't store white space in root node + } else + pos->_children.back()->_trailing.append(s, p-s); std::string leading; @@ -119,7 +131,7 @@ void XMLCALL XMLReader::XML_StartElementHandler(void* userData, const XML_Char* XMLNode* node = new XMLNode(String_from_XML_Char(name), leading); - pThis->_pos.add_down(node); + pos.add_down(node); while(*atts) { const XML_Char* attr_name = *atts++; @@ -128,19 +140,20 @@ void XMLCALL XMLReader::XML_StartElementHandler(void* userData, const XML_Char* (*node)[String_from_XML_Char(attr_name)] = String_from_XML_Char(attr_value); } - pThis->_in_node = true; - pThis->_content.erase(); + pReader->_last_tag = TAG_START; + pReader->_content.erase(); } /// notifications about XML end tag void XMLCALL XMLReader::XML_EndElementHandler(void* userData, const XML_Char* name) { - XMLReader* pThis = (XMLReader*) userData; + XMLReader* pReader = (XMLReader*) userData; + XMLPos& pos = pReader->_pos; // search for end of first line - const char* s = pThis->_content.c_str(); + const char* s = pReader->_content.c_str(); const char* p = s; - const char* e = p + pThis->_content.length(); + const char* e = p + pReader->_content.length(); for(; p_pos->append_content(s, p-s); + if (pos->_children.empty()) // no children in current node? + pos->_content.append(s, p-s); + else + if (pReader->_last_tag == TAG_START) + pos->_content.append(s, p-s); + else + pos->_children.back()->_trailing.append(s, p-s); if (p != e) - pThis->_pos->_end_leading.assign(p, e-p); + pos->_end_leading.assign(p, e-p); - pThis->_pos.back(); + pos.back(); - pThis->_in_node = false; - pThis->_content.erase(); + pReader->_last_tag = TAG_END; + pReader->_content.erase(); } /// store content, white space and comments void XMLCALL XMLReader::XML_DefaultHandler(void* userData, const XML_Char* s, int len) { - XMLReader* pThis = (XMLReader*) userData; + XMLReader* pReader = (XMLReader*) userData; - pThis->_content.append(s, len); + pReader->_content.append(s, len); } @@ -282,7 +301,9 @@ void XMLNode::smart_write_worker(std::ostream& out, int indent) const for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it) out << ' ' << EncodeXMLString(it->first) << "=\"" << EncodeXMLString(it->second) << "\""; - if (!_children.empty() || !_content.empty()) { + if (_children.empty() && _content.empty()) + out << "/>"; + else { out << '>'; if (_content.empty()) @@ -292,19 +313,20 @@ void XMLNode::smart_write_worker(std::ostream& out, int indent) const Children::const_iterator it = _children.begin(); - if (it != _children.end()) + if (it != _children.end()) { for(; it!=_children.end(); ++it) (*it)->smart_write_worker(out, indent+1); - if (_end_leading.empty()) - for(int i=indent; i--; ) - out << XML_INDENT_SPACE; - else + if (_end_leading.empty()) + for(int i=indent; i--; ) + out << XML_INDENT_SPACE; + else + out << _end_leading; + } else out << _end_leading; out << "'; - } else - out << "/>"; + } if (_trailing.empty()) out << '\n'; diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.h b/reactos/subsys/system/explorer/utility/xmlstorage.h index 5c9e9de3dff..7ad07c24cb1 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.h +++ b/reactos/subsys/system/explorer/utility/xmlstorage.h @@ -576,22 +576,6 @@ protected: } #endif - void append_content(const char* s, int l) - { - //if (_children.empty()) - _content.append(s, l); - //else - // _children.back()->_content.append(s, l); - } - - void append_trailing(const char* s, int l) - { - if (_children.empty()) - _content.append(s, l); - else - _children.back()->_trailing.append(s, l); - } - void write_worker(std::ostream& out, int indent) const; void pretty_write_worker(std::ostream& out, int indent) const; void smart_write_worker(std::ostream& out, int indent) const; @@ -1227,7 +1211,7 @@ struct XMLReader XML_SetElementHandler(_parser, XML_StartElementHandler, XML_EndElementHandler); XML_SetDefaultHandler(_parser, XML_DefaultHandler); - _in_node = false; + _last_tag = TAG_NONE; } ~XMLReader() @@ -1265,7 +1249,7 @@ protected: std::string _encoding; std::string _content; - bool _in_node; + enum {TAG_NONE, TAG_START, TAG_END} _last_tag; static void XMLCALL XML_XmlDeclHandler(void* userData, const XML_Char* version, const XML_Char* encoding, int standalone); static void XMLCALL XML_StartElementHandler(void* userData, const XML_Char* name, const XML_Char** atts); From 50133e0fadc6a7f4e54a37fb3716f455536d1a9d Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Fri, 9 Apr 2004 18:27:11 +0000 Subject: [PATCH 0804/1463] added tool for easy installation of the VMware SVGA driver svn path=/trunk/; revision=9047 --- reactos/Makefile | 4 +- reactos/lib/syssetup/install.c | 28 +- reactos/subsys/system/vmwinst/.cvsignore | 6 + reactos/subsys/system/vmwinst/Makefile | 23 + reactos/subsys/system/vmwinst/vmwinst.c | 845 +++++++++++++++++++++++ reactos/subsys/system/vmwinst/vmwinst.h | 41 ++ reactos/subsys/system/vmwinst/vmwinst.rc | 133 ++++ 7 files changed, 1077 insertions(+), 3 deletions(-) create mode 100644 reactos/subsys/system/vmwinst/.cvsignore create mode 100644 reactos/subsys/system/vmwinst/Makefile create mode 100644 reactos/subsys/system/vmwinst/vmwinst.c create mode 100644 reactos/subsys/system/vmwinst/vmwinst.h create mode 100644 reactos/subsys/system/vmwinst/vmwinst.rc diff --git a/reactos/Makefile b/reactos/Makefile index a284f9bfba6..7fac3df5588 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.214 2004/04/07 18:05:16 gvg Exp $ +# $Id: Makefile,v 1.215 2004/04/09 18:27:10 weiden Exp $ # # Global makefile # @@ -92,7 +92,7 @@ STORAGE_DRIVERS = atapi cdrom class2 disk scsiport diskdump # System applications # autochk cmd format services setup usetup welcome winlogon -SYS_APPS = autochk cmd explorer format services setup taskmgr userinit usetup welcome winlogon regedit +SYS_APPS = autochk cmd explorer format services setup taskmgr userinit usetup welcome vmwinst winlogon regedit # System services # rpcss eventlog diff --git a/reactos/lib/syssetup/install.c b/reactos/lib/syssetup/install.c index 840f0d572d4..65c5d66ed69 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.9 2004/03/21 14:37:19 navaraf Exp $ +/* $Id: install.c,v 1.10 2004/04/09 18:27:10 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -38,6 +38,7 @@ #include "resource.h" // #define NO_GUI +#define VMWINST #if 0 VOID Wizard (VOID); @@ -77,6 +78,28 @@ DebugPrint(char* fmt,...) #endif } +#ifdef VMWINST +static BOOL +RunVMWInstall(VOID) +{ + PROCESS_INFORMATION ProcInfo; + STARTUPINFO si; + + ZeroMemory(&si, sizeof(STARTUPINFO)); + si.cb = sizeof(STARTUPINFO); + + if(CreateProcessA(NULL, "vmwinst.exe", NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, + NULL, NULL, &si, &ProcInfo)) + { + WaitForSingleObject(ProcInfo.hProcess, INFINITE); + CloseHandle(ProcInfo.hThread); + CloseHandle(ProcInfo.hProcess); + return TRUE; + } + return FALSE; +} +#endif + static VOID CreateRandomSid (PSID *Sid) @@ -270,6 +293,9 @@ InstallReactOS (HINSTANCE hInstance) Wizard (); #endif +#ifdef VMWINST + RunVMWInstall(); +#endif DialogBox( GetModuleHandle(TEXT("syssetup.dll")), MAKEINTRESOURCE(IDD_RESTART), diff --git a/reactos/subsys/system/vmwinst/.cvsignore b/reactos/subsys/system/vmwinst/.cvsignore new file mode 100644 index 00000000000..e24713815a0 --- /dev/null +++ b/reactos/subsys/system/vmwinst/.cvsignore @@ -0,0 +1,6 @@ +*.o +*.d +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/reactos/subsys/system/vmwinst/Makefile b/reactos/subsys/system/vmwinst/Makefile new file mode 100644 index 00000000000..c259e07625a --- /dev/null +++ b/reactos/subsys/system/vmwinst/Makefile @@ -0,0 +1,23 @@ +# $Id: Makefile,v 1.1 2004/04/09 18:27:11 weiden Exp $ + +PATH_TO_TOP = ../../.. + +TARGET_TYPE = program + +TARGET_APPTYPE = windows + +TARGET_NAME = vmwinst + +TARGET_INSTALLDIR = system32 + +TARGET_CFLAGS = -Wall -Werror -D__USE_W32API -DUNICODE -D_WIN32_IE=0x0501 -D_WIN32_WINNT=0x0501 + +TARGET_SDKLIBS = kernel32.a ntdll.a + +TARGET_GCCLIBS = msvcrt advapi32 kernel32 comctl32 comdlg32 shell32 + +TARGET_OBJECTS = $(TARGET_NAME).o + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk diff --git a/reactos/subsys/system/vmwinst/vmwinst.c b/reactos/subsys/system/vmwinst/vmwinst.c new file mode 100644 index 00000000000..8665da01127 --- /dev/null +++ b/reactos/subsys/system/vmwinst/vmwinst.c @@ -0,0 +1,845 @@ +/* + * ReactOS applications + * 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: vmwinst.c,v 1.1 2004/04/09 18:27:11 weiden Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS VMware(r) driver installation utility + * FILE: subsys/system/vmwinst/vmwinst.c + * PROGRAMMERS: Thomas Weidenmueller (w3seek@users.sourceforge.net) + */ +#include +#include +#include +#include +#include "vmwinst.h" + +HINSTANCE hAppInstance; +BOOL StartVMwConfigWizard, ActivateVBE = FALSE, UninstallDriver = FALSE; + +static WCHAR DestinationDriversPath[MAX_PATH+1]; +static WCHAR CDDrive = L'\0'; +static WCHAR PathToVideoDrivers45[MAX_PATH+1] = L"X:\\program files\\VMware\\VMware Tools\\Drivers\\video\\winnt2k\\"; +static WCHAR PathToVideoDrivers40[MAX_PATH+1] = L"X:\\video\\winnt2k\\"; +static WCHAR DestinationPath[MAX_PATH+1]; +static WCHAR *vmx_fb = L"vmx_fb.dll"; +static WCHAR *vmx_mode = L"vmx_mode.dll"; +static WCHAR *vmx_svga = L"vmx_svga.sys"; + +static WCHAR *SrcPath = PathToVideoDrivers45; + +/* Helper functions */ + +LONG WINAPI ExceptionHandler(LPEXCEPTION_POINTERS ExceptionInfo) +{ + /* This is rude, but i don't know how to continue execution properly, that's why + we just exit here when we're not running inside of VMware */ + ExitProcess(ExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_PRIVILEGED_INSTRUCTION); + return EXCEPTION_CONTINUE_EXECUTION; +} + +BOOL +DetectVMware(int *Version) +{ + int magic, ver; + + magic = 0; + ver = 0; + + /* Try using a VMware I/O port. If not running in VMware this'll throw an + exception! */ + __asm__ __volatile__("inl %%dx, %%eax" + : "=a" (ver), "=b" (magic) + : "0" (0x564d5868), "d" (0x5658), "c" (0xa)); + + if(magic == 0x564d5868) + { + *Version = ver; + return TRUE; + } + + return FALSE; +} + +BOOL +ProcessMessage(void) +{ + MSG msg; + if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + return TRUE; + } + return FALSE; +} + +void +ProcessMessages(void) +{ + while(ProcessMessage()); +} + +/* try to open the file */ +BOOL +FileExists(WCHAR *Path, WCHAR *File) +{ + WCHAR FileName[MAX_PATH + 1]; + HANDLE FileHandle; + + FileName[0] = L'\0'; + wcscat(FileName, Path); + wcscat(FileName, File); + + FileHandle = CreateFile(FileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + + if(FileHandle == INVALID_HANDLE_VALUE) + { + return FALSE; + } + + if(GetFileSize(FileHandle, NULL) <= 0) + { + CloseHandle(FileHandle); + return FALSE; + } + + CloseHandle(FileHandle); + return TRUE; +} + +/* Copy file */ +BOOL +InstallFile(WCHAR *Destination, WCHAR *File) +{ + static char Buffer[1024]; + WCHAR SourceFileName[MAX_PATH + 1]; + WCHAR DestFileName[MAX_PATH + 1]; + HANDLE SourceFileHandle, DestFileHandle; + DWORD DataRead, DataWritten; + + SourceFileName[0] = L'\0'; + DestFileName[0] = L'\0'; + wcscat(SourceFileName, SrcPath); + wcscat(SourceFileName, File); + wcscat(DestFileName, Destination); + wcscat(DestFileName, File); + + SourceFileHandle = CreateFile(SourceFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if(SourceFileHandle == INVALID_HANDLE_VALUE) + { + return FALSE; + } + DestFileHandle = CreateFile(DestFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + if(DestFileHandle == INVALID_HANDLE_VALUE) + { + CloseHandle(SourceFileHandle); + return FALSE; + } + + while(ReadFile(SourceFileHandle, Buffer, sizeof(Buffer), &DataRead, NULL) && DataRead > 0) + { + if(!WriteFile(DestFileHandle, Buffer, DataRead, &DataWritten, NULL) || + DataRead != DataWritten) + { + CloseHandle(SourceFileHandle); + CloseHandle(DestFileHandle); + DeleteFile(DestFileName); + return FALSE; + } + } + + CloseHandle(SourceFileHandle); + CloseHandle(DestFileHandle); + return TRUE; +} + +/* Find the drive with the inserted VMware cd-rom */ +BOOL +IsVMwareCDInDrive(WCHAR *Drv) +{ + static WCHAR Drive[4] = L"X:\\"; + WCHAR Current; + + *Drv = L'\0'; + for(Current = 'C'; Current <= 'Z'; Current++) + { + Drive[0] = Current; +#if CHECKDRIVETYPE + if(GetDriveType(Drive) == DRIVE_CDROM) + { +#endif + PathToVideoDrivers40[0] = Current; + PathToVideoDrivers45[0] = Current; + if(SetCurrentDirectory(PathToVideoDrivers45)) + SrcPath = PathToVideoDrivers45; + else if(SetCurrentDirectory(PathToVideoDrivers40)) + SrcPath = PathToVideoDrivers40; + else + { + SetCurrentDirectory(DestinationPath); + continue; + } + + if(FileExists(SrcPath, vmx_fb) && + FileExists(SrcPath, vmx_mode) && + FileExists(SrcPath, vmx_svga)) + { + *Drv = Current; + return TRUE; + } +#if CHECKDRIVETYPE + } +#endif + } + + return FALSE; +} + +BOOL +LoadResolutionSettings(DWORD *ResX, DWORD *ResY, DWORD *ColDepth) +{ + HKEY hReg; + DWORD Type, Size; + + if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, + L"SYSTEM\\CurrentControlSet\\Hardware Profiles\\Current\\System\\CurrentControlSet\\Services\\vmx_svga\\Device0", + 0, KEY_QUERY_VALUE, &hReg) != ERROR_SUCCESS) + { + return FALSE; + } + if(RegQueryValueEx(hReg, L"DefaultSettings.BitsPerPel", 0, &Type, (BYTE*)ColDepth, &Size) != ERROR_SUCCESS || + Type != REG_DWORD) + { + RegCloseKey(hReg); + return FALSE; + } + + if(RegQueryValueEx(hReg, L"DefaultSettings.XResolution", 0, &Type, (BYTE*)ResX, &Size) != ERROR_SUCCESS || + Type != REG_DWORD) + { + RegCloseKey(hReg); + return FALSE; + } + + if(RegQueryValueEx(hReg, L"DefaultSettings.YResolution", 0, &Type, (BYTE*)ResY, &Size) != ERROR_SUCCESS || + Type != REG_DWORD) + { + RegCloseKey(hReg); + return FALSE; + } + + RegCloseKey(hReg); + return TRUE; +} + +BOOL +IsVmwSVGAEnabled(VOID) +{ + HKEY hReg; + DWORD Type, Size, Value; + + if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, + L"SYSTEM\\CurrentControlSet\\Services\\vmx_svga", + 0, KEY_QUERY_VALUE, &hReg) != ERROR_SUCCESS) + { + return FALSE; + } + if(RegQueryValueEx(hReg, L"Start", 0, &Type, (BYTE*)&Value, &Size) != ERROR_SUCCESS || + Type != REG_DWORD) + { + RegCloseKey(hReg); + return FALSE; + } + + RegCloseKey(hReg); + return (Value == 1); +} + +BOOL +SaveResolutionSettings(DWORD ResX, DWORD ResY, DWORD ColDepth) +{ + HKEY hReg; + + if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, + L"SYSTEM\\CurrentControlSet\\Hardware Profiles\\Current\\System\\CurrentControlSet\\Services\\vmx_svga\\Device0", + 0, KEY_QUERY_VALUE, &hReg) != ERROR_SUCCESS) + { + return FALSE; + } + if(RegSetValueEx(hReg, L"DefaultSettings.BitsPerPel", 0, REG_DWORD, (BYTE*)&ColDepth, sizeof(DWORD)) != ERROR_SUCCESS) + { + RegCloseKey(hReg); + return FALSE; + } + + if(RegSetValueEx(hReg, L"DefaultSettings.XResolution", 0, REG_DWORD, (BYTE*)&ResX, sizeof(DWORD)) != ERROR_SUCCESS) + { + RegCloseKey(hReg); + return FALSE; + } + + if(RegSetValueEx(hReg, L"DefaultSettings.YResolution", 0, REG_DWORD, (BYTE*)&ResY, sizeof(DWORD)) != ERROR_SUCCESS) + { + RegCloseKey(hReg); + return FALSE; + } + + RegCloseKey(hReg); + return TRUE; +} + +BOOL +EnableDriver(WCHAR *Key, BOOL Enable) +{ + DWORD Value; + HKEY hReg; + + Value = (Enable ? 1 : 4); + + if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, Key, 0, KEY_SET_VALUE, &hReg) != ERROR_SUCCESS) + { + return FALSE; + } + if(RegSetValueEx(hReg, L"Start", 0, REG_DWORD, (BYTE*)&Value, sizeof(DWORD)) != ERROR_SUCCESS) + { + RegCloseKey(hReg); + return FALSE; + } + + RegCloseKey(hReg); + return TRUE; +} + +/* Activate the vmware driver and deactivate the others */ +BOOL +EnableVmwareDriver(BOOL VBE, BOOL VGA, BOOL VMX) +{ + if(!EnableDriver(L"SYSTEM\\CurrentControlSet\\Services\\VBE", VBE)) + { + return FALSE; + } + if(!EnableDriver(L"SYSTEM\\CurrentControlSet\\Services\\vga", VGA)) + { + return FALSE; + } + if(!EnableDriver(L"SYSTEM\\CurrentControlSet\\Services\\vmx_svga", VMX)) + { + return FALSE; + } + + return TRUE; +} + +/* GUI */ + +void +InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc) +{ + ZeroMemory(psp, sizeof(PROPSHEETPAGE)); + psp->dwSize = sizeof(PROPSHEETPAGE); + psp->dwFlags = PSP_DEFAULT; + psp->hInstance = hAppInstance; + psp->pszTemplate = MAKEINTRESOURCE(idDlg); + psp->pfnDlgProc = DlgProc; +} + +/* Property page dialog callback */ +int CALLBACK +PageWelcomeProc( + HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam +) +{ + switch(uMsg) + { + case WM_NOTIFY: + { + LPNMHDR pnmh = (LPNMHDR)lParam; + switch(pnmh->code) + { + case PSN_SETACTIVE: + PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT); + break; + } + break; + } + } + return FALSE; +} + +/* Property page dialog callback */ +int CALLBACK +PageInsertDiscProc( + HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam +) +{ + switch(uMsg) + { + case WM_NOTIFY: + { + LPNMHDR pnmh = (LPNMHDR)lParam; + switch(pnmh->code) + { + case PSN_SETACTIVE: + PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_NEXT); + break; + case PSN_WIZNEXT: + PropSheet_SetWizButtons(GetParent(hwndDlg), 0); + ProcessMessages(); + if(!IsVMwareCDInDrive(&CDDrive)) + { + WCHAR Msg[1024]; + LoadString(hAppInstance, IDS_FAILEDTOLOCATEDRIVERS, Msg, sizeof(Msg) / sizeof(WCHAR)); + MessageBox(GetParent(hwndDlg), Msg, NULL, MB_ICONWARNING); + PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_NEXT); + SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_INSERT_VMWARE_TOOLS); + return TRUE; + } + + DestinationDriversPath[0] = L'\0'; + wcscat(DestinationDriversPath, DestinationPath); + wcscat(DestinationDriversPath, L"drivers\\"); + if(!InstallFile(DestinationPath, vmx_fb) || + !InstallFile(DestinationPath, vmx_mode) || + !InstallFile(DestinationDriversPath, vmx_svga)) + { + WCHAR Msg[1024]; + LoadString(hAppInstance, IDS_FAILEDTOCOPYFILES, Msg, sizeof(Msg) / sizeof(WCHAR)); + MessageBox(GetParent(hwndDlg), Msg, NULL, MB_ICONWARNING); + PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_NEXT); + SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_INSERT_VMWARE_TOOLS); + return TRUE; + } + + if(!EnableVmwareDriver(FALSE, FALSE, TRUE)) + { + WCHAR Msg[1024]; + LoadString(hAppInstance, IDS_FAILEDTOACTIVATEDRIVER, Msg, sizeof(Msg) / sizeof(WCHAR)); + MessageBox(GetParent(hwndDlg), Msg, NULL, MB_ICONWARNING); + SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_INSTALLATION_FAILED); + return TRUE; + } + + PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_NEXT); + break; + } + break; + } + } + return FALSE; +} + +/* Property page dialog callback */ +BOOL CALLBACK +PageInstallFailedProc( + HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam +) +{ + switch(uMsg) + { + case WM_NOTIFY: + { + LPNMHDR pnmh = (LPNMHDR)lParam; + switch(pnmh->code) + { + case PSN_SETACTIVE: + PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_FINISH); + break; + } + break; + } + } + return FALSE; +} + +void +FillComboBox(HWND Dlg, int idComboBox, int From, int To) +{ + int i; + WCHAR Text[256]; + + for(i = From; i <= To; i++) + { + if(LoadString(hAppInstance, i, Text, 255) > 0) + { + SendDlgItemMessage(Dlg, idComboBox, CB_ADDSTRING, 0, (LPARAM)Text); + } + } +} + +typedef struct +{ + int ControlID; + int ResX; + int ResY; +} MAPCTLRES; + +/* Property page dialog callback */ +BOOL CALLBACK +PageConfigProc( + HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam +) +{ + switch(uMsg) + { + case WM_INITDIALOG: + { + DWORD ResX = 0, ResY = 0, ColDepth = 0; + int cbSel; + + FillComboBox(hwndDlg, IDC_COLORQUALITY, 10001, 10003); + if(LoadResolutionSettings(&ResX, &ResY, &ColDepth)) + { + SendDlgItemMessage(hwndDlg, ResX + ResY, BM_SETCHECK, BST_CHECKED, 0); + switch(ColDepth) + { + case 8: + cbSel = 0; + break; + case 16: + cbSel = 1; + break; + case 32: + cbSel = 2; + break; + default: + cbSel = -1; + break; + } + SendDlgItemMessage(hwndDlg, IDC_COLORQUALITY, CB_SETCURSEL, cbSel, 0); + } + break; + } + case WM_NOTIFY: + { + LPNMHDR pnmh = (LPNMHDR)lParam; + switch(pnmh->code) + { + case PSN_SETACTIVE: + { + PropSheet_SetWizButtons(GetParent(hwndDlg), (StartVMwConfigWizard ? PSWIZB_FINISH | PSWIZB_BACK : PSWIZB_FINISH)); + break; + } + case PSN_WIZBACK: + { + if(StartVMwConfigWizard) + { + SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_CHOOSEACTION); + return TRUE; + } + break; + } + case PSN_WIZFINISH: + { + DWORD rx = 800, ry = 600, cd = 32; + int i; + static MAPCTLRES Resolutions[11] = { + {540, 640, 480}, + {1400, 800, 600}, + {1792, 1024, 768}, + {2016, 1152, 864}, + {2240, 1280, 960}, + {2304, 1280, 1024}, + {2450, 1400, 1050}, + {2800, 1600, 1200}, + {3136, 1792, 1344}, + {3248, 1856, 1392}, + {3360, 1920, 1440} + }; + for(i = 0; i < 11; i++) + { + if(SendDlgItemMessage(hwndDlg, Resolutions[i].ControlID, BM_GETCHECK, 0, 0) == BST_CHECKED) + { + rx = Resolutions[i].ResX; + ry = Resolutions[i].ResY; + break; + } + } + + switch(SendDlgItemMessage(hwndDlg, IDC_COLORQUALITY, CB_GETCURSEL, 0, 0)) + { + case 0: + cd = 8; + break; + case 1: + cd = 16; + break; + case 2: + cd = 32; + break; + } + + SaveResolutionSettings(rx, ry, cd); + break; + } + } + break; + } + } + return FALSE; +} + +/* Property page dialog callback */ +BOOL CALLBACK +PageChooseActionProc( + HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam +) +{ + switch(uMsg) + { + case WM_INITDIALOG: + SendDlgItemMessage(hwndDlg, IDC_CONFIGSETTINGS, BM_SETCHECK, BST_CHECKED, 0); + break; + case WM_NOTIFY: + { + LPNMHDR pnmh = (LPNMHDR)lParam; + switch(pnmh->code) + { + case PSN_SETACTIVE: + PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT); + break; + case PSN_WIZBACK: + { + SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_CHOOSEACTION); + return TRUE; + } + case PSN_WIZNEXT: + { + static ULONG SelPage[4] = {IDD_CONFIG, IDD_SELECTDRIVER, IDD_SELECTDRIVER, IDD_CHOOSEACTION}; + int i; + + for(i = IDC_CONFIGSETTINGS; i <= IDC_UNINSTALL; i++) + { + if(SendDlgItemMessage(hwndDlg, i, BM_GETCHECK, 0, 0) == BST_CHECKED) + { + break; + } + } + + UninstallDriver = (i == IDC_UNINSTALL); + + SetWindowLong(hwndDlg, DWL_MSGRESULT, SelPage[i - IDC_CONFIGSETTINGS]); + return TRUE; + } + } + break; + } + } + return FALSE; +} + +/* Property page dialog callback */ +BOOL CALLBACK +PageSelectDriverProc( + HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam +) +{ + switch(uMsg) + { + case WM_INITDIALOG: + SendDlgItemMessage(hwndDlg, IDC_VGA, BM_SETCHECK, BST_CHECKED, 0); + break; + case WM_NOTIFY: + { + LPNMHDR pnmh = (LPNMHDR)lParam; + switch(pnmh->code) + { + case PSN_SETACTIVE: + PropSheet_SetWizButtons(GetParent(hwndDlg), (UninstallDriver ? PSWIZB_NEXT | PSWIZB_BACK : PSWIZB_BACK | PSWIZB_FINISH)); + break; + case PSN_WIZBACK: + { + SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_CHOOSEACTION); + return TRUE; + } + case PSN_WIZNEXT: + { + ActivateVBE = (SendDlgItemMessage(hwndDlg, IDC_VBE, BM_GETCHECK, 0, 0) == BST_CHECKED); + + if(UninstallDriver) + { + return FALSE; + } + return TRUE; + } + case PSN_WIZFINISH: + { + if(UninstallDriver) + { + return FALSE; + } + ActivateVBE = (SendDlgItemMessage(hwndDlg, IDC_VBE, BM_GETCHECK, 0, 0) == BST_CHECKED); + if(!EnableVmwareDriver(ActivateVBE, + !ActivateVBE, + FALSE)) + { + WCHAR Msg[1024]; + LoadString(hAppInstance, (ActivateVBE ? IDS_FAILEDTOSELVBEDRIVER : IDS_FAILEDTOSELVGADRIVER), Msg, sizeof(Msg) / sizeof(WCHAR)); + MessageBox(GetParent(hwndDlg), Msg, NULL, MB_ICONWARNING); + SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_SELECTDRIVER); + return TRUE; + } + break; + } + } + break; + } + } + return FALSE; +} + +VOID +ShowUninstNotice(HWND Owner) +{ + WCHAR Msg[1024]; + LoadString(hAppInstance, IDS_UNINSTNOTICE, Msg, sizeof(Msg) / sizeof(WCHAR)); + MessageBox(Owner, Msg, NULL, MB_ICONINFORMATION); +} + +BOOL CALLBACK +PageDoUninstallProc( + HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam +) +{ + switch(uMsg) + { + case WM_NOTIFY: + { + LPNMHDR pnmh = (LPNMHDR)lParam; + switch(pnmh->code) + { + case PSN_SETACTIVE: + PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_FINISH); + break; + case PSN_WIZFINISH: + { + if(UninstallDriver) + { + if(!EnableVmwareDriver(ActivateVBE, + !ActivateVBE, + FALSE)) + { + WCHAR Msg[1024]; + LoadString(hAppInstance, (ActivateVBE ? IDS_FAILEDTOSELVBEDRIVER : IDS_FAILEDTOSELVGADRIVER), Msg, sizeof(Msg) / sizeof(WCHAR)); + MessageBox(GetParent(hwndDlg), Msg, NULL, MB_ICONWARNING); + SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_SELECTDRIVER); + return TRUE; + } + ShowUninstNotice(GetParent(hwndDlg)); + } + return FALSE; + } + } + break; + } + } + return FALSE; +} + +static LONG +CreateWizard(VOID) +{ + PROPSHEETPAGE psp[7]; + PROPSHEETHEADER psh; + WCHAR Caption[1024]; + + LoadString(hAppInstance, IDS_WIZARD_NAME, Caption, sizeof(Caption) / sizeof(TCHAR)); + + ZeroMemory(&psh, sizeof(PROPSHEETHEADER)); + psh.dwSize = sizeof(PROPSHEETHEADER); + psh.dwFlags = PSH_PROPSHEETPAGE | PSH_WIZARD; + psh.hwndParent = NULL; + psh.hInstance = hAppInstance; + psh.hIcon = 0; + psh.pszCaption = Caption; + psh.nPages = 7; + psh.nStartPage = (StartVMwConfigWizard ? 4 : 0); + psh.ppsp = psp; + + InitPropSheetPage(&psp[0], IDD_WELCOMEPAGE, PageWelcomeProc); + InitPropSheetPage(&psp[1], IDD_INSERT_VMWARE_TOOLS, PageInsertDiscProc); + InitPropSheetPage(&psp[2], IDD_CONFIG, PageConfigProc); + InitPropSheetPage(&psp[3], IDD_INSTALLATION_FAILED, PageInstallFailedProc); + InitPropSheetPage(&psp[4], IDD_CHOOSEACTION, PageChooseActionProc); + InitPropSheetPage(&psp[5], IDD_SELECTDRIVER, PageSelectDriverProc); + InitPropSheetPage(&psp[6], IDD_DOUNINSTALL, PageDoUninstallProc); + + return (LONG)(PropertySheet(&psh) != -1); +} + +int WINAPI +WinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpszCmdLine, + int nCmdShow) +{ + LPTOP_LEVEL_EXCEPTION_FILTER OldHandler; + int Version; + WCHAR *lc; + + hAppInstance = hInstance; + + /* Setup our exception "handler" ;-) */ + OldHandler = SetUnhandledExceptionFilter(ExceptionHandler); + + if(!DetectVMware(&Version)) + { + ExitProcess(1); + return 1; + } + + /* restore the exception handler */ + SetUnhandledExceptionFilter(OldHandler); + + lc = DestinationPath; + lc += GetSystemDirectory(DestinationPath, MAX_PATH) - 1; + if(lc >= DestinationPath && *lc != L'\\') + { + wcscat(DestinationPath, L"\\"); + } + SetCurrentDirectory(DestinationPath); + + StartVMwConfigWizard = IsVmwSVGAEnabled(); + + /* Show the wizard */ + CreateWizard(); + + return 2; +} + diff --git a/reactos/subsys/system/vmwinst/vmwinst.h b/reactos/subsys/system/vmwinst/vmwinst.h new file mode 100644 index 00000000000..c62a5801b9d --- /dev/null +++ b/reactos/subsys/system/vmwinst/vmwinst.h @@ -0,0 +1,41 @@ +#ifndef __VMWINST_H +#define __VMWINST_H + +#ifndef PSCB_BUTTONPRESSED +#define PSCB_BUTTONPRESSED (3) +#endif + +/* metrics */ +#define PROPSHEETWIDTH 250 +#define PROPSHEETHEIGHT 120 +#define PROPSHEETPADDING 6 +#define SYSTEM_COLUMN (18 * PROPSHEETPADDING) +#define LABELLINE(x) (((PROPSHEETPADDING + 2) * x) + (x + 2)) +#define ICONSIZE 16 + +/* Resource IDs */ + +#define IDS_WIZARD_NAME 100 +#define IDS_FAILEDTOLOCATEDRIVERS 101 +#define IDS_FAILEDTOCOPYFILES 102 +#define IDS_FAILEDTOACTIVATEDRIVER 103 +#define IDS_FAILEDTOSELVGADRIVER 104 +#define IDS_FAILEDTOSELVBEDRIVER 105 +#define IDS_UNINSTNOTICE 106 + +#define IDD_WELCOMEPAGE 100 +#define IDD_INSERT_VMWARE_TOOLS 101 +#define IDD_CONFIG 102 +#define IDD_CHOOSEACTION 103 +#define IDD_SELECTDRIVER 104 +#define IDD_INSTALLATION_FAILED 105 +#define IDD_DOUNINSTALL 106 + +#define IDC_COLORQUALITY 200 +#define IDC_CONFIGSETTINGS 201 +#define IDC_USEOTHERDRIVER 202 +#define IDC_UNINSTALL 203 +#define IDC_VGA 204 +#define IDC_VBE 205 + +#endif /* __VMWINST_H */ diff --git a/reactos/subsys/system/vmwinst/vmwinst.rc b/reactos/subsys/system/vmwinst/vmwinst.rc new file mode 100644 index 00000000000..6277ed31bbe --- /dev/null +++ b/reactos/subsys/system/vmwinst/vmwinst.rc @@ -0,0 +1,133 @@ +#include +#include +#include "vmwinst.h" + +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", "ReactOS VMware(r) driver installation utility\0" + VALUE "FileVersion", RES_STR_FILE_VERSION + VALUE "InternalName", "vmwinst\0" + VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT + VALUE "OriginalFilename", "vmwinst.exe\0" + VALUE "ProductName", RES_STR_PRODUCT_NAME + VALUE "ProductVersion", RES_STR_PRODUCT_VERSION + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +IDD_WELCOMEPAGE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Video Driver Installation" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LTEXT "The ReactOS setup detected, that you run ReactOS inside of VMware(r).\n\n\nIf you like to install the VMware(r) SVGA driver, click 'Next', otherwise click 'Cancel'.",-1,25,25,225,85 +END + +IDD_INSERT_VMWARE_TOOLS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Video Driver Installation" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LTEXT "The ReactOS Setup doesn't come with the VMware(r) SVGA driver.\n\nTherefore go to 'VM' in your VMware(r) workstation menu bar and select 'Install VMware tools...'\n\n\nClick 'Next' to continue or 'Cancel' to skip the SVGA driver installation.",-1,25,25,225,85 +END + +IDD_CONFIG DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Video Driver Installation" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LTEXT "The VMware(r) SVGA driver has been successfully installed. Please choose your favorite screen resolution:",-1,25,5,225,20 + PUSHBUTTON "640x480", 540, 25, 30, 65, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "800x600", 1400, 25, 45, 65, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "1024x768", 1792, 25, 60, 65, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "1152x864", 2016, 25, 75, 65, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "1280x960", 2240, 110, 30, 65, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "1280x1024", 2304, 110, 45, 65, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "1400x1050", 2450, 110, 60, 65, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "1600x1200", 2800, 110, 75, 65, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "1792x1344", 3136, 195, 30, 65, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "1856x1392", 3248, 195, 45, 65, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "1920x1440", 3360, 195, 60, 50, 15, BS_AUTORADIOBUTTON + LTEXT "Please select your favorite color quality:", -1, 25, 93, 225, 12 + COMBOBOX IDC_COLORQUALITY, 25, 105, 75, 80, CBS_DROPDOWNLIST | WS_TABSTOP +END + +IDD_INSTALLATION_FAILED DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Video Driver Installation" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LTEXT "The ReactOS Setup was unable to install the VMware(r) SVGA driver.\n\n\nClick 'Finish' to continue the installation process.",-1,25,25,225,85 +END + +IDD_CHOOSEACTION DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Video Driver Installation" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LTEXT "The VMware(r) SVGA driver is already installed.\n\nPlease choose what you like to do:",-1,25,5,225,30 + PUSHBUTTON "Configure the screen settings", IDC_CONFIGSETTINGS, 25, 40, 200, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "Use a different graphics driver", IDC_USEOTHERDRIVER, 25, 55, 200, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "Uninstall the VMware(r) SVGA driver", IDC_UNINSTALL, 25, 70, 200, 15, BS_AUTORADIOBUTTON + LTEXT "Click 'Next' to continue or 'Cancel' to exit the wizard.", -1, 25, 93, 225, 12 +END + +IDD_SELECTDRIVER DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Video Driver Installation" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LTEXT "Please select the graphics driver you would like to use:",-1,25,25,225,15 + PUSHBUTTON "ReactOS VGA Driver", IDC_VGA, 25, 40, 225, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "ReactOS VBE Driver (Experimental!)", IDC_VBE, 25, 55, 225, 15, BS_AUTORADIOBUTTON + LTEXT "Click 'Finish' to complete the operation or 'Cancel' to exit the setup without changes.", -1, 25, 93, 225, 20 +END + +IDD_DOUNINSTALL DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Video Driver Installation" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LTEXT "The ReactOS setup is about to uninstall your VMware(r) SVGA driver!!!\n\n\nClick 'Finish' to uninstall the driver or 'Cancel' to leave it as it is.",-1,25,25,225,85 +END + +STRINGTABLE +BEGIN + IDS_WIZARD_NAME "VMware(r) detected" + IDS_FAILEDTOLOCATEDRIVERS "The ReactOS Setup couldn't find the required files.\nPlease make sure the VMware(r) tools CD-ROM is inserted." + IDS_FAILEDTOCOPYFILES "The ReactOS Setup failed to copy the required files.\nPlease make sure the VMware(r) tools CD-ROM is inserted.\n" + IDS_FAILEDTOACTIVATEDRIVER "Failed to activate the VMware(r) SVGA driver!" + IDS_FAILEDTOSELVGADRIVER "Failed to activate the ReactOS VGA driver!" + IDS_FAILEDTOSELVBEDRIVER "Failed to activate the ReactOS VBE driver!" + IDS_UNINSTNOTICE "The VMware(r) SVGA driver files have not yet been deleted.\nPlease delete them manually after a system reboot." +END + +STRINGTABLE +BEGIN + 10001 "Lowest (8BPP)" + 10002 "Medium (16BPP)" + 10003 "Highest (32BPP)" +END + From 05cab1ebfd8a8c8621e406835b0078fa59297375 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Fri, 9 Apr 2004 19:42:21 +0000 Subject: [PATCH 0805/1463] replace previous favorites start menu folder implementation by fast FavoritesMenu (using the internal XML bookmark informations) svn path=/trunk/; revision=9050 --- .../system/explorer/dialogs/searchprogram.cpp | 20 ++- .../system/explorer/dialogs/searchprogram.h | 1 + reactos/subsys/system/explorer/explorer-jp.rc | 4 +- reactos/subsys/system/explorer/explorer.cpp | 36 ++--- .../subsys/system/explorer/explorer_intres.h | 8 +- .../subsys/system/explorer/explorer_intres.rc | 13 +- reactos/subsys/system/explorer/globals.h | 6 +- .../system/explorer/shell/mainframe.cpp | 20 ++- .../system/explorer/taskbar/favorites.cpp | 75 ++++++++-- .../system/explorer/taskbar/favorites.h | 16 ++- .../system/explorer/taskbar/startmenu.cpp | 129 +++++++++++++----- .../system/explorer/taskbar/startmenu.h | 59 ++++++-- 12 files changed, 277 insertions(+), 110 deletions(-) diff --git a/reactos/subsys/system/explorer/dialogs/searchprogram.cpp b/reactos/subsys/system/explorer/dialogs/searchprogram.cpp index 8b8e28327d9..9bf2c3c0754 100644 --- a/reactos/subsys/system/explorer/dialogs/searchprogram.cpp +++ b/reactos/subsys/system/explorer/dialogs/searchprogram.cpp @@ -93,14 +93,15 @@ void CollectProgramsThread::free_dirs() FindProgramDlg::FindProgramDlg(HWND hwnd) : super(hwnd), - _list_ctrl(GetDlgItem(hwnd, IDC_MAILS_FOUND)), + _list_ctrl(GetDlgItem(hwnd, IDC_PROGRAMS_FOUND)), _thread(collect_programs_callback, hwnd, this), _sort(_list_ctrl, CompareFunc/*, (LPARAM)this*/) { SetWindowIcon(hwnd, IDI_REACTOS/*IDI_SEARCH*/); - _resize_mgr.Add(IDC_TOPIC, RESIZE_X); - _resize_mgr.Add(IDC_MAILS_FOUND,RESIZE); + _resize_mgr.Add(IDC_FILTER, RESIZE_X); + _resize_mgr.Add(IDC_CHECK_ENTRIES, MOVE_X); + _resize_mgr.Add(IDC_PROGRAMS_FOUND, RESIZE); _resize_mgr.Resize(+520, +300); @@ -151,7 +152,7 @@ void FindProgramDlg::Refresh(bool delete_cache) _thread.Stop(); TCHAR buffer[1024]; - GetWindowText(GetDlgItem(_hwnd, IDC_TOPIC), buffer, 1024); + GetWindowText(GetDlgItem(_hwnd, IDC_FILTER), buffer, 1024); #ifndef __WINE__ ///@todo _tcslwr(buffer); #endif @@ -290,6 +291,10 @@ int FindProgramDlg::Command(int id, int code) LaunchSelected(); break; + case IDC_CHECK_ENTRIES: + CheckEntries(); + break; + default: return super::Command(id, code); } @@ -298,7 +303,7 @@ int FindProgramDlg::Command(int id, int code) } else if (code == EN_CHANGE) { switch(id) { - case IDC_TOPIC: + case IDC_FILTER: Refresh(); break; } @@ -407,3 +412,8 @@ int CALLBACK FindProgramDlg::CompareFunc(LPARAM lparam1, LPARAM lparam2, LPARAM return sort->_direction? -cmp: cmp; } + +void FindProgramDlg::CheckEntries() +{ + ///@todo check all entries for existing targets, display a list of not working entries and ask the user for permission to delete them +} diff --git a/reactos/subsys/system/explorer/dialogs/searchprogram.h b/reactos/subsys/system/explorer/dialogs/searchprogram.h index 73d84b53768..eccc07e71dd 100644 --- a/reactos/subsys/system/explorer/dialogs/searchprogram.h +++ b/reactos/subsys/system/explorer/dialogs/searchprogram.h @@ -103,6 +103,7 @@ protected: void Refresh(bool delete_cache=false); void add_entry(const FPDEntry& cache_entry); void LaunchSelected(); + void CheckEntries(); static void collect_programs_callback(Entry* entry, void* param); static int CALLBACK CompareFunc(LPARAM lparam1, LPARAM lparam2, LPARAM lparamSort); diff --git a/reactos/subsys/system/explorer/explorer-jp.rc b/reactos/subsys/system/explorer/explorer-jp.rc index 32693228a93..c9590af0c47 100644 --- a/reactos/subsys/system/explorer/explorer-jp.rc +++ b/reactos/subsys/system/explorer/explorer-jp.rc @@ -219,8 +219,8 @@ CAPTION " FONT 9, "MS UI Gothic", 0, 0, 0x1 BEGIN LTEXT "&Filter:",IDC_STATIC,7,9,18,8 - EDITTEXT IDC_TOPIC,34,7,103,14,ES_AUTOHSCROLL - CONTROL "List1",IDC_MAILS_FOUND,"SysListView32",LVS_REPORT | + EDITTEXT IDC_FILTER,34,7,103,14,ES_AUTOHSCROLL + CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,7,25,130,33 END diff --git a/reactos/subsys/system/explorer/explorer.cpp b/reactos/subsys/system/explorer/explorer.cpp index fe269286a11..7bb7aeb7978 100644 --- a/reactos/subsys/system/explorer/explorer.cpp +++ b/reactos/subsys/system/explorer/explorer.cpp @@ -282,15 +282,18 @@ HBITMAP Icon::create_bitmap(COLORREF bk_color, HBRUSH hbrBkgnd, HDC hdc_wnd) con ImageList_DrawEx(himl, _sys_idx, hdc, 0, 0, cx, cy, bk_color, CLR_DEFAULT, ILD_NORMAL); SelectBitmap(hdc, hbmp_old); DeleteDC(hdc); + return hbmp; } else return create_bitmap_from_icon(_hicon, hbrBkgnd, hdc_wnd); } -HICON Icon::create_icon(COLORREF bk_color, HDC hdc_wnd) const + +int Icon::add_to_imagelist(HIMAGELIST himl, HDC hdc_wnd, COLORREF bk_color, HBRUSH bk_brush) const { + int ret; + if (_itype == IT_SYSCACHE) { - return 0; /*@@todo HIMAGELIST himl = g_Globals._icon_cache.get_sys_imagelist(); int cx, cy; @@ -302,9 +305,14 @@ HICON Icon::create_icon(COLORREF bk_color, HDC hdc_wnd) const ImageList_DrawEx(himl, _sys_idx, hdc, 0, 0, cx, cy, bk_color, CLR_DEFAULT, ILD_NORMAL); SelectBitmap(hdc, hbmp_old); DeleteDC(hdc); - return hbmp; -*/ } else - return (HICON) CopyImage(_hicon, IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0); + + ret = ImageList_Add(himl, hbmp, 0); + + DeleteObject(hbmp); + } else + ret = ImageList_AddAlphaIcon(himl, _hicon, bk_brush, hdc_wnd); + + return ret; } HBITMAP create_bitmap_from_icon(HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd) @@ -335,17 +343,6 @@ int ImageList_AddAlphaIcon(HIMAGELIST himl, HICON hIcon, HBRUSH hbrush_bkgnd, HD return ret; } -int ImageList_AddAlphaIcon(HIMAGELIST himl, const Icon& icon, HDC hdc_wnd) -{ - HICON hicon = icon.create_icon(ImageList_GetBkColor(himl), hdc_wnd); - - int ret = ImageList_AddIcon(himl, hicon); - - DeleteObject(hicon); - - return ret; -} - int IconCache::s_next_id = ICID_DYNAMIC; @@ -371,6 +368,7 @@ void IconCache::init() _icons[ICID_NETWORK] = Icon(ICID_NETWORK, IDI_NETWORK); _icons[ICID_COMPUTER] = Icon(ICID_COMPUTER, IDI_COMPUTER); _icons[ICID_LOGOFF] = Icon(ICID_LOGOFF, IDI_LOGOFF); + _icons[ICID_BOOKMARK] = Icon(ICID_BOOKMARK, IDI_DOT_TRANS); } @@ -424,8 +422,12 @@ const Icon& IconCache::extract(LPCTSTR path, int idx) _pathIdxMap[key] = icon; return icon; - } else + } else { + + ///@todo retreive "http://.../favicon.ico" format icons + return _icons[ICID_NONE]; + } } const Icon& IconCache::extract(IExtractIcon* pExtract, LPCTSTR path, int idx) diff --git a/reactos/subsys/system/explorer/explorer_intres.h b/reactos/subsys/system/explorer/explorer_intres.h index b37c6372527..f872478632b 100644 --- a/reactos/subsys/system/explorer/explorer_intres.h +++ b/reactos/subsys/system/explorer/explorer_intres.h @@ -134,8 +134,8 @@ #define IDC_ICON_ALIGN_10 1012 #define IDC_WWW 1012 #define IDC_ICON_ALIGN_11 1013 -#define IDC_TOPIC 1017 -#define IDC_MAILS_FOUND 1018 +#define IDC_FILTER 1017 +#define IDC_PROGRAMS_FOUND 1018 #define IDC_PICTURE 1019 #define IDC_NOTIFY_SHOW 1020 #define IDC_NOTIFY_HIDE 1021 @@ -144,6 +144,8 @@ #define ID_HIDE_INACTIVE_ICONS 1025 #define ID_SHOW_CLOCK 1026 #define ID_DESKTOP_VERSION 1027 +#define IDC_BUTTON1 1028 +#define IDC_CHECK_ENTRIES 1028 #define ID_REFRESH 1704 #define ID_ABOUT_WINEFILE 1705 #define IDC_FILETREE 10001 @@ -195,7 +197,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 166 #define _APS_NEXT_COMMAND_VALUE 40019 -#define _APS_NEXT_CONTROL_VALUE 1028 +#define _APS_NEXT_CONTROL_VALUE 1029 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/reactos/subsys/system/explorer/explorer_intres.rc b/reactos/subsys/system/explorer/explorer_intres.rc index 5bc6adce71f..4c8e02f1a86 100644 --- a/reactos/subsys/system/explorer/explorer_intres.rc +++ b/reactos/subsys/system/explorer/explorer_intres.rc @@ -758,18 +758,19 @@ BEGIN PUSHBUTTON "&Help",254,158,43,47,14 END -IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 144, 65 +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 "Search Program in Startmenu" -FONT 8, "MS Sans Serif", 0, 0, 0x1 +FONT 8, "MS Sans Serif" BEGIN LTEXT "&Filter:",IDC_STATIC,7,9,18,8 - EDITTEXT IDC_TOPIC,34,7,103,14,ES_AUTOHSCROLL - CONTROL "List1",IDC_MAILS_FOUND,"SysListView32",LVS_REPORT | + 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,130,33 + WS_TABSTOP,7,25,186,33 + PUSHBUTTON "&Check Entries",IDC_CHECK_ENTRIES,143,7,50,14 END IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194 @@ -868,7 +869,7 @@ BEGIN IDD_SEARCH_PROGRAM, DIALOG BEGIN LEFTMARGIN, 7 - RIGHTMARGIN, 137 + RIGHTMARGIN, 193 TOPMARGIN, 7 BOTTOMMARGIN, 58 END diff --git a/reactos/subsys/system/explorer/globals.h b/reactos/subsys/system/explorer/globals.h index fe5961da328..e0d65ed2b22 100644 --- a/reactos/subsys/system/explorer/globals.h +++ b/reactos/subsys/system/explorer/globals.h @@ -80,6 +80,7 @@ enum ICON_ID { ICID_NETWORK, ICID_COMPUTER, ICID_LOGOFF, + ICID_BOOKMARK, ICID_DYNAMIC }; @@ -94,7 +95,7 @@ struct Icon { void draw(HDC hdc, int x, int y, int cx, int cy, COLORREF bk_color, HBRUSH bk_brush) const; HBITMAP create_bitmap(COLORREF bk_color, HBRUSH hbrBkgnd, HDC hdc_wnd) const; - HICON create_icon(COLORREF bk_color, HDC hdc_wnd) const; + int add_to_imagelist(HIMAGELIST himl, HDC hdc_wnd, COLORREF bk_color=GetSysColor(COLOR_WINDOW), HBRUSH bk_brush=GetSysColorBrush(COLOR_WINDOW)) const; int get_sysiml_idx() const {return _itype==IT_SYSCACHE? _sys_idx: -1;} @@ -152,9 +153,6 @@ extern HBITMAP create_bitmap_from_icon(HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc /// add icon with alpha channel to imagelist using the specified background color extern int ImageList_AddAlphaIcon(HIMAGELIST himl, HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd); - /// add Icon object to image list -extern int ImageList_AddAlphaIcon(HIMAGELIST himl, const Icon& icon, HDC hdc_wnd); - /// retrieve icon from window extern HICON get_window_icon_small(HWND hwnd); extern HICON get_window_icon_big(HWND hwnd, bool allow_from_class=true); diff --git a/reactos/subsys/system/explorer/shell/mainframe.cpp b/reactos/subsys/system/explorer/shell/mainframe.cpp index 09a6353b2b0..dcd0948e48b 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.cpp +++ b/reactos/subsys/system/explorer/shell/mainframe.cpp @@ -777,7 +777,7 @@ int MainFrame::Notify(int id, NMHDR* pnmh) // display tooltips for bookmark folders if (!node._pfolder->_description.empty()) lstrcpyn(pnmgit->pszText, node._pfolder->_description.c_str(), pnmgit->cchTextMax); - } else { // BookmarkNode::BMNT_BOOKMARK + } else if (node._type == BookmarkNode::BMNT_BOOKMARK) { // display tooltips for bookmark folders String txt = node._pbookmark->_description; @@ -1050,19 +1050,15 @@ void MainFrame::FillBookmarks() TreeView_DeleteAllItems(_hsidebar); + COLORREF bk_color = RGB(255,255,255); HBRUSH hbr_bkgnd = GetStockBrush(WHITE_BRUSH); - ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_FAVORITES), hbr_bkgnd, canvas); - ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_DOT_TRANS), hbr_bkgnd, canvas); + + g_Globals._icon_cache.get_icon(ICID_FAVORITES).add_to_imagelist(_himl, canvas); + g_Globals._icon_cache.get_icon(ICID_BOOKMARK).add_to_imagelist(_himl, canvas); ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_DOT), hbr_bkgnd, canvas); - ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_FOLDER), hbr_bkgnd, canvas); - ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_FOLDER), hbr_bkgnd, canvas); -/*@@ This does not produce the expected result because CopyImage() seems not to duplicate 32 BIT alpha blended images: - ImageList_AddAlphaIcon(_himl, g_Globals._icon_cache.get_icon(ICID_FAVORITES), canvas); - ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_DOT_TRANS), hbr_bkgnd, canvas); - ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_DOT), hbr_bkgnd, canvas); - ImageList_AddAlphaIcon(_himl, g_Globals._icon_cache.get_icon(ICID_FOLDER), canvas); - ImageList_AddAlphaIcon(_himl, g_Globals._icon_cache.get_icon(ICID_FOLDER), canvas); -*/ + g_Globals._icon_cache.get_icon(ICID_FOLDER).add_to_imagelist(_himl, canvas); + g_Globals._icon_cache.get_icon(ICID_FOLDER).add_to_imagelist(_himl, canvas); + TV_INSERTSTRUCT tvi; tvi.hParent = TVI_ROOT; diff --git a/reactos/subsys/system/explorer/taskbar/favorites.cpp b/reactos/subsys/system/explorer/taskbar/favorites.cpp index d6dad9d4162..ab0b6ffc89c 100644 --- a/reactos/subsys/system/explorer/taskbar/favorites.cpp +++ b/reactos/subsys/system/explorer/taskbar/favorites.cpp @@ -106,7 +106,7 @@ bool Bookmark::read(const_XMLPos& pos) } /// write XBEL bookmark node -void Bookmark::write(XMLPos& pos) +void Bookmark::write(XMLPos& pos) const { pos.create("bookmark"); @@ -157,7 +157,7 @@ void BookmarkFolder::read(const_XMLPos& pos) } /// write bookmark folder conten from XBEL formated XML tree -void BookmarkFolder::write(XMLPos& pos) +void BookmarkFolder::write(XMLPos& pos) const { pos.create("folder"); @@ -177,6 +177,12 @@ void BookmarkFolder::write(XMLPos& pos) } +BookmarkNode::BookmarkNode() + : _type(BMNT_NONE) +{ + _pbookmark = NULL; +} + BookmarkNode::BookmarkNode(const Bookmark& bm) : _type(BMNT_BOOKMARK) { @@ -192,20 +198,68 @@ BookmarkNode::BookmarkNode(const BookmarkFolder& bmf) BookmarkNode::BookmarkNode(const BookmarkNode& other) : _type(other._type) { - if (_type == BMNT_BOOKMARK) + if (other._type == BMNT_BOOKMARK) _pbookmark = new Bookmark(*other._pbookmark); - else + else if (other._type == BMNT_FOLDER) _pfolder = new BookmarkFolder(*other._pfolder); + else + _pbookmark = NULL; } BookmarkNode::~BookmarkNode() { if (_type == BMNT_BOOKMARK) delete _pbookmark; - else + else if (_type == BMNT_FOLDER) delete _pfolder; } +BookmarkNode& BookmarkNode::operator=(const Bookmark& bm) +{ + clear(); + + _pbookmark = new Bookmark(bm); + + return *this; +} + +BookmarkNode& BookmarkNode::operator=(const BookmarkFolder& bmf) +{ + clear(); + + _pfolder = new BookmarkFolder(bmf); + + return *this; +} + +BookmarkNode& BookmarkNode::operator=(const BookmarkNode& other) +{ + clear(); + + _type = other._type; + + if (other._type == BMNT_BOOKMARK) + _pbookmark = new Bookmark(*other._pbookmark); + else if (other._type == BMNT_FOLDER) + _pfolder = new BookmarkFolder(*other._pfolder); + + return *this; +} + +void BookmarkNode::clear() +{ + if (_type == BMNT_BOOKMARK) { + delete _pbookmark; + _pbookmark = NULL; + } + else if (_type == BMNT_FOLDER) { + delete _pfolder; + _pfolder = NULL; + } + + _type = BMNT_NONE; +} + /// read bookmark list from XBEL formated XML tree void BookmarkList::read(const_XMLPos& pos) @@ -238,13 +292,13 @@ void BookmarkList::write(XMLPos& pos) const const BookmarkNode& node = *it; if (node._type == BookmarkNode::BMNT_FOLDER) { - BookmarkFolder& folder = *node._pfolder; + const BookmarkFolder& folder = *node._pfolder; folder.write(pos); pos.back(); - } else { // BookmarkNode::BMNT_BOOKMARK - Bookmark& bookmark = *node._pbookmark; + } else if (node._type == BookmarkNode::BMNT_BOOKMARK) { + const Bookmark& bookmark = *node._pbookmark; if (!bookmark._url.empty()) bookmark.write(pos); @@ -278,7 +332,7 @@ void BookmarkList::fill_tree(HWND hwnd, HTREEITEM parent, HIMAGELIST himagelist, HTREEITEM hitem = TreeView_InsertItem(hwnd, &tvi); folder._bookmarks.fill_tree(hwnd, hitem, himagelist, hdc_wnd); - } else { + } else if (node._type == BookmarkNode::BMNT_BOOKMARK) { const Bookmark& bookmark = *node._pbookmark; tv.pszText = (LPTSTR)bookmark._name.c_str(); @@ -286,11 +340,10 @@ void BookmarkList::fill_tree(HWND hwnd, HTREEITEM parent, HIMAGELIST himagelist, tv.iSelectedImage = 2; // selected bookmark if (!bookmark._icon_path.empty()) { - ///@todo retreive "http://.../favicon.ico" icons const Icon& icon = g_Globals._icon_cache.extract(bookmark._icon_path, bookmark._icon_idx); if ((ICON_ID)icon != ICID_NONE) - tv.iImage = tv.iSelectedImage = ImageList_AddAlphaIcon(himagelist, icon, hdc_wnd); + tv.iImage = tv.iSelectedImage = icon.add_to_imagelist(himagelist, hdc_wnd); } TreeView_InsertItem(hwnd, &tvi); diff --git a/reactos/subsys/system/explorer/taskbar/favorites.h b/reactos/subsys/system/explorer/taskbar/favorites.h index ee56af7d9a4..4c589343937 100644 --- a/reactos/subsys/system/explorer/taskbar/favorites.h +++ b/reactos/subsys/system/explorer/taskbar/favorites.h @@ -38,26 +38,34 @@ struct Bookmark bool read_url(LPCTSTR path); bool read(const_XMLPos& pos); - void write(XMLPos& pos); + void write(XMLPos& pos) const; }; struct BookmarkFolder; struct BookmarkNode { + BookmarkNode(); BookmarkNode(const Bookmark& bm); BookmarkNode(const BookmarkFolder& bmf); BookmarkNode(const BookmarkNode& other); + ~BookmarkNode(); + BookmarkNode& operator=(const Bookmark& bm); + BookmarkNode& operator=(const BookmarkFolder& bmf); + BookmarkNode& operator=(const BookmarkNode& other); + + void clear(); + enum BOOKMARKNODE_TYPE { - BMNT_BOOKMARK, BMNT_FOLDER + BMNT_NONE, BMNT_BOOKMARK, BMNT_FOLDER }; BOOKMARKNODE_TYPE _type; union { - Bookmark* _pbookmark; + Bookmark* _pbookmark; BookmarkFolder* _pfolder; }; }; @@ -79,7 +87,7 @@ struct BookmarkFolder BookmarkList _bookmarks; void read(const_XMLPos& pos); - void write(XMLPos& pos); + void write(XMLPos& pos) const; }; struct Favorites : public BookmarkList diff --git a/reactos/subsys/system/explorer/taskbar/startmenu.cpp b/reactos/subsys/system/explorer/taskbar/startmenu.cpp index 3c9ef74ab12..0ff0781ff53 100644 --- a/reactos/subsys/system/explorer/taskbar/startmenu.cpp +++ b/reactos/subsys/system/explorer/taskbar/startmenu.cpp @@ -95,7 +95,7 @@ BtnWindowClass& StartMenu::GetWndClasss() Window::CREATORFUNC_INFO StartMenu::s_def_creator = STARTMENU_CREATOR(StartMenu); -HWND StartMenu::Create(int x, int y, const StartMenuFolders& folders, HWND hwndParent, LPCTSTR title, CREATORFUNC_INFO creator) +HWND StartMenu::Create(int x, int y, const StartMenuFolders& folders, HWND hwndParent, LPCTSTR title, CREATORFUNC_INFO creator, void* info) { UINT style, ex_style; int top_height; @@ -123,6 +123,7 @@ HWND StartMenu::Create(int x, int y, const StartMenuFolders& folders, HWND hwndP create_info._folders = folders; create_info._border_top = top_height; create_info._creator = creator; + create_info._info = info; if (title) create_info._title = title; @@ -862,7 +863,7 @@ int StartMenu::Command(int id, int code) } -StartMenuEntry& StartMenu::AddEntry(const String& title, ICON_ID icon_id, Entry* entry) +ShellEntryMap::iterator StartMenu::AddEntry(const String& title, ICON_ID icon_id, Entry* entry) { // search for an already existing subdirectory entry with the same name if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) @@ -874,32 +875,35 @@ StartMenuEntry& StartMenu::AddEntry(const String& title, ICON_ID icon_id, Entry* if ((*it2)->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { // merge the new shell entry with the existing of the same name sme._entries.insert(entry); - return sme; + + return it; } } } - StartMenuEntry& sme = AddEntry(title, icon_id); + ShellEntryMap::iterator sme = AddEntry(title, icon_id); - sme._entries.insert(entry); + sme->second._entries.insert(entry); return sme; } -StartMenuEntry& StartMenu::AddEntry(const String& title, ICON_ID icon_id, int id) +ShellEntryMap::iterator StartMenu::AddEntry(const String& title, ICON_ID icon_id, int id) { if (id == -1) id = ++_next_id; - StartMenuEntry& sme = _entries[id]; + StartMenuEntry sme; sme._title = title; sme._icon_id = icon_id; - return sme; + ShellEntryMap::iterator it = _entries.insert(make_pair(id, sme)).first; + + return it; } -StartMenuEntry& StartMenu::AddEntry(const ShellFolder folder, ShellEntry* entry) +ShellEntryMap::iterator StartMenu::AddEntry(const ShellFolder folder, ShellEntry* entry) { ICON_ID icon_id; @@ -911,7 +915,7 @@ StartMenuEntry& StartMenu::AddEntry(const ShellFolder folder, ShellEntry* entry) return AddEntry(folder.get_name(entry->_pidl), icon_id, entry); } -StartMenuEntry& StartMenu::AddEntry(const ShellFolder folder, Entry* entry) +ShellEntryMap::iterator StartMenu::AddEntry(const ShellFolder folder, Entry* entry) { ICON_ID icon_id; @@ -1004,12 +1008,12 @@ bool StartMenu::CloseOtherSubmenus(int id) } -void StartMenu::CreateSubmenu(int id, LPCTSTR title, CREATORFUNC_INFO creator) +void StartMenu::CreateSubmenu(int id, LPCTSTR title, CREATORFUNC_INFO creator, void* info) { - CreateSubmenu(id, StartMenuFolders(), title, creator); + CreateSubmenu(id, StartMenuFolders(), title, creator, info); } -bool StartMenu::CreateSubmenu(int id, int folder_id, LPCTSTR title, CREATORFUNC_INFO creator) +bool StartMenu::CreateSubmenu(int id, int folder_id, LPCTSTR title, CREATORFUNC_INFO creator, void* info) { try { SpecialFolderPath folder(folder_id, _hwnd); @@ -1017,7 +1021,7 @@ bool StartMenu::CreateSubmenu(int id, int folder_id, LPCTSTR title, CREATORFUNC_ StartMenuFolders new_folders; new_folders.push_back(folder); - CreateSubmenu(id, new_folders, title, creator); + CreateSubmenu(id, new_folders, title, creator, info); return true; } catch(COMException&) { @@ -1028,7 +1032,7 @@ bool StartMenu::CreateSubmenu(int id, int folder_id, LPCTSTR title, CREATORFUNC_ } } -bool StartMenu::CreateSubmenu(int id, int folder_id1, int folder_id2, LPCTSTR title, CREATORFUNC_INFO creator) +bool StartMenu::CreateSubmenu(int id, int folder_id1, int folder_id2, LPCTSTR title, CREATORFUNC_INFO creator, void* info) { StartMenuFolders new_folders; @@ -1043,7 +1047,7 @@ bool StartMenu::CreateSubmenu(int id, int folder_id1, int folder_id2, LPCTSTR ti } if (!new_folders.empty()) { - CreateSubmenu(id, new_folders, title, creator); + CreateSubmenu(id, new_folders, title, creator, info); return true; } else { CloseOtherSubmenus(id); @@ -1052,7 +1056,7 @@ bool StartMenu::CreateSubmenu(int id, int folder_id1, int folder_id2, LPCTSTR ti } } -void StartMenu::CreateSubmenu(int id, const StartMenuFolders& new_folders, LPCTSTR title, CREATORFUNC_INFO creator) +void StartMenu::CreateSubmenu(int id, const StartMenuFolders& new_folders, LPCTSTR title, CREATORFUNC_INFO creator, void* info) { // Only open one submenu at a time. if (!CloseOtherSubmenus(id)) @@ -1074,7 +1078,7 @@ void StartMenu::CreateSubmenu(int id, const StartMenuFolders& new_folders, LPCTS } _submenu_id = id; - _submenu = StartMenu::Create(x, y, new_folders, _hwnd, title, creator); + _submenu = StartMenu::Create(x, y, new_folders, _hwnd, title, creator, info); } @@ -1108,7 +1112,7 @@ void StartMenu::ActivateEntry(int id, const ShellEntrySet& entries) HWND hparent = GetParent(_hwnd); ShellPath shell_path = entry->create_absolute_pidl(); - // close start menus after launching the selected entry + // close start menus when launching the selected entry CloseStartMenu(id); ///@todo launch in the background; specify correct HWND for error message box titles @@ -1616,7 +1620,11 @@ int StartMenuHandler::Command(int id, int code) break; case IDC_FAVORITES: +#ifndef _SHELL32_FAVORITES + CreateSubmenu(id, ResString(IDS_FAVORITES), STARTMENU_CREATOR(FavoritesMenu), &static_cast(g_Globals._favorites)); +#else CreateSubmenu(id, CSIDL_COMMON_FAVORITES, CSIDL_FAVORITES, ResString(IDS_FAVORITES)); +#endif break; case IDC_BROWSE: @@ -1805,13 +1813,13 @@ void SettingsMenu::AddEntries() AddButton(ResString(IDS_CONTROL_PANEL), ICID_CONFIG, false, IDC_CONTROL_PANEL); #ifdef _ROS_ // to be removed when printer/network will be implemented - AddButton(ResString(IDS_PRINTERS), ICID_PRINTER, false, IDC_PRINTERS); - AddButton(ResString(IDS_CONNECTIONS), ICID_NETWORK, false, IDC_CONNECTIONS); + AddButton(ResString(IDS_PRINTERS), ICID_PRINTER, false, IDC_PRINTERS); + AddButton(ResString(IDS_CONNECTIONS), ICID_NETWORK, false, IDC_CONNECTIONS); #else - AddButton(ResString(IDS_PRINTERS), ICID_PRINTER, true, IDC_PRINTERS); - AddButton(ResString(IDS_CONNECTIONS), ICID_NETWORK, true, IDC_CONNECTIONS); + AddButton(ResString(IDS_PRINTERS), ICID_PRINTER, true, IDC_PRINTERS); + AddButton(ResString(IDS_CONNECTIONS), ICID_NETWORK, true, IDC_CONNECTIONS); #endif - AddButton(ResString(IDS_ADMIN), ICID_CONFIG, true, IDC_ADMIN); + AddButton(ResString(IDS_ADMIN), ICID_CONFIG, true, IDC_ADMIN); #ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003) if (!g_Globals._SHRestricted || !SHRestricted(REST_NOCONTROLPANEL)) @@ -1829,26 +1837,26 @@ void BrowseMenu::AddEntries() if (!g_Globals._SHRestricted || !SHRestricted(REST_NONETHOOD)) // or REST_NOENTIRENETWORK ? #endif #ifdef _ROS_ // to be removed when printer/network will be implemented - AddButton(ResString(IDS_NETWORK), ICID_NETWORK, false, IDC_NETWORK); + AddButton(ResString(IDS_NETWORK), ICID_NETWORK, false, IDC_NETWORK); #else - AddButton(ResString(IDS_NETWORK), ICID_NETWORK, true, IDC_NETWORK); + AddButton(ResString(IDS_NETWORK), ICID_NETWORK, true, IDC_NETWORK); #endif - AddButton(ResString(IDS_DRIVES), ICID_FOLDER, true, IDC_DRIVES); + AddButton(ResString(IDS_DRIVES), ICID_FOLDER, true, IDC_DRIVES); } void SearchMenu::AddEntries() { super::AddEntries(); - AddButton(ResString(IDS_SEARCH_PRG), ICID_APPS, false, IDC_SEARCH_PROGRAM); - - AddButton(ResString(IDS_SEARCH_FILES), ICID_SEARCH_DOC, false, IDC_SEARCH_FILES); + AddButton(ResString(IDS_SEARCH_FILES), ICID_SEARCH_DOC, false, IDC_SEARCH_FILES); #ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003) if (!g_Globals._SHRestricted || !SHRestricted(REST_HASFINDCOMPUTERS)) #endif - AddButton(ResString(IDS_SEARCH_COMPUTER), ICID_COMPUTER, false, IDC_SEARCH_COMPUTER); + AddButton(ResString(IDS_SEARCH_COMPUTER),ICID_COMPUTER, false, IDC_SEARCH_COMPUTER); + + AddButton(ResString(IDS_SEARCH_PRG), ICID_APPS, false, IDC_SEARCH_PROGRAM); } @@ -1872,3 +1880,62 @@ void RecentStartMenu::AddEntries() AddShellEntries(dir, RECENT_DOCS_COUNT, smd._subfolders); } } + + +#ifndef _SHELL32_FAVORITES + +void FavoritesMenu::AddEntries() +{ + super::AddEntries(); + + for(BookmarkList::iterator it=_bookmarks.begin(); it!=_bookmarks.end(); ++it) { + BookmarkNode& node = *it; + + int id = ++_next_id; + + _entries[id] = node; + + if (node._type == BookmarkNode::BMNT_FOLDER) { + BookmarkFolder& folder = *node._pfolder; + + AddButton(folder._name, ICID_FOLDER, true, id); + } else if (node._type == BookmarkNode::BMNT_BOOKMARK) { + Bookmark& bookmark = *node._pbookmark; + + ICON_ID icon = ICID_NONE; + + if (!bookmark._icon_path.empty()) + icon = g_Globals._icon_cache.extract(bookmark._icon_path, bookmark._icon_idx); + + AddButton(bookmark._name, icon!=ICID_NONE?icon:ICID_BOOKMARK, false, id); + } + } +} + +int FavoritesMenu::Command(int id, int code) +{ + BookmarkMap::iterator found = _entries.find(id); + + if (found != _entries.end()) { + BookmarkNode& node = found->second; + + if (node._type == BookmarkNode::BMNT_FOLDER) { + BookmarkFolder& folder = *node._pfolder; + + if (CloseOtherSubmenus(id)) + CreateSubmenu(id, folder._name, STARTMENU_CREATOR(FavoritesMenu), &static_cast(folder._bookmarks)); + } else if (node._type == BookmarkNode::BMNT_BOOKMARK) { + Bookmark& bookmark = *node._pbookmark; + + String url = bookmark._url; + CloseStartMenu(id); + launch_file(GetParent(_hwnd), url, SW_SHOWNORMAL); + } + + return 0; + } + + return super::Command(id, code); +} + +#endif diff --git a/reactos/subsys/system/explorer/taskbar/startmenu.h b/reactos/subsys/system/explorer/taskbar/startmenu.h index 8cd968709b5..6402029e224 100644 --- a/reactos/subsys/system/explorer/taskbar/startmenu.h +++ b/reactos/subsys/system/explorer/taskbar/startmenu.h @@ -138,7 +138,7 @@ struct StartMenuSeparator : public Static typedef list StartMenuFolders; - /// structor containing information for creating start menus + /// structor containing information for creating of start menus struct StartMenuCreateInfo { StartMenuCreateInfo() : _border_top(0) {} @@ -147,6 +147,7 @@ struct StartMenuCreateInfo int _border_top; String _title; Window::CREATORFUNC_INFO _creator; + void* _info; }; #define STARTMENU_CREATOR(WND_CLASS) WINDOW_CREATOR_INFO(WND_CLASS, StartMenuCreateInfo) @@ -216,7 +217,8 @@ struct StartMenu : StartMenu(HWND hwnd, const StartMenuCreateInfo& create_info); ~StartMenu(); - static HWND Create(int x, int y, const StartMenuFolders&, HWND hwndParent, LPCTSTR title, CREATORFUNC_INFO creator=s_def_creator); + static HWND Create(int x, int y, const StartMenuFolders&, HWND hwndParent, LPCTSTR title, + CREATORFUNC_INFO creator=s_def_creator, void* info=NULL); static CREATORFUNC_INFO s_def_creator; protected: @@ -266,10 +268,10 @@ protected: virtual void AddEntries(); - StartMenuEntry& AddEntry(const String& title, ICON_ID icon_id, Entry* entry); - StartMenuEntry& AddEntry(const String& title, ICON_ID icon_id=ICID_NONE, int id=-1); - StartMenuEntry& AddEntry(const ShellFolder folder, ShellEntry* entry); - StartMenuEntry& AddEntry(const ShellFolder folder, Entry* entry); + ShellEntryMap::iterator AddEntry(const String& title, ICON_ID icon_id, Entry* entry); + ShellEntryMap::iterator AddEntry(const String& title, ICON_ID icon_id=ICID_NONE, int id=-1); + ShellEntryMap::iterator AddEntry(const ShellFolder folder, ShellEntry* entry); + ShellEntryMap::iterator AddEntry(const ShellFolder folder, Entry* entry); void AddShellEntries(const ShellDirectory& dir, int max=-1, bool subfolders=true); @@ -278,10 +280,10 @@ protected: bool CloseSubmenus() {return CloseOtherSubmenus();} bool CloseOtherSubmenus(int id=0); - void CreateSubmenu(int id, LPCTSTR title, CREATORFUNC_INFO creator=s_def_creator); - bool CreateSubmenu(int id, int folder, LPCTSTR title, CREATORFUNC_INFO creator=s_def_creator); - bool CreateSubmenu(int id, int folder1, int folder2, LPCTSTR title, CREATORFUNC_INFO creator=s_def_creator); - void CreateSubmenu(int id, const StartMenuFolders& new_folders, LPCTSTR title, CREATORFUNC_INFO creator=s_def_creator); + void CreateSubmenu(int id, LPCTSTR title, CREATORFUNC_INFO creator=s_def_creator, void*info=NULL); + bool CreateSubmenu(int id, int folder, LPCTSTR title, CREATORFUNC_INFO creator=s_def_creator, void*info=NULL); + bool CreateSubmenu(int id, int folder1, int folder2, LPCTSTR title, CREATORFUNC_INFO creator=s_def_creator, void*info=NULL); + void CreateSubmenu(int id, const StartMenuFolders& new_folders, LPCTSTR title, CREATORFUNC_INFO creator=s_def_creator, void*info=NULL); void ActivateEntry(int id, const ShellEntrySet& entries); virtual void CloseStartMenu(int id=0); @@ -357,10 +359,11 @@ protected: SIZE _logo_size; - void AddEntries(); + virtual void AddEntries(); + virtual void ProcessKey(int vk); + void Paint(PaintCanvas& canvas); void CloseStartMenu(int id=0); - virtual void ProcessKey(int vk); }; @@ -375,7 +378,7 @@ struct SettingsMenu : public StartMenuHandler } protected: - void AddEntries(); + virtual void AddEntries(); }; @@ -390,7 +393,7 @@ struct BrowseMenu : public StartMenuHandler } protected: - void AddEntries(); + virtual void AddEntries(); }; @@ -405,7 +408,7 @@ struct SearchMenu : public StartMenuHandler } protected: - void AddEntries(); + virtual void AddEntries(); }; @@ -424,3 +427,29 @@ struct RecentStartMenu : public StartMenu protected: virtual void AddEntries(); }; + + +#ifndef _SHELL32_FAVORITES + +typedef map BookmarkMap; + + /// Bookmarks sub-startmenu +struct FavoritesMenu : public StartMenu +{ + typedef StartMenu super; + + FavoritesMenu(HWND hwnd, const StartMenuCreateInfo& create_info) + : super(hwnd, create_info), + _bookmarks(*(BookmarkList*)create_info._info) + { + } + +protected: + virtual int Command(int id, int code); + virtual void AddEntries(); + + BookmarkList _bookmarks; + BookmarkMap _entries; +}; + +#endif From bd41908243ab2e0fc5ce09bdb9ee7e6ee1cd3a2c Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Fri, 9 Apr 2004 19:45:37 +0000 Subject: [PATCH 0806/1463] remove unused variable svn path=/trunk/; revision=9051 --- reactos/subsys/system/explorer/shell/mainframe.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/reactos/subsys/system/explorer/shell/mainframe.cpp b/reactos/subsys/system/explorer/shell/mainframe.cpp index dcd0948e48b..6682b653879 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.cpp +++ b/reactos/subsys/system/explorer/shell/mainframe.cpp @@ -1050,12 +1050,10 @@ void MainFrame::FillBookmarks() TreeView_DeleteAllItems(_hsidebar); - COLORREF bk_color = RGB(255,255,255); - HBRUSH hbr_bkgnd = GetStockBrush(WHITE_BRUSH); - g_Globals._icon_cache.get_icon(ICID_FAVORITES).add_to_imagelist(_himl, canvas); g_Globals._icon_cache.get_icon(ICID_BOOKMARK).add_to_imagelist(_himl, canvas); - ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_DOT), hbr_bkgnd, canvas); + ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_DOT), COLORREF bk_color = RGB(255,255,255); +GetStockBrush(WHITE_BRUSH), canvas); g_Globals._icon_cache.get_icon(ICID_FOLDER).add_to_imagelist(_himl, canvas); g_Globals._icon_cache.get_icon(ICID_FOLDER).add_to_imagelist(_himl, canvas); From db6bcc0793f8a3379595b37e0605eff94ffb3c66 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Fri, 9 Apr 2004 19:46:15 +0000 Subject: [PATCH 0807/1463] remove unused variable svn path=/trunk/; revision=9052 --- reactos/subsys/system/explorer/shell/mainframe.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/reactos/subsys/system/explorer/shell/mainframe.cpp b/reactos/subsys/system/explorer/shell/mainframe.cpp index 6682b653879..730a5c60648 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.cpp +++ b/reactos/subsys/system/explorer/shell/mainframe.cpp @@ -1052,8 +1052,7 @@ void MainFrame::FillBookmarks() g_Globals._icon_cache.get_icon(ICID_FAVORITES).add_to_imagelist(_himl, canvas); g_Globals._icon_cache.get_icon(ICID_BOOKMARK).add_to_imagelist(_himl, canvas); - ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_DOT), COLORREF bk_color = RGB(255,255,255); -GetStockBrush(WHITE_BRUSH), canvas); + ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_DOT), GetStockBrush(WHITE_BRUSH), canvas); g_Globals._icon_cache.get_icon(ICID_FOLDER).add_to_imagelist(_himl, canvas); g_Globals._icon_cache.get_icon(ICID_FOLDER).add_to_imagelist(_himl, canvas); From 31c1c218247a7a71ee3579f7fb1f436f79e81508 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 9 Apr 2004 20:03:21 +0000 Subject: [PATCH 0808/1463] - Compile Win32k, GDI, USER32 and CSRSS using W32API. svn path=/trunk/; revision=9053 --- reactos/include/csrss/csrss.h | 182 +++++++------ reactos/include/ddentry.h | 2 +- reactos/include/ddk/ddrawi.h | 8 +- reactos/include/ddk/ddrawint.h | 6 +- reactos/include/napi/teb.h | 2 +- reactos/include/ntos/zw.h | 4 +- reactos/include/ntos/zwtypes.h | 14 +- reactos/include/win32k/brush.h | 7 + reactos/include/win32k/driver.h | 118 ++++----- reactos/include/win32k/kapi.h | 2 +- reactos/include/win32k/ntuser.h | 4 + reactos/include/win32k/print.h | 2 +- reactos/include/win32k/region.h | 2 +- reactos/lib/gdi32/main/dllmain.c | 22 +- reactos/lib/gdi32/makefile | 7 +- reactos/lib/gdi32/misc/heap.c | 2 + reactos/lib/gdi32/misc/stubs.c | 70 +++-- reactos/lib/gdi32/misc/stubsa.c | 4 +- reactos/lib/gdi32/misc/stubsw.c | 4 +- reactos/lib/gdi32/misc/wingl.c | 2 +- reactos/lib/gdi32/objects/bitblt.c | 4 +- reactos/lib/gdi32/objects/dc.c | 2 +- reactos/lib/gdi32/objects/font.c | 21 +- reactos/lib/gdi32/objects/metafile.c | 2 + reactos/lib/ntdll/rtl/i386/exception.c | 6 +- reactos/lib/user32/Makefile | 5 +- reactos/lib/user32/controls/combo.c | 2 +- reactos/lib/user32/controls/listbox.c | 30 ++- reactos/lib/user32/controls/scrollbar.c | 3 + reactos/lib/user32/include/user32.h | 6 + reactos/lib/user32/misc/dde.c | 2 + reactos/lib/user32/misc/display.c | 16 +- reactos/lib/user32/misc/dllmain.c | 23 +- reactos/lib/user32/misc/exit.c | 7 +- reactos/lib/user32/misc/resources.c | 2 + reactos/lib/user32/misc/strpool.c | 2 + reactos/lib/user32/misc/stubs.c | 26 +- reactos/lib/user32/misc/winsta.c | 6 +- reactos/lib/user32/misc/wsprintf.c | 9 +- reactos/lib/user32/user32.edf | 2 +- reactos/lib/user32/windows/accel.c | 12 +- reactos/lib/user32/windows/bitmap.c | 18 +- reactos/lib/user32/windows/class.c | 6 +- reactos/lib/user32/windows/cursor.c | 5 +- reactos/lib/user32/windows/defwnd.c | 30 ++- reactos/lib/user32/windows/dialog.c | 10 +- reactos/lib/user32/windows/hook.c | 14 +- reactos/lib/user32/windows/icon.c | 18 +- reactos/lib/user32/windows/mdi.c | 4 - reactos/lib/user32/windows/menu.c | 13 +- reactos/lib/user32/windows/message.c | 57 ++-- reactos/lib/user32/windows/messagebox.c | 45 ++-- reactos/lib/user32/windows/nonclient.c | 3 + reactos/lib/user32/windows/paint.c | 4 +- reactos/lib/user32/windows/prop.c | 28 +- reactos/lib/user32/windows/text.c | 8 +- reactos/lib/user32/windows/window.c | 6 +- reactos/subsys/csrss/api/handle.c | 5 +- reactos/subsys/csrss/api/process.c | 34 +-- reactos/subsys/csrss/api/user.c | 10 +- reactos/subsys/csrss/api/wapi.c | 9 +- reactos/subsys/csrss/init.c | 4 +- reactos/subsys/csrss/makefile | 4 +- reactos/subsys/csrss/print.c | 11 +- reactos/subsys/csrss/video.c | 7 +- reactos/subsys/csrss/win32csr/conio.c | 69 +++-- reactos/subsys/csrss/win32csr/desktopbg.c | 20 +- reactos/subsys/csrss/win32csr/guiconsole.c | 21 +- reactos/subsys/win32k/eng/bitblt.c | 30 ++- reactos/subsys/win32k/eng/clip.c | 14 +- reactos/subsys/win32k/eng/clip.h | 2 +- reactos/subsys/win32k/eng/copybits.c | 11 +- reactos/subsys/win32k/eng/event.c | 5 +- reactos/subsys/win32k/eng/float.c | 4 +- reactos/subsys/win32k/eng/gradient.c | 16 +- reactos/subsys/win32k/eng/lineto.c | 10 +- reactos/subsys/win32k/eng/misc.c | 6 +- reactos/subsys/win32k/eng/mouse.c | 26 +- reactos/subsys/win32k/eng/nls.c | 4 +- reactos/subsys/win32k/eng/objects.h | 6 +- reactos/subsys/win32k/eng/surface.c | 6 +- reactos/subsys/win32k/eng/transblt.c | 18 +- reactos/subsys/win32k/include/class.h | 1 + reactos/subsys/win32k/include/color.h | 4 +- reactos/subsys/win32k/include/inteng.h | 10 +- reactos/subsys/win32k/include/intgdi.h | 2 +- reactos/subsys/win32k/include/palette.h | 8 +- reactos/subsys/win32k/include/useratom.h | 1 + reactos/subsys/win32k/ldr/loader.c | 104 ++++---- reactos/subsys/win32k/main/dllmain.c | 25 +- reactos/subsys/win32k/makefile | 10 +- reactos/subsys/win32k/misc/driver.c | 3 +- reactos/subsys/win32k/ntuser/class.c | 8 +- reactos/subsys/win32k/ntuser/desktop.c | 22 +- reactos/subsys/win32k/ntuser/misc.c | 6 +- reactos/subsys/win32k/ntuser/msgqueue.c | 5 +- reactos/subsys/win32k/ntuser/painting.c | 6 +- reactos/subsys/win32k/ntuser/scrollbar.c | 5 +- reactos/subsys/win32k/ntuser/timer.c | 24 +- reactos/subsys/win32k/ntuser/windc.c | 25 +- reactos/subsys/win32k/ntuser/window.c | 21 +- reactos/subsys/win32k/ntuser/winpos.c | 4 +- reactos/subsys/win32k/ntuser/winsta.c | 9 +- reactos/subsys/win32k/objects/bitmaps.c | 48 ++-- reactos/subsys/win32k/objects/brush.c | 6 +- reactos/subsys/win32k/objects/cliprgn.c | 4 +- reactos/subsys/win32k/objects/color.c | 30 ++- reactos/subsys/win32k/objects/cursoricon.c | 18 +- reactos/subsys/win32k/objects/dc.c | 32 ++- reactos/subsys/win32k/objects/dib.c | 26 +- reactos/subsys/win32k/objects/fillshap.c | 20 +- reactos/subsys/win32k/objects/gdiobj.c | 4 +- reactos/subsys/win32k/objects/line.c | 6 +- reactos/subsys/win32k/objects/objconv.c | 4 +- reactos/subsys/win32k/objects/palette.c | 18 +- reactos/subsys/win32k/objects/polyfill.c | 20 +- reactos/subsys/win32k/objects/print.c | 18 +- reactos/subsys/win32k/objects/region.c | 40 +-- reactos/subsys/win32k/objects/text.c | 28 +- reactos/subsys/win32k/stubs/stubs.c | 18 +- reactos/w32api/include/ddk/ntapi.h | 5 +- reactos/w32api/include/ddk/ntifs.h | 4 +- reactos/w32api/include/ddk/prntfont.h | 291 +++++++++++++++++++++ reactos/w32api/include/ddk/winddi.h | 36 ++- reactos/w32api/include/ddk/winddk.h | 4 + reactos/w32api/include/winbase.h | 2 +- reactos/w32api/include/wingdi.h | 53 +++- reactos/w32api/include/winuser.h | 69 ++++- 128 files changed, 1494 insertions(+), 886 deletions(-) create mode 100644 reactos/w32api/include/ddk/prntfont.h diff --git a/reactos/include/csrss/csrss.h b/reactos/include/csrss/csrss.h index 398bef18a3b..20ed9dab918 100644 --- a/reactos/include/csrss/csrss.h +++ b/reactos/include/csrss/csrss.h @@ -3,7 +3,7 @@ #include #include -#include +#include #define CSR_PRIORITY_CLASS_NORMAL (0x10) #define CSR_PRIORITY_CLASS_IDLE (0x20) @@ -535,7 +535,7 @@ typedef struct #define CSRSS_MAX_WRITE_CONSOLE_REQUEST \ (MAX_MESSAGE_DATA - sizeof(ULONG) - sizeof(CSRSS_WRITE_CONSOLE_REQUEST)) -#define CSRSS_MAX_SET_TITLE_REQUEST (MAX_MESSAGE_DATA - sizeof( HANDLE ) - sizeof( DWORD ) - sizeof( ULONG ) - sizeof( LPC_MESSAGE )) +#define CSRSS_MAX_SET_TITLE_REQUEST (MAX_MESSAGE_DATA - sizeof( HANDLE ) - sizeof( DWORD ) - sizeof( ULONG ) - LPC_MESSAGE_BASE_SIZE) #define CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR (MAX_MESSAGE_DATA - sizeof( ULONG ) - sizeof( CSRSS_WRITE_CONSOLE_OUTPUT_CHAR_REQUEST )) @@ -599,99 +599,113 @@ typedef struct #define CSRSS_SET_CONSOLE_ICON (0x2E) /* Keep in sync with definition below. */ -#define CSRSS_REQUEST_HEADER_SIZE (sizeof(LPC_MESSAGE) + sizeof(ULONG)) +#define CSRSS_REQUEST_HEADER_SIZE (LPC_MESSAGE_BASE_SIZE + sizeof(ULONG)) typedef struct { - LPC_MESSAGE Header; - ULONG Type; union { - CSRSS_CREATE_PROCESS_REQUEST CreateProcessRequest; - CSRSS_CONNECT_PROCESS_REQUEST ConnectRequest; - CSRSS_WRITE_CONSOLE_REQUEST WriteConsoleRequest; - CSRSS_READ_CONSOLE_REQUEST ReadConsoleRequest; - CSRSS_ALLOC_CONSOLE_REQUEST AllocConsoleRequest; - CSRSS_SCREEN_BUFFER_INFO_REQUEST ScreenBufferInfoRequest; - CSRSS_SET_CURSOR_REQUEST SetCursorRequest; - CSRSS_FILL_OUTPUT_REQUEST FillOutputRequest; - CSRSS_READ_INPUT_REQUEST ReadInputRequest; - CSRSS_WRITE_CONSOLE_OUTPUT_CHAR_REQUEST WriteConsoleOutputCharRequest; - CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB_REQUEST WriteConsoleOutputAttribRequest; - CSRSS_FILL_OUTPUT_ATTRIB_REQUEST FillOutputAttribRequest; - CSRSS_SET_CURSOR_INFO_REQUEST SetCursorInfoRequest; - CSRSS_GET_CURSOR_INFO_REQUEST GetCursorInfoRequest; - CSRSS_SET_ATTRIB_REQUEST SetAttribRequest; - CSRSS_SET_CONSOLE_MODE_REQUEST SetConsoleModeRequest; - CSRSS_GET_CONSOLE_MODE_REQUEST GetConsoleModeRequest; - CSRSS_CREATE_SCREEN_BUFFER_REQUEST CreateScreenBufferRequest; - CSRSS_SET_SCREEN_BUFFER_REQUEST SetScreenBufferRequest; - CSRSS_SET_TITLE_REQUEST SetTitleRequest; - CSRSS_GET_TITLE_REQUEST GetTitleRequest; - CSRSS_WRITE_CONSOLE_OUTPUT_REQUEST WriteConsoleOutputRequest; - CSRSS_FLUSH_INPUT_BUFFER_REQUEST FlushInputBufferRequest; - CSRSS_SCROLL_CONSOLE_SCREEN_BUFFER_REQUEST - ScrollConsoleScreenBufferRequest; - CSRSS_READ_CONSOLE_OUTPUT_CHAR_REQUEST ReadConsoleOutputCharRequest; - CSRSS_READ_CONSOLE_OUTPUT_ATTRIB_REQUEST ReadConsoleOutputAttribRequest; - CSRSS_GET_NUM_INPUT_EVENTS_REQUEST GetNumInputEventsRequest; - CSRSS_REGISTER_SERVICES_PROCESS_REQUEST RegisterServicesProcessRequest; - CSRSS_EXIT_REACTOS_REQUEST ExitReactosRequest; - CSRSS_SET_SHUTDOWN_PARAMETERS_REQUEST SetShutdownParametersRequest; - CSRSS_GET_SHUTDOWN_PARAMETERS_REQUEST GetShutdownParametersRequest; - CSRSS_PEEK_CONSOLE_INPUT_REQUEST PeekConsoleInputRequest; - CSRSS_READ_CONSOLE_OUTPUT_REQUEST ReadConsoleOutputRequest; - CSRSS_WRITE_CONSOLE_INPUT_REQUEST WriteConsoleInputRequest; - CSRSS_CLOSE_HANDLE_REQUEST CloseHandleRequest; - CSRSS_VERIFY_HANDLE_REQUEST VerifyHandleRequest; - CSRSS_DUPLICATE_HANDLE_REQUEST DuplicateHandleRequest; - CSRSS_SETGET_CONSOLE_HW_STATE_REQUEST ConsoleHardwareStateRequest; - CSRSS_CONSOLE_WINDOW ConsoleWindowRequest; - CSRSS_CREATE_DESKTOP_REQUEST CreateDesktopRequest; - CSRSS_SHOW_DESKTOP_REQUEST ShowDesktopRequest; - CSRSS_HIDE_DESKTOP_REQUEST HideDesktopRequest; - CSRSS_CONSOLE_SET_WINDOW_ICON ConsoleSetWindowIconRequest; - } Data; + LPC_MESSAGE Header; + struct + { + BYTE HeaderReserved[LPC_MESSAGE_BASE_SIZE]; + ULONG Type; + union + { + CSRSS_CREATE_PROCESS_REQUEST CreateProcessRequest; + CSRSS_CONNECT_PROCESS_REQUEST ConnectRequest; + CSRSS_WRITE_CONSOLE_REQUEST WriteConsoleRequest; + CSRSS_READ_CONSOLE_REQUEST ReadConsoleRequest; + CSRSS_ALLOC_CONSOLE_REQUEST AllocConsoleRequest; + CSRSS_SCREEN_BUFFER_INFO_REQUEST ScreenBufferInfoRequest; + CSRSS_SET_CURSOR_REQUEST SetCursorRequest; + CSRSS_FILL_OUTPUT_REQUEST FillOutputRequest; + CSRSS_READ_INPUT_REQUEST ReadInputRequest; + CSRSS_WRITE_CONSOLE_OUTPUT_CHAR_REQUEST WriteConsoleOutputCharRequest; + CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB_REQUEST WriteConsoleOutputAttribRequest; + CSRSS_FILL_OUTPUT_ATTRIB_REQUEST FillOutputAttribRequest; + CSRSS_SET_CURSOR_INFO_REQUEST SetCursorInfoRequest; + CSRSS_GET_CURSOR_INFO_REQUEST GetCursorInfoRequest; + CSRSS_SET_ATTRIB_REQUEST SetAttribRequest; + CSRSS_SET_CONSOLE_MODE_REQUEST SetConsoleModeRequest; + CSRSS_GET_CONSOLE_MODE_REQUEST GetConsoleModeRequest; + CSRSS_CREATE_SCREEN_BUFFER_REQUEST CreateScreenBufferRequest; + CSRSS_SET_SCREEN_BUFFER_REQUEST SetScreenBufferRequest; + CSRSS_SET_TITLE_REQUEST SetTitleRequest; + CSRSS_GET_TITLE_REQUEST GetTitleRequest; + CSRSS_WRITE_CONSOLE_OUTPUT_REQUEST WriteConsoleOutputRequest; + CSRSS_FLUSH_INPUT_BUFFER_REQUEST FlushInputBufferRequest; + CSRSS_SCROLL_CONSOLE_SCREEN_BUFFER_REQUEST + ScrollConsoleScreenBufferRequest; + CSRSS_READ_CONSOLE_OUTPUT_CHAR_REQUEST ReadConsoleOutputCharRequest; + CSRSS_READ_CONSOLE_OUTPUT_ATTRIB_REQUEST ReadConsoleOutputAttribRequest; + CSRSS_GET_NUM_INPUT_EVENTS_REQUEST GetNumInputEventsRequest; + CSRSS_REGISTER_SERVICES_PROCESS_REQUEST RegisterServicesProcessRequest; + CSRSS_EXIT_REACTOS_REQUEST ExitReactosRequest; + CSRSS_SET_SHUTDOWN_PARAMETERS_REQUEST SetShutdownParametersRequest; + CSRSS_GET_SHUTDOWN_PARAMETERS_REQUEST GetShutdownParametersRequest; + CSRSS_PEEK_CONSOLE_INPUT_REQUEST PeekConsoleInputRequest; + CSRSS_READ_CONSOLE_OUTPUT_REQUEST ReadConsoleOutputRequest; + CSRSS_WRITE_CONSOLE_INPUT_REQUEST WriteConsoleInputRequest; + CSRSS_CLOSE_HANDLE_REQUEST CloseHandleRequest; + CSRSS_VERIFY_HANDLE_REQUEST VerifyHandleRequest; + CSRSS_DUPLICATE_HANDLE_REQUEST DuplicateHandleRequest; + CSRSS_SETGET_CONSOLE_HW_STATE_REQUEST ConsoleHardwareStateRequest; + CSRSS_CONSOLE_WINDOW ConsoleWindowRequest; + CSRSS_CREATE_DESKTOP_REQUEST CreateDesktopRequest; + CSRSS_SHOW_DESKTOP_REQUEST ShowDesktopRequest; + CSRSS_HIDE_DESKTOP_REQUEST HideDesktopRequest; + CSRSS_CONSOLE_SET_WINDOW_ICON ConsoleSetWindowIconRequest; + } Data; + }; + }; } CSRSS_API_REQUEST, *PCSRSS_API_REQUEST; typedef struct { - LPC_MESSAGE Header; - NTSTATUS Status; union { - CSRSS_CREATE_PROCESS_REPLY CreateProcessReply; - CSRSS_CONNECT_PROCESS_REPLY ConnectReply; - CSRSS_WRITE_CONSOLE_REPLY WriteConsoleReply; - CSRSS_READ_CONSOLE_REPLY ReadConsoleReply; - CSRSS_ALLOC_CONSOLE_REPLY AllocConsoleReply; - CSRSS_SCREEN_BUFFER_INFO_REPLY ScreenBufferInfoReply; - CSRSS_READ_INPUT_REPLY ReadInputReply; - CSRSS_WRITE_CONSOLE_OUTPUT_CHAR_REPLY WriteConsoleOutputCharReply; - CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB_REPLY WriteConsoleOutputAttribReply; - CSRSS_GET_CURSOR_INFO_REPLY GetCursorInfoReply; - CSRSS_GET_CONSOLE_MODE_REPLY GetConsoleModeReply; - CSRSS_CREATE_SCREEN_BUFFER_REPLY CreateScreenBufferReply; - CSRSS_GET_TITLE_REPLY GetTitleReply; - CSRSS_WRITE_CONSOLE_OUTPUT_REPLY WriteConsoleOutputReply; - CSRSS_READ_CONSOLE_OUTPUT_CHAR_REPLY ReadConsoleOutputCharReply; - CSRSS_READ_CONSOLE_OUTPUT_ATTRIB_REPLY ReadConsoleOutputAttribReply; - CSRSS_GET_NUM_INPUT_EVENTS_REPLY GetNumInputEventsReply; - CSRSS_SET_SHUTDOWN_PARAMETERS_REPLY SetShutdownParametersReply; - CSRSS_GET_SHUTDOWN_PARAMETERS_REPLY GetShutdownParametersReply; - CSRSS_PEEK_CONSOLE_INPUT_REPLY PeekConsoleInputReply; - CSRSS_READ_CONSOLE_OUTPUT_REPLY ReadConsoleOutputReply; - CSRSS_WRITE_CONSOLE_INPUT_REPLY WriteConsoleInputReply; - CSRSS_GET_INPUT_HANDLE_REPLY GetInputHandleReply; - CSRSS_GET_OUTPUT_HANDLE_REPLY GetOutputHandleReply; - CSRSS_DUPLICATE_HANDLE_REPLY DuplicateHandleReply; - CSRSS_SETGET_CONSOLE_HW_STATE_REPLY ConsoleHardwareStateReply; - CSRSS_CONSOLE_WINDOW ConsoleWindowReply; - CSRSS_CREATE_DESKTOP_REPLY CreateDesktopReply; - CSRSS_SHOW_DESKTOP_REPLY ShowDesktopReply; - CSRSS_HIDE_DESKTOP_REPLY HideDesktopReply; - CSRSS_CONSOLE_SET_WINDOW_ICON ConsoleSetWindowIconReply; - } Data; + LPC_MESSAGE Header; + struct + { + BYTE HeaderReserved[LPC_MESSAGE_BASE_SIZE]; + NTSTATUS Status; + union + { + CSRSS_CREATE_PROCESS_REPLY CreateProcessReply; + CSRSS_CONNECT_PROCESS_REPLY ConnectReply; + CSRSS_WRITE_CONSOLE_REPLY WriteConsoleReply; + CSRSS_READ_CONSOLE_REPLY ReadConsoleReply; + CSRSS_ALLOC_CONSOLE_REPLY AllocConsoleReply; + CSRSS_SCREEN_BUFFER_INFO_REPLY ScreenBufferInfoReply; + CSRSS_READ_INPUT_REPLY ReadInputReply; + CSRSS_WRITE_CONSOLE_OUTPUT_CHAR_REPLY WriteConsoleOutputCharReply; + CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB_REPLY WriteConsoleOutputAttribReply; + CSRSS_GET_CURSOR_INFO_REPLY GetCursorInfoReply; + CSRSS_GET_CONSOLE_MODE_REPLY GetConsoleModeReply; + CSRSS_CREATE_SCREEN_BUFFER_REPLY CreateScreenBufferReply; + CSRSS_GET_TITLE_REPLY GetTitleReply; + CSRSS_WRITE_CONSOLE_OUTPUT_REPLY WriteConsoleOutputReply; + CSRSS_READ_CONSOLE_OUTPUT_CHAR_REPLY ReadConsoleOutputCharReply; + CSRSS_READ_CONSOLE_OUTPUT_ATTRIB_REPLY ReadConsoleOutputAttribReply; + CSRSS_GET_NUM_INPUT_EVENTS_REPLY GetNumInputEventsReply; + CSRSS_SET_SHUTDOWN_PARAMETERS_REPLY SetShutdownParametersReply; + CSRSS_GET_SHUTDOWN_PARAMETERS_REPLY GetShutdownParametersReply; + CSRSS_PEEK_CONSOLE_INPUT_REPLY PeekConsoleInputReply; + CSRSS_READ_CONSOLE_OUTPUT_REPLY ReadConsoleOutputReply; + CSRSS_WRITE_CONSOLE_INPUT_REPLY WriteConsoleInputReply; + CSRSS_GET_INPUT_HANDLE_REPLY GetInputHandleReply; + CSRSS_GET_OUTPUT_HANDLE_REPLY GetOutputHandleReply; + CSRSS_DUPLICATE_HANDLE_REPLY DuplicateHandleReply; + CSRSS_SETGET_CONSOLE_HW_STATE_REPLY ConsoleHardwareStateReply; + CSRSS_CONSOLE_WINDOW ConsoleWindowReply; + CSRSS_CREATE_DESKTOP_REPLY CreateDesktopReply; + CSRSS_SHOW_DESKTOP_REPLY ShowDesktopReply; + CSRSS_HIDE_DESKTOP_REPLY HideDesktopReply; + CSRSS_CONSOLE_SET_WINDOW_ICON ConsoleSetWindowIconReply; + } Data; + }; + }; } CSRSS_API_REPLY, *PCSRSS_API_REPLY; #endif /* __INCLUDE_CSRSS_CSRSS_H */ diff --git a/reactos/include/ddentry.h b/reactos/include/ddentry.h index 4316645d050..e6ce4382235 100644 --- a/reactos/include/ddentry.h +++ b/reactos/include/ddentry.h @@ -16,9 +16,9 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include #include +#include BOOL STDCALL DdCreateDirectDrawObject( LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal, HDC hdc diff --git a/reactos/include/ddk/ddrawi.h b/reactos/include/ddk/ddrawi.h index 841c1570e5d..894676f7e7c 100644 --- a/reactos/include/ddk/ddrawi.h +++ b/reactos/include/ddk/ddrawi.h @@ -19,8 +19,8 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#ifndef __WINE_DDRAWI_H -#define __WINE_DDRAWI_H +#ifndef __DDRAWI_INCLUDED__ +#define __DDRAWI_INCLUDED__ #ifdef __cplusplus extern "C" { @@ -616,7 +616,9 @@ typedef struct _DDHAL_GETDRIVERINFODATA { /***************************************************************************** * high-level ddraw implementation structures */ +#ifndef __USE_W32API typedef DWORD IUnknown; /* FIXME: implement proper definition */ +#endif typedef struct _IUNKNOWN_LIST { struct _IUNKNOWN_LIST * lpLink; LPGUID lpGuid; @@ -1326,4 +1328,4 @@ typedef struct _DDHAL_WAITFORVERTICALBLANKDATA } /* extern "C" */ #endif -#endif /* __WINE_DDRAWI_H */ +#endif /* __DDRAWI_INCLUDED__ */ diff --git a/reactos/include/ddk/ddrawint.h b/reactos/include/ddk/ddrawint.h index abcd92ed5b2..568daaa04b5 100644 --- a/reactos/include/ddk/ddrawint.h +++ b/reactos/include/ddk/ddrawint.h @@ -2,8 +2,8 @@ * DirectDraw NT driver interface */ -#ifndef __DDK_DDRAWINT_H -#define __DDK_DDRAWINT_H +#ifndef __DD_INCLUDED__ +#define __DD_INCLUDED__ #include #include @@ -1233,4 +1233,4 @@ typedef struct } /* extern "C" */ #endif -#endif /* __DDK_DDRAWINT_H */ +#endif /* __DD_INCLUDED__ */ diff --git a/reactos/include/napi/teb.h b/reactos/include/napi/teb.h index 646eb04fe62..657ddf39a2a 100644 --- a/reactos/include/napi/teb.h +++ b/reactos/include/napi/teb.h @@ -98,7 +98,7 @@ typedef struct _PEB_LDR_DATA LIST_ENTRY InInitializationOrderModuleList; } PEB_LDR_DATA, *PPEB_LDR_DATA; -typedef VOID STDCALL_FUNC (*PPEBLOCKROUTINE)(PVOID); +typedef VOID (STDCALL *PPEBLOCKROUTINE)(PVOID); typedef struct _PEB { diff --git a/reactos/include/ntos/zw.h b/reactos/include/ntos/zw.h index 6b593d4c0e6..00f770ae370 100755 --- a/reactos/include/ntos/zw.h +++ b/reactos/include/ntos/zw.h @@ -1,5 +1,5 @@ -/* $Id: zw.h,v 1.21 2004/01/06 15:57:48 ekohl Exp $ +/* $Id: zw.h,v 1.22 2004/04/09 20:03:11 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -4446,10 +4446,12 @@ NtGetPlugPlayEvent (ULONG Reserved1, /* --- POWER MANAGEMENT --- */ +#ifndef __USE_W32API NTSTATUS STDCALL NtSetSystemPowerState(IN POWER_ACTION SystemAction, IN SYSTEM_POWER_STATE MinSystemState, IN ULONG Flags); +#endif /* --- DEBUG SUBSYSTEM --- */ diff --git a/reactos/include/ntos/zwtypes.h b/reactos/include/ntos/zwtypes.h index c3950585efd..f8b97a723eb 100755 --- a/reactos/include/ntos/zwtypes.h +++ b/reactos/include/ntos/zwtypes.h @@ -1706,6 +1706,12 @@ typedef struct _LPC_MESSAGE ULONG SectionSize; /* CallbackID */ } LPC_MESSAGE, *PLPC_MESSAGE; +#define PORT_MESSAGE_TYPE(m) (LPC_TYPE)((m).Header.MessageType) + +#define PORT_MAX_DATA_LENGTH 0x104 +#define PORT_MAX_MESSAGE_LENGTH 0x148 + +#endif /* __USE_W32API */ #define MAX_MESSAGE_DATA (0x130) @@ -1715,14 +1721,6 @@ typedef struct _LPC_MAX_MESSAGE BYTE Data[MAX_MESSAGE_DATA]; } LPC_MAX_MESSAGE, *PLPC_MAX_MESSAGE; - -#define PORT_MESSAGE_TYPE(m) (LPC_TYPE)((m).Header.MessageType) - -#define PORT_MAX_DATA_LENGTH 0x104 -#define PORT_MAX_MESSAGE_LENGTH 0x148 - -#endif /* __USE_W32API */ - typedef struct _LPC_PORT_BASIC_INFORMATION { DWORD Unknown0; diff --git a/reactos/include/win32k/brush.h b/reactos/include/win32k/brush.h index f7500dc389b..ee195e52f0e 100644 --- a/reactos/include/win32k/brush.h +++ b/reactos/include/win32k/brush.h @@ -71,6 +71,13 @@ typedef struct #define BRUSHOBJ_LockBrush(hBrush) ((PGDIBRUSHOBJ)GDIOBJ_LockObj((HGDIOBJ)hBrush, GDI_OBJECT_TYPE_BRUSH)) #define BRUSHOBJ_UnlockBrush(hBrush) GDIOBJ_UnlockObj((HGDIOBJ)hBrush, GDI_OBJECT_TYPE_BRUSH) +#ifdef __USE_W32API +typedef struct _PATRECT { + RECT r; + HBRUSH hBrush; +} PATRECT, * PPATRECT; +#endif + HBRUSH STDCALL NtGdiCreateBrushIndirect( CONST LOGBRUSH *LogBrush); diff --git a/reactos/include/win32k/driver.h b/reactos/include/win32k/driver.h index 9a7d7aa604e..bdae2ff75e2 100644 --- a/reactos/include/win32k/driver.h +++ b/reactos/include/win32k/driver.h @@ -4,8 +4,8 @@ #include -typedef BOOL STDCALL_FUNC (*PGD_ENABLEDRIVER)(ULONG, ULONG, PDRVENABLEDATA); -typedef DHPDEV STDCALL_FUNC (*PGD_ENABLEPDEV)(DEVMODEW *, +typedef BOOL (STDCALL *PGD_ENABLEDRIVER)(ULONG, ULONG, PDRVENABLEDATA); +typedef DHPDEV (STDCALL *PGD_ENABLEPDEV)(DEVMODEW *, LPWSTR, ULONG, HSURF *, @@ -16,86 +16,86 @@ typedef DHPDEV STDCALL_FUNC (*PGD_ENABLEPDEV)(DEVMODEW *, LPWSTR, LPWSTR, HANDLE); -typedef VOID STDCALL_FUNC (*PGD_COMPLETEPDEV)(DHPDEV, HDEV); -typedef VOID STDCALL_FUNC (*PGD_DISABLEPDEV)(DHPDEV); -typedef HSURF STDCALL_FUNC (*PGD_ENABLESURFACE)(DHPDEV); -typedef VOID STDCALL_FUNC (*PGD_DISABLESURFACE)(DHPDEV); -typedef BOOL STDCALL_FUNC (*PGD_ASSERTMODE)(DHPDEV, BOOL); -typedef BOOL STDCALL_FUNC (*PGD_RESETPDEV)(DHPDEV, DHPDEV); -typedef HBITMAP STDCALL_FUNC (*PGD_CREATEDEVICEBITMAP)(DHPDEV, SIZEL, ULONG); -typedef VOID STDCALL_FUNC (*PGD_DELETEDEVICEBITMAP)(DHSURF); -typedef BOOL STDCALL_FUNC (*PGD_REALIZEBRUSH)(BRUSHOBJ*, SURFOBJ*, SURFOBJ*, SURFOBJ*, +typedef VOID (STDCALL *PGD_COMPLETEPDEV)(DHPDEV, HDEV); +typedef VOID (STDCALL *PGD_DISABLEPDEV)(DHPDEV); +typedef HSURF (STDCALL *PGD_ENABLESURFACE)(DHPDEV); +typedef VOID (STDCALL *PGD_DISABLESURFACE)(DHPDEV); +typedef BOOL (STDCALL *PGD_ASSERTMODE)(DHPDEV, BOOL); +typedef BOOL (STDCALL *PGD_RESETPDEV)(DHPDEV, DHPDEV); +typedef HBITMAP (STDCALL *PGD_CREATEDEVICEBITMAP)(DHPDEV, SIZEL, ULONG); +typedef VOID (STDCALL *PGD_DELETEDEVICEBITMAP)(DHSURF); +typedef BOOL (STDCALL *PGD_REALIZEBRUSH)(BRUSHOBJ*, SURFOBJ*, SURFOBJ*, SURFOBJ*, XLATEOBJ*, ULONG); -typedef ULONG STDCALL_FUNC (*PGD_DITHERCOLOR)(DHPDEV, ULONG, ULONG, PULONG); -typedef BOOL STDCALL_FUNC (*PGD_STROKEPATH)(SURFOBJ*, PATHOBJ*, CLIPOBJ*, XFORMOBJ*, +typedef ULONG (STDCALL *PGD_DITHERCOLOR)(DHPDEV, ULONG, ULONG, PULONG); +typedef BOOL (STDCALL *PGD_STROKEPATH)(SURFOBJ*, PATHOBJ*, CLIPOBJ*, XFORMOBJ*, BRUSHOBJ*, POINTL*, PLINEATTRS, MIX); -typedef BOOL STDCALL_FUNC (*PGD_FILLPATH)(SURFOBJ*, PATHOBJ*, CLIPOBJ*, BRUSHOBJ*, +typedef BOOL (STDCALL *PGD_FILLPATH)(SURFOBJ*, PATHOBJ*, CLIPOBJ*, BRUSHOBJ*, POINTL*, MIX, ULONG); -typedef BOOL STDCALL_FUNC (*PGD_STROKEANDFILLPATH)(SURFOBJ*, PATHOBJ*, CLIPOBJ*, +typedef BOOL (STDCALL *PGD_STROKEANDFILLPATH)(SURFOBJ*, PATHOBJ*, CLIPOBJ*, XFORMOBJ*, BRUSHOBJ*, PLINEATTRS, BRUSHOBJ*, POINTL*, MIX, ULONG); -typedef BOOL STDCALL_FUNC (*PGD_PAINT)(SURFOBJ*, CLIPOBJ*, BRUSHOBJ*, POINTL*, MIX); -typedef BOOL STDCALL_FUNC (*PGD_BITBLT)(SURFOBJ*, SURFOBJ*, SURFOBJ*, CLIPOBJ*, +typedef BOOL (STDCALL *PGD_PAINT)(SURFOBJ*, CLIPOBJ*, BRUSHOBJ*, POINTL*, MIX); +typedef BOOL (STDCALL *PGD_BITBLT)(SURFOBJ*, SURFOBJ*, SURFOBJ*, CLIPOBJ*, XLATEOBJ*, RECTL*, POINTL*, POINTL*, BRUSHOBJ*, POINTL*, ROP4); -typedef BOOL STDCALL_FUNC (*PGD_TRANSPARENTBLT)(SURFOBJ*, SURFOBJ*, CLIPOBJ*, XLATEOBJ*, RECTL*, RECTL*, ULONG, ULONG); -typedef BOOL STDCALL_FUNC (*PGD_COPYBITS)(SURFOBJ*, SURFOBJ*, CLIPOBJ*, XLATEOBJ*, +typedef BOOL (STDCALL *PGD_TRANSPARENTBLT)(SURFOBJ*, SURFOBJ*, CLIPOBJ*, XLATEOBJ*, RECTL*, RECTL*, ULONG, ULONG); +typedef BOOL (STDCALL *PGD_COPYBITS)(SURFOBJ*, SURFOBJ*, CLIPOBJ*, XLATEOBJ*, RECTL*, POINTL*); -typedef BOOL STDCALL_FUNC (*PGD_STRETCHBLT)(SURFOBJ*, SURFOBJ*, SURFOBJ*, CLIPOBJ*, +typedef BOOL (STDCALL *PGD_STRETCHBLT)(SURFOBJ*, SURFOBJ*, SURFOBJ*, CLIPOBJ*, XLATEOBJ*, COLORADJUSTMENT*, POINTL*, RECTL*, RECTL*, POINTL*, ULONG); -typedef BOOL STDCALL_FUNC (*PGD_SETPALETTE)(DHPDEV, PALOBJ*, ULONG, ULONG, ULONG); -typedef BOOL STDCALL_FUNC (*PGD_TEXTOUT)(SURFOBJ*, STROBJ*, FONTOBJ*, CLIPOBJ*, RECTL*, +typedef BOOL (STDCALL *PGD_SETPALETTE)(DHPDEV, PALOBJ*, ULONG, ULONG, ULONG); +typedef BOOL (STDCALL *PGD_TEXTOUT)(SURFOBJ*, STROBJ*, FONTOBJ*, CLIPOBJ*, RECTL*, RECTL*, BRUSHOBJ*, BRUSHOBJ*, POINTL*, MIX); -typedef ULONG STDCALL_FUNC (*PGD_ESCAPE)(SURFOBJ*, ULONG, ULONG, PVOID *, ULONG, PVOID *); -typedef ULONG STDCALL_FUNC (*PGD_DRAWESCAPE)(SURFOBJ*, ULONG, CLIPOBJ*, RECTL*, ULONG, +typedef ULONG (STDCALL *PGD_ESCAPE)(SURFOBJ*, ULONG, ULONG, PVOID *, ULONG, PVOID *); +typedef ULONG (STDCALL *PGD_DRAWESCAPE)(SURFOBJ*, ULONG, CLIPOBJ*, RECTL*, ULONG, PVOID *); -typedef PIFIMETRICS STDCALL_FUNC (*PGD_QUERYFONT)(DHPDEV, ULONG, ULONG, PULONG); -typedef PVOID STDCALL_FUNC (*PGD_QUERYFONTTREE)(DHPDEV, ULONG, ULONG, ULONG, PULONG); -typedef LONG STDCALL_FUNC (*PGD_QUERYFONTDATA)(DHPDEV, FONTOBJ*, ULONG, HGLYPH, GLYPHDATA*, +typedef PIFIMETRICS (STDCALL *PGD_QUERYFONT)(DHPDEV, ULONG, ULONG, PULONG); +typedef PVOID (STDCALL *PGD_QUERYFONTTREE)(DHPDEV, ULONG, ULONG, ULONG, PULONG); +typedef LONG (STDCALL *PGD_QUERYFONTDATA)(DHPDEV, FONTOBJ*, ULONG, HGLYPH, GLYPHDATA*, PVOID, ULONG); -typedef ULONG STDCALL_FUNC (*PGD_SETPOINTERSHAPE)(SURFOBJ*, SURFOBJ*, SURFOBJ*, XLATEOBJ*, +typedef ULONG (STDCALL *PGD_SETPOINTERSHAPE)(SURFOBJ*, SURFOBJ*, SURFOBJ*, XLATEOBJ*, LONG, LONG, LONG, LONG, RECTL*, ULONG); -typedef VOID STDCALL_FUNC (*PGD_MOVEPOINTER)(SURFOBJ*, LONG, LONG, RECTL*); -typedef BOOL STDCALL_FUNC (*PGD_LINETO)(SURFOBJ*, CLIPOBJ*, BRUSHOBJ*, LONG, LONG, LONG, +typedef VOID (STDCALL *PGD_MOVEPOINTER)(SURFOBJ*, LONG, LONG, RECTL*); +typedef BOOL (STDCALL *PGD_LINETO)(SURFOBJ*, CLIPOBJ*, BRUSHOBJ*, LONG, LONG, LONG, LONG, RECTL*, MIX); -typedef BOOL STDCALL_FUNC (*PGD_SENDPAGE)(SURFOBJ*); -typedef BOOL STDCALL_FUNC (*PGD_STARTPAGE)(SURFOBJ*); -typedef BOOL STDCALL_FUNC (*PGD_ENDDOC)(SURFOBJ*, ULONG); -typedef BOOL STDCALL_FUNC (*PGD_STARTDOC)(SURFOBJ*, PWSTR, DWORD); -typedef ULONG STDCALL_FUNC (*PGD_GETGLYPHMODE)(DHPDEV, FONTOBJ*); -typedef VOID STDCALL_FUNC (*PGD_SYNCHRONIZE)(DHPDEV, RECTL*); -typedef ULONG STDCALL_FUNC (*PGD_SAVESCREENBITS)(SURFOBJ*, ULONG, ULONG, RECTL*); -typedef ULONG STDCALL_FUNC (*PGD_GETMODES)(HANDLE, ULONG, PDEVMODEW); -typedef VOID STDCALL_FUNC (*PGD_FREE)(PVOID, ULONG); -typedef VOID STDCALL_FUNC (*PGD_DESTROYFONT)(FONTOBJ*); -typedef LONG STDCALL_FUNC (*PGD_QUERYFONTCAPS)(ULONG, PULONG); -typedef ULONG STDCALL_FUNC (*PGD_LOADFONTFILE)(ULONG, PVOID, ULONG, ULONG); -typedef BOOL STDCALL_FUNC (*PGD_UNLOADFONTFILE)(ULONG); -typedef ULONG STDCALL_FUNC (*PGD_FONTMANAGEMENT)(SURFOBJ*, FONTOBJ*, ULONG, ULONG, PVOID, +typedef BOOL (STDCALL *PGD_SENDPAGE)(SURFOBJ*); +typedef BOOL (STDCALL *PGD_STARTPAGE)(SURFOBJ*); +typedef BOOL (STDCALL *PGD_ENDDOC)(SURFOBJ*, ULONG); +typedef BOOL (STDCALL *PGD_STARTDOC)(SURFOBJ*, PWSTR, DWORD); +typedef ULONG (STDCALL *PGD_GETGLYPHMODE)(DHPDEV, FONTOBJ*); +typedef VOID (STDCALL *PGD_SYNCHRONIZE)(DHPDEV, RECTL*); +typedef ULONG (STDCALL *PGD_SAVESCREENBITS)(SURFOBJ*, ULONG, ULONG, RECTL*); +typedef ULONG (STDCALL *PGD_GETMODES)(HANDLE, ULONG, PDEVMODEW); +typedef VOID (STDCALL *PGD_FREE)(PVOID, ULONG); +typedef VOID (STDCALL *PGD_DESTROYFONT)(FONTOBJ*); +typedef LONG (STDCALL *PGD_QUERYFONTCAPS)(ULONG, PULONG); +typedef ULONG (STDCALL *PGD_LOADFONTFILE)(ULONG, PVOID, ULONG, ULONG); +typedef BOOL (STDCALL *PGD_UNLOADFONTFILE)(ULONG); +typedef ULONG (STDCALL *PGD_FONTMANAGEMENT)(SURFOBJ*, FONTOBJ*, ULONG, ULONG, PVOID, ULONG, PVOID); -typedef LONG STDCALL_FUNC (*PGD_QUERYTRUETYPETABLE)(ULONG, ULONG, ULONG, PTRDIFF, ULONG, +typedef LONG (STDCALL *PGD_QUERYTRUETYPETABLE)(ULONG, ULONG, ULONG, PTRDIFF, ULONG, PBYTE); -typedef LONG STDCALL_FUNC (*PGD_QUERYTRUETYPEOUTLINE)(DHPDEV, FONTOBJ*, HGLYPH, BOOL, +typedef LONG (STDCALL *PGD_QUERYTRUETYPEOUTLINE)(DHPDEV, FONTOBJ*, HGLYPH, BOOL, GLYPHDATA*, ULONG, TTPOLYGONHEADER*); -typedef PVOID STDCALL_FUNC (*PGD_GETTRUETYPEFILE)(ULONG, PULONG); -typedef LONG STDCALL_FUNC (*PGD_QUERYFONTFILE)(ULONG, ULONG, ULONG, PULONG); -typedef BOOL STDCALL_FUNC (*PGD_QUERYADVANCEWIDTHS)(DHPDEV, FONTOBJ*, ULONG, HGLYPH *, +typedef PVOID (STDCALL *PGD_GETTRUETYPEFILE)(ULONG, PULONG); +typedef LONG (STDCALL *PGD_QUERYFONTFILE)(ULONG, ULONG, ULONG, PULONG); +typedef BOOL (STDCALL *PGD_QUERYADVANCEWIDTHS)(DHPDEV, FONTOBJ*, ULONG, HGLYPH *, PVOID *, ULONG); -typedef BOOL STDCALL_FUNC (*PGD_SETPIXELFORMAT)(SURFOBJ*, LONG, ULONG); -typedef LONG STDCALL_FUNC (*PGD_DESCRIBEPIXELFORMAT)(DHPDEV, LONG, ULONG, +typedef BOOL (STDCALL *PGD_SETPIXELFORMAT)(SURFOBJ*, LONG, ULONG); +typedef LONG (STDCALL *PGD_DESCRIBEPIXELFORMAT)(DHPDEV, LONG, ULONG, PPIXELFORMATDESCRIPTOR); -typedef BOOL STDCALL_FUNC (*PGD_SWAPBUFFERS)(SURFOBJ*, PWNDOBJ); -typedef BOOL STDCALL_FUNC (*PGD_STARTBANDING)(SURFOBJ*, POINTL*); -typedef BOOL STDCALL_FUNC (*PGD_NEXTBAND)(SURFOBJ*, POINTL*); +typedef BOOL (STDCALL *PGD_SWAPBUFFERS)(SURFOBJ*, PWNDOBJ); +typedef BOOL (STDCALL *PGD_STARTBANDING)(SURFOBJ*, POINTL*); +typedef BOOL (STDCALL *PGD_NEXTBAND)(SURFOBJ*, POINTL*); -typedef BOOL STDCALL_FUNC (*PGD_GETDIRECTDRAWINFO)(DHPDEV, PDD_HALINFO, PDWORD, VIDEOMEMORY*, PDWORD, PDWORD); -typedef BOOL STDCALL_FUNC (*PGD_ENABLEDIRECTDRAW)(DHPDEV, PDD_CALLBACKS, PDD_SURFACECALLBACKS, PDD_PALETTECALLBACKS); -typedef VOID STDCALL_FUNC (*PGD_DISABLEDIRECTDRAW)(DHPDEV); +typedef BOOL (STDCALL *PGD_GETDIRECTDRAWINFO)(DHPDEV, PDD_HALINFO, PDWORD, VIDEOMEMORY*, PDWORD, PDWORD); +typedef BOOL (STDCALL *PGD_ENABLEDIRECTDRAW)(DHPDEV, PDD_CALLBACKS, PDD_SURFACECALLBACKS, PDD_PALETTECALLBACKS); +typedef VOID (STDCALL *PGD_DISABLEDIRECTDRAW)(DHPDEV); -typedef LONG STDCALL_FUNC (*PGD_QUERYSPOOLTYPE)(DHPDEV, LPWSTR); +typedef LONG (STDCALL *PGD_QUERYSPOOLTYPE)(DHPDEV, LPWSTR); -typedef BOOL STDCALL_FUNC (*PGD_GRADIENTFILL)(SURFOBJ*, CLIPOBJ*, XLATEOBJ*, TRIVERTEX*, ULONG, PVOID, ULONG, RECTL*, POINTL*, ULONG); +typedef BOOL (STDCALL *PGD_GRADIENTFILL)(SURFOBJ*, CLIPOBJ*, XLATEOBJ*, TRIVERTEX*, ULONG, PVOID, ULONG, RECTL*, POINTL*, ULONG); typedef struct _DRIVER_FUNCTIONS { diff --git a/reactos/include/win32k/kapi.h b/reactos/include/win32k/kapi.h index 0836fe64dee..8078b8b26e3 100644 --- a/reactos/include/win32k/kapi.h +++ b/reactos/include/win32k/kapi.h @@ -1,5 +1,6 @@ #ifndef _WIN32K_KAPI_H #define _WIN32K_KAPI_H +#include #include #include #include @@ -23,5 +24,4 @@ #include #include #include -#include #endif /* ndef _WIN32K_KAPI_H */ diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index b20c47853f0..ad51638f620 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -1,6 +1,10 @@ #ifndef __WIN32K_NTUSER_H #define __WIN32K_NTUSER_H +#include + +#define WM_SYSTIMER 280 + ULONG STDCALL NtUserGetSystemMetrics(ULONG Index); diff --git a/reactos/include/win32k/print.h b/reactos/include/win32k/print.h index 245a4863548..9dab57f8d66 100644 --- a/reactos/include/win32k/print.h +++ b/reactos/include/win32k/print.h @@ -39,7 +39,7 @@ NtGdiSetAbortProc(HDC hDC, INT STDCALL NtGdiStartDoc(HDC hDC, - CONST PDOCINFOW di); + CONST LPDOCINFOW di); INT STDCALL diff --git a/reactos/include/win32k/region.h b/reactos/include/win32k/region.h index 3e711a30511..0f621f295bd 100644 --- a/reactos/include/win32k/region.h +++ b/reactos/include/win32k/region.h @@ -7,7 +7,7 @@ /* Internal region data. Can't use RGNDATA structure because buffer is allocated statically */ typedef struct _ROSRGNDATA { RGNDATAHEADER rdh; - char* Buffer; + 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 */ diff --git a/reactos/lib/gdi32/main/dllmain.c b/reactos/lib/gdi32/main/dllmain.c index 4ecfe6e0233..a9c60dfdb77 100644 --- a/reactos/lib/gdi32/main/dllmain.c +++ b/reactos/lib/gdi32/main/dllmain.c @@ -1,9 +1,9 @@ /* * dllmain.c * - * $Revision: 1.8 $ - * $Author: royce $ - * $Date: 2003/08/04 00:28:44 $ + * $Revision: 1.9 $ + * $Author: navaraf $ + * $Date: 2004/04/09 20:03:11 $ * */ @@ -27,6 +27,14 @@ DllMain ( } +VOID +WINAPI +GdiProcessSetup (VOID) +{ + hProcessHeap = GetProcessHeap(); +} + + /* * @implemented */ @@ -60,12 +68,4 @@ GdiDllInitialize ( return TRUE; } - -VOID -WINAPI -GdiProcessSetup (VOID) -{ - hProcessHeap = RtlGetProcessHeap(); -} - /* EOF */ diff --git a/reactos/lib/gdi32/makefile b/reactos/lib/gdi32/makefile index 86831eac0e3..1e4d98f5d61 100644 --- a/reactos/lib/gdi32/makefile +++ b/reactos/lib/gdi32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.36 2004/03/23 00:18:54 gvg Exp $ +# $Id: makefile,v 1.37 2004/04/09 20:03:11 navaraf Exp $ PATH_TO_TOP = ../.. @@ -15,7 +15,10 @@ TARGET_CFLAGS = \ -DUNICODE \ -Wall \ -Werror \ - -fno-builtin + -fno-builtin \ + -D__USE_W32API \ + -DWINVER=0x0600 \ + -D_WIN32_WINNT=0x0501 # require os code to explicitly request A/W version of structs/functions TARGET_CFLAGS += -D_DISABLE_TIDENTS diff --git a/reactos/lib/gdi32/misc/heap.c b/reactos/lib/gdi32/misc/heap.c index 6968dc75227..1930496d2d3 100644 --- a/reactos/lib/gdi32/misc/heap.c +++ b/reactos/lib/gdi32/misc/heap.c @@ -3,6 +3,8 @@ #undef WIN32_LEAN_AND_MEAN #include #include +#define NTOS_MODE_USER +#include #include // global variables in a dll are process-global diff --git a/reactos/lib/gdi32/misc/stubs.c b/reactos/lib/gdi32/misc/stubs.c index 8edf76fdb1e..da4578b753e 100644 --- a/reactos/lib/gdi32/misc/stubs.c +++ b/reactos/lib/gdi32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.51 2004/03/24 00:13:31 royce Exp $ +/* $Id: stubs.c,v 1.52 2004/04/09 20:03:12 navaraf Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -13,6 +13,20 @@ #endif #include #include +#include + +#ifdef __USE_W32API +typedef int (CALLBACK* EMFPLAYPROC)( HDC, INT, HANDLE ); +typedef DWORD FULLSCREENCONTROL; +typedef DWORD SHAREDHANDLETABLE; +typedef SHAREDHANDLETABLE *PSHAREDHANDLETABLE; +typedef DWORD UNIVERSAL_FONT_ID; +typedef UNIVERSAL_FONT_ID *PUNIVERSAL_FONT_ID; +typedef DWORD REALIZATION_INFO; +typedef REALIZATION_INFO *PREALIZATION_INFO; +typedef DWORD CHWIDTHINFO; +typedef CHWIDTHINFO *PCHWIDTHINFO; +#endif /* * @unimplemented @@ -135,7 +149,7 @@ STDCALL EnumObjects( HDC a0, int a1, - ENUMOBJECTSPROC a2, + GOBJENUMPROC a2, LPARAM a3 ) { @@ -614,7 +628,7 @@ STDCALL EnumMetaFile( HDC a0, HMETAFILE a1, - ENUMMETAFILEPROC a2, + MFENUMPROC a2, LPARAM a3 ) { @@ -659,7 +673,7 @@ STDCALL EnumEnhMetaFile( HDC a0, HENHMETAFILE a1, - ENHMETAFILEPROC a2, + ENHMFENUMPROC a2, LPVOID a3, CONST RECT *a4 ) @@ -792,9 +806,7 @@ SetWinMetaFileBits( UINT a0, CONST BYTE *a1, HDC a2, -// CONST METAFILEPICT *a3 - PVOID a3 - ) + CONST METAFILEPICT *a3) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; @@ -1624,7 +1636,7 @@ wglGetLayerPaletteEntries( int a1, int a2, int a3, - CONST COLORREF *a4 + COLORREF *a4 ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); @@ -1749,12 +1761,12 @@ GetGlyphOutlineWow( /* * @unimplemented */ -DWORD +INT STDCALL GetRandomRgn( - DWORD a0, - DWORD a1, - DWORD a2 + HDC a0, + HRGN a1, + INT a2 ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); @@ -3200,7 +3212,7 @@ BRUSHOBJ_hGetColorTransform(BRUSHOBJ *pbo) * @unimplemented */ PVOID STDCALL -BRUSHOBJ_pvAllocRbrush(IN PBRUSHOBJ BrushObj, +BRUSHOBJ_pvAllocRbrush(IN BRUSHOBJ *BrushObj, IN ULONG ObjSize) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); @@ -3211,7 +3223,7 @@ BRUSHOBJ_pvAllocRbrush(IN PBRUSHOBJ BrushObj, * @unimplemented */ PVOID STDCALL -BRUSHOBJ_pvGetRbrush(IN PBRUSHOBJ BrushObj) +BRUSHOBJ_pvGetRbrush(IN BRUSHOBJ *BrushObj) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; @@ -3231,7 +3243,7 @@ BRUSHOBJ_ulGetBrushColor(BRUSHOBJ *pbo) * @unimplemented */ BOOL STDCALL -CLIPOBJ_bEnum(IN PCLIPOBJ ClipObj, +CLIPOBJ_bEnum(IN CLIPOBJ *ClipObj, IN ULONG ObjSize, OUT ULONG *EnumRects) { @@ -3243,7 +3255,7 @@ CLIPOBJ_bEnum(IN PCLIPOBJ ClipObj, * @unimplemented */ ULONG STDCALL -CLIPOBJ_cEnumStart(IN PCLIPOBJ ClipObj, +CLIPOBJ_cEnumStart(IN CLIPOBJ *ClipObj, IN BOOL ShouldDoAll, IN ULONG ClipType, IN ULONG BuildOrder, @@ -3256,8 +3268,8 @@ CLIPOBJ_cEnumStart(IN PCLIPOBJ ClipObj, /* * @unimplemented */ -PPATHOBJ STDCALL -CLIPOBJ_ppoGetPath(PCLIPOBJ ClipObj) +PATHOBJ* STDCALL +CLIPOBJ_ppoGetPath(CLIPOBJ *ClipObj) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; @@ -3367,7 +3379,7 @@ EngCreateBitmap(IN SIZEL Size, /* * @unimplemented */ -PCLIPOBJ STDCALL +CLIPOBJ* STDCALL EngCreateClip(VOID) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); @@ -3731,10 +3743,10 @@ EngTextOut(SURFOBJ *pso,STROBJ *pstro,FONTOBJ *pfo,CLIPOBJ *pco,RECTL *prclExtra * @unimplemented */ BOOL STDCALL -EngTransparentBlt(IN PSURFOBJ Dest, - IN PSURFOBJ Source, - IN PCLIPOBJ Clip, - IN PXLATEOBJ ColorTranslation, +EngTransparentBlt(IN SURFOBJ *Dest, + IN SURFOBJ *Source, + IN CLIPOBJ *Clip, + IN XLATEOBJ *ColorTranslation, IN PRECTL DestRect, IN PRECTL SourceRect, IN ULONG TransparentColor, @@ -3781,7 +3793,7 @@ EngWideCharToMultiByte(UINT CodePage,LPWSTR WideCharString,INT BytesInWideCharSt */ ULONG STDCALL -FONTOBJ_cGetAllGlyphHandles(IN PFONTOBJ FontObj, +FONTOBJ_cGetAllGlyphHandles(IN FONTOBJ *FontObj, IN HGLYPH *Glyphs) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); @@ -3793,7 +3805,7 @@ FONTOBJ_cGetAllGlyphHandles(IN PFONTOBJ FontObj, */ ULONG STDCALL -FONTOBJ_cGetGlyphs(IN PFONTOBJ FontObj, +FONTOBJ_cGetGlyphs(IN FONTOBJ *FontObj, IN ULONG Mode, IN ULONG NumGlyphs, IN HGLYPH *GlyphHandles, @@ -3828,7 +3840,7 @@ FONTOBJ_pfdg(FONTOBJ *pfo) */ IFIMETRICS* STDCALL -FONTOBJ_pifi(IN PFONTOBJ FontObj) +FONTOBJ_pifi(IN FONTOBJ *FontObj) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; @@ -3839,7 +3851,7 @@ FONTOBJ_pifi(IN PFONTOBJ FontObj) */ PVOID STDCALL -FONTOBJ_pvTrueTypeFontFile(IN PFONTOBJ FontObj, +FONTOBJ_pvTrueTypeFontFile(IN FONTOBJ *FontObj, IN ULONG *FileSize) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); @@ -3851,7 +3863,7 @@ FONTOBJ_pvTrueTypeFontFile(IN PFONTOBJ FontObj, */ XFORMOBJ* STDCALL -FONTOBJ_pxoGetXform(IN PFONTOBJ FontObj) +FONTOBJ_pxoGetXform(IN FONTOBJ *FontObj) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; @@ -3862,7 +3874,7 @@ FONTOBJ_pxoGetXform(IN PFONTOBJ FontObj) */ VOID STDCALL -FONTOBJ_vGetInfo(IN PFONTOBJ FontObj, +FONTOBJ_vGetInfo(IN FONTOBJ *FontObj, IN ULONG InfoSize, OUT PFONTINFO FontInfo) { diff --git a/reactos/lib/gdi32/misc/stubsa.c b/reactos/lib/gdi32/misc/stubsa.c index 5faf385615c..6686617c93e 100644 --- a/reactos/lib/gdi32/misc/stubsa.c +++ b/reactos/lib/gdi32/misc/stubsa.c @@ -1,4 +1,4 @@ -/* $Id: stubsa.c,v 1.30 2004/03/23 19:46:49 gvg Exp $ +/* $Id: stubsa.c,v 1.31 2004/04/09 20:03:13 navaraf Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -15,6 +15,8 @@ #undef WIN32_LEAN_AND_MEAN #include #include +#define NTOS_MODE_USER +#include #include #include #include diff --git a/reactos/lib/gdi32/misc/stubsw.c b/reactos/lib/gdi32/misc/stubsw.c index 66240e38c4b..6b513115d8a 100644 --- a/reactos/lib/gdi32/misc/stubsw.c +++ b/reactos/lib/gdi32/misc/stubsw.c @@ -1,4 +1,4 @@ -/* $Id: stubsw.c,v 1.27 2004/03/23 19:46:49 gvg Exp $ +/* $Id: stubsw.c,v 1.28 2004/04/09 20:03:13 navaraf Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -292,7 +292,7 @@ StartDocW( CONST DOCINFOW *a1 ) { - return NtGdiStartDoc ( hdc, (CONST PDOCINFOW)a1 ); + return NtGdiStartDoc ( hdc, (DOCINFOW *)a1 ); } diff --git a/reactos/lib/gdi32/misc/wingl.c b/reactos/lib/gdi32/misc/wingl.c index 5df2548082f..fcc7712a9d8 100644 --- a/reactos/lib/gdi32/misc/wingl.c +++ b/reactos/lib/gdi32/misc/wingl.c @@ -195,7 +195,7 @@ GetEnhMetaFilePixelFormat( CONST PIXELFORMATDESCRIPTOR *ppfd ) { -ENHMETAHEADER pemh; + ENHMETAHEADER pemh; if(GetEnhMetaFileHeader(hEmh, sizeof(ENHMETAHEADER), &pemh)) { diff --git a/reactos/lib/gdi32/objects/bitblt.c b/reactos/lib/gdi32/objects/bitblt.c index fa811ce72e0..9cf0788be50 100644 --- a/reactos/lib/gdi32/objects/bitblt.c +++ b/reactos/lib/gdi32/objects/bitblt.c @@ -1,4 +1,4 @@ -/* $Id: bitblt.c,v 1.20 2004/03/28 21:46:26 weiden Exp $ +/* $Id: bitblt.c,v 1.21 2004/04/09 20:03:13 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -323,7 +323,7 @@ STDCALL CreateDIBSection(HDC hDC, CONST BITMAPINFO *bmi, UINT Usage, - VOID *Bits, + PVOID *Bits, HANDLE hSection, DWORD dwOffset) { diff --git a/reactos/lib/gdi32/objects/dc.c b/reactos/lib/gdi32/objects/dc.c index b6c901fe9e0..0b4459131c8 100644 --- a/reactos/lib/gdi32/objects/dc.c +++ b/reactos/lib/gdi32/objects/dc.c @@ -814,7 +814,7 @@ SetDIBColorTable( CONST RGBQUAD *a3 ) { - return NtGdiSetDIBColorTable(hdc,a1,a2,(CONST PRGBQUAD)a3); + return NtGdiSetDIBColorTable(hdc,a1,a2,(RGBQUAD*)a3); } /* diff --git a/reactos/lib/gdi32/objects/font.c b/reactos/lib/gdi32/objects/font.c index bfcbe7f9a33..7bc110e9821 100644 --- a/reactos/lib/gdi32/objects/font.c +++ b/reactos/lib/gdi32/objects/font.c @@ -1,4 +1,4 @@ -/* $Id: font.c,v 1.2 2004/03/23 07:59:47 gvg Exp $ +/* $Id: font.c,v 1.3 2004/04/09 20:03:13 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -14,6 +14,9 @@ #include #include +#include +#define NTOS_MODE_USER +#include #include #include #include @@ -242,8 +245,10 @@ IntEnumFontFamilies(HDC Dc, LPLOGFONTW LogFont, PVOID EnumProc, LPARAM lParam, { if (Unicode) { - Ret = ((FONTENUMEXPROCW) EnumProc)(&Info[i].EnumLogFontEx, &Info[i].NewTextMetricEx, - Info[i].FontType, lParam); + Ret = ((FONTENUMPROCW) EnumProc)( + (LPLOGFONTW)&Info[i].EnumLogFontEx, + (LPTEXTMETRICW)&Info[i].NewTextMetricEx, + Info[i].FontType, lParam); } else { @@ -256,8 +261,10 @@ IntEnumFontFamilies(HDC Dc, LPLOGFONTW LogFont, PVOID EnumProc, LPARAM lParam, EnumLogFontExA.elfScript, LF_FACESIZE, NULL, NULL); NewTextMetricExW2A(&NewTextMetricExA, &Info[i].NewTextMetricEx); - Ret = ((FONTENUMEXPROCA) EnumProc)(&EnumLogFontExA, &NewTextMetricExA, - Info[i].FontType, lParam); + Ret = ((FONTENUMPROCA) EnumProc)( + (LPLOGFONTA)&EnumLogFontExA, + (LPTEXTMETRICA)&NewTextMetricExA, + Info[i].FontType, lParam); } } @@ -270,7 +277,7 @@ IntEnumFontFamilies(HDC Dc, LPLOGFONTW LogFont, PVOID EnumProc, LPARAM lParam, * @implemented */ int STDCALL -EnumFontFamiliesExW(HDC Dc, LPLOGFONTW LogFont, FONTENUMEXPROCW EnumFontFamProc, +EnumFontFamiliesExW(HDC Dc, LPLOGFONTW LogFont, FONTENUMPROCW EnumFontFamProc, LPARAM lParam, DWORD Flags) { return IntEnumFontFamilies(Dc, LogFont, EnumFontFamProc, lParam, TRUE); @@ -301,7 +308,7 @@ EnumFontFamiliesW(HDC Dc, LPCWSTR Family, FONTENUMPROCW EnumFontFamProc, * @implemented */ int STDCALL -EnumFontFamiliesExA (HDC Dc, LPLOGFONTA LogFont, FONTENUMEXPROCA EnumFontFamProc, +EnumFontFamiliesExA (HDC Dc, LPLOGFONTA LogFont, FONTENUMPROCA EnumFontFamProc, LPARAM lParam, DWORD dwFlags) { LOGFONTW LogFontW; diff --git a/reactos/lib/gdi32/objects/metafile.c b/reactos/lib/gdi32/objects/metafile.c index c664232c0da..192bab1af46 100644 --- a/reactos/lib/gdi32/objects/metafile.c +++ b/reactos/lib/gdi32/objects/metafile.c @@ -6,6 +6,8 @@ #include #include #include +#define NTOS_MODE_USER +#include #include #include #include diff --git a/reactos/lib/ntdll/rtl/i386/exception.c b/reactos/lib/ntdll/rtl/i386/exception.c index dcde77ecce2..f929f849b4e 100755 --- a/reactos/lib/ntdll/rtl/i386/exception.c +++ b/reactos/lib/ntdll/rtl/i386/exception.c @@ -1,4 +1,4 @@ -/* $Id: exception.c,v 1.6 2003/09/12 17:51:48 vizzini Exp $ +/* $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 @@ -299,6 +299,10 @@ RtlUnwind(PEXCEPTION_REGISTRATION RegistrationFrame, pExceptRec->ExceptionAddress = ReturnAddress; pExceptRec->ExceptionInformation[0] = 0; } + else + { + pExceptRec = ExceptionRecord; + } if (RegistrationFrame) pExceptRec->ExceptionFlags |= EXCEPTION_UNWINDING; diff --git a/reactos/lib/user32/Makefile b/reactos/lib/user32/Makefile index 89d361c97a1..fce7cbb080d 100644 --- a/reactos/lib/user32/Makefile +++ b/reactos/lib/user32/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.36 2004/03/07 11:59:43 navaraf Exp $ +# $Id: Makefile,v 1.37 2004/04/09 20:03:13 navaraf Exp $ PATH_TO_TOP = ../.. @@ -14,6 +14,9 @@ TARGET_CFLAGS = \ -I./include \ -DUNICODE \ -D__REACTOS__ \ + -D__USE_W32API \ + -DWINVER=0x0600 \ + -D_WIN32_WINNT=0x0501 \ -Wall \ -Werror \ -fno-builtin diff --git a/reactos/lib/user32/controls/combo.c b/reactos/lib/user32/controls/combo.c index 7abdb8aaeb8..6f778e42a1d 100644 --- a/reactos/lib/user32/controls/combo.c +++ b/reactos/lib/user32/controls/combo.c @@ -2368,7 +2368,7 @@ static LRESULT ComboWndProc_common( HWND hwnd, UINT message, case CB_SETEDITSEL: if( lphc->wState & CBF_EDIT ) return SendMessageW(lphc->hWndEdit, EM_SETSEL, - (INT)(INT16)LOWORD(lParam), (INT)(INT16)HIWORD(lParam) ); + (INT)(USHORT)LOWORD(lParam), (INT)(USHORT)HIWORD(lParam) ); return CB_ERR; #ifndef __REACTOS__ case CB_SETEXTENDEDUI16: diff --git a/reactos/lib/user32/controls/listbox.c b/reactos/lib/user32/controls/listbox.c index 58a7b8f0b08..799b6234525 100644 --- a/reactos/lib/user32/controls/listbox.c +++ b/reactos/lib/user32/controls/listbox.c @@ -1,4 +1,4 @@ -/* $Id: listbox.c,v 1.15 2004/01/02 19:49:47 gvg Exp $ +/* $Id: listbox.c,v 1.16 2004/04/09 20:03:13 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS User32 @@ -38,6 +38,10 @@ BOOL is_old_app(HWND hwnd) #define WM_LBTRACKPOINT 0x0131 #define WS_EX_DRAGDETECT 0x00000002L #define WM_BEGINDRAG 0x022C +#define WM_SYSTIMER 280 + +UINT STDCALL SetSystemTimer(HWND,UINT_PTR,UINT,TIMERPROC); +WINBOOL STDCALL KillSystemTimer(HWND,UINT_PTR); /* End of hack section -------------------------------- */ @@ -737,7 +741,7 @@ static BOOL LISTBOX_SetTabStops( HWND hwnd, LB_DESCR *descr, INT count, if (short_ints) { INT i; - LPINT16 p = (LPINT16)tabs; + PUSHORT p = (PUSHORT)tabs; TRACE("[%p]: settabstops ", hwnd ); for (i = 0; i < descr->nb_tabs; i++) { @@ -2873,16 +2877,16 @@ static LRESULT WINAPI ListBoxWndProc_common( HWND hwnd, UINT msg, return LISTBOX_HandleMouseWheel( hwnd, descr, wParam ); case WM_LBUTTONDOWN: return LISTBOX_HandleLButtonDown( hwnd, descr, wParam, - (INT16)LOWORD(lParam), - (INT16)HIWORD(lParam) ); + (USHORT)LOWORD(lParam), + (USHORT)HIWORD(lParam) ); case WM_LBUTTONDBLCLK: if (descr->style & LBS_NOTIFY) SEND_NOTIFICATION( hwnd, descr, LBN_DBLCLK ); return 0; case WM_MOUSEMOVE: if (GetCapture() == hwnd) - LISTBOX_HandleMouseMove( hwnd, descr, (INT16)LOWORD(lParam), - (INT16)HIWORD(lParam) ); + LISTBOX_HandleMouseMove( hwnd, descr, (USHORT)LOWORD(lParam), + (USHORT)HIWORD(lParam) ); return 0; case WM_LBUTTONUP: return LISTBOX_HandleLButtonUp( hwnd, descr ); @@ -2991,8 +2995,8 @@ static LRESULT WINAPI ComboLBWndProc_common( HWND hwnd, UINT msg, BOOL captured; RECT clientRect; - mousePos.x = (INT16)LOWORD(lParam); - mousePos.y = (INT16)HIWORD(lParam); + mousePos.x = (USHORT)LOWORD(lParam); + mousePos.y = (USHORT)HIWORD(lParam); /* * If we are in a dropdown combobox, we simulate that @@ -3033,8 +3037,8 @@ static LRESULT WINAPI ComboLBWndProc_common( HWND hwnd, UINT msg, * we make sure there is no selection by re-selecting the * item that was selected when the listbox was made visible. */ - mousePos.x = (INT16)LOWORD(lParam); - mousePos.y = (INT16)HIWORD(lParam); + mousePos.x = (USHORT)LOWORD(lParam); + mousePos.y = (USHORT)HIWORD(lParam); GetClientRect(hwnd, &clientRect); @@ -3054,8 +3058,8 @@ static LRESULT WINAPI ComboLBWndProc_common( HWND hwnd, UINT msg, case WM_LBUTTONDBLCLK: case WM_LBUTTONDOWN: return LISTBOX_HandleLButtonDownCombo(hwnd, descr, msg, wParam, - (INT16)LOWORD(lParam), - (INT16)HIWORD(lParam) ); + (USHORT)LOWORD(lParam), + (USHORT)HIWORD(lParam) ); case WM_NCACTIVATE: return FALSE; case WM_KEYDOWN: @@ -3092,7 +3096,7 @@ static LRESULT WINAPI ComboLBWndProc_common( HWND hwnd, UINT msg, lRet = unicode ? ListBoxWndProcW( hwnd, msg, wParam, lParam ) : ListBoxWndProcA( hwnd, msg, wParam, lParam ); - TRACE_(combo)("\t default on msg [%04x]\n", (UINT16)msg ); + TRACE_(combo)("\t default on msg [%04x]\n", (USHORT)msg ); return lRet; } diff --git a/reactos/lib/user32/controls/scrollbar.c b/reactos/lib/user32/controls/scrollbar.c index 4830f56fd9d..25f77127980 100644 --- a/reactos/lib/user32/controls/scrollbar.c +++ b/reactos/lib/user32/controls/scrollbar.c @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -75,6 +76,8 @@ HBRUSH DefWndControlColor(HDC hDC, UINT ctlType); static LRESULT WINAPI ScrollBarWndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); +UINT STDCALL SetSystemTimer(HWND,UINT_PTR,UINT,TIMERPROC); +WINBOOL STDCALL KillSystemTimer(HWND,UINT_PTR); /********************************************************************* * scrollbar class descriptor diff --git a/reactos/lib/user32/include/user32.h b/reactos/lib/user32/include/user32.h index a3cbc55ac5a..fff142e46bd 100644 --- a/reactos/lib/user32/include/user32.h +++ b/reactos/lib/user32/include/user32.h @@ -91,3 +91,9 @@ void DrawCaret(HWND hWnd, PTHRDCARETINFO CaretInfo); LONG WINAPI RegCloseKey(HKEY); LONG WINAPI RegOpenKeyExW(HKEY,LPCWSTR,DWORD,REGSAM,PHKEY); LONG WINAPI RegQueryValueExW(HKEY,LPCWSTR,LPDWORD,LPDWORD,LPBYTE,LPDWORD); + +#ifdef __USE_W32API +NTSTATUS STDCALL ZwCallbackReturn(PVOID Result, + ULONG ResultLength, + NTSTATUS Status); +#endif diff --git a/reactos/lib/user32/misc/dde.c b/reactos/lib/user32/misc/dde.c index 00d8a341b1b..37906754b46 100644 --- a/reactos/lib/user32/misc/dde.c +++ b/reactos/lib/user32/misc/dde.c @@ -22,7 +22,9 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#ifndef __USE_W32API #define __USE_W32API +#endif #include "wine/config.h" #include "wine/port.h" diff --git a/reactos/lib/user32/misc/display.c b/reactos/lib/user32/misc/display.c index 4f1249985c8..cbbe12e2b2e 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.8 2004/01/23 23:38:26 ekohl Exp $ +/* $Id: display.c,v 1.9 2004/04/09 20:03:14 navaraf Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/misc/dde.c @@ -29,9 +29,12 @@ /* INCLUDES ******************************************************************/ #include -#include -#include +#define NTOS_MODE_USER +#include #include +#include +#define NDEBUG +#include /* FUNCTIONS *****************************************************************/ @@ -42,9 +45,11 @@ BOOL STDCALL EnumDisplayDevicesA( LPCSTR lpDevice, DWORD iDevNum, - PDISPLAY_DEVICE lpDisplayDevice, + PDISPLAY_DEVICEA lpDisplayDevice, DWORD dwFlags) { +/* FIXME: This implementation doesn't convert the lpDisplayDevice structure! */ +#if 0 BOOL rc; UNICODE_STRING Device; if ( !RtlCreateUnicodeStringFromAsciiz ( &Device, (PCSZ)lpDevice ) ) @@ -62,6 +67,9 @@ EnumDisplayDevicesA( RtlFreeUnicodeString ( &Device ); return rc; +#else + return 0; +#endif } diff --git a/reactos/lib/user32/misc/dllmain.c b/reactos/lib/user32/misc/dllmain.c index 0c822c582f4..439bf8ea177 100644 --- a/reactos/lib/user32/misc/dllmain.c +++ b/reactos/lib/user32/misc/dllmain.c @@ -1,9 +1,12 @@ +#undef __USE_W32API #include #include +#include #include #include #include #include +#define _WIN32K_KAPI_H #include #include @@ -14,7 +17,7 @@ DWORD DebugTraceLevel = MIN_TRACE; #endif /* DBG */ -extern RTL_CRITICAL_SECTION gcsMPH; +extern CRITICAL_SECTION gcsMPH; static ULONG User32TlsIndex; /* To make the linker happy */ @@ -54,15 +57,15 @@ Init(VOID) DWORD Status; /* Set up the kernel callbacks. */ - NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_WINDOWPROC] = + NtCurrentTeb()->Peb->KernelCallbackTable[USER32_CALLBACK_WINDOWPROC] = (PVOID)User32CallWindowProcFromKernel; - NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_SENDASYNCPROC] = + NtCurrentTeb()->Peb->KernelCallbackTable[USER32_CALLBACK_SENDASYNCPROC] = (PVOID)User32CallSendAsyncProcForKernel; - NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_LOADSYSMENUTEMPLATE] = + NtCurrentTeb()->Peb->KernelCallbackTable[USER32_CALLBACK_LOADSYSMENUTEMPLATE] = (PVOID)User32LoadSysMenuTemplateForKernel; - NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_LOADDEFAULTCURSORS] = + NtCurrentTeb()->Peb->KernelCallbackTable[USER32_CALLBACK_LOADDEFAULTCURSORS] = (PVOID)User32SetupDefaultCursors; - NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_HOOKPROC] = + NtCurrentTeb()->Peb->KernelCallbackTable[USER32_CALLBACK_HOOKPROC] = (PVOID)User32CallHookProcFromKernel; /* Allocate an index for user32 thread local data. */ @@ -70,8 +73,8 @@ Init(VOID) MenuInit(); - RtlInitializeCriticalSection(&U32AccelCacheLock); - RtlInitializeCriticalSection(&gcsMPH); + InitializeCriticalSection(&U32AccelCacheLock); + InitializeCriticalSection(&gcsMPH); GdiDllInitialize(NULL, DLL_PROCESS_ATTACH, NULL); @@ -104,7 +107,7 @@ DllMain( case DLL_PROCESS_ATTACH: hProcessHeap = RtlGetProcessHeap(); Init(); -/* InitThread();*/ + InitThread(); break; case DLL_THREAD_ATTACH: InitThread(); @@ -114,7 +117,7 @@ DllMain( break; case DLL_PROCESS_DETACH: DeleteFrameBrushes(); -/* CleanupThread();*/ + CleanupThread(); Cleanup(); break; } diff --git a/reactos/lib/user32/misc/exit.c b/reactos/lib/user32/misc/exit.c index a0f91bc66b5..aecca3bf529 100644 --- a/reactos/lib/user32/misc/exit.c +++ b/reactos/lib/user32/misc/exit.c @@ -1,4 +1,4 @@ -/* $Id: exit.c,v 1.3 2004/01/23 23:38:26 ekohl Exp $ +/* $Id: exit.c,v 1.4 2004/04/09 20:03:14 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -8,8 +8,9 @@ */ #include -//#include - +#include +#define NTOS_MODE_USER +#include #include /* diff --git a/reactos/lib/user32/misc/resources.c b/reactos/lib/user32/misc/resources.c index 0db11e42b27..9fea0102490 100644 --- a/reactos/lib/user32/misc/resources.c +++ b/reactos/lib/user32/misc/resources.c @@ -1,6 +1,8 @@ #include #include #include +#define NTOS_MODE_USER +#include /*#include */ /* FIXME: Currently IsBadWritePtr is implemented using VirtualQuery which diff --git a/reactos/lib/user32/misc/strpool.c b/reactos/lib/user32/misc/strpool.c index e33a1f45468..bb7e5af773f 100644 --- a/reactos/lib/user32/misc/strpool.c +++ b/reactos/lib/user32/misc/strpool.c @@ -2,6 +2,8 @@ #include #include +#define NTOS_MODE_USER +#include #include #include diff --git a/reactos/lib/user32/misc/stubs.c b/reactos/lib/user32/misc/stubs.c index 9644a96064f..7adac2d4d57 100644 --- a/reactos/lib/user32/misc/stubs.c +++ b/reactos/lib/user32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.57 2004/03/23 21:47:36 weiden Exp $ +/* $Id: stubs.c,v 1.58 2004/04/09 20:03:14 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -12,10 +12,11 @@ #include #include #include -typedef UINT *LPUINT; #include #include - +#ifdef __USE_W32API +typedef PVOID LPIMEPROW, LPIMEPROA; +#endif /* * @unimplemented @@ -43,23 +44,6 @@ AttachThreadInput( } -/* - * @unimplemented - */ -long -STDCALL -BroadcastSystemMessage( - DWORD dwFlags, - LPDWORD lpdwRecipients, - UINT uiMessage, - WPARAM wParam, - LPARAM lParam) -{ - UNIMPLEMENTED; - return 0; -} - - /* * @unimplemented */ @@ -185,7 +169,7 @@ DWORD STDCALL MsgWaitForMultipleObjects( DWORD nCount, - CONST LPHANDLE pHandles, + CONST HANDLE *pHandles, BOOL fWaitAll, DWORD dwMilliseconds, DWORD dwWakeMask) diff --git a/reactos/lib/user32/misc/winsta.c b/reactos/lib/user32/misc/winsta.c index 76be6faf020..93fcb70cd50 100644 --- a/reactos/lib/user32/misc/winsta.c +++ b/reactos/lib/user32/misc/winsta.c @@ -1,4 +1,4 @@ -/* $Id: winsta.c,v 1.14 2004/01/23 23:38:26 ekohl Exp $ +/* $Id: winsta.c,v 1.15 2004/04/09 20:03:14 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -81,7 +81,7 @@ CreateWindowStationW(LPWSTR lpwinsta, * @unimplemented */ BOOL STDCALL -EnumWindowStationsA(ENUMWINDOWSTATIONPROCA lpEnumFunc, +EnumWindowStationsA(WINSTAENUMPROCA lpEnumFunc, LPARAM lParam) { UNIMPLEMENTED; @@ -93,7 +93,7 @@ EnumWindowStationsA(ENUMWINDOWSTATIONPROCA lpEnumFunc, * @unimplemented */ BOOL STDCALL -EnumWindowStationsW(ENUMWINDOWSTATIONPROCW lpEnumFunc, +EnumWindowStationsW(WINSTAENUMPROCW lpEnumFunc, LPARAM lParam) { PWCHAR Buffer; diff --git a/reactos/lib/user32/misc/wsprintf.c b/reactos/lib/user32/misc/wsprintf.c index 40f52ba6f04..c541b9435b7 100644 --- a/reactos/lib/user32/misc/wsprintf.c +++ b/reactos/lib/user32/misc/wsprintf.c @@ -35,6 +35,7 @@ #include #include #include +#include #include "strpool.h" #define WPRINTF_LEFTALIGN 0x0001 /* Align output on the left ('-' prefix) */ @@ -552,9 +553,9 @@ DWORD STDCALL WCSToMBEx(WORD CodePage,LPWSTR UnicodeString,LONG UnicodeSize,LPST } if (Allocate) { - *MBString = HEAP_alloc(MBSize); + *MBString = RtlAllocateHeap(GetProcessHeap(), 0, MBSize); } - if ((CodePage == 0) || (CodePage == NLS_ANSI_CODE_PAGE)) + if (CodePage == 0) { RtlUnicodeToMultiByteN(*MBString,MBSize,&Size,UnicodeString,UnicodeSize); } @@ -584,10 +585,10 @@ DWORD STDCALL MBToWCSEx(WORD CodePage,LPSTR MBString,LONG MBSize,LPWSTR *Unicode } if (Allocate) { - *UnicodeString = HEAP_alloc(UnicodeSize); + *UnicodeString = RtlAllocateHeap(GetProcessHeap(), 0, UnicodeSize); } UnicodeSize *= sizeof(WCHAR); - if ((CodePage == 0) || (CodePage == NLS_ANSI_CODE_PAGE)) + if (CodePage == 0) { RtlMultiByteToUnicodeN(*UnicodeString,UnicodeSize,&Size,MBString,MBSize); } diff --git a/reactos/lib/user32/user32.edf b/reactos/lib/user32/user32.edf index 84e875d2ebc..55f8ac223b0 100644 --- a/reactos/lib/user32/user32.edf +++ b/reactos/lib/user32/user32.edf @@ -17,7 +17,7 @@ BeginDeferWindowPos=BeginDeferWindowPos@4 BeginPaint=BeginPaint@8 BlockInput=BlockInput@4 BringWindowToTop=BringWindowToTop@4 -BroadcastSystemMessage=BroadcastSystemMessage@20 +BroadcastSystemMessage=BroadcastSystemMessageA@20 BroadcastSystemMessageA=BroadcastSystemMessageA@20 BroadcastSystemMessageExA=BroadcastSystemMessageExA@24 BroadcastSystemMessageExW=BroadcastSystemMessageExW@24 diff --git a/reactos/lib/user32/windows/accel.c b/reactos/lib/user32/windows/accel.c index 7eae3471280..2ddc8377a72 100644 --- a/reactos/lib/user32/windows/accel.c +++ b/reactos/lib/user32/windows/accel.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: accel.c,v 1.13 2004/01/28 21:00:23 gvg Exp $ +/* $Id: accel.c,v 1.14 2004/04/09 20:03:14 navaraf Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/input.c @@ -31,6 +31,8 @@ #include #include #include +#define NTOS_MODE_USER +#include /* this is the 8 byte accel struct used in Win32 resources (internal only) */ typedef struct @@ -101,7 +103,7 @@ HACCEL WINAPI U32LoadAccelerators(HINSTANCE hInstance, HRSRC hTableRes) /* failure */ if(hAccTableData == NULL) return NULL; - RtlEnterCriticalSection(&U32AccelCacheLock); + EnterCriticalSection(&U32AccelCacheLock); /* see if this accelerator table has already been loaded */ pEntry = *U32AccelCacheFind(NULL, hAccTableData); @@ -152,7 +154,7 @@ HACCEL WINAPI U32LoadAccelerators(HINSTANCE hInstance, HRSRC hTableRes) U32AccelCacheAdd(hAccTable, pAccTableResData); l_Leave: - RtlLeaveCriticalSection(&U32AccelCacheLock); + LeaveCriticalSection(&U32AccelCacheLock); return hAccTable; } @@ -186,7 +188,7 @@ BOOL WINAPI DestroyAcceleratorTable(HACCEL hAccel) U32_ACCEL_CACHE_ENTRY ** ppEntry; ULONG_PTR nUsage = 0; - RtlEnterCriticalSection(&U32AccelCacheLock); + EnterCriticalSection(&U32AccelCacheLock); /* see if this accelerator table has been cached */ ppEntry = U32AccelCacheFind(hAccel, NULL); @@ -210,7 +212,7 @@ BOOL WINAPI DestroyAcceleratorTable(HACCEL hAccel) } } - RtlLeaveCriticalSection(&U32AccelCacheLock); + LeaveCriticalSection(&U32AccelCacheLock); if(nUsage > 0) return FALSE; diff --git a/reactos/lib/user32/windows/bitmap.c b/reactos/lib/user32/windows/bitmap.c index cc4905ae585..02de153fe0c 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.27 2004/02/23 18:16:37 navaraf Exp $ +/* $Id: bitmap.c,v 1.28 2004/04/09 20:03:14 navaraf Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/input.c @@ -33,6 +33,8 @@ #include #include #include +#define NTOS_MODE_USER +#include /*forward declerations... actualy in user32\windows\icon.c but usful here****/ HICON ICON_CreateCursorFromData(HDC hDC, PVOID ImageData, ICONIMAGE* IconImage, int cxDesired, int cyDesired, int xHotspot, int yHotspot); @@ -221,7 +223,7 @@ LoadCursorImage(HINSTANCE hinst, LPCWSTR lpszName, UINT fuLoad) return(NULL); } - SafeIconImage = RtlAllocateHeap(RtlGetProcessHeap(), 0, dirEntry->dwBytesInRes); + SafeIconImage = RtlAllocateHeap(GetProcessHeap(), 0, dirEntry->dwBytesInRes); memcpy(SafeIconImage, ((PBYTE)IconDIR) + dirEntry->dwImageOffset, dirEntry->dwBytesInRes); } @@ -250,7 +252,7 @@ LoadCursorImage(HINSTANCE hinst, LPCWSTR lpszName, UINT fuLoad) hIcon = ICON_CreateCursorFromData(hScreenDc, Data, SafeIconImage, 32, 32, dirEntry->Info.cursor.wXHotspot, dirEntry->Info.cursor.wYHotspot); DeleteDC(hScreenDc); - RtlFreeHeap(RtlGetProcessHeap(), 0, SafeIconImage); + RtlFreeHeap(GetProcessHeap(), 0, SafeIconImage); return hIcon; } @@ -390,7 +392,7 @@ LoadIconImage(HINSTANCE hinst, LPCWSTR lpszName, INT width, INT height, UINT fuL return(NULL); } - SafeIconImage = RtlAllocateHeap(RtlGetProcessHeap(), 0, dirEntry->dwBytesInRes); + SafeIconImage = RtlAllocateHeap(GetProcessHeap(), 0, dirEntry->dwBytesInRes); memcpy(SafeIconImage, ((PBYTE)IconDIR) + dirEntry->dwImageOffset, dirEntry->dwBytesInRes); @@ -428,14 +430,14 @@ LoadIconImage(HINSTANCE hinst, LPCWSTR lpszName, INT width, INT height, UINT fuL { if (fuLoad & LR_LOADFROMFILE) { - RtlFreeHeap(RtlGetProcessHeap(), 0, SafeIconImage); + RtlFreeHeap(GetProcessHeap(), 0, SafeIconImage); UnmapViewOfFile(IconDIR); } return(NULL); } hIcon = ICON_CreateIconFromData(hScreenDc, Data, SafeIconImage, width, height, width/2, height/2); - RtlFreeHeap(RtlGetProcessHeap(), 0, SafeIconImage); + RtlFreeHeap(GetProcessHeap(), 0, SafeIconImage); return hIcon; } @@ -533,7 +535,7 @@ LoadBitmapImage(HINSTANCE hInstance, LPCWSTR lpszName, UINT fuLoad) } Data = (PVOID)BitmapInfo + HeaderSize; - PrivateInfo = RtlAllocateHeap(RtlGetProcessHeap(), 0, HeaderSize); + PrivateInfo = RtlAllocateHeap(GetProcessHeap(), 0, HeaderSize); if (PrivateInfo == NULL) { if (fuLoad & LR_LOADFROMFILE) @@ -572,7 +574,7 @@ LoadBitmapImage(HINSTANCE hInstance, LPCWSTR lpszName, UINT fuLoad) Data, PrivateInfo, DIB_RGB_COLORS); } - RtlFreeHeap(RtlGetProcessHeap(), 0, PrivateInfo); + RtlFreeHeap(GetProcessHeap(), 0, PrivateInfo); /*DeleteDC(hScreenDc);*/ if (fuLoad & LR_LOADFROMFILE) { diff --git a/reactos/lib/user32/windows/class.c b/reactos/lib/user32/windows/class.c index 03b88a02ada..c220b4a5500 100644 --- a/reactos/lib/user32/windows/class.c +++ b/reactos/lib/user32/windows/class.c @@ -1,4 +1,4 @@ -/* $Id: class.c,v 1.45 2004/04/08 21:14:21 navaraf Exp $ +/* $Id: class.c,v 1.46 2004/04/09 20:03:14 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -16,6 +16,8 @@ #include #include #include +#define NTOS_MODE_USER +#include @@ -490,7 +492,7 @@ RegisterClassExW(CONST WNDCLASSEXW *lpwcx) if ( !lpwcx->lpszClassName ) return 0; - hHeap = RtlGetProcessHeap(); + hHeap = GetProcessHeap(); RtlCopyMemory ( &wndclass, lpwcx, sizeof(WNDCLASSEXW) ); /* copy strings if needed */ diff --git a/reactos/lib/user32/windows/cursor.c b/reactos/lib/user32/windows/cursor.c index f7b903ed70c..128f9baa1b9 100644 --- a/reactos/lib/user32/windows/cursor.c +++ b/reactos/lib/user32/windows/cursor.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: cursor.c,v 1.19 2004/01/26 08:44:51 weiden Exp $ +/* $Id: cursor.c,v 1.20 2004/04/09 20:03:14 navaraf Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/cursor.c @@ -32,6 +32,9 @@ #include #include #include +#define NTOS_MODE_USER +#include +#undef CopyCursor HBITMAP CopyBitmap(HBITMAP bmp); diff --git a/reactos/lib/user32/windows/defwnd.c b/reactos/lib/user32/windows/defwnd.c index ed08b437b52..03a2fcc93ac 100644 --- a/reactos/lib/user32/windows/defwnd.c +++ b/reactos/lib/user32/windows/defwnd.c @@ -1,4 +1,4 @@ -/* $Id: defwnd.c,v 1.131 2004/04/05 22:42:11 weiden Exp $ +/* $Id: defwnd.c,v 1.132 2004/04/09 20:03:14 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -12,6 +12,7 @@ /* INCLUDES ******************************************************************/ #include +#include #include #include #include @@ -24,6 +25,13 @@ #define NDEBUG #include +#ifndef WM_SETVISIBLE +#define WM_SETVISIBLE 9 +#endif +#ifndef WM_QUERYDROPOBJECT +#define WM_QUERYDROPOBJECT 0x022B +#endif + LRESULT DefWndNCPaint(HWND hWnd, HRGN hRgn); LRESULT DefWndNCCalcSize(HWND hWnd, BOOL CalcSizeStruct, RECT *Rect); LRESULT DefWndNCActivate(HWND hWnd, WPARAM wParam); @@ -502,8 +510,8 @@ DefWndDoSizeMove(HWND hwnd, WORD wParam) SystemParametersInfoA(SPI_GETDRAGFULLWINDOWS, 0, &DragFullWindows, 0); - pt.x = SLOWORD(dwPoint); - pt.y = SHIWORD(dwPoint); + pt.x = GET_X_LPARAM(dwPoint); + pt.y = GET_Y_LPARAM(dwPoint); capturePoint = pt; if (IsZoomed(hwnd) || !IsWindowVisible(hwnd)) @@ -1013,8 +1021,8 @@ User32DefWindowProc(HWND hWnd, case WM_NCHITTEST: { POINT Point; - Point.x = SLOWORD(lParam); - Point.y = SHIWORD(lParam); + Point.x = GET_X_LPARAM(lParam); + Point.y = GET_Y_LPARAM(lParam); return (DefWndNCHitTest(hWnd, Point)); } @@ -1045,8 +1053,8 @@ User32DefWindowProc(HWND hWnd, { ReleaseCapture(); } - Pt.x = SLOWORD(lParam); - Pt.y = SHIWORD(lParam); + Pt.x = GET_X_LPARAM(lParam); + Pt.y = GET_Y_LPARAM(lParam); ClientToScreen(hWnd, &Pt); lParam = MAKELPARAM(Pt.x, Pt.y); if (bUnicode) @@ -1081,8 +1089,8 @@ User32DefWindowProc(HWND hWnd, Style = GetWindowLongW(hWnd, GWL_STYLE); - Pt.x = SLOWORD(lParam); - Pt.y = SHIWORD(lParam); + Pt.x = GET_X_LPARAM(lParam); + Pt.y = GET_Y_LPARAM(lParam); if (Style & WS_CHILD) { ScreenToClient(GetParent(hWnd), &Pt); @@ -1286,8 +1294,8 @@ User32DefWindowProc(HWND hWnd, case WM_SYSCOMMAND: { POINT Pt; - Pt.x = SLOWORD(lParam); - Pt.y = SHIWORD(lParam); + Pt.x = GET_X_LPARAM(lParam); + Pt.y = GET_Y_LPARAM(lParam); return (DefWndHandleSysCommand(hWnd, wParam, Pt)); } diff --git a/reactos/lib/user32/windows/dialog.c b/reactos/lib/user32/windows/dialog.c index a418016d48a..9269b830a96 100644 --- a/reactos/lib/user32/windows/dialog.c +++ b/reactos/lib/user32/windows/dialog.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: dialog.c,v 1.24 2004/01/23 23:38:26 ekohl Exp $ +/* $Id: dialog.c,v 1.25 2004/04/09 20:03:14 navaraf Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/dialog.c @@ -30,19 +30,21 @@ */ /* INCLUDES ******************************************************************/ + #define __NTAPP__ #include #include #include -#include #include #include +#include +#define NTOS_MODE_USER +#include #include #include "user32/regcontrol.h" #include "../controls/controls.h" - /* MACROS/DEFINITIONS ********************************************************/ #define DF_END 0x0001 @@ -1259,7 +1261,7 @@ inline static LPSTR HEAP_strdupWtoA( HANDLE heap, DWORD flags, LPCWSTR str ) if (!str) return NULL; len = WideCharToMultiByte( CP_ACP, 0, str, -1, NULL, 0, NULL, NULL ); - ret = RtlAllocateHeap(RtlGetProcessHeap(), flags, len ); + ret = RtlAllocateHeap(GetProcessHeap(), flags, len ); if(ret) WideCharToMultiByte( CP_ACP, 0, str, -1, ret, len, NULL, NULL ); return ret; } diff --git a/reactos/lib/user32/windows/hook.c b/reactos/lib/user32/windows/hook.c index 8d474f79fc0..26cecad1dcc 100644 --- a/reactos/lib/user32/windows/hook.c +++ b/reactos/lib/user32/windows/hook.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: hook.c,v 1.14 2004/01/23 23:38:26 ekohl Exp $ +/* $Id: hook.c,v 1.15 2004/04/09 20:03:14 navaraf Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/input.c @@ -31,6 +31,8 @@ #include #include #include +#define NTOS_MODE_USER +#include #define NDEBUG #include @@ -205,13 +207,13 @@ NotifyWinEvent( HWINEVENTHOOK STDCALL SetWinEventHook( - DWORD eventMin, - DWORD eventMax, + UINT eventMin, + UINT eventMax, HMODULE hmodWinEventProc, WINEVENTPROC pfnWinEventProc, DWORD idProcess, DWORD idThread, - DWORD dwFlags + UINT dwFlags ) { UNIMPLEMENTED; @@ -347,11 +349,11 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength) { if (0 != HIWORD(Csa.lpszClass)) { - RtlFreeHeap(RtlGetProcessHeap(), 0, (LPSTR) Csa.lpszClass); + RtlFreeHeap(GetProcessHeap(), 0, (LPSTR) Csa.lpszClass); } if (NULL != Csa.lpszName) { - RtlFreeHeap(RtlGetProcessHeap(), 0, (LPSTR) Csa.lpszName); + RtlFreeHeap(GetProcessHeap(), 0, (LPSTR) Csa.lpszName); } } break; diff --git a/reactos/lib/user32/windows/icon.c b/reactos/lib/user32/windows/icon.c index 8850e17c07b..8d8f70f1c2d 100644 --- a/reactos/lib/user32/windows/icon.c +++ b/reactos/lib/user32/windows/icon.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: icon.c,v 1.20 2004/02/23 22:04:38 navaraf Exp $ +/* $Id: icon.c,v 1.21 2004/04/09 20:03:14 navaraf Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/icon.c @@ -32,6 +32,8 @@ #include #include #include +#define NTOS_MODE_USER +#include #include /* FUNCTIONS *****************************************************************/ @@ -56,7 +58,7 @@ ICON_CreateIconFromData(HDC hDC, PVOID ImageData, ICONIMAGE* IconImage, int cxDe (IconImage->icHeader.biHeight ); /* create a BITMAPINFO header for the monocrome part of the icon */ - bwBIH = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof (BITMAPINFOHEADER)+2*sizeof(RGBQUAD)); + bwBIH = RtlAllocateHeap(GetProcessHeap(), 0, sizeof (BITMAPINFOHEADER)+2*sizeof(RGBQUAD)); bwBIH->bmiHeader.biBitCount = 1; bwBIH->bmiHeader.biWidth = IconImage->icHeader.biWidth; @@ -88,7 +90,7 @@ ICON_CreateIconFromData(HDC hDC, PVOID ImageData, ICONIMAGE* IconImage, int cxDe SetDIBits(hDC, IconInfo.hbmMask, 0, IconImage->icHeader.biHeight, ImageData, bwBIH, DIB_RGB_COLORS); - RtlFreeHeap(RtlGetProcessHeap(), 0, bwBIH); + RtlFreeHeap(GetProcessHeap(), 0, bwBIH); /* Create the icon based on everything we have so far */ return NtUserCreateCursorIconHandle(&IconInfo, FALSE); @@ -107,7 +109,7 @@ ICON_CreateCursorFromData(HDC hDC, PVOID ImageData, ICONIMAGE* IconImage, int cx IconInfo.yHotspot = yHotspot; /* create a BITMAPINFO header for the monocrome part of the icon */ - bwBIH = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof (BITMAPINFOHEADER)+2*sizeof(RGBQUAD)); + bwBIH = RtlAllocateHeap(GetProcessHeap(), 0, sizeof (BITMAPINFOHEADER)+2*sizeof(RGBQUAD)); bwBIH->bmiHeader.biBitCount = 1; bwBIH->bmiHeader.biWidth = IconImage->icHeader.biWidth; @@ -145,7 +147,7 @@ ICON_CreateCursorFromData(HDC hDC, PVOID ImageData, ICONIMAGE* IconImage, int cx IconInfo.hbmColor = (HBITMAP)0; - RtlFreeHeap(RtlGetProcessHeap(), 0, bwBIH); + RtlFreeHeap(GetProcessHeap(), 0, bwBIH); /* Create the icon based on everything we have so far */ return NtUserCreateCursorIconHandle(&IconInfo, FALSE); @@ -269,7 +271,7 @@ CreateIconFromResourceEx( } /* get an safe copy of the icon data */ - SafeIconImage = RtlAllocateHeap(RtlGetProcessHeap(), 0, cbIconBits); + SafeIconImage = RtlAllocateHeap(GetProcessHeap(), 0, cbIconBits); memcpy(SafeIconImage, pbIconBits, cbIconBits); /* take into acount the origonal height was for both the AND and XOR images */ @@ -296,7 +298,7 @@ CreateIconFromResourceEx( hScreenDc = CreateCompatibleDC(NULL); if (hScreenDc == NULL) { - RtlFreeHeap(RtlGetProcessHeap(), 0, SafeIconImage); + RtlFreeHeap(GetProcessHeap(), 0, SafeIconImage); return(NULL); } @@ -304,7 +306,7 @@ CreateIconFromResourceEx( hIcon = ICON_CreateIconFromData(hScreenDc, Data, SafeIconImage, cxDesired, cyDesired, wXHotspot, wYHotspot); else hIcon = ICON_CreateCursorFromData(hScreenDc, Data, SafeIconImage, cxDesired, cyDesired, wXHotspot, wYHotspot); - RtlFreeHeap(RtlGetProcessHeap(), 0, SafeIconImage); + RtlFreeHeap(GetProcessHeap(), 0, SafeIconImage); DeleteDC(hScreenDc); return hIcon; diff --git a/reactos/lib/user32/windows/mdi.c b/reactos/lib/user32/windows/mdi.c index af160cc1373..aa7b08ec27b 100644 --- a/reactos/lib/user32/windows/mdi.c +++ b/reactos/lib/user32/windows/mdi.c @@ -80,10 +80,6 @@ * */ -#ifdef __REACTOS__ -#define __USE_W32API -#endif - #include #include #include diff --git a/reactos/lib/user32/windows/menu.c b/reactos/lib/user32/windows/menu.c index f293a3d3dde..4b162e17e9d 100644 --- a/reactos/lib/user32/windows/menu.c +++ b/reactos/lib/user32/windows/menu.c @@ -21,7 +21,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: menu.c,v 1.61 2004/04/02 19:14:44 weiden Exp $ +/* $Id: menu.c,v 1.62 2004/04/09 20:03:15 navaraf Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/menu.c @@ -41,7 +41,8 @@ #include #include #include -#include +#define NTOS_MODE_USER +#include #include #include "user32/regcontrol.h" @@ -3585,7 +3586,7 @@ DrawMenuBar(HWND hWnd) /* * @implemented */ -UINT STDCALL +BOOL STDCALL EnableMenuItem(HMENU hMenu, UINT uIDEnableItem, UINT uEnable) @@ -4030,7 +4031,7 @@ InsertMenuItemW( UNICODE_STRING MenuText; BOOL res = FALSE; BOOL CleanHeap = FALSE; - HANDLE hHeap = RtlGetProcessHeap(); + HANDLE hHeap = GetProcessHeap(); mi.hbmpItem = (HBITMAP)0; // while we could just pass 'lpmii' to win32k, we make a copy so that @@ -4370,7 +4371,7 @@ SetMenuItemInfoA( HMENU hMenu, UINT uItem, BOOL fByPosition, - LPMENUITEMINFOA lpmii) + LPCMENUITEMINFOA lpmii) { UNIMPLEMENTED; return FALSE; @@ -4386,7 +4387,7 @@ SetMenuItemInfoW( HMENU hMenu, UINT uItem, BOOL fByPosition, - LPMENUITEMINFOW lpmii) + LPCMENUITEMINFOW lpmii) { UNIMPLEMENTED; return FALSE; diff --git a/reactos/lib/user32/windows/message.c b/reactos/lib/user32/windows/message.c index 0ce565ff3b0..52085ef5378 100644 --- a/reactos/lib/user32/windows/message.c +++ b/reactos/lib/user32/windows/message.c @@ -1,4 +1,4 @@ -/* $Id: message.c,v 1.36 2004/03/11 14:47:43 weiden Exp $ +/* $Id: message.c,v 1.37 2004/04/09 20:03:15 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -12,6 +12,8 @@ #include #include #include +#define NTOS_MODE_USER +#include /* * @implemented @@ -316,7 +318,7 @@ User32ConvertToAsciiMessage(UINT* Msg, WPARAM* wParam, LPARAM* lParam) ANSI_STRING AString; CsW = (CREATESTRUCTW*)(*lParam); - CsA = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(CREATESTRUCTA)); + CsA = RtlAllocateHeap(GetProcessHeap(), 0, sizeof(CREATESTRUCTA)); memcpy(CsA, CsW, sizeof(CREATESTRUCTW)); RtlInitUnicodeString(&UString, CsW->lpszName); @@ -360,7 +362,7 @@ User32FreeAsciiConvertedMessage(UINT Msg, WPARAM wParam, LPARAM lParam) LPSTR TempString; LPSTR InString; InString = (LPSTR)lParam; - TempString = RtlAllocateHeap(RtlGetProcessHeap(), 0, strlen(InString) + 1); + TempString = RtlAllocateHeap(GetProcessHeap(), 0, strlen(InString) + 1); strcpy(TempString, InString); RtlInitAnsiString(&AnsiString, TempString); UnicodeString.Length = wParam * sizeof(WCHAR); @@ -375,7 +377,7 @@ User32FreeAsciiConvertedMessage(UINT Msg, WPARAM wParam, LPARAM lParam) UnicodeString.Buffer[0] = L'\0'; } } - RtlFreeHeap(RtlGetProcessHeap(), 0, TempString); + RtlFreeHeap(GetProcessHeap(), 0, TempString); break; } case WM_SETTEXT: @@ -391,12 +393,12 @@ User32FreeAsciiConvertedMessage(UINT Msg, WPARAM wParam, LPARAM lParam) CREATESTRUCTA* Cs; Cs = (CREATESTRUCTA*)lParam; - RtlFreeHeap(RtlGetProcessHeap(), 0, (LPSTR)Cs->lpszName); + RtlFreeHeap(GetProcessHeap(), 0, (LPSTR)Cs->lpszName); if (HIWORD((ULONG)Cs->lpszClass) != 0) { - RtlFreeHeap(RtlGetProcessHeap(), 0, (LPSTR)Cs->lpszClass); + RtlFreeHeap(GetProcessHeap(), 0, (LPSTR)Cs->lpszClass); } - RtlFreeHeap(RtlGetProcessHeap(), 0, Cs); + RtlFreeHeap(GetProcessHeap(), 0, Cs); break; } } @@ -475,6 +477,10 @@ CallWindowProcA(WNDPROC lpPrevWndFunc, BOOL IsHandle; WndProcHandle wphData; + DbgPrint("CallWindowProcA(%p,%x,%x,%x,%x)\n",lpPrevWndFunc,hWnd,Msg,wParam,lParam); + if (lpPrevWndFunc == NULL) + lpPrevWndFunc = (WNDPROC)NtUserGetWindowLong(hWnd, GWL_WNDPROC, FALSE); + IsHandle = NtUserDereferenceWndProcHandle(lpPrevWndFunc,&wphData); if (! IsHandle) { @@ -967,18 +973,19 @@ SendNotifyMessageW( * @implemented */ BOOL STDCALL -TranslateMessage(CONST MSG *lpMsg) +TranslateMessageEx(CONST MSG *lpMsg, DWORD unk) { - return(TranslateMessageEx((LPMSG)lpMsg, 0)); + return(NtUserTranslateMessage((LPMSG)lpMsg, (HKL)unk)); } + /* * @implemented */ BOOL STDCALL -TranslateMessageEx(CONST MSG *lpMsg, DWORD unk) +TranslateMessage(CONST MSG *lpMsg) { - return(NtUserTranslateMessage((LPMSG)lpMsg, (HKL)unk)); + return(TranslateMessageEx((LPMSG)lpMsg, 0)); } @@ -1112,7 +1119,7 @@ BOOL STDCALL SetMessageQueue(int cMessagesMax) return TRUE; } typedef DWORD (WINAPI * RealGetQueueStatusProc)(UINT flags); -typedef DWORD (WINAPI * RealMsgWaitForMultipleObjectsExProc)(DWORD nCount, LPHANDLE lpHandles, DWORD dwMilliseconds, DWORD dwWakeMask, DWORD dwFlags); +typedef DWORD (WINAPI * RealMsgWaitForMultipleObjectsExProc)(DWORD nCount, CONST HANDLE *lpHandles, DWORD dwMilliseconds, DWORD dwWakeMask, DWORD dwFlags); typedef struct _USER_MESSAGE_PUMP_ADDRESSES { DWORD cbSize; @@ -1126,14 +1133,14 @@ DWORD STDCALL RealMsgWaitForMultipleObjectsEx( DWORD nCount, - LPHANDLE pHandles, + CONST HANDLE *pHandles, DWORD dwMilliseconds, DWORD dwWakeMask, DWORD dwFlags); typedef BOOL (WINAPI * MESSAGEPUMPHOOKPROC)(BOOL Unregistering,PUSER_MESSAGE_PUMP_ADDRESSES MessagePumpAddresses); -RTL_CRITICAL_SECTION gcsMPH; +CRITICAL_SECTION gcsMPH; MESSAGEPUMPHOOKPROC gpfnInitMPH; DWORD gcLoadMPH = 0; USER_MESSAGE_PUMP_ADDRESSES gmph = {sizeof(USER_MESSAGE_PUMP_ADDRESSES), @@ -1173,10 +1180,10 @@ void WINAPI ResetMessagePumpHook(PUSER_MESSAGE_PUMP_ADDRESSES Addresses) BOOL WINAPI RegisterMessagePumpHook(MESSAGEPUMPHOOKPROC Hook) { - RtlEnterCriticalSection(&gcsMPH); + EnterCriticalSection(&gcsMPH); if(!Hook) { SetLastError(ERROR_INVALID_PARAMETER); - RtlLeaveCriticalSection(&gcsMPH); + LeaveCriticalSection(&gcsMPH); return FALSE; } if(!gcLoadMPH) { @@ -1184,30 +1191,30 @@ BOOL WINAPI RegisterMessagePumpHook(MESSAGEPUMPHOOKPROC Hook) gpfnInitMPH = Hook; ResetMessagePumpHook(&Addresses); if(!Hook(FALSE, &Addresses) || !Addresses.cbSize) { - RtlLeaveCriticalSection(&gcsMPH); + LeaveCriticalSection(&gcsMPH); return FALSE; } memcpy(&gmph, &Addresses, Addresses.cbSize); } else { if(gpfnInitMPH != Hook) { - RtlLeaveCriticalSection(&gcsMPH); + LeaveCriticalSection(&gcsMPH); return FALSE; } } if(NtUserCallNoParam(NOPARAM_ROUTINE_INIT_MESSAGE_PUMP)) { - RtlLeaveCriticalSection(&gcsMPH); + LeaveCriticalSection(&gcsMPH); return FALSE; } if (!gcLoadMPH++) { InterlockedExchange(&gfMessagePumpHook, 1); } - RtlLeaveCriticalSection(&gcsMPH); + LeaveCriticalSection(&gcsMPH); return TRUE; } BOOL WINAPI UnregisterMessagePumpHook(VOID) { - RtlEnterCriticalSection(&gcsMPH); + EnterCriticalSection(&gcsMPH); if(gcLoadMPH > 0) { if(NtUserCallNoParam(NOPARAM_ROUTINE_UNINIT_MESSAGE_PUMP)) { gcLoadMPH--; @@ -1217,11 +1224,11 @@ BOOL WINAPI UnregisterMessagePumpHook(VOID) ResetMessagePumpHook(&gmph); gpfnInitMPH = 0; } - RtlLeaveCriticalSection(&gcsMPH); + LeaveCriticalSection(&gcsMPH); return TRUE; } } - RtlLeaveCriticalSection(&gcsMPH); + LeaveCriticalSection(&gcsMPH); return FALSE; } @@ -1230,7 +1237,7 @@ DWORD WINAPI GetQueueStatus(UINT flags) return IsInsideMessagePumpHook() ? gmph.RealGetQueueStatus(flags) : RealGetQueueStatus(flags); } -DWORD WINAPI MsgWaitForMultipleObjectsEx(DWORD nCount, LPHANDLE lpHandles, DWORD dwMilliseconds, DWORD dwWakeMask, DWORD dwFlags) +DWORD WINAPI MsgWaitForMultipleObjectsEx(DWORD nCount, CONST HANDLE *lpHandles, DWORD dwMilliseconds, DWORD dwWakeMask, DWORD dwFlags) { - return IsInsideMessagePumpHook() ? gmph.RealMsgWaitForMultipleObjectsEx(nCount, lpHandles,dwMilliseconds, dwWakeMask, dwFlags) : RealMsgWaitForMultipleObjectsEx(nCount, lpHandles,dwMilliseconds, dwWakeMask, dwFlags); + return IsInsideMessagePumpHook() ? gmph.RealMsgWaitForMultipleObjectsEx(nCount, lpHandles, dwMilliseconds, dwWakeMask, dwFlags) : RealMsgWaitForMultipleObjectsEx(nCount, lpHandles,dwMilliseconds, dwWakeMask, dwFlags); } diff --git a/reactos/lib/user32/windows/messagebox.c b/reactos/lib/user32/windows/messagebox.c index 7b5687966aa..dba2aecd7d7 100644 --- a/reactos/lib/user32/windows/messagebox.c +++ b/reactos/lib/user32/windows/messagebox.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: messagebox.c,v 1.24 2004/02/05 22:09:15 gvg Exp $ +/* $Id: messagebox.c,v 1.25 2004/04/09 20:03:15 navaraf Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/messagebox.c @@ -35,13 +35,14 @@ #include #include #include -#include +#define NTOS_MODE_USER +#include #include #include #include #include "resource.h" -typedef UINT *LPUINT; +//typedef UINT *LPUINT; #include /* DEFINES *******************************************************************/ @@ -207,7 +208,7 @@ static INT_PTR CALLBACK MessageBoxProc( HWND hwnd, UINT message, #define SAFETY_MARGIN 32 /* Extra number of bytes to allocate in case we counted wrong */ static int MessageBoxTimeoutIndirectW( - CONST LPMSGBOXPARAMS lpMsgBoxParams, UINT Timeout) + CONST MSGBOXPARAMS *lpMsgBoxParams, UINT Timeout) { DLGTEMPLATE *tpl; DLGITEMTEMPLATE *iico, *itxt; @@ -393,7 +394,7 @@ MessageBoxTimeoutIndirectW( (wcslen(ButtonText[i]) + 1) * sizeof(WCHAR); } - buf = RtlAllocateHeap(RtlGetProcessHeap(), 0, bufsize + SAFETY_MARGIN); + buf = RtlAllocateHeap(GetProcessHeap(), 0, bufsize + SAFETY_MARGIN); /* Just to be safe.... */ if(!buf) { @@ -633,7 +634,7 @@ MessageBoxTimeoutIndirectW( if(hFont) DeleteObject(hFont); - RtlFreeHeap(RtlGetProcessHeap(), 0, buf); + RtlFreeHeap(GetProcessHeap(), 0, buf); return ret; } @@ -667,7 +668,7 @@ MessageBoxExA( UINT uType, WORD wLanguageId) { - MSGBOXPARAMS msgbox; + MSGBOXPARAMSA msgbox; msgbox.cbSize = sizeof(msgbox); msgbox.hwndOwner = hWnd; @@ -696,13 +697,13 @@ MessageBoxExW( UINT uType, WORD wLanguageId) { - MSGBOXPARAMS msgbox; + MSGBOXPARAMSW msgbox; msgbox.cbSize = sizeof(msgbox); msgbox.hwndOwner = hWnd; msgbox.hInstance = 0; - msgbox.lpszText = (LPCSTR)lpText; - msgbox.lpszCaption =(LPCSTR) lpCaption; + msgbox.lpszText = lpText; + msgbox.lpszCaption = lpCaption; msgbox.dwStyle = uType; msgbox.lpszIcon = NULL; msgbox.dwContextHelpId = 0; @@ -719,9 +720,9 @@ MessageBoxExW( int STDCALL MessageBoxIndirectA( - CONST LPMSGBOXPARAMS lpMsgBoxParams) + CONST MSGBOXPARAMSA *lpMsgBoxParams) { - MSGBOXPARAMS msgboxW; + MSGBOXPARAMSW msgboxW; UNICODE_STRING textW, captionW, iconW; int ret; @@ -764,10 +765,10 @@ MessageBoxIndirectA( msgboxW.cbSize = sizeof(msgboxW); msgboxW.hwndOwner = lpMsgBoxParams->hwndOwner; msgboxW.hInstance = lpMsgBoxParams->hInstance; - msgboxW.lpszText = (LPCSTR)textW.Buffer; - msgboxW.lpszCaption = (LPCSTR)captionW.Buffer; + msgboxW.lpszText = textW.Buffer; + msgboxW.lpszCaption = captionW.Buffer; msgboxW.dwStyle = lpMsgBoxParams->dwStyle; - msgboxW.lpszIcon = (LPCSTR)iconW.Buffer; + msgboxW.lpszIcon = iconW.Buffer; msgboxW.dwContextHelpId = lpMsgBoxParams->dwContextHelpId; msgboxW.lpfnMsgBoxCallback = lpMsgBoxParams->lpfnMsgBoxCallback; msgboxW.dwLanguageId = lpMsgBoxParams->dwLanguageId; @@ -793,7 +794,7 @@ MessageBoxIndirectA( int STDCALL MessageBoxIndirectW( - CONST LPMSGBOXPARAMS lpMsgBoxParams) + CONST MSGBOXPARAMSW *lpMsgBoxParams) { return MessageBoxTimeoutIndirectW(lpMsgBoxParams, (UINT)-1); } @@ -826,7 +827,7 @@ MessageBoxTimeoutA( WORD wLanguageId, DWORD dwTime) { - MSGBOXPARAMS msgboxW; + MSGBOXPARAMSW msgboxW; UNICODE_STRING textW, captionW; int ret; @@ -843,8 +844,8 @@ MessageBoxTimeoutA( msgboxW.cbSize = sizeof(msgboxW); msgboxW.hwndOwner = hWnd; msgboxW.hInstance = 0; - msgboxW.lpszText = (LPCSTR)textW.Buffer; - msgboxW.lpszCaption = (LPCSTR)captionW.Buffer; + msgboxW.lpszText = textW.Buffer; + msgboxW.lpszCaption = captionW.Buffer; msgboxW.dwStyle = uType; msgboxW.lpszIcon = NULL; msgboxW.dwContextHelpId = 0; @@ -875,13 +876,13 @@ MessageBoxTimeoutW( WORD wLanguageId, DWORD dwTime) { - MSGBOXPARAMS msgbox; + MSGBOXPARAMSW msgbox; msgbox.cbSize = sizeof(msgbox); msgbox.hwndOwner = hWnd; msgbox.hInstance = 0; - msgbox.lpszText = (LPCSTR)lpText; - msgbox.lpszCaption =(LPCSTR) lpCaption; + msgbox.lpszText = lpText; + msgbox.lpszCaption = lpCaption; msgbox.dwStyle = uType; msgbox.lpszIcon = NULL; msgbox.dwContextHelpId = 0; diff --git a/reactos/lib/user32/windows/nonclient.c b/reactos/lib/user32/windows/nonclient.c index 0cfdbeb0d63..24278e2f030 100644 --- a/reactos/lib/user32/windows/nonclient.c +++ b/reactos/lib/user32/windows/nonclient.c @@ -66,6 +66,7 @@ Already defined in makefile now. ((Style & WS_CHILD) && (ParentStyle & WS_THICKFRAME) && !(ParentStyle & WS_MAXIMIZE) && \ (WindowRect.right - WindowRect.left == ParentClientRect.right) && \ (WindowRect.bottom - WindowRect.top == ParentClientRect.bottom))) + /* * FIXME: This should be moved to a header */ @@ -76,6 +77,8 @@ IntScrollHitTest(HWND hWnd, INT nBar, POINT pt, BOOL bDragging); HPEN STDCALL GetSysColorPen(int nIndex); +BOOL STDCALL GdiGradientFill(HDC,PTRIVERTEX,ULONG,PVOID,ULONG,ULONG); + extern ATOM AtomInternalPos; /* PRIVATE FUNCTIONS **********************************************************/ diff --git a/reactos/lib/user32/windows/paint.c b/reactos/lib/user32/windows/paint.c index 3744850c103..b1fde155683 100644 --- a/reactos/lib/user32/windows/paint.c +++ b/reactos/lib/user32/windows/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.25 2004/03/23 21:47:37 weiden Exp $ +/* $Id: paint.c,v 1.26 2004/04/09 20:03:15 navaraf Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/paint.c @@ -38,6 +38,8 @@ static HBRUSH FrameBrushes[13]; static HBITMAP hHatch; const DWORD HatchBitmap[4] = {0x5555AAAA, 0x5555AAAA, 0x5555AAAA, 0x5555AAAA}; +BOOL STDCALL PolyPatBlt(HDC,DWORD,PPATRECT,INT,ULONG); + /* FUNCTIONS *****************************************************************/ VOID diff --git a/reactos/lib/user32/windows/prop.c b/reactos/lib/user32/windows/prop.c index 9a03232f25d..ffee05974b4 100644 --- a/reactos/lib/user32/windows/prop.c +++ b/reactos/lib/user32/windows/prop.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: prop.c,v 1.11 2004/01/23 23:38:26 ekohl Exp $ +/* $Id: prop.c,v 1.12 2004/04/09 20:03:15 navaraf Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/input.c @@ -31,6 +31,8 @@ #include #include #include +#define NTOS_MODE_USER +#include #include typedef struct _PROPLISTITEM @@ -72,12 +74,12 @@ EnumPropsA(HWND hWnd, PROPENUMPROCA lpEnumFunc) if(Count > 0) { - pli = HEAP_alloc(Count); + pli = RtlAllocateHeap(GetProcessHeap(), 0, Count); Status = NtUserBuildPropList(hWnd, (LPVOID)pli, Count, &Count); if(!NT_SUCCESS(Status)) { - HEAP_free(pli); + RtlFreeHeap(GetProcessHeap(), 0, pli); if(Status == STATUS_INVALID_HANDLE) SetLastError(ERROR_INVALID_WINDOW_HANDLE); else @@ -98,7 +100,7 @@ EnumPropsA(HWND hWnd, PROPENUMPROCA lpEnumFunc) break; } - HEAP_free(pli); + RtlFreeHeap(GetProcessHeap(), 0, pli); } return ret; @@ -134,12 +136,12 @@ EnumPropsExA(HWND hWnd, PROPENUMPROCEXA lpEnumFunc, LPARAM lParam) if(Count > 0) { - pli = HEAP_alloc(Count); + pli = RtlAllocateHeap(GetProcessHeap(), 0, Count); Status = NtUserBuildPropList(hWnd, (LPVOID)pli, Count, &Count); if(!NT_SUCCESS(Status)) { - HEAP_free(pli); + RtlFreeHeap(GetProcessHeap(), 0, pli); if(Status == STATUS_INVALID_HANDLE) SetLastError(ERROR_INVALID_WINDOW_HANDLE); else @@ -160,7 +162,7 @@ EnumPropsExA(HWND hWnd, PROPENUMPROCEXA lpEnumFunc, LPARAM lParam) break; } - HEAP_free(pli); + RtlFreeHeap(GetProcessHeap(), 0, pli); } return ret; @@ -196,12 +198,12 @@ EnumPropsExW(HWND hWnd, PROPENUMPROCEXW lpEnumFunc, LPARAM lParam) if(Count > 0) { - pli = HEAP_alloc(Count); + pli = RtlAllocateHeap(GetProcessHeap(), 0, Count); Status = NtUserBuildPropList(hWnd, (LPVOID)pli, Count, &Count); if(!NT_SUCCESS(Status)) { - HEAP_free(pli); + RtlFreeHeap(GetProcessHeap(), 0, pli); if(Status == STATUS_INVALID_HANDLE) SetLastError(ERROR_INVALID_WINDOW_HANDLE); else @@ -222,7 +224,7 @@ EnumPropsExW(HWND hWnd, PROPENUMPROCEXW lpEnumFunc, LPARAM lParam) break; } - HEAP_free(pli); + RtlFreeHeap(GetProcessHeap(), 0, pli); } return ret; @@ -258,12 +260,12 @@ EnumPropsW(HWND hWnd, PROPENUMPROCW lpEnumFunc) if(Count > 0) { - pli = HEAP_alloc(Count); + pli = RtlAllocateHeap(GetProcessHeap(), 0, Count); Status = NtUserBuildPropList(hWnd, (LPVOID)pli, Count, &Count); if(!NT_SUCCESS(Status)) { - HEAP_free(pli); + RtlFreeHeap(GetProcessHeap(), 0, pli); if(Status == STATUS_INVALID_HANDLE) SetLastError(ERROR_INVALID_WINDOW_HANDLE); else @@ -284,7 +286,7 @@ EnumPropsW(HWND hWnd, PROPENUMPROCW lpEnumFunc) break; } - HEAP_free(pli); + RtlFreeHeap(GetProcessHeap(), 0, pli); } return ret; diff --git a/reactos/lib/user32/windows/text.c b/reactos/lib/user32/windows/text.c index e4349232b9d..bcd6e52c81d 100644 --- a/reactos/lib/user32/windows/text.c +++ b/reactos/lib/user32/windows/text.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: text.c,v 1.8 2004/01/23 23:38:26 ekohl Exp $ +/* $Id: text.c,v 1.9 2004/04/09 20:03:15 navaraf Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/input.c @@ -32,12 +32,10 @@ #include #include - -#include - +#define NTOS_MODE_USER +#include #include - const unsigned short wctype_table[] = { }; diff --git a/reactos/lib/user32/windows/window.c b/reactos/lib/user32/windows/window.c index 37b09e0429a..0730e67a0b4 100644 --- a/reactos/lib/user32/windows/window.c +++ b/reactos/lib/user32/windows/window.c @@ -1,4 +1,4 @@ -/* $Id: window.c,v 1.107 2004/04/08 21:14:21 navaraf Exp $ +/* $Id: window.c,v 1.108 2004/04/09 20:03:15 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -18,6 +18,8 @@ #include #include #include +#define NTOS_MODE_USER +#include #define NDEBUG #include @@ -1453,7 +1455,7 @@ GetWindowContextHelpId(HWND hwnd) /* * @implemented */ -DWORD +INT STDCALL InternalGetWindowText(HWND hWnd, LPWSTR lpString, int nMaxCount) { diff --git a/reactos/subsys/csrss/api/handle.c b/reactos/subsys/csrss/api/handle.c index ebc61c02e6a..027a2252c33 100644 --- a/reactos/subsys/csrss/api/handle.c +++ b/reactos/subsys/csrss/api/handle.c @@ -1,4 +1,4 @@ -/* $Id: handle.c,v 1.16 2004/01/11 17:31:15 gvg Exp $ +/* $Id: handle.c,v 1.17 2004/04/09 20:03:15 navaraf Exp $ * * reactos/subsys/csrss/api/handle.c * @@ -9,9 +9,8 @@ /* INCLUDES ******************************************************************/ -#include - #include +#include #include #include "api.h" diff --git a/reactos/subsys/csrss/api/process.c b/reactos/subsys/csrss/api/process.c index ef36f194bf8..75c5596cde1 100644 --- a/reactos/subsys/csrss/api/process.c +++ b/reactos/subsys/csrss/api/process.c @@ -1,4 +1,4 @@ -/* $Id: process.c,v 1.32 2004/01/11 17:31:15 gvg Exp $ +/* $Id: process.c,v 1.33 2004/04/09 20:03:15 navaraf Exp $ * * reactos/subsys/csrss/api/process.c * @@ -9,9 +9,8 @@ /* INCLUDES ******************************************************************/ -#include - #include +#include #include #include "api.h" #include "conio.h" @@ -172,8 +171,7 @@ CSR_API(CsrCreateProcess) CSRSS_API_REQUEST ApiRequest; CSRSS_API_REPLY ApiReply; - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); NewProcessData = CsrCreateProcessData(Request->Data.CreateProcessRequest.NewProcessId); @@ -195,11 +193,11 @@ CSR_API(CsrCreateProcess) { ApiRequest.Type = CSRSS_ALLOC_CONSOLE; ApiRequest.Header.DataSize = sizeof(CSRSS_ALLOC_CONSOLE_REQUEST); - ApiRequest.Header.MessageSize = sizeof(LPC_MESSAGE) + sizeof(CSRSS_ALLOC_CONSOLE_REQUEST); + ApiRequest.Header.MessageSize = LPC_MESSAGE_BASE_SIZE + sizeof(CSRSS_ALLOC_CONSOLE_REQUEST); ApiRequest.Data.AllocConsoleRequest.CtrlDispatcher = Request->Data.CreateProcessRequest.CtrlDispatcher; ApiReply.Header.DataSize = sizeof(CSRSS_ALLOC_CONSOLE_REPLY); - ApiReply.Header.MessageSize = sizeof(LPC_MESSAGE) + sizeof(CSRSS_ALLOC_CONSOLE_REPLY); + ApiReply.Header.MessageSize = LPC_MESSAGE_BASE_SIZE + sizeof(CSRSS_ALLOC_CONSOLE_REPLY); CsrApiCallHandler(NewProcessData, &ApiRequest, &ApiReply); @@ -263,8 +261,7 @@ CSR_API(CsrTerminateProcess) { NTSTATUS Status; - Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY) - - sizeof(LPC_MESSAGE); + Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Reply->Header.DataSize = sizeof(CSRSS_API_REPLY); if (ProcessData == NULL) @@ -281,8 +278,7 @@ CSR_API(CsrTerminateProcess) CSR_API(CsrConnectProcess) { Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Reply->Status = STATUS_SUCCESS; @@ -292,8 +288,7 @@ CSR_API(CsrConnectProcess) CSR_API(CsrGetShutdownParameters) { Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; if (ProcessData == NULL) { @@ -311,8 +306,7 @@ CSR_API(CsrGetShutdownParameters) CSR_API(CsrSetShutdownParameters) { Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; if (ProcessData == NULL) { @@ -330,7 +324,7 @@ CSR_API(CsrSetShutdownParameters) CSR_API(CsrGetInputHandle) { Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; if (ProcessData == NULL) { @@ -355,7 +349,7 @@ CSR_API(CsrGetInputHandle) CSR_API(CsrGetOutputHandle) { Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; if (ProcessData == NULL) { @@ -382,7 +376,7 @@ CSR_API(CsrGetOutputHandle) CSR_API(CsrCloseHandle) { Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; if (ProcessData == NULL) { @@ -398,7 +392,7 @@ CSR_API(CsrCloseHandle) CSR_API(CsrVerifyHandle) { Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Reply->Status = CsrVerifyObject(ProcessData, Request->Data.VerifyHandleRequest.Handle); if (!NT_SUCCESS(Reply->Status)) @@ -414,7 +408,7 @@ CSR_API(CsrDuplicateHandle) Object_t *Object; Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; ProcessData = CsrGetProcessData(Request->Data.DuplicateHandleRequest.ProcessId); Reply->Status = CsrGetObject(ProcessData, Request->Data.DuplicateHandleRequest.Handle, &Object); diff --git a/reactos/subsys/csrss/api/user.c b/reactos/subsys/csrss/api/user.c index df80679b79c..9a8b9760b08 100644 --- a/reactos/subsys/csrss/api/user.c +++ b/reactos/subsys/csrss/api/user.c @@ -1,4 +1,4 @@ -/* $Id: user.c,v 1.2 2002/11/03 20:01:07 chorns Exp $ +/* $Id: user.c,v 1.3 2004/04/09 20:03:15 navaraf Exp $ * * reactos/subsys/csrss/api/user.c * @@ -32,8 +32,7 @@ CSR_API(CsrRegisterServicesProcess) NTSTATUS Status; Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; if (ServicesProcessIdValid == TRUE) { @@ -56,10 +55,7 @@ CSR_API(CsrRegisterServicesProcess) CSR_API(CsrExitReactos) { Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - - sizeof(LPC_MESSAGE); - - + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Reply->Status = STATUS_NOT_IMPLEMENTED; diff --git a/reactos/subsys/csrss/api/wapi.c b/reactos/subsys/csrss/api/wapi.c index 8ba8e1a5e24..00a2a76514f 100644 --- a/reactos/subsys/csrss/api/wapi.c +++ b/reactos/subsys/csrss/api/wapi.c @@ -1,4 +1,4 @@ -/* $Id: wapi.c,v 1.33 2003/12/30 05:10:32 hyperion Exp $ +/* $Id: wapi.c,v 1.34 2004/04/09 20:03:15 navaraf Exp $ * * reactos/subsys/csrss/api/wapi.c * @@ -10,10 +10,9 @@ /* INCLUDES ******************************************************************/ -#include -#include -#include #include +#include +#include #include #include "api.h" @@ -93,7 +92,7 @@ CsrApiCallHandler(PCSRSS_PROCESS_DATA ProcessData, { DPRINT1("CSR: Unknown request type 0x%x\n", Request->Type); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Reply->Status = STATUS_INVALID_SYSTEM_SERVICE; } } diff --git a/reactos/subsys/csrss/init.c b/reactos/subsys/csrss/init.c index b7c745bf689..0c194cc08d4 100644 --- a/reactos/subsys/csrss/init.c +++ b/reactos/subsys/csrss/init.c @@ -1,4 +1,4 @@ -/* $Id: init.c,v 1.25 2003/12/03 21:50:49 gvg Exp $ +/* $Id: init.c,v 1.26 2004/04/09 20:03:15 navaraf Exp $ * * reactos/subsys/csrss/init.c * @@ -10,11 +10,11 @@ /* INCLUDES ******************************************************************/ +#include #include #include #include #include -#include #include #include diff --git a/reactos/subsys/csrss/makefile b/reactos/subsys/csrss/makefile index 3e4ba4d95e3..389be59adb1 100644 --- a/reactos/subsys/csrss/makefile +++ b/reactos/subsys/csrss/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.27 2003/12/30 05:11:54 hyperion Exp $ +# $Id: makefile,v 1.28 2004/04/09 20:03:15 navaraf Exp $ PATH_TO_TOP = ../.. @@ -18,7 +18,7 @@ TARGET_CFLAGS = -D__NTAPP__ -Wall -Werror -Iinclude TARGET_LFLAGS = -nostdlib # require os code to explicitly request A/W version of structs/functions -TARGET_CFLAGS += -D_DISABLE_TIDENTS +TARGET_CFLAGS += -D__USE_W32API -DWINVER=0x0600 -D_WIN32_WINNT=0x0501 SUBDIRS = win32csr diff --git a/reactos/subsys/csrss/print.c b/reactos/subsys/csrss/print.c index 51d8c0a71a8..b345f4af027 100644 --- a/reactos/subsys/csrss/print.c +++ b/reactos/subsys/csrss/print.c @@ -1,4 +1,4 @@ -/* $Id: print.c,v 1.6 2003/10/20 18:02:04 gvg Exp $ +/* $Id: print.c,v 1.7 2004/04/09 20:03:15 navaraf Exp $ * * smss.c - Session Manager * @@ -27,17 +27,16 @@ * Compiled successfully with egcs 1.1.2 */ -#include - #include - +#include +#include VOID STDCALL DisplayString(LPCWSTR lpwString) { UNICODE_STRING us; RtlInitUnicodeString (&us, lpwString); - NtDisplayString (&us); + ZwDisplayString (&us); } VOID STDCALL PrintString (char* fmt, ...) @@ -48,7 +47,7 @@ VOID STDCALL PrintString (char* fmt, ...) ANSI_STRING AnsiString; va_start(ap, fmt); - vsprintf(buffer, fmt, ap); + vsprintf(buffer, fmt, ap); va_end(ap); RtlInitAnsiString (&AnsiString, buffer); diff --git a/reactos/subsys/csrss/video.c b/reactos/subsys/csrss/video.c index aa825537c60..04ceb45f022 100644 --- a/reactos/subsys/csrss/video.c +++ b/reactos/subsys/csrss/video.c @@ -1,8 +1,11 @@ -/* $Id: video.c,v 1.9 2003/12/26 09:52:37 navaraf Exp $ +/* $Id: video.c,v 1.10 2004/04/09 20:03:15 navaraf Exp $ * * ReactOS Project */ + +#include #include +#include #include ULONG @@ -28,7 +31,7 @@ InitializeVideoAddressSpace(VOID) 0, NULL, NULL); - Status = NtOpenSection(&PhysMemHandle, SECTION_ALL_ACCESS, + Status = ZwOpenSection(&PhysMemHandle, SECTION_ALL_ACCESS, &ObjectAttributes); if (!NT_SUCCESS(Status)) { diff --git a/reactos/subsys/csrss/win32csr/conio.c b/reactos/subsys/csrss/win32csr/conio.c index 27bfc84b048..fe7c91b9fc1 100644 --- a/reactos/subsys/csrss/win32csr/conio.c +++ b/reactos/subsys/csrss/win32csr/conio.c @@ -1,4 +1,4 @@ -/* $Id: conio.c,v 1.9 2004/03/14 17:53:27 weiden Exp $ +/* $Id: conio.c,v 1.10 2004/04/09 20:03:16 navaraf Exp $ * * reactos/subsys/csrss/win32csr/conio.c * @@ -241,7 +241,7 @@ CSR_API(CsrAllocConsole) DPRINT("CsrAllocConsole\n"); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; if (ProcessData == NULL) { @@ -326,7 +326,7 @@ CSR_API(CsrFreeConsole) DPRINT("CsrFreeConsole\n"); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; if (ProcessData == NULL || ProcessData->Console == NULL) { @@ -516,7 +516,7 @@ CSR_API(CsrReadConsole) /* truncate length to CSRSS_MAX_READ_CONSOLE_REQUEST */ nNumberOfCharsToRead = Request->Data.ReadConsoleRequest.NrCharactersToRead > CSRSS_MAX_READ_CONSOLE_REQUEST ? CSRSS_MAX_READ_CONSOLE_REQUEST : Request->Data.ReadConsoleRequest.NrCharactersToRead; Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = Reply->Header.MessageSize - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = Reply->Header.MessageSize - LPC_MESSAGE_BASE_SIZE; Buffer = Reply->Data.ReadConsoleReply.Buffer; Status = ConioLockConsole(ProcessData, Request->Data.ReadConsoleRequest.ConsoleHandle, @@ -842,8 +842,7 @@ CSR_API(CsrWriteConsole) DPRINT("CsrWriteConsole\n"); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; if (Request->Header.DataSize < sizeof(CSRSS_WRITE_CONSOLE_REQUEST) - 1 @@ -1338,7 +1337,7 @@ CSR_API(CsrGetScreenBufferInfo) DPRINT("CsrGetScreenBufferInfo\n"); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Status = ConioLockScreenBuffer(ProcessData, Request->Data.ScreenBufferInfoRequest.ConsoleHandle, &Buff); if (! NT_SUCCESS(Status)) @@ -1380,7 +1379,7 @@ CSR_API(CsrSetCursor) } Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetCursorRequest.ConsoleHandle, &Buff); if (! NT_SUCCESS(Status)) @@ -1453,8 +1452,7 @@ CSR_API(CsrWriteConsoleOutputChar) DPRINT("CsrWriteConsoleOutputChar\n"); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; if (Request->Header.DataSize < sizeof(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR_REQUEST) - 1 @@ -1533,7 +1531,7 @@ CSR_API(CsrFillOutputChar) DPRINT("CsrFillOutputChar\n"); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Status = ConioConsoleFromProcessData(ProcessData, &Console); if (! NT_SUCCESS(Status)) @@ -1598,7 +1596,7 @@ CSR_API(CsrReadInputEvent) DPRINT("CsrReadInputEvent\n"); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Reply->Data.ReadInputReply.Event = ProcessData->ConsoleEvent; Status = ConioLockConsole(ProcessData, Request->Data.ReadInputRequest.ConsoleHandle, &Console); @@ -1655,8 +1653,7 @@ CSR_API(CsrWriteConsoleOutputAttrib) DPRINT("CsrWriteConsoleOutputAttrib\n"); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; if (Request->Header.DataSize < sizeof(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB_REQUEST) - 1 @@ -1743,7 +1740,7 @@ CSR_API(CsrFillOutputAttrib) } Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Status = ConioLockScreenBuffer(ProcessData, Request->Data.FillOutputAttribRequest.ConsoleHandle, &Buff); if (! NT_SUCCESS(Status)) { @@ -1799,7 +1796,7 @@ CSR_API(CsrGetCursorInfo) DPRINT("CsrGetCursorInfo\n"); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Status = ConioLockScreenBuffer(ProcessData, Request->Data.GetCursorInfoRequest.ConsoleHandle, &Buff); if (! NT_SUCCESS(Status)) @@ -1823,7 +1820,7 @@ CSR_API(CsrSetCursorInfo) DPRINT("CsrSetCursorInfo\n"); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Status = ConioConsoleFromProcessData(ProcessData, &Console); if (! NT_SUCCESS(Status)) @@ -1931,7 +1928,7 @@ CSR_API(CsrSetConsoleMode) DPRINT("CsrSetConsoleMode\n"); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Status = Win32CsrGetObject(ProcessData, Request->Data.SetConsoleModeRequest.ConsoleHandle, (Object_t **) &Console); @@ -1968,7 +1965,7 @@ CSR_API(CsrGetConsoleMode) DPRINT("CsrGetConsoleMode\n"); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Status = Win32CsrGetObject(ProcessData, Request->Data.GetConsoleModeRequest.ConsoleHandle, (Object_t **) &Console); if (! NT_SUCCESS(Status)) @@ -2017,7 +2014,7 @@ CSR_API(CsrCreateScreenBuffer) } Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Buff = HeapAlloc(Win32CsrApiHeap, 0, sizeof(CSRSS_SCREEN_BUFFER)); if (NULL == Buff) @@ -2060,7 +2057,7 @@ CSR_API(CsrSetScreenBuffer) } Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetScreenBufferRequest.OutputHandle, &Buff); if (! NT_SUCCESS(Status)) @@ -2102,7 +2099,7 @@ CSR_API(CsrSetTitle) DPRINT("CsrSetTitle\n"); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; if (Request->Header.DataSize < sizeof(CSRSS_SET_TITLE_REQUEST) - 1 @@ -2144,7 +2141,7 @@ CSR_API(CsrGetTitle) DPRINT("CsrGetTitle\n"); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Status = ConioLockConsole(ProcessData, Request->Data.GetTitleRequest.ConsoleHandle, &Console); @@ -2192,7 +2189,7 @@ CSR_API(CsrWriteConsoleOutput) } Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Status = ConioLockScreenBuffer(ProcessData, Request->Data.WriteConsoleOutputRequest.ConsoleHandle, &Buff); @@ -2276,7 +2273,7 @@ CSR_API(CsrFlushInputBuffer) DPRINT("CsrFlushInputBuffer\n"); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Status = ConioLockConsole(ProcessData, Request->Data.FlushInputBufferRequest.ConsoleInput, &Console); @@ -2327,7 +2324,7 @@ CSR_API(CsrScrollConsoleScreenBuffer) } Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Status = ConioLockScreenBuffer(ProcessData, ConsoleHandle, &Buff); if (! NT_SUCCESS(Status)) { @@ -2424,7 +2421,7 @@ CSR_API(CsrReadConsoleOutputChar) DPRINT("CsrReadConsoleOutputChar\n"); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = Reply->Header.MessageSize - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = Reply->Header.MessageSize - LPC_MESSAGE_BASE_SIZE; ReadBuffer = Reply->Data.ReadConsoleOutputCharReply.String; Status = ConioLockScreenBuffer(ProcessData, Request->Data.ReadConsoleOutputCharRequest.ConsoleHandle, &Buff); @@ -2479,7 +2476,7 @@ CSR_API(CsrReadConsoleOutputAttrib) DPRINT("CsrReadConsoleOutputAttrib\n"); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = Reply->Header.MessageSize - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = Reply->Header.MessageSize - LPC_MESSAGE_BASE_SIZE; ReadBuffer = Reply->Data.ReadConsoleOutputAttribReply.String; Status = ConioLockScreenBuffer(ProcessData, Request->Data.ReadConsoleOutputAttribRequest.ConsoleHandle, &Buff); @@ -2535,7 +2532,7 @@ CSR_API(CsrGetNumberOfConsoleInputEvents) DPRINT("CsrGetNumberOfConsoleInputEvents\n"); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = Reply->Header.MessageSize - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = Reply->Header.MessageSize - LPC_MESSAGE_BASE_SIZE; Status = ConioLockConsole(ProcessData, Request->Data.GetNumInputEventsRequest.ConsoleHandle, &Console); if (! NT_SUCCESS(Status)) @@ -2580,7 +2577,7 @@ CSR_API(CsrPeekConsoleInput) DPRINT("CsrPeekConsoleInput\n"); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Status = ConioLockConsole(ProcessData, Request->Data.GetNumInputEventsRequest.ConsoleHandle, &Console); if(! NT_SUCCESS(Status)) @@ -2650,7 +2647,7 @@ CSR_API(CsrReadConsoleOutput) DPRINT("CsrReadConsoleOutput\n"); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Status = ConioLockScreenBuffer(ProcessData, Request->Data.ReadConsoleOutputRequest.ConsoleHandle, &Buff); if (! NT_SUCCESS(Status)) @@ -2727,7 +2724,7 @@ CSR_API(CsrWriteConsoleInput) DPRINT("CsrWriteConsoleInput\n"); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Status = ConioLockConsole(ProcessData, Request->Data.WriteConsoleInputRequest.ConsoleHandle, &Console); if (! NT_SUCCESS(Status)) @@ -2817,7 +2814,7 @@ CSR_API(CsrHardwareStateProperty) DPRINT("CsrHardwareStateProperty\n"); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Status = ConioLockConsole(ProcessData, Request->Data.ConsoleHardwareStateRequest.ConsoleHandle, @@ -2857,7 +2854,7 @@ CSR_API(CsrGetConsoleWindow) DPRINT("CsrGetConsoleWindow\n"); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Status = ConioLockConsole(ProcessData, Request->Data.ConsoleWindowRequest.ConsoleHandle, @@ -2881,7 +2878,7 @@ CSR_API(CsrSetConsoleIcon) DPRINT("CsrSetConsoleIcon\n"); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Status = ConioLockConsole(ProcessData, Request->Data.ConsoleSetWindowIconRequest.ConsoleHandle, @@ -2893,7 +2890,7 @@ CSR_API(CsrSetConsoleIcon) Console->hWindowIcon = Request->Data.ConsoleSetWindowIconRequest.WindowIcon; Reply->Status = (ConioChangeIcon(Console) ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL); - Reply->Data.ConsoleSetWindowIconReply.WindowIcon = Console->hWindow; + Reply->Data.ConsoleSetWindowIconReply.WindowIcon = Console->hWindowIcon; ConioUnlockConsole(Console); diff --git a/reactos/subsys/csrss/win32csr/desktopbg.c b/reactos/subsys/csrss/win32csr/desktopbg.c index 3652b6b260d..a23cb8b59ed 100644 --- a/reactos/subsys/csrss/win32csr/desktopbg.c +++ b/reactos/subsys/csrss/win32csr/desktopbg.c @@ -1,4 +1,4 @@ -/* $Id: desktopbg.c,v 1.6 2004/01/17 15:18:25 navaraf Exp $ +/* $Id: desktopbg.c,v 1.7 2004/04/09 20:03:16 navaraf Exp $ * * reactos/subsys/csrss/win32csr/desktopbg.c * @@ -7,6 +7,18 @@ * ReactOS Operating System */ +/* + * There is a problem with size of LPC_MESSAGE structure. In the old ReactOS + * headers it doesn't contain the data field and so it has a different size. + * We must use this workaround to get our Data field 0-sized. + */ + +#include +#include +#undef ANYSIZE_ARRAY +#define ANYSIZE_ARRAY 0 +#include + #include #include @@ -187,7 +199,7 @@ CSR_API(CsrCreateDesktop) DPRINT("CsrCreateDesktop\n"); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; if (! Initialized) { @@ -241,7 +253,7 @@ CSR_API(CsrShowDesktop) DPRINT("CsrShowDesktop\n"); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Reply->Status = SendMessageW(Request->Data.ShowDesktopRequest.DesktopWindow, PM_SHOW_DESKTOP, @@ -258,7 +270,7 @@ CSR_API(CsrHideDesktop) DPRINT("CsrHideDesktop\n"); Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - sizeof(LPC_MESSAGE); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; Reply->Status = SendMessageW(Request->Data.ShowDesktopRequest.DesktopWindow, PM_HIDE_DESKTOP, 0, 0) diff --git a/reactos/subsys/csrss/win32csr/guiconsole.c b/reactos/subsys/csrss/win32csr/guiconsole.c index 1d77db93b44..4a437f1381c 100644 --- a/reactos/subsys/csrss/win32csr/guiconsole.c +++ b/reactos/subsys/csrss/win32csr/guiconsole.c @@ -1,4 +1,4 @@ -/* $Id: guiconsole.c,v 1.12 2004/03/14 17:53:27 weiden Exp $ +/* $Id: guiconsole.c,v 1.13 2004/04/09 20:03:16 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -63,7 +63,6 @@ GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create) HDC Dc; HFONT OldFont; TEXTMETRICW Metrics; - NTSTATUS Status; GuiData = HeapAlloc(Win32CsrApiHeap, HEAP_ZERO_MEMORY, sizeof(GUI_CONSOLE_DATA) + @@ -74,13 +73,7 @@ GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create) return FALSE; } - Status = RtlInitializeCriticalSection(&GuiData->Lock); - if (!NT_SUCCESS(Status)) - { - DPRINT1("RtlInitializeCriticalSection failed, Status=%x\n", Status); - HeapFree(Win32CsrApiHeap, 0, GuiData); - return FALSE; - } + InitializeCriticalSection(&GuiData->Lock); GuiData->LineBuffer = (PWCHAR)(GuiData + 1); @@ -92,7 +85,7 @@ GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create) if (NULL == GuiData->Font) { DPRINT1("GuiConsoleNcCreate: CreateFont failed\n"); - RtlDeleteCriticalSection(&GuiData->Lock); + DeleteCriticalSection(&GuiData->Lock); HeapFree(Win32CsrApiHeap, 0, GuiData); return FALSE; } @@ -101,7 +94,7 @@ GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create) { DPRINT1("GuiConsoleNcCreate: GetDC failed\n"); DeleteObject(GuiData->Font); - RtlDeleteCriticalSection(&GuiData->Lock); + DeleteCriticalSection(&GuiData->Lock); HeapFree(Win32CsrApiHeap, 0, GuiData); return FALSE; } @@ -111,7 +104,7 @@ GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create) DPRINT1("GuiConsoleNcCreate: SelectObject failed\n"); ReleaseDC(hWnd, Dc); DeleteObject(GuiData->Font); - RtlDeleteCriticalSection(&GuiData->Lock); + DeleteCriticalSection(&GuiData->Lock); HeapFree(Win32CsrApiHeap, 0, GuiData); return FALSE; } @@ -121,7 +114,7 @@ GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create) SelectObject(Dc, OldFont); ReleaseDC(hWnd, Dc); DeleteObject(GuiData->Font); - RtlDeleteCriticalSection(&GuiData->Lock); + DeleteCriticalSection(&GuiData->Lock); HeapFree(Win32CsrApiHeap, 0, GuiData); return FALSE; } @@ -498,7 +491,7 @@ GuiConsoleHandleNcDestroy(HWND hWnd) KillTimer(hWnd, 1); Console->PrivateData = NULL; DeleteDC(GuiData->MemoryDC); - RtlDeleteCriticalSection(&GuiData->Lock); + DeleteCriticalSection(&GuiData->Lock); HeapFree(Win32CsrApiHeap, 0, GuiData); } diff --git a/reactos/subsys/win32k/eng/bitblt.c b/reactos/subsys/win32k/eng/bitblt.c index 3cb4cc7a173..f378ca9db11 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.47 2004/04/07 19:57:43 navaraf Exp $ +/* $Id: bitblt.c,v 1.48 2004/04/09 20:03:16 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -113,7 +113,7 @@ BltMask(SURFOBJ* Dest, /* Pattern brushes */ PGDIBRUSHOBJ GdiBrush; HBITMAP PatternSurface = NULL; - PSURFOBJ PatternObj; + SURFOBJ *PatternObj; ULONG PatternWidth, PatternHeight, PatternY; if (Mask == NULL) @@ -137,7 +137,7 @@ BltMask(SURFOBJ* Dest, PatternSurface = BitmapToSurf(PatternBitmap, Dest->hdev); BITMAPOBJ_UnlockBitmap(GdiBrush->hbmPattern); - PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); + PatternObj = (SURFOBJ*)AccessUserObject((ULONG)PatternSurface); PatternWidth = PatternObj->sizlBitmap.cx; PatternHeight = PatternObj->sizlBitmap.cy; } @@ -176,7 +176,7 @@ BltMask(SURFOBJ* Dest, } if (PatternSurface != NULL) - EngDeleteSurface(PatternSurface); + EngDeleteSurface((HSURF)PatternSurface); return TRUE; } @@ -223,7 +223,16 @@ CallDibBitBlt(SURFOBJ* OutputObj, POINTL* BrushOrigin, ROP4 Rop4) { - return OutputGDI->DIB_BitBlt(OutputObj, InputObj, OutputGDI, InputGDI, OutputRect, InputPoint, Brush, BrushOrigin, ColorTranslation, Rop4); + POINTL RealBrushOrigin; + if (BrushOrigin == NULL) + { + RealBrushOrigin.x = RealBrushOrigin.y = 0; + } + else + { + RealBrushOrigin = *BrushOrigin; + } + return OutputGDI->DIB_BitBlt(OutputObj, InputObj, OutputGDI, InputGDI, OutputRect, InputPoint, Brush, RealBrushOrigin, ColorTranslation, Rop4); } INT abs(INT nm); @@ -600,7 +609,16 @@ CallDibStretchBlt(SURFOBJ* OutputObj, POINTL* BrushOrigin, ULONG Mode) { - return OutputGDI->DIB_StretchBlt(OutputObj, InputObj, OutputGDI, InputGDI, OutputRect, InputRect, MaskOrigin, BrushOrigin, ColorTranslation, Mode); + POINTL RealBrushOrigin; + if (BrushOrigin == NULL) + { + RealBrushOrigin.x = RealBrushOrigin.y = 0; + } + else + { + RealBrushOrigin = *BrushOrigin; + } + return OutputGDI->DIB_StretchBlt(OutputObj, InputObj, OutputGDI, InputGDI, OutputRect, InputRect, MaskOrigin, RealBrushOrigin, ColorTranslation, Mode); } diff --git a/reactos/subsys/win32k/eng/clip.c b/reactos/subsys/win32k/eng/clip.c index 7e5e879b15b..0eac12bb529 100644 --- a/reactos/subsys/win32k/eng/clip.c +++ b/reactos/subsys/win32k/eng/clip.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: clip.c,v 1.18 2003/12/31 14:43:48 weiden Exp $ +/* $Id: clip.c,v 1.19 2004/04/09 20:03:16 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -43,7 +43,7 @@ VOID STDCALL IntEngDeleteClipRegion(CLIPOBJ *ClipObj) } CLIPOBJ* STDCALL -IntEngCreateClipRegion(ULONG count, PRECTL pRect, RECTL rcBounds) +IntEngCreateClipRegion(ULONG count, PRECTL pRect, PRECTL rcBounds) { HCLIP hClip; CLIPGDI* clipInt; @@ -68,7 +68,7 @@ IntEngCreateClipRegion(ULONG count, PRECTL pRect, RECTL rcBounds) clipUser->iDComplexity = DC_COMPLEX; clipUser->iFComplexity = (count <= 4) ? FC_RECT4: FC_COMPLEX; clipUser->iMode = TC_RECTANGLES; - RtlCopyMemory(&(clipUser->rclBounds), &rcBounds, sizeof(RECTL)); + RtlCopyMemory(&(clipUser->rclBounds), rcBounds, sizeof(RECTL)); return clipUser; } @@ -80,20 +80,20 @@ IntEngCreateClipRegion(ULONG count, PRECTL pRect, RECTL rcBounds) if (hClip) { clipInt = (CLIPGDI *) AccessInternalObject(hClip); - RtlCopyMemory(clipInt->EnumRects.arcl, &rcBounds, sizeof(RECTL)); + RtlCopyMemory(clipInt->EnumRects.arcl, rcBounds, sizeof(RECTL)); clipInt->EnumRects.c = 1; clipInt->EnumOrder = CD_ANY; clipUser = (CLIPOBJ *) AccessUserObject(hClip); ASSERT(NULL != clipUser); - clipUser->iDComplexity = ((rcBounds.top==rcBounds.bottom) - && (rcBounds.left==rcBounds.right)) + clipUser->iDComplexity = ((rcBounds->top==rcBounds->bottom) + && (rcBounds->left==rcBounds->right)) ? DC_TRIVIAL : DC_RECT; clipUser->iFComplexity = FC_RECT; clipUser->iMode = TC_RECTANGLES; DPRINT("IntEngCreateClipRegion: iDComplexity: %d\n", clipUser->iDComplexity); - RtlCopyMemory(&(clipUser->rclBounds), &rcBounds, sizeof(RECTL)); + RtlCopyMemory(&(clipUser->rclBounds), rcBounds, sizeof(RECTL)); return clipUser; } } diff --git a/reactos/subsys/win32k/eng/clip.h b/reactos/subsys/win32k/eng/clip.h index 163a5d80bb8..8a9f19e5f04 100644 --- a/reactos/subsys/win32k/eng/clip.h +++ b/reactos/subsys/win32k/eng/clip.h @@ -20,7 +20,7 @@ #define __WIN32K_CLIP_H typedef ULONG HCLIP; -CLIPOBJ* STDCALL IntEngCreateClipRegion( ULONG count, PRECTL pRect, RECTL rcBounds ); +CLIPOBJ* STDCALL IntEngCreateClipRegion( ULONG count, PRECTL pRect, PRECTL rcBounds ); VOID STDCALL IntEngDeleteClipRegion(CLIPOBJ *ClipObj); diff --git a/reactos/subsys/win32k/eng/copybits.c b/reactos/subsys/win32k/eng/copybits.c index 6ccbeffcde6..7c5eb8885ca 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.22 2004/03/05 09:02:41 hbirr Exp $ +/* $Id: copybits.c,v 1.23 2004/04/09 20:03:16 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -55,6 +55,7 @@ EngCopyBits(SURFOBJ *Dest, POINTL ptlTmp; RECT_ENUM RectEnum; BOOL EnumMore; + POINTL BrushOrigin; MouseSafetyOnDrawStart(Source, SourceGDI, SourcePoint->x, SourcePoint->y, (SourcePoint->x + abs(DestRect->right - DestRect->left)), @@ -127,10 +128,12 @@ EngCopyBits(SURFOBJ *Dest, 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, NULL, ColorTranslation, SRCCOPY); + DestGDI->DIB_BitBlt(Dest, Source, DestGDI, SourceGDI, DestRect, SourcePoint, NULL, BrushOrigin, ColorTranslation, SRCCOPY); MouseSafetyOnDrawEnd(Dest, DestGDI); MouseSafetyOnDrawEnd(Source, SourceGDI); @@ -144,7 +147,7 @@ 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, NULL, ColorTranslation, SRCCOPY); + DestGDI->DIB_BitBlt(Dest, Source, DestGDI, SourceGDI, &rclTmp, &ptlTmp, NULL, BrushOrigin, ColorTranslation, SRCCOPY); MouseSafetyOnDrawEnd(Dest, DestGDI); MouseSafetyOnDrawEnd(Source, SourceGDI); @@ -170,7 +173,7 @@ EngCopyBits(SURFOBJ *Dest, ptlTmp.y = SourcePoint->y + prcl->top - DestRect->top; if(!DestGDI->DIB_BitBlt(Dest, Source, DestGDI, SourceGDI, - prcl, &ptlTmp, NULL, NULL, ColorTranslation, SRCCOPY)) return FALSE; + prcl, &ptlTmp, NULL, BrushOrigin, ColorTranslation, SRCCOPY)) return FALSE; prcl++; diff --git a/reactos/subsys/win32k/eng/event.c b/reactos/subsys/win32k/eng/event.c index c04235e6886..736c064a80e 100644 --- a/reactos/subsys/win32k/eng/event.c +++ b/reactos/subsys/win32k/eng/event.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: event.c,v 1.1 2004/03/08 07:04:56 dwelch Exp $ +/* $Id: event.c,v 1.2 2004/04/09 20:03:16 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -27,6 +27,9 @@ * 2/10/1999: Created */ +#include +#include +#include #include #include #include diff --git a/reactos/subsys/win32k/eng/float.c b/reactos/subsys/win32k/eng/float.c index 62329c3d9bd..69c4e2d36a5 100644 --- a/reactos/subsys/win32k/eng/float.c +++ b/reactos/subsys/win32k/eng/float.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: float.c,v 1.1 2004/03/11 21:38:58 dwelch Exp $ +/* $Id: float.c,v 1.2 2004/04/09 20:03:16 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -52,7 +52,7 @@ EngRestoreFloatingPointState ( IN VOID *Buffer ) return TRUE; } -BOOL +ULONG STDCALL EngSaveFloatingPointState(OUT VOID *Buffer, IN ULONG BufferSize) diff --git a/reactos/subsys/win32k/eng/gradient.c b/reactos/subsys/win32k/eng/gradient.c index fb8902170b5..f649aab8967 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.7 2004/04/06 21:53:48 weiden Exp $ +/* $Id: gradient.c,v 1.8 2004/04/09 20:03:16 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -93,7 +93,7 @@ IntEngGradientFillRect( SURFOBJ *OutputObj; SURFGDI *OutputGDI; TRIVERTEX *v1, *v2; - RECT rcGradient, rcSG; + RECTL rcGradient, rcSG; RECT_ENUM RectEnum; BOOL EnumMore; ULONG i; @@ -139,7 +139,7 @@ IntEngGradientFillRect( EnumMore = CLIPOBJ_bEnum(pco, (ULONG) sizeof(RectEnum), (PVOID) &RectEnum); for (i = 0; i < RectEnum.c && RectEnum.arcl[i].top <= rcSG.bottom; i++) { - if(NtGdiIntersectRect(&FillRect, &RectEnum.arcl[i], &rcSG)) + if(NtGdiIntersectRect(&FillRect, (PRECT)&RectEnum.arcl[i], (PRECT)&rcSG)) { HVINITCOL(Red, 0); HVINITCOL(Green, 1); @@ -166,7 +166,7 @@ IntEngGradientFillRect( EnumMore = CLIPOBJ_bEnum(pco, (ULONG) sizeof(RectEnum), (PVOID) &RectEnum); for (i = 0; i < RectEnum.c && RectEnum.arcl[i].top <= rcSG.bottom; i++) { - if(NtGdiIntersectRect(&FillRect, &RectEnum.arcl[i], &rcSG)) + if(NtGdiIntersectRect(&FillRect, (PRECT)&RectEnum.arcl[i], (PRECT)&rcSG)) { HVINITCOL(Red, 0); HVINITCOL(Green, 1); @@ -201,7 +201,7 @@ IntEngGradientFillRect( EnumMore = CLIPOBJ_bEnum(pco, (ULONG) sizeof(RectEnum), (PVOID) &RectEnum); for (i = 0; i < RectEnum.c && RectEnum.arcl[i].top <= rcSG.bottom; i++) { - if(NtGdiIntersectRect(&FillRect, &RectEnum.arcl[i], &rcSG)) + if(NtGdiIntersectRect(&FillRect, (PRECT)&RectEnum.arcl[i], (PRECT)&rcSG)) { for(; FillRect.top < FillRect.bottom; FillRect.top++) { @@ -337,7 +337,7 @@ IntEngGradientFillTriangle( ULONG i; POINTL Translate; INTENG_ENTER_LEAVE EnterLeave; - RECT FillRect; + RECTL FillRect; ULONG Color; BOOL sx[NLINES]; @@ -382,7 +382,7 @@ IntEngGradientFillTriangle( EnumMore = CLIPOBJ_bEnum(pco, (ULONG) sizeof(RectEnum), (PVOID) &RectEnum); for (i = 0; i < RectEnum.c && RectEnum.arcl[i].top <= prclExtents->bottom; i++) { - if(NtGdiIntersectRect(&FillRect, &RectEnum.arcl[i], prclExtents)) + if(NtGdiIntersectRect((PRECT)&FillRect, (PRECT)&RectEnum.arcl[i], (PRECT)prclExtents)) { BOOL InY; @@ -430,7 +430,7 @@ IntEngGradientFillTriangle( EnumMore = CLIPOBJ_bEnum(pco, (ULONG) sizeof(RectEnum), (PVOID) &RectEnum); for (i = 0; i < RectEnum.c && RectEnum.arcl[i].top <= prclExtents->bottom; i++) { - if(NtGdiIntersectRect(&FillRect, &RectEnum.arcl[i], prclExtents)) + if(NtGdiIntersectRect((PRECT)&FillRect, (PRECT)&RectEnum.arcl[i], (PRECT)prclExtents)) { S_INITLINE(v1, v3, 0); S_INITLINE(v1, v2, 1); diff --git a/reactos/subsys/win32k/eng/lineto.c b/reactos/subsys/win32k/eng/lineto.c index 00dcb8ff430..e56130fb60b 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.31 2004/03/27 00:35:02 weiden Exp $ + * $Id: lineto.c,v 1.32 2004/04/09 20:03:16 navaraf Exp $ */ #include @@ -502,9 +502,15 @@ IntEngLineTo(SURFOBJ *DestSurf, { BOOLEAN ret; SURFGDI *SurfGDI; + PGDIBRUSHOBJ GdiBrush; RECTL b; - if (Brush->logbrush.lbStyle == BS_NULL) + GdiBrush = CONTAINING_RECORD( + Brush, + GDIBRUSHOBJ, + BrushObject); + + if (GdiBrush->flAttrs & GDIBRUSH_IS_NULL) return TRUE; /* No success yet */ diff --git a/reactos/subsys/win32k/eng/misc.c b/reactos/subsys/win32k/eng/misc.c index 2198ae5bc1d..a86549b7339 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.4 2004/02/11 19:26:51 weiden Exp $ */ +/* $Id: misc.c,v 1.5 2004/04/09 20:03:16 navaraf Exp $ */ #include #include #include @@ -110,7 +110,7 @@ IntEngEnter(PINTENG_ENTER_LEAVE EnterLeave, { EngDeleteClip(EnterLeave->TrivialClipObj); EngFreeMem((*OutputObj)->pvBits); - EngDeleteSurface(EnterLeave->OutputBitmap); + EngDeleteSurface((HSURF)EnterLeave->OutputBitmap); return FALSE; } EnterLeave->DestRect.left = DestRect->left; @@ -182,7 +182,7 @@ IntEngLeave(PINTENG_ENTER_LEAVE EnterLeave) } } EngFreeMem(EnterLeave->OutputObj->pvBits); - EngDeleteSurface(EnterLeave->OutputBitmap); + EngDeleteSurface((HSURF)EnterLeave->OutputBitmap); EngDeleteClip(EnterLeave->TrivialClipObj); } else diff --git a/reactos/subsys/win32k/eng/mouse.c b/reactos/subsys/win32k/eng/mouse.c index b6de75051a3..274a8b0107d 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.64 2004/03/15 20:21:50 navaraf Exp $ +/* $Id: mouse.c,v 1.65 2004/04/09 20:03:16 navaraf Exp $ * * PROJECT: ReactOS kernel * PURPOSE: Mouse @@ -30,7 +30,7 @@ #include #include #include -#include +#include #include #include "objects.h" #include "include/msgqueue.h" @@ -54,7 +54,7 @@ /* FUNCTIONS *****************************************************************/ BOOL FASTCALL -IntIsPrimarSurface(PSURFGDI SurfGDI); +IntIsPrimarySurface(PSURFGDI SurfGDI); BOOL FASTCALL @@ -84,7 +84,7 @@ IntSwapMouseButton(PWINSTATION_OBJECT WinStaObject, BOOL Swap) } INT STDCALL -MouseSafetyOnDrawStart(PSURFOBJ SurfObj, PSURFGDI SurfGDI, LONG HazardX1, +MouseSafetyOnDrawStart(SURFOBJ *SurfObj, PSURFGDI SurfGDI, LONG HazardX1, LONG HazardY1, LONG HazardX2, LONG HazardY2) /* * FUNCTION: Notify the mouse driver that drawing is about to begin in @@ -113,7 +113,7 @@ MouseSafetyOnDrawStart(PSURFOBJ SurfObj, PSURFGDI SurfGDI, LONG HazardX1, ObDereferenceObject(InputWindowStation); return(FALSE); } - if (!IntIsPrimarSurface(SurfGDI) || MouseEnabled == FALSE) + if (!IntIsPrimarySurface(SurfGDI) || MouseEnabled == FALSE) { ObDereferenceObject(InputWindowStation); return(FALSE); @@ -176,7 +176,7 @@ SetPointerRect(PSYSTEM_CURSORINFO CurInfo, PRECTL PointerRect) } INT FASTCALL -MouseSafetyOnDrawEnd(PSURFOBJ SurfObj, PSURFGDI SurfGDI) +MouseSafetyOnDrawEnd(SURFOBJ *SurfObj, SURFGDI *SurfGDI) /* * FUNCTION: Notify the mouse driver that drawing has finished on a surface. */ @@ -201,7 +201,7 @@ MouseSafetyOnDrawEnd(PSURFOBJ SurfObj, PSURFGDI SurfGDI) } MouseEnabled = CurInfo->Enabled && CurInfo->ShowingCursor; - if (!IntIsPrimarSurface(SurfGDI) || MouseEnabled == FALSE) + if (!IntIsPrimarySurface(SurfGDI) || MouseEnabled == FALSE) { ExReleaseFastMutex(&CurInfo->CursorMutex); ObDereferenceObject(InputWindowStation); @@ -243,7 +243,7 @@ MouseMoveCursor(LONG X, LONG Y) HDC hDC; PDC dc; BOOL res = FALSE; - PSURFOBJ SurfObj; + SURFOBJ *SurfObj; PSURFGDI SurfGDI; PSYSTEM_CURSORINFO CurInfo; MSG Msg; @@ -269,7 +269,7 @@ MouseMoveCursor(LONG X, LONG Y) return FALSE; } dc = DC_LockDc(hDC); - SurfObj = (PSURFOBJ)AccessUserObject((ULONG) dc->Surface); + SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface); SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) dc->Surface); DC_UnlockDc( hDC ); IntCheckClipCursor(&X, &Y, CurInfo); @@ -323,7 +323,7 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount) LONG dScroll = 0; HDC hDC; PDC dc; - PSURFOBJ SurfObj; + SURFOBJ *SurfObj; PSURFGDI SurfGDI; MSG Msg; RECTL PointerRect; @@ -349,7 +349,7 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount) return; dc = DC_LockDc(hDC); - SurfObj = (PSURFOBJ)AccessUserObject((ULONG) dc->Surface); + SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface); SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) dc->Surface); DC_UnlockDc( hDC ); @@ -499,7 +499,7 @@ VOID FASTCALL EnableMouse(HDC hDisplayDC) { PDC dc; - PSURFOBJ SurfObj; + SURFOBJ *SurfObj; PSURFGDI SurfGDI; if( hDisplayDC && InputWindowStation) @@ -511,7 +511,7 @@ EnableMouse(HDC hDisplayDC) } dc = DC_LockDc(hDisplayDC); - SurfObj = (PSURFOBJ)AccessUserObject((ULONG) dc->Surface); + SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface); SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) dc->Surface); DC_UnlockDc( hDisplayDC ); diff --git a/reactos/subsys/win32k/eng/nls.c b/reactos/subsys/win32k/eng/nls.c index 6f6a25dd713..bbd357d3c20 100644 --- a/reactos/subsys/win32k/eng/nls.c +++ b/reactos/subsys/win32k/eng/nls.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: nls.c,v 1.2 2003/07/11 15:59:37 royce Exp $ +/* $Id: nls.c,v 1.3 2004/04/09 20:03:16 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -31,7 +31,7 @@ #include #include - +#include /* FUNCTIONS ****************************************************************/ diff --git a/reactos/subsys/win32k/eng/objects.h b/reactos/subsys/win32k/eng/objects.h index 712804b476c..dd266fe820a 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.29 2004/04/06 17:54:32 weiden Exp $ +/* $Id: objects.h,v 1.30 2004/04/09 20:03:16 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -157,12 +157,12 @@ 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, + 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, + POINTL *MaskOrigin, POINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Mode); typedef BOOLEAN (*PFN_DIB_TransparentBlt) (SURFOBJ *, SURFOBJ *, PSURFGDI, PSURFGDI, RECTL* , POINTL *, XLATEOBJ *,ULONG); diff --git a/reactos/subsys/win32k/eng/surface.c b/reactos/subsys/win32k/eng/surface.c index d709c5af86a..1519fee2a04 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.36 2004/04/06 17:54:32 weiden Exp $ +/* $Id: surface.c,v 1.37 2004/04/09 20:03:16 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -111,7 +111,7 @@ static VOID Dummy_VLine(SURFOBJ* SurfObj, LONG x, LONG y1, LONG y2, ULONG c) static BOOLEAN Dummy_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, POINTL *SourcePoint, - BRUSHOBJ* BrushObj, POINTL* BrushOrign, + BRUSHOBJ* BrushObj, POINTL BrushOrign, XLATEOBJ *ColorTranslation, ULONG Rop4) { return FALSE; @@ -120,7 +120,7 @@ static BOOLEAN Dummy_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, static BOOLEAN Dummy_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, - POINTL* MaskOrigin, POINTL* BrushOrign, + POINTL* MaskOrigin, POINTL BrushOrign, XLATEOBJ *ColorTranslation, ULONG Mode) { return FALSE; diff --git a/reactos/subsys/win32k/eng/transblt.c b/reactos/subsys/win32k/eng/transblt.c index be93adf6605..100c968b645 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.16 2004/04/07 22:17:36 weiden Exp $ +/* $Id: transblt.c,v 1.17 2004/04/09 20:03:18 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -47,10 +47,10 @@ BOOL STDCALL -EngTransparentBlt(PSURFOBJ Dest, - PSURFOBJ Source, - PCLIPOBJ Clip, - PXLATEOBJ ColorTranslation, +EngTransparentBlt(SURFOBJ *Dest, + SURFOBJ *Source, + CLIPOBJ *Clip, + XLATEOBJ *ColorTranslation, PRECTL DestRect, PRECTL SourceRect, ULONG iTransColor, @@ -217,10 +217,10 @@ EngTransparentBlt(PSURFOBJ Dest, } BOOL FASTCALL -IntEngTransparentBlt(PSURFOBJ Dest, - PSURFOBJ Source, - PCLIPOBJ Clip, - PXLATEOBJ ColorTranslation, +IntEngTransparentBlt(SURFOBJ *Dest, + SURFOBJ *Source, + CLIPOBJ *Clip, + XLATEOBJ *ColorTranslation, PRECTL DestRect, PRECTL SourceRect, ULONG iTransColor, diff --git a/reactos/subsys/win32k/include/class.h b/reactos/subsys/win32k/include/class.h index 2beed0598f2..8175560ff56 100644 --- a/reactos/subsys/win32k/include/class.h +++ b/reactos/subsys/win32k/include/class.h @@ -3,6 +3,7 @@ #include #include +#include #include #define IS_ATOM(x) \ diff --git a/reactos/subsys/win32k/include/color.h b/reactos/subsys/win32k/include/color.h index 48b2d3b2273..8106d653c64 100644 --- a/reactos/subsys/win32k/include/color.h +++ b/reactos/subsys/win32k/include/color.h @@ -1,9 +1,11 @@ #ifndef _WIN32K_COLOR_H #define _WIN32K_COLOR_H +#define NB_RESERVED_COLORS 20 /* number of fixed colors in system palette */ + const PALETTEENTRY* FASTCALL COLOR_GetSystemPaletteTemplate (VOID); COLORREF STDCALL COLOR_LookupNearestColor (PALETTEENTRY* palPalEntry, INT size, COLORREF color); INT STDCALL COLOR_PaletteLookupExactIndex (PALETTEENTRY* palPalEntry, INT size, COLORREF col); -INT STDCALL COLOR_PaletteLookupPixel(PALETTEENTRY *palPalEntry, INT size, PXLATEOBJ XlateObj, COLORREF col, BOOL skipReserved); +INT STDCALL COLOR_PaletteLookupPixel(PALETTEENTRY *palPalEntry, INT size, XLATEOBJ *XlateObj, COLORREF col, BOOL skipReserved); #endif /* _WIN32K_COLOR_H */ diff --git a/reactos/subsys/win32k/include/inteng.h b/reactos/subsys/win32k/include/inteng.h index f3211d81a73..2f90775eb3a 100644 --- a/reactos/subsys/win32k/include/inteng.h +++ b/reactos/subsys/win32k/include/inteng.h @@ -68,13 +68,13 @@ BOOL STDCALL IntEngPolyline(SURFOBJ *DestSurf, MIX mix); CLIPOBJ* STDCALL IntEngCreateClipRegion(ULONG count, PRECTL pRect, - RECTL rcBounds); + PRECTL rcBounds); BOOL FASTCALL -IntEngTransparentBlt(PSURFOBJ Dest, - PSURFOBJ Source, - PCLIPOBJ Clip, - PXLATEOBJ ColorTranslation, +IntEngTransparentBlt(SURFOBJ *Dest, + SURFOBJ *Source, + CLIPOBJ *Clip, + XLATEOBJ *ColorTranslation, PRECTL DestRect, PRECTL SourceRect, ULONG iTransColor, diff --git a/reactos/subsys/win32k/include/intgdi.h b/reactos/subsys/win32k/include/intgdi.h index 830b7670e57..2d62ae20602 100644 --- a/reactos/subsys/win32k/include/intgdi.h +++ b/reactos/subsys/win32k/include/intgdi.h @@ -21,7 +21,7 @@ IntPatBlt(DC *dc, INT Width, INT Height, DWORD ROP, - PBRUSHOBJ BrushObj); + BRUSHOBJ *BrushObj); /* Pen functions */ diff --git a/reactos/subsys/win32k/include/palette.h b/reactos/subsys/win32k/include/palette.h index dca8ddd6b63..5368f746429 100644 --- a/reactos/subsys/win32k/include/palette.h +++ b/reactos/subsys/win32k/include/palette.h @@ -1,6 +1,8 @@ #ifndef _WIN32K_PALETTE_H #define _WIN32K_PALETTE_H +#define NO_MAPPING + #define PALETTE_FIXED 0x0001 /* read-only colormap - have to use XAllocColor (if not virtual) */ #define PALETTE_VIRTUAL 0x0002 /* no mapping needed - pixel == pixel color */ @@ -14,8 +16,8 @@ typedef struct { } ColorShifts; typedef struct _PALGDI { - PALOBJ PalObj; - + PALOBJ PalObj; + XLATEOBJ *logicalToSystem; HPALETTE Self; ULONG Mode; // PAL_INDEXED, PAL_BITFIELDS, PAL_RGB, PAL_BGR ULONG NumColors; @@ -37,7 +39,9 @@ HPALETTE FASTCALL PALETTE_AllocPalette(ULONG Mode, HPALETTE FASTCALL PALETTE_Init (VOID); VOID FASTCALL PALETTE_ValidateFlags (PALETTEENTRY* lpPalE, INT size); +#ifndef NO_MAPPING INT STDCALL PALETTE_SetMapping(PALOBJ* palPtr, UINT uStart, UINT uNum, BOOL mapOnly); +#endif INT FASTCALL PALETTE_ToPhysical (PDC dc, COLORREF color); PPALETTEENTRY FASTCALL ReturnSystemPalette (VOID); diff --git a/reactos/subsys/win32k/include/useratom.h b/reactos/subsys/win32k/include/useratom.h index 163cb24f4dd..ff04c4347f0 100644 --- a/reactos/subsys/win32k/include/useratom.h +++ b/reactos/subsys/win32k/include/useratom.h @@ -2,6 +2,7 @@ #define _WIN32K_USERATOM_H #include +#include RTL_ATOM FASTCALL IntAddAtom(LPWSTR AtomName); diff --git a/reactos/subsys/win32k/ldr/loader.c b/reactos/subsys/win32k/ldr/loader.c index 8e2fe162268..0c1e42c846e 100644 --- a/reactos/subsys/win32k/ldr/loader.c +++ b/reactos/subsys/win32k/ldr/loader.c @@ -16,16 +16,70 @@ * 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.14 2004/03/07 04:44:41 dwelch Exp $ +/* $Id: loader.c,v 1.15 2004/04/09 20:03:18 navaraf Exp $ * */ #include #include +#include #define NDEBUG #include +#ifdef __USE_W32API +PIMAGE_NT_HEADERS STDCALL +RtlImageNtHeader(IN PVOID BaseAddress); +#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. @@ -147,52 +201,4 @@ EngLoadModule(LPWSTR ModuleName) return (HANDLE)GdiDriverInfo.ModuleBase; } -/* - * 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; -} - /* EOF */ diff --git a/reactos/subsys/win32k/main/dllmain.c b/reactos/subsys/win32k/main/dllmain.c index 13d37e615bf..58daf9ef0e7 100644 --- a/reactos/subsys/win32k/main/dllmain.c +++ b/reactos/subsys/win32k/main/dllmain.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: dllmain.c,v 1.67 2004/02/24 01:30:57 weiden Exp $ +/* $Id: dllmain.c,v 1.68 2004/04/09 20:03:18 navaraf Exp $ * * Entry Point for win32k.sys */ @@ -26,6 +26,10 @@ #include #define NTOS_MODE_KERNEL #include + +#ifdef __USE_W32API +#include +#endif #include #include @@ -49,6 +53,25 @@ #define NDEBUG #include +#ifdef __USE_W32API +typedef NTSTATUS (STDCALL *PW32_PROCESS_CALLBACK)( + struct _EPROCESS *Process, + BOOLEAN Create); + +typedef NTSTATUS (STDCALL *PW32_THREAD_CALLBACK)( + struct _ETHREAD *Thread, + BOOLEAN Create); + +VOID STDCALL +PsEstablishWin32Callouts( + PW32_PROCESS_CALLBACK W32ProcessCallback, + PW32_THREAD_CALLBACK W32ThreadCallback, + PVOID Param3, + PVOID Param4, + ULONG W32ThreadSize, + ULONG W32ProcessSize); +#endif + extern SSDT Win32kSSDT[]; extern SSPT Win32kSSPT[]; extern ULONG Win32kNumberOfSysCalls; diff --git a/reactos/subsys/win32k/makefile b/reactos/subsys/win32k/makefile index d0b29a4aff6..103533b52fa 100644 --- a/reactos/subsys/win32k/makefile +++ b/reactos/subsys/win32k/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.96 2004/03/11 21:38:58 dwelch Exp $ +# $Id: makefile,v 1.97 2004/04/09 20:03:18 navaraf Exp $ PATH_TO_TOP = ../.. @@ -27,11 +27,9 @@ TARGET_CFLAGS =\ -I$(PATH_TO_TOP)/ntoskrnl/include \ -I$(FREETYPE_DIR)/include \ -DUNICODE \ - -Wall -Werror - -# require os code to explicitly request A/W version of structs/functions -#TARGET_CFLAGS += -D_DISABLE_TIDENTS -D__USE_W32API -TARGET_CFLAGS += -D_DISABLE_TIDENTS + -Wall -Werror \ + -D__USE_W32API -D_WIN32_WINNT=0x0500 \ + -DWINVER=0x600 -D_WIN32K_ TARGET_LFLAGS =\ $(PATH_TO_TOP)/dk/nkm/lib/freetype.a \ diff --git a/reactos/subsys/win32k/misc/driver.c b/reactos/subsys/win32k/misc/driver.c index c87e80a013b..609259506fd 100644 --- a/reactos/subsys/win32k/misc/driver.c +++ b/reactos/subsys/win32k/misc/driver.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: driver.c,v 1.37 2004/03/06 01:22:03 navaraf Exp $ +/* $Id: driver.c,v 1.38 2004/04/09 20:03:19 navaraf Exp $ * * GDI Driver support routines * (mostly swiped from Wine) @@ -33,6 +33,7 @@ #include #include #include +#include #include #include diff --git a/reactos/subsys/win32k/ntuser/class.c b/reactos/subsys/win32k/ntuser/class.c index e4d07315693..84bdaee775a 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.50 2004/04/05 14:42:30 weiden Exp $ +/* $Id: class.c,v 1.51 2004/04/09 20:03:19 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -161,9 +161,11 @@ NtUserGetClassInfo(HINSTANCE hInstance, LPCWSTR lpClassName, NTSTATUS Status; RTL_ATOM Atom; + DPRINT("NtUserGetClassInfo(%S)\n", lpClassName); Status = ClassReferenceClassByNameOrAtom(&Class, lpClassName); if (!NT_SUCCESS(Status)) { + DPRINT("Error (%x)\n", Status); SetLastNtError(Status); return 0; } @@ -173,6 +175,7 @@ NtUserGetClassInfo(HINSTANCE hInstance, LPCWSTR lpClassName, lpWndClassEx->lpfnWndProc = Class->lpfnWndProcA; else lpWndClassEx->lpfnWndProc = Class->lpfnWndProcW; + DPRINT("%x\n", lpWndClassEx->lpfnWndProc); lpWndClassEx->cbClsExtra = Class->cbClsExtra; lpWndClassEx->cbWndExtra = Class->cbWndExtra; lpWndClassEx->hInstance = Class->hInstance; @@ -414,6 +417,7 @@ NtUserRegisterClassExWOW( } if (!IS_ATOM(SafeClass.lpszClassName)) { + DPRINT("NtUserRegisterClassExWOW(%S)\n", SafeClass.lpszClassName); /* FIXME - Safely copy/verify the buffer first!!! */ Status = RtlAddAtomToAtomTable(WinStaObject->AtomTable, (LPWSTR)SafeClass.lpszClassName, @@ -642,6 +646,8 @@ NtUserUnregisterClass( PWNDCLASS_OBJECT Class; PWINSTATION_OBJECT WinStaObject; + DPRINT("NtUserUnregisterClass(%S)\n", ClassNameOrAtom); + if (!ClassNameOrAtom) { SetLastWin32Error(ERROR_INVALID_PARAMETER); diff --git a/reactos/subsys/win32k/ntuser/desktop.c b/reactos/subsys/win32k/ntuser/desktop.c index 558c09f4006..f0f5a02740a 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.9 2004/02/21 13:13:26 navaraf Exp $ + * $Id: desktop.c,v 1.10 2004/04/09 20:03:19 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -30,11 +30,9 @@ /* INCLUDES ******************************************************************/ #define __WIN32K__ -#define NTOS_MODE_KERNEL -#include #include -#include #include +#include #include #include #include @@ -116,9 +114,9 @@ IntGetDesktopWorkArea(PDESKTOP_OBJECT Desktop) if((Ret->right == -1) && ScreenDeviceContext) { PDC dc; - PSURFOBJ SurfObj; + SURFOBJ *SurfObj; dc = DC_LockDc(ScreenDeviceContext); - SurfObj = (PSURFOBJ)AccessUserObject((ULONG) dc->Surface); + SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface); if(SurfObj) { Ret->right = SurfObj->sizlBitmap.cx; @@ -197,7 +195,7 @@ NotifyCsrss(PCSRSS_API_REQUEST Request, PCSRSS_API_REPLY Reply) return Status; } - Request->Header.DataSize = sizeof(CSRSS_API_REQUEST) - sizeof(LPC_MESSAGE); + Request->Header.DataSize = sizeof(CSRSS_API_REQUEST) - LPC_MESSAGE_BASE_SIZE; Request->Header.MessageSize = sizeof(CSRSS_API_REQUEST); Status = ZwRequestWaitReplyPort(WindowsApiPort, @@ -347,7 +345,7 @@ NtUserCreateDesktop( UserMode, dwDesiredAccess, NULL, - &Desktop); + (HANDLE*)&Desktop); if (NT_SUCCESS(Status)) { @@ -395,7 +393,7 @@ NtUserCreateDesktop( STANDARD_RIGHTS_REQUIRED, 0, NULL, - &Desktop); + (HANDLE*)&Desktop); DesktopObject->Self = (HANDLE)Desktop; @@ -506,7 +504,7 @@ NtUserOpenDesktop( UserMode, dwDesiredAccess, NULL, - &Desktop); + (HANDLE*)&Desktop); if (!NT_SUCCESS(Status)) { @@ -558,7 +556,7 @@ NtUserOpenInputDesktop( /* Get a pointer to the desktop object */ Status = IntValidateDesktopHandle( - InputDesktop, + InputDesktopHandle, UserMode, 0, &Object); @@ -578,7 +576,7 @@ NtUserOpenInputDesktop( dwDesiredAccess, ExDesktopObjectType, UserMode, - &Desktop); + (HANDLE*)&Desktop); ObDereferenceObject(Object); diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index f78f4e1c8ab..d702e2ed690 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.58 2004/04/02 22:16:09 weiden Exp $ +/* $Id: misc.c,v 1.59 2004/04/09 20:03:19 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -665,14 +665,14 @@ NtUserSystemParametersInfo( { HDC hDC; PDC dc; - PSURFOBJ SurfObj; + SURFOBJ *SurfObj; BOOL Ret = GradientCaptions; hDC = IntGetScreenDC(); if(hDC) { dc = DC_LockDc(hDC); - SurfObj = (PSURFOBJ)AccessUserObject((ULONG) dc->Surface); + SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface); if(SurfObj) Ret = (SurfObj->iBitmapFormat > BMF_8BPP); DC_UnlockDc(hDC); diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index d87b4f771d0..58e18c3e2ed 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.81 2004/04/07 21:12:08 gvg Exp $ +/* $Id: msgqueue.c,v 1.82 2004/04/09 20:03:19 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -246,7 +246,8 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, { PUSER_MESSAGE_QUEUE ThreadQueue; USHORT Msg = Message->Msg.message; - PWINDOW_OBJECT CaptureWin, Window = NULL; + PWINDOW_OBJECT Window = NULL; + HWND CaptureWin; POINT Point; if (Msg == WM_LBUTTONDOWN || diff --git a/reactos/subsys/win32k/ntuser/painting.c b/reactos/subsys/win32k/ntuser/painting.c index cd925335faf..90f17a070df 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.79 2004/03/23 18:08:07 weiden Exp $ + * $Id: painting.c,v 1.80 2004/04/09 20:03:19 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -54,6 +54,8 @@ #define NDEBUG #include +#define DCX_USESTYLE 0x10000 + /* PRIVATE FUNCTIONS **********************************************************/ VOID FASTCALL @@ -755,7 +757,7 @@ NtUserBeginPaint(HWND hWnd, PAINTSTRUCT* lPs) } else { - NtUserGetClientRect(Window, &lPs->rcPaint); + NtUserGetClientRect(Window->Self, &lPs->rcPaint); } IntUnLockWindowUpdate(Window); diff --git a/reactos/subsys/win32k/ntuser/scrollbar.c b/reactos/subsys/win32k/ntuser/scrollbar.c index 91f5b5d26a1..f976cfa9f0c 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.28 2004/03/27 10:46:31 gvg Exp $ +/* $Id: scrollbar.c,v 1.29 2004/04/09 20:03:19 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -42,6 +42,9 @@ #include #include #include +#ifdef __USE_W32API +#include +#endif #define NDEBUG #include diff --git a/reactos/subsys/win32k/ntuser/timer.c b/reactos/subsys/win32k/ntuser/timer.c index 6bd70e98f53..cb2e5301bb0 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.29 2004/03/31 18:37:12 gvg Exp $ +/* $Id: timer.c,v 1.30 2004/04/09 20:03:19 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -75,14 +75,22 @@ static CLIENT_ID MsgTimerThreadId; BOOL FASTCALL IntInsertTimerAscendingOrder(PMSG_TIMER_ENTRY NewTimer) { + PLIST_ENTRY current; - InsertAscendingList(&TimerListHead, - MSG_TIMER_ENTRY, - ListEntry, - NewTimer, - Timeout.QuadPart); - - return IsFirstEntry(&TimerListHead, &NewTimer->ListEntry); + current = TimerListHead.Flink; + while (current != &TimerListHead) + { + if (CONTAINING_RECORD(current, MSG_TIMER_ENTRY, ListEntry)->Timeout.QuadPart >=\ + NewTimer->Timeout.QuadPart) + { + break; + } + current = current->Flink; + } + + InsertTailList(current, &NewTimer->ListEntry); + + return TimerListHead.Flink == &NewTimer->ListEntry; } diff --git a/reactos/subsys/win32k/ntuser/windc.c b/reactos/subsys/win32k/ntuser/windc.c index 4d060e71f6a..57fddd9a80d 100644 --- a/reactos/subsys/win32k/ntuser/windc.c +++ b/reactos/subsys/win32k/ntuser/windc.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: windc.c,v 1.64 2004/04/05 21:26:30 weiden Exp $ +/* $Id: windc.c,v 1.65 2004/04/09 20:03:19 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -47,6 +47,8 @@ #define NDEBUG #include +#define DCX_USESTYLE 0x10000 + /* GLOBALS *******************************************************************/ /* NOTE - I think we should store this per window station (including gdi objects) */ @@ -101,6 +103,25 @@ DceGetVisRgn(HWND hWnd, ULONG Flags, HWND hWndChild, ULONG CFlags) return VisRgn; } +/* + * NtUserGetWindowDC + * + * The NtUserGetWindowDC function retrieves the device context (DC) for the + * entire window, including title bar, menus, and scroll bars. A window device + * context permits painting anywhere in a window, because the origin of the + * device context is the upper-left corner of the window instead of the client + * area. + * + * Status + * @implemented + */ + +DWORD STDCALL +NtUserGetWindowDC(HWND hWnd) +{ + return (DWORD)NtUserGetDCEx(hWnd, 0, DCX_USESTYLE | DCX_WINDOW); +} + HDC STDCALL NtUserGetDC(HWND hWnd) { @@ -565,7 +586,7 @@ NtUserGetDCEx(HWND hWnd, HANDLE ClipRegion, ULONG Flags) DceSetDrawable(Window, Dce->hDC, Flags, UpdateClipOrigin); - if (UpdateVisRgn) +// if (UpdateVisRgn) { DceUpdateVisRgn(Dce, Window, Flags); } diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 5b9ebc29d28..3fcbd0ad1f5 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.209 2004/04/02 23:54:26 weiden Exp $ +/* $Id: window.c,v 1.210 2004/04/09 20:03:19 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -2714,25 +2714,6 @@ NtUserGetWindow(HWND hWnd, UINT Relationship) return hWndResult; } -/* - * NtUserGetWindowDC - * - * The NtUserGetWindowDC function retrieves the device context (DC) for the - * entire window, including title bar, menus, and scroll bars. A window device - * context permits painting anywhere in a window, because the origin of the - * device context is the upper-left corner of the window instead of the client - * area. - * - * Status - * @implemented - */ - -DWORD STDCALL -NtUserGetWindowDC(HWND hWnd) -{ - return (DWORD)NtUserGetDCEx(hWnd, 0, DCX_USESTYLE | DCX_WINDOW); -} - /* * NtUserGetWindowLong * diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index 39eacc3f264..dea9fb4025f 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.108 2004/04/02 20:51:08 weiden Exp $ +/* $Id: winpos.c,v 1.109 2004/04/09 20:03:19 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -177,7 +177,7 @@ WinPosActivateOtherWindow(PWINDOW_OBJECT Window) } VOID STATIC FASTCALL -WinPosFindIconPos(HWND hWnd, POINT *Pos) +WinPosFindIconPos(PWINDOW_OBJECT Window, POINT *Pos) { /* FIXME */ } diff --git a/reactos/subsys/win32k/ntuser/winsta.c b/reactos/subsys/win32k/ntuser/winsta.c index c2459ed704b..02b5ab9e2e4 100644 --- a/reactos/subsys/win32k/ntuser/winsta.c +++ b/reactos/subsys/win32k/ntuser/winsta.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: winsta.c,v 1.56 2004/02/19 21:12:10 weiden Exp $ + * $Id: winsta.c,v 1.57 2004/04/09 20:03:19 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -331,7 +331,7 @@ NtUserCreateWindowStation( UserMode, dwDesiredAccess, NULL, - &WindowStation); + (PVOID*)&WindowStation); if (NT_SUCCESS(Status)) { @@ -371,7 +371,7 @@ NtUserCreateWindowStation( STANDARD_RIGHTS_REQUIRED, 0, NULL, - &WindowStation); + (PVOID*)&WindowStation); if (!NT_SUCCESS(Status)) { @@ -490,8 +490,7 @@ NtUserOpenWindowStation( UserMode, dwDesiredAccess, NULL, - &WindowStation); - + (PVOID*)&WindowStation); if (!NT_SUCCESS(Status)) { diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index da4523b9de0..b7359cb9427 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.68 2004/04/06 17:54:32 weiden Exp $ */ +/* $Id: bitmaps.c,v 1.69 2004/04/09 20:03:20 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -53,13 +53,13 @@ NtGdiBitBlt( { PDC DCDest = NULL; PDC DCSrc = NULL; - PSURFOBJ SurfDest, SurfSrc; + SURFOBJ *SurfDest, *SurfSrc; PSURFGDI SurfGDIDest, SurfGDISrc; RECTL DestRect; POINTL SourcePoint; BOOL Status; PPALGDI PalDestGDI, PalSourceGDI; - PXLATEOBJ XlateObj = NULL; + XLATEOBJ *XlateObj = NULL; HPALETTE SourcePalette, DestPalette; ULONG SourceMode, DestMode; PGDIBRUSHOBJ BrushObj; @@ -116,11 +116,11 @@ NtGdiBitBlt( SourcePoint.y = YSrc; /* Determine surfaces to be used in the bitblt */ - SurfDest = (PSURFOBJ)AccessUserObject((ULONG)DCDest->Surface); + SurfDest = (SURFOBJ*)AccessUserObject((ULONG)DCDest->Surface); SurfGDIDest = (PSURFGDI)AccessInternalObjectFromUserObject(SurfDest); if (UsesSource) { - SurfSrc = (PSURFOBJ)AccessUserObject((ULONG)DCSrc->Surface); + SurfSrc = (SURFOBJ*)AccessUserObject((ULONG)DCSrc->Surface); SurfGDISrc = (PSURFGDI)AccessInternalObjectFromUserObject(SurfSrc); } else @@ -204,7 +204,7 @@ NtGdiBitBlt( /* KB41464 details how to convert between mono and color */ if (DCDest->w.bitsPerPixel == 1) { - XlateObj = (PXLATEOBJ)IntEngCreateMonoXlate(SourceMode, DestPalette, + XlateObj = (XLATEOBJ*)IntEngCreateMonoXlate(SourceMode, DestPalette, SourcePalette, DCSrc->w.backgroundColor); } else if (UsesSource && 1 == DCSrc->w.bitsPerPixel) @@ -216,7 +216,7 @@ NtGdiBitBlt( Mono = EngCreatePalette(PAL_INDEXED, 2, Colors, 0, 0, 0); if (NULL != Mono) { - XlateObj = (PXLATEOBJ)IntEngCreateXlate(DestMode, PAL_INDEXED, DestPalette, Mono); + XlateObj = (XLATEOBJ*)IntEngCreateXlate(DestMode, PAL_INDEXED, DestPalette, Mono); } else { @@ -225,7 +225,7 @@ NtGdiBitBlt( } else { - XlateObj = (PXLATEOBJ)IntEngCreateXlate(DestMode, SourceMode, DestPalette, SourcePalette); + XlateObj = (XLATEOBJ*)IntEngCreateXlate(DestMode, SourceMode, DestPalette, SourcePalette); } if (NULL == XlateObj) { @@ -279,9 +279,9 @@ NtGdiTransparentBlt( COLORREF TransColor) { PDC DCDest, DCSrc; - RECT rcDest, rcSrc; - PSURFOBJ SurfDest, SurfSrc; - PXLATEOBJ XlateObj; + RECTL rcDest, rcSrc; + SURFOBJ *SurfDest, *SurfSrc; + XLATEOBJ *XlateObj; HPALETTE SourcePalette, DestPalette; PPALGDI PalDestGDI, PalSourceGDI; USHORT PalDestMode, PalSrcMode; @@ -351,18 +351,18 @@ NtGdiTransparentBlt( PALETTE_UnlockPalette(SourcePalette); /* Translate Transparent (RGB) Color to the source palette */ - if((XlateObj = (PXLATEOBJ)IntEngCreateXlate(PalSrcMode, PAL_RGB, SourcePalette, NULL))) + if((XlateObj = (XLATEOBJ*)IntEngCreateXlate(PalSrcMode, PAL_RGB, SourcePalette, NULL))) { TransparentColor = XLATEOBJ_iXlate(XlateObj, (ULONG)TransColor); EngDeleteXlate(XlateObj); } /* Create the XLATE object to convert colors between source and destination */ - XlateObj = (PXLATEOBJ)IntEngCreateXlate(PalDestMode, PalSrcMode, DestPalette, SourcePalette); + XlateObj = (XLATEOBJ*)IntEngCreateXlate(PalDestMode, PalSrcMode, DestPalette, SourcePalette); - SurfDest = (PSURFOBJ)AccessUserObject((ULONG)DCDest->Surface); + SurfDest = (SURFOBJ*)AccessUserObject((ULONG)DCDest->Surface); ASSERT(SurfDest); - SurfSrc = (PSURFOBJ)AccessUserObject((ULONG)DCSrc->Surface); + SurfSrc = (SURFOBJ*)AccessUserObject((ULONG)DCSrc->Surface); ASSERT(SurfSrc); rcDest.left = xDst; @@ -625,11 +625,11 @@ NtGdiGetPixel(HDC hDC, INT XPos, INT YPos) COLORREF Result = (COLORREF)CLR_INVALID; // default to failure BOOL bInRect = FALSE; PSURFGDI Surface; - PSURFOBJ SurfaceObject; + SURFOBJ *SurfaceObject; HPALETTE Pal; PPALGDI PalGDI; USHORT PalMode; - PXLATEOBJ XlateObj; + XLATEOBJ *XlateObj; dc = DC_LockDc (hDC); @@ -641,7 +641,7 @@ NtGdiGetPixel(HDC hDC, INT XPos, INT YPos) if ( IN_RECT(dc->CombinedClip->rclBounds,XPos,YPos) ) { bInRect = TRUE; - SurfaceObject = (PSURFOBJ)AccessUserObject((ULONG)dc->Surface); + SurfaceObject = (SURFOBJ*)AccessUserObject((ULONG)dc->Surface); ASSERT(SurfaceObject); Surface = (PSURFGDI)AccessInternalObjectFromUserObject(SurfaceObject); if ( Surface ) @@ -656,7 +656,7 @@ NtGdiGetPixel(HDC hDC, INT XPos, INT YPos) PalMode = PalGDI->Mode; PALETTE_UnlockPalette(Pal); - XlateObj = (PXLATEOBJ)IntEngCreateXlate ( PAL_RGB, PalMode, NULL, Pal ); + XlateObj = (XLATEOBJ*)IntEngCreateXlate ( PAL_RGB, PalMode, NULL, Pal ); if ( XlateObj ) { // check if this DC has a DIB behind it... @@ -1094,13 +1094,13 @@ NtGdiStretchBlt( { PDC DCDest = NULL; PDC DCSrc = NULL; - PSURFOBJ SurfDest, SurfSrc; + SURFOBJ *SurfDest, *SurfSrc; PSURFGDI SurfGDIDest, SurfGDISrc; RECTL DestRect; RECTL SourceRect; BOOL Status; PPALGDI PalDestGDI, PalSourceGDI; - PXLATEOBJ XlateObj = NULL; + XLATEOBJ *XlateObj = NULL; HPALETTE SourcePalette, DestPalette; ULONG SourceMode, DestMode; PGDIBRUSHOBJ BrushObj; @@ -1163,11 +1163,11 @@ NtGdiStretchBlt( SourceRect.bottom = YOriginSrc+HeightSrc; /* Determine surfaces to be used in the bitblt */ - SurfDest = (PSURFOBJ)AccessUserObject((ULONG)DCDest->Surface); + SurfDest = (SURFOBJ*)AccessUserObject((ULONG)DCDest->Surface); SurfGDIDest = (PSURFGDI)AccessInternalObjectFromUserObject(SurfDest); if (UsesSource) { - SurfSrc = (PSURFOBJ)AccessUserObject((ULONG)DCSrc->Surface); + SurfSrc = (SURFOBJ*)AccessUserObject((ULONG)DCSrc->Surface); SurfGDISrc = (PSURFGDI)AccessInternalObjectFromUserObject(SurfSrc); } else @@ -1248,7 +1248,7 @@ NtGdiStretchBlt( PALETTE_UnlockPalette(DestPalette); } - XlateObj = (PXLATEOBJ)IntEngCreateXlate(DestMode, SourceMode, DestPalette, SourcePalette); + XlateObj = (XLATEOBJ*)IntEngCreateXlate(DestMode, SourceMode, 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 5e25bbef477..ceab60f152b 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.33 2004/04/05 21:26:25 navaraf Exp $ + * $Id: brush.c,v 1.34 2004/04/09 20:03:20 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -90,8 +90,8 @@ IntPatBlt( DWORD ROP, PGDIBRUSHOBJ BrushObj) { - RECT DestRect; - PSURFOBJ SurfObj; + RECTL DestRect; + SURFOBJ *SurfObj; BOOL ret; SurfObj = (SURFOBJ *)AccessUserObject((ULONG)dc->Surface); diff --git a/reactos/subsys/win32k/objects/cliprgn.c b/reactos/subsys/win32k/objects/cliprgn.c index d7a6579f4c8..a238e26e6b3 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.30 2004/03/22 20:14:29 weiden Exp $ */ +/* $Id: cliprgn.c,v 1.31 2004/04/09 20:03:20 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include @@ -85,7 +85,7 @@ CLIPPING_UpdateGCRegion(DC* Dc) Dc->CombinedClip = IntEngCreateClipRegion(CombinedRegion->rdh.nCount, (PRECTL)CombinedRegion->Buffer, - CombinedRegion->rdh.rcBound); + (PRECTL)&CombinedRegion->rdh.rcBound); ASSERT(NULL != Dc->CombinedClip); RGNDATA_UnlockRgn(Combined); diff --git a/reactos/subsys/win32k/objects/color.c b/reactos/subsys/win32k/objects/color.c index 24c3511d8f4..aaa0baa8563 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.35 2004/03/27 00:35:02 weiden Exp $ */ +/* $Id: color.c,v 1.36 2004/04/09 20:03:20 navaraf Exp $ */ // FIXME: Use PXLATEOBJ logicalToSystem instead of int *mapping @@ -45,7 +45,9 @@ int COLOR_gapEnd = -1; int COLOR_gapFilled = 0; int COLOR_max = 256; +#ifndef NO_MAPPING static HPALETTE hPrimaryPalette = 0; // used for WM_PALETTECHANGED +#endif //static HPALETTE hLastRealizedPalette = 0; // UnrealizeObject() needs it const PALETTEENTRY COLOR_sysPalTemplate[NB_RESERVED_COLORS] = @@ -142,7 +144,7 @@ HPALETTE STDCALL NtGdiCreatePalette(CONST PLOGPALETTE palette) PalGDI = (PPALGDI) PALETTE_LockPalette(NewPalette); PALETTE_ValidateFlags(PalGDI->IndexedColors, PalGDI->NumColors); - PalGDI->PalObj.logicalToSystem = NULL; + PalGDI->logicalToSystem = NULL; PALETTE_UnlockPalette(NewPalette); @@ -297,7 +299,7 @@ A logical palette is a buffer between color-intensive applications and the syste */ UINT STDCALL NtGdiRealizePalette(HDC hDC) { - PPALOBJ palPtr, sysPtr; + PALOBJ *palPtr, *sysPtr; PPALGDI palGDI, sysGDI; int realized = 0; PDC dc; @@ -313,15 +315,19 @@ UINT STDCALL NtGdiRealizePalette(HDC hDC) SurfGDI = (PSURFGDI)AccessInternalObject((ULONG)dc->Surface); systemPalette = NtGdiGetStockObject((INT)DEFAULT_PALETTE); palGDI = PALETTE_LockPalette(dc->w.hPalette); - palPtr = (PPALOBJ) palGDI; + palPtr = (PALOBJ*) palGDI; // Step 1: Create mapping of system palette\DC palette +#ifndef NO_MAPPING realized = PALETTE_SetMapping(palPtr, 0, palGDI->NumColors, (dc->w.hPalette != hPrimaryPalette) || (dc->w.hPalette == NtGdiGetStockObject(DEFAULT_PALETTE))); +#else + realized = 0; +#endif sysGDI = PALETTE_LockPalette(systemPalette); - sysPtr = (PPALOBJ) sysGDI; + sysPtr = (PALOBJ*) sysGDI; // Step 2: // The RealizePalette function modifies the palette for the device associated with the specified device context. If the @@ -350,7 +356,7 @@ UINT STDCALL NtGdiRealizePalette(HDC hDC) if(dc->w.flags != DC_MEMORY) { // Device managed DC - palPtr->logicalToSystem = IntEngCreateXlate(sysGDI->Mode, palGDI->Mode, systemPalette, dc->w.hPalette); + palGDI->logicalToSystem = IntEngCreateXlate(sysGDI->Mode, palGDI->Mode, systemPalette, dc->w.hPalette); } DC_UnlockDc(hDC); @@ -361,10 +367,10 @@ UINT STDCALL NtGdiRealizePalette(HDC hDC) BOOL STDCALL NtGdiResizePalette(HPALETTE hpal, UINT Entries) { -/* PPALOBJ palPtr = (PPALOBJ)AccessUserObject(hPal); +/* PALOBJ *palPtr = (PALOBJ*)AccessUserObject(hPal); UINT cPrevEnt, prevVer; INT prevsize, size = sizeof(LOGPALETTE) + (cEntries - 1) * sizeof(PALETTEENTRY); - PXLATEOBJ XlateObj = NULL; + XLATEOBJ *XlateObj = NULL; if(!palPtr) return FALSE; cPrevEnt = palPtr->logpalette->palNumEntries; @@ -377,7 +383,7 @@ BOOL STDCALL NtGdiResizePalette(HPALETTE hpal, if(XlateObj) { - PXLATEOBJ NewXlateObj = (int*) HeapReAlloc(GetProcessHeap(), 0, XlateObj, cEntries * sizeof(int)); + XLATEOBJ *NewXlateObj = (int*) HeapReAlloc(GetProcessHeap(), 0, XlateObj, cEntries * sizeof(int)); if(NewXlateObj == NULL) { ERR("Can not resize logicalToSystem -- out of memory!"); @@ -471,8 +477,8 @@ UINT STDCALL NtGdiSetPaletteEntries(HPALETTE hpal, } memcpy(&palGDI->IndexedColors[Start], pe, Entries * sizeof(PALETTEENTRY)); PALETTE_ValidateFlags(palGDI->IndexedColors, palGDI->NumColors); - ExFreePool(palGDI->PalObj.logicalToSystem); - palGDI->PalObj.logicalToSystem = NULL; + ExFreePool(palGDI->logicalToSystem); + palGDI->logicalToSystem = NULL; PALETTE_UnlockPalette(hpal); return Entries; @@ -505,7 +511,7 @@ NtGdiUpdateColors(HDC hDC) } INT STDCALL COLOR_PaletteLookupPixel(PALETTEENTRY *palPalEntry, INT size, - PXLATEOBJ XlateObj, COLORREF col, BOOL skipReserved) + XLATEOBJ *XlateObj, COLORREF col, BOOL skipReserved) { int i, best = 0, diff = 0x7fffffff; int r, g, b; diff --git a/reactos/subsys/win32k/objects/cursoricon.c b/reactos/subsys/win32k/objects/cursoricon.c index d5fc5bf67be..7fbbd187df6 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.52 2004/03/29 06:38:50 navaraf Exp $ */ +/* $Id: cursoricon.c,v 1.53 2004/04/09 20:03:20 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -95,7 +95,7 @@ HCURSOR FASTCALL IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, BOOL ForceChange) { - PSURFOBJ SurfObj; + SURFOBJ *SurfObj; PSURFGDI SurfGDI; SIZEL MouseSize; PDEVINFO DevInfo; @@ -104,8 +104,8 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, PCURICON_OBJECT OldCursor; HCURSOR Ret = (HCURSOR)0; HBITMAP hMask = (HBITMAP)0, hColor = (HBITMAP)0; - PSURFOBJ soMask = NULL, soColor = NULL; - PXLATEOBJ XlateObj = NULL; + SURFOBJ *soMask = NULL, *soColor = NULL; + XLATEOBJ *XlateObj = NULL; RECTL PointerRect; HDC Screen; @@ -134,7 +134,7 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, return Ret; } - SurfObj = (PSURFOBJ)AccessUserObject((ULONG) dc->Surface); + SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface); SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) dc->Surface); DevInfo = dc->DevInfo; DC_UnlockDc(Screen); @@ -206,7 +206,7 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, MouseSize.cx = MaskBmpObj->bitmap.bmWidth; MouseSize.cy = MaskBmpObj->bitmap.bmHeight; hMask = EngCreateBitmap(MouseSize, 4, BMF_1BPP, BMF_TOPDOWN, MaskBmpObj->bitmap.bmBits); - soMask = (PSURFOBJ)AccessUserObject((ULONG)hMask); + soMask = (SURFOBJ*)AccessUserObject((ULONG)hMask); BITMAPOBJ_UnlockBitmap(NewCursor->IconInfo.hbmMask); } } @@ -256,11 +256,11 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, if(hMask) { - EngDeleteSurface(hMask); + EngDeleteSurface((HSURF)hMask); } if(hColor) { - EngDeleteSurface(hColor); + EngDeleteSurface((HSURF)hColor); } if(XlateObj) { @@ -796,7 +796,7 @@ NtUserDestroyCursorIcon( /* * @implemented */ -HANDLE +HICON STDCALL NtUserFindExistingCursorIcon( HMODULE hModule, diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index fd08bea6848..a2bc5dbaeb0 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.127 2004/04/06 07:43:33 gvg Exp $ +/* $Id: dc.c,v 1.128 2004/04/09 20:03:20 navaraf Exp $ * * DC.C - Device context functions * @@ -25,14 +25,12 @@ #undef WIN32_LEAN_AND_MEAN #include #include -#include - +#include #include #include #include #include #include -#include #include #include #include @@ -215,7 +213,7 @@ NtGdiCreateCompatableDC(HDC hDC) NewDC->w.hFirstBitmap = hBitmap; NewDC->GDIDevice = OrigDC->GDIDevice; pb = BITMAPOBJ_LockBitmap(hBitmap); - NewDC->Surface = BitmapToSurf(pb, NewDC->GDIDevice); + NewDC->Surface = (HSURF)BitmapToSurf(pb, NewDC->GDIDevice); BITMAPOBJ_UnlockBitmap(hBitmap); NewDC->w.hPalette = OrigDC->w.hPalette; @@ -469,7 +467,7 @@ IntCreatePrimarySurface() { PGD_ENABLEDRIVER GDEnableDriver; DRVENABLEDATA DED; - PSURFOBJ SurfObj; + SURFOBJ *SurfObj; PSURFGDI SurfGDI; UNICODE_STRING DriverFileNames; PWSTR CurrentName; @@ -522,7 +520,7 @@ IntCreatePrimarySurface() /* Call DDI driver's EnableDriver function */ RtlZeroMemory(&DED, sizeof(DED)); - if (! GDEnableDriver(DDI_DRIVER_VERSION, sizeof(DED), &DED)) + if (! GDEnableDriver(DDI_DRIVER_VERSION_NT5_01, sizeof(DED), &DED)) { DPRINT("DrvEnableDriver failed for %S\n", CurrentName); } @@ -637,7 +635,7 @@ IntCreatePrimarySurface() /* Complete initialization of the physical device */ PrimarySurface.DriverFunctions.CompletePDev( PrimarySurface.PDev, - &PrimarySurface); + (HDEV)&PrimarySurface); DPRINT("calling DRIVER_ReferenceDriver\n"); @@ -658,7 +656,7 @@ IntCreatePrimarySurface() continue; } - SurfObj = (PSURFOBJ)AccessUserObject((ULONG) PrimarySurface.Handle); + SurfObj = (SURFOBJ*)AccessUserObject((ULONG) PrimarySurface.Handle); SurfObj->dhpdev = PrimarySurface.PDev; SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) PrimarySurface.Handle); IntShowDesktop( @@ -675,7 +673,7 @@ VOID FASTCALL IntDestroyPrimarySurface() { #if 0 - PSURFOBJ SurfObj; + SURFOBJ *SurfObj; PSURFGDI SurfGDI; #endif @@ -683,7 +681,7 @@ IntDestroyPrimarySurface() #if 0 DPRINT("Hiding mouse pointer\n" ); - SurfObj = (PSURFOBJ)AccessUserObject((ULONG) PrimarySurface.Handle); + SurfObj = (SURFOBJ*)AccessUserObject((ULONG) PrimarySurface.Handle); SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) PrimarySurface.Handle); SurfGDI->SetPointerShape(SurfObj, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0); #endif @@ -749,7 +747,7 @@ IntGdiCreateDC(PUNICODE_STRING Driver, sizeof(NewDC->FillPatternSurfaces)); NewDC->PDev = PrimarySurface.PDev; NewDC->Surface = PrimarySurface.Handle; - NewDC->GDIDevice = &PrimarySurface; + NewDC->GDIDevice = (HDEV)&PrimarySurface; NewDC->DriverFunctions = PrimarySurface.DriverFunctions; NewDC->DMW.dmSize = sizeof(NewDC->DMW); @@ -1707,7 +1705,7 @@ NtGdiSelectObject(HDC hDC, HGDIOBJ hGDIObj) PDC dc; PGDIBRUSHOBJ pen; PGDIBRUSHOBJ brush; - PXLATEOBJ XlateObj; + XLATEOBJ *XlateObj; PPALGDI PalGDI; DWORD objectType; COLORREF *ColorMap; @@ -1737,7 +1735,7 @@ NtGdiSelectObject(HDC hDC, HGDIOBJ hGDIObj) { Mode = PalGDI->Mode; PALETTE_UnlockPalette(dc->w.hPalette); - XlateObj = (PXLATEOBJ)IntEngCreateXlate(Mode, PAL_RGB, dc->w.hPalette, NULL); + XlateObj = (XLATEOBJ*)IntEngCreateXlate(Mode, PAL_RGB, dc->w.hPalette, NULL); if (NULL != XlateObj) { pen = PENOBJ_LockPen((HPEN) hGDIObj); @@ -1783,7 +1781,7 @@ NtGdiSelectObject(HDC hDC, HGDIOBJ hGDIObj) { Mode = PalGDI->Mode; PALETTE_UnlockPalette(dc->w.hPalette); - XlateObj = (PXLATEOBJ)IntEngCreateXlate(Mode, PAL_RGB, dc->w.hPalette, NULL); + XlateObj = (XLATEOBJ*)IntEngCreateXlate(Mode, PAL_RGB, dc->w.hPalette, NULL); if (NULL != XlateObj) { brush = BRUSHOBJ_LockBrush((HBRUSH) hGDIObj); @@ -1846,7 +1844,7 @@ NtGdiSelectObject(HDC hDC, HGDIOBJ hGDIObj) /* Release the old bitmap, lock the new one and convert it to a SURF */ EngDeleteSurface(dc->Surface); dc->w.hBitmap = hGDIObj; - dc->Surface = BitmapToSurf(pb, dc->GDIDevice); + 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) @@ -2129,7 +2127,7 @@ DC_SetOwnership(HDC hDC, PEPROCESS Owner) } BOOL FASTCALL -IntIsPrimarSurface(PSURFGDI SurfGDI) +IntIsPrimarySurface(PSURFGDI SurfGDI) { if (PrimarySurface.Handle == NULL) { diff --git a/reactos/subsys/win32k/objects/dib.c b/reactos/subsys/win32k/objects/dib.c index 6aa161d5c80..e986c39db8a 100644 --- a/reactos/subsys/win32k/objects/dib.c +++ b/reactos/subsys/win32k/objects/dib.c @@ -1,5 +1,5 @@ /* - * $Id: dib.c,v 1.44 2004/03/27 00:35:02 weiden Exp $ + * $Id: dib.c,v 1.45 2004/04/09 20:03:20 navaraf Exp $ * * ReactOS W32 Subsystem * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team @@ -101,12 +101,12 @@ IntSetDIBits( HBITMAP SourceBitmap, DestBitmap; INT result = 0; BOOL copyBitsResult; - PSURFOBJ DestSurf, SourceSurf; + SURFOBJ *DestSurf, *SourceSurf; PSURFGDI DestGDI; SIZEL SourceSize; POINTL ZeroPoint; RECTL DestRect; - PXLATEOBJ XlateObj; + XLATEOBJ *XlateObj; PPALGDI hDCPalette; //RGBQUAD *lpRGB; HPALETTE DDB_Palette, DIB_Palette; @@ -129,7 +129,7 @@ IntSetDIBits( // Create a temporary surface for the destination bitmap DestBitmap = BitmapToSurf(bitmap, DC->GDIDevice); - DestSurf = (PSURFOBJ) AccessUserObject( (ULONG)DestBitmap ); + DestSurf = (SURFOBJ*) AccessUserObject( (ULONG)DestBitmap ); DestGDI = (PSURFGDI) AccessInternalObject( (ULONG)DestBitmap ); // Create source surface @@ -151,14 +151,14 @@ IntSetDIBits( BitmapFormat(bmi->bmiHeader.biBitCount, bmi->bmiHeader.biCompression), 0, (PVOID)vBits ); - SourceSurf = (PSURFOBJ)AccessUserObject((ULONG)SourceBitmap); + SourceSurf = (SURFOBJ*)AccessUserObject((ULONG)SourceBitmap); // Destination palette obtained from the hDC hDCPalette = PALETTE_LockPalette(DC->DevInfo->hpalDefault); if (NULL == hDCPalette) { - EngDeleteSurface(SourceBitmap); - EngDeleteSurface(DestBitmap); + EngDeleteSurface((HSURF)SourceBitmap); + EngDeleteSurface((HSURF)DestBitmap); BITMAPOBJ_UnlockBitmap(hBitmap); SetLastWin32Error(ERROR_INVALID_HANDLE); return 0; @@ -171,8 +171,8 @@ IntSetDIBits( DIB_Palette = BuildDIBPalette ( (PBITMAPINFO)bmi, (PINT)&DIB_Palette_Type ); if (NULL == DIB_Palette) { - EngDeleteSurface(SourceBitmap); - EngDeleteSurface(DestBitmap); + EngDeleteSurface((HSURF)SourceBitmap); + EngDeleteSurface((HSURF)DestBitmap); BITMAPOBJ_UnlockBitmap(hBitmap); SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); return 0; @@ -183,8 +183,8 @@ IntSetDIBits( if (NULL == XlateObj) { PALETTE_FreePalette(DIB_Palette); - EngDeleteSurface(SourceBitmap); - EngDeleteSurface(DestBitmap); + EngDeleteSurface((HSURF)SourceBitmap); + EngDeleteSurface((HSURF)DestBitmap); BITMAPOBJ_UnlockBitmap(hBitmap); SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); return 0; @@ -211,8 +211,8 @@ IntSetDIBits( // Clean up EngDeleteXlate(XlateObj); PALETTE_FreePalette(DIB_Palette); - EngDeleteSurface(SourceBitmap); - EngDeleteSurface(DestBitmap); + EngDeleteSurface((HSURF)SourceBitmap); + EngDeleteSurface((HSURF)DestBitmap); // if (ColorUse == DIB_PAL_COLORS) // WinFree((LPSTR)lpRGB); diff --git a/reactos/subsys/win32k/objects/fillshap.c b/reactos/subsys/win32k/objects/fillshap.c index 4f63d61b8f5..9102fac49de 100644 --- a/reactos/subsys/win32k/objects/fillshap.c +++ b/reactos/subsys/win32k/objects/fillshap.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: fillshap.c,v 1.46 2004/04/05 21:26:25 navaraf Exp $ */ +/* $Id: fillshap.c,v 1.47 2004/04/09 20:03:20 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include @@ -104,10 +104,10 @@ IntGdiPolygon(PDC dc, for (CurrentPoint = 1; CurrentPoint < Count; ++CurrentPoint) { - DestRect.left = MIN(DestRect.left, UnsafePoints[CurrentPoint].x); - DestRect.right = MAX(DestRect.right, UnsafePoints[CurrentPoint].x); - DestRect.top = MIN(DestRect.top, UnsafePoints[CurrentPoint].y); - DestRect.bottom = MAX(DestRect.bottom, UnsafePoints[CurrentPoint].y); + DestRect.left = min(DestRect.left, UnsafePoints[CurrentPoint].x); + DestRect.right = max(DestRect.right, UnsafePoints[CurrentPoint].x); + DestRect.top = min(DestRect.top, UnsafePoints[CurrentPoint].y); + DestRect.bottom = max(DestRect.bottom, UnsafePoints[CurrentPoint].y); } #if 1 @@ -242,7 +242,7 @@ NtGdiEllipse( int RadiusX, RadiusY; int Temp; PGDIBRUSHOBJ FillBrush, PenBrush; - PSURFOBJ SurfObj; + SURFOBJ *SurfObj; RECTL RectBounds; PDC dc; BOOL ret = TRUE, Cond1, Cond2; @@ -285,7 +285,7 @@ NtGdiEllipse( return FALSE; } - SurfObj = (PSURFOBJ)AccessUserObject((ULONG)dc->Surface); + SurfObj = (SURFOBJ*)AccessUserObject((ULONG)dc->Surface); nLeftRect += dc->w.DCOrgX; nRightRect += dc->w.DCOrgX - 1; @@ -656,7 +656,7 @@ NtGdiPie(HDC hDC, #ifdef TODO PDC dc; RECTL RectBounds; - PSURFOBJ SurfObj; + SURFOBJ *SurfObj; BRUSHOBJ PenBrushObj; PBRUSHOBJ FillBrushObj; PSHAPEPOINT ShapePoints; @@ -705,7 +705,7 @@ NtGdiPie(HDC hDC, RectBounds.top = Top; RectBounds.bottom = Bottom; - SurfObj = (PSURFOBJ) AccessUserObject((ULONG)dc->Surface); + SurfObj = (SURFOBJ*) AccessUserObject((ULONG)dc->Surface); HPenToBrushObj(&PenBrushObj, dc->w.hPen); /* Number of points for the circle is 4 * sqrt(2) * Radius, start @@ -1427,7 +1427,7 @@ IntGdiGradientFill( Mode = PalDestGDI->Mode; PALETTE_UnlockPalette(dc->w.hPalette); - XlateObj = (PXLATEOBJ)IntEngCreateXlate(Mode, PAL_RGB, dc->w.hPalette, NULL); + XlateObj = (XLATEOBJ*)IntEngCreateXlate(Mode, PAL_RGB, dc->w.hPalette, NULL); ASSERT(XlateObj); Ret = IntEngGradientFill(SurfObj, diff --git a/reactos/subsys/win32k/objects/gdiobj.c b/reactos/subsys/win32k/objects/gdiobj.c index 07a2260dfac..e3ad32e02f9 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.65 2004/04/05 21:26:25 navaraf Exp $ + * $Id: gdiobj.c,v 1.66 2004/04/09 20:03:20 navaraf Exp $ * */ @@ -193,7 +193,7 @@ static LOGFONTW DefaultGuiFont = #define NB_STOCK_OBJECTS (DEFAULT_GUI_FONT + 1) -static HGDIOBJ *StockObjects[NB_STOCK_OBJECTS]; +static HGDIOBJ StockObjects[NB_STOCK_OBJECTS]; static PGDI_HANDLE_TABLE HandleTable = 0; static FAST_MUTEX HandleTableMutex; static FAST_MUTEX RefCountHandling; diff --git a/reactos/subsys/win32k/objects/line.c b/reactos/subsys/win32k/objects/line.c index ae45f631531..30c360292cf 100644 --- a/reactos/subsys/win32k/objects/line.c +++ b/reactos/subsys/win32k/objects/line.c @@ -16,14 +16,14 @@ * 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.28 2004/04/05 21:26:25 navaraf Exp $ */ +/* $Id: line.c,v 1.29 2004/04/09 20:03:20 navaraf Exp $ */ // Some code from the WINE project source (www.winehq.com) #undef WIN32_LEAN_AND_MEAN #include -#include #include +#include #include #include #include @@ -72,7 +72,7 @@ IntGdiLineTo(DC *dc, SURFOBJ *SurfObj; BOOL Ret; PGDIBRUSHOBJ PenBrushObj; - RECT Bounds; + RECTL Bounds; SurfObj = (SURFOBJ*)AccessUserObject ( (ULONG)dc->Surface ); if (NULL == SurfObj) diff --git a/reactos/subsys/win32k/objects/objconv.c b/reactos/subsys/win32k/objects/objconv.c index 4858e3c2d00..da60f52ecfd 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.16 2004/04/05 21:26:25 navaraf Exp $ */ +/* $Id: objconv.c,v 1.17 2004/04/09 20:03:20 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include @@ -60,7 +60,7 @@ HBITMAP FASTCALL BitmapToSurf(PBITMAPOBJ BitmapObj, HDEV GDIDevice) } if (NULL != BitmapHandle && NULL != GDIDevice) { - EngAssociateSurface(BitmapHandle, GDIDevice, 0); + EngAssociateSurface((HSURF)BitmapHandle, GDIDevice, 0); } return BitmapHandle; diff --git a/reactos/subsys/win32k/objects/palette.c b/reactos/subsys/win32k/objects/palette.c index 2ed449cf537..ee2239c6d0f 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.16 2004/03/27 00:35:02 weiden Exp $ */ +/* $Id: palette.c,v 1.17 2004/04/09 20:03:20 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include @@ -31,8 +31,10 @@ #include #include +#ifndef NO_MAPPING static int PALETTE_firstFree = 0; static unsigned char PALETTE_freeList[256]; +#endif int PALETTE_PaletteFlags = 0; PALETTEENTRY *COLOR_sysPal = NULL; @@ -114,7 +116,9 @@ HPALETTE FASTCALL PALETTE_Init(VOID) int i; HPALETTE hpalette; PLOGPALETTE palPtr; - PPALOBJ palObj; +#ifndef NO_MAPPING + PALOBJ *palObj; +#endif const PALETTEENTRY* __sysPalTemplate = (const PALETTEENTRY*)COLOR_GetSystemPaletteTemplate(); // create default palette (20 system colors) @@ -134,7 +138,8 @@ HPALETTE FASTCALL PALETTE_Init(VOID) hpalette = NtGdiCreatePalette(palPtr); ExFreePool(palPtr); - palObj = (PPALOBJ)PALETTE_LockPalette(hpalette); +#ifndef NO_MAPPING + palObj = (PALOBJ*)PALETTE_LockPalette(hpalette); if (palObj) { if (!(palObj->mapping = ExAllocatePool(NonPagedPool, sizeof(int) * 20))) @@ -144,12 +149,14 @@ HPALETTE FASTCALL PALETTE_Init(VOID) } PALETTE_UnlockPalette(hpalette); } +#endif /* palette_size = visual->map_entries; */ return hpalette; } +#ifndef NO_MAPPING static void FASTCALL PALETTE_FormatSystemPalette(void) { // Build free list so we'd have an easy way to find @@ -169,6 +176,7 @@ static void FASTCALL PALETTE_FormatSystemPalette(void) } PALETTE_freeList[j] = 0; } +#endif VOID FASTCALL PALETTE_ValidateFlags(PALETTEENTRY* lpPalE, INT size) { @@ -177,9 +185,10 @@ VOID FASTCALL PALETTE_ValidateFlags(PALETTEENTRY* lpPalE, INT size) lpPalE[i].peFlags = PC_SYS_USED | (lpPalE[i].peFlags & 0x07); } +#ifndef NO_MAPPING // Set the color-mapping table for selected palette. // Return number of entries which mapping has changed. -INT STDCALL PALETTE_SetMapping(PPALOBJ palPtr, UINT uStart, UINT uNum, BOOL mapOnly) +INT STDCALL PALETTE_SetMapping(PALOBJ *palPtr, UINT uStart, UINT uNum, BOOL mapOnly) { char flag; int prevMapping = (palPtr->mapping) ? 1 : 0; @@ -287,5 +296,6 @@ INT STDCALL PALETTE_SetMapping(PPALOBJ palPtr, UINT uStart, UINT uNum, BOOL mapO } return iRemapped; } +#endif /* EOF */ diff --git a/reactos/subsys/win32k/objects/polyfill.c b/reactos/subsys/win32k/objects/polyfill.c index 8d66b136768..61216e5fe75 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.12 2003/08/19 21:29:20 royce Exp $ +/* $Id: polyfill.c,v 1.13 2004/04/09 20:03:20 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -170,7 +170,7 @@ POLYGONFILL_MakeEdge(POINT From, POINT To) rc->xmajor = rc->absdx > rc->absdy; - rc->ErrorMax = MAX(rc->absdx,rc->absdy); + rc->ErrorMax = max(rc->absdx,rc->absdy); rc->Error += rc->ErrorMax / 2; @@ -334,8 +334,8 @@ POLYGONFILL_UpdateScanline(FILL_EDGE* pEdge, int Scanline) pEdge->x += steps * pEdge->XDirection; pEdge->Error += steps * pEdge->absdy; ASSERT ( pEdge->Error < pEdge->ErrorMax ); - pEdge->XIntercept[0] = MIN(x1,pEdge->x); - pEdge->XIntercept[1] = MAX(x1,pEdge->x); + pEdge->XIntercept[0] = min(x1,pEdge->x); + pEdge->XIntercept[1] = max(x1,pEdge->x); } else { @@ -409,7 +409,7 @@ POLYGONFILL_FillScanLineAlternate( int ScanLine, FILL_EDGE* ActiveHead, SURFOBJ *SurfObj, - PBRUSHOBJ BrushObj, + BRUSHOBJ *BrushObj, MIX RopMode ) { FILL_EDGE *pLeft, *pRight; @@ -457,7 +457,7 @@ POLYGONFILL_FillScanLineWinding( int ScanLine, FILL_EDGE* ActiveHead, SURFOBJ *SurfObj, - PBRUSHOBJ BrushObj, + BRUSHOBJ *BrushObj, MIX RopMode ) { FILL_EDGE *pLeft, *pRight; @@ -497,8 +497,8 @@ POLYGONFILL_FillScanLineWinding( ) { // yup, just tack it on to our existing line - x1 = MIN(x1,newx1); - x2 = MAX(x2,newx2); + x1 = min(x1,newx1); + x2 = max(x2,newx2); } else { @@ -555,7 +555,7 @@ STDCALL FillPolygon( PDC dc, SURFOBJ *SurfObj, - PBRUSHOBJ BrushObj, + BRUSHOBJ *BrushObj, MIX RopMode, CONST PPOINT Points, int Count, @@ -572,7 +572,7 @@ FillPolygon( int ScanLine, FILL_EDGE* ActiveHead, SURFOBJ *SurfObj, - PBRUSHOBJ BrushObj, + BRUSHOBJ *BrushObj, MIX RopMode ); //DPRINT("FillPolygon\n"); diff --git a/reactos/subsys/win32k/objects/print.c b/reactos/subsys/win32k/objects/print.c index 7010775dc71..6c9260f918f 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.15 2004/03/01 19:25:33 navaraf Exp $ */ +/* $Id: print.c,v 1.16 2004/04/09 20:03:20 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include @@ -66,12 +66,12 @@ NtGdiEscape(HDC hDC, INT STDCALL IntEngExtEscape( - HSURF Surface, - INT Escape, - INT InSize, - LPVOID InData, - INT OutSize, - LPVOID OutData) + SURFOBJ *Surface, + INT Escape, + INT InSize, + LPVOID InData, + INT OutSize, + LPVOID OutData) { UNIMPLEMENTED; return -1; @@ -87,7 +87,7 @@ IntGdiExtEscape( INT OutSize, LPSTR OutData) { - PSURFOBJ Surface = (PSURFOBJ)AccessUserObject((ULONG)dc->Surface); + SURFOBJ *Surface = (SURFOBJ*)AccessUserObject((ULONG)dc->Surface); if ( NULL == dc->DriverFunctions.Escape ) { @@ -197,7 +197,7 @@ NtGdiSetAbortProc(HDC hDC, INT STDCALL NtGdiStartDoc(HDC hDC, - CONST PDOCINFOW di) + CONST LPDOCINFOW di) { UNIMPLEMENTED; } diff --git a/reactos/subsys/win32k/objects/region.c b/reactos/subsys/win32k/objects/region.c index e82bd3e85f0..0d0e857864c 100644 --- a/reactos/subsys/win32k/objects/region.c +++ b/reactos/subsys/win32k/objects/region.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: region.c,v 1.47 2004/04/05 21:26:25 navaraf Exp $ */ +/* $Id: region.c,v 1.48 2004/04/09 20:03:20 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -69,7 +69,7 @@ IntEngPaint(IN SURFOBJ *Surface,IN CLIPOBJ *ClipRegion,IN BRUSHOBJ *Brush,IN POI /* * Check to see if there is enough memory in the present region. */ -static inline int xmemcheck(ROSRGNDATA *reg, LPRECT *rect, LPRECT *firstrect ) { +static inline int xmemcheck(ROSRGNDATA *reg, PRECT *rect, PRECT *firstrect ) { if ( (reg->rdh.nCount+1)*sizeof( RECT ) >= reg->rdh.nRgnSize ) { PRECT temp; temp = ExAllocatePoolWithTag( PagedPool, (2 * (reg->rdh.nRgnSize)), TAG_REGION); @@ -136,13 +136,13 @@ static BOOL FASTCALL REGION_CopyRegion(PROSRGNDATA dst, PROSRGNDATA src) { if (dst->rdh.nRgnSize < src->rdh.nCount * sizeof(RECT)) { - PCHAR temp; + PRECT temp; temp = ExAllocatePoolWithTag(PagedPool, src->rdh.nCount * sizeof(RECT), TAG_REGION ); if( !temp ) return FALSE; - if( dst->Buffer && dst->Buffer != (char *) &dst->BuiltInRect ) + if( dst->Buffer && dst->Buffer != &dst->BuiltInRect ) ExFreePool( dst->Buffer ); //free the old buffer dst->Buffer = temp; dst->rdh.nRgnSize = src->rdh.nCount * sizeof(RECT); //size of region buffer @@ -217,7 +217,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 != (char *) &rgnDst->BuiltInRect ) + if( rgnDst->Buffer && rgnDst->Buffer != &rgnDst->BuiltInRect ) ExFreePool( rgnDst->Buffer ); //free the old buffer. will be assigned to xrect below. } @@ -245,7 +245,7 @@ static BOOL FASTCALL REGION_CropAndOffsetRegion(const PPOINT off, const PRECT re else RtlCopyMemory(xrect, rgnSrc->Buffer, rgnDst->rdh.nCount * sizeof(RECT)); - rgnDst->Buffer = (char*)xrect; + rgnDst->Buffer = xrect; } else return FALSE; } @@ -275,14 +275,14 @@ static BOOL FASTCALL REGION_CropAndOffsetRegion(const PPOINT off, const PRECT re if((rgnDst != rgnSrc) && (rgnDst->rdh.nCount < (i = (clipb - clipa)))) { - PCHAR temp; + PRECT temp; temp = ExAllocatePoolWithTag( PagedPool, i * sizeof(RECT), TAG_REGION ); if(!temp) return FALSE; - if( rgnDst->Buffer && rgnDst->Buffer != (char *) &rgnDst->BuiltInRect ) + if( rgnDst->Buffer && rgnDst->Buffer != &rgnDst->BuiltInRect ) ExFreePool( rgnDst->Buffer ); //free the old buffer - (PRECT)rgnDst->Buffer = temp; + rgnDst->Buffer = temp; rgnDst->rdh.nCount = i; rgnDst->rdh.nRgnSize = i * sizeof(RECT); } @@ -319,8 +319,8 @@ static BOOL FASTCALL REGION_CropAndOffsetRegion(const PPOINT off, const PRECT re rgnDst->rdh.nCount = j--; for(i = 0; i <= j; i++) // fixup top band - if(((PRECT)rgnDst->Buffer + i)->top < left) - ((PRECT)rgnDst->Buffer + i)->top = left; + if((rgnDst->Buffer + i)->top < left) + (rgnDst->Buffer + i)->top = left; else break; @@ -341,7 +341,7 @@ static BOOL FASTCALL REGION_CropAndOffsetRegion(const PPOINT off, const PRECT re empty: if(!rgnDst->Buffer) { - rgnDst->Buffer = (char*)ExAllocatePoolWithTag(PagedPool, RGN_DEFAULT_RECTS * sizeof(RECT), TAG_REGION); + rgnDst->Buffer = (PRECT)ExAllocatePoolWithTag(PagedPool, RGN_DEFAULT_RECTS * sizeof(RECT), TAG_REGION); if(rgnDst->Buffer){ rgnDst->rdh.nCount = RGN_DEFAULT_RECTS; rgnDst->rdh.nRgnSize = RGN_DEFAULT_RECTS * sizeof(RECT); @@ -814,7 +814,7 @@ REGION_RegionOp( newReg->Buffer = ExAllocatePoolWithTag( PagedPool, newReg->rdh.nCount*sizeof(RECT), TAG_REGION ); if (! newReg->Buffer) - newReg->Buffer = (char*)prev_rects; + newReg->Buffer = prev_rects; else{ newReg->rdh.nRgnSize = newReg->rdh.nCount*sizeof(RECT); RtlCopyMemory( newReg->Buffer, prev_rects, newReg->rdh.nRgnSize ); @@ -829,7 +829,7 @@ REGION_RegionOp( * the region is empty */ newReg->rdh.nRgnSize = sizeof(RECT); - if (newReg->Buffer != (char *) &newReg->BuiltInRect) + if (newReg->Buffer != &newReg->BuiltInRect) ExFreePool( newReg->Buffer ); newReg->Buffer = ExAllocatePoolWithTag( PagedPool, sizeof(RECT), TAG_REGION ); ASSERT( newReg->Buffer ); @@ -1405,7 +1405,7 @@ static void FASTCALL REGION_UnionRectWithRegion(const RECT *rect, ROSRGNDATA *rg { ROSRGNDATA region; - region.Buffer = (char*)(&(region.rdh.rcBound)); + region.Buffer = ®ion.rdh.rcBound; region.rdh.nCount = 1; region.rdh.nRgnSize = sizeof( RECT ); region.rdh.rcBound = *rect; @@ -1484,7 +1484,7 @@ HRGN FASTCALL RGNDATA_AllocRgn(INT n) { if (1 == n) { - pReg->Buffer = (char *) &pReg->BuiltInRect; + pReg->Buffer = &pReg->BuiltInRect; } else { @@ -1515,7 +1515,7 @@ HRGN FASTCALL RGNDATA_AllocRgn(INT n) BOOL FASTCALL RGNDATA_InternalDelete( PROSRGNDATA pRgn ) { ASSERT(pRgn); - if(pRgn->Buffer && pRgn->Buffer != (char *) &pRgn->BuiltInRect) + if(pRgn->Buffer && pRgn->Buffer != &pRgn->BuiltInRect) ExFreePool(pRgn->Buffer); return TRUE; } @@ -1867,7 +1867,7 @@ NtGdiFillRgn(HDC hDC, HRGN hRgn, HBRUSH hBrush) { HBRUSH oldhBrush; PROSRGNDATA rgn; - PRECTL r; + PRECT r; if (NULL == (rgn = RGNDATA_LockRgn(hRgn))) { @@ -1880,7 +1880,7 @@ NtGdiFillRgn(HDC hDC, HRGN hRgn, HBRUSH hBrush) return FALSE; } - for (r = (PRECT) rgn->Buffer; r < ((PRECT) rgn->Buffer) + rgn->rdh.nCount; r++) + for (r = rgn->Buffer; r < rgn->Buffer + rgn->rdh.nCount; r++) { NtGdiPatBlt(hDC, r->left, r->top, r->right - r->left, r->bottom - r->top, PATCOPY); } @@ -2038,7 +2038,7 @@ NtGdiPaintRgn(HDC hDC, } ClipRegion = IntEngCreateClipRegion ( - visrgn->rdh.nCount, (PRECTL)visrgn->Buffer, visrgn->rdh.rcBound ); + visrgn->rdh.nCount, (PRECTL)visrgn->Buffer, (PRECTL)&visrgn->rdh.rcBound ); ASSERT( ClipRegion ); pBrush = BRUSHOBJ_LockBrush(dc->w.hBrush); ASSERT(pBrush); diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index 437c9073025..9ba8942a01a 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.88 2004/04/05 21:26:25 navaraf Exp $ */ +/* $Id: text.c,v 1.89 2004/04/09 20:03:20 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -34,7 +34,7 @@ #include #include #include -#include +#include #include #include #include @@ -144,13 +144,13 @@ IntIsFontRenderingEnabled(VOID) BOOL Ret; HDC hDC; PDC dc; - PSURFOBJ SurfObj; + SURFOBJ *SurfObj; Ret = RenderingEnabled; hDC = IntGetScreenDC(); if(hDC) { dc = DC_LockDc(hDC); - SurfObj = (PSURFOBJ)AccessUserObject((ULONG) dc->Surface); + SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface); if(SurfObj) Ret = (SurfObj->iBitmapFormat >= BMF_8BPP); DC_UnlockDc(hDC); @@ -187,7 +187,7 @@ int FASTCALL IntGdiAddFontResource(PUNICODE_STRING Filename, DWORD fl) { HFONT NewFont; - PFONTOBJ FontObj; + FONTOBJ *FontObj; PFONTGDI FontGDI; NTSTATUS Status; HANDLE FileHandle; @@ -202,7 +202,7 @@ IntGdiAddFontResource(PUNICODE_STRING Filename, DWORD fl) PFONT_ENTRY entry; NewFont = (HFONT)CreateGDIHandle(sizeof( FONTGDI ), sizeof( FONTOBJ )); - FontObj = (PFONTOBJ) AccessUserObject( (ULONG) NewFont ); + FontObj = (FONTOBJ*) AccessUserObject( (ULONG) NewFont ); FontGDI = (PFONTGDI) AccessInternalObject( (ULONG) NewFont ); // Open the Module @@ -420,7 +420,7 @@ BOOL FASTCALL InitFontSupport(VOID) } static NTSTATUS STDCALL -GetFontObjectsFromTextObj(PTEXTOBJ TextObj, HFONT *FontHandle, PFONTOBJ *FontObj, PFONTGDI *FontGDI) +GetFontObjectsFromTextObj(PTEXTOBJ TextObj, HFONT *FontHandle, FONTOBJ **FontObj, PFONTGDI *FontGDI) { NTSTATUS Status = STATUS_SUCCESS; @@ -1498,15 +1498,15 @@ NtGdiExtTextOut( HBRUSH hBrushBg = NULL; PGDIBRUSHOBJ BrushBg = NULL; HBITMAP HSourceGlyph; - PSURFOBJ SourceGlyphSurf; + SURFOBJ *SourceGlyphSurf; SIZEL bitSize; FT_CharMap found = 0, charmap; INT yoff; - PFONTOBJ FontObj; + FONTOBJ *FontObj; PFONTGDI FontGDI; PTEXTOBJ TextObj; PPALGDI PalDestGDI; - PXLATEOBJ XlateObj, XlateObj2; + XLATEOBJ *XlateObj, *XlateObj2; ULONG Mode; FT_Render_Mode RenderMode; BOOLEAN Render; @@ -1598,7 +1598,7 @@ NtGdiExtTextOut( Mode = PalDestGDI->Mode; PALETTE_UnlockPalette(dc->w.hPalette); } - XlateObj = (PXLATEOBJ)IntEngCreateXlate(Mode, PAL_RGB, dc->w.hPalette, NULL); + XlateObj = (XLATEOBJ*)IntEngCreateXlate(Mode, PAL_RGB, dc->w.hPalette, NULL); hBrushFg = NtGdiCreateSolidBrush(XLATEOBJ_iXlate(XlateObj, dc->w.textColor)); BrushFg = BRUSHOBJ_LockBrush(hBrushFg); if ((fuOptions & ETO_OPAQUE) || dc->w.backgroundMode == OPAQUE) @@ -1614,7 +1614,7 @@ NtGdiExtTextOut( goto fail; } } - XlateObj2 = (PXLATEOBJ)IntEngCreateXlate(PAL_RGB, Mode, NULL, dc->w.hPalette); + XlateObj2 = (XLATEOBJ*)IntEngCreateXlate(PAL_RGB, Mode, NULL, dc->w.hPalette); SourcePoint.x = 0; SourcePoint.y = 0; @@ -1823,7 +1823,7 @@ NtGdiExtTextOut( */ HSourceGlyph = EngCreateBitmap(bitSize, pitch, (glyph->bitmap.pixel_mode == ft_pixel_mode_grays) ? BMF_8BPP : BMF_1BPP, 0, glyph->bitmap.buffer); - SourceGlyphSurf = (PSURFOBJ)AccessUserObject((ULONG) HSourceGlyph); + SourceGlyphSurf = (SURFOBJ*)AccessUserObject((ULONG) HSourceGlyph); /* * Use the font data as a mask to paint onto the DCs surface using a @@ -1842,7 +1842,7 @@ NtGdiExtTextOut( &BrushFg->BrushObject, &BrushOrigin); - EngDeleteSurface(HSourceGlyph); + EngDeleteSurface((HSURF)HSourceGlyph); if (NULL == Dx) { diff --git a/reactos/subsys/win32k/stubs/stubs.c b/reactos/subsys/win32k/stubs/stubs.c index e53a6f852ac..9b1d98646da 100644 --- a/reactos/subsys/win32k/stubs/stubs.c +++ b/reactos/subsys/win32k/stubs/stubs.c @@ -320,7 +320,7 @@ BOOL STDCALL EngGetFilePath( IN HANDLE h, - OUT WCHAR* pDest + OUT WCHAR (*pDest)[MAX_PATH+1] ) { // www.osr.com/ddk/graphics/gdifncs_5g2v.htm @@ -879,7 +879,7 @@ FLOATOBJ_SubLong( ULONG STDCALL FONTOBJ_cGetAllGlyphHandles ( - IN PFONTOBJ FontObj, + IN FONTOBJ *FontObj, IN HGLYPH *Glyphs ) { @@ -893,7 +893,7 @@ FONTOBJ_cGetAllGlyphHandles ( ULONG STDCALL FONTOBJ_cGetGlyphs( - IN PFONTOBJ FontObj, + IN FONTOBJ *FontObj, IN ULONG Mode, IN ULONG NumGlyphs, IN HGLYPH *GlyphHandles, @@ -909,7 +909,7 @@ FONTOBJ_cGetGlyphs( */ IFIMETRICS* STDCALL -FONTOBJ_pifi ( IN PFONTOBJ FontObj ) +FONTOBJ_pifi ( IN FONTOBJ *FontObj ) { UNIMPLEMENTED; return NULL; @@ -921,7 +921,7 @@ FONTOBJ_pifi ( IN PFONTOBJ FontObj ) PVOID STDCALL FONTOBJ_pvTrueTypeFontFile ( - IN PFONTOBJ FontObj, + IN FONTOBJ *FontObj, IN ULONG *FileSize) { UNIMPLEMENTED; @@ -933,7 +933,7 @@ FONTOBJ_pvTrueTypeFontFile ( */ XFORMOBJ* STDCALL -FONTOBJ_pxoGetXform ( IN PFONTOBJ FontObj ) +FONTOBJ_pxoGetXform ( IN FONTOBJ *FontObj ) { UNIMPLEMENTED; return NULL; @@ -945,7 +945,7 @@ FONTOBJ_pxoGetXform ( IN PFONTOBJ FontObj ) VOID STDCALL FONTOBJ_vGetInfo ( - IN PFONTOBJ FontObj, + IN FONTOBJ *FontObj, IN ULONG InfoSize, OUT PFONTINFO FontInfo) { @@ -1243,10 +1243,10 @@ EngQuerySystemAttribute( */ FLATPTR STDCALL HeapVidMemAllocAligned( - IN VIDEOMEMORY *lpVidMem, + IN LPVIDMEM lpVidMem, IN DWORD dwWidth, IN DWORD dwHeight, - IN /*LPSURFACEALIGNMENT*/LPVOID lpAlignment, + IN LPSURFACEALIGNMENT lpAlignment, OUT LPLONG lpNewPitch) { UNIMPLEMENTED; diff --git a/reactos/w32api/include/ddk/ntapi.h b/reactos/w32api/include/ddk/ntapi.h index 2875826a619..223c01c4e34 100644 --- a/reactos/w32api/include/ddk/ntapi.h +++ b/reactos/w32api/include/ddk/ntapi.h @@ -1930,9 +1930,6 @@ NTAPI ZwStopProfile( IN HANDLE ProfileHandle); - - - /* Local Procedure Call (LPC) */ typedef struct _LPC_MESSAGE { @@ -1946,6 +1943,8 @@ typedef struct _LPC_MESSAGE { UCHAR Data[ANYSIZE_ARRAY]; } LPC_MESSAGE, *PLPC_MESSAGE; +#define LPC_MESSAGE_BASE_SIZE 24 + typedef enum _LPC_TYPE { LPC_NEW_MESSAGE, LPC_REQUEST, diff --git a/reactos/w32api/include/ddk/ntifs.h b/reactos/w32api/include/ddk/ntifs.h index b09c1630615..0621d83c693 100644 --- a/reactos/w32api/include/ddk/ntifs.h +++ b/reactos/w32api/include/ddk/ntifs.h @@ -32,11 +32,11 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #include "ntapi.h" +#pragma pack(push,4) + #define VER_PRODUCTBUILD 10000 #ifndef NTSYSAPI diff --git a/reactos/w32api/include/ddk/prntfont.h b/reactos/w32api/include/ddk/prntfont.h new file mode 100644 index 00000000000..d6b944ebe23 --- /dev/null +++ b/reactos/w32api/include/ddk/prntfont.h @@ -0,0 +1,291 @@ +/* + * prntfont.h + * + * Declarations for Windows NT printer driver font metrics + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Filip Navara + * + * 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 __PRNTFONT_H +#define __PRNTFONT_H + +#ifndef TAG +#define TAG(_a, _b, _c, _d) (ULONG) \ + (((_a) << 0) + ((_b) << 8) + ((_c) << 16) + ((_d) << 24)) +#endif + +#define UNIFM_VERSION_1_0 0x10000 +#define UNI_GLYPHSETDATA_VERSION_1_0 0x10000 + +#define UFM_SOFT 1 +#define UFM_CART 2 +#define UFM_SCALABLE 4 + +#define DF_TYPE_HPINTELLIFONT 0 +#define DF_TYPE_TRUETYPE 1 +#define DF_TYPE_PST1 2 +#define DF_TYPE_CAPSL 3 +#define DF_TYPE_OEM1 4 +#define DF_TYPE_OEM2 5 +#define DF_NOITALIC 1 +#define DF_NOUNDER 2 +#define DF_XM_CR 4 +#define DF_NO_BOLD 8 +#define DF_NO_DOUBLE_UNDERLINE 16 +#define DF_NO_STRIKETHRU 32 +#define DF_BKSP_OK 64 + +#define MTYPE_COMPOSE 1 +#define MTYPE_DIRECT 2 +#define MTYPE_PAIRED 4 +#define MTYPE_FORMAT_MASK 7 +#define MTYPE_SINGLE 8 +#define MTYPE_DOUBLE 16 +#define MTYPE_DOUBLEBYTECHAR_MASK 24 +#define MTYPE_REPLACE 32 +#define MTYPE_ADD 64 +#define MTYPE_DISABLE 128 +#define MTYPE_PREDEFIN_MASK 192 + +#define CC_NOPRECNV 0x0000FFFF +#define CC_DEFAULT 0 +#define CC_CP437 -1 +#define CC_CP850 -2 +#define CC_CP863 -3 +#define CC_BIG5 -10 +#define CC_ISC -11 +#define CC_JIS -12 +#define CC_JIS_ANK -13 +#define CC_NS86 -14 +#define CC_TCA -15 +#define CC_GB2312 -16 +#define CC_SJIS -17 +#define CC_WANSUNG -18 + +#define UFF_FILE_MAGIC TAG('1','F','F','U') +#define UFF_VERSION_NUMBER 0x10001 +#define FONT_DIR_SORTED 1 +#define FONT_REC_SIG TAG('C','E','R','F') +#define WINNT_INSTALLER_SIG TAG('I','F','T','N') + +#define FONT_FL_UFM 0x0001 +#define FONT_FL_IFI 0x0002 +#define FONT_FL_SOFTFONT 0x0004 +#define FONT_FL_PERMANENT_SF 0x0008 +#define FONT_FL_DEVICEFONT 0x0010 +#define FONT_FL_GLYPHSET_GTT 0x0020 +#define FONT_FL_GLYPHSET_RLE 0x0040 +#define FONT_FL_RESERVED 0x8000 + +#define DATA_UFM_SIG TAG('M','F','U','D') +#define DATA_IFI_SIG TAG('I','F','I','D') +#define DATA_GTT_SIG TAG('T','T','G','D') +#define DATA_CTT_SIG TAG('T','T','C','D') +#define DATA_VAR_SIG TAG('R','A','V','D') + +#define FG_CANCHANGE 128 +#define WM_FI_FILENAME 900 + +#define GET_UNIDRVINFO(pUFM) ((PUNIDRVINFO)((ULONG_PTR)(pUFM) + (pUFM)->loUnidrvInfo)) +#define GET_IFIMETRICS(pUFM) ((IFIMETRICS*)((ULONG_PTR)(pUFM) + (pUFM)->loIFIMetrics)) +#define GET_EXTTEXTMETRIC(pUFM) ((EXTTEXTMETRIC*)((ULONG_PTR)(pUFM) + (pUFM)->loExtTextMetric)) +#define GET_WIDTHTABLE(pUFM) ((PWIDTHTABLE)((ULONG_PTR)(pUFM) + (pUFM)->loWidthTable)) +#define GET_KERNDATA(pUFM) ((PKERNDATA)((ULONG_PTR)(pUFM) + (pUFM)->loKernPair)) +#define GET_SELECT_CMD(pUni) ((PCHAR)(pUni) + (pUni)->SelectFont.loOffset) +#define GET_UNSELECT_CMD(pUni) ((PCHAR)(pUni) + (pUni)->UnSelectFont.loOffset) +#define GET_GLYPHRUN(pGTT) ((PGLYPHRUN)((ULONG_PTR)(pGTT) + ((PUNI_GLYPHSETDATA)pGTT)->loRunOffset)) +#define GET_CODEPAGEINFO(pGTT) ((PUNI_CODEPAGEINFO)((ULONG_PTR)(pGTT) + ((PUNI_GLYPHSETDATA)pGTT)->loCodePageOffset)) +#define GET_MAPTABLE(pGTT) ((PMAPTABLE)((ULONG_PTR)(pGTT) + ((PUNI_GLYPHSETDATA)pGTT)->loMapTableOffset)) + +typedef struct _UNIFM_HDR +{ + DWORD dwSize; + DWORD dwVersion; + ULONG ulDefaultCodepage; + LONG lGlyphSetDataRCID; + DWORD loUnidrvInfo; + DWORD loIFIMetrics; + DWORD loExtTextMetric; + DWORD loWidthTable; + DWORD loKernPair; + DWORD dwReserved[2]; +} UNIFM_HDR, *PUNIFM_HDR; + +typedef struct _INVOC +{ + DWORD dwCount; + DWORD loOffset; +} INVOC, *PINVOC; + +typedef struct _UNIDRVINFO +{ + DWORD dwSize; + DWORD flGenFlags; + WORD wType; + WORD fCaps; + WORD wXRes; + WORD wYRes; + SHORT sYAdjust; + SHORT sYMoved; + WORD wPrivateData; + SHORT sShift; + INVOC SelectFont; + INVOC UnSelectFont; + WORD wReserved[4]; +} UNIDRVINFO, *PUNIDRVINFO; + +typedef struct _EXTTEXTMETRIC +{ + SHORT emSize; + SHORT emPointSize; + SHORT emOrientation; + SHORT emMasterHeight; + SHORT emMinScale; + SHORT emMaxScale; + SHORT emMasterUnits; + SHORT emCapHeight; + SHORT emXHeight; + SHORT emLowerCaseAscent; + SHORT emLowerCaseDescent; + SHORT emSlant; + SHORT emSuperScript; + SHORT emSubScript; + SHORT emSuperScriptSize; + SHORT emSubScriptSize; + SHORT emUnderlineOffset; + SHORT emUnderlineWidth; + SHORT emDoubleUpperUnderlineOffset; + SHORT emDoubleLowerUnderlineOffset; + SHORT emDoubleUpperUnderlineWidth; + SHORT emDoubleLowerUnderlineWidth; + SHORT emStrikeOutOffset; + SHORT emStrikeOutWidth; + WORD emKernPairs; + WORD emKernTracks; +} EXTTEXTMETRIC, *PEXTTEXTMETRIC; + +typedef struct _WIDTHRUN +{ + WORD wStartGlyph; + WORD wGlyphCount; + DWORD loCharWidthOffset; +} WIDTHRUN, *PWIDTHRUN; + +typedef struct _WIDTHTABLE +{ + DWORD dwSize; + DWORD dwRunNum; + WIDTHRUN WidthRun[1]; +} WIDTHTABLE, *PWIDTHTABLE; + +typedef struct _KERNDATA +{ + DWORD dwSize; + DWORD dwKernPairNum; + FD_KERNINGPAIR KernPair[1]; +} KERNDATA, *PKERNDATA; + +typedef struct _UNI_GLYPHSETDATA +{ + DWORD dwSize; + DWORD dwVersion; + DWORD dwFlags; + LONG lPredefinedID; + DWORD dwGlyphCount; + DWORD dwRunCount; + DWORD loRunOffset; + DWORD dwCodePageCount; + DWORD loCodePageOffset; + DWORD loMapTableOffset; + DWORD dwReserved[2]; +} UNI_GLYPHSETDATA, *PUNI_GLYPHSETDATA; + +typedef struct _UNI_CODEPAGEINFO +{ + DWORD dwCodePage; + INVOC SelectSymbolSet; + INVOC UnSelectSymbolSet; +} UNI_CODEPAGEINFO, *PUNI_CODEPAGEINFO; + +typedef struct _GLYPHRUN +{ + WCHAR wcLow; + WORD wGlyphCount; +} GLYPHRUN, *PGLYPHRUN; + +typedef struct _TRANSDATA +{ + BYTE ubCodePageID; + BYTE ubType; + union + { + SHORT sCode; + BYTE ubCode; + BYTE ubPairs[2]; + } uCode; +} TRANSDATA, *PTRANSDATA; + +typedef struct _MAPTABLE { + DWORD dwSize; + DWORD dwGlyphNum; + TRANSDATA Trans[1]; +} MAPTABLE, *PMAPTABLE; + +typedef struct _UFF_FILEHEADER { + DWORD dwSignature; + DWORD dwVersion; + DWORD dwSize; + DWORD nFonts; + DWORD nGlyphSets; + DWORD nVarData; + DWORD offFontDir; + DWORD dwFlags; + DWORD dwReserved[4]; +} UFF_FILEHEADER, *PUFF_FILEHEADER; + +typedef struct _UFF_FONTDIRECTORY { + DWORD dwSignature; + WORD wSize; + WORD wFontID; + SHORT sGlyphID; + WORD wFlags; + DWORD dwInstallerSig; + DWORD offFontName; + DWORD offCartridgeName; + DWORD offFontData; + DWORD offGlyphData; + DWORD offVarData; +} UFF_FONTDIRECTORY, *PUFF_FONTDIRECTORY; + +typedef struct _DATA_HEADER { + DWORD dwSignature; + WORD wSize; + WORD wDataID; + DWORD dwDataSize; + DWORD dwReserved; +} DATA_HEADER, *PDATA_HEADER; + +typedef struct _OEMFONTINSTPARAM { + DWORD cbSize; + HANDLE hPrinter; + HANDLE hModule; + HANDLE hHeap; + DWORD dwFlags; + PWSTR pFontInstallerName; +} OEMFONTINSTPARAM, *POEMFONTINSTPARAM; + +#endif /* __PRNTFONT_H */ diff --git a/reactos/w32api/include/ddk/winddi.h b/reactos/w32api/include/ddk/winddi.h index 5659e6f8966..c658f4910ae 100644 --- a/reactos/w32api/include/ddk/winddi.h +++ b/reactos/w32api/include/ddk/winddi.h @@ -38,12 +38,9 @@ extern "C" { #include "ntddk.h" #include -#if 1 +#ifndef __DD_INCLUDED__ /* FIXME: Some DirectDraw structures not added yet */ typedef ULONG_PTR FLATPTR; -typedef PVOID LPVIDMEM; -typedef PVOID LPVMEMHEAP; -typedef PVOID PGLYPHOS; typedef struct _DD_SURFACECALLBACKS { } DD_SURFACECALLBACKS, *PDD_SURFACECALLBACKS; typedef struct _DD_PALETTECALLBACKS { @@ -52,10 +49,6 @@ typedef struct _DD_CALLBACKS { } DD_CALLBACKS, *PDD_CALLBACKS; typedef struct _DD_HALINFO { } DD_HALINFO, *PDD_HALINFO; -typedef struct _DDSCAPS { -} DDSCAPS, *PDDSCAPS; -typedef struct _DDSCAPSEX { -} DDSCAPSEX, *PDDSCAPSEX; typedef struct _VIDEOMEMORY { } VIDEOMEMORY, *LPVIDEOMEMORY; typedef struct _DD_DIRECTDRAW_GLOBAL { @@ -64,6 +57,18 @@ typedef struct _DD_SURFACE_LOCAL { } DD_SURFACE_LOCAL, *PDD_SURFACE_LOCAL, *LPDD_SURFACE_LOCAL; #endif +#ifndef __DDRAWI_INCLUDED__ +typedef PVOID LPVIDMEM; +#endif + +#if !defined(__DD_INCLUDED__) && !defined(__DDRAWI_INCLUDED__) +typedef struct _DDSCAPS { +} DDSCAPS, *PDDSCAPS; +typedef struct _DDSCAPSEX { +} DDSCAPSEX, *PDDSCAPSEX; +typedef PVOID LPVMEMHEAP; +#endif + #if defined(_WIN32K_) #define WIN32KAPI DECL_EXPORT #else @@ -464,6 +469,13 @@ typedef struct _DRVENABLEDATA { DECLARE_HANDLE(HSEMAPHORE); +typedef struct { + DWORD nSize; + HDC hdc; + PBYTE pvEMF; + PBYTE pvCurrentRecord; +} EMFINFO, *PEMFINFO; + typedef struct _ENGSAFESEMAPHORE { HSEMAPHORE hsem; LONG lCount; @@ -2147,7 +2159,7 @@ EngStretchBlt( IN CLIPOBJ *pco, IN XLATEOBJ *pxlo, IN COLORADJUSTMENT *pca, - IN POINTL pptlHTOrg, + IN POINTL *pptlHTOrg, IN RECTL *prclDest, IN RECTL *prclSrc, IN POINTL *pptlMask, @@ -2211,7 +2223,7 @@ EngTextOut( IN RECTL *prclOpaque, IN BRUSHOBJ *pboFore, IN BRUSHOBJ *pboOpaque, - IN POINTL pptlOrg, + IN POINTL *pptlOrg, IN MIX mix); WIN32KAPI @@ -2490,7 +2502,7 @@ FONTOBJ_cGetGlyphs( IN ULONG iMode, IN ULONG cGlyph, IN HGLYPH *phg, - OUT PVOID **ppvGlyph); + OUT PVOID *ppvGlyph); WIN32KAPI FD_GLYPHSET* @@ -2684,7 +2696,7 @@ DDKAPI STROBJ_bEnumPositionsOnly( IN STROBJ *pstro, OUT ULONG *pc, - OUT PGLYPHOS **ppgpos); + OUT PGLYPHPOS *ppgpos); WIN32KAPI BOOL diff --git a/reactos/w32api/include/ddk/winddk.h b/reactos/w32api/include/ddk/winddk.h index 7eea53d20f9..42e31013302 100644 --- a/reactos/w32api/include/ddk/winddk.h +++ b/reactos/w32api/include/ddk/winddk.h @@ -4142,6 +4142,8 @@ RemoveTailList( return Entry; } +#if !defined(_WINBASE_H) || _WIN32_WINNT < 0x0501 + NTOSAPI PSLIST_ENTRY DDKFASTAPI @@ -4155,6 +4157,8 @@ InterlockedPushEntrySList( IN PSLIST_HEADER ListHead, IN PSLIST_ENTRY ListEntry); +#endif + /* * USHORT * QueryDepthSList( diff --git a/reactos/w32api/include/winbase.h b/reactos/w32api/include/winbase.h index aa322ee1c54..4cfadbf0c3d 100644 --- a/reactos/w32api/include/winbase.h +++ b/reactos/w32api/include/winbase.h @@ -1563,7 +1563,7 @@ BOOL WINAPI InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION,DWORD); DWORD WINAPI SetCriticalSectionSpinCount(LPCRITICAL_SECTION,DWORD); BOOL WINAPI InitializeSecurityDescriptor(PSECURITY_DESCRIPTOR,DWORD); BOOL WINAPI InitializeSid (PSID,PSID_IDENTIFIER_AUTHORITY,BYTE); -#if (_WIN32_WINNT >= 0x0501) +#if !defined(__WINDDK_H) && _WIN32_WINNT >= 0x0501 VOID WINAPI InitializeSListHead(PSLIST_HEADER); #endif #ifndef __INTERLOCKED_DECLARED diff --git a/reactos/w32api/include/wingdi.h b/reactos/w32api/include/wingdi.h index 5c5f9a0844f..c4f6290b340 100644 --- a/reactos/w32api/include/wingdi.h +++ b/reactos/w32api/include/wingdi.h @@ -2014,6 +2014,14 @@ typedef struct tagENHMETAHEADER { DWORD nPalEntries; SIZEL szlDevice; SIZEL szlMillimeters; +#if (WINVER >= 0x0400) + DWORD cbPixelFormat; + DWORD offPixelFormat; + DWORD bOpenGL; +#endif +#if (WINVER >= 0x0500) + SIZEL szlMicrometers; +#endif } ENHMETAHEADER,*LPENHMETAHEADER; typedef struct tagMETARECORD { DWORD rdSize; @@ -2114,6 +2122,21 @@ typedef struct _GLYPHMETRICS { short gmCellIncX; short gmCellIncY; } GLYPHMETRICS,*LPGLYPHMETRICS; +#if (_WIN32_WINNT >= 0x0500) +typedef struct tagWCRANGE +{ + WCHAR wcLow; + USHORT cGlyphs; +} WCRANGE, *PWCRANGE, *LPWCRANGE; +typedef struct tagGLYPHSET +{ + DWORD cbThis; + DWORD flAccel; + DWORD cGlyphsSupported; + DWORD cRanges; + WCRANGE ranges[1]; +} GLYPHSET, *PGLYPHSET, *LPGLYPHSET; +#endif typedef struct tagKERNINGPAIR { WORD wFirst; WORD wSecond; @@ -2210,7 +2233,7 @@ typedef struct _POLYTEXTA { UINT uiFlags; RECT rcl; int *pdx; -} POLYTEXTA, *PPOLYTEXTA; +} POLYTEXTA, *PPOLYTEXTA, *LPPOLYTEXTA; typedef struct _POLYTEXTW { int x; int y; @@ -2219,7 +2242,7 @@ typedef struct _POLYTEXTW { UINT uiFlags; RECT rcl; int *pdx; -} POLYTEXTW, *PPOLYTEXTW; +} POLYTEXTW, *PPOLYTEXTW, *LPPOLYTEXTW; typedef struct tagPIXELFORMATDESCRIPTOR { WORD nSize; WORD nVersion; @@ -2348,8 +2371,8 @@ typedef struct tagENUMLOGFONTEXA { typedef struct tagENUMLOGFONTEXW { LOGFONTW elfLogFont; WCHAR elfFullName[LF_FULLFACESIZE]; - BYTE elfStyle[LF_FACESIZE]; - BYTE elfScript[LF_FACESIZE]; + WCHAR elfStyle[LF_FACESIZE]; + WCHAR elfScript[LF_FACESIZE]; } ENUMLOGFONTEXW,*LPENUMLOGFONTEXW; typedef struct tagPOINTFX { FIXED x; @@ -2414,6 +2437,16 @@ typedef struct _DESIGNVECTOR { DWORD dvNumAxes; LONG dvValues[MM_MAX_NUMAXES]; } DESIGNVECTOR, *PDESIGNVECTOR, FAR *LPDESIGNVECTOR; +typedef struct tagENUMLOGFONTEXDVA +{ + ENUMLOGFONTEXA elfEnumLogfontEx; + DESIGNVECTOR elfDesignVector; +} ENUMLOGFONTEXDVA, *PENUMLOGFONTEXDVA, *LPENUMLOGFONTEXDVA; +typedef struct tagENUMLOGFONTEXDVW +{ + ENUMLOGFONTEXW elfEnumLogfontEx; + DESIGNVECTOR elfDesignVector; +} ENUMLOGFONTEXDVW, *PENUMLOGFONTEXDVW, *LPENUMLOGFONTEXDVW; typedef USHORT COLOR16; typedef struct _TRIVERTEX { LONG x; @@ -2510,7 +2543,7 @@ HDC WINAPI CreateDCW(LPCWSTR,LPCWSTR,LPCWSTR,const DEVMODEW*); HBITMAP WINAPI CreateDIBitmap(HDC,const BITMAPINFOHEADER*,DWORD,PCVOID,const BITMAPINFO*,UINT); HBRUSH WINAPI CreateDIBPatternBrush(HGLOBAL,UINT); HBRUSH WINAPI CreateDIBPatternBrushPt(PCVOID,UINT); -HBITMAP WINAPI CreateDIBSection(HDC,const BITMAPINFO*,UINT,void**,HANDLE,DWORD); +HBITMAP WINAPI CreateDIBSection(HDC,const BITMAPINFO*,UINT,PVOID*,HANDLE,DWORD); HBITMAP WINAPI CreateDiscardableBitmap(HDC,int,int); HRGN WINAPI CreateEllipticRgn(int,int,int,int); HRGN WINAPI CreateEllipticRgnIndirect(LPCRECT); @@ -2843,10 +2876,13 @@ typedef TEXTMETRICW TEXTMETRIC,*PTEXTMETRIC,*LPTEXTMETRIC; #define ICMENUMPROC ICMENUMPROCW #define FONTENUMPROC FONTENUMPROCW typedef DEVMODEW DEVMODE,*PDEVMODE,*LPDEVMODE; +typedef ENUMLOGFONTEXDVW ENUMLOGFONTEXDV; +typedef PENUMLOGFONTEXDVW PENUMLOGFONTEXDV; +typedef LPENUMLOGFONTEXDVW LPENUMLOGFONTEXDV; typedef EXTLOGFONTW EXTLOGFONT,*PEXTLOGFONT,*LPEXTLOGFONT; typedef GCP_RESULTSW GCP_RESULTS,*LPGCP_RESULTS; typedef OUTLINETEXTMETRICW OUTLINETEXTMETRIC,*POUTLINETEXTMETRIC,*LPOUTLINETEXTMETRIC; -typedef POLYTEXTW POLYTEXT; +typedef POLYTEXTW POLYTEXT,*PPOLYTEXT,*LPPOLYTEXT; typedef LOGCOLORSPACEW LOGCOLORSPACE,*LPLOGCOLORSPACE; typedef NEWTEXTMETRICW NEWTEXTMETRIC,*PNEWTEXTMETRIC,*LPNEWTEXTMETRIC; typedef NEWTEXTMETRICEXW NEWTEXTMETRICEX; @@ -2912,10 +2948,13 @@ typedef TEXTMETRICA TEXTMETRIC,*PTEXTMETRIC,*LPTEXTMETRIC; #define ICMENUMPROC ICMENUMPROCA #define FONTENUMPROC FONTENUMPROCA typedef DEVMODEA DEVMODE,*PDEVMODE,*LPDEVMODE; +typedef ENUMLOGFONTEXDVA ENUMLOGFONTEXDV; +typedef PENUMLOGFONTEXDVA PENUMLOGFONTEXDV; +typedef LPENUMLOGFONTEXDVA LPENUMLOGFONTEXDV; typedef EXTLOGFONTA EXTLOGFONT,*PEXTLOGFONT,*LPEXTLOGFONT; typedef GCP_RESULTSA GCP_RESULTS,*LPGCP_RESULTS; typedef OUTLINETEXTMETRICA OUTLINETEXTMETRIC,*POUTLINETEXTMETRIC,*LPOUTLINETEXTMETRIC; -typedef POLYTEXTA POLYTEXT; +typedef POLYTEXTA POLYTEXT,*PPOLYTEXT,*LPPOLYTEXT; typedef LOGCOLORSPACEA LOGCOLORSPACE,*LPLOGCOLORSPACE; typedef NEWTEXTMETRICA NEWTEXTMETRIC,*PNEWTEXTMETRIC,*LPNEWTEXTMETRIC; typedef NEWTEXTMETRICEXA NEWTEXTMETRICEX; diff --git a/reactos/w32api/include/winuser.h b/reactos/w32api/include/winuser.h index abfc258480a..374b486fad6 100644 --- a/reactos/w32api/include/winuser.h +++ b/reactos/w32api/include/winuser.h @@ -534,6 +534,7 @@ extern "C" { #define SB_RIGHT 7 #define SB_BOTTOM 7 #define SB_TOP 6 +#define IS_INTRESOURCE(i) (((ULONG_PTR)(i) >> 16) == 0) #define MAKEINTRESOURCEA(i) (LPSTR)((DWORD)((WORD)(i))) #define MAKEINTRESOURCEW(i) (LPWSTR)((DWORD)((WORD)(i))) #ifndef XFree86Server @@ -743,6 +744,9 @@ extern "C" { #define MB_NOFOCUS 0x00008000 #define MB_TYPEMASK 15 #define MB_TOPMOST 0x40000 +#if (WINVER >= 0x0500) +#define MB_CANCELTRYCONTINUE 6 +#endif #define IDOK 1 #define IDCANCEL 2 @@ -1203,6 +1207,41 @@ extern "C" { #define SPI_SETTOGGLEKEYS 53 #define SPI_SETWHEELSCROLLLINES 105 #define SPI_SETWORKAREA 47 +#if (WINVER >= 0x0500) +#define SPI_GETDESKWALLPAPER 115 +#define SPI_GETMOUSESPEED 112 +#define SPI_GETSCREENSAVERRUNNING 114 +#define SPI_GETACTIVEWINDOWTRACKING 0x1000 +#define SPI_GETACTIVEWNDTRKZORDER 0x100C +#define SPI_GETCOMBOBOXANIMATION 0x1004 +#define SPI_GETCURSORSHADOW 0x101A +#define SPI_GETGRADIENTCAPTIONS 0x1008 +#define SPI_GETHOTTRACKING 0x100E +#define SPI_GETKEYBOARDCUES 0x100A +#define SPI_GETLISTBOXSMOOTHSCROLLING 0x1006 +#define SPI_GETMENUANIMATION 0x1002 +#define SPI_GETMENUFADE 0x1012 +#define SPI_GETMENUUNDERLINES 0x100A +#define SPI_GETSELECTIONFADE 0x1014 +#define SPI_GETTOOLTIPANIMATION 0x1016 +#define SPI_GETTOOLTIPFADE 0x1018 +#define SPI_SETACTIVEWINDOWTRACKING 0x1001 +#define SPI_SETACTIVEWNDTRKZORDER 0x100D +#define SPI_SETCOMBOBOXANIMATION 0x1005 +#define SPI_SETCURSORSHADOW 0x101B +#define SPI_SETGRADIENTCAPTIONS 0x1009 +#define SPI_SETHOTTRACKING 0x100F +#define SPI_SETKEYBOARDCUES 0x100B +#define SPI_SETLISTBOXSMOOTHSCROLLING 0x1007 +#define SPI_SETMENUANIMATION 0x1003 +#define SPI_SETMENUFADE 0x1013 +#define SPI_SETMENUUNDERLINES 0x100B +#define SPI_SETMOUSESPEED 113 +#define SPI_SETSELECTIONFADE 0x1015 +#define SPI_SETTOOLTIPANIMATION 0x1017 +#define SPI_SETTOOLTIPFADE 0x1019 +#endif + #define SPIF_UPDATEINIFILE 1 #define SPIF_SENDWININICHANGE 2 #define SPIF_SENDCHANGE 2 @@ -1314,6 +1353,11 @@ extern "C" { #define WM_NCMBUTTONDBLCLK 169 #define WM_NCMBUTTONDOWN 167 #define WM_NCMBUTTONUP 168 +#if (_WIN32_WINNT >= 0x0500) +#define WM_NCXBUTTONDOWN 171 +#define WM_NCXBUTTONUP 172 +#define WM_NCXBUTTONDBLCLK 173 +#endif #define WM_NCMOUSEMOVE 160 #define WM_NCPAINT 133 #define WM_NCRBUTTONDBLCLK 166 @@ -1394,9 +1438,14 @@ extern "C" { #define WM_MBUTTONDBLCLK 521 #define WM_MOUSEWHEEL 522 #define WM_MOUSEFIRST 512 -#define WM_MOUSELAST 522 -#define WM_MOUSEHOVER 0x2A1 -#define WM_MOUSELEAVE 0x2A3 +#if (_WIN32_WINNT >= 0x0500) +#define WM_XBUTTONDOWN 523 +#define WM_XBUTTONUP 524 +#define WM_XBUTTONDBLCLK 525 +#define WM_MOUSELAST 525 +#endif +#define WM_MOUSEHOVER 0x2A1 +#define WM_MOUSELEAVE 0x2A3 #if (_WIN32_WINNT >= 0x0400) #define WHEEL_DELTA 120 #define GET_WHEEL_DELTA_WPARAM(wparam) ((short)HIWORD (wparam)) @@ -1594,6 +1643,7 @@ extern "C" { #define DCX_CLIPSIBLINGS 16 #define DCX_CLIPCHILDREN 8 #define DCX_NORESETATTRS 4 +#define DCX_INTERSECTUPDATE 0x200 #define DCX_LOCKWINDOWUPDATE 0x400 #define DCX_EXCLUDERGN 64 #define DCX_INTERSECTRGN 128 @@ -1813,6 +1863,10 @@ extern "C" { #define MK_SHIFT 4 #define MK_CONTROL 8 #define MK_MBUTTON 16 +#if(_WIN32_WINNT >= 0x0500) +#define MK_XBUTTON1 0x0020 +#define MK_XBUTTON2 0x0040 +#endif #define TPM_CENTERALIGN 4 #define TPM_LEFTALIGN 0 #define TPM_RIGHTALIGN 8 @@ -1841,6 +1895,7 @@ extern "C" { #define HELP_QUIT 2 #define HELP_SETCONTENTS 5 #define HELP_SETINDEX 5 +#define HELP_SETWINPOS 0x203 #define HELP_CONTEXTMENU 0xa #define HELP_FINDER 0xb #define HELP_WM_HELP 0xc @@ -3136,7 +3191,8 @@ long WINAPI BroadcastSystemMessageW(DWORD,LPDWORD,UINT,WPARAM,LPARAM); long WINAPI BroadcastSystemMessageExA(DWORD,LPDWORD,UINT,WPARAM,LPARAM,PBSMINFO); long WINAPI BroadcastSystemMessageExW(DWORD,LPDWORD,UINT,WPARAM,LPARAM,PBSMINFO); #endif /* (_WIN32_WINNT >= 0x0501) */ -BOOL WINAPI CallMsgFilter(PMSG,int); +BOOL WINAPI CallMsgFilterA(LPMSG,INT); +BOOL WINAPI CallMsgFilterW(LPMSG,INT); LRESULT WINAPI CallNextHookEx(HHOOK,int,WPARAM,LPARAM); LRESULT WINAPI CallWindowProcA(WNDPROC,HWND,UINT,WPARAM,LPARAM); LRESULT WINAPI CallWindowProcW(WNDPROC,HWND,UINT,WPARAM,LPARAM); @@ -3491,6 +3547,7 @@ BOOL WINAPI InsertMenuA(HMENU,UINT,UINT,UINT,LPCSTR); BOOL WINAPI InsertMenuW(HMENU,UINT,UINT,UINT,LPCWSTR); BOOL WINAPI InsertMenuItemA(HMENU,UINT,BOOL,LPCMENUITEMINFOA); BOOL WINAPI InsertMenuItemW(HMENU,UINT,BOOL,LPCMENUITEMINFOW); +INT WINAPI InternalGetWindowText(HWND,LPWSTR,INT); BOOL WINAPI IntersectRect(LPRECT,LPCRECT,LPCRECT); BOOL WINAPI InvalidateRect(HWND,LPCRECT,BOOL); BOOL WINAPI InvalidateRgn(HWND,HRGN,BOOL); @@ -3710,7 +3767,7 @@ LONG_PTR WINAPI SetWindowLongPtrW(HWND,int,LONG_PTR); BOOL WINAPI SetWindowPlacement(HWND hWnd,const WINDOWPLACEMENT*); BOOL WINAPI SetWindowPos(HWND,HWND,int,int,int,int,UINT); int WINAPI SetWindowRgn(HWND,HRGN,BOOL); -HOOKPROC WINAPI SetWindowsHookA(int,HOOKPROC); +HHOOK WINAPI SetWindowsHookA(int,HOOKPROC); HHOOK WINAPI SetWindowsHookExA(int,HOOKPROC,HINSTANCE,DWORD); HHOOK WINAPI SetWindowsHookExW(int,HOOKPROC,HINSTANCE,DWORD); BOOL WINAPI SetWindowTextA(HWND,LPCSTR); @@ -3813,6 +3870,7 @@ typedef MONITORINFOEXW MONITORINFOEX, *LPMONITORINFOEX; #define AppendMenu AppendMenuW #define BroadcastSystemMessage BroadcastSystemMessageW #define BroadcastSystemMessageEx BroadcastSystemMessageExW +#define CallMsgFilter CallMsgFilterW #define CallWindowProc CallWindowProcW #define ChangeMenu ChangeMenuW #define CharLower CharLowerW @@ -3977,6 +4035,7 @@ typedef MONITORINFOEXA MONITORINFOEX, *LPMONITORINFOEX; #define AppendMenu AppendMenuA #define BroadcastSystemMessage BroadcastSystemMessageA #define BroadcastSystemMessageEx BroadcastSystemMessageExA +#define CallMsgFilter CallMsgFilterA #define CallWindowProc CallWindowProcA #define ChangeMenu ChangeMenuA #define CharLower CharLowerA From a80aa40a8f656cb155ce6b7d96054e4ede528770 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Fri, 9 Apr 2004 20:16:47 +0000 Subject: [PATCH 0809/1463] fix floating favorites menus svn path=/trunk/; revision=9054 --- reactos/subsys/system/explorer/doc/changes.txt | 1 + reactos/subsys/system/explorer/taskbar/startmenu.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/system/explorer/doc/changes.txt b/reactos/subsys/system/explorer/doc/changes.txt index 634948856d1..ddfafc6b172 100644 --- a/reactos/subsys/system/explorer/doc/changes.txt +++ b/reactos/subsys/system/explorer/doc/changes.txt @@ -75,3 +75,4 @@ If you search for more information, look into the CVS repository. XML storage for configuration options 28.03.2004 m. fuchs configuration options for showing/hiding clock, ... 04.04.2004 m. fuchs import of IE bookmarks; explorer sidebar with bookmark display +09.04.2004 m. fuchs changed favorites start menu implementation to work with internal bookmarks diff --git a/reactos/subsys/system/explorer/taskbar/startmenu.cpp b/reactos/subsys/system/explorer/taskbar/startmenu.cpp index 0ff0781ff53..b21b3cef800 100644 --- a/reactos/subsys/system/explorer/taskbar/startmenu.cpp +++ b/reactos/subsys/system/explorer/taskbar/startmenu.cpp @@ -281,7 +281,7 @@ LRESULT StartMenu::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) WindowRect pos(_hwnd); ///@todo do something similar to StartMenuRoot::TrackStartmenu() in order to automatically close submenus when clicking on the desktop background - StartMenu::Create(pos.left+3, pos.bottom-3, _create_info._folders, 0, _create_info._title, _create_info._creator); + StartMenu::Create(pos.left+3, pos.bottom-3, _create_info._folders, 0, _create_info._title, _create_info._creator, _create_info._info); CloseStartMenu(); } From f2e2102f3964c024771564e7cb23ea4827a62e84 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 9 Apr 2004 20:24:13 +0000 Subject: [PATCH 0810/1463] Fixed .cvsignore. svn path=/trunk/; revision=9055 --- reactos/lib/expat/.cvsignore | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/lib/expat/.cvsignore b/reactos/lib/expat/.cvsignore index b747ce41195..9ca5fc128b2 100644 --- a/reactos/lib/expat/.cvsignore +++ b/reactos/lib/expat/.cvsignore @@ -12,4 +12,5 @@ expat.ncb expat.opt libexpat.dll *.map +*.sym *.dll From b165b56577bbb3d9aae42172c50840457eeb63ec Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Fri, 9 Apr 2004 20:24:24 +0000 Subject: [PATCH 0811/1463] Merge Wine shell32 commits: Juan Lang - comment fixes - improved error checking and conformance with Windows - remove some spurious error messages - Move control panel applet enumeration to cpanelfolder.c. - move CreateMyCompEnumList and CreateDesktopEnumList to their respective files - rewrite CreateFolderEnumList to only FindFirstFile/FindNextFile once svn path=/trunk/; revision=9056 --- reactos/lib/shell32/cpanel.h | 2 + reactos/lib/shell32/cpanelfolder.c | 219 ++++++++++++- reactos/lib/shell32/enumidlist.c | 446 ++++----------------------- reactos/lib/shell32/enumidlist.h | 30 ++ reactos/lib/shell32/pidl.c | 57 ---- reactos/lib/shell32/pidl.h | 2 - reactos/lib/shell32/shell32_main.h | 8 - reactos/lib/shell32/shfldr_desktop.c | 64 +++- reactos/lib/shell32/shfldr_fs.c | 7 +- reactos/lib/shell32/shfldr_mycomp.c | 62 +++- reactos/lib/shell32/shlexec.c | 3 +- 11 files changed, 438 insertions(+), 462 deletions(-) create mode 100644 reactos/lib/shell32/enumidlist.h diff --git a/reactos/lib/shell32/cpanel.h b/reactos/lib/shell32/cpanel.h index 1d37d985191..aa6b49962b8 100644 --- a/reactos/lib/shell32/cpanel.h +++ b/reactos/lib/shell32/cpanel.h @@ -20,6 +20,8 @@ #ifndef __WINE_SHELL_CPANEL_H #define __WINE_SHELL_CPANEL_H +#include "cpl.h" + typedef struct CPlApplet { struct CPlApplet* next; /* linked list */ HWND hWnd; diff --git a/reactos/lib/shell32/cpanelfolder.c b/reactos/lib/shell32/cpanelfolder.c index e4531b5c9cb..99a3674700d 100644 --- a/reactos/lib/shell32/cpanelfolder.c +++ b/reactos/lib/shell32/cpanelfolder.c @@ -38,6 +38,8 @@ #include "ole2.h" #include "shlguid.h" +#include "cpanel.h" +#include "enumidlist.h" #include "pidl.h" #include "undocshell.h" #include "shell32_main.h" @@ -227,6 +229,219 @@ ISF_ControlPanel_fnParseDisplayName(IShellFolder2 * iface, return hr; } +static LPITEMIDLIST _ILCreateCPanelApplet(LPCSTR name, LPCSTR displayName, + LPCSTR comment, int iconIdx) +{ + PIDLCPanelStruct *p; + LPITEMIDLIST pidl; + PIDLDATA tmp; + int size0 = (char*)&tmp.u.cpanel.szName-(char*)&tmp.u.cpanel; + int size = size0; + int l; + + tmp.type = 0; + tmp.u.cpanel.dummy = 0; + tmp.u.cpanel.iconIdx = iconIdx; + + l = strlen(name); + size += l+1; + + tmp.u.cpanel.offsDispName = l+1; + l = strlen(displayName); + size += l+1; + + tmp.u.cpanel.offsComment = tmp.u.cpanel.offsDispName+1+l; + l = strlen(comment); + size += l+1; + + pidl = SHAlloc(size+4); + if (!pidl) + return NULL; + + pidl->mkid.cb = size+2; + memcpy(pidl->mkid.abID, &tmp, 2+size0); + + p = &((PIDLDATA*)pidl->mkid.abID)->u.cpanel; + strcpy(p->szName, name); + strcpy(p->szName+tmp.u.cpanel.offsDispName, displayName); + strcpy(p->szName+tmp.u.cpanel.offsComment, comment); + + *(WORD*)((char*)pidl+(size+2)) = 0; + + pcheck(pidl); + + return pidl; +} + +/************************************************************************** + * _ILGetCPanelPointer() + * gets a pointer to the control panel struct stored in the pidl + */ +static PIDLCPanelStruct* _ILGetCPanelPointer(LPCITEMIDLIST pidl) +{ + LPPIDLDATA pdata = _ILGetDataPointer(pidl); + + if (pdata && pdata->type==0) + return (PIDLCPanelStruct*)&(pdata->u.cpanel); + + return NULL; +} + + /************************************************************************** + * ISF_ControlPanel_fnEnumObjects + */ +static BOOL SHELL_RegisterCPanelApp(IEnumIDList* list, LPCSTR path) +{ + LPITEMIDLIST pidl; + CPlApplet* applet; + CPanel panel; + CPLINFO info; + unsigned i; + int iconIdx; + + char displayName[MAX_PATH]; + char comment[MAX_PATH]; + + WCHAR wpath[MAX_PATH]; + + MultiByteToWideChar(CP_ACP, 0, path, -1, wpath, MAX_PATH); + + panel.first = NULL; + applet = Control_LoadApplet(0, wpath, &panel); + + if (applet) + { + for(i=0; icount; ++i) + { + WideCharToMultiByte(CP_ACP, 0, applet->info[i].szName, -1, displayName, MAX_PATH, 0, 0); + WideCharToMultiByte(CP_ACP, 0, applet->info[i].szInfo, -1, comment, MAX_PATH, 0, 0); + + applet->proc(0, CPL_INQUIRE, i, (LPARAM)&info); + + if (info.idIcon > 0) + iconIdx = -info.idIcon; /* negative icon index instead of icon number */ + else + iconIdx = 0; + + pidl = _ILCreateCPanelApplet(path, displayName, comment, iconIdx); + + if (pidl) + AddToEnumList(list, pidl); + } + Control_UnloadApplet(applet); + } + return TRUE; +} + +static int SHELL_RegisterRegistryCPanelApps(IEnumIDList* list, HKEY hkey_root, LPCSTR szRepPath) +{ + char name[MAX_PATH]; + char value[MAX_PATH]; + HKEY hkey; + + int cnt = 0; + + if (RegOpenKeyA(hkey_root, szRepPath, &hkey) == ERROR_SUCCESS) + { + int idx = 0; + + for(;; ++idx) + { + DWORD nameLen = MAX_PATH; + DWORD valueLen = MAX_PATH; + + if (RegEnumValueA(hkey, idx, name, &nameLen, NULL, NULL, (LPBYTE)&value, &valueLen) != ERROR_SUCCESS) + break; + + if (SHELL_RegisterCPanelApp(list, value)) + ++cnt; + } + RegCloseKey(hkey); + } + + return cnt; +} + +static int SHELL_RegisterCPanelFolders(IEnumIDList* list, HKEY hkey_root, LPCSTR szRepPath) +{ + char name[MAX_PATH]; + HKEY hkey; + + int cnt = 0; + + if (RegOpenKeyA(hkey_root, szRepPath, &hkey) == ERROR_SUCCESS) + { + int idx = 0; + for(;; ++idx) + { + if (RegEnumKeyA(hkey, idx, name, MAX_PATH) != ERROR_SUCCESS) + break; + + if (*name == '{') + { + LPITEMIDLIST pidl = _ILCreateGuidFromStrA(name); + + if (pidl && AddToEnumList(list, pidl)) + ++cnt; + } + } + + RegCloseKey(hkey); + } + + return cnt; +} + +/************************************************************************** + * CreateCPanelEnumList() + */ +static BOOL CreateCPanelEnumList( + IEnumIDList * iface, + DWORD dwFlags) +{ + CHAR szPath[MAX_PATH]; + WIN32_FIND_DATAA wfd; + HANDLE hFile; + + TRACE("(%p)->(flags=0x%08lx) \n",iface,dwFlags); + + /* enumerate control panel folders folders */ + if (dwFlags & SHCONTF_FOLDERS) + SHELL_RegisterCPanelFolders(iface, HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace"); + + /* enumerate the control panel applets */ + if (dwFlags & SHCONTF_NONFOLDERS) + { + LPSTR p; + + GetSystemDirectoryA(szPath, MAX_PATH); + p = PathAddBackslashA(szPath); + strcpy(p, "*.cpl"); + + TRACE("-- (%p)-> enumerate SHCONTF_NONFOLDERS of %s\n",iface,debugstr_a(szPath)); + hFile = FindFirstFileA(szPath, &wfd); + + if (hFile != INVALID_HANDLE_VALUE) + { + do + { + if (!(dwFlags & SHCONTF_INCLUDEHIDDEN) && (wfd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)) + continue; + + if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { + strcpy(p, wfd.cFileName); + SHELL_RegisterCPanelApp((IEnumIDList*)iface, szPath); + } + } while(FindNextFileA(hFile, &wfd)); + FindClose(hFile); + } + + SHELL_RegisterRegistryCPanelApps((IEnumIDList*)iface, HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cpls"); + SHELL_RegisterRegistryCPanelApps((IEnumIDList*)iface, HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cpls"); + } + return TRUE; +} + /************************************************************************** * ISF_ControlPanel_fnEnumObjects */ @@ -237,7 +452,9 @@ ISF_ControlPanel_fnEnumObjects(IShellFolder2 * iface, HWND hwndOwner, DWORD dwFl TRACE("(%p)->(HWND=%p flags=0x%08lx pplist=%p)\n", This, hwndOwner, dwFlags, ppEnumIDList); - *ppEnumIDList = IEnumIDList_Constructor(NULL, dwFlags, EIDL_CPANEL); + *ppEnumIDList = IEnumIDList_Constructor(); + if (*ppEnumIDList) + CreateCPanelEnumList(*ppEnumIDList, dwFlags); TRACE("--(%p)->(new ID List: %p)\n", This, *ppEnumIDList); diff --git a/reactos/lib/shell32/enumidlist.c b/reactos/lib/shell32/enumidlist.c index bb3b0529cd2..4ce2e7257c2 100644 --- a/reactos/lib/shell32/enumidlist.c +++ b/reactos/lib/shell32/enumidlist.c @@ -30,12 +30,10 @@ #include "shlwapi.h" #include "winerror.h" #include "objbase.h" -#include #include "pidl.h" #include "shlguid.h" -#include "shell32_main.h" -#include "cpanel.h" +#include "enumidlist.h" WINE_DEFAULT_DEBUG_CHANNEL(shell); @@ -61,7 +59,7 @@ static struct ICOM_VTABLE(IEnumIDList) eidlvt; /************************************************************************** * AddToEnumList() */ -static BOOL AddToEnumList( +BOOL AddToEnumList( IEnumIDList * iface, LPITEMIDLIST pidl) { @@ -70,6 +68,10 @@ static BOOL AddToEnumList( LPENUMLIST pNew; TRACE("(%p)->(pidl=%p)\n",This,pidl); + + if (!iface || !pidl) + return FALSE; + pNew = (LPENUMLIST)SHAlloc(sizeof(ENUMLIST)); if(pNew) { @@ -101,351 +103,63 @@ static BOOL AddToEnumList( /************************************************************************** * CreateFolderEnumList() */ -static BOOL CreateFolderEnumList( - IEnumIDList * iface, +BOOL CreateFolderEnumList( + IEnumIDList *list, LPCSTR lpszPath, DWORD dwFlags) { - ICOM_THIS(IEnumIDListImpl,iface); + LPITEMIDLIST pidl=NULL; + WIN32_FIND_DATAA stffile; + HANDLE hFile; + CHAR szPath[MAX_PATH]; + BOOL succeeded = TRUE; - LPITEMIDLIST pidl=NULL; - WIN32_FIND_DATAA stffile; - HANDLE hFile; - CHAR szPath[MAX_PATH]; + TRACE("(%p)->(path=%s flags=0x%08lx) \n",list,debugstr_a(lpszPath),dwFlags); - TRACE("(%p)->(path=%s flags=0x%08lx) \n",This,debugstr_a(lpszPath),dwFlags); + if(!lpszPath || !lpszPath[0]) return FALSE; - if(!lpszPath || !lpszPath[0]) return FALSE; + strcpy(szPath, lpszPath); + PathAddBackslashA(szPath); + strcat(szPath,"*.*"); - strcpy(szPath, lpszPath); - PathAddBackslashA(szPath); - strcat(szPath,"*.*"); - - /*enumerate the folders*/ - if(dwFlags & SHCONTF_FOLDERS) - { - TRACE("-- (%p)-> enumerate SHCONTF_FOLDERS of %s\n",This,debugstr_a(szPath)); - hFile = FindFirstFileA(szPath,&stffile); - if( hFile != INVALID_HANDLE_VALUE ) - { - do - { - if( !(dwFlags & SHCONTF_INCLUDEHIDDEN) && (stffile.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) ) continue; - if( (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strcmp (stffile.cFileName, ".") && strcmp (stffile.cFileName, "..")) - { - pidl = _ILCreateFromFindDataA (&stffile); - if(pidl && AddToEnumList((IEnumIDList*)This, pidl)) - { - continue; - } - return FALSE; - } - } while( FindNextFileA(hFile,&stffile)); - FindClose (hFile); - } - } - - /*enumerate the non-folder items (values) */ - if(dwFlags & SHCONTF_NONFOLDERS) - { - TRACE("-- (%p)-> enumerate SHCONTF_NONFOLDERS of %s\n",This,debugstr_a(szPath)); - hFile = FindFirstFileA(szPath,&stffile); - if( hFile != INVALID_HANDLE_VALUE ) - { - do - { - if( !(dwFlags & SHCONTF_INCLUDEHIDDEN) && (stffile.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) ) continue; - if(! (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) - { - pidl = _ILCreateFromFindDataA(&stffile); - if(pidl && AddToEnumList((IEnumIDList*)This, pidl)) - { - continue; - } - return FALSE; - } - } while( FindNextFileA(hFile,&stffile)); - FindClose (hFile); - } - } - return TRUE; -} - -BOOL SHELL_RegisterCPanelApp(IEnumIDList* list, LPCSTR path) -{ - LPITEMIDLIST pidl; - CPlApplet* applet; - CPanel panel; - CPLINFO info; - unsigned i; - int iconIdx; - - char displayName[MAX_PATH]; - char comment[MAX_PATH]; - - WCHAR wpath[MAX_PATH]; - - MultiByteToWideChar(CP_ACP, 0, path, -1, wpath, MAX_PATH); - - panel.first = NULL; - applet = Control_LoadApplet(0, wpath, &panel); - - if (applet) { - for(i=0; icount; ++i) { - WideCharToMultiByte(CP_ACP, 0, applet->info[i].szName, -1, displayName, MAX_PATH, 0, 0); - WideCharToMultiByte(CP_ACP, 0, applet->info[i].szInfo, -1, comment, MAX_PATH, 0, 0); - - applet->proc(0, CPL_INQUIRE, i, (LPARAM)&info); - - if (info.idIcon > 0) - iconIdx = -info.idIcon; /* negative icon index instead of icon number */ - else - iconIdx = 0; - - pidl = _ILCreateCPanel(path, displayName, comment, iconIdx); - - if (pidl) - AddToEnumList(list, pidl); - } - - Control_UnloadApplet(applet); - } - - return TRUE; -} - -int SHELL_RegisterRegistryCPanelApps(IEnumIDList* list, HKEY hkey_root, LPCSTR szRepPath) -{ - char name[MAX_PATH]; - char value[MAX_PATH]; - HKEY hkey; - - int cnt = 0; - - if (RegOpenKeyA(hkey_root, szRepPath, &hkey) == ERROR_SUCCESS) - { - int idx = 0; - for(;; ++idx) + hFile = FindFirstFileA(szPath,&stffile); + if ( hFile != INVALID_HANDLE_VALUE ) { - DWORD nameLen = MAX_PATH; - DWORD valueLen = MAX_PATH; + BOOL findFinished = FALSE; - if (RegEnumValueA(hkey, idx, name, &nameLen, NULL, NULL, (LPBYTE)&value, &valueLen) != ERROR_SUCCESS) - break; - - if (SHELL_RegisterCPanelApp(list, value)) - ++cnt; + do + { + if ( !(stffile.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) + || (dwFlags & SHCONTF_INCLUDEHIDDEN) ) + { + if ( (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && + dwFlags & SHCONTF_FOLDERS && + strcmp (stffile.cFileName, ".") && strcmp (stffile.cFileName, "..")) + { + pidl = _ILCreateFromFindDataA(&stffile); + succeeded = succeeded && AddToEnumList(list, pidl); + } + else if (!(stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + && dwFlags & SHCONTF_NONFOLDERS) + { + pidl = _ILCreateFromFindDataA(&stffile); + succeeded = succeeded && AddToEnumList(list, pidl); + } + } + if (succeeded) + { + if (!FindNextFileA(hFile, &stffile)) + { + if (GetLastError() == ERROR_NO_MORE_FILES) + findFinished = TRUE; + else + succeeded = FALSE; + } + } + } while (succeeded && !findFinished); + FindClose(hFile); } - - RegCloseKey(hkey); - } - - return cnt; -} - -int SHELL_RegisterCPanelFolders(IEnumIDList* list, HKEY hkey_root, LPCSTR szRepPath) -{ - char name[MAX_PATH]; - HKEY hkey; - - int cnt = 0; - - if (RegOpenKeyA(hkey_root, szRepPath, &hkey) == ERROR_SUCCESS) - { - int idx = 0; - for(;; ++idx) - { - if (RegEnumKeyA(hkey, idx, name, MAX_PATH) != ERROR_SUCCESS) - break; - - if (*name == '{') { - LPITEMIDLIST pidl = _ILCreateGuidFromStrA(name); - - if (pidl && AddToEnumList(list, pidl)) - ++cnt; - } - } - - RegCloseKey(hkey); - } - - return cnt; -} - -/************************************************************************** - * CreateCPanelEnumList() - */ -static BOOL CreateCPanelEnumList( - IEnumIDList * iface, - DWORD dwFlags) -{ - ICOM_THIS(IEnumIDListImpl,iface); - - CHAR szPath[MAX_PATH]; - WIN32_FIND_DATAA wfd; - HANDLE hFile; - - TRACE("(%p)->(flags=0x%08lx) \n",This,dwFlags); - - /* enumerate control panel folders folders */ - if (dwFlags & SHCONTF_FOLDERS) - SHELL_RegisterCPanelFolders((IEnumIDList*)This, HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace"); - - /* enumerate the control panel applets */ - if (dwFlags & SHCONTF_NONFOLDERS) - { - LPSTR p; - - GetSystemDirectoryA(szPath, MAX_PATH); - p = PathAddBackslashA(szPath); - strcpy(p, "*.cpl"); - - TRACE("-- (%p)-> enumerate SHCONTF_NONFOLDERS of %s\n",This,debugstr_a(szPath)); - hFile = FindFirstFileA(szPath, &wfd); - - if (hFile != INVALID_HANDLE_VALUE) - { - do - { - if (!(dwFlags & SHCONTF_INCLUDEHIDDEN) && (wfd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)) - continue; - - if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { - strcpy(p, wfd.cFileName); - SHELL_RegisterCPanelApp((IEnumIDList*)This, szPath); - } - } while(FindNextFileA(hFile, &wfd)); - - FindClose(hFile); - } - - SHELL_RegisterRegistryCPanelApps((IEnumIDList*)This, HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cpls"); - SHELL_RegisterRegistryCPanelApps((IEnumIDList*)This, HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cpls"); - } - - return TRUE; -} - -/************************************************************************** - * CreateDesktopEnumList() - */ -static BOOL CreateDesktopEnumList( - IEnumIDList * iface, - DWORD dwFlags) -{ - ICOM_THIS(IEnumIDListImpl,iface); - - LPITEMIDLIST pidl=NULL; - HKEY hkey; - char szPath[MAX_PATH]; - - TRACE("(%p)->(flags=0x%08lx) \n",This,dwFlags); - - /*enumerate the root folders */ - if(dwFlags & SHCONTF_FOLDERS) - { - /*create the pidl for This item */ - pidl = _ILCreateMyComputer(); - if(pidl) - { - if(!AddToEnumList((IEnumIDList*)This, pidl)) - return FALSE; - } - - if(! RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\explorer\\desktop\\NameSpace", 0, KEY_READ, &hkey)) - { - char iid[50]; - int i=0; - - while (1) - { - DWORD size = sizeof (iid); - - if(ERROR_SUCCESS!=RegEnumKeyExA(hkey, i, iid, &size, 0, NULL, NULL, NULL)) - break; - - pidl = _ILCreateGuidFromStrA(iid); - - if(pidl) - AddToEnumList((IEnumIDList*)This, pidl); - - i++; - } - RegCloseKey(hkey); - } - } - - /*enumerate the elements in %windir%\desktop */ - SHGetSpecialFolderPathA(0, szPath, CSIDL_DESKTOPDIRECTORY, FALSE); - - /*FIXME: hide icons for classes in SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\explorer\\HideDesktopIcons\\ClassicStartMenu - -> alter attributes in IDLDATA.folder.uFileAttribs ? - */ - CreateFolderEnumList( (IEnumIDList*)This, szPath, dwFlags); - - return TRUE; -} - -/************************************************************************** - * CreateMyCompEnumList() - */ -static BOOL CreateMyCompEnumList( - IEnumIDList * iface, - DWORD dwFlags) -{ - ICOM_THIS(IEnumIDListImpl,iface); - - LPITEMIDLIST pidl=NULL; - DWORD dwDrivemap; - CHAR szDriveName[4]; - HKEY hkey; - - TRACE("(%p)->(flags=0x%08lx) \n",This,dwFlags); - - /*enumerate the folders*/ - if(dwFlags & SHCONTF_FOLDERS) - { - dwDrivemap = GetLogicalDrives(); - strcpy (szDriveName,"A:\\"); - while (szDriveName[0]<='Z') - { - if(dwDrivemap & 0x00000001L) - { - pidl = _ILCreateDrive(szDriveName); - if(pidl) - { - if(!AddToEnumList((IEnumIDList*)This, pidl)) - return FALSE; - } - } - szDriveName[0]++; - dwDrivemap = dwDrivemap >> 1; - } - - TRACE("-- (%p)-> enumerate (mycomputer shell extensions)\n",This); - if(! RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\explorer\\mycomputer\\NameSpace", 0, KEY_READ, &hkey)) - { - char iid[50]; - int i=0; - - while (1) - { - DWORD size = sizeof (iid); - - if(ERROR_SUCCESS!=RegEnumKeyExA(hkey, i, iid, &size, 0, NULL, NULL, NULL)) - break; - - pidl = _ILCreateGuidFromStrA(iid); - - if(pidl) - AddToEnumList((IEnumIDList*)This, pidl); - - i++; - } - RegCloseKey(hkey); - } - } - return TRUE; + return succeeded; } /************************************************************************** @@ -475,51 +189,19 @@ static BOOL DeleteList( * */ -IEnumIDList * IEnumIDList_Constructor( - LPCSTR lpszPath, - DWORD dwFlags, - DWORD dwKind) +IEnumIDList * IEnumIDList_Constructor(void) { - IEnumIDListImpl* lpeidl; - BOOL ret = FALSE; + IEnumIDListImpl *lpeidl = (IEnumIDListImpl*)HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, sizeof(IEnumIDListImpl)); - TRACE("()->(%s flags=0x%08lx kind=0x%08lx)\n",debugstr_a(lpszPath),dwFlags, dwKind); + if (lpeidl) + { + lpeidl->ref = 1; + lpeidl->lpVtbl = &eidlvt; + } + TRACE("-- (%p)->()\n",lpeidl); - lpeidl = (IEnumIDListImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IEnumIDListImpl)); - - if(lpeidl) - { - lpeidl->ref = 1; - lpeidl->lpVtbl = &eidlvt; - - switch (dwKind) - { - case EIDL_DESK: - ret = CreateDesktopEnumList((IEnumIDList*)lpeidl, dwFlags); - break; - - case EIDL_MYCOMP: - ret = CreateMyCompEnumList((IEnumIDList*)lpeidl, dwFlags); - break; - - case EIDL_FILE: - ret = CreateFolderEnumList((IEnumIDList*)lpeidl, lpszPath, dwFlags); - break; - - case EIDL_CPANEL: - ret = CreateCPanelEnumList((IEnumIDList*)lpeidl, dwFlags); - break; - } - - if(!ret) { - HeapFree(GetProcessHeap(),0,lpeidl); - lpeidl = NULL; - } - } - - TRACE("-- (%p)->()\n",lpeidl); - - return (IEnumIDList*)lpeidl; + return (IEnumIDList*)lpeidl; } /************************************************************************** @@ -573,7 +255,7 @@ static ULONG WINAPI IEnumIDList_fnRelease( TRACE("(%p)->(%lu)\n",This,This->ref); - if(!--(This->ref)) { + if (!--(This->ref)) { TRACE(" destroying IEnumIDList(%p)\n",This); DeleteList((IEnumIDList*)This); HeapFree(GetProcessHeap(),0,This); diff --git a/reactos/lib/shell32/enumidlist.h b/reactos/lib/shell32/enumidlist.h new file mode 100644 index 00000000000..53b8b5ff111 --- /dev/null +++ b/reactos/lib/shell32/enumidlist.h @@ -0,0 +1,30 @@ +/* + * 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 __ENUMIDLIST_H__ +#define __ENUMIDLIST_H__ + +#include "shlobj.h" + +/* Creates an IEnumIDList; add LPITEMIDLISTs to it with AddToEnumList. */ +LPENUMIDLIST IEnumIDList_Constructor(void); +BOOL AddToEnumList(IEnumIDList *list, LPITEMIDLIST pidl); + +/* Enumerates the folders and/or files (depending on dwFlags) in lpszPath and + * adds them to the already-created list. + */ +BOOL CreateFolderEnumList(IEnumIDList *list, LPCSTR lpszPath, DWORD dwFlags); + +#endif /* ndef __ENUMIDLIST_H__ */ diff --git a/reactos/lib/shell32/pidl.c b/reactos/lib/shell32/pidl.c index cd703cfa7ff..1ebdd76330f 100644 --- a/reactos/lib/shell32/pidl.c +++ b/reactos/lib/shell32/pidl.c @@ -1644,49 +1644,6 @@ LPITEMIDLIST _ILCreateDrive( LPCSTR lpszNew) return pidlOut; } -LPITEMIDLIST _ILCreateCPanel(LPCSTR name, LPCSTR displayName, LPCSTR comment, int iconIdx) -{ - PIDLCPanelStruct *p; - LPITEMIDLIST pidl; - PIDLDATA tmp; - int size0 = (char*)&tmp.u.cpanel.szName-(char*)&tmp.u.cpanel; - int size = size0; - int l; - - tmp.type = 0; - tmp.u.cpanel.dummy = 0; - tmp.u.cpanel.iconIdx = iconIdx; - - l = strlen(name); - size += l+1; - - tmp.u.cpanel.offsDispName = l+1; - l = strlen(displayName); - size += l+1; - - tmp.u.cpanel.offsComment = tmp.u.cpanel.offsDispName+1+l; - l = strlen(comment); - size += l+1; - - pidl = SHAlloc(size+4); - if (!pidl) - return NULL; - - pidl->mkid.cb = size+2; - memcpy(pidl->mkid.abID, &tmp, 2+size0); - - p = &((PIDLDATA*)pidl->mkid.abID)->u.cpanel; - strcpy(p->szName, name); - strcpy(p->szName+tmp.u.cpanel.offsDispName, displayName); - strcpy(p->szName+tmp.u.cpanel.offsComment, comment); - - *(WORD*)((char*)pidl+(size+2)) = 0; - - pcheck(pidl); - - return pidl; -} - /************************************************************************** * _ILGetDrive() * @@ -1990,20 +1947,6 @@ REFIID _ILGetGUIDPointer(LPCITEMIDLIST pidl) return NULL; } -/************************************************************************** - * _ILGetCPanelPointer() - * gets a pointer to the control panel struct stored in the pidl - */ -PIDLCPanelStruct* _ILGetCPanelPointer(LPCITEMIDLIST pidl) -{ - LPPIDLDATA pdata = _ILGetDataPointer(pidl); - - if (pdata && pdata->type==0) - return (PIDLCPanelStruct*)&(pdata->u.cpanel); - - return NULL; -} - /************************************************************************* * _ILGetFileDateTime * diff --git a/reactos/lib/shell32/pidl.h b/reactos/lib/shell32/pidl.h index 7a2456ecb2b..bbd8aa35845 100644 --- a/reactos/lib/shell32/pidl.h +++ b/reactos/lib/shell32/pidl.h @@ -209,7 +209,6 @@ LPITEMIDLIST _ILCreatePrinters (void); LPITEMIDLIST _ILCreateNetwork (void); LPITEMIDLIST _ILCreateBitBucket (void); LPITEMIDLIST _ILCreateDrive (LPCSTR); -LPITEMIDLIST _ILCreateCPanel (LPCSTR name, LPCSTR displayName, LPCSTR comment, int iconIdx); /* * helper functions (getting struct-pointer) @@ -218,7 +217,6 @@ LPPIDLDATA _ILGetDataPointer (LPCITEMIDLIST); LPSTR _ILGetTextPointer (LPCITEMIDLIST); LPSTR _ILGetSTextPointer (LPCITEMIDLIST); REFIID _ILGetGUIDPointer (LPCITEMIDLIST pidl); -PIDLCPanelStruct* _ILGetCPanelPointer (LPCITEMIDLIST pidl); /* * debug helper diff --git a/reactos/lib/shell32/shell32_main.h b/reactos/lib/shell32/shell32_main.h index 97e3ee92095..eb399e45628 100644 --- a/reactos/lib/shell32/shell32_main.h +++ b/reactos/lib/shell32/shell32_main.h @@ -97,14 +97,6 @@ HRESULT WINAPI CPanel_GetIconLocationW(LPITEMIDLIST pidl, LPWSTR szIconFile, UIN HRESULT WINAPI CPanel_ExtractIconA(LPITEMIDLIST pidl, LPCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize); HRESULT WINAPI CPanel_ExtractIconW(LPITEMIDLIST pidl, LPCWSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize); -/* kind of enumidlist */ -#define EIDL_DESK 0 -#define EIDL_MYCOMP 1 -#define EIDL_FILE 2 -#define EIDL_CPANEL 3 - -LPENUMIDLIST IEnumIDList_Constructor(LPCSTR,DWORD,DWORD); - LPEXTRACTICONA IExtractIconA_Constructor(LPCITEMIDLIST); LPEXTRACTICONW IExtractIconW_Constructor(LPCITEMIDLIST); HRESULT CreateStreamOnFile (LPCWSTR pszFilename, DWORD grfMode, IStream ** ppstm); diff --git a/reactos/lib/shell32/shfldr_desktop.c b/reactos/lib/shell32/shfldr_desktop.c index ef053570855..4559912a383 100644 --- a/reactos/lib/shell32/shfldr_desktop.c +++ b/reactos/lib/shell32/shfldr_desktop.c @@ -40,6 +40,7 @@ #include "ole2.h" #include "shlguid.h" +#include "enumidlist.h" #include "pidl.h" #include "undocshell.h" #include "shell32_main.h" @@ -259,6 +260,59 @@ static HRESULT WINAPI ISF_Desktop_fnParseDisplayName (IShellFolder2 * iface, return hr; } +/************************************************************************** + * CreateDesktopEnumList() + */ +static BOOL CreateDesktopEnumList(IEnumIDList *list, DWORD dwFlags) +{ + BOOL ret = TRUE; + char szPath[MAX_PATH]; + + TRACE("(%p)->(flags=0x%08lx) \n",list,dwFlags); + + /*enumerate the root folders */ + if(dwFlags & SHCONTF_FOLDERS) + { + HKEY hkey; + + /*create the pidl for This item */ + ret = AddToEnumList(list, _ILCreateMyComputer()); + + if (ret && !RegOpenKeyExA(HKEY_LOCAL_MACHINE, + "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\explorer\\desktop\\NameSpace", + 0, KEY_READ, &hkey)) + { + char iid[50]; + int i=0; + BOOL moreKeys = TRUE; + + while (ret && moreKeys) + { + DWORD size = sizeof (iid); + LONG apiRet = RegEnumKeyExA(hkey, i, iid, &size, 0, NULL, NULL, + NULL); + + if (ERROR_SUCCESS == apiRet) + { + ret = AddToEnumList(list, _ILCreateGuidFromStrA(iid)); + i++; + } + else if (ERROR_NO_MORE_ITEMS == apiRet) + moreKeys = FALSE; + else + ret = FALSE; + } + RegCloseKey(hkey); + } + } + + /*enumerate the elements in %windir%\desktop */ + SHGetSpecialFolderPathA(0, szPath, CSIDL_DESKTOPDIRECTORY, FALSE); + ret = ret && CreateFolderEnumList(list, szPath, dwFlags); + + return ret; +} + /************************************************************************** * ISF_Desktop_fnEnumObjects */ @@ -269,15 +323,13 @@ static HRESULT WINAPI ISF_Desktop_fnEnumObjects (IShellFolder2 * iface, TRACE ("(%p)->(HWND=%p flags=0x%08lx pplist=%p)\n", This, hwndOwner, dwFlags, ppEnumIDList); - *ppEnumIDList = NULL; - *ppEnumIDList = IEnumIDList_Constructor (NULL, dwFlags, EIDL_DESK); + *ppEnumIDList = IEnumIDList_Constructor(); + if (*ppEnumIDList) + CreateDesktopEnumList(*ppEnumIDList, dwFlags); TRACE ("-- (%p)->(new ID List: %p)\n", This, *ppEnumIDList); - if (!*ppEnumIDList) - return E_OUTOFMEMORY; - - return S_OK; + return *ppEnumIDList ? S_OK : E_OUTOFMEMORY; } /************************************************************************** diff --git a/reactos/lib/shell32/shfldr_fs.c b/reactos/lib/shell32/shfldr_fs.c index 4346e1f82bb..451df2112de 100644 --- a/reactos/lib/shell32/shfldr_fs.c +++ b/reactos/lib/shell32/shfldr_fs.c @@ -40,6 +40,7 @@ #include "ole2.h" #include "shlguid.h" +#include "enumidlist.h" #include "pidl.h" #include "undocshell.h" #include "shell32_main.h" @@ -391,7 +392,9 @@ IShellFolder_fnEnumObjects (IShellFolder2 * iface, HWND hwndOwner, DWORD dwFlags TRACE ("(%p)->(HWND=%p flags=0x%08lx pplist=%p)\n", This, hwndOwner, dwFlags, ppEnumIDList); - *ppEnumIDList = IEnumIDList_Constructor (This->sPathTarget, dwFlags, EIDL_FILE); + *ppEnumIDList = IEnumIDList_Constructor(); + if (*ppEnumIDList) + CreateFolderEnumList(*ppEnumIDList, This->sPathTarget, dwFlags); TRACE ("-- (%p)->(new ID List: %p)\n", This, *ppEnumIDList); @@ -656,7 +659,7 @@ IShellFolder_fnGetDisplayNameOf (IShellFolder2 * iface, LPCITEMIDLIST pidl, DWOR int len = 0; BOOL bSimplePidl; - *szPath = '\0'; + *szPath = '\0'; TRACE ("(%p)->(pidl=%p,0x%08lx,%p)\n", This, pidl, dwFlags, strRet); pdump (pidl); diff --git a/reactos/lib/shell32/shfldr_mycomp.c b/reactos/lib/shell32/shfldr_mycomp.c index 9923ab7d0aa..bc6bf164d93 100644 --- a/reactos/lib/shell32/shfldr_mycomp.c +++ b/reactos/lib/shell32/shfldr_mycomp.c @@ -38,7 +38,7 @@ #include "wingdi.h" #include "pidl.h" #include "shlguid.h" - +#include "enumidlist.h" #include "undocshell.h" #include "shell32_main.h" #include "shresdef.h" @@ -237,6 +237,62 @@ ISF_MyComputer_fnParseDisplayName (IShellFolder2 * iface, return hr; } +/************************************************************************** + * CreateMyCompEnumList() + */ +static BOOL CreateMyCompEnumList(IEnumIDList *list, DWORD dwFlags) +{ + BOOL ret = TRUE; + + TRACE("(%p)->(flags=0x%08lx) \n",list,dwFlags); + + /*enumerate the folders*/ + if(dwFlags & SHCONTF_FOLDERS) + { + CHAR szDriveName[] = "A:\\"; + DWORD dwDrivemap = GetLogicalDrives(); + HKEY hkey; + + while (ret && szDriveName[0]<='Z') + { + if(dwDrivemap & 0x00000001L) + ret = AddToEnumList(list, _ILCreateDrive(szDriveName)); + szDriveName[0]++; + dwDrivemap = dwDrivemap >> 1; + } + + TRACE("-- (%p)-> enumerate (mycomputer shell extensions)\n",list); + if (ret && !RegOpenKeyExA(HKEY_LOCAL_MACHINE, + "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\explorer\\mycomputer\\NameSpace", + 0, KEY_READ, &hkey)) + { + char iid[50]; + int i=0; + + while (ret) + { + DWORD size = sizeof (iid); + LONG apiRet = RegEnumKeyExA(hkey, i, iid, &size, 0, NULL, NULL, + NULL); + + if (ERROR_SUCCESS == apiRet) + { + /* FIXME: shell extensions, shouldn't the type be + * PT_SHELLEXT? */ + ret = AddToEnumList(list, _ILCreateGuidFromStrA(iid)); + i++; + } + else if (ERROR_NO_MORE_ITEMS == apiRet) + break; + else + ret = FALSE; + } + RegCloseKey(hkey); + } + } + return ret; +} + /************************************************************************** * ISF_MyComputer_fnEnumObjects */ @@ -247,7 +303,9 @@ ISF_MyComputer_fnEnumObjects (IShellFolder2 * iface, HWND hwndOwner, DWORD dwFla TRACE ("(%p)->(HWND=%p flags=0x%08lx pplist=%p)\n", This, hwndOwner, dwFlags, ppEnumIDList); - *ppEnumIDList = IEnumIDList_Constructor (NULL, dwFlags, EIDL_MYCOMP); + *ppEnumIDList = IEnumIDList_Constructor(); + if (*ppEnumIDList) + CreateMyCompEnumList(*ppEnumIDList, dwFlags); TRACE ("-- (%p)->(new ID List: %p)\n", This, *ppEnumIDList); diff --git a/reactos/lib/shell32/shlexec.c b/reactos/lib/shell32/shlexec.c index fac6240f332..22e5922b831 100644 --- a/reactos/lib/shell32/shlexec.c +++ b/reactos/lib/shell32/shlexec.c @@ -537,11 +537,10 @@ UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, TRACE("%s\n", (lpFile != NULL) ? debugstr_w(lpFile) : "-"); + xlpFile[0] = '\0'; lpResult[0] = '\0'; /* Start off with an empty return string */ if (key) *key = '\0'; - xlpFile[0] = '\0'; - /* trap NULL parameters on entry */ if ((lpFile == NULL) || (lpResult == NULL)) { From d05fb60776dcc03d2d5fc4a92773649a0d081ad6 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 9 Apr 2004 20:29:29 +0000 Subject: [PATCH 0812/1463] Add LPC_MESSAGE_BASE_SIZE definition. svn path=/trunk/; revision=9057 --- reactos/include/ntos/zwtypes.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/include/ntos/zwtypes.h b/reactos/include/ntos/zwtypes.h index f8b97a723eb..c17a4b2592a 100755 --- a/reactos/include/ntos/zwtypes.h +++ b/reactos/include/ntos/zwtypes.h @@ -1706,6 +1706,8 @@ typedef struct _LPC_MESSAGE ULONG SectionSize; /* CallbackID */ } LPC_MESSAGE, *PLPC_MESSAGE; +#define LPC_MESSAGE_BASE_SIZE sizeof(LPC_MESSAGE) + #define PORT_MESSAGE_TYPE(m) (LPC_TYPE)((m).Header.MessageType) #define PORT_MAX_DATA_LENGTH 0x104 From 4043af4b0bbb966301296053faf8fba16314acff Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Fri, 9 Apr 2004 20:33:45 +0000 Subject: [PATCH 0813/1463] Merge Wine shell32 commit: Francois Gouget Cleanup the handling of the extension in SHELL_FindExecutable(): - Eliminate the corresponding fixed-size buffer which removes the limitation to 3 character extensions. - Fix handling of the trailing '.' case. - Do a case-insensitive check for the extension in win.ini. Increase the size of the command buffer to 1024. svn path=/trunk/; revision=9058 --- reactos/lib/shell32/shlexec.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/reactos/lib/shell32/shlexec.c b/reactos/lib/shell32/shlexec.c index 22e5922b831..ca117b2a3a3 100644 --- a/reactos/lib/shell32/shlexec.c +++ b/reactos/lib/shell32/shlexec.c @@ -525,10 +525,9 @@ UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, static const WCHAR wExtensions[] = {'e','x','e',' ','p','i','f',' ','b','a','t',' ','c','m','d',' ','c','o','m',0}; WCHAR *extension = NULL; /* pointer to file extension */ - WCHAR wtmpext[5]; /* local copy to mung as we please */ WCHAR filetype[256]; /* registry name for this filetype */ LONG filetypelen = sizeof(filetype); /* length of above */ - WCHAR command[256]; /* command from registry */ + WCHAR command[1024]; /* command from registry */ WCHAR wBuffer[256]; /* Used to GetProfileString */ UINT retval = 31; /* default - 'No association was found' */ WCHAR *tok; /* token pointer */ @@ -575,15 +574,11 @@ UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, /* .\FILE.EXE :( */ TRACE("xlpFile=%s,extension=%s\n", debugstr_w(xlpFile), debugstr_w(extension)); - if ((extension == NULL) || (extension == &xlpFile[strlenW(xlpFile)])) + if (extension == NULL || extension[1]==0) { WARN("Returning 31 - No association\n"); return 31; /* no association */ } - /* Make local copy & lowercase it for reg & 'programs=' lookup */ - lstrcpynW(wtmpext, extension, 5); - CharLowerW(wtmpext); - TRACE("%s file\n", debugstr_w(wtmpext)); /* Three places to check: */ /* 1. win.ini, [windows], programs (NB no leading '.') */ @@ -610,7 +605,7 @@ UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, while (*p == ' ' || *p == '\t') p++; } - if (strcmpW(tok, &wtmpext[1]) == 0) /* have to skip the leading "." */ + if (strcmpiW(tok, &extension[1]) == 0) /* have to skip the leading "." */ { strcpyW(lpResult, xlpFile); /* Need to perhaps check that the file has a path @@ -628,7 +623,7 @@ UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, } /* Check registry */ - if (RegQueryValueW(HKEY_CLASSES_ROOT, wtmpext, filetype, + if (RegQueryValueW(HKEY_CLASSES_ROOT, extension, filetype, &filetypelen) == ERROR_SUCCESS) { filetypelen /= sizeof(WCHAR); From 159aae243bdbae55b75efbf516fec61f8a726cc8 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 9 Apr 2004 20:39:11 +0000 Subject: [PATCH 0814/1463] Compile Win32k using W32API [Part II]: - Replace usage of "ntddvid.h" header with "ntddvdeo.h". - Remove some old and now unused headers. svn path=/trunk/; revision=9059 --- reactos/include/ddk/ntddvid.h | 551 -------- reactos/include/ddk/winddi.h | 1813 --------------------------- reactos/subsys/win32k/eng/xlate.c | 4 +- reactos/subsys/win32k/misc/driver.c | 6 +- 4 files changed, 5 insertions(+), 2369 deletions(-) delete mode 100644 reactos/include/ddk/ntddvid.h delete mode 100644 reactos/include/ddk/winddi.h diff --git a/reactos/include/ddk/ntddvid.h b/reactos/include/ddk/ntddvid.h deleted file mode 100644 index 0acdf614793..00000000000 --- a/reactos/include/ddk/ntddvid.h +++ /dev/null @@ -1,551 +0,0 @@ -/* - * NTDDVID.H - Video Port and MiniPort driver interface - */ - -#include - -/* - * the rough idea: - * init: - * miniport driver defines entrypoint thusly: - * ULONG DriverEntry(PVOID Context1, PVOID Context2); - * miniport allocates and initializes a VIDEO_HW_INIT_DATA struct - * miniport calls VideoPortInitialize - * video port driver handles init of DriverObject (Context1) - * video port driver calls back into HwVidFindAdapter entry point - * video port driver finishes up and returns the status code that - * the miniport driver should return. - * io requests: - * video port driver reformats IRP into VRP - * video port driver calls back into HwVidStartIO entry point - * minimum IoControlCodes that must be handles by the miniport: - * IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES - * IOCTL_VIDEO_QUERY_AVAIL_MODES - * IOCTL_VIDEO_SET_CURRENT_MODE - * IOCTL_VIDEO_MAP_MEMORY - * IOCTL_VIDEO_RESET_DEVICE - * interrupts are handled the same as KM drivers. - */ - -#ifndef __NTDDVID_H -#define __NTDDVID_H - -#if __GNUC__ >=3 -#pragma GCC system_header -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#pragma pack(push,4) - -#include "ntddk.h" - - -typedef LONG VP_STATUS, *PVP_STATUS; - -#define IOCTL_VIDEO_DISABLE_CURSOR \ - CTL_CODE(FILE_DEVICE_VIDEO, 24, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_DISABLE_POINTER \ - CTL_CODE(FILE_DEVICE_VIDEO, 15, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_ENABLE_CURSOR \ - CTL_CODE(FILE_DEVICE_VIDEO, 25, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_ENABLE_POINTER \ - CTL_CODE(FILE_DEVICE_VIDEO, 16, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_FREE_PUBLIC_ACCESS_RANGES \ - CTL_CODE(FILE_DEVICE_VIDEO, 10, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_GET_BANK_SELECT_CODE \ - CTL_CODE(FILE_DEVICE_VIDEO, 30, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_GET_POWER_MANAGEMENT \ - CTL_CODE(FILE_DEVICE_VIDEO, 11, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_LOAD_AND_SET_FONT \ - CTL_CODE(FILE_DEVICE_VIDEO, 32, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_MAP_VIDEO_MEMORY \ - CTL_CODE(FILE_DEVICE_VIDEO, 5, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_QUERY_AVAIL_MODES \ - CTL_CODE(FILE_DEVICE_VIDEO, 1, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_QUERY_COLOR_CAPABILITIES \ - CTL_CODE(FILE_DEVICE_VIDEO, 13, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_QUERY_CURRENT_MODE \ - CTL_CODE(FILE_DEVICE_VIDEO, 2, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_QUERY_CURSOR_ATTR \ - CTL_CODE(FILE_DEVICE_VIDEO, 26, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_QUERY_CURSOR_POSITION \ - CTL_CODE(FILE_DEVICE_VIDEO, 28, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES \ - CTL_CODE(FILE_DEVICE_VIDEO, 0, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_QUERY_POINTER_ATTR \ - CTL_CODE(FILE_DEVICE_VIDEO, 18, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES \ - CTL_CODE(FILE_DEVICE_VIDEO, 17, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_QUERY_POINTER_POSITION \ - CTL_CODE(FILE_DEVICE_VIDEO, 20, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_QUERY_PUBLIC_ACCESS_RANGES \ - CTL_CODE(FILE_DEVICE_VIDEO, 9, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_RESET_DEVICE \ - CTL_CODE(FILE_DEVICE_VIDEO, 4, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_RESTORE_HARDWARE_STATE \ - CTL_CODE(FILE_DEVICE_VIDEO, 23, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_SAVE_HARDWARE_STATE \ - CTL_CODE(FILE_DEVICE_VIDEO, 22, METHOD_BUFFERED, FILE_ANY_ACCESS) - - -#define IOCTL_VIDEO_SET_COLOR_REGISTERS \ - CTL_CODE(FILE_DEVICE_VIDEO, 14, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_SET_CURRENT_MODE \ - CTL_CODE(FILE_DEVICE_VIDEO, 3, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_SET_CURSOR_ATTR \ - CTL_CODE(FILE_DEVICE_VIDEO, 27, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_SET_CURSOR_POSITION \ - CTL_CODE(FILE_DEVICE_VIDEO, 29, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_SET_PALETTE_REGISTERS \ - CTL_CODE(FILE_DEVICE_VIDEO, 31, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_SET_POINTER_ATTR \ - CTL_CODE(FILE_DEVICE_VIDEO, 19, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_SET_POINTER_POSITION \ - CTL_CODE(FILE_DEVICE_VIDEO, 21, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_SET_POWER_MANAGEMENT \ - CTL_CODE(FILE_DEVICE_VIDEO, 12, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_SHARE_VIDEO_MEMORY \ - CTL_CODE(FILE_DEVICE_VIDEO, 7, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_UNMAP_VIDEO_MEMORY \ - CTL_CODE(FILE_DEVICE_VIDEO, 6, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_VIDEO_UNSHARE_VIDEO_MEMORY \ - CTL_CODE(FILE_DEVICE_VIDEO, 8, METHOD_BUFFERED, FILE_ANY_ACCESS) - - - -// Bit definitions for Attribute Flags - -typedef struct _VIDEO_MEMORY { - PVOID RequestedVirtualAddress; -} VIDEO_MEMORY, *PVIDEO_MEMORY; - -typedef struct _VIDEO_MEMORY_INFORMATION { - PVOID VideoRamBase; - ULONG VideoRamLength; - PVOID FrameBufferBase; - ULONG FrameBufferLength; -} VIDEO_MEMORY_INFORMATION, *PVIDEO_MEMORY_INFORMATION; - -typedef struct _VIDEO_MODE { - ULONG RequestedMode; -} VIDEO_MODE, *PVIDEO_MODE; - -/* VIDEO_MODE_INFORMATION.AttributeFlags */ -#define VIDEO_MODE_COLOR 0x0001 -#define VIDEO_MODE_GRAPHICS 0x0002 -#define VIDEO_MODE_PALETTE_DRIVEN 0x0004 - -#define VIDEO_MEMORY_SPACE_MEMORY 0x00 -#define VIDEO_MEMORY_SPACE_IO 0x01 -#define VIDEO_MEMORY_SPACE_USER_MODE 0x02 -#define VIDEO_MEMORY_SPACE_DENSE 0x04 -#define VIDEO_MEMORY_SPACE_P6CACHE 0x08 - -typedef struct _VIDEO_MODE_INFORMATION { - ULONG Length; - ULONG ModeIndex; - ULONG VisScreenWidth; - ULONG VisScreenHeight; - ULONG ScreenStride; - ULONG NumberOfPlanes; - ULONG BitsPerPlane; - ULONG Frequency; - ULONG XMillimeter; - ULONG YMillimeter; - ULONG NumberRedBits; - ULONG NumberGreenBits; - ULONG NumberBlueBits; - ULONG RedMask; - ULONG GreenMask; - ULONG BlueMask; - ULONG AttributeFlags; - ULONG VideoMemoryBitmapWidth; - ULONG VideoMemoryBitmapHeight; - ULONG DriverSpecificAttributeFlags; -} VIDEO_MODE_INFORMATION, *PVIDEO_MODE_INFORMATION; - -typedef struct _VIDEO_NUM_MODES { - ULONG NumModes; - ULONG ModeInformationLength; -} VIDEO_NUM_MODES, *PVIDEO_NUM_MODES; - - - -typedef struct _VIDEO_SHARE_MEMORY { - HANDLE ProcessHandle; - ULONG ViewOffset; - ULONG ViewSize; - PVOID RequestedVirtualAddress; -} VIDEO_SHARE_MEMORY, *PVIDEO_SHARE_MEMORY; - -/* VIDEO_BANK_SELECT.BankingType and PlanarHCBankingType constants */ -typedef enum _VIDEO_BANK_TYPE { - VideoNotBanked = 0, - VideoBanked1RW, - VideoBanked1R1W, - VideoBanked2RW, - NumVideoBankTypes -} VIDEO_BANK_TYPE, *PVIDEO_BANK_TYPE; - -typedef struct _VIDEO_BANK_SELECT { - ULONG Length; - ULONG Size; - ULONG BankingFlags; - ULONG BankingType; - ULONG PlanarHCBankingType; - ULONG BitmapWidthInBytes; - ULONG BitmapSize; - ULONG Granularity; - ULONG PlanarHCGranularity; - ULONG CodeOffset; - ULONG PlanarHCBankCodeOffset; - ULONG PlanarHCEnableCodeOffset; - ULONG PlanarHCDisableCodeOffset; -} VIDEO_BANK_SELECT, *PVIDEO_BANK_SELECT; - - -typedef struct _VIDEO_POINTER_ATTRIBUTES { - ULONG Flags; - ULONG Width; - ULONG Height; - ULONG WidthInBytes; - ULONG Enable; - SHORT Column; - SHORT Row; - UCHAR Pixels[1]; -} VIDEO_POINTER_ATTRIBUTES, *PVIDEO_POINTER_ATTRIBUTES; - -typedef struct _VIDEO_POINTER_CAPABILITIES { - ULONG Flags; - ULONG MaxWidth; - ULONG MaxHeight; - ULONG HWPtrBitmapStart; - ULONG HWPtrBitmapEnd; -} VIDEO_POINTER_CAPABILITIES, *PVIDEO_POINTER_CAPABILITIES; -typedef struct _VIDEO_CLUTDATA { - UCHAR Red; - UCHAR Green; - UCHAR Blue; - UCHAR Unused; -} VIDEO_CLUTDATA, *PVIDEO_CLUTDATA; - - -typedef enum _VIDEO_DEVICE_DATA_TYPE -{ - VpMachineData, - VpCmosData, - VpBusData, - VpControllerData, - VpMonitorData -} VIDEO_DEVICE_DATA_TYPE, *PVIDEO_DEVICE_DATA_TYPE; - -typedef enum _VIDEO_SYNCHRONIZE_PRIORITY -{ - VpLowPriority, - VpMediumPriority, - VpHighPriority -} VIDEO_SYNCHRONIZE_PRIORITY, *PVIDEO_SYNCHRONIZE_PRIORITY; - -typedef struct _STATUS_BLOCK -{ - VP_STATUS Status; - ULONG Information; -} STATUS_BLOCK, *PSTATUS_BLOCK; - -typedef struct _VIDEO_REQUEST_PACKET -{ - ULONG IoControlCode; - PSTATUS_BLOCK StatusBlock; - PVOID InputBuffer; - ULONG InputBufferLength; - PVOID OutputBuffer; - ULONG OutputBufferLength; -} VIDEO_REQUEST_PACKET, *PVIDEO_REQUEST_PACKET; - -typedef struct _VIDEO_PORT_CONFIG_INFO -{ - ULONG Length; - ULONG SystemIoBusNumber; - INTERFACE_TYPE AdapterInterfaceType; - ULONG BusInterruptLevel; - ULONG BusInterruptVector; - KINTERRUPT_MODE InterruptMode; - ULONG NumEmulatorAccessEntries; - PEMULATOR_ACCESS_ENTRY EmulatorAccessEntries; - ULONG EmulatorAccessEntriesContext; - PHYSICAL_ADDRESS VdmPhysicalVideoMemoryAddress; - ULONG VdmPhysicalVideoMemoryLength; - ULONG HardwareStateSize; - ULONG DmaChannel; - ULONG DmaPort; - UCHAR DmaShareable; - UCHAR InterruptShareable; - BOOLEAN Master; - DMA_WIDTH DmaWidth; - DMA_SPEED DmaSpeed; - BOOLEAN bMapBuffers; - BOOLEAN NeedPhysicalAddresses; - BOOLEAN DemandMode; - ULONG MaximumTransferLength; - ULONG NumberOfPhysicalBreaks; - BOOLEAN ScatterGather; - ULONG MaximumScatterGatherChunkSize; -} VIDEO_PORT_CONFIG_INFO, *PVIDEO_PORT_CONFIG_INFO; - -typedef VP_STATUS STDCALL -(*PVIDEO_HW_FIND_ADAPTER)(PVOID HwDeviceExtension, - PVOID HwContext, - PWSTR ArgumentString, - PVIDEO_PORT_CONFIG_INFO ConfigInfo, - PUCHAR Again); - -typedef BOOLEAN STDCALL -(*PVIDEO_HW_INITIALIZE)(PVOID HwDeviceExtension); - -typedef BOOLEAN STDCALL -(*PVIDEO_HW_INTERRUPT)(PVOID HwDeviceExtension); - -typedef BOOLEAN STDCALL -(*PVIDEO_HW_START_IO)(PVOID HwDeviceExtension, - PVIDEO_REQUEST_PACKET RequestPacket); - -typedef BOOLEAN STDCALL -(*PVIDEO_HW_RESET_HW)(PVOID HwDeviceExtension, - ULONG Columns, - ULONG Rows); - -typedef VOID STDCALL -(*PVIDEO_HW_TIMER)(PVOID HwDeviceExtension); - -typedef struct _VIDEO_HW_INITIALIZATION_DATA { - ULONG HwInitDataSize; - INTERFACE_TYPE AdapterInterfaceType; - PVIDEO_HW_FIND_ADAPTER HwFindAdapter; - PVIDEO_HW_INITIALIZE HwInitialize; - PVIDEO_HW_INTERRUPT HwInterrupt; - PVIDEO_HW_START_IO HwStartIO; - ULONG HwDeviceExtensionSize; - ULONG StartingDeviceNumber; - PVIDEO_HW_RESET_HW HwResetHw; - PVIDEO_HW_TIMER HwTimer; -} VIDEO_HW_INITIALIZATION_DATA, *PVIDEO_HW_INITIALIZATION_DATA; - -typedef VP_STATUS STDCALL -(*PMINIPORT_GET_REGISTRY_ROUTINE)(PVOID HwDeviceExtension, - PVOID Context, - PWSTR ValueName, - PVOID ValueData, - ULONG ValueLength); - -typedef VP_STATUS STDCALL -(*PMINIPORT_QUERY_DEVICE_ROUTINE)(PVOID HwDeviceExtension, - PVOID Context, - VIDEO_DEVICE_DATA_TYPE DeviceDataType, - PVOID Identifier, - ULONG IdentiferLength, - PVOID ConfigurationData, - ULONG ConfigurationDataLength, - PVOID ComponentInformation, - ULONG ComponentInformationLength); - -typedef BOOLEAN STDCALL -(*PMINIPORT_SYNCHRONIZE_ROUTINE)(PVOID Context); - -#ifndef VIDEO_ACCESS_RANGE_DEFINED /* also in video.h */ -#define VIDEO_ACCESS_RANGE_DEFINED -typedef struct _VIDEO_ACCESS_RANGE { - PHYSICAL_ADDRESS RangeStart; - ULONG RangeLength; - UCHAR RangeInIoSpace; - UCHAR RangeVisible; - UCHAR RangeShareable; -} VIDEO_ACCESS_RANGE, *PVIDEO_ACCESS_RANGE; -#endif - -typedef struct _VIDEO_X86_BIOS_ARGUMENTS { - ULONG Eax; - ULONG Ebx; - ULONG Ecx; - ULONG Edx; - ULONG Esi; - ULONG Edi; - ULONG Ebp; -} VIDEO_X86_BIOS_ARGUMENTS, *PVIDEO_X86_BIOS_ARGUMENTS; - -#ifndef BANKED_SECTION_ROUTINE_DEFINED /* also in video.h */ -#define BANKED_SECTION_ROUTINE_DEFINED -typedef VOID STDCALL -(*PBANKED_SECTION_ROUTINE)(IN ULONG ReadBank, - IN ULONG WriteBank, - IN PVOID Context); -#endif - -typedef struct { - USHORT NumEntries; - USHORT FirstEntry; - union { - VIDEO_CLUTDATA RgbArray; - ULONG RgbLong; - } LookupTable[1]; -} VIDEO_CLUT, *PVIDEO_CLUT; - -ULONG STDCALL VideoPortCompareMemory(IN PVOID Source1, IN PVOID Source2, IN ULONG Length); -VOID VideoPortDebugPrint(IN ULONG DebugPrintLevel, IN PCHAR DebugMessage, ...); -VP_STATUS STDCALL VideoPortDisableInterrupt(IN PVOID HwDeviceExtension); -VP_STATUS STDCALL VideoPortEnableInterrupt(IN PVOID HwDeviceExtension); -VOID STDCALL VideoPortFreeDeviceBase(IN PVOID HwDeviceExtension, IN PVOID MappedAddress); -ULONG STDCALL VideoPortGetBusData(IN PVOID HwDeviceExtension, - IN BUS_DATA_TYPE BusDataType, - IN ULONG SlotNumber, - OUT PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); -UCHAR STDCALL VideoPortGetCurrentIrql(VOID); -PVOID STDCALL VideoPortGetDeviceBase(IN PVOID HwDeviceExtension, - IN PHYSICAL_ADDRESS IoAddress, - IN ULONG NumberOfUchars, - IN UCHAR InIoSpace); -VP_STATUS STDCALL VideoPortGetDeviceData(IN PVOID HwDeviceExtension, - IN VIDEO_DEVICE_DATA_TYPE DeviceDataType, - IN PMINIPORT_QUERY_DEVICE_ROUTINE CallbackRoutine, - IN PVOID Context); -VP_STATUS STDCALL VideoPortGetAccessRanges(IN PVOID HwDeviceExtension, - IN ULONG NumRequestedResources, - IN PIO_RESOURCE_DESCRIPTOR RequestedResources OPTIONAL, - IN ULONG NumAccessRanges, - IN PVIDEO_ACCESS_RANGE AccessRanges, - IN PVOID VendorId, - IN PVOID DeviceId, - IN PULONG Slot); -VP_STATUS STDCALL VideoPortGetRegistryParameters(IN PVOID HwDeviceExtension, - IN PWSTR ParameterName, - IN UCHAR IsParameterFileName, - IN PMINIPORT_GET_REGISTRY_ROUTINE GetRegistryRoutine, - IN PVOID Context); -ULONG STDCALL VideoPortInitialize(IN PVOID Context1, - IN PVOID Context2, - IN PVIDEO_HW_INITIALIZATION_DATA HwInitializationData, - IN PVOID HwContext); -VP_STATUS STDCALL VideoPortInt10(IN PVOID HwDeviceExtension, - IN PVIDEO_X86_BIOS_ARGUMENTS BiosArguments); -VOID STDCALL VideoPortLogError(IN PVOID HwDeviceExtension, - IN PVIDEO_REQUEST_PACKET Vrp OPTIONAL, - IN VP_STATUS ErrorCode, - IN ULONG UniqueId); -VP_STATUS STDCALL VideoPortMapBankedMemory(IN PVOID HwDeviceExtension, - IN PHYSICAL_ADDRESS PhysicalAddress, - IN PULONG Length, - IN PULONG InIoSpace, - OUT PVOID *VirtualAddress, - IN ULONG BankLength, - IN UCHAR ReadWriteBank, - IN PBANKED_SECTION_ROUTINE BankRoutine, - IN PVOID Context); -VP_STATUS STDCALL VideoPortMapMemory(IN PVOID HwDeviceExtension, - IN PHYSICAL_ADDRESS PhysicalAddress, - IN PULONG Length, - IN PULONG InIoSpace, - OUT PVOID *VirtualAddress); -VOID STDCALL VideoPortMoveMemory(OUT PVOID Destination, - IN PVOID Source, - IN ULONG Length); -UCHAR STDCALL VideoPortReadPortUchar(IN PUCHAR Port); -USHORT STDCALL VideoPortReadPortUshort(IN PUSHORT Port); -ULONG STDCALL VideoPortReadPortUlong(IN PULONG Port); -VOID STDCALL VideoPortReadPortBufferUchar(IN PUCHAR Port, OUT PUCHAR Buffer, IN ULONG Count); -VOID STDCALL VideoPortReadPortBufferUshort(IN PUSHORT Port, OUT PUSHORT Buffer, IN ULONG Count); -VOID STDCALL VideoPortReadPortBufferUlong(IN PULONG Port, OUT PULONG Buffer, IN ULONG Count); -UCHAR STDCALL VideoPortReadRegisterUchar(IN PUCHAR Register); -USHORT STDCALL VideoPortReadRegisterUshort(IN PUSHORT Register); -ULONG STDCALL VideoPortReadRegisterUlong(IN PULONG Register); -VOID STDCALL VideoPortReadRegisterBufferUchar(IN PUCHAR Register, OUT PUCHAR Buffer, IN ULONG Count); -VOID STDCALL VideoPortReadRegisterBufferUshort(IN PUSHORT Register, OUT PUSHORT Buffer, IN ULONG Count); -VOID STDCALL VideoPortReadRegisterBufferUlong(IN PULONG Register, OUT PULONG Buffer, IN ULONG Count); -BOOLEAN STDCALL VideoPortScanRom(IN PVOID HwDeviceExtension, - IN PUCHAR RomBase, - IN ULONG RomLength, - IN PUCHAR String); -ULONG STDCALL VideoPortSetBusData(IN PVOID HwDeviceExtension, - IN BUS_DATA_TYPE BusDataType, - IN ULONG SlotNumber, - IN PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); -VP_STATUS STDCALL VideoPortSetRegistryParameters(IN PVOID HwDeviceExtension, - IN PWSTR ValueName, - IN PVOID ValueData, - IN ULONG ValueLength); -VP_STATUS STDCALL VideoPortSetTrappedEmulatorPorts(IN PVOID HwDeviceExtension, - IN ULONG NumAccessRanges, - IN PVIDEO_ACCESS_RANGE AccessRange); -VOID STDCALL VideoPortStallExecution(IN ULONG Microseconds); -VOID STDCALL VideoPortStartTimer(IN PVOID HwDeviceExtension); -VOID STDCALL VideoPortStopTimer(IN PVOID HwDeviceExtension); -BOOLEAN STDCALL VideoPortSynchronizeExecution(IN PVOID HwDeviceExtension, - IN VIDEO_SYNCHRONIZE_PRIORITY Priority, - IN PMINIPORT_SYNCHRONIZE_ROUTINE SynchronizeRoutine, - OUT PVOID Context); -VP_STATUS STDCALL VideoPortUnmapMemory(IN PVOID HwDeviceExtension, - IN PVOID VirtualAddress, - IN HANDLE ProcessHandle); -VP_STATUS STDCALL VideoPortVerifyAccessRanges(IN PVOID HwDeviceExtension, - IN ULONG NumAccessRanges, - IN PVIDEO_ACCESS_RANGE AccessRanges); -VOID STDCALL VideoPortWritePortUchar(IN PUCHAR Port, IN UCHAR Value); -VOID STDCALL VideoPortWritePortUshort(IN PUSHORT Port, IN USHORT Value); -VOID STDCALL VideoPortWritePortUlong(IN PULONG Port, IN ULONG Value); -VOID STDCALL VideoPortWritePortBufferUchar(IN PUCHAR Port, IN PUCHAR Buffer, IN ULONG Count); -VOID STDCALL VideoPortWritePortBufferUshort(IN PUSHORT Port, IN PUSHORT Buffer, IN ULONG Count); -VOID STDCALL VideoPortWritePortBufferUlong(IN PULONG Port, IN PULONG Buffer, IN ULONG Count); -VOID STDCALL VideoPortWriteRegisterUchar(IN PUCHAR Register, IN UCHAR Value); -VOID STDCALL VideoPortWriteRegisterUshort(IN PUSHORT Register, IN USHORT Value); -VOID STDCALL VideoPortWriteRegisterUlong(IN PULONG Register, IN ULONG Value); -VOID STDCALL VideoPortWriteRegisterBufferUchar(IN PUCHAR Register, IN PUCHAR Buffer, IN ULONG Count); -VOID STDCALL VideoPortWriteRegisterBufferUshort(IN PUSHORT Register, IN PUSHORT Buffer, IN ULONG Count); -VOID STDCALL VideoPortWriteRegisterBufferUlong(IN PULONG Register, IN PULONG Buffer, IN ULONG Count); -VOID STDCALL VideoPortZeroMemory(OUT PVOID Destination, IN ULONG Length); -VOID STDCALL VideoPortZeroDeviceMemory(OUT PVOID Destination, IN ULONG Length); - - - -#pragma pack(pop) - -#ifdef __cplusplus -} -#endif - -#endif /* __NTDDVID_H */ diff --git a/reactos/include/ddk/winddi.h b/reactos/include/ddk/winddi.h deleted file mode 100644 index 05ea9db6d87..00000000000 --- a/reactos/include/ddk/winddi.h +++ /dev/null @@ -1,1813 +0,0 @@ -/* - * WinDDI.h - definition of the GDI - DDI interface - */ - -#ifndef __DDK_WINDDI_H -#define __DDK_WINDDI_H - -#ifdef __USE_W32API - -#include_next - -#else /* __USE_W32API */ - -#if defined(WIN32_LEAN_AND_MEAN) && defined(_GNU_H_WINDOWS32_STRUCTURES) -#error "windows.h cannot be included before winddi.h if WIN32_LEAN_AND_MEAN is defined" -#endif - -#ifdef WIN32_LEAN_AND_MEAN -#undef WIN32_LEAN_AND_MEAN -#include -#define WIN32_LEAN_AND_MEAN -#else -#include -#endif -#include - -#ifndef IN -#define IN -#define OUT -#define OPTIONAL -#endif - -#ifndef PTRDIFF -typedef DWORD PTRDIFF; -#endif - -typedef struct _ENG_EVENT *PEVENT; - -#define DM_SPECVERSION 0x0320 - -#define DDI_DRIVER_VERSION_NT4 0x20000 -#define DDI_DRIVER_VERSION_SP3 0x20003 -#define DDI_DRIVER_VERSION_NT5 0x30000 -#define DDI_DRIVER_VERSION_NT5_01 0x30100 - -#define GDI_DRIVER_VERSION 0x4000 /* NT 4 compatibility */ - -typedef struct _FONTINFO -{ - ULONG cjThis; - FLONG flCaps; - ULONG cGlyphsSupported; - ULONG cjMaxGlyph1; - ULONG cjMaxGlyph4; - ULONG cjMaxGlyph8; - ULONG cjMaxGlyph32; -} FONTINFO, *PFONTINFO; - -typedef BYTE GAMMA_TABLES[2][256]; -typedef GAMMA_TABLES *PGAMMA_TABLES; -typedef COLORADJUSTMENT *PCOLORADJUSTMENT; - -typedef ULONG MIX; -typedef ULONG ROP4; -#define DDI_DRIVER_VERSION 0x00010000 - -#define HS_DDI_MAX 6 - -/* XLate types */ -#define XO_TRIVIAL 0x00000001 -#define XO_TABLE 0x00000002 -#define XO_TO_MONO 0x00000004 - -#define XO_SRCPALETTE 1 -#define XO_DESTPALETTE 2 -#define XO_DESTDCPALETTE 3 - -/* EngCreateBitmap format types */ -enum _BMF_TYPES -{ - BMF_1BPP = 1, - BMF_4BPP, - BMF_8BPP, - BMF_16BPP, - BMF_24BPP, - BMF_32BPP, - BMF_4RLE, - BMF_8RLE, - BMF_JPEG, - BMF_PNG -}; - -#define BMF_TOPDOWN 0x00000001 -#define BMF_NOZEROINIT 0x00000002 -#define BMF_DONTCACHE 0x00000004 -#define BMF_USERMEM 0x00000008 -#define BMF_KMSECTION 0x00000010 -#define BMF_NOTSYSMEM 0x0020 -#define BMF_WINDOW_BLT 0x0040 -#define BMF_UMPDMEM 0x0080 -#define BMF_RESERVED 0xFF00 - -#define DC_TRIVIAL 0 -#define DC_RECT 1 -#define DC_COMPLEX 3 - -#define FC_RECT 1 -#define FC_RECT4 2 -#define FC_COMPLEX 3 - -#define TC_RECTANGLES 0 -#define TC_PATHOBJ 2 - -#define OC_BANK_CLIP 1 - -#define CT_RECTANGLES 0L - -#define CD_LEFTWARDS 1L -#define CD_UPWARDS 2L - -/* Options for CLIPOBJ_cEnumStart BuildOrder field */ -enum _CD_ORDERS -{ - CD_RIGHTDOWN, - CD_LEFTDOWN, - CD_RIGHTUP, - CD_LEFTUP, - CD_ANY -}; - -/* Options for CLIPOBJ_cEnumStart Type field */ -#define CT_RECTANGLE 1 - -#define DCR_SOLID 0 -#define DCR_DRIVER 1 -#define DCR_HALFTONE 2 - -#define DMMAXDEVICENAME 32 -#define DMMAXFORMNAME 32 - -#define DM_DEFAULT 0x00000001 -#define DM_MONOCHROME 0x00000002 - -#define ED_ABORTDOC 0x00000001 - -enum _ESCAPE_CODES -{ - ESC_PASSTHROUGH, - ESC_QUERYESCSUPPORT -}; - -#define FM_INFO_TECH_TRUETYPE 0x00000001 -#define FM_INFO_TECH_BITMAP 0x00000002 -#define FM_INFO_TECH_STROKE 0x00000004 -#define FM_INFO_TECH_OUTLINE_NOT_TRUETYPE 0x00000008 -#define FM_INFO_ARB_XFORMS 0x00000010 -#define FM_INFO_1BPP 0x00000020 -#define FM_INFO_4BPP 0x00000040 -#define FM_INFO_8BPP 0x00000080 -#define FM_INFO_16BPP 0x00000100 -#define FM_INFO_24BPP 0x00000200 -#define FM_INFO_32BPP 0x00000400 -#define FM_INFO_INTEGER_WIDTH 0x00000800 -#define FM_INFO_CONSTANT_WIDTH 0x00001000 -#define FM_INFO_NOT_CONTIGUOUS 0x00002000 -#define FM_INFO_PID_EMBEDDED 0x00004000 -#define FM_INFO_RETURNS_OUTLINES 0x00008000 -#define FM_INFO_RETURNS_STROKES 0x00010000 -#define FM_INFO_RETURNS_BITMAPS 0x00020000 -#define FM_INFO_UNICODE_COMPLIANT 0x00040000 -#define FM_INFO_RIGHT_HANDED 0x00080000 -#define FM_INFO_INTEGRAL_SCALING 0x00100000 -#define FM_INFO_90DEGREE_ROTATIONS 0x00200000 -#define FM_INFO_OPTICALLY_FIXED_PITCH 0x00400000 -#define FM_INFO_DO_NOT_ENUMERATE 0x00800000 -#define FM_INFO_ISOTROPIC_SCALING_ONLY 0x01000000 -#define FM_INFO_ANISOTROPIC_SCALING_ONLY 0x02000000 -#define FM_INFO_TID_EMBEDDED 0x04000000 -#define FM_INFO_FAMILY_EQUIV 0x08000000 -#define FM_INFO_DBCS_FIXED_PITCH 0x10000000 -#define FM_INFO_NONNEGATIVE_AC 0x20000000 -#define FM_INFO_IGNORE_TC_RA_ABLE 0x40000000 -#define FM_INFO_TECH_TYPE1 0x80000000 - -#define FM_SEL_ITALIC 0x00000001 -#define FM_SEL_UNDERSCORE 0x00000002 -#define FM_SEL_NEGATIVE 0x00000004 -#define FM_SEL_OUTLINED 0x00000008 -#define FM_SEL_STRIKEOUT 0x00000010 -#define FM_SEL_BOLD 0x00000020 -#define FM_SEL_REGULAR 0x00000040 - -#define FM_TYPE_LICENSED 0x00000002 -#define FM_READONLY_EMBED 0x00000004 -#define FM_EDITABLE_EMBED 0x00000008 -#define FM_NO_EMBEDDING 0x00000002 - -#define FO_TYPE_RASTER RASTER_FONTTYPE -#define FO_TYPE_DEVICE DEVICE_FONTTYPE -#define FO_TYPE_TRUETYPE TRUETYPE_FONTTYPE -#define FO_SIM_BOLD 0x00002000 -#define FO_SIM_ITALIC 0x00004000 -#define FO_EM_HEIGHT 0x00008000 -#define FO_GRAY16 0x00010000 -#define FO_NOGRAY16 0x00020000 -#define FO_NOHINTS 0x00040000 -#define FO_NO_CHOICE 0x00080000 - -enum _FP_MODES -{ - FP_ALTERNATEMODE = 1, - FP_WINDINGMODE -}; - -typedef struct _FD_GLYPHATTR { - ULONG cjThis; - ULONG cGlyphs; - ULONG iMode; - BYTE aGlyphAttr[1]; -} FD_GLYPHATTR, *PFD_GLYPHATTR; - -enum _GLYPH_MODE -{ - FO_HGLYPHS, - FO_GLYPHBITS, - FO_PATHOBJ -}; - -/* Allowed values for GDIINFO.ulPrimaryOrder. */ - -#define PRIMARY_ORDER_ABC 0 -#define PRIMARY_ORDER_ACB 1 -#define PRIMARY_ORDER_BAC 2 -#define PRIMARY_ORDER_BCA 3 -#define PRIMARY_ORDER_CBA 4 -#define PRIMARY_ORDER_CAB 5 - -/* Allowed values for GDIINFO.ulHTPatternSize. */ - -#define HT_PATSIZE_2x2 0 -#define HT_PATSIZE_2x2_M 1 -#define HT_PATSIZE_4x4 2 -#define HT_PATSIZE_4x4_M 3 -#define HT_PATSIZE_6x6 4 -#define HT_PATSIZE_6x6_M 5 -#define HT_PATSIZE_8x8 6 -#define HT_PATSIZE_8x8_M 7 -#define HT_PATSIZE_10x10 8 -#define HT_PATSIZE_10x10_M 9 -#define HT_PATSIZE_12x12 10 -#define HT_PATSIZE_12x12_M 11 -#define HT_PATSIZE_14x14 12 -#define HT_PATSIZE_14x14_M 13 -#define HT_PATSIZE_16x16 14 -#define HT_PATSIZE_16x16_M 15 -#define HT_PATSIZE_MAX_INDEX HT_PATSIZE_16x16_M -#define HT_PATSIZE_DEFAULT HT_PATSIZE_4x4_M - -/* Allowed values for GDIINFO.ulHTOutputFormat. */ - -#define HT_FORMAT_1BPP 0 -#define HT_FORMAT_4BPP 2 -#define HT_FORMAT_4BPP_IRGB 3 -#define HT_FORMAT_8BPP 4 -#define HT_FORMAT_16BPP 5 -#define HT_FORMAT_24BPP 6 -#define HT_FORMAT_32BPP 7 - -/* Allowed values for GDIINFO.flHTFlags. */ - -#define HT_FLAG_SQUARE_DEVICE_PEL 0x00000001 -#define HT_FLAG_HAS_BLACK_DYE 0x00000002 -#define HT_FLAG_ADDITIVE_PRIMS 0x00000004 -#define HT_FLAG_OUTPUT_CMY 0x00000100 - -#define GCAPS_BEZIERS 0x00000001 -#define GCAPS_GEOMETRICWIDE 0x00000002 -#define GCAPS_ALTERNATEFILL 0x00000004 -#define GCAPS_WINDINGFILL 0x00000008 -#define GCAPS_HALFTONE 0x00000010 -#define GCAPS_COLOR_DITHER 0x00000020 -#define GCAPS_HORIZSTRIKE 0x00000040 -#define GCAPS_VERTSTRIKE 0x00000080 -#define GCAPS_OPAQUERECT 0x00000100 -#define GCAPS_VECTORFONT 0x00000200 -#define GCAPS_MONO_DITHER 0x00000400 -#define GCAPS_ASYNCCHANGE 0x00000800 -#define GCAPS_ASYNCMOVE 0x00001000 -#define GCAPS_DONTJOURNAL 0x00002000 -#define GCAPS_DIRECTDRAW 0x00004000 -#define GCAPS_ARBRUSHOPAQUE 0x00008000 -#define GCAPS_PANNING 0x00010000 -#define GCAPS_HIGHRESTEXT 0x00040000 -#define GCAPS_PALMANAGED 0x00080000 -#define GCAPS_DITHERONREALIZE 0x00200000 -#define GCAPS_NO64BITMEMACCESS 0x00400000 -#define GCAPS_FORCEDITHER 0x00800000 -#define GCAPS_GRAY16 0x01000000 -#define GCAPS_ICM 0x02000000 -#define GCAPS_CMYKCOLOR 0x04000000 -#define GCAPS_LAYERED 0x08000000 -#define GCAPS_ARBRUSHTEXT 0x10000000 -#define GCAPS_SCREENPRECISION 0x20000000 -#define GCAPS_FONT_RASTERIZER 0x40000000 -#define GCAPS_NUP 0x80000000 - -#define GCAPS2_JPEGSRC 0x00000001 -#define GCAPS2_xxxx 0x00000002 -#define GCAPS2_PNGSRC 0x00000008 -#define GCAPS2_CHANGEGAMMARAMP 0x00000010 -#define GCAPS2_ALPHACURSOR 0x00000020 -#define GCAPS2_SYNCFLUSH 0x00000040 -#define GCAPS2_SYNCTIMER 0x00000080 -#define GCAPS2_ICD_MULTIMON 0x00000100 -#define GCAPS2_MOUSETRAILS 0x00000200 -#define GCAPS2_RESERVED1 0x00000400 - -/* EngAssocateSurface hook flags */ -#define HOOK_BITBLT 0x00000001 -#define HOOK_STRETCHBLT 0x00000002 -#define HOOK_PLGBLT 0x00000004 -#define HOOK_TEXTOUT 0x00000008 -#define HOOK_PAINT 0x00000010 -#define HOOK_STROKEPATH 0x00000020 -#define HOOK_FILLPATH 0x00000040 -#define HOOK_STROKEANDFILLPATH 0x00000080 -#define HOOK_LINETO 0x00000100 -#define HOOK_COPYBITS 0x00000400 -#define HOOK_SYNCHRONIZE 0x00001000 -#define HOOK_SYNCHRONIZEACCESS 0x00004000 -#define HOOK_TRANSPARENTBLT 0x00008000 -#define HOOK_ALPHABLEND 0x00010000 -#define HOOK_GRADIENTFILL 0x00020000 -#define HOOK_FLAGS 0x0003b5ff - -/* DRVFN.iFunc constants */ -#define INDEX_DrvEnablePDEV 0L -#define INDEX_DrvCompletePDEV 1L -#define INDEX_DrvDisablePDEV 2L -#define INDEX_DrvEnableSurface 3L -#define INDEX_DrvDisableSurface 4L -#define INDEX_DrvAssertMode 5L -#define INDEX_DrvOffset 6L -#define INDEX_DrvResetPDEV 7L -#define INDEX_DrvDisableDriver 8L -#define INDEX_DrvCreateDeviceBitmap 10L -#define INDEX_DrvDeleteDeviceBitmap 11L -#define INDEX_DrvRealizeBrush 12L -#define INDEX_DrvDitherColor 13L -#define INDEX_DrvStrokePath 14L -#define INDEX_DrvFillPath 15L -#define INDEX_DrvStrokeAndFillPath 16L -#define INDEX_DrvPaint 17L -#define INDEX_DrvBitBlt 18L -#define INDEX_DrvCopyBits 19L -#define INDEX_DrvStretchBlt 20L -#define INDEX_DrvSetPalette 22L -#define INDEX_DrvTextOut 23L -#define INDEX_DrvEscape 24L -#define INDEX_DrvDrawEscape 25L -#define INDEX_DrvQueryFont 26L -#define INDEX_DrvQueryFontTree 27L -#define INDEX_DrvQueryFontData 28L -#define INDEX_DrvSetPointerShape 29L -#define INDEX_DrvMovePointer 30L -#define INDEX_DrvLineTo 31L -#define INDEX_DrvSendPage 32L -#define INDEX_DrvStartPage 33L -#define INDEX_DrvEndDoc 34L -#define INDEX_DrvStartDoc 35L -#define INDEX_DrvGetGlyphMode 37L -#define INDEX_DrvSynchronize 38L -#define INDEX_DrvSaveScreenBits 40L -#define INDEX_DrvGetModes 41L -#define INDEX_DrvFree 42L -#define INDEX_DrvDestroyFont 43L -#define INDEX_DrvQueryFontCaps 44L -#define INDEX_DrvLoadFontFile 45L -#define INDEX_DrvUnloadFontFile 46L -#define INDEX_DrvFontManagement 47L -#define INDEX_DrvQueryTrueTypeTable 48L -#define INDEX_DrvQueryTrueTypeOutline 49L -#define INDEX_DrvGetTrueTypeFile 50L -#define INDEX_DrvQueryFontFile 51L -#define INDEX_DrvMovePanning 52L -#define INDEX_DrvQueryAdvanceWidths 53L -#define INDEX_DrvSetPixelFormat 54L -#define INDEX_DrvDescribePixelFormat 55L -#define INDEX_DrvSwapBuffers 56L -#define INDEX_DrvStartBanding 57L -#define INDEX_DrvNextBand 58L -#define INDEX_DrvGetDirectDrawInfo 59L -#define INDEX_DrvEnableDirectDraw 60L -#define INDEX_DrvDisableDirectDraw 61L -#define INDEX_DrvQuerySpoolType 62L -#define INDEX_DrvIcmCreateColorTransform 64L -#define INDEX_DrvIcmDeleteColorTransform 65L -#define INDEX_DrvIcmCheckBitmapBits 66L -#define INDEX_DrvIcmSetDeviceGammaRamp 67L -#define INDEX_DrvGradientFill 68L -#define INDEX_DrvStretchBltROP 69L -#define INDEX_DrvPlgBlt 70L -#define INDEX_DrvAlphaBlend 71L -#define INDEX_DrvSynthesizeFont 72L -#define INDEX_DrvGetSynthesizedFontFiles 73L -#define INDEX_DrvTransparentBlt 74L -#define INDEX_DrvQueryPerBandInfo 75L -#define INDEX_DrvQueryDeviceSupport 76L -#define INDEX_DrvReserved1 77L -#define INDEX_DrvReserved2 78L -#define INDEX_DrvReserved3 79L -#define INDEX_DrvReserved4 80L -#define INDEX_DrvReserved5 81L -#define INDEX_DrvReserved6 82L -#define INDEX_DrvReserved7 83L -#define INDEX_DrvReserved8 84L -#define INDEX_DrvDeriveSurface 85L -#define INDEX_DrvQueryGlyphAttrs 86L -#define INDEX_DrvNotify 87L -#define INDEX_DrvSynchronizeSurface 88L -#define INDEX_DrvResetDevice 89L -#define INDEX_DrvReserved9 90L -#define INDEX_DrvReserved10 91L -#define INDEX_DrvReserved11 92L -#define INDEX_LAST 93L - -/* EngCreatePalette mode types */ -#define PAL_INDEXED 0x00000001 -#define PAL_BITFIELDS 0x00000002 -#define PAL_RGB 0x00000004 -#define PAL_BGR 0x00000008 - -enum _QUERY_ADVANCE_WIDTH_TYPES -{ - QAW_GETWIDTHS = 1, - QAW_GETEASYWIDTHS -}; - -#define QC_OUTLINES 0x00000001 -#define QC_1BIT 0x00000002 -#define QC_4BIT 0x00000004 - -enum _QFF_MODES -{ - QFF_DESCRIPTION = 1, - QFF_NUMFACES -}; - -#define RB_DITHERCOLOR 0x80000000 - -enum _SPS_RC -{ - SPS_ERROR, - SPS_DECLINE, - SPS_ACCEPT_NOEXCLUDE, - SPS_ACCEPT_EXCLUDE -}; - -#define SPS_CHANGE 0x00000001L -#define SPS_ASYNCCHANGE 0x00000002L -#define SPS_ANIMATESTART 0x00000004L -#define SPS_ANIMATEUPDATE 0x00000008L - -#define SS_SAVE 0 -#define SS_RESTORE 1 -#define SS_FREE 2 - -enum _SURF_TYPES -{ - STYPE_BITMAP = 0, - STYPE_DEVICE = 1, - STYPE_DEVBITMAP = 3 -}; - -#define WO_RGN_CLIENT_DELTA 0x00000001 -#define WO_RGN_CLIENT 0x00000002 -#define WO_RGN_SURFACE_DELTA 0x00000004 -#define WO_RGN_SURFACE 0x00000008 -#define WO_RGN_UPDATE_ALL 0x00000010 - -#define WOC_RGN_CLIENT_DELTA 0x00000001 -#define WOC_RGN_CLIENT 0x00000002 -#define WOC_RGN_SURFACE_DELTA 0x00000004 -#define WOC_RGN_SURFACE 0x00000008 -#define WOC_CHANGED 0x00000010 -#define WOC_DELETE 0x00000020 - -typedef HANDLE HDEV; -typedef HANDLE HGLYPH; -typedef HANDLE HSURF; -typedef HANDLE DHPDEV; -typedef HANDLE DHSURF; -typedef ULONG (*PFN)(VOID); -typedef ULONG IDENT; - -typedef struct _DRVFN -{ - ULONG iFunc; - PFN pfn; -} DRVFN, *PDRVFN; - -/* - * DRVENABLEDATA - this structure is passed to the DDI from the GDI - * in the function DrvEnableDriver to determine driver parameters. - */ - -typedef struct _DRVENABLEDATA -{ - ULONG iDriverVersion; - ULONG c; - DRVFN *pdrvfn; -} DRVENABLEDATA, *PDRVENABLEDATA; - -typedef LONG LDECI4; - -typedef struct _CIECHROMA -{ - LDECI4 x; - LDECI4 y; - LDECI4 Y; -} CIECHROMA, *PCIECHROMA; - -typedef struct _COLORINFO -{ - CIECHROMA Red; - CIECHROMA Green; - CIECHROMA Blue; - CIECHROMA Cyan; - CIECHROMA Magenta; - CIECHROMA Yellow; - CIECHROMA AlignmentWhite; - LDECI4 RedGamma; - LDECI4 GreenGamma; - LDECI4 BlueGamma; - LDECI4 MagentaInCyanDye; - LDECI4 YellowInCyanDye; - LDECI4 CyanInMagentaDye; - LDECI4 YellowInMagentaDye; - LDECI4 CyanInYellowDye; - LDECI4 MagentaInYellowDye; -} COLORINFO, *PCOLORINFO; - -typedef struct _DEVINFO -{ - ULONG flGraphicsCaps; - LOGFONTW lfDefaultFont; - LOGFONTW lfAnsiVarFont; - LOGFONTW lfAnsiFixFont; - ULONG cFonts; - ULONG iDitherFormat; - USHORT cxDither; - USHORT cyDither; - HPALETTE hpalDefault; - ULONG flGraphicsCaps2; -} DEVINFO, *PDEVINFO; - -typedef struct _GDIINFO -{ - ULONG ulVersion; - ULONG ulTechnology; - ULONG ulHorzSize; - ULONG ulVertSize; - ULONG ulHorzRes; - ULONG ulVertRes; - ULONG cBitsPixel; - ULONG cPlanes; - ULONG ulNumColors; - ULONG flRaster; - ULONG ulLogPixelsX; - ULONG ulLogPixelsY; - ULONG flTextCaps; - ULONG ulDACRed; - ULONG ulDACGreen; - ULONG ulDACBlue; - ULONG ulAspectX; - ULONG ulAspectY; - ULONG ulAspectXY; - LONG xStyleStep; - LONG yStyleStep; - LONG denStyleStep; - POINTL ptlPhysOffset; - SIZEL szlPhysSize; - ULONG ulNumPalReg; - COLORINFO ciDevice; - ULONG ulDevicePelsDPI; - ULONG ulPrimaryOrder; - ULONG ulHTPatternSize; - ULONG ulHTOutputFormat; - ULONG flHTFlags; - ULONG ulVRefresh; - ULONG ulBltAlignment; - ULONG ulPanningHorzRes; - ULONG ulPanningVertRes; - ULONG xPanningAlignment; - ULONG yPanningAlignment; - ULONG cxHTPat; - ULONG cyHTPat; - LPBYTE pHTPatA; - LPBYTE pHTPatB; - LPBYTE pHTPatC; - ULONG flShadeBlend; - ULONG ulPhysicalPixelCharacteristics; - ULONG ulPhysicalPixelGamma; -} GDIINFO, *PGDIINFO; - -typedef struct _BRUSHOBJ -{ - ULONG iSolidColor; - PVOID pvRbrush; - FLONG flColorType; - /* remainder of fields are for GDI internal use */ - LOGBRUSH logbrush; -} BRUSHOBJ, *PBRUSHOBJ; - -typedef struct _CLIPOBJ -{ - ULONG iUniq; - RECTL rclBounds; - BYTE iDComplexity; - BYTE iFComplexity; - BYTE iMode; - BYTE fjOptions; -} CLIPOBJ, *PCLIPOBJ; - -typedef struct _ENUMRECTS -{ - ULONG c; - RECTL arcl[1]; -} ENUMRECTS, *PENUMRECTS; - -typedef struct _BLENDOBJ -{ - BLENDFUNCTION BlendFunction; -}BLENDOBJ,*PBLENDOBJ; - -typedef struct -{ - DWORD nSize; - HDC hdc; - PBYTE pvEMF; - PBYTE pvCurrentRecord; -} EMFINFO, *PEMFINFO; - -typedef struct _FONTOBJ -{ - ULONG iUniq; - ULONG iFace; - ULONG cxMax; - ULONG flFontType; - ULONG iTTUniq; - ULONG iFile; - SIZE sizLogResPpi; - ULONG ulStyleSize; - PVOID pvConsumer; - PVOID pvProducer; -} FONTOBJ, *PFONTOBJ; - -typedef struct _IFIMETRICS -{ - ULONG cjThis; - ULONG ulVersion; - PTRDIFF dpwszFamilyName; - PTRDIFF dpwszStyleName; - PTRDIFF dpwszFaceName; - PTRDIFF dpwszUniqueName; - PTRDIFF dpFontSim; - LONG lEmbedId; - LONG lItalicAngle; - LONG lCharBias; - PTRDIFF dpCharSets; - BYTE jWinCharSet; - BYTE jWinPitchAndFamily; - USHORT usWinWeight; - ULONG flInfo; - USHORT fsSelection; - USHORT fsType; - WORD fwdUnitsPerEm; - WORD fwdLowestPPEm; - WORD fwdWinAscender; - WORD fwdWinDescender; - WORD fwdMacAscender; - WORD fwdMacDescender; - WORD fwdMacLineGap; - WORD fwdTypoAscender; - WORD fwdTypoDescender; - WORD fwdTypoLineGap; - WORD fwdAveCharWidth; - WORD fwdMaxCharInc; - WORD fwdCapHeight; - WORD fwdXHeight; - WORD fwdSubScriptXSize; - WORD fwdSubScriptYSize; - WORD fwdSubScriptXOffset; - WORD fwdSubScriptYOffset; - WORD fwdSuperScriptXSize; - WORD fwdSuperScriptYSize; - WORD fwdSuperScriptXOffset; - WORD fwdSuperScriptYOffset; - WORD fwdUnderscoreSize; - WORD fwdUnderscorePosition; - WORD fwdStrikeoutSize; - WORD fwdStrikeoutPosition; - BYTE chFirstChar; - BYTE chLastChar; - BYTE chDefaultChar; - BYTE chBreakChar; - WCHAR wcFirstChar; - WCHAR wcLastChar; - WCHAR wcDefaultChar; - WCHAR wcBreakChar; - POINTL ptlBaseline; - POINTL ptlAspect; - POINTL ptlCaret; - RECTL rclFontBox; - BYTE achVendId[4]; - ULONG cKerningPairs; - ULONG ulPanoseCulture; - PANOSE panose; -} IFIMETRICS, *PIFIMETRICS; - -#define NB_RESERVED_COLORS 20 /* number of fixed colors in system palette */ - -typedef struct _XLATEOBJ -{ - ULONG iUniq; - ULONG flXlate; - USHORT iSrcType; - USHORT iDstType; - ULONG cEntries; - ULONG *pulXlate; -} XLATEOBJ, *PXLATEOBJ; - -typedef struct _PALOBJ -{ - ULONG ulReserved; - PXLATEOBJ logicalToSystem; - int *mapping; -} PALOBJ, *PPALOBJ; - -typedef struct _PATHOBJ -{ - ULONG fl; - ULONG cCurves; -} PATHOBJ, *PPATHOBJ; - -typedef struct _SURFOBJ -{ - DHSURF dhsurf; - HSURF hsurf; - DHPDEV dhpdev; - HDEV hdev; - SIZEL sizlBitmap; - ULONG cjBits; - PVOID pvBits; - PVOID pvScan0; - LONG lDelta; - ULONG iUniq; - ULONG iBitmapFormat; - USHORT iType; - USHORT fjBitmap; -} SURFOBJ, *PSURFOBJ; - -typedef struct _WNDOBJ -{ - CLIPOBJ coClient; - PVOID pvConsumer; - RECTL rclClient; -} WNDOBJ, *PWNDOBJ; - -typedef VOID (CALLBACK * WNDOBJCHANGEPROC)(PWNDOBJ WndObj, ULONG Flags); - -typedef struct _XFORMOBJ -{ - ULONG ulReserved; -} XFORMOBJ, *PXFORMOBJ; - -typedef struct _GLYPHBITS -{ - POINTL ptlOrigin; - SIZEL sizlBitmap; - BYTE aj[1]; -} GLYPHBITS; - -typedef union _GLYPHDEF -{ - GLYPHBITS *pgb; - PATHOBJ *ppo; -} GLYPHDEF; - -typedef struct _POINTQF -{ - LARGE_INTEGER x; - LARGE_INTEGER y; -} POINTQF, *PPOINTQF; - -typedef struct _GLYPHDATA { - GLYPHDEF gdf; - HGLYPH hg; - FIX fxD; - FIX fxA; - FIX fxAB; - FIX fxInkTop; - FIX fxInkBottom; - RECTL rclInk; - POINTQF ptqD; -} GLYPHDATA, *PGLYPHDATA; - -typedef struct _GLYPHPOS -{ - HGLYPH hg; - GLYPHDEF *pgdf; - POINTL *ptl; -} GLYPHPOS, *PGLYPHPOS; - -typedef struct _STROBJ -{ - ULONG cGlyphs; - FLONG flAccel; - ULONG ulCharInc; - RECTL rclBkGround; - GLYPHPOS *pgp; - LPWSTR pwszOrg; -} STROBJ, *PSTROBJ; - -typedef struct _WCRUN -{ - WCHAR wcLow; - USHORT cGlyphs; - HGLYPH *phg; -} WCRUN, *PWCRUN; - -typedef struct _FD_GLYPHSET -{ - ULONG cjThis; - FLONG flAccel; - ULONG cGlyphsSupported; - ULONG cRuns; - WCRUN awcrun[1]; -} FD_GLYPHSET, *PFD_GLYPHSET; - -struct _DRIVEROBJ; - -typedef BOOL (CALLBACK * FREEOBJPROC) (struct _DRIVEROBJ* pDriverObj); - -typedef struct _DRIVEROBJ -{ - PVOID pvObj; - FREEOBJPROC pFreeProc; - HDEV hdev; - DHPDEV dhpdev; -} DRIVEROBJ; - -typedef struct _TYPE1_FONT -{ - HANDLE hPFM; - HANDLE hPFB; - ULONG ulIdentifier; -} TYPE1_FONT; - -typedef struct _ENG_TIME_FIELDS -{ - USHORT usYear; - USHORT usMonth; - USHORT usDay; - USHORT usHour; - USHORT usMinute; - USHORT usSecond; - USHORT usMilliseconds; - USHORT usWeekday; -} ENG_TIME_FIELDS, *PENG_TIME_FIELDS; - -typedef enum _ENG_SYSTEM_ATTRIBUTE { - EngProcessorFeature = 1, - EngNumberOfProcessors, - EngOptimumAvailableUserMemory, - EngOptimumAvailableSystemMemory, -} ENG_SYSTEM_ATTRIBUTE; - -typedef struct _LINEATTRS -{ - FLONG fl; - ULONG iJoin; - ULONG iEndCap; - FLOAT_LONG elWidth; - FLOATL eMiterLimit; - ULONG cstyle; - PFLOAT_LONG pstyle; - FLOAT_LONG elStyleState; -} LINEATTRS, *PLINEATTRS; - -typedef struct _FLOATOBJ -{ - ULONG ul1, - ul2; -} FLOATOBJ, *PFLOATOBJ; - -typedef struct _POINTFIX -{ - FIX x, - y; -} POINTFIX; - -typedef struct _PATHDATA -{ - FLONG flags; - ULONG count; - POINTFIX *pptfx; -} PATHDATA, *PPATHDATA; - -typedef struct _RUN -{ - LONG iStart; - LONG iStop; -} RUN, *PRUN; - -typedef struct _CLIPLINE -{ - POINTFIX ptfxA; - POINTFIX ptfxB; - LONG lStyleState; - ULONG c; - RUN arun[1]; -} CLIPLINE, *PCLIPLINE; - -typedef struct _RECTFX -{ - FIX xLeft, - yTop, - xRight, - yBottom; -} RECTFX, *PRECTFX; - -typedef struct -{ - FLOATOBJ eM11, - eM12, - eM21, - eM22, - eDx, - eDy; -} FLOATOBJ_XFORM, *PFLOATOBJ_XFORM, FAR *LPFLOATOBJ_XFORM; - -typedef struct _XFORML -{ - FLOATL eM11, - eM12, - eM21, - eM22, - eDx, - eDy; -} XFORML, *PXFORML; - -/* - * Functions Prefixed with Drv are calls made from GDI to DDI, and - * everything else are calls made from DDI to GDI. DDI is - * not allowed to make calls to any other kernel or user modules. - */ - -/* GDI --> DDI calls */ -BOOL STDCALL -DrvAssertMode(IN DHPDEV PDev, - IN BOOL ShouldEnable); - -BOOL STDCALL -DrvBitBlt(IN PSURFOBJ DestSurface, - IN PSURFOBJ SrcSurface, - IN PSURFOBJ MaskSurface, - IN PCLIPOBJ ClipObj, - IN PXLATEOBJ XLateObj, - IN PRECTL DestRectL, - IN PPOINTL SrcPointL, - IN PPOINTL MaskPointL, - IN PBRUSHOBJ BrushObj, - IN PPOINTL BrushPointL, - IN ROP4 RasterOp); -VOID STDCALL -DrvCompletePDEV(IN DHPDEV PDev, - IN HDEV Dev); -BOOL STDCALL -DrvCopyBits(OUT PSURFOBJ DestSurface, - IN PSURFOBJ SrcSurface, - IN PCLIPOBJ ClipObj, - IN PXLATEOBJ XLateObj, - IN PRECTL DestRectL, - IN PPOINTL SrcPointL); -HBITMAP STDCALL -DrvCreateDeviceBitmap(IN DHPDEV DPev, - IN SIZEL SizeL, - IN ULONG Format); -VOID STDCALL -DrvDeleteDeviceBitmap(IN DHSURF Surface); -LONG STDCALL -DrvDescribePixelFormat(IN DHPDEV DPev, - IN LONG PixelFormat, - IN ULONG DescriptorSize, - OUT PPIXELFORMATDESCRIPTOR PFD); -VOID STDCALL -DrvDestroyFont(IN PFONTOBJ FontObj); -VOID STDCALL -DrvDisableDirectDraw(IN DHPDEV PDev); -VOID STDCALL -DrvDisableDriver(VOID); -VOID STDCALL -DrvDisablePDEV(IN DHPDEV PDev); -VOID STDCALL -DrvDisableSurface(IN DHPDEV PDev); -ULONG STDCALL -DrvDitherColor(IN DHPDEV DPev, - IN ULONG Mode, - IN ULONG RGB, - OUT PULONG DitherBits); -ULONG STDCALL -DrvDrawEscape(IN PSURFOBJ SurfObj, - IN ULONG EscCode, - IN PCLIPOBJ ClipObj, - IN PRECTL RectL, - IN ULONG InputSize, - IN PVOID *InputData); -BOOL STDCALL -DrvEnableDirectDraw(IN DHPDEV PDev, - IN PDD_CALLBACKS Callbacks, - IN PDD_SURFACECALLBACKS SurfaceCallbacks, - IN PDD_PALETTECALLBACKS PaletteCallbacks); -BOOL STDCALL -DrvEnableDriver(IN ULONG Version, - IN ULONG DEDSize, - OUT PDRVENABLEDATA DED); -DHPDEV STDCALL -DrvEnablePDEV(IN DEVMODEW *DM, - IN LPWSTR LogAddress, - IN ULONG PatternCount, - OUT HSURF *SurfPatterns, - IN ULONG GDIInfoSize, - OUT ULONG *GDIInfo, - IN ULONG DevInfoSize, - OUT DEVINFO *DevInfo, - IN HDEV Dev, - IN LPWSTR DeviceName, - IN HANDLE Driver); -HSURF STDCALL -DrvEnableSurface(IN DHPDEV PDev); -BOOL STDCALL -DrvEndDoc(IN PSURFOBJ SurfObj, - IN ULONG Flags); -ULONG STDCALL -DrvEscape(IN PSURFOBJ SurfObj, - IN ULONG EscCode, - IN ULONG InputSize, - IN PVOID *InputData, - IN ULONG OutputSize, - OUT PVOID *OutputData); -BOOL STDCALL -DrvFillPath(IN PSURFOBJ SurfObj, - IN PPATHOBJ PathObj, - IN PCLIPOBJ ClipObj, - IN PBRUSHOBJ BrushObj, - IN PPOINTL BrushOrg, - IN MIX Mix, - IN ULONG Options); -ULONG STDCALL -DrvFontManagement(IN PSURFOBJ SurfObj, - IN PFONTOBJ FontObj, - IN ULONG Mode, - IN ULONG InputSize, - IN PVOID InputData, - IN ULONG OutputSize, - OUT PVOID OutputData); -VOID STDCALL -DrvFree(IN PVOID Obj, - IN ULONG ID); -BOOL STDCALL -DrvGetDirectDrawInfo(IN DHPDEV PDev, - IN PDD_HALINFO HalInfo, - IN PDWORD NumHeaps, - IN PVIDEOMEMORY List, - IN PDWORD NumFourCCCodes, - IN PDWORD FourCC); -ULONG STDCALL -DrvGetGlyphMode(IN DHPDEV DPev, - IN PFONTOBJ FontObj); -ULONG STDCALL -DrvGetModes(IN HANDLE Driver, - IN ULONG DataSize, - OUT PDEVMODEW DM); -PVOID STDCALL -DrvGetTrueTypeFile(IN ULONG FileNumber, - IN PULONG Size); -BOOL STDCALL -DrvGradientFill(IN SURFOBJ *psoDest, - IN CLIPOBJ *pco, - IN XLATEOBJ *pxlo, - IN TRIVERTEX *pVertex, - IN ULONG nVertex, - IN PVOID pMesh, - IN ULONG nMesh, - IN RECTL *prclExtents, - IN POINTL *pptlDitherOrg, - IN ULONG ulMode); -BOOL STDCALL -DrvLineTo(IN PSURFOBJ SurfObj, - IN PCLIPOBJ ClipObj, - IN PBRUSHOBJ BrushObj, - IN LONG x1, - IN LONG y1, - IN LONG x2, - IN LONG y2, - IN PRECTL Bounds, - IN MIX Mix); -ULONG STDCALL -DrvLoadFontFile(IN ULONG FileNumber, - IN PVOID ViewData, - IN ULONG ViewSize, - IN ULONG LangID); -VOID STDCALL -DrvMovePointer(IN PSURFOBJ SurfObj, - IN LONG x, - IN LONG y, - IN PRECTL RectL); -BOOL STDCALL -DrvNextBand(IN PSURFOBJ SurfObj, - OUT PPOINTL PointL); -BOOL STDCALL -DrvPaint(IN PSURFOBJ SurfObj, - IN PCLIPOBJ ClipObj, - IN PBRUSHOBJ BrushObj, - IN PPOINTL BrushOrg, - IN MIX Mix); -BOOL STDCALL -DrvQueryAdvanceWidths(IN DHPDEV DPev, - IN PFONTOBJ FontObj, - IN ULONG Mode, - IN HGLYPH Glyph, - OUT PVOID *Widths, - IN ULONG NumGlyphs); -PIFIMETRICS STDCALL -DrvQueryFont(IN DHPDEV PDev, - IN ULONG FileNumber, - IN ULONG FaceIndex, - IN PULONG Identifier); -LONG STDCALL -DrvQueryFontCaps(IN ULONG CapsSize, - OUT PULONG CapsData); -LONG STDCALL -DrvQueryFontData(IN DHPDEV DPev, - IN PFONTOBJ FontObj, - IN ULONG Mode, - IN HGLYPH Glyph, - IN PGLYPHDATA GlyphData, - IN PVOID DataBuffer, - IN ULONG BufferSize); -LONG STDCALL -DrvQueryFontFile(IN ULONG FileNumber, - IN ULONG Mode, - IN ULONG BufSize, - OUT PULONG Buf); -PVOID STDCALL -DrvQueryFontTree(IN DHPDEV PDev, - IN ULONG FileNumber, - IN ULONG FaceIndex, - IN ULONG Mode, - OUT ULONG *ID); -BOOL STDCALL -DrvQuerySpoolType(DHPDEV PDev, - LPWSTR SpoolType); -LONG STDCALL -DrvQueryTrueTypeOutline(IN DHPDEV PDev, - IN PFONTOBJ FontObj, - IN HGLYPH Glyph, - IN BOOL MetricsOnly, - IN PGLYPHDATA GlyphData, - IN ULONG BufSize, - OUT PTTPOLYGONHEADER Polygons); -LONG STDCALL -DrvQueryTrueTypeTable(IN ULONG FileNumber, - IN ULONG Font, - IN ULONG Tag, - IN PTRDIFF Start, - IN ULONG BufSize, - OUT BYTE *Buf); -BOOL STDCALL -DrvRealizeBrush(IN PBRUSHOBJ BrushObj, - IN PSURFOBJ TargetSurface, - IN PSURFOBJ PatternSurface, - IN PSURFOBJ MaskSurface, - IN PXLATEOBJ XLateObj, - IN ULONG iHatch); -BOOL STDCALL -DrvResetPDEV(IN DHPDEV PDevOld, - IN DHPDEV PDevNew); -ULONG STDCALL -DrvSaveScreenBits(IN PSURFOBJ SurfObj, - IN ULONG Mode, - IN ULONG ID, - IN PRECTL RectL); -BOOL STDCALL -DrvSendPage(IN PSURFOBJ SurfObj); -BOOL STDCALL -DrvSetPalette(IN DHPDEV PDev, - IN PPALOBJ PaletteObj, - IN ULONG Flags, - IN ULONG Start, - IN ULONG NumColors); -ULONG STDCALL -DrvSetPointerShape(IN PSURFOBJ SurfObj, - IN PSURFOBJ MaskSurface, - IN PSURFOBJ ColorSurface, - IN PXLATEOBJ XLateObj, - IN LONG xHot, - IN LONG yHot, - IN LONG x, - IN LONG y, - IN PRECTL RectL, - IN ULONG Flags); -BOOL STDCALL -DrvStartBanding(IN PSURFOBJ SurfObj, - IN PPOINTL PointL); -BOOL STDCALL -DrvStartDoc(IN PSURFOBJ SurfObj, - IN LPWSTR DocName, - IN DWORD JobID); -BOOL STDCALL -DrvStartPage(IN PSURFOBJ SurfObj); -BOOL STDCALL -DrvStretchBlt(IN PSURFOBJ DestSurface, - IN PSURFOBJ SrcSurface, - IN PSURFOBJ MaskSurface, - IN PCLIPOBJ ClipObj, - IN PXLATEOBJ XLateObj, - IN PCOLORADJUSTMENT CA, - IN PPOINTL HTOrg, - IN PRECTL Dest, - IN PRECTL Src, - IN PPOINTL Mask, - IN ULONG Mode); -BOOL STDCALL -DrvStrokeAndFillPath(IN PSURFOBJ SurfObj, - IN PPATHOBJ PathObj, - IN PCLIPOBJ ClipObj, - IN PXFORMOBJ XFormObj, - IN PBRUSHOBJ StrokeBrush, - IN PLINEATTRS LineAttrs, - IN PBRUSHOBJ FillBrush, - IN PPOINTL BrushOrg, - IN MIX MixFill, - IN ULONG Options); -BOOL STDCALL -DrvStrokePath(IN PSURFOBJ SurfObj, - IN PPATHOBJ PathObj, - IN PCLIPOBJ PClipObj, - IN PXFORMOBJ XFormObj, - IN PBRUSHOBJ BrushObj, - IN PPOINTL BrushOrg, - IN PLINEATTRS LineAttrs, - IN MIX Mix); -VOID STDCALL -DrvSynchronize(IN DHPDEV PDev, - IN PRECTL RectL); -BOOL STDCALL -DrvTextOut(IN PSURFOBJ SurfObj, - IN PSTROBJ StrObj, - IN PFONTOBJ FontObj, - IN PCLIPOBJ ClipObj, - IN PRECTL ExtraRect, - IN PRECTL OpaqueRect, - IN PBRUSHOBJ ForegroundBrush, - IN PBRUSHOBJ OpaqueBrush, - IN PPOINTL OrgPoint, - IN MIX Mix); -BOOL STDCALL -DrvTransparentBlt(PSURFOBJ Dest, - PSURFOBJ Source, - PCLIPOBJ Clip, - PXLATEOBJ ColorTranslation, - PRECTL DestRect, - PRECTL SourceRect, - ULONG TransparentColor, - ULONG Reserved); -BOOL STDCALL -DrvUnloadFontFile(IN ULONG FileNumber); - -/* DDI --> GDI calls */ -PVOID STDCALL -BRUSHOBJ_pvAllocRbrush(IN PBRUSHOBJ BrushObj, - IN ULONG ObjSize); -PVOID STDCALL -BRUSHOBJ_pvGetRbrush(IN PBRUSHOBJ BrushObj); - -BOOL STDCALL -CLIPOBJ_bEnum(IN PCLIPOBJ ClipObj, - IN ULONG ObjSize, - OUT ULONG *EnumRects); - -ULONG STDCALL -CLIPOBJ_cEnumStart(IN PCLIPOBJ ClipObj, - IN BOOL ShouldDoAll, - IN ULONG ClipType, - IN ULONG BuildOrder, - IN ULONG MaxRects); - -PPATHOBJ STDCALL -CLIPOBJ_ppoGetPath(PCLIPOBJ ClipObj); - -#define FL_ZERO_MEMORY 1 -#define FL_NONPAGED_MEMORY 2 - -PVOID STDCALL -EngAllocMem(ULONG Flags, - ULONG MemSize, - ULONG Tag); - -PVOID STDCALL -EngAllocUserMem(ULONG cj, - ULONG tag); - -BOOL STDCALL -EngAssociateSurface(IN HSURF Surface, - IN HDEV Dev, - IN ULONG Hooks); - -BOOL STDCALL -EngBitBlt(SURFOBJ *Dest, - SURFOBJ *Source, - SURFOBJ *Mask, - CLIPOBJ *ClipRegion, - XLATEOBJ *ColorTranslation, - RECTL *DestRect, - POINTL *SourcePoint, - POINTL *MaskRect, - BRUSHOBJ *Brush, - POINTL *BrushOrigin, - ROP4 rop4); - -/* -EngComputeGlyphSet -*/ - -BOOL STDCALL -EngCopyBits(SURFOBJ *Dest, - SURFOBJ *Source, - CLIPOBJ *Clip, - XLATEOBJ *ColorTranslation, - RECTL *DestRect, - POINTL *SourcePoint); - -HBITMAP STDCALL -EngCreateBitmap(IN SIZEL Size, - IN LONG Width, - IN ULONG Format, - IN ULONG Flags, - IN PVOID Bits); - -PCLIPOBJ STDCALL -EngCreateClip(VOID); - -HBITMAP STDCALL -EngCreateDeviceBitmap(IN DHSURF Surface, - IN SIZEL Size, - IN ULONG Format); - -HSURF STDCALL -EngCreateDeviceSurface(IN DHSURF Surface, - IN SIZEL Size, - IN ULONG FormatVersion); - -/* -EngCreateDriverObj -EngCreateEvent -*/ - -HPALETTE STDCALL -EngCreatePalette(IN ULONG Mode, - IN ULONG NumColors, - IN ULONG *Colors, - IN ULONG Red, - IN ULONG Green, - IN ULONG Blue); - -HSEMAPHORE -STDCALL -EngCreateSemaphore ( VOID ); - -VOID -STDCALL -EngAcquireSemaphore ( IN HSEMAPHORE hsem ); - -VOID -STDCALL -EngReleaseSemaphore ( IN HSEMAPHORE hsem ); - -VOID -STDCALL -EngDeleteSemaphore ( IN HSEMAPHORE hsem ); - -BOOL -STDCALL -EngIsSemaphoreOwned ( IN HSEMAPHORE hsem ); - -BOOL -STDCALL -EngIsSemaphoreOwnedByCurrentThread ( IN HSEMAPHORE hsem ); - -/* -EngCreatePath -EngCreateSemaphore -EngCreateWnd -*/ - -VOID STDCALL -EngDebugBreak(VOID); - -VOID STDCALL -EngDebugPrint(PCHAR StandardPrefix, - PCHAR DebugMessage, - va_list ArgList); - -VOID STDCALL -EngDeleteClip(CLIPOBJ *ClipRegion); - -/* -EngDeleteDriverObj -EngDeleteEvent -*/ - -BOOL STDCALL -EngDeletePalette(IN HPALETTE Palette); - -BOOL STDCALL -EngDeleteSurface(IN HSURF Surface); - -/* -EngDeleteWnd -*/ - -DWORD STDCALL -EngDeviceIoControl(HANDLE hDevice, - DWORD dwIoControlCode, - LPVOID lpInBuffer, - DWORD nInBufferSize, - LPVOID lpOutBuffer, - DWORD nOutBufferSize, - DWORD *lpBytesReturned); - -/* -EngEnumForms -*/ - -BOOL STDCALL -EngEraseSurface(SURFOBJ *Surface, - RECTL *Rect, - ULONG iColor); - -/* -EngFindImageProcAddress -EngFindResource -*/ - -VOID STDCALL -EngFreeMem(PVOID Mem); - -/* -EngFreeModule -*/ - -VOID STDCALL -EngFreeUserMem(PVOID pv); - -VOID STDCALL -EngGetCurrentCodePage(OUT PUSHORT OemCodePage, - OUT PUSHORT AnsiCodePage); - -/* -EngGetFileChangeTime -EngGetFilePath -EngGetForm -EngGetLastError -EngGetPrinter -EngGetPrinterData -EngGetProcessHandle -EngGetType1FontList -*/ - -BOOL STDCALL -EngLineTo(SURFOBJ *Surface, - CLIPOBJ *Clip, - BRUSHOBJ *Brush, - LONG x1, - LONG y1, - LONG x2, - LONG y2, - RECTL *RectBounds, - MIX mix); - -HANDLE STDCALL -EngLoadImage(LPWSTR DriverName); - -/* -EngLoadModuleForWrite -EngLockDriverObj -*/ - -SURFOBJ * STDCALL -EngLockSurface(IN HSURF Surface); - -/* -EngMapEvent -EngMapFontFile -EngMapModule -EngMovePointer -*/ - -INT STDCALL -EngMulDiv(IN INT nMultiplicand, - IN INT nMultiplier, - IN INT nDivisor); - -VOID STDCALL -EngMultiByteToUnicodeN(OUT LPWSTR UnicodeString, - IN ULONG MaxBytesInUnicodeString, - OUT PULONG BytesInUnicodeString, - IN PCHAR MultiByteString, - IN ULONG BytesInMultiByteString); - -BOOL STDCALL -EngPaint(IN SURFOBJ *Surface, - IN CLIPOBJ *ClipRegion, - IN BRUSHOBJ *Brush, - IN POINTL *BrushOrigin, - IN MIX Mix); - -/* -EngProbeForRead -EngProbeForReadAndWrite = NTOSKRNL.ProbeForWrite -EngQueryLocalTime -EngQueryPalette -EngQueryPerformanceCounter -EngQueryPerformanceFrequency -EngRestoreFloatingPointState -EngSaveFloatingPointState -EngSecureMem -EngSetEvent -EngSetLastError -EngSetPointerTag -EngSetPrinterData -*/ - -ULONG -STDCALL -EngSetPointerShape( - IN SURFOBJ *pso, - IN SURFOBJ *psoMask, - IN SURFOBJ *psoColor, - IN XLATEOBJ *pxlo, - IN LONG xHot, - IN LONG yHot, - IN LONG x, - IN LONG y, - IN RECTL *prcl, - IN FLONG fl - ); - -VOID -STDCALL -EngMovePointer( - IN SURFOBJ *pso, - IN LONG x, - IN LONG y, - IN RECTL *prcl - ); - -typedef int CDECL (*SORTCOMP)(const void *Elem1, const void *Elem2); - -void STDCALL -EngSort(IN OUT PBYTE Buf, IN ULONG ElemSize, IN ULONG ElemCount, IN SORTCOMP CompFunc); - -/* -EngStrokeAndFillPath -EngStrokePath -EngTextOut -*/ - -BOOL STDCALL -EngTransparentBlt(IN PSURFOBJ Dest, - IN PSURFOBJ Source, - IN PCLIPOBJ Clip, - IN PXLATEOBJ ColorTranslation, - IN PRECTL DestRect, - IN PRECTL SourceRect, - IN ULONG TransparentColor, - IN ULONG Reserved); - -VOID STDCALL -EngUnicodeToMultiByteN(OUT PCHAR MultiByteString, - IN ULONG MaxBytesInMultiByteString, - OUT PULONG BytesInMultiByteString, - IN PWSTR UnicodeString, - IN ULONG BytesInUnicodeString); - -/* -EngUnloadImage -EngUnlockDriverObj -EngUnmapEvent -EngUnmapFontFile -EngUnsecureMem = NTOSKRNL.MmUnsecureVirtualMemory -EngWaitForSingleObject -EngWideCharToMultiByte -EngWritePrinter -FLOATOBJ_Add -FLOATOBJ_AddFloat -FLOATOBJ_AddFloatObj -FLOATOBJ_AddLong -FLOATOBJ_Div -FLOATOBJ_DivFloat -FLOATOBJ_DivFloatObj -FLOATOBJ_DivLong -FLOATOBJ_Equal -FLOATOBJ_EqualLong -FLOATOBJ_GetFloat -FLOATOBJ_GetLong -FLOATOBJ_GreaterThan -FLOATOBJ_GreaterThanLong -FLOATOBJ_LessThan -FLOATOBJ_LessThanLong -FLOATOBJ_Mul -FLOATOBJ_MulFloat -FLOATOBJ_MulFloatObj -FLOATOBJ_MulLong -FLOATOBJ_Neg -FLOATOBJ_SetFloat -FLOATOBJ_SetLong -FLOATOBJ_Sub -FLOATOBJ_SubFloat -FLOATOBJ_SubFloatObj -FLOATOBJ_SubLong -*/ - -ULONG -STDCALL -FONTOBJ_cGetAllGlyphHandles(IN PFONTOBJ FontObj, - IN HGLYPH *Glyphs); - -ULONG -STDCALL -FONTOBJ_cGetGlyphs(IN PFONTOBJ FontObj, - IN ULONG Mode, - IN ULONG NumGlyphs, - IN HGLYPH *GlyphHandles, - IN PVOID *OutGlyphs); - -PGAMMA_TABLES -STDCALL -FONTOBJ_pGetGammaTables(IN PFONTOBJ FontObj); - -IFIMETRICS* -STDCALL -FONTOBJ_pifi(IN PFONTOBJ FontObj); - -PVOID -STDCALL -FONTOBJ_pvTrueTypeFontFile(IN PFONTOBJ FontObj, - IN ULONG *FileSize); - -XFORMOBJ* -STDCALL -FONTOBJ_pxoGetXform(IN PFONTOBJ FontObj); - -VOID -STDCALL -FONTOBJ_vGetInfo(IN PFONTOBJ FontObj, - IN ULONG InfoSize, - OUT PFONTINFO FontInfo); - -/* -HT_ComputeRGBGammaTable -HT_Get8BPPFormatPalette -*/ - -ULONG -STDCALL -PALOBJ_cGetColors(PALOBJ *PalObj, - ULONG Start, - ULONG Colors, - ULONG *PaletteEntry); - -/* -PATHOBJ_bCloseFigure -PATHOBJ_bEnumClipLines -PATHOBJ_bMoveTo -PATHOBJ_bPolyBezierTo -PATHOBJ_bPolyLineTo -PATHOBJ_vEnumStart -PATHOBJ_vEnumStartClipLines -RtlAnsiCharToUnicodeChar = NTOSKRNL.RtlAnsiCharToUnicodeChar -RtlMultiByteToUnicodeN = NTOSKRNL.RtlMultiByteToUnicodeN -RtlRaiseException = NTOSKRNL.RtlRaiseException -RtlUnicodeToMultiByteN = NTOSKRNL.RtlUnicodeToMultiByteN -RtlUnicodeToMultiByteSize = NTOSKRNL.RtlUnicodeToMultiByteSize -RtlUnwind = NTOSKRNL.RtlUnwind -RtlUpcaseUnicodeChar = NTOSKRNL.RtlUpcaseUnicodeChar -RtlUpcaseUnicodeToMultiByteN = NTOSKRNL.RtlUpcaseUnicodeToMultiByteN -STROBJ_bEnum -STROBJ_dwGetCodePage -STROBJ_vEnumStart -WNDOBJ_bEnum -WNDOBJ_cEnumStart -WNDOBJ_vSetConsumer -XFORMOBJ_bApplyXform -XFORMOBJ_iGetFloatObjXform -XFORMOBJ_iGetXform -*/ - -ULONG STDCALL -XLATEOBJ_cGetPalette(XLATEOBJ *XlateObj, - ULONG PalOutType, - ULONG cPal, - ULONG *OutPal); - -ULONG STDCALL -XLATEOBJ_iXlate(XLATEOBJ *XlateObj, - ULONG Color); - -ULONG * STDCALL -XLATEOBJ_piVector(XLATEOBJ *XlateObj); - -HANDLE STDCALL -BRUSHOBJ_hGetColorTransform(BRUSHOBJ *pbo); -ULONG STDCALL -BRUSHOBJ_ulGetBrushColor(BRUSHOBJ *pbo); -BOOL STDCALL -EngAlphaBlend(SURFOBJ *psoDest,SURFOBJ *psoSrc,CLIPOBJ *pco,XLATEOBJ *pxlo,RECTL *prclDest,RECTL *prclSrc,BLENDOBJ *pBlendObj); -BOOL STDCALL -EngCheckAbort(SURFOBJ *pso); -FD_GLYPHSET* STDCALL -EngComputeGlyphSet(INT nCodePage,INT nFirstChar,INT cChars); -HANDLE STDCALL -EngGetCurrentProcessId(VOID); -HANDLE STDCALL -EngGetCurrentThreadId(VOID); -VOID STDCALL -EngDeletePath(PATHOBJ *ppo); -BOOL STDCALL -EngFillPath(SURFOBJ *pso,PATHOBJ *ppo,CLIPOBJ *pco,BRUSHOBJ *pbo,POINTL *pptlBrushOrg,MIX mix,FLONG flOptions); -PVOID STDCALL -EngFindResource(HANDLE h,int iName,int iType,PULONG pulSize); -VOID STDCALL -EngFreeModule(HANDLE h); -LPWSTR STDCALL -EngGetDriverName(HDEV hdev); -LPWSTR STDCALL -EngGetPrinterDataFileName(HDEV hdev); -HANDLE STDCALL -EngGetProcessHandle(VOID); -BOOL STDCALL -EngGradientFill(SURFOBJ *psoDest,CLIPOBJ *pco,XLATEOBJ *pxlo,TRIVERTEX *pVertex,ULONG nVertex,PVOID pMesh,ULONG nMesh,RECTL *prclExtents,POINTL *pptlDitherOrg,ULONG ulMode); -HANDLE STDCALL -EngLoadModule(LPWSTR pwsz); -BOOL STDCALL -EngMarkBandingSurface(HSURF hsurf); -INT STDCALL -EngMultiByteToWideChar(UINT CodePage,LPWSTR WideCharString,INT BytesInWideCharString,LPSTR MultiByteString,INT BytesInMultiByteString); -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); -BOOL STDCALL -EngQueryEMFInfo(HDEV hdev,EMFINFO *pEMFInfo); -VOID STDCALL -EngQueryLocalTime(PENG_TIME_FIELDS etf); -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); -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); -BOOL STDCALL -EngStrokeAndFillPath(SURFOBJ *pso,PATHOBJ *ppo,CLIPOBJ *pco,XFORMOBJ *pxo,BRUSHOBJ *pboStroke,LINEATTRS *plineattrs,BRUSHOBJ *pboFill,POINTL *pptlBrushOrg,MIX mixFill,FLONG flOptions); -BOOL STDCALL -EngStrokePath(SURFOBJ *pso,PATHOBJ *ppo,CLIPOBJ *pco,XFORMOBJ *pxo,BRUSHOBJ *pbo,POINTL *pptlBrushOrg,LINEATTRS *plineattrs,MIX mix); -BOOL STDCALL -EngTextOut(SURFOBJ *pso,STROBJ *pstro,FONTOBJ *pfo,CLIPOBJ *pco,RECTL *prclExtra,RECTL *prclOpaque,BRUSHOBJ *pboFore,BRUSHOBJ *pboOpaque,POINTL *pptlOrg,MIX mix); -VOID STDCALL -EngUnlockSurface(SURFOBJ *pso); -INT STDCALL -EngWideCharToMultiByte(UINT CodePage,LPWSTR WideCharString,INT BytesInWideCharString,LPSTR MultiByteString,INT BytesInMultiByteString); -PFD_GLYPHATTR STDCALL -FONTOBJ_pQueryGlyphAttrs(FONTOBJ *pfo,ULONG iMode); -VOID STDCALL -PATHOBJ_vGetBounds(PATHOBJ *ppo,PRECTFX prectfx); -FD_GLYPHSET *STDCALL -FONTOBJ_pfdg(FONTOBJ *pfo); -BOOL STDCALL -PATHOBJ_bEnum(PATHOBJ *ppo,PATHDATA *ppd); -BOOL STDCALL -PATHOBJ_bEnumClipLines(PATHOBJ *ppo,ULONG cb,CLIPLINE *pcl); -VOID STDCALL -PATHOBJ_vEnumStart(PATHOBJ *ppo); -VOID STDCALL -PATHOBJ_vEnumStartClipLines(PATHOBJ *ppo,CLIPOBJ *pco,SURFOBJ *pso,LINEATTRS *pla); -BOOL STDCALL -STROBJ_bEnum(STROBJ *pstro,ULONG *pc,PGLYPHPOS *ppgpos); -BOOL STDCALL -STROBJ_bEnumPositionsOnly(STROBJ *pstro,ULONG *pc,PGLYPHPOS *ppgpos); -BOOL STDCALL -STROBJ_bGetAdvanceWidths(STROBJ *pso,ULONG iFirst,ULONG c,POINTQF *pptqD); -DWORD STDCALL -STROBJ_dwGetCodePage(STROBJ *pstro); -VOID STDCALL -STROBJ_vEnumStart(STROBJ *pstro); -ULONG STDCALL -XFORMOBJ_iGetXform(XFORMOBJ *pxo,XFORML *pxform); -BOOL STDCALL -XFORMOBJ_bApplyXform(XFORMOBJ *pxo,ULONG iMode,ULONG cPoints,PVOID pvIn,PVOID pvOut); -HANDLE STDCALL -XLATEOBJ_hGetColorTransform(XLATEOBJ *pxlo); - -#endif /* __USE_W32API */ - -#endif diff --git a/reactos/subsys/win32k/eng/xlate.c b/reactos/subsys/win32k/eng/xlate.c index f7b1844bb57..d9c54c9df8b 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.31 2004/01/24 08:26:25 ekohl Exp $ +/* $Id: xlate.c,v 1.32 2004/04/09 20:39:10 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -31,7 +31,7 @@ #include #include -#include +#include #include #include diff --git a/reactos/subsys/win32k/misc/driver.c b/reactos/subsys/win32k/misc/driver.c index 609259506fd..8821d9070e7 100644 --- a/reactos/subsys/win32k/misc/driver.c +++ b/reactos/subsys/win32k/misc/driver.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: driver.c,v 1.38 2004/04/09 20:03:19 navaraf Exp $ +/* $Id: driver.c,v 1.39 2004/04/09 20:39:10 navaraf Exp $ * * GDI Driver support routines * (mostly swiped from Wine) @@ -32,7 +32,6 @@ #include #include #include -#include #include #include #include @@ -235,7 +234,8 @@ BOOL DRIVER_BuildDDIFunctions(PDRVENABLEDATA DED, return TRUE; } -typedef VP_STATUS (*PMP_DRIVERENTRY)(PVOID, PVOID); +typedef LONG VP_STATUS; +typedef VP_STATUS (STDCALL *PMP_DRIVERENTRY)(PVOID, PVOID); PFILE_OBJECT DRIVER_FindMPDriver(ULONG DisplayNumber) { From ca61a750e8d4bfdfb7e62c98d386357ba72a5d2d Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 9 Apr 2004 21:01:02 +0000 Subject: [PATCH 0815/1463] - Fixed DPRINTs. svn path=/trunk/; revision=9060 --- reactos/lib/user32/windows/menu.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/reactos/lib/user32/windows/menu.c b/reactos/lib/user32/windows/menu.c index 4b162e17e9d..8d8e8940532 100644 --- a/reactos/lib/user32/windows/menu.c +++ b/reactos/lib/user32/windows/menu.c @@ -21,7 +21,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: menu.c,v 1.62 2004/04/09 20:03:15 navaraf Exp $ +/* $Id: menu.c,v 1.63 2004/04/09 21:01:02 navaraf Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/menu.c @@ -652,7 +652,7 @@ MenuDrawMenuItem(HWND Wnd, PROSMENUINFO MenuInfo, HWND WndOwner, HDC Dc, dis.hDC = Dc; dis.rcItem = Item->Rect; DPRINT("Ownerdraw: owner=%p itemID=%d, itemState=%d, itemAction=%d, " - "hwndItem=%p, hdc=%p, rcItem={%ld,%ld,%ld,%ld}\n", hwndOwner, + "hwndItem=%p, hdc=%p, rcItem={%ld,%ld,%ld,%ld}\n", Wnd, dis.itemID, dis.itemState, dis.itemAction, dis.hwndItem, dis.hDC, dis.rcItem.left, dis.rcItem.top, dis.rcItem.right, dis.rcItem.bottom); @@ -660,8 +660,8 @@ MenuDrawMenuItem(HWND Wnd, PROSMENUINFO MenuInfo, HWND WndOwner, HDC Dc, /* Fall through to draw popup-menu arrow */ } - DPRINT("rect={%ld,%ld,%ld,%ld}\n", Item->rect.left, Item->rect.top, - Item->rect.right, Item->rect.bottom); + DPRINT("rect={%ld,%ld,%ld,%ld}\n", Item->Rect.left, Item->Rect.top, + Item->Rect.right, Item->Rect.bottom); if (MenuBar && 0 != (Item->fType & MF_SEPARATOR)) { @@ -1402,7 +1402,7 @@ MenuMenuBarCalcSize(HDC Dc, LPRECT Rect, PROSMENUINFO MenuInfo, HWND WndOwner) } DPRINT("left=%ld top=%ld right=%ld bottom=%ld\n", - Rrect->left, Rect->top, Rect->right, Rect->bottom); + Rect->left, Rect->top, Rect->right, Rect->bottom); MenuInfo->Width = Rect->right - Rect->left; MenuInfo->Height = 0; MaxY = Rect->top + 1; @@ -1938,7 +1938,7 @@ MenuMoveSelection(HWND WndOwner, PROSMENUINFO MenuInfo, INT Offset) INT i; ROSMENUITEMINFO ItemInfo; - DPRINT("hwnd=%x menu=%x off=0x%04x\n", WndOwner, MenuInfo, offset); + DPRINT("hwnd=%x menu=%x off=0x%04x\n", WndOwner, MenuInfo, Offset); MenuInitRosMenuItemInfo(&ItemInfo); if (NO_SELECTED_ITEM != MenuInfo->FocusedItem) @@ -3426,7 +3426,7 @@ MenuTrackMenu(HMENU Menu, UINT Flags, INT x, INT y, static BOOL FASTCALL MenuExitTracking(HWND Wnd) { - DPRINT("hwnd=%p\n", hWnd); + DPRINT("hwnd=%p\n", Wnd); SendMessageW(Wnd, WM_EXITMENULOOP, 0, 0); ShowCaret(0); @@ -3440,7 +3440,7 @@ MenuTrackMouseMenuBar(HWND Wnd, ULONG Ht, POINT Pt) HMENU Menu = (HTSYSMENU == Ht) ? NtUserGetSystemMenu(Wnd, FALSE) : GetMenu(Wnd); UINT Flags = TPM_ENTERIDLEEX | TPM_BUTTONDOWN | TPM_LEFTALIGN | TPM_LEFTBUTTON; - DPRINT("wnd=%p ht=0x%04x (%ld,%ld)\n", Wnd, Ht, pt.x, pt.y); + DPRINT("wnd=%p ht=0x%04x (%ld,%ld)\n", Wnd, Ht, Pt.x, Pt.y); if (IsMenu(Menu)) { From 12b4cb63bfd514161b506a51cfa3f98b06ee8ea3 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 9 Apr 2004 21:22:18 +0000 Subject: [PATCH 0816/1463] - Include "roscfg.h". svn path=/trunk/; revision=9061 --- reactos/lib/user32/misc/dllmain.c | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/lib/user32/misc/dllmain.c b/reactos/lib/user32/misc/dllmain.c index 439bf8ea177..b636958f70a 100644 --- a/reactos/lib/user32/misc/dllmain.c +++ b/reactos/lib/user32/misc/dllmain.c @@ -9,6 +9,7 @@ #define _WIN32K_KAPI_H #include #include +#include #ifdef DBG From 97635093cd35b74f395fbd8549f6fe28aa15f5c2 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 9 Apr 2004 22:00:38 +0000 Subject: [PATCH 0817/1463] - Commit the correct changes to HEAD. svn path=/trunk/; revision=9062 --- reactos/subsys/win32k/dib/dib.h | 58 ++++++++++++++-------------- reactos/subsys/win32k/dib/dib16bpp.c | 26 ++++++------- reactos/subsys/win32k/dib/dib1bpp.c | 20 +++++----- reactos/subsys/win32k/dib/dib24bpp.c | 20 +++++----- reactos/subsys/win32k/dib/dib32bpp.c | 20 +++++----- reactos/subsys/win32k/dib/dib4bpp.c | 52 ++++++++++--------------- reactos/subsys/win32k/dib/dib8bpp.c | 20 +++++----- 7 files changed, 103 insertions(+), 113 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib.h b/reactos/subsys/win32k/dib/dib.h index 2c3dac2e035..55ab9d52ed3 100644 --- a/reactos/subsys/win32k/dib/dib.h +++ b/reactos/subsys/win32k/dib/dib.h @@ -12,13 +12,13 @@ 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); + 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, - XLATEOBJ *ColorTranslation, ULONG Mode); + POINTL* MaskOrigin, POINTL BrushOrigin, + XLATEOBJ *ColorTranslation, ULONG Mode); BOOLEAN DIB_1BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PSURFGDI DestGDI, PSURFGDI SourceGDI, RECTL* DestRect, POINTL *SourcePoint, @@ -31,13 +31,13 @@ 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, + 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, - XLATEOBJ *ColorTranslation, ULONG Mode); + POINTL* MaskOrigin, POINTL BrushOrigin, + XLATEOBJ *ColorTranslation, ULONG Mode); BOOLEAN DIB_4BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PSURFGDI DestGDI, PSURFGDI SourceGDI, RECTL* DestRect, POINTL *SourcePoint, @@ -50,13 +50,13 @@ 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); + 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, - XLATEOBJ *ColorTranslation, ULONG Mode); + POINTL* MaskOrigin, POINTL BrushOrigin, + XLATEOBJ *ColorTranslation, ULONG Mode); BOOLEAN DIB_8BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PSURFGDI DestGDI, PSURFGDI SourceGDI, RECTL* DestRect, POINTL *SourcePoint, @@ -69,13 +69,13 @@ 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); + 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, - XLATEOBJ *ColorTranslation, ULONG Mode); + SURFGDI *DestGDI, SURFGDI *SourceGDI, + RECTL* DestRect, RECTL *SourceRect, + POINTL* MaskOrigin, POINTL BrushOrigin, + XLATEOBJ *ColorTranslation, ULONG Mode); BOOLEAN DIB_16BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PSURFGDI DestGDI, PSURFGDI SourceGDI, RECTL* DestRect, POINTL *SourcePoint, @@ -88,13 +88,13 @@ 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); + 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, - XLATEOBJ *ColorTranslation, ULONG Mode); + SURFGDI *DestGDI, SURFGDI *SourceGDI, + RECTL* DestRect, RECTL *SourceRect, + POINTL* MaskOrigin, POINTL BrushOrigin, + XLATEOBJ *ColorTranslation, ULONG Mode); BOOLEAN DIB_24BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PSURFGDI DestGDI, PSURFGDI SourceGDI, RECTL* DestRect, POINTL *SourcePoint, @@ -107,13 +107,13 @@ 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); + 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, - XLATEOBJ *ColorTranslation, ULONG Mode); + SURFGDI *DestGDI, SURFGDI *SourceGDI, + RECTL* DestRect, RECTL *SourceRect, + POINTL* MaskOrigin, POINTL BrushOrigin, + XLATEOBJ *ColorTranslation, ULONG Mode); BOOLEAN DIB_32BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PSURFGDI DestGDI, PSURFGDI SourceGDI, RECTL* DestRect, POINTL *SourcePoint, diff --git a/reactos/subsys/win32k/dib/dib16bpp.c b/reactos/subsys/win32k/dib/dib16bpp.c index 67387ae967c..e2740164f79 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.28 2004/04/07 22:09:09 weiden Exp $ */ +/* $Id: dib16bpp.c,v 1.29 2004/04/09 22:00:38 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -31,7 +31,7 @@ #include "dib.h" VOID -DIB_16BPP_PutPixel(PSURFOBJ SurfObj, LONG x, LONG y, ULONG c) +DIB_16BPP_PutPixel(SURFOBJ *SurfObj, LONG x, LONG y, ULONG c) { PBYTE byteaddr = SurfObj->pvScan0 + y * SurfObj->lDelta; PWORD addr = (PWORD)byteaddr + x; @@ -40,7 +40,7 @@ DIB_16BPP_PutPixel(PSURFOBJ SurfObj, LONG x, LONG y, ULONG c) } ULONG -DIB_16BPP_GetPixel(PSURFOBJ SurfObj, LONG x, LONG y) +DIB_16BPP_GetPixel(SURFOBJ *SurfObj, LONG x, LONG y) { PBYTE byteaddr = SurfObj->pvScan0 + y * SurfObj->lDelta; PWORD addr = (PWORD)byteaddr + x; @@ -49,7 +49,7 @@ DIB_16BPP_GetPixel(PSURFOBJ SurfObj, LONG x, LONG y) } VOID -DIB_16BPP_HLine(PSURFOBJ SurfObj, LONG x1, LONG x2, LONG y, ULONG c) +DIB_16BPP_HLine(SURFOBJ *SurfObj, LONG x1, LONG x2, LONG y, ULONG c) { PBYTE byteaddr = SurfObj->pvScan0 + y * SurfObj->lDelta; PWORD addr = (PWORD)byteaddr + x1; @@ -63,7 +63,7 @@ DIB_16BPP_HLine(PSURFOBJ SurfObj, LONG x1, LONG x2, LONG y, ULONG c) } VOID -DIB_16BPP_VLine(PSURFOBJ SurfObj, LONG x, LONG y1, LONG y2, ULONG c) +DIB_16BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c) { PBYTE byteaddr = SurfObj->pvScan0 + y1 * SurfObj->lDelta; PWORD addr = (PWORD)byteaddr + x; @@ -278,7 +278,7 @@ BOOLEAN DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SURFGDI *DestGDI, SURFGDI *SourceGDI, PRECTL DestRect, POINTL *SourcePoint, - PBRUSHOBJ Brush, PPOINTL BrushOrigin, + BRUSHOBJ *Brush, POINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Rop4) { ULONG X, Y; @@ -291,7 +291,7 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, /* Pattern brushes */ PGDIBRUSHOBJ GdiBrush; HBITMAP PatternSurface = NULL; - PSURFOBJ PatternObj; + SURFOBJ *PatternObj; ULONG PatternWidth, PatternHeight; if (Rop4 == SRCCOPY) @@ -324,7 +324,7 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PatternSurface = BitmapToSurf(PatternBitmap, NULL); BITMAPOBJ_UnlockBitmap(GdiBrush->hbmPattern); - PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); + PatternObj = (SURFOBJ*)AccessUserObject((ULONG)PatternSurface); PatternWidth = PatternObj->sizlBitmap.cx; PatternHeight = PatternObj->sizlBitmap.cy; @@ -396,7 +396,7 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } if (PatternSurface != NULL) - EngDeleteSurface(PatternSurface); + EngDeleteSurface((HSURF)PatternSurface); return TRUE; } @@ -546,10 +546,10 @@ void ScaleRectAvg16(PIXEL *Target, PIXEL *Source, int SrcWidth, int SrcHeight, //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, - XLATEOBJ *ColorTranslation, ULONG Mode) + SURFGDI *DestGDI, SURFGDI *SourceGDI, + RECTL* DestRect, RECTL *SourceRect, + POINTL* MaskOrigin, POINTL BrushOrigin, + XLATEOBJ *ColorTranslation, ULONG Mode) { BYTE *SourceLine, *DestLine; diff --git a/reactos/subsys/win32k/dib/dib1bpp.c b/reactos/subsys/win32k/dib/dib1bpp.c index 6854ec957d4..086baae2aaa 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.23 2004/04/08 15:45:17 navaraf Exp $ */ +/* $Id: dib1bpp.c,v 1.24 2004/04/09 22:00:38 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include @@ -31,7 +31,7 @@ #include "dib.h" VOID -DIB_1BPP_PutPixel(PSURFOBJ SurfObj, LONG x, LONG y, ULONG c) +DIB_1BPP_PutPixel(SURFOBJ *SurfObj, LONG x, LONG y, ULONG c) { PBYTE addr = SurfObj->pvScan0 + y * SurfObj->lDelta + (x >> 3); @@ -42,7 +42,7 @@ DIB_1BPP_PutPixel(PSURFOBJ SurfObj, LONG x, LONG y, ULONG c) } ULONG -DIB_1BPP_GetPixel(PSURFOBJ SurfObj, LONG x, LONG y) +DIB_1BPP_GetPixel(SURFOBJ *SurfObj, LONG x, LONG y) { PBYTE addr = SurfObj->pvScan0 + y * SurfObj->lDelta + (x >> 3); @@ -50,7 +50,7 @@ DIB_1BPP_GetPixel(PSURFOBJ SurfObj, LONG x, LONG y) } VOID -DIB_1BPP_HLine(PSURFOBJ SurfObj, LONG x1, LONG x2, LONG y, ULONG c) +DIB_1BPP_HLine(SURFOBJ *SurfObj, LONG x1, LONG x2, LONG y, ULONG c) { while(x1 < x2) { DIB_1BPP_PutPixel(SurfObj, x1, y, c); @@ -59,7 +59,7 @@ DIB_1BPP_HLine(PSURFOBJ SurfObj, LONG x1, LONG x2, LONG y, ULONG c) } VOID -DIB_1BPP_VLine(PSURFOBJ SurfObj, LONG x, LONG y1, LONG y2, ULONG c) +DIB_1BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c) { while(y1 < y2) { DIB_1BPP_PutPixel(SurfObj, x, y1, c); @@ -350,7 +350,7 @@ DIB_1BPP_BitBlt( SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SURFGDI *DestGDI, SURFGDI *SourceGDI, PRECTL DestRect, POINTL *SourcePoint, - PBRUSHOBJ Brush, PPOINTL BrushOrigin, + BRUSHOBJ *Brush, POINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Rop4) { ULONG X, Y, SourceX, SourceY, k; @@ -363,7 +363,7 @@ DIB_1BPP_BitBlt( /* Pattern brushes */ PGDIBRUSHOBJ GdiBrush; HBITMAP PatternSurface = NULL; - PSURFOBJ PatternObj; + SURFOBJ *PatternObj; ULONG PatternWidth, PatternHeight; if (Rop4 == SRCCOPY) @@ -396,7 +396,7 @@ DIB_1BPP_BitBlt( PatternSurface = BitmapToSurf(PatternBitmap, NULL); BITMAPOBJ_UnlockBitmap(GdiBrush->hbmPattern); - PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); + PatternObj = (SURFOBJ*)AccessUserObject((ULONG)PatternSurface); PatternWidth = PatternObj->sizlBitmap.cx; PatternHeight = PatternObj->sizlBitmap.cy; @@ -515,7 +515,7 @@ DIB_1BPP_BitBlt( } if (PatternSurface != NULL) - EngDeleteSurface(PatternSurface); + EngDeleteSurface((HSURF)PatternSurface); return TRUE; } @@ -525,7 +525,7 @@ DIB_1BPP_StretchBlt ( SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, - POINTL* MaskOrigin, POINTL* BrushOrigin, + POINTL* MaskOrigin, POINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Mode) { DbgPrint("DIB_1BPP_StretchBlt: Source BPP: %u\n", SourceGDI->BitsPerPixel); diff --git a/reactos/subsys/win32k/dib/dib24bpp.c b/reactos/subsys/win32k/dib/dib24bpp.c index 3b4b73dc44d..9958af91d28 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.23 2004/04/07 15:37:50 weiden Exp $ */ +/* $Id: dib24bpp.c,v 1.24 2004/04/09 22:00:38 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -30,7 +30,7 @@ #include "dib.h" VOID -DIB_24BPP_PutPixel(PSURFOBJ SurfObj, LONG x, LONG y, ULONG c) +DIB_24BPP_PutPixel(SURFOBJ *SurfObj, LONG x, LONG y, ULONG c) { PBYTE addr = SurfObj->pvScan0 + (y * SurfObj->lDelta) + (x << 1) + x; *(PUSHORT)(addr) = c & 0xFFFF; @@ -38,14 +38,14 @@ DIB_24BPP_PutPixel(PSURFOBJ SurfObj, LONG x, LONG y, ULONG c) } ULONG -DIB_24BPP_GetPixel(PSURFOBJ SurfObj, LONG x, LONG y) +DIB_24BPP_GetPixel(SURFOBJ *SurfObj, LONG x, LONG y) { PBYTE addr = SurfObj->pvScan0 + y * SurfObj->lDelta + (x << 1) + x; return *(PUSHORT)(addr) + (*(addr + 2) << 16); } VOID -DIB_24BPP_HLine(PSURFOBJ SurfObj, LONG x1, LONG x2, LONG y, ULONG c) +DIB_24BPP_HLine(SURFOBJ *SurfObj, LONG x1, LONG x2, LONG y, ULONG c) { PBYTE addr = SurfObj->pvScan0 + y * SurfObj->lDelta + (x1 << 1) + x1; LONG cx = x1; @@ -61,7 +61,7 @@ DIB_24BPP_HLine(PSURFOBJ SurfObj, LONG x1, LONG x2, LONG y, ULONG c) } VOID -DIB_24BPP_VLine(PSURFOBJ SurfObj, LONG x, LONG y1, LONG y2, ULONG c) +DIB_24BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c) { PBYTE addr = SurfObj->pvScan0 + y1 * SurfObj->lDelta + (x << 1) + x; LONG lDelta = SurfObj->lDelta; @@ -250,7 +250,7 @@ BOOLEAN DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SURFGDI *DestGDI, SURFGDI *SourceGDI, PRECTL DestRect, POINTL *SourcePoint, - PBRUSHOBJ Brush, PPOINTL BrushOrigin, + BRUSHOBJ *Brush, POINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Rop4) { ULONG X, Y; @@ -262,7 +262,7 @@ DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, /* Pattern brushes */ PGDIBRUSHOBJ GdiBrush; HBITMAP PatternSurface = NULL; - PSURFOBJ PatternObj; + SURFOBJ *PatternObj; ULONG PatternWidth, PatternHeight; if (Rop4 == SRCCOPY) @@ -295,7 +295,7 @@ DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PatternSurface = BitmapToSurf(PatternBitmap, NULL); BITMAPOBJ_UnlockBitmap(GdiBrush->hbmPattern); - PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); + PatternObj = (SURFOBJ*)AccessUserObject((ULONG)PatternSurface); PatternWidth = PatternObj->sizlBitmap.cx; PatternHeight = PatternObj->sizlBitmap.cy; @@ -346,7 +346,7 @@ DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } if (PatternSurface != NULL) - EngDeleteSurface(PatternSurface); + EngDeleteSurface((HSURF)PatternSurface); return TRUE; } @@ -354,7 +354,7 @@ DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, - POINTL* MaskOrigin, POINTL* BrushOrigin, + POINTL* MaskOrigin, POINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Mode) { DbgPrint("DIB_24BPP_StretchBlt: Source BPP: %u\n", SourceGDI->BitsPerPixel); diff --git a/reactos/subsys/win32k/dib/dib32bpp.c b/reactos/subsys/win32k/dib/dib32bpp.c index 719b24f610f..c90497c635c 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.23 2004/04/07 15:37:50 weiden Exp $ */ +/* $Id: dib32bpp.c,v 1.24 2004/04/09 22:00:38 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -30,7 +30,7 @@ #include "dib.h" VOID -DIB_32BPP_PutPixel(PSURFOBJ SurfObj, LONG x, LONG y, ULONG c) +DIB_32BPP_PutPixel(SURFOBJ *SurfObj, LONG x, LONG y, ULONG c) { PBYTE byteaddr = SurfObj->pvScan0 + y * SurfObj->lDelta; PDWORD addr = (PDWORD)byteaddr + x; @@ -39,7 +39,7 @@ DIB_32BPP_PutPixel(PSURFOBJ SurfObj, LONG x, LONG y, ULONG c) } ULONG -DIB_32BPP_GetPixel(PSURFOBJ SurfObj, LONG x, LONG y) +DIB_32BPP_GetPixel(SURFOBJ *SurfObj, LONG x, LONG y) { PBYTE byteaddr = SurfObj->pvScan0 + y * SurfObj->lDelta; PDWORD addr = (PDWORD)byteaddr + x; @@ -48,7 +48,7 @@ DIB_32BPP_GetPixel(PSURFOBJ SurfObj, LONG x, LONG y) } VOID -DIB_32BPP_HLine(PSURFOBJ SurfObj, LONG x1, LONG x2, LONG y, ULONG c) +DIB_32BPP_HLine(SURFOBJ *SurfObj, LONG x1, LONG x2, LONG y, ULONG c) { PBYTE byteaddr = SurfObj->pvScan0 + y * SurfObj->lDelta; PDWORD addr = (PDWORD)byteaddr + x1; @@ -62,7 +62,7 @@ DIB_32BPP_HLine(PSURFOBJ SurfObj, LONG x1, LONG x2, LONG y, ULONG c) } VOID -DIB_32BPP_VLine(PSURFOBJ SurfObj, LONG x, LONG y1, LONG y2, ULONG c) +DIB_32BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c) { PBYTE byteaddr = SurfObj->pvScan0 + y1 * SurfObj->lDelta; PDWORD addr = (PDWORD)byteaddr + x; @@ -299,7 +299,7 @@ BOOLEAN DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SURFGDI *DestGDI, SURFGDI *SourceGDI, PRECTL DestRect, POINTL *SourcePoint, - PBRUSHOBJ Brush, PPOINTL BrushOrigin, + BRUSHOBJ *Brush, POINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Rop4) { ULONG X, Y; @@ -311,7 +311,7 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, /* Pattern brushes */ PGDIBRUSHOBJ GdiBrush; HBITMAP PatternSurface = NULL; - PSURFOBJ PatternObj; + SURFOBJ *PatternObj; ULONG PatternWidth, PatternHeight; if (Rop4 == SRCCOPY) @@ -344,7 +344,7 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PatternSurface = BitmapToSurf(PatternBitmap, NULL); BITMAPOBJ_UnlockBitmap(GdiBrush->hbmPattern); - PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); + PatternObj = (SURFOBJ*)AccessUserObject((ULONG)PatternSurface); PatternWidth = PatternObj->sizlBitmap.cx; PatternHeight = PatternObj->sizlBitmap.cy; @@ -395,7 +395,7 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } if (PatternSurface != NULL) - EngDeleteSurface(PatternSurface); + EngDeleteSurface((HSURF)PatternSurface); return TRUE; } @@ -517,7 +517,7 @@ void ScaleRectAvg32(PIXEL *Target, PIXEL *Source, int SrcWidth, int SrcHeight, BOOLEAN DIB_32BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, - POINTL* MaskOrigin, POINTL* BrushOrigin, + POINTL* MaskOrigin, POINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Mode) { BYTE *SourceLine, *DestLine; diff --git a/reactos/subsys/win32k/dib/dib4bpp.c b/reactos/subsys/win32k/dib/dib4bpp.c index ef85ff83607..a2762a45387 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.32 2004/04/08 09:44:21 navaraf Exp $ */ +/* $Id: dib4bpp.c,v 1.33 2004/04/09 22:00:38 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -30,21 +30,21 @@ #include "dib.h" VOID -DIB_4BPP_PutPixel(PSURFOBJ SurfObj, LONG x, LONG y, ULONG c) +DIB_4BPP_PutPixel(SURFOBJ *SurfObj, LONG x, LONG y, ULONG c) { PBYTE addr = SurfObj->pvScan0 + (x>>1) + y * SurfObj->lDelta; *addr = (*addr & notmask[x&1]) | (c << ((1-(x&1))<<2)); } ULONG -DIB_4BPP_GetPixel(PSURFOBJ SurfObj, LONG x, LONG y) +DIB_4BPP_GetPixel(SURFOBJ *SurfObj, LONG x, LONG y) { PBYTE addr = SurfObj->pvScan0 + (x>>1) + y * SurfObj->lDelta; return (*addr >> ((1-(x&1))<<2)) & 0x0f; } VOID -DIB_4BPP_HLine(PSURFOBJ SurfObj, LONG x1, LONG x2, LONG y, ULONG c) +DIB_4BPP_HLine(SURFOBJ *SurfObj, LONG x1, LONG x2, LONG y, ULONG c) { PBYTE addr = SurfObj->pvScan0 + (x1>>1) + y * SurfObj->lDelta; LONG cx = x1; @@ -58,7 +58,7 @@ DIB_4BPP_HLine(PSURFOBJ SurfObj, LONG x1, LONG x2, LONG y, ULONG c) } VOID -DIB_4BPP_VLine(PSURFOBJ SurfObj, LONG x, LONG y1, LONG y2, ULONG c) +DIB_4BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c) { PBYTE addr = SurfObj->pvScan0; int lDelta = SurfObj->lDelta; @@ -235,7 +235,7 @@ BOOLEAN DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SURFGDI *DestGDI, SURFGDI *SourceGDI, PRECTL DestRect, POINTL *SourcePoint, - PBRUSHOBJ Brush, PPOINTL BrushOrigin, + BRUSHOBJ *Brush, POINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Rop4) { LONG i, j, sx, sy; @@ -247,9 +247,8 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, /* Pattern brushes */ PGDIBRUSHOBJ GdiBrush; HBITMAP PatternSurface = NULL; - PSURFOBJ PatternObj; + SURFOBJ *PatternObj; ULONG PatternWidth, PatternHeight; - POINTL PatternOrigin; static const ULONG ExpandSolidColor[16] = { 0x00000000 /* 0 */, @@ -300,19 +299,10 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PatternSurface = BitmapToSurf(PatternBitmap, NULL); BITMAPOBJ_UnlockBitmap(GdiBrush->hbmPattern); - PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); + PatternObj = (SURFOBJ*)AccessUserObject((ULONG)PatternSurface); PatternWidth = PatternObj->sizlBitmap.cx; PatternHeight = PatternObj->sizlBitmap.cy; - if (BrushOrigin != NULL) - { - PatternOrigin = *BrushOrigin; - } - else - { - PatternOrigin.x = PatternOrigin.y = 0; - } - UsesPattern = TRUE; } else @@ -332,7 +322,7 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, i = DestRect->left; if (UsesPattern) - PatternY = (j + PatternOrigin.y) % PatternHeight; + PatternY = (j + BrushOrigin.y) % PatternHeight; if (i & 0x1) { @@ -345,7 +335,7 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (UsesPattern) { - Pattern = DIB_1BPP_GetPixel(PatternObj, (i + PatternOrigin.x) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; + Pattern = DIB_1BPP_GetPixel(PatternObj, (i + BrushOrigin.x) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; } DIB_4BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF); @@ -372,14 +362,14 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } if (UsesPattern) { - Pattern = DIB_1BPP_GetPixel(PatternObj, (i + PatternOrigin.x + 1) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + PatternOrigin.x + 0) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 4; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + PatternOrigin.x + 3) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 8; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + PatternOrigin.x + 2) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 12; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + PatternOrigin.x + 5) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 16; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + PatternOrigin.x + 4) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 20; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + PatternOrigin.x + 7) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 24; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + PatternOrigin.x + 6) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 28; + 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; } *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); } @@ -394,14 +384,14 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } if (UsesPattern) { - Pattern = DIB_1BPP_GetPixel(PatternObj, (i + PatternOrigin.x) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; + Pattern = DIB_1BPP_GetPixel(PatternObj, (i + BrushOrigin.x) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; } DIB_4BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF); } } if (PatternSurface != NULL) - EngDeleteSurface(PatternSurface); + EngDeleteSurface((HSURF)PatternSurface); return TRUE; } @@ -409,7 +399,7 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, BOOLEAN DIB_4BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, - POINTL* MaskOrigin, POINTL* BrushOrigin, + POINTL* MaskOrigin, POINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Mode) { DbgPrint("DIB_4BPP_StretchBlt: Source BPP: %u\n", SourceGDI->BitsPerPixel); diff --git a/reactos/subsys/win32k/dib/dib8bpp.c b/reactos/subsys/win32k/dib/dib8bpp.c index ed7042b2817..a5d66a3aaad 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.21 2004/04/07 15:37:50 weiden Exp $ */ +/* $Id: dib8bpp.c,v 1.22 2004/04/09 22:00:38 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -30,7 +30,7 @@ #include "dib.h" VOID -DIB_8BPP_PutPixel(PSURFOBJ SurfObj, LONG x, LONG y, ULONG c) +DIB_8BPP_PutPixel(SURFOBJ *SurfObj, LONG x, LONG y, ULONG c) { PBYTE byteaddr = SurfObj->pvScan0 + y * SurfObj->lDelta + x; @@ -38,7 +38,7 @@ DIB_8BPP_PutPixel(PSURFOBJ SurfObj, LONG x, LONG y, ULONG c) } ULONG -DIB_8BPP_GetPixel(PSURFOBJ SurfObj, LONG x, LONG y) +DIB_8BPP_GetPixel(SURFOBJ *SurfObj, LONG x, LONG y) { PBYTE byteaddr = SurfObj->pvScan0 + y * SurfObj->lDelta + x; @@ -46,7 +46,7 @@ DIB_8BPP_GetPixel(PSURFOBJ SurfObj, LONG x, LONG y) } VOID -DIB_8BPP_HLine(PSURFOBJ SurfObj, LONG x1, LONG x2, LONG y, ULONG c) +DIB_8BPP_HLine(SURFOBJ *SurfObj, LONG x1, LONG x2, LONG y, ULONG c) { PBYTE byteaddr = SurfObj->pvScan0 + y * SurfObj->lDelta; PBYTE addr = byteaddr + x1; @@ -60,7 +60,7 @@ DIB_8BPP_HLine(PSURFOBJ SurfObj, LONG x1, LONG x2, LONG y, ULONG c) } VOID -DIB_8BPP_VLine(PSURFOBJ SurfObj, LONG x, LONG y1, LONG y2, ULONG c) +DIB_8BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c) { PBYTE byteaddr = SurfObj->pvScan0 + y1 * SurfObj->lDelta; PBYTE addr = byteaddr + x; @@ -273,7 +273,7 @@ BOOLEAN DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SURFGDI *DestGDI, SURFGDI *SourceGDI, PRECTL DestRect, POINTL *SourcePoint, - PBRUSHOBJ Brush, PPOINTL BrushOrigin, + BRUSHOBJ *Brush, POINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Rop4) { LONG i, j, k, sx, sy; @@ -285,7 +285,7 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, /* Pattern brushes */ PGDIBRUSHOBJ GdiBrush; HBITMAP PatternSurface = NULL; - PSURFOBJ PatternObj; + SURFOBJ *PatternObj; ULONG PatternWidth, PatternHeight; if (Rop4 == SRCCOPY) @@ -318,7 +318,7 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PatternSurface = BitmapToSurf(PatternBitmap, NULL); BITMAPOBJ_UnlockBitmap(GdiBrush->hbmPattern); - PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); + PatternObj = (SURFOBJ*)AccessUserObject((ULONG)PatternSurface); PatternWidth = PatternObj->sizlBitmap.cx; PatternHeight = PatternObj->sizlBitmap.cy; @@ -390,7 +390,7 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } if (PatternSurface != NULL) - EngDeleteSurface(PatternSurface); + EngDeleteSurface((HSURF)PatternSurface); return TRUE; } @@ -510,7 +510,7 @@ void ScaleRectAvg8(PIXEL *Target, PIXEL *Source, int SrcWidth, int SrcHeight, BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, - POINTL* MaskOrigin, POINTL* BrushOrigin, + POINTL* MaskOrigin, POINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Mode) { BYTE *SourceLine, *DestLine; From 80a373534a49649a009937689256565e95de2928 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Fri, 9 Apr 2004 22:13:26 +0000 Subject: [PATCH 0818/1463] Compensate BrushOrigin for translation svn path=/trunk/; revision=9063 --- reactos/subsys/win32k/eng/bitblt.c | 38 ++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/reactos/subsys/win32k/eng/bitblt.c b/reactos/subsys/win32k/eng/bitblt.c index f378ca9db11..d00f018e82f 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.48 2004/04/09 20:03:16 navaraf Exp $ +/* $Id: bitblt.c,v 1.49 2004/04/09 22:13:26 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -275,6 +275,7 @@ EngBitBlt(SURFOBJ *DestObj, ULONG Direction; BOOL UsesSource; BOOL UsesPattern; + POINTL AdjustedBrushOrigin; UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); @@ -370,6 +371,9 @@ EngBitBlt(SURFOBJ *DestObj, OutputRect.top = DestRect->top + Translate.y; OutputRect.bottom = DestRect->bottom + Translate.y; + AdjustedBrushOrigin.x = BrushOrigin->x + Translate.x; + AdjustedBrushOrigin.y = BrushOrigin->y + Translate.y; + if (NULL != OutputObj) { OutputGDI = (SURFGDI*)AccessInternalObjectFromUserObject(OutputObj); @@ -408,7 +412,7 @@ EngBitBlt(SURFOBJ *DestObj, { case DC_TRIVIAL: Ret = (*BltRectFunc)(OutputObj, OutputGDI, InputObj, InputGDI, Mask, ColorTranslation, - &OutputRect, &InputPoint, MaskOrigin, Brush, BrushOrigin, Rop4); + &OutputRect, &InputPoint, MaskOrigin, Brush, &AdjustedBrushOrigin, Rop4); break; case DC_RECT: // Clip the blt to the clip rectangle @@ -420,7 +424,7 @@ EngBitBlt(SURFOBJ *DestObj, Pt.x = InputPoint.x + CombinedRect.left - OutputRect.left; Pt.y = InputPoint.y + CombinedRect.top - OutputRect.top; Ret = (*BltRectFunc)(OutputObj, OutputGDI, InputObj, InputGDI, Mask, ColorTranslation, - &CombinedRect, &Pt, MaskOrigin, Brush, BrushOrigin, Rop4); + &CombinedRect, &Pt, MaskOrigin, Brush, &AdjustedBrushOrigin, Rop4); break; case DC_COMPLEX: Ret = TRUE; @@ -454,7 +458,7 @@ EngBitBlt(SURFOBJ *DestObj, Pt.x = InputPoint.x + CombinedRect.left - OutputRect.left; Pt.y = InputPoint.y + CombinedRect.top - OutputRect.top; Ret = (*BltRectFunc)(OutputObj, OutputGDI, InputObj, InputGDI, Mask, ColorTranslation, - &CombinedRect, &Pt, MaskOrigin, Brush, BrushOrigin, Rop4) && + &CombinedRect, &Pt, MaskOrigin, Brush, &AdjustedBrushOrigin, Rop4) && Ret; } } @@ -660,6 +664,7 @@ EngStretchBlt( // unsigned i; POINTL Pt; // ULONG Direction; + POINTL AdjustedBrushOrigin; InputRect.left = prclSrc->left; InputRect.right = prclSrc->right; @@ -729,6 +734,9 @@ EngStretchBlt( OutputRect.top = prclDest->top + Translate.y; OutputRect.bottom = prclDest->bottom + Translate.y; + AdjustedBrushOrigin.x = BrushOrigin->x + Translate.x; + AdjustedBrushOrigin.y = BrushOrigin->y + Translate.y; + if (NULL != OutputObj) { OutputGDI = (SURFGDI*)AccessInternalObjectFromUserObject(OutputObj); @@ -761,7 +769,7 @@ EngStretchBlt( { case DC_TRIVIAL: Ret = (*BltRectFunc)(OutputObj, OutputGDI, InputObj, InputGDI, Mask, ColorTranslation, - &OutputRect, &InputRect, MaskOrigin, BrushOrigin, Mode); + &OutputRect, &InputRect, MaskOrigin, &AdjustedBrushOrigin, Mode); break; case DC_RECT: // Clip the blt to the clip rectangle @@ -773,7 +781,7 @@ EngStretchBlt( Pt.x = InputPoint.x + CombinedRect.left - OutputRect.left; Pt.y = InputPoint.y + CombinedRect.top - OutputRect.top; Ret = (*BltRectFunc)(OutputObj, OutputGDI, InputObj, InputGDI, Mask, ColorTranslation, - &OutputRect, &InputRect, MaskOrigin, BrushOrigin, Mode); + &OutputRect, &InputRect, MaskOrigin, &AdjustedBrushOrigin, Mode); //Ret = (*BltRectFunc)(OutputObj, OutputGDI, InputObj, InputGDI, Mask, ColorTranslation, // &CombinedRect, &Pt, MaskOrigin, Brush, BrushOrigin, Rop4); DPRINT("EngStretchBlt() doesn't support DC_RECT clipping yet, so blitting w/o clip.\n"); @@ -812,7 +820,7 @@ EngStretchBlt( Pt.x = InputPoint.x + CombinedRect.left - OutputRect.left; Pt.y = InputPoint.y + CombinedRect.top - OutputRect.top; Ret = (*BltRectFunc)(OutputObj, OutputGDI, InputObj, InputGDI, Mask, ColorTranslation, - &CombinedRect, &Pt, MaskOrigin, Brush, BrushOrigin, Rop4) && + &CombinedRect, &Pt, MaskOrigin, Brush, &AdjustedBrushOrigin, Rop4) && Ret; } } @@ -1023,6 +1031,7 @@ EngMaskBitBlt(SURFOBJ *DestObj, POINTL Pt; ULONG Direction; SURFGDI* DestGDI; + POINTL AdjustedBrushOrigin; if (NULL != SourcePoint) { @@ -1115,6 +1124,9 @@ EngMaskBitBlt(SURFOBJ *DestObj, OutputRect.top = DestRect->top + Translate.y; OutputRect.bottom = DestRect->bottom + Translate.y; + AdjustedBrushOrigin.x = BrushOrigin->x + Translate.x; + AdjustedBrushOrigin.y = BrushOrigin->y + Translate.y; + if (NULL != OutputObj) { OutputGDI = (SURFGDI*)AccessInternalObjectFromUserObject(OutputObj); @@ -1133,10 +1145,10 @@ EngMaskBitBlt(SURFOBJ *DestObj, case DC_TRIVIAL: if(Mask->iBitmapFormat == BMF_8BPP) Ret = AlphaBltMask(OutputObj, OutputGDI, InputObj, InputGDI, Mask, DestColorTranslation, SourceColorTranslation, - &OutputRect, &InputPoint, MaskOrigin, Brush, BrushOrigin); + &OutputRect, &InputPoint, MaskOrigin, Brush, &AdjustedBrushOrigin); else Ret = BltMask(OutputObj, OutputGDI, InputObj, InputGDI, Mask, DestColorTranslation, - &OutputRect, &InputPoint, MaskOrigin, Brush, BrushOrigin, 0xAACC); + &OutputRect, &InputPoint, MaskOrigin, Brush, &AdjustedBrushOrigin, 0xAACC); break; case DC_RECT: // Clip the blt to the clip rectangle @@ -1149,10 +1161,10 @@ EngMaskBitBlt(SURFOBJ *DestObj, Pt.y = InputPoint.y + CombinedRect.top - OutputRect.top; if(Mask->iBitmapFormat == BMF_8BPP) Ret = AlphaBltMask(OutputObj, OutputGDI, InputObj, InputGDI, Mask, DestColorTranslation, SourceColorTranslation, - &CombinedRect, &Pt, MaskOrigin, Brush, BrushOrigin); + &CombinedRect, &Pt, MaskOrigin, Brush, &AdjustedBrushOrigin); else Ret = BltMask(OutputObj, OutputGDI, InputObj, InputGDI, Mask, DestColorTranslation, - &CombinedRect, &Pt, MaskOrigin, Brush, BrushOrigin, 0xAACC); + &CombinedRect, &Pt, MaskOrigin, Brush, &AdjustedBrushOrigin, 0xAACC); break; case DC_COMPLEX: Ret = TRUE; @@ -1187,10 +1199,10 @@ EngMaskBitBlt(SURFOBJ *DestObj, Pt.y = InputPoint.y + CombinedRect.top - OutputRect.top; if(Mask->iBitmapFormat == BMF_8BPP) Ret = AlphaBltMask(OutputObj, OutputGDI, InputObj, InputGDI, Mask, DestColorTranslation, SourceColorTranslation, - &CombinedRect, &Pt, MaskOrigin, Brush, BrushOrigin) && Ret; + &CombinedRect, &Pt, MaskOrigin, Brush, &AdjustedBrushOrigin) && Ret; else Ret = BltMask(OutputObj, OutputGDI, InputObj, InputGDI, Mask, DestColorTranslation, - &CombinedRect, &Pt, MaskOrigin, Brush, BrushOrigin, 0xAACC) && Ret; + &CombinedRect, &Pt, MaskOrigin, Brush, &AdjustedBrushOrigin, 0xAACC) && Ret; } } while(EnumMore); From cef28e1bf59562911bbe0ac5f617557377477843 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Fri, 9 Apr 2004 22:27:39 +0000 Subject: [PATCH 0819/1463] handle the case where no BrushOrigin is given svn path=/trunk/; revision=9065 --- reactos/subsys/win32k/eng/bitblt.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/reactos/subsys/win32k/eng/bitblt.c b/reactos/subsys/win32k/eng/bitblt.c index d00f018e82f..7b7868ace0e 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.49 2004/04/09 22:13:26 gvg Exp $ +/* $Id: bitblt.c,v 1.50 2004/04/09 22:27:39 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -370,9 +370,14 @@ EngBitBlt(SURFOBJ *DestObj, OutputRect.right = DestRect->right + Translate.x; OutputRect.top = DestRect->top + Translate.y; OutputRect.bottom = DestRect->bottom + Translate.y; - - AdjustedBrushOrigin.x = BrushOrigin->x + Translate.x; - AdjustedBrushOrigin.y = BrushOrigin->y + Translate.y; + + if(BrushOrigin) + { + AdjustedBrushOrigin.x = BrushOrigin->x + Translate.x; + AdjustedBrushOrigin.y = BrushOrigin->y + Translate.y; + } + else + AdjustedBrushOrigin = Translate; if (NULL != OutputObj) { From 565d0c19a497a0a13d94348a49d21d7366fbaa1e Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sat, 10 Apr 2004 00:54:35 +0000 Subject: [PATCH 0820/1463] - Remove forgotten DbgPrint. svn path=/trunk/; revision=9066 --- reactos/lib/user32/windows/message.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/reactos/lib/user32/windows/message.c b/reactos/lib/user32/windows/message.c index 52085ef5378..200c01a5740 100644 --- a/reactos/lib/user32/windows/message.c +++ b/reactos/lib/user32/windows/message.c @@ -1,4 +1,4 @@ -/* $Id: message.c,v 1.37 2004/04/09 20:03:15 navaraf Exp $ +/* $Id: message.c,v 1.38 2004/04/10 00:54:35 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -477,7 +477,6 @@ CallWindowProcA(WNDPROC lpPrevWndFunc, BOOL IsHandle; WndProcHandle wphData; - DbgPrint("CallWindowProcA(%p,%x,%x,%x,%x)\n",lpPrevWndFunc,hWnd,Msg,wParam,lParam); if (lpPrevWndFunc == NULL) lpPrevWndFunc = (WNDPROC)NtUserGetWindowLong(hWnd, GWL_WNDPROC, FALSE); From d0003f99f5517617d4cc37ce96e54dba05919dd4 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sat, 10 Apr 2004 00:58:14 +0000 Subject: [PATCH 0821/1463] - Handle the case where no BrushOrigin is given even under EngStretchBlt and EngMaskBitBlt. svn path=/trunk/; revision=9067 --- reactos/subsys/win32k/eng/bitblt.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/reactos/subsys/win32k/eng/bitblt.c b/reactos/subsys/win32k/eng/bitblt.c index 7b7868ace0e..91bd82057e7 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.50 2004/04/09 22:27:39 weiden Exp $ +/* $Id: bitblt.c,v 1.51 2004/04/10 00:58:14 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -739,8 +739,13 @@ EngStretchBlt( OutputRect.top = prclDest->top + Translate.y; OutputRect.bottom = prclDest->bottom + Translate.y; - AdjustedBrushOrigin.x = BrushOrigin->x + Translate.x; - AdjustedBrushOrigin.y = BrushOrigin->y + Translate.y; + if(BrushOrigin) + { + AdjustedBrushOrigin.x = BrushOrigin->x + Translate.x; + AdjustedBrushOrigin.y = BrushOrigin->y + Translate.y; + } + else + AdjustedBrushOrigin = Translate; if (NULL != OutputObj) { @@ -1129,8 +1134,13 @@ EngMaskBitBlt(SURFOBJ *DestObj, OutputRect.top = DestRect->top + Translate.y; OutputRect.bottom = DestRect->bottom + Translate.y; - AdjustedBrushOrigin.x = BrushOrigin->x + Translate.x; - AdjustedBrushOrigin.y = BrushOrigin->y + Translate.y; + if(BrushOrigin) + { + AdjustedBrushOrigin.x = BrushOrigin->x + Translate.x; + AdjustedBrushOrigin.y = BrushOrigin->y + Translate.y; + } + else + AdjustedBrushOrigin = Translate; if (NULL != OutputObj) { From 17abe3357c595400a1794e6fce2c0c6f3b0f10ce Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sat, 10 Apr 2004 07:37:28 +0000 Subject: [PATCH 0822/1463] - Implement FindWindowEx for case when ClassName == NULL. svn path=/trunk/; revision=9068 --- reactos/lib/user32/windows/window.c | 45 ++++++++++++++++----------- reactos/subsys/win32k/ntuser/window.c | 34 ++++++++++++++------ 2 files changed, 52 insertions(+), 27 deletions(-) diff --git a/reactos/lib/user32/windows/window.c b/reactos/lib/user32/windows/window.c index 0730e67a0b4..dc830ddbbca 100644 --- a/reactos/lib/user32/windows/window.c +++ b/reactos/lib/user32/windows/window.c @@ -1,4 +1,4 @@ -/* $Id: window.c,v 1.108 2004/04/09 20:03:15 navaraf Exp $ +/* $Id: window.c,v 1.109 2004/04/10 07:37:28 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -677,7 +677,12 @@ FindWindowExA(HWND hwndParent, UNICODE_STRING ucWindowName; HWND Result; - if (IS_ATOM(lpszClass)) + if (lpszClass == NULL) + { + ucClassName.Buffer = NULL; + ucClassName.Length = 0; + } + else if (IS_ATOM(lpszClass)) { ucClassName.Buffer = (LPWSTR)lpszClass; ucClassName.Length = 0; @@ -709,26 +714,30 @@ FindWindowExW(HWND hwndParent, LPCWSTR lpszClass, LPCWSTR lpszWindow) { - UNICODE_STRING ucClassName; - UNICODE_STRING ucWindowName; + UNICODE_STRING ucClassName; + UNICODE_STRING ucWindowName; - if (IS_ATOM(lpszClass)) - { - RtlInitUnicodeString(&ucClassName, NULL); - ucClassName.Buffer = (LPWSTR)lpszClass; - } - else - { - RtlInitUnicodeString(&ucClassName, lpszClass); - } + if (lpszClass == NULL) + { + ucClassName.Buffer = NULL; + ucClassName.Length = 0; + } + else if (IS_ATOM(lpszClass)) + { + RtlInitUnicodeString(&ucClassName, NULL); + ucClassName.Buffer = (LPWSTR)lpszClass; + } + else + { + RtlInitUnicodeString(&ucClassName, lpszClass); + } - // Window names can't be atoms, and if lpszWindow = NULL, - // RtlInitUnicodeString will clear it + // Window names can't be atoms, and if lpszWindow = NULL, + // RtlInitUnicodeString will clear it - RtlInitUnicodeString(&ucWindowName, lpszWindow); + RtlInitUnicodeString(&ucWindowName, lpszWindow); - - return NtUserFindWindowEx(hwndParent, hwndChildAfter, &ucClassName, &ucWindowName); + return NtUserFindWindowEx(hwndParent, hwndChildAfter, &ucClassName, &ucWindowName); } diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 3fcbd0ad1f5..e5daa0286da 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.210 2004/04/09 20:03:19 navaraf Exp $ +/* $Id: window.c,v 1.211 2004/04/10 07:37:28 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -2056,13 +2056,20 @@ NtUserFindWindowEx(HWND hwndParent, NTSTATUS status; HWND windowHandle; PWINDOW_OBJECT ParentWindow, WndChildAfter, WndChild; - PWNDCLASS_OBJECT classObject; + PWNDCLASS_OBJECT classObject = NULL; + + DPRINT1("NtUserFindWindowEx(%x,%x,%wZ,%wZ)\n", + hwndParent, hwndChildAfter, ucClassName, ucWindowName); // Get a pointer to the class - status = ClassReferenceClassByNameOrAtom(&classObject, ucClassName->Buffer); - if (!NT_SUCCESS(status)) + if (ucClassName->Buffer != NULL) { - return NULL; + status = ClassReferenceClassByNameOrAtom(&classObject, ucClassName->Buffer); + if (!NT_SUCCESS(status)) + { + DPRINT1("Error 1\n"); + return NULL; + } } // If hwndParent==NULL use the desktop window instead @@ -2074,7 +2081,9 @@ NtUserFindWindowEx(HWND hwndParent, if(!ParentWindow) { - ObmDereferenceObject(classObject); + if (classObject != NULL) + ObmDereferenceObject(classObject); + DPRINT1("Error 2\n"); return NULL; } @@ -2085,6 +2094,7 @@ NtUserFindWindowEx(HWND hwndParent, if (!(WndChildAfter = IntGetWindowObject(hwndChildAfter))) { SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + DPRINT1("Error 3\n"); return NULL; } @@ -2092,6 +2102,7 @@ NtUserFindWindowEx(HWND hwndParent, IntLockRelatives(WndChildAfter); if (WndChildAfter->Parent != ParentWindow->Self) { + DPRINT1("Error 4\n"); IntUnLockRelatives(WndChildAfter); SetLastWin32Error(ERROR_INVALID_PARAMETER); return NULL; @@ -2107,15 +2118,18 @@ NtUserFindWindowEx(HWND hwndParent, while (WndChild) { - if (classObject == WndChild->Class && (ucWindowName->Buffer==NULL || + if ((classObject == NULL || classObject == WndChild->Class) && + (ucWindowName->Buffer==NULL || RtlCompareUnicodeString (ucWindowName, &WndChild->WindowName, TRUE) == 0)) { windowHandle = WndChild->Self; IntUnLockRelatives(ParentWindow); IntReleaseWindowObject(ParentWindow); - ObmDereferenceObject (classObject); + if (classObject != NULL) + ObmDereferenceObject (classObject); + DPRINT1("Success: %x\n", windowHandle); return windowHandle; } @@ -2125,8 +2139,10 @@ NtUserFindWindowEx(HWND hwndParent, IntUnLockRelatives(ParentWindow); IntReleaseWindowObject(ParentWindow); - ObmDereferenceObject (classObject); + if (classObject != NULL) + ObmDereferenceObject (classObject); + DPRINT1("Not found\n"); return NULL; } From f9cb0ec833b2ca17630a0bcf56e456194fee7579 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sat, 10 Apr 2004 10:12:35 +0000 Subject: [PATCH 0823/1463] activate web bookmarks in cabinet windows svn path=/trunk/; revision=9069 --- .../system/explorer/shell/filechild.cpp | 7 ++++ .../system/explorer/shell/mainframe.cpp | 37 +++++++++++++++++-- .../subsys/system/explorer/shell/mainframe.h | 3 ++ .../system/explorer/shell/shellbrowser.cpp | 7 ++++ .../subsys/system/explorer/shell/webchild.cpp | 7 ++++ .../system/explorer/utility/shellclasses.h | 8 ++-- 6 files changed, 62 insertions(+), 7 deletions(-) diff --git a/reactos/subsys/system/explorer/shell/filechild.cpp b/reactos/subsys/system/explorer/shell/filechild.cpp index f32e21e3958..b97521934a0 100644 --- a/reactos/subsys/system/explorer/shell/filechild.cpp +++ b/reactos/subsys/system/explorer/shell/filechild.cpp @@ -523,6 +523,13 @@ LRESULT FileChildWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) } break;} + case PM_JUMP_TO: { + LPCTSTR url = (LPCTSTR)lparam; + + if (0) ///@todo + return TRUE; + break;} + default: def: return super::WndProc(nmsg, wparam, lparam); } diff --git a/reactos/subsys/system/explorer/shell/mainframe.cpp b/reactos/subsys/system/explorer/shell/mainframe.cpp index 730a5c60648..c61d0c74fdf 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.cpp +++ b/reactos/subsys/system/explorer/shell/mainframe.cpp @@ -483,7 +483,11 @@ LRESULT MainFrame::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) path = buffer; } - { + if (_tcsstr(path, TEXT("://"))) { // "http://...", "ftp://", ... + OBJ_CONTEXT("create WebChild window", path); + + return (LRESULT)GET_WINDOW(ChildWindow, create_webchildwindow(WebChildWndInfo(_hmdiclient, path))); + } else { OBJ_CONTEXT("create ShellChildWndInfo", path); // Shell Namespace as default view @@ -530,8 +534,9 @@ int MainFrame::Command(int id, int code) #ifndef _NO_MDI HWND hwndClient = (HWND) SendMessage(_hmdiclient, WM_MDIGETACTIVE, 0, 0); - if (SendMessage(hwndClient, PM_DISPATCH_COMMAND, MAKELONG(id,code), 0)) - return 0; + if (hwndClient) + if (SendMessage(hwndClient, PM_DISPATCH_COMMAND, MAKELONG(id,code), 0)) + return 0; #endif if (id>=ID_DRIVE_FIRST && id<=ID_DRIVE_FIRST+0xFF) { @@ -792,6 +797,18 @@ int MainFrame::Notify(int id, NMHDR* pnmh) } } break;} + + case NM_DBLCLK: { + HTREEITEM hitem = TreeView_GetSelection(_hsidebar); + LPARAM lparam = TreeView_GetItemData(_hsidebar, hitem); + + if (lparam) { + const BookmarkNode& node = *(BookmarkNode*)lparam; + + if (node._type == BookmarkNode::BMNT_BOOKMARK) + jump_to(node._pbookmark->_url); + } + break;} } return 0; @@ -1073,3 +1090,17 @@ void MainFrame::FillBookmarks() } #endif + + +void MainFrame::jump_to(LPCTSTR url) +{ +#ifndef _NO_MDI + HWND hwndClient = (HWND) SendMessage(_hmdiclient, WM_MDIGETACTIVE, 0, 0); + + if (hwndClient) + if (SendMessage(hwndClient, PM_JUMP_TO, 0, (LPARAM)url)) + return; +#endif + + CreateChild(url); +} diff --git a/reactos/subsys/system/explorer/shell/mainframe.h b/reactos/subsys/system/explorer/shell/mainframe.h index e3b0085b614..37b6f317571 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.h +++ b/reactos/subsys/system/explorer/shell/mainframe.h @@ -29,6 +29,8 @@ #define PM_OPEN_WINDOW (WM_APP+0x07) enum OPEN_WINDOW_MODE {OWM_EXPLORE=1, OWM_DETAILS=2, OWM_PIDL=4}; +#define PM_JUMP_TO (WM_APP+0x25) + /// Explorer frame window struct MainFrame : public PreTranslateWindow @@ -86,6 +88,7 @@ protected: void fullscreen_move(); void FillBookmarks(); + void jump_to(LPCTSTR url); HACCEL _hAccel; TCHAR _drives[BUFFER_LEN]; diff --git a/reactos/subsys/system/explorer/shell/shellbrowser.cpp b/reactos/subsys/system/explorer/shell/shellbrowser.cpp index dbf08e0cc48..c4ffaa1c856 100644 --- a/reactos/subsys/system/explorer/shell/shellbrowser.cpp +++ b/reactos/subsys/system/explorer/shell/shellbrowser.cpp @@ -419,6 +419,13 @@ LRESULT ShellBrowserChild::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) } return TRUE;} + case PM_JUMP_TO: { + LPCTSTR url = (LPCTSTR)lparam; + + if (0) ///@todo + return TRUE; + break;} + default: return super::WndProc(nmsg, wparam, lparam); } diff --git a/reactos/subsys/system/explorer/shell/webchild.cpp b/reactos/subsys/system/explorer/shell/webchild.cpp index f421eed1a57..acb6a79800e 100644 --- a/reactos/subsys/system/explorer/shell/webchild.cpp +++ b/reactos/subsys/system/explorer/shell/webchild.cpp @@ -290,6 +290,13 @@ LRESULT WebChildWindow::WndProc(UINT message, WPARAM wparam, LPARAM lparam) return TRUE;} + case PM_JUMP_TO: { + LPCTSTR url = (LPCTSTR)lparam; + + if (0) ///@todo + return TRUE; + break;} + default: return super::WndProc(message, wparam, lparam); } diff --git a/reactos/subsys/system/explorer/utility/shellclasses.h b/reactos/subsys/system/explorer/utility/shellclasses.h index d62c4d984e7..cc57e388390 100644 --- a/reactos/subsys/system/explorer/utility/shellclasses.h +++ b/reactos/subsys/system/explorer/utility/shellclasses.h @@ -569,7 +569,7 @@ struct ShellPath : public SShellPtr CONTEXT("ShellPath::ShellPath(IShellFolder*, LPCWSTR)"); if (path) - CHECKERROR(folder->ParseDisplayName(0, 0, (LPOLESTR)path, NULL, &_p, 0)); + CHECKERROR(folder->ParseDisplayName(0, NULL, (LPOLESTR)path, NULL, &_p, NULL)); else _p = NULL; } @@ -579,7 +579,7 @@ struct ShellPath : public SShellPtr OBJ_CONTEXT("ShellPath::ShellPath(LPCWSTR)", path); if (path) - CHECKERROR(GetDesktopFolder()->ParseDisplayName(0, 0, (LPOLESTR)path, NULL, &_p, 0)); + CHECKERROR(GetDesktopFolder()->ParseDisplayName(0, NULL, (LPOLESTR)path, NULL, &_p, NULL)); else _p = NULL; } @@ -592,7 +592,7 @@ struct ShellPath : public SShellPtr if (path) { MultiByteToWideChar(CP_ACP, 0, path, -1, b, MAX_PATH); - CHECKERROR(folder->ParseDisplayName(0, 0, b, NULL, &_p, 0)); + CHECKERROR(folder->ParseDisplayName(0, NULL, b, NULL, &_p, NULL)); } else _p = NULL; } @@ -605,7 +605,7 @@ struct ShellPath : public SShellPtr if (path) { MultiByteToWideChar(CP_ACP, 0, path, -1, b, MAX_PATH); - CHECKERROR(GetDesktopFolder()->ParseDisplayName(0, 0, b, NULL, &_p, 0)); + CHECKERROR(GetDesktopFolder()->ParseDisplayName(0, NULL, b, NULL, &_p, NULL)); } else _p = NULL; } From 74b7a8a0ca8ab4799f8bce18ccde5fc7ee51c247 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sat, 10 Apr 2004 12:07:11 +0000 Subject: [PATCH 0824/1463] fix toggeling of toolbar windows svn path=/trunk/; revision=9070 --- .../subsys/system/explorer/shell/mainframe.cpp | 15 ++++++++------- reactos/subsys/system/explorer/shell/mainframe.h | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/reactos/subsys/system/explorer/shell/mainframe.cpp b/reactos/subsys/system/explorer/shell/mainframe.cpp index c61d0c74fdf..7fdd3e75a18 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.cpp +++ b/reactos/subsys/system/explorer/shell/mainframe.cpp @@ -253,7 +253,6 @@ MainFrame::MainFrame(HWND hwnd) #endif -#ifdef _DEBUG // address & command bar WindowCanvas canvas(hwnd); RECT rect = {0, 0, 0, 0}; @@ -267,7 +266,6 @@ MainFrame::MainFrame(HWND hwnd) _hcommandedit = CreateWindow(TEXT("EDIT"), TEXT("> Command"), WS_CHILD|WS_VISIBLE, 0, 0, 0, rect.bottom, hwnd, (HMENU)IDW_ADDRESSBAR, g_Globals._hInstance, 0); SetWindowFont(_hcommandedit, hfont, FALSE); -#endif /* CreateStatusWindow does not accept WS_BORDER _hstatusbar = CreateWindowEx(WS_EX_NOPARENTNOTIFY, STATUSCLASSNAME, 0, @@ -605,15 +603,15 @@ int MainFrame::Command(int id, int code) #endif case ID_VIEW_TOOL_BAR: - toggle_child(_hwnd, id, _htoolbar); + toggle_child(_hwnd, id, _htoolbar, 0); break; case ID_VIEW_EXTRA_BAR: - toggle_child(_hwnd, id, _hextrabar); + toggle_child(_hwnd, id, _hextrabar, 1); break; case ID_VIEW_DRIVE_BAR: - toggle_child(_hwnd, id, _hdrivebar); + toggle_child(_hwnd, id, _hdrivebar, 2); break; case ID_VIEW_STATUSBAR: @@ -981,13 +979,16 @@ void MainFrame::fullscreen_move() } -void MainFrame::toggle_child(HWND hwnd, UINT cmd, HWND hchild) +void MainFrame::toggle_child(HWND hwnd, UINT cmd, HWND hchild, int band_idx) { BOOL vis = IsWindowVisible(hchild); CheckMenuItem(_menu_info._hMenuView, cmd, vis?MF_BYCOMMAND:MF_BYCOMMAND|MF_CHECKED); - ShowWindow(hchild, vis?SW_HIDE:SW_SHOW); + if (band_idx != -1) + SendMessage(_hwndrebar, RB_SHOWBAND, band_idx, !vis); + else + ShowWindow(hchild, vis?SW_HIDE:SW_SHOW); if (_fullscreen._mode) fullscreen_move(); diff --git a/reactos/subsys/system/explorer/shell/mainframe.h b/reactos/subsys/system/explorer/shell/mainframe.h index 37b6f317571..3840a340244 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.h +++ b/reactos/subsys/system/explorer/shell/mainframe.h @@ -76,7 +76,7 @@ protected: int Command(int id, int code); int Notify(int id, NMHDR* pnmh); - void toggle_child(HWND hwnd, UINT cmd, HWND hchild); + void toggle_child(HWND hwnd, UINT cmd, HWND hchild, int band_idx=-1); bool activate_drive_window(LPCTSTR path); bool activate_child_window(LPCTSTR filesys); From fe26854c5284df36c2c0acd9bc2bd6866c72fbc5 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sat, 10 Apr 2004 12:56:18 +0000 Subject: [PATCH 0825/1463] avoid to use return length of RegQueryValueW svn path=/trunk/; revision=9072 --- reactos/lib/shell32/shlexec.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/reactos/lib/shell32/shlexec.c b/reactos/lib/shell32/shlexec.c index ca117b2a3a3..e7ac177d9af 100644 --- a/reactos/lib/shell32/shlexec.c +++ b/reactos/lib/shell32/shlexec.c @@ -467,7 +467,6 @@ static UINT SHELL_FindExecutableByOperation(LPCWSTR lpPath, LPCWSTR lpFile, LPCW if (RegQueryValueW(HKEY_CLASSES_ROOT, filetype, command, &commandlen) == ERROR_SUCCESS) { - commandlen /= sizeof(WCHAR); if (key) strcpyW(key, filetype); #if 0 LPWSTR tmp; @@ -488,15 +487,11 @@ static UINT SHELL_FindExecutableByOperation(LPCWSTR lpPath, LPCWSTR lpFile, LPCW if (RegQueryValueW(HKEY_CLASSES_ROOT, filetype, param, ¶mlen) == ERROR_SUCCESS) { - paramlen /= sizeof(WCHAR); strcatW(command, wSpace); strcatW(command, param); - commandlen += paramlen; } #endif - command[commandlen] = '\0'; - return 33; /* FIXME see SHELL_FindExecutable() */ } @@ -623,11 +618,9 @@ UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, } /* Check registry */ - if (RegQueryValueW(HKEY_CLASSES_ROOT, extension, filetype, + if (RegQueryValueW(HKEY_CLASSES_ROOT, extension, filetype, &filetypelen) == ERROR_SUCCESS) { - filetypelen /= sizeof(WCHAR); - filetype[filetypelen] = '\0'; TRACE("File type: %s\n", debugstr_w(filetype)); } } @@ -637,7 +630,6 @@ UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, if (lpOperation) { /* pass the operation string to SHELL_FindExecutableByOperation() */ - filetype[filetypelen] = '\0'; retval = SHELL_FindExecutableByOperation(lpPath, lpFile, lpOperation, key, filetype, command, sizeof(command)); } else @@ -645,6 +637,8 @@ UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, WCHAR operation[MAX_PATH]; HKEY hkey; + filetypelen = strlenW(filetype); + /* Looking for ...buffer\shell\\command */ strcatW(filetype, wszShell); @@ -861,8 +855,6 @@ static UINT execute_from_key(LPWSTR key, LPCWSTR lpFile, void *env, LPCWSTR szCo else { /* Is there a replace() function anywhere? */ - cmdlen /= sizeof(WCHAR); - cmd[cmdlen] = '\0'; SHELL_ArgifyW(param, sizeof(param)/sizeof(WCHAR), cmd, lpFile, psei->lpIDList, szCommandline); retval = execfunc(param, env, FALSE, psei, psei_out); } @@ -1039,6 +1031,7 @@ BOOL WINAPI ShellExecuteExW32 (LPSHELLEXECUTEINFOW psei, SHELL_ExecuteW32 execfu } retval = execfunc(buffer, NULL, FALSE, &sei_tmp, psei); + if (retval > 32) return TRUE; else @@ -1125,9 +1118,9 @@ BOOL WINAPI ShellExecuteExW32 (LPSHELLEXECUTEINFOW psei, SHELL_ExecuteW32 execfu if (ExpandEnvironmentStringsW(sei_tmp.lpDirectory, buffer, MAX_PATH)) lstrcpyW(wszDir/*sei_tmp.lpDirectory*/, buffer); - /* Else, try to execute the filename */ - TRACE("execute:'%s','%s','%s'\n", debugstr_w(wszApplicationName), debugstr_w(wszCommandline), debugstr_w(wszDir)); + /* Else, try to execute the filename */ + TRACE("execute:'%s','%s,'%s''\n", debugstr_w(sei_tmp.lpFile), debugstr_w(sei_tmp.lpParameters), debugstr_w(wszDir)); /* separate out command line arguments from executable file name */ if (!*sei_tmp.lpParameters) { @@ -1199,6 +1192,7 @@ BOOL WINAPI ShellExecuteExW32 (LPSHELLEXECUTEINFOW psei, SHELL_ExecuteW32 execfu } retval = execfunc(sei_tmp.lpFile, NULL, FALSE, &sei_tmp, psei); + if (retval > 32) { /* Now, that we have successfully launched a process, we can free the PIDL. @@ -1233,7 +1227,7 @@ BOOL WINAPI ShellExecuteExW32 (LPSHELLEXECUTEINFOW psei, SHELL_ExecuteW32 execfu strcatW(wszQuotedCmd, sei_tmp.lpParameters); } - TRACE("%s/%s => %s/%s\n", debugstr_w(wszApplicationName), debugstr_w(buffer), debugstr_w(wszQuotedCmd), debugstr_w(wszProtocol)); + TRACE("%s/%s => %s/%s\n", debugstr_w(wszApplicationName), debugstr_w(sei_tmp.lpVerb), debugstr_w(wszQuotedCmd), debugstr_w(wszProtocol)); if (*wszProtocol) retval = execute_from_key(wszProtocol, lpFile, env, sei_tmp.lpParameters, execfunc, &sei_tmp, psei); From 35290117a39d6624c67410a6bf22e60c00fd8032 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sat, 10 Apr 2004 14:15:54 +0000 Subject: [PATCH 0826/1463] adjust for WINE svn path=/trunk/; revision=9073 --- reactos/subsys/system/explorer/utility/expat.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/system/explorer/utility/expat.h b/reactos/subsys/system/explorer/utility/expat.h index d6e06d1694d..b34f94ea8dd 100644 --- a/reactos/subsys/system/explorer/utility/expat.h +++ b/reactos/subsys/system/explorer/utility/expat.h @@ -46,7 +46,8 @@ #if defined(XML_USE_MSC_EXTENSIONS) #define XMLCALL __cdecl #elif defined(__GNUC__) && defined(__i386) -#define XMLCALL __attribute__((cdecl)) +//MF#define XMLCALL __attribute__((cdecl)) +#define XMLCALL//MF #else /* For any platform which uses this definition and supports more than one calling convention, we need to extend this definition to From cc1629adc6f41b5d2b307d3e3e581ed9693362e5 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 10 Apr 2004 16:05:18 +0000 Subject: [PATCH 0827/1463] Fix TAPE_GET_POSITION and TAPE_SET_POSITION structures. svn path=/trunk/; revision=9074 --- reactos/include/structs.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/reactos/include/structs.h b/reactos/include/structs.h index 7029477246b..4f67c872898 100644 --- a/reactos/include/structs.h +++ b/reactos/include/structs.h @@ -5314,8 +5314,7 @@ typedef struct _TAPE_GET_MEDIA_PARAMETERS { typedef struct _TAPE_GET_POSITION { ULONG Type; ULONG Partition; - ULONG OffsetLow; - ULONG OffsetHigh; + LARGE_INTEGER Offset; } TAPE_GET_POSITION; typedef struct _TAPE_PREPARE { @@ -5337,8 +5336,8 @@ typedef struct _TAPE_SET_MEDIA_PARAMETERS { typedef struct _TAPE_SET_POSITION { ULONG Method; ULONG Partition; - ULONG OffsetLow; - ULONG OffsetHigh; + LARGE_INTEGER Offset; + BOOLEAN Immediate; } TAPE_SET_POSITION; typedef struct _TAPE_WRITE_MARKS { From 30ed90f0b39a10e6985a3d4cafca4b70324c28b5 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sat, 10 Apr 2004 16:20:59 +0000 Subject: [PATCH 0828/1463] - Fix a stupid bug that prevented writing to pipes from working. svn path=/trunk/; revision=9075 --- reactos/drivers/fs/np/rw.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/reactos/drivers/fs/np/rw.c b/reactos/drivers/fs/np/rw.c index 29612566832..8eac2d0025d 100644 --- a/reactos/drivers/fs/np/rw.c +++ b/reactos/drivers/fs/np/rw.c @@ -1,4 +1,4 @@ -/* $Id: rw.c,v 1.10 2003/11/17 02:12:49 hyperion Exp $ +/* $Id: rw.c,v 1.11 2004/04/10 16:20:59 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -76,8 +76,6 @@ NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp) Information = 0; Buffer = MmGetSystemAddressForMdl(Irp->MdlAddress); - DPRINT("Length %d Buffer %x\n",Length,Buffer); - KeAcquireSpinLock(&ReadFcb->DataListLock, &OldIrql); while (1) { @@ -157,6 +155,18 @@ NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp) CopyLength = RtlRosMin(ReadFcb->ReadDataAvailable, Length); memcpy(Buffer, ReadFcb->Data, CopyLength); +#ifndef NDEBUG + DPRINT("Length %d Buffer %x\n",CopyLength,Buffer); + { + DbgPrint("------\n"); + ULONG X; + for (X = 0; X < CopyLength; X++) + DbgPrint("%02x ", ((PUCHAR)Buffer)[X]); + DbgPrint("\n"); + DbgPrint("------\n"); + } +#endif + Information = CopyLength; ReadFcb->ReadDataAvailable = 0; ReadFcb->WriteQuotaAvailable = ReadFcb->MaxDataLength; @@ -237,7 +247,17 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject, Status = STATUS_SUCCESS; Buffer = MmGetSystemAddressForMdl (Irp->MdlAddress); +#ifndef NDEBUG DPRINT("Length %d Buffer %x Offset %x\n",Length,Buffer,Offset); + { + DbgPrint("------\n"); + ULONG X; + for (X = 0; X < Length; X++) + DbgPrint("%02x ", Buffer[X]); + DbgPrint("\n"); + DbgPrint("------\n"); + } +#endif KeAcquireSpinLock(&Fcb->DataListLock, &OldIrql); while(1) @@ -303,7 +323,7 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject, if (Length > 0) { CopyLength = RtlRosMin(Length, Fcb->WriteQuotaAvailable); - memcpy(Buffer, Fcb->Data, CopyLength); + memcpy(Fcb->Data, Buffer, CopyLength); Information = CopyLength; Fcb->ReadDataAvailable = CopyLength; From 4a875cac1224c19344b5e70b11521d4bc4c88658 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sat, 10 Apr 2004 20:31:18 +0000 Subject: [PATCH 0829/1463] awake address bar to life svn path=/trunk/; revision=9076 --- .../system/explorer/dialogs/searchprogram.h | 2 - .../subsys/system/explorer/explorer_intres.h | 18 ++--- .../system/explorer/shell/filechild.cpp | 42 +++++------ .../subsys/system/explorer/shell/filechild.h | 3 +- .../system/explorer/shell/mainframe.cpp | 58 +++++++++----- .../subsys/system/explorer/shell/mainframe.h | 4 +- .../system/explorer/shell/shellbrowser.cpp | 56 +++++++++----- .../system/explorer/shell/shellbrowser.h | 4 +- .../subsys/system/explorer/shell/webchild.cpp | 28 +++---- .../subsys/system/explorer/shell/webchild.h | 15 ++-- .../system/explorer/taskbar/favorites.cpp | 23 +++++- .../system/explorer/taskbar/favorites.h | 3 + .../system/explorer/utility/utility.cpp | 50 +++++++++++++ .../subsys/system/explorer/utility/utility.h | 7 ++ .../subsys/system/explorer/utility/window.cpp | 75 ++++++++++++++++--- .../subsys/system/explorer/utility/window.h | 54 ++++++++++--- 16 files changed, 316 insertions(+), 126 deletions(-) diff --git a/reactos/subsys/system/explorer/dialogs/searchprogram.h b/reactos/subsys/system/explorer/dialogs/searchprogram.h index eccc07e71dd..bc39b3b2f03 100644 --- a/reactos/subsys/system/explorer/dialogs/searchprogram.h +++ b/reactos/subsys/system/explorer/dialogs/searchprogram.h @@ -27,8 +27,6 @@ // Martin Fuchs, 02.10.2003 // -#include - typedef void (*COLLECT_CALLBACK)(Entry* entry, void* param); typedef stack ShellDirectoryStack; diff --git a/reactos/subsys/system/explorer/explorer_intres.h b/reactos/subsys/system/explorer/explorer_intres.h index f872478632b..666ed944e7d 100644 --- a/reactos/subsys/system/explorer/explorer_intres.h +++ b/reactos/subsys/system/explorer/explorer_intres.h @@ -164,15 +164,15 @@ #define ID_ABOUT_WINDOWS 40002 #define ID_ABOUT_EXPLORER 40003 #define ID_DESKTOPBAR_SETTINGS 40004 -#define ID_BROWSE_BACK 40005 -#define ID_BROWSE_FORWARD 40006 -#define ID_BROWSE_HOME 40007 -#define ID_BROWSE_SEARCH 40008 -#define ID_STOP 40009 -#define ID_MINIMIZE_ALL 40010 -#define ID_EXPLORE 40011 -#define ID_TASKMGR 40012 -#define ID_BROWSE_UP 40013 +#define ID_GO_BACK 40005 +#define ID_GO_FORWARD 40006 +#define ID_GO_HOME 40007 +#define ID_GO_SEARCH 40008 +#define ID_GO_UP 40009 +#define ID_STOP 40010 +#define ID_MINIMIZE_ALL 40011 +#define ID_EXPLORE 40012 +#define ID_TASKMGR 40013 #define ID_TRAY_VOLUME 40014 #define ID_VOLUME_PROPERTIES 40015 #define ID_SHOW_HIDDEN_ICONS 40016 diff --git a/reactos/subsys/system/explorer/shell/filechild.cpp b/reactos/subsys/system/explorer/shell/filechild.cpp index b97521934a0..52454d364c5 100644 --- a/reactos/subsys/system/explorer/shell/filechild.cpp +++ b/reactos/subsys/system/explorer/shell/filechild.cpp @@ -244,10 +244,9 @@ FileChildWindow::FileChildWindow(HWND hwnd, const FileChildWndInfo& info) ///@todo scroll to visibility -} - -FileChildWindow::~FileChildWindow() -{ + // store path into history + if (*info._path) + _url_history.push(info._path); } @@ -278,7 +277,9 @@ void FileChildWindow::set_curdir(Entry* entry, HWND hwnd) SetWindowText(hwnd, _path); if (_path[0]) - if (!SetCurrentDirectory(_path)) + if (SetCurrentDirectory(_path)) + set_url(_path); //@@ use "file://" format? + else _path[0] = TEXT('\0'); } @@ -468,17 +469,11 @@ LRESULT FileChildWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) activate_entry(pane, _hwnd); break;} - case ID_BROWSE_BACK: - break;//@todo - - case ID_BROWSE_FORWARD: - break;//@todo - - case ID_BROWSE_UP: - break;//@todo - default: - return pane->command(LOWORD(wparam)); + if (pane->command(LOWORD(wparam))) + return TRUE; + else + return super::WndProc(nmsg, wparam, lparam); } return TRUE;} @@ -523,13 +518,6 @@ LRESULT FileChildWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) } break;} - case PM_JUMP_TO: { - LPCTSTR url = (LPCTSTR)lparam; - - if (0) ///@todo - return TRUE; - break;} - default: def: return super::WndProc(nmsg, wparam, lparam); } @@ -653,9 +641,15 @@ int FileChildWindow::Notify(int id, NMHDR* pnmh) } -void FileChildWindow::jump_to(LPCTSTR path) +String FileChildWindow::jump_to_int(LPCTSTR url) { + String dir, fname; -//@@ + if (SplitFileSysURL(url, dir, fname)) { + //@@jump_to(path); + return FmtString(TEXT("file://%s"), (LPCTSTR)dir); + } + + return String(); } diff --git a/reactos/subsys/system/explorer/shell/filechild.h b/reactos/subsys/system/explorer/shell/filechild.h index 2be5f5d0f08..ad752d35c8e 100644 --- a/reactos/subsys/system/explorer/shell/filechild.h +++ b/reactos/subsys/system/explorer/shell/filechild.h @@ -90,7 +90,6 @@ struct FileChildWindow : public ChildWindow typedef ChildWindow super; FileChildWindow(HWND hwnd, const FileChildWndInfo& info); - ~FileChildWindow(); static FileChildWindow* create(const FileChildWndInfo& info); @@ -100,7 +99,7 @@ protected: int Notify(int id, NMHDR* pnmh); virtual void resize_children(int cx, int cy); - virtual void jump_to(LPCTSTR path); + virtual String jump_to_int(LPCTSTR url); void scan_entry(Entry* entry, HWND hwnd); diff --git a/reactos/subsys/system/explorer/shell/mainframe.cpp b/reactos/subsys/system/explorer/shell/mainframe.cpp index 7fdd3e75a18..8f049f0642c 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.cpp +++ b/reactos/subsys/system/explorer/shell/mainframe.cpp @@ -77,11 +77,11 @@ MainFrame::MainFrame(HWND hwnd) {5, ID_... , TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, */ {0, 0, 0, BTNS_SEP, {0, 0}, 0, 0}, - {7, ID_BROWSE_BACK, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, - {8, ID_BROWSE_FORWARD, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, - {9, ID_BROWSE_UP, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, - {10, ID_BROWSE_HOME, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, - {11, ID_BROWSE_SEARCH, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, + {7, ID_GO_BACK, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, + {8, ID_GO_FORWARD, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, + {9, ID_GO_UP, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, + {10, ID_GO_HOME, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, + {11, ID_GO_SEARCH, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, {12, ID_REFRESH, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, {13, ID_STOP, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}, }; @@ -259,13 +259,15 @@ MainFrame::MainFrame(HWND hwnd) DrawText(canvas, TEXT("My"), -1, &rect, DT_SINGLELINE|DT_NOPREFIX|DT_CALCRECT); HFONT hfont = GetStockFont(DEFAULT_GUI_FONT); - _haddressedit = CreateWindow(TEXT("EDIT"), TEXT("file://C:\\"), WS_CHILD|WS_VISIBLE, 0, 0, 0, rect.bottom, + _haddressedit = CreateWindow(TEXT("EDIT"), NULL, WS_CHILD|WS_VISIBLE, 0, 0, 0, rect.bottom, hwnd, (HMENU)IDW_ADDRESSBAR, g_Globals._hInstance, 0); SetWindowFont(_haddressedit, hfont, FALSE); + new EditController(_haddressedit); - _hcommandedit = CreateWindow(TEXT("EDIT"), TEXT("> Command"), WS_CHILD|WS_VISIBLE, 0, 0, 0, rect.bottom, + _hcommandedit = CreateWindow(TEXT("EDIT"), TEXT("> "), WS_CHILD|WS_VISIBLE, 0, 0, 0, rect.bottom, hwnd, (HMENU)IDW_ADDRESSBAR, g_Globals._hInstance, 0); SetWindowFont(_hcommandedit, hfont, FALSE); + new EditController(_hcommandedit); /* CreateStatusWindow does not accept WS_BORDER _hstatusbar = CreateWindowEx(WS_EX_NOPARENTNOTIFY, STATUSCLASSNAME, 0, @@ -481,7 +483,7 @@ LRESULT MainFrame::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) path = buffer; } - if (_tcsstr(path, TEXT("://"))) { // "http://...", "ftp://", ... + if (path && _tcsstr(path, TEXT("://"))) { // "http://...", "ftp://", ... OBJ_CONTEXT("create WebChild window", path); return (LRESULT)GET_WINDOW(ChildWindow, create_webchildwindow(WebChildWndInfo(_hmdiclient, path))); @@ -513,6 +515,10 @@ LRESULT MainFrame::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) SendMessage(_hstatusbar, SB_SETTEXT, 0, lparam); break; + case PM_URL_CHANGED: + SetWindowText(_haddressedit, (LPCTSTR)lparam); + break; + default: def: #ifndef _NO_MDI return DefFrameProc(_hwnd, _hmdiclient, nmsg, wparam, lparam); @@ -747,8 +753,16 @@ int MainFrame::Command(int id, int code) break; case IDW_ADDRESSBAR: + if (code == 1) { + TCHAR url[BUFFER_LEN]; + + if (GetWindowText(_haddressedit, url, BUFFER_LEN)) + go_to(url, false); + } + break; + case IDW_COMMANDBAR: - //@@ + //@todo execute command in command bar break; default: @@ -803,8 +817,11 @@ int MainFrame::Notify(int id, NMHDR* pnmh) if (lparam) { const BookmarkNode& node = *(BookmarkNode*)lparam; - if (node._type == BookmarkNode::BMNT_BOOKMARK) - jump_to(node._pbookmark->_url); + if (node._type == BookmarkNode::BMNT_BOOKMARK) { + bool new_window = GetAsyncKeyState(VK_SHIFT)<0; + + go_to(node._pbookmark->_url, new_window); + } } break;} } @@ -1093,15 +1110,22 @@ void MainFrame::FillBookmarks() #endif -void MainFrame::jump_to(LPCTSTR url) +bool MainFrame::go_to(LPCTSTR url, bool new_window) { #ifndef _NO_MDI - HWND hwndClient = (HWND) SendMessage(_hmdiclient, WM_MDIGETACTIVE, 0, 0); + if (!new_window) { + HWND hwndClient = (HWND) SendMessage(_hmdiclient, WM_MDIGETACTIVE, 0, 0); - if (hwndClient) - if (SendMessage(hwndClient, PM_JUMP_TO, 0, (LPARAM)url)) - return; + if (hwndClient) + if (SendMessage(hwndClient, PM_JUMP_TO_URL, 0, (LPARAM)url)) + return true; + } + + if (CreateChild(url)) + return true; +#else + ///@todo SDI implementation #endif - CreateChild(url); + return false; } diff --git a/reactos/subsys/system/explorer/shell/mainframe.h b/reactos/subsys/system/explorer/shell/mainframe.h index 3840a340244..c1564dd2d9a 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.h +++ b/reactos/subsys/system/explorer/shell/mainframe.h @@ -29,8 +29,6 @@ #define PM_OPEN_WINDOW (WM_APP+0x07) enum OPEN_WINDOW_MODE {OWM_EXPLORE=1, OWM_DETAILS=2, OWM_PIDL=4}; -#define PM_JUMP_TO (WM_APP+0x25) - /// Explorer frame window struct MainFrame : public PreTranslateWindow @@ -88,7 +86,7 @@ protected: void fullscreen_move(); void FillBookmarks(); - void jump_to(LPCTSTR url); + bool go_to(LPCTSTR url, bool new_window); HACCEL _hAccel; TCHAR _drives[BUFFER_LEN]; diff --git a/reactos/subsys/system/explorer/shell/shellbrowser.cpp b/reactos/subsys/system/explorer/shell/shellbrowser.cpp index c4ffaa1c856..48ace218c3b 100644 --- a/reactos/subsys/system/explorer/shell/shellbrowser.cpp +++ b/reactos/subsys/system/explorer/shell/shellbrowser.cpp @@ -42,6 +42,10 @@ ShellBrowserChild::ShellBrowserChild(HWND hwnd, const ShellChildWndInfo& info) _pDropTarget = NULL; _himlSmall = 0; _last_sel = 0; + + // store path into history + if (*info._path) + _url_history.push(info._path); } ShellBrowserChild::~ShellBrowserChild() @@ -346,6 +350,19 @@ void ShellBrowserChild::OnTreeItemSelected(int idCtrl, LPNMTREEVIEW pnmtv) return; } + TCHAR path[MAX_PATH]; + + if (entry->get_path(path)) { + String url; + + if (path[0] == ':') + url.printf(TEXT("shell://%s"), path); + else + url.printf(TEXT("file://%s"), path); + + set_url(url); + } + UpdateFolderView(folder); } } @@ -405,27 +422,15 @@ LRESULT ShellBrowserChild::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) ShellBrowserChild::create(_create_info); break;} - case ID_BROWSE_BACK: - break;//@todo - - case ID_BROWSE_FORWARD: - break;//@todo - - case ID_BROWSE_UP: - break;//@todo + case ID_REFRESH: + //@todo refresh shell child + break; default: - return FALSE; + return super::WndProc(nmsg, wparam, lparam); } return TRUE;} - case PM_JUMP_TO: { - LPCTSTR url = (LPCTSTR)lparam; - - if (0) ///@todo - return TRUE; - break;} - default: return super::WndProc(nmsg, wparam, lparam); } @@ -514,16 +519,27 @@ bool ShellBrowserChild::expand_folder(ShellDirectory* entry) } -void ShellBrowserChild::jump_to(LPCTSTR path) +String ShellBrowserChild::jump_to_int(LPCTSTR url) { - ///@todo implement "file://", ... parsing - jump_to(ShellPath(path)); + String dir, fname; + + if (!_tcsnicmp(url, TEXT("shell://"), 8)) { + if (jump_to_pidl(ShellPath(url+8))) + return url; + } + + if (SplitFileSysURL(url, dir, fname)) + if (jump_to_pidl(ShellPath(dir))) + return FmtString(TEXT("file://%s"), (LPCTSTR)dir); + + return String(); } -void ShellBrowserChild::jump_to(LPCITEMIDLIST pidl) +bool ShellBrowserChild::jump_to_pidl(LPCITEMIDLIST pidl) { //@@ + return false; } diff --git a/reactos/subsys/system/explorer/shell/shellbrowser.h b/reactos/subsys/system/explorer/shell/shellbrowser.h index 55aaafe392a..dbb80fa54bf 100644 --- a/reactos/subsys/system/explorer/shell/shellbrowser.h +++ b/reactos/subsys/system/explorer/shell/shellbrowser.h @@ -125,8 +125,8 @@ protected: int InsertSubitems(HTREEITEM hParentItem, Entry* entry, IShellFolder* pParentFolder); bool InitDragDrop(); - virtual void jump_to(LPCTSTR path); - void jump_to(LPCITEMIDLIST pidl); + virtual String jump_to_int(LPCTSTR url); + bool jump_to_pidl(LPCITEMIDLIST pidl); HRESULT OnDefaultCommand(LPIDA pida); diff --git a/reactos/subsys/system/explorer/shell/webchild.cpp b/reactos/subsys/system/explorer/shell/webchild.cpp index acb6a79800e..ac5c84d5675 100644 --- a/reactos/subsys/system/explorer/shell/webchild.cpp +++ b/reactos/subsys/system/explorer/shell/webchild.cpp @@ -228,10 +228,10 @@ WebChildWindow::WebChildWindow(HWND hwnd, const WebChildWndInfo& info) } } -LRESULT WebChildWindow::WndProc(UINT message, WPARAM wparam, LPARAM lparam) +LRESULT WebChildWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) { try { - switch(message) { + switch(nmsg) { case WM_ERASEBKGND: if (!_control) { HDC hdc = (HDC)wparam; @@ -252,23 +252,23 @@ LRESULT WebChildWindow::WndProc(UINT message, WPARAM wparam, LPARAM lparam) HRESULT hr = E_FAIL; switch(LOWORD(wparam)) { - case ID_BROWSE_BACK: + case ID_GO_BACK: hr = _control->GoBack(); break; - case ID_BROWSE_FORWARD: + case ID_GO_FORWARD: hr = _control->GoForward(); break; - case ID_BROWSE_UP: + case ID_GO_UP: ///@todo break; - case ID_BROWSE_HOME: + case ID_GO_HOME: hr = _control->GoHome(); break; - case ID_BROWSE_SEARCH: + case ID_GO_SEARCH: hr = _control->GoSearch(); break; @@ -281,7 +281,7 @@ LRESULT WebChildWindow::WndProc(UINT message, WPARAM wparam, LPARAM lparam) break; default: - return FALSE; + return super::WndProc(nmsg, wparam, lparam); } if (FAILED(hr) && hr!=E_FAIL) @@ -290,15 +290,8 @@ LRESULT WebChildWindow::WndProc(UINT message, WPARAM wparam, LPARAM lparam) return TRUE;} - case PM_JUMP_TO: { - LPCTSTR url = (LPCTSTR)lparam; - - if (0) ///@todo - return TRUE; - break;} - default: - return super::WndProc(message, wparam, lparam); + return super::WndProc(nmsg, wparam, lparam); } } catch(COMException& e) { HandleException(e, _hwnd); @@ -308,9 +301,10 @@ LRESULT WebChildWindow::WndProc(UINT message, WPARAM wparam, LPARAM lparam) } -void WebChildWindow::jump_to(LPCTSTR path) +String WebChildWindow::jump_to_int(LPCTSTR url) { //@@ + return String(); } diff --git a/reactos/subsys/system/explorer/shell/webchild.h b/reactos/subsys/system/explorer/shell/webchild.h index fb7174d40c2..c130a9861ae 100644 --- a/reactos/subsys/system/explorer/shell/webchild.h +++ b/reactos/subsys/system/explorer/shell/webchild.h @@ -422,15 +422,15 @@ template struct IPCtrlWindow : public BASE } protected: - LRESULT WndProc(UINT message, WPARAM wparam, LPARAM lparam) + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) { - if (message == WM_SIZE) { + if (nmsg == WM_SIZE) { if (_in_place_object) { RECT rect = {0, 0, LOWORD(lparam), HIWORD(lparam)}; _in_place_object->SetObjectRects(&rect, &rect); } - } else if (message == WM_CLOSE) { + } else if (nmsg == WM_CLOSE) { _in_place_object = NULL; if (_control) { @@ -439,7 +439,7 @@ protected: } } - return super::WndProc(message, wparam, lparam); + return super::WndProc(nmsg, wparam, lparam); } ComInit _usingCOM; @@ -922,8 +922,9 @@ struct WebChildWindow : public IPCtrlWindow void NavigateComplete2(IDispatch* pDisp, const Variant& url) { - //String adr = (BStr)url; web_super::NavigateComplete2(pDisp, url); + + set_url(String(BStr(url))); } void StatusTextChange(const BStr& text) @@ -1074,7 +1075,7 @@ protected: BrowserNavigator _navigator; auto_ptr _connector; - LRESULT WndProc(UINT message, WPARAM wparam, LPARAM lparam); + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); - virtual void jump_to(LPCTSTR path); + virtual String jump_to_int(LPCTSTR url); }; diff --git a/reactos/subsys/system/explorer/taskbar/favorites.cpp b/reactos/subsys/system/explorer/taskbar/favorites.cpp index ab0b6ffc89c..d89e8f41efc 100644 --- a/reactos/subsys/system/explorer/taskbar/favorites.cpp +++ b/reactos/subsys/system/explorer/taskbar/favorites.cpp @@ -34,6 +34,25 @@ #include "startmenu.h" +String DecodeURLString(const char* s) +{ + TCHAR buffer[BUFFER_LEN]; + LPTSTR o = buffer; + + for(const char* p=s; *p; ++p) + if (*p == '%') { + if (!strncmp(p+1, "20", 2)) { + *o++ = ' '; + p += 2; + } else + *o++ = *p; + } else + *o++ = *p; + + return String(buffer, o-buffer); +} + + /// read .URL file bool Bookmark::read_url(LPCTSTR path) { @@ -57,9 +76,9 @@ bool Bookmark::read_url(LPCTSTR path) ++cont; if (!strnicmp(keyword, "URL", 3)) - _url = cont; + _url = DecodeURLString(cont); else if (!strnicmp(keyword, "IconFile", 8)) - _icon_path = cont; + _icon_path = DecodeURLString(cont); } } diff --git a/reactos/subsys/system/explorer/taskbar/favorites.h b/reactos/subsys/system/explorer/taskbar/favorites.h index 4c589343937..4d139ee0d1d 100644 --- a/reactos/subsys/system/explorer/taskbar/favorites.h +++ b/reactos/subsys/system/explorer/taskbar/favorites.h @@ -26,6 +26,9 @@ // +extern String DecodeURLString(const char* s); + + struct Bookmark { Bookmark() : _icon_idx(0) {} diff --git a/reactos/subsys/system/explorer/utility/utility.cpp b/reactos/subsys/system/explorer/utility/utility.cpp index 06fa618bd2d..afc646c2d80 100644 --- a/reactos/subsys/system/explorer/utility/utility.cpp +++ b/reactos/subsys/system/explorer/utility/utility.cpp @@ -352,3 +352,53 @@ DWORD RegGetDWORDValue(HKEY root, LPCTSTR path, LPCTSTR valueName, DWORD def) } else return def; } + + +BOOL exists_path(LPCTSTR path) +{ + WIN32_FIND_DATA fd; + + HANDLE hfind = FindFirstFile(path, &fd); + + if (hfind != INVALID_HANDLE_VALUE) { + FindClose(hfind); + + return TRUE; + } else + return FALSE; +} + + +bool SplitFileSysURL(LPCTSTR url, String& dir_out, String& fname_out) +{ + if (!_tcsnicmp(url, TEXT("file://"), 7)) { + url += 7; + + // remove third slash in front of drive characters + if (*url == '/') + ++url; + } + + if (exists_path(url)) { + TCHAR path[_MAX_PATH]; + + // convert slashes to back slashes + GetFullPathName(url, _MAX_PATH, path, NULL); + + if (GetFileAttributes(path) & FILE_ATTRIBUTE_DIRECTORY) + fname_out.erase(); + else { + TCHAR drv[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT]; + + _tsplitpath(path, drv, dir, fname, ext); + _stprintf(path, TEXT("%s%s"), drv, dir); + + fname_out.printf(TEXT("%s%s"), fname, ext); + } + + dir_out = path; + + return true; + } else + return false; +} diff --git a/reactos/subsys/system/explorer/utility/utility.h b/reactos/subsys/system/explorer/utility/utility.h index 8ffaafe1da2..19ac76251b6 100644 --- a/reactos/subsys/system/explorer/utility/utility.h +++ b/reactos/subsys/system/explorer/utility/utility.h @@ -152,6 +152,9 @@ BOOL RecursiveCreateDirectory(LPCTSTR path_in); // read DWORD value from registry DWORD RegGetDWORDValue(HKEY root, LPCTSTR path, LPCTSTR valueName, DWORD def); + // test for existing directory +BOOL exists_path(LPCTSTR path); + #ifdef __cplusplus } // extern "C" @@ -173,6 +176,7 @@ using namespace std; #include #include #include +#include #include @@ -1006,4 +1010,7 @@ protected: #define OBJ_CONTEXT(c, o) Context __ctx__(c, o); +extern bool SplitFileSysURL(LPCTSTR url, String& dir_out, String& fname_out); + + #endif // __cplusplus diff --git a/reactos/subsys/system/explorer/utility/window.cpp b/reactos/subsys/system/explorer/utility/window.cpp index 759d6c8ef45..75f96102f40 100644 --- a/reactos/subsys/system/explorer/utility/window.cpp +++ b/reactos/subsys/system/explorer/utility/window.cpp @@ -31,6 +31,7 @@ #include "window.h" #include "../globals.h" +#include "../explorer_intres.h" // for ID_GO_BACK, ... WindowClass::WindowClass(LPCTSTR classname, UINT style_, WNDPROC wndproc) @@ -491,14 +492,46 @@ LRESULT ChildWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) } break; - case PM_DISPATCH_COMMAND: - return FALSE; + case PM_DISPATCH_COMMAND: + switch(LOWORD(wparam)) { + case ID_GO_BACK: + if (!_url_history.empty()) { + const String& url = jump_to_int(_url_history.top()); + + if (jump_to_int(url)) + set_url(url); + + _url_history.pop(); + } + break; + + case ID_GO_FORWARD: + //@@ + break; + + case ID_GO_UP: + ///@todo + break; + + case ID_GO_HOME: + //@@ + break; + + default: + return FALSE; + } + return TRUE; case WM_MDIACTIVATE: - if ((HWND)lparam == _hwnd) + if ((HWND)lparam == _hwnd) { SendMessage(_hwndFrame, PM_SETSTATUSTEXT, 0, (LPARAM)_statusText.c_str()); + SendMessage(_hwndFrame, PM_URL_CHANGED, 0, (LPARAM)_url.c_str()); + } break; + case PM_JUMP_TO_URL: + return go_to((LPCTSTR)lparam)? TRUE: FALSE; + default: def: return DefMDIChildProc(_hwnd, nmsg, wparam, lparam); } @@ -533,6 +566,30 @@ void ChildWindow::resize_children(int cx, int cy) } +bool ChildWindow::go_to(LPCTSTR url) +{ + const String& url_str = jump_to_int(url); + + if (!url_str.empty()) { + set_url(url_str); + + _url_history.push(url_str); + + return true; + } else + return false; +} + +void ChildWindow::set_url(LPCTSTR url) +{ + if (_url != url) { + _url = url; + + SendMessage(_hwndFrame, PM_URL_CHANGED, 0, (LPARAM)url); + } +} + + WindowSet Window::s_pretranslate_windows; void Window::register_pretranslate(HWND hwnd) @@ -813,13 +870,13 @@ Button::Button(HWND parent, LPCTSTR title, int left, int top, int width, int hei } -LRESULT OwnerdrawnButton::WndProc(UINT message, WPARAM wparam, LPARAM lparam) +LRESULT OwnerdrawnButton::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) { - if (message == PM_DISPATCH_DRAWITEM) { + if (nmsg == PM_DISPATCH_DRAWITEM) { DrawItem((LPDRAWITEMSTRUCT)lparam); return TRUE; } else - return super::WndProc(message, wparam, lparam); + return super::WndProc(nmsg, wparam, lparam); } @@ -1170,9 +1227,9 @@ HyperlinkCtrl::~HyperlinkCtrl() DeleteObject(_hfont); } -LRESULT HyperlinkCtrl::WndProc(UINT message, WPARAM wparam, LPARAM lparam) +LRESULT HyperlinkCtrl::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) { - switch(message) { + switch(nmsg) { case PM_DISPATCH_CTLCOLOR: { if (!_hfont) { HFONT hfont = (HFONT) SendMessage(_hwnd, WM_GETFONT, 0, 0); @@ -1208,7 +1265,7 @@ LRESULT HyperlinkCtrl::WndProc(UINT message, WPARAM wparam, LPARAM lparam) return 0; default: - return super::WndProc(message, wparam, lparam); + return super::WndProc(nmsg, wparam, lparam); } } diff --git a/reactos/subsys/system/explorer/utility/window.h b/reactos/subsys/system/explorer/utility/window.h index 82318b108fe..841ac768db3 100644 --- a/reactos/subsys/system/explorer/utility/window.h +++ b/reactos/subsys/system/explorer/utility/window.h @@ -295,11 +295,13 @@ struct ChildWindow : public Window static ChildWindow* create(const ChildWndInfo& info, const RECT& rect, CREATORFUNC_INFO creator, LPCTSTR classname, LPCTSTR title=NULL); + bool go_to(LPCTSTR url); + protected: LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); virtual void resize_children(int cx, int cy); - virtual void jump_to(LPCTSTR path) = 0; + virtual String jump_to_int(LPCTSTR url) = 0; protected: MenuInfo*_menu_info; @@ -313,6 +315,11 @@ protected: HWND _hwndFrame; String _statusText; + String _url; + + stack _url_history; + + void set_url(LPCTSTR url); }; #define PM_SETSTATUSTEXT (WM_APP+0x1E) @@ -379,6 +386,8 @@ protected: #define PM_FRM_CALC_CLIENT (WM_APP+0x03) #define Frame_CalcFrameClient(hwnd, prt) ((BOOL)SNDMSG(hwnd, PM_FRM_CALC_CLIENT, 0, (LPARAM)(PRECT)prt)) +#define PM_JUMP_TO_URL (WM_APP+0x25) +#define PM_URL_CHANGED (WM_APP+0x26) struct PropSheetPage : public PROPSHEETPAGE @@ -512,9 +521,9 @@ template struct ResizeController : public BASE { } - LRESULT WndProc(UINT message, WPARAM wparam, LPARAM lparam) + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) { - switch(message) { + switch(nmsg) { case PM_FRM_CALC_CLIENT: GetClientSpace((PRECT)lparam); return TRUE; @@ -529,7 +538,7 @@ template struct ResizeController : public BASE goto def; default: def: - return super::WndProc(message, wparam, lparam); + return super::WndProc(nmsg, wparam, lparam); } } @@ -775,9 +784,9 @@ struct ColorStatic : public SubclassedWindow } protected: - LRESULT WndProc(UINT message, WPARAM wparam, LPARAM lparam) + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) { - if (message == PM_DISPATCH_CTLCOLOR) { + if (nmsg == PM_DISPATCH_CTLCOLOR) { HDC hdc = (HDC) wparam; SetTextColor(hdc, _textColor); @@ -792,7 +801,7 @@ protected: return (LRESULT)GetStockBrush(HOLLOW_BRUSH); } } else - return super::WndProc(message, wparam, lparam); + return super::WndProc(nmsg, wparam, lparam); } COLORREF _textColor; @@ -820,7 +829,7 @@ protected: HFONT _hfont; HCURSOR _crsr_link; - LRESULT WndProc(UINT message, WPARAM wparam, LPARAM lparam); + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); void init(); @@ -1036,9 +1045,9 @@ template struct TrayIconControllerTemplate : public BASE { } - LRESULT WndProc(UINT message, WPARAM wparam, LPARAM lparam) + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) { - if (message == PM_TRAYICON) { + if (nmsg == PM_TRAYICON) { switch(lparam) { case WM_MOUSEMOVE: TrayMouseOver(wparam); @@ -1070,11 +1079,11 @@ template struct TrayIconControllerTemplate : public BASE } return 0; - } else if (message == WM_TASKBARCREATED) { + } else if (nmsg == WM_TASKBARCREATED) { AddTrayIcons(); return 0; } else - return super::WndProc(message, wparam, lparam); + return super::WndProc(nmsg, wparam, lparam); } virtual void AddTrayIcons() = 0; @@ -1085,3 +1094,24 @@ template struct TrayIconControllerTemplate : public BASE protected: const UINT WM_TASKBARCREATED; }; + + +struct EditController : public SubclassedWindow +{ + typedef SubclassedWindow super; + + EditController(HWND hwnd) + : super(hwnd) + { + } + +protected: + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) + { + if (nmsg==WM_KEYDOWN && wparam==VK_RETURN) { + SendParent(WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(_hwnd),1), (LPARAM)_hwnd); + return 0; + } else + return super::WndProc(nmsg, wparam, lparam); + } +}; From dbb520a63f0c6053c29468f7412dbe75f06f23b4 Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes Date: Sat, 10 Apr 2004 22:36:07 +0000 Subject: [PATCH 0830/1463] indent using astyle v1.15.3: astyle --style=ansi -c -s3 -S --convert-tabs %1 svn path=/trunk/; revision=9077 --- reactos/ntoskrnl/mm/anonmem.c | 1106 +++--- reactos/ntoskrnl/mm/aspace.c | 80 +- reactos/ntoskrnl/mm/balance.c | 538 +-- reactos/ntoskrnl/mm/cont.c | 300 +- reactos/ntoskrnl/mm/drvlck.c | 35 +- reactos/ntoskrnl/mm/freelist.c | 1199 +++--- reactos/ntoskrnl/mm/i386/page.c | 1340 +++---- reactos/ntoskrnl/mm/i386/pfault.c | 92 +- reactos/ntoskrnl/mm/iospace.c | 167 +- reactos/ntoskrnl/mm/kmap.c | 104 +- reactos/ntoskrnl/mm/marea.c | 700 ++-- reactos/ntoskrnl/mm/mdl.c | 615 ++-- reactos/ntoskrnl/mm/mm.c | 524 +-- reactos/ntoskrnl/mm/mminit.c | 396 +- reactos/ntoskrnl/mm/mpw.c | 136 +- reactos/ntoskrnl/mm/ncache.c | 132 +- reactos/ntoskrnl/mm/npool.c | 2194 +++++------ reactos/ntoskrnl/mm/pagefile.c | 1128 +++--- reactos/ntoskrnl/mm/pageop.c | 330 +- reactos/ntoskrnl/mm/pager.c | 91 +- reactos/ntoskrnl/mm/pagfault.c | 14 +- reactos/ntoskrnl/mm/pool.c | 121 +- reactos/ntoskrnl/mm/ppool.c | 656 ++-- reactos/ntoskrnl/mm/region.c | 404 ++- reactos/ntoskrnl/mm/rmap.c | 571 +-- reactos/ntoskrnl/mm/section.c | 5644 +++++++++++++++-------------- reactos/ntoskrnl/mm/slab.c | 387 +- reactos/ntoskrnl/mm/virtual.c | 662 ++-- reactos/ntoskrnl/mm/wset.c | 36 +- 29 files changed, 9925 insertions(+), 9777 deletions(-) diff --git a/reactos/ntoskrnl/mm/anonmem.c b/reactos/ntoskrnl/mm/anonmem.c index d01162cd205..05b9ce4c144 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.26 2004/03/07 17:48:41 arty Exp $ +/* $Id: anonmem.c,v 1.27 2004/04/10 22:35:25 gdalsnes Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/anonmem.c @@ -38,96 +38,96 @@ /* FUNCTIONS *****************************************************************/ -NTSTATUS +NTSTATUS MmWritePageVirtualMemory(PMADDRESS_SPACE AddressSpace, - PMEMORY_AREA MemoryArea, - PVOID Address, - PMM_PAGEOP PageOp) + PMEMORY_AREA MemoryArea, + PVOID Address, + PMM_PAGEOP PageOp) { - SWAPENTRY SwapEntry; - LARGE_INTEGER PhysicalAddress; - PMDL Mdl; - NTSTATUS Status; + SWAPENTRY SwapEntry; + LARGE_INTEGER PhysicalAddress; + PMDL Mdl; + NTSTATUS Status; - /* - * Check for paging out from a deleted virtual memory area. - */ - if (MemoryArea->DeleteInProgress) - { + /* + * Check for paging out from a deleted virtual memory area. + */ + if (MemoryArea->DeleteInProgress) + { PageOp->Status = STATUS_UNSUCCESSFUL; KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); MmReleasePageOp(PageOp); return(STATUS_UNSUCCESSFUL); - } + } - PhysicalAddress = - MmGetPhysicalAddressForProcess(AddressSpace->Process, Address); + PhysicalAddress = + MmGetPhysicalAddressForProcess(AddressSpace->Process, Address); - /* - * Get that the page actually is dirty. - */ - if (!MmIsDirtyPage(MemoryArea->Process, Address)) - { + /* + * Get that the page actually is dirty. + */ + if (!MmIsDirtyPage(MemoryArea->Process, Address)) + { PageOp->Status = STATUS_SUCCESS; KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); MmReleasePageOp(PageOp); return(STATUS_SUCCESS); - } + } - /* - * Speculatively set the mapping to clean. - */ - MmSetCleanPage(MemoryArea->Process, Address); - - /* - * If necessary, allocate an entry in the paging file for this page - */ - SwapEntry = MmGetSavedSwapEntryPage(PhysicalAddress); - if (SwapEntry == 0) - { + /* + * Speculatively set the mapping to clean. + */ + MmSetCleanPage(MemoryArea->Process, Address); + + /* + * If necessary, allocate an entry in the paging file for this page + */ + SwapEntry = MmGetSavedSwapEntryPage(PhysicalAddress); + if (SwapEntry == 0) + { SwapEntry = MmAllocSwapPage(); if (SwapEntry == 0) - { - MmSetDirtyPage(MemoryArea->Process, Address); - PageOp->Status = STATUS_PAGEFILE_QUOTA_EXCEEDED; - KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); - MmReleasePageOp(PageOp); - return(STATUS_PAGEFILE_QUOTA_EXCEEDED); - } - } + { + MmSetDirtyPage(MemoryArea->Process, Address); + PageOp->Status = STATUS_PAGEFILE_QUOTA_EXCEEDED; + KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); + MmReleasePageOp(PageOp); + return(STATUS_PAGEFILE_QUOTA_EXCEEDED); + } + } - /* - * Write the page to the pagefile - */ - Mdl = MmCreateMdl(NULL, NULL, PAGE_SIZE); - MmBuildMdlFromPages(Mdl, (PULONG)&PhysicalAddress); - Status = MmWriteToSwapPage(SwapEntry, Mdl); - if (!NT_SUCCESS(Status)) - { - DPRINT1("MM: Failed to write to swap page (Status was 0x%.8X)\n", - Status); + /* + * Write the page to the pagefile + */ + Mdl = MmCreateMdl(NULL, NULL, PAGE_SIZE); + MmBuildMdlFromPages(Mdl, (PULONG)&PhysicalAddress); + Status = MmWriteToSwapPage(SwapEntry, Mdl); + if (!NT_SUCCESS(Status)) + { + DPRINT1("MM: Failed to write to swap page (Status was 0x%.8X)\n", + Status); MmSetDirtyPage(MemoryArea->Process, Address); PageOp->Status = STATUS_UNSUCCESSFUL; KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); MmReleasePageOp(PageOp); return(STATUS_UNSUCCESSFUL); - } - - /* - * Otherwise we have succeeded. - */ - MmSetSavedSwapEntryPage(PhysicalAddress, SwapEntry); - PageOp->Status = STATUS_SUCCESS; - KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); - MmReleasePageOp(PageOp); - return(STATUS_SUCCESS); + } + + /* + * Otherwise we have succeeded. + */ + MmSetSavedSwapEntryPage(PhysicalAddress, SwapEntry); + PageOp->Status = STATUS_SUCCESS; + KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); + MmReleasePageOp(PageOp); + return(STATUS_SUCCESS); } -NTSTATUS +NTSTATUS MmPageOutVirtualMemory(PMADDRESS_SPACE AddressSpace, - PMEMORY_AREA MemoryArea, - PVOID Address, - PMM_PAGEOP PageOp) + PMEMORY_AREA MemoryArea, + PVOID Address, + PMM_PAGEOP PageOp) { PHYSICAL_ADDRESS PhysicalAddress; BOOL WasDirty; @@ -136,67 +136,67 @@ MmPageOutVirtualMemory(PMADDRESS_SPACE AddressSpace, PMDL Mdl; DPRINT("MmPageOutVirtualMemory(Address 0x%.8X) PID %d\n", - Address, MemoryArea->Process->UniqueProcessId); + Address, MemoryArea->Process->UniqueProcessId); /* * Check for paging out from a deleted virtual memory area. */ if (MemoryArea->DeleteInProgress) - { - PageOp->Status = STATUS_UNSUCCESSFUL; - KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); - MmReleasePageOp(PageOp); - return(STATUS_UNSUCCESSFUL); - } + { + PageOp->Status = STATUS_UNSUCCESSFUL; + KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); + MmReleasePageOp(PageOp); + return(STATUS_UNSUCCESSFUL); + } /* * Disable the virtual mapping. */ MmDisableVirtualMapping(MemoryArea->Process, Address, - &WasDirty, &PhysicalAddress); + &WasDirty, &PhysicalAddress); if (PhysicalAddress.QuadPart == 0) - { - KEBUGCHECK(0); - } + { + KEBUGCHECK(0); + } /* * Paging out non-dirty data is easy. */ if (!WasDirty) - { - MmDeleteVirtualMapping(MemoryArea->Process, Address, FALSE, NULL, NULL); - MmDeleteAllRmaps(PhysicalAddress, NULL, NULL); - if ((SwapEntry = MmGetSavedSwapEntryPage(PhysicalAddress)) != 0) - { - MmCreatePageFileMapping(MemoryArea->Process, Address, SwapEntry); - MmSetSavedSwapEntryPage(PhysicalAddress, 0); - } - MmReleasePageMemoryConsumer(MC_USER, PhysicalAddress); - PageOp->Status = STATUS_SUCCESS; - KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); - MmReleasePageOp(PageOp); - return(STATUS_SUCCESS); - } + { + MmDeleteVirtualMapping(MemoryArea->Process, Address, FALSE, NULL, NULL); + MmDeleteAllRmaps(PhysicalAddress, NULL, NULL); + if ((SwapEntry = MmGetSavedSwapEntryPage(PhysicalAddress)) != 0) + { + MmCreatePageFileMapping(MemoryArea->Process, Address, SwapEntry); + MmSetSavedSwapEntryPage(PhysicalAddress, 0); + } + MmReleasePageMemoryConsumer(MC_USER, PhysicalAddress); + PageOp->Status = STATUS_SUCCESS; + KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); + MmReleasePageOp(PageOp); + return(STATUS_SUCCESS); + } /* * If necessary, allocate an entry in the paging file for this page */ SwapEntry = MmGetSavedSwapEntryPage(PhysicalAddress); if (SwapEntry == 0) - { - SwapEntry = MmAllocSwapPage(); - if (SwapEntry == 0) - { - MmShowOutOfSpaceMessagePagingFile(); - MmEnableVirtualMapping(MemoryArea->Process, Address); - PageOp->Status = STATUS_UNSUCCESSFUL; - KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); - MmReleasePageOp(PageOp); - return(STATUS_PAGEFILE_QUOTA); - } - } - + { + SwapEntry = MmAllocSwapPage(); + if (SwapEntry == 0) + { + MmShowOutOfSpaceMessagePagingFile(); + MmEnableVirtualMapping(MemoryArea->Process, Address); + PageOp->Status = STATUS_UNSUCCESSFUL; + KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); + MmReleasePageOp(PageOp); + return(STATUS_PAGEFILE_QUOTA); + } + } + /* * Write the page to the pagefile */ @@ -204,15 +204,15 @@ MmPageOutVirtualMemory(PMADDRESS_SPACE AddressSpace, MmBuildMdlFromPages(Mdl, (ULONG *)&PhysicalAddress.u.LowPart); Status = MmWriteToSwapPage(SwapEntry, Mdl); if (!NT_SUCCESS(Status)) - { - DPRINT1("MM: Failed to write to swap page (Status was 0x%.8X)\n", - Status); - MmEnableVirtualMapping(MemoryArea->Process, Address); - PageOp->Status = STATUS_UNSUCCESSFUL; - KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); - MmReleasePageOp(PageOp); - return(STATUS_UNSUCCESSFUL); - } + { + DPRINT1("MM: Failed to write to swap page (Status was 0x%.8X)\n", + Status); + MmEnableVirtualMapping(MemoryArea->Process, Address); + PageOp->Status = STATUS_UNSUCCESSFUL; + KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); + MmReleasePageOp(PageOp); + return(STATUS_UNSUCCESSFUL); + } /* * Otherwise we have succeeded, free the page @@ -231,9 +231,9 @@ MmPageOutVirtualMemory(PMADDRESS_SPACE AddressSpace, NTSTATUS MmNotPresentFaultVirtualMemory(PMADDRESS_SPACE AddressSpace, - MEMORY_AREA* MemoryArea, - PVOID Address, - BOOLEAN Locked) + MEMORY_AREA* MemoryArea, + PVOID Address, + BOOLEAN Locked) /* * FUNCTION: Move data into memory to satisfy a page not present fault * ARGUMENTS: @@ -248,118 +248,118 @@ MmNotPresentFaultVirtualMemory(PMADDRESS_SPACE AddressSpace, NTSTATUS Status; PMM_REGION Region; PMM_PAGEOP PageOp; - + /* * There is a window between taking the page fault and locking the * address space when another thread could load the page so we check * that. */ if (MmIsPagePresent(NULL, Address)) - { - if (Locked) - { - MmLockPage(MmGetPhysicalAddressForProcess(NULL, Address)); - } - return(STATUS_SUCCESS); - } + { + if (Locked) + { + MmLockPage(MmGetPhysicalAddressForProcess(NULL, Address)); + } + return(STATUS_SUCCESS); + } /* * Check for the virtual memory area being deleted. */ if (MemoryArea->DeleteInProgress) - { - return(STATUS_UNSUCCESSFUL); - } + { + return(STATUS_UNSUCCESSFUL); + } /* * Get the segment corresponding to the virtual address */ - Region = MmFindRegion(MemoryArea->BaseAddress, - &MemoryArea->Data.VirtualMemoryData.RegionListHead, - Address, NULL); + Region = MmFindRegion(MemoryArea->BaseAddress, + &MemoryArea->Data.VirtualMemoryData.RegionListHead, + Address, NULL); if (Region->Type == MEM_RESERVE || Region->Protect == PAGE_NOACCESS) - { - return(STATUS_ACCESS_VIOLATION); - } + { + return(STATUS_ACCESS_VIOLATION); + } /* * Get or create a page operation */ - PageOp = MmGetPageOp(MemoryArea, (ULONG)MemoryArea->Process->UniqueProcessId, - (PVOID)PAGE_ROUND_DOWN(Address), NULL, 0, - MM_PAGEOP_PAGEIN, FALSE); + PageOp = MmGetPageOp(MemoryArea, (ULONG)MemoryArea->Process->UniqueProcessId, + (PVOID)PAGE_ROUND_DOWN(Address), NULL, 0, + MM_PAGEOP_PAGEIN, FALSE); if (PageOp == NULL) - { - DPRINT1("MmGetPageOp failed"); - KEBUGCHECK(0); - } + { + DPRINT1("MmGetPageOp failed"); + KEBUGCHECK(0); + } /* * Check if someone else is already handling this fault, if so wait * for them */ if (PageOp->Thread != PsGetCurrentThread()) - { - MmUnlockAddressSpace(AddressSpace); - Status = KeWaitForSingleObject(&PageOp->CompletionEvent, - 0, - KernelMode, - FALSE, - NULL); - /* - * Check for various strange conditions - */ - if (Status != STATUS_SUCCESS) - { - DPRINT1("Failed to wait for page op\n"); - KEBUGCHECK(0); - } - if (PageOp->Status == STATUS_PENDING) - { - DPRINT1("Woke for page op before completion\n"); - KEBUGCHECK(0); - } - /* - * If this wasn't a pagein then we need to restart the handling - */ - if (PageOp->OpType != MM_PAGEOP_PAGEIN) - { - MmLockAddressSpace(AddressSpace); - KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); - MmReleasePageOp(PageOp); - return(STATUS_MM_RESTART_OPERATION); - } - /* - * If the thread handling this fault has failed then we don't retry - */ - if (!NT_SUCCESS(PageOp->Status)) - { - MmLockAddressSpace(AddressSpace); - KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); - Status = PageOp->Status; - MmReleasePageOp(PageOp); - return(Status); - } - MmLockAddressSpace(AddressSpace); - if (Locked) - { - MmLockPage(MmGetPhysicalAddressForProcess(NULL, Address)); - } - KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); - MmReleasePageOp(PageOp); - return(STATUS_SUCCESS); - } - + { + MmUnlockAddressSpace(AddressSpace); + Status = KeWaitForSingleObject(&PageOp->CompletionEvent, + 0, + KernelMode, + FALSE, + NULL); + /* + * Check for various strange conditions + */ + if (Status != STATUS_SUCCESS) + { + DPRINT1("Failed to wait for page op\n"); + KEBUGCHECK(0); + } + if (PageOp->Status == STATUS_PENDING) + { + DPRINT1("Woke for page op before completion\n"); + KEBUGCHECK(0); + } + /* + * If this wasn't a pagein then we need to restart the handling + */ + if (PageOp->OpType != MM_PAGEOP_PAGEIN) + { + MmLockAddressSpace(AddressSpace); + KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); + MmReleasePageOp(PageOp); + return(STATUS_MM_RESTART_OPERATION); + } + /* + * If the thread handling this fault has failed then we don't retry + */ + if (!NT_SUCCESS(PageOp->Status)) + { + MmLockAddressSpace(AddressSpace); + KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); + Status = PageOp->Status; + MmReleasePageOp(PageOp); + return(Status); + } + MmLockAddressSpace(AddressSpace); + if (Locked) + { + MmLockPage(MmGetPhysicalAddressForProcess(NULL, Address)); + } + KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); + MmReleasePageOp(PageOp); + return(STATUS_SUCCESS); + } + /* * Try to allocate a page */ Status = MmRequestPageMemoryConsumer(MC_USER, FALSE, &Page); if (Status == STATUS_NO_MEMORY) - { - MmUnlockAddressSpace(AddressSpace); - Status = MmRequestPageMemoryConsumer(MC_USER, TRUE, &Page); - MmLockAddressSpace(AddressSpace); - } + { + MmUnlockAddressSpace(AddressSpace); + Status = MmRequestPageMemoryConsumer(MC_USER, TRUE, &Page); + MmLockAddressSpace(AddressSpace); + } if (!NT_SUCCESS(Status)) { DPRINT1("MmRequestPageMemoryConsumer failed, status = %x\n", Status); @@ -370,46 +370,46 @@ MmNotPresentFaultVirtualMemory(PMADDRESS_SPACE AddressSpace, * Handle swapped out pages. */ if (MmIsPageSwapEntry(NULL, Address)) - { - SWAPENTRY SwapEntry; - PMDL Mdl; + { + SWAPENTRY SwapEntry; + PMDL Mdl; + + MmDeletePageFileMapping(MemoryArea->Process, Address, &SwapEntry); + Mdl = MmCreateMdl(NULL, NULL, PAGE_SIZE); + MmBuildMdlFromPages(Mdl, (PULONG)&Page); + Status = MmReadFromSwapPage(SwapEntry, Mdl); + if (!NT_SUCCESS(Status)) + { + KEBUGCHECK(0); + } + MmSetSavedSwapEntryPage(Page, SwapEntry); + } - MmDeletePageFileMapping(MemoryArea->Process, Address, &SwapEntry); - Mdl = MmCreateMdl(NULL, NULL, PAGE_SIZE); - MmBuildMdlFromPages(Mdl, (PULONG)&Page); - Status = MmReadFromSwapPage(SwapEntry, Mdl); - if (!NT_SUCCESS(Status)) - { - KEBUGCHECK(0); - } - MmSetSavedSwapEntryPage(Page, SwapEntry); - } - /* * Set the page. If we fail because we are out of memory then * try again */ - Status = MmCreateVirtualMapping(MemoryArea->Process, - (PVOID)PAGE_ROUND_DOWN(Address), - Region->Protect, - Page, - FALSE); + Status = MmCreateVirtualMapping(MemoryArea->Process, + (PVOID)PAGE_ROUND_DOWN(Address), + Region->Protect, + Page, + FALSE); while (Status == STATUS_NO_MEMORY) - { - MmUnlockAddressSpace(AddressSpace); - Status = MmCreateVirtualMapping(MemoryArea->Process, - Address, - Region->Protect, - Page, - TRUE); - MmLockAddressSpace(AddressSpace); - } + { + MmUnlockAddressSpace(AddressSpace); + Status = MmCreateVirtualMapping(MemoryArea->Process, + Address, + Region->Protect, + Page, + TRUE); + MmLockAddressSpace(AddressSpace); + } if (!NT_SUCCESS(Status)) - { - DPRINT1("MmCreateVirtualMapping failed, not out of memory\n"); - KEBUGCHECK(0); - return(Status); - } + { + DPRINT1("MmCreateVirtualMapping failed, not out of memory\n"); + KEBUGCHECK(0); + return(Status); + } /* * Add the page to the process's working set @@ -420,9 +420,9 @@ MmNotPresentFaultVirtualMemory(PMADDRESS_SPACE AddressSpace, * Finish the operation */ if (Locked) - { - MmLockPage(MmGetPhysicalAddressForProcess(NULL, Address)); - } + { + MmLockPage(MmGetPhysicalAddressForProcess(NULL, Address)); + } PageOp->Status = STATUS_SUCCESS; KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); MmReleasePageOp(PageOp); @@ -431,92 +431,92 @@ MmNotPresentFaultVirtualMemory(PMADDRESS_SPACE AddressSpace, VOID STATIC MmModifyAttributes(PMADDRESS_SPACE AddressSpace, - PVOID BaseAddress, - ULONG RegionSize, - ULONG OldType, - ULONG OldProtect, - ULONG NewType, - ULONG NewProtect) + PVOID BaseAddress, + ULONG RegionSize, + ULONG OldType, + ULONG OldProtect, + ULONG NewType, + ULONG NewProtect) /* * FUNCTION: Modify the attributes of a memory region */ -{ - /* - * If we are switching a previously committed region to reserved then - * free any allocated pages within the region - */ - if (NewType == MEM_RESERVE && OldType == MEM_COMMIT) - { +{ + /* + * If we are switching a previously committed region to reserved then + * free any allocated pages within the region + */ + if (NewType == MEM_RESERVE && OldType == MEM_COMMIT) + { ULONG i; - + for (i=0; i < PAGE_ROUND_UP(RegionSize)/PAGE_SIZE; i++) - { - LARGE_INTEGER PhysicalAddr; + { + LARGE_INTEGER PhysicalAddr; - if (MmIsPageSwapEntry(AddressSpace->Process, - (char*)BaseAddress + (i * PAGE_SIZE))) - { - SWAPENTRY SwapEntry; - - MmDeletePageFileMapping(AddressSpace->Process, - (char*)BaseAddress + (i * PAGE_SIZE), - &SwapEntry); - MmFreeSwapPage(SwapEntry); - } - else - { - MmDeleteVirtualMapping(AddressSpace->Process, - (char*)BaseAddress + (i*PAGE_SIZE), - FALSE, NULL, &PhysicalAddr); - if (PhysicalAddr.QuadPart != 0) - { - SWAPENTRY SavedSwapEntry; - SavedSwapEntry = MmGetSavedSwapEntryPage(PhysicalAddr); - if (SavedSwapEntry != 0) - { - MmFreeSwapPage(SavedSwapEntry); - MmSetSavedSwapEntryPage(PhysicalAddr, 0); - } - MmDeleteRmap(PhysicalAddr, AddressSpace->Process, - (char*)BaseAddress + (i * PAGE_SIZE)); - MmReleasePageMemoryConsumer(MC_USER, PhysicalAddr); - } - } - } - } + if (MmIsPageSwapEntry(AddressSpace->Process, + (char*)BaseAddress + (i * PAGE_SIZE))) + { + SWAPENTRY SwapEntry; - /* - * If we are changing the protection attributes of a committed region then - * alter the attributes for any allocated pages within the region - */ - if (NewType == MEM_COMMIT && OldType == MEM_COMMIT && - OldProtect != NewProtect) - { + MmDeletePageFileMapping(AddressSpace->Process, + (char*)BaseAddress + (i * PAGE_SIZE), + &SwapEntry); + MmFreeSwapPage(SwapEntry); + } + else + { + MmDeleteVirtualMapping(AddressSpace->Process, + (char*)BaseAddress + (i*PAGE_SIZE), + FALSE, NULL, &PhysicalAddr); + if (PhysicalAddr.QuadPart != 0) + { + SWAPENTRY SavedSwapEntry; + SavedSwapEntry = MmGetSavedSwapEntryPage(PhysicalAddr); + if (SavedSwapEntry != 0) + { + MmFreeSwapPage(SavedSwapEntry); + MmSetSavedSwapEntryPage(PhysicalAddr, 0); + } + MmDeleteRmap(PhysicalAddr, AddressSpace->Process, + (char*)BaseAddress + (i * PAGE_SIZE)); + MmReleasePageMemoryConsumer(MC_USER, PhysicalAddr); + } + } + } + } + + /* + * If we are changing the protection attributes of a committed region then + * alter the attributes for any allocated pages within the region + */ + if (NewType == MEM_COMMIT && OldType == MEM_COMMIT && + OldProtect != NewProtect) + { ULONG i; - + for (i=0; i < PAGE_ROUND_UP(RegionSize)/PAGE_SIZE; i++) - { - if (MmIsPagePresent(AddressSpace->Process, - (char*)BaseAddress + (i*PAGE_SIZE))) - { - MmSetPageProtect(AddressSpace->Process, - (char*)BaseAddress + (i*PAGE_SIZE), - NewProtect); - } - } - } + { + if (MmIsPagePresent(AddressSpace->Process, + (char*)BaseAddress + (i*PAGE_SIZE))) + { + MmSetPageProtect(AddressSpace->Process, + (char*)BaseAddress + (i*PAGE_SIZE), + NewProtect); + } + } + } } /* * @implemented */ NTSTATUS STDCALL -NtAllocateVirtualMemory(IN HANDLE ProcessHandle, - IN OUT PVOID* UBaseAddress, - IN ULONG ZeroBits, - IN OUT PULONG URegionSize, - IN ULONG AllocationType, - IN ULONG Protect) +NtAllocateVirtualMemory(IN HANDLE ProcessHandle, + IN OUT PVOID* UBaseAddress, + IN ULONG ZeroBits, + IN OUT PULONG URegionSize, + IN ULONG AllocationType, + IN ULONG Protect) /* * FUNCTION: Allocates a block of virtual memory in the process address space * ARGUMENTS: @@ -551,120 +551,120 @@ NtAllocateVirtualMemory(IN HANDLE ProcessHandle, PHYSICAL_ADDRESS BoundaryAddressMultiple; DPRINT("NtAllocateVirtualMemory(*UBaseAddress %x, " - "ZeroBits %d, *URegionSize %x, AllocationType %x, Protect %x)\n", - *UBaseAddress,ZeroBits,*URegionSize,AllocationType, - Protect); - + "ZeroBits %d, *URegionSize %x, AllocationType %x, Protect %x)\n", + *UBaseAddress,ZeroBits,*URegionSize,AllocationType, + Protect); + /* * Check the validity of the parameters */ if ((Protect & PAGE_FLAGS_VALID_FROM_USER_MODE) != Protect) - { - return(STATUS_INVALID_PAGE_PROTECTION); - } + { + return(STATUS_INVALID_PAGE_PROTECTION); + } if ((AllocationType & (MEM_COMMIT | MEM_RESERVE)) == 0) - { - return(STATUS_INVALID_PARAMETER); - } - + { + return(STATUS_INVALID_PARAMETER); + } + PBaseAddress = *UBaseAddress; PRegionSize = *URegionSize; BoundaryAddressMultiple.QuadPart = 0; - + BaseAddress = (PVOID)PAGE_ROUND_DOWN(PBaseAddress); RegionSize = PAGE_ROUND_UP(PBaseAddress + PRegionSize) - - PAGE_ROUND_DOWN(PBaseAddress); - + PAGE_ROUND_DOWN(PBaseAddress); + Status = ObReferenceObjectByHandle(ProcessHandle, - PROCESS_VM_OPERATION, - NULL, - UserMode, - (PVOID*)(&Process), - NULL); + PROCESS_VM_OPERATION, + NULL, + UserMode, + (PVOID*)(&Process), + NULL); if (!NT_SUCCESS(Status)) - { - DPRINT("NtAllocateVirtualMemory() = %x\n",Status); - return(Status); - } - + { + DPRINT("NtAllocateVirtualMemory() = %x\n",Status); + return(Status); + } + Type = (AllocationType & MEM_COMMIT) ? MEM_COMMIT : MEM_RESERVE; DPRINT("Type %x\n", Type); - + AddressSpace = &Process->AddressSpace; MmLockAddressSpace(AddressSpace); - + if (PBaseAddress != 0) - { - MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace, - BaseAddress); - - if (MemoryArea != NULL && - MemoryArea->Type == MEMORY_AREA_VIRTUAL_MEMORY && - MemoryArea->Length >= RegionSize) - { - Status = - MmAlterRegion(AddressSpace, - MemoryArea->BaseAddress, - &MemoryArea->Data.VirtualMemoryData.RegionListHead, - BaseAddress, RegionSize, - Type, Protect, MmModifyAttributes); - MmUnlockAddressSpace(AddressSpace); - ObDereferenceObject(Process); - DPRINT("NtAllocateVirtualMemory() = %x\n",Status); - return(Status); - } - else if (MemoryArea != NULL && MemoryArea->Length >= RegionSize) - { - Status = - MmAlterRegion(AddressSpace, - MemoryArea->BaseAddress, - &MemoryArea->Data.SectionData.RegionListHead, - BaseAddress, RegionSize, - Type, Protect, MmModifyAttributes); - MmUnlockAddressSpace(AddressSpace); - ObDereferenceObject(Process); - DPRINT("NtAllocateVirtualMemory() = %x\n",Status); - return(Status); - } - else if (MemoryArea != NULL) - { - MmUnlockAddressSpace(AddressSpace); - ObDereferenceObject(Process); - return(STATUS_UNSUCCESSFUL); - } - } - + { + MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace, + BaseAddress); + + if (MemoryArea != NULL && + MemoryArea->Type == MEMORY_AREA_VIRTUAL_MEMORY && + MemoryArea->Length >= RegionSize) + { + Status = + MmAlterRegion(AddressSpace, + MemoryArea->BaseAddress, + &MemoryArea->Data.VirtualMemoryData.RegionListHead, + BaseAddress, RegionSize, + Type, Protect, MmModifyAttributes); + MmUnlockAddressSpace(AddressSpace); + ObDereferenceObject(Process); + DPRINT("NtAllocateVirtualMemory() = %x\n",Status); + return(Status); + } + else if (MemoryArea != NULL && MemoryArea->Length >= RegionSize) + { + Status = + MmAlterRegion(AddressSpace, + MemoryArea->BaseAddress, + &MemoryArea->Data.SectionData.RegionListHead, + BaseAddress, RegionSize, + Type, Protect, MmModifyAttributes); + MmUnlockAddressSpace(AddressSpace); + ObDereferenceObject(Process); + DPRINT("NtAllocateVirtualMemory() = %x\n",Status); + return(Status); + } + else if (MemoryArea != NULL) + { + MmUnlockAddressSpace(AddressSpace); + ObDereferenceObject(Process); + return(STATUS_UNSUCCESSFUL); + } + } + Status = MmCreateMemoryArea(Process, - AddressSpace, - MEMORY_AREA_VIRTUAL_MEMORY, - &BaseAddress, - RegionSize, - Protect, - &MemoryArea, - PBaseAddress != 0, - (AllocationType & MEM_TOP_DOWN), - BoundaryAddressMultiple); + AddressSpace, + MEMORY_AREA_VIRTUAL_MEMORY, + &BaseAddress, + RegionSize, + Protect, + &MemoryArea, + PBaseAddress != 0, + (AllocationType & MEM_TOP_DOWN), + BoundaryAddressMultiple); if (!NT_SUCCESS(Status)) - { - MmUnlockAddressSpace(AddressSpace); - ObDereferenceObject(Process); - DPRINT("NtAllocateVirtualMemory() = %x\n",Status); - return(Status); - } + { + MmUnlockAddressSpace(AddressSpace); + ObDereferenceObject(Process); + DPRINT("NtAllocateVirtualMemory() = %x\n",Status); + return(Status); + } MmInitialiseRegion(&MemoryArea->Data.VirtualMemoryData.RegionListHead, - RegionSize, Type, Protect); - + RegionSize, Type, Protect); + if ((AllocationType & MEM_COMMIT) && - ((Protect & PAGE_READWRITE) || - (Protect & PAGE_EXECUTE_READWRITE))) - { - MmReserveSwapPages(RegionSize); - } - + ((Protect & PAGE_READWRITE) || + (Protect & PAGE_EXECUTE_READWRITE))) + { + MmReserveSwapPages(RegionSize); + } + *UBaseAddress = BaseAddress; *URegionSize = RegionSize; DPRINT("*UBaseAddress %x *URegionSize %x\n", BaseAddress, RegionSize); - + MmUnlockAddressSpace(AddressSpace); ObDereferenceObject(Process); return(STATUS_SUCCESS); @@ -672,109 +672,109 @@ NtAllocateVirtualMemory(IN HANDLE ProcessHandle, VOID STATIC MmFreeVirtualMemoryPage(PVOID Context, - MEMORY_AREA* MemoryArea, - PVOID Address, - PHYSICAL_ADDRESS PhysicalAddr, - SWAPENTRY SwapEntry, - BOOLEAN Dirty) + MEMORY_AREA* MemoryArea, + PVOID Address, + PHYSICAL_ADDRESS PhysicalAddr, + SWAPENTRY SwapEntry, + BOOLEAN Dirty) { - PEPROCESS Process = (PEPROCESS)Context; - - if (PhysicalAddr.QuadPart != 0) - { + PEPROCESS Process = (PEPROCESS)Context; + + if (PhysicalAddr.QuadPart != 0) + { SWAPENTRY SavedSwapEntry; SavedSwapEntry = MmGetSavedSwapEntryPage(PhysicalAddr); if (SavedSwapEntry != 0) - { - MmFreeSwapPage(SavedSwapEntry); - MmSetSavedSwapEntryPage(PhysicalAddr, 0); - } + { + MmFreeSwapPage(SavedSwapEntry); + MmSetSavedSwapEntryPage(PhysicalAddr, 0); + } MmDeleteRmap(PhysicalAddr, Process, Address); MmReleasePageMemoryConsumer(MC_USER, PhysicalAddr); - } - else if (SwapEntry != 0) - { + } + else if (SwapEntry != 0) + { MmFreeSwapPage(SwapEntry); - } + } } VOID MmFreeVirtualMemory(PEPROCESS Process, - PMEMORY_AREA MemoryArea) + PMEMORY_AREA MemoryArea) { - PLIST_ENTRY current_entry; - PMM_REGION current; - ULONG i; - - DPRINT("MmFreeVirtualMemory(Process %p MemoryArea %p)\n", Process, - MemoryArea); - - /* Mark this memory area as about to be deleted. */ - MemoryArea->DeleteInProgress = TRUE; + PLIST_ENTRY current_entry; + PMM_REGION current; + ULONG i; - /* - * Wait for any ongoing paging operations. Notice that since we have - * flagged this memory area as deleted no more page ops will be added. - */ - if (MemoryArea->PageOpCount > 0) - { + DPRINT("MmFreeVirtualMemory(Process %p MemoryArea %p)\n", Process, + MemoryArea); + + /* Mark this memory area as about to be deleted. */ + MemoryArea->DeleteInProgress = TRUE; + + /* + * Wait for any ongoing paging operations. Notice that since we have + * flagged this memory area as deleted no more page ops will be added. + */ + if (MemoryArea->PageOpCount > 0) + { for (i = 0; i < PAGE_ROUND_UP(MemoryArea->Length) / PAGE_SIZE; i++) - { - PMM_PAGEOP PageOp; + { + PMM_PAGEOP PageOp; - if (MemoryArea->PageOpCount == 0) - { - break; - } - - PageOp = MmCheckForPageOp(MemoryArea, Process->UniqueProcessId, - (char*)MemoryArea->BaseAddress + (i * PAGE_SIZE), - NULL, 0); - if (PageOp != NULL) - { - NTSTATUS Status; - MmUnlockAddressSpace(&Process->AddressSpace); - Status = KeWaitForSingleObject(&PageOp->CompletionEvent, - 0, - KernelMode, - FALSE, - NULL); - if (Status != STATUS_SUCCESS) - { - DPRINT1("Failed to wait for page op\n"); - KEBUGCHECK(0); - } - MmLockAddressSpace(&Process->AddressSpace); - MmReleasePageOp(PageOp); - } - } - } + if (MemoryArea->PageOpCount == 0) + { + break; + } - /* Free all the individual segments. */ - current_entry = MemoryArea->Data.VirtualMemoryData.RegionListHead.Flink; - while (current_entry != &MemoryArea->Data.VirtualMemoryData.RegionListHead) - { + PageOp = MmCheckForPageOp(MemoryArea, Process->UniqueProcessId, + (char*)MemoryArea->BaseAddress + (i * PAGE_SIZE), + NULL, 0); + if (PageOp != NULL) + { + NTSTATUS Status; + MmUnlockAddressSpace(&Process->AddressSpace); + Status = KeWaitForSingleObject(&PageOp->CompletionEvent, + 0, + KernelMode, + FALSE, + NULL); + if (Status != STATUS_SUCCESS) + { + DPRINT1("Failed to wait for page op\n"); + KEBUGCHECK(0); + } + MmLockAddressSpace(&Process->AddressSpace); + MmReleasePageOp(PageOp); + } + } + } + + /* Free all the individual segments. */ + current_entry = MemoryArea->Data.VirtualMemoryData.RegionListHead.Flink; + while (current_entry != &MemoryArea->Data.VirtualMemoryData.RegionListHead) + { current = CONTAINING_RECORD(current_entry, MM_REGION, RegionListEntry); current_entry = current_entry->Flink; ExFreePool(current); - } + } - /* Actually free the memory area. */ - MmFreeMemoryArea(&Process->AddressSpace, - MemoryArea->BaseAddress, - 0, - MmFreeVirtualMemoryPage, - (PVOID)Process); + /* Actually free the memory area. */ + MmFreeMemoryArea(&Process->AddressSpace, + MemoryArea->BaseAddress, + 0, + MmFreeVirtualMemoryPage, + (PVOID)Process); } /* * @unimplemented */ -NTSTATUS STDCALL -NtFreeVirtualMemory(IN HANDLE ProcessHandle, - IN PVOID* PBaseAddress, - IN PULONG PRegionSize, - IN ULONG FreeType) +NTSTATUS STDCALL +NtFreeVirtualMemory(IN HANDLE ProcessHandle, + IN PVOID* PBaseAddress, + IN PULONG PRegionSize, + IN ULONG FreeType) /* * FUNCTION: Frees a range of virtual memory * ARGUMENTS: @@ -794,67 +794,67 @@ NtFreeVirtualMemory(IN HANDLE ProcessHandle, PMADDRESS_SPACE AddressSpace; PVOID BaseAddress; ULONG RegionSize; - + DPRINT("NtFreeVirtualMemory(ProcessHandle %x, *PBaseAddress %x, " - "*PRegionSize %x, FreeType %x)\n",ProcessHandle,*PBaseAddress, - *PRegionSize,FreeType); - + "*PRegionSize %x, FreeType %x)\n",ProcessHandle,*PBaseAddress, + *PRegionSize,FreeType); + BaseAddress = (PVOID)PAGE_ROUND_DOWN((*PBaseAddress)); RegionSize = PAGE_ROUND_UP((*PBaseAddress) + (*PRegionSize)) - - PAGE_ROUND_DOWN((*PBaseAddress)); - + PAGE_ROUND_DOWN((*PBaseAddress)); + Status = ObReferenceObjectByHandle(ProcessHandle, - PROCESS_VM_OPERATION, - PsProcessType, - UserMode, - (PVOID*)(&Process), - NULL); + PROCESS_VM_OPERATION, + PsProcessType, + UserMode, + (PVOID*)(&Process), + NULL); if (!NT_SUCCESS(Status)) - { - return(Status); - } - + { + return(Status); + } + AddressSpace = &Process->AddressSpace; - + MmLockAddressSpace(AddressSpace); MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace, - BaseAddress); + BaseAddress); if (MemoryArea == NULL) - { - MmUnlockAddressSpace(AddressSpace); - ObDereferenceObject(Process); - return(STATUS_UNSUCCESSFUL); - } - + { + MmUnlockAddressSpace(AddressSpace); + ObDereferenceObject(Process); + return(STATUS_UNSUCCESSFUL); + } + switch (FreeType) - { + { case MEM_RELEASE: - /* We can only free a memory area in one step. */ - if (MemoryArea->BaseAddress != BaseAddress) - { - MmUnlockAddressSpace(AddressSpace); - ObDereferenceObject(Process); - return(STATUS_UNSUCCESSFUL); - } - MmFreeVirtualMemory(Process, MemoryArea); - MmUnlockAddressSpace(AddressSpace); - ObDereferenceObject(Process); - return(STATUS_SUCCESS); - + /* We can only free a memory area in one step. */ + if (MemoryArea->BaseAddress != BaseAddress) + { + MmUnlockAddressSpace(AddressSpace); + ObDereferenceObject(Process); + return(STATUS_UNSUCCESSFUL); + } + MmFreeVirtualMemory(Process, MemoryArea); + MmUnlockAddressSpace(AddressSpace); + ObDereferenceObject(Process); + return(STATUS_SUCCESS); + case MEM_DECOMMIT: - Status = - MmAlterRegion(AddressSpace, - MemoryArea->BaseAddress, - &MemoryArea->Data.VirtualMemoryData.RegionListHead, - BaseAddress, - RegionSize, - MEM_RESERVE, - PAGE_NOACCESS, - MmModifyAttributes); - MmUnlockAddressSpace(AddressSpace); - ObDereferenceObject(Process); - return(Status); - } + Status = + MmAlterRegion(AddressSpace, + MemoryArea->BaseAddress, + &MemoryArea->Data.VirtualMemoryData.RegionListHead, + BaseAddress, + RegionSize, + MEM_RESERVE, + PAGE_NOACCESS, + MmModifyAttributes); + MmUnlockAddressSpace(AddressSpace); + ObDereferenceObject(Process); + return(Status); + } MmUnlockAddressSpace(AddressSpace); ObDereferenceObject(Process); return(STATUS_NOT_IMPLEMENTED); @@ -862,49 +862,49 @@ NtFreeVirtualMemory(IN HANDLE ProcessHandle, NTSTATUS MmProtectAnonMem(PMADDRESS_SPACE AddressSpace, - PMEMORY_AREA MemoryArea, - PVOID BaseAddress, - ULONG Length, - ULONG Protect, - PULONG OldProtect) + PMEMORY_AREA MemoryArea, + PVOID BaseAddress, + ULONG Length, + ULONG Protect, + PULONG OldProtect) { - PMM_REGION Region; - NTSTATUS Status; + PMM_REGION Region; + NTSTATUS Status; - Region = MmFindRegion(MemoryArea->BaseAddress, - &MemoryArea->Data.VirtualMemoryData.RegionListHead, - BaseAddress, NULL); - *OldProtect = Region->Protect; - Status = MmAlterRegion(AddressSpace, MemoryArea->BaseAddress, - &MemoryArea->Data.VirtualMemoryData.RegionListHead, - BaseAddress, Length, Region->Type, Protect, - MmModifyAttributes); - return(Status); + Region = MmFindRegion(MemoryArea->BaseAddress, + &MemoryArea->Data.VirtualMemoryData.RegionListHead, + BaseAddress, NULL); + *OldProtect = Region->Protect; + Status = MmAlterRegion(AddressSpace, MemoryArea->BaseAddress, + &MemoryArea->Data.VirtualMemoryData.RegionListHead, + BaseAddress, Length, Region->Type, Protect, + MmModifyAttributes); + return(Status); } NTSTATUS STDCALL MmQueryAnonMem(PMEMORY_AREA MemoryArea, - PVOID Address, - PMEMORY_BASIC_INFORMATION Info, - PULONG ResultLength) + PVOID Address, + PMEMORY_BASIC_INFORMATION Info, + PULONG ResultLength) { - PMM_REGION Region; - PVOID RegionBase; + PMM_REGION Region; + PVOID RegionBase; - Info->BaseAddress = (PVOID)PAGE_ROUND_DOWN(Address); + Info->BaseAddress = (PVOID)PAGE_ROUND_DOWN(Address); - Region = MmFindRegion(MemoryArea->BaseAddress, - &MemoryArea->Data.VirtualMemoryData.RegionListHead, - Address, &RegionBase); - Info->AllocationBase = RegionBase; - Info->AllocationProtect = Region->Protect; /* FIXME */ - Info->RegionSize = (char*)RegionBase + Region->Length - (char*)Info->BaseAddress; - Info->State = Region->Type; - Info->Protect = Region->Protect; - Info->Type = MEM_PRIVATE; + Region = MmFindRegion(MemoryArea->BaseAddress, + &MemoryArea->Data.VirtualMemoryData.RegionListHead, + Address, &RegionBase); + Info->AllocationBase = RegionBase; + Info->AllocationProtect = Region->Protect; /* FIXME */ + Info->RegionSize = (char*)RegionBase + Region->Length - (char*)Info->BaseAddress; + Info->State = Region->Type; + Info->Protect = Region->Protect; + Info->Type = MEM_PRIVATE; - *ResultLength = sizeof(MEMORY_BASIC_INFORMATION); - return(STATUS_SUCCESS); + *ResultLength = sizeof(MEMORY_BASIC_INFORMATION); + return(STATUS_SUCCESS); } /* EOF */ diff --git a/reactos/ntoskrnl/mm/aspace.c b/reactos/ntoskrnl/mm/aspace.c index c2df1d76790..948cbddc076 100644 --- a/reactos/ntoskrnl/mm/aspace.c +++ b/reactos/ntoskrnl/mm/aspace.c @@ -1,4 +1,4 @@ -/* $Id: aspace.c,v 1.16 2004/03/04 00:07:01 navaraf Exp $ +/* $Id: aspace.c,v 1.17 2004/04/10 22:35:25 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -26,30 +26,30 @@ STATIC MADDRESS_SPACE KernelAddressSpace; /* FUNCTIONS *****************************************************************/ -VOID +VOID MmLockAddressSpace(PMADDRESS_SPACE AddressSpace) { - /* - * Don't bother with locking if we are the first thread. - */ - if (KeGetCurrentThread() == NULL) - { + /* + * Don't bother with locking if we are the first thread. + */ + if (KeGetCurrentThread() == NULL) + { return; - } - ExAcquireFastMutex(&AddressSpace->Lock); + } + ExAcquireFastMutex(&AddressSpace->Lock); } -VOID +VOID MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace) { - /* - * Don't bother locking if we are the first thread. - */ - if (KeGetCurrentThread() == NULL) - { + /* + * Don't bother locking if we are the first thread. + */ + if (KeGetCurrentThread() == NULL) + { return; - } - ExReleaseFastMutex(&AddressSpace->Lock); + } + ExReleaseFastMutex(&AddressSpace->Lock); } VOID INIT_FUNCTION @@ -68,44 +68,44 @@ PMADDRESS_SPACE MmGetKernelAddressSpace(VOID) return(&KernelAddressSpace); } -NTSTATUS +NTSTATUS MmInitializeAddressSpace(PEPROCESS Process, - PMADDRESS_SPACE AddressSpace) + PMADDRESS_SPACE AddressSpace) { InitializeListHead(&AddressSpace->MAreaListHead); ExInitializeFastMutex(&AddressSpace->Lock); if (Process != NULL) - { - AddressSpace->LowestAddress = MM_LOWEST_USER_ADDRESS; - } + { + AddressSpace->LowestAddress = MM_LOWEST_USER_ADDRESS; + } else - { - AddressSpace->LowestAddress = KERNEL_BASE; - } + { + AddressSpace->LowestAddress = KERNEL_BASE; + } AddressSpace->Process = Process; if (Process != NULL) - { - AddressSpace->PageTableRefCountTable = - ExAllocatePoolWithTag(NonPagedPool, 768 * sizeof(USHORT), - TAG_PTRC); - RtlZeroMemory(AddressSpace->PageTableRefCountTable, 768 * sizeof(USHORT)); - AddressSpace->PageTableRefCountTableSize = 768; - } + { + AddressSpace->PageTableRefCountTable = + ExAllocatePoolWithTag(NonPagedPool, 768 * sizeof(USHORT), + TAG_PTRC); + RtlZeroMemory(AddressSpace->PageTableRefCountTable, 768 * sizeof(USHORT)); + AddressSpace->PageTableRefCountTableSize = 768; + } else - { - AddressSpace->PageTableRefCountTable = NULL; - AddressSpace->PageTableRefCountTableSize = 0; - } + { + AddressSpace->PageTableRefCountTable = NULL; + AddressSpace->PageTableRefCountTableSize = 0; + } return(STATUS_SUCCESS); } -NTSTATUS +NTSTATUS MmDestroyAddressSpace(PMADDRESS_SPACE AddressSpace) { - if (AddressSpace->PageTableRefCountTable != NULL) - { + if (AddressSpace->PageTableRefCountTable != NULL) + { ExFreePool(AddressSpace->PageTableRefCountTable); - } + } return(STATUS_SUCCESS); } diff --git a/reactos/ntoskrnl/mm/balance.c b/reactos/ntoskrnl/mm/balance.c index 75ee583e9fd..3ed4d1c49ba 100644 --- a/reactos/ntoskrnl/mm/balance.c +++ b/reactos/ntoskrnl/mm/balance.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: balance.c,v 1.26 2004/03/05 11:31:59 hbirr Exp $ +/* $Id: balance.c,v 1.27 2004/04/10 22:35:25 gdalsnes Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/balance.c @@ -39,17 +39,19 @@ typedef struct _MM_MEMORY_CONSUMER { - ULONG PagesUsed; - ULONG PagesTarget; - NTSTATUS (*Trim)(ULONG Target, ULONG Priority, PULONG NrFreed); -} MM_MEMORY_CONSUMER, *PMM_MEMORY_CONSUMER; + ULONG PagesUsed; + ULONG PagesTarget; + NTSTATUS (*Trim)(ULONG Target, ULONG Priority, PULONG NrFreed); +} +MM_MEMORY_CONSUMER, *PMM_MEMORY_CONSUMER; typedef struct _MM_ALLOCATION_REQUEST { - PHYSICAL_ADDRESS Page; - LIST_ENTRY ListEntry; - KEVENT Event; -} MM_ALLOCATION_REQUEST, *PMM_ALLOCATION_REQUEST; + PHYSICAL_ADDRESS Page; + LIST_ENTRY ListEntry; + KEVENT Event; +} +MM_ALLOCATION_REQUEST, *PMM_ALLOCATION_REQUEST; /* GLOBALS ******************************************************************/ @@ -72,381 +74,397 @@ static LONG MiBalancerWork = 0; VOID MmPrintMemoryStatistic(VOID) { - DbgPrint("MC_CACHE %d, MC_USER %d, MC_PPOOL %d, MC_NPPOOL %d, MiNrAvailablePages %d\n", - MiMemoryConsumers[MC_CACHE].PagesUsed, MiMemoryConsumers[MC_USER].PagesUsed, - MiMemoryConsumers[MC_PPOOL].PagesUsed, MiMemoryConsumers[MC_NPPOOL].PagesUsed, - MiNrAvailablePages); + DbgPrint("MC_CACHE %d, MC_USER %d, MC_PPOOL %d, MC_NPPOOL %d, MiNrAvailablePages %d\n", + MiMemoryConsumers[MC_CACHE].PagesUsed, MiMemoryConsumers[MC_USER].PagesUsed, + MiMemoryConsumers[MC_PPOOL].PagesUsed, MiMemoryConsumers[MC_NPPOOL].PagesUsed, + MiNrAvailablePages); } VOID INIT_FUNCTION MmInitializeBalancer(ULONG NrAvailablePages, ULONG NrSystemPages) { - memset(MiMemoryConsumers, 0, sizeof(MiMemoryConsumers)); - InitializeListHead(&AllocationListHead); - KeInitializeSpinLock(&AllocationListLock); + memset(MiMemoryConsumers, 0, sizeof(MiMemoryConsumers)); + InitializeListHead(&AllocationListHead); + KeInitializeSpinLock(&AllocationListLock); - MiNrAvailablePages = MiNrTotalPages = NrAvailablePages; + MiNrAvailablePages = MiNrTotalPages = NrAvailablePages; - /* Set up targets. */ - MiMinimumAvailablePages = 64; - MiMemoryConsumers[MC_CACHE].PagesTarget = NrAvailablePages / 2; - MiMemoryConsumers[MC_USER].PagesTarget = - NrAvailablePages - MiMinimumAvailablePages; - MiMemoryConsumers[MC_PPOOL].PagesTarget = NrAvailablePages / 2; - MiMemoryConsumers[MC_NPPOOL].PagesTarget = 0xFFFFFFFF; - MiMemoryConsumers[MC_NPPOOL].PagesUsed = NrSystemPages; + /* Set up targets. */ + MiMinimumAvailablePages = 64; + MiMemoryConsumers[MC_CACHE].PagesTarget = NrAvailablePages / 2; + MiMemoryConsumers[MC_USER].PagesTarget = + NrAvailablePages - MiMinimumAvailablePages; + MiMemoryConsumers[MC_PPOOL].PagesTarget = NrAvailablePages / 2; + MiMemoryConsumers[MC_NPPOOL].PagesTarget = 0xFFFFFFFF; + MiMemoryConsumers[MC_NPPOOL].PagesUsed = NrSystemPages; } VOID INIT_FUNCTION -MmInitializeMemoryConsumer(ULONG Consumer, - NTSTATUS (*Trim)(ULONG Target, ULONG Priority, - PULONG NrFreed)) +MmInitializeMemoryConsumer(ULONG Consumer, + NTSTATUS (*Trim)(ULONG Target, ULONG Priority, + PULONG NrFreed)) { - MiMemoryConsumers[Consumer].Trim = Trim; + MiMemoryConsumers[Consumer].Trim = Trim; } NTSTATUS MmReleasePageMemoryConsumer(ULONG Consumer, PHYSICAL_ADDRESS Page) { - PMM_ALLOCATION_REQUEST Request; - PLIST_ENTRY Entry; - KIRQL oldIrql; - ULONG OldAvailable; + PMM_ALLOCATION_REQUEST Request; + PLIST_ENTRY Entry; + KIRQL oldIrql; + ULONG OldAvailable; #if defined(__GNUC__) - if (Page.QuadPart == 0LL) + + if (Page.QuadPart == 0LL) #else - if (Page.QuadPart == 0) + + if (Page.QuadPart == 0) #endif - { + + { DPRINT1("Tried to release page zero.\n"); KEBUGCHECK(0); - } + } - KeAcquireSpinLock(&AllocationListLock, &oldIrql); - if (MmGetReferenceCountPage(Page) == 1) - { + KeAcquireSpinLock(&AllocationListLock, &oldIrql); + if (MmGetReferenceCountPage(Page) == 1) + { InterlockedDecrement((LONG *)&MiMemoryConsumers[Consumer].PagesUsed); OldAvailable = InterlockedIncrement((LONG *)&MiNrAvailablePages); if (IsListEmpty(&AllocationListHead) || OldAvailable + 1 < MiMinimumAvailablePages) - { - KeReleaseSpinLock(&AllocationListLock, oldIrql); - MmDereferencePage(Page); - } + { + KeReleaseSpinLock(&AllocationListLock, oldIrql); + MmDereferencePage(Page); + } else - { - Entry = RemoveHeadList(&AllocationListHead); - Request = CONTAINING_RECORD(Entry, MM_ALLOCATION_REQUEST, ListEntry); - KeReleaseSpinLock(&AllocationListLock, oldIrql); - Request->Page = Page; - KeSetEvent(&Request->Event, IO_NO_INCREMENT, FALSE); - } - } - else - { + { + Entry = RemoveHeadList(&AllocationListHead); + Request = CONTAINING_RECORD(Entry, MM_ALLOCATION_REQUEST, ListEntry); + KeReleaseSpinLock(&AllocationListLock, oldIrql); + Request->Page = Page; + KeSetEvent(&Request->Event, IO_NO_INCREMENT, FALSE); + } + } + else + { KeReleaseSpinLock(&AllocationListLock, oldIrql); MmDereferencePage(Page); - } + } - return(STATUS_SUCCESS); + return(STATUS_SUCCESS); } VOID MiTrimMemoryConsumer(ULONG Consumer) { - LONG Target; - ULONG NrFreedPages; + LONG Target; + ULONG NrFreedPages; - Target = MiMemoryConsumers[Consumer].PagesUsed - - MiMemoryConsumers[Consumer].PagesTarget; - if (Target < 1) - { + Target = MiMemoryConsumers[Consumer].PagesUsed - + MiMemoryConsumers[Consumer].PagesTarget; + if (Target < 1) + { Target = 1; - } + } - if (MiMemoryConsumers[Consumer].Trim != NULL) - { + if (MiMemoryConsumers[Consumer].Trim != NULL) + { MiMemoryConsumers[Consumer].Trim(Target, 0, &NrFreedPages); - } + } } VOID MmRebalanceMemoryConsumers(VOID) { - LONG Target; - ULONG i; - ULONG NrFreedPages; - NTSTATUS Status; + LONG Target; + ULONG i; + ULONG NrFreedPages; + NTSTATUS Status; - Target = (MiMinimumAvailablePages - MiNrAvailablePages) + MiPagesRequired; - Target = max(Target, (LONG) MiMinimumPagesPerRun); + Target = (MiMinimumAvailablePages - MiNrAvailablePages) + MiPagesRequired; + Target = max(Target, (LONG) MiMinimumPagesPerRun); - for (i = 0; i < MC_MAXIMUM && Target > 0; i++) - { + for (i = 0; i < MC_MAXIMUM && Target > 0; i++) + { if (MiMemoryConsumers[i].Trim != NULL) - { - Status = MiMemoryConsumers[i].Trim(Target, 0, &NrFreedPages); - if (!NT_SUCCESS(Status)) - { - KEBUGCHECK(0); - } - Target = Target - NrFreedPages; - } - } + { + Status = MiMemoryConsumers[i].Trim(Target, 0, &NrFreedPages); + if (!NT_SUCCESS(Status)) + { + KEBUGCHECK(0); + } + Target = Target - NrFreedPages; + } + } } static BOOLEAN MiIsBalancerThread(VOID) { - return MiBalancerThreadHandle != NULL && - PsGetCurrentThread() == MiBalancerThreadId.UniqueThread; + return MiBalancerThreadHandle != NULL && + PsGetCurrentThread() == MiBalancerThreadId.UniqueThread; } NTSTATUS -MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait, - PHYSICAL_ADDRESS* AllocatedPage) +MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait, + PHYSICAL_ADDRESS* AllocatedPage) { - ULONG OldUsed; - ULONG OldAvailable; - PHYSICAL_ADDRESS Page; - KIRQL oldIrql; - - /* - * Make sure we don't exceed our individual target. - */ - OldUsed = InterlockedIncrement((LONG *)&MiMemoryConsumers[Consumer].PagesUsed); - if (OldUsed >= (MiMemoryConsumers[Consumer].PagesTarget - 1) && - !MiIsBalancerThread()) - { - if (!CanWait) - { - InterlockedDecrement((LONG *)&MiMemoryConsumers[Consumer].PagesUsed); - return(STATUS_NO_MEMORY); - } - MiTrimMemoryConsumer(Consumer); - } + ULONG OldUsed; + ULONG OldAvailable; + PHYSICAL_ADDRESS Page; + KIRQL oldIrql; - OldAvailable = InterlockedDecrement((LONG *)&MiNrAvailablePages); - /* - * Allocate always memory for the non paged pool and for the pager thread. - */ - if (Consumer == MC_NPPOOL || MiIsBalancerThread()) - { + /* + * Make sure we don't exceed our individual target. + */ + OldUsed = InterlockedIncrement((LONG *)&MiMemoryConsumers[Consumer].PagesUsed); + if (OldUsed >= (MiMemoryConsumers[Consumer].PagesTarget - 1) && + !MiIsBalancerThread()) + { + if (!CanWait) + { + InterlockedDecrement((LONG *)&MiMemoryConsumers[Consumer].PagesUsed); + return(STATUS_NO_MEMORY); + } + MiTrimMemoryConsumer(Consumer); + } + + OldAvailable = InterlockedDecrement((LONG *)&MiNrAvailablePages); + /* + * Allocate always memory for the non paged pool and for the pager thread. + */ + if (Consumer == MC_NPPOOL || MiIsBalancerThread()) + { Page = MmAllocPage(Consumer, 0); #if defined(__GNUC__) + if (Page.QuadPart == 0LL) #else + if (Page.QuadPart == 0) #endif - { - KEBUGCHECK(0); - } + + { + KEBUGCHECK(0); + } *AllocatedPage = Page; if (OldAvailable < MiMinimumAvailablePages && - MiBalancerThreadHandle != NULL) - { - KeSetEvent(&MiBalancerEvent, IO_NO_INCREMENT, FALSE); - } + MiBalancerThreadHandle != NULL) + { + KeSetEvent(&MiBalancerEvent, IO_NO_INCREMENT, FALSE); + } return(STATUS_SUCCESS); - } + } - /* - * Make sure we don't exceed global targets. - */ - if (OldAvailable < MiMinimumAvailablePages) - { + /* + * Make sure we don't exceed global targets. + */ + if (OldAvailable < MiMinimumAvailablePages) + { MM_ALLOCATION_REQUEST Request; if (!CanWait) - { - InterlockedIncrement((LONG *)&MiNrAvailablePages); - InterlockedDecrement((LONG *)&MiMemoryConsumers[Consumer].PagesUsed); - return(STATUS_NO_MEMORY); - } + { + InterlockedIncrement((LONG *)&MiNrAvailablePages); + InterlockedDecrement((LONG *)&MiMemoryConsumers[Consumer].PagesUsed); + return(STATUS_NO_MEMORY); + } /* Insert an allocation request. */ #if defined(__GNUC__) Request.Page.QuadPart = 0LL; #else + Request.Page.QuadPart = 0; #endif + KeInitializeEvent(&Request.Event, NotificationEvent, FALSE); InterlockedIncrement((LONG *)&MiPagesRequired); - KeAcquireSpinLock(&AllocationListLock, &oldIrql); + KeAcquireSpinLock(&AllocationListLock, &oldIrql); if (MiBalancerThreadHandle != NULL) - { - KeSetEvent(&MiBalancerEvent, IO_NO_INCREMENT, FALSE); - } + { + KeSetEvent(&MiBalancerEvent, IO_NO_INCREMENT, FALSE); + } InsertTailList(&AllocationListHead, &Request.ListEntry); KeReleaseSpinLock(&AllocationListLock, oldIrql); KeWaitForSingleObject(&Request.Event, - 0, - KernelMode, - FALSE, - NULL); - + 0, + KernelMode, + FALSE, + NULL); + Page = Request.Page; #if defined(__GNUC__) + if (Page.QuadPart == 0LL) #else + if (Page.QuadPart == 0) #endif - { - KEBUGCHECK(0); - } + + { + KEBUGCHECK(0); + } MmTransferOwnershipPage(Page, Consumer); *AllocatedPage = Page; InterlockedDecrement((LONG *)&MiPagesRequired); return(STATUS_SUCCESS); - } - - /* - * Actually allocate the page. - */ - Page = MmAllocPage(Consumer, 0); -#if defined(__GNUC__) - if (Page.QuadPart == 0LL) -#else - if (Page.QuadPart == 0) -#endif - { - KEBUGCHECK(0); - } - *AllocatedPage = Page; + } - return(STATUS_SUCCESS); + /* + * Actually allocate the page. + */ + Page = MmAllocPage(Consumer, 0); +#if defined(__GNUC__) + + if (Page.QuadPart == 0LL) +#else + + if (Page.QuadPart == 0) +#endif + + { + KEBUGCHECK(0); + } + *AllocatedPage = Page; + + return(STATUS_SUCCESS); } VOID STDCALL MiBalancerThread(PVOID Unused) { - PVOID WaitObjects[2]; - NTSTATUS Status; - ULONG i; - ULONG NrFreedPages; - ULONG NrPagesUsed; - ULONG Target; - BOOLEAN ShouldRun; + PVOID WaitObjects[2]; + NTSTATUS Status; + ULONG i; + ULONG NrFreedPages; + ULONG NrPagesUsed; + ULONG Target; + BOOLEAN ShouldRun; - WaitObjects[0] = &MiBalancerEvent; - WaitObjects[1] = &MiBalancerTimer; + WaitObjects[0] = &MiBalancerEvent; + WaitObjects[1] = &MiBalancerTimer; - while (1) - { + while (1) + { Status = KeWaitForMultipleObjects(2, - WaitObjects, - WaitAny, - Executive, - KernelMode, - FALSE, - NULL, - NULL); + WaitObjects, + WaitAny, + Executive, + KernelMode, + FALSE, + NULL, + NULL); if (Status == STATUS_SUCCESS) - { - /* MiBalancerEvent */ - CHECKPOINT; - while (MiNrAvailablePages < MiMinimumAvailablePages + 5) - { - for (i = 0; i < MC_MAXIMUM; i++) - { - if (MiMemoryConsumers[i].Trim != NULL) - { - NrFreedPages = 0; - Status = MiMemoryConsumers[i].Trim(MiMinimumPagesPerRun, 0, &NrFreedPages); - if (!NT_SUCCESS(Status)) - { - KEBUGCHECK(0); - } - } - } - } - InterlockedExchange(&MiBalancerWork, 0); - CHECKPOINT; - } + { + /* MiBalancerEvent */ + CHECKPOINT; + while (MiNrAvailablePages < MiMinimumAvailablePages + 5) + { + for (i = 0; i < MC_MAXIMUM; i++) + { + if (MiMemoryConsumers[i].Trim != NULL) + { + NrFreedPages = 0; + Status = MiMemoryConsumers[i].Trim(MiMinimumPagesPerRun, 0, &NrFreedPages); + if (!NT_SUCCESS(Status)) + { + KEBUGCHECK(0); + } + } + } + } + InterlockedExchange(&MiBalancerWork, 0); + CHECKPOINT; + } else if (Status == STATUS_SUCCESS + 1) - { - /* MiBalancerTimer */ - ShouldRun = MiNrAvailablePages < MiMinimumAvailablePages + 5 ? TRUE : FALSE; - for (i = 0; i < MC_MAXIMUM; i++) - { - if (MiMemoryConsumers[i].Trim != NULL) - { - NrPagesUsed = MiMemoryConsumers[i].PagesUsed; - if (NrPagesUsed > MiMemoryConsumers[i].PagesTarget || ShouldRun) - { - if (NrPagesUsed > MiMemoryConsumers[i].PagesTarget) - { - Target = max (NrPagesUsed - MiMemoryConsumers[i].PagesTarget, - MiMinimumPagesPerRun); - } - else - { - Target = MiMinimumPagesPerRun; - } - NrFreedPages = 0; - Status = MiMemoryConsumers[i].Trim(Target, 0, &NrFreedPages); - if (!NT_SUCCESS(Status)) - { - KEBUGCHECK(0); - } - } - } - } - } + { + /* MiBalancerTimer */ + ShouldRun = MiNrAvailablePages < MiMinimumAvailablePages + 5 ? TRUE : FALSE; + for (i = 0; i < MC_MAXIMUM; i++) + { + if (MiMemoryConsumers[i].Trim != NULL) + { + NrPagesUsed = MiMemoryConsumers[i].PagesUsed; + if (NrPagesUsed > MiMemoryConsumers[i].PagesTarget || ShouldRun) + { + if (NrPagesUsed > MiMemoryConsumers[i].PagesTarget) + { + Target = max (NrPagesUsed - MiMemoryConsumers[i].PagesTarget, + MiMinimumPagesPerRun); + } + else + { + Target = MiMinimumPagesPerRun; + } + NrFreedPages = 0; + Status = MiMemoryConsumers[i].Trim(Target, 0, &NrFreedPages); + if (!NT_SUCCESS(Status)) + { + KEBUGCHECK(0); + } + } + } + } + } else - { - DPRINT1("KeWaitForMultipleObjects failt, status = %x\n", Status); - KEBUGCHECK(0); - } - } + { + DPRINT1("KeWaitForMultipleObjects failt, status = %x\n", Status); + KEBUGCHECK(0); + } + } } VOID INIT_FUNCTION MiInitBalancerThread(VOID) { - KPRIORITY Priority; - NTSTATUS Status; + KPRIORITY Priority; + NTSTATUS Status; #if !defined(__GNUC__) - LARGE_INTEGER dummyJunkNeeded; - dummyJunkNeeded.QuadPart = -20000000; /* 2 sec */; + + LARGE_INTEGER dummyJunkNeeded; + dummyJunkNeeded.QuadPart = -20000000; /* 2 sec */ + ; #endif - CHECKPOINT; + CHECKPOINT; - KeInitializeEvent(&MiBalancerEvent, SynchronizationEvent, FALSE); - KeInitializeTimerEx(&MiBalancerTimer, SynchronizationTimer); - KeSetTimerEx(&MiBalancerTimer, + KeInitializeEvent(&MiBalancerEvent, SynchronizationEvent, FALSE); + KeInitializeTimerEx(&MiBalancerTimer, SynchronizationTimer); + KeSetTimerEx(&MiBalancerTimer, #if defined(__GNUC__) - (LARGE_INTEGER)(LONGLONG)-20000000LL, /* 2 sec */ + (LARGE_INTEGER)(LONGLONG)-20000000LL, /* 2 sec */ #else - dummyJunkNeeded, + dummyJunkNeeded, #endif - 2000, /* 2 sec */ - NULL); + 2000, /* 2 sec */ + NULL); - Status = PsCreateSystemThread(&MiBalancerThreadHandle, - THREAD_ALL_ACCESS, - NULL, - NULL, - &MiBalancerThreadId, - (PKSTART_ROUTINE) MiBalancerThread, - NULL); - if (!NT_SUCCESS(Status)) - { + Status = PsCreateSystemThread(&MiBalancerThreadHandle, + THREAD_ALL_ACCESS, + NULL, + NULL, + &MiBalancerThreadId, + (PKSTART_ROUTINE) MiBalancerThread, + NULL); + if (!NT_SUCCESS(Status)) + { KEBUGCHECK(0); - } - - Priority = LOW_REALTIME_PRIORITY + 1; - NtSetInformationThread(MiBalancerThreadHandle, - ThreadPriority, - &Priority, - sizeof(Priority)); - + } + + Priority = LOW_REALTIME_PRIORITY + 1; + NtSetInformationThread(MiBalancerThreadHandle, + ThreadPriority, + &Priority, + sizeof(Priority)); + } diff --git a/reactos/ntoskrnl/mm/cont.c b/reactos/ntoskrnl/mm/cont.c index 03493ce7de3..7f316100fc7 100644 --- a/reactos/ntoskrnl/mm/cont.c +++ b/reactos/ntoskrnl/mm/cont.c @@ -1,4 +1,4 @@ -/* $Id: cont.c,v 1.30 2003/12/31 05:33:03 jfilby Exp $ +/* $Id: cont.c,v 1.31 2004/04/10 22:35:25 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -20,24 +20,24 @@ /* FUNCTIONS *****************************************************************/ VOID STATIC -MmFreeContinuousPage(PVOID Context, MEMORY_AREA* MemoryArea, PVOID Address, - PHYSICAL_ADDRESS PhysAddr, SWAPENTRY SwapEntry, - BOOLEAN Dirty) +MmFreeContinuousPage(PVOID Context, MEMORY_AREA* MemoryArea, PVOID Address, + PHYSICAL_ADDRESS PhysAddr, SWAPENTRY SwapEntry, + BOOLEAN Dirty) { - assert(SwapEntry == 0); - if (PhysAddr.QuadPart != 0) - { + assert(SwapEntry == 0); + if (PhysAddr.QuadPart != 0) + { MmReleasePageMemoryConsumer(MC_NPPOOL, PhysAddr); - } + } } PVOID STDCALL MmAllocateContiguousAlignedMemory(IN ULONG NumberOfBytes, - IN PHYSICAL_ADDRESS LowestAcceptableAddress OPTIONAL, - IN PHYSICAL_ADDRESS HighestAcceptableAddress, - IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL, - IN MEMORY_CACHING_TYPE CacheType OPTIONAL, - IN ULONG Alignment) + IN PHYSICAL_ADDRESS LowestAcceptableAddress OPTIONAL, + IN PHYSICAL_ADDRESS HighestAcceptableAddress, + IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL, + IN MEMORY_CACHING_TYPE CacheType OPTIONAL, + IN ULONG Alignment) { PMEMORY_AREA MArea; NTSTATUS Status; @@ -45,7 +45,7 @@ MmAllocateContiguousAlignedMemory(IN ULONG NumberOfBytes, PHYSICAL_ADDRESS PBase; ULONG Attributes; ULONG i; - + Attributes = PAGE_EXECUTE_READWRITE | PAGE_SYSTEM; if (CacheType == MmNonCached || CacheType == MmWriteCombined) { @@ -55,227 +55,231 @@ MmAllocateContiguousAlignedMemory(IN ULONG NumberOfBytes, { Attributes |= PAGE_WRITECOMBINE; } - + MmLockAddressSpace(MmGetKernelAddressSpace()); Status = MmCreateMemoryArea(NULL, - MmGetKernelAddressSpace(), - MEMORY_AREA_CONTINUOUS_MEMORY, - &BaseAddress, - NumberOfBytes, - 0, - &MArea, - FALSE, - FALSE, - BoundaryAddressMultiple); + MmGetKernelAddressSpace(), + MEMORY_AREA_CONTINUOUS_MEMORY, + &BaseAddress, + NumberOfBytes, + 0, + &MArea, + FALSE, + FALSE, + BoundaryAddressMultiple); MmUnlockAddressSpace(MmGetKernelAddressSpace()); if (!NT_SUCCESS(Status)) - { - return(NULL); - } + { + return(NULL); + } DPRINT( "Base = %x\n", BaseAddress ); PBase = MmGetContinuousPages(NumberOfBytes, - LowestAcceptableAddress, - HighestAcceptableAddress, - Alignment); + LowestAcceptableAddress, + HighestAcceptableAddress, + Alignment); #if defined(__GNUC__) + if (PBase.QuadPart == 0LL) #else + if (PBase.QuadPart == 0) #endif - { - MmLockAddressSpace(MmGetKernelAddressSpace()); - MmFreeMemoryArea(MmGetKernelAddressSpace(), - BaseAddress, - 0, - NULL, - NULL); - MmUnlockAddressSpace(MmGetKernelAddressSpace()); - return(NULL); - } + + { + MmLockAddressSpace(MmGetKernelAddressSpace()); + MmFreeMemoryArea(MmGetKernelAddressSpace(), + BaseAddress, + 0, + NULL, + NULL); + MmUnlockAddressSpace(MmGetKernelAddressSpace()); + return(NULL); + } for (i = 0; i < (PAGE_ROUND_UP(NumberOfBytes) / 4096); i++) - { + { #if !defined(__GNUC__) - LARGE_INTEGER dummyJunkNeeded; - dummyJunkNeeded.QuadPart = PBase.QuadPart + (i * 4096); + LARGE_INTEGER dummyJunkNeeded; + dummyJunkNeeded.QuadPart = PBase.QuadPart + (i * 4096); #endif - MmCreateVirtualMapping(NULL, - (char*)BaseAddress + (i * 4096), - Attributes, + + MmCreateVirtualMapping(NULL, + (char*)BaseAddress + (i * 4096), + Attributes, #if defined(__GNUC__) - (LARGE_INTEGER)(PBase.QuadPart + (i * 4096)), + (LARGE_INTEGER)(PBase.QuadPart + (i * 4096)), #else - dummyJunkNeeded, + dummyJunkNeeded, #endif - TRUE); - } + TRUE); + } return(BaseAddress); } /********************************************************************** - * NAME EXPORTED - * MmAllocateContiguousMemory@12 + * NAME EXPORTED + * MmAllocateContiguousMemory@12 * * DESCRIPTION - * Allocates a range of physically contiguous cache aligned - * memory from the non-paged pool. - * + * Allocates a range of physically contiguous cache aligned + * memory from the non-paged pool. + * * ARGUMENTS - * NumberOfBytes - * Size of the memory block to allocate; - * - * HighestAcceptableAddress - * Highest address valid for the caller. - * + * NumberOfBytes + * Size of the memory block to allocate; + * + * HighestAcceptableAddress + * Highest address valid for the caller. + * * RETURN VALUE - * The virtual address of the memory block on success; - * NULL on error. + * The virtual address of the memory block on success; + * NULL on error. * * NOTE - * Description taken from include/ddk/mmfuncs.h. - * Code taken from ntoskrnl/mm/special.c. + * Description taken from include/ddk/mmfuncs.h. + * Code taken from ntoskrnl/mm/special.c. * * REVISIONS * * @implemented */ -PVOID STDCALL +PVOID STDCALL MmAllocateContiguousMemory (IN ULONG NumberOfBytes, - IN PHYSICAL_ADDRESS HighestAcceptableAddress) + IN PHYSICAL_ADDRESS HighestAcceptableAddress) { - PHYSICAL_ADDRESS LowestAcceptableAddress; - PHYSICAL_ADDRESS BoundaryAddressMultiple; - - LowestAcceptableAddress.QuadPart = 0; - BoundaryAddressMultiple.QuadPart = 0; - - return(MmAllocateContiguousAlignedMemory(NumberOfBytes, - LowestAcceptableAddress, - HighestAcceptableAddress, - BoundaryAddressMultiple, - MmCached, - PAGE_SIZE)); + PHYSICAL_ADDRESS LowestAcceptableAddress; + PHYSICAL_ADDRESS BoundaryAddressMultiple; + + LowestAcceptableAddress.QuadPart = 0; + BoundaryAddressMultiple.QuadPart = 0; + + return(MmAllocateContiguousAlignedMemory(NumberOfBytes, + LowestAcceptableAddress, + HighestAcceptableAddress, + BoundaryAddressMultiple, + MmCached, + PAGE_SIZE)); } /********************************************************************** - * NAME EXPORTED - * MmFreeContiguousMemory@4 + * NAME EXPORTED + * MmFreeContiguousMemory@4 * * DESCRIPTION - * Releases a range of physically contiguous memory allocated - * with MmAllocateContiguousMemory. - * + * Releases a range of physically contiguous memory allocated + * with MmAllocateContiguousMemory. + * * ARGUMENTS - * BaseAddress - * Virtual address of the memory to be freed. + * BaseAddress + * Virtual address of the memory to be freed. * * RETURN VALUE - * None. + * None. * * NOTE - * Description taken from include/ddk/mmfuncs.h. - * Code taken from ntoskrnl/mm/special.c. + * Description taken from include/ddk/mmfuncs.h. + * Code taken from ntoskrnl/mm/special.c. * * REVISIONS * * @implemented */ -VOID STDCALL +VOID STDCALL MmFreeContiguousMemory(IN PVOID BaseAddress) { MmLockAddressSpace(MmGetKernelAddressSpace()); MmFreeMemoryArea(MmGetKernelAddressSpace(), - BaseAddress, - 0, - MmFreeContinuousPage, - NULL); + BaseAddress, + 0, + MmFreeContinuousPage, + NULL); MmUnlockAddressSpace(MmGetKernelAddressSpace()); } /********************************************************************** - * NAME EXPORTED - * MmAllocateContiguousMemorySpecifyCache@32 + * NAME EXPORTED + * MmAllocateContiguousMemorySpecifyCache@32 * * DESCRIPTION - * Allocates a range of physically contiguous memory - * with a cache parameter. - * + * Allocates a range of physically contiguous memory + * with a cache parameter. + * * ARGUMENTS - * NumberOfBytes - * Size of the memory block to allocate; - * - * LowestAcceptableAddress - * Lowest address valid for the caller. - * - * HighestAcceptableAddress - * Highest address valid for the caller. - * - * BoundaryAddressMultiple - * Address multiple not to be crossed by allocated buffer (optional). - * - * CacheType - * Type of caching to use. - * + * NumberOfBytes + * Size of the memory block to allocate; + * + * LowestAcceptableAddress + * Lowest address valid for the caller. + * + * HighestAcceptableAddress + * Highest address valid for the caller. + * + * BoundaryAddressMultiple + * Address multiple not to be crossed by allocated buffer (optional). + * + * CacheType + * Type of caching to use. + * * RETURN VALUE - * The virtual address of the memory block on success; - * NULL on error. + * The virtual address of the memory block on success; + * NULL on error. * * REVISIONS * * @implemented */ -PVOID STDCALL +PVOID STDCALL MmAllocateContiguousMemorySpecifyCache (IN ULONG NumberOfBytes, - IN PHYSICAL_ADDRESS LowestAcceptableAddress, - IN PHYSICAL_ADDRESS HighestAcceptableAddress, - IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL, - IN MEMORY_CACHING_TYPE CacheType) + IN PHYSICAL_ADDRESS LowestAcceptableAddress, + IN PHYSICAL_ADDRESS HighestAcceptableAddress, + IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL, + IN MEMORY_CACHING_TYPE CacheType) { - return(MmAllocateContiguousAlignedMemory(NumberOfBytes, - LowestAcceptableAddress, - HighestAcceptableAddress, - BoundaryAddressMultiple, - CacheType, - PAGE_SIZE)); + return(MmAllocateContiguousAlignedMemory(NumberOfBytes, + LowestAcceptableAddress, + HighestAcceptableAddress, + BoundaryAddressMultiple, + CacheType, + PAGE_SIZE)); } /********************************************************************** - * NAME EXPORTED - * MmFreeContiguousMemorySpecifyCache@12 + * NAME EXPORTED + * MmFreeContiguousMemorySpecifyCache@12 * * DESCRIPTION - * Releases a range of physically contiguous memory allocated - * with MmAllocateContiguousMemorySpecifyCache. - * + * Releases a range of physically contiguous memory allocated + * with MmAllocateContiguousMemorySpecifyCache. + * * ARGUMENTS - * BaseAddress - * Virtual address of the memory to be freed. + * BaseAddress + * Virtual address of the memory to be freed. * - * NumberOfBytes - * Size of the memory block to free. - * - * CacheType - * Type of caching used. - * + * NumberOfBytes + * Size of the memory block to free. + * + * CacheType + * Type of caching used. + * * RETURN VALUE - * None. + * None. * * REVISIONS * * @implemented */ -VOID STDCALL +VOID STDCALL MmFreeContiguousMemorySpecifyCache(IN PVOID BaseAddress, - IN ULONG NumberOfBytes, - IN MEMORY_CACHING_TYPE CacheType) + IN ULONG NumberOfBytes, + IN MEMORY_CACHING_TYPE CacheType) { MmLockAddressSpace(MmGetKernelAddressSpace()); MmFreeMemoryArea(MmGetKernelAddressSpace(), - BaseAddress, - NumberOfBytes, - MmFreeContinuousPage, - NULL); + BaseAddress, + NumberOfBytes, + MmFreeContinuousPage, + NULL); MmUnlockAddressSpace(MmGetKernelAddressSpace()); } diff --git a/reactos/ntoskrnl/mm/drvlck.c b/reactos/ntoskrnl/mm/drvlck.c index c9e7367d0a9..27ab0dd75c2 100644 --- a/reactos/ntoskrnl/mm/drvlck.c +++ b/reactos/ntoskrnl/mm/drvlck.c @@ -1,4 +1,4 @@ -/* $Id: drvlck.c,v 1.4 2003/07/10 21:05:03 royce Exp $ +/* $Id: drvlck.c,v 1.5 2004/04/10 22:35:25 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -30,8 +30,8 @@ MmUnlockPagableImageSection(IN PVOID ImageSectionHandle) * MmLockPagableDataSection */ { -// MmUnlockMemoryArea((MEMORY_AREA *)ImageSectionHandle); - UNIMPLEMENTED; + // MmUnlockMemoryArea((MEMORY_AREA *)ImageSectionHandle); + UNIMPLEMENTED; } #endif @@ -42,8 +42,8 @@ MmUnlockPagableImageSection(IN PVOID ImageSectionHandle) VOID STDCALL MmLockPagableSectionByHandle(IN PVOID ImageSectionHandle) { -// MmLockMemoryArea((MEMORY_AREA *)ImageSectionHandle); - UNIMPLEMENTED; + // MmLockMemoryArea((MEMORY_AREA *)ImageSectionHandle); + UNIMPLEMENTED; } @@ -51,10 +51,10 @@ MmLockPagableSectionByHandle(IN PVOID ImageSectionHandle) PVOID MmLockPagableCodeSection(IN PVOID AddressWithinSection) { - PVOID Handle; - Handle = MmOpenMemoryAreaByAddress(NULL,AddressWithinSection); - MmLockPagableSectionByHandle(Handle); - return(Handle); + PVOID Handle; + Handle = MmOpenMemoryAreaByAddress(NULL,AddressWithinSection); + MmLockPagableSectionByHandle(Handle); + return(Handle); } #endif @@ -65,10 +65,10 @@ MmLockPagableCodeSection(IN PVOID AddressWithinSection) PVOID STDCALL MmLockPagableDataSection(IN PVOID AddressWithinSection) { - PVOID Handle; - Handle = MmOpenMemoryAreaByAddress(NULL,AddressWithinSection); - MmLockPagableSectionByHandle(Handle); - return(Handle); + PVOID Handle; + Handle = MmOpenMemoryAreaByAddress(NULL,AddressWithinSection); + MmLockPagableSectionByHandle(Handle); + return(Handle); } @@ -77,8 +77,7 @@ MmLockPagableDataSection(IN PVOID AddressWithinSection) */ VOID STDCALL MmUnlockPagableImageSection(IN PVOID ImageSectionHandle) -{ -} +{} /* @@ -86,8 +85,7 @@ MmUnlockPagableImageSection(IN PVOID ImageSectionHandle) */ VOID STDCALL MmPageEntireDriver(IN PVOID AddressWithinSection) -{ -} +{} /* @@ -95,7 +93,6 @@ MmPageEntireDriver(IN PVOID AddressWithinSection) */ VOID STDCALL MmResetDriverPaging(IN PVOID AddressWithinSection) -{ -} +{} /* EOF */ diff --git a/reactos/ntoskrnl/mm/freelist.c b/reactos/ntoskrnl/mm/freelist.c index c764a574647..f6987b9cbe2 100644 --- a/reactos/ntoskrnl/mm/freelist.c +++ b/reactos/ntoskrnl/mm/freelist.c @@ -26,23 +26,27 @@ typedef struct _PHYSICAL_PAGE { - union - { - struct - { - ULONG Type:2; - ULONG Consumer:3; - }Flags; - ULONG AllFlags; - }; + union + { + struct + { +ULONG Type: + 2; +ULONG Consumer: + 3; + } + Flags; + ULONG AllFlags; + }; - LIST_ENTRY ListEntry; - ULONG ReferenceCount; - SWAPENTRY SavedSwapEntry; - ULONG LockCount; - ULONG MapCount; - struct _MM_RMAP_ENTRY* RmapListHead; -} PHYSICAL_PAGE, *PPHYSICAL_PAGE; + LIST_ENTRY ListEntry; + ULONG ReferenceCount; + SWAPENTRY SavedSwapEntry; + ULONG LockCount; + ULONG MapCount; + struct _MM_RMAP_ENTRY* RmapListHead; +} +PHYSICAL_PAGE, *PPHYSICAL_PAGE; /* GLOBALS ****************************************************************/ @@ -67,112 +71,124 @@ static ULONG UnzeroedPageCount = 0; VOID MmTransferOwnershipPage(PHYSICAL_ADDRESS PhysicalAddress, ULONG NewConsumer) { - ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE; - KIRQL oldIrql; + ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE; + KIRQL oldIrql; - KeAcquireSpinLock(&PageListLock, &oldIrql); - if (MmPageArray[Start].MapCount != 0) - { + KeAcquireSpinLock(&PageListLock, &oldIrql); + if (MmPageArray[Start].MapCount != 0) + { DbgPrint("Transfering mapped page.\n"); KEBUGCHECK(0); - } - RemoveEntryList(&MmPageArray[Start].ListEntry); - InsertTailList(&UsedPageListHeads[NewConsumer], - &MmPageArray[Start].ListEntry); - MmPageArray[Start].Flags.Consumer = NewConsumer; - KeReleaseSpinLock(&PageListLock, oldIrql); - MiZeroPage(PhysicalAddress); + } + RemoveEntryList(&MmPageArray[Start].ListEntry); + InsertTailList(&UsedPageListHeads[NewConsumer], + &MmPageArray[Start].ListEntry); + MmPageArray[Start].Flags.Consumer = NewConsumer; + KeReleaseSpinLock(&PageListLock, oldIrql); + MiZeroPage(PhysicalAddress); } PHYSICAL_ADDRESS MmGetLRUFirstUserPage(VOID) { - PLIST_ENTRY NextListEntry; - PHYSICAL_ADDRESS Next; - PHYSICAL_PAGE* PageDescriptor; - KIRQL oldIrql; + PLIST_ENTRY NextListEntry; + PHYSICAL_ADDRESS Next; + PHYSICAL_PAGE* PageDescriptor; + KIRQL oldIrql; - KeAcquireSpinLock(&PageListLock, &oldIrql); - NextListEntry = UsedPageListHeads[MC_USER].Flink; - if (NextListEntry == &UsedPageListHeads[MC_USER]) - { + KeAcquireSpinLock(&PageListLock, &oldIrql); + NextListEntry = UsedPageListHeads[MC_USER].Flink; + if (NextListEntry == &UsedPageListHeads[MC_USER]) + { KeReleaseSpinLock(&PageListLock, oldIrql); #if defined(__GNUC__) + return((PHYSICAL_ADDRESS)0LL); #else + { - const PHYSICAL_ADDRESS dummyJunkNeeded = { 0 }; - return dummyJunkNeeded; + const PHYSICAL_ADDRESS dummyJunkNeeded = + { + 0 + }; + return dummyJunkNeeded; } #endif - } - PageDescriptor = CONTAINING_RECORD(NextListEntry, PHYSICAL_PAGE, ListEntry); - Next.QuadPart = (ULONG)((ULONG)PageDescriptor - (ULONG)MmPageArray); - Next.QuadPart = (Next.QuadPart / sizeof(PHYSICAL_PAGE)) * PAGE_SIZE; - KeReleaseSpinLock(&PageListLock, oldIrql); - return(Next); + + } + PageDescriptor = CONTAINING_RECORD(NextListEntry, PHYSICAL_PAGE, ListEntry); + Next.QuadPart = (ULONG)((ULONG)PageDescriptor - (ULONG)MmPageArray); + Next.QuadPart = (Next.QuadPart / sizeof(PHYSICAL_PAGE)) * PAGE_SIZE; + KeReleaseSpinLock(&PageListLock, oldIrql); + return(Next); } VOID MmSetLRULastPage(PHYSICAL_ADDRESS PhysicalAddress) { - ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE; - KIRQL oldIrql; + ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE; + KIRQL oldIrql; - KeAcquireSpinLock(&PageListLock, &oldIrql); - if (MmPageArray[Start].Flags.Type == MM_PHYSICAL_PAGE_USED && - MmPageArray[Start].Flags.Consumer == MC_USER) - { + KeAcquireSpinLock(&PageListLock, &oldIrql); + if (MmPageArray[Start].Flags.Type == MM_PHYSICAL_PAGE_USED && + MmPageArray[Start].Flags.Consumer == MC_USER) + { RemoveEntryList(&MmPageArray[Start].ListEntry); - InsertTailList(&UsedPageListHeads[MC_USER], - &MmPageArray[Start].ListEntry); - } - KeReleaseSpinLock(&PageListLock, oldIrql); + InsertTailList(&UsedPageListHeads[MC_USER], + &MmPageArray[Start].ListEntry); + } + KeReleaseSpinLock(&PageListLock, oldIrql); } PHYSICAL_ADDRESS MmGetLRUNextUserPage(PHYSICAL_ADDRESS PreviousPhysicalAddress) { - ULONG Start = PreviousPhysicalAddress.u.LowPart / PAGE_SIZE; - PLIST_ENTRY NextListEntry; - PHYSICAL_ADDRESS Next; - PHYSICAL_PAGE* PageDescriptor; - KIRQL oldIrql; + ULONG Start = PreviousPhysicalAddress.u.LowPart / PAGE_SIZE; + PLIST_ENTRY NextListEntry; + PHYSICAL_ADDRESS Next; + PHYSICAL_PAGE* PageDescriptor; + KIRQL oldIrql; - KeAcquireSpinLock(&PageListLock, &oldIrql); - if (MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_USED || - MmPageArray[Start].Flags.Consumer != MC_USER) - { + KeAcquireSpinLock(&PageListLock, &oldIrql); + if (MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_USED || + MmPageArray[Start].Flags.Consumer != MC_USER) + { NextListEntry = UsedPageListHeads[MC_USER].Flink; - } - else - { + } + else + { NextListEntry = MmPageArray[Start].ListEntry.Flink; - } - if (NextListEntry == &UsedPageListHeads[MC_USER]) - { + } + if (NextListEntry == &UsedPageListHeads[MC_USER]) + { KeReleaseSpinLock(&PageListLock, oldIrql); #if defined(__GNUC__) + return((PHYSICAL_ADDRESS)0LL); #else + { - const PHYSICAL_ADDRESS dummyJunkNeeded = { 0 }; - return dummyJunkNeeded; + const PHYSICAL_ADDRESS dummyJunkNeeded = + { + 0 + }; + return dummyJunkNeeded; } #endif - } - PageDescriptor = CONTAINING_RECORD(NextListEntry, PHYSICAL_PAGE, ListEntry); - Next.QuadPart = (ULONG)((ULONG)PageDescriptor - (ULONG)MmPageArray); - Next.QuadPart = (Next.QuadPart / sizeof(PHYSICAL_PAGE)) * PAGE_SIZE; - KeReleaseSpinLock(&PageListLock, oldIrql); - return(Next); + + } + PageDescriptor = CONTAINING_RECORD(NextListEntry, PHYSICAL_PAGE, ListEntry); + Next.QuadPart = (ULONG)((ULONG)PageDescriptor - (ULONG)MmPageArray); + Next.QuadPart = (Next.QuadPart / sizeof(PHYSICAL_PAGE)) * PAGE_SIZE; + KeReleaseSpinLock(&PageListLock, oldIrql); + return(Next); } PHYSICAL_ADDRESS MmGetContinuousPages(ULONG NumberOfBytes, - PHYSICAL_ADDRESS LowestAcceptableAddress, - PHYSICAL_ADDRESS HighestAcceptableAddress, - ULONG Alignment) + PHYSICAL_ADDRESS LowestAcceptableAddress, + PHYSICAL_ADDRESS HighestAcceptableAddress, + ULONG Alignment) { ULONG NrPages; ULONG i; @@ -187,64 +203,75 @@ MmGetContinuousPages(ULONG NumberOfBytes, start = -1; length = 0; for (i = (LowestAcceptableAddress.QuadPart / PAGE_SIZE); i < (HighestAcceptableAddress.QuadPart / PAGE_SIZE); ) - { - if (MmPageArray[i].Flags.Type == MM_PHYSICAL_PAGE_FREE) - { - if (start == -1) - { - start = i; - length = 1; - } - else - { - length++; - } - i++; - if (length == NrPages) - { - break; - } - } - else - { - start = -1; - /* - * Fast forward to the base of the next aligned region - */ - i = ROUND_UP((i + 1), (Alignment / PAGE_SIZE)); - } - } + { + if (MmPageArray[i].Flags.Type == MM_PHYSICAL_PAGE_FREE) + { + if (start == -1) + { + start = i; + length = 1; + } + else + { + length++; + } + i++; + if (length == NrPages) + { + break; + } + } + else + { + start = -1; + /* + * Fast forward to the base of the next aligned region + */ + i = ROUND_UP((i + 1), (Alignment / PAGE_SIZE)); + } + } if (start == -1 || length != NrPages) - { - KeReleaseSpinLock(&PageListLock, oldIrql); + { + KeReleaseSpinLock(&PageListLock, oldIrql); #if defined(__GNUC__) - return((PHYSICAL_ADDRESS)(LONGLONG)0); + + return((PHYSICAL_ADDRESS)(LONGLONG)0); #else - { - const PHYSICAL_ADDRESS dummyJunkNeeded = { 0 }; - return dummyJunkNeeded; + + { + const PHYSICAL_ADDRESS dummyJunkNeeded = + { + 0 + }; + return dummyJunkNeeded; } #endif - } + + } for (i = start; i < (start + length); i++) - { - RemoveEntryList(&MmPageArray[i].ListEntry); - MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_USED; - MmPageArray[i].Flags.Consumer = MC_NPPOOL; - MmPageArray[i].ReferenceCount = 1; - MmPageArray[i].LockCount = 0; - MmPageArray[i].MapCount = 0; - MmPageArray[i].SavedSwapEntry = 0; - InsertTailList(&UsedPageListHeads[MC_NPPOOL], - &MmPageArray[i].ListEntry); - } + { + RemoveEntryList(&MmPageArray[i].ListEntry); + MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_USED; + MmPageArray[i].Flags.Consumer = MC_NPPOOL; + MmPageArray[i].ReferenceCount = 1; + MmPageArray[i].LockCount = 0; + MmPageArray[i].MapCount = 0; + MmPageArray[i].SavedSwapEntry = 0; + InsertTailList(&UsedPageListHeads[MC_NPPOOL], + &MmPageArray[i].ListEntry); + } KeReleaseSpinLock(&PageListLock, oldIrql); #if defined(__GNUC__) + return((PHYSICAL_ADDRESS)((LONGLONG)start * PAGE_SIZE)); #else + { - const PHYSICAL_ADDRESS dummyJunkNeeded = { start * PAGE_SIZE }; - return dummyJunkNeeded; + const PHYSICAL_ADDRESS dummyJunkNeeded = + { + start * PAGE_SIZE + }; + return dummyJunkNeeded; } #endif } @@ -252,91 +279,91 @@ MmGetContinuousPages(ULONG NumberOfBytes, VOID INIT_FUNCTION MiParseRangeToFreeList(PADDRESS_RANGE Range) { - ULONG i, first, last; + ULONG i, first, last; - /* FIXME: Not 64-bit ready */ + /* FIXME: Not 64-bit ready */ - DPRINT("Range going to free list (Base 0x%X, Length 0x%X, Type 0x%X)\n", - Range->BaseAddrLow, - Range->LengthLow, - Range->Type); - - first = (Range->BaseAddrLow + PAGE_SIZE - 1) / PAGE_SIZE; - last = first + ((Range->LengthLow + PAGE_SIZE - 1) / PAGE_SIZE); - for (i = first; i < last && i < MmPageArraySize; i++) - { + DPRINT("Range going to free list (Base 0x%X, Length 0x%X, Type 0x%X)\n", + Range->BaseAddrLow, + Range->LengthLow, + Range->Type); + + first = (Range->BaseAddrLow + PAGE_SIZE - 1) / PAGE_SIZE; + last = first + ((Range->LengthLow + PAGE_SIZE - 1) / PAGE_SIZE); + for (i = first; i < last && i < MmPageArraySize; i++) + { if (MmPageArray[i].Flags.Type == 0) - { - MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_FREE; - MmPageArray[i].ReferenceCount = 0; - InsertTailList(&FreeUnzeroedPageListHead, - &MmPageArray[i].ListEntry); - UnzeroedPageCount++; - } - } + { + MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_FREE; + MmPageArray[i].ReferenceCount = 0; + InsertTailList(&FreeUnzeroedPageListHead, + &MmPageArray[i].ListEntry); + UnzeroedPageCount++; + } + } } VOID INIT_FUNCTION MiParseRangeToBiosList(PADDRESS_RANGE Range) { - ULONG i, first, last; - - /* FIXME: Not 64-bit ready */ + ULONG i, first, last; - DPRINT("Range going to bios list (Base 0x%X, Length 0x%X, Type 0x%X)\n", - Range->BaseAddrLow, - Range->LengthLow, - Range->Type); - - first = (Range->BaseAddrLow + PAGE_SIZE - 1) / PAGE_SIZE; - last = first + ((Range->LengthLow + PAGE_SIZE - 1) / PAGE_SIZE); - for (i = first; i < last && i < MmPageArraySize; i++) - { + /* FIXME: Not 64-bit ready */ + + DPRINT("Range going to bios list (Base 0x%X, Length 0x%X, Type 0x%X)\n", + Range->BaseAddrLow, + Range->LengthLow, + Range->Type); + + first = (Range->BaseAddrLow + PAGE_SIZE - 1) / PAGE_SIZE; + last = first + ((Range->LengthLow + PAGE_SIZE - 1) / PAGE_SIZE); + for (i = first; i < last && i < MmPageArraySize; i++) + { /* Remove the page from the free list if it is there */ if (MmPageArray[i].Flags.Type == MM_PHYSICAL_PAGE_FREE) - { - RemoveEntryList(&MmPageArray[i].ListEntry); - } - + { + RemoveEntryList(&MmPageArray[i].ListEntry); + } + if (MmPageArray[i].Flags.Type != MM_PHYSICAL_PAGE_BIOS) - { - MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_BIOS; - MmPageArray[i].Flags.Consumer = MC_NPPOOL; - MmPageArray[i].ReferenceCount = 1; - InsertTailList(&BiosPageListHead, - &MmPageArray[i].ListEntry); - } - } + { + MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_BIOS; + MmPageArray[i].Flags.Consumer = MC_NPPOOL; + MmPageArray[i].ReferenceCount = 1; + InsertTailList(&BiosPageListHead, + &MmPageArray[i].ListEntry); + } + } } VOID INIT_FUNCTION MiParseBIOSMemoryMap(PADDRESS_RANGE BIOSMemoryMap, - ULONG AddressRangeCount) + ULONG AddressRangeCount) { - PADDRESS_RANGE p; - ULONG i; + PADDRESS_RANGE p; + ULONG i; - p = BIOSMemoryMap; - for (i = 0; i < AddressRangeCount; i++, p++) - { + p = BIOSMemoryMap; + for (i = 0; i < AddressRangeCount; i++, p++) + { if (p->Type == 1) - { - MiParseRangeToFreeList(p); - } + { + MiParseRangeToFreeList(p); + } else - { - MiParseRangeToBiosList(p); - } - } + { + MiParseRangeToBiosList(p); + } + } } PVOID INIT_FUNCTION MmInitializePageList(PVOID FirstPhysKernelAddress, - PVOID LastPhysKernelAddress, - ULONG MemorySizeInPages, - ULONG LastKernelAddress, - PADDRESS_RANGE BIOSMemoryMap, - ULONG AddressRangeCount) + PVOID LastPhysKernelAddress, + ULONG MemorySizeInPages, + ULONG LastKernelAddress, + PADDRESS_RANGE BIOSMemoryMap, + ULONG AddressRangeCount) /* * FUNCTION: Initializes the page list with all pages free * except those known to be reserved and those used by the kernel @@ -351,17 +378,17 @@ MmInitializePageList(PVOID FirstPhysKernelAddress, NTSTATUS Status; DPRINT("MmInitializePageList(FirstPhysKernelAddress %x, " - "LastPhysKernelAddress %x, " - "MemorySizeInPages %x, LastKernelAddress %x)\n", - FirstPhysKernelAddress, - LastPhysKernelAddress, - MemorySizeInPages, - LastKernelAddress); + "LastPhysKernelAddress %x, " + "MemorySizeInPages %x, LastKernelAddress %x)\n", + FirstPhysKernelAddress, + LastPhysKernelAddress, + MemorySizeInPages, + LastKernelAddress); for (i = 0; i < MC_MAXIMUM; i++) - { - InitializeListHead(&UsedPageListHeads[i]); - } + { + InitializeListHead(&UsedPageListHeads[i]); + } KeInitializeSpinLock(&PageListLock); InitializeListHead(&FreeUnzeroedPageListHead); InitializeListHead(&FreeZeroedPageListHead); @@ -370,8 +397,8 @@ MmInitializePageList(PVOID FirstPhysKernelAddress, LastKernelAddress = PAGE_ROUND_UP(LastKernelAddress); MmPageArraySize = MemorySizeInPages; - Reserved = - PAGE_ROUND_UP((MmPageArraySize * sizeof(PHYSICAL_PAGE))) / PAGE_SIZE; + Reserved = + PAGE_ROUND_UP((MmPageArraySize * sizeof(PHYSICAL_PAGE))) / PAGE_SIZE; MmPageArray = (PHYSICAL_PAGE *)LastKernelAddress; DPRINT("Reserved %d\n", Reserved); @@ -387,39 +414,41 @@ MmInitializePageList(PVOID FirstPhysKernelAddress, MmStats.NrReservedPages = 0; MmStats.NrFreePages = 0; MmStats.NrLockedPages = 0; - + for (i = 0; i < Reserved; i++) - { - PVOID Address = (char*)(ULONG)MmPageArray + (i * PAGE_SIZE); - if (!MmIsPagePresent(NULL, Address)) - { + { + PVOID Address = (char*)(ULONG)MmPageArray + (i * PAGE_SIZE); + if (!MmIsPagePresent(NULL, Address)) + { #if !defined(__GNUC__) - const PHYSICAL_ADDRESS dummyJunkNeeded = { - (ULONG)LastPhysKernelAddress - - (Reserved * PAGE_SIZE) + (i * PAGE_SIZE) - }; + const PHYSICAL_ADDRESS dummyJunkNeeded = + { + (ULONG)LastPhysKernelAddress - + (Reserved * PAGE_SIZE) + (i * PAGE_SIZE) + }; #endif - ULONG PhysicalAddress = (ULONG)LastPhysKernelAddress - - (Reserved * PAGE_SIZE) + (i * PAGE_SIZE); - Status = - MmCreateVirtualMappingUnsafe(NULL, - Address, - PAGE_READWRITE, + + ULONG PhysicalAddress = (ULONG)LastPhysKernelAddress - + (Reserved * PAGE_SIZE) + (i * PAGE_SIZE); + Status = + MmCreateVirtualMappingUnsafe(NULL, + Address, + PAGE_READWRITE, #if defined(__GNUC__) - (PHYSICAL_ADDRESS)(LONGLONG)PhysicalAddress, + (PHYSICAL_ADDRESS)(LONGLONG)PhysicalAddress, #else - dummyJunkNeeded, + dummyJunkNeeded, #endif - FALSE); - if (!NT_SUCCESS(Status)) - { - DbgPrint("Unable to create virtual mapping\n"); - KEBUGCHECK(0); - } - } - memset((char*)MmPageArray + (i * PAGE_SIZE), 0, PAGE_SIZE); - } - + FALSE); + if (!NT_SUCCESS(Status)) + { + DbgPrint("Unable to create virtual mapping\n"); + KEBUGCHECK(0); + } + } + memset((char*)MmPageArray + (i * PAGE_SIZE), 0, PAGE_SIZE); + } + /* * Page zero is reserved @@ -428,7 +457,7 @@ MmInitializePageList(PVOID FirstPhysKernelAddress, MmPageArray[0].Flags.Consumer = MC_NPPOOL; MmPageArray[0].ReferenceCount = 0; InsertTailList(&BiosPageListHead, - &MmPageArray[0].ListEntry); + &MmPageArray[0].ListEntry); /* * Page one is reserved for the initial KPCR @@ -437,118 +466,118 @@ MmInitializePageList(PVOID FirstPhysKernelAddress, MmPageArray[1].Flags.Consumer = MC_NPPOOL; MmPageArray[1].ReferenceCount = 0; InsertTailList(&BiosPageListHead, - &MmPageArray[1].ListEntry); + &MmPageArray[1].ListEntry); i = 2; if ((ULONG)FirstPhysKernelAddress < 0xa0000) - { - MmStats.NrFreePages += (((ULONG)FirstPhysKernelAddress/PAGE_SIZE) - 2); - for (; i<((ULONG)FirstPhysKernelAddress/PAGE_SIZE); i++) - { - MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_FREE; - MmPageArray[i].ReferenceCount = 0; - InsertTailList(&FreeUnzeroedPageListHead, - &MmPageArray[i].ListEntry); - UnzeroedPageCount++; - } - MmStats.NrSystemPages += - ((((ULONG)LastPhysKernelAddress) / PAGE_SIZE) - i); - for (; i<((ULONG)LastPhysKernelAddress / PAGE_SIZE); i++) - { - MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_USED; - MmPageArray[i].Flags.Consumer = MC_NPPOOL; - MmPageArray[i].ReferenceCount = 1; - MmPageArray[i].MapCount = 1; - InsertTailList(&UsedPageListHeads[MC_NPPOOL], - &MmPageArray[i].ListEntry); - } - MmStats.NrFreePages += ((0xa0000/PAGE_SIZE) - i); - for (; i<(0xa0000/PAGE_SIZE); i++) - { - MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_FREE; - MmPageArray[i].ReferenceCount = 0; - InsertTailList(&FreeUnzeroedPageListHead, - &MmPageArray[i].ListEntry); - UnzeroedPageCount++; - } - MmStats.NrReservedPages += ((0x100000/PAGE_SIZE) - i); - for (; i<(0x100000 / PAGE_SIZE); i++) - { - MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_BIOS; - MmPageArray[i].Flags.Consumer = MC_NPPOOL; - MmPageArray[i].ReferenceCount = 1; - InsertTailList(&BiosPageListHead, - &MmPageArray[i].ListEntry); - } - } + { + MmStats.NrFreePages += (((ULONG)FirstPhysKernelAddress/PAGE_SIZE) - 2); + for (; i<((ULONG)FirstPhysKernelAddress/PAGE_SIZE); i++) + { + MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_FREE; + MmPageArray[i].ReferenceCount = 0; + InsertTailList(&FreeUnzeroedPageListHead, + &MmPageArray[i].ListEntry); + UnzeroedPageCount++; + } + MmStats.NrSystemPages += + ((((ULONG)LastPhysKernelAddress) / PAGE_SIZE) - i); + for (; i<((ULONG)LastPhysKernelAddress / PAGE_SIZE); i++) + { + MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_USED; + MmPageArray[i].Flags.Consumer = MC_NPPOOL; + MmPageArray[i].ReferenceCount = 1; + MmPageArray[i].MapCount = 1; + InsertTailList(&UsedPageListHeads[MC_NPPOOL], + &MmPageArray[i].ListEntry); + } + MmStats.NrFreePages += ((0xa0000/PAGE_SIZE) - i); + for (; i<(0xa0000/PAGE_SIZE); i++) + { + MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_FREE; + MmPageArray[i].ReferenceCount = 0; + InsertTailList(&FreeUnzeroedPageListHead, + &MmPageArray[i].ListEntry); + UnzeroedPageCount++; + } + MmStats.NrReservedPages += ((0x100000/PAGE_SIZE) - i); + for (; i<(0x100000 / PAGE_SIZE); i++) + { + MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_BIOS; + MmPageArray[i].Flags.Consumer = MC_NPPOOL; + MmPageArray[i].ReferenceCount = 1; + InsertTailList(&BiosPageListHead, + &MmPageArray[i].ListEntry); + } + } else - { - MmStats.NrFreePages += ((0xa0000 / PAGE_SIZE) - 2); - for (; i<(0xa0000 / PAGE_SIZE); i++) - { - MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_FREE; - MmPageArray[i].ReferenceCount = 0; - InsertTailList(&FreeUnzeroedPageListHead, - &MmPageArray[i].ListEntry); - UnzeroedPageCount++; - } - MmStats.NrReservedPages += (0x60000 / PAGE_SIZE); - for (; i<(0x100000 / PAGE_SIZE); i++) - { - MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_BIOS; - MmPageArray[i].Flags.Consumer = MC_NPPOOL; - MmPageArray[i].ReferenceCount = 1; - InsertTailList(&BiosPageListHead, - &MmPageArray[i].ListEntry); - } - MmStats.NrFreePages += (((ULONG)FirstPhysKernelAddress/PAGE_SIZE) - i); - for (; i<((ULONG)FirstPhysKernelAddress/PAGE_SIZE); i++) - { - MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_FREE; - MmPageArray[i].ReferenceCount = 0; - InsertTailList(&FreeUnzeroedPageListHead, - &MmPageArray[i].ListEntry); - UnzeroedPageCount++; - } - MmStats.NrSystemPages += - (((ULONG)LastPhysKernelAddress/PAGE_SIZE) - i); - for (; i<((ULONG)LastPhysKernelAddress/PAGE_SIZE); i++) - { - MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_USED; - MmPageArray[i].Flags.Consumer = MC_NPPOOL; - MmPageArray[i].ReferenceCount = 1; - MmPageArray[i].MapCount = 1; - InsertTailList(&UsedPageListHeads[MC_NPPOOL], - &MmPageArray[i].ListEntry); - } - } - + { + MmStats.NrFreePages += ((0xa0000 / PAGE_SIZE) - 2); + for (; i<(0xa0000 / PAGE_SIZE); i++) + { + MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_FREE; + MmPageArray[i].ReferenceCount = 0; + InsertTailList(&FreeUnzeroedPageListHead, + &MmPageArray[i].ListEntry); + UnzeroedPageCount++; + } + MmStats.NrReservedPages += (0x60000 / PAGE_SIZE); + for (; i<(0x100000 / PAGE_SIZE); i++) + { + MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_BIOS; + MmPageArray[i].Flags.Consumer = MC_NPPOOL; + MmPageArray[i].ReferenceCount = 1; + InsertTailList(&BiosPageListHead, + &MmPageArray[i].ListEntry); + } + MmStats.NrFreePages += (((ULONG)FirstPhysKernelAddress/PAGE_SIZE) - i); + for (; i<((ULONG)FirstPhysKernelAddress/PAGE_SIZE); i++) + { + MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_FREE; + MmPageArray[i].ReferenceCount = 0; + InsertTailList(&FreeUnzeroedPageListHead, + &MmPageArray[i].ListEntry); + UnzeroedPageCount++; + } + MmStats.NrSystemPages += + (((ULONG)LastPhysKernelAddress/PAGE_SIZE) - i); + for (; i<((ULONG)LastPhysKernelAddress/PAGE_SIZE); i++) + { + MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_USED; + MmPageArray[i].Flags.Consumer = MC_NPPOOL; + MmPageArray[i].ReferenceCount = 1; + MmPageArray[i].MapCount = 1; + InsertTailList(&UsedPageListHeads[MC_NPPOOL], + &MmPageArray[i].ListEntry); + } + } + MmStats.NrFreePages += (MemorySizeInPages - i); for (; i 0)) - { + if ((BIOSMemoryMap != NULL) && (AddressRangeCount > 0)) + { MiParseBIOSMemoryMap( - BIOSMemoryMap, - AddressRangeCount); - } + BIOSMemoryMap, + AddressRangeCount); + } KeInitializeEvent(&ZeroPageThreadEvent, NotificationEvent, TRUE); MmStats.NrTotalPages = MmStats.NrFreePages + MmStats.NrSystemPages + - MmStats.NrReservedPages + MmStats.NrUserPages; + MmStats.NrReservedPages + MmStats.NrUserPages; MmInitializeBalancer(MmStats.NrFreePages, MmStats.NrSystemPages + MmStats.NrReservedPages); return((PVOID)LastKernelAddress); } -VOID +VOID MmSetFlagsPage(PHYSICAL_ADDRESS PhysicalAddress, ULONG Flags) { ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE; @@ -559,9 +588,9 @@ MmSetFlagsPage(PHYSICAL_ADDRESS PhysicalAddress, ULONG Flags) KeReleaseSpinLock(&PageListLock, oldIrql); } -VOID -MmSetRmapListHeadPage(PHYSICAL_ADDRESS PhysicalAddress, - struct _MM_RMAP_ENTRY* ListHead) +VOID +MmSetRmapListHeadPage(PHYSICAL_ADDRESS PhysicalAddress, + struct _MM_RMAP_ENTRY* ListHead) { ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE; @@ -569,57 +598,57 @@ MmSetRmapListHeadPage(PHYSICAL_ADDRESS PhysicalAddress, } struct _MM_RMAP_ENTRY* -MmGetRmapListHeadPage(PHYSICAL_ADDRESS PhysicalAddress) + MmGetRmapListHeadPage(PHYSICAL_ADDRESS PhysicalAddress) { - ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE; + ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE; - return(MmPageArray[Start].RmapListHead); + return(MmPageArray[Start].RmapListHead); } -VOID +VOID MmMarkPageMapped(PHYSICAL_ADDRESS PhysicalAddress) { - ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE; - KIRQL oldIrql; + ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE; + KIRQL oldIrql; - if (Start < MmPageArraySize) - { + if (Start < MmPageArraySize) + { KeAcquireSpinLock(&PageListLock, &oldIrql); if (MmPageArray[Start].Flags.Type == MM_PHYSICAL_PAGE_FREE) - { - DbgPrint("Mapping non-used page\n"); - KEBUGCHECK(0); - } + { + DbgPrint("Mapping non-used page\n"); + KEBUGCHECK(0); + } MmPageArray[Start].MapCount++; KeReleaseSpinLock(&PageListLock, oldIrql); - } + } } -VOID +VOID MmMarkPageUnmapped(PHYSICAL_ADDRESS PhysicalAddress) { - ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE; - KIRQL oldIrql; + ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE; + KIRQL oldIrql; - if (Start < MmPageArraySize) - { + if (Start < MmPageArraySize) + { KeAcquireSpinLock(&PageListLock, &oldIrql); if (MmPageArray[Start].Flags.Type == MM_PHYSICAL_PAGE_FREE) - { - DbgPrint("Unmapping non-used page\n"); - KEBUGCHECK(0); - } + { + DbgPrint("Unmapping non-used page\n"); + KEBUGCHECK(0); + } if (MmPageArray[Start].MapCount == 0) - { - DbgPrint("Unmapping not mapped page\n"); - KEBUGCHECK(0); - } + { + DbgPrint("Unmapping not mapped page\n"); + KEBUGCHECK(0); + } MmPageArray[Start].MapCount--; KeReleaseSpinLock(&PageListLock, oldIrql); - } + } } -ULONG +ULONG MmGetFlagsPage(PHYSICAL_ADDRESS PhysicalAddress) { ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE; @@ -629,14 +658,14 @@ MmGetFlagsPage(PHYSICAL_ADDRESS PhysicalAddress) KeAcquireSpinLock(&PageListLock, &oldIrql); Flags = MmPageArray[Start].AllFlags; KeReleaseSpinLock(&PageListLock, oldIrql); - + return(Flags); } -VOID +VOID MmSetSavedSwapEntryPage(PHYSICAL_ADDRESS PhysicalAddress, - SWAPENTRY SavedSwapEntry) + SWAPENTRY SavedSwapEntry) { ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE; KIRQL oldIrql; @@ -646,7 +675,7 @@ MmSetSavedSwapEntryPage(PHYSICAL_ADDRESS PhysicalAddress, KeReleaseSpinLock(&PageListLock, oldIrql); } -SWAPENTRY +SWAPENTRY MmGetSavedSwapEntryPage(PHYSICAL_ADDRESS PhysicalAddress) { ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE; @@ -660,7 +689,7 @@ MmGetSavedSwapEntryPage(PHYSICAL_ADDRESS PhysicalAddress) return(SavedSwapEntry); } -VOID +VOID MmReferencePage(PHYSICAL_ADDRESS PhysicalAddress) { ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE; @@ -669,17 +698,17 @@ MmReferencePage(PHYSICAL_ADDRESS PhysicalAddress) DPRINT("MmReferencePage(PhysicalAddress %x)\n", PhysicalAddress); if (PhysicalAddress.u.LowPart == 0) - { - KEBUGCHECK(0); - } + { + KEBUGCHECK(0); + } KeAcquireSpinLock(&PageListLock, &oldIrql); - + if (MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_USED) - { - DbgPrint("Referencing non-used page\n"); - KEBUGCHECK(0); - } + { + DbgPrint("Referencing non-used page\n"); + KEBUGCHECK(0); + } MmPageArray[Start].ReferenceCount++; KeReleaseSpinLock(&PageListLock, oldIrql); @@ -695,17 +724,17 @@ MmGetReferenceCountPage(PHYSICAL_ADDRESS PhysicalAddress) DPRINT("MmGetReferenceCountPage(PhysicalAddress %x)\n", PhysicalAddress); if (PhysicalAddress.u.LowPart == 0) - { - KEBUGCHECK(0); - } + { + KEBUGCHECK(0); + } KeAcquireSpinLock(&PageListLock, &oldIrql); - + if (MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_USED) - { - DbgPrint("Getting reference count for free page\n"); - KEBUGCHECK(0); - } + { + DbgPrint("Getting reference count for free page\n"); + KEBUGCHECK(0); + } RCount = MmPageArray[Start].ReferenceCount; @@ -721,87 +750,87 @@ MmIsUsablePage(PHYSICAL_ADDRESS PhysicalAddress) DPRINT("MmIsUsablePage(PhysicalAddress %x)\n", PhysicalAddress); if (PhysicalAddress.u.LowPart == 0) - { - KEBUGCHECK(0); - } + { + KEBUGCHECK(0); + } if (MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_USED && - MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_BIOS) - { - return(FALSE); - } + MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_BIOS) + { + return(FALSE); + } return(TRUE); } -VOID +VOID MmDereferencePage(PHYSICAL_ADDRESS PhysicalAddress) { ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE; KIRQL oldIrql; - + DPRINT("MmDereferencePage(PhysicalAddress %I64x)\n", PhysicalAddress); if (PhysicalAddress.u.LowPart == 0) - { - KEBUGCHECK(0); - } - + { + KEBUGCHECK(0); + } + KeAcquireSpinLock(&PageListLock, &oldIrql); - + if (MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_USED) - { - DbgPrint("Dereferencing free page\n"); - KEBUGCHECK(0); - } + { + DbgPrint("Dereferencing free page\n"); + KEBUGCHECK(0); + } MmPageArray[Start].ReferenceCount--; if (MmPageArray[Start].ReferenceCount == 0) - { - MmStats.NrFreePages++; - MmStats.NrSystemPages--; - RemoveEntryList(&MmPageArray[Start].ListEntry); - if (MmPageArray[Start].RmapListHead != NULL) - { - DbgPrint("Freeing page with rmap entries.\n"); - KEBUGCHECK(0); - } - if (MmPageArray[Start].MapCount != 0) - { - DbgPrint("Freeing mapped page (0x%I64x count %d)\n", - PhysicalAddress, MmPageArray[Start].MapCount); - KEBUGCHECK(0); - } - if (MmPageArray[Start].LockCount > 0) - { - DbgPrint("Freeing locked page\n"); - KEBUGCHECK(0); - } - if (MmPageArray[Start].SavedSwapEntry != 0) - { - DbgPrint("Freeing page with swap entry.\n"); - KEBUGCHECK(0); - } - if (MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_USED) - { - DbgPrint("Freeing page with flags %x\n", - MmPageArray[Start].Flags.Type); - KEBUGCHECK(0); - } - MmPageArray[Start].Flags.Type = MM_PHYSICAL_PAGE_FREE; - InsertTailList(&FreeUnzeroedPageListHead, - &MmPageArray[Start].ListEntry); - UnzeroedPageCount++; - if (UnzeroedPageCount > 8 && 0 == KeReadStateEvent(&ZeroPageThreadEvent)) - { - KeSetEvent(&ZeroPageThreadEvent, IO_NO_INCREMENT, FALSE); - } - } + { + MmStats.NrFreePages++; + MmStats.NrSystemPages--; + RemoveEntryList(&MmPageArray[Start].ListEntry); + if (MmPageArray[Start].RmapListHead != NULL) + { + DbgPrint("Freeing page with rmap entries.\n"); + KEBUGCHECK(0); + } + if (MmPageArray[Start].MapCount != 0) + { + DbgPrint("Freeing mapped page (0x%I64x count %d)\n", + PhysicalAddress, MmPageArray[Start].MapCount); + KEBUGCHECK(0); + } + if (MmPageArray[Start].LockCount > 0) + { + DbgPrint("Freeing locked page\n"); + KEBUGCHECK(0); + } + if (MmPageArray[Start].SavedSwapEntry != 0) + { + DbgPrint("Freeing page with swap entry.\n"); + KEBUGCHECK(0); + } + if (MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_USED) + { + DbgPrint("Freeing page with flags %x\n", + MmPageArray[Start].Flags.Type); + KEBUGCHECK(0); + } + MmPageArray[Start].Flags.Type = MM_PHYSICAL_PAGE_FREE; + InsertTailList(&FreeUnzeroedPageListHead, + &MmPageArray[Start].ListEntry); + UnzeroedPageCount++; + if (UnzeroedPageCount > 8 && 0 == KeReadStateEvent(&ZeroPageThreadEvent)) + { + KeSetEvent(&ZeroPageThreadEvent, IO_NO_INCREMENT, FALSE); + } + } KeReleaseSpinLock(&PageListLock, oldIrql); } -ULONG +ULONG MmGetLockCountPage(PHYSICAL_ADDRESS PhysicalAddress) { ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE; @@ -811,17 +840,17 @@ MmGetLockCountPage(PHYSICAL_ADDRESS PhysicalAddress) DPRINT("MmGetLockCountPage(PhysicalAddress %x)\n", PhysicalAddress); if (PhysicalAddress.u.LowPart == 0) - { - KEBUGCHECK(0); - } + { + KEBUGCHECK(0); + } KeAcquireSpinLock(&PageListLock, &oldIrql); if (MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_USED) - { - DbgPrint("Getting lock count for free page\n"); - KEBUGCHECK(0); - } + { + DbgPrint("Getting lock count for free page\n"); + KEBUGCHECK(0); + } LockCount = MmPageArray[Start].LockCount; KeReleaseSpinLock(&PageListLock, oldIrql); @@ -829,7 +858,7 @@ MmGetLockCountPage(PHYSICAL_ADDRESS PhysicalAddress) return(LockCount); } -VOID +VOID MmLockPage(PHYSICAL_ADDRESS PhysicalAddress) { ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE; @@ -838,23 +867,23 @@ MmLockPage(PHYSICAL_ADDRESS PhysicalAddress) DPRINT("MmLockPage(PhysicalAddress %x)\n", PhysicalAddress); if (PhysicalAddress.u.LowPart == 0) - { - KEBUGCHECK(0); - } + { + KEBUGCHECK(0); + } KeAcquireSpinLock(&PageListLock, &oldIrql); if (MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_USED) - { - DbgPrint("Locking free page\n"); - KEBUGCHECK(0); - } + { + DbgPrint("Locking free page\n"); + KEBUGCHECK(0); + } MmPageArray[Start].LockCount++; KeReleaseSpinLock(&PageListLock, oldIrql); } -VOID +VOID MmUnlockPage(PHYSICAL_ADDRESS PhysicalAddress) { ULONG Start = PhysicalAddress.u.LowPart / PAGE_SIZE; @@ -863,18 +892,18 @@ MmUnlockPage(PHYSICAL_ADDRESS PhysicalAddress) DPRINT("MmUnlockPage(PhysicalAddress %I64x)\n", PhysicalAddress); if (PhysicalAddress.u.LowPart == 0) - { - KEBUGCHECK(0); - } - + { + KEBUGCHECK(0); + } + KeAcquireSpinLock(&PageListLock, &oldIrql); - + if (MmPageArray[Start].Flags.Type != MM_PHYSICAL_PAGE_USED) - { - DbgPrint("Unlocking free page\n"); - KEBUGCHECK(0); - } - + { + DbgPrint("Unlocking free page\n"); + KEBUGCHECK(0); + } + MmPageArray[Start].LockCount--; KeReleaseSpinLock(&PageListLock, oldIrql); } @@ -882,180 +911,186 @@ MmUnlockPage(PHYSICAL_ADDRESS PhysicalAddress) PHYSICAL_ADDRESS MmAllocPage(ULONG Consumer, SWAPENTRY SavedSwapEntry) { - PHYSICAL_ADDRESS PageOffset; - PLIST_ENTRY ListEntry; - PPHYSICAL_PAGE PageDescriptor; - KIRQL oldIrql; - BOOLEAN NeedClear = FALSE; - - DPRINT("MmAllocPage()\n"); - - KeAcquireSpinLock(&PageListLock, &oldIrql); - if (IsListEmpty(&FreeZeroedPageListHead)) - { + PHYSICAL_ADDRESS PageOffset; + PLIST_ENTRY ListEntry; + PPHYSICAL_PAGE PageDescriptor; + KIRQL oldIrql; + BOOLEAN NeedClear = FALSE; + + DPRINT("MmAllocPage()\n"); + + KeAcquireSpinLock(&PageListLock, &oldIrql); + if (IsListEmpty(&FreeZeroedPageListHead)) + { if (IsListEmpty(&FreeUnzeroedPageListHead)) - { - DPRINT1("MmAllocPage(): Out of memory\n"); - KeReleaseSpinLock(&PageListLock, oldIrql); + { + DPRINT1("MmAllocPage(): Out of memory\n"); + KeReleaseSpinLock(&PageListLock, oldIrql); #if defined(__GNUC__) - return((PHYSICAL_ADDRESS)0LL); + + return((PHYSICAL_ADDRESS)0LL); #else - { - const PHYSICAL_ADDRESS dummyJunkNeeded = { 0 }; - return dummyJunkNeeded; - } + + { + const PHYSICAL_ADDRESS dummyJunkNeeded = + { + 0 + }; + return dummyJunkNeeded; + } #endif - } + + } ListEntry = RemoveTailList(&FreeUnzeroedPageListHead); UnzeroedPageCount--; - + PageDescriptor = CONTAINING_RECORD(ListEntry, PHYSICAL_PAGE, ListEntry); - + NeedClear = TRUE; - } - else - { + } + else + { ListEntry = RemoveTailList(&FreeZeroedPageListHead); - + PageDescriptor = CONTAINING_RECORD(ListEntry, PHYSICAL_PAGE, ListEntry); - } - - if (PageDescriptor->Flags.Type != MM_PHYSICAL_PAGE_FREE) - { + } + + if (PageDescriptor->Flags.Type != MM_PHYSICAL_PAGE_FREE) + { DbgPrint("Got non-free page from freelist\n"); KEBUGCHECK(0); - } - if (PageDescriptor->MapCount != 0) - { + } + if (PageDescriptor->MapCount != 0) + { DbgPrint("Got mapped page from freelist\n"); KEBUGCHECK(0); - } - PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_USED; - PageDescriptor->Flags.Consumer = Consumer; - PageDescriptor->ReferenceCount = 1; - PageDescriptor->LockCount = 0; - PageDescriptor->MapCount = 0; - PageDescriptor->SavedSwapEntry = SavedSwapEntry; - InsertTailList(&UsedPageListHeads[Consumer], ListEntry); - - MmStats.NrSystemPages++; - MmStats.NrFreePages--; + } + PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_USED; + PageDescriptor->Flags.Consumer = Consumer; + PageDescriptor->ReferenceCount = 1; + PageDescriptor->LockCount = 0; + PageDescriptor->MapCount = 0; + PageDescriptor->SavedSwapEntry = SavedSwapEntry; + InsertTailList(&UsedPageListHeads[Consumer], ListEntry); - KeReleaseSpinLock(&PageListLock, oldIrql); + MmStats.NrSystemPages++; + MmStats.NrFreePages--; - PageOffset.QuadPart = (ULONG)((ULONG)PageDescriptor - (ULONG)MmPageArray); - PageOffset.QuadPart = - (PageOffset.QuadPart / sizeof(PHYSICAL_PAGE)) * PAGE_SIZE; - if (NeedClear) - { + KeReleaseSpinLock(&PageListLock, oldIrql); + + PageOffset.QuadPart = (ULONG)((ULONG)PageDescriptor - (ULONG)MmPageArray); + PageOffset.QuadPart = + (PageOffset.QuadPart / sizeof(PHYSICAL_PAGE)) * PAGE_SIZE; + if (NeedClear) + { MiZeroPage(PageOffset); - } - if (PageDescriptor->MapCount != 0) - { + } + if (PageDescriptor->MapCount != 0) + { DbgPrint("Returning mapped page.\n"); KEBUGCHECK(0); - } - return(PageOffset); + } + return(PageOffset); } NTSTATUS STDCALL MmZeroPageThreadMain(PVOID Ignored) { - NTSTATUS Status; - KIRQL oldIrql; - PLIST_ENTRY ListEntry; - PPHYSICAL_PAGE PageDescriptor; - PHYSICAL_ADDRESS PhysPage; - static PVOID Address = NULL; - ULONG Count; - - while(1) - { + NTSTATUS Status; + KIRQL oldIrql; + PLIST_ENTRY ListEntry; + PPHYSICAL_PAGE PageDescriptor; + PHYSICAL_ADDRESS PhysPage; + static PVOID Address = NULL; + ULONG Count; + + while(1) + { Status = KeWaitForSingleObject(&ZeroPageThreadEvent, - 0, - KernelMode, - FALSE, - NULL); + 0, + KernelMode, + FALSE, + NULL); if (!NT_SUCCESS(Status)) - { - DbgPrint("ZeroPageThread: Wait failed\n"); - KEBUGCHECK(0); - return(STATUS_UNSUCCESSFUL); - } + { + DbgPrint("ZeroPageThread: Wait failed\n"); + KEBUGCHECK(0); + return(STATUS_UNSUCCESSFUL); + } Count = 0; KeAcquireSpinLock(&PageListLock, &oldIrql); while (!IsListEmpty(&FreeUnzeroedPageListHead)) { ListEntry = RemoveTailList(&FreeUnzeroedPageListHead); - UnzeroedPageCount--; + UnzeroedPageCount--; PageDescriptor = CONTAINING_RECORD(ListEntry, PHYSICAL_PAGE, ListEntry); - /* We set the page to used, because MmCreateVirtualMapping failed with unused pages */ - PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_USED; + /* We set the page to used, because MmCreateVirtualMapping failed with unused pages */ + PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_USED; KeReleaseSpinLock(&PageListLock, oldIrql); - Count++; + Count++; PhysPage.QuadPart = (ULONG)((ULONG)PageDescriptor - (ULONG)MmPageArray); PhysPage.QuadPart = (PhysPage.QuadPart / sizeof(PHYSICAL_PAGE)) * PAGE_SIZE; - if (Address == NULL) - { - Address = ExAllocatePageWithPhysPage(PhysPage); - } - else - { - Status = MmCreateVirtualMapping(NULL, - Address, - PAGE_READWRITE | PAGE_SYSTEM, - PhysPage, - FALSE); + if (Address == NULL) + { + Address = ExAllocatePageWithPhysPage(PhysPage); + } + else + { + Status = MmCreateVirtualMapping(NULL, + Address, + PAGE_READWRITE | PAGE_SYSTEM, + PhysPage, + FALSE); if (!NT_SUCCESS(Status)) { DbgPrint("Unable to create virtual mapping\n"); - KEBUGCHECK(0); + KEBUGCHECK(0); } - } + } memset(Address, 0, PAGE_SIZE); MmDeleteVirtualMapping(NULL, (PVOID)Address, FALSE, NULL, NULL); KeAcquireSpinLock(&PageListLock, &oldIrql); - if (PageDescriptor->MapCount != 0) - { - DbgPrint("Mapped page on freelist.\n"); - KEBUGCHECK(0); - } - PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_FREE; - InsertHeadList(&FreeZeroedPageListHead, ListEntry); + if (PageDescriptor->MapCount != 0) + { + DbgPrint("Mapped page on freelist.\n"); + KEBUGCHECK(0); + } + PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_FREE; + InsertHeadList(&FreeZeroedPageListHead, ListEntry); } DPRINT("Zeroed %d pages.\n", Count); KeResetEvent(&ZeroPageThreadEvent); KeReleaseSpinLock(&PageListLock, oldIrql); - } + } } - + NTSTATUS INIT_FUNCTION MmInitZeroPageThread(VOID) { - KPRIORITY Priority; - NTSTATUS Status; - - Status = PsCreateSystemThread(&ZeroPageThreadHandle, - THREAD_ALL_ACCESS, - NULL, - NULL, - &ZeroPageThreadId, - (PKSTART_ROUTINE) MmZeroPageThreadMain, - NULL); - if (!NT_SUCCESS(Status)) - { + KPRIORITY Priority; + NTSTATUS Status; + + Status = PsCreateSystemThread(&ZeroPageThreadHandle, + THREAD_ALL_ACCESS, + NULL, + NULL, + &ZeroPageThreadId, + (PKSTART_ROUTINE) MmZeroPageThreadMain, + NULL); + if (!NT_SUCCESS(Status)) + { return(Status); - } - - Priority = 1; - NtSetInformationThread(ZeroPageThreadHandle, - ThreadPriority, - &Priority, - sizeof(Priority)); - - return(STATUS_SUCCESS); + } + + Priority = 1; + NtSetInformationThread(ZeroPageThreadHandle, + ThreadPriority, + &Priority, + sizeof(Priority)); + + return(STATUS_SUCCESS); } - + /* EOF */ diff --git a/reactos/ntoskrnl/mm/i386/page.c b/reactos/ntoskrnl/mm/i386/page.c index da6ba4667c6..340caaae5f0 100644 --- a/reactos/ntoskrnl/mm/i386/page.c +++ b/reactos/ntoskrnl/mm/i386/page.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: page.c,v 1.63 2004/03/09 21:49:53 dwelch Exp $ +/* $Id: page.c,v 1.64 2004/04/10 22:36:07 gdalsnes Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/i386/page.c @@ -66,15 +66,15 @@ ULONG MmGlobalKernelPageDirectory[1024] = {0, }; #else __inline LARGE_INTEGER PTE_TO_PAGE(ULONG npage) { - LARGE_INTEGER dummy; - dummy.QuadPart = (LONGLONG)(PAGE_MASK(npage)); - return dummy; + LARGE_INTEGER dummy; + dummy.QuadPart = (LONGLONG)(PAGE_MASK(npage)); + return dummy; } #endif /* FUNCTIONS ***************************************************************/ -PULONG +PULONG MmGetPageDirectory(VOID) { unsigned int page_dir=0; @@ -82,42 +82,42 @@ MmGetPageDirectory(VOID) return((PULONG)page_dir); } -static ULONG +static ULONG ProtectToPTE(ULONG flProtect) { - ULONG Attributes = 0; - - if (flProtect & PAGE_NOACCESS || flProtect & PAGE_GUARD) - { + ULONG Attributes = 0; + + if (flProtect & PAGE_NOACCESS || flProtect & PAGE_GUARD) + { Attributes = 0; - } - else if (flProtect & PAGE_READWRITE || flProtect & PAGE_EXECUTE_READWRITE) - { + } + else if (flProtect & PAGE_READWRITE || flProtect & PAGE_EXECUTE_READWRITE) + { Attributes = PA_PRESENT | PA_READWRITE; - } - else if (flProtect & PAGE_READONLY || flProtect & PAGE_EXECUTE || - flProtect & PAGE_EXECUTE_READ) - { - Attributes = PA_PRESENT; - } - else - { + } + else if (flProtect & PAGE_READONLY || flProtect & PAGE_EXECUTE || + flProtect & PAGE_EXECUTE_READ) + { + Attributes = PA_PRESENT; + } + else + { DPRINT1("Unknown main protection type.\n"); KEBUGCHECK(0); - } - if (!(flProtect & PAGE_SYSTEM)) - { + } + if (!(flProtect & PAGE_SYSTEM)) + { Attributes = Attributes | PA_USER; - } - if (flProtect & PAGE_NOCACHE) - { + } + if (flProtect & PAGE_NOCACHE) + { Attributes = Attributes | PA_CD; - } - if (flProtect & PAGE_WRITETHROUGH) - { + } + if (flProtect & PAGE_WRITETHROUGH) + { Attributes = Attributes | PA_WT; - } - return(Attributes); + } + return(Attributes); } #define ADDR_TO_PAGE_TABLE(v) (((ULONG)(v)) / (4 * 1024 * 1024)) @@ -137,23 +137,25 @@ NTSTATUS Mmi386ReleaseMmInfo(PEPROCESS Process) LdtDescriptor = (PUSHORT) &Process->Pcb.LdtDescriptor[0]; LdtBase = LdtDescriptor[1] | - ((LdtDescriptor[2] & 0xff) << 16) | - ((LdtDescriptor[3] & ~0xff) << 16); + ((LdtDescriptor[2] & 0xff) << 16) | + ((LdtDescriptor[3] & ~0xff) << 16); DPRINT("LdtBase: %x\n", LdtBase); - + if (LdtBase) - { - ExFreePool((PVOID) LdtBase); - } - + { + ExFreePool((PVOID) LdtBase); + } + MmReleasePageMemoryConsumer(MC_NPPOOL, Process->Pcb.DirectoryTableBase); #if defined(__GNUC__) + Process->Pcb.DirectoryTableBase.QuadPart = 0LL; #else + Process->Pcb.DirectoryTableBase.QuadPart = 0; #endif - + DPRINT("Finished Mmi386ReleaseMmInfo()\n"); return(STATUS_SUCCESS); } @@ -163,28 +165,28 @@ NTSTATUS MmCopyMmInfo(PEPROCESS Src, PEPROCESS Dest) PHYSICAL_ADDRESS PhysPageDirectory; PULONG PageDirectory; PKPROCESS KProcess = &Dest->Pcb; - + DPRINT("MmCopyMmInfo(Src %x, Dest %x)\n", Src, Dest); - + PageDirectory = ExAllocatePage(); if (PageDirectory == NULL) - { - return(STATUS_UNSUCCESSFUL); - } + { + return(STATUS_UNSUCCESSFUL); + } PhysPageDirectory = MmGetPhysicalAddress(PageDirectory); - KProcess->DirectoryTableBase = PhysPageDirectory; - + KProcess->DirectoryTableBase = PhysPageDirectory; + memset(PageDirectory,0, ADDR_TO_PDE_OFFSET(KERNEL_BASE) * sizeof(ULONG)); - memcpy(PageDirectory + ADDR_TO_PDE_OFFSET(KERNEL_BASE), - MmGlobalKernelPageDirectory + ADDR_TO_PDE_OFFSET(KERNEL_BASE), - (1024 - ADDR_TO_PDE_OFFSET(KERNEL_BASE)) * sizeof(ULONG)); + memcpy(PageDirectory + ADDR_TO_PDE_OFFSET(KERNEL_BASE), + MmGlobalKernelPageDirectory + ADDR_TO_PDE_OFFSET(KERNEL_BASE), + (1024 - ADDR_TO_PDE_OFFSET(KERNEL_BASE)) * sizeof(ULONG)); DPRINT("Addr %x\n",PAGETABLE_MAP / (4*1024*1024)); - PageDirectory[PAGETABLE_MAP / (4*1024*1024)] = - PhysPageDirectory.u.LowPart | PA_PRESENT | PA_READWRITE; - + PageDirectory[PAGETABLE_MAP / (4*1024*1024)] = + PhysPageDirectory.u.LowPart | PA_PRESENT | PA_READWRITE; + ExUnmapPage(PageDirectory); - + DPRINT("Finished MmCopyMmInfo()\n"); return(STATUS_SUCCESS); } @@ -192,22 +194,22 @@ NTSTATUS MmCopyMmInfo(PEPROCESS Src, PEPROCESS Dest) VOID MmDeletePageTable(PEPROCESS Process, PVOID Address) { PEPROCESS CurrentProcess = PsGetCurrentProcess(); - + if (Process != NULL && Process != CurrentProcess) - { - KeAttachProcess(Process); - } + { + KeAttachProcess(Process); + } *(ADDR_TO_PDE(Address)) = 0; if (Address >= (PVOID)KERNEL_BASE) - { - KEBUGCHECK(0); -// MmGlobalKernelPageDirectory[ADDR_TO_PDE_OFFSET(Address)] = 0; - } + { + KEBUGCHECK(0); + // MmGlobalKernelPageDirectory[ADDR_TO_PDE_OFFSET(Address)] = 0; + } FLUSH_TLB; if (Process != NULL && Process != CurrentProcess) - { - KeDetachProcess(); - } + { + KeDetachProcess(); + } } VOID MmFreePageTable(PEPROCESS Process, PVOID Address) @@ -216,7 +218,7 @@ VOID MmFreePageTable(PEPROCESS Process, PVOID Address) PULONG PageTable; ULONG i; ULONG npage; - + if (Process != NULL && Process != CurrentProcess) { KeAttachProcess(Process); @@ -228,8 +230,8 @@ VOID MmFreePageTable(PEPROCESS Process, PVOID Address) if (PageTable[i] != 0) { DbgPrint("Page table entry not clear at %x/%x (is %x)\n", - ((ULONG)Address / 4*1024*1024), i, PageTable[i]); - KEBUGCHECK(0); + ((ULONG)Address / 4*1024*1024), i, PageTable[i]); + KEBUGCHECK(0); } } npage = *(ADDR_TO_PDE(Address)); @@ -238,7 +240,7 @@ VOID MmFreePageTable(PEPROCESS Process, PVOID Address) if (Address >= (PVOID)KERNEL_BASE) { -// MmGlobalKernelPageDirectory[ADDR_TO_PDE_OFFSET(Address)] = 0; + // MmGlobalKernelPageDirectory[ADDR_TO_PDE_OFFSET(Address)] = 0; KEBUGCHECK(0); } else @@ -261,53 +263,53 @@ NTSTATUS MmGetPageEntry2(PVOID PAddress, PULONG* Pte, BOOLEAN MayWait) BOOLEAN Free = FALSE; NTSTATUS Status; KIRQL oldIrql; - + DPRINT("MmGetPageEntry(Address %x)\n", PAddress); Pde = ADDR_TO_PDE(PAddress); - if (*Pde == 0) + if (*Pde == 0) { if (PAddress >= (PVOID)KERNEL_BASE) { - kePde = MmGlobalKernelPageDirectory + ADDR_TO_PDE_OFFSET(PAddress); + kePde = MmGlobalKernelPageDirectory + ADDR_TO_PDE_OFFSET(PAddress); oldIrql = KeRaiseIrqlToSynchLevel(); - if (*kePde != 0) - { - *Pde = *kePde; - FLUSH_TLB; - } + if (*kePde != 0) + { + *Pde = *kePde; + FLUSH_TLB; + } else - { - KeLowerIrql(oldIrql); - Status = MmRequestPageMemoryConsumer(MC_NPPOOL, MayWait, &npage); - if (!NT_SUCCESS(Status)) - { - KEBUGCHECK(0); - } - oldIrql = KeRaiseIrqlToSynchLevel(); - /* An other thread can set this pde entry, we must check again */ - if (*kePde == 0) - { - *kePde = npage.u.LowPart | PA_PRESENT | PA_READWRITE; - } - else - { - Free = TRUE; - } - *Pde = *kePde; - FLUSH_TLB; - } - KeLowerIrql(oldIrql); + { + KeLowerIrql(oldIrql); + Status = MmRequestPageMemoryConsumer(MC_NPPOOL, MayWait, &npage); + if (!NT_SUCCESS(Status)) + { + KEBUGCHECK(0); + } + oldIrql = KeRaiseIrqlToSynchLevel(); + /* An other thread can set this pde entry, we must check again */ + if (*kePde == 0) + { + *kePde = npage.u.LowPart | PA_PRESENT | PA_READWRITE; + } + else + { + Free = TRUE; + } + *Pde = *kePde; + FLUSH_TLB; + } + KeLowerIrql(oldIrql); } else { - Status = MmRequestPageMemoryConsumer(MC_NPPOOL, MayWait, &npage); + Status = MmRequestPageMemoryConsumer(MC_NPPOOL, MayWait, &npage); if (!NT_SUCCESS(Status)) - { - return(Status); - } - *Pde = npage.u.LowPart | PA_PRESENT | PA_READWRITE | PA_USER; - FLUSH_TLB; + { + return(Status); + } + *Pde = npage.u.LowPart | PA_PRESENT | PA_READWRITE | PA_USER; + FLUSH_TLB; } } *Pte = (PULONG)ADDR_TO_PTE(PAddress); @@ -322,16 +324,16 @@ ULONG MmGetPageEntryForProcess(PEPROCESS Process, PVOID Address) { ULONG Entry; PEPROCESS CurrentProcess = PsGetCurrentProcess(); - + if (Process != NULL && Process != CurrentProcess) - { - KeAttachProcess(Process); - } + { + KeAttachProcess(Process); + } Entry = *MmGetPageEntry(Address); if (Process != NULL && Process != CurrentProcess) - { - KeDetachProcess(); - } + { + KeDetachProcess(); + } return(Entry); } @@ -342,22 +344,22 @@ ULONG MmGetPageEntry1(PVOID PAddress) { PULONG Pde, kePde; ULONG Entry = 0; - + DPRINT("MmGetPageEntry(Address %x)\n", PAddress); - + Pde = ADDR_TO_PDE(PAddress); if (*Pde == 0) { - if (PAddress >= (PVOID)KERNEL_BASE) - { - kePde = MmGlobalKernelPageDirectory + ADDR_TO_PDE_OFFSET(PAddress); - if (*kePde != 0) - { - *Pde = *kePde; - FLUSH_TLB; - Entry = *(PULONG)ADDR_TO_PTE(PAddress); - } - } + if (PAddress >= (PVOID)KERNEL_BASE) + { + kePde = MmGlobalKernelPageDirectory + ADDR_TO_PDE_OFFSET(PAddress); + if (*kePde != 0) + { + *Pde = *kePde; + FLUSH_TLB; + Entry = *(PULONG)ADDR_TO_PTE(PAddress); + } + } } else { @@ -370,39 +372,41 @@ ULONG MmGetPageEntryForProcess1(PEPROCESS Process, PVOID Address) { ULONG Entry; PEPROCESS CurrentProcess = PsGetCurrentProcess(); - + if (Process != NULL && Process != CurrentProcess) - { - KeAttachProcess(Process); - } + { + KeAttachProcess(Process); + } Entry = MmGetPageEntry1(Address); if (Process != NULL && Process != CurrentProcess) - { - KeDetachProcess(); - } + { + KeDetachProcess(); + } return(Entry); } PHYSICAL_ADDRESS MmGetPhysicalAddressForProcess(PEPROCESS Process, - PVOID Address) + PVOID Address) { ULONG PageEntry; - + PageEntry = MmGetPageEntryForProcess(Process, Address); - + if (!(PageEntry & PA_PRESENT)) - { + { #if defined(__GNUC__) - return((LARGE_INTEGER)0LL); + return((LARGE_INTEGER)0LL); #else - { - PHYSICAL_ADDRESS dummy = { 0 }; - return dummy; - } + + { + PHYSICAL_ADDRESS dummy = { 0 }; + return dummy; + } #endif - } + + } return(PTE_TO_PAGE(PageEntry)); } @@ -422,25 +426,25 @@ MmDisableVirtualMapping(PEPROCESS Process, PVOID Address, BOOL* WasDirty, PHYSIC * context. */ if (Process != NULL && Process != CurrentProcess) - { - KeAttachProcess(Process); - } + { + KeAttachProcess(Process); + } /* * Set the page directory entry, we may have to copy the entry from * the global page directory. */ Pde = ADDR_TO_PDE(Address); - if ((*Pde) == 0 && - MmGlobalKernelPageDirectory[ADDR_TO_PDE_OFFSET(Address)] != 0) - { - (*Pde) = MmGlobalKernelPageDirectory[ADDR_TO_PDE_OFFSET(Address)]; - FLUSH_TLB; - } + if ((*Pde) == 0 && + MmGlobalKernelPageDirectory[ADDR_TO_PDE_OFFSET(Address)] != 0) + { + (*Pde) = MmGlobalKernelPageDirectory[ADDR_TO_PDE_OFFSET(Address)]; + FLUSH_TLB; + } if ((*Pde) == 0) - { - KEBUGCHECK(0); - } + { + KEBUGCHECK(0); + } /* * Atomically set the entry to zero and get the old value. @@ -450,30 +454,30 @@ MmDisableVirtualMapping(PEPROCESS Process, PVOID Address, BOOL* WasDirty, PHYSIC FLUSH_TLB; WasValid = (PAGE_MASK(Pte) != 0); if (!WasValid) - { - KEBUGCHECK(0); - } + { + KEBUGCHECK(0); + } /* * If necessary go back to the original context */ if (Process != NULL && Process != CurrentProcess) - { - KeDetachProcess(); - } + { + KeDetachProcess(); + } /* * Return some information to the caller */ if (WasDirty != NULL) - { - *WasDirty = Pte & PA_DIRTY; - } + { + *WasDirty = Pte & PA_DIRTY; + } if (PhysicalAddr != NULL) - { - PhysicalAddr->u.HighPart = 0; - PhysicalAddr->u.LowPart = PAGE_MASK(Pte); - } + { + PhysicalAddr->u.HighPart = 0; + PhysicalAddr->u.LowPart = PAGE_MASK(Pte); + } } VOID @@ -492,14 +496,14 @@ MmRawDeleteVirtualMapping(PVOID Address) if (*kePde != 0) { *Pde = *kePde; - FLUSH_TLB; + FLUSH_TLB; } } - + if (*Pde == 0) - { - return; - } + { + return; + } /* * Set the entry to zero @@ -510,7 +514,7 @@ MmRawDeleteVirtualMapping(PVOID Address) VOID MmDeleteVirtualMapping(PEPROCESS Process, PVOID Address, BOOL FreePage, - BOOL* WasDirty, PHYSICAL_ADDRESS* PhysicalAddr) + BOOL* WasDirty, PHYSICAL_ADDRESS* PhysicalAddr) /* * FUNCTION: Delete a virtual mapping */ @@ -525,9 +529,9 @@ MmDeleteVirtualMapping(PEPROCESS Process, PVOID Address, BOOL FreePage, * context. */ if (Process != NULL && Process != CurrentProcess) - { - KeAttachProcess(Process); - } + { + KeAttachProcess(Process); + } /* * Set the page directory entry, we may have to copy the entry from @@ -540,30 +544,32 @@ MmDeleteVirtualMapping(PEPROCESS Process, PVOID Address, BOOL FreePage, if (*kePde != 0) { *Pde = *kePde; - FLUSH_TLB; + FLUSH_TLB; } } - + if (*Pde == 0) - { - if (Process != NULL && Process != CurrentProcess) - { - KeDetachProcess(); - } - if (WasDirty != NULL) - { - *WasDirty = FALSE; - } - if (PhysicalAddr != NULL) - { + { + if (Process != NULL && Process != CurrentProcess) + { + KeDetachProcess(); + } + if (WasDirty != NULL) + { + *WasDirty = FALSE; + } + if (PhysicalAddr != NULL) + { #if defined(__GNUC__) - *PhysicalAddr = (LARGE_INTEGER)0LL; + *PhysicalAddr = (LARGE_INTEGER)0LL; #else - PhysicalAddr->QuadPart = 0; + + PhysicalAddr->QuadPart = 0; #endif - } - return; - } + + } + return; + } /* * Atomically set the entry to zero and get the old value. @@ -572,63 +578,63 @@ MmDeleteVirtualMapping(PEPROCESS Process, PVOID Address, BOOL FreePage, FLUSH_TLB; WasValid = (PAGE_MASK(Pte) != 0); if (WasValid) - { - MmMarkPageUnmapped(PTE_TO_PAGE(Pte)); - } + { + MmMarkPageUnmapped(PTE_TO_PAGE(Pte)); + } if (FreePage && WasValid) - { - MmReleasePageMemoryConsumer(MC_NPPOOL, PTE_TO_PAGE(Pte)); - } + { + MmReleasePageMemoryConsumer(MC_NPPOOL, PTE_TO_PAGE(Pte)); + } /* * Decrement the reference count for this page table. */ if (Process != NULL && WasValid && - Process->AddressSpace.PageTableRefCountTable != NULL && - Address < (PVOID)KERNEL_BASE) - { - PUSHORT Ptrc; - - Ptrc = Process->AddressSpace.PageTableRefCountTable; - - Ptrc[ADDR_TO_PAGE_TABLE(Address)]--; - if (Ptrc[ADDR_TO_PAGE_TABLE(Address)] == 0) - { - MmFreePageTable(Process, Address); - } - } + Process->AddressSpace.PageTableRefCountTable != NULL && + Address < (PVOID)KERNEL_BASE) + { + PUSHORT Ptrc; + + Ptrc = Process->AddressSpace.PageTableRefCountTable; + + Ptrc[ADDR_TO_PAGE_TABLE(Address)]--; + if (Ptrc[ADDR_TO_PAGE_TABLE(Address)] == 0) + { + MmFreePageTable(Process, Address); + } + } /* * If necessary go back to the original context */ if (Process != NULL && Process != CurrentProcess) - { - KeDetachProcess(); - } + { + KeDetachProcess(); + } /* * Return some information to the caller */ if (WasDirty != NULL) - { - if (Pte & PA_DIRTY) - { - *WasDirty = TRUE; - } - else - { - *WasDirty = FALSE; - } - } + { + if (Pte & PA_DIRTY) + { + *WasDirty = TRUE; + } + else + { + *WasDirty = FALSE; + } + } if (PhysicalAddr != NULL) - { - *PhysicalAddr = PTE_TO_PAGE(Pte); - } + { + *PhysicalAddr = PTE_TO_PAGE(Pte); + } } VOID -MmDeletePageFileMapping(PEPROCESS Process, PVOID Address, - SWAPENTRY* SwapEntry) +MmDeletePageFileMapping(PEPROCESS Process, PVOID Address, + SWAPENTRY* SwapEntry) /* * FUNCTION: Delete a virtual mapping */ @@ -643,9 +649,9 @@ MmDeletePageFileMapping(PEPROCESS Process, PVOID Address, * context. */ if (Process != NULL && Process != CurrentProcess) - { - KeAttachProcess(Process); - } + { + KeAttachProcess(Process); + } /* * Set the page directory entry, we may have to copy the entry from @@ -657,22 +663,22 @@ MmDeletePageFileMapping(PEPROCESS Process, PVOID Address, if (Address >= (PVOID)KERNEL_BASE) { kePde = MmGlobalKernelPageDirectory + ADDR_TO_PDE_OFFSET(Address); - if (*kePde != 0) - { - *Pde = *kePde; - FLUSH_TLB; - } + if (*kePde != 0) + { + *Pde = *kePde; + FLUSH_TLB; + } } } if (*Pde == 0) - { - if (Process != NULL && Process != CurrentProcess) - { - KeDetachProcess(); - } - *SwapEntry = 0; - return; - } + { + if (Process != NULL && Process != CurrentProcess) + { + KeDetachProcess(); + } + *SwapEntry = 0; + return; + } /* * Atomically set the entry to zero and get the old value. @@ -686,27 +692,27 @@ MmDeletePageFileMapping(PEPROCESS Process, PVOID Address, * Decrement the reference count for this page table. */ if (Process != NULL && WasValid && - Process->AddressSpace.PageTableRefCountTable != NULL && - Address < (PVOID)KERNEL_BASE) - { - PUSHORT Ptrc; - - Ptrc = Process->AddressSpace.PageTableRefCountTable; - - Ptrc[ADDR_TO_PAGE_TABLE(Address)]--; - if (Ptrc[ADDR_TO_PAGE_TABLE(Address)] == 0) - { - MmFreePageTable(Process, Address); - } - } + Process->AddressSpace.PageTableRefCountTable != NULL && + Address < (PVOID)KERNEL_BASE) + { + PUSHORT Ptrc; + + Ptrc = Process->AddressSpace.PageTableRefCountTable; + + Ptrc[ADDR_TO_PAGE_TABLE(Address)]--; + if (Ptrc[ADDR_TO_PAGE_TABLE(Address)] == 0) + { + MmFreePageTable(Process, Address); + } + } /* * If necessary go back to the original context */ if (Process != NULL && Process != CurrentProcess) - { - KeDetachProcess(); - } + { + KeDetachProcess(); + } /* * Return some information to the caller @@ -714,11 +720,11 @@ MmDeletePageFileMapping(PEPROCESS Process, PVOID Address, *SwapEntry = Pte >> 1; } -BOOLEAN +BOOLEAN Mmi386MakeKernelPageTableGlobal(PVOID PAddress) { PULONG kePde, Pde; - + Pde = ADDR_TO_PDE(PAddress); if (*Pde == 0) { @@ -726,7 +732,7 @@ Mmi386MakeKernelPageTableGlobal(PVOID PAddress) if (*kePde != 0) { *Pde = *kePde; - FLUSH_TLB; + FLUSH_TLB; return(TRUE); } } @@ -736,7 +742,7 @@ Mmi386MakeKernelPageTableGlobal(PVOID PAddress) BOOLEAN MmIsPageTablePresent(PVOID PAddress) { PULONG Pde, kePde; - + Pde = ADDR_TO_PDE(PAddress); if (*Pde == 0) { @@ -744,8 +750,8 @@ BOOLEAN MmIsPageTablePresent(PVOID PAddress) if (*kePde != 0) { *Pde = *kePde; - FLUSH_TLB; - return TRUE; + FLUSH_TLB; + return TRUE; } } return FALSE; @@ -756,9 +762,9 @@ NTSTATUS MmCreatePageTable(PVOID PAddress) PULONG Pde, kePde; PHYSICAL_ADDRESS npage; NTSTATUS Status; - + DPRINT("MmGetPageEntry(Address %x)\n", PAddress); - + Pde = ADDR_TO_PDE(PAddress); DPRINT("page_dir %x *page_dir %x\n", Pde, *Pde); if (*Pde == 0 && PAddress >= (PVOID)KERNEL_BASE) @@ -766,9 +772,9 @@ NTSTATUS MmCreatePageTable(PVOID PAddress) kePde = MmGlobalKernelPageDirectory + ADDR_TO_PDE_OFFSET(PAddress); if (*kePde != 0) { - *Pde = *kePde; - FLUSH_TLB; - return STATUS_SUCCESS; + *Pde = *kePde; + FLUSH_TLB; + return STATUS_SUCCESS; } /* Should we create a kernel page table? */ DPRINT1("!!!!!!!!!!!!!!!!!!\n"); @@ -799,60 +805,60 @@ PULONG MmGetPageEntry(PVOID PAddress) KIRQL oldIrql; BOOLEAN Free = FALSE; NTSTATUS Status; - + DPRINT("MmGetPageEntry(Address %x)\n", PAddress); - + Pde = ADDR_TO_PDE(PAddress); DPRINT("page_dir %x *page_dir %x\n",Pde,*Pde); if (*Pde == 0) { if (PAddress >= (PVOID)KERNEL_BASE) { - oldIrql = KeRaiseIrqlToSynchLevel(); - kePde = MmGlobalKernelPageDirectory + ADDR_TO_PDE_OFFSET(PAddress); - if (*kePde != 0) - { - *Pde = *kePde; - FLUSH_TLB; - } - else - { - KeLowerIrql(oldIrql); - Status = MmRequestPageMemoryConsumer(MC_NPPOOL, FALSE, &npage); + oldIrql = KeRaiseIrqlToSynchLevel(); + kePde = MmGlobalKernelPageDirectory + ADDR_TO_PDE_OFFSET(PAddress); + if (*kePde != 0) + { + *Pde = *kePde; + FLUSH_TLB; + } + else + { + KeLowerIrql(oldIrql); + Status = MmRequestPageMemoryConsumer(MC_NPPOOL, FALSE, &npage); if (!NT_SUCCESS(Status)) - { - KEBUGCHECK(0); - } - MiZeroPage(npage); - oldIrql = KeRaiseIrqlToSynchLevel(); - if (*kePde != 0) - { - *Pde = *kePde; - FLUSH_TLB; - Free = TRUE; - } - else - { + { + KEBUGCHECK(0); + } + MiZeroPage(npage); + oldIrql = KeRaiseIrqlToSynchLevel(); + if (*kePde != 0) + { + *Pde = *kePde; + FLUSH_TLB; + Free = TRUE; + } + else + { *Pde = *kePde = npage.u.LowPart | PA_PRESENT | PA_READWRITE; - FLUSH_TLB; - } - } - KeLowerIrql(oldIrql); + FLUSH_TLB; + } + } + KeLowerIrql(oldIrql); } else { - Status = MmRequestPageMemoryConsumer(MC_NPPOOL, FALSE, &npage); + Status = MmRequestPageMemoryConsumer(MC_NPPOOL, FALSE, &npage); if (!NT_SUCCESS(Status)) - { - KEBUGCHECK(0); - } - MiZeroPage(npage); - *Pde = npage.u.LowPart | PA_PRESENT | PA_READWRITE | PA_USER; - FLUSH_TLB; + { + KEBUGCHECK(0); + } + MiZeroPage(npage); + *Pde = npage.u.LowPart | PA_PRESENT | PA_READWRITE | PA_USER; + FLUSH_TLB; } if (Free) { - MmReleasePageMemoryConsumer(MC_NPPOOL, npage); + MmReleasePageMemoryConsumer(MC_NPPOOL, npage); } } @@ -864,7 +870,7 @@ BOOLEAN MmIsDirtyPage(PEPROCESS Process, PVOID Address) return (BOOLEAN)((MmGetPageEntryForProcess(Process, Address)) & PA_DIRTY); } -BOOLEAN +BOOLEAN MmIsAccessedAndResetAccessPage(PEPROCESS Process, PVOID Address) { PULONG PageEntry; @@ -872,34 +878,34 @@ MmIsAccessedAndResetAccessPage(PEPROCESS Process, PVOID Address) BOOLEAN Accessed; if (Process) - { - CurrentProcess = PsGetCurrentProcess(); - if (Process != CurrentProcess) - { - KeAttachProcess(Process); - } - } - else - { - if (((ULONG)Address & ~0xFFF) < KERNEL_BASE) - { - DPRINT1("MmIsAccessedAndResetAccessPage is called for user space without a process.\n"); - KEBUGCHECK(0); - } - CurrentProcess = NULL; - } + { + CurrentProcess = PsGetCurrentProcess(); + if (Process != CurrentProcess) + { + KeAttachProcess(Process); + } + } + else + { + if (((ULONG)Address & ~0xFFF) < KERNEL_BASE) + { + DPRINT1("MmIsAccessedAndResetAccessPage is called for user space without a process.\n"); + KEBUGCHECK(0); + } + CurrentProcess = NULL; + } PageEntry = MmGetPageEntry(Address); Accessed = (BOOLEAN)((*PageEntry) & PA_ACCESSED); if (Accessed) - { - (*PageEntry) = (*PageEntry) & (~PA_ACCESSED); - FLUSH_TLB; - } + { + (*PageEntry) = (*PageEntry) & (~PA_ACCESSED); + FLUSH_TLB; + } if (Process != CurrentProcess) - { - KeDetachProcess(); - } + { + KeDetachProcess(); + } return(Accessed); } @@ -910,29 +916,29 @@ VOID MmSetCleanPage(PEPROCESS Process, PVOID Address) PEPROCESS CurrentProcess; if (Process) - { - CurrentProcess = PsGetCurrentProcess(); - if (Process != CurrentProcess) - { - KeAttachProcess(Process); - } - } - else - { - if (((ULONG)Address & ~0xFFF) < KERNEL_BASE) - { - DPRINT1("MmSetCleanPage is called for user space without a process.\n"); - KEBUGCHECK(0); - } - CurrentProcess = NULL; - } + { + CurrentProcess = PsGetCurrentProcess(); + if (Process != CurrentProcess) + { + KeAttachProcess(Process); + } + } + else + { + if (((ULONG)Address & ~0xFFF) < KERNEL_BASE) + { + DPRINT1("MmSetCleanPage is called for user space without a process.\n"); + KEBUGCHECK(0); + } + CurrentProcess = NULL; + } PageEntry = MmGetPageEntry(Address); (*PageEntry) = (*PageEntry) & (~PA_DIRTY); FLUSH_TLB; if (Process != CurrentProcess) - { - KeDetachProcess(); - } + { + KeDetachProcess(); + } } VOID MmSetDirtyPage(PEPROCESS Process, PVOID Address) @@ -941,47 +947,47 @@ VOID MmSetDirtyPage(PEPROCESS Process, PVOID Address) PEPROCESS CurrentProcess = NULL; if (Process) - { - CurrentProcess = PsGetCurrentProcess(); - if (Process != CurrentProcess) - { - KeAttachProcess(Process); - } - } - else - { - if (((ULONG)Address & ~0xFFF) < KERNEL_BASE) - { - DPRINT1("MmSetDirtyPage is called for user space without a process.\n"); - KEBUGCHECK(0); - } - CurrentProcess = NULL; - } + { + CurrentProcess = PsGetCurrentProcess(); + if (Process != CurrentProcess) + { + KeAttachProcess(Process); + } + } + else + { + if (((ULONG)Address & ~0xFFF) < KERNEL_BASE) + { + DPRINT1("MmSetDirtyPage is called for user space without a process.\n"); + KEBUGCHECK(0); + } + CurrentProcess = NULL; + } PageEntry = MmGetPageEntry(Address); (*PageEntry) = (*PageEntry) | PA_DIRTY; FLUSH_TLB; if (Process != CurrentProcess) - { - KeDetachProcess(); - } + { + KeDetachProcess(); + } } VOID MmEnableVirtualMapping(PEPROCESS Process, PVOID Address) { PULONG PageEntry; PEPROCESS CurrentProcess = PsGetCurrentProcess(); - + if (Process != CurrentProcess) - { - KeAttachProcess(Process); - } + { + KeAttachProcess(Process); + } PageEntry = MmGetPageEntry(Address); (*PageEntry) = (*PageEntry) | PA_PRESENT; FLUSH_TLB; if (Process != CurrentProcess) - { - KeDetachProcess(); - } + { + KeDetachProcess(); + } } BOOLEAN MmIsPagePresent(PEPROCESS Process, PVOID Address) @@ -991,324 +997,324 @@ BOOLEAN MmIsPagePresent(PEPROCESS Process, PVOID Address) BOOLEAN MmIsPageSwapEntry(PEPROCESS Process, PVOID Address) { - ULONG Pte; - Pte = MmGetPageEntryForProcess1(Process, Address); - return((!(Pte & PA_PRESENT)) && Pte != 0); + ULONG Pte; + Pte = MmGetPageEntryForProcess1(Process, Address); + return((!(Pte & PA_PRESENT)) && Pte != 0); } -NTSTATUS -MmCreateVirtualMappingDump(PVOID Address, - ULONG flProtect, - PHYSICAL_ADDRESS PhysicalAddress) +NTSTATUS +MmCreateVirtualMappingDump(PVOID Address, + ULONG flProtect, + PHYSICAL_ADDRESS PhysicalAddress) { ULONG Attributes; PULONG Pte; NTSTATUS Status; if (Address < (PVOID)KERNEL_BASE) - { - DPRINT1("No process\n"); - KEBUGCHECK(0); - } - - Attributes = ProtectToPTE(flProtect); - if (!(Attributes & PA_PRESENT) && PhysicalAddress.QuadPart != 0) - { - DPRINT1("Setting physical address but not allowing access at address " - "0x%.8X with attributes %x/%x.\n", - Address, Attributes, flProtect); - KEBUGCHECK(0); - } - - Status = MmGetPageEntry2(Address, &Pte, FALSE); - if (!NT_SUCCESS(Status)) - { - return(Status); - } - if (PAGE_MASK((*Pte)) != 0 && !((*Pte) & PA_PRESENT)) - { - KEBUGCHECK(0); - } - *Pte = (ULONG)(PhysicalAddress.QuadPart | Attributes); - FLUSH_TLB; - return(STATUS_SUCCESS); -} - - -NTSTATUS -MmCreateVirtualMappingForKernel(PVOID Address, - ULONG flProtect, - PHYSICAL_ADDRESS PhysicalAddress) -{ - PEPROCESS CurrentProcess; - ULONG Attributes; - PULONG Pte; - NTSTATUS Status; - PEPROCESS Process = NULL; - - if (Process != NULL) - { - CurrentProcess = PsGetCurrentProcess(); - } - else - { - CurrentProcess = NULL; - } - - if (Process == NULL && Address < (PVOID)KERNEL_BASE) - { - DPRINT1("No process\n"); - KEBUGCHECK(0); - } - if (Process != NULL && Address >= (PVOID)KERNEL_BASE) - { - DPRINT1("Setting kernel address with process context\n"); - KEBUGCHECK(0); - } - Attributes = ProtectToPTE(flProtect); - - if (Process != NULL && Process != CurrentProcess) - { - KeAttachProcess(Process); - } - - Status = MmGetPageEntry2(Address, &Pte, FALSE); - if (!NT_SUCCESS(Status)) - { - if (Process != NULL && Process != CurrentProcess) - { - KeDetachProcess(); - } - return(Status); - } - if (PAGE_MASK((*Pte)) != 0 && !((*Pte) & PA_PRESENT)) - { - KEBUGCHECK(0); - } - if (PAGE_MASK((*Pte)) != 0) - { - MmMarkPageUnmapped(PTE_TO_PAGE((*Pte))); - } - *Pte = (ULONG)(PhysicalAddress.QuadPart | Attributes); - if (Process != NULL && - Process->AddressSpace.PageTableRefCountTable != NULL && - Address < (PVOID)KERNEL_BASE && - Attributes & PA_PRESENT) - { - PUSHORT Ptrc; - - Ptrc = Process->AddressSpace.PageTableRefCountTable; - - Ptrc[ADDR_TO_PAGE_TABLE(Address)]++; - } - FLUSH_TLB; - if (Process != NULL && Process != CurrentProcess) - { - KeDetachProcess(); - } - return(STATUS_SUCCESS); -} - -NTSTATUS -MmCreatePageFileMapping(PEPROCESS Process, - PVOID Address, - SWAPENTRY SwapEntry) -{ - PEPROCESS CurrentProcess; - PULONG Pte; - NTSTATUS Status; - - if (Process != NULL) - { - CurrentProcess = PsGetCurrentProcess(); - } - else - { - CurrentProcess = NULL; - } - - if (Process == NULL && Address < (PVOID)KERNEL_BASE) - { + { DPRINT1("No process\n"); KEBUGCHECK(0); - } - if (Process != NULL && Address >= (PVOID)KERNEL_BASE) - { + } + + Attributes = ProtectToPTE(flProtect); + if (!(Attributes & PA_PRESENT) && PhysicalAddress.QuadPart != 0) + { + DPRINT1("Setting physical address but not allowing access at address " + "0x%.8X with attributes %x/%x.\n", + Address, Attributes, flProtect); + KEBUGCHECK(0); + } + + Status = MmGetPageEntry2(Address, &Pte, FALSE); + if (!NT_SUCCESS(Status)) + { + return(Status); + } + if (PAGE_MASK((*Pte)) != 0 && !((*Pte) & PA_PRESENT)) + { + KEBUGCHECK(0); + } + *Pte = (ULONG)(PhysicalAddress.QuadPart | Attributes); + FLUSH_TLB; + return(STATUS_SUCCESS); +} + + +NTSTATUS +MmCreateVirtualMappingForKernel(PVOID Address, + ULONG flProtect, + PHYSICAL_ADDRESS PhysicalAddress) +{ + PEPROCESS CurrentProcess; + ULONG Attributes; + PULONG Pte; + NTSTATUS Status; + PEPROCESS Process = NULL; + + if (Process != NULL) + { + CurrentProcess = PsGetCurrentProcess(); + } + else + { + CurrentProcess = NULL; + } + + if (Process == NULL && Address < (PVOID)KERNEL_BASE) + { + DPRINT1("No process\n"); + KEBUGCHECK(0); + } + if (Process != NULL && Address >= (PVOID)KERNEL_BASE) + { DPRINT1("Setting kernel address with process context\n"); KEBUGCHECK(0); - } - if (SwapEntry & (1 << 31)) - { - KEBUGCHECK(0); - } + } + Attributes = ProtectToPTE(flProtect); - if (Process != NULL && Process != CurrentProcess) - { - KeAttachProcess(Process); - } - - Status = MmGetPageEntry2(Address, &Pte, FALSE); - if (!NT_SUCCESS(Status)) - { - if (Process != NULL && Process != CurrentProcess) - { - KeDetachProcess(); - } - return(Status); - } - if (PAGE_MASK((*Pte)) != 0) - { + if (Process != NULL && Process != CurrentProcess) + { + KeAttachProcess(Process); + } + + Status = MmGetPageEntry2(Address, &Pte, FALSE); + if (!NT_SUCCESS(Status)) + { + if (Process != NULL && Process != CurrentProcess) + { + KeDetachProcess(); + } + return(Status); + } + if (PAGE_MASK((*Pte)) != 0 && !((*Pte) & PA_PRESENT)) + { + KEBUGCHECK(0); + } + if (PAGE_MASK((*Pte)) != 0) + { MmMarkPageUnmapped(PTE_TO_PAGE((*Pte))); - } - *Pte = SwapEntry << 1; - if (Process != NULL && - Process->AddressSpace.PageTableRefCountTable != NULL && - Address < (PVOID)KERNEL_BASE) - { + } + *Pte = (ULONG)(PhysicalAddress.QuadPart | Attributes); + if (Process != NULL && + Process->AddressSpace.PageTableRefCountTable != NULL && + Address < (PVOID)KERNEL_BASE && + Attributes & PA_PRESENT) + { PUSHORT Ptrc; - + Ptrc = Process->AddressSpace.PageTableRefCountTable; - + Ptrc[ADDR_TO_PAGE_TABLE(Address)]++; - } - FLUSH_TLB; - if (Process != NULL && Process != CurrentProcess) - { + } + FLUSH_TLB; + if (Process != NULL && Process != CurrentProcess) + { KeDetachProcess(); - } - return(STATUS_SUCCESS); + } + return(STATUS_SUCCESS); +} + +NTSTATUS +MmCreatePageFileMapping(PEPROCESS Process, + PVOID Address, + SWAPENTRY SwapEntry) +{ + PEPROCESS CurrentProcess; + PULONG Pte; + NTSTATUS Status; + + if (Process != NULL) + { + CurrentProcess = PsGetCurrentProcess(); + } + else + { + CurrentProcess = NULL; + } + + if (Process == NULL && Address < (PVOID)KERNEL_BASE) + { + DPRINT1("No process\n"); + KEBUGCHECK(0); + } + if (Process != NULL && Address >= (PVOID)KERNEL_BASE) + { + DPRINT1("Setting kernel address with process context\n"); + KEBUGCHECK(0); + } + if (SwapEntry & (1 << 31)) + { + KEBUGCHECK(0); + } + + if (Process != NULL && Process != CurrentProcess) + { + KeAttachProcess(Process); + } + + Status = MmGetPageEntry2(Address, &Pte, FALSE); + if (!NT_SUCCESS(Status)) + { + if (Process != NULL && Process != CurrentProcess) + { + KeDetachProcess(); + } + return(Status); + } + if (PAGE_MASK((*Pte)) != 0) + { + MmMarkPageUnmapped(PTE_TO_PAGE((*Pte))); + } + *Pte = SwapEntry << 1; + if (Process != NULL && + Process->AddressSpace.PageTableRefCountTable != NULL && + Address < (PVOID)KERNEL_BASE) + { + PUSHORT Ptrc; + + Ptrc = Process->AddressSpace.PageTableRefCountTable; + + Ptrc[ADDR_TO_PAGE_TABLE(Address)]++; + } + FLUSH_TLB; + if (Process != NULL && Process != CurrentProcess) + { + KeDetachProcess(); + } + return(STATUS_SUCCESS); } -NTSTATUS +NTSTATUS MmCreateVirtualMappingUnsafe(PEPROCESS Process, - PVOID Address, - ULONG flProtect, - PHYSICAL_ADDRESS PhysicalAddress, - BOOLEAN MayWait) + PVOID Address, + ULONG flProtect, + PHYSICAL_ADDRESS PhysicalAddress, + BOOLEAN MayWait) { PEPROCESS CurrentProcess; ULONG Attributes; PULONG Pte; NTSTATUS Status; - if (Process != NULL) - { + if (Process != NULL) + { CurrentProcess = PsGetCurrentProcess(); - } - else - { + } + else + { CurrentProcess = NULL; - } - + } + if (Process == NULL && Address < (PVOID)KERNEL_BASE) - { - DPRINT1("No process\n"); - KEBUGCHECK(0); - } + { + DPRINT1("No process\n"); + KEBUGCHECK(0); + } if (Process != NULL && Address >= (PVOID)KERNEL_BASE) - { - DPRINT1("Setting kernel address with process context\n"); - KEBUGCHECK(0); - } + { + DPRINT1("Setting kernel address with process context\n"); + KEBUGCHECK(0); + } MmMarkPageMapped(PhysicalAddress); - + Attributes = ProtectToPTE(flProtect); if (!(Attributes & PA_PRESENT) && PhysicalAddress.QuadPart != 0) - { - DPRINT1("Setting physical address but not allowing access at address " - "0x%.8X with attributes %x/%x.\n", - Address, Attributes, flProtect); - KEBUGCHECK(0); - } - + { + DPRINT1("Setting physical address but not allowing access at address " + "0x%.8X with attributes %x/%x.\n", + Address, Attributes, flProtect); + KEBUGCHECK(0); + } + if (Process != NULL && Process != CurrentProcess) - { - KeAttachProcess(Process); - } - + { + KeAttachProcess(Process); + } + Status = MmGetPageEntry2(Address, &Pte, MayWait); if (!NT_SUCCESS(Status)) - { - if (Process != NULL && Process != CurrentProcess) - { - KeDetachProcess(); - } - return(Status); - } + { + if (Process != NULL && Process != CurrentProcess) + { + KeDetachProcess(); + } + return(Status); + } if (PAGE_MASK((*Pte)) != 0 && !((*Pte) & PA_PRESENT)) - { - KEBUGCHECK(0); - } + { + KEBUGCHECK(0); + } if (PAGE_MASK((*Pte)) != 0) - { - MmMarkPageUnmapped(PTE_TO_PAGE((*Pte))); - } + { + MmMarkPageUnmapped(PTE_TO_PAGE((*Pte))); + } *Pte = (ULONG)(PhysicalAddress.QuadPart | Attributes); - if (Process != NULL && - Process->AddressSpace.PageTableRefCountTable != NULL && - Address < (PVOID)KERNEL_BASE && - Attributes & PA_PRESENT) - { - PUSHORT Ptrc; - - Ptrc = Process->AddressSpace.PageTableRefCountTable; - - Ptrc[ADDR_TO_PAGE_TABLE(Address)]++; - } + if (Process != NULL && + Process->AddressSpace.PageTableRefCountTable != NULL && + Address < (PVOID)KERNEL_BASE && + Attributes & PA_PRESENT) + { + PUSHORT Ptrc; + + Ptrc = Process->AddressSpace.PageTableRefCountTable; + + Ptrc[ADDR_TO_PAGE_TABLE(Address)]++; + } FLUSH_TLB; if (Process != NULL && Process != CurrentProcess) - { - KeDetachProcess(); - } + { + KeDetachProcess(); + } return(STATUS_SUCCESS); } -NTSTATUS +NTSTATUS MmCreateVirtualMapping(PEPROCESS Process, - PVOID Address, - ULONG flProtect, - PHYSICAL_ADDRESS PhysicalAddress, - BOOLEAN MayWait) + PVOID Address, + ULONG flProtect, + PHYSICAL_ADDRESS PhysicalAddress, + BOOLEAN MayWait) { - if (!MmIsUsablePage(PhysicalAddress)) - { + if (!MmIsUsablePage(PhysicalAddress)) + { DPRINT1("Page at address %x not usable\n", PhysicalAddress); KEBUGCHECK(0); - } - - return(MmCreateVirtualMappingUnsafe(Process, - Address, - flProtect, - PhysicalAddress, - MayWait)); + } + + return(MmCreateVirtualMappingUnsafe(Process, + Address, + flProtect, + PhysicalAddress, + MayWait)); } ULONG MmGetPageProtect(PEPROCESS Process, PVOID Address) { - ULONG Entry; - ULONG Protect; + ULONG Entry; + ULONG Protect; - Entry = MmGetPageEntryForProcess1(Process, Address); + Entry = MmGetPageEntryForProcess1(Process, Address); - if (!(Entry & PA_PRESENT)) - { + if (!(Entry & PA_PRESENT)) + { Protect = PAGE_NOACCESS; - } - else if (Entry & PA_READWRITE) - { + } + else if (Entry & PA_READWRITE) + { Protect = PAGE_READWRITE; - } - else - { + } + else + { Protect = PAGE_EXECUTE_READ; - } - return(Protect); + } + return(Protect); } -VOID +VOID MmSetPageProtect(PEPROCESS Process, PVOID Address, ULONG flProtect) { ULONG Attributes = 0; @@ -1316,26 +1322,26 @@ MmSetPageProtect(PEPROCESS Process, PVOID Address, ULONG flProtect) PEPROCESS CurrentProcess = PsGetCurrentProcess(); DPRINT("MmSetPageProtect(Process %x Address %x flProtect %x)\n", - Process, Address, flProtect); + Process, Address, flProtect); Attributes = ProtectToPTE(flProtect); if (Process != NULL && Process != CurrentProcess) - { - KeAttachProcess(Process); - } + { + KeAttachProcess(Process); + } PageEntry = MmGetPageEntry(Address); (*PageEntry) = PAGE_MASK(*PageEntry) | Attributes; FLUSH_TLB; if (Process != NULL && Process != CurrentProcess) - { - KeDetachProcess(); - } + { + KeDetachProcess(); + } } /* * @implemented */ -PHYSICAL_ADDRESS STDCALL +PHYSICAL_ADDRESS STDCALL MmGetPhysicalAddress(PVOID vaddr) /* * FUNCTION: Returns the physical address corresponding to a virtual address @@ -1348,14 +1354,14 @@ MmGetPhysicalAddress(PVOID vaddr) Pte = *MmGetPageEntry(vaddr); if (Pte & PA_PRESENT) - { - p.QuadPart = PAGE_MASK(Pte); - } + { + p.QuadPart = PAGE_MASK(Pte); + } else - { - p.QuadPart = 0; - } - + { + p.QuadPart = 0; + } + return p; } @@ -1363,33 +1369,33 @@ MmGetPhysicalAddress(PVOID vaddr) VOID MmUpdateStackPageDir(PULONG LocalPageDir, PKTHREAD PThread) { - unsigned EntryBase = ADDR_TO_PDE_OFFSET(PThread->StackLimit); - unsigned EntryTop = ADDR_TO_PDE_OFFSET((char*)PThread->InitialStack - PAGE_SIZE); + unsigned EntryBase = ADDR_TO_PDE_OFFSET(PThread->StackLimit); + unsigned EntryTop = ADDR_TO_PDE_OFFSET((char*)PThread->InitialStack - PAGE_SIZE); - if (0 == LocalPageDir[EntryBase]) - { + if (0 == LocalPageDir[EntryBase]) + { LocalPageDir[EntryBase] = MmGlobalKernelPageDirectory[EntryBase]; - } - if (EntryBase != EntryTop && 0 == LocalPageDir[EntryTop]) - { + } + if (EntryBase != EntryTop && 0 == LocalPageDir[EntryTop]) + { LocalPageDir[EntryTop] = MmGlobalKernelPageDirectory[EntryTop]; - } + } } VOID INIT_FUNCTION MmInitGlobalKernelPageDirectory(VOID) { - ULONG i; - PULONG CurrentPageDirectory = (PULONG)PAGEDIRECTORY_MAP; + ULONG i; + PULONG CurrentPageDirectory = (PULONG)PAGEDIRECTORY_MAP; - for (i = ADDR_TO_PDE_OFFSET(KERNEL_BASE); i < 1024; i++) - { - if (i != ADDR_TO_PDE_OFFSET(PAGETABLE_MAP) && - 0 == MmGlobalKernelPageDirectory[i] && 0 != CurrentPageDirectory[i]) - { - MmGlobalKernelPageDirectory[i] = CurrentPageDirectory[i]; - } - } + for (i = ADDR_TO_PDE_OFFSET(KERNEL_BASE); i < 1024; i++) + { + if (i != ADDR_TO_PDE_OFFSET(PAGETABLE_MAP) && + 0 == MmGlobalKernelPageDirectory[i] && 0 != CurrentPageDirectory[i]) + { + MmGlobalKernelPageDirectory[i] = CurrentPageDirectory[i]; + } + } } /* EOF */ diff --git a/reactos/ntoskrnl/mm/i386/pfault.c b/reactos/ntoskrnl/mm/i386/pfault.c index fe09febff12..12b27f5cf38 100644 --- a/reactos/ntoskrnl/mm/i386/pfault.c +++ b/reactos/ntoskrnl/mm/i386/pfault.c @@ -28,68 +28,68 @@ extern VOID MmSafeCopyToUserRestart(VOID); extern ULONG MmGlobalKernelPageDirectory[1024]; -BOOLEAN +BOOLEAN Mmi386MakeKernelPageTableGlobal(PVOID Address); /* FUNCTIONS *****************************************************************/ NTSTATUS MmPageFault(ULONG Cs, - PULONG Eip, - PULONG Eax, - ULONG Cr2, - ULONG ErrorCode) + PULONG Eip, + PULONG Eax, + ULONG Cr2, + ULONG ErrorCode) { KPROCESSOR_MODE Mode; NTSTATUS Status; - + DPRINT("MmPageFault(Eip %x, Cr2 %x, ErrorCode %x)\n", - Eip, Cr2, ErrorCode); - + Eip, Cr2, ErrorCode); + if (ErrorCode & 0x4) - { - Mode = UserMode; - } + { + Mode = UserMode; + } else - { - Mode = KernelMode; - } - - if (Mode == KernelMode && Cr2 >= KERNEL_BASE && - Mmi386MakeKernelPageTableGlobal((PVOID)Cr2)) - { - return(STATUS_SUCCESS); - } + { + Mode = KernelMode; + } + + if (Mode == KernelMode && Cr2 >= KERNEL_BASE && + Mmi386MakeKernelPageTableGlobal((PVOID)Cr2)) + { + return(STATUS_SUCCESS); + } if (ErrorCode & 0x1) - { - Status = MmAccessFault(Mode, Cr2, FALSE); - } + { + Status = MmAccessFault(Mode, Cr2, FALSE); + } else - { - Status = MmNotPresentFault(Mode, Cr2, FALSE); - } - + { + Status = MmNotPresentFault(Mode, Cr2, FALSE); + } + if (KeGetCurrentThread() != NULL && - KeGetCurrentThread()->Alerted[1] != 0 && - Cs != KERNEL_CS) - { - KiDeliverNormalApc(); - } + KeGetCurrentThread()->Alerted[1] != 0 && + Cs != KERNEL_CS) + { + KiDeliverNormalApc(); + } if (!NT_SUCCESS(Status) && (Mode == KernelMode) && - ((*Eip) >= (ULONG)MmSafeCopyFromUserUnsafeStart) && - ((*Eip) <= (ULONG)MmSafeCopyFromUserRestart)) - { - (*Eip) = (ULONG)MmSafeCopyFromUserRestart; - (*Eax) = STATUS_ACCESS_VIOLATION; - return(STATUS_SUCCESS); - } + ((*Eip) >= (ULONG)MmSafeCopyFromUserUnsafeStart) && + ((*Eip) <= (ULONG)MmSafeCopyFromUserRestart)) + { + (*Eip) = (ULONG)MmSafeCopyFromUserRestart; + (*Eax) = STATUS_ACCESS_VIOLATION; + return(STATUS_SUCCESS); + } if (!NT_SUCCESS(Status) && (Mode == KernelMode) && - ((*Eip) >= (ULONG)MmSafeCopyToUserUnsafeStart) && - ((*Eip) <= (ULONG)MmSafeCopyToUserRestart)) - { - (*Eip) = (ULONG)MmSafeCopyToUserRestart; - (*Eax) = STATUS_ACCESS_VIOLATION; - return(STATUS_SUCCESS); - } + ((*Eip) >= (ULONG)MmSafeCopyToUserUnsafeStart) && + ((*Eip) <= (ULONG)MmSafeCopyToUserRestart)) + { + (*Eip) = (ULONG)MmSafeCopyToUserRestart; + (*Eax) = STATUS_ACCESS_VIOLATION; + return(STATUS_SUCCESS); + } return(Status); } diff --git a/reactos/ntoskrnl/mm/iospace.c b/reactos/ntoskrnl/mm/iospace.c index 78e0400967d..18ab3e919ca 100644 --- a/reactos/ntoskrnl/mm/iospace.c +++ b/reactos/ntoskrnl/mm/iospace.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: iospace.c,v 1.25 2004/01/09 22:52:30 gvg Exp $ +/* $Id: iospace.c,v 1.26 2004/04/10 22:35:25 gdalsnes Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/iospace.c @@ -38,37 +38,37 @@ /* FUNCTIONS *****************************************************************/ /********************************************************************** - * NAME EXPORTED - * MmMapIoSpace@16 + * NAME EXPORTED + * MmMapIoSpace@16 * * DESCRIPTION - * Maps a physical memory range into system space. - * + * Maps a physical memory range into system space. + * * ARGUMENTS - * PhysicalAddress - * First physical address to map; - * - * NumberOfBytes - * Number of bytes to map; - * - * CacheEnable - * TRUE if the range can be cached. + * PhysicalAddress + * First physical address to map; + * + * NumberOfBytes + * Number of bytes to map; + * + * CacheEnable + * TRUE if the range can be cached. * * RETURN VALUE - * The base virtual address which maps the region. + * The base virtual address which maps the region. * * NOTE - * Description moved here from include/ddk/mmfuncs.h. - * Code taken from ntoskrnl/mm/special.c. + * Description moved here from include/ddk/mmfuncs.h. + * Code taken from ntoskrnl/mm/special.c. * * REVISIONS * * @implemented */ -PVOID STDCALL +PVOID STDCALL MmMapIoSpace (IN PHYSICAL_ADDRESS PhysicalAddress, - IN ULONG NumberOfBytes, - IN BOOLEAN CacheEnable) + IN ULONG NumberOfBytes, + IN BOOLEAN CacheEnable) { PVOID Result; MEMORY_AREA* marea; @@ -83,110 +83,113 @@ MmMapIoSpace (IN PHYSICAL_ADDRESS PhysicalAddress, MmLockAddressSpace(MmGetKernelAddressSpace()); Result = NULL; Status = MmCreateMemoryArea (NULL, - MmGetKernelAddressSpace(), - MEMORY_AREA_IO_MAPPING, - &Result, - NumberOfBytes, - 0, - &marea, - FALSE, - FALSE, - BoundaryAddressMultiple); + MmGetKernelAddressSpace(), + MEMORY_AREA_IO_MAPPING, + &Result, + NumberOfBytes, + 0, + &marea, + FALSE, + FALSE, + BoundaryAddressMultiple); MmUnlockAddressSpace(MmGetKernelAddressSpace()); if (!NT_SUCCESS(Status)) - { - DPRINT("MmMapIoSpace failed (%lx)\n", Status); - return (NULL); - } + { + DPRINT("MmMapIoSpace failed (%lx)\n", Status); + return (NULL); + } Attributes = PAGE_EXECUTE_READWRITE | PAGE_SYSTEM; if (!CacheEnable) - { - Attributes |= (PAGE_NOCACHE | PAGE_WRITETHROUGH); - } + { + Attributes |= (PAGE_NOCACHE | PAGE_WRITETHROUGH); + } for (i = 0; (i < (PAGE_ROUND_UP(NumberOfBytes) / PAGE_SIZE)); i++) - { + { #if !defined(__GNUC__) - PHYSICAL_ADDRESS dummyJunkNeeded; - dummyJunkNeeded.QuadPart = PhysicalAddress.QuadPart + (i * PAGE_SIZE); + PHYSICAL_ADDRESS dummyJunkNeeded; + dummyJunkNeeded.QuadPart = PhysicalAddress.QuadPart + (i * PAGE_SIZE); #endif - Status = - MmCreateVirtualMappingForKernel((char*)Result + (i * PAGE_SIZE), - Attributes, + + Status = + MmCreateVirtualMappingForKernel((char*)Result + (i * PAGE_SIZE), + Attributes, #if defined(__GNUC__) - (PHYSICAL_ADDRESS) - (PhysicalAddress.QuadPart + - (i * PAGE_SIZE)) + (PHYSICAL_ADDRESS) + (PhysicalAddress.QuadPart + + (i * PAGE_SIZE)) #else - dummyJunkNeeded + dummyJunkNeeded #endif - ); - if (!NT_SUCCESS(Status)) - { - DbgPrint("Unable to create virtual mapping\n"); - KEBUGCHECK(0); - } + ); + if (!NT_SUCCESS(Status)) + { + DbgPrint("Unable to create virtual mapping\n"); + KEBUGCHECK(0); + } #if defined(__GNUC__) - MmMarkPageMapped((PHYSICAL_ADDRESS) (PhysicalAddress.QuadPart + - (i * PAGE_SIZE))); + MmMarkPageMapped((PHYSICAL_ADDRESS) (PhysicalAddress.QuadPart + + (i * PAGE_SIZE))); #else - MmMarkPageMapped(dummyJunkNeeded); + + MmMarkPageMapped(dummyJunkNeeded); #endif - } + + } return ((PVOID)((char*)Result + PhysicalAddress.QuadPart % PAGE_SIZE)); } - + /********************************************************************** - * NAME EXPORTED - * MmUnmapIoSpace@8 + * NAME EXPORTED + * MmUnmapIoSpace@8 * * DESCRIPTION - * Unmaps a physical memory range from system space. - * + * Unmaps a physical memory range from system space. + * * ARGUMENTS - * BaseAddress - * The base virtual address which maps the region; - * - * NumberOfBytes - * Number of bytes to unmap. + * BaseAddress + * The base virtual address which maps the region; + * + * NumberOfBytes + * Number of bytes to unmap. * * RETURN VALUE - * None. + * None. * * NOTE - * Code taken from ntoskrnl/mm/special.c. + * Code taken from ntoskrnl/mm/special.c. * * REVISIONS * * @implemented */ -VOID STDCALL +VOID STDCALL MmUnmapIoSpace (IN PVOID BaseAddress, - IN ULONG NumberOfBytes) + IN ULONG NumberOfBytes) { MmLockAddressSpace(MmGetKernelAddressSpace()); MmFreeMemoryArea(MmGetKernelAddressSpace(), - (PVOID)(((ULONG)BaseAddress / PAGE_SIZE) * PAGE_SIZE), - NumberOfBytes, - NULL, - NULL); + (PVOID)(((ULONG)BaseAddress / PAGE_SIZE) * PAGE_SIZE), + NumberOfBytes, + NULL, + NULL); MmUnlockAddressSpace(MmGetKernelAddressSpace()); } /********************************************************************** - * NAME EXPORTED - * MmMapVideoDisplay@16 + * NAME EXPORTED + * MmMapVideoDisplay@16 * * @implemented */ PVOID STDCALL -MmMapVideoDisplay (IN PHYSICAL_ADDRESS PhysicalAddress, - IN ULONG NumberOfBytes, - IN MEMORY_CACHING_TYPE CacheType) +MmMapVideoDisplay (IN PHYSICAL_ADDRESS PhysicalAddress, + IN ULONG NumberOfBytes, + IN MEMORY_CACHING_TYPE CacheType) { - return MmMapIoSpace (PhysicalAddress, NumberOfBytes, (BOOLEAN)CacheType); + return MmMapIoSpace (PhysicalAddress, NumberOfBytes, (BOOLEAN)CacheType); } @@ -194,10 +197,10 @@ MmMapVideoDisplay (IN PHYSICAL_ADDRESS PhysicalAddress, * @implemented */ VOID STDCALL -MmUnmapVideoDisplay (IN PVOID BaseAddress, - IN ULONG NumberOfBytes) +MmUnmapVideoDisplay (IN PVOID BaseAddress, + IN ULONG NumberOfBytes) { - MmUnmapIoSpace (BaseAddress, NumberOfBytes); + MmUnmapIoSpace (BaseAddress, NumberOfBytes); } diff --git a/reactos/ntoskrnl/mm/kmap.c b/reactos/ntoskrnl/mm/kmap.c index f33660bb438..972bafda599 100644 --- a/reactos/ntoskrnl/mm/kmap.c +++ b/reactos/ntoskrnl/mm/kmap.c @@ -1,4 +1,4 @@ -/* $Id: kmap.c,v 1.31 2004/01/05 14:28:21 weiden Exp $ +/* $Id: kmap.c,v 1.32 2004/04/10 22:35:25 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -36,64 +36,64 @@ extern ULONG MiKernelMapLength; /* FUNCTIONS ***************************************************************/ -VOID +VOID ExUnmapPage(PVOID Addr) { KIRQL oldIrql; ULONG Base = ((char*)Addr - (char*)MiKernelMapStart) / PAGE_SIZE; - + DPRINT("ExUnmapPage(Addr %x)\n",Addr); - + MmDeleteVirtualMapping(NULL, (PVOID)Addr, FALSE, NULL, NULL); - KeAcquireSpinLock(&AllocMapLock, &oldIrql); + KeAcquireSpinLock(&AllocMapLock, &oldIrql); RtlClearBits(&AllocMap, Base, 1); AllocMapHint = min(AllocMapHint, Base); KeReleaseSpinLock(&AllocMapLock, oldIrql); } -PVOID +PVOID ExAllocatePage(VOID) { - PHYSICAL_ADDRESS PhysPage; - NTSTATUS Status; + PHYSICAL_ADDRESS PhysPage; + NTSTATUS Status; - Status = MmRequestPageMemoryConsumer(MC_NPPOOL, FALSE, &PhysPage); - if (!NT_SUCCESS(Status)) - { + Status = MmRequestPageMemoryConsumer(MC_NPPOOL, FALSE, &PhysPage); + if (!NT_SUCCESS(Status)) + { return(NULL); - } + } - return(ExAllocatePageWithPhysPage(PhysPage)); + return(ExAllocatePageWithPhysPage(PhysPage)); } NTSTATUS MiZeroPage(PHYSICAL_ADDRESS PhysPage) { - PVOID TempAddress; + PVOID TempAddress; - TempAddress = ExAllocatePageWithPhysPage(PhysPage); - if (TempAddress == NULL) - { + TempAddress = ExAllocatePageWithPhysPage(PhysPage); + if (TempAddress == NULL) + { return(STATUS_NO_MEMORY); - } - memset(TempAddress, 0, PAGE_SIZE); - ExUnmapPage(TempAddress); - return(STATUS_SUCCESS); + } + memset(TempAddress, 0, PAGE_SIZE); + ExUnmapPage(TempAddress); + return(STATUS_SUCCESS); } NTSTATUS MiCopyFromUserPage(PHYSICAL_ADDRESS DestPhysPage, PVOID SourceAddress) { - PVOID TempAddress; + PVOID TempAddress; - TempAddress = ExAllocatePageWithPhysPage(DestPhysPage); - if (TempAddress == NULL) - { + TempAddress = ExAllocatePageWithPhysPage(DestPhysPage); + if (TempAddress == NULL) + { return(STATUS_NO_MEMORY); - } - memcpy(TempAddress, SourceAddress, PAGE_SIZE); - ExUnmapPage(TempAddress); - return(STATUS_SUCCESS); + } + memcpy(TempAddress, SourceAddress, PAGE_SIZE); + ExUnmapPage(TempAddress); + return(STATUS_SUCCESS); } PVOID @@ -111,15 +111,15 @@ ExAllocatePageWithPhysPage(PHYSICAL_ADDRESS PhysPage) AllocMapHint = Base + 1; KeReleaseSpinLock(&AllocMapLock, oldlvl); Addr = (char*)MiKernelMapStart + Base * PAGE_SIZE; - Status = MmCreateVirtualMapping(NULL, - Addr, - PAGE_READWRITE | PAGE_SYSTEM, - PhysPage, - TRUE); + Status = MmCreateVirtualMapping(NULL, + Addr, + PAGE_READWRITE | PAGE_SYSTEM, + PhysPage, + TRUE); if (!NT_SUCCESS(Status)) { - DbgPrint("Unable to create virtual mapping\n"); - KEBUGCHECK(0); + DbgPrint("Unable to create virtual mapping\n"); + KEBUGCHECK(0); } return Addr; } @@ -138,22 +138,22 @@ MiInitKernelMap(VOID) VOID MiFreeNonPagedPoolRegion(PVOID Addr, ULONG Count, BOOLEAN Free) { - ULONG i; - ULONG Base = ((char*)Addr - (char*)MiKernelMapStart) / PAGE_SIZE; - KIRQL oldlvl; - - for (i = 0; i < Count; i++) - { - MmDeleteVirtualMapping(NULL, - (char*)Addr + (i * PAGE_SIZE), - Free, - NULL, - NULL); - } - KeAcquireSpinLock(&AllocMapLock, &oldlvl); - RtlClearBits(&AllocMap, Base, Count); - AllocMapHint = min(AllocMapHint, Base); - KeReleaseSpinLock(&AllocMapLock, oldlvl); + ULONG i; + ULONG Base = ((char*)Addr - (char*)MiKernelMapStart) / PAGE_SIZE; + KIRQL oldlvl; + + for (i = 0; i < Count; i++) + { + MmDeleteVirtualMapping(NULL, + (char*)Addr + (i * PAGE_SIZE), + Free, + NULL, + NULL); + } + KeAcquireSpinLock(&AllocMapLock, &oldlvl); + RtlClearBits(&AllocMap, Base, Count); + AllocMapHint = min(AllocMapHint, Base); + KeReleaseSpinLock(&AllocMapLock, oldlvl); } PVOID diff --git a/reactos/ntoskrnl/mm/marea.c b/reactos/ntoskrnl/mm/marea.c index d2e4cac2778..fc0475d3ab3 100644 --- a/reactos/ntoskrnl/mm/marea.c +++ b/reactos/ntoskrnl/mm/marea.c @@ -45,163 +45,163 @@ VOID MmDumpMemoryAreas(PLIST_ENTRY ListHead) { PLIST_ENTRY current_entry; MEMORY_AREA* current; - + DbgPrint("MmDumpMemoryAreas()\n"); - + current_entry = ListHead->Flink; while (current_entry!=ListHead) - { - current = CONTAINING_RECORD(current_entry,MEMORY_AREA,Entry); - DbgPrint("Base %x Length %x End %x Attributes %x Flink %x\n", - current->BaseAddress,current->Length, - (char*)current->BaseAddress+current->Length,current->Attributes, - current->Entry.Flink); - current_entry = current_entry->Flink; - } + { + current = CONTAINING_RECORD(current_entry,MEMORY_AREA,Entry); + DbgPrint("Base %x Length %x End %x Attributes %x Flink %x\n", + current->BaseAddress,current->Length, + (char*)current->BaseAddress+current->Length,current->Attributes, + current->Entry.Flink); + current_entry = current_entry->Flink; + } DbgPrint("Finished MmDumpMemoryAreas()\n"); } MEMORY_AREA* MmOpenMemoryAreaByAddress(PMADDRESS_SPACE AddressSpace, - PVOID Address) + PVOID Address) { PLIST_ENTRY current_entry; MEMORY_AREA* current; PLIST_ENTRY previous_entry; DPRINT("MmOpenMemoryAreaByAddress(AddressSpace %x, Address %x)\n", - AddressSpace, Address); - + AddressSpace, Address); + previous_entry = &AddressSpace->MAreaListHead; current_entry = AddressSpace->MAreaListHead.Flink; while (current_entry != &AddressSpace->MAreaListHead) - { - current = CONTAINING_RECORD(current_entry, - MEMORY_AREA, - Entry); - assert(current_entry->Blink->Flink == current_entry); - assert(current_entry->Flink->Blink == current_entry); - assert(previous_entry->Flink == current_entry); - if (current->BaseAddress <= Address && - (PVOID)((char*)current->BaseAddress + current->Length) > Address) - { - DPRINT("%s() = %x\n",__FUNCTION__,current); - return(current); - } - if (current->BaseAddress > Address) - { - DPRINT("%s() = NULL\n",__FUNCTION__); - return(NULL); - } - previous_entry = current_entry; - current_entry = current_entry->Flink; - } + { + current = CONTAINING_RECORD(current_entry, + MEMORY_AREA, + Entry); + assert(current_entry->Blink->Flink == current_entry); + assert(current_entry->Flink->Blink == current_entry); + assert(previous_entry->Flink == current_entry); + if (current->BaseAddress <= Address && + (PVOID)((char*)current->BaseAddress + current->Length) > Address) + { + DPRINT("%s() = %x\n",__FUNCTION__,current); + return(current); + } + if (current->BaseAddress > Address) + { + DPRINT("%s() = NULL\n",__FUNCTION__); + return(NULL); + } + previous_entry = current_entry; + current_entry = current_entry->Flink; + } DPRINT("%s() = NULL\n",__FUNCTION__); return(NULL); } -MEMORY_AREA* MmOpenMemoryAreaByRegion(PMADDRESS_SPACE AddressSpace, - PVOID Address, - ULONG Length) +MEMORY_AREA* MmOpenMemoryAreaByRegion(PMADDRESS_SPACE AddressSpace, + PVOID Address, + ULONG Length) { PLIST_ENTRY current_entry; MEMORY_AREA* current; ULONG Extent; - + DPRINT("MmOpenMemoryByRegion(AddressSpace %x, Address %x, Length %x)\n", - AddressSpace, Address, Length); - + AddressSpace, Address, Length); + current_entry = AddressSpace->MAreaListHead.Flink; while (current_entry != &AddressSpace->MAreaListHead) - { - current = CONTAINING_RECORD(current_entry, - MEMORY_AREA, - Entry); - DPRINT("current->BaseAddress %x current->Length %x\n", - current->BaseAddress,current->Length); - if (current->BaseAddress >= Address && - current->BaseAddress < (PVOID)((char*)Address+Length)) - { - DPRINT("Finished MmOpenMemoryAreaByRegion() = %x\n", - current); - return(current); - } - Extent = (ULONG)current->BaseAddress + current->Length; - if (Extent > (ULONG)Address && - Extent < (ULONG)((char*)Address+Length)) - { - DPRINT("Finished MmOpenMemoryAreaByRegion() = %x\n", - current); - return(current); - } - if (current->BaseAddress <= Address && - Extent >= (ULONG)((char*)Address+Length)) - { - DPRINT("Finished MmOpenMemoryAreaByRegion() = %x\n", - current); - return(current); - } - if (current->BaseAddress >= (PVOID)((char*)Address+Length)) - { - DPRINT("Finished MmOpenMemoryAreaByRegion()= NULL\n",0); - return(NULL); - } - current_entry = current_entry->Flink; - } + { + current = CONTAINING_RECORD(current_entry, + MEMORY_AREA, + Entry); + DPRINT("current->BaseAddress %x current->Length %x\n", + current->BaseAddress,current->Length); + if (current->BaseAddress >= Address && + current->BaseAddress < (PVOID)((char*)Address+Length)) + { + DPRINT("Finished MmOpenMemoryAreaByRegion() = %x\n", + current); + return(current); + } + Extent = (ULONG)current->BaseAddress + current->Length; + if (Extent > (ULONG)Address && + Extent < (ULONG)((char*)Address+Length)) + { + DPRINT("Finished MmOpenMemoryAreaByRegion() = %x\n", + current); + return(current); + } + if (current->BaseAddress <= Address && + Extent >= (ULONG)((char*)Address+Length)) + { + DPRINT("Finished MmOpenMemoryAreaByRegion() = %x\n", + current); + return(current); + } + if (current->BaseAddress >= (PVOID)((char*)Address+Length)) + { + DPRINT("Finished MmOpenMemoryAreaByRegion()= NULL\n",0); + return(NULL); + } + current_entry = current_entry->Flink; + } DPRINT("Finished MmOpenMemoryAreaByRegion() = NULL\n",0); return(NULL); } static VOID MmInsertMemoryArea(PMADDRESS_SPACE AddressSpace, - MEMORY_AREA* marea) + MEMORY_AREA* marea) { PLIST_ENTRY ListHead; PLIST_ENTRY current_entry; PLIST_ENTRY inserted_entry = &marea->Entry; MEMORY_AREA* current; - MEMORY_AREA* next; - + MEMORY_AREA* next; + DPRINT("MmInsertMemoryArea(marea %x)\n", marea); DPRINT("marea->BaseAddress %x\n", marea->BaseAddress); DPRINT("marea->Length %x\n", marea->Length); - + ListHead = &AddressSpace->MAreaListHead; - + current_entry = ListHead->Flink; if (IsListEmpty(ListHead)) - { - InsertHeadList(ListHead,&marea->Entry); - return; - } + { + InsertHeadList(ListHead,&marea->Entry); + return; + } current = CONTAINING_RECORD(current_entry,MEMORY_AREA,Entry); if (current->BaseAddress > marea->BaseAddress) - { - InsertHeadList(ListHead,&marea->Entry); - return; - } + { + InsertHeadList(ListHead,&marea->Entry); + return; + } while (current_entry->Flink!=ListHead) - { - current = CONTAINING_RECORD(current_entry,MEMORY_AREA,Entry); - next = CONTAINING_RECORD(current_entry->Flink,MEMORY_AREA,Entry); - if (current->BaseAddress < marea->BaseAddress && - current->Entry.Flink==ListHead) - { - current_entry->Flink = inserted_entry; - inserted_entry->Flink=ListHead; - inserted_entry->Blink=current_entry; - ListHead->Blink = inserted_entry; - return; - } - if (current->BaseAddress < marea->BaseAddress && - next->BaseAddress > marea->BaseAddress) - { - inserted_entry->Flink = current_entry->Flink; - inserted_entry->Blink = current_entry; - inserted_entry->Flink->Blink = inserted_entry; - current_entry->Flink=inserted_entry; - return; - } - current_entry = current_entry->Flink; - } + { + current = CONTAINING_RECORD(current_entry,MEMORY_AREA,Entry); + next = CONTAINING_RECORD(current_entry->Flink,MEMORY_AREA,Entry); + if (current->BaseAddress < marea->BaseAddress && + current->Entry.Flink==ListHead) + { + current_entry->Flink = inserted_entry; + inserted_entry->Flink=ListHead; + inserted_entry->Blink=current_entry; + ListHead->Blink = inserted_entry; + return; + } + if (current->BaseAddress < marea->BaseAddress && + next->BaseAddress > marea->BaseAddress) + { + inserted_entry->Flink = current_entry->Flink; + inserted_entry->Blink = current_entry; + inserted_entry->Flink->Blink = inserted_entry; + current_entry->Flink=inserted_entry; + return; + } + current_entry = current_entry->Flink; + } InsertTailList(ListHead,inserted_entry); } @@ -214,136 +214,136 @@ PVOID MmFindGapBottomUp(PMADDRESS_SPACE AddressSpace, ULONG Length) MEMORY_AREA* next; ULONG Gap; PVOID Address; - + DPRINT("MmFindGapBottomUp(Length %x)\n",Length); - + ListHead = &AddressSpace->MAreaListHead; - + current_entry = ListHead->Flink; while (current_entry->Flink!=ListHead) - { - current = CONTAINING_RECORD(current_entry,MEMORY_AREA,Entry); - next = CONTAINING_RECORD(current_entry->Flink,MEMORY_AREA,Entry); - Gap = (char*)next->BaseAddress - ((char*)current->BaseAddress + PAGE_ROUND_UP(current->Length)); - if (Gap >= Length) - { - return((char*)current->BaseAddress + PAGE_ROUND_UP(current->Length)); - } - current_entry = current_entry->Flink; - } - + { + current = CONTAINING_RECORD(current_entry,MEMORY_AREA,Entry); + next = CONTAINING_RECORD(current_entry->Flink,MEMORY_AREA,Entry); + Gap = (char*)next->BaseAddress - ((char*)current->BaseAddress + PAGE_ROUND_UP(current->Length)); + if (Gap >= Length) + { + return((char*)current->BaseAddress + PAGE_ROUND_UP(current->Length)); + } + current_entry = current_entry->Flink; + } + if (current_entry == ListHead) - { - Address = (PVOID)AddressSpace->LowestAddress; - } + { + Address = (PVOID)AddressSpace->LowestAddress; + } else - { - current = CONTAINING_RECORD(current_entry,MEMORY_AREA,Entry); - Address = (char*)current->BaseAddress + PAGE_ROUND_UP(current->Length); - } + { + current = CONTAINING_RECORD(current_entry,MEMORY_AREA,Entry); + Address = (char*)current->BaseAddress + PAGE_ROUND_UP(current->Length); + } /* Check if enough space for the block */ if (AddressSpace->LowestAddress < KERNEL_BASE) - { - if ((ULONG)Address >= KERNEL_BASE || Length > KERNEL_BASE - (ULONG)Address) - { - return NULL; - } - } + { + if ((ULONG)Address >= KERNEL_BASE || Length > KERNEL_BASE - (ULONG)Address) + { + return NULL; + } + } else - { - if (Length >= 0xFFFFFFFF - (ULONG)Address) - { - return NULL; - } - } + { + if (Length >= 0xFFFFFFFF - (ULONG)Address) + { + return NULL; + } + } return Address; } PVOID MmFindGapTopDown(PMADDRESS_SPACE AddressSpace, ULONG Length) { - PLIST_ENTRY ListHead; - PLIST_ENTRY current_entry; - MEMORY_AREA* current; - ULONG Gap; - PVOID Address; - PVOID TopAddress; - PVOID BottomAddress; - PVOID HighestAddress; + PLIST_ENTRY ListHead; + PLIST_ENTRY current_entry; + MEMORY_AREA* current; + ULONG Gap; + PVOID Address; + PVOID TopAddress; + PVOID BottomAddress; + PVOID HighestAddress; - DPRINT("MmFindGapTopDown(Length %lx)\n",Length); + DPRINT("MmFindGapTopDown(Length %lx)\n",Length); - if (AddressSpace->LowestAddress < KERNEL_BASE) //(ULONG_PTR)MmSystemRangeStart) - { + if (AddressSpace->LowestAddress < KERNEL_BASE) //(ULONG_PTR)MmSystemRangeStart) + { HighestAddress = MmHighestUserAddress; - } - else - { + } + else + { HighestAddress = (PVOID)0xFFFFFFFF; - } + } - TopAddress = HighestAddress; + TopAddress = HighestAddress; - ListHead = &AddressSpace->MAreaListHead; - current_entry = ListHead->Blink; - while (current_entry->Blink != ListHead) - { + ListHead = &AddressSpace->MAreaListHead; + current_entry = ListHead->Blink; + while (current_entry->Blink != ListHead) + { current = CONTAINING_RECORD(current_entry,MEMORY_AREA,Entry); BottomAddress = (char*)current->BaseAddress + PAGE_ROUND_UP(current->Length); DPRINT("Base %p Length %lx\n", current->BaseAddress, PAGE_ROUND_UP(current->Length)); if (BottomAddress < HighestAddress) - { - Gap = (char*)TopAddress - (char*)BottomAddress + 1; - DPRINT("Bottom %p Top %p Gap %lx\n", BottomAddress, TopAddress, Gap); - if (Gap >= Length) - { - DPRINT("Found gap at %p\n", (char*)TopAddress - Length); - return((char*)TopAddress - Length + 1); - } - TopAddress = (char*)current->BaseAddress - 1; - } + { + Gap = (char*)TopAddress - (char*)BottomAddress + 1; + DPRINT("Bottom %p Top %p Gap %lx\n", BottomAddress, TopAddress, Gap); + if (Gap >= Length) + { + DPRINT("Found gap at %p\n", (char*)TopAddress - Length); + return((char*)TopAddress - Length + 1); + } + TopAddress = (char*)current->BaseAddress - 1; + } current_entry = current_entry->Blink; - } + } - if (current_entry == ListHead) - { + if (current_entry == ListHead) + { Address = (char*)HighestAddress - Length + 1; - } - else - { - Address = (char*)TopAddress - Length + 1; - } - - /* Check if enough space for the block */ - if (AddressSpace->LowestAddress < KERNEL_BASE) - { - if ((ULONG)Address >= KERNEL_BASE || Length > KERNEL_BASE - (ULONG)Address) - { - DPRINT("Failed to find gap\n"); - return NULL; - } - } + } else - { - if (Length >= 0xFFFFFFFF - (ULONG)Address) - { - DPRINT("Failed to find gap\n"); - return NULL; - } - } + { + Address = (char*)TopAddress - Length + 1; + } - DPRINT("Found gap at %p\n", Address); - return Address; + /* Check if enough space for the block */ + if (AddressSpace->LowestAddress < KERNEL_BASE) + { + if ((ULONG)Address >= KERNEL_BASE || Length > KERNEL_BASE - (ULONG)Address) + { + DPRINT("Failed to find gap\n"); + return NULL; + } + } + else + { + if (Length >= 0xFFFFFFFF - (ULONG)Address) + { + DPRINT("Failed to find gap\n"); + return NULL; + } + } + + DPRINT("Found gap at %p\n", Address); + return Address; } PVOID MmFindGap(PMADDRESS_SPACE AddressSpace, ULONG Length, BOOL TopDown) { - if (TopDown) - return MmFindGapTopDown(AddressSpace, Length); + if (TopDown) + return MmFindGapTopDown(AddressSpace, Length); - return MmFindGapBottomUp(AddressSpace, Length); + return MmFindGapBottomUp(AddressSpace, Length); } @@ -357,92 +357,94 @@ MmInitMemoryAreas(VOID) return(STATUS_SUCCESS); } -NTSTATUS +NTSTATUS MmFreeMemoryArea(PMADDRESS_SPACE AddressSpace, - PVOID BaseAddress, - ULONG Length, - VOID (*FreePage)(PVOID Context, MEMORY_AREA* MemoryArea, - PVOID Address, PHYSICAL_ADDRESS PhysAddr, - SWAPENTRY SwapEntry, BOOLEAN Dirty), - PVOID FreePageContext) + PVOID BaseAddress, + ULONG Length, + VOID (*FreePage)(PVOID Context, MEMORY_AREA* MemoryArea, + PVOID Address, PHYSICAL_ADDRESS PhysAddr, + SWAPENTRY SwapEntry, BOOLEAN Dirty), + PVOID FreePageContext) { MEMORY_AREA* MemoryArea; ULONG i; PEPROCESS CurrentProcess = PsGetCurrentProcess(); - + DPRINT("MmFreeMemoryArea(AddressSpace %x, BaseAddress %x, Length %x," - "FreePageContext %d)\n",AddressSpace,BaseAddress,Length, - FreePageContext); + "FreePageContext %d)\n",AddressSpace,BaseAddress,Length, + FreePageContext); MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace, - BaseAddress); + BaseAddress); if (MemoryArea == NULL) - { - KEBUGCHECK(0); - return(STATUS_UNSUCCESSFUL); - } - if (AddressSpace->Process != NULL && - AddressSpace->Process != CurrentProcess) - { - KeAttachProcess(AddressSpace->Process); - } - for (i=0; i<(PAGE_ROUND_UP(MemoryArea->Length)/PAGE_SIZE); i++) - { -#if defined(__GNUC__) - PHYSICAL_ADDRESS PhysAddr = (PHYSICAL_ADDRESS)0LL; -#else - PHYSICAL_ADDRESS PhysAddr = { 0 }; -#endif - BOOL Dirty = FALSE; - SWAPENTRY SwapEntry = 0; - - if (MmIsPageSwapEntry(AddressSpace->Process, - (char*)MemoryArea->BaseAddress + (i * PAGE_SIZE))) - { - MmDeletePageFileMapping(AddressSpace->Process, - (char*)MemoryArea->BaseAddress + (i * PAGE_SIZE), - &SwapEntry); - } - else - { - MmDeleteVirtualMapping(AddressSpace->Process, - (char*)MemoryArea->BaseAddress + (i*PAGE_SIZE), - FALSE, &Dirty, &PhysAddr); - - } - if (FreePage != NULL) - { - FreePage(FreePageContext, MemoryArea, - (char*)MemoryArea->BaseAddress + (i * PAGE_SIZE), PhysAddr, - SwapEntry, (BOOLEAN)Dirty); - } - } + { + KEBUGCHECK(0); + return(STATUS_UNSUCCESSFUL); + } if (AddressSpace->Process != NULL && - AddressSpace->Process != CurrentProcess) - { - KeDetachProcess(); - } + AddressSpace->Process != CurrentProcess) + { + KeAttachProcess(AddressSpace->Process); + } + for (i=0; i<(PAGE_ROUND_UP(MemoryArea->Length)/PAGE_SIZE); i++) + { +#if defined(__GNUC__) + PHYSICAL_ADDRESS PhysAddr = (PHYSICAL_ADDRESS)0LL; +#else + + PHYSICAL_ADDRESS PhysAddr = { 0 }; +#endif + + BOOL Dirty = FALSE; + SWAPENTRY SwapEntry = 0; + + if (MmIsPageSwapEntry(AddressSpace->Process, + (char*)MemoryArea->BaseAddress + (i * PAGE_SIZE))) + { + MmDeletePageFileMapping(AddressSpace->Process, + (char*)MemoryArea->BaseAddress + (i * PAGE_SIZE), + &SwapEntry); + } + else + { + MmDeleteVirtualMapping(AddressSpace->Process, + (char*)MemoryArea->BaseAddress + (i*PAGE_SIZE), + FALSE, &Dirty, &PhysAddr); + + } + if (FreePage != NULL) + { + FreePage(FreePageContext, MemoryArea, + (char*)MemoryArea->BaseAddress + (i * PAGE_SIZE), PhysAddr, + SwapEntry, (BOOLEAN)Dirty); + } + } + if (AddressSpace->Process != NULL && + AddressSpace->Process != CurrentProcess) + { + KeDetachProcess(); + } RemoveEntryList(&MemoryArea->Entry); ExFreePool(MemoryArea); - + DPRINT("MmFreeMemoryArea() succeeded\n"); - + return(STATUS_SUCCESS); } PMEMORY_AREA MmSplitMemoryArea(PEPROCESS Process, - PMADDRESS_SPACE AddressSpace, - PMEMORY_AREA OriginalMemoryArea, - PVOID BaseAddress, - ULONG Length, - ULONG NewType, - ULONG NewAttributes) + PMADDRESS_SPACE AddressSpace, + PMEMORY_AREA OriginalMemoryArea, + PVOID BaseAddress, + ULONG Length, + ULONG NewType, + ULONG NewAttributes) { PMEMORY_AREA Result; PMEMORY_AREA Split; - - Result = ExAllocatePoolWithTag(NonPagedPool, sizeof(MEMORY_AREA), - TAG_MAREA); + + Result = ExAllocatePoolWithTag(NonPagedPool, sizeof(MEMORY_AREA), + TAG_MAREA); RtlZeroMemory(Result,sizeof(MEMORY_AREA)); Result->Type = NewType; Result->BaseAddress = BaseAddress; @@ -450,45 +452,45 @@ PMEMORY_AREA MmSplitMemoryArea(PEPROCESS Process, Result->Attributes = NewAttributes; Result->LockCount = 0; Result->Process = Process; - - if (BaseAddress == OriginalMemoryArea->BaseAddress) - { - OriginalMemoryArea->BaseAddress = (char*)BaseAddress + Length; - OriginalMemoryArea->Length = OriginalMemoryArea->Length - Length; - MmInsertMemoryArea(AddressSpace, Result); - return(Result); - } - if (((char*)BaseAddress + Length) == - ((char*)OriginalMemoryArea->BaseAddress + OriginalMemoryArea->Length)) - { - OriginalMemoryArea->Length = OriginalMemoryArea->Length - Length; - MmInsertMemoryArea(AddressSpace, Result); - return(Result); - } - + if (BaseAddress == OriginalMemoryArea->BaseAddress) + { + OriginalMemoryArea->BaseAddress = (char*)BaseAddress + Length; + OriginalMemoryArea->Length = OriginalMemoryArea->Length - Length; + MmInsertMemoryArea(AddressSpace, Result); + return(Result); + } + if (((char*)BaseAddress + Length) == + ((char*)OriginalMemoryArea->BaseAddress + OriginalMemoryArea->Length)) + { + OriginalMemoryArea->Length = OriginalMemoryArea->Length - Length; + MmInsertMemoryArea(AddressSpace, Result); + + return(Result); + } + Split = ExAllocatePoolWithTag(NonPagedPool, sizeof(MEMORY_AREA), - TAG_MAREA); + TAG_MAREA); RtlCopyMemory(Split,OriginalMemoryArea,sizeof(MEMORY_AREA)); Split->BaseAddress = (char*)BaseAddress + Length; - Split->Length = OriginalMemoryArea->Length - (((ULONG)BaseAddress) - + Length); - + Split->Length = OriginalMemoryArea->Length - (((ULONG)BaseAddress) + + Length); + OriginalMemoryArea->Length = (char*)BaseAddress - (char*)OriginalMemoryArea->BaseAddress; - + return(Split); } NTSTATUS MmCreateMemoryArea(PEPROCESS Process, - PMADDRESS_SPACE AddressSpace, - ULONG Type, - PVOID* BaseAddress, - ULONG Length, - ULONG Attributes, - MEMORY_AREA** Result, - BOOL FixedAddress, - BOOL TopDown, - PHYSICAL_ADDRESS BoundaryAddressMultiple) + PMADDRESS_SPACE AddressSpace, + ULONG Type, + PVOID* BaseAddress, + ULONG Length, + ULONG Attributes, + MEMORY_AREA** Result, + BOOL FixedAddress, + BOOL TopDown, + PHYSICAL_ADDRESS BoundaryAddressMultiple) /* * FUNCTION: Create a memory area * ARGUMENTS: @@ -505,64 +507,66 @@ NTSTATUS MmCreateMemoryArea(PEPROCESS Process, PVOID EndAddress; ULONG tmpLength; DPRINT("MmCreateMemoryArea(Type %d, BaseAddress %x," - "*BaseAddress %x, Length %x, Attributes %x, Result %x)\n", - Type,BaseAddress,*BaseAddress,Length,Attributes,Result); + "*BaseAddress %x, Length %x, Attributes %x, Result %x)\n", + Type,BaseAddress,*BaseAddress,Length,Attributes,Result); if ((*BaseAddress) == 0 && !FixedAddress) - { - tmpLength = PAGE_ROUND_UP(Length); - *BaseAddress = MmFindGap(AddressSpace, - PAGE_ROUND_UP(Length) +(PAGE_SIZE*2), - TopDown); - if ((*BaseAddress) == 0) - { - DPRINT("No suitable gap\n"); - return(STATUS_NO_MEMORY); - } + { + tmpLength = PAGE_ROUND_UP(Length); + *BaseAddress = MmFindGap(AddressSpace, + PAGE_ROUND_UP(Length) +(PAGE_SIZE*2), + TopDown); + if ((*BaseAddress) == 0) + { + DPRINT("No suitable gap\n"); + return(STATUS_NO_MEMORY); + } #if defined(__GNUC__) - (*BaseAddress)=(*BaseAddress)+PAGE_SIZE; + (*BaseAddress)=(*BaseAddress)+PAGE_SIZE; #else - { - char* pTemp = *BaseAddress; - pTemp += PAGE_SIZE; - *BaseAddress = pTemp; - } + + { + char* pTemp = *BaseAddress; + pTemp += PAGE_SIZE; + *BaseAddress = pTemp; + } #endif - } + + } else - { - tmpLength = (ULONG)*BaseAddress + Length - PAGE_ROUND_DOWN((*BaseAddress)); - (*BaseAddress) = (PVOID)PAGE_ROUND_DOWN((*BaseAddress)); + { + tmpLength = (ULONG)*BaseAddress + Length - PAGE_ROUND_DOWN((*BaseAddress)); + (*BaseAddress) = (PVOID)PAGE_ROUND_DOWN((*BaseAddress)); - if (AddressSpace->LowestAddress == KERNEL_BASE && - (*BaseAddress) < (PVOID)KERNEL_BASE) - { - return STATUS_ACCESS_VIOLATION; - } + if (AddressSpace->LowestAddress == KERNEL_BASE && + (*BaseAddress) < (PVOID)KERNEL_BASE) + { + return STATUS_ACCESS_VIOLATION; + } - if (AddressSpace->LowestAddress < KERNEL_BASE && - (PVOID)((char*)(*BaseAddress) + tmpLength) > (PVOID)KERNEL_BASE) - { - return STATUS_ACCESS_VIOLATION; - } + if (AddressSpace->LowestAddress < KERNEL_BASE && + (PVOID)((char*)(*BaseAddress) + tmpLength) > (PVOID)KERNEL_BASE) + { + return STATUS_ACCESS_VIOLATION; + } - if (BoundaryAddressMultiple.QuadPart != 0) - { - EndAddress = ((char*)(*BaseAddress)) + tmpLength-1; - assert(((DWORD_PTR)*BaseAddress/BoundaryAddressMultiple.QuadPart) == ((DWORD_PTR)EndAddress/BoundaryAddressMultiple.QuadPart)); - } + if (BoundaryAddressMultiple.QuadPart != 0) + { + EndAddress = ((char*)(*BaseAddress)) + tmpLength-1; + assert(((DWORD_PTR)*BaseAddress/BoundaryAddressMultiple.QuadPart) == ((DWORD_PTR)EndAddress/BoundaryAddressMultiple.QuadPart)); + } - if (MmOpenMemoryAreaByRegion(AddressSpace, - *BaseAddress, - tmpLength)!=NULL) - { - DPRINT("Memory area already occupied\n"); - return(STATUS_CONFLICTING_ADDRESSES); - } - } + if (MmOpenMemoryAreaByRegion(AddressSpace, + *BaseAddress, + tmpLength)!=NULL) + { + DPRINT("Memory area already occupied\n"); + return(STATUS_CONFLICTING_ADDRESSES); + } + } *Result = ExAllocatePoolWithTag(NonPagedPool, sizeof(MEMORY_AREA), - TAG_MAREA); + TAG_MAREA); RtlZeroMemory(*Result,sizeof(MEMORY_AREA)); (*Result)->Type = Type; (*Result)->BaseAddress = *BaseAddress; @@ -572,9 +576,9 @@ NTSTATUS MmCreateMemoryArea(PEPROCESS Process, (*Result)->Process = Process; (*Result)->PageOpCount = 0; (*Result)->DeleteInProgress = FALSE; - + MmInsertMemoryArea(AddressSpace, *Result); - + DPRINT("MmCreateMemoryArea() succeeded\n"); return(STATUS_SUCCESS); } diff --git a/reactos/ntoskrnl/mm/mdl.c b/reactos/ntoskrnl/mm/mdl.c index 869bde7b68f..6585b8aab1c 100644 --- a/reactos/ntoskrnl/mm/mdl.c +++ b/reactos/ntoskrnl/mm/mdl.c @@ -1,4 +1,4 @@ -/* $Id: mdl.c,v 1.60 2004/03/13 19:14:16 dwelch Exp $ +/* $Id: mdl.c,v 1.61 2004/04/10 22:35:25 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -36,55 +36,55 @@ static KSPIN_LOCK MiMdlMappingRegionLock; VOID INIT_FUNCTION MmInitializeMdlImplementation(VOID) { - MEMORY_AREA* Result; - NTSTATUS Status; - PVOID Buffer; - PHYSICAL_ADDRESS BoundaryAddressMultiple; + MEMORY_AREA* Result; + NTSTATUS Status; + PVOID Buffer; + PHYSICAL_ADDRESS BoundaryAddressMultiple; - BoundaryAddressMultiple.QuadPart = 0; - MiMdlMappingRegionHint = 0; - MiMdlMappingRegionBase = NULL; + BoundaryAddressMultiple.QuadPart = 0; + MiMdlMappingRegionHint = 0; + MiMdlMappingRegionBase = NULL; - MmLockAddressSpace(MmGetKernelAddressSpace()); - Status = MmCreateMemoryArea(NULL, - MmGetKernelAddressSpace(), - MEMORY_AREA_MDL_MAPPING, - &MiMdlMappingRegionBase, - MI_MDL_MAPPING_REGION_SIZE, - 0, - &Result, - FALSE, - FALSE, - BoundaryAddressMultiple); - if (!NT_SUCCESS(Status)) - { + MmLockAddressSpace(MmGetKernelAddressSpace()); + Status = MmCreateMemoryArea(NULL, + MmGetKernelAddressSpace(), + MEMORY_AREA_MDL_MAPPING, + &MiMdlMappingRegionBase, + MI_MDL_MAPPING_REGION_SIZE, + 0, + &Result, + FALSE, + FALSE, + BoundaryAddressMultiple); + if (!NT_SUCCESS(Status)) + { MmUnlockAddressSpace(MmGetKernelAddressSpace()); KEBUGCHECK(0); - } - MmUnlockAddressSpace(MmGetKernelAddressSpace()); + } + MmUnlockAddressSpace(MmGetKernelAddressSpace()); - Buffer = ExAllocatePool(NonPagedPool, MI_MDL_MAPPING_REGION_SIZE / (PAGE_SIZE * 8)); + Buffer = ExAllocatePool(NonPagedPool, MI_MDL_MAPPING_REGION_SIZE / (PAGE_SIZE * 8)); - RtlInitializeBitMap(&MiMdlMappingRegionAllocMap, Buffer, MI_MDL_MAPPING_REGION_SIZE / PAGE_SIZE); - RtlClearAllBits(&MiMdlMappingRegionAllocMap); + RtlInitializeBitMap(&MiMdlMappingRegionAllocMap, Buffer, MI_MDL_MAPPING_REGION_SIZE / PAGE_SIZE); + RtlClearAllBits(&MiMdlMappingRegionAllocMap); - KeInitializeSpinLock(&MiMdlMappingRegionLock); + KeInitializeSpinLock(&MiMdlMappingRegionLock); } -PVOID +PVOID MmGetMdlPageAddress(PMDL Mdl, PVOID Offset) { PULONG MdlPages; - + MdlPages = (PULONG)(Mdl + 1); - + return((PVOID)MdlPages[((ULONG)Offset) / PAGE_SIZE]); } /* * @unimplemented */ -VOID STDCALL +VOID STDCALL MmUnlockPages(PMDL Mdl) /* * FUNCTION: Unlocks the physical pages described by a given MDL @@ -97,37 +97,39 @@ MmUnlockPages(PMDL Mdl) { ULONG i; PULONG MdlPages; - - /* + + /* * FIXME: I don't know whether this right, but it looks sensible */ if ((Mdl->MdlFlags & MDL_SOURCE_IS_NONPAGED_POOL) || - (Mdl->MdlFlags & MDL_IO_PAGE_READ)) - { - return; - } - + (Mdl->MdlFlags & MDL_IO_PAGE_READ)) + { + return; + } + /* * FIXME: Seems sensible */ if (!(Mdl->MdlFlags & MDL_PAGES_LOCKED)) - { - return; - } - + { + return; + } + MdlPages = (PULONG)(Mdl + 1); for (i=0; i<(PAGE_ROUND_UP(Mdl->ByteCount+Mdl->ByteOffset)/PAGE_SIZE); i++) - { + { #if defined(__GNUC__) - MmUnlockPage((LARGE_INTEGER)(LONGLONG)MdlPages[i]); - MmDereferencePage((LARGE_INTEGER)(LONGLONG)MdlPages[i]); + MmUnlockPage((LARGE_INTEGER)(LONGLONG)MdlPages[i]); + MmDereferencePage((LARGE_INTEGER)(LONGLONG)MdlPages[i]); #else - PHYSICAL_ADDRESS dummyJunkNeeded; - dummyJunkNeeded.QuadPart = MdlPages[i]; - MmUnlockPage(dummyJunkNeeded); - MmDereferencePage(dummyJunkNeeded); + + PHYSICAL_ADDRESS dummyJunkNeeded; + dummyJunkNeeded.QuadPart = MdlPages[i]; + MmUnlockPage(dummyJunkNeeded); + MmDereferencePage(dummyJunkNeeded); #endif - } + + } Mdl->MdlFlags = Mdl->MdlFlags & (~MDL_PAGES_LOCKED); } @@ -157,103 +159,105 @@ MmMapLockedPages(PMDL Mdl, KPROCESSOR_MODE AccessMode) DPRINT("MmMapLockedPages(Mdl %x, AccessMode %x)\n", Mdl, AccessMode); if ((Mdl->MdlFlags & MDL_SOURCE_IS_NONPAGED_POOL) && AccessMode != UserMode) - { - return(Mdl->MappedSystemVa); - } + { + return(Mdl->MappedSystemVa); + } /* Calculate the number of pages required. */ RegionSize = PAGE_ROUND_UP(Mdl->ByteCount + Mdl->ByteOffset) / PAGE_SIZE; if (AccessMode == UserMode) - { - MEMORY_AREA *Result; - LARGE_INTEGER BoundaryAddressMultiple; - NTSTATUS Status; + { + MEMORY_AREA *Result; + LARGE_INTEGER BoundaryAddressMultiple; + NTSTATUS Status; - BoundaryAddressMultiple.QuadPart = 0; - Base = NULL; + BoundaryAddressMultiple.QuadPart = 0; + Base = NULL; - CurrentProcess = OldProcess = PsGetCurrentProcess(); - if (Mdl->Process != CurrentProcess) - { - KeAttachProcess(Mdl->Process); - CurrentProcess = Mdl->Process; - } + CurrentProcess = OldProcess = PsGetCurrentProcess(); + if (Mdl->Process != CurrentProcess) + { + KeAttachProcess(Mdl->Process); + CurrentProcess = Mdl->Process; + } - MmLockAddressSpace(&CurrentProcess->AddressSpace); - Status = MmCreateMemoryArea(CurrentProcess, - &CurrentProcess->AddressSpace, - MEMORY_AREA_MDL_MAPPING, - &Base, - RegionSize * PAGE_SIZE, - 0, /* PAGE_READWRITE? */ - &Result, - FALSE, - FALSE, - BoundaryAddressMultiple); - MmUnlockAddressSpace(&CurrentProcess->AddressSpace); - if (!NT_SUCCESS(Status)) - { - KEBUGCHECK(0); - /* FIXME: handle this? */ - } - } + MmLockAddressSpace(&CurrentProcess->AddressSpace); + Status = MmCreateMemoryArea(CurrentProcess, + &CurrentProcess->AddressSpace, + MEMORY_AREA_MDL_MAPPING, + &Base, + RegionSize * PAGE_SIZE, + 0, /* PAGE_READWRITE? */ + &Result, + FALSE, + FALSE, + BoundaryAddressMultiple); + MmUnlockAddressSpace(&CurrentProcess->AddressSpace); + if (!NT_SUCCESS(Status)) + { + KEBUGCHECK(0); + /* FIXME: handle this? */ + } + } else - { - CurrentProcess = OldProcess = NULL; + { + CurrentProcess = OldProcess = NULL; - /* Allocate that number of pages from the mdl mapping region. */ - KeAcquireSpinLock(&MiMdlMappingRegionLock, &oldIrql); + /* Allocate that number of pages from the mdl mapping region. */ + KeAcquireSpinLock(&MiMdlMappingRegionLock, &oldIrql); - StartingOffset = RtlFindClearBitsAndSet(&MiMdlMappingRegionAllocMap, RegionSize, MiMdlMappingRegionHint); + StartingOffset = RtlFindClearBitsAndSet(&MiMdlMappingRegionAllocMap, RegionSize, MiMdlMappingRegionHint); - if (StartingOffset == 0xffffffff) - { - DPRINT1("Out of MDL mapping space\n"); - KEBUGCHECK(0); - } + if (StartingOffset == 0xffffffff) + { + DPRINT1("Out of MDL mapping space\n"); + KEBUGCHECK(0); + } - Base = (char*)MiMdlMappingRegionBase + StartingOffset * PAGE_SIZE; + Base = (char*)MiMdlMappingRegionBase + StartingOffset * PAGE_SIZE; - if (MiMdlMappingRegionHint == StartingOffset) - { - MiMdlMappingRegionHint +=RegionSize; - } + if (MiMdlMappingRegionHint == StartingOffset) + { + MiMdlMappingRegionHint +=RegionSize; + } - KeReleaseSpinLock(&MiMdlMappingRegionLock, oldIrql); - } + KeReleaseSpinLock(&MiMdlMappingRegionLock, oldIrql); + } /* Set the virtual mappings for the MDL pages. */ MdlPages = (PULONG)(Mdl + 1); for (i = 0; i < RegionSize; i++) - { - NTSTATUS Status; + { + NTSTATUS Status; #if !defined(__GNUC__) - PHYSICAL_ADDRESS dummyJunkNeeded; - dummyJunkNeeded.QuadPart = MdlPages[i]; + + PHYSICAL_ADDRESS dummyJunkNeeded; + dummyJunkNeeded.QuadPart = MdlPages[i]; #endif - Status = MmCreateVirtualMapping(CurrentProcess, - (PVOID)((ULONG)Base+(i*PAGE_SIZE)), - PAGE_READWRITE, + + Status = MmCreateVirtualMapping(CurrentProcess, + (PVOID)((ULONG)Base+(i*PAGE_SIZE)), + PAGE_READWRITE, #if defined(__GNUC__) - (LARGE_INTEGER)(LONGLONG)MdlPages[i], + (LARGE_INTEGER)(LONGLONG)MdlPages[i], #else - dummyJunkNeeded, + dummyJunkNeeded, #endif - FALSE); - if (!NT_SUCCESS(Status)) - { - DbgPrint("Unable to create virtual mapping\n"); - KEBUGCHECK(0); - } - } + FALSE); + if (!NT_SUCCESS(Status)) + { + DbgPrint("Unable to create virtual mapping\n"); + KEBUGCHECK(0); + } + } if (AccessMode == UserMode && CurrentProcess != OldProcess) - { - KeDetachProcess(); - } + { + KeDetachProcess(); + } /* Mark the MDL has having being mapped. */ Mdl->MdlFlags = Mdl->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA; @@ -273,62 +277,64 @@ MmUnmapLockedPages(PVOID BaseAddress, PMDL Mdl) * MemoryDescriptorList = MDL describing the mapped pages */ { - KIRQL oldIrql; - ULONG i; - ULONG RegionSize; - ULONG Base; - PEPROCESS CurrentProcess, OldProcess; + KIRQL oldIrql; + ULONG i; + ULONG RegionSize; + ULONG Base; + PEPROCESS CurrentProcess, OldProcess; - DPRINT("MmUnmapLockedPages(BaseAddress %x, Mdl %x)\n", BaseAddress, Mdl); + DPRINT("MmUnmapLockedPages(BaseAddress %x, Mdl %x)\n", BaseAddress, Mdl); - /* - * In this case, the MDL has the same system address as the base address - * so there is no need to free it - */ - if ((Mdl->MdlFlags & MDL_SOURCE_IS_NONPAGED_POOL) && - ((ULONG_PTR)BaseAddress >= KERNEL_BASE)) - { + /* + * In this case, the MDL has the same system address as the base address + * so there is no need to free it + */ + if ((Mdl->MdlFlags & MDL_SOURCE_IS_NONPAGED_POOL) && + ((ULONG_PTR)BaseAddress >= KERNEL_BASE)) + { return; - } + } - if ((ULONG_PTR)BaseAddress >= KERNEL_BASE) - { + if ((ULONG_PTR)BaseAddress >= KERNEL_BASE) + { CurrentProcess = OldProcess = NULL; - } - else - { + } + else + { CurrentProcess = OldProcess = PsGetCurrentProcess(); if (Mdl->Process != CurrentProcess) - { - KeAttachProcess(Mdl->Process); - CurrentProcess = Mdl->Process; - } - } + { + KeAttachProcess(Mdl->Process); + CurrentProcess = Mdl->Process; + } + } - /* Calculate the number of pages we mapped. */ - RegionSize = PAGE_ROUND_UP(Mdl->ByteCount + Mdl->ByteOffset) / PAGE_SIZE; + /* Calculate the number of pages we mapped. */ + RegionSize = PAGE_ROUND_UP(Mdl->ByteCount + Mdl->ByteOffset) / PAGE_SIZE; #if defined(__GNUC__) - BaseAddress -= Mdl->ByteOffset; + + BaseAddress -= Mdl->ByteOffset; #else - { - char* pTemp = BaseAddress; - pTemp -= Mdl->ByteOffset; - BaseAddress = pTemp; - } + + { + char* pTemp = BaseAddress; + pTemp -= Mdl->ByteOffset; + BaseAddress = pTemp; + } #endif - /* Unmap all the pages. */ - for (i = 0; i < RegionSize; i++) - { + /* Unmap all the pages. */ + for (i = 0; i < RegionSize; i++) + { MmDeleteVirtualMapping(NULL, - (char*)BaseAddress + (i * PAGE_SIZE), - FALSE, - NULL, - NULL); - } + (char*)BaseAddress + (i * PAGE_SIZE), + FALSE, + NULL, + NULL); + } - if ((DWORD)BaseAddress >= KERNEL_BASE) - { + if ((DWORD)BaseAddress >= KERNEL_BASE) + { KeAcquireSpinLock(&MiMdlMappingRegionLock, &oldIrql); /* Deallocate all the pages used. */ Base = (ULONG)((char*)BaseAddress - (char*)MiMdlMappingRegionBase) / PAGE_SIZE; @@ -338,55 +344,55 @@ MmUnmapLockedPages(PVOID BaseAddress, PMDL Mdl) MiMdlMappingRegionHint = min (MiMdlMappingRegionHint, Base); KeReleaseSpinLock(&MiMdlMappingRegionLock, oldIrql); - } - else - { + } + else + { MEMORY_AREA *Marea; Marea = MmOpenMemoryAreaByAddress( &CurrentProcess->AddressSpace, BaseAddress ); if (Marea == NULL) - { - DPRINT1( "Couldn't open memory area when unmapping user-space pages!\n" ); - KEBUGCHECK(0); - } + { + DPRINT1( "Couldn't open memory area when unmapping user-space pages!\n" ); + KEBUGCHECK(0); + } MmFreeMemoryArea( &CurrentProcess->AddressSpace, Marea->BaseAddress, 0, NULL, NULL ); if (CurrentProcess != OldProcess) - { - KeDetachProcess(); - } - } + { + KeDetachProcess(); + } + } - /* Reset the MDL state. */ - Mdl->MdlFlags = Mdl->MdlFlags & ~MDL_MAPPED_TO_SYSTEM_VA; - Mdl->MappedSystemVa = NULL; + /* Reset the MDL state. */ + Mdl->MdlFlags = Mdl->MdlFlags & ~MDL_MAPPED_TO_SYSTEM_VA; + Mdl->MappedSystemVa = NULL; } -VOID +VOID MmBuildMdlFromPages(PMDL Mdl, PULONG Pages) { ULONG i; PULONG MdlPages; - - Mdl->MdlFlags = Mdl->MdlFlags | - (MDL_PAGES_LOCKED | MDL_IO_PAGE_READ); - + + Mdl->MdlFlags = Mdl->MdlFlags | + (MDL_PAGES_LOCKED | MDL_IO_PAGE_READ); + MdlPages = (PULONG)(Mdl + 1); - + for (i=0;i<(PAGE_ROUND_UP(Mdl->ByteOffset+Mdl->ByteCount)/PAGE_SIZE);i++) - { - MdlPages[i] = Pages[i]; - } + { + MdlPages[i] = Pages[i]; + } } /* * @unimplemented */ VOID STDCALL MmProbeAndLockPages (PMDL Mdl, - KPROCESSOR_MODE AccessMode, - LOCK_OPERATION Operation) + KPROCESSOR_MODE AccessMode, + LOCK_OPERATION Operation) /* * FUNCTION: Probes the specified pages, makes them resident and locks them * ARGUMENTS: @@ -403,106 +409,113 @@ VOID STDCALL MmProbeAndLockPages (PMDL Mdl, PEPROCESS CurrentProcess = NULL; DPRINT("MmProbeAndLockPages(Mdl %x)\n", Mdl); - + /* * FIXME: Check behaviour against NT */ if (Mdl->MdlFlags & MDL_PAGES_LOCKED) - { - return; - } - + { + return; + } + if (Mdl->StartVa >= (PVOID)KERNEL_BASE) - { - Mode = KernelMode; - } + { + Mode = KernelMode; + } else - { - Mode = UserMode; - CurrentProcess = PsGetCurrentProcess(); - if (Mdl->Process != CurrentProcess) - { - KeAttachProcess(Mdl->Process); - } - } + { + Mode = UserMode; + CurrentProcess = PsGetCurrentProcess(); + if (Mdl->Process != CurrentProcess) + { + KeAttachProcess(Mdl->Process); + } + } /* * Lock the pages */ MmLockAddressSpace(&Mdl->Process->AddressSpace); - MdlPages = (ULONG *)(Mdl + 1); + MdlPages = (ULONG *)(Mdl + 1); NrPages = PAGE_ROUND_UP(Mdl->ByteOffset + Mdl->ByteCount) / PAGE_SIZE; for (i = 0; i < NrPages; i++) - { - PVOID Address; - - Address = (char*)Mdl->StartVa + (i*PAGE_SIZE); - - if (!MmIsPagePresent(NULL, Address)) - { - Status = MmNotPresentFault(Mode, (ULONG)Address, TRUE); - if (!NT_SUCCESS(Status)) - { - for (j = 0; j < i; j++) - { + { + PVOID Address; + + Address = (char*)Mdl->StartVa + (i*PAGE_SIZE); + + if (!MmIsPagePresent(NULL, Address)) + { + Status = MmNotPresentFault(Mode, (ULONG)Address, TRUE); + if (!NT_SUCCESS(Status)) + { + for (j = 0; j < i; j++) + { #if defined(__GNUC__) - MmUnlockPage((LARGE_INTEGER)(LONGLONG)MdlPages[j]); - MmDereferencePage((LARGE_INTEGER)(LONGLONG)MdlPages[j]); + MmUnlockPage((LARGE_INTEGER)(LONGLONG)MdlPages[j]); + MmDereferencePage((LARGE_INTEGER)(LONGLONG)MdlPages[j]); #else - PHYSICAL_ADDRESS dummyJunkNeeded; - dummyJunkNeeded.QuadPart = MdlPages[j]; - MmUnlockPage(dummyJunkNeeded); - MmDereferencePage(dummyJunkNeeded); + + PHYSICAL_ADDRESS dummyJunkNeeded; + dummyJunkNeeded.QuadPart = MdlPages[j]; + MmUnlockPage(dummyJunkNeeded); + MmDereferencePage(dummyJunkNeeded); #endif - } - ExRaiseStatus(Status); - } - } - else - { - MmLockPage(MmGetPhysicalAddressForProcess(NULL, Address)); - } - if ((Operation == IoWriteAccess || Operation == IoModifyAccess) && - (!(MmGetPageProtect(NULL, (PVOID)Address) & PAGE_READWRITE))) - { - Status = MmAccessFault(Mode, (ULONG)Address, TRUE); - if (!NT_SUCCESS(Status)) - { - for (j = 0; j < i; j++) - { + + } + ExRaiseStatus(Status); + } + } + else + { + MmLockPage(MmGetPhysicalAddressForProcess(NULL, Address)); + } + if ((Operation == IoWriteAccess || Operation == IoModifyAccess) && + (!(MmGetPageProtect(NULL, (PVOID)Address) & PAGE_READWRITE))) + { + Status = MmAccessFault(Mode, (ULONG)Address, TRUE); + if (!NT_SUCCESS(Status)) + { + for (j = 0; j < i; j++) + { #if defined(__GNUC__) - MmUnlockPage((LARGE_INTEGER)(LONGLONG)MdlPages[j]); - MmDereferencePage( - (LARGE_INTEGER)(LONGLONG)MdlPages[j]); + MmUnlockPage((LARGE_INTEGER)(LONGLONG)MdlPages[j]); + MmDereferencePage( + (LARGE_INTEGER)(LONGLONG)MdlPages[j]); #else - PHYSICAL_ADDRESS dummyJunkNeeded; - dummyJunkNeeded.QuadPart = MdlPages[j]; - MmUnlockPage(dummyJunkNeeded); - MmDereferencePage(dummyJunkNeeded); + + PHYSICAL_ADDRESS dummyJunkNeeded; + dummyJunkNeeded.QuadPart = MdlPages[j]; + MmUnlockPage(dummyJunkNeeded); + MmDereferencePage(dummyJunkNeeded); #endif - } - ExRaiseStatus(Status); - } - } - MdlPages[i] = MmGetPhysicalAddressForProcess(NULL, Address).u.LowPart; + + } + ExRaiseStatus(Status); + } + } + MdlPages[i] = MmGetPhysicalAddressForProcess(NULL, Address).u.LowPart; #if defined(__GNUC__) - MmReferencePage((LARGE_INTEGER)(LONGLONG)MdlPages[i]); + + MmReferencePage((LARGE_INTEGER)(LONGLONG)MdlPages[i]); #else - { - PHYSICAL_ADDRESS dummyJunkNeeded; - dummyJunkNeeded.QuadPart = MdlPages[i]; - MmReferencePage(dummyJunkNeeded); - } + + { + PHYSICAL_ADDRESS dummyJunkNeeded; + dummyJunkNeeded.QuadPart = MdlPages[i]; + MmReferencePage(dummyJunkNeeded); + } #endif - } + + } MmUnlockAddressSpace(&Mdl->Process->AddressSpace); if (Mode == UserMode && Mdl->Process != CurrentProcess) - { - KeDetachProcess(); - } + { + KeDetachProcess(); + } Mdl->MdlFlags = Mdl->MdlFlags | MDL_PAGES_LOCKED; } @@ -510,8 +523,8 @@ VOID STDCALL MmProbeAndLockPages (PMDL Mdl, /* * @implemented */ -ULONG STDCALL MmSizeOfMdl (PVOID Base, - ULONG Length) +ULONG STDCALL MmSizeOfMdl (PVOID Base, + ULONG Length) /* * FUNCTION: Returns the number of bytes to allocate for an MDL describing * the given address range @@ -521,9 +534,9 @@ ULONG STDCALL MmSizeOfMdl (PVOID Base, */ { ULONG len; - + len = ADDRESS_AND_SIZE_TO_SPAN_PAGES(Base,Length); - + return(sizeof(MDL)+(len*sizeof(ULONG))); } @@ -531,8 +544,8 @@ ULONG STDCALL MmSizeOfMdl (PVOID Base, /* * @implemented */ -VOID STDCALL -MmBuildMdlForNonPagedPool (PMDL Mdl) +VOID STDCALL +MmBuildMdlForNonPagedPool (PMDL Mdl) /* * FUNCTION: Fills in the corresponding physical page array of a given * MDL for a buffer in nonpaged system space @@ -542,13 +555,13 @@ MmBuildMdlForNonPagedPool (PMDL Mdl) */ { ULONG va; - Mdl->MdlFlags = Mdl->MdlFlags | - (MDL_SOURCE_IS_NONPAGED_POOL | MDL_PAGES_LOCKED); + Mdl->MdlFlags = Mdl->MdlFlags | + (MDL_SOURCE_IS_NONPAGED_POOL | MDL_PAGES_LOCKED); for (va=0; va < ((Mdl->Size - sizeof(MDL)) / sizeof(ULONG)); va++) - { - ((PULONG)(Mdl + 1))[va] = - (MmGetPhysicalAddress((char*)Mdl->StartVa + (va * PAGE_SIZE))).u.LowPart; - } + { + ((PULONG)(Mdl + 1))[va] = + (MmGetPhysicalAddress((char*)Mdl->StartVa + (va * PAGE_SIZE))).u.LowPart; + } Mdl->MappedSystemVa = (char*)Mdl->StartVa + Mdl->ByteOffset; } @@ -556,10 +569,10 @@ MmBuildMdlForNonPagedPool (PMDL Mdl) /* * @implemented */ -PMDL STDCALL -MmCreateMdl (PMDL MemoryDescriptorList, - PVOID Base, - ULONG Length) +PMDL STDCALL +MmCreateMdl (PMDL MemoryDescriptorList, + PVOID Base, + ULONG Length) /* * FUNCTION: Allocates and initalizes an MDL * ARGUMENTS: @@ -571,17 +584,17 @@ MmCreateMdl (PMDL MemoryDescriptorList, */ { if (MemoryDescriptorList == NULL) - { - ULONG Size; - - Size = MmSizeOfMdl(Base,Length); - MemoryDescriptorList = - (PMDL)ExAllocatePoolWithTag(NonPagedPool, Size, TAG_MDL); - if (MemoryDescriptorList == NULL) - { - return(NULL); - } - } + { + ULONG Size; + + Size = MmSizeOfMdl(Base,Length); + MemoryDescriptorList = + (PMDL)ExAllocatePoolWithTag(NonPagedPool, Size, TAG_MDL); + if (MemoryDescriptorList == NULL) + { + return(NULL); + } + } MmInitializeMdl(MemoryDescriptorList, (char*)Base, Length); @@ -591,8 +604,8 @@ MmCreateMdl (PMDL MemoryDescriptorList, /* * @unimplemented */ -VOID STDCALL -MmMapMemoryDumpMdl (PVOID Unknown0) +VOID STDCALL +MmMapMemoryDumpMdl (PVOID Unknown0) /* * FIXME: Has something to do with crash dumps. Do we want to implement * this? @@ -603,30 +616,30 @@ MmMapMemoryDumpMdl (PVOID Unknown0) PMDL STDCALL MmAllocatePagesForMdl ( IN PHYSICAL_ADDRESS LowAddress, - IN PHYSICAL_ADDRESS HighAddress, - IN PHYSICAL_ADDRESS SkipBytes, - IN SIZE_T Totalbytes ) + IN PHYSICAL_ADDRESS HighAddress, + IN PHYSICAL_ADDRESS SkipBytes, + IN SIZE_T Totalbytes ) { - DPRINT1("MmAllocatePagesForMdl(): Unimplemented.\n"); - return(NULL); + DPRINT1("MmAllocatePagesForMdl(): Unimplemented.\n"); + return(NULL); } VOID STDCALL MmFreePagesFromMdl ( IN PMDL Mdl ) { - DPRINT1("MmFreePagesFromMdl(): Unimplemented.\n"); + DPRINT1("MmFreePagesFromMdl(): Unimplemented.\n"); } PVOID STDCALL MmMapLockedPagesSpecifyCache ( IN PMDL Mdl, - IN KPROCESSOR_MODE AccessMode, - IN MEMORY_CACHING_TYPE CacheType, - IN PVOID BaseAddress, - IN ULONG BugCheckOnFailure, - IN ULONG Priority ) + IN KPROCESSOR_MODE AccessMode, + IN MEMORY_CACHING_TYPE CacheType, + IN PVOID BaseAddress, + IN ULONG BugCheckOnFailure, + IN ULONG Priority ) { - DPRINT1("MmMapLockedPagesSpecifyCache(): Ignoring extra parameters.\n"); - return MmMapLockedPages (Mdl, AccessMode); + DPRINT1("MmMapLockedPagesSpecifyCache(): Ignoring extra parameters.\n"); + return MmMapLockedPages (Mdl, AccessMode); } /* EOF */ diff --git a/reactos/ntoskrnl/mm/mm.c b/reactos/ntoskrnl/mm/mm.c index b843e5bedbf..a9f453080f2 100644 --- a/reactos/ntoskrnl/mm/mm.c +++ b/reactos/ntoskrnl/mm/mm.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: mm.c,v 1.72 2004/04/08 20:49:15 jfilby Exp $ +/* $Id: mm.c,v 1.73 2004/04/10 22:35:25 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top directory * PROJECT: ReactOS kernel @@ -53,41 +53,41 @@ MM_STATS MmStats; NTSTATUS MmReleaseMemoryArea(PEPROCESS Process, PMEMORY_AREA Marea) { NTSTATUS Status; - + DPRINT("MmReleaseMemoryArea(Process %x, Marea %x)\n",Process,Marea); - + DPRINT("Releasing %x between %x %x (type %d)\n", - Marea, Marea->BaseAddress, (char*)Marea->BaseAddress + Marea->Length, - Marea->Type); - + Marea, Marea->BaseAddress, (char*)Marea->BaseAddress + Marea->Length, + Marea->Type); + switch (Marea->Type) - { - case MEMORY_AREA_SECTION_VIEW: - Status = MmUnmapViewOfSection(Process, Marea->BaseAddress); - assert(Status == STATUS_SUCCESS); - return(STATUS_SUCCESS); + { + case MEMORY_AREA_SECTION_VIEW: + Status = MmUnmapViewOfSection(Process, Marea->BaseAddress); + assert(Status == STATUS_SUCCESS); + return(STATUS_SUCCESS); - case MEMORY_AREA_VIRTUAL_MEMORY: - MmFreeVirtualMemory(Process, Marea); - break; + case MEMORY_AREA_VIRTUAL_MEMORY: + MmFreeVirtualMemory(Process, Marea); + break; - case MEMORY_AREA_SHARED_DATA: - case MEMORY_AREA_NO_ACCESS: - Status = MmFreeMemoryArea(&Process->AddressSpace, - Marea->BaseAddress, - 0, - NULL, - NULL); - break; + case MEMORY_AREA_SHARED_DATA: + case MEMORY_AREA_NO_ACCESS: + Status = MmFreeMemoryArea(&Process->AddressSpace, + Marea->BaseAddress, + 0, + NULL, + NULL); + break; - case MEMORY_AREA_MDL_MAPPING: - KEBUGCHECK(PROCESS_HAS_LOCKED_PAGES); - break; + case MEMORY_AREA_MDL_MAPPING: + KEBUGCHECK(PROCESS_HAS_LOCKED_PAGES); + break; + + default: + KEBUGCHECK(0); + } - default: - KEBUGCHECK(0); - } - return(STATUS_SUCCESS); } @@ -95,24 +95,24 @@ NTSTATUS MmReleaseMmInfo(PEPROCESS Process) { PLIST_ENTRY CurrentEntry; PMEMORY_AREA Current; - + DPRINT("MmReleaseMmInfo(Process %x (%s))\n", Process, - Process->ImageFileName); - + Process->ImageFileName); + MmLockAddressSpace(&Process->AddressSpace); while(!IsListEmpty(&Process->AddressSpace.MAreaListHead)) - { - CurrentEntry = Process->AddressSpace.MAreaListHead.Flink; - Current = CONTAINING_RECORD(CurrentEntry, MEMORY_AREA, Entry); - MmReleaseMemoryArea(Process, Current); - } - + { + CurrentEntry = Process->AddressSpace.MAreaListHead.Flink; + Current = CONTAINING_RECORD(CurrentEntry, MEMORY_AREA, Entry); + MmReleaseMemoryArea(Process, Current); + } + Mmi386ReleaseMmInfo(Process); - + MmUnlockAddressSpace(&Process->AddressSpace); MmDestroyAddressSpace(&Process->AddressSpace); - + DPRINT("Finished MmReleaseMmInfo()\n"); return(STATUS_SUCCESS); } @@ -142,282 +142,282 @@ BOOLEAN STDCALL MmIsAddressValid(PVOID VirtualAddress) { MEMORY_AREA* MemoryArea; PMADDRESS_SPACE AddressSpace; - + if ((ULONG)VirtualAddress >= KERNEL_BASE) - { - AddressSpace = MmGetKernelAddressSpace(); - } + { + AddressSpace = MmGetKernelAddressSpace(); + } else - { - AddressSpace = &PsGetCurrentProcess()->AddressSpace; - } - + { + AddressSpace = &PsGetCurrentProcess()->AddressSpace; + } + MmLockAddressSpace(AddressSpace); MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace, - VirtualAddress); - + VirtualAddress); + if (MemoryArea == NULL || MemoryArea->DeleteInProgress) - { - MmUnlockAddressSpace(AddressSpace); - return(FALSE); - } + { + MmUnlockAddressSpace(AddressSpace); + return(FALSE); + } MmUnlockAddressSpace(AddressSpace); return(TRUE); } NTSTATUS MmAccessFault(KPROCESSOR_MODE Mode, - ULONG Address, - BOOLEAN FromMdl) + ULONG Address, + BOOLEAN FromMdl) { PMADDRESS_SPACE AddressSpace; MEMORY_AREA* MemoryArea; NTSTATUS Status; BOOLEAN Locked = FromMdl; - + DPRINT("MmAccessFault(Mode %d, Address %x)\n", Mode, Address); - + if (KeGetCurrentIrql() >= DISPATCH_LEVEL) - { - DbgPrint("Page fault at high IRQL was %d\n", KeGetCurrentIrql()); - return(STATUS_UNSUCCESSFUL); - } + { + DbgPrint("Page fault at high IRQL was %d\n", KeGetCurrentIrql()); + return(STATUS_UNSUCCESSFUL); + } if (PsGetCurrentProcess() == NULL) - { - DbgPrint("No current process\n"); - return(STATUS_UNSUCCESSFUL); - } - + { + DbgPrint("No current process\n"); + return(STATUS_UNSUCCESSFUL); + } + /* * Find the memory area for the faulting address */ if (Address >= KERNEL_BASE) - { - /* - * Check permissions - */ - if (Mode != KernelMode) - { - DbgPrint("%s:%d\n",__FILE__,__LINE__); - return(STATUS_UNSUCCESSFUL); - } - AddressSpace = MmGetKernelAddressSpace(); - } + { + /* + * Check permissions + */ + if (Mode != KernelMode) + { + DbgPrint("%s:%d\n",__FILE__,__LINE__); + return(STATUS_UNSUCCESSFUL); + } + AddressSpace = MmGetKernelAddressSpace(); + } else - { - AddressSpace = &PsGetCurrentProcess()->AddressSpace; - } - + { + AddressSpace = &PsGetCurrentProcess()->AddressSpace; + } + if (!FromMdl) - { - MmLockAddressSpace(AddressSpace); - } + { + MmLockAddressSpace(AddressSpace); + } do - { - MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace, (PVOID)Address); - if (MemoryArea == NULL || MemoryArea->DeleteInProgress) - { - if (!FromMdl) - { - MmUnlockAddressSpace(AddressSpace); - } - return (STATUS_UNSUCCESSFUL); - } - - switch (MemoryArea->Type) - { - case MEMORY_AREA_SYSTEM: - Status = STATUS_UNSUCCESSFUL; - break; + { + MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace, (PVOID)Address); + if (MemoryArea == NULL || MemoryArea->DeleteInProgress) + { + if (!FromMdl) + { + MmUnlockAddressSpace(AddressSpace); + } + return (STATUS_UNSUCCESSFUL); + } - case MEMORY_AREA_PAGED_POOL: - Status = STATUS_SUCCESS; - break; + switch (MemoryArea->Type) + { + case MEMORY_AREA_SYSTEM: + Status = STATUS_UNSUCCESSFUL; + break; - case MEMORY_AREA_SECTION_VIEW: - Status = MmAccessFaultSectionView(AddressSpace, - MemoryArea, - (PVOID)Address, - Locked); - break; + case MEMORY_AREA_PAGED_POOL: + Status = STATUS_SUCCESS; + break; - case MEMORY_AREA_VIRTUAL_MEMORY: - Status = STATUS_UNSUCCESSFUL; - break; + case MEMORY_AREA_SECTION_VIEW: + Status = MmAccessFaultSectionView(AddressSpace, + MemoryArea, + (PVOID)Address, + Locked); + break; - case MEMORY_AREA_SHARED_DATA: - Status = STATUS_UNSUCCESSFUL; - break; + case MEMORY_AREA_VIRTUAL_MEMORY: + Status = STATUS_UNSUCCESSFUL; + break; - default: - Status = STATUS_UNSUCCESSFUL; - break; - } - } + case MEMORY_AREA_SHARED_DATA: + Status = STATUS_UNSUCCESSFUL; + break; + + default: + Status = STATUS_UNSUCCESSFUL; + break; + } + } while (Status == STATUS_MM_RESTART_OPERATION); DPRINT("Completed page fault handling\n"); if (!FromMdl) - { - MmUnlockAddressSpace(AddressSpace); - } + { + MmUnlockAddressSpace(AddressSpace); + } return(Status); } NTSTATUS MmCommitPagedPoolAddress(PVOID Address, BOOLEAN Locked) { - NTSTATUS Status; - PHYSICAL_ADDRESS AllocatedPage; - Status = MmRequestPageMemoryConsumer(MC_PPOOL, FALSE, &AllocatedPage); - if (!NT_SUCCESS(Status)) - { + NTSTATUS Status; + PHYSICAL_ADDRESS AllocatedPage; + Status = MmRequestPageMemoryConsumer(MC_PPOOL, FALSE, &AllocatedPage); + if (!NT_SUCCESS(Status)) + { MmUnlockAddressSpace(MmGetKernelAddressSpace()); Status = MmRequestPageMemoryConsumer(MC_PPOOL, TRUE, &AllocatedPage); MmLockAddressSpace(MmGetKernelAddressSpace()); - } - Status = - MmCreateVirtualMapping(NULL, - (PVOID)PAGE_ROUND_DOWN(Address), - PAGE_READWRITE, - AllocatedPage, - FALSE); - if (!NT_SUCCESS(Status)) - { + } + Status = + MmCreateVirtualMapping(NULL, + (PVOID)PAGE_ROUND_DOWN(Address), + PAGE_READWRITE, + AllocatedPage, + FALSE); + if (!NT_SUCCESS(Status)) + { MmUnlockAddressSpace(MmGetKernelAddressSpace()); - Status = - MmCreateVirtualMapping(NULL, - (PVOID)PAGE_ROUND_DOWN(Address), - PAGE_READWRITE, - AllocatedPage, - FALSE); + Status = + MmCreateVirtualMapping(NULL, + (PVOID)PAGE_ROUND_DOWN(Address), + PAGE_READWRITE, + AllocatedPage, + FALSE); MmLockAddressSpace(MmGetKernelAddressSpace()); - } - if (Locked) - { + } + if (Locked) + { MmLockPage(AllocatedPage); - } - return(Status); + } + return(Status); } NTSTATUS MmNotPresentFault(KPROCESSOR_MODE Mode, - ULONG Address, - BOOLEAN FromMdl) + ULONG Address, + BOOLEAN FromMdl) { PMADDRESS_SPACE AddressSpace; MEMORY_AREA* MemoryArea; NTSTATUS Status; BOOLEAN Locked = FromMdl; - + DPRINT("MmNotPresentFault(Mode %d, Address %x)\n", Mode, Address); - + if (KeGetCurrentIrql() >= DISPATCH_LEVEL) - { - DbgPrint("Page fault at high IRQL was %d\n", KeGetCurrentIrql()); - return(STATUS_UNSUCCESSFUL); - } + { + DbgPrint("Page fault at high IRQL was %d\n", KeGetCurrentIrql()); + return(STATUS_UNSUCCESSFUL); + } if (PsGetCurrentProcess() == NULL) - { - DbgPrint("No current process\n"); - return(STATUS_UNSUCCESSFUL); - } - + { + DbgPrint("No current process\n"); + return(STATUS_UNSUCCESSFUL); + } + /* * Find the memory area for the faulting address */ if (Address >= KERNEL_BASE) - { - /* - * Check permissions - */ - if (Mode != KernelMode) - { - DbgPrint("%s:%d\n",__FILE__,__LINE__); - return(STATUS_UNSUCCESSFUL); - } - AddressSpace = MmGetKernelAddressSpace(); - } + { + /* + * Check permissions + */ + if (Mode != KernelMode) + { + DbgPrint("%s:%d\n",__FILE__,__LINE__); + return(STATUS_UNSUCCESSFUL); + } + AddressSpace = MmGetKernelAddressSpace(); + } else - { - AddressSpace = &PsGetCurrentProcess()->AddressSpace; - } - + { + AddressSpace = &PsGetCurrentProcess()->AddressSpace; + } + if (!FromMdl) - { - MmLockAddressSpace(AddressSpace); - } + { + MmLockAddressSpace(AddressSpace); + } /* * Call the memory area specific fault handler */ do - { - MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace, (PVOID)Address); - if (MemoryArea == NULL || MemoryArea->DeleteInProgress) - { - if (!FromMdl) - { - MmUnlockAddressSpace(AddressSpace); - } - return (STATUS_UNSUCCESSFUL); - } + { + MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace, (PVOID)Address); + if (MemoryArea == NULL || MemoryArea->DeleteInProgress) + { + if (!FromMdl) + { + MmUnlockAddressSpace(AddressSpace); + } + return (STATUS_UNSUCCESSFUL); + } - switch (MemoryArea->Type) - { - case MEMORY_AREA_PAGED_POOL: - { - Status = MmCommitPagedPoolAddress((PVOID)Address, Locked); - break; - } + switch (MemoryArea->Type) + { + case MEMORY_AREA_PAGED_POOL: + { + Status = MmCommitPagedPoolAddress((PVOID)Address, Locked); + break; + } - case MEMORY_AREA_SYSTEM: - Status = STATUS_UNSUCCESSFUL; - break; - - case MEMORY_AREA_SECTION_VIEW: - Status = MmNotPresentFaultSectionView(AddressSpace, - MemoryArea, - (PVOID)Address, - Locked); - break; - - case MEMORY_AREA_VIRTUAL_MEMORY: - Status = MmNotPresentFaultVirtualMemory(AddressSpace, - MemoryArea, - (PVOID)Address, - Locked); - break; - - case MEMORY_AREA_SHARED_DATA: - Status = - MmCreateVirtualMapping(PsGetCurrentProcess(), - (PVOID)PAGE_ROUND_DOWN(Address), - PAGE_READONLY, - MmSharedDataPagePhysicalAddress, - FALSE); - if (!NT_SUCCESS(Status)) - { - MmUnlockAddressSpace(&PsGetCurrentProcess()->AddressSpace); - Status = - MmCreateVirtualMapping(PsGetCurrentProcess(), - (PVOID)PAGE_ROUND_DOWN(Address), - PAGE_READONLY, - MmSharedDataPagePhysicalAddress, - TRUE); - MmLockAddressSpace(&PsGetCurrentProcess()->AddressSpace); - } - break; - - default: - Status = STATUS_UNSUCCESSFUL; - break; - } - } + case MEMORY_AREA_SYSTEM: + Status = STATUS_UNSUCCESSFUL; + break; + + case MEMORY_AREA_SECTION_VIEW: + Status = MmNotPresentFaultSectionView(AddressSpace, + MemoryArea, + (PVOID)Address, + Locked); + break; + + case MEMORY_AREA_VIRTUAL_MEMORY: + Status = MmNotPresentFaultVirtualMemory(AddressSpace, + MemoryArea, + (PVOID)Address, + Locked); + break; + + case MEMORY_AREA_SHARED_DATA: + Status = + MmCreateVirtualMapping(PsGetCurrentProcess(), + (PVOID)PAGE_ROUND_DOWN(Address), + PAGE_READONLY, + MmSharedDataPagePhysicalAddress, + FALSE); + if (!NT_SUCCESS(Status)) + { + MmUnlockAddressSpace(&PsGetCurrentProcess()->AddressSpace); + Status = + MmCreateVirtualMapping(PsGetCurrentProcess(), + (PVOID)PAGE_ROUND_DOWN(Address), + PAGE_READONLY, + MmSharedDataPagePhysicalAddress, + TRUE); + MmLockAddressSpace(&PsGetCurrentProcess()->AddressSpace); + } + break; + + default: + Status = STATUS_UNSUCCESSFUL; + break; + } + } while (Status == STATUS_MM_RESTART_OPERATION); DPRINT("Completed page fault handling\n"); if (!FromMdl) - { - MmUnlockAddressSpace(AddressSpace); - } + { + MmUnlockAddressSpace(AddressSpace); + } return(Status); } @@ -427,24 +427,24 @@ NTSTATUS MmNotPresentFault(KPROCESSOR_MODE Mode, * @unimplemented */ DWORD STDCALL -MmAdjustWorkingSetSize (DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2) +MmAdjustWorkingSetSize (DWORD Unknown0, + DWORD Unknown1, + DWORD Unknown2) { - UNIMPLEMENTED; - return (0); + UNIMPLEMENTED; + return (0); } DWORD STDCALL MmDbgTranslatePhysicalAddress ( - DWORD Unknown0, - DWORD Unknown1 - ) + DWORD Unknown0, + DWORD Unknown1 +) { - UNIMPLEMENTED; - return (0); + UNIMPLEMENTED; + return (0); } @@ -454,11 +454,11 @@ MmDbgTranslatePhysicalAddress ( NTSTATUS STDCALL MmGrowKernelStack ( - DWORD Unknown0 - ) + DWORD Unknown0 +) { - UNIMPLEMENTED; - return (STATUS_NOT_IMPLEMENTED); + UNIMPLEMENTED; + return (STATUS_NOT_IMPLEMENTED); } @@ -468,12 +468,12 @@ MmGrowKernelStack ( BOOLEAN STDCALL MmSetAddressRangeModified ( - DWORD Unknown0, - DWORD Unknown1 - ) + DWORD Unknown0, + DWORD Unknown1 +) { - UNIMPLEMENTED; - return (FALSE); + UNIMPLEMENTED; + return (FALSE); } /* EOF */ diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 10e43f6bf0a..ddc238d04d4 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -1,4 +1,4 @@ -/* $Id: mminit.c,v 1.62 2004/03/16 22:45:56 dwelch Exp $ +/* $Id: mminit.c,v 1.63 2004/04/10 22:35:25 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top directory * PROJECT: ReactOS kernel @@ -48,7 +48,7 @@ static MEMORY_AREA* kernel_data_desc = NULL; static MEMORY_AREA* kernel_param_desc = NULL; static MEMORY_AREA* kernel_pool_desc = NULL; static MEMORY_AREA* kernel_shared_data_desc = NULL; -static MEMORY_AREA* kernel_mapped_vga_framebuffer_desc = NULL; +static MEMORY_AREA* kernel_mapped_vga_framebuffer_desc = NULL; static MEMORY_AREA* MiKernelMapDescriptor = NULL; static MEMORY_AREA* MiPagedPoolDescriptor = NULL; @@ -78,12 +78,11 @@ MM_SYSTEM_SIZE STDCALL MmQuerySystemSize(VOID) } VOID MiShutdownMemoryManager(VOID) -{ -} +{} VOID INIT_FUNCTION MmInitVirtualMemory(ULONG LastKernelAddress, - ULONG KernelLength) + ULONG KernelLength) /* * FUNCTION: Intialize the memory areas list * ARGUMENTS: @@ -97,9 +96,9 @@ MmInitVirtualMemory(ULONG LastKernelAddress, NTSTATUS Status; PHYSICAL_ADDRESS BoundaryAddressMultiple; //ULONG i; - + DPRINT("MmInitVirtualMemory(%x, %x)\n",LastKernelAddress, KernelLength); - + BoundaryAddressMultiple.QuadPart = 0; LastKernelAddress = PAGE_ROUND_UP(LastKernelAddress); @@ -124,58 +123,58 @@ MmInitVirtualMemory(ULONG LastKernelAddress, */ BaseAddress = (PVOID)0xf0000000; MmCreateMemoryArea(NULL, - MmGetKernelAddressSpace(), - MEMORY_AREA_SYSTEM, - &BaseAddress, - 0x400000, - 0, - &kernel_map_desc, - FALSE, - FALSE, - BoundaryAddressMultiple); + MmGetKernelAddressSpace(), + MEMORY_AREA_SYSTEM, + &BaseAddress, + 0x400000, + 0, + &kernel_map_desc, + FALSE, + FALSE, + BoundaryAddressMultiple); BaseAddress = (PVOID)KPCR_BASE; MmCreateMemoryArea(NULL, - MmGetKernelAddressSpace(), - MEMORY_AREA_SYSTEM, - &BaseAddress, - PAGE_SIZE * MAXIMUM_PROCESSORS, - 0, - &kernel_kpcr_desc, - FALSE, - FALSE, - BoundaryAddressMultiple); + MmGetKernelAddressSpace(), + MEMORY_AREA_SYSTEM, + &BaseAddress, + PAGE_SIZE * MAXIMUM_PROCESSORS, + 0, + &kernel_kpcr_desc, + FALSE, + FALSE, + BoundaryAddressMultiple); BaseAddress = (PVOID)0xFF3A0000; MmCreateMemoryArea(NULL, - MmGetKernelAddressSpace(), - MEMORY_AREA_SYSTEM, - &BaseAddress, - 0x20000, - 0, - &kernel_mapped_vga_framebuffer_desc, - FALSE, - FALSE, - BoundaryAddressMultiple); + MmGetKernelAddressSpace(), + MEMORY_AREA_SYSTEM, + &BaseAddress, + 0x20000, + 0, + &kernel_mapped_vga_framebuffer_desc, + FALSE, + FALSE, + BoundaryAddressMultiple); BaseAddress = (PVOID)KERNEL_BASE; Length = PAGE_ROUND_UP(((ULONG)&_text_end__)) - KERNEL_BASE; ParamLength = ParamLength - Length; - + /* * No need to lock the address space at this point since no * other threads are running. */ MmCreateMemoryArea(NULL, - MmGetKernelAddressSpace(), - MEMORY_AREA_SYSTEM, - &BaseAddress, - Length, - 0, - &kernel_text_desc, - FALSE, - FALSE, - BoundaryAddressMultiple); + MmGetKernelAddressSpace(), + MEMORY_AREA_SYSTEM, + &BaseAddress, + Length, + 0, + &kernel_text_desc, + FALSE, + FALSE, + BoundaryAddressMultiple); BaseAddress = (PVOID)PAGE_ROUND_UP(((ULONG)&_text_end__)); assert (BaseAddress == (PVOID)&_init_start__); @@ -184,17 +183,17 @@ MmInitVirtualMemory(ULONG LastKernelAddress, ParamLength = ParamLength - Length; MmCreateMemoryArea(NULL, - MmGetKernelAddressSpace(), - MEMORY_AREA_SYSTEM, - &BaseAddress, - Length, - 0, - &kernel_init_desc, - FALSE, - FALSE, - BoundaryAddressMultiple); + MmGetKernelAddressSpace(), + MEMORY_AREA_SYSTEM, + &BaseAddress, + Length, + 0, + &kernel_init_desc, + FALSE, + FALSE, + BoundaryAddressMultiple); - Length = PAGE_ROUND_UP(((ULONG)&_bss_end__)) - + Length = PAGE_ROUND_UP(((ULONG)&_bss_end__)) - PAGE_ROUND_UP(((ULONG)&_init_end__)); ParamLength = ParamLength - Length; DPRINT("Length %x\n",Length); @@ -206,64 +205,64 @@ MmInitVirtualMemory(ULONG LastKernelAddress, * the only thread running. */ MmCreateMemoryArea(NULL, - MmGetKernelAddressSpace(), - MEMORY_AREA_SYSTEM, - &BaseAddress, - Length, - 0, - &kernel_data_desc, - FALSE, - FALSE, - BoundaryAddressMultiple); + MmGetKernelAddressSpace(), + MEMORY_AREA_SYSTEM, + &BaseAddress, + Length, + 0, + &kernel_data_desc, + FALSE, + FALSE, + BoundaryAddressMultiple); BaseAddress = (PVOID)PAGE_ROUND_UP(((ULONG)&_bss_end__)); Length = LastKernelAddress - (ULONG)BaseAddress; MmCreateMemoryArea(NULL, - MmGetKernelAddressSpace(), - MEMORY_AREA_SYSTEM, - &BaseAddress, - Length, - 0, - &kernel_param_desc, - FALSE, - FALSE, - BoundaryAddressMultiple); - + MmGetKernelAddressSpace(), + MEMORY_AREA_SYSTEM, + &BaseAddress, + Length, + 0, + &kernel_param_desc, + FALSE, + FALSE, + BoundaryAddressMultiple); + BaseAddress = MiNonPagedPoolStart; MmCreateMemoryArea(NULL, - MmGetKernelAddressSpace(), - MEMORY_AREA_SYSTEM, - &BaseAddress, - MiNonPagedPoolLength, - 0, - &kernel_pool_desc, - FALSE, - FALSE, - BoundaryAddressMultiple); + MmGetKernelAddressSpace(), + MEMORY_AREA_SYSTEM, + &BaseAddress, + MiNonPagedPoolLength, + 0, + &kernel_pool_desc, + FALSE, + FALSE, + BoundaryAddressMultiple); BaseAddress = MiKernelMapStart; Status = MmCreateMemoryArea(NULL, - MmGetKernelAddressSpace(), - MEMORY_AREA_SYSTEM, - &BaseAddress, - MiKernelMapLength, - 0, - &MiKernelMapDescriptor, - FALSE, - FALSE, - BoundaryAddressMultiple); - + MmGetKernelAddressSpace(), + MEMORY_AREA_SYSTEM, + &BaseAddress, + MiKernelMapLength, + 0, + &MiKernelMapDescriptor, + FALSE, + FALSE, + BoundaryAddressMultiple); + BaseAddress = MmPagedPoolBase; Status = MmCreateMemoryArea(NULL, - MmGetKernelAddressSpace(), - MEMORY_AREA_PAGED_POOL, - &BaseAddress, - MmPagedPoolSize, - 0, - &MiPagedPoolDescriptor, - FALSE, - FALSE, - BoundaryAddressMultiple); + MmGetKernelAddressSpace(), + MEMORY_AREA_PAGED_POOL, + &BaseAddress, + MmPagedPoolSize, + 0, + &MiPagedPoolDescriptor, + FALSE, + FALSE, + BoundaryAddressMultiple); MmInitializePagedPool(); @@ -273,27 +272,27 @@ MmInitVirtualMemory(ULONG LastKernelAddress, BaseAddress = (PVOID)KI_USER_SHARED_DATA; Length = PAGE_SIZE; MmCreateMemoryArea(NULL, - MmGetKernelAddressSpace(), - MEMORY_AREA_SYSTEM, - &BaseAddress, - Length, - 0, - &kernel_shared_data_desc, - FALSE, - FALSE, - BoundaryAddressMultiple); - Status = MmRequestPageMemoryConsumer(MC_NPPOOL, TRUE, - &MmSharedDataPagePhysicalAddress); + MmGetKernelAddressSpace(), + MEMORY_AREA_SYSTEM, + &BaseAddress, + Length, + 0, + &kernel_shared_data_desc, + FALSE, + FALSE, + BoundaryAddressMultiple); + Status = MmRequestPageMemoryConsumer(MC_NPPOOL, TRUE, + &MmSharedDataPagePhysicalAddress); Status = MmCreateVirtualMapping(NULL, - (PVOID)KI_USER_SHARED_DATA, - PAGE_READWRITE, - MmSharedDataPagePhysicalAddress, - TRUE); + (PVOID)KI_USER_SHARED_DATA, + PAGE_READWRITE, + MmSharedDataPagePhysicalAddress, + TRUE); if (!NT_SUCCESS(Status)) - { - DbgPrint("Unable to create virtual mapping\n"); - KEBUGCHECK(0); - } + { + DbgPrint("Unable to create virtual mapping\n"); + KEBUGCHECK(0); + } RtlZeroMemory(BaseAddress, Length); /* @@ -304,11 +303,11 @@ MmInitVirtualMemory(ULONG LastKernelAddress, VOID INIT_FUNCTION MmInit1(ULONG FirstKrnlPhysAddr, - ULONG LastKrnlPhysAddr, - ULONG LastKernelAddress, - PADDRESS_RANGE BIOSMemoryMap, - ULONG AddressRangeCount, - ULONG MaxMem) + ULONG LastKrnlPhysAddr, + ULONG LastKernelAddress, + PADDRESS_RANGE BIOSMemoryMap, + ULONG AddressRangeCount, + ULONG MaxMem) /* * FUNCTION: Initalize memory managment */ @@ -316,37 +315,38 @@ MmInit1(ULONG FirstKrnlPhysAddr, ULONG i; ULONG kernel_len; #ifndef MP + extern unsigned int unmap_me, unmap_me2, unmap_me3; #endif DPRINT("MmInit1(FirstKrnlPhysAddr, %x, LastKrnlPhysAddr %x, LastKernelAddress %x)\n", - FirstKrnlPhysAddr, - LastKrnlPhysAddr, - LastKernelAddress); + FirstKrnlPhysAddr, + LastKrnlPhysAddr, + LastKernelAddress); if ((BIOSMemoryMap != NULL) && (AddressRangeCount > 0)) - { - // If we have a bios memory map, recalulate the memory size - ULONG last = 0; - for (i = 0; i < AddressRangeCount; i++) - { - if (BIOSMemoryMap[i].Type == 1 - && (BIOSMemoryMap[i].BaseAddrLow + BIOSMemoryMap[i].LengthLow + PAGE_SIZE -1) / PAGE_SIZE > last) - { - last = (BIOSMemoryMap[i].BaseAddrLow + BIOSMemoryMap[i].LengthLow + PAGE_SIZE -1) / PAGE_SIZE; - } - } - if ((last - 256) * 4 > KeLoaderBlock.MemHigher) - { - KeLoaderBlock.MemHigher = (last - 256) * 4; - } - } + { + // If we have a bios memory map, recalulate the memory size + ULONG last = 0; + for (i = 0; i < AddressRangeCount; i++) + { + if (BIOSMemoryMap[i].Type == 1 + && (BIOSMemoryMap[i].BaseAddrLow + BIOSMemoryMap[i].LengthLow + PAGE_SIZE -1) / PAGE_SIZE > last) + { + last = (BIOSMemoryMap[i].BaseAddrLow + BIOSMemoryMap[i].LengthLow + PAGE_SIZE -1) / PAGE_SIZE; + } + } + if ((last - 256) * 4 > KeLoaderBlock.MemHigher) + { + KeLoaderBlock.MemHigher = (last - 256) * 4; + } + } if (KeLoaderBlock.MemHigher >= (MaxMem - 1) * 1024) - { - KeLoaderBlock.MemHigher = (MaxMem - 1) * 1024; - } + { + KeLoaderBlock.MemHigher = (MaxMem - 1) * 1024; + } /* * FIXME: Set this based on the system command line @@ -354,7 +354,7 @@ MmInit1(ULONG FirstKrnlPhysAddr, MmSystemRangeStart = (PVOID)KERNEL_BASE; // 0xC0000000 MmUserProbeAddress = (PVOID)0x7fff0000; MmHighestUserAddress = (PVOID)0x7ffeffff; - + MmInitGlobalKernelPageDirectory(); /* @@ -370,7 +370,7 @@ MmInit1(ULONG FirstKrnlPhysAddr, MmStats.PagingRequestsInLastMinute = 0; MmStats.PagingRequestsInLastFiveMinutes = 0; MmStats.PagingRequestsInLastFifteenMinutes = 0; - + /* * Initialize the kernel address space */ @@ -380,7 +380,7 @@ MmInit1(ULONG FirstKrnlPhysAddr, * Unmap low memory */ #ifndef MP - /* In SMP mode we unmap the low memory in MmInit3. + /* In SMP mode we unmap the low memory in MmInit3. The APIC needs the mapping of the first pages while the processors are starting up. */ MmDeletePageTable(NULL, 0); @@ -391,35 +391,36 @@ MmInit1(ULONG FirstKrnlPhysAddr, * memory) */ DPRINT("first krnl %x\nlast krnl %x\n",FirstKrnlPhysAddr, - LastKrnlPhysAddr); - + LastKrnlPhysAddr); + /* * Free physical memory not used by the kernel */ MmStats.NrTotalPages = KeLoaderBlock.MemHigher/4; if (!MmStats.NrTotalPages) - { - DbgPrint("Memory not detected, default to 8 MB\n"); - MmStats.NrTotalPages = 2048; - } + { + DbgPrint("Memory not detected, default to 8 MB\n"); + MmStats.NrTotalPages = 2048; + } else - { - /* add 1MB for standard memory (not extended) */ - MmStats.NrTotalPages += 256; - } + { + /* add 1MB for standard memory (not extended) */ + MmStats.NrTotalPages += 256; + } #ifdef BIOS_MEM_FIX MmStats.NrTotalPages += 16; #endif + DbgPrint("Used memory %dKb\n", (MmStats.NrTotalPages * PAGE_SIZE) / 1024); LastKernelAddress = (ULONG)MmInitializePageList((PVOID)FirstKrnlPhysAddr, - (PVOID)LastKrnlPhysAddr, - MmStats.NrTotalPages, - PAGE_ROUND_UP(LastKernelAddress), - BIOSMemoryMap, - AddressRangeCount); + (PVOID)LastKrnlPhysAddr, + MmStats.NrTotalPages, + PAGE_ROUND_UP(LastKernelAddress), + BIOSMemoryMap, + AddressRangeCount); kernel_len = LastKrnlPhysAddr - FirstKrnlPhysAddr; - + /* * Create a trap for null pointer references and protect text * segment @@ -427,27 +428,27 @@ MmInit1(ULONG FirstKrnlPhysAddr, CHECKPOINT; DPRINT("_text_start__ %x _init_end__ %x\n",(int)&_text_start__,(int)&_init_end__); for (i=PAGE_ROUND_DOWN(((int)&_text_start__)); - i 0) + + while (Page.QuadPart != 0LL && Target > 0) #else - while (Page.QuadPart && Target > 0) + + while (Page.QuadPart && Target > 0) #endif - { + + { /* * FIXME: While the current page is write back it is possible * that the next page is freed and not longer a user page. */ NextPage = MmGetLRUNextUserPage(Page); if (MmIsDirtyPageRmap(Page)) - { - Status = MmWritePagePhysicalAddress(Page); - if (NT_SUCCESS(Status)) - { - Target--; - } - } + { + Status = MmWritePagePhysicalAddress(Page); + if (NT_SUCCESS(Status)) + { + Target--; + } + } Page = NextPage; - } - *Actual = Target; - return(STATUS_SUCCESS); + } + *Actual = Target; + return(STATUS_SUCCESS); } NTSTATUS STDCALL MmMpwThreadMain(PVOID Ignored) { - NTSTATUS Status; - ULONG PagesWritten; - LARGE_INTEGER Timeout; - - Timeout.QuadPart = -50000000; - - for(;;) - { + NTSTATUS Status; + ULONG PagesWritten; + LARGE_INTEGER Timeout; + + Timeout.QuadPart = -50000000; + + for(;;) + { Status = KeWaitForSingleObject(&MpwThreadEvent, - 0, - KernelMode, - FALSE, - &Timeout); + 0, + KernelMode, + FALSE, + &Timeout); if (!NT_SUCCESS(Status)) - { - DbgPrint("MpwThread: Wait failed\n"); - KEBUGCHECK(0); - return(STATUS_UNSUCCESSFUL); - } + { + DbgPrint("MpwThread: Wait failed\n"); + KEBUGCHECK(0); + return(STATUS_UNSUCCESSFUL); + } if (MpwThreadShouldTerminate) - { - DbgPrint("MpwThread: Terminating\n"); - return(STATUS_SUCCESS); - } - + { + DbgPrint("MpwThread: Terminating\n"); + return(STATUS_SUCCESS); + } + PagesWritten = 0; #if 0 - /* + /* * FIXME: MmWriteDirtyPages doesn't work correctly. */ MmWriteDirtyPages(128, &PagesWritten); #endif + CcRosFlushDirtyPages(128, &PagesWritten); - } + } } NTSTATUS MmInitMpwThread(VOID) { - KPRIORITY Priority; - NTSTATUS Status; - - MpwThreadShouldTerminate = FALSE; - KeInitializeEvent(&MpwThreadEvent, SynchronizationEvent, FALSE); - - Status = PsCreateSystemThread(&MpwThreadHandle, - THREAD_ALL_ACCESS, - NULL, - NULL, - &MpwThreadId, - (PKSTART_ROUTINE) MmMpwThreadMain, - NULL); - if (!NT_SUCCESS(Status)) - { + KPRIORITY Priority; + NTSTATUS Status; + + MpwThreadShouldTerminate = FALSE; + KeInitializeEvent(&MpwThreadEvent, SynchronizationEvent, FALSE); + + Status = PsCreateSystemThread(&MpwThreadHandle, + THREAD_ALL_ACCESS, + NULL, + NULL, + &MpwThreadId, + (PKSTART_ROUTINE) MmMpwThreadMain, + NULL); + if (!NT_SUCCESS(Status)) + { return(Status); - } - - Priority = 1; - NtSetInformationThread(MpwThreadHandle, - ThreadPriority, - &Priority, - sizeof(Priority)); - - return(STATUS_SUCCESS); + } + + Priority = 1; + NtSetInformationThread(MpwThreadHandle, + ThreadPriority, + &Priority, + sizeof(Priority)); + + return(STATUS_SUCCESS); } diff --git a/reactos/ntoskrnl/mm/ncache.c b/reactos/ntoskrnl/mm/ncache.c index b488d62eaa7..271d6394e56 100644 --- a/reactos/ntoskrnl/mm/ncache.c +++ b/reactos/ntoskrnl/mm/ncache.c @@ -1,4 +1,4 @@ -/* $Id: ncache.c,v 1.27 2003/12/31 05:33:04 jfilby Exp $ +/* $Id: ncache.c,v 1.28 2004/04/10 22:35:25 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -22,30 +22,30 @@ /********************************************************************** - * NAME EXPORTED - * MmAllocateNonCachedMemory@4 + * NAME EXPORTED + * MmAllocateNonCachedMemory@4 * * DESCRIPTION - * Allocates a virtual address range of noncached and cache - * aligned memory. - * + * Allocates a virtual address range of noncached and cache + * aligned memory. + * * ARGUMENTS - * NumberOfBytes - * Size of region to allocate. - * + * NumberOfBytes + * Size of region to allocate. + * * RETURN VALUE - * The base address of the range on success; - * NULL on failure. + * The base address of the range on success; + * NULL on failure. * * NOTE - * Description taken from include/ddk/mmfuncs.h. - * Code taken from ntoskrnl/mm/special.c. + * Description taken from include/ddk/mmfuncs.h. + * Code taken from ntoskrnl/mm/special.c. * * REVISIONS * * @implemented */ -PVOID STDCALL +PVOID STDCALL MmAllocateNonCachedMemory(IN ULONG NumberOfBytes) { PVOID Result; @@ -59,85 +59,85 @@ MmAllocateNonCachedMemory(IN ULONG NumberOfBytes) MmLockAddressSpace(MmGetKernelAddressSpace()); Result = NULL; Status = MmCreateMemoryArea (NULL, - MmGetKernelAddressSpace(), - MEMORY_AREA_NO_CACHE, - &Result, - NumberOfBytes, - 0, - &marea, - FALSE, - FALSE, - BoundaryAddressMultiple); + MmGetKernelAddressSpace(), + MEMORY_AREA_NO_CACHE, + &Result, + NumberOfBytes, + 0, + &marea, + FALSE, + FALSE, + BoundaryAddressMultiple); MmUnlockAddressSpace(MmGetKernelAddressSpace()); if (!NT_SUCCESS(Status)) - { - return (NULL); - } - Attributes = PAGE_READWRITE | PAGE_SYSTEM | PAGE_NOCACHE | - PAGE_WRITETHROUGH; + { + return (NULL); + } + Attributes = PAGE_READWRITE | PAGE_SYSTEM | PAGE_NOCACHE | + PAGE_WRITETHROUGH; for (i = 0; i < (PAGE_ROUND_UP(NumberOfBytes) / PAGE_SIZE); i++) - { - PHYSICAL_ADDRESS NPage; + { + PHYSICAL_ADDRESS NPage; - Status = MmRequestPageMemoryConsumer(MC_NPPOOL, TRUE, &NPage); - MmCreateVirtualMapping (NULL, - (char*)Result + (i * PAGE_SIZE), - Attributes, - NPage, - TRUE); - } + Status = MmRequestPageMemoryConsumer(MC_NPPOOL, TRUE, &NPage); + MmCreateVirtualMapping (NULL, + (char*)Result + (i * PAGE_SIZE), + Attributes, + NPage, + TRUE); + } return ((PVOID)Result); } VOID STATIC -MmFreeNonCachedPage(PVOID Context, MEMORY_AREA* MemoryArea, PVOID Address, - PHYSICAL_ADDRESS PhysAddr, SWAPENTRY SwapEntry, - BOOLEAN Dirty) +MmFreeNonCachedPage(PVOID Context, MEMORY_AREA* MemoryArea, PVOID Address, + PHYSICAL_ADDRESS PhysAddr, SWAPENTRY SwapEntry, + BOOLEAN Dirty) { - assert(SwapEntry == 0); - if (PhysAddr.QuadPart != 0) - { + assert(SwapEntry == 0); + if (PhysAddr.QuadPart != 0) + { MmReleasePageMemoryConsumer(MC_NPPOOL, PhysAddr); - } + } } /********************************************************************** - * NAME EXPORTED - * MmFreeNonCachedMemory@8 + * NAME EXPORTED + * MmFreeNonCachedMemory@8 * * DESCRIPTION - * Releases a range of noncached memory allocated with - * MmAllocateNonCachedMemory. - * + * Releases a range of noncached memory allocated with + * MmAllocateNonCachedMemory. + * * ARGUMENTS - * BaseAddress - * Virtual address to be freed; - * - * NumberOfBytes - * Size of the region to be freed. - * + * BaseAddress + * Virtual address to be freed; + * + * NumberOfBytes + * Size of the region to be freed. + * * RETURN VALUE - * None. + * None. * * NOTE - * Description taken from include/ddk/mmfuncs.h. - * Code taken from ntoskrnl/mm/special.c. + * Description taken from include/ddk/mmfuncs.h. + * Code taken from ntoskrnl/mm/special.c. * * REVISIONS * * @implemented */ VOID STDCALL MmFreeNonCachedMemory (IN PVOID BaseAddress, - IN ULONG NumberOfBytes) + IN ULONG NumberOfBytes) { - MmLockAddressSpace(MmGetKernelAddressSpace()); - MmFreeMemoryArea (MmGetKernelAddressSpace(), - BaseAddress, - NumberOfBytes, - MmFreeNonCachedPage, - NULL); - MmUnlockAddressSpace(MmGetKernelAddressSpace()); + MmLockAddressSpace(MmGetKernelAddressSpace()); + MmFreeMemoryArea (MmGetKernelAddressSpace(), + BaseAddress, + NumberOfBytes, + MmFreeNonCachedPage, + NULL); + MmUnlockAddressSpace(MmGetKernelAddressSpace()); } /* EOF */ diff --git a/reactos/ntoskrnl/mm/npool.c b/reactos/ntoskrnl/mm/npool.c index ded9a3bbfe1..f1345d461a7 100644 --- a/reactos/ntoskrnl/mm/npool.c +++ b/reactos/ntoskrnl/mm/npool.c @@ -1,4 +1,4 @@ -/* $Id: npool.c,v 1.84 2004/03/15 22:22:53 dwelch Exp $ +/* $Id: npool.c,v 1.85 2004/04/10 22:35:25 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -30,7 +30,7 @@ /* Enable tracking of statistics about the tagged blocks in the pool */ #define TAG_STATISTICS_TRACKING -/* +/* * Put each block in its own range of pages and position the block at the * end of the range so any accesses beyond the end of block are to invalid * memory locations. @@ -50,7 +50,7 @@ #define POOL_TRACE(args...) #else #define POOL_TRACE -#endif /* __GNUC__ */ +#endif /* __GNUC__ */ #endif /* avl types ****************************************************************/ @@ -61,10 +61,11 @@ typedef struct _NODE { - struct _NODE* link[2]; - struct _NODE* parent; - signed char balance; -} NODE, *PNODE; + struct _NODE* link[2]; + struct _NODE* parent; + signed char balance; +} +NODE, *PNODE; /* TYPES *******************************************************************/ @@ -76,29 +77,32 @@ typedef struct _NODE */ typedef struct _BLOCK_HDR { - ULONG Magic; - ULONG Size; - struct _BLOCK_HDR* previous; - union - { - struct - { - LIST_ENTRY ListEntry; - ULONG Tag; - PVOID Caller; - LIST_ENTRY TagListEntry; - BOOLEAN Dumped; - } Used; - struct - { - NODE Node; - } Free; - }; -} BLOCK_HDR; + ULONG Magic; + ULONG Size; + struct _BLOCK_HDR* previous; + union + { + struct + { + LIST_ENTRY ListEntry; + ULONG Tag; + PVOID Caller; + LIST_ENTRY TagListEntry; + BOOLEAN Dumped; + } + Used; + struct + { + NODE Node; + } + Free; + }; +} +BLOCK_HDR; -#define BLOCK_HDR_SIZE ROUND_UP(sizeof(BLOCK_HDR), MM_POOL_ALIGNMENT) +#define BLOCK_HDR_SIZE ROUND_UP(sizeof(BLOCK_HDR), MM_POOL_ALIGNMENT) -PVOID STDCALL +PVOID STDCALL ExAllocateWholePageBlock(ULONG Size); VOID STDCALL ExFreeWholePageBlock(PVOID Addr); @@ -174,74 +178,74 @@ static ULONG MiNonPagedPoolNrOfPages; void DumpFreeBlockNode(PNODE p) { - static int count = 0; - BLOCK_HDR* blk; + static int count = 0; + BLOCK_HDR* blk; - count++; + count++; - if (p) - { + if (p) + { DumpFreeBlockNode(p->link[0]); blk = CONTAINING_RECORD(p, BLOCK_HDR, Free.Node); DbgPrint("%08x %8d (%d)\n", blk, blk->Size, count); DumpFreeBlockNode(p->link[1]); - } + } - count--; + count--; } void DumpFreeBlockTree(void) { - DbgPrint("--- Begin tree ------------------\n"); - DbgPrint("%08x\n", CONTAINING_RECORD(FreeBlockListRoot, BLOCK_HDR, Free.Node)); - DumpFreeBlockNode(FreeBlockListRoot); - DbgPrint("--- End tree --------------------\n"); + DbgPrint("--- Begin tree ------------------\n"); + DbgPrint("%08x\n", CONTAINING_RECORD(FreeBlockListRoot, BLOCK_HDR, Free.Node)); + DumpFreeBlockNode(FreeBlockListRoot); + DbgPrint("--- End tree --------------------\n"); } int compare_node(PNODE p1, PNODE p2) { - BLOCK_HDR* blk1 = CONTAINING_RECORD(p1, BLOCK_HDR, Free.Node); - BLOCK_HDR* blk2 = CONTAINING_RECORD(p2, BLOCK_HDR, Free.Node); + BLOCK_HDR* blk1 = CONTAINING_RECORD(p1, BLOCK_HDR, Free.Node); + BLOCK_HDR* blk2 = CONTAINING_RECORD(p2, BLOCK_HDR, Free.Node); - if (blk1->Size == blk2->Size) - { + if (blk1->Size == blk2->Size) + { if (blk1 < blk2) - { - return -1; - } + { + return -1; + } if (blk1 > blk2) - { - return 1; - } - } - else - { + { + return 1; + } + } + else + { if (blk1->Size < blk2->Size) - { - return -1; - } + { + return -1; + } if (blk1->Size > blk2->Size) - { - return 1; - } - } - return 0; + { + return 1; + } + } + return 0; } int compare_value(PVOID value, PNODE p) { - BLOCK_HDR* blk = CONTAINING_RECORD(p, BLOCK_HDR, Free.Node); - ULONG v = *(PULONG)value; + BLOCK_HDR* blk = CONTAINING_RECORD(p, BLOCK_HDR, Free.Node); + ULONG v = *(PULONG)value; - if (v < blk->Size) - { + if (v < blk->Size) + { return -1; - } - if (v > blk->Size) - { + } + if (v > blk->Size) + { return 1; - } - return 0; + } + return 0; } /* avl functions **********************************************************/ @@ -254,490 +258,490 @@ int compare_value(PVOID value, PNODE p) void avl_insert (PNODE * root, PNODE n, int (*compare)(PNODE, PNODE)) { - PNODE y; /* Top node to update balance factor, and parent. */ - PNODE p, q; /* Iterator, and parent. */ - PNODE w; /* New root of rebalanced subtree. */ - int dir = 0; /* Direction to descend. */ + PNODE y; /* Top node to update balance factor, and parent. */ + PNODE p, q; /* Iterator, and parent. */ + PNODE w; /* New root of rebalanced subtree. */ + int dir = 0; /* Direction to descend. */ - n->link[0] = n->link[1] = n->parent = NULL; - n->balance = 0; + n->link[0] = n->link[1] = n->parent = NULL; + n->balance = 0; - y = *root; - for (q = NULL, p = *root; p != NULL; q = p, p = p->link[dir]) - { + y = *root; + for (q = NULL, p = *root; p != NULL; q = p, p = p->link[dir]) + { dir = compare(n, p) > 0; if (p->balance != 0) - { - y = p; - } - } + { + y = p; + } + } - n->parent = q; - if (q != NULL) - { + n->parent = q; + if (q != NULL) + { q->link[dir] = n; - } - else - { + } + else + { *root = n; - } + } - if (*root == n) - { + if (*root == n) + { return; - } + } - for (p = n; p != y; p = q) - { + for (p = n; p != y; p = q) + { q = p->parent; dir = q->link[0] != p; if (dir == 0) - { - q->balance--; - } + { + q->balance--; + } else - { - q->balance++; - } - } + { + q->balance++; + } + } - if (y->balance == -2) - { + if (y->balance == -2) + { PNODE x = y->link[0]; if (x->balance == -1) - { - w = x; - y->link[0] = x->link[1]; - x->link[1] = y; - x->balance = y->balance = 0; - x->parent = y->parent; - y->parent = x; - if (y->link[0] != NULL) - { - y->link[0]->parent = y; - } - } + { + w = x; + y->link[0] = x->link[1]; + x->link[1] = y; + x->balance = y->balance = 0; + x->parent = y->parent; + y->parent = x; + if (y->link[0] != NULL) + { + y->link[0]->parent = y; + } + } else - { - assert (x->balance == +1); - w = x->link[1]; - x->link[1] = w->link[0]; - w->link[0] = x; - y->link[0] = w->link[1]; - w->link[1] = y; - if (w->balance == -1) - { - x->balance = 0; - y->balance = +1; - } - else if (w->balance == 0) - { - x->balance = y->balance = 0; - } - else /* |w->pavl_balance == +1| */ - { - x->balance = -1; - y->balance = 0; - } - w->balance = 0; - w->parent = y->parent; - x->parent = y->parent = w; - if (x->link[1] != NULL) - { - x->link[1]->parent = x; - } - if (y->link[0] != NULL) - { - y->link[0]->parent = y; - } - } - } - else if (y->balance == +2) - { + { + assert (x->balance == +1); + w = x->link[1]; + x->link[1] = w->link[0]; + w->link[0] = x; + y->link[0] = w->link[1]; + w->link[1] = y; + if (w->balance == -1) + { + x->balance = 0; + y->balance = +1; + } + else if (w->balance == 0) + { + x->balance = y->balance = 0; + } + else /* |w->pavl_balance == +1| */ + { + x->balance = -1; + y->balance = 0; + } + w->balance = 0; + w->parent = y->parent; + x->parent = y->parent = w; + if (x->link[1] != NULL) + { + x->link[1]->parent = x; + } + if (y->link[0] != NULL) + { + y->link[0]->parent = y; + } + } + } + else if (y->balance == +2) + { PNODE x = y->link[1]; if (x->balance == +1) - { - w = x; - y->link[1] = x->link[0]; - x->link[0] = y; - x->balance = y->balance = 0; - x->parent = y->parent; - y->parent = x; - if (y->link[1] != NULL) - { - y->link[1]->parent = y; - } - } + { + w = x; + y->link[1] = x->link[0]; + x->link[0] = y; + x->balance = y->balance = 0; + x->parent = y->parent; + y->parent = x; + if (y->link[1] != NULL) + { + y->link[1]->parent = y; + } + } else - { - assert (x->balance == -1); - w = x->link[0]; - x->link[0] = w->link[1]; - w->link[1] = x; - y->link[1] = w->link[0]; - w->link[0] = y; - if (w->balance == 1) - { - x->balance = 0; - y->balance = -1; - } - else if (w->balance == 0) - { - x->balance = y->balance = 0; - } - else /* |w->pavl_balance == -1| */ - { - x->balance = +1; - y->balance = 0; - } - w->balance = 0; - w->parent = y->parent; - x->parent = y->parent = w; - if (x->link[0] != NULL) - { - x->link[0]->parent = x; - } - if (y->link[1] != NULL) - { - y->link[1]->parent = y; - } - } - } - else - { + { + assert (x->balance == -1); + w = x->link[0]; + x->link[0] = w->link[1]; + w->link[1] = x; + y->link[1] = w->link[0]; + w->link[0] = y; + if (w->balance == 1) + { + x->balance = 0; + y->balance = -1; + } + else if (w->balance == 0) + { + x->balance = y->balance = 0; + } + else /* |w->pavl_balance == -1| */ + { + x->balance = +1; + y->balance = 0; + } + w->balance = 0; + w->parent = y->parent; + x->parent = y->parent = w; + if (x->link[0] != NULL) + { + x->link[0]->parent = x; + } + if (y->link[1] != NULL) + { + y->link[1]->parent = y; + } + } + } + else + { return; - } - if (w->parent != NULL) - { + } + if (w->parent != NULL) + { w->parent->link[y != w->parent->link[0]] = w; - } - else - { + } + else + { *root = w; - } + } - return; + return; } void avl_remove (PNODE *root, PNODE item, int (*compare)(PNODE, PNODE)) { - PNODE p; /* Traverses tree to find node to delete. */ - PNODE q; /* Parent of |p|. */ - int dir; /* Side of |q| on which |p| is linked. */ + PNODE p; /* Traverses tree to find node to delete. */ + PNODE q; /* Parent of |p|. */ + int dir; /* Side of |q| on which |p| is linked. */ - if (root == NULL || *root == NULL) - { + if (root == NULL || *root == NULL) + { return ; - } + } - p = item; - q = p->parent; - if (q == NULL) - { + p = item; + q = p->parent; + if (q == NULL) + { q = (PNODE) root; dir = 0; - } - else - { + } + else + { dir = compare(p, q) > 0; - } + } - if (p->link[1] == NULL) - { + if (p->link[1] == NULL) + { q->link[dir] = p->link[0]; if (q->link[dir] != NULL) - { - q->link[dir]->parent = p->parent; - } - } - else - { + { + q->link[dir]->parent = p->parent; + } + } + else + { PNODE r = p->link[1]; if (r->link[0] == NULL) - { - r->link[0] = p->link[0]; - q->link[dir] = r; - r->parent = p->parent; - if (r->link[0] != NULL) - { - r->link[0]->parent = r; - } - r->balance = p->balance; - q = r; - dir = 1; - } + { + r->link[0] = p->link[0]; + q->link[dir] = r; + r->parent = p->parent; + if (r->link[0] != NULL) + { + r->link[0]->parent = r; + } + r->balance = p->balance; + q = r; + dir = 1; + } else - { - PNODE s = r->link[0]; - while (s->link[0] != NULL) - { - s = s->link[0]; - } - r = s->parent; - r->link[0] = s->link[1]; - s->link[0] = p->link[0]; - s->link[1] = p->link[1]; - q->link[dir] = s; - if (s->link[0] != NULL) - { - s->link[0]->parent = s; - } - s->link[1]->parent = s; - s->parent = p->parent; - if (r->link[0] != NULL) - { - r->link[0]->parent = r; - } - s->balance = p->balance; - q = r; - dir = 0; - } - } + { + PNODE s = r->link[0]; + while (s->link[0] != NULL) + { + s = s->link[0]; + } + r = s->parent; + r->link[0] = s->link[1]; + s->link[0] = p->link[0]; + s->link[1] = p->link[1]; + q->link[dir] = s; + if (s->link[0] != NULL) + { + s->link[0]->parent = s; + } + s->link[1]->parent = s; + s->parent = p->parent; + if (r->link[0] != NULL) + { + r->link[0]->parent = r; + } + s->balance = p->balance; + q = r; + dir = 0; + } + } - item->link[0] = item->link[1] = item->parent = NULL; - item->balance = 0; + item->link[0] = item->link[1] = item->parent = NULL; + item->balance = 0; - while (q != (PNODE) root) - { + while (q != (PNODE) root) + { PNODE y = q; if (y->parent != NULL) - { - q = y->parent; - } + { + q = y->parent; + } else - { - q = (PNODE) root; - } + { + q = (PNODE) root; + } if (dir == 0) - { - dir = q->link[0] != y; - y->balance++; - if (y->balance == +1) - { - break; - } - else if (y->balance == +2) + { + dir = q->link[0] != y; + y->balance++; + if (y->balance == +1) + { + break; + } + else if (y->balance == +2) + { + PNODE x = y->link[1]; + if (x->balance == -1) { - PNODE x = y->link[1]; - if (x->balance == -1) - { - PNODE w; + PNODE w; - assert (x->balance == -1); - w = x->link[0]; - x->link[0] = w->link[1]; - w->link[1] = x; - y->link[1] = w->link[0]; - w->link[0] = y; - if (w->balance == +1) - { - x->balance = 0; - y->balance = -1; - } - else if (w->balance == 0) - { - x->balance = y->balance = 0; - } - else /* |w->pavl_balance == -1| */ - { - x->balance = +1; - y->balance = 0; - } - w->balance = 0; - w->parent = y->parent; - x->parent = y->parent = w; - if (x->link[0] != NULL) - { - x->link[0]->parent = x; - } - if (y->link[1] != NULL) - { - y->link[1]->parent = y; - } - q->link[dir] = w; - } - else - { - y->link[1] = x->link[0]; - x->link[0] = y; - x->parent = y->parent; - y->parent = x; - if (y->link[1] != NULL) - { - y->link[1]->parent = y; - } - q->link[dir] = x; - if (x->balance == 0) - { - x->balance = -1; - y->balance = +1; - break; - } - else - { - x->balance = y->balance = 0; - y = x; - } - } + assert (x->balance == -1); + w = x->link[0]; + x->link[0] = w->link[1]; + w->link[1] = x; + y->link[1] = w->link[0]; + w->link[0] = y; + if (w->balance == +1) + { + x->balance = 0; + y->balance = -1; + } + else if (w->balance == 0) + { + x->balance = y->balance = 0; + } + else /* |w->pavl_balance == -1| */ + { + x->balance = +1; + y->balance = 0; + } + w->balance = 0; + w->parent = y->parent; + x->parent = y->parent = w; + if (x->link[0] != NULL) + { + x->link[0]->parent = x; + } + if (y->link[1] != NULL) + { + y->link[1]->parent = y; + } + q->link[dir] = w; } - } - else - { - dir = q->link[0] != y; - y->balance--; - if (y->balance == -1) - { - break; - } - else if (y->balance == -2) + else { - PNODE x = y->link[0]; - if (x->balance == +1) - { - PNODE w; - assert (x->balance == +1); - w = x->link[1]; - x->link[1] = w->link[0]; - w->link[0] = x; - y->link[0] = w->link[1]; - w->link[1] = y; - if (w->balance == -1) - { - x->balance = 0; - y->balance = +1; - } - else if (w->balance == 0) - { - x->balance = y->balance = 0; - } - else /* |w->pavl_balance == +1| */ - { - x->balance = -1; - y->balance = 0; - } - w->balance = 0; - w->parent = y->parent; - x->parent = y->parent = w; - if (x->link[1] != NULL) - { - x->link[1]->parent = x; - } - if (y->link[0] != NULL) - { - y->link[0]->parent = y; - } - q->link[dir] = w; - } - else - { - y->link[0] = x->link[1]; - x->link[1] = y; - x->parent = y->parent; - y->parent = x; - if (y->link[0] != NULL) - { - y->link[0]->parent = y; - } - q->link[dir] = x; - if (x->balance == 0) - { - x->balance = +1; - y->balance = -1; - break; - } - else - { - x->balance = y->balance = 0; - y = x; - } - } + y->link[1] = x->link[0]; + x->link[0] = y; + x->parent = y->parent; + y->parent = x; + if (y->link[1] != NULL) + { + y->link[1]->parent = y; + } + q->link[dir] = x; + if (x->balance == 0) + { + x->balance = -1; + y->balance = +1; + break; + } + else + { + x->balance = y->balance = 0; + y = x; + } } - } - } + } + } + else + { + dir = q->link[0] != y; + y->balance--; + if (y->balance == -1) + { + break; + } + else if (y->balance == -2) + { + PNODE x = y->link[0]; + if (x->balance == +1) + { + PNODE w; + assert (x->balance == +1); + w = x->link[1]; + x->link[1] = w->link[0]; + w->link[0] = x; + y->link[0] = w->link[1]; + w->link[1] = y; + if (w->balance == -1) + { + x->balance = 0; + y->balance = +1; + } + else if (w->balance == 0) + { + x->balance = y->balance = 0; + } + else /* |w->pavl_balance == +1| */ + { + x->balance = -1; + y->balance = 0; + } + w->balance = 0; + w->parent = y->parent; + x->parent = y->parent = w; + if (x->link[1] != NULL) + { + x->link[1]->parent = x; + } + if (y->link[0] != NULL) + { + y->link[0]->parent = y; + } + q->link[dir] = w; + } + else + { + y->link[0] = x->link[1]; + x->link[1] = y; + x->parent = y->parent; + y->parent = x; + if (y->link[0] != NULL) + { + y->link[0]->parent = y; + } + q->link[dir] = x; + if (x->balance == 0) + { + x->balance = +1; + y->balance = -1; + break; + } + else + { + x->balance = y->balance = 0; + y = x; + } + } + } + } + } } PNODE _cdecl avl_get_first(PNODE root) { - PNODE p; - if (root == NULL) - { + PNODE p; + if (root == NULL) + { return NULL; - } - p = root; - while (p->link[0]) - { + } + p = root; + while (p->link[0]) + { p = p->link[0]; - } - return p; + } + return p; } PNODE avl_get_next(PNODE root, PNODE p) { - PNODE q; - if (p->link[1]) - { + PNODE q; + if (p->link[1]) + { p = p->link[1]; while(p->link[0]) - { - p = p->link[0]; - } + { + p = p->link[0]; + } return p; - } - else - { + } + else + { q = p->parent; while (q && q->link[1] == p) - { - p = q; - q = q->parent; - } + { + p = q; + q = q->parent; + } if (q == NULL) - { - return NULL; - } + { + return NULL; + } else - { - return q; - } - } + { + return q; + } + } } PNODE avl_find_equal_or_greater(PNODE root, ULONG size, int (compare)(PVOID, PNODE)) { - PNODE p; - PNODE prev = NULL; - int cmp; + PNODE p; + PNODE prev = NULL; + int cmp; - for (p = root; p != NULL;) - { + for (p = root; p != NULL;) + { cmp = compare((PVOID)&size, p); if (cmp < 0) - { - prev = p; - p = p->link[0]; - } + { + prev = p; + p = p->link[0]; + } else if (cmp > 0) - { - p = p->link[1]; - } + { + p = p->link[1]; + } else - { - while (p->link[0]) - { - cmp = compare((PVOID)&size, p->link[0]); - if (cmp != 0) - { - break; - } - p = p->link[0]; - } - return p; - } - } - return prev; + { + while (p->link[0]) + { + cmp = compare((PVOID)&size, p->link[0]); + if (cmp != 0) + { + break; + } + p = p->link[0]; + } + return p; + } + } + return prev; } /* non paged pool functions ************************************************/ @@ -745,34 +749,34 @@ PNODE avl_find_equal_or_greater(PNODE root, ULONG size, int (compare)(PVOID, PNO #ifdef TAG_STATISTICS_TRACKING VOID MiRemoveFromTagHashTable(BLOCK_HDR* block) - /* - * Remove a block from the tag hash table - */ +/* + * Remove a block from the tag hash table + */ { - if (block->Used.Tag == 0) - { + if (block->Used.Tag == 0) + { return; - } + } - RemoveEntryList(&block->Used.TagListEntry); + RemoveEntryList(&block->Used.TagListEntry); } VOID MiAddToTagHashTable(BLOCK_HDR* block) - /* - * Add a block to the tag hash table - */ +/* + * Add a block to the tag hash table + */ { - ULONG hash; + ULONG hash; - if (block->Used.Tag == 0) - { + if (block->Used.Tag == 0) + { return; - } + } - hash = block->Used.Tag % TAG_HASH_TABLE_SIZE; + hash = block->Used.Tag % TAG_HASH_TABLE_SIZE; - InsertHeadList(&tag_hash_table[hash], &block->Used.TagListEntry); + InsertHeadList(&tag_hash_table[hash], &block->Used.TagListEntry); } #endif /* TAG_STATISTICS_TRACKING */ @@ -780,25 +784,25 @@ MiAddToTagHashTable(BLOCK_HDR* block) VOID STATIC MiDumpTagStats(ULONG CurrentTag, ULONG CurrentNrBlocks, ULONG CurrentSize) { - CHAR c1, c2, c3, c4; - - c1 = (CHAR)((CurrentTag >> 24) & 0xFF); - c2 = (CHAR)((CurrentTag >> 16) & 0xFF); - c3 = (CHAR)((CurrentTag >> 8) & 0xFF); - c4 = (CHAR)(CurrentTag & 0xFF); - - if (isprint(c1) && isprint(c2) && isprint(c3) && isprint(c4)) - { + CHAR c1, c2, c3, c4; + + c1 = (CHAR)((CurrentTag >> 24) & 0xFF); + c2 = (CHAR)((CurrentTag >> 16) & 0xFF); + c3 = (CHAR)((CurrentTag >> 8) & 0xFF); + c4 = (CHAR)(CurrentTag & 0xFF); + + if (isprint(c1) && isprint(c2) && isprint(c3) && isprint(c4)) + { DbgPrint("Tag %x (%c%c%c%c) Blocks %d Total Size %d Average Size %d\n", - CurrentTag, c4, c3, c2, c1, CurrentNrBlocks, - CurrentSize, CurrentSize / CurrentNrBlocks); - } - else - { + CurrentTag, c4, c3, c2, c1, CurrentNrBlocks, + CurrentSize, CurrentSize / CurrentNrBlocks); + } + else + { DbgPrint("Tag %x Blocks %d Total Size %d Average Size %d\n", - CurrentTag, CurrentNrBlocks, CurrentSize, - CurrentSize / CurrentNrBlocks); - } + CurrentTag, CurrentNrBlocks, CurrentSize, + CurrentSize / CurrentNrBlocks); + } } #endif /* defined(TAG_STATISTICS_TRACKING) && !defined(WHOLE_PAGE_ALLOCATIONS); */ @@ -806,80 +810,80 @@ VOID MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly) { #if defined(TAG_STATISTICS_TRACKING) && !defined(WHOLE_PAGE_ALLOCATIONS) - ULONG i; - BLOCK_HDR* current; - ULONG CurrentTag; - ULONG CurrentNrBlocks = 0; - ULONG CurrentSize = 0; - ULONG TotalBlocks; - ULONG TotalSize; - ULONG Size; - LIST_ENTRY tmpListHead; - PLIST_ENTRY current_entry; + ULONG i; + BLOCK_HDR* current; + ULONG CurrentTag; + ULONG CurrentNrBlocks = 0; + ULONG CurrentSize = 0; + ULONG TotalBlocks; + ULONG TotalSize; + ULONG Size; + LIST_ENTRY tmpListHead; + PLIST_ENTRY current_entry; - DbgPrint("******* Dumping non paging pool stats ******\n"); - TotalBlocks = 0; - TotalSize = 0; - for (i = 0; i < TAG_HASH_TABLE_SIZE; i++) - { + DbgPrint("******* Dumping non paging pool stats ******\n"); + TotalBlocks = 0; + TotalSize = 0; + for (i = 0; i < TAG_HASH_TABLE_SIZE; i++) + { InitializeListHead(&tmpListHead); while (!IsListEmpty(&tag_hash_table[i])) - { - CurrentTag = 0; + { + CurrentTag = 0; - current_entry = tag_hash_table[i].Flink; - while (current_entry != &tag_hash_table[i]) - { - current = CONTAINING_RECORD(current_entry, BLOCK_HDR, Used.TagListEntry); - current_entry = current_entry->Flink; - if (CurrentTag == 0) - { - CurrentTag = current->Used.Tag; - CurrentNrBlocks = 0; - CurrentSize = 0; - } - if (current->Used.Tag == CurrentTag) - { - RemoveEntryList(¤t->Used.TagListEntry); - InsertHeadList(&tmpListHead, ¤t->Used.TagListEntry); - if (!NewOnly || !current->Used.Dumped) - { - CurrentNrBlocks++; - TotalBlocks++; - CurrentSize += current->Size; - TotalSize += current->Size; - current->Used.Dumped = TRUE; - } - } - } - if (CurrentTag != 0 && CurrentNrBlocks != 0) - { - MiDumpTagStats(CurrentTag, CurrentNrBlocks, CurrentSize); - } - } + current_entry = tag_hash_table[i].Flink; + while (current_entry != &tag_hash_table[i]) + { + current = CONTAINING_RECORD(current_entry, BLOCK_HDR, Used.TagListEntry); + current_entry = current_entry->Flink; + if (CurrentTag == 0) + { + CurrentTag = current->Used.Tag; + CurrentNrBlocks = 0; + CurrentSize = 0; + } + if (current->Used.Tag == CurrentTag) + { + RemoveEntryList(¤t->Used.TagListEntry); + InsertHeadList(&tmpListHead, ¤t->Used.TagListEntry); + if (!NewOnly || !current->Used.Dumped) + { + CurrentNrBlocks++; + TotalBlocks++; + CurrentSize += current->Size; + TotalSize += current->Size; + current->Used.Dumped = TRUE; + } + } + } + if (CurrentTag != 0 && CurrentNrBlocks != 0) + { + MiDumpTagStats(CurrentTag, CurrentNrBlocks, CurrentSize); + } + } if (!IsListEmpty(&tmpListHead)) - { - tag_hash_table[i].Flink = tmpListHead.Flink; - tag_hash_table[i].Flink->Blink = &tag_hash_table[i]; - tag_hash_table[i].Blink = tmpListHead.Blink; - tag_hash_table[i].Blink->Flink = &tag_hash_table[i]; - } - } - if (TotalBlocks != 0) - { + { + tag_hash_table[i].Flink = tmpListHead.Flink; + tag_hash_table[i].Flink->Blink = &tag_hash_table[i]; + tag_hash_table[i].Blink = tmpListHead.Blink; + tag_hash_table[i].Blink->Flink = &tag_hash_table[i]; + } + } + if (TotalBlocks != 0) + { DbgPrint("TotalBlocks %d TotalSize %d AverageSize %d\n", - TotalBlocks, TotalSize, TotalSize / TotalBlocks); - } - else - { + TotalBlocks, TotalSize, TotalSize / TotalBlocks); + } + else + { DbgPrint("TotalBlocks %d TotalSize %d\n", - TotalBlocks, TotalSize); - } - Size = EiFreeNonPagedPool - (MiNonPagedPoolLength - MiNonPagedPoolNrOfPages * PAGE_SIZE); - DbgPrint("Freeblocks %d TotalFreeSize %d AverageFreeSize %d\n", - EiNrFreeBlocks, Size, EiNrFreeBlocks ? Size / EiNrFreeBlocks : 0); - DbgPrint("***************** Dump Complete ***************\n"); + TotalBlocks, TotalSize); + } + Size = EiFreeNonPagedPool - (MiNonPagedPoolLength - MiNonPagedPoolNrOfPages * PAGE_SIZE); + DbgPrint("Freeblocks %d TotalFreeSize %d AverageFreeSize %d\n", + EiNrFreeBlocks, Size, EiNrFreeBlocks ? Size / EiNrFreeBlocks : 0); + DbgPrint("***************** Dump Complete ***************\n"); #endif /* defined(TAG_STATISTICS_TRACKING) && !defined(WHOLE_PAGE_ALLOCATIONS) */ } @@ -890,38 +894,38 @@ MiDebugDumpNonPagedPool(BOOLEAN NewOnly) BLOCK_HDR* current; PLIST_ENTRY current_entry; KIRQL oldIrql; - + KeAcquireSpinLock(&MmNpoolLock, &oldIrql); DbgPrint("******* Dumping non paging pool contents ******\n"); current_entry = UsedBlockListHead.Flink; while (current_entry != &UsedBlockListHead) - { - current = CONTAINING_RECORD(current_entry, BLOCK_HDR, Used.ListEntry); - if (!NewOnly || !current->Used.Dumped) - { - CHAR c1, c2, c3, c4; + { + current = CONTAINING_RECORD(current_entry, BLOCK_HDR, Used.ListEntry); + if (!NewOnly || !current->Used.Dumped) + { + CHAR c1, c2, c3, c4; - c1 = (CHAR)((current->Used.Tag >> 24) & 0xFF); - c2 = (CHAR)((current->Used.Tag >> 16) & 0xFF); - c3 = (CHAR)((current->Used.Tag >> 8) & 0xFF); - c4 = (CHAR)(current->Used.Tag & 0xFF); + c1 = (CHAR)((current->Used.Tag >> 24) & 0xFF); + c2 = (CHAR)((current->Used.Tag >> 16) & 0xFF); + c3 = (CHAR)((current->Used.Tag >> 8) & 0xFF); + c4 = (CHAR)(current->Used.Tag & 0xFF); - if (isprint(c1) && isprint(c2) && isprint(c3) && isprint(c4)) - { - DbgPrint("Size 0x%x Tag 0x%x (%c%c%c%c) Allocator 0x%x\n", - current->Size, current->Used.Tag, c4, c3, c2, c1, - current->Used.Caller); - } - else - { - DbgPrint("Size 0x%x Tag 0x%x Allocator 0x%x\n", - current->Size, current->Used.Tag, current->Used.Caller); - } - current->Used.Dumped = TRUE; - } - current_entry = current_entry->Flink; - } + if (isprint(c1) && isprint(c2) && isprint(c3) && isprint(c4)) + { + DbgPrint("Size 0x%x Tag 0x%x (%c%c%c%c) Allocator 0x%x\n", + current->Size, current->Used.Tag, c4, c3, c2, c1, + current->Used.Caller); + } + else + { + DbgPrint("Size 0x%x Tag 0x%x Allocator 0x%x\n", + current->Size, current->Used.Tag, current->Used.Caller); + } + current->Used.Dumped = TRUE; + } + current_entry = current_entry->Flink; + } DbgPrint("***************** Dump Complete ***************\n"); KeReleaseSpinLock(&MmNpoolLock, oldIrql); #endif /* not WHOLE_PAGE_ALLOCATIONS */ @@ -936,42 +940,42 @@ static void validate_free_list(void) */ { BLOCK_HDR* current; - unsigned int blocks_seen=0; + unsigned int blocks_seen=0; PNODE p; p = avl_get_first(FreeBlockListRoot); while(p) - { - PVOID base_addr; + { + PVOID base_addr; - current = CONTAINING_RECORD(p, BLOCK_HDR, Free.Node); - base_addr = (PVOID)current; + current = CONTAINING_RECORD(p, BLOCK_HDR, Free.Node); + base_addr = (PVOID)current; - if (current->Magic != BLOCK_HDR_FREE_MAGIC) - { - DbgPrint("Bad block magic (probable pool corruption) at %x\n", - current); - KEBUGCHECK(/*KBUG_POOL_FREE_LIST_CORRUPT*/0); - } - - if (base_addr < MiNonPagedPoolStart || - base_addr + BLOCK_HDR_SIZE + current->Size > MiNonPagedPoolStart + MiNonPagedPoolLength) - { - DbgPrint("Block %x found outside pool area\n",current); - DbgPrint("Size %d\n",current->Size); - DbgPrint("Limits are %x %x\n",MiNonPagedPoolStart, - MiNonPagedPoolStart+MiNonPagedPoolLength); - KEBUGCHECK(/*KBUG_POOL_FREE_LIST_CORRUPT*/0); - } - blocks_seen++; - if (blocks_seen > EiNrFreeBlocks) - { - DbgPrint("Too many blocks on free list\n"); - KEBUGCHECK(/*KBUG_POOL_FREE_LIST_CORRUPT*/0); - } - p = avl_get_next(FreeBlockListRoot, p); - } + if (current->Magic != BLOCK_HDR_FREE_MAGIC) + { + DbgPrint("Bad block magic (probable pool corruption) at %x\n", + current); + KEBUGCHECK(/*KBUG_POOL_FREE_LIST_CORRUPT*/0); + } + + if (base_addr < MiNonPagedPoolStart || + base_addr + BLOCK_HDR_SIZE + current->Size > MiNonPagedPoolStart + MiNonPagedPoolLength) + { + DbgPrint("Block %x found outside pool area\n",current); + DbgPrint("Size %d\n",current->Size); + DbgPrint("Limits are %x %x\n",MiNonPagedPoolStart, + MiNonPagedPoolStart+MiNonPagedPoolLength); + KEBUGCHECK(/*KBUG_POOL_FREE_LIST_CORRUPT*/0); + } + blocks_seen++; + if (blocks_seen > EiNrFreeBlocks) + { + DbgPrint("Too many blocks on free list\n"); + KEBUGCHECK(/*KBUG_POOL_FREE_LIST_CORRUPT*/0); + } + p = avl_get_next(FreeBlockListRoot, p); + } } static void validate_used_list(void) @@ -982,49 +986,49 @@ static void validate_used_list(void) BLOCK_HDR* current; PLIST_ENTRY current_entry; unsigned int blocks_seen=0; - + current_entry = UsedBlockListHead.Flink; while (current_entry != &UsedBlockListHead) - { - PVOID base_addr; + { + PVOID base_addr; - current = CONTAINING_RECORD(current_entry, BLOCK_HDR, Used.ListEntry); - base_addr = (PVOID)current; - - if (current->Magic != BLOCK_HDR_USED_MAGIC) - { - DbgPrint("Bad block magic (probable pool corruption) at %x\n", - current); - KEBUGCHECK(/*KBUG_POOL_FREE_LIST_CORRUPT*/0); - } - if (base_addr < MiNonPagedPoolStart || - (base_addr+BLOCK_HDR_SIZE+current->Size) > - MiNonPagedPoolStart+MiNonPagedPoolLength) - { - DbgPrint("Block %x found outside pool area\n",current); - DbgPrint("Size %d\n",current->Size); - DbgPrint("Limits are %x %x\n",MiNonPagedPoolStart, - MiNonPagedPoolStart+MiNonPagedPoolLength); - KEBUGCHECK(/*KBUG_POOL_FREE_LIST_CORRUPT*/0); - } - blocks_seen++; - if (blocks_seen > EiNrUsedBlocks) - { - DbgPrint("Too many blocks on used list\n"); - KEBUGCHECK(/*KBUG_POOL_FREE_LIST_CORRUPT*/0); - } - if (current->Used.ListEntry.Flink != &UsedBlockListHead && - current->Used.ListEntry.Flink->Blink != ¤t->Used.ListEntry) - { - DbgPrint("%s:%d:Break in list (current %x next %x " - "current->next->previous %x)\n", - __FILE__,__LINE__,current, current->Used.ListEntry.Flink, - current->Used.ListEntry.Flink->Blink); - KEBUGCHECK(/*KBUG_POOL_FREE_LIST_CORRUPT*/0); - } + current = CONTAINING_RECORD(current_entry, BLOCK_HDR, Used.ListEntry); + base_addr = (PVOID)current; - current_entry = current_entry->Flink; - } + if (current->Magic != BLOCK_HDR_USED_MAGIC) + { + DbgPrint("Bad block magic (probable pool corruption) at %x\n", + current); + KEBUGCHECK(/*KBUG_POOL_FREE_LIST_CORRUPT*/0); + } + if (base_addr < MiNonPagedPoolStart || + (base_addr+BLOCK_HDR_SIZE+current->Size) > + MiNonPagedPoolStart+MiNonPagedPoolLength) + { + DbgPrint("Block %x found outside pool area\n",current); + DbgPrint("Size %d\n",current->Size); + DbgPrint("Limits are %x %x\n",MiNonPagedPoolStart, + MiNonPagedPoolStart+MiNonPagedPoolLength); + KEBUGCHECK(/*KBUG_POOL_FREE_LIST_CORRUPT*/0); + } + blocks_seen++; + if (blocks_seen > EiNrUsedBlocks) + { + DbgPrint("Too many blocks on used list\n"); + KEBUGCHECK(/*KBUG_POOL_FREE_LIST_CORRUPT*/0); + } + if (current->Used.ListEntry.Flink != &UsedBlockListHead && + current->Used.ListEntry.Flink->Blink != ¤t->Used.ListEntry) + { + DbgPrint("%s:%d:Break in list (current %x next %x " + "current->next->previous %x)\n", + __FILE__,__LINE__,current, current->Used.ListEntry.Flink, + current->Used.ListEntry.Flink->Blink); + KEBUGCHECK(/*KBUG_POOL_FREE_LIST_CORRUPT*/0); + } + + current_entry = current_entry->Flink; + } } static void check_duplicates(BLOCK_HDR* blk) @@ -1044,52 +1048,52 @@ static void check_duplicates(BLOCK_HDR* blk) p = avl_get_first(FreeBlockListRoot); while (p) - { - current = CONTAINING_RECORD(p, BLOCK_HDR, Free.Node); + { + current = CONTAINING_RECORD(p, BLOCK_HDR, Free.Node); - if (current->Magic != BLOCK_HDR_FREE_MAGIC) - { - DbgPrint("Bad block magic (probable pool corruption) at %x\n", - current); - KEBUGCHECK(/*KBUG_POOL_FREE_LIST_CORRUPT*/0); - } - - if ( (char*)current > base && (char*)current < last ) - { - DbgPrint("intersecting blocks on list\n"); - KEBUGCHECK(/*KBUG_POOL_FREE_LIST_CORRUPT*/0); - } - if ( (char*)current < base && - ((char*)current + current->Size + BLOCK_HDR_SIZE) - > base ) - { - DbgPrint("intersecting blocks on list\n"); - KEBUGCHECK(/*KBUG_POOL_FREE_LIST_CORRUPT*/0); - } - p = avl_get_next(FreeBlockListRoot, p); - } + if (current->Magic != BLOCK_HDR_FREE_MAGIC) + { + DbgPrint("Bad block magic (probable pool corruption) at %x\n", + current); + KEBUGCHECK(/*KBUG_POOL_FREE_LIST_CORRUPT*/0); + } + + if ( (char*)current > base && (char*)current < last ) + { + DbgPrint("intersecting blocks on list\n"); + KEBUGCHECK(/*KBUG_POOL_FREE_LIST_CORRUPT*/0); + } + if ( (char*)current < base && + ((char*)current + current->Size + BLOCK_HDR_SIZE) + > base ) + { + DbgPrint("intersecting blocks on list\n"); + KEBUGCHECK(/*KBUG_POOL_FREE_LIST_CORRUPT*/0); + } + p = avl_get_next(FreeBlockListRoot, p); + } current_entry = UsedBlockListHead.Flink; while (current_entry != &UsedBlockListHead) - { - current = CONTAINING_RECORD(current_entry, BLOCK_HDR, Used.ListEntry); + { + current = CONTAINING_RECORD(current_entry, BLOCK_HDR, Used.ListEntry); + + if ( (char*)current > base && (char*)current < last ) + { + DbgPrint("intersecting blocks on list\n"); + KEBUGCHECK(/*KBUG_POOL_FREE_LIST_CORRUPT*/0); + } + if ( (char*)current < base && + ((char*)current + current->Size + BLOCK_HDR_SIZE) + > base ) + { + DbgPrint("intersecting blocks on list\n"); + KEBUGCHECK(/*KBUG_POOL_FREE_LIST_CORRUPT*/0); + } + + current_entry = current_entry->Flink; + } - if ( (char*)current > base && (char*)current < last ) - { - DbgPrint("intersecting blocks on list\n"); - KEBUGCHECK(/*KBUG_POOL_FREE_LIST_CORRUPT*/0); - } - if ( (char*)current < base && - ((char*)current + current->Size + BLOCK_HDR_SIZE) - > base ) - { - DbgPrint("intersecting blocks on list\n"); - KEBUGCHECK(/*KBUG_POOL_FREE_LIST_CORRUPT*/0); - } - - current_entry = current_entry->Flink; - } - } static void validate_kernel_pool(void) @@ -1100,24 +1104,24 @@ static void validate_kernel_pool(void) BLOCK_HDR* current; PLIST_ENTRY current_entry; PNODE p; - + validate_free_list(); validate_used_list(); p = avl_get_first(FreeBlockListRoot); while (p) - { - current = CONTAINING_RECORD(p, BLOCK_HDR, Free.Node); - check_duplicates(current); - p = avl_get_next(FreeBlockListRoot, p); - } + { + current = CONTAINING_RECORD(p, BLOCK_HDR, Free.Node); + check_duplicates(current); + p = avl_get_next(FreeBlockListRoot, p); + } current_entry = UsedBlockListHead.Flink; while (current_entry != &UsedBlockListHead) - { - current = CONTAINING_RECORD(current_entry, BLOCK_HDR, Used.ListEntry); - check_duplicates(current); - current_entry = current_entry->Flink; - } + { + current = CONTAINING_RECORD(current_entry, BLOCK_HDR, Used.ListEntry); + check_duplicates(current); + current_entry = current_entry->Flink; + } } #endif @@ -1125,91 +1129,93 @@ static void validate_kernel_pool(void) STATIC VOID free_pages(BLOCK_HDR* blk) { - ULONG start; - ULONG end; - ULONG i; + ULONG start; + ULONG end; + ULONG i; - start = (ULONG)blk; - end = (ULONG)blk + BLOCK_HDR_SIZE + blk->Size; + start = (ULONG)blk; + end = (ULONG)blk + BLOCK_HDR_SIZE + blk->Size; - /* - * If the block doesn't contain a whole page then there is nothing to do - */ - if (PAGE_ROUND_UP(start) >= PAGE_ROUND_DOWN(end)) - { + /* + * If the block doesn't contain a whole page then there is nothing to do + */ + if (PAGE_ROUND_UP(start) >= PAGE_ROUND_DOWN(end)) + { return; - } + } } #endif static void remove_from_used_list(BLOCK_HDR* current) { - RemoveEntryList(¤t->Used.ListEntry); - EiUsedNonPagedPool -= current->Size; - EiNrUsedBlocks--; + RemoveEntryList(¤t->Used.ListEntry); + EiUsedNonPagedPool -= current->Size; + EiNrUsedBlocks--; } static void remove_from_free_list(BLOCK_HDR* current) { - DPRINT("remove_from_free_list %d\n", current->Size); + DPRINT("remove_from_free_list %d\n", current->Size); - avl_remove(&FreeBlockListRoot, ¤t->Free.Node, compare_node); + avl_remove(&FreeBlockListRoot, ¤t->Free.Node, compare_node); - EiFreeNonPagedPool -= current->Size; - EiNrFreeBlocks--; - DPRINT("remove_from_free_list done\n"); + EiFreeNonPagedPool -= current->Size; + EiNrFreeBlocks--; + DPRINT("remove_from_free_list done\n"); #ifdef DUMP_AVL - DumpFreeBlockTree(); + + DumpFreeBlockTree(); #endif } -static void +static void add_to_free_list(BLOCK_HDR* blk) /* * FUNCTION: add the block to the free list (internal) */ { - BLOCK_HDR* current; - BOOL UpdatePrevPtr = FALSE; + BLOCK_HDR* current; + BOOL UpdatePrevPtr = FALSE; - DPRINT("add_to_free_list (%d)\n", blk->Size); + DPRINT("add_to_free_list (%d)\n", blk->Size); - EiNrFreeBlocks++; - - current = blk->previous; - if (current && current->Magic == BLOCK_HDR_FREE_MAGIC) - { + EiNrFreeBlocks++; + + current = blk->previous; + if (current && current->Magic == BLOCK_HDR_FREE_MAGIC) + { remove_from_free_list(current); current->Size = current->Size + BLOCK_HDR_SIZE + blk->Size; current->Magic = BLOCK_HDR_USED_MAGIC; memset(blk, 0xcc, BLOCK_HDR_SIZE); blk = current; UpdatePrevPtr = TRUE; - } + } - current = (BLOCK_HDR*)((char*)blk + BLOCK_HDR_SIZE + blk->Size); - if ((char*)current < (char*)MiNonPagedPoolStart + MiNonPagedPoolLength && - current->Magic == BLOCK_HDR_FREE_MAGIC) - { + current = (BLOCK_HDR*)((char*)blk + BLOCK_HDR_SIZE + blk->Size); + if ((char*)current < (char*)MiNonPagedPoolStart + MiNonPagedPoolLength && + current->Magic == BLOCK_HDR_FREE_MAGIC) + { remove_from_free_list(current); blk->Size += BLOCK_HDR_SIZE + current->Size; memset(current, 0xcc, BLOCK_HDR_SIZE); UpdatePrevPtr = TRUE; current = (BLOCK_HDR*)((char*)blk + BLOCK_HDR_SIZE + blk->Size); - } - if (UpdatePrevPtr && - (char*)current < (char*)MiNonPagedPoolStart + MiNonPagedPoolLength) - { + } + if (UpdatePrevPtr && + (char*)current < (char*)MiNonPagedPoolStart + MiNonPagedPoolLength) + { current->previous = blk; - } - DPRINT("%d\n", blk->Size); - blk->Magic = BLOCK_HDR_FREE_MAGIC; - EiFreeNonPagedPool += blk->Size; - avl_insert(&FreeBlockListRoot, &blk->Free.Node, compare_node); + } + DPRINT("%d\n", blk->Size); + blk->Magic = BLOCK_HDR_FREE_MAGIC; + EiFreeNonPagedPool += blk->Size; + avl_insert(&FreeBlockListRoot, &blk->Free.Node, compare_node); - DPRINT("add_to_free_list done\n"); + DPRINT("add_to_free_list done\n"); #ifdef DUMP_AVL - DumpFreeBlockTree(); + + DumpFreeBlockTree(); #endif } @@ -1218,9 +1224,9 @@ static void add_to_used_list(BLOCK_HDR* blk) * FUNCTION: add the block to the used list (internal) */ { - InsertHeadList(&UsedBlockListHead, &blk->Used.ListEntry); - EiUsedNonPagedPool += blk->Size; - EiNrUsedBlocks++; + InsertHeadList(&UsedBlockListHead, &blk->Used.ListEntry); + EiUsedNonPagedPool += blk->Size; + EiNrUsedBlocks++; } inline static void* block_to_address(BLOCK_HDR* blk) @@ -1229,13 +1235,13 @@ inline static void* block_to_address(BLOCK_HDR* blk) * address (internal) */ { - return ( (void *) ((char*)blk + BLOCK_HDR_SIZE)); + return ( (void *) ((char*)blk + BLOCK_HDR_SIZE)); } inline static BLOCK_HDR* address_to_block(void* addr) { - return (BLOCK_HDR *) - ( ((char*)addr) - BLOCK_HDR_SIZE ); + return (BLOCK_HDR *) + ( ((char*)addr) - BLOCK_HDR_SIZE ); } static BOOLEAN @@ -1250,42 +1256,45 @@ grow_block(BLOCK_HDR* blk, PVOID end) end = (PVOID)PAGE_ROUND_UP(end); index = (ULONG)((char*)start - (char*)MiNonPagedPoolStart) / PAGE_SIZE; while (start < end) - { - if (!(MiNonPagedPoolAllocMap[index / 32] & (1 << (index % 32)))) + { + if (!(MiNonPagedPoolAllocMap[index / 32] & (1 << (index % 32)))) + { + Status = MmRequestPageMemoryConsumer(MC_NPPOOL, FALSE, &Page); + if (!NT_SUCCESS(Status)) { - Status = MmRequestPageMemoryConsumer(MC_NPPOOL, FALSE, &Page); - if (!NT_SUCCESS(Status)) - { - result = FALSE; - break; - } - Status = MmCreateVirtualMapping(NULL, - start, - PAGE_READWRITE|PAGE_SYSTEM, - Page, - FALSE); - if (!NT_SUCCESS(Status)) - { - DbgPrint("Unable to create virtual mapping\n"); - MmReleasePageMemoryConsumer(MC_NPPOOL, Page); - result = FALSE; - break; - } - MiNonPagedPoolAllocMap[index / 32] |= (1 << (index % 32)); - memset(start, 0xcc, PAGE_SIZE); - MiNonPagedPoolNrOfPages++; - } - index++; + result = FALSE; + break; + } + Status = MmCreateVirtualMapping(NULL, + start, + PAGE_READWRITE|PAGE_SYSTEM, + Page, + FALSE); + if (!NT_SUCCESS(Status)) + { + DbgPrint("Unable to create virtual mapping\n"); + MmReleasePageMemoryConsumer(MC_NPPOOL, Page); + result = FALSE; + break; + } + MiNonPagedPoolAllocMap[index / 32] |= (1 << (index % 32)); + memset(start, 0xcc, PAGE_SIZE); + MiNonPagedPoolNrOfPages++; + } + index++; #if defined(__GNUC__) - start += PAGE_SIZE; + + start += PAGE_SIZE; #else - { - char* pTemp = start; - pTemp += PAGE_SIZE; - start = pTemp; - } + + { + char* pTemp = start; + pTemp += PAGE_SIZE; + start = pTemp; + } #endif - } + + } return result; } @@ -1296,164 +1305,164 @@ static BLOCK_HDR* get_block(unsigned int size, unsigned long alignment) PVOID end; PVOID addr, aligned_addr; PNODE p; - + DPRINT("get_block %d\n", size); if (alignment == 0) - { - p = avl_find_equal_or_greater(FreeBlockListRoot, size, compare_value); - if (p) - { - best = CONTAINING_RECORD(p, BLOCK_HDR, Free.Node); - addr = block_to_address(best); - } - } + { + p = avl_find_equal_or_greater(FreeBlockListRoot, size, compare_value); + if (p) + { + best = CONTAINING_RECORD(p, BLOCK_HDR, Free.Node); + addr = block_to_address(best); + } + } else - { - p = avl_find_equal_or_greater(FreeBlockListRoot, size, compare_value); + { + p = avl_find_equal_or_greater(FreeBlockListRoot, size, compare_value); - while(p) + while(p) + { + current = CONTAINING_RECORD(p, BLOCK_HDR, Free.Node); + addr = block_to_address(current); + /* calculate first aligned address available within this block */ + aligned_addr = MM_ROUND_UP(addr, alignment); + /* check to see if this address is already aligned */ + if (addr == aligned_addr) { - current = CONTAINING_RECORD(p, BLOCK_HDR, Free.Node); - addr = block_to_address(current); - /* calculate first aligned address available within this block */ - aligned_addr = MM_ROUND_UP(addr, alignment); - /* check to see if this address is already aligned */ - if (addr == aligned_addr) - { - if (current->Size >= size && - (best == NULL || current->Size < best->Size)) - { - best = current; - } - } - else - { - /* make sure there's enough room to make a free block by the space skipped - * from alignment. If not, calculate forward to the next alignment - * and see if we allocate there... - */ + if (current->Size >= size && + (best == NULL || current->Size < best->Size)) + { + best = current; + } + } + else + { + /* make sure there's enough room to make a free block by the space skipped + * from alignment. If not, calculate forward to the next alignment + * and see if we allocate there... + */ + new_size = (ULONG)aligned_addr - (ULONG)addr + size; + if ((ULONG)aligned_addr - (ULONG)addr < BLOCK_HDR_SIZE) + { + /* not enough room for a free block header, add some more bytes */ + aligned_addr = MM_ROUND_UP(block_to_address((BLOCK_HDR*)((char*)current + BLOCK_HDR_SIZE)), alignment); new_size = (ULONG)aligned_addr - (ULONG)addr + size; - if ((ULONG)aligned_addr - (ULONG)addr < BLOCK_HDR_SIZE) - { - /* not enough room for a free block header, add some more bytes */ - aligned_addr = MM_ROUND_UP(block_to_address((BLOCK_HDR*)((char*)current + BLOCK_HDR_SIZE)), alignment); - new_size = (ULONG)aligned_addr - (ULONG)addr + size; - } - if (current->Size >= new_size && - (best == NULL || current->Size < best->Size)) - { - best = current; - } - } - if (best && current->Size >= size + alignment + 2 * BLOCK_HDR_SIZE) - { - break; - } - p = avl_get_next(FreeBlockListRoot, p); + } + if (current->Size >= new_size && + (best == NULL || current->Size < best->Size)) + { + best = current; + } + } + if (best && current->Size >= size + alignment + 2 * BLOCK_HDR_SIZE) + { + break; + } + p = avl_get_next(FreeBlockListRoot, p); - } - } + } + } /* * We didn't find anything suitable at all. */ if (best == NULL) - { - return NULL; - } + { + return NULL; + } current = best; current_size = current->Size; if (alignment > 0) - { - addr = block_to_address(current); - aligned_addr = MM_ROUND_UP(addr, alignment); - if (addr != aligned_addr) + { + addr = block_to_address(current); + aligned_addr = MM_ROUND_UP(addr, alignment); + if (addr != aligned_addr) + { + blk = address_to_block(aligned_addr); + if ((char*)blk < (char*)current + BLOCK_HDR_SIZE) { - blk = address_to_block(aligned_addr); - if ((char*)blk < (char*)current + BLOCK_HDR_SIZE) - { - aligned_addr = MM_ROUND_UP(block_to_address((BLOCK_HDR*)((char*)current + BLOCK_HDR_SIZE)), alignment); - blk = address_to_block(aligned_addr); - } - /* - * if size-aligned, break off the preceding bytes into their own block... - */ - previous = current; - previous_size = (ULONG)blk - (ULONG)previous - BLOCK_HDR_SIZE; - current = blk; - current_size -= ((ULONG)current - (ULONG)previous); - } - } + aligned_addr = MM_ROUND_UP(block_to_address((BLOCK_HDR*)((char*)current + BLOCK_HDR_SIZE)), alignment); + blk = address_to_block(aligned_addr); + } + /* + * if size-aligned, break off the preceding bytes into their own block... + */ + previous = current; + previous_size = (ULONG)blk - (ULONG)previous - BLOCK_HDR_SIZE; + current = blk; + current_size -= ((ULONG)current - (ULONG)previous); + } + } end = (char*)current + BLOCK_HDR_SIZE + size; if (current_size >= size + BLOCK_HDR_SIZE + MM_POOL_ALIGNMENT) - { - /* create a new free block after our block, if the memory size is >= 4 byte for this block */ - next = (BLOCK_HDR*)((ULONG)current + size + BLOCK_HDR_SIZE); - next_size = current_size - size - BLOCK_HDR_SIZE; - current_size = size; - end = (char*)next + BLOCK_HDR_SIZE; - } + { + /* create a new free block after our block, if the memory size is >= 4 byte for this block */ + next = (BLOCK_HDR*)((ULONG)current + size + BLOCK_HDR_SIZE); + next_size = current_size - size - BLOCK_HDR_SIZE; + current_size = size; + end = (char*)next + BLOCK_HDR_SIZE; + } if (previous) - { - remove_from_free_list(previous); - if (!grow_block(previous, end)) + { + remove_from_free_list(previous); + if (!grow_block(previous, end)) + { + add_to_free_list(previous); + return NULL; + } + memset(current, 0, BLOCK_HDR_SIZE); + current->Size = current_size; + current->Magic = BLOCK_HDR_USED_MAGIC; + current->previous = previous; + previous->Size = previous_size; + if (next == NULL) + { + blk = (BLOCK_HDR*)((char*)current + BLOCK_HDR_SIZE + current->Size); + if ((char*)blk < (char*)MiNonPagedPoolStart + MiNonPagedPoolLength) { - add_to_free_list(previous); - return NULL; - } - memset(current, 0, BLOCK_HDR_SIZE); - current->Size = current_size; - current->Magic = BLOCK_HDR_USED_MAGIC; - current->previous = previous; - previous->Size = previous_size; - if (next == NULL) - { - blk = (BLOCK_HDR*)((char*)current + BLOCK_HDR_SIZE + current->Size); - if ((char*)blk < (char*)MiNonPagedPoolStart + MiNonPagedPoolLength) - { - blk->previous = current; - } - } + blk->previous = current; + } + } - add_to_free_list(previous); - } + add_to_free_list(previous); + } else - { - remove_from_free_list(current); + { + remove_from_free_list(current); - if (!grow_block(current, end)) - { - add_to_free_list(current); - return NULL; - } + if (!grow_block(current, end)) + { + add_to_free_list(current); + return NULL; + } + + current->Magic = BLOCK_HDR_USED_MAGIC; + if (next) + { + current->Size = current_size; + } + } - current->Magic = BLOCK_HDR_USED_MAGIC; - if (next) - { - current->Size = current_size; - } - } - if (next) - { - memset(next, 0, BLOCK_HDR_SIZE); + { + memset(next, 0, BLOCK_HDR_SIZE); - next->Size = next_size; - next->Magic = BLOCK_HDR_FREE_MAGIC; - next->previous = current; - blk = (BLOCK_HDR*)((char*)next + BLOCK_HDR_SIZE + next->Size); - if ((char*)blk < (char*)MiNonPagedPoolStart + MiNonPagedPoolLength) - { - blk->previous = next; - } - add_to_free_list(next); - } + next->Size = next_size; + next->Magic = BLOCK_HDR_FREE_MAGIC; + next->previous = current; + blk = (BLOCK_HDR*)((char*)next + BLOCK_HDR_SIZE + next->Size); + if ((char*)blk < (char*)MiNonPagedPoolStart + MiNonPagedPoolLength) + { + blk->previous = next; + } + add_to_free_list(next); + } add_to_used_list(current); VALIDATE_POOL; @@ -1473,19 +1482,19 @@ VOID STDCALL ExFreeNonPagedPool (PVOID block) KIRQL oldIrql; if (block == NULL) - { - return; - } + { + return; + } DPRINT("freeing block %x\n",blk); - + POOL_TRACE("ExFreePool(block %x), size %d, caller %x\n",block,blk->size, - ((PULONG)&block)[-1]); - + ((PULONG)&block)[-1]); + KeAcquireSpinLock(&MmNpoolLock, &oldIrql); ExFreeWholePageBlock(block); - KeReleaseSpinLock(&MmNpoolLock, oldIrql); + KeReleaseSpinLock(&MmNpoolLock, oldIrql); #else /* not WHOLE_PAGE_ALLOCATIONS */ @@ -1493,38 +1502,40 @@ VOID STDCALL ExFreeNonPagedPool (PVOID block) KIRQL oldIrql; if (block == NULL) - { - return; - } + { + return; + } DPRINT("freeing block %x\n",blk); - + POOL_TRACE("ExFreePool(block %x), size %d, caller %x\n",block,blk->Size, - ((PULONG)&block)[-1]); - + ((PULONG)&block)[-1]); + KeAcquireSpinLock(&MmNpoolLock, &oldIrql); VALIDATE_POOL; - + if (blk->Magic != BLOCK_HDR_USED_MAGIC) - { - if (blk->Magic == BLOCK_HDR_FREE_MAGIC) - { - DbgPrint("ExFreePool of already freed address %x\n", block); - } - else - { - DbgPrint("ExFreePool of non-allocated address %x (magic %x)\n", - block, blk->Magic); - } - KEBUGCHECK(0); - return; - } - + { + if (blk->Magic == BLOCK_HDR_FREE_MAGIC) + { + DbgPrint("ExFreePool of already freed address %x\n", block); + } + else + { + DbgPrint("ExFreePool of non-allocated address %x (magic %x)\n", + block, blk->Magic); + } + KEBUGCHECK(0); + return; + } + memset(block, 0xcc, blk->Size); #ifdef TAG_STATISTICS_TRACKING + MiRemoveFromTagHashTable(blk); #endif + remove_from_used_list(blk); blk->Magic = BLOCK_HDR_FREE_MAGIC; add_to_free_list(blk); @@ -1534,46 +1545,47 @@ VOID STDCALL ExFreeNonPagedPool (PVOID block) #endif /* WHOLE_PAGE_ALLOCATIONS */ } -PVOID STDCALL +PVOID STDCALL ExAllocateNonPagedPoolWithTag(ULONG Type, ULONG Size, ULONG Tag, PVOID Caller) { #ifdef WHOLE_PAGE_ALLOCATIONS PVOID block; KIRQL oldIrql; - + POOL_TRACE("ExAllocatePool(NumberOfBytes %d) caller %x ", - Size,Caller); - + Size,Caller); + KeAcquireSpinLock(&MmNpoolLock, &oldIrql); - + /* * accomodate this useful idiom */ if (Size == 0) - { - POOL_TRACE("= NULL\n"); - KeReleaseSpinLock(&MmNpoolLock, oldIrql); - return(NULL); - } + { + POOL_TRACE("= NULL\n"); + KeReleaseSpinLock(&MmNpoolLock, oldIrql); + return(NULL); + } block = ExAllocateWholePageBlock(Size); KeReleaseSpinLock(&MmNpoolLock, oldIrql); if (NULL == block) - { - DPRINT1("Trying to allocate %lu bytes from nonpaged pool - nothing suitable found, returning NULL\n", - Size ); - } + { + DPRINT1("Trying to allocate %lu bytes from nonpaged pool - nothing suitable found, returning NULL\n", + Size ); + } return(block); #else /* not WHOLE_PAGE_ALLOCATIONS */ + PVOID block; BLOCK_HDR* best = NULL; KIRQL oldIrql; ULONG alignment; - + POOL_TRACE("ExAllocatePool(NumberOfBytes %d) caller %x ", - Size,Caller); - + Size,Caller); + KeAcquireSpinLock(&MmNpoolLock, &oldIrql); VALIDATE_POOL; @@ -1581,131 +1593,134 @@ ExAllocateNonPagedPoolWithTag(ULONG Type, ULONG Size, ULONG Tag, PVOID Caller) #if 0 /* after some allocations print the npaged pool stats */ #ifdef TAG_STATISTICS_TRACKING + { - static ULONG counter = 0; - if (counter++ % 100000 == 0) - { - MiDebugDumpNonPagedPoolStats(FALSE); - } + static ULONG counter = 0; + if (counter++ % 100000 == 0) + { + MiDebugDumpNonPagedPoolStats(FALSE); + } } #endif #endif /* - * accomodate this useful idiom - */ + * accomodate this useful idiom + */ if (Size == 0) - { - POOL_TRACE("= NULL\n"); - KeReleaseSpinLock(&MmNpoolLock, oldIrql); - return(NULL); - } - /* Make the size dword alligned, this makes the block dword alligned */ + { + POOL_TRACE("= NULL\n"); + KeReleaseSpinLock(&MmNpoolLock, oldIrql); + return(NULL); + } + /* Make the size dword alligned, this makes the block dword alligned */ Size = ROUND_UP(Size, MM_POOL_ALIGNMENT); if (Size >= PAGE_SIZE) - { - alignment = PAGE_SIZE; - } + { + alignment = PAGE_SIZE; + } else if (Type == NonPagedPoolCacheAligned || Type == NonPagedPoolCacheAlignedMustS) - { - alignment = MM_CACHE_LINE_SIZE; - } + { + alignment = MM_CACHE_LINE_SIZE; + } else - { - alignment = 0; - } + { + alignment = 0; + } best = get_block(Size, alignment); if (best == NULL) - { + { KeReleaseSpinLock(&MmNpoolLock, oldIrql); DPRINT1("Trying to allocate %lu bytes from nonpaged pool - nothing suitable found, returning NULL\n", Size ); return NULL; - } + } best->Used.Tag = Tag; best->Used.Caller = Caller; best->Used.Dumped = FALSE; best->Used.TagListEntry.Flink = best->Used.TagListEntry.Blink = NULL; #ifdef TAG_STATISTICS_TRACKING + MiAddToTagHashTable(best); #endif + KeReleaseSpinLock(&MmNpoolLock, oldIrql); block = block_to_address(best); -/* RtlZeroMemory(block, Size);*/ + /* RtlZeroMemory(block, Size);*/ return(block); #endif /* WHOLE_PAGE_ALLOCATIONS */ } #ifdef WHOLE_PAGE_ALLOCATIONS -PVOID STDCALL +PVOID STDCALL ExAllocateWholePageBlock(ULONG Size) { - PVOID Address; - PHYSICAL_ADDRESS Page; - ULONG i; - ULONG NrPages; - ULONG Base; + PVOID Address; + PHYSICAL_ADDRESS Page; + ULONG i; + ULONG NrPages; + ULONG Base; - NrPages = ROUND_UP(Size, PAGE_SIZE) / PAGE_SIZE; + NrPages = ROUND_UP(Size, PAGE_SIZE) / PAGE_SIZE; - Base = RtlFindClearBitsAndSet(&NonPagedPoolAllocMap, NrPages + 1, NonPagedPoolAllocMapHint); - if (Base == 0xffffffff) - { + Base = RtlFindClearBitsAndSet(&NonPagedPoolAllocMap, NrPages + 1, NonPagedPoolAllocMapHint); + if (Base == 0xffffffff) + { DbgPrint("Out of non paged pool space.\n"); KEBUGCHECK(0); - } - if (NonPagedPoolAllocMapHint == Base) - { + } + if (NonPagedPoolAllocMapHint == Base) + { NonPagedPoolAllocMapHint += (NrPages + 1); - } - Address = MiNonPagedPoolStart + Base * PAGE_SIZE; + } + Address = MiNonPagedPoolStart + Base * PAGE_SIZE; - for (i = 0; i < NrPages; i++) - { + for (i = 0; i < NrPages; i++) + { Page = MmAllocPage(MC_NPPOOL, 0); if (Page.QuadPart == 0LL) - { - KEBUGCHECK(0); - } - MmCreateVirtualMapping(NULL, - Address + (i * PAGE_SIZE), - PAGE_READWRITE | PAGE_SYSTEM, - Page, - TRUE); - } + { + KEBUGCHECK(0); + } + MmCreateVirtualMapping(NULL, + Address + (i * PAGE_SIZE), + PAGE_READWRITE | PAGE_SYSTEM, + Page, + TRUE); + } - MiCurrentNonPagedPoolLength = max(MiCurrentNonPagedPoolLength, (Base + NrPages) * PAGE_SIZE); - Size = (Size + 7) & ~7; - return((PVOID)((PUCHAR)Address + (NrPages * PAGE_SIZE) - Size)); + MiCurrentNonPagedPoolLength = max(MiCurrentNonPagedPoolLength, (Base + NrPages) * PAGE_SIZE); + Size = (Size + 7) & ~7; + return((PVOID)((PUCHAR)Address + (NrPages * PAGE_SIZE) - Size)); } VOID STDCALL ExFreeWholePageBlock(PVOID Addr) { - ULONG Base; - - if (Addr < MiNonPagedPoolStart || - Addr >= (MiNonPagedPoolStart + MiCurrentNonPagedPoolLength)) - { + ULONG Base; + + if (Addr < MiNonPagedPoolStart || + Addr >= (MiNonPagedPoolStart + MiCurrentNonPagedPoolLength)) + { DbgPrint("Block %x found outside pool area\n", Addr); KEBUGCHECK(0); - } - Base = (Addr - MiNonPagedPoolStart) / PAGE_SIZE; - NonPagedPoolAllocMapHint = min(NonPagedPoolAllocMapHint, Base); - while (MmIsPagePresent(NULL, Addr)) - { + } + Base = (Addr - MiNonPagedPoolStart) / PAGE_SIZE; + NonPagedPoolAllocMapHint = min(NonPagedPoolAllocMapHint, Base); + while (MmIsPagePresent(NULL, Addr)) + { MmDeleteVirtualMapping(NULL, - Addr, - TRUE, - NULL, - NULL); + Addr, + TRUE, + NULL, + NULL); RtlClearBits(&NonPagedPoolAllocMap, Base, 1); Base++; Addr += PAGE_SIZE; - } + } } #endif /* WHOLE_PAGE_ALLOCATIONS */ @@ -1713,77 +1728,81 @@ ExFreeWholePageBlock(PVOID Addr) VOID INIT_FUNCTION MiInitializeNonPagedPool(VOID) { - NTSTATUS Status; - PHYSICAL_ADDRESS Page; - ULONG i; - PVOID Address; + NTSTATUS Status; + PHYSICAL_ADDRESS Page; + ULONG i; + PVOID Address; #ifdef WHOLE_PAGE_ALLOCATIONS #else - BLOCK_HDR* blk; + + BLOCK_HDR* blk; #endif #ifdef TAG_STATISTICS_TRACKING - for (i = 0; i < TAG_HASH_TABLE_SIZE; i++) - { + + for (i = 0; i < TAG_HASH_TABLE_SIZE; i++) + { InitializeListHead(&tag_hash_table[i]); - } + } #endif KeInitializeSpinLock(&MmNpoolLock); InitializeListHead(&UsedBlockListHead); InitializeListHead(&AddressListHead); FreeBlockListRoot = NULL; #ifdef WHOLE_PAGE_ALLOCATIONS + NonPagedPoolAllocMapHint = PAGE_ROUND_UP(MiNonPagedPoolLength / PAGE_SIZE / 8) / PAGE_SIZE; MiCurrentNonPagedPoolLength = NonPagedPoolAllocMapHint * PAGE_SIZE; Address = MiNonPagedPoolStart; for (i = 0; i < NonPagedPoolAllocMapHint; i++) - { - Status = MmRequestPageMemoryConsumer(MC_NPPOOL, FALSE, &Page); - if (!NT_SUCCESS(Status)) - { - DbgPrint("Unable to allocate a page\n"); - KEBUGCHECK(0); - } - Status = MmCreateVirtualMapping(NULL, - Address, - PAGE_READWRITE|PAGE_SYSTEM, - Page, - FALSE); - if (!NT_SUCCESS(Status)) - { - DbgPrint("Unable to create virtual mapping\n"); - KEBUGCHECK(0); - } - Address += PAGE_SIZE; - } + { + Status = MmRequestPageMemoryConsumer(MC_NPPOOL, FALSE, &Page); + if (!NT_SUCCESS(Status)) + { + DbgPrint("Unable to allocate a page\n"); + KEBUGCHECK(0); + } + Status = MmCreateVirtualMapping(NULL, + Address, + PAGE_READWRITE|PAGE_SYSTEM, + Page, + FALSE); + if (!NT_SUCCESS(Status)) + { + DbgPrint("Unable to create virtual mapping\n"); + KEBUGCHECK(0); + } + Address += PAGE_SIZE; + } RtlInitializeBitMap(&NonPagedPoolAllocMap, MiNonPagedPoolStart, MM_NONPAGED_POOL_SIZE / PAGE_SIZE); - RtlClearAllBits(&NonPagedPoolAllocMap); + RtlClearAllBits(&NonPagedPoolAllocMap); RtlSetBits(&NonPagedPoolAllocMap, 0, NonPagedPoolAllocMapHint); #else + MiNonPagedPoolAllocMap = block_to_address((BLOCK_HDR*)MiNonPagedPoolStart); MiNonPagedPoolNrOfPages = PAGE_ROUND_UP(ROUND_UP(MiNonPagedPoolLength / PAGE_SIZE, 32) / 8 + 2 * BLOCK_HDR_SIZE); MiNonPagedPoolNrOfPages /= PAGE_SIZE; Address = MiNonPagedPoolStart; for (i = 0; i < MiNonPagedPoolNrOfPages; i++) - { - Status = MmRequestPageMemoryConsumer(MC_NPPOOL, FALSE, &Page); - if (!NT_SUCCESS(Status)) - { - DbgPrint("Unable to allocate a page\n"); - KEBUGCHECK(0); - } - Status = MmCreateVirtualMapping(NULL, - Address, - PAGE_READWRITE|PAGE_SYSTEM, - Page, - FALSE); - if (!NT_SUCCESS(Status)) - { - DbgPrint("Unable to create virtual mapping\n"); - KEBUGCHECK(0); - } - MiNonPagedPoolAllocMap[i / 32] |= (1 << (i % 32)); - Address = (PVOID)((ULONG_PTR)Address + PAGE_SIZE); - } + { + Status = MmRequestPageMemoryConsumer(MC_NPPOOL, FALSE, &Page); + if (!NT_SUCCESS(Status)) + { + DbgPrint("Unable to allocate a page\n"); + KEBUGCHECK(0); + } + Status = MmCreateVirtualMapping(NULL, + Address, + PAGE_READWRITE|PAGE_SYSTEM, + Page, + FALSE); + if (!NT_SUCCESS(Status)) + { + DbgPrint("Unable to create virtual mapping\n"); + KEBUGCHECK(0); + } + MiNonPagedPoolAllocMap[i / 32] |= (1 << (i % 32)); + Address = (PVOID)((ULONG_PTR)Address + PAGE_SIZE); + } /* the first block contains the non paged pool bitmap */ blk = (BLOCK_HDR*)MiNonPagedPoolStart; memset(blk, 0, BLOCK_HDR_SIZE); @@ -1795,6 +1814,7 @@ MiInitializeNonPagedPool(VOID) blk->Used.Dumped = FALSE; add_to_used_list(blk); #ifdef TAG_STATISTICS_TRACKING + MiAddToTagHashTable(blk); #endif /* the second block is the first free block */ diff --git a/reactos/ntoskrnl/mm/pagefile.c b/reactos/ntoskrnl/mm/pagefile.c index e205f72c9cb..7583f681cb4 100644 --- a/reactos/ntoskrnl/mm/pagefile.c +++ b/reactos/ntoskrnl/mm/pagefile.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: pagefile.c,v 1.42 2004/03/04 00:07:01 navaraf Exp $ +/* $Id: pagefile.c,v 1.43 2004/04/10 22:35:25 gdalsnes Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/pagefile.c @@ -53,18 +53,19 @@ typedef struct _PAGINGFILE KSPIN_LOCK AllocMapLock; ULONG AllocMapSize; PGET_RETRIEVAL_DESCRIPTOR RetrievalPointers; -} PAGINGFILE, *PPAGINGFILE; +} +PAGINGFILE, *PPAGINGFILE; typedef struct _RETRIEVEL_DESCRIPTOR_LIST { - struct _RETRIEVEL_DESCRIPTOR_LIST* Next; - GET_RETRIEVAL_DESCRIPTOR RetrievalPointers; + struct _RETRIEVEL_DESCRIPTOR_LIST* Next; + GET_RETRIEVAL_DESCRIPTOR RetrievalPointers; } RETRIEVEL_DESCRIPTOR_LIST, *PRETRIEVEL_DESCRIPTOR_LIST; /* GLOBALS *******************************************************************/ -#define PAIRS_PER_RUN (1024) +#define PAIRS_PER_RUN (1024) #define MAX_PAGING_FILES (32) @@ -83,12 +84,12 @@ static ULONG MiFreeSwapPages; /* Number of pages that have been allocated for swapping */ static ULONG MiUsedSwapPages; -/* +/* * Number of pages that have been reserved for swapping but not yet allocated */ static ULONG MiReservedSwapPages; -/* +/* * Ratio between reserved and available swap pages, e.g. setting this to five * forces one swap page to be available for every five swap pages that are * reserved. Setting this to zero turns off commit checking altogether. @@ -126,11 +127,11 @@ static BOOLEAN MmSwapSpaceMessage = FALSE; VOID MmShowOutOfSpaceMessagePagingFile(VOID) { - if (!MmSwapSpaceMessage) - { + if (!MmSwapSpaceMessage) + { DPRINT1("MM: Out of swap space.\n"); MmSwapSpaceMessage = TRUE; - } + } } LARGE_INTEGER STATIC @@ -141,46 +142,51 @@ MmGetOffsetPageFile(PGET_RETRIEVAL_DESCRIPTOR RetrievalPointers, LARGE_INTEGER O first = 0; last = RetrievalPointers->NumberOfPairs - 1; while (first <= last) - { - mid = (last - first) / 2 + first; - if ((ULONGLONG) Offset.QuadPart < RetrievalPointers->Pair[mid].Vcn) + { + mid = (last - first) / 2 + first; + if ((ULONGLONG) Offset.QuadPart < RetrievalPointers->Pair[mid].Vcn) + { + if (mid == 0) { - if (mid == 0) - { - Offset.QuadPart += RetrievalPointers->Pair[0].Lcn - RetrievalPointers->StartVcn; - return Offset; - } - else - { - if ((ULONGLONG) Offset.QuadPart >= RetrievalPointers->Pair[mid-1].Vcn) - { - Offset.QuadPart += RetrievalPointers->Pair[mid].Lcn - RetrievalPointers->Pair[mid-1].Vcn; - return Offset; - } - last = mid - 1; - } - } - else + Offset.QuadPart += RetrievalPointers->Pair[0].Lcn - RetrievalPointers->StartVcn; + return Offset; + } + else { - if (mid == RetrievalPointers->NumberOfPairs - 1) - { - break; - } - if ((ULONGLONG) Offset.QuadPart < RetrievalPointers->Pair[mid+1].Vcn) - { - Offset.QuadPart += RetrievalPointers->Pair[mid+1].Lcn - RetrievalPointers->Pair[mid].Vcn; - return Offset; - } - first = mid + 1; - } - } + if ((ULONGLONG) Offset.QuadPart >= RetrievalPointers->Pair[mid-1].Vcn) + { + Offset.QuadPart += RetrievalPointers->Pair[mid].Lcn - RetrievalPointers->Pair[mid-1].Vcn; + return Offset; + } + last = mid - 1; + } + } + else + { + if (mid == RetrievalPointers->NumberOfPairs - 1) + { + break; + } + if ((ULONGLONG) Offset.QuadPart < RetrievalPointers->Pair[mid+1].Vcn) + { + Offset.QuadPart += RetrievalPointers->Pair[mid+1].Lcn - RetrievalPointers->Pair[mid].Vcn; + return Offset; + } + first = mid + 1; + } + } KEBUGCHECK(0); #if defined(__GNUC__) + return (LARGE_INTEGER)0LL; #else + { - const LARGE_INTEGER dummy = { 0 }; - return dummy; + const LARGE_INTEGER dummy = + { + 0 + }; + return dummy; } #endif } @@ -194,37 +200,37 @@ NTSTATUS MmWriteToSwapPage(SWAPENTRY SwapEntry, PMDL Mdl) KEVENT Event; DPRINT("MmWriteToSwapPage\n"); - + if (SwapEntry == 0) - { - KEBUGCHECK(0); - return(STATUS_UNSUCCESSFUL); - } - + { + KEBUGCHECK(0); + return(STATUS_UNSUCCESSFUL); + } + i = FILE_FROM_ENTRY(SwapEntry); offset = OFFSET_FROM_ENTRY(SwapEntry); if (i >= MAX_PAGING_FILES) - { - DPRINT1("Bad swap entry 0x%.8X\n", SwapEntry); - KEBUGCHECK(0); - } + { + DPRINT1("Bad swap entry 0x%.8X\n", SwapEntry); + KEBUGCHECK(0); + } if (PagingFileList[i]->FileObject == NULL || - PagingFileList[i]->FileObject->DeviceObject == NULL) - { - DPRINT1("Bad paging file 0x%.8X\n", SwapEntry); - KEBUGCHECK(0); - } - + PagingFileList[i]->FileObject->DeviceObject == NULL) + { + DPRINT1("Bad paging file 0x%.8X\n", SwapEntry); + KEBUGCHECK(0); + } + file_offset.QuadPart = offset * PAGE_SIZE; file_offset = MmGetOffsetPageFile(PagingFileList[i]->RetrievalPointers, file_offset); - + KeInitializeEvent(&Event, NotificationEvent, FALSE); Status = IoPageWrite(PagingFileList[i]->FileObject, - Mdl, - &file_offset, - &Event, - &Iosb); + Mdl, + &file_offset, + &Event, + &Iosb); if (Status == STATUS_PENDING) { KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); @@ -242,37 +248,37 @@ NTSTATUS MmReadFromSwapPage(SWAPENTRY SwapEntry, PMDL Mdl) KEVENT Event; DPRINT("MmReadFromSwapPage\n"); - + if (SwapEntry == 0) - { - KEBUGCHECK(0); - return(STATUS_UNSUCCESSFUL); - } - + { + KEBUGCHECK(0); + return(STATUS_UNSUCCESSFUL); + } + i = FILE_FROM_ENTRY(SwapEntry); offset = OFFSET_FROM_ENTRY(SwapEntry); if (i >= MAX_PAGING_FILES) - { - DPRINT1("Bad swap entry 0x%.8X\n", SwapEntry); - KEBUGCHECK(0); - } + { + DPRINT1("Bad swap entry 0x%.8X\n", SwapEntry); + KEBUGCHECK(0); + } if (PagingFileList[i]->FileObject == NULL || - PagingFileList[i]->FileObject->DeviceObject == NULL) - { - DPRINT1("Bad paging file 0x%.8X\n", SwapEntry); - KEBUGCHECK(0); - } + PagingFileList[i]->FileObject->DeviceObject == NULL) + { + DPRINT1("Bad paging file 0x%.8X\n", SwapEntry); + KEBUGCHECK(0); + } file_offset.QuadPart = offset * PAGE_SIZE; file_offset = MmGetOffsetPageFile(PagingFileList[i]->RetrievalPointers, file_offset); - + KeInitializeEvent(&Event, NotificationEvent, FALSE); Status = IoPageRead(PagingFileList[i]->FileObject, - Mdl, - &file_offset, - &Event, - &Iosb); + Mdl, + &file_offset, + &Event, + &Iosb); if (Status == STATUS_PENDING) { KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); @@ -285,34 +291,34 @@ VOID INIT_FUNCTION MmInitPagingFile(VOID) { ULONG i; - + KeInitializeSpinLock(&PagingFileListLock); - + MiFreeSwapPages = 0; MiUsedSwapPages = 0; MiReservedSwapPages = 0; - + for (i = 0; i < MAX_PAGING_FILES; i++) - { - PagingFileList[i] = NULL; - } + { + PagingFileList[i] = NULL; + } MiPagingFileCount = 0; /* * Initialize the crash dump support. */ if (MmCoreDumpType != MM_CORE_DUMP_TYPE_NONE) - { - MmCoreDumpPageFrame = MmAllocateSection(PAGE_SIZE); - if (MmCoreDumpType == MM_CORE_DUMP_TYPE_FULL) - { - MmCoreDumpSize = MmStats.NrTotalPages * 4096 + 1024 * 1024; - } - else - { - MmCoreDumpSize = 1024 * 1024; - } - } + { + MmCoreDumpPageFrame = MmAllocateSection(PAGE_SIZE); + if (MmCoreDumpType == MM_CORE_DUMP_TYPE_FULL) + { + MmCoreDumpSize = MmStats.NrTotalPages * 4096 + 1024 * 1024; + } + else + { + MmCoreDumpSize = 1024 * 1024; + } + } } BOOLEAN @@ -320,87 +326,87 @@ MmReserveSwapPages(ULONG Nr) { KIRQL oldIrql; ULONG MiAvailSwapPages; - + KeAcquireSpinLock(&PagingFileListLock, &oldIrql); MiAvailSwapPages = - (MiFreeSwapPages * MM_PAGEFILE_COMMIT_RATIO) + MM_PAGEFILE_COMMIT_GRACE; + (MiFreeSwapPages * MM_PAGEFILE_COMMIT_RATIO) + MM_PAGEFILE_COMMIT_GRACE; MiReservedSwapPages = MiReservedSwapPages + Nr; if (MM_PAGEFILE_COMMIT_RATIO != 0 && MiAvailSwapPages < MiReservedSwapPages) - { - KeReleaseSpinLock(&PagingFileListLock, oldIrql); - return(FALSE); - } + { + KeReleaseSpinLock(&PagingFileListLock, oldIrql); + return(FALSE); + } KeReleaseSpinLock(&PagingFileListLock, oldIrql); return(TRUE); } -VOID +VOID MmDereserveSwapPages(ULONG Nr) { KIRQL oldIrql; - + KeAcquireSpinLock(&PagingFileListLock, &oldIrql); MiReservedSwapPages = MiReservedSwapPages - Nr; KeReleaseSpinLock(&PagingFileListLock, oldIrql); } -static ULONG +static ULONG MiAllocPageFromPagingFile(PPAGINGFILE PagingFile) { KIRQL oldIrql; ULONG i, j; - + KeAcquireSpinLock(&PagingFile->AllocMapLock, &oldIrql); - + for (i = 0; i < PagingFile->AllocMapSize; i++) - { - for (j = 0; j < 32; j++) - { - if (!(PagingFile->AllocMap[i] & (1 << j))) - { - break; - } - } - if (j == 32) - { - continue; - } - PagingFile->AllocMap[i] |= (1 << j); - PagingFile->UsedPages++; - PagingFile->FreePages--; - KeReleaseSpinLock(&PagingFile->AllocMapLock, oldIrql); - return((i * 32) + j); - } - + { + for (j = 0; j < 32; j++) + { + if (!(PagingFile->AllocMap[i] & (1 << j))) + { + break; + } + } + if (j == 32) + { + continue; + } + PagingFile->AllocMap[i] |= (1 << j); + PagingFile->UsedPages++; + PagingFile->FreePages--; + KeReleaseSpinLock(&PagingFile->AllocMapLock, oldIrql); + return((i * 32) + j); + } + KeReleaseSpinLock(&PagingFile->AllocMapLock, oldIrql); return(0xFFFFFFFF); } -VOID +VOID MmFreeSwapPage(SWAPENTRY Entry) { ULONG i; ULONG off; KIRQL oldIrql; - + i = FILE_FROM_ENTRY(Entry); off = OFFSET_FROM_ENTRY(Entry); - + KeAcquireSpinLock(&PagingFileListLock, &oldIrql); if (PagingFileList[i] == NULL) - { - KEBUGCHECK(0); - } + { + KEBUGCHECK(0); + } KeAcquireSpinLockAtDpcLevel(&PagingFileList[i]->AllocMapLock); - + PagingFileList[i]->AllocMap[off / 32] &= (~(1 << (off % 32))); - + PagingFileList[i]->FreePages++; PagingFileList[i]->UsedPages--; - + MiFreeSwapPages++; MiUsedSwapPages--; - + KeReleaseSpinLockFromDpcLevel(&PagingFileList[i]->AllocMapLock); KeReleaseSpinLock(&PagingFileListLock, oldIrql); } @@ -408,47 +414,47 @@ MmFreeSwapPage(SWAPENTRY Entry) BOOLEAN MmIsAvailableSwapPage(VOID) { - return(MiFreeSwapPages > 0); + return(MiFreeSwapPages > 0); } -SWAPENTRY +SWAPENTRY MmAllocSwapPage(VOID) { KIRQL oldIrql; ULONG i; ULONG off; - SWAPENTRY entry; - + SWAPENTRY entry; + KeAcquireSpinLock(&PagingFileListLock, &oldIrql); - + if (MiFreeSwapPages == 0) - { - KeReleaseSpinLock(&PagingFileListLock, oldIrql); - return(0); - } - + { + KeReleaseSpinLock(&PagingFileListLock, oldIrql); + return(0); + } + for (i = 0; i < MAX_PAGING_FILES; i++) - { - if (PagingFileList[i] != NULL && - PagingFileList[i]->FreePages >= 1) - { - off = MiAllocPageFromPagingFile(PagingFileList[i]); - if (off == 0xFFFFFFFF) - { - KEBUGCHECK(0); - KeReleaseSpinLock(&PagingFileListLock, oldIrql); - return(STATUS_UNSUCCESSFUL); - } - MiUsedSwapPages++; - MiFreeSwapPages--; - KeReleaseSpinLock(&PagingFileListLock, oldIrql); - - entry = ENTRY_FROM_FILE_OFFSET(i, off); - return(entry); - } - } - - KeReleaseSpinLock(&PagingFileListLock, oldIrql); + { + if (PagingFileList[i] != NULL && + PagingFileList[i]->FreePages >= 1) + { + off = MiAllocPageFromPagingFile(PagingFileList[i]); + if (off == 0xFFFFFFFF) + { + KEBUGCHECK(0); + KeReleaseSpinLock(&PagingFileListLock, oldIrql); + return(STATUS_UNSUCCESSFUL); + } + MiUsedSwapPages++; + MiFreeSwapPages--; + KeReleaseSpinLock(&PagingFileListLock, oldIrql); + + entry = ENTRY_FROM_FILE_OFFSET(i, off); + return(entry); + } + } + + KeReleaseSpinLock(&PagingFileListLock, oldIrql); KEBUGCHECK(0); return(0); } @@ -462,267 +468,275 @@ MmAllocRetrievelDescriptorList(ULONG Pairs) Size = sizeof(RETRIEVEL_DESCRIPTOR_LIST) + Pairs * sizeof(MAPPING_PAIR); RetDescList = ExAllocatePool(NonPagedPool, Size); if (RetDescList) - { - RtlZeroMemory(RetDescList, Size); - } + { + RtlZeroMemory(RetDescList, Size); + } return RetDescList; } -NTSTATUS STDCALL +NTSTATUS STDCALL MmDumpToPagingFile(ULONG BugCode, - ULONG BugCodeParameter1, - ULONG BugCodeParameter2, - ULONG BugCodeParameter3, - ULONG BugCodeParameter4, - PKTRAP_FRAME TrapFrame) + ULONG BugCodeParameter1, + ULONG BugCodeParameter2, + ULONG BugCodeParameter3, + ULONG BugCodeParameter4, + PKTRAP_FRAME TrapFrame) { - PMM_CORE_DUMP_HEADER Headers; - NTSTATUS Status; - UCHAR MdlBase[sizeof(MDL) + sizeof(PVOID)]; - PMDL Mdl = (PMDL)MdlBase; - PETHREAD Thread = PsGetCurrentThread(); - ULONG StackSize; - PULONG MdlMap; - LONGLONG NextOffset = 0; - ULONG i; - PGET_RETRIEVAL_DESCRIPTOR RetrievalPointers; - LARGE_INTEGER DiskOffset; + PMM_CORE_DUMP_HEADER Headers; + NTSTATUS Status; + UCHAR MdlBase[sizeof(MDL) + sizeof(PVOID)]; + PMDL Mdl = (PMDL)MdlBase; + PETHREAD Thread = PsGetCurrentThread(); + ULONG StackSize; + PULONG MdlMap; + LONGLONG NextOffset = 0; + ULONG i; + PGET_RETRIEVAL_DESCRIPTOR RetrievalPointers; + LARGE_INTEGER DiskOffset; - if (MmCoreDumpPageFile == 0xFFFFFFFF) - { + if (MmCoreDumpPageFile == 0xFFFFFFFF) + { return(STATUS_UNSUCCESSFUL); - } + } - DbgPrint("\nMM: Dumping core: "); + DbgPrint("\nMM: Dumping core: "); - /* Prepare the dump headers. */ - Headers = (PMM_CORE_DUMP_HEADER)MmCoreDumpPageFrame; - Headers->Magic = MM_CORE_DUMP_HEADER_MAGIC; - Headers->Version = MM_CORE_DUMP_HEADER_VERSION; - Headers->Type = MmCoreDumpType; - if (TrapFrame != NULL) - { + /* Prepare the dump headers. */ + Headers = (PMM_CORE_DUMP_HEADER)MmCoreDumpPageFrame; + Headers->Magic = MM_CORE_DUMP_HEADER_MAGIC; + Headers->Version = MM_CORE_DUMP_HEADER_VERSION; + Headers->Type = MmCoreDumpType; + if (TrapFrame != NULL) + { if (!(TrapFrame->Eflags & (1 << 17))) - { - memcpy(&Headers->TrapFrame, TrapFrame, - sizeof(KTRAP_FRAME) - (4 * sizeof(DWORD))); - } + { + memcpy(&Headers->TrapFrame, TrapFrame, + sizeof(KTRAP_FRAME) - (4 * sizeof(DWORD))); + } else - { - memcpy(&Headers->TrapFrame, TrapFrame, sizeof(KTRAP_FRAME)); - } - } - Headers->BugCheckCode = BugCode; - Headers->BugCheckParameters[0] = BugCodeParameter1; - Headers->BugCheckParameters[1] = BugCodeParameter2; - Headers->BugCheckParameters[2] = BugCodeParameter3; - Headers->BugCheckParameters[3] = BugCodeParameter4; - Headers->FaultingStackBase = (PVOID)Thread->Tcb.StackLimit; - Headers->FaultingStackSize = StackSize = - (ULONG)((char*)Thread->Tcb.StackBase - Thread->Tcb.StackLimit); - Headers->PhysicalMemorySize = MmStats.NrTotalPages * PAGE_SIZE; + { + memcpy(&Headers->TrapFrame, TrapFrame, sizeof(KTRAP_FRAME)); + } + } + Headers->BugCheckCode = BugCode; + Headers->BugCheckParameters[0] = BugCodeParameter1; + Headers->BugCheckParameters[1] = BugCodeParameter2; + Headers->BugCheckParameters[2] = BugCodeParameter3; + Headers->BugCheckParameters[3] = BugCodeParameter4; + Headers->FaultingStackBase = (PVOID)Thread->Tcb.StackLimit; + Headers->FaultingStackSize = StackSize = + (ULONG)((char*)Thread->Tcb.StackBase - Thread->Tcb.StackLimit); + Headers->PhysicalMemorySize = MmStats.NrTotalPages * PAGE_SIZE; - /* Initialize the dump device. */ - Status = MmCoreDumpFunctions->DumpInit(); - if (!NT_SUCCESS(Status)) - { + /* Initialize the dump device. */ + Status = MmCoreDumpFunctions->DumpInit(); + if (!NT_SUCCESS(Status)) + { DPRINT1("MM: Failed to initialize core dump device.\n"); return(Status); - } + } - /* Initialize the MDL. */ - Mdl->Next = NULL; - Mdl->Size = sizeof(MDL) + sizeof(PVOID); - Mdl->MdlFlags = MDL_SOURCE_IS_NONPAGED_POOL; - Mdl->Process = NULL; - Mdl->MappedSystemVa = MmCoreDumpPageFrame; - Mdl->StartVa = NULL; - Mdl->ByteCount = PAGE_SIZE; - Mdl->ByteOffset = 0; - MdlMap = (PULONG)(Mdl + 1); + /* Initialize the MDL. */ + Mdl->Next = NULL; + Mdl->Size = sizeof(MDL) + sizeof(PVOID); + Mdl->MdlFlags = MDL_SOURCE_IS_NONPAGED_POOL; + Mdl->Process = NULL; + Mdl->MappedSystemVa = MmCoreDumpPageFrame; + Mdl->StartVa = NULL; + Mdl->ByteCount = PAGE_SIZE; + Mdl->ByteOffset = 0; + MdlMap = (PULONG)(Mdl + 1); - - /* Initialize the retrieval offsets. */ - RetrievalPointers = PagingFileList[MmCoreDumpPageFile]->RetrievalPointers; - /* Dump the header. */ - MdlMap[0] = MmGetPhysicalAddress(MmCoreDumpPageFrame).u.LowPart; + /* Initialize the retrieval offsets. */ + RetrievalPointers = PagingFileList[MmCoreDumpPageFile]->RetrievalPointers; + + /* Dump the header. */ + MdlMap[0] = MmGetPhysicalAddress(MmCoreDumpPageFrame).u.LowPart; #if defined(__GNUC__) - DiskOffset = MmGetOffsetPageFile(RetrievalPointers, (LARGE_INTEGER)0LL); + + DiskOffset = MmGetOffsetPageFile(RetrievalPointers, (LARGE_INTEGER)0LL); #else - { - const LARGE_INTEGER dummy = { 0 }; - DiskOffset = MmGetOffsetPageFile(RetrievalPointers, dummy); - } + + { + const LARGE_INTEGER dummy = + { + 0 + }; + DiskOffset = MmGetOffsetPageFile(RetrievalPointers, dummy); + } #endif - DiskOffset.QuadPart += MmCoreDumpLcnMapping.LcnDiskOffset.QuadPart; - Status = MmCoreDumpFunctions->DumpWrite(DiskOffset, Mdl); - if (!NT_SUCCESS(Status)) - { + DiskOffset.QuadPart += MmCoreDumpLcnMapping.LcnDiskOffset.QuadPart; + Status = MmCoreDumpFunctions->DumpWrite(DiskOffset, Mdl); + if (!NT_SUCCESS(Status)) + { DPRINT1("MM: Failed to write core dump header\n."); return(Status); - } - NextOffset += PAGE_SIZE;; - DbgPrint("00"); + } + NextOffset += PAGE_SIZE; + ; + DbgPrint("00"); - - /* Write out the contents of physical memory. */ - if (MmCoreDumpType == MM_CORE_DUMP_TYPE_FULL) - { + + /* Write out the contents of physical memory. */ + if (MmCoreDumpType == MM_CORE_DUMP_TYPE_FULL) + { for (i = 0; i < MmStats.NrTotalPages; i++) - { - LARGE_INTEGER PhysicalAddress; - PhysicalAddress.QuadPart = i * PAGE_SIZE; - MdlMap[0] = i * PAGE_SIZE; - MmCreateVirtualMappingDump(MmCoreDumpPageFrame, - PAGE_READWRITE, - PhysicalAddress); + { + LARGE_INTEGER PhysicalAddress; + PhysicalAddress.QuadPart = i * PAGE_SIZE; + MdlMap[0] = i * PAGE_SIZE; + MmCreateVirtualMappingDump(MmCoreDumpPageFrame, + PAGE_READWRITE, + PhysicalAddress); #if defined(__GNUC__) - DiskOffset = MmGetOffsetPageFile(RetrievalPointers, - (LARGE_INTEGER)NextOffset); -#else - { - LARGE_INTEGER dummy; - dummy.QuadPart = NextOffset; - DiskOffset = MmGetOffsetPageFile(RetrievalPointers, dummy); - } -#endif - DiskOffset.QuadPart += MmCoreDumpLcnMapping.LcnDiskOffset.QuadPart; - Status = MmCoreDumpFunctions->DumpWrite(DiskOffset, Mdl); - if (!NT_SUCCESS(Status)) - { - DPRINT1("MM: Failed to write page to core dump.\n"); - return(Status); - } - if ((i % ((1024*1024) / PAGE_SIZE)) == 0) - { - DbgPrint("\b\b%.2d", i / ((1024*1024)/PAGE_SIZE)); - } - NextOffset += PAGE_SIZE; - } - } - DbgPrint("\n"); - MmCoreDumpFunctions->DumpFinish(); - return(STATUS_SUCCESS); + DiskOffset = MmGetOffsetPageFile(RetrievalPointers, + (LARGE_INTEGER)NextOffset); +#else + + { + LARGE_INTEGER dummy; + dummy.QuadPart = NextOffset; + DiskOffset = MmGetOffsetPageFile(RetrievalPointers, dummy); + } +#endif + DiskOffset.QuadPart += MmCoreDumpLcnMapping.LcnDiskOffset.QuadPart; + Status = MmCoreDumpFunctions->DumpWrite(DiskOffset, Mdl); + if (!NT_SUCCESS(Status)) + { + DPRINT1("MM: Failed to write page to core dump.\n"); + return(Status); + } + if ((i % ((1024*1024) / PAGE_SIZE)) == 0) + { + DbgPrint("\b\b%.2d", i / ((1024*1024)/PAGE_SIZE)); + } + NextOffset += PAGE_SIZE; + } + } + + DbgPrint("\n"); + MmCoreDumpFunctions->DumpFinish(); + return(STATUS_SUCCESS); } NTSTATUS STDCALL MmInitializeCrashDump(HANDLE PageFileHandle, ULONG PageFileNum) { - PFILE_OBJECT PageFile; - PDEVICE_OBJECT PageFileDevice; - NTSTATUS Status; - PIRP Irp; - KEVENT Event; - IO_STATUS_BLOCK Iosb; - UNICODE_STRING DiskDumpName; - ANSI_STRING ProcName; - PIO_STACK_LOCATION StackPtr; - PMODULE_OBJECT ModuleObject; + PFILE_OBJECT PageFile; + PDEVICE_OBJECT PageFileDevice; + NTSTATUS Status; + PIRP Irp; + KEVENT Event; + IO_STATUS_BLOCK Iosb; + UNICODE_STRING DiskDumpName; + ANSI_STRING ProcName; + PIO_STACK_LOCATION StackPtr; + PMODULE_OBJECT ModuleObject; - Status = ZwFsControlFile(PageFileHandle, - 0, - NULL, - NULL, - &Iosb, - FSCTL_ROS_QUERY_LCN_MAPPING, - NULL, - 0, - &MmCoreDumpLcnMapping, - sizeof(ROS_QUERY_LCN_MAPPING)); - if (!NT_SUCCESS(Status) || - Iosb.Information != sizeof(ROS_QUERY_LCN_MAPPING)) - { + Status = ZwFsControlFile(PageFileHandle, + 0, + NULL, + NULL, + &Iosb, + FSCTL_ROS_QUERY_LCN_MAPPING, + NULL, + 0, + &MmCoreDumpLcnMapping, + sizeof(ROS_QUERY_LCN_MAPPING)); + if (!NT_SUCCESS(Status) || + Iosb.Information != sizeof(ROS_QUERY_LCN_MAPPING)) + { return(Status); - } + } - /* Get the underlying storage device. */ - Status = - ObReferenceObjectByHandle(PageFileHandle, - FILE_ALL_ACCESS, - NULL, - KernelMode, - (PVOID*)&PageFile, - NULL); - if (!NT_SUCCESS(Status)) - { + /* Get the underlying storage device. */ + Status = + ObReferenceObjectByHandle(PageFileHandle, + FILE_ALL_ACCESS, + NULL, + KernelMode, + (PVOID*)&PageFile, + NULL); + if (!NT_SUCCESS(Status)) + { return(Status); - } + } - PageFileDevice = PageFile->Vpb->RealDevice; + PageFileDevice = PageFile->Vpb->RealDevice; - /* Get the dump pointers. */ - KeInitializeEvent(&Event, NotificationEvent, FALSE); - Irp = IoBuildDeviceIoControlRequest(IOCTL_SCSI_GET_DUMP_POINTERS, - PageFileDevice, - NULL, - 0, - &MmCoreDumpPointers, - sizeof(MmCoreDumpPointers), - FALSE, - &Event, - &Iosb); - StackPtr = IoGetNextIrpStackLocation(Irp); - StackPtr->FileObject = PageFile; - StackPtr->DeviceObject = PageFileDevice; - StackPtr->Parameters.DeviceIoControl.InputBufferLength = 0; - StackPtr->Parameters.DeviceIoControl.OutputBufferLength = sizeof(MmCoreDumpPointers); - - Status = IoCallDriver(PageFileDevice,Irp); - if (Status == STATUS_PENDING) - { + /* Get the dump pointers. */ + KeInitializeEvent(&Event, NotificationEvent, FALSE); + Irp = IoBuildDeviceIoControlRequest(IOCTL_SCSI_GET_DUMP_POINTERS, + PageFileDevice, + NULL, + 0, + &MmCoreDumpPointers, + sizeof(MmCoreDumpPointers), + FALSE, + &Event, + &Iosb); + StackPtr = IoGetNextIrpStackLocation(Irp); + StackPtr->FileObject = PageFile; + StackPtr->DeviceObject = PageFileDevice; + StackPtr->Parameters.DeviceIoControl.InputBufferLength = 0; + StackPtr->Parameters.DeviceIoControl.OutputBufferLength = sizeof(MmCoreDumpPointers); + + Status = IoCallDriver(PageFileDevice,Irp); + if (Status == STATUS_PENDING) + { Status = KeWaitForSingleObject(&Event, - Executive, - KernelMode, - FALSE, - NULL); - } - if (Status != STATUS_SUCCESS || - Iosb.Information != sizeof(MmCoreDumpPointers)) - { + Executive, + KernelMode, + FALSE, + NULL); + } + if (Status != STATUS_SUCCESS || + Iosb.Information != sizeof(MmCoreDumpPointers)) + { ObDereferenceObject(PageFile); return(Status); - } + } - /* Load the diskdump driver. */ - RtlRosInitUnicodeStringFromLiteral(&DiskDumpName, L"DiskDump"); - ModuleObject = LdrGetModuleObject(&DiskDumpName); - if (ModuleObject == NULL) - { + /* Load the diskdump driver. */ + RtlRosInitUnicodeStringFromLiteral(&DiskDumpName, L"DiskDump"); + ModuleObject = LdrGetModuleObject(&DiskDumpName); + if (ModuleObject == NULL) + { return(STATUS_OBJECT_NAME_NOT_FOUND); - } - RtlInitAnsiString(&ProcName, "DiskDumpFunctions"); - Status = LdrGetProcedureAddress(ModuleObject->Base, - &ProcName, - 0, - (PVOID*)&MmCoreDumpFunctions); - if (!NT_SUCCESS(Status)) - { + } + RtlInitAnsiString(&ProcName, "DiskDumpFunctions"); + Status = LdrGetProcedureAddress(ModuleObject->Base, + &ProcName, + 0, + (PVOID*)&MmCoreDumpFunctions); + if (!NT_SUCCESS(Status)) + { ObDereferenceObject(PageFile); return(Status); - } + } - /* Prepare for disk dumping. */ - Status = MmCoreDumpFunctions->DumpPrepare(PageFileDevice, - &MmCoreDumpPointers); - if (!NT_SUCCESS(Status)) - { + /* Prepare for disk dumping. */ + Status = MmCoreDumpFunctions->DumpPrepare(PageFileDevice, + &MmCoreDumpPointers); + if (!NT_SUCCESS(Status)) + { ObDereferenceObject(PageFile); return(Status); - } + } - MmCoreDumpPageFile = PageFileNum; - ObDereferenceObject(PageFile); - return(STATUS_SUCCESS); + MmCoreDumpPageFile = PageFileNum; + ObDereferenceObject(PageFile); + return(STATUS_SUCCESS); } NTSTATUS STDCALL NtCreatePagingFile(IN PUNICODE_STRING FileName, - IN PLARGE_INTEGER InitialSize, - IN PLARGE_INTEGER MaximumSize, - IN ULONG Reserved) + IN PLARGE_INTEGER InitialSize, + IN PLARGE_INTEGER MaximumSize, + IN ULONG Reserved) { NTSTATUS Status; OBJECT_ATTRIBUTES ObjectAttributes; @@ -744,158 +758,160 @@ NtCreatePagingFile(IN PUNICODE_STRING FileName, ULONG Size; DPRINT("NtCreatePagingFile(FileName %wZ, InitialSize %I64d)\n", - FileName, InitialSize->QuadPart); - + FileName, InitialSize->QuadPart); + if (MiPagingFileCount >= MAX_PAGING_FILES) - { - return(STATUS_TOO_MANY_PAGING_FILES); - } - + { + return(STATUS_TOO_MANY_PAGING_FILES); + } + InitializeObjectAttributes(&ObjectAttributes, - FileName, - 0, - NULL, - NULL); - + FileName, + 0, + NULL, + NULL); + Status = IoCreateFile(&FileHandle, - FILE_ALL_ACCESS, - &ObjectAttributes, - &IoStatus, - NULL, - 0, - 0, - FILE_OPEN_IF, - FILE_SYNCHRONOUS_IO_NONALERT, - NULL, - 0, - CreateFileTypeNone, - NULL, - SL_OPEN_PAGING_FILE); + FILE_ALL_ACCESS, + &ObjectAttributes, + &IoStatus, + NULL, + 0, + 0, + FILE_OPEN_IF, + FILE_SYNCHRONOUS_IO_NONALERT, + NULL, + 0, + CreateFileTypeNone, + NULL, + SL_OPEN_PAGING_FILE); if (!NT_SUCCESS(Status)) - { - return(Status); - } - + { + return(Status); + } + Status = NtQueryVolumeInformationFile(FileHandle, &IoStatus, - &FsSizeInformation, - sizeof(FILE_FS_SIZE_INFORMATION), - FileFsSizeInformation); + &FsSizeInformation, + sizeof(FILE_FS_SIZE_INFORMATION), + FileFsSizeInformation); if (!NT_SUCCESS(Status)) - { - NtClose(FileHandle); - return Status; - } - + { + NtClose(FileHandle); + return Status; + } + BytesPerAllocationUnit = FsSizeInformation.SectorsPerAllocationUnit * FsSizeInformation.BytesPerSector; if (BytesPerAllocationUnit % PAGE_SIZE) - { - NtClose(FileHandle); - return STATUS_UNSUCCESSFUL; - } + { + NtClose(FileHandle); + return STATUS_UNSUCCESSFUL; + } Status = NtSetInformationFile(FileHandle, - &IoStatus, - InitialSize, - sizeof(LARGE_INTEGER), - FileAllocationInformation); + &IoStatus, + InitialSize, + sizeof(LARGE_INTEGER), + FileAllocationInformation); if (!NT_SUCCESS(Status)) - { - NtClose(FileHandle); - return(Status); - } + { + NtClose(FileHandle); + return(Status); + } Status = ObReferenceObjectByHandle(FileHandle, - FILE_ALL_ACCESS, - IoFileObjectType, - UserMode, - (PVOID*)&FileObject, - NULL); + FILE_ALL_ACCESS, + IoFileObjectType, + UserMode, + (PVOID*)&FileObject, + NULL); if (!NT_SUCCESS(Status)) - { - NtClose(FileHandle); - return(Status); - } + { + NtClose(FileHandle); + return(Status); + } CurrentRetDescList = RetDescList = MmAllocRetrievelDescriptorList(PAIRS_PER_RUN); if (CurrentRetDescList == NULL) - { - ObDereferenceObject(FileObject); - NtClose(FileHandle); - return(STATUS_NO_MEMORY); - } + { + ObDereferenceObject(FileObject); + NtClose(FileHandle); + return(STATUS_NO_MEMORY); + } #if defined(__GNUC__) Vcn.QuadPart = 0LL; #else + Vcn.QuadPart = 0; #endif + ExtentCount = 0; MaxVcn = (ULONG)((InitialSize->QuadPart + BytesPerAllocationUnit - 1) / BytesPerAllocationUnit); while(1) - { - Status = NtFsControlFile(FileHandle, - 0, - NULL, - NULL, - &IoStatus, - FSCTL_GET_RETRIEVAL_POINTERS, - &Vcn, - sizeof(LARGE_INTEGER), - &CurrentRetDescList->RetrievalPointers, - sizeof(GET_RETRIEVAL_DESCRIPTOR) + PAIRS_PER_RUN * sizeof(MAPPING_PAIR)); - if (!NT_SUCCESS(Status)) + { + Status = NtFsControlFile(FileHandle, + 0, + NULL, + NULL, + &IoStatus, + FSCTL_GET_RETRIEVAL_POINTERS, + &Vcn, + sizeof(LARGE_INTEGER), + &CurrentRetDescList->RetrievalPointers, + sizeof(GET_RETRIEVAL_DESCRIPTOR) + PAIRS_PER_RUN * sizeof(MAPPING_PAIR)); + if (!NT_SUCCESS(Status)) + { + while (RetDescList) { - while (RetDescList) - { - CurrentRetDescList = RetDescList; - RetDescList = RetDescList->Next; - ExFreePool(CurrentRetDescList); - } - ObDereferenceObject(FileObject); - NtClose(FileHandle); - return(Status); + CurrentRetDescList = RetDescList; + RetDescList = RetDescList->Next; + ExFreePool(CurrentRetDescList); } - ExtentCount += CurrentRetDescList->RetrievalPointers.NumberOfPairs; - if ((ULONG)CurrentRetDescList->RetrievalPointers.Pair[CurrentRetDescList->RetrievalPointers.NumberOfPairs-1].Vcn < MaxVcn) + ObDereferenceObject(FileObject); + NtClose(FileHandle); + return(Status); + } + ExtentCount += CurrentRetDescList->RetrievalPointers.NumberOfPairs; + if ((ULONG)CurrentRetDescList->RetrievalPointers.Pair[CurrentRetDescList->RetrievalPointers.NumberOfPairs-1].Vcn < MaxVcn) + { + CurrentRetDescList->Next = MmAllocRetrievelDescriptorList(PAIRS_PER_RUN); + if (CurrentRetDescList->Next == NULL) { - CurrentRetDescList->Next = MmAllocRetrievelDescriptorList(PAIRS_PER_RUN); - if (CurrentRetDescList->Next == NULL) - { - while (RetDescList) - { - CurrentRetDescList = RetDescList; - RetDescList = RetDescList->Next; - ExFreePool(CurrentRetDescList); - } - ObDereferenceObject(FileObject); - NtClose(FileHandle); - return(STATUS_NO_MEMORY); - } - Vcn.QuadPart = CurrentRetDescList->RetrievalPointers.Pair[CurrentRetDescList->RetrievalPointers.NumberOfPairs-1].Vcn; - CurrentRetDescList = CurrentRetDescList->Next; + while (RetDescList) + { + CurrentRetDescList = RetDescList; + RetDescList = RetDescList->Next; + ExFreePool(CurrentRetDescList); + } + ObDereferenceObject(FileObject); + NtClose(FileHandle); + return(STATUS_NO_MEMORY); } - else - { - break; - } - } + Vcn.QuadPart = CurrentRetDescList->RetrievalPointers.Pair[CurrentRetDescList->RetrievalPointers.NumberOfPairs-1].Vcn; + CurrentRetDescList = CurrentRetDescList->Next; + } + else + { + break; + } + } PagingFile = ExAllocatePool(NonPagedPool, sizeof(*PagingFile)); if (PagingFile == NULL) - { - while (RetDescList) - { - CurrentRetDescList = RetDescList; - RetDescList = RetDescList->Next; - ExFreePool(CurrentRetDescList); - } - ObDereferenceObject(FileObject); - NtClose(FileHandle); - return(STATUS_NO_MEMORY); - } - + { + while (RetDescList) + { + CurrentRetDescList = RetDescList; + RetDescList = RetDescList->Next; + ExFreePool(CurrentRetDescList); + } + ObDereferenceObject(FileObject); + NtClose(FileHandle); + return(STATUS_NO_MEMORY); + } + RtlZeroMemory(PagingFile, sizeof(*PagingFile)); PagingFile->FileObject = FileObject; @@ -904,36 +920,36 @@ NtCreatePagingFile(IN PUNICODE_STRING FileName, PagingFile->FreePages = (ULONG)(InitialSize->QuadPart / PAGE_SIZE); PagingFile->UsedPages = 0; KeInitializeSpinLock(&PagingFile->AllocMapLock); - + AllocMapSize = (PagingFile->FreePages / 32) + 1; - PagingFile->AllocMap = ExAllocatePool(NonPagedPool, - AllocMapSize * sizeof(ULONG)); + PagingFile->AllocMap = ExAllocatePool(NonPagedPool, + AllocMapSize * sizeof(ULONG)); PagingFile->AllocMapSize = AllocMapSize; - + if (PagingFile->AllocMap == NULL) - { - while (RetDescList) - { - CurrentRetDescList = RetDescList; - RetDescList = RetDescList->Next; - ExFreePool(CurrentRetDescList); - } - ExFreePool(PagingFile); - ObDereferenceObject(FileObject); - ZwClose(FileHandle); - return(STATUS_NO_MEMORY); - } + { + while (RetDescList) + { + CurrentRetDescList = RetDescList; + RetDescList = RetDescList->Next; + ExFreePool(CurrentRetDescList); + } + ExFreePool(PagingFile); + ObDereferenceObject(FileObject); + ZwClose(FileHandle); + return(STATUS_NO_MEMORY); + } DPRINT("ExtentCount: %d\n", ExtentCount); Size = sizeof(GET_RETRIEVAL_DESCRIPTOR) + ExtentCount * sizeof(MAPPING_PAIR); PagingFile->RetrievalPointers = ExAllocatePool(NonPagedPool, Size); if (PagingFile->RetrievalPointers == NULL) { - while (RetDescList) - { - CurrentRetDescList = RetDescList; - RetDescList = RetDescList->Next; - ExFreePool(CurrentRetDescList); - } + while (RetDescList) + { + CurrentRetDescList = RetDescList; + RetDescList = RetDescList->Next; + ExFreePool(CurrentRetDescList); + } ExFreePool(PagingFile->AllocMap); ExFreePool(PagingFile); ObDereferenceObject(FileObject); @@ -949,57 +965,57 @@ NtCreatePagingFile(IN PUNICODE_STRING FileName, PagingFile->RetrievalPointers->StartVcn = RetDescList->RetrievalPointers.StartVcn; CurrentRetDescList = RetDescList; while (CurrentRetDescList) - { - memcpy(&PagingFile->RetrievalPointers->Pair[Count], - CurrentRetDescList->RetrievalPointers.Pair, - CurrentRetDescList->RetrievalPointers.NumberOfPairs * sizeof(MAPPING_PAIR)); - Count += CurrentRetDescList->RetrievalPointers.NumberOfPairs; - RetDescList = CurrentRetDescList; - CurrentRetDescList = CurrentRetDescList->Next; - ExFreePool(RetDescList); - } + { + memcpy(&PagingFile->RetrievalPointers->Pair[Count], + CurrentRetDescList->RetrievalPointers.Pair, + CurrentRetDescList->RetrievalPointers.NumberOfPairs * sizeof(MAPPING_PAIR)); + Count += CurrentRetDescList->RetrievalPointers.NumberOfPairs; + RetDescList = CurrentRetDescList; + CurrentRetDescList = CurrentRetDescList->Next; + ExFreePool(RetDescList); + } - if (PagingFile->RetrievalPointers->NumberOfPairs != ExtentCount || - (ULONG)PagingFile->RetrievalPointers->Pair[ExtentCount - 1].Vcn != MaxVcn) - { - ExFreePool(PagingFile->RetrievalPointers); - ExFreePool(PagingFile->AllocMap); - ExFreePool(PagingFile); - ObDereferenceObject(FileObject); - NtClose(FileHandle); - return(STATUS_UNSUCCESSFUL); - } + if (PagingFile->RetrievalPointers->NumberOfPairs != ExtentCount || + (ULONG)PagingFile->RetrievalPointers->Pair[ExtentCount - 1].Vcn != MaxVcn) + { + ExFreePool(PagingFile->RetrievalPointers); + ExFreePool(PagingFile->AllocMap); + ExFreePool(PagingFile); + ObDereferenceObject(FileObject); + NtClose(FileHandle); + return(STATUS_UNSUCCESSFUL); + } - /* + /* * Change the entries from lcn's to volume offset's. */ PagingFile->RetrievalPointers->StartVcn *= BytesPerAllocationUnit; for (i = 0; i < ExtentCount; i++) - { - PagingFile->RetrievalPointers->Pair[i].Lcn *= BytesPerAllocationUnit; - PagingFile->RetrievalPointers->Pair[i].Vcn *= BytesPerAllocationUnit; - } + { + PagingFile->RetrievalPointers->Pair[i].Lcn *= BytesPerAllocationUnit; + PagingFile->RetrievalPointers->Pair[i].Vcn *= BytesPerAllocationUnit; + } KeAcquireSpinLock(&PagingFileListLock, &oldIrql); for (i = 0; i < MAX_PAGING_FILES; i++) - { - if (PagingFileList[i] == NULL) - { - PagingFileList[i] = PagingFile; - break; - } - } + { + if (PagingFileList[i] == NULL) + { + PagingFileList[i] = PagingFile; + break; + } + } MiFreeSwapPages = MiFreeSwapPages + PagingFile->FreePages; MiPagingFileCount++; KeReleaseSpinLock(&PagingFileListLock, oldIrql); - + /* Check whether this pagefile can be a crash dump target. */ if (MmCoreDumpType != MM_CORE_DUMP_TYPE_NONE && - PagingFile->CurrentSize.QuadPart >= MmCoreDumpSize && - MmCoreDumpPageFile == 0xFFFFFFFF) - { - MmInitializeCrashDump(FileHandle, i); - } + PagingFile->CurrentSize.QuadPart >= MmCoreDumpSize && + MmCoreDumpPageFile == 0xFFFFFFFF) + { + MmInitializeCrashDump(FileHandle, i); + } NtClose(FileHandle); MmSwapSpaceMessage = FALSE; diff --git a/reactos/ntoskrnl/mm/pageop.c b/reactos/ntoskrnl/mm/pageop.c index 5e57dea8445..b57897d00e3 100644 --- a/reactos/ntoskrnl/mm/pageop.c +++ b/reactos/ntoskrnl/mm/pageop.c @@ -1,4 +1,4 @@ -/* $Id: pageop.c,v 1.19 2004/03/05 11:31:59 hbirr Exp $ +/* $Id: pageop.c,v 1.20 2004/04/10 22:35:25 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -32,227 +32,227 @@ static NPAGED_LOOKASIDE_LIST MmPageOpLookasideList; VOID MmReleasePageOp(PMM_PAGEOP PageOp) - /* - * FUNCTION: Release a reference to a page operation descriptor - */ +/* + * FUNCTION: Release a reference to a page operation descriptor + */ { - KIRQL oldIrql; - PMM_PAGEOP PrevPageOp; + KIRQL oldIrql; + PMM_PAGEOP PrevPageOp; - KeAcquireSpinLock(&MmPageOpHashTableLock, &oldIrql); - PageOp->ReferenceCount--; - if (PageOp->ReferenceCount > 0) - { + KeAcquireSpinLock(&MmPageOpHashTableLock, &oldIrql); + PageOp->ReferenceCount--; + if (PageOp->ReferenceCount > 0) + { KeReleaseSpinLock(&MmPageOpHashTableLock, oldIrql); return; - } - InterlockedDecrement((LONG *)&PageOp->MArea->PageOpCount); - PrevPageOp = MmPageOpHashTable[PageOp->Hash]; - if (PrevPageOp == PageOp) - { + } + InterlockedDecrement((LONG *)&PageOp->MArea->PageOpCount); + PrevPageOp = MmPageOpHashTable[PageOp->Hash]; + if (PrevPageOp == PageOp) + { MmPageOpHashTable[PageOp->Hash] = PageOp->Next; KeReleaseSpinLock(&MmPageOpHashTableLock, oldIrql); ExFreeToNPagedLookasideList(&MmPageOpLookasideList, PageOp); return; - } - while (PrevPageOp->Next != NULL) - { + } + while (PrevPageOp->Next != NULL) + { if (PrevPageOp->Next == PageOp) - { - PrevPageOp->Next = PageOp->Next; - KeReleaseSpinLock(&MmPageOpHashTableLock, oldIrql); - ExFreeToNPagedLookasideList(&MmPageOpLookasideList, PageOp); - return; - } + { + PrevPageOp->Next = PageOp->Next; + KeReleaseSpinLock(&MmPageOpHashTableLock, oldIrql); + ExFreeToNPagedLookasideList(&MmPageOpLookasideList, PageOp); + return; + } PrevPageOp = PrevPageOp->Next; - } - KeReleaseSpinLock(&MmPageOpHashTableLock, oldIrql); - KEBUGCHECK(0); + } + KeReleaseSpinLock(&MmPageOpHashTableLock, oldIrql); + KEBUGCHECK(0); } PMM_PAGEOP MmCheckForPageOp(PMEMORY_AREA MArea, ULONG Pid, PVOID Address, - PMM_SECTION_SEGMENT Segment, ULONG Offset) + PMM_SECTION_SEGMENT Segment, ULONG Offset) { - ULONG Hash; - KIRQL oldIrql; - PMM_PAGEOP PageOp; - - /* - * Calcuate the hash value for pageop structure - */ - if (MArea->Type == MEMORY_AREA_SECTION_VIEW) - { + ULONG Hash; + KIRQL oldIrql; + PMM_PAGEOP PageOp; + + /* + * Calcuate the hash value for pageop structure + */ + if (MArea->Type == MEMORY_AREA_SECTION_VIEW) + { Hash = (((ULONG)Segment) | (((ULONG)Offset) / PAGE_SIZE)); - } - else - { + } + else + { Hash = (((ULONG)Pid) | (((ULONG)Address) / PAGE_SIZE)); - } - Hash = Hash % PAGEOP_HASH_TABLE_SIZE; + } + Hash = Hash % PAGEOP_HASH_TABLE_SIZE; - KeAcquireSpinLock(&MmPageOpHashTableLock, &oldIrql); + KeAcquireSpinLock(&MmPageOpHashTableLock, &oldIrql); - /* - * Check for an existing pageop structure - */ - PageOp = MmPageOpHashTable[Hash]; - while (PageOp != NULL) - { + /* + * Check for an existing pageop structure + */ + PageOp = MmPageOpHashTable[Hash]; + while (PageOp != NULL) + { if (MArea->Type == MEMORY_AREA_SECTION_VIEW) - { - if (PageOp->Segment == Segment && - PageOp->Offset == Offset) - { - break; - } - } + { + if (PageOp->Segment == Segment && + PageOp->Offset == Offset) + { + break; + } + } else - { - if (PageOp->Pid == Pid && - PageOp->Address == Address) - { - break; - } - } + { + if (PageOp->Pid == Pid && + PageOp->Address == Address) + { + break; + } + } PageOp = PageOp->Next; - } - - /* - * If we found an existing pageop then increment the reference count - * and return it. - */ - if (PageOp != NULL) - { + } + + /* + * If we found an existing pageop then increment the reference count + * and return it. + */ + if (PageOp != NULL) + { PageOp->ReferenceCount++; KeReleaseSpinLock(&MmPageOpHashTableLock, oldIrql); return(PageOp); - } - KeReleaseSpinLock(&MmPageOpHashTableLock, oldIrql); - return(NULL); + } + KeReleaseSpinLock(&MmPageOpHashTableLock, oldIrql); + return(NULL); } PMM_PAGEOP MmGetPageOp(PMEMORY_AREA MArea, ULONG Pid, PVOID Address, - PMM_SECTION_SEGMENT Segment, ULONG Offset, ULONG OpType, BOOL First) - /* - * FUNCTION: Get a page operation descriptor corresponding to - * the memory area and either the segment, offset pair or the - * pid, address pair. - */ + PMM_SECTION_SEGMENT Segment, ULONG Offset, ULONG OpType, BOOL First) +/* + * FUNCTION: Get a page operation descriptor corresponding to + * the memory area and either the segment, offset pair or the + * pid, address pair. + */ { - ULONG Hash; - KIRQL oldIrql; - PMM_PAGEOP PageOp; + ULONG Hash; + KIRQL oldIrql; + PMM_PAGEOP PageOp; - /* - * Calcuate the hash value for pageop structure - */ - if (MArea->Type == MEMORY_AREA_SECTION_VIEW) - { + /* + * Calcuate the hash value for pageop structure + */ + if (MArea->Type == MEMORY_AREA_SECTION_VIEW) + { Hash = (((ULONG)Segment) | (((ULONG)Offset) / PAGE_SIZE)); - } - else - { + } + else + { Hash = (((ULONG)Pid) | (((ULONG)Address) / PAGE_SIZE)); - } - Hash = Hash % PAGEOP_HASH_TABLE_SIZE; + } + Hash = Hash % PAGEOP_HASH_TABLE_SIZE; - KeAcquireSpinLock(&MmPageOpHashTableLock, &oldIrql); + KeAcquireSpinLock(&MmPageOpHashTableLock, &oldIrql); - /* - * Check for an existing pageop structure - */ - PageOp = MmPageOpHashTable[Hash]; - while (PageOp != NULL) - { + /* + * Check for an existing pageop structure + */ + PageOp = MmPageOpHashTable[Hash]; + while (PageOp != NULL) + { if (MArea->Type == MEMORY_AREA_SECTION_VIEW) - { - if (PageOp->Segment == Segment && - PageOp->Offset == Offset) - { - break; - } - } + { + if (PageOp->Segment == Segment && + PageOp->Offset == Offset) + { + break; + } + } else - { - if (PageOp->Pid == Pid && - PageOp->Address == Address) - { - break; - } - } + { + if (PageOp->Pid == Pid && + PageOp->Address == Address) + { + break; + } + } PageOp = PageOp->Next; - } - - /* - * If we found an existing pageop then increment the reference count - * and return it. - */ - if (PageOp != NULL) - { + } + + /* + * If we found an existing pageop then increment the reference count + * and return it. + */ + if (PageOp != NULL) + { if (First) - { - PageOp = NULL; - } + { + PageOp = NULL; + } else - { - PageOp->ReferenceCount++; - } + { + PageOp->ReferenceCount++; + } KeReleaseSpinLock(&MmPageOpHashTableLock, oldIrql); return(PageOp); - } + } - /* - * Otherwise add a new pageop. - */ - PageOp = ExAllocateFromNPagedLookasideList(&MmPageOpLookasideList); - if (PageOp == NULL) - { + /* + * Otherwise add a new pageop. + */ + PageOp = ExAllocateFromNPagedLookasideList(&MmPageOpLookasideList); + if (PageOp == NULL) + { KeReleaseSpinLock(&MmPageOpHashTableLock, oldIrql); KEBUGCHECK(0); return(NULL); - } - - if (MArea->Type != MEMORY_AREA_SECTION_VIEW) - { + } + + if (MArea->Type != MEMORY_AREA_SECTION_VIEW) + { PageOp->Pid = Pid; PageOp->Address = Address; - } - else - { + } + else + { PageOp->Segment = Segment; PageOp->Offset = Offset; - } - PageOp->ReferenceCount = 1; - PageOp->Next = MmPageOpHashTable[Hash]; - PageOp->Hash = Hash; - PageOp->Thread = PsGetCurrentThread(); - PageOp->Abandoned = FALSE; - PageOp->Status = STATUS_PENDING; - PageOp->OpType = OpType; - PageOp->MArea = MArea; - KeInitializeEvent(&PageOp->CompletionEvent, NotificationEvent, FALSE); - MmPageOpHashTable[Hash] = PageOp; - InterlockedIncrement((LONG *)&MArea->PageOpCount); + } + PageOp->ReferenceCount = 1; + PageOp->Next = MmPageOpHashTable[Hash]; + PageOp->Hash = Hash; + PageOp->Thread = PsGetCurrentThread(); + PageOp->Abandoned = FALSE; + PageOp->Status = STATUS_PENDING; + PageOp->OpType = OpType; + PageOp->MArea = MArea; + KeInitializeEvent(&PageOp->CompletionEvent, NotificationEvent, FALSE); + MmPageOpHashTable[Hash] = PageOp; + InterlockedIncrement((LONG *)&MArea->PageOpCount); - KeReleaseSpinLock(&MmPageOpHashTableLock, oldIrql); - return(PageOp); + KeReleaseSpinLock(&MmPageOpHashTableLock, oldIrql); + return(PageOp); } VOID INIT_FUNCTION MmInitializePageOp(VOID) { - memset(MmPageOpHashTable, 0, sizeof(MmPageOpHashTable)); - KeInitializeSpinLock(&MmPageOpHashTableLock); + memset(MmPageOpHashTable, 0, sizeof(MmPageOpHashTable)); + KeInitializeSpinLock(&MmPageOpHashTableLock); - ExInitializeNPagedLookasideList (&MmPageOpLookasideList, - NULL, - NULL, - 0, - sizeof(MM_PAGEOP), - TAG_MM_PAGEOP, - 50); + ExInitializeNPagedLookasideList (&MmPageOpLookasideList, + NULL, + NULL, + 0, + sizeof(MM_PAGEOP), + TAG_MM_PAGEOP, + 50); } diff --git a/reactos/ntoskrnl/mm/pager.c b/reactos/ntoskrnl/mm/pager.c index 7bb64e5e5fb..04c8dca557f 100644 --- a/reactos/ntoskrnl/mm/pager.c +++ b/reactos/ntoskrnl/mm/pager.c @@ -1,4 +1,4 @@ -/* $Id: pager.c,v 1.16 2003/11/16 15:20:39 hbirr Exp $ +/* $Id: pager.c,v 1.17 2004/04/10 22:35:25 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -35,25 +35,25 @@ static ULONG PagerThreadWorkCount; BOOLEAN MiIsPagerThread(VOID) { - return(PsGetCurrentThreadId() == PagerThreadId.UniqueThread); + return(PsGetCurrentThreadId() == PagerThreadId.UniqueThread); } VOID MiStartPagerThread(VOID) { - ULONG WasWorking; + ULONG WasWorking; - WasWorking = InterlockedIncrement(&PagerThreadWorkCount); - if (WasWorking == 1) - { + WasWorking = InterlockedIncrement(&PagerThreadWorkCount); + if (WasWorking == 1) + { KeSetEvent(&PagerThreadEvent, IO_NO_INCREMENT, FALSE); - } + } } VOID MiStopPagerThread(VOID) { - (VOID)InterlockedDecrement(&PagerThreadWorkCount); + (VOID)InterlockedDecrement(&PagerThreadWorkCount); } static NTSTATUS STDCALL @@ -62,53 +62,54 @@ MmPagerThreadMain(PVOID Ignored) NTSTATUS Status; for(;;) - { - /* Wake for a low memory situation or a terminate request. */ - Status = KeWaitForSingleObject(&PagerThreadEvent, - 0, - KernelMode, - FALSE, - NULL); - if (!NT_SUCCESS(Status)) - { - DbgPrint("PagerThread: Wait failed\n"); - KEBUGCHECK(0); - } - if (PagerThreadShouldTerminate) - { - DbgPrint("PagerThread: Terminating\n"); - return(STATUS_SUCCESS); - } - do - { - /* Try and make some memory available to the system. */ - MmRebalanceMemoryConsumers(); - } while(PagerThreadWorkCount > 0); - } + { + /* Wake for a low memory situation or a terminate request. */ + Status = KeWaitForSingleObject(&PagerThreadEvent, + 0, + KernelMode, + FALSE, + NULL); + if (!NT_SUCCESS(Status)) + { + DbgPrint("PagerThread: Wait failed\n"); + KEBUGCHECK(0); + } + if (PagerThreadShouldTerminate) + { + DbgPrint("PagerThread: Terminating\n"); + return(STATUS_SUCCESS); + } + do + { + /* Try and make some memory available to the system. */ + MmRebalanceMemoryConsumers(); + } + while(PagerThreadWorkCount > 0); + } } NTSTATUS MmInitPagerThread(VOID) { NTSTATUS Status; - + PagerThreadShouldTerminate = FALSE; PagerThreadWorkCount = 0; KeInitializeEvent(&PagerThreadEvent, - SynchronizationEvent, - FALSE); - + SynchronizationEvent, + FALSE); + Status = PsCreateSystemThread(&PagerThreadHandle, - THREAD_ALL_ACCESS, - NULL, - NULL, - &PagerThreadId, - (PKSTART_ROUTINE) MmPagerThreadMain, - NULL); + THREAD_ALL_ACCESS, + NULL, + NULL, + &PagerThreadId, + (PKSTART_ROUTINE) MmPagerThreadMain, + NULL); if (!NT_SUCCESS(Status)) - { - return(Status); - } - + { + return(Status); + } + return(STATUS_SUCCESS); } #endif diff --git a/reactos/ntoskrnl/mm/pagfault.c b/reactos/ntoskrnl/mm/pagfault.c index 1a247d29791..9b2adeb18f7 100644 --- a/reactos/ntoskrnl/mm/pagfault.c +++ b/reactos/ntoskrnl/mm/pagfault.c @@ -1,4 +1,4 @@ -/* $Id: pagfault.c,v 1.5 2003/07/10 21:05:03 royce Exp $ */ +/* $Id: pagfault.c,v 1.6 2004/04/10 22:35:25 gdalsnes Exp $ */ #include #include @@ -8,14 +8,14 @@ BOOLEAN STDCALL MmIsRecursiveIoFault ( - VOID - ) + VOID +) { - PETHREAD Thread = PsGetCurrentThread (); + PETHREAD Thread = PsGetCurrentThread (); - return ( Thread->DisablePageFaultClustering - | Thread->ForwardClusterOnly - ); + return ( Thread->DisablePageFaultClustering + | Thread->ForwardClusterOnly + ); } diff --git a/reactos/ntoskrnl/mm/pool.c b/reactos/ntoskrnl/mm/pool.c index 05321286819..c1c682baea1 100644 --- a/reactos/ntoskrnl/mm/pool.c +++ b/reactos/ntoskrnl/mm/pool.c @@ -1,4 +1,4 @@ -/* $Id: pool.c,v 1.27 2004/02/26 18:54:52 navaraf Exp $ +/* $Id: pool.c,v 1.28 2004/04/10 22:35:25 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -25,40 +25,40 @@ STATIC PVOID STDCALL EiAllocatePool(POOL_TYPE PoolType, - ULONG NumberOfBytes, - ULONG Tag, - PVOID Caller) + ULONG NumberOfBytes, + ULONG Tag, + PVOID Caller) { PVOID Block; - - + + switch(PoolType) - { + { case NonPagedPool: case NonPagedPoolMustSucceed: case NonPagedPoolCacheAligned: case NonPagedPoolCacheAlignedMustS: - Block = - ExAllocateNonPagedPoolWithTag(PoolType, - NumberOfBytes, - Tag, - Caller); - break; - + Block = + ExAllocateNonPagedPoolWithTag(PoolType, + NumberOfBytes, + Tag, + Caller); + break; + case PagedPool: case PagedPoolCacheAligned: - Block = ExAllocatePagedPoolWithTag(PoolType,NumberOfBytes,Tag); - break; - + Block = ExAllocatePagedPoolWithTag(PoolType,NumberOfBytes,Tag); + break; + default: - return(NULL); - }; - - if ((PoolType==NonPagedPoolMustSucceed || - PoolType==NonPagedPoolCacheAlignedMustS) && Block==NULL) - { - KEBUGCHECK(MUST_SUCCEED_POOL_EMPTY); - } + return(NULL); + }; + + if ((PoolType==NonPagedPoolMustSucceed || + PoolType==NonPagedPoolCacheAlignedMustS) && Block==NULL) + { + KEBUGCHECK(MUST_SUCCEED_POOL_EMPTY); + } return(Block); } @@ -91,18 +91,21 @@ ExAllocatePool (POOL_TYPE PoolType, ULONG NumberOfBytes) { PVOID Block; #if defined(__GNUC__) + Block = EiAllocatePool(PoolType, - NumberOfBytes, - TAG_NONE, - (PVOID)__builtin_return_address(0)); + NumberOfBytes, + TAG_NONE, + (PVOID)__builtin_return_address(0)); #elif defined(_MSC_VER) + Block = EiAllocatePool(PoolType, - NumberOfBytes, - TAG_NONE, - &ExAllocatePool); + NumberOfBytes, + TAG_NONE, + &ExAllocatePool); #else #error Unknown compiler #endif + return(Block); } @@ -115,18 +118,21 @@ ExAllocatePoolWithTag (ULONG PoolType, ULONG NumberOfBytes, ULONG Tag) { PVOID Block; #if defined(__GNUC__) + Block = EiAllocatePool(PoolType, - NumberOfBytes, - Tag, - (PVOID)__builtin_return_address(0)); + NumberOfBytes, + Tag, + (PVOID)__builtin_return_address(0)); #elif defined(_MSC_VER) + Block = EiAllocatePool(PoolType, - NumberOfBytes, - Tag, - &ExAllocatePoolWithTag); + NumberOfBytes, + Tag, + &ExAllocatePoolWithTag); #else #error Unknown compiler #endif + return(Block); } @@ -137,7 +143,7 @@ ExAllocatePoolWithTag (ULONG PoolType, ULONG NumberOfBytes, ULONG Tag) PVOID STDCALL ExAllocatePoolWithQuota (POOL_TYPE PoolType, ULONG NumberOfBytes) { - return(ExAllocatePoolWithQuotaTag(PoolType, NumberOfBytes, TAG_NONE)); + return(ExAllocatePoolWithQuotaTag(PoolType, NumberOfBytes, TAG_NONE)); } @@ -145,20 +151,21 @@ ExAllocatePoolWithQuota (POOL_TYPE PoolType, ULONG NumberOfBytes) * @unimplemented */ PVOID STDCALL -ExAllocatePoolWithQuotaTag (IN POOL_TYPE PoolType, - IN ULONG NumberOfBytes, - IN ULONG Tag) +ExAllocatePoolWithQuotaTag (IN POOL_TYPE PoolType, + IN ULONG NumberOfBytes, + IN ULONG Tag) { #if 0 - PVOID Block; - Block = EiAllocatePool(PoolType, - NumberOfBytes, - Tag, - (PVOID)__builtin_return_address(0)); - return(Block); + PVOID Block; + Block = EiAllocatePool(PoolType, + NumberOfBytes, + Tag, + (PVOID)__builtin_return_address(0)); + return(Block); #else - UNIMPLEMENTED; - return(NULL); + + UNIMPLEMENTED; + return(NULL); #endif } @@ -168,14 +175,14 @@ ExAllocatePoolWithQuotaTag (IN POOL_TYPE PoolType, VOID STDCALL ExFreePool(IN PVOID Block) { - if (Block >= MmPagedPoolBase && (char*)Block < ((char*)MmPagedPoolBase + MmPagedPoolSize)) - { + if (Block >= MmPagedPoolBase && (char*)Block < ((char*)MmPagedPoolBase + MmPagedPoolSize)) + { ExFreePagedPool(Block); - } - else - { + } + else + { ExFreeNonPagedPool(Block); - } + } } /* @@ -184,8 +191,8 @@ ExFreePool(IN PVOID Block) VOID STDCALL ExFreePoolWithTag(IN PVOID Block, IN ULONG Tag) { - /* FIXME: Validate the tag */ - ExFreePool(Block); + /* FIXME: Validate the tag */ + ExFreePool(Block); } /* EOF */ diff --git a/reactos/ntoskrnl/mm/ppool.c b/reactos/ntoskrnl/mm/ppool.c index f37237c66fe..cdcd2b10320 100644 --- a/reactos/ntoskrnl/mm/ppool.c +++ b/reactos/ntoskrnl/mm/ppool.c @@ -1,4 +1,4 @@ -/* $Id: ppool.c,v 1.27 2004/03/30 09:28:44 gvg Exp $ +/* $Id: ppool.c,v 1.28 2004/04/10 22:35:25 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -34,18 +34,21 @@ typedef struct _MM_PPOOL_FREE_BLOCK_HEADER { - ULONG Size; - struct _MM_PPOOL_FREE_BLOCK_HEADER* NextFree; -} MM_PPOOL_FREE_BLOCK_HEADER, *PMM_PPOOL_FREE_BLOCK_HEADER; + ULONG Size; + struct _MM_PPOOL_FREE_BLOCK_HEADER* NextFree; +} +MM_PPOOL_FREE_BLOCK_HEADER, *PMM_PPOOL_FREE_BLOCK_HEADER; typedef struct _MM_PPOOL_USED_BLOCK_HEADER { - ULONG Size; + ULONG Size; #if MM_PPOOL_REDZONE_BYTES - ULONG UserSize; // how many bytes the user actually asked for... - struct _MM_PPOOL_USED_BLOCK_HEADER* NextUsed; + + ULONG UserSize; // how many bytes the user actually asked for... + struct _MM_PPOOL_USED_BLOCK_HEADER* NextUsed; #endif//MM_PPOOL_REDZONE_BYTES -} MM_PPOOL_USED_BLOCK_HEADER, *PMM_PPOOL_USED_BLOCK_HEADER; +} +MM_PPOOL_USED_BLOCK_HEADER, *PMM_PPOOL_USED_BLOCK_HEADER; PVOID MmPagedPoolBase; ULONG MmPagedPoolSize; @@ -63,49 +66,50 @@ inline static void* block_to_address ( PVOID blk ) * address (internal) */ { - return ( (void *) ((char*)blk + sizeof(MM_PPOOL_USED_BLOCK_HEADER) + MM_PPOOL_REDZONE_BYTES) ); + return ( (void *) ((char*)blk + sizeof(MM_PPOOL_USED_BLOCK_HEADER) + MM_PPOOL_REDZONE_BYTES) ); } inline static PMM_PPOOL_USED_BLOCK_HEADER address_to_block(PVOID addr) { - return (PMM_PPOOL_USED_BLOCK_HEADER) - ( ((char*)addr) - sizeof(MM_PPOOL_USED_BLOCK_HEADER) - MM_PPOOL_REDZONE_BYTES ); + return (PMM_PPOOL_USED_BLOCK_HEADER) + ( ((char*)addr) - sizeof(MM_PPOOL_USED_BLOCK_HEADER) - MM_PPOOL_REDZONE_BYTES ); } VOID INIT_FUNCTION MmInitializePagedPool(VOID) { - MmPagedPoolFirstFreeBlock = (PMM_PPOOL_FREE_BLOCK_HEADER)MmPagedPoolBase; - /* - * We are still at a high IRQL level at this point so explicitly commit - * the first page of the paged pool before writing the first block header. - */ - MmCommitPagedPoolAddress((PVOID)MmPagedPoolFirstFreeBlock, FALSE); - MmPagedPoolFirstFreeBlock->Size = MmPagedPoolSize; - MmPagedPoolFirstFreeBlock->NextFree = NULL; + MmPagedPoolFirstFreeBlock = (PMM_PPOOL_FREE_BLOCK_HEADER)MmPagedPoolBase; + /* + * We are still at a high IRQL level at this point so explicitly commit + * the first page of the paged pool before writing the first block header. + */ + MmCommitPagedPoolAddress((PVOID)MmPagedPoolFirstFreeBlock, FALSE); + MmPagedPoolFirstFreeBlock->Size = MmPagedPoolSize; + MmPagedPoolFirstFreeBlock->NextFree = NULL; #if MM_PPOOL_REDZONE_BYTES - MmPagedPoolFirstUsedBlock = NULL; + + MmPagedPoolFirstUsedBlock = NULL; #endif//MM_PPOOL_REDZONE_BYTES - ExInitializeFastMutex(&MmPagedPoolLock); + ExInitializeFastMutex(&MmPagedPoolLock); } #ifdef ENABLE_VALIDATE_POOL static void VerifyPagedPool ( int line ) { - PMM_PPOOL_FREE_BLOCK_HEADER p = MmPagedPoolFirstFreeBlock; - int count = 0; - DPRINT ( "VerifyPagedPool(%i):\n", line ); - while ( p ) - { - DPRINT ( " 0x%x: %lu bytes (next 0x%x)\n", p, p->Size, p->NextFree ); - ASSERT_PTR(p); - ASSERT_SIZE(p->Size); - count++; - p = p->NextFree; - } - DPRINT ( "VerifyPagedPool(%i): (%lu blocks)\n", line, count ); + PMM_PPOOL_FREE_BLOCK_HEADER p = MmPagedPoolFirstFreeBlock; + int count = 0; + DPRINT ( "VerifyPagedPool(%i):\n", line ); + while ( p ) + { + DPRINT ( " 0x%x: %lu bytes (next 0x%x)\n", p, p->Size, p->NextFree ); + ASSERT_PTR(p); + ASSERT_SIZE(p->Size); + count++; + p = p->NextFree; + } + DPRINT ( "VerifyPagedPool(%i): (%lu blocks)\n", line, count ); } #define VerifyPagedPool() VerifyPagedPool(__LINE__) #else @@ -116,38 +120,38 @@ VOID STDCALL MmDbgPagedPoolRedZoneCheck ( const char* file, int line ) { #if MM_PPOOL_REDZONE_BYTES - PMM_PPOOL_USED_BLOCK_HEADER pUsed = MmPagedPoolFirstUsedBlock; - int i; - BOOL bLow = TRUE; - BOOL bHigh = TRUE; + PMM_PPOOL_USED_BLOCK_HEADER pUsed = MmPagedPoolFirstUsedBlock; + int i; + BOOL bLow = TRUE; + BOOL bHigh = TRUE; - while ( pUsed ) - { - PUCHAR Addr = (PUCHAR)block_to_address(pUsed); - for ( i = 0; i < MM_PPOOL_REDZONE_BYTES; i++ ) - { - bLow = bLow && ( *(Addr-i-1) == MM_PPOOL_REDZONE_VALUE ); - bHigh = bHigh && ( *(Addr+pUsed->UserSize+i) == MM_PPOOL_REDZONE_VALUE ); - } - if ( !bLow || !bHigh ) - { - const char* violation = "High and Low-side"; - if ( bHigh ) // high is okay, so it was just low failed - violation = "Low-side"; - else if ( bLow ) // low side is okay, so it was just high failed - violation = "High-side"; - DbgPrint("%s(%i): %s redzone violation detected for paged pool address 0x%x\n", - file, line, violation, Addr ); - KEBUGCHECK(0); - } - pUsed = pUsed->NextUsed; - } + while ( pUsed ) + { + PUCHAR Addr = (PUCHAR)block_to_address(pUsed); + for ( i = 0; i < MM_PPOOL_REDZONE_BYTES; i++ ) + { + bLow = bLow && ( *(Addr-i-1) == MM_PPOOL_REDZONE_VALUE ); + bHigh = bHigh && ( *(Addr+pUsed->UserSize+i) == MM_PPOOL_REDZONE_VALUE ); + } + if ( !bLow || !bHigh ) + { + const char* violation = "High and Low-side"; + if ( bHigh ) // high is okay, so it was just low failed + violation = "Low-side"; + else if ( bLow ) // low side is okay, so it was just high failed + violation = "High-side"; + DbgPrint("%s(%i): %s redzone violation detected for paged pool address 0x%x\n", + file, line, violation, Addr ); + KEBUGCHECK(0); + } + pUsed = pUsed->NextUsed; + } #endif//MM_PPOOL_REDZONE_BYTES } /********************************************************************** - * NAME INTERNAL - * ExAllocatePagedPoolWithTag@12 + * NAME INTERNAL + * ExAllocatePagedPoolWithTag@12 * * DESCRIPTION * @@ -156,181 +160,182 @@ MmDbgPagedPoolRedZoneCheck ( const char* file, int line ) * RETURN VALUE */ PVOID STDCALL -ExAllocatePagedPoolWithTag (IN POOL_TYPE PoolType, - IN ULONG NumberOfBytes, - IN ULONG Tag) +ExAllocatePagedPoolWithTag (IN POOL_TYPE PoolType, + IN ULONG NumberOfBytes, + IN ULONG Tag) { - PMM_PPOOL_FREE_BLOCK_HEADER BestBlock; - PMM_PPOOL_FREE_BLOCK_HEADER CurrentBlock; - ULONG BlockSize; - PMM_PPOOL_USED_BLOCK_HEADER NewBlock; - PMM_PPOOL_FREE_BLOCK_HEADER NextBlock; - PMM_PPOOL_FREE_BLOCK_HEADER PreviousBlock; - PMM_PPOOL_FREE_BLOCK_HEADER BestPreviousBlock; - PVOID BlockAddress; - ULONG Alignment; + PMM_PPOOL_FREE_BLOCK_HEADER BestBlock; + PMM_PPOOL_FREE_BLOCK_HEADER CurrentBlock; + ULONG BlockSize; + PMM_PPOOL_USED_BLOCK_HEADER NewBlock; + PMM_PPOOL_FREE_BLOCK_HEADER NextBlock; + PMM_PPOOL_FREE_BLOCK_HEADER PreviousBlock; + PMM_PPOOL_FREE_BLOCK_HEADER BestPreviousBlock; + PVOID BlockAddress; + ULONG Alignment; - ExAcquireFastMutex(&MmPagedPoolLock); + ExAcquireFastMutex(&MmPagedPoolLock); - /* - * Don't bother allocating anything for a zero-byte block. - */ - if (NumberOfBytes == 0) - { + /* + * Don't bother allocating anything for a zero-byte block. + */ + if (NumberOfBytes == 0) + { MmDbgPagedPoolRedZoneCheck(__FILE__,__LINE__); ExReleaseFastMutex(&MmPagedPoolLock); return(NULL); - } + } - DPRINT ( "ExAllocatePagedPoolWithTag(%i,%lu,%lu)\n", PoolType, NumberOfBytes, Tag ); - VerifyPagedPool(); + DPRINT ( "ExAllocatePagedPoolWithTag(%i,%lu,%lu)\n", PoolType, NumberOfBytes, Tag ); + VerifyPagedPool(); - if (NumberOfBytes >= PAGE_SIZE) - { + if (NumberOfBytes >= PAGE_SIZE) + { Alignment = PAGE_SIZE; - } - else if (PoolType == PagedPoolCacheAligned) - { + } + else if (PoolType == PagedPoolCacheAligned) + { Alignment = MM_CACHE_LINE_SIZE; - } - else - { + } + else + { Alignment = MM_POOL_ALIGNMENT; - } + } - /* - * Calculate the total number of bytes we will need. - */ - BlockSize = NumberOfBytes + sizeof(MM_PPOOL_USED_BLOCK_HEADER) + 2*MM_PPOOL_REDZONE_BYTES; - if (BlockSize < sizeof(MM_PPOOL_FREE_BLOCK_HEADER)) - { - /* At least we need the size of the free block header. */ - BlockSize = sizeof(MM_PPOOL_FREE_BLOCK_HEADER); - } + /* + * Calculate the total number of bytes we will need. + */ + BlockSize = NumberOfBytes + sizeof(MM_PPOOL_USED_BLOCK_HEADER) + 2*MM_PPOOL_REDZONE_BYTES; + if (BlockSize < sizeof(MM_PPOOL_FREE_BLOCK_HEADER)) + { + /* At least we need the size of the free block header. */ + BlockSize = sizeof(MM_PPOOL_FREE_BLOCK_HEADER); + } - /* - * Find the best-fitting block. - */ - PreviousBlock = NULL; - BestPreviousBlock = BestBlock = NULL; - CurrentBlock = MmPagedPoolFirstFreeBlock; - if ( Alignment > 0 ) - { + /* + * Find the best-fitting block. + */ + PreviousBlock = NULL; + BestPreviousBlock = BestBlock = NULL; + CurrentBlock = MmPagedPoolFirstFreeBlock; + if ( Alignment > 0 ) + { PVOID BestAlignedAddr = NULL; while ( CurrentBlock != NULL ) - { - PVOID Addr = block_to_address(CurrentBlock); - PVOID CurrentBlockEnd = (char*)CurrentBlock + CurrentBlock->Size; - /* calculate last size-aligned address available within this block */ - PVOID AlignedAddr = MM_ROUND_DOWN((char*)CurrentBlockEnd-NumberOfBytes-MM_PPOOL_REDZONE_BYTES, Alignment); - assert ( (char*)AlignedAddr+NumberOfBytes+MM_PPOOL_REDZONE_BYTES <= (char*)CurrentBlockEnd ); + { + PVOID Addr = block_to_address(CurrentBlock); + PVOID CurrentBlockEnd = (char*)CurrentBlock + CurrentBlock->Size; + /* calculate last size-aligned address available within this block */ + PVOID AlignedAddr = MM_ROUND_DOWN((char*)CurrentBlockEnd-NumberOfBytes-MM_PPOOL_REDZONE_BYTES, Alignment); + assert ( (char*)AlignedAddr+NumberOfBytes+MM_PPOOL_REDZONE_BYTES <= (char*)CurrentBlockEnd ); - /* special case, this address is already size-aligned, and the right size */ - if ( Addr == AlignedAddr ) - { - BestAlignedAddr = AlignedAddr; - BestPreviousBlock = PreviousBlock; - BestBlock = CurrentBlock; - break; - } - else if ( Addr < (PVOID)address_to_block(AlignedAddr) ) - { - /* - * there's enough room to allocate our size-aligned memory out - * of this block, see if it's a better choice than any previous - * finds - */ - if ( BestBlock == NULL || BestBlock->Size > CurrentBlock->Size ) - { - BestAlignedAddr = AlignedAddr; - BestPreviousBlock = PreviousBlock; - BestBlock = CurrentBlock; - } - } + /* special case, this address is already size-aligned, and the right size */ + if ( Addr == AlignedAddr ) + { + BestAlignedAddr = AlignedAddr; + BestPreviousBlock = PreviousBlock; + BestBlock = CurrentBlock; + break; + } + else if ( Addr < (PVOID)address_to_block(AlignedAddr) ) + { + /* + * there's enough room to allocate our size-aligned memory out + * of this block, see if it's a better choice than any previous + * finds + */ + if ( BestBlock == NULL || BestBlock->Size > CurrentBlock->Size ) + { + BestAlignedAddr = AlignedAddr; + BestPreviousBlock = PreviousBlock; + BestBlock = CurrentBlock; + } + } - PreviousBlock = CurrentBlock; - CurrentBlock = CurrentBlock->NextFree; - } + PreviousBlock = CurrentBlock; + CurrentBlock = CurrentBlock->NextFree; + } /* * we found a best block can/should we chop a few bytes off the beginning * into a separate memory block? */ if ( BestBlock != NULL ) - { - PVOID Addr = block_to_address(BestBlock); - if ( BestAlignedAddr != Addr ) - { - PMM_PPOOL_FREE_BLOCK_HEADER NewFreeBlock = - (PMM_PPOOL_FREE_BLOCK_HEADER)address_to_block(BestAlignedAddr); - assert ( BestAlignedAddr > Addr ); - NewFreeBlock->Size = (char*)Addr + BestBlock->Size - (char*)BestAlignedAddr; - ASSERT_SIZE(NewFreeBlock->Size); - BestBlock->Size = (size_t)NewFreeBlock - (size_t)Addr; - ASSERT_SIZE(BestBlock->Size); + { + PVOID Addr = block_to_address(BestBlock); + if ( BestAlignedAddr != Addr ) + { + PMM_PPOOL_FREE_BLOCK_HEADER NewFreeBlock = + (PMM_PPOOL_FREE_BLOCK_HEADER)address_to_block(BestAlignedAddr); + assert ( BestAlignedAddr > Addr ); + NewFreeBlock->Size = (char*)Addr + BestBlock->Size - (char*)BestAlignedAddr; + ASSERT_SIZE(NewFreeBlock->Size); + BestBlock->Size = (size_t)NewFreeBlock - (size_t)Addr; + ASSERT_SIZE(BestBlock->Size); - DPRINT ( "breaking off preceding bytes into their own block...\n" ); - DPRINT ( "NewFreeBlock 0x%x Size %lu (Old Block's new size %lu) NextFree 0x%x\n", - NewFreeBlock, NewFreeBlock->Size, BestBlock->Size, BestBlock->NextFree ); + DPRINT ( "breaking off preceding bytes into their own block...\n" ); + DPRINT ( "NewFreeBlock 0x%x Size %lu (Old Block's new size %lu) NextFree 0x%x\n", + NewFreeBlock, NewFreeBlock->Size, BestBlock->Size, BestBlock->NextFree ); - /* insert the new block into the chain */ - NewFreeBlock->NextFree = BestBlock->NextFree; - BestBlock->NextFree = NewFreeBlock; + /* insert the new block into the chain */ + NewFreeBlock->NextFree = BestBlock->NextFree; + BestBlock->NextFree = NewFreeBlock; - /* we want the following code to use our size-aligned block */ - BestPreviousBlock = BestBlock; - BestBlock = NewFreeBlock; + /* we want the following code to use our size-aligned block */ + BestPreviousBlock = BestBlock; + BestBlock = NewFreeBlock; - //VerifyPagedPool(); - } - } - } - /* - * non-size-aligned block search - */ - else while ( CurrentBlock != NULL ) - { - if ( CurrentBlock->Size >= BlockSize - && ( BestBlock == NULL || BestBlock->Size > CurrentBlock->Size ) - ) - { - BestPreviousBlock = PreviousBlock; - BestBlock = CurrentBlock; - } + //VerifyPagedPool(); + } + } + } + /* + * non-size-aligned block search + */ + else + while ( CurrentBlock != NULL ) + { + if ( CurrentBlock->Size >= BlockSize + && ( BestBlock == NULL || BestBlock->Size > CurrentBlock->Size ) + ) + { + BestPreviousBlock = PreviousBlock; + BestBlock = CurrentBlock; + } - PreviousBlock = CurrentBlock; - CurrentBlock = CurrentBlock->NextFree; - } + PreviousBlock = CurrentBlock; + CurrentBlock = CurrentBlock->NextFree; + } - /* - * We didn't find anything suitable at all. - */ - if (BestBlock == NULL) - { + /* + * We didn't find anything suitable at all. + */ + if (BestBlock == NULL) + { DPRINT1("Trying to allocate %lu bytes from paged pool - nothing suitable found, returning NULL\n", NumberOfBytes ); ExReleaseFastMutex(&MmPagedPoolLock); return(NULL); - } + } - DPRINT("BestBlock 0x%x NextFree 0x%x\n", BestBlock, BestBlock->NextFree ); + DPRINT("BestBlock 0x%x NextFree 0x%x\n", BestBlock, BestBlock->NextFree ); - //VerifyPagedPool(); + //VerifyPagedPool(); - /* - * Is there enough space to create a second block from the unused portion. - */ - if ( BestBlock->Size > BlockSize - && (BestBlock->Size - BlockSize) > sizeof(MM_PPOOL_FREE_BLOCK_HEADER) - ) - { + /* + * Is there enough space to create a second block from the unused portion. + */ + if ( BestBlock->Size > BlockSize + && (BestBlock->Size - BlockSize) > sizeof(MM_PPOOL_FREE_BLOCK_HEADER) + ) + { ULONG NewSize = BestBlock->Size - BlockSize; ASSERT_SIZE ( NewSize ); //DPRINT("creating 2nd block from unused portion\n"); DPRINT("BestBlock 0x%x Size 0x%x BlockSize 0x%x NewSize 0x%x\n", - BestBlock, BestBlock->Size, BlockSize, NewSize ); + BestBlock, BestBlock->Size, BlockSize, NewSize ); /* * Create the new free block. @@ -349,15 +354,15 @@ ExAllocatePagedPoolWithTag (IN POOL_TYPE PoolType, */ //DPRINT("replacing old free block with it"); if (BestPreviousBlock == NULL) - { - //DPRINT("(from beginning)"); - MmPagedPoolFirstFreeBlock = NextBlock; - } + { + //DPRINT("(from beginning)"); + MmPagedPoolFirstFreeBlock = NextBlock; + } else - { - //DPRINT("(from previous)"); - BestPreviousBlock->NextFree = NextBlock; - } + { + //DPRINT("(from previous)"); + BestPreviousBlock->NextFree = NextBlock; + } //DPRINT(".\n"); /* @@ -369,9 +374,9 @@ ExAllocatePagedPoolWithTag (IN POOL_TYPE PoolType, NewBlock->Size = BlockSize; ASSERT_SIZE ( NewBlock->Size ); //DPRINT(".\n"); - } - else - { + } + else + { ULONG NewSize = BestBlock->Size; /* @@ -379,13 +384,13 @@ ExAllocatePagedPoolWithTag (IN POOL_TYPE PoolType, */ //DPRINT ( "Removing selected block from free block list\n" ); if (BestPreviousBlock == NULL) - { - MmPagedPoolFirstFreeBlock = BestBlock->NextFree; - } + { + MmPagedPoolFirstFreeBlock = BestBlock->NextFree; + } else - { - BestPreviousBlock->NextFree = BestBlock->NextFree; - } + { + BestPreviousBlock->NextFree = BestBlock->NextFree; + } /* * Set up the header of the new block @@ -393,167 +398,168 @@ ExAllocatePagedPoolWithTag (IN POOL_TYPE PoolType, NewBlock = (PMM_PPOOL_USED_BLOCK_HEADER)BestBlock; NewBlock->Size = NewSize; ASSERT_SIZE ( NewBlock->Size ); - } + } #if MM_PPOOL_REDZONE_BYTES - // now add the block to the used block list - NewBlock->NextUsed = MmPagedPoolFirstUsedBlock; - MmPagedPoolFirstUsedBlock = NewBlock; + // now add the block to the used block list + NewBlock->NextUsed = MmPagedPoolFirstUsedBlock; + MmPagedPoolFirstUsedBlock = NewBlock; #endif//MM_PPOOL_REDZONE_BYTES - VerifyPagedPool(); + VerifyPagedPool(); - ExReleaseFastMutex(&MmPagedPoolLock); + ExReleaseFastMutex(&MmPagedPoolLock); - BlockAddress = block_to_address ( NewBlock ); -/* RtlZeroMemory(BlockAddress, NumberOfBytes);*/ + BlockAddress = block_to_address ( NewBlock ); + /* RtlZeroMemory(BlockAddress, NumberOfBytes);*/ #if MM_PPOOL_REDZONE_BYTES - NewBlock->UserSize = NumberOfBytes; - // write out buffer-overrun detection bytes - { - PUCHAR Addr = (PUCHAR)BlockAddress; - //DbgPrint ( "writing buffer-overrun detection bytes" ); - memset ( Addr - MM_PPOOL_REDZONE_BYTES, - MM_PPOOL_REDZONE_VALUE, MM_PPOOL_REDZONE_BYTES ); - memset ( Addr + NewBlock->UserSize, MM_PPOOL_REDZONE_VALUE, - MM_PPOOL_REDZONE_BYTES ); - /*for ( i = 0; i < MM_PPOOL_REDZONE_BYTES; i++ ) - { - //DbgPrint("."); - *(Addr-i-1) = 0xCD; - //DbgPrint("o"); - *(Addr+NewBlock->UserSize+i) = 0xCD; - }*/ - //DbgPrint ( "done!\n" ); - } + + NewBlock->UserSize = NumberOfBytes; + // write out buffer-overrun detection bytes + { + PUCHAR Addr = (PUCHAR)BlockAddress; + //DbgPrint ( "writing buffer-overrun detection bytes" ); + memset ( Addr - MM_PPOOL_REDZONE_BYTES, + MM_PPOOL_REDZONE_VALUE, MM_PPOOL_REDZONE_BYTES ); + memset ( Addr + NewBlock->UserSize, MM_PPOOL_REDZONE_VALUE, + MM_PPOOL_REDZONE_BYTES ); + /*for ( i = 0; i < MM_PPOOL_REDZONE_BYTES; i++ ) + { + //DbgPrint("."); + *(Addr-i-1) = 0xCD; + //DbgPrint("o"); + *(Addr+NewBlock->UserSize+i) = 0xCD; + }*/ + //DbgPrint ( "done!\n" ); + } #endif//MM_PPOOL_REDZONE_BYTES - return(BlockAddress); + return(BlockAddress); } VOID STDCALL ExFreePagedPool(IN PVOID Block) { - PMM_PPOOL_FREE_BLOCK_HEADER PreviousBlock; - PMM_PPOOL_USED_BLOCK_HEADER UsedBlock = address_to_block(Block); - ULONG UsedSize = UsedBlock->Size; - PMM_PPOOL_FREE_BLOCK_HEADER FreeBlock = - (PMM_PPOOL_FREE_BLOCK_HEADER)UsedBlock; - PMM_PPOOL_FREE_BLOCK_HEADER NextBlock; - PMM_PPOOL_FREE_BLOCK_HEADER NextNextBlock; + PMM_PPOOL_FREE_BLOCK_HEADER PreviousBlock; + PMM_PPOOL_USED_BLOCK_HEADER UsedBlock = address_to_block(Block); + ULONG UsedSize = UsedBlock->Size; + PMM_PPOOL_FREE_BLOCK_HEADER FreeBlock = + (PMM_PPOOL_FREE_BLOCK_HEADER)UsedBlock; + PMM_PPOOL_FREE_BLOCK_HEADER NextBlock; + PMM_PPOOL_FREE_BLOCK_HEADER NextNextBlock; #if MM_PPOOL_REDZONE_BYTES - // write out buffer-overrun detection bytes - { - int i; - PUCHAR Addr = (PUCHAR)Block; - //DbgPrint ( "checking buffer-overrun detection bytes..." ); - for ( i = 0; i < MM_PPOOL_REDZONE_BYTES; i++ ) - { - if (*(Addr-i-1) != MM_PPOOL_REDZONE_VALUE) + // write out buffer-overrun detection bytes + { + int i; + PUCHAR Addr = (PUCHAR)Block; + //DbgPrint ( "checking buffer-overrun detection bytes..." ); + for ( i = 0; i < MM_PPOOL_REDZONE_BYTES; i++ ) { - DPRINT1("Attempt to free memory %#08x. Redzone underrun!\n", Block); - } - if (*(Addr+UsedBlock->UserSize+i) != MM_PPOOL_REDZONE_VALUE) - { - DPRINT1("Attempt to free memory %#08x. Redzone overrun!\n", Block); - } + if (*(Addr-i-1) != MM_PPOOL_REDZONE_VALUE) + { + DPRINT1("Attempt to free memory %#08x. Redzone underrun!\n", Block); + } + if (*(Addr+UsedBlock->UserSize+i) != MM_PPOOL_REDZONE_VALUE) + { + DPRINT1("Attempt to free memory %#08x. Redzone overrun!\n", Block); + } - assert ( *(Addr-i-1) == MM_PPOOL_REDZONE_VALUE ); - assert ( *(Addr+UsedBlock->UserSize+i) == MM_PPOOL_REDZONE_VALUE ); - } - //DbgPrint ( "done!\n" ); - } + assert ( *(Addr-i-1) == MM_PPOOL_REDZONE_VALUE ); + assert ( *(Addr+UsedBlock->UserSize+i) == MM_PPOOL_REDZONE_VALUE ); + } + //DbgPrint ( "done!\n" ); + } #endif//MM_PPOOL_REDZONE_BYTES - ExAcquireFastMutex(&MmPagedPoolLock); + ExAcquireFastMutex(&MmPagedPoolLock); #if MM_PPOOL_REDZONE_BYTES - // remove from used list... - { - PMM_PPOOL_USED_BLOCK_HEADER pPrev = MmPagedPoolFirstUsedBlock; - if ( pPrev == UsedBlock ) - { - // special-case, our freeing block is first in list... - MmPagedPoolFirstUsedBlock = pPrev->NextUsed; - } - else - { - while ( pPrev && pPrev->NextUsed != UsedBlock ) - pPrev = pPrev->NextUsed; - // if this assert fails - memory has been corrupted - // ( or I have a logic error...! ) - assert ( pPrev->NextUsed == UsedBlock ); - pPrev->NextUsed = UsedBlock->NextUsed; - } - } + // remove from used list... + { + PMM_PPOOL_USED_BLOCK_HEADER pPrev = MmPagedPoolFirstUsedBlock; + if ( pPrev == UsedBlock ) + { + // special-case, our freeing block is first in list... + MmPagedPoolFirstUsedBlock = pPrev->NextUsed; + } + else + { + while ( pPrev && pPrev->NextUsed != UsedBlock ) + pPrev = pPrev->NextUsed; + // if this assert fails - memory has been corrupted + // ( or I have a logic error...! ) + assert ( pPrev->NextUsed == UsedBlock ); + pPrev->NextUsed = UsedBlock->NextUsed; + } + } #endif//MM_PPOOL_REDZONE_BYTES - /* - * Begin setting up the newly freed block's header. - */ - FreeBlock->Size = UsedSize; - ASSERT_SIZE ( FreeBlock->Size ); + /* + * Begin setting up the newly freed block's header. + */ + FreeBlock->Size = UsedSize; + ASSERT_SIZE ( FreeBlock->Size ); - /* - * Find the blocks immediately before and after the newly freed block on the free list. - */ - PreviousBlock = NULL; - NextBlock = MmPagedPoolFirstFreeBlock; - while (NextBlock != NULL && NextBlock < FreeBlock) - { + /* + * Find the blocks immediately before and after the newly freed block on the free list. + */ + PreviousBlock = NULL; + NextBlock = MmPagedPoolFirstFreeBlock; + while (NextBlock != NULL && NextBlock < FreeBlock) + { PreviousBlock = NextBlock; NextBlock = NextBlock->NextFree; - } + } - /* - * Insert the freed block on the free list. - */ - if (PreviousBlock == NULL) - { + /* + * Insert the freed block on the free list. + */ + if (PreviousBlock == NULL) + { FreeBlock->NextFree = MmPagedPoolFirstFreeBlock; MmPagedPoolFirstFreeBlock = FreeBlock; - } - else - { + } + else + { PreviousBlock->NextFree = FreeBlock; FreeBlock->NextFree = NextBlock; - } + } - /* - * If the next block is immediately adjacent to the newly freed one then - * merge them. - */ - if (NextBlock != NULL && - ((char*)FreeBlock + FreeBlock->Size) == (char*)NextBlock) - { + /* + * If the next block is immediately adjacent to the newly freed one then + * merge them. + */ + if (NextBlock != NULL && + ((char*)FreeBlock + FreeBlock->Size) == (char*)NextBlock) + { FreeBlock->Size = FreeBlock->Size + NextBlock->Size; ASSERT_SIZE ( FreeBlock->Size ); FreeBlock->NextFree = NextBlock->NextFree; NextNextBlock = NextBlock->NextFree; - } - else - { + } + else + { NextNextBlock = NextBlock; - } + } - /* - * If the previous block is adjacent to the newly freed one then - * merge them. - */ - if (PreviousBlock != NULL && - ((char*)PreviousBlock + PreviousBlock->Size) == (char*)FreeBlock) - { + /* + * If the previous block is adjacent to the newly freed one then + * merge them. + */ + if (PreviousBlock != NULL && + ((char*)PreviousBlock + PreviousBlock->Size) == (char*)FreeBlock) + { PreviousBlock->Size = PreviousBlock->Size + FreeBlock->Size; ASSERT_SIZE ( PreviousBlock->Size ); PreviousBlock->NextFree = NextNextBlock; - } + } - VerifyPagedPool(); + VerifyPagedPool(); - ExReleaseFastMutex(&MmPagedPoolLock); + ExReleaseFastMutex(&MmPagedPoolLock); } /* EOF */ diff --git a/reactos/ntoskrnl/mm/region.c b/reactos/ntoskrnl/mm/region.c index 697158c777a..4dae3a96d7f 100644 --- a/reactos/ntoskrnl/mm/region.c +++ b/reactos/ntoskrnl/mm/region.c @@ -16,14 +16,14 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: region.c,v 1.6 2003/12/30 18:52:05 fireball Exp $ +/* $Id: region.c,v 1.7 2004/04/10 22:35:25 gdalsnes Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/region.c * PROGRAMMER: David Welch * PURPOSE: */ - + /* INCLUDE *****************************************************************/ #include @@ -43,279 +43,283 @@ /* FUNCTIONS *****************************************************************/ -VOID STATIC +VOID STATIC InsertAfterEntry(PLIST_ENTRY Previous, - PLIST_ENTRY Entry) + PLIST_ENTRY Entry) /* * FUNCTION: Insert a list entry after another entry in the list */ { Previous->Flink->Blink = Entry; - + Entry->Flink = Previous->Flink; Entry->Blink = Previous; - + Previous->Flink = Entry; } PMM_REGION STATIC MmSplitRegion(PMM_REGION InitialRegion, PVOID InitialBaseAddress, - PVOID StartAddress, ULONG Length, ULONG NewType, - ULONG NewProtect, PMADDRESS_SPACE AddressSpace, - PMM_ALTER_REGION_FUNC AlterFunc) + PVOID StartAddress, ULONG Length, ULONG NewType, + ULONG NewProtect, PMADDRESS_SPACE AddressSpace, + PMM_ALTER_REGION_FUNC AlterFunc) { - PMM_REGION NewRegion1; - PMM_REGION NewRegion2; - ULONG InternalLength; - - /* Allocate this in front otherwise the failure case is too difficult. */ - NewRegion2 = ExAllocatePoolWithTag(NonPagedPool, sizeof(MM_REGION), - TAG_MM_REGION); - if (NewRegion2 == NULL) - { - return(NULL); - } + PMM_REGION NewRegion1; + PMM_REGION NewRegion2; + ULONG InternalLength; - /* Create the new region. */ - NewRegion1 = ExAllocatePoolWithTag(NonPagedPool, sizeof(MM_REGION), - TAG_MM_REGION); - if (NewRegion1 == NULL) - { + /* Allocate this in front otherwise the failure case is too difficult. */ + NewRegion2 = ExAllocatePoolWithTag(NonPagedPool, sizeof(MM_REGION), + TAG_MM_REGION); + if (NewRegion2 == NULL) + { + return(NULL); + } + + /* Create the new region. */ + NewRegion1 = ExAllocatePoolWithTag(NonPagedPool, sizeof(MM_REGION), + TAG_MM_REGION); + if (NewRegion1 == NULL) + { ExFreePool(NewRegion2); return(NULL); - } - NewRegion1->Type = NewType; - NewRegion1->Protect = NewProtect; - InternalLength = ((char*)InitialBaseAddress + InitialRegion->Length) - (char*)StartAddress; - InternalLength = min(InternalLength, Length); - NewRegion1->Length = InternalLength; - InsertAfterEntry(&InitialRegion->RegionListEntry, - &NewRegion1->RegionListEntry); + } + NewRegion1->Type = NewType; + NewRegion1->Protect = NewProtect; + InternalLength = ((char*)InitialBaseAddress + InitialRegion->Length) - (char*)StartAddress; + InternalLength = min(InternalLength, Length); + NewRegion1->Length = InternalLength; + InsertAfterEntry(&InitialRegion->RegionListEntry, + &NewRegion1->RegionListEntry); - /* - * Call our helper function to do the changes on the addresses contained - * in the initial region. - */ - AlterFunc(AddressSpace, StartAddress, InternalLength, InitialRegion->Type, - InitialRegion->Protect, NewType, NewProtect); + /* + * Call our helper function to do the changes on the addresses contained + * in the initial region. + */ + AlterFunc(AddressSpace, StartAddress, InternalLength, InitialRegion->Type, + InitialRegion->Protect, NewType, NewProtect); - /* - * If necessary create a new region for the portion of the initial region - * beyond the range of addresses to alter. - */ - if (((char*)InitialBaseAddress + InitialRegion->Length) > ((char*)StartAddress + Length)) - { + /* + * If necessary create a new region for the portion of the initial region + * beyond the range of addresses to alter. + */ + if (((char*)InitialBaseAddress + InitialRegion->Length) > ((char*)StartAddress + Length)) + { NewRegion2->Type = InitialRegion->Type; NewRegion2->Protect = InitialRegion->Protect; - NewRegion2->Length = ((char*)InitialBaseAddress + InitialRegion->Length) - - ((char*)StartAddress + Length); - InsertAfterEntry(&NewRegion1->RegionListEntry, - &NewRegion2->RegionListEntry); - } - else - { + NewRegion2->Length = ((char*)InitialBaseAddress + InitialRegion->Length) - + ((char*)StartAddress + Length); + InsertAfterEntry(&NewRegion1->RegionListEntry, + &NewRegion2->RegionListEntry); + } + else + { ExFreePool(NewRegion2); - } + } - /* Either remove or shrink the initial region. */ - if (InitialBaseAddress == StartAddress) - { + /* Either remove or shrink the initial region. */ + if (InitialBaseAddress == StartAddress) + { RemoveEntryList(&InitialRegion->RegionListEntry); ExFreePool(InitialRegion); - } - else - { + } + else + { InitialRegion->Length = (char*)StartAddress - (char*)InitialBaseAddress; - } - - return(NewRegion1); + } + + return(NewRegion1); } NTSTATUS -MmAlterRegion(PMADDRESS_SPACE AddressSpace, PVOID BaseAddress, - PLIST_ENTRY RegionListHead, PVOID StartAddress, ULONG Length, - ULONG NewType, ULONG NewProtect, PMM_ALTER_REGION_FUNC AlterFunc) +MmAlterRegion(PMADDRESS_SPACE AddressSpace, PVOID BaseAddress, + PLIST_ENTRY RegionListHead, PVOID StartAddress, ULONG Length, + ULONG NewType, ULONG NewProtect, PMM_ALTER_REGION_FUNC AlterFunc) { - PMM_REGION InitialRegion; - PVOID InitialBaseAddress; - PMM_REGION NewRegion; - PLIST_ENTRY CurrentEntry; - PMM_REGION CurrentRegion = NULL; - PVOID CurrentBaseAddress; - ULONG RemainingLength; + PMM_REGION InitialRegion; + PVOID InitialBaseAddress; + PMM_REGION NewRegion; + PLIST_ENTRY CurrentEntry; + PMM_REGION CurrentRegion = NULL; + PVOID CurrentBaseAddress; + ULONG RemainingLength; - /* - * Find the first region containing part of the range of addresses to - * be altered. - */ - InitialRegion = MmFindRegion(BaseAddress, RegionListHead, StartAddress, - &InitialBaseAddress); - if (((char*)StartAddress + Length) > - ((char*)InitialBaseAddress + InitialRegion->Length)) - { - RemainingLength = ((char*)StartAddress + Length) - - ((char*)InitialBaseAddress + InitialRegion->Length); - } - else - { + /* + * Find the first region containing part of the range of addresses to + * be altered. + */ + InitialRegion = MmFindRegion(BaseAddress, RegionListHead, StartAddress, + &InitialBaseAddress); + if (((char*)StartAddress + Length) > + ((char*)InitialBaseAddress + InitialRegion->Length)) + { + RemainingLength = ((char*)StartAddress + Length) - + ((char*)InitialBaseAddress + InitialRegion->Length); + } + else + { RemainingLength = 0; - } - /* - * If necessary then split the region into the affected and unaffected parts. - */ - if (InitialRegion->Type != NewType || InitialRegion->Protect != NewProtect) - { - NewRegion = MmSplitRegion(InitialRegion, InitialBaseAddress, - StartAddress, Length, NewType, NewProtect, - AddressSpace, AlterFunc); + } + /* + * If necessary then split the region into the affected and unaffected parts. + */ + if (InitialRegion->Type != NewType || InitialRegion->Protect != NewProtect) + { + NewRegion = MmSplitRegion(InitialRegion, InitialBaseAddress, + StartAddress, Length, NewType, NewProtect, + AddressSpace, AlterFunc); if (NewRegion == NULL) - { - return(STATUS_NO_MEMORY); - } - } - else - { + { + return(STATUS_NO_MEMORY); + } + } + else + { NewRegion = InitialRegion; - } - - /* - * Free any complete regions that are containing in the range of addresses - * and call the helper function to actually do the changes. - */ - CurrentEntry = NewRegion->RegionListEntry.Flink; - CurrentRegion = CONTAINING_RECORD(CurrentEntry, MM_REGION, - RegionListEntry); - CurrentBaseAddress = (char*)StartAddress + NewRegion->Length; - while (RemainingLength > 0 && CurrentRegion->Length <= RemainingLength) - { + } + + /* + * Free any complete regions that are containing in the range of addresses + * and call the helper function to actually do the changes. + */ + CurrentEntry = NewRegion->RegionListEntry.Flink; + CurrentRegion = CONTAINING_RECORD(CurrentEntry, MM_REGION, + RegionListEntry); + CurrentBaseAddress = (char*)StartAddress + NewRegion->Length; + while (RemainingLength > 0 && CurrentRegion->Length <= RemainingLength) + { if (CurrentRegion->Type != NewType && - CurrentRegion->Protect != NewProtect) - { - AlterFunc(AddressSpace, CurrentBaseAddress, CurrentRegion->Length, - CurrentRegion->Type, CurrentRegion->Protect, - NewType, NewProtect); - } + CurrentRegion->Protect != NewProtect) + { + AlterFunc(AddressSpace, CurrentBaseAddress, CurrentRegion->Length, + CurrentRegion->Type, CurrentRegion->Protect, + NewType, NewProtect); + } #if defined(__GNUC__) CurrentBaseAddress += CurrentRegion->Length; #else + { - char* pTemp = CurrentBaseAddress; - pTemp += CurrentRegion->Length; - CurrentBaseAddress = pTemp; + char* pTemp = CurrentBaseAddress; + pTemp += CurrentRegion->Length; + CurrentBaseAddress = pTemp; } #endif NewRegion->Length += CurrentRegion->Length; RemainingLength -= CurrentRegion->Length; - CurrentEntry = CurrentEntry->Flink; + CurrentEntry = CurrentEntry->Flink; RemoveEntryList(&CurrentRegion->RegionListEntry); ExFreePool(CurrentRegion); - CurrentRegion = CONTAINING_RECORD(CurrentEntry, MM_REGION, - RegionListEntry); - } + CurrentRegion = CONTAINING_RECORD(CurrentEntry, MM_REGION, + RegionListEntry); + } - /* - * Split any final region. - */ - if (RemainingLength > 0) - { - CurrentRegion = CONTAINING_RECORD(CurrentEntry, MM_REGION, - RegionListEntry); + /* + * Split any final region. + */ + if (RemainingLength > 0) + { + CurrentRegion = CONTAINING_RECORD(CurrentEntry, MM_REGION, + RegionListEntry); if (CurrentRegion->Type != NewType && - CurrentRegion->Protect != NewProtect) - { - AlterFunc(AddressSpace, CurrentBaseAddress, CurrentRegion->Length, - CurrentRegion->Type, CurrentRegion->Protect, - NewType, NewProtect); - } + CurrentRegion->Protect != NewProtect) + { + AlterFunc(AddressSpace, CurrentBaseAddress, CurrentRegion->Length, + CurrentRegion->Type, CurrentRegion->Protect, + NewType, NewProtect); + } NewRegion->Length += RemainingLength; CurrentRegion->Length -= RemainingLength; - } + } - /* - * If the region after the new region has the same type then merge them. - */ - if (NewRegion->RegionListEntry.Flink != RegionListHead) - { + /* + * If the region after the new region has the same type then merge them. + */ + if (NewRegion->RegionListEntry.Flink != RegionListHead) + { CurrentEntry = NewRegion->RegionListEntry.Flink; - CurrentRegion = CONTAINING_RECORD(CurrentEntry, MM_REGION, - RegionListEntry); + CurrentRegion = CONTAINING_RECORD(CurrentEntry, MM_REGION, + RegionListEntry); if (CurrentRegion->Type == NewRegion->Type && - CurrentRegion->Protect == NewRegion->Protect) - { - NewRegion->Length += CurrentRegion->Length; - RemoveEntryList(&CurrentRegion->RegionListEntry); - ExFreePool(CurrentRegion); - } - } + CurrentRegion->Protect == NewRegion->Protect) + { + NewRegion->Length += CurrentRegion->Length; + RemoveEntryList(&CurrentRegion->RegionListEntry); + ExFreePool(CurrentRegion); + } + } - /* - * If the region before the new region has the same type then merge them. - */ - if (NewRegion->RegionListEntry.Blink != RegionListHead) - { + /* + * If the region before the new region has the same type then merge them. + */ + if (NewRegion->RegionListEntry.Blink != RegionListHead) + { CurrentEntry = NewRegion->RegionListEntry.Blink; - CurrentRegion = CONTAINING_RECORD(CurrentEntry, MM_REGION, - RegionListEntry); + CurrentRegion = CONTAINING_RECORD(CurrentEntry, MM_REGION, + RegionListEntry); if (CurrentRegion->Type == NewRegion->Type && - CurrentRegion->Protect == NewRegion->Protect) - { - NewRegion->Length += CurrentRegion->Length; - RemoveEntryList(&CurrentRegion->RegionListEntry); - ExFreePool(CurrentRegion); - } - } + CurrentRegion->Protect == NewRegion->Protect) + { + NewRegion->Length += CurrentRegion->Length; + RemoveEntryList(&CurrentRegion->RegionListEntry); + ExFreePool(CurrentRegion); + } + } - return(STATUS_SUCCESS); + return(STATUS_SUCCESS); } VOID MmInitialiseRegion(PLIST_ENTRY RegionListHead, ULONG Length, ULONG Type, - ULONG Protect) + ULONG Protect) { - PMM_REGION Region; + PMM_REGION Region; - Region = ExAllocatePoolWithTag(NonPagedPool, sizeof(MM_REGION), - TAG_MM_REGION); - Region->Type = Type; - Region->Protect = Protect; - Region->Length = Length; - InitializeListHead(RegionListHead); - InsertHeadList(RegionListHead, &Region->RegionListEntry); + Region = ExAllocatePoolWithTag(NonPagedPool, sizeof(MM_REGION), + TAG_MM_REGION); + Region->Type = Type; + Region->Protect = Protect; + Region->Length = Length; + InitializeListHead(RegionListHead); + InsertHeadList(RegionListHead, &Region->RegionListEntry); } PMM_REGION MmFindRegion(PVOID BaseAddress, PLIST_ENTRY RegionListHead, PVOID Address, - PVOID* RegionBaseAddress) + PVOID* RegionBaseAddress) { - PLIST_ENTRY current_entry; - PMM_REGION current; - PVOID StartAddress = BaseAddress; - - current_entry = RegionListHead->Flink; - while (current_entry != RegionListHead) - { + PLIST_ENTRY current_entry; + PMM_REGION current; + PVOID StartAddress = BaseAddress; + + current_entry = RegionListHead->Flink; + while (current_entry != RegionListHead) + { current = CONTAINING_RECORD(current_entry, MM_REGION, RegionListEntry); - if (StartAddress <= Address && - ((char*)StartAddress + current->Length) > (char*)Address) - { - if (RegionBaseAddress != NULL) - { - *RegionBaseAddress = StartAddress; - } - return(current); - } + if (StartAddress <= Address && + ((char*)StartAddress + current->Length) > (char*)Address) + { + if (RegionBaseAddress != NULL) + { + *RegionBaseAddress = StartAddress; + } + return(current); + } current_entry = current_entry->Flink; #if defined(__GNUC__) + StartAddress += current->Length; #else + { - char* pTemp = StartAddress; - pTemp += current->Length; - StartAddress = pTemp; + char* pTemp = StartAddress; + pTemp += current->Length; + StartAddress = pTemp; } #endif - } - return(NULL); + + } + return(NULL); } diff --git a/reactos/ntoskrnl/mm/rmap.c b/reactos/ntoskrnl/mm/rmap.c index 9fe184c5151..a6d3d48d6df 100644 --- a/reactos/ntoskrnl/mm/rmap.c +++ b/reactos/ntoskrnl/mm/rmap.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: rmap.c,v 1.27 2004/03/05 11:31:59 hbirr Exp $ +/* $Id: rmap.c,v 1.28 2004/04/10 22:35:25 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top directory * PROJECT: ReactOS kernel @@ -40,10 +40,11 @@ typedef struct _MM_RMAP_ENTRY { - struct _MM_RMAP_ENTRY* Next; - PEPROCESS Process; - PVOID Address; -} MM_RMAP_ENTRY, *PMM_RMAP_ENTRY; + struct _MM_RMAP_ENTRY* Next; + PEPROCESS Process; + PVOID Address; +} +MM_RMAP_ENTRY, *PMM_RMAP_ENTRY; #define TAG_RMAP TAG('R', 'M', 'A', 'P') @@ -57,126 +58,100 @@ static NPAGED_LOOKASIDE_LIST RmapLookasideList; VOID INIT_FUNCTION MmInitializeRmapList(VOID) { - ExInitializeFastMutex(&RmapListLock); - ExInitializeNPagedLookasideList (&RmapLookasideList, - NULL, - NULL, - 0, - sizeof(MM_RMAP_ENTRY), - TAG_RMAP, - 50); + ExInitializeFastMutex(&RmapListLock); + ExInitializeNPagedLookasideList (&RmapLookasideList, + NULL, + NULL, + 0, + sizeof(MM_RMAP_ENTRY), + TAG_RMAP, + 50); } NTSTATUS MmWritePagePhysicalAddress(PHYSICAL_ADDRESS PhysicalAddress) { - PMM_RMAP_ENTRY entry; - PMEMORY_AREA MemoryArea; - PMADDRESS_SPACE AddressSpace; - ULONG Type; - PVOID Address; - PEPROCESS Process; - PMM_PAGEOP PageOp; - ULONG Offset; - NTSTATUS Status = STATUS_SUCCESS; + PMM_RMAP_ENTRY entry; + PMEMORY_AREA MemoryArea; + PMADDRESS_SPACE AddressSpace; + ULONG Type; + PVOID Address; + PEPROCESS Process; + PMM_PAGEOP PageOp; + ULONG Offset; + NTSTATUS Status = STATUS_SUCCESS; - /* - * Check that the address still has a valid rmap; then reference the - * process so it isn't freed while we are working. - */ - ExAcquireFastMutex(&RmapListLock); - entry = MmGetRmapListHeadPage(PhysicalAddress); - if (entry == NULL) - { + /* + * Check that the address still has a valid rmap; then reference the + * process so it isn't freed while we are working. + */ + ExAcquireFastMutex(&RmapListLock); + entry = MmGetRmapListHeadPage(PhysicalAddress); + if (entry == NULL) + { ExReleaseFastMutex(&RmapListLock); return(STATUS_UNSUCCESSFUL); - } - Process = entry->Process; - Address = entry->Address; - if ((((ULONG)Address) & 0xFFF) != 0) - { + } + Process = entry->Process; + Address = entry->Address; + if ((((ULONG)Address) & 0xFFF) != 0) + { KEBUGCHECK(0); - } - if (Address < (PVOID)KERNEL_BASE) - { + } + if (Address < (PVOID)KERNEL_BASE) + { Status = ObReferenceObjectByPointer(Process, PROCESS_ALL_ACCESS, NULL, KernelMode); ExReleaseFastMutex(&RmapListLock); if (!NT_SUCCESS(Status)) - { - return Status; - } + { + return Status; + } AddressSpace = &Process->AddressSpace; - } - else - { + } + else + { ExReleaseFastMutex(&RmapListLock); AddressSpace = MmGetKernelAddressSpace(); - } + } - /* - * Lock the address space; then check that the address we are using - * still corresponds to a valid memory area (the page might have been - * freed or paged out after we read the rmap entry.) - */ - MmLockAddressSpace(AddressSpace); - MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace, Address); - if (MemoryArea == NULL || MemoryArea->DeleteInProgress) - { + /* + * Lock the address space; then check that the address we are using + * still corresponds to a valid memory area (the page might have been + * freed or paged out after we read the rmap entry.) + */ + MmLockAddressSpace(AddressSpace); + MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace, Address); + if (MemoryArea == NULL || MemoryArea->DeleteInProgress) + { MmUnlockAddressSpace(AddressSpace); if (Address < (PVOID)KERNEL_BASE) - { - ObDereferenceObject(Process); - } + { + ObDereferenceObject(Process); + } return(STATUS_UNSUCCESSFUL); - } + } - Type = MemoryArea->Type; - if (Type == MEMORY_AREA_SECTION_VIEW) - { + Type = MemoryArea->Type; + if (Type == MEMORY_AREA_SECTION_VIEW) + { Offset = (ULONG)((char*)Address - (ULONG)MemoryArea->BaseAddress); /* * Get or create a pageop */ - PageOp = MmGetPageOp(MemoryArea, 0, 0, - MemoryArea->Data.SectionData.Segment, - Offset, MM_PAGEOP_PAGEOUT, TRUE); + PageOp = MmGetPageOp(MemoryArea, 0, 0, + MemoryArea->Data.SectionData.Segment, + Offset, MM_PAGEOP_PAGEOUT, TRUE); if (PageOp == NULL) - { - MmUnlockAddressSpace(AddressSpace); - if (Address < (PVOID)KERNEL_BASE) - { - ObDereferenceObject(Process); - } - return(STATUS_UNSUCCESSFUL); - } - - /* - * Release locks now we have a page op. - */ - MmUnlockAddressSpace(AddressSpace); - - /* - * Do the actual page out work. - */ - Status = MmWritePageSectionView(AddressSpace, MemoryArea, - Address, PageOp); - } - else if (Type == MEMORY_AREA_VIRTUAL_MEMORY) - { - PageOp = MmGetPageOp(MemoryArea, Address < (PVOID)KERNEL_BASE ? Process->UniqueProcessId : 0, - Address, NULL, 0, MM_PAGEOP_PAGEOUT, TRUE); - - if (PageOp == NULL) - { - MmUnlockAddressSpace(AddressSpace); - if (Address < (PVOID)KERNEL_BASE) - { - ObDereferenceObject(Process); - } - return(STATUS_UNSUCCESSFUL); - } + { + MmUnlockAddressSpace(AddressSpace); + if (Address < (PVOID)KERNEL_BASE) + { + ObDereferenceObject(Process); + } + return(STATUS_UNSUCCESSFUL); + } /* * Release locks now we have a page op. @@ -186,95 +161,121 @@ MmWritePagePhysicalAddress(PHYSICAL_ADDRESS PhysicalAddress) /* * Do the actual page out work. */ - Status = MmWritePageVirtualMemory(AddressSpace, MemoryArea, - Address, PageOp); - } - else - { + Status = MmWritePageSectionView(AddressSpace, MemoryArea, + Address, PageOp); + } + else if (Type == MEMORY_AREA_VIRTUAL_MEMORY) + { + PageOp = MmGetPageOp(MemoryArea, Address < (PVOID)KERNEL_BASE ? Process->UniqueProcessId : 0, + Address, NULL, 0, MM_PAGEOP_PAGEOUT, TRUE); + + if (PageOp == NULL) + { + MmUnlockAddressSpace(AddressSpace); + if (Address < (PVOID)KERNEL_BASE) + { + ObDereferenceObject(Process); + } + return(STATUS_UNSUCCESSFUL); + } + + /* + * Release locks now we have a page op. + */ + MmUnlockAddressSpace(AddressSpace); + + /* + * Do the actual page out work. + */ + Status = MmWritePageVirtualMemory(AddressSpace, MemoryArea, + Address, PageOp); + } + else + { KEBUGCHECK(0); - } - if (Address < (PVOID)KERNEL_BASE) - { + } + if (Address < (PVOID)KERNEL_BASE) + { ObDereferenceObject(Process); - } - return(Status); + } + return(Status); } NTSTATUS MmPageOutPhysicalAddress(PHYSICAL_ADDRESS PhysicalAddress) { - PMM_RMAP_ENTRY entry; - PMEMORY_AREA MemoryArea; - PMADDRESS_SPACE AddressSpace; - ULONG Type; - PVOID Address; - PEPROCESS Process; - PMM_PAGEOP PageOp; - ULONG Offset; - NTSTATUS Status = STATUS_SUCCESS; + PMM_RMAP_ENTRY entry; + PMEMORY_AREA MemoryArea; + PMADDRESS_SPACE AddressSpace; + ULONG Type; + PVOID Address; + PEPROCESS Process; + PMM_PAGEOP PageOp; + ULONG Offset; + NTSTATUS Status = STATUS_SUCCESS; - ExAcquireFastMutex(&RmapListLock); - entry = MmGetRmapListHeadPage(PhysicalAddress); - if (entry == NULL || MmGetLockCountPage(PhysicalAddress) != 0) - { + ExAcquireFastMutex(&RmapListLock); + entry = MmGetRmapListHeadPage(PhysicalAddress); + if (entry == NULL || MmGetLockCountPage(PhysicalAddress) != 0) + { ExReleaseFastMutex(&RmapListLock); return(STATUS_UNSUCCESSFUL); - } - Process = entry->Process; - Address = entry->Address; - if ((((ULONG)Address) & 0xFFF) != 0) - { + } + Process = entry->Process; + Address = entry->Address; + if ((((ULONG)Address) & 0xFFF) != 0) + { KEBUGCHECK(0); - } + } - if (Address < (PVOID)KERNEL_BASE) - { + if (Address < (PVOID)KERNEL_BASE) + { Status = ObReferenceObjectByPointer(Process, PROCESS_ALL_ACCESS, NULL, KernelMode); ExReleaseFastMutex(&RmapListLock); if (!NT_SUCCESS(Status)) - { - return Status; - } + { + return Status; + } AddressSpace = &Process->AddressSpace; - } - else - { + } + else + { ExReleaseFastMutex(&RmapListLock); AddressSpace = MmGetKernelAddressSpace(); - } + } - MmLockAddressSpace(AddressSpace); - MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace, Address); - if (MemoryArea == NULL || MemoryArea->DeleteInProgress) - { + MmLockAddressSpace(AddressSpace); + MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace, Address); + if (MemoryArea == NULL || MemoryArea->DeleteInProgress) + { MmUnlockAddressSpace(AddressSpace); if (Address < (PVOID)KERNEL_BASE) - { - ObDereferenceObject(Process); - } + { + ObDereferenceObject(Process); + } return(STATUS_UNSUCCESSFUL); - } - Type = MemoryArea->Type; - if (Type == MEMORY_AREA_SECTION_VIEW) - { + } + Type = MemoryArea->Type; + if (Type == MEMORY_AREA_SECTION_VIEW) + { Offset = (ULONG)((char*)Address - (ULONG)MemoryArea->BaseAddress); /* * Get or create a pageop */ - PageOp = MmGetPageOp(MemoryArea, 0, 0, - MemoryArea->Data.SectionData.Segment, - Offset, MM_PAGEOP_PAGEOUT, TRUE); + PageOp = MmGetPageOp(MemoryArea, 0, 0, + MemoryArea->Data.SectionData.Segment, + Offset, MM_PAGEOP_PAGEOUT, TRUE); if (PageOp == NULL) - { - MmUnlockAddressSpace(AddressSpace); - if (Address < (PVOID)KERNEL_BASE) - { - ObDereferenceObject(Process); - } - return(STATUS_UNSUCCESSFUL); - } - + { + MmUnlockAddressSpace(AddressSpace); + if (Address < (PVOID)KERNEL_BASE) + { + ObDereferenceObject(Process); + } + return(STATUS_UNSUCCESSFUL); + } + /* * Release locks now we have a page op. */ @@ -283,22 +284,22 @@ MmPageOutPhysicalAddress(PHYSICAL_ADDRESS PhysicalAddress) /* * Do the actual page out work. */ - Status = MmPageOutSectionView(AddressSpace, MemoryArea, - Address, PageOp); - } - else if (Type == MEMORY_AREA_VIRTUAL_MEMORY) - { + Status = MmPageOutSectionView(AddressSpace, MemoryArea, + Address, PageOp); + } + else if (Type == MEMORY_AREA_VIRTUAL_MEMORY) + { PageOp = MmGetPageOp(MemoryArea, Address < (PVOID)KERNEL_BASE ? Process->UniqueProcessId : 0, - Address, NULL, 0, MM_PAGEOP_PAGEOUT, TRUE); + Address, NULL, 0, MM_PAGEOP_PAGEOUT, TRUE); if (PageOp == NULL) - { - MmUnlockAddressSpace(AddressSpace); - if (Address < (PVOID)KERNEL_BASE) - { - ObDereferenceObject(Process); - } - return(STATUS_UNSUCCESSFUL); - } + { + MmUnlockAddressSpace(AddressSpace); + if (Address < (PVOID)KERNEL_BASE) + { + ObDereferenceObject(Process); + } + return(STATUS_UNSUCCESSFUL); + } /* * Release locks now we have a page op. @@ -308,177 +309,177 @@ MmPageOutPhysicalAddress(PHYSICAL_ADDRESS PhysicalAddress) /* * Do the actual page out work. */ - Status = MmPageOutVirtualMemory(AddressSpace, MemoryArea, - Address, PageOp); - } - else - { + Status = MmPageOutVirtualMemory(AddressSpace, MemoryArea, + Address, PageOp); + } + else + { KEBUGCHECK(0); - } - if (Address < (PVOID)KERNEL_BASE) - { + } + if (Address < (PVOID)KERNEL_BASE) + { ObDereferenceObject(Process); - } - return(Status); + } + return(Status); } VOID MmSetCleanAllRmaps(PHYSICAL_ADDRESS PhysicalAddress) { - PMM_RMAP_ENTRY current_entry; + PMM_RMAP_ENTRY current_entry; - ExAcquireFastMutex(&RmapListLock); - current_entry = MmGetRmapListHeadPage(PhysicalAddress); - if (current_entry == NULL) - { + ExAcquireFastMutex(&RmapListLock); + current_entry = MmGetRmapListHeadPage(PhysicalAddress); + if (current_entry == NULL) + { DPRINT1("MmIsDirtyRmap: No rmaps.\n"); KEBUGCHECK(0); - } - while (current_entry != NULL) - { + } + while (current_entry != NULL) + { MmSetCleanPage(current_entry->Process, current_entry->Address); current_entry = current_entry->Next; - } - ExReleaseFastMutex(&RmapListLock); + } + ExReleaseFastMutex(&RmapListLock); } VOID MmSetDirtyAllRmaps(PHYSICAL_ADDRESS PhysicalAddress) { - PMM_RMAP_ENTRY current_entry; + PMM_RMAP_ENTRY current_entry; - ExAcquireFastMutex(&RmapListLock); - current_entry = MmGetRmapListHeadPage(PhysicalAddress); - if (current_entry == NULL) - { + ExAcquireFastMutex(&RmapListLock); + current_entry = MmGetRmapListHeadPage(PhysicalAddress); + if (current_entry == NULL) + { DPRINT1("MmIsDirtyRmap: No rmaps.\n"); KEBUGCHECK(0); - } - while (current_entry != NULL) - { + } + while (current_entry != NULL) + { MmSetDirtyPage(current_entry->Process, current_entry->Address); current_entry = current_entry->Next; - } - ExReleaseFastMutex(&RmapListLock); + } + ExReleaseFastMutex(&RmapListLock); } BOOL MmIsDirtyPageRmap(PHYSICAL_ADDRESS PhysicalAddress) { - PMM_RMAP_ENTRY current_entry; + PMM_RMAP_ENTRY current_entry; - ExAcquireFastMutex(&RmapListLock); - current_entry = MmGetRmapListHeadPage(PhysicalAddress); - if (current_entry == NULL) - { + ExAcquireFastMutex(&RmapListLock); + current_entry = MmGetRmapListHeadPage(PhysicalAddress); + if (current_entry == NULL) + { ExReleaseFastMutex(&RmapListLock); return(FALSE); - } - while (current_entry != NULL) - { + } + while (current_entry != NULL) + { if (MmIsDirtyPage(current_entry->Process, current_entry->Address)) - { - ExReleaseFastMutex(&RmapListLock); - return(TRUE); - } + { + ExReleaseFastMutex(&RmapListLock); + return(TRUE); + } current_entry = current_entry->Next; - } - ExReleaseFastMutex(&RmapListLock); - return(FALSE); + } + ExReleaseFastMutex(&RmapListLock); + return(FALSE); } VOID -MmInsertRmap(PHYSICAL_ADDRESS PhysicalAddress, PEPROCESS Process, - PVOID Address) +MmInsertRmap(PHYSICAL_ADDRESS PhysicalAddress, PEPROCESS Process, + PVOID Address) { - PMM_RMAP_ENTRY current_entry; - PMM_RMAP_ENTRY new_entry; + PMM_RMAP_ENTRY current_entry; + PMM_RMAP_ENTRY new_entry; - Address = (PVOID)PAGE_ROUND_DOWN(Address); + Address = (PVOID)PAGE_ROUND_DOWN(Address); - new_entry = ExAllocateFromNPagedLookasideList(&RmapLookasideList); - if (new_entry == NULL) - { + new_entry = ExAllocateFromNPagedLookasideList(&RmapLookasideList); + if (new_entry == NULL) + { KEBUGCHECK(0); - } - new_entry->Address = Address; - new_entry->Process = Process; + } + new_entry->Address = Address; + new_entry->Process = Process; - if (MmGetPhysicalAddressForProcess(Process, Address).QuadPart != - PhysicalAddress.QuadPart) - { + if (MmGetPhysicalAddressForProcess(Process, Address).QuadPart != + PhysicalAddress.QuadPart) + { DPRINT1("Insert rmap (%d, 0x%.8X) 0x%.8X which doesn't match physical " - "address 0x%.8X\n", Process->UniqueProcessId, Address, - MmGetPhysicalAddressForProcess(Process, Address).u.LowPart, - PhysicalAddress.u.LowPart); + "address 0x%.8X\n", Process->UniqueProcessId, Address, + MmGetPhysicalAddressForProcess(Process, Address).u.LowPart, + PhysicalAddress.u.LowPart); KEBUGCHECK(0); - } + } - ExAcquireFastMutex(&RmapListLock); - current_entry = MmGetRmapListHeadPage(PhysicalAddress); - new_entry->Next = current_entry; - MmSetRmapListHeadPage(PhysicalAddress, new_entry); - ExReleaseFastMutex(&RmapListLock); + ExAcquireFastMutex(&RmapListLock); + current_entry = MmGetRmapListHeadPage(PhysicalAddress); + new_entry->Next = current_entry; + MmSetRmapListHeadPage(PhysicalAddress, new_entry); + ExReleaseFastMutex(&RmapListLock); } VOID -MmDeleteAllRmaps(PHYSICAL_ADDRESS PhysicalAddress, PVOID Context, - VOID (*DeleteMapping)(PVOID Context, PEPROCESS Process, - PVOID Address)) +MmDeleteAllRmaps(PHYSICAL_ADDRESS PhysicalAddress, PVOID Context, + VOID (*DeleteMapping)(PVOID Context, PEPROCESS Process, + PVOID Address)) { - PMM_RMAP_ENTRY current_entry; - PMM_RMAP_ENTRY previous_entry; + PMM_RMAP_ENTRY current_entry; + PMM_RMAP_ENTRY previous_entry; - ExAcquireFastMutex(&RmapListLock); - current_entry = MmGetRmapListHeadPage(PhysicalAddress); - if (current_entry == NULL) - { + ExAcquireFastMutex(&RmapListLock); + current_entry = MmGetRmapListHeadPage(PhysicalAddress); + if (current_entry == NULL) + { DPRINT1("MmDeleteAllRmaps: No rmaps.\n"); KEBUGCHECK(0); - } - MmSetRmapListHeadPage(PhysicalAddress, NULL); - while (current_entry != NULL) - { + } + MmSetRmapListHeadPage(PhysicalAddress, NULL); + while (current_entry != NULL) + { previous_entry = current_entry; current_entry = current_entry->Next; if (DeleteMapping) - { - DeleteMapping(Context, previous_entry->Process, - previous_entry->Address); - } + { + DeleteMapping(Context, previous_entry->Process, + previous_entry->Address); + } ExFreeToNPagedLookasideList(&RmapLookasideList, previous_entry); - } - ExReleaseFastMutex(&RmapListLock); + } + ExReleaseFastMutex(&RmapListLock); } VOID -MmDeleteRmap(PHYSICAL_ADDRESS PhysicalAddress, PEPROCESS Process, - PVOID Address) +MmDeleteRmap(PHYSICAL_ADDRESS PhysicalAddress, PEPROCESS Process, + PVOID Address) { - PMM_RMAP_ENTRY current_entry, previous_entry; + PMM_RMAP_ENTRY current_entry, previous_entry; - ExAcquireFastMutex(&RmapListLock); - previous_entry = NULL; - current_entry = MmGetRmapListHeadPage(PhysicalAddress); - while (current_entry != NULL) - { - if (current_entry->Process == Process && - current_entry->Address == Address) - { - if (previous_entry == NULL) - { - MmSetRmapListHeadPage(PhysicalAddress, current_entry->Next); - } - else - { - previous_entry->Next = current_entry->Next; - } - ExReleaseFastMutex(&RmapListLock); - ExFreeToNPagedLookasideList(&RmapLookasideList, current_entry); - return; - } + ExAcquireFastMutex(&RmapListLock); + previous_entry = NULL; + current_entry = MmGetRmapListHeadPage(PhysicalAddress); + while (current_entry != NULL) + { + if (current_entry->Process == Process && + current_entry->Address == Address) + { + if (previous_entry == NULL) + { + MmSetRmapListHeadPage(PhysicalAddress, current_entry->Next); + } + else + { + previous_entry->Next = current_entry->Next; + } + ExReleaseFastMutex(&RmapListLock); + ExFreeToNPagedLookasideList(&RmapLookasideList, current_entry); + return; + } previous_entry = current_entry; current_entry = current_entry->Next; - } - KEBUGCHECK(0); + } + KEBUGCHECK(0); } diff --git a/reactos/ntoskrnl/mm/section.c b/reactos/ntoskrnl/mm/section.c index 6f1a8fac688..6b8432f917b 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.146 2004/03/05 11:31:59 hbirr Exp $ +/* $Id: section.c,v 1.147 2004/04/10 22:35:26 gdalsnes Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/section.c @@ -49,22 +49,23 @@ typedef struct { - PSECTION_OBJECT Section; - PMM_SECTION_SEGMENT Segment; - ULONG Offset; - BOOLEAN WasDirty; - BOOLEAN Private; -} MM_SECTION_PAGEOUT_CONTEXT; + PSECTION_OBJECT Section; + PMM_SECTION_SEGMENT Segment; + ULONG Offset; + BOOLEAN WasDirty; + BOOLEAN Private; +} +MM_SECTION_PAGEOUT_CONTEXT; /* GLOBALS *******************************************************************/ POBJECT_TYPE EXPORTED MmSectionObjectType = NULL; static GENERIC_MAPPING MmpSectionMapping = { - STANDARD_RIGHTS_READ | SECTION_MAP_READ | SECTION_QUERY, - STANDARD_RIGHTS_WRITE | SECTION_MAP_WRITE, - STANDARD_RIGHTS_EXECUTE | SECTION_MAP_EXECUTE, - SECTION_ALL_ACCESS}; + STANDARD_RIGHTS_READ | SECTION_MAP_READ | SECTION_QUERY, + STANDARD_RIGHTS_WRITE | SECTION_MAP_WRITE, + STANDARD_RIGHTS_EXECUTE | SECTION_MAP_EXECUTE, + SECTION_ALL_ACCESS}; #define TAG_MM_SECTION_SEGMENT TAG('M', 'M', 'S', 'S') #define TAG_SECTION_PAGE_TABLE TAG('M', 'S', 'P', 'T') @@ -89,13 +90,16 @@ static GENERIC_MAPPING MmpSectionMapping = { static NTSTATUS MmspWaitForPageOpCompletionEvent(PMM_PAGEOP PageOp) { - LARGE_INTEGER Timeout; + LARGE_INTEGER Timeout; #ifdef __GNUC__ /* TODO: Use other macro to check for suffix to use? */ - Timeout.QuadPart = -100000000LL; // 10 sec + + Timeout.QuadPart = -100000000LL; // 10 sec #else - Timeout.QuadPart = -100000000; // 10 sec + + Timeout.QuadPart = -100000000; // 10 sec #endif - return KeWaitForSingleObject(&PageOp->CompletionEvent, 0, KernelMode, FALSE, &Timeout); + + return KeWaitForSingleObject(&PageOp->CompletionEvent, 0, KernelMode, FALSE, &Timeout); } @@ -108,8 +112,8 @@ MmspWaitForPageOpCompletionEvent(PMM_PAGEOP PageOp) static void MmspCompleteAndReleasePageOp(PMM_PAGEOP PageOp) { - KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); - MmReleasePageOp(PageOp); + KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); + MmReleasePageOp(PageOp); } @@ -121,31 +125,31 @@ MmspCompleteAndReleasePageOp(PMM_PAGEOP PageOp) static NTSTATUS MmspWaitForFileLock(PFILE_OBJECT File) { - return KeWaitForSingleObject(&File->Lock, 0, KernelMode, FALSE, NULL); + return KeWaitForSingleObject(&File->Lock, 0, KernelMode, FALSE, NULL); } VOID MmFreePageTablesSectionSegment(PMM_SECTION_SEGMENT Segment) { - ULONG i; - if (Segment->Length > NR_SECTION_PAGE_TABLES * PAGE_SIZE) - { + ULONG i; + if (Segment->Length > NR_SECTION_PAGE_TABLES * PAGE_SIZE) + { for (i = 0; i < NR_SECTION_PAGE_TABLES; i++) - { - if (Segment->PageDirectory.PageTables[i] != NULL) - { - ExFreePool(Segment->PageDirectory.PageTables[i]); - } - } - } + { + if (Segment->PageDirectory.PageTables[i] != NULL) + { + ExFreePool(Segment->PageDirectory.PageTables[i]); + } + } + } } VOID MmFreeSectionSegments(PFILE_OBJECT FileObject) { - if (FileObject->SectionObjectPointer->ImageSectionObject != NULL) - { + if (FileObject->SectionObjectPointer->ImageSectionObject != NULL) + { PMM_IMAGE_SECTION_OBJECT ImageSectionObject; PMM_SECTION_SEGMENT SectionSegments; ULONG NrSegments; @@ -155,34 +159,34 @@ MmFreeSectionSegments(PFILE_OBJECT FileObject) NrSegments = ImageSectionObject->NrSegments; SectionSegments = ImageSectionObject->Segments; for (i = 0; i < NrSegments; i++) - { - if (SectionSegments[i].ReferenceCount != 0) - { - DPRINT1("Image segment %d still referenced (was %d)\n", i, - SectionSegments[i].ReferenceCount); - KEBUGCHECK(0); - } - MmFreePageTablesSectionSegment(&SectionSegments[i]); - } + { + if (SectionSegments[i].ReferenceCount != 0) + { + DPRINT1("Image segment %d still referenced (was %d)\n", i, + SectionSegments[i].ReferenceCount); + KEBUGCHECK(0); + } + MmFreePageTablesSectionSegment(&SectionSegments[i]); + } ExFreePool(ImageSectionObject); FileObject->SectionObjectPointer->ImageSectionObject = NULL; - } - if (FileObject->SectionObjectPointer->DataSectionObject != NULL) - { + } + if (FileObject->SectionObjectPointer->DataSectionObject != NULL) + { PMM_SECTION_SEGMENT Segment; Segment = (PMM_SECTION_SEGMENT)FileObject->SectionObjectPointer-> - DataSectionObject; + DataSectionObject; if (Segment->ReferenceCount != 0) - { - DPRINT1("Data segment still referenced\n"); - KEBUGCHECK(0); - } + { + DPRINT1("Data segment still referenced\n"); + KEBUGCHECK(0); + } MmFreePageTablesSectionSegment(Segment); ExFreePool(Segment); FileObject->SectionObjectPointer->DataSectionObject = NULL; - } + } } VOID @@ -199,35 +203,35 @@ MmUnlockSectionSegment(PMM_SECTION_SEGMENT Segment) VOID MmSetPageEntrySectionSegment(PMM_SECTION_SEGMENT Segment, - ULONG Offset, - ULONG Entry) + ULONG Offset, + ULONG Entry) { PSECTION_PAGE_TABLE Table; ULONG DirectoryOffset; ULONG TableOffset; if (Segment->Length <= NR_SECTION_PAGE_TABLES * PAGE_SIZE) - { - Table = (PSECTION_PAGE_TABLE)&Segment->PageDirectory; - } + { + Table = (PSECTION_PAGE_TABLE)&Segment->PageDirectory; + } else - { - DirectoryOffset = PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(Offset); - Table = Segment->PageDirectory.PageTables[DirectoryOffset]; - if (Table == NULL) + { + DirectoryOffset = PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(Offset); + Table = Segment->PageDirectory.PageTables[DirectoryOffset]; + if (Table == NULL) + { + Table = + Segment->PageDirectory.PageTables[DirectoryOffset] = + ExAllocatePoolWithTag(NonPagedPool, sizeof(SECTION_PAGE_TABLE), + TAG_SECTION_PAGE_TABLE); + if (Table == NULL) { - Table = - Segment->PageDirectory.PageTables[DirectoryOffset] = - ExAllocatePoolWithTag(NonPagedPool, sizeof(SECTION_PAGE_TABLE), - TAG_SECTION_PAGE_TABLE); - if (Table == NULL) - { - KEBUGCHECK(0); - } - memset(Table, 0, sizeof(SECTION_PAGE_TABLE)); - DPRINT("Table %x\n", Table); - } - } + KEBUGCHECK(0); + } + memset(Table, 0, sizeof(SECTION_PAGE_TABLE)); + DPRINT("Table %x\n", Table); + } + } TableOffset = PAGE_TO_SECTION_PAGE_TABLE_OFFSET(Offset); Table->Entry[TableOffset] = Entry; } @@ -235,7 +239,7 @@ MmSetPageEntrySectionSegment(PMM_SECTION_SEGMENT Segment, ULONG MmGetPageEntrySectionSegment(PMM_SECTION_SEGMENT Segment, - ULONG Offset) + ULONG Offset) { PSECTION_PAGE_TABLE Table; ULONG Entry; @@ -245,19 +249,19 @@ MmGetPageEntrySectionSegment(PMM_SECTION_SEGMENT Segment, DPRINT("MmGetPageEntrySection(Offset %x)\n", Offset); if (Segment->Length <= NR_SECTION_PAGE_TABLES * PAGE_SIZE) - { - Table = (PSECTION_PAGE_TABLE)&Segment->PageDirectory; - } + { + Table = (PSECTION_PAGE_TABLE)&Segment->PageDirectory; + } else - { - DirectoryOffset = PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(Offset); - Table = Segment->PageDirectory.PageTables[DirectoryOffset]; - DPRINT("Table %x\n", Table); - if (Table == NULL) - { - return(0); - } - } + { + DirectoryOffset = PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(Offset); + Table = Segment->PageDirectory.PageTables[DirectoryOffset]; + DPRINT("Table %x\n", Table); + if (Table == NULL) + { + return(0); + } + } TableOffset = PAGE_TO_SECTION_PAGE_TABLE_OFFSET(Offset); Entry = Table->Entry[TableOffset]; return(Entry); @@ -265,61 +269,61 @@ MmGetPageEntrySectionSegment(PMM_SECTION_SEGMENT Segment, VOID MmSharePageEntrySectionSegment(PMM_SECTION_SEGMENT Segment, - ULONG Offset) + ULONG Offset) { - ULONG Entry; + ULONG Entry; - Entry = MmGetPageEntrySectionSegment(Segment, Offset); - if (Entry == 0) - { + Entry = MmGetPageEntrySectionSegment(Segment, Offset); + if (Entry == 0) + { DPRINT1("Entry == 0 for MmSharePageEntrySectionSegment\n"); KEBUGCHECK(0); - } - if (SHARE_COUNT_FROM_SSE(Entry) == MAX_SHARE_COUNT) - { + } + if (SHARE_COUNT_FROM_SSE(Entry) == MAX_SHARE_COUNT) + { DPRINT1("Maximum share count reached\n"); KEBUGCHECK(0); - } - if (IS_SWAP_FROM_SSE(Entry)) - { + } + if (IS_SWAP_FROM_SSE(Entry)) + { KEBUGCHECK(0); - } - Entry = MAKE_SSE(PAGE_FROM_SSE(Entry), SHARE_COUNT_FROM_SSE(Entry) + 1); - MmSetPageEntrySectionSegment(Segment, Offset, Entry); + } + Entry = MAKE_SSE(PAGE_FROM_SSE(Entry), SHARE_COUNT_FROM_SSE(Entry) + 1); + MmSetPageEntrySectionSegment(Segment, Offset, Entry); } BOOLEAN MmUnsharePageEntrySectionSegment(PSECTION_OBJECT Section, - PMM_SECTION_SEGMENT Segment, - ULONG Offset, - BOOLEAN Dirty, - BOOLEAN PageOut) + PMM_SECTION_SEGMENT Segment, + ULONG Offset, + BOOLEAN Dirty, + BOOLEAN PageOut) { - ULONG Entry; - BOOLEAN IsDirectMapped = FALSE; + ULONG Entry; + BOOLEAN IsDirectMapped = FALSE; - Entry = MmGetPageEntrySectionSegment(Segment, Offset); - if (Entry == 0) - { + Entry = MmGetPageEntrySectionSegment(Segment, Offset); + if (Entry == 0) + { DPRINT1("Entry == 0 for MmUnsharePageEntrySectionSegment\n"); KEBUGCHECK(0); - } - if (SHARE_COUNT_FROM_SSE(Entry) == 0) - { + } + if (SHARE_COUNT_FROM_SSE(Entry) == 0) + { DPRINT1("Zero share count for unshare\n"); KEBUGCHECK(0); - } - if (IS_SWAP_FROM_SSE(Entry)) - { + } + if (IS_SWAP_FROM_SSE(Entry)) + { KEBUGCHECK(0); - } - Entry = MAKE_SSE(PAGE_FROM_SSE(Entry), SHARE_COUNT_FROM_SSE(Entry) - 1); - /* - * If we reducing the share count of this entry to zero then set the entry - * to zero and tell the cache the page is no longer mapped. - */ - if (SHARE_COUNT_FROM_SSE(Entry) == 0) - { + } + Entry = MAKE_SSE(PAGE_FROM_SSE(Entry), SHARE_COUNT_FROM_SSE(Entry) - 1); + /* + * If we reducing the share count of this entry to zero then set the entry + * to zero and tell the cache the page is no longer mapped. + */ + if (SHARE_COUNT_FROM_SSE(Entry) == 0) + { PFILE_OBJECT FileObject; PBCB Bcb; SWAPENTRY SavedSwapEntry; @@ -334,154 +338,154 @@ MmUnsharePageEntrySectionSegment(PSECTION_OBJECT Section, Page.QuadPart = (LONGLONG)PAGE_FROM_SSE(Entry); FileObject = Section->FileObject; if (FileObject != NULL && - !(Segment->Characteristics & IMAGE_SECTION_CHAR_SHARED)) - { + !(Segment->Characteristics & IMAGE_SECTION_CHAR_SHARED)) + { - if ((FileOffset % PAGE_SIZE) == 0 && - (Offset + PAGE_SIZE <= Segment->RawLength || !IsImageSection)) - { - NTSTATUS Status; - Bcb = FileObject->SectionObjectPointer->SharedCacheMap; - IsDirectMapped = TRUE; - Status = CcRosUnmapCacheSegment(Bcb, FileOffset, Dirty); - if (!NT_SUCCESS(Status)) - { - DPRINT1("CcRosUnmapCacheSegment failed, status = %x\n", Status); - KEBUGCHECK(0); - } - } - } + if ((FileOffset % PAGE_SIZE) == 0 && + (Offset + PAGE_SIZE <= Segment->RawLength || !IsImageSection)) + { + NTSTATUS Status; + Bcb = FileObject->SectionObjectPointer->SharedCacheMap; + IsDirectMapped = TRUE; + Status = CcRosUnmapCacheSegment(Bcb, FileOffset, Dirty); + if (!NT_SUCCESS(Status)) + { + DPRINT1("CcRosUnmapCacheSegment failed, status = %x\n", Status); + KEBUGCHECK(0); + } + } + } SavedSwapEntry = MmGetSavedSwapEntryPage(Page); if (SavedSwapEntry == 0) - { - if (!PageOut && - ((Segment->Flags & MM_PAGEFILE_SEGMENT) || - (Segment->Characteristics & IMAGE_SECTION_CHAR_SHARED))) + { + if (!PageOut && + ((Segment->Flags & MM_PAGEFILE_SEGMENT) || + (Segment->Characteristics & IMAGE_SECTION_CHAR_SHARED))) + { + /* + * FIXME: + * Try to page out this page and set the swap entry + * within the section segment. There exist no rmap entry + * for this page. The pager thread can't page out a + * page without a rmap entry. + */ + MmSetPageEntrySectionSegment(Segment, Offset, Entry); + } + else + { + MmSetPageEntrySectionSegment(Segment, Offset, 0); + if (!IsDirectMapped) { - /* - * FIXME: - * Try to page out this page and set the swap entry - * within the section segment. There exist no rmap entry - * for this page. The pager thread can't page out a - * page without a rmap entry. - */ - MmSetPageEntrySectionSegment(Segment, Offset, Entry); - } - else - { - MmSetPageEntrySectionSegment(Segment, Offset, 0); - if (!IsDirectMapped) - { - MmReleasePageMemoryConsumer(MC_USER, Page); - } - } - } + MmReleasePageMemoryConsumer(MC_USER, Page); + } + } + } else - { - if ((Segment->Flags & MM_PAGEFILE_SEGMENT) || - (Segment->Characteristics & IMAGE_SECTION_CHAR_SHARED)) - { - if (!PageOut) - { - if (Dirty) - { - /* - * FIXME: - * We hold all locks. Nobody can do something with the current - * process and the current segment (also not within an other process). - */ - NTSTATUS Status; - PMDL Mdl; - Mdl = MmCreateMdl(NULL, NULL, PAGE_SIZE); - MmBuildMdlFromPages(Mdl, (PULONG)&Page); - Status = MmWriteToSwapPage(SavedSwapEntry, Mdl); - if (!NT_SUCCESS(Status)) - { - DPRINT1("MM: Failed to write to swap page (Status was 0x%.8X)\n", Status); - KEBUGCHECK(0); - } - } - MmSetPageEntrySectionSegment(Segment, Offset, MAKE_SWAP_SSE(SavedSwapEntry)); - MmSetSavedSwapEntryPage(Page, 0); - } - MmReleasePageMemoryConsumer(MC_USER, Page); - } - else - { - DPRINT1("Found a swapentry for a non private page in an image or data file sgment\n"); - KEBUGCHECK(0); - } - } - } - else - { + { + if ((Segment->Flags & MM_PAGEFILE_SEGMENT) || + (Segment->Characteristics & IMAGE_SECTION_CHAR_SHARED)) + { + if (!PageOut) + { + if (Dirty) + { + /* + * FIXME: + * We hold all locks. Nobody can do something with the current + * process and the current segment (also not within an other process). + */ + NTSTATUS Status; + PMDL Mdl; + Mdl = MmCreateMdl(NULL, NULL, PAGE_SIZE); + MmBuildMdlFromPages(Mdl, (PULONG)&Page); + Status = MmWriteToSwapPage(SavedSwapEntry, Mdl); + if (!NT_SUCCESS(Status)) + { + DPRINT1("MM: Failed to write to swap page (Status was 0x%.8X)\n", Status); + KEBUGCHECK(0); + } + } + MmSetPageEntrySectionSegment(Segment, Offset, MAKE_SWAP_SSE(SavedSwapEntry)); + MmSetSavedSwapEntryPage(Page, 0); + } + MmReleasePageMemoryConsumer(MC_USER, Page); + } + else + { + DPRINT1("Found a swapentry for a non private page in an image or data file sgment\n"); + KEBUGCHECK(0); + } + } + } + else + { MmSetPageEntrySectionSegment(Segment, Offset, Entry); - } - return(SHARE_COUNT_FROM_SSE(Entry) > 0); + } + return(SHARE_COUNT_FROM_SSE(Entry) > 0); } BOOL MiIsPageFromCache(PMEMORY_AREA MemoryArea, - ULONG SegOffset) + ULONG SegOffset) { - if (!(MemoryArea->Data.SectionData.Segment->Characteristics & IMAGE_SECTION_CHAR_SHARED)) - { + if (!(MemoryArea->Data.SectionData.Segment->Characteristics & IMAGE_SECTION_CHAR_SHARED)) + { PBCB Bcb; PCACHE_SEGMENT CacheSeg; Bcb = MemoryArea->Data.SectionData.Section->FileObject->SectionObjectPointer->SharedCacheMap; CacheSeg = CcRosLookupCacheSegment(Bcb, SegOffset + MemoryArea->Data.SectionData.Segment->FileOffset); if (CacheSeg) - { - CcRosReleaseCacheSegment(Bcb, CacheSeg, CacheSeg->Valid, FALSE, TRUE); - return TRUE; - } - } - return FALSE; + { + CcRosReleaseCacheSegment(Bcb, CacheSeg, CacheSeg->Valid, FALSE, TRUE); + return TRUE; + } + } + return FALSE; } NTSTATUS MiReadPage(PMEMORY_AREA MemoryArea, - ULONG SegOffset, - PHYSICAL_ADDRESS* Page) - /* - * FUNCTION: Read a page for a section backed memory area. - * PARAMETERS: - * MemoryArea - Memory area to read the page for. - * Offset - Offset of the page to read. - * Page - Variable that receives a page contains the read data. - */ + ULONG SegOffset, + PHYSICAL_ADDRESS* Page) +/* + * FUNCTION: Read a page for a section backed memory area. + * PARAMETERS: + * MemoryArea - Memory area to read the page for. + * Offset - Offset of the page to read. + * Page - Variable that receives a page contains the read data. + */ { - ULONG BaseOffset; - ULONG FileOffset; - PVOID BaseAddress; - BOOLEAN UptoDate; - PCACHE_SEGMENT CacheSeg; - PFILE_OBJECT FileObject; - NTSTATUS Status; - ULONG RawLength; - PBCB Bcb; - BOOLEAN IsImageSection; - ULONG Length; + ULONG BaseOffset; + ULONG FileOffset; + PVOID BaseAddress; + BOOLEAN UptoDate; + PCACHE_SEGMENT CacheSeg; + PFILE_OBJECT FileObject; + NTSTATUS Status; + ULONG RawLength; + PBCB Bcb; + BOOLEAN IsImageSection; + ULONG Length; - FileObject = MemoryArea->Data.SectionData.Section->FileObject; - Bcb = FileObject->SectionObjectPointer->SharedCacheMap; - RawLength = MemoryArea->Data.SectionData.Segment->RawLength; - FileOffset = SegOffset + MemoryArea->Data.SectionData.Segment->FileOffset; - IsImageSection = MemoryArea->Data.SectionData.Section->AllocationAttributes & SEC_IMAGE ? TRUE : FALSE; + FileObject = MemoryArea->Data.SectionData.Section->FileObject; + Bcb = FileObject->SectionObjectPointer->SharedCacheMap; + RawLength = MemoryArea->Data.SectionData.Segment->RawLength; + FileOffset = SegOffset + MemoryArea->Data.SectionData.Segment->FileOffset; + IsImageSection = MemoryArea->Data.SectionData.Section->AllocationAttributes & SEC_IMAGE ? TRUE : FALSE; - assert(Bcb); + assert(Bcb); - DPRINT("%S %x\n", FileObject->FileName.Buffer, FileOffset); + DPRINT("%S %x\n", FileObject->FileName.Buffer, FileOffset); - /* - * If the file system is letting us go directly to the cache and the - * memory area was mapped at an offset in the file which is page aligned - * then get the related cache segment. - */ - if ((FileOffset % PAGE_SIZE) == 0 && - (SegOffset + PAGE_SIZE <= RawLength || !IsImageSection) && - !(MemoryArea->Data.SectionData.Segment->Characteristics & IMAGE_SECTION_CHAR_SHARED)) - { + /* + * If the file system is letting us go directly to the cache and the + * memory area was mapped at an offset in the file which is page aligned + * then get the related cache segment. + */ + if ((FileOffset % PAGE_SIZE) == 0 && + (SegOffset + PAGE_SIZE <= RawLength || !IsImageSection) && + !(MemoryArea->Data.SectionData.Segment->Characteristics & IMAGE_SECTION_CHAR_SHARED)) + { /* * Get the related cache segment; we use a lower level interface than @@ -489,38 +493,38 @@ MiReadPage(PMEMORY_AREA MemoryArea, * alignment less than the file system block size. */ Status = CcRosGetCacheSegment(Bcb, - FileOffset, - &BaseOffset, - &BaseAddress, - &UptoDate, - &CacheSeg); + FileOffset, + &BaseOffset, + &BaseAddress, + &UptoDate, + &CacheSeg); if (!NT_SUCCESS(Status)) - { - return(Status); - } + { + return(Status); + } if (!UptoDate) - { - /* - * If the cache segment isn't up to date then call the file - * system to read in the data. - */ - Status = ReadCacheSegment(CacheSeg); - if (!NT_SUCCESS(Status)) - { - CcRosReleaseCacheSegment(Bcb, CacheSeg, FALSE, FALSE, FALSE); - return Status; - } - } + { + /* + * If the cache segment isn't up to date then call the file + * system to read in the data. + */ + Status = ReadCacheSegment(CacheSeg); + if (!NT_SUCCESS(Status)) + { + CcRosReleaseCacheSegment(Bcb, CacheSeg, FALSE, FALSE, FALSE); + return Status; + } + } /* * Retrieve the page from the cache segment that we actually want. */ (*Page) = MmGetPhysicalAddress((char*)BaseAddress + - FileOffset - BaseOffset); + FileOffset - BaseOffset); CcRosReleaseCacheSegment(Bcb, CacheSeg, TRUE, FALSE, TRUE); - } - else - { + } + else + { PVOID PageAddr; ULONG CacheSegOffset; /* @@ -529,32 +533,32 @@ MiReadPage(PMEMORY_AREA MemoryArea, */ Status = MmRequestPageMemoryConsumer(MC_USER, TRUE, Page); if (!NT_SUCCESS(Status)) - { - return(Status); - } + { + return(Status); + } Status = CcRosGetCacheSegment(Bcb, - FileOffset, - &BaseOffset, - &BaseAddress, - &UptoDate, - &CacheSeg); + FileOffset, + &BaseOffset, + &BaseAddress, + &UptoDate, + &CacheSeg); if (!NT_SUCCESS(Status)) - { - return(Status); - } + { + return(Status); + } if (!UptoDate) - { - /* - * If the cache segment isn't up to date then call the file - * system to read in the data. - */ - Status = ReadCacheSegment(CacheSeg); - if (!NT_SUCCESS(Status)) - { - CcRosReleaseCacheSegment(Bcb, CacheSeg, FALSE, FALSE, FALSE); - return Status; - } - } + { + /* + * If the cache segment isn't up to date then call the file + * system to read in the data. + */ + Status = ReadCacheSegment(CacheSeg); + if (!NT_SUCCESS(Status)) + { + CcRosReleaseCacheSegment(Bcb, CacheSeg, FALSE, FALSE, FALSE); + return Status; + } + } PageAddr = ExAllocatePageWithPhysPage(*Page); CacheSegOffset = BaseOffset + CacheSeg->Bcb->CacheSegmentSize - FileOffset; Length = RawLength - SegOffset; @@ -568,53 +572,53 @@ MiReadPage(PMEMORY_AREA MemoryArea, } else { - memcpy(PageAddr, (char*)BaseAddress + FileOffset - BaseOffset, CacheSegOffset); + memcpy(PageAddr, (char*)BaseAddress + FileOffset - BaseOffset, CacheSegOffset); CcRosReleaseCacheSegment(Bcb, CacheSeg, TRUE, FALSE, FALSE); - Status = CcRosGetCacheSegment(Bcb, - FileOffset + CacheSegOffset, - &BaseOffset, - &BaseAddress, - &UptoDate, - &CacheSeg); + Status = CcRosGetCacheSegment(Bcb, + FileOffset + CacheSegOffset, + &BaseOffset, + &BaseAddress, + &UptoDate, + &CacheSeg); if (!NT_SUCCESS(Status)) - { - ExUnmapPage(PageAddr); - return(Status); - } + { + ExUnmapPage(PageAddr); + return(Status); + } if (!UptoDate) - { - /* - * If the cache segment isn't up to date then call the file - * system to read in the data. - */ - Status = ReadCacheSegment(CacheSeg); - if (!NT_SUCCESS(Status)) - { - CcRosReleaseCacheSegment(Bcb, CacheSeg, FALSE, FALSE, FALSE); - ExUnmapPage(PageAddr); - return Status; - } - } + { + /* + * If the cache segment isn't up to date then call the file + * system to read in the data. + */ + Status = ReadCacheSegment(CacheSeg); + if (!NT_SUCCESS(Status)) + { + CcRosReleaseCacheSegment(Bcb, CacheSeg, FALSE, FALSE, FALSE); + ExUnmapPage(PageAddr); + return Status; + } + } if (Length < PAGE_SIZE) - { - memcpy((char*)PageAddr + CacheSegOffset, BaseAddress, Length - CacheSegOffset); - } - else - { + { + memcpy((char*)PageAddr + CacheSegOffset, BaseAddress, Length - CacheSegOffset); + } + else + { memcpy((char*)PageAddr + CacheSegOffset, BaseAddress, PAGE_SIZE - CacheSegOffset); - } + } } CcRosReleaseCacheSegment(Bcb, CacheSeg, TRUE, FALSE, FALSE); ExUnmapPage(PageAddr); - } - return(STATUS_SUCCESS); + } + return(STATUS_SUCCESS); } NTSTATUS MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace, - MEMORY_AREA* MemoryArea, - PVOID Address, - BOOLEAN Locked) + MEMORY_AREA* MemoryArea, + PVOID Address, + BOOLEAN Locked) { ULONG Offset; LARGE_INTEGER Page; @@ -635,13 +639,13 @@ MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace, * that. */ if (MmIsPagePresent(AddressSpace->Process, Address)) - { - if (Locked) - { - MmLockPage(MmGetPhysicalAddressForProcess(AddressSpace->Process, Address)); - } - return(STATUS_SUCCESS); - } + { + if (Locked) + { + MmLockPage(MmGetPhysicalAddressForProcess(AddressSpace->Process, Address)); + } + return(STATUS_SUCCESS); + } PAddress = (ULONG)PAGE_ROUND_DOWN(((ULONG)Address)); Offset = PAddress - (ULONG)MemoryArea->BaseAddress; @@ -649,8 +653,8 @@ MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace, Segment = MemoryArea->Data.SectionData.Segment; Section = MemoryArea->Data.SectionData.Section; Region = MmFindRegion(MemoryArea->BaseAddress, - &MemoryArea->Data.SectionData.RegionListHead, - Address, NULL); + &MemoryArea->Data.SectionData.RegionListHead, + Address, NULL); /* * Lock the segment */ @@ -660,311 +664,311 @@ MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace, * Check if this page needs to be mapped COW */ if ((Segment->WriteCopy || MemoryArea->Data.SectionData.WriteCopyView) && - (Region->Protect == PAGE_READWRITE || - Region->Protect == PAGE_EXECUTE_READWRITE)) - { - Attributes = Region->Protect == PAGE_READWRITE ? PAGE_READONLY : PAGE_EXECUTE_READ; - } + (Region->Protect == PAGE_READWRITE || + Region->Protect == PAGE_EXECUTE_READWRITE)) + { + Attributes = Region->Protect == PAGE_READWRITE ? PAGE_READONLY : PAGE_EXECUTE_READ; + } else - { - Attributes = Region->Protect; - } + { + Attributes = Region->Protect; + } /* * Get or create a page operation descriptor */ PageOp = MmGetPageOp(MemoryArea, 0, 0, Segment, Offset, MM_PAGEOP_PAGEIN, FALSE); if (PageOp == NULL) - { - DPRINT1("MmGetPageOp failed\n"); - KEBUGCHECK(0); - } + { + DPRINT1("MmGetPageOp failed\n"); + KEBUGCHECK(0); + } /* * Check if someone else is already handling this fault, if so wait * for them */ if (PageOp->Thread != PsGetCurrentThread()) - { - MmUnlockSectionSegment(Segment); - MmUnlockAddressSpace(AddressSpace); - Status = MmspWaitForPageOpCompletionEvent(PageOp); - /* - * Check for various strange conditions - */ - if (Status != STATUS_SUCCESS) - { - DPRINT1("Failed to wait for page op, status = %x\n", Status); - KEBUGCHECK(0); - } - if (PageOp->Status == STATUS_PENDING) - { - DPRINT1("Woke for page op before completion\n"); - KEBUGCHECK(0); - } - MmLockAddressSpace(AddressSpace); - /* - * If this wasn't a pagein then restart the operation - */ - if (PageOp->OpType != MM_PAGEOP_PAGEIN) - { - MmspCompleteAndReleasePageOp(PageOp); - DPRINT("Address 0x%.8X\n", Address); - return(STATUS_MM_RESTART_OPERATION); - } + { + MmUnlockSectionSegment(Segment); + MmUnlockAddressSpace(AddressSpace); + Status = MmspWaitForPageOpCompletionEvent(PageOp); + /* + * Check for various strange conditions + */ + if (Status != STATUS_SUCCESS) + { + DPRINT1("Failed to wait for page op, status = %x\n", Status); + KEBUGCHECK(0); + } + if (PageOp->Status == STATUS_PENDING) + { + DPRINT1("Woke for page op before completion\n"); + KEBUGCHECK(0); + } + MmLockAddressSpace(AddressSpace); + /* + * If this wasn't a pagein then restart the operation + */ + if (PageOp->OpType != MM_PAGEOP_PAGEIN) + { + MmspCompleteAndReleasePageOp(PageOp); + DPRINT("Address 0x%.8X\n", Address); + return(STATUS_MM_RESTART_OPERATION); + } - /* - * If the thread handling this fault has failed then we don't retry - */ - if (!NT_SUCCESS(PageOp->Status)) - { - Status = PageOp->Status; - MmspCompleteAndReleasePageOp(PageOp); - DPRINT("Address 0x%.8X\n", Address); - return(Status); - } - MmLockSectionSegment(Segment); - /* - * If the completed fault was for another address space then set the - * page in this one. - */ - if (!MmIsPagePresent(AddressSpace->Process, Address)) - { - Entry = MmGetPageEntrySectionSegment(Segment, Offset); - HasSwapEntry = MmIsPageSwapEntry(AddressSpace->Process, (PVOID)PAddress); + /* + * If the thread handling this fault has failed then we don't retry + */ + if (!NT_SUCCESS(PageOp->Status)) + { + Status = PageOp->Status; + MmspCompleteAndReleasePageOp(PageOp); + DPRINT("Address 0x%.8X\n", Address); + return(Status); + } + MmLockSectionSegment(Segment); + /* + * If the completed fault was for another address space then set the + * page in this one. + */ + if (!MmIsPagePresent(AddressSpace->Process, Address)) + { + Entry = MmGetPageEntrySectionSegment(Segment, Offset); + HasSwapEntry = MmIsPageSwapEntry(AddressSpace->Process, (PVOID)PAddress); - if (PAGE_FROM_SSE(Entry) == 0 || HasSwapEntry) - { - /* - * The page was a private page in another or in our address space - */ - MmUnlockSectionSegment(Segment); - MmspCompleteAndReleasePageOp(PageOp); - return(STATUS_MM_RESTART_OPERATION); - } + if (PAGE_FROM_SSE(Entry) == 0 || HasSwapEntry) + { + /* + * The page was a private page in another or in our address space + */ + MmUnlockSectionSegment(Segment); + MmspCompleteAndReleasePageOp(PageOp); + return(STATUS_MM_RESTART_OPERATION); + } - Page.QuadPart = (LONGLONG)(PAGE_FROM_SSE(Entry)); + Page.QuadPart = (LONGLONG)(PAGE_FROM_SSE(Entry)); - MmSharePageEntrySectionSegment(Segment, Offset); + MmSharePageEntrySectionSegment(Segment, Offset); - Status = MmCreateVirtualMapping(MemoryArea->Process, - Address, - Attributes, - Page, - FALSE); - if (Status == STATUS_NO_MEMORY) - { - MmUnlockAddressSpace(AddressSpace); - Status = MmCreateVirtualMapping(MemoryArea->Process, - Address, - Attributes, - Page, - TRUE); - MmLockAddressSpace(AddressSpace); - } + Status = MmCreateVirtualMapping(MemoryArea->Process, + Address, + Attributes, + Page, + FALSE); + if (Status == STATUS_NO_MEMORY) + { + MmUnlockAddressSpace(AddressSpace); + Status = MmCreateVirtualMapping(MemoryArea->Process, + Address, + Attributes, + Page, + TRUE); + MmLockAddressSpace(AddressSpace); + } - if (!NT_SUCCESS(Status)) - { - DbgPrint("Unable to create virtual mapping\n"); - KEBUGCHECK(0); - } - MmInsertRmap(Page, MemoryArea->Process, (PVOID)PAddress); - } - if (Locked) - { - MmLockPage(Page); - } - MmUnlockSectionSegment(Segment); - PageOp->Status = STATUS_SUCCESS; - MmspCompleteAndReleasePageOp(PageOp); - DPRINT("Address 0x%.8X\n", Address); - return(STATUS_SUCCESS); - } + if (!NT_SUCCESS(Status)) + { + DbgPrint("Unable to create virtual mapping\n"); + KEBUGCHECK(0); + } + MmInsertRmap(Page, MemoryArea->Process, (PVOID)PAddress); + } + if (Locked) + { + MmLockPage(Page); + } + MmUnlockSectionSegment(Segment); + PageOp->Status = STATUS_SUCCESS; + MmspCompleteAndReleasePageOp(PageOp); + DPRINT("Address 0x%.8X\n", Address); + return(STATUS_SUCCESS); + } HasSwapEntry = MmIsPageSwapEntry(AddressSpace->Process, (PVOID)PAddress); if (HasSwapEntry) - { - /* - * Must be private page we have swapped out. - */ - SWAPENTRY SwapEntry; - PMDL Mdl; + { + /* + * Must be private page we have swapped out. + */ + SWAPENTRY SwapEntry; + PMDL Mdl; - /* - * Sanity check - */ - if (Segment->Flags & MM_PAGEFILE_SEGMENT) - { - DPRINT1("Found a swaped out private page in a pagefile section.\n"); - KEBUGCHECK(0); - } + /* + * Sanity check + */ + if (Segment->Flags & MM_PAGEFILE_SEGMENT) + { + DPRINT1("Found a swaped out private page in a pagefile section.\n"); + KEBUGCHECK(0); + } - MmUnlockSectionSegment(Segment); - MmDeletePageFileMapping(AddressSpace->Process, (PVOID)PAddress, &SwapEntry); + MmUnlockSectionSegment(Segment); + MmDeletePageFileMapping(AddressSpace->Process, (PVOID)PAddress, &SwapEntry); - MmUnlockAddressSpace(AddressSpace); - Status = MmRequestPageMemoryConsumer(MC_USER, TRUE, &Page); - if (!NT_SUCCESS(Status)) - { - KEBUGCHECK(0); - } + MmUnlockAddressSpace(AddressSpace); + Status = MmRequestPageMemoryConsumer(MC_USER, TRUE, &Page); + if (!NT_SUCCESS(Status)) + { + KEBUGCHECK(0); + } - Mdl = MmCreateMdl(NULL, NULL, PAGE_SIZE); - MmBuildMdlFromPages(Mdl, (PULONG)&Page); - Status = MmReadFromSwapPage(SwapEntry, Mdl); - if (!NT_SUCCESS(Status)) - { - DPRINT1("MmReadFromSwapPage failed, status = %x\n", Status); - KEBUGCHECK(0); - } - MmLockAddressSpace(AddressSpace); - Status = MmCreateVirtualMapping(AddressSpace->Process, - Address, - Region->Protect, - Page, - FALSE); - if (Status == STATUS_NO_MEMORY) - { - MmUnlockAddressSpace(AddressSpace); - Status = MmCreateVirtualMapping(AddressSpace->Process, - Address, - Region->Protect, - Page, - TRUE); - MmLockAddressSpace(AddressSpace); - } - if (!NT_SUCCESS(Status)) - { - DPRINT("MmCreateVirtualMapping failed, not out of memory\n"); - KEBUGCHECK(0); - return(Status); - } + Mdl = MmCreateMdl(NULL, NULL, PAGE_SIZE); + MmBuildMdlFromPages(Mdl, (PULONG)&Page); + Status = MmReadFromSwapPage(SwapEntry, Mdl); + if (!NT_SUCCESS(Status)) + { + DPRINT1("MmReadFromSwapPage failed, status = %x\n", Status); + KEBUGCHECK(0); + } + MmLockAddressSpace(AddressSpace); + Status = MmCreateVirtualMapping(AddressSpace->Process, + Address, + Region->Protect, + Page, + FALSE); + if (Status == STATUS_NO_MEMORY) + { + MmUnlockAddressSpace(AddressSpace); + Status = MmCreateVirtualMapping(AddressSpace->Process, + Address, + Region->Protect, + Page, + TRUE); + MmLockAddressSpace(AddressSpace); + } + if (!NT_SUCCESS(Status)) + { + DPRINT("MmCreateVirtualMapping failed, not out of memory\n"); + KEBUGCHECK(0); + return(Status); + } - /* - * Store the swap entry for later use. - */ - MmSetSavedSwapEntryPage(Page, SwapEntry); + /* + * Store the swap entry for later use. + */ + MmSetSavedSwapEntryPage(Page, SwapEntry); - /* - * Add the page to the process's working set - */ - MmInsertRmap(Page, AddressSpace->Process, (PVOID)PAddress); + /* + * Add the page to the process's working set + */ + MmInsertRmap(Page, AddressSpace->Process, (PVOID)PAddress); - /* - * Finish the operation - */ - if (Locked) - { - MmLockPage(MmGetPhysicalAddressForProcess(NULL, Address)); - } - PageOp->Status = STATUS_SUCCESS; - MmspCompleteAndReleasePageOp(PageOp); - DPRINT("Address 0x%.8X\n", Address); - return(STATUS_SUCCESS); - } + /* + * Finish the operation + */ + if (Locked) + { + MmLockPage(MmGetPhysicalAddressForProcess(NULL, Address)); + } + PageOp->Status = STATUS_SUCCESS; + MmspCompleteAndReleasePageOp(PageOp); + DPRINT("Address 0x%.8X\n", Address); + return(STATUS_SUCCESS); + } /* * Satisfying a page fault on a map of /Device/PhysicalMemory is easy */ if (Section->AllocationAttributes & SEC_PHYSICALMEMORY) - { - MmUnlockSectionSegment(Segment); - /* - * Just map the desired physical page - */ - Page.QuadPart = Offset + MemoryArea->Data.SectionData.ViewOffset; - Status = MmCreateVirtualMapping(AddressSpace->Process, - Address, - Region->Protect, - Page, - FALSE); - if (Status == STATUS_NO_MEMORY) - { - MmUnlockAddressSpace(AddressSpace); - Status = MmCreateVirtualMapping(AddressSpace->Process, - Address, - Region->Protect, - Page, - TRUE); - MmLockAddressSpace(AddressSpace); - } - if (!NT_SUCCESS(Status)) - { - DPRINT("MmCreateVirtualMapping failed, not out of memory\n"); - KEBUGCHECK(0); - return(Status); - } - /* - * Don't add an rmap entry since the page mapped could be for - * anything. - */ - if (Locked) - { - MmLockPage(Page); - } + { + MmUnlockSectionSegment(Segment); + /* + * Just map the desired physical page + */ + Page.QuadPart = Offset + MemoryArea->Data.SectionData.ViewOffset; + Status = MmCreateVirtualMapping(AddressSpace->Process, + Address, + Region->Protect, + Page, + FALSE); + if (Status == STATUS_NO_MEMORY) + { + MmUnlockAddressSpace(AddressSpace); + Status = MmCreateVirtualMapping(AddressSpace->Process, + Address, + Region->Protect, + Page, + TRUE); + MmLockAddressSpace(AddressSpace); + } + if (!NT_SUCCESS(Status)) + { + DPRINT("MmCreateVirtualMapping failed, not out of memory\n"); + KEBUGCHECK(0); + return(Status); + } + /* + * Don't add an rmap entry since the page mapped could be for + * anything. + */ + if (Locked) + { + MmLockPage(Page); + } - /* - * Cleanup and release locks - */ - PageOp->Status = STATUS_SUCCESS; - MmspCompleteAndReleasePageOp(PageOp); - DPRINT("Address 0x%.8X\n", Address); - return(STATUS_SUCCESS); - } + /* + * Cleanup and release locks + */ + PageOp->Status = STATUS_SUCCESS; + MmspCompleteAndReleasePageOp(PageOp); + DPRINT("Address 0x%.8X\n", Address); + return(STATUS_SUCCESS); + } /* * Map anonymous memory for BSS sections */ if (Segment->Characteristics & IMAGE_SECTION_CHAR_BSS) - { - MmUnlockSectionSegment(Segment); - Status = MmRequestPageMemoryConsumer(MC_USER, FALSE, &Page); - if (!NT_SUCCESS(Status)) - { - MmUnlockAddressSpace(AddressSpace); - Status = MmRequestPageMemoryConsumer(MC_USER, TRUE, &Page); - MmLockAddressSpace(AddressSpace); - } - if (!NT_SUCCESS(Status)) - { - KEBUGCHECK(0); - } - Status = MmCreateVirtualMapping(AddressSpace->Process, - Address, - Region->Protect, - Page, - FALSE); - if (Status == STATUS_NO_MEMORY) - { - MmUnlockAddressSpace(AddressSpace); - Status = MmCreateVirtualMapping(AddressSpace->Process, - Address, - Region->Protect, - Page, - TRUE); - MmLockAddressSpace(AddressSpace); - } + { + MmUnlockSectionSegment(Segment); + Status = MmRequestPageMemoryConsumer(MC_USER, FALSE, &Page); + if (!NT_SUCCESS(Status)) + { + MmUnlockAddressSpace(AddressSpace); + Status = MmRequestPageMemoryConsumer(MC_USER, TRUE, &Page); + MmLockAddressSpace(AddressSpace); + } + if (!NT_SUCCESS(Status)) + { + KEBUGCHECK(0); + } + Status = MmCreateVirtualMapping(AddressSpace->Process, + Address, + Region->Protect, + Page, + FALSE); + if (Status == STATUS_NO_MEMORY) + { + MmUnlockAddressSpace(AddressSpace); + Status = MmCreateVirtualMapping(AddressSpace->Process, + Address, + Region->Protect, + Page, + TRUE); + MmLockAddressSpace(AddressSpace); + } - if (!NT_SUCCESS(Status)) - { - DPRINT("MmCreateVirtualMapping failed, not out of memory\n"); - KEBUGCHECK(0); - return(Status); - } - MmInsertRmap(Page, AddressSpace->Process, (PVOID)PAddress); - if (Locked) - { - MmLockPage(Page); - } + if (!NT_SUCCESS(Status)) + { + DPRINT("MmCreateVirtualMapping failed, not out of memory\n"); + KEBUGCHECK(0); + return(Status); + } + MmInsertRmap(Page, AddressSpace->Process, (PVOID)PAddress); + if (Locked) + { + MmLockPage(Page); + } - /* - * Cleanup and release locks - */ - PageOp->Status = STATUS_SUCCESS; - MmspCompleteAndReleasePageOp(PageOp); - DPRINT("Address 0x%.8X\n", Address); - return(STATUS_SUCCESS); - } + /* + * Cleanup and release locks + */ + PageOp->Status = STATUS_SUCCESS; + MmspCompleteAndReleasePageOp(PageOp); + DPRINT("Address 0x%.8X\n", Address); + return(STATUS_SUCCESS); + } /* * Get the entry corresponding to the offset within the section @@ -972,263 +976,263 @@ MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace, Entry = MmGetPageEntrySectionSegment(Segment, Offset); if (Entry == 0) - { - /* - * If the entry is zero (and it can't change because we have - * locked the segment) then we need to load the page. - */ + { + /* + * If the entry is zero (and it can't change because we have + * locked the segment) then we need to load the page. + */ - /* - * Release all our locks and read in the page from disk - */ - MmUnlockSectionSegment(Segment); - MmUnlockAddressSpace(AddressSpace); + /* + * Release all our locks and read in the page from disk + */ + MmUnlockSectionSegment(Segment); + MmUnlockAddressSpace(AddressSpace); - if ((Segment->Flags & MM_PAGEFILE_SEGMENT) || - (Offset >= PAGE_ROUND_UP(Segment->RawLength) && Section->AllocationAttributes & SEC_IMAGE)) - { - Status = MmRequestPageMemoryConsumer(MC_USER, TRUE, &Page); - if (!NT_SUCCESS(Status)) - { - DPRINT1("MmRequestPageMemoryConsumer failed (Status %x)\n", Status); - } - } - else + if ((Segment->Flags & MM_PAGEFILE_SEGMENT) || + (Offset >= PAGE_ROUND_UP(Segment->RawLength) && Section->AllocationAttributes & SEC_IMAGE)) + { + Status = MmRequestPageMemoryConsumer(MC_USER, TRUE, &Page); + if (!NT_SUCCESS(Status)) { - Status = MiReadPage(MemoryArea, Offset, &Page); - if (!NT_SUCCESS(Status)) - { - DPRINT1("MiReadPage failed (Status %x)\n", Status); - } - } - if (!NT_SUCCESS(Status)) - { - /* - * FIXME: What do we know in this case? - */ - /* - * Cleanup and release locks - */ - MmLockAddressSpace(AddressSpace); - PageOp->Status = Status; - MmspCompleteAndReleasePageOp(PageOp); - DPRINT("Address 0x%.8X\n", Address); - return(Status); - } - /* - * Relock the address space and segment - */ - MmLockAddressSpace(AddressSpace); - MmLockSectionSegment(Segment); - - /* - * Check the entry. No one should change the status of a page - * that has a pending page-in. - */ - Entry1 = MmGetPageEntrySectionSegment(Segment, Offset); - if (Entry != Entry1) - { - DbgPrint("Someone changed ppte entry while we slept\n"); - KEBUGCHECK(0); - } - - /* - * Mark the offset within the section as having valid, in-memory - * data - */ - Entry = MAKE_SSE(Page.u.LowPart, 1); - MmSetPageEntrySectionSegment(Segment, Offset, Entry); - MmUnlockSectionSegment(Segment); - - Status = MmCreateVirtualMapping(AddressSpace->Process, - Address, - Attributes, - Page, - FALSE); - if (Status == STATUS_NO_MEMORY) - { - MmUnlockAddressSpace(AddressSpace); - Status = MmCreateVirtualMapping(AddressSpace->Process, - Address, - Attributes, - Page, - TRUE); - MmLockAddressSpace(AddressSpace); + DPRINT1("MmRequestPageMemoryConsumer failed (Status %x)\n", Status); } - if (!NT_SUCCESS(Status)) + } + else + { + Status = MiReadPage(MemoryArea, Offset, &Page); + if (!NT_SUCCESS(Status)) { - DbgPrint("Unable to create virtual mapping\n"); - KEBUGCHECK(0); + DPRINT1("MiReadPage failed (Status %x)\n", Status); } - MmInsertRmap(Page, AddressSpace->Process, (PVOID)PAddress); + } + if (!NT_SUCCESS(Status)) + { + /* + * FIXME: What do we know in this case? + */ + /* + * Cleanup and release locks + */ + MmLockAddressSpace(AddressSpace); + PageOp->Status = Status; + MmspCompleteAndReleasePageOp(PageOp); + DPRINT("Address 0x%.8X\n", Address); + return(Status); + } + /* + * Relock the address space and segment + */ + MmLockAddressSpace(AddressSpace); + MmLockSectionSegment(Segment); - if (Locked) - { - MmLockPage(Page); - } - PageOp->Status = STATUS_SUCCESS; - MmspCompleteAndReleasePageOp(PageOp); - DPRINT("Address 0x%.8X\n", Address); - return(STATUS_SUCCESS); - } + /* + * Check the entry. No one should change the status of a page + * that has a pending page-in. + */ + Entry1 = MmGetPageEntrySectionSegment(Segment, Offset); + if (Entry != Entry1) + { + DbgPrint("Someone changed ppte entry while we slept\n"); + KEBUGCHECK(0); + } + + /* + * Mark the offset within the section as having valid, in-memory + * data + */ + Entry = MAKE_SSE(Page.u.LowPart, 1); + MmSetPageEntrySectionSegment(Segment, Offset, Entry); + MmUnlockSectionSegment(Segment); + + Status = MmCreateVirtualMapping(AddressSpace->Process, + Address, + Attributes, + Page, + FALSE); + if (Status == STATUS_NO_MEMORY) + { + MmUnlockAddressSpace(AddressSpace); + Status = MmCreateVirtualMapping(AddressSpace->Process, + Address, + Attributes, + Page, + TRUE); + MmLockAddressSpace(AddressSpace); + } + if (!NT_SUCCESS(Status)) + { + DbgPrint("Unable to create virtual mapping\n"); + KEBUGCHECK(0); + } + MmInsertRmap(Page, AddressSpace->Process, (PVOID)PAddress); + + if (Locked) + { + MmLockPage(Page); + } + PageOp->Status = STATUS_SUCCESS; + MmspCompleteAndReleasePageOp(PageOp); + DPRINT("Address 0x%.8X\n", Address); + return(STATUS_SUCCESS); + } else if (IS_SWAP_FROM_SSE(Entry)) - { - SWAPENTRY SwapEntry; - PMDL Mdl; + { + SWAPENTRY SwapEntry; + PMDL Mdl; - SwapEntry = SWAPENTRY_FROM_SSE(Entry); + SwapEntry = SWAPENTRY_FROM_SSE(Entry); - /* - * Release all our locks and read in the page from disk - */ - MmUnlockSectionSegment(Segment); + /* + * Release all our locks and read in the page from disk + */ + MmUnlockSectionSegment(Segment); - MmUnlockAddressSpace(AddressSpace); + MmUnlockAddressSpace(AddressSpace); - Status = MmRequestPageMemoryConsumer(MC_USER, TRUE, &Page); - if (!NT_SUCCESS(Status)) - { - KEBUGCHECK(0); - } + Status = MmRequestPageMemoryConsumer(MC_USER, TRUE, &Page); + if (!NT_SUCCESS(Status)) + { + KEBUGCHECK(0); + } - Mdl = MmCreateMdl(NULL, NULL, PAGE_SIZE); - MmBuildMdlFromPages(Mdl, (PULONG)&Page); - Status = MmReadFromSwapPage(SwapEntry, Mdl); - if (!NT_SUCCESS(Status)) - { - KEBUGCHECK(0); - } + Mdl = MmCreateMdl(NULL, NULL, PAGE_SIZE); + MmBuildMdlFromPages(Mdl, (PULONG)&Page); + Status = MmReadFromSwapPage(SwapEntry, Mdl); + if (!NT_SUCCESS(Status)) + { + KEBUGCHECK(0); + } - /* - * Relock the address space and segment - */ - MmLockAddressSpace(AddressSpace); - MmLockSectionSegment(Segment); + /* + * Relock the address space and segment + */ + MmLockAddressSpace(AddressSpace); + MmLockSectionSegment(Segment); - /* - * Check the entry. No one should change the status of a page - * that has a pending page-in. - */ - Entry1 = MmGetPageEntrySectionSegment(Segment, Offset); - if (Entry != Entry1) - { - DbgPrint("Someone changed ppte entry while we slept\n"); - KEBUGCHECK(0); - } + /* + * Check the entry. No one should change the status of a page + * that has a pending page-in. + */ + Entry1 = MmGetPageEntrySectionSegment(Segment, Offset); + if (Entry != Entry1) + { + DbgPrint("Someone changed ppte entry while we slept\n"); + KEBUGCHECK(0); + } - /* - * Mark the offset within the section as having valid, in-memory - * data - */ - Entry = MAKE_SSE(Page.u.LowPart, 1); - MmSetPageEntrySectionSegment(Segment, Offset, Entry); - MmUnlockSectionSegment(Segment); + /* + * Mark the offset within the section as having valid, in-memory + * data + */ + Entry = MAKE_SSE(Page.u.LowPart, 1); + MmSetPageEntrySectionSegment(Segment, Offset, Entry); + MmUnlockSectionSegment(Segment); - /* - * Save the swap entry. - */ - MmSetSavedSwapEntryPage(Page, SwapEntry); - Status = MmCreateVirtualMapping(AddressSpace->Process, - Address, - Region->Protect, - Page, - FALSE); - if (Status == STATUS_NO_MEMORY) - { - MmUnlockAddressSpace(AddressSpace); - Status = MmCreateVirtualMapping(AddressSpace->Process, - Address, - Region->Protect, - Page, - TRUE); - MmLockAddressSpace(AddressSpace); - } - if (!NT_SUCCESS(Status)) - { - DbgPrint("Unable to create virtual mapping\n"); - KEBUGCHECK(0); - } - MmInsertRmap(Page, AddressSpace->Process, (PVOID)PAddress); - if (Locked) - { - MmLockPage(Page); - } - PageOp->Status = STATUS_SUCCESS; - MmspCompleteAndReleasePageOp(PageOp); - DPRINT("Address 0x%.8X\n", Address); - return(STATUS_SUCCESS); - } + /* + * Save the swap entry. + */ + MmSetSavedSwapEntryPage(Page, SwapEntry); + Status = MmCreateVirtualMapping(AddressSpace->Process, + Address, + Region->Protect, + Page, + FALSE); + if (Status == STATUS_NO_MEMORY) + { + MmUnlockAddressSpace(AddressSpace); + Status = MmCreateVirtualMapping(AddressSpace->Process, + Address, + Region->Protect, + Page, + TRUE); + MmLockAddressSpace(AddressSpace); + } + if (!NT_SUCCESS(Status)) + { + DbgPrint("Unable to create virtual mapping\n"); + KEBUGCHECK(0); + } + MmInsertRmap(Page, AddressSpace->Process, (PVOID)PAddress); + if (Locked) + { + MmLockPage(Page); + } + PageOp->Status = STATUS_SUCCESS; + MmspCompleteAndReleasePageOp(PageOp); + DPRINT("Address 0x%.8X\n", Address); + return(STATUS_SUCCESS); + } else - { - /* - * If the section offset is already in-memory and valid then just - * take another reference to the page - */ + { + /* + * If the section offset is already in-memory and valid then just + * take another reference to the page + */ - Page.QuadPart = (LONGLONG)PAGE_FROM_SSE(Entry); + Page.QuadPart = (LONGLONG)PAGE_FROM_SSE(Entry); - MmSharePageEntrySectionSegment(Segment, Offset); - MmUnlockSectionSegment(Segment); + MmSharePageEntrySectionSegment(Segment, Offset); + MmUnlockSectionSegment(Segment); - Status = MmCreateVirtualMapping(AddressSpace->Process, - Address, - Attributes, - Page, - FALSE); - if (Status == STATUS_NO_MEMORY) - { - MmUnlockAddressSpace(AddressSpace); - Status = MmCreateVirtualMapping(AddressSpace->Process, - Address, - Attributes, - Page, - TRUE); - MmLockAddressSpace(AddressSpace); - } - if (!NT_SUCCESS(Status)) - { - DbgPrint("Unable to create virtual mapping\n"); - KEBUGCHECK(0); - } - MmInsertRmap(Page, AddressSpace->Process, (PVOID)PAddress); - if (Locked) - { - MmLockPage(Page); - } - PageOp->Status = STATUS_SUCCESS; - MmspCompleteAndReleasePageOp(PageOp); - DPRINT("Address 0x%.8X\n", Address); - return(STATUS_SUCCESS); - } + Status = MmCreateVirtualMapping(AddressSpace->Process, + Address, + Attributes, + Page, + FALSE); + if (Status == STATUS_NO_MEMORY) + { + MmUnlockAddressSpace(AddressSpace); + Status = MmCreateVirtualMapping(AddressSpace->Process, + Address, + Attributes, + Page, + TRUE); + MmLockAddressSpace(AddressSpace); + } + if (!NT_SUCCESS(Status)) + { + DbgPrint("Unable to create virtual mapping\n"); + KEBUGCHECK(0); + } + MmInsertRmap(Page, AddressSpace->Process, (PVOID)PAddress); + if (Locked) + { + MmLockPage(Page); + } + PageOp->Status = STATUS_SUCCESS; + MmspCompleteAndReleasePageOp(PageOp); + DPRINT("Address 0x%.8X\n", Address); + return(STATUS_SUCCESS); + } } NTSTATUS MmAccessFaultSectionView(PMADDRESS_SPACE AddressSpace, - MEMORY_AREA* MemoryArea, - PVOID Address, - BOOLEAN Locked) + MEMORY_AREA* MemoryArea, + PVOID Address, + BOOLEAN Locked) { - PMM_SECTION_SEGMENT Segment; - PSECTION_OBJECT Section; - PHYSICAL_ADDRESS OldPage; - PHYSICAL_ADDRESS NewPage; - PVOID NewAddress; - NTSTATUS Status; - ULONG PAddress; - ULONG Offset; - PMM_PAGEOP PageOp; - PMM_REGION Region; - ULONG Entry; + PMM_SECTION_SEGMENT Segment; + PSECTION_OBJECT Section; + PHYSICAL_ADDRESS OldPage; + PHYSICAL_ADDRESS NewPage; + PVOID NewAddress; + NTSTATUS Status; + ULONG PAddress; + ULONG Offset; + PMM_PAGEOP PageOp; + PMM_REGION Region; + ULONG Entry; - /* - * Check if the page has been paged out or has already been set readwrite - */ + /* + * Check if the page has been paged out or has already been set readwrite + */ if (!MmIsPagePresent(AddressSpace->Process, Address) || - MmGetPageProtect(AddressSpace->Process, Address) & PAGE_READWRITE) - { - DPRINT("Address 0x%.8X\n", Address); - return(STATUS_SUCCESS); - } + MmGetPageProtect(AddressSpace->Process, Address) & PAGE_READWRITE) + { + DPRINT("Address 0x%.8X\n", Address); + return(STATUS_SUCCESS); + } /* * Find the offset of the page @@ -1239,8 +1243,8 @@ MmAccessFaultSectionView(PMADDRESS_SPACE AddressSpace, Segment = MemoryArea->Data.SectionData.Segment; Section = MemoryArea->Data.SectionData.Section; Region = MmFindRegion(MemoryArea->BaseAddress, - &MemoryArea->Data.SectionData.RegionListHead, - Address, NULL); + &MemoryArea->Data.SectionData.RegionListHead, + Address, NULL); /* * Lock the segment */ @@ -1255,60 +1259,60 @@ MmAccessFaultSectionView(PMADDRESS_SPACE AddressSpace, * Check if we are doing COW */ if (!((Segment->WriteCopy || MemoryArea->Data.SectionData.WriteCopyView) && - (Region->Protect == PAGE_READWRITE || - Region->Protect == PAGE_EXECUTE_READWRITE))) - { - DPRINT("Address 0x%.8X\n", Address); - return(STATUS_UNSUCCESSFUL); - } + (Region->Protect == PAGE_READWRITE || + Region->Protect == PAGE_EXECUTE_READWRITE))) + { + DPRINT("Address 0x%.8X\n", Address); + return(STATUS_UNSUCCESSFUL); + } if (IS_SWAP_FROM_SSE(Entry) || - PAGE_FROM_SSE(Entry) != OldPage.u.LowPart) - { - /* This is a private page. We must only change the page protection. */ - MmSetPageProtect(AddressSpace->Process, (PVOID)PAddress, Region->Protect); - return(STATUS_SUCCESS); - } + PAGE_FROM_SSE(Entry) != OldPage.u.LowPart) + { + /* This is a private page. We must only change the page protection. */ + MmSetPageProtect(AddressSpace->Process, (PVOID)PAddress, Region->Protect); + return(STATUS_SUCCESS); + } /* * Get or create a pageop */ PageOp = MmGetPageOp(MemoryArea, 0, 0, Segment, Offset, - MM_PAGEOP_ACCESSFAULT, FALSE); + MM_PAGEOP_ACCESSFAULT, FALSE); if (PageOp == NULL) - { - DPRINT1("MmGetPageOp failed\n"); - KEBUGCHECK(0); - } + { + DPRINT1("MmGetPageOp failed\n"); + KEBUGCHECK(0); + } /* * Wait for any other operations to complete */ if (PageOp->Thread != PsGetCurrentThread()) - { - MmUnlockAddressSpace(AddressSpace); - Status = MmspWaitForPageOpCompletionEvent(PageOp); - /* - * Check for various strange conditions - */ - if (Status == STATUS_TIMEOUT) - { - DPRINT1("Failed to wait for page op, status = %x\n", Status); - KEBUGCHECK(0); - } - if (PageOp->Status == STATUS_PENDING) - { - DPRINT1("Woke for page op before completion\n"); - KEBUGCHECK(0); - } - /* - * Restart the operation - */ - MmLockAddressSpace(AddressSpace); - MmspCompleteAndReleasePageOp(PageOp); - DPRINT("Address 0x%.8X\n", Address); - return(STATUS_MM_RESTART_OPERATION); - } + { + MmUnlockAddressSpace(AddressSpace); + Status = MmspWaitForPageOpCompletionEvent(PageOp); + /* + * Check for various strange conditions + */ + if (Status == STATUS_TIMEOUT) + { + DPRINT1("Failed to wait for page op, status = %x\n", Status); + KEBUGCHECK(0); + } + if (PageOp->Status == STATUS_PENDING) + { + DPRINT1("Woke for page op before completion\n"); + KEBUGCHECK(0); + } + /* + * Restart the operation + */ + MmLockAddressSpace(AddressSpace); + MmspCompleteAndReleasePageOp(PageOp); + DPRINT("Address 0x%.8X\n", Address); + return(STATUS_MM_RESTART_OPERATION); + } /* * Release locks now we have the pageop @@ -1321,7 +1325,7 @@ MmAccessFaultSectionView(PMADDRESS_SPACE AddressSpace, Status = MmRequestPageMemoryConsumer(MC_USER, TRUE, &NewPage); if (!NT_SUCCESS(Status)) { - KEBUGCHECK(0); + KEBUGCHECK(0); } /* @@ -1342,37 +1346,37 @@ MmAccessFaultSectionView(PMADDRESS_SPACE AddressSpace, */ MmLockAddressSpace(AddressSpace); Status = MmCreateVirtualMapping(AddressSpace->Process, - Address, - Region->Protect, - NewPage, - FALSE); + Address, + Region->Protect, + NewPage, + FALSE); if (Status == STATUS_NO_MEMORY) - { - MmUnlockAddressSpace(AddressSpace); - Status = MmCreateVirtualMapping(AddressSpace->Process, - Address, - Region->Protect, - NewPage, - TRUE); - MmLockAddressSpace(AddressSpace); - } + { + MmUnlockAddressSpace(AddressSpace); + Status = MmCreateVirtualMapping(AddressSpace->Process, + Address, + Region->Protect, + NewPage, + TRUE); + MmLockAddressSpace(AddressSpace); + } if (!NT_SUCCESS(Status)) - { - DPRINT("MmCreateVirtualMapping failed, not out of memory\n"); - KEBUGCHECK(0); - return(Status); - } + { + DPRINT("MmCreateVirtualMapping failed, not out of memory\n"); + KEBUGCHECK(0); + return(Status); + } MmInsertRmap(NewPage, AddressSpace->Process, (PVOID)PAddress); if (!NT_SUCCESS(Status)) - { - DbgPrint("Unable to create virtual mapping\n"); - KEBUGCHECK(0); - } + { + DbgPrint("Unable to create virtual mapping\n"); + KEBUGCHECK(0); + } if (Locked) - { - MmLockPage(NewPage); - MmUnlockPage(OldPage); - } + { + MmLockPage(NewPage); + MmUnlockPage(OldPage); + } /* * Unshare the old page. @@ -1391,72 +1395,72 @@ MmAccessFaultSectionView(PMADDRESS_SPACE AddressSpace, VOID MmPageOutDeleteMapping(PVOID Context, PEPROCESS Process, PVOID Address) { - MM_SECTION_PAGEOUT_CONTEXT* PageOutContext; - BOOL WasDirty; - PHYSICAL_ADDRESS Page; + MM_SECTION_PAGEOUT_CONTEXT* PageOutContext; + BOOL WasDirty; + PHYSICAL_ADDRESS Page; - PageOutContext = (MM_SECTION_PAGEOUT_CONTEXT*)Context; - MmDeleteVirtualMapping(Process, - Address, - FALSE, - &WasDirty, - &Page); - if (WasDirty) - { + PageOutContext = (MM_SECTION_PAGEOUT_CONTEXT*)Context; + MmDeleteVirtualMapping(Process, + Address, + FALSE, + &WasDirty, + &Page); + if (WasDirty) + { PageOutContext->WasDirty = TRUE; - } - if (!PageOutContext->Private) - { + } + if (!PageOutContext->Private) + { MmUnsharePageEntrySectionSegment(PageOutContext->Section, - PageOutContext->Segment, - PageOutContext->Offset, - PageOutContext->WasDirty, - TRUE); - } - else - { + PageOutContext->Segment, + PageOutContext->Offset, + PageOutContext->WasDirty, + TRUE); + } + else + { MmReleasePageMemoryConsumer(MC_USER, Page); - } + } - DPRINT("PhysicalAddress %I64x, Address %x\n", Page, Address); + DPRINT("PhysicalAddress %I64x, Address %x\n", Page, Address); } NTSTATUS MmPageOutSectionView(PMADDRESS_SPACE AddressSpace, - MEMORY_AREA* MemoryArea, - PVOID Address, - PMM_PAGEOP PageOp) + MEMORY_AREA* MemoryArea, + PVOID Address, + PMM_PAGEOP PageOp) { - PHYSICAL_ADDRESS PhysicalAddress; - MM_SECTION_PAGEOUT_CONTEXT Context; - SWAPENTRY SwapEntry; - PMDL Mdl; - ULONG Entry; - ULONG FileOffset; - NTSTATUS Status; - PFILE_OBJECT FileObject; - PBCB Bcb = NULL; - BOOLEAN DirectMapped; - BOOLEAN IsImageSection; + PHYSICAL_ADDRESS PhysicalAddress; + MM_SECTION_PAGEOUT_CONTEXT Context; + SWAPENTRY SwapEntry; + PMDL Mdl; + ULONG Entry; + ULONG FileOffset; + NTSTATUS Status; + PFILE_OBJECT FileObject; + PBCB Bcb = NULL; + BOOLEAN DirectMapped; + BOOLEAN IsImageSection; - Address = (PVOID)PAGE_ROUND_DOWN(Address); + Address = (PVOID)PAGE_ROUND_DOWN(Address); - /* - * Get the segment and section. - */ - Context.Segment = MemoryArea->Data.SectionData.Segment; - Context.Section = MemoryArea->Data.SectionData.Section; + /* + * Get the segment and section. + */ + Context.Segment = MemoryArea->Data.SectionData.Segment; + Context.Section = MemoryArea->Data.SectionData.Section; - Context.Offset = (ULONG)((char*)Address - (ULONG)MemoryArea->BaseAddress); - FileOffset = Context.Offset + Context.Segment->FileOffset; + Context.Offset = (ULONG)((char*)Address - (ULONG)MemoryArea->BaseAddress); + FileOffset = Context.Offset + Context.Segment->FileOffset; - IsImageSection = Context.Section->AllocationAttributes & SEC_IMAGE ? TRUE : FALSE; + IsImageSection = Context.Section->AllocationAttributes & SEC_IMAGE ? TRUE : FALSE; - FileObject = Context.Section->FileObject; - DirectMapped = FALSE; - if (FileObject != NULL && - !(Context.Segment->Characteristics & IMAGE_SECTION_CHAR_SHARED)) - { + FileObject = Context.Section->FileObject; + DirectMapped = FALSE; + if (FileObject != NULL && + !(Context.Segment->Characteristics & IMAGE_SECTION_CHAR_SHARED)) + { Bcb = FileObject->SectionObjectPointer->SharedCacheMap; /* @@ -1465,346 +1469,346 @@ MmPageOutSectionView(PMADDRESS_SPACE AddressSpace, * then note this is a direct mapped page. */ if ((FileOffset % PAGE_SIZE) == 0 && - (Context.Offset + PAGE_SIZE <= Context.Segment->RawLength || !IsImageSection)) - { - DirectMapped = TRUE; - } - } + (Context.Offset + PAGE_SIZE <= Context.Segment->RawLength || !IsImageSection)) + { + DirectMapped = TRUE; + } + } - /* - * This should never happen since mappings of physical memory are never - * placed in the rmap lists. - */ - if (Context.Section->AllocationAttributes & SEC_PHYSICALMEMORY) - { + /* + * This should never happen since mappings of physical memory are never + * placed in the rmap lists. + */ + if (Context.Section->AllocationAttributes & SEC_PHYSICALMEMORY) + { DPRINT1("Trying to page out from physical memory section address 0x%X " - "process %d\n", Address, - AddressSpace->Process ? AddressSpace->Process->UniqueProcessId : 0); + "process %d\n", Address, + AddressSpace->Process ? AddressSpace->Process->UniqueProcessId : 0); KEBUGCHECK(0); - } + } - /* - * Get the section segment entry and the physical address. - */ - Entry = MmGetPageEntrySectionSegment(Context.Segment, Context.Offset); - if (!MmIsPagePresent(AddressSpace->Process, Address)) - { + /* + * Get the section segment entry and the physical address. + */ + Entry = MmGetPageEntrySectionSegment(Context.Segment, Context.Offset); + if (!MmIsPagePresent(AddressSpace->Process, Address)) + { DPRINT1("Trying to page out not-present page at (%d,0x%.8X).\n", - AddressSpace->Process ? AddressSpace->Process->UniqueProcessId : 0, Address); + AddressSpace->Process ? AddressSpace->Process->UniqueProcessId : 0, Address); KEBUGCHECK(0); - } - PhysicalAddress = - MmGetPhysicalAddressForProcess(AddressSpace->Process, Address); - SwapEntry = MmGetSavedSwapEntryPage(PhysicalAddress); + } + PhysicalAddress = + MmGetPhysicalAddressForProcess(AddressSpace->Process, Address); + SwapEntry = MmGetSavedSwapEntryPage(PhysicalAddress); - /* - * Prepare the context structure for the rmap delete call. - */ - Context.WasDirty = FALSE; - if (Context.Segment->Characteristics & IMAGE_SECTION_CHAR_BSS || - IS_SWAP_FROM_SSE(Entry) || - (LONGLONG)PAGE_FROM_SSE(Entry) != PhysicalAddress.QuadPart) - { + /* + * Prepare the context structure for the rmap delete call. + */ + Context.WasDirty = FALSE; + if (Context.Segment->Characteristics & IMAGE_SECTION_CHAR_BSS || + IS_SWAP_FROM_SSE(Entry) || + (LONGLONG)PAGE_FROM_SSE(Entry) != PhysicalAddress.QuadPart) + { Context.Private = TRUE; - } - else - { + } + else + { Context.Private = FALSE; - } + } - /* - * Take an additional reference to the page or the cache segment. - */ - if (DirectMapped && !Context.Private) - { + /* + * Take an additional reference to the page or the cache segment. + */ + if (DirectMapped && !Context.Private) + { if(!MiIsPageFromCache(MemoryArea, Context.Offset)) - { - DPRINT1("Direct mapped non private page is not associated with the cache.\n"); - KEBUGCHECK(0); - } - } - else - { + { + DPRINT1("Direct mapped non private page is not associated with the cache.\n"); + KEBUGCHECK(0); + } + } + else + { MmReferencePage(PhysicalAddress); - } + } - MmDeleteAllRmaps(PhysicalAddress, (PVOID)&Context, MmPageOutDeleteMapping); + MmDeleteAllRmaps(PhysicalAddress, (PVOID)&Context, MmPageOutDeleteMapping); - /* - * If this wasn't a private page then we should have reduced the entry to - * zero by deleting all the rmaps. - */ - if (!Context.Private && MmGetPageEntrySectionSegment(Context.Segment, Context.Offset) != 0) - { + /* + * If this wasn't a private page then we should have reduced the entry to + * zero by deleting all the rmaps. + */ + if (!Context.Private && MmGetPageEntrySectionSegment(Context.Segment, Context.Offset) != 0) + { if (!(Context.Segment->Flags & MM_PAGEFILE_SEGMENT) && - !(Context.Segment->Characteristics & IMAGE_SECTION_CHAR_SHARED)) - { - KEBUGCHECK(0); - } - } + !(Context.Segment->Characteristics & IMAGE_SECTION_CHAR_SHARED)) + { + KEBUGCHECK(0); + } + } - /* - * If the page wasn't dirty then we can just free it as for a readonly page. - * Since we unmapped all the mappings above we know it will not suddenly - * become dirty. - * If the page is from a pagefile section and has no swap entry, - * we can't free the page at this point. - */ - SwapEntry = MmGetSavedSwapEntryPage(PhysicalAddress); - if (Context.Segment->Flags & MM_PAGEFILE_SEGMENT) - { + /* + * If the page wasn't dirty then we can just free it as for a readonly page. + * Since we unmapped all the mappings above we know it will not suddenly + * become dirty. + * If the page is from a pagefile section and has no swap entry, + * we can't free the page at this point. + */ + SwapEntry = MmGetSavedSwapEntryPage(PhysicalAddress); + if (Context.Segment->Flags & MM_PAGEFILE_SEGMENT) + { if (Context.Private) - { - DPRINT1("Found a %s private page (address %x) in a pagefile segment.\n", - Context.WasDirty ? "dirty" : "clean", Address); - KEBUGCHECK(0); - } + { + DPRINT1("Found a %s private page (address %x) in a pagefile segment.\n", + Context.WasDirty ? "dirty" : "clean", Address); + KEBUGCHECK(0); + } if (!Context.WasDirty && SwapEntry != 0) - { - MmSetSavedSwapEntryPage(PhysicalAddress, 0); - MmSetPageEntrySectionSegment(Context.Segment, Context.Offset, MAKE_SWAP_SSE(SwapEntry)); - MmReleasePageMemoryConsumer(MC_USER, PhysicalAddress); - PageOp->Status = STATUS_SUCCESS; - MmspCompleteAndReleasePageOp(PageOp); - return(STATUS_SUCCESS); - } - } - else if (Context.Segment->Characteristics & IMAGE_SECTION_CHAR_SHARED) - { + { + MmSetSavedSwapEntryPage(PhysicalAddress, 0); + MmSetPageEntrySectionSegment(Context.Segment, Context.Offset, MAKE_SWAP_SSE(SwapEntry)); + MmReleasePageMemoryConsumer(MC_USER, PhysicalAddress); + PageOp->Status = STATUS_SUCCESS; + MmspCompleteAndReleasePageOp(PageOp); + return(STATUS_SUCCESS); + } + } + else if (Context.Segment->Characteristics & IMAGE_SECTION_CHAR_SHARED) + { if (Context.Private) - { - DPRINT1("Found a %s private page (address %x) in a shared section segment.\n", - Context.WasDirty ? "dirty" : "clean", Address); - KEBUGCHECK(0); - } + { + DPRINT1("Found a %s private page (address %x) in a shared section segment.\n", + Context.WasDirty ? "dirty" : "clean", Address); + KEBUGCHECK(0); + } if (!Context.WasDirty || SwapEntry != 0) - { - MmSetSavedSwapEntryPage(PhysicalAddress, 0); - if (SwapEntry != 0) - { - MmSetPageEntrySectionSegment(Context.Segment, Context.Offset, MAKE_SWAP_SSE(SwapEntry)); - } - MmReleasePageMemoryConsumer(MC_USER, PhysicalAddress); - PageOp->Status = STATUS_SUCCESS; - MmspCompleteAndReleasePageOp(PageOp); - return(STATUS_SUCCESS); - } - } - else if (!Context.Private && DirectMapped) - { + { + MmSetSavedSwapEntryPage(PhysicalAddress, 0); + if (SwapEntry != 0) + { + MmSetPageEntrySectionSegment(Context.Segment, Context.Offset, MAKE_SWAP_SSE(SwapEntry)); + } + MmReleasePageMemoryConsumer(MC_USER, PhysicalAddress); + PageOp->Status = STATUS_SUCCESS; + MmspCompleteAndReleasePageOp(PageOp); + return(STATUS_SUCCESS); + } + } + else if (!Context.Private && DirectMapped) + { if (SwapEntry != 0) - { - DPRINT1("Found a swapentry for a non private and direct mapped page (address %x)\n", - Address); - KEBUGCHECK(0); - } + { + DPRINT1("Found a swapentry for a non private and direct mapped page (address %x)\n", + Address); + KEBUGCHECK(0); + } Status = CcRosUnmapCacheSegment(Bcb, FileOffset, FALSE); if (!NT_SUCCESS(Status)) - { - DPRINT1("CCRosUnmapCacheSegment failed, status = %x\n", Status); - KEBUGCHECK(0); - } + { + DPRINT1("CCRosUnmapCacheSegment failed, status = %x\n", Status); + KEBUGCHECK(0); + } PageOp->Status = STATUS_SUCCESS; MmspCompleteAndReleasePageOp(PageOp); return(STATUS_SUCCESS); - } - else if (!Context.WasDirty && !DirectMapped && !Context.Private) - { + } + else if (!Context.WasDirty && !DirectMapped && !Context.Private) + { if (SwapEntry != 0) - { - DPRINT1("Found a swap entry for a non dirty, non private and not direct mapped page (address %x)\n", - Address); - KEBUGCHECK(0); - } + { + DPRINT1("Found a swap entry for a non dirty, non private and not direct mapped page (address %x)\n", + Address); + KEBUGCHECK(0); + } MmReleasePageMemoryConsumer(MC_USER, PhysicalAddress); PageOp->Status = STATUS_SUCCESS; MmspCompleteAndReleasePageOp(PageOp); return(STATUS_SUCCESS); - } - else if (!Context.WasDirty && Context.Private && SwapEntry != 0) - { + } + else if (!Context.WasDirty && Context.Private && SwapEntry != 0) + { MmSetSavedSwapEntryPage(PhysicalAddress, 0); Status = MmCreatePageFileMapping(AddressSpace->Process, - Address, - SwapEntry); + Address, + SwapEntry); if (!NT_SUCCESS(Status)) - { - KEBUGCHECK(0); - } + { + KEBUGCHECK(0); + } MmReleasePageMemoryConsumer(MC_USER, PhysicalAddress); PageOp->Status = STATUS_SUCCESS; MmspCompleteAndReleasePageOp(PageOp); return(STATUS_SUCCESS); - } + } - /* - * If necessary, allocate an entry in the paging file for this page - */ - if (SwapEntry == 0) - { + /* + * If necessary, allocate an entry in the paging file for this page + */ + if (SwapEntry == 0) + { SwapEntry = MmAllocSwapPage(); if (SwapEntry == 0) - { - MmShowOutOfSpaceMessagePagingFile(); + { + MmShowOutOfSpaceMessagePagingFile(); - /* - * For private pages restore the old mappings. - */ - if (Context.Private) - { - Status = MmCreateVirtualMapping(MemoryArea->Process, - Address, - MemoryArea->Attributes, - PhysicalAddress, - FALSE); - MmSetDirtyPage(MemoryArea->Process, Address); - MmInsertRmap(PhysicalAddress, - MemoryArea->Process, - Address); - } - else - { - /* - * For non-private pages if the page wasn't direct mapped then - * set it back into the section segment entry so we don't loose - * our copy. Otherwise it will be handled by the cache manager. - */ - Status = MmCreateVirtualMapping(MemoryArea->Process, - Address, - MemoryArea->Attributes, - PhysicalAddress, - FALSE); - MmSetDirtyPage(MemoryArea->Process, Address); - MmInsertRmap(PhysicalAddress, - MemoryArea->Process, - Address); - Entry = MAKE_SSE(PhysicalAddress.u.LowPart, 1); - MmSetPageEntrySectionSegment(Context.Segment, Context.Offset, Entry); - } - PageOp->Status = STATUS_UNSUCCESSFUL; - MmspCompleteAndReleasePageOp(PageOp); - return(STATUS_PAGEFILE_QUOTA); - } - } + /* + * For private pages restore the old mappings. + */ + if (Context.Private) + { + Status = MmCreateVirtualMapping(MemoryArea->Process, + Address, + MemoryArea->Attributes, + PhysicalAddress, + FALSE); + MmSetDirtyPage(MemoryArea->Process, Address); + MmInsertRmap(PhysicalAddress, + MemoryArea->Process, + Address); + } + else + { + /* + * For non-private pages if the page wasn't direct mapped then + * set it back into the section segment entry so we don't loose + * our copy. Otherwise it will be handled by the cache manager. + */ + Status = MmCreateVirtualMapping(MemoryArea->Process, + Address, + MemoryArea->Attributes, + PhysicalAddress, + FALSE); + MmSetDirtyPage(MemoryArea->Process, Address); + MmInsertRmap(PhysicalAddress, + MemoryArea->Process, + Address); + Entry = MAKE_SSE(PhysicalAddress.u.LowPart, 1); + MmSetPageEntrySectionSegment(Context.Segment, Context.Offset, Entry); + } + PageOp->Status = STATUS_UNSUCCESSFUL; + MmspCompleteAndReleasePageOp(PageOp); + return(STATUS_PAGEFILE_QUOTA); + } + } - /* - * Write the page to the pagefile - */ - Mdl = MmCreateMdl(NULL, NULL, PAGE_SIZE); - MmBuildMdlFromPages(Mdl, (PULONG)&PhysicalAddress); - Status = MmWriteToSwapPage(SwapEntry, Mdl); - if (!NT_SUCCESS(Status)) - { + /* + * Write the page to the pagefile + */ + Mdl = MmCreateMdl(NULL, NULL, PAGE_SIZE); + MmBuildMdlFromPages(Mdl, (PULONG)&PhysicalAddress); + Status = MmWriteToSwapPage(SwapEntry, Mdl); + if (!NT_SUCCESS(Status)) + { DPRINT1("MM: Failed to write to swap page (Status was 0x%.8X)\n", - Status); + Status); /* * As above: undo our actions. * FIXME: Also free the swap page. */ if (Context.Private) - { - Status = MmCreateVirtualMapping(MemoryArea->Process, - Address, - MemoryArea->Attributes, - PhysicalAddress, - FALSE); - MmSetDirtyPage(MemoryArea->Process, Address); - MmInsertRmap(PhysicalAddress, - MemoryArea->Process, - Address); - } + { + Status = MmCreateVirtualMapping(MemoryArea->Process, + Address, + MemoryArea->Attributes, + PhysicalAddress, + FALSE); + MmSetDirtyPage(MemoryArea->Process, Address); + MmInsertRmap(PhysicalAddress, + MemoryArea->Process, + Address); + } else - { - Status = MmCreateVirtualMapping(MemoryArea->Process, - Address, - MemoryArea->Attributes, - PhysicalAddress, - FALSE); - MmSetDirtyPage(MemoryArea->Process, Address); - MmInsertRmap(PhysicalAddress, - MemoryArea->Process, - Address); - Entry = MAKE_SSE(PhysicalAddress.u.LowPart, 1); - MmSetPageEntrySectionSegment(Context.Segment, Context.Offset, Entry); - } + { + Status = MmCreateVirtualMapping(MemoryArea->Process, + Address, + MemoryArea->Attributes, + PhysicalAddress, + FALSE); + MmSetDirtyPage(MemoryArea->Process, Address); + MmInsertRmap(PhysicalAddress, + MemoryArea->Process, + Address); + Entry = MAKE_SSE(PhysicalAddress.u.LowPart, 1); + MmSetPageEntrySectionSegment(Context.Segment, Context.Offset, Entry); + } PageOp->Status = STATUS_UNSUCCESSFUL; MmspCompleteAndReleasePageOp(PageOp); return(STATUS_UNSUCCESSFUL); - } + } - /* - * Otherwise we have succeeded. - */ - DPRINT("MM: Wrote section page 0x%.8X to swap!\n", PhysicalAddress); - MmSetSavedSwapEntryPage(PhysicalAddress, 0); - if (Context.Segment->Flags & MM_PAGEFILE_SEGMENT || - Context.Segment->Characteristics & IMAGE_SECTION_CHAR_SHARED) - { + /* + * Otherwise we have succeeded. + */ + DPRINT("MM: Wrote section page 0x%.8X to swap!\n", PhysicalAddress); + MmSetSavedSwapEntryPage(PhysicalAddress, 0); + if (Context.Segment->Flags & MM_PAGEFILE_SEGMENT || + Context.Segment->Characteristics & IMAGE_SECTION_CHAR_SHARED) + { MmSetPageEntrySectionSegment(Context.Segment, Context.Offset, MAKE_SWAP_SSE(SwapEntry)); - } - else - { + } + else + { MmReleasePageMemoryConsumer(MC_USER, PhysicalAddress); - } + } - if (Context.Private) - { + if (Context.Private) + { Status = MmCreatePageFileMapping(MemoryArea->Process, - Address, - SwapEntry); + Address, + SwapEntry); if (!NT_SUCCESS(Status)) - { - KEBUGCHECK(0); - } - } - else - { + { + KEBUGCHECK(0); + } + } + else + { Entry = MAKE_SWAP_SSE(SwapEntry); MmSetPageEntrySectionSegment(Context.Segment, Context.Offset, Entry); - } + } - PageOp->Status = STATUS_SUCCESS; - MmspCompleteAndReleasePageOp(PageOp); - return(STATUS_SUCCESS); + PageOp->Status = STATUS_SUCCESS; + MmspCompleteAndReleasePageOp(PageOp); + return(STATUS_SUCCESS); } NTSTATUS MmWritePageSectionView(PMADDRESS_SPACE AddressSpace, - PMEMORY_AREA MemoryArea, - PVOID Address, - PMM_PAGEOP PageOp) + PMEMORY_AREA MemoryArea, + PVOID Address, + PMM_PAGEOP PageOp) { - ULONG Offset; - PSECTION_OBJECT Section; - PMM_SECTION_SEGMENT Segment; - PHYSICAL_ADDRESS PhysicalAddress; - SWAPENTRY SwapEntry; - PMDL Mdl; - ULONG Entry; - BOOLEAN Private; - NTSTATUS Status; - PFILE_OBJECT FileObject; - PBCB Bcb = NULL; - BOOLEAN DirectMapped; - BOOLEAN IsImageSection; + ULONG Offset; + PSECTION_OBJECT Section; + PMM_SECTION_SEGMENT Segment; + PHYSICAL_ADDRESS PhysicalAddress; + SWAPENTRY SwapEntry; + PMDL Mdl; + ULONG Entry; + BOOLEAN Private; + NTSTATUS Status; + PFILE_OBJECT FileObject; + PBCB Bcb = NULL; + BOOLEAN DirectMapped; + BOOLEAN IsImageSection; - Address = (PVOID)PAGE_ROUND_DOWN(Address); + Address = (PVOID)PAGE_ROUND_DOWN(Address); - Offset = (ULONG)((char*)Address - (ULONG)MemoryArea->BaseAddress); + Offset = (ULONG)((char*)Address - (ULONG)MemoryArea->BaseAddress); - /* - * Get the segment and section. - */ - Segment = MemoryArea->Data.SectionData.Segment; - Section = MemoryArea->Data.SectionData.Section; - IsImageSection = Section->AllocationAttributes & SEC_IMAGE ? TRUE : FALSE; + /* + * Get the segment and section. + */ + Segment = MemoryArea->Data.SectionData.Segment; + Section = MemoryArea->Data.SectionData.Section; + IsImageSection = Section->AllocationAttributes & SEC_IMAGE ? TRUE : FALSE; - FileObject = Section->FileObject; - DirectMapped = FALSE; - if (FileObject != NULL && - !(Segment->Characteristics & IMAGE_SECTION_CHAR_SHARED)) - { + FileObject = Section->FileObject; + DirectMapped = FALSE; + if (FileObject != NULL && + !(Segment->Characteristics & IMAGE_SECTION_CHAR_SHARED)) + { Bcb = FileObject->SectionObjectPointer->SharedCacheMap; /* @@ -1813,278 +1817,278 @@ MmWritePageSectionView(PMADDRESS_SPACE AddressSpace, * then note this is a direct mapped page. */ if ((Offset + MemoryArea->Data.SectionData.ViewOffset % PAGE_SIZE) == 0 && - (Offset + PAGE_SIZE <= Segment->RawLength || !IsImageSection)) - { - DirectMapped = TRUE; - } - } + (Offset + PAGE_SIZE <= Segment->RawLength || !IsImageSection)) + { + DirectMapped = TRUE; + } + } - /* - * This should never happen since mappings of physical memory are never - * placed in the rmap lists. - */ - if (Section->AllocationAttributes & SEC_PHYSICALMEMORY) - { + /* + * This should never happen since mappings of physical memory are never + * placed in the rmap lists. + */ + if (Section->AllocationAttributes & SEC_PHYSICALMEMORY) + { DPRINT1("Trying to write back page from physical memory mapped at %X " - "process %d\n", Address, - AddressSpace->Process ? AddressSpace->Process->UniqueProcessId : 0); + "process %d\n", Address, + AddressSpace->Process ? AddressSpace->Process->UniqueProcessId : 0); KEBUGCHECK(0); - } + } - /* - * Get the section segment entry and the physical address. - */ - Entry = MmGetPageEntrySectionSegment(Segment, Offset); - if (!MmIsPagePresent(AddressSpace->Process, Address)) - { + /* + * Get the section segment entry and the physical address. + */ + Entry = MmGetPageEntrySectionSegment(Segment, Offset); + if (!MmIsPagePresent(AddressSpace->Process, Address)) + { DPRINT1("Trying to page out not-present page at (%d,0x%.8X).\n", - AddressSpace->Process ? AddressSpace->Process->UniqueProcessId : 0, Address); + AddressSpace->Process ? AddressSpace->Process->UniqueProcessId : 0, Address); KEBUGCHECK(0); - } - PhysicalAddress = - MmGetPhysicalAddressForProcess(AddressSpace->Process, Address); - SwapEntry = MmGetSavedSwapEntryPage(PhysicalAddress); + } + PhysicalAddress = + MmGetPhysicalAddressForProcess(AddressSpace->Process, Address); + SwapEntry = MmGetSavedSwapEntryPage(PhysicalAddress); - /* - * Check for a private (COWed) page. - */ - if (Segment->Characteristics & IMAGE_SECTION_CHAR_BSS || - IS_SWAP_FROM_SSE(Entry) || - (LONGLONG)PAGE_FROM_SSE(Entry) != PhysicalAddress.QuadPart) - { + /* + * Check for a private (COWed) page. + */ + if (Segment->Characteristics & IMAGE_SECTION_CHAR_BSS || + IS_SWAP_FROM_SSE(Entry) || + (LONGLONG)PAGE_FROM_SSE(Entry) != PhysicalAddress.QuadPart) + { Private = TRUE; - } - else - { + } + else + { Private = FALSE; - } + } - /* - * Speculatively set all mappings of the page to clean. - */ - MmSetCleanAllRmaps(PhysicalAddress); + /* + * Speculatively set all mappings of the page to clean. + */ + MmSetCleanAllRmaps(PhysicalAddress); - /* - * If this page was direct mapped from the cache then the cache manager - * will take care of writing it back to disk. - */ - if (DirectMapped && !Private) - { + /* + * If this page was direct mapped from the cache then the cache manager + * will take care of writing it back to disk. + */ + if (DirectMapped && !Private) + { assert(SwapEntry == 0); CcRosMarkDirtyCacheSegment(Bcb, Offset + MemoryArea->Data.SectionData.ViewOffset); PageOp->Status = STATUS_SUCCESS; MmspCompleteAndReleasePageOp(PageOp); return(STATUS_SUCCESS); - } + } - /* - * If necessary, allocate an entry in the paging file for this page - */ - if (SwapEntry == 0) - { + /* + * If necessary, allocate an entry in the paging file for this page + */ + if (SwapEntry == 0) + { SwapEntry = MmAllocSwapPage(); if (SwapEntry == 0) - { - MmSetDirtyAllRmaps(PhysicalAddress); - PageOp->Status = STATUS_UNSUCCESSFUL; - MmspCompleteAndReleasePageOp(PageOp); - return(STATUS_PAGEFILE_QUOTA); - } + { + MmSetDirtyAllRmaps(PhysicalAddress); + PageOp->Status = STATUS_UNSUCCESSFUL; + MmspCompleteAndReleasePageOp(PageOp); + return(STATUS_PAGEFILE_QUOTA); + } MmSetSavedSwapEntryPage(PhysicalAddress, SwapEntry); - } + } - /* - * Write the page to the pagefile - */ - Mdl = MmCreateMdl(NULL, NULL, PAGE_SIZE); - MmBuildMdlFromPages(Mdl, (PULONG)&PhysicalAddress); - Status = MmWriteToSwapPage(SwapEntry, Mdl); - if (!NT_SUCCESS(Status)) - { + /* + * Write the page to the pagefile + */ + Mdl = MmCreateMdl(NULL, NULL, PAGE_SIZE); + MmBuildMdlFromPages(Mdl, (PULONG)&PhysicalAddress); + Status = MmWriteToSwapPage(SwapEntry, Mdl); + if (!NT_SUCCESS(Status)) + { DPRINT1("MM: Failed to write to swap page (Status was 0x%.8X)\n", - Status); + Status); MmSetDirtyAllRmaps(PhysicalAddress); PageOp->Status = STATUS_UNSUCCESSFUL; MmspCompleteAndReleasePageOp(PageOp); return(STATUS_UNSUCCESSFUL); - } + } - /* - * Otherwise we have succeeded. - */ - DPRINT("MM: Wrote section page 0x%.8X to swap!\n", PhysicalAddress); - PageOp->Status = STATUS_SUCCESS; - MmspCompleteAndReleasePageOp(PageOp); - return(STATUS_SUCCESS); + /* + * Otherwise we have succeeded. + */ + DPRINT("MM: Wrote section page 0x%.8X to swap!\n", PhysicalAddress); + PageOp->Status = STATUS_SUCCESS; + MmspCompleteAndReleasePageOp(PageOp); + return(STATUS_SUCCESS); } VOID STATIC MmAlterViewAttributes(PMADDRESS_SPACE AddressSpace, - PVOID BaseAddress, - ULONG RegionSize, - ULONG OldType, - ULONG OldProtect, - ULONG NewType, - ULONG NewProtect) + PVOID BaseAddress, + ULONG RegionSize, + ULONG OldType, + ULONG OldProtect, + ULONG NewType, + ULONG NewProtect) { - PMEMORY_AREA MemoryArea; - PMM_SECTION_SEGMENT Segment; - BOOL DoCOW = FALSE; - ULONG i; + PMEMORY_AREA MemoryArea; + PMM_SECTION_SEGMENT Segment; + BOOL DoCOW = FALSE; + ULONG i; - MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace, BaseAddress); - Segment = MemoryArea->Data.SectionData.Segment; + MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace, BaseAddress); + Segment = MemoryArea->Data.SectionData.Segment; - if ((Segment->WriteCopy || MemoryArea->Data.SectionData.WriteCopyView) && - (NewProtect == PAGE_READWRITE || NewProtect == PAGE_EXECUTE_READWRITE)) - { - DoCOW = TRUE; - } + if ((Segment->WriteCopy || MemoryArea->Data.SectionData.WriteCopyView) && + (NewProtect == PAGE_READWRITE || NewProtect == PAGE_EXECUTE_READWRITE)) + { + DoCOW = TRUE; + } - if (OldProtect != NewProtect) - { + if (OldProtect != NewProtect) + { for (i = 0; i < PAGE_ROUND_UP(RegionSize) / PAGE_SIZE; i++) - { - PVOID Address = (char*)BaseAddress + (i * PAGE_SIZE); - ULONG Protect = NewProtect; + { + PVOID Address = (char*)BaseAddress + (i * PAGE_SIZE); + ULONG Protect = NewProtect; - /* - * If we doing COW for this segment then check if the page is - * already private. - */ - if (DoCOW && MmIsPagePresent(AddressSpace->Process, Address)) - { - ULONG Offset; - ULONG Entry; - LARGE_INTEGER PhysicalAddress; + /* + * If we doing COW for this segment then check if the page is + * already private. + */ + if (DoCOW && MmIsPagePresent(AddressSpace->Process, Address)) + { + ULONG Offset; + ULONG Entry; + LARGE_INTEGER PhysicalAddress; - Offset = (ULONG)Address - (ULONG)MemoryArea->BaseAddress; - Entry = MmGetPageEntrySectionSegment(Segment, Offset); - PhysicalAddress = - MmGetPhysicalAddressForProcess(AddressSpace->Process, Address); + Offset = (ULONG)Address - (ULONG)MemoryArea->BaseAddress; + Entry = MmGetPageEntrySectionSegment(Segment, Offset); + PhysicalAddress = + MmGetPhysicalAddressForProcess(AddressSpace->Process, Address); - Protect = PAGE_READONLY; - if ((Segment->Characteristics & IMAGE_SECTION_CHAR_BSS || - IS_SWAP_FROM_SSE(Entry) || - (LONGLONG)PAGE_FROM_SSE(Entry) != PhysicalAddress.QuadPart)) - { - Protect = NewProtect; - } - } + Protect = PAGE_READONLY; + if ((Segment->Characteristics & IMAGE_SECTION_CHAR_BSS || + IS_SWAP_FROM_SSE(Entry) || + (LONGLONG)PAGE_FROM_SSE(Entry) != PhysicalAddress.QuadPart)) + { + Protect = NewProtect; + } + } - if (MmIsPagePresent(AddressSpace->Process, Address)) - { - MmSetPageProtect(AddressSpace->Process, BaseAddress, - Protect); - } - } - } + if (MmIsPagePresent(AddressSpace->Process, Address)) + { + MmSetPageProtect(AddressSpace->Process, BaseAddress, + Protect); + } + } + } } NTSTATUS MmProtectSectionView(PMADDRESS_SPACE AddressSpace, - PMEMORY_AREA MemoryArea, - PVOID BaseAddress, - ULONG Length, - ULONG Protect, - PULONG OldProtect) + PMEMORY_AREA MemoryArea, + PVOID BaseAddress, + ULONG Length, + ULONG Protect, + PULONG OldProtect) { - PMM_REGION Region; - NTSTATUS Status; + PMM_REGION Region; + NTSTATUS Status; - Length = - min(Length, (ULONG) ((char*)MemoryArea->BaseAddress + MemoryArea->Length - (char*)BaseAddress)); - Region = MmFindRegion(MemoryArea->BaseAddress, - &MemoryArea->Data.SectionData.RegionListHead, - BaseAddress, NULL); - *OldProtect = Region->Protect; - Status = MmAlterRegion(AddressSpace, MemoryArea->BaseAddress, - &MemoryArea->Data.SectionData.RegionListHead, - BaseAddress, Length, Region->Type, Protect, - MmAlterViewAttributes); + Length = + min(Length, (ULONG) ((char*)MemoryArea->BaseAddress + MemoryArea->Length - (char*)BaseAddress)); + Region = MmFindRegion(MemoryArea->BaseAddress, + &MemoryArea->Data.SectionData.RegionListHead, + BaseAddress, NULL); + *OldProtect = Region->Protect; + Status = MmAlterRegion(AddressSpace, MemoryArea->BaseAddress, + &MemoryArea->Data.SectionData.RegionListHead, + BaseAddress, Length, Region->Type, Protect, + MmAlterViewAttributes); - return(Status); + return(Status); } NTSTATUS STDCALL MmQuerySectionView(PMEMORY_AREA MemoryArea, - PVOID Address, - PMEMORY_BASIC_INFORMATION Info, - PULONG ResultLength) + PVOID Address, + PMEMORY_BASIC_INFORMATION Info, + PULONG ResultLength) { - PMM_REGION Region; - PVOID RegionBaseAddress; + PMM_REGION Region; + PVOID RegionBaseAddress; - Region = MmFindRegion(MemoryArea->BaseAddress, - &MemoryArea->Data.SectionData.RegionListHead, - Address, &RegionBaseAddress); - if (Region == NULL) - { + Region = MmFindRegion(MemoryArea->BaseAddress, + &MemoryArea->Data.SectionData.RegionListHead, + Address, &RegionBaseAddress); + if (Region == NULL) + { return STATUS_UNSUCCESSFUL; - } - Info->BaseAddress = (PVOID)PAGE_ROUND_DOWN(Address); - Info->AllocationBase = MemoryArea->BaseAddress; - Info->AllocationProtect = MemoryArea->Attributes; - Info->RegionSize = MemoryArea->Length; - Info->State = MEM_COMMIT; - Info->Protect = Region->Protect; - if (MemoryArea->Data.SectionData.Section->AllocationAttributes & SEC_IMAGE) - { + } + Info->BaseAddress = (PVOID)PAGE_ROUND_DOWN(Address); + Info->AllocationBase = MemoryArea->BaseAddress; + Info->AllocationProtect = MemoryArea->Attributes; + Info->RegionSize = MemoryArea->Length; + Info->State = MEM_COMMIT; + Info->Protect = Region->Protect; + if (MemoryArea->Data.SectionData.Section->AllocationAttributes & SEC_IMAGE) + { Info->Type = MEM_IMAGE; - } - else - { + } + else + { Info->Type = MEM_MAPPED; - } + } - return(STATUS_SUCCESS); + return(STATUS_SUCCESS); } VOID MmpFreePageFileSegment(PMM_SECTION_SEGMENT Segment) { - ULONG Length; - ULONG Offset; - ULONG Entry; - ULONG SavedSwapEntry; - PHYSICAL_ADDRESS Page; + ULONG Length; + ULONG Offset; + ULONG Entry; + ULONG SavedSwapEntry; + PHYSICAL_ADDRESS Page; - Page.u.HighPart = 0; + Page.u.HighPart = 0; - Length = PAGE_ROUND_UP(Segment->Length); - for (Offset = 0; Offset < Length; Offset += PAGE_SIZE) - { + Length = PAGE_ROUND_UP(Segment->Length); + for (Offset = 0; Offset < Length; Offset += PAGE_SIZE) + { Entry = MmGetPageEntrySectionSegment(Segment, Offset); if (Entry) - { - if (IS_SWAP_FROM_SSE(Entry)) + { + if (IS_SWAP_FROM_SSE(Entry)) + { + MmFreeSwapPage(SWAPENTRY_FROM_SSE(Entry)); + } + else + { + Page.u.LowPart = PAGE_FROM_SSE(Entry); + SavedSwapEntry = MmGetSavedSwapEntryPage(Page); + if (SavedSwapEntry != 0) { - MmFreeSwapPage(SWAPENTRY_FROM_SSE(Entry)); + MmSetSavedSwapEntryPage(Page, 0); + MmFreeSwapPage(SavedSwapEntry); } - else - { - Page.u.LowPart = PAGE_FROM_SSE(Entry); - SavedSwapEntry = MmGetSavedSwapEntryPage(Page); - if (SavedSwapEntry != 0) - { - MmSetSavedSwapEntryPage(Page, 0); - MmFreeSwapPage(SavedSwapEntry); - } - MmReleasePageMemoryConsumer(MC_USER, Page); - } - MmSetPageEntrySectionSegment(Segment, Offset, 0); - } - } + MmReleasePageMemoryConsumer(MC_USER, Page); + } + MmSetPageEntrySectionSegment(Segment, Offset, 0); + } + } } - + VOID STDCALL MmpDeleteSection(PVOID ObjectBody) { - PSECTION_OBJECT Section = (PSECTION_OBJECT)ObjectBody; + PSECTION_OBJECT Section = (PSECTION_OBJECT)ObjectBody; - DPRINT("MmpDeleteSection(ObjectBody %x)\n", ObjectBody); - if (Section->AllocationAttributes & SEC_IMAGE) - { + DPRINT("MmpDeleteSection(ObjectBody %x)\n", ObjectBody); + if (Section->AllocationAttributes & SEC_IMAGE) + { ULONG i; ULONG NrSegments; ULONG RefCount; @@ -2094,119 +2098,119 @@ MmpDeleteSection(PVOID ObjectBody) NrSegments = Section->ImageSection->NrSegments; for (i = 0; i < NrSegments; i++) - { - if (SectionSegments[i].Characteristics & IMAGE_SECTION_CHAR_SHARED) - { - MmLockSectionSegment(&SectionSegments[i]); - } - RefCount = InterlockedDecrement((LONG *)&SectionSegments[i].ReferenceCount); - if (SectionSegments[i].Characteristics & IMAGE_SECTION_CHAR_SHARED) - { - if (RefCount == 0) - { - MmpFreePageFileSegment(&SectionSegments[i]); - } - MmUnlockSectionSegment(&SectionSegments[i]); - } - } - } - else - { + { + if (SectionSegments[i].Characteristics & IMAGE_SECTION_CHAR_SHARED) + { + MmLockSectionSegment(&SectionSegments[i]); + } + RefCount = InterlockedDecrement((LONG *)&SectionSegments[i].ReferenceCount); + if (SectionSegments[i].Characteristics & IMAGE_SECTION_CHAR_SHARED) + { + if (RefCount == 0) + { + MmpFreePageFileSegment(&SectionSegments[i]); + } + MmUnlockSectionSegment(&SectionSegments[i]); + } + } + } + else + { if (Section->Segment->Flags & MM_PAGEFILE_SEGMENT) - { - MmpFreePageFileSegment(Section->Segment); - MmFreePageTablesSectionSegment(Section->Segment); - ExFreePool(Section->Segment); - Section->Segment = NULL; - } + { + MmpFreePageFileSegment(Section->Segment); + MmFreePageTablesSectionSegment(Section->Segment); + ExFreePool(Section->Segment); + Section->Segment = NULL; + } else - { - InterlockedDecrement((LONG *)&Section->Segment->ReferenceCount); - } - } - if (Section->FileObject != NULL) - { + { + InterlockedDecrement((LONG *)&Section->Segment->ReferenceCount); + } + } + if (Section->FileObject != NULL) + { CcRosDereferenceCache(Section->FileObject); ObDereferenceObject(Section->FileObject); Section->FileObject = NULL; - } + } } VOID STDCALL MmpCloseSection(PVOID ObjectBody, - ULONG HandleCount) + ULONG HandleCount) { DPRINT("MmpCloseSection(OB %x, HC %d) RC %d\n", - ObjectBody, HandleCount, ObGetObjectPointerCount(ObjectBody)); + ObjectBody, HandleCount, ObGetObjectPointerCount(ObjectBody)); } NTSTATUS STDCALL MmpCreateSection(PVOID ObjectBody, - PVOID Parent, - PWSTR RemainingPath, - POBJECT_ATTRIBUTES ObjectAttributes) + PVOID Parent, + PWSTR RemainingPath, + POBJECT_ATTRIBUTES ObjectAttributes) { DPRINT("MmpCreateSection(ObjectBody %x, Parent %x, RemainingPath %S)\n", - ObjectBody, Parent, RemainingPath); + ObjectBody, Parent, RemainingPath); if (RemainingPath == NULL) - { - return(STATUS_SUCCESS); - } + { + return(STATUS_SUCCESS); + } if (wcschr(RemainingPath+1, L'\\') != NULL) - { - return(STATUS_UNSUCCESSFUL); - } + { + return(STATUS_UNSUCCESSFUL); + } return(STATUS_SUCCESS); } NTSTATUS INIT_FUNCTION MmCreatePhysicalMemorySection(VOID) { - HANDLE PhysSectionH; - PSECTION_OBJECT PhysSection; - NTSTATUS Status; - OBJECT_ATTRIBUTES Obj; - UNICODE_STRING Name = ROS_STRING_INITIALIZER(L"\\Device\\PhysicalMemory"); - LARGE_INTEGER SectionSize; + HANDLE PhysSectionH; + PSECTION_OBJECT PhysSection; + NTSTATUS Status; + OBJECT_ATTRIBUTES Obj; + UNICODE_STRING Name = ROS_STRING_INITIALIZER(L"\\Device\\PhysicalMemory"); + LARGE_INTEGER SectionSize; - /* - * Create the section mapping physical memory - */ - SectionSize.QuadPart = 0xFFFFFFFF; - InitializeObjectAttributes(&Obj, - &Name, - 0, - NULL, - NULL); - Status = NtCreateSection(&PhysSectionH, - SECTION_ALL_ACCESS, - &Obj, - &SectionSize, - PAGE_EXECUTE_READWRITE, - 0, - NULL); - if (!NT_SUCCESS(Status)) - { + /* + * Create the section mapping physical memory + */ + SectionSize.QuadPart = 0xFFFFFFFF; + InitializeObjectAttributes(&Obj, + &Name, + 0, + NULL, + NULL); + Status = NtCreateSection(&PhysSectionH, + SECTION_ALL_ACCESS, + &Obj, + &SectionSize, + PAGE_EXECUTE_READWRITE, + 0, + NULL); + if (!NT_SUCCESS(Status)) + { DbgPrint("Failed to create PhysicalMemory section\n"); KEBUGCHECK(0); - } - Status = ObReferenceObjectByHandle(PhysSectionH, - SECTION_ALL_ACCESS, - NULL, - KernelMode, - (PVOID*)&PhysSection, - NULL); - if (!NT_SUCCESS(Status)) - { + } + Status = ObReferenceObjectByHandle(PhysSectionH, + SECTION_ALL_ACCESS, + NULL, + KernelMode, + (PVOID*)&PhysSection, + NULL); + if (!NT_SUCCESS(Status)) + { DbgPrint("Failed to reference PhysicalMemory section\n"); KEBUGCHECK(0); - } - PhysSection->AllocationAttributes |= SEC_PHYSICALMEMORY; - ObDereferenceObject((PVOID)PhysSection); + } + PhysSection->AllocationAttributes |= SEC_PHYSICALMEMORY; + ObDereferenceObject((PVOID)PhysSection); - return(STATUS_SUCCESS); + return(STATUS_SUCCESS); } NTSTATUS INIT_FUNCTION @@ -2247,241 +2251,241 @@ MmInitSectionImplementation(VOID) NTSTATUS MmCreatePageFileSection(PHANDLE SectionHandle, - ACCESS_MASK DesiredAccess, - POBJECT_ATTRIBUTES ObjectAttributes, - PLARGE_INTEGER UMaximumSize, - ULONG SectionPageProtection, - ULONG AllocationAttributes) - /* - * Create a section which is backed by the pagefile - */ + ACCESS_MASK DesiredAccess, + POBJECT_ATTRIBUTES ObjectAttributes, + PLARGE_INTEGER UMaximumSize, + ULONG SectionPageProtection, + ULONG AllocationAttributes) +/* + * Create a section which is backed by the pagefile + */ { - LARGE_INTEGER MaximumSize; - PSECTION_OBJECT Section; - PMM_SECTION_SEGMENT Segment; - NTSTATUS Status; + LARGE_INTEGER MaximumSize; + PSECTION_OBJECT Section; + PMM_SECTION_SEGMENT Segment; + NTSTATUS Status; - if (UMaximumSize == NULL) - { + if (UMaximumSize == NULL) + { return(STATUS_UNSUCCESSFUL); - } - MaximumSize = *UMaximumSize; + } + MaximumSize = *UMaximumSize; - /* - * Check the protection - */ - if ((SectionPageProtection & PAGE_FLAGS_VALID_FROM_USER_MODE) != - SectionPageProtection) - { + /* + * Check the protection + */ + if ((SectionPageProtection & PAGE_FLAGS_VALID_FROM_USER_MODE) != + SectionPageProtection) + { return(STATUS_INVALID_PAGE_PROTECTION); - } + } - /* - * Create the section - */ - Status = ObCreateObject(ExGetPreviousMode(), - MmSectionObjectType, - ObjectAttributes, - ExGetPreviousMode(), - NULL, - sizeof(SECTION_OBJECT), - 0, - 0, - (PVOID*)&Section); - if (!NT_SUCCESS(Status)) - { + /* + * Create the section + */ + Status = ObCreateObject(ExGetPreviousMode(), + MmSectionObjectType, + ObjectAttributes, + ExGetPreviousMode(), + NULL, + sizeof(SECTION_OBJECT), + 0, + 0, + (PVOID*)&Section); + if (!NT_SUCCESS(Status)) + { return(Status); - } + } - Status = ObInsertObject ((PVOID)Section, - NULL, - DesiredAccess, - 0, - NULL, - SectionHandle); - if (!NT_SUCCESS(Status)) - { + Status = ObInsertObject ((PVOID)Section, + NULL, + DesiredAccess, + 0, + NULL, + SectionHandle); + if (!NT_SUCCESS(Status)) + { ObDereferenceObject(Section); return(Status); - } + } - /* - * Initialize it - */ - Section->SectionPageProtection = SectionPageProtection; - Section->AllocationAttributes = AllocationAttributes; - InitializeListHead(&Section->ViewListHead); - KeInitializeSpinLock(&Section->ViewListLock); - Section->FileObject = NULL; - Section->MaximumSize = MaximumSize; - Segment = ExAllocatePoolWithTag(NonPagedPool, sizeof(MM_SECTION_SEGMENT), - TAG_MM_SECTION_SEGMENT); - if (Segment == NULL) - { + /* + * Initialize it + */ + Section->SectionPageProtection = SectionPageProtection; + Section->AllocationAttributes = AllocationAttributes; + InitializeListHead(&Section->ViewListHead); + KeInitializeSpinLock(&Section->ViewListLock); + Section->FileObject = NULL; + Section->MaximumSize = MaximumSize; + Segment = ExAllocatePoolWithTag(NonPagedPool, sizeof(MM_SECTION_SEGMENT), + TAG_MM_SECTION_SEGMENT); + if (Segment == NULL) + { ZwClose(*SectionHandle); ObDereferenceObject(Section); return(STATUS_NO_MEMORY); - } - Section->Segment = Segment; - Segment->ReferenceCount = 1; - ExInitializeFastMutex(&Segment->Lock); - Segment->FileOffset = 0; - Segment->Protection = SectionPageProtection; - Segment->Attributes = AllocationAttributes; - Segment->RawLength = MaximumSize.u.LowPart; - Segment->Length = PAGE_ROUND_UP(MaximumSize.u.LowPart); - Segment->Flags = MM_PAGEFILE_SEGMENT; - Segment->WriteCopy = FALSE; - RtlZeroMemory(&Segment->PageDirectory, sizeof(SECTION_PAGE_DIRECTORY)); - Segment->VirtualAddress = 0; - Segment->Characteristics = 0; - ObDereferenceObject(Section); - return(STATUS_SUCCESS); + } + Section->Segment = Segment; + Segment->ReferenceCount = 1; + ExInitializeFastMutex(&Segment->Lock); + Segment->FileOffset = 0; + Segment->Protection = SectionPageProtection; + Segment->Attributes = AllocationAttributes; + Segment->RawLength = MaximumSize.u.LowPart; + Segment->Length = PAGE_ROUND_UP(MaximumSize.u.LowPart); + Segment->Flags = MM_PAGEFILE_SEGMENT; + Segment->WriteCopy = FALSE; + RtlZeroMemory(&Segment->PageDirectory, sizeof(SECTION_PAGE_DIRECTORY)); + Segment->VirtualAddress = 0; + Segment->Characteristics = 0; + ObDereferenceObject(Section); + return(STATUS_SUCCESS); } NTSTATUS MmCreateDataFileSection(PHANDLE SectionHandle, - ACCESS_MASK DesiredAccess, - POBJECT_ATTRIBUTES ObjectAttributes, - PLARGE_INTEGER UMaximumSize, - ULONG SectionPageProtection, - ULONG AllocationAttributes, - HANDLE FileHandle) - /* - * Create a section backed by a data file - */ + ACCESS_MASK DesiredAccess, + POBJECT_ATTRIBUTES ObjectAttributes, + PLARGE_INTEGER UMaximumSize, + ULONG SectionPageProtection, + ULONG AllocationAttributes, + HANDLE FileHandle) +/* + * Create a section backed by a data file + */ { - PSECTION_OBJECT Section; - NTSTATUS Status; - LARGE_INTEGER MaximumSize; - PFILE_OBJECT FileObject; - PMM_SECTION_SEGMENT Segment; - ULONG FileAccess; - IO_STATUS_BLOCK Iosb; - LARGE_INTEGER Offset; - CHAR Buffer; + PSECTION_OBJECT Section; + NTSTATUS Status; + LARGE_INTEGER MaximumSize; + PFILE_OBJECT FileObject; + PMM_SECTION_SEGMENT Segment; + ULONG FileAccess; + IO_STATUS_BLOCK Iosb; + LARGE_INTEGER Offset; + CHAR Buffer; - /* - * Check the protection - */ - if ((SectionPageProtection & PAGE_FLAGS_VALID_FROM_USER_MODE) != - SectionPageProtection) - { + /* + * Check the protection + */ + if ((SectionPageProtection & PAGE_FLAGS_VALID_FROM_USER_MODE) != + SectionPageProtection) + { return(STATUS_INVALID_PAGE_PROTECTION); - } - /* - * Create the section - */ - Status = ObCreateObject(ExGetPreviousMode(), - MmSectionObjectType, - ObjectAttributes, - ExGetPreviousMode(), - NULL, - sizeof(SECTION_OBJECT), - 0, - 0, - (PVOID*)&Section); - if (!NT_SUCCESS(Status)) - { + } + /* + * Create the section + */ + Status = ObCreateObject(ExGetPreviousMode(), + MmSectionObjectType, + ObjectAttributes, + ExGetPreviousMode(), + NULL, + sizeof(SECTION_OBJECT), + 0, + 0, + (PVOID*)&Section); + if (!NT_SUCCESS(Status)) + { return(Status); - } + } - Status = ObInsertObject ((PVOID)Section, - NULL, - DesiredAccess, - 0, - NULL, - SectionHandle); - if (!NT_SUCCESS(Status)) - { + Status = ObInsertObject ((PVOID)Section, + NULL, + DesiredAccess, + 0, + NULL, + SectionHandle); + if (!NT_SUCCESS(Status)) + { ObDereferenceObject(Section); return(Status); - } + } - /* - * Initialize it - */ - Section->SectionPageProtection = SectionPageProtection; - Section->AllocationAttributes = AllocationAttributes; - InitializeListHead(&Section->ViewListHead); - KeInitializeSpinLock(&Section->ViewListLock); + /* + * Initialize it + */ + Section->SectionPageProtection = SectionPageProtection; + Section->AllocationAttributes = AllocationAttributes; + InitializeListHead(&Section->ViewListHead); + KeInitializeSpinLock(&Section->ViewListLock); - /* - * Check file access required - */ - if (SectionPageProtection & PAGE_READWRITE || - SectionPageProtection & PAGE_EXECUTE_READWRITE) - { + /* + * Check file access required + */ + if (SectionPageProtection & PAGE_READWRITE || + SectionPageProtection & PAGE_EXECUTE_READWRITE) + { FileAccess = FILE_READ_DATA | FILE_WRITE_DATA; - } - else - { + } + else + { FileAccess = FILE_READ_DATA; - } + } - /* - * Reference the file handle - */ - Status = ObReferenceObjectByHandle(FileHandle, - FileAccess, - IoFileObjectType, - UserMode, - (PVOID*)&FileObject, - NULL); - if (!NT_SUCCESS(Status)) - { + /* + * Reference the file handle + */ + Status = ObReferenceObjectByHandle(FileHandle, + FileAccess, + IoFileObjectType, + UserMode, + (PVOID*)&FileObject, + NULL); + if (!NT_SUCCESS(Status)) + { ZwClose(*SectionHandle); ObDereferenceObject(Section); return(Status); - } + } - /* - * We can't do memory mappings if the file system doesn't support the - * standard FCB - */ - if (!(FileObject->Flags & FO_FCB_IS_VALID)) - { + /* + * We can't do memory mappings if the file system doesn't support the + * standard FCB + */ + if (!(FileObject->Flags & FO_FCB_IS_VALID)) + { ZwClose(*SectionHandle); ObDereferenceObject(Section); ObDereferenceObject(FileObject); return(STATUS_INVALID_FILE_FOR_SECTION); - } + } - /* - * FIXME: Revise this once a locking order for file size changes is - * decided - */ - if (UMaximumSize != NULL) - { + /* + * FIXME: Revise this once a locking order for file size changes is + * decided + */ + if (UMaximumSize != NULL) + { MaximumSize = *UMaximumSize; - } - else - { + } + else + { MaximumSize = - ((PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)->FileSize; - } + ((PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)->FileSize; + } - if (MaximumSize.QuadPart > - ((PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)->FileSize.QuadPart) - { + if (MaximumSize.QuadPart > + ((PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)->FileSize.QuadPart) + { Status = NtSetInformationFile(FileHandle, - &Iosb, - &MaximumSize, - sizeof(LARGE_INTEGER), - FileAllocationInformation); + &Iosb, + &MaximumSize, + sizeof(LARGE_INTEGER), + FileAllocationInformation); if (!NT_SUCCESS(Status)) - { - ZwClose(*SectionHandle); - ObDereferenceObject(Section); - ObDereferenceObject(FileObject); - return(STATUS_SECTION_NOT_EXTENDED); - } - } + { + ZwClose(*SectionHandle); + ObDereferenceObject(Section); + ObDereferenceObject(FileObject); + return(STATUS_SECTION_NOT_EXTENDED); + } + } - if (FileObject->SectionObjectPointer == NULL || - FileObject->SectionObjectPointer->SharedCacheMap == NULL) - { + if (FileObject->SectionObjectPointer == NULL || + FileObject->SectionObjectPointer->SharedCacheMap == NULL) + { /* * Read a bit so caching is initiated for the file object. * This is only needed because MiReadPage currently cannot @@ -2489,60 +2493,60 @@ MmCreateDataFileSection(PHANDLE SectionHandle, */ Offset.QuadPart = 0; Status = ZwReadFile(FileHandle, - NULL, - NULL, - NULL, - &Iosb, - &Buffer, - sizeof (Buffer), - &Offset, - 0); + NULL, + NULL, + NULL, + &Iosb, + &Buffer, + sizeof (Buffer), + &Offset, + 0); if (!NT_SUCCESS(Status) && (Status != STATUS_END_OF_FILE)) - { - ZwClose(*SectionHandle); - ObDereferenceObject(Section); - ObDereferenceObject(FileObject); - return(Status); - } + { + ZwClose(*SectionHandle); + ObDereferenceObject(Section); + ObDereferenceObject(FileObject); + return(Status); + } if (FileObject->SectionObjectPointer == NULL || - FileObject->SectionObjectPointer->SharedCacheMap == NULL) - { - /* FIXME: handle this situation */ - ZwClose(*SectionHandle); - ObDereferenceObject(Section); - ObDereferenceObject(FileObject); - return STATUS_INVALID_PARAMETER; - } - } + FileObject->SectionObjectPointer->SharedCacheMap == NULL) + { + /* FIXME: handle this situation */ + ZwClose(*SectionHandle); + ObDereferenceObject(Section); + ObDereferenceObject(FileObject); + return STATUS_INVALID_PARAMETER; + } + } - /* - * Lock the file - */ - Status = MmspWaitForFileLock(FileObject); - if (Status != STATUS_SUCCESS) - { + /* + * Lock the file + */ + Status = MmspWaitForFileLock(FileObject); + if (Status != STATUS_SUCCESS) + { ZwClose(*SectionHandle); ObDereferenceObject(Section); ObDereferenceObject(FileObject); return(Status); - } + } - /* - * If this file hasn't been mapped as a data file before then allocate a - * section segment to describe the data file mapping - */ - if (FileObject->SectionObjectPointer->DataSectionObject == NULL) - { + /* + * If this file hasn't been mapped as a data file before then allocate a + * section segment to describe the data file mapping + */ + if (FileObject->SectionObjectPointer->DataSectionObject == NULL) + { Segment = ExAllocatePoolWithTag(NonPagedPool, sizeof(MM_SECTION_SEGMENT), - TAG_MM_SECTION_SEGMENT); + TAG_MM_SECTION_SEGMENT); if (Segment == NULL) - { - KeSetEvent((PVOID)&FileObject->Lock, IO_NO_INCREMENT, FALSE); - ZwClose(*SectionHandle); - ObDereferenceObject(Section); - ObDereferenceObject(FileObject); - return(STATUS_NO_MEMORY); - } + { + KeSetEvent((PVOID)&FileObject->Lock, IO_NO_INCREMENT, FALSE); + ZwClose(*SectionHandle); + ObDereferenceObject(Section); + ObDereferenceObject(FileObject); + return(STATUS_NO_MEMORY); + } Section->Segment = Segment; Segment->ReferenceCount = 1; ExInitializeFastMutex(&Segment->Lock); @@ -2559,456 +2563,456 @@ MmCreateDataFileSection(PHANDLE SectionHandle, Segment->Characteristics = 0; Segment->WriteCopy = FALSE; if (AllocationAttributes & SEC_RESERVE) - { - Segment->Length = Segment->RawLength = 0; - } + { + Segment->Length = Segment->RawLength = 0; + } else - { - Segment->RawLength = MaximumSize.u.LowPart; - Segment->Length = PAGE_ROUND_UP(Segment->RawLength); - } + { + Segment->RawLength = MaximumSize.u.LowPart; + Segment->Length = PAGE_ROUND_UP(Segment->RawLength); + } Segment->VirtualAddress = NULL; RtlZeroMemory(&Segment->PageDirectory, sizeof(SECTION_PAGE_DIRECTORY)); - } - else - { + } + else + { /* * If the file is already mapped as a data file then we may need * to extend it */ Segment = - (PMM_SECTION_SEGMENT)FileObject->SectionObjectPointer-> - DataSectionObject; + (PMM_SECTION_SEGMENT)FileObject->SectionObjectPointer-> + DataSectionObject; Section->Segment = Segment; InterlockedIncrement((PLONG)&Segment->ReferenceCount); MmLockSectionSegment(Segment); if (MaximumSize.u.LowPart > Segment->RawLength && - !(AllocationAttributes & SEC_RESERVE)) - { - Segment->RawLength = MaximumSize.u.LowPart; - Segment->Length = PAGE_ROUND_UP(Segment->RawLength); - } - } - MmUnlockSectionSegment(Segment); - Section->FileObject = FileObject; - Section->MaximumSize = MaximumSize; - CcRosReferenceCache(FileObject); - KeSetEvent((PVOID)&FileObject->Lock, IO_NO_INCREMENT, FALSE); - ObDereferenceObject(Section); - return(STATUS_SUCCESS); + !(AllocationAttributes & SEC_RESERVE)) + { + Segment->RawLength = MaximumSize.u.LowPart; + Segment->Length = PAGE_ROUND_UP(Segment->RawLength); + } + } + MmUnlockSectionSegment(Segment); + Section->FileObject = FileObject; + Section->MaximumSize = MaximumSize; + CcRosReferenceCache(FileObject); + KeSetEvent((PVOID)&FileObject->Lock, IO_NO_INCREMENT, FALSE); + ObDereferenceObject(Section); + return(STATUS_SUCCESS); } static ULONG SectionCharacteristicsToProtect[16] = -{ - PAGE_NOACCESS, // 0 = NONE - PAGE_NOACCESS, // 1 = SHARED - PAGE_EXECUTE, // 2 = EXECUTABLE - PAGE_EXECUTE, // 3 = EXECUTABLE, SHARED - PAGE_READONLY, // 4 = READABLE - PAGE_READONLY, // 5 = READABLE, SHARED - PAGE_EXECUTE_READ, // 6 = READABLE, EXECUTABLE - PAGE_EXECUTE_READ, // 7 = READABLE, EXECUTABLE, SHARED - PAGE_READWRITE, // 8 = WRITABLE - PAGE_READWRITE, // 9 = WRITABLE, SHARED - PAGE_EXECUTE_READWRITE, // 10 = WRITABLE, EXECUTABLE - PAGE_EXECUTE_READWRITE, // 11 = WRITABLE, EXECUTABLE, SHARED - PAGE_READWRITE, // 12 = WRITABLE, READABLE - PAGE_READWRITE, // 13 = WRITABLE, READABLE, SHARED - PAGE_EXECUTE_READWRITE, // 14 = WRITABLE, READABLE, EXECUTABLE, - PAGE_EXECUTE_READWRITE, // 15 = WRITABLE, READABLE, EXECUTABLE, SHARED -}; + { + PAGE_NOACCESS, // 0 = NONE + PAGE_NOACCESS, // 1 = SHARED + PAGE_EXECUTE, // 2 = EXECUTABLE + PAGE_EXECUTE, // 3 = EXECUTABLE, SHARED + PAGE_READONLY, // 4 = READABLE + PAGE_READONLY, // 5 = READABLE, SHARED + PAGE_EXECUTE_READ, // 6 = READABLE, EXECUTABLE + PAGE_EXECUTE_READ, // 7 = READABLE, EXECUTABLE, SHARED + PAGE_READWRITE, // 8 = WRITABLE + PAGE_READWRITE, // 9 = WRITABLE, SHARED + PAGE_EXECUTE_READWRITE, // 10 = WRITABLE, EXECUTABLE + PAGE_EXECUTE_READWRITE, // 11 = WRITABLE, EXECUTABLE, SHARED + PAGE_READWRITE, // 12 = WRITABLE, READABLE + PAGE_READWRITE, // 13 = WRITABLE, READABLE, SHARED + PAGE_EXECUTE_READWRITE, // 14 = WRITABLE, READABLE, EXECUTABLE, + PAGE_EXECUTE_READWRITE, // 15 = WRITABLE, READABLE, EXECUTABLE, SHARED + }; NTSTATUS MmCreateImageSection(PHANDLE SectionHandle, - ACCESS_MASK DesiredAccess, - POBJECT_ATTRIBUTES ObjectAttributes, - PLARGE_INTEGER UMaximumSize, - ULONG SectionPageProtection, - ULONG AllocationAttributes, - HANDLE FileHandle) + ACCESS_MASK DesiredAccess, + POBJECT_ATTRIBUTES ObjectAttributes, + PLARGE_INTEGER UMaximumSize, + ULONG SectionPageProtection, + ULONG AllocationAttributes, + HANDLE FileHandle) { - PSECTION_OBJECT Section; - NTSTATUS Status; - PFILE_OBJECT FileObject; - IMAGE_DOS_HEADER DosHeader; - IO_STATUS_BLOCK Iosb; - LARGE_INTEGER Offset; - IMAGE_NT_HEADERS PEHeader; - PMM_SECTION_SEGMENT SectionSegments; - ULONG NrSegments; - PMM_IMAGE_SECTION_OBJECT ImageSectionObject; - ULONG i; - ULONG Size; - ULONG Characteristics; - ULONG FileAccess = 0; - /* - * Check the protection - */ - if ((SectionPageProtection & PAGE_FLAGS_VALID_FROM_USER_MODE) != - SectionPageProtection) - { + PSECTION_OBJECT Section; + NTSTATUS Status; + PFILE_OBJECT FileObject; + IMAGE_DOS_HEADER DosHeader; + IO_STATUS_BLOCK Iosb; + LARGE_INTEGER Offset; + IMAGE_NT_HEADERS PEHeader; + PMM_SECTION_SEGMENT SectionSegments; + ULONG NrSegments; + PMM_IMAGE_SECTION_OBJECT ImageSectionObject; + ULONG i; + ULONG Size; + ULONG Characteristics; + ULONG FileAccess = 0; + /* + * Check the protection + */ + if ((SectionPageProtection & PAGE_FLAGS_VALID_FROM_USER_MODE) != + SectionPageProtection) + { return(STATUS_INVALID_PAGE_PROTECTION); - } + } - /* - * Specifying a maximum size is meaningless for an image section - */ - if (UMaximumSize != NULL) - { + /* + * Specifying a maximum size is meaningless for an image section + */ + if (UMaximumSize != NULL) + { return(STATUS_INVALID_PARAMETER_4); - } + } - /* - * Reference the file handle - */ - Status = ObReferenceObjectByHandle(FileHandle, - FileAccess, - IoFileObjectType, - UserMode, - (PVOID*)&FileObject, - NULL); - if (!NT_SUCCESS(Status)) - { + /* + * Reference the file handle + */ + Status = ObReferenceObjectByHandle(FileHandle, + FileAccess, + IoFileObjectType, + UserMode, + (PVOID*)&FileObject, + NULL); + if (!NT_SUCCESS(Status)) + { return Status; - } + } - /* - * Initialized caching for this file object if previously caching - * was initialized for the same on disk file - */ - Status = CcTryToInitializeFileCache(FileObject); + /* + * Initialized caching for this file object if previously caching + * was initialized for the same on disk file + */ + Status = CcTryToInitializeFileCache(FileObject); - if (!NT_SUCCESS(Status) || FileObject->SectionObjectPointer->ImageSectionObject == NULL) - { + if (!NT_SUCCESS(Status) || FileObject->SectionObjectPointer->ImageSectionObject == NULL) + { PIMAGE_SECTION_HEADER ImageSections; /* * Read the dos header and check the DOS signature */ Offset.QuadPart = 0; Status = ZwReadFile(FileHandle, - NULL, - NULL, - NULL, - &Iosb, - &DosHeader, - sizeof(DosHeader), - &Offset, - NULL); + NULL, + NULL, + NULL, + &Iosb, + &DosHeader, + sizeof(DosHeader), + &Offset, + NULL); if (!NT_SUCCESS(Status)) - { - ObDereferenceObject(FileObject); - return(Status); - } + { + ObDereferenceObject(FileObject); + return(Status); + } /* * Check the DOS signature */ if (Iosb.Information != sizeof(DosHeader) || - DosHeader.e_magic != IMAGE_DOS_SIGNATURE) - { - ObDereferenceObject(FileObject); - return(STATUS_INVALID_IMAGE_FORMAT); - } + DosHeader.e_magic != IMAGE_DOS_SIGNATURE) + { + ObDereferenceObject(FileObject); + return(STATUS_INVALID_IMAGE_FORMAT); + } /* * Read the PE header */ Offset.QuadPart = DosHeader.e_lfanew; Status = ZwReadFile(FileHandle, - NULL, - NULL, - NULL, - &Iosb, - &PEHeader, - sizeof(PEHeader), - &Offset, - NULL); + NULL, + NULL, + NULL, + &Iosb, + &PEHeader, + sizeof(PEHeader), + &Offset, + NULL); if (!NT_SUCCESS(Status)) - { - ObDereferenceObject(FileObject); - return(Status); - } + { + ObDereferenceObject(FileObject); + return(Status); + } /* * Check the signature */ if (Iosb.Information != sizeof(PEHeader) || - PEHeader.Signature != IMAGE_NT_SIGNATURE) - { - ObDereferenceObject(FileObject); - return(STATUS_INVALID_IMAGE_FORMAT); - } + PEHeader.Signature != IMAGE_NT_SIGNATURE) + { + ObDereferenceObject(FileObject); + return(STATUS_INVALID_IMAGE_FORMAT); + } /* * Read in the section headers */ Offset.QuadPart = DosHeader.e_lfanew + sizeof(PEHeader); ImageSections = ExAllocatePool(NonPagedPool, - PEHeader.FileHeader.NumberOfSections * - sizeof(IMAGE_SECTION_HEADER)); + PEHeader.FileHeader.NumberOfSections * + sizeof(IMAGE_SECTION_HEADER)); if (ImageSections == NULL) - { - ObDereferenceObject(FileObject); - return(STATUS_NO_MEMORY); - } + { + ObDereferenceObject(FileObject); + return(STATUS_NO_MEMORY); + } Status = ZwReadFile(FileHandle, - NULL, - NULL, - NULL, - &Iosb, - ImageSections, - PEHeader.FileHeader.NumberOfSections * - sizeof(IMAGE_SECTION_HEADER), - &Offset, - 0); + NULL, + NULL, + NULL, + &Iosb, + ImageSections, + PEHeader.FileHeader.NumberOfSections * + sizeof(IMAGE_SECTION_HEADER), + &Offset, + 0); if (!NT_SUCCESS(Status)) - { - ObDereferenceObject(FileObject); - ExFreePool(ImageSections); - return(Status); - } + { + ObDereferenceObject(FileObject); + ExFreePool(ImageSections); + return(Status); + } if (Iosb.Information != (PEHeader.FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER))) - { - ObDereferenceObject(FileObject); - ExFreePool(ImageSections); - return(STATUS_INVALID_IMAGE_FORMAT); - } + { + ObDereferenceObject(FileObject); + ExFreePool(ImageSections); + return(STATUS_INVALID_IMAGE_FORMAT); + } - /* - * Create the section - */ - Status = ObCreateObject (ExGetPreviousMode(), - MmSectionObjectType, - ObjectAttributes, - ExGetPreviousMode(), - NULL, - sizeof(SECTION_OBJECT), - 0, - 0, - (PVOID*)&Section); - if (!NT_SUCCESS(Status)) - { - ObDereferenceObject(FileObject); - ExFreePool(ImageSections); - return(Status); - } - - Status = ObInsertObject ((PVOID)Section, - NULL, - DesiredAccess, - 0, - NULL, - SectionHandle); - if (!NT_SUCCESS(Status)) - { - ObDereferenceObject(Section); - ObDereferenceObject(FileObject); - ExFreePool(ImageSections); - return(Status); - } - - /* - * Initialize it - */ - Section->SectionPageProtection = SectionPageProtection; - Section->AllocationAttributes = AllocationAttributes; - InitializeListHead(&Section->ViewListHead); - KeInitializeSpinLock(&Section->ViewListLock); - - /* - * Check file access required - */ - if (SectionPageProtection & (PAGE_READWRITE|PAGE_EXECUTE_READWRITE)) - { - FileAccess = FILE_READ_DATA | FILE_WRITE_DATA; - } - else - { - FileAccess = FILE_READ_DATA; - } - - /* - * We can't do memory mappings if the file system doesn't support the - * standard FCB - */ - if (!(FileObject->Flags & FO_FCB_IS_VALID)) - { - ZwClose(*SectionHandle); - ObDereferenceObject(Section); - ObDereferenceObject(FileObject); - ExFreePool(ImageSections); - return(STATUS_INVALID_FILE_FOR_SECTION); - } - - /* - * Lock the file - */ - Status = MmspWaitForFileLock(FileObject); - if (Status != STATUS_SUCCESS) - { - ZwClose(*SectionHandle); - ObDereferenceObject(Section); - ObDereferenceObject(FileObject); - ExFreePool(ImageSections); - return(Status); - } - - /* - * allocate the section segments to describe the mapping - */ - NrSegments = PEHeader.FileHeader.NumberOfSections + 1; - Size = sizeof(MM_IMAGE_SECTION_OBJECT) + sizeof(MM_SECTION_SEGMENT) * NrSegments; - ImageSectionObject = ExAllocatePoolWithTag(NonPagedPool, Size, TAG_MM_SECTION_SEGMENT); - if (ImageSectionObject == NULL) - { - KeSetEvent((PVOID)&FileObject->Lock, IO_NO_INCREMENT, FALSE); - ZwClose(*SectionHandle); - ObDereferenceObject(Section); - ObDereferenceObject(FileObject); - ExFreePool(ImageSections); - return(STATUS_NO_MEMORY); - } - Section->ImageSection = ImageSectionObject; - ImageSectionObject->NrSegments = NrSegments; - ImageSectionObject->ImageBase = (PVOID)PEHeader.OptionalHeader.ImageBase; - ImageSectionObject->EntryPoint = (PVOID)PEHeader.OptionalHeader.AddressOfEntryPoint; - ImageSectionObject->StackReserve = PEHeader.OptionalHeader.SizeOfStackReserve; - ImageSectionObject->StackCommit = PEHeader.OptionalHeader.SizeOfStackCommit; - ImageSectionObject->Subsystem = PEHeader.OptionalHeader.Subsystem; - ImageSectionObject->MinorSubsystemVersion = PEHeader.OptionalHeader.MinorSubsystemVersion; - ImageSectionObject->MajorSubsystemVersion = PEHeader.OptionalHeader.MajorSubsystemVersion; - ImageSectionObject->ImageCharacteristics = PEHeader.FileHeader.Characteristics; - ImageSectionObject->Machine = PEHeader.FileHeader.Machine; - ImageSectionObject->Executable = (PEHeader.OptionalHeader.SizeOfCode != 0); - - SectionSegments = ImageSectionObject->Segments; - SectionSegments[0].FileOffset = 0; - SectionSegments[0].Characteristics = IMAGE_SECTION_CHAR_DATA; - SectionSegments[0].Protection = PAGE_READONLY; - SectionSegments[0].RawLength = PAGE_SIZE; - SectionSegments[0].Length = PAGE_SIZE; - SectionSegments[0].Flags = 0; - SectionSegments[0].ReferenceCount = 1; - SectionSegments[0].VirtualAddress = 0; - SectionSegments[0].WriteCopy = TRUE; - SectionSegments[0].Attributes = 0; - ExInitializeFastMutex(&SectionSegments[0].Lock); - RtlZeroMemory(&SectionSegments[0].PageDirectory, sizeof(SECTION_PAGE_DIRECTORY)); - for (i = 1; i < NrSegments; i++) - { - SectionSegments[i].FileOffset = ImageSections[i-1].PointerToRawData; - SectionSegments[i].Characteristics = ImageSections[i-1].Characteristics; - - /* - * Set up the protection and write copy variables. - */ - Characteristics = ImageSections[i - 1].Characteristics; - if (Characteristics & (IMAGE_SECTION_CHAR_READABLE|IMAGE_SECTION_CHAR_WRITABLE|IMAGE_SECTION_CHAR_EXECUTABLE)) - { - SectionSegments[i].Protection = SectionCharacteristicsToProtect[Characteristics >> 28]; - SectionSegments[i].WriteCopy = !(Characteristics & IMAGE_SECTION_CHAR_SHARED); - } - else if (Characteristics & IMAGE_SECTION_CHAR_CODE) - { - SectionSegments[i].Protection = PAGE_EXECUTE_READ; - SectionSegments[i].WriteCopy = TRUE; - } - else if (Characteristics & IMAGE_SECTION_CHAR_DATA) - { - SectionSegments[i].Protection = PAGE_READWRITE; - SectionSegments[i].WriteCopy = TRUE; - } - else if (Characteristics & IMAGE_SECTION_CHAR_BSS) - { - SectionSegments[i].Protection = PAGE_READWRITE; - SectionSegments[i].WriteCopy = TRUE; - } - else - { - SectionSegments[i].Protection = PAGE_NOACCESS; - SectionSegments[i].WriteCopy = TRUE; - } - - /* - * Set up the attributes. - */ - if (Characteristics & IMAGE_SECTION_CHAR_CODE) - { - SectionSegments[i].Attributes = 0; - } - else if (Characteristics & IMAGE_SECTION_CHAR_DATA) - { - SectionSegments[i].Attributes = 0; - } - else if (Characteristics & IMAGE_SECTION_CHAR_BSS) - { - SectionSegments[i].Attributes = MM_SECTION_SEGMENT_BSS; - } - else - { - SectionSegments[i].Attributes = 0; - } - - SectionSegments[i].RawLength = ImageSections[i-1].SizeOfRawData; - SectionSegments[i].Length = ImageSections[i-1].Misc.VirtualSize; - SectionSegments[i].Flags = 0; - SectionSegments[i].ReferenceCount = 1; - SectionSegments[i].VirtualAddress = (PVOID)ImageSections[i-1].VirtualAddress; - ExInitializeFastMutex(&SectionSegments[i].Lock); - RtlZeroMemory(&SectionSegments[i].PageDirectory, sizeof(SECTION_PAGE_DIRECTORY)); - } - if (0 != InterlockedCompareExchange((PLONG)&FileObject->SectionObjectPointer->ImageSectionObject, - (LONG)ImageSectionObject, 0)) - { - /* - * An other thread has initialized the some image in the background - */ - ExFreePool(ImageSectionObject); - ImageSectionObject = FileObject->SectionObjectPointer->ImageSectionObject; - Section->ImageSection = ImageSectionObject; - SectionSegments = ImageSectionObject->Segments; - - for (i = 0; i < NrSegments; i++) - { - InterlockedIncrement((LONG *)&SectionSegments[i].ReferenceCount); - } - } - ExFreePool(ImageSections); - } - else - { /* * Create the section */ Status = ObCreateObject (ExGetPreviousMode(), - MmSectionObjectType, - ObjectAttributes, - ExGetPreviousMode(), - NULL, - sizeof(SECTION_OBJECT), - 0, - 0, - (PVOID*)&Section); + MmSectionObjectType, + ObjectAttributes, + ExGetPreviousMode(), + NULL, + sizeof(SECTION_OBJECT), + 0, + 0, + (PVOID*)&Section); if (!NT_SUCCESS(Status)) - { - ObDereferenceObject(FileObject); - return(Status); - } + { + ObDereferenceObject(FileObject); + ExFreePool(ImageSections); + return(Status); + } Status = ObInsertObject ((PVOID)Section, - NULL, - DesiredAccess, - 0, - NULL, - SectionHandle); + NULL, + DesiredAccess, + 0, + NULL, + SectionHandle); if (!NT_SUCCESS(Status)) - { - ObDereferenceObject(Section); - ObDereferenceObject(FileObject); - return(Status); - } + { + ObDereferenceObject(Section); + ObDereferenceObject(FileObject); + ExFreePool(ImageSections); + return(Status); + } + + /* + * Initialize it + */ + Section->SectionPageProtection = SectionPageProtection; + Section->AllocationAttributes = AllocationAttributes; + InitializeListHead(&Section->ViewListHead); + KeInitializeSpinLock(&Section->ViewListLock); + + /* + * Check file access required + */ + if (SectionPageProtection & (PAGE_READWRITE|PAGE_EXECUTE_READWRITE)) + { + FileAccess = FILE_READ_DATA | FILE_WRITE_DATA; + } + else + { + FileAccess = FILE_READ_DATA; + } + + /* + * We can't do memory mappings if the file system doesn't support the + * standard FCB + */ + if (!(FileObject->Flags & FO_FCB_IS_VALID)) + { + ZwClose(*SectionHandle); + ObDereferenceObject(Section); + ObDereferenceObject(FileObject); + ExFreePool(ImageSections); + return(STATUS_INVALID_FILE_FOR_SECTION); + } + + /* + * Lock the file + */ + Status = MmspWaitForFileLock(FileObject); + if (Status != STATUS_SUCCESS) + { + ZwClose(*SectionHandle); + ObDereferenceObject(Section); + ObDereferenceObject(FileObject); + ExFreePool(ImageSections); + return(Status); + } + + /* + * allocate the section segments to describe the mapping + */ + NrSegments = PEHeader.FileHeader.NumberOfSections + 1; + Size = sizeof(MM_IMAGE_SECTION_OBJECT) + sizeof(MM_SECTION_SEGMENT) * NrSegments; + ImageSectionObject = ExAllocatePoolWithTag(NonPagedPool, Size, TAG_MM_SECTION_SEGMENT); + if (ImageSectionObject == NULL) + { + KeSetEvent((PVOID)&FileObject->Lock, IO_NO_INCREMENT, FALSE); + ZwClose(*SectionHandle); + ObDereferenceObject(Section); + ObDereferenceObject(FileObject); + ExFreePool(ImageSections); + return(STATUS_NO_MEMORY); + } + Section->ImageSection = ImageSectionObject; + ImageSectionObject->NrSegments = NrSegments; + ImageSectionObject->ImageBase = (PVOID)PEHeader.OptionalHeader.ImageBase; + ImageSectionObject->EntryPoint = (PVOID)PEHeader.OptionalHeader.AddressOfEntryPoint; + ImageSectionObject->StackReserve = PEHeader.OptionalHeader.SizeOfStackReserve; + ImageSectionObject->StackCommit = PEHeader.OptionalHeader.SizeOfStackCommit; + ImageSectionObject->Subsystem = PEHeader.OptionalHeader.Subsystem; + ImageSectionObject->MinorSubsystemVersion = PEHeader.OptionalHeader.MinorSubsystemVersion; + ImageSectionObject->MajorSubsystemVersion = PEHeader.OptionalHeader.MajorSubsystemVersion; + ImageSectionObject->ImageCharacteristics = PEHeader.FileHeader.Characteristics; + ImageSectionObject->Machine = PEHeader.FileHeader.Machine; + ImageSectionObject->Executable = (PEHeader.OptionalHeader.SizeOfCode != 0); + + SectionSegments = ImageSectionObject->Segments; + SectionSegments[0].FileOffset = 0; + SectionSegments[0].Characteristics = IMAGE_SECTION_CHAR_DATA; + SectionSegments[0].Protection = PAGE_READONLY; + SectionSegments[0].RawLength = PAGE_SIZE; + SectionSegments[0].Length = PAGE_SIZE; + SectionSegments[0].Flags = 0; + SectionSegments[0].ReferenceCount = 1; + SectionSegments[0].VirtualAddress = 0; + SectionSegments[0].WriteCopy = TRUE; + SectionSegments[0].Attributes = 0; + ExInitializeFastMutex(&SectionSegments[0].Lock); + RtlZeroMemory(&SectionSegments[0].PageDirectory, sizeof(SECTION_PAGE_DIRECTORY)); + for (i = 1; i < NrSegments; i++) + { + SectionSegments[i].FileOffset = ImageSections[i-1].PointerToRawData; + SectionSegments[i].Characteristics = ImageSections[i-1].Characteristics; + + /* + * Set up the protection and write copy variables. + */ + Characteristics = ImageSections[i - 1].Characteristics; + if (Characteristics & (IMAGE_SECTION_CHAR_READABLE|IMAGE_SECTION_CHAR_WRITABLE|IMAGE_SECTION_CHAR_EXECUTABLE)) + { + SectionSegments[i].Protection = SectionCharacteristicsToProtect[Characteristics >> 28]; + SectionSegments[i].WriteCopy = !(Characteristics & IMAGE_SECTION_CHAR_SHARED); + } + else if (Characteristics & IMAGE_SECTION_CHAR_CODE) + { + SectionSegments[i].Protection = PAGE_EXECUTE_READ; + SectionSegments[i].WriteCopy = TRUE; + } + else if (Characteristics & IMAGE_SECTION_CHAR_DATA) + { + SectionSegments[i].Protection = PAGE_READWRITE; + SectionSegments[i].WriteCopy = TRUE; + } + else if (Characteristics & IMAGE_SECTION_CHAR_BSS) + { + SectionSegments[i].Protection = PAGE_READWRITE; + SectionSegments[i].WriteCopy = TRUE; + } + else + { + SectionSegments[i].Protection = PAGE_NOACCESS; + SectionSegments[i].WriteCopy = TRUE; + } + + /* + * Set up the attributes. + */ + if (Characteristics & IMAGE_SECTION_CHAR_CODE) + { + SectionSegments[i].Attributes = 0; + } + else if (Characteristics & IMAGE_SECTION_CHAR_DATA) + { + SectionSegments[i].Attributes = 0; + } + else if (Characteristics & IMAGE_SECTION_CHAR_BSS) + { + SectionSegments[i].Attributes = MM_SECTION_SEGMENT_BSS; + } + else + { + SectionSegments[i].Attributes = 0; + } + + SectionSegments[i].RawLength = ImageSections[i-1].SizeOfRawData; + SectionSegments[i].Length = ImageSections[i-1].Misc.VirtualSize; + SectionSegments[i].Flags = 0; + SectionSegments[i].ReferenceCount = 1; + SectionSegments[i].VirtualAddress = (PVOID)ImageSections[i-1].VirtualAddress; + ExInitializeFastMutex(&SectionSegments[i].Lock); + RtlZeroMemory(&SectionSegments[i].PageDirectory, sizeof(SECTION_PAGE_DIRECTORY)); + } + if (0 != InterlockedCompareExchange((PLONG)&FileObject->SectionObjectPointer->ImageSectionObject, + (LONG)ImageSectionObject, 0)) + { + /* + * An other thread has initialized the some image in the background + */ + ExFreePool(ImageSectionObject); + ImageSectionObject = FileObject->SectionObjectPointer->ImageSectionObject; + Section->ImageSection = ImageSectionObject; + SectionSegments = ImageSectionObject->Segments; + + for (i = 0; i < NrSegments; i++) + { + InterlockedIncrement((LONG *)&SectionSegments[i].ReferenceCount); + } + } + ExFreePool(ImageSections); + } + else + { + /* + * Create the section + */ + Status = ObCreateObject (ExGetPreviousMode(), + MmSectionObjectType, + ObjectAttributes, + ExGetPreviousMode(), + NULL, + sizeof(SECTION_OBJECT), + 0, + 0, + (PVOID*)&Section); + if (!NT_SUCCESS(Status)) + { + ObDereferenceObject(FileObject); + return(Status); + } + + Status = ObInsertObject ((PVOID)Section, + NULL, + DesiredAccess, + 0, + NULL, + SectionHandle); + if (!NT_SUCCESS(Status)) + { + ObDereferenceObject(Section); + ObDereferenceObject(FileObject); + return(Status); + } /* * Initialize it @@ -3022,25 +3026,25 @@ MmCreateImageSection(PHANDLE SectionHandle, * Check file access required */ if (SectionPageProtection & (PAGE_READWRITE|PAGE_EXECUTE_READWRITE)) - { - FileAccess = FILE_READ_DATA | FILE_WRITE_DATA; - } + { + FileAccess = FILE_READ_DATA | FILE_WRITE_DATA; + } else - { - FileAccess = FILE_READ_DATA; - } + { + FileAccess = FILE_READ_DATA; + } /* * Lock the file */ Status = MmspWaitForFileLock(FileObject); if (Status != STATUS_SUCCESS) - { - ZwClose(*SectionHandle); - ObDereferenceObject(Section); - ObDereferenceObject(FileObject); - return(Status); - } + { + ZwClose(*SectionHandle); + ObDereferenceObject(Section); + ObDereferenceObject(FileObject); + return(Status); + } ImageSectionObject = FileObject->SectionObjectPointer->ImageSectionObject; Section->ImageSection = ImageSectionObject; @@ -3051,16 +3055,16 @@ MmCreateImageSection(PHANDLE SectionHandle, * Otherwise just reference all the section segments */ for (i = 0; i < NrSegments; i++) - { - InterlockedIncrement((LONG *)&SectionSegments[i].ReferenceCount); - } + { + InterlockedIncrement((LONG *)&SectionSegments[i].ReferenceCount); + } - } - Section->FileObject = FileObject; - CcRosReferenceCache(FileObject); - KeSetEvent((PVOID)&FileObject->Lock, IO_NO_INCREMENT, FALSE); - ObDereferenceObject(Section); - return(STATUS_SUCCESS); + } + Section->FileObject = FileObject; + CcRosReferenceCache(FileObject); + KeSetEvent((PVOID)&FileObject->Lock, IO_NO_INCREMENT, FALSE); + ObDereferenceObject(Section); + return(STATUS_SUCCESS); } /* @@ -3068,196 +3072,196 @@ MmCreateImageSection(PHANDLE SectionHandle, */ NTSTATUS STDCALL NtCreateSection (OUT PHANDLE SectionHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN PLARGE_INTEGER MaximumSize OPTIONAL, - IN ULONG SectionPageProtection OPTIONAL, - IN ULONG AllocationAttributes, - IN HANDLE FileHandle OPTIONAL) + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN PLARGE_INTEGER MaximumSize OPTIONAL, + IN ULONG SectionPageProtection OPTIONAL, + IN ULONG AllocationAttributes, + IN HANDLE FileHandle OPTIONAL) { - if (AllocationAttributes & SEC_IMAGE) - { + if (AllocationAttributes & SEC_IMAGE) + { return(MmCreateImageSection(SectionHandle, - DesiredAccess, - ObjectAttributes, - MaximumSize, - SectionPageProtection, - AllocationAttributes, - FileHandle)); - } + DesiredAccess, + ObjectAttributes, + MaximumSize, + SectionPageProtection, + AllocationAttributes, + FileHandle)); + } - if (FileHandle != NULL) - { + if (FileHandle != NULL) + { return(MmCreateDataFileSection(SectionHandle, - DesiredAccess, - ObjectAttributes, - MaximumSize, - SectionPageProtection, - AllocationAttributes, - FileHandle)); - } + DesiredAccess, + ObjectAttributes, + MaximumSize, + SectionPageProtection, + AllocationAttributes, + FileHandle)); + } - return(MmCreatePageFileSection(SectionHandle, - DesiredAccess, - ObjectAttributes, - MaximumSize, - SectionPageProtection, - AllocationAttributes)); + return(MmCreatePageFileSection(SectionHandle, + DesiredAccess, + ObjectAttributes, + MaximumSize, + SectionPageProtection, + AllocationAttributes)); } /********************************************************************** * NAME - * NtOpenSection + * NtOpenSection * * DESCRIPTION * * ARGUMENTS - * SectionHandle + * SectionHandle * - * DesiredAccess + * DesiredAccess * - * ObjectAttributes + * ObjectAttributes * * RETURN VALUE * * REVISIONS */ NTSTATUS STDCALL -NtOpenSection(PHANDLE SectionHandle, - ACCESS_MASK DesiredAccess, - POBJECT_ATTRIBUTES ObjectAttributes) +NtOpenSection(PHANDLE SectionHandle, + ACCESS_MASK DesiredAccess, + POBJECT_ATTRIBUTES ObjectAttributes) { - NTSTATUS Status; + NTSTATUS Status; - *SectionHandle = 0; + *SectionHandle = 0; - Status = ObOpenObjectByName(ObjectAttributes, - MmSectionObjectType, - NULL, - UserMode, - DesiredAccess, - NULL, - SectionHandle); + Status = ObOpenObjectByName(ObjectAttributes, + MmSectionObjectType, + NULL, + UserMode, + DesiredAccess, + NULL, + SectionHandle); - return(Status); + return(Status); } NTSTATUS STATIC MmMapViewOfSegment(PEPROCESS Process, - PMADDRESS_SPACE AddressSpace, - PSECTION_OBJECT Section, - PMM_SECTION_SEGMENT Segment, - PVOID* BaseAddress, - ULONG ViewSize, - ULONG Protect, - ULONG ViewOffset, - BOOL TopDown) + PMADDRESS_SPACE AddressSpace, + PSECTION_OBJECT Section, + PMM_SECTION_SEGMENT Segment, + PVOID* BaseAddress, + ULONG ViewSize, + ULONG Protect, + ULONG ViewOffset, + BOOL TopDown) { - PMEMORY_AREA MArea; - NTSTATUS Status; - KIRQL oldIrql; - PHYSICAL_ADDRESS BoundaryAddressMultiple; + PMEMORY_AREA MArea; + NTSTATUS Status; + KIRQL oldIrql; + PHYSICAL_ADDRESS BoundaryAddressMultiple; - BoundaryAddressMultiple.QuadPart = 0; + BoundaryAddressMultiple.QuadPart = 0; - Status = MmCreateMemoryArea(Process, - AddressSpace, - MEMORY_AREA_SECTION_VIEW, - BaseAddress, - ViewSize, - Protect, - &MArea, - FALSE, - TopDown, - BoundaryAddressMultiple); - if (!NT_SUCCESS(Status)) - { + Status = MmCreateMemoryArea(Process, + AddressSpace, + MEMORY_AREA_SECTION_VIEW, + BaseAddress, + ViewSize, + Protect, + &MArea, + FALSE, + TopDown, + BoundaryAddressMultiple); + if (!NT_SUCCESS(Status)) + { DPRINT1("Mapping between 0x%.8X and 0x%.8X failed.\n", - (*BaseAddress), (char*)(*BaseAddress) + ViewSize); + (*BaseAddress), (char*)(*BaseAddress) + ViewSize); return(Status); - } + } - KeAcquireSpinLock(&Section->ViewListLock, &oldIrql); - InsertTailList(&Section->ViewListHead, - &MArea->Data.SectionData.ViewListEntry); - KeReleaseSpinLock(&Section->ViewListLock, oldIrql); + KeAcquireSpinLock(&Section->ViewListLock, &oldIrql); + InsertTailList(&Section->ViewListHead, + &MArea->Data.SectionData.ViewListEntry); + KeReleaseSpinLock(&Section->ViewListLock, oldIrql); - ObReferenceObjectByPointer((PVOID)Section, - SECTION_MAP_READ, - NULL, - ExGetPreviousMode()); - MArea->Data.SectionData.Segment = Segment; - MArea->Data.SectionData.Section = Section; - MArea->Data.SectionData.ViewOffset = ViewOffset; - MArea->Data.SectionData.WriteCopyView = FALSE; - MmInitialiseRegion(&MArea->Data.SectionData.RegionListHead, - ViewSize, 0, Protect); + ObReferenceObjectByPointer((PVOID)Section, + SECTION_MAP_READ, + NULL, + ExGetPreviousMode()); + MArea->Data.SectionData.Segment = Segment; + MArea->Data.SectionData.Section = Section; + MArea->Data.SectionData.ViewOffset = ViewOffset; + MArea->Data.SectionData.WriteCopyView = FALSE; + MmInitialiseRegion(&MArea->Data.SectionData.RegionListHead, + ViewSize, 0, Protect); - return(STATUS_SUCCESS); + return(STATUS_SUCCESS); } /********************************************************************** - * NAME EXPORTED - * NtMapViewOfSection + * NAME EXPORTED + * NtMapViewOfSection * * DESCRIPTION - * Maps a view of a section into the virtual address space of a - * process. + * Maps a view of a section into the virtual address space of a + * process. * * ARGUMENTS - * SectionHandle - * Handle of the section. + * SectionHandle + * Handle of the section. * - * ProcessHandle - * Handle of the process. + * ProcessHandle + * Handle of the process. * - * BaseAddress - * Desired base address (or NULL) on entry; - * Actual base address of the view on exit. + * BaseAddress + * Desired base address (or NULL) on entry; + * Actual base address of the view on exit. * - * ZeroBits - * Number of high order address bits that must be zero. + * ZeroBits + * Number of high order address bits that must be zero. * - * CommitSize - * Size in bytes of the initially committed section of - * the view. + * CommitSize + * Size in bytes of the initially committed section of + * the view. * - * SectionOffset - * Offset in bytes from the beginning of the section - * to the beginning of the view. + * SectionOffset + * Offset in bytes from the beginning of the section + * to the beginning of the view. * - * ViewSize - * Desired length of map (or zero to map all) on entry - * Actual length mapped on exit. + * ViewSize + * Desired length of map (or zero to map all) on entry + * Actual length mapped on exit. * - * InheritDisposition - * Specified how the view is to be shared with - * child processes. + * InheritDisposition + * Specified how the view is to be shared with + * child processes. * - * AllocateType - * Type of allocation for the pages. + * AllocateType + * Type of allocation for the pages. * - * Protect - * Protection for the committed region of the view. + * Protect + * Protection for the committed region of the view. * * RETURN VALUE - * Status. + * Status. * * @implemented */ NTSTATUS STDCALL NtMapViewOfSection(HANDLE SectionHandle, - HANDLE ProcessHandle, - PVOID* BaseAddress, - ULONG ZeroBits, - ULONG CommitSize, - PLARGE_INTEGER SectionOffset, - PULONG ViewSize, - SECTION_INHERIT InheritDisposition, - ULONG AllocationType, - ULONG Protect) + HANDLE ProcessHandle, + PVOID* BaseAddress, + ULONG ZeroBits, + ULONG CommitSize, + PLARGE_INTEGER SectionOffset, + PULONG ViewSize, + SECTION_INHERIT InheritDisposition, + ULONG AllocationType, + ULONG Protect) { PSECTION_OBJECT Section; PEPROCESS Process; @@ -3265,41 +3269,41 @@ NtMapViewOfSection(HANDLE SectionHandle, PMADDRESS_SPACE AddressSpace; Status = ObReferenceObjectByHandle(ProcessHandle, - PROCESS_VM_OPERATION, - PsProcessType, - UserMode, - (PVOID*)&Process, - NULL); + PROCESS_VM_OPERATION, + PsProcessType, + UserMode, + (PVOID*)&Process, + NULL); if (!NT_SUCCESS(Status)) - { - return(Status); - } + { + return(Status); + } AddressSpace = &Process->AddressSpace; Status = ObReferenceObjectByHandle(SectionHandle, - SECTION_MAP_READ, - MmSectionObjectType, - UserMode, - (PVOID*)&Section, - NULL); + SECTION_MAP_READ, + MmSectionObjectType, + UserMode, + (PVOID*)&Section, + NULL); if (!(NT_SUCCESS(Status))) - { - DPRINT("ObReference failed rc=%x\n",Status); - ObDereferenceObject(Process); - return(Status); - } + { + DPRINT("ObReference failed rc=%x\n",Status); + ObDereferenceObject(Process); + return(Status); + } Status = MmMapViewOfSection(Section, - Process, - BaseAddress, - ZeroBits, - CommitSize, - SectionOffset, - ViewSize, - InheritDisposition, - AllocationType, - Protect); + Process, + BaseAddress, + ZeroBits, + CommitSize, + SectionOffset, + ViewSize, + InheritDisposition, + AllocationType, + Protect); ObDereferenceObject(Section); ObDereferenceObject(Process); @@ -3309,115 +3313,115 @@ NtMapViewOfSection(HANDLE SectionHandle, VOID STATIC MmFreeSectionPage(PVOID Context, MEMORY_AREA* MemoryArea, PVOID Address, - PHYSICAL_ADDRESS PhysAddr, SWAPENTRY SwapEntry, - BOOLEAN Dirty) + PHYSICAL_ADDRESS PhysAddr, SWAPENTRY SwapEntry, + BOOLEAN Dirty) { - PMEMORY_AREA MArea; - ULONG Entry; - PFILE_OBJECT FileObject; - PBCB Bcb; - ULONG Offset; - SWAPENTRY SavedSwapEntry; - PMM_PAGEOP PageOp; - NTSTATUS Status; - PSECTION_OBJECT Section; - PMM_SECTION_SEGMENT Segment; + PMEMORY_AREA MArea; + ULONG Entry; + PFILE_OBJECT FileObject; + PBCB Bcb; + ULONG Offset; + SWAPENTRY SavedSwapEntry; + PMM_PAGEOP PageOp; + NTSTATUS Status; + PSECTION_OBJECT Section; + PMM_SECTION_SEGMENT Segment; - MArea = (PMEMORY_AREA)Context; + MArea = (PMEMORY_AREA)Context; - Address = (PVOID)PAGE_ROUND_DOWN(Address); + Address = (PVOID)PAGE_ROUND_DOWN(Address); - Offset = ((ULONG)Address - (ULONG)MArea->BaseAddress); + Offset = ((ULONG)Address - (ULONG)MArea->BaseAddress); - Section = MArea->Data.SectionData.Section; - Segment = MArea->Data.SectionData.Segment; + Section = MArea->Data.SectionData.Section; + Segment = MArea->Data.SectionData.Segment; - PageOp = MmCheckForPageOp(MArea, 0, NULL, Segment, Offset); + PageOp = MmCheckForPageOp(MArea, 0, NULL, Segment, Offset); - while (PageOp) - { - MmUnlockSectionSegment(Segment); - MmUnlockAddressSpace(&MArea->Process->AddressSpace); + while (PageOp) + { + MmUnlockSectionSegment(Segment); + MmUnlockAddressSpace(&MArea->Process->AddressSpace); - Status = MmspWaitForPageOpCompletionEvent(PageOp); - if (Status != STATUS_SUCCESS) - { + Status = MmspWaitForPageOpCompletionEvent(PageOp); + if (Status != STATUS_SUCCESS) + { DPRINT1("Failed to wait for page op, status = %x\n", Status); - KEBUGCHECK(0); - } + KEBUGCHECK(0); + } - MmLockAddressSpace(&MArea->Process->AddressSpace); - MmLockSectionSegment(Segment); - MmspCompleteAndReleasePageOp(PageOp); - PageOp = MmCheckForPageOp(MArea, 0, NULL, Segment, Offset); - } + MmLockAddressSpace(&MArea->Process->AddressSpace); + MmLockSectionSegment(Segment); + MmspCompleteAndReleasePageOp(PageOp); + PageOp = MmCheckForPageOp(MArea, 0, NULL, Segment, Offset); + } - Entry = MmGetPageEntrySectionSegment(Segment, Offset); + Entry = MmGetPageEntrySectionSegment(Segment, Offset); - /* - * For a dirty, datafile, non-private page mark it as dirty in the - * cache manager. - */ - if (Segment->Flags & MM_DATAFILE_SEGMENT) - { + /* + * For a dirty, datafile, non-private page mark it as dirty in the + * cache manager. + */ + if (Segment->Flags & MM_DATAFILE_SEGMENT) + { if (PhysAddr.QuadPart == PAGE_FROM_SSE(Entry) && Dirty) - { - FileObject = MemoryArea->Data.SectionData.Section->FileObject; - Bcb = FileObject->SectionObjectPointer->SharedCacheMap; - CcRosMarkDirtyCacheSegment(Bcb, Offset); - assert(SwapEntry == 0); - } - } + { + FileObject = MemoryArea->Data.SectionData.Section->FileObject; + Bcb = FileObject->SectionObjectPointer->SharedCacheMap; + CcRosMarkDirtyCacheSegment(Bcb, Offset); + assert(SwapEntry == 0); + } + } - if (SwapEntry != 0) - { + if (SwapEntry != 0) + { /* * Sanity check */ if (Segment->Flags & MM_PAGEFILE_SEGMENT) - { - DPRINT1("Found a swap entry for a page in a pagefile section.\n"); - KEBUGCHECK(0); - } + { + DPRINT1("Found a swap entry for a page in a pagefile section.\n"); + KEBUGCHECK(0); + } MmFreeSwapPage(SwapEntry); - } - else if (PhysAddr.QuadPart != 0) - { + } + else if (PhysAddr.QuadPart != 0) + { if (IS_SWAP_FROM_SSE(Entry) || - PhysAddr.QuadPart != (PAGE_FROM_SSE(Entry))) - { - /* - * Sanity check - */ - if (Segment->Flags & MM_PAGEFILE_SEGMENT) - { - DPRINT1("Found a private page in a pagefile section.\n"); - KEBUGCHECK(0); - } - /* - * Just dereference private pages - */ - SavedSwapEntry = MmGetSavedSwapEntryPage(PhysAddr); - if (SavedSwapEntry != 0) - { - MmFreeSwapPage(SavedSwapEntry); - MmSetSavedSwapEntryPage(PhysAddr, 0); - } - MmDeleteRmap(PhysAddr, MArea->Process, Address); - MmReleasePageMemoryConsumer(MC_USER, PhysAddr); - } + PhysAddr.QuadPart != (PAGE_FROM_SSE(Entry))) + { + /* + * Sanity check + */ + if (Segment->Flags & MM_PAGEFILE_SEGMENT) + { + DPRINT1("Found a private page in a pagefile section.\n"); + KEBUGCHECK(0); + } + /* + * Just dereference private pages + */ + SavedSwapEntry = MmGetSavedSwapEntryPage(PhysAddr); + if (SavedSwapEntry != 0) + { + MmFreeSwapPage(SavedSwapEntry); + MmSetSavedSwapEntryPage(PhysAddr, 0); + } + MmDeleteRmap(PhysAddr, MArea->Process, Address); + MmReleasePageMemoryConsumer(MC_USER, PhysAddr); + } else - { - MmDeleteRmap(PhysAddr, MArea->Process, Address); - MmUnsharePageEntrySectionSegment(Section, Segment, Offset, Dirty, FALSE); - } - } + { + MmDeleteRmap(PhysAddr, MArea->Process, Address); + MmUnsharePageEntrySectionSegment(Section, Segment, Offset, Dirty, FALSE); + } + } } NTSTATUS MmUnmapViewOfSegment(PMADDRESS_SPACE AddressSpace, - PVOID BaseAddress) + PVOID BaseAddress) { NTSTATUS Status; PMEMORY_AREA MemoryArea; @@ -3429,11 +3433,11 @@ MmUnmapViewOfSegment(PMADDRESS_SPACE AddressSpace, PLIST_ENTRY RegionListHead; MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace, - BaseAddress); + BaseAddress); if (MemoryArea == NULL) - { - return(STATUS_UNSUCCESSFUL); - } + { + return(STATUS_UNSUCCESSFUL); + } MemoryArea->DeleteInProgress = TRUE; Section = MemoryArea->Data.SectionData.Section; @@ -3446,28 +3450,28 @@ MmUnmapViewOfSegment(PMADDRESS_SPACE AddressSpace, RegionListHead = &MemoryArea->Data.SectionData.RegionListHead; while (!IsListEmpty(RegionListHead)) - { - CurrentEntry = RemoveHeadList(RegionListHead); - CurrentRegion = CONTAINING_RECORD(CurrentEntry, MM_REGION, RegionListEntry); - ExFreePool(CurrentRegion); - } + { + CurrentEntry = RemoveHeadList(RegionListHead); + CurrentRegion = CONTAINING_RECORD(CurrentEntry, MM_REGION, RegionListEntry); + ExFreePool(CurrentRegion); + } if (Section->AllocationAttributes & SEC_PHYSICALMEMORY) - { - Status = MmFreeMemoryArea(AddressSpace, - BaseAddress, - 0, - NULL, - NULL); - } + { + Status = MmFreeMemoryArea(AddressSpace, + BaseAddress, + 0, + NULL, + NULL); + } else - { - Status = MmFreeMemoryArea(AddressSpace, - BaseAddress, - 0, - MmFreeSectionPage, - MemoryArea); - } + { + Status = MmFreeMemoryArea(AddressSpace, + BaseAddress, + 0, + MmFreeSectionPage, + MemoryArea); + } MmUnlockSectionSegment(Segment); ObDereferenceObject(Section); return(STATUS_SUCCESS); @@ -3478,116 +3482,116 @@ MmUnmapViewOfSegment(PMADDRESS_SPACE AddressSpace, */ NTSTATUS STDCALL MmUnmapViewOfSection(PEPROCESS Process, - PVOID BaseAddress) + PVOID BaseAddress) { - NTSTATUS Status; + NTSTATUS Status; PMEMORY_AREA MemoryArea; PMADDRESS_SPACE AddressSpace; PSECTION_OBJECT Section; DPRINT("Opening memory area Process %x BaseAddress %x\n", - Process, BaseAddress); + Process, BaseAddress); assert(Process); AddressSpace = &Process->AddressSpace; MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace, - BaseAddress); + BaseAddress); if (MemoryArea == NULL) - { - return(STATUS_UNSUCCESSFUL); - } + { + return(STATUS_UNSUCCESSFUL); + } Section = MemoryArea->Data.SectionData.Section; if (Section->AllocationAttributes & SEC_IMAGE) - { - ULONG i; - ULONG NrSegments; - PMM_IMAGE_SECTION_OBJECT ImageSectionObject; - PMM_SECTION_SEGMENT SectionSegments; - PVOID ImageBaseAddress = 0; - PMM_SECTION_SEGMENT Segment; + { + ULONG i; + ULONG NrSegments; + PMM_IMAGE_SECTION_OBJECT ImageSectionObject; + PMM_SECTION_SEGMENT SectionSegments; + PVOID ImageBaseAddress = 0; + PMM_SECTION_SEGMENT Segment; - Segment = MemoryArea->Data.SectionData.Segment; - ImageSectionObject = Section->ImageSection; - SectionSegments = ImageSectionObject->Segments; - NrSegments = ImageSectionObject->NrSegments; + Segment = MemoryArea->Data.SectionData.Segment; + ImageSectionObject = Section->ImageSection; + SectionSegments = ImageSectionObject->Segments; + NrSegments = ImageSectionObject->NrSegments; - /* Search for the current segment within the section segments - * and calculate the image base address */ - for (i = 0; i < NrSegments; i++) + /* Search for the current segment within the section segments + * and calculate the image base address */ + for (i = 0; i < NrSegments; i++) + { + if (!(SectionSegments[i].Characteristics & IMAGE_SECTION_NOLOAD)) { - if (!(SectionSegments[i].Characteristics & IMAGE_SECTION_NOLOAD)) - { - if (Segment == &SectionSegments[i]) - { - ImageBaseAddress = (char*)BaseAddress - (ULONG_PTR)SectionSegments[i].VirtualAddress; - break; - } - } - } - if (i >= NrSegments) + if (Segment == &SectionSegments[i]) + { + ImageBaseAddress = (char*)BaseAddress - (ULONG_PTR)SectionSegments[i].VirtualAddress; + break; + } + } + } + if (i >= NrSegments) + { + KEBUGCHECK(0); + } + + for (i = 0; i < NrSegments; i++) + { + if (!(SectionSegments[i].Characteristics & IMAGE_SECTION_NOLOAD)) { - KEBUGCHECK(0); - } + PVOID SBaseAddress = (PVOID) + ((char*)ImageBaseAddress + (ULONG_PTR)SectionSegments[i].VirtualAddress); - for (i = 0; i < NrSegments; i++) - { - if (!(SectionSegments[i].Characteristics & IMAGE_SECTION_NOLOAD)) - { - PVOID SBaseAddress = (PVOID) - ((char*)ImageBaseAddress + (ULONG_PTR)SectionSegments[i].VirtualAddress); - - Status = MmUnmapViewOfSegment(AddressSpace, SBaseAddress); - } - } - } + Status = MmUnmapViewOfSegment(AddressSpace, SBaseAddress); + } + } + } else - { - Status = MmUnmapViewOfSegment(AddressSpace, BaseAddress); - } + { + Status = MmUnmapViewOfSegment(AddressSpace, BaseAddress); + } return(STATUS_SUCCESS); } /********************************************************************** - * NAME EXPORTED - * NtUnmapViewOfSection + * NAME EXPORTED + * NtUnmapViewOfSection * * DESCRIPTION * * ARGUMENTS - * ProcessHandle + * ProcessHandle * - * BaseAddress + * BaseAddress * * RETURN VALUE - * Status. + * Status. * * REVISIONS */ NTSTATUS STDCALL -NtUnmapViewOfSection (HANDLE ProcessHandle, - PVOID BaseAddress) +NtUnmapViewOfSection (HANDLE ProcessHandle, + PVOID BaseAddress) { - PEPROCESS Process; + PEPROCESS Process; NTSTATUS Status; DPRINT("NtUnmapViewOfSection(ProcessHandle %x, BaseAddress %x)\n", - ProcessHandle, BaseAddress); + ProcessHandle, BaseAddress); DPRINT("Referencing process\n"); Status = ObReferenceObjectByHandle(ProcessHandle, - PROCESS_VM_OPERATION, - PsProcessType, - UserMode, - (PVOID*)&Process, - NULL); + PROCESS_VM_OPERATION, + PsProcessType, + UserMode, + (PVOID*)&Process, + NULL); if (!NT_SUCCESS(Status)) - { - DPRINT("ObReferenceObjectByHandle failed (Status %x)\n", Status); - return(Status); - } + { + DPRINT("ObReferenceObjectByHandle failed (Status %x)\n", Status); + return(Status); + } MmLockAddressSpace(&Process->AddressSpace); Status = MmUnmapViewOfSection(Process, BaseAddress); @@ -3600,16 +3604,16 @@ NtUnmapViewOfSection (HANDLE ProcessHandle, NTSTATUS STDCALL -NtQuerySection (IN HANDLE SectionHandle, - IN CINT SectionInformationClass, - OUT PVOID SectionInformation, - IN ULONG Length, - OUT PULONG ResultLength) +NtQuerySection (IN HANDLE SectionHandle, + IN CINT SectionInformationClass, + OUT PVOID SectionInformation, + IN ULONG Length, + OUT PULONG ResultLength) /* * FUNCTION: Queries the information of a section object. * ARGUMENTS: * SectionHandle = Handle to the section link object - * SectionInformationClass = Index to a certain information structure + * SectionInformationClass = Index to a certain information structure * SectionInformation (OUT)= Caller supplies storage for resulting * information * Length = Size of the supplied storage @@ -3618,87 +3622,87 @@ NtQuerySection (IN HANDLE SectionHandle, * */ { - PSECTION_OBJECT Section; - NTSTATUS Status; + PSECTION_OBJECT Section; + NTSTATUS Status; - Status = ObReferenceObjectByHandle(SectionHandle, - SECTION_MAP_READ, - MmSectionObjectType, - UserMode, - (PVOID*)&Section, - NULL); - if (!(NT_SUCCESS(Status))) - { + Status = ObReferenceObjectByHandle(SectionHandle, + SECTION_MAP_READ, + MmSectionObjectType, + UserMode, + (PVOID*)&Section, + NULL); + if (!(NT_SUCCESS(Status))) + { return(Status); - } + } - switch (SectionInformationClass) - { - case SectionBasicInformation: - { - PSECTION_BASIC_INFORMATION Sbi; + switch (SectionInformationClass) + { + case SectionBasicInformation: + { + PSECTION_BASIC_INFORMATION Sbi; - if (Length != sizeof(SECTION_BASIC_INFORMATION)) - { - ObDereferenceObject(Section); - return(STATUS_INFO_LENGTH_MISMATCH); - } + if (Length != sizeof(SECTION_BASIC_INFORMATION)) + { + ObDereferenceObject(Section); + return(STATUS_INFO_LENGTH_MISMATCH); + } - Sbi = (PSECTION_BASIC_INFORMATION)SectionInformation; + Sbi = (PSECTION_BASIC_INFORMATION)SectionInformation; - Sbi->BaseAddress = 0; - Sbi->Attributes = 0; - Sbi->Size.QuadPart = 0; + Sbi->BaseAddress = 0; + Sbi->Attributes = 0; + Sbi->Size.QuadPart = 0; - *ResultLength = sizeof(SECTION_BASIC_INFORMATION); - Status = STATUS_SUCCESS; - break; - } + *ResultLength = sizeof(SECTION_BASIC_INFORMATION); + Status = STATUS_SUCCESS; + break; + } case SectionImageInformation: - { - PSECTION_IMAGE_INFORMATION Sii; + { + PSECTION_IMAGE_INFORMATION Sii; - if (Length != sizeof(SECTION_IMAGE_INFORMATION)) - { - ObDereferenceObject(Section); - return(STATUS_INFO_LENGTH_MISMATCH); - } + if (Length != sizeof(SECTION_IMAGE_INFORMATION)) + { + ObDereferenceObject(Section); + return(STATUS_INFO_LENGTH_MISMATCH); + } - Sii = (PSECTION_IMAGE_INFORMATION)SectionInformation; - memset(Sii, 0, sizeof(SECTION_IMAGE_INFORMATION)); - if (Section->AllocationAttributes & SEC_IMAGE) - { - PMM_IMAGE_SECTION_OBJECT ImageSectionObject; - ImageSectionObject = Section->ImageSection; + Sii = (PSECTION_IMAGE_INFORMATION)SectionInformation; + memset(Sii, 0, sizeof(SECTION_IMAGE_INFORMATION)); + if (Section->AllocationAttributes & SEC_IMAGE) + { + PMM_IMAGE_SECTION_OBJECT ImageSectionObject; + ImageSectionObject = Section->ImageSection; - Sii->EntryPoint = ImageSectionObject->EntryPoint; - Sii->StackReserve = ImageSectionObject->StackReserve; - Sii->StackCommit = ImageSectionObject->StackCommit; - Sii->Subsystem = ImageSectionObject->Subsystem; - Sii->MinorSubsystemVersion = (USHORT)ImageSectionObject->MinorSubsystemVersion; - Sii->MajorSubsystemVersion = (USHORT)ImageSectionObject->MajorSubsystemVersion; - Sii->Characteristics = ImageSectionObject->ImageCharacteristics; - Sii->ImageNumber = ImageSectionObject->Machine; - Sii->Executable = ImageSectionObject->Executable; - } - *ResultLength = sizeof(SECTION_IMAGE_INFORMATION); - Status = STATUS_SUCCESS; - break; - } + Sii->EntryPoint = ImageSectionObject->EntryPoint; + Sii->StackReserve = ImageSectionObject->StackReserve; + Sii->StackCommit = ImageSectionObject->StackCommit; + Sii->Subsystem = ImageSectionObject->Subsystem; + Sii->MinorSubsystemVersion = (USHORT)ImageSectionObject->MinorSubsystemVersion; + Sii->MajorSubsystemVersion = (USHORT)ImageSectionObject->MajorSubsystemVersion; + Sii->Characteristics = ImageSectionObject->ImageCharacteristics; + Sii->ImageNumber = ImageSectionObject->Machine; + Sii->Executable = ImageSectionObject->Executable; + } + *ResultLength = sizeof(SECTION_IMAGE_INFORMATION); + Status = STATUS_SUCCESS; + break; + } - default: - *ResultLength = 0; - Status = STATUS_INVALID_INFO_CLASS; - } - ObDereferenceObject(Section); - return(Status); + default: + *ResultLength = 0; + Status = STATUS_INVALID_INFO_CLASS; + } + ObDereferenceObject(Section); + return(Status); } NTSTATUS STDCALL -NtExtendSection(IN HANDLE SectionHandle, - IN ULONG NewMaximumSize) +NtExtendSection(IN HANDLE SectionHandle, + IN ULONG NewMaximumSize) { UNIMPLEMENTED; return(STATUS_NOT_IMPLEMENTED); @@ -3706,18 +3710,18 @@ NtExtendSection(IN HANDLE SectionHandle, /********************************************************************** - * NAME INTERNAL - * MmAllocateSection@4 + * NAME INTERNAL + * MmAllocateSection@4 * * DESCRIPTION * * ARGUMENTS - * Length + * Length * * RETURN VALUE * * NOTE - * Code taken from ntoskrnl/mm/special.c. + * Code taken from ntoskrnl/mm/special.c. * * REVISIONS */ @@ -3739,107 +3743,107 @@ MmAllocateSection (IN ULONG Length) Result = NULL; MmLockAddressSpace(AddressSpace); Status = MmCreateMemoryArea (NULL, - AddressSpace, - MEMORY_AREA_SYSTEM, - &Result, - Length, - 0, - &marea, - FALSE, - FALSE, - BoundaryAddressMultiple); + AddressSpace, + MEMORY_AREA_SYSTEM, + &Result, + Length, + 0, + &marea, + FALSE, + FALSE, + BoundaryAddressMultiple); MmUnlockAddressSpace(AddressSpace); if (!NT_SUCCESS(Status)) - { - return (NULL); - } + { + return (NULL); + } DPRINT("Result %p\n",Result); for (i = 0; i < PAGE_ROUND_UP(Length) / PAGE_SIZE; i++) - { - PHYSICAL_ADDRESS Page; + { + PHYSICAL_ADDRESS Page; - Status = MmRequestPageMemoryConsumer(MC_NPPOOL, TRUE, &Page); - if (!NT_SUCCESS(Status)) - { - DbgPrint("Unable to allocate page\n"); - KEBUGCHECK(0); - } - Status = MmCreateVirtualMapping (NULL, - ((char*)Result + (i * PAGE_SIZE)), - PAGE_READWRITE, - Page, - TRUE); - if (!NT_SUCCESS(Status)) - { - DbgPrint("Unable to create virtual mapping\n"); - KEBUGCHECK(0); - } - } + Status = MmRequestPageMemoryConsumer(MC_NPPOOL, TRUE, &Page); + if (!NT_SUCCESS(Status)) + { + DbgPrint("Unable to allocate page\n"); + KEBUGCHECK(0); + } + Status = MmCreateVirtualMapping (NULL, + ((char*)Result + (i * PAGE_SIZE)), + PAGE_READWRITE, + Page, + TRUE); + if (!NT_SUCCESS(Status)) + { + DbgPrint("Unable to create virtual mapping\n"); + KEBUGCHECK(0); + } + } return ((PVOID)Result); } /********************************************************************** - * NAME EXPORTED - * MmMapViewOfSection + * NAME EXPORTED + * MmMapViewOfSection * * DESCRIPTION - * Maps a view of a section into the virtual address space of a - * process. + * Maps a view of a section into the virtual address space of a + * process. * * ARGUMENTS - * Section - * Pointer to the section object. + * Section + * Pointer to the section object. * - * ProcessHandle - * Pointer to the process. + * ProcessHandle + * Pointer to the process. * - * BaseAddress - * Desired base address (or NULL) on entry; - * Actual base address of the view on exit. + * BaseAddress + * Desired base address (or NULL) on entry; + * Actual base address of the view on exit. * - * ZeroBits - * Number of high order address bits that must be zero. + * ZeroBits + * Number of high order address bits that must be zero. * - * CommitSize - * Size in bytes of the initially committed section of - * the view. + * CommitSize + * Size in bytes of the initially committed section of + * the view. * - * SectionOffset - * Offset in bytes from the beginning of the section - * to the beginning of the view. + * SectionOffset + * Offset in bytes from the beginning of the section + * to the beginning of the view. * - * ViewSize - * Desired length of map (or zero to map all) on entry - * Actual length mapped on exit. + * ViewSize + * Desired length of map (or zero to map all) on entry + * Actual length mapped on exit. * - * InheritDisposition - * Specified how the view is to be shared with - * child processes. + * InheritDisposition + * Specified how the view is to be shared with + * child processes. * - * AllocationType - * Type of allocation for the pages. + * AllocationType + * Type of allocation for the pages. * - * Protect - * Protection for the committed region of the view. + * Protect + * Protection for the committed region of the view. * * RETURN VALUE - * Status. + * Status. * * @implemented */ NTSTATUS STDCALL MmMapViewOfSection(IN PVOID SectionObject, - IN PEPROCESS Process, - IN OUT PVOID *BaseAddress, - IN ULONG ZeroBits, - IN ULONG CommitSize, - IN OUT PLARGE_INTEGER SectionOffset OPTIONAL, - IN OUT PULONG ViewSize, - IN SECTION_INHERIT InheritDisposition, - IN ULONG AllocationType, - IN ULONG Protect) + IN PEPROCESS Process, + IN OUT PVOID *BaseAddress, + IN ULONG ZeroBits, + IN ULONG CommitSize, + IN OUT PLARGE_INTEGER SectionOffset OPTIONAL, + IN OUT PULONG ViewSize, + IN SECTION_INHERIT InheritDisposition, + IN ULONG AllocationType, + IN ULONG Protect) { PSECTION_OBJECT Section; PMADDRESS_SPACE AddressSpace; @@ -3854,133 +3858,133 @@ MmMapViewOfSection(IN PVOID SectionObject, MmLockAddressSpace(AddressSpace); if (Section->AllocationAttributes & SEC_IMAGE) - { - ULONG i; - ULONG NrSegments; - PVOID ImageBase; - ULONG ImageSize; - PMM_IMAGE_SECTION_OBJECT ImageSectionObject; - PMM_SECTION_SEGMENT SectionSegments; + { + ULONG i; + ULONG NrSegments; + PVOID ImageBase; + ULONG ImageSize; + PMM_IMAGE_SECTION_OBJECT ImageSectionObject; + PMM_SECTION_SEGMENT SectionSegments; - ImageSectionObject = Section->ImageSection; - SectionSegments = ImageSectionObject->Segments; - NrSegments = ImageSectionObject->NrSegments; + ImageSectionObject = Section->ImageSection; + SectionSegments = ImageSectionObject->Segments; + NrSegments = ImageSectionObject->NrSegments; - ImageBase = *BaseAddress; - if (ImageBase == NULL) - { - ImageBase = ImageSectionObject->ImageBase; - } + ImageBase = *BaseAddress; + if (ImageBase == NULL) + { + ImageBase = ImageSectionObject->ImageBase; + } - ImageSize = 0; - for (i = 0; i < NrSegments; i++) - { - if (!(SectionSegments[i].Characteristics & IMAGE_SECTION_NOLOAD)) - { - ULONG MaxExtent; - MaxExtent = (ULONG)((char*)SectionSegments[i].VirtualAddress + - SectionSegments[i].Length); - ImageSize = max(ImageSize, MaxExtent); - } - } + ImageSize = 0; + for (i = 0; i < NrSegments; i++) + { + if (!(SectionSegments[i].Characteristics & IMAGE_SECTION_NOLOAD)) + { + ULONG MaxExtent; + MaxExtent = (ULONG)((char*)SectionSegments[i].VirtualAddress + + SectionSegments[i].Length); + ImageSize = max(ImageSize, MaxExtent); + } + } - /* Check there is enough space to map the section at that point. */ - if (MmOpenMemoryAreaByRegion(AddressSpace, ImageBase, - PAGE_ROUND_UP(ImageSize)) != NULL) - { - /* Fail if the user requested a fixed base address. */ - if ((*BaseAddress) != NULL) - { - MmUnlockAddressSpace(AddressSpace); - return(STATUS_UNSUCCESSFUL); - } - /* Otherwise find a gap to map the image. */ - ImageBase = MmFindGap(AddressSpace, PAGE_ROUND_UP(ImageSize), FALSE); - if (ImageBase == NULL) - { - MmUnlockAddressSpace(AddressSpace); - return(STATUS_UNSUCCESSFUL); - } - } + /* Check there is enough space to map the section at that point. */ + if (MmOpenMemoryAreaByRegion(AddressSpace, ImageBase, + PAGE_ROUND_UP(ImageSize)) != NULL) + { + /* Fail if the user requested a fixed base address. */ + if ((*BaseAddress) != NULL) + { + MmUnlockAddressSpace(AddressSpace); + return(STATUS_UNSUCCESSFUL); + } + /* Otherwise find a gap to map the image. */ + ImageBase = MmFindGap(AddressSpace, PAGE_ROUND_UP(ImageSize), FALSE); + if (ImageBase == NULL) + { + MmUnlockAddressSpace(AddressSpace); + return(STATUS_UNSUCCESSFUL); + } + } - for (i = 0; i < NrSegments; i++) - { - if (!(SectionSegments[i].Characteristics & IMAGE_SECTION_NOLOAD)) - { - PVOID SBaseAddress = (PVOID) - ((char*)ImageBase + (ULONG_PTR)SectionSegments[i].VirtualAddress); - MmLockSectionSegment(&SectionSegments[i]); - Status = MmMapViewOfSegment(Process, - AddressSpace, - Section, - &SectionSegments[i], - &SBaseAddress, - SectionSegments[i].Length, - SectionSegments[i].Protection, - (ULONG_PTR)SectionSegments[i].VirtualAddress, - FALSE); - MmUnlockSectionSegment(&SectionSegments[i]); - if (!NT_SUCCESS(Status)) - { - MmUnlockAddressSpace(AddressSpace); - return(Status); - } - } - } + for (i = 0; i < NrSegments; i++) + { + if (!(SectionSegments[i].Characteristics & IMAGE_SECTION_NOLOAD)) + { + PVOID SBaseAddress = (PVOID) + ((char*)ImageBase + (ULONG_PTR)SectionSegments[i].VirtualAddress); + MmLockSectionSegment(&SectionSegments[i]); + Status = MmMapViewOfSegment(Process, + AddressSpace, + Section, + &SectionSegments[i], + &SBaseAddress, + SectionSegments[i].Length, + SectionSegments[i].Protection, + (ULONG_PTR)SectionSegments[i].VirtualAddress, + FALSE); + MmUnlockSectionSegment(&SectionSegments[i]); + if (!NT_SUCCESS(Status)) + { + MmUnlockAddressSpace(AddressSpace); + return(Status); + } + } + } - *BaseAddress = ImageBase; - } + *BaseAddress = ImageBase; + } else - { - if (ViewSize == NULL) - { - /* Following this pointer would lead to us to the dark side */ - /* What to do? Bugcheck? Return status? Do the mambo? */ - KEBUGCHECK(MEMORY_MANAGEMENT); - } + { + if (ViewSize == NULL) + { + /* Following this pointer would lead to us to the dark side */ + /* What to do? Bugcheck? Return status? Do the mambo? */ + KEBUGCHECK(MEMORY_MANAGEMENT); + } - if (SectionOffset == NULL) - { - ViewOffset = 0; - } - else - { - ViewOffset = SectionOffset->u.LowPart; - } + if (SectionOffset == NULL) + { + ViewOffset = 0; + } + else + { + ViewOffset = SectionOffset->u.LowPart; + } - if ((ViewOffset % PAGE_SIZE) != 0) - { - MmUnlockAddressSpace(AddressSpace); - return(STATUS_MAPPED_ALIGNMENT); - } + if ((ViewOffset % PAGE_SIZE) != 0) + { + MmUnlockAddressSpace(AddressSpace); + return(STATUS_MAPPED_ALIGNMENT); + } - if ((*ViewSize) == 0) - { - (*ViewSize) = Section->MaximumSize.u.LowPart - ViewOffset; - } - else if (((*ViewSize)+ViewOffset) > Section->MaximumSize.u.LowPart) - { - (*ViewSize) = Section->MaximumSize.u.LowPart - ViewOffset; - } + if ((*ViewSize) == 0) + { + (*ViewSize) = Section->MaximumSize.u.LowPart - ViewOffset; + } + else if (((*ViewSize)+ViewOffset) > Section->MaximumSize.u.LowPart) + { + (*ViewSize) = Section->MaximumSize.u.LowPart - ViewOffset; + } - MmLockSectionSegment(Section->Segment); - Status = MmMapViewOfSegment(Process, - AddressSpace, - Section, - Section->Segment, - BaseAddress, - *ViewSize, - Protect, - ViewOffset, - (AllocationType & MEM_TOP_DOWN)); - MmUnlockSectionSegment(Section->Segment); - if (!NT_SUCCESS(Status)) - { - MmUnlockAddressSpace(AddressSpace); - return(Status); - } - } + MmLockSectionSegment(Section->Segment); + Status = MmMapViewOfSegment(Process, + AddressSpace, + Section, + Section->Segment, + BaseAddress, + *ViewSize, + Protect, + ViewOffset, + (AllocationType & MEM_TOP_DOWN)); + MmUnlockSectionSegment(Section->Segment); + if (!NT_SUCCESS(Status)) + { + MmUnlockAddressSpace(AddressSpace); + return(Status); + } + } MmUnlockAddressSpace(AddressSpace); @@ -3991,11 +3995,11 @@ MmMapViewOfSection(IN PVOID SectionObject, * @unimplemented */ BOOLEAN STDCALL -MmCanFileBeTruncated (IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN PLARGE_INTEGER NewFileSize) +MmCanFileBeTruncated (IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN PLARGE_INTEGER NewFileSize) { - UNIMPLEMENTED; - return (FALSE); + UNIMPLEMENTED; + return (FALSE); } @@ -4003,31 +4007,31 @@ MmCanFileBeTruncated (IN PSECTION_OBJECT_POINTERS SectionObjectPointer, * @unimplemented */ BOOLEAN STDCALL -MmDisableModifiedWriteOfSection (DWORD Unknown0) +MmDisableModifiedWriteOfSection (DWORD Unknown0) { - UNIMPLEMENTED; - return (FALSE); + UNIMPLEMENTED; + return (FALSE); } /* * @implemented */ BOOLEAN STDCALL -MmFlushImageSection (IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN MMFLUSH_TYPE FlushType) +MmFlushImageSection (IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN MMFLUSH_TYPE FlushType) { switch(FlushType) { case MmFlushForDelete: if (SectionObjectPointer->ImageSectionObject || - SectionObjectPointer->DataSectionObject) - { + SectionObjectPointer->DataSectionObject) + { return FALSE; - } - CcRosSetRemoveOnClose(SectionObjectPointer); + } + CcRosSetRemoveOnClose(SectionObjectPointer); return TRUE; case MmFlushForWrite: - break; + break; } return FALSE; } @@ -4036,11 +4040,11 @@ MmFlushImageSection (IN PSECTION_OBJECT_POINTERS SectionObjectPointer, * @unimplemented */ BOOLEAN STDCALL -MmForceSectionClosed (DWORD Unknown0, - DWORD Unknown1) +MmForceSectionClosed (DWORD Unknown0, + DWORD Unknown1) { - UNIMPLEMENTED; - return (FALSE); + UNIMPLEMENTED; + return (FALSE); } @@ -4048,48 +4052,48 @@ MmForceSectionClosed (DWORD Unknown0, * @implemented */ NTSTATUS STDCALL -MmMapViewInSystemSpace (IN PVOID SectionObject, - OUT PVOID * MappedBase, - IN OUT PULONG ViewSize) +MmMapViewInSystemSpace (IN PVOID SectionObject, + OUT PVOID * MappedBase, + IN OUT PULONG ViewSize) { - PSECTION_OBJECT Section; - PMADDRESS_SPACE AddressSpace; - NTSTATUS Status; + PSECTION_OBJECT Section; + PMADDRESS_SPACE AddressSpace; + NTSTATUS Status; - DPRINT("MmMapViewInSystemSpace() called\n"); + DPRINT("MmMapViewInSystemSpace() called\n"); - Section = (PSECTION_OBJECT)SectionObject; - AddressSpace = MmGetKernelAddressSpace(); + Section = (PSECTION_OBJECT)SectionObject; + AddressSpace = MmGetKernelAddressSpace(); - MmLockAddressSpace(AddressSpace); + MmLockAddressSpace(AddressSpace); - if ((*ViewSize) == 0) - { + if ((*ViewSize) == 0) + { (*ViewSize) = Section->MaximumSize.u.LowPart; - } - else if ((*ViewSize) > Section->MaximumSize.u.LowPart) - { + } + else if ((*ViewSize) > Section->MaximumSize.u.LowPart) + { (*ViewSize) = Section->MaximumSize.u.LowPart; - } + } - MmLockSectionSegment(Section->Segment); + MmLockSectionSegment(Section->Segment); - Status = MmMapViewOfSegment(NULL, - AddressSpace, - Section, - Section->Segment, - MappedBase, - *ViewSize, - PAGE_READWRITE, - 0, - FALSE); + Status = MmMapViewOfSegment(NULL, + AddressSpace, + Section, + Section->Segment, + MappedBase, + *ViewSize, + PAGE_READWRITE, + 0, + FALSE); - MmUnlockSectionSegment(Section->Segment); - MmUnlockAddressSpace(AddressSpace); + MmUnlockSectionSegment(Section->Segment); + MmUnlockAddressSpace(AddressSpace); - return Status; + return Status; } @@ -4097,18 +4101,18 @@ MmMapViewInSystemSpace (IN PVOID SectionObject, * @implemented */ NTSTATUS STDCALL -MmUnmapViewInSystemSpace (IN PVOID MappedBase) +MmUnmapViewInSystemSpace (IN PVOID MappedBase) { - PMADDRESS_SPACE AddressSpace; - NTSTATUS Status; + PMADDRESS_SPACE AddressSpace; + NTSTATUS Status; - DPRINT("MmUnmapViewInSystemSpace() called\n"); + DPRINT("MmUnmapViewInSystemSpace() called\n"); - AddressSpace = MmGetKernelAddressSpace(); + AddressSpace = MmGetKernelAddressSpace(); - Status = MmUnmapViewOfSegment(AddressSpace, MappedBase); + Status = MmUnmapViewOfSegment(AddressSpace, MappedBase); - return Status; + return Status; } @@ -4116,84 +4120,84 @@ MmUnmapViewInSystemSpace (IN PVOID MappedBase) * @unimplemented */ NTSTATUS STDCALL -MmSetBankedSection (DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2, - DWORD Unknown3, - DWORD Unknown4, - DWORD Unknown5) +MmSetBankedSection (DWORD Unknown0, + DWORD Unknown1, + DWORD Unknown2, + DWORD Unknown3, + DWORD Unknown4, + DWORD Unknown5) { - UNIMPLEMENTED; - return (STATUS_NOT_IMPLEMENTED); + UNIMPLEMENTED; + return (STATUS_NOT_IMPLEMENTED); } /********************************************************************** - * NAME EXPORTED - * MmCreateSection@ + * NAME EXPORTED + * MmCreateSection@ * * DESCRIPTION - * Creates a section object. + * Creates a section object. * * ARGUMENTS - * SectionObjiect (OUT) - * Caller supplied storage for the resulting pointer - * to a SECTION_OBJECT instance; + * SectionObjiect (OUT) + * Caller supplied storage for the resulting pointer + * to a SECTION_OBJECT instance; * - * DesiredAccess - * Specifies the desired access to the section can be a - * combination of: - * STANDARD_RIGHTS_REQUIRED | - * SECTION_QUERY | - * SECTION_MAP_WRITE | - * SECTION_MAP_READ | - * SECTION_MAP_EXECUTE + * DesiredAccess + * Specifies the desired access to the section can be a + * combination of: + * STANDARD_RIGHTS_REQUIRED | + * SECTION_QUERY | + * SECTION_MAP_WRITE | + * SECTION_MAP_READ | + * SECTION_MAP_EXECUTE * - * ObjectAttributes [OPTIONAL] - * Initialized attributes for the object can be used - * to create a named section; + * ObjectAttributes [OPTIONAL] + * Initialized attributes for the object can be used + * to create a named section; * - * MaximumSize - * Maximizes the size of the memory section. Must be - * non-NULL for a page-file backed section. - * If value specified for a mapped file and the file is - * not large enough, file will be extended. + * MaximumSize + * Maximizes the size of the memory section. Must be + * non-NULL for a page-file backed section. + * If value specified for a mapped file and the file is + * not large enough, file will be extended. * - * SectionPageProtection - * Can be a combination of: - * PAGE_READONLY | - * PAGE_READWRITE | - * PAGE_WRITEONLY | - * PAGE_WRITECOPY + * SectionPageProtection + * Can be a combination of: + * PAGE_READONLY | + * PAGE_READWRITE | + * PAGE_WRITEONLY | + * PAGE_WRITECOPY * - * AllocationAttributes - * Can be a combination of: - * SEC_IMAGE | - * SEC_RESERVE + * AllocationAttributes + * Can be a combination of: + * SEC_IMAGE | + * SEC_RESERVE * - * FileHandle - * Handle to a file to create a section mapped to a file - * instead of a memory backed section; + * FileHandle + * Handle to a file to create a section mapped to a file + * instead of a memory backed section; * - * File - * Unknown. + * File + * Unknown. * * RETURN VALUE - * Status. + * Status. * * @unimplemented */ NTSTATUS STDCALL -MmCreateSection (OUT PSECTION_OBJECT * SectionObject, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN PLARGE_INTEGER MaximumSize, - IN ULONG SectionPageProtection, - IN ULONG AllocationAttributes, - IN HANDLE FileHandle OPTIONAL, - IN PFILE_OBJECT File OPTIONAL) +MmCreateSection (OUT PSECTION_OBJECT * SectionObject, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN PLARGE_INTEGER MaximumSize, + IN ULONG SectionPageProtection, + IN ULONG AllocationAttributes, + IN HANDLE FileHandle OPTIONAL, + IN PFILE_OBJECT File OPTIONAL) { - return (STATUS_NOT_IMPLEMENTED); + return (STATUS_NOT_IMPLEMENTED); } /* EOF */ diff --git a/reactos/ntoskrnl/mm/slab.c b/reactos/ntoskrnl/mm/slab.c index e34233df690..94b937bb7a5 100644 --- a/reactos/ntoskrnl/mm/slab.c +++ b/reactos/ntoskrnl/mm/slab.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: slab.c,v 1.11 2004/03/04 00:07:02 navaraf Exp $ +/* $Id: slab.c,v 1.12 2004/04/10 22:35:26 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top directory * PROJECT: ReactOS kernel @@ -44,27 +44,30 @@ struct _SLAB_CACHE_PAGE; typedef struct _SLAB_CACHE { - SLAB_CACHE_CONSTRUCTOR Constructor; - SLAB_CACHE_DESTRUCTOR Destructor; - ULONG BaseSize; - ULONG ObjectSize; - ULONG ObjectsPerPage; - LIST_ENTRY PageListHead; - struct _SLAB_CACHE_PAGE* FirstFreePage; - KSPIN_LOCK SlabLock; -} SLAB_CACHE, *PSLAB_CACHE; + SLAB_CACHE_CONSTRUCTOR Constructor; + SLAB_CACHE_DESTRUCTOR Destructor; + ULONG BaseSize; + ULONG ObjectSize; + ULONG ObjectsPerPage; + LIST_ENTRY PageListHead; + struct _SLAB_CACHE_PAGE* FirstFreePage; + KSPIN_LOCK SlabLock; +} +SLAB_CACHE, *PSLAB_CACHE; typedef struct _SLAB_CACHE_BUFCTL { - struct _SLAB_CACHE_BUFCTL* NextFree; -} SLAB_CACHE_BUFCTL, *PSLAB_CACHE_BUFCTL; + struct _SLAB_CACHE_BUFCTL* NextFree; +} +SLAB_CACHE_BUFCTL, *PSLAB_CACHE_BUFCTL; typedef struct _SLAB_CACHE_PAGE { - LIST_ENTRY PageListEntry; - PSLAB_CACHE_BUFCTL FirstFreeBuffer; - ULONG ReferenceCount; -} SLAB_CACHE_PAGE, *PSLAB_CACHE_PAGE; + LIST_ENTRY PageListEntry; + PSLAB_CACHE_BUFCTL FirstFreeBuffer; + ULONG ReferenceCount; +} +SLAB_CACHE_PAGE, *PSLAB_CACHE_PAGE; /* GLOBALS ******************************************************************/ @@ -72,252 +75,252 @@ typedef struct _SLAB_CACHE_PAGE PSLAB_CACHE ExCreateSlabCache(PUNICODE_STRING Name, ULONG Size, ULONG Align, - SLAB_CACHE_CONSTRUCTOR Constructor, - SLAB_CACHE_DESTRUCTOR Destructor) + SLAB_CACHE_CONSTRUCTOR Constructor, + SLAB_CACHE_DESTRUCTOR Destructor) { - PSLAB_CACHE Slab; - ULONG ObjectSize; - ULONG AlignSize; + PSLAB_CACHE Slab; + ULONG ObjectSize; + ULONG AlignSize; - Slab = ExAllocatePool(NonPagedPool, sizeof(SLAB_CACHE)); - if (Slab == NULL) - { + Slab = ExAllocatePool(NonPagedPool, sizeof(SLAB_CACHE)); + if (Slab == NULL) + { return(NULL); - } + } - Slab->Constructor = Constructor; - Slab->Destructor = Destructor; - Slab->BaseSize = Size; - ObjectSize = Size + sizeof(SLAB_CACHE_BUFCTL); - AlignSize = Align - (ObjectSize % Align); - Slab->ObjectSize = ObjectSize + AlignSize; - Slab->ObjectsPerPage = - (PAGE_SIZE - sizeof(SLAB_CACHE_PAGE)) / Slab->ObjectSize; - Slab->FirstFreePage = NULL; - InitializeListHead(&Slab->PageListHead); - KeInitializeSpinLock(&Slab->SlabLock); - - return(Slab); + Slab->Constructor = Constructor; + Slab->Destructor = Destructor; + Slab->BaseSize = Size; + ObjectSize = Size + sizeof(SLAB_CACHE_BUFCTL); + AlignSize = Align - (ObjectSize % Align); + Slab->ObjectSize = ObjectSize + AlignSize; + Slab->ObjectsPerPage = + (PAGE_SIZE - sizeof(SLAB_CACHE_PAGE)) / Slab->ObjectSize; + Slab->FirstFreePage = NULL; + InitializeListHead(&Slab->PageListHead); + KeInitializeSpinLock(&Slab->SlabLock); + + return(Slab); } PSLAB_CACHE_PAGE ExGrowSlabCache(PSLAB_CACHE Slab) { - PSLAB_CACHE_PAGE SlabPage; - PHYSICAL_ADDRESS PhysicalPage; - PVOID Page; - NTSTATUS Status; - ULONG i; - PSLAB_CACHE_BUFCTL BufCtl; - PVOID Object; - - Status = MmRequestPageMemoryConsumer(MC_NPPOOL, TRUE, &PhysicalPage); - if (!NT_SUCCESS(Status)) - { - return(NULL); - } + PSLAB_CACHE_PAGE SlabPage; + PHYSICAL_ADDRESS PhysicalPage; + PVOID Page; + NTSTATUS Status; + ULONG i; + PSLAB_CACHE_BUFCTL BufCtl; + PVOID Object; - Page = ExAllocatePageWithPhysPage(PhysicalPage); - if (Page == NULL) - { + Status = MmRequestPageMemoryConsumer(MC_NPPOOL, TRUE, &PhysicalPage); + if (!NT_SUCCESS(Status)) + { + return(NULL); + } + + Page = ExAllocatePageWithPhysPage(PhysicalPage); + if (Page == NULL) + { MmReleasePageMemoryConsumer(MC_NPPOOL, PhysicalPage); return(NULL); - } + } - SlabPage = (PSLAB_CACHE_PAGE)((char*)Page + PAGE_SIZE - sizeof(SLAB_CACHE_PAGE)); - SlabPage->ReferenceCount = 0; - SlabPage->FirstFreeBuffer = (PSLAB_CACHE_BUFCTL)Page; - for (i = 0; i < Slab->ObjectsPerPage; i++) - { + SlabPage = (PSLAB_CACHE_PAGE)((char*)Page + PAGE_SIZE - sizeof(SLAB_CACHE_PAGE)); + SlabPage->ReferenceCount = 0; + SlabPage->FirstFreeBuffer = (PSLAB_CACHE_BUFCTL)Page; + for (i = 0; i < Slab->ObjectsPerPage; i++) + { BufCtl = (PSLAB_CACHE_BUFCTL)((char*)Page + (i * Slab->ObjectSize)); Object = (PVOID)(BufCtl + 1); if (Slab->Constructor != NULL) - { - Slab->Constructor(Object, Slab->BaseSize); - } + { + Slab->Constructor(Object, Slab->BaseSize); + } if (i == (Slab->ObjectsPerPage - 1)) - { - BufCtl->NextFree = - (PSLAB_CACHE_BUFCTL)((char*)Page + ((i + 1) * Slab->ObjectSize)); - } + { + BufCtl->NextFree = + (PSLAB_CACHE_BUFCTL)((char*)Page + ((i + 1) * Slab->ObjectSize)); + } else - { - BufCtl->NextFree = NULL; - } - } + { + BufCtl->NextFree = NULL; + } + } - return(SlabPage); + return(SlabPage); } PVOID ExAllocateSlabCache(PSLAB_CACHE Slab, BOOLEAN MayWait) { - KIRQL oldIrql; - PSLAB_CACHE_PAGE Page; - PVOID Object; - BOOLEAN NewPage; + KIRQL oldIrql; + PSLAB_CACHE_PAGE Page; + PVOID Object; + BOOLEAN NewPage; - KeAcquireSpinLock(&Slab->SlabLock, &oldIrql); - - /* - * Check if there is a page with free objects - * present, if so allocate from it, if - * not grow the slab. - */ - if (Slab->FirstFreePage == NULL) - { + KeAcquireSpinLock(&Slab->SlabLock, &oldIrql); + + /* + * Check if there is a page with free objects + * present, if so allocate from it, if + * not grow the slab. + */ + if (Slab->FirstFreePage == NULL) + { KeReleaseSpinLock(&Slab->SlabLock, oldIrql); Page = ExGrowSlabCache(Slab); NewPage = TRUE; KeAcquireSpinLock(&Slab->SlabLock, &oldIrql); - } - else - { + } + else + { Page = Slab->FirstFreePage; NewPage = FALSE; - } - - /* - * We shouldn't have got a page without free buffers. - */ - if (Page->FirstFreeBuffer == NULL) - { + } + + /* + * We shouldn't have got a page without free buffers. + */ + if (Page->FirstFreeBuffer == NULL) + { DPRINT1("First free page had no free buffers.\n"); KEBUGCHECK(0); - } + } - /* - * Allocate the first free object from the page. - */ - Object = (PVOID)((char*)Page->FirstFreeBuffer + sizeof(SLAB_CACHE_BUFCTL)); - Page->FirstFreeBuffer = Page->FirstFreeBuffer->NextFree; - Page->ReferenceCount++; + /* + * Allocate the first free object from the page. + */ + Object = (PVOID)((char*)Page->FirstFreeBuffer + sizeof(SLAB_CACHE_BUFCTL)); + Page->FirstFreeBuffer = Page->FirstFreeBuffer->NextFree; + Page->ReferenceCount++; - /* - * If we just allocated all the objects from this page - * and it was the first free page then adjust the - * first free page pointer and move the page to the head - * of the list. - */ - if (Page->ReferenceCount == Slab->ObjectsPerPage && !NewPage) - { + /* + * If we just allocated all the objects from this page + * and it was the first free page then adjust the + * first free page pointer and move the page to the head + * of the list. + */ + if (Page->ReferenceCount == Slab->ObjectsPerPage && !NewPage) + { if (Page->PageListEntry.Flink == &Slab->PageListHead) - { - Slab->FirstFreePage = NULL; - } + { + Slab->FirstFreePage = NULL; + } else - { - PSLAB_CACHE_PAGE NextPage; - - NextPage = CONTAINING_RECORD(Page->PageListEntry.Flink, - SLAB_CACHE_PAGE, - PageListEntry); - Slab->FirstFreePage = NextPage; - } + { + PSLAB_CACHE_PAGE NextPage; + + NextPage = CONTAINING_RECORD(Page->PageListEntry.Flink, + SLAB_CACHE_PAGE, + PageListEntry); + Slab->FirstFreePage = NextPage; + } RemoveEntryList(&Page->PageListEntry); InsertHeadList(&Slab->PageListHead, &Page->PageListEntry); - } - /* - * Otherwise if we created a new page then add it to the end of - * the page list. - */ - else if (NewPage) - { + } + /* + * Otherwise if we created a new page then add it to the end of + * the page list. + */ + else if (NewPage) + { InsertTailList(&Slab->PageListHead, &Page->PageListEntry); if (Slab->FirstFreePage == NULL) - { - Slab->FirstFreePage = Page; - } - } - KeReleaseSpinLock(&Slab->SlabLock, oldIrql); - return(Object); + { + Slab->FirstFreePage = Page; + } + } + KeReleaseSpinLock(&Slab->SlabLock, oldIrql); + return(Object); } VOID ExFreeFromPageSlabCache(PSLAB_CACHE Slab, - PSLAB_CACHE_PAGE Page, - PVOID Object) + PSLAB_CACHE_PAGE Page, + PVOID Object) { - PSLAB_CACHE_BUFCTL BufCtl; + PSLAB_CACHE_BUFCTL BufCtl; - BufCtl = (PSLAB_CACHE_BUFCTL)((char*)Object - sizeof(SLAB_CACHE_BUFCTL)); - BufCtl->NextFree = Page->FirstFreeBuffer; - Page->FirstFreeBuffer = BufCtl; - Page->ReferenceCount--; + BufCtl = (PSLAB_CACHE_BUFCTL)((char*)Object - sizeof(SLAB_CACHE_BUFCTL)); + BufCtl->NextFree = Page->FirstFreeBuffer; + Page->FirstFreeBuffer = BufCtl; + Page->ReferenceCount--; } VOID ExFreeSlabCache(PSLAB_CACHE Slab, PVOID Object) { - KIRQL oldIrql; - PLIST_ENTRY current_entry; - PSLAB_CACHE_PAGE current; + KIRQL oldIrql; + PLIST_ENTRY current_entry; + PSLAB_CACHE_PAGE current; - KeAcquireSpinLock(&Slab->SlabLock, &oldIrql); - current_entry = Slab->PageListHead.Flink; - while (current_entry != &Slab->PageListHead) - { + KeAcquireSpinLock(&Slab->SlabLock, &oldIrql); + current_entry = Slab->PageListHead.Flink; + while (current_entry != &Slab->PageListHead) + { PVOID Base; current = CONTAINING_RECORD(current_entry, - SLAB_CACHE_PAGE, - PageListEntry); + SLAB_CACHE_PAGE, + PageListEntry); Base = (PVOID)((char*)current + sizeof(SLAB_CACHE_PAGE) - PAGE_SIZE); - if (Base >= Object && - ((char*)Base + PAGE_SIZE - sizeof(SLAB_CACHE_PAGE)) >= - ((char*)Object + Slab->ObjectSize)) - { - ExFreeFromPageSlabCache(Slab, current, Object); - /* - * If the page just become free then rearrange things. - */ - if (current->ReferenceCount == 0) - { - RemoveEntryList(¤t->PageListEntry); - InsertTailList(&Slab->PageListHead, ¤t->PageListEntry); - if (Slab->FirstFreePage == NULL) - { - Slab->FirstFreePage = current; - } - } - KeReleaseSpinLock(&Slab->SlabLock, oldIrql); - return; - } - } - DPRINT1("Tried to free object not in cache.\n"); - KEBUGCHECK(0); + if (Base >= Object && + ((char*)Base + PAGE_SIZE - sizeof(SLAB_CACHE_PAGE)) >= + ((char*)Object + Slab->ObjectSize)) + { + ExFreeFromPageSlabCache(Slab, current, Object); + /* + * If the page just become free then rearrange things. + */ + if (current->ReferenceCount == 0) + { + RemoveEntryList(¤t->PageListEntry); + InsertTailList(&Slab->PageListHead, ¤t->PageListEntry); + if (Slab->FirstFreePage == NULL) + { + Slab->FirstFreePage = current; + } + } + KeReleaseSpinLock(&Slab->SlabLock, oldIrql); + return; + } + } + DPRINT1("Tried to free object not in cache.\n"); + KEBUGCHECK(0); } VOID ExDestroySlabCache(PSLAB_CACHE Slab) { - PLIST_ENTRY current_entry; - PSLAB_CACHE_PAGE current; - ULONG i; - PVOID Object; + PLIST_ENTRY current_entry; + PSLAB_CACHE_PAGE current; + ULONG i; + PVOID Object; - current_entry = Slab->PageListHead.Flink; - while (current_entry != &Slab->PageListHead) - { + current_entry = Slab->PageListHead.Flink; + while (current_entry != &Slab->PageListHead) + { PVOID Base; PHYSICAL_ADDRESS PhysicalPage; current = CONTAINING_RECORD(current_entry, - SLAB_CACHE_PAGE, - PageListEntry); + SLAB_CACHE_PAGE, + PageListEntry); Base = (PVOID)((char*)current + sizeof(SLAB_CACHE_PAGE) - PAGE_SIZE); if (Slab->Destructor != NULL) - { - for (i = 0; i < Slab->ObjectsPerPage; i++) - { - Object = (char*)Base + (i * Slab->ObjectSize) + - sizeof(SLAB_CACHE_BUFCTL); - Slab->Destructor(Object, Slab->BaseSize); - } - } + { + for (i = 0; i < Slab->ObjectsPerPage; i++) + { + Object = (char*)Base + (i * Slab->ObjectSize) + + sizeof(SLAB_CACHE_BUFCTL); + Slab->Destructor(Object, Slab->BaseSize); + } + } PhysicalPage = MmGetPhysicalAddressForProcess(NULL, Base); ExUnmapPage(Base); MmReleasePageMemoryConsumer(MC_NPPOOL, PhysicalPage); - } - ExFreePool(Slab); + } + ExFreePool(Slab); } diff --git a/reactos/ntoskrnl/mm/virtual.c b/reactos/ntoskrnl/mm/virtual.c index 92d8f481295..b6c586d4b8e 100644 --- a/reactos/ntoskrnl/mm/virtual.c +++ b/reactos/ntoskrnl/mm/virtual.c @@ -16,14 +16,14 @@ * 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.71 2003/12/14 17:44:02 hbirr Exp $ +/* $Id: virtual.c,v 1.72 2004/04/10 22:35:26 gdalsnes Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/virtual.c * PURPOSE: Implementing operations on virtual memory. * PROGRAMMER: David Welch */ - + /* INCLUDE *****************************************************************/ #include @@ -39,11 +39,11 @@ /* FUNCTIONS *****************************************************************/ -NTSTATUS STDCALL -NtFlushVirtualMemory(IN HANDLE ProcessHandle, - IN PVOID BaseAddress, - IN ULONG NumberOfBytesToFlush, - OUT PULONG NumberOfBytesFlushed OPTIONAL) +NTSTATUS STDCALL +NtFlushVirtualMemory(IN HANDLE ProcessHandle, + IN PVOID BaseAddress, + IN ULONG NumberOfBytesToFlush, + OUT PULONG NumberOfBytesFlushed OPTIONAL) /* * FUNCTION: Flushes virtual memory to file * ARGUMENTS: @@ -55,152 +55,152 @@ NtFlushVirtualMemory(IN HANDLE ProcessHandle, * RETURNS: Status */ { - UNIMPLEMENTED; - return(STATUS_NOT_IMPLEMENTED); + UNIMPLEMENTED; + return(STATUS_NOT_IMPLEMENTED); } -NTSTATUS STDCALL -NtLockVirtualMemory(HANDLE ProcessHandle, - PVOID BaseAddress, - ULONG NumberOfBytesToLock, - PULONG NumberOfBytesLocked) // ULONG LockOption? +NTSTATUS STDCALL +NtLockVirtualMemory(HANDLE ProcessHandle, + PVOID BaseAddress, + ULONG NumberOfBytesToLock, + PULONG NumberOfBytesLocked) // ULONG LockOption? { - // AG [08-20-03] : I have *no* idea if this is correct, I just used the - // other functions as a template and made a few intelligent guesses... + // AG [08-20-03] : I have *no* idea if this is correct, I just used the + // other functions as a template and made a few intelligent guesses... - NTSTATUS Status; - PMDL Mdl; - PEPROCESS Process; - - DPRINT("NtLockVirtualMemory(ProcessHandle %x, BaseAddress %x, " - "NumberOfBytesToLock %d), NumberOfBytesLocked %x\n",ProcessHandle,BaseAddress, - NumberOfBytesToLock, NumberOfBytesLocked); - - Status = ObReferenceObjectByHandle(ProcessHandle, - PROCESS_VM_WRITE, - NULL, - UserMode, - (PVOID*)(&Process), - NULL); - if (Status != STATUS_SUCCESS) - { + NTSTATUS Status; + PMDL Mdl; + PEPROCESS Process; + + DPRINT("NtLockVirtualMemory(ProcessHandle %x, BaseAddress %x, " + "NumberOfBytesToLock %d), NumberOfBytesLocked %x\n",ProcessHandle,BaseAddress, + NumberOfBytesToLock, NumberOfBytesLocked); + + Status = ObReferenceObjectByHandle(ProcessHandle, + PROCESS_VM_WRITE, + NULL, + UserMode, + (PVOID*)(&Process), + NULL); + if (Status != STATUS_SUCCESS) + { return(Status); - } - - Mdl = MmCreateMdl(NULL, - BaseAddress, - NumberOfBytesToLock); - MmProbeAndLockPages(Mdl, - UserMode, - IoWriteAccess); - - ExFreePool(Mdl); // Are we supposed to do this here? - - ObDereferenceObject(Process); - - *NumberOfBytesLocked = NumberOfBytesToLock; - return(STATUS_SUCCESS); + } + + Mdl = MmCreateMdl(NULL, + BaseAddress, + NumberOfBytesToLock); + MmProbeAndLockPages(Mdl, + UserMode, + IoWriteAccess); + + ExFreePool(Mdl); // Are we supposed to do this here? + + ObDereferenceObject(Process); + + *NumberOfBytesLocked = NumberOfBytesToLock; + return(STATUS_SUCCESS); } -NTSTATUS STDCALL +NTSTATUS STDCALL NtQueryVirtualMemory (IN HANDLE ProcessHandle, - IN PVOID Address, - IN CINT VirtualMemoryInformationClass, - OUT PVOID VirtualMemoryInformation, - IN ULONG Length, - OUT PULONG UnsafeResultLength) + IN PVOID Address, + IN CINT VirtualMemoryInformationClass, + OUT PVOID VirtualMemoryInformation, + IN ULONG Length, + OUT PULONG UnsafeResultLength) { NTSTATUS Status; PEPROCESS Process; MEMORY_AREA* MemoryArea; ULONG ResultLength = 0; PMADDRESS_SPACE AddressSpace; - + DPRINT("NtQueryVirtualMemory(ProcessHandle %x, Address %x, " "VirtualMemoryInformationClass %d, VirtualMemoryInformation %x, " "Length %lu ResultLength %x)\n",ProcessHandle,Address, VirtualMemoryInformationClass,VirtualMemoryInformation, Length,ResultLength); - + Status = ObReferenceObjectByHandle(ProcessHandle, - PROCESS_QUERY_INFORMATION, - NULL, - UserMode, - (PVOID*)(&Process), - NULL); - + PROCESS_QUERY_INFORMATION, + NULL, + UserMode, + (PVOID*)(&Process), + NULL); + if (!NT_SUCCESS(Status)) - { - DPRINT("NtQueryVirtualMemory() = %x\n",Status); - return(Status); - } - + { + DPRINT("NtQueryVirtualMemory() = %x\n",Status); + return(Status); + } + AddressSpace = &Process->AddressSpace; MmLockAddressSpace(AddressSpace); MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace, - Address); + Address); switch(VirtualMemoryInformationClass) - { - case MemoryBasicInformation: - { - PMEMORY_BASIC_INFORMATION Info = - (PMEMORY_BASIC_INFORMATION)VirtualMemoryInformation; - - if (Length != sizeof(MEMORY_BASIC_INFORMATION)) - { - MmUnlockAddressSpace(AddressSpace); - ObDereferenceObject(Process); - return(STATUS_INFO_LENGTH_MISMATCH); - } - - if (MemoryArea == NULL) - { - Info->State = MEM_FREE; - Info->BaseAddress = (PVOID)PAGE_ROUND_DOWN(Address); - 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; - } - break; - } - - default: - { - Status = STATUS_INVALID_INFO_CLASS; - ResultLength = 0; - break; - } - } + { + case MemoryBasicInformation: + { + PMEMORY_BASIC_INFORMATION Info = + (PMEMORY_BASIC_INFORMATION)VirtualMemoryInformation; + + if (Length != sizeof(MEMORY_BASIC_INFORMATION)) + { + MmUnlockAddressSpace(AddressSpace); + ObDereferenceObject(Process); + return(STATUS_INFO_LENGTH_MISMATCH); + } + + if (MemoryArea == NULL) + { + Info->State = MEM_FREE; + Info->BaseAddress = (PVOID)PAGE_ROUND_DOWN(Address); + 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; + } + break; + } + + default: + { + Status = STATUS_INVALID_INFO_CLASS; + ResultLength = 0; + break; + } + } MmUnlockAddressSpace(AddressSpace); ObDereferenceObject(Process); if (UnsafeResultLength != NULL) - { - MmCopyToCaller(UnsafeResultLength, &ResultLength, sizeof(ULONG)); - } + { + MmCopyToCaller(UnsafeResultLength, &ResultLength, sizeof(ULONG)); + } return(Status); } NTSTATUS STDCALL -NtProtectVirtualMemory(IN HANDLE ProcessHandle, - IN PVOID BaseAddress, - IN ULONG NumberOfBytesToProtect, - IN ULONG NewAccessProtection, - OUT PULONG UnsafeOldAccessProtection) +NtProtectVirtualMemory(IN HANDLE ProcessHandle, + IN PVOID BaseAddress, + IN ULONG NumberOfBytesToProtect, + IN ULONG NewAccessProtection, + OUT PULONG UnsafeOldAccessProtection) { PMEMORY_AREA MemoryArea; PEPROCESS Process; @@ -209,210 +209,210 @@ NtProtectVirtualMemory(IN HANDLE ProcessHandle, ULONG OldAccessProtection; NumberOfBytesToProtect = - PAGE_ROUND_UP(BaseAddress + NumberOfBytesToProtect) - - PAGE_ROUND_DOWN(BaseAddress); + PAGE_ROUND_UP(BaseAddress + NumberOfBytesToProtect) - + PAGE_ROUND_DOWN(BaseAddress); BaseAddress = (PVOID)PAGE_ROUND_DOWN(BaseAddress); - + Status = ObReferenceObjectByHandle(ProcessHandle, - PROCESS_VM_OPERATION, - PsProcessType, - UserMode, - (PVOID*)(&Process), - NULL); + PROCESS_VM_OPERATION, + PsProcessType, + UserMode, + (PVOID*)(&Process), + NULL); if (Status != STATUS_SUCCESS) - { - DPRINT("NtProtectVirtualMemory() = %x\n",Status); - return(Status); - } + { + DPRINT("NtProtectVirtualMemory() = %x\n",Status); + return(Status); + } AddressSpace = &Process->AddressSpace; - + MmLockAddressSpace(AddressSpace); MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace, - BaseAddress); + BaseAddress); if (MemoryArea == NULL) - { - MmUnlockAddressSpace(AddressSpace); - ObDereferenceObject(Process); - return(STATUS_UNSUCCESSFUL); - } - + { + MmUnlockAddressSpace(AddressSpace); + ObDereferenceObject(Process); + return(STATUS_UNSUCCESSFUL); + } + if (MemoryArea->Type == MEMORY_AREA_VIRTUAL_MEMORY) - { - Status = MmProtectAnonMem(AddressSpace, MemoryArea, BaseAddress, - NumberOfBytesToProtect, NewAccessProtection, - &OldAccessProtection); - } + { + Status = MmProtectAnonMem(AddressSpace, MemoryArea, BaseAddress, + NumberOfBytesToProtect, NewAccessProtection, + &OldAccessProtection); + } else if (MemoryArea->Type == MEMORY_AREA_SECTION_VIEW) - { - Status = MmProtectSectionView(AddressSpace, MemoryArea, BaseAddress, - NumberOfBytesToProtect, - NewAccessProtection, - &OldAccessProtection); - } - + { + Status = MmProtectSectionView(AddressSpace, MemoryArea, BaseAddress, + NumberOfBytesToProtect, + NewAccessProtection, + &OldAccessProtection); + } + MmUnlockAddressSpace(AddressSpace); ObDereferenceObject(Process); - MmCopyToCaller(UnsafeOldAccessProtection, &OldAccessProtection, - sizeof(ULONG)); + MmCopyToCaller(UnsafeOldAccessProtection, &OldAccessProtection, + sizeof(ULONG)); return(Status); } -NTSTATUS STDCALL -NtReadVirtualMemory(IN HANDLE ProcessHandle, - IN PVOID BaseAddress, - OUT PVOID Buffer, - IN ULONG NumberOfBytesToRead, - OUT PULONG NumberOfBytesRead) -{ - NTSTATUS Status; - PMDL Mdl; - PVOID SystemAddress; - PEPROCESS Process; - - DPRINT("NtReadVirtualMemory(ProcessHandle %x, BaseAddress %x, " - "Buffer %x, NumberOfBytesToRead %d)\n",ProcessHandle,BaseAddress, - Buffer,NumberOfBytesToRead); - - Status = ObReferenceObjectByHandle(ProcessHandle, - PROCESS_VM_WRITE, - NULL, - UserMode, - (PVOID*)(&Process), - NULL); - if (Status != STATUS_SUCCESS) - { - return(Status); - } - - Mdl = MmCreateMdl(NULL, - Buffer, - NumberOfBytesToRead); - MmProbeAndLockPages(Mdl, - UserMode, - IoWriteAccess); - - KeAttachProcess(Process); - - SystemAddress = MmGetSystemAddressForMdl(Mdl); - memcpy(SystemAddress, BaseAddress, NumberOfBytesToRead); - - KeDetachProcess(); - - if (Mdl->MappedSystemVa != NULL) - { - MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl); - } - MmUnlockPages(Mdl); - ExFreePool(Mdl); - - ObDereferenceObject(Process); - - *NumberOfBytesRead = NumberOfBytesToRead; - return(STATUS_SUCCESS); -} - -NTSTATUS STDCALL -NtUnlockVirtualMemory(HANDLE ProcessHandle, - PVOID BaseAddress, - ULONG NumberOfBytesToUnlock, - PULONG NumberOfBytesUnlocked OPTIONAL) -{ - // AG [08-20-03] : I have *no* idea if this is correct, I just used the - // other functions as a template and made a few intelligent guesses... - - NTSTATUS Status; - PMDL Mdl; - PEPROCESS Process; - - DPRINT("NtUnlockVirtualMemory(ProcessHandle %x, BaseAddress %x, " - "NumberOfBytesToUnlock %d), NumberOfBytesUnlocked %x\n",ProcessHandle,BaseAddress, - NumberOfBytesToUnlock, NumberOfBytesUnlocked); - - Status = ObReferenceObjectByHandle(ProcessHandle, - PROCESS_VM_WRITE, - NULL, - UserMode, - (PVOID*)(&Process), - NULL); - if (Status != STATUS_SUCCESS) - { - return(Status); - } - - Mdl = MmCreateMdl(NULL, - BaseAddress, - NumberOfBytesToUnlock); - - ObDereferenceObject(Process); - - if (Mdl->MappedSystemVa != NULL) - { - MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl); - } - MmUnlockPages(Mdl); - ExFreePool(Mdl); - - *NumberOfBytesUnlocked = NumberOfBytesToUnlock; - - return(STATUS_SUCCESS); -} - - -NTSTATUS STDCALL -NtWriteVirtualMemory(IN HANDLE ProcessHandle, - IN PVOID BaseAddress, - IN PVOID Buffer, - IN ULONG NumberOfBytesToWrite, - OUT PULONG NumberOfBytesWritten) +NTSTATUS STDCALL +NtReadVirtualMemory(IN HANDLE ProcessHandle, + IN PVOID BaseAddress, + OUT PVOID Buffer, + IN ULONG NumberOfBytesToRead, + OUT PULONG NumberOfBytesRead) { NTSTATUS Status; PMDL Mdl; PVOID SystemAddress; PEPROCESS Process; - - DPRINT("NtWriteVirtualMemory(ProcessHandle %x, BaseAddress %x, " - "Buffer %x, NumberOfBytesToWrite %d)\n",ProcessHandle,BaseAddress, - Buffer,NumberOfBytesToWrite); - + + DPRINT("NtReadVirtualMemory(ProcessHandle %x, BaseAddress %x, " + "Buffer %x, NumberOfBytesToRead %d)\n",ProcessHandle,BaseAddress, + Buffer,NumberOfBytesToRead); + Status = ObReferenceObjectByHandle(ProcessHandle, - PROCESS_VM_WRITE, - NULL, - UserMode, - (PVOID*)(&Process), - NULL); + PROCESS_VM_WRITE, + NULL, + UserMode, + (PVOID*)(&Process), + NULL); if (Status != STATUS_SUCCESS) - { - return(Status); - } - - Mdl = MmCreateMdl(NULL, - Buffer, - NumberOfBytesToWrite); + { + return(Status); + } + + Mdl = MmCreateMdl(NULL, + Buffer, + NumberOfBytesToRead); MmProbeAndLockPages(Mdl, - UserMode, - IoReadAccess); - + UserMode, + IoWriteAccess); + KeAttachProcess(Process); - + SystemAddress = MmGetSystemAddressForMdl(Mdl); - memcpy(BaseAddress, SystemAddress, NumberOfBytesToWrite); - + memcpy(SystemAddress, BaseAddress, NumberOfBytesToRead); + KeDetachProcess(); - + + if (Mdl->MappedSystemVa != NULL) + { + MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl); + } + MmUnlockPages(Mdl); + ExFreePool(Mdl); + + ObDereferenceObject(Process); + + *NumberOfBytesRead = NumberOfBytesToRead; + return(STATUS_SUCCESS); +} + +NTSTATUS STDCALL +NtUnlockVirtualMemory(HANDLE ProcessHandle, + PVOID BaseAddress, + ULONG NumberOfBytesToUnlock, + PULONG NumberOfBytesUnlocked OPTIONAL) +{ + // AG [08-20-03] : I have *no* idea if this is correct, I just used the + // other functions as a template and made a few intelligent guesses... + + NTSTATUS Status; + PMDL Mdl; + PEPROCESS Process; + + DPRINT("NtUnlockVirtualMemory(ProcessHandle %x, BaseAddress %x, " + "NumberOfBytesToUnlock %d), NumberOfBytesUnlocked %x\n",ProcessHandle,BaseAddress, + NumberOfBytesToUnlock, NumberOfBytesUnlocked); + + Status = ObReferenceObjectByHandle(ProcessHandle, + PROCESS_VM_WRITE, + NULL, + UserMode, + (PVOID*)(&Process), + NULL); + if (Status != STATUS_SUCCESS) + { + return(Status); + } + + Mdl = MmCreateMdl(NULL, + BaseAddress, + NumberOfBytesToUnlock); + ObDereferenceObject(Process); if (Mdl->MappedSystemVa != NULL) - { - MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl); - } + { + MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl); + } MmUnlockPages(Mdl); ExFreePool(Mdl); - + + *NumberOfBytesUnlocked = NumberOfBytesToUnlock; + + return(STATUS_SUCCESS); +} + + +NTSTATUS STDCALL +NtWriteVirtualMemory(IN HANDLE ProcessHandle, + IN PVOID BaseAddress, + IN PVOID Buffer, + IN ULONG NumberOfBytesToWrite, + OUT PULONG NumberOfBytesWritten) +{ + NTSTATUS Status; + PMDL Mdl; + PVOID SystemAddress; + PEPROCESS Process; + + DPRINT("NtWriteVirtualMemory(ProcessHandle %x, BaseAddress %x, " + "Buffer %x, NumberOfBytesToWrite %d)\n",ProcessHandle,BaseAddress, + Buffer,NumberOfBytesToWrite); + + Status = ObReferenceObjectByHandle(ProcessHandle, + PROCESS_VM_WRITE, + NULL, + UserMode, + (PVOID*)(&Process), + NULL); + if (Status != STATUS_SUCCESS) + { + return(Status); + } + + Mdl = MmCreateMdl(NULL, + Buffer, + NumberOfBytesToWrite); + MmProbeAndLockPages(Mdl, + UserMode, + IoReadAccess); + + KeAttachProcess(Process); + + SystemAddress = MmGetSystemAddressForMdl(Mdl); + memcpy(BaseAddress, SystemAddress, NumberOfBytesToWrite); + + KeDetachProcess(); + + ObDereferenceObject(Process); + + if (Mdl->MappedSystemVa != NULL) + { + MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl); + } + MmUnlockPages(Mdl); + ExFreePool(Mdl); + *NumberOfBytesWritten = NumberOfBytesToWrite; - + return(STATUS_SUCCESS); } @@ -424,15 +424,15 @@ MmSecureVirtualMemory (PVOID Address, SIZE_T Length, ULONG Mode) { - /* Only works for user space */ - if (MmHighestUserAddress < Address) - { + /* Only works for user space */ + if (MmHighestUserAddress < Address) + { return NULL; - } + } - UNIMPLEMENTED; + UNIMPLEMENTED; - return 0; + return 0; } @@ -442,12 +442,12 @@ MmSecureVirtualMemory (PVOID Address, VOID STDCALL MmUnsecureVirtualMemory(PVOID SecureMem) { - if (NULL == SecureMem) - { + if (NULL == SecureMem) + { return; - } + } - UNIMPLEMENTED; + UNIMPLEMENTED; } @@ -456,23 +456,23 @@ MmUnsecureVirtualMemory(PVOID SecureMem) */ VOID STDCALL ProbeForRead (IN PVOID Address, - IN ULONG Length, - IN ULONG Alignment) + IN ULONG Length, + IN ULONG Alignment) { - assert (Alignment ==1 || Alignment == 2 || Alignment == 4 || Alignment == 8); + assert (Alignment ==1 || Alignment == 2 || Alignment == 4 || Alignment == 8); - if (Length == 0) - return; + if (Length == 0) + return; - if (((ULONG_PTR)Address & (Alignment - 1)) != 0) - { + if (((ULONG_PTR)Address & (Alignment - 1)) != 0) + { ExRaiseStatus (STATUS_DATATYPE_MISALIGNMENT); - } - else if ((ULONG_PTR)Address + Length < (ULONG_PTR)Address || - (ULONG_PTR)Address + Length > (ULONG_PTR)MmUserProbeAddress) - { + } + else if ((ULONG_PTR)Address + Length < (ULONG_PTR)Address || + (ULONG_PTR)Address + Length > (ULONG_PTR)MmUserProbeAddress) + { ExRaiseStatus (STATUS_ACCESS_VIOLATION); - } + } } @@ -481,35 +481,35 @@ ProbeForRead (IN PVOID Address, */ VOID STDCALL ProbeForWrite (IN PVOID Address, - IN ULONG Length, - IN ULONG Alignment) + IN ULONG Length, + IN ULONG Alignment) { - PULONG Ptr; - ULONG x; - ULONG i; + PULONG Ptr; + ULONG x; + ULONG i; - assert (Alignment ==1 || Alignment == 2 || Alignment == 4 || Alignment == 8); + assert (Alignment ==1 || Alignment == 2 || Alignment == 4 || Alignment == 8); - if (Length == 0) - return; + if (Length == 0) + return; - if (((ULONG_PTR)Address & (Alignment - 1)) != 0) - { + if (((ULONG_PTR)Address & (Alignment - 1)) != 0) + { ExRaiseStatus (STATUS_DATATYPE_MISALIGNMENT); - } - else if ((ULONG_PTR)Address + Length < (ULONG_PTR)Address || - (ULONG_PTR)Address + Length > (ULONG_PTR)MmUserProbeAddress) - { + } + else if ((ULONG_PTR)Address + Length < (ULONG_PTR)Address || + (ULONG_PTR)Address + Length > (ULONG_PTR)MmUserProbeAddress) + { ExRaiseStatus (STATUS_ACCESS_VIOLATION); - } + } - /* Check for accessible pages */ - for (i = 0; i < Length; i += PAGE_SIZE) - { + /* Check for accessible pages */ + for (i = 0; i < Length; i += PAGE_SIZE) + { Ptr = (PULONG)(((ULONG_PTR)Address & ~(PAGE_SIZE - 1)) + i); x = *Ptr; *Ptr = x; - } + } } /* EOF */ diff --git a/reactos/ntoskrnl/mm/wset.c b/reactos/ntoskrnl/mm/wset.c index aff9a12d238..69477b025b7 100644 --- a/reactos/ntoskrnl/mm/wset.c +++ b/reactos/ntoskrnl/mm/wset.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: wset.c,v 1.17 2003/07/12 01:52:10 dwelch Exp $ +/* $Id: wset.c,v 1.18 2004/04/10 22:35:26 gdalsnes Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/wset.c @@ -41,30 +41,30 @@ NTSTATUS MmTrimUserMemory(ULONG Target, ULONG Priority, PULONG NrFreedPages) { - PHYSICAL_ADDRESS CurrentPhysicalAddress; - PHYSICAL_ADDRESS NextPhysicalAddress; - NTSTATUS Status; + PHYSICAL_ADDRESS CurrentPhysicalAddress; + PHYSICAL_ADDRESS NextPhysicalAddress; + NTSTATUS Status; - (*NrFreedPages) = 0; + (*NrFreedPages) = 0; - CurrentPhysicalAddress = MmGetLRUFirstUserPage(); - while (CurrentPhysicalAddress.QuadPart != 0 && Target > 0) - { + CurrentPhysicalAddress = MmGetLRUFirstUserPage(); + while (CurrentPhysicalAddress.QuadPart != 0 && Target > 0) + { NextPhysicalAddress = MmGetLRUNextUserPage(CurrentPhysicalAddress); Status = MmPageOutPhysicalAddress(CurrentPhysicalAddress); if (NT_SUCCESS(Status)) - { - DPRINT("Succeeded\n"); - Target--; - (*NrFreedPages)++; - } + { + DPRINT("Succeeded\n"); + Target--; + (*NrFreedPages)++; + } else if (Status == STATUS_PAGEFILE_QUOTA) - { - MmSetLRULastPage(CurrentPhysicalAddress); - } + { + MmSetLRULastPage(CurrentPhysicalAddress); + } CurrentPhysicalAddress = NextPhysicalAddress; - } - return(STATUS_SUCCESS); + } + return(STATUS_SUCCESS); } From eddb2f516880eb33ddbf7b5d5bb3934212d96fd1 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 10 Apr 2004 23:20:17 +0000 Subject: [PATCH 0831/1463] Implement tape IO functions. svn path=/trunk/; revision=9078 --- reactos/include/ntos.h | 4 +- reactos/include/ntos/tape.h | 57 ++++ reactos/include/structs.h | 51 ++-- reactos/lib/kernel32/file/tape.c | 447 ++++++++++++++++++++++++------- 4 files changed, 435 insertions(+), 124 deletions(-) create mode 100644 reactos/include/ntos/tape.h diff --git a/reactos/include/ntos.h b/reactos/include/ntos.h index ae21fabfa39..ab4447471bd 100644 --- a/reactos/include/ntos.h +++ b/reactos/include/ntos.h @@ -1,6 +1,6 @@ #ifndef _NTOS_H #define _NTOS_H -/* $Id: ntos.h,v 1.20 2004/01/23 21:18:27 ekohl Exp $ */ +/* $Id: ntos.h,v 1.21 2004/04/10 23:19:42 ekohl Exp $ */ #if defined(NTOS_MODE_USER) /* @@ -14,6 +14,7 @@ #include "ntos/cdrom.h" #include "ntos/console.h" #include "ntos/disk.h" +#include "ntos/tape.h" #include "ntos/except.h" #include "ntos/file.h" #include "ntos/gditypes.h" @@ -55,6 +56,7 @@ #include "ntos/cdrom.h" #include "ntos/console.h" #include "ntos/disk.h" +#include "ntos/tape.h" #include "ntos/except.h" #include "ntos/file.h" #include "ntos/gditypes.h" diff --git a/reactos/include/ntos/tape.h b/reactos/include/ntos/tape.h new file mode 100644 index 00000000000..6d404652f5e --- /dev/null +++ b/reactos/include/ntos/tape.h @@ -0,0 +1,57 @@ +/* $Id: tape.h,v 1.1 2004/04/10 23:18:42 ekohl Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: include/ntos/tape.h + * PURPOSE: Tape drive definitions + * PROGRAMMER: Eric Kohl + */ + +#ifndef __INCLUDE_TAPE_H +#define __INCLUDE_TAPE_H + + +#define IOCTL_TAPE_BASE FILE_DEVICE_TAPE + +#define IOCTL_TAPE_CHECK_VERIFY \ + CTL_CODE(IOCTL_TAPE_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_TAPE_CREATE_PARTITION \ + CTL_CODE(IOCTL_TAPE_BASE, 0x000a, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_TAPE_ERASE \ + CTL_CODE(IOCTL_TAPE_BASE, 0x0000, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#define IOCTL_TAPE_FIND_NEW_DEVICES \ + CTL_CODE(IOCTL_DISK_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS) + +#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_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) + +#define IOCTL_TAPE_SET_MEDIA_PARAMS \ + CTL_CODE(IOCTL_TAPE_BASE, 0x0008, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_TAPE_SET_POSITION \ + CTL_CODE(IOCTL_TAPE_BASE, 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_TAPE_WRITE_MARKS \ + CTL_CODE(IOCTL_TAPE_BASE, 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + + +#endif /* __INCLUDE_TAPE_H */ diff --git a/reactos/include/structs.h b/reactos/include/structs.h index 4f67c872898..0282c164796 100644 --- a/reactos/include/structs.h +++ b/reactos/include/structs.h @@ -5285,65 +5285,74 @@ typedef struct _SYSTEM_POWER_STATUS { } SYSTEM_POWER_STATUS; typedef SYSTEM_POWER_STATUS *LPSYSTEM_POWER_STATUS; +typedef struct _TAPE_CREATE_PARTITION { + ULONG Method; + ULONG Count; + ULONG Size; +} TAPE_CREATE_PARTITION, *PTAPE_CREATE_PARTITION; + typedef struct _TAPE_ERASE { ULONG Type; -} TAPE_ERASE; + BOOLEAN Immediate; +} TAPE_ERASE, *PTAPE_ERASE; typedef struct _TAPE_GET_DRIVE_PARAMETERS { BOOLEAN ECC; BOOLEAN Compression; BOOLEAN DataPadding; BOOLEAN ReportSetmarks; - ULONG DefaultBlockSize; - ULONG MaximumBlockSize; - ULONG MinimumBlockSize; - ULONG MaximumPartitionCount; - ULONG FeaturesLow; - ULONG FeaturesHigh; - ULONG EOTWarningZoneSize; -} TAPE_GET_DRIVE_PARAMETERS; + ULONG DefaultBlockSize; + ULONG MaximumBlockSize; + ULONG MinimumBlockSize; + ULONG MaximumPartitionCount; + ULONG FeaturesLow; + ULONG FeaturesHigh; + ULONG EOTWarningZoneSize; +} TAPE_GET_DRIVE_PARAMETERS, *PTAPE_GET_DRIVE_PARAMETERS; typedef struct _TAPE_GET_MEDIA_PARAMETERS { - LARGE_INTEGER Capacity; - LARGE_INTEGER Remaining; - DWORD BlockSize; - DWORD PartitionCount; + LARGE_INTEGER Capacity; + LARGE_INTEGER Remaining; + ULONG BlockSize; + ULONG PartitionCount; BOOLEAN WriteProtected; -} TAPE_GET_MEDIA_PARAMETERS; +} TAPE_GET_MEDIA_PARAMETERS, *PTAPE_GET_MEDIA_PARAMETERS; typedef struct _TAPE_GET_POSITION { ULONG Type; ULONG Partition; LARGE_INTEGER Offset; -} TAPE_GET_POSITION; +} TAPE_GET_POSITION, *PTAPE_GET_POSITION; typedef struct _TAPE_PREPARE { ULONG Operation; -} TAPE_PREPARE; + BOOLEAN Immediate; +} TAPE_PREPARE, *PTAPE_PREPARE; typedef struct _TAPE_SET_DRIVE_PARAMETERS { BOOLEAN ECC; BOOLEAN Compression; BOOLEAN DataPadding; BOOLEAN ReportSetmarks; - ULONG EOTWarningZoneSize; -} TAPE_SET_DRIVE_PARAMETERS; + ULONG EOTWarningZoneSize; +} TAPE_SET_DRIVE_PARAMETERS, *PTAPE_SET_DRIVE_PARAMETERS; typedef struct _TAPE_SET_MEDIA_PARAMETERS { ULONG BlockSize; -} TAPE_SET_MEDIA_PARAMETERS; +} TAPE_SET_MEDIA_PARAMETERS, *PTAPE_SET_MEDIA_PARAMETERS; typedef struct _TAPE_SET_POSITION { ULONG Method; ULONG Partition; LARGE_INTEGER Offset; BOOLEAN Immediate; -} TAPE_SET_POSITION; +} TAPE_SET_POSITION, *PTAPE_SET_POSITION; typedef struct _TAPE_WRITE_MARKS { ULONG Type; ULONG Count; -} TAPE_WRITE_MARKS; + BOOLEAN Immediate; +} TAPE_WRITE_MARKS, *PTAPE_WRITE_MARKS; typedef struct { HINSTANCE hInst; diff --git a/reactos/lib/kernel32/file/tape.c b/reactos/lib/kernel32/file/tape.c index 25a25a09d71..37a8d022974 100644 --- a/reactos/lib/kernel32/file/tape.c +++ b/reactos/lib/kernel32/file/tape.c @@ -1,11 +1,10 @@ -/* $Id: tape.c,v 1.7 2004/01/23 21:16:03 ekohl Exp $ +/* $Id: tape.c,v 1.8 2004/04/10 23:20:17 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries * FILE: lib/kernel32/file/tape.c * PURPOSE: Tape functions * PROGRAMMER: Ariadne ( ariadne@xs4all.nl) - * GetTempFileName is modified from WINE [ Alexandre Juiliard ] * UPDATE HISTORY: * Created 01/11/98 */ @@ -20,151 +19,395 @@ /* FUNCTIONS ****************************************************************/ /* - * @unimplemented + * @implemented */ -DWORD -STDCALL -CreateTapePartition ( - HANDLE hDevice, - DWORD dwPartitionMethod, - DWORD dwCount, - DWORD dwSize - ) +DWORD STDCALL +CreateTapePartition (HANDLE hDevice, + DWORD dwPartitionMethod, + DWORD dwCount, + DWORD dwSize) { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; + TAPE_CREATE_PARTITION TapeCreatePartition; + IO_STATUS_BLOCK IoStatusBlock; + DWORD ErrorCode; + NTSTATUS Status; + + TapeCreatePartition.Method = dwPartitionMethod; + TapeCreatePartition.Count = dwCount; + TapeCreatePartition.Size = dwSize; + + Status = NtDeviceIoControlFile (hDevice, + NULL, + NULL, + NULL, + &IoStatusBlock, + IOCTL_TAPE_CREATE_PARTITION, + &TapeCreatePartition, + sizeof(TAPE_CREATE_PARTITION), + NULL, + 0); + if (!NT_SUCCESS(Status)) + { + ErrorCode = RtlNtStatusToDosError(Status); + SetLastError (ErrorCode); + return ErrorCode; + } + + return ERROR_SUCCESS; } /* - * @unimplemented + * @implemented */ -DWORD -STDCALL -EraseTape ( - HANDLE hDevice, - DWORD dwEraseType, - BOOL bImmediate - ) +DWORD STDCALL +EraseTape (HANDLE hDevice, + DWORD dwEraseType, + BOOL bImmediate) { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} + TAPE_ERASE TapeErase; + IO_STATUS_BLOCK IoStatusBlock; + DWORD ErrorCode; + NTSTATUS Status; -/* - * @unimplemented - */ -DWORD -STDCALL -GetTapeParameters ( - HANDLE hDevice, - DWORD dwOperation, - LPDWORD lpdwSize, - LPVOID lpTapeInformation - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; + TapeErase.Type = dwEraseType; + TapeErase.Immediate = (BOOLEAN)bImmediate; + + Status = NtDeviceIoControlFile (hDevice, + NULL, + NULL, + NULL, + &IoStatusBlock, + IOCTL_TAPE_ERASE, + &TapeErase, + sizeof(TAPE_ERASE), + NULL, + 0); + if (!NT_SUCCESS(Status)) + { + ErrorCode = RtlNtStatusToDosError(Status); + SetLastError (ErrorCode); + return ErrorCode; + } + + return ERROR_SUCCESS; } /* - * @unimplemented + * @implemented */ -DWORD -STDCALL -GetTapeStatus ( - HANDLE hDevice - ) +DWORD STDCALL +GetTapeParameters (HANDLE hDevice, + DWORD dwOperation, + LPDWORD lpdwSize, + LPVOID lpTapeInformation) { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; + IO_STATUS_BLOCK IoStatusBlock; + DWORD ErrorCode; + NTSTATUS Status; + + if (dwOperation == GET_TAPE_MEDIA_INFORMATION) + { + if (*lpdwSize < sizeof(TAPE_GET_MEDIA_PARAMETERS)) + { + *lpdwSize = sizeof(TAPE_GET_MEDIA_PARAMETERS); + return ERROR_MORE_DATA; + } + + Status = NtDeviceIoControlFile (hDevice, + NULL, + NULL, + NULL, + &IoStatusBlock, + IOCTL_TAPE_GET_MEDIA_PARAMS, + NULL, + 0, + lpTapeInformation, + sizeof(TAPE_GET_MEDIA_PARAMETERS)); + } + else if (dwOperation == GET_TAPE_DRIVE_INFORMATION) + { + if (*lpdwSize < sizeof(TAPE_GET_DRIVE_PARAMETERS)) + { + *lpdwSize = sizeof(TAPE_GET_DRIVE_PARAMETERS); + return ERROR_MORE_DATA; + } + + Status = NtDeviceIoControlFile (hDevice, + NULL, + NULL, + NULL, + &IoStatusBlock, + IOCTL_TAPE_GET_DRIVE_PARAMS, + NULL, + 0, + lpTapeInformation, + sizeof(TAPE_GET_DRIVE_PARAMETERS)); + } + else + { + return ERROR_INVALID_FUNCTION; + } + + if (!NT_SUCCESS(Status)) + { + ErrorCode = RtlNtStatusToDosError(Status); + SetLastError (ErrorCode); + return ErrorCode; + } + + return ERROR_SUCCESS; } /* - * @unimplemented + * @implemented */ -DWORD -STDCALL -PrepareTape ( - HANDLE hDevice, - DWORD dwOperation, - BOOL bImmediate - ) +DWORD STDCALL +GetTapePosition (HANDLE hDevice, + DWORD dwPositionType, + LPDWORD lpdwPartition, + LPDWORD lpdwOffsetLow, + LPDWORD lpdwOffsetHigh) { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; + TAPE_GET_POSITION TapeGetPosition; + IO_STATUS_BLOCK IoStatusBlock; + DWORD ErrorCode; + NTSTATUS Status; + + TapeGetPosition.Type = dwPositionType; + + Status = NtDeviceIoControlFile (hDevice, + NULL, + NULL, + NULL, + &IoStatusBlock, + IOCTL_TAPE_GET_POSITION, + &TapeGetPosition, + sizeof(TAPE_GET_POSITION), + &TapeGetPosition, + sizeof(TAPE_GET_POSITION)); + if (!NT_SUCCESS(Status)) + { + *lpdwPartition = 0; + *lpdwOffsetLow = 0; + *lpdwOffsetHigh = 0; + + ErrorCode = RtlNtStatusToDosError(Status); + SetLastError (ErrorCode); + return ErrorCode; + } + + *lpdwPartition = TapeGetPosition.Partition; + *lpdwOffsetLow = TapeGetPosition.Offset.u.LowPart; + *lpdwOffsetHigh = TapeGetPosition.Offset.u.HighPart; + + return ERROR_SUCCESS; } /* - * @unimplemented + * @implemented */ -DWORD -STDCALL -SetTapeParameters ( - HANDLE hDevice, - DWORD dwOperation, - LPVOID lpTapeInformation - ) +DWORD STDCALL +GetTapeStatus (HANDLE hDevice) { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; + IO_STATUS_BLOCK IoStatusBlock; + DWORD ErrorCode; + NTSTATUS Status; + + Status = NtDeviceIoControlFile (hDevice, + NULL, + NULL, + NULL, + &IoStatusBlock, + IOCTL_TAPE_GET_STATUS, + NULL, + 0, + NULL, + 0); + if (!NT_SUCCESS(Status)) + { + ErrorCode = RtlNtStatusToDosError(Status); + SetLastError (ErrorCode); + return ErrorCode; + } + + return ERROR_SUCCESS; } /* - * @unimplemented + * @implemented */ -DWORD -STDCALL -SetTapePosition ( - HANDLE hDevice, - DWORD dwPositionMethod, - DWORD dwPartition, - DWORD dwOffsetLow, - DWORD dwOffsetHigh, - BOOL bImmediate - ) +DWORD STDCALL +PrepareTape (HANDLE hDevice, + DWORD dwOperation, + BOOL bImmediate) { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; + TAPE_PREPARE TapePrepare; + IO_STATUS_BLOCK IoStatusBlock; + DWORD ErrorCode; + NTSTATUS Status; + + TapePrepare.Operation = dwOperation; + TapePrepare.Immediate = (BOOLEAN)bImmediate; + + Status = NtDeviceIoControlFile (hDevice, + NULL, + NULL, + NULL, + &IoStatusBlock, + IOCTL_TAPE_PREPARE, + &TapePrepare, + sizeof(TAPE_PREPARE), + NULL, + 0); + if (!NT_SUCCESS(Status)) + { + ErrorCode = RtlNtStatusToDosError(Status); + SetLastError (ErrorCode); + return ErrorCode; + } + + return ERROR_SUCCESS; } /* - * @unimplemented + * @implemented */ -DWORD -STDCALL -WriteTapemark ( - HANDLE hDevice, - DWORD dwTapemarkType, - DWORD dwTapemarkCount, - BOOL bImmediate - ) +DWORD STDCALL +SetTapeParameters (HANDLE hDevice, + DWORD dwOperation, + LPVOID lpTapeInformation) { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; + IO_STATUS_BLOCK IoStatusBlock; + DWORD ErrorCode; + NTSTATUS Status; + + if (dwOperation == SET_TAPE_MEDIA_INFORMATION) + { + Status = NtDeviceIoControlFile (hDevice, + NULL, + NULL, + NULL, + &IoStatusBlock, + IOCTL_TAPE_SET_MEDIA_PARAMS, + lpTapeInformation, + sizeof(TAPE_SET_MEDIA_PARAMETERS), + NULL, + 0); + } + else if (dwOperation == SET_TAPE_DRIVE_INFORMATION) + { + Status = NtDeviceIoControlFile (hDevice, + NULL, + NULL, + NULL, + &IoStatusBlock, + IOCTL_TAPE_SET_DRIVE_PARAMS, + lpTapeInformation, + sizeof(TAPE_SET_DRIVE_PARAMETERS), + NULL, + 0); + } + else + { + return ERROR_INVALID_FUNCTION; + } + + if (!NT_SUCCESS(Status)) + { + ErrorCode = RtlNtStatusToDosError(Status); + SetLastError (ErrorCode); + return ErrorCode; + } + + return ERROR_SUCCESS; } /* - * @unimplemented + * @implemented */ -DWORD -STDCALL -GetTapePosition ( - HANDLE hDevice, - DWORD dwPositionType, - LPDWORD lpdwPartition, - LPDWORD lpdwOffsetLow, - LPDWORD lpdwOffsetHigh - ) +DWORD STDCALL +SetTapePosition (HANDLE hDevice, + DWORD dwPositionMethod, + DWORD dwPartition, + DWORD dwOffsetLow, + DWORD dwOffsetHigh, + BOOL bImmediate) { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; + TAPE_SET_POSITION TapeSetPosition; + IO_STATUS_BLOCK IoStatusBlock; + DWORD ErrorCode; + NTSTATUS Status; + + TapeSetPosition.Method = dwPositionMethod; + TapeSetPosition.Partition = dwPartition; + TapeSetPosition.Offset.u.LowPart = dwOffsetLow; + TapeSetPosition.Offset.u.HighPart = dwOffsetHigh; + TapeSetPosition.Immediate = (BOOLEAN)bImmediate; + + Status = NtDeviceIoControlFile (hDevice, + NULL, + NULL, + NULL, + &IoStatusBlock, + IOCTL_TAPE_SET_POSITION, + &TapeSetPosition, + sizeof(TAPE_SET_POSITION), + NULL, + 0); + if (!NT_SUCCESS(Status)) + { + ErrorCode = RtlNtStatusToDosError(Status); + SetLastError (ErrorCode); + return ErrorCode; + } + + return ERROR_SUCCESS; +} + + +/* + * @implemented + */ +DWORD STDCALL +WriteTapemark (HANDLE hDevice, + DWORD dwTapemarkType, + DWORD dwTapemarkCount, + BOOL bImmediate) +{ + TAPE_WRITE_MARKS TapeWriteMarks; + IO_STATUS_BLOCK IoStatusBlock; + DWORD ErrorCode; + NTSTATUS Status; + + TapeWriteMarks.Type = dwTapemarkType; + TapeWriteMarks.Count = dwTapemarkCount; + TapeWriteMarks.Immediate = (BOOLEAN)bImmediate; + + Status = NtDeviceIoControlFile (hDevice, + NULL, + NULL, + NULL, + &IoStatusBlock, + IOCTL_TAPE_WRITE_MARKS, + &TapeWriteMarks, + sizeof(TAPE_WRITE_MARKS), + NULL, + 0); + if (!NT_SUCCESS(Status)) + { + ErrorCode = RtlNtStatusToDosError(Status); + SetLastError (ErrorCode); + return ErrorCode; + } + + return ERROR_SUCCESS; } /* EOF */ From b17d0f5101740774cad44d8b2027932310361ed2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sun, 11 Apr 2004 09:09:38 +0000 Subject: [PATCH 0832/1463] - Implement NULL module case for EngFindImageProcAddress - Add stubs for EngFindImageProcAddress()able not present yet svn path=/trunk/; revision=9079 --- reactos/subsys/win32k/ldr/loader.c | 75 ++++++- reactos/subsys/win32k/stubs/stubs.c | 328 ++++++++++++++++++++++++++++ 2 files changed, 402 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/ldr/loader.c b/reactos/subsys/win32k/ldr/loader.c index 0c1e42c846e..42522861329 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.15 2004/04/09 20:03:18 navaraf Exp $ +/* $Id: loader.c,v 1.16 2004/04/11 09:09:38 gvg Exp $ * */ @@ -151,6 +151,79 @@ EngFindImageProcAddress(IN HANDLE Module, PVOID Function; NTSTATUS Status; ANSI_STRING ProcNameString; + unsigned i; + static struct + { + PCSTR ProcName; + PVOID ProcAddress; + } + Win32kExports[] = + { + { "BRUSHOBJ_hGetColorTransform", BRUSHOBJ_hGetColorTransform }, + { "EngAlphaBlend", EngAlphaBlend }, + { "EngClearEvent", EngClearEvent }, + { "EngControlSprites", EngControlSprites }, + { "EngCreateEvent", EngCreateEvent }, + { "EngDeleteEvent", EngDeleteEvent }, + { "EngDeleteFile", EngDeleteFile }, + { "EngDeleteSafeSemaphore", EngDeleteSafeSemaphore }, + { "EngDeleteWnd", EngDeleteWnd }, + { "EngDitherColor", EngDitherColor }, + { "EngGetPrinterDriver", EngGetPrinterDriver }, + { "EngGradientFill", EngGradientFill }, + { "EngHangNotification", EngHangNotification }, + { "EngInitializeSafeSemaphore", EngInitializeSafeSemaphore }, + { "EngLockDirectDrawSurface", EngLockDirectDrawSurface }, + { "EngLpkInstalled", EngLpkInstalled }, + { "EngMapEvent", EngMapEvent }, + { "EngMapFile", EngMapFile }, + { "EngMapFontFileFD", EngMapFontFileFD }, + { "EngModifySurface", EngModifySurface }, + { "EngMovePointer", EngMovePointer }, + { "EngPlgBlt", EngPlgBlt }, + { "EngQueryDeviceAttribute", EngQueryDeviceAttribute }, + { "EngQueryPalette", EngQueryPalette }, + { "EngQuerySystemAttribute", EngQuerySystemAttribute }, + { "EngReadStateEvent", EngReadStateEvent }, + { "EngRestoreFloatingPointState", EngRestoreFloatingPointState }, + { "EngSaveFloatingPointState", EngSaveFloatingPointState }, + { "EngSetEvent", EngSetEvent }, + { "EngSetPointerShape", EngSetPointerShape }, + { "EngSetPointerTag", EngSetPointerTag }, + { "EngStretchBltROP", EngStretchBltROP }, + { "EngTransparentBlt", EngTransparentBlt }, + { "EngUnlockDirectDrawSurface", EngUnlockDirectDrawSurface }, + { "EngUnmapEvent", EngUnmapEvent }, + { "EngUnmapFile", EngUnmapFile }, + { "EngUnmapFontFileFD", EngUnmapFontFileFD }, + { "EngWaitForSingleObject", EngWaitForSingleObject }, + { "FONTOBJ_pfdg", FONTOBJ_pfdg }, + { "FONTOBJ_pjOpenTypeTablePointer", FONTOBJ_pjOpenTypeTablePointer }, + { "FONTOBJ_pQueryGlyphAttrs", FONTOBJ_pQueryGlyphAttrs }, + { "FONTOBJ_pwszFontFilePaths", FONTOBJ_pwszFontFilePaths }, + { "HeapVidMemAllocAligned", HeapVidMemAllocAligned }, + { "HT_Get8BPPMaskPalette", HT_Get8BPPMaskPalette }, + { "STROBJ_bEnumPositionsOnly", STROBJ_bEnumPositionsOnly }, + { "STROBJ_bGetAdvanceWidths", STROBJ_bGetAdvanceWidths }, + { "STROBJ_fxBreakExtra", STROBJ_fxBreakExtra }, + { "STROBJ_fxCharacterExtra", STROBJ_fxCharacterExtra }, + { "VidMemFree", VidMemFree }, + { "XLATEOBJ_hGetColorTransform", XLATEOBJ_hGetColorTransform } + }; + + if (NULL == Module) + { + DPRINT("Looking for win32k export %s\n", ProcName); + for (i = 0; i < sizeof(Win32kExports) / sizeof(Win32kExports[0]); i++) + { + if (0 == strcmp(ProcName, Win32kExports[i].ProcName)) + { + DPRINT("Found it index %u address %p\n", i, Win32kExports[i].ProcName); + return Win32kExports[i].ProcAddress; + } + } + return NULL; + } RtlInitAnsiString(&ProcNameString, ProcName); Status = LdrGetProcedureAddress(Module, &ProcNameString, diff --git a/reactos/subsys/win32k/stubs/stubs.c b/reactos/subsys/win32k/stubs/stubs.c index 9b1d98646da..f3ec22b3d4a 100644 --- a/reactos/subsys/win32k/stubs/stubs.c +++ b/reactos/subsys/win32k/stubs/stubs.c @@ -1263,3 +1263,331 @@ VidMemFree( { UNIMPLEMENTED; } + +/* + * @unimplemented + */ +HANDLE STDCALL +BRUSHOBJ_hGetColorTransform( + IN BRUSHOBJ *Brush) +{ + UNIMPLEMENTED; + return NULL; +} + +/* + * @unimplemented + */ +VOID STDCALL +EngClearEvent( + IN PEVENT Event) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +BOOL STDCALL +EngDeleteFile( + IN LPWSTR FileName) +{ + UNIMPLEMENTED; + return FALSE; +} + +/* + * @unimplemented + */ +VOID STDCALL +EngDeleteSafeSemaphore( + IN OUT ENGSAFESEMAPHORE *Semaphore) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +BOOL STDCALL +EngGetPrinterDriver( + IN HANDLE Printer, + IN LPWSTR Environment, + IN DWORD Level, + OUT BYTE *DrvInfo, + IN DWORD Buf, + OUT DWORD *Needed) +{ + UNIMPLEMENTED; + return FALSE; +} + +/* + * @unimplemented + */ +ULONG STDCALL +EngHangNotification( + IN HDEV Dev, + IN PVOID Reserved) +{ + UNIMPLEMENTED; + return EHN_ERROR; +} + +/* + * @unimplemented + */ +BOOL STDCALL +EngInitializeSafeSemaphore( + OUT ENGSAFESEMAPHORE *Semaphore) +{ + UNIMPLEMENTED; + return FALSE; +} + +/* + * @unimplemented + */ +PDD_SURFACE_LOCAL STDCALL +EngLockDirectDrawSurface( + IN HANDLE Surface) +{ + UNIMPLEMENTED; + return NULL; +} + +/* + * @unimplemented + */ +BOOL STDCALL +EngLpkInstalled() +{ + UNIMPLEMENTED; + return FALSE; +} + +/* + * @unimplemented + */ +PVOID STDCALL +EngMapFile( + IN LPWSTR Filename, + IN ULONG Size, + OUT ULONG_PTR *File) +{ + UNIMPLEMENTED; + return NULL; +} + +/* + * @unimplemented + */ +BOOL STDCALL +EngPlgBlt( + IN SURFOBJ *Dest, + IN SURFOBJ *Source, + IN SURFOBJ *Mask, + IN CLIPOBJ *Clip, + IN XLATEOBJ *Xlate, + IN COLORADJUSTMENT *ColorAdjustment, + IN POINTL *BrusOrigin, + IN POINTFIX *DestPoints, + IN RECTL *SourceRect, + IN POINTL *MaskPoint, + IN ULONG Mode) +{ + UNIMPLEMENTED; + return FALSE; +} + +/* + * @unimplemented + */ +BOOL STDCALL +EngQueryDeviceAttribute( + IN HDEV Device, + IN ENG_DEVICE_ATTRIBUTE Attribute, + IN VOID *In, + IN ULONG InSize, + OUT VOID *Out, + OUT ULONG OutSize) +{ + UNIMPLEMENTED; + return FALSE; +} + +/* + * @unimplemented + */ +LONG STDCALL +EngReadStateEvent( + IN PEVENT Event) +{ + UNIMPLEMENTED; + return 0; +} +BOOL STDCALL +EngStretchBltROP( + IN SURFOBJ *Dest, + IN SURFOBJ *Source, + IN SURFOBJ *Mask, + IN CLIPOBJ *Clip, + IN XLATEOBJ *Xlate, + IN COLORADJUSTMENT *ColorAdjustment, + IN POINTL *BrushOrigin, + IN RECTL *DestRect, + IN RECTL *SourceRect, + IN POINTL *MaskPoint, + IN ULONG Mode, + IN BRUSHOBJ *BrushObj, + IN DWORD ROP4) +{ + UNIMPLEMENTED; + return FALSE; +} + +/* + * @unimplemented + */ +BOOL STDCALL +EngUnlockDirectDrawSurface( + IN PDD_SURFACE_LOCAL Surface) +{ + UNIMPLEMENTED; + return FALSE; +} + +/* + * @unimplemented + */ +BOOL STDCALL +EngUnmapFile( + IN ULONG_PTR File) +{ + UNIMPLEMENTED; + return FALSE; +} + +/* + * @unimplemented + */ +FD_GLYPHSET * STDCALL +FONTOBJ_pfdg( + IN FONTOBJ *FontObj) +{ + UNIMPLEMENTED; + return NULL; +} + +/* + * @unimplemented + */ +PBYTE STDCALL +FONTOBJ_pjOpenTypeTablePointer( + IN FONTOBJ *FontObj, + IN ULONG Tag, + OUT ULONG *Table) +{ + UNIMPLEMENTED; + return NULL; +} + +/* + * @unimplemented + */ +PFD_GLYPHATTR STDCALL +FONTOBJ_pQueryGlyphAttrs( + IN FONTOBJ *FontObj, + IN ULONG Mode) +{ + UNIMPLEMENTED; + return NULL; +} + +/* + * @unimplemented + */ +LPWSTR STDCALL +FONTOBJ_pwszFontFilePaths( + IN FONTOBJ *FontObj, + OUT ULONG *PathLength) +{ + UNIMPLEMENTED; + return NULL; +} + +/* + * @unimplemented + */ +LONG STDCALL +HT_Get8BPPMaskPalette( + IN OUT LPPALETTEENTRY PaletteEntry, + IN BOOL Use8BPPMaskPal, + IN BYTE CMYMask, + IN USHORT RedGamma, + IN USHORT GreenGamma, + IN USHORT BlueGamma) +{ + UNIMPLEMENTED; + return 0; +} + +/* + * @unimplemented + */ +BOOL STDCALL +STROBJ_bEnumPositionsOnly( + IN STROBJ *StringObj, + OUT ULONG *Count, + OUT PGLYPHPOS *Pos) +{ + UNIMPLEMENTED; + return (BOOL) DDI_ERROR; +} + +/* + * @unimplemented + */ +BOOL STDCALL +STROBJ_bGetAdvanceWidths( + IN STROBJ *StringObj, + IN ULONG First, + IN ULONG Count, + OUT POINTQF *Widths) +{ + UNIMPLEMENTED; + return FALSE; +} + +/* + * @unimplemented + */ +FIX STDCALL +STROBJ_fxBreakExtra( + IN STROBJ *StringObj) +{ + UNIMPLEMENTED; + return (FIX) 0; +} + +/* + * @unimplemented + */ +FIX STDCALL +STROBJ_fxCharacterExtra( + IN STROBJ *StringObj) +{ + UNIMPLEMENTED; + return (FIX) 0; +} + +/* + * @unimplemented + */ +HANDLE STDCALL +XLATEOBJ_hGetColorTransform( + IN XLATEOBJ *XlateObj) +{ + UNIMPLEMENTED; + return NULL; +} From 45267ce58da40e36eca31193eec788881b4c0dbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sun, 11 Apr 2004 09:57:18 +0000 Subject: [PATCH 0833/1463] Bump version number svn path=/trunk/; revision=9080 --- reactos/include/reactos/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/include/reactos/version.h b/reactos/include/reactos/version.h index 00c68942cb4..e88122fa141 100644 --- a/reactos/include/reactos/version.h +++ b/reactos/include/reactos/version.h @@ -1,4 +1,4 @@ -/* $Id: version.h,v 1.20 2004/02/20 23:24:30 gvg Exp $ +/* $Id: version.h,v 1.21 2004/04/11 09:57:18 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -19,7 +19,7 @@ #define KERNEL_VERSION_MAJOR 0 #define KERNEL_VERSION_MINOR 2 -#define KERNEL_VERSION_PATCH_LEVEL 2 +#define KERNEL_VERSION_PATCH_LEVEL 3 /* KERNEL_VERSION_BUILD_TYPE is L"CVS", L"RC1", L"RC2" or L"FINAL" */ #define KERNEL_VERSION_BUILD_TYPE L"CVS" From e848449f540a9c3b7748281c1260b3f07552d525 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sun, 11 Apr 2004 13:24:29 +0000 Subject: [PATCH 0834/1463] correct IShellFolder::GetAttributesOf() for the case *dwAttributes=0 svn path=/trunk/; revision=9081 --- reactos/lib/shell32/cpanelfolder.c | 3 +++ reactos/lib/shell32/shfldr_desktop.c | 3 +++ reactos/lib/shell32/shfldr_fs.c | 3 +++ reactos/lib/shell32/shfldr_mycomp.c | 3 +++ 4 files changed, 12 insertions(+) diff --git a/reactos/lib/shell32/cpanelfolder.c b/reactos/lib/shell32/cpanelfolder.c index 99a3674700d..334c2da6f0e 100644 --- a/reactos/lib/shell32/cpanelfolder.c +++ b/reactos/lib/shell32/cpanelfolder.c @@ -556,6 +556,9 @@ ISF_ControlPanel_fnGetAttributesOf(IShellFolder2 * iface, UINT cidl, LPCITEMIDLI if ((!cidl) ||(!apidl) ||(!rgfInOut)) return E_INVALIDARG; + if (*rgfInOut == 0) + *rgfInOut = ~0; + while(cidl > 0 && *apidl) { pdump(*apidl); SHELL32_GetItemAttributes(_IShellFolder_(This), *apidl, rgfInOut); diff --git a/reactos/lib/shell32/shfldr_desktop.c b/reactos/lib/shell32/shfldr_desktop.c index 4559912a383..21cbee1e763 100644 --- a/reactos/lib/shell32/shfldr_desktop.c +++ b/reactos/lib/shell32/shfldr_desktop.c @@ -425,6 +425,9 @@ static HRESULT WINAPI ISF_Desktop_fnGetAttributesOf (IShellFolder2 * iface, if ((!cidl) || (!apidl) || (!rgfInOut)) return E_INVALIDARG; + if (*rgfInOut == 0) + *rgfInOut = ~0; + while (cidl > 0 && *apidl) { pdump (*apidl); SHELL32_GetItemAttributes (_IShellFolder_ (This), *apidl, rgfInOut); diff --git a/reactos/lib/shell32/shfldr_fs.c b/reactos/lib/shell32/shfldr_fs.c index 451df2112de..a38325816ff 100644 --- a/reactos/lib/shell32/shfldr_fs.c +++ b/reactos/lib/shell32/shfldr_fs.c @@ -509,6 +509,9 @@ IShellFolder_fnGetAttributesOf (IShellFolder2 * iface, UINT cidl, LPCITEMIDLIST if ((!cidl) || (!apidl) || (!rgfInOut)) return E_INVALIDARG; + if (*rgfInOut == 0) + *rgfInOut = ~0; + while (cidl > 0 && *apidl) { pdump (*apidl); SHELL32_GetItemAttributes (_IShellFolder_ (This), *apidl, rgfInOut); diff --git a/reactos/lib/shell32/shfldr_mycomp.c b/reactos/lib/shell32/shfldr_mycomp.c index bc6bf164d93..a9bb1946f28 100644 --- a/reactos/lib/shell32/shfldr_mycomp.c +++ b/reactos/lib/shell32/shfldr_mycomp.c @@ -407,6 +407,9 @@ ISF_MyComputer_fnGetAttributesOf (IShellFolder2 * iface, UINT cidl, LPCITEMIDLIS if ((!cidl) || (!apidl) || (!rgfInOut)) return E_INVALIDARG; + if (*rgfInOut == 0) + *rgfInOut = ~0; + while (cidl > 0 && *apidl) { pdump (*apidl); SHELL32_GetItemAttributes (_IShellFolder_ (This), *apidl, rgfInOut); From 73cb58e92243fd7644d6c71ae902686204cb2ea6 Mon Sep 17 00:00:00 2001 From: Jason Filby Date: Sun, 11 Apr 2004 13:39:59 +0000 Subject: [PATCH 0835/1463] Add missing include tchar.h svn path=/trunk/; revision=9082 --- reactos/apps/utils/net/roshttpd/config.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/apps/utils/net/roshttpd/config.cpp b/reactos/apps/utils/net/roshttpd/config.cpp index f928d344d20..f71df0214f0 100644 --- a/reactos/apps/utils/net/roshttpd/config.cpp +++ b/reactos/apps/utils/net/roshttpd/config.cpp @@ -11,6 +11,7 @@ #include #include #include +#include using namespace std; From f2d2a85374cee69374d67700da759adba1baa56c Mon Sep 17 00:00:00 2001 From: Jason Filby Date: Sun, 11 Apr 2004 15:31:21 +0000 Subject: [PATCH 0836/1463] Two DPRINTs for NtLoadDriver failure cases svn path=/trunk/; revision=9083 --- reactos/ntoskrnl/io/driver.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/io/driver.c b/reactos/ntoskrnl/io/driver.c index d154dabd16c..6cc79fb9c26 100644 --- a/reactos/ntoskrnl/io/driver.c +++ b/reactos/ntoskrnl/io/driver.c @@ -1,4 +1,4 @@ -/* $Id: driver.c,v 1.43 2004/03/28 17:08:55 navaraf Exp $ +/* $Id: driver.c,v 1.44 2004/04/11 15:31:21 jfilby Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1515,7 +1515,10 @@ NtLoadDriver(IN PUNICODE_STRING DriverServiceName) */ if (!SeSinglePrivilegeCheck(SeLoadDriverPrivilege, KeGetPreviousMode())) + { + DPRINT("Privilege not held\n"); return STATUS_PRIVILEGE_NOT_HELD; + } RtlInitUnicodeString(&ImagePath, NULL); @@ -1579,6 +1582,7 @@ NtLoadDriver(IN PUNICODE_STRING DriverServiceName) ModuleObject = LdrGetModuleObject(&ImagePath); if (ModuleObject != NULL) { + DPRINT("Image already loaded\n"); return STATUS_IMAGE_ALREADY_LOADED; } From 763fb168d144ce9d21fa5741e496125dd2f052c2 Mon Sep 17 00:00:00 2001 From: Jason Filby Date: Sun, 11 Apr 2004 16:09:11 +0000 Subject: [PATCH 0837/1463] AcquireLoadDriverPrivilege() to fix problem with SCM not being able to load drivers. Patch by Filip Navara. svn path=/trunk/; revision=9084 --- reactos/subsys/system/services/database.c | 5 +++-- reactos/subsys/system/services/services.c | 26 +++++++++++++++++++++-- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/reactos/subsys/system/services/database.c b/reactos/subsys/system/services/database.c index 85d9417c00d..486c4c70dc0 100644 --- a/reactos/subsys/system/services/database.c +++ b/reactos/subsys/system/services/database.c @@ -1,4 +1,4 @@ -/* $Id: database.c,v 1.12 2003/11/17 02:12:51 hyperion Exp $ +/* $Id: database.c,v 1.13 2004/04/11 16:09:11 jfilby Exp $ * * service control manager * @@ -34,7 +34,7 @@ #include "services.h" -#define NDEBUG +//#define NDEBUG #include @@ -461,6 +461,7 @@ ScmStartService(PSERVICE Service, DPRINT("ScmStartService() called\n"); Service->ControlPipeHandle = INVALID_HANDLE_VALUE; + DPRINT("Service->Type: %u\n", Service->Type); if (Service->Type == SERVICE_KERNEL_DRIVER || Service->Type == SERVICE_FILE_SYSTEM_DRIVER || diff --git a/reactos/subsys/system/services/services.c b/reactos/subsys/system/services/services.c index 547b204418f..1638132ff4b 100644 --- a/reactos/subsys/system/services/services.c +++ b/reactos/subsys/system/services/services.c @@ -1,4 +1,4 @@ -/* $Id: services.c,v 1.13 2003/11/15 15:08:32 gvg Exp $ +/* $Id: services.c,v 1.14 2004/04/11 16:09:11 jfilby Exp $ * * service control manager * @@ -36,7 +36,7 @@ #include "services.h" -#define NDEBUG +//#define NDEBUG #include @@ -243,6 +243,25 @@ BOOL StartScmNamedPipeThreadListener(void) return TRUE; } +VOID FASTCALL +AcquireLoadDriverPrivilege(VOID) +{ + HANDLE hToken; + TOKEN_PRIVILEGES tkp; + + /* Get a token for this process. */ + if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { + /* Get the LUID for the debug privilege. */ + LookupPrivilegeValue(NULL, SE_LOAD_DRIVER_NAME, &tkp.Privileges[0].Luid); + + tkp.PrivilegeCount = 1; /* one privilege to set */ + tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + + /* Get the debug privilege for this process. */ + AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); + } +} + int STDCALL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, @@ -255,6 +274,9 @@ WinMain(HINSTANCE hInstance, DPRINT("SERVICES: Service Control Manager\n"); + /* Acquire privileges to load drivers */ + AcquireLoadDriverPrivilege(); + /* Create start event */ if (!ScmCreateStartEvent(&hScmStartEvent)) { From e2c7015e0a9d95d3cfc5cd943a64c8a6b1e13cf0 Mon Sep 17 00:00:00 2001 From: Jason Filby Date: Sun, 11 Apr 2004 16:10:05 +0000 Subject: [PATCH 0838/1463] Reenable NDEBUG svn path=/trunk/; revision=9085 --- reactos/subsys/system/services/database.c | 4 ++-- reactos/subsys/system/services/services.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/subsys/system/services/database.c b/reactos/subsys/system/services/database.c index 486c4c70dc0..e3185364881 100644 --- a/reactos/subsys/system/services/database.c +++ b/reactos/subsys/system/services/database.c @@ -1,4 +1,4 @@ -/* $Id: database.c,v 1.13 2004/04/11 16:09:11 jfilby Exp $ +/* $Id: database.c,v 1.14 2004/04/11 16:10:05 jfilby Exp $ * * service control manager * @@ -34,7 +34,7 @@ #include "services.h" -//#define NDEBUG +#define NDEBUG #include diff --git a/reactos/subsys/system/services/services.c b/reactos/subsys/system/services/services.c index 1638132ff4b..d1a0a08e4ce 100644 --- a/reactos/subsys/system/services/services.c +++ b/reactos/subsys/system/services/services.c @@ -1,4 +1,4 @@ -/* $Id: services.c,v 1.14 2004/04/11 16:09:11 jfilby Exp $ +/* $Id: services.c,v 1.15 2004/04/11 16:10:05 jfilby Exp $ * * service control manager * @@ -36,7 +36,7 @@ #include "services.h" -//#define NDEBUG +#define NDEBUG #include From 968753f694e6e3208d6e6f73aa2248fa68e546b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sun, 11 Apr 2004 16:51:56 +0000 Subject: [PATCH 0839/1463] Add fastinstall target which copies the files but doesn't rebuild the registry svn path=/trunk/; revision=9086 --- reactos/Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/Makefile b/reactos/Makefile index 7fac3df5588..f26b858df35 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.215 2004/04/09 18:27:10 weiden Exp $ +# $Id: Makefile,v 1.216 2004/04/11 16:51:56 gvg Exp $ # # Global makefile # @@ -142,13 +142,13 @@ clean: tools dk_clean $(HALS:%=%_clean) \ clean_after: $(RM) $(PATH_TO_TOP)/include/roscfg.h -install: tools install_dirs install_before \ +fastinstall: tools install_dirs install_before \ $(COMPONENTS:%=%_install) $(HALS:%=%_install) $(BUS:%=%_install) \ $(LIB_STATIC:%=%_install) $(LIB_FSLIB:%=%_install) $(DLLS:%=%_install) $(LOADERS:%=%_install) \ $(KERNEL_DRIVERS:%=%_install) $(SUBSYS:%=%_install) \ $(SYS_APPS:%=%_install) $(SYS_SVC:%=%_install) \ - $(APPS:%=%_install) $(EXT_MODULES:%=%_install) $(REGTESTS:%=%_install) \ - registry + $(APPS:%=%_install) $(EXT_MODULES:%=%_install) $(REGTESTS:%=%_install) +install: fastinstall registry FREELDR_DIR = ../freeldr From 1ff2de0b1ab0f93d952be076991ae9d9575f27bf Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sun, 11 Apr 2004 19:21:43 +0000 Subject: [PATCH 0840/1463] - Implement LookupPrivilegeValueW. svn path=/trunk/; revision=9087 --- reactos/lib/advapi32/sec/misc.c | 39 ++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/reactos/lib/advapi32/sec/misc.c b/reactos/lib/advapi32/sec/misc.c index 069c76eed77..510de48f568 100644 --- a/reactos/lib/advapi32/sec/misc.c +++ b/reactos/lib/advapi32/sec/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.12 2004/03/25 11:30:07 ekohl Exp $ +/* $Id: misc.c,v 1.13 2004/04/11 19:21:43 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -421,14 +421,47 @@ LookupPrivilegeValueA (LPCSTR lpSystemName, /********************************************************************** * LookupPrivilegeValueW EXPORTED * - * @unimplemented + * @implemented */ BOOL STDCALL LookupPrivilegeValueW (LPCWSTR lpSystemName, LPCWSTR lpName, PLUID lpLuid) { - SetLastError (ERROR_CALL_NOT_IMPLEMENTED); + static LPCWSTR DefaultPrivilegeNames[] = + { + NULL, NULL, + L"SeCreateTokenPrivilege", L"SeAssignPrimaryTokenPrivilege", + L"SeLockMemoryPrivilege", L"SeIncreaseQuotaPrivilege", + 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", + }; + static unsigned DefaultPrivilegeCount = + sizeof(DefaultPrivilegeNames) / sizeof(DefaultPrivilegeNames[0]); + int i; + + for (i = 0; i < DefaultPrivilegeCount; i++) + { + if (!DefaultPrivilegeNames[i] || + lstrcmpW(DefaultPrivilegeNames[i], lpName)) + { + continue; + } + + lpLuid->LowPart = i; + lpLuid->HighPart = 0; + + return TRUE; + } + return FALSE; } From 2a1a6cbf858125bef7db662977097cc77aa94982 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Mon, 12 Apr 2004 07:37:08 +0000 Subject: [PATCH 0841/1463] simplified chinese resources by Larry Li svn path=/trunk/; revision=9089 --- .../subsys/system/explorer/explorer_intres.rc | 393 +++++++++++++++++- 1 file changed, 392 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/system/explorer/explorer_intres.rc b/reactos/subsys/system/explorer/explorer_intres.rc index 4c8e02f1a86..5222c1f0ba3 100644 --- a/reactos/subsys/system/explorer/explorer_intres.rc +++ b/reactos/subsys/system/explorer/explorer_intres.rc @@ -12,6 +12,397 @@ ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// Chinese (P.R.C.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) +#ifdef _WIN32 +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED +#pragma code_page(936) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_DESKTOPBAR MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "设置(&S)...", ID_DESKTOPBAR_SETTINGS + MENUITEM "任务管理器(&T)...", ID_TASKMGR + MENUITEM SEPARATOR + MENUITEM "关于浏览器(&A)...", ID_ABOUT_EXPLORER + END +END + +IDM_MAINFRAME MENU PRELOAD DISCARDABLE +BEGIN + POPUP "文件(&F)" + BEGIN + MENUITEM "退出(&X)", ID_FILE_EXIT + END + POPUP "查看(&V)" + BEGIN + MENUITEM "工具栏(&T)", ID_VIEW_TOOL_BAR + MENUITEM "附加栏(&E)", ID_VIEW_EXTRA_BAR + MENUITEM "驱动器栏(&D)", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "侧边栏(&S)", ID_VIEW_SIDE_BAR + MENUITEM "状态栏(&S)", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "全屏(&U)\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + END + POPUP "窗口(&W)" + BEGIN + MENUITEM "新窗口(&W)", ID_WINDOW_NEW + MENUITEM "层叠排列(&C)\tShift+F5", ID_WINDOW_CASCADE + MENUITEM "横向平铺(&H)", ID_WINDOW_TILE_HORZ + MENUITEM "纵向平铺(&V)\tShift+F4", ID_WINDOW_TILE_VERT + MENUITEM "自动排列(&A)", ID_WINDOW_AUTOSORT + MENUITEM "全部最小化(&S)", ID_WINDOW_ARRANGE + MENUITEM "刷新(&R)\tF5", ID_REFRESH + END + POPUP "帮助(&H)" + BEGIN + MENUITEM "浏览器帮助文档(&F)...", ID_EXPLORER_FAQ + MENUITEM "关于浏览器(&A)...", ID_ABOUT_EXPLORER + MENUITEM "关于操作系统(&O)...", ID_ABOUT_WINDOWS + END +END + +IDM_NOTIFYAREA MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "显示隐藏图标(&S)", ID_SHOW_HIDDEN_ICONS + MENUITEM "配置任务栏通知区(&C)...", ID_CONFIG_NOTIFYAREA + MENUITEM "设置日期/时间(&T)...", ID_CONFIG_TIME + MENUITEM SEPARATOR + MENUITEM "关于浏览器(&A)...", ID_ABOUT_EXPLORER + END +END + +IDM_VOLUME MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "打开音量控制", ID_TRAY_VOLUME + MENUITEM "调整音频属性", ID_VOLUME_PROPERTIES + END +END + +IDM_WINEFILE MENU FIXED IMPURE +BEGIN + POPUP "文件(&F)" + BEGIN + MENUITEM "打开(&O)\tEnter", 101 + MENUITEM "移动(&M)...\tF7", 106 + MENUITEM "复制(&C)...\tF8", 107 + MENUITEM "从剪贴板(&I)...\tF9", 118 + MENUITEM "删除(&D)\tDel", 108 + MENUITEM "重命名(&N)...", 109 + MENUITEM "属性(&I)...\tAlt+Enter", ID_EDIT_PROPERTIES + MENUITEM SEPARATOR + MENUITEM "压缩(&O)...", 119 + MENUITEM "解压(&O)...", 120 + MENUITEM SEPARATOR + MENUITEM "运行(&R)...", ID_EXECUTE + MENUITEM "打印(&P)...", 102 + MENUITEM "关联(GA)...", 103 + MENUITEM SEPARATOR + MENUITEM "创建目录(&E)...", ID_EXECUTE + MENUITEM "搜索(&H)...", 104 + MENUITEM "选定文件(&S)...", 116 + MENUITEM SEPARATOR + MENUITEM "退出(&X)\tAlt+X", ID_FILE_EXIT + END + POPUP "磁盘(&D)" + BEGIN + MENUITEM "复制磁盘(&C)...", 201 + MENUITEM "标注磁盘(&L)...", 202 + MENUITEM SEPARATOR + MENUITEM "格式化磁盘(&F)...", 203 + MENUITEM SEPARATOR + MENUITEM "映射网络驱动器(&N)", 252 + MENUITEM "断开网络驱动器(&D)", 253 + MENUITEM SEPARATOR + MENUITEM "共享为...", 254 + MENUITEM "移除共享(&R)...", 255 + MENUITEM SEPARATOR + MENUITEM "选择驱动器(&S)...", 251 + END + POPUP "目录树(&T)" + BEGIN + MENUITEM "展开一层(&X)\t+", 301 + MENUITEM "展开分支(&B)\t*", 302 + MENUITEM "展开全部(&A)\tStrg+*", 303 + MENUITEM "折叠分支(&C)\t-", 304 + MENUITEM SEPARATOR + MENUITEM "表明可展开的分支(&I)", 505 + END + POPUP "查看(&V)" + BEGIN + MENUITEM "目录树与目录(&R)", 413 + MENUITEM "目录树(&E)", 411 + MENUITEM "目录(&O)", 412 + MENUITEM SEPARATOR + MENUITEM "拆分(&L)", 414 + MENUITEM SEPARATOR + MENUITEM "名称(&N)", ID_VIEW_NAME + MENUITEM "文件的全部详细资料(&A)", ID_VIEW_ALL_ATTRIBUTES + , CHECKED + MENUITEM "部分详细资料(&P)...", ID_VIEW_SELECTED_ATTRIBUTES + MENUITEM SEPARATOR + MENUITEM "按名称排序(&S)", 404 + MENUITEM "按类型排序(&B)", 405 + MENUITEM "按大小排序(&Z)", 406 + MENUITEM "按日期排序(&D)", 407 + MENUITEM SEPARATOR + MENUITEM "按文件类型(&T)...", 409 + END + POPUP "选项(&O)" + BEGIN + MENUITEM "确认(&C)...", 65535 + MENUITEM "字体(&F)...", 65535 + MENUITEM "自定义工具栏(&B)...", 65535 + MENUITEM SEPARATOR + MENUITEM "工具栏(&T)", ID_VIEW_TOOL_BAR, CHECKED + MENUITEM "驱动器栏(&D)", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "状态栏(&S)", ID_VIEW_STATUSBAR, CHECKED + MENUITEM "全屏幕(&U)\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM SEPARATOR + MENUITEM "自动缩成图标(&M)", 65535 + MENUITEM "退出时保存设定值(&E)", 511 + END + POPUP "&Security" + BEGIN + MENUITEM "&Access...", 605 + MENUITEM "&Logging...", 606 + MENUITEM "&Owner...", 607 + END + POPUP "窗口(&W)" + BEGIN + MENUITEM "新窗口(&N)", ID_WINDOW_NEW + MENUITEM "层叠(&C)\tCtrl+F5", ID_WINDOW_CASCADE + MENUITEM "水平平铺(&H)", ID_WINDOW_TILE_HORZ + MENUITEM "垂直平铺(&T)\tCtrl+F4", ID_WINDOW_TILE_VERT + MENUITEM "自动排列", ID_WINDOW_AUTOSORT + MENUITEM "重排图标(&A)", ID_WINDOW_ARRANGE + MENUITEM "刷新(&R)\tF5", ID_REFRESH + END + POPUP "&?" + BEGIN + MENUITEM "帮助主题(&H)\tF1", ID_HELP + MENUITEM "帮助搜索(&S)...\tF1", ID_HELP + MENUITEM "使用帮助(&U)\tF1", ID_HELP_USING + MENUITEM SEPARATOR + MENUITEM "关于文件管理器(&A)...", ID_ABOUT_WINEFILE + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 172 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "桌面属性" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Please select your prefered icon alignment algorithm:", + IDC_STATIC,7,7,166,8 + CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,25,46,44 + CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,25,46,44 + CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,25,46,44 + CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,25,46,44 + CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,73,46,44 + CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,73,46,44 + CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,73,46,44 + CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,73,46,44 + CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,121,46,44 + CONTROL "border 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 "Display &Version Number",ID_DESKTOP_VERSION,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10 +END + +IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "开始菜单属性" +FONT 8, "MS Sans Serif" +BEGIN +END + +IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "任务栏属性" +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "显示时钟(&C)",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,152,52,10 + CONTROL "隐藏不活动的通知区图标(&H)",ID_HIDE_INACTIVE_ICONS, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,174,111,10 + PUSHBUTTON "任务栏通知区(&N)...",ID_CONFIG_NOTIFYAREA,153,173,50,14 +END + +IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "运行" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,162,10 + CONTROL "命令(&C):",-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 "确定(&O)",1,158,6,47,14 + PUSHBUTTON "取消(&C)",2,158,23,47,14 + PUSHBUTTON "帮助(&H)",254,158,43,47,14 +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 "配置通知区图标" +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 "提示文字(&T):",IDC_LABEL1,7,44,40,8 + EDITTEXT IDC_NOTIFY_TOOLTIP,55,42,145,14,ES_AUTOHSCROLL + LTEXT "窗口标题(&I):",IDC_LABEL2,7,63,44,8 + EDITTEXT IDC_NOTIFY_TITLE,55,60,145,14,ES_AUTOHSCROLL + LTEXT "模块路径(&M):",IDC_LABEL3,7,81,43,8 + EDITTEXT IDC_NOTIFY_MODULE,55,78,145,14,ES_AUTOHSCROLL + GROUPBOX "显示模式(&D)",IDC_LABEL4,7,95,157,28 + CONTROL "显示(&S)",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,15,107,33,10 + CONTROL "隐藏(&H)",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON, + 66,107,29,10 + CONTROL "自动隐藏(&U)",IDC_NOTIFY_AUTOHIDE,"Button", + BS_AUTORADIOBUTTON,112,107,43,10 + ICON "",IDC_PICTURE,173,100,20,20 + CONTROL "显示被隐藏的(&W)",ID_SHOW_HIDDEN_ICONS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,131,56,10 + DEFPUSHBUTTON "确定(&O)",IDOK,91,129,50,14,WS_GROUP + PUSHBUTTON "取消(&C)",IDCANCEL,150,129,50,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 "在开始菜单搜索程序" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "&Filter:",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,185,33 + PUSHBUTTON "&Check Entries",IDC_CHECK_ENTRIES,143,7,50,14 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO DISCARDABLE +BEGIN + IDD_SEARCH_PROGRAM, DIALOG + BEGIN + RIGHTMARGIN, 193 + BOTTOMMARGIN, 58 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "Reactos 浏览器" + IDS_START "开始" + IDS_LOGOFF "注销..." + IDS_SHUTDOWN "关闭..." + IDS_LAUNCH "运行..." + IDS_START_HELP "帮助" + IDS_SEARCH_FILES "搜索..." + IDS_DOCUMENTS "我的文档" + IDS_FAVORITES "收藏夹" + IDS_PROGRAMS "程序" + IDS_SETTINGS "设置" + IDS_EXPLORE "浏览器" + IDS_EMPTY "(空)" + IDS_RECENT "最近的文档" + IDS_ADMIN "管理工具" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "网络" + IDS_CONNECTIONS "网络连接" + IDS_DRIVES "驱动器" + IDS_SEARCH_COMPUTER "搜索计算机..." + IDS_SETTINGS_MENU "设置菜单" + IDS_CONTROL_PANEL "控制面板" + IDS_PRINTERS "打印机" + IDS_BROWSE "浏览文件" + IDS_SEARCH_PRG "搜索程序..." + IDS_ALL_USERS "All Users\\" + IDS_SEARCH "搜索" + IDS_ABOUT_EXPLORER "关于浏览器(&A)..." + IDS_LAUNCH_MANY_PROGRAMS + "请选择一个以上的应用程序。\n确定要运行这些程序么?" + IDS_DESKTOPBAR_SETTINGS "桌面设置" + IDS_DESKTOP "桌面" + IDS_TASKBAR "任务栏" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "开始菜单" + IDS_MINIMIZE_ALL "最小化所有窗口" + IDS_DESKTOP_NUM "桌面 %d" + IDS_VOLUME "音量" + IDS_ITEMS_CUR "当前项目" + IDS_ITEMS_CONFIGURED "配置" + IDS_ITEMS_VISIBLE "可见" + IDS_ITEMS_HIDDEN "隐藏" + IDS_NOTIFY_SHOW "显示" + IDS_NOTIFY_HIDE "隐藏" + IDS_NOTIFY_AUTOHIDE "自动隐藏" +END + +#endif // Chinese (P.R.C.) resources +///////////////////////////////////////////////////////////////////////////// + + ///////////////////////////////////////////////////////////////////////////// // Romanian resources @@ -763,7 +1154,7 @@ STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME EXSTYLE WS_EX_APPWINDOW CAPTION "Search Program in Startmenu" -FONT 8, "MS Sans Serif" +FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN LTEXT "&Filter:",IDC_STATIC,7,9,18,8 EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL From 387d641ed536880deca0d7bf324f7536bafbbe29 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Mon, 12 Apr 2004 07:38:17 +0000 Subject: [PATCH 0842/1463] optimize favorites sidebar svn path=/trunk/; revision=9090 --- .../system/explorer/shell/filechild.cpp | 86 ++++++++++++++----- .../subsys/system/explorer/shell/filechild.h | 6 +- .../system/explorer/shell/mainframe.cpp | 12 +-- .../system/explorer/shell/shellbrowser.cpp | 9 +- .../subsys/system/explorer/shell/shellfs.cpp | 10 ++- .../subsys/system/explorer/utility/utility.h | 8 +- 6 files changed, 90 insertions(+), 41 deletions(-) diff --git a/reactos/subsys/system/explorer/shell/filechild.cpp b/reactos/subsys/system/explorer/shell/filechild.cpp index 52454d364c5..80f9ef6ac86 100644 --- a/reactos/subsys/system/explorer/shell/filechild.cpp +++ b/reactos/subsys/system/explorer/shell/filechild.cpp @@ -136,20 +136,20 @@ FileChildWindow::FileChildWindow(HWND hwnd, const FileChildWndInfo& info) _right = NULL; switch(info._etype) { - case ET_SHELL: { //@@ evtl. Aufteilung von FileChildWindow in ShellChildWindow, WinChildWindow, UnixChildWindow + case ET_SHELL: { //@@ separate into FileChildWindow in ShellChildWindow, WinChildWindow, UnixChildWindow ? _root._drive_type = DRIVE_UNKNOWN; lstrcpy(drv, TEXT("\\")); lstrcpy(_root._volname, TEXT("Desktop")); _root._fs_flags = 0; lstrcpy(_root._fs, TEXT("Shell")); - const ShellChildWndInfo& shell_info = static_cast(info); _root._entry = new ShellDirectory(GetDesktopFolder(), DesktopFolderPath(), hwnd); + const ShellChildWndInfo& shell_info = static_cast(info); entry = _root._entry->read_tree((LPCTSTR)&*shell_info._shell_path, SORT_NAME); break;} #ifdef __WINE__ - case ET_UNIX: { + case ET_UNIX: _root._drive_type = GetDriveType(info._path); _tsplitpath(info._path, drv, NULL, NULL, NULL); @@ -160,8 +160,7 @@ FileChildWindow::FileChildWindow(HWND hwnd, const FileChildWndInfo& info) lstrcpy(_root._path, TEXT("/")); _root._entry = new UnixDirectory(_root._path); entry = _root._entry->read_tree(info._path, SORT_NAME); - break;} - + break; #endif case ET_NTOBJS: @@ -235,22 +234,22 @@ FileChildWindow::FileChildWindow(HWND hwnd, const FileChildWndInfo& info) _header_wdths_ok = false; if (entry) - set_curdir(entry, hwnd); + set_curdir(entry); if (_left_hwnd) { int idx = ListBox_FindItemData(_left_hwnd, ListBox_GetCurSel(_left_hwnd), _left->_cur); ListBox_SetCurSel(_left_hwnd, idx); + + ///@todo scroll to visibility } - ///@todo scroll to visibility - // store path into history - if (*info._path) + if (info._path && *info._path) _url_history.push(info._path); } -void FileChildWindow::set_curdir(Entry* entry, HWND hwnd) +void FileChildWindow::set_curdir(Entry* entry) { CONTEXT("FileChildWindow::set_curdir()"); @@ -262,7 +261,7 @@ void FileChildWindow::set_curdir(Entry* entry, HWND hwnd) if (entry) { if (!entry->_scanned) - scan_entry(entry, hwnd); + scan_entry(entry); else { ListBox_ResetContent(_right_hwnd); _right->insert_entries(entry->_down, -1); @@ -273,8 +272,8 @@ void FileChildWindow::set_curdir(Entry* entry, HWND hwnd) entry->get_path(_path); } - if (hwnd) // only change window title, if the window already exists - SetWindowText(hwnd, _path); + if (_hwnd) // only change window title if the window already exists + SetWindowText(_hwnd, _path); if (_path[0]) if (SetCurrentDirectory(_path)) @@ -459,14 +458,14 @@ LRESULT FileChildWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) case ID_REFRESH: {CONTEXT("ID_REFRESH"); bool expanded = _left->_cur->_expanded; - scan_entry(_left->_cur, _hwnd); + scan_entry(_left->_cur); if (expanded) expand_entry(_left->_cur); break;} case ID_ACTIVATE: {CONTEXT("ID_ACTIVATE"); - activate_entry(pane, _hwnd); + activate_entry(pane); break;} default: @@ -536,13 +535,13 @@ int FileChildWindow::Command(int id, int code) Entry* entry = (Entry*) ListBox_GetItemData(*pane, idx); if (pane == _left) - set_curdir(entry, _hwnd); + set_curdir(entry); else pane->_cur = entry; break;} case LBN_DBLCLK: - activate_entry(pane, _hwnd); + activate_entry(pane); break; } @@ -550,7 +549,7 @@ int FileChildWindow::Command(int id, int code) } -void FileChildWindow::activate_entry(Pane* pane, HWND hwnd) +void FileChildWindow::activate_entry(Pane* pane) { Entry* entry = pane->_cur; @@ -563,7 +562,7 @@ void FileChildWindow::activate_entry(Pane* pane, HWND hwnd) int scanned_old = entry->_scanned; if (!scanned_old) - scan_entry(entry, hwnd); + scan_entry(entry); if (entry->_data.cFileName[0]==TEXT('.') && entry->_data.cFileName[1]==TEXT('\0')) return; @@ -580,7 +579,8 @@ void FileChildWindow::activate_entry(Pane* pane, HWND hwnd) if (!pane->_treePane) focus_entry: { int idx = ListBox_FindItemData(_left_hwnd, ListBox_GetCurSel(_left_hwnd), entry); ListBox_SetCurSel(_left_hwnd, idx); - set_curdir(entry, _hwnd); + + set_curdir(entry); } } @@ -595,7 +595,7 @@ void FileChildWindow::activate_entry(Pane* pane, HWND hwnd) } -void FileChildWindow::scan_entry(Entry* entry, HWND hwnd) +void FileChildWindow::scan_entry(Entry* entry) { CONTEXT("FileChildWindow::scan_entry()"); @@ -646,9 +646,49 @@ String FileChildWindow::jump_to_int(LPCTSTR url) String dir, fname; if (SplitFileSysURL(url, dir, fname)) { - //@@jump_to(path); + Entry* entry = NULL; - return FmtString(TEXT("file://%s"), (LPCTSTR)dir); + if (_root._entry) + switch(_root._entry->_etype) { + case ET_SHELL: { //@@ separate into FileChildWindow in ShellChildWindow, WinChildWindow, UnixChildWindow ? + ShellPath shell_path(dir); + entry = _root._entry->read_tree((LPCTSTR)&*shell_path, SORT_NAME); + break;} + +#ifdef __WINE__ + case ET_UNIX: + entry = _root._entry->read_tree(info._path, SORT_NAME); + break; +#endif + + case ET_NTOBJS: + entry = _root._entry->read_tree(dir, SORT_NAME); + break; + + case ET_REGISTRY: + entry = _root._entry->read_tree(dir, SORT_NONE); + break; + + case ET_FAT: { + entry = _root._entry->read_tree(dir, SORT_NONE); + break;} + + default: // ET_WINDOWS + entry = _root._entry->read_tree(dir, SORT_NAME); //@@ smart_scan() ?! + } + + if (entry) { + set_curdir(entry); + + if (_left_hwnd) { + int idx = ListBox_FindItemData(_left_hwnd, ListBox_GetCurSel(_left_hwnd), entry); + ListBox_SetCurSel(_left_hwnd, idx); + + ///@todo scroll to visibility + } + + return FmtString(TEXT("file://%s"), (LPCTSTR)dir); + } } return String(); diff --git a/reactos/subsys/system/explorer/shell/filechild.h b/reactos/subsys/system/explorer/shell/filechild.h index ad752d35c8e..b247265706a 100644 --- a/reactos/subsys/system/explorer/shell/filechild.h +++ b/reactos/subsys/system/explorer/shell/filechild.h @@ -101,13 +101,13 @@ protected: virtual void resize_children(int cx, int cy); virtual String jump_to_int(LPCTSTR url); - void scan_entry(Entry* entry, HWND hwnd); + void scan_entry(Entry* entry); bool expand_entry(Entry* dir); static void collapse_entry(Pane* pane, Entry* dir); - void set_curdir(Entry* entry, HWND hwnd); - void activate_entry(Pane* pane, HWND hwnd); + void set_curdir(Entry* entry); + void activate_entry(Pane* pane); protected: Root _root; diff --git a/reactos/subsys/system/explorer/shell/mainframe.cpp b/reactos/subsys/system/explorer/shell/mainframe.cpp index 8f049f0642c..704641e4885 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.cpp +++ b/reactos/subsys/system/explorer/shell/mainframe.cpp @@ -265,7 +265,7 @@ MainFrame::MainFrame(HWND hwnd) new EditController(_haddressedit); _hcommandedit = CreateWindow(TEXT("EDIT"), TEXT("> "), WS_CHILD|WS_VISIBLE, 0, 0, 0, rect.bottom, - hwnd, (HMENU)IDW_ADDRESSBAR, g_Globals._hInstance, 0); + hwnd, (HMENU)IDW_COMMANDBAR, g_Globals._hInstance, 0); SetWindowFont(_hcommandedit, hfont, FALSE); new EditController(_hcommandedit); @@ -278,14 +278,12 @@ MainFrame::MainFrame(HWND hwnd) CheckMenuItem(_menu_info._hMenuView, ID_VIEW_STATUSBAR, MF_BYCOMMAND|MF_CHECKED); _hsidebar = CreateWindowEx(WS_EX_STATICEDGE, WC_TREEVIEW, TEXT("Sidebar"), - WS_CHILD|WS_TABSTOP|WS_BORDER|WS_VISIBLE|WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_SHOWSELALWAYS|TVS_INFOTIP, + WS_CHILD|WS_TABSTOP|WS_BORDER|/*WS_VISIBLE|*/WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_SHOWSELALWAYS|TVS_INFOTIP, -1, -1, 200, 0, _hwnd, (HMENU)IDW_SIDEBAR, g_Globals._hInstance, 0); TreeView_SetImageList(_hsidebar, _himl, TVSIL_NORMAL); - CheckMenuItem(_menu_info._hMenuView, ID_VIEW_SIDE_BAR, MF_BYCOMMAND|MF_CHECKED); - - FillBookmarks(); + CheckMenuItem(_menu_info._hMenuView, ID_VIEW_SIDE_BAR, MF_BYCOMMAND|MF_UNCHECKED/*MF_CHECKED*/); } @@ -625,6 +623,10 @@ int MainFrame::Command(int id, int code) break; case ID_VIEW_SIDE_BAR: + // lazy initialization + if (!TreeView_GetCount(_hsidebar)) + FillBookmarks(); + toggle_child(_hwnd, id, _hsidebar); break; diff --git a/reactos/subsys/system/explorer/shell/shellbrowser.cpp b/reactos/subsys/system/explorer/shell/shellbrowser.cpp index 48ace218c3b..188d5fc29e7 100644 --- a/reactos/subsys/system/explorer/shell/shellbrowser.cpp +++ b/reactos/subsys/system/explorer/shell/shellbrowser.cpp @@ -44,7 +44,7 @@ ShellBrowserChild::ShellBrowserChild(HWND hwnd, const ShellChildWndInfo& info) _last_sel = 0; // store path into history - if (*info._path) + if (info._path && *info._path) _url_history.push(info._path); } @@ -442,8 +442,8 @@ int ShellBrowserChild::Notify(int id, NMHDR* pnmh) { switch(pnmh->code) { case TVN_GETDISPINFO: OnTreeGetDispInfo(id, pnmh); break; - case TVN_ITEMEXPANDING: OnTreeItemExpanding(id, (LPNMTREEVIEW)pnmh); break; case TVN_SELCHANGED: OnTreeItemSelected(id, (LPNMTREEVIEW)pnmh); break; + case TVN_ITEMEXPANDING: OnTreeItemExpanding(id, (LPNMTREEVIEW)pnmh); break; case NM_RCLICK: OnTreeItemRClick(id, pnmh); break; default: return super::Notify(id, pnmh); } @@ -539,7 +539,10 @@ String ShellBrowserChild::jump_to_int(LPCTSTR url) bool ShellBrowserChild::jump_to_pidl(LPCITEMIDLIST pidl) { -//@@ +/*@todo + we should call read_tree() here to iterate through the hierarchy and open all folders from shell_info._root_shell_path to shell_info._shell_path + -> see FileChildWindow::FileChildWindow() +*/ return false; } diff --git a/reactos/subsys/system/explorer/shell/shellfs.cpp b/reactos/subsys/system/explorer/shell/shellfs.cpp index b9457dcc400..9c89c811548 100644 --- a/reactos/subsys/system/explorer/shell/shellfs.cpp +++ b/reactos/subsys/system/explorer/shell/shellfs.cpp @@ -156,11 +156,13 @@ bool ShellDirectory::get_path(PTSTR path) const path[0] = TEXT('\0'); - SFGAOF attribs = 0; + if (_folder.empty()) + return false; - if (!_folder.empty()) - if (FAILED(const_cast(_folder)->GetAttributesOf(1, (LPCITEMIDLIST*)&_pidl, &attribs))) - return false; + SFGAOF attribs = SFGAO_FILESYSTEM; + + if (FAILED(const_cast(_folder)->GetAttributesOf(1, (LPCITEMIDLIST*)&_pidl, &attribs))) + return false; if (!(attribs & SFGAO_FILESYSTEM)) return false; diff --git a/reactos/subsys/system/explorer/utility/utility.h b/reactos/subsys/system/explorer/utility/utility.h index 19ac76251b6..bd2cec5f3c8 100644 --- a/reactos/subsys/system/explorer/utility/utility.h +++ b/reactos/subsys/system/explorer/utility/utility.h @@ -257,14 +257,16 @@ protected: struct HiddenWindow : public WindowHandle { HiddenWindow(HWND hwnd) - : WindowHandle(hwnd) + : WindowHandle(IsWindowVisible(hwnd)? hwnd: 0) { - SetWindowPos(hwnd, 0, 0, 0, 0, 0, SWP_HIDEWINDOW|SWP_NOREDRAW|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER); + if (_hwnd) + SetWindowPos(_hwnd, 0, 0, 0, 0, 0, SWP_HIDEWINDOW|SWP_NOREDRAW|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER); } ~HiddenWindow() { - SetWindowPos(_hwnd, 0, 0, 0, 0, 0, SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER); + if (_hwnd) + SetWindowPos(_hwnd, 0, 0, 0, 0, 0, SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER); } }; From 03124cf16a00fcf9221483919c1b8546954b9c5d Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Mon, 12 Apr 2004 09:50:01 +0000 Subject: [PATCH 0843/1463] - Don't declare DWORDLONG as double! svn path=/trunk/; revision=9091 --- reactos/include/base.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/reactos/include/base.h b/reactos/include/base.h index 6e1210168ce..282db9f5917 100644 --- a/reactos/include/base.h +++ b/reactos/include/base.h @@ -92,7 +92,11 @@ typedef unsigned long COLORREF; typedef CTRYID; typedef DLGPROC; */ -typedef double DWORDLONG, *PDWORDLONG; +#ifdef __GNUC__ +typedef unsigned long long DWORDLONG, *PDWORDLONG; +#else +typedef unsigned __int64 DWORDLONG, *PDWORDLONG; +#endif /* typedef EDITWORDBREAKPROC; typedef ENHMFENUMPROC; From a46eec6cea1ef18c4dc1d22055a3d35687e16682 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Mon, 12 Apr 2004 10:19:43 +0000 Subject: [PATCH 0844/1463] - RosGetTimeFormat(): replace "if (!cchTime) ; else ..." by "if (cchTime)" and adjust comment - Kohn Emil Dan : 1) RosGetTimeFormat() has a small bug. The last statement should be return nPos; and not return cchTime; 2) GetTimeFormatA() is not implemented. I have written an implementation for it, which calls GetTimeFormatW(), and converts the string parameters back and forth. (committed with adjustments for correct error handling) svn path=/trunk/; revision=9092 --- reactos/lib/kernel32/misc/lang.c | 89 ++++++++++++++++++++++++++++---- 1 file changed, 78 insertions(+), 11 deletions(-) diff --git a/reactos/lib/kernel32/misc/lang.c b/reactos/lib/kernel32/misc/lang.c index 398d64db3a9..d168a9a03de 100644 --- a/reactos/lib/kernel32/misc/lang.c +++ b/reactos/lib/kernel32/misc/lang.c @@ -1,4 +1,4 @@ -/* $Id: lang.c,v 1.12 2004/01/28 23:03:59 gdalsnes Exp $ +/* $Id: lang.c,v 1.13 2004/04/12 10:19:43 mf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT : ReactOS user mode libraries @@ -1235,18 +1235,20 @@ INT RosGetTimeFormat(LCID Locale, DWORD dwFlags, CONST SYSTEMTIME *lpTime, LPCWS } } - if (!cchTime) - /* We are counting */; - else if (nPos >= cchTime) + /* Are we not only counting? */ + if (cchTime) { - SetLastError(ERROR_INSUFFICIENT_BUFFER); - return 0; + if (nPos >= cchTime) + { + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return 0; + } + else + lpTimeStr[nPos] = '\0'; } - else - lpTimeStr[nPos] = '\0'; nPos++; - return cchTime; + return nPos; } /* @@ -1302,7 +1304,7 @@ GetTimeFormatW ( /* - * @unimplemented + * @implemented */ int STDCALL @@ -1314,10 +1316,75 @@ GetTimeFormatA ( LPSTR lpTimeStr, int cchTime ) -{ return sizeof(lpTimeStr); +{ + LPWSTR lpFormatU = NULL; + LPWSTR lpTimeStrU; + int numCharsU; + int retVal; + + if (lpFormat != NULL) { + /* First just determine the number of necessary bytes + for the unicode string */ + int numBytes = MultiByteToWideChar(CP_ACP, + MB_ERR_INVALID_CHARS, + lpFormat, + -1, + NULL, + 0); + + /* Try really hard not to fail due to format problems + If there are any problems with the format pass NULL + to GetTimeFormatW() */ + 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) { + if (lpFormatU != NULL) + HeapFree(GetProcessHeap(),0,lpFormatU); + return 0; + } + + lpTimeStrU = HeapAlloc(GetProcessHeap(),0,numCharsU*sizeof(WCHAR)); + if (lpTimeStrU == NULL) { + if (lpFormatU != NULL) + HeapFree(GetProcessHeap(),0,lpFormatU); + return 0; + } + + 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; } + #ifndef _OLE2NLS_IN_BUILD_ /* From bdc459faa9af85866eb456ec2eab7138fe10d4ef Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Mon, 12 Apr 2004 10:49:48 +0000 Subject: [PATCH 0845/1463] one more error handling fix for GetTimeFormatA() svn path=/trunk/; revision=9093 --- reactos/lib/kernel32/misc/lang.c | 57 +++++++++++++++----------------- 1 file changed, 27 insertions(+), 30 deletions(-) diff --git a/reactos/lib/kernel32/misc/lang.c b/reactos/lib/kernel32/misc/lang.c index d168a9a03de..e94e5b84480 100644 --- a/reactos/lib/kernel32/misc/lang.c +++ b/reactos/lib/kernel32/misc/lang.c @@ -1,4 +1,4 @@ -/* $Id: lang.c,v 1.13 2004/04/12 10:19:43 mf Exp $ +/* $Id: lang.c,v 1.14 2004/04/12 10:49:48 mf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT : ReactOS user mode libraries @@ -1259,10 +1259,10 @@ STDCALL GetTimeFormatW ( LCID Locale, DWORD dwFlags, - CONST SYSTEMTIME * lpTime, + CONST SYSTEMTIME* lpTime, LPCWSTR lpFormat, LPWSTR lpTimeStr, - int cchTime + int cchTime ) { WCHAR Buffer[40]; @@ -1311,16 +1311,16 @@ STDCALL GetTimeFormatA ( LCID Locale, DWORD dwFlags, - CONST SYSTEMTIME * lpTime, + CONST SYSTEMTIME* lpTime, LPCSTR lpFormat, LPSTR lpTimeStr, - int cchTime + int cchTime ) { LPWSTR lpFormatU = NULL; - LPWSTR lpTimeStrU; + LPWSTR lpTimeStrU; int numCharsU; - int retVal; + int retVal = 0; if (lpFormat != NULL) { /* First just determine the number of necessary bytes @@ -1352,31 +1352,28 @@ GetTimeFormatA ( Unicode output */ numCharsU = GetTimeFormatW(Locale,dwFlags,lpTime,lpFormatU,NULL,0); - if (numCharsU == 0) { - if (lpFormatU != NULL) - HeapFree(GetProcessHeap(),0,lpFormatU); - return 0; + if (numCharsU != 0) { + lpTimeStrU = HeapAlloc(GetProcessHeap(),0,numCharsU*sizeof(WCHAR)); + if (lpTimeStrU == NULL) { + if (lpFormatU != NULL) + HeapFree(GetProcessHeap(),0,lpFormatU); + return 0; + } + + 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); } - lpTimeStrU = HeapAlloc(GetProcessHeap(),0,numCharsU*sizeof(WCHAR)); - if (lpTimeStrU == NULL) { - if (lpFormatU != NULL) - HeapFree(GetProcessHeap(),0,lpFormatU); - return 0; - } - - 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); From 7550de503a99932731387d7d1a7781aa2aca5668 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Mon, 12 Apr 2004 11:07:13 +0000 Subject: [PATCH 0846/1463] remove gpl.txt before adding again with -kb svn path=/trunk/; revision=9094 --- reactos/lib/cpl/sysdm/resources/gpl.txt | Bin 36648 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 reactos/lib/cpl/sysdm/resources/gpl.txt diff --git a/reactos/lib/cpl/sysdm/resources/gpl.txt b/reactos/lib/cpl/sysdm/resources/gpl.txt deleted file mode 100644 index f12440c4ef2a039cb752c52d3aff6e5f15badfae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36648 zcmchgU6UNgaYg4<4*NfB;6+e`NSTyHNwz`}APA6{Y0r1&O$ixNn{SU?p1yzM-F z<|33KW^U4%Ifa<-~aiS-9PPqQvXi&|32P*w)>)9f4sX^udeMr z-(A_=tiNy9yC2r88@sFZm%lmUP93uz!?C{HJ={Ito$bEaJ>7j*=e)oBdHw%~-OKvx zVZC~9_uKmS-f}i0oYcrqch7dO>a1^ek9U9Gy{Pvt*SkO4AN`v;o-uOf$?kd``*0cU zPM!Ox&iH1AyS2fP3HSSscJ1GnO ztz=;AtM%TuyL*cU4@w8${j`oa+5Kx-;Jw{1_d0x0mbIO@_$!n^4Hzn zllu3xe1i^JKA36b-Cq2r{hrj393d`FcBeHDvdpq!`$skI^ZNa5{XSb}JF8bS5`u^a zH3oQmyjZ!d`JyEJ>oWe`1wXH9Jbdx8Mn-~1i)6_DwC0Hq&KBLlUwfhL!MoVv-THk} zk;9mH?YnyKdCiBcAO^d0Y{wmz$M0B;xO-W6Qg39rS)-2L(b8BSkAsB~Cy(oFvq^+ZjD?t5?oLp0%~#*}YRUfzfYkR;_xrSdzJ;?fR@BCL_0B#g4Yb-!E%Mc}2^D z3~YcbAJ-?xYzJq}mb+VA^K7v!sEAh^M;#YPetmDNlZx9JU(CG4H9uWOJ=8Q2tCjc* zY!E3R0W3eO|DP60@f&#izCHon$Z@wUz>%OHsln8@_0PCtOyt2zV?=7J%Zu#9@jTyg z-L_fuq(+}@5dR?!TnMg+uY08%^2F~!Ilh1;!6w?jo#)Vu_<308!zbj2lik-f_sjZy zzuqO^#J`L`Tc;ynw)ELPBA?bs%~Fj0)#4jQg~QMvZU*0268>!Du5CkpZHT z=k+gM5)B!}h~!K;6dNL|2-cgoN?XwKHnsyXk>VH|9*bMDXxIaJV19hvQ9Vnah}zCf zW-#;6n{7xPkhqa!pD)=pJQ0k^hBCz8_SVAtcu23~3y%78p(gx0YIagKeYh~}H+${y zCzghFjW;ZZ%ve8YBiEbxUMz@T&x!Q;e0$!EH0O{+&KgyjUp|C0uq86$V=)Qpu?!dk zNe@f+5vgnR|3`fqD>LtGm%lDpWQ15U5`)&DK$hZck$tv`q|@bCXC{L052(VPUHci0 zMh>!%d95*ux8MR}BXyp99u2G!?v+Fj7JHy0IxuRZl-vPVL_007KBH8zeE9opVSzpi zTbS{X&5Vp@@#Hv`EOT1cLJOohPapI6S>-G|)3W3B=k?Cry{8@H*`gtN0L`f&u#Wgh z)fA~mw1Sw6$85A(;}eV-KAX^j48u{AQyOiL!kS`T-BFMYl(TvH1&+C0w1CBzrR z6xd$pR>mc}61!$!v^Vo&En^9JVll>myOk;S`?lt=`lJ$`SrKpCuXl}5SU?u0Cf-Jc z@8V;m$sFNZ+5hXZ6WOk3?wFYCEu&cdUJV%z-IeX(Ynit>&2y1un+uib%7XQdpOy@^ zrTUMy*3gZ4u*^CKyD&qJBO04^l;WE@5=joDhv~YhJ4hBxVV|IZsCZnn zfT3O|vL4NPTYie%KVPi29W~1Oi;@teQvr8`9@BA-+AAdooN=el2MhV9iZE0A7&@>&(7F1FR}CSn)pG zGXm$4-$5lzK3b$#O=v@9C#yyV^n0|7Wu1XV+Wz2ulnjaH_0>=7XvTO}GlQ3|FJ}B- zf34k<(gF>mPcRY9dR3>juo5#cwyRhCP1L%^VVoDG0k&Z^b%+|I#_yhwU&Y#2HJ&zs zf6*EoQ?oxUY3+W%!E|_-g$g!xiatiJL&m^rSlb%Ye8`bvO#ii(?GyaSXw>C+(v>|L zJuS_;dKq;&?D$|?MxsKHPxY*fz$bK}#GaO!*V4+z|HKxvvI5m&r;CO7Oy&sV7~hGc z5%J9GYJiBsZ{U_Ol|eg-g|(l?+$PV;L#;PDajnwgp>5)4-_C!N-By7NY zbS=jELbgc++Djv@#gP(#4Avbp{~Bl8)e$w{lO;NchO;{NRcSMJiHRP0O%_7uxr6O` zt+RF_o8OH~nFv|5+S_zQ68WP4QuSL$zPPmbmguy9Z50JSSjoYIvk!W;K_rb`JiQSQ zBu5yPC%a37Z|K*LIlQ%AOK0T3IAjYrk(fl6Fc6lV&oU!-hO!=lmyJ4edE}(ynwn|b z&!FP_s+Ez2x#bu=p>6cN8jl#9aTja^Q^%wRiP*9kqPrdXXSM?RJg*F+cC0<(32il2 zykNb#2aC#isg3R3W9zKJ@gI^m3Oe4f2*-hW@*Npgyj|XXvPgxbR7LDpASE_h&k?TF zq8v|_dAURuvy)-58C5em2-deB+?pt3JOm~ZKOpZI_g*S#?X6xb8Lj2#oWe-TMIL-m z8qi+|c0n=YyJlfDB;e;tjfVfI1^8`OqAe%lv0P(Ld|V`-9QP>xM8dLYs;97 zhx{Y2B$AZQ8kT$tFZCLHJqz+U&)PE7q*kK#V(=YWCXT6J$9G_Jjsch0oSf3Ua*XAe ze;xam7t3HN9KSi`n^Sd!&A~FsW7ypU&*YcxX0ChDBUw ztXE5GOS`uU_B%4D0^VED(j6YNBvxj3Je;&uS0T$G-+5+7*|-LsElpjC{aK%F^}LPf z^dP_=^*}ma_!|7-2c<+>R;*Nj>>%^$vju;y0*p8;tX&-$3B(lpEO7G6MIKmp)Zc0d zG&ANm%NS&8jsflNo4WeZBVY_=xSvKzP_E0V0QN|-Anb42_BJJX3pZ%`vb*Zl){ zgxygPoeUCIaAg#pL56WY@YNQ>2k9!AgZONVxf(ZpoKbnN{7t;z%gBpP*zr(qGK(h86cl zBt3P|kN2oWTD#V`Z3Gj&zsW>hFMtrGN6yi2{r5$92h?#!P&Ze2*huS!VekfP-e^F* z(^h_Sj#(q4{V{4G%9;Ie1&j5%)^Cd(R*Zse zrKaz$zK35qc=`Hr7PZoYlZUpN|bj+faS50#^^Biz8qNtZlancIb6~qEN2w zbz%H=e%+X})p3-hXVk*v1uU!lAmCX4%X$NL8nw~GK&bD_<<$*=8$l!?1m(F$QA9!McV{k1}jH&c7{XuHp(JMTM(2W)n%o0c&G)^JVG`;y*AR@8H8rp4AagYTZ&ii*<6<@8-ARVAjvHgQ z;{u!DU(tP--!CsXq0n$v}7#)sh|AKm%vHNy|AGraC)tiQlaRzcW%lxAMe5|FEIn4&$k1pq^2T|PJT;7+0({0QoqFU= z-55KXK|hreykx#)Wb`15D;+ibT1*vgY*3>z1Ci#T93KJ_ZHV13)GUImLJhd$_xl?-I}$n-W(u>YnZU+p}fwXY9tt1*E(oL<;xDPcJ+v?COT@7#?{_-v|{6Yawzq< zy6oeaJvC%s&m;Qgx!RX%60{t{f+J%Ua=AF**j&E?>QY&ZJ%x4und4a3GQYc%BL^Ub zNSBlJp&E^d#4cozFi7`_5+A(-J66y{7gym>W4fkc4B0>pnUSnuOo9Ba7*F@JA_=hzrMX7i&d7=e-Gzdeb3cvJWo>Q+NyUYo#5AAH$7|29f%+h=7RUN>B(|{k zX0O%p=yQ?l)FnF{u!XGRD6KoQ>9xPtFh}ti{8i!3mxO1^KIZ2aM+0Rxdw$jEV&UxBMqN`MrL%kj4_%0 zxF;EbPZ`S`GS^Jri#6AZ+xDAl(|EFXaN+?z*@;c|^fx64W<-5V>c~}@WIhl%$0BGkn$aBAHaoadv-UN*(RRLL4;zV}vFAoE z;S7;I+RNVCMSN%EAWdg5X1Ak`g}DxbDr1yT%;9IMHqZbD@Ss<{1w*fvBXaGkne%Xu zL_6{-C zIZG+&OnH?)9vi*#Cd79iW#m@0J1>rA`8X1$!gJc2>U5OiPy<(9KP)QFXRPg57^V6D zj0!uE7m1268W;#3tclbpYzy{!#~1v%iqY~JrQ>PT++()9@k9LmZp}?TJbj&wiCQ^> z)o|Byd?v|?J?pA6yRAip*+>2+$mmn$9UXfytkZ@+?_rSTH_&NdOL1=l_xX9@9dJ1 zOOTBkVYE(myRl(2G&P7!mt(sw)~iSYAN_UFjt=kG9a>-YC05B1;_P~jP93VXwyUAc zhy}$?v*N5hvV^y0O~qzw{AQcE)1fXe3!zrORxHdx9`(L3yDZ4$N*7(+Eg*)OiM1Ay zqh&h>KdN`VHUOrj7si!Jy)x;&G<5G7;tOhMGA_MS{Mi)%c8)d16DVQhyTQliyS$8n7I=+l1j{qF#5Z>eX3qt`Bp0xHYX*qk z#M58Oj*J$MfjBz?c>40|_ucb#{m*qT&zIx88zf#uBKg?WVps6U!c{(;r?<7qSs@r4 zu$$wVbA=p9w{SpTf*QcM;FZx6#?jV?dLavTq$^=(KTJs-gf7`xJa6`1Ez)m3FRzH` zZ4I>jv9+74RJ`O`&b~}@y~sizHGn(R-ksH4Z`M6(IGVBO((x1xY$TG2dRd|)!`zkH zIylZAfpxZ6d9w_$<&0Xqqi!u@ADP~3%O+0owM<0JGxuTSZ1+RAXGi1QF(NC#2Ry;X zzubfFT0i(;RYYc#1&||X16iOEwlEj*iC6!%ek1F^gv1_9aTuxF2oZzswNOp{+h)%q z92E)BwsWWJ7Agy`wu2>!DJydEd1&3NVE8@vIIzOVw&7*oqdF3!S-(&%js1ajO~2iz zLDwrKrMtwg1BqSxpxqt9j_Ey)5phuqz({c8+vqR5V};zO#cW|nBr@ZBpBfdad`Jbu zC+>p5lU@^Lg!U?N-QB&I#gOMPV`lFncuvQg{b#$Shn21<@(eW7LfzAqjXRpN@@P4c zg&5fKt=QK>!EH-pwbh6|b5h5aRl-rcy44C(Sg6;E`r3AIof;$zP9gg$=#BtOI@VY*fP~EHq-~m;ra|s zsg#oY%&X)-?r|SieasGX1dA8*l6F=iylfRFqcRtgjCM+9J;pZqT>P&YckC+XnqNj@ z6?SYd0SRW__Gv2dFf-ya*Hy5*pAdPY4H5x(I@R8GT&H`0HHpb)MP$jkDL%(D={<)# zi9DqmeXDJ)3&^k9iqQ`-7dvX_Lk}RyF&leM)`+0$(6+`HqwoV4e6YmawZ&#u6JA#y zd&&ogk{-{mKc=^%D;Q<1)K9p;%j^|w=O>TPeFH|=nvoB$jKC&XalB)DK1&ap-1Wq`zuFOq1;&ib6DU}B!Q*BFSa41h;f39UhK6@Y9Cp~Zd zaZ;GzPQ1tEHCHmhm5j8#hfBqPC9x;IL~kk{^&hWH6rVI)YEf zy8y>3VVv1Y6J&!V_#0WaSu$Q7(Mj#$tYQ7jmH$9Sa2lU6X6%JVtk~=Xu*(ZV*E%Cf zYneKnt^i|WJsBGdf=qKwDj)E>tw&>g3m@P>*|GANxsk_JiM^}l->y_W^M}nWC)f#y zHNDnLe=`3z%UhpXmCAfvb3}$aD@>sWQO8ap-Ek1awby9jTEW@K%d8QpO1Yk8%#dAq zYaK>Lp1HE@HOdxBt@s!<-JxUiwGUu1^-9dSuAHM%`H_d38+{W2+xCi==IVu+K#x(Y zH?EgOunT_QdJ+{tVXakcfq$@UHvj6E7(`dyf5naI|~nZ=MiynsKa(& zVy#W8#MDJ-ot%j_V)hgU&TZb)sUvvxz8} z>t6Cs=W{ul^%-j_P=x)*9csNojG}{?0tDu&f^qjBAG92BIuXf^Bx@J2P7bCf;A$HC z>t?_9q;)ID&v`Mv-IgDz&3JHsR;|k8Q&@>y#`H7vg}G*1G#iLvI%KiX_6&^K<8ura zSJqtRwXN}ZPwtHcZ(=O$5`DQN=lM{vy~&?)G?L_LMveadY^(;fi>tnoZ>U%Ferp6H z5r^ShtlE_v{>5|TgFf3?&6oHHzmHcz5N(W;`iB|>&!q=4kDB}Awbt5$(l+19Cj zr`G*Cf1MZ5D_sVnHC>2L>s@O+Jcu8)PWQ0La>NiG;2uumUgpKF@gmmnj)K0@N>4`NcesZ`v}fh{_Av3%DgL1JbS zi@gs70?iO&@MT#M#L+p3_Ty8&eo>l`k&Gpe!!mH87P6xwCwUb2lsEUJD+?MQ@2$dY zhxn4!);L_-Fc=u)dbVbmk{V>j7Bj3X$FXYH26_lQ^DHnB*!k+T-rbH~-%ZTHV9n+1 z3FLX-=!2b7513Km9`X`-hImp2$0R$Whr1|aelTyJR{@IIc$R3F!TNpYxVhKVDpGxW z@8dVGSA&g`L;t1v(*AiWOx6TFBVJh7WJ(eFh)_693u04nj3>y-sY|SfT;-%Pn|E=; zHdxatrkUN(7-POyt>@$%t^k9Juv_POq``-Cx8-mw@3-pbJf*tqJ-3nX*EZQ&TdaH5 zNRrwf?gJgz-^!eMu%riz*nL*c_HUh<3AXx4c?D*g{nlPvR2&$`QH1OxTgX>4e8ohhuvp<-h z^K%t0@kBOBTpHWlvxv|AYpo-4u_D5P&tJz-)@_Gek7j)Z5m!fHKj&RbH;z13He0Bl z>(H!hGP)R%2U8zhDqT~rQ~AsHYyEu6UHVR4YbGkm9~~`Xo0TRznp{N{tL1oS(QlDN z&tdh9WTed5tm8)ZTwBZP%cInc`sbKltcDV4R%}GESuwJPE%4dJ_#zy7-2e6t^?BBd zBOYAquDvj$Oe`Q3l5U}a$cxVsc~*4k^u$7IE9R=Vx3SN~zxSjoNx1pF{WC4?f<#_0 zBgY1{MD;qi*k7X_k^#=MI2d%Sv1-oh4?D^!?qrBfYZaKS`2Y?aS58@*%*Z8{VJ*)K z*U6ChC0TCdZrOBPdFWkM3S>z3TkYSVH%voS(sx9PJ2Du&eYi$juThnJtMdCtBj9`u z6H$kV+5R>e)@y#t13HoKUB}M=h#Rj>=%c7r&><+^ z^1A#Al4M0uPNj$yXPJmNaGUqT%^-PR!yKZkdkxCYGn1K>AD+bflakYapVf12`No_p z^(Q%)3bUVQI~EX1D8~vR_%gK@Vwe*85-WD+xwIuiMK=UoAHHY_Zp^dIyVq zUdLhs&g2=xJUiGqc>XZ9=BdLxPnf3>w~Rc)n5Pu;>Blt^l73R}-7NVS6|4HZ<6qRf zpVwbKBRb(hM!i-?;%EKxWxd1sJx3=M3pU!+zpP{X|(sSDM zwBFa>qH!K~Exp!J18nqZN%i?2iC_bt-&p)l6vW z@ePch*Z;Q`&1JbpBXixT&+!ZXzEf6YHa&+s}K z?QNqoKIVJ4@U!yW*?S$tW&TD|M|hCMY+&np{ajr%`m$c(4M$a@J2gIb&WJv(o5+Z) zXm_*z!oKK$jj4rM6G5<8q~V$1&3kg0&&XpWF$GGI zT4wm7e&4LW^fDu1eLZzCmWV7@7Dj~cv?U&O);a#s1#f79#MGO(02>E^M&TA0U_Tg& zxj_hj_jAn~OY%vqdiZSg(RXV+$sJpaN-W)4Y>TvH52LqvRh$PaiK&lDQlup>+$l66 z7nYm3q4{V2?o;NvQ^)`VH)@od1GmV8#yNOv)cDP)_*x`*Cg>hzVNRn}BqCW@a*n#> zNN3>aHM6LDjyo2ump3&(pA(VF(QlS?B3bFs29As7{WsoGC-?{(m~%w0@?R~B!fEES zjFCC;6_!UM=HML9CbJ?_{H#sTn7AT3nn4{U$cASbiJX8`%t_`sW-YZQi^3U^v$-zO z)vhS5PL36N#MXxRqQb#0*cYpUppO zgaJ}3_X?JGUeqUcT$INZMRzeC*5_W~WRHTK38e7~Kh`9<9xnB_*Rgr zahD@kP@9H8e-Wa!AH& zcN*87fArz#?j1D(@!e_7XkW!ukUpW0tj_An2wR;gyD;u_oh`F4TC6#D2CQ6e)Tikk zawQ7S2Z;A#>%-Z(3(Ze6Hs`SBVl;8V9+-VwR#~8zy%*&69=VLb8crW`tqSwI2QFsa zgSV^3JFk|R?J@M;MX!3Dd;L5?*52_?%hi&wVnjx-J?YM%-8uL3+A7X|spMSmI9;lF z*c%WtnURPi671cu5{~X*j=x2ORc*D}4|Vj&mRRyx5lev`Y3x#_QronLPF|?y@MA!j{e zSStkTU+zJ_zs!T4?xVP;;B`7w8qE~e#o@x)1IZYjqp4ny6vji#xtc_F?)-s$krFJ4 zJZqpicax9p?K3+Fz*A;_EMU&)8VXOyOE96Y%^ssvxj*^g##6pNuJhPs@V?=$kJkMC z!QO`#%h2a#=Mj6yX2-Ygc(^}-HNf15g&_L1e4pI4`ppV(yN6Argd34lmph%dtRtQ2jpg(!HlpHDa@QeU10V~QBA%7>ojMX$xnI13r_ANZ z#+4SL&1*{Dsk<#;8hAJBS~Oud&>d%Ofc!HjHg>*V=H;w$odjy+d9p)uH6t-M)e3ig zxZ=57^WmFVJoku#DKvmV=lRj*`SL9TY8N@N1kc(*7Ou{~!;Wp;sK?1a@E*_aaP+Me zTXw|zigD(=RA(fff}L5m%!w?lxxB8B6?A{k>L-i*#GE3wow6qZl^L=GaJdV`s;0oaj!xVM&QBX(H{qzb}D_)*>dQ0IUS&i$6>$=et5h zY;jD>zPb#i?`%8PCq@9anx!}6bXBQ;{XdM``mtUUA<9dy1pSkF5@%U2-JC3SQgH^t l@I9P?G`H*AJdK7OA`$0x-};z}l70=jt2+)#I3I81{2$7qgRKAn From ea01087f9c51f37f6740fb87aaab436e61cb8350 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Mon, 12 Apr 2004 11:07:54 +0000 Subject: [PATCH 0847/1463] check in gpl.txt as binary UTF-16 file svn path=/trunk/; revision=9095 --- reactos/lib/cpl/sysdm/resources/gpl.txt | Bin 0 -> 37328 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 reactos/lib/cpl/sysdm/resources/gpl.txt diff --git a/reactos/lib/cpl/sysdm/resources/gpl.txt b/reactos/lib/cpl/sysdm/resources/gpl.txt new file mode 100644 index 0000000000000000000000000000000000000000..0aad98943b080d4e74d3ebe498ccbe5ce478e3a8 GIT binary patch literal 37328 zcmchgTaz5eafRnq4*NfB@I`QhMVXW(%a?Ej2m&N*kbsG$Xug@a3KBrT0B8z--gbWd z%|TXm_be8)!-2r=>`Zr6UQV9O%Ifa<@BjLX!(SZ!?C`VtcXs^u+2PB>*Y*0d!}WS~ z{qWV{>fu)XeW%|2q+Z=TT&utQ%@KF&nC&Qz_PfKw!^^{~!;{1F!}oR8$A`bFpZ|RL zq5gVUuRc2bUH$v$c)p{Y)%ed3FAi_&%qNG(hu7Z@!L9wadP(A;YJ<% za2fG#o%^WH`0?=F@*bZ(U*>yI@4P-r!r3=VhWm#Pk8?-+_xb&s!`~i$T_b%_BfqMD zXJx7XEGZcMTD|w|aBtD!L22Q;U(^w2hrcd6e02ELQH!t3f>+;4aeW!#WoeJau+fuc zzK3BL2I4WjNdQsKUmIrz07^Dbm#c9d zxClNT)EFT2@nY|`>+6#AkIVSqEogdEWB zJ{ABoe9m0a4*MBT@2gqPQ=+xae{uLl%>`zk)x6sF)nZR(kH+h>f}f1t-W5sO6R-cU zU=+U5y5IvVD9vY!74|I%pUu|$t{CXWVqee^-!`5)PLTb^(Ozd2%QMcLdyj*DzKpxo zHc_ml_zR2>J0Jp7zo?(j3$J(&-2GUefO91IuB^b3;2*ic*0cI&Br>KFVXHApwb+$K zeqwu`@w9&X{CZZS&vu9xkq3?hU&PwI(oTuu{~#WZz@MNL3%sBI(2ZDnSm(nsA3@_4|IkOFoL18Gmh|j)vLZua5EgyvCZ@iy6LIyu{e>8+L%XK|2h>xkLv%+`WJ7Bi;QA~a;E&MEs(|>$l)aw~K~Lm3#gV7tm`oc!Q6e$}e(yM+ zHAsZ*=Pq-cnd;qkq*_Q6$-FO@3>@ZYyvdP7&dZWci-83Er2p{N5I9#AJ#)^VmHX6A}}|;KH`5pD;ng8{h2e?oLv$}Yji~dSrQh(o=AzO z#U?SJbwC@KdRY38m|e%hKh&qOH8an)`Qw60Mu;^dGq?>FWG>DY;IgUygTn zqWb=TFznj3qVZ`QA^({58n1W_elSi_7s~X}!YblkN%i0;51OKhm6?%+m1QCUsKjvX2)e-UT zt-j~6E-xiMA;v)ZI{P9i`Il%mKP!pZ8LJsxNEFL43aqYFvE#Fv#afm6dFDzv=E*T; z;RV^5N_rn3zKgGwC$ofy%?sa_t;mNxcSp!vnHksW_-4p}=&y7S-%7pDbe^j;`y8oE zR~O`WT(oSkFzbeBY|V|;!ysV!*=~_$AUW(kxg1yMfV|JiNV2)L{#y*y7R@CmuZ4^9QqH|oM)6XCeFg{$$Uvn-| zYa%6;F!dUUp~lKO45UWW_GKz1MJEj>r0Rt2Fm%bYFm$b_OgJ%nHge6eyTcY$4G!ai${ zp#`=TA*`Dp9(jT@sRBSKEI(SM*IejB9Vp*M3N(DQjAb=~RoVw@*_3HspZ&a!XOtH; zH@N9KWE%}P-fH=@bV1W-6?{a$UKwgNti>#hZx;d26UnZT80U5AfrVI)ZSkY*V89XZ zu(e0r>B-i#y@N*? zk9r=T+9g1%=cQd&I-@q*9uoGoBErY;tUi___=NtJIE;1XRk;%KlUQS37(=U_FIM6+ zxg;zkdnd9+{4=lX2-m6i7u+$XQfNyN5qa8MV}`$1bFTHpPvM<4yUDGMv8*5D_Qb-R zZx}BU5i?sfpBGw?LmS*L8*Otq+B8z}X~##)n~bDSu-z6-b1u+6BNwtN$=HsZ9%Ur| z^CPGH-*n2UELhXfUH_tbE_9B+JbYTeuN`hLuWr_-H<#CZdZS)_b^P>Bbun(%F`q3Q z@M*oiTgQG?zdxxCea`9;zo>IL>PG#)R`cWtt>90j`RfIn_(j&B|1wq(>6K(1kVqey zwc}BAG=stsyvK@XtVLv@L}hw)#JkAKnw(x7nSbPGqi?^OqEdXiL<|w~s?L2=`ixy^ zB1*=SozQyjnP=74**y`@@2)lFD5TMH@6)LY9~ccER9|;wkq;Ih6R~#8Q+2@`)_!p0 z?1^5j5L;uPP@lvP$soq++2Mo1L+lcaxxV#Y%a>RpyO2#-cM+%P6K=x3^LcPFpUPK6 zEJwrH#-TYslG52teYNjxu<>J6*h<6fvXB1IK4L(vM>Ng|3`T;jQ*y&x=+Lau9h7)! zwgfu8tPG@vtX<*{?KRfPpuQOitICC`sNE~T-dWG%MPzR*bnIyrjs*W?M6$5RyK?w^ zkqcR=q1YoqPVBUvB`m5{Ii4)^!{R;WCkJCUDs4Jf>1L&S4}aBU3&o9at9z#o(FoUGFfOGWhdqjff|y8Tf6dqb(@@v0vj)q+BN7 zoc1h!Mb5CD(tt?OvSvH=o0*vooM?s3GM+wQ_10Ab7I;;fvR@egpD&Thd8uI^9WC>6 ziMsD=gt6AyMzS)c4$$iIC?lf5$TW#7<+JW3&i1Af)eo%k_Im6_d3qXPk%}SRG`tQL@dtjla$((ztn6v?>5B!6t{#j(?5uSi zxuX;YrjO2!I1<6fqYbQ?z&4{kSwUe zAE}MuZ92Z_4t_-Ix)%YnuuBWNlU>3SuByU3N-@p|*4l1(BE2dz6rb&}nSLRg^l?V% zy|OORgGVEAe7KcdiK2BnUhVaf+r`PcyV_M9^UX+PoX!N1=9Es6g&IySO{R?f*5l9F zX&Y!?I^PvyF44= zbw&sV=Xy{}Y31+^UV$T`2enaK``tNcjgt1usE3$${(TPa6+&BOTXCj3H1;s%c8 znj~?{JNQ&CF+W+cQ76qFzV-Dp9t;{qcD_nsP7nsuZ2P0*5&TG2W9L>+Y zI#RD(u7><><(0AS8>6|S1iRp8vA(SWt}J+=cLe9VFFyC|7;9!mF_$`hZ5JXLqx@!pX)%i-~-GZgr3nb4k|M&|-pFA}mFklk+>1I@iU zXROu0PF7IZe3obK9DG=#uqSmL%)TYnUE|xpw z=~2$a*nV8n!*b^AC!8;gCPL=%6U#`D-a9NXuZy-^+&b@N9eoa;D~J6dA_RZ4LUnf( zi;p!qQZ%xR#BnBMZ(qJ|)=kGWv5>38%%_ZvF02id4?B=WSbwWQJOWv@%B>xs^0 z$$l5{6@4|aaFO;RnwRr)^{e@qas>#XA8d0{X1pK3&|Am$VB5{tBatuMHw z-;Rg-$af*W85#-GAtla~0d}PtNe+Mkv4D|?Jv$chJ~=s3&b7kq`elVeh0; zH|1e$u*sb6)bT0vpY|!X<5NcK-u-A1E2+L_g)xK7_UqW?QJVO)_l=ZQZ;RY@Rq2`j zq{95wZb!~eTh=x7Hn#eW*q>3=UU`=<@LB4MuG6=jDzB;}GSTqf;SXg~_r#Etc!?ii zUq17it<+0$H})TAiT&V=T$>7$X`Q>rIgA3L>ZAG}{{47)oxWLmrCIT$8)Pk(I-t8| zRvAR5l4n)GU&xv(T+sOOg}t(?r7JezT54p&XIOQNi0GN)U=I18cj%A7xL#L|pIzgy z;v(Dg_rtn7jHBR&RH2O_aJ0Yc19yyd!#Z#8p$gkw#!G9Itk+W)c}q?NopW@88{-@8 ziA!^b>pUb&6@b3;J&V{$B#pg1G7UBk%4e(D)4PlhjU*)M9ESvU@3Ax2XHbufQi?zP zO^pXCzyhAkwR-7Sy;+XQHMnNi?amBm+wJPA!#+vuf}HA~ei<3TZVU4&0Z2`EC|NC% zfJtSws#x!nWQUHJOWrqG#!cd3_RYKS-(8uJb;n? zS&pq1u5W)@j9koO`*AVL^Zy+qb~!H-BjGvF5M)?EsaJRy9QNKb@!|?d4`h^%u33MN z+Vjd!@%)E1JNfc_i7c`VQ7n(JqVD>Sd_GHJ2RCGk!U3L=r!8YP2I|Qdl^0J zuH?8L&wi8kn`PMAGWMhMGIyo^_u0Fvy!4!AY2=mm9B~C2u&Q~ImC=|R?-t{`dp+)P z-doN{cJI!Rv*9b^d_R^uN66W*KYMg!8sx*rqm8orjwPGBsa52^9NV?D-c=S@>W_<# z)Q@AwX?>NNxFvsxxf?Y;m8&+}ubVO_b`(W)yi+}l`YTQNY}Qtsw$|f$j%x)M)aH1# z`C*w6t6A4D2btEp;_TWWmFs1+$<72(&0MV2h$QXXdHPYk>lF*kPlt^ws(MY+`*`Tz zbHpRm-DG5Xv&h#~0=908jBCJHk;-D^CgjHZ$Uyef2ICPk8ut99Uq7$8x%b1Xd5~Oo z%g%szJ!_Mv^(iA^h3+tOPV2aTHP0UZA%EZ1nT`P(Ww#@_O)oJApJwHQwpajLa`xPD zJ~iW&WeoJdcSI(ro-roUxnDASJbFjOJzMr4np>hfvGs>Vjz&M&v$uehS4uN$2zQ?C zBye5M%jG!ldWmn5NtSlC*;T*Nc&0Xp@x8By{yVku6ES#89RVjrz@XN(eX6wdu+}ZAK|V@fzF*&B_PwkDZ3~N?^b9gSJ;oPP;m;B8ld7TD#|jJ=5D9 zOQPGkZjyhCpX{F@!AbNEE8z`S1LW5o6Sw;t0T=yVy?Z{mOyWO0}EQuP!Utb;k`sWoeF$Q>?AJL4xIjaiprTe@MD;j zSIrsWb}$_-LbtgGisfN-=MFx``}szO3je2eO!d4)glBa{1E(29UV9TBj#u~gnZkY} z*N78s^FFK+e3{41W?*gqKAzk&dcIUp%8fl!4P!_Bpd_yD(3YwyxzWr^Wy_NQ##JNp z!zIDx<$PsDt4#RXdQF~XE@c_5mE3!Zf%3W0u)b<@>|D!~Spl8iQ&EPQ(S06GJk6YV z&J`IP=qIkeSeIITCm!%zYQz0FH%DqwViZivluDBoRD6$r(%}xH5{b$+`Z#N_WIpZ1 z_*?A7mfCvj1!Xy9Y0rv%!PjG|{@SBAlu9wE{MkBw~Pb@AkU_0-2=_l=-k|z5| zScgm!x%Q-TjMIM497w@B%cuDe{}*R3kIy|3M%--fcghr>*D8YTu`z zbL-Djl?zNt71aAN%rW{sb;RZHXS{z~WBB9~?_UXL;AM6x!cKaM+`<)uuKb)EOUCyz zhk^OlX6vC>ho9Hyu0qCL-i}BtH0Erc*}<9(|C%L~#Jl!_-srTK%d+=Eu9~kxcxzORRBCk{lCM${u)vtFDj|77KHwyRK)>3Lo5w z_;`s@<3NnbQ(m(W7RngZ6 z80WS!1?ON2W>=bh{)~S|tWu#kZ}{m-@e3#kYU4e|jLp!A^`1QicAG)#T5Dx#O;fwm zVPJG@Xw`)s!Ks-j6%sz%*Q61@hZNAD^q_9c?Mmco#*SF>-Ilw4+T5}PnCy|gDow8{ z!8Tu^s}-$vtbE9|tYGg|jfXBoA^Vhc;XxADk)wwz3_VEZW{pV|%k?(FF457|x)x$& zC7SEdWNd#kb9<3>Jf3IV^qWr2*q(sd)GYDms&tM}HBchzbY@O8?AuH~Z)+v7Wen?+ z8>Iub!TWp9_d>2Qwv+-Z_8QvUi~Wh4NY>Rd$Rz{5sTuImo7$U(6}-!e-&-x_9@8m( zx}r?|#F5E2S>c&8lBGqk86NL5w@2iuEm{OWZa-subV>h2-;5sBLXj925r|-zjOosJ9wX3Gn>&PC>E9^RVpdI$k3QvYsYh~*S<)?XK&O*j{IDNj8izPaGfe3HnH-rRfia;Wd#b@8`keE^i?q!7wWM!-yZ(l-!-!G~dn~AXjXp`6aeP_9K)YqyrT93OezkR!! z?5NrLGKe&n<+(apOZ2QrGxyz+$s!{$3)g8!EGw?@3b{Kq43R>fw_AjM)Uco(JYvys z5LPvkI7V#y8Dq@%==H3e!_{gq6r*=FpgfE-cW<_%d5>8?H!JmM@A%0`M$p%g<^>7m?Q#vL;}dAs+I_k1C@ zGpjWb83l>6mK2#||ANmua*#%T<$e!5CT<Z#`mepsob}xe6gOkVRxVY=A~eWqdmWXo)t=YHx!&j89}au;_|~Yg^Wp zeRtz$DUpIPaxF0tMy^Su8t>e6jFh;Ub6wj2Y1fhl4<4m<@X#sEsJs(*)^|j;IWy9RJ+#v07$n>p ze{FF9%6w8*bM=S{BIa_4P%fn1Lj{o-&xO^j|I#~(mDbqHReJAZqxbn9n=Na9bbOYm zU6n`;eq`TZm`Gpe9(#AxO|rs8mIsfHHLj?$deojWjk_lz)tUyzYleUu$8}fMH8YO! zBwRLgpv;MXk_9$mX=Qt%PGC2F+Q?cxHmUsi(2;GHw!2E4@6 zFkLBb`65s7e_XPW+ar^l)Opiyjv4zL=6Nd>`*S>Pu<@MEFYb;Fopp!MD@#9QRTE!(*S+6DW8xG2euDz5YJ0XOi;!PMv$Zo^#9yU)0|`>3IFk zgP+zrH|mJ%%Ne)pHP2A~e3_YVFa)uV$1xe>BKh*H<$Wm}5AE{#^~1l_YrYBbyxzT2 zuXv_2&u`{k6^t0UmmS?yWYbp zU)9mr0bO|RGtYB&7M=->&3O_u&v@nu(JdvNoPE%kAZ9)mxM>GhRd*?Dj8p zJkQ3)^4E{&A~ApcTS=UQp}b^Wb$6d>>h15Z5z9`AQI${!x;QN~k4v2|Z9Ta01zHt+6_**@$*6X(awUQpp zpg-Tp`BnYAy=X7@H7c3w=3*Al}wT znQiTJBQ>7pX=`{}3GW_#5Arhqh^UVDAdLCI*p2#sZPDs?^$MRjE;htwUzf*6B!YQj zB+{bat@;ZaqXp++N%RFjUmZa6wfgVV)s+f-VSjANNc?1Em@V?~%=VcNi*;dR4HHolKOIGA1U)(KR zDH-;g*`hgV{%%}myIU9m4L56?TLat3j>bLMYy9}lxp-VWcqT|6rD0B^S5zunxO0xe z zb7s1XkvZ@f)<-Ai;2h5;>nc_JtzFQX7$Z`eR~;u9hkY4~T!CE7N=`auG4&?H!XlBh z`7d$SQKMutw(l-i{xnAr!_10y)HHL(jwO1`)`wW52EsPj7|VjBPZx$WSI#;`9zDl* zNsKv4?OTo+qcii3bs)OM>@Md;qiGLOV!RAo1O@}Q>^ai zzE)P7@Iq?rUIp{c>-xkVjxxC#>7K~L`rK==?0B$>P#&*MWJS~04yft8;_QCN{e_LP z5@jZLR&sTR=XsrLc5hg}rVn8^!lQaUhV)8w(fVXuo2CzeC9qd^y4>waudY|(91-i$ z>EN}yo$GxD`;l*xw74k9q+vvX6^lwUOkJ?^>Yz{oGF+Eu$AcSb9Tq z7vqDPiQOI1lR1e$qQY(v2#EfmkH4`^tl4*oj6RL0@V)5TA_x@yV}0)IEr-5L@4081 zJ5PR#68HGo^&h48TjKE%a=6l-I#=8JS2KRo=?G5(N?f7j}a*4atX10$D`V$%=Kyqs``p>SDBk5nZIj)Y@tXfxDv#c> z0X_&5#E$WQzFqqL_HDcdra5))G0#$Erk~Ocn|tKzPVUEL%Q;8fD!dT;?uNr@^iyYf zt{m~B7l@9r&(Afy*qhit-Cy62hIgT2kJBI2JVa{83G6^__ni^z+2KmJ&K{K!oGLx& z&n{JJu2jgWyw<%adygPUb|S*eP@`;gBiZ{VFCzJx`}D_b?{}^D-Rb(jS?%8~xnj9o zT@;J_G^D4aO4Oy--Ftg`nU(pzt)sb{;uP025;*lab666FBlEymYgGRf$!8zXqlBrq zckWuv%q#{L+{ZR25J#tb`KRN0mf^-?6Dn3P?H)2C-z>TASB1js-_*Sizpme3)G^*O ze|4!X`RrP~$9^Og5%)E?m(Mzt?`r$FdZ)iCR_938K37*Y&(*R3T#Ti?#)7ERyHs(J z2-|~rqM)m3YXWN{A|nj$4g$5WwFGq!&$GC{%!97(-?)$Ao-sAa%pca%;mO$-$ta!8 zsdbPRHbmRG21S1E)rFgp6kLfyE2cTi6UjU|L9PJ{`pilJJD5|t=Azn@uV6`En_Wh^ zkjgvf_rG)CvpUzVyjLCM8j3Z;|K{k?%jNQm^7xF!Q}g3z_gmZ>!6&Q}KPg1f8|M22 zuh(zZllwh$VkewI<&vuatdidxnf>37J^^7r*4B1`3SXO3m&t4|d*R!3*S^~aWU%%!0GqLmPfc9K%YyKLwyuaMzwQred@7(APBKf8k z>R97~IjEPO)+c%i+%rFx9cRLxZIkg6WtchHzl?O}^$G(bnMll2Y?O`bm-qK#-=}{1 zu;ioLKz)lYtXNpH;!CyN(=p!7&J_A*&Ek4l`@lu;4s3_t8Ig#E`(sVl1g;_9$9nn~ zJCUW7-E~aY3do|h-~grlMI8&*+%LAlU*>$I<4O>b=anzNs5?tw9~e0+WOQL)(minP zfCe*D&M5kJnVU1m)fV_M3y?pW$r+9LscpE+#Z}XlniC(z@_m1*^)K8y%Ya5NmlcK@ zMpo^?vx|_1D@gFQqg!q2d-4*Im7SjJ@Db#{yZ;hh>G{&JNry(Z2f^1(b?-# zLE84(7v6)j5<}})^DJ_jvWa!IH}8($L6jb3?oqJjx@c^@EB8=!T2~PYj>DgDtkq0^_kCluOp}l4e%t>8| z>Sce1k6TC9ePTt4>B3-x Date: Mon, 12 Apr 2004 12:08:53 +0000 Subject: [PATCH 0848/1463] added some makefiles svn path=/trunk/; revision=9096 --- reactos/Makefile | 238 ++----------------------------- reactos/drivers/Makefile | 48 ++++++- reactos/drivers/bus/Makefile | 50 +++++++ reactos/drivers/dd/Makefile | 50 +++++++ reactos/drivers/fs/Makefile | 50 +++++++ reactos/drivers/input/Makefile | 50 +++++++ reactos/drivers/lib/Makefile | 50 +++++++ reactos/drivers/net/Makefile | 50 +++++++ reactos/drivers/net/dd/Makefile | 50 +++++++ reactos/drivers/storage/Makefile | 50 +++++++ 10 files changed, 460 insertions(+), 226 deletions(-) create mode 100644 reactos/drivers/bus/Makefile create mode 100644 reactos/drivers/dd/Makefile create mode 100644 reactos/drivers/fs/Makefile create mode 100644 reactos/drivers/input/Makefile create mode 100644 reactos/drivers/lib/Makefile create mode 100644 reactos/drivers/net/Makefile create mode 100644 reactos/drivers/net/dd/Makefile create mode 100644 reactos/drivers/storage/Makefile diff --git a/reactos/Makefile b/reactos/Makefile index f26b858df35..52e6fdf2de0 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.216 2004/04/11 16:51:56 gvg Exp $ +# $Id: Makefile,v 1.217 2004/04/12 12:08:52 weiden Exp $ # # Global makefile # @@ -23,10 +23,6 @@ COMPONENTS = iface_native iface_additional hallib ntoskrnl # halx86 HALS = halx86 -# Bus drivers -# acpi isapnp pci -BUS = acpi isapnp pci - # Filesystem libraries # vfatlib LIB_FSLIB = vfatlib @@ -62,34 +58,6 @@ SERVERS = win32 # dos LOADERS = dos -# Driver support libraries -#bzip2 zlib -DRIVERS_LIB = bzip2 - -# Kernel mode device drivers -# Obsolete: ide -# beep blue floppy null parallel ramdrv serenum serial -DEVICE_DRIVERS = beep blue debugout floppy null serial bootvid - -# Kernel mode input drivers -INPUT_DRIVERS = keyboard mouclass psaux sermouse - -# Kernel mode file system drivers -# cdfs ext2 fs_rec ms np vfat -FS_DRIVERS = cdfs fs_rec ms np vfat mup ntfs - -# Kernel mode networking drivers -# afd ndis npf tcpip tdi wshtcpip -NET_DRIVERS = afd ndis npf tcpip tdi wshtcpip - -# Kernel mode networking device drivers -# ne2000 pcnet -NET_DEVICE_DRIVERS = ne2000 pcnet - -# Kernel mode storage drivers -# atapi cdrom class2 disk scsiport -STORAGE_DRIVERS = atapi cdrom class2 disk 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 @@ -111,8 +79,7 @@ else EXT_MODULES = endif -KERNEL_DRIVERS = $(DRIVERS_LIB) $(DEVICE_DRIVERS) $(INPUT_DRIVERS) $(FS_DRIVERS) \ - $(NET_DRIVERS) $(NET_DEVICE_DRIVERS) $(STORAGE_DRIVERS) VIDEO_DRIVERS +KERNEL_DRIVERS = drivers # Regression tests REGTESTS = regtests @@ -381,200 +348,25 @@ iface_additional_bootcd: # -# Bus driver rules +# Kernel Drivers rules # -$(BUS): %: - $(MAKE) -C drivers/bus/$* +$(KERNEL_DRIVERS): %: + $(MAKE) -C $* -$(BUS:%=%_implib): %_implib: - $(MAKE) -C drivers/bus/$* implib +$(KERNEL_DRIVERS:%=%_implib): %_implib: + $(MAKE) -C $* implib -$(BUS:%=%_clean): %_clean: - $(MAKE) -C drivers/bus/$* clean +$(KERNEL_DRIVERS:%=%_clean): %_clean: + $(MAKE) -C $* clean -$(BUS:%=%_install): %_install: - $(MAKE) -C drivers/bus/$* install +$(KERNEL_DRIVERS:%=%_install): %_install: + $(MAKE) -C $* install -$(BUS:%=%_bootcd): %_bootcd: - $(MAKE) -C drivers/bus/$* bootcd +$(KERNEL_DRIVERS:%=%_bootcd): %_bootcd: + $(MAKE) -C $* bootcd -.PHONY: $(BUS) $(BUS:%=%_implib) $(BUS:%=%_clean) \ - $(BUS:%=%_install) $(BUS:%=%_bootcd) - - -# -# Driver support libraries rules -# -$(DRIVERS_LIB): %: - $(MAKE) -C drivers/lib/$* - -$(DRIVERS_LIB:%=%_implib): %_implib: - $(MAKE) -C drivers/lib/$* implib - -$(DRIVERS_LIB:%=%_clean): %_clean: - $(MAKE) -C drivers/lib/$* clean - -$(DRIVERS_LIB:%=%_install): %_install: - $(MAKE) -C drivers/lib/$* install - -$(DRIVERS_LIB:%=%_bootcd): %_bootcd: - $(MAKE) -C drivers/lib/$* bootcd - -.PHONY: $(DRIVERS_LIB) $(DRIVERS_LIB:%=%_implib) $(DRIVERS_LIB:%=%_clean) \ - $(DRIVERS_LIB:%=%_install) $(DRIVERS_LIB:%=%_bootcd) - - -# -# Device driver rules -# -$(DEVICE_DRIVERS): %: - $(MAKE) -C drivers/dd/$* - -$(DEVICE_DRIVERS:%=%_implib): %_implib: - $(MAKE) -C drivers/dd/$* implib - -$(DEVICE_DRIVERS:%=%_clean): %_clean: - $(MAKE) -C drivers/dd/$* clean - -$(DEVICE_DRIVERS:%=%_install): %_install: - $(MAKE) -C drivers/dd/$* install - -$(DEVICE_DRIVERS:%=%_bootcd): %_bootcd: - $(MAKE) -C drivers/dd/$* bootcd - -.PHONY: $(DEVICE_DRIVERS) $(DEVICE_DRIVERS:%=%_implib) $(DEVICE_DRIVERS:%=%_clean) \ - $(DEVICE_DRIVERS:%=%_install) $(DEVICE_DRIVERS:%=%_bootcd) - - -# -# Video device driver rules -# -VIDEO_DRIVERS: - $(MAKE) -C drivers/video - -VIDEO_DRIVERS_implib: - $(MAKE) -C drivers/video implib - -VIDEO_DRIVERS_clean: - $(MAKE) -C drivers/video clean - -VIDEO_DRIVERS_install: - $(MAKE) -C drivers/video install - -VIDEO_DRIVERS_bootcd: - $(MAKE) -C drivers/video bootcd - -.PHONY: VIDEO_DRIVERS VIDEO_DRIVERS_implib VIDEO_DRIVERS_clean \ - VIDEO_DRIVERS_install VIDEO_DRIVERS_bootcd - - -# -# Input driver rules -# -$(INPUT_DRIVERS): %: - $(MAKE) -C drivers/input/$* - -$(INPUT_DRIVERS:%=%_implib): %_implib: - $(MAKE) -C drivers/input/$* implib - -$(INPUT_DRIVERS:%=%_clean): %_clean: - $(MAKE) -C drivers/input/$* clean - -$(INPUT_DRIVERS:%=%_install): %_install: - $(MAKE) -C drivers/input/$* install - -$(INPUT_DRIVERS:%=%_bootcd): %_bootcd: - $(MAKE) -C drivers/input/$* bootcd - -.PHONY: $(INPUT_DRIVERS) $(INPUT_DRIVERS:%=%_implib) $(INPUT_DRIVERS:%=%_clean)\ - $(INPUT_DRIVERS:%=%_install) $(INPUT_DRIVERS:%=%_bootcd) - -# -# Filesystem driver rules -# -$(FS_DRIVERS): %: - $(MAKE) -C drivers/fs/$* - -$(FS_DRIVERS:%=%_implib): %_implib: - $(MAKE) -C drivers/fs/$* implib - -$(FS_DRIVERS:%=%_clean): %_clean: - $(MAKE) -C drivers/fs/$* clean - -$(FS_DRIVERS:%=%_install): %_install: - $(MAKE) -C drivers/fs/$* install - -$(FS_DRIVERS:%=%_bootcd): %_bootcd: - $(MAKE) -C drivers/fs/$* bootcd - -.PHONY: $(FS_DRIVERS) $(FS_DRIVERS:%=%_implib) $(FS_DRIVERS:%=%_clean) \ - $(FS_DRIVERS:%=%_install) $(FS_DRIVERS:%=%_bootcd) - - -# -# Network driver rules -# -$(NET_DRIVERS): %: - $(MAKE) -C drivers/net/$* - -$(NET_DRIVERS:%=%_implib): %_implib: - $(MAKE) -C drivers/net/$* implib - -$(NET_DRIVERS:%=%_clean): %_clean: - $(MAKE) -C drivers/net/$* clean - -$(NET_DRIVERS:%=%_install): %_install: - $(MAKE) -C drivers/net/$* install - -$(NET_DRIVERS:%=%_bootcd): %_bootcd: - $(MAKE) -C drivers/net/$* bootcd - -.PHONY: $(NET_DRIVERS) $(NET_DRIVERS:%=%_implib) $(NET_DRIVERS:%=%_clean) \ - $(NET_DRIVERS:%=%_install) $(NET_DRIVERS:%=%_bootcd) - - -# -# Network device driver rules -# -$(NET_DEVICE_DRIVERS): %: - $(MAKE) -C drivers/net/dd/$* - -$(NET_DEVICE_DRIVERS:%=%_implib): %_implib: - $(MAKE) -C drivers/net/dd/$* implib - -$(NET_DEVICE_DRIVERS:%=%_clean): %_clean: - $(MAKE) -C drivers/net/dd/$* clean - -$(NET_DEVICE_DRIVERS:%=%_install): %_install: - $(MAKE) -C drivers/net/dd/$* install - -$(NET_DEVICE_DRIVERS:%=%_bootcd): %_bootcd: - $(MAKE) -C drivers/net/dd/$* bootcd - -.PHONY: $(NET_DEVICE_DRIVERS) $(NET_DEVICE_DRIVERS:%=%_clean) $(NET_DEVICE_DRIVERS:%=%_implib) \ - $(NET_DEVICE_DRIVERS:%=%_install) $(NET_DEVICE_DRIVERS:%=%_bootcd) - - -# -# storage driver rules -# -$(STORAGE_DRIVERS): %: - $(MAKE) -C drivers/storage/$* - -$(STORAGE_DRIVERS:%=%_implib): %_implib: - $(MAKE) -C drivers/storage/$* implib - -$(STORAGE_DRIVERS:%=%_clean): %_clean: - $(MAKE) -C drivers/storage/$* clean - -$(STORAGE_DRIVERS:%=%_install): %_install: - $(MAKE) -C drivers/storage/$* install - -$(STORAGE_DRIVERS:%=%_bootcd): %_bootcd: - $(MAKE) -C drivers/storage/$* bootcd - -.PHONY: $(STORAGE_DRIVERS) $(STORAGE_DRIVERS:%=%_clean) $(STORAGE_DRIVERS:%=%_implib) \ - $(STORAGE_DRIVERS:%=%_install) $(STORAGE_DRIVERS:%=%_bootcd) +.PHONY: $(KERNEL_DRIVERS) $(KERNEL_DRIVERS:%=%_implib) $(KERNEL_DRIVERS:%=%_clean) \ + $(KERNEL_DRIVERS:%=%_install) $(KERNEL_DRIVERS:%=%_bootcd) # diff --git a/reactos/drivers/Makefile b/reactos/drivers/Makefile index 68139b0aa41..aadb5c8ac80 100644 --- a/reactos/drivers/Makefile +++ b/reactos/drivers/Makefile @@ -1,13 +1,55 @@ -# $Id: Makefile,v 1.1 2003/12/06 23:10:50 mf Exp $ + # -# ReactOS drivers makefile to generate Doxygen documentation +# ReactOS control panels makefile # +PATH_TO_TOP = .. + +include $(PATH_TO_TOP)/rules.mak + +DRIVERS = bus dd fs input lib net storage video + +all: $(DRIVERS) + +depends: + +implib: $(DRIVERS:%=%_implib) + +clean: $(DRIVERS:%=%_clean) + +install: $(DRIVERS:%=%_install) + +bootcd: $(DRIVERS:%=%_bootcd) docu: doxygen Doxyfile -.PHONY: docu +.PHONY: all depends implib clean install bootcd docu +# +# Drivers +# +$(DRIVERS): %: + $(MAKE) -C $* + +$(DRIVERS:%=%_implib): %_implib: + $(MAKE) -C $* implib + +$(DRIVERS:%=%_clean): %_clean: + $(MAKE) -C $* clean + +$(DRIVERS:%=%_install): %_install: + $(MAKE) -C $* install + +$(DRIVERS:%=%_bootcd): %_bootcd: + $(MAKE) -C $* bootcd + +.PHONY: $(DRIVERS) $(DRIVERS:%=%_implib) $(DRIVERS:%=%_clean) $(DRIVERS:%=%_install) $(DRIVERS:%=%_bootcd) + + +etags: + find . -name "*.[ch]" -print | etags --language=c - + # EOF + diff --git a/reactos/drivers/bus/Makefile b/reactos/drivers/bus/Makefile new file mode 100644 index 00000000000..808ee461948 --- /dev/null +++ b/reactos/drivers/bus/Makefile @@ -0,0 +1,50 @@ +# +# ReactOS BUS Drivers +# + +PATH_TO_TOP = ../.. + +include $(PATH_TO_TOP)/rules.mak + +DRIVERS = acpi isapnp pci + +all: $(DRIVERS) + +depends: + +implib: $(DRIVERS:%=%_implib) + +clean: $(DRIVERS:%=%_clean) + +install: $(DRIVERS:%=%_install) + +bootcd: $(DRIVERS:%=%_bootcd) + +.PHONY: all depends implib clean install bootcd + + +# +# BUS DRIVERS +# +$(DRIVERS): %: + $(MAKE) -C $* + +$(DRIVERS:%=%_implib): %_implib: + $(MAKE) -C $* implib + +$(DRIVERS:%=%_clean): %_clean: + $(MAKE) -C $* clean + +$(DRIVERS:%=%_install): %_install: + $(MAKE) -C $* install + +$(DRIVERS:%=%_bootcd): %_bootcd: + $(MAKE) -C $* bootcd + +.PHONY: $(DRIVERS) $(DRIVERS:%=%_implib) $(DRIVERS:%=%_clean) $(DRIVERS:%=%_install) $(DRIVERS:%=%_bootcd) + + +etags: + find . -name "*.[ch]" -print | etags --language=c - + +# EOF diff --git a/reactos/drivers/dd/Makefile b/reactos/drivers/dd/Makefile new file mode 100644 index 00000000000..3c842adfa26 --- /dev/null +++ b/reactos/drivers/dd/Makefile @@ -0,0 +1,50 @@ +# +# ReactOS Device Drivers +# + +PATH_TO_TOP = ../.. + +include $(PATH_TO_TOP)/rules.mak + +DRIVERS = beep blue bootvid debugout floppy ide null serial + +all: $(DRIVERS) + +depends: + +implib: $(DRIVERS:%=%_implib) + +clean: $(DRIVERS:%=%_clean) + +install: $(DRIVERS:%=%_install) + +bootcd: $(DRIVERS:%=%_bootcd) + +.PHONY: all depends implib clean install bootcd + + +# +# DEVICE DRIVERS +# +$(DRIVERS): %: + $(MAKE) -C $* + +$(DRIVERS:%=%_implib): %_implib: + $(MAKE) -C $* implib + +$(DRIVERS:%=%_clean): %_clean: + $(MAKE) -C $* clean + +$(DRIVERS:%=%_install): %_install: + $(MAKE) -C $* install + +$(DRIVERS:%=%_bootcd): %_bootcd: + $(MAKE) -C $* bootcd + +.PHONY: $(DRIVERS) $(DRIVERS:%=%_implib) $(DRIVERS:%=%_clean) $(DRIVERS:%=%_install) $(DRIVERS:%=%_bootcd) + + +etags: + find . -name "*.[ch]" -print | etags --language=c - + +# EOF diff --git a/reactos/drivers/fs/Makefile b/reactos/drivers/fs/Makefile new file mode 100644 index 00000000000..c9295fd69fa --- /dev/null +++ b/reactos/drivers/fs/Makefile @@ -0,0 +1,50 @@ +# +# ReactOS FileSystem Drivers +# + +PATH_TO_TOP = ../.. + +include $(PATH_TO_TOP)/rules.mak + +DRIVERS = cdfs fs_rec ms mup np ntfs vfat + +all: $(DRIVERS) + +depends: + +implib: $(DRIVERS:%=%_implib) + +clean: $(DRIVERS:%=%_clean) + +install: $(DRIVERS:%=%_install) + +bootcd: $(DRIVERS:%=%_bootcd) + +.PHONY: all depends implib clean install bootcd + + +# +# FILESYSTEM DRIVERS +# +$(DRIVERS): %: + $(MAKE) -C $* + +$(DRIVERS:%=%_implib): %_implib: + $(MAKE) -C $* implib + +$(DRIVERS:%=%_clean): %_clean: + $(MAKE) -C $* clean + +$(DRIVERS:%=%_install): %_install: + $(MAKE) -C $* install + +$(DRIVERS:%=%_bootcd): %_bootcd: + $(MAKE) -C $* bootcd + +.PHONY: $(DRIVERS) $(DRIVERS:%=%_implib) $(DRIVERS:%=%_clean) $(DRIVERS:%=%_install) $(DRIVERS:%=%_bootcd) + + +etags: + find . -name "*.[ch]" -print | etags --language=c - + +# EOF diff --git a/reactos/drivers/input/Makefile b/reactos/drivers/input/Makefile new file mode 100644 index 00000000000..5e4fd073a87 --- /dev/null +++ b/reactos/drivers/input/Makefile @@ -0,0 +1,50 @@ +# +# ReactOS Input Drivers +# + +PATH_TO_TOP = ../.. + +include $(PATH_TO_TOP)/rules.mak + +DRIVERS = keyboard mouclass psaux sermouse + +all: $(DRIVERS) + +depends: + +implib: $(DRIVERS:%=%_implib) + +clean: $(DRIVERS:%=%_clean) + +install: $(DRIVERS:%=%_install) + +bootcd: $(DRIVERS:%=%_bootcd) + +.PHONY: all depends implib clean install bootcd + + +# +# INPUT DRIVERS +# +$(DRIVERS): %: + $(MAKE) -C $* + +$(DRIVERS:%=%_implib): %_implib: + $(MAKE) -C $* implib + +$(DRIVERS:%=%_clean): %_clean: + $(MAKE) -C $* clean + +$(DRIVERS:%=%_install): %_install: + $(MAKE) -C $* install + +$(DRIVERS:%=%_bootcd): %_bootcd: + $(MAKE) -C $* bootcd + +.PHONY: $(DRIVERS) $(DRIVERS:%=%_implib) $(DRIVERS:%=%_clean) $(DRIVERS:%=%_install) $(DRIVERS:%=%_bootcd) + + +etags: + find . -name "*.[ch]" -print | etags --language=c - + +# EOF diff --git a/reactos/drivers/lib/Makefile b/reactos/drivers/lib/Makefile new file mode 100644 index 00000000000..2da325d05f0 --- /dev/null +++ b/reactos/drivers/lib/Makefile @@ -0,0 +1,50 @@ +# +# ReactOS Driver Support Libraries +# + +PATH_TO_TOP = ../.. + +include $(PATH_TO_TOP)/rules.mak + +DRIVERS = bzip2 + +all: $(DRIVERS) + +depends: + +implib: $(DRIVERS:%=%_implib) + +clean: $(DRIVERS:%=%_clean) + +install: $(DRIVERS:%=%_install) + +bootcd: $(DRIVERS:%=%_bootcd) + +.PHONY: all depends implib clean install bootcd + + +# +# DRIVER SUPPORT LIBRARIES +# +$(DRIVERS): %: + $(MAKE) -C $* + +$(DRIVERS:%=%_implib): %_implib: + $(MAKE) -C $* implib + +$(DRIVERS:%=%_clean): %_clean: + $(MAKE) -C $* clean + +$(DRIVERS:%=%_install): %_install: + $(MAKE) -C $* install + +$(DRIVERS:%=%_bootcd): %_bootcd: + $(MAKE) -C $* bootcd + +.PHONY: $(DRIVERS) $(DRIVERS:%=%_implib) $(DRIVERS:%=%_clean) $(DRIVERS:%=%_install) $(DRIVERS:%=%_bootcd) + + +etags: + find . -name "*.[ch]" -print | etags --language=c - + +# EOF diff --git a/reactos/drivers/net/Makefile b/reactos/drivers/net/Makefile new file mode 100644 index 00000000000..ff76bd16d1e --- /dev/null +++ b/reactos/drivers/net/Makefile @@ -0,0 +1,50 @@ +# +# ReactOS Networking Drivers +# + +PATH_TO_TOP = ../.. + +include $(PATH_TO_TOP)/rules.mak + +DRIVERS = afd dd ndis npf tcpip tdi wshtcpip + +all: $(DRIVERS) + +depends: + +implib: $(DRIVERS:%=%_implib) + +clean: $(DRIVERS:%=%_clean) + +install: $(DRIVERS:%=%_install) + +bootcd: $(DRIVERS:%=%_bootcd) + +.PHONY: all depends implib clean install bootcd + + +# +# NETWORKING DRIVERS +# +$(DRIVERS): %: + $(MAKE) -C $* + +$(DRIVERS:%=%_implib): %_implib: + $(MAKE) -C $* implib + +$(DRIVERS:%=%_clean): %_clean: + $(MAKE) -C $* clean + +$(DRIVERS:%=%_install): %_install: + $(MAKE) -C $* install + +$(DRIVERS:%=%_bootcd): %_bootcd: + $(MAKE) -C $* bootcd + +.PHONY: $(DRIVERS) $(DRIVERS:%=%_implib) $(DRIVERS:%=%_clean) $(DRIVERS:%=%_install) $(DRIVERS:%=%_bootcd) + + +etags: + find . -name "*.[ch]" -print | etags --language=c - + +# EOF diff --git a/reactos/drivers/net/dd/Makefile b/reactos/drivers/net/dd/Makefile new file mode 100644 index 00000000000..45ea5047571 --- /dev/null +++ b/reactos/drivers/net/dd/Makefile @@ -0,0 +1,50 @@ +# +# ReactOS Networking Device Drivers +# + +PATH_TO_TOP = ../../.. + +include $(PATH_TO_TOP)/rules.mak + +DRIVERS = ne2000 pcnet + +all: $(DRIVERS) + +depends: + +implib: $(DRIVERS:%=%_implib) + +clean: $(DRIVERS:%=%_clean) + +install: $(DRIVERS:%=%_install) + +bootcd: $(DRIVERS:%=%_bootcd) + +.PHONY: all depends implib clean install bootcd + + +# +# NETWORKING DEVICE DRIVERS +# +$(DRIVERS): %: + $(MAKE) -C $* + +$(DRIVERS:%=%_implib): %_implib: + $(MAKE) -C $* implib + +$(DRIVERS:%=%_clean): %_clean: + $(MAKE) -C $* clean + +$(DRIVERS:%=%_install): %_install: + $(MAKE) -C $* install + +$(DRIVERS:%=%_bootcd): %_bootcd: + $(MAKE) -C $* bootcd + +.PHONY: $(DRIVERS) $(DRIVERS:%=%_implib) $(DRIVERS:%=%_clean) $(DRIVERS:%=%_install) $(DRIVERS:%=%_bootcd) + + +etags: + find . -name "*.[ch]" -print | etags --language=c - + +# EOF diff --git a/reactos/drivers/storage/Makefile b/reactos/drivers/storage/Makefile new file mode 100644 index 00000000000..11018f5ed4d --- /dev/null +++ b/reactos/drivers/storage/Makefile @@ -0,0 +1,50 @@ +# +# ReactOS Storage Drivers +# + +PATH_TO_TOP = ../.. + +include $(PATH_TO_TOP)/rules.mak + +DRIVERS = atapi cdrom class2 disk diskdump scsiport + +all: $(DRIVERS) + +depends: + +implib: $(DRIVERS:%=%_implib) + +clean: $(DRIVERS:%=%_clean) + +install: $(DRIVERS:%=%_install) + +bootcd: $(DRIVERS:%=%_bootcd) + +.PHONY: all depends implib clean install bootcd + + +# +# STORAGE DRIVERS +# +$(DRIVERS): %: + $(MAKE) -C $* + +$(DRIVERS:%=%_implib): %_implib: + $(MAKE) -C $* implib + +$(DRIVERS:%=%_clean): %_clean: + $(MAKE) -C $* clean + +$(DRIVERS:%=%_install): %_install: + $(MAKE) -C $* install + +$(DRIVERS:%=%_bootcd): %_bootcd: + $(MAKE) -C $* bootcd + +.PHONY: $(DRIVERS) $(DRIVERS:%=%_implib) $(DRIVERS:%=%_clean) $(DRIVERS:%=%_install) $(DRIVERS:%=%_bootcd) + + +etags: + find . -name "*.[ch]" -print | etags --language=c - + +# EOF From de77cb9e799dfedc11b526a0b62ff7571ccbe8ac Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Mon, 12 Apr 2004 13:03:29 +0000 Subject: [PATCH 0849/1463] - Fixed connection/disconnecting/closing handling, so we don't connect to dead and disconnected pipes. - Handle the OPEN_EXISTING flag correctly. - Report reasonable error messages instead of STATUS_UNSUCCESSFUL. svn path=/trunk/; revision=9097 --- reactos/drivers/fs/np/create.c | 307 +++++++++++++++++---------------- reactos/drivers/fs/np/finfo.c | 5 +- reactos/drivers/fs/np/fsctrl.c | 51 +++--- reactos/drivers/fs/np/npfs.c | 4 +- reactos/drivers/fs/np/npfs.h | 4 +- reactos/drivers/fs/np/rw.c | 21 ++- 6 files changed, 206 insertions(+), 186 deletions(-) diff --git a/reactos/drivers/fs/np/create.c b/reactos/drivers/fs/np/create.c index 1739dd7e449..903509ef48d 100644 --- a/reactos/drivers/fs/np/create.c +++ b/reactos/drivers/fs/np/create.c @@ -1,4 +1,4 @@ -/* $Id: create.c,v 1.16 2003/06/21 19:55:55 hbirr Exp $ +/* $Id: create.c,v 1.17 2004/04/12 13:03:29 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -16,10 +16,6 @@ #define NDEBUG #include - -/* GLOBALS *******************************************************************/ - - /* FUNCTIONS *****************************************************************/ NTSTATUS STDCALL @@ -142,31 +138,14 @@ NpfsCreate(PDEVICE_OBJECT DeviceObject, KeUnlockMutex(&DeviceExt->PipeListLock); -#if 0 - if (Disposition == OPEN_EXISTING) - { - /* do not connect to listening servers */ - FileObject->FsContext = ClientFcb; - - Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = 0; - - IoCompleteRequest(Irp, IO_NO_INCREMENT); - DPRINT("Success!\n"); - - return(STATUS_SUCCESS); - } -#endif - - /* search for disconnected or listening server fcb */ + /* search for listening server fcb */ current_entry = Pipe->ServerFcbListHead.Flink; while (current_entry != &Pipe->ServerFcbListHead) { ServerFcb = CONTAINING_RECORD(current_entry, NPFS_FCB, FcbListEntry); - if ((ServerFcb->PipeState == FILE_PIPE_LISTENING_STATE) - || (ServerFcb->PipeState == FILE_PIPE_DISCONNECTED_STATE)) + if (ServerFcb->PipeState == FILE_PIPE_LISTENING_STATE) { DPRINT("Server found! Fcb %p\n", ServerFcb); break; @@ -180,12 +159,18 @@ NpfsCreate(PDEVICE_OBJECT DeviceObject, FileObject->FsContext = ClientFcb; - Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = 0; - - IoCompleteRequest(Irp, IO_NO_INCREMENT); - - return(STATUS_SUCCESS); + if (Disposition == FILE_OPEN) + { + Irp->IoStatus.Status = STATUS_PIPE_BUSY; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_PIPE_BUSY; + } + else + { + Irp->IoStatus.Status = STATUS_SUCCESS; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_SUCCESS; + } } ClientFcb->OtherSide = ServerFcb; @@ -234,102 +219,151 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject, Buffer = (PIO_PIPE_CREATE_BUFFER)Irp->Tail.Overlay.AuxiliaryBuffer; - Pipe = ExAllocatePool(NonPagedPool, sizeof(NPFS_PIPE)); - if (Pipe == NULL) - { - Irp->IoStatus.Status = STATUS_NO_MEMORY; - Irp->IoStatus.Information = 0; - - IoCompleteRequest(Irp, IO_NO_INCREMENT); - - return(STATUS_NO_MEMORY); - } - + Irp->IoStatus.Information = 0; + Fcb = ExAllocatePool(NonPagedPool, sizeof(NPFS_FCB)); if (Fcb == NULL) { - ExFreePool(Pipe); - Irp->IoStatus.Status = STATUS_NO_MEMORY; - Irp->IoStatus.Information = 0; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - - return(STATUS_NO_MEMORY); + return STATUS_NO_MEMORY; } - if (RtlCreateUnicodeString(&Pipe->PipeName, FileObject->FileName.Buffer) == 0) - { - ExFreePool(Pipe); - ExFreePool(Fcb); - - Irp->IoStatus.Status = STATUS_NO_MEMORY; - Irp->IoStatus.Information = 0; - - IoCompleteRequest(Irp, IO_NO_INCREMENT); + KeLockMutex(&DeviceExt->PipeListLock); - return(STATUS_NO_MEMORY); - } + /* + * First search for existing Pipe with the same name. + */ - Pipe->ReferenceCount = 0; - InitializeListHead(&Pipe->ServerFcbListHead); - InitializeListHead(&Pipe->ClientFcbListHead); - KeInitializeSpinLock(&Pipe->FcbListLock); - - Pipe->PipeType = Buffer->WriteModeMessage ? FILE_PIPE_MESSAGE_TYPE : FILE_PIPE_BYTE_STREAM_TYPE; - Pipe->PipeWriteMode = Buffer->WriteModeMessage ? FILE_PIPE_MESSAGE_MODE : FILE_PIPE_BYTE_STREAM_MODE; - Pipe->PipeReadMode = Buffer->ReadModeMessage ? FILE_PIPE_MESSAGE_MODE : FILE_PIPE_BYTE_STREAM_MODE; - Pipe->PipeBlockMode = Buffer->NonBlocking; - Pipe->PipeConfiguration = IoStack->Parameters.Create.Options & 0x3; - Pipe->MaximumInstances = Buffer->MaxInstances; - Pipe->CurrentInstances = 0; - Pipe->TimeOut = Buffer->TimeOut; - if (!(IoStack->Parameters.Create.Options & FILE_PIPE_OUTBOUND) || - IoStack->Parameters.Create.Options & FILE_PIPE_FULL_DUPLEX) + current_entry = DeviceExt->PipeListHead.Flink; + while (current_entry != &DeviceExt->PipeListHead) { - if (Buffer->InBufferSize == 0) + current = CONTAINING_RECORD(current_entry, + NPFS_PIPE, + PipeListEntry); + + if (RtlCompareUnicodeString(&FileObject->FileName, ¤t->PipeName, TRUE) == 0) + { + break; + } + + current_entry = current_entry->Flink; + } + + if (current_entry != &DeviceExt->PipeListHead) + { + /* + * Found Pipe with the same name. Check if we are + * allowed to use it. + */ + + Pipe = current; + KeUnlockMutex(&DeviceExt->PipeListLock); + + if (Pipe->CurrentInstances >= Pipe->MaximumInstances) { - Pipe->InboundQuota = DeviceExt->DefaultQuota; + ExFreePool(Fcb); + Irp->IoStatus.Status = STATUS_PIPE_BUSY; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_PIPE_BUSY; } - else + + /* FIXME: Check pipe modes also! */ + if (Pipe->MaximumInstances != Buffer->MaxInstances || + Pipe->TimeOut.QuadPart != Buffer->TimeOut.QuadPart) { - Pipe->InboundQuota = PAGE_ROUND_UP(Buffer->InBufferSize); - if (Pipe->InboundQuota < DeviceExt->MinQuota) - { - Pipe->InboundQuota = DeviceExt->MinQuota; - } - else if (Pipe->InboundQuota > DeviceExt->MaxQuota) - { - Pipe->InboundQuota = DeviceExt->MaxQuota; - } - } + ExFreePool(Fcb); + Irp->IoStatus.Status = STATUS_ACCESS_DENIED; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_ACCESS_DENIED; + } } else { - Pipe->InboundQuota = 0; - } - if (IoStack->Parameters.Create.Options & (FILE_PIPE_FULL_DUPLEX|FILE_PIPE_OUTBOUND)) - { - if (Buffer->OutBufferSize == 0) + Pipe = ExAllocatePool(NonPagedPool, sizeof(NPFS_PIPE)); + if (Pipe == NULL) { - Pipe->OutboundQuota = DeviceExt->DefaultQuota; + KeUnlockMutex(&DeviceExt->PipeListLock); + Irp->IoStatus.Status = STATUS_NO_MEMORY; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_NO_MEMORY; + } + + if (RtlCreateUnicodeString(&Pipe->PipeName, FileObject->FileName.Buffer) == 0) + { + KeUnlockMutex(&DeviceExt->PipeListLock); + ExFreePool(Pipe); + ExFreePool(Fcb); + Irp->IoStatus.Status = STATUS_NO_MEMORY; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return(STATUS_NO_MEMORY); + } + + Pipe->ReferenceCount = 0; + InitializeListHead(&Pipe->ServerFcbListHead); + InitializeListHead(&Pipe->ClientFcbListHead); + KeInitializeSpinLock(&Pipe->FcbListLock); + + Pipe->PipeType = Buffer->WriteModeMessage ? FILE_PIPE_MESSAGE_TYPE : FILE_PIPE_BYTE_STREAM_TYPE; + Pipe->PipeWriteMode = Buffer->WriteModeMessage ? FILE_PIPE_MESSAGE_MODE : FILE_PIPE_BYTE_STREAM_MODE; + Pipe->PipeReadMode = Buffer->ReadModeMessage ? FILE_PIPE_MESSAGE_MODE : FILE_PIPE_BYTE_STREAM_MODE; + Pipe->PipeBlockMode = Buffer->NonBlocking; + Pipe->PipeConfiguration = IoStack->Parameters.Create.Options & 0x3; + Pipe->MaximumInstances = Buffer->MaxInstances; + Pipe->CurrentInstances = 0; + Pipe->TimeOut = Buffer->TimeOut; + if (!(IoStack->Parameters.Create.Options & FILE_PIPE_OUTBOUND) || + IoStack->Parameters.Create.Options & FILE_PIPE_FULL_DUPLEX) + { + if (Buffer->InBufferSize == 0) + { + Pipe->InboundQuota = DeviceExt->DefaultQuota; + } + else + { + Pipe->InboundQuota = PAGE_ROUND_UP(Buffer->InBufferSize); + if (Pipe->InboundQuota < DeviceExt->MinQuota) + { + Pipe->InboundQuota = DeviceExt->MinQuota; + } + else if (Pipe->InboundQuota > DeviceExt->MaxQuota) + { + Pipe->InboundQuota = DeviceExt->MaxQuota; + } + } } else { - Pipe->OutboundQuota = PAGE_ROUND_UP(Buffer->OutBufferSize); - if (Pipe->OutboundQuota < DeviceExt->MinQuota) + Pipe->InboundQuota = 0; + } + if (IoStack->Parameters.Create.Options & (FILE_PIPE_FULL_DUPLEX|FILE_PIPE_OUTBOUND)) + { + if (Buffer->OutBufferSize == 0) { - Pipe->OutboundQuota = DeviceExt->MinQuota; + Pipe->OutboundQuota = DeviceExt->DefaultQuota; } - else if (Pipe->OutboundQuota > DeviceExt->MaxQuota) + else { - Pipe->OutboundQuota = DeviceExt->MaxQuota; - } - } - } - else - { - Pipe->OutboundQuota = 0; + Pipe->OutboundQuota = PAGE_ROUND_UP(Buffer->OutBufferSize); + if (Pipe->OutboundQuota < DeviceExt->MinQuota) + { + Pipe->OutboundQuota = DeviceExt->MinQuota; + } + else if (Pipe->OutboundQuota > DeviceExt->MaxQuota) + { + Pipe->OutboundQuota = DeviceExt->MaxQuota; + } + } + } + else + { + Pipe->OutboundQuota = 0; + } + + InsertTailList(&DeviceExt->PipeListHead, &Pipe->PipeListEntry); + KeUnlockMutex(&DeviceExt->PipeListLock); } if (Pipe->OutboundQuota) @@ -338,17 +372,17 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject, if (Fcb->Data == NULL) { ExFreePool(Fcb); - RtlFreeUnicodeString(&Pipe->PipeName); - ExFreePool(Pipe); + + if (Pipe != current) + { + RtlFreeUnicodeString(&Pipe->PipeName); + ExFreePool(Pipe); + } Irp->IoStatus.Status = STATUS_NO_MEMORY; - Irp->IoStatus.Information = 0; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - - return(STATUS_NO_MEMORY); + return STATUS_NO_MEMORY; } - } else { @@ -362,34 +396,6 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject, Fcb->MaxDataLength = Pipe->OutboundQuota; KeInitializeSpinLock(&Fcb->DataListLock); - - KeLockMutex(&DeviceExt->PipeListLock); - current_entry = DeviceExt->PipeListHead.Flink; - while (current_entry != &DeviceExt->PipeListHead) - { - current = CONTAINING_RECORD(current_entry, - NPFS_PIPE, - PipeListEntry); - - if (RtlCompareUnicodeString(&Pipe->PipeName, ¤t->PipeName, TRUE) == 0) - { - break; - } - - current_entry = current_entry->Flink; - } - - if (current_entry != &DeviceExt->PipeListHead) - { - RtlFreeUnicodeString(&Pipe->PipeName); - ExFreePool(Pipe); - - Pipe = current; - } - else - { - InsertTailList(&DeviceExt->PipeListHead, &Pipe->PipeListEntry); - } Pipe->ReferenceCount++; Pipe->CurrentInstances++; @@ -399,8 +405,8 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject, Fcb->Pipe = Pipe; Fcb->PipeEnd = FILE_PIPE_SERVER_END; + Fcb->PipeState = FILE_PIPE_LISTENING_STATE; Fcb->OtherSide = NULL; - Fcb->PipeState = FILE_PIPE_DISCONNECTED_STATE; KeInitializeEvent(&Fcb->ConnectEvent, SynchronizationEvent, @@ -409,15 +415,10 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject, KeInitializeEvent(&Fcb->Event, SynchronizationEvent, FALSE); - - - KeUnlockMutex(&DeviceExt->PipeListLock); FileObject->FsContext = Fcb; Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = 0; - IoCompleteRequest(Irp, IO_NO_INCREMENT); return(STATUS_SUCCESS); @@ -459,7 +460,6 @@ NpfsClose(PDEVICE_OBJECT DeviceObject, KeLockMutex(&DeviceExt->PipeListLock); - if (Fcb->PipeEnd == FILE_PIPE_SERVER_END) { /* FIXME: Clean up existing connections here ?? */ @@ -475,9 +475,10 @@ NpfsClose(PDEVICE_OBJECT DeviceObject, */ KeSetEvent(&Fcb->OtherSide->Event, IO_NO_INCREMENT, FALSE); } - Fcb->PipeState = FILE_PIPE_DISCONNECTED_STATE; + Fcb->PipeState = 0; } } + Pipe->ReferenceCount--; if (Fcb->PipeEnd == FILE_PIPE_CLIENT_END) @@ -494,19 +495,25 @@ NpfsClose(PDEVICE_OBJECT DeviceObject, */ KeSetEvent(&Fcb->OtherSide->Event, IO_NO_INCREMENT, FALSE); } - Fcb->PipeState = FILE_PIPE_DISCONNECTED_STATE; + Fcb->PipeState = 0; } } FileObject->FsContext = NULL; +#if 0 + DPRINT("%x\n", Pipe->ReferenceCount); if (Pipe->ReferenceCount == 0) +#else + if (Fcb->PipeEnd == FILE_PIPE_SERVER_END && + Fcb->Pipe->CurrentInstances == 0) +#endif { KeAcquireSpinLock(&Pipe->FcbListLock, &oldIrql); if (Fcb->OtherSide) - { - RemoveEntryList(&Fcb->OtherSide->FcbListEntry); - } + { + RemoveEntryList(&Fcb->OtherSide->FcbListEntry); + } RemoveEntryList(&Fcb->FcbListEntry); KeReleaseSpinLock(&Pipe->FcbListLock, oldIrql); if (Fcb->OtherSide) diff --git a/reactos/drivers/fs/np/finfo.c b/reactos/drivers/fs/np/finfo.c index 450f0655523..90993914023 100644 --- a/reactos/drivers/fs/np/finfo.c +++ b/reactos/drivers/fs/np/finfo.c @@ -1,4 +1,4 @@ -/* $Id: finfo.c,v 1.5 2002/09/08 10:22:11 chorns Exp $ +/* $Id: finfo.c,v 1.6 2004/04/12 13:03:29 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -15,9 +15,6 @@ #define NDEBUG #include - - - /* FUNCTIONS *****************************************************************/ static NTSTATUS diff --git a/reactos/drivers/fs/np/fsctrl.c b/reactos/drivers/fs/np/fsctrl.c index 09c3344d1bb..537ea4403f3 100644 --- a/reactos/drivers/fs/np/fsctrl.c +++ b/reactos/drivers/fs/np/fsctrl.c @@ -1,4 +1,4 @@ -/* $Id: fsctrl.c,v 1.13 2003/11/13 15:26:07 ekohl Exp $ +/* $Id: fsctrl.c,v 1.14 2004/04/12 13:03:29 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -16,7 +16,6 @@ #define NDEBUG #include - /* FUNCTIONS *****************************************************************/ static NTSTATUS @@ -26,6 +25,7 @@ NpfsConnectPipe(PNPFS_FCB Fcb) PLIST_ENTRY current_entry; PNPFS_FCB ClientFcb; NTSTATUS Status; + KIRQL oldIrql; DPRINT("NpfsConnectPipe()\n"); @@ -35,19 +35,13 @@ NpfsConnectPipe(PNPFS_FCB Fcb) if (Fcb->PipeState == FILE_PIPE_CLOSING_STATE) return STATUS_PIPE_CLOSING; - /* - * Acceptable states are: FILE_PIPE_DISCONNECTED_STATE and - * FILE_PIPE_LISTENING_STATE - */ - DPRINT("Waiting for connection...\n"); Pipe = Fcb->Pipe; - Fcb->PipeState = FILE_PIPE_LISTENING_STATE; - /* search for a listening client fcb */ + KeAcquireSpinLock(&Pipe->FcbListLock, &oldIrql); current_entry = Pipe->ClientFcbListHead.Flink; while (current_entry != &Pipe->ClientFcbListHead) { @@ -55,8 +49,7 @@ NpfsConnectPipe(PNPFS_FCB Fcb) NPFS_FCB, FcbListEntry); - if ((ClientFcb->PipeState == FILE_PIPE_LISTENING_STATE) - || (ClientFcb->PipeState == FILE_PIPE_DISCONNECTED_STATE)) + if (ClientFcb->PipeState == FILE_PIPE_LISTENING_STATE) { break; } @@ -64,8 +57,7 @@ NpfsConnectPipe(PNPFS_FCB Fcb) current_entry = current_entry->Flink; } - if ((current_entry != &Pipe->ClientFcbListHead) - && (ClientFcb->PipeState == FILE_PIPE_LISTENING_STATE)) + if (current_entry != &Pipe->ClientFcbListHead) { /* found a listening client fcb */ DPRINT("Listening client fcb found -- connecting\n"); @@ -78,25 +70,23 @@ NpfsConnectPipe(PNPFS_FCB Fcb) Fcb->PipeState = FILE_PIPE_CONNECTED_STATE; ClientFcb->PipeState = FILE_PIPE_CONNECTED_STATE; + KeReleaseSpinLock(&Pipe->FcbListLock, oldIrql); + /* FIXME: create and initialize data queues */ /* signal client's connect event */ KeSetEvent(&ClientFcb->ConnectEvent, IO_NO_INCREMENT, FALSE); } - else if ((current_entry != &Pipe->ClientFcbListHead) - && (ClientFcb->PipeState == FILE_PIPE_DISCONNECTED_STATE)) - { - /* found a disconnected client fcb */ - DPRINT("Disconnected client fcb found - notifying client\n"); - - /* signal client's connect event */ - KeSetEvent(&ClientFcb->ConnectEvent, IO_NO_INCREMENT, FALSE); - } else { /* no listening client fcb found */ DPRINT("No listening client fcb found -- waiting for client\n"); + + KeReleaseSpinLock(&Pipe->FcbListLock, oldIrql); + + Fcb->PipeState = FILE_PIPE_LISTENING_STATE; + Status = KeWaitForSingleObject(&Fcb->ConnectEvent, UserRequest, KernelMode, @@ -496,7 +486,7 @@ NpfsFileSystemControl(PDEVICE_OBJECT DeviceObject, break; default: - DPRINT("IoControlCode: %x\n", IoStack->Parameters.FileSystemControl.IoControlCode) + DPRINT("IoControlCode: %x\n", IoStack->Parameters.FileSystemControl.FsControlCode) Status = STATUS_UNSUCCESSFUL; } @@ -508,4 +498,19 @@ NpfsFileSystemControl(PDEVICE_OBJECT DeviceObject, return(Status); } + +NTSTATUS STDCALL +NpfsFlushBuffers(PDEVICE_OBJECT DeviceObject, + PIRP Irp) +{ + /* FIXME: Implement */ + + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return STATUS_SUCCESS; +} + /* EOF */ diff --git a/reactos/drivers/fs/np/npfs.c b/reactos/drivers/fs/np/npfs.c index 3a2f20e2ab4..ae25b4cd16f 100644 --- a/reactos/drivers/fs/np/npfs.c +++ b/reactos/drivers/fs/np/npfs.c @@ -1,4 +1,4 @@ -/* $Id: npfs.c,v 1.9 2004/03/07 20:33:25 navaraf Exp $ +/* $Id: npfs.c,v 1.10 2004/04/12 13:03:29 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -41,7 +41,7 @@ DriverEntry(PDRIVER_OBJECT DriverObject, DriverObject->MajorFunction[IRP_MJ_QUERY_VOLUME_INFORMATION] = NpfsQueryVolumeInformation; // DriverObject->MajorFunction[IRP_MJ_CLEANUP] = NpfsCleanup; -// DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = NpfsFlushBuffers; + DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = NpfsFlushBuffers; // DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] = // NpfsDirectoryControl; DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = diff --git a/reactos/drivers/fs/np/npfs.h b/reactos/drivers/fs/np/npfs.h index e2f463b0b2f..2608ef0d511 100644 --- a/reactos/drivers/fs/np/npfs.h +++ b/reactos/drivers/fs/np/npfs.h @@ -1,4 +1,4 @@ -/* $Id: npfs.h,v 1.14 2003/06/21 19:55:55 hbirr Exp $ */ +/* $Id: npfs.h,v 1.15 2004/04/12 13:03:29 navaraf Exp $ */ #ifndef __SERVICES_FS_NP_NPFS_H #define __SERVICES_FS_NP_NPFS_H @@ -75,6 +75,8 @@ NTSTATUS STDCALL NpfsClose(PDEVICE_OBJECT DeviceObject, PIRP Irp); NTSTATUS STDCALL NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp); NTSTATUS STDCALL NpfsWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp); +NTSTATUS STDCALL NpfsFlushBuffers(PDEVICE_OBJECT DeviceObject, PIRP Irp); + NTSTATUS STDCALL NpfsFileSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp); NTSTATUS STDCALL NpfsQueryInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp); diff --git a/reactos/drivers/fs/np/rw.c b/reactos/drivers/fs/np/rw.c index 8eac2d0025d..df5d5948a5a 100644 --- a/reactos/drivers/fs/np/rw.c +++ b/reactos/drivers/fs/np/rw.c @@ -1,4 +1,4 @@ -/* $Id: rw.c,v 1.11 2004/04/10 16:20:59 navaraf Exp $ +/* $Id: rw.c,v 1.12 2004/04/12 13:03:29 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -16,10 +16,8 @@ #define NDEBUG #include - /* FUNCTIONS *****************************************************************/ - NTSTATUS STDCALL NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp) { @@ -49,7 +47,12 @@ NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp) if (ReadFcb == NULL) { DPRINT("Pipe is NOT connected!\n"); - Status = STATUS_UNSUCCESSFUL; + if (Fcb->PipeState == FILE_PIPE_LISTENING_STATE) + Status = STATUS_PIPE_LISTENING; + else if (Fcb->PipeState == FILE_PIPE_DISCONNECTED_STATE) + Status = STATUS_PIPE_DISCONNECTED; + else + Status = STATUS_UNSUCCESSFUL; Information = 0; goto done; } @@ -92,6 +95,7 @@ NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp) } if (Fcb->PipeState != FILE_PIPE_CONNECTED_STATE) { + DPRINT("PipeState: %x\n", Fcb->PipeState); Status = STATUS_PIPE_BROKEN; goto done; } @@ -223,7 +227,7 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject, if (Irp->MdlAddress == NULL) { - DbgPrint ("Irp->MdlAddress == NULL\n"); + DPRINT("Irp->MdlAddress == NULL\n"); Status = STATUS_UNSUCCESSFUL; Length = 0; goto done; @@ -232,7 +236,12 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject, if (Fcb->OtherSide == NULL) { DPRINT("Pipe is NOT connected!\n"); - Status = STATUS_UNSUCCESSFUL; + if (Fcb->PipeState == FILE_PIPE_LISTENING_STATE) + Status = STATUS_PIPE_LISTENING; + else if (Fcb->PipeState == FILE_PIPE_DISCONNECTED_STATE) + Status = STATUS_PIPE_DISCONNECTED; + else + Status = STATUS_UNSUCCESSFUL; Length = 0; goto done; } From a1240dac2eb86cc0e3d33a5cc8aa942aec204a93 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 12 Apr 2004 13:10:19 +0000 Subject: [PATCH 0850/1463] forgot adding the floppy driver svn path=/trunk/; revision=9098 --- reactos/drivers/storage/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 755a1a820f04403d58f558beaf128d13fd4b91fe Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 12 Apr 2004 13:13:38 +0000 Subject: [PATCH 0851/1463] reverted, my mistake svn path=/trunk/; revision=9099 --- reactos/drivers/storage/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/drivers/storage/Makefile b/reactos/drivers/storage/Makefile index c7bb0fde85c..11018f5ed4d 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 floppy scsiport +DRIVERS = atapi cdrom class2 disk diskdump scsiport all: $(DRIVERS) From 83d22245fda9b9663e0fd55a26cf66f66772d8d1 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 12 Apr 2004 14:10:50 +0000 Subject: [PATCH 0852/1463] make the bitmap look like it's supposed to svn path=/trunk/; revision=9100 --- reactos/lib/user32/resources/obm_mnarrow.bmp | Bin 106 -> 98 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/reactos/lib/user32/resources/obm_mnarrow.bmp b/reactos/lib/user32/resources/obm_mnarrow.bmp index 58302e78842529add31c6b35dd9beb8f0cf96e7c..ebcaa4b97378c196f57c67a09a6bcff153659788 100644 GIT binary patch literal 98 zcmZ?rO=5rmJ0PV2#B4y!3B-&*2m&f#5|jA<|3AYYpzt0bo&&@^K->bQL41(-A0P$* Deg_K9 literal 106 zcmZ?r&0>H6J0PV2#Oy%K4aAHP{BSRo(IHzK->nzO;8%d2Z@8^{{b-o D&-V+@ From a885a5c4bc6927b45e77e429bcfefb461b33aab6 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Mon, 12 Apr 2004 14:46:02 +0000 Subject: [PATCH 0853/1463] - Minor correction to returned error. svn path=/trunk/; revision=9101 --- reactos/drivers/fs/np/create.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/fs/np/create.c b/reactos/drivers/fs/np/create.c index 903509ef48d..eb41a770268 100644 --- a/reactos/drivers/fs/np/create.c +++ b/reactos/drivers/fs/np/create.c @@ -1,4 +1,4 @@ -/* $Id: create.c,v 1.17 2004/04/12 13:03:29 navaraf Exp $ +/* $Id: create.c,v 1.18 2004/04/12 14:46:02 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -77,7 +77,7 @@ NpfsCreate(PDEVICE_OBJECT DeviceObject, ExFreePool(ClientFcb); KeUnlockMutex(&DeviceExt->PipeListLock); - Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + Irp->IoStatus.Status = STATUS_OBJECT_NAME_NOT_FOUND; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); From 95182ed8f5d696279e3351c0abd756631b56af13 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Mon, 12 Apr 2004 15:08:14 +0000 Subject: [PATCH 0854/1463] remove MB_ERR_INVALID_CHARS flag svn path=/trunk/; revision=9102 --- reactos/lib/kernel32/misc/lang.c | 51 +++++++++----------------------- 1 file changed, 14 insertions(+), 37 deletions(-) diff --git a/reactos/lib/kernel32/misc/lang.c b/reactos/lib/kernel32/misc/lang.c index e94e5b84480..9378669deba 100644 --- a/reactos/lib/kernel32/misc/lang.c +++ b/reactos/lib/kernel32/misc/lang.c @@ -1,4 +1,4 @@ -/* $Id: lang.c,v 1.14 2004/04/12 10:49:48 mf Exp $ +/* $Id: lang.c,v 1.15 2004/04/12 15:08:14 mf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT : ReactOS user mode libraries @@ -1325,57 +1325,34 @@ GetTimeFormatA ( if (lpFormat != NULL) { /* First just determine the number of necessary bytes for the unicode string */ - int numBytes = MultiByteToWideChar(CP_ACP, - MB_ERR_INVALID_CHARS, - lpFormat, - -1, - NULL, - 0); + int numBytes = MultiByteToWideChar(CP_ACP, 0, lpFormat, -1, NULL, 0); - /* Try really hard not to fail due to format problems - If there are any problems with the format pass NULL - to GetTimeFormatW() */ if (numBytes > 0) { - lpFormatU = HeapAlloc(GetProcessHeap(),0,numBytes); + lpFormatU = HeapAlloc(GetProcessHeap(), 0, numBytes); if (lpFormatU != NULL) - MultiByteToWideChar(CP_ACP, - 0, - lpFormat, - -1, - lpFormatU, - numBytes); + 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); + numCharsU = GetTimeFormatW(Locale, dwFlags, lpTime, lpFormatU, NULL, 0); if (numCharsU != 0) { - lpTimeStrU = HeapAlloc(GetProcessHeap(),0,numCharsU*sizeof(WCHAR)); - if (lpTimeStrU == NULL) { - if (lpFormatU != NULL) - HeapFree(GetProcessHeap(),0,lpFormatU); - return 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 (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); + HeapFree(GetProcessHeap(), 0, lpFormatU); return retVal; } From d24371eaec463bf92b00a4ca70a437a7d6ebb948 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Mon, 12 Apr 2004 15:22:53 +0000 Subject: [PATCH 0855/1463] - Remove the hack implemenation of LookupPrivilegeValueW. - Don't check for load driver privilege yet. - Don't try to acquire load driver privilege in Services. svn path=/trunk/; revision=9103 --- reactos/lib/advapi32/sec/misc.c | 38 ++--------------------- reactos/ntoskrnl/io/driver.c | 5 ++- reactos/subsys/system/services/services.c | 24 +------------- 3 files changed, 7 insertions(+), 60 deletions(-) diff --git a/reactos/lib/advapi32/sec/misc.c b/reactos/lib/advapi32/sec/misc.c index 510de48f568..de3f73373c3 100644 --- a/reactos/lib/advapi32/sec/misc.c +++ b/reactos/lib/advapi32/sec/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.13 2004/04/11 19:21:43 navaraf Exp $ +/* $Id: misc.c,v 1.14 2004/04/12 15:22:52 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -421,47 +421,13 @@ LookupPrivilegeValueA (LPCSTR lpSystemName, /********************************************************************** * LookupPrivilegeValueW EXPORTED * - * @implemented + * @unimplemented */ BOOL STDCALL LookupPrivilegeValueW (LPCWSTR lpSystemName, LPCWSTR lpName, PLUID lpLuid) { - static LPCWSTR DefaultPrivilegeNames[] = - { - NULL, NULL, - L"SeCreateTokenPrivilege", L"SeAssignPrimaryTokenPrivilege", - L"SeLockMemoryPrivilege", L"SeIncreaseQuotaPrivilege", - 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", - }; - static unsigned DefaultPrivilegeCount = - sizeof(DefaultPrivilegeNames) / sizeof(DefaultPrivilegeNames[0]); - int i; - - for (i = 0; i < DefaultPrivilegeCount; i++) - { - if (!DefaultPrivilegeNames[i] || - lstrcmpW(DefaultPrivilegeNames[i], lpName)) - { - continue; - } - - lpLuid->LowPart = i; - lpLuid->HighPart = 0; - - return TRUE; - } - return FALSE; } diff --git a/reactos/ntoskrnl/io/driver.c b/reactos/ntoskrnl/io/driver.c index 6cc79fb9c26..2fb3553c359 100644 --- a/reactos/ntoskrnl/io/driver.c +++ b/reactos/ntoskrnl/io/driver.c @@ -1,4 +1,4 @@ -/* $Id: driver.c,v 1.44 2004/04/11 15:31:21 jfilby Exp $ +/* $Id: driver.c,v 1.45 2004/04/12 15:22:53 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1514,11 +1514,14 @@ NtLoadDriver(IN PUNICODE_STRING DriverServiceName) * Check security privileges */ +/* FIXME: Uncomment when privileges will be correctly implemented. */ +#if 0 if (!SeSinglePrivilegeCheck(SeLoadDriverPrivilege, KeGetPreviousMode())) { DPRINT("Privilege not held\n"); return STATUS_PRIVILEGE_NOT_HELD; } +#endif RtlInitUnicodeString(&ImagePath, NULL); diff --git a/reactos/subsys/system/services/services.c b/reactos/subsys/system/services/services.c index d1a0a08e4ce..c0924500cdb 100644 --- a/reactos/subsys/system/services/services.c +++ b/reactos/subsys/system/services/services.c @@ -1,4 +1,4 @@ -/* $Id: services.c,v 1.15 2004/04/11 16:10:05 jfilby Exp $ +/* $Id: services.c,v 1.16 2004/04/12 15:22:53 navaraf Exp $ * * service control manager * @@ -243,25 +243,6 @@ BOOL StartScmNamedPipeThreadListener(void) return TRUE; } -VOID FASTCALL -AcquireLoadDriverPrivilege(VOID) -{ - HANDLE hToken; - TOKEN_PRIVILEGES tkp; - - /* Get a token for this process. */ - if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { - /* Get the LUID for the debug privilege. */ - LookupPrivilegeValue(NULL, SE_LOAD_DRIVER_NAME, &tkp.Privileges[0].Luid); - - tkp.PrivilegeCount = 1; /* one privilege to set */ - tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; - - /* Get the debug privilege for this process. */ - AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); - } -} - int STDCALL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, @@ -274,9 +255,6 @@ WinMain(HINSTANCE hInstance, DPRINT("SERVICES: Service Control Manager\n"); - /* Acquire privileges to load drivers */ - AcquireLoadDriverPrivilege(); - /* Create start event */ if (!ScmCreateStartEvent(&hScmStartEvent)) { From 6a3ea3a95637d3b3b537a45ea3b8b9fa8a1b2069 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Mon, 12 Apr 2004 15:58:48 +0000 Subject: [PATCH 0856/1463] - fix Entry::read_tree() and get_next_path_component() - jump to FileChildWindow's directory when entered in address bar svn path=/trunk/; revision=9105 --- .../system/explorer/dialogs/searchprogram.cpp | 2 +- .../subsys/system/explorer/shell/entries.cpp | 48 ++++++---- .../subsys/system/explorer/shell/entries.h | 15 +-- .../subsys/system/explorer/shell/fatfs.cpp | 17 ++++ reactos/subsys/system/explorer/shell/fatfs.h | 1 + .../system/explorer/shell/filechild.cpp | 95 ++++++++++++------- .../subsys/system/explorer/shell/filechild.h | 1 - reactos/subsys/system/explorer/shell/pane.cpp | 4 - reactos/subsys/system/explorer/shell/pane.h | 2 +- .../subsys/system/explorer/shell/regfs.cpp | 17 ++++ reactos/subsys/system/explorer/shell/regfs.h | 1 + .../system/explorer/shell/shellbrowser.cpp | 6 +- .../subsys/system/explorer/shell/shellfs.cpp | 6 +- .../subsys/system/explorer/shell/shellfs.h | 2 +- .../subsys/system/explorer/shell/winfs.cpp | 17 ++++ reactos/subsys/system/explorer/shell/winfs.h | 1 + .../system/explorer/taskbar/favorites.cpp | 2 +- .../system/explorer/taskbar/quicklaunch.cpp | 2 +- .../system/explorer/taskbar/startmenu.cpp | 8 +- 19 files changed, 171 insertions(+), 76 deletions(-) diff --git a/reactos/subsys/system/explorer/dialogs/searchprogram.cpp b/reactos/subsys/system/explorer/dialogs/searchprogram.cpp index 9bf2c3c0754..365f4ece8a3 100644 --- a/reactos/subsys/system/explorer/dialogs/searchprogram.cpp +++ b/reactos/subsys/system/explorer/dialogs/searchprogram.cpp @@ -60,7 +60,7 @@ void CollectProgramsThread::collect_programs(const ShellPath& path) ShellDirectory* dir = new ShellDirectory(GetDesktopFolder(), path, 0); _dirs.push(dir); - dir->smart_scan(/*SCAN_EXTRACT_ICONS|*/SCAN_FILESYSTEM); + dir->smart_scan(SORT_NONE, /*SCAN_EXTRACT_ICONS|*/SCAN_FILESYSTEM); for(Entry*entry=dir->_down; entry; entry=entry->_next) { if (!_alive) diff --git a/reactos/subsys/system/explorer/shell/entries.cpp b/reactos/subsys/system/explorer/shell/entries.cpp index 063ebfdc3a7..20482d31ae2 100644 --- a/reactos/subsys/system/explorer/shell/entries.cpp +++ b/reactos/subsys/system/explorer/shell/entries.cpp @@ -112,24 +112,24 @@ Entry::~Entry() // read directory tree and expand to the given location -Entry* Entry::read_tree(const void* path, SORT_ORDER sortOrder) +Entry* Entry::read_tree(const void* path, SORT_ORDER sortOrder, int scan_flags) { CONTEXT("Entry::read_tree()"); HCURSOR old_cursor = SetCursor(LoadCursor(0, IDC_WAIT)); Entry* entry = this; - Entry* next_entry = entry; - for(const void*p=path; p&&next_entry; p=entry->get_next_path_component(p)) { - entry = next_entry; - - entry->read_directory(sortOrder); + for(const void*p=path; p && entry; ) { + entry->smart_scan(sortOrder, scan_flags); if (entry->_down) entry->_expanded = true; - next_entry = entry->find_entry(p); + Entry* found = entry->find_entry(p); + p = entry->get_next_path_component(p); + + entry = found; } SetCursor(old_cursor); @@ -138,9 +138,9 @@ Entry* Entry::read_tree(const void* path, SORT_ORDER sortOrder) } -void Entry::read_directory(SORT_ORDER sortOrder, int scan_flags) +void Entry::read_directory_base(SORT_ORDER sortOrder, int scan_flags) { - CONTEXT("Entry::read_directory(SORT_ORDER)"); + CONTEXT("Entry::read_directory_base()"); // call into subclass read_directory(scan_flags); @@ -304,13 +304,13 @@ void Entry::sort_directory(SORT_ORDER sortOrder) } -void Entry::smart_scan(int scan_flags) +void Entry::smart_scan(SORT_ORDER sortOrder, int scan_flags) { CONTEXT("Entry::smart_scan()"); if (!_scanned) { free_subentries(); - read_directory(SORT_NAME, scan_flags); // we could use IShellFolder2::GetDefaultColumn to determine sort order + read_directory_base(sortOrder, scan_flags); ///@todo We could use IShellFolder2::GetDefaultColumn to determine sort order. } } @@ -475,18 +475,26 @@ void Entry::free_subentries() } -const void* Directory::get_next_path_component(const void* p) +Entry* Root::read_tree(LPCTSTR path, int scan_flags) { - LPCTSTR s = (LPCTSTR) p; + Entry* entry; - while(*s && *s!=TEXT('\\') && *s!=TEXT('/')) - ++s; + if (path && *path) + entry = _entry->read_tree(path, _sort_order); + else { + entry = _entry->read_tree(NULL, _sort_order); - while(*s==TEXT('\\') || *s==TEXT('/')) - ++s; + _entry->smart_scan(); - if (!*s) - return NULL; + if (_entry->_down) + _entry->_expanded = true; + } - return s; + return entry; +} + + +Entry* Root::read_tree(LPCITEMIDLIST pidl, int scan_flags) +{ + return _entry->read_tree(pidl, _sort_order); } diff --git a/reactos/subsys/system/explorer/shell/entries.h b/reactos/subsys/system/explorer/shell/entries.h index b229713a267..ed1b9aa8992 100644 --- a/reactos/subsys/system/explorer/shell/entries.h +++ b/reactos/subsys/system/explorer/shell/entries.h @@ -99,14 +99,14 @@ public: void free_subentries(); - void read_directory(SORT_ORDER sortOrder, int scan_flags=SCAN_ALL); - Entry* read_tree(const void* path, SORT_ORDER sortOrder); + void read_directory_base(SORT_ORDER sortOrder=SORT_NAME, int scan_flags=SCAN_ALL); + Entry* read_tree(const void* path, SORT_ORDER sortOrder=SORT_NAME, int scan_flags=SCAN_ALL); void sort_directory(SORT_ORDER sortOrder); - void smart_scan(int scan_flags=SCAN_ALL); + void smart_scan(SORT_ORDER sortOrder=SORT_NAME, int scan_flags=SCAN_ALL); void extract_icon(); virtual void read_directory(int scan_flags=SCAN_ALL) {} - virtual const void* get_next_path_component(const void*) {return NULL;} + virtual const void* get_next_path_component(const void*) const {return NULL;} virtual Entry* find_entry(const void*) {return NULL;} virtual bool get_path(PTSTR path) const = 0; virtual ShellPath create_absolute_pidl() const {return (LPCITEMIDLIST)NULL;} @@ -121,9 +121,6 @@ protected: Directory() : _path(NULL) {} virtual ~Directory() {} - // default implementation like that of Windows file systems - virtual const void* get_next_path_component(const void*); - void* _path; }; @@ -139,4 +136,8 @@ struct Root { TCHAR _fs[_MAX_DIR]; DWORD _drive_type; DWORD _fs_flags; + SORT_ORDER _sort_order; + + Entry* read_tree(LPCTSTR path, int scan_flags=SCAN_ALL); + Entry* read_tree(LPCITEMIDLIST pidl, int scan_flags=SCAN_ALL); }; diff --git a/reactos/subsys/system/explorer/shell/fatfs.cpp b/reactos/subsys/system/explorer/shell/fatfs.cpp index 96481ac7e7b..91c19b650bf 100644 --- a/reactos/subsys/system/explorer/shell/fatfs.cpp +++ b/reactos/subsys/system/explorer/shell/fatfs.cpp @@ -203,6 +203,23 @@ void FATDirectory::read_directory(int scan_flags) } +const void* FATDirectory::get_next_path_component(const void* p) const +{ + LPCTSTR s = (LPCTSTR) p; + + while(*s && *s!=TEXT('\\') && *s!=TEXT('/')) + ++s; + + while(*s==TEXT('\\') || *s==TEXT('/')) + ++s; + + if (!*s) + return NULL; + + return s; +} + + Entry* FATDirectory::find_entry(const void* p) { LPCTSTR name = (LPCTSTR)p; diff --git a/reactos/subsys/system/explorer/shell/fatfs.h b/reactos/subsys/system/explorer/shell/fatfs.h index ba6cfacbd98..8d2eb2a8540 100644 --- a/reactos/subsys/system/explorer/shell/fatfs.h +++ b/reactos/subsys/system/explorer/shell/fatfs.h @@ -51,6 +51,7 @@ struct FATDirectory : public FATEntry, public Directory ~FATDirectory(); virtual void read_directory(int scan_flags=SCAN_ALL); + virtual const void* get_next_path_component(const void*) const; virtual Entry* find_entry(const void*); protected: diff --git a/reactos/subsys/system/explorer/shell/filechild.cpp b/reactos/subsys/system/explorer/shell/filechild.cpp index 80f9ef6ac86..160bb50a8b2 100644 --- a/reactos/subsys/system/explorer/shell/filechild.cpp +++ b/reactos/subsys/system/explorer/shell/filechild.cpp @@ -138,6 +138,8 @@ FileChildWindow::FileChildWindow(HWND hwnd, const FileChildWndInfo& info) switch(info._etype) { case ET_SHELL: { //@@ separate into FileChildWindow in ShellChildWindow, WinChildWindow, UnixChildWindow ? _root._drive_type = DRIVE_UNKNOWN; + _root._sort_order = SORT_NAME; + lstrcpy(drv, TEXT("\\")); lstrcpy(_root._volname, TEXT("Desktop")); _root._fs_flags = 0; @@ -145,12 +147,13 @@ FileChildWindow::FileChildWindow(HWND hwnd, const FileChildWndInfo& info) _root._entry = new ShellDirectory(GetDesktopFolder(), DesktopFolderPath(), hwnd); const ShellChildWndInfo& shell_info = static_cast(info); - entry = _root._entry->read_tree((LPCTSTR)&*shell_info._shell_path, SORT_NAME); + entry = _root.read_tree(&*shell_info._shell_path); break;} #ifdef __WINE__ case ET_UNIX: _root._drive_type = GetDriveType(info._path); + _root._sort_order = SORT_NAME; _tsplitpath(info._path, drv, NULL, NULL, NULL); lstrcat(drv, TEXT("/")); @@ -159,12 +162,13 @@ FileChildWindow::FileChildWindow(HWND hwnd, const FileChildWndInfo& info) lstrcpy(_root._fs, TEXT("unixfs")); lstrcpy(_root._path, TEXT("/")); _root._entry = new UnixDirectory(_root._path); - entry = _root._entry->read_tree(info._path, SORT_NAME); + entry = _root.read_tree(info._path+_tcslen(_root._path)); break; #endif case ET_NTOBJS: _root._drive_type = DRIVE_UNKNOWN; + _root._sort_order = SORT_NAME; _tsplitpath(info._path, drv, NULL, NULL, NULL); lstrcat(drv, TEXT("\\")); @@ -172,11 +176,12 @@ FileChildWindow::FileChildWindow(HWND hwnd, const FileChildWndInfo& info) lstrcpy(_root._fs, TEXT("NTOBJ")); lstrcpy(_root._path, drv); _root._entry = new NtObjDirectory(_root._path); - entry = _root._entry->read_tree(info._path, SORT_NAME); + entry = _root.read_tree(info._path+_tcslen(_root._path)); break; case ET_REGISTRY: _root._drive_type = DRIVE_UNKNOWN; + _root._sort_order = SORT_NONE; _tsplitpath(info._path, drv, NULL, NULL, NULL); lstrcat(drv, TEXT("\\")); @@ -184,11 +189,12 @@ FileChildWindow::FileChildWindow(HWND hwnd, const FileChildWndInfo& info) lstrcpy(_root._fs, TEXT("Registry")); lstrcpy(_root._path, drv); _root._entry = new RegistryRoot(); - entry = _root._entry->read_tree(info._path, SORT_NONE); + entry = _root.read_tree(info._path+_tcslen(_root._path)); break; case ET_FAT: { _root._drive_type = DRIVE_UNKNOWN; + _root._sort_order = SORT_NONE; _tsplitpath(info._path, drv, NULL, NULL, NULL); lstrcat(drv, TEXT("\\")); @@ -199,19 +205,20 @@ FileChildWindow::FileChildWindow(HWND hwnd, const FileChildWndInfo& info) if (drive->_hDrive != INVALID_HANDLE_VALUE) { _root._entry = drive; - entry = _root._entry->read_tree(info._path, SORT_NONE); + entry = _root.read_tree(info._path+_tcslen(_root._path)); } break;} default: // ET_WINDOWS _root._drive_type = GetDriveType(info._path); + _root._sort_order = SORT_NAME; _tsplitpath(info._path, drv, NULL, NULL, NULL); lstrcat(drv, TEXT("\\")); GetVolumeInformation(drv, _root._volname, _MAX_FNAME, 0, 0, &_root._fs_flags, _root._fs, _MAX_DIR); lstrcpy(_root._path, drv); _root._entry = new WinDirectory(_root._path); - entry = _root._entry->read_tree(info._path, SORT_NAME); + entry = _root.read_tree(info._path+_tcslen(_root._path)); } if (_root._entry) { @@ -230,17 +237,17 @@ FileChildWindow::FileChildWindow(HWND hwnd, const FileChildWndInfo& info) COL_TYPE|COL_SIZE|COL_DATE|COL_TIME|COL_ATTRIBUTES|COL_INDEX|COL_LINKS|COL_CONTENT)); } - _sortOrder = SORT_NAME; _header_wdths_ok = false; if (entry) set_curdir(entry); + else + set_curdir(_root._entry); if (_left_hwnd) { int idx = ListBox_FindItemData(_left_hwnd, ListBox_GetCurSel(_left_hwnd), _left->_cur); ListBox_SetCurSel(_left_hwnd, idx); - - ///@todo scroll to visibility + //SetFocus(_left_hwnd); } // store path into history @@ -263,8 +270,10 @@ void FileChildWindow::set_curdir(Entry* entry) if (!entry->_scanned) scan_entry(entry); else { + HiddenWindow hide(_right_hwnd); + ListBox_ResetContent(_right_hwnd); - _right->insert_entries(entry->_down, -1); + _right->insert_entries(entry->_down); _right->calc_widths(false); _right->set_header(); } @@ -277,7 +286,7 @@ void FileChildWindow::set_curdir(Entry* entry) if (_path[0]) if (SetCurrentDirectory(_path)) - set_url(_path); //@@ use "file://" format? + set_url(_path); //set_url(FmtString(TEXT("file://%s"), _path)); else _path[0] = TEXT('\0'); } @@ -313,6 +322,8 @@ bool FileChildWindow::expand_entry(Entry* dir) dir->_expanded = true; // insert entries in left pane + HiddenWindow hide(_left_hwnd); + _left->insert_entries(p, idx); if (!_header_wdths_ok) { @@ -621,15 +632,16 @@ void FileChildWindow::scan_entry(Entry* entry) entry->_expanded = false; // read contents from disk - entry->read_directory(_sortOrder); + entry->read_directory_base(_root._sort_order); ///@todo use modifyable sort order instead of fixed file system default // insert found entries in right pane - _right->insert_entries(entry->_down, -1); + HiddenWindow hide(_right_hwnd); + _right->insert_entries(entry->_down); _right->calc_widths(false); _right->set_header(); - _header_wdths_ok = FALSE; + _header_wdths_ok = false; SetCursor(old_cursor); } @@ -652,42 +664,61 @@ String FileChildWindow::jump_to_int(LPCTSTR url) switch(_root._entry->_etype) { case ET_SHELL: { //@@ separate into FileChildWindow in ShellChildWindow, WinChildWindow, UnixChildWindow ? ShellPath shell_path(dir); - entry = _root._entry->read_tree((LPCTSTR)&*shell_path, SORT_NAME); + entry = _root.read_tree(&*shell_path); break;} #ifdef __WINE__ case ET_UNIX: - entry = _root._entry->read_tree(info._path, SORT_NAME); + { + LPCTSTR path = dir; + + if (!_tcsicmp(path, _root._path, _tcslen(_root._path))) + path += _tcslen(_root._path); + + entry = _root.read_tree(path); + } break; #endif - case ET_NTOBJS: - entry = _root._entry->read_tree(dir, SORT_NAME); - break; + default: // ET_UNIX, ET_NTOBJS, ET_REGISTRY, ET_FAT, ET_WINDOWS + { + LPCTSTR path = dir; - case ET_REGISTRY: - entry = _root._entry->read_tree(dir, SORT_NONE); - break; + if (!_tcsnicmp(path, _root._path, _tcslen(_root._path))) + path += _tcslen(_root._path); - case ET_FAT: { - entry = _root._entry->read_tree(dir, SORT_NONE); - break;} - - default: // ET_WINDOWS - entry = _root._entry->read_tree(dir, SORT_NAME); //@@ smart_scan() ?! + entry = _root.read_tree(path); + } } if (entry) { + // refresh left pane entries + HiddenWindow hide(_left_hwnd); + + ListBox_ResetContent(_left_hwnd); + + _left->insert_entries(_root._entry); + + if (!_header_wdths_ok) { + if (_left->calc_widths(false)) { + _left->set_header(); + + _header_wdths_ok = true; + } + } + set_curdir(entry); if (_left_hwnd) { - int idx = ListBox_FindItemData(_left_hwnd, ListBox_GetCurSel(_left_hwnd), entry); - ListBox_SetCurSel(_left_hwnd, idx); + int idx = ListBox_FindItemData(_left_hwnd, -1, entry); - ///@todo scroll to visibility + if (idx != -1) { // The item should always be found. + ListBox_SetCurSel(_left_hwnd, idx); + SetFocus(_left_hwnd); + } } - return FmtString(TEXT("file://%s"), (LPCTSTR)dir); + return dir; //FmtString(TEXT("file://%s"), (LPCTSTR)dir); } } diff --git a/reactos/subsys/system/explorer/shell/filechild.h b/reactos/subsys/system/explorer/shell/filechild.h index b247265706a..bbb08fbfab1 100644 --- a/reactos/subsys/system/explorer/shell/filechild.h +++ b/reactos/subsys/system/explorer/shell/filechild.h @@ -113,7 +113,6 @@ protected: Root _root; Pane* _left; Pane* _right; - SORT_ORDER _sortOrder; TCHAR _path[MAX_PATH]; bool _header_wdths_ok; diff --git a/reactos/subsys/system/explorer/shell/pane.cpp b/reactos/subsys/system/explorer/shell/pane.cpp index 5dcc4a17e36..15e516b53ac 100644 --- a/reactos/subsys/system/explorer/shell/pane.cpp +++ b/reactos/subsys/system/explorer/shell/pane.cpp @@ -663,8 +663,6 @@ void Pane::insert_entries(Entry* dir, int idx) if (!entry) return; - SendMessage(_hwnd, WM_SETREDRAW, FALSE, 0); //ShowWindow(_hwnd, SW_HIDE); - for(; entry; entry=entry->_next) { #ifndef _LEFT_FILES if (_treePane && @@ -688,8 +686,6 @@ void Pane::insert_entries(Entry* dir, int idx) if (_treePane && entry->_expanded) insert_entries(entry->_down, idx); } - - SendMessage(_hwnd, WM_SETREDRAW, TRUE, 0); //ShowWindow(_hwnd, SW_SHOW); } diff --git a/reactos/subsys/system/explorer/shell/pane.h b/reactos/subsys/system/explorer/shell/pane.h index e594fdab38b..c40824ace93 100644 --- a/reactos/subsys/system/explorer/shell/pane.h +++ b/reactos/subsys/system/explorer/shell/pane.h @@ -92,7 +92,7 @@ struct Pane : public SubclassedWindow void calc_single_width(int col); void draw_item(LPDRAWITEMSTRUCT dis, Entry* entry, int calcWidthCol=-1); - void insert_entries(Entry* dir, int idx); + void insert_entries(Entry* dir, int idx=-1); BOOL command(UINT cmd); int Notify(int id, NMHDR* pnmh); diff --git a/reactos/subsys/system/explorer/shell/regfs.cpp b/reactos/subsys/system/explorer/shell/regfs.cpp index 9e55f1772d9..f114bfc9505 100644 --- a/reactos/subsys/system/explorer/shell/regfs.cpp +++ b/reactos/subsys/system/explorer/shell/regfs.cpp @@ -181,6 +181,23 @@ void RegDirectory::read_directory(int scan_flags) } +const void* RegDirectory::get_next_path_component(const void* p) const +{ + LPCTSTR s = (LPCTSTR) p; + + while(*s && *s!=TEXT('\\')) + ++s; + + while(*s==TEXT('\\')) + ++s; + + if (!*s) + return NULL; + + return s; +} + + Entry* RegDirectory::find_entry(const void* p) { LPCTSTR name = (LPCTSTR)p; diff --git a/reactos/subsys/system/explorer/shell/regfs.h b/reactos/subsys/system/explorer/shell/regfs.h index 026e4ddf1b6..799640b6bbd 100644 --- a/reactos/subsys/system/explorer/shell/regfs.h +++ b/reactos/subsys/system/explorer/shell/regfs.h @@ -51,6 +51,7 @@ struct RegDirectory : public RegEntry, public Directory } virtual void read_directory(int scan_flags=SCAN_ALL); + virtual const void* get_next_path_component(const void*) const; virtual Entry* find_entry(const void*); protected: diff --git a/reactos/subsys/system/explorer/shell/shellbrowser.cpp b/reactos/subsys/system/explorer/shell/shellbrowser.cpp index 188d5fc29e7..2dd766b83dd 100644 --- a/reactos/subsys/system/explorer/shell/shellbrowser.cpp +++ b/reactos/subsys/system/explorer/shell/shellbrowser.cpp @@ -80,18 +80,20 @@ LRESULT ShellBrowserChild::Init(LPCREATESTRUCT pcs) const String& root_name = GetDesktopFolder().get_name(_create_info._root_shell_path, SHGDN_FORPARSING); _root._drive_type = DRIVE_UNKNOWN; + _root._sort_order = SORT_NAME; + lstrcpy(_root._volname, root_name); // most of the time "Desktop" _root._fs_flags = 0; lstrcpy(_root._fs, TEXT("Desktop")); -//@@ _root._entry->read_tree(shell_info._root_shell_path.get_folder(), info._shell_path, SORT_NAME/*_sortOrder*/); +//@@ _root._entry->read_tree(shell_info._root_shell_path.get_folder(), info._shell_path, _root._sort_order/*_sortOrder*/); /*@todo we should call read_tree() here to iterate through the hierarchy and open all folders from shell_info._root_shell_path to shell_info._shell_path -> see FileChildWindow::FileChildWindow() */ _root._entry = new ShellDirectory(GetDesktopFolder(), _create_info._root_shell_path, _hwnd); - _root._entry->read_directory(); + _root._entry->read_directory_base(_root._sort_order); /* already filled by ShellDirectory constructor lstrcpy(_root._entry->_data.cFileName, TEXT("Desktop")); */ diff --git a/reactos/subsys/system/explorer/shell/shellfs.cpp b/reactos/subsys/system/explorer/shell/shellfs.cpp index 9c89c811548..402cb0e4c50 100644 --- a/reactos/subsys/system/explorer/shell/shellfs.cpp +++ b/reactos/subsys/system/explorer/shell/shellfs.cpp @@ -433,7 +433,7 @@ void ShellDirectory::read_directory(int scan_flags) _scanned = true; } -const void* ShellDirectory::get_next_path_component(const void* p) +const void* ShellDirectory::get_next_path_component(const void* p) const { LPITEMIDLIST pidl = (LPITEMIDLIST)p; @@ -450,6 +450,10 @@ Entry* ShellDirectory::find_entry(const void* p) { LPITEMIDLIST pidl = (LPITEMIDLIST) p; + // handle special case of empty trailing id list entry + if (!pidl->mkid.cb) + return this; + for(Entry*entry=_down; entry; entry=entry->_next) if (entry->_etype == ET_SHELL) { ShellEntry* se = static_cast(entry); diff --git a/reactos/subsys/system/explorer/shell/shellfs.h b/reactos/subsys/system/explorer/shell/shellfs.h index 9d3fd859eb0..beae8c7d1e3 100644 --- a/reactos/subsys/system/explorer/shell/shellfs.h +++ b/reactos/subsys/system/explorer/shell/shellfs.h @@ -99,7 +99,7 @@ struct ShellDirectory : public ShellEntry, public Directory } virtual void read_directory(int scan_flags=SCAN_ALL); - virtual const void* get_next_path_component(const void*); + virtual const void* get_next_path_component(const void*) const; virtual Entry* find_entry(const void* p); virtual bool get_path(PTSTR path) const; diff --git a/reactos/subsys/system/explorer/shell/winfs.cpp b/reactos/subsys/system/explorer/shell/winfs.cpp index 53dad9b49df..e32bc00b5ea 100644 --- a/reactos/subsys/system/explorer/shell/winfs.cpp +++ b/reactos/subsys/system/explorer/shell/winfs.cpp @@ -188,6 +188,23 @@ void WinDirectory::read_directory(int scan_flags) } +const void* WinDirectory::get_next_path_component(const void* p) const +{ + LPCTSTR s = (LPCTSTR) p; + + while(*s && *s!=TEXT('\\') && *s!=TEXT('/')) + ++s; + + while(*s==TEXT('\\') || *s==TEXT('/')) + ++s; + + if (!*s) + return NULL; + + return s; +} + + Entry* WinDirectory::find_entry(const void* p) { LPCTSTR name = (LPCTSTR)p; diff --git a/reactos/subsys/system/explorer/shell/winfs.h b/reactos/subsys/system/explorer/shell/winfs.h index e5e30463753..8c37a8037b4 100644 --- a/reactos/subsys/system/explorer/shell/winfs.h +++ b/reactos/subsys/system/explorer/shell/winfs.h @@ -61,6 +61,7 @@ struct WinDirectory : public WinEntry, public Directory } virtual void read_directory(int scan_flags=SCAN_ALL); + virtual const void* get_next_path_component(const void*) const; virtual Entry* find_entry(const void*); }; diff --git a/reactos/subsys/system/explorer/taskbar/favorites.cpp b/reactos/subsys/system/explorer/taskbar/favorites.cpp index d89e8f41efc..d263ae2408c 100644 --- a/reactos/subsys/system/explorer/taskbar/favorites.cpp +++ b/reactos/subsys/system/explorer/taskbar/favorites.cpp @@ -376,7 +376,7 @@ void BookmarkList::import_IE_favorites(ShellDirectory& dir, HWND hwnd) { TCHAR path[MAX_PATH], ext[_MAX_EXT]; - dir.smart_scan(SCAN_FILESYSTEM); + dir.smart_scan(SORT_NAME, SCAN_FILESYSTEM); for(Entry*entry=dir._down; entry; entry=entry->_next) { if (entry->_shell_attribs & SFGAO_HIDDEN) // ignore files like "desktop.ini" diff --git a/reactos/subsys/system/explorer/taskbar/quicklaunch.cpp b/reactos/subsys/system/explorer/taskbar/quicklaunch.cpp index be7af0f4eee..d2f863b3463 100644 --- a/reactos/subsys/system/explorer/taskbar/quicklaunch.cpp +++ b/reactos/subsys/system/explorer/taskbar/quicklaunch.cpp @@ -108,7 +108,7 @@ void QuickLaunchBar::AddShortcuts() RecursiveCreateDirectory(path); _dir = new ShellDirectory(GetDesktopFolder(), path, _hwnd); - _dir->smart_scan(SCAN_EXTRACT_ICONS|SCAN_FILESYSTEM); + _dir->smart_scan(SORT_NAME, SCAN_EXTRACT_ICONS|SCAN_FILESYSTEM); } catch(COMException&) { return; } diff --git a/reactos/subsys/system/explorer/taskbar/startmenu.cpp b/reactos/subsys/system/explorer/taskbar/startmenu.cpp index b21b3cef800..1b7818aff58 100644 --- a/reactos/subsys/system/explorer/taskbar/startmenu.cpp +++ b/reactos/subsys/system/explorer/taskbar/startmenu.cpp @@ -193,9 +193,9 @@ void StartMenu::AddEntries() WaitCursor wait; #ifdef _LAZY_ICONEXTRACT - dir.smart_scan(SCAN_FILESYSTEM); // lazy icon extraction, try to read directly from filesystem + dir.smart_scan(SORT_NAME, SCAN_FILESYSTEM); // lazy icon extraction, try to read directly from filesystem #else - dir.smart_scan(SCAN_EXTRACT_ICONS|SCAN_FILESYSTEM); + dir.smart_scan(SORT_NAME, SCAN_EXTRACT_ICONS|SCAN_FILESYSTEM); #endif } @@ -1870,9 +1870,9 @@ void RecentStartMenu::AddEntries() WaitCursor wait; #ifdef _LAZY_ICONEXTRACT - dir.smart_scan(SCAN_FILESYSTEM); + dir.smart_scan(SORT_NAME, SCAN_FILESYSTEM); #else - dir.smart_scan(SCAN_EXTRACT_ICONS|SCAN_FILESYSTEM); + dir.smart_scan(SORT_NAME, SCAN_EXTRACT_ICONS|SCAN_FILESYSTEM); #endif } From ba87b6d90296a79160b80a7b6995fd6c952809d1 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 12 Apr 2004 16:09:45 +0000 Subject: [PATCH 0857/1463] don't copy files if already present svn path=/trunk/; revision=9106 --- reactos/subsys/system/vmwinst/vmwinst.c | 41 +++++++++++++++++++++---- 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/reactos/subsys/system/vmwinst/vmwinst.c b/reactos/subsys/system/vmwinst/vmwinst.c index 8665da01127..f7f781ffa08 100644 --- a/reactos/subsys/system/vmwinst/vmwinst.c +++ b/reactos/subsys/system/vmwinst/vmwinst.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: vmwinst.c,v 1.1 2004/04/09 18:27:11 weiden Exp $ +/* $Id: vmwinst.c,v 1.2 2004/04/12 16:09:45 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS VMware(r) driver installation utility @@ -30,7 +30,7 @@ #include "vmwinst.h" HINSTANCE hAppInstance; -BOOL StartVMwConfigWizard, ActivateVBE = FALSE, UninstallDriver = FALSE; +BOOL StartVMwConfigWizard, DriverFilesFound, ActivateVBE = FALSE, UninstallDriver = FALSE; static WCHAR DestinationDriversPath[MAX_PATH+1]; static WCHAR CDDrive = L'\0'; @@ -376,8 +376,27 @@ PageWelcomeProc( switch(pnmh->code) { case PSN_SETACTIVE: + { PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT); break; + } + case PSN_WIZNEXT: + { + if(DriverFilesFound) + { + if(!EnableVmwareDriver(FALSE, FALSE, TRUE)) + { + WCHAR Msg[1024]; + LoadString(hAppInstance, IDS_FAILEDTOACTIVATEDRIVER, Msg, sizeof(Msg) / sizeof(WCHAR)); + MessageBox(GetParent(hwndDlg), Msg, NULL, MB_ICONWARNING); + SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_WELCOMEPAGE); + return TRUE; + } + SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_CONFIG); + return TRUE; + } + break; + } } break; } @@ -417,9 +436,6 @@ PageInsertDiscProc( return TRUE; } - DestinationDriversPath[0] = L'\0'; - wcscat(DestinationDriversPath, DestinationPath); - wcscat(DestinationDriversPath, L"drivers\\"); if(!InstallFile(DestinationPath, vmx_fb) || !InstallFile(DestinationPath, vmx_mode) || !InstallFile(DestinationDriversPath, vmx_svga)) @@ -554,6 +570,11 @@ PageConfigProc( SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_CHOOSEACTION); return TRUE; } + if(DriverFilesFound) + { + SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_WELCOMEPAGE); + return TRUE; + } break; } case PSN_WIZFINISH: @@ -833,9 +854,17 @@ WinMain(HINSTANCE hInstance, { wcscat(DestinationPath, L"\\"); } + DestinationDriversPath[0] = L'\0'; + wcscat(DestinationDriversPath, DestinationPath); + wcscat(DestinationDriversPath, L"drivers\\"); + SetCurrentDirectory(DestinationPath); - StartVMwConfigWizard = IsVmwSVGAEnabled(); + DriverFilesFound = FileExists(DestinationPath, vmx_fb) && + FileExists(DestinationPath, vmx_mode) && + FileExists(DestinationDriversPath, vmx_svga); + + StartVMwConfigWizard = DriverFilesFound && IsVmwSVGAEnabled(); /* Show the wizard */ CreateWizard(); From 17b4be229ee85b78abb48b74f9b7cee0db7438ec Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 12 Apr 2004 16:14:54 +0000 Subject: [PATCH 0858/1463] minor fix svn path=/trunk/; revision=9107 --- reactos/subsys/system/vmwinst/vmwinst.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/system/vmwinst/vmwinst.c b/reactos/subsys/system/vmwinst/vmwinst.c index f7f781ffa08..b87412a2740 100644 --- a/reactos/subsys/system/vmwinst/vmwinst.c +++ b/reactos/subsys/system/vmwinst/vmwinst.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: vmwinst.c,v 1.2 2004/04/12 16:09:45 weiden Exp $ +/* $Id: vmwinst.c,v 1.3 2004/04/12 16:14:54 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS VMware(r) driver installation utility @@ -560,7 +560,7 @@ PageConfigProc( { case PSN_SETACTIVE: { - PropSheet_SetWizButtons(GetParent(hwndDlg), (StartVMwConfigWizard ? PSWIZB_FINISH | PSWIZB_BACK : PSWIZB_FINISH)); + PropSheet_SetWizButtons(GetParent(hwndDlg), ((StartVMwConfigWizard || DriverFilesFound) ? PSWIZB_FINISH | PSWIZB_BACK : PSWIZB_FINISH)); break; } case PSN_WIZBACK: From f6288bd6e9c44d202f868ba2baaa7459497e46b5 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Mon, 12 Apr 2004 17:09:04 +0000 Subject: [PATCH 0859/1463] immediatelly maximize first MDI child window svn path=/trunk/; revision=9108 --- reactos/subsys/system/explorer/shell/shellbrowser.h | 4 +--- reactos/subsys/system/explorer/shell/webchild.h | 4 +--- reactos/subsys/system/explorer/utility/window.cpp | 4 ++-- reactos/subsys/system/explorer/utility/window.h | 2 +- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/reactos/subsys/system/explorer/shell/shellbrowser.h b/reactos/subsys/system/explorer/shell/shellbrowser.h index dbb80fa54bf..4849c538393 100644 --- a/reactos/subsys/system/explorer/shell/shellbrowser.h +++ b/reactos/subsys/system/explorer/shell/shellbrowser.h @@ -41,13 +41,11 @@ struct ShellBrowserChild : public ChildWindow, public IShellBrowserImpl { #ifndef _NO_MDI ChildWindow* child = ChildWindow::create(info, info._pos.rcNormalPosition, - WINDOW_CREATOR_INFO(ShellBrowserChild,ShellChildWndInfo), CLASSNAME_CHILDWND, NULL); + WINDOW_CREATOR_INFO(ShellBrowserChild,ShellChildWndInfo), CLASSNAME_CHILDWND, NULL, info._pos.showCmd==SW_SHOWMAXIMIZED? WS_MAXIMIZE: 0); #else ///@todo SDI implementation #endif - ShowWindow(*child, info._pos.showCmd); - return static_cast(child); } diff --git a/reactos/subsys/system/explorer/shell/webchild.h b/reactos/subsys/system/explorer/shell/webchild.h index c130a9861ae..adcb0c09783 100644 --- a/reactos/subsys/system/explorer/shell/webchild.h +++ b/reactos/subsys/system/explorer/shell/webchild.h @@ -903,9 +903,7 @@ struct WebChildWindow : public IPCtrlWindow static WebChildWindow* create(const FileChildWndInfo& info) { ChildWindow* child = ChildWindow::create(info, info._pos.rcNormalPosition, - WINDOW_CREATOR_INFO(WebChildWindow,WebChildWndInfo), CLASSNAME_CHILDWND, NULL); - - ShowWindow(*child, info._pos.showCmd); + WINDOW_CREATOR_INFO(WebChildWindow,WebChildWndInfo), CLASSNAME_CHILDWND, NULL, info._pos.showCmd==SW_SHOWMAXIMIZED? WS_MAXIMIZE: 0); return static_cast(child); } diff --git a/reactos/subsys/system/explorer/utility/window.cpp b/reactos/subsys/system/explorer/utility/window.cpp index 75f96102f40..bb5d7a945fe 100644 --- a/reactos/subsys/system/explorer/utility/window.cpp +++ b/reactos/subsys/system/explorer/utility/window.cpp @@ -386,7 +386,7 @@ ChildWindow::ChildWindow(HWND hwnd, const ChildWndInfo& info) ChildWindow* ChildWindow::create(const ChildWndInfo& info, const RECT& rect, CREATORFUNC_INFO creator, - LPCTSTR classname, LPCTSTR title) + LPCTSTR classname, LPCTSTR title, DWORD style) { MDICREATESTRUCT mcs; @@ -397,7 +397,7 @@ ChildWindow* ChildWindow::create(const ChildWndInfo& info, const RECT& rect, CRE mcs.y = rect.top; mcs.cx = rect.right - rect.left; mcs.cy = rect.bottom - rect.top; - mcs.style = 0; + mcs.style = style; mcs.lParam = 0; return static_cast(create_mdi_child(info, mcs, creator)); diff --git a/reactos/subsys/system/explorer/utility/window.h b/reactos/subsys/system/explorer/utility/window.h index 841ac768db3..3a5e4118cc7 100644 --- a/reactos/subsys/system/explorer/utility/window.h +++ b/reactos/subsys/system/explorer/utility/window.h @@ -293,7 +293,7 @@ struct ChildWindow : public Window ChildWindow(HWND hwnd, const ChildWndInfo& info); static ChildWindow* create(const ChildWndInfo& info, const RECT& rect, CREATORFUNC_INFO creator, - LPCTSTR classname, LPCTSTR title=NULL); + LPCTSTR classname, LPCTSTR title=NULL, DWORD style=0); bool go_to(LPCTSTR url); From 318d9e885eb6cc2e643d62c901ec9e29485f1445 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Mon, 12 Apr 2004 17:09:36 +0000 Subject: [PATCH 0860/1463] - Return some reasonable values from GlobalMemoryStatusEx. svn path=/trunk/; revision=9109 --- reactos/lib/kernel32/misc/stubs.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/reactos/lib/kernel32/misc/stubs.c b/reactos/lib/kernel32/misc/stubs.c index dbc3daf39ba..3dee78ae0c3 100644 --- a/reactos/lib/kernel32/misc/stubs.c +++ b/reactos/lib/kernel32/misc/stubs.c @@ -1,8 +1,9 @@ -/* $Id: stubs.c,v 1.70 2004/03/18 18:29:19 weiden Exp $ +/* $Id: stubs.c,v 1.71 2004/04/12 17:09:36 navaraf Exp $ * * KERNEL32.DLL stubs (unimplemented functions) * Remove from this file, if you implement them. */ + #include //#define _OLE2NLS_IN_BUILD_ @@ -1026,8 +1027,17 @@ GlobalMemoryStatusEx( LPMEMORYSTATUSEX lpBuffer ) { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; + DPRINT1("GlobalMemoryStatusEx is unimplmented\n"); + lpBuffer->dwLength = sizeof(MEMORYSTATUSEX); + lpBuffer->dwMemoryLoad = 0; + lpBuffer->ullTotalPhys = 32*1024*1024; + lpBuffer->ullAvailPhys = 32*1024*1024; + lpBuffer->ullTotalPageFile = 32*1024*1024; + lpBuffer->ullAvailPageFile = 32*1024*1024; + lpBuffer->ullTotalVirtual = 32*1024*1024; + lpBuffer->ullAvailVirtual = 32*1024*1024; + lpBuffer->ullAvailExtendedVirtual = 0; + return TRUE; } /* From 15d5f5709efcafafc619ce686ac40963b622dcb4 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Mon, 12 Apr 2004 17:14:55 +0000 Subject: [PATCH 0861/1463] - Initial hacky implementation of some SCM calls needed by coLinux. svn path=/trunk/; revision=9110 --- reactos/include/services/scmprot.h | 115 ++++++ reactos/lib/advapi32/service/scm.c | 358 +++++++++++++++- reactos/subsys/system/services/database.c | 81 ++-- reactos/subsys/system/services/services.c | 482 +++++++++++++++++++++- reactos/subsys/system/services/services.h | 34 ++ 5 files changed, 986 insertions(+), 84 deletions(-) create mode 100644 reactos/include/services/scmprot.h diff --git a/reactos/include/services/scmprot.h b/reactos/include/services/scmprot.h new file mode 100644 index 00000000000..12d6f8a358a --- /dev/null +++ b/reactos/include/services/scmprot.h @@ -0,0 +1,115 @@ +/* + * Service Control Manager - Protocol Header + * + * Copyright (C) 2004 Filip Navara + * + * This software 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 software 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 General Public License + * along with this software; see the file COPYING.LIB. If not, write + * to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, + * MA 02139, USA. + * + * $Id: scmprot.h,v 1.1 2004/04/12 17:14:26 navaraf Exp $ + */ + +#ifndef _SCM_H +#define _SCM_H + +/* + * NOTE: + * This protocol isn't compatible with the Windows (R) one. Since + * Windows (R) XP (or 2000?) all the communcation goes through RPC. + * We don't have RPC implemented yet, so it can't be used yet :( + */ + +typedef struct +{ + ULONG Length; + WCHAR Buffer[256]; +} SCM_STRING; + +#define INIT_SCM_STRING(x, y) x.Length = wcslen(y) * sizeof(WCHAR), RtlCopyMemory(x.Buffer, y, x.Length + sizeof(UNICODE_NULL)) + +/* + * Global requests + */ + +#define SCM_OPENSERVICE 0x14 +#define SCM_CREATESERVICE 0x20 + +typedef struct _SCM_OPENSERVICE_REQUEST +{ + DWORD RequestCode; + SCM_STRING ServiceName; + DWORD dwDesiredAccess; +} SCM_OPENSERVICE_REQUEST, *PSCM_OPENSERVICE_REQUEST; + +typedef struct _SCM_OPENSERVICE_REPLY +{ + DWORD ReplyStatus; + WCHAR PipeName[128]; +} SCM_OPENSERVICE_REPLY, *PSCM_OPENSERVICE_REPLY; + +typedef struct _SCM_CREATESERVICE_REQUEST +{ + DWORD RequestCode; + SCM_STRING ServiceName; + SCM_STRING DisplayName; + DWORD dwDesiredAccess; + DWORD dwServiceType; + DWORD dwStartType; + DWORD dwErrorControl; + SCM_STRING BinaryPathName; + SCM_STRING LoadOrderGroup; + SCM_STRING Dependencies; + SCM_STRING ServiceStartName; + SCM_STRING Password; +} SCM_CREATESERVICE_REQUEST, *PSCM_CREATESERVICE_REQUEST; + +typedef struct _SCM_CREATESERVICE_REPLY +{ + DWORD ReplyStatus; + WCHAR PipeName[128]; +} SCM_CREATESERVICE_REPLY, *PSCM_CREATESERVICE_REPLY; + +typedef union _SCM_REQUEST +{ + DWORD RequestCode; + SCM_OPENSERVICE_REQUEST OpenService; + SCM_CREATESERVICE_REQUEST CreateService; +} SCM_REQUEST, *PSCM_REQUEST; + +typedef union _SCM_REPLY +{ + DWORD ReplyStatus; + SCM_OPENSERVICE_REPLY OpenService; + SCM_CREATESERVICE_REPLY CreateService; +} SCM_REPLY, *PSCM_REPLY; + +/* + * Per service requests + */ + +#define SCM_DELETESERVICE 0x10 +#define SCM_STARTSERVICE 0x11 + +typedef union _SCM_SERVICE_REQUEST +{ + DWORD RequestCode; +} SCM_SERVICE_REQUEST, *PSCM_SERVICE_REQUEST; + +typedef union _SCM_SERVICE_REPLY +{ + DWORD ReplyStatus; +} SCM_SERVICE_REPLY, *PSCM_SERVICE_REPLY; + +#endif diff --git a/reactos/lib/advapi32/service/scm.c b/reactos/lib/advapi32/service/scm.c index ae519b77c45..298b9f6e2e8 100644 --- a/reactos/lib/advapi32/service/scm.c +++ b/reactos/lib/advapi32/service/scm.c @@ -1,4 +1,4 @@ -/* $Id: scm.c,v 1.19 2003/08/07 04:03:22 royce Exp $ +/* $Id: scm.c,v 1.20 2004/04/12 17:14:54 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -17,8 +17,9 @@ #include #include #include +#include -#define DBG +//#define DBG #include /* FUNCTIONS *****************************************************************/ @@ -82,14 +83,14 @@ BOOL STDCALL CloseServiceHandle(SC_HANDLE hSCObject) { - HANDLE hPipe; - DPRINT("CloseServiceHandle() - called.\n"); -// SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + DPRINT("CloseServiceHandle\n"); - if (!CloseHandle(hPipe)) { + if (!CloseHandle(hSCObject)) + { SetLastError(ERROR_INVALID_HANDLE); return FALSE; } + return TRUE; } @@ -132,8 +133,48 @@ CreateServiceA( LPCSTR lpServiceStartName, LPCSTR lpPassword) { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return NULL; + UNICODE_STRING lpServiceNameW; + UNICODE_STRING lpDisplayNameW; + UNICODE_STRING lpBinaryPathNameW; + UNICODE_STRING lpLoadOrderGroupW; + UNICODE_STRING lpServiceStartNameW; + UNICODE_STRING lpPasswordW; + SC_HANDLE hService; + + RtlCreateUnicodeStringFromAsciiz(&lpServiceNameW, (LPSTR)lpServiceName); + RtlCreateUnicodeStringFromAsciiz(&lpDisplayNameW, (LPSTR)lpDisplayName); + RtlCreateUnicodeStringFromAsciiz(&lpBinaryPathNameW, (LPSTR)lpBinaryPathName); + RtlCreateUnicodeStringFromAsciiz(&lpLoadOrderGroupW, (LPSTR)lpLoadOrderGroup); + RtlCreateUnicodeStringFromAsciiz(&lpServiceStartNameW, (LPSTR)lpServiceStartName); + RtlCreateUnicodeStringFromAsciiz(&lpPasswordW, (LPSTR)lpPassword); + if (lpDependencies != NULL) + { + DPRINT1("Unimplemented case\n"); + } + + hService = CreateServiceW( + hSCManager, + lpServiceNameW.Buffer, + lpDisplayNameW.Buffer, + dwDesiredAccess, + dwServiceType, + dwStartType, + dwErrorControl, + lpBinaryPathNameW.Buffer, + lpLoadOrderGroupW.Buffer, + lpdwTagId, + NULL, + lpServiceStartNameW.Buffer, + lpPasswordW.Buffer); + + RtlFreeUnicodeString(&lpServiceNameW); + RtlFreeUnicodeString(&lpDisplayNameW); + RtlFreeUnicodeString(&lpBinaryPathNameW); + RtlFreeUnicodeString(&lpLoadOrderGroupW); + RtlFreeUnicodeString(&lpServiceStartNameW); + RtlFreeUnicodeString(&lpPasswordW); + + return hService; } @@ -159,8 +200,104 @@ CreateServiceW( LPCWSTR lpServiceStartName, LPCWSTR lpPassword) { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return NULL; + SCM_CREATESERVICE_REQUEST Request; + SCM_CREATESERVICE_REPLY Reply; + BOOL fSuccess; + DWORD cbWritten, cbRead; + SC_HANDLE hService; + + DPRINT("CreateServiceW\n"); + + if (lpServiceName == NULL) + { + SetLastError(ERROR_INVALID_PARAMETER); + return NULL; + } + + Request.RequestCode = SCM_CREATESERVICE; + INIT_SCM_STRING(Request.ServiceName, lpServiceName); + INIT_SCM_STRING(Request.DisplayName, lpDisplayName); + Request.dwDesiredAccess = dwDesiredAccess; + Request.dwServiceType = dwServiceType; + Request.dwStartType = dwStartType; + Request.dwErrorControl = dwErrorControl; +#if 0 + INIT_SCM_STRING(Request.BinaryPathName, lpBinaryPathName); +#else + Request.BinaryPathName.Length = (wcslen(lpBinaryPathName) + 4) * sizeof(WCHAR); + swprintf(Request.BinaryPathName.Buffer, L"\\??\\%s", lpBinaryPathName); +#endif + INIT_SCM_STRING(Request.LoadOrderGroup, lpLoadOrderGroup); + INIT_SCM_STRING(Request.ServiceStartName, lpServiceStartName); + INIT_SCM_STRING(Request.Password, lpPassword); + if (lpDependencies != NULL) + { + DWORD Length; + for (Length = 0; + lpDependencies[Length++]; + Length += lstrlenW(&lpDependencies[Length]) + 1) + ; + Request.Dependencies.Length = Length; + } + else + { + Request.Dependencies.Length = 0; + } + RtlCopyMemory( + Request.Dependencies.Buffer, + lpDependencies, + Request.Dependencies.Length); + + fSuccess = WriteFile( + hSCManager, // pipe handle + &Request, // message + sizeof(Request), // message length + &cbWritten, // bytes written + NULL); // not overlapped + + if (!fSuccess || cbWritten != sizeof(Request)) + { + DPRINT("CreateServiceW - Failed to write to pipe.\n"); + return NULL; + } + + fSuccess = ReadFile( + hSCManager, // pipe handle + &Reply, // buffer to receive reply + sizeof(Reply), // size of buffer + &cbRead, // number of bytes read + NULL); // not overlapped + + if (!fSuccess && GetLastError() != ERROR_MORE_DATA) + { + DPRINT("CreateServiceW - Error\n"); + return NULL; + } + + if (Reply.ReplyStatus != NO_ERROR) + { + DPRINT("CreateServiceW - Error (%x)\n", Reply.ReplyStatus); + SetLastError(Reply.ReplyStatus); + return NULL; + } + + hService = CreateFileW( + Reply.PipeName, // pipe name + FILE_GENERIC_READ | FILE_GENERIC_WRITE, + 0, // no sharing + NULL, // no security attributes + OPEN_EXISTING, // opens existing pipe + 0, // default attributes + NULL); // no template file + + if (hService == INVALID_HANDLE_VALUE) + { + /* FIXME: Set last error! */ + return NULL; + } + + DPRINT("CreateServiceW - Success - %x\n", hService); + return hService; } @@ -173,8 +310,51 @@ BOOL STDCALL DeleteService(SC_HANDLE hService) { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; + SCM_SERVICE_REQUEST Request; + SCM_SERVICE_REPLY Reply; + BOOL fSuccess; + DWORD cbWritten, cbRead; + + DPRINT("DeleteService\n"); + + Request.RequestCode = SCM_DELETESERVICE; + + fSuccess = WriteFile( + hService, // pipe handle + &Request, // message + sizeof(DWORD), // message length + &cbWritten, // bytes written + NULL); // not overlapped + + if (!fSuccess || cbWritten != sizeof(DWORD)) + { + DPRINT("Error: %x . %x\n", GetLastError(), hService); + /* FIXME: Set last error */ + return FALSE; + } + + fSuccess = ReadFile( + hService, // pipe handle + &Reply, // buffer to receive reply + sizeof(DWORD), // size of buffer + &cbRead, // number of bytes read + NULL); // not overlapped + + if (!fSuccess && GetLastError() != ERROR_MORE_DATA) + { + CHECKPOINT; + /* FIXME: Set last error */ + return FALSE; + } + + if (Reply.ReplyStatus != NO_ERROR) + { + CHECKPOINT; + SetLastError(Reply.ReplyStatus); + return FALSE; + } + + return TRUE; } @@ -634,22 +814,34 @@ SC_HANDLE STDCALL OpenSCManagerW(LPCWSTR lpMachineName, /********************************************************************** * OpenServiceA * - * @unimplemented + * @implemented */ -SC_HANDLE STDCALL -OpenServiceA(SC_HANDLE hSCManager, - LPCSTR lpServiceName, - DWORD dwDesiredAccess) +SC_HANDLE +STDCALL +OpenServiceA( + SC_HANDLE hSCManager, + LPCSTR lpServiceName, + DWORD dwDesiredAccess + ) { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return NULL; + UNICODE_STRING lpServiceNameW; + SC_HANDLE hService; + + RtlCreateUnicodeStringFromAsciiz(&lpServiceNameW, (LPSTR)lpServiceName); + hService = OpenServiceW( + hSCManager, + lpServiceNameW.Buffer, + dwDesiredAccess); + RtlFreeUnicodeString(&lpServiceNameW); + + return hService; } /********************************************************************** * OpenServiceW * - * @unimplemented + * @implemented */ SC_HANDLE STDCALL @@ -659,8 +851,74 @@ OpenServiceW( DWORD dwDesiredAccess ) { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return NULL; + SCM_OPENSERVICE_REQUEST Request; + SCM_OPENSERVICE_REPLY Reply; + BOOL fSuccess; + DWORD cbWritten, cbRead; + SC_HANDLE hService; + + DPRINT("OpenServiceW\n"); + + if (lpServiceName == NULL) + { + SetLastError(ERROR_INVALID_PARAMETER); + return NULL; + } + + Request.RequestCode = SCM_OPENSERVICE; + INIT_SCM_STRING(Request.ServiceName, lpServiceName); + Request.dwDesiredAccess = dwDesiredAccess; + + fSuccess = WriteFile( + hSCManager, // pipe handle + &Request, // message + sizeof(Request), // message length + &cbWritten, // bytes written + NULL); // not overlapped + + if (!fSuccess || cbWritten != sizeof(Request)) + { + DPRINT("OpenServiceW - Failed to write to pipe.\n"); + return NULL; + } + + fSuccess = ReadFile( + hSCManager, // pipe handle + &Reply, // buffer to receive reply + sizeof(Reply), // size of buffer + &cbRead, // number of bytes read + NULL); // not overlapped + + if (!fSuccess && GetLastError() != ERROR_MORE_DATA) + { + DPRINT("OpenServiceW - Failed to read from pipe\n"); + return NULL; + } + + if (Reply.ReplyStatus != NO_ERROR) + { + DPRINT("OpenServiceW - Error (%x)\n", Reply.ReplyStatus); + SetLastError(Reply.ReplyStatus); + return NULL; + } + + hService = CreateFileW( + Reply.PipeName, // pipe name + FILE_GENERIC_READ | FILE_GENERIC_WRITE, + 0, // no sharing + NULL, // no security attributes + OPEN_EXISTING, // opens existing pipe + 0, // default attributes + NULL); // no template file + + if (hService == INVALID_HANDLE_VALUE) + { + DPRINT("OpenServiceW - Failed to connect to pipe\n"); + return NULL; + } + + DPRINT("OpenServiceW - Success - %x\n", hService); + return hService; } @@ -801,8 +1059,63 @@ StartServiceA( DWORD dwNumServiceArgs, LPCSTR *lpServiceArgVectors) { +#if 0 + DPRINT("StartServiceA\n"); SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; +#else + SCM_SERVICE_REQUEST Request; + SCM_SERVICE_REPLY Reply; + BOOL fSuccess; + DWORD cbWritten, cbRead; + + DPRINT("StartServiceA\n"); + + if (dwNumServiceArgs != 0) + { + UNIMPLEMENTED; + } + + Request.RequestCode = SCM_STARTSERVICE; + + fSuccess = WriteFile( + hService, // pipe handle + &Request, // message + sizeof(DWORD), // message length + &cbWritten, // bytes written + NULL); // not overlapped + + if (!fSuccess || cbWritten != sizeof(DWORD)) + { + DPRINT("Error: %x . %x\n", GetLastError(), hService); + /* FIXME: Set last error */ + return FALSE; + } + + fSuccess = ReadFile( + hService, // pipe handle + &Reply, // buffer to receive reply + sizeof(DWORD), // size of buffer + &cbRead, // number of bytes read + NULL); // not overlapped + + if (!fSuccess && GetLastError() != ERROR_MORE_DATA) + { + CHECKPOINT; + /* FIXME: Set last error */ + return FALSE; + } + + if (Reply.ReplyStatus != NO_ERROR) + { + CHECKPOINT; + SetLastError(Reply.ReplyStatus); + return FALSE; + } + + CHECKPOINT; + return TRUE; +#endif } @@ -820,6 +1133,7 @@ StartServiceW( DWORD dwNumServiceArgs, LPCWSTR *lpServiceArgVectors) { + DPRINT("StartServiceW\n"); SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } diff --git a/reactos/subsys/system/services/database.c b/reactos/subsys/system/services/database.c index e3185364881..b0fd0bd18f7 100644 --- a/reactos/subsys/system/services/database.c +++ b/reactos/subsys/system/services/database.c @@ -1,4 +1,4 @@ -/* $Id: database.c,v 1.14 2004/04/11 16:10:05 jfilby Exp $ +/* $Id: database.c,v 1.15 2004/04/12 17:14:54 navaraf Exp $ * * service control manager * @@ -38,39 +38,6 @@ #include -/* TYPES *********************************************************************/ - -typedef struct _SERVICE_GROUP -{ - LIST_ENTRY GroupListEntry; - UNICODE_STRING GroupName; - - BOOLEAN ServicesRunning; - -} SERVICE_GROUP, *PSERVICE_GROUP; - - -typedef struct _SERVICE -{ - LIST_ENTRY ServiceListEntry; - UNICODE_STRING ServiceName; - UNICODE_STRING RegistryPath; - UNICODE_STRING ServiceGroup; - - ULONG Start; - ULONG Type; - ULONG ErrorControl; - ULONG Tag; - - BOOLEAN ServiceRunning; - BOOLEAN ServiceVisited; - - HANDLE ControlPipeHandle; - ULONG ProcessId; - ULONG ThreadId; -} SERVICE, *PSERVICE; - - /* GLOBALS *******************************************************************/ LIST_ENTRY GroupListHead; @@ -116,8 +83,8 @@ CreateGroupListRoutine(PWSTR ValueName, } -static NTSTATUS STDCALL -CreateServiceListEntry(PUNICODE_STRING ServiceName) +PSERVICE FASTCALL +ScmCreateServiceListEntry(PUNICODE_STRING ServiceName) { RTL_QUERY_REGISTRY_TABLE QueryTable[6]; PSERVICE Service = NULL; @@ -130,7 +97,7 @@ CreateServiceListEntry(PUNICODE_STRING ServiceName) sizeof(SERVICE)); if (Service == NULL) { - return(STATUS_INSUFFICIENT_RESOURCES); + return NULL; } /* Copy service name */ @@ -141,7 +108,7 @@ CreateServiceListEntry(PUNICODE_STRING ServiceName) if (Service->ServiceName.Buffer == NULL) { HeapFree(GetProcessHeap(), 0, Service); - return(STATUS_INSUFFICIENT_RESOURCES); + return NULL; } RtlCopyMemory(Service->ServiceName.Buffer, ServiceName->Buffer, @@ -156,7 +123,7 @@ CreateServiceListEntry(PUNICODE_STRING ServiceName) { HeapFree(GetProcessHeap(), 0, Service->ServiceName.Buffer); HeapFree(GetProcessHeap(), 0, Service); - return(STATUS_INSUFFICIENT_RESOURCES); + return NULL; } wcscpy(Service->RegistryPath.Buffer, L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\"); @@ -195,7 +162,7 @@ CreateServiceListEntry(PUNICODE_STRING ServiceName) RtlFreeUnicodeString(&Service->RegistryPath); RtlFreeUnicodeString(&Service->ServiceName); HeapFree(GetProcessHeap(), 0, Service); - return(Status); + return NULL; } DPRINT("ServiceName: '%wZ'\n", &Service->ServiceName); @@ -208,7 +175,7 @@ CreateServiceListEntry(PUNICODE_STRING ServiceName) InsertTailList(&ServiceListHead, &Service->ServiceListEntry); - return(STATUS_SUCCESS); + return Service; } @@ -293,7 +260,10 @@ ScmCreateServiceDataBase(VOID) SubKeyName.Buffer[SubKeyName.Length / sizeof(WCHAR)] = 0; DPRINT("KeyName: '%wZ'\n", &SubKeyName); - Status = CreateServiceListEntry(&SubKeyName); + if (ScmCreateServiceListEntry(&SubKeyName) == NULL) + { + return STATUS_INSUFFICIENT_RESOURCES; + } } } @@ -446,7 +416,7 @@ ScmGetBootAndSystemDriverState(VOID) } -static NTSTATUS +NTSTATUS FASTCALL ScmStartService(PSERVICE Service, PSERVICE_GROUP Group) { @@ -625,7 +595,7 @@ Done: } #endif - return(STATUS_SUCCESS); + return Status; //(STATUS_SUCCESS); } @@ -720,4 +690,27 @@ ScmAutoStartServices(VOID) } } +/* + * FIXME: Doesn't work!!! + */ +PSERVICE FASTCALL +ScmFindService(PUNICODE_STRING ServiceName) +{ + PSERVICE CurrentService; + PLIST_ENTRY ServiceEntry; + + ServiceEntry = ServiceListHead.Flink; + while (ServiceEntry != &ServiceListHead) + { + CurrentService = CONTAINING_RECORD(ServiceEntry, SERVICE, ServiceListEntry); + if (!RtlCompareUnicodeString(ServiceName, &CurrentService->ServiceName, TRUE)) + { + return CurrentService; + } + ServiceEntry = ServiceEntry->Flink; + } + + return NULL; +} + /* EOF */ diff --git a/reactos/subsys/system/services/services.c b/reactos/subsys/system/services/services.c index c0924500cdb..03a2771e04c 100644 --- a/reactos/subsys/system/services/services.c +++ b/reactos/subsys/system/services/services.c @@ -1,4 +1,4 @@ -/* $Id: services.c,v 1.16 2004/04/12 15:22:53 navaraf Exp $ +/* $Id: services.c,v 1.17 2004/04/12 17:14:55 navaraf Exp $ * * service control manager * @@ -33,8 +33,11 @@ #include #include #include +#undef CreateService +#undef OpenService #include "services.h" +#include #define NDEBUG #include @@ -43,8 +46,7 @@ /* GLOBALS ******************************************************************/ -#define PIPE_BUFSIZE 1024 -#define PIPE_TIMEOUT 1000 +#define PIPE_TIMEOUT 10000 /* FUNCTIONS *****************************************************************/ @@ -91,17 +93,461 @@ ScmCreateStartEvent(PHANDLE StartEvent) } -BOOL -ScmNamedPipeHandleRequest( - PVOID Request, +typedef struct _SERVICE_THREAD_DATA +{ + HANDLE hPipe; + PSERVICE pService; +} SERVICE_THREAD_DATA, *PSERVICE_THREAD_DATA; + + +VOID FASTCALL +ScmHandleDeleteServiceRequest( + PSERVICE_THREAD_DATA pServiceThreadData, + PSCM_SERVICE_REQUEST Request, DWORD RequestSize, - PVOID Reply, + PSCM_SERVICE_REPLY Reply, LPDWORD ReplySize) { - DbgPrint("SCM READ: %s\n", Request); + Reply->ReplyStatus = RtlNtStatusToDosError( + ScmStartService(pServiceThreadData->pService, NULL)); + *ReplySize = sizeof(DWORD); +} - *ReplySize = 0; - return FALSE; + +VOID FASTCALL +ScmHandleStartServiceRequest( + PSERVICE_THREAD_DATA pServiceThreadData, + PSCM_SERVICE_REQUEST Request, + DWORD RequestSize, + PSCM_SERVICE_REPLY Reply, + LPDWORD ReplySize) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + NTSTATUS Status; + HANDLE KeyHandle; + + InitializeObjectAttributes( + &ObjectAttributes, + &pServiceThreadData->pService->RegistryPath, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + Status = ZwOpenKey( + &KeyHandle, + KEY_READ, + &ObjectAttributes); + + if (NT_SUCCESS(Status)) + { + Status = ZwDeleteKey(KeyHandle); + if (NT_SUCCESS(Status)) + { + ZwClose(KeyHandle); + CHECKPOINT; + RemoveEntryList(&pServiceThreadData->pService->ServiceListEntry); + } + } + Reply->ReplyStatus = RtlNtStatusToDosError(Status); + *ReplySize = sizeof(DWORD); +} + + +DWORD +WINAPI +ScmNamedPipeServiceThread(LPVOID Context) +{ + SCM_SERVICE_REQUEST Request; + SCM_SERVICE_REPLY Reply; + DWORD cbBytesRead; + DWORD cbWritten, cbReplyBytes; + BOOL fSuccess; + PSERVICE_THREAD_DATA pServiceThreadData = Context; + + ConnectNamedPipe(pServiceThreadData->hPipe, NULL); + + for (;;) + { + fSuccess = ReadFile( + pServiceThreadData->hPipe, + &Request, + sizeof(Request), + &cbBytesRead, + NULL); + + if (!fSuccess || cbBytesRead == 0) + { + break; + } + + switch (Request.RequestCode) + { + case SCM_DELETESERVICE: + ScmHandleDeleteServiceRequest( + pServiceThreadData, + &Request, + cbBytesRead, + &Reply, + &cbReplyBytes); + break; + + case SCM_STARTSERVICE: + ScmHandleStartServiceRequest( + pServiceThreadData, + &Request, + cbBytesRead, + &Reply, + &cbReplyBytes); + break; + } + + fSuccess = WriteFile( + pServiceThreadData->hPipe, + &Reply, + cbReplyBytes, + &cbWritten, + NULL); + + if (!fSuccess || cbReplyBytes != cbWritten) + { + break; + } + } + + FlushFileBuffers(pServiceThreadData->hPipe); + DisconnectNamedPipe(pServiceThreadData->hPipe); + CloseHandle(pServiceThreadData->hPipe); + + return NO_ERROR; +} + + +VOID FASTCALL +ScmCreateServiceThread( + HANDLE hSCMPipe, + PSCM_OPENSERVICE_REPLY Reply, + LPDWORD ReplySize, + PSERVICE Service) +{ + HANDLE hPipe, hThread; + DWORD dwThreadId; + PSERVICE_THREAD_DATA ServiceThreadData; + + ServiceThreadData = HeapAlloc( + GetProcessHeap(), + 0, + sizeof(SERVICE_THREAD_DATA)); + + if (ServiceThreadData == NULL) + { + Reply->ReplyStatus = ERROR_NO_SYSTEM_RESOURCES; + CHECKPOINT; + return; + } + + swprintf(Reply->PipeName, L"\\\\.\\pipe\\SCM.%08X.%08X", hSCMPipe, Service); + + hPipe = CreateNamedPipeW( + Reply->PipeName, + PIPE_ACCESS_DUPLEX, + PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, + PIPE_UNLIMITED_INSTANCES, + sizeof(SCM_SERVICE_REQUEST), + sizeof(SCM_SERVICE_REPLY), + PIPE_TIMEOUT, + NULL); + + if (hPipe == INVALID_HANDLE_VALUE) + { + Reply->ReplyStatus = ERROR_NO_SYSTEM_RESOURCES; + CHECKPOINT; + return; + } + + ServiceThreadData->hPipe = hPipe; + ServiceThreadData->pService = Service; + + hThread = CreateThread( + NULL, + 0, + ScmNamedPipeServiceThread, + ServiceThreadData, + 0, + &dwThreadId); + + if (!hThread) + { + Reply->ReplyStatus = ERROR_NO_SYSTEM_RESOURCES; + CHECKPOINT; + CloseHandle(hPipe); + return; + } + + Reply->ReplyStatus = NO_ERROR; + *ReplySize = sizeof(SCM_OPENSERVICE_REPLY); +} + + +VOID FASTCALL +ScmHandleOpenServiceRequest( + HANDLE hPipe, + PSCM_REQUEST Request, + DWORD RequestSize, + PSCM_REPLY Reply, + LPDWORD ReplySize) +{ + PSERVICE Service; + UNICODE_STRING ServiceName; + + DPRINT("OpenService\n"); + + if (RequestSize != sizeof(SCM_OPENSERVICE_REQUEST)) + { + Reply->ReplyStatus = ERROR_INVALID_PARAMETER; + return; + } + + ServiceName.Length = Request->OpenService.ServiceName.Length; + ServiceName.Buffer = Request->OpenService.ServiceName.Buffer; + Service = ScmFindService(&ServiceName); + if (Service == NULL) + { + DPRINT("OpenService - Service not found\n"); + Reply->ReplyStatus = ERROR_SERVICE_DOES_NOT_EXIST; + return; + } + + DPRINT("OpenService - Service found\n"); + ScmCreateServiceThread( + hPipe, + &Reply->OpenService, + ReplySize, + Service); +} + + +VOID FASTCALL +ScmHandleCreateServiceRequest( + HANDLE hPipe, + PSCM_REQUEST Request, + DWORD RequestSize, + PSCM_REPLY Reply, + LPDWORD ReplySize) +{ + PSERVICE Service; + NTSTATUS Status; + UNICODE_STRING ServiceName; + + DPRINT("CreateService - %S\n", Request->CreateService.ServiceName.Buffer); + + if (RequestSize != sizeof(SCM_CREATESERVICE_REQUEST)) + { + Reply->ReplyStatus = ERROR_INVALID_PARAMETER; + return; + } + + Status = RtlCheckRegistryKey( + RTL_REGISTRY_SERVICES, + Request->CreateService.ServiceName.Buffer); + + if (NT_SUCCESS(Status)) + { + DPRINT("CreateService - Already exists\n"); + Reply->ReplyStatus = ERROR_SERVICE_EXISTS; + return; + } + + Status = RtlCreateRegistryKey( + RTL_REGISTRY_SERVICES, + Request->CreateService.ServiceName.Buffer); + + if (!NT_SUCCESS(Status)) + { + DPRINT("CreateService - Can't create key (%x)\n", Status); + Reply->ReplyStatus = Status; + return; + } + + Status = RtlWriteRegistryValue( + RTL_REGISTRY_SERVICES, + Request->CreateService.ServiceName.Buffer, + L"Type", + REG_DWORD, + &Request->CreateService.dwServiceType, + sizeof(DWORD)); + + if (!NT_SUCCESS(Status)) + { + DPRINT("CreateService - Error writing value\n"); + Reply->ReplyStatus = RtlNtStatusToDosError(Status); + return; + } + + Status = RtlWriteRegistryValue( + RTL_REGISTRY_SERVICES, + Request->CreateService.ServiceName.Buffer, + L"Start", + REG_DWORD, + &Request->CreateService.dwStartType, + sizeof(DWORD)); + + if (!NT_SUCCESS(Status)) + { + Reply->ReplyStatus = RtlNtStatusToDosError(Status); + return; + } + + Status = RtlWriteRegistryValue( + RTL_REGISTRY_SERVICES, + Request->CreateService.ServiceName.Buffer, + L"ErrorControl", + REG_DWORD, + &Request->CreateService.dwErrorControl, + sizeof(DWORD)); + + if (!NT_SUCCESS(Status)) + { + Reply->ReplyStatus = RtlNtStatusToDosError(Status); + return; + } + + if (Request->CreateService.BinaryPathName.Length) + { + Status = RtlWriteRegistryValue( + RTL_REGISTRY_SERVICES, + Request->CreateService.ServiceName.Buffer, + L"ImagePath", + REG_SZ, + Request->CreateService.BinaryPathName.Buffer, + Request->CreateService.BinaryPathName.Length + sizeof(UNICODE_NULL)); + + if (!NT_SUCCESS(Status)) + { + DPRINT("CreateService - Error writing value\n"); + Reply->ReplyStatus = RtlNtStatusToDosError(Status); + return; + } + } + + if (Request->CreateService.LoadOrderGroup.Length) + { + Status = RtlWriteRegistryValue( + RTL_REGISTRY_SERVICES, + Request->CreateService.ServiceName.Buffer, + L"Group", + REG_SZ, + Request->CreateService.LoadOrderGroup.Buffer, + Request->CreateService.LoadOrderGroup.Length + sizeof(UNICODE_NULL)); + + if (!NT_SUCCESS(Status)) + { + Reply->ReplyStatus = RtlNtStatusToDosError(Status); + return; + } + } + + if (Request->CreateService.Dependencies.Length) + { + Status = RtlWriteRegistryValue( + RTL_REGISTRY_SERVICES, + Request->CreateService.ServiceName.Buffer, + L"Dependencies", + REG_SZ, + Request->CreateService.Dependencies.Buffer, + Request->CreateService.Dependencies.Length + sizeof(UNICODE_NULL)); + + if (!NT_SUCCESS(Status)) + { + Reply->ReplyStatus = RtlNtStatusToDosError(Status); + return; + } + } + + if (Request->CreateService.DisplayName.Length) + { + Status = RtlWriteRegistryValue( + RTL_REGISTRY_SERVICES, + Request->CreateService.ServiceName.Buffer, + L"DisplayName", + REG_SZ, + Request->CreateService.DisplayName.Buffer, + Request->CreateService.DisplayName.Length + sizeof(UNICODE_NULL)); + + if (!NT_SUCCESS(Status)) + { + Reply->ReplyStatus = RtlNtStatusToDosError(Status); + return; + } + } + + if (Request->CreateService.ServiceStartName.Length || + Request->CreateService.Password.Length) + { + DPRINT1("Unimplemented case\n"); + } + + ServiceName.Length = Request->OpenService.ServiceName.Length; + ServiceName.Buffer = Request->OpenService.ServiceName.Buffer; + Service = ScmCreateServiceListEntry(&ServiceName); + if (Service == NULL) + { + DPRINT("CreateService - Error creating service list entry\n"); + Reply->ReplyStatus = ERROR_NOT_ENOUGH_MEMORY; + return; + } + + DPRINT("CreateService - Success\n"); + ScmCreateServiceThread( + hPipe, + &Reply->OpenService, + ReplySize, + Service); +} + + +BOOL +ScmNamedPipeHandleRequest( + HANDLE hPipe, + PSCM_REQUEST Request, + DWORD RequestSize, + PSCM_REPLY Reply, + LPDWORD ReplySize) +{ + *ReplySize = sizeof(DWORD); + + if (RequestSize < sizeof(DWORD)) + { + Reply->ReplyStatus = ERROR_INVALID_PARAMETER; + return TRUE; + } + + DPRINT("RequestCode: %x\n", Request->RequestCode); + + switch (Request->RequestCode) + { + case SCM_OPENSERVICE: + ScmHandleOpenServiceRequest( + hPipe, + Request, + RequestSize, + Reply, + ReplySize); + break; + + case SCM_CREATESERVICE: + ScmHandleCreateServiceRequest( + hPipe, + Request, + RequestSize, + Reply, + ReplySize); + break; + + default: + Reply->ReplyStatus = ERROR_INVALID_PARAMETER; + } + + return TRUE; } @@ -109,8 +555,8 @@ DWORD WINAPI ScmNamedPipeThread(LPVOID Context) { - CHAR chRequest[PIPE_BUFSIZE]; - CHAR chReply[PIPE_BUFSIZE]; + SCM_REQUEST Request; + SCM_REPLY Reply; DWORD cbReplyBytes; DWORD cbBytesRead; DWORD cbWritten; @@ -123,16 +569,16 @@ ScmNamedPipeThread(LPVOID Context) for (;;) { fSuccess = ReadFile(hPipe, - &chRequest, - PIPE_BUFSIZE, + &Request, + sizeof(Request), &cbBytesRead, NULL); if (!fSuccess || cbBytesRead == 0) { break; } - if (ScmNamedPipeHandleRequest(&chRequest, cbBytesRead, &chReply, &cbReplyBytes)) { + if (ScmNamedPipeHandleRequest(hPipe, &Request, cbBytesRead, &Reply, &cbReplyBytes)) { fSuccess = WriteFile(hPipe, - &chReply, + &Reply, cbReplyBytes, &cbWritten, NULL); @@ -162,8 +608,8 @@ BOOL ScmCreateNamedPipe(VOID) PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, - PIPE_BUFSIZE, - PIPE_BUFSIZE, + sizeof(SCM_REQUEST), + sizeof(SCM_REPLY), PIPE_TIMEOUT, NULL); if (hPipe == INVALID_HANDLE_VALUE) { diff --git a/reactos/subsys/system/services/services.h b/reactos/subsys/system/services/services.h index 443ac04e98e..d5177874eec 100644 --- a/reactos/subsys/system/services/services.h +++ b/reactos/subsys/system/services/services.h @@ -2,6 +2,34 @@ * services.h */ +typedef struct _SERVICE_GROUP +{ + LIST_ENTRY GroupListEntry; + UNICODE_STRING GroupName; + + BOOLEAN ServicesRunning; + +} SERVICE_GROUP, *PSERVICE_GROUP; + +typedef struct _SERVICE +{ + LIST_ENTRY ServiceListEntry; + UNICODE_STRING ServiceName; + UNICODE_STRING RegistryPath; + UNICODE_STRING ServiceGroup; + + ULONG Start; + ULONG Type; + ULONG ErrorControl; + ULONG Tag; + + BOOLEAN ServiceRunning; + BOOLEAN ServiceVisited; + + HANDLE ControlPipeHandle; + ULONG ProcessId; + ULONG ThreadId; +} SERVICE, *PSERVICE; /* services.c */ @@ -14,6 +42,12 @@ NTSTATUS ScmCreateServiceDataBase(VOID); VOID ScmGetBootAndSystemDriverState(VOID); VOID ScmAutoStartServices(VOID); +PSERVICE FASTCALL +ScmCreateServiceListEntry(PUNICODE_STRING ServiceName); +PSERVICE FASTCALL +ScmFindService(PUNICODE_STRING ServiceName); +NTSTATUS FASTCALL +ScmStartService(PSERVICE Service, PSERVICE_GROUP Group); /* EOF */ From 75a32eddd8a574e3a57260969b89e6d1ea1c5487 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Mon, 12 Apr 2004 17:20:47 +0000 Subject: [PATCH 0862/1463] - Reverted my last changed, should go to branch! svn path=/trunk/; revision=9112 --- reactos/lib/advapi32/service/scm.c | 358 +--------------- reactos/subsys/system/services/database.c | 81 ++-- reactos/subsys/system/services/services.c | 500 ++-------------------- reactos/subsys/system/services/services.h | 34 -- 4 files changed, 104 insertions(+), 869 deletions(-) diff --git a/reactos/lib/advapi32/service/scm.c b/reactos/lib/advapi32/service/scm.c index 298b9f6e2e8..c64ae872d72 100644 --- a/reactos/lib/advapi32/service/scm.c +++ b/reactos/lib/advapi32/service/scm.c @@ -1,4 +1,4 @@ -/* $Id: scm.c,v 1.20 2004/04/12 17:14:54 navaraf Exp $ +/* $Id: scm.c,v 1.21 2004/04/12 17:20:47 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -17,9 +17,8 @@ #include #include #include -#include -//#define DBG +#define DBG #include /* FUNCTIONS *****************************************************************/ @@ -83,14 +82,14 @@ BOOL STDCALL CloseServiceHandle(SC_HANDLE hSCObject) { - DPRINT("CloseServiceHandle\n"); + HANDLE hPipe; + DPRINT("CloseServiceHandle() - called.\n"); +// SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - if (!CloseHandle(hSCObject)) - { + if (!CloseHandle(hPipe)) { SetLastError(ERROR_INVALID_HANDLE); return FALSE; } - return TRUE; } @@ -133,48 +132,8 @@ CreateServiceA( LPCSTR lpServiceStartName, LPCSTR lpPassword) { - UNICODE_STRING lpServiceNameW; - UNICODE_STRING lpDisplayNameW; - UNICODE_STRING lpBinaryPathNameW; - UNICODE_STRING lpLoadOrderGroupW; - UNICODE_STRING lpServiceStartNameW; - UNICODE_STRING lpPasswordW; - SC_HANDLE hService; - - RtlCreateUnicodeStringFromAsciiz(&lpServiceNameW, (LPSTR)lpServiceName); - RtlCreateUnicodeStringFromAsciiz(&lpDisplayNameW, (LPSTR)lpDisplayName); - RtlCreateUnicodeStringFromAsciiz(&lpBinaryPathNameW, (LPSTR)lpBinaryPathName); - RtlCreateUnicodeStringFromAsciiz(&lpLoadOrderGroupW, (LPSTR)lpLoadOrderGroup); - RtlCreateUnicodeStringFromAsciiz(&lpServiceStartNameW, (LPSTR)lpServiceStartName); - RtlCreateUnicodeStringFromAsciiz(&lpPasswordW, (LPSTR)lpPassword); - if (lpDependencies != NULL) - { - DPRINT1("Unimplemented case\n"); - } - - hService = CreateServiceW( - hSCManager, - lpServiceNameW.Buffer, - lpDisplayNameW.Buffer, - dwDesiredAccess, - dwServiceType, - dwStartType, - dwErrorControl, - lpBinaryPathNameW.Buffer, - lpLoadOrderGroupW.Buffer, - lpdwTagId, - NULL, - lpServiceStartNameW.Buffer, - lpPasswordW.Buffer); - - RtlFreeUnicodeString(&lpServiceNameW); - RtlFreeUnicodeString(&lpDisplayNameW); - RtlFreeUnicodeString(&lpBinaryPathNameW); - RtlFreeUnicodeString(&lpLoadOrderGroupW); - RtlFreeUnicodeString(&lpServiceStartNameW); - RtlFreeUnicodeString(&lpPasswordW); - - return hService; + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return NULL; } @@ -200,104 +159,8 @@ CreateServiceW( LPCWSTR lpServiceStartName, LPCWSTR lpPassword) { - SCM_CREATESERVICE_REQUEST Request; - SCM_CREATESERVICE_REPLY Reply; - BOOL fSuccess; - DWORD cbWritten, cbRead; - SC_HANDLE hService; - - DPRINT("CreateServiceW\n"); - - if (lpServiceName == NULL) - { - SetLastError(ERROR_INVALID_PARAMETER); - return NULL; - } - - Request.RequestCode = SCM_CREATESERVICE; - INIT_SCM_STRING(Request.ServiceName, lpServiceName); - INIT_SCM_STRING(Request.DisplayName, lpDisplayName); - Request.dwDesiredAccess = dwDesiredAccess; - Request.dwServiceType = dwServiceType; - Request.dwStartType = dwStartType; - Request.dwErrorControl = dwErrorControl; -#if 0 - INIT_SCM_STRING(Request.BinaryPathName, lpBinaryPathName); -#else - Request.BinaryPathName.Length = (wcslen(lpBinaryPathName) + 4) * sizeof(WCHAR); - swprintf(Request.BinaryPathName.Buffer, L"\\??\\%s", lpBinaryPathName); -#endif - INIT_SCM_STRING(Request.LoadOrderGroup, lpLoadOrderGroup); - INIT_SCM_STRING(Request.ServiceStartName, lpServiceStartName); - INIT_SCM_STRING(Request.Password, lpPassword); - if (lpDependencies != NULL) - { - DWORD Length; - for (Length = 0; - lpDependencies[Length++]; - Length += lstrlenW(&lpDependencies[Length]) + 1) - ; - Request.Dependencies.Length = Length; - } - else - { - Request.Dependencies.Length = 0; - } - RtlCopyMemory( - Request.Dependencies.Buffer, - lpDependencies, - Request.Dependencies.Length); - - fSuccess = WriteFile( - hSCManager, // pipe handle - &Request, // message - sizeof(Request), // message length - &cbWritten, // bytes written - NULL); // not overlapped - - if (!fSuccess || cbWritten != sizeof(Request)) - { - DPRINT("CreateServiceW - Failed to write to pipe.\n"); - return NULL; - } - - fSuccess = ReadFile( - hSCManager, // pipe handle - &Reply, // buffer to receive reply - sizeof(Reply), // size of buffer - &cbRead, // number of bytes read - NULL); // not overlapped - - if (!fSuccess && GetLastError() != ERROR_MORE_DATA) - { - DPRINT("CreateServiceW - Error\n"); - return NULL; - } - - if (Reply.ReplyStatus != NO_ERROR) - { - DPRINT("CreateServiceW - Error (%x)\n", Reply.ReplyStatus); - SetLastError(Reply.ReplyStatus); - return NULL; - } - - hService = CreateFileW( - Reply.PipeName, // pipe name - FILE_GENERIC_READ | FILE_GENERIC_WRITE, - 0, // no sharing - NULL, // no security attributes - OPEN_EXISTING, // opens existing pipe - 0, // default attributes - NULL); // no template file - - if (hService == INVALID_HANDLE_VALUE) - { - /* FIXME: Set last error! */ - return NULL; - } - - DPRINT("CreateServiceW - Success - %x\n", hService); - return hService; + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return NULL; } @@ -310,51 +173,8 @@ BOOL STDCALL DeleteService(SC_HANDLE hService) { - SCM_SERVICE_REQUEST Request; - SCM_SERVICE_REPLY Reply; - BOOL fSuccess; - DWORD cbWritten, cbRead; - - DPRINT("DeleteService\n"); - - Request.RequestCode = SCM_DELETESERVICE; - - fSuccess = WriteFile( - hService, // pipe handle - &Request, // message - sizeof(DWORD), // message length - &cbWritten, // bytes written - NULL); // not overlapped - - if (!fSuccess || cbWritten != sizeof(DWORD)) - { - DPRINT("Error: %x . %x\n", GetLastError(), hService); - /* FIXME: Set last error */ - return FALSE; - } - - fSuccess = ReadFile( - hService, // pipe handle - &Reply, // buffer to receive reply - sizeof(DWORD), // size of buffer - &cbRead, // number of bytes read - NULL); // not overlapped - - if (!fSuccess && GetLastError() != ERROR_MORE_DATA) - { - CHECKPOINT; - /* FIXME: Set last error */ - return FALSE; - } - - if (Reply.ReplyStatus != NO_ERROR) - { - CHECKPOINT; - SetLastError(Reply.ReplyStatus); - return FALSE; - } - - return TRUE; + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; } @@ -814,34 +634,22 @@ SC_HANDLE STDCALL OpenSCManagerW(LPCWSTR lpMachineName, /********************************************************************** * OpenServiceA * - * @implemented + * @unimplemented */ -SC_HANDLE -STDCALL -OpenServiceA( - SC_HANDLE hSCManager, - LPCSTR lpServiceName, - DWORD dwDesiredAccess - ) +SC_HANDLE STDCALL +OpenServiceA(SC_HANDLE hSCManager, + LPCSTR lpServiceName, + DWORD dwDesiredAccess) { - UNICODE_STRING lpServiceNameW; - SC_HANDLE hService; - - RtlCreateUnicodeStringFromAsciiz(&lpServiceNameW, (LPSTR)lpServiceName); - hService = OpenServiceW( - hSCManager, - lpServiceNameW.Buffer, - dwDesiredAccess); - RtlFreeUnicodeString(&lpServiceNameW); - - return hService; + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return NULL; } /********************************************************************** * OpenServiceW * - * @implemented + * @unimplemented */ SC_HANDLE STDCALL @@ -851,74 +659,8 @@ OpenServiceW( DWORD dwDesiredAccess ) { - SCM_OPENSERVICE_REQUEST Request; - SCM_OPENSERVICE_REPLY Reply; - BOOL fSuccess; - DWORD cbWritten, cbRead; - SC_HANDLE hService; - - DPRINT("OpenServiceW\n"); - - if (lpServiceName == NULL) - { - SetLastError(ERROR_INVALID_PARAMETER); - return NULL; - } - - Request.RequestCode = SCM_OPENSERVICE; - INIT_SCM_STRING(Request.ServiceName, lpServiceName); - Request.dwDesiredAccess = dwDesiredAccess; - - fSuccess = WriteFile( - hSCManager, // pipe handle - &Request, // message - sizeof(Request), // message length - &cbWritten, // bytes written - NULL); // not overlapped - - if (!fSuccess || cbWritten != sizeof(Request)) - { - DPRINT("OpenServiceW - Failed to write to pipe.\n"); - return NULL; - } - - fSuccess = ReadFile( - hSCManager, // pipe handle - &Reply, // buffer to receive reply - sizeof(Reply), // size of buffer - &cbRead, // number of bytes read - NULL); // not overlapped - - if (!fSuccess && GetLastError() != ERROR_MORE_DATA) - { - DPRINT("OpenServiceW - Failed to read from pipe\n"); - return NULL; - } - - if (Reply.ReplyStatus != NO_ERROR) - { - DPRINT("OpenServiceW - Error (%x)\n", Reply.ReplyStatus); - SetLastError(Reply.ReplyStatus); - return NULL; - } - - hService = CreateFileW( - Reply.PipeName, // pipe name - FILE_GENERIC_READ | FILE_GENERIC_WRITE, - 0, // no sharing - NULL, // no security attributes - OPEN_EXISTING, // opens existing pipe - 0, // default attributes - NULL); // no template file - - if (hService == INVALID_HANDLE_VALUE) - { - DPRINT("OpenServiceW - Failed to connect to pipe\n"); - return NULL; - } - - DPRINT("OpenServiceW - Success - %x\n", hService); - return hService; + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return NULL; } @@ -1059,63 +801,8 @@ StartServiceA( DWORD dwNumServiceArgs, LPCSTR *lpServiceArgVectors) { -#if 0 - DPRINT("StartServiceA\n"); SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; -#else - SCM_SERVICE_REQUEST Request; - SCM_SERVICE_REPLY Reply; - BOOL fSuccess; - DWORD cbWritten, cbRead; - - DPRINT("StartServiceA\n"); - - if (dwNumServiceArgs != 0) - { - UNIMPLEMENTED; - } - - Request.RequestCode = SCM_STARTSERVICE; - - fSuccess = WriteFile( - hService, // pipe handle - &Request, // message - sizeof(DWORD), // message length - &cbWritten, // bytes written - NULL); // not overlapped - - if (!fSuccess || cbWritten != sizeof(DWORD)) - { - DPRINT("Error: %x . %x\n", GetLastError(), hService); - /* FIXME: Set last error */ - return FALSE; - } - - fSuccess = ReadFile( - hService, // pipe handle - &Reply, // buffer to receive reply - sizeof(DWORD), // size of buffer - &cbRead, // number of bytes read - NULL); // not overlapped - - if (!fSuccess && GetLastError() != ERROR_MORE_DATA) - { - CHECKPOINT; - /* FIXME: Set last error */ - return FALSE; - } - - if (Reply.ReplyStatus != NO_ERROR) - { - CHECKPOINT; - SetLastError(Reply.ReplyStatus); - return FALSE; - } - - CHECKPOINT; - return TRUE; -#endif } @@ -1133,7 +820,6 @@ StartServiceW( DWORD dwNumServiceArgs, LPCWSTR *lpServiceArgVectors) { - DPRINT("StartServiceW\n"); SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } diff --git a/reactos/subsys/system/services/database.c b/reactos/subsys/system/services/database.c index b0fd0bd18f7..83888bc17fe 100644 --- a/reactos/subsys/system/services/database.c +++ b/reactos/subsys/system/services/database.c @@ -1,4 +1,4 @@ -/* $Id: database.c,v 1.15 2004/04/12 17:14:54 navaraf Exp $ +/* $Id: database.c,v 1.16 2004/04/12 17:20:47 navaraf Exp $ * * service control manager * @@ -38,6 +38,39 @@ #include +/* TYPES *********************************************************************/ + +typedef struct _SERVICE_GROUP +{ + LIST_ENTRY GroupListEntry; + UNICODE_STRING GroupName; + + BOOLEAN ServicesRunning; + +} SERVICE_GROUP, *PSERVICE_GROUP; + + +typedef struct _SERVICE +{ + LIST_ENTRY ServiceListEntry; + UNICODE_STRING ServiceName; + UNICODE_STRING RegistryPath; + UNICODE_STRING ServiceGroup; + + ULONG Start; + ULONG Type; + ULONG ErrorControl; + ULONG Tag; + + BOOLEAN ServiceRunning; + BOOLEAN ServiceVisited; + + HANDLE ControlPipeHandle; + ULONG ProcessId; + ULONG ThreadId; +} SERVICE, *PSERVICE; + + /* GLOBALS *******************************************************************/ LIST_ENTRY GroupListHead; @@ -83,8 +116,8 @@ CreateGroupListRoutine(PWSTR ValueName, } -PSERVICE FASTCALL -ScmCreateServiceListEntry(PUNICODE_STRING ServiceName) +static NTSTATUS STDCALL +CreateServiceListEntry(PUNICODE_STRING ServiceName) { RTL_QUERY_REGISTRY_TABLE QueryTable[6]; PSERVICE Service = NULL; @@ -97,7 +130,7 @@ ScmCreateServiceListEntry(PUNICODE_STRING ServiceName) sizeof(SERVICE)); if (Service == NULL) { - return NULL; + return(STATUS_INSUFFICIENT_RESOURCES); } /* Copy service name */ @@ -108,7 +141,7 @@ ScmCreateServiceListEntry(PUNICODE_STRING ServiceName) if (Service->ServiceName.Buffer == NULL) { HeapFree(GetProcessHeap(), 0, Service); - return NULL; + return(STATUS_INSUFFICIENT_RESOURCES); } RtlCopyMemory(Service->ServiceName.Buffer, ServiceName->Buffer, @@ -123,7 +156,7 @@ ScmCreateServiceListEntry(PUNICODE_STRING ServiceName) { HeapFree(GetProcessHeap(), 0, Service->ServiceName.Buffer); HeapFree(GetProcessHeap(), 0, Service); - return NULL; + return(STATUS_INSUFFICIENT_RESOURCES); } wcscpy(Service->RegistryPath.Buffer, L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\"); @@ -162,7 +195,7 @@ ScmCreateServiceListEntry(PUNICODE_STRING ServiceName) RtlFreeUnicodeString(&Service->RegistryPath); RtlFreeUnicodeString(&Service->ServiceName); HeapFree(GetProcessHeap(), 0, Service); - return NULL; + return(Status); } DPRINT("ServiceName: '%wZ'\n", &Service->ServiceName); @@ -175,7 +208,7 @@ ScmCreateServiceListEntry(PUNICODE_STRING ServiceName) InsertTailList(&ServiceListHead, &Service->ServiceListEntry); - return Service; + return(STATUS_SUCCESS); } @@ -260,10 +293,7 @@ ScmCreateServiceDataBase(VOID) SubKeyName.Buffer[SubKeyName.Length / sizeof(WCHAR)] = 0; DPRINT("KeyName: '%wZ'\n", &SubKeyName); - if (ScmCreateServiceListEntry(&SubKeyName) == NULL) - { - return STATUS_INSUFFICIENT_RESOURCES; - } + Status = CreateServiceListEntry(&SubKeyName); } } @@ -416,7 +446,7 @@ ScmGetBootAndSystemDriverState(VOID) } -NTSTATUS FASTCALL +static NTSTATUS ScmStartService(PSERVICE Service, PSERVICE_GROUP Group) { @@ -595,7 +625,7 @@ Done: } #endif - return Status; //(STATUS_SUCCESS); + return(STATUS_SUCCESS); } @@ -690,27 +720,4 @@ ScmAutoStartServices(VOID) } } -/* - * FIXME: Doesn't work!!! - */ -PSERVICE FASTCALL -ScmFindService(PUNICODE_STRING ServiceName) -{ - PSERVICE CurrentService; - PLIST_ENTRY ServiceEntry; - - ServiceEntry = ServiceListHead.Flink; - while (ServiceEntry != &ServiceListHead) - { - CurrentService = CONTAINING_RECORD(ServiceEntry, SERVICE, ServiceListEntry); - if (!RtlCompareUnicodeString(ServiceName, &CurrentService->ServiceName, TRUE)) - { - return CurrentService; - } - ServiceEntry = ServiceEntry->Flink; - } - - return NULL; -} - /* EOF */ diff --git a/reactos/subsys/system/services/services.c b/reactos/subsys/system/services/services.c index 03a2771e04c..df52712bcc8 100644 --- a/reactos/subsys/system/services/services.c +++ b/reactos/subsys/system/services/services.c @@ -1,4 +1,4 @@ -/* $Id: services.c,v 1.17 2004/04/12 17:14:55 navaraf Exp $ +/* $Id: services.c,v 1.18 2004/04/12 17:20:47 navaraf Exp $ * * service control manager * @@ -33,11 +33,8 @@ #include #include #include -#undef CreateService -#undef OpenService #include "services.h" -#include #define NDEBUG #include @@ -46,7 +43,8 @@ /* GLOBALS ******************************************************************/ -#define PIPE_TIMEOUT 10000 +#define PIPE_BUFSIZE 1024 +#define PIPE_TIMEOUT 1000 /* FUNCTIONS *****************************************************************/ @@ -93,461 +91,17 @@ ScmCreateStartEvent(PHANDLE StartEvent) } -typedef struct _SERVICE_THREAD_DATA -{ - HANDLE hPipe; - PSERVICE pService; -} SERVICE_THREAD_DATA, *PSERVICE_THREAD_DATA; - - -VOID FASTCALL -ScmHandleDeleteServiceRequest( - PSERVICE_THREAD_DATA pServiceThreadData, - PSCM_SERVICE_REQUEST Request, - DWORD RequestSize, - PSCM_SERVICE_REPLY Reply, - LPDWORD ReplySize) -{ - Reply->ReplyStatus = RtlNtStatusToDosError( - ScmStartService(pServiceThreadData->pService, NULL)); - *ReplySize = sizeof(DWORD); -} - - -VOID FASTCALL -ScmHandleStartServiceRequest( - PSERVICE_THREAD_DATA pServiceThreadData, - PSCM_SERVICE_REQUEST Request, - DWORD RequestSize, - PSCM_SERVICE_REPLY Reply, - LPDWORD ReplySize) -{ - OBJECT_ATTRIBUTES ObjectAttributes; - NTSTATUS Status; - HANDLE KeyHandle; - - InitializeObjectAttributes( - &ObjectAttributes, - &pServiceThreadData->pService->RegistryPath, - OBJ_CASE_INSENSITIVE, - NULL, - NULL); - - Status = ZwOpenKey( - &KeyHandle, - KEY_READ, - &ObjectAttributes); - - if (NT_SUCCESS(Status)) - { - Status = ZwDeleteKey(KeyHandle); - if (NT_SUCCESS(Status)) - { - ZwClose(KeyHandle); - CHECKPOINT; - RemoveEntryList(&pServiceThreadData->pService->ServiceListEntry); - } - } - Reply->ReplyStatus = RtlNtStatusToDosError(Status); - *ReplySize = sizeof(DWORD); -} - - -DWORD -WINAPI -ScmNamedPipeServiceThread(LPVOID Context) -{ - SCM_SERVICE_REQUEST Request; - SCM_SERVICE_REPLY Reply; - DWORD cbBytesRead; - DWORD cbWritten, cbReplyBytes; - BOOL fSuccess; - PSERVICE_THREAD_DATA pServiceThreadData = Context; - - ConnectNamedPipe(pServiceThreadData->hPipe, NULL); - - for (;;) - { - fSuccess = ReadFile( - pServiceThreadData->hPipe, - &Request, - sizeof(Request), - &cbBytesRead, - NULL); - - if (!fSuccess || cbBytesRead == 0) - { - break; - } - - switch (Request.RequestCode) - { - case SCM_DELETESERVICE: - ScmHandleDeleteServiceRequest( - pServiceThreadData, - &Request, - cbBytesRead, - &Reply, - &cbReplyBytes); - break; - - case SCM_STARTSERVICE: - ScmHandleStartServiceRequest( - pServiceThreadData, - &Request, - cbBytesRead, - &Reply, - &cbReplyBytes); - break; - } - - fSuccess = WriteFile( - pServiceThreadData->hPipe, - &Reply, - cbReplyBytes, - &cbWritten, - NULL); - - if (!fSuccess || cbReplyBytes != cbWritten) - { - break; - } - } - - FlushFileBuffers(pServiceThreadData->hPipe); - DisconnectNamedPipe(pServiceThreadData->hPipe); - CloseHandle(pServiceThreadData->hPipe); - - return NO_ERROR; -} - - -VOID FASTCALL -ScmCreateServiceThread( - HANDLE hSCMPipe, - PSCM_OPENSERVICE_REPLY Reply, - LPDWORD ReplySize, - PSERVICE Service) -{ - HANDLE hPipe, hThread; - DWORD dwThreadId; - PSERVICE_THREAD_DATA ServiceThreadData; - - ServiceThreadData = HeapAlloc( - GetProcessHeap(), - 0, - sizeof(SERVICE_THREAD_DATA)); - - if (ServiceThreadData == NULL) - { - Reply->ReplyStatus = ERROR_NO_SYSTEM_RESOURCES; - CHECKPOINT; - return; - } - - swprintf(Reply->PipeName, L"\\\\.\\pipe\\SCM.%08X.%08X", hSCMPipe, Service); - - hPipe = CreateNamedPipeW( - Reply->PipeName, - PIPE_ACCESS_DUPLEX, - PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, - PIPE_UNLIMITED_INSTANCES, - sizeof(SCM_SERVICE_REQUEST), - sizeof(SCM_SERVICE_REPLY), - PIPE_TIMEOUT, - NULL); - - if (hPipe == INVALID_HANDLE_VALUE) - { - Reply->ReplyStatus = ERROR_NO_SYSTEM_RESOURCES; - CHECKPOINT; - return; - } - - ServiceThreadData->hPipe = hPipe; - ServiceThreadData->pService = Service; - - hThread = CreateThread( - NULL, - 0, - ScmNamedPipeServiceThread, - ServiceThreadData, - 0, - &dwThreadId); - - if (!hThread) - { - Reply->ReplyStatus = ERROR_NO_SYSTEM_RESOURCES; - CHECKPOINT; - CloseHandle(hPipe); - return; - } - - Reply->ReplyStatus = NO_ERROR; - *ReplySize = sizeof(SCM_OPENSERVICE_REPLY); -} - - -VOID FASTCALL -ScmHandleOpenServiceRequest( - HANDLE hPipe, - PSCM_REQUEST Request, - DWORD RequestSize, - PSCM_REPLY Reply, - LPDWORD ReplySize) -{ - PSERVICE Service; - UNICODE_STRING ServiceName; - - DPRINT("OpenService\n"); - - if (RequestSize != sizeof(SCM_OPENSERVICE_REQUEST)) - { - Reply->ReplyStatus = ERROR_INVALID_PARAMETER; - return; - } - - ServiceName.Length = Request->OpenService.ServiceName.Length; - ServiceName.Buffer = Request->OpenService.ServiceName.Buffer; - Service = ScmFindService(&ServiceName); - if (Service == NULL) - { - DPRINT("OpenService - Service not found\n"); - Reply->ReplyStatus = ERROR_SERVICE_DOES_NOT_EXIST; - return; - } - - DPRINT("OpenService - Service found\n"); - ScmCreateServiceThread( - hPipe, - &Reply->OpenService, - ReplySize, - Service); -} - - -VOID FASTCALL -ScmHandleCreateServiceRequest( - HANDLE hPipe, - PSCM_REQUEST Request, - DWORD RequestSize, - PSCM_REPLY Reply, - LPDWORD ReplySize) -{ - PSERVICE Service; - NTSTATUS Status; - UNICODE_STRING ServiceName; - - DPRINT("CreateService - %S\n", Request->CreateService.ServiceName.Buffer); - - if (RequestSize != sizeof(SCM_CREATESERVICE_REQUEST)) - { - Reply->ReplyStatus = ERROR_INVALID_PARAMETER; - return; - } - - Status = RtlCheckRegistryKey( - RTL_REGISTRY_SERVICES, - Request->CreateService.ServiceName.Buffer); - - if (NT_SUCCESS(Status)) - { - DPRINT("CreateService - Already exists\n"); - Reply->ReplyStatus = ERROR_SERVICE_EXISTS; - return; - } - - Status = RtlCreateRegistryKey( - RTL_REGISTRY_SERVICES, - Request->CreateService.ServiceName.Buffer); - - if (!NT_SUCCESS(Status)) - { - DPRINT("CreateService - Can't create key (%x)\n", Status); - Reply->ReplyStatus = Status; - return; - } - - Status = RtlWriteRegistryValue( - RTL_REGISTRY_SERVICES, - Request->CreateService.ServiceName.Buffer, - L"Type", - REG_DWORD, - &Request->CreateService.dwServiceType, - sizeof(DWORD)); - - if (!NT_SUCCESS(Status)) - { - DPRINT("CreateService - Error writing value\n"); - Reply->ReplyStatus = RtlNtStatusToDosError(Status); - return; - } - - Status = RtlWriteRegistryValue( - RTL_REGISTRY_SERVICES, - Request->CreateService.ServiceName.Buffer, - L"Start", - REG_DWORD, - &Request->CreateService.dwStartType, - sizeof(DWORD)); - - if (!NT_SUCCESS(Status)) - { - Reply->ReplyStatus = RtlNtStatusToDosError(Status); - return; - } - - Status = RtlWriteRegistryValue( - RTL_REGISTRY_SERVICES, - Request->CreateService.ServiceName.Buffer, - L"ErrorControl", - REG_DWORD, - &Request->CreateService.dwErrorControl, - sizeof(DWORD)); - - if (!NT_SUCCESS(Status)) - { - Reply->ReplyStatus = RtlNtStatusToDosError(Status); - return; - } - - if (Request->CreateService.BinaryPathName.Length) - { - Status = RtlWriteRegistryValue( - RTL_REGISTRY_SERVICES, - Request->CreateService.ServiceName.Buffer, - L"ImagePath", - REG_SZ, - Request->CreateService.BinaryPathName.Buffer, - Request->CreateService.BinaryPathName.Length + sizeof(UNICODE_NULL)); - - if (!NT_SUCCESS(Status)) - { - DPRINT("CreateService - Error writing value\n"); - Reply->ReplyStatus = RtlNtStatusToDosError(Status); - return; - } - } - - if (Request->CreateService.LoadOrderGroup.Length) - { - Status = RtlWriteRegistryValue( - RTL_REGISTRY_SERVICES, - Request->CreateService.ServiceName.Buffer, - L"Group", - REG_SZ, - Request->CreateService.LoadOrderGroup.Buffer, - Request->CreateService.LoadOrderGroup.Length + sizeof(UNICODE_NULL)); - - if (!NT_SUCCESS(Status)) - { - Reply->ReplyStatus = RtlNtStatusToDosError(Status); - return; - } - } - - if (Request->CreateService.Dependencies.Length) - { - Status = RtlWriteRegistryValue( - RTL_REGISTRY_SERVICES, - Request->CreateService.ServiceName.Buffer, - L"Dependencies", - REG_SZ, - Request->CreateService.Dependencies.Buffer, - Request->CreateService.Dependencies.Length + sizeof(UNICODE_NULL)); - - if (!NT_SUCCESS(Status)) - { - Reply->ReplyStatus = RtlNtStatusToDosError(Status); - return; - } - } - - if (Request->CreateService.DisplayName.Length) - { - Status = RtlWriteRegistryValue( - RTL_REGISTRY_SERVICES, - Request->CreateService.ServiceName.Buffer, - L"DisplayName", - REG_SZ, - Request->CreateService.DisplayName.Buffer, - Request->CreateService.DisplayName.Length + sizeof(UNICODE_NULL)); - - if (!NT_SUCCESS(Status)) - { - Reply->ReplyStatus = RtlNtStatusToDosError(Status); - return; - } - } - - if (Request->CreateService.ServiceStartName.Length || - Request->CreateService.Password.Length) - { - DPRINT1("Unimplemented case\n"); - } - - ServiceName.Length = Request->OpenService.ServiceName.Length; - ServiceName.Buffer = Request->OpenService.ServiceName.Buffer; - Service = ScmCreateServiceListEntry(&ServiceName); - if (Service == NULL) - { - DPRINT("CreateService - Error creating service list entry\n"); - Reply->ReplyStatus = ERROR_NOT_ENOUGH_MEMORY; - return; - } - - DPRINT("CreateService - Success\n"); - ScmCreateServiceThread( - hPipe, - &Reply->OpenService, - ReplySize, - Service); -} - - BOOL ScmNamedPipeHandleRequest( - HANDLE hPipe, - PSCM_REQUEST Request, + PVOID Request, DWORD RequestSize, - PSCM_REPLY Reply, + PVOID Reply, LPDWORD ReplySize) { - *ReplySize = sizeof(DWORD); + DbgPrint("SCM READ: %s\n", Request); - if (RequestSize < sizeof(DWORD)) - { - Reply->ReplyStatus = ERROR_INVALID_PARAMETER; - return TRUE; - } - - DPRINT("RequestCode: %x\n", Request->RequestCode); - - switch (Request->RequestCode) - { - case SCM_OPENSERVICE: - ScmHandleOpenServiceRequest( - hPipe, - Request, - RequestSize, - Reply, - ReplySize); - break; - - case SCM_CREATESERVICE: - ScmHandleCreateServiceRequest( - hPipe, - Request, - RequestSize, - Reply, - ReplySize); - break; - - default: - Reply->ReplyStatus = ERROR_INVALID_PARAMETER; - } - - return TRUE; + *ReplySize = 0; + return FALSE; } @@ -555,8 +109,8 @@ DWORD WINAPI ScmNamedPipeThread(LPVOID Context) { - SCM_REQUEST Request; - SCM_REPLY Reply; + CHAR chRequest[PIPE_BUFSIZE]; + CHAR chReply[PIPE_BUFSIZE]; DWORD cbReplyBytes; DWORD cbBytesRead; DWORD cbWritten; @@ -569,16 +123,16 @@ ScmNamedPipeThread(LPVOID Context) for (;;) { fSuccess = ReadFile(hPipe, - &Request, - sizeof(Request), + &chRequest, + PIPE_BUFSIZE, &cbBytesRead, NULL); if (!fSuccess || cbBytesRead == 0) { break; } - if (ScmNamedPipeHandleRequest(hPipe, &Request, cbBytesRead, &Reply, &cbReplyBytes)) { + if (ScmNamedPipeHandleRequest(&chRequest, cbBytesRead, &chReply, &cbReplyBytes)) { fSuccess = WriteFile(hPipe, - &Reply, + &chReply, cbReplyBytes, &cbWritten, NULL); @@ -608,8 +162,8 @@ BOOL ScmCreateNamedPipe(VOID) PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, - sizeof(SCM_REQUEST), - sizeof(SCM_REPLY), + PIPE_BUFSIZE, + PIPE_BUFSIZE, PIPE_TIMEOUT, NULL); if (hPipe == INVALID_HANDLE_VALUE) { @@ -689,6 +243,25 @@ BOOL StartScmNamedPipeThreadListener(void) return TRUE; } +VOID FASTCALL +AcquireLoadDriverPrivilege(VOID) +{ + HANDLE hToken; + TOKEN_PRIVILEGES tkp; + + /* Get a token for this process. */ + if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { + /* Get the LUID for the debug privilege. */ + LookupPrivilegeValue(NULL, SE_LOAD_DRIVER_NAME, &tkp.Privileges[0].Luid); + + tkp.PrivilegeCount = 1; /* one privilege to set */ + tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + + /* Get the debug privilege for this process. */ + AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); + } +} + int STDCALL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, @@ -701,6 +274,9 @@ WinMain(HINSTANCE hInstance, DPRINT("SERVICES: Service Control Manager\n"); + /* Acquire privileges to load drivers */ + AcquireLoadDriverPrivilege(); + /* Create start event */ if (!ScmCreateStartEvent(&hScmStartEvent)) { diff --git a/reactos/subsys/system/services/services.h b/reactos/subsys/system/services/services.h index d5177874eec..443ac04e98e 100644 --- a/reactos/subsys/system/services/services.h +++ b/reactos/subsys/system/services/services.h @@ -2,34 +2,6 @@ * services.h */ -typedef struct _SERVICE_GROUP -{ - LIST_ENTRY GroupListEntry; - UNICODE_STRING GroupName; - - BOOLEAN ServicesRunning; - -} SERVICE_GROUP, *PSERVICE_GROUP; - -typedef struct _SERVICE -{ - LIST_ENTRY ServiceListEntry; - UNICODE_STRING ServiceName; - UNICODE_STRING RegistryPath; - UNICODE_STRING ServiceGroup; - - ULONG Start; - ULONG Type; - ULONG ErrorControl; - ULONG Tag; - - BOOLEAN ServiceRunning; - BOOLEAN ServiceVisited; - - HANDLE ControlPipeHandle; - ULONG ProcessId; - ULONG ThreadId; -} SERVICE, *PSERVICE; /* services.c */ @@ -42,12 +14,6 @@ NTSTATUS ScmCreateServiceDataBase(VOID); VOID ScmGetBootAndSystemDriverState(VOID); VOID ScmAutoStartServices(VOID); -PSERVICE FASTCALL -ScmCreateServiceListEntry(PUNICODE_STRING ServiceName); -PSERVICE FASTCALL -ScmFindService(PUNICODE_STRING ServiceName); -NTSTATUS FASTCALL -ScmStartService(PSERVICE Service, PSERVICE_GROUP Group); /* EOF */ From c93eb9e54eceefaee8d45811a37cb7bd0c343938 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Mon, 12 Apr 2004 17:31:01 +0000 Subject: [PATCH 0863/1463] - Reverted my last changed, should go to branch! svn path=/trunk/; revision=9114 --- reactos/include/services/scmprot.h | 115 ----------------------------- 1 file changed, 115 deletions(-) delete mode 100644 reactos/include/services/scmprot.h diff --git a/reactos/include/services/scmprot.h b/reactos/include/services/scmprot.h deleted file mode 100644 index 12d6f8a358a..00000000000 --- a/reactos/include/services/scmprot.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Service Control Manager - Protocol Header - * - * Copyright (C) 2004 Filip Navara - * - * This software 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 software 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 General Public License - * along with this software; see the file COPYING.LIB. If not, write - * to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, - * MA 02139, USA. - * - * $Id: scmprot.h,v 1.1 2004/04/12 17:14:26 navaraf Exp $ - */ - -#ifndef _SCM_H -#define _SCM_H - -/* - * NOTE: - * This protocol isn't compatible with the Windows (R) one. Since - * Windows (R) XP (or 2000?) all the communcation goes through RPC. - * We don't have RPC implemented yet, so it can't be used yet :( - */ - -typedef struct -{ - ULONG Length; - WCHAR Buffer[256]; -} SCM_STRING; - -#define INIT_SCM_STRING(x, y) x.Length = wcslen(y) * sizeof(WCHAR), RtlCopyMemory(x.Buffer, y, x.Length + sizeof(UNICODE_NULL)) - -/* - * Global requests - */ - -#define SCM_OPENSERVICE 0x14 -#define SCM_CREATESERVICE 0x20 - -typedef struct _SCM_OPENSERVICE_REQUEST -{ - DWORD RequestCode; - SCM_STRING ServiceName; - DWORD dwDesiredAccess; -} SCM_OPENSERVICE_REQUEST, *PSCM_OPENSERVICE_REQUEST; - -typedef struct _SCM_OPENSERVICE_REPLY -{ - DWORD ReplyStatus; - WCHAR PipeName[128]; -} SCM_OPENSERVICE_REPLY, *PSCM_OPENSERVICE_REPLY; - -typedef struct _SCM_CREATESERVICE_REQUEST -{ - DWORD RequestCode; - SCM_STRING ServiceName; - SCM_STRING DisplayName; - DWORD dwDesiredAccess; - DWORD dwServiceType; - DWORD dwStartType; - DWORD dwErrorControl; - SCM_STRING BinaryPathName; - SCM_STRING LoadOrderGroup; - SCM_STRING Dependencies; - SCM_STRING ServiceStartName; - SCM_STRING Password; -} SCM_CREATESERVICE_REQUEST, *PSCM_CREATESERVICE_REQUEST; - -typedef struct _SCM_CREATESERVICE_REPLY -{ - DWORD ReplyStatus; - WCHAR PipeName[128]; -} SCM_CREATESERVICE_REPLY, *PSCM_CREATESERVICE_REPLY; - -typedef union _SCM_REQUEST -{ - DWORD RequestCode; - SCM_OPENSERVICE_REQUEST OpenService; - SCM_CREATESERVICE_REQUEST CreateService; -} SCM_REQUEST, *PSCM_REQUEST; - -typedef union _SCM_REPLY -{ - DWORD ReplyStatus; - SCM_OPENSERVICE_REPLY OpenService; - SCM_CREATESERVICE_REPLY CreateService; -} SCM_REPLY, *PSCM_REPLY; - -/* - * Per service requests - */ - -#define SCM_DELETESERVICE 0x10 -#define SCM_STARTSERVICE 0x11 - -typedef union _SCM_SERVICE_REQUEST -{ - DWORD RequestCode; -} SCM_SERVICE_REQUEST, *PSCM_SERVICE_REQUEST; - -typedef union _SCM_SERVICE_REPLY -{ - DWORD ReplyStatus; -} SCM_SERVICE_REPLY, *PSCM_SERVICE_REPLY; - -#endif From ec66d1b6b90768af42c781514c27abb28b1584b3 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Mon, 12 Apr 2004 17:57:44 +0000 Subject: [PATCH 0864/1463] show waitcursor when switching to anotehr dir svn path=/trunk/; revision=9115 --- reactos/subsys/system/explorer/shell/entries.h | 2 +- reactos/subsys/system/explorer/shell/filechild.cpp | 10 ++++++---- reactos/subsys/system/explorer/shell/shellfs.h | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/reactos/subsys/system/explorer/shell/entries.h b/reactos/subsys/system/explorer/shell/entries.h index ed1b9aa8992..6754c40feeb 100644 --- a/reactos/subsys/system/explorer/shell/entries.h +++ b/reactos/subsys/system/explorer/shell/entries.h @@ -51,7 +51,7 @@ enum SCAN_FLAGS { SCAN_EXTRACT_ICONS = 1, SCAN_DO_ACCESS = 2, - SCAN_ALL = 3, + SCAN_ALL = 0,//@@3, SCAN_FILESYSTEM = 4 }; diff --git a/reactos/subsys/system/explorer/shell/filechild.cpp b/reactos/subsys/system/explorer/shell/filechild.cpp index 160bb50a8b2..7b928614b22 100644 --- a/reactos/subsys/system/explorer/shell/filechild.cpp +++ b/reactos/subsys/system/explorer/shell/filechild.cpp @@ -267,6 +267,8 @@ void FileChildWindow::set_curdir(Entry* entry) _right->_cur = entry; if (entry) { + WaitCursor wait; + if (!entry->_scanned) scan_entry(entry); else { @@ -467,6 +469,7 @@ LRESULT FileChildWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) break;} case ID_REFRESH: {CONTEXT("ID_REFRESH"); + WaitCursor wait; bool expanded = _left->_cur->_expanded; scan_entry(_left->_cur); @@ -560,13 +563,15 @@ int FileChildWindow::Command(int id, int code) } -void FileChildWindow::activate_entry(Pane* pane) +void FileChildWindow::activate_entry(Pane* pane) ///@todo enable using key accelerator { Entry* entry = pane->_cur; if (!entry) return; + WaitCursor wait; + if ((entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || // a directory? entry->_down) // a file with NTFS sub-streams? { @@ -611,7 +616,6 @@ void FileChildWindow::scan_entry(Entry* entry) CONTEXT("FileChildWindow::scan_entry()"); int idx = ListBox_GetCurSel(_left_hwnd); - HCURSOR old_cursor = SetCursor(LoadCursor(0, IDC_WAIT)); // delete sub entries in left pane for(;;) { @@ -642,8 +646,6 @@ void FileChildWindow::scan_entry(Entry* entry) _right->set_header(); _header_wdths_ok = false; - - SetCursor(old_cursor); } diff --git a/reactos/subsys/system/explorer/shell/shellfs.h b/reactos/subsys/system/explorer/shell/shellfs.h index beae8c7d1e3..7bec8c27679 100644 --- a/reactos/subsys/system/explorer/shell/shellfs.h +++ b/reactos/subsys/system/explorer/shell/shellfs.h @@ -100,7 +100,7 @@ struct ShellDirectory : public ShellEntry, public Directory virtual void read_directory(int scan_flags=SCAN_ALL); virtual const void* get_next_path_component(const void*) const; - virtual Entry* find_entry(const void* p); + virtual Entry* find_entry(const void*); virtual bool get_path(PTSTR path) const; From 77fbf2134e28a8b72870300f30fa0cfd0cb76292 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Mon, 12 Apr 2004 18:07:38 +0000 Subject: [PATCH 0865/1463] comments svn path=/trunk/; revision=9116 --- reactos/subsys/system/explorer/dialogs/searchprogram.cpp | 4 ++-- reactos/subsys/system/explorer/explorer.cpp | 4 ++-- reactos/subsys/system/explorer/shell/entries.cpp | 4 +--- reactos/subsys/system/explorer/shell/entries.h | 2 +- reactos/subsys/system/explorer/shell/filechild.cpp | 6 ++++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/reactos/subsys/system/explorer/dialogs/searchprogram.cpp b/reactos/subsys/system/explorer/dialogs/searchprogram.cpp index 365f4ece8a3..3929d059407 100644 --- a/reactos/subsys/system/explorer/dialogs/searchprogram.cpp +++ b/reactos/subsys/system/explorer/dialogs/searchprogram.cpp @@ -153,7 +153,7 @@ void FindProgramDlg::Refresh(bool delete_cache) TCHAR buffer[1024]; GetWindowText(GetDlgItem(_hwnd, IDC_FILTER), buffer, 1024); -#ifndef __WINE__ ///@todo +#ifndef __WINE__ ///@todo _tcslwr() for Wine _tcslwr(buffer); #endif _lwr_filter = buffer; @@ -232,7 +232,7 @@ void FindProgramDlg::add_entry(const FPDEntry& cache_entry) String lwr_path = cache_entry._path; String lwr_name = cache_entry._entry->_display_name; -#ifndef __WINE__ ///@todo +#ifndef __WINE__ ///@todo _tcslwr() for Wine _tcslwr((LPTSTR)lwr_path.c_str()); _tcslwr((LPTSTR)lwr_name.c_str()); #endif diff --git a/reactos/subsys/system/explorer/explorer.cpp b/reactos/subsys/system/explorer/explorer.cpp index 7bb7aeb7978..2b933b9b06d 100644 --- a/reactos/subsys/system/explorer/explorer.cpp +++ b/reactos/subsys/system/explorer/explorer.cpp @@ -172,7 +172,7 @@ bool FileTypeManager::is_exe_file(LPCTSTR ext) const FileTypeInfo& FileTypeManager::operator[](String ext) { -#ifndef __WINE__ ///@todo +#ifndef __WINE__ ///@todo _tcslwr() for Wine _tcslwr((LPTSTR)ext.c_str()); #endif @@ -405,7 +405,7 @@ const Icon& IconCache::extract(LPCTSTR path, int idx) { CachePair key(path, idx); -#ifndef __WINE__ ///@todo +#ifndef __WINE__ ///@todo _tcslwr() for Wine _tcslwr((LPTSTR)key.first.c_str()); #endif diff --git a/reactos/subsys/system/explorer/shell/entries.cpp b/reactos/subsys/system/explorer/shell/entries.cpp index 20482d31ae2..9ffa3373e38 100644 --- a/reactos/subsys/system/explorer/shell/entries.cpp +++ b/reactos/subsys/system/explorer/shell/entries.cpp @@ -116,7 +116,7 @@ Entry* Entry::read_tree(const void* path, SORT_ORDER sortOrder, int scan_flags) { CONTEXT("Entry::read_tree()"); - HCURSOR old_cursor = SetCursor(LoadCursor(0, IDC_WAIT)); + WaitCursor wait; Entry* entry = this; @@ -132,8 +132,6 @@ Entry* Entry::read_tree(const void* path, SORT_ORDER sortOrder, int scan_flags) entry = found; } - SetCursor(old_cursor); - return entry; } diff --git a/reactos/subsys/system/explorer/shell/entries.h b/reactos/subsys/system/explorer/shell/entries.h index 6754c40feeb..ed1b9aa8992 100644 --- a/reactos/subsys/system/explorer/shell/entries.h +++ b/reactos/subsys/system/explorer/shell/entries.h @@ -51,7 +51,7 @@ enum SCAN_FLAGS { SCAN_EXTRACT_ICONS = 1, SCAN_DO_ACCESS = 2, - SCAN_ALL = 0,//@@3, + SCAN_ALL = 3, SCAN_FILESYSTEM = 4 }; diff --git a/reactos/subsys/system/explorer/shell/filechild.cpp b/reactos/subsys/system/explorer/shell/filechild.cpp index 7b928614b22..ac22313aac4 100644 --- a/reactos/subsys/system/explorer/shell/filechild.cpp +++ b/reactos/subsys/system/explorer/shell/filechild.cpp @@ -276,7 +276,9 @@ void FileChildWindow::set_curdir(Entry* entry) ListBox_ResetContent(_right_hwnd); _right->insert_entries(entry->_down); - _right->calc_widths(false); + + _right->calc_widths(false); ///@todo make configurable (This call takes really _very_ long compared to all other processing!) + _right->set_header(); } @@ -601,7 +603,7 @@ void FileChildWindow::activate_entry(Pane* pane) ///@todo enable using } if (!scanned_old) { - pane->calc_widths(FALSE); + pane->calc_widths(false); pane->set_header(); } From bdf792d41a16efd764903c46ff34c2b31e620930 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Mon, 12 Apr 2004 19:49:12 +0000 Subject: [PATCH 0866/1463] ShellBrowserChild: jump to addressbar target svn path=/trunk/; revision=9117 --- .../system/explorer/shell/filechild.cpp | 14 ++-- .../system/explorer/shell/shellbrowser.cpp | 67 +++++++++++++------ .../system/explorer/shell/shellbrowser.h | 2 +- 3 files changed, 53 insertions(+), 30 deletions(-) diff --git a/reactos/subsys/system/explorer/shell/filechild.cpp b/reactos/subsys/system/explorer/shell/filechild.cpp index ac22313aac4..be000793fc8 100644 --- a/reactos/subsys/system/explorer/shell/filechild.cpp +++ b/reactos/subsys/system/explorer/shell/filechild.cpp @@ -664,6 +664,7 @@ String FileChildWindow::jump_to_int(LPCTSTR url) if (SplitFileSysURL(url, dir, fname)) { Entry* entry = NULL; + // call read_tree() to iterate through the hierarchy and open all folders to reach dir if (_root._entry) switch(_root._entry->_etype) { case ET_SHELL: { //@@ separate into FileChildWindow in ShellChildWindow, WinChildWindow, UnixChildWindow ? @@ -672,27 +673,24 @@ String FileChildWindow::jump_to_int(LPCTSTR url) break;} #ifdef __WINE__ - case ET_UNIX: - { + case ET_UNIX: { LPCTSTR path = dir; if (!_tcsicmp(path, _root._path, _tcslen(_root._path))) path += _tcslen(_root._path); entry = _root.read_tree(path); - } - break; + break;} #endif - default: // ET_UNIX, ET_NTOBJS, ET_REGISTRY, ET_FAT, ET_WINDOWS - { + default: { // ET_NTOBJS, ET_REGISTRY, ET_FAT, ET_WINDOWS LPCTSTR path = dir; if (!_tcsnicmp(path, _root._path, _tcslen(_root._path))) path += _tcslen(_root._path); entry = _root.read_tree(path); - } + break;} } if (entry) { @@ -722,6 +720,8 @@ String FileChildWindow::jump_to_int(LPCTSTR url) } } + ///@todo use fname + return dir; //FmtString(TEXT("file://%s"), (LPCTSTR)dir); } } diff --git a/reactos/subsys/system/explorer/shell/shellbrowser.cpp b/reactos/subsys/system/explorer/shell/shellbrowser.cpp index 2dd766b83dd..f436b40e06e 100644 --- a/reactos/subsys/system/explorer/shell/shellbrowser.cpp +++ b/reactos/subsys/system/explorer/shell/shellbrowser.cpp @@ -107,6 +107,9 @@ LRESULT ShellBrowserChild::Init(LPCREATESTRUCT pcs) _hwnd, (HMENU)IDC_FILETREE, g_Globals._hInstance, 0); if (_left_hwnd) { + TreeView_SetImageList(_left_hwnd, _himlSmall, TVSIL_NORMAL); + TreeView_SetScrollTime(_left_hwnd, 100); + InitializeTree(); InitDragDrop(); @@ -121,9 +124,6 @@ void ShellBrowserChild::InitializeTree() { CONTEXT("ShellBrowserChild::InitializeTree()"); - TreeView_SetImageList(_left_hwnd, _himlSmall, TVSIL_NORMAL); - TreeView_SetScrollTime(_left_hwnd, 100); - TV_INSERTSTRUCT tvInsert; tvInsert.hParent = 0; @@ -477,7 +477,7 @@ HRESULT ShellBrowserChild::OnDefaultCommand(LPIDA pida) if (entry && (entry->_data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)) if (entry->_etype == ET_SHELL) - if (expand_folder(static_cast(entry))) + if (_last_sel && select_entry(_last_sel, entry)) return S_OK; } } @@ -496,28 +496,27 @@ HRESULT ShellBrowserChild::OnDefaultCommand(LPIDA pida) } -bool ShellBrowserChild::expand_folder(ShellDirectory* entry) +HTREEITEM ShellBrowserChild::select_entry(HTREEITEM hitem, Entry* entry, bool expand) { - CONTEXT("ShellBrowserChild::expand_folder()"); + CONTEXT("ShellBrowserChild::select_entry()"); - //HTREEITEM hitem_sel = TreeView_GetSelection(_left_hwnd); - if (!_last_sel) - return false; + if (expand && !TreeView_Expand(_left_hwnd, hitem, TVE_EXPAND)) + return 0; - if (!TreeView_Expand(_left_hwnd, _last_sel, TVE_EXPAND)) - return false; + for(hitem=TreeView_GetChild(_left_hwnd,hitem); hitem; hitem=TreeView_GetNextSibling(_left_hwnd,hitem)) { + if ((Entry*)TreeView_GetItemData(_left_hwnd,hitem) == entry) { + if (TreeView_SelectItem(_left_hwnd, hitem)) { + if (expand) + TreeView_Expand(_left_hwnd, hitem, TVE_EXPAND); - for(HTREEITEM hitem=TreeView_GetChild(_left_hwnd,_last_sel); hitem; hitem=TreeView_GetNextSibling(_left_hwnd,hitem)) { - if ((ShellDirectory*)TreeView_GetItemData(_left_hwnd,hitem) == entry) { - if (TreeView_SelectItem(_left_hwnd, hitem) && - TreeView_Expand(_left_hwnd, hitem, TVE_EXPAND)) - return true; + return hitem; + } break; } } - return false; + return 0; } @@ -530,9 +529,13 @@ String ShellBrowserChild::jump_to_int(LPCTSTR url) return url; } - if (SplitFileSysURL(url, dir, fname)) + if (SplitFileSysURL(url, dir, fname)) { + + ///@todo use fname + if (jump_to_pidl(ShellPath(dir))) return FmtString(TEXT("file://%s"), (LPCTSTR)dir); + } return String(); } @@ -540,11 +543,31 @@ String ShellBrowserChild::jump_to_int(LPCTSTR url) bool ShellBrowserChild::jump_to_pidl(LPCITEMIDLIST pidl) { + if (!_root._entry) + return false; -/*@todo - we should call read_tree() here to iterate through the hierarchy and open all folders from shell_info._root_shell_path to shell_info._shell_path - -> see FileChildWindow::FileChildWindow() -*/ + // iterate through the hierarchy and open all folders to reach pidl + WaitCursor wait; + + HTREEITEM hitem = TreeView_GetRoot(_left_hwnd); + Entry* entry = _root._entry; + + for(const void*p=pidl;;) { + if (!p) + return true; + + if (!entry || !hitem) + break; + + entry->smart_scan(SORT_NAME); + + Entry* found = entry->find_entry(p); + p = entry->get_next_path_component(p); + + hitem = select_entry(hitem, found); + + entry = found; + } return false; } diff --git a/reactos/subsys/system/explorer/shell/shellbrowser.h b/reactos/subsys/system/explorer/shell/shellbrowser.h index 4849c538393..a7546d4b02d 100644 --- a/reactos/subsys/system/explorer/shell/shellbrowser.h +++ b/reactos/subsys/system/explorer/shell/shellbrowser.h @@ -135,5 +135,5 @@ protected: void UpdateFolderView(IShellFolder* folder); void Tree_DoItemMenu(HWND hwndTreeView, HTREEITEM hItem, LPPOINT pptScreen); - bool expand_folder(ShellDirectory* entry); + HTREEITEM select_entry(HTREEITEM hitem, Entry* entry, bool expand=true); }; From b7a5d0ed98d685c06b9d9b82f0ff9bf1b6de8eba Mon Sep 17 00:00:00 2001 From: James Tabor Date: Mon, 12 Apr 2004 19:52:36 +0000 Subject: [PATCH 0867/1463] Add Debug header. svn path=/trunk/; revision=9118 --- reactos/lib/kernel32/misc/stubs.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/reactos/lib/kernel32/misc/stubs.c b/reactos/lib/kernel32/misc/stubs.c index 3dee78ae0c3..67123c77471 100644 --- a/reactos/lib/kernel32/misc/stubs.c +++ b/reactos/lib/kernel32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.71 2004/04/12 17:09:36 navaraf Exp $ +/* $Id: stubs.c,v 1.72 2004/04/12 19:52:36 jimtabor Exp $ * * KERNEL32.DLL stubs (unimplemented functions) * Remove from this file, if you implement them. @@ -6,6 +6,10 @@ #include +#define NDEBUG +#include "../include/debug.h" + + //#define _OLE2NLS_IN_BUILD_ /* From ba45b572720d6894b43bff853f8f7e0356d3fbfc Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Mon, 12 Apr 2004 22:07:45 +0000 Subject: [PATCH 0868/1463] System call thunk generation made marginally more portable: - generate real C functions with inline asm. Should fix a problem with cross-compilation on 64-bit hosts - store parameter count, not parameter block size in sysfuncs.lst svn path=/trunk/; revision=9119 --- reactos/iface/addsys/genw32k.c | 147 ++++++----- reactos/iface/native/genntdll.c | 154 ++++++----- reactos/iface/native/sysfuncs.lst | 426 +++++++++++++++--------------- 3 files changed, 386 insertions(+), 341 deletions(-) diff --git a/reactos/iface/addsys/genw32k.c b/reactos/iface/addsys/genw32k.c index c43c9775e1b..5b95ded4db6 100644 --- a/reactos/iface/addsys/genw32k.c +++ b/reactos/iface/addsys/genw32k.c @@ -1,4 +1,4 @@ -/* $Id: genw32k.c,v 1.9 2004/04/07 15:32:24 ekohl Exp $ +/* $Id: genw32k.c,v 1.10 2004/04/12 22:07:45 hyperion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS version of ntdll @@ -29,14 +29,82 @@ /* FUNCTIONS ****************************************************************/ +void write_stub_header(FILE * out) +{ + fputs + ( + "/* Machine generated, don't edit */\n" + "\n" + "#ifdef __cplusplus\n" + "#define EXTERN_C extern \"C\"\n" + "#else\n" + "#define EXTERN_C\n" + "#endif\n" + "\n" + "EXTERN_C static __inline__ __attribute__((regparm(2)))" + "void*ZwRosSystemServiceThunk(long n,void*a)" + "{" + "void*ret;" + "__asm__" + "(" + "\"int $0x2E\":" + "\"=a\"(ret):" + "\"a\"(n),\"d\"(a)" + ");" + "return ret;" + "}\n", + out + ); +} + +void write_syscall_stub_func(FILE* out, char* name, unsigned nr_args, + unsigned int sys_call_idx) +{ + unsigned i; + + fprintf(out, "EXTERN_C void*__stdcall %s(", name); + + if(nr_args == 0) + fputs("void", out); + else + for(i = 0; i < nr_args; ++ i) + { + if(i > 0) + fputs(",", out); + + fprintf(out, "void*a%u", i); + } + + fputs("){", out); + + if(nr_args > 1) + for(i = 1; i < nr_args; ++ i) + fprintf(out, "(void)a%u;", i); + + fprintf(out, "return ZwRosSystemServiceThunk(%u,", sys_call_idx); + + if(nr_args == 0) + fputs("0", out); + else + fputs("&a0", out); + + fputs(");}\n", out); +} + +void write_syscall_stub(FILE* out1, FILE* out2, char* name, + unsigned nr_args, unsigned int sys_call_idx) +{ + write_syscall_stub_func(out1, name, nr_args, sys_call_idx); + write_syscall_stub_func(out2, name, nr_args, sys_call_idx); +} + int makeSystemServiceTable(FILE *in, FILE *out) { char line [INPUT_BUFFER_SIZE]; char *s; char *name; int sys_call_idx; -char *nr_args; -char *stmp; +char *snr_args; /* * Main SSDT Header @@ -67,15 +135,7 @@ char *stmp; { /* Extract the NtXXX name */ name = (char *)strtok(s," \t"); - /* Extract the stack size */ - nr_args = (char *)strtok(NULL," \t"); - /* - * Remove, if present, the trailing LF. - */ - if ((stmp = strchr(nr_args, '\n')) != NULL) - { - *stmp = '\0'; - } + #ifdef VERBOSE printf("%3d \"%s\"\n",sys_call_idx | INDEX,name); #endif @@ -123,14 +183,8 @@ char *stmp; /* Extract the NtXXX name */ name = (char *)strtok(s," \t"); /* Extract the stack size */ - nr_args = (char *)strtok(NULL," \t"); - /* - * Remove, if present, the trailing LF. - */ - if ((stmp = strchr(nr_args, '\n')) != NULL) - { - *stmp = '\0'; - } + snr_args = (char *)strtok(NULL," \t"); + #ifdef VERBOSE printf("%3d \"%s\"\n",sys_call_idx|INDEX,name); #endif @@ -143,7 +197,7 @@ char *stmp; * Now write the current system call's ID * in the service table along with its Parameters Size. */ - fprintf(out,"\t\t%d",atoi(nr_args) * sizeof(void*)); + fprintf(out,"\t\t%lu * sizeof(void*)", strtoul(snr_args, NULL, 0)); /* Next system call index */ sys_call_idx++; @@ -177,21 +231,17 @@ process( char * s; char * name; /* NtXXX name */ int sys_call_idx; /* NtXXX index number in the service table */ - char * nr_args; /* stack_size / machine_word_size */ - char * stmp; - int stacksize; + char * snr_args; /* stack_size / machine_word_size */ /* * GDI32 stubs file header */ - fprintf(out1,"// Machine generated, don't edit\n"); - fprintf(out1,"\n\n"); + write_stub_header(out1); /* * USER32 stubs file header */ - fprintf(out2,"// Machine generated, don't edit\n"); - fprintf(out2,"\n\n"); + write_stub_header(out2); /* * Scan the database. DB is a text file; each line @@ -230,48 +280,13 @@ process( /* Extract the NtXXX name */ name = (char *)strtok(s," \t"); /* Extract the stack size */ - nr_args = (char *)strtok(NULL," \t"); - stacksize = atoi(nr_args)*sizeof(void*); - /* - * Remove, if present, the trailing LF. - */ - if ((stmp = strchr(nr_args, '\n')) != NULL) - { - *stmp = '\0'; - } + snr_args = (char *)strtok(NULL," \t"); + #ifdef VERBOSE printf("%3d \"%s\"\n",sys_call_idx | INDEX,name); #endif - /* - * Write the GDI32 stub for the current system call. - */ -#ifdef PARAMETERIZED_LIBS - fprintf(out1,"__asm__(\"\\n\\t.global _%s@%d\\n\\t\"\n",name,stacksize); - fprintf(out1,"\"_%s@%d:\\n\\t\"\n",name,stacksize); -#else - fprintf(out1,"__asm__(\"\\n\\t.global _%s\\n\\t\"\n",name); - fprintf(out1,"\"_%s:\\n\\t\"\n",name); -#endif - fprintf(out1,"\t\"mov\t$%d,%%eax\\n\\t\"\n",sys_call_idx | INDEX); - fprintf(out1,"\t\"lea\t4(%%esp),%%edx\\n\\t\"\n"); - fprintf(out1,"\t\"int\t$0x2E\\n\\t\"\n"); - fprintf(out1,"\t\"ret\t$%d\\n\\t\");\n\n",stacksize); - - /* - * Write the USER32 stub for the current system call - */ -#ifdef PARAMETERIZED_LIBS - fprintf(out2,"__asm__(\"\\n\\t.global _%s@%d\\n\\t\"\n",name,stacksize); - fprintf(out2,"\"_%s@%d:\\n\\t\"\n",name,stacksize); -#else - fprintf(out2,"__asm__(\"\\n\\t.global _%s\\n\\t\"\n",name); - fprintf(out2,"\"_%s:\\n\\t\"\n",name); -#endif - fprintf(out2,"\t\"mov\t$%d,%%eax\\n\\t\"\n",sys_call_idx | INDEX); - fprintf(out2,"\t\"lea\t4(%%esp),%%edx\\n\\t\"\n"); - fprintf(out2,"\t\"int\t$0x2E\\n\\t\"\n"); - fprintf(out2,"\t\"ret\t$%d\\n\\t\");\n\n",stacksize); + write_syscall_stub(out1, out2, name, strtoul(snr_args, NULL, 0), sys_call_idx | INDEX); /* Next system call index */ sys_call_idx++; diff --git a/reactos/iface/native/genntdll.c b/reactos/iface/native/genntdll.c index 795de62c820..b81e22ba14f 100644 --- a/reactos/iface/native/genntdll.c +++ b/reactos/iface/native/genntdll.c @@ -1,4 +1,4 @@ -/* $Id: genntdll.c,v 1.16 2004/04/07 15:32:41 ekohl Exp $ +/* $Id: genntdll.c,v 1.17 2004/04/12 22:07:45 hyperion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS version of ntdll @@ -11,6 +11,12 @@ * to twin NtXXX calls, via int 0x2e (x86). * 19990617 (ea) * Fixed a bug in function numbers in kernel ZwXXX stubs. + * 20040406 (kjkh) + * The sysfuncs.lst file now specifies the number of parameters, + * not their stack size, for obvious portability reastons. Also, we + * now generate real C functions to let the compiler do the correct + * name decoration and whatever else (this also makes this tool + * marginally more portable). * */ @@ -28,43 +34,80 @@ /* FUNCTIONS ****************************************************************/ -void write_syscall_stub(FILE* out, FILE* out3, char* name, char* name2, - char* nr_args, unsigned int sys_call_idx) +void write_stub_header(FILE * out) { -#ifdef PARAMETERIZED_LIBS - fprintf(out,"__asm__(\"\\n\\t.global _%s@%s\\n\\t\"\n",name,nr_args); - fprintf(out,"\".global _%s@%s\\n\\t\"\n",name2,nr_args); - fprintf(out,"\"_%s@%s:\\n\\t\"\n",name,nr_args); - fprintf(out,"\"_%s@%s:\\n\\t\"\n",name2,nr_args); -#else - fprintf(out,"__asm__(\"\\n\\t.global _%s\\n\\t\"\n",name); - fprintf(out,"\".global _%s\\n\\t\"\n",name2); - fprintf(out,"\"_%s:\\n\\t\"\n",name); - fprintf(out,"\"_%s:\\n\\t\"\n",name2); -#endif - fprintf(out,"\t\"pushl\t%%ebp\\n\\t\"\n"); - fprintf(out,"\t\"movl\t%%esp, %%ebp\\n\\t\"\n"); - fprintf(out,"\t\"mov\t$%d,%%eax\\n\\t\"\n",sys_call_idx); - fprintf(out,"\t\"lea\t8(%%ebp),%%edx\\n\\t\"\n"); - fprintf(out,"\t\"int\t$0x2E\\n\\t\"\n"); - fprintf(out,"\t\"popl\t%%ebp\\n\\t\"\n"); - fprintf(out,"\t\"ret\t$%s\\n\\t\");\n\n",nr_args); - + fputs + ( + "/* Machine generated, don't edit */\n" + "\n" + "#ifdef __cplusplus\n" + "#define EXTERN_C extern \"C\"\n" + "#else\n" + "#define EXTERN_C\n" + "#endif\n" + "\n" + "EXTERN_C static __inline__ __attribute__((regparm(2)))" + "void*ZwRosSystemServiceThunk(long n,void*a)" + "{" + "void*ret;" + "__asm__" + "(" + "\"int $0x2E\":" + "\"=a\"(ret):" + "\"a\"(n),\"d\"(a)" + ");" + "return ret;" + "}\n", + out + ); +} + +void write_syscall_stub_func(FILE* out, char* name, unsigned nr_args, + unsigned int sys_call_idx) +{ + unsigned i; + + fprintf(out, "EXTERN_C void*__stdcall %s(", name); + + if(nr_args == 0) + fputs("void", out); + else + for(i = 0; i < nr_args; ++ i) + { + if(i > 0) + fputs(",", out); + + fprintf(out, "void*a%u", i); + } + + fputs("){", out); + + if(nr_args > 1) + for(i = 1; i < nr_args; ++ i) + fprintf(out, "(void)a%u;", i); + + fprintf(out, "return ZwRosSystemServiceThunk(%u,", sys_call_idx); + + if(nr_args == 0) + fputs("0", out); + else + fputs("&a0", out); + + fputs(");}\n", out); +} + +void write_syscall_stub(FILE* out, FILE* out3, char* name, char* name2, + unsigned nr_args, unsigned int sys_call_idx) +{ + write_syscall_stub_func(out, name, nr_args, sys_call_idx); + write_syscall_stub_func(out, name2, nr_args, sys_call_idx); + /* * Now write the NTOSKRNL stub for the * current system call. ZwXXX does NOT * alias the corresponding NtXXX call. */ - fprintf(out3,"__asm__(\n"); - fprintf(out3,"\".global _%s@%s\\n\\t\"\n",name2,nr_args); - fprintf(out3,"\"_%s@%s:\\n\\t\"\n",name2,nr_args); - fprintf(out3,"\t\"pushl\t%%ebp\\n\\t\"\n"); - fprintf(out3,"\t\"movl\t%%esp, %%ebp\\n\\t\"\n"); - fprintf(out3,"\t\"mov\t$%d,%%eax\\n\\t\"\n",sys_call_idx); - fprintf(out3,"\t\"lea\t8(%%ebp),%%edx\\n\\t\"\n"); - fprintf(out3,"\t\"int\t$0x2E\\n\\t\"\n"); - fprintf(out3,"\t\"popl\t%%ebp\\n\\t\"\n"); - fprintf(out3,"\t\"ret\t$%s\\n\\t\");\n\n",nr_args); + write_syscall_stub_func(out3, name2, nr_args, sys_call_idx); } int makeSystemServiceTable(FILE *in, FILE *out) @@ -74,13 +117,13 @@ char *s; char *name; char *name2; int sys_call_idx; -char *nr_args; +char *snr_args; char *stmp; /* * Main SSDT Header */ - fprintf(out,"// Machine generated, don't edit\n"); + fprintf(out,"/* Machine generated, don't edit */\n"); fprintf(out,"\n\n"); /* @@ -114,12 +157,12 @@ char *stmp; /* Extract the ZwXXX name */ name2 = (char *)strtok(NULL," \t"); //value = strtok(NULL," \t"); - /* Extract the stack size */ - nr_args = (char *)strtok(NULL," \t"); + /* Extract the argument count */ + snr_args = (char *)strtok(NULL," \t"); /* * Remove, if present, the trailing LF. */ - if ((stmp = strchr(nr_args, '\n')) != NULL) + if ((stmp = strchr(snr_args, '\n')) != NULL) { *stmp = '\0'; } @@ -173,15 +216,8 @@ char *stmp; /* Extract the ZwXXX name */ name2 = (char *)strtok(NULL," \t"); //value = strtok(NULL," \t"); - /* Extract the stack size */ - nr_args = (char *)strtok(NULL," \t"); - /* - * Remove, if present, the trailing LF. - */ - if ((stmp = strchr(nr_args, '\n')) != NULL) - { - *stmp = '\0'; - } + /* Extract the argument count */ + snr_args = (char *)strtok(NULL," \t"); #ifdef VERBOSE printf("%3d \"%s\"\n",sys_call_idx,name); #endif @@ -194,7 +230,7 @@ char *stmp; * Now write the current system call's ID * in the service table along with its Parameters Size. */ - fprintf(out,"\t\t%s",nr_args); + fprintf(out,"\t\t%lu * sizeof(void *)",strtoul(snr_args, NULL, 0)); } } /* @@ -226,20 +262,18 @@ process( char * name; /* NtXXX name */ char * name2; /* ZwXXX name */ int sys_call_idx; /* NtXXX index number in the service table */ - char * nr_args; /* stack_size / machine_word_size */ - char * stmp; + char * snr_args; /* stack_size / machine_word_size */ /* * NTDLL stubs file header */ - fprintf(out,"// Machine generated, don't edit\n"); - fprintf(out,"\n\n"); + write_stub_header(out); /* * NTOSKRNL Zw functions stubs header */ - fprintf(out3,"// Machine generated, don't edit\n"); - fprintf(out3,"\n\n"); + write_stub_header(out3); + /* * Scan the database. DB is a text file; each line * is a record, which contains data for one system @@ -274,20 +308,16 @@ process( s = & line[0]; if ((*s) != '#' && (*s) != '\0') { + unsigned nr_args; + /* Extract the NtXXX name */ name = (char *)strtok(s," \t"); /* Extract the ZwXXX name */ name2 = (char *)strtok(NULL," \t"); //value = strtok(NULL," \t"); - /* Extract the stack size */ - nr_args = (char *)strtok(NULL," \t"); - /* - * Remove, if present, the trailing LF. - */ - if ((stmp = strchr(nr_args, '\n')) != NULL) - { - *stmp = '\0'; - } + /* Extract the argument count */ + snr_args = (char *)strtok(NULL," \t"); + nr_args = strtoul(snr_args, NULL, 0); #ifdef VERBOSE printf("%3d \"%s\"\n",sys_call_idx,name); #endif diff --git a/reactos/iface/native/sysfuncs.lst b/reactos/iface/native/sysfuncs.lst index 52e82a37661..cde4c07bab8 100644 --- a/reactos/iface/native/sysfuncs.lst +++ b/reactos/iface/native/sysfuncs.lst @@ -1,213 +1,213 @@ -NtAcceptConnectPort ZwAcceptConnectPort 24 -NtAccessCheck ZwAccessCheck 32 -NtAccessCheckAndAuditAlarm ZwAccessCheckAndAuditAlarm 44 -NtAddAtom ZwAddAtom 8 -NtAdjustGroupsToken ZwAdjustGroupsToken 24 -NtAdjustPrivilegesToken ZwAdjustPrivilegesToken 24 -NtAlertResumeThread ZwAlertResumeThread 8 -NtAlertThread ZwAlertThread 4 -NtAllocateLocallyUniqueId ZwAllocateLocallyUniqueId 4 -NtAllocateUuids ZwAllocateUuids 12 -NtAllocateVirtualMemory ZwAllocateVirtualMemory 24 -NtCallbackReturn ZwCallbackReturn 12 -NtCancelIoFile ZwCancelIoFile 8 -NtCancelTimer ZwCancelTimer 8 -NtClearEvent ZwClearEvent 4 -NtClose ZwClose 4 -NtCloseObjectAuditAlarm ZwCloseObjectAuditAlarm 12 -NtCompleteConnectPort ZwCompleteConnectPort 4 -NtConnectPort ZwConnectPort 32 -NtContinue ZwContinue 8 -NtCreateDirectoryObject ZwCreateDirectoryObject 12 -NtCreateEvent ZwCreateEvent 20 -NtCreateEventPair ZwCreateEventPair 12 -NtCreateFile ZwCreateFile 44 -NtCreateIoCompletion ZwCreateIoCompletion 16 -NtCreateKey ZwCreateKey 28 -NtCreateMailslotFile ZwCreateMailslotFile 32 -NtCreateMutant ZwCreateMutant 16 -NtCreateNamedPipeFile ZwCreateNamedPipeFile 56 -NtCreatePagingFile ZwCreatePagingFile 16 -NtCreatePort ZwCreatePort 20 -NtCreateProcess ZwCreateProcess 32 -NtCreateProfile ZwCreateProfile 36 -NtCreateSection ZwCreateSection 28 -NtCreateSemaphore ZwCreateSemaphore 20 -NtCreateSymbolicLinkObject ZwCreateSymbolicLinkObject 16 -NtCreateThread ZwCreateThread 32 -NtCreateTimer ZwCreateTimer 16 -NtCreateToken ZwCreateToken 52 -NtCreateWaitablePort ZwCreateWaitablePort 20 -NtDelayExecution ZwDelayExecution 8 -NtDeleteAtom ZwDeleteAtom 4 -NtDeleteFile ZwDeleteFile 4 -NtDeleteKey ZwDeleteKey 4 -NtDeleteObjectAuditAlarm ZwDeleteObjectAuditAlarm 12 -NtDeleteValueKey ZwDeleteValueKey 8 -NtDeviceIoControlFile ZwDeviceIoControlFile 40 -NtDisplayString ZwDisplayString 4 -NtDuplicateObject ZwDuplicateObject 28 -NtDuplicateToken ZwDuplicateToken 24 -NtEnumerateKey ZwEnumerateKey 24 -NtEnumerateValueKey ZwEnumerateValueKey 24 -NtExtendSection ZwExtendSection 8 -NtFindAtom ZwFindAtom 8 -NtFlushBuffersFile ZwFlushBuffersFile 8 -NtFlushInstructionCache ZwFlushInstructionCache 12 -NtFlushKey ZwFlushKey 4 -NtFlushVirtualMemory ZwFlushVirtualMemory 16 -NtFlushWriteBuffer ZwFlushWriteBuffer 0 -NtFreeVirtualMemory ZwFreeVirtualMemory 16 -NtFsControlFile ZwFsControlFile 40 -NtGetContextThread ZwGetContextThread 8 -NtGetPlugPlayEvent ZwGetPlugPlayEvent 16 -NtGetTickCount ZwGetTickCount 4 -NtImpersonateClientOfPort ZwImpersonateClientOfPort 8 -NtImpersonateThread ZwImpersonateThread 12 -NtInitializeRegistry ZwInitializeRegistry 4 -NtListenPort ZwListenPort 8 -NtLoadDriver ZwLoadDriver 4 -NtLoadKey ZwLoadKey 8 -NtLoadKey2 ZwLoadKey2 12 -NtLockFile ZwLockFile 40 -NtLockVirtualMemory ZwLockVirtualMemory 16 -NtMakeTemporaryObject ZwMakeTemporaryObject 4 -NtMapViewOfSection ZwMapViewOfSection 40 -NtNotifyChangeDirectoryFile ZwNotifyChangeDirectoryFile 36 -NtNotifyChangeKey ZwNotifyChangeKey 40 -NtOpenDirectoryObject ZwOpenDirectoryObject 12 -NtOpenEvent ZwOpenEvent 12 -NtOpenEventPair ZwOpenEventPair 12 -NtOpenFile ZwOpenFile 24 -NtOpenIoCompletion ZwOpenIoCompletion 12 -NtOpenKey ZwOpenKey 12 -NtOpenMutant ZwOpenMutant 12 -NtOpenObjectAuditAlarm ZwOpenObjectAuditAlarm 48 -NtOpenProcess ZwOpenProcess 16 -NtOpenProcessToken ZwOpenProcessToken 12 -NtOpenSection ZwOpenSection 12 -NtOpenSemaphore ZwOpenSemaphore 12 -NtOpenSymbolicLinkObject ZwOpenSymbolicLinkObject 12 -NtOpenThread ZwOpenThread 16 -NtOpenThreadToken ZwOpenThreadToken 16 -NtOpenTimer ZwOpenTimer 12 -NtPlugPlayControl ZwPlugPlayControl 16 -NtPrivilegeCheck ZwPrivilegeCheck 12 -NtPrivilegedServiceAuditAlarm ZwPrivilegedServiceAuditAlarm 20 -NtPrivilegeObjectAuditAlarm ZwPrivilegeObjectAuditAlarm 24 -NtProtectVirtualMemory ZwProtectVirtualMemory 20 -NtPulseEvent ZwPulseEvent 8 -NtQueryInformationAtom ZwQueryInformationAtom 20 -NtQueryAttributesFile ZwQueryAttributesFile 8 -NtQueryDefaultLocale ZwQueryDefaultLocale 8 -NtQueryDirectoryFile ZwQueryDirectoryFile 44 -NtQueryDirectoryObject ZwQueryDirectoryObject 28 -NtQueryEaFile ZwQueryEaFile 36 -NtQueryEvent ZwQueryEvent 20 -NtQueryFullAttributesFile ZwQueryFullAttributesFile 8 -NtQueryInformationFile ZwQueryInformationFile 20 -NtQueryInformationPort ZwQueryInformationPort 20 -NtQueryInformationProcess ZwQueryInformationProcess 20 -NtQueryInformationThread ZwQueryInformationThread 20 -NtQueryInformationToken ZwQueryInformationToken 20 -NtQueryIntervalProfile ZwQueryIntervalProfile 8 -NtQueryIoCompletion ZwQueryIoCompletion 20 -NtQueryKey ZwQueryKey 20 -NtQueryMultipleValueKey ZwQueryMultipleValueKey 24 -NtQueryMutant ZwQueryMutant 20 -NtQueryObject ZwQueryObject 20 -NtQueryOleDirectoryFile ZwQueryOleDirectoryFile 44 -NtQueryPerformanceCounter ZwQueryPerformanceCounter 8 -NtQuerySection ZwQuerySection 20 -NtQuerySecurityObject ZwQuerySecurityObject 20 -NtQuerySemaphore ZwQuerySemaphore 20 -NtQuerySymbolicLinkObject ZwQuerySymbolicLinkObject 12 -NtQuerySystemEnvironmentValue ZwQuerySystemEnvironmentValue 16 -NtQuerySystemInformation ZwQuerySystemInformation 16 -NtQuerySystemTime ZwQuerySystemTime 4 -NtQueryTimer ZwQueryTimer 20 -NtQueryTimerResolution ZwQueryTimerResolution 12 -NtQueryValueKey ZwQueryValueKey 24 -NtQueryVirtualMemory ZwQueryVirtualMemory 24 -NtQueryVolumeInformationFile ZwQueryVolumeInformationFile 20 -NtQueueApcThread ZwQueueApcThread 20 -NtRaiseException ZwRaiseException 12 -NtRaiseHardError ZwRaiseHardError 24 -NtReadFile ZwReadFile 36 -NtReadFileScatter ZwReadFileScatter 36 -NtReadRequestData ZwReadRequestData 24 -NtReadVirtualMemory ZwReadVirtualMemory 20 -NtRegisterThreadTerminatePort ZwRegisterThreadTerminatePort 4 -NtReleaseMutant ZwReleaseMutant 8 -NtReleaseSemaphore ZwReleaseSemaphore 12 -NtRemoveIoCompletion ZwRemoveIoCompletion 20 -NtReplaceKey ZwReplaceKey 12 -NtReplyPort ZwReplyPort 8 -NtReplyWaitReceivePort ZwReplyWaitReceivePort 16 -NtReplyWaitReplyPort ZwReplyWaitReplyPort 8 -NtRequestPort ZwRequestPort 8 -NtRequestWaitReplyPort ZwRequestWaitReplyPort 12 -NtResetEvent ZwResetEvent 8 -NtRestoreKey ZwRestoreKey 12 -NtResumeThread ZwResumeThread 8 -NtSaveKey ZwSaveKey 8 -NtSetIoCompletion ZwSetIoCompletion 20 -NtSetContextThread ZwSetContextThread 8 -NtSetDefaultHardErrorPort ZwSetDefaultHardErrorPort 4 -NtSetDefaultLocale ZwSetDefaultLocale 8 -NtSetEaFile ZwSetEaFile 16 -NtSetEvent ZwSetEvent 8 -NtSetHighEventPair ZwSetHighEventPair 4 -NtSetHighWaitLowEventPair ZwSetHighWaitLowEventPair 4 -NtSetHighWaitLowThread ZwSetHighWaitLowThread 0 -NtSetInformationFile ZwSetInformationFile 20 -NtSetInformationKey ZwSetInformationKey 16 -NtSetInformationObject ZwSetInformationObject 16 -NtSetInformationProcess ZwSetInformationProcess 16 -NtSetInformationThread ZwSetInformationThread 16 -NtSetInformationToken ZwSetInformationToken 16 -NtSetIntervalProfile ZwSetIntervalProfile 8 -NtSetLdtEntries ZwSetLdtEntries 24 -NtSetLowEventPair ZwSetLowEventPair 4 -NtSetLowWaitHighEventPair ZwSetLowWaitHighEventPair 4 -NtSetLowWaitHighThread ZwSetLowWaitHighThread 0 -NtSetSecurityObject ZwSetSecurityObject 12 -NtSetSystemEnvironmentValue ZwSetSystemEnvironmentValue 8 -NtSetSystemInformation ZwSetSystemInformation 12 -NtSetSystemPowerState ZwSetSystemPowerState 12 -NtSetSystemTime ZwSetSystemTime 8 -NtSetTimer ZwSetTimer 28 -NtSetTimerResolution ZwSetTimerResolution 12 -NtSetValueKey ZwSetValueKey 24 -NtSetVolumeInformationFile ZwSetVolumeInformationFile 20 -NtShutdownSystem ZwShutdownSystem 4 -NtSignalAndWaitForSingleObject ZwSignalAndWaitForSingleObject 16 -NtStartProfile ZwStartProfile 4 -NtStopProfile ZwStopProfile 4 -NtSuspendThread ZwSuspendThread 8 -NtSystemDebugControl ZwSystemDebugControl 24 -NtTerminateProcess ZwTerminateProcess 8 -NtTerminateThread ZwTerminateThread 8 -NtTestAlert ZwTestAlert 0 -NtUnloadDriver ZwUnloadDriver 4 -NtUnloadKey ZwUnloadKey 4 -NtUnlockFile ZwUnlockFile 20 -NtUnlockVirtualMemory ZwUnlockVirtualMemory 16 -NtUnmapViewOfSection ZwUnmapViewOfSection 8 -NtVdmControl ZwVdmControl 8 -NtWaitForMultipleObjects ZwWaitForMultipleObjects 20 -NtWaitForSingleObject ZwWaitForSingleObject 12 -NtWaitHighEventPair ZwWaitHighEventPair 4 -NtWaitLowEventPair ZwWaitLowEventPair 4 -NtWriteFile ZwWriteFile 36 -NtWriteFileGather ZwWriteFileGather 36 -NtWriteRequestData ZwWriteRequestData 24 -NtWriteVirtualMemory ZwWriteVirtualMemory 20 -NtW32Call ZwW32Call 20 -NtCreateChannel ZwCreateChannel 8 -NtListenChannel ZwListenChannel 8 -NtOpenChannel ZwOpenChannel 8 -NtReplyWaitSendChannel ZwReplyWaitSendChannel 12 -NtSendWaitReplyChannel ZwSendWaitReplyChannel 16 -NtSetContextChannel ZwSetContextChannel 4 -NtYieldExecution ZwYieldExecution 0 +NtAcceptConnectPort ZwAcceptConnectPort 6 +NtAccessCheck ZwAccessCheck 8 +NtAccessCheckAndAuditAlarm ZwAccessCheckAndAuditAlarm 11 +NtAddAtom ZwAddAtom 2 +NtAdjustGroupsToken ZwAdjustGroupsToken 6 +NtAdjustPrivilegesToken ZwAdjustPrivilegesToken 6 +NtAlertResumeThread ZwAlertResumeThread 2 +NtAlertThread ZwAlertThread 1 +NtAllocateLocallyUniqueId ZwAllocateLocallyUniqueId 1 +NtAllocateUuids ZwAllocateUuids 3 +NtAllocateVirtualMemory ZwAllocateVirtualMemory 6 +NtCallbackReturn ZwCallbackReturn 3 +NtCancelIoFile ZwCancelIoFile 2 +NtCancelTimer ZwCancelTimer 2 +NtClearEvent ZwClearEvent 1 +NtClose ZwClose 1 +NtCloseObjectAuditAlarm ZwCloseObjectAuditAlarm 3 +NtCompleteConnectPort ZwCompleteConnectPort 1 +NtConnectPort ZwConnectPort 8 +NtContinue ZwContinue 2 +NtCreateDirectoryObject ZwCreateDirectoryObject 3 +NtCreateEvent ZwCreateEvent 5 +NtCreateEventPair ZwCreateEventPair 3 +NtCreateFile ZwCreateFile 11 +NtCreateIoCompletion ZwCreateIoCompletion 4 +NtCreateKey ZwCreateKey 7 +NtCreateMailslotFile ZwCreateMailslotFile 8 +NtCreateMutant ZwCreateMutant 4 +NtCreateNamedPipeFile ZwCreateNamedPipeFile 14 +NtCreatePagingFile ZwCreatePagingFile 4 +NtCreatePort ZwCreatePort 5 +NtCreateProcess ZwCreateProcess 8 +NtCreateProfile ZwCreateProfile 9 +NtCreateSection ZwCreateSection 7 +NtCreateSemaphore ZwCreateSemaphore 5 +NtCreateSymbolicLinkObject ZwCreateSymbolicLinkObject 4 +NtCreateThread ZwCreateThread 8 +NtCreateTimer ZwCreateTimer 4 +NtCreateToken ZwCreateToken 13 +NtCreateWaitablePort ZwCreateWaitablePort 5 +NtDelayExecution ZwDelayExecution 2 +NtDeleteAtom ZwDeleteAtom 1 +NtDeleteFile ZwDeleteFile 1 +NtDeleteKey ZwDeleteKey 1 +NtDeleteObjectAuditAlarm ZwDeleteObjectAuditAlarm 3 +NtDeleteValueKey ZwDeleteValueKey 2 +NtDeviceIoControlFile ZwDeviceIoControlFile 10 +NtDisplayString ZwDisplayString 1 +NtDuplicateObject ZwDuplicateObject 7 +NtDuplicateToken ZwDuplicateToken 6 +NtEnumerateKey ZwEnumerateKey 6 +NtEnumerateValueKey ZwEnumerateValueKey 6 +NtExtendSection ZwExtendSection 2 +NtFindAtom ZwFindAtom 2 +NtFlushBuffersFile ZwFlushBuffersFile 2 +NtFlushInstructionCache ZwFlushInstructionCache 3 +NtFlushKey ZwFlushKey 1 +NtFlushVirtualMemory ZwFlushVirtualMemory 4 +NtFlushWriteBuffer ZwFlushWriteBuffer 0 +NtFreeVirtualMemory ZwFreeVirtualMemory 4 +NtFsControlFile ZwFsControlFile 10 +NtGetContextThread ZwGetContextThread 2 +NtGetPlugPlayEvent ZwGetPlugPlayEvent 4 +NtGetTickCount ZwGetTickCount 1 +NtImpersonateClientOfPort ZwImpersonateClientOfPort 2 +NtImpersonateThread ZwImpersonateThread 3 +NtInitializeRegistry ZwInitializeRegistry 1 +NtListenPort ZwListenPort 2 +NtLoadDriver ZwLoadDriver 1 +NtLoadKey ZwLoadKey 2 +NtLoadKey2 ZwLoadKey2 3 +NtLockFile ZwLockFile 10 +NtLockVirtualMemory ZwLockVirtualMemory 4 +NtMakeTemporaryObject ZwMakeTemporaryObject 1 +NtMapViewOfSection ZwMapViewOfSection 10 +NtNotifyChangeDirectoryFile ZwNotifyChangeDirectoryFile 9 +NtNotifyChangeKey ZwNotifyChangeKey 10 +NtOpenDirectoryObject ZwOpenDirectoryObject 3 +NtOpenEvent ZwOpenEvent 3 +NtOpenEventPair ZwOpenEventPair 3 +NtOpenFile ZwOpenFile 6 +NtOpenIoCompletion ZwOpenIoCompletion 3 +NtOpenKey ZwOpenKey 3 +NtOpenMutant ZwOpenMutant 3 +NtOpenObjectAuditAlarm ZwOpenObjectAuditAlarm 12 +NtOpenProcess ZwOpenProcess 4 +NtOpenProcessToken ZwOpenProcessToken 3 +NtOpenSection ZwOpenSection 3 +NtOpenSemaphore ZwOpenSemaphore 3 +NtOpenSymbolicLinkObject ZwOpenSymbolicLinkObject 3 +NtOpenThread ZwOpenThread 4 +NtOpenThreadToken ZwOpenThreadToken 4 +NtOpenTimer ZwOpenTimer 3 +NtPlugPlayControl ZwPlugPlayControl 4 +NtPrivilegeCheck ZwPrivilegeCheck 3 +NtPrivilegedServiceAuditAlarm ZwPrivilegedServiceAuditAlarm 5 +NtPrivilegeObjectAuditAlarm ZwPrivilegeObjectAuditAlarm 6 +NtProtectVirtualMemory ZwProtectVirtualMemory 5 +NtPulseEvent ZwPulseEvent 2 +NtQueryInformationAtom ZwQueryInformationAtom 5 +NtQueryAttributesFile ZwQueryAttributesFile 2 +NtQueryDefaultLocale ZwQueryDefaultLocale 2 +NtQueryDirectoryFile ZwQueryDirectoryFile 11 +NtQueryDirectoryObject ZwQueryDirectoryObject 7 +NtQueryEaFile ZwQueryEaFile 9 +NtQueryEvent ZwQueryEvent 5 +NtQueryFullAttributesFile ZwQueryFullAttributesFile 2 +NtQueryInformationFile ZwQueryInformationFile 5 +NtQueryInformationPort ZwQueryInformationPort 5 +NtQueryInformationProcess ZwQueryInformationProcess 5 +NtQueryInformationThread ZwQueryInformationThread 5 +NtQueryInformationToken ZwQueryInformationToken 5 +NtQueryIntervalProfile ZwQueryIntervalProfile 2 +NtQueryIoCompletion ZwQueryIoCompletion 5 +NtQueryKey ZwQueryKey 5 +NtQueryMultipleValueKey ZwQueryMultipleValueKey 6 +NtQueryMutant ZwQueryMutant 5 +NtQueryObject ZwQueryObject 5 +NtQueryOleDirectoryFile ZwQueryOleDirectoryFile 11 +NtQueryPerformanceCounter ZwQueryPerformanceCounter 2 +NtQuerySection ZwQuerySection 5 +NtQuerySecurityObject ZwQuerySecurityObject 5 +NtQuerySemaphore ZwQuerySemaphore 5 +NtQuerySymbolicLinkObject ZwQuerySymbolicLinkObject 3 +NtQuerySystemEnvironmentValue ZwQuerySystemEnvironmentValue 4 +NtQuerySystemInformation ZwQuerySystemInformation 4 +NtQuerySystemTime ZwQuerySystemTime 1 +NtQueryTimer ZwQueryTimer 5 +NtQueryTimerResolution ZwQueryTimerResolution 3 +NtQueryValueKey ZwQueryValueKey 6 +NtQueryVirtualMemory ZwQueryVirtualMemory 6 +NtQueryVolumeInformationFile ZwQueryVolumeInformationFile 5 +NtQueueApcThread ZwQueueApcThread 5 +NtRaiseException ZwRaiseException 3 +NtRaiseHardError ZwRaiseHardError 6 +NtReadFile ZwReadFile 9 +NtReadFileScatter ZwReadFileScatter 9 +NtReadRequestData ZwReadRequestData 6 +NtReadVirtualMemory ZwReadVirtualMemory 5 +NtRegisterThreadTerminatePort ZwRegisterThreadTerminatePort 1 +NtReleaseMutant ZwReleaseMutant 2 +NtReleaseSemaphore ZwReleaseSemaphore 3 +NtRemoveIoCompletion ZwRemoveIoCompletion 5 +NtReplaceKey ZwReplaceKey 3 +NtReplyPort ZwReplyPort 2 +NtReplyWaitReceivePort ZwReplyWaitReceivePort 4 +NtReplyWaitReplyPort ZwReplyWaitReplyPort 2 +NtRequestPort ZwRequestPort 2 +NtRequestWaitReplyPort ZwRequestWaitReplyPort 3 +NtResetEvent ZwResetEvent 2 +NtRestoreKey ZwRestoreKey 3 +NtResumeThread ZwResumeThread 2 +NtSaveKey ZwSaveKey 2 +NtSetIoCompletion ZwSetIoCompletion 5 +NtSetContextThread ZwSetContextThread 2 +NtSetDefaultHardErrorPort ZwSetDefaultHardErrorPort 1 +NtSetDefaultLocale ZwSetDefaultLocale 2 +NtSetEaFile ZwSetEaFile 4 +NtSetEvent ZwSetEvent 2 +NtSetHighEventPair ZwSetHighEventPair 1 +NtSetHighWaitLowEventPair ZwSetHighWaitLowEventPair 1 +NtSetHighWaitLowThread ZwSetHighWaitLowThread 0 +NtSetInformationFile ZwSetInformationFile 5 +NtSetInformationKey ZwSetInformationKey 4 +NtSetInformationObject ZwSetInformationObject 4 +NtSetInformationProcess ZwSetInformationProcess 4 +NtSetInformationThread ZwSetInformationThread 4 +NtSetInformationToken ZwSetInformationToken 4 +NtSetIntervalProfile ZwSetIntervalProfile 2 +NtSetLdtEntries ZwSetLdtEntries 6 +NtSetLowEventPair ZwSetLowEventPair 1 +NtSetLowWaitHighEventPair ZwSetLowWaitHighEventPair 1 +NtSetLowWaitHighThread ZwSetLowWaitHighThread 0 +NtSetSecurityObject ZwSetSecurityObject 3 +NtSetSystemEnvironmentValue ZwSetSystemEnvironmentValue 2 +NtSetSystemInformation ZwSetSystemInformation 3 +NtSetSystemPowerState ZwSetSystemPowerState 3 +NtSetSystemTime ZwSetSystemTime 2 +NtSetTimer ZwSetTimer 7 +NtSetTimerResolution ZwSetTimerResolution 3 +NtSetValueKey ZwSetValueKey 6 +NtSetVolumeInformationFile ZwSetVolumeInformationFile 5 +NtShutdownSystem ZwShutdownSystem 1 +NtSignalAndWaitForSingleObject ZwSignalAndWaitForSingleObject 4 +NtStartProfile ZwStartProfile 1 +NtStopProfile ZwStopProfile 1 +NtSuspendThread ZwSuspendThread 2 +NtSystemDebugControl ZwSystemDebugControl 6 +NtTerminateProcess ZwTerminateProcess 2 +NtTerminateThread ZwTerminateThread 2 +NtTestAlert ZwTestAlert 0 +NtUnloadDriver ZwUnloadDriver 1 +NtUnloadKey ZwUnloadKey 1 +NtUnlockFile ZwUnlockFile 5 +NtUnlockVirtualMemory ZwUnlockVirtualMemory 4 +NtUnmapViewOfSection ZwUnmapViewOfSection 2 +NtVdmControl ZwVdmControl 2 +NtWaitForMultipleObjects ZwWaitForMultipleObjects 5 +NtWaitForSingleObject ZwWaitForSingleObject 3 +NtWaitHighEventPair ZwWaitHighEventPair 1 +NtWaitLowEventPair ZwWaitLowEventPair 1 +NtWriteFile ZwWriteFile 9 +NtWriteFileGather ZwWriteFileGather 9 +NtWriteRequestData ZwWriteRequestData 6 +NtWriteVirtualMemory ZwWriteVirtualMemory 5 +NtW32Call ZwW32Call 5 +NtCreateChannel ZwCreateChannel 2 +NtListenChannel ZwListenChannel 2 +NtOpenChannel ZwOpenChannel 2 +NtReplyWaitSendChannel ZwReplyWaitSendChannel 3 +NtSendWaitReplyChannel ZwSendWaitReplyChannel 4 +NtSetContextChannel ZwSetContextChannel 1 +NtYieldExecution ZwYieldExecution 0 From b9a55f9ce05fbdcff91256705fc6110483927597 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Tue, 13 Apr 2004 00:06:50 +0000 Subject: [PATCH 0869/1463] fixed memory leak svn path=/trunk/; revision=9120 --- reactos/lib/user32/windows/bitmap.c | 47 +++++++++++++++-------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/reactos/lib/user32/windows/bitmap.c b/reactos/lib/user32/windows/bitmap.c index 02de153fe0c..4e6338a1cd0 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.28 2004/04/09 20:03:14 navaraf Exp $ +/* $Id: bitmap.c,v 1.29 2004/04/13 00:06:50 weiden Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/input.c @@ -89,7 +89,7 @@ LoadCursorImage(HINSTANCE hinst, LPCWSTR lpszName, UINT fuLoad) HDC hScreenDc; HANDLE hIcon; ULONG HeaderSize; - ULONG ColourCount; + ULONG ColorCount; PVOID Data; CURSORICONDIRENTRY* dirEntry; ICONIMAGE* SafeIconImage; @@ -234,17 +234,17 @@ LoadCursorImage(HINSTANCE hinst, LPCWSTR lpszName, UINT fuLoad) if (SafeIconImage->icHeader.biSize == sizeof(BITMAPCOREHEADER)) { BITMAPCOREHEADER* Core = (BITMAPCOREHEADER*)SafeIconImage; - ColourCount = (Core->bcBitCount <= 8) ? (1 << Core->bcBitCount) : 0; - HeaderSize = sizeof(BITMAPCOREHEADER) + ColourCount * sizeof(RGBTRIPLE); + ColorCount = (Core->bcBitCount <= 8) ? (1 << Core->bcBitCount) : 0; + HeaderSize = sizeof(BITMAPCOREHEADER) + ColorCount * sizeof(RGBTRIPLE); } else { - ColourCount = SafeIconImage->icHeader.biClrUsed; - if (ColourCount == 0 && SafeIconImage->icHeader.biBitCount <= 8) + ColorCount = SafeIconImage->icHeader.biClrUsed; + if (ColorCount == 0 && SafeIconImage->icHeader.biBitCount <= 8) { - ColourCount = 1 << SafeIconImage->icHeader.biBitCount; + ColorCount = 1 << SafeIconImage->icHeader.biBitCount; } - HeaderSize = sizeof(BITMAPINFOHEADER) + ColourCount * sizeof(RGBQUAD); + HeaderSize = sizeof(BITMAPINFOHEADER) + ColorCount * sizeof(RGBQUAD); } //make data point to the start of the XOR image data @@ -269,7 +269,7 @@ LoadIconImage(HINSTANCE hinst, LPCWSTR lpszName, INT width, INT height, UINT fuL HDC hScreenDc; HANDLE hIcon; ULONG HeaderSize; - ULONG ColourCount; + ULONG ColorCount; PVOID Data; CURSORICONDIRENTRY* dirEntry; ICONIMAGE* SafeIconImage; @@ -407,17 +407,17 @@ LoadIconImage(HINSTANCE hinst, LPCWSTR lpszName, INT width, INT height, UINT fuL if (SafeIconImage->icHeader.biSize == sizeof(BITMAPCOREHEADER)) { BITMAPCOREHEADER* Core = (BITMAPCOREHEADER*)SafeIconImage; - ColourCount = (Core->bcBitCount <= 8) ? (1 << Core->bcBitCount) : 0; - HeaderSize = sizeof(BITMAPCOREHEADER) + ColourCount * sizeof(RGBTRIPLE); + ColorCount = (Core->bcBitCount <= 8) ? (1 << Core->bcBitCount) : 0; + HeaderSize = sizeof(BITMAPCOREHEADER) + ColorCount * sizeof(RGBTRIPLE); } else { - ColourCount = SafeIconImage->icHeader.biClrUsed; - if (ColourCount == 0 && SafeIconImage->icHeader.biBitCount <= 8) + ColorCount = SafeIconImage->icHeader.biClrUsed; + if (ColorCount == 0 && SafeIconImage->icHeader.biBitCount <= 8) { - ColourCount = 1 << SafeIconImage->icHeader.biBitCount; + ColorCount = 1 << SafeIconImage->icHeader.biBitCount; } - HeaderSize = sizeof(BITMAPINFOHEADER) + ColourCount * sizeof(RGBQUAD); + HeaderSize = sizeof(BITMAPINFOHEADER) + ColorCount * sizeof(RGBQUAD); } //make data point to the start of the XOR image data @@ -453,7 +453,7 @@ LoadBitmapImage(HINSTANCE hInstance, LPCWSTR lpszName, UINT fuLoad) HDC hScreenDc; HANDLE hBitmap; ULONG HeaderSize; - ULONG ColourCount; + ULONG ColorCount; PVOID Data; if (!(fuLoad & LR_LOADFROMFILE)) @@ -521,17 +521,17 @@ LoadBitmapImage(HINSTANCE hInstance, LPCWSTR lpszName, UINT fuLoad) if (BitmapInfo->bmiHeader.biSize == sizeof(BITMAPCOREHEADER)) { BITMAPCOREHEADER* Core = (BITMAPCOREHEADER*)BitmapInfo; - ColourCount = (Core->bcBitCount <= 8) ? (1 << Core->bcBitCount) : 0; - HeaderSize = sizeof(BITMAPCOREHEADER) + ColourCount * sizeof(RGBTRIPLE); + ColorCount = (Core->bcBitCount <= 8) ? (1 << Core->bcBitCount) : 0; + HeaderSize = sizeof(BITMAPCOREHEADER) + ColorCount * sizeof(RGBTRIPLE); } else { - ColourCount = BitmapInfo->bmiHeader.biClrUsed; - if (ColourCount == 0 && BitmapInfo->bmiHeader.biBitCount <= 8) + ColorCount = BitmapInfo->bmiHeader.biClrUsed; + if (ColorCount == 0 && BitmapInfo->bmiHeader.biBitCount <= 8) { - ColourCount = 1 << BitmapInfo->bmiHeader.biBitCount; + ColorCount = 1 << BitmapInfo->bmiHeader.biBitCount; } - HeaderSize = sizeof(BITMAPINFOHEADER) + ColourCount * sizeof(RGBQUAD); + HeaderSize = sizeof(BITMAPINFOHEADER) + ColorCount * sizeof(RGBQUAD); } Data = (PVOID)BitmapInfo + HeaderSize; @@ -546,11 +546,12 @@ LoadBitmapImage(HINSTANCE hInstance, LPCWSTR lpszName, UINT fuLoad) } memcpy(PrivateInfo, BitmapInfo, HeaderSize); - /* FIXME: Handle colour conversion and transparency. */ + /* FIXME: Handle color conversion and transparency. */ hScreenDc = CreateDCW(L"DISPLAY", NULL, NULL, NULL); if (hScreenDc == NULL) { + RtlFreeHeap(GetProcessHeap(), 0, PrivateInfo); if (fuLoad & LR_LOADFROMFILE) { UnmapViewOfFile(BitmapInfo); From 83af3eae1dbb723e9922f38af257982ca6bc7af6 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Tue, 13 Apr 2004 13:50:31 +0000 Subject: [PATCH 0870/1463] post focus messages to different threads svn path=/trunk/; revision=9121 --- reactos/subsys/win32k/include/msgqueue.h | 13 ++++-- reactos/subsys/win32k/ntuser/focus.c | 20 ++++----- reactos/subsys/win32k/ntuser/message.c | 53 +++++++++++++++++++++--- reactos/subsys/win32k/ntuser/msgqueue.c | 6 +-- 4 files changed, 69 insertions(+), 23 deletions(-) diff --git a/reactos/subsys/win32k/include/msgqueue.h b/reactos/subsys/win32k/include/msgqueue.h index ea7a032bd47..9417b420fa0 100644 --- a/reactos/subsys/win32k/include/msgqueue.h +++ b/reactos/subsys/win32k/include/msgqueue.h @@ -144,12 +144,17 @@ VOID FASTCALL MsqIncPaintCountQueue(PUSER_MESSAGE_QUEUE Queue); VOID FASTCALL MsqDecPaintCountQueue(PUSER_MESSAGE_QUEUE Queue); -LRESULT STDCALL +LRESULT FASTCALL IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); -LRESULT STDCALL +LRESULT FASTCALL +IntPostOrSendMessage(HWND hWnd, + UINT Msg, + WPARAM wParam, + LPARAM lParam); +LRESULT FASTCALL IntSendMessageTimeout(HWND hWnd, UINT Msg, WPARAM wParam, @@ -162,9 +167,9 @@ IntDispatchMessage(MSG* Msg); BOOL FASTCALL IntTranslateKbdMessage(LPMSG lpMsg, HKL dwhkl); -VOID STDCALL +VOID FASTCALL MsqPostKeyboardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam); -VOID STDCALL +VOID FASTCALL MsqPostHotKeyMessage(PVOID Thread, HWND hWnd, WPARAM wParam, LPARAM lParam); VOID FASTCALL MsqInsertSystemMessage(MSG* Msg, BOOL RemMouseMoveMsg); diff --git a/reactos/subsys/win32k/ntuser/focus.c b/reactos/subsys/win32k/ntuser/focus.c index 59fcfb7bbc9..5fad4ae574c 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.19 2004/02/24 13:27:03 weiden Exp $ + * $Id: focus.c,v 1.20 2004/04/13 13:50:31 weiden Exp $ */ #include @@ -58,8 +58,8 @@ IntSendDeactivateMessages(HWND hWndPrev, HWND hWnd) { if (hWndPrev) { - IntSendMessage(hWndPrev, WM_NCACTIVATE, FALSE, 0); - IntSendMessage(hWndPrev, WM_ACTIVATE, + IntPostOrSendMessage(hWndPrev, WM_NCACTIVATE, FALSE, 0); + IntPostOrSendMessage(hWndPrev, WM_ACTIVATE, MAKEWPARAM(WA_INACTIVE, NtUserGetWindowLong(hWndPrev, GWL_STYLE, FALSE) & WS_MINIMIZE), (LPARAM)hWnd); } @@ -71,9 +71,9 @@ IntSendActivateMessages(HWND hWndPrev, HWND hWnd, BOOL MouseActivate) if (hWnd) { /* Send palette messages */ - if (IntSendMessage(hWnd, WM_QUERYNEWPALETTE, 0, 0)) + if (IntPostOrSendMessage(hWnd, WM_QUERYNEWPALETTE, 0, 0)) { - IntSendMessage(HWND_BROADCAST, WM_PALETTEISCHANGING, + IntPostOrSendMessage(HWND_BROADCAST, WM_PALETTEISCHANGING, (WPARAM)hWnd, 0); } @@ -83,9 +83,9 @@ IntSendActivateMessages(HWND hWndPrev, HWND hWnd, BOOL MouseActivate) /* FIXME: IntIsWindow */ - IntSendMessage(hWnd, WM_NCACTIVATE, (WPARAM)(hWnd == NtUserGetForegroundWindow()), 0); + IntPostOrSendMessage(hWnd, WM_NCACTIVATE, (WPARAM)(hWnd == NtUserGetForegroundWindow()), 0); /* FIXME: WA_CLICKACTIVE */ - IntSendMessage(hWnd, WM_ACTIVATE, + IntPostOrSendMessage(hWnd, WM_ACTIVATE, MAKEWPARAM(MouseActivate ? WA_CLICKACTIVE : WA_ACTIVE, NtUserGetWindowLong(hWnd, GWL_STYLE, FALSE) & WS_MINIMIZE), (LPARAM)hWndPrev); @@ -97,7 +97,7 @@ IntSendKillFocusMessages(HWND hWndPrev, HWND hWnd) { if (hWndPrev) { - IntSendMessage(hWndPrev, WM_KILLFOCUS, (WPARAM)hWnd, 0); + IntPostOrSendMessage(hWndPrev, WM_KILLFOCUS, (WPARAM)hWnd, 0); } } @@ -106,7 +106,7 @@ IntSendSetFocusMessages(HWND hWndPrev, HWND hWnd) { if (hWnd) { - IntSendMessage(hWnd, WM_SETFOCUS, (WPARAM)hWndPrev, 0); + IntPostOrSendMessage(hWnd, WM_SETFOCUS, (WPARAM)hWndPrev, 0); } } @@ -411,7 +411,7 @@ NtUserSetCapture(HWND hWnd) } } hWndPrev = ThreadQueue->CaptureWindow; - IntSendMessage(hWndPrev, WM_CAPTURECHANGED, 0, (LPARAM)hWnd); + IntPostOrSendMessage(hWndPrev, WM_CAPTURECHANGED, 0, (LPARAM)hWnd); IntLockMessageQueue(ThreadQueue); ThreadQueue->CaptureWindow = hWnd; IntUnLockMessageQueue(ThreadQueue); diff --git a/reactos/subsys/win32k/ntuser/message.c b/reactos/subsys/win32k/ntuser/message.c index aaa52f0605a..64ee4e69ea3 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.56 2004/04/07 21:12:40 gvg Exp $ +/* $Id: message.c,v 1.57 2004/04/13 13:50:31 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -373,7 +373,7 @@ NtUserPeekMessage(LPMSG UnsafeMsg, return Present; } -static BOOL STDCALL +static BOOL FASTCALL IntWaitMessage(HWND Wnd, UINT MsgFilterMin, UINT MsgFilterMax) @@ -651,7 +651,7 @@ MsgMemorySize(PMSGMEMORY MsgMemoryEntry, WPARAM wParam, LPARAM lParam) } } -static FASTCALL NTSTATUS +static NTSTATUS FASTCALL PackParam(LPARAM *lParamPacked, UINT Msg, WPARAM wParam, LPARAM lParam) { NCCALCSIZE_PARAMS *UnpackedParams; @@ -711,7 +711,7 @@ UnpackParam(LPARAM lParamPacked, UINT Msg, WPARAM wParam, LPARAM lParam) return STATUS_INVALID_PARAMETER; } -LRESULT STDCALL +LRESULT FASTCALL IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, @@ -725,7 +725,7 @@ IntSendMessage(HWND hWnd, return 0; } -static LRESULT STDCALL +static LRESULT FASTCALL IntSendMessageTimeoutSingle(HWND hWnd, UINT Msg, WPARAM wParam, @@ -826,7 +826,7 @@ IntSendMessageTimeoutSingle(HWND hWnd, return TRUE; } -LRESULT STDCALL +LRESULT FASTCALL IntSendMessageTimeout(HWND hWnd, UINT Msg, WPARAM wParam, @@ -924,6 +924,47 @@ CopyMsgToKernelMem(MSG *KernelModeMsg, MSG *UserModeMsg) return STATUS_SUCCESS; } +/* This function posts a message if the destination's message queue belongs to + another thread, otherwise it sends the message. It does not support broadcast + messages! */ +LRESULT FASTCALL +IntPostOrSendMessage(HWND hWnd, + UINT Msg, + WPARAM wParam, + LPARAM lParam) +{ + LRESULT Result; + PWINDOW_OBJECT Window; + + if(hWnd == HWND_BROADCAST) + { + return 0; + } + + Window = IntGetWindowObject(hWnd); + if(!Window) + { + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + return 0; + } + + if(Window->MessageQueue != PsGetWin32Thread()->MessageQueue) + { + Result = NtUserPostMessage(hWnd, Msg, wParam, lParam); + } + else + { + if(!IntSendMessageTimeoutSingle(hWnd, Msg, wParam, lParam, SMTO_NORMAL, 0, &Result)) + { + Result = 0; + } + } + + IntReleaseWindowObject(Window); + + return Result; +} + static NTSTATUS FASTCALL CopyMsgToUserMem(MSG *UserModeMsg, MSG *KernelModeMsg) { diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index 58e18c3e2ed..df0c98b72b4 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.82 2004/04/09 20:03:19 navaraf Exp $ +/* $Id: msgqueue.c,v 1.83 2004/04/13 13:50:31 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -682,7 +682,7 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, return(FALSE); } -VOID STDCALL +VOID FASTCALL MsqPostKeyboardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { PUSER_MESSAGE_QUEUE FocusMessageQueue; @@ -722,7 +722,7 @@ MsqPostKeyboardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) } } -VOID STDCALL +VOID FASTCALL MsqPostHotKeyMessage(PVOID Thread, HWND hWnd, WPARAM wParam, LPARAM lParam) { PWINDOW_OBJECT Window; From 83af90bff4a2b648f3c2813fa2cf57edfade49c1 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Tue, 13 Apr 2004 16:48:45 +0000 Subject: [PATCH 0871/1463] don't pass ansi strings to win32k!!!! svn path=/trunk/; revision=9122 --- reactos/include/funcs.h | 2 +- reactos/include/win32k/ntuser.h | 6 +- reactos/lib/user32/windows/defwnd.c | 58 +++++---- reactos/lib/user32/windows/window.c | 4 +- reactos/subsys/win32k/ntuser/window.c | 166 ++++++++++++++++---------- 5 files changed, 144 insertions(+), 92 deletions(-) diff --git a/reactos/include/funcs.h b/reactos/include/funcs.h index f650e836578..8c5acbb632f 100644 --- a/reactos/include/funcs.h +++ b/reactos/include/funcs.h @@ -4478,7 +4478,7 @@ EndTask( WINBOOL fForce ); -DWORD +int STDCALL InternalGetWindowText( HWND hWnd, diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index ad51638f620..8042f65e6ec 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -365,7 +365,7 @@ NtUserDeferWindowPos(HDWP WinPosInfo, int cy, UINT Flags); BOOL STDCALL -NtUserDefSetText(HWND WindowHandle, PANSI_STRING Text); +NtUserDefSetText(HWND WindowHandle, PUNICODE_STRING WindowText); BOOLEAN STDCALL @@ -865,12 +865,12 @@ NtUserInitTask( DWORD Unknown9, DWORD Unknown10); -DWORD +INT STDCALL NtUserInternalGetWindowText( HWND hWnd, LPWSTR lpString, - int nMaxCount); + INT nMaxCount); DWORD STDCALL diff --git a/reactos/lib/user32/windows/defwnd.c b/reactos/lib/user32/windows/defwnd.c index 03a2fcc93ac..d8cab1de28f 100644 --- a/reactos/lib/user32/windows/defwnd.c +++ b/reactos/lib/user32/windows/defwnd.c @@ -1,4 +1,4 @@ -/* $Id: defwnd.c,v 1.132 2004/04/09 20:03:14 navaraf Exp $ +/* $Id: defwnd.c,v 1.133 2004/04/13 16:48:44 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -1482,42 +1482,50 @@ DefWindowProcA(HWND hWnd, case WM_GETTEXTLENGTH: { - return InternalGetWindowText(hWnd, NULL, 0); + return (LRESULT)NtUserInternalGetWindowText(hWnd, NULL, 0); } case WM_GETTEXT: { - UNICODE_STRING UnicodeString; + LPWSTR Buffer; LPSTR AnsiBuffer = (LPSTR)lParam; - BOOL Result; + INT Length; if (wParam > 1) { *((PWSTR)lParam) = '\0'; } - UnicodeString.Length = UnicodeString.MaximumLength = - wParam * sizeof(WCHAR); - UnicodeString.Buffer = HeapAlloc(GetProcessHeap(), 0, - UnicodeString.Length); - if (!UnicodeString.Buffer) + Buffer = HeapAlloc(GetProcessHeap(), 0, wParam * sizeof(WCHAR)); + if (!Buffer) return FALSE; - Result = InternalGetWindowText(hWnd, UnicodeString.Buffer, wParam); - if (wParam > 0 && - !WideCharToMultiByte(CP_ACP, 0, UnicodeString.Buffer, -1, + Length = NtUserInternalGetWindowText(hWnd, Buffer, wParam); + if (Length > 0 && wParam > 0 && + !WideCharToMultiByte(CP_ACP, 0, Buffer, -1, AnsiBuffer, wParam, NULL, NULL)) { - AnsiBuffer[wParam - 1] = 0; + AnsiBuffer[0] = '\0'; } - HeapFree(GetProcessHeap(), 0, UnicodeString.Buffer); - return Result; + HeapFree(GetProcessHeap(), 0, Buffer); + + return (LRESULT)Length; } case WM_SETTEXT: { ANSI_STRING AnsiString; - RtlInitAnsiString(&AnsiString, (LPSTR)lParam); - NtUserDefSetText(hWnd, &AnsiString); + UNICODE_STRING UnicodeString; + + if(lParam) + { + RtlInitAnsiString(&AnsiString, (LPSTR)lParam); + RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, TRUE); + NtUserDefSetText(hWnd, &UnicodeString); + RtlFreeUnicodeString(&UnicodeString); + } + else + NtUserDefSetText(hWnd, NULL); + if ((GetWindowLongW(hWnd, GWL_STYLE) & WS_CAPTION) == WS_CAPTION) { DefWndNCPaint(hWnd, (HRGN)1); @@ -1557,29 +1565,27 @@ DefWindowProcW(HWND hWnd, case WM_GETTEXTLENGTH: { - return InternalGetWindowText(hWnd, NULL, 0); + return (LRESULT)NtUserInternalGetWindowText(hWnd, NULL, 0); } case WM_GETTEXT: { - DWORD Result; if (wParam > 1) { *((PWSTR)lParam) = '\0'; } - Result = InternalGetWindowText(hWnd, (PWSTR)lParam, wParam); - return Result; + return (LRESULT)NtUserInternalGetWindowText(hWnd, (PWSTR)lParam, wParam); } case WM_SETTEXT: { UNICODE_STRING UnicodeString; - ANSI_STRING AnsiString; - RtlInitUnicodeString(&UnicodeString, (LPWSTR)lParam); - RtlUnicodeStringToAnsiString(&AnsiString, &UnicodeString, TRUE); - NtUserDefSetText(hWnd, &AnsiString); - RtlFreeAnsiString(&AnsiString); + if(lParam) + RtlInitUnicodeString(&UnicodeString, (LPWSTR)lParam); + + NtUserDefSetText(hWnd, (lParam ? &UnicodeString : NULL)); + if ((GetWindowLongW(hWnd, GWL_STYLE) & WS_CAPTION) == WS_CAPTION) { DefWndNCPaint(hWnd, (HRGN)1); diff --git a/reactos/lib/user32/windows/window.c b/reactos/lib/user32/windows/window.c index dc830ddbbca..05c631349cc 100644 --- a/reactos/lib/user32/windows/window.c +++ b/reactos/lib/user32/windows/window.c @@ -1,4 +1,4 @@ -/* $Id: window.c,v 1.109 2004/04/10 07:37:28 navaraf Exp $ +/* $Id: window.c,v 1.110 2004/04/13 16:48:45 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -1464,7 +1464,7 @@ GetWindowContextHelpId(HWND hwnd) /* * @implemented */ -INT +int STDCALL InternalGetWindowText(HWND hWnd, LPWSTR lpString, int nMaxCount) { diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index e5daa0286da..ec3fc9e57f0 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.211 2004/04/10 07:37:28 navaraf Exp $ +/* $Id: window.c,v 1.212 2004/04/13 16:48:45 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -54,6 +54,7 @@ #include #include #include +#include #define NDEBUG #include @@ -425,6 +426,11 @@ static LRESULT IntDestroyWindow(PWINDOW_OBJECT Window, NtGdiDeleteObject(Window->WindowRegion); } + if(Window->WindowName.Buffer) + { + ExFreePool(Window->WindowName.Buffer); + } + IntReleaseWindowObject(Window); return 0; @@ -1343,14 +1349,18 @@ NtUserCreateWindowEx(DWORD dwExStyle, BOOL MenuChanged; DPRINT("NtUserCreateWindowEx(): (%d,%d-%d,%d)\n", x, y, nWidth, nHeight); - - if (! RtlCreateUnicodeString(&WindowName, - NULL == lpWindowName->Buffer ? - L"" : lpWindowName->Buffer)) + + if(lpWindowName) + { + Status = IntSafeCopyUnicodeString(&WindowName, lpWindowName); + if (!NT_SUCCESS(Status)) { - SetLastNtError(STATUS_INSUFFICIENT_RESOURCES); + SetLastNtError(Status); return((HWND)0); } + } + else + RtlInitUnicodeString(&WindowName, NULL); ParentWindowHandle = PsGetWin32Thread()->Desktop->DesktopWindow; OwnerWindowHandle = NULL; @@ -1511,8 +1521,8 @@ NtUserCreateWindowEx(DWORD dwExStyle, ExInitializeFastMutex(&WindowObject->PropListLock); ExInitializeFastMutex(&WindowObject->RelativesLock); ExInitializeFastMutex(&WindowObject->UpdateLock); - - RtlInitUnicodeString(&WindowObject->WindowName, WindowName.Buffer); + + WindowObject->WindowName = WindowName; /* Correct the window style. */ if (!(dwStyle & WS_CHILD)) @@ -3708,76 +3718,112 @@ NtUserWindowFromPoint(LONG X, LONG Y) * Undocumented function that is called from DefWindowProc to set * window text. * - * FIXME: Call this from user32.dll! - * * Status - * @unimplemented + * @implemented */ BOOL STDCALL -NtUserDefSetText(HWND WindowHandle, PANSI_STRING Text) +NtUserDefSetText(HWND WindowHandle, PUNICODE_STRING WindowText) { - PWINDOW_OBJECT WindowObject; - UNICODE_STRING NewWindowName; - BOOL Result = FALSE; - - WindowObject = IntGetWindowObject(WindowHandle); - if (!WindowObject) - { - SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + PWINDOW_OBJECT WindowObject; + UNICODE_STRING SafeText; + NTSTATUS Status; + + WindowObject = IntGetWindowObject(WindowHandle); + if(!WindowObject) + { + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + return FALSE; + } + + if(WindowText) + { + Status = IntSafeCopyUnicodeString(&SafeText, WindowText); + if(!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + IntReleaseWindowObject(WindowObject); return FALSE; - } - - if (NT_SUCCESS(RtlAnsiStringToUnicodeString(&NewWindowName, Text, TRUE))) - { - RtlFreeUnicodeString(&WindowObject->WindowName); - WindowObject->WindowName.Buffer = NewWindowName.Buffer; - WindowObject->WindowName.Length = NewWindowName.Length; - WindowObject->WindowName.MaximumLength = NewWindowName.MaximumLength; - Result = TRUE; - } - - IntReleaseWindowObject(WindowObject); - - return Result; + } + } + else + { + RtlInitUnicodeString(&SafeText, NULL); + } + + /* FIXME - do this thread-safe! otherwise one could crash here! */ + if(WindowObject->WindowName.Buffer) + { + ExFreePool(WindowObject->WindowName.Buffer); + } + + WindowObject->WindowName = SafeText; + + IntReleaseWindowObject(WindowObject); + return TRUE; } /* * NtUserInternalGetWindowText * - * FIXME: Call this from user32.dll! - * * Status * @implemented */ -DWORD STDCALL -NtUserInternalGetWindowText(HWND WindowHandle, LPWSTR Text, INT MaxCount) +INT STDCALL +NtUserInternalGetWindowText(HWND hWnd, LPWSTR lpString, INT nMaxCount) { - PWINDOW_OBJECT WindowObject; - DWORD Result; - - WindowObject = IntGetWindowObject(WindowHandle); - if (!WindowObject) - { - SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); - return 0; - } - - Result = WindowObject->WindowName.Length / sizeof(WCHAR); - if (Text) - { - /* FIXME: Shouldn't it be always NULL terminated? */ - wcsncpy(Text, WindowObject->WindowName.Buffer, MaxCount); - if (MaxCount < Result) + PWINDOW_OBJECT WindowObject; + NTSTATUS Status; + INT Result; + + if(lpString && (nMaxCount <= 1)) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return 0; + } + + WindowObject = IntGetWindowObject(hWnd); + if(!WindowObject) + { + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + return 0; + } + + /* FIXME - do this thread-safe! otherwise one could crash here! */ + Result = WindowObject->WindowName.Length / sizeof(WCHAR); + if(lpString) + { + const WCHAR Terminator = L'\0'; + INT Copy; + WCHAR *Buffer = (WCHAR*)lpString; + + Copy = min(nMaxCount - 1, Result); + if(Copy > 0) + { + Status = MmCopyToCaller(Buffer, WindowObject->WindowName.Buffer, Copy * sizeof(WCHAR)); + if(!NT_SUCCESS(Status)) { - Result = MaxCount; + SetLastNtError(Status); + IntReleaseWindowObject(WindowObject); + return 0; } - } - - IntReleaseWindowObject(WindowObject); - - return Result; + Buffer += Copy; + } + + Status = MmCopyToCaller(Buffer, &Terminator, sizeof(WCHAR)); + if(!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + IntReleaseWindowObject(WindowObject); + return 0; + } + + Result = Copy; + } + + IntReleaseWindowObject(WindowObject); + return Result; } DWORD STDCALL From fa3672479ba28b35b823a4b123b3c66b815c59a6 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Tue, 13 Apr 2004 16:55:54 +0000 Subject: [PATCH 0872/1463] properly free unicode string svn path=/trunk/; revision=9123 --- reactos/subsys/win32k/ntuser/window.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index ec3fc9e57f0..a737ac8a3eb 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.212 2004/04/13 16:48:45 weiden Exp $ +/* $Id: window.c,v 1.213 2004/04/13 16:55:54 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -426,10 +426,7 @@ static LRESULT IntDestroyWindow(PWINDOW_OBJECT Window, NtGdiDeleteObject(Window->WindowRegion); } - if(Window->WindowName.Buffer) - { - ExFreePool(Window->WindowName.Buffer); - } + RtlFreeUnicodeString(&Window->WindowName); IntReleaseWindowObject(Window); @@ -3752,10 +3749,7 @@ NtUserDefSetText(HWND WindowHandle, PUNICODE_STRING WindowText) } /* FIXME - do this thread-safe! otherwise one could crash here! */ - if(WindowObject->WindowName.Buffer) - { - ExFreePool(WindowObject->WindowName.Buffer); - } + RtlFreeUnicodeString(&WindowObject->WindowName); WindowObject->WindowName = SafeText; From 2a3a6e1dda57fc1eb02fa5413e7c7bb2b1f9a723 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Tue, 13 Apr 2004 17:25:22 +0000 Subject: [PATCH 0873/1463] directly get the window text when drawing the caption bar svn path=/trunk/; revision=9124 --- reactos/lib/user32/windows/nonclient.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/user32/windows/nonclient.c b/reactos/lib/user32/windows/nonclient.c index 24278e2f030..73fd48bc2a7 100644 --- a/reactos/lib/user32/windows/nonclient.c +++ b/reactos/lib/user32/windows/nonclient.c @@ -1217,7 +1217,7 @@ DrawCaption(HWND hWnd, HDC hDC, LPCRECT lprc, UINT uFlags) r.bottom = r.top + Height; - if ((uFlags & DC_TEXT) && (GetWindowTextW( hWnd, buffer, sizeof(buffer)/sizeof(buffer[0]) ))) + if ((uFlags & DC_TEXT) && (NtUserInternalGetWindowText( hWnd, buffer, sizeof(buffer)/sizeof(buffer[0]) ))) { if(!(uFlags & DC_GRADIENT)) { From e2cebfc8d6bdd5c8934ef440e4aee8a740b8f8a5 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Tue, 13 Apr 2004 18:40:00 +0000 Subject: [PATCH 0874/1463] fixed crashes caused by an invalid pointer svn path=/trunk/; revision=9125 --- reactos/subsys/win32k/ntuser/window.c | 32 +++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index a737ac8a3eb..ac638b7667e 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.213 2004/04/13 16:55:54 weiden Exp $ +/* $Id: window.c,v 1.214 2004/04/13 18:40:00 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1344,21 +1344,45 @@ NtUserCreateWindowEx(DWORD dwExStyle, CBT_CREATEWNDW CbtCreate; LRESULT Result; BOOL MenuChanged; + LPWSTR OrigWindowName = NULL; DPRINT("NtUserCreateWindowEx(): (%d,%d-%d,%d)\n", x, y, nWidth, nHeight); + /* safely copy the window name */ if(lpWindowName) { - Status = IntSafeCopyUnicodeString(&WindowName, lpWindowName); + Status = MmCopyFromCaller(&WindowName, lpWindowName, sizeof(UNICODE_STRING)); if (!NT_SUCCESS(Status)) { SetLastNtError(Status); return((HWND)0); } + if(WindowName.Buffer) + { + /* safe the original pointer to the window name */ + OrigWindowName = WindowName.Buffer; + + if(!(WindowName.Buffer = ExAllocatePoolWithTag(NonPagedPool, WindowName.MaximumLength, TAG_STRING))) + { + SetLastNtError(STATUS_NO_MEMORY); + return((HWND)0); + } + + Status = MmCopyFromCaller(WindowName.Buffer, OrigWindowName, WindowName.MaximumLength); + if(!NT_SUCCESS(Status)) + { + ExFreePool(WindowName.Buffer); + SetLastNtError(Status); + return((HWND)0); + } + } + + if(!WindowName.Buffer) + RtlInitUnicodeString(&WindowName, NULL); } else RtlInitUnicodeString(&WindowName, NULL); - + ParentWindowHandle = PsGetWin32Thread()->Desktop->DesktopWindow; OwnerWindowHandle = NULL; @@ -1580,7 +1604,7 @@ NtUserCreateWindowEx(DWORD dwExStyle, Cs.x = x; Cs.y = y; Cs.style = dwStyle; - Cs.lpszName = lpWindowName->Buffer; + Cs.lpszName = OrigWindowName; /* pass the original pointer to usermode! */ Cs.lpszClass = lpClassName->Buffer; Cs.dwExStyle = dwExStyle; CbtCreate.lpcs = &Cs; From ee28a3ec394b68fafe074eac6314a5e85251595a Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Tue, 13 Apr 2004 19:23:15 +0000 Subject: [PATCH 0875/1463] spelling fixes svn path=/trunk/; revision=9126 --- reactos/lib/shell32/shlexec.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/lib/shell32/shlexec.c b/reactos/lib/shell32/shlexec.c index e7ac177d9af..568a8b6f4a4 100644 --- a/reactos/lib/shell32/shlexec.c +++ b/reactos/lib/shell32/shlexec.c @@ -153,7 +153,7 @@ static BOOL SHELL_ArgifyW(WCHAR* out, int len, const WCHAR* fmt, const WCHAR* lp break; /* - * IE uses this alot for activating things such as windows media + * IE uses this a lot for activating things such as windows media * player. This is not verified to be fully correct but it appears * to work just fine. */ @@ -933,7 +933,7 @@ BOOL WINAPI ShellExecuteExW32 (LPSHELLEXECUTEINFOW psei, SHELL_ExecuteW32 execfu static const WCHAR wExplorer[] = {'e','x','p','l','o','r','e','r','.','e','x','e',0}; WCHAR wszApplicationName[MAX_PATH+2], wszParameters[1024], wszDir[MAX_PATH]; - SHELLEXECUTEINFOW sei_tmp; /* modifyable copy of SHELLEXECUTEINFO struct */ + SHELLEXECUTEINFOW sei_tmp; /* modifiable copy of SHELLEXECUTEINFO struct */ WCHAR wfileName[MAX_PATH]; void *env; WCHAR wszProtocol[256]; @@ -1130,7 +1130,7 @@ BOOL WINAPI ShellExecuteExW32 (LPSHELLEXECUTEINFOW psei, SHELL_ExecuteW32 execfu LPWSTR dst = wfileName; LPWSTR end; - /* copy the unquoted executabe path to 'wfileName' */ + /* copy the unquoted executable path to 'wfileName' */ while(*src && *src!='"') *dst++ = *src++; From d6e3263af55475d442bc5c42b06e702210fad091 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Tue, 13 Apr 2004 19:51:44 +0000 Subject: [PATCH 0876/1463] return TRUE for TVM_EXPAND if treeview item is already expanded svn path=/trunk/; revision=9127 --- reactos/lib/comctl32/treeview.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/comctl32/treeview.c b/reactos/lib/comctl32/treeview.c index b15d1c117c4..f62c26dd983 100644 --- a/reactos/lib/comctl32/treeview.c +++ b/reactos/lib/comctl32/treeview.c @@ -3093,7 +3093,7 @@ TREEVIEW_Expand(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *wineItem, TRACE("\n"); if (wineItem->state & TVIS_EXPANDED) - return FALSE; + return TRUE; TRACE("TVE_EXPAND %p %s\n", wineItem, TREEVIEW_ItemName(wineItem)); From 4245c59dc13b70d31857f6a5021ebf4c4e753782 Mon Sep 17 00:00:00 2001 From: Jason Filby Date: Tue, 13 Apr 2004 20:30:58 +0000 Subject: [PATCH 0877/1463] Update memory regression test and split MDL tests into new file series svn path=/trunk/; revision=9128 --- reactos/regtests/kmregtests/Makefile | 3 +- reactos/regtests/kmregtests/tests/mdl-1.c | 68 +++++++++++++++++++++++ reactos/regtests/kmregtests/tests/mm-1.c | 15 ++--- 3 files changed, 78 insertions(+), 8 deletions(-) create mode 100644 reactos/regtests/kmregtests/tests/mdl-1.c diff --git a/reactos/regtests/kmregtests/Makefile b/reactos/regtests/kmregtests/Makefile index 17a1a7ffe83..48bfe0cafe9 100755 --- a/reactos/regtests/kmregtests/Makefile +++ b/reactos/regtests/kmregtests/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.3 2003/12/07 11:34:41 chorns Exp $ +# $Id: Makefile,v 1.4 2004/04/13 20:29:29 jfilby Exp $ PATH_TO_TOP = ../.. @@ -11,6 +11,7 @@ TARGET_NAME = kmregtests TARGET_LIBS = $(SDK_PATH_LIB)/rtshared.a TARGET_CFLAGS = -I../shared -Werror -Wall +TARGET_CFLAGS += -D__USE_W32API include Makefile.tests diff --git a/reactos/regtests/kmregtests/tests/mdl-1.c b/reactos/regtests/kmregtests/tests/mdl-1.c new file mode 100644 index 00000000000..94f6d65547c --- /dev/null +++ b/reactos/regtests/kmregtests/tests/mdl-1.c @@ -0,0 +1,68 @@ +#include +#include + +#include "regtests.h" + +static int RunTest(char *Buffer) +{ + VOID *pmem1; + PHYSICAL_ADDRESS LowestAcceptableAddress, HighestAcceptableAddress, SkipBytes; + SIZE_T TotalBytes; + PMDL Mdl; + + /* Allocate memory for use in testing */ + pmem1 = ExAllocatePool(NonPagedPool, + 512); + + /* MDL Testing */ + Mdl = NULL; + Mdl = MmCreateMdl(NULL, + pmem1, + 512); + if (Mdl == NULL) + { + strcpy(Buffer, "MmCreateMdl() failed for Mdl\n"); + return TS_FAILED; + } + MmBuildMdlForNonPagedPool(Mdl); + MmProbeAndLockPages(Mdl, + KernelMode, + IoReadAccess); + MmUnlockPages(Mdl); + ExFreePool(Mdl); + + SkipBytes.QuadPart = PAGE_SIZE * 4; + TotalBytes = 4096; + Mdl = NULL; + Mdl = MmAllocatePagesForMdl(LowestAcceptableAddress, + HighestAcceptableAddress, + SkipBytes, + TotalBytes); + if (Mdl == NULL) + { + strcpy(Buffer, "MmAllocatePagesForMdl() failed for Mdl\n"); + return TS_FAILED; + } + MmFreePagesFromMdl(Mdl); + + /* Free memory used in test */ + ExFreePool(pmem1); + + return TS_OK; +} + +int +Mdl_1Test(int Command, char *Buffer) +{ + switch (Command) + { + case TESTCMD_RUN: + return RunTest(Buffer); + case TESTCMD_TESTNAME: + strcpy(Buffer, "Kernel Memory MDL API"); + return TS_OK; + default: + break; + } + return TS_FAILED; +} diff --git a/reactos/regtests/kmregtests/tests/mm-1.c b/reactos/regtests/kmregtests/tests/mm-1.c index 046fa979429..3d7e94dd650 100644 --- a/reactos/regtests/kmregtests/tests/mm-1.c +++ b/reactos/regtests/kmregtests/tests/mm-1.c @@ -14,6 +14,7 @@ static int RunTest(char *Buffer) /* Various ways to allocate memory */ HighestAcceptableAddress.QuadPart = 0x00000000FFFFFF; /* 16MB */ AllocSize1 = 512; + pmem1 = 0; pmem1 = MmAllocateContiguousMemory(AllocSize1, HighestAcceptableAddress); if (pmem1 == 0) @@ -26,6 +27,7 @@ static int RunTest(char *Buffer) HighestAcceptableAddress.QuadPart = 0x00000000FFFFFF; /* 16MB */ BoundryAddressMultiple.QuadPart = 512; AllocSize2 = 512; + pmem2 = 0; pmem2 = MmAllocateContiguousMemorySpecifyCache(AllocSize2, LowestAcceptableAddress, HighestAcceptableAddress, @@ -41,6 +43,7 @@ static int RunTest(char *Buffer) HighestAcceptableAddress.QuadPart = 0x0000000F000000; /* 250MB */ BoundryAddressMultiple.QuadPart = 1024; AllocSize3 = 512; + pmem3 = 0; pmem3 = MmAllocateContiguousMemorySpecifyCache(AllocSize3, LowestAcceptableAddress, HighestAcceptableAddress, @@ -57,6 +60,7 @@ static int RunTest(char *Buffer) HighestAcceptableAddress.QuadPart = 0x00000000FFFFFF; /* 16MB */ BoundryAddressMultiple.QuadPart = 4096; AllocSize4 = 512; + pmem4 = 0; pmem4 = MmAllocateContiguousMemorySpecifyCache(AllocSize4, LowestAcceptableAddress, HighestAcceptableAddress, @@ -69,6 +73,7 @@ static int RunTest(char *Buffer) } AllocSize5 = 1048576; /* 1MB */ + pmem5 = 0; pmem5 = MmAllocateNonCachedMemory(AllocSize5); if (pmem5 == 0) { @@ -77,6 +82,7 @@ static int RunTest(char *Buffer) } /* Memory checking functions */ + PhysicalAddress.QuadPart = 0; PhysicalAddress = MmGetPhysicalAddress(pmem1); if (PhysicalAddress.QuadPart == 0) { @@ -138,6 +144,7 @@ static int RunTest(char *Buffer) /* Misc functions */ Server = MmIsThisAnNtAsSystem(); + MemSize = 0; MemSize = MmQuerySystemSize(); if (MemSize != MmSmallSystem && MemSize != MmMediumSystem && @@ -147,10 +154,6 @@ static int RunTest(char *Buffer) return TS_FAILED; } - /* Page locking functions */ - - /* Mapping functions */ - /* Free allocated memory */ MmFreeContiguousMemory(pmem1); MmFreeContiguousMemorySpecifyCache(pmem2, @@ -165,8 +168,6 @@ static int RunTest(char *Buffer) MmFreeNonCachedMemory(pmem5, AllocSize5); - /* MDL operations */ - return TS_OK; } @@ -178,7 +179,7 @@ Mm_1Test(int Command, char *Buffer) case TESTCMD_RUN: return RunTest(Buffer); case TESTCMD_TESTNAME: - strcpy(Buffer, "Kernel Memory API"); + strcpy(Buffer, "Kernel Core Memory API"); return TS_OK; default: break; From df24731574beb30ef4385d9ad7fd6e2b5b882615 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Tue, 13 Apr 2004 20:47:19 +0000 Subject: [PATCH 0878/1463] make drive letters in PIDLs always uppercase to enable PIDL comparison svn path=/trunk/; revision=9129 --- reactos/lib/shell32/shfldr_mycomp.c | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/lib/shell32/shfldr_mycomp.c b/reactos/lib/shell32/shfldr_mycomp.c index a9bb1946f28..48284206972 100644 --- a/reactos/lib/shell32/shfldr_mycomp.c +++ b/reactos/lib/shell32/shfldr_mycomp.c @@ -217,6 +217,7 @@ ISF_MyComputer_fnParseDisplayName (IShellFolder2 * iface, /* do we have an absolute path name ? */ else if (PathGetDriveNumberW (lpszDisplayName) >= 0 && lpszDisplayName[2] == (WCHAR) '\\') { szNext = GetNextElementW (lpszDisplayName, szElement, MAX_PATH); + szElement[0] = toupper(szElement[0]); /* make drive letter uppercase to enable PIDL comparison */ WideCharToMultiByte (CP_ACP, 0, szElement, -1, szTempA, MAX_PATH, NULL, NULL); pidlTemp = _ILCreateDrive (szTempA); } From ecef0f56e1f4ccc449045b784334734b8e7ba604 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Tue, 13 Apr 2004 20:50:04 +0000 Subject: [PATCH 0879/1463] merge Wine commit: Filip Navara Get rid of non-standard ERROR_UNKNOWN value. The IShellLink case was tested, others were replaced with reasonable values. svn path=/trunk/; revision=9130 --- reactos/lib/shell32/shelllink.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/shell32/shelllink.c b/reactos/lib/shell32/shelllink.c index 7a0503d1f56..7c098f6ad5a 100644 --- a/reactos/lib/shell32/shelllink.c +++ b/reactos/lib/shell32/shelllink.c @@ -289,7 +289,7 @@ static HRESULT WINAPI IPersistFile_fnSave(IPersistFile* iface, LPCOLESTR pszFile TRACE("(%p)->(%s)\n",This,debugstr_w(pszFileName)); if (!pszFileName || !This->sPath) - return ERROR_UNKNOWN; + return E_FAIL; r = CreateStreamOnFile(pszFileName, STGM_READWRITE | STGM_CREATE, &stm); if( SUCCEEDED( r ) ) From 23a76b4fa14f8af6ad7cdace95deb71e39057bba Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Tue, 13 Apr 2004 20:54:05 +0000 Subject: [PATCH 0880/1463] return "file not found" error values instead of E_INVALIDARG if _ILCreateFromPathA() failed to find files svn path=/trunk/; revision=9131 --- reactos/lib/shell32/shfldr_desktop.c | 3 +++ reactos/lib/shell32/shfldr_fs.c | 19 +++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/reactos/lib/shell32/shfldr_desktop.c b/reactos/lib/shell32/shfldr_desktop.c index 21cbee1e763..ba8cf15d835 100644 --- a/reactos/lib/shell32/shfldr_desktop.c +++ b/reactos/lib/shell32/shfldr_desktop.c @@ -235,6 +235,9 @@ static HRESULT WINAPI ISF_Desktop_fnParseDisplayName (IShellFolder2 * iface, len = lstrlenA(szPath); WideCharToMultiByte(CP_ACP, 0, lpszDisplayName, -1, szPath + len, MAX_PATH - len, NULL, NULL); pidlTemp = _ILCreateFromPathA(szPath); + + if (!pidlTemp) + hr = 0x80070002L; /* file not found */ } else { pidlTemp = _ILCreateMyComputer(); } diff --git a/reactos/lib/shell32/shfldr_fs.c b/reactos/lib/shell32/shfldr_fs.c index a38325816ff..6a31d98e44a 100644 --- a/reactos/lib/shell32/shfldr_fs.c +++ b/reactos/lib/shell32/shfldr_fs.c @@ -354,7 +354,9 @@ IShellFolder_fnParseDisplayName (IShellFolder2 * iface, /* get the pidl */ pidlTemp = _ILCreateFromPathA(szPath); - if (pidlTemp) { + if (!pidlTemp) + hr = 0x80070002L; /* file not found */ + else { if (szNext && *szNext) { /* try to analyse the next element */ hr = SHELL32_ParseNextElement (iface, hwndOwner, pbc, &pidlTemp, (LPOLESTR) szNext, pchEaten, pdwAttributes); @@ -748,8 +750,11 @@ static HRESULT WINAPI IShellFolder_fnSetNameOf (IShellFolder2 * iface, HWND hwnd szDest[MAX_PATH - 1] = 0; TRACE ("src=%s dest=%s\n", szSrc, szDest); if (MoveFileA (szSrc, szDest)) { - if (pPidlOut) + if (pPidlOut) { *pPidlOut = _ILCreateFromPathA(szDest); + if (!*pPidlOut) + return 0x80070002L; /* file not found */ + } SHChangeNotify (bIsFolder ? SHCNE_RENAMEFOLDER : SHCNE_RENAMEITEM, SHCNF_PATHA, szSrc, szDest); return S_OK; } @@ -977,9 +982,15 @@ static HRESULT WINAPI ISFHelper_fnAddFolder (ISFHelper * iface, HWND hwnd, LPCST bRes = CreateDirectoryA (lpstrNewDir, NULL); if (bRes) { SHChangeNotify (SHCNE_MKDIR, SHCNF_PATHA, lpstrNewDir, NULL); - if (ppidlOut) - *ppidlOut = _ILCreateFromPathA(lpstrNewDir); + hres = S_OK; + + if (ppidlOut) { + *ppidlOut = _ILCreateFromPathA(lpstrNewDir); + + if (!*ppidlOut) + hres = 0x80070002L; /* file not found */ + } } else { char lpstrText[128 + MAX_PATH]; char lpstrTempText[128]; From b1a7c433b7203a0471b4fe75f078354355341c3e Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Tue, 13 Apr 2004 20:55:45 +0000 Subject: [PATCH 0881/1463] correct error handling in SHELL32_ParseNextElement() svn path=/trunk/; revision=9132 --- reactos/lib/shell32/shlfolder.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/reactos/lib/shell32/shlfolder.c b/reactos/lib/shell32/shlfolder.c index 062e977688e..7dfbdd7a5ef 100644 --- a/reactos/lib/shell32/shlfolder.c +++ b/reactos/lib/shell32/shlfolder.c @@ -118,14 +118,16 @@ HRESULT SHELL32_ParseNextElement (IShellFolder2 * psf, HWND hwndOwner, LPBC pbc, /* get the shellfolder for the child pidl and let it analyse further */ hr = IShellFolder_BindToObject (psf, *pidlInOut, pbc, &IID_IShellFolder, (LPVOID *) & psfChild); - if (SUCCEEDED (hr)) { + if (SUCCEEDED(hr)) { hr = IShellFolder_ParseDisplayName (psfChild, hwndOwner, pbc, szNext, pEaten, &pidlOut, pdwAttributes); IShellFolder_Release (psfChild); - pidlTemp = ILCombine (*pidlInOut, pidlOut); + if (SUCCEEDED(hr)) { + pidlTemp = ILCombine (*pidlInOut, pidlOut); - if (!pidlTemp) - hr = E_OUTOFMEMORY; + if (!pidlTemp) + hr = E_OUTOFMEMORY; + } if (pidlOut) ILFree (pidlOut); From bbd9b3d4a88cbcb2b56118f65738721762603e2c Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Tue, 13 Apr 2004 21:34:45 +0000 Subject: [PATCH 0882/1463] added paramter -e to skip and count empty lines svn path=/trunk/; revision=9133 --- reactos/apps/utils/stats/stats.c | 120 +++++++++++++++++++++---------- 1 file changed, 82 insertions(+), 38 deletions(-) diff --git a/reactos/apps/utils/stats/stats.c b/reactos/apps/utils/stats/stats.c index 521c6f3c3ed..21f78084ba1 100644 --- a/reactos/apps/utils/stats/stats.c +++ b/reactos/apps/utils/stats/stats.c @@ -21,6 +21,7 @@ typedef struct _EXTENSION_INFO TCHAR Description[256]; DWORD FileCount; DWORD LineCount; + DWORD EmptyLines; } EXTENSION_INFO, *PEXTENSION_INFO; typedef struct _FILE_INFO @@ -30,26 +31,29 @@ typedef struct _FILE_INFO PEXTENSION_INFO ExtInfo; TCHAR FileName[MAX_PATH]; DWORD LineCount; + DWORD EmptyLines; DWORD FunctionCount; } FILE_INFO, *PFILE_INFO; HANDLE FileHandle; -DWORD TotalLineCount; PEXTENSION_INFO ExtInfoList; PFILE_INFO StatInfoList; +BOOLEAN SkipEmptyLines; + +#define MAX_OPTIONS 1 +TCHAR *Options[MAX_OPTIONS]; VOID -Initialize() +Initialize(VOID) { - TotalLineCount = 0; ExtInfoList = NULL; StatInfoList = NULL; } VOID -Cleanup() +Cleanup(VOID) { PEXTENSION_INFO ExtInfo; PEXTENSION_INFO NextExtInfo; @@ -157,7 +161,7 @@ AddFile(LPTSTR FileName, VOID -CleanupAfterFile() +CleanupAfterFile(VOID) { if(FileHandle != INVALID_HANDLE_VALUE) CloseHandle (FileHandle); @@ -190,10 +194,10 @@ LoadFile(LPTSTR FileName) } -DWORD -ReadLines() +VOID +ReadLines(PFILE_INFO StatInfo) { - DWORD ReadBytes, LineLen, Lines = 0; + DWORD ReadBytes, LineLen; static char FileBuffer[1024]; char LastChar = '\0'; char *Current; @@ -201,51 +205,52 @@ ReadLines() LineLen = 0; while(ReadFile (FileHandle, FileBuffer, sizeof(FileBuffer), &ReadBytes, NULL) && ReadBytes >= sizeof(char)) { - if(ReadBytes & 0x1) - ReadBytes--; - for(Current = FileBuffer; ReadBytes > 0; ReadBytes -= sizeof(char), Current++) { if(*Current == '\n' && LastChar == '\r') { LastChar = '\0'; - if(LineLen > 0) - Lines++; + if(!SkipEmptyLines || (LineLen > 0)) + StatInfo->LineCount++; + if(LineLen == 0) + StatInfo->EmptyLines++; LineLen = 0; + continue; } - LineLen++; LastChar = *Current; + if(SkipEmptyLines && (*Current == ' ' || *Current == '\t')) + { + continue; + } + if(*Current != '\r') + LineLen++; } } - Lines += (LineLen > 0); - return Lines; + StatInfo->LineCount += (LineLen > 0); + StatInfo->EmptyLines += ((LastChar != '\0') && (LineLen == 0)); } VOID -DoStatisticsForFile(PFILE_INFO StatInfo) -{ - StatInfo->LineCount = ReadLines(); -} - - -VOID -PrintStatistics() +PrintStatistics(VOID) { PEXTENSION_INFO Info; DWORD TotalFileCount; DWORD TotalLineCount; DWORD TotalAvgLF; + DWORD TotalEmptyLines; TotalFileCount = 0; TotalLineCount = 0; + TotalEmptyLines = 0; Info = ExtInfoList; for (Info = ExtInfoList; Info != NULL; Info = Info->Next) { TotalFileCount += Info->FileCount; TotalLineCount += Info->LineCount; + TotalEmptyLines += Info->EmptyLines; } TotalAvgLF = (TotalFileCount ? TotalLineCount / TotalFileCount : 0); @@ -264,18 +269,22 @@ PrintStatistics() } _tprintf (_T("\n")); - _tprintf (_T("File extension%c : %s\n"), ((Info->nExtensions > 1) ? _T('s') : _T(' ')), Info->ExpandedExtName); - _tprintf (_T("File ext. description : %s\n"), Info->Description); - _tprintf (_T("Number of files : %lu\n"), Info->FileCount); - _tprintf (_T("Number of lines : %lu\n"), Info->LineCount); - _tprintf (_T("Proportion of lines : %.2f %%\n"), (float)(TotalLineCount ? (((float)Info->LineCount * 100) / (float)TotalLineCount) : 0)); - _tprintf (_T("Average no. lines/file : %lu\n"), AvgLF); + _tprintf (_T("File extension%c : %s\n"), ((Info->nExtensions > 1) ? _T('s') : _T(' ')), Info->ExpandedExtName); + _tprintf (_T("File ext. description : %s\n"), Info->Description); + _tprintf (_T("Number of files : %lu\n"), Info->FileCount); + _tprintf (_T("Number of lines : %lu\n"), Info->LineCount); + if(SkipEmptyLines) + _tprintf (_T("Number of empty lines : %lu\n"), Info->EmptyLines); + _tprintf (_T("Proportion of lines : %.2f %%\n"), (float)(TotalLineCount ? (((float)Info->LineCount * 100) / (float)TotalLineCount) : 0)); + _tprintf (_T("Average no. lines/file : %lu\n"), AvgLF); } _tprintf (_T("\n")); - _tprintf (_T("Total number of files : %lu\n"), TotalFileCount); - _tprintf (_T("Total number of lines : %lu\n"), TotalLineCount); - _tprintf (_T("Average no. lines/file : %lu\n"), TotalAvgLF); + _tprintf (_T("Total number of files : %lu\n"), TotalFileCount); + _tprintf (_T("Total number of lines : %lu\n"), TotalLineCount); + if(SkipEmptyLines) + _tprintf (_T("Total number of empty lines : %lu\n"), TotalEmptyLines); + _tprintf (_T("Average no. lines/file : %lu\n"), TotalAvgLF); } @@ -324,10 +333,11 @@ ProcessFiles(LPTSTR Path) return FALSE; } - DoStatisticsForFile (StatInfo); + ReadLines (StatInfo); Info->FileCount++; Info->LineCount += StatInfo->LineCount; + Info->EmptyLines += StatInfo->EmptyLines; CleanupAfterFile(); } @@ -413,19 +423,36 @@ Execute(LPTSTR Path) PrintStatistics(); } +BOOLEAN +IsOptionSet(TCHAR *Option) +{ + int i; + for(i = 0; i < MAX_OPTIONS; i++) + { + if(!Options[i]) + continue; + + if(!_tcscmp(Options[i], Option)) + return TRUE; + } + return FALSE; +} + int main (int argc, char * argv []) { + int a; #if UNICODE TCHAR Path[MAX_PATH + 1]; #endif _tprintf (_T("\nReactOS project statistics generator.\n\n")); - if (argc < 2) + if (argc < 2 || argc > 2 + MAX_OPTIONS) { - _tprintf(_T("Usage: stats directory")); + _tprintf(_T("Usage: stats [-e] directory\n")); + _tprintf(_T(" -e: don't count empty lines")); return 1; } @@ -433,12 +460,29 @@ main (int argc, char * argv []) AddExtension (_T("c\0\0"), _T("Ansi C Source files")); AddExtension (_T("cpp\0cxx\0\0"), _T("C++ Source files")); AddExtension (_T("h\0\0"), _T("Header files")); + + for(a = 1; a < argc - 1; a++) + { +#if UNICODE + int len = lstrlenA(argv[a]); + TCHAR *str = (TCHAR*)HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(TCHAR)); + if(MultiByteToWideChar(CP_ACP, 0, argv[a], -1, str, len + 1) > 0) + Options[a - 1] = str; + else + Options[a - 1] = NULL; +#else + Options[a - 1] = argv[a]; +#endif + } + + SkipEmptyLines = IsOptionSet(_T("-e")); + #if UNICODE ZeroMemory(Path, sizeof(Path)); - if(MultiByteToWideChar(CP_ACP, 0, argv[1], -1, Path, MAX_PATH) > 0) + if(MultiByteToWideChar(CP_ACP, 0, argv[argc - 1], -1, Path, MAX_PATH) > 0) Execute (Path); #else - Execute (argv[1]); + Execute (argv[argc - 1]); #endif Cleanup(); From b4472c0848535a2de30dab4f86fc8d603d14dabe Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Tue, 13 Apr 2004 23:12:30 +0000 Subject: [PATCH 0883/1463] fixed implementation of ChildWindowFromPointEx() svn path=/trunk/; revision=9134 --- reactos/subsys/win32k/include/winpos.h | 9 ++ reactos/subsys/win32k/ntuser/window.c | 115 ++++++++++++------------- reactos/subsys/win32k/ntuser/winpos.c | 11 +-- 3 files changed, 65 insertions(+), 70 deletions(-) diff --git a/reactos/subsys/win32k/include/winpos.h b/reactos/subsys/win32k/include/winpos.h index f2428db1b14..2929d8137de 100644 --- a/reactos/subsys/win32k/include/winpos.h +++ b/reactos/subsys/win32k/include/winpos.h @@ -5,6 +5,15 @@ #define SWP_NOCLIENTMOVE 0x0800 #define SWP_NOCLIENTSIZE 0x1000 +#define IntPtInWindow(WndObject,x,y) \ + ((x) >= (WndObject)->WindowRect.left && \ + (x) < (WndObject)->WindowRect.right && \ + (y) >= (WndObject)->WindowRect.top && \ + (y) < (WndObject)->WindowRect.bottom && \ + (!(WndObject)->WindowRegion || ((WndObject)->Style & WS_MINIMIZE) || \ + NtGdiPtInRegion((WndObject)->WindowRegion, (INT)((x) - (WndObject)->WindowRect.left), \ + (INT)((y) - (WndObject)->WindowRect.top)))) + BOOL FASTCALL IntGetClientOrigin(HWND hWnd, LPPOINT Point); LRESULT FASTCALL diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index ac638b7667e..20d9300f62b 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.214 2004/04/13 18:40:00 weiden Exp $ +/* $Id: window.c,v 1.215 2004/04/13 23:12:29 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1233,76 +1233,69 @@ NtUserBuildHwndList( /* * @implemented */ - - /* FIXME - NEEDS TO BE FIXED - UNSAFE !!! */ HWND STDCALL NtUserChildWindowFromPointEx(HWND hwndParent, LONG x, LONG y, UINT uiFlags) { - PWINDOW_OBJECT pParent, pCurrent, pLast, pPar; - POINT p = {x,y}; - RECT rc; - BOOL bFirstRun = TRUE; - - if(hwndParent) + PWINDOW_OBJECT Parent; + POINTL Pt; + HWND Ret; + HWND *List, *phWnd; + + if(!(Parent = IntGetWindowObject(hwndParent))) + { + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + return NULL; + } + + Ret = NULL; + + Pt.x = Parent->WindowRect.left + x; + Pt.y = Parent->WindowRect.top + y; + + if((List = IntWinListChildren(Parent))) + { + for(phWnd = List; *phWnd; phWnd++) { - pParent = IntGetWindowObject(hwndParent); - if(pParent) + PWINDOW_OBJECT Child; + if((Child = IntGetWindowObject(*phWnd))) + { + if(!(Child->Style & WS_VISIBLE) && (uiFlags & CWP_SKIPINVISIBLE)) { - IntLockRelatives(pParent); - - pLast = IntGetWindowObject(pParent->LastChild->Self); - pCurrent = IntGetWindowObject(pParent->FirstChild->Self); - - do - { - if (!bFirstRun) - { - pCurrent = IntGetWindowObject(pCurrent->NextSibling->Self); - - } - else - bFirstRun = FALSE; - if(!pCurrent) - { - IntUnLockRelatives(pParent); - return (HWND)NULL; - } - if(!(pPar = IntGetWindowObject(pCurrent->Parent))) - { - IntUnLockRelatives(pParent); - return (HWND)NULL; - } - rc.left = pCurrent->WindowRect.left - pPar->ClientRect.left; - rc.top = pCurrent->WindowRect.top - pPar->ClientRect.top; - rc.right = rc.left + (pCurrent->WindowRect.right - pCurrent->WindowRect.left); - rc.bottom = rc.top + (pCurrent->WindowRect.bottom - pCurrent->WindowRect.top); - DbgPrint("Rect: %i,%i,%i,%i\n",rc.left, rc.top, rc.right, rc.bottom); - IntReleaseWindowObject(pPar); - if (POINT_IN_RECT(p,rc)) /* Found a match */ - { - if ( (uiFlags & CWP_SKIPDISABLED) && (pCurrent->Style & WS_DISABLED) ) - continue; - if( (uiFlags & CWP_SKIPTRANSPARENT) && (pCurrent->ExStyle & WS_EX_TRANSPARENT) ) - continue; - if( (uiFlags & CWP_SKIPINVISIBLE) && !(pCurrent->Style & WS_VISIBLE) ) - continue; - - IntUnLockRelatives(pParent); - return pCurrent->Self; - } - } - while(pCurrent != pLast); - - IntUnLockRelatives(pParent); - return (HWND)NULL; + IntReleaseWindowObject(Child); + continue; } - SetLastWin32Error(ERROR_INVALID_PARAMETER); + if((Child->Style & WS_DISABLED) && (uiFlags & CWP_SKIPDISABLED)) + { + IntReleaseWindowObject(Child); + continue; + } + if((Child->ExStyle & WS_EX_TRANSPARENT) && (uiFlags & CWP_SKIPTRANSPARENT)) + { + IntReleaseWindowObject(Child); + continue; + } + if(IntPtInWindow(Child, Pt.x, Pt.y)) + { + Ret = Child->Self; + IntReleaseWindowObject(Child); + break; + } + IntReleaseWindowObject(Child); + } } - - return (HWND)NULL; + ExFreePool(List); + } + + if((Ret == NULL) && IntPtInWindow(Parent, Pt.x, Pt.y)) + { + Ret = Parent->Self; + } + + IntReleaseWindowObject(Parent); + return Ret; } diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index dea9fb4025f..298fb67cf92 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.109 2004/04/09 20:03:19 navaraf Exp $ +/* $Id: winpos.c,v 1.110 2004/04/13 23:12:30 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1385,14 +1385,7 @@ WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, BOOL SendHitTestMessage, POINT *Po if (Current->Style & WS_VISIBLE && (!(Current->Style & WS_DISABLED) || (Current->Style & (WS_CHILD | WS_POPUP)) != WS_CHILD) && - (Point->x >= Current->WindowRect.left && - Point->x < Current->WindowRect.right && - Point->y >= Current->WindowRect.top && - Point->y < Current->WindowRect.bottom) && - (!Current->WindowRegion || (Current->Style & WS_MINIMIZE) || - NtGdiPtInRegion(Current->WindowRegion, (INT)(Point->x - Current->WindowRect.left), - (INT)(Point->y - Current->WindowRect.top))) - ) + IntPtInWindow(Current, Point->x, Point->y)) { if(*Window) { From 900e819d27c58b1ca7b21301d77f392cf44fba39 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Tue, 13 Apr 2004 23:25:54 +0000 Subject: [PATCH 0884/1463] little fix svn path=/trunk/; revision=9135 --- reactos/subsys/win32k/ntuser/window.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 20d9300f62b..eb3e9ec7813 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.215 2004/04/13 23:12:29 weiden Exp $ +/* $Id: window.c,v 1.216 2004/04/13 23:25:54 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1250,11 +1250,22 @@ NtUserChildWindowFromPointEx(HWND hwndParent, return NULL; } - Ret = NULL; + Pt.x = x; + Pt.y = y; - Pt.x = Parent->WindowRect.left + x; - Pt.y = Parent->WindowRect.top + y; + if(Parent->Self != IntGetDesktopWindow()) + { + Pt.x += Parent->ClientRect.left; + Pt.y += Parent->ClientRect.top; + } + if(!IntPtInWindow(Parent, Pt.x, Pt.y)) + { + IntReleaseWindowObject(Parent); + return NULL; + } + + Ret = Parent->Self; if((List = IntWinListChildren(Parent))) { for(phWnd = List; *phWnd; phWnd++) @@ -1289,11 +1300,6 @@ NtUserChildWindowFromPointEx(HWND hwndParent, ExFreePool(List); } - if((Ret == NULL) && IntPtInWindow(Parent, Pt.x, Pt.y)) - { - Ret = Parent->Self; - } - IntReleaseWindowObject(Parent); return Ret; } From 7d88f002d24a5aec55ec9f6fda021c0ff0d9c276 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 14 Apr 2004 07:11:20 +0000 Subject: [PATCH 0885/1463] Implementation of system performance auditing hax. svn path=/trunk/; revision=9136 --- reactos/ntoskrnl/ex/sysinfo.c | 58 +++++++++++++++++++------- reactos/ntoskrnl/include/internal/ex.h | 2 +- reactos/ntoskrnl/include/internal/ke.h | 8 ++++ reactos/ntoskrnl/include/internal/mm.h | 2 + reactos/ntoskrnl/ke/timer.c | 30 +++++++++++-- reactos/ntoskrnl/mm/balance.c | 4 +- 6 files changed, 84 insertions(+), 20 deletions(-) diff --git a/reactos/ntoskrnl/ex/sysinfo.c b/reactos/ntoskrnl/ex/sysinfo.c index 3af5362a085..ddd43e5a625 100644 --- a/reactos/ntoskrnl/ex/sysinfo.c +++ b/reactos/ntoskrnl/ex/sysinfo.c @@ -1,4 +1,4 @@ -/* $Id: sysinfo.c,v 1.26 2003/12/14 17:44:02 hbirr Exp $ +/* $Id: sysinfo.c,v 1.27 2004/04/14 07:10:44 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -21,6 +21,7 @@ #include #include #include +#include #include @@ -303,7 +304,7 @@ QSI_DEF(SystemBasicInformation) Sbi->LowestUserAddress = 0; /* FIXME */ Sbi->HighestUserAddress = 0; /* FIXME */ Sbi->ActiveProcessors = 0x00000001; /* FIXME */ - Sbi->NumberProcessors = 1; /* FIXME */ + Sbi->NumberProcessors = KeNumberProcessors; return (STATUS_SUCCESS); } @@ -348,14 +349,15 @@ QSI_DEF(SystemPerformanceInformation) return (STATUS_INFO_LENGTH_MISMATCH); } - Spi->IdleTime.QuadPart = 0; /* FIXME */ + Spi->IdleTime.QuadPart = PsInitialSystemProcess->Pcb.KernelTime * 100000; + Spi->ReadTransferCount.QuadPart = 0; /* FIXME */ Spi->WriteTransferCount.QuadPart = 0; /* FIXME */ Spi->OtherTransferCount.QuadPart = 0; /* FIXME */ Spi->ReadOperationCount = 0; /* FIXME */ Spi->WriteOperationCount = 0; /* FIXME */ Spi->OtherOperationCount = 0; /* FIXME */ - Spi->AvailablePages = 0; /* FIXME */ + Spi->AvailablePages = MiNrAvailablePages; Spi->TotalCommittedPages = 0; /* FIXME */ Spi->TotalCommitLimit = 0; /* FIXME */ Spi->PeakCommitment = 0; /* FIXME */ @@ -435,6 +437,8 @@ QSI_DEF(SystemPerformanceInformation) /* Class 3 - Time Of Day Information */ QSI_DEF(SystemTimeOfDayInformation) { + LARGE_INTEGER CurrentTime; + PSYSTEM_TIMEOFDAY_INFORMATION Sti = (PSYSTEM_TIMEOFDAY_INFORMATION) Buffer; @@ -447,9 +451,11 @@ QSI_DEF(SystemTimeOfDayInformation) return (STATUS_INFO_LENGTH_MISMATCH); } - Sti->BootTime.QuadPart = 0; /* FIXME */ - Sti->CurrentTime.QuadPart = 0; /* FIXME */ - Sti->TimeZoneBias.QuadPart = 0; /* FIXME */ + KeQuerySystemTime(&CurrentTime); + + Sti->BootTime= SystemBootTime; + Sti->CurrentTime = CurrentTime; + Sti->TimeZoneBias.QuadPart = _SystemTimeZoneInfo.Bias; Sti->TimeZoneId = 0; /* FIXME */ Sti->Reserved = 0; /* FIXME */ @@ -515,8 +521,11 @@ QSI_DEF(SystemProcessInformation) SpiCur->NextEntryDelta = curSize+inLen; // relative offset to the beginnnig of the next structure SpiCur->ThreadCount = nThreads; SpiCur->CreateTime = pr->CreateTime; - //SpiCur->UserTime = 0; // FIXME - //SpiCur->KernelTime = 0; // FIXME +/* + * System Clock is 18.2 psec. + */ + SpiCur->UserTime.QuadPart = pr->Pcb.UserTime * 100000; + SpiCur->KernelTime.QuadPart = pr->Pcb.KernelTime * 100000; SpiCur->ProcessName.Length = strlen(pr->ImageFileName) * sizeof(WCHAR); SpiCur->ProcessName.MaximumLength = inLen; @@ -526,7 +535,7 @@ QSI_DEF(SystemProcessInformation) RtlInitAnsiString(&imgName, pr->ImageFileName); RtlAnsiStringToUnicodeString(&SpiCur->ProcessName, &imgName, FALSE); - SpiCur->BasePriority = 0; // FIXME + SpiCur->BasePriority = pr->Pcb.BasePriority; SpiCur->ProcessId = pr->UniqueProcessId; SpiCur->InheritedFromProcessId = (DWORD)(pr->InheritedFromUniqueProcessId); SpiCur->HandleCount = 0; // FIXME @@ -602,8 +611,27 @@ QSI_DEF(SystemDeviceInformation) /* Class 8 - Processor Performance Information */ QSI_DEF(SystemProcessorPerformanceInformation) { - /* FIXME */ - return (STATUS_NOT_IMPLEMENTED); + PSYSTEM_PROCESSORTIME_INFO Spi + = (PSYSTEM_PROCESSORTIME_INFO) Buffer; + + *ReqSize = sizeof (SYSTEM_PROCESSORTIME_INFO); + /* + * Check user buffer's size + */ + if (Size < sizeof (SYSTEM_PROCESSORTIME_INFO)) + { + return (STATUS_INFO_LENGTH_MISMATCH); + } + + Spi->TotalProcessorRunTime.QuadPart = + PsInitialSystemProcess->Pcb.KernelTime * 100000; // IdleTime + Spi->TotalProcessorTime.QuadPart = KiKernelTime * 100000; // KernelTime + Spi->TotalProcessorUserTime.QuadPart = KiUserTime * 100000; + Spi->TotalDPCTime.QuadPart = KiDpcTime * 100000; + Spi->TotalInterruptTime.QuadPart = 0; + Spi->TotalInterrupts = 0; // Interrupt Count + + return (STATUS_SUCCESS); } /* Class 9 - Flags Information */ @@ -941,7 +969,7 @@ QSI_DEF(SystemCurrentTimeZoneInformation) /* Copy the time zone information struct */ memcpy ( Buffer, - & SystemTimeZoneInfo, + & _SystemTimeZoneInfo, sizeof (TIME_ZONE_INFORMATION) ); @@ -960,7 +988,7 @@ SSI_DEF(SystemCurrentTimeZoneInformation) } /* Copy the time zone information struct */ memcpy ( - & SystemTimeZoneInfo, + & _SystemTimeZoneInfo, (TIME_ZONE_INFORMATION *) Buffer, sizeof (TIME_ZONE_INFORMATION) ); @@ -1141,6 +1169,8 @@ NtQuerySystemInformation (IN SYSTEM_INFORMATION_CLASS SystemInformationClass, NTSTATUS Status; NTSTATUS FStatus; + DPRINT("NtQuerySystemInformation Start.\n"); + /*if (ExGetPreviousMode() == KernelMode) {*/ SystemInformation = UnsafeSystemInformation; diff --git a/reactos/ntoskrnl/include/internal/ex.h b/reactos/ntoskrnl/include/internal/ex.h index 67789c91c64..633c262eea9 100644 --- a/reactos/ntoskrnl/include/internal/ex.h +++ b/reactos/ntoskrnl/include/internal/ex.h @@ -98,7 +98,7 @@ typedef VOID (*PLOOKASIDE_MINMAX_ROUTINE)( /* GLOBAL VARIABLES *********************************************************/ -TIME_ZONE_INFORMATION SystemTimeZoneInfo; +TIME_ZONE_INFORMATION _SystemTimeZoneInfo; extern POBJECT_TYPE ExEventPairObjectType; diff --git a/reactos/ntoskrnl/include/internal/ke.h b/reactos/ntoskrnl/include/internal/ke.h index 8dae2890189..fe638cc41fe 100644 --- a/reactos/ntoskrnl/include/internal/ke.h +++ b/reactos/ntoskrnl/include/internal/ke.h @@ -29,6 +29,14 @@ #include "arch/ke.h" + + +extern LARGE_INTEGER SystemBootTime; +extern ULONG KiKernelTime; +extern ULONG KiUserTime; +extern ULONG KiDpcTime; + + /* INTERNAL KERNEL FUNCTIONS ************************************************/ #ifdef __USE_W32API diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index 028d2158138..737fb22f230 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -10,6 +10,8 @@ /* TYPES *********************************************************************/ +extern ULONG MiNrAvailablePages; + struct _EPROCESS; struct _MM_RMAP_ENTRY; diff --git a/reactos/ntoskrnl/ke/timer.c b/reactos/ntoskrnl/ke/timer.c index e6aa0f0d0fc..811f3889a8e 100644 --- a/reactos/ntoskrnl/ke/timer.c +++ b/reactos/ntoskrnl/ke/timer.c @@ -1,4 +1,4 @@ -/* $Id: timer.c,v 1.67 2004/01/18 22:32:47 gdalsnes Exp $ +/* $Id: timer.c,v 1.68 2004/04/14 07:10:58 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -33,11 +33,15 @@ * Current time */ #if defined(__GNUC__) -static LARGE_INTEGER SystemBootTime = (LARGE_INTEGER)0LL; +LARGE_INTEGER SystemBootTime = (LARGE_INTEGER)0LL; #else -static LARGE_INTEGER SystemBootTime = { 0 }; +LARGE_INTEGER SystemBootTime = { 0 }; #endif +ULONG KiKernelTime; +ULONG KiUserTime; +ULONG KiDpcTime; + /* * Number of timer interrupts since initialisation */ @@ -596,6 +600,9 @@ KiUpdateSystemTime(KIRQL oldIrql, */ { LARGE_INTEGER Time; + PKTHREAD CurrentThread; + PKPROCESS CurrentProcess; + assert(KeGetCurrentIrql() == PROFILE_LEVEL); KiRawTicks++; @@ -626,6 +633,23 @@ KiUpdateSystemTime(KIRQL oldIrql, SharedUserData->SystemTime.LowPart = Time.u.LowPart; SharedUserData->SystemTime.High1Part = Time.u.HighPart; + + CurrentThread = KeGetCurrentThread(); + CurrentProcess = KeGetCurrentProcess(); + + if (CurrentThread->PreviousMode == UserMode) + { + ++CurrentThread->UserTime; + ++CurrentProcess->UserTime; + ++KiUserTime; + } + if (CurrentThread->PreviousMode == KernelMode) + { + ++CurrentProcess->KernelTime; + ++CurrentThread->KernelTime; + ++KiKernelTime; + } + KiReleaseSpinLock(&TimerValueLock); /* diff --git a/reactos/ntoskrnl/mm/balance.c b/reactos/ntoskrnl/mm/balance.c index 3ed4d1c49ba..6a2ac0a6041 100644 --- a/reactos/ntoskrnl/mm/balance.c +++ b/reactos/ntoskrnl/mm/balance.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: balance.c,v 1.27 2004/04/10 22:35:25 gdalsnes Exp $ +/* $Id: balance.c,v 1.28 2004/04/14 07:11:08 jimtabor Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/balance.c @@ -57,7 +57,7 @@ MM_ALLOCATION_REQUEST, *PMM_ALLOCATION_REQUEST; static MM_MEMORY_CONSUMER MiMemoryConsumers[MC_MAXIMUM]; static ULONG MiMinimumAvailablePages; -static ULONG MiNrAvailablePages; +ULONG MiNrAvailablePages; static ULONG MiNrTotalPages; static LIST_ENTRY AllocationListHead; static KSPIN_LOCK AllocationListLock; From 93a7d0e19d164f304110e1e777c9c2b35e719c77 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 14 Apr 2004 12:17:26 +0000 Subject: [PATCH 0886/1463] Fix by Marc Schtz. svn path=/trunk/; revision=9137 --- reactos/ntoskrnl/include/internal/ke.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/ke.h b/reactos/ntoskrnl/include/internal/ke.h index fe638cc41fe..7bf5801bd46 100644 --- a/reactos/ntoskrnl/include/internal/ke.h +++ b/reactos/ntoskrnl/include/internal/ke.h @@ -30,12 +30,12 @@ #include "arch/ke.h" - +#ifndef __ASM__ extern LARGE_INTEGER SystemBootTime; extern ULONG KiKernelTime; extern ULONG KiUserTime; extern ULONG KiDpcTime; - +#endif /* INTERNAL KERNEL FUNCTIONS ************************************************/ From b325c3fecb53788776d0cbae2a51d2f16049295c Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 14 Apr 2004 17:14:45 +0000 Subject: [PATCH 0887/1463] Need more time to work audit patch svn path=/trunk/; revision=9138 --- reactos/ntoskrnl/ke/timer.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/reactos/ntoskrnl/ke/timer.c b/reactos/ntoskrnl/ke/timer.c index 811f3889a8e..ba0dbede233 100644 --- a/reactos/ntoskrnl/ke/timer.c +++ b/reactos/ntoskrnl/ke/timer.c @@ -1,4 +1,4 @@ -/* $Id: timer.c,v 1.68 2004/04/14 07:10:58 jimtabor Exp $ +/* $Id: timer.c,v 1.69 2004/04/14 17:14:45 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -600,9 +600,10 @@ KiUpdateSystemTime(KIRQL oldIrql, */ { LARGE_INTEGER Time; +/* PKTHREAD CurrentThread; PKPROCESS CurrentProcess; - + */ assert(KeGetCurrentIrql() == PROFILE_LEVEL); KiRawTicks++; @@ -633,7 +634,7 @@ KiUpdateSystemTime(KIRQL oldIrql, SharedUserData->SystemTime.LowPart = Time.u.LowPart; SharedUserData->SystemTime.High1Part = Time.u.HighPart; - +/* CurrentThread = KeGetCurrentThread(); CurrentProcess = KeGetCurrentProcess(); @@ -649,7 +650,8 @@ KiUpdateSystemTime(KIRQL oldIrql, ++CurrentThread->KernelTime; ++KiKernelTime; } - + */ + KiReleaseSpinLock(&TimerValueLock); /* From 81a46fb20dd35dba4fd9cf58b04cb34142934ed3 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 14 Apr 2004 17:19:38 +0000 Subject: [PATCH 0888/1463] fixed major bugs in the message queue svn path=/trunk/; revision=9139 --- reactos/subsys/win32k/include/winpos.h | 2 +- reactos/subsys/win32k/ntuser/msgqueue.c | 234 ++++++++++++++---------- reactos/subsys/win32k/ntuser/window.c | 4 +- reactos/subsys/win32k/ntuser/winpos.c | 13 +- 4 files changed, 143 insertions(+), 110 deletions(-) diff --git a/reactos/subsys/win32k/include/winpos.h b/reactos/subsys/win32k/include/winpos.h index 2929d8137de..2255a772a73 100644 --- a/reactos/subsys/win32k/include/winpos.h +++ b/reactos/subsys/win32k/include/winpos.h @@ -29,7 +29,7 @@ WinPosSetWindowPos(HWND Wnd, HWND WndInsertAfter, INT x, INT y, INT cx, BOOLEAN FASTCALL WinPosShowWindow(HWND Wnd, INT Cmd); USHORT FASTCALL -WinPosWindowFromPoint(PWINDOW_OBJECT ScopeWin, BOOL SendHitTestMessage, POINT *WinPoint, +WinPosWindowFromPoint(PWINDOW_OBJECT ScopeWin, PUSER_MESSAGE_QUEUE OnlyHitTests, POINT *WinPoint, PWINDOW_OBJECT* Window); VOID FASTCALL WinPosActivateOtherWindow(PWINDOW_OBJECT Window); diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index df0c98b72b4..9dc9505a0e3 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.83 2004/04/13 13:50:31 weiden Exp $ +/* $Id: msgqueue.c,v 1.84 2004/04/14 17:19:38 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -249,65 +249,73 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, PWINDOW_OBJECT Window = NULL; HWND CaptureWin; POINT Point; - + + ThreadQueue = PsGetWin32Thread()->MessageQueue; + if (Msg == WM_LBUTTONDOWN || Msg == WM_MBUTTONDOWN || Msg == WM_RBUTTONDOWN || Msg == WM_XBUTTONDOWN) { - *HitTest = WinPosWindowFromPoint(ScopeWin, !FromGlobalQueue, &Message->Msg.pt, &Window); - if(Window && FromGlobalQueue && (PsGetWin32Thread()->MessageQueue == Window->MessageQueue)) - { - *HitTest = IntSendMessage(Window->Self, WM_NCHITTEST, 0, - MAKELONG(Message->Msg.pt.x, Message->Msg.pt.y)); - } + *HitTest = WinPosWindowFromPoint(ScopeWin, ThreadQueue, &Message->Msg.pt, &Window); /* **Make sure that we have a window that is not already in focus */ - if (Window) + if (Window && (Window->Self != IntGetFocusWindow())) { - if(Window->Self != IntGetFocusWindow()) + if(ThreadQueue == Window->MessageQueue) { + /* only get a more detailed hit-test if the window is in the same thread! */ + *HitTest = IntSendMessage(Window->Self, WM_NCHITTEST, 0, + MAKELONG(Message->Msg.pt.x, Message->Msg.pt.y)); + } + if(*HitTest != (USHORT)HTTRANSPARENT) + { + LRESULT Result; - if(*HitTest != (USHORT)HTTRANSPARENT) - { - LRESULT Result; + /* Sending a message to another thread might lock up our own when it's + hung, so just send messages to our own thread */ + if(Window->MessageQueue == ThreadQueue) Result = IntSendMessage(Window->Self, WM_MOUSEACTIVATE, (WPARAM)NtUserGetParent(Window->Self), (LPARAM)MAKELONG(*HitTest, Msg)); - - switch (Result) - { - case MA_NOACTIVATEANDEAT: - *Freed = FALSE; - IntReleaseWindowObject(Window); - return TRUE; - case MA_NOACTIVATE: - break; - case MA_ACTIVATEANDEAT: - IntMouseActivateWindow(Window); - IntReleaseWindowObject(Window); - *Freed = FALSE; - return TRUE; -/* case MA_ACTIVATE: - case 0:*/ - default: - IntMouseActivateWindow(Window); - break; - } - } else { - IntReleaseWindowObject(Window); - if(RemoveWhenFreed) - { - RemoveEntryList(&Message->ListEntry); - } - ExFreePool(Message); - *Freed = TRUE; - return(FALSE); + /* just post WM_MOUSEACTIVATE to the other thread */ + NtUserPostMessage(Window->Self, WM_MOUSEACTIVATE, (WPARAM)NtUserGetParent(Window->Self), (LPARAM)MAKELONG(*HitTest, Msg)); + /* and assume that windows of other threads should always be activated. */ + Result = MA_ACTIVATE; + } + + switch (Result) + { + case MA_NOACTIVATEANDEAT: + *Freed = FALSE; + IntReleaseWindowObject(Window); + return TRUE; + case MA_NOACTIVATE: + break; + case MA_ACTIVATEANDEAT: + IntMouseActivateWindow(Window); + IntReleaseWindowObject(Window); + *Freed = FALSE; + return TRUE; + default: + /* MA_ACTIVATE */ + IntMouseActivateWindow(Window); + break; } } + else + { + IntReleaseWindowObject(Window); + if(RemoveWhenFreed) + { + RemoveEntryList(&Message->ListEntry); + } + ExFreePool(Message); + *Freed = TRUE; + return(FALSE); + } } - } CaptureWin = IntGetCaptureWindow(); @@ -325,8 +333,8 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, { if(!Window) { - *HitTest = WinPosWindowFromPoint(ScopeWin, !FromGlobalQueue, &Message->Msg.pt, &Window); - if(Window && FromGlobalQueue && (PsGetWin32Thread()->MessageQueue == Window->MessageQueue)) + *HitTest = WinPosWindowFromPoint(ScopeWin, ThreadQueue, &Message->Msg.pt, &Window); + if(Window && (ThreadQueue == Window->MessageQueue)) { *HitTest = IntSendMessage(Window->Self, WM_NCHITTEST, 0, MAKELONG(Message->Msg.pt.x, Message->Msg.pt.y)); @@ -358,7 +366,6 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, return(FALSE); } - ThreadQueue = PsGetWin32Thread()->MessageQueue; if (Window->MessageQueue != ThreadQueue) { if (! FromGlobalQueue) @@ -379,70 +386,33 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, ThreadQueue->MouseMoveMsg = NULL; } } + + /* lock the destination message queue, so we don't get in trouble with other + threads, messing with it at the same time */ IntLockHardwareMessageQueue(Window->MessageQueue); - if((Message->Msg.message == WM_MOUSEMOVE) && Window->MessageQueue->MouseMoveMsg) + InsertTailList(&Window->MessageQueue->HardwareMessagesListHead, + &Message->ListEntry); + if(Message->Msg.message == WM_MOUSEMOVE) { - /* we do not hold more than one WM_MOUSEMOVE message in the queue */ - Window->MessageQueue->MouseMoveMsg->Msg = Message->Msg; - if(RemoveWhenFreed && FromGlobalQueue) + if(Window->MessageQueue->MouseMoveMsg) { - RemoveEntryList(&Message->ListEntry); + /* remove the old WM_MOUSEMOVE message, we're processing a more recent + one */ + RemoveEntryList(&Window->MessageQueue->MouseMoveMsg->ListEntry); + ExFreePool(Window->MessageQueue->MouseMoveMsg); } - *Freed = TRUE; - } - else - { - InsertTailList(&Window->MessageQueue->HardwareMessagesListHead, - &Message->ListEntry); - if(Message->Msg.message == WM_MOUSEMOVE) - { - Window->MessageQueue->MouseMoveMsg = Message; - } - *Freed = FALSE; + /* save the pointer to the WM_MOUSEMOVE message in the new queue */ + Window->MessageQueue->MouseMoveMsg = Message; } IntUnLockHardwareMessageQueue(Window->MessageQueue); - if(*Freed) - { - ExFreePool(Message); - } + KeSetEvent(&Window->MessageQueue->NewMessages, IO_NO_INCREMENT, FALSE); + *Freed = FALSE; IntReleaseWindowObject(Window); return(FALSE); } - if (hWnd != NULL && Window->Self != hWnd && - !IntIsChildWindow(hWnd, Window->Self)) - { - IntLockHardwareMessageQueue(Window->MessageQueue); - if((Message->Msg.message == WM_MOUSEMOVE) && Window->MessageQueue->MouseMoveMsg) - { - /* we do not hold more than one WM_MOUSEMOVE message in the queue */ - Window->MessageQueue->MouseMoveMsg->Msg = Message->Msg; - if(RemoveWhenFreed) - { - RemoveEntryList(&Message->ListEntry); - } - *Freed = TRUE; - } - else - { - InsertTailList(&Window->MessageQueue->HardwareMessagesListHead, - &Message->ListEntry); - if(Message->Msg.message == WM_MOUSEMOVE) - { - Window->MessageQueue->MouseMoveMsg = Message; - } - *Freed = FALSE; - } - IntUnLockHardwareMessageQueue(Window->MessageQueue); - if(*Freed) - { - ExFreePool(Message); - } - KeSetEvent(&Window->MessageQueue->NewMessages, IO_NO_INCREMENT, FALSE); - IntReleaseWindowObject(Window); - return(FALSE); - } + /* From here on, we're in the same message queue as the caller! */ switch (Msg) { @@ -487,7 +457,43 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, } } - /* FIXME: Check message filter. */ + if(hWnd != NULL && Window->Self != hWnd) + { + /* Reject the message because it doesn't match the filter */ + + if(FromGlobalQueue) + { + /* Lock the message queue so no other thread can mess with it. + Our own message queue is not locked while fetching from the global + queue, so we have to make sure nothing interferes! */ + IntLockHardwareMessageQueue(Window->MessageQueue); + /* if we're from the global queue, we need to add our message to our + private queue so we don't loose it! */ + InsertTailList(&Window->MessageQueue->HardwareMessagesListHead, + &Message->ListEntry); + } + + if (Message->Msg.message == WM_MOUSEMOVE) + { + if(Window->MessageQueue->MouseMoveMsg) + { + /* delete the old message */ + RemoveEntryList(&Window->MessageQueue->MouseMoveMsg->ListEntry); + ExFreePool(Window->MessageQueue->MouseMoveMsg); + } + /* always save a pointer to this WM_MOUSEMOVE message here because we're + sure that the message is in the private queue */ + Window->MessageQueue->MouseMoveMsg = Message; + } + if(FromGlobalQueue) + { + IntUnLockHardwareMessageQueue(Window->MessageQueue); + } + + IntReleaseWindowObject(Window); + *Freed = FALSE; + return(FALSE); + } if (Remove) { @@ -496,6 +502,34 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, Message->Msg.lParam = MAKELONG(Point.x, Point.y); } + /* remove the reference to the current WM_MOUSEMOVE message, if this message + is it */ + if (Message->Msg.message == WM_MOUSEMOVE) + { + if(FromGlobalQueue) + { + /* Lock the message queue so no other thread can mess with it. + Our own message queue is not locked while fetching from the global + queue, so we have to make sure nothing interferes! */ + IntLockHardwareMessageQueue(Window->MessageQueue); + if(Window->MessageQueue->MouseMoveMsg) + { + /* delete the WM_MOUSEMOVE message in the private queue, we're dealing + with one that's been sent later */ + RemoveEntryList(&Window->MessageQueue->MouseMoveMsg->ListEntry); + ExFreePool(Window->MessageQueue->MouseMoveMsg); + /* our message is not in the private queue so we can remove the pointer + instead of setting it to the current message we're processing */ + Window->MessageQueue->MouseMoveMsg = NULL; + } + IntUnLockHardwareMessageQueue(Window->MessageQueue); + } + else if(Window->MessageQueue->MouseMoveMsg == Message) + { + Window->MessageQueue->MouseMoveMsg = NULL; + } + } + IntReleaseWindowObject(Window); *Freed = FALSE; return(TRUE); diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index eb3e9ec7813..31bb7a45ae3 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.216 2004/04/13 23:25:54 weiden Exp $ +/* $Id: window.c,v 1.217 2004/04/14 17:19:38 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -3715,7 +3715,7 @@ NtUserWindowFromPoint(LONG X, LONG Y) pt.x = X; pt.y = Y; - Hit = WinPosWindowFromPoint(DesktopWindow, TRUE, &pt, &Window); + Hit = WinPosWindowFromPoint(DesktopWindow, PsGetWin32Thread()->MessageQueue, &pt, &Window); if(Window) { diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index 298fb67cf92..b96ca05b04a 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.110 2004/04/13 23:12:30 weiden Exp $ +/* $Id: winpos.c,v 1.111 2004/04/14 17:19:38 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1368,7 +1368,7 @@ WinPosShowWindow(HWND Wnd, INT Cmd) } VOID STATIC FASTCALL -WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, BOOL SendHitTestMessage, POINT *Point, +WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, PUSER_MESSAGE_QUEUE OnlyHitTests, POINT *Point, PWINDOW_OBJECT* Window, USHORT *HitTest) { PWINDOW_OBJECT Current; @@ -1400,8 +1400,7 @@ WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, BOOL SendHitTestMessage, POINT *Po return; } - if(SendHitTestMessage && - (Current->MessageQueue == PsGetWin32Thread()->MessageQueue)) + if(OnlyHitTests && (Current->MessageQueue == OnlyHitTests)) { *HitTest = IntSendMessage(Current->Self, WM_NCHITTEST, 0, MAKELONG(Point->x, Point->y)); @@ -1420,7 +1419,7 @@ WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, BOOL SendHitTestMessage, POINT *Po Point->y >= Current->ClientRect.top && Point->y < Current->ClientRect.bottom) { - WinPosSearchChildren(Current, SendHitTestMessage, Point, Window, HitTest); + WinPosSearchChildren(Current, OnlyHitTests, Point, Window, HitTest); ExFreePool(List); return; } @@ -1435,7 +1434,7 @@ WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, BOOL SendHitTestMessage, POINT *Po } USHORT FASTCALL -WinPosWindowFromPoint(PWINDOW_OBJECT ScopeWin, BOOL SendHitTestMessage, POINT *WinPoint, +WinPosWindowFromPoint(PWINDOW_OBJECT ScopeWin, PUSER_MESSAGE_QUEUE OnlyHitTests, POINT *WinPoint, PWINDOW_OBJECT* Window) { HWND DesktopWindowHandle; @@ -1468,7 +1467,7 @@ WinPosWindowFromPoint(PWINDOW_OBJECT ScopeWin, BOOL SendHitTestMessage, POINT *W HitTest = HTNOWHERE; - WinPosSearchChildren(ScopeWin, SendHitTestMessage, &Point, Window, &HitTest); + WinPosSearchChildren(ScopeWin, OnlyHitTests, &Point, Window, &HitTest); return ((*Window) ? HitTest : HTNOWHERE); } From 9816ef1a2b9d5a0edb86b74d288cde8db52d8e4b Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 14 Apr 2004 17:35:47 +0000 Subject: [PATCH 0889/1463] forgot to commit a fix svn path=/trunk/; revision=9140 --- reactos/subsys/win32k/ntuser/msgqueue.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index 9dc9505a0e3..99c989e211b 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.84 2004/04/14 17:19:38 weiden Exp $ +/* $Id: msgqueue.c,v 1.85 2004/04/14 17:35:47 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -457,7 +457,8 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, } } - if(hWnd != NULL && Window->Self != hWnd) + if((hWnd != NULL && Window->Self != hWnd) || + ((FilterLow != 0 || FilterLow != 0) && (Msg < FilterLow || Msg > FilterHigh))) { /* Reject the message because it doesn't match the filter */ @@ -475,7 +476,8 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, if (Message->Msg.message == WM_MOUSEMOVE) { - if(Window->MessageQueue->MouseMoveMsg) + if(Window->MessageQueue->MouseMoveMsg && + (Window->MessageQueue->MouseMoveMsg != Message)) { /* delete the old message */ RemoveEntryList(&Window->MessageQueue->MouseMoveMsg->ListEntry); From 34ec714d1b61d6a3a8550b2da6898964fc0fb078 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 14 Apr 2004 19:06:02 +0000 Subject: [PATCH 0890/1463] treat WM_NCMOUSEMOVE message as WM_MOUSEMOVE messages svn path=/trunk/; revision=9141 --- reactos/subsys/win32k/ntuser/msgqueue.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index 99c989e211b..2da18bbde46 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.85 2004/04/14 17:35:47 weiden Exp $ +/* $Id: msgqueue.c,v 1.86 2004/04/14 19:06:02 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -249,6 +249,7 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, PWINDOW_OBJECT Window = NULL; HWND CaptureWin; POINT Point; + BOOL BtnClick; ThreadQueue = PsGetWin32Thread()->MessageQueue; @@ -504,9 +505,10 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, Message->Msg.lParam = MAKELONG(Point.x, Point.y); } - /* remove the reference to the current WM_MOUSEMOVE message, if this message + /* remove the reference to the current WM_(NC)MOUSEMOVE message, if this message is it */ - if (Message->Msg.message == WM_MOUSEMOVE) + if (Message->Msg.message == WM_MOUSEMOVE || + Message->Msg.message == WM_NCMOUSEMOVE) { if(FromGlobalQueue) { @@ -516,7 +518,7 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, IntLockHardwareMessageQueue(Window->MessageQueue); if(Window->MessageQueue->MouseMoveMsg) { - /* delete the WM_MOUSEMOVE message in the private queue, we're dealing + /* delete the WM_(NC)MOUSEMOVE message in the private queue, we're dealing with one that's been sent later */ RemoveEntryList(&Window->MessageQueue->MouseMoveMsg->ListEntry); ExFreePool(Window->MessageQueue->MouseMoveMsg); From c62a106e0cbf4a7e5617ec7bdfd92f2ea3ea2f65 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 14 Apr 2004 19:07:14 +0000 Subject: [PATCH 0891/1463] removed unused variable svn path=/trunk/; revision=9142 --- reactos/subsys/win32k/ntuser/msgqueue.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index 2da18bbde46..b2be9121319 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.86 2004/04/14 19:06:02 weiden Exp $ +/* $Id: msgqueue.c,v 1.87 2004/04/14 19:07:14 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -249,7 +249,6 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, PWINDOW_OBJECT Window = NULL; HWND CaptureWin; POINT Point; - BOOL BtnClick; ThreadQueue = PsGetWin32Thread()->MessageQueue; From 78b070f6b0b253b5393d27739ab9f594ab1f1390 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 14 Apr 2004 20:18:12 +0000 Subject: [PATCH 0892/1463] enable a debug message svn path=/trunk/; revision=9143 --- reactos/subsys/win32k/ntuser/message.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/message.c b/reactos/subsys/win32k/ntuser/message.c index 64ee4e69ea3..b90a281807a 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.57 2004/04/13 13:50:31 weiden Exp $ +/* $Id: message.c,v 1.58 2004/04/14 20:18:12 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -106,7 +106,7 @@ IntDispatchMessage(MSG* Msg) if(WindowObject->OwnerThread != PsGetCurrentThread()) { IntReleaseWindowObject(WindowObject); - DPRINT("Window doesn't belong to the calling thread!\n"); + DPRINT1("Window doesn't belong to the calling thread!\n"); return 0; } /* FIXME: Call hook procedures. */ @@ -265,10 +265,12 @@ IntPeekMessage(LPMSG Msg, ; /* Now look for a quit message. */ - /* FIXME: WINE checks the message number filter here. */ + if (ThreadQueue->QuitPosted) { - Msg->hwnd = Wnd; + /* According to the PSDK, WM_QUIT messages are always returned, regardless + of the filter specified */ + Msg->hwnd = NULL; Msg->message = WM_QUIT; Msg->wParam = ThreadQueue->QuitExitCode; Msg->lParam = 0; From 9a4b93f87ebf9f8bc545f0ae254bae4b81f465e1 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 14 Apr 2004 23:17:56 +0000 Subject: [PATCH 0893/1463] rewrote NtUserFindWindowEx() so it works as it's supposed to. This function is currently called from FindWindowEx(), however there should be a usermode implementation of FindWindowEx() that sends WM_GETTEXT messages to windows belonging to the caller's process. This is not done and should not be done from the kernel mode version. svn path=/trunk/; revision=9144 --- reactos/lib/user32/windows/window.c | 7 +- reactos/subsys/win32k/ntuser/misc.c | 12 +- reactos/subsys/win32k/ntuser/window.c | 299 +++++++++++++++++++------- 3 files changed, 225 insertions(+), 93 deletions(-) diff --git a/reactos/lib/user32/windows/window.c b/reactos/lib/user32/windows/window.c index 05c631349cc..52eb7ba32ca 100644 --- a/reactos/lib/user32/windows/window.c +++ b/reactos/lib/user32/windows/window.c @@ -1,4 +1,4 @@ -/* $Id: window.c,v 1.110 2004/04/13 16:48:45 weiden Exp $ +/* $Id: window.c,v 1.111 2004/04/14 23:17:55 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -665,7 +665,7 @@ EnumDesktopWindows( /* - * @unimplemented + * @implemented */ HWND STDCALL FindWindowExA(HWND hwndParent, @@ -731,9 +731,6 @@ FindWindowExW(HWND hwndParent, { RtlInitUnicodeString(&ucClassName, lpszClass); } - - // Window names can't be atoms, and if lpszWindow = NULL, - // RtlInitUnicodeString will clear it RtlInitUnicodeString(&ucWindowName, lpszWindow); diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index d702e2ed690..30d47200a06 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.59 2004/04/09 20:03:19 navaraf Exp $ +/* $Id: misc.c,v 1.60 2004/04/14 23:17:56 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -931,17 +931,17 @@ IntSafeCopyUnicodeString(PUNICODE_STRING Dest, return Status; } - if(Dest->MaximumLength > 0) + if(Dest->Length > 0) { Src = Dest->Buffer; - Dest->Buffer = ExAllocatePoolWithTag(NonPagedPool, Dest->MaximumLength, TAG_STRING); + Dest->Buffer = ExAllocatePoolWithTag(NonPagedPool, Dest->Length, TAG_STRING); if(!Dest->Buffer) { return STATUS_NO_MEMORY; } - Status = MmCopyFromCaller(Dest->Buffer, Src, Dest->MaximumLength); + Status = MmCopyFromCaller(Dest->Buffer, Src, Dest->Length); if(!NT_SUCCESS(Status)) { ExFreePool(Dest->Buffer); @@ -952,6 +952,8 @@ IntSafeCopyUnicodeString(PUNICODE_STRING Dest, return STATUS_SUCCESS; } - return STATUS_UNSUCCESSFUL; + + /* string is empty */ + return STATUS_SUCCESS; } diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 31bb7a45ae3..94b68e72750 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.217 2004/04/14 17:19:38 weiden Exp $ +/* $Id: window.c,v 1.218 2004/04/14 23:17:56 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -2050,6 +2050,60 @@ NtUserFillWindow(DWORD Unknown0, } +HWND FASTCALL +IntFindWindow(PWINDOW_OBJECT Parent, + PWINDOW_OBJECT ChildAfter, + PWNDCLASS_OBJECT ClassObject, + PUNICODE_STRING WindowName) +{ + BOOL CheckWindowName; + HWND *List, *phWnd; + HWND Ret = NULL; + + ASSERT(Parent); + + CheckWindowName = (WindowName && (WindowName->Length > 0)); + + if((List = IntWinListChildren(Parent))) + { + phWnd = List; + if(ChildAfter) + { + /* skip handles before and including ChildAfter */ + while(*phWnd && (*(phWnd++) != ChildAfter->Self)); + } + + /* search children */ + while(*phWnd) + { + PWINDOW_OBJECT Child; + if(!(Child = IntGetWindowObject(*(phWnd++)))) + { + continue; + } + + /* Do not send WM_GETTEXT messages in the kernel mode version! + The user mode version however calls GetWindowText() which will + send WM_GETTEXT messages to windows belonging to its processes */ + if(((!CheckWindowName || (CheckWindowName && !RtlCompareUnicodeString(WindowName, &(Child->WindowName), FALSE))) && + (!ClassObject || (ClassObject && (Child->Class == ClassObject)))) + || + ((!CheckWindowName || (CheckWindowName && !RtlCompareUnicodeString(WindowName, &(Child->WindowName), FALSE))) && + (!ClassObject || (ClassObject && (Child->Class == ClassObject))))) + { + Ret = Child->Self; + IntReleaseWindowObject(Child); + break; + } + + IntReleaseWindowObject(Child); + } + ExFreePool(List); + } + + return Ret; +} + /* * FUNCTION: * Searches a window's children for a window with the specified @@ -2057,6 +2111,7 @@ NtUserFillWindow(DWORD Unknown0, * ARGUMENTS: * hwndParent = The window whose childs are to be searched. * NULL = desktop + * HWND_MESSAGE = message-only windows * * hwndChildAfter = Search starts after this child window. * NULL = start from beginning @@ -2069,10 +2124,6 @@ NtUserFillWindow(DWORD Unknown0, * * RETURNS: * The HWND of the window if it was found, otherwise NULL - * - * FIXME: - * Should use MmCopyFromCaller, we don't want an access violation in here - * */ /* * @implemented @@ -2083,97 +2134,179 @@ NtUserFindWindowEx(HWND hwndParent, PUNICODE_STRING ucClassName, PUNICODE_STRING ucWindowName) { - NTSTATUS status; - HWND windowHandle; - PWINDOW_OBJECT ParentWindow, WndChildAfter, WndChild; - PWNDCLASS_OBJECT classObject = NULL; - - DPRINT1("NtUserFindWindowEx(%x,%x,%wZ,%wZ)\n", - hwndParent, hwndChildAfter, ucClassName, ucWindowName); + PWINDOW_OBJECT Parent, ChildAfter; + UNICODE_STRING ClassName, WindowName; + NTSTATUS Status; + HWND Desktop, Ret = NULL; + PWNDCLASS_OBJECT ClassObject = NULL; - // Get a pointer to the class - if (ucClassName->Buffer != NULL) - { - status = ClassReferenceClassByNameOrAtom(&classObject, ucClassName->Buffer); - if (!NT_SUCCESS(status)) - { - DPRINT1("Error 1\n"); - return NULL; - } - } + Desktop = IntGetDesktopWindow(); - // If hwndParent==NULL use the desktop window instead - if(!hwndParent) - hwndParent = PsGetWin32Thread()->Desktop->DesktopWindow; - - // Get the object - ParentWindow = IntGetWindowObject(hwndParent); - - if(!ParentWindow) - { - if (classObject != NULL) - ObmDereferenceObject(classObject); - DPRINT1("Error 2\n"); - return NULL; - } - - IntLockRelatives(ParentWindow); - - if(hwndChildAfter) + if(hwndParent == NULL) + hwndParent = Desktop; + /* FIXME + else if(hwndParent == HWND_MESSAGE) { - if (!(WndChildAfter = IntGetWindowObject(hwndChildAfter))) + hwndParent = IntGetMessageWindow(); + } + */ + + if(!(Parent = IntGetWindowObject(hwndParent))) + { + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + return NULL; + } + + ChildAfter = NULL; + if(hwndChildAfter && !(ChildAfter = IntGetWindowObject(hwndChildAfter))) + { + IntReleaseWindowObject(hwndParent); + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + return NULL; + } + + /* copy the window name */ + Status = IntSafeCopyUnicodeString(&WindowName, ucWindowName); + if(!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + goto Cleanup3; + } + + /* safely copy the class name */ + Status = MmCopyFromCaller(&ClassName, ucClassName, sizeof(UNICODE_STRING)); + if(!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + goto Cleanup2; + } + if(ClassName.Length > 0 && ClassName.Buffer) + { + WCHAR *buf; + /* safely copy the class name string (NULL terminated because class-lookup + depends on it... */ + buf = ExAllocatePoolWithTag(NonPagedPool, ClassName.Length + sizeof(WCHAR), TAG_STRING); + if(!buf) { - SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); - DPRINT1("Error 3\n"); - return NULL; + SetLastWin32Error(STATUS_INSUFFICIENT_RESOURCES); + goto Cleanup2; } - - /* must be a direct child (not a decendant child)*/ - IntLockRelatives(WndChildAfter); - if (WndChildAfter->Parent != ParentWindow->Self) + Status = MmCopyFromCaller(buf, ClassName.Buffer, ClassName.Length); + if(!NT_SUCCESS(Status)) { - DPRINT1("Error 4\n"); - IntUnLockRelatives(WndChildAfter); - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return NULL; + ExFreePool(buf); + SetLastNtError(Status); + goto Cleanup2; } - IntUnLockRelatives(WndChildAfter); + ClassName.Buffer = buf; + /* make sure the string is null-terminated */ + buf += ClassName.Length / sizeof(WCHAR); + *buf = L'\0'; + } + + /* find the class object */ + if(ClassName.Buffer) + { + /* this expects the string in ClassName to be NULL-terminated! */ + Status = ClassReferenceClassByNameOrAtom(&ClassObject, ClassName.Buffer); + if(!NT_SUCCESS(Status)) + { + DPRINT1("Window class not found\n"); + /* windows returns ERROR_FILE_NOT_FOUND !? */ + SetLastWin32Error(ERROR_FILE_NOT_FOUND); + goto Cleanup; + } + } + + if(Parent->Self == Desktop) + { + HWND *List, *phWnd; + PWINDOW_OBJECT TopLevelWindow; + BOOL CheckWindowName; - WndChild = WndChildAfter->NextSibling; + /* windows searches through all top-level windows if the parent is the desktop + window */ + + if((List = IntWinListChildren(Parent))) + { + phWnd = List; + + if(ChildAfter) + { + /* skip handles before and including ChildAfter */ + while(*phWnd && (*(phWnd++) != ChildAfter->Self)); + } + + CheckWindowName = WindowName.Length > 0; + + /* search children */ + while(*phWnd) + { + if(!(TopLevelWindow = IntGetWindowObject(*(phWnd++)))) + { + continue; + } + + /* Do not send WM_GETTEXT messages in the kernel mode version! + The user mode version however calls GetWindowText() which will + send WM_GETTEXT messages to windows belonging to its processes */ + if(((!CheckWindowName || (CheckWindowName && !RtlCompareUnicodeString(&WindowName, &(TopLevelWindow->WindowName), FALSE))) && + (!ClassObject || (ClassObject && (TopLevelWindow->Class == ClassObject)))) + || + ((!CheckWindowName || (CheckWindowName && !RtlCompareUnicodeString(&WindowName, &(TopLevelWindow->WindowName), FALSE))) && + (!ClassObject || (ClassObject && (TopLevelWindow->Class == ClassObject))))) + { + Ret = TopLevelWindow->Self; + IntReleaseWindowObject(TopLevelWindow); + break; + } + + if(IntFindWindow(TopLevelWindow, NULL, ClassObject, &WindowName)) + { + /* window returns the handle of the top-level window, in case it found + the child window */ + Ret = TopLevelWindow->Self; + IntReleaseWindowObject(TopLevelWindow); + break; + } + + IntReleaseWindowObject(TopLevelWindow); + } + ExFreePool(List); + } } else + Ret = IntFindWindow(Parent, ChildAfter, ClassObject, &WindowName); + +#if 0 + if(Ret == NULL && hwndParent == NULL && hwndChildAfter == NULL) { - WndChild = ParentWindow->FirstChild; - } - - while (WndChild) - { - if ((classObject == NULL || classObject == WndChild->Class) && - (ucWindowName->Buffer==NULL || - RtlCompareUnicodeString (ucWindowName, &WndChild->WindowName, TRUE) == 0)) - { - windowHandle = WndChild->Self; - - IntUnLockRelatives(ParentWindow); - IntReleaseWindowObject(ParentWindow); - if (classObject != NULL) - ObmDereferenceObject (classObject); - - DPRINT1("Success: %x\n", windowHandle); - return windowHandle; - } + /* FIXME - if both hwndParent and hwndChildAfter are NULL, we also should + search the message-only windows. Should this also be done if + Parent is the desktop window??? */ + PWINDOW_OBJECT MsgWindows; - WndChild = WndChild->NextSibling; + if((MsgWindows = IntGetWindowObject(IntGetMessageWindow()))) + { + Ret = IntFindWindow(MsgWindows, ChildAfter, ClassObject, &WindowName); + IntReleaseWindowObject(MsgWindows); + } } - - IntUnLockRelatives(ParentWindow); - - IntReleaseWindowObject(ParentWindow); - if (classObject != NULL) - ObmDereferenceObject (classObject); - - DPRINT1("Not found\n"); - return NULL; +#endif + + Cleanup: + if(ClassName.Length > 0 && ClassName.Buffer) + ExFreePool(ClassName.Buffer); + + Cleanup2: + RtlFreeUnicodeString(&WindowName); + + Cleanup3: + if(ChildAfter) + IntReleaseWindowObject(ChildAfter); + IntReleaseWindowObject(Parent); + + return Ret; } From a746bec6f1f318361670bdc2fc7ae1f9c136384a Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 14 Apr 2004 23:32:53 +0000 Subject: [PATCH 0894/1463] Improved Passive Level kernel and user time counters. svn path=/trunk/; revision=9145 --- reactos/ntoskrnl/include/internal/ke.h | 9 ++-- reactos/ntoskrnl/ke/i386/irq.c | 7 ++- reactos/ntoskrnl/ke/timer.c | 59 ++++++++++++++------------ 3 files changed, 45 insertions(+), 30 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/ke.h b/reactos/ntoskrnl/include/internal/ke.h index 7bf5801bd46..0069df63d02 100644 --- a/reactos/ntoskrnl/include/internal/ke.h +++ b/reactos/ntoskrnl/include/internal/ke.h @@ -32,9 +32,9 @@ #ifndef __ASM__ extern LARGE_INTEGER SystemBootTime; -extern ULONG KiKernelTime; -extern ULONG KiUserTime; -extern ULONG KiDpcTime; +extern volatile ULONG KiKernelTime; +extern volatile ULONG KiUserTime; +extern volatile ULONG KiDpcTime; #endif /* INTERNAL KERNEL FUNCTIONS ************************************************/ @@ -136,6 +136,9 @@ KeBugCheckWithTf(ULONG BugCheckCode, VOID KiDumpTrapFrame(PKTRAP_FRAME Tf, ULONG ExceptionNr, ULONG cr2); +VOID +KiUpdateProcessThreadTime(VOID); + #endif /* not __ASM__ */ #define MAXIMUM_PROCESSORS 32 diff --git a/reactos/ntoskrnl/ke/i386/irq.c b/reactos/ntoskrnl/ke/i386/irq.c index adcf14de105..da2757a88d8 100644 --- a/reactos/ntoskrnl/ke/i386/irq.c +++ b/reactos/ntoskrnl/ke/i386/irq.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: irq.c,v 1.41 2004/03/09 21:49:53 dwelch Exp $ +/* $Id: irq.c,v 1.42 2004/04/14 23:32:38 jimtabor Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/i386/irq.c @@ -521,6 +521,11 @@ KiInterruptDispatch (ULONG irq, PKIRQ_TRAPFRAME Trapframe) HalEndSystemInterrupt (old_level, 0); + if (old_level==PASSIVE_LEVEL) + { + KiUpdateProcessThreadTime(); + } + if (old_level==PASSIVE_LEVEL && Trapframe->Cs != KERNEL_CS) { CurrentThread = KeGetCurrentThread(); diff --git a/reactos/ntoskrnl/ke/timer.c b/reactos/ntoskrnl/ke/timer.c index ba0dbede233..52793d68fca 100644 --- a/reactos/ntoskrnl/ke/timer.c +++ b/reactos/ntoskrnl/ke/timer.c @@ -1,4 +1,4 @@ -/* $Id: timer.c,v 1.69 2004/04/14 17:14:45 jimtabor Exp $ +/* $Id: timer.c,v 1.70 2004/04/14 23:32:37 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -38,9 +38,9 @@ LARGE_INTEGER SystemBootTime = (LARGE_INTEGER)0LL; LARGE_INTEGER SystemBootTime = { 0 }; #endif -ULONG KiKernelTime; -ULONG KiUserTime; -ULONG KiDpcTime; +volatile ULONG KiKernelTime; +volatile ULONG KiUserTime; +volatile ULONG KiDpcTime; /* * Number of timer interrupts since initialisation @@ -600,10 +600,7 @@ KiUpdateSystemTime(KIRQL oldIrql, */ { LARGE_INTEGER Time; -/* - PKTHREAD CurrentThread; - PKPROCESS CurrentProcess; - */ + assert(KeGetCurrentIrql() == PROFILE_LEVEL); KiRawTicks++; @@ -634,24 +631,6 @@ KiUpdateSystemTime(KIRQL oldIrql, SharedUserData->SystemTime.LowPart = Time.u.LowPart; SharedUserData->SystemTime.High1Part = Time.u.HighPart; -/* - CurrentThread = KeGetCurrentThread(); - CurrentProcess = KeGetCurrentProcess(); - - if (CurrentThread->PreviousMode == UserMode) - { - ++CurrentThread->UserTime; - ++CurrentProcess->UserTime; - ++KiUserTime; - } - if (CurrentThread->PreviousMode == KernelMode) - { - ++CurrentProcess->KernelTime; - ++CurrentThread->KernelTime; - ++KiKernelTime; - } - */ - KiReleaseSpinLock(&TimerValueLock); /* @@ -694,3 +673,31 @@ KeInitializeTimerImpl(VOID) TimerInitDone = TRUE; DPRINT("Finished KeInitializeTimerImpl()\n"); } + + +VOID +KiUpdateProcessThreadTime(VOID) +{ + PKTHREAD CurrentThread; + PKPROCESS CurrentProcess; + + assert(KeGetCurrentIrql() == PASSIVE_LEVEL); + + CurrentThread = KeGetCurrentThread(); + CurrentProcess = KeGetCurrentProcess(); + + DPRINT("KiKernelTime %u, KiUserTime %u \n", KiKernelTime, KiUserTime); + + if (CurrentThread->PreviousMode == UserMode) + { + ++CurrentThread->UserTime; + ++CurrentProcess->UserTime; + ++KiUserTime; + } + if (CurrentThread->PreviousMode == KernelMode) + { + ++CurrentProcess->KernelTime; + ++CurrentThread->KernelTime; + ++KiKernelTime; + } +} From b5c06d7dbde2cfefe2d3906945e68b288f521441 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 14 Apr 2004 23:40:43 +0000 Subject: [PATCH 0895/1463] better handling of invalid strings in IntSafeCopyUnicodeString() svn path=/trunk/; revision=9146 --- reactos/subsys/win32k/ntuser/misc.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index 30d47200a06..93aab84ce8d 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.60 2004/04/14 23:17:56 weiden Exp $ +/* $Id: misc.c,v 1.61 2004/04/14 23:40:43 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -931,10 +931,16 @@ IntSafeCopyUnicodeString(PUNICODE_STRING Dest, return Status; } - if(Dest->Length > 0) + if(Dest->Length > 0x4000) + { + return STATUS_UNSUCCESSFUL; + } + + Src = Dest->Buffer; + Dest->Buffer = NULL; + + if(Dest->Length > 0 && Src) { - Src = Dest->Buffer; - Dest->Buffer = ExAllocatePoolWithTag(NonPagedPool, Dest->Length, TAG_STRING); if(!Dest->Buffer) { From 5f3c9e9df2998b6355e023c208c0e5783a539070 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Thu, 15 Apr 2004 08:29:57 +0000 Subject: [PATCH 0896/1463] Sync to Wine-20040408: Robert Shearman - Add cursor resource. - Implement TB_MOVEBUTTON. - Implement drag customise. - Send TBN_TOOLBARCHANGE and TBN_DELETINGBUTTON. - Spelling fixes. - Fix subclassing to support nested messages. - Document control completeness. - Remove unneeded include. - Fix TEXT define. - Fix tabs. - Small optimisation in DrawInsert. - Fix LButtonDown from previous change. - Don't use BF_ADJUST flag for dropdown buttons. - Fix LButtonDblClk. - Fix SetBitmapSize. - Fix SetButtonInfo. - Documentation update. - Better hot item handling. - Fix DrawMasked to always use the right image list and bitmap index. - Document completeness. - Finish tooltip support. - Honour WM_SETREDRAW. - Fix all calls of InvalidateRect. - Implement TB_LOADIMAGES, TB_MAPACCELERATOR{A,W}, TB_MARKBUTTON and undocumented message 0x460. - Better debug output of undocumented message 0x45D. - Add support for a toolbar global iListGap. - Make TOOLBAR_CalcToolbar and TOOLBAR_DrawButton not rely on "magic numbers" and calculate sizes and positions more like native. - Rewrite drawing code. - TTM_TRACKACTIVATE can have NULL lParam when deactivating. - Factor out common code from TOOLTIPS_DelTool{A,W}. - Update all indices correctly after delete. - Unicode notification detection should be local to each tool. - Implement TTN_GETDISPINFOW notification. Alexandre Julliard - Do not kill the animation thread with TerminateThread, let it finish properly. - Fixed a couple of races with the animation thread. Juan Lang - Prevent negative coords for line, turn off redraw when initializing, document one difference in native/builtin behavior. Francois Gouget - Assorted spelling fixes. Mike McCormack - Make sure the rebar size is above a minimum. - Make sure to take account of hidden bands during layout. - Don't calculate the redundant and unused REBAR_ROW structures. Filip Navara - Support for RBBS_HIDETITLE style. Ulrich Czekalla - Fix rebar band insertion and non-client calculation in pager control. Huw Davies - Fix dumb error from rev. 1.158. - When setting the buddy to 0 then we must still resize the updown control. - Added CS_HREDRAW. Ge van Geldorp - Explicitly ask for image list with screen depth as ILC_COLOR can/will limit the depth to 4bpp now. svn path=/trunk/; revision=9147 --- reactos/lib/comctl32/.cvsignore | 1 + reactos/lib/comctl32/Makefile.in | 1 + reactos/lib/comctl32/animate.c | 51 +- reactos/lib/comctl32/comboex.c | 2 +- reactos/lib/comctl32/comctl32.h | 1 + reactos/lib/comctl32/commctrl.c | 36 +- reactos/lib/comctl32/draglist.c | 33 +- reactos/lib/comctl32/imagelist.c | 2 +- reactos/lib/comctl32/ipaddress.c | 2 +- reactos/lib/comctl32/listview.c | 2 +- reactos/lib/comctl32/progress.c | 2 +- reactos/lib/comctl32/propsheet.c | 7 +- reactos/lib/comctl32/rebar.c | 167 +-- reactos/lib/comctl32/rsrc.rc | 27 + reactos/lib/comctl32/toolbar.c | 1528 ++++++++++++++++--------- reactos/lib/comctl32/tooltips.c | 406 ++++--- reactos/lib/comctl32/updown.c | 147 +-- reactos/lib/comctl32/winehq2ros.patch | 84 +- 18 files changed, 1514 insertions(+), 985 deletions(-) diff --git a/reactos/lib/comctl32/.cvsignore b/reactos/lib/comctl32/.cvsignore index 61131689fb2..23f95f831d2 100644 --- a/reactos/lib/comctl32/.cvsignore +++ b/reactos/lib/comctl32/.cvsignore @@ -16,6 +16,7 @@ idb_view_small.bmp idc_copy.cur idc_divider.cur idc_divideropen.cur +idc_movebutton.cur idi_dragarrow.ico idt_check.bmp comctl32.spec.def diff --git a/reactos/lib/comctl32/Makefile.in b/reactos/lib/comctl32/Makefile.in index 3a60a3b2557..87405ab54cd 100644 --- a/reactos/lib/comctl32/Makefile.in +++ b/reactos/lib/comctl32/Makefile.in @@ -49,6 +49,7 @@ RC_BINARIES = \ idc_copy.cur \ idc_divider.cur \ idc_divideropen.cur \ + idc_movebutton.cur \ idi_dragarrow.ico \ idt_check.bmp diff --git a/reactos/lib/comctl32/animate.c b/reactos/lib/comctl32/animate.c index 0297d4d43ee..a7c47e14e52 100644 --- a/reactos/lib/comctl32/animate.c +++ b/reactos/lib/comctl32/animate.c @@ -71,6 +71,7 @@ typedef struct LPVOID outdata; /* data for the background mechanism */ CRITICAL_SECTION cs; + HANDLE hStopEvent; HANDLE hThread; UINT uTimer; /* data for playing the file */ @@ -145,9 +146,17 @@ static LRESULT ANIMATE_DoStop(ANIMATE_INFO *infoPtr) /* should stop playing */ if (infoPtr->hThread) { - if (!TerminateThread(infoPtr->hThread,0)) - WARN("could not destroy animation thread!\n"); - infoPtr->hThread = 0; + HANDLE handle = infoPtr->hThread; + + TRACE("stopping animation thread\n"); + SetEvent( infoPtr->hStopEvent ); + LeaveCriticalSection(&infoPtr->cs); /* leave it a chance to run */ + WaitForSingleObject( handle, INFINITE ); + TRACE("animation thread stopped\n"); + EnterCriticalSection(&infoPtr->cs); + CloseHandle( infoPtr->hThread ); + CloseHandle( infoPtr->hStopEvent ); + infoPtr->hThread = 0; } if (infoPtr->uTimer) { KillTimer(infoPtr->hwndSelf, infoPtr->uTimer); @@ -378,33 +387,20 @@ static LRESULT ANIMATE_DrawFrame(ANIMATE_INFO* infoPtr) static DWORD CALLBACK ANIMATE_AnimationThread(LPVOID ptr_) { ANIMATE_INFO* infoPtr = (ANIMATE_INFO*)ptr_; - HDC hDC; - - if(!infoPtr) - { - WARN("animation structure undefined!\n"); - return FALSE; - } + HANDLE event; + DWORD timeout; while(1) { - if(GetWindowLongA(infoPtr->hwndSelf, GWL_STYLE) & ACS_TRANSPARENT) - { - hDC = GetDC(infoPtr->hwndSelf); - /* sometimes the animation window will be destroyed in between - * by the main program, so a ReleaseDC() error msg is possible */ - infoPtr->hbrushBG = (HBRUSH)SendMessageA(infoPtr->hwndNotify, - WM_CTLCOLORSTATIC, (WPARAM)hDC, - (LPARAM)infoPtr->hwndSelf); - ReleaseDC(infoPtr->hwndSelf,hDC); - } - EnterCriticalSection(&infoPtr->cs); ANIMATE_DrawFrame(infoPtr); + timeout = infoPtr->mah.dwMicroSecPerFrame; + event = infoPtr->hStopEvent; LeaveCriticalSection(&infoPtr->cs); /* time is in microseconds, we should convert it to milliseconds */ - Sleep((infoPtr->mah.dwMicroSecPerFrame+500)/1000); + if (WaitForSingleObject( event, (timeout+500)/1000) == WAIT_OBJECT_0) + break; } return TRUE; } @@ -445,13 +441,22 @@ static LRESULT ANIMATE_Play(HWND hWnd, WPARAM wParam, LPARAM lParam) } else { DWORD threadID; + if(GetWindowLongA(hWnd, GWL_STYLE) & ACS_TRANSPARENT) + { + HDC hDC = GetDC(hWnd); + infoPtr->hbrushBG = (HBRUSH)SendMessageA(infoPtr->hwndNotify, + WM_CTLCOLORSTATIC, 0, (LPARAM)hWnd); + ReleaseDC(hWnd,hDC); + } + TRACE("Using an animation thread\n"); + infoPtr->hStopEvent = CreateEventW( NULL, TRUE, FALSE, NULL ); infoPtr->hThread = CreateThread(0,0,ANIMATE_AnimationThread,(LPVOID)infoPtr, 0, &threadID); if(!infoPtr->hThread) { ERR("Could not create animation thread!\n"); return FALSE; - } + } } diff --git a/reactos/lib/comctl32/comboex.c b/reactos/lib/comctl32/comboex.c index dffb15a564c..3b1a0b548a7 100644 --- a/reactos/lib/comctl32/comboex.c +++ b/reactos/lib/comctl32/comboex.c @@ -24,7 +24,7 @@ * This code was audited for completeness against the documented features * of Comctl32.dll version 6.0 on Sep. 9, 2002, by Dimitrie O. Paun. * - * Unless otherwise noted, we belive this code to be complete, as per + * Unless otherwise noted, we believe this code to be complete, as per * the specification mentioned above. * If you discover missing features, or bugs, please note them below. * diff --git a/reactos/lib/comctl32/comctl32.h b/reactos/lib/comctl32/comctl32.h index a5f2f280aaf..2c4aa65569c 100644 --- a/reactos/lib/comctl32/comctl32.h +++ b/reactos/lib/comctl32/comctl32.h @@ -106,6 +106,7 @@ extern HBRUSH COMCTL32_hPattern55AABrush; #define IDI_DRAGARROW 501 #define IDC_COPY 502 +#define IDC_MOVEBUTTON 1 /* HOTKEY internal strings */ #define HKY_NONE 2048 diff --git a/reactos/lib/comctl32/commctrl.c b/reactos/lib/comctl32/commctrl.c index 0d66491ce2b..ad242dfdd91 100644 --- a/reactos/lib/comctl32/commctrl.c +++ b/reactos/lib/comctl32/commctrl.c @@ -23,7 +23,7 @@ * This code was audited for completeness against the documented features * of Comctl32.dll version 6.0 on Oct. 21, 2002, by Christian Neumair. * - * Unless otherwise noted, we belive this code to be complete, as per + * Unless otherwise noted, we believe this code to be complete, as per * the specification mentioned above. * If you discover missing features, or bugs, please note them below. * @@ -114,6 +114,7 @@ extern void TREEVIEW_Unregister(void); extern void UPDOWN_Register(void); extern void UPDOWN_Unregister(void); +static LRESULT WINAPI SubclassWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); LPSTR COMCTL32_aSubclass = NULL; HMODULE COMCTL32_hModule = 0; @@ -1108,10 +1109,10 @@ BOOL WINAPI SetWindowSubclass (HWND hWnd, SUBCLASSPROC pfnSubclass, /* set window procedure to our own and save the current one */ if (IsWindowUnicode (hWnd)) stack->origproc = (WNDPROC)SetWindowLongW (hWnd, GWL_WNDPROC, - (LONG)DefSubclassProc); + (LONG)SubclassWndProc); else stack->origproc = (WNDPROC)SetWindowLongA (hWnd, GWL_WNDPROC, - (LONG)DefSubclassProc); + (LONG)SubclassWndProc); } else { WNDPROC current; if (IsWindowUnicode (hWnd)) @@ -1119,7 +1120,7 @@ BOOL WINAPI SetWindowSubclass (HWND hWnd, SUBCLASSPROC pfnSubclass, else current = (WNDPROC)GetWindowLongA (hWnd, GWL_WNDPROC); - if (current != DefSubclassProc) { + if (current != SubclassWndProc) { ERR ("Application has subclassed with our procedure, then manually, then with us again. The current implementation can't handle this.\n"); return FALSE; } @@ -1262,6 +1263,33 @@ BOOL WINAPI RemoveWindowSubclass(HWND hWnd, SUBCLASSPROC pfnSubclass, UINT_PTR u } +/*********************************************************************** + * SubclassWndProc (internal) + * + * Window procedure for all subclassed windows. + * Saves the current subclassing stack position to support nested messages + */ + +static LRESULT WINAPI SubclassWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + LPSUBCLASS_INFO stack; + int stackpos; + LRESULT ret; + + /* retrieve our little stack from the Properties */ + stack = (LPSUBCLASS_INFO)GetPropA (hWnd, COMCTL32_aSubclass); + if (!stack) { + ERR ("Our sub classing stack got erased for %p!! Nothing we can do\n", hWnd); + return 0; + } + stackpos = stack->stackpos; + stack->stackpos = stack->stacknum; + ret = DefSubclassProc(hWnd,uMsg,wParam,lParam); + stack->stackpos = stackpos; + return ret; +} + + /*********************************************************************** * DefSubclassProc [COMCTL32.413] * diff --git a/reactos/lib/comctl32/draglist.c b/reactos/lib/comctl32/draglist.c index 939a27798c5..26411e9ad98 100644 --- a/reactos/lib/comctl32/draglist.c +++ b/reactos/lib/comctl32/draglist.c @@ -18,6 +18,15 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * NOTES + * + * This code was audited for completeness against the documented features + * of Comctl32.dll version 6.0 on Mar. 10, 2004, by Robert Shearman. + * + * Unless otherwise noted, we believe this code to be complete, as per + * the specification mentioned above. + * If you discover missing features or bugs please note them below. + * */ #include @@ -27,16 +36,15 @@ #include "wingdi.h" #include "winuser.h" #include "winnls.h" -#include "winnt.h" #include "commctrl.h" #include "comctl32.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(commctrl); -#ifndef TEXT -# define TEXT(string) string -#endif +/* for compiler compatibility we only accept literal ASCII strings */ +#undef TEXT +#define TEXT(string) string #define DRAGLIST_SUBCLASSID 0 #define DRAGLIST_SCROLLPERIOD 200 @@ -50,17 +58,18 @@ WINE_DEFAULT_DEBUG_CHANNEL(commctrl); /* internal Wine specific data for the drag list control */ typedef struct _DRAGLISTDATA { - /* are we currently in dragging mode? */ - BOOL dragging; + /* are we currently in dragging mode? */ + BOOL dragging; - /* cursor to use as determined by DL_DRAGGING notification. + /* cursor to use as determined by DL_DRAGGING notification. * NOTE: as we use LoadCursor we don't have to use DeleteCursor * when we are finished with it */ - HCURSOR cursor; + HCURSOR cursor; /* optimisation so that we don't have to load the cursor * all of the time whilst dragging */ - LRESULT last_dragging_response; + LRESULT last_dragging_response; + /* prevents flicker with drawing drag arrow */ RECT last_drag_icon_rect; } DRAGLISTDATA; @@ -259,6 +268,9 @@ VOID WINAPI DrawInsert (HWND hwndParent, HWND hwndLB, INT nItem) if (!GetWindowSubclass(hwndLB, DragList_SubclassWindowProc, DRAGLIST_SUBCLASSID, (DWORD_PTR*)&data)) return; + if (nItem < 0) + SetRectEmpty(&rcDragIcon); + /* prevent flicker by only redrawing when necessary */ if (!EqualRect(&rcDragIcon, &data->last_drag_icon_rect)) { @@ -266,6 +278,8 @@ VOID WINAPI DrawInsert (HWND hwndParent, HWND hwndLB, INT nItem) RedrawWindow(hwndParent, &data->last_drag_icon_rect, NULL, RDW_INTERNALPAINT | RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW); + CopyRect(&data->last_drag_icon_rect, &rcDragIcon); + if (nItem >= 0) { hdc = GetDC(hwndParent); @@ -275,7 +289,6 @@ VOID WINAPI DrawInsert (HWND hwndParent, HWND hwndLB, INT nItem) ReleaseDC(hwndParent, hdc); } } - CopyRect(&data->last_drag_icon_rect, &rcDragIcon); } /*********************************************************************** diff --git a/reactos/lib/comctl32/imagelist.c b/reactos/lib/comctl32/imagelist.c index b93e4db7b5a..77c795b66fa 100644 --- a/reactos/lib/comctl32/imagelist.c +++ b/reactos/lib/comctl32/imagelist.c @@ -1153,7 +1153,7 @@ ImageList_DrawIndirect (IMAGELISTDRAWPARAMS *pimldp) 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); else if (clrBlend == CLR_NONE) clrBlend = GetTextColor (pimldp->hdcDst); diff --git a/reactos/lib/comctl32/ipaddress.c b/reactos/lib/comctl32/ipaddress.c index dcec3ed71c4..61b463dd8ad 100644 --- a/reactos/lib/comctl32/ipaddress.c +++ b/reactos/lib/comctl32/ipaddress.c @@ -26,7 +26,7 @@ * This code was audited for completeness against the documented features * of Comctl32.dll version 6.0 on Sep. 9, 2002, by Dimitrie O. Paun. * - * Unless otherwise noted, we belive this code to be complete, as per + * Unless otherwise noted, we believe this code to be complete, as per * the specification mentioned above. * If you discover missing features, or bugs, please note them below. * diff --git a/reactos/lib/comctl32/listview.c b/reactos/lib/comctl32/listview.c index 7cdb92cc58e..249cb98cccd 100644 --- a/reactos/lib/comctl32/listview.c +++ b/reactos/lib/comctl32/listview.c @@ -26,7 +26,7 @@ * This code was audited for completeness against the documented features * of Comctl32.dll version 6.0 on Oct. 21, 2002, by Dimitrie O. Paun. * - * Unless otherwise noted, we belive this code to be complete, as per + * Unless otherwise noted, we believe this code to be complete, as per * the specification mentioned above. * If you discover missing features, or bugs, please note them below. * diff --git a/reactos/lib/comctl32/progress.c b/reactos/lib/comctl32/progress.c index 9de349dfad7..8b0e56410af 100644 --- a/reactos/lib/comctl32/progress.c +++ b/reactos/lib/comctl32/progress.c @@ -23,7 +23,7 @@ * This code was audited for completeness against the documented features * of Comctl32.dll version 6.0 on Sep. 9, 2002, by Dimitrie O. Paun. * - * Unless otherwise noted, we belive this code to be complete, as per + * Unless otherwise noted, we believe this code to be complete, as per * the specification mentioned above. * If you discover missing features, or bugs, please note them below. * diff --git a/reactos/lib/comctl32/propsheet.c b/reactos/lib/comctl32/propsheet.c index edc61ec36eb..3ee7de384c5 100644 --- a/reactos/lib/comctl32/propsheet.c +++ b/reactos/lib/comctl32/propsheet.c @@ -1175,7 +1175,7 @@ static PADDING_INFO PROPSHEET_GetPaddingInfoWizard(HWND hwndDlg, const PropSheet hwndControl = GetDlgItem(hwndDlg, IDC_SUNKEN_LINE); GetWindowRect(hwndControl, &rc); - ptLine.x = 0; + ptLine.x = rc.left; ptLine.y = rc.bottom; ScreenToClient(hwndDlg, &ptLine); @@ -1217,6 +1217,7 @@ static BOOL PROPSHEET_CreateTabControl(HWND hwndParent, SendMessageW(hwndTabCtrl, TCM_SETIMAGELIST, 0, (LPARAM)psInfo->hImageList); } + SendMessageW(GetDlgItem(hwndTabCtrl, IDC_TABCONTROL), WM_SETREDRAW, 0, 0); for (i = 0; i < nTabs; i++) { if ( psInfo->proppage[i].hasIcon ) @@ -1232,6 +1233,7 @@ static BOOL PROPSHEET_CreateTabControl(HWND hwndParent, item.pszText = (LPWSTR) psInfo->proppage[i].pszText; SendMessageW(hwndTabCtrl, TCM_INSERTITEMW, (WPARAM)i, (LPARAM)&item); } + SendMessageW(GetDlgItem(hwndTabCtrl, IDC_TABCONTROL), WM_SETREDRAW, 1, 0); return TRUE; } @@ -2830,6 +2832,9 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) LPCPROPSHEETPAGEW ppshpage; int idx; + /* Using PropSheetInfoStr to store extra data doesn't match the native + * common control: native uses TCM_[GS]ETITEM + */ SetPropW(hwnd, PropSheetInfoStr, (HANDLE)psInfo); /* diff --git a/reactos/lib/comctl32/rebar.c b/reactos/lib/comctl32/rebar.c index 04668822880..defe8237b9d 100644 --- a/reactos/lib/comctl32/rebar.c +++ b/reactos/lib/comctl32/rebar.c @@ -213,15 +213,10 @@ typedef struct #define DRAW_BOTTOMSEP 0x00000020 #define DRAW_CHEVRONHOT 0x00000040 #define DRAW_CHEVRONPUSHED 0x00000080 +#define DRAW_LAST_IN_ROW 0x00000100 +#define DRAW_FIRST_IN_ROW 0x00000200 #define NTF_INVALIDATE 0x01000000 -typedef struct -{ - INT istartband; /* index of first band in row */ - INT iendband; /* index of last band in row */ -} REBAR_ROW; - - typedef struct { COLORREF clrBk; /* background color */ @@ -257,7 +252,6 @@ typedef struct INT ichevronhotBand; /* last band that had a hot chevron */ INT iGrabbedBand;/* band number of band whose gripper was grabbed */ - REBAR_ROW *rows; /* pointer to row indexes */ REBAR_BAND *bands; /* pointer to the array of rebar bands */ } REBAR_INFO; @@ -305,6 +299,10 @@ typedef struct /* either top or bottom */ #define REBAR_DIVIDER 2 +/* minimium vertical height of a normal bar */ +/* or minimum width of a CCS_VERT bar - from experiment on Win2k */ +#define REBAR_MINSIZE 23 + /* This is the increment that is used over the band height */ #define REBARSPACE(a) ((a->fStyle & RBBS_CHILDEDGE) ? 2*REBAR_DIVIDER : 0) @@ -675,11 +673,10 @@ static VOID REBAR_Refresh (REBAR_INFO *infoPtr, HDC hdc) { REBAR_BAND *lpBand; - UINT i, oldrow; + UINT i; if (!infoPtr->DoRedraw) return; - oldrow = infoPtr->bands[0].iRow; for (i = 0; i < infoPtr->uNumBands; i++) { lpBand = &infoPtr->bands[i]; @@ -1674,7 +1671,7 @@ REBAR_Layout (REBAR_INFO *infoPtr, LPRECT lpRect, BOOL notify, BOOL resetclient) #if PROBLEM2 (x < adjcx) : (y < adjcy) #else - (adjcx - x > 4) : (adjcy - y > 4) + (adjcx - x > 5) : (adjcy - y > 4) #endif ) && (infoPtr->uNumBands > 1)) { @@ -1762,39 +1759,29 @@ REBAR_Layout (REBAR_INFO *infoPtr, LPRECT lpRect, BOOL notify, BOOL resetclient) /* ******* End Phase 2 - split rows till adjustment height full ******* */ - /* ******* Start Phase 2a - create array of start and end ******* */ - /* indexes by row */ + /* ******* Start Phase 2a - mark first and last band in each ******* */ - if (infoPtr->uNumRows != origrows) { - if (infoPtr->rows) Free (infoPtr->rows); - infoPtr->rows = Alloc (sizeof (REBAR_ROW) * infoPtr->uNumRows); + prevBand = NULL; + for (i = 0; i < infoPtr->uNumBands; i++) { + lpBand = &infoPtr->bands[i]; + if (HIDDENBAND(lpBand)) + continue; + if( !prevBand ) { + lpBand->fDraw |= DRAW_FIRST_IN_ROW; + prevBand = lpBand; + } + else if( prevBand->iRow == lpBand->iRow ) + prevBand = lpBand; + else { + prevBand->fDraw |= DRAW_LAST_IN_ROW; + lpBand->fDraw |= DRAW_FIRST_IN_ROW; + prevBand = lpBand; + } } + if( prevBand ) + prevBand->fDraw |= DRAW_LAST_IN_ROW; - row = 0; - for (i = 0; i < infoPtr->uNumBands; i++) { - lpBand = &infoPtr->bands[i]; - if (HIDDENBAND(lpBand)) continue; - - if (lpBand->iRow > row) { - row++; - infoPtr->rows[row-1].istartband = i; - } - if (row == 0) { - ERR("P2a bug!!!!!!\n"); - } - infoPtr->rows[row-1].iendband = i; - } - - for (i = 0; i < infoPtr->uNumRows; i++) { - REBAR_ROW *p; - - p = &infoPtr->rows[i]; - TRACE("P2a row %d, starts %d, ends %d\n", - i+1, p->istartband, p->iendband); - } - - /* ******* End Phase 2a - create array of start and end ******* */ - /* indexes by row */ + /* ******* End Phase 2a - mark first and last band in each ******* */ /* ******* Start Phase 2b - adjust all bands for height full ******* */ @@ -1804,24 +1791,28 @@ REBAR_Layout (REBAR_INFO *infoPtr, LPRECT lpRect, BOOL notify, BOOL resetclient) if (((infoPtr->dwStyle & CCS_VERT) ? clientcx > x : clientcy > y) && infoPtr->uNumBands) { - INT diff, i, iband; + INT diff, i; UINT j; diff = (infoPtr->dwStyle & CCS_VERT) ? clientcx - x : clientcy - y; - for (i = infoPtr->uNumRows; i >= 1; i--) { - /* if row has more than 1 band, ignore row */ - if (infoPtr->rows[i-1].istartband != infoPtr->rows[i-1].iendband) - continue; - /* point to only band in row */ - iband = infoPtr->rows[i-1].istartband; - lpBand = &infoPtr->bands[iband]; + + /* iterate backwards thru the rows */ + for (i = infoPtr->uNumBands-1; i>=0; i--) { + lpBand = &infoPtr->bands[i]; if(HIDDENBAND(lpBand)) continue; + + /* if row has more than 1 band, ignore it */ + if( !(lpBand->fDraw&DRAW_FIRST_IN_ROW) ) + continue; + if( !(lpBand->fDraw&DRAW_LAST_IN_ROW) ) + continue; + if (lpBand->fMask & RBBS_VARIABLEHEIGHT) continue; if (((INT)lpBand->cyMaxChild < 1) || ((INT)lpBand->cyIntegral < 1)) { if (lpBand->cyMaxChild + lpBand->cyIntegral == 0) continue; ERR("P2b band %u RBBS_VARIABLEHEIGHT set but cyMax=%d, cyInt=%d\n", - iband, lpBand->cyMaxChild, lpBand->cyIntegral); + i, lpBand->cyMaxChild, lpBand->cyIntegral); continue; } /* j is now the maximum height/width in the client area */ @@ -1835,7 +1826,7 @@ REBAR_Layout (REBAR_INFO *infoPtr, LPRECT lpRect, BOOL notify, BOOL resetclient) else lpBand->rcBand.bottom = lpBand->rcBand.top + j; TRACE("P2b band %d, row %d changed to (%ld,%ld)-(%ld,%ld)\n", - iband, lpBand->iRow, + i, lpBand->iRow, lpBand->rcBand.left, lpBand->rcBand.top, lpBand->rcBand.right, lpBand->rcBand.bottom); if (diff <= 0) break; @@ -1856,7 +1847,7 @@ REBAR_Layout (REBAR_INFO *infoPtr, LPRECT lpRect, BOOL notify, BOOL resetclient) /* ******* Start Phase 3 - adjust all bands for width full ******* */ if (infoPtr->uNumBands) { - REBAR_ROW *p; + int startband; /* If RBS_BANDBORDERS set then indicate to draw bottom separator */ /* on all bands in all rows but last row. */ @@ -1864,39 +1855,49 @@ REBAR_Layout (REBAR_INFO *infoPtr, LPRECT lpRect, BOOL notify, BOOL resetclient) /* each row but the rightmost band. */ if (infoPtr->dwStyle & RBS_BANDBORDERS) { - for(i = 0; i < infoPtr->uNumRows; i++) { - p = &infoPtr->rows[i]; - for (j = p->istartband; j <= p->iendband; j++) { - lpBand = &infoPtr->bands[j]; - if (HIDDENBAND(lpBand)) continue; - if (j != p->iendband) - lpBand->fDraw |= DRAW_RIGHTSEP; - if (i != infoPtr->uNumRows-1) - lpBand->fDraw |= DRAW_BOTTOMSEP; - } + for (i=0; iuNumBands; i++) { + lpBand = &infoPtr->bands[i]; + if (HIDDENBAND(lpBand)) + continue; + + /* not righthand bands */ + if( !(lpBand->fDraw & DRAW_LAST_IN_ROW) ) + lpBand->fDraw |= DRAW_RIGHTSEP; + + /* not the last row */ + if( lpBand->iRow != infoPtr->uNumRows ) + lpBand->fDraw |= DRAW_BOTTOMSEP; } } /* Distribute the extra space on the horizontal and adjust */ /* all bands in row to same height. */ - for (i=1; i<=infoPtr->uNumRows; i++) { - p = &infoPtr->rows[i-1]; - mcy = 0; + mcy = 0; + startband = -1; + for (i=0; iuNumBands; i++) { - TRACE("P3 processing row %d, starting band %d, ending band %d\n", - i, p->istartband, p->iendband); + lpBand = &infoPtr->bands[i]; - /* Find the largest height of the bands in the row */ - for (j = p->istartband; j <= p->iendband; j++) { - lpBand = &infoPtr->bands[j]; - if (HIDDENBAND(lpBand)) continue; - if (mcy < ircBw(lpBand)) - mcy = ircBw(lpBand); - } + if( lpBand->fDraw & DRAW_FIRST_IN_ROW ) + { + startband = i; + mcy = 0; + } - REBAR_AdjustBands (infoPtr, p->istartband, p->iendband, + if ( (mcy < ircBw(lpBand)) && !HIDDENBAND(lpBand) ) + mcy = ircBw(lpBand); + + if( lpBand->fDraw & DRAW_LAST_IN_ROW ) + { + TRACE("P3 processing row %d, starting band %d, ending band %d\n", + lpBand->iRow, startband, i); + if( startband < 0 ) + ERR("Last band %d with no first, row %d\n", i, lpBand->iRow); + + REBAR_AdjustBands (infoPtr, startband, i, (infoPtr->dwStyle & CCS_VERT) ? clientcy : clientcx, mcy); + } } /* Calculate the other rectangles in each band */ @@ -1920,6 +1921,8 @@ REBAR_Layout (REBAR_INFO *infoPtr, LPRECT lpRect, BOOL notify, BOOL resetclient) y = clientcy; } if (infoPtr->dwStyle & CCS_VERT) { + if( x < REBAR_MINSIZE ) + x = REBAR_MINSIZE; infoPtr->calcSize.cx = x; infoPtr->calcSize.cy = clientcy; TRACE("vert, notify=%d, x=%d, origheight=%d\n", @@ -1927,6 +1930,8 @@ REBAR_Layout (REBAR_INFO *infoPtr, LPRECT lpRect, BOOL notify, BOOL resetclient) if (notify && (x != origheight)) infoPtr->fStatus |= NTF_HGHTCHG; } else { + if( y < REBAR_MINSIZE ) + y = REBAR_MINSIZE; infoPtr->calcSize.cx = clientcx; infoPtr->calcSize.cy = y; TRACE("horz, notify=%d, y=%d, origheight=%d\n", @@ -2511,13 +2516,13 @@ REBAR_HandleLRDrag (REBAR_INFO *infoPtr, POINTS *ptsmove) } } - if (RHeaderSum) RHeaderSum -= SEP_WIDTH; /* no separator afterlast band */ + if (RHeaderSum) RHeaderSum -= SEP_WIDTH; /* no separator after last band */ mindBand = &infoPtr->bands[imindBand]; maxdBand = &infoPtr->bands[imaxdBand]; - if (imindBand == imaxdBand) return; /* nothing to drag agains */ - if (imindBand == ihitBand) return; /* first band in row, cant drag */ + if (imindBand == imaxdBand) return; /* nothing to drag against */ + if (imindBand == ihitBand) return; /* first band in row, can't drag */ /* limit movement to inside adjustable bands - Left */ if ( (ptsmove->x < mindBand->rcBand.left) || @@ -3205,9 +3210,9 @@ REBAR_InsertBandW (REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam) } /* post copy */ - if (uIndex < infoPtr->uNumBands - 1) { + if (uIndex <= infoPtr->uNumBands - 1) { memcpy (&infoPtr->bands[uIndex+1], &oldBands[uIndex], - (infoPtr->uNumBands - uIndex - 1) * sizeof(REBAR_BAND)); + (infoPtr->uNumBands - uIndex) * sizeof(REBAR_BAND)); } Free (oldBands); @@ -3239,7 +3244,7 @@ REBAR_InsertBandW (REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam) REBAR_ValidateBand (infoPtr, lpBand); /* On insert of second band, revalidate band 1 to possible add gripper */ if (infoPtr->uNumBands == 2) - REBAR_ValidateBand (infoPtr, &infoPtr->bands[0]); + REBAR_ValidateBand (infoPtr, &infoPtr->bands[uIndex ? 0 : 1]); REBAR_DumpBand (infoPtr); diff --git a/reactos/lib/comctl32/rsrc.rc b/reactos/lib/comctl32/rsrc.rc index b1c28fc5b6b..ea280e1be19 100644 --- a/reactos/lib/comctl32/rsrc.rc +++ b/reactos/lib/comctl32/rsrc.rc @@ -1052,6 +1052,33 @@ IDC_DIVIDEROPEN CURSOR LOADONCALL DISCARDABLE idc_divideropen.cur } */ +/* BINRES idc_movebutton.cur */ +IDC_MOVEBUTTON CURSOR LOADONCALL DISCARDABLE idc_movebutton.cur +/* { + '00 00 02 00 01 00 20 20 00 00 10 00 10 00 30 01' + '00 00 16 00 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 01 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 0F F8 00 00 0F' + 'F8 00 00 1F FC 00 00 1F FC 00 00 3F FC 00 00 3F' + 'FE 00 00 7F FE 00 00 5F FE 00 00 DF FE 00 01 DF' + 'FE 00 01 9F FE 00 00 1D B6 00 00 1D B4 00 00 0D' + 'B0 00 00 01 80 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF FF FF FF FF FF FF D2 49' + '24 93 DF FF FF FF FF FF FF FB DF FF FF FB DF FF' + 'FF FF FF FF FF FB DF E0 03 FB DF E0 03 FF FF E0' + '03 FB DF C0 01 FB DF C0 01 FF FF 80 01 FB DF 80' + '00 FB DF 00 00 FF FF 00 00 FB DE 00 00 FB DC 00' + '00 FF FC 00 00 FB DC 40 00 FB DF C0 01 FF FF E0' + '03 FB DF F0 0F FB DF FE 7F FF FF FF FF FB DF FF' + 'FF FB DF FF FF FF FF FF FF FB C9 24 92 4B FF FF' + 'FF FF FF FF FF FF' +} */ + + /* BINRES idi_dragarrow.ico */ IDI_DRAGARROW ICON LOADONCALL DISCARDABLE idi_dragarrow.ico /* { diff --git a/reactos/lib/comctl32/toolbar.c b/reactos/lib/comctl32/toolbar.c index 45b8d2ca0ef..c0c775b20e8 100644 --- a/reactos/lib/comctl32/toolbar.c +++ b/reactos/lib/comctl32/toolbar.c @@ -3,6 +3,7 @@ * * Copyright 1998,1999 Eric Kohl * Copyright 2000 Eric Kohl for CodeWeavers + * Copyright 2004 Robert Shearman * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,6 +19,8 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * NOTES + * * Differences between MSDN and actual native control operation: * 1. MSDN says: "TBSTYLE_LIST: Creates a flat toolbar with button text * to the right of the bitmap. Otherwise, this style is @@ -27,30 +30,40 @@ * is non-flat non-transparent buttons. Therefore TBSTYLE_LIST does * *not* imply TBSTYLE_FLAT as documented. (GA 8/2001) * - * + * This code was audited for completeness against the documented features + * of Comctl32.dll version 6.0 on Mar. 14, 2004, by Robert Shearman. + * + * Unless otherwise noted, we believe this code to be complete, as per + * the specification mentioned above. + * If you discover missing features or bugs please note them below. + * * TODO: - * - Button wrapping (under construction). - * - Messages. - * - Notifications + * - Styles: + * - TBSTYLE_REGISTERDROP + * - TBSTYLE_EX_DOUBLEBUFFER + * - Messages: + * - TB_GETINSERTMARK + * - TB_GETINSERTMARKCOLOR + * - TB_GETMETRICS + * - TB_GETOBJECT + * - TB_INSERTMARKHITTEST + * - TB_SETINSERTMARK + * - TB_SETMETRICS + * - Notifications: * - NM_CHAR * - NM_KEYDOWN - * - NM_LDOWN * - NM_RCLICK * - NM_RDBLCLICK - * - TBN_DELETINGBUTTON * - TBN_DRAGOUT * - TBN_GETOBJECT * - TBN_RESTORE * - TBN_SAVE - * - TBN_TOOLBARCHANGE + * - Button wrapping (under construction). * - Fix TB_SETROWS. - * - Tooltip support (almost complete). - * - Fix TOOLBAR_SetButtonInfo32A/W. - * - iString of -1 is undocumented + * - iListGap custom draw support. * - Customization dialog: - * - Add flat look. * - Minor buglet in 'available buttons' list: - * Buttons are not listed in M$-like order. M$ seems to use a single + * Buttons are not listed in MS-like order. MS seems to use a single * internal list to store the button information of both listboxes. * - Drag list support. * @@ -75,12 +88,13 @@ #include "wine/unicode.h" #include "winnls.h" #include "commctrl.h" -#include "imagelist.h" #include "comctl32.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(toolbar); +static HCURSOR hCursorDrag = NULL; + typedef struct { INT iBitmap; @@ -89,10 +103,10 @@ typedef struct BYTE fsStyle; DWORD dwData; INT iString; - BOOL bHot; INT nRow; RECT rect; + INT cx; /* manually set size */ } TBUTTON_INFO; typedef struct @@ -129,13 +143,15 @@ typedef struct INT nNumBitmapInfos; BOOL bUnicode; /* ASCII (FALSE) or Unicode (TRUE)? */ BOOL bCaptured; /* mouse captured? */ - INT nButtonDown; + INT nButtonDown; /* toolbar button being pressed or -1 if none */ + INT nButtonDrag; /* toolbar button being dragged or -1 if none */ INT nOldHit; INT nHotItem; /* index of the "hot" item */ DWORD dwBaseCustDraw; /* CDRF_ response (w/o TBCDRF_) from PREPAINT */ DWORD dwItemCustDraw; /* CDRF_ response (w/o TBCDRF_) from ITEMPREP */ DWORD dwItemCDFlag; /* TBCDRF_ flags from last ITEMPREPAINT */ SIZE szPadding; /* padding values around button */ + INT iListGap; /* default gap between text and image for toolbar with list style */ HFONT hDefaultFont; HFONT hFont; /* text font */ HIMAGELIST himlInt; /* image list created internally */ @@ -162,7 +178,8 @@ typedef struct COLORREF clrBtnShadow; /* color for Flag Separator */ RECT rcBound; /* bounding rectangle */ INT iVersion; - + LPWSTR pszTooltipText; /* temporary store for a string > 80 characters + * for TTN_GETDISPINFOW notification */ TBUTTON_INFO *buttons; /* pointer to button array */ LPWSTR *strings; /* pointer to string array */ TBITMAP_INFO *bitmaps; @@ -197,10 +214,9 @@ typedef enum #define DDARROW_WIDTH 11 #define ARROW_HEIGHT 3 -/* gap between edge of button and image with TBSTYLE_LIST */ -#define LIST_IMAGE_OFFSET 3 -/* gap between bitmap and text (always present) */ -#define LIST_TEXT_OFFSET 2 +/* gap between border of button and text/image */ +#define OFFSET_X 1 +#define OFFSET_Y 1 /* how wide to treat the bitmap if it isn't present */ #define LIST_IMAGE_ABSENT_WIDTH 2 @@ -208,6 +224,11 @@ typedef enum #define TOOLBAR_HasText(x, y) (TOOLBAR_GetText(x, y) ? TRUE : FALSE) #define TOOLBAR_HasDropDownArrows(exStyle) ((exStyle & TBSTYLE_EX_DRAWDDARROWS) ? TRUE : FALSE) +static inline int TOOLBAR_GetListTextOffset(TOOLBAR_INFO *infoPtr, INT iListGap) +{ + return GetSystemMetrics(SM_CXEDGE) + iListGap - infoPtr->szPadding.cx/2; +} + /* Used to find undocumented extended styles */ #define TBSTYLE_EX_ALL (TBSTYLE_EX_DRAWDDARROWS | \ TBSTYLE_EX_UNDOC1 | \ @@ -226,6 +247,7 @@ static HIMAGELIST TOOLBAR_GetImageList(PIMLENTRY *pies, INT cies, INT id); static PIMLENTRY TOOLBAR_GetImageListEntry(PIMLENTRY *pies, INT cies, INT id); static VOID TOOLBAR_DeleteImageList(PIMLENTRY **pies, INT *cies); static HIMAGELIST TOOLBAR_InsertImageList(PIMLENTRY **pies, INT *cies, HIMAGELIST himl, INT id); +static LRESULT TOOLBAR_LButtonDown(HWND hwnd, WPARAM wParam, LPARAM lParam); static LRESULT TOOLBAR_NotifyFormat(TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam); @@ -236,7 +258,7 @@ TOOLBAR_GetText(TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr) { LPWSTR lpText = NULL; - /* FIXME: iString == -1 is undocumented */ + /* NOTE: iString == -1 is undocumented */ if ((HIWORD(btnPtr->iString) != 0) && (btnPtr->iString != -1)) lpText = (LPWSTR)btnPtr->iString; else if ((btnPtr->iString >= 0) && (btnPtr->iString < infoPtr->nNumStrings)) @@ -296,8 +318,6 @@ TOOLBAR_DumpToolbar(TOOLBAR_INFO *iP, INT line) static void TOOLBAR_CheckStyle (HWND hwnd, DWORD dwStyle) { - if (dwStyle & TBSTYLE_ALTDRAG) - FIXME("[%p] TBSTYLE_ALTDRAG not implemented\n", hwnd); if (dwStyle & TBSTYLE_REGISTERDROP) FIXME("[%p] TBSTYLE_REGISTERDROP not implemented\n", hwnd); } @@ -350,7 +370,7 @@ TOOLBAR_GetBitmapIndex(TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr) btnPtr->iBitmap = nmgd.iImage; } ret = nmgd.iImage; - TRACE("TBN_GETDISPINFOA returned bitmap id %d, mask=%08lx, nNumBitmaps=%d\n", + TRACE("TBN_GETDISPINFO returned bitmap id %d, mask=%08lx, nNumBitmaps=%d\n", ret, nmgd.dwMask, infoPtr->nNumBitmaps); } @@ -378,32 +398,29 @@ TOOLBAR_IsValidBitmapIndex(TOOLBAR_INFO *infoPtr, INT index) /*********************************************************************** -* TOOLBAR_DrawImageList +* TOOLBAR_GetImageListForDrawing * * This function validates the bitmap index (including I_IMAGECALLBACK -* functionality). It then draws the image via the ImageList_Draw -* function. It returns TRUE if the image was drawn, FALSE otherwise. +* functionality) and returns the corresponding image list. */ -static BOOL -TOOLBAR_DrawImageList (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, IMAGE_LIST_TYPE imagelist, - HDC hdc, UINT left, UINT top, UINT draw_flags) +static HIMAGELIST +TOOLBAR_GetImageListForDrawing (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, IMAGE_LIST_TYPE imagelist, INT * index) { - INT index; HIMAGELIST himl; if (!TOOLBAR_IsValidBitmapIndex(infoPtr,btnPtr->iBitmap)) { - if (btnPtr->iBitmap == I_IMAGENONE) return FALSE; + if (btnPtr->iBitmap == I_IMAGENONE) return NULL; ERR("index %d,%d is not valid, max %d\n", HIWORD(btnPtr->iBitmap), LOWORD(btnPtr->iBitmap), infoPtr->nNumBitmaps); - return FALSE; + return NULL; } - if ((index = TOOLBAR_GetBitmapIndex(infoPtr, btnPtr)) < 0) { - if ((index == I_IMAGECALLBACK) || - (index == I_IMAGENONE)) return FALSE; + if ((*index = TOOLBAR_GetBitmapIndex(infoPtr, btnPtr)) < 0) { + if ((*index == I_IMAGECALLBACK) || + (*index == I_IMAGENONE)) return NULL; ERR("TBN_GETDISPINFO returned invalid index %d\n", - index); - return FALSE; + *index); + return NULL; } switch(imagelist) @@ -423,24 +440,17 @@ TOOLBAR_DrawImageList (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, IMAGE_LIST_T } if (!himl) - { - TRACE("no image list, returning FALSE\n"); - return FALSE; - } + TRACE("no image list\n"); - TRACE("drawing index=%d, himl=%p, left=%d, top=%d, flags=%08x\n", - index, himl, left, top, draw_flags); - - ImageList_Draw (himl, index, hdc, left, top, draw_flags); - return TRUE; + return himl; } /*********************************************************************** * TOOLBAR_TestImageExist * -* This function is similar to TOOLBAR_DrawImageList, except it does not -* draw the image. The I_IMAGECALLBACK functionality is implemented. +* This function is similar to TOOLBAR_GetImageListForDrawing, except it does not +* return the image list. The I_IMAGECALLBACK functionality is implemented. */ static BOOL TOOLBAR_TestImageExist (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, HIMAGELIST himl) @@ -540,12 +550,12 @@ TOOLBAR_DrawDDFlatSeparator (LPRECT lpRect, HDC hdc, TBUTTON_INFO *btnPtr, TOOLB static void -TOOLBAR_DrawArrow (HDC hdc, INT left, INT top, INT colorRef) +TOOLBAR_DrawArrow (HDC hdc, INT left, INT top, COLORREF clr) { INT x, y; HPEN hPen, hOldPen; - if (!(hPen = CreatePen( PS_SOLID, 1, GetSysColor( colorRef )))) return; + if (!(hPen = CreatePen( PS_SOLID, 1, clr))) return; hOldPen = SelectObject ( hdc, hPen ); x = left + 2; y = top; @@ -569,10 +579,12 @@ static void TOOLBAR_DrawString (TOOLBAR_INFO *infoPtr, RECT *rcText, LPWSTR lpText, NMTBCUSTOMDRAW *tbcd) { + HDC hdc = tbcd->nmcd.hdc; HFONT hOldFont = 0; COLORREF clrOld = 0; + COLORREF clrOldBk = 0; + int oldBkMode = 0; UINT state = tbcd->nmcd.uItemState; - HDC hdc = tbcd->nmcd.hdc; /* draw text */ if (lpText) { @@ -593,12 +605,22 @@ TOOLBAR_DrawString (TOOLBAR_INFO *infoPtr, RECT *rcText, LPWSTR lpText, else if (state & CDIS_INDETERMINATE) { clrOld = SetTextColor (hdc, comctl32_color.clr3dShadow); } + else if ((state & CDIS_MARKED) && !(infoPtr->dwItemCDFlag & TBCDRF_NOMARK)) { + clrOld = SetTextColor (hdc, tbcd->clrTextHighlight); + clrOldBk = SetBkColor (hdc, tbcd->clrMark); + oldBkMode = SetBkMode (hdc, OPAQUE); /* FIXME: should this be in the NMTBCUSTOMDRAW structure? */ + } else { clrOld = SetTextColor (hdc, tbcd->clrText); } DrawTextW (hdc, lpText, -1, rcText, infoPtr->dwDTFlags); SetTextColor (hdc, clrOld); + if ((state & CDIS_MARKED) && !(infoPtr->dwItemCDFlag & TBCDRF_NOMARK)) + { + SetBkColor (hdc, clrOldBk); + SetBkMode (hdc, oldBkMode); + } SelectObject (hdc, hOldFont); } } @@ -608,12 +630,16 @@ static void TOOLBAR_DrawPattern (LPRECT lpRect, NMTBCUSTOMDRAW *tbcd) { HDC hdc = tbcd->nmcd.hdc; - HBRUSH hbr = SelectObject (hdc, COMCTL32_hPattern55AABrush); + HBRUSH hbr = SelectObject (hdc, tbcd->hbrMonoDither); + COLORREF clrTextOld; + COLORREF clrBkOld; INT cx = lpRect->right - lpRect->left; INT cy = lpRect->bottom - lpRect->top; - SetTextColor(hdc, tbcd->clrBtnHighlight); - SetBkColor(hdc, tbcd->clrBtnFace); + clrTextOld = SetTextColor(hdc, tbcd->clrBtnHighlight); + clrBkOld = SetBkColor(hdc, tbcd->clrBtnFace); PatBlt (hdc, lpRect->left, lpRect->top, cx, cy, PATCOPY); + SetBkColor(hdc, clrBkOld); + SetTextColor(hdc, clrTextOld); SelectObject (hdc, hbr); } @@ -621,7 +647,9 @@ TOOLBAR_DrawPattern (LPRECT lpRect, NMTBCUSTOMDRAW *tbcd) static void TOOLBAR_DrawMasked(TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, HDC hdc, INT x, INT y) { - HIMAGELIST himl = GETDEFIMAGELIST(infoPtr, 0); + int index; + HIMAGELIST himl = + TOOLBAR_GetImageListForDrawing(infoPtr, btnPtr, IMAGE_LIST_DEFAULT, &index); if (himl) { @@ -636,7 +664,7 @@ static void TOOLBAR_DrawMasked(TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, hbmImage = CreateBitmap(cx, cy, GetDeviceCaps(hdc,PLANES), GetDeviceCaps(hdc,BITSPIXEL), NULL); SelectObject(hdcImage, hbmImage); - ImageList_DrawEx(himl, btnPtr->iBitmap, hdcImage, 0, 0, cx, cy, + ImageList_DrawEx(himl, index, hdcImage, 0, 0, cx, cy, RGB(0xff, 0xff, 0xff), RGB(0,0,0), ILD_NORMAL); /* Create Mask */ @@ -653,6 +681,7 @@ static void TOOLBAR_DrawMasked(TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, /* draw the new mask 'etched' to hdc */ SetBkColor(hdc, RGB(255, 255, 255)); SelectObject(hdc, GetSysColorBrush(COLOR_3DHILIGHT)); + /* E20746 op code is (Dst ^ (Src & (Pat ^ Dst))) */ BitBlt(hdc, x + 1, y + 1, cx, cy, hdcMask, 0, 0, 0xE20746); SelectObject(hdc, GetSysColorBrush(COLOR_3DSHADOW)); BitBlt(hdc, x, y, cx, cy, hdcMask, 0, 0, 0xE20746); @@ -677,12 +706,126 @@ TOOLBAR_TranslateState(TBUTTON_INFO *btnPtr) retstate |= (btnPtr->fsState & TBSTATE_MARKED ) ? CDIS_MARKED : 0; retstate |= (btnPtr->bHot ) ? CDIS_HOT : 0; retstate |= (btnPtr->fsState & TBSTATE_INDETERMINATE) ? CDIS_INDETERMINATE : 0; - /* FIXME: don't set CDIS_GRAYED, CDIS_FOCUS, CDIS_DEFAULT */ - /* don't test TBSTATE_HIDDEN */ + /* NOTE: we don't set CDIS_GRAYED, CDIS_FOCUS, CDIS_DEFAULT */ return retstate; } +/* draws the image on a toolbar button */ +static void +TOOLBAR_DrawImage(TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, INT left, INT top, const NMTBCUSTOMDRAW *tbcd) +{ + HIMAGELIST himl = NULL; + BOOL draw_masked = FALSE; + INT index; + INT offset = 0; + UINT draw_flags = ILD_NORMAL; + if (tbcd->nmcd.uItemState & (CDIS_DISABLED | CDIS_INDETERMINATE)) + { + himl = TOOLBAR_GetImageListForDrawing(infoPtr, btnPtr, IMAGE_LIST_DISABLED, &index); + if (!himl) + draw_masked = TRUE; + } + else if ((tbcd->nmcd.uItemState & CDIS_HOT) && (GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & TBSTYLE_FLAT)) + { + /* if hot, attempt to draw with hot image list, if fails, + use default image list */ + himl = TOOLBAR_GetImageListForDrawing(infoPtr, btnPtr, IMAGE_LIST_HOT, &index); + if (!himl) + himl = TOOLBAR_GetImageListForDrawing(infoPtr, btnPtr, IMAGE_LIST_DEFAULT, &index); + } + else + himl = TOOLBAR_GetImageListForDrawing(infoPtr, btnPtr, IMAGE_LIST_DEFAULT, &index); + + if (!(infoPtr->dwItemCDFlag & TBCDRF_NOOFFSET) && + (tbcd->nmcd.uItemState & (CDIS_SELECTED | CDIS_CHECKED))) + offset = 1; + + if (!(infoPtr->dwItemCDFlag & TBCDRF_NOMARK) && + (tbcd->nmcd.uItemState & CDIS_MARKED)) + draw_flags |= ILD_BLEND50; + + TRACE("drawing index=%d, himl=%p, left=%d, top=%d, offset=%d\n", + index, himl, left, top, offset); + + if (draw_masked) + TOOLBAR_DrawMasked (infoPtr, btnPtr, tbcd->nmcd.hdc, left + offset, top + offset); + else if (himl) + ImageList_Draw (himl, index, tbcd->nmcd.hdc, left + offset, top + offset, draw_flags); +} + +/* draws a blank frame for a toolbar button */ +static void +TOOLBAR_DrawFrame(const TOOLBAR_INFO *infoPtr, BOOL flat, const NMTBCUSTOMDRAW *tbcd) +{ + HDC hdc = tbcd->nmcd.hdc; + RECT rc = tbcd->nmcd.rc; + /* if the state is disabled or indeterminate then the button + * cannot have an interactive look like pressed or hot */ + BOOL non_interactive_state = (tbcd->nmcd.uItemState & CDIS_DISABLED) || + (tbcd->nmcd.uItemState & CDIS_INDETERMINATE); + BOOL pressed_look = !non_interactive_state && + ((tbcd->nmcd.uItemState & CDIS_SELECTED) || + (tbcd->nmcd.uItemState & CDIS_CHECKED)); + + /* app don't want us to draw any edges */ + if (infoPtr->dwItemCDFlag & TBCDRF_NOEDGES) + return; + + if (flat) + { + if (pressed_look) + DrawEdge (hdc, &rc, BDR_SUNKENOUTER, BF_RECT); + else if ((tbcd->nmcd.uItemState & CDIS_HOT) && !non_interactive_state) + DrawEdge (hdc, &rc, BDR_RAISEDINNER, BF_RECT); + } + else + { + if (pressed_look) + DrawEdge (hdc, &rc, EDGE_SUNKEN, BF_RECT | BF_MIDDLE); + else + DrawEdge (hdc, &rc, EDGE_RAISED, + BF_SOFT | BF_RECT | BF_MIDDLE); + } +} + +static void +TOOLBAR_DrawSepDDArrow(const TOOLBAR_INFO *infoPtr, BOOL flat, const NMTBCUSTOMDRAW *tbcd, RECT *rcArrow) +{ + HDC hdc = tbcd->nmcd.hdc; + int offset = 0; + + if (flat) + { + if ((tbcd->nmcd.uItemState & CDIS_SELECTED) || (tbcd->nmcd.uItemState & CDIS_CHECKED)) + DrawEdge (hdc, rcArrow, BDR_SUNKENOUTER, BF_RECT); + else if ( (tbcd->nmcd.uItemState & CDIS_HOT) && + !(tbcd->nmcd.uItemState & CDIS_DISABLED) && + !(tbcd->nmcd.uItemState & CDIS_INDETERMINATE)) + DrawEdge (hdc, rcArrow, BDR_RAISEDINNER, BF_RECT); + } + else + { + if ((tbcd->nmcd.uItemState & CDIS_SELECTED) || (tbcd->nmcd.uItemState & CDIS_CHECKED)) + DrawEdge (hdc, rcArrow, EDGE_SUNKEN, BF_RECT | BF_MIDDLE); + else + DrawEdge (hdc, rcArrow, EDGE_RAISED, + BF_SOFT | BF_RECT | BF_MIDDLE); + } + + if (tbcd->nmcd.uItemState & (CDIS_SELECTED | CDIS_CHECKED)) + offset = (infoPtr->dwItemCDFlag & TBCDRF_NOOFFSET) ? 0 : 1; + + if (tbcd->nmcd.uItemState & (CDIS_DISABLED | CDIS_INDETERMINATE)) + { + TOOLBAR_DrawArrow(hdc, rcArrow->left+1, rcArrow->top+1 + (rcArrow->bottom - rcArrow->top - ARROW_HEIGHT) / 2, comctl32_color.clrBtnHighlight); + TOOLBAR_DrawArrow(hdc, rcArrow->left, rcArrow->top + (rcArrow->bottom - rcArrow->top - ARROW_HEIGHT) / 2, comctl32_color.clr3dShadow); + } + else + TOOLBAR_DrawArrow(hdc, rcArrow->left + offset, rcArrow->top + offset + (rcArrow->bottom - rcArrow->top - ARROW_HEIGHT) / 2, comctl32_color.clrBtnText); +} + +/* draws a complete toolbar button */ static void TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) { @@ -692,18 +835,14 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) (btnPtr->fsStyle & BTNS_DROPDOWN)) || (btnPtr->fsStyle & BTNS_WHOLEDROPDOWN); BOOL drawSepDropDownArrow = hasDropDownArrow && - (~btnPtr->fsStyle & BTNS_WHOLEDROPDOWN); - RECT rc, rcArrow, rcBitmap, rcText, rcFill; + (~btnPtr->fsStyle & BTNS_WHOLEDROPDOWN); + RECT rc, rcArrow, rcBitmap, rcText; LPWSTR lpText = NULL; NMTBCUSTOMDRAW tbcd; DWORD ntfret; INT offset; - if (btnPtr->fsState & TBSTATE_HIDDEN) - return; - rc = btnPtr->rect; - CopyRect (&rcFill, &rc); CopyRect (&rcArrow, &rc); CopyRect(&rcBitmap, &rc); @@ -714,15 +853,15 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) { int right; - if (dwStyle & TBSTYLE_FLAT) + if (dwStyle & TBSTYLE_FLAT) right = max(rc.left, rc.right - DDARROW_WIDTH); - else + else right = max(rc.left, rc.right - DDARROW_WIDTH - 2); if (drawSepDropDownArrow) rc.right = right; - rcArrow.left = right; + rcArrow.left = right; } /* copy text rect after adjusting for drop-down arrow @@ -732,57 +871,44 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) /* Center the bitmap horizontally and vertically */ if (dwStyle & TBSTYLE_LIST) - rcBitmap.left += LIST_IMAGE_OFFSET; + rcBitmap.left += GetSystemMetrics(SM_CXEDGE) + OFFSET_X; else - rcBitmap.left+=(infoPtr->nButtonWidth - infoPtr->nBitmapWidth) / 2; + rcBitmap.left+=(infoPtr->nButtonWidth - infoPtr->nBitmapWidth) / 2; if(lpText) - rcBitmap.top+=2; /* this looks to be the correct value from vmware comparison - cmm */ + rcBitmap.top+= GetSystemMetrics(SM_CYEDGE) + OFFSET_Y; else rcBitmap.top+=(infoPtr->nButtonHeight - infoPtr->nBitmapHeight) / 2; TRACE("iBitmap: %d, start=(%ld,%ld) w=%d, h=%d\n", - btnPtr->iBitmap, rcBitmap.left, rcBitmap.top, - infoPtr->nBitmapWidth, infoPtr->nBitmapHeight); + btnPtr->iBitmap, rcBitmap.left, rcBitmap.top, + infoPtr->nBitmapWidth, infoPtr->nBitmapHeight); TRACE ("iString: %x\n", btnPtr->iString); TRACE ("Stringtext: %s\n", debugstr_w(lpText)); /* draw text */ if (lpText) { + rcText.left += GetSystemMetrics(SM_CXEDGE) + OFFSET_X; + rcText.right -= GetSystemMetrics(SM_CXEDGE) + OFFSET_X; + if (GETDEFIMAGELIST(infoPtr, GETHIMLID(infoPtr,btnPtr->iBitmap)) && + TOOLBAR_IsValidBitmapIndex(infoPtr,btnPtr->iBitmap)) + { + if (dwStyle & TBSTYLE_LIST) + rcText.left += infoPtr->nBitmapWidth + TOOLBAR_GetListTextOffset(infoPtr, infoPtr->iListGap); + else + rcText.top += GetSystemMetrics(SM_CYEDGE) + OFFSET_Y + infoPtr->nBitmapHeight + infoPtr->szPadding.cy/2; + } + else + if (dwStyle & TBSTYLE_LIST) + rcText.left += LIST_IMAGE_ABSENT_WIDTH + TOOLBAR_GetListTextOffset(infoPtr, infoPtr->iListGap); - InflateRect (&rcText, -3, -3); - - if (GETDEFIMAGELIST(infoPtr, 0) && - TOOLBAR_IsValidBitmapIndex(infoPtr,btnPtr->iBitmap)) { - /* The following test looked like this before - * I changed it. IE4 "Links" toolbar would not - * draw correctly with the original code. - GA 8/01 - * ((dwStyle & TBSTYLE_LIST) && - * ((btnPtr->fsStyle & BTNS_AUTOSIZE) == 0) && - * (btnPtr->iBitmap != I_IMAGENONE)) - */ - if (dwStyle & TBSTYLE_LIST) { - /* LIST style w/ ICON offset is by matching native. */ - /* Matches IE4 "Links" bar. - GA 8/01 */ - rcText.left += (infoPtr->nBitmapWidth + LIST_TEXT_OFFSET); - } - else { - rcText.top += infoPtr->nBitmapHeight + 1; - } - } - else { - if (dwStyle & TBSTYLE_LIST) { - /* LIST style w/o ICON offset is by matching native. */ - /* Matches IE4 "menu" bar. - GA 8/01 */ - rcText.left += LIST_IMAGE_ABSENT_WIDTH + LIST_TEXT_OFFSET; - } - } - - if (btnPtr->fsState & (TBSTATE_PRESSED | TBSTATE_CHECKED)) - OffsetRect (&rcText, 1, 1); + if (btnPtr->fsState & (TBSTATE_PRESSED | TBSTATE_CHECKED)) + OffsetRect (&rcText, 1, 1); } - /* Initialize fields in all cases, because we use these later */ + /* Initialize fields in all cases, because we use these later + * NOTE: applications can and do alter these to customize their + * toolbars */ ZeroMemory (&tbcd, sizeof(NMTBCUSTOMDRAW)); tbcd.clrText = comctl32_color.clrBtnText; tbcd.clrTextHighlight = comctl32_color.clrHighlightText; @@ -792,23 +918,21 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) tbcd.clrHighlightHotTrack = 0; tbcd.nStringBkMode = (infoPtr->bBtnTranspnt) ? TRANSPARENT : OPAQUE; tbcd.nHLStringBkMode = (infoPtr->bBtnTranspnt) ? TRANSPARENT : OPAQUE; - /* MSDN says that this is the text rectangle. */ - /* But (why always a but) tracing of v5.7 of native shows */ - /* that this is really a *relative* rectangle based on the */ - /* the nmcd.rc. Also the left and top are always 0 ignoring*/ - /* any bitmap that might be present. */ + /* MSDN says that this is the text rectangle. + * But (why always a but) tracing of v5.7 of native shows + * that this is really a *relative* rectangle based on the + * the nmcd.rc. Also the left and top are always 0 ignoring + * any bitmap that might be present. */ tbcd.rcText.left = 0; tbcd.rcText.top = 0; tbcd.rcText.right = rcText.right - rc.left; tbcd.rcText.bottom = rcText.bottom - rc.top; - /* we use this state later on to decide how to draw the buttons */ - /* NOTE: applications can and do alter this to customize their */ - /* toolbars */ tbcd.nmcd.uItemState = TOOLBAR_TranslateState(btnPtr); tbcd.nmcd.hdc = hdc; + tbcd.nmcd.rc = rc; tbcd.hbrMonoDither = COMCTL32_hPattern55AABrush; - /* FIXME: what should these be set to ????? */ + /* FIXME: what are these used for? */ tbcd.hbrLines = 0; tbcd.hpenLines = 0; @@ -818,10 +942,13 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) if (infoPtr->dwBaseCustDraw & CDRF_NOTIFYITEMDRAW) { tbcd.nmcd.dwDrawStage = CDDS_ITEMPREPAINT; - tbcd.nmcd.rc = rc; tbcd.nmcd.dwItemSpec = btnPtr->idCommand; tbcd.nmcd.lItemlParam = btnPtr->dwData; ntfret = TOOLBAR_SendNotify ((NMHDR *)&tbcd, infoPtr, NM_CUSTOMDRAW); + /* reset these fields so the user can't alter the behaviour like native */ + tbcd.nmcd.hdc = hdc; + tbcd.nmcd.rc = rc; + infoPtr->dwItemCustDraw = ntfret & 0xffff; infoPtr->dwItemCDFlag = ntfret & 0xffff0000; if (infoPtr->dwItemCustDraw & CDRF_SKIPDEFAULT) @@ -831,9 +958,6 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) rcText.bottom = tbcd.rcText.bottom + rc.top; } - if (!infoPtr->bBtnTranspnt) - FillRect( hdc, &rcFill, GetSysColorBrush(COLOR_BTNFACE)); - /* separator */ if (btnPtr->fsStyle & BTNS_SEP) { /* with the FLAT style, iBitmap is the width and has already */ @@ -854,10 +978,14 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) goto FINALNOTIFY; } + if (!(tbcd.nmcd.uItemState & CDIS_HOT) && + ((tbcd.nmcd.uItemState & CDIS_CHECKED) || (tbcd.nmcd.uItemState & CDIS_INDETERMINATE))) + TOOLBAR_DrawPattern (&rc, &tbcd); + if ((dwStyle & TBSTYLE_FLAT) && (tbcd.nmcd.uItemState & CDIS_HOT)) { - if ( infoPtr->dwItemCDFlag & TBCDRF_HILITEHOTTRACK ) - { + if ( infoPtr->dwItemCDFlag & TBCDRF_HILITEHOTTRACK ) + { COLORREF oldclr; oldclr = SetBkColor(hdc, tbcd.clrHighlightHotTrack); @@ -865,159 +993,36 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) if (hasDropDownArrow) ExtTextOutA(hdc, 0, 0, ETO_OPAQUE, &rcArrow, NULL, 0, 0); SetBkColor(hdc, oldclr); - } - else - { - if (!(tbcd.nmcd.uItemState & CDIS_DISABLED) && !(infoPtr->dwItemCDFlag & TBCDRF_NOEDGES)) - { - DrawEdge (hdc, &rc, BDR_RAISEDINNER, BF_RECT); - if (hasDropDownArrow) - DrawEdge (hdc, &rcArrow, BDR_RAISEDINNER, BF_RECT); - } } } - /* disabled */ - if (tbcd.nmcd.uItemState & CDIS_DISABLED) { - if (!(dwStyle & TBSTYLE_FLAT) && !(infoPtr->dwItemCDFlag & TBCDRF_NOEDGES)) - { - DrawEdge (hdc, &rc, EDGE_RAISED, - BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST); - if (drawSepDropDownArrow) - DrawEdge (hdc, &rcArrow, EDGE_RAISED, - BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST); - } - - if (hasDropDownArrow) - { - TOOLBAR_DrawArrow(hdc, rcArrow.left+1, rcArrow.top+1 + (rcArrow.bottom - rcArrow.top - ARROW_HEIGHT) / 2, COLOR_3DHIGHLIGHT); - TOOLBAR_DrawArrow(hdc, rcArrow.left, rcArrow.top + (rcArrow.bottom - rcArrow.top - ARROW_HEIGHT) / 2, COLOR_3DSHADOW); - } - - if (!TOOLBAR_DrawImageList (infoPtr, btnPtr, IMAGE_LIST_DISABLED, - hdc, rcBitmap.left, rcBitmap.top, - ILD_NORMAL)) - TOOLBAR_DrawMasked (infoPtr, btnPtr, hdc, rcBitmap.left, rcBitmap.top); - - if (!(infoPtr->dwExStyle & TBSTYLE_EX_MIXEDBUTTONS) || (btnPtr->fsStyle & BTNS_SHOWTEXT)) - TOOLBAR_DrawString (infoPtr, &rcText, lpText, &tbcd); - goto FINALNOTIFY; - } - - /* pressed BTNS_BUTTON */ - if (tbcd.nmcd.uItemState & CDIS_SELECTED) { - offset = (infoPtr->dwItemCDFlag & TBCDRF_NOOFFSET) ? 0 : 1; - if (!(infoPtr->dwItemCDFlag & TBCDRF_NOEDGES)) - { - if (dwStyle & TBSTYLE_FLAT) - { - DrawEdge (hdc, &rc, BDR_SUNKENOUTER, BF_RECT | BF_ADJUST); - if (drawSepDropDownArrow) - DrawEdge (hdc, &rcArrow, BDR_SUNKENOUTER, BF_RECT | BF_ADJUST); - } - else - { - DrawEdge (hdc, &rc, EDGE_SUNKEN, BF_RECT | BF_MIDDLE | BF_ADJUST); - if (drawSepDropDownArrow) - DrawEdge (hdc, &rcArrow, EDGE_SUNKEN, BF_RECT | BF_MIDDLE | BF_ADJUST); - } - } - - if (hasDropDownArrow) - TOOLBAR_DrawArrow(hdc, rcArrow.left + offset, rcArrow.top + offset + (rcArrow.bottom - rcArrow.top - ARROW_HEIGHT) / 2, COLOR_WINDOWFRAME); - - TOOLBAR_DrawImageList (infoPtr, btnPtr, IMAGE_LIST_DEFAULT, - hdc, rcBitmap.left+offset, rcBitmap.top+offset, - ILD_NORMAL); - - if (!(infoPtr->dwExStyle & TBSTYLE_EX_MIXEDBUTTONS) || (btnPtr->fsStyle & BTNS_SHOWTEXT)) - TOOLBAR_DrawString (infoPtr, &rcText, lpText, &tbcd); - goto FINALNOTIFY; - } - - /* checked BTNS_CHECK */ - if ((tbcd.nmcd.uItemState & CDIS_CHECKED) && - (btnPtr->fsStyle & BTNS_CHECK)) { - if (!(infoPtr->dwItemCDFlag & TBCDRF_NOEDGES)) - { - if (dwStyle & TBSTYLE_FLAT) - DrawEdge (hdc, &rc, BDR_SUNKENOUTER, - BF_RECT | BF_ADJUST); - else - DrawEdge (hdc, &rc, EDGE_SUNKEN, - BF_RECT | BF_MIDDLE | BF_ADJUST); - } - - TOOLBAR_DrawPattern (&rc, &tbcd); - - TOOLBAR_DrawImageList (infoPtr, btnPtr, IMAGE_LIST_DEFAULT, - hdc, rcBitmap.left+1, rcBitmap.top+1, - ILD_NORMAL); - - if (!(infoPtr->dwExStyle & TBSTYLE_EX_MIXEDBUTTONS) || (btnPtr->fsStyle & BTNS_SHOWTEXT)) - TOOLBAR_DrawString (infoPtr, &rcText, lpText, &tbcd); - goto FINALNOTIFY; - } - - /* indeterminate */ - if (tbcd.nmcd.uItemState & CDIS_INDETERMINATE) { - if (!(infoPtr->dwItemCDFlag & TBCDRF_NOEDGES)) - DrawEdge (hdc, &rc, EDGE_RAISED, - BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST); - - TOOLBAR_DrawPattern (&rc, &tbcd); - TOOLBAR_DrawMasked (infoPtr, btnPtr, hdc, rcBitmap.left, rcBitmap.top); - if (!(infoPtr->dwExStyle & TBSTYLE_EX_MIXEDBUTTONS) || (btnPtr->fsStyle & BTNS_SHOWTEXT)) - TOOLBAR_DrawString (infoPtr, &rcText, lpText, &tbcd); - goto FINALNOTIFY; - } - - /* normal state */ - if (dwStyle & TBSTYLE_FLAT) - { - if (hasDropDownArrow) - TOOLBAR_DrawArrow(hdc, rcArrow.left, rcArrow.top + (rcArrow.bottom - rcArrow.top - ARROW_HEIGHT) / 2, COLOR_WINDOWFRAME); - - if (tbcd.nmcd.uItemState & CDIS_HOT) { - /* if hot, attempt to draw with hot image list, if fails, - use default image list */ - if (!TOOLBAR_DrawImageList (infoPtr, btnPtr, - IMAGE_LIST_HOT, - hdc, rcBitmap.left, - rcBitmap.top, ILD_NORMAL)) - TOOLBAR_DrawImageList (infoPtr, btnPtr, IMAGE_LIST_DEFAULT, - hdc, rcBitmap.left, rcBitmap.top, - ILD_NORMAL); - } - else - TOOLBAR_DrawImageList (infoPtr, btnPtr, IMAGE_LIST_DEFAULT, - hdc, rcBitmap.left, rcBitmap.top, - ILD_NORMAL); - } - else - { - if (!(infoPtr->dwItemCDFlag & TBCDRF_NOEDGES)) - DrawEdge (hdc, &rc, EDGE_RAISED, - BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST); - - if (hasDropDownArrow) - { - if (drawSepDropDownArrow && !(infoPtr->dwItemCDFlag & TBCDRF_NOEDGES)) - DrawEdge (hdc, &rcArrow, EDGE_RAISED, - BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST); - TOOLBAR_DrawArrow(hdc, rcArrow.left, rcArrow.top + (rcArrow.bottom - rcArrow.top - ARROW_HEIGHT) / 2, COLOR_WINDOWFRAME); - } - - TOOLBAR_DrawImageList (infoPtr, btnPtr, IMAGE_LIST_DEFAULT, - hdc, rcBitmap.left, rcBitmap.top, - ILD_NORMAL); - } + TOOLBAR_DrawFrame(infoPtr, dwStyle & TBSTYLE_FLAT, &tbcd); + if (drawSepDropDownArrow) + TOOLBAR_DrawSepDDArrow(infoPtr, dwStyle & TBSTYLE_FLAT, &tbcd, &rcArrow); if (!(infoPtr->dwExStyle & TBSTYLE_EX_MIXEDBUTTONS) || (btnPtr->fsStyle & BTNS_SHOWTEXT)) TOOLBAR_DrawString (infoPtr, &rcText, lpText, &tbcd); - FINALNOTIFY: + TOOLBAR_DrawImage(infoPtr, btnPtr, rcBitmap.left, rcBitmap.top, &tbcd); + + if (hasDropDownArrow && !drawSepDropDownArrow) + { + if (tbcd.nmcd.uItemState & (CDIS_DISABLED | CDIS_INDETERMINATE)) + { + TOOLBAR_DrawArrow(hdc, rcArrow.left+1, rcArrow.top+1 + (rcArrow.bottom - rcArrow.top - ARROW_HEIGHT) / 2, comctl32_color.clrBtnHighlight); + TOOLBAR_DrawArrow(hdc, rcArrow.left, rcArrow.top + (rcArrow.bottom - rcArrow.top - ARROW_HEIGHT) / 2, comctl32_color.clr3dShadow); + } + else if (tbcd.nmcd.uItemState & (CDIS_SELECTED | CDIS_CHECKED)) + { + offset = (infoPtr->dwItemCDFlag & TBCDRF_NOOFFSET) ? 0 : 1; + TOOLBAR_DrawArrow(hdc, rcArrow.left + offset, rcArrow.top + offset + (rcArrow.bottom - rcArrow.top - ARROW_HEIGHT) / 2, comctl32_color.clrBtnText); + } + else + TOOLBAR_DrawArrow(hdc, rcArrow.left, rcArrow.top + (rcArrow.bottom - rcArrow.top - ARROW_HEIGHT) / 2, comctl32_color.clrBtnText); + } + +FINALNOTIFY: if (infoPtr->dwItemCustDraw & CDRF_NOTIFYPOSTPAINT) { tbcd.nmcd.dwDrawStage = CDDS_ITEMPOSTPAINT; @@ -1045,6 +1050,10 @@ TOOLBAR_Refresh (HWND hwnd, HDC hdc, PAINTSTRUCT* ps) NMTBCUSTOMDRAW tbcd; DWORD ntfret; + /* the app has told us not to redraw the toolbar */ + if (!infoPtr->bDoRedraw) + return; + /* if imagelist belongs to the app, it can be changed by the app after setting it */ if (GETDEFIMAGELIST(infoPtr, 0) != infoPtr->himlInt) @@ -1082,6 +1091,7 @@ TOOLBAR_Refresh (HWND hwnd, HDC hdc, PAINTSTRUCT* ps) else bDraw = TRUE; bDraw &= IntersectRect(&rcTemp, &(ps->rcPaint), &(btnPtr->rect)); + bDraw = (btnPtr->fsState & TBSTATE_HIDDEN) ? FALSE : bDraw; if (bDraw) TOOLBAR_DrawButton (hwnd, btnPtr, hdc); } @@ -1397,6 +1407,8 @@ TOOLBAR_CalcToolbar (HWND hwnd) TOOLBAR_CalcStrings (hwnd, &sizeString); + TOOLBAR_DumpToolbar (infoPtr, __LINE__); + for (i = 0; i < infoPtr->nNumButtons && !usesBitmaps; i++) { if (TOOLBAR_IsValidBitmapIndex(infoPtr,infoPtr->buttons[i].iBitmap)) @@ -1407,29 +1419,30 @@ TOOLBAR_CalcToolbar (HWND hwnd) infoPtr->nButtonHeight = max((usesBitmaps) ? infoPtr->nBitmapHeight : 0, sizeString.cy) + infoPtr->szPadding.cy; infoPtr->nButtonWidth = ((usesBitmaps) ? infoPtr->nBitmapWidth : - 0) + sizeString.cx + 6; + LIST_IMAGE_ABSENT_WIDTH) + sizeString.cx + infoPtr->szPadding.cx; + if (sizeString.cx > 0) + infoPtr->nButtonWidth += TOOLBAR_GetListTextOffset(infoPtr, infoPtr->iListGap) + infoPtr->szPadding.cx/2; TRACE("LIST style, But w=%d h=%d, useBitmaps=%d, Bit w=%d h=%d\n", infoPtr->nButtonWidth, infoPtr->nButtonHeight, usesBitmaps, infoPtr->nBitmapWidth, infoPtr->nBitmapHeight); - TOOLBAR_DumpToolbar (infoPtr, __LINE__); } else { if (sizeString.cy > 0) { if (usesBitmaps) infoPtr->nButtonHeight = sizeString.cy + - 2 + /* this is the space to separate text from bitmap */ - infoPtr->nBitmapHeight + 6; + infoPtr->szPadding.cy/2 + /* this is the space to separate text from bitmap */ + infoPtr->nBitmapHeight + infoPtr->szPadding.cy; else - infoPtr->nButtonHeight = sizeString.cy + 6; + infoPtr->nButtonHeight = sizeString.cy + infoPtr->szPadding.cy; } else - infoPtr->nButtonHeight = infoPtr->nBitmapHeight + 6; + infoPtr->nButtonHeight = infoPtr->nBitmapHeight + infoPtr->szPadding.cy; if (sizeString.cx > infoPtr->nBitmapWidth) - infoPtr->nButtonWidth = sizeString.cx + 6; + infoPtr->nButtonWidth = sizeString.cx + infoPtr->szPadding.cx; else - infoPtr->nButtonWidth = infoPtr->nBitmapWidth + 6; + infoPtr->nButtonWidth = infoPtr->nBitmapWidth + infoPtr->szPadding.cx; } if ( infoPtr->cxMin >= 0 && infoPtr->nButtonWidth < infoPtr->cxMin ) @@ -1442,17 +1455,6 @@ TOOLBAR_CalcToolbar (HWND hwnd) x = infoPtr->nIndent; y = 0; - /* - * We will set the height below, and we set the width on entry - * so we do not reset them here.. - */ -#if 0 - GetClientRect( hwnd, &rc ); - /* get initial values for toolbar */ - infoPtr->nWidth = rc.right - rc.left; - infoPtr->nHeight = rc.bottom - rc.top; -#endif - /* from above, minimum is a button, and possible text */ cx = infoPtr->nButtonWidth; @@ -1471,12 +1473,6 @@ TOOLBAR_CalcToolbar (HWND hwnd) btnPtr = infoPtr->buttons; - /* do not base height/width on parent, if the parent is a */ - /* rebar control it could have multiple rows of toolbars */ -/* GetClientRect( GetParent(hwnd), &rc ); */ -/* cx = rc.right - rc.left; */ -/* cy = rc.bottom - rc.top; */ - TRACE("cy=%d\n", cy); for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++ ) @@ -1505,7 +1501,9 @@ TOOLBAR_CalcToolbar (HWND hwnd) } else { - if ((infoPtr->dwExStyle & TBSTYLE_EX_MIXEDBUTTONS) || + if (btnPtr->cx) + cx = btnPtr->cx; + else if ((infoPtr->dwExStyle & TBSTYLE_EX_MIXEDBUTTONS) || (btnPtr->fsStyle & BTNS_AUTOSIZE)) { SIZE sz; @@ -1520,15 +1518,19 @@ TOOLBAR_CalcToolbar (HWND hwnd) SelectObject (hdc, hOldFont); ReleaseDC (hwnd, hdc); - if (sz.cx > 0) - sz.cx += 2*LIST_TEXT_OFFSET; - cx = sz.cx + 2*LIST_IMAGE_OFFSET; + /* add space on for button frame, etc */ + cx = sz.cx + infoPtr->szPadding.cx; + + /* add list padding */ + if ((dwStyle & TBSTYLE_LIST) && sz.cx > 0) + cx += TOOLBAR_GetListTextOffset(infoPtr, infoPtr->iListGap) + infoPtr->szPadding.cx/2; + if (TOOLBAR_TestImageExist (infoPtr, btnPtr, GETDEFIMAGELIST(infoPtr,0))) { if (dwStyle & TBSTYLE_LIST) cx += infoPtr->nBitmapWidth; - else if (cx < (infoPtr->nBitmapWidth+7)) - cx = infoPtr->nBitmapWidth+7; + else if (cx < (infoPtr->nBitmapWidth+infoPtr->szPadding.cx)) + cx = infoPtr->nBitmapWidth+infoPtr->szPadding.cx; } else if (dwStyle & TBSTYLE_LIST) cx += LIST_IMAGE_ABSENT_WIDTH; @@ -1536,7 +1538,10 @@ TOOLBAR_CalcToolbar (HWND hwnd) else cx = infoPtr->nButtonWidth; - if ((hasDropDownArrows && (btnPtr->fsStyle & BTNS_DROPDOWN)) || (btnPtr->fsStyle & BTNS_WHOLEDROPDOWN)) + /* if size has been set manually then don't add on extra space + * for the drop down arrow */ + if (!btnPtr->cx && hasDropDownArrows && + ((btnPtr->fsStyle & BTNS_DROPDOWN) || (btnPtr->fsStyle & BTNS_WHOLEDROPDOWN))) cx += DDARROW_WIDTH; } if (btnPtr->fsState & TBSTATE_WRAP ) @@ -1969,6 +1974,8 @@ TOOLBAR_CustomizeDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) if (TOOLBAR_SendNotify ((NMHDR *) &nmtb, infoPtr, TBN_QUERYINSERT)) { + NMHDR hdr; + btnInfo = (PCUSTOMBUTTON)SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_GETITEMDATA, index, 0); SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_DELETESTRING, index, 0); @@ -1983,6 +1990,8 @@ TOOLBAR_CustomizeDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) SendMessageA (custInfo->tbHwnd, TB_DELETEBUTTON, index, 0); SendMessageA (custInfo->tbHwnd, TB_INSERTBUTTONA, index-1, (LPARAM)&(btnInfo->btn)); + + TOOLBAR_SendNotify(&hdr, infoPtr, TBN_TOOLBARCHANGE); } } break; @@ -2002,6 +2011,8 @@ TOOLBAR_CustomizeDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) if (TOOLBAR_SendNotify ((NMHDR *) &nmtb, infoPtr, TBN_QUERYINSERT)) { + NMHDR hdr; + btnInfo = (PCUSTOMBUTTON)SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_GETITEMDATA, index, 0); /* move button down */ @@ -2017,6 +2028,8 @@ TOOLBAR_CustomizeDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) SendMessageA (custInfo->tbHwnd, TB_DELETEBUTTON, index, 0); SendMessageA (custInfo->tbHwnd, TB_INSERTBUTTONA, index+1, (LPARAM)&(btnInfo->btn)); + + TOOLBAR_SendNotify(&hdr, infoPtr, TBN_TOOLBARCHANGE); } } break; @@ -2039,6 +2052,8 @@ TOOLBAR_CustomizeDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) /* send TBN_QUERYDELETE notification */ if (TOOLBAR_IsButtonRemovable(infoPtr, index, btnInfo)) { + NMHDR hdr; + btnInfo = (PCUSTOMBUTTON)SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_GETITEMDATA, index, 0); SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_DELETESTRING, index, 0); SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_SETCURSEL, index , 0); @@ -2053,6 +2068,8 @@ TOOLBAR_CustomizeDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) } else Free (btnInfo); + + TOOLBAR_SendNotify(&hdr, infoPtr, TBN_TOOLBARCHANGE); } } break; @@ -2077,6 +2094,8 @@ TOOLBAR_CustomizeDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) if (TOOLBAR_SendNotify ((NMHDR *) &nmtb, infoPtr, TBN_QUERYINSERT)) { + NMHDR hdr; + btnInfo = (PCUSTOMBUTTON)SendDlgItemMessageA (hwnd, IDC_AVAILBTN_LBOX, LB_GETITEMDATA, index, 0); if (index != 0) @@ -2104,6 +2123,8 @@ TOOLBAR_CustomizeDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_SETITEMDATA, index, (LPARAM)btnInfo); SendMessageA (custInfo->tbHwnd, TB_INSERTBUTTONA, index, (LPARAM)&(btnInfo->btn)); + + TOOLBAR_SendNotify(&hdr, infoPtr, TBN_TOOLBARCHANGE); } } break; @@ -2448,7 +2469,7 @@ TOOLBAR_AddBitmap (HWND hwnd, WPARAM wParam, LPARAM lParam) infoPtr->nNumBitmaps += nButtons; } - InvalidateRect(hwnd, NULL, FALSE); + InvalidateRect(hwnd, NULL, TRUE); return nIndex; } @@ -2515,7 +2536,7 @@ TOOLBAR_AddButtonsA (HWND hwnd, WPARAM wParam, LPARAM lParam) TOOLBAR_DumpToolbar (infoPtr, __LINE__); - InvalidateRect(hwnd, NULL, FALSE); + InvalidateRect(hwnd, NULL, TRUE); return TRUE; } @@ -2583,7 +2604,7 @@ TOOLBAR_AddButtonsW (HWND hwnd, WPARAM wParam, LPARAM lParam) TOOLBAR_DumpToolbar (infoPtr, __LINE__); - InvalidateRect(hwnd, NULL, FALSE); + InvalidateRect(hwnd, NULL, TRUE); return TRUE; } @@ -2899,14 +2920,14 @@ TOOLBAR_CheckButton (HWND hwnd, WPARAM wParam, LPARAM lParam) BOOL bChecked = FALSE; nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE); + + TRACE("hwnd=%p, btn index=%d, lParam=0x%08lx\n", hwnd, nIndex, lParam); + if (nIndex == -1) return FALSE; btnPtr = &infoPtr->buttons[nIndex]; - if (!(btnPtr->fsStyle & BTNS_CHECK)) - return FALSE; - bChecked = (btnPtr->fsState & TBSTATE_CHECKED) ? TRUE : FALSE; if (LOWORD(lParam) == FALSE) @@ -2925,11 +2946,8 @@ TOOLBAR_CheckButton (HWND hwnd, WPARAM wParam, LPARAM lParam) if( bChecked != LOWORD(lParam) ) { - if (nOldIndex != -1) - { - InvalidateRect(hwnd, &infoPtr->buttons[nOldIndex].rect, - TOOLBAR_HasText(infoPtr, &infoPtr->buttons[nOldIndex])); - } + if (nOldIndex != -1) + InvalidateRect(hwnd, &infoPtr->buttons[nOldIndex].rect, TRUE); InvalidateRect(hwnd, &btnPtr->rect, TRUE); } @@ -2992,10 +3010,15 @@ TOOLBAR_DeleteButton (HWND hwnd, WPARAM wParam, LPARAM lParam) { TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); INT nIndex = (INT)wParam; + NMTOOLBARW nmtb; if ((nIndex < 0) || (nIndex >= infoPtr->nNumButtons)) return FALSE; + memset(&nmtb, 0, sizeof(nmtb)); + nmtb.iItem = nIndex; + TOOLBAR_SendNotify((NMHDR *)&nmtb, infoPtr, TBN_DELETINGBUTTON); + if ((infoPtr->hwndToolTip) && !(infoPtr->buttons[nIndex].fsStyle & BTNS_SEP)) { TTTOOLINFOA ti; @@ -3050,6 +3073,9 @@ TOOLBAR_EnableButton (HWND hwnd, WPARAM wParam, LPARAM lParam) DWORD bState; nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE); + + TRACE("hwnd=%p, btn index=%d, lParam=0x%08lx\n", hwnd, wParam, lParam); + if (nIndex == -1) return FALSE; @@ -3066,10 +3092,7 @@ TOOLBAR_EnableButton (HWND hwnd, WPARAM wParam, LPARAM lParam) /* redraw the button only if the state of the button changed */ if(bState != (btnPtr->fsState & TBSTATE_ENABLED)) - { - InvalidateRect(hwnd, &btnPtr->rect, - TOOLBAR_HasText(infoPtr, btnPtr)); - } + InvalidateRect(hwnd, &btnPtr->rect, TRUE); return TRUE; } @@ -3576,7 +3599,7 @@ TOOLBAR_Indeterminate (HWND hwnd, WPARAM wParam, LPARAM lParam) btnPtr->fsState |= TBSTATE_INDETERMINATE; if(oldState != btnPtr->fsState) - InvalidateRect(hwnd, &btnPtr->rect, TOOLBAR_HasText(infoPtr, btnPtr)); + InvalidateRect(hwnd, &btnPtr->rect, TRUE); return TRUE; } @@ -3869,10 +3892,153 @@ TOOLBAR_IsButtonPressed (HWND hwnd, WPARAM wParam, LPARAM lParam) } -/* << TOOLBAR_LoadImages >> */ -/* << TOOLBAR_MapAccelerator >> */ -/* << TOOLBAR_MarkButton >> */ -/* << TOOLBAR_MoveButton >> */ +static LRESULT +TOOLBAR_LoadImages (HWND hwnd, WPARAM wParam, LPARAM lParam) +{ + TBADDBITMAP tbab; + tbab.hInst = (HINSTANCE)lParam; + tbab.nID = (UINT_PTR)wParam; + + TRACE("hwnd = %p, hInst = %p, nID = %u\n", hwnd, tbab.hInst, tbab.nID); + + return TOOLBAR_AddBitmap(hwnd, 0, (LPARAM)&tbab); +} + + +static LRESULT +TOOLBAR_MapAccelerator (HWND hwnd, WPARAM wParam, LPARAM lParam) +{ + TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); + WCHAR wAccel = (WCHAR)wParam; + UINT* pIDButton = (UINT*)lParam; + WCHAR wszAccel[] = {'&',wAccel,0}; + int i; + + TRACE("hwnd = %p, wAccel = %x(%s), pIDButton = %p\n", + hwnd, wAccel, debugstr_wn(&wAccel,1), pIDButton); + + for (i = 0; i < infoPtr->nNumButtons; i++) + { + TBUTTON_INFO *btnPtr = infoPtr->buttons+i; + if (!(btnPtr->fsStyle & BTNS_NOPREFIX) && + !(btnPtr->fsState & TBSTATE_HIDDEN)) + { + int iLen = strlenW(wszAccel); + LPCWSTR lpszStr = TOOLBAR_GetText(infoPtr, btnPtr); + + if (!lpszStr) + continue; + + while (*lpszStr) + { + if ((lpszStr[0] == '&') && (lpszStr[1] == '&')) + { + lpszStr += 2; + continue; + } + if (!strncmpiW(lpszStr, wszAccel, iLen)) + { + *pIDButton = btnPtr->idCommand; + return TRUE; + } + lpszStr++; + } + } + } + return FALSE; +} + + +static LRESULT +TOOLBAR_MarkButton (HWND hwnd, WPARAM wParam, LPARAM lParam) +{ + TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); + INT nIndex; + + TRACE("hwnd = %p, wParam = %d, lParam = 0x%08lx\n", hwnd, wParam, lParam); + + nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE); + if (nIndex == -1) + return FALSE; + + if (LOWORD(lParam)) + infoPtr->buttons[nIndex].fsState |= TBSTATE_MARKED; + else + infoPtr->buttons[nIndex].fsState &= ~TBSTATE_MARKED; + + return TRUE; +} + + +/* fixes up an index of a button affected by a move */ +inline static void TOOLBAR_MoveFixupIndex(INT* pIndex, INT nIndex, INT nMoveIndex, BOOL bMoveUp) +{ + if (bMoveUp) + { + if (*pIndex > nIndex && *pIndex <= nMoveIndex) + (*pIndex)--; + else if (*pIndex == nIndex) + *pIndex = nMoveIndex; + } + else + { + if (*pIndex >= nMoveIndex && *pIndex < nIndex) + (*pIndex)++; + else if (*pIndex == nIndex) + *pIndex = nMoveIndex; + } +} + + +static LRESULT +TOOLBAR_MoveButton (HWND hwnd, WPARAM wParam, LPARAM lParam) +{ + TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); + INT nIndex; + INT nCount; + INT nMoveIndex = (INT)lParam; + TBUTTON_INFO button; + + TRACE("hwnd=%p, wParam=%d, lParam=%ld\n", hwnd, wParam, lParam); + + nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, TRUE); + if ((nIndex == -1) || (nMoveIndex < 0)) + return FALSE; + + if (nMoveIndex > infoPtr->nNumButtons - 1) + nMoveIndex = infoPtr->nNumButtons - 1; + + button = infoPtr->buttons[nIndex]; + + /* move button right */ + if (nIndex < nMoveIndex) + { + nCount = nMoveIndex - nIndex; + memmove(&infoPtr->buttons[nIndex], &infoPtr->buttons[nIndex+1], nCount*sizeof(TBUTTON_INFO)); + infoPtr->buttons[nMoveIndex] = button; + + TOOLBAR_MoveFixupIndex(&infoPtr->nButtonDown, nIndex, nMoveIndex, TRUE); + TOOLBAR_MoveFixupIndex(&infoPtr->nButtonDrag, nIndex, nMoveIndex, TRUE); + TOOLBAR_MoveFixupIndex(&infoPtr->nOldHit, nIndex, nMoveIndex, TRUE); + TOOLBAR_MoveFixupIndex(&infoPtr->nHotItem, nIndex, nMoveIndex, TRUE); + } + else if (nIndex > nMoveIndex) /* move button left */ + { + nCount = nIndex - nMoveIndex; + memmove(&infoPtr->buttons[nMoveIndex+1], &infoPtr->buttons[nMoveIndex], nCount*sizeof(TBUTTON_INFO)); + infoPtr->buttons[nMoveIndex] = button; + + TOOLBAR_MoveFixupIndex(&infoPtr->nButtonDown, nIndex, nMoveIndex, FALSE); + TOOLBAR_MoveFixupIndex(&infoPtr->nButtonDrag, nIndex, nMoveIndex, FALSE); + TOOLBAR_MoveFixupIndex(&infoPtr->nOldHit, nIndex, nMoveIndex, FALSE); + TOOLBAR_MoveFixupIndex(&infoPtr->nHotItem, nIndex, nMoveIndex, FALSE); + } + + TOOLBAR_CalcToolbar(hwnd); + InvalidateRect(hwnd, NULL, TRUE); + + return TRUE; +} static LRESULT @@ -3895,7 +4061,7 @@ TOOLBAR_PressButton (HWND hwnd, WPARAM wParam, LPARAM lParam) btnPtr->fsState |= TBSTATE_PRESSED; if(oldState != btnPtr->fsState) - InvalidateRect(hwnd, &btnPtr->rect, TOOLBAR_HasText(infoPtr, btnPtr)); + InvalidateRect(hwnd, &btnPtr->rect, TRUE); return TRUE; } @@ -3999,7 +4165,7 @@ TOOLBAR_ReplaceBitmap (HWND hwnd, WPARAM wParam, LPARAM lParam) TRACE(" pos %d %d old bitmaps replaced by %d new ones.\n", pos, nOldBitmaps, nNewBitmaps); - InvalidateRect(hwnd, NULL, FALSE); + InvalidateRect(hwnd, NULL, TRUE); return TRUE; } @@ -4083,6 +4249,11 @@ TOOLBAR_SetBitmapSize (HWND hwnd, WPARAM wParam, LPARAM lParam) TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); HIMAGELIST himlDef = GETDEFIMAGELIST(infoPtr, 0); + TRACE("hwnd=%p, wParam=%d, lParam=%ld\n", hwnd, wParam, lParam); + + if (wParam != 0) + FIXME("wParam is %d. Perhaps image list index?\n", wParam); + if ((LOWORD(lParam) <= 0) || (HIWORD(lParam)<=0)) return FALSE; @@ -4096,10 +4267,11 @@ TOOLBAR_SetBitmapSize (HWND hwnd, WPARAM wParam, LPARAM lParam) infoPtr->nBitmapHeight = (INT)HIWORD(lParam); - /* uses image list internals directly */ - if (himlDef) { - himlDef->cx = infoPtr->nBitmapWidth; - himlDef->cy = infoPtr->nBitmapHeight; + if ((himlDef == infoPtr->himlInt) && + (ImageList_GetImageCount(infoPtr->himlInt) == 0)) + { + ImageList_SetIconSize(infoPtr->himlInt, infoPtr->nBitmapWidth, + infoPtr->nBitmapHeight); } return TRUE; @@ -4113,6 +4285,7 @@ TOOLBAR_SetButtonInfoA (HWND hwnd, WPARAM wParam, LPARAM lParam) LPTBBUTTONINFOA lptbbi = (LPTBBUTTONINFOA)lParam; TBUTTON_INFO *btnPtr; INT nIndex; + RECT oldBtnRect; if (lptbbi == NULL) return FALSE; @@ -4131,8 +4304,8 @@ TOOLBAR_SetButtonInfoA (HWND hwnd, WPARAM wParam, LPARAM lParam) btnPtr->iBitmap = lptbbi->iImage; if (lptbbi->dwMask & TBIF_LPARAM) btnPtr->dwData = lptbbi->lParam; -/* if (lptbbi->dwMask & TBIF_SIZE) */ -/* btnPtr->cx = lptbbi->cx; */ + if (lptbbi->dwMask & TBIF_SIZE) + btnPtr->cx = lptbbi->cx; if (lptbbi->dwMask & TBIF_STATE) btnPtr->fsState = lptbbi->fsState; if (lptbbi->dwMask & TBIF_STYLE) @@ -4145,6 +4318,16 @@ TOOLBAR_SetButtonInfoA (HWND hwnd, WPARAM wParam, LPARAM lParam) Str_SetPtrAtoW ((LPWSTR *)&btnPtr->iString, lptbbi->pszText); } + + /* save the button rect to see if we need to redraw the whole toolbar */ + oldBtnRect = btnPtr->rect; + TOOLBAR_CalcToolbar(hwnd); + + if (!EqualRect(&oldBtnRect, &btnPtr->rect)) + InvalidateRect(hwnd, NULL, TRUE); + else + InvalidateRect(hwnd, &btnPtr->rect, TRUE); + return TRUE; } @@ -4156,6 +4339,7 @@ TOOLBAR_SetButtonInfoW (HWND hwnd, WPARAM wParam, LPARAM lParam) LPTBBUTTONINFOW lptbbi = (LPTBBUTTONINFOW)lParam; TBUTTON_INFO *btnPtr; INT nIndex; + RECT oldBtnRect; if (lptbbi == NULL) return FALSE; @@ -4174,8 +4358,8 @@ TOOLBAR_SetButtonInfoW (HWND hwnd, WPARAM wParam, LPARAM lParam) btnPtr->iBitmap = lptbbi->iImage; if (lptbbi->dwMask & TBIF_LPARAM) btnPtr->dwData = lptbbi->lParam; -/* if (lptbbi->dwMask & TBIF_SIZE) */ -/* btnPtr->cx = lptbbi->cx; */ + if (lptbbi->dwMask & TBIF_SIZE) + btnPtr->cx = lptbbi->cx; if (lptbbi->dwMask & TBIF_STATE) btnPtr->fsState = lptbbi->fsState; if (lptbbi->dwMask & TBIF_STYLE) @@ -4187,6 +4371,16 @@ TOOLBAR_SetButtonInfoW (HWND hwnd, WPARAM wParam, LPARAM lParam) btnPtr->iString=0; Str_SetPtrW ((LPWSTR *)&btnPtr->iString, lptbbi->pszText); } + + /* save the button rect to see if we need to redraw the whole toolbar */ + oldBtnRect = btnPtr->rect; + TOOLBAR_CalcToolbar(hwnd); + + if (!EqualRect(&oldBtnRect, &btnPtr->rect)) + InvalidateRect(hwnd, NULL, TRUE); + else + InvalidateRect(hwnd, &btnPtr->rect, TRUE); + return TRUE; } @@ -4342,7 +4536,7 @@ TOOLBAR_SetExtendedStyle (HWND hwnd, WPARAM wParam, LPARAM lParam) TOOLBAR_AutoSize(hwnd); - InvalidateRect(hwnd, NULL, FALSE); + InvalidateRect(hwnd, NULL, TRUE); return (LRESULT)dwTemp; } @@ -4370,35 +4564,69 @@ TOOLBAR_SetHotImageList (HWND hwnd, WPARAM wParam, LPARAM lParam) } +/* Makes previous hot button no longer hot, makes the specified + * button hot and sends appropriate notifications. dwReason is one or + * more HICF_ flags. Specify nHit < 0 to make no buttons hot. + * NOTE 1: this function does not validate nHit + * NOTE 2: the name of this function is completely made up and + * not based on any documentation from Microsoft. */ +static void +TOOLBAR_SetHotItemEx (TOOLBAR_INFO *infoPtr, INT nHit, DWORD dwReason) +{ + if (infoPtr->nHotItem != nHit) + { + NMTBHOTITEM nmhotitem; + TBUTTON_INFO *btnPtr = NULL, *oldBtnPtr = NULL; + LRESULT no_highlight; + + /* Remove the effect of an old hot button if the button was + drawn with the hot button effect */ + if(infoPtr->nHotItem >= 0) + { + oldBtnPtr = &infoPtr->buttons[infoPtr->nHotItem]; + oldBtnPtr->bHot = FALSE; + } + + infoPtr->nHotItem = nHit; + + /* It's not a separator or in nowhere. It's a hot button. */ + if (nHit >= 0) + btnPtr = &infoPtr->buttons[nHit]; + + nmhotitem.dwFlags = dwReason; + if (oldBtnPtr) + nmhotitem.idOld = oldBtnPtr->idCommand; + else + nmhotitem.dwFlags |= HICF_ENTERING; + if (btnPtr) + nmhotitem.idNew = btnPtr->idCommand; + else + nmhotitem.dwFlags |= HICF_LEAVING; + + no_highlight = TOOLBAR_SendNotify((NMHDR*)&nmhotitem, infoPtr, TBN_HOTITEMCHANGE); + + /* now invalidate the old and new buttons so they will be painted */ + if (oldBtnPtr) + InvalidateRect(infoPtr->hwndSelf, &oldBtnPtr->rect, TRUE); + if (btnPtr && !no_highlight) + { + btnPtr->bHot = TRUE; + InvalidateRect(infoPtr->hwndSelf, &btnPtr->rect, TRUE); + } + } +} + static LRESULT TOOLBAR_SetHotItem (HWND hwnd, WPARAM wParam) { TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(hwnd); INT nOldHotItem = infoPtr->nHotItem; - TBUTTON_INFO *btnPtr; if ((INT) wParam < 0 || (INT)wParam > infoPtr->nNumButtons) wParam = -2; - if (GetWindowLongA (hwnd, GWL_STYLE) & TBSTYLE_FLAT) - { - - infoPtr->nHotItem = (INT)wParam; - if ((INT)wParam >=0) - { - btnPtr = &infoPtr->buttons[(INT)wParam]; - btnPtr->bHot = TRUE; - InvalidateRect (hwnd, &btnPtr->rect, - TOOLBAR_HasText(infoPtr, btnPtr)); - } - if (nOldHotItem>=0) - { - btnPtr = &infoPtr->buttons[nOldHotItem]; - btnPtr->bHot = FALSE; - InvalidateRect (hwnd, &btnPtr->rect, - TOOLBAR_HasText(infoPtr, btnPtr)); - } - } + if (GetWindowLongW(hwnd, GWL_STYLE) & TBSTYLE_FLAT) + TOOLBAR_SetHotItemEx(infoPtr, wParam, HICF_OTHER); if (nOldHotItem < 0) return -1; @@ -4431,7 +4659,6 @@ TOOLBAR_SetImageList (HWND hwnd, WPARAM wParam, LPARAM lParam) hwnd, (INT)infoPtr->himlDef, infoPtr->nNumBitmaps, infoPtr->nBitmapWidth, infoPtr->nBitmapHeight); - /* FIXME: redraw ? */ InvalidateRect(hwnd, NULL, TRUE); return (LRESULT)himlTemp; @@ -4490,6 +4717,16 @@ TOOLBAR_SetMaxTextRows (HWND hwnd, WPARAM wParam, LPARAM lParam) } +/* MSDN gives slightly wrong info on padding. + * 1. It is not only used on buttons with the BTNS_AUTOSIZE style + * 2. It is not used to create a blank area between the edge of the button + * and the text or image if TBSTYLE_LIST is set. It is used to control + * the gap between the image and text. + * 3. It is not applied to both sides. If TBSTYLE_LIST is set it is used + * to control the bottom and right borders [with the border being + * szPadding.cx - (GetSystemMetrics(SM_CXEDGE)+1)], otherwise the padding + * is shared evenly on both sides of the button. + */ static LRESULT TOOLBAR_SetPadding (HWND hwnd, WPARAM wParam, LPARAM lParam) { @@ -4499,7 +4736,7 @@ TOOLBAR_SetPadding (HWND hwnd, WPARAM wParam, LPARAM lParam) oldPad = MAKELONG(infoPtr->szPadding.cx, infoPtr->szPadding.cy); infoPtr->szPadding.cx = LOWORD((DWORD)lParam); infoPtr->szPadding.cy = HIWORD((DWORD)lParam); - FIXME("stub - nothing done with values, cx=%ld, cy=%ld\n", + TRACE("cx=%ld, cy=%ld\n", infoPtr->szPadding.cx, infoPtr->szPadding.cy); return (LRESULT) oldPad; } @@ -4542,7 +4779,7 @@ TOOLBAR_SetRows (HWND hwnd, WPARAM wParam, LPARAM lParam) TOOLBAR_CalcToolbar (hwnd); /* repaint toolbar */ - InvalidateRect(hwnd, NULL, FALSE); + InvalidateRect(hwnd, NULL, TRUE); } /* return bounding rectangle */ @@ -4574,7 +4811,7 @@ TOOLBAR_SetState (HWND hwnd, WPARAM wParam, LPARAM lParam) if ((btnPtr->fsState & TBSTATE_HIDDEN) != (LOWORD(lParam) & TBSTATE_HIDDEN)) { btnPtr->fsState = LOWORD(lParam); TOOLBAR_CalcToolbar (hwnd); - InvalidateRect(hwnd, 0, TOOLBAR_HasText(infoPtr, btnPtr)); + InvalidateRect(hwnd, 0, TRUE); return TRUE; } @@ -4582,8 +4819,7 @@ TOOLBAR_SetState (HWND hwnd, WPARAM wParam, LPARAM lParam) if(btnPtr->fsState != LOWORD(lParam)) { btnPtr->fsState = LOWORD(lParam); - InvalidateRect(hwnd, &btnPtr->rect, TOOLBAR_HasText(infoPtr, - btnPtr)); + InvalidateRect(hwnd, &btnPtr->rect, TRUE); } return TRUE; @@ -4604,6 +4840,8 @@ TOOLBAR_SetToolTips (HWND hwnd, WPARAM wParam, LPARAM lParam) { TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); + TRACE("hwnd=%p, hwndTooltip=%p, lParam=0x%lx\n", hwnd, (HWND)wParam, lParam); + if (infoPtr == NULL) return 0; infoPtr->hwndToolTip = (HWND)wParam; @@ -4652,7 +4890,7 @@ TOOLBAR_SetColorScheme (HWND hwnd, LPCOLORSCHEME lParam) infoPtr->clrBtnHighlight = lParam->clrBtnHighlight; infoPtr->clrBtnShadow = lParam->clrBtnShadow; - InvalidateRect(hwnd, 0, 0); + InvalidateRect(hwnd, NULL, TRUE); return 0; } @@ -4722,69 +4960,56 @@ TOOLBAR_GetStringW (HWND hwnd, WPARAM wParam, LPARAM lParam) return ret; } +/* UNDOCUMENTED MESSAGE: This appears to set some kind of size. Perhaps it + * is the maximum size of the toolbar? */ static LRESULT TOOLBAR_Unkwn45D(HWND hwnd, WPARAM wParam, LPARAM lParam) { - FIXME("hwnd=%p wParam %08x lParam %08lx stub!\n", hwnd, wParam, lParam); + SIZE * pSize = (SIZE*)lParam; + FIXME("hwnd=%p, wParam=0x%08x, size.cx=%ld, size.cy=%ld stub!\n", hwnd, wParam, pSize->cx, pSize->cy); return 0; } -/*********************************************************************/ -/* */ -/* This is undocumented and appears to be a "Super" TB_SETHOTITEM */ -/* without the restriction of TBSTYLE_FLAT. This implementation is */ -/* based on relay traces of the native control and IE 5.5 */ -/* */ -/*********************************************************************/ + +/* UNDOCUMENTED MESSAGE: This is an extended version of the + * TB_SETHOTITEM message. It allows the caller to specify a reason why the + * hot item changed (rather than just the HICF_OTHER that TB_SETHOTITEM + * sends). */ static LRESULT TOOLBAR_Unkwn45E (HWND hwnd, WPARAM wParam, LPARAM lParam) { TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(hwnd); INT nOldHotItem = infoPtr->nHotItem; - TBUTTON_INFO *btnPtr; - INT no_hi = 0; - NMTBHOTITEM nmhotitem; + + TRACE("old item=%d, new item=%d, flags=%08lx\n", + nOldHotItem, infoPtr->nHotItem, (DWORD)lParam); if ((INT) wParam < 0 || (INT)wParam > infoPtr->nNumButtons) - wParam = -2; + wParam = -1; + + TOOLBAR_SetHotItemEx(infoPtr, wParam, lParam); - infoPtr->nHotItem = (INT)wParam; - if (nOldHotItem != infoPtr->nHotItem) { - nmhotitem.dwFlags = (DWORD)lParam; - if ( !(nmhotitem.dwFlags & HICF_ENTERING) ) - nmhotitem.idOld = (nOldHotItem >= 0) ? - infoPtr->buttons[nOldHotItem].idCommand : 0; - if ( !(nmhotitem.dwFlags & HICF_LEAVING) ) - nmhotitem.idNew = (infoPtr->nHotItem >= 0) ? - infoPtr->buttons[infoPtr->nHotItem].idCommand : 0; - no_hi = TOOLBAR_SendNotify((NMHDR*)&nmhotitem, infoPtr, TBN_HOTITEMCHANGE); - } - if ((INT)wParam >=0) { - btnPtr = &infoPtr->buttons[(INT)wParam]; - btnPtr->bHot = (no_hi) ? FALSE : TRUE; - InvalidateRect (hwnd, &btnPtr->rect, - TOOLBAR_HasText(infoPtr, btnPtr)); - } - if (nOldHotItem>=0) { - btnPtr = &infoPtr->buttons[nOldHotItem]; - btnPtr->bHot = FALSE; - InvalidateRect (hwnd, &btnPtr->rect, - TOOLBAR_HasText(infoPtr, btnPtr)); - } GetFocus(); - TRACE("old item=%d, new item=%d, flags=%08lx, notify=%d\n", - nOldHotItem, infoPtr->nHotItem, (DWORD)lParam, no_hi); - if (nOldHotItem < 0) - return -1; - - return (LRESULT)nOldHotItem; + return (nOldHotItem < 0) ? -1 : (LRESULT)nOldHotItem; } +/* UNDOCUMENTED MESSAGE: This sets the toolbar global iListGap parameter + * which controls the amount of spacing between the image and the text + * of buttons for TBSTYLE_LIST toolbars. */ static LRESULT TOOLBAR_Unkwn460(HWND hwnd, WPARAM wParam, LPARAM lParam) { - FIXME("hwnd=%p wParam %08x lParam %08lx\n", hwnd, wParam, lParam); + TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(hwnd); + TRACE("hwnd=%p iListGap=%d\n", hwnd, wParam); + + if (lParam != 0) + FIXME("lParam = 0x%08lx. Please report\n", lParam); + + infoPtr->iListGap = (INT)wParam; + + TOOLBAR_CalcToolbar(hwnd); InvalidateRect(hwnd, NULL, TRUE); + return 0; } @@ -4887,8 +5112,9 @@ TOOLBAR_Create (HWND hwnd, WPARAM wParam, LPARAM lParam) infoPtr->bCaptured = FALSE; infoPtr->bUnicode = IsWindowUnicode (hwnd); infoPtr->nButtonDown = -1; + infoPtr->nButtonDrag = -1; infoPtr->nOldHit = -1; - infoPtr->nHotItem = -2; /* It has to be initially different from nOldHit */ + infoPtr->nHotItem = -1; infoPtr->hwndNotify = ((LPCREATESTRUCTW)lParam)->hwndParent; infoPtr->bTransparent = (dwStyle & TBSTYLE_TRANSPARENT); infoPtr->bBtnTranspnt = (dwStyle & (TBSTYLE_FLAT | TBSTYLE_LIST)); @@ -4899,8 +5125,11 @@ TOOLBAR_Create (HWND hwnd, WPARAM wParam, LPARAM lParam) infoPtr->bDoRedraw = TRUE; infoPtr->clrBtnHighlight = CLR_DEFAULT; infoPtr->clrBtnShadow = CLR_DEFAULT; - infoPtr->szPadding.cx = 7; - infoPtr->szPadding.cy = 6; + /* not sure where the +1 comes from, but this comes to the same value + * as native so this is probably correct */ + infoPtr->szPadding.cx = 2*(GetSystemMetrics(SM_CXEDGE)+OFFSET_X) + 1; + infoPtr->szPadding.cy = 2*(GetSystemMetrics(SM_CYEDGE)+OFFSET_Y); + infoPtr->iListGap = infoPtr->szPadding.cx / 2; GetClientRect(hwnd, &infoPtr->client_rect); TOOLBAR_NotifyFormat(infoPtr, (WPARAM)hwnd, (LPARAM)NF_REQUERY); @@ -4943,6 +5172,10 @@ TOOLBAR_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam) if (infoPtr->hwndToolTip) DestroyWindow (infoPtr->hwndToolTip); + /* delete temporary buffer for tooltip text */ + if (infoPtr->pszTooltipText) + HeapFree(GetProcessHeap(), 0, infoPtr->pszTooltipText); + /* delete button data */ if (infoPtr->buttons) Free (infoPtr->buttons); @@ -5059,8 +5292,6 @@ TOOLBAR_GetFont (HWND hwnd, WPARAM wParam, LPARAM lParam) static LRESULT TOOLBAR_LButtonDblClk (HWND hwnd, WPARAM wParam, LPARAM lParam) { - TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); - TBUTTON_INFO *btnPtr; POINT pt; INT nHit; @@ -5068,19 +5299,8 @@ TOOLBAR_LButtonDblClk (HWND hwnd, WPARAM wParam, LPARAM lParam) pt.y = (INT)HIWORD(lParam); nHit = TOOLBAR_InternalHitTest (hwnd, &pt); - if (nHit >= 0) { - btnPtr = &infoPtr->buttons[nHit]; - if (!(btnPtr->fsState & TBSTATE_ENABLED)) - return 0; - SetCapture (hwnd); - infoPtr->bCaptured = TRUE; - infoPtr->nButtonDown = nHit; - - btnPtr->fsState |= TBSTATE_PRESSED; - - InvalidateRect(hwnd, &btnPtr->rect, TOOLBAR_HasText(infoPtr, - btnPtr)); - } + if (nHit >= 0) + TOOLBAR_LButtonDown (hwnd, wParam, lParam); else if (GetWindowLongA (hwnd, GWL_STYLE) & CCS_ADJUSTABLE) TOOLBAR_Customize (hwnd); @@ -5096,6 +5316,12 @@ TOOLBAR_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam) POINT pt; INT nHit; NMTOOLBARA nmtb; + BOOL bDragKeyPressed; + + if (GetWindowLongW(hwnd, GWL_STYLE) & TBSTYLE_ALTDRAG) + bDragKeyPressed = (GetKeyState(VK_MENU) < 0); + else + bDragKeyPressed = (wParam & MK_SHIFT); if (infoPtr->hwndToolTip) TOOLBAR_RelayEvent (infoPtr->hwndToolTip, hwnd, @@ -5105,9 +5331,22 @@ TOOLBAR_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam) pt.y = (INT)HIWORD(lParam); nHit = TOOLBAR_InternalHitTest (hwnd, &pt); - if (nHit >= 0) { + btnPtr = &infoPtr->buttons[nHit]; + + if ((nHit >= 0) && bDragKeyPressed && (GetWindowLongW(hwnd, GWL_STYLE) & CCS_ADJUSTABLE)) + { + infoPtr->nButtonDrag = nHit; + SetCapture (hwnd); + + /* If drag cursor has not been loaded, load it. + * Note: it doesn't need to be freed */ + if (!hCursorDrag) + hCursorDrag = LoadCursorW(COMCTL32_hModule, (LPCWSTR)IDC_MOVEBUTTON); + SetCursor(hCursorDrag); + } + else if (nHit >= 0) + { RECT arrowRect; - btnPtr = &infoPtr->buttons[nHit]; infoPtr->nOldHit = nHit; CopyRect(&arrowRect, &btnPtr->rect); @@ -5121,10 +5360,9 @@ TOOLBAR_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam) (!TOOLBAR_HasDropDownArrows(infoPtr->dwExStyle)))))) { LRESULT res; - /* - * this time we must force a Redraw, so the btn is - * painted down before CaptureChanged repaints it up - */ + + /* draw in pressed state */ + btnPtr->fsState |= TBSTATE_PRESSED; RedrawWindow(hwnd,&btnPtr->rect,0, RDW_ERASE|RDW_INVALIDATE|RDW_UPDATENOW); @@ -5135,35 +5373,57 @@ TOOLBAR_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam) CopyRect(&nmtb.rcButton, &btnPtr->rect); res = TOOLBAR_SendNotify ((NMHDR *) &nmtb, infoPtr, TBN_DROPDOWN); - if (res != TBDDRET_TREATPRESSED) - /* ??? guess (GA) */ + TRACE("TBN_DROPDOWN responded with %ld\n", res); + + if (res != TBDDRET_TREATPRESSED) + { + MSG msg; + + /* redraw button in unpressed state */ + btnPtr->fsState &= ~TBSTATE_PRESSED; + InvalidateRect(hwnd, &btnPtr->rect, TRUE); + + /* find and set hot item + * NOTE: native doesn't do this, but that is a bug */ + GetCursorPos(&pt); + ScreenToClient(hwnd, &pt); + nHit = TOOLBAR_InternalHitTest(hwnd, &pt); + TOOLBAR_SetHotItemEx(infoPtr, nHit, HICF_MOUSE | HICF_LMOUSE); + + /* remove any left mouse button down messages so that we can + * get a toggle effect on the button */ + while (PeekMessageW(&msg, hwnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_REMOVE)) + ; + return 0; + } /* otherwise drop through and process as pushed */ } - /* SetCapture (hwnd); */ infoPtr->bCaptured = TRUE; infoPtr->nButtonDown = nHit; btnPtr->fsState |= TBSTATE_PRESSED; - btnPtr->bHot = FALSE; + + TOOLBAR_SetHotItemEx(infoPtr, nHit, HICF_MOUSE | HICF_LMOUSE); if (btnPtr->fsState & TBSTATE_ENABLED) - InvalidateRect(hwnd, &btnPtr->rect, TOOLBAR_HasText(infoPtr, btnPtr)); + InvalidateRect(hwnd, &btnPtr->rect, TRUE); UpdateWindow(hwnd); SetCapture (hwnd); + } - /* native issues the TBN_BEGINDRAG here */ - nmtb.iItem = btnPtr->idCommand; - nmtb.tbButton.iBitmap = btnPtr->iBitmap; - nmtb.tbButton.idCommand = btnPtr->idCommand; - nmtb.tbButton.fsState = btnPtr->fsState; - nmtb.tbButton.fsStyle = btnPtr->fsStyle; - nmtb.tbButton.dwData = btnPtr->dwData; - nmtb.tbButton.iString = btnPtr->iString; - nmtb.cchText = 0; /* !!! not correct */ - nmtb.pszText = 0; /* !!! not correct */ - TOOLBAR_SendNotify ((NMHDR *) &nmtb, infoPtr, - TBN_BEGINDRAG); + if (nHit >=0) + { + nmtb.iItem = btnPtr->idCommand; + nmtb.tbButton.iBitmap = btnPtr->iBitmap; + nmtb.tbButton.idCommand = btnPtr->idCommand; + nmtb.tbButton.fsState = btnPtr->fsState; + nmtb.tbButton.fsStyle = btnPtr->fsStyle; + nmtb.tbButton.dwData = btnPtr->dwData; + nmtb.tbButton.iString = btnPtr->iString; + nmtb.cchText = 0; /* !!! not correct */ + nmtb.pszText = 0; /* !!! not correct */ + TOOLBAR_SendNotify((NMHDR *)&nmtb, infoPtr, TBN_BEGINDRAG); } return 0; @@ -5190,12 +5450,72 @@ TOOLBAR_LButtonUp (HWND hwnd, WPARAM wParam, LPARAM lParam) pt.y = (INT)HIWORD(lParam); nHit = TOOLBAR_InternalHitTest (hwnd, &pt); - /* restore hot effect to hot button disabled by TOOLBAR_LButtonDown() */ - /* if the cursor is still inside of the toolbar */ - if((infoPtr->nHotItem >= 0) && (nHit != -1)) - infoPtr->buttons[infoPtr->nHotItem].bHot = TRUE; + TOOLBAR_SetHotItemEx(infoPtr, nHit, HICF_MOUSE | HICF_LMOUSE); - if (0 <= infoPtr->nButtonDown) { + if (infoPtr->nButtonDrag >= 0) { + RECT rcClient; + NMHDR hdr; + + btnPtr = &infoPtr->buttons[infoPtr->nButtonDrag]; + ReleaseCapture(); + /* reset cursor */ + SetCursor(LoadCursorW(NULL, (LPCWSTR)IDC_ARROW)); + + GetClientRect(hwnd, &rcClient); + if (PtInRect(&rcClient, pt)) + { + INT nButton = -1; + if (nHit >= 0) + nButton = nHit; + else if (nHit < -1) + nButton = -nHit; + else if ((nHit == -1) && PtInRect(&infoPtr->buttons[-nHit].rect, pt)) + nButton = -nHit; + + if (nButton == infoPtr->nButtonDrag) + { + /* if the button is moved sightly left and we have a + * separator there then remove it */ + if (pt.x < (btnPtr->rect.left + (btnPtr->rect.right - btnPtr->rect.left)/2)) + { + if ((nButton > 0) && (infoPtr->buttons[nButton-1].fsStyle & BTNS_SEP)) + TOOLBAR_DeleteButton(hwnd, nButton - 1, 0); + } + else /* else insert a separator before the dragged button */ + { + TBBUTTON tbb; + memset(&tbb, 0, sizeof(tbb)); + tbb.fsStyle = BTNS_SEP; + tbb.iString = -1; + TOOLBAR_InsertButtonW(hwnd, nButton, (LPARAM)&tbb); + } + } + else + { + if (nButton == -1) + { + if ((infoPtr->nNumButtons > 0) && (pt.x < infoPtr->buttons[0].rect.left)) + TOOLBAR_MoveButton(hwnd, infoPtr->nButtonDrag, 0); + else + TOOLBAR_MoveButton(hwnd, infoPtr->nButtonDrag, infoPtr->nNumButtons); + } + else + TOOLBAR_MoveButton(hwnd, infoPtr->nButtonDrag, nButton); + } + } + else + { + TRACE("button %d dragged out of toolbar\n", infoPtr->nButtonDrag); + TOOLBAR_DeleteButton(hwnd, (WPARAM)infoPtr->nButtonDrag, 0); + } + + /* button under cursor changed so need to re-set hot item */ + TOOLBAR_SetHotItemEx(infoPtr, nHit, HICF_MOUSE | HICF_LMOUSE); + infoPtr->nButtonDrag = -1; + + TOOLBAR_SendNotify(&hdr, infoPtr, TBN_TOOLBARCHANGE); + } + else if (infoPtr->nButtonDown >= 0) { btnPtr = &infoPtr->buttons[infoPtr->nButtonDown]; btnPtr->fsState &= ~TBSTATE_PRESSED; @@ -5218,11 +5538,8 @@ TOOLBAR_LButtonUp (HWND hwnd, WPARAM wParam, LPARAM lParam) } } - if (nOldIndex != -1) - { - InvalidateRect(hwnd, &infoPtr->buttons[nOldIndex].rect, - TOOLBAR_HasText(infoPtr, &infoPtr->buttons[nOldIndex])); - } + if (nOldIndex != -1) + InvalidateRect(hwnd, &infoPtr->buttons[nOldIndex].rect, TRUE); /* * now we can ReleaseCapture, which triggers CAPTURECHANGED msg, @@ -5285,8 +5602,7 @@ TOOLBAR_CaptureChanged(HWND hwnd) infoPtr->nOldHit = -1; if (btnPtr->fsState & TBSTATE_ENABLED) - InvalidateRect(hwnd, &btnPtr->rect, TOOLBAR_HasText(infoPtr, - btnPtr)); + InvalidateRect(hwnd, &btnPtr->rect, TRUE); } return 0; } @@ -5298,22 +5614,13 @@ TOOLBAR_MouseLeave (HWND hwnd, WPARAM wParam, LPARAM lParam) TBUTTON_INFO *hotBtnPtr, *btnPtr; RECT rc1; + TOOLBAR_SetHotItemEx(infoPtr, -1, HICF_MOUSE); + if (infoPtr->nOldHit < 0) return TRUE; hotBtnPtr = &infoPtr->buttons[infoPtr->nOldHit]; - /* Redraw the button if the last button we were over is the hot button and it - is enabled */ - if((infoPtr->nOldHit == infoPtr->nHotItem) && (hotBtnPtr->fsState & TBSTATE_ENABLED)) - { - hotBtnPtr->bHot = FALSE; - rc1 = hotBtnPtr->rect; - InflateRect (&rc1, 1, 1); - InvalidateRect (hwnd, &rc1, TOOLBAR_HasText(infoPtr, - hotBtnPtr)); - } - /* If the last button we were over is depressed then make it not */ /* depressed and redraw it */ if(infoPtr->nOldHit == infoPtr->nButtonDown) @@ -5328,7 +5635,6 @@ TOOLBAR_MouseLeave (HWND hwnd, WPARAM wParam, LPARAM lParam) } infoPtr->nOldHit = -1; /* reset the old hit index as we've left the toolbar */ - infoPtr->nHotItem = -2; /* It has to be initially different from nOldHit */ return TRUE; } @@ -5336,12 +5642,11 @@ TOOLBAR_MouseLeave (HWND hwnd, WPARAM wParam, LPARAM lParam) static LRESULT TOOLBAR_MouseMove (HWND hwnd, WPARAM wParam, LPARAM lParam) { - TBUTTON_INFO *btnPtr = NULL, *oldBtnPtr = NULL; TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); POINT pt; - INT nHit; TRACKMOUSEEVENT trackinfo; - NMTBHOTITEM nmhotitem; + INT nHit; + TBUTTON_INFO *btnPtr; /* fill in the TRACKMOUSEEVENT struct */ trackinfo.cbSize = sizeof(TRACKMOUSEEVENT); @@ -5370,58 +5675,25 @@ TOOLBAR_MouseMove (HWND hwnd, WPARAM wParam, LPARAM lParam) nHit = TOOLBAR_InternalHitTest (hwnd, &pt); + TOOLBAR_SetHotItemEx(infoPtr, nHit, HICF_MOUSE); + if (infoPtr->nOldHit != nHit) { - /* Remove the effect of an old hot button if the button was - drawn with the hot button effect */ - if(infoPtr->nOldHit >= 0 && infoPtr->nOldHit == infoPtr->nHotItem) - { - oldBtnPtr = &infoPtr->buttons[infoPtr->nOldHit]; - oldBtnPtr->bHot = FALSE; - } - - /* It's not a separator or in nowhere. It's a hot button. */ - if (nHit >= 0) - { - btnPtr = &infoPtr->buttons[nHit]; - - infoPtr->nHotItem = nHit; - - btnPtr->bHot = TRUE; - } - - nmhotitem.dwFlags = HICF_MOUSE; - if (oldBtnPtr) - nmhotitem.idOld = oldBtnPtr->idCommand; - else - nmhotitem.dwFlags |= HICF_ENTERING; - if (btnPtr) - nmhotitem.idNew = btnPtr->idCommand; - else - nmhotitem.dwFlags |= HICF_LEAVING; - TOOLBAR_SendNotify((NMHDR*)&nmhotitem, infoPtr, TBN_HOTITEMCHANGE); - - /* now invalidate the old and new buttons so they will be painted */ - if (oldBtnPtr) - InvalidateRect (hwnd, &oldBtnPtr->rect, - TOOLBAR_HasText(infoPtr, oldBtnPtr)); - if (btnPtr) - InvalidateRect(hwnd, &btnPtr->rect, - TOOLBAR_HasText(infoPtr, btnPtr)); - - if (infoPtr->bCaptured) { - btnPtr = &infoPtr->buttons[infoPtr->nButtonDown]; - if (infoPtr->nOldHit == infoPtr->nButtonDown) { - btnPtr->fsState &= ~TBSTATE_PRESSED; + if (infoPtr->bCaptured) + { + btnPtr = &infoPtr->buttons[infoPtr->nButtonDown]; + if (infoPtr->nOldHit == infoPtr->nButtonDown) { + btnPtr->fsState &= ~TBSTATE_PRESSED; InvalidateRect(hwnd, &btnPtr->rect, TRUE); - } - else if (nHit == infoPtr->nButtonDown) { - btnPtr->fsState |= TBSTATE_PRESSED; + } + else if (nHit == infoPtr->nButtonDown) { + btnPtr->fsState |= TBSTATE_PRESSED; InvalidateRect(hwnd, &btnPtr->rect, TRUE); - } - } - infoPtr->nOldHit = nHit; + } + infoPtr->nOldHit = nHit; + } } + return 0; } @@ -5553,66 +5825,183 @@ TOOLBAR_NCPaint (HWND hwnd, WPARAM wParam, LPARAM lParam) } +/* handles requests from the tooltip control on what text to display */ +static LRESULT TOOLBAR_TTGetDispInfo (TOOLBAR_INFO *infoPtr, NMTTDISPINFOW *lpnmtdi) +{ + int index = TOOLBAR_GetButtonIndex(infoPtr, lpnmtdi->hdr.idFrom, FALSE); + + TRACE("button index = %d\n", index); + + if (infoPtr->pszTooltipText) + { + HeapFree(GetProcessHeap(), 0, infoPtr->pszTooltipText); + infoPtr->pszTooltipText = NULL; + } + + if (index < 0) + return 0; + + if (infoPtr->bNtfUnicode) + { + WCHAR wszBuffer[INFOTIPSIZE+1]; + NMTBGETINFOTIPW tbgit; + int len; /* in chars */ + + wszBuffer[0] = '\0'; + wszBuffer[INFOTIPSIZE] = '\0'; + + tbgit.pszText = wszBuffer; + tbgit.cchTextMax = INFOTIPSIZE; + tbgit.iItem = lpnmtdi->hdr.idFrom; + tbgit.lParam = infoPtr->buttons[index].dwData; + + TOOLBAR_SendNotify(&tbgit.hdr, infoPtr, TBN_GETINFOTIPW); + + TRACE("TBN_GETINFOTIPW - got string %s\n", debugstr_w(tbgit.pszText)); + + len = strlenW(tbgit.pszText); + if (len > sizeof(lpnmtdi->szText)/sizeof(lpnmtdi->szText[0])-1) + { + /* need to allocate temporary buffer in infoPtr as there + * isn't enough space in buffer passed to us by the + * tooltip control */ + infoPtr->pszTooltipText = HeapAlloc(GetProcessHeap(), 0, (len+1)*sizeof(WCHAR)); + if (infoPtr->pszTooltipText) + { + memcpy(infoPtr->pszTooltipText, tbgit.pszText, (len+1)*sizeof(WCHAR)); + lpnmtdi->lpszText = infoPtr->pszTooltipText; + return 0; + } + } + else if (len > 0) + { + memcpy(lpnmtdi->lpszText, tbgit.pszText, (len+1)*sizeof(WCHAR)); + return 0; + } + } + else + { + CHAR szBuffer[INFOTIPSIZE+1]; + NMTBGETINFOTIPA tbgit; + int len; /* in chars */ + + szBuffer[0] = '\0'; + szBuffer[INFOTIPSIZE] = '\0'; + + tbgit.pszText = szBuffer; + tbgit.cchTextMax = INFOTIPSIZE; + tbgit.iItem = lpnmtdi->hdr.idFrom; + tbgit.lParam = infoPtr->buttons[index].dwData; + + TOOLBAR_SendNotify(&tbgit.hdr, infoPtr, TBN_GETINFOTIPA); + + TRACE("TBN_GETINFOTIPA - got string %s\n", debugstr_a(tbgit.pszText)); + + len = -1 + MultiByteToWideChar(CP_ACP, 0, tbgit.pszText, -1, NULL, 0); + if (len > sizeof(lpnmtdi->szText)/sizeof(lpnmtdi->szText[0])-1) + { + /* need to allocate temporary buffer in infoPtr as there + * isn't enough space in buffer passed to us by the + * tooltip control */ + infoPtr->pszTooltipText = HeapAlloc(GetProcessHeap(), 0, (len+1)*sizeof(WCHAR)); + if (infoPtr->pszTooltipText) + { + MultiByteToWideChar(CP_ACP, 0, tbgit.pszText, len+1, infoPtr->pszTooltipText, (len+1)*sizeof(WCHAR)); + lpnmtdi->lpszText = infoPtr->pszTooltipText; + return 0; + } + } + else if (len > 0) + { + MultiByteToWideChar(CP_ACP, 0, tbgit.pszText, len+1, lpnmtdi->lpszText, (len+1)*sizeof(WCHAR)); + return 0; + } + } + + /* if button has text, but it is not shown then automatically + * use that text as tooltip */ + if ((infoPtr->dwExStyle & TBSTYLE_EX_MIXEDBUTTONS) && + !(infoPtr->buttons[index].fsStyle & BTNS_SHOWTEXT)) + { + LPWSTR pszText = TOOLBAR_GetText(infoPtr, &infoPtr->buttons[index]); + int len = pszText ? strlenW(pszText) : 0; + + TRACE("using button hidden text %s\n", debugstr_w(pszText)); + + if (len > sizeof(lpnmtdi->szText)/sizeof(lpnmtdi->szText[0])-1) + { + /* need to allocate temporary buffer in infoPtr as there + * isn't enough space in buffer passed to us by the + * tooltip control */ + infoPtr->pszTooltipText = HeapAlloc(GetProcessHeap(), 0, (len+1)*sizeof(WCHAR)); + if (infoPtr->pszTooltipText) + { + memcpy(infoPtr->pszTooltipText, pszText, (len+1)*sizeof(WCHAR)); + lpnmtdi->lpszText = infoPtr->pszTooltipText; + return 0; + } + } + else if (len > 0) + { + memcpy(lpnmtdi->lpszText, pszText, (len+1)*sizeof(WCHAR)); + return 0; + } + } + + TRACE("Sending tooltip notification to %p\n", infoPtr->hwndNotify); + + /* last resort: send notification on to app */ + /* FIXME: find out what is really used here */ + return SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, 0, (LPARAM)lpnmtdi); +} + + inline static LRESULT TOOLBAR_Notify (HWND hwnd, WPARAM wParam, LPARAM lParam) { TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); LPNMHDR lpnmh = (LPNMHDR)lParam; - if (lpnmh->code == PGN_CALCSIZE) { - LPNMPGCALCSIZE lppgc = (LPNMPGCALCSIZE)lParam; + switch (lpnmh->code) + { + case PGN_CALCSIZE: + { + LPNMPGCALCSIZE lppgc = (LPNMPGCALCSIZE)lParam; - if (lppgc->dwFlag == PGF_CALCWIDTH) { - lppgc->iWidth = infoPtr->rcBound.right - infoPtr->rcBound.left; - TRACE("processed PGN_CALCSIZE, returning horz size = %d\n", - lppgc->iWidth); - } - else { - lppgc->iHeight = infoPtr->rcBound.bottom - infoPtr->rcBound.top; - TRACE("processed PGN_CALCSIZE, returning vert size = %d\n", - lppgc->iHeight); - } - return 0; + if (lppgc->dwFlag == PGF_CALCWIDTH) { + lppgc->iWidth = infoPtr->rcBound.right - infoPtr->rcBound.left; + TRACE("processed PGN_CALCSIZE, returning horz size = %d\n", + lppgc->iWidth); + } + else { + lppgc->iHeight = infoPtr->rcBound.bottom - infoPtr->rcBound.top; + TRACE("processed PGN_CALCSIZE, returning vert size = %d\n", + lppgc->iHeight); + } + return 0; } - if (lpnmh->code == PGN_SCROLL) { - LPNMPGSCROLL lppgs = (LPNMPGSCROLL)lParam; + case PGN_SCROLL: + { + LPNMPGSCROLL lppgs = (LPNMPGSCROLL)lParam; - lppgs->iScroll = (lppgs->iDir & (PGF_SCROLLLEFT | PGF_SCROLLRIGHT)) ? - infoPtr->nButtonWidth : infoPtr->nButtonHeight; - TRACE("processed PGN_SCROLL, returning scroll=%d, dir=%d\n", - lppgs->iScroll, lppgs->iDir); - return 0; + lppgs->iScroll = (lppgs->iDir & (PGF_SCROLLLEFT | PGF_SCROLLRIGHT)) ? + infoPtr->nButtonWidth : infoPtr->nButtonHeight; + TRACE("processed PGN_SCROLL, returning scroll=%d, dir=%d\n", + lppgs->iScroll, lppgs->iDir); + return 0; } + case TTN_GETDISPINFOW: + return TOOLBAR_TTGetDispInfo(infoPtr, (LPNMTTDISPINFOW)lParam); - TRACE("passing WM_NOTIFY!\n"); + case TTN_GETDISPINFOA: + FIXME("TTN_GETDISPINFOA - stub\n"); + return 0; - if ((infoPtr->hwndToolTip) && (lpnmh->hwndFrom == infoPtr->hwndToolTip)) { - if (infoPtr->bNtfUnicode) - return SendMessageW (infoPtr->hwndNotify, WM_NOTIFY, - wParam, lParam); - else - return SendMessageA (infoPtr->hwndNotify, WM_NOTIFY, - wParam, lParam); - -#if 0 - if (lpnmh->code == TTN_GETDISPINFOA) { - LPNMTTDISPINFOA lpdi = (LPNMTTDISPINFOA)lParam; - - FIXME("retrieving ASCII string\n"); - - } - else if (lpnmh->code == TTN_GETDISPINFOW) { - LPNMTTDISPINFOW lpdi = (LPNMTTDISPINFOW)lParam; - - FIXME("retrieving UNICODE string\n"); - - } -#endif + default: + return 0; } - - return 0; } @@ -5632,6 +6021,11 @@ TOOLBAR_NotifyFormat(TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam) { INT i; + TRACE("wParam = 0x%x, lParam = 0x%08lx\n", wParam, lParam); + + if ((lParam == NF_QUERY) && ((HWND)wParam == infoPtr->hwndToolTip)) + return NFR_UNICODE; + if (lParam == NF_REQUERY) { i = SendMessageA(infoPtr->hwndNotify, WM_NOTIFYFORMAT, (WPARAM)infoPtr->hwndSelf, NF_QUERY); @@ -5824,7 +6218,7 @@ TOOLBAR_Size (HWND hwnd, WPARAM wParam, LPARAM lParam) InvalidateRect(hwnd, &btnPtr->rect, TRUE); } - if((uPosFlags & (SWP_NOSIZE | SWP_NOMOVE)) == (SWP_NOSIZE | SWP_NOMOVE)) + if((uPosFlags & (SWP_NOSIZE | SWP_NOMOVE)) != (SWP_NOSIZE | SWP_NOMOVE)) SetWindowPos (hwnd, 0, x, y, cx, cy, uPosFlags | SWP_NOZORDER); } GetClientRect(hwnd, &infoPtr->client_rect); @@ -5856,7 +6250,7 @@ TOOLBAR_StyleChanged (HWND hwnd, INT nType, LPSTYLESTRUCT lpStyle) TOOLBAR_AutoSize (hwnd); - InvalidateRect(hwnd, NULL, FALSE); + InvalidateRect(hwnd, NULL, TRUE); return 0; } @@ -6045,14 +6439,18 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case TB_ISBUTTONPRESSED: return TOOLBAR_IsButtonPressed (hwnd, wParam, lParam); - case TB_LOADIMAGES: /* 4.70 */ - FIXME("missing standard imagelists\n"); - return 0; + case TB_LOADIMAGES: + return TOOLBAR_LoadImages (hwnd, wParam, lParam); -/* case TB_MAPACCELERATORA: */ /* 4.71 */ -/* case TB_MAPACCELERATORW: */ /* 4.71 */ -/* case TB_MARKBUTTON: */ /* 4.71 */ -/* case TB_MOVEBUTTON: */ /* 4.71 */ + case TB_MAPACCELERATORA: + case TB_MAPACCELERATORW: + return TOOLBAR_MapAccelerator (hwnd, wParam, lParam); + + case TB_MARKBUTTON: + return TOOLBAR_MarkButton (hwnd, wParam, lParam); + + case TB_MOVEBUTTON: + return TOOLBAR_MoveButton (hwnd, wParam, lParam); case TB_PRESSBUTTON: return TOOLBAR_PressButton (hwnd, wParam, lParam); diff --git a/reactos/lib/comctl32/tooltips.c b/reactos/lib/comctl32/tooltips.c index fa2f8782ce8..6e659259c4f 100644 --- a/reactos/lib/comctl32/tooltips.c +++ b/reactos/lib/comctl32/tooltips.c @@ -18,8 +18,9 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * TODO: - * - Unicode support (started). * - Custom draw support. + * - Balloon tips. + * - Messages. * * Testing: * - Run tests using Waite Group Windows95 API Bible Volume 2. @@ -90,6 +91,7 @@ typedef struct { UINT uFlags; HWND hwnd; + BOOL bNotifyUnicode; UINT uId; RECT rect; HINSTANCE hinst; @@ -110,14 +112,13 @@ typedef struct INT xTrackPos; INT yTrackPos; INT nMaxTipWidth; - INT nTool; + INT nTool; /* tool that mouse was on on last relayed mouse move */ INT nCurrentTool; INT nTrackTool; INT nReshowTime; INT nAutoPopTime; INT nInitialTime; RECT rcMargin; - BOOL bNotifyUnicode; TTTOOL_INFO *tools; } TOOLTIPS_INFO; @@ -171,6 +172,100 @@ TOOLTIPS_Refresh (HWND hwnd, HDC hdc) SetBkMode (hdc, oldBkMode); } +static void TOOLTIPS_GetDispInfoA(HWND hwnd, TOOLTIPS_INFO *infoPtr, TTTOOL_INFO *toolPtr) +{ + NMTTDISPINFOA ttnmdi; + + /* fill NMHDR struct */ + ZeroMemory (&ttnmdi, sizeof(NMTTDISPINFOA)); + ttnmdi.hdr.hwndFrom = hwnd; + ttnmdi.hdr.idFrom = toolPtr->uId; + ttnmdi.hdr.code = TTN_GETDISPINFOA; + ttnmdi.lpszText = (LPSTR)&ttnmdi.szText; + ttnmdi.uFlags = toolPtr->uFlags; + ttnmdi.lParam = toolPtr->lParam; + + TRACE("hdr.idFrom = %x\n", ttnmdi.hdr.idFrom); + SendMessageA(toolPtr->hwnd, WM_NOTIFY, + (WPARAM)toolPtr->uId, (LPARAM)&ttnmdi); + + if (HIWORD((UINT)ttnmdi.lpszText) == 0) { + LoadStringW(ttnmdi.hinst, (UINT)ttnmdi.lpszText, + infoPtr->szTipText, INFOTIPSIZE); + if (ttnmdi.uFlags & TTF_DI_SETITEM) { + toolPtr->hinst = ttnmdi.hinst; + toolPtr->lpszText = (LPWSTR)ttnmdi.lpszText; + } + } + else if (ttnmdi.lpszText == 0) { + /* no text available */ + infoPtr->szTipText[0] = '\0'; + } + else if (ttnmdi.lpszText != LPSTR_TEXTCALLBACKA) { + INT max_len = (ttnmdi.lpszText == &ttnmdi.szText[0]) ? + sizeof(ttnmdi.szText)/sizeof(ttnmdi.szText[0]) : -1; + MultiByteToWideChar(CP_ACP, 0, ttnmdi.lpszText, max_len, + infoPtr->szTipText, INFOTIPSIZE); + if (ttnmdi.uFlags & TTF_DI_SETITEM) { + INT len = MultiByteToWideChar(CP_ACP, 0, ttnmdi.lpszText, + max_len, NULL, 0); + toolPtr->hinst = 0; + toolPtr->lpszText = Alloc (len * sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, ttnmdi.lpszText, -1, + toolPtr->lpszText, len); + } + } + else { + ERR("recursive text callback!\n"); + infoPtr->szTipText[0] = '\0'; + } +} + +static void TOOLTIPS_GetDispInfoW(HWND hwnd, TOOLTIPS_INFO *infoPtr, TTTOOL_INFO *toolPtr) +{ + NMTTDISPINFOW ttnmdi; + + /* fill NMHDR struct */ + ZeroMemory (&ttnmdi, sizeof(NMTTDISPINFOW)); + ttnmdi.hdr.hwndFrom = hwnd; + ttnmdi.hdr.idFrom = toolPtr->uId; + ttnmdi.hdr.code = TTN_GETDISPINFOW; + ttnmdi.lpszText = (LPWSTR)&ttnmdi.szText; + ttnmdi.uFlags = toolPtr->uFlags; + ttnmdi.lParam = toolPtr->lParam; + + TRACE("hdr.idFrom = %x\n", ttnmdi.hdr.idFrom); + SendMessageW(toolPtr->hwnd, WM_NOTIFY, + (WPARAM)toolPtr->uId, (LPARAM)&ttnmdi); + + if (HIWORD((UINT)ttnmdi.lpszText) == 0) { + LoadStringW(ttnmdi.hinst, (UINT)ttnmdi.lpszText, + infoPtr->szTipText, INFOTIPSIZE); + if (ttnmdi.uFlags & TTF_DI_SETITEM) { + toolPtr->hinst = ttnmdi.hinst; + toolPtr->lpszText = ttnmdi.lpszText; + } + } + else if (ttnmdi.lpszText == 0) { + /* no text available */ + infoPtr->szTipText[0] = '\0'; + } + else if (ttnmdi.lpszText != LPSTR_TEXTCALLBACKW) { + INT max_len = (ttnmdi.lpszText == &ttnmdi.szText[0]) ? + sizeof(ttnmdi.szText)/sizeof(ttnmdi.szText[0]) : INFOTIPSIZE-1; + strncpyW(infoPtr->szTipText, ttnmdi.lpszText, max_len); + if (ttnmdi.uFlags & TTF_DI_SETITEM) { + INT len = max(strlenW(ttnmdi.lpszText), max_len); + toolPtr->hinst = 0; + toolPtr->lpszText = Alloc ((len+1) * sizeof(WCHAR)); + memcpy(toolPtr->lpszText, ttnmdi.lpszText, (len+1) * sizeof(WCHAR)); + } + } + else { + ERR("recursive text callback!\n"); + infoPtr->szTipText[0] = '\0'; + } +} static VOID TOOLTIPS_GetTipText (HWND hwnd, TOOLTIPS_INFO *infoPtr, INT nTool) @@ -186,61 +281,10 @@ TOOLTIPS_GetTipText (HWND hwnd, TOOLTIPS_INFO *infoPtr, INT nTool) } else if (toolPtr->lpszText) { if (toolPtr->lpszText == LPSTR_TEXTCALLBACKW) { - NMTTDISPINFOA ttnmdi; - - /* fill NMHDR struct */ - ZeroMemory (&ttnmdi, sizeof(NMTTDISPINFOA)); - ttnmdi.hdr.hwndFrom = hwnd; - ttnmdi.hdr.idFrom = toolPtr->uId; - ttnmdi.hdr.code = TTN_GETDISPINFOA; - ttnmdi.lpszText = (LPSTR)&ttnmdi.szText; - ttnmdi.uFlags = toolPtr->uFlags; - ttnmdi.lParam = toolPtr->lParam; - - TRACE("hdr.idFrom = %x\n", ttnmdi.hdr.idFrom); - SendMessageA (toolPtr->hwnd, WM_NOTIFY, - (WPARAM)toolPtr->uId, (LPARAM)&ttnmdi); - - if (HIWORD((UINT)ttnmdi.lpszText) == 0) { - LoadStringW (ttnmdi.hinst, (UINT)ttnmdi.lpszText, - infoPtr->szTipText, INFOTIPSIZE); - if (ttnmdi.uFlags & TTF_DI_SETITEM) { - toolPtr->hinst = ttnmdi.hinst; - toolPtr->lpszText = (LPWSTR)ttnmdi.lpszText; - } - } - else if (ttnmdi.szText[0]) { - MultiByteToWideChar(CP_ACP, 0, ttnmdi.szText, 80, - infoPtr->szTipText, INFOTIPSIZE); - if (ttnmdi.uFlags & TTF_DI_SETITEM) { - INT len = MultiByteToWideChar(CP_ACP, 0, ttnmdi.szText, - 80, NULL, 0); - toolPtr->hinst = 0; - toolPtr->lpszText = Alloc (len * sizeof(WCHAR)); - MultiByteToWideChar(CP_ACP, 0, ttnmdi.szText, 80, - toolPtr->lpszText, len); - } - } - else if (ttnmdi.lpszText == 0) { - /* no text available */ - infoPtr->szTipText[0] = L'\0'; - } - else if (ttnmdi.lpszText != LPSTR_TEXTCALLBACKA) { - MultiByteToWideChar(CP_ACP, 0, ttnmdi.lpszText, -1, - infoPtr->szTipText, INFOTIPSIZE); - if (ttnmdi.uFlags & TTF_DI_SETITEM) { - INT len = MultiByteToWideChar(CP_ACP, 0, ttnmdi.lpszText, - -1, NULL, 0); - toolPtr->hinst = 0; - toolPtr->lpszText = Alloc (len * sizeof(WCHAR)); - MultiByteToWideChar(CP_ACP, 0, ttnmdi.lpszText, -1, - toolPtr->lpszText, len); - } - } - else { - ERR("recursive text callback!\n"); - infoPtr->szTipText[0] = '\0'; - } + if (toolPtr->bNotifyUnicode) + TOOLTIPS_GetDispInfoW(hwnd, infoPtr, toolPtr); + else + TOOLTIPS_GetDispInfoA(hwnd, infoPtr, toolPtr); } else { /* the item is a usual (unicode) text */ @@ -502,11 +546,12 @@ TOOLTIPS_TrackHide (HWND hwnd, TOOLTIPS_INFO *infoPtr) TTTOOL_INFO *toolPtr; NMHDR hdr; + TRACE("hide tracking tooltip %d\n", infoPtr->nTrackTool); + if (infoPtr->nTrackTool == -1) return; toolPtr = &infoPtr->tools[infoPtr->nTrackTool]; - TRACE("hide tracking tooltip %d!\n", infoPtr->nTrackTool); hdr.hwndFrom = hwnd; hdr.idFrom = toolPtr->uId; @@ -668,6 +713,7 @@ TOOLTIPS_AddToolA (HWND hwnd, WPARAM wParam, LPARAM lParam) TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd); LPTTTOOLINFOA lpToolInfo = (LPTTTOOLINFOA)lParam; TTTOOL_INFO *toolPtr; + INT nResult; if (lpToolInfo == NULL) return FALSE; @@ -736,6 +782,18 @@ TOOLTIPS_AddToolA (HWND hwnd, WPARAM wParam, LPARAM lParam) TRACE("subclassing installed!\n"); } + nResult = (INT) SendMessageA (toolPtr->hwnd, WM_NOTIFYFORMAT, + (WPARAM)hwnd, (LPARAM)NF_QUERY); + if (nResult == NFR_ANSI) { + toolPtr->bNotifyUnicode = FALSE; + TRACE(" -- WM_NOTIFYFORMAT returns: NFR_ANSI\n"); + } else if (nResult == NFR_UNICODE) { + toolPtr->bNotifyUnicode = TRUE; + TRACE(" -- WM_NOTIFYFORMAT returns: NFR_UNICODE\n"); + } else { + TRACE (" -- WM_NOTIFYFORMAT returns: error!\n"); + } + return TRUE; } @@ -746,6 +804,7 @@ TOOLTIPS_AddToolW (HWND hwnd, WPARAM wParam, LPARAM lParam) TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd); LPTTTOOLINFOW lpToolInfo = (LPTTTOOLINFOW)lParam; TTTOOL_INFO *toolPtr; + INT nResult; if (lpToolInfo == NULL) return FALSE; @@ -813,16 +872,102 @@ TOOLTIPS_AddToolW (HWND hwnd, WPARAM wParam, LPARAM lParam) TRACE("subclassing installed!\n"); } + nResult = (INT) SendMessageA (toolPtr->hwnd, WM_NOTIFYFORMAT, + (WPARAM)hwnd, (LPARAM)NF_QUERY); + if (nResult == NFR_ANSI) { + toolPtr->bNotifyUnicode = FALSE; + TRACE(" -- WM_NOTIFYFORMAT returns: NFR_ANSI\n"); + } else if (nResult == NFR_UNICODE) { + toolPtr->bNotifyUnicode = TRUE; + TRACE(" -- WM_NOTIFYFORMAT returns: NFR_UNICODE\n"); + } else { + TRACE (" -- WM_NOTIFYFORMAT returns: error!\n"); + } + return TRUE; } +static void TOOLTIPS_DelToolCommon (HWND hwnd, TOOLTIPS_INFO *infoPtr, INT nTool) +{ + TTTOOL_INFO *toolPtr; + + TRACE("tool %d\n", nTool); + + if (nTool == -1) + return; + + /* make sure the tooltip has disappeared before deleting it */ + TOOLTIPS_Hide(hwnd, infoPtr); + + /* delete text string */ + toolPtr = &infoPtr->tools[nTool]; + if (toolPtr->lpszText) { + if ( (toolPtr->lpszText != LPSTR_TEXTCALLBACKW) && + (HIWORD((INT)toolPtr->lpszText) != 0) ) + Free (toolPtr->lpszText); + } + + /* remove subclassing */ + if (toolPtr->uFlags & TTF_SUBCLASS) { + if (toolPtr->uFlags & TTF_IDISHWND) { + RemoveWindowSubclass((HWND)toolPtr->uId, TOOLTIPS_SubclassProc, 1); + } + else { + RemoveWindowSubclass(toolPtr->hwnd, TOOLTIPS_SubclassProc, 1); + } + } + + /* delete tool from tool list */ + if (infoPtr->uNumTools == 1) { + Free (infoPtr->tools); + infoPtr->tools = NULL; + } + else { + TTTOOL_INFO *oldTools = infoPtr->tools; + infoPtr->tools = + Alloc (sizeof(TTTOOL_INFO) * (infoPtr->uNumTools - 1)); + + if (nTool > 0) + memcpy (&infoPtr->tools[0], &oldTools[0], + nTool * sizeof(TTTOOL_INFO)); + + if (nTool < infoPtr->uNumTools - 1) + memcpy (&infoPtr->tools[nTool], &oldTools[nTool + 1], + (infoPtr->uNumTools - nTool - 1) * sizeof(TTTOOL_INFO)); + + Free (oldTools); + } + + /* update any indices affected by delete */ + + /* destroying tool that mouse was on on last relayed mouse move */ + if (infoPtr->nTool == nTool) + /* -1 means no current tool (0 means first tool) */ + infoPtr->nTool = -1; + else if (infoPtr->nTool > nTool) + infoPtr->nTool--; + + if (infoPtr->nTrackTool == nTool) + /* -1 means no current tool (0 means first tool) */ + infoPtr->nTrackTool = -1; + else if (infoPtr->nTrackTool > nTool) + infoPtr->nTrackTool--; + + if (infoPtr->nCurrentTool == nTool) + /* -1 means no current tool (0 means first tool) */ + infoPtr->nCurrentTool = -1; + else if (infoPtr->nCurrentTool > nTool) + infoPtr->nCurrentTool--; + + infoPtr->uNumTools--; +} + static LRESULT TOOLTIPS_DelToolA (HWND hwnd, WPARAM wParam, LPARAM lParam) { TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd); LPTTTOOLINFOA lpToolInfo = (LPTTTOOLINFOA)lParam; - TTTOOL_INFO *toolPtr; INT nTool; if (lpToolInfo == NULL) @@ -833,60 +978,8 @@ TOOLTIPS_DelToolA (HWND hwnd, WPARAM wParam, LPARAM lParam) return 0; nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo); - if (nTool == -1) return 0; - TRACE("tool %d\n", nTool); - - /* make sure the tooltip has disappeared before deleting it */ - TOOLTIPS_Hide(hwnd, infoPtr); - - /* delete text string */ - toolPtr = &infoPtr->tools[nTool]; - if (toolPtr->lpszText) { - if ( (toolPtr->lpszText != LPSTR_TEXTCALLBACKW) && - (HIWORD((INT)toolPtr->lpszText) != 0) ) - Free (toolPtr->lpszText); - } - - /* remove subclassing */ - if (toolPtr->uFlags & TTF_SUBCLASS) { - if (toolPtr->uFlags & TTF_IDISHWND) { - RemoveWindowSubclass((HWND)toolPtr->uId, TOOLTIPS_SubclassProc, 1); - } - else { - RemoveWindowSubclass(toolPtr->hwnd, TOOLTIPS_SubclassProc, 1); - } - } - - /* delete tool from tool list */ - if (infoPtr->uNumTools == 1) { - Free (infoPtr->tools); - infoPtr->tools = NULL; - } - else { - TTTOOL_INFO *oldTools = infoPtr->tools; - infoPtr->tools = - Alloc (sizeof(TTTOOL_INFO) * (infoPtr->uNumTools - 1)); - - if (nTool > 0) - memcpy (&infoPtr->tools[0], &oldTools[0], - nTool * sizeof(TTTOOL_INFO)); - - if (nTool < infoPtr->uNumTools - 1) - memcpy (&infoPtr->tools[nTool], &oldTools[nTool + 1], - (infoPtr->uNumTools - nTool - 1) * sizeof(TTTOOL_INFO)); - - Free (oldTools); - } - - /* destroying tool that mouse was on on last relayed mouse move */ - if (infoPtr->nTool == nTool) - { - /* no current tool (0 means first tool) */ - infoPtr->nTool = -1; - } - - infoPtr->uNumTools--; + TOOLTIPS_DelToolCommon (hwnd, infoPtr, nTool); return 0; } @@ -897,7 +990,6 @@ TOOLTIPS_DelToolW (HWND hwnd, WPARAM wParam, LPARAM lParam) { TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd); LPTTTOOLINFOW lpToolInfo = (LPTTTOOLINFOW)lParam; - TTTOOL_INFO *toolPtr; INT nTool; if (lpToolInfo == NULL) @@ -908,60 +1000,8 @@ TOOLTIPS_DelToolW (HWND hwnd, WPARAM wParam, LPARAM lParam) return 0; nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo); - if (nTool == -1) return 0; - TRACE("tool %d\n", nTool); - - /* make sure the tooltip has disappeared before deleting it */ - TOOLTIPS_Hide(hwnd, infoPtr); - - /* delete text string */ - toolPtr = &infoPtr->tools[nTool]; - if (toolPtr->lpszText) { - if ( (toolPtr->lpszText != LPSTR_TEXTCALLBACKW) && - (HIWORD((INT)toolPtr->lpszText) != 0) ) - Free (toolPtr->lpszText); - } - - /* remove subclassing */ - if (toolPtr->uFlags & TTF_SUBCLASS) { - if (toolPtr->uFlags & TTF_IDISHWND) { - RemoveWindowSubclass((HWND)toolPtr->uId, TOOLTIPS_SubclassProc, 1); - } - else { - RemoveWindowSubclass(toolPtr->hwnd, TOOLTIPS_SubclassProc, 1); - } - } - - /* delete tool from tool list */ - if (infoPtr->uNumTools == 1) { - Free (infoPtr->tools); - infoPtr->tools = NULL; - } - else { - TTTOOL_INFO *oldTools = infoPtr->tools; - infoPtr->tools = - Alloc (sizeof(TTTOOL_INFO) * (infoPtr->uNumTools - 1)); - - if (nTool > 0) - memcpy (&infoPtr->tools[0], &oldTools[0], - nTool * sizeof(TTTOOL_INFO)); - - if (nTool < infoPtr->uNumTools - 1) - memcpy (&infoPtr->tools[nTool], &oldTools[nTool + 1], - (infoPtr->uNumTools - nTool - 1) * sizeof(TTTOOL_INFO)); - - Free (oldTools); - } - - /* destroying tool that mouse was on on last relayed mouse move */ - if (infoPtr->nTool == nTool) - { - /* no current tool (0 means first tool) */ - infoPtr->nTool = -1; - } - - infoPtr->uNumTools--; + TOOLTIPS_DelToolCommon (hwnd, infoPtr, nTool); return 0; } @@ -1413,6 +1453,9 @@ TOOLTIPS_NewToolRectA (HWND hwnd, WPARAM wParam, LPARAM lParam) return FALSE; nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpti); + + TRACE("nTool = %d, rect = %s\n", nTool, wine_dbgstr_rect(&lpti->rect)); + if (nTool == -1) return 0; infoPtr->tools[nTool].rect = lpti->rect; @@ -1434,6 +1477,9 @@ TOOLTIPS_NewToolRectW (HWND hwnd, WPARAM wParam, LPARAM lParam) return FALSE; nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpti); + + TRACE("nTool = %d, rect = %s\n", nTool, wine_dbgstr_rect(&lpti->rect)); + if (nTool == -1) return 0; infoPtr->tools[nTool].rect = lpti->rect; @@ -1721,14 +1767,15 @@ static LRESULT TOOLTIPS_TrackActivate (HWND hwnd, WPARAM wParam, LPARAM lParam) { TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd); - LPTTTOOLINFOA lpToolInfo = (LPTTTOOLINFOA)lParam; - - if (lpToolInfo == NULL) - return 0; - if (lpToolInfo->cbSize < TTTOOLINFOA_V1_SIZE) - return FALSE; if ((BOOL)wParam) { + LPTTTOOLINFOA lpToolInfo = (LPTTTOOLINFOA)lParam; + + if (lpToolInfo == NULL) + return 0; + if (lpToolInfo->cbSize < TTTOOLINFOA_V1_SIZE) + return FALSE; + /* activate */ infoPtr->nTrackTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo); if (infoPtr->nTrackTool != -1) { @@ -1906,7 +1953,6 @@ TOOLTIPS_Create (HWND hwnd, const CREATESTRUCTW *lpcs) { TOOLTIPS_INFO *infoPtr; NONCLIENTMETRICSA nclm; - INT nResult; /* allocate memory for info structure */ infoPtr = (TOOLTIPS_INFO *)Alloc (sizeof(TOOLTIPS_INFO)); @@ -1929,18 +1975,6 @@ TOOLTIPS_Create (HWND hwnd, const CREATESTRUCTW *lpcs) TOOLTIPS_SetDelayTime(hwnd, TTDT_AUTOMATIC, 0L); - nResult = (INT) SendMessageA (lpcs->hwndParent, WM_NOTIFYFORMAT, - (WPARAM)hwnd, (LPARAM)NF_QUERY); - if (nResult == NFR_ANSI) { - infoPtr->bNotifyUnicode = FALSE; - TRACE(" -- WM_NOTIFYFORMAT returns: NFR_ANSI\n"); - } else if (nResult == NFR_UNICODE) { - infoPtr->bNotifyUnicode = TRUE; - TRACE(" -- WM_NOTIFYFORMAT returns: NFR_UNICODE\n"); - } else { - TRACE (" -- WM_NOTIFYFORMAT returns: error!\n"); - } - SetWindowPos (hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOZORDER | SWP_HIDEWINDOW | SWP_NOACTIVATE); return 0; diff --git a/reactos/lib/comctl32/updown.c b/reactos/lib/comctl32/updown.c index 8f7dba8a490..2e26d776760 100644 --- a/reactos/lib/comctl32/updown.c +++ b/reactos/lib/comctl32/updown.c @@ -442,98 +442,109 @@ UPDOWN_Buddy_SubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) /*********************************************************************** * UPDOWN_SetBuddy - * Tests if 'bud' is a valid window handle. If not, returns FALSE. - * Else, sets it as a new Buddy. + * + * Sets bud as a new Buddy. * Then, it should subclass the buddy * If window has the UDS_ARROWKEYS, it subcalsses the buddy window to * process the UP/DOWN arrow keys. * If window has the UDS_ALIGNLEFT or UDS_ALIGNRIGHT style * the size/pos of the buddy and the control are adjusted accordingly. */ -static BOOL UPDOWN_SetBuddy (UPDOWN_INFO* infoPtr, HWND bud) +static HWND UPDOWN_SetBuddy (UPDOWN_INFO* infoPtr, HWND bud) { DWORD dwStyle = GetWindowLongW (infoPtr->Self, GWL_STYLE); RECT budRect; /* new coord for the buddy */ int x, width; /* new x position and width for the up-down */ WNDPROC baseWndProc; CHAR buddyClass[40]; - - /* Is it a valid bud? */ - if(!IsWindow(bud)) return FALSE; + HWND ret; TRACE("(hwnd=%p, bud=%p)\n", infoPtr->Self, bud); + ret = infoPtr->Buddy; + /* there is already a body assigned */ if (infoPtr->Buddy) RemovePropA(infoPtr->Buddy, BUDDY_UPDOWN_HWND); + if(!IsWindow(bud)) + bud = 0; + /* Store buddy window handle */ infoPtr->Buddy = bud; - /* keep upDown ctrl hwnd in a buddy property */ - SetPropA( bud, BUDDY_UPDOWN_HWND, infoPtr->Self); + if(bud) { - /* Store buddy window class type */ - infoPtr->BuddyType = BUDDY_TYPE_UNKNOWN; - if (GetClassNameA(bud, buddyClass, COUNT_OF(buddyClass))) { - if (lstrcmpiA(buddyClass, "Edit") == 0) - infoPtr->BuddyType = BUDDY_TYPE_EDIT; - else if (lstrcmpiA(buddyClass, "Listbox") == 0) - infoPtr->BuddyType = BUDDY_TYPE_LISTBOX; - } + /* keep upDown ctrl hwnd in a buddy property */ + SetPropA( bud, BUDDY_UPDOWN_HWND, infoPtr->Self); - if(dwStyle & UDS_ARROWKEYS){ - /* Note that I don't clear the BUDDY_SUPERCLASS_WNDPROC property - when we reset the upDown ctrl buddy to another buddy because it is not - good to break the window proc chain. */ - if (!GetPropA(bud, BUDDY_SUPERCLASS_WNDPROC)) { - baseWndProc = (WNDPROC)SetWindowLongW(bud, GWL_WNDPROC, (LPARAM)UPDOWN_Buddy_SubclassProc); - SetPropA(bud, BUDDY_SUPERCLASS_WNDPROC, (HANDLE)baseWndProc); - } - } + /* Store buddy window class type */ + infoPtr->BuddyType = BUDDY_TYPE_UNKNOWN; + if (GetClassNameA(bud, buddyClass, COUNT_OF(buddyClass))) { + if (lstrcmpiA(buddyClass, "Edit") == 0) + infoPtr->BuddyType = BUDDY_TYPE_EDIT; + else if (lstrcmpiA(buddyClass, "Listbox") == 0) + infoPtr->BuddyType = BUDDY_TYPE_LISTBOX; + } - /* Get the rect of the buddy relative to its parent */ - GetWindowRect(infoPtr->Buddy, &budRect); - MapWindowPoints(HWND_DESKTOP, GetParent(infoPtr->Buddy), (POINT *)(&budRect.left), 2); + if(dwStyle & UDS_ARROWKEYS){ + /* Note that I don't clear the BUDDY_SUPERCLASS_WNDPROC property + when we reset the upDown ctrl buddy to another buddy because it is not + good to break the window proc chain. */ + if (!GetPropA(bud, BUDDY_SUPERCLASS_WNDPROC)) { + baseWndProc = (WNDPROC)SetWindowLongW(bud, GWL_WNDPROC, (LPARAM)UPDOWN_Buddy_SubclassProc); + SetPropA(bud, BUDDY_SUPERCLASS_WNDPROC, (HANDLE)baseWndProc); + } + } - /* now do the positioning */ - if (dwStyle & UDS_ALIGNLEFT) { - x = budRect.left; - budRect.left += DEFAULT_WIDTH + DEFAULT_XSEP; - } else if (dwStyle & UDS_ALIGNRIGHT) { - budRect.right -= DEFAULT_WIDTH + DEFAULT_XSEP; - x = budRect.right+DEFAULT_XSEP; + /* Get the rect of the buddy relative to its parent */ + GetWindowRect(infoPtr->Buddy, &budRect); + MapWindowPoints(HWND_DESKTOP, GetParent(infoPtr->Buddy), (POINT *)(&budRect.left), 2); + + /* now do the positioning */ + if (dwStyle & UDS_ALIGNLEFT) { + x = budRect.left; + budRect.left += DEFAULT_WIDTH + DEFAULT_XSEP; + } else if (dwStyle & UDS_ALIGNRIGHT) { + budRect.right -= DEFAULT_WIDTH + DEFAULT_XSEP; + x = budRect.right+DEFAULT_XSEP; + } else { + x = budRect.right+DEFAULT_XSEP; + } + + /* first adjust the buddy to accomodate the up/down */ + SetWindowPos(infoPtr->Buddy, 0, budRect.left, budRect.top, + budRect.right - budRect.left, budRect.bottom - budRect.top, + SWP_NOACTIVATE|SWP_NOZORDER); + + /* now position the up/down */ + /* Since the UDS_ALIGN* flags were used, */ + /* we will pick the position and size of the window. */ + width = DEFAULT_WIDTH; + + /* + * If the updown has a buddy border, it has to overlap with the buddy + * to look as if it is integrated with the buddy control. + * We nudge the control or change it size to overlap. + */ + if (UPDOWN_HasBuddyBorder(infoPtr)) { + if(dwStyle & UDS_ALIGNLEFT) + width += DEFAULT_BUDDYBORDER; + else + x -= DEFAULT_BUDDYBORDER; + } + + SetWindowPos(infoPtr->Self, infoPtr->Buddy, x, + budRect.top - DEFAULT_ADDTOP, width, + budRect.bottom - budRect.top + DEFAULT_ADDTOP + DEFAULT_ADDBOT, + SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_NOZORDER); } else { - x = budRect.right+DEFAULT_XSEP; + RECT rect; + GetWindowRect(infoPtr->Self, &rect); + MapWindowPoints(HWND_DESKTOP, GetParent(infoPtr->Self), (POINT *)&rect, 2); + SetWindowPos(infoPtr->Self, 0, rect.left, rect.top, DEFAULT_WIDTH, rect.bottom - rect.top, + SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_NOZORDER); } - - /* first adjust the buddy to accomodate the up/down */ - SetWindowPos(infoPtr->Buddy, 0, budRect.left, budRect.top, - budRect.right - budRect.left, budRect.bottom - budRect.top, - SWP_NOACTIVATE|SWP_NOZORDER); - - /* now position the up/down */ - /* Since the UDS_ALIGN* flags were used, */ - /* we will pick the position and size of the window. */ - width = DEFAULT_WIDTH; - - /* - * If the updown has a buddy border, it has to overlap with the buddy - * to look as if it is integrated with the buddy control. - * We nudge the control or change it size to overlap. - */ - if (UPDOWN_HasBuddyBorder(infoPtr)) { - if(dwStyle & UDS_ALIGNLEFT) - width += DEFAULT_BUDDYBORDER; - else - x -= DEFAULT_BUDDYBORDER; - } - - SetWindowPos(infoPtr->Self, infoPtr->Buddy, x, - budRect.top - DEFAULT_ADDTOP, width, - budRect.bottom - budRect.top + DEFAULT_ADDTOP + DEFAULT_ADDBOT, - SWP_NOACTIVATE); - - return TRUE; + return ret; } /*********************************************************************** @@ -859,9 +870,7 @@ static LRESULT WINAPI UpDownWindowProc(HWND hwnd, UINT message, WPARAM wParam, return (LRESULT)infoPtr->Buddy; case UDM_SETBUDDY: - temp = (int)infoPtr->Buddy; - UPDOWN_SetBuddy (infoPtr, (HWND)wParam); - return temp; + return (LRESULT)UPDOWN_SetBuddy (infoPtr, (HWND)wParam); case UDM_GETPOS: temp = UPDOWN_GetBuddyInt (infoPtr); @@ -948,7 +957,7 @@ void UPDOWN_Register(void) WNDCLASSW wndClass; ZeroMemory( &wndClass, sizeof( WNDCLASSW ) ); - wndClass.style = CS_GLOBALCLASS | CS_VREDRAW; + wndClass.style = CS_GLOBALCLASS | CS_VREDRAW | CS_HREDRAW; wndClass.lpfnWndProc = (WNDPROC)UpDownWindowProc; wndClass.cbClsExtra = 0; wndClass.cbWndExtra = sizeof(UPDOWN_INFO*); diff --git a/reactos/lib/comctl32/winehq2ros.patch b/reactos/lib/comctl32/winehq2ros.patch index 16c67a2d4e3..e3d42825ab3 100644 --- a/reactos/lib/comctl32/winehq2ros.patch +++ b/reactos/lib/comctl32/winehq2ros.patch @@ -4,7 +4,7 @@ RCS file: /home/wine/wine/dlls/comctl32/comctl32.spec,v retrieving revision 1.43 diff -u -r1.43 comctl32.spec --- comctl32.spec 20 Feb 2004 05:16:37 -0000 1.43 -+++ comctl32.spec 14 Mar 2004 09:18:35 -0000 ++++ comctl32.spec 15 Apr 2004 08:36:51 -0000 @@ -106,13 +106,13 @@ 412 stdcall RemoveWindowSubclass(long ptr long) 413 stdcall DefSubclassProc(long long long long) @@ -26,13 +26,34 @@ diff -u -r1.43 comctl32.spec # Functions imported by name +Index: imagelist.c +=================================================================== +RCS file: /home/wine/wine/dlls/comctl32/imagelist.c,v +retrieving revision 1.85 +diff -u -r1.85 imagelist.c +--- imagelist.c 27 Feb 2004 04:40:08 -0000 1.85 ++++ imagelist.c 15 Apr 2004 08:36:52 -0000 +@@ -1146,11 +1146,13 @@ + 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); Index: listview.c =================================================================== RCS file: /home/wine/wine/dlls/comctl32/listview.c,v -retrieving revision 1.384 -diff -u -r1.384 listview.c ---- listview.c 20 Feb 2004 05:12:49 -0000 1.384 -+++ listview.c 14 Mar 2004 09:18:43 -0000 +retrieving revision 1.385 +diff -u -r1.385 listview.c +--- listview.c 11 Mar 2004 00:39:53 -0000 1.385 ++++ listview.c 15 Apr 2004 08:36:56 -0000 @@ -147,6 +147,7 @@ #include #include @@ -41,48 +62,13 @@ diff -u -r1.384 listview.c #include #include #include -Index: rebar.c -=================================================================== -RCS file: /home/wine/wine/dlls/comctl32/rebar.c,v -retrieving revision 1.85 -diff -u -r1.85 rebar.c ---- rebar.c 27 Feb 2004 04:32:54 -0000 1.85 -+++ rebar.c 14 Mar 2004 09:18:47 -0000 -@@ -985,7 +985,7 @@ - } - - /* text is visible */ -- if (lpBand->fStatus & HAS_TEXT) { -+ if ((lpBand->fStatus & HAS_TEXT) && !(lpBand->fStyle & RBBS_HIDETITLE)) { - lpBand->fDraw |= DRAW_TEXT; - lpBand->rcCapText.right = max(lpBand->rcCapText.left, - lpBand->rcCapText.right-REBAR_POST_TEXT); -@@ -1131,7 +1131,7 @@ - } - - /* text is visible */ -- if (lpBand->fStatus & HAS_TEXT) { -+ if ((lpBand->fStatus & HAS_TEXT) && !(lpBand->fStyle & RBBS_HIDETITLE)) { - lpBand->fDraw |= DRAW_TEXT; - lpBand->rcCapText.bottom = max(lpBand->rcCapText.top, - lpBand->rcCapText.bottom); -@@ -2027,7 +2027,8 @@ - } - - /* text is visible */ -- if ((lpBand->fMask & RBBIM_TEXT) && (lpBand->lpText)) { -+ if ((lpBand->fMask & RBBIM_TEXT) && (lpBand->lpText) && -+ !(lpBand->fStyle & RBBS_HIDETITLE)) { - HDC hdc = GetDC (0); - HFONT hOldFont = SelectObject (hdc, infoPtr->hFont); - SIZE size; Index: string.c =================================================================== RCS file: /home/wine/wine/dlls/comctl32/string.c,v retrieving revision 1.3 diff -u -r1.3 string.c --- string.c 20 Feb 2004 19:58:39 -0000 1.3 -+++ string.c 14 Mar 2004 09:18:48 -0000 ++++ string.c 15 Apr 2004 08:36:56 -0000 @@ -254,7 +254,7 @@ { TRACE("(%s,%s)\n", debugstr_w(lpszStr), debugstr_w(lpszSearch)); @@ -101,3 +87,19 @@ diff -u -r1.3 string.c } /************************************************************************* +Index: treeview.c +=================================================================== +RCS file: /home/wine/wine/dlls/comctl32/treeview.c,v +retrieving revision 1.145 +diff -u -r1.145 treeview.c +--- treeview.c 1 Mar 2004 23:10:52 -0000 1.145 ++++ treeview.c 15 Apr 2004 08:36:58 -0000 +@@ -3093,7 +3093,7 @@ + TRACE("\n"); + + if (wineItem->state & TVIS_EXPANDED) +- return FALSE; ++ return TRUE; + + TRACE("TVE_EXPAND %p %s\n", wineItem, TREEVIEW_ItemName(wineItem)); + From 3d289e8e0569cf86d08b2e30b889af20fbe76d0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Thu, 15 Apr 2004 08:42:21 +0000 Subject: [PATCH 0897/1463] Sync to Wine-20040408: Robert Shearman - Separate US English resources from English ones. Jose Manuel Ferrer Ortiz - Updated Spanish translations. Marcelo Duarte - Minor updates in resource for Portuguese. Rein Klazes - Fix a possible null pointer crash in FILEDLG95_LOOKIN_Init. svn path=/trunk/; revision=9148 --- reactos/lib/comdlg32/cdlg_En.rc | 74 ++++- reactos/lib/comdlg32/cdlg_Es.rc | 390 +++++++++++++++++++++----- reactos/lib/comdlg32/cdlg_Pt.rc | 6 +- reactos/lib/comdlg32/filedlg.c | 2 +- reactos/lib/comdlg32/winehq2ros.patch | 27 +- 5 files changed, 396 insertions(+), 103 deletions(-) diff --git a/reactos/lib/comdlg32/cdlg_En.rc b/reactos/lib/comdlg32/cdlg_En.rc index 3e972db2ffc..6e4b04a989f 100644 --- a/reactos/lib/comdlg32/cdlg_En.rc +++ b/reactos/lib/comdlg32/cdlg_En.rc @@ -20,7 +20,7 @@ * WARNING: DO NOT CHANGE THE SIZE OF THE STANDARD DIALOG TEMPLATES. */ -LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US OPEN_FILE DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 275, 134 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU @@ -460,3 +460,75 @@ STRINGTABLE DISCARDABLE /* Color names */ IDS_COLOR_AQUA "Aqua" IDS_COLOR_WHITE "White" } + + +/****************************************************************/ +/* English neutral resources +/****************************************************************/ + +LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL + +CHOOSE_FONT DIALOG DISCARDABLE 13, 54, 264, 147 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Font" +FONT 8, "Helv" +{ + LTEXT "&Font:",stc1 ,6,3,40,9 + COMBOBOX cmb1, 6,13,94,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | + CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE + LTEXT "Font St&yle:",stc2 ,108,3,44,9 + COMBOBOX cmb2,108,13,64,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | + WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE + LTEXT "&Size:",stc3,179,3,30,9 + COMBOBOX cmb3,179,13,32,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | + WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE | CBS_SORT + DEFPUSHBUTTON "OK",IDOK,218,6,40,14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON + PUSHBUTTON "Cancel",IDCANCEL,218,23,40,14,WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Apply", psh3,218,40,40,14,WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Help" , pshHelp,218,57,40,14,WS_GROUP | WS_TABSTOP + GROUPBOX "Effects",grp1,6,72,84,34,WS_GROUP + CHECKBOX "Stri&keout", chx1, 10,82,50,10, BS_AUTOCHECKBOX | WS_TABSTOP + CHECKBOX "&Underline", chx2, 10,94,50,10, BS_AUTOCHECKBOX + LTEXT "&Colour:", stc4 ,6,110,30,9 + COMBOBOX cmb4,6,120,84,100,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | + CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP + GROUPBOX "Sample",grp2,98,72,120,36,WS_GROUP + CTEXT "AaBbYyZz",stc5,103,80,109,24,SS_NOPREFIX | NOT WS_VISIBLE + LTEXT "Scr&ipt:",stc7 ,98,114,40,9 + COMBOBOX cmb5,98,124,120,10,CBS_DROPDOWNLIST |CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | + CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP +} + + +CHOOSE_COLOR DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 300, 185 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Colour" +FONT 8, "Helv" +{ + LTEXT "&Basic Colours:", 1088, 4, 4, 140, 10 + LTEXT "&Custom Colours:", 1089, 4, 106, 140, 10 + LTEXT "Colour | Sol&id", 1090, 150, 151, 48, 10 + LTEXT "&Red:", 726 /*1094*/,249,126,24,10 + EDITTEXT 706, 275,124,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "&Green:",727/*1095*/,249,140,24,10 + EDITTEXT 707, 275,138,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "&Blue:",728 /*1096*/,249,154,24,10 + EDITTEXT 708, 275,152,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "&Hue:" ,723 /*1091*/,202,126,22,10 + EDITTEXT 703, 226,124,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "&Sat:" ,724 /*1092*/,202,140,22,10 + EDITTEXT 704, 226,138,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "&Lum:" ,725 /*1093*/,202,154,22,10 + EDITTEXT 705, 226,152,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP + CONTROL "" ,720,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP,4,14,140,86 + CONTROL "" ,721,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP,4,116,140,28 + CONTROL "" ,710,"STATIC",WS_BORDER|SS_SIMPLE|WS_TABSTOP|WS_GROUP, 152,4,118,116 + CONTROL "" ,702,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP, 278,4,8,116 + CONTROL "" ,709,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP, 152,124,40,26 + DEFPUSHBUTTON "OK", 1, 4, 166, 44, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Cancel", 2, 52, 166, 44, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Help", pshHelp,100,166, 44, 14 + PUSHBUTTON "&Add to Custom Colours", 712/*1024*/, 152, 166, 142, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Define Custom Colours >>", 719/*1025*/, 4, 150, 142, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&i",713,300,200,4,14 /* just a dummy: 'i' is like &i in "sol&id" */ +} diff --git a/reactos/lib/comdlg32/cdlg_Es.rc b/reactos/lib/comdlg32/cdlg_Es.rc index 72b798e0442..26a33226f27 100644 --- a/reactos/lib/comdlg32/cdlg_Es.rc +++ b/reactos/lib/comdlg32/cdlg_Es.rc @@ -1,5 +1,6 @@ /* * Copyright 1995 Jon Tombs + * 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 @@ -28,19 +29,19 @@ CAPTION "Abrir" FONT 8, "Helv" { LTEXT "Nombre de &archivo:", 1090, 6, 6, 76, 9 - EDITTEXT 1152, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP + EDITTEXT edt1, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP LISTBOX 1120, 6, 32, 90, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP LTEXT "&Directorios:", -1, 110, 6, 92, 9 LTEXT "", 1088, 110, 18, 92, 9, SS_NOPREFIX | WS_GROUP LISTBOX 1121, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP LTEXT "&Mostrar archivos de tipo:", 1089, 6, 104, 90, 9 - COMBOBOX 1136, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP + COMBOBOX cmb1, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP LTEXT "U&nidades:", 1091, 110, 104, 92, 9 - COMBOBOX 1137, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + COMBOBOX cmb2, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP DEFPUSHBUTTON "Abrir", IDOK, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP PUSHBUTTON "Cancelar", IDCANCEL, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "A&yuda", 1038, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP - CHECKBOX "&Solo lectura", 1040, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + PUSHBUTTON "A&yuda", pshHelp, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP + CHECKBOX "&S髄o lectura", chx1, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP } @@ -50,19 +51,19 @@ CAPTION "&Guardar como..." FONT 8, "Helv" { LTEXT "Nombre de &archivo:", 1090, 6, 6, 76, 9 - EDITTEXT 1152, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP + EDITTEXT edt1, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP LISTBOX 1120, 6, 32, 90, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP LTEXT "&Directorios:", -1, 110, 6, 92, 9 LTEXT "", 1088, 110, 18, 92, 9, SS_NOPREFIX | WS_GROUP LISTBOX 1121, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP LTEXT "&Mostrar archivos de tipo:", 1089, 6, 104, 90, 9 - COMBOBOX 1136, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP + COMBOBOX cmb1, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP LTEXT "U&nidades:", 1091, 110, 104, 92, 9 - COMBOBOX 1137, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + COMBOBOX cmb2, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP DEFPUSHBUTTON "&Guardar como", IDOK, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP PUSHBUTTON "Cancelar", IDCANCEL, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "A&yuda", 1038, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP - CHECKBOX "&Solo lectura", 1040, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + PUSHBUTTON "A&yuda", pshHelp, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP + CHECKBOX "&S髄o lectura", chx1, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP } @@ -72,20 +73,20 @@ CAPTION "Imprimir" FONT 8, "Helv" { LTEXT "Impresora:", 1088, 6, 6, 40, 9 - LTEXT "Campo de impresi髇", 1089, 60, 6, 150, 9 - GROUPBOX "", 1072, 6, 30, 160, 65, BS_GROUPBOX - RADIOBUTTON "&Todo", 1056, 16, 45, 60, 12 - RADIOBUTTON "Selecc&i髇", 1057, 16, 60, 60, 12 - RADIOBUTTON "&Paginas", 1058, 16, 75, 60, 12 + LTEXT "", 1089, 60, 6, 150, 9 + GROUPBOX "Rango de impresi髇", grp1, 6, 30, 160, 65, BS_GROUPBOX + RADIOBUTTON "&Todo", rad1, 16, 45, 60, 12 + RADIOBUTTON "Selecc&i髇", rad2, 16, 60, 60, 12 + RADIOBUTTON "&P醙inas", rad3, 16, 75, 60, 12 DEFPUSHBUTTON "Imprimir", IDOK, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP PUSHBUTTON "Cancelar", IDCANCEL, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "&Setup", 1024, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Configuraci髇", psh1, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP LTEXT "&Desde:", 1090, 60, 80, 30, 9 LTEXT "&Hasta:", 1091, 120, 80, 30, 9 LTEXT "Calidad de impre&si髇:", 1092, 6, 100, 76, 9 - COMBOBOX 1136, 80, 100, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP - CHECKBOX "Impri&mir en un archivo", 1040, 20, 100, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - CHECKBOX "Condensado", 1041, 160, 100, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + COMBOBOX cmb1, 80, 100, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + CHECKBOX "Impri&mir en un archivo", chx1, 20, 100, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "Condensado", chx2, 160, 100, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP } @@ -94,24 +95,24 @@ STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Configuraci髇 de impresi髇" FONT 8, "Helv" { - GROUPBOX "Impresora:", 1072, 6, 10, 180, 65, BS_GROUPBOX - RADIOBUTTON "Pre&determinada del sistema", 1056, 16, 20, 80, 12 - LTEXT "[none]", 1088, 35, 35, 120, 9 - RADIOBUTTON "Impresora &especmfica:", 1057, 16, 50, 80, 12 - COMBOBOX 1136, 35, 65, 149, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + GROUPBOX "Impresora:", grp1, 6, 10, 180, 65, BS_GROUPBOX + RADIOBUTTON "Pre&determinada del sistema", rad1, 16, 20, 80, 12 + LTEXT "[ninguna]", 1088, 35, 35, 120, 9 + RADIOBUTTON "Impresora &espec韋ica:", rad2, 16, 50, 80, 12 + COMBOBOX cmb1, 35, 65, 149, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP DEFPUSHBUTTON "Aceptar", IDOK, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP PUSHBUTTON "Cancelar", IDCANCEL, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "&Configurar", 1024, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP - GROUPBOX "Orientaci髇", 1073, 6, 85, 100, 50, BS_GROUPBOX - RADIOBUTTON "&Vertical", 1058, 50, 100, 40, 12 - RADIOBUTTON "&Horizontal", 1059, 50, 115, 40, 12 - ICON "LANDSCAP", 1097, 10, 95, 32, 32 - ICON "PORTRAIT", 1098, 10, 95, 32, 32 - GROUPBOX "Papel", 1074, 120, 85, 180, 50, BS_GROUPBOX + PUSHBUTTON "&Configurar", psh1, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP + GROUPBOX "Orientaci髇", grp2, 6, 85, 100, 50, BS_GROUPBOX + RADIOBUTTON "&Vertical", rad3, 50, 100, 40, 12 + RADIOBUTTON "&Apaisado", rad4, 50, 115, 40, 12 + ICON "LANDSCAP", stc10, 10, 95, 32, 32 + ICON "PORTRAIT", stc11, 10, 95, 32, 32 + GROUPBOX "Papel", grp3, 120, 85, 180, 50, BS_GROUPBOX LTEXT "&Tama駉", 1089, 130, 95, 30, 9 LTEXT "O&rigen:", 1090, 130, 110, 30, 9 - COMBOBOX 1137, 155, 95, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP - COMBOBOX 1138, 155, 110, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + COMBOBOX cmb2, 155, 95, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + COMBOBOX cmb3, 155, 110, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP } @@ -120,28 +121,28 @@ STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Fuente" FONT 8, "Helv" { - LTEXT "&Fuente:",1088 ,6,3,40,9 - COMBOBOX 1136 ,6,13,94,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | + LTEXT "&Fuente:",stc1 ,6,3,40,9 + COMBOBOX cmb1, 6,13,94,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE - LTEXT "Est&ilo de fuente:",1089 ,108,3,44,9 - COMBOBOX 1137,108,13,64,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | + LTEXT "Est&ilo:",stc2 ,108,3,44,9 + COMBOBOX cmb2,108,13,64,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE - LTEXT "&Tama駉:",1090,179,3,30,9 - COMBOBOX 1138,179,13,32,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | + LTEXT "&Tama駉:",stc3,179,3,30,9 + COMBOBOX cmb3,179,13,32,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE | CBS_SORT DEFPUSHBUTTON "Aceptar",IDOK,218,6,40,14,WS_GROUP PUSHBUTTON "Cancelar",IDCANCEL,218,23,40,14,WS_GROUP - PUSHBUTTON "A&plicar", 1026,218,40,40,14,WS_GROUP - PUSHBUTTON "A&yuda" , 1038,218,57,40,14,WS_GROUP - GROUPBOX "&Efectos",1072,6,72,84,34,WS_GROUP - CHECKBOX "&Rayado", 1040, 10,82,50,10, BS_AUTOCHECKBOX | WS_TABSTOP - CHECKBOX "&Subrayado", 1041, 10,94,50,10, BS_AUTOCHECKBOX - LTEXT "&Color:", 1091 ,6,110,30,9 - COMBOBOX 1139,6,120,84,100,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | + PUSHBUTTON "A&plicar", psh3,218,40,40,14,WS_GROUP + PUSHBUTTON "A&yuda" , pshHelp,218,57,40,14,WS_GROUP + GROUPBOX "&Efectos",grp1,6,72,84,34,WS_GROUP + CHECKBOX "&Tachado", chx1, 10,82,50,10, BS_AUTOCHECKBOX | WS_TABSTOP + CHECKBOX "&Subrayado", chx2, 10,94,50,10, BS_AUTOCHECKBOX + LTEXT "&Color:", stc4 ,6,110,30,9 + COMBOBOX cmb4,6,120,84,100,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP GROUPBOX "Ejemplo",grp2,98,72,120,36,WS_GROUP CTEXT "AaBbYyZz疡",stc5,103,80,109,24,SS_NOPREFIX | NOT WS_VISIBLE - LTEXT "Scr&ipt (translate):",stc7 ,98,114,80,9 + LTEXT "Codificaci髇:",stc7 ,98,114,80,9 COMBOBOX cmb5,98,124,120,10,CBS_DROPDOWNLIST |CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP } @@ -154,28 +155,28 @@ FONT 8, "Helv" { LTEXT "Colores &b醩icos:", 1088, 4, 4, 140, 10 LTEXT "Colores person&alizados:", 1089, 4, 106, 140, 10 - LTEXT "Color|S3l&ido", 1090, 150, 151, 48, 10 + LTEXT "Color|S髄&ido", 1090, 150, 151, 48, 10 LTEXT "&Rojo:", 726 /*1094*/,249,126,24,10 - EDITTEXT 706, 275,124,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP + EDITTEXT 706, 275,124,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP LTEXT "&Verde:",727/*1095*/,249,140,24,10 - EDITTEXT 707, 275,138,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP + EDITTEXT 707, 275,138,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP LTEXT "A&zul:",728 /*1096*/,249,154,24,10 - EDITTEXT 708, 275,152,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP + EDITTEXT 708, 275,152,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP LTEXT "&Tinte:" ,723 /*1091*/,202,126,22,10 - EDITTEXT 703, 226,124,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP + EDITTEXT 703, 226,124,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP LTEXT "&Sat.:" ,724 /*1092*/,202,140,22,10 - EDITTEXT 704, 226,138,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP + EDITTEXT 704, 226,138,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP LTEXT "&Lum.:" ,725 /*1093*/,202,154,22,10 - EDITTEXT 705, 226,152,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP + EDITTEXT 705, 226,152,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP CONTROL "" ,720,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP,4,14,140,86 CONTROL "" ,721,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP,4,116,140,28 - CONTROL "" ,710,"STATIC",WS_BORDER|SS_SIMPLE|WS_TABSTOP|WS_GROUP, 152,4,118,116 CONTROL "" ,702,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP, 278,4,8,116 + CONTROL "" ,710,"STATIC",WS_BORDER|SS_SIMPLE|WS_TABSTOP|WS_GROUP, 152,4,118,116 CONTROL "" ,702,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP, 278,4,8,116 CONTROL "" ,709,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP, 152,124,40,26 DEFPUSHBUTTON "Aceptar", IDOK, 4, 166, 44, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP PUSHBUTTON "Cancelar", IDCANCEL, 52, 166, 44, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "A&yuda", 1038,100,166, 44, 14 - PUSHBUTTON "Agregar a los &colores personalizados", 712/*1024*/, 152, 166, 142, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "A&yuda", pshHelp,100,166, 44, 14 + PUSHBUTTON "A馻dir a &colores personalizados", 712/*1024*/, 152, 166, 142, 14, WS_GROUP | WS_TABSTOP PUSHBUTTON "&Definir colores personalizados >>", 719/*1025*/, 4, 150, 142, 14, WS_GROUP | WS_TABSTOP PUSHBUTTON "&i",713,300,200,4,14 /* just a dummy: 'i' is like &i in "sol&id" */ } @@ -187,15 +188,15 @@ CAPTION "Buscar" FONT 8, "Helv" { LTEXT "Buscar:", -1, 4, 8, 42, 8 - EDITTEXT 1152, 47, 7, 128, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP - CHECKBOX "&Comparar palabra entera solamente", 1040, 4, 26, 100, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - CHECKBOX "&May鷖culas/min鷖culas", 1041, 4, 42, 64, 12, BS_AUTOCHECKBOX | WS_TABSTOP - GROUPBOX "Direcci髇", 1072, 107, 26, 68, 28 - CONTROL "A&rriba", 1056, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 111, 38, 20, 12 - CONTROL "&Abajo", 1057, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 138, 38, 30, 12 + EDITTEXT edt1, 47, 7, 128, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + CHECKBOX "&S髄o palabra entera", chx1, 4, 26, 100, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "&May鷖culas/min鷖culas", chx2, 4, 42, 64, 12, BS_AUTOCHECKBOX | WS_TABSTOP + GROUPBOX "Direcci髇", grp1, 107, 26, 68, 28 + CONTROL "A&rriba", rad1, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 111, 38, 20, 12 + CONTROL "&Abajo", rad2, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 138, 38, 30, 12 DEFPUSHBUTTON "Buscar &siguiente", IDOK, 182, 5, 50, 14, WS_GROUP | WS_TABSTOP PUSHBUTTON "Cancelar", IDCANCEL, 182, 23, 50, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "A&yuda", 1038, 182, 45, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "A&yuda", pshHelp, 182, 45, 50, 14, WS_GROUP | WS_TABSTOP } @@ -205,14 +206,259 @@ CAPTION "R&eemplazar" FONT 8, "Helv" { LTEXT "Buscar:", -1, 4, 9, 48, 8 - EDITTEXT 1152, 54, 7, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP - LTEXT "Re&emplazar por:", 1090, -1, 4, 26, 48, 8 - EDITTEXT 1153, 54, 24, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP - CHECKBOX "&Comparar palabra entera solamente", 1040, 5, 46, 104, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - CHECKBOX "&May鷖culas/min鷖culas", 1041, 5, 62, 59, 12, BS_AUTOCHECKBOX | WS_TABSTOP + EDITTEXT edt1, 54, 7, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "Re&emplazar por:", -1, 4, 26, 48, 8 + EDITTEXT edt2, 54, 24, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + CHECKBOX "&Comparar palabra entera solamente", chx1, 5, 46, 104, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "&May鷖culas/min鷖culas", chx2, 5, 62, 59, 12, BS_AUTOCHECKBOX | WS_TABSTOP DEFPUSHBUTTON "Reemplazar &siguiente", IDOK, 174, 4, 50, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "&Reemplazar", 1024, 174, 21, 50, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "Reemplazar &todo", 1025, 174, 38, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Reemplazar", psh1, 174, 21, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Reemplazar &todo", psh2, 174, 38, 50, 14, WS_GROUP | WS_TABSTOP PUSHBUTTON "Cancelar", IDCANCEL, 174, 55, 50, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "A&yuda", 1038, 174, 75, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "A&yuda", pshHelp, 174, 75, 50, 14, WS_GROUP | WS_TABSTOP +} + + +PRINT32 DIALOG LOADONCALL MOVEABLE DISCARDABLE 32, 32, 288, 186 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | + DS_CONTEXTHELP | DS_3DLOOK +CAPTION "Imprimir" +FONT 8, "Helv" +{ + DEFPUSHBUTTON "Aceptar", IDOK, 180,164, 48,14, WS_GROUP | BS_DEFPUSHBUTTON + PUSHBUTTON "Cancelar", IDCANCEL, 232,164, 48,14, WS_GROUP + PUSHBUTTON "&Ayuda", pshHelp, 50, 161, 48,14, WS_GROUP + + GROUPBOX "Impresora", grp4, 8, 4, 272,84, WS_GROUP + CONTROL "Imprimir a a&rchivo", chx1, "Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,212,70,64,12 + PUSHBUTTON "&Propiedades", psh2, 212, 17, 60,14, WS_GROUP + LTEXT "&Nombre:", stc6, 16, 20, 36,8 + COMBOBOX cmb4, 52, 18, 152,152,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP + LTEXT "Estado:", stc8, 16, 36, 36,10, SS_NOPREFIX + LTEXT "Dummy State", stc12, 52, 36, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "Tipo:", stc7, 16, 48, 36,10, SS_NOPREFIX + LTEXT "Dummy Type", stc11, 52, 48, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "D髇de:", stc10, 16, 60, 36,10, SS_NOPREFIX + LTEXT "Dummy Location", stc14, 52, 60, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "Comentario:", stc9, 16, 72, 36,10, SS_NOPREFIX + LTEXT "Dummy Remark", stc13, 52, 72, 152,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + + GROUPBOX "Copias", grp2, 160, 92, 120,64, WS_GROUP + LTEXT "N鷐ero de &copias:",stc5,168,108,68,8 + ICON "", ico3, 162,124, 76,24, WS_GROUP | SS_CENTERIMAGE + CONTROL "C&ollate", chx2,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,240,130,36,12 + EDITTEXT edt3, 240,106, 32,12, WS_GROUP | ES_NUMBER + + GROUPBOX "Rango de impresi髇", grp1, 8,92, 144,64, WS_GROUP + CONTROL "&Todo", rad1,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,16,106,64,12 + CONTROL "P&ginas", rad3,"Button",BS_AUTORADIOBUTTON,16,122,36,12 + CONTROL "&Selecci髇", rad2,"Button",BS_AUTORADIOBUTTON,16,138,64,12 + EDITTEXT edt1, 74,122, 26,12, WS_GROUP | ES_NUMBER + EDITTEXT edt2, 118,122, 26,12, WS_GROUP | ES_NUMBER + RTEXT "&desde:", stc2, 52,124, 20,8 + RTEXT "&hasta:", stc3, 100,124, 16,8 +} + +PRINT32_SETUP DIALOG LOADONCALL MOVEABLE DISCARDABLE 32, 32, 288, 178 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | + DS_CONTEXTHELP | DS_3DLOOK +CAPTION "Configuraci髇 de impresi髇" +FONT 8, "Helv" +BEGIN + DEFPUSHBUTTON "Aceptar",IDOK,180,156,48,14,WS_GROUP + PUSHBUTTON "Cancelar",IDCANCEL,232,156,48,14 +/* PUSHBUTTON "Network...", psh5, 284,156,48,14 */ + + GROUPBOX "Impresora", grp4, 8, 4, 272,84, WS_GROUP + PUSHBUTTON "&Propiedades", psh2, 212, 17, 60,14, WS_GROUP + LTEXT "&Nombre:", stc6, 16, 20, 36,8 + COMBOBOX cmb1, 52, 18, 152,152,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP + LTEXT "Estado:", stc8, 16, 36, 36,10, SS_NOPREFIX + LTEXT "Dummy State", stc12, 52, 36, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "Tipo:", stc7, 16, 48, 36,10, SS_NOPREFIX + LTEXT "Dummy Type", stc11, 52, 48, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "D髇de:", stc10, 16, 60, 36,10, SS_NOPREFIX + LTEXT "Dummy Location", stc14, 52, 60, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "Comentario:", stc9, 16, 72, 36,10, SS_NOPREFIX + LTEXT "Dummy Remark", stc13, 52, 72, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + + GROUPBOX "Papel", grp2, 8, 92, 164,56, WS_GROUP + LTEXT "&Tama駉:", stc2, 16,108, 36, 8 + COMBOBOX cmb2, 52,106, 112,112,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP + LTEXT "&Origen:", stc3, 16,128, 36, 8 + COMBOBOX cmb3, 52,126, 112,112,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP + + GROUPBOX "Orientaci髇", grp1, 180, 92, 100,56, WS_GROUP + ICON "", ico1, 195,112, 18,20, WS_GROUP + CONTROL "&Vertical", rad1,"Button",BS_AUTORADIOBUTTON | WS_GROUP |WS_TABSTOP,224,106,52,12 + CONTROL "A&paisado", rad2,"Button",BS_AUTORADIOBUTTON,224,126,52,12 +END + +PAGESETUPDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 32, 32, 240, 240 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "P醙ina de configuraci髇" +FONT 8, "Helv" +BEGIN + CONTROL "", rct1, 130, 0x00020006, 80, 8, 80, 80, SS_WHITERECT + CONTROL "", rct2, 130, 0x00020005, 160, 12, 4, 80, SS_GRAYRECT + CONTROL "", rct3, 130, 0x00020005, 84, 88, 80, 4, SS_GRAYRECT + GROUPBOX "Papel", grp2, 8, 96, 224, 56, BS_GROUPBOX + LTEXT "&Tama駉:", stc2, 16, 112, 36, 8 + COMBOBOX cmb2, 64, 110, 160, 160, CBS_SIMPLE|CBS_DROPDOWN|CBS_SORT|WS_GROUP|WS_TABSTOP|WS_VSCROLL + LTEXT "&Bandeja:", stc3, 16, 132, 36, 8 + COMBOBOX cmb3, 64, 130, 160, 160, CBS_SIMPLE|CBS_DROPDOWN|CBS_SORT|WS_GROUP|WS_TABSTOP|WS_VSCROLL + GROUPBOX "Orientaci髇", grp1, 8, 156, 64, 56, BS_GROUPBOX + AUTORADIOBUTTON "&Vertical", rad1, 16, 170, 52, 12, BS_AUTORADIOBUTTON + AUTORADIOBUTTON "&Apaisado", rad2, 16, 190, 52, 12, BS_AUTORADIOBUTTON + GROUPBOX "M醨genes", grp4, 80, 156, 152, 56, BS_GROUPBOX + LTEXT "I&zquierdo:", stc15, 88, 172, 21, 8 + EDITTEXT edt4, 111, 170, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER + LTEXT "&Derecho:", stc16, 159, 172, 27, 8 + EDITTEXT edt6, 187, 170, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER + LTEXT "&Superior:", stc17, 88, 192, 21, 8 + EDITTEXT edt5, 111, 190, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER + LTEXT "In&ferior:", stc18, 159, 192, 23, 8 + EDITTEXT edt7, 187, 190, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER + DEFPUSHBUTTON "Aceptar", IDOK, 71, 220, 50, 14, BS_PUSHBUTTON + PUSHBUTTON "Cancelar", IDCANCEL, 126, 220, 50, 14 + PUSHBUTTON "&Impresora...", psh3, 184, 220, 48, 14 +END + +NEWFILEOPENORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 280, 164 +STYLE DS_MODALFRAME | DS_CONTEXTHELP | WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_CLIPCHILDREN +CAPTION "Abrir" +FONT 8, "Helv" +{ + LTEXT "Mirar &en:",IDC_LOOKINSTATIC,4,6,43,8, SS_NOTIFY + COMBOBOX IDC_LOOKIN,49,3,132,100,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + + LTEXT "" , IDC_TOOLBARSTATIC, 181, 2, 102, 17, NOT WS_GROUP | NOT WS_VISIBLE + LISTBOX IDC_SHELLSTATIC,4,20,272,85, LBS_SORT | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | WS_HSCROLL | NOT WS_VISIBLE + + LTEXT "Nombre de &archivo:",IDC_FILENAMESTATIC,5,112,46,8, SS_NOTIFY + EDITTEXT IDC_FILENAME,54,110,155,12,ES_AUTOHSCROLL + + LTEXT "Archivos de &tipo:",IDC_FILETYPESTATIC,5,128,42,8, SS_NOTIFY + COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + + CONTROL "Abrir como &s髄o-lectura",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,145,100,10 + + DEFPUSHBUTTON "&Abrir", IDOK,222,110,50,14 + PUSHBUTTON "Cancelar", IDCANCEL,222,128,50,14 + PUSHBUTTON "&Ayuda", pshHelp,222,145,50,14 +} + +STRINGTABLE DISCARDABLE +{ + IDS_ABOUTBOX "&Acerca del test FolderPicker" + IDS_DOCUMENTFOLDERS "Carpetas de documentos" + IDS_PERSONAL "Mis Documentos" + IDS_FAVORITES "Mis Favoritos" + IDS_PATH "Ruta del sistema" + IDS_DESKTOP "Escritorio" + IDS_FONTS "Fuentes" + IDS_MYCOMPUTER "Mi PC" +} + +STRINGTABLE DISCARDABLE +{ + IDS_SYSTEMFOLDERS "Carpetas del sistema" + IDS_LOCALHARDRIVES "Discos duros locales" + IDS_FILENOTFOUND "Archivo no encontrado" + IDS_VERIFYFILE "Compruebe que haya dado el nombre de archivo correcto" + IDS_CREATEFILE "El archivo no existe\n緿esea crearlo?" + IDS_OVERWRITEFILE "El archivo ya existe.\n緿esea reemplazarlo?" + IDS_INVALID_FILENAME_TITLE "Caracter(es) inv醠idos en la ruta" + IDS_INVALID_FILENAME "Un nombre de archivo no puede contener ninguno de los siguientes caracteres: \n / : < > |" + IDS_PATHNOTEXISTING "La ruta no existe" + IDS_FILENOTEXISTING "El archivo no existe" +} + +STRINGTABLE DISCARDABLE +{ + IDS_UPFOLDER "Subir un nivel" + IDS_NEWFOLDER "Crear nueva carpeta" + IDS_LISTVIEW "Lista" + IDS_REPORTVIEW "Detalles" + IDS_TODESKTOP "Explorar el escritorio" +} + +STRINGTABLE DISCARDABLE +{ + PD32_PRINT_TITLE "Imprimir" + + PD32_VALUE_UREADABLE "Entrada ilegible" + PD32_INVALID_PAGE_RANGE "Este valor no concuerda con el rango de la \ +p醙ina.\n\ Por favor, introduzca un valor entre %d y %d." + PD32_FROM_NOT_ABOVE_TO "La entrada 'desde' no puede exceder \ +a la entrada 'hasta'." + PD32_MARGINS_OVERLAP "Los m醨genes overlap o fall outside \ +los boundaries del papel.\nPor favor, reintroduzca los m醨genes." + PD32_NR_OF_COPIES_EMPTY "El n鷐ero del valor 'N鷐ero de \ +copias' no puede estar vac韔." + PD32_TOO_LARGE_COPIES "Este n鷐ero tan grande de copias no \ +es soportado por su impresora.\nPor favor, introduzca un valor entre 1 y %d." + PD32_PRINT_ERROR "Ocurri un error en la impresora." + PD32_NO_DEFAULT_PRINTER "Ninguna impresora definida por \ +defecto." + PD32_CANT_FIND_PRINTER "No se encuentra la impresora." + PD32_OUT_OF_MEMORY "Sin memoria." + PD32_GENERIC_ERROR "Ocurri un error." + PD32_DRIVER_UNKNOWN "Manejador de la impresora \ +desconocido." + + PD32_DEFAULT_PRINTER "Impresora por defecto; " + PD32_NR_OF_DOCUMENTS_IN_QUEUE "Hay %d documentos en la cola" + PD32_PRINT_ALL_X_PAGES "&Todas las %d p醙inas" + PD32_MARGINS_IN_INCHES "M醨genes [pulgadas]" + PD32_MARGINS_IN_MILIMETERS "M醨genes [mm]" + PD32_MILIMETERS "mm" + + PD32_PRINTER_STATUS_READY "Lista" + PD32_PRINTER_STATUS_PAUSED "Pausada; " + PD32_PRINTER_STATUS_ERROR "Error; " + PD32_PRINTER_STATUS_PENDING_DELETION "Borrado pendiente; " + PD32_PRINTER_STATUS_PAPER_JAM "Paper jam; " + PD32_PRINTER_STATUS_PAPER_OUT "Sin papel; " + PD32_PRINTER_STATUS_MANUAL_FEED "Ponga papel a mano; " + PD32_PRINTER_STATUS_PAPER_PROBLEM "Problema con el papel; " + PD32_PRINTER_STATUS_OFFLINE "Impresora apagada; " + PD32_PRINTER_STATUS_IO_ACTIVE "E/S activa; " + PD32_PRINTER_STATUS_BUSY "Ocupada; " + PD32_PRINTER_STATUS_PRINTING "Imprimiendo; " + PD32_PRINTER_STATUS_OUTPUT_BIN_FULL "La bandeja de salida est llena; " + PD32_PRINTER_STATUS_NOT_AVAILABLE "No disponible; " + PD32_PRINTER_STATUS_WAITING "Esperando; " + PD32_PRINTER_STATUS_PROCESSING "Procesando; " + PD32_PRINTER_STATUS_INITIALIZING "Inicializando; " + PD32_PRINTER_STATUS_WARMING_UP "Calent醖onse; " + PD32_PRINTER_STATUS_TONER_LOW "T髇er bajo; " + PD32_PRINTER_STATUS_NO_TONER "Sin t髇er; " + PD32_PRINTER_STATUS_PAGE_PUNT "Page punt; " + PD32_PRINTER_STATUS_USER_INTERVENTION "Interrumpido por el usuario; " + PD32_PRINTER_STATUS_OUT_OF_MEMORY "Sin memoria; " + PD32_PRINTER_STATUS_DOOR_OPEN "La puerta de la impresora est \ +abierta; " + PD32_PRINTER_STATUS_SERVER_UNKNOWN "Servidor de impresi髇 desconocido; " + PD32_PRINTER_STATUS_POWER_SAVE "Modo de ahorro de energ韆; " +} + +STRINGTABLE DISCARDABLE /* Color names */ +{ + IDS_COLOR_BLACK "Negro" + IDS_COLOR_MAROON "Marr髇" + IDS_COLOR_GREEN "Verde" + IDS_COLOR_OLIVE "Oliva" + IDS_COLOR_NAVY "Azul marino" + IDS_COLOR_PURPLE "Morado" + IDS_COLOR_TEAL "Teal" + IDS_COLOR_GRAY "Gris" + IDS_COLOR_SILVER "Plateado" + IDS_COLOR_RED "Rojo" + IDS_COLOR_LIME "Lima" + IDS_COLOR_YELLOW "Amarillo" + IDS_COLOR_BLUE "Azul" + IDS_COLOR_FUCHSIA "Fucsia" + IDS_COLOR_AQUA "Agua" + IDS_COLOR_WHITE "Blanco" } diff --git a/reactos/lib/comdlg32/cdlg_Pt.rc b/reactos/lib/comdlg32/cdlg_Pt.rc index 4db99f67042..661c6132cb8 100644 --- a/reactos/lib/comdlg32/cdlg_Pt.rc +++ b/reactos/lib/comdlg32/cdlg_Pt.rc @@ -124,7 +124,7 @@ FONT 8, "Helv" LTEXT "&Fonte:",1088 ,6,3,40,9 COMBOBOX 1136 ,6,13,94,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE - LTEXT "&Estilo da Fonte:",1089 ,108,3,44,9 + LTEXT "&Estilo da Fonte:",1089 ,108,3,50,9 COMBOBOX 1137,108,13,64,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE LTEXT "&Tamanho:",1090,179,3,30,9 @@ -140,7 +140,7 @@ FONT 8, "Helv" LTEXT "&Cor:", 1091 ,6,110,30,9 COMBOBOX 1139,6,120,84,100,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Amostra",grp2,98,72,120,36,WS_GROUP + GROUPBOX "Exemplo",grp2,98,72,120,36,WS_GROUP CTEXT "AaBbYyZz",stc5,103,80,109,24,SS_NOPREFIX | NOT WS_VISIBLE LTEXT "Scr&ipt (translate):",stc7 ,98,114,80,9 COMBOBOX cmb5,98,124,120,10,CBS_DROPDOWNLIST |CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | @@ -340,7 +340,7 @@ FONT 8, "Helv" LTEXT "&Nome do arquivo:",IDC_FILENAMESTATIC,5,112,48,16, SS_NOTIFY EDITTEXT IDC_FILENAME,54,111,155,12,ES_AUTOHSCROLL - LTEXT "Arquivos do &tipo",IDC_FILETYPESTATIC,5,131,48,16, SS_NOTIFY + LTEXT "Arquivos do &tipo:",IDC_FILETYPESTATIC,5,131,48,16, SS_NOTIFY COMBOBOX IDC_FILETYPE,54,129,155,100,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP CONTROL "Abrir como &somente-leitura",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,148,74,10 diff --git a/reactos/lib/comdlg32/filedlg.c b/reactos/lib/comdlg32/filedlg.c index 8049ad26d45..b4d33ad4afe 100644 --- a/reactos/lib/comdlg32/filedlg.c +++ b/reactos/lib/comdlg32/filedlg.c @@ -2366,9 +2366,9 @@ static HRESULT FILEDLG95_LOOKIN_Init(HWND hwndCombo) } IEnumIDList_Release(lpeRoot); } + IShellFolder_Release(psfRoot); } - IShellFolder_Release(psfRoot); COMDLG32_SHFree(pidlDrives); return NOERROR; } diff --git a/reactos/lib/comdlg32/winehq2ros.patch b/reactos/lib/comdlg32/winehq2ros.patch index bf2a3115379..d05ddbbfd30 100644 --- a/reactos/lib/comdlg32/winehq2ros.patch +++ b/reactos/lib/comdlg32/winehq2ros.patch @@ -1,35 +1,10 @@ -Index: filetitle.c -=================================================================== -RCS file: /home/wine/wine/dlls/commdlg/filetitle.c,v -retrieving revision 1.15 -diff -u -r1.15 filetitle.c ---- filetitle.c 5 Sep 2003 23:08:42 -0000 1.15 -+++ filetitle.c 11 Mar 2004 21:21:49 -0000 -@@ -40,7 +40,7 @@ - * GetFileTitleA (COMDLG32.@) - * - */ --short WINAPI GetFileTitleA(LPCSTR lpFile, LPSTR lpTitle, UINT cbBuf) -+short WINAPI GetFileTitleA(LPCSTR lpFile, LPSTR lpTitle, WORD cbBuf) - { - int ret; - UNICODE_STRING strWFile; -@@ -60,7 +60,7 @@ - * GetFileTitleW (COMDLG32.@) - * - */ --short WINAPI GetFileTitleW(LPCWSTR lpFile, LPWSTR lpTitle, UINT cbBuf) -+short WINAPI GetFileTitleW(LPCWSTR lpFile, LPWSTR lpTitle, WORD cbBuf) - { - int i, len; - static const WCHAR brkpoint[] = {'*','[',']',0}; Index: printdlg.c =================================================================== RCS file: /home/wine/wine/dlls/commdlg/printdlg.c,v retrieving revision 1.74 diff -u -r1.74 printdlg.c --- printdlg.c 9 Jan 2004 05:10:35 -0000 1.74 -+++ printdlg.c 11 Mar 2004 21:21:50 -0000 ++++ printdlg.c 15 Apr 2004 08:51:04 -0000 @@ -341,7 +341,7 @@ lpdm->dmCollate = (IsDlgButtonChecked(hDlg, chx2) == BST_CHECKED); From b8549e32fa8259683a45dd90100f320806300e73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Thu, 15 Apr 2004 09:28:04 +0000 Subject: [PATCH 0898/1463] Sync to Wine-20040408: Juan Lang - implement loading network providers - implement enumeration functions - some improved error checking and A->W conversion svn path=/trunk/; revision=9149 --- reactos/include/wine/npapi.h | 203 ++++ reactos/include/wine/unicode.h | 1 + reactos/lib/mpr/Makefile.in | 8 +- reactos/lib/mpr/mpr.rc | 24 + reactos/lib/mpr/mpr_En.rc | 26 + reactos/lib/mpr/mpr_main.c | 16 + reactos/lib/mpr/mprres.h | 23 + reactos/lib/mpr/version.rc | 29 + reactos/lib/mpr/winehq2ros.patch | 14 +- reactos/lib/mpr/wnet.c | 1581 ++++++++++++++++++++++++++++-- reactos/lib/mpr/wnetpriv.h | 27 + 11 files changed, 1859 insertions(+), 93 deletions(-) create mode 100644 reactos/include/wine/npapi.h create mode 100644 reactos/lib/mpr/mpr.rc create mode 100644 reactos/lib/mpr/mpr_En.rc create mode 100644 reactos/lib/mpr/mprres.h create mode 100644 reactos/lib/mpr/version.rc create mode 100644 reactos/lib/mpr/wnetpriv.h diff --git a/reactos/include/wine/npapi.h b/reactos/include/wine/npapi.h new file mode 100644 index 00000000000..d0cdcc0b810 --- /dev/null +++ b/reactos/include/wine/npapi.h @@ -0,0 +1,203 @@ +/* + * Copyright (C) 2004 Juan Lang + * + * 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_NPAPI_H__ +#define __WINE_NPAPI_H__ + +/* capabilities */ +#define WNNC_SPEC_VERSION 0x00000001 +#define WNNC_SPEC_VERSION51 0x00050001 +#define WNNC_NET_TYPE 0x00000002 +#define WNNC_NET_NONE 0x00000000 + +#define WNNC_DRIVER_VERSION 0x00000003 + +#define WNNC_USER 0x00000004 +#define WNNC_USR_GETUSER 0x00000001 + +#define WNNC_CONNECTION 0x00000006 +#define WNNC_CON_ADDCONNECTION 0x00000001 +#define WNNC_CON_CANCELCONNECTION 0x00000002 +#define WNNC_CON_GETCONNECTIONS 0x00000004 +#define WNNC_CON_ADDCONNECTION3 0x00000008 + +#define WNNC_DIALOG 0x00000008 +#define WNNC_DLG_DEVICEMODE 0x00000001 +#define WNNC_DLG_PROPERTYDIALOG 0x00000020 +#define WNNC_DLG_SEARCHDIALOG 0x00000040 +#define WNNC_DLG_FORMATNETWORKNAME 0x00000080 + +#define WNNC_ADMIN 0x00000009 +#define WNNC_ADM_GETDIRECTORYTYPE 0x00000001 +#define WNNC_ADM_DIRECTORYNOTIFY 0x00000002 + +#define WNNC_ENUMERATION 0x0000000b +#define WNNC_ENUM_GLOBAL 0x00000001 +#define WNNC_ENUM_LOCAL 0x00000002 + +#define WNNC_START 0x0000000c +#define WNNC_WAIT_FOR_START 0x00000001 + +typedef DWORD APIENTRY (*PF_NPGetCaps)(DWORD ndex); + +/* get user */ +typedef DWORD APIENTRY (*PF_NPGetUser)(LPWSTR lpName, LPWSTR lpUserName, + LPDWORD lpnBufferLen); + +/* enumeration-related */ +typedef DWORD APIENTRY (*PF_NPOpenEnum)(DWORD dwScope, DWORD dwType, DWORD dwUsage, + LPNETRESOURCEW lpNetResource, LPHANDLE lphEnum); +typedef DWORD APIENTRY (*PF_NPEnumResource)(HANDLE hEnum, LPDWORD lpcCount, + LPVOID lpBuffer, LPDWORD lpBufferSize); +typedef DWORD APIENTRY (*PF_NPCloseEnum)(HANDLE hEnum); + +/* connection-related */ +typedef DWORD APIENTRY (*PF_NPAddConnection)(LPNETRESOURCEW lpNetResource, + LPWSTR lpPassword, LPWSTR lpUserName); +typedef DWORD APIENTRY (*PF_NPAddConnection3)(HWND hwndOwner, + LPNETRESOURCEW lpNetResource, LPWSTR lpPassword, LPWSTR lpUserName, + DWORD dwFlags); +typedef DWORD APIENTRY (*PF_NPCancelConnection)(LPWSTR lpName, BOOL fForce); +typedef DWORD APIENTRY (*PF_NPGetConnection)(LPWSTR lpLocalName, + LPWSTR lpRemoteName, LPDWORD lpnBufferLen); + +/* network name manipulation */ +typedef DWORD APIENTRY (*PF_NPGetUniversalName)(LPWSTR lpLocalPath, + DWORD dwInfoLevel, LPVOID lpBuffer, LPDWORD lpnBufferSize); +typedef DWORD APIENTRY (*PF_NPFormatNetworkName)(LPWSTR lpRemoteName, + LPWSTR lpFormattedName, LPDWORD lpnLength, DWORD dwFlags, + DWORD dwAveCharPerLine); + +/* dialogs */ +typedef DWORD APIENTRY (*PF_NPDeviceMode)(HWND hParent); + +/* search dialog */ +#define WNSRCH_REFRESH_FIRST_LEVEL 0x00000001 + +typedef DWORD APIENTRY (*PF_NPSearchDialog)(HWND hwndParent, + LPNETRESOURCEW lpNetResource, LPVOID lpBuffer, DWORD cbBuffer, + LPDWORD lpnFlags); + +/* property dialog */ + +#define WNTYPE_DRIVE 1 +#define WNTYPE_FILE 2 +#define WNTYPE_PRINTER 3 +#define WNTYPE_COMM 4 + +#define WNPS_FILE 0 +#define WNPS_DIR 1 +#define WNPS_MULT 2 + +typedef DWORD APIENTRY (*PF_NPGetPropertyText)(DWORD iButton, DWORD nPropSel, + LPWSTR lpName, LPWSTR lpButtonName, DWORD nButtonNameLen, DWORD nType); + +typedef DWORD APIENTRY (*PF_NPPropertyDialog)(HWND hwndParent, DWORD iButtonDlg, + DWORD nPropSel, LPWSTR lpFileName, DWORD nType); + +/* admin */ +#define WNDT_NORMAL 0 +#define WNDT_NETWORK 1 + +#define WNDN_MKDIR 1 +#define WNDN_RMDIR 2 +#define WNDN_MVDIR 3 + +typedef DWORD APIENTRY (*PF_NPGetDirectoryType)(LPWSTR lpName, LPINT lpType, + BOOL bFlushCache); +typedef DWORD APIENTRY (*PF_NPDirectoryNotify)(HWND hwnd, LPWSTR lpDir, + DWORD dwOper); + +/* permission editor dialogs */ +#define WNPERMC_PERM 0x00000001 +#define WNPERMC_AUDIT 0x00000002 +#define WNPERMC_OWNER 0x00000004 + +typedef DWORD APIENTRY (*PF_NPFMXGetPermCaps)(LPWSTR lpDriveName); + +#define WNPERM_DLG_PERM 0 +#define WNPERM_DLG_AUDIT 1 +#define WNPERM_DLG_OWNER 2 + +typedef DWORD APIENTRY (*PF_NPFMXEditPerm)(LPWSTR lpDriveName, HWND hwndFMX, + DWORD nDialogType); + +typedef DWORD APIENTRY (*PF_NPFMXGetPermHelp)(LPWSTR lpDriveName, + DWORD nDialogType, BOOL fDirectory, LPVOID lpFileNameBuffer, + LPDWORD lpBufferSize, LPDWORD lpnHelpContext); + +VOID WINAPI WNetSetLastErrorA(DWORD err, LPSTR lpError, LPSTR lpProviders); +VOID WINAPI WNetSetLastErrorW(DWORD err, LPWSTR lpError, LPWSTR lpProviders); +#define WNetSetLastError WINELIB_NAME_AW(WNetSetLastError) + +/* provider classes */ +#define WN_NETWORK_CLASS 0x00000001 +#define WN_CREDENTIAL_CLASS 0x00000002 +#define WN_PRIMARY_AUTHENT_CLASS 0x00000004 +#define WN_SERVICE_CLASS 0x00000008 + +#define WN_VALID_LOGON_ACCOUNT 0x00000001 +#define WN_NT_PASSWORD_CHANGED 0x00000002 + +/* notifications */ +typedef DWORD APIENTRY (*PF_NPLogonNotify)(PLUID lpLogonId, + LPCWSTR lpAuthentInfoType, LPVOID lpAuthentInfo, + LPCWSTR lpPreviousAuthentInfoType, LPVOID lpPreviousAuthentInfo, + LPWSTR lpStationName, LPVOID StationHandle, LPWSTR *lpLogonScript); +typedef DWORD APIENTRY (*PF_NPPasswordChangeNotify)(LPCWSTR lpAuthentInfoType, + LPVOID lpAuthentInfo, LPCWSTR lpPreviousAuthentInfoType, + LPVOID lpPreviousAuthentInfo, LPWSTR lpStationName, LPVOID StationHandle, + DWORD dwChangeInfo); + +#define NOTIFY_PRE 0x00000001 +#define NOTIFY_POST 0x00000002 + +typedef struct _NOTIFYINFO +{ + DWORD dwNotifyStatus; + DWORD dwOperationStatus; + LPVOID lpContext; +} NOTIFYINFO, *LPNOTIFYINFO; + +/* FIXME: NetResource is declared as a NETRESOURCE in psdk, not a NETRESOURCEW, + * but how can the type change in a service provider? Defaulting to wide-char + * for consistency with the rest of the api. + */ +typedef struct _NOTIFYADD +{ + HWND hwndOwner; + NETRESOURCEW NetResource; + DWORD dwAddFlags; +} NOTIFYADD, *LPNOTIFYADD; + +/* FIXME: lpName and lpProvider are declared as LPTSTRs in psdk, but again + * for consistency with rest of api defaulting to LPWSTRs. + */ +typedef struct _NOTIFYCANCEL +{ + LPWSTR lpName; + LPWSTR lpProvider; + DWORD dwFlags; + BOOL fForce; +} NOTIFYCANCEL, *LPNOTIFYCANCEL; + +typedef DWORD APIENTRY (*PF_AddConnectNotify)(LPNOTIFYINFO lpNotifyInfo, + LPNOTIFYADD lpAddInfo); +typedef DWORD APIENTRY (*PF_CancelConnectNotify)(LPNOTIFYINFO lpNotifyInfo, + LPNOTIFYADD lpAddInfo); + +#endif /* ndef __WINE_NPAPI_H__ */ diff --git a/reactos/include/wine/unicode.h b/reactos/include/wine/unicode.h index b65d94d23b9..abf9983c43c 100644 --- a/reactos/include/wine/unicode.h +++ b/reactos/include/wine/unicode.h @@ -68,6 +68,7 @@ union cptable #define strlwrW(s) _wcslwr((wchar_t *)(s)) #define struprW(s) _wcsupr((wchar_t *)(s)) #define sprintfW wsprintfW +#define snprintfW _snwprintf #ifndef WINE_UNICODE_API #define WINE_UNICODE_API __attribute__((dllimport)) diff --git a/reactos/lib/mpr/Makefile.in b/reactos/lib/mpr/Makefile.in index 283759e966c..96ab0eb6c61 100644 --- a/reactos/lib/mpr/Makefile.in +++ b/reactos/lib/mpr/Makefile.in @@ -3,7 +3,8 @@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = mpr.dll -IMPORTS = advapi32 kernel32 +IMPORTS = user32 advapi32 kernel32 +EXTRALIBS = $(LIBUNICODE) C_SRCS = \ auth.c \ @@ -13,6 +14,11 @@ C_SRCS = \ pwcache.c \ wnet.c +RC_SRCS = \ + mpr.rc \ + version.rc + + @MAKE_DLL_RULES@ ### Dependencies: diff --git a/reactos/lib/mpr/mpr.rc b/reactos/lib/mpr/mpr.rc new file mode 100644 index 00000000000..3c33a86b8ba --- /dev/null +++ b/reactos/lib/mpr/mpr.rc @@ -0,0 +1,24 @@ +/* + * MPR dll resources + * + * Copyright (C) 2004 Juan Lang + * + * 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 "windef.h" +#include "winbase.h" +#include "mprres.h" + +#include "mpr_En.rc" diff --git a/reactos/lib/mpr/mpr_En.rc b/reactos/lib/mpr/mpr_En.rc new file mode 100644 index 00000000000..225c516b5cf --- /dev/null +++ b/reactos/lib/mpr/mpr_En.rc @@ -0,0 +1,26 @@ +/* + * MPR dll resources + * + * Copyright (C) 2004 Juan Lang + * + * 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_ENGLISH, SUBLANG_DEFAULT + +STRINGTABLE DISCARDABLE +{ + IDS_ENTIRENETWORK "Entire Network" +} diff --git a/reactos/lib/mpr/mpr_main.c b/reactos/lib/mpr/mpr_main.c index 8f5f11dbe16..a155c94350f 100644 --- a/reactos/lib/mpr/mpr_main.c +++ b/reactos/lib/mpr/mpr_main.c @@ -24,6 +24,7 @@ #include "winbase.h" #include "winnetwk.h" #include "wine/debug.h" +#include "wnetpriv.h" WINE_DEFAULT_DEBUG_CHANNEL(mpr); @@ -79,3 +80,18 @@ DWORD WINAPI DllCanUnloadNow(void) FIXME("Stub\n"); return S_OK; } + +BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + switch (fdwReason) { + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls( hinstDLL ); + wnetInit(hinstDLL); + break; + + case DLL_PROCESS_DETACH: + wnetFree(); + break; + } + return TRUE; +} diff --git a/reactos/lib/mpr/mprres.h b/reactos/lib/mpr/mprres.h new file mode 100644 index 00000000000..c144e557b60 --- /dev/null +++ b/reactos/lib/mpr/mprres.h @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2004 Juan Lang + * + * 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_MPRRES_H__ +#define __WINE_MPRRES_H__ + +#define IDS_ENTIRENETWORK 1 + +#endif /* ndef __WINE_MPRRES_H__ */ diff --git a/reactos/lib/mpr/version.rc b/reactos/lib/mpr/version.rc new file mode 100644 index 00000000000..7f9d96bf125 --- /dev/null +++ b/reactos/lib/mpr/version.rc @@ -0,0 +1,29 @@ +/* + * MPR dll version resources + * + * Copyright (C) 2004 Juan Lang + * + * 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 WINE_FILEDESCRIPTION_STR "Wine Multiprotocol Router Library" +#define WINE_FILENAME_STR "mpr.dll" +#define WINE_FILEVERSION 5,0,2195,6611 +#define WINE_FILEVERSION_STR "5.00.2195.6611" +#define WINE_PRODUCTVERSION 5,0,2195,6611 +#define WINE_PRODUCTVERSION_STR "5.00.2195.6611" +#define WINE_PRODUCTNAME_STR "Wine" + +#include "wine/wine_common_ver.rc" diff --git a/reactos/lib/mpr/winehq2ros.patch b/reactos/lib/mpr/winehq2ros.patch index e70536c3e98..8660cae0efc 100644 --- a/reactos/lib/mpr/winehq2ros.patch +++ b/reactos/lib/mpr/winehq2ros.patch @@ -1,15 +1,15 @@ Index: wnet.c =================================================================== RCS file: /home/wine/wine/dlls/mpr/wnet.c,v -retrieving revision 1.14 -diff -u -r1.14 wnet.c ---- wnet.c 5 Sep 2003 23:08:36 -0000 1.14 -+++ wnet.c 1 Feb 2004 19:48:21 -0000 -@@ -30,6 +30,7 @@ - +retrieving revision 1.15 +diff -u -r1.15 wnet.c +--- wnet.c 5 Apr 2004 23:14:26 -0000 1.15 ++++ wnet.c 15 Apr 2004 09:36:14 -0000 +@@ -22,6 +22,7 @@ + #include #include "windef.h" #include "winbase.h" +#include "winuser.h" #include "winnls.h" #include "winnetwk.h" - #include "wine/debug.h" + #include "npapi.h" diff --git a/reactos/lib/mpr/wnet.c b/reactos/lib/mpr/wnet.c index 0615f127887..4fccc4d3b8c 100644 --- a/reactos/lib/mpr/wnet.c +++ b/reactos/lib/mpr/wnet.c @@ -2,6 +2,7 @@ * MPR WNet functions * * Copyright 1999 Ulrich Weigand + * Copyright 2004 Juan Lang * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,54 +19,795 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include "config.h" - -#include #include -#include -#include -#ifdef HAVE_UNISTD_H -# include -#endif - #include "windef.h" #include "winbase.h" #include "winuser.h" #include "winnls.h" #include "winnetwk.h" +#include "npapi.h" +#include "winreg.h" +#include "winuser.h" #include "wine/debug.h" +#include "wine/unicode.h" +#include "mprres.h" +#include "wnetpriv.h" WINE_DEFAULT_DEBUG_CHANNEL(mpr); +/* Data structures representing network service providers. Assumes only one + * thread creates them, and that they are constant for the life of the process + * (and therefore doesn't synchronize access). + * FIXME: only basic provider data and enumeration-related data are implemented + * so far, need to implement the rest too. + */ +typedef struct _WNetProvider +{ + HMODULE hLib; + PWSTR name; + PF_NPGetCaps getCaps; + DWORD dwSpecVersion; + DWORD dwNetType; + DWORD dwEnumScopes; + PF_NPOpenEnum openEnum; + PF_NPEnumResource enumResource; + PF_NPCloseEnum closeEnum; +} WNetProvider, *PWNetProvider; + +typedef struct _WNetProviderTable +{ + LPWSTR entireNetwork; + DWORD numAllocated; + DWORD numProviders; + WNetProvider table[1]; +} WNetProviderTable, *PWNetProviderTable; + +#define WNET_ENUMERATOR_TYPE_NULL 0 +#define WNET_ENUMERATOR_TYPE_GLOBAL 1 +#define WNET_ENUMERATOR_TYPE_PROVIDER 2 +#define WNET_ENUMERATOR_TYPE_CONTEXT 3 + +/* An WNet enumerator. Note that the type doesn't correspond to the scope of + * the enumeration; it represents one of the following types: + * - a 'null' enumeration, one that contains no members + * - a global enumeration, one that's executed across all providers + * - a provider-specific enumeration, one that's only executed by a single + * provider + * - a context enumeration. I know this contradicts what I just said about + * there being no correspondence between the scope and the type, but it's + * necessary for the special case that a "Entire Network" entry needs to + * be enumerated in an enumeration of the context scope. Thus an enumeration + * of the context scope results in a context type enumerator, which morphs + * into a global enumeration (so the enumeration continues across all + * providers). + */ +typedef struct _WNetEnumerator +{ + DWORD enumType; + DWORD providerIndex; + HANDLE handle; + BOOL providerDone; + DWORD dwScope; + DWORD dwType; + DWORD dwUsage; + LPNETRESOURCEW lpNet; +} WNetEnumerator, *PWNetEnumerator; + +#define BAD_PROVIDER_INDEX (DWORD)0xffffffff + +/* Returns an index (into the global WNetProviderTable) of the provider with + * the given name, or BAD_PROVIDER_INDEX if not found. + */ +static DWORD _findProviderIndexW(LPCWSTR lpProvider); + +PWNetProviderTable providerTable; + +/* + * Global provider table functions + */ + +static void _tryLoadProvider(PCWSTR provider) +{ + static const WCHAR servicePrefix[] = { 'S','y','s','t','e','m','\\', + 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', + 'S','e','r','v','i','c','e','s','\\',0 }; + static const WCHAR serviceFmt[] = { '%','s','%','s','\\', + 'N','e','t','w','o','r','k','P','r','o','v','i','d','e','r',0 }; + WCHAR serviceName[MAX_PATH]; + HKEY hKey; + + TRACE("%s\n", debugstr_w(provider)); + snprintfW(serviceName, sizeof(serviceName) / sizeof(WCHAR), serviceFmt, + servicePrefix, provider); + serviceName[sizeof(serviceName) / sizeof(WCHAR) - 1] = '\0'; + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, serviceName, 0, KEY_READ, &hKey) == + ERROR_SUCCESS) + { + static const WCHAR szProviderPath[] = { 'P','r','o','v','i','d','e','r', + 'P','a','t','h',0 }; + WCHAR providerPath[MAX_PATH]; + DWORD type, size = sizeof(providerPath); + + if (RegQueryValueExW(hKey, szProviderPath, NULL, &type, + (LPBYTE)providerPath, &size) == ERROR_SUCCESS && type == REG_SZ) + { + static const WCHAR szProviderName[] = { 'N','a','m','e',0 }; + PWSTR name = NULL; + + size = 0; + RegQueryValueExW(hKey, szProviderName, NULL, NULL, NULL, &size); + if (size) + { + name = (PWSTR)HeapAlloc(GetProcessHeap(), 0, size); + if (RegQueryValueExW(hKey, szProviderName, NULL, &type, + (LPBYTE)name, &size) != ERROR_SUCCESS || type != REG_SZ) + { + HeapFree(GetProcessHeap(), 0, name); + name = NULL; + } + } + if (name) + { + HMODULE hLib = LoadLibraryW(providerPath); + + if (hLib) + { + PF_NPGetCaps getCaps = (PF_NPGetCaps)GetProcAddress(hLib, + "NPGetCaps"); + + TRACE("loaded lib %p\n", hLib); + if (getCaps) + { + PWNetProvider provider = + &providerTable->table[providerTable->numProviders]; + + provider->hLib = hLib; + provider->name = name; + TRACE("name is %s\n", debugstr_w(name)); + provider->getCaps = getCaps; + provider->dwSpecVersion = getCaps(WNNC_SPEC_VERSION); + provider->dwNetType = getCaps(WNNC_NET_TYPE); + TRACE("net type is 0x%08lx\n", provider->dwNetType); + provider->dwEnumScopes = getCaps(WNNC_ENUMERATION); + if (provider->dwEnumScopes) + { + TRACE("supports enumeration\n"); + provider->openEnum = (PF_NPOpenEnum) + GetProcAddress(hLib, "NPOpenEnum"); + TRACE("openEnum is %p\n", provider->openEnum); + provider->enumResource = (PF_NPEnumResource) + GetProcAddress(hLib, "NPEnumResource"); + TRACE("enumResource is %p\n", + provider->enumResource); + provider->closeEnum = (PF_NPCloseEnum) + GetProcAddress(hLib, "NPCloseEnum"); + TRACE("closeEnum is %p\n", provider->closeEnum); + if (!provider->openEnum || !provider->enumResource + || !provider->closeEnum) + { + provider->openEnum = NULL; + provider->enumResource = NULL; + provider->closeEnum = NULL; + provider->dwEnumScopes = 0; + WARN("Couldn't load enumeration functions\n"); + } + } + providerTable->numProviders++; + } + else + { + WARN("Provider %s didn't export NPGetCaps\n", + debugstr_w(provider)); + if (name) + HeapFree(GetProcessHeap(), 0, name); + FreeLibrary(hLib); + } + } + else + { + WARN("Couldn't load library %s for provider %s\n", + debugstr_w(providerPath), debugstr_w(provider)); + HeapFree(GetProcessHeap(), 0, name); + } + } + else + { + WARN("Couldn't get provider name for provider %s\n", + debugstr_w(provider)); + } + } + else + WARN("Couldn't open value %s\n", debugstr_w(szProviderPath)); + RegCloseKey(hKey); + } + else + WARN("Couldn't open service key for provider %s\n", + debugstr_w(provider)); +} + +void wnetInit(HINSTANCE hInstDll) +{ + static const WCHAR providerOrderKey[] = { 'S','y','s','t','e','m','\\', + 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', + 'C','o','n','t','r','o','l','\\', + 'N','e','t','w','o','r','k','P','r','o','v','i','d','e','r','\\', + 'O','r','d','e','r',0 }; + static const WCHAR providerOrder[] = { 'P','r','o','v','i','d','e','r', + 'O','r','d','e','r',0 }; + HKEY hKey; + + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, providerOrderKey, 0, KEY_READ, &hKey) + == ERROR_SUCCESS) + { + DWORD size = 0; + + RegQueryValueExW(hKey, providerOrder, NULL, NULL, NULL, &size); + if (size) + { + PWSTR providers = (PWSTR)HeapAlloc(GetProcessHeap(), 0, size); + + if (providers) + { + DWORD type; + + if (RegQueryValueExW(hKey, providerOrder, NULL, &type, + (LPBYTE)providers, &size) == ERROR_SUCCESS && type == REG_SZ) + { + PWSTR ptr; + DWORD numToAllocate; + + TRACE("provider order is %s\n", debugstr_w(providers)); + /* first count commas as a heuristic for how many to + * allocate space for */ + for (ptr = providers, numToAllocate = 1; ptr; ) + { + ptr = strchrW(ptr, ','); + if (ptr) + numToAllocate++; + } + providerTable = (PWNetProviderTable) + HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, + sizeof(WNetProviderTable) + + (numToAllocate - 1) * sizeof(WNetProvider)); + if (providerTable) + { + PWSTR ptrPrev; + int entireNetworkLen; + + entireNetworkLen = LoadStringW(hInstDll, + IDS_ENTIRENETWORK, NULL, 0); + providerTable->entireNetwork = (LPWSTR)HeapAlloc( + GetProcessHeap(), 0, (entireNetworkLen + 1) * + sizeof(WCHAR)); + if (providerTable->entireNetwork) + LoadStringW(hInstDll, IDS_ENTIRENETWORK, + providerTable->entireNetwork, + entireNetworkLen + 1); + providerTable->numAllocated = numToAllocate; + for (ptr = providers; ptr; ) + { + ptrPrev = ptr; + ptr = strchrW(ptr, ','); + if (ptr) + *ptr = '\0'; + _tryLoadProvider(ptrPrev); + } + } + } + HeapFree(GetProcessHeap(), 0, providers); + } + } + RegCloseKey(hKey); + } +} + +void wnetFree(void) +{ + if (providerTable) + { + DWORD i; + + for (i = 0; i < providerTable->numProviders; i++) + { + HeapFree(GetProcessHeap(), 0, providerTable->table[i].name); + FreeModule(providerTable->table[i].hLib); + } + if (providerTable->entireNetwork) + HeapFree(GetProcessHeap(), 0, providerTable->entireNetwork); + HeapFree(GetProcessHeap(), 0, providerTable); + providerTable = NULL; + } +} + +static DWORD _findProviderIndexW(LPCWSTR lpProvider) +{ + DWORD ret = BAD_PROVIDER_INDEX; + + if (providerTable && providerTable->numProviders) + { + DWORD i; + + for (i = 0; i < providerTable->numProviders && + ret == BAD_PROVIDER_INDEX; i++) + if (!strcmpW(lpProvider, providerTable->table[i].name)) + ret = i; + } + return ret; +} /* * Browsing Functions */ +static LPNETRESOURCEW _copyNetResourceForEnumW(LPNETRESOURCEW lpNet) +{ + LPNETRESOURCEW ret; + + if (lpNet) + { + ret = (LPNETRESOURCEW)HeapAlloc(GetProcessHeap(), 0, + sizeof(NETRESOURCEW)); + if (ret) + { + size_t len; + + memcpy(ret, lpNet, sizeof(ret)); + ret->lpLocalName = ret->lpComment = ret->lpProvider = NULL; + if (lpNet->lpRemoteName) + { + len = strlenW(lpNet->lpRemoteName) + 1; + ret->lpRemoteName = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, + len * sizeof(WCHAR)); + if (ret->lpRemoteName) + strcpyW(ret->lpRemoteName, lpNet->lpRemoteName); + } + } + } + else + ret = NULL; + return ret; +} + +static void _freeEnumNetResource(LPNETRESOURCEW lpNet) +{ + if (lpNet) + { + if (lpNet->lpRemoteName) + HeapFree(GetProcessHeap(), 0, lpNet->lpRemoteName); + HeapFree(GetProcessHeap(), 0, lpNet); + } +} + +static PWNetEnumerator _createNullEnumerator(void) +{ + PWNetEnumerator ret = (PWNetEnumerator)HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, sizeof(WNetEnumerator)); + + if (ret) + ret->enumType = WNET_ENUMERATOR_TYPE_NULL; + return ret; +} + +static PWNetEnumerator _createGlobalEnumeratorW(DWORD dwScope, DWORD dwType, + DWORD dwUsage, LPNETRESOURCEW lpNet) +{ + PWNetEnumerator ret = (PWNetEnumerator)HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, sizeof(WNetEnumerator)); + + if (ret) + { + ret->enumType = WNET_ENUMERATOR_TYPE_GLOBAL; + ret->dwScope = dwScope; + ret->dwType = dwType; + ret->dwUsage = dwUsage; + ret->lpNet = _copyNetResourceForEnumW(lpNet); + } + return ret; +} + +static PWNetEnumerator _createProviderEnumerator(DWORD dwScope, DWORD dwType, + DWORD dwUsage, DWORD index, HANDLE handle) +{ + PWNetEnumerator ret; + + if (!providerTable || index >= providerTable->numProviders) + ret = NULL; + else + { + ret = (PWNetEnumerator)HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, sizeof(WNetEnumerator)); + if (ret) + { + ret->enumType = WNET_ENUMERATOR_TYPE_PROVIDER; + ret->providerIndex = index; + ret->dwScope = dwScope; + ret->dwType = dwType; + ret->dwUsage = dwUsage; + ret->handle = handle; + } + } + return ret; +} + +static PWNetEnumerator _createContextEnumerator(DWORD dwScope, DWORD dwType, + DWORD dwUsage) +{ + PWNetEnumerator ret = (PWNetEnumerator)HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, sizeof(WNetEnumerator)); + + if (ret) + { + ret->enumType = WNET_ENUMERATOR_TYPE_CONTEXT; + ret->dwScope = dwScope; + ret->dwType = dwType; + ret->dwUsage = dwUsage; + } + return ret; +} + +/* Thunks the array of wide-string LPNETRESOURCEs lpNetArrayIn into buffer + * lpBuffer, with size *lpBufferSize. lpNetArrayIn contains *lpcCount entries + * to start. On return, *lpcCount reflects the number thunked into lpBuffer. + * Returns WN_SUCCESS on success (all of lpNetArrayIn thunked), WN_MORE_DATA + * if not all members of the array could be thunked, and something else on + * failure. + */ +static DWORD _thunkNetResourceArrayWToA(const LPNETRESOURCEW lpNetArrayIn, + LPDWORD lpcCount, LPVOID lpBuffer, LPDWORD lpBufferSize) +{ + DWORD i, numToThunk, totalBytes, ret; + LPSTR strNext; + + if (!lpNetArrayIn) + return WN_BAD_POINTER; + if (!lpcCount) + return WN_BAD_POINTER; + if (*lpcCount == -1) + return WN_BAD_VALUE; + if (!lpBuffer) + return WN_BAD_POINTER; + if (!lpBufferSize) + return WN_BAD_POINTER; + + for (i = 0, numToThunk = 0, totalBytes = 0; i < *lpcCount; i++) + { + LPNETRESOURCEW lpNet = lpNetArrayIn + i; + + totalBytes += sizeof(NETRESOURCEA); + if (lpNet->lpLocalName) + totalBytes += WideCharToMultiByte(CP_ACP, 0, lpNet->lpLocalName, + -1, NULL, 0, NULL, NULL); + if (lpNet->lpRemoteName) + totalBytes += WideCharToMultiByte(CP_ACP, 0, lpNet->lpRemoteName, + -1, NULL, 0, NULL, NULL); + if (lpNet->lpComment) + totalBytes += WideCharToMultiByte(CP_ACP, 0, lpNet->lpComment, + -1, NULL, 0, NULL, NULL); + if (lpNet->lpProvider) + totalBytes += WideCharToMultiByte(CP_ACP, 0, lpNet->lpProvider, + -1, NULL, 0, NULL, NULL); + if (totalBytes < *lpBufferSize) + numToThunk = i + 1; + } + strNext = (LPSTR)((LPBYTE)lpBuffer + numToThunk * sizeof(NETRESOURCEA)); + for (i = 0; i < numToThunk; i++) + { + LPNETRESOURCEA lpNetOut = (LPNETRESOURCEA)lpBuffer + i; + LPNETRESOURCEW lpNetIn = lpNetArrayIn + i; + + memcpy(lpNetOut, lpNetIn, sizeof(NETRESOURCEA)); + /* lie about string lengths, we already verified how many + * we have space for above + */ + if (lpNetIn->lpLocalName) + { + lpNetOut->lpLocalName = strNext; + strNext += WideCharToMultiByte(CP_ACP, 0, lpNetIn->lpLocalName, -1, + lpNetOut->lpLocalName, *lpBufferSize, NULL, NULL); + } + if (lpNetIn->lpRemoteName) + { + lpNetOut->lpRemoteName = strNext; + strNext += WideCharToMultiByte(CP_ACP, 0, lpNetIn->lpRemoteName, -1, + lpNetOut->lpRemoteName, *lpBufferSize, NULL, NULL); + } + if (lpNetIn->lpComment) + { + lpNetOut->lpComment = strNext; + strNext += WideCharToMultiByte(CP_ACP, 0, lpNetIn->lpComment, -1, + lpNetOut->lpComment, *lpBufferSize, NULL, NULL); + } + if (lpNetIn->lpProvider) + { + lpNetOut->lpProvider = strNext; + strNext += WideCharToMultiByte(CP_ACP, 0, lpNetIn->lpProvider, -1, + lpNetOut->lpProvider, *lpBufferSize, NULL, NULL); + } + } + ret = numToThunk < *lpcCount ? WN_MORE_DATA : WN_SUCCESS; + TRACE("numToThunk is %ld, *lpcCount is %ld, returning %ld\n", numToThunk, + *lpcCount, ret); + return ret; +} + +/* Thunks the array of multibyte-string LPNETRESOURCEs lpNetArrayIn into buffer + * lpBuffer, with size *lpBufferSize. lpNetArrayIn contains *lpcCount entries + * to start. On return, *lpcCount reflects the number thunked into lpBuffer. + * Returns WN_SUCCESS on success (all of lpNetArrayIn thunked), WN_MORE_DATA + * if not all members of the array could be thunked, and something else on + * failure. + */ +static DWORD _thunkNetResourceArrayAToW(const LPNETRESOURCEA lpNetArrayIn, + LPDWORD lpcCount, LPVOID lpBuffer, LPDWORD lpBufferSize) +{ + DWORD i, numToThunk, totalBytes, ret; + LPWSTR strNext; + + if (!lpNetArrayIn) + return WN_BAD_POINTER; + if (!lpcCount) + return WN_BAD_POINTER; + if (*lpcCount == -1) + return WN_BAD_VALUE; + if (!lpBuffer) + return WN_BAD_POINTER; + if (!lpBufferSize) + return WN_BAD_POINTER; + + for (i = 0, numToThunk = 0, totalBytes = 0; i < *lpcCount; i++) + { + LPNETRESOURCEA lpNet = lpNetArrayIn + i; + + totalBytes += sizeof(NETRESOURCEW); + if (lpNet->lpLocalName) + totalBytes += MultiByteToWideChar(CP_ACP, 0, lpNet->lpLocalName, + -1, NULL, 0) * sizeof(WCHAR); + if (lpNet->lpRemoteName) + totalBytes += MultiByteToWideChar(CP_ACP, 0, lpNet->lpRemoteName, + -1, NULL, 0) * sizeof(WCHAR); + if (lpNet->lpComment) + totalBytes += MultiByteToWideChar(CP_ACP, 0, lpNet->lpComment, + -1, NULL, 0) * sizeof(WCHAR); + if (lpNet->lpProvider) + totalBytes += MultiByteToWideChar(CP_ACP, 0, lpNet->lpProvider, + -1, NULL, 0) * sizeof(WCHAR); + if (totalBytes < *lpBufferSize) + numToThunk = i + 1; + } + strNext = (LPWSTR)((LPBYTE)lpBuffer + numToThunk * sizeof(NETRESOURCEW)); + for (i = 0; i < numToThunk; i++) + { + LPNETRESOURCEW lpNetOut = (LPNETRESOURCEW)lpBuffer + i; + LPNETRESOURCEA lpNetIn = lpNetArrayIn + i; + + memcpy(lpNetOut, lpNetIn, sizeof(NETRESOURCEW)); + /* lie about string lengths, we already verified how many + * we have space for above + */ + if (lpNetIn->lpLocalName) + { + lpNetOut->lpLocalName = strNext; + strNext += MultiByteToWideChar(CP_ACP, 0, lpNetIn->lpLocalName, + -1, lpNetOut->lpLocalName, *lpBufferSize); + } + if (lpNetIn->lpRemoteName) + { + lpNetOut->lpRemoteName = strNext; + strNext += MultiByteToWideChar(CP_ACP, 0, lpNetIn->lpRemoteName, + -1, lpNetOut->lpRemoteName, *lpBufferSize); + } + if (lpNetIn->lpComment) + { + lpNetOut->lpComment = strNext; + strNext += MultiByteToWideChar(CP_ACP, 0, lpNetIn->lpComment, + -1, lpNetOut->lpComment, *lpBufferSize); + } + if (lpNetIn->lpProvider) + { + lpNetOut->lpProvider = strNext; + strNext += MultiByteToWideChar(CP_ACP, 0, lpNetIn->lpProvider, + -1, lpNetOut->lpProvider, *lpBufferSize); + } + } + ret = numToThunk < *lpcCount ? WN_MORE_DATA : WN_SUCCESS; + TRACE("numToThunk is %ld, *lpcCount is %ld, returning %ld\n", numToThunk, + *lpcCount, ret); + return ret; +} + /********************************************************************* * WNetOpenEnumA [MPR.@] + * + * See comments for WNetOpenEnumW. */ DWORD WINAPI WNetOpenEnumA( DWORD dwScope, DWORD dwType, DWORD dwUsage, LPNETRESOURCEA lpNet, LPHANDLE lphEnum ) { - FIXME( "(%08lX, %08lX, %08lX, %p, %p): stub\n", + DWORD ret; + + TRACE( "(%08lX, %08lX, %08lX, %p, %p)\n", dwScope, dwType, dwUsage, lpNet, lphEnum ); - SetLastError(WN_NO_NETWORK); - return WN_NO_NETWORK; + if (!lphEnum) + ret = WN_BAD_POINTER; + else if (!providerTable || providerTable->numProviders == 0) + ret = WN_NO_NETWORK; + else + { + if (lpNet) + { + LPNETRESOURCEW lpNetWide = NULL; + BYTE buf[1024]; + DWORD size = sizeof(buf), count = 1; + BOOL allocated = FALSE; + + ret = _thunkNetResourceArrayAToW(lpNet, &count, buf, &size); + if (ret == WN_MORE_DATA) + { + lpNetWide = (LPNETRESOURCEW)HeapAlloc(GetProcessHeap(), 0, + size); + if (lpNetWide) + { + ret = _thunkNetResourceArrayAToW(lpNet, &count, lpNetWide, + &size); + allocated = TRUE; + } + else + ret = WN_OUT_OF_MEMORY; + } + else if (ret == WN_SUCCESS) + lpNetWide = (LPNETRESOURCEW)buf; + if (ret == WN_SUCCESS) + ret = WNetOpenEnumW(dwScope, dwType, dwUsage, lpNetWide, + lphEnum); + if (allocated && lpNetWide) + HeapFree(GetProcessHeap(), 0, lpNetWide); + } + else + ret = WNetOpenEnumW(dwScope, dwType, dwUsage, NULL, lphEnum); + } + if (ret) + SetLastError(ret); + TRACE("Returning %ld\n", ret); + return ret; } /********************************************************************* * WNetOpenEnumW [MPR.@] + * + * Network enumeration has way too many parameters, so I'm not positive I got + * them right. What I've got so far: + * + * - If the scope is RESOURCE_GLOBALNET, and no LPNETRESOURCE is passed, + * all the network providers should be enumerated. + * + * - If the scope is RESOURCE_GLOBALNET, and LPNETRESOURCE is passed, and + * and neither the LPNETRESOURCE's lpRemoteName nor the LPNETRESOURCE's + * lpProvider is set, all the network providers should be enumerated. + * (This means the enumeration is a list of network providers, not that the + * enumeration is passed on to the providers.) + * + * - If the scope is RESOURCE_GLOBALNET, and LPNETRESOURCE is passed, and the + * resource matches the "Entire Network" resource (no remote name, no + * provider, comment is the "Entire Network" string), a RESOURCE_GLOBALNET + * enumeration is done on every network provider. + * + * - If the scope is RESOURCE_GLOBALNET, and LPNETRESOURCE is passed, and + * the LPNETRESOURCE's lpProvider is set, enumeration will be passed through + * only to the given network provider. + * + * - If the scope is RESOURCE_GLOBALNET, and LPNETRESOURCE is passed, and + * no lpProvider is set, enumeration will be tried on every network provider, + * in the order in which they're loaded. + * + * - The LPNETRESOURCE should be disregarded for scopes besides + * RESOURCE_GLOBALNET. MSDN states that lpNet must be NULL if dwScope is not + * RESOURCE_GLOBALNET, but Windows doesn't return an error if it isn't NULL. + * + * - If the scope is RESOURCE_CONTEXT, MS includes an "Entire Network" net + * resource in the enumerated list, as well as any machines in your + * workgroup. The machines in your workgroup come from doing a + * RESOURCE_CONTEXT enumeration of every Network Provider. */ DWORD WINAPI WNetOpenEnumW( DWORD dwScope, DWORD dwType, DWORD dwUsage, LPNETRESOURCEW lpNet, LPHANDLE lphEnum ) { - FIXME( "(%08lX, %08lX, %08lX, %p, %p): stub\n", + DWORD ret; + + TRACE( "(%08lX, %08lX, %08lX, %p, %p)\n", dwScope, dwType, dwUsage, lpNet, lphEnum ); - SetLastError(WN_NO_NETWORK); - return WN_NO_NETWORK; + if (!lphEnum) + ret = WN_BAD_POINTER; + else if (!providerTable || providerTable->numProviders == 0) + ret = WN_NO_NETWORK; + else + { + switch (dwScope) + { + case RESOURCE_GLOBALNET: + if (lpNet) + { + if (lpNet->lpProvider) + { + DWORD index = _findProviderIndexW(lpNet->lpProvider); + + if (index != BAD_PROVIDER_INDEX) + { + if (providerTable->table[index].openEnum && + providerTable->table[index].dwEnumScopes & dwScope) + { + HANDLE handle; + + ret = providerTable->table[index].openEnum( + dwScope, dwType, dwUsage, lpNet, &handle); + if (ret == WN_SUCCESS) + { + *lphEnum = + (HANDLE)_createProviderEnumerator( + dwScope, dwType, dwUsage, index, handle); + ret = *lphEnum ? WN_SUCCESS : + WN_OUT_OF_MEMORY; + } + } + else + ret = WN_NOT_SUPPORTED; + } + else + ret = WN_BAD_PROVIDER; + } + else if (lpNet->lpRemoteName) + { + *lphEnum = (HANDLE)_createGlobalEnumeratorW(dwScope, + dwType, dwUsage, lpNet); + ret = *lphEnum ? WN_SUCCESS : WN_OUT_OF_MEMORY; + } + else + { + if (lpNet->lpComment && !strcmpW(lpNet->lpComment, + providerTable->entireNetwork)) + { + /* comment matches the "Entire Network", enumerate + * global scope of every provider + */ + *lphEnum = (HANDLE)_createGlobalEnumeratorW(dwScope, + dwType, dwUsage, lpNet); + } + else + { + /* this is the same as not having passed lpNet */ + *lphEnum = (HANDLE)_createGlobalEnumeratorW(dwScope, + dwType, dwUsage, NULL); + } + ret = *lphEnum ? WN_SUCCESS : WN_OUT_OF_MEMORY; + } + } + else + { + *lphEnum = (HANDLE)_createGlobalEnumeratorW(dwScope, dwType, + dwUsage, lpNet); + ret = *lphEnum ? WN_SUCCESS : WN_OUT_OF_MEMORY; + } + break; + case RESOURCE_CONTEXT: + *lphEnum = (HANDLE)_createContextEnumerator(dwScope, dwType, + dwUsage); + ret = *lphEnum ? WN_SUCCESS : WN_OUT_OF_MEMORY; + break; + case RESOURCE_REMEMBERED: + case RESOURCE_CONNECTED: + *lphEnum = (HANDLE)_createNullEnumerator(); + ret = *lphEnum ? WN_SUCCESS : WN_OUT_OF_MEMORY; + break; + default: + WARN("unknown scope 0x%08lx\n", dwScope); + ret = WN_BAD_VALUE; + } + } + if (ret) + SetLastError(ret); + TRACE("Returning %ld\n", ret); + return ret; } /********************************************************************* @@ -74,11 +816,364 @@ DWORD WINAPI WNetOpenEnumW( DWORD dwScope, DWORD dwType, DWORD dwUsage, DWORD WINAPI WNetEnumResourceA( HANDLE hEnum, LPDWORD lpcCount, LPVOID lpBuffer, LPDWORD lpBufferSize ) { - FIXME( "(%p, %p, %p, %p): stub\n", - hEnum, lpcCount, lpBuffer, lpBufferSize ); + DWORD ret; - SetLastError(WN_NO_NETWORK); - return WN_NO_NETWORK; + TRACE( "(%p, %p, %p, %p)\n", hEnum, lpcCount, lpBuffer, lpBufferSize ); + + if (!hEnum) + ret = WN_BAD_POINTER; + else if (!lpcCount) + ret = WN_BAD_POINTER; + if (!lpBuffer) + ret = WN_BAD_POINTER; + else if (!lpBufferSize) + ret = WN_BAD_POINTER; + else if (*lpBufferSize < sizeof(NETRESOURCEA)) + { + *lpBufferSize = sizeof(NETRESOURCEA); + ret = WN_MORE_DATA; + } + else + { + DWORD localCount = *lpcCount, localSize = *lpBufferSize; + LPVOID localBuffer = HeapAlloc(GetProcessHeap(), 0, localSize); + + if (localBuffer) + { + ret = WNetEnumResourceW(hEnum, &localCount, localBuffer, + &localSize); + if (ret == WN_SUCCESS || (ret == WN_MORE_DATA && localCount != -1)) + { + /* FIXME: this isn't necessarily going to work in the case of + * WN_MORE_DATA, because our enumerator may have moved on to + * the next provider. MSDN states that a large (16KB) buffer + * size is the appropriate usage of this function, so + * hopefully it won't be an issue. + */ + ret = _thunkNetResourceArrayWToA((LPNETRESOURCEW)localBuffer, + &localCount, lpBuffer, lpBufferSize); + *lpcCount = localCount; + } + HeapFree(GetProcessHeap(), 0, localBuffer); + } + else + ret = WN_OUT_OF_MEMORY; + } + if (ret) + SetLastError(ret); + TRACE("Returning %ld\n", ret); + return ret; +} + +static DWORD _countProviderBytesW(PWNetProvider provider) +{ + DWORD ret; + + if (provider) + { + ret = sizeof(NETRESOURCEW); + ret += 2 * (strlenW(provider->name) + 1) * sizeof(WCHAR); + } + else + ret = 0; + return ret; +} + +static DWORD _enumerateProvidersW(PWNetEnumerator enumerator, LPDWORD lpcCount, + LPVOID lpBuffer, LPDWORD lpBufferSize) +{ + DWORD ret; + + if (!enumerator) + return WN_BAD_POINTER; + if (enumerator->enumType != WNET_ENUMERATOR_TYPE_GLOBAL) + return WN_BAD_VALUE; + if (!lpcCount) + return WN_BAD_POINTER; + if (!lpBuffer) + return WN_BAD_POINTER; + if (!lpBufferSize) + return WN_BAD_POINTER; + if (*lpBufferSize < sizeof(NETRESOURCEA)) + return WN_MORE_DATA; + + if (!providerTable || enumerator->providerIndex >= + providerTable->numProviders) + ret = WN_NO_MORE_ENTRIES; + else + { + DWORD bytes = 0, count = 0, countLimit, i; + LPNETRESOURCEW resource; + LPWSTR strNext; + + countLimit = *lpcCount == -1 ? + providerTable->numProviders - enumerator->providerIndex : *lpcCount; + while (count < countLimit && bytes < *lpBufferSize) + { + DWORD bytesNext = _countProviderBytesW( + &providerTable->table[count + enumerator->providerIndex]); + + if (bytes + bytesNext < *lpBufferSize) + { + bytes += bytesNext; + count++; + } + } + strNext = (LPWSTR)((LPBYTE)lpBuffer + count * sizeof(NETRESOURCEW)); + for (i = 0, resource = (LPNETRESOURCEW)lpBuffer; i < count; + i++, resource++) + { + resource->dwScope = RESOURCE_GLOBALNET; + resource->dwType = RESOURCETYPE_ANY; + resource->dwDisplayType = RESOURCEDISPLAYTYPE_NETWORK; + resource->dwUsage = RESOURCEUSAGE_CONTAINER | + RESOURCEUSAGE_RESERVED; + resource->lpLocalName = NULL; + resource->lpRemoteName = strNext; + strcpyW(resource->lpRemoteName, + providerTable->table[i + enumerator->providerIndex].name); + strNext += strlenW(resource->lpRemoteName) + 1; + resource->lpComment = NULL; + resource->lpProvider = strNext; + strcpyW(resource->lpProvider, + providerTable->table[i + enumerator->providerIndex].name); + strNext += strlenW(resource->lpProvider) + 1; + } + enumerator->providerIndex += count; + *lpcCount = count; + ret = count > 0 ? WN_SUCCESS : WN_MORE_DATA; + } + TRACE("Returning %ld\n", ret); + return ret; +} + +/* Advances the enumerator (assumed to be a global enumerator) to the next + * provider that supports the enumeration scope passed to WNetOpenEnum. Does + * not open a handle with the next provider. + * If the existing handle is NULL, may leave the enumerator unchanged, since + * the current provider may support the desired scope. + * If the existing handle is not NULL, closes it before moving on. + * Returns WN_SUCCESS on success, WN_NO_MORE_ENTRIES if there is no available + * provider, and another error on failure. + */ +static DWORD _globalEnumeratorAdvance(PWNetEnumerator enumerator) +{ + if (!enumerator) + return WN_BAD_POINTER; + if (enumerator->enumType != WNET_ENUMERATOR_TYPE_GLOBAL) + return WN_BAD_VALUE; + if (!providerTable || enumerator->providerIndex >= + providerTable->numProviders) + return WN_NO_MORE_ENTRIES; + + if (enumerator->providerDone) + { + enumerator->providerDone = FALSE; + if (enumerator->handle) + { + providerTable->table[enumerator->providerIndex].closeEnum( + enumerator->handle); + enumerator->handle = NULL; + enumerator->providerIndex++; + } + for (; enumerator->providerIndex < providerTable->numProviders && + !(enumerator->dwScope & providerTable->table + [enumerator->providerIndex].dwEnumScopes); + enumerator->providerIndex++) + ; + } + return enumerator->providerIndex < providerTable->numProviders ? + WN_SUCCESS : WN_NO_MORE_ENTRIES; +} + +/* "Passes through" call to the next provider that supports the enumeration + * type. + * FIXME: if one call to a provider's enumerator succeeds while there's still + * space in lpBuffer, I don't call to the next provider. The caller may not + * expect that it should call EnumResourceW again with a return value of + * WN_SUCCESS (depending what *lpcCount was to begin with). That means strings + * may have to be moved around a bit, ick. + */ +static DWORD _enumerateGlobalPassthroughW(PWNetEnumerator enumerator, + LPDWORD lpcCount, LPVOID lpBuffer, LPDWORD lpBufferSize) +{ + DWORD ret; + + if (!enumerator) + return WN_BAD_POINTER; + if (enumerator->enumType != WNET_ENUMERATOR_TYPE_GLOBAL) + return WN_BAD_VALUE; + if (!lpcCount) + return WN_BAD_POINTER; + if (!lpBuffer) + return WN_BAD_POINTER; + if (!lpBufferSize) + return WN_BAD_POINTER; + if (*lpBufferSize < sizeof(NETRESOURCEW)) + return WN_MORE_DATA; + + ret = _globalEnumeratorAdvance(enumerator); + if (ret == WN_SUCCESS) + { + ret = providerTable->table[enumerator->providerIndex]. + openEnum(enumerator->dwScope, enumerator->dwType, + enumerator->dwUsage, enumerator->lpNet, + &enumerator->handle); + if (ret == WN_SUCCESS) + { + ret = providerTable->table[enumerator->providerIndex]. + enumResource(enumerator->handle, lpcCount, lpBuffer, + lpBufferSize); + if (ret != WN_MORE_DATA) + enumerator->providerDone = TRUE; + } + } + TRACE("Returning %ld\n", ret); + return ret; +} + +static DWORD _enumerateGlobalW(PWNetEnumerator enumerator, LPDWORD lpcCount, + LPVOID lpBuffer, LPDWORD lpBufferSize) +{ + DWORD ret; + + if (!enumerator) + return WN_BAD_POINTER; + if (enumerator->enumType != WNET_ENUMERATOR_TYPE_GLOBAL) + return WN_BAD_VALUE; + if (!lpcCount) + return WN_BAD_POINTER; + if (!lpBuffer) + return WN_BAD_POINTER; + if (!lpBufferSize) + return WN_BAD_POINTER; + if (*lpBufferSize < sizeof(NETRESOURCEW)) + return WN_MORE_DATA; + if (!providerTable) + return WN_NO_NETWORK; + + switch (enumerator->dwScope) + { + case RESOURCE_GLOBALNET: + if (enumerator->lpNet) + ret = _enumerateGlobalPassthroughW(enumerator, lpcCount, + lpBuffer, lpBufferSize); + else + ret = _enumerateProvidersW(enumerator, lpcCount, lpBuffer, + lpBufferSize); + break; + case RESOURCE_CONTEXT: + ret = _enumerateGlobalPassthroughW(enumerator, lpcCount, lpBuffer, + lpBufferSize); + break; + default: + WARN("unexpected scope 0x%08lx\n", enumerator->dwScope); + ret = WN_NO_MORE_ENTRIES; + } + TRACE("Returning %ld\n", ret); + return ret; +} + +static DWORD _enumerateProviderW(PWNetEnumerator enumerator, LPDWORD lpcCount, + LPVOID lpBuffer, LPDWORD lpBufferSize) +{ + if (!enumerator) + return WN_BAD_POINTER; + if (enumerator->enumType != WNET_ENUMERATOR_TYPE_PROVIDER) + return WN_BAD_VALUE; + if (!enumerator->handle) + return WN_BAD_VALUE; + if (!lpcCount) + return WN_BAD_POINTER; + if (!lpBuffer) + return WN_BAD_POINTER; + if (!lpBufferSize) + return WN_BAD_POINTER; + if (!providerTable) + return WN_NO_NETWORK; + if (enumerator->providerIndex >= providerTable->numProviders) + return WN_NO_MORE_ENTRIES; + if (!providerTable->table[enumerator->providerIndex].enumResource) + return WN_BAD_VALUE; + return providerTable->table[enumerator->providerIndex].enumResource( + enumerator->handle, lpcCount, lpBuffer, lpBufferSize); +} + +static DWORD _enumerateContextW(PWNetEnumerator enumerator, LPDWORD lpcCount, + LPVOID lpBuffer, LPDWORD lpBufferSize) +{ + DWORD ret; + size_t cchEntireNetworkLen, bytesNeeded; + + if (!enumerator) + return WN_BAD_POINTER; + if (enumerator->enumType != WNET_ENUMERATOR_TYPE_CONTEXT) + return WN_BAD_VALUE; + if (!lpcCount) + return WN_BAD_POINTER; + if (!lpBuffer) + return WN_BAD_POINTER; + if (!lpBufferSize) + return WN_BAD_POINTER; + if (!providerTable) + return WN_NO_NETWORK; + + cchEntireNetworkLen = strlenW(providerTable->entireNetwork) + 1; + bytesNeeded = sizeof(NETRESOURCEW) + cchEntireNetworkLen * sizeof(WCHAR); + if (*lpBufferSize < bytesNeeded) + { + *lpBufferSize = bytesNeeded; + ret = WN_MORE_DATA; + } + else + { + LPNETRESOURCEW lpNet = (LPNETRESOURCEW)lpBuffer; + + lpNet->dwScope = RESOURCE_GLOBALNET; + lpNet->dwType = enumerator->dwType; + lpNet->dwDisplayType = RESOURCEDISPLAYTYPE_ROOT; + lpNet->dwUsage = RESOURCEUSAGE_CONTAINER; + lpNet->lpLocalName = NULL; + lpNet->lpRemoteName = NULL; + lpNet->lpProvider = NULL; + /* odd, but correct: put comment at end of buffer, so it won't get + * overwritten by subsequent calls to a provider's enumResource + */ + lpNet->lpComment = (LPWSTR)((LPBYTE)lpBuffer + *lpBufferSize - + (cchEntireNetworkLen * sizeof(WCHAR))); + strcpyW(lpNet->lpComment, providerTable->entireNetwork); + ret = WN_SUCCESS; + } + if (ret == WN_SUCCESS) + { + DWORD bufferSize = *lpBufferSize - bytesNeeded; + + /* "Entire Network" entry enumerated--morph this into a global + * enumerator. enumerator->lpNet continues to be NULL, since it has + * no meaning when the scope isn't RESOURCE_GLOBALNET. + */ + enumerator->enumType = WNET_ENUMERATOR_TYPE_GLOBAL; + ret = _enumerateGlobalW(enumerator, lpcCount, + (LPBYTE)lpBuffer + bytesNeeded, &bufferSize); + if (ret == WN_SUCCESS) + { + /* reflect the fact that we already enumerated "Entire Network" */ + lpcCount++; + *lpBufferSize = bufferSize + bytesNeeded; + } + else + { + /* the provider enumeration failed, but we already succeeded in + * enumerating "Entire Network"--leave type as global to allow a + * retry, but indicate success with a count of one. + */ + ret = WN_SUCCESS; + *lpcCount = 1; + *lpBufferSize = bytesNeeded; + } + } + TRACE("Returning %ld\n", ret); + return ret; } /********************************************************************* @@ -87,11 +1182,53 @@ DWORD WINAPI WNetEnumResourceA( HANDLE hEnum, LPDWORD lpcCount, DWORD WINAPI WNetEnumResourceW( HANDLE hEnum, LPDWORD lpcCount, LPVOID lpBuffer, LPDWORD lpBufferSize ) { - FIXME( "(%p, %p, %p, %p): stub\n", - hEnum, lpcCount, lpBuffer, lpBufferSize ); + DWORD ret; - SetLastError(WN_NO_NETWORK); - return WN_NO_NETWORK; + TRACE( "(%p, %p, %p, %p)\n", hEnum, lpcCount, lpBuffer, lpBufferSize ); + + if (!hEnum) + ret = WN_BAD_POINTER; + else if (!lpcCount) + ret = WN_BAD_POINTER; + else if (!lpBuffer) + ret = WN_BAD_POINTER; + else if (!lpBufferSize) + ret = WN_BAD_POINTER; + else if (*lpBufferSize < sizeof(NETRESOURCEW)) + { + *lpBufferSize = sizeof(NETRESOURCEW); + ret = WN_MORE_DATA; + } + else + { + PWNetEnumerator enumerator = (PWNetEnumerator)hEnum; + + switch (enumerator->enumType) + { + case WNET_ENUMERATOR_TYPE_NULL: + ret = WN_NO_MORE_ENTRIES; + break; + case WNET_ENUMERATOR_TYPE_GLOBAL: + ret = _enumerateGlobalW(enumerator, lpcCount, lpBuffer, + lpBufferSize); + break; + case WNET_ENUMERATOR_TYPE_PROVIDER: + ret = _enumerateProviderW(enumerator, lpcCount, lpBuffer, + lpBufferSize); + break; + case WNET_ENUMERATOR_TYPE_CONTEXT: + ret = _enumerateContextW(enumerator, lpcCount, lpBuffer, + lpBufferSize); + break; + default: + WARN("bogus enumerator type!\n"); + ret = WN_NO_NETWORK; + } + } + if (ret) + SetLastError(ret); + TRACE("Returning %ld\n", ret); + return ret; } /********************************************************************* @@ -99,10 +1236,45 @@ DWORD WINAPI WNetEnumResourceW( HANDLE hEnum, LPDWORD lpcCount, */ DWORD WINAPI WNetCloseEnum( HANDLE hEnum ) { - FIXME( "(%p): stub\n", hEnum ); + DWORD ret; - SetLastError(WN_NO_NETWORK); - return WN_NO_NETWORK; + TRACE( "(%p)\n", hEnum ); + + if (hEnum) + { + PWNetEnumerator enumerator = (PWNetEnumerator)hEnum; + + switch (enumerator->enumType) + { + case WNET_ENUMERATOR_TYPE_NULL: + ret = WN_SUCCESS; + break; + case WNET_ENUMERATOR_TYPE_GLOBAL: + if (enumerator->lpNet) + _freeEnumNetResource(enumerator->lpNet); + if (enumerator->handle) + providerTable->table[enumerator->providerIndex]. + closeEnum(enumerator->handle); + ret = WN_SUCCESS; + break; + case WNET_ENUMERATOR_TYPE_PROVIDER: + if (enumerator->handle) + providerTable->table[enumerator->providerIndex]. + closeEnum(enumerator->handle); + ret = WN_SUCCESS; + break; + default: + WARN("bogus enumerator type!\n"); + ret = WN_BAD_HANDLE; + } + HeapFree(GetProcessHeap(), 0, hEnum); + } + else + ret = WN_BAD_HANDLE; + if (ret) + SetLastError(ret); + TRACE("Returning %ld\n", ret); + return ret; } /********************************************************************* @@ -350,64 +1522,155 @@ DWORD WINAPI WNetRestoreConnectionW( HWND hwndOwner, LPWSTR lpszDevice ) * - WN_MORE_DATA buffer isn't big enough * - WN_SUCCESS success (net path in buffer) * + * FIXME: need to test return values under different errors */ DWORD WINAPI WNetGetConnectionA( LPCSTR lpLocalName, LPSTR lpRemoteName, LPDWORD lpBufferSize ) { - char label[40]; + DWORD ret; - TRACE( "local %s\n", lpLocalName ); - if (lpLocalName[1] == ':') + if (!lpLocalName) + ret = WN_BAD_POINTER; + else if (!lpRemoteName) + ret = WN_BAD_POINTER; + else if (!lpBufferSize) + ret = WN_BAD_POINTER; + else { - switch(GetDriveTypeA(lpLocalName)) + int len = MultiByteToWideChar(CP_ACP, 0, lpLocalName, -1, NULL, 0); + + if (len) { - case DRIVE_REMOTE: - if (!GetVolumeInformationA( lpLocalName, label, sizeof(label), - NULL, NULL, NULL, NULL, 0 )) label[0] = 0; - if (strlen(label) + 1 > *lpBufferSize) + PWSTR wideLocalName = (PWSTR)HeapAlloc(GetProcessHeap(), 0, len); + + if (wideLocalName) { - *lpBufferSize = strlen(label) + 1; - return WN_MORE_DATA; + WCHAR wideRemoteStatic[MAX_PATH]; + DWORD wideRemoteSize = sizeof(wideRemoteStatic) / sizeof(WCHAR); + + /* try once without memory allocation */ + ret = WNetGetConnectionW(wideLocalName, wideRemoteStatic, + &wideRemoteSize); + if (ret == WN_SUCCESS) + { + int len = WideCharToMultiByte(CP_ACP, 0, wideRemoteStatic, + -1, NULL, 0, NULL, NULL); + + if (len <= *lpBufferSize) + { + WideCharToMultiByte(CP_ACP, 0, wideRemoteStatic, -1, + lpRemoteName, *lpBufferSize, NULL, NULL); + ret = WN_SUCCESS; + } + else + { + *lpBufferSize = len; + ret = WN_MORE_DATA; + } + } + else if (ret == WN_MORE_DATA) + { + PWSTR wideRemote = (PWSTR)HeapAlloc(GetProcessHeap(), 0, + wideRemoteSize * sizeof(WCHAR)); + + if (wideRemote) + { + ret = WNetGetConnectionW(wideLocalName, wideRemote, + &wideRemoteSize); + if (ret == WN_SUCCESS) + { + if (len <= *lpBufferSize) + { + WideCharToMultiByte(CP_ACP, 0, wideRemoteStatic, + -1, lpRemoteName, *lpBufferSize, NULL, NULL); + ret = WN_SUCCESS; + } + else + { + *lpBufferSize = len; + ret = WN_MORE_DATA; + } + } + HeapFree(GetProcessHeap(), 0, wideRemote); + } + else + ret = WN_OUT_OF_MEMORY; + } + HeapFree(GetProcessHeap(), 0, wideLocalName); } - strcpy( lpRemoteName, label ); - *lpBufferSize = strlen(lpRemoteName) + 1; - return WN_SUCCESS; - case DRIVE_REMOVABLE: - case DRIVE_FIXED: - case DRIVE_CDROM: - TRACE("file is local\n"); - return WN_NOT_CONNECTED; - default: - return WN_BAD_LOCALNAME; + else + ret = WN_OUT_OF_MEMORY; } + else + ret = WN_BAD_LOCALNAME; } - return WN_BAD_LOCALNAME; + if (ret) + SetLastError(ret); + TRACE("Returning %ld\n", ret); + return ret; } /************************************************************************** * WNetGetConnectionW [MPR.@] + * + * FIXME: need to test return values under different errors */ DWORD WINAPI WNetGetConnectionW( LPCWSTR lpLocalName, LPWSTR lpRemoteName, LPDWORD lpBufferSize ) { - CHAR buf[200]; - DWORD ret, x = sizeof(buf); - INT len = WideCharToMultiByte( CP_ACP, 0, lpLocalName, -1, NULL, 0, NULL, NULL ); - LPSTR lnA = HeapAlloc( GetProcessHeap(), 0, len ); + DWORD ret; - WideCharToMultiByte( CP_ACP, 0, lpLocalName, -1, lnA, len, NULL, NULL ); - ret = WNetGetConnectionA( lnA, buf, &x ); - HeapFree( GetProcessHeap(), 0, lnA ); - if (ret == WN_SUCCESS) + TRACE("(%s, %p, %p)\n", debugstr_w(lpLocalName), lpRemoteName, + lpBufferSize); + + if (!lpLocalName) + ret = WN_BAD_POINTER; + else if (!lpRemoteName) + ret = WN_BAD_POINTER; + else if (!lpBufferSize) + ret = WN_BAD_POINTER; + else if (!lpLocalName[0]) + ret = WN_BAD_LOCALNAME; + else { - x = MultiByteToWideChar( CP_ACP, 0, buf, -1, NULL, 0 ); - if (x > *lpBufferSize) + WCHAR label[40]; + + if (lpLocalName[1] == ':') { - *lpBufferSize = x; - return WN_MORE_DATA; + switch(GetDriveTypeW(lpLocalName)) + { + case DRIVE_REMOTE: + if (!GetVolumeInformationW( lpLocalName, label, sizeof(label), + NULL, NULL, NULL, NULL, 0 )) + label[0] = 0; + if (strlenW(label) + 1 > *lpBufferSize) + { + *lpBufferSize = strlenW(label) + 1; + ret = WN_MORE_DATA; + } + else + { + strcpyW( lpRemoteName, label ); + *lpBufferSize = strlenW(lpRemoteName) + 1; + ret = WN_SUCCESS; + } + break; + case DRIVE_REMOVABLE: + case DRIVE_FIXED: + case DRIVE_CDROM: + TRACE("file is local\n"); + ret = WN_NOT_CONNECTED; + break; + default: + ret = WN_BAD_LOCALNAME; + } } - *lpBufferSize = MultiByteToWideChar( CP_ACP, 0, buf, -1, lpRemoteName, *lpBufferSize ); + else + ret = WN_BAD_LOCALNAME; } + if (ret) + SetLastError(ret); + TRACE("Returning %ld\n", ret); return ret; } @@ -480,14 +1743,13 @@ DWORD WINAPI WNetGetUserA( LPCSTR lpName, LPSTR lpUserID, LPDWORD lpBufferSize ) /***************************************************************** * WNetGetUserW [MPR.@] + * + * FIXME: we should not return ourselves, but the owner of the drive lpName */ DWORD WINAPI WNetGetUserW( LPCWSTR lpName, LPWSTR lpUserID, LPDWORD lpBufferSize ) { - FIXME( "(%s, %p, %p): mostly stub\n", - debugstr_w(lpName), lpUserID, lpBufferSize ); - - SetLastError(WN_NO_NETWORK); - return WN_NO_NETWORK; + if (GetUserNameW( lpUserID, lpBufferSize )) return WN_SUCCESS; + return GetLastError(); } /********************************************************************* @@ -498,7 +1760,7 @@ DWORD WINAPI WNetConnectionDialog( HWND hwnd, DWORD dwType ) FIXME( "(%p, %08lX): stub\n", hwnd, dwType ); SetLastError(WN_NO_NETWORK); - return ERROR_NO_NETWORK; + return WN_NO_NETWORK; } /********************************************************************* @@ -509,7 +1771,7 @@ DWORD WINAPI WNetConnectionDialog1A( LPCONNECTDLGSTRUCTA lpConnDlgStruct ) FIXME( "(%p): stub\n", lpConnDlgStruct ); SetLastError(WN_NO_NETWORK); - return ERROR_NO_NETWORK; + return WN_NO_NETWORK; } /********************************************************************* @@ -520,7 +1782,7 @@ DWORD WINAPI WNetConnectionDialog1W( LPCONNECTDLGSTRUCTW lpConnDlgStruct ) FIXME( "(%p): stub\n", lpConnDlgStruct ); SetLastError(WN_NO_NETWORK); - return ERROR_NO_NETWORK; + return WN_NO_NETWORK; } /********************************************************************* @@ -531,7 +1793,7 @@ DWORD WINAPI WNetDisconnectDialog( HWND hwnd, DWORD dwType ) FIXME( "(%p, %08lX): stub\n", hwnd, dwType ); SetLastError(WN_NO_NETWORK); - return ERROR_NO_NETWORK; + return WN_NO_NETWORK; } /********************************************************************* @@ -542,7 +1804,7 @@ DWORD WINAPI WNetDisconnectDialog1A( LPDISCDLGSTRUCTA lpConnDlgStruct ) FIXME( "(%p): stub\n", lpConnDlgStruct ); SetLastError(WN_NO_NETWORK); - return ERROR_NO_NETWORK; + return WN_NO_NETWORK; } /********************************************************************* @@ -553,7 +1815,7 @@ DWORD WINAPI WNetDisconnectDialog1W( LPDISCDLGSTRUCTW lpConnDlgStruct ) FIXME( "(%p): stub\n", lpConnDlgStruct ); SetLastError(WN_NO_NETWORK); - return ERROR_NO_NETWORK; + return WN_NO_NETWORK; } /********************************************************************* @@ -567,7 +1829,7 @@ DWORD WINAPI WNetGetLastErrorA( LPDWORD lpError, lpError, lpErrorBuf, nErrorBufSize, lpNameBuf, nNameBufSize ); SetLastError(WN_NO_NETWORK); - return ERROR_NO_NETWORK; + return WN_NO_NETWORK; } /********************************************************************* @@ -581,7 +1843,7 @@ DWORD WINAPI WNetGetLastErrorW( LPDWORD lpError, lpError, lpErrorBuf, nErrorBufSize, lpNameBuf, nNameBufSize ); SetLastError(WN_NO_NETWORK); - return ERROR_NO_NETWORK; + return WN_NO_NETWORK; } /********************************************************************* @@ -590,10 +1852,39 @@ DWORD WINAPI WNetGetLastErrorW( LPDWORD lpError, DWORD WINAPI WNetGetNetworkInformationA( LPCSTR lpProvider, LPNETINFOSTRUCT lpNetInfoStruct ) { - FIXME( "(%s, %p): stub\n", debugstr_a(lpProvider), lpNetInfoStruct ); + DWORD ret; - SetLastError(WN_NO_NETWORK); - return ERROR_NO_NETWORK; + TRACE( "(%s, %p)\n", debugstr_a(lpProvider), lpNetInfoStruct ); + + if (!lpProvider) + ret = WN_BAD_POINTER; + else + { + int len; + + len = MultiByteToWideChar(CP_ACP, 0, lpProvider, -1, NULL, 0); + if (len) + { + LPWSTR wideProvider = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, + len * sizeof(WCHAR)); + + if (wideProvider) + { + MultiByteToWideChar(CP_ACP, 0, lpProvider, -1, wideProvider, + len); + ret = WNetGetNetworkInformationW(wideProvider, lpNetInfoStruct); + HeapFree(GetProcessHeap(), 0, wideProvider); + } + else + ret = WN_OUT_OF_MEMORY; + } + else + ret = GetLastError(); + } + if (ret) + SetLastError(ret); + TRACE("Returning %ld\n", ret); + return ret; } /********************************************************************* @@ -602,10 +1893,46 @@ DWORD WINAPI WNetGetNetworkInformationA( LPCSTR lpProvider, DWORD WINAPI WNetGetNetworkInformationW( LPCWSTR lpProvider, LPNETINFOSTRUCT lpNetInfoStruct ) { - FIXME( "(%s, %p): stub\n", debugstr_w(lpProvider), lpNetInfoStruct ); + DWORD ret; - SetLastError(WN_NO_NETWORK); - return ERROR_NO_NETWORK; + TRACE( "(%s, %p)\n", debugstr_w(lpProvider), lpNetInfoStruct ); + + if (!lpProvider) + ret = WN_BAD_POINTER; + else if (!lpNetInfoStruct) + ret = WN_BAD_POINTER; + else if (lpNetInfoStruct->cbStructure < sizeof(NETINFOSTRUCT)) + ret = WN_BAD_VALUE; + else + { + if (providerTable && providerTable->numProviders) + { + DWORD providerIndex = _findProviderIndexW(lpProvider); + + if (providerIndex != BAD_PROVIDER_INDEX) + { + lpNetInfoStruct->cbStructure = sizeof(NETINFOSTRUCT); + lpNetInfoStruct->dwProviderVersion = + providerTable->table[providerIndex].dwSpecVersion; + lpNetInfoStruct->dwStatus = NO_ERROR; + lpNetInfoStruct->dwCharacteristics = 0; + lpNetInfoStruct->dwHandle = (ULONG_PTR)NULL; + lpNetInfoStruct->wNetType = + HIWORD(providerTable->table[providerIndex].dwNetType); + lpNetInfoStruct->dwPrinters = -1; + lpNetInfoStruct->dwDrives = -1; + ret = WN_SUCCESS; + } + else + ret = WN_BAD_PROVIDER; + } + else + ret = WN_NO_NETWORK; + } + if (ret) + SetLastError(ret); + TRACE("Returning %ld\n", ret); + return ret; } /***************************************************************** @@ -614,10 +1941,53 @@ DWORD WINAPI WNetGetNetworkInformationW( LPCWSTR lpProvider, DWORD WINAPI WNetGetProviderNameA( DWORD dwNetType, LPSTR lpProvider, LPDWORD lpBufferSize ) { - FIXME( "(%ld, %p, %p): stub\n", dwNetType, lpProvider, lpBufferSize ); + DWORD ret; - SetLastError(WN_NO_NETWORK); - return WN_NO_NETWORK; + TRACE("(0x%08lx, %s, %p)\n", dwNetType, debugstr_a(lpProvider), + lpBufferSize); + + if (!lpProvider) + ret = WN_BAD_POINTER; + else if (!lpBufferSize) + ret = WN_BAD_POINTER; + else + { + if (providerTable) + { + DWORD i; + + ret = WN_NO_NETWORK; + for (i = 0; i < providerTable->numProviders && + HIWORD(providerTable->table[i].dwNetType) != HIWORD(dwNetType); + i++) + ; + if (i < providerTable->numProviders) + { + DWORD sizeNeeded = WideCharToMultiByte(CP_ACP, 0, + providerTable->table[i].name, -1, NULL, 0, NULL, NULL); + + if (*lpBufferSize < sizeNeeded) + { + *lpBufferSize = sizeNeeded; + ret = WN_MORE_DATA; + } + else + { + WideCharToMultiByte(CP_ACP, 0, providerTable->table[i].name, + -1, lpProvider, *lpBufferSize, NULL, NULL); + ret = WN_SUCCESS; + /* FIXME: is *lpBufferSize set to the number of characters + * copied? */ + } + } + } + else + ret = WN_NO_NETWORK; + } + if (ret) + SetLastError(ret); + TRACE("Returning %ld\n", ret); + return ret; } /***************************************************************** @@ -626,8 +1996,49 @@ DWORD WINAPI WNetGetProviderNameA( DWORD dwNetType, DWORD WINAPI WNetGetProviderNameW( DWORD dwNetType, LPWSTR lpProvider, LPDWORD lpBufferSize ) { - FIXME( "(%ld, %p, %p): stub\n", dwNetType, lpProvider, lpBufferSize ); + DWORD ret; - SetLastError(WN_NO_NETWORK); - return WN_NO_NETWORK; + TRACE("(0x%08lx, %s, %p)\n", dwNetType, debugstr_w(lpProvider), + lpBufferSize); + + if (!lpProvider) + ret = WN_BAD_POINTER; + else if (!lpBufferSize) + ret = WN_BAD_POINTER; + else + { + if (providerTable) + { + DWORD i; + + ret = WN_NO_NETWORK; + for (i = 0; i < providerTable->numProviders && + HIWORD(providerTable->table[i].dwNetType) != HIWORD(dwNetType); + i++) + ; + if (i < providerTable->numProviders) + { + DWORD sizeNeeded = strlenW(providerTable->table[i].name) + 1; + + if (*lpBufferSize < sizeNeeded) + { + *lpBufferSize = sizeNeeded; + ret = WN_MORE_DATA; + } + else + { + strcpyW(lpProvider, providerTable->table[i].name); + ret = WN_SUCCESS; + /* FIXME: is *lpBufferSize set to the number of characters + * copied? */ + } + } + } + else + ret = WN_NO_NETWORK; + } + if (ret) + SetLastError(ret); + TRACE("Returning %ld\n", ret); + return ret; } diff --git a/reactos/lib/mpr/wnetpriv.h b/reactos/lib/mpr/wnetpriv.h new file mode 100644 index 00000000000..7a275de1445 --- /dev/null +++ b/reactos/lib/mpr/wnetpriv.h @@ -0,0 +1,27 @@ +/* + * WNet private definitions + * + * Copyright (C) 2004 Juan Lang + * + * 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 __WNET_PRIV_H__ +#define __WNET_PRIV_H__ + +void wnetInit(HINSTANCE hInstDll); +void wnetFree(void); + +#endif /* ndef __WNET_PRIV_H__ */ From 275120206280666f7a7c474fa3e05971ce1f3013 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Thu, 15 Apr 2004 11:44:03 +0000 Subject: [PATCH 0899/1463] Masahiro Taguchi - small windowbar sizing fix for WS_EX_TOOLWINDOW svn path=/trunk/; revision=9150 --- reactos/subsys/win32k/ntuser/metric.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/metric.c b/reactos/subsys/win32k/ntuser/metric.c index 1f7e4c55f5c..fb900857336 100644 --- a/reactos/subsys/win32k/ntuser/metric.c +++ b/reactos/subsys/win32k/ntuser/metric.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: metric.c,v 1.18 2004/02/04 01:26:34 rcampbell Exp $ +/* $Id: metric.c,v 1.19 2004/04/15 11:44:03 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -181,7 +181,7 @@ NtUserGetSystemMetrics(ULONG Index) case SM_CXSMSIZE: return(12); case SM_CYSMSIZE: - return(15); + return(14); case SM_CXVSCROLL: case SM_CYVSCROLL: return(16); @@ -192,7 +192,7 @@ NtUserGetSystemMetrics(ULONG Index) case SM_CYMENU: return(19); case SM_CYSMCAPTION: - return(16); + return(15); case SM_DBCSENABLED: case SM_DEBUG: case SM_MENUDROPALIGNMENT: From 1771d71894571f1a6f3539ce34e9c3f1154bd4db Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Thu, 15 Apr 2004 18:52:45 +0000 Subject: [PATCH 0900/1463] fix linking error svn path=/trunk/; revision=9151 --- reactos/lib/unicode/wine_unicode.def | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/unicode/wine_unicode.def b/reactos/lib/unicode/wine_unicode.def index c60334ddaf3..f1594d1aab2 100644 --- a/reactos/lib/unicode/wine_unicode.def +++ b/reactos/lib/unicode/wine_unicode.def @@ -1,7 +1,7 @@ LIBRARY libwine_unicode.dll EXPORTS - snprintfW + snprintfW=_snwprintf sprintfW strcmpiW strncmpiW From 8eca059c025b74b5a761433b9143acb8be3bd49f Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Thu, 15 Apr 2004 23:36:03 +0000 Subject: [PATCH 0901/1463] 1. move SendMessage calls out of the message queue processing code 2. fixed translation of coordinates calculation in different thread states (capturing, in menus, ...) 3. Proper implementation of Set/GetWindowText/Length() (as described in 4. speed improvements svn path=/trunk/; revision=9152 --- reactos/include/win32k/ntuser.h | 12 +- reactos/lib/user32/windows/defwnd.c | 9 +- reactos/lib/user32/windows/menu.c | 7 +- reactos/lib/user32/windows/nonclient.c | 3 +- reactos/lib/user32/windows/window.c | 135 ++++++++++++- reactos/subsys/win32k/include/msgqueue.h | 10 + reactos/subsys/win32k/ntuser/focus.c | 19 +- reactos/subsys/win32k/ntuser/message.c | 225 ++++++++++++++++++---- reactos/subsys/win32k/ntuser/misc.c | 31 +-- reactos/subsys/win32k/ntuser/msgqueue.c | 232 +++++++---------------- 10 files changed, 435 insertions(+), 248 deletions(-) diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index 8042f65e6ec..c8f711f7b9d 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -188,12 +188,12 @@ NtUserCallOneParam( #define TWOPARAM_ROUTINE_SETMENUBARHEIGHT 0x50 #define TWOPARAM_ROUTINE_SETMENUITEMRECT 0x51 #define TWOPARAM_ROUTINE_SETGUITHRDHANDLE 0x52 - #define TPR_SGTH_ACTIVE 0x01 - #define TPR_SGTH_FOCUS 0x02 - #define TPR_SGTH_CAPTURE 0x03 - #define TPR_SGTH_MENUOWNER 0x04 - #define TPR_SGTH_MOVESIZE 0x05 - #define TPR_SGTH_CARET 0x06 + #define MSQ_STATE_CAPTURE 0x1 + #define MSQ_STATE_ACTIVE 0x2 + #define MSQ_STATE_FOCUS 0x3 + #define MSQ_STATE_MENUOWNER 0x4 + #define MSQ_STATE_MOVESIZE 0x5 + #define MSQ_STATE_CARET 0x6 #define TWOPARAM_ROUTINE_ENABLEWINDOW 0x53 #define TWOPARAM_ROUTINE_UNKNOWN 0x54 #define TWOPARAM_ROUTINE_SHOWOWNEDPOPUPS 0x55 diff --git a/reactos/lib/user32/windows/defwnd.c b/reactos/lib/user32/windows/defwnd.c index d8cab1de28f..808a1e2bf4e 100644 --- a/reactos/lib/user32/windows/defwnd.c +++ b/reactos/lib/user32/windows/defwnd.c @@ -1,4 +1,4 @@ -/* $Id: defwnd.c,v 1.133 2004/04/13 16:48:44 weiden Exp $ +/* $Id: defwnd.c,v 1.134 2004/04/15 23:36:02 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -602,8 +602,9 @@ DefWndDoSizeMove(HWND hwnd, WORD wParam) { MapWindowPoints( hWndParent, 0, (LPPOINT)&mouseRect, 2 ); } - SendMessageA( hwnd, WM_ENTERSIZEMOVE, 0, 0 ); + SendMessageA( hwnd, WM_ENTERSIZEMOVE, 0, 0 ); + NtUserSetGUIThreadHandle(MSQ_STATE_MOVESIZE, hwnd); if (GetCapture() != hwnd) SetCapture( hwnd ); if (Style & WS_CHILD) @@ -746,7 +747,7 @@ DefWndDoSizeMove(HWND hwnd, WORD wParam) DeleteObject(DesktopRgn); } } - + NtUserSetGUIThreadHandle(MSQ_STATE_MOVESIZE, NULL); SendMessageA( hwnd, WM_EXITSIZEMOVE, 0, 0 ); SendMessageA( hwnd, WM_SETVISIBLE, !IsIconic(hwnd), 0L); @@ -1572,7 +1573,7 @@ DefWindowProcW(HWND hWnd, { if (wParam > 1) { - *((PWSTR)lParam) = '\0'; + *((PWSTR)lParam) = L'\0'; } return (LRESULT)NtUserInternalGetWindowText(hWnd, (PWSTR)lParam, wParam); } diff --git a/reactos/lib/user32/windows/menu.c b/reactos/lib/user32/windows/menu.c index 8d8e8940532..ba427631cfd 100644 --- a/reactos/lib/user32/windows/menu.c +++ b/reactos/lib/user32/windows/menu.c @@ -21,7 +21,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: menu.c,v 1.63 2004/04/09 21:01:02 navaraf Exp $ +/* $Id: menu.c,v 1.64 2004/04/15 23:36:02 weiden Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/menu.c @@ -2736,6 +2736,7 @@ MenuDoNextMenu(MTRACKER* Mt, UINT Vk) { Mt->OwnerWnd = NewWnd; SetCapture(Mt->OwnerWnd); + NtUserSetGUIThreadHandle(MSQ_STATE_MENUOWNER, Mt->OwnerWnd); } Mt->TopMenu = Mt->CurrentMenu = NewMenu; /* all subpopups are hidden */ @@ -3098,6 +3099,7 @@ MenuTrackMenu(HMENU Menu, UINT Flags, INT x, INT y, } SetCapture(Mt.OwnerWnd); + NtUserSetGUIThreadHandle(MSQ_STATE_MENUOWNER, Mt.OwnerWnd); while (! fEndMenu) { @@ -3382,7 +3384,8 @@ MenuTrackMenu(HMENU Menu, UINT Flags, INT x, INT y, Mt.TrackFlags &= ~TF_SKIPREMOVE; } } - + + NtUserSetGUIThreadHandle(MSQ_STATE_MENUOWNER, NULL); SetCapture(NULL); /* release the capture */ /* If dropdown is still painted and the close box is clicked on diff --git a/reactos/lib/user32/windows/nonclient.c b/reactos/lib/user32/windows/nonclient.c index 73fd48bc2a7..652511c66a6 100644 --- a/reactos/lib/user32/windows/nonclient.c +++ b/reactos/lib/user32/windows/nonclient.c @@ -865,7 +865,6 @@ DefWndDoButton(HWND hWnd, WPARAM wParam) GetMessageW(&Msg, 0, 0, 0); switch(Msg.message) { - case WM_NCLBUTTONUP: case WM_LBUTTONUP: if(InBtn) goto done; @@ -876,10 +875,10 @@ DefWndDoButton(HWND hWnd, WPARAM wParam) ReleaseDC(hWnd, WindowDC); return; } - case WM_NCMOUSEMOVE: case WM_MOUSEMOVE: if(HasBtn) { + ClientToScreen(hWnd, &Msg.pt); CurBtn = DefWndNCHitTest(hWnd, Msg.pt); if(InBtn != (CurBtn == OrigBtn)) { diff --git a/reactos/lib/user32/windows/window.c b/reactos/lib/user32/windows/window.c index 52eb7ba32ca..4a6a091189f 100644 --- a/reactos/lib/user32/windows/window.c +++ b/reactos/lib/user32/windows/window.c @@ -1,4 +1,4 @@ -/* $Id: window.c,v 1.111 2004/04/14 23:17:55 weiden Exp $ +/* $Id: window.c,v 1.112 2004/04/15 23:36:02 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -26,6 +26,8 @@ BOOL ControlsInitialized = FALSE; +LRESULT DefWndNCPaint(HWND hWnd, HRGN hRgn); + /* FUNCTIONS *****************************************************************/ @@ -975,6 +977,38 @@ GetWindowRect(HWND hWnd, int STDCALL GetWindowTextA(HWND hWnd, LPSTR lpString, int nMaxCount) { + DWORD ProcessId; + if(!NtUserGetWindowThreadProcessId(hWnd, &ProcessId)) + { + return 0; + } + + if(ProcessId != GetCurrentProcessId()) + { + /* do not send WM_GETTEXT messages to other processes */ + LPWSTR Buffer; + INT Length; + + if (nMaxCount > 1) + { + *((PWSTR)lpString) = '\0'; + } + Buffer = HeapAlloc(GetProcessHeap(), 0, nMaxCount * sizeof(WCHAR)); + if (!Buffer) + return FALSE; + Length = NtUserInternalGetWindowText(hWnd, Buffer, nMaxCount); + if (Length > 0 && nMaxCount > 0 && + !WideCharToMultiByte(CP_ACP, 0, Buffer, -1, + lpString, nMaxCount, NULL, NULL)) + { + lpString[0] = '\0'; + } + + HeapFree(GetProcessHeap(), 0, Buffer); + + return (LRESULT)Length; + } + return(SendMessageA(hWnd, WM_GETTEXT, nMaxCount, (LPARAM)lpString)); } @@ -985,7 +1019,19 @@ GetWindowTextA(HWND hWnd, LPSTR lpString, int nMaxCount) int STDCALL GetWindowTextLengthA(HWND hWnd) { - return(SendMessageA(hWnd, WM_GETTEXTLENGTH, 0, 0)); + DWORD ProcessId; + if(!NtUserGetWindowThreadProcessId(hWnd, &ProcessId)) + { + return 0; + } + + if(ProcessId == GetCurrentProcessId()) + { + return(SendMessageA(hWnd, WM_GETTEXTLENGTH, 0, 0)); + } + + /* do not send WM_GETTEXT messages to other processes */ + return (LRESULT)NtUserInternalGetWindowText(hWnd, NULL, 0); } @@ -995,7 +1041,19 @@ GetWindowTextLengthA(HWND hWnd) int STDCALL GetWindowTextLengthW(HWND hWnd) { - return(SendMessageW(hWnd, WM_GETTEXTLENGTH, 0, 0)); + DWORD ProcessId; + if(!NtUserGetWindowThreadProcessId(hWnd, &ProcessId)) + { + return 0; + } + + if(ProcessId == GetCurrentProcessId()) + { + return(SendMessageW(hWnd, WM_GETTEXTLENGTH, 0, 0)); + } + + /* do not send WM_GETTEXT messages to other processes */ + return (LRESULT)NtUserInternalGetWindowText(hWnd, NULL, 0); } @@ -1008,7 +1066,24 @@ GetWindowTextW( LPWSTR lpString, int nMaxCount) { - return(SendMessageW(hWnd, WM_GETTEXT, nMaxCount, (LPARAM)lpString)); + DWORD ProcessId; + if(!NtUserGetWindowThreadProcessId(hWnd, &ProcessId)) + { + return 0; + } + + if(ProcessId == GetCurrentProcessId()) + { + return(SendMessageW(hWnd, WM_GETTEXT, nMaxCount, (LPARAM)lpString)); + } + + /* do not send WM_GETTEXT messages to other processes */ + if (nMaxCount > 1) + { + *((PWSTR)lpString) = L'\0'; + } + + return (LRESULT)NtUserInternalGetWindowText(hWnd, (PWSTR)lpString, nMaxCount); } DWORD STDCALL @@ -1279,6 +1354,35 @@ BOOL STDCALL SetWindowTextA(HWND hWnd, LPCSTR lpString) { + DWORD ProcessId; + if(!NtUserGetWindowThreadProcessId(hWnd, &ProcessId)) + { + return FALSE; + } + + if(ProcessId != GetCurrentProcessId()) + { + /* do not send WM_GETTEXT messages to other processes */ + ANSI_STRING AnsiString; + UNICODE_STRING UnicodeString; + + if(lpString) + { + RtlInitAnsiString(&AnsiString, (LPSTR)lpString); + RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, TRUE); + NtUserDefSetText(hWnd, &UnicodeString); + RtlFreeUnicodeString(&UnicodeString); + } + else + NtUserDefSetText(hWnd, NULL); + + if ((GetWindowLongW(hWnd, GWL_STYLE) & WS_CAPTION) == WS_CAPTION) + { + DefWndNCPaint(hWnd, (HRGN)1); + } + return TRUE; + } + return SendMessageA(hWnd, WM_SETTEXT, 0, (LPARAM)lpString); } @@ -1290,6 +1394,29 @@ BOOL STDCALL SetWindowTextW(HWND hWnd, LPCWSTR lpString) { + DWORD ProcessId; + if(!NtUserGetWindowThreadProcessId(hWnd, &ProcessId)) + { + return FALSE; + } + + if(ProcessId != GetCurrentProcessId()) + { + /* do not send WM_GETTEXT messages to other processes */ + UNICODE_STRING UnicodeString; + + if(lpString) + RtlInitUnicodeString(&UnicodeString, (LPWSTR)lpString); + + NtUserDefSetText(hWnd, (lpString ? &UnicodeString : NULL)); + + if ((GetWindowLongW(hWnd, GWL_STYLE) & WS_CAPTION) == WS_CAPTION) + { + DefWndNCPaint(hWnd, (HRGN)1); + } + return TRUE; + } + return SendMessageW(hWnd, WM_SETTEXT, 0, (LPARAM)lpString); } diff --git a/reactos/subsys/win32k/include/msgqueue.h b/reactos/subsys/win32k/include/msgqueue.h index 9417b420fa0..47fea2ba92a 100644 --- a/reactos/subsys/win32k/include/msgqueue.h +++ b/reactos/subsys/win32k/include/msgqueue.h @@ -173,6 +173,10 @@ VOID FASTCALL MsqPostHotKeyMessage(PVOID Thread, HWND hWnd, WPARAM wParam, LPARAM lParam); VOID FASTCALL MsqInsertSystemMessage(MSG* Msg, BOOL RemMouseMoveMsg); +BOOL FASTCALL +MsqIsDblClk(LPMSG Msg, BOOL Remove); +HWND FASTCALL +MsqSetStateWindow(PUSER_MESSAGE_QUEUE MessageQueue, ULONG Type, HWND hWnd); inline BOOL MsqIsSignaled( PUSER_MESSAGE_QUEUE queue ); inline VOID MsqSetQueueBits( PUSER_MESSAGE_QUEUE queue, WORD bits ); @@ -203,6 +207,12 @@ LPARAM FASTCALL MsqGetMessageExtraInfo(VOID); #define MsqIsSignaled(MsgQueue) \ ((MsgQueue->WakeBits & MsgQueue->WakeMask) || (MsgQueue->ChangedBits & MsgQueue->ChangedMask)) +#define IS_BTN_MESSAGE(message,code) \ + ((message) == WM_LBUTTON##code || \ + (message) == WM_MBUTTON##code || \ + (message) == WM_RBUTTON##code || \ + (message) == WM_XBUTTON##code ) + #endif /* _WIN32K_MSGQUEUE_H */ /* EOF */ diff --git a/reactos/subsys/win32k/ntuser/focus.c b/reactos/subsys/win32k/ntuser/focus.c index 5fad4ae574c..abc5c1c6f60 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.20 2004/04/13 13:50:31 weiden Exp $ + * $Id: focus.c,v 1.21 2004/04/15 23:36:03 weiden Exp $ */ #include @@ -401,16 +401,23 @@ NtUserSetCapture(HWND hWnd) DPRINT("NtUserSetCapture(%x)\n", hWnd); ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue; - Window = IntGetWindowObject(hWnd); - if (Window != 0) + if((Window = IntGetWindowObject(hWnd))) { - if (Window->MessageQueue != ThreadQueue) + if(Window->MessageQueue != ThreadQueue) { IntReleaseWindowObject(Window); - return 0; + return NULL; } } - hWndPrev = ThreadQueue->CaptureWindow; + hWndPrev = MsqSetStateWindow(ThreadQueue, MSQ_STATE_CAPTURE, hWnd); + + /* also remove other windows if not capturing anymore */ + if(hWnd == NULL) + { + MsqSetStateWindow(ThreadQueue, MSQ_STATE_MENUOWNER, NULL); + MsqSetStateWindow(ThreadQueue, MSQ_STATE_MOVESIZE, NULL); + } + IntPostOrSendMessage(hWndPrev, WM_CAPTURECHANGED, 0, (LPARAM)hWnd); IntLockMessageQueue(ThreadQueue); ThreadQueue->CaptureWindow = hWnd; diff --git a/reactos/subsys/win32k/ntuser/message.c b/reactos/subsys/win32k/ntuser/message.c index b90a281807a..0326fff7e56 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.58 2004/04/14 20:18:12 weiden Exp $ +/* $Id: message.c,v 1.59 2004/04/15 23:36:03 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -33,6 +33,8 @@ #include #include #include +#include +#include #include #include #include @@ -175,7 +177,7 @@ NtUserTranslateMessage(LPMSG lpMsg, VOID FASTCALL -IntSendSpecialMessages(PUSER_MESSAGE_QUEUE ThreadQueue, LPMSG Msg) +IntSendHitTestMessages(PUSER_MESSAGE_QUEUE ThreadQueue, LPMSG Msg) { if(!Msg->hwnd || ThreadQueue->CaptureWindow) { @@ -232,10 +234,108 @@ IntSendSpecialMessages(PUSER_MESSAGE_QUEUE ThreadQueue, LPMSG Msg) } } +BOOL FASTCALL +IntActivateWindowMouse(PUSER_MESSAGE_QUEUE ThreadQueue, LPMSG Msg, PWINDOW_OBJECT MsgWindow, + USHORT *HitTest) +{ + ULONG Result; + + if(*HitTest == (USHORT)HTTRANSPARENT) + { + /* eat the message, search again! */ + return TRUE; + } + + Result = IntSendMessage(MsgWindow->Self, WM_MOUSEACTIVATE, (WPARAM)NtUserGetParent(MsgWindow->Self), (LPARAM)MAKELONG(*HitTest, Msg->message)); + switch (Result) + { + case MA_NOACTIVATEANDEAT: + return TRUE; + case MA_NOACTIVATE: + break; + case MA_ACTIVATEANDEAT: + IntMouseActivateWindow(MsgWindow); + return TRUE; + default: + /* MA_ACTIVATE */ + IntMouseActivateWindow(MsgWindow); + break; + } + + return FALSE; +} + +BOOL FASTCALL +IntTranslateMouseMessage(PUSER_MESSAGE_QUEUE ThreadQueue, LPMSG Msg, USHORT *HitTest, BOOL Remove) +{ + PWINDOW_OBJECT Window; + + if(!(Window = IntGetWindowObject(Msg->hwnd))) + { + /* FIXME - change the mouse cursor to an arrow, maybe do this a better way */ + IntLoadDefaultCursors(TRUE); + /* let's just eat the message?! */ + return TRUE; + } + + if(ThreadQueue == Window->MessageQueue && + ThreadQueue->CaptureWindow != Window->Self) + { + /* only send WM_NCHITTEST messages if we're not capturing the window! */ + *HitTest = IntSendMessage(Window->Self, WM_NCHITTEST, 0, + MAKELONG(Msg->pt.x, Msg->pt.y)); + } + else + { + *HitTest = HTCLIENT; + } + + if(IS_BTN_MESSAGE(Msg->message, DOWN)) + { + /* generate double click messages, if necessary */ + if ((((*HitTest) != HTCLIENT) || + (IntGetClassLong(Window, GCL_STYLE, FALSE) & CS_DBLCLKS)) && + MsqIsDblClk(Msg, Remove)) + { + Msg->message += WM_LBUTTONDBLCLK - WM_LBUTTONDOWN; + } + } + + if(Msg->message != WM_MOUSEWHEEL) + { + + if ((*HitTest) != HTCLIENT) + { + Msg->message += WM_NCMOUSEMOVE - WM_MOUSEMOVE; + if((Msg->message == WM_NCRBUTTONUP) && + (((*HitTest) == HTCAPTION) || ((*HitTest) == HTSYSMENU))) + { + Msg->message = WM_CONTEXTMENU; + Msg->wParam = (WPARAM)Window->Self; + } + else + { + Msg->wParam = *HitTest; + } + } + else if(ThreadQueue->MoveSize == NULL && + ThreadQueue->MenuOwner == NULL) + { + Msg->pt.x -= Window->ClientRect.left; + Msg->pt.y -= Window->ClientRect.top; + Msg->lParam = MAKELONG(Msg->pt.x, Msg->pt.y); + } + } + + IntReleaseWindowObject(Window); + return FALSE; +} + + /* * Internal version of PeekMessage() doing all the work */ -BOOL STDCALL +BOOL FASTCALL IntPeekMessage(LPMSG Msg, HWND Wnd, UINT MsgFilterMin, @@ -244,25 +344,27 @@ IntPeekMessage(LPMSG Msg, { LARGE_INTEGER LargeTickCount; PUSER_MESSAGE_QUEUE ThreadQueue; - BOOLEAN Present; PUSER_MESSAGE Message; - BOOLEAN RemoveMessages; + BOOL Present, RemoveMessages; /* The queues and order in which they are checked are documented in the MSDN article on GetMessage() */ ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue; - - KeQueryTickCount(&LargeTickCount); - ThreadQueue->LastMsgRead = LargeTickCount.u.LowPart; /* Inspect RemoveMsg flags */ /* FIXME: The only flag we process is PM_REMOVE - processing of others must still be implemented */ RemoveMessages = RemoveMsg & PM_REMOVE; + + CheckMessages: + + Present = FALSE; + + KeQueryTickCount(&LargeTickCount); + ThreadQueue->LastMsgRead = LargeTickCount.u.LowPart; /* Dispatch sent messages here. */ - while (MsqDispatchOneSentMessage(ThreadQueue)) - ; + while (MsqDispatchOneSentMessage(ThreadQueue)); /* Now look for a quit message. */ @@ -275,9 +377,9 @@ IntPeekMessage(LPMSG Msg, Msg->wParam = ThreadQueue->QuitExitCode; Msg->lParam = 0; if (RemoveMessages) - { - ThreadQueue->QuitPosted = FALSE; - } + { + ThreadQueue->QuitPosted = FALSE; + } return TRUE; } @@ -290,16 +392,15 @@ IntPeekMessage(LPMSG Msg, MsgFilterMax, &Message); if (Present) + { + RtlCopyMemory(Msg, &Message->Msg, sizeof(MSG)); + if (RemoveMessages) { - RtlCopyMemory(Msg, &Message->Msg, sizeof(MSG)); - if (RemoveMessages) - { - MsqDestroyMessage(Message); - IntSendSpecialMessages(ThreadQueue, Msg); - } - return TRUE; + MsqDestroyMessage(Message); } - + goto MessageFound; + } + /* Check for hardware events. */ Present = MsqFindMessage(ThreadQueue, TRUE, @@ -309,27 +410,87 @@ IntPeekMessage(LPMSG Msg, MsgFilterMax, &Message); if (Present) + { + RtlCopyMemory(Msg, &Message->Msg, sizeof(MSG)); + if (RemoveMessages) { - RtlCopyMemory(Msg, &Message->Msg, sizeof(MSG)); - if (RemoveMessages) - { - MsqDestroyMessage(Message); - IntSendSpecialMessages(ThreadQueue, Msg); - } - return TRUE; + MsqDestroyMessage(Message); } - + goto MessageFound; + } + /* Check for sent messages again. */ - while (MsqDispatchOneSentMessage(ThreadQueue)) - ; + while (MsqDispatchOneSentMessage(ThreadQueue)); /* Check for paint messages. */ if (IntGetPaintMessage(Wnd, PsGetWin32Thread(), Msg, RemoveMessages)) + { + return TRUE; + } + + /* FIXME - get WM_(SYS)TIMER messages */ + + if(Present) + { + MessageFound: + + if(RemoveMessages) { + PWINDOW_OBJECT MsgWindow = NULL;; + + if(Msg->hwnd && (MsgWindow = IntGetWindowObject(Msg->hwnd)) && + Msg->message >= WM_MOUSEFIRST && Msg->message <= WM_MOUSELAST) + { + USHORT HitTest; + + if(IntTranslateMouseMessage(ThreadQueue, Msg, &HitTest, TRUE)) + /* FIXME - check message filter again, if the message doesn't match anymore, + search again */ + { + IntReleaseWindowObject(MsgWindow); + /* eat the message, search again */ + goto CheckMessages; + } + if(ThreadQueue->CaptureWindow == NULL) + { + IntSendHitTestMessages(ThreadQueue, Msg); + if((Msg->message != WM_MOUSEMOVE && Msg->message != WM_NCMOUSEMOVE) && + IS_BTN_MESSAGE(Msg->message, DOWN) && + IntActivateWindowMouse(ThreadQueue, Msg, MsgWindow, &HitTest)) + { + IntReleaseWindowObject(MsgWindow); + /* eat the message, search again */ + goto CheckMessages; + } + } + } + else + { + IntSendHitTestMessages(ThreadQueue, Msg); + } + + if(MsgWindow) + { + IntReleaseWindowObject(MsgWindow); + } + return TRUE; } + + USHORT HitTest; + if((Msg->hwnd && Msg->message >= WM_MOUSEFIRST && Msg->message <= WM_MOUSELAST) && + IntTranslateMouseMessage(ThreadQueue, Msg, &HitTest, FALSE)) + /* FIXME - check message filter again, if the message doesn't match anymore, + search again */ + { + /* eat the message, search again */ + goto CheckMessages; + } + + return TRUE; + } - return FALSE; + return Present; } BOOL STDCALL diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index 93aab84ce8d..21cc8ac14b1 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.61 2004/04/14 23:40:43 weiden Exp $ +/* $Id: misc.c,v 1.62 2004/04/15 23:36:03 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -264,33 +264,10 @@ NtUserCallTwoParam( case TWOPARAM_ROUTINE_SETGUITHRDHANDLE: { - HWND *hwnd; PUSER_MESSAGE_QUEUE MsgQueue = PsGetCurrentThread()->Win32Thread->MessageQueue; - - switch(Param1) - { - case TPR_SGTH_ACTIVE: - hwnd = &MsgQueue->ActiveWindow; - break; - case TPR_SGTH_FOCUS: - hwnd = &MsgQueue->FocusWindow; - break; - case TPR_SGTH_CAPTURE: - hwnd = &MsgQueue->CaptureWindow; - break; - case TPR_SGTH_MENUOWNER: - hwnd = &MsgQueue->MenuOwner; - break; - case TPR_SGTH_MOVESIZE: - hwnd = &MsgQueue->MoveSize; - break; - case TPR_SGTH_CARET: - hwnd = &MsgQueue->CaretInfo->hWnd; - break; - default: - return 0; - } - return (DWORD)(*hwnd = (HWND)Param2); + + ASSERT(MsgQueue); + return (DWORD)MsqSetStateWindow(MsgQueue, (ULONG)Param1, (HWND)Param2); } case TWOPARAM_ROUTINE_ENABLEWINDOW: diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index b2be9121319..d580d4008c0 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.87 2004/04/14 19:07:14 weiden Exp $ +/* $Id: msgqueue.c,v 1.88 2004/04/15 23:36:03 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -184,8 +184,8 @@ MsqInsertSystemMessage(MSG* Msg, BOOL RemMouseMoveMsg) KeSetEvent(&HardwareMessageEvent, IO_NO_INCREMENT, FALSE); } -BOOL STATIC FASTCALL -MsqIsDblClk(PWINDOW_OBJECT Window, PUSER_MESSAGE Message, BOOL Remove) +BOOL FASTCALL +MsqIsDblClk(LPMSG Msg, BOOL Remove) { PWINSTATION_OBJECT WinStaObject; PSYSTEM_CURSORINFO CurInfo; @@ -202,13 +202,13 @@ MsqIsDblClk(PWINDOW_OBJECT Window, PUSER_MESSAGE Message, BOOL Remove) return FALSE; } CurInfo = &WinStaObject->SystemCursor; - Res = (Message->Msg.hwnd == (HWND)CurInfo->LastClkWnd) && - ((Message->Msg.time - CurInfo->LastBtnDown) < CurInfo->DblClickSpeed); + Res = (Msg->hwnd == (HWND)CurInfo->LastClkWnd) && + ((Msg->time - CurInfo->LastBtnDown) < CurInfo->DblClickSpeed); if(Res) { - dX = CurInfo->LastBtnDownX - Message->Msg.pt.x; - dY = CurInfo->LastBtnDownY - Message->Msg.pt.y; + dX = CurInfo->LastBtnDownX - Msg->pt.x; + dY = CurInfo->LastBtnDownY - Msg->pt.y; if(dX < 0) dX = -dX; if(dY < 0) dY = -dY; @@ -221,16 +221,16 @@ MsqIsDblClk(PWINDOW_OBJECT Window, PUSER_MESSAGE Message, BOOL Remove) if (Res) { CurInfo->LastBtnDown = 0; - CurInfo->LastBtnDownX = Message->Msg.pt.x; - CurInfo->LastBtnDownY = Message->Msg.pt.y; + CurInfo->LastBtnDownX = Msg->pt.x; + CurInfo->LastBtnDownY = Msg->pt.y; CurInfo->LastClkWnd = NULL; } else { - CurInfo->LastBtnDownX = Message->Msg.pt.x; - CurInfo->LastBtnDownY = Message->Msg.pt.y; - CurInfo->LastClkWnd = (HANDLE)Message->Msg.hwnd; - CurInfo->LastBtnDown = Message->Msg.time; + CurInfo->LastBtnDownX = Msg->pt.x; + CurInfo->LastBtnDownY = Msg->pt.y; + CurInfo->LastClkWnd = (HANDLE)Msg->hwnd; + CurInfo->LastBtnDown = Msg->time; } } @@ -239,120 +239,31 @@ MsqIsDblClk(PWINDOW_OBJECT Window, PUSER_MESSAGE Message, BOOL Remove) } BOOL STATIC STDCALL -MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, +MsqTranslateMouseMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, UINT FilterLow, UINT FilterHigh, PUSER_MESSAGE Message, BOOL Remove, PBOOL Freed, BOOL RemoveWhenFreed, - PWINDOW_OBJECT ScopeWin, PUSHORT HitTest, - PPOINT ScreenPoint, BOOL FromGlobalQueue) + PWINDOW_OBJECT ScopeWin, PPOINT ScreenPoint, BOOL FromGlobalQueue) { - PUSER_MESSAGE_QUEUE ThreadQueue; USHORT Msg = Message->Msg.message; PWINDOW_OBJECT Window = NULL; HWND CaptureWin; - POINT Point; - - ThreadQueue = PsGetWin32Thread()->MessageQueue; - - if (Msg == WM_LBUTTONDOWN || - Msg == WM_MBUTTONDOWN || - Msg == WM_RBUTTONDOWN || - Msg == WM_XBUTTONDOWN) - { - *HitTest = WinPosWindowFromPoint(ScopeWin, ThreadQueue, &Message->Msg.pt, &Window); - /* - **Make sure that we have a window that is not already in focus - */ - if (Window && (Window->Self != IntGetFocusWindow())) - { - if(ThreadQueue == Window->MessageQueue) - { - /* only get a more detailed hit-test if the window is in the same thread! */ - *HitTest = IntSendMessage(Window->Self, WM_NCHITTEST, 0, - MAKELONG(Message->Msg.pt.x, Message->Msg.pt.y)); - } - if(*HitTest != (USHORT)HTTRANSPARENT) - { - LRESULT Result; - - /* Sending a message to another thread might lock up our own when it's - hung, so just send messages to our own thread */ - if(Window->MessageQueue == ThreadQueue) - Result = IntSendMessage(Window->Self, WM_MOUSEACTIVATE, (WPARAM)NtUserGetParent(Window->Self), (LPARAM)MAKELONG(*HitTest, Msg)); - else - { - /* just post WM_MOUSEACTIVATE to the other thread */ - NtUserPostMessage(Window->Self, WM_MOUSEACTIVATE, (WPARAM)NtUserGetParent(Window->Self), (LPARAM)MAKELONG(*HitTest, Msg)); - /* and assume that windows of other threads should always be activated. */ - Result = MA_ACTIVATE; - } - - switch (Result) - { - case MA_NOACTIVATEANDEAT: - *Freed = FALSE; - IntReleaseWindowObject(Window); - return TRUE; - case MA_NOACTIVATE: - break; - case MA_ACTIVATEANDEAT: - IntMouseActivateWindow(Window); - IntReleaseWindowObject(Window); - *Freed = FALSE; - return TRUE; - default: - /* MA_ACTIVATE */ - IntMouseActivateWindow(Window); - break; - } - } - else - { - IntReleaseWindowObject(Window); - if(RemoveWhenFreed) - { - RemoveEntryList(&Message->ListEntry); - } - ExFreePool(Message); - *Freed = TRUE; - return(FALSE); - } - } - } CaptureWin = IntGetCaptureWindow(); - if (CaptureWin == NULL) { if(Msg == WM_MOUSEWHEEL) { - *HitTest = HTCLIENT; - if(Window) - IntReleaseWindowObject(Window); Window = IntGetWindowObject(IntGetFocusWindow()); } else { - if(!Window) - { - *HitTest = WinPosWindowFromPoint(ScopeWin, ThreadQueue, &Message->Msg.pt, &Window); - if(Window && (ThreadQueue == Window->MessageQueue)) - { - *HitTest = IntSendMessage(Window->Self, WM_NCHITTEST, 0, - MAKELONG(Message->Msg.pt.x, Message->Msg.pt.y)); - } - if(!Window) - { - /* change the cursor on desktop background */ - IntLoadDefaultCursors(TRUE); - } - } + WinPosWindowFromPoint(ScopeWin, NULL, &Message->Msg.pt, &Window); } } else { - if(Window) - IntReleaseWindowObject(Window); + /* FIXME - window messages should go to the right window if no buttons are + pressed */ Window = IntGetWindowObject(CaptureWin); - *HitTest = HTCLIENT; } if (Window == NULL) @@ -366,7 +277,7 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, return(FALSE); } - if (Window->MessageQueue != ThreadQueue) + if (Window->MessageQueue != MessageQueue) { if (! FromGlobalQueue) { @@ -381,9 +292,9 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, /* remove the pointer for the current WM_MOUSEMOVE message in case we just removed it */ - if(ThreadQueue->MouseMoveMsg == Message) + if(MessageQueue->MouseMoveMsg == Message) { - ThreadQueue->MouseMoveMsg = NULL; + MessageQueue->MouseMoveMsg = NULL; } } @@ -414,48 +325,7 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, /* From here on, we're in the same message queue as the caller! */ - switch (Msg) - { - case WM_LBUTTONDOWN: - case WM_MBUTTONDOWN: - case WM_RBUTTONDOWN: - case WM_XBUTTONDOWN: - { - if ((((*HitTest) != HTCLIENT) || - (IntGetClassLong(Window, GCL_STYLE, FALSE) & CS_DBLCLKS)) && - MsqIsDblClk(Window, Message, Remove)) - { - Msg += WM_LBUTTONDBLCLK - WM_LBUTTONDOWN; - } - break; - } - } - *ScreenPoint = Message->Msg.pt; - Point = Message->Msg.pt; - - if ((*HitTest) != HTCLIENT) - { - Msg += WM_NCMOUSEMOVE - WM_MOUSEMOVE; - if((Msg == WM_NCRBUTTONUP) && - (((*HitTest) == HTCAPTION) || ((*HitTest) == HTSYSMENU))) - { - Msg = WM_CONTEXTMENU; - Message->Msg.wParam = (WPARAM)Window->Self; - } - else - { - Message->Msg.wParam = *HitTest; - } - } - else - { - if(Msg != WM_MOUSEWHEEL) - { - Point.x -= Window->ClientRect.left; - Point.y -= Window->ClientRect.top; - } - } if((hWnd != NULL && Window->Self != hWnd) || ((FilterLow != 0 || FilterLow != 0) && (Msg < FilterLow || Msg > FilterHigh))) @@ -496,13 +366,11 @@ MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh, *Freed = FALSE; return(FALSE); } - - if (Remove) - { - Message->Msg.hwnd = Window->Self; - Message->Msg.message = Msg; - Message->Msg.lParam = MAKELONG(Point.x, Point.y); - } + + /* FIXME - only assign if removing? */ + Message->Msg.hwnd = Window->Self; + Message->Msg.message = Msg; + Message->Msg.lParam = MAKELONG(Message->Msg.pt.x, Message->Msg.pt.y); /* remove the reference to the current WM_(NC)MOUSEMOVE message, if this message is it */ @@ -544,7 +412,6 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, PUSER_MESSAGE* Message) { KIRQL OldIrql; - USHORT HitTest; POINT ScreenPoint; BOOL Accept, Freed; PLIST_ENTRY CurrentEntry; @@ -584,10 +451,9 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, if (Current->Msg.message >= WM_MOUSEFIRST && Current->Msg.message <= WM_MOUSELAST) { - Accept = MsqTranslateMouseMessage(hWnd, FilterLow, FilterHigh, + Accept = MsqTranslateMouseMessage(MessageQueue, hWnd, FilterLow, FilterHigh, Current, Remove, &Freed, TRUE, - DesktopWindow, &HitTest, - &ScreenPoint, FALSE); + DesktopWindow, &ScreenPoint, FALSE); if (Accept) { if (Remove) @@ -653,10 +519,9 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, { const ULONG ActiveStamp = HardwareMessageQueueStamp; /* Translate the message. */ - Accept = MsqTranslateMouseMessage(hWnd, FilterLow, FilterHigh, + Accept = MsqTranslateMouseMessage(MessageQueue, hWnd, FilterLow, FilterHigh, Current, Remove, &Freed, FALSE, - DesktopWindow, &HitTest, - &ScreenPoint, TRUE); + DesktopWindow, &ScreenPoint, TRUE); if (Accept) { /* Check for no more messages in the system queue. */ @@ -1217,4 +1082,41 @@ MsqGetMessageExtraInfo(VOID) return MessageQueue->ExtraInfo; } +HWND FASTCALL +MsqSetStateWindow(PUSER_MESSAGE_QUEUE MessageQueue, ULONG Type, HWND hWnd) +{ + HWND Prev; + + switch(Type) + { + case MSQ_STATE_CAPTURE: + Prev = MessageQueue->CaptureWindow; + MessageQueue->CaptureWindow = hWnd; + return Prev; + case MSQ_STATE_ACTIVE: + Prev = MessageQueue->ActiveWindow; + MessageQueue->ActiveWindow = hWnd; + return Prev; + case MSQ_STATE_FOCUS: + Prev = MessageQueue->FocusWindow; + MessageQueue->FocusWindow = hWnd; + return Prev; + case MSQ_STATE_MENUOWNER: + Prev = MessageQueue->MenuOwner; + MessageQueue->MenuOwner = hWnd; + return Prev; + case MSQ_STATE_MOVESIZE: + Prev = MessageQueue->MoveSize; + MessageQueue->MoveSize = hWnd; + return Prev; + case MSQ_STATE_CARET: + ASSERT(MessageQueue->CaretInfo); + Prev = MessageQueue->CaretInfo->hWnd; + MessageQueue->CaretInfo->hWnd = hWnd; + return Prev; + } + + return NULL; +} + /* EOF */ From fb6ac7fe65bae9b5acf66cc14ade52569dfafca2 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Fri, 16 Apr 2004 01:27:44 +0000 Subject: [PATCH 0902/1463] minor fix svn path=/trunk/; revision=9153 --- reactos/subsys/win32k/ntuser/msgqueue.c | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index d580d4008c0..3b20bc78d56 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.88 2004/04/15 23:36:03 weiden Exp $ +/* $Id: msgqueue.c,v 1.89 2004/04/16 01:27:44 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -540,22 +540,17 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, if (!Remove) { IntLockHardwareMessageQueue(MessageQueue); - if((Current->Msg.message == WM_MOUSEMOVE) && MessageQueue->MouseMoveMsg) - { - /* we do not hold more than one WM_MOUSEMOVE message in the queue */ - MessageQueue->MouseMoveMsg->Msg = Current->Msg; - *Message = MessageQueue->MouseMoveMsg; - ExFreePool(Current); - } - else - { - InsertTailList(&MessageQueue->HardwareMessagesListHead, - &Current->ListEntry); - if(Current->Msg.message == WM_MOUSEMOVE) + if(Current->Msg.message == WM_MOUSEMOVE) + { + if(MessageQueue->MouseMoveMsg) { - MessageQueue->MouseMoveMsg = Current; + RemoveEntryList(&MessageQueue->MouseMoveMsg->ListEntry); + ExFreePool(MessageQueue->MouseMoveMsg); } + MessageQueue->MouseMoveMsg = Current; } + InsertTailList(&MessageQueue->HardwareMessagesListHead, + &Current->ListEntry); IntUnLockHardwareMessageQueue(MessageQueue); } IntUnLockSystemHardwareMessageQueueLock(FALSE); From 1954069fed13dbf42fe5aba3d2a0ca16ba55bb27 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Fri, 16 Apr 2004 01:28:15 +0000 Subject: [PATCH 0903/1463] VmWare is having problems with Volatile and Atomic process counters at boot time. Fix later svn path=/trunk/; revision=9154 --- reactos/ntoskrnl/ke/i386/irq.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/ke/i386/irq.c b/reactos/ntoskrnl/ke/i386/irq.c index da2757a88d8..ea3fb39086a 100644 --- a/reactos/ntoskrnl/ke/i386/irq.c +++ b/reactos/ntoskrnl/ke/i386/irq.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: irq.c,v 1.42 2004/04/14 23:32:38 jimtabor Exp $ +/* $Id: irq.c,v 1.43 2004/04/16 01:28:15 jimtabor Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/i386/irq.c @@ -520,12 +520,12 @@ KiInterruptDispatch (ULONG irq, PKIRQ_TRAPFRAME Trapframe) Ke386DisableInterrupts(); HalEndSystemInterrupt (old_level, 0); - +#if 0 if (old_level==PASSIVE_LEVEL) { KiUpdateProcessThreadTime(); } - +#endif if (old_level==PASSIVE_LEVEL && Trapframe->Cs != KERNEL_CS) { CurrentThread = KeGetCurrentThread(); From d32be1b6055228ffe41da9cdc92a53f4672ac2c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Fri, 16 Apr 2004 08:31:25 +0000 Subject: [PATCH 0904/1463] Sync to Wine-20040408: Warren Turkal - Fixed the implementation of CoTreatAsClass. Francois Gouget - Assorted spelling fixes. svn path=/trunk/; revision=9155 --- reactos/lib/ole32/compobj.c | 38 +++++++++++++++++++++++++++++-------- reactos/lib/ole32/ifs.c | 2 +- reactos/lib/ole32/ole2.c | 3 +++ 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/reactos/lib/ole32/compobj.c b/reactos/lib/ole32/compobj.c index 2e6e6db7ff5..f66e03824d0 100644 --- a/reactos/lib/ole32/compobj.c +++ b/reactos/lib/ole32/compobj.c @@ -1588,22 +1588,22 @@ HINSTANCE WINAPI CoLoadLibrary(LPOLESTR lpszLibName, BOOL bAutoFree) /*********************************************************************** * CoFreeLibrary [OLE32.@] * - * NOTES: don't belive the docu + * NOTES: don't believe the documentation */ void WINAPI CoFreeLibrary(HINSTANCE hLibrary) { - FreeLibrary(hLibrary); + FreeLibrary(hLibrary); } /*********************************************************************** * CoFreeAllLibraries [OLE32.@] * - * NOTES: don't belive the docu + * NOTES: don't believe the documentation */ void WINAPI CoFreeAllLibraries(void) { - /* NOP */ + /* NOP */ } @@ -2010,14 +2010,19 @@ HRESULT WINAPI OleDoAutoConvert(IStorage *pStg, LPCLSID pClsidNew) /****************************************************************************** * CoTreatAsClass [OLE32.@] + * + * Sets TreatAs value of a class */ HRESULT WINAPI CoTreatAsClass(REFCLSID clsidOld, REFCLSID clsidNew) { HKEY hkey = 0; - char buf[200], szClsidNew[200]; + char buf[47]; + char szClsidNew[39]; HRESULT res = S_OK; + char auto_treat_as[39]; + LONG auto_treat_as_size = sizeof(auto_treat_as); + CLSID id; - FIXME("(%s,%s)\n", debugstr_guid(clsidOld), debugstr_guid(clsidNew)); sprintf(buf,"CLSID\\");WINE_StringFromCLSID(clsidOld,&buf[6]); WINE_StringFromCLSID(clsidNew, szClsidNew); if (RegOpenKeyA(HKEY_CLASSES_ROOT,buf,&hkey)) @@ -2025,9 +2030,26 @@ HRESULT WINAPI CoTreatAsClass(REFCLSID clsidOld, REFCLSID clsidNew) res = REGDB_E_CLASSNOTREG; goto done; } - if (RegSetValueA(hkey, "AutoTreatAs", REG_SZ, szClsidNew, strlen(szClsidNew)+1)) + if (!memcmp( clsidOld, clsidNew, sizeof(*clsidOld) )) { - res = REGDB_E_WRITEREGDB; + if (!RegQueryValueA(hkey, "AutoTreatAs", auto_treat_as, &auto_treat_as_size) && + !__CLSIDFromStringA(auto_treat_as, &id)) + { + if (RegSetValueA(hkey, "TreatAs", REG_SZ, auto_treat_as, strlen(auto_treat_as)+1)) + { + res = REGDB_E_WRITEREGDB; + goto done; + } + } + else + { + RegDeleteKeyA(hkey, "TreatAs"); + goto done; + } + } + else if (RegSetValueA(hkey, "TreatAs", REG_SZ, szClsidNew, strlen(szClsidNew)+1)) + { + res = REGDB_E_WRITEREGDB; goto done; } diff --git a/reactos/lib/ole32/ifs.c b/reactos/lib/ole32/ifs.c index 2850651670b..90ad2a8ce8b 100644 --- a/reactos/lib/ole32/ifs.c +++ b/reactos/lib/ole32/ifs.c @@ -565,7 +565,7 @@ LPVOID WINAPI CoTaskMemRealloc(LPVOID pvOld, ULONG size) * CoRegisterMallocSpy [OLE32.@] * * NOTES - * if a mallocspy is already registered, we cant do it again since + * if a mallocspy is already registered, we can't do it again since * only the spy knows, how to free a memory block */ HRESULT WINAPI CoRegisterMallocSpy(LPMALLOCSPY pMallocSpy) diff --git a/reactos/lib/ole32/ole2.c b/reactos/lib/ole32/ole2.c index 9d26841c650..efeb81e597c 100644 --- a/reactos/lib/ole32/ole2.c +++ b/reactos/lib/ole32/ole2.c @@ -332,6 +332,9 @@ HRESULT WINAPI RegisterDragDrop( TRACE("(%p,%p)\n", hwnd, pDropTarget); + if (!pDropTarget) + return E_INVALIDARG; + /* * First, check if the window is already registered. */ From 768e79dd1f1f2c950cea217d428a6e3e70af30b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Fri, 16 Apr 2004 08:36:17 +0000 Subject: [PATCH 0905/1463] Sync to Wine-20040408: Jose Manuel Ferrer Ortiz - Updated Spanish translations. svn path=/trunk/; revision=9156 --- reactos/lib/oledlg/oledlg_Es.rc | 55 +++++++++++++++++++++++++++++++++ reactos/lib/oledlg/rsrc.rc | 1 + 2 files changed, 56 insertions(+) create mode 100644 reactos/lib/oledlg/oledlg_Es.rc diff --git a/reactos/lib/oledlg/oledlg_Es.rc b/reactos/lib/oledlg/oledlg_Es.rc new file mode 100644 index 00000000000..43f569398b7 --- /dev/null +++ b/reactos/lib/oledlg/oledlg_Es.rc @@ -0,0 +1,55 @@ +/* + * 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 + +UIINSERTOBJECT DIALOG DISCARDABLE 0, 0, 294, 151 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Insertar objeto" +FONT 8, "MS Sans Serif" +BEGIN + LISTBOX IDC_OBJTYPELIST,82,19,131,66,LBS_SORT | + LBS_NOINTEGRALHEIGHT | WS_VISIBLE | WS_VSCROLL | + WS_TABSTOP + LTEXT "Tipo de objeto:",IDC_OBJTYPELBL,82,7,53,8,WS_VISIBLE + DEFPUSHBUTTON "Aceptar",IDOK,221,7,66,14 + PUSHBUTTON "Cancelar",IDCANCEL,221,24,66,14 + GROUPBOX "Resultado",IDC_RESULT,7,103,208,41 + CONTROL "Crear nuevo",IDC_CREATENEW,"Button",BS_AUTORADIOBUTTON | + WS_GROUP,7,20,62,10 + CONTROL "Crear control",IDC_CREATECONTROL,"Button", + BS_AUTORADIOBUTTON | NOT WS_VISIBLE,7,54,62,10 + CONTROL "Crear desde archivo",IDC_CREATEFROMFILE,"Button", + BS_AUTORADIOBUTTON,7,37,67,10 + LTEXT "",IDC_RESULTDESC,49,112,159,23 + PUSHBUTTON "&A馻dir control...",IDC_ADDCONTROL,81,88,63,14,NOT WS_VISIBLE + CONTROL "Mostrar como icono",IDC_ASICON,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP | NOT WS_VISIBLE,223,58,64,10 + PUSHBUTTON "Explorar...",IDC_BROWSE,83,53,50,14,NOT WS_VISIBLE + LTEXT "Archivo:",IDC_FILELBL,83,27,20,8, NOT WS_VISIBLE + EDITTEXT IDC_FILE,83,37,132,13,ES_AUTOHSCROLL | NOT WS_VISIBLE +END + +STRINGTABLE DISCARDABLE +{ + IDS_RESULTOBJDESC "Inserta un nuevo objeto %s en su documento" + IDS_RESULTFILEOBJDESC "Inserta el contenido del archivo como un objeto en su documento, con lo que podr activarlo utilizando el programa que lo cre." + IDS_BROWSE "Explorar" + IDS_NOTOLEMOD "El archivo no parece ser un m骴ulo OLE v醠ido. Incapaz de registrar el control OLE." + IDS_NOTOLEMODCAPTION "A馻dir control" +} diff --git a/reactos/lib/oledlg/rsrc.rc b/reactos/lib/oledlg/rsrc.rc index af0cc3a6463..da94464f293 100644 --- a/reactos/lib/oledlg/rsrc.rc +++ b/reactos/lib/oledlg/rsrc.rc @@ -32,6 +32,7 @@ * get localized bitmaps for example. */ #include "oledlg_En.rc" +#include "oledlg_Es.rc" #include "oledlg_It.rc" #include "oledlg_Nl.rc" #include "oledlg_Pt.rc" From e20e56a546b8d0bd4c02bb551d3b982c6304ea74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Fri, 16 Apr 2004 08:47:55 +0000 Subject: [PATCH 0906/1463] Sync to Wine-20040408: Jon Griffiths - Implement SHMessageBoxCheck functions && add dialog resources. - Add SHWaitForSendMessageThread, SHAnsiToUnicodeCP,SHStripMneumonicW, SHSearchMapInt. - Make copies of keys when creating, free them when done. - Use KEY_ALL_ACCESS when writing US reg values. - SHRegWriteUSValueW: Handle all flag combinations. - Make some A calls use the W version. Jose Manuel Ferrer Ortiz - Updated Spanish translations. Ulrich Czekalla - Implement FixSlashesAndColonW and add stub for SHGetAppCompatFlags. Francois Gouget - Assorted spelling fixes. Uwe Bonnes - UrlCanonicalizeW: Remove \r and \n at the end of lpszUrlCpy, with test cases. svn path=/trunk/; revision=9157 --- reactos/lib/shlwapi/Makefile.in | 4 + reactos/lib/shlwapi/msgbox.c | 297 ++++++++++++++++++++++ reactos/lib/shlwapi/ordinal.c | 139 ++++++++--- reactos/lib/shlwapi/reg.c | 399 +++++++++++++++--------------- reactos/lib/shlwapi/resource.h | 29 +++ reactos/lib/shlwapi/shlwapi.rc | 27 ++ reactos/lib/shlwapi/shlwapi.spec | 20 +- reactos/lib/shlwapi/shlwapi_En.rc | 35 +++ reactos/lib/shlwapi/shlwapi_Es.rc | 35 +++ reactos/lib/shlwapi/string.c | 66 ++++- reactos/lib/shlwapi/url.c | 3 + 11 files changed, 800 insertions(+), 254 deletions(-) create mode 100644 reactos/lib/shlwapi/msgbox.c create mode 100644 reactos/lib/shlwapi/resource.h create mode 100644 reactos/lib/shlwapi/shlwapi.rc create mode 100644 reactos/lib/shlwapi/shlwapi_En.rc create mode 100644 reactos/lib/shlwapi/shlwapi_Es.rc diff --git a/reactos/lib/shlwapi/Makefile.in b/reactos/lib/shlwapi/Makefile.in index a2f1d67a4c2..a1a08a92d7e 100644 --- a/reactos/lib/shlwapi/Makefile.in +++ b/reactos/lib/shlwapi/Makefile.in @@ -12,6 +12,7 @@ C_SRCS = \ assoc.c \ clist.c \ istream.c \ + msgbox.c \ ordinal.c \ path.c \ reg.c \ @@ -23,6 +24,9 @@ C_SRCS = \ url.c \ wsprintf.c +RC_SRCS = \ + shlwapi.rc + SUBDIRS = tests @MAKE_DLL_RULES@ diff --git a/reactos/lib/shlwapi/msgbox.c b/reactos/lib/shlwapi/msgbox.c new file mode 100644 index 00000000000..d61c5f9815d --- /dev/null +++ b/reactos/lib/shlwapi/msgbox.c @@ -0,0 +1,297 @@ +/* + * SHLWAPI message box functions + * + * Copyright 2004 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 + */ + +#define COM_NO_WINDOWS_H +#include "config.h" +#include "wine/port.h" + +#include +#include + +#define NONAMELESSUNION +#define NONAMELESSSTRUCT +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "winreg.h" +#include "shlwapi.h" +#include "wine/unicode.h" +#include "wine/debug.h" +#include "resource.h" + + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +extern HINSTANCE shlwapi_hInstance; /* in shlwapi_main.c */ + +static const WCHAR szDontShowKey[] = { 'S','o','f','t','w','a','r','e','\\', + 'M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\', + 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', + 'E','x','p','l','o','r','e','r','\\','D','o','n','t','S','h','o','w', + 'M','e','T','h','i','s','D','i','a','l','o','g','A','g','a','i','n','\0' +}; + +INT_PTR WINAPI SHMessageBoxCheckExW(HWND,HINSTANCE,LPCWSTR,DLGPROC,LPARAM,INT_PTR,LPCWSTR); +INT_PTR WINAPI SHMessageBoxCheckW(HWND,LPCWSTR,LPCWSTR,DWORD,INT_PTR,LPCWSTR); + +/* Data held by each general message boxes */ +typedef struct tagDLGDATAEX +{ + DLGPROC dlgProc; /* User supplied DlgProc */ + LPARAM lParam; /* User supplied LPARAM for dlgProc */ + LPCWSTR lpszId; /* Name of reg key holding whether to skip */ +} DLGDATAEX; + +/* Dialogue procedure for general message boxes */ +static INT_PTR CALLBACK SHDlgProcEx(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + DLGDATAEX *d = (DLGDATAEX *)GetWindowLongW(hDlg, DWL_USER); + + TRACE("(%p,%u,%d,%ld) data %p\n", hDlg, uMsg, wParam, lParam, d); + + switch (uMsg) + { + case WM_INITDIALOG: + { + /* FIXME: Not sure where native stores its lParam */ + SetWindowLongW(hDlg, DWL_USER, lParam); + d = (DLGDATAEX *)lParam; + TRACE("WM_INITDIALOG: %p, %s,%p,%p\n", hDlg, debugstr_w(d->lpszId), + d->dlgProc, (void*)d->lParam); + if (d->dlgProc) + return d->dlgProc(hDlg, uMsg, wParam, d->lParam); + return TRUE; + } + + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDYES: + LOWORD(wParam) = IDOK; + /* Fall through ... */ + case IDNO: + if (LOWORD(wParam) == IDNO) + LOWORD(wParam) = IDCANCEL; + /* Fall through ... */ + case IDOK: + case IDCANCEL: + + TRACE("WM_COMMAND: id=%s data=%p\n", + LOWORD(wParam) == IDOK ? "IDOK" : "IDCANCEL", d); + + if (SendMessageW(GetDlgItem(hDlg, IDC_ERR_DONT_SHOW), BM_GETCHECK, 0L, 0L)) + { + DWORD dwZero = 0; + + /* The user clicked 'don't show again', so set the key */ + SHRegSetUSValueW(szDontShowKey, d->lpszId, REG_DWORD, &dwZero, + sizeof(dwZero), SHREGSET_DEFAULT); + } + if (!d->dlgProc || !d->dlgProc(hDlg, uMsg, wParam, lParam)) + EndDialog(hDlg, wParam); + return TRUE; + } + break; + + default: + break; + } + + if (d && d->dlgProc) + return d->dlgProc(hDlg, uMsg, wParam, lParam); + return FALSE; +} + +/************************************************************************* + * @ [SHLWAPI.291] + * + * Pop up a 'Don't show this message again' dialogue box. + * + * PARAMS + * hWnd [I] Window to be the dialogues' parent + * hInst [I] Instance of the module holding the dialogue resource + * lpszName [I] Resource Id of the dialogue resource + * dlgProc [I] Dialog procedure, or NULL for default handling + * lParam [I] LPARAM to pass to dlgProc + * iRet [I] Value to return if dialogue is not shown + * lpszId [I] Name of registry subkey which determines whether to show the dialog + * + * RETURNS + * Success: The value returned from the dialogue procedure. + * Failure: iRet, if the dialogue resource could not be loaded or the dialogue + * should not be shown. + * + * NOTES + * Both lpszName and lpszId must be less than MAX_PATH in length. + */ +INT_PTR WINAPI SHMessageBoxCheckExA(HWND hWnd, HINSTANCE hInst, LPCSTR lpszName, + DLGPROC dlgProc, LPARAM lParam, INT_PTR iRet, + LPCSTR lpszId) +{ + WCHAR szNameBuff[MAX_PATH], szIdBuff[MAX_PATH]; + LPCWSTR szName = szNameBuff; + + if (HIWORD(lpszName)) + MultiByteToWideChar(CP_ACP, 0, lpszName, -1, szNameBuff, MAX_PATH); + else + szName = (LPCWSTR)lpszName; /* Resource Id or NULL */ + + MultiByteToWideChar(CP_ACP, 0, lpszId, -1, szIdBuff, MAX_PATH); + + return SHMessageBoxCheckExW(hWnd, hInst, szName, dlgProc, lParam, iRet, szIdBuff); +} + +/************************************************************************* + * @ [SHLWAPI.292] + * + * Unicode version of SHMessageBoxCheckExW. + */ +INT_PTR WINAPI SHMessageBoxCheckExW(HWND hWnd, HINSTANCE hInst, LPCWSTR lpszName, + DLGPROC dlgProc, LPARAM lParam, INT_PTR iRet, LPCWSTR lpszId) +{ + DLGDATAEX d; + + if (!SHRegGetBoolUSValueW(szDontShowKey, lpszId, FALSE, TRUE)) + return iRet; + + d.dlgProc = dlgProc; + d.lParam = lParam; + d.lpszId = lpszId; + return DialogBoxParamW(hInst, (LPCWSTR)lpszName, hWnd, SHDlgProcEx, (LPARAM)&d); +} + +/* Data held by each shlwapi message box */ +typedef struct tagDLGDATA +{ + LPCWSTR lpszTitle; /* User supplied message title */ + LPCWSTR lpszText; /* User supplied message text */ + DWORD dwType; /* Message box type */ +} DLGDATA; + +/* Dialogue procedure for shlwapi message boxes */ +static INT_PTR CALLBACK SHDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + TRACE("(%p,%u,%d,%ld)\n", hDlg, uMsg, wParam, lParam); + + switch (uMsg) + { + case WM_INITDIALOG: + { + DLGDATA *d = (DLGDATA *)lParam; + TRACE("WM_INITDIALOG: %p, %s,%s,%ld\n", hDlg, debugstr_w(d->lpszTitle), + debugstr_w(d->lpszText), d->dwType); + + SetWindowTextW(hDlg, d->lpszTitle); + SetWindowTextW(GetDlgItem(hDlg, IDS_ERR_USER_MSG), d->lpszText); + + /* Set buttons according to dwType */ + switch (d->dwType) + { + case 0: + ShowWindow(GetDlgItem(hDlg, IDCANCEL), FALSE); + /* FIXME: Move OK button to position of the Cancel button (cosmetic) */ + case 1: + ShowWindow(GetDlgItem(hDlg, IDYES), FALSE); + ShowWindow(GetDlgItem(hDlg, IDNO), FALSE); + break; + default: + ShowWindow(GetDlgItem(hDlg, IDOK), FALSE); + ShowWindow(GetDlgItem(hDlg, IDCANCEL), FALSE); + break; + } + return TRUE; + } + default: + break; + } + return FALSE; +} + +/************************************************************************* + * @ [SHLWAPI.185] + * + * Pop up a 'Don't show this message again' dialogue box. + * + * PARAMS + * hWnd [I] Window to be the dialogues' parent + * lpszText [I] Text of the message to show + * lpszTitle [I] Title of the dialogue box + * dwType [I] Type of dialogue buttons (See below) + * iRet [I] Value to return if dialogue is not shown + * lpszId [I] Name of registry subkey which determines whether to show the dialog + * + * RETURNS + * Success: The value returned from the dialogue procedure (e.g. IDOK). + * Failure: iRet, if the default dialogue resource could not be loaded or the + * dialogue should not be shown. + * + * NOTES + * - Both lpszTitle and lpszId must be less than MAX_PATH in length. + * - Possible values for dwType are: + *| Value Buttons + *| ----- ------- + *| 0 OK + *| 1 OK/Cancel + *| 2 Yes/No + */ +INT_PTR WINAPI SHMessageBoxCheckA(HWND hWnd, LPCSTR lpszText, LPCSTR lpszTitle, + DWORD dwType, INT_PTR iRet, LPCSTR lpszId) +{ + WCHAR szTitleBuff[MAX_PATH], szIdBuff[MAX_PATH]; + WCHAR *szTextBuff = NULL; + int iLen; + INT_PTR iRetVal; + + if (lpszTitle) + MultiByteToWideChar(CP_ACP, 0, lpszTitle, -1, szTitleBuff, MAX_PATH); + + if (lpszText) + { + iLen = MultiByteToWideChar(CP_ACP, 0, lpszText, -1, NULL, 0); + szTextBuff = HeapAlloc(GetProcessHeap(), 0, iLen * sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, lpszText, -1, szTextBuff, iLen); + } + + MultiByteToWideChar(CP_ACP, 0, lpszId, -1, szIdBuff, MAX_PATH); + + iRetVal = SHMessageBoxCheckW(hWnd, szTextBuff, lpszTitle ? szTitleBuff : NULL, + dwType, iRet, szIdBuff); + if (szTextBuff) + HeapFree(GetProcessHeap(), 0, szTextBuff); + return iRetVal; +} + +/************************************************************************* + * @ [SHLWAPI.191] + * + * Unicode version of SHMessageBoxCheckA. + */ +INT_PTR WINAPI SHMessageBoxCheckW(HWND hWnd, LPCWSTR lpszText, LPCWSTR lpszTitle, + DWORD dwType, INT_PTR iRet, LPCWSTR lpszId) +{ + DLGDATA d; + + d.lpszTitle = lpszTitle; + d.lpszText = lpszText; + d.dwType = dwType; + + return SHMessageBoxCheckExW(hWnd, shlwapi_hInstance, (LPCWSTR)IDD_ERR_DIALOG, + SHDlgProc, (LPARAM)&d, iRet, lpszId); +} diff --git a/reactos/lib/shlwapi/ordinal.c b/reactos/lib/shlwapi/ordinal.c index 96b4b67a6ef..4c0766e6260 100644 --- a/reactos/lib/shlwapi/ordinal.c +++ b/reactos/lib/shlwapi/ordinal.c @@ -45,7 +45,6 @@ #include "wine/unicode.h" #include "servprov.h" #include "winreg.h" -#include "winuser.h" #include "wine/debug.h" #include "shlwapi.h" @@ -1902,41 +1901,6 @@ DWORD WINAPI IUnknown_OnFocusOCS(IUnknown *lpUnknown, IDispatch** lppDisp) return hRet; } -static const WCHAR szDontShowKey[] = { 'S','o','f','t','w','a','r','e','\\', - 'M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\', - 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', - 'E','x','p','l','o','r','e','r','\\','D','o','n','t','S','h','o','w', - 'M','e','T','h','i','s','D','i','a','l','o','g','A','g','a','i','n','\0' -}; - -/************************************************************************* - * @ [SHLWAPI.191] - * - * Pop up a 'Don't show this message again' error dialog box. - * - * PARAMS - * hWnd [I] Window to own the dialog box - * arg2 [I] Unknown - * arg3 [I] Unknown - * arg4 [I] Unknown - * arg5 [I] Unknown - * lpszValue [I] Registry value holding boolean show/don't show. - * - * RETURNS - * Nothing. - */ -void WINAPI SHMessageBoxCheckW(HWND hWnd, PVOID arg2, PVOID arg3, PVOID arg4, PVOID arg5, LPCWSTR lpszValue) -{ - FIXME("(%p,%p,%p,%p,%p,%s) - stub!\n", hWnd, arg2, arg3, arg4, arg5, debugstr_w(lpszValue)); - - if (SHRegGetBoolUSValueW(szDontShowKey, lpszValue, FALSE, TRUE)) - { - /* FIXME: Should use DialogBoxParamW to load a dialog box; its dlgproc - * should accept clicks on 'Don't show' and set the reg value appropriately. - */ - } -} - /************************************************************************* * @ [SHLWAPI.192] * @@ -1988,6 +1952,41 @@ DWORD WINAPI SHGetCurColorRes() return ret; } +/************************************************************************* + * @ [SHLWAPI.194] + * + * Wait for a message to arrive, with a timeout. + * + * PARAMS + * hand [I] Handle to query + * dwTimeout [I] Timeout in ticks or INFINITE to never timeout + * + * RETURNS + * STATUS_TIMEOUT if no message is received before dwTimeout ticks passes. + * Otherwise returns the value from MsgWaitForMultipleObjectsEx when a + * message is available. + */ +DWORD WINAPI SHWaitForSendMessageThread(HANDLE hand, DWORD dwTimeout) +{ + DWORD dwEndTicks = GetTickCount() + dwTimeout; + DWORD dwRet; + + while ((dwRet = MsgWaitForMultipleObjectsEx(1, &hand, dwTimeout, QS_SENDMESSAGE, 0)) == 1) + { + MSG msg; + + PeekMessageW(&msg, NULL, 0, 0, PM_NOREMOVE); + + if (dwTimeout != INFINITE) + { + if ((int)(dwTimeout = dwEndTicks - GetTickCount()) <= 0) + return WAIT_TIMEOUT; + } + } + + return dwRet; +} + /************************************************************************* * @ [SHLWAPI.197] * @@ -2009,6 +2008,43 @@ DWORD WINAPI SHFillRectClr(HDC hDC, LPCRECT pRect, COLORREF cRef) return 0; } +/************************************************************************* + * @ [SHLWAPI.198] + * + * Return the value asociated with a key in a map. + * + * PARAMS + * lpKeys [I] A list of keys of length iLen + * lpValues [I] A list of values associated with lpKeys, of length iLen + * iLen [I] Length of both lpKeys and lpValues + * iKey [I] The key value to look up in lpKeys + * + * RETURNS + * The value in lpValues associated with iKey, or -1 if iKey is not + * found in lpKeys. + * + * NOTES + * - If two elements in the map share the same key, this function returns + * the value closest to the start of the map + * - The native version of this function crashes if lpKeys or lpValues is NULL. + */ +int WINAPI SHSearchMapInt(const int *lpKeys, const int *lpValues, int iLen, int iKey) +{ + if (lpKeys && lpValues) + { + int i = 0; + + while (i < iLen) + { + if (lpKeys[i] == iKey) + return lpValues[i]; /* Found */ + i++; + } + } + return -1; /* Not found */ +} + + /************************************************************************* * @ [SHLWAPI.199] * @@ -2421,12 +2457,12 @@ static WCHAR strRegistryPolicyW[] = {'S','o','f','t','w','a','r','e','\\','M','i */ DWORD WINAPI SHGetRestriction(LPCWSTR lpSubKey, LPCWSTR lpSubName, LPCWSTR lpValue) { - DWORD retval, datsize = 4; + DWORD retval, datsize = sizeof(retval); HKEY hKey; if (!lpSubKey) lpSubKey = (LPCWSTR)strRegistryPolicyW; - + retval = RegOpenKeyW(HKEY_LOCAL_MACHINE, lpSubKey, &hKey); if (retval != ERROR_SUCCESS) retval = RegOpenKeyW(HKEY_CURRENT_USER, lpSubKey, &hKey); @@ -2435,7 +2471,7 @@ DWORD WINAPI SHGetRestriction(LPCWSTR lpSubKey, LPCWSTR lpSubName, LPCWSTR lpVal SHGetValueW(hKey, lpSubName, lpValue, NULL, (LPBYTE)&retval, &datsize); RegCloseKey(hKey); - return retval; + return retval; } /************************************************************************* @@ -3801,6 +3837,31 @@ DWORD WINAPI SHMenuIndexFromID(HMENU hMenu, UINT uID) return GetMenuPosFromID(hMenu, uID); } + +/************************************************************************* + * @ [SHLWAPI.448] + */ +VOID WINAPI FixSlashesAndColonW(LPWSTR lpwstr) +{ + while (*lpwstr) + { + if (*lpwstr == '/') + *lpwstr = '\\'; + lpwstr++; + } +} + + +/************************************************************************* + * @ [SHLWAPI.461] + */ +DWORD WINAPI SHGetAppCompatFlags() +{ + FIXME("stub\n"); + return 0; +} + + /************************************************************************* * @ [SHLWAPI.549] */ diff --git a/reactos/lib/shlwapi/reg.c b/reactos/lib/shlwapi/reg.c index d51a9a0994b..f18409bba74 100644 --- a/reactos/lib/shlwapi/reg.c +++ b/reactos/lib/shlwapi/reg.c @@ -47,11 +47,12 @@ static const WCHAR szExtensionW[] = { 'E', 'x', 't','e','n','s','i','o','n','\0' /* internal structure of what the HUSKEY points to */ typedef struct { - HKEY HKCUkey; /* HKEY of opened HKCU key */ - HKEY HKLMkey; /* HKEY of opened HKLM key */ - HKEY start; /* HKEY of where to start */ - WCHAR key_string[MAX_PATH]; /* additional path from 'start' */ -} Internal_HUSKEY, *LPInternal_HUSKEY; + HKEY HKCUstart; /* Start key in CU hive */ + HKEY HKCUkey; /* Opened key in CU hive */ + HKEY HKLMstart; /* Start key in LM hive */ + HKEY HKLMkey; /* Opened key in LM hive */ + WCHAR lpszPath[MAX_PATH]; +} SHUSKEY, *LPSHUSKEY; DWORD WINAPI SHStringFromGUIDW(REFGUID,LPWSTR,INT); HRESULT WINAPI SHRegGetCLSIDKeyW(REFGUID,LPCWSTR,BOOL,BOOL,PHKEY); @@ -68,7 +69,7 @@ HRESULT WINAPI SHRegGetCLSIDKeyW(REFGUID,LPCWSTR,BOOL,BOOL,PHKEY); static HKEY WINAPI REG_GetHKEYFromHUSKEY(HUSKEY hUSKey, BOOL which) { HKEY test = (HKEY) hUSKey; - LPInternal_HUSKEY mihk = (LPInternal_HUSKEY) hUSKey; + LPSHUSKEY mihk = (LPSHUSKEY) hUSKey; if ((test == HKEY_CLASSES_ROOT) || (test == HKEY_CURRENT_CONFIG) || @@ -89,72 +90,29 @@ static HKEY WINAPI REG_GetHKEYFromHUSKEY(HUSKEY hUSKey, BOOL which) /************************************************************************* * SHRegOpenUSKeyA [SHLWAPI.@] * - * Opens a user-specific registry key + * Open a user-specific registry key. + * + * PARAMS + * Path [I] Key name to open + * AccessType [I] Access type + * hRelativeUSKey [I] Relative user key + * phNewUSKey [O] Destination for created key + * fIgnoreHKCU [I] TRUE=Don't check HKEY_CURRENT_USER * * RETURNS * Success: ERROR_SUCCESS * Failure: An error code from RegOpenKeyExA(). */ -LONG WINAPI SHRegOpenUSKeyA( - LPCSTR Path, /* [I] Key name to open */ - REGSAM AccessType, /* [I] Access type */ - HUSKEY hRelativeUSKey, /* [I] Relative user key */ - PHUSKEY phNewUSKey, /* [O] Destination for created key */ - BOOL fIgnoreHKCU) /* [I] TRUE=Don't check HKEY_CURRENT_USER */ +LONG WINAPI SHRegOpenUSKeyA(LPCSTR Path, REGSAM AccessType, HUSKEY hRelativeUSKey, + PHUSKEY phNewUSKey, BOOL fIgnoreHKCU) { - HKEY openHKCUkey=0; - HKEY openHKLMkey=0; - LONG ret2, ret1 = ~ERROR_SUCCESS; - LPInternal_HUSKEY ihky; + WCHAR szPath[MAX_PATH]; - TRACE("(%s, 0x%lx, 0x%lx, %p, %s)\n", debugstr_a(Path), - (LONG)AccessType, (LONG)hRelativeUSKey, phNewUSKey, - (fIgnoreHKCU) ? "Ignoring HKCU" : "Process HKCU then HKLM"); + if (Path) + MultiByteToWideChar(CP_ACP, 0, Path, -1, szPath, MAX_PATH); - /* now create the internal version of HUSKEY */ - ihky = (LPInternal_HUSKEY)HeapAlloc(GetProcessHeap(), 0 , - sizeof(Internal_HUSKEY)); - MultiByteToWideChar(0, 0, Path, -1, ihky->key_string, - sizeof(ihky->key_string)-1); - - if (hRelativeUSKey) { - openHKCUkey = ((LPInternal_HUSKEY)hRelativeUSKey)->HKCUkey; - openHKLMkey = ((LPInternal_HUSKEY)hRelativeUSKey)->HKLMkey; - } - else { - openHKCUkey = HKEY_CURRENT_USER; - openHKLMkey = HKEY_LOCAL_MACHINE; - } - - ihky->HKCUkey = 0; - ihky->HKLMkey = 0; - if (!fIgnoreHKCU) { - ret1 = RegOpenKeyExA(openHKCUkey, Path, - 0, AccessType, &ihky->HKCUkey); - /* if successful, then save real starting point */ - if (ret1 != ERROR_SUCCESS) - ihky->HKCUkey = 0; - } - ret2 = RegOpenKeyExA(openHKLMkey, Path, - 0, AccessType, &ihky->HKLMkey); - if (ret2 != ERROR_SUCCESS) - ihky->HKLMkey = 0; - - if ((ret1 != ERROR_SUCCESS) || (ret2 != ERROR_SUCCESS)) - TRACE("one or more opens failed: HKCU=%ld HKLM=%ld\n", ret1, ret2); - - /* if all attempts have failed then bail */ - if ((ret1 != ERROR_SUCCESS) && (ret2 != ERROR_SUCCESS)) { - HeapFree(GetProcessHeap(), 0, ihky); - if (phNewUSKey) - *phNewUSKey = NULL; - return ret2; - } - - TRACE("HUSKEY=%p\n", ihky); - if (phNewUSKey) - *phNewUSKey = (HUSKEY)ihky; - return ERROR_SUCCESS; + return SHRegOpenUSKeyW(Path ? szPath : NULL, AccessType, hRelativeUSKey, + phNewUSKey, fIgnoreHKCU); } /************************************************************************* @@ -162,64 +120,61 @@ LONG WINAPI SHRegOpenUSKeyA( * * See SHRegOpenUSKeyA. */ -LONG WINAPI SHRegOpenUSKeyW( - LPCWSTR Path, - REGSAM AccessType, - HUSKEY hRelativeUSKey, - PHUSKEY phNewUSKey, - BOOL fIgnoreHKCU) +LONG WINAPI SHRegOpenUSKeyW(LPCWSTR Path, REGSAM AccessType, HUSKEY hRelativeUSKey, + PHUSKEY phNewUSKey, BOOL fIgnoreHKCU) { - HKEY openHKCUkey=0; - HKEY openHKLMkey=0; LONG ret2, ret1 = ~ERROR_SUCCESS; - LPInternal_HUSKEY ihky; + LPSHUSKEY hKey; - TRACE("(%s, 0x%lx, 0x%lx, %p, %s)\n", debugstr_w(Path), - (LONG)AccessType, (LONG)hRelativeUSKey, phNewUSKey, - (fIgnoreHKCU) ? "Ignoring HKCU" : "Process HKCU then HKLM"); + TRACE("(%s,0x%lx,%p,%p,%d)\n", debugstr_w(Path),(LONG)AccessType, + hRelativeUSKey, phNewUSKey, fIgnoreHKCU); - /* now create the internal version of HUSKEY */ - ihky = (LPInternal_HUSKEY)HeapAlloc(GetProcessHeap(), 0 , - sizeof(Internal_HUSKEY)); - lstrcpynW(ihky->key_string, Path, sizeof(ihky->key_string)); - - if (hRelativeUSKey) { - openHKCUkey = ((LPInternal_HUSKEY)hRelativeUSKey)->HKCUkey; - openHKLMkey = ((LPInternal_HUSKEY)hRelativeUSKey)->HKLMkey; - } - else { - openHKCUkey = HKEY_CURRENT_USER; - openHKLMkey = HKEY_LOCAL_MACHINE; - } - - ihky->HKCUkey = 0; - ihky->HKLMkey = 0; - if (!fIgnoreHKCU) { - ret1 = RegOpenKeyExW(openHKCUkey, Path, - 0, AccessType, &ihky->HKCUkey); - /* if successful, then save real starting point */ - if (ret1 != ERROR_SUCCESS) - ihky->HKCUkey = 0; - } - ret2 = RegOpenKeyExW(openHKLMkey, Path, - 0, AccessType, &ihky->HKLMkey); - if (ret2 != ERROR_SUCCESS) - ihky->HKLMkey = 0; - - if ((ret1 != ERROR_SUCCESS) || (ret2 != ERROR_SUCCESS)) - TRACE("one or more opens failed: HKCU=%ld HKLM=%ld\n", ret1, ret2); - - /* if all attempts have failed then bail */ - if ((ret1 != ERROR_SUCCESS) && (ret2 != ERROR_SUCCESS)) { - HeapFree(GetProcessHeap(), 0, ihky); - if (phNewUSKey) - *phNewUSKey = NULL; - return ret2; - } - - TRACE("HUSKEY=0x%08lx\n", (LONG)ihky); if (phNewUSKey) - *phNewUSKey = (HUSKEY)ihky; + *phNewUSKey = NULL; + + /* Create internal HUSKEY */ + hKey = (LPSHUSKEY)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*hKey)); + lstrcpynW(hKey->lpszPath, Path, sizeof(hKey->lpszPath)); + + if (hRelativeUSKey) + { + hKey->HKCUstart = SHRegDuplicateHKey(REG_GetHKEYFromHUSKEY(hRelativeUSKey, REG_HKCU)); + hKey->HKLMstart = SHRegDuplicateHKey(REG_GetHKEYFromHUSKEY(hRelativeUSKey, REG_HKLM)); + + /* FIXME: if either of these keys is NULL, create the start key from + * the relative keys start+path + */ + } + else + { + hKey->HKCUstart = HKEY_CURRENT_USER; + hKey->HKLMstart = HKEY_LOCAL_MACHINE; + } + + if (!fIgnoreHKCU) + { + ret1 = RegOpenKeyExW(hKey->HKCUstart, hKey->lpszPath, 0, AccessType, &hKey->HKCUkey); + if (ret1) + hKey->HKCUkey = 0; + } + + ret2 = RegOpenKeyExW(hKey->HKLMstart, hKey->lpszPath, 0, AccessType, &hKey->HKLMkey); + if (ret2) + hKey->HKLMkey = 0; + + if (ret1 || ret2) + TRACE("one or more opens failed: HKCU=%ld HKLM=%ld\n", ret1, ret2); + + if (ret1 && ret2) + { + /* Neither open succeeded: fail */ + SHRegCloseUSKey(hKey); + return ret2; + } + + TRACE("HUSKEY=%p\n", hKey); + if (phNewUSKey) + *phNewUSKey = (HUSKEY)hKey; return ERROR_SUCCESS; } @@ -235,14 +190,19 @@ LONG WINAPI SHRegOpenUSKeyW( LONG WINAPI SHRegCloseUSKey( HUSKEY hUSKey) /* [I] Key to close */ { - LPInternal_HUSKEY mihk = (LPInternal_HUSKEY)hUSKey; + LPSHUSKEY hKey = (LPSHUSKEY)hUSKey; LONG ret = ERROR_SUCCESS; - if (mihk->HKCUkey) - ret = RegCloseKey(mihk->HKCUkey); - if (mihk->HKLMkey) - ret = RegCloseKey(mihk->HKLMkey); - HeapFree(GetProcessHeap(), 0, mihk); + if (hKey->HKCUkey) + ret = RegCloseKey(hKey->HKCUkey); + if (hKey->HKCUstart && hKey->HKCUstart != HKEY_CURRENT_USER) + ret = RegCloseKey(hKey->HKCUstart); + if (hKey->HKLMkey) + ret = RegCloseKey(hKey->HKLMkey); + if (hKey->HKLMstart && hKey->HKLMstart != HKEY_LOCAL_MACHINE) + ret = RegCloseKey(hKey->HKCUstart); + + HeapFree(GetProcessHeap(), 0, hKey); return ret; } @@ -429,6 +389,14 @@ LONG WINAPI SHRegGetUSValueW( * * Set a user-specific registry value. * + * PARAMS + * pszSubKey [I] Name of key to set the value in + * pszValue [I] Name of value under pszSubKey to set the value in + * dwType [I] Type of the value + * pvData [I] Data to set as the value + * cbData [I] length of pvData + * dwFlags [I] SHREGSET_ flags from "shlwapi.h" + * * RETURNS * Success: ERROR_SUCCESS * Failure: An error code from SHRegOpenUSKeyA() or SHRegWriteUSValueA(), or @@ -437,31 +405,29 @@ LONG WINAPI SHRegGetUSValueW( * NOTES * This function opens pszSubKey, sets the value, and then closes the key. */ -LONG WINAPI SHRegSetUSValueA( - LPCSTR pszSubKey, /* [I] Name of key to set the value in */ - LPCSTR pszValue, /* [I] Name of value under pszSubKey to set the value in */ - DWORD dwType, /* [I] Type of the value */ - LPVOID pvData, /* [I] Data to set as the value */ - DWORD cbData, /* [I] length of pvData */ - DWORD dwFlags) /* [I] SHREGSET_ flags from "shlwapi.h" */ +LONG WINAPI SHRegSetUSValueA(LPCSTR pszSubKey, LPCSTR pszValue, DWORD dwType, + LPVOID pvData, DWORD cbData, DWORD dwFlags) { - HUSKEY myhuskey; - LONG ret; - BOOL ignoreHKCU; + BOOL ignoreHKCU = TRUE; + HUSKEY hkey; + LONG ret; - if (!pvData) return ERROR_INVALID_FUNCTION; - TRACE("key '%s', value '%s', datalen %ld\n", - debugstr_a(pszSubKey), debugstr_a(pszValue), cbData); + TRACE("(%s,%s,%ld,%p,%ld,0x%08lx\n", debugstr_a(pszSubKey), debugstr_a(pszValue), + dwType, pvData, cbData, dwFlags); - ignoreHKCU = ((dwFlags == SHREGSET_HKLM) || (dwFlags == SHREGSET_FORCE_HKLM)); + if (!pvData) + return ERROR_INVALID_FUNCTION; - ret = SHRegOpenUSKeyA(pszSubKey, 0x1, 0, &myhuskey, ignoreHKCU); - if (ret == ERROR_SUCCESS) { - ret = SHRegWriteUSValueA(myhuskey, pszValue, dwType, pvData, - cbData, dwFlags); - SHRegCloseUSKey(myhuskey); - } - return ret; + if (dwFlags & SHREGSET_HKCU || dwFlags & SHREGSET_FORCE_HKCU) + ignoreHKCU = FALSE; + + ret = SHRegOpenUSKeyA(pszSubKey, KEY_ALL_ACCESS, 0, &hkey, ignoreHKCU); + if (ret == ERROR_SUCCESS) + { + ret = SHRegWriteUSValueA(hkey, pszValue, dwType, pvData, cbData, dwFlags); + SHRegCloseUSKey(hkey); + } + return ret; } /************************************************************************* @@ -469,31 +435,29 @@ LONG WINAPI SHRegSetUSValueA( * * See SHRegSetUSValueA. */ -LONG WINAPI SHRegSetUSValueW( - LPCWSTR pszSubKey, - LPCWSTR pszValue, - DWORD dwType, - LPVOID pvData, - DWORD cbData, - DWORD dwFlags) +LONG WINAPI SHRegSetUSValueW(LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD dwType, + LPVOID pvData, DWORD cbData, DWORD dwFlags) { - HUSKEY myhuskey; - LONG ret; - BOOL ignoreHKCU; + BOOL ignoreHKCU = TRUE; + HUSKEY hkey; + LONG ret; - if (!pvData) return ERROR_INVALID_FUNCTION; - TRACE("key '%s', value '%s', datalen %ld\n", - debugstr_w(pszSubKey), debugstr_w(pszValue), cbData); + TRACE("(%s,%s,%ld,%p,%ld,0x%08lx\n", debugstr_w(pszSubKey), debugstr_w(pszValue), + dwType, pvData, cbData, dwFlags); - ignoreHKCU = ((dwFlags == SHREGSET_HKLM) || (dwFlags == SHREGSET_FORCE_HKLM)); + if (!pvData) + return ERROR_INVALID_FUNCTION; - ret = SHRegOpenUSKeyW(pszSubKey, 0x1, 0, &myhuskey, ignoreHKCU); - if (ret == ERROR_SUCCESS) { - ret = SHRegWriteUSValueW(myhuskey, pszValue, dwType, pvData, - cbData, dwFlags); - SHRegCloseUSKey(myhuskey); - } - return ret; + if (dwFlags & SHREGSET_HKCU || dwFlags & SHREGSET_FORCE_HKCU) + ignoreHKCU = FALSE; + + ret = SHRegOpenUSKeyW(pszSubKey, KEY_ALL_ACCESS, 0, &hkey, ignoreHKCU); + if (ret == ERROR_SUCCESS) + { + ret = SHRegWriteUSValueW(hkey, pszValue, dwType, pvData, cbData, dwFlags); + SHRegCloseUSKey(hkey); + } + return ret; } /************************************************************************* @@ -801,31 +765,22 @@ LONG WINAPI SHRegEnumUSKeyW( * * RETURNS * Success: ERROR_SUCCESS. - * Failure: An error code from RegSetValueExA(). + * Failure: ERROR_INVALID_PARAMETER, if any parameter is invalid, otherwise + * an error code from RegSetValueExA(). + * + * NOTES + * dwFlags must have at least SHREGSET_FORCE_HKCU or SHREGSET_FORCE_HKLM set. */ LONG WINAPI SHRegWriteUSValueA(HUSKEY hUSKey, LPCSTR pszValue, DWORD dwType, - LPVOID pvData, DWORD cbData, DWORD dwFlags) + LPVOID pvData, DWORD cbData, DWORD dwFlags) { - HKEY dokey; + WCHAR szValue[MAX_PATH]; - TRACE("(%p,%s,%ld,%p,%ld,%ld)\n", - hUSKey, debugstr_a(pszValue), dwType, pvData, cbData, dwFlags); + if (pszValue) + MultiByteToWideChar(CP_ACP, 0, pszValue, -1, szValue, MAX_PATH); - if ((dwFlags & SHREGSET_FORCE_HKCU) && - (dokey = REG_GetHKEYFromHUSKEY(hUSKey,REG_HKCU))) { - RegSetValueExA(dokey, pszValue, 0, dwType, pvData, cbData); - } - - if ((dwFlags & SHREGSET_FORCE_HKLM) && - (dokey = REG_GetHKEYFromHUSKEY(hUSKey,REG_HKLM))) { - RegSetValueExA(dokey, pszValue, 0, dwType, pvData, cbData); - } - - if (dwFlags & (SHREGSET_FORCE_HKCU | SHREGSET_FORCE_HKLM)) - return ERROR_SUCCESS; - - FIXME("SHREGSET_HKCU or SHREGSET_HKLM not supported\n"); - return ERROR_SUCCESS; + return SHRegWriteUSValueW(hUSKey, pszValue ? szValue : NULL, dwType, + pvData, cbData, dwFlags); } /************************************************************************* @@ -834,28 +789,72 @@ LONG WINAPI SHRegWriteUSValueA(HUSKEY hUSKey, LPCSTR pszValue, DWORD dwType, * See SHRegWriteUSValueA. */ LONG WINAPI SHRegWriteUSValueW(HUSKEY hUSKey, LPCWSTR pszValue, DWORD dwType, - LPVOID pvData, DWORD cbData, DWORD dwFlags) + LPVOID pvData, DWORD cbData, DWORD dwFlags) { - HKEY dokey; + LONG dummy; + LPSHUSKEY hKey = (LPSHUSKEY)hUSKey; + LONG ret = ERROR_SUCCESS; - TRACE("(%p,%s,%ld,%p,%ld,%ld)\n", - hUSKey, debugstr_w(pszValue), dwType, pvData, cbData, dwFlags); + TRACE("(%p,%s,%ld,%p,%ld,%ld)\n", hUSKey, debugstr_w(pszValue), + dwType, pvData, cbData, dwFlags); - if ((dwFlags & SHREGSET_FORCE_HKCU) && - (dokey = REG_GetHKEYFromHUSKEY(hUSKey,REG_HKCU))) { - RegSetValueExW(dokey, pszValue, 0, dwType, pvData, cbData); + if (!hUSKey || IsBadWritePtr(hUSKey, sizeof(SHUSKEY)) || + !(dwFlags & (SHREGSET_FORCE_HKCU|SHREGSET_FORCE_HKLM))) + return ERROR_INVALID_PARAMETER; + + if (dwFlags & (SHREGSET_FORCE_HKCU|SHREGSET_HKCU)) + { + if (!hKey->HKCUkey) + { + /* Create the key */ + ret = RegCreateKeyW(hKey->HKCUstart, hKey->lpszPath, &hKey->HKCUkey); + TRACE("Creating HKCU key, ret = %ld\n", ret); + if (ret && (dwFlags & (SHREGSET_FORCE_HKCU))) + { + hKey->HKCUkey = 0; + return ret; + } + } + + if (!ret) + { + if ((dwFlags & SHREGSET_FORCE_HKCU) || + RegQueryValueExW(hKey->HKCUkey, pszValue, NULL, NULL, NULL, &dummy)) + { + /* Doesn't exist or we are forcing: Write value */ + ret = RegSetValueExW(hKey->HKCUkey, pszValue, 0, dwType, pvData, cbData); + TRACE("Writing HKCU value, ret = %ld\n", ret); + } + } } - if ((dwFlags & SHREGSET_FORCE_HKLM) && - (dokey = REG_GetHKEYFromHUSKEY(hUSKey,REG_HKLM))) { - RegSetValueExW(dokey, pszValue, 0, dwType, pvData, cbData); + if (dwFlags & (SHREGSET_FORCE_HKLM|SHREGSET_HKLM)) + { + if (!hKey->HKLMkey) + { + /* Create the key */ + ret = RegCreateKeyW(hKey->HKLMstart, hKey->lpszPath, &hKey->HKLMkey); + TRACE("Creating HKLM key, ret = %ld\n", ret); + if (ret && (dwFlags & (SHREGSET_FORCE_HKLM))) + { + hKey->HKLMkey = 0; + return ret; + } + } + + if (!ret) + { + if ((dwFlags & SHREGSET_FORCE_HKLM) || + RegQueryValueExW(hKey->HKLMkey, pszValue, NULL, NULL, NULL, &dummy)) + { + /* Doesn't exist or we are forcing: Write value */ + ret = RegSetValueExW(hKey->HKLMkey, pszValue, 0, dwType, pvData, cbData); + TRACE("Writing HKLM value, ret = %ld\n", ret); + } + } } - if (dwFlags & (SHREGSET_FORCE_HKCU | SHREGSET_FORCE_HKLM)) - return ERROR_SUCCESS; - - FIXME("SHREGSET_HKCU or SHREGSET_HKLM not supported\n"); - return ERROR_SUCCESS; + return ret; } /************************************************************************* diff --git a/reactos/lib/shlwapi/resource.h b/reactos/lib/shlwapi/resource.h new file mode 100644 index 00000000000..d922ceb3e08 --- /dev/null +++ b/reactos/lib/shlwapi/resource.h @@ -0,0 +1,29 @@ +/* + * Resource defines for shlwapi + * + * Copyright 2004 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 + */ +#ifndef WINE_SHLWAPI_RESOURCE_H +#define WINE_SHLWAPI_RESOURCE_H + +/* These numbers match native ID's and shouldn't be abitrarily changed */ +#define IDD_ERR_DIALOG 0x1200 +#define IDS_ERR_USER_MSG 0x1201 +#define IDC_ERR_DONT_SHOW 0x1202 +#define IDS_ERR_USER_MSG2 0x1203 + +#endif /* WINE_SHLWAPI_RESOURCE_H */ diff --git a/reactos/lib/shlwapi/shlwapi.rc b/reactos/lib/shlwapi/shlwapi.rc new file mode 100644 index 00000000000..6e663615ff0 --- /dev/null +++ b/reactos/lib/shlwapi/shlwapi.rc @@ -0,0 +1,27 @@ +/* + * Top level resource file for shlwapi + * + * Copyright 2004 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 + */ + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "resource.h" + +#include "shlwapi_En.rc" +#include "shlwapi_Es.rc" diff --git a/reactos/lib/shlwapi/shlwapi.spec b/reactos/lib/shlwapi/shlwapi.spec index 262e5c259e4..32b962c62de 100644 --- a/reactos/lib/shlwapi/shlwapi.spec +++ b/reactos/lib/shlwapi/shlwapi.spec @@ -182,20 +182,20 @@ 182 stdcall -noname SHCheckMenuItem(long long long) 183 stdcall -noname SHRegisterClassA(ptr) 184 stdcall @(ptr ptr long) SHLWAPI_184 -185 stub -noname SHMessageBoxCheckA +185 stdcall -noname SHMessageBoxCheckA(ptr str str long long str) 186 stub -noname SHSimulateDrop 187 stdcall -noname SHLoadFromPropertyBag(ptr ptr) 188 stub -noname IUnknown_TranslateAcceleratorOCS 189 stdcall -noname IUnknown_OnFocusOCS(ptr ptr) 190 stub -noname IUnknown_HandleIRestrict -191 stub -noname SHMessageBoxCheckW +191 stdcall -noname SHMessageBoxCheckW(ptr wstr wstr long long wstr) 192 stdcall -noname SHGetMenuFromID(ptr long) 193 stdcall -noname SHGetCurColorRes() -194 stub -noname SHWaitForSendMessageThread +194 stdcall -noname SHWaitForSendMessageThread(ptr long) 195 stub -noname SHIsExpandableFolder 196 stub -noname DnsRecordSetCompare 197 stdcall -noname SHFillRectClr(long ptr long) -198 stub -noname SHSearchMapInt +198 stdcall -noname SHSearchMapInt(ptr ptr long long) 199 stdcall -noname IUnknown_Set(ptr ptr) 200 stub -noname MayQSForward 201 stdcall -noname MayExecForward(ptr long ptr long long ptr ptr) @@ -213,7 +213,7 @@ 213 stdcall -noname IStream_Reset(ptr) 214 stdcall -noname IStream_Size(ptr ptr) 215 stdcall -noname SHAnsiToUnicode(str ptr long) -216 stub -noname SHAnsiToUnicodeCP +216 stdcall -noname SHAnsiToUnicodeCP(long str ptr long) 217 stdcall -noname SHUnicodeToAnsi(wstr ptr ptr) 218 stdcall -noname SHUnicodeToAnsiCP(long wstr ptr ptr) 219 stdcall -noname QISearch(long long long long) @@ -222,7 +222,7 @@ 222 stdcall -noname _SHGlobalCounterCreate(long) 223 stdcall -noname _SHGlobalCounterGetValue(long) 224 stdcall -noname _SHGlobalCounterIncrement(long) -225 stub -noname SHStripMneumonicW +225 stdcall -noname SHStripMneumonicW(wstr) 226 stub -noname ZoneCheckPathA 227 stub -noname ZoneCheckPathW 228 stub -noname ZoneCheckUrlA @@ -288,8 +288,8 @@ 288 stub -noname IUnknown_CPContainerInvokeIndirect 289 stdcall -noname PlaySoundWrapW(wstr long long) 290 stub -noname SHMirrorIcon -291 stub -noname SHMessageBoxCheckExA -292 stub -noname SHMessageBoxCheckExW +291 stdcall -noname SHMessageBoxCheckExA(ptr ptr ptr ptr ptr long str) +292 stdcall -noname SHMessageBoxCheckExW(ptr ptr ptr ptr ptr long wstr) 293 stub -noname SHCancelUserWorkItems 294 stdcall -noname SHGetIniStringW(long long long long long) 295 stdcall -noname SHSetIniStringW(wstr ptr wstr wstr) @@ -445,7 +445,7 @@ 445 stdcall -noname PathFileExistsAndAttributesA(str ptr) 446 stdcall -noname PathFileExistsAndAttributesW(wstr ptr) 447 stub -noname FixSlashesAndColonA -448 stub -noname FixSlashesAndColonW +448 stdcall -noname FixSlashesAndColonW(wstr) 449 stub -noname NextPathA 450 stub -noname NextPathW 451 stub -noname CharUpperNoDBCSA @@ -458,7 +458,7 @@ 458 stub -noname GetLongPathNameWrapA 459 stub -noname SHExpandEnvironmentStringsA 460 stub -noname SHExpandEnvironmentStringsW -461 stub -noname SHGetAppCompatFlags +461 stdcall -noname SHGetAppCompatFlags() 462 stub -noname UrlFixupW 463 stub -noname SHExpandEnvironmentStringsForUserA 464 stub -noname SHExpandEnvironmentStringsForUserW diff --git a/reactos/lib/shlwapi/shlwapi_En.rc b/reactos/lib/shlwapi/shlwapi_En.rc new file mode 100644 index 00000000000..8b3b4699bf7 --- /dev/null +++ b/reactos/lib/shlwapi/shlwapi_En.rc @@ -0,0 +1,35 @@ +/* + * English resources for shlwapi + * + * Copyright 2004 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 + */ + +LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT + +IDD_ERR_DIALOG DIALOG MOVEABLE DISCARDABLE 0, 0, 220, 60 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Error!" +FONT 8, "MS Shell Dlg" +{ + LTEXT "", IDS_ERR_USER_MSG2, 15, 5, 28, 20 + LTEXT "", IDS_ERR_USER_MSG, 15, 5, 210, 8 + CHECKBOX "Don't show me th&is message again", IDC_ERR_DONT_SHOW, 5, 20, 210, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + PUSHBUTTON L"&OK" IDOK, 105, 40, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON L"&Cancel" IDCANCEL, 160, 40, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON L"&Yes" IDYES, 105, 40, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON L"&No" IDNO, 160, 40, 50, 14, WS_GROUP | WS_TABSTOP +} diff --git a/reactos/lib/shlwapi/shlwapi_Es.rc b/reactos/lib/shlwapi/shlwapi_Es.rc new file mode 100644 index 00000000000..802c9d917fc --- /dev/null +++ b/reactos/lib/shlwapi/shlwapi_Es.rc @@ -0,0 +1,35 @@ +/* + * Spanish resources for shlwapi + * + * 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 + +IDD_ERR_DIALOG DIALOG MOVEABLE DISCARDABLE 0, 0, 220, 60 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "rror!" +FONT 8, "MS Shell Dlg" +{ + LTEXT "", IDS_ERR_USER_MSG2, 15, 5, 28, 20 + LTEXT "", IDS_ERR_USER_MSG, 15, 5, 210, 8 + CHECKBOX "No volver a mostrar este &mensaje", IDC_ERR_DONT_SHOW, 5, 20, 210, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + PUSHBUTTON L"&Aceptar" IDOK, 105, 40, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON L"&Cancelar" IDCANCEL, 160, 40, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON L"&S" IDYES, 105, 40, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON L"&No" IDNO, 160, 40, 50, 14, WS_GROUP | WS_TABSTOP +} diff --git a/reactos/lib/shlwapi/string.c b/reactos/lib/shlwapi/string.c index d2c12776b17..b7cbda009dc 100644 --- a/reactos/lib/shlwapi/string.c +++ b/reactos/lib/shlwapi/string.c @@ -2434,6 +2434,63 @@ char WINAPI SHStripMneumonicA(LPCSTR lpszStr) return ch; } +/************************************************************************* + * @ [SHLWAPI.225] + * + * Unicode version of SHStripMneumonicA. + */ +WCHAR WINAPI SHStripMneumonicW(LPCWSTR lpszStr) +{ + LPWSTR lpszIter, lpszTmp; + WCHAR ch; + + TRACE("(%s)\n", debugstr_w(lpszStr)); + + ch = *lpszStr; + + if ((lpszIter = StrChrW(lpszStr, '&'))) + { + lpszTmp = CharNextW(lpszIter); + if (lpszTmp && *lpszTmp) + { + if (*lpszTmp != '&') + ch = *lpszTmp; + + while (lpszIter && *lpszIter) + { + lpszTmp = CharNextW(lpszIter); + *lpszIter = *lpszTmp; + lpszIter = lpszTmp; + } + } + } + + return ch; +} + +/************************************************************************* + * @ [SHLWAPI.216] + * + * Convert an Ascii string to Unicode. + * + * PARAMS + * dwCp [I] Code page for the conversion + * lpSrcStr [I] Source Ascii string to convert + * lpDstStr [O] Destination for converted Unicode string + * iLen [I] Length of lpDstStr + * + * RETURNS + * The return value of the MultiByteToWideChar() function called on lpSrcStr. + */ +DWORD WINAPI SHAnsiToUnicodeCP(DWORD dwCp, LPCSTR lpSrcStr, LPWSTR lpDstStr, int iLen) +{ + DWORD dwRet; + + dwRet = MultiByteToWideChar(dwCp, 0, lpSrcStr, -1, lpDstStr, iLen); + TRACE("%s->%s,ret=%ld\n", debugstr_a(lpSrcStr), debugstr_w(lpDstStr), dwRet); + return dwRet; +} + /************************************************************************* * @ [SHLWAPI.215] * @@ -2446,14 +2503,13 @@ char WINAPI SHStripMneumonicA(LPCSTR lpszStr) * * RETURNS * The return value of the MultiByteToWideChar() function called on lpSrcStr. + * + * NOTES + * This function simply calls SHAnsiToUnicodeCP with code page CP_ACP. */ DWORD WINAPI SHAnsiToUnicode(LPCSTR lpSrcStr, LPWSTR lpDstStr, int iLen) { - DWORD dwRet; - - dwRet = MultiByteToWideChar(CP_ACP, 0, lpSrcStr, -1, lpDstStr, iLen); - TRACE("%s->%s,ret=%ld\n", debugstr_a(lpSrcStr), debugstr_w(lpDstStr), dwRet); - return dwRet; + return SHAnsiToUnicodeCP(CP_ACP, lpSrcStr, lpDstStr, iLen); } /************************************************************************* diff --git a/reactos/lib/shlwapi/url.c b/reactos/lib/shlwapi/url.c index 019a0860a57..4e4f7664dc4 100644 --- a/reactos/lib/shlwapi/url.c +++ b/reactos/lib/shlwapi/url.c @@ -581,6 +581,9 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized, TRACE("Simplified, orig <%s>, simple <%s>\n", debugstr_w(pszUrl), debugstr_w(lpszUrlCpy)); } + nLen = lstrlenW(lpszUrlCpy); + while ((nLen > 0) && ((lpszUrlCpy[nLen-1] == '\r')||(lpszUrlCpy[nLen-1] == '\n'))) + lpszUrlCpy[--nLen]=0; if(dwFlags & URL_UNESCAPE) UrlUnescapeW(lpszUrlCpy, NULL, NULL, URL_UNESCAPE_INPLACE); From 36e8261e773b901be346098b6fdebd0c3e2c643f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Fri, 16 Apr 2004 08:58:34 +0000 Subject: [PATCH 0907/1463] Sync to Wine-20040408: Alexandre Julliard: - Added memicmpW. svn path=/trunk/; revision=9158 --- reactos/lib/unicode/string.c | 9 +++++++++ reactos/lib/unicode/wine_unicode.def | 3 ++- reactos/lib/unicode/winehq2ros.patch | 11 ++++++----- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/reactos/lib/unicode/string.c b/reactos/lib/unicode/string.c index b84b87316ee..6ec04ebf93f 100644 --- a/reactos/lib/unicode/string.c +++ b/reactos/lib/unicode/string.c @@ -36,6 +36,7 @@ #undef strcmpiW #undef strncmpiW #undef sprintfW +#undef snprintfW int strcmpiW( const WCHAR *str1, const WCHAR *str2 ) { @@ -56,6 +57,14 @@ int strncmpiW( const WCHAR *str1, const WCHAR *str2, int n ) return ret; } +int memicmpW( const WCHAR *str1, const WCHAR *str2, int n ) +{ + int ret = 0; + for ( ; n > 0; n--, str1++, str2++) + if ((ret = tolowerW(*str1) - tolowerW(*str2))) break; + return ret; +} + WCHAR *strstrW( const WCHAR *str, const WCHAR *sub ) { while (*str) diff --git a/reactos/lib/unicode/wine_unicode.def b/reactos/lib/unicode/wine_unicode.def index f1594d1aab2..de74ec139eb 100644 --- a/reactos/lib/unicode/wine_unicode.def +++ b/reactos/lib/unicode/wine_unicode.def @@ -1,7 +1,8 @@ LIBRARY libwine_unicode.dll EXPORTS - snprintfW=_snwprintf + memicmpW + snprintfW sprintfW strcmpiW strncmpiW diff --git a/reactos/lib/unicode/winehq2ros.patch b/reactos/lib/unicode/winehq2ros.patch index afca461e205..aa80b646de5 100644 --- a/reactos/lib/unicode/winehq2ros.patch +++ b/reactos/lib/unicode/winehq2ros.patch @@ -1,11 +1,11 @@ Index: string.c =================================================================== RCS file: /home/wine/wine/libs/unicode/string.c,v -retrieving revision 1.4 -diff -u -r1.4 string.c ---- string.c 22 Nov 2003 00:00:53 -0000 1.4 -+++ string.c 2 Jan 2004 19:09:14 -0000 -@@ -23,6 +23,20 @@ +retrieving revision 1.5 +diff -u -r1.5 string.c +--- string.c 2 Apr 2004 19:40:31 -0000 1.5 ++++ string.c 16 Apr 2004 09:07:08 -0000 +@@ -23,6 +23,21 @@ #include "wine/unicode.h" @@ -22,6 +22,7 @@ diff -u -r1.4 string.c +#undef strcmpiW +#undef strncmpiW +#undef sprintfW ++#undef snprintfW + int strcmpiW( const WCHAR *str1, const WCHAR *str2 ) { From 4374bb1685d9f64ae22800e55fc8148a32fddfda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Fri, 16 Apr 2004 09:04:04 +0000 Subject: [PATCH 0908/1463] Sync to Wine-20040408 Eric Pouech - implemented MCI_SOUND command - fixed MCI command table in resource - added a TODO list on MCI handling Christian Costa - MCI strings are case insensitive. - Fixed a returned error value. - Default to FOURCC_DOS if no IOProc found. svn path=/trunk/; revision=9159 --- reactos/lib/winmm/mci.c | 61 +++++++++++++++++++++++++++++----- reactos/lib/winmm/message16.c | 17 ++++++++++ reactos/lib/winmm/mmio.c | 7 +++- reactos/lib/winmm/winmm_res.rc | 4 +-- 4 files changed, 78 insertions(+), 11 deletions(-) diff --git a/reactos/lib/winmm/mci.c b/reactos/lib/winmm/mci.c index b22a00a9f00..978eb8e0a18 100644 --- a/reactos/lib/winmm/mci.c +++ b/reactos/lib/winmm/mci.c @@ -1,5 +1,3 @@ -/* -*- tab-width: 8; c-basic-offset: 4 -*- */ - /* * MCI internal functions * @@ -20,6 +18,21 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/* TODO: + * - implement WINMM (32bit) multitasking and use it in all MCI drivers + * instead of the home grown one + * - 16bit mmTaskXXX functions are currently broken because the 16 + * loader does not support binary command lines => provide Wine's + * own mmtask.tsk not using binary command line. + * - correctly handle the MCI_ALL_DEVICE_ID in functions. + * - finish mapping 16 <=> 32 of MCI structures and commands + * - implement auto-open feature (ie, when a string command is issued + * for a not yet opened device, MCI automatically opens it) + * - use a default registry setting to replace the [mci] section in + * configuration file (layout of info in registry should be compatible + * with all Windows' version - which use different layouts of course) + */ + #include "config.h" #include "wine/port.h" @@ -593,7 +606,7 @@ static LPCSTR MCI_FindCommand(UINT uTbl, LPCSTR verb) * array look up */ for (idx = 0; idx < S_MciCmdTable[uTbl].nVerbs; idx++) { - if (strcmp(S_MciCmdTable[uTbl].aVerbs[idx], verb) == 0) + if (strcasecmp(S_MciCmdTable[uTbl].aVerbs[idx], verb) == 0) return S_MciCmdTable[uTbl].aVerbs[idx]; } @@ -885,6 +898,7 @@ DWORD WINAPI mciSendStringA(LPCSTR lpstrCommand, LPSTR lpstrRet, if (!(verb = HeapAlloc(GetProcessHeap(), 0, strlen(lpstrCommand)+1))) return MCIERR_OUT_OF_MEMORY; strcpy( verb, lpstrCommand ); + CharLowerA(verb); memset(data, 0, sizeof(data)); @@ -898,7 +912,7 @@ DWORD WINAPI mciSendStringA(LPCSTR lpstrCommand, LPSTR lpstrRet, } /* case dev == 'new' has to be handled */ - if (!strcasecmp(dev, "new")) { + if (!strcmp(dev, "new")) { FIXME("'new': NIY as device name\n"); dwRet = MCIERR_MISSING_DEVICE_NAME; goto errCleanUp; @@ -956,6 +970,8 @@ DWORD WINAPI mciSendStringA(LPCSTR lpstrCommand, LPSTR lpstrRet, } dwRet = MCI_LoadMciDriver(devType, &wmd); + if (dwRet == MCIERR_DEVICE_NOT_INSTALLED) + dwRet = MCIERR_INVALID_DEVICE_NAME; HeapFree(GetProcessHeap(), 0, devType); if (dwRet) { MCI_UnLoadMciDriver(wmd); @@ -1517,6 +1533,26 @@ static DWORD MCI_Break(UINT wDevID, DWORD dwFlags, LPMCI_BREAK_PARMS lpParms) return dwRet; } +/************************************************************************** + * MCI_Sound [internal] + */ +static DWORD MCI_Sound(UINT wDevID, DWORD dwFlags, LPMCI_SOUND_PARMS lpParms) +{ + DWORD dwRet = 0; + + if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; + + if (dwFlags & MCI_SOUND_NAME) + dwRet = sndPlaySoundA(lpParms->lpstrSoundName, SND_SYNC) ? MMSYSERR_NOERROR : MMSYSERR_ERROR; + else + dwRet = MMSYSERR_ERROR; /* what should be done ??? */ + if (dwFlags & MCI_NOTIFY) + mciDriverNotify((HWND)lpParms->dwCallback, wDevID, + (dwRet == 0) ? MCI_NOTIFY_SUCCESSFUL : MCI_NOTIFY_FAILURE); + + return dwRet; +} + /************************************************************************** * MCI_SendCommand [internal] */ @@ -1564,7 +1600,7 @@ DWORD MCI_SendCommand(UINT wDevID, UINT16 wMsg, DWORD dwParam1, dwRet = MCI_SysInfo(wDevID, dwParam1, (LPMCI_SYSINFO_PARMSA)dwParam2); pFnMciUnMapMsg16To32A(0, wMsg, dwParam2); break; - default: break; /* so that gcc doesnot bark */ + default: break; /* so that gcc does not bark */ } } break; @@ -1583,9 +1619,18 @@ DWORD MCI_SendCommand(UINT wDevID, UINT16 wMsg, DWORD dwParam1, } break; case MCI_SOUND: - /* FIXME: it seems that MCI_SOUND needs the same handling as MCI_BREAK - * but I couldn't get any doc on this MCI message - */ + if (bFrom32) { + dwRet = MCI_Sound(wDevID, dwParam1, (LPMCI_SOUND_PARMS)dwParam2); + } else if (pFnMciMapMsg16To32A) { + switch (pFnMciMapMsg16To32A(0, wMsg, &dwParam2)) { + case WINMM_MAP_OK: + case WINMM_MAP_OKMEM: + dwRet = MCI_Sound(wDevID, dwParam1, (LPMCI_SOUND_PARMS)dwParam2); + pFnMciUnMapMsg16To32A(0, wMsg, dwParam2); + break; + default: break; /* so that gcc does not bark */ + } + } break; default: if (wDevID == MCI_ALL_DEVICE_ID) { diff --git a/reactos/lib/winmm/message16.c b/reactos/lib/winmm/message16.c index 475c988d18a..faaca59a850 100644 --- a/reactos/lib/winmm/message16.c +++ b/reactos/lib/winmm/message16.c @@ -1995,6 +1995,20 @@ static WINMM_MapType MCI_MapMsg16To32A(WORD uDevType, WORD wMsg, DWORD* lParam) *lParam = (DWORD)msip32a; } return WINMM_MAP_OKMEM; + case MCI_SOUND: + { + LPMCI_SOUND_PARMS mbp32 = HeapAlloc(GetProcessHeap(), 0, sizeof(MCI_SOUND_PARMS)); + LPMCI_SOUND_PARMS16 mbp16 = MapSL(*lParam); + + if (mbp32) { + mbp32->dwCallback = mbp16->dwCallback; + mbp32->lpstrSoundName = MapSL(mbp16->lpstrSoundName); + } else { + return WINMM_MAP_NOMEM; + } + *lParam = (DWORD)mbp32; + } + return WINMM_MAP_OKMEM; case DRV_LOAD: case DRV_ENABLE: case DRV_OPEN: @@ -2065,6 +2079,7 @@ static WINMM_MapType MCI_UnMapMsg16To32A(WORD uDevType, WORD wMsg, DWORD lParam case MCI_ESCAPE: case MCI_INFO: case MCI_SYSINFO: + case MCI_SOUND: HeapFree(GetProcessHeap(), 0, (LPVOID)lParam); return WINMM_MAP_OK; case MCI_OPEN: @@ -2454,6 +2469,7 @@ static WINMM_MapType MCI_MapMsg32ATo16(WORD uDevType, WORD wMsg, DWORD dwFlags, break; /* case MCI_SETTIMECODE:*/ /* case MCI_SIGNAL:*/ + /* case MCI_SOUND:*/ case MCI_SPIN: size = sizeof(MCI_SET_PARMS); break; @@ -2653,6 +2669,7 @@ static WINMM_MapType MCI_UnMapMsg32ATo16(WORD uDevType, WORD wMsg, DWORD dwFlag break; /* case MCI_SETTIMECODE:*/ /* case MCI_SIGNAL:*/ + /* case MCI_SOUND:*/ case MCI_SPIN: break; case MCI_STATUS: diff --git a/reactos/lib/winmm/mmio.c b/reactos/lib/winmm/mmio.c index f588690e527..d6736dd53fa 100644 --- a/reactos/lib/winmm/mmio.c +++ b/reactos/lib/winmm/mmio.c @@ -633,7 +633,12 @@ HMMIO MMIO_Open(LPSTR szFileName, MMIOINFO* refmminfo, DWORD dwOpenFlags, /* Handle any unhandled/error case. Assume DOS file */ if (wm->info.fccIOProc == 0) wm->info.fccIOProc = FOURCC_DOS; - if (!(wm->ioProc = MMIO_FindProcNode(wm->info.fccIOProc))) goto error2; + if (!(wm->ioProc = MMIO_FindProcNode(wm->info.fccIOProc))) { + /* If not found, retry with FOURCC_DOS */ + wm->info.fccIOProc = FOURCC_DOS; + if (!(wm->ioProc = MMIO_FindProcNode(wm->info.fccIOProc))) + goto error2; + } wm->bTmpIOProc = FALSE; } /* if just the four character code is present, look up IO proc */ diff --git a/reactos/lib/winmm/winmm_res.rc b/reactos/lib/winmm/winmm_res.rc index a6a4fca1af0..dc30d98fd05 100644 --- a/reactos/lib/winmm/winmm_res.rc +++ b/reactos/lib/winmm/winmm_res.rc @@ -405,7 +405,7 @@ END CDAUDIO RCDATA BEGIN -"atus\0", 0x00000814L, MCI_COMMAND_HEAD, +"status\0", 0x00000814L, MCI_COMMAND_HEAD, "\0", 0x00000002L, MCI_RETURN, "notify\0", 0x00000001L, MCI_FLAG, "wait\0", 0x00000002L, MCI_FLAG, @@ -456,7 +456,7 @@ END SEQUENCER RCDATA BEGIN -"atus\0", 0x00000814L, MCI_COMMAND_HEAD, +"status\0", 0x00000814L, MCI_COMMAND_HEAD, "\0", 0x00000002L, MCI_RETURN, "notify\0", 0x00000001L, MCI_FLAG, "wait\0", 0x00000002L, MCI_FLAG, From 3f429071a7027710b54e693a67b77aca5efd0f23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Fri, 16 Apr 2004 09:11:30 +0000 Subject: [PATCH 0909/1463] Sync to Wine-20040408 svn path=/trunk/; revision=9160 --- reactos/lib/winmm/midimap/midimap.drv.spec | 2 ++ reactos/lib/winmm/midimap/winehq2ros.patch | 0 reactos/lib/winmm/wavemap/msacm.drv.spec | 3 +++ reactos/lib/winmm/wavemap/winehq2ros.patch | 0 4 files changed, 5 insertions(+) create mode 100644 reactos/lib/winmm/midimap/midimap.drv.spec create mode 100644 reactos/lib/winmm/midimap/winehq2ros.patch create mode 100644 reactos/lib/winmm/wavemap/msacm.drv.spec create mode 100644 reactos/lib/winmm/wavemap/winehq2ros.patch diff --git a/reactos/lib/winmm/midimap/midimap.drv.spec b/reactos/lib/winmm/midimap/midimap.drv.spec new file mode 100644 index 00000000000..e83446b9187 --- /dev/null +++ b/reactos/lib/winmm/midimap/midimap.drv.spec @@ -0,0 +1,2 @@ +@ stdcall DriverProc(long long long long long) MIDIMAP_DriverProc +@ stdcall modMessage(long long long long long) MIDIMAP_modMessage diff --git a/reactos/lib/winmm/midimap/winehq2ros.patch b/reactos/lib/winmm/midimap/winehq2ros.patch new file mode 100644 index 00000000000..e69de29bb2d diff --git a/reactos/lib/winmm/wavemap/msacm.drv.spec b/reactos/lib/winmm/wavemap/msacm.drv.spec new file mode 100644 index 00000000000..f9bead0b053 --- /dev/null +++ b/reactos/lib/winmm/wavemap/msacm.drv.spec @@ -0,0 +1,3 @@ +@ stdcall DriverProc(long long long long long) WAVEMAP_DriverProc +@ stdcall widMessage(long long long long long) WAVEMAP_widMessage +@ stdcall wodMessage(long long long long long) WAVEMAP_wodMessage diff --git a/reactos/lib/winmm/wavemap/winehq2ros.patch b/reactos/lib/winmm/wavemap/winehq2ros.patch new file mode 100644 index 00000000000..e69de29bb2d From 956eca91cfd7001ba6aeac80da387eeefe14b0c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Fri, 16 Apr 2004 09:13:21 +0000 Subject: [PATCH 0910/1463] Update status of ported DLLs svn path=/trunk/; revision=9162 --- reactos/doc/README.WINE | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/reactos/doc/README.WINE b/reactos/doc/README.WINE index 38ee5c88284..d94a529d819 100644 --- a/reactos/doc/README.WINE +++ b/reactos/doc/README.WINE @@ -32,24 +32,24 @@ reactos/tools/bin2res # Resource to binary converter The following shared libraries are a 100% port from Winehq sourcs. -reactos/lib/cabinet # Synced to Wine-20040309 -reactos/lib/comctl32 # Synced to Wine-20040309 -reactos/lib/comdlg32 # Synced to Wine-20040309 +reactos/lib/cabinet # Synced to Wine-20040408 +reactos/lib/comctl32 # Synced to Wine-20040408 +reactos/lib/comdlg32 # Synced to Wine-20040408 reactos/lib/imagehlp # Out of sync reactos/lib/imm32 reactos/lib/msvcrt20 -reactos/lib/mpr # Synced to Wine-20040309 -reactos/lib/ole32 # Synced to Wine-20040309 -reactos/lib/oledlg # Synced to Wine-20040309 -reactos/lib/richedit # Synced to Wine-20040309 +reactos/lib/mpr # Synced to Wine-20040408 +reactos/lib/ole32 # Synced to Wine-20040408 +reactos/lib/oledlg # Synced to Wine-20040408 +reactos/lib/richedit # Synced to Wine-20040408 reactos/lib/rpcrt4 # Out of date+Hack. In need of new merge -reactos/lib/shell32 # 2004/01/22: Heavy syncing in progress -reactos/lib/shlwapi # Synced to Wine-20040309 +reactos/lib/shell32 # 2004/04/16: Heavy syncing in progress +reactos/lib/shlwapi # Synced to Wine-20040408 reactos/lib/twain # Out of sync -reactos/lib/unicode # make this go away. Synced to Wine-20040309 -reactos/lib/winmm # Synced to Wine-20040309 -reactos/lib/winmm/midimap # Synced to Wine-20040309 -reactos/lib/winmm/wavemap # Synced to Wine-20040309 +reactos/lib/unicode # make this go away. Synced to Wine-20040408 +reactos/lib/winmm # Synced to Wine-20040408 +reactos/lib/winmm/midimap # Synced to Wine-20040408 +reactos/lib/winmm/wavemap # Synced to Wine-20040408 ReactOS shares the following programs with Winehq. reactos/subsys/system/regedit #Out of sync From dc45d5f3f3e24993a1dae6666325506a46c2a974 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Fri, 16 Apr 2004 13:37:18 +0000 Subject: [PATCH 0911/1463] Implement the GUI setup wizard. svn path=/trunk/; revision=9163 --- reactos/lib/syssetup/Makefile | 4 +- reactos/lib/syssetup/dllmain.c | 15 +- reactos/lib/syssetup/globals.h | 34 +++ reactos/lib/syssetup/install.c | 13 +- reactos/lib/syssetup/resource.h | 21 +- reactos/lib/syssetup/syssetup_En.rc | 72 +++++- reactos/lib/syssetup/wizard.c | 359 ++++++++++++++++++++++++++++ 7 files changed, 502 insertions(+), 16 deletions(-) create mode 100644 reactos/lib/syssetup/globals.h create mode 100644 reactos/lib/syssetup/wizard.c diff --git a/reactos/lib/syssetup/Makefile b/reactos/lib/syssetup/Makefile index e5c237bcbcb..0506b5eb261 100644 --- a/reactos/lib/syssetup/Makefile +++ b/reactos/lib/syssetup/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.6 2004/03/21 14:37:18 navaraf Exp $ +# $Id: Makefile,v 1.7 2004/04/16 13:37:18 ekohl Exp $ PATH_TO_TOP = ../.. @@ -17,7 +17,7 @@ TARGET_RCFLAGS += -D__USE_W32API -D_WIN32_IE=0x0500 TARGET_LFLAGS = -nostartfiles -nostdlib -TARGET_OBJECTS = dllmain.o install.o logfile.o +TARGET_OBJECTS = dllmain.o install.o logfile.o wizard.o # wizard.o include $(PATH_TO_TOP)/rules.mak diff --git a/reactos/lib/syssetup/dllmain.c b/reactos/lib/syssetup/dllmain.c index cc9485bdf73..eaf0f9d2f30 100644 --- a/reactos/lib/syssetup/dllmain.c +++ b/reactos/lib/syssetup/dllmain.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: dllmain.c,v 1.2 2004/03/21 14:37:19 navaraf Exp $ +/* $Id: dllmain.c,v 1.3 2004/04/16 13:37:18 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -30,8 +30,14 @@ #include #include +#include "globals.h" + + /* GLOBALS *******************************************************************/ +HINSTANCE hDllInstance; + + /* FUNCTIONS *****************************************************************/ BOOL STDCALL @@ -39,8 +45,11 @@ DllMain (HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { - if (dwReason == DLL_PROCESS_ATTACH) - InitCommonControls(); + if (dwReason == DLL_PROCESS_ATTACH) + { + InitCommonControls(); + hDllInstance = hInstance; + } return TRUE; } diff --git a/reactos/lib/syssetup/globals.h b/reactos/lib/syssetup/globals.h new file mode 100644 index 00000000000..d318eb5c99d --- /dev/null +++ b/reactos/lib/syssetup/globals.h @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2004 Eric Kohl + * + * 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. + */ + +typedef struct _SETUPDATA +{ + TCHAR OwnerName[51]; + TCHAR OwnerOrganization[51]; + TCHAR ComputerName[MAX_COMPUTERNAME_LENGTH + 1]; /* max. 63 characters */ + TCHAR AdminPassword[15]; /* max. 14 characters */ + +} SETUPDATA, *PSETUPDATA; + + +extern HINSTANCE hDllInstance; + +/* wizard.c */ +VOID InstallWizard (VOID); + +/* EOF */ diff --git a/reactos/lib/syssetup/install.c b/reactos/lib/syssetup/install.c index 65c5d66ed69..67b9068a277 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.10 2004/04/09 18:27:10 weiden Exp $ +/* $Id: install.c,v 1.11 2004/04/16 13:37:18 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -35,14 +35,12 @@ #include #include +#include "globals.h" #include "resource.h" // #define NO_GUI #define VMWINST -#if 0 -VOID Wizard (VOID); -#endif /* userenv.dll */ BOOL WINAPI InitializeProfiles (VOID); @@ -289,15 +287,16 @@ InstallReactOS (HINSTANCE hInstance) RtlFreeSid (AdminSid); RtlFreeSid (DomainSid); -#if 0 - Wizard (); +#if 1 + InstallWizard (); #endif #ifdef VMWINST RunVMWInstall(); #endif DialogBox( - GetModuleHandle(TEXT("syssetup.dll")), +// GetModuleHandle(TEXT("syssetup.dll")), + hDllInstance, MAKEINTRESOURCE(IDD_RESTART), NULL, RestartDlgProc); diff --git a/reactos/lib/syssetup/resource.h b/reactos/lib/syssetup/resource.h index 08113f24434..616a6e9c70b 100644 --- a/reactos/lib/syssetup/resource.h +++ b/reactos/lib/syssetup/resource.h @@ -19,7 +19,24 @@ #ifndef RESOURCE_H #define RESOURCE_H -#define IDD_RESTART 1001 -#define IDC_RESTART_PROGRESS 1002 +#define IDC_STATIC -1 + +#define IDD_WELCOMEPAGE 1000 + +#define IDD_OWNERPAGE 1001 +#define IDC_OWNERNAME 1002 +#define IDC_OWNERORGANIZATION 1003 + +#define IDD_COMPUTERPAGE 1004 +#define IDC_COMPUTERNAME 1005 +#define IDC_ADMINPASSWORD1 1006 +#define IDC_ADMINPASSWORD2 1007 + + +#define IDD_FINISHPAGE 1050 + + +#define IDD_RESTART 2000 +#define IDC_RESTART_PROGRESS 2001 #endif /* RESOURCE_H */ diff --git a/reactos/lib/syssetup/syssetup_En.rc b/reactos/lib/syssetup/syssetup_En.rc index 9754203df54..379470b6446 100644 --- a/reactos/lib/syssetup/syssetup_En.rc +++ b/reactos/lib/syssetup/syssetup_En.rc @@ -1,5 +1,6 @@ /* * Copyright (C) 2004 Filip Navara + * Copyright (C) 2004 Eric Kohl * * 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 @@ -18,14 +19,81 @@ LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT + +IDD_WELCOMEPAGE DIALOG DISCARDABLE 0, 0, 317, 193 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "ReactOS Setup" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Welcome to the ReactOS Setup Wizard.", IDC_STATIC, 115, 9, 189, 31 + LTEXT "This wizard installs ReactOS on your computer. The wizard "\ + "needs to gather some information about you and your computer "\ + "to set up ReactOS properly.", IDC_STATIC, 115, 50, 189, 100 + LTEXT "Click Next to continue with Setup.", IDC_STATIC, 115, 160, 189, 31 +END + + +IDD_OWNERPAGE DIALOG DISCARDABLE 0, 0, 317, 143 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "ReactOS Setup" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Type your full name and the name of your company or organization.", + IDC_STATIC, 54, 7, 242, 21 + LTEXT "Na&me:", IDC_STATIC, 54, 37, 44, 8 + EDITTEXT IDC_OWNERNAME, 132, 35, 163, 14, WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL + LTEXT "&Organization:", IDC_STATIC, 54, 57, 44, 8 + EDITTEXT IDC_OWNERORGANIZATION, 132, 55, 163, 14, WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL +END + + +IDD_COMPUTERPAGE DIALOG DISCARDABLE 0, 0, 317, 143 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "ReactOS Setup" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Type a name for your computer that is 63 characters or less. "\ + "If you are on a network, your computer name must be unique.", + IDC_STATIC, 54, 7, 250, 24 + LTEXT "&Computer Name:", IDC_STATIC, 54, 38, 75, 8 + EDITTEXT IDC_COMPUTERNAME, 132, 35, 163, 14, WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL | ES_UPPERCASE + LTEXT "Setup will create a user account on your computer called Administrator. "\ + "You can use this account if you need full access to your computer.", + IDC_STATIC, 54, 57, 250, 25 + LTEXT "Type an Administrator Password that is 14 characters or less.", + IDC_STATIC, 54, 87, 250, 8 + LTEXT "&Administrator Password:", IDC_STATIC, 54, 104, 75, 8 + EDITTEXT IDC_ADMINPASSWORD1, 132, 101, 172, 14, WS_VISIBLE | WS_TABSTOP | ES_PASSWORD + LTEXT "C&onfirm Password:", IDC_STATIC, 54, 123, 75, 8 + EDITTEXT IDC_ADMINPASSWORD2, 132, 120, 172, 14, WS_VISIBLE | WS_TABSTOP | ES_PASSWORD +END + + +IDD_FINISHPAGE DIALOG DISCARDABLE 0, 0, 317, 193 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Completing ReactOS Setup" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Completing the ReactOS Setup Wizard",IDC_STATIC,115,9,195,37 + LTEXT "You have successfully completed ReactOS Setup.\n\n" \ + "When you click Finish, your computer will restart.", IDC_STATIC, 115, 58, 195, 100 + LTEXT "If there is a CD in a drive, remove it. Then, to restart "\ + "your computer, click Finish.", IDC_STATIC, 115, 160, 195, 31 +END + + IDD_RESTART DIALOG 6, 18, 245, 116 STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION CAPTION "ReactOS Installation" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Installation of ReactOS was successfully completed.", -1, 13, 12, 212, 16 - LTEXT "In order to continue, the installation program needs to restart your computer. The computer will be automatically restarted in 15 seconds or if you press the Restart button.", -1, 13, 33, 212, 32 + LTEXT "Installation of ReactOS was successfully completed.", IDC_STATIC, 13, 12, 212, 16 + LTEXT "In order to continue, the installation program needs to restart your computer. "\ + "The computer will be automatically restarted in 15 seconds or if you press the "\ + "Restart button.", IDC_STATIC, 13, 33, 212, 32 /* GROUPBOX "", -1, 7, 3, 231, 106 */ CONTROL "", IDC_RESTART_PROGRESS, "msctls_progress32", PBS_SMOOTH | WS_CHILD | WS_VISIBLE | WS_BORDER, 13, 70, 212, 8 PUSHBUTTON "&Restart", IDOK, 98, 87, 50, 14 END + +/* EOF */ diff --git a/reactos/lib/syssetup/wizard.c b/reactos/lib/syssetup/wizard.c new file mode 100644 index 00000000000..b2b69a97153 --- /dev/null +++ b/reactos/lib/syssetup/wizard.c @@ -0,0 +1,359 @@ +/* + * 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: wizard.c,v 1.1 2004/04/16 13:37:18 ekohl Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * PURPOSE: System setup + * FILE: lib/syssetup/wizard.c + * PROGRAMER: Eric Kohl (ekohl@rz-online.de) + */ + +/* INCLUDES *****************************************************************/ + +#include +#include + +#include +#include + +#include + +#include "globals.h" +#include "resource.h" + + +/* GLOBALS ******************************************************************/ + +static SETUPDATA SetupData; + + +/* FUNCTIONS ****************************************************************/ + + +BOOL CALLBACK +WelcomeDlgProc(HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + switch (uMsg) + { + case WM_INITDIALOG: + { + HWND hwndControl; + DWORD dwStyle; + + /* Hide the system menu */ + hwndControl = GetParent(hwndDlg); + dwStyle = GetWindowLong(hwndControl, GWL_STYLE); + SetWindowLong(hwndControl, GWL_STYLE, dwStyle & ~WS_SYSMENU); + + /* Hide and disable the 'Cancel' button */ + hwndControl = GetDlgItem(GetParent(hwndDlg), IDCANCEL); + ShowWindow (hwndControl, SW_HIDE); + EnableWindow (hwndControl, FALSE); + } + break; + + + case WM_NOTIFY: + { + LPNMHDR lpnm = (LPNMHDR)lParam; + + switch (lpnm->code) + { + case PSN_SETACTIVE: + /* Enable the Next button */ + PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT); + break; + + default: + break; + } + } + break; + + default: + break; + } + return FALSE; +} + + +INT_PTR CALLBACK +OwnerPageDlgProc(HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + PSETUPDATA SetupData; + + /* Retrieve pointer to the global setup data */ + SetupData = (PSETUPDATA)GetWindowLong (hwndDlg, GWL_USERDATA); + + switch (uMsg) + { + case WM_INITDIALOG: + { + /* Save pointer to the global setup data */ + SetupData = (PSETUPDATA)((LPPROPSHEETPAGE)lParam)->lParam; + SetWindowLong(hwndDlg, GWL_USERDATA, (LONG)SetupData); + + SendDlgItemMessage(hwndDlg, IDC_OWNERNAME, EM_LIMITTEXT, 50, 0); + SendDlgItemMessage(hwndDlg, IDC_OWNERORGANIZATION, EM_LIMITTEXT, 50, 0); + } + break; + + + case WM_NOTIFY: + { + LPNMHDR lpnm = (LPNMHDR)lParam; + + switch (lpnm->code) + { + case PSN_SETACTIVE: + /* Enable the Back and Next buttons */ + PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_NEXT); + break; + + case PSN_WIZNEXT: + if (GetDlgItemText(hwndDlg, IDC_OWNERNAME, SetupData->OwnerName, 50) == 0) + { + MessageBox (hwndDlg, + "Setup cannot continue until you enter your name.", + "ReactOS Setup", + MB_ICONERROR | MB_OK); + return -1; + } + GetDlgItemText(hwndDlg, IDC_OWNERORGANIZATION, SetupData->OwnerOrganization, 50); + break; + + default: + break; + } + } + break; + + default: + break; + } + + return 0; +} + + +BOOL CALLBACK +ComputerPageDlgProc(HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + PSETUPDATA SetupData; + TCHAR Password1[15]; + TCHAR Password2[15]; + + /* Retrieve pointer to the global setup data */ + SetupData = (PSETUPDATA)GetWindowLong (hwndDlg, GWL_USERDATA); + + switch (uMsg) + { + case WM_INITDIALOG: + { + DWORD Length; + + /* Save pointer to the global setup data */ + SetupData = (PSETUPDATA)((LPPROPSHEETPAGE)lParam)->lParam; + SetWindowLong(hwndDlg, GWL_USERDATA, (LONG)SetupData); + + /* Retrieve current computer name */ + Length = MAX_COMPUTERNAME_LENGTH + 1; + GetComputerNameA(SetupData->ComputerName, &Length); + + /* Display current computer name */ + SetDlgItemTextA(hwndDlg, IDC_COMPUTERNAME, SetupData->ComputerName); + + /* Set text limits */ + SendDlgItemMessage(hwndDlg, IDC_COMPUTERNAME, EM_LIMITTEXT, 64, 0); + SendDlgItemMessage(hwndDlg, IDC_ADMINPASSWORD1, EM_LIMITTEXT, 14, 0); + SendDlgItemMessage(hwndDlg, IDC_ADMINPASSWORD2, EM_LIMITTEXT, 14, 0); + } + break; + + + case WM_NOTIFY: + { + LPNMHDR lpnm = (LPNMHDR)lParam; + + switch (lpnm->code) + { + case PSN_SETACTIVE: + /* Enable the Back and Next buttons */ + PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_NEXT); + break; + + case PSN_WIZNEXT: + if (GetDlgItemText(hwndDlg, IDC_COMPUTERNAME, SetupData->ComputerName, 64) == 0) + { + MessageBox (hwndDlg, + "Setup cannot continue until you enter the name of your computer.", + "ReactOS Setup", + MB_ICONERROR | MB_OK); + return -1; + } + + /* FIXME: check computer name for invalid characters */ + + /* Check admin passwords */ + GetDlgItemText(hwndDlg, IDC_ADMINPASSWORD1, Password1, 15); + GetDlgItemText(hwndDlg, IDC_ADMINPASSWORD2, Password2, 15); + if (_tcscmp (Password1, Password2)) + { + MessageBox (hwndDlg, + "The passwords you entered do not match. Please enter "\ + "the desired password again.", + "ReactOS Setup", + MB_ICONERROR | MB_OK); + return -1; + } + + /* FIXME: check password for invalid characters */ + + _tcscpy (SetupData->AdminPassword, Password1); + break; + + default: + break; + } + } + break; + + default: + break; + } + return FALSE; +} + + +BOOL CALLBACK +FinishDlgProc(HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + + switch (uMsg) + { + case WM_INITDIALOG: + break; + + case WM_NOTIFY: + { + LPNMHDR lpnm = (LPNMHDR)lParam; + + switch (lpnm->code) + { + case PSN_SETACTIVE: + /* Enable the correct buttons on for the active page */ + PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_FINISH); + break; + + case PSN_WIZBACK: + /* Handle a Back button click, if necessary */ + break; + + case PSN_WIZFINISH: + /* Handle a Finish button click, if necessary */ + break; + + default: + break; + } + } + break; + + default: + break; + } + + return 0; +} + + +VOID +InstallWizard (VOID) +{ + PROPSHEETHEADER psh; + HPROPSHEETPAGE ahpsp[4]; + PROPSHEETPAGE psp; +// SHAREDWIZDATA wizdata; + + /* Clear setup data */ + ZeroMemory (&SetupData, sizeof(SETUPDATA)); + + /* Create the Welcome page */ + ZeroMemory (&psp, sizeof(PROPSHEETPAGE)); + psp.dwSize = sizeof(PROPSHEETPAGE); + psp.dwFlags = PSP_DEFAULT; // | PSP_HIDEHEADER; + psp.hInstance = hDllInstance; + psp.lParam = (LPARAM)&SetupData; + psp.pfnDlgProc = WelcomeDlgProc; + psp.pszTemplate = MAKEINTRESOURCE(IDD_WELCOMEPAGE); + ahpsp[0] = CreatePropertySheetPage(&psp); + + /* Create the Owner page */ + psp.dwFlags = PSP_DEFAULT; // | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE; +// psp.pszHeaderTitle = MAKEINTRESOURCE(IDS_TITLE2); +// psp.pszHeaderSubTitle = MAKEINTRESOURCE(IDS_SUBTITLE2); + psp.pszTemplate = MAKEINTRESOURCE(IDD_OWNERPAGE); + psp.pfnDlgProc = OwnerPageDlgProc; + ahpsp[1] = CreatePropertySheetPage(&psp); + + /* Create the Computer page */ + psp.dwFlags = PSP_DEFAULT; // | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE; +// psp.pszHeaderTitle = MAKEINTRESOURCE(IDS_TITLE1); +// psp.pszHeaderSubTitle = MAKEINTRESOURCE(IDS_SUBTITLE1); + psp.pfnDlgProc = ComputerPageDlgProc; + psp.pszTemplate = MAKEINTRESOURCE(IDD_COMPUTERPAGE); + ahpsp[2] = CreatePropertySheetPage(&psp); + + + + /* Create the Finish page */ + psp.dwFlags = PSP_DEFAULT; // | PSP_HIDEHEADER; + psp.pfnDlgProc = FinishDlgProc; + psp.pszTemplate = MAKEINTRESOURCE(IDD_FINISHPAGE); + ahpsp[3] = CreatePropertySheetPage(&psp); + + /* Create the property sheet */ + psh.dwSize = sizeof(PROPSHEETHEADER); + psh.dwFlags = PSH_WIZARD; //PSH_WIZARD97 | PSH_WATERMARK | PSH_HEADER; + psh.hInstance = hDllInstance; + psh.hwndParent = NULL; + psh.nPages = 4; + psh.nStartPage = 0; + psh.phpage = ahpsp; +// psh.pszbmWatermark = MAKEINTRESOURCE(IDB_WATERMARK); +// psh.pszbmHeader = MAKEINTRESOURCE(IDB_BANNER); + + /* Display the wizard */ + PropertySheetA (&psh); +} + +/* EOF */ From f269c53d06a3692baa32d09de0a9ee1e5e803f56 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Fri, 16 Apr 2004 13:39:46 +0000 Subject: [PATCH 0912/1463] Clear data buffer before sending the INQUIRY command. svn path=/trunk/; revision=9164 --- reactos/drivers/storage/scsiport/scsiport.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/reactos/drivers/storage/scsiport/scsiport.c b/reactos/drivers/storage/scsiport/scsiport.c index af6653d5def..74ae5bdeb89 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.53 2004/04/07 09:21:01 hbirr Exp $ +/* $Id: scsiport.c,v 1.54 2004/04/16 13:39:46 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -901,14 +901,14 @@ ScsiPortInitialize(IN PVOID Argument1, MappedIrq = HalGetInterruptVector(PortConfig->AdapterInterfaceType, PortConfig->SystemIoBusNumber, PortConfig->BusInterruptLevel, -#if 1 +#if 1 /* * FIXME: * Something is wrong in our interrupt conecting code. * The promise Ultra100TX driver returns 0 for BusInterruptVector * and a nonzero value for BusInterruptLevel. The driver does only * work with this fix. - */ + */ PortConfig->BusInterruptLevel, #else PortConfig->BusInterruptVector, @@ -1872,6 +1872,8 @@ SpiScanAdapter (IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension) Cdb->CDB6INQUIRY.LogicalUnitNumber = Lun; + RtlZeroMemory(Srb.DataBuffer, 256); + LunExtension = SpiAllocateLunExtension (DeviceExtension, Bus, Target, @@ -1885,7 +1887,9 @@ SpiScanAdapter (IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension) Status = SpiSendInquiry (DeviceExtension->DeviceObject, &Srb); + DPRINT ("Target %lu Lun %lu", Target, Lun); DPRINT ("Status %lx Srb.SrbStatus %x\n", Status, Srb.SrbStatus); + DPRINT ("DeviceTypeQualifier %x\n", ((PINQUIRYDATA)Srb.DataBuffer)->DeviceTypeQualifier); if (NT_SUCCESS(Status) && (Srb.SrbStatus == SRB_STATUS_SUCCESS || @@ -2544,7 +2548,7 @@ SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, * Irp->Tail.Overlay.DriverContext[2] -> LunExtension * Irp->Tail.Overlay.DriverContext[3] -> current Srb (original or sense request) * IoStack->Parameters.Scsi.Srb -> original Srb - */ + */ PIO_STACK_LOCATION IrpStack; PSCSI_PORT_LUN_EXTENSION LunExtension; PLIST_ENTRY ListEntry; From c4bde9bbf1f61855b40ff9aa851e7646df631296 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Fri, 16 Apr 2004 18:53:53 +0000 Subject: [PATCH 0913/1463] properly remove mousemove messages svn path=/trunk/; revision=9165 --- reactos/subsys/win32k/eng/mouse.c | 10 +++++----- reactos/subsys/win32k/include/msgqueue.h | 2 +- reactos/subsys/win32k/ntuser/msgqueue.c | 22 +++++++++++----------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/reactos/subsys/win32k/eng/mouse.c b/reactos/subsys/win32k/eng/mouse.c index 274a8b0107d..171100f5f53 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.65 2004/04/09 20:03:16 navaraf Exp $ +/* $Id: mouse.c,v 1.66 2004/04/16 18:53:53 weiden Exp $ * * PROJECT: ReactOS kernel * PURPOSE: Mouse @@ -297,7 +297,7 @@ MouseMoveCursor(LONG X, LONG Y) Msg.time = TickCount; Msg.pt.x = X; Msg.pt.y = Y; - MsqInsertSystemMessage(&Msg, TRUE); + MsqInsertSystemMessage(&Msg); res = TRUE; } @@ -454,7 +454,7 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount) } Msg.wParam = CurInfo->ButtonsDown; - MsqInsertSystemMessage(&Msg, FALSE); + MsqInsertSystemMessage(&Msg); } } } @@ -467,7 +467,7 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount) Msg.pt.x = CurInfo->x; Msg.pt.y = CurInfo->y; Msg.lParam = MAKELPARAM(CurInfo->x, CurInfo->y); - MsqInsertSystemMessage(&Msg, TRUE); + MsqInsertSystemMessage(&Msg); if (!CurInfo->SafetySwitch && 0 == CurInfo->SafetyRemoveCount && ((mouse_ox != CurInfo->x) || (mouse_oy != CurInfo->y))) @@ -489,7 +489,7 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount) Msg.lParam = MAKELPARAM(CurInfo->x, CurInfo->y); Msg.pt.x = CurInfo->x; Msg.pt.y = CurInfo->y; - MsqInsertSystemMessage(&Msg, FALSE); + MsqInsertSystemMessage(&Msg); } ObDereferenceObject(InputWindowStation); diff --git a/reactos/subsys/win32k/include/msgqueue.h b/reactos/subsys/win32k/include/msgqueue.h index 47fea2ba92a..bc9f77a43d7 100644 --- a/reactos/subsys/win32k/include/msgqueue.h +++ b/reactos/subsys/win32k/include/msgqueue.h @@ -172,7 +172,7 @@ MsqPostKeyboardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam); VOID FASTCALL MsqPostHotKeyMessage(PVOID Thread, HWND hWnd, WPARAM wParam, LPARAM lParam); VOID FASTCALL -MsqInsertSystemMessage(MSG* Msg, BOOL RemMouseMoveMsg); +MsqInsertSystemMessage(MSG* Msg); BOOL FASTCALL MsqIsDblClk(LPMSG Msg, BOOL Remove); HWND FASTCALL diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index 3b20bc78d56..95e025ccb85 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.89 2004/04/16 01:27:44 weiden Exp $ +/* $Id: msgqueue.c,v 1.90 2004/04/16 18:53:53 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -138,7 +138,7 @@ MsqInitializeImpl(VOID) } VOID FASTCALL -MsqInsertSystemMessage(MSG* Msg, BOOL RemMouseMoveMsg) +MsqInsertSystemMessage(MSG* Msg) { LARGE_INTEGER LargeTickCount; KIRQL OldIrql; @@ -150,7 +150,7 @@ MsqInsertSystemMessage(MSG* Msg, BOOL RemMouseMoveMsg) IntLockSystemMessageQueue(OldIrql); /* only insert WM_MOUSEMOVE messages if not already in system message queue */ - if((Msg->message == WM_MOUSEMOVE) && RemMouseMoveMsg) + if(Msg->message == WM_MOUSEMOVE) mmov = SystemMessageQueueMouseMove; if(mmov != (ULONG)-1) @@ -240,7 +240,7 @@ MsqIsDblClk(LPMSG Msg, BOOL Remove) BOOL STATIC STDCALL MsqTranslateMouseMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, UINT FilterLow, UINT FilterHigh, - PUSER_MESSAGE Message, BOOL Remove, PBOOL Freed, BOOL RemoveWhenFreed, + PUSER_MESSAGE Message, BOOL Remove, PBOOL Freed, PWINDOW_OBJECT ScopeWin, PPOINT ScreenPoint, BOOL FromGlobalQueue) { USHORT Msg = Message->Msg.message; @@ -268,9 +268,13 @@ MsqTranslateMouseMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, UINT Filte if (Window == NULL) { - if(RemoveWhenFreed) + if(!FromGlobalQueue) { RemoveEntryList(&Message->ListEntry); + if(MessageQueue->MouseMoveMsg == Message) + { + MessageQueue->MouseMoveMsg = NULL; + } } ExFreePool(Message); *Freed = TRUE; @@ -452,17 +456,13 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, Current->Msg.message <= WM_MOUSELAST) { Accept = MsqTranslateMouseMessage(MessageQueue, hWnd, FilterLow, FilterHigh, - Current, Remove, &Freed, TRUE, + Current, Remove, &Freed, DesktopWindow, &ScreenPoint, FALSE); if (Accept) { if (Remove) { RemoveEntryList(&Current->ListEntry); - if(MessageQueue->MouseMoveMsg == Current) - { - MessageQueue->MouseMoveMsg = NULL; - } } IntUnLockHardwareMessageQueue(MessageQueue); IntUnLockSystemHardwareMessageQueueLock(FALSE); @@ -520,7 +520,7 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, const ULONG ActiveStamp = HardwareMessageQueueStamp; /* Translate the message. */ Accept = MsqTranslateMouseMessage(MessageQueue, hWnd, FilterLow, FilterHigh, - Current, Remove, &Freed, FALSE, + Current, Remove, &Freed, DesktopWindow, &ScreenPoint, TRUE); if (Accept) { From b6da18c3a0f88e87f43d21450a9839b7a0a54a81 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 16 Apr 2004 20:52:51 +0000 Subject: [PATCH 0914/1463] Force resize before calling RBN_HEIGHTCHANGE notification. svn path=/trunk/; revision=9166 --- reactos/lib/comctl32/rebar.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/reactos/lib/comctl32/rebar.c b/reactos/lib/comctl32/rebar.c index defe8237b9d..9072f0314a7 100644 --- a/reactos/lib/comctl32/rebar.c +++ b/reactos/lib/comctl32/rebar.c @@ -1186,11 +1186,6 @@ REBAR_ForceResize (REBAR_INFO *infoPtr) INT xedge = GetSystemMetrics(SM_CXEDGE); INT yedge = GetSystemMetrics(SM_CYEDGE); - /* TEST TEST TEST */ - GetWindowRect (infoPtr->hwndSelf, &rc); - /* END TEST END TEST END TEST */ - - GetClientRect (infoPtr->hwndSelf, &rc); TRACE( " old [%ld x %ld], new [%ld x %ld], client [%ld x %ld]\n", @@ -1387,6 +1382,12 @@ REBAR_MoveChildWindows (REBAR_INFO *infoPtr, UINT start, UINT endplus) if (infoPtr->fStatus & NTF_HGHTCHG) { infoPtr->fStatus &= ~NTF_HGHTCHG; + /* + * We need to force a resize here, because some applications + * try to get the rebar size during processing of the + * RBN_HEIGHTCHANGE notification. + */ + REBAR_ForceResize (infoPtr); REBAR_Notify (&heightchange, infoPtr, RBN_HEIGHTCHANGE); } From fb5087e80cf3ccd44fb0e1c3002c88ce1df4150e Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Fri, 16 Apr 2004 21:50:26 +0000 Subject: [PATCH 0915/1463] fixed missing window dereferences and a minor thread-safety bug svn path=/trunk/; revision=9167 --- reactos/subsys/win32k/ntuser/prop.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/prop.c b/reactos/subsys/win32k/ntuser/prop.c index fe7c5b0f686..0d76d267571 100644 --- a/reactos/subsys/win32k/ntuser/prop.c +++ b/reactos/subsys/win32k/ntuser/prop.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: prop.c,v 1.9 2004/02/24 13:27:03 weiden Exp $ +/* $Id: prop.c,v 1.10 2004/04/16 21:50:26 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -193,12 +193,12 @@ NtUserGetProp(HWND hWnd, ATOM Atom) IntLockWindowProperties(WindowObject); Prop = IntGetProp(WindowObject, Atom); - IntUnLockWindowProperties(WindowObject); if (Prop != NULL) { Data = Prop->Data; } - + IntUnLockWindowProperties(WindowObject); + IntReleaseWindowObject(WindowObject); return(Data); } @@ -229,19 +229,20 @@ IntSetProp(PWINDOW_OBJECT Wnd, ATOM Atom, HANDLE Data) BOOL STDCALL NtUserSetProp(HWND hWnd, ATOM Atom, HANDLE Data) { - PWINDOW_OBJECT Wnd; + PWINDOW_OBJECT WindowObject; BOOL ret; - if (!(Wnd = IntGetWindowObject(hWnd))) + if (!(WindowObject = IntGetWindowObject(hWnd))) { SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return FALSE; } - IntLockWindowProperties(Wnd); - ret = IntSetProp(Wnd, Atom, Data); - IntUnLockWindowProperties(Wnd); + IntLockWindowProperties(WindowObject); + ret = IntSetProp(WindowObject, Atom, Data); + IntUnLockWindowProperties(WindowObject); + IntReleaseWindowObject(WindowObject); return ret; } From b4ff26c3b6c59671f3a74868bfa5267f7bda94d8 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 16 Apr 2004 23:44:19 +0000 Subject: [PATCH 0916/1463] Temporary revert this patch, because it causes a lot of crashes. I sent a message to wine-devel describing the problem. Robert Shearman - Fix subclassing to support nested messages. svn path=/trunk/; revision=9168 --- reactos/lib/comctl32/commctrl.c | 34 +++------------------------------ 1 file changed, 3 insertions(+), 31 deletions(-) diff --git a/reactos/lib/comctl32/commctrl.c b/reactos/lib/comctl32/commctrl.c index ad242dfdd91..e46729fe387 100644 --- a/reactos/lib/comctl32/commctrl.c +++ b/reactos/lib/comctl32/commctrl.c @@ -114,7 +114,6 @@ extern void TREEVIEW_Unregister(void); extern void UPDOWN_Register(void); extern void UPDOWN_Unregister(void); -static LRESULT WINAPI SubclassWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); LPSTR COMCTL32_aSubclass = NULL; HMODULE COMCTL32_hModule = 0; @@ -1109,10 +1108,10 @@ BOOL WINAPI SetWindowSubclass (HWND hWnd, SUBCLASSPROC pfnSubclass, /* set window procedure to our own and save the current one */ if (IsWindowUnicode (hWnd)) stack->origproc = (WNDPROC)SetWindowLongW (hWnd, GWL_WNDPROC, - (LONG)SubclassWndProc); + (LONG)DefSubclassProc); else stack->origproc = (WNDPROC)SetWindowLongA (hWnd, GWL_WNDPROC, - (LONG)SubclassWndProc); + (LONG)DefSubclassProc); } else { WNDPROC current; if (IsWindowUnicode (hWnd)) @@ -1120,7 +1119,7 @@ BOOL WINAPI SetWindowSubclass (HWND hWnd, SUBCLASSPROC pfnSubclass, else current = (WNDPROC)GetWindowLongA (hWnd, GWL_WNDPROC); - if (current != SubclassWndProc) { + if (current != DefSubclassProc) { ERR ("Application has subclassed with our procedure, then manually, then with us again. The current implementation can't handle this.\n"); return FALSE; } @@ -1263,33 +1262,6 @@ BOOL WINAPI RemoveWindowSubclass(HWND hWnd, SUBCLASSPROC pfnSubclass, UINT_PTR u } -/*********************************************************************** - * SubclassWndProc (internal) - * - * Window procedure for all subclassed windows. - * Saves the current subclassing stack position to support nested messages - */ - -static LRESULT WINAPI SubclassWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - LPSUBCLASS_INFO stack; - int stackpos; - LRESULT ret; - - /* retrieve our little stack from the Properties */ - stack = (LPSUBCLASS_INFO)GetPropA (hWnd, COMCTL32_aSubclass); - if (!stack) { - ERR ("Our sub classing stack got erased for %p!! Nothing we can do\n", hWnd); - return 0; - } - stackpos = stack->stackpos; - stack->stackpos = stack->stacknum; - ret = DefSubclassProc(hWnd,uMsg,wParam,lParam); - stack->stackpos = stackpos; - return ret; -} - - /*********************************************************************** * DefSubclassProc [COMCTL32.413] * From b656708fccde99f9d162d2b2dee5967eb600816a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sat, 17 Apr 2004 07:32:44 +0000 Subject: [PATCH 0917/1463] Merge back commit from WineHQ svn path=/trunk/; revision=9169 --- reactos/lib/richedit/reader.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/richedit/reader.c b/reactos/lib/richedit/reader.c index 81d61c9a7a4..662433497b8 100644 --- a/reactos/lib/richedit/reader.c +++ b/reactos/lib/richedit/reader.c @@ -124,7 +124,7 @@ int _RTFGetChar(RTF_Info *info) if(CHARLIST_GetNbItems(&info->inputCharList) == 0) { - char buff[10]; + char buff[4096]; long pcb; info->editstream.pfnCallback(info->editstream.dwCookie, buff, sizeof(buff), &pcb); if(pcb == 0) From 61878c60d208a7fe9e7f85efdc44cfa60bdbe424 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sat, 17 Apr 2004 07:41:26 +0000 Subject: [PATCH 0918/1463] - Improved RPC headers. svn path=/trunk/; revision=9170 --- reactos/w32api/include/rpc.h | 6 +++++ reactos/w32api/include/rpcdce.h | 1 + reactos/w32api/include/rpcdcep.h | 7 +++-- reactos/w32api/include/rpcndr.h | 44 ++++++++++++++++++++++++++++++- reactos/w32api/include/rpcproxy.h | 4 +++ 5 files changed, 59 insertions(+), 3 deletions(-) diff --git a/reactos/w32api/include/rpc.h b/reactos/w32api/include/rpc.h index 0e3df5eaf1e..3ca74e9cd3f 100644 --- a/reactos/w32api/include/rpc.h +++ b/reactos/w32api/include/rpc.h @@ -17,6 +17,12 @@ extern "C" { #define RPC_UNICODE_SUPPORTED #endif +#ifdef _RPCRT4_ +#define RPCRTAPI DECLSPEC_EXPORT +#else +#define RPCRTAPI DECLSPEC_IMPORT +#endif + #ifndef __MIDL_USER_DEFINED #define midl_user_allocate MIDL_user_allocate #define midl_user_free MIDL_user_free diff --git a/reactos/w32api/include/rpcdce.h b/reactos/w32api/include/rpcdce.h index f2adce40fed..59599d784f7 100644 --- a/reactos/w32api/include/rpcdce.h +++ b/reactos/w32api/include/rpcdce.h @@ -345,6 +345,7 @@ RPC_STATUS RPC_ENTRY RpcServerInqIf(RPC_IF_HANDLE,UUID*,RPC_MGR_EPV**); RPC_STATUS RPC_ENTRY RpcServerListen(unsigned int,unsigned int,unsigned int); RPC_STATUS RPC_ENTRY RpcServerRegisterIf(RPC_IF_HANDLE,UUID*,RPC_MGR_EPV*); RPC_STATUS RPC_ENTRY RpcServerRegisterIfEx(RPC_IF_HANDLE,UUID*,RPC_MGR_EPV*,unsigned int,unsigned int,RPC_IF_CALLBACK_FN*); +RPC_STATUS RPC_ENTRY RpcServerRegisterIf2(RPC_IF_HANDLE,UUID*,RPC_MGR_EPV*,unsigned int,unsigned int,unsigned int,RPC_IF_CALLBACK_FN*); RPC_STATUS RPC_ENTRY RpcServerUnregisterIf(RPC_IF_HANDLE,UUID*,unsigned int); RPC_STATUS RPC_ENTRY RpcServerUseAllProtseqs(unsigned int,void*); RPC_STATUS RPC_ENTRY RpcServerUseAllProtseqsEx(unsigned int,void*,PRPC_POLICY); diff --git a/reactos/w32api/include/rpcdcep.h b/reactos/w32api/include/rpcdcep.h index c45bc46905e..d6da3e94efa 100644 --- a/reactos/w32api/include/rpcdcep.h +++ b/reactos/w32api/include/rpcdcep.h @@ -60,6 +60,7 @@ typedef struct _RPC_SERVER_INTERFACE { PRPC_PROTSEQ_ENDPOINT RpcProtseqEndpoint; void *DefaultManagerEpv; void const *InterpreterInfo; + unsigned int Flags; } RPC_SERVER_INTERFACE,*PRPC_SERVER_INTERFACE; typedef struct _RPC_CLIENT_INTERFACE { unsigned int Length; @@ -70,6 +71,7 @@ typedef struct _RPC_CLIENT_INTERFACE { PRPC_PROTSEQ_ENDPOINT RpcProtseqEndpoint; unsigned long Reserved; void const *InterpreterInfo; + unsigned int Flags; } RPC_CLIENT_INTERFACE,*PRPC_CLIENT_INTERFACE; typedef void *I_RPC_MUTEX; typedef struct _RPC_TRANSFER_SYNTAX { @@ -77,10 +79,11 @@ typedef struct _RPC_TRANSFER_SYNTAX { unsigned short VersMajor; unsigned short VersMinor; } RPC_TRANSFER_SYNTAX; -typedef long(__stdcall *RPC_BLOCKING_FUNCTION)(void*,void*); +typedef RPC_STATUS (*RPC_BLOCKING_FN)(void*,void*,void*); long __stdcall I_RpcGetBuffer(RPC_MESSAGE*); long __stdcall I_RpcSendReceive(RPC_MESSAGE*); +long __stdcall I_RpcSend(RPC_MESSAGE*); long __stdcall I_RpcFreeBuffer(RPC_MESSAGE*); void __stdcall I_RpcRequestMutex(I_RPC_MUTEX*); void __stdcall I_RpcClearMutex(I_RPC_MUTEX); @@ -110,7 +113,7 @@ void __stdcall I_RpcSsDontSerializeContext(void); long __stdcall I_RpcServerRegisterForwardFunction(RPC_FORWARD_FUNCTION*); long __stdcall I_RpcConnectionInqSockBuffSize(unsigned long*,unsigned long*); long __stdcall I_RpcConnectionSetSockBuffSize(unsigned long,unsigned long); -long __stdcall I_RpcBindingSetAsync(HANDLE,RPC_BLOCKING_FUNCTION); +long __stdcall I_RpcBindingSetAsync(HANDLE,RPC_BLOCKING_FN); long __stdcall I_RpcAsyncSendReceive(RPC_MESSAGE*,void*); long __stdcall I_RpcGetThreadWindowHandle(void**); long __stdcall I_RpcServerThreadPauseListening(void); diff --git a/reactos/w32api/include/rpcndr.h b/reactos/w32api/include/rpcndr.h index 8b728bbb5f5..d1c4eec722b 100644 --- a/reactos/w32api/include/rpcndr.h +++ b/reactos/w32api/include/rpcndr.h @@ -196,7 +196,7 @@ typedef struct _MIDL_STUB_MESSAGE { unsigned long *SizePtrLengthArray; void*pArgQueue; unsigned long dwStubPhase; - unsigned long Reserved[5]; + unsigned long w2kReserved[5]; } MIDL_STUB_MESSAGE,*PMIDL_STUB_MESSAGE; #pragma pack(pop) typedef void*(__RPC_API *GENERIC_BINDING_ROUTINE)(void*); @@ -226,6 +226,37 @@ typedef struct _COMM_FAULT_OFFSETS { short CommOffset; short FaultOffset; } COMM_FAULT_OFFSETS; +typedef unsigned long (__RPC_USER *USER_MARSHAL_SIZING_ROUTINE)(unsigned long *,unsigned long,void *); +typedef unsigned char *(__RPC_USER *USER_MARSHAL_MARSHALLING_ROUTINE)(unsigned long *,unsigned char *,void *); +typedef unsigned char *(__RPC_USER *USER_MARSHAL_UNMARSHALLING_ROUTINE)(unsigned long *,unsigned char *,void *); +typedef void (__RPC_USER *USER_MARSHAL_FREEING_ROUTINE)(unsigned long *,void *); +typedef struct _USER_MARSHAL_ROUTINE_QUADRUPLE { + USER_MARSHAL_SIZING_ROUTINE pfnBufferSize; + USER_MARSHAL_MARSHALLING_ROUTINE pfnMarshall; + USER_MARSHAL_UNMARSHALLING_ROUTINE pfnUnmarshall; + USER_MARSHAL_FREEING_ROUTINE pfnFree; +} USER_MARSHAL_ROUTINE_QUADRUPLE; +typedef void (__RPC_USER *NDR_NOTIFY_ROUTINE)(void); +typedef enum _IDL_CS_CONVERT { + IDL_CS_NO_CONVERT, + IDL_CS_IN_PLACE_CONVERT, + IDL_CS_NEW_BUFFER_CONVERT +} IDL_CS_CONVERT; +typedef void (__RPC_USER *CS_TYPE_NET_SIZE_ROUTINE)(RPC_BINDING_HANDLE,unsigned long,unsigned long,IDL_CS_CONVERT*,unsigned long*,error_status_t*); +typedef void (__RPC_USER *CS_TYPE_LOCAL_SIZE_ROUTINE)(RPC_BINDING_HANDLE,unsigned long,unsigned long,IDL_CS_CONVERT*,unsigned long*,error_status_t*); +typedef void (__RPC_USER *CS_TYPE_TO_NETCS_ROUTINE)(RPC_BINDING_HANDLE,unsigned long,void*,unsigned long,byte*,unsigned long*,error_status_t*); +typedef void (__RPC_USER *CS_TYPE_FROM_NETCS_ROUTINE)(RPC_BINDING_HANDLE,unsigned long,byte*,unsigned long,unsigned long,void*,unsigned long*,error_status_t*); +typedef void (__RPC_USER *CS_TAG_GETTING_ROUTINE)(RPC_BINDING_HANDLE,int,unsigned long*,unsigned long*,unsigned long*,error_status_t*); +typedef struct _NDR_CS_SIZE_CONVERT_ROUTINES { + CS_TYPE_NET_SIZE_ROUTINE pfnNetSize; + CS_TYPE_TO_NETCS_ROUTINE pfnToNetCs; + CS_TYPE_LOCAL_SIZE_ROUTINE pfnLocalSize; + CS_TYPE_FROM_NETCS_ROUTINE pfnFromNetCs; +} NDR_CS_SIZE_CONVERT_ROUTINES; +typedef struct _NDR_CS_ROUTINES { + NDR_CS_SIZE_CONVERT_ROUTINES *pSizeConvertRoutines; + CS_TAG_GETTING_ROUTINE *pTagGettingRoutines; +} NDR_CS_ROUTINES; typedef struct _MIDL_STUB_DESC { void*RpcInterfaceInformation; void*(__RPC_API *pfnAllocate)(unsigned int); @@ -245,6 +276,12 @@ typedef struct _MIDL_STUB_DESC { MALLOC_FREE_STRUCT *pMallocFreeStruct; long MIDLVersion; const COMM_FAULT_OFFSETS *CommFaultOffsets; + const USER_MARSHAL_ROUTINE_QUADRUPLE *aUserMarshalQuadruple; + const NDR_NOTIFY_ROUTINE *NotifyRoutineTable; + ULONG_PTR mFlags; + const NDR_CS_ROUTINES *CsRoutineTables; + void *Reserved4; + ULONG_PTR Reserved5; } MIDL_STUB_DESC; typedef const MIDL_STUB_DESC *PMIDL_STUB_DESC; typedef void*PMIDL_XMIT_TYPE; @@ -467,6 +504,11 @@ void*RPC_ENTRY NdrAllocate(PMIDL_STUB_MESSAGE,unsigned int); void RPC_ENTRY NdrClearOutParameters(PMIDL_STUB_MESSAGE,PFORMAT_STRING,void*); void*RPC_ENTRY NdrOleAllocate(unsigned int); void RPC_ENTRY NdrOleFree(void*); +unsigned char*RPC_ENTRY NdrUserMarshalMarshall(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +unsigned char*RPC_ENTRY NdrUserMarshalUnmarshall(PMIDL_STUB_MESSAGE,unsigned char**,PFORMAT_STRING,unsigned char); +void RPC_ENTRY NdrUserMarshalBufferSize(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); +unsigned long RPC_ENTRY NdrUserMarshalMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING); +void RPC_ENTRY NdrUserMarshalFree(PMIDL_STUB_MESSAGE,unsigned char*,PFORMAT_STRING); #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/rpcproxy.h b/reactos/w32api/include/rpcproxy.h index 5700e541aae..d4fcce533e0 100644 --- a/reactos/w32api/include/rpcproxy.h +++ b/reactos/w32api/include/rpcproxy.h @@ -152,6 +152,10 @@ typedef struct tagCStdStubBuffer { const struct IRpcStubBufferVtbl * lpVtbl; long RefCount; struct IUnknown *pvServerObject; + const struct ICallFactoryVtbl * pCallFactoryVtbl; + const IID * pAsyncIID; + struct IPSFactoryBuffer * pPSFactory; + const struct IReleaseMarshalBuffersVtbl * pRMBVtbl; } CStdStubBuffer; typedef struct tagCStdPSFactoryBuffer { const IPSFactoryBufferVtbl *lpVtbl; From 9e9160f50815de7a857a1bbd25a36d57c85762a5 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 17 Apr 2004 11:00:14 +0000 Subject: [PATCH 0919/1463] fixed some scrollbar issues svn path=/trunk/; revision=9173 --- reactos/lib/user32/windows/nonclient.c | 71 +++- reactos/subsys/win32k/include/scroll.h | 19 +- reactos/subsys/win32k/include/window.h | 5 +- reactos/subsys/win32k/ntuser/scrollbar.c | 423 +++++++++++------------ reactos/subsys/win32k/ntuser/window.c | 29 +- 5 files changed, 296 insertions(+), 251 deletions(-) diff --git a/reactos/lib/user32/windows/nonclient.c b/reactos/lib/user32/windows/nonclient.c index 652511c66a6..62b7b3ece74 100644 --- a/reactos/lib/user32/windows/nonclient.c +++ b/reactos/lib/user32/windows/nonclient.c @@ -67,6 +67,10 @@ Already defined in makefile now. (WindowRect.right - WindowRect.left == ParentClientRect.right) && \ (WindowRect.bottom - WindowRect.top == ParentClientRect.bottom))) +#ifndef STATE_SYSTEM_OFFSCREEN +#define STATE_SYSTEM_OFFSCREEN 0x00010000 +#endif + /* * FIXME: This should be moved to a header */ @@ -83,6 +87,17 @@ extern ATOM AtomInternalPos; /* PRIVATE FUNCTIONS **********************************************************/ +BOOL +IntIsScrollBarVisible(HWND hWnd, INT hBar) +{ + SCROLLBARINFO sbi; + sbi.cbSize = sizeof(SCROLLBARINFO); + if(!NtUserGetScrollBarInfo(hWnd, hBar, &sbi)) + return FALSE; + + return !(sbi.rgstate[0] & STATE_SYSTEM_OFFSCREEN); +} + BOOL UserHasWindowEdge(DWORD Style, DWORD ExStyle) { @@ -459,7 +474,7 @@ DefWndNCPaint(HWND hWnd, HRGN hRgn) /* Draw the scrollbars */ if ((Style & WS_VSCROLL) && (Style & WS_HSCROLL) && - (CurrentRect.bottom - CurrentRect.top) > GetSystemMetrics(SM_CYHSCROLL)) + IntIsScrollBarVisible(hWnd, OBJID_VSCROLL) && IntIsScrollBarVisible(hWnd, OBJID_HSCROLL)) { RECT ParentClientRect; @@ -469,7 +484,7 @@ DefWndNCPaint(HWND hWnd, HRGN hRgn) else TempRect.left = TempRect.right - GetSystemMetrics(SM_CXVSCROLL); TempRect.top = TempRect.bottom - GetSystemMetrics(SM_CYHSCROLL); - FillRect(hDC, &TempRect, GetSysColorBrush(COLOR_SCROLLBAR)); + FillRect(hDC, &TempRect, GetSysColorBrush(COLOR_BTNFACE)); /* FIXME: Correct drawing of size-box with WS_EX_LEFTSCROLLBAR */ if(Parent) GetClientRect(Parent, &ParentClientRect); @@ -482,9 +497,9 @@ DefWndNCPaint(HWND hWnd, HRGN hRgn) } else { - if (Style & WS_VSCROLL) + if (Style & WS_VSCROLL && IntIsScrollBarVisible(hWnd, OBJID_VSCROLL)) IntDrawScrollBar(hWnd, hDC, SB_VERT); - else if (Style & WS_HSCROLL) + else if (Style & WS_HSCROLL && IntIsScrollBarVisible(hWnd, OBJID_HSCROLL)) IntDrawScrollBar(hWnd, hDC, SB_HORZ); } } @@ -561,9 +576,53 @@ DefWndNCCalcSize(HWND hWnd, BOOL CalcSizeStruct, RECT *Rect) InflateRect(Rect, -2 * GetSystemMetrics(SM_CXBORDER), -2 * GetSystemMetrics(SM_CYBORDER)); } + + if(Style & (WS_VSCROLL | WS_HSCROLL)) + { + SCROLLBARINFO sbi; + SETSCROLLBARINFO ssbi; + + sbi.cbSize = sizeof(SCROLLBARINFO); + if((Style & WS_VSCROLL) && NtUserGetScrollBarInfo(hWnd, OBJID_VSCROLL, &sbi)) + { + int i; + LONG sx = Rect->right; + + sx -= GetSystemMetrics(SM_CXVSCROLL); + for(i = 0; i <= CCHILDREN_SCROLLBAR; i++) + ssbi.rgstate[i] = sbi.rgstate[i]; + if(sx <= Rect->left) + ssbi.rgstate[0] |= STATE_SYSTEM_OFFSCREEN; + else + ssbi.rgstate[0] &= ~STATE_SYSTEM_OFFSCREEN; + NtUserSetScrollBarInfo(hWnd, OBJID_VSCROLL, &ssbi); + if(ssbi.rgstate[0] & STATE_SYSTEM_OFFSCREEN) + Style &= ~WS_VSCROLL; + } + else + Style &= ~WS_VSCROLL; + + if((Style & WS_HSCROLL) && NtUserGetScrollBarInfo(hWnd, OBJID_HSCROLL, &sbi)) + { + int i; + LONG sy = Rect->bottom; + + sy -= GetSystemMetrics(SM_CYHSCROLL); + for(i = 0; i <= CCHILDREN_SCROLLBAR; i++) + ssbi.rgstate[i] = sbi.rgstate[i]; + if(sy <= Rect->top) + ssbi.rgstate[0] |= STATE_SYSTEM_OFFSCREEN; + else + ssbi.rgstate[0] &= ~STATE_SYSTEM_OFFSCREEN; + NtUserSetScrollBarInfo(hWnd, OBJID_HSCROLL, &ssbi); + if(ssbi.rgstate[0] & STATE_SYSTEM_OFFSCREEN) + Style &= ~WS_HSCROLL; + } + else + Style &= ~WS_HSCROLL; + } - if ((Style & WS_VSCROLL) && (Style & WS_HSCROLL) && - (Rect->bottom - Rect->top) > GetSystemMetrics(SM_CYHSCROLL)) + if ((Style & WS_VSCROLL) && (Style & WS_HSCROLL)) { if ((ExStyle & WS_EX_LEFTSCROLLBAR) != 0) Rect->left += GetSystemMetrics(SM_CXVSCROLL); diff --git a/reactos/subsys/win32k/include/scroll.h b/reactos/subsys/win32k/include/scroll.h index 6e6d6f84f04..19cd1cf81e7 100644 --- a/reactos/subsys/win32k/include/scroll.h +++ b/reactos/subsys/win32k/include/scroll.h @@ -1,7 +1,22 @@ #ifndef _WIN32K_SCROLL_H #define _WIN32K_SCROLL_H -DWORD FASTCALL IntCreateScrollBar(PWINDOW_OBJECT Window, LONG idObject); -BOOL FASTCALL IntDestroyScrollBar(PWINDOW_OBJECT Window, LONG idObject); +typedef struct _WINDOW_SCROLLINFO +{ + SCROLLBARINFO ScrollBarInfo; + SCROLLINFO ScrollInfo; +} WINDOW_SCROLLINFO, *PWINDOW_SCROLLINFO; + +#define IntGetScrollbarInfoFromWindow(Window, i) \ + ((PSCROLLBARINFO)(&((Window)->Scroll + i)->ScrollBarInfo)) + +#define IntGetScrollInfoFromWindow(Window, i) \ + ((LPSCROLLINFO)(&((Window)->Scroll + i)->ScrollInfo)) + +#define SBOBJ_TO_SBID(Obj) ((Obj) - OBJID_HSCROLL) +#define SBID_IS_VAILD(id) (id == SB_HORZ || id == SB_VERT) + +BOOL FASTCALL IntCreateScrollBars(PWINDOW_OBJECT Window); +BOOL FASTCALL IntDestroyScrollBars(PWINDOW_OBJECT Window); #endif /* _WIN32K_SCROLL_H */ diff --git a/reactos/subsys/win32k/include/window.h b/reactos/subsys/win32k/include/window.h index 5e0ca1b955f..94d2982efc1 100644 --- a/reactos/subsys/win32k/include/window.h +++ b/reactos/subsys/win32k/include/window.h @@ -13,6 +13,7 @@ typedef struct _WINDOW_OBJECT *PWINDOW_OBJECT; #include #include #include +#include VOID FASTCALL @@ -85,9 +86,7 @@ typedef struct _WINDOW_OBJECT FAST_MUTEX PropListLock; ULONG PropListItems; /* Scrollbar info */ - PSCROLLBARINFO pHScroll; - PSCROLLBARINFO pVScroll; - PSCROLLBARINFO wExtra; + PWINDOW_SCROLLINFO Scroll; LONG UserData; BOOL Unicode; WNDPROC WndProcA; diff --git a/reactos/subsys/win32k/ntuser/scrollbar.c b/reactos/subsys/win32k/ntuser/scrollbar.c index f976cfa9f0c..bc66df80b60 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.29 2004/04/09 20:03:19 navaraf Exp $ +/* $Id: scrollbar.c,v 1.30 2004/04/17 11:00:14 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -58,6 +58,11 @@ #define SBRG_PAGEDOWNLEFT 4 /* the page down or page left region */ #define SBRG_BOTTOMLEFTBTN 5 /* the bottom or left button */ +#define CHANGERGSTATE(item, status) \ + if(Info->rgstate[(item)] != (status)) \ + Chg = TRUE; \ + Info->rgstate[(item)] = (status); + /* FUNCTIONS *****************************************************************/ /* Ported from WINE20020904 */ @@ -66,7 +71,7 @@ * 'thumbSize' returns the size of the thumb, and 'thumbPos' returns the position of the thumb relative to the left or to * the top. Return TRUE if the scrollbar is vertical, FALSE if horizontal. */ -BOOL STDCALL +BOOL FASTCALL IntGetScrollBarRect (PWINDOW_OBJECT Window, INT nBar, PRECT lprect) { BOOL vertical; @@ -180,43 +185,40 @@ IntCalculateThumb(PWINDOW_OBJECT Window, LONG idObject, PSCROLLBARINFO psbi, LPS return TRUE; } +static VOID FASTCALL +IntUpdateSBInfo(PWINDOW_OBJECT Window, int wBar) +{ + PSCROLLBARINFO sbi; + LPSCROLLINFO psi; + + ASSERT(Window); + ASSERT(Window->Scroll); + + sbi = IntGetScrollbarInfoFromWindow(Window, wBar); + psi = IntGetScrollInfoFromWindow(Window, wBar); + IntGetScrollBarRect(Window, wBar, &(sbi->rcScrollBar)); + IntCalculateThumb(Window, wBar, sbi, psi); +} + static BOOL FASTCALL IntGetScrollInfo(PWINDOW_OBJECT Window, INT nBar, LPSCROLLINFO lpsi) { UINT Mask; LPSCROLLINFO psi; - PSCROLLBARINFO Info; - switch (nBar) - { - case SB_HORZ: - Info = Window->pHScroll; - break; - case SB_VERT: - Info = Window->pVScroll; - break; - case SB_CTL: - if (Window->ExtraDataSize < sizeof(SCROLLBARINFO) + sizeof(SCROLLINFO)) - { - Info = NULL; - } - else - { - Info = (PSCROLLBARINFO) Window->ExtraData; - } - break; - default: - DPRINT1("Trying to get scrollinfo for unknown scrollbar type %d", nBar); - return FALSE; - } + if(!SBID_IS_VAILD(nBar)) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + DPRINT1("Trying to get scrollinfo for unknown scrollbar type %d", nBar); + return FALSE; + } - if (NULL == Info) + if(!IntCreateScrollBars(Window)) { - DPRINT1("No scrollinfo available\n"); return FALSE; } - psi = (LPSCROLLINFO)(Info + 1); + psi = IntGetScrollInfoFromWindow(Window, nBar); if (lpsi->fMask == SIF_ALL) { @@ -264,6 +266,18 @@ IntSetScrollInfo(PWINDOW_OBJECT Window, INT nBar, LPCSCROLLINFO lpsi, BOOL bRedr /* UINT new_flags;*/ BOOL bChangeParams = FALSE; /* don't show/hide scrollbar if params don't change */ + if(!SBID_IS_VAILD(nBar)) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + DPRINT1("Trying to set scrollinfo for unknown scrollbar type %d", nBar); + return FALSE; + } + + if(!IntCreateScrollBars(Window)) + { + return FALSE; + } + if (lpsi->cbSize != sizeof(SCROLLINFO) && lpsi->cbSize != (sizeof(SCROLLINFO) - sizeof(lpsi->nTrackPos))) { @@ -275,38 +289,9 @@ IntSetScrollInfo(PWINDOW_OBJECT Window, INT nBar, LPCSCROLLINFO lpsi, BOOL bRedr SetLastWin32Error(ERROR_INVALID_PARAMETER); return 0; } - switch (nBar) - { - case SB_HORZ: - if (NULL == Window->pHScroll) - { - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return 0; - } - psbi = Window->pHScroll; - break; - case SB_VERT: - if (NULL == Window->pVScroll) - { - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return 0; - } - psbi = Window->pVScroll; - break; - case SB_CTL: - if (Window->ExtraDataSize < sizeof(SCROLLBARINFO) + sizeof(SCROLLINFO)) - { - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return 0; - } - psbi = (PSCROLLBARINFO) Window->ExtraData; - break; - default: - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return 0; - } - - Info = (LPSCROLLINFO)(psbi + 1); + + psbi = IntGetScrollbarInfoFromWindow(Window, nBar); + Info = IntGetScrollInfoFromWindow(Window, nBar); /* Set the page size */ if (0 != (lpsi->fMask & SIF_PAGE)) @@ -430,39 +415,22 @@ IntGetScrollBarInfo(PWINDOW_OBJECT Window, LONG idObject, PSCROLLBARINFO psbi) PSCROLLBARINFO sbi; LPSCROLLINFO psi; - switch(idObject) + Bar = SBOBJ_TO_SBID(idObject); + + if(!SBID_IS_VAILD(Bar)) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + DPRINT1("Trying to get scrollinfo for unknown scrollbar type %d", Bar); + return FALSE; + } + + if(!IntCreateScrollBars(Window)) { - case OBJID_HSCROLL: - Bar = SB_HORZ; - sbi = Window->pHScroll; - break; - case OBJID_VSCROLL: - Bar = SB_VERT; - sbi = Window->pVScroll; - break; - case OBJID_CLIENT: - Bar = SB_CTL; - if (Window->ExtraDataSize < sizeof(SCROLLBARINFO) + sizeof(SCROLLINFO)) - { - sbi = NULL; - } - else - { - sbi = (PSCROLLBARINFO) Window->ExtraData; - } - break; - default: - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return FALSE; - } - - if (NULL == sbi) - { - SetLastWin32Error(ERROR_INVALID_PARAMETER); return FALSE; } - psi = (LPSCROLLINFO)(sbi + 1); + sbi = IntGetScrollbarInfoFromWindow(Window, Bar); + psi = IntGetScrollInfoFromWindow(Window, Bar); IntGetScrollBarRect(Window, Bar, &(sbi->rcScrollBar)); IntCalculateThumb(Window, Bar, sbi, psi); @@ -472,97 +440,65 @@ IntGetScrollBarInfo(PWINDOW_OBJECT Window, LONG idObject, PSCROLLBARINFO psbi) return TRUE; } -DWORD FASTCALL -IntCreateScrollBar(PWINDOW_OBJECT Window, LONG idObject) +BOOL FASTCALL +IntCreateScrollBars(PWINDOW_OBJECT Window) { PSCROLLBARINFO psbi; LPSCROLLINFO psi; LRESULT Result; + ULONG Size, s; INT i; - - psbi = ExAllocatePoolWithTag(PagedPool, sizeof(SCROLLBARINFO) + sizeof(SCROLLINFO), TAG_SBARINFO); - if(!psbi) - return FALSE; - - psi = (LPSCROLLINFO)((PSCROLLBARINFO)(psbi + 1)); - psi->cbSize = sizeof(LPSCROLLINFO); - psi->nMin = 0; - psi->nMax = 100; - psi->nPage = 0; - psi->nPos = 0; - psi->nTrackPos = 0; + if(Window->Scroll) + { + /* no need to create it anymore */ + return TRUE; + } + + /* allocate memory for all scrollbars (HORZ, VERT, CONTROL) */ + Size = 2 * (sizeof(WINDOW_SCROLLINFO)); + if(!(Window->Scroll = ExAllocatePoolWithTag(PagedPool, Size, TAG_SBARINFO))) + { + DPRINT1("Unable to allocate memory for scrollbar information for window 0x%x\n", Window->Self); + return FALSE; + } + + RtlZeroMemory(Window->Scroll, Size); Result = WinPosGetNonClientSize(Window->Self, &Window->WindowRect, &Window->ClientRect); - - psbi->cbSize = sizeof(SCROLLBARINFO); - - for (i = 0; i < CCHILDREN_SCROLLBAR + 1; i++) - psbi->rgstate[i] = 0; - - switch(idObject) + + for(s = SB_HORZ; s <= SB_VERT; s++) { - case SB_HORZ: - Window->pHScroll = psbi; - break; - case SB_VERT: - Window->pVScroll = psbi; - break; - case SB_CTL: - Window->wExtra = psbi; - break; - default: - ExFreePool(psbi); - return FALSE; + psbi = IntGetScrollbarInfoFromWindow(Window, s); + psbi->cbSize = sizeof(SCROLLBARINFO); + for (i = 0; i < CCHILDREN_SCROLLBAR + 1; i++) + psbi->rgstate[i] = 0; + + psi = IntGetScrollInfoFromWindow(Window, s); + psi->cbSize = sizeof(LPSCROLLINFO); + psi->nMax = 100; + + IntGetScrollBarRect(Window, s, &(psbi->rcScrollBar)); + IntCalculateThumb(Window, s, psbi, psi); } - IntGetScrollBarRect(Window, idObject, &(psbi->rcScrollBar)); - IntCalculateThumb(Window, idObject, psbi, psi); - - return 0; + return TRUE; } BOOL FASTCALL -IntDestroyScrollBar(PWINDOW_OBJECT Window, LONG idObject) +IntDestroyScrollBars(PWINDOW_OBJECT Window) { - switch(idObject) + if(Window->Scroll) { - case SB_HORZ: - if(Window->pHScroll) - { - ExFreePool(Window->pHScroll); - Window->pHScroll = NULL; - return TRUE; - } - return FALSE; - case SB_VERT: - if(Window->pVScroll) - { - ExFreePool(Window->pVScroll); - Window->pVScroll = NULL; - return TRUE; - } - return FALSE; - case SB_CTL: - if(Window->wExtra) - { - ExFreePool(Window->wExtra); - Window->wExtra = NULL; - return TRUE; - } - return FALSE; + ExFreePool(Window->Scroll); + Window->Scroll = NULL; + return TRUE; } return FALSE; } -#define CHANGERGSTATE(item, status) \ - if(Info->rgstate[(item)] != (status)) \ - Chg = TRUE; \ - Info->rgstate[(item)] = (status); - - BOOL STDCALL IntEnableScrollBar(BOOL Horz, PSCROLLBARINFO Info, UINT wArrows) { @@ -672,7 +608,13 @@ NtUserGetScrollInfo(HWND hwnd, int fnBar, LPSCROLLINFO lpsi) return FALSE; } - Ret = IntGetScrollInfo(Window, fnBar, &psi); + if(fnBar == SB_CTL) + { + IntSendMessage(Window->Self, SBM_GETSCROLLINFO, 0, (LPARAM)lpsi); + Ret = TRUE; + } + else + Ret = IntGetScrollInfo(Window, fnBar, &psi); IntReleaseWindowObject(Window); @@ -706,19 +648,37 @@ NtUserEnableScrollBar( return FALSE; } + if(wSBflags == SB_CTL) + { + /* FIXME */ + IntReleaseWindowObject(Window); + return FALSE; + } + + if(wSBflags != SB_BOTH && !SBID_IS_VAILD(wSBflags)) + { + IntReleaseWindowObject(Window); + SetLastWin32Error(ERROR_INVALID_PARAMETER); + DPRINT1("Trying to set scrollinfo for unknown scrollbar type %d", wSBflags); + return FALSE; + } + + if(!IntCreateScrollBars(Window)) + { + IntReleaseWindowObject(Window); + return FALSE; + } + switch(wSBflags) { case SB_BOTH: - InfoV = Window->pVScroll; + InfoV = IntGetScrollbarInfoFromWindow(Window, SB_VERT); /* fall through */ case SB_HORZ: - InfoH = Window->pHScroll; + InfoH = IntGetScrollbarInfoFromWindow(Window, SB_HORZ); break; case SB_VERT: - InfoV = Window->pVScroll; - break; - case SB_CTL: - InfoV = Window->wExtra; + InfoV = IntGetScrollbarInfoFromWindow(Window, SB_VERT); break; default: IntReleaseWindowObject(Window); @@ -747,9 +707,10 @@ NtUserSetScrollBarInfo( { PWINDOW_OBJECT Window; SETSCROLLBARINFO Safeinfo; - PSCROLLBARINFO sbi = NULL; + PSCROLLBARINFO sbi; LPSCROLLINFO psi; NTSTATUS Status; + LONG Obj; Window = IntGetWindowObject(hwnd); @@ -759,6 +720,21 @@ NtUserSetScrollBarInfo( return FALSE; } + Obj = SBOBJ_TO_SBID(idObject); + if(!SBID_IS_VAILD(Obj)) + { + IntReleaseWindowObject(Window); + SetLastWin32Error(ERROR_INVALID_PARAMETER); + DPRINT1("Trying to set scrollinfo for unknown scrollbar type %d", Obj); + return FALSE; + } + + if(!IntCreateScrollBars(Window)) + { + IntReleaseWindowObject(Window); + return FALSE; + } + Status = MmCopyFromCaller(&Safeinfo, info, sizeof(SETSCROLLBARINFO)); if(!NT_SUCCESS(Status)) { @@ -767,33 +743,8 @@ NtUserSetScrollBarInfo( return FALSE; } - switch(idObject) - { - case OBJID_HSCROLL: - sbi = Window->pHScroll; - break; - case OBJID_VSCROLL: - sbi = Window->pVScroll; - break; - case OBJID_CLIENT: - /* FIXME */ - IntReleaseWindowObject(Window); - return FALSE; - - default: - IntReleaseWindowObject(Window); - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return FALSE; - } - - if(!sbi) - { - DPRINT1("SCROLLBARINFO structure not allocated!\n"); - IntReleaseWindowObject(Window); - return FALSE; - } - - psi = (LPSCROLLINFO)((PSCROLLBARINFO)(sbi + 1)); + sbi = IntGetScrollbarInfoFromWindow(Window, Obj); + psi = IntGetScrollInfoFromWindow(Window, Obj); psi->nTrackPos = Safeinfo.nTrackPos; sbi->reserved = Safeinfo.reserved; @@ -824,6 +775,13 @@ NtUserSetScrollInfo( return 0; } + if(fnBar == SB_CTL) + { + Ret = IntSendMessage(hwnd, SBM_SETSCROLLINFO, (WPARAM)bRedraw, (LPARAM)lpsi); + IntReleaseWindowObject(Window); + return Ret; + } + Status = MmCopyFromCaller(&ScrollInfo, lpsi, sizeof(SCROLLINFO) - sizeof(ScrollInfo.nTrackPos)); if(!NT_SUCCESS(Status)) { @@ -842,6 +800,7 @@ NtUserSetScrollInfo( DWORD STDCALL NtUserShowScrollBar(HWND hWnd, int wBar, DWORD bShow) { + DWORD Style, OldStyle; PWINDOW_OBJECT Window = IntGetWindowObject(hWnd); if (!Window) @@ -849,46 +808,62 @@ NtUserShowScrollBar(HWND hWnd, int wBar, DWORD bShow) SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return FALSE; } + + switch(wBar) + { + case SB_HORZ: + Style = WS_HSCROLL; + break; + case SB_VERT: + Style = WS_VSCROLL; + break; + case SB_BOTH: + Style = WS_HSCROLL | WS_VSCROLL; + break; + case SB_CTL: + break; + default: + IntReleaseWindowObject(Window); + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return FALSE; + } + + if(!IntCreateScrollBars(Window)) + { + IntReleaseWindowObject(Window); + return FALSE; + } if (wBar == SB_CTL) { + IntUpdateSBInfo(Window, SB_CTL); + WinPosShowWindow(hWnd, bShow ? SW_SHOW : SW_HIDE); IntReleaseWindowObject(Window); return TRUE; } - - if (wBar == SB_BOTH || wBar == SB_HORZ) + + OldStyle = Window->Style; + if(bShow) + Window->Style |= Style; + else + Window->Style &= ~Style; + + if(Window->Style != OldStyle) { - if (bShow) - { - Window->Style |= WS_HSCROLL; - if (!Window->pHScroll) - IntCreateScrollBar(Window, SB_HORZ); - } - else - { - Window->Style &= ~WS_HSCROLL; - } + if(Window->Style & WS_HSCROLL) + IntUpdateSBInfo(Window, SB_HORZ); + if(Window->Style & WS_VSCROLL) + IntUpdateSBInfo(Window, SB_VERT); + + if(Window->Style & WS_VISIBLE) + { + /* Frame has been changed, let the window redraw itself */ + WinPosSetWindowPos(hWnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | + SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED | SWP_NOSENDCHANGING); + } } - - if (wBar == SB_BOTH || wBar == SB_VERT) - { - if (bShow) - { - Window->Style |= WS_VSCROLL; - if (!Window->pVScroll) - IntCreateScrollBar(Window, SB_VERT); - } - else - { - Window->Style &= ~WS_VSCROLL; - } - } - - /* Frame has been changed, let the window redraw itself */ - WinPosSetWindowPos(hWnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | - SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED | SWP_NOSENDCHANGING); - + IntReleaseWindowObject(Window); return TRUE; } diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 94b68e72750..7895d8281be 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.218 2004/04/14 23:17:56 weiden Exp $ +/* $Id: window.c,v 1.219 2004/04/17 11:00:14 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -410,8 +410,7 @@ static LRESULT IntDestroyWindow(PWINDOW_OBJECT Window, IntReferenceWindowObject(Window); ObmCloseHandle(ProcessData->WindowStation->HandleTable, Window->Self); - IntDestroyScrollBar(Window, SB_VERT); - IntDestroyScrollBar(Window, SB_HORZ); + IntDestroyScrollBars(Window); IntLockThreadWindows(Window->OwnerThread->Win32Thread); Window->Status |= WINDOWSTATUS_DESTROYED; @@ -1648,18 +1647,6 @@ NtUserCreateWindowEx(DWORD dwExStyle, WindowObject->ClientRect = WindowObject->WindowRect; /* FIXME: Initialize the window menu. */ - - /* Initialize the window's scrollbars */ - if (dwStyle & WS_VSCROLL) - { - WindowObject->Style &= ~WS_VSCROLL; - NtUserShowScrollBar(WindowObject->Self, SB_VERT, TRUE); - } - if (dwStyle & WS_HSCROLL) - { - WindowObject->Style &= ~WS_HSCROLL; - NtUserShowScrollBar(WindowObject->Self, SB_HORZ, TRUE); - } /* Send a NCCREATE message. */ Cs.cx = nWidth; @@ -1822,7 +1809,17 @@ NtUserCreateWindowEx(DWORD dwExStyle, { IntReleaseWindowObject(ParentWindow); } - + + /* Initialize and show the window's scrollbars */ + if (WindowObject->Style & WS_VSCROLL) + { + NtUserShowScrollBar(WindowObject->Self, SB_VERT, TRUE); + } + if (WindowObject->Style & WS_HSCROLL) + { + NtUserShowScrollBar(WindowObject->Self, SB_HORZ, TRUE); + } + if (dwStyle & WS_VISIBLE) { DPRINT("NtUserCreateWindow(): About to show window\n"); From 4845295e63317db9658142db781c3ea7d6f07b4f Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 17 Apr 2004 12:01:04 +0000 Subject: [PATCH 0920/1463] 'Del *.*' ignores directories. This fixes bug 291. svn path=/trunk/; revision=9174 --- reactos/subsys/system/cmd/del.c | 61 +++++++++++++++------------------ 1 file changed, 28 insertions(+), 33 deletions(-) diff --git a/reactos/subsys/system/cmd/del.c b/reactos/subsys/system/cmd/del.c index 510b5d47567..b18b4076604 100644 --- a/reactos/subsys/system/cmd/del.c +++ b/reactos/subsys/system/cmd/del.c @@ -110,6 +110,7 @@ INT CommandDelete (LPTSTR cmd, LPTSTR param) LPTSTR *arg = NULL; INT args; INT i; + INT res; INT nEvalArgs = 0; /* nunber of evaluated arguments */ DWORD dwFlags = 0; DWORD dwFiles = 0; @@ -204,17 +205,15 @@ INT CommandDelete (LPTSTR cmd, LPTSTR param) for (i = 0; i < args; i++) { if (!_tcscmp (arg[i], _T("*")) || - !_tcscmp (arg[i], _T("*.*"))) + !_tcscmp (arg[i], _T("*.*"))) { - INT res; - if (!((dwFlags & DEL_YES) || (dwFlags & DEL_QUIET) || (dwFlags & DEL_PROMPT))) - { - res = FilePromptYN (_T("All files in the directory will be deleted!\n" - "Are you sure (Y/N)?")); - - if ((res == PROMPT_NO) || - (res == PROMPT_BREAK)) - break; + if (!((dwFlags & DEL_YES) || (dwFlags & DEL_QUIET) || (dwFlags & DEL_PROMPT))) + { + res = FilePromptYN (_T("All files in the directory will be deleted!\n" + "Are you sure (Y/N)?")); + + if ((res == PROMPT_NO) || (res == PROMPT_BREAK)) + break; } } @@ -251,9 +250,10 @@ INT CommandDelete (LPTSTR cmd, LPTSTR param) do { - /* ignore "." and ".." */ + /* ignore ".", ".." and directories */ if (!_tcscmp (f.cFileName, _T(".")) || - !_tcscmp (f.cFileName, _T(".."))) + !_tcscmp (f.cFileName, _T("..")) || + f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue; _tcscpy (pFilePart, f.cFileName); @@ -261,24 +261,21 @@ INT CommandDelete (LPTSTR cmd, LPTSTR param) #ifdef _DEBUG ConErrPrintf (_T("Full filename: %s\n"), szFullPath); #endif - /*ask for deleting */ - if(dwFlags & DEL_PROMPT) + /* ask for deleting */ + if (dwFlags & DEL_PROMPT) { - INT res; ConErrPrintf (_T("The file %s will be deleted! "), szFullPath); - res = FilePromptYN (_T("Are you sure (Y/N)?")); - - if ((res == PROMPT_NO) || (res == PROMPT_BREAK)) - { - continue; //FIXME: Errorcode? - } - } + res = FilePromptYN (_T("Are you sure (Y/N)?")); + + if ((res == PROMPT_NO) || (res == PROMPT_BREAK)) + { + continue; //FIXME: Errorcode? + } + } if (!(dwFlags & DEL_QUIET) && !(dwFlags & DEL_TOTAL)) ConErrPrintf (_T("Deleting: %s\n"), szFullPath); - - /* delete the file */ if (!(dwFlags & DEL_NOTHING)) { @@ -327,19 +324,17 @@ INT CommandDelete (LPTSTR cmd, LPTSTR param) szFullPath, &pFilePart); - /*ask for deleting */ if((dwFlags & DEL_PROMPT) && (FindFirstFile(szFullPath, &f) != INVALID_HANDLE_VALUE)) //Don't ask if the file doesn't exist, the following code will make the error-msg { - INT res; ConErrPrintf (_T("The file %s will be deleted! "), szFullPath); - res = FilePromptYN (_T("Are you sure (Y/N)?")); - - if ((res == PROMPT_NO) || (res == PROMPT_BREAK)) - { - break; //FIXME: Errorcode? - } - } + res = FilePromptYN (_T("Are you sure (Y/N)?")); + + if ((res == PROMPT_NO) || (res == PROMPT_BREAK)) + { + break; //FIXME: Errorcode? + } + } #ifdef _DEBUG ConErrPrintf (_T("Full path: %s\n"), szFullPath); From b5ae6df350a0acd1a039d1a3078714f5f4a01384 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 17 Apr 2004 20:23:20 +0000 Subject: [PATCH 0921/1463] reverted last change svn path=/trunk/; revision=9175 --- reactos/Makefile | 239 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 224 insertions(+), 15 deletions(-) diff --git a/reactos/Makefile b/reactos/Makefile index 52e6fdf2de0..f0278c263d4 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.217 2004/04/12 12:08:52 weiden Exp $ +# $Id: Makefile,v 1.218 2004/04/17 20:23:20 weiden Exp $ # # Global makefile # @@ -23,6 +23,10 @@ COMPONENTS = iface_native iface_additional hallib ntoskrnl # halx86 HALS = halx86 +# Bus drivers +# acpi isapnp pci +BUS = acpi isapnp pci + # Filesystem libraries # vfatlib LIB_FSLIB = vfatlib @@ -58,6 +62,34 @@ SERVERS = win32 # dos LOADERS = dos +# Driver support libraries +#bzip2 zlib +DRIVERS_LIB = bzip2 + +# Kernel mode device drivers +# Obsolete: ide +# beep blue floppy null parallel ramdrv serenum serial +DEVICE_DRIVERS = beep blue debugout floppy null serial bootvid + +# Kernel mode input drivers +INPUT_DRIVERS = keyboard mouclass psaux sermouse + +# Kernel mode file system drivers +# cdfs ext2 fs_rec ms np vfat +FS_DRIVERS = cdfs fs_rec ms np vfat mup ntfs + +# Kernel mode networking drivers +# afd ndis npf tcpip tdi wshtcpip +NET_DRIVERS = afd ndis npf tcpip tdi wshtcpip + +# Kernel mode networking device drivers +# ne2000 pcnet +NET_DEVICE_DRIVERS = ne2000 pcnet + +# Kernel mode storage drivers +# atapi cdrom class2 disk scsiport +STORAGE_DRIVERS = atapi cdrom class2 disk 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 @@ -79,7 +111,8 @@ else EXT_MODULES = endif -KERNEL_DRIVERS = drivers +KERNEL_DRIVERS = $(DRIVERS_LIB) $(DEVICE_DRIVERS) $(INPUT_DRIVERS) $(FS_DRIVERS) \ + $(NET_DRIVERS) $(NET_DEVICE_DRIVERS) $(STORAGE_DRIVERS) VIDEO_DRIVERS # Regression tests REGTESTS = regtests @@ -348,25 +381,200 @@ iface_additional_bootcd: # -# Kernel Drivers rules +# Bus driver rules # -$(KERNEL_DRIVERS): %: - $(MAKE) -C $* +$(BUS): %: + $(MAKE) -C drivers/bus/$* -$(KERNEL_DRIVERS:%=%_implib): %_implib: - $(MAKE) -C $* implib +$(BUS:%=%_implib): %_implib: + $(MAKE) -C drivers/bus/$* implib -$(KERNEL_DRIVERS:%=%_clean): %_clean: - $(MAKE) -C $* clean +$(BUS:%=%_clean): %_clean: + $(MAKE) -C drivers/bus/$* clean -$(KERNEL_DRIVERS:%=%_install): %_install: - $(MAKE) -C $* install +$(BUS:%=%_install): %_install: + $(MAKE) -C drivers/bus/$* install -$(KERNEL_DRIVERS:%=%_bootcd): %_bootcd: - $(MAKE) -C $* bootcd +$(BUS:%=%_bootcd): %_bootcd: + $(MAKE) -C drivers/bus/$* bootcd -.PHONY: $(KERNEL_DRIVERS) $(KERNEL_DRIVERS:%=%_implib) $(KERNEL_DRIVERS:%=%_clean) \ - $(KERNEL_DRIVERS:%=%_install) $(KERNEL_DRIVERS:%=%_bootcd) +.PHONY: $(BUS) $(BUS:%=%_implib) $(BUS:%=%_clean) \ + $(BUS:%=%_install) $(BUS:%=%_bootcd) + + +# +# Driver support libraries rules +# +$(DRIVERS_LIB): %: + $(MAKE) -C drivers/lib/$* + +$(DRIVERS_LIB:%=%_implib): %_implib: + $(MAKE) -C drivers/lib/$* implib + +$(DRIVERS_LIB:%=%_clean): %_clean: + $(MAKE) -C drivers/lib/$* clean + +$(DRIVERS_LIB:%=%_install): %_install: + $(MAKE) -C drivers/lib/$* install + +$(DRIVERS_LIB:%=%_bootcd): %_bootcd: + $(MAKE) -C drivers/lib/$* bootcd + +.PHONY: $(DRIVERS_LIB) $(DRIVERS_LIB:%=%_implib) $(DRIVERS_LIB:%=%_clean) \ + $(DRIVERS_LIB:%=%_install) $(DRIVERS_LIB:%=%_bootcd) + + +# +# Device driver rules +# +$(DEVICE_DRIVERS): %: + $(MAKE) -C drivers/dd/$* + +$(DEVICE_DRIVERS:%=%_implib): %_implib: + $(MAKE) -C drivers/dd/$* implib + +$(DEVICE_DRIVERS:%=%_clean): %_clean: + $(MAKE) -C drivers/dd/$* clean + +$(DEVICE_DRIVERS:%=%_install): %_install: + $(MAKE) -C drivers/dd/$* install + +$(DEVICE_DRIVERS:%=%_bootcd): %_bootcd: + $(MAKE) -C drivers/dd/$* bootcd + +.PHONY: $(DEVICE_DRIVERS) $(DEVICE_DRIVERS:%=%_implib) $(DEVICE_DRIVERS:%=%_clean) \ + $(DEVICE_DRIVERS:%=%_install) $(DEVICE_DRIVERS:%=%_bootcd) + + +# +# Video device driver rules +# +VIDEO_DRIVERS: + $(MAKE) -C drivers/video + +VIDEO_DRIVERS_implib: + $(MAKE) -C drivers/video implib + +VIDEO_DRIVERS_clean: + $(MAKE) -C drivers/video clean + +VIDEO_DRIVERS_install: + $(MAKE) -C drivers/video install + +VIDEO_DRIVERS_bootcd: + $(MAKE) -C drivers/video bootcd + +.PHONY: VIDEO_DRIVERS VIDEO_DRIVERS_implib VIDEO_DRIVERS_clean \ + VIDEO_DRIVERS_install VIDEO_DRIVERS_bootcd + + +# +# Input driver rules +# +$(INPUT_DRIVERS): %: + $(MAKE) -C drivers/input/$* + +$(INPUT_DRIVERS:%=%_implib): %_implib: + $(MAKE) -C drivers/input/$* implib + +$(INPUT_DRIVERS:%=%_clean): %_clean: + $(MAKE) -C drivers/input/$* clean + +$(INPUT_DRIVERS:%=%_install): %_install: + $(MAKE) -C drivers/input/$* install + +$(INPUT_DRIVERS:%=%_bootcd): %_bootcd: + $(MAKE) -C drivers/input/$* bootcd + +.PHONY: $(INPUT_DRIVERS) $(INPUT_DRIVERS:%=%_implib) $(INPUT_DRIVERS:%=%_clean)\ + $(INPUT_DRIVERS:%=%_install) $(INPUT_DRIVERS:%=%_bootcd) + +# +# Filesystem driver rules +# +$(FS_DRIVERS): %: + $(MAKE) -C drivers/fs/$* + +$(FS_DRIVERS:%=%_implib): %_implib: + $(MAKE) -C drivers/fs/$* implib + +$(FS_DRIVERS:%=%_clean): %_clean: + $(MAKE) -C drivers/fs/$* clean + +$(FS_DRIVERS:%=%_install): %_install: + $(MAKE) -C drivers/fs/$* install + +$(FS_DRIVERS:%=%_bootcd): %_bootcd: + $(MAKE) -C drivers/fs/$* bootcd + +.PHONY: $(FS_DRIVERS) $(FS_DRIVERS:%=%_implib) $(FS_DRIVERS:%=%_clean) \ + $(FS_DRIVERS:%=%_install) $(FS_DRIVERS:%=%_bootcd) + + +# +# Network driver rules +# +$(NET_DRIVERS): %: + $(MAKE) -C drivers/net/$* + +$(NET_DRIVERS:%=%_implib): %_implib: + $(MAKE) -C drivers/net/$* implib + +$(NET_DRIVERS:%=%_clean): %_clean: + $(MAKE) -C drivers/net/$* clean + +$(NET_DRIVERS:%=%_install): %_install: + $(MAKE) -C drivers/net/$* install + +$(NET_DRIVERS:%=%_bootcd): %_bootcd: + $(MAKE) -C drivers/net/$* bootcd + +.PHONY: $(NET_DRIVERS) $(NET_DRIVERS:%=%_implib) $(NET_DRIVERS:%=%_clean) \ + $(NET_DRIVERS:%=%_install) $(NET_DRIVERS:%=%_bootcd) + + +# +# Network device driver rules +# +$(NET_DEVICE_DRIVERS): %: + $(MAKE) -C drivers/net/dd/$* + +$(NET_DEVICE_DRIVERS:%=%_implib): %_implib: + $(MAKE) -C drivers/net/dd/$* implib + +$(NET_DEVICE_DRIVERS:%=%_clean): %_clean: + $(MAKE) -C drivers/net/dd/$* clean + +$(NET_DEVICE_DRIVERS:%=%_install): %_install: + $(MAKE) -C drivers/net/dd/$* install + +$(NET_DEVICE_DRIVERS:%=%_bootcd): %_bootcd: + $(MAKE) -C drivers/net/dd/$* bootcd + +.PHONY: $(NET_DEVICE_DRIVERS) $(NET_DEVICE_DRIVERS:%=%_clean) $(NET_DEVICE_DRIVERS:%=%_implib) \ + $(NET_DEVICE_DRIVERS:%=%_install) $(NET_DEVICE_DRIVERS:%=%_bootcd) + + +# +# storage driver rules +# +$(STORAGE_DRIVERS): %: + $(MAKE) -C drivers/storage/$* + +$(STORAGE_DRIVERS:%=%_implib): %_implib: + $(MAKE) -C drivers/storage/$* implib + +$(STORAGE_DRIVERS:%=%_clean): %_clean: + $(MAKE) -C drivers/storage/$* clean + +$(STORAGE_DRIVERS:%=%_install): %_install: + $(MAKE) -C drivers/storage/$* install + +$(STORAGE_DRIVERS:%=%_bootcd): %_bootcd: + $(MAKE) -C drivers/storage/$* bootcd + +.PHONY: $(STORAGE_DRIVERS) $(STORAGE_DRIVERS:%=%_clean) $(STORAGE_DRIVERS:%=%_implib) \ + $(STORAGE_DRIVERS:%=%_install) $(STORAGE_DRIVERS:%=%_bootcd) # @@ -646,3 +854,4 @@ docu: # EOF + From 27b608d040864df19ff01fda6dba5769cea54b99 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sun, 18 Apr 2004 00:50:53 +0000 Subject: [PATCH 0922/1463] Fix Kernel User Timer and added ProcessTimes to QueryInformatinProcess svn path=/trunk/; revision=9176 --- reactos/ntoskrnl/ps/idle.c | 6 ++++++ reactos/ntoskrnl/ps/process.c | 22 +++++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/ps/idle.c b/reactos/ntoskrnl/ps/idle.c index 18494266a46..32daaa5aa1f 100644 --- a/reactos/ntoskrnl/ps/idle.c +++ b/reactos/ntoskrnl/ps/idle.c @@ -22,6 +22,7 @@ HANDLE PsIdleThreadHandle = NULL; extern ULONG DpcQueueSize; PETHREAD PiIdleThread; +extern CHAR KiTimerSystemAuditing; /* FUNCTIONS *****************************************************************/ @@ -38,6 +39,11 @@ PsIdleThreadMain(PVOID Context) KiDispatchInterrupt(); KeLowerIrql(oldlvl); } +/* + * Tell ke/timer.c it's okay to run. + */ + KiTimerSystemAuditing = 1; + NtYieldExecution(); Ke386HaltProcessor(); diff --git a/reactos/ntoskrnl/ps/process.c b/reactos/ntoskrnl/ps/process.c index b61c6ea5c8c..327b1b371f4 100644 --- a/reactos/ntoskrnl/ps/process.c +++ b/reactos/ntoskrnl/ps/process.c @@ -1,4 +1,4 @@ -/* $Id: process.c,v 1.127 2004/03/10 09:14:29 gvg Exp $ +/* $Id: process.c,v 1.128 2004/04/18 00:50:53 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1084,6 +1084,26 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle, case ProcessQuotaLimits: case ProcessIoCounters: case ProcessTimes: + if (ProcessInformationLength != sizeof(KERNEL_USER_TIMES)) + { + Status = STATUS_INFO_LENGTH_MISMATCH; + } + else + { + PKERNEL_USER_TIMES ProcessTimeP = + (PKERNEL_USER_TIMES)ProcessInformation; + + ProcessTimeP->CreateTime = (TIME) Process->CreateTime; + ProcessTimeP->UserTime.QuadPart = Process->Pcb.UserTime * 100000; + ProcessTimeP->KernelTime.QuadPart = Process->Pcb.KernelTime * 100000; + ProcessTimeP->ExitTime = (TIME) Process->ExitTime; + + if (ReturnLength) + { + *ReturnLength = sizeof(KERNEL_USER_TIMES); + } + } + break; case ProcessDebugPort: case ProcessLdtInformation: case ProcessWorkingSetWatch: From 92d947082ba895e3e6d3bc2dae096b8637e1e236 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sun, 18 Apr 2004 00:52:57 +0000 Subject: [PATCH 0923/1463] Fix Kernel User Timer. svn path=/trunk/; revision=9177 --- reactos/ntoskrnl/ke/timer.c | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/reactos/ntoskrnl/ke/timer.c b/reactos/ntoskrnl/ke/timer.c index 52793d68fca..a3138134bc8 100644 --- a/reactos/ntoskrnl/ke/timer.c +++ b/reactos/ntoskrnl/ke/timer.c @@ -1,4 +1,4 @@ -/* $Id: timer.c,v 1.70 2004/04/14 23:32:37 jimtabor Exp $ +/* $Id: timer.c,v 1.71 2004/04/18 00:52:57 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -38,6 +38,7 @@ LARGE_INTEGER SystemBootTime = (LARGE_INTEGER)0LL; LARGE_INTEGER SystemBootTime = { 0 }; #endif +CHAR KiTimerSystemAuditing = 0; volatile ULONG KiKernelTime; volatile ULONG KiUserTime; volatile ULONG KiDpcTime; @@ -64,11 +65,14 @@ static LIST_ENTRY AbsoluteTimerListHead; static LIST_ENTRY RelativeTimerListHead; static KSPIN_LOCK TimerListLock; static KSPIN_LOCK TimerValueLock; +static KSPIN_LOCK TimeLock; static KDPC ExpireTimerDpc; /* must raise IRQL to PROFILE_LEVEL and grab spin lock there, to sync with ISR */ extern ULONG PiNrRunnableThreads; +extern HANDLE PsIdleThreadHandle; + #define MICROSECONDS_PER_TICK (10000) #define TICKS_TO_CALIBRATE (1) @@ -654,6 +658,7 @@ KeInitializeTimerImpl(VOID) InitializeListHead(&RelativeTimerListHead); KeInitializeSpinLock(&TimerListLock); KeInitializeSpinLock(&TimerValueLock); + KeInitializeSpinLock(&TimeLock); KeInitializeDpc(&ExpireTimerDpc, KeExpireTimers, 0); /* * Calculate the starting time for the system clock @@ -682,22 +687,35 @@ KiUpdateProcessThreadTime(VOID) PKPROCESS CurrentProcess; assert(KeGetCurrentIrql() == PASSIVE_LEVEL); - - CurrentThread = KeGetCurrentThread(); +/* + * Make sure no counting can take place until Processes and Threads are + * running! + */ + if ((PsInitialSystemProcess == NULL) || + (PsIdleThreadHandle == NULL) || (KiTimerSystemAuditing == 0)) + { + return; + } + CurrentProcess = KeGetCurrentProcess(); + CurrentThread = KeGetCurrentThread(); + + DPRINT("KiKernelTime %u, KiUserTime %u \n", KiKernelTime, KiUserTime); - DPRINT("KiKernelTime %u, KiUserTime %u \n", KiKernelTime, KiUserTime); + KiAcquireSpinLock(&TimeLock); if (CurrentThread->PreviousMode == UserMode) - { - ++CurrentThread->UserTime; + { + ++CurrentThread->UserTime; ++CurrentProcess->UserTime; ++KiUserTime; - } + } if (CurrentThread->PreviousMode == KernelMode) { ++CurrentProcess->KernelTime; ++CurrentThread->KernelTime; ++KiKernelTime; } + + KiReleaseSpinLock(&TimeLock); } From 331cdb2fcded04aa7da8f641f93226bacb08654d Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sun, 18 Apr 2004 06:08:36 +0000 Subject: [PATCH 0924/1463] Add BasePriorty to ProcessBasicInformaion. svn path=/trunk/; revision=9181 --- reactos/ntoskrnl/ps/process.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/ps/process.c b/reactos/ntoskrnl/ps/process.c index 327b1b371f4..6b096a8bab5 100644 --- a/reactos/ntoskrnl/ps/process.c +++ b/reactos/ntoskrnl/ps/process.c @@ -1,4 +1,4 @@ -/* $Id: process.c,v 1.128 2004/04/18 00:50:53 jimtabor Exp $ +/* $Id: process.c,v 1.129 2004/04/18 06:08:36 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1073,7 +1073,9 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle, Process->UniqueProcessId; ProcessBasicInformationP->InheritedFromUniqueProcessId = (ULONG)Process->InheritedFromUniqueProcessId; - + ProcessBasicInformationP->BasePriority = + Process->Pcb.BasePriority; + if (ReturnLength) { *ReturnLength = sizeof(PROCESS_BASIC_INFORMATION); @@ -1092,7 +1094,7 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle, { PKERNEL_USER_TIMES ProcessTimeP = (PKERNEL_USER_TIMES)ProcessInformation; - + ProcessTimeP->CreateTime = (TIME) Process->CreateTime; ProcessTimeP->UserTime.QuadPart = Process->Pcb.UserTime * 100000; ProcessTimeP->KernelTime.QuadPart = Process->Pcb.KernelTime * 100000; From 4debbe40cc641655672c4521dedfe3c9fc095a32 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sun, 18 Apr 2004 12:59:14 +0000 Subject: [PATCH 0925/1463] - Fixed the open counter in IntVideoPortDispatchClose. svn path=/trunk/; revision=9182 --- reactos/drivers/video/videoprt/dispatch.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/video/videoprt/dispatch.c b/reactos/drivers/video/videoprt/dispatch.c index 96b684f209d..8c4b27da836 100644 --- a/reactos/drivers/video/videoprt/dispatch.c +++ b/reactos/drivers/video/videoprt/dispatch.c @@ -18,7 +18,7 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: dispatch.c,v 1.4 2004/04/08 15:36:36 gvg Exp $ + * $Id: dispatch.c,v 1.5 2004/04/18 12:59:14 hbirr Exp $ */ #include "videoprt.h" @@ -174,7 +174,7 @@ IntVideoPortDispatchClose( DPRINT("IntVideoPortDispatchClose\n"); DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - if (DeviceExtension->DeviceOpened > 1 && + if (DeviceExtension->DeviceOpened >= 1 && InterlockedDecrement(&DeviceExtension->DeviceOpened) == 0) { ResetDisplayParametersDeviceExtension = DeviceExtension; From 0441662dd1016ace977ece892a7b78b2af2a49d2 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 19 Apr 2004 10:50:19 +0000 Subject: [PATCH 0926/1463] Add private prototypes. Don't contribute them to MinGW! svn path=/trunk/; revision=9183 --- reactos/w32api/include/userenv.h | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/reactos/w32api/include/userenv.h b/reactos/w32api/include/userenv.h index 1998e4c4d37..9d3091d3a75 100644 --- a/reactos/w32api/include/userenv.h +++ b/reactos/w32api/include/userenv.h @@ -36,10 +36,14 @@ typedef struct _PROFILEINFOW HANDLE hProfile; } PROFILEINFOW, *LPPROFILEINFOW; +/* begin private */ +BOOL WINAPI InitializeProfiles (VOID); +BOOL WINAPI CreateUserProfileA (PSID, LPCSTR); BOOL WINAPI CreateUserProfileW (PSID, LPCWSTR); -BOOL WINAPI LoadUserProfileA(HANDLE, LPPROFILEINFOA); -BOOL WINAPI LoadUserProfileW(HANDLE, LPPROFILEINFOW); -BOOL WINAPI UnloadUserProfile(HANDLE, HANDLE); +/* end private */ +BOOL WINAPI LoadUserProfileA (HANDLE, LPPROFILEINFOA); +BOOL WINAPI LoadUserProfileW (HANDLE, LPPROFILEINFOW); +BOOL WINAPI UnloadUserProfile (HANDLE, HANDLE); BOOL WINAPI GetAllUsersProfileDirectoryA (LPSTR, LPDWORD); BOOL WINAPI GetAllUsersProfileDirectoryW (LPWSTR, LPDWORD); @@ -56,6 +60,9 @@ BOOL WINAPI DestroyEnvironmentBlock(LPVOID); #ifdef UNICODE typedef PROFILEINFOW PROFILEINFO; typedef LPPROFILEINFOW LPPROFILEINFO; +/* begin private */ +#define CreateUserProfile CreateuserProfileW +/* end private */ #define LoadUserProfile LoadUserProfileW #define GetAllUsersProfileDirectory GetAllUsersProfileDirectoryW #define GetDefaultUserProfileDirectory GetDefaultUserProfileDirectoryW @@ -64,6 +71,9 @@ typedef LPPROFILEINFOW LPPROFILEINFO; #else typedef PROFILEINFOA PROFILEINFO; typedef LPPROFILEINFOA LPPROFILEINFO; +/* begin private */ +#define CreateUserProfile CreateuserProfileA +/* end private */ #define LoadUserProfile LoadUserProfileA #define GetAllUsersProfileDirectory GetAllUsersProfileDirectoryA #define GetDefaultUserProfileDirectory GetDefaultUserProfileDirectoryA From 2716e12077804cc40035b762f0551c1ba615582a Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 19 Apr 2004 10:51:17 +0000 Subject: [PATCH 0927/1463] Implement CreateUserProfileA(). svn path=/trunk/; revision=9184 --- reactos/lib/userenv/profile.c | 27 ++++++++++++++++++++++++++- reactos/lib/userenv/userenv.def | 1 + reactos/lib/userenv/userenv.edf | 1 + 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/reactos/lib/userenv/profile.c b/reactos/lib/userenv/profile.c index a6335bee3cf..664e24d02b7 100644 --- a/reactos/lib/userenv/profile.c +++ b/reactos/lib/userenv/profile.c @@ -1,4 +1,4 @@ -/* $Id: profile.c,v 1.8 2004/03/17 14:46:23 ekohl Exp $ +/* $Id: profile.c,v 1.9 2004/04/19 10:51:17 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -75,6 +75,31 @@ AppendSystemPostfix (LPWSTR lpName, } +BOOL WINAPI +CreateUserProfileA (PSID Sid, + LPCSTR lpUserName) +{ + UNICODE_STRING UserName; + BOOL bResult; + NTSTATUS Status; + + Status = RtlCreateUnicodeStringFromAsciiz (&UserName, + (LPSTR)lpUserName); + if (!NT_SUCCESS(Status)) + { + SetLastError (RtlNtStatusToDosError (Status)); + return FALSE; + } + + bResult = CreateUserProfileW (Sid, + UserName.Buffer); + + RtlFreeUnicodeString (&UserName); + + return bResult; +} + + BOOL WINAPI CreateUserProfileW (PSID Sid, LPCWSTR lpUserName) diff --git a/reactos/lib/userenv/userenv.def b/reactos/lib/userenv/userenv.def index 8d7e1ae31e3..8eb7e669068 100644 --- a/reactos/lib/userenv/userenv.def +++ b/reactos/lib/userenv/userenv.def @@ -1,6 +1,7 @@ LIBRARY userenv.dll EXPORTS InitializeProfiles@0 @100 NONAME +CreateUserProfileA@8 @109 NONAME CreateUserProfileW@8 @110 NONAME CreateEnvironmentBlock@12 DestroyEnvironmentBlock@4 diff --git a/reactos/lib/userenv/userenv.edf b/reactos/lib/userenv/userenv.edf index 25f8b5dbbba..173edb76516 100644 --- a/reactos/lib/userenv/userenv.edf +++ b/reactos/lib/userenv/userenv.edf @@ -1,6 +1,7 @@ LIBRARY userenv.dll EXPORTS InitializeProfiles=InitializeProfiles@0 @100 NONAME +CreateUserProfileA=CreateUserProfileA@8 @109 NONAME CreateUserProfileW=CreateUserProfileW@8 @110 NONAME CreateEnvironmentBlock=CreateEnvironmentBlock@12 DestroyEnvironmentBlock=DestroyEnvironmentBlock@4 From ddaf88000245a3233c485cfd5064db4907101e53 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 19 Apr 2004 10:54:23 +0000 Subject: [PATCH 0928/1463] - Use new userenv.h prototypes. - Add new dialogs to Czech language for translation. - Make install wizard code UNICODE aware. svn path=/trunk/; revision=9185 --- reactos/lib/syssetup/Makefile | 3 +- reactos/lib/syssetup/install.c | 22 +++++----- reactos/lib/syssetup/syssetup_Cz.rc | 62 +++++++++++++++++++++++++++++ reactos/lib/syssetup/wizard.c | 18 ++++----- 4 files changed, 81 insertions(+), 24 deletions(-) diff --git a/reactos/lib/syssetup/Makefile b/reactos/lib/syssetup/Makefile index 0506b5eb261..28e11fd148e 100644 --- a/reactos/lib/syssetup/Makefile +++ b/reactos/lib/syssetup/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.7 2004/04/16 13:37:18 ekohl Exp $ +# $Id: Makefile,v 1.8 2004/04/19 10:54:23 ekohl Exp $ PATH_TO_TOP = ../.. @@ -18,7 +18,6 @@ TARGET_RCFLAGS += -D__USE_W32API -D_WIN32_IE=0x0500 TARGET_LFLAGS = -nostartfiles -nostdlib TARGET_OBJECTS = dllmain.o install.o logfile.o wizard.o -# wizard.o include $(PATH_TO_TOP)/rules.mak include $(TOOLS_PATH)/helper.mk diff --git a/reactos/lib/syssetup/install.c b/reactos/lib/syssetup/install.c index 67b9068a277..fd382d30ef1 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.11 2004/04/16 13:37:18 ekohl Exp $ +/* $Id: install.c,v 1.12 2004/04/19 10:54:23 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -34,6 +34,7 @@ #include #include +#include #include "globals.h" #include "resource.h" @@ -42,11 +43,6 @@ #define VMWINST -/* userenv.dll */ -BOOL WINAPI InitializeProfiles (VOID); -BOOL WINAPI CreateUserProfileW (PSID Sid, LPCWSTR lpUserName); - - /* GLOBALS ******************************************************************/ PSID DomainSid = NULL; @@ -76,6 +72,7 @@ DebugPrint(char* fmt,...) #endif } + #ifdef VMWINST static BOOL RunVMWInstall(VOID) @@ -292,14 +289,13 @@ InstallReactOS (HINSTANCE hInstance) #endif #ifdef VMWINST - RunVMWInstall(); + RunVMWInstall (); #endif - DialogBox( -// GetModuleHandle(TEXT("syssetup.dll")), - hDllInstance, - MAKEINTRESOURCE(IDD_RESTART), - NULL, - RestartDlgProc); + + DialogBox (hDllInstance, + MAKEINTRESOURCE(IDD_RESTART), + NULL, + RestartDlgProc); return 0; } diff --git a/reactos/lib/syssetup/syssetup_Cz.rc b/reactos/lib/syssetup/syssetup_Cz.rc index 4057d9b9955..434bf4cd895 100644 --- a/reactos/lib/syssetup/syssetup_Cz.rc +++ b/reactos/lib/syssetup/syssetup_Cz.rc @@ -18,6 +18,68 @@ LANGUAGE LANG_CZECH, SUBLANG_DEFAULT +IDD_WELCOMEPAGE DIALOG DISCARDABLE 0, 0, 317, 193 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "ReactOS Setup" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Welcome to the ReactOS Setup Wizard.", IDC_STATIC, 115, 9, 189, 31 + LTEXT "This wizard installs ReactOS on your computer. The wizard "\ + "needs to gather some information about you and your computer "\ + "to set up ReactOS properly.", IDC_STATIC, 115, 50, 189, 100 + LTEXT "Click Next to continue with Setup.", IDC_STATIC, 115, 160, 189, 31 +END + + +IDD_OWNERPAGE DIALOG DISCARDABLE 0, 0, 317, 143 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "ReactOS Setup" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Type your full name and the name of your company or organization.", + IDC_STATIC, 54, 7, 242, 21 + LTEXT "Na&me:", IDC_STATIC, 54, 37, 44, 8 + EDITTEXT IDC_OWNERNAME, 132, 35, 163, 14, WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL + LTEXT "&Organization:", IDC_STATIC, 54, 57, 44, 8 + EDITTEXT IDC_OWNERORGANIZATION, 132, 55, 163, 14, WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL +END + + +IDD_COMPUTERPAGE DIALOG DISCARDABLE 0, 0, 317, 143 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "ReactOS Setup" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Type a name for your computer that is 63 characters or less. "\ + "If you are on a network, your computer name must be unique.", + IDC_STATIC, 54, 7, 250, 24 + LTEXT "&Computer Name:", IDC_STATIC, 54, 38, 75, 8 + EDITTEXT IDC_COMPUTERNAME, 132, 35, 163, 14, WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL | ES_UPPERCASE + LTEXT "Setup will create a user account on your computer called Administrator. "\ + "You can use this account if you need full access to your computer.", + IDC_STATIC, 54, 57, 250, 25 + LTEXT "Type an Administrator Password that is 14 characters or less.", + IDC_STATIC, 54, 87, 250, 8 + LTEXT "&Administrator Password:", IDC_STATIC, 54, 104, 75, 8 + EDITTEXT IDC_ADMINPASSWORD1, 132, 101, 172, 14, WS_VISIBLE | WS_TABSTOP | ES_PASSWORD + LTEXT "C&onfirm Password:", IDC_STATIC, 54, 123, 75, 8 + EDITTEXT IDC_ADMINPASSWORD2, 132, 120, 172, 14, WS_VISIBLE | WS_TABSTOP | ES_PASSWORD +END + + +IDD_FINISHPAGE DIALOG DISCARDABLE 0, 0, 317, 193 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Completing ReactOS Setup" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Completing the ReactOS Setup Wizard",IDC_STATIC,115,9,195,37 + LTEXT "You have successfully completed ReactOS Setup.\n\n" \ + "When you click Finish, your computer will restart.", IDC_STATIC, 115, 58, 195, 100 + LTEXT "If there is a CD in a drive, remove it. Then, to restart "\ + "your computer, click Finish.", IDC_STATIC, 115, 160, 195, 31 +END + + IDD_RESTART DIALOG 6, 18, 245, 116 STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION CAPTION "Instatalace ReactOSu" diff --git a/reactos/lib/syssetup/wizard.c b/reactos/lib/syssetup/wizard.c index b2b69a97153..f3b75c9778b 100644 --- a/reactos/lib/syssetup/wizard.c +++ b/reactos/lib/syssetup/wizard.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: wizard.c,v 1.1 2004/04/16 13:37:18 ekohl Exp $ +/* $Id: wizard.c,v 1.2 2004/04/19 10:54:23 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -137,8 +137,8 @@ OwnerPageDlgProc(HWND hwndDlg, if (GetDlgItemText(hwndDlg, IDC_OWNERNAME, SetupData->OwnerName, 50) == 0) { MessageBox (hwndDlg, - "Setup cannot continue until you enter your name.", - "ReactOS Setup", + _T("Setup cannot continue until you enter your name."), + _T("ReactOS Setup"), MB_ICONERROR | MB_OK); return -1; } @@ -212,8 +212,8 @@ ComputerPageDlgProc(HWND hwndDlg, if (GetDlgItemText(hwndDlg, IDC_COMPUTERNAME, SetupData->ComputerName, 64) == 0) { MessageBox (hwndDlg, - "Setup cannot continue until you enter the name of your computer.", - "ReactOS Setup", + _T("Setup cannot continue until you enter the name of your computer."), + _T("ReactOS Setup"), MB_ICONERROR | MB_OK); return -1; } @@ -226,9 +226,9 @@ ComputerPageDlgProc(HWND hwndDlg, if (_tcscmp (Password1, Password2)) { MessageBox (hwndDlg, - "The passwords you entered do not match. Please enter "\ - "the desired password again.", - "ReactOS Setup", + _T("The passwords you entered do not match. Please enter "\ + "the desired password again."), + _T("ReactOS Setup"), MB_ICONERROR | MB_OK); return -1; } @@ -353,7 +353,7 @@ InstallWizard (VOID) // psh.pszbmHeader = MAKEINTRESOURCE(IDB_BANNER); /* Display the wizard */ - PropertySheetA (&psh); + PropertySheet (&psh); } /* EOF */ From 9e797fd74b200b704609ebb336d63d3af36a6e47 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 19 Apr 2004 10:55:04 +0000 Subject: [PATCH 0929/1463] Fix typos. svn path=/trunk/; revision=9186 --- reactos/w32api/include/userenv.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/w32api/include/userenv.h b/reactos/w32api/include/userenv.h index 9d3091d3a75..53d550b1165 100644 --- a/reactos/w32api/include/userenv.h +++ b/reactos/w32api/include/userenv.h @@ -61,7 +61,7 @@ BOOL WINAPI DestroyEnvironmentBlock(LPVOID); typedef PROFILEINFOW PROFILEINFO; typedef LPPROFILEINFOW LPPROFILEINFO; /* begin private */ -#define CreateUserProfile CreateuserProfileW +#define CreateUserProfile CreateUserProfileW /* end private */ #define LoadUserProfile LoadUserProfileW #define GetAllUsersProfileDirectory GetAllUsersProfileDirectoryW @@ -72,7 +72,7 @@ typedef LPPROFILEINFOW LPPROFILEINFO; typedef PROFILEINFOA PROFILEINFO; typedef LPPROFILEINFOA LPPROFILEINFO; /* begin private */ -#define CreateUserProfile CreateuserProfileA +#define CreateUserProfile CreateUserProfileA /* end private */ #define LoadUserProfile LoadUserProfileA #define GetAllUsersProfileDirectory GetAllUsersProfileDirectoryA From 87b81bac7cda3936d9fbc3efbca8e24dd4d60acb Mon Sep 17 00:00:00 2001 From: Jason Filby Date: Tue, 20 Apr 2004 18:52:04 +0000 Subject: [PATCH 0930/1463] Correct test for MmSizeOfMdl svn path=/trunk/; revision=9187 --- reactos/regtests/kmregtests/tests/mdl-1.c | 66 +++++++++++++++-------- 1 file changed, 43 insertions(+), 23 deletions(-) diff --git a/reactos/regtests/kmregtests/tests/mdl-1.c b/reactos/regtests/kmregtests/tests/mdl-1.c index 94f6d65547c..7db8986a77a 100644 --- a/reactos/regtests/kmregtests/tests/mdl-1.c +++ b/reactos/regtests/kmregtests/tests/mdl-1.c @@ -5,45 +5,65 @@ static int RunTest(char *Buffer) { - VOID *pmem1; - PHYSICAL_ADDRESS LowestAcceptableAddress, HighestAcceptableAddress, SkipBytes; - SIZE_T TotalBytes; + VOID *pmem1, *MdlPfnArray, *MdlVirtAddr; + ULONG MdlSize, MdlOffset, AllocSize; PMDL Mdl; /* Allocate memory for use in testing */ + AllocSize = 512; pmem1 = ExAllocatePool(NonPagedPool, - 512); + AllocSize); - /* MDL Testing */ + /* MmSizeOfMdl test */ + MdlSize = 0; + MdlSize = MmSizeOfMdl(pmem1, + AllocSize); + if (MdlSize <= sizeof(MDL)) + { + strcpy(Buffer, "MmSizeOfMdl() failed\n"); + return TS_FAILED; + } + + /* MmCreateMdl test */ Mdl = NULL; Mdl = MmCreateMdl(NULL, pmem1, - 512); + AllocSize); if (Mdl == NULL) { strcpy(Buffer, "MmCreateMdl() failed for Mdl\n"); return TS_FAILED; } - MmBuildMdlForNonPagedPool(Mdl); - MmProbeAndLockPages(Mdl, - KernelMode, - IoReadAccess); - MmUnlockPages(Mdl); - ExFreePool(Mdl); - SkipBytes.QuadPart = PAGE_SIZE * 4; - TotalBytes = 4096; - Mdl = NULL; - Mdl = MmAllocatePagesForMdl(LowestAcceptableAddress, - HighestAcceptableAddress, - SkipBytes, - TotalBytes); - if (Mdl == NULL) + /* MmGetMdlByteCount test */ + MdlSize = 0; + MdlSize = MmGetMdlByteCount(Mdl); + if (MdlSize != AllocSize) { - strcpy(Buffer, "MmAllocatePagesForMdl() failed for Mdl\n"); + strcpy(Buffer, "MmGetMdlByteCount() failed for Mdl\n"); + return TS_FAILED; + } + + /* MmGetMdlByteOffset test */ + MdlOffset = MmGetMdlByteOffset(Mdl); + + /* MmGetMdlPfnArray test */ + MdlPfnArray = NULL; + MdlPfnArray = MmGetMdlPfnArray(Mdl); + if (MdlPfnArray == NULL) + { + strcpy(Buffer, "MmGetMdlPfnArray() failed for Mdl\n"); + return TS_FAILED; + } + + /* MmGetMdlVirtualAddress test */ + MdlVirtAddr = NULL; + MdlVirtAddr = MmGetMdlVirtualAddress(Mdl); + if (MdlVirtAddr == NULL) + { + strcpy(Buffer, "MmGetMdlVirtualAddress() failed for Mdl\n"); return TS_FAILED; } - MmFreePagesFromMdl(Mdl); /* Free memory used in test */ ExFreePool(pmem1); @@ -59,7 +79,7 @@ Mdl_1Test(int Command, char *Buffer) case TESTCMD_RUN: return RunTest(Buffer); case TESTCMD_TESTNAME: - strcpy(Buffer, "Kernel Memory MDL API"); + strcpy(Buffer, "Kernel Memory MDL API (1)"); return TS_OK; default: break; From d169532a771adc3e09c39c9d522f23c1ce3a1f3c Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes Date: Tue, 20 Apr 2004 18:59:00 +0000 Subject: [PATCH 0931/1463] make mdl impl. more windows compliant svn path=/trunk/; revision=9188 --- reactos/ntoskrnl/mm/freelist.c | 2 +- reactos/ntoskrnl/mm/mdl.c | 345 ++++++++++++++++++++++----------- 2 files changed, 234 insertions(+), 113 deletions(-) diff --git a/reactos/ntoskrnl/mm/freelist.c b/reactos/ntoskrnl/mm/freelist.c index f6987b9cbe2..36cc9c90c2d 100644 --- a/reactos/ntoskrnl/mm/freelist.c +++ b/reactos/ntoskrnl/mm/freelist.c @@ -52,7 +52,7 @@ PHYSICAL_PAGE, *PPHYSICAL_PAGE; /* GLOBALS ****************************************************************/ static PPHYSICAL_PAGE MmPageArray; -static ULONG MmPageArraySize; +ULONG MmPageArraySize; static KSPIN_LOCK PageListLock; static LIST_ENTRY UsedPageListHeads[MC_MAXIMUM]; diff --git a/reactos/ntoskrnl/mm/mdl.c b/reactos/ntoskrnl/mm/mdl.c index 6585b8aab1c..cb395e45d72 100644 --- a/reactos/ntoskrnl/mm/mdl.c +++ b/reactos/ntoskrnl/mm/mdl.c @@ -1,4 +1,4 @@ -/* $Id: mdl.c,v 1.61 2004/04/10 22:35:25 gdalsnes Exp $ +/* $Id: mdl.c,v 1.62 2004/04/20 18:59:00 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -30,6 +30,18 @@ static PVOID MiMdlMappingRegionBase = NULL; static RTL_BITMAP MiMdlMappingRegionAllocMap; static ULONG MiMdlMappingRegionHint; static KSPIN_LOCK MiMdlMappingRegionLock; +extern ULONG MmPageArraySize; + +/* +MDL Flags desc. + +MDL_PAGES_LOCKED MmProbelAndLockPages has been called for this mdl +MDL_SOURCE_IS_NONPAGED_POOL mdl has been build by MmBuildMdlForNonPagedPool +MDL_PARTIAL mdl has been built by IoBuildPartialMdl +MDL_MAPPING_CAN_FAIL in case of an error, MmMapLockedPages will return NULL instead of to bugcheck +MDL_MAPPED_TO_SYSTEM_VA mdl has been mapped into kernel space using MmMapLockedPages +MDL_PARTIAL_HAS_BEEN_MAPPED mdl flagged MDL_PARTIAL has been mapped into kernel space using MmMapLockedPages +*/ /* FUNCTIONS *****************************************************************/ @@ -82,7 +94,7 @@ MmGetMdlPageAddress(PMDL Mdl, PVOID Offset) } /* - * @unimplemented + * @implemented */ VOID STDCALL MmUnlockPages(PMDL Mdl) @@ -93,11 +105,38 @@ MmUnlockPages(PMDL Mdl) * NOTES: The memory described by the specified MDL must have been locked * previously by a call to MmProbeAndLockPages. As the pages unlocked, the * MDL is updated + * + * May be called in any process context. */ { ULONG i; PULONG MdlPages; + /* + * MmProbeAndLockPages MUST have been called to lock this mdl! + * + * Windows will bugcheck if you pass MmUnlockPages an mdl that hasn't been + * locked with MmLockAndProbePages, but (for now) we'll be more forgiving... + */ + if (!(Mdl->MdlFlags & MDL_PAGES_LOCKED)) + { + DPRINT1("MmUnlockPages called for non-locked mdl!\n"); + return; + } + + /* If mdl buffer is mapped io space -> do nothing */ + if (Mdl->MdlFlags & MDL_IO_SPACE) + { + Mdl->MdlFlags &= ~MDL_PAGES_LOCKED; + return; + } + + /* Automagically undo any calls to MmGetSystemAddressForMdl's for this mdl */ + if (Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) + { + MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl); + } + /* * FIXME: I don't know whether this right, but it looks sensible */ @@ -107,13 +146,6 @@ MmUnlockPages(PMDL Mdl) return; } - /* - * FIXME: Seems sensible - */ - if (!(Mdl->MdlFlags & MDL_PAGES_LOCKED)) - { - return; - } MdlPages = (PULONG)(Mdl + 1); for (i=0; i<(PAGE_ROUND_UP(Mdl->ByteCount+Mdl->ByteOffset)/PAGE_SIZE); i++) @@ -130,9 +162,12 @@ MmUnlockPages(PMDL Mdl) #endif } - Mdl->MdlFlags = Mdl->MdlFlags & (~MDL_PAGES_LOCKED); + + Mdl->MdlFlags &= ~MDL_PAGES_LOCKED; } + + /* * @implemented */ @@ -141,30 +176,28 @@ MmMapLockedPages(PMDL Mdl, KPROCESSOR_MODE AccessMode) /* * FUNCTION: Maps the physical pages described by a given MDL * ARGUMENTS: - * Mdl = Points to an MDL updated by MmProbeAndLockPages + * Mdl = Points to an MDL updated by MmProbeAndLockPages, MmBuildMdlForNonPagedPool + * or IoBuildPartialMdl. * AccessMode = Specifies the portion of the address space to map the * pages. * RETURNS: The base virtual address that maps the locked pages for the * range described by the MDL + * + * If mapping into user space, pages are mapped into current address space. */ { PVOID Base; ULONG i; PULONG MdlPages; KIRQL oldIrql; - ULONG RegionSize; + ULONG PageCount; ULONG StartingOffset; - PEPROCESS CurrentProcess, OldProcess; + PEPROCESS CurrentProcess; DPRINT("MmMapLockedPages(Mdl %x, AccessMode %x)\n", Mdl, AccessMode); - if ((Mdl->MdlFlags & MDL_SOURCE_IS_NONPAGED_POOL) && AccessMode != UserMode) - { - return(Mdl->MappedSystemVa); - } - /* Calculate the number of pages required. */ - RegionSize = PAGE_ROUND_UP(Mdl->ByteCount + Mdl->ByteOffset) / PAGE_SIZE; + PageCount = PAGE_ROUND_UP(Mdl->ByteCount + Mdl->ByteOffset) / PAGE_SIZE; if (AccessMode == UserMode) { @@ -172,22 +205,20 @@ MmMapLockedPages(PMDL Mdl, KPROCESSOR_MODE AccessMode) LARGE_INTEGER BoundaryAddressMultiple; NTSTATUS Status; + /* pretty sure you can't map partial mdl's to user space */ + assert(!(Mdl->MdlFlags & MDL_PARTIAL)); + BoundaryAddressMultiple.QuadPart = 0; Base = NULL; - CurrentProcess = OldProcess = PsGetCurrentProcess(); - if (Mdl->Process != CurrentProcess) - { - KeAttachProcess(Mdl->Process); - CurrentProcess = Mdl->Process; - } + CurrentProcess = PsGetCurrentProcess(); MmLockAddressSpace(&CurrentProcess->AddressSpace); Status = MmCreateMemoryArea(CurrentProcess, &CurrentProcess->AddressSpace, MEMORY_AREA_MDL_MAPPING, &Base, - RegionSize * PAGE_SIZE, + PageCount * PAGE_SIZE, 0, /* PAGE_READWRITE? */ &Result, FALSE, @@ -196,22 +227,40 @@ MmMapLockedPages(PMDL Mdl, KPROCESSOR_MODE AccessMode) MmUnlockAddressSpace(&CurrentProcess->AddressSpace); if (!NT_SUCCESS(Status)) { + if (Mdl->MdlFlags & MDL_MAPPING_CAN_FAIL) + { + return NULL; + } + KEBUGCHECK(0); /* FIXME: handle this? */ } } - else + else /* if (AccessMode == KernelMode) */ { - CurrentProcess = OldProcess = NULL; + /* can't map mdl twice */ + assert(!(Mdl->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA|MDL_PARTIAL_HAS_BEEN_MAPPED))); + /* can't map mdl buildt from non paged pool into kernel space */ + assert(!(Mdl->MdlFlags & (MDL_SOURCE_IS_NONPAGED_POOL))); + + CurrentProcess = NULL; /* Allocate that number of pages from the mdl mapping region. */ KeAcquireSpinLock(&MiMdlMappingRegionLock, &oldIrql); - StartingOffset = RtlFindClearBitsAndSet(&MiMdlMappingRegionAllocMap, RegionSize, MiMdlMappingRegionHint); + StartingOffset = RtlFindClearBitsAndSet(&MiMdlMappingRegionAllocMap, PageCount, MiMdlMappingRegionHint); if (StartingOffset == 0xffffffff) { + KeReleaseSpinLock(&MiMdlMappingRegionLock, oldIrql); + DPRINT1("Out of MDL mapping space\n"); + + if (Mdl->MdlFlags & MDL_MAPPING_CAN_FAIL) + { + return NULL; + } + KEBUGCHECK(0); } @@ -219,7 +268,7 @@ MmMapLockedPages(PMDL Mdl, KPROCESSOR_MODE AccessMode) if (MiMdlMappingRegionHint == StartingOffset) { - MiMdlMappingRegionHint +=RegionSize; + MiMdlMappingRegionHint += PageCount; } KeReleaseSpinLock(&MiMdlMappingRegionLock, oldIrql); @@ -229,7 +278,7 @@ MmMapLockedPages(PMDL Mdl, KPROCESSOR_MODE AccessMode) /* Set the virtual mappings for the MDL pages. */ MdlPages = (PULONG)(Mdl + 1); - for (i = 0; i < RegionSize; i++) + for (i = 0; i < PageCount; i++) { NTSTATUS Status; #if !defined(__GNUC__) @@ -250,18 +299,28 @@ MmMapLockedPages(PMDL Mdl, KPROCESSOR_MODE AccessMode) if (!NT_SUCCESS(Status)) { DbgPrint("Unable to create virtual mapping\n"); + if (Mdl->MdlFlags & MDL_MAPPING_CAN_FAIL) + { + return NULL; + } KEBUGCHECK(0); } } - if (AccessMode == UserMode && CurrentProcess != OldProcess) - { - KeDetachProcess(); - } - /* Mark the MDL has having being mapped. */ - Mdl->MdlFlags = Mdl->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA; - Mdl->MappedSystemVa = (char*)Base + Mdl->ByteOffset; + if (AccessMode == KernelMode) + { + if (Mdl->MdlFlags & MDL_PARTIAL) + { + Mdl->MdlFlags |= MDL_PARTIAL_HAS_BEEN_MAPPED; + } + else + { + Mdl->MdlFlags |= MDL_MAPPED_TO_SYSTEM_VA; + } + Mdl->MappedSystemVa = (char*)Base + Mdl->ByteOffset; + } + return((char*)Base + Mdl->ByteOffset); } @@ -275,13 +334,14 @@ MmUnmapLockedPages(PVOID BaseAddress, PMDL Mdl) * ARGUMENTS: * BaseAddress = Base virtual address to which the pages were mapped * MemoryDescriptorList = MDL describing the mapped pages + * + * User space unmappings _must_ be done from the original process context! */ { KIRQL oldIrql; ULONG i; - ULONG RegionSize; + ULONG PageCount; ULONG Base; - PEPROCESS CurrentProcess, OldProcess; DPRINT("MmUnmapLockedPages(BaseAddress %x, Mdl %x)\n", BaseAddress, Mdl); @@ -295,36 +355,18 @@ MmUnmapLockedPages(PVOID BaseAddress, PMDL Mdl) return; } - if ((ULONG_PTR)BaseAddress >= KERNEL_BASE) - { - CurrentProcess = OldProcess = NULL; - } - else - { - CurrentProcess = OldProcess = PsGetCurrentProcess(); - if (Mdl->Process != CurrentProcess) - { - KeAttachProcess(Mdl->Process); - CurrentProcess = Mdl->Process; - } - } /* Calculate the number of pages we mapped. */ - RegionSize = PAGE_ROUND_UP(Mdl->ByteCount + Mdl->ByteOffset) / PAGE_SIZE; -#if defined(__GNUC__) - - BaseAddress -= Mdl->ByteOffset; -#else - - { - char* pTemp = BaseAddress; - pTemp -= Mdl->ByteOffset; - BaseAddress = pTemp; - } -#endif + PageCount = PAGE_ROUND_UP(Mdl->ByteCount + Mdl->ByteOffset) / PAGE_SIZE; + /* + * Docs says that BaseAddress should be a _base_ address, but every example + * I've seen pass the actual address. -Gunnar + */ + BaseAddress = PAGE_ALIGN(BaseAddress); + /* Unmap all the pages. */ - for (i = 0; i < RegionSize; i++) + for (i = 0; i < PageCount; i++) { MmDeleteVirtualMapping(NULL, (char*)BaseAddress + (i * PAGE_SIZE), @@ -335,38 +377,39 @@ MmUnmapLockedPages(PVOID BaseAddress, PMDL Mdl) if ((DWORD)BaseAddress >= KERNEL_BASE) { + assert(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); + KeAcquireSpinLock(&MiMdlMappingRegionLock, &oldIrql); /* Deallocate all the pages used. */ Base = (ULONG)((char*)BaseAddress - (char*)MiMdlMappingRegionBase) / PAGE_SIZE; - RtlClearBits(&MiMdlMappingRegionAllocMap, Base, RegionSize); + RtlClearBits(&MiMdlMappingRegionAllocMap, Base, PageCount); MiMdlMappingRegionHint = min (MiMdlMappingRegionHint, Base); KeReleaseSpinLock(&MiMdlMappingRegionLock, oldIrql); + + /* Reset the MDL state. */ + Mdl->MdlFlags &= ~MDL_MAPPED_TO_SYSTEM_VA; + Mdl->MappedSystemVa = NULL; + } else { MEMORY_AREA *Marea; + + assert(Mdl->Process == PsGetCurrentProcess()); - Marea = MmOpenMemoryAreaByAddress( &CurrentProcess->AddressSpace, BaseAddress ); + Marea = MmOpenMemoryAreaByAddress( &Mdl->Process->AddressSpace, BaseAddress ); if (Marea == NULL) { DPRINT1( "Couldn't open memory area when unmapping user-space pages!\n" ); KEBUGCHECK(0); } - MmFreeMemoryArea( &CurrentProcess->AddressSpace, Marea->BaseAddress, 0, NULL, NULL ); - - if (CurrentProcess != OldProcess) - { - KeDetachProcess(); - } + MmFreeMemoryArea( &Mdl->Process->AddressSpace, Marea->BaseAddress, 0, NULL, NULL ); } - /* Reset the MDL state. */ - Mdl->MdlFlags = Mdl->MdlFlags & ~MDL_MAPPED_TO_SYSTEM_VA; - Mdl->MappedSystemVa = NULL; } @@ -376,17 +419,19 @@ MmBuildMdlFromPages(PMDL Mdl, PULONG Pages) ULONG i; PULONG MdlPages; - Mdl->MdlFlags = Mdl->MdlFlags | - (MDL_PAGES_LOCKED | MDL_IO_PAGE_READ); - MdlPages = (PULONG)(Mdl + 1); for (i=0;i<(PAGE_ROUND_UP(Mdl->ByteOffset+Mdl->ByteCount)/PAGE_SIZE);i++) { MdlPages[i] = Pages[i]; } + + //FIXME: this flag should be set by the caller perhaps? + Mdl->MdlFlags |= MDL_IO_PAGE_READ; } + + /* * @unimplemented */ @@ -399,6 +444,11 @@ VOID STDCALL MmProbeAndLockPages (PMDL Mdl, * Mdl = MDL to probe * AccessMode = Access at which to probe the buffer * Operation = Operation to probe for + * + * This function can be seen as a safe version of MmBuildMdlForNonPagedPool + * used in cases where you know that the mdl address is paged memory or + * you don't know where the mdl address comes from. MmProbeAndLockPages will + * work no matter what kind of mdl address you have. */ { PULONG MdlPages; @@ -406,47 +456,65 @@ VOID STDCALL MmProbeAndLockPages (PMDL Mdl, ULONG NrPages; NTSTATUS Status; KPROCESSOR_MODE Mode; - PEPROCESS CurrentProcess = NULL; + PEPROCESS CurrentProcess = PsGetCurrentProcess(); DPRINT("MmProbeAndLockPages(Mdl %x)\n", Mdl); - /* - * FIXME: Check behaviour against NT - */ - if (Mdl->MdlFlags & MDL_PAGES_LOCKED) + assert(!(Mdl->MdlFlags & (MDL_PAGES_LOCKED|MDL_MAPPED_TO_SYSTEM_VA|MDL_PARTIAL| + MDL_IO_SPACE|MDL_SOURCE_IS_NONPAGED_POOL))); + + MdlPages = (ULONG *)(Mdl + 1); + NrPages = PAGE_ROUND_UP(Mdl->ByteOffset + Mdl->ByteCount) / PAGE_SIZE; + + /* mdl must have enough page entries */ + assert(NrPages <= (Mdl->Size - sizeof(MDL))/sizeof(ULONG)); + + + if (Mdl->StartVa >= (PVOID)KERNEL_BASE && + (MmGetPhysicalAddressForProcess(NULL, Mdl->StartVa).u.LowPart >> PAGE_SHIFT) > MmPageArraySize) { + /* phys addr is not phys memory so this must be io memory */ + + for (i = 0; i < NrPages; i++) + { + MdlPages[i] = MmGetPhysicalAddressForProcess(NULL, (char*)Mdl->StartVa + (i*PAGE_SIZE)).u.LowPart; + } + + Mdl->MdlFlags |= MDL_PAGES_LOCKED|MDL_IO_SPACE; return; } - if (Mdl->StartVa >= (PVOID)KERNEL_BASE) { + //FIXME: why isn't AccessMode used? Mode = KernelMode; + Mdl->Process = NULL; } else { + //FIXME: why isn't AccessMode used? Mode = UserMode; - CurrentProcess = PsGetCurrentProcess(); - if (Mdl->Process != CurrentProcess) - { - KeAttachProcess(Mdl->Process); - } + Mdl->Process = CurrentProcess; } + /* * Lock the pages */ + MmLockAddressSpace(&CurrentProcess->AddressSpace); - MmLockAddressSpace(&Mdl->Process->AddressSpace); - MdlPages = (ULONG *)(Mdl + 1); - NrPages = PAGE_ROUND_UP(Mdl->ByteOffset + Mdl->ByteCount) / PAGE_SIZE; for (i = 0; i < NrPages; i++) { PVOID Address; Address = (char*)Mdl->StartVa + (i*PAGE_SIZE); + /* + * FIXME: skip the probing/access stuff if buffer is nonpaged kernel space? + * -Gunnar + */ + if (!MmIsPagePresent(NULL, Address)) { Status = MmNotPresentFault(Mode, (ULONG)Address, TRUE); @@ -473,6 +541,7 @@ VOID STDCALL MmProbeAndLockPages (PMDL Mdl, { MmLockPage(MmGetPhysicalAddressForProcess(NULL, Address)); } + if ((Operation == IoWriteAccess || Operation == IoModifyAccess) && (!(MmGetPageProtect(NULL, (PVOID)Address) & PAGE_READWRITE))) { @@ -511,12 +580,9 @@ VOID STDCALL MmProbeAndLockPages (PMDL Mdl, #endif } - MmUnlockAddressSpace(&Mdl->Process->AddressSpace); - if (Mode == UserMode && Mdl->Process != CurrentProcess) - { - KeDetachProcess(); - } - Mdl->MdlFlags = Mdl->MdlFlags | MDL_PAGES_LOCKED; + + MmUnlockAddressSpace(&CurrentProcess->AddressSpace); + Mdl->MdlFlags |= MDL_PAGES_LOCKED; } @@ -552,16 +618,33 @@ MmBuildMdlForNonPagedPool (PMDL Mdl) * ARGUMENTS: * Mdl = Points to an MDL that supplies a virtual address, * byte offset and length + * + * This function can be seen as a fast version of MmProbeAndLockPages in case + * you _know_ that the mdl address is within nonpaged kernel space. */ { - ULONG va; - Mdl->MdlFlags = Mdl->MdlFlags | - (MDL_SOURCE_IS_NONPAGED_POOL | MDL_PAGES_LOCKED); - for (va=0; va < ((Mdl->Size - sizeof(MDL)) / sizeof(ULONG)); va++) + ULONG i; + ULONG PageCount; + + /* + * mdl buffer must (at least) be in kernel space, thou this doesn't + * necesarely mean that the buffer in within _nonpaged_ kernel space... + */ + assert((ULONG)Mdl->StartVa >= KERNEL_BASE); + + PageCount = PAGE_ROUND_UP(Mdl->ByteOffset + Mdl->ByteCount) / PAGE_SIZE; + + /* mdl must have enough page entries */ + assert(PageCount <= (Mdl->Size - sizeof(MDL))/sizeof(ULONG)); + + for (i=0; i < PageCount; i++) { - ((PULONG)(Mdl + 1))[va] = - (MmGetPhysicalAddress((char*)Mdl->StartVa + (va * PAGE_SIZE))).u.LowPart; + ((PULONG)(Mdl + 1))[i] = + (MmGetPhysicalAddress((char*)Mdl->StartVa + (i * PAGE_SIZE))).u.LowPart; } + + Mdl->MdlFlags |= MDL_SOURCE_IS_NONPAGED_POOL; + Mdl->Process = NULL; Mdl->MappedSystemVa = (char*)Mdl->StartVa + Mdl->ByteOffset; } @@ -570,7 +653,7 @@ MmBuildMdlForNonPagedPool (PMDL Mdl) * @implemented */ PMDL STDCALL -MmCreateMdl (PMDL MemoryDescriptorList, +MmCreateMdl (PMDL Mdl, PVOID Base, ULONG Length) /* @@ -583,22 +666,22 @@ MmCreateMdl (PMDL MemoryDescriptorList, * RETURNS: A pointer to initalized MDL */ { - if (MemoryDescriptorList == NULL) + if (Mdl == NULL) { ULONG Size; Size = MmSizeOfMdl(Base,Length); - MemoryDescriptorList = + Mdl = (PMDL)ExAllocatePoolWithTag(NonPagedPool, Size, TAG_MDL); - if (MemoryDescriptorList == NULL) + if (Mdl == NULL) { return(NULL); } } - MmInitializeMdl(MemoryDescriptorList, (char*)Base, Length); + MmInitializeMdl(Mdl, (char*)Base, Length); - return(MemoryDescriptorList); + return(Mdl); } /* @@ -620,6 +703,31 @@ MmAllocatePagesForMdl ( IN PHYSICAL_ADDRESS LowAddress, IN PHYSICAL_ADDRESS SkipBytes, IN SIZE_T Totalbytes ) { + /* + MmAllocatePagesForMdl allocates zero-filled, nonpaged, physical memory pages to an MDL + + MmAllocatePagesForMdlSearch the PFN database for free, zeroed or standby + pagesAllocates pages and puts in MDLDoes not map pages (caller responsibility) + Designed to be used by an AGP driver + + LowAddress is the lowest acceptable physical address it wants to allocate + and HighAddress is the highest. SkipBytes are the number of bytes that the + kernel should keep free above LowAddress and below the address at which it + starts to allocate physical memory. TotalBytes are the number of bytes that + the driver wants to allocate. The return value of the function is a MDL + that if non-zero describes the physical memory the kernel has given the + driver. To access portions of the memory the driver must create sub-MDLs + from the returned MDL that describe appropriate portions of the physical + memory. When a driver wants to access physical memory described by a + sub-MDL it must map the sub-MDL using MmGetSystemAddressForMdlSafe. + + Konstantin Gusev + +*/ + + /* SkipBytes must be a multiple of the page size */ + assert((SkipBytes.QuadPart % PAGE_SIZE) == 0); + DPRINT1("MmAllocatePagesForMdl(): Unimplemented.\n"); return(NULL); } @@ -627,6 +735,19 @@ MmAllocatePagesForMdl ( IN PHYSICAL_ADDRESS LowAddress, VOID STDCALL MmFreePagesFromMdl ( IN PMDL Mdl ) { + /* + Drivers use the MmFreePagesFromMdl, the kernel-mode equivalent of + FreeUserPhysicalPages, to free the physical memory it has allocated with + MmAllocatePagesForMdl. This function is also prototyped in ntddk.h: + + Note that a driver is responsible for deallocating the MDL returned by + MmAllocatePagesForMdl with a call to ExFreePool, since MmFreePagesFromMdl + does not free the MDL. + + Konstantin Gusev + + */ + DPRINT1("MmFreePagesFromMdl(): Unimplemented.\n"); } From 03cfbfef0a8b8819f17c1f280ce3ae16428f4173 Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes Date: Tue, 20 Apr 2004 19:04:11 +0000 Subject: [PATCH 0932/1463] make mdl usage/impl. more windows compliant svn path=/trunk/; revision=9189 --- reactos/drivers/fs/vfat/blockdev.c | 2 + reactos/include/ddk/mmfuncs.h | 14 ++- reactos/ntoskrnl/io/cleanup.c | 45 +++++----- reactos/ntoskrnl/io/irp.c | 140 +++++++++++++++++++---------- reactos/ntoskrnl/io/mdl.c | 49 +++++++--- 5 files changed, 163 insertions(+), 87 deletions(-) diff --git a/reactos/drivers/fs/vfat/blockdev.c b/reactos/drivers/fs/vfat/blockdev.c index 221142c4b59..529f85734ba 100644 --- a/reactos/drivers/fs/vfat/blockdev.c +++ b/reactos/drivers/fs/vfat/blockdev.c @@ -32,6 +32,8 @@ VfatReadWriteCompletion (IN PDEVICE_OBJECT DeviceObject, while ((Mdl = Irp->MdlAddress)) { Irp->MdlAddress = Mdl->Next; + + MmUnlockPages(Mdl); IoFreeMdl(Mdl); } diff --git a/reactos/include/ddk/mmfuncs.h b/reactos/include/ddk/mmfuncs.h index 21c2a33073d..2940bdc9be8 100644 --- a/reactos/include/ddk/mmfuncs.h +++ b/reactos/include/ddk/mmfuncs.h @@ -1,6 +1,6 @@ #ifndef _INCLUDE_DDK_MMFUNCS_H #define _INCLUDE_DDK_MMFUNCS_H -/* $Id: mmfuncs.h,v 1.20 2004/02/10 16:22:56 navaraf Exp $ */ +/* $Id: mmfuncs.h,v 1.21 2004/04/20 19:04:11 gdalsnes Exp $ */ /* MEMORY MANAGMENT ******************************************************/ @@ -51,6 +51,8 @@ extern inline unsigned int ADDRESS_AND_SIZE_TO_SPAN_PAGES(PVOID Va, * FUNCTION: Returns the byte offset of the address within its page */ #define BYTE_OFFSET(va) (((ULONG)va)%PAGE_SIZE) +#define PAGE_OFFSET(va) BYTE_OFFSET(va) + /* * FUNCTION: Takes a count in bytes and returns the number of pages @@ -58,6 +60,11 @@ extern inline unsigned int ADDRESS_AND_SIZE_TO_SPAN_PAGES(PVOID Va, */ #define BYTES_TO_PAGES(Size) \ ((ULONG) ((ULONG_PTR) (Size) >> PAGE_SHIFT) + (((ULONG) (Size) & (PAGE_SIZE - 1)) != 0)) + + +#define PAGE_ALIGN(va) ( (PVOID) (((ULONG)(va)) & (~(PAGE_SIZE-1))) ) +#define PAGE_BASE(va) PAGE_ALIGN(va) + DWORD STDCALL @@ -271,10 +278,9 @@ MmGrowKernelStack ( (MemoryDescriptorList)->Size = (CSHORT)(sizeof(MDL) + \ (ADDRESS_AND_SIZE_TO_SPAN_PAGES((BaseVa),(Length)) * sizeof(ULONG))); \ (MemoryDescriptorList)->MdlFlags = 0; \ - (MemoryDescriptorList)->StartVa = (PVOID)PAGE_ROUND_DOWN((BaseVa)); \ - (MemoryDescriptorList)->ByteOffset = (ULONG)((BaseVa) - PAGE_ROUND_DOWN((BaseVa))); \ + (MemoryDescriptorList)->StartVa = (PVOID)PAGE_BASE(BaseVa); \ + (MemoryDescriptorList)->ByteOffset = (ULONG)PAGE_OFFSET(BaseVa); \ (MemoryDescriptorList)->ByteCount = (Length); \ - (MemoryDescriptorList)->Process = PsGetCurrentProcess(); \ } /* diff --git a/reactos/ntoskrnl/io/cleanup.c b/reactos/ntoskrnl/io/cleanup.c index bf7858dda0a..f9bb8995346 100644 --- a/reactos/ntoskrnl/io/cleanup.c +++ b/reactos/ntoskrnl/io/cleanup.c @@ -119,27 +119,20 @@ VOID IoReadWriteCompletion(PDEVICE_OBJECT DeviceObject, FileObject = IoStack->FileObject; if (DeviceObject->Flags & DO_BUFFERED_IO) - { - if (IoStack->MajorFunction == IRP_MJ_READ) - { - DPRINT("Copying buffered io back to user\n"); - memcpy(Irp->UserBuffer,Irp->AssociatedIrp.SystemBuffer, + { + if (IoStack->MajorFunction == IRP_MJ_READ) + { + DPRINT("Copying buffered io back to user\n"); + memcpy(Irp->UserBuffer,Irp->AssociatedIrp.SystemBuffer, IoStack->Parameters.Read.Length); - } - ExFreePool(Irp->AssociatedIrp.SystemBuffer); - } + } + ExFreePool(Irp->AssociatedIrp.SystemBuffer); + } + if (DeviceObject->Flags & DO_DIRECT_IO) - { - /* FIXME: Is the MDL destroyed on a paging i/o, check all cases. */ - DPRINT("Tearing down MDL\n"); - if (Irp->MdlAddress->MappedSystemVa != NULL) - { - MmUnmapLockedPages(Irp->MdlAddress->MappedSystemVa, - Irp->MdlAddress); - } - MmUnlockPages(Irp->MdlAddress); - ExFreePool(Irp->MdlAddress); - } + { + IoFreeMdl(Irp->MdlAddress); + } } VOID IoVolumeInformationCompletion(PDEVICE_OBJECT DeviceObject, @@ -201,6 +194,13 @@ IoSecondStageCompletion( Irp = (PIRP)(*SystemArgument1); PriorityBoost = (CCHAR)(LONG)(*SystemArgument2); + /* + * Note that we'll never see irp's flagged IRP_PAGING_IO (IRP_MOUNT_OPERATION) + * or IRP_CLOSE_OPERATION (IRP_MJ_CLOSE and IRP_MJ_CLEANUP) here since their + * cleanup/completion is fully taken care of in IoCompleteRequest. + * -Gunnar + */ + /* Remove synchronous irp's from the threads cleanup list. To synchronize with the code inserting the entry, this code must run @@ -278,7 +278,7 @@ IoSecondStageCompletion( } //Windows NT File System Internals, page 154 - if (!(Irp->Flags & IRP_PAGING_IO) && OriginalFileObject) + if (OriginalFileObject) { // if the event is not the one in the file object, it needs dereferenced if (Irp->UserEvent && Irp->UserEvent != &OriginalFileObject->Event) @@ -286,10 +286,7 @@ IoSecondStageCompletion( ObDereferenceObject(Irp->UserEvent); } - if (IoStack->MajorFunction != IRP_MJ_CLOSE) - { - ObDereferenceObject(OriginalFileObject); - } + ObDereferenceObject(OriginalFileObject); } if (Irp->Overlay.AsynchronousParameters.UserApcRoutine != NULL) diff --git a/reactos/ntoskrnl/io/irp.c b/reactos/ntoskrnl/io/irp.c index d720f007cce..08eee855758 100644 --- a/reactos/ntoskrnl/io/irp.c +++ b/reactos/ntoskrnl/io/irp.c @@ -1,4 +1,4 @@ -/* $Id: irp.c,v 1.58 2004/03/04 00:07:00 navaraf Exp $ +/* $Id: irp.c,v 1.59 2004/04/20 19:01:47 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -231,6 +231,7 @@ IofCompleteRequest(PIRP Irp, PDEVICE_OBJECT DeviceObject; PFILE_OBJECT OriginalFileObject; KIRQL oldIrql; + PMDL Mdl; DPRINT("IoCompleteRequest(Irp %x, PriorityBoost %d) Event %x THread %x\n", Irp,PriorityBoost, Irp->UserEvent, PsGetCurrentThread()); @@ -285,42 +286,83 @@ IofCompleteRequest(PIRP Irp, } } - if (Irp->Flags & (IRP_PAGING_IO|IRP_CLOSE_OPERATION)) - { - if (Irp->Flags & IRP_PAGING_IO) - { - /* FIXME: - * The mdl must be freed by the caller! - */ - if (Irp->MdlAddress->MappedSystemVa != NULL) - { - MmUnmapLockedPages(Irp->MdlAddress->MappedSystemVa, - Irp->MdlAddress); - } - MmUnlockPages(Irp->MdlAddress); - ExFreePool(Irp->MdlAddress); - } - if (Irp->UserIosb) - { - *Irp->UserIosb = Irp->IoStatus; - } - if (Irp->UserEvent) - { - KeSetEvent(Irp->UserEvent, PriorityBoost, FALSE); - } - IoFreeIrp(Irp); - } - else - { - //Windows NT File System Internals, page 154 - OriginalFileObject = Irp->Tail.Overlay.OriginalFileObject; + /* + * Were done calling completion routines. Now do any cleanup that can be + * done in an arbitrarily context. + */ - if (Irp->PendingReturned || KeGetCurrentIrql() == DISPATCH_LEVEL) + /* Windows NT File System Internals, page 165 */ + if (Irp->Flags & (IRP_PAGING_IO|IRP_CLOSE_OPERATION)) + { + if (Irp->Flags & IRP_PAGING_IO) + { + /* FIXME: + * The mdl should be freed by the caller! + */ + if (Irp->MdlAddress->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) { - BOOLEAN bStatus; + MmUnmapLockedPages(Irp->MdlAddress->MappedSystemVa, Irp->MdlAddress); + } + + ExFreePool(Irp->MdlAddress); + } + + if (Irp->UserIosb) + { + *Irp->UserIosb = Irp->IoStatus; + } + + if (Irp->UserEvent) + { + KeSetEvent(Irp->UserEvent, PriorityBoost, FALSE); + } - DPRINT("Dispatching APC\n"); - KeInitializeApc( &Irp->Tail.Apc, + /* io manager frees the irp for close operations */ + if (Irp->Flags & IRP_PAGING_IO) + { + IoFreeIrp(Irp); + } + + return; + } + + + /* + Hi Dave, + + I went through my old notes. You are correct and in most cases + IoCompleteRequest() will issue an MmUnlockPages() for each MDL in the IRP + chain. There are however few exceptions: one is MDLs for associated IRPs, + it's expected that those MDLs have been initialized with + IoBuildPartialMdl(). Another exception is PAGING_IO irps, the i/o completion + code doesn't do anything to MDLs of those IRPs. + + sara + +*/ + + //Windows NT File System Internals, page 166/167 + if (!(Irp->Flags & IRP_ASSOCIATED_IRP)) + { + for (Mdl = Irp->MdlAddress; Mdl; Mdl = Mdl->Next) + { + /* + * Undo the MmProbeAndLockPages. If MmGetSystemAddressForMdl was called + * on this mdl, this mapping (if any) is also undone by MmUnlockPages. + */ + MmUnlockPages(Irp->MdlAddress); + } + } + + //Windows NT File System Internals, page 154 + OriginalFileObject = Irp->Tail.Overlay.OriginalFileObject; + + if (Irp->PendingReturned || KeGetCurrentIrql() == DISPATCH_LEVEL) + { + BOOLEAN bStatus; + + DPRINT("Dispatching APC\n"); + KeInitializeApc( &Irp->Tail.Apc, &Irp->Tail.Overlay.Thread->Tcb, OriginalApcEnvironment, IoSecondStageCompletion,//kernel routine @@ -329,27 +371,27 @@ IofCompleteRequest(PIRP Irp, KernelMode, OriginalFileObject); - bStatus = KeInsertQueueApc(&Irp->Tail.Apc, + bStatus = KeInsertQueueApc(&Irp->Tail.Apc, (PVOID)Irp, (PVOID)(ULONG)PriorityBoost, PriorityBoost); - if (bStatus == FALSE) - { - DPRINT1("Error queueing APC for thread. Thread has probably exited.\n"); - } + if (bStatus == FALSE) + { + DPRINT1("Error queueing APC for thread. Thread has probably exited.\n"); + } - DPRINT("Finished dispatching APC\n"); - } - else - { - DPRINT("Calling IoSecondStageCompletion routine directly\n"); - KeRaiseIrql(APC_LEVEL, &oldIrql); - IoSecondStageCompletion(NULL,NULL,(PVOID)&OriginalFileObject,(PVOID) &Irp,(PVOID) &PriorityBoost); - KeLowerIrql(oldIrql); - DPRINT("Finished completition routine\n"); - } + DPRINT("Finished dispatching APC\n"); } + else + { + DPRINT("Calling IoSecondStageCompletion routine directly\n"); + KeRaiseIrql(APC_LEVEL, &oldIrql); + IoSecondStageCompletion(NULL,NULL,(PVOID)&OriginalFileObject,(PVOID) &Irp,(PVOID) &PriorityBoost); + KeLowerIrql(oldIrql); + DPRINT("Finished completition routine\n"); + } + } diff --git a/reactos/ntoskrnl/io/mdl.c b/reactos/ntoskrnl/io/mdl.c index f476511461f..6ff5aeb1310 100644 --- a/reactos/ntoskrnl/io/mdl.c +++ b/reactos/ntoskrnl/io/mdl.c @@ -1,4 +1,4 @@ -/* $Id: mdl.c,v 1.13 2003/12/30 18:52:04 fireball Exp $ +/* $Id: mdl.c,v 1.14 2004/04/20 19:01:47 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -50,15 +50,38 @@ IoAllocateMdl(PVOID VirtualAddress, TAG_MDL); } MmInitializeMdl(Mdl, (char*)VirtualAddress, Length); - if (Irp!=NULL && !SecondaryBuffer) - { - Irp->MdlAddress = Mdl; - } + + if (Irp) + { + if (SecondaryBuffer) + { + assert(Irp->MdlAddress); + + /* FIXME: add to end of list maybe?? */ + Mdl->Next = Irp->MdlAddress->Next; + Irp->MdlAddress->Next = Mdl; + } + else + { + /* + * What if there's allready an mdl at Irp->MdlAddress? + * Is that bad and should we do something about it? + */ + Irp->MdlAddress = Mdl; + } + } + return(Mdl); } /* * @implemented + * + * You must IoFreeMdl the slave before freeing the master. + * + * IoBuildPartialMdl is more similar to MmBuildMdlForNonPagedPool, the difference + * is that the former takes the physical addresses from the master MDL, while the + * latter - from the known location of the NPP. */ VOID STDCALL @@ -74,9 +97,11 @@ IoBuildPartialMdl(PMDL SourceMdl, PAGE_SIZE; for (Va = 0; Va < (PAGE_ROUND_UP(Length)/PAGE_SIZE); Va++) - { - TargetPages[Va] = SourcePages[Va+Delta]; - } + { + TargetPages[Va] = SourcePages[Va+Delta]; + } + + TargetMdl->MdlFlags |= MDL_PARTIAL; } /* @@ -85,8 +110,12 @@ IoBuildPartialMdl(PMDL SourceMdl, VOID STDCALL IoFreeMdl(PMDL Mdl) { - MmUnmapLockedPages(MmGetSystemAddressForMdl(Mdl), Mdl); - MmUnlockPages(Mdl); + /* + * This unmaps partial mdl's from kernel space but also asserts that non-partial + * mdl's isn't still mapped into kernel space. + */ + MmPrepareMdlForReuse(Mdl); + ExFreePool(Mdl); } From 9acfed6d385519d701ffcc1e413e0560a0bffb18 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Tue, 20 Apr 2004 20:39:19 +0000 Subject: [PATCH 0933/1463] Filip Navara NtGetTickCount implementation. svn path=/trunk/; revision=9190 --- reactos/include/ntos/zw.h | 6 +++--- reactos/ntoskrnl/ke/timer.c | 19 ++++++++----------- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/reactos/include/ntos/zw.h b/reactos/include/ntos/zw.h index 00f770ae370..e66eba54a0d 100755 --- a/reactos/include/ntos/zw.h +++ b/reactos/include/ntos/zw.h @@ -1,5 +1,5 @@ -/* $Id: zw.h,v 1.22 2004/04/09 20:03:11 navaraf Exp $ +/* $Id: zw.h,v 1.23 2004/04/20 20:39:19 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -4799,10 +4799,10 @@ NtFlushVirtualMemory( * UpTime = Number of clock ticks since boot. * RETURNS: Status */ -NTSTATUS +ULONG STDCALL NtGetTickCount( - PULONG UpTime + VOID ); /* diff --git a/reactos/ntoskrnl/ke/timer.c b/reactos/ntoskrnl/ke/timer.c index a3138134bc8..5cef98da22e 100644 --- a/reactos/ntoskrnl/ke/timer.c +++ b/reactos/ntoskrnl/ke/timer.c @@ -1,4 +1,4 @@ -/* $Id: timer.c,v 1.71 2004/04/18 00:52:57 jimtabor Exp $ +/* $Id: timer.c,v 1.72 2004/04/20 20:38:41 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -236,21 +236,18 @@ KeQueryInterruptTime(PLARGE_INTEGER CurrentTime) } - -NTSTATUS STDCALL -NtGetTickCount (PULONG UpTime) +/* + * @implemented + */ +ULONG +STDCALL +NtGetTickCount(VOID) { LARGE_INTEGER TickCount; - if (UpTime == NULL) - { - return(STATUS_INVALID_PARAMETER); - } - KeQueryTickCount(&TickCount); - return(MmCopyToCaller(UpTime, &TickCount.u.LowPart, sizeof(*UpTime))); + return TickCount.u.LowPart; } - /* * @implemented */ From 8a39d95805934062b53175cdecca0e79c9959752 Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes Date: Tue, 20 Apr 2004 23:14:35 +0000 Subject: [PATCH 0934/1463] temp.workaround: allways free irp svn path=/trunk/; revision=9191 --- reactos/ntoskrnl/io/irp.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/ntoskrnl/io/irp.c b/reactos/ntoskrnl/io/irp.c index 08eee855758..32b9d2c2967 100644 --- a/reactos/ntoskrnl/io/irp.c +++ b/reactos/ntoskrnl/io/irp.c @@ -1,4 +1,4 @@ -/* $Id: irp.c,v 1.59 2004/04/20 19:01:47 gdalsnes Exp $ +/* $Id: irp.c,v 1.60 2004/04/20 23:14:35 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -318,10 +318,10 @@ IofCompleteRequest(PIRP Irp, } /* io manager frees the irp for close operations */ - if (Irp->Flags & IRP_PAGING_IO) - { +// if (Irp->Flags & IRP_PAGING_IO) +// { IoFreeIrp(Irp); - } +// } return; } From 22adb5da8831ca7b78b90bd8e4e0fb016d8682f5 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Wed, 21 Apr 2004 21:40:43 +0000 Subject: [PATCH 0935/1463] - Made some flags for the flag value from the FILE structure compatible with the mingw headers. - Use _IO_LBF instead of _IOLBF, because _IOSTRG and _IOLBF has the same value. svn path=/trunk/; revision=9194 --- reactos/include/msvcrt/stdio.h | 44 +++++++++++++++--------------- reactos/lib/msvcrt/stdio/fflush.c | 2 +- reactos/lib/msvcrt/stdio/filbuf.c | 6 ++-- reactos/lib/msvcrt/stdio/flsbuf.c | 8 +++--- reactos/lib/msvcrt/stdio/fwrite.c | 2 +- reactos/lib/msvcrt/stdio/putchar.c | 4 +-- reactos/lib/msvcrt/stdio/setvbuf.c | 8 ++++-- reactos/lib/msvcrt/stdio/stdhnd.c | 4 +-- 8 files changed, 41 insertions(+), 37 deletions(-) diff --git a/reactos/include/msvcrt/stdio.h b/reactos/include/msvcrt/stdio.h index 8ddce7d8c82..ca291f05b1f 100644 --- a/reactos/include/msvcrt/stdio.h +++ b/reactos/include/msvcrt/stdio.h @@ -22,9 +22,9 @@ * DISCLAIMED. This includes but is not limited to warranties of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * - * $Revision: 1.7 $ - * $Author: sedwards $ - * $Date: 2003/08/25 01:37:47 $ + * $Revision: 1.8 $ + * $Author: hbirr $ + * $Date: 2004/04/21 21:40:43 $ * */ /* Appropriated for Reactos Crtdll by Ariadne */ @@ -46,26 +46,22 @@ extern "C" { #include -/* Some flags for the iobuf structure provided by djgpp stdio.h */ -#define _IOREAD 0x000010 -#define _IOWRT 0x000020 -#define _IOMYBUF 0x000040 -#define _IOEOF 0x000100 -#define _IOERR 0x000200 -#define _IOSTRG 0x000400 +#define _IOREAD 0x0001 +#define _IOWRT 0x0002 +#define _IOMYBUF 0x0008 /* stdio malloc()'d buffer */ +#define _IOEOF 0x0010 /* EOF reached on read */ +#define _IOERR 0x0020 /* I/O error from system */ +#define _IOSTRG 0x0040 /* Strange or no file descriptor */ -#define _IOBINARY 0x000800 +#define _IOBINARY 0x040000 #define _IOTEXT 0x000000 -#define _IOAPPEND 0x002000 -#define _IORMONCL 0x004000 /* remove on close, for temp files */ -/* if _flag & _IORMONCL, ._name_to_remove needs freeing */ -#define _IOUNGETC 0x010000 /* there is an ungetc'ed character in the buffer */ -#define _IOCOMMIT 0x008000 +#define _IOCOMMIT 0x100000 + +#define _IODIRTY 0x010000 +#define _IOAHEAD 0x020000 + -#define _IODIRTY 0x000080 -#define _IOAHEAD 0x000008 -#define _IORW (_IOREAD | _IOWRITE ) /* @@ -180,9 +176,13 @@ wchar_t *_wtempnam(const wchar_t *dir,const wchar_t *prefix); * NOTE: _IOFBF works, but _IOLBF seems to work like unbuffered... * maybe I'm testing it wrong? */ -#define _IOFBF 0 /* fully buffered */ -#define _IOLBF 1 /* line buffered */ -#define _IONBF 2 /* unbuffered */ +#define _IOFBF 0x0000 /* full buffered */ +#define _IOLBF 0x0040 /* line buffered */ +#define _IONBF 0x0004 /* not buffered */ + +#define _IO_LBF 0x80000 /* this value is used insteat of _IOLBF within the + structure FILE as value for _flags, + because _IOLBF has the same value as _IOSTRG */ int setvbuf(FILE* fileSetBuffer, char* caBuffer, int nMode, size_t sizeBuffer); diff --git a/reactos/lib/msvcrt/stdio/fflush.c b/reactos/lib/msvcrt/stdio/fflush.c index 6ce5e09ae73..e70e4cf41ef 100644 --- a/reactos/lib/msvcrt/stdio/fflush.c +++ b/reactos/lib/msvcrt/stdio/fflush.c @@ -81,7 +81,7 @@ int fflush(FILE *f) f->_flag &= ~_IOAHEAD; - f->_cnt = (f->_flag&(_IOLBF|_IONBF)) ? 0 : f->_bufsiz; + f->_cnt = (f->_flag&(_IO_LBF|_IONBF)) ? 0 : f->_bufsiz; // how can write return less than rn without being on error ??? diff --git a/reactos/lib/msvcrt/stdio/filbuf.c b/reactos/lib/msvcrt/stdio/filbuf.c index 306c8bd976c..64b2134f5c3 100644 --- a/reactos/lib/msvcrt/stdio/filbuf.c +++ b/reactos/lib/msvcrt/stdio/filbuf.c @@ -34,7 +34,7 @@ int _filbuf(FILE* f) if ((f->_base = malloc(size+1)) == NULL) { // error ENOMEM f->_flag |= _IONBF; - f->_flag &= ~(_IOFBF|_IOLBF); + f->_flag &= ~(_IOFBF|_IO_LBF); } else { f->_flag |= _IOMYBUF; f->_bufsiz = size; @@ -45,9 +45,9 @@ int _filbuf(FILE* f) // flush stdout before reading from stdin if (f == stdin) { - if (stdout->_flag&_IOLBF) + if (stdout->_flag&_IO_LBF) fflush(stdout); - if (stderr->_flag&_IOLBF) + if (stderr->_flag&_IO_LBF) fflush(stderr); } diff --git a/reactos/lib/msvcrt/stdio/flsbuf.c b/reactos/lib/msvcrt/stdio/flsbuf.c index 5d01507772f..e0b4154b902 100644 --- a/reactos/lib/msvcrt/stdio/flsbuf.c +++ b/reactos/lib/msvcrt/stdio/flsbuf.c @@ -40,19 +40,19 @@ int _flsbuf(int c, FILE* f) size = 4096; if ((f->_base = base = malloc(size)) == NULL) { f->_flag |= _IONBF; - f->_flag &= ~(_IOFBF|_IOLBF); + f->_flag &= ~(_IOFBF|_IO_LBF); } else { f->_flag |= _IOMYBUF; f->_cnt = f->_bufsiz = size; f->_ptr = base; rn = 0; if (f == stdout && isatty(fileno(stdout))) { - f->_flag |= _IOLBF; + f->_flag |= _IO_LBF; } } } - if (f->_flag & _IOLBF) { + if (f->_flag & _IO_LBF) { /* in line-buffering mode we get here on each character */ *f->_ptr++ = c; rn = f->_ptr - base; @@ -90,7 +90,7 @@ int _flsbuf(int c, FILE* f) rn -= n; base += n; } - if ((f->_flag & (_IOLBF|_IONBF)) == 0) { + if ((f->_flag & (_IO_LBF|_IONBF)) == 0) { f->_cnt--; *f->_ptr++ = c; } diff --git a/reactos/lib/msvcrt/stdio/fwrite.c b/reactos/lib/msvcrt/stdio/fwrite.c index 7d6e23d2c5a..24d5739a01c 100644 --- a/reactos/lib/msvcrt/stdio/fwrite.c +++ b/reactos/lib/msvcrt/stdio/fwrite.c @@ -44,7 +44,7 @@ size_t fwrite(const void *vptr, size_t size, size_t count, FILE *iop) return 1; } - if (iop->_flag & _IOLBF) + if (iop->_flag & _IO_LBF) { while (to_write > 0) { diff --git a/reactos/lib/msvcrt/stdio/putchar.c b/reactos/lib/msvcrt/stdio/putchar.c index 911e29e4db9..7c3030cc9c4 100644 --- a/reactos/lib/msvcrt/stdio/putchar.c +++ b/reactos/lib/msvcrt/stdio/putchar.c @@ -21,7 +21,7 @@ int putchar(int c) { int r = putc(c, stdout); - if (stdout->_flag & _IOLBF) + if (stdout->_flag & _IO_LBF) fflush(stdout); return r; } @@ -32,7 +32,7 @@ int putchar(int c) wint_t putwchar(wint_t c) { wint_t r = putwc(c, stdout); - if (stdout->_flag & _IOLBF) + if (stdout->_flag & _IO_LBF) fflush(stdout); return r; } diff --git a/reactos/lib/msvcrt/stdio/setvbuf.c b/reactos/lib/msvcrt/stdio/setvbuf.c index 8447b35602d..d0dadf0c786 100644 --- a/reactos/lib/msvcrt/stdio/setvbuf.c +++ b/reactos/lib/msvcrt/stdio/setvbuf.c @@ -20,10 +20,14 @@ int setvbuf(FILE *f, char *buf, int type, size_t len) } if ( f->_base != NULL ) fflush(f); + /* Cannot use _IOLBF as flag value because _IOLBF is equal to _IOSTRG */ + if (type == _IOLBF) + type = _IO_LBF; + switch (type) { case _IOFBF: - case _IOLBF: + case _IO_LBF: if (len <= 0) { __set_errno (EINVAL); return EOF; @@ -43,7 +47,7 @@ int setvbuf(FILE *f, char *buf, int type, size_t len) free(f->_base); f->_cnt = 0; - f->_flag &= ~(_IONBF|_IOFBF|_IOLBF|_IOUNGETC); + f->_flag &= ~(_IONBF|_IOFBF|_IO_LBF|_IOUNGETC); f->_flag |= type; if (type != _IONBF) { diff --git a/reactos/lib/msvcrt/stdio/stdhnd.c b/reactos/lib/msvcrt/stdio/stdhnd.c index 3d594870e1f..012cd481599 100644 --- a/reactos/lib/msvcrt/stdio/stdhnd.c +++ b/reactos/lib/msvcrt/stdio/stdhnd.c @@ -7,13 +7,13 @@ FILE _iob[5] = // stdin { NULL, 0, NULL, - _IOREAD | _IOLBF , + _IOREAD | _IO_LBF , 0, 0,0, NULL }, // stdout { NULL, 0, NULL, - _IOWRT | _IOLBF |_IOSTRG, + _IOWRT | _IO_LBF |_IOSTRG, 1,0,0, NULL }, // stderr From 28dfa0ecb77b43c5e1e4c5b60baabf9c6a795448 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Thu, 22 Apr 2004 01:57:49 +0000 Subject: [PATCH 0936/1463] Implemented new Ros exclusive function SystemFullMemoryInformation. This is used for suppling virtual user memory usage for GlobalMemoryStatusEx. svn path=/trunk/; revision=9195 --- reactos/ntoskrnl/ex/sysinfo.c | 129 ++++++++++++++++++------- reactos/ntoskrnl/include/internal/mm.h | 14 +++ reactos/ntoskrnl/mm/balance.c | 13 +-- reactos/ntoskrnl/mm/pagefile.c | 6 +- 4 files changed, 112 insertions(+), 50 deletions(-) diff --git a/reactos/ntoskrnl/ex/sysinfo.c b/reactos/ntoskrnl/ex/sysinfo.c index ddd43e5a625..29c792715a3 100644 --- a/reactos/ntoskrnl/ex/sysinfo.c +++ b/reactos/ntoskrnl/ex/sysinfo.c @@ -1,4 +1,4 @@ -/* $Id: sysinfo.c,v 1.27 2004/04/14 07:10:44 jimtabor Exp $ +/* $Id: sysinfo.c,v 1.28 2004/04/22 01:55:49 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -23,9 +23,13 @@ #include #include +#define NDEBUG #include extern ULONG NtGlobalFlag; /* FIXME: it should go in a ddk/?.h */ +VOID STDCALL KeQueryInterruptTime(PLARGE_INTEGER CurrentTime); + +VOID MmPrintMemoryStatistic(VOID); /* FUNCTIONS *****************************************************************/ @@ -293,19 +297,17 @@ QSI_DEF(SystemBasicInformation) { return (STATUS_INFO_LENGTH_MISMATCH); } - Sbi->Unknown = 0; - Sbi->MaximumIncrement = 0; /* FIXME */ + Sbi->MaximumIncrement = 100000; /* FIXME */ Sbi->PhysicalPageSize = PAGE_SIZE; /* FIXME: it should be PAGE_SIZE */ - Sbi->NumberOfPhysicalPages = 0; /* FIXME */ - Sbi->LowestPhysicalPage = 0; /* FIXME */ - Sbi->HighestPhysicalPage = 0; /* FIXME */ + Sbi->NumberOfPhysicalPages = MmStats.NrTotalPages; + Sbi->LowestPhysicalPage = 0; /* FIXME */ + Sbi->HighestPhysicalPage = MmStats.NrTotalPages; /* FIXME */ Sbi->AllocationGranularity = 65536; /* hard coded on Intel? */ - Sbi->LowestUserAddress = 0; /* FIXME */ - Sbi->HighestUserAddress = 0; /* FIXME */ + Sbi->LowestUserAddress = 0x10000; /* Top of 64k */ + Sbi->HighestUserAddress = 0x7ffeffff; /* From mm/mminit.c */ Sbi->ActiveProcessors = 0x00000001; /* FIXME */ Sbi->NumberProcessors = KeNumberProcessors; - return (STATUS_SUCCESS); } @@ -333,13 +335,29 @@ QSI_DEF(SystemProcessorInformation) return (STATUS_SUCCESS); } +/* +typedef struct _MM_MEMORY_CONSUMER +{ + ULONG PagesUsed; + ULONG PagesTarget; + NTSTATUS (*Trim)(ULONG Target, ULONG Priority, PULONG NrFreed); +} +MM_MEMORY_CONSUMER, *PMM_MEMORY_CONSUMER; +extern MM_MEMORY_CONSUMER MiMemoryConsumers[MC_MAXIMUM]; + +extern ULONG MiFreeSwapPages; +extern ULONG MiUsedSwapPages; +extern ULONG MmPagedPoolSize; +*/ /* Class 2 - Performance Information */ QSI_DEF(SystemPerformanceInformation) { PSYSTEM_PERFORMANCE_INFORMATION Spi = (PSYSTEM_PERFORMANCE_INFORMATION) Buffer; + PEPROCESS TheIdleProcess; + *ReqSize = sizeof (SYSTEM_PERFORMANCE_INFORMATION); /* * Check user buffer's size @@ -349,7 +367,9 @@ QSI_DEF(SystemPerformanceInformation) return (STATUS_INFO_LENGTH_MISMATCH); } - Spi->IdleTime.QuadPart = PsInitialSystemProcess->Pcb.KernelTime * 100000; + PsLookupProcessByProcessId((PVOID) 1, &TheIdleProcess); + + Spi->IdleTime.QuadPart = TheIdleProcess->Pcb.KernelTime * 100000; Spi->ReadTransferCount.QuadPart = 0; /* FIXME */ Spi->WriteTransferCount.QuadPart = 0; /* FIXME */ @@ -357,9 +377,11 @@ QSI_DEF(SystemPerformanceInformation) Spi->ReadOperationCount = 0; /* FIXME */ Spi->WriteOperationCount = 0; /* FIXME */ Spi->OtherOperationCount = 0; /* FIXME */ + Spi->AvailablePages = MiNrAvailablePages; - Spi->TotalCommittedPages = 0; /* FIXME */ - Spi->TotalCommitLimit = 0; /* FIXME */ + Spi->TotalCommittedPages = MiUsedSwapPages; + Spi->TotalCommitLimit = MiFreeSwapPages + MiUsedSwapPages; /* FIXME */ + Spi->PeakCommitment = 0; /* FIXME */ Spi->PageFaults = 0; /* FIXME */ Spi->WriteCopyFaults = 0; /* FIXME */ @@ -374,24 +396,28 @@ QSI_DEF(SystemPerformanceInformation) Spi->PagefilePageWriteIos = 0; /* FIXME */ Spi->MappedFilePagesWritten = 0; /* FIXME */ Spi->MappedFilePageWriteIos = 0; /* FIXME */ - Spi->PagedPoolUsage = 0; /* FIXME */ - Spi->NonPagedPoolUsage = 0; /* FIXME */ + + Spi->PagedPoolUsage = MiMemoryConsumers[MC_PPOOL].PagesUsed; Spi->PagedPoolAllocs = 0; /* FIXME */ Spi->PagedPoolFrees = 0; /* FIXME */ + Spi->NonPagedPoolUsage = MiMemoryConsumers[MC_NPPOOL].PagesUsed; Spi->NonPagedPoolAllocs = 0; /* FIXME */ Spi->NonPagedPoolFrees = 0; /* FIXME */ + Spi->TotalFreeSystemPtes = 0; /* FIXME */ - Spi->SystemCodePage = 0; /* FIXME */ + + Spi->SystemCodePage = MmStats.NrSystemPages; /* FIXME */ + Spi->TotalSystemDriverPages = 0; /* FIXME */ Spi->TotalSystemCodePages = 0; /* FIXME */ Spi->SmallNonPagedLookasideListAllocateHits = 0; /* FIXME */ Spi->SmallPagedLookasideListAllocateHits = 0; /* FIXME */ Spi->Reserved3 = 0; /* FIXME */ - Spi->MmSystemCachePage = 0; /* FIXME */ - Spi->PagedPoolPage = 0; /* FIXME */ - Spi->SystemDriverPage = 0; /* FIXME */ + Spi->MmSystemCachePage = MiMemoryConsumers[MC_CACHE].PagesUsed; + Spi->PagedPoolPage = MmPagedPoolSize; /* FIXME */ + Spi->SystemDriverPage = 0; /* FIXME */ Spi->FastReadNoWait = 0; /* FIXME */ Spi->FastReadWait = 0; /* FIXME */ Spi->FastReadResourceMiss = 0; /* FIXME */ @@ -437,7 +463,7 @@ QSI_DEF(SystemPerformanceInformation) /* Class 3 - Time Of Day Information */ QSI_DEF(SystemTimeOfDayInformation) { - LARGE_INTEGER CurrentTime; + LARGE_INTEGER CurrentTime; PSYSTEM_TIMEOFDAY_INFORMATION Sti = (PSYSTEM_TIMEOFDAY_INFORMATION) Buffer; @@ -521,12 +547,8 @@ QSI_DEF(SystemProcessInformation) SpiCur->NextEntryDelta = curSize+inLen; // relative offset to the beginnnig of the next structure SpiCur->ThreadCount = nThreads; SpiCur->CreateTime = pr->CreateTime; -/* - * System Clock is 18.2 psec. - */ SpiCur->UserTime.QuadPart = pr->Pcb.UserTime * 100000; SpiCur->KernelTime.QuadPart = pr->Pcb.KernelTime * 100000; - SpiCur->ProcessName.Length = strlen(pr->ImageFileName) * sizeof(WCHAR); SpiCur->ProcessName.MaximumLength = inLen; SpiCur->ProcessName.Buffer = (void*)(pCur+curSize); @@ -540,15 +562,19 @@ QSI_DEF(SystemProcessInformation) SpiCur->InheritedFromProcessId = (DWORD)(pr->InheritedFromUniqueProcessId); SpiCur->HandleCount = 0; // FIXME SpiCur->VmCounters.PeakVirtualSize = pr->PeakVirtualSize; - SpiCur->VmCounters.VirtualSize = 0; // FIXME + 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 = 0; // FIXME - SpiCur->VmCounters.QuotaPagedPoolUsage = 0; // FIXME - SpiCur->VmCounters.QuotaPeakNonPagedPoolUsage = 0; // FIXME - SpiCur->VmCounters.QuotaNonPagedPoolUsage = 0; // FIXME - SpiCur->VmCounters.PagefileUsage = 0; // FIXME + SpiCur->VmCounters.QuotaPeakPagedPoolUsage = + pr->QuotaPeakPoolUsage[0]; + SpiCur->VmCounters.QuotaPagedPoolUsage = + pr->QuotaPoolUsage[0]; + SpiCur->VmCounters.QuotaPeakNonPagedPoolUsage = + 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 @@ -614,6 +640,9 @@ QSI_DEF(SystemProcessorPerformanceInformation) PSYSTEM_PROCESSORTIME_INFO Spi = (PSYSTEM_PROCESSORTIME_INFO) Buffer; + PEPROCESS TheIdleProcess; + TIME CurrentTime; + *ReqSize = sizeof (SYSTEM_PROCESSORTIME_INFO); /* * Check user buffer's size @@ -623,13 +652,17 @@ QSI_DEF(SystemProcessorPerformanceInformation) return (STATUS_INFO_LENGTH_MISMATCH); } + PsLookupProcessByProcessId((PVOID) 1, &TheIdleProcess); + + KeQueryInterruptTime((PLARGE_INTEGER) &CurrentTime); + Spi->TotalProcessorRunTime.QuadPart = - PsInitialSystemProcess->Pcb.KernelTime * 100000; // IdleTime + TheIdleProcess->Pcb.KernelTime * 100000; // IdleTime Spi->TotalProcessorTime.QuadPart = KiKernelTime * 100000; // KernelTime Spi->TotalProcessorUserTime.QuadPart = KiUserTime * 100000; Spi->TotalDPCTime.QuadPart = KiDpcTime * 100000; - Spi->TotalInterruptTime.QuadPart = 0; - Spi->TotalInterrupts = 0; // Interrupt Count + Spi->TotalInterruptTime = CurrentTime; + Spi->TotalInterrupts = CurrentTime.QuadPart / 100000; // Interrupt Count return (STATUS_SUCCESS); } @@ -784,8 +817,31 @@ SSI_DEF(SystemDpcBehaviourInformation) /* Class 25 - Full Memory Information */ QSI_DEF(SystemFullMemoryInformation) { - /* FIXME */ - return (STATUS_NOT_IMPLEMENTED); + PULONG Spi = (PULONG) Buffer; + + PEPROCESS TheIdleProcess; + + * ReqSize = sizeof (ULONG); + + if (sizeof (ULONG) != Size) + { + return (STATUS_INFO_LENGTH_MISMATCH); + } + DPRINT1("SystemFullMemoryInformation\n"); + + PsLookupProcessByProcessId((PVOID) 1, &TheIdleProcess); + + DbgPrint("PID: %d, KernelTime: %u PFFree: %d PFUsed: %d\n", + TheIdleProcess->UniqueProcessId, + TheIdleProcess->Pcb.KernelTime, + MiFreeSwapPages, + MiUsedSwapPages); + + MmPrintMemoryStatistic(); + + *Spi = MiMemoryConsumers[MC_USER].PagesUsed; + + return (STATUS_SUCCESS); } /* Class 26 - Load Image */ @@ -1169,8 +1225,9 @@ NtQuerySystemInformation (IN SYSTEM_INFORMATION_CLASS SystemInformationClass, NTSTATUS Status; NTSTATUS FStatus; - DPRINT("NtQuerySystemInformation Start.\n"); - +/* DPRINT("NtQuerySystemInformation Start. Class:%d\n", + SystemInformationClass ); +*/ /*if (ExGetPreviousMode() == KernelMode) {*/ SystemInformation = UnsafeSystemInformation; diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index 737fb22f230..c61e4c48414 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -10,6 +10,9 @@ /* TYPES *********************************************************************/ +extern ULONG MiFreeSwapPages; +extern ULONG MiUsedSwapPages; +extern ULONG MmPagedPoolSize; extern ULONG MiNrAvailablePages; struct _EPROCESS; @@ -521,6 +524,17 @@ MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait, #define MC_NPPOOL (3) #define MC_MAXIMUM (4) + +typedef struct _MM_MEMORY_CONSUMER +{ + ULONG PagesUsed; + ULONG PagesTarget; + NTSTATUS (*Trim)(ULONG Target, ULONG Priority, PULONG NrFreed); +} +MM_MEMORY_CONSUMER, *PMM_MEMORY_CONSUMER; + +extern MM_MEMORY_CONSUMER MiMemoryConsumers[MC_MAXIMUM]; + VOID MmSetRmapListHeadPage(PHYSICAL_ADDRESS PhysicalAddress, struct _MM_RMAP_ENTRY* ListHead); diff --git a/reactos/ntoskrnl/mm/balance.c b/reactos/ntoskrnl/mm/balance.c index 6a2ac0a6041..58c7ff4e645 100644 --- a/reactos/ntoskrnl/mm/balance.c +++ b/reactos/ntoskrnl/mm/balance.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: balance.c,v 1.28 2004/04/14 07:11:08 jimtabor Exp $ +/* $Id: balance.c,v 1.29 2004/04/22 01:57:49 jimtabor Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/balance.c @@ -36,15 +36,6 @@ #include /* TYPES ********************************************************************/ - -typedef struct _MM_MEMORY_CONSUMER -{ - ULONG PagesUsed; - ULONG PagesTarget; - NTSTATUS (*Trim)(ULONG Target, ULONG Priority, PULONG NrFreed); -} -MM_MEMORY_CONSUMER, *PMM_MEMORY_CONSUMER; - typedef struct _MM_ALLOCATION_REQUEST { PHYSICAL_ADDRESS Page; @@ -55,7 +46,7 @@ MM_ALLOCATION_REQUEST, *PMM_ALLOCATION_REQUEST; /* GLOBALS ******************************************************************/ -static MM_MEMORY_CONSUMER MiMemoryConsumers[MC_MAXIMUM]; +MM_MEMORY_CONSUMER MiMemoryConsumers[MC_MAXIMUM]; static ULONG MiMinimumAvailablePages; ULONG MiNrAvailablePages; static ULONG MiNrTotalPages; diff --git a/reactos/ntoskrnl/mm/pagefile.c b/reactos/ntoskrnl/mm/pagefile.c index 7583f681cb4..9ebf161488d 100644 --- a/reactos/ntoskrnl/mm/pagefile.c +++ b/reactos/ntoskrnl/mm/pagefile.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: pagefile.c,v 1.43 2004/04/10 22:35:25 gdalsnes Exp $ +/* $Id: pagefile.c,v 1.44 2004/04/22 01:57:49 jimtabor Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/pagefile.c @@ -79,10 +79,10 @@ static KSPIN_LOCK PagingFileListLock; static ULONG MiPagingFileCount; /* Number of pages that are available for swapping */ -static ULONG MiFreeSwapPages; +ULONG MiFreeSwapPages; /* Number of pages that have been allocated for swapping */ -static ULONG MiUsedSwapPages; +ULONG MiUsedSwapPages; /* * Number of pages that have been reserved for swapping but not yet allocated From 8745574fb548f8d81ee0143ca279b56d8bcebdec Mon Sep 17 00:00:00 2001 From: James Tabor Date: Thu, 22 Apr 2004 02:20:52 +0000 Subject: [PATCH 0937/1463] Fix GlobalMemoryStatus & Ex. svn path=/trunk/; revision=9196 --- reactos/lib/kernel32/mem/global.c | 162 +++++++++++++++++++++--------- reactos/lib/kernel32/misc/stubs.c | 24 +---- 2 files changed, 118 insertions(+), 68 deletions(-) diff --git a/reactos/lib/kernel32/mem/global.c b/reactos/lib/kernel32/mem/global.c index 3aeefbade68..59eb2065e09 100644 --- a/reactos/lib/kernel32/mem/global.c +++ b/reactos/lib/kernel32/mem/global.c @@ -1,4 +1,4 @@ -/* $Id: global.c,v 1.22 2004/04/06 20:59:40 gvg Exp $ +/* $Id: global.c,v 1.23 2004/04/22 02:20:52 jimtabor Exp $ * * Win32 Global/Local heap functions (GlobalXXX, LocalXXX). * These functions included in Win32 for compatibility with 16 bit Windows @@ -348,58 +348,130 @@ GlobalLock(HGLOBAL hMem) return palloc; } +/* + * @implemented + */ +BOOL +STDCALL +GlobalMemoryStatusEx(LPMEMORYSTATUSEX lpBuffer) +{ + SYSTEM_BASIC_INFORMATION SysBasicInfo; + SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo; + ULONG UserMemory; + NTSTATUS Status; + + DPRINT("GlobalMemoryStatusEx\n"); + + if (lpBuffer->dwLength != sizeof(MEMORYSTATUSEX)) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + Status = ZwQuerySystemInformation(SystemBasicInformation, + &SysBasicInfo, + sizeof(SysBasicInfo), + NULL); + if (!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return FALSE; + } + + Status = ZwQuerySystemInformation(SystemPerformanceInformation, + &SysPerfInfo, + sizeof(SysPerfInfo), + NULL); + if (!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return FALSE; + } + + Status = ZwQuerySystemInformation(SystemFullMemoryInformation, + &UserMemory, + sizeof(ULONG), + NULL); + if (!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return FALSE; + } /* - * @unimplemented + * Load percentage 0 thru 100. 0 is good and 100 is bad. + * + * Um = allocated memory / physical memory + * Um = 177 MB / 256 MB = 69.1% + * + * Mult allocated memory by 100 to move decimal point up. + */ + lpBuffer->dwMemoryLoad = (SysBasicInfo.NumberOfPhysicalPages - + SysPerfInfo.AvailablePages) * 100 / + SysBasicInfo.NumberOfPhysicalPages; + + DPRINT1("Memory Load: %d\n",lpBuffer->dwMemoryLoad ); + + lpBuffer->ullTotalPhys = SysBasicInfo.NumberOfPhysicalPages * + SysBasicInfo.PhysicalPageSize; + lpBuffer->ullAvailPhys = SysPerfInfo.AvailablePages * + SysBasicInfo.PhysicalPageSize; + + DPRINT("%d\n",SysPerfInfo.AvailablePages ); + DPRINT("%d\n",lpBuffer->ullAvailPhys ); + + lpBuffer->ullTotalPageFile = SysPerfInfo.TotalCommitLimit * + SysBasicInfo.PhysicalPageSize; + + DPRINT("%d\n",lpBuffer->ullTotalPageFile ); + + lpBuffer->ullAvailPageFile = ((SysPerfInfo.TotalCommitLimit - + SysPerfInfo.TotalCommittedPages) * + SysBasicInfo.PhysicalPageSize); + +/* VM available to the calling processes, User Mem? */ + lpBuffer->ullTotalVirtual = SysBasicInfo.HighestUserAddress - + SysBasicInfo.LowestUserAddress; + + lpBuffer->ullAvailVirtual = (lpBuffer->ullTotalVirtual - + (UserMemory * + SysBasicInfo.PhysicalPageSize)); + + DPRINT("%d\n",lpBuffer->ullAvailVirtual ); + DPRINT("%d\n",UserMemory); + DPRINT("%d\n",SysBasicInfo.PhysicalPageSize); + +/* lol! Memory from beyond! */ + lpBuffer->ullAvailExtendedVirtual = 0; + return TRUE; +} + +/* + * @implemented */ VOID STDCALL GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer) { - static MEMORYSTATUS cached_memstatus; -// static int cache_lastchecked = 0; - SYSTEM_INFO si; + MEMORYSTATUSEX lpBufferEx; + + if (lpBuffer->dwLength != sizeof(MEMORYSTATUS)) + { + SetLastError(ERROR_INVALID_PARAMETER); + return; + } -// if (GetSystemTimeAsFileTime(NULL)==cache_lastchecked) { -// memcpy(lpBuffer,&cached_memstatus,sizeof(MEMORYSTATUS)); -// return; -// } -// cache_lastchecked = GetSystemTimeAsFileTime(NULL); + lpBufferEx.dwLength = sizeof(MEMORYSTATUSEX); - lpBuffer->dwLength = sizeof(MEMORYSTATUS); - lpBuffer->dwMemoryLoad = 0; - lpBuffer->dwTotalPhys = 32*1024*1024; - lpBuffer->dwAvailPhys = 32*1024*1024; - lpBuffer->dwTotalPageFile = 32*1024*1024; - lpBuffer->dwAvailPageFile = 32*1024*1024; - - /* Some applications (e.g. QuickTime 6) crash if we tell them there - * is more than 2GB of physical memory. - */ - if (lpBuffer->dwTotalPhys>2U*1024*1024*1024) - { - lpBuffer->dwTotalPhys=2U*1024*1024*1024; - lpBuffer->dwAvailPhys=2U*1024*1024*1024; - } - - /* FIXME: should do something for other systems */ - GetSystemInfo(&si); - lpBuffer->dwTotalVirtual = (char*)si.lpMaximumApplicationAddress-(char*)si.lpMinimumApplicationAddress; - /* FIXME: we should track down all the already allocated VM pages and substract them, for now arbitrarily remove 64KB so that it matches NT */ - lpBuffer->dwAvailVirtual = lpBuffer->dwTotalVirtual-64*1024; - memcpy(&cached_memstatus,lpBuffer,sizeof(MEMORYSTATUS)); - - /* it appears some memory display programs want to divide by these values */ - if(lpBuffer->dwTotalPageFile==0) - lpBuffer->dwTotalPageFile++; - - if(lpBuffer->dwAvailPageFile==0) - lpBuffer->dwAvailPageFile++; - - DPRINT1("<-- LPMEMORYSTATUS: dwLength %ld, dwMemoryLoad %ld, dwTotalPhys %ld, dwAvailPhys %ld," - " dwTotalPageFile %ld, dwAvailPageFile %ld, dwTotalVirtual %ld, dwAvailVirtual %ld\n", - lpBuffer->dwLength, lpBuffer->dwMemoryLoad, lpBuffer->dwTotalPhys, lpBuffer->dwAvailPhys, - lpBuffer->dwTotalPageFile, lpBuffer->dwAvailPageFile, lpBuffer->dwTotalVirtual, - lpBuffer->dwAvailVirtual); + if (GlobalMemoryStatusEx(&lpBufferEx)) + { + lpBuffer->dwMemoryLoad = lpBufferEx.dwMemoryLoad; + lpBuffer->dwTotalPhys = lpBufferEx.ullTotalPhys; + lpBuffer->dwAvailPhys = lpBufferEx.ullAvailPhys; + lpBuffer->dwTotalPageFile = lpBufferEx.ullTotalPageFile; + lpBuffer->dwAvailPageFile = lpBufferEx.ullAvailPageFile; + lpBuffer->dwTotalVirtual = lpBufferEx.ullTotalVirtual; + lpBuffer->dwAvailVirtual = lpBufferEx.ullAvailVirtual; + } } diff --git a/reactos/lib/kernel32/misc/stubs.c b/reactos/lib/kernel32/misc/stubs.c index 67123c77471..6bb2e5d607b 100644 --- a/reactos/lib/kernel32/misc/stubs.c +++ b/reactos/lib/kernel32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.72 2004/04/12 19:52:36 jimtabor Exp $ +/* $Id: stubs.c,v 1.73 2004/04/22 02:20:52 jimtabor Exp $ * * KERNEL32.DLL stubs (unimplemented functions) * Remove from this file, if you implement them. @@ -1022,28 +1022,6 @@ GetWriteWatch( return 0; } -/* - * @unimplemented - */ -BOOL -STDCALL -GlobalMemoryStatusEx( - LPMEMORYSTATUSEX lpBuffer - ) -{ - DPRINT1("GlobalMemoryStatusEx is unimplmented\n"); - lpBuffer->dwLength = sizeof(MEMORYSTATUSEX); - lpBuffer->dwMemoryLoad = 0; - lpBuffer->ullTotalPhys = 32*1024*1024; - lpBuffer->ullAvailPhys = 32*1024*1024; - lpBuffer->ullTotalPageFile = 32*1024*1024; - lpBuffer->ullAvailPageFile = 32*1024*1024; - lpBuffer->ullTotalVirtual = 32*1024*1024; - lpBuffer->ullAvailVirtual = 32*1024*1024; - lpBuffer->ullAvailExtendedVirtual = 0; - return TRUE; -} - /* * @unimplemented */ From 87065d0083b0cd71a22858b1f077d213b8feabbd Mon Sep 17 00:00:00 2001 From: James Tabor Date: Fri, 23 Apr 2004 05:34:54 +0000 Subject: [PATCH 0938/1463] Fix return for cpuid. svn path=/trunk/; revision=9199 --- reactos/ntoskrnl/ke/i386/kernel.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/ke/i386/kernel.c b/reactos/ntoskrnl/ke/i386/kernel.c index 9efc3aa9394..359e36d277f 100644 --- a/reactos/ntoskrnl/ke/i386/kernel.c +++ b/reactos/ntoskrnl/ke/i386/kernel.c @@ -41,7 +41,7 @@ ULONG KiPcrInitDone = 0; static ULONG PcrsAllocated = 0; static PHYSICAL_ADDRESS PcrPages[MAXIMUM_PROCESSORS]; -ULONG Ke386CpuidFlags, Ke386CpuidFlags2, Ke386CpuidExFlags; +ULONG Ke386CpuidFlags, Ke386CpuidFlags2, Ke386CpuidExFlags, Ke386Cpuid; #define X86_EFLAGS_ID (1 << 21) @@ -81,7 +81,7 @@ Ki386GetCpuId(VOID) { /* Get the feature flags. */ __asm__("cpuid\n\t" - : "=d" (Ke386CpuidFlags), "=c" (Ke386CpuidFlags2) + : "=a" (Ke386Cpuid),"=d" (Ke386CpuidFlags), "=c" (Ke386CpuidFlags2) : "a" (0x00000001) : "ebx"); } From e20d930ab078b8aafd57ca7f6e8968b1fe043b63 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Fri, 23 Apr 2004 05:37:10 +0000 Subject: [PATCH 0939/1463] Fixed SystemProcessorInformation. svn path=/trunk/; revision=9200 --- reactos/ntoskrnl/ex/sysinfo.c | 38 +++++++++++++---------------------- 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/reactos/ntoskrnl/ex/sysinfo.c b/reactos/ntoskrnl/ex/sysinfo.c index 29c792715a3..e4f994dc63e 100644 --- a/reactos/ntoskrnl/ex/sysinfo.c +++ b/reactos/ntoskrnl/ex/sysinfo.c @@ -1,4 +1,4 @@ -/* $Id: sysinfo.c,v 1.28 2004/04/22 01:55:49 jimtabor Exp $ +/* $Id: sysinfo.c,v 1.29 2004/04/23 05:37:10 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -31,6 +31,9 @@ VOID STDCALL KeQueryInterruptTime(PLARGE_INTEGER CurrentTime); VOID MmPrintMemoryStatistic(VOID); +extern ULONG Ke386CpuidFlags; +extern ULONG Ke386Cpuid; + /* FUNCTIONS *****************************************************************/ NTSTATUS STDCALL @@ -270,7 +273,6 @@ NtSetSystemEnvironmentValue (IN PUNICODE_STRING UnsafeName, /* --- Query/Set System Information --- */ - /* * NOTE: QSI_DEF(n) and SSI_DEF(n) define _cdecl function symbols * so the stack is popped only in one place on x86 platform. @@ -283,6 +285,7 @@ static NTSTATUS QSI_USE(n) (PVOID Buffer, ULONG Size, PULONG ReqSize) #define SSI_DEF(n) \ static NTSTATUS SSI_USE(n) (PVOID Buffer, ULONG Size) + /* Class 0 - Basic Information */ QSI_DEF(SystemBasicInformation) { @@ -324,32 +327,19 @@ QSI_DEF(SystemProcessorInformation) if (Size < sizeof (SYSTEM_PROCESSOR_INFORMATION)) { return (STATUS_INFO_LENGTH_MISMATCH); - } + } + Spi->ProcessorArchitecture = ((Ke386Cpuid >> 8) & 0xf); + Spi->ProcessorLevel = ((Ke386Cpuid >> 4) & 0xf); + Spi->ProcessorRevision = (Ke386Cpuid & 0xf) | ((Ke386Cpuid >> 4) & 0x300); + Spi->Unknown = 0; + Spi->FeatureBits = Ke386CpuidFlags; + + DPRINT("Arch %d Level %d Rev %d\n", Spi->ProcessorArchitecture, + Spi->ProcessorLevel, Spi->ProcessorRevision); - /* FIXME: add CPU type detection code */ - Spi->ProcessorArchitecture = 0; /* FIXME */ - Spi->ProcessorLevel = 0; /* FIXME */ - Spi->ProcessorRevision = 0; /* FIXME */ - Spi->Unknown = 0; - Spi->FeatureBits = 0x00000000; /* FIXME */ - return (STATUS_SUCCESS); } -/* -typedef struct _MM_MEMORY_CONSUMER -{ - ULONG PagesUsed; - ULONG PagesTarget; - NTSTATUS (*Trim)(ULONG Target, ULONG Priority, PULONG NrFreed); -} -MM_MEMORY_CONSUMER, *PMM_MEMORY_CONSUMER; -extern MM_MEMORY_CONSUMER MiMemoryConsumers[MC_MAXIMUM]; - -extern ULONG MiFreeSwapPages; -extern ULONG MiUsedSwapPages; -extern ULONG MmPagedPoolSize; -*/ /* Class 2 - Performance Information */ QSI_DEF(SystemPerformanceInformation) { From 8ab1cba9142646ae4d296346756c524e7638d639 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Fri, 23 Apr 2004 06:19:28 +0000 Subject: [PATCH 0940/1463] Fixed my mistake in SystemProcessorInformation. svn path=/trunk/; revision=9201 --- reactos/ntoskrnl/ex/sysinfo.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reactos/ntoskrnl/ex/sysinfo.c b/reactos/ntoskrnl/ex/sysinfo.c index e4f994dc63e..be8edc75a9a 100644 --- a/reactos/ntoskrnl/ex/sysinfo.c +++ b/reactos/ntoskrnl/ex/sysinfo.c @@ -1,4 +1,4 @@ -/* $Id: sysinfo.c,v 1.29 2004/04/23 05:37:10 jimtabor Exp $ +/* $Id: sysinfo.c,v 1.30 2004/04/23 06:19:28 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -328,13 +328,13 @@ QSI_DEF(SystemProcessorInformation) { return (STATUS_INFO_LENGTH_MISMATCH); } - Spi->ProcessorArchitecture = ((Ke386Cpuid >> 8) & 0xf); - Spi->ProcessorLevel = ((Ke386Cpuid >> 4) & 0xf); - Spi->ProcessorRevision = (Ke386Cpuid & 0xf) | ((Ke386Cpuid >> 4) & 0x300); + Spi->ProcessorArchitecture = 0; /* Intel Processor */ + Spi->ProcessorLevel = ((Ke386Cpuid >> 8) & 0xf); + Spi->ProcessorRevision = (Ke386Cpuid & 0xf) | ((Ke386Cpuid << 4) & 0xf00); Spi->Unknown = 0; Spi->FeatureBits = Ke386CpuidFlags; - DPRINT("Arch %d Level %d Rev %d\n", Spi->ProcessorArchitecture, + DPRINT("Arch %d Level %d Rev 0x%x\n", Spi->ProcessorArchitecture, Spi->ProcessorLevel, Spi->ProcessorRevision); return (STATUS_SUCCESS); From 5ad3f25a471cad8362dae5960b960670caae9e3a Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Fri, 23 Apr 2004 13:34:04 +0000 Subject: [PATCH 0941/1463] implemented InvertRgn() svn path=/trunk/; revision=9202 --- reactos/lib/gdi32/misc/stubs.c | 16 +-------------- reactos/lib/gdi32/objects/region.c | 13 +++++++++++++ reactos/subsys/win32k/objects/region.c | 27 ++++++++++++++++++++++++-- 3 files changed, 39 insertions(+), 17 deletions(-) diff --git a/reactos/lib/gdi32/misc/stubs.c b/reactos/lib/gdi32/misc/stubs.c index da4578b753e..6a5c5d928fa 100644 --- a/reactos/lib/gdi32/misc/stubs.c +++ b/reactos/lib/gdi32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.52 2004/04/09 20:03:12 navaraf Exp $ +/* $Id: stubs.c,v 1.53 2004/04/23 13:34:04 weiden Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -408,20 +408,6 @@ GetFontLanguageInfo( } -/* - * @unimplemented - */ -BOOL -STDCALL -InvertRgn( - HDC hDc, - HRGN hRgn - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - /* * @unimplemented */ diff --git a/reactos/lib/gdi32/objects/region.c b/reactos/lib/gdi32/objects/region.c index a04e3dbbe2c..292719459e9 100644 --- a/reactos/lib/gdi32/objects/region.c +++ b/reactos/lib/gdi32/objects/region.c @@ -296,3 +296,16 @@ RectInRegion( { return NtGdiRectInRegion(a0,(CONST PRECT)a1); } + +/* + * @implemented + */ +BOOL +STDCALL +InvertRgn( + HDC hDc, + HRGN hRgn + ) +{ + return NtGdiInvertRgn(hDc, hRgn); +} diff --git a/reactos/subsys/win32k/objects/region.c b/reactos/subsys/win32k/objects/region.c index 0d0e857864c..82c0cd738e4 100644 --- a/reactos/subsys/win32k/objects/region.c +++ b/reactos/subsys/win32k/objects/region.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: region.c,v 1.48 2004/04/09 20:03:20 navaraf Exp $ */ +/* $Id: region.c,v 1.49 2004/04/23 13:34:04 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -1952,7 +1952,30 @@ STDCALL NtGdiInvertRgn(HDC hDC, HRGN hRgn) { - UNIMPLEMENTED; + PROSRGNDATA RgnData; + ULONG i; + PRECT rc; + + if(!(RgnData = RGNDATA_LockRgn(hRgn))) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } + + rc = (PRECT)RgnData->Buffer; + for(i = 0; i < RgnData->rdh.nCount; i++) + { + + if(!NtGdiPatBlt(hDC, rc->left, rc->top, rc->right - rc->left, rc->bottom - rc->top, DSTINVERT)) + { + RGNDATA_UnlockRgn(hRgn); + return FALSE; + } + rc++; + } + + RGNDATA_UnlockRgn(hRgn); + return TRUE; } INT From ac9fc6496a6749cc14369c2228813e15eacb3e22 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Fri, 23 Apr 2004 14:29:07 +0000 Subject: [PATCH 0942/1463] - Initialized the srb on each call to SpiSendInquiry. svn path=/trunk/; revision=9203 --- reactos/drivers/storage/scsiport/scsiport.c | 37 ++++++++++----------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/reactos/drivers/storage/scsiport/scsiport.c b/reactos/drivers/storage/scsiport/scsiport.c index 74ae5bdeb89..d296117e133 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.54 2004/04/16 13:39:46 ekohl Exp $ +/* $Id: scsiport.c,v 1.55 2004/04/23 14:29:07 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1840,36 +1840,35 @@ SpiScanAdapter (IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension) ULONG Bus; ULONG Target; ULONG Lun; + PVOID DataBuffer; NTSTATUS Status; DPRINT ("SpiScanAdapter() called\n"); - RtlZeroMemory(&Srb, - sizeof(SCSI_REQUEST_BLOCK)); - Srb.SrbFlags = SRB_FLAGS_DATA_IN; - Srb.DataBuffer = ExAllocatePool(NonPagedPool, 256); - Srb.Function = SRB_FUNCTION_EXECUTE_SCSI; - Srb.DataTransferLength = 255; //256; - Srb.CdbLength = 6; - - Cdb = (PCDB) &Srb.Cdb; - - Cdb->CDB6INQUIRY.OperationCode = SCSIOP_INQUIRY; - Cdb->CDB6INQUIRY.AllocationLength = 255; + DataBuffer = ExAllocatePool(NonPagedPool, 256); for (Bus = 0; Bus < DeviceExtension->PortConfig->NumberOfBuses; Bus++) { - Srb.PathId = Bus; - for (Target = 0; Target < DeviceExtension->PortConfig->MaximumNumberOfTargets; Target++) { - Srb.TargetId = Target; - for (Lun = 0; Lun < SCSI_MAXIMUM_LOGICAL_UNITS; Lun++) { + RtlZeroMemory(&Srb, + sizeof(SCSI_REQUEST_BLOCK)); + Srb.SrbFlags = SRB_FLAGS_DATA_IN; + Srb.DataBuffer = DataBuffer; + Srb.Function = SRB_FUNCTION_EXECUTE_SCSI; + Srb.DataTransferLength = 255; //256; + Srb.CdbLength = 6; Srb.Lun = Lun; + Srb.PathId = Bus; + Srb.TargetId = Target; Srb.SrbStatus = SRB_STATUS_SUCCESS; + Cdb = (PCDB) &Srb.Cdb; + + Cdb->CDB6INQUIRY.OperationCode = SCSIOP_INQUIRY; + Cdb->CDB6INQUIRY.AllocationLength = 255; Cdb->CDB6INQUIRY.LogicalUnitNumber = Lun; RtlZeroMemory(Srb.DataBuffer, 256); @@ -1881,7 +1880,7 @@ SpiScanAdapter (IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension) if (LunExtension == NULL) { DPRINT("Failed to allocate the LUN extension!\n"); - ExFreePool(Srb.DataBuffer); + ExFreePool(DataBuffer); return; } @@ -1909,7 +1908,7 @@ SpiScanAdapter (IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension) } } - ExFreePool(Srb.DataBuffer); + ExFreePool(DataBuffer); DPRINT ("SpiScanAdapter() done\n"); } From eabb3b47ad86a7622c176d78533cd05cffd813c8 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Fri, 23 Apr 2004 19:29:04 +0000 Subject: [PATCH 0943/1463] fixed calculation of the non-client-area when WS_BORDER is set svn path=/trunk/; revision=9204 --- reactos/lib/user32/windows/nonclient.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/user32/windows/nonclient.c b/reactos/lib/user32/windows/nonclient.c index 62b7b3ece74..52f4cdd856e 100644 --- a/reactos/lib/user32/windows/nonclient.c +++ b/reactos/lib/user32/windows/nonclient.c @@ -543,7 +543,7 @@ DefWndNCCalcSize(HWND hWnd, BOOL CalcSizeStruct, RECT *Rect) UserGetWindowBorders(Style, ExStyle, &WindowBorders, FALSE); InflateRect(Rect, -WindowBorders.cx, -WindowBorders.cy); } else - if (ExStyle & WS_EX_STATICEDGE) + if ((ExStyle & WS_EX_STATICEDGE) || (Style & WS_BORDER)) { InflateRect(Rect, -1, -1); } From 4e374dbe4b0939b3d2e18744dbefb9bfcda317b6 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 23 Apr 2004 20:11:11 +0000 Subject: [PATCH 0944/1463] - Fix the emulation of 'inl' instruction in V86 mode. svn path=/trunk/; revision=9205 --- reactos/ntoskrnl/ke/i386/v86m.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/ke/i386/v86m.c b/reactos/ntoskrnl/ke/i386/v86m.c index 7cf8535c0e9..e5557fc6b2d 100644 --- a/reactos/ntoskrnl/ke/i386/v86m.c +++ b/reactos/ntoskrnl/ke/i386/v86m.c @@ -367,7 +367,7 @@ KeV86GPF(PKV86M_TRAP_FRAME VTf, PKTRAP_FRAME Tf) else { ULONG v; - v = READ_PORT_USHORT((PUSHORT)(ULONG)ip[1]); + v = READ_PORT_ULONG((PULONG)(ULONG)ip[1]); DPRINT("inl %d\t%X\n", (ULONG)ip[1], v); Tf->Eax = v; } @@ -420,7 +420,7 @@ KeV86GPF(PKV86M_TRAP_FRAME VTf, PKTRAP_FRAME Tf) { ULONG v; - v = READ_PORT_USHORT((PUSHORT)(Tf->Edx & 0xFFFF)); + v = READ_PORT_ULONG((PULONG)(Tf->Edx & 0xFFFF)); DPRINT("inl %d\t%X\n", Tf->Edx & 0xFFFF, v); Tf->Eax = v; } From e7d451e2fd3bf33566a3d8c65267a760484f6659 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 23 Apr 2004 20:12:57 +0000 Subject: [PATCH 0945/1463] - Correctly swap the Red and Blue colors while setting the palette on non-VGA compatible adapters. svn path=/trunk/; revision=9206 --- reactos/drivers/video/miniport/vbe/vbemp.c | 23 ++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/reactos/drivers/video/miniport/vbe/vbemp.c b/reactos/drivers/video/miniport/vbe/vbemp.c index b559bc3b4e9..7f8a5a03d4e 100644 --- a/reactos/drivers/video/miniport/vbe/vbemp.c +++ b/reactos/drivers/video/miniport/vbe/vbemp.c @@ -761,11 +761,11 @@ VBESetColorRegisters( PSTATUS_BLOCK StatusBlock) { KV86M_REGISTERS BiosRegisters; + ULONG Entry; + PULONG OutputEntry; if (DeviceExtension->VGACompatible) { - ULONG Entry; - for (Entry = ColorLookUpTable->FirstEntry; Entry < ColorLookUpTable->NumEntries + ColorLookUpTable->FirstEntry; Entry++) @@ -780,14 +780,21 @@ VBESetColorRegisters( else { /* - * FIXME: - * This is untested code path, it's possible that it will - * not work at all or that Red and Blue colors will be swapped. + * We can't just copy the values, because we need to swap the Red + * and Blue values. */ - VideoPortMoveMemory(DeviceExtension->TrampolineMemory, - &ColorLookUpTable->LookupTable[0].RgbArray, - sizeof(DWORD) * ColorLookUpTable->NumEntries); + for (Entry = ColorLookUpTable->FirstEntry, + OutputEntry = DeviceExtension->TrampolineMemory; + Entry < ColorLookUpTable->NumEntries + ColorLookUpTable->FirstEntry; + Entry++, OutputEntry++) + { + *OutputEntry = + (ColorLookUpTable->LookupTable[Entry].RgbArray.Red << 16) | + (ColorLookUpTable->LookupTable[Entry].RgbArray.Green << 8) | + (ColorLookUpTable->LookupTable[Entry].RgbArray.Blue); + } + BiosRegisters.Eax = 0x4F09; BiosRegisters.Ebx = 0; BiosRegisters.Ecx = ColorLookUpTable->NumEntries; From aeef6123b6a756bd521a58d611be2d6be1fa79da Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Fri, 23 Apr 2004 21:35:59 +0000 Subject: [PATCH 0946/1463] fixed some error cases svn path=/trunk/; revision=9207 --- reactos/subsys/win32k/objects/text.c | 133 +++++++++++++++------------ 1 file changed, 74 insertions(+), 59 deletions(-) diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index 9ba8942a01a..b9b383f5979 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.89 2004/04/09 20:03:20 navaraf Exp $ */ +/* $Id: text.c,v 1.90 2004/04/23 21:35:59 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -1515,8 +1515,11 @@ NtGdiExtTextOut( dc = DC_LockDc(hDC); if (!dc) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; - + } + if (NULL != UnsafeDx) { Dx = ExAllocatePoolWithTag(PagedPool, Count * sizeof(INT), TAG_GDITEXT); @@ -2467,66 +2470,76 @@ NtGdiGetTextMetrics(HDC hDC, TT_OS2 *pOS2; ULONG Error; - dc = DC_LockDc(hDC); - if (NULL == dc || NULL == tm) + if (NULL == tm) { - Status = STATUS_INVALID_PARAMETER; + SetLastWin32Error(STATUS_INVALID_PARAMETER); + return FALSE; + } + + if(!(dc = DC_LockDc(hDC))) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } + + TextObj = TEXTOBJ_LockText(dc->w.hFont); + if (NULL != TextObj) + { + Status = GetFontObjectsFromTextObj(TextObj, NULL, NULL, &FontGDI); + if (NT_SUCCESS(Status)) + { + Face = FontGDI->face; + 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 (0 != Error) + { + DPRINT1("Error in setting pixel sizes: %u\n", Error); + Status = STATUS_UNSUCCESSFUL; + } + else + { + memcpy(&SafeTm, &FontGDI->TextMetric, sizeof(TEXTMETRICW)); + IntLockFreeType; + pOS2 = FT_Get_Sfnt_Table(Face, ft_sfnt_os2); + IntUnLockFreeType; + if (NULL == pOS2) + { + DPRINT1("Can't find OS/2 table - not TT font?\n"); + Status = STATUS_UNSUCCESSFUL; + } + else + { + SafeTm.tmAveCharWidth = (pOS2->xAvgCharWidth + 32) >> 6; + } + SafeTm.tmAscent = (Face->size->metrics.ascender + 32) >> 6; // units above baseline + SafeTm.tmDescent = (32 - Face->size->metrics.descender) >> 6; // units below baseline + SafeTm.tmHeight = SafeTm.tmAscent + SafeTm.tmDescent; + SafeTm.tmMaxCharWidth = (Face->size->metrics.max_advance + 32) >> 6; + Status = MmCopyToCaller(tm, &SafeTm, sizeof(TEXTMETRICW)); + } + } + TEXTOBJ_UnlockText(dc->w.hFont); } else { - TextObj = TEXTOBJ_LockText(dc->w.hFont); - if (NULL != TextObj) - { - Status = GetFontObjectsFromTextObj(TextObj, NULL, NULL, &FontGDI); - if (NT_SUCCESS(Status)) - { - Face = FontGDI->face; - 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 (0 != Error) - { - DPRINT1("Error in setting pixel sizes: %u\n", Error); - Status = STATUS_UNSUCCESSFUL; - } - else - { - memcpy(&SafeTm, &FontGDI->TextMetric, sizeof(TEXTMETRICW)); - IntLockFreeType; - pOS2 = FT_Get_Sfnt_Table(Face, ft_sfnt_os2); - IntUnLockFreeType; - if (NULL == pOS2) - { - DPRINT1("Can't find OS/2 table - not TT font?\n"); - Status = STATUS_UNSUCCESSFUL; - } - else - { - SafeTm.tmAveCharWidth = (pOS2->xAvgCharWidth + 32) >> 6; - } - SafeTm.tmAscent = (Face->size->metrics.ascender + 32) >> 6; // units above baseline - SafeTm.tmDescent = (32 - Face->size->metrics.descender) >> 6; // units below baseline - SafeTm.tmHeight = SafeTm.tmAscent + SafeTm.tmDescent; - SafeTm.tmMaxCharWidth = (Face->size->metrics.max_advance + 32) >> 6; - Status = MmCopyToCaller(tm, &SafeTm, sizeof(TEXTMETRICW)); - } - } - TEXTOBJ_UnlockText(dc->w.hFont); - } - else - { - ASSERT(FALSE); - Status = STATUS_INVALID_HANDLE; - } - DC_UnlockDc(hDC); + ASSERT(FALSE); + Status = STATUS_INVALID_HANDLE; } - - return NT_SUCCESS(Status); + DC_UnlockDc(hDC); + + if(!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return FALSE; + } + + return TRUE; } BOOL @@ -2564,7 +2577,8 @@ NtGdiSetTextAlign(HDC hDC, dc = DC_LockDc(hDC); if (!dc) { - return 0; + SetLastWin32Error(ERROR_INVALID_HANDLE); + return GDI_ERROR; } prevAlign = dc->w.textAlign; dc->w.textAlign = Mode; @@ -2583,7 +2597,8 @@ NtGdiSetTextColor(HDC hDC, if (!dc) { - return 0x80000000; + SetLastWin32Error(ERROR_INVALID_HANDLE); + return CLR_INVALID; } oldColor = dc->w.textColor; From d0983a67cd7da54770870dfac578a3c53c513cd3 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sat, 24 Apr 2004 05:11:54 +0000 Subject: [PATCH 0947/1463] Set 386 as default cpu type. svn path=/trunk/; revision=9210 --- reactos/ntoskrnl/ke/i386/kernel.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/ke/i386/kernel.c b/reactos/ntoskrnl/ke/i386/kernel.c index 359e36d277f..0f8bdbfd154 100644 --- a/reactos/ntoskrnl/ke/i386/kernel.c +++ b/reactos/ntoskrnl/ke/i386/kernel.c @@ -41,7 +41,8 @@ ULONG KiPcrInitDone = 0; static ULONG PcrsAllocated = 0; static PHYSICAL_ADDRESS PcrPages[MAXIMUM_PROCESSORS]; -ULONG Ke386CpuidFlags, Ke386CpuidFlags2, Ke386CpuidExFlags, Ke386Cpuid; +ULONG Ke386CpuidFlags, Ke386CpuidFlags2, Ke386CpuidExFlags; +ULONG Ke386Cpuid = 300; #define X86_EFLAGS_ID (1 << 21) From ed71de17e74036a9bd42797c1f03ded471d9840c Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 24 Apr 2004 14:21:37 +0000 Subject: [PATCH 0948/1463] proper implementation of FrameRgn() (cannot be ported from wine because wine's implementation is wrong) svn path=/trunk/; revision=9211 --- reactos/include/win32k/region.h | 7 -- reactos/lib/gdi32/misc/stubs.c | 19 +--- reactos/lib/gdi32/objects/region.c | 16 +++ reactos/subsys/win32k/include/intgdi.h | 7 ++ reactos/subsys/win32k/ntuser/vis.c | 3 +- reactos/subsys/win32k/ntuser/window.c | 4 +- reactos/subsys/win32k/ntuser/winpos.c | 3 +- reactos/subsys/win32k/objects/cliprgn.c | 3 +- reactos/subsys/win32k/objects/path.c | 5 +- reactos/subsys/win32k/objects/region.c | 125 ++++++++++++++++++++++-- 10 files changed, 151 insertions(+), 41 deletions(-) diff --git a/reactos/include/win32k/region.h b/reactos/include/win32k/region.h index 0f621f295bd..0b3acd22d0b 100644 --- a/reactos/include/win32k/region.h +++ b/reactos/include/win32k/region.h @@ -151,12 +151,5 @@ STDCALL NtGdiGetRegionData(HRGN hrgn, DWORD count, LPRGNDATA rgndata); - -HRGN STDCALL REGION_CropRgn(HRGN hDst, HRGN hSrc, const PRECT lpRect, PPOINT lpPt); - -HRGN FASTCALL UnsafeIntCreateRectRgnIndirect(CONST PRECT rc); -INT FASTCALL UnsafeIntGetRgnBox(PROSRGNDATA Rgn, LPRECT pRect); -VOID FASTCALL UnsafeIntUnionRectWithRgn(PROSRGNDATA RgnDest, CONST PRECT Rect); -BOOL FASTCALL UnsafeIntRectInRegion(PROSRGNDATA Rgn, CONST LPRECT rc); #endif diff --git a/reactos/lib/gdi32/misc/stubs.c b/reactos/lib/gdi32/misc/stubs.c index 6a5c5d928fa..d6e5fd8ac54 100644 --- a/reactos/lib/gdi32/misc/stubs.c +++ b/reactos/lib/gdi32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.53 2004/04/23 13:34:04 weiden Exp $ +/* $Id: stubs.c,v 1.54 2004/04/24 14:21:36 weiden Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -209,23 +209,6 @@ ExtCreateRegion( return 0; } -/* - * @unimplemented - */ -BOOL -STDCALL -FrameRgn( - HDC a0, - HRGN a1, - HBRUSH a2, - int a3, - int a4 - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - /* * @unimplemented diff --git a/reactos/lib/gdi32/objects/region.c b/reactos/lib/gdi32/objects/region.c index 292719459e9..e9ad971f3ec 100644 --- a/reactos/lib/gdi32/objects/region.c +++ b/reactos/lib/gdi32/objects/region.c @@ -309,3 +309,19 @@ InvertRgn( { return NtGdiInvertRgn(hDc, hRgn); } + +/* + * @implemented + */ +BOOL +STDCALL +FrameRgn( + HDC hdc, + HRGN hrgn, + HBRUSH hbr, + int nWidth, + int nHeight + ) +{ + return NtGdiFrameRgn(hdc, hrgn, hbr, nWidth, nHeight); +} diff --git a/reactos/subsys/win32k/include/intgdi.h b/reactos/subsys/win32k/include/intgdi.h index 2d62ae20602..3374f5f6a34 100644 --- a/reactos/subsys/win32k/include/intgdi.h +++ b/reactos/subsys/win32k/include/intgdi.h @@ -100,6 +100,13 @@ int FASTCALL IntGdiGetClipBox(HDC hDC, LPRECT rc); +HRGN FASTCALL REGION_CropRgn(HRGN hDst, HRGN hSrc, const PRECT lpRect, PPOINT lpPt); + +HRGN FASTCALL UnsafeIntCreateRectRgnIndirect(CONST PRECT rc); +INT FASTCALL UnsafeIntGetRgnBox(PROSRGNDATA Rgn, LPRECT pRect); +VOID FASTCALL UnsafeIntUnionRectWithRgn(PROSRGNDATA RgnDest, CONST PRECT Rect); +BOOL FASTCALL UnsafeIntRectInRegion(PROSRGNDATA Rgn, CONST LPRECT rc); + /* DC functions */ BOOL FASTCALL diff --git a/reactos/subsys/win32k/ntuser/vis.c b/reactos/subsys/win32k/ntuser/vis.c index 5943c2e0813..d9514b623a8 100644 --- a/reactos/subsys/win32k/ntuser/vis.c +++ b/reactos/subsys/win32k/ntuser/vis.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: vis.c,v 1.26 2004/03/27 15:16:05 gvg Exp $ + * $Id: vis.c,v 1.27 2004/04/24 14:21:36 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -29,6 +29,7 @@ #include #include #include +#include #define NDEBUG #include diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 7895d8281be..d8caa86f263 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.219 2004/04/17 11:00:14 weiden Exp $ +/* $Id: window.c,v 1.220 2004/04/24 14:21:36 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -46,7 +46,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index b96ca05b04a..02289d787bb 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.111 2004/04/14 17:19:38 weiden Exp $ +/* $Id: winpos.c,v 1.112 2004/04/24 14:21:36 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -44,6 +44,7 @@ #include #include #include +#include #include #include diff --git a/reactos/subsys/win32k/objects/cliprgn.c b/reactos/subsys/win32k/objects/cliprgn.c index a238e26e6b3..3ba6b6bbfb7 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.31 2004/04/09 20:03:20 navaraf Exp $ */ +/* $Id: cliprgn.c,v 1.32 2004/04/24 14:21:37 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include @@ -27,6 +27,7 @@ #include #include #include +#include #include "../eng/clip.h" #define NDEBUG diff --git a/reactos/subsys/win32k/objects/path.c b/reactos/subsys/win32k/objects/path.c index 6e76b9ae936..1aded6a887d 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.19 2004/04/05 21:26:25 navaraf Exp $ */ +/* $Id: path.c,v 1.20 2004/04/24 14:21:37 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -31,7 +31,6 @@ #define _WIN32K_PATH_INTERNAL #include #include -#include #include #include @@ -45,6 +44,8 @@ #define GROW_FACTOR_DENOM 1 /* Denominator of grow factor */ +INT FASTCALL +IntGdiGetArcDirection(DC *dc); BOOL STDCALL diff --git a/reactos/subsys/win32k/objects/region.c b/reactos/subsys/win32k/objects/region.c index 82c0cd738e4..4d0f93cd86b 100644 --- a/reactos/subsys/win32k/objects/region.c +++ b/reactos/subsys/win32k/objects/region.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: region.c,v 1.49 2004/04/23 13:34:04 weiden Exp $ */ +/* $Id: region.c,v 1.50 2004/04/24 14:21:37 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -103,6 +104,7 @@ typedef struct _POINTBLOCK { struct _POINTBLOCK *next; } POINTBLOCK; +#ifndef NDEBUG /* * This function is left there for debugging purposes. */ @@ -129,6 +131,7 @@ IntDumpRegion(HRGN hRgn) RGNDATA_UnlockRgn(hRgn); } +#endif /* NDEBUG */ static BOOL FASTCALL REGION_CopyRegion(PROSRGNDATA dst, PROSRGNDATA src) { @@ -365,7 +368,7 @@ empty: * * \return hDst if success, 0 otherwise. */ -HRGN STDCALL REGION_CropRgn(HRGN hDst, HRGN hSrc, const PRECT lpRect, PPOINT lpPt) +HRGN FASTCALL REGION_CropRgn(HRGN hDst, HRGN hSrc, const PRECT lpRect, PPOINT lpPt) { PROSRGNDATA objSrc, rgnDst; HRGN hNewDst, hRet = NULL; @@ -1413,7 +1416,99 @@ static void FASTCALL REGION_UnionRectWithRegion(const RECT *rect, ROSRGNDATA *rg } -BOOL STDCALL REGION_LPTODP(HDC hdc, HRGN hDest, HRGN hSrc) +BOOL FASTCALL REGION_CreateFrameRgn(HRGN hDest, HRGN hSrc, INT x, INT y) +{ + PROSRGNDATA srcObj, destObj; + PRECT rc; + INT dx, dy; + 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; + } + + 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); + + /* 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); + + /* 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); + + /* 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); + + + 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; +} + + +BOOL FASTCALL REGION_LPTODP(HDC hdc, HRGN hDest, HRGN hSrc) { RECT *pCurRect, *pEndRect; PROSRGNDATA srcObj = NULL; @@ -1893,13 +1988,25 @@ NtGdiFillRgn(HDC hDC, HRGN hRgn, HBRUSH hBrush) BOOL STDCALL -NtGdiFrameRgn(HDC hDC, - HRGN hRgn, - HBRUSH hBrush, - INT Width, - INT Height) +NtGdiFrameRgn(HDC hDC, HRGN hRgn, HBRUSH hBrush, INT Width, INT Height) { - UNIMPLEMENTED; + HRGN FrameRgn; + BOOL Ret; + + if(!(FrameRgn = NtGdiCreateRectRgn(0, 0, 0, 0))) + { + return FALSE; + } + if(!REGION_CreateFrameRgn(FrameRgn, hRgn, Width, Height)) + { + NtGdiDeleteObject(FrameRgn); + return FALSE; + } + + Ret = NtGdiFillRgn(hDC, FrameRgn, hBrush); + + NtGdiDeleteObject(FrameRgn); + return Ret; } INT FASTCALL From 2dcb05259a47401dfa0e401ead687611358a3d1c Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sat, 24 Apr 2004 21:35:24 +0000 Subject: [PATCH 0949/1463] - Minor correction to RPC structures. svn path=/trunk/; revision=9212 --- reactos/include/wine/objidl.h | 2 +- reactos/w32api/include/objidl.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/include/wine/objidl.h b/reactos/include/wine/objidl.h index 848e5cf6fb2..9c1190acfd8 100644 --- a/reactos/include/wine/objidl.h +++ b/reactos/include/wine/objidl.h @@ -194,7 +194,7 @@ typedef struct tagRPCOLEMESSAGE { ULONG iMethod; PVOID reserved2[5]; ULONG rpcFlags; -} RPCOLEMESSAGE; +} RPCOLEMESSAGE, *PRPCOLEMESSAGE; typedef enum tagMKSYS { MKSYS_NONE, MKSYS_GENERICCOMPOSITE, diff --git a/reactos/w32api/include/objidl.h b/reactos/w32api/include/objidl.h index 52dc143ee29..a1a7ca72fa8 100644 --- a/reactos/w32api/include/objidl.h +++ b/reactos/w32api/include/objidl.h @@ -179,7 +179,7 @@ typedef struct tagRPCOLEMESSAGE { ULONG iMethod; PVOID reserved2[5]; ULONG rpcFlags; -} RPCOLEMESSAGE; +} RPCOLEMESSAGE, *PRPCOLEMESSAGE; typedef enum tagMKSYS { MKSYS_NONE, MKSYS_GENERICCOMPOSITE, From b22facf24048d748d3a0bdd1cdcf2846b4445247 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sun, 25 Apr 2004 11:34:13 +0000 Subject: [PATCH 0950/1463] 1. implemented hatched brushes 2. fixed memory leak when deleting patterned brushes 3. use brush origin in dib code svn path=/trunk/; revision=9214 --- reactos/include/win32k/brush.h | 4 +- reactos/subsys/win32k/dib/dib16bpp.c | 10 ++-- reactos/subsys/win32k/dib/dib1bpp.c | 16 +++--- reactos/subsys/win32k/dib/dib24bpp.c | 6 +- reactos/subsys/win32k/dib/dib32bpp.c | 6 +- reactos/subsys/win32k/dib/dib8bpp.c | 14 ++--- reactos/subsys/win32k/eng/bitblt.c | 15 ++++- reactos/subsys/win32k/objects/bitmaps.c | 13 ++++- reactos/subsys/win32k/objects/brush.c | 74 +++++++++++++++++++++---- reactos/subsys/win32k/objects/dc.c | 10 +++- 10 files changed, 123 insertions(+), 45 deletions(-) diff --git a/reactos/include/win32k/brush.h b/reactos/include/win32k/brush.h index ee195e52f0e..1c6a9050740 100644 --- a/reactos/include/win32k/brush.h +++ b/reactos/include/win32k/brush.h @@ -31,7 +31,7 @@ typedef struct ULONG ulBrushUnique; BRUSHATTR *pBrushAttr; BRUSHATTR BrushAttr; - ULONG Unknown30; + POINT ptOrigin; ULONG bCacheGrabbed; COLORREF crBack; COLORREF crFore; @@ -66,7 +66,7 @@ typedef struct #define GDIBRUSH_IS_MASKING 0x8000 /* Pattern bitmap is used as transparent mask (?) */ #define GDIBRUSH_CACHED_IS_SOLID 0x80000000 -#define BRUSHOBJ_AllocBrush() ((HBRUSH) GDIOBJ_AllocObj (sizeof(GDIBRUSHOBJ), GDI_OBJECT_TYPE_BRUSH, NULL)) +#define BRUSHOBJ_AllocBrush() ((HBRUSH) GDIOBJ_AllocObj (sizeof(GDIBRUSHOBJ), GDI_OBJECT_TYPE_BRUSH, (GDICLEANUPPROC) Brush_InternalDelete)) #define BRUSHOBJ_FreeBrush(hBrush) GDIOBJ_FreeObj((HGDIOBJ)hBrush, GDI_OBJECT_TYPE_BRUSH, GDIOBJFLAG_DEFAULT) #define BRUSHOBJ_LockBrush(hBrush) ((PGDIBRUSHOBJ)GDIOBJ_LockObj((HGDIOBJ)hBrush, GDI_OBJECT_TYPE_BRUSH)) #define BRUSHOBJ_UnlockBrush(hBrush) GDIOBJ_UnlockObj((HGDIOBJ)hBrush, GDI_OBJECT_TYPE_BRUSH) diff --git a/reactos/subsys/win32k/dib/dib16bpp.c b/reactos/subsys/win32k/dib/dib16bpp.c index e2740164f79..83b7498b45c 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.29 2004/04/09 22:00:38 navaraf Exp $ */ +/* $Id: dib16bpp.c,v 1.30 2004/04/25 11:34:12 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -351,7 +351,7 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SourceX = SourcePoint->x; if(UsesPattern) - PatternY = Y % PatternHeight; + PatternY = (Y + BrushOrigin.y) % PatternHeight; for (X = DestRect->left; X < RoundedRight; X += 2, DestBits++, SourceX += 2) { @@ -365,8 +365,8 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (UsesPattern) { - Pattern = (DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack); - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + 1) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 16; + 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; } *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); @@ -383,7 +383,7 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (UsesPattern) { - Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; + Pattern = DIB_1BPP_GetPixel(PatternObj, (X + BrushOrigin.x) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; } DIB_16BPP_PutPixel(DestSurf, X, Y, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xFFFF); diff --git a/reactos/subsys/win32k/dib/dib1bpp.c b/reactos/subsys/win32k/dib/dib1bpp.c index 086baae2aaa..8f8b5fbf817 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.24 2004/04/09 22:00:38 navaraf Exp $ */ +/* $Id: dib1bpp.c,v 1.25 2004/04/25 11:34:12 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include @@ -423,7 +423,7 @@ DIB_1BPP_BitBlt( Y * DestSurf->lDelta); if(UsesPattern) - PatternY = Y % PatternHeight; + PatternY = (Y + BrushOrigin.y) % PatternHeight; X = DestRect->left; if (X & 31) @@ -444,7 +444,7 @@ DIB_1BPP_BitBlt( { Pattern = 0; for (k = 31 - NoBits; k < NoBits; k++) - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k) % PatternWidth, PatternY) << (31 - k)); + Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + BrushOrigin.x + k) % PatternWidth, PatternY) << (31 - k)); } Dest = DIB_DoRop(Rop4, Dest, Source, Pattern); @@ -478,10 +478,10 @@ DIB_1BPP_BitBlt( Pattern = 0; for (k = 0; k < 8; k++) { - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k) % PatternWidth, PatternY) << (7 - k)); - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k + 8) % PatternWidth, PatternY) << (8 + (7 - k))); - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k + 16) % PatternWidth, PatternY) << (16 + (7 - k))); - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k + 24) % PatternWidth, PatternY) << (24 + (7 - k))); + 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))); } } @@ -503,7 +503,7 @@ DIB_1BPP_BitBlt( if (UsesPattern) { - Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, PatternY); + Pattern = DIB_1BPP_GetPixel(PatternObj, (X + BrushOrigin.x) % PatternWidth, PatternY); } DIB_1BPP_PutPixel(DestSurf, X, Y, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF); diff --git a/reactos/subsys/win32k/dib/dib24bpp.c b/reactos/subsys/win32k/dib/dib24bpp.c index 9958af91d28..2051be0d5ab 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.24 2004/04/09 22:00:38 navaraf Exp $ */ +/* $Id: dib24bpp.c,v 1.25 2004/04/25 11:34:12 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -319,7 +319,7 @@ DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SourceX = SourcePoint->x; if(UsesPattern) - PatternY = Y % PatternHeight; + PatternY = (Y + BrushOrigin.y) % PatternHeight; for (X = DestRect->left; X < DestRect->right; X++, DestBits += 3, SourceX++) { @@ -332,7 +332,7 @@ DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (UsesPattern) { - Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; + Pattern = DIB_1BPP_GetPixel(PatternObj, (X + BrushOrigin.x) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; } Dest = DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xFFFFFF; diff --git a/reactos/subsys/win32k/dib/dib32bpp.c b/reactos/subsys/win32k/dib/dib32bpp.c index c90497c635c..5a886e8c523 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.24 2004/04/09 22:00:38 navaraf Exp $ */ +/* $Id: dib32bpp.c,v 1.25 2004/04/25 11:34:12 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -370,7 +370,7 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SourceX = SourcePoint->x; if(UsesPattern) - PatternY = Y % PatternHeight; + PatternY = (Y + BrushOrigin.y) % PatternHeight; for (X = DestRect->left; X < DestRect->right; X++, DestBits++, SourceX++) { @@ -383,7 +383,7 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (UsesPattern) { - Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; + Pattern = DIB_1BPP_GetPixel(PatternObj, (X + BrushOrigin.x) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; } *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); diff --git a/reactos/subsys/win32k/dib/dib8bpp.c b/reactos/subsys/win32k/dib/dib8bpp.c index a5d66a3aaad..a813c04f5aa 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.22 2004/04/09 22:00:38 navaraf Exp $ */ +/* $Id: dib8bpp.c,v 1.23 2004/04/25 11:34:12 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -343,7 +343,7 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, DestBits = (PULONG)(DestSurf->pvScan0 + DestRect->left + j * DestSurf->lDelta); if(UsesPattern) - PatternY = j % PatternHeight; + PatternY = (j + BrushOrigin.y) % PatternHeight; for (i = DestRect->left; i < RoundedRight; i += 4, DestBits++) { @@ -358,10 +358,10 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (UsesPattern) { - Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 1) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 8; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 2) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 16; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 3) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 24; + 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; } *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); } @@ -378,7 +378,7 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (UsesPattern) { - Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth,PatternY) ? GdiBrush->crFore : GdiBrush->crBack; + Pattern = DIB_1BPP_GetPixel(PatternObj, (i + BrushOrigin.x) % PatternWidth,PatternY) ? GdiBrush->crFore : GdiBrush->crBack; } DIB_8BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xFFFF); diff --git a/reactos/subsys/win32k/eng/bitblt.c b/reactos/subsys/win32k/eng/bitblt.c index 91bd82057e7..784209f4d35 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.51 2004/04/10 00:58:14 navaraf Exp $ +/* $Id: bitblt.c,v 1.52 2004/04/25 11:34:13 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -371,6 +371,7 @@ EngBitBlt(SURFOBJ *DestObj, OutputRect.top = DestRect->top + Translate.y; OutputRect.bottom = DestRect->bottom + Translate.y; + #if 0 if(BrushOrigin) { AdjustedBrushOrigin.x = BrushOrigin->x + Translate.x; @@ -378,6 +379,9 @@ EngBitBlt(SURFOBJ *DestObj, } else AdjustedBrushOrigin = Translate; + #else + AdjustedBrushOrigin = (BrushOrigin ? *BrushOrigin : Translate); + #endif if (NULL != OutputObj) { @@ -738,7 +742,7 @@ EngStretchBlt( OutputRect.right = prclDest->right + Translate.x; OutputRect.top = prclDest->top + Translate.y; OutputRect.bottom = prclDest->bottom + Translate.y; - +#if 0 if(BrushOrigin) { AdjustedBrushOrigin.x = BrushOrigin->x + Translate.x; @@ -746,6 +750,9 @@ EngStretchBlt( } else AdjustedBrushOrigin = Translate; +#else + AdjustedBrushOrigin = (BrushOrigin ? *BrushOrigin : Translate); +#endif if (NULL != OutputObj) { @@ -1134,6 +1141,7 @@ EngMaskBitBlt(SURFOBJ *DestObj, OutputRect.top = DestRect->top + Translate.y; OutputRect.bottom = DestRect->bottom + Translate.y; +#if 0 if(BrushOrigin) { AdjustedBrushOrigin.x = BrushOrigin->x + Translate.x; @@ -1141,6 +1149,9 @@ EngMaskBitBlt(SURFOBJ *DestObj, } else AdjustedBrushOrigin = Translate; +#else + AdjustedBrushOrigin = (BrushOrigin ? *BrushOrigin : Translate); +#endif if (NULL != OutputObj) { diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index b7359cb9427..a1d49b6b695 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.69 2004/04/09 20:03:20 navaraf Exp $ */ +/* $Id: bitmaps.c,v 1.70 2004/04/25 11:34:13 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -56,7 +56,7 @@ NtGdiBitBlt( SURFOBJ *SurfDest, *SurfSrc; PSURFGDI SurfGDIDest, SurfGDISrc; RECTL DestRect; - POINTL SourcePoint; + POINTL SourcePoint, BrushOrigin; BOOL Status; PPALGDI PalDestGDI, PalSourceGDI; XLATEOBJ *XlateObj = NULL; @@ -114,6 +114,9 @@ NtGdiBitBlt( SourcePoint.x = XSrc; SourcePoint.y = YSrc; + + BrushOrigin.x = 0; + BrushOrigin.y = 0; /* Determine surfaces to be used in the bitblt */ SurfDest = (SURFOBJ*)AccessUserObject((ULONG)DCDest->Surface); @@ -142,6 +145,7 @@ NtGdiBitBlt( SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } + BrushOrigin = BrushObj->ptOrigin; } else { @@ -244,7 +248,7 @@ NtGdiBitBlt( /* Perform the bitblt operation */ Status = IntEngBitBlt(SurfDest, SurfSrc, NULL, DCDest->CombinedClip, XlateObj, - &DestRect, &SourcePoint, NULL, &BrushObj->BrushObject, NULL, ROP); + &DestRect, &SourcePoint, NULL, &BrushObj->BrushObject, &BrushOrigin, ROP); EngDeleteXlate(XlateObj); if (NULL != Mono) @@ -1071,7 +1075,10 @@ NtGdiSetPixelV( return(FALSE); OldBrush = NtGdiSelectObject(hDC, NewBrush); if (OldBrush == NULL) + { + NtGdiDeleteObject(NewBrush); return(FALSE); + } NtGdiPatBlt(hDC, X, Y, 1, 1, PATCOPY); NtGdiSelectObject(hDC, OldBrush); NtGdiDeleteObject(NewBrush); diff --git a/reactos/subsys/win32k/objects/brush.c b/reactos/subsys/win32k/objects/brush.c index ceab60f152b..6f87c62ea72 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.34 2004/04/09 20:03:20 navaraf Exp $ + * $Id: brush.c,v 1.35 2004/04/25 11:34:13 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -33,12 +33,56 @@ #define NDEBUG #include +static const USHORT HatchBrushes[NB_HATCH_STYLES][8] = +{ + {0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00}, /* HS_HORIZONTAL */ + {0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08}, /* HS_VERTICAL */ + {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}, /* HS_FDIAGONAL */ + {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}, /* HS_BDIAGONAL */ + {0x08, 0x08, 0x08, 0xff, 0x08, 0x08, 0x08, 0x08}, /* HS_CROSS */ + {0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81} /* HS_DIAGCROSS */ +}; + +BOOL FASTCALL +Brush_InternalDelete( PGDIBRUSHOBJ pBrush ) +{ + ASSERT(pBrush); + + if(pBrush->flAttrs & (GDIBRUSH_IS_HATCH | GDIBRUSH_IS_BITMAP)) + { + ASSERT(pBrush->hbmPattern); + NtGdiDeleteObject(pBrush->hbmPattern); + } + + return TRUE; +} + HBRUSH FASTCALL IntGdiCreateBrushIndirect(PLOGBRUSH LogBrush) { PGDIBRUSHOBJ BrushObject; HBRUSH hBrush; - + HBITMAP hPattern; + + 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_PATTERN: + if(!(hPattern = BITMAPOBJ_CopyBitmap((HBITMAP)LogBrush->lbHatch))) + { + SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); + return NULL; + } + break; + } + hBrush = BRUSHOBJ_AllocBrush(); if (hBrush == NULL) { @@ -51,22 +95,26 @@ IntGdiCreateBrushIndirect(PLOGBRUSH LogBrush) switch (LogBrush->lbStyle) { case BS_NULL: - BrushObject->flAttrs = GDIBRUSH_IS_NULL; + BrushObject->flAttrs |= GDIBRUSH_IS_NULL; break; - - /* FIXME */ - case BS_HATCHED: case BS_SOLID: - BrushObject->flAttrs = GDIBRUSH_IS_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; + case BS_HATCHED: + 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 = BITMAPOBJ_CopyBitmap((HBITMAP)LogBrush->lbHatch); + BrushObject->flAttrs |= GDIBRUSH_IS_BITMAP; + BrushObject->hbmPattern = hPattern; BrushObject->BrushObject.iSolidColor = 0xFFFFFFFF; /* FIXME: Fill in the rest of fields!!! */ break; @@ -92,6 +140,7 @@ IntPatBlt( { RECTL DestRect; SURFOBJ *SurfObj; + POINTL BrushOrigin; BOOL ret; SurfObj = (SURFOBJ *)AccessUserObject((ULONG)dc->Surface); @@ -125,6 +174,9 @@ IntPatBlt( DestRect.top = YLeft + Height + dc->w.DCOrgY + 1; DestRect.bottom = YLeft + dc->w.DCOrgY + 1; } + + BrushOrigin.x = BrushObj->ptOrigin.x + dc->w.DCOrgX; + BrushOrigin.y = BrushObj->ptOrigin.y + dc->w.DCOrgY; ret = IntEngBitBlt( SurfObj, @@ -136,7 +188,7 @@ IntPatBlt( NULL, NULL, &BrushObj->BrushObject, - NULL, + &BrushOrigin, ROP); } @@ -221,7 +273,9 @@ NtGdiCreateHatchBrush(INT Style, COLORREF Color) LOGBRUSH LogBrush; if (Style < 0 || Style >= NB_HATCH_STYLES) + { return 0; + } LogBrush.lbStyle = BS_HATCHED; LogBrush.lbColor = Color; diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index a2bc5dbaeb0..a0e1bb54592 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.128 2004/04/09 20:03:20 navaraf Exp $ +/* $Id: dc.c,v 1.129 2004/04/25 11:34:13 weiden Exp $ * * DC.C - Device context functions * @@ -1797,7 +1797,13 @@ NtGdiSelectObject(HDC hDC, HGDIOBJ hGDIObj) brush->BrushObject.iSolidColor = 0xFFFFFFFF; } brush->crBack = XLATEOBJ_iXlate(XlateObj, dc->w.backgroundColor); - brush->crFore = XLATEOBJ_iXlate(XlateObj, dc->w.textColor); + 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; From 1cacbc22e0264d3bc54cb497a1bdb420c57d35a9 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sun, 25 Apr 2004 12:51:53 +0000 Subject: [PATCH 0951/1463] set proper errorcode in some functions svn path=/trunk/; revision=9215 --- reactos/subsys/win32k/objects/dc.c | 91 +++++++++++++++++++++--------- 1 file changed, 65 insertions(+), 26 deletions(-) diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index a0e1bb54592..f930ace7f93 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.129 2004/04/25 11:34:13 weiden Exp $ +/* $Id: dc.c,v 1.130 2004/04/25 12:51:53 weiden Exp $ * * DC.C - Device context functions * @@ -72,6 +72,7 @@ func_type STDCALL func_name( HDC hdc ) \ PDC dc = DC_LockDc( hdc ); \ if (!dc) \ { \ + SetLastWin32Error(ERROR_INVALID_HANDLE); \ return 0; \ } \ ft = dc->dc_field; \ @@ -83,22 +84,38 @@ func_type STDCALL func_name( HDC hdc ) \ * important that the function has the right signature, for the implementation * we can do whatever we want. */ -#define DC_GET_VAL_EX( NtGdiFuncName, IntFuncName, ret_x, ret_y, type ) \ -VOID FASTCALL IntFuncName ( PDC dc, LP##type pt ) \ -{ \ - ASSERT ( dc ); \ - ASSERT ( pt ); \ - ((LPPOINT)pt)->x = dc->ret_x; \ - ((LPPOINT)pt)->y = dc->ret_y; \ -} \ -BOOL STDCALL NtGdiFuncName ( HDC hdc, LP##type pt ) \ -{ \ - PDC dc = DC_LockDc ( hdc ); \ - if ( !dc ) \ - return FALSE; \ - IntFuncName ( dc, pt ); \ - DC_UnlockDc ( hdc ); \ - return TRUE; \ +#define DC_GET_VAL_EX( FuncName, ret_x, ret_y, type, ax, ay ) \ +VOID FASTCALL Int##FuncName ( PDC dc, LP##type pt) \ +{ \ + ASSERT(dc); \ + ASSERT(pt); \ + pt->ax = dc->ret_x; \ + pt->ay = dc->ret_y; \ +} \ +BOOL STDCALL NtGdi##FuncName ( HDC hdc, LP##type pt ) \ +{ \ + NTSTATUS Status; \ + type Safept; \ + PDC dc; \ + if(!pt) \ + { \ + SetLastWin32Error(ERROR_INVALID_PARAMETER); \ + return FALSE; \ + } \ + if(!(dc = DC_LockDc(hdc))) \ + { \ + SetLastWin32Error(ERROR_INVALID_HANDLE); \ + return FALSE; \ + } \ + Int##FuncName( dc, &Safept); \ + DC_UnlockDc(hdc); \ + Status = MmCopyToCaller(pt, &Safept, sizeof( type )); \ + if(!NT_SUCCESS(Status)) \ + { \ + SetLastNtError(Status); \ + return FALSE; \ + } \ + return TRUE; \ } #define DC_SET_MODE( func_name, dc_field, min_val, max_val ) \ @@ -107,10 +124,16 @@ INT STDCALL func_name( HDC hdc, INT mode ) \ INT prevMode; \ PDC dc; \ if ((mode < min_val) || (mode > max_val)) \ + { \ + SetLastWin32Error(ERROR_INVALID_PARAMETER); \ return 0; \ + } \ dc = DC_LockDc ( hdc ); \ if ( !dc ) \ + { \ + SetLastWin32Error(ERROR_INVALID_HANDLE); \ return 0; \ + } \ prevMode = dc->dc_field; \ dc->dc_field = mode; \ DC_UnlockDc ( hdc ); \ @@ -933,7 +956,7 @@ NtGdiEnumObjects(HDC hDC, DC_GET_VAL( COLORREF, NtGdiGetBkColor, w.backgroundColor ) DC_GET_VAL( INT, NtGdiGetBkMode, w.backgroundMode ) -DC_GET_VAL_EX( NtGdiGetBrushOrgEx, IntGetBrushOrgEx, w.brushOrgX, w.brushOrgY, POINT ) +DC_GET_VAL_EX( GetBrushOrgEx, w.brushOrgX, w.brushOrgY, POINT, x, y ) DC_GET_VAL( HRGN, NtGdiGetClipRgn, w.hClipRgn ) HGDIOBJ STDCALL @@ -942,7 +965,7 @@ NtGdiGetCurrentObject(HDC hDC, UINT ObjectType) UNIMPLEMENTED; } -DC_GET_VAL_EX ( NtGdiGetCurrentPositionEx, IntGetCurrentPositionEx, w.CursPosX, w.CursPosY, POINT ) +DC_GET_VAL_EX ( GetCurrentPositionEx, w.CursPosX, w.CursPosY, POINT, x, y ) BOOL FASTCALL IntGdiGetDCOrgEx(DC *dc, LPPOINT Point) @@ -992,11 +1015,14 @@ COLORREF STDCALL NtGdiSetBkColor(HDC hDC, COLORREF color) { COLORREF oldColor; - PDC dc = DC_LockDc(hDC); + PDC dc; HBRUSH hBrush; - if ( !dc ) - return 0x80000000; + if (!(dc = DC_LockDc(hDC))) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return CLR_INVALID; + } oldColor = dc->w.backgroundColor; dc->w.backgroundColor = color; @@ -1015,6 +1041,7 @@ NtGdiGetDCState(HDC hDC) dc = DC_LockDc(hDC); if (dc == NULL) { + SetLastWin32Error(ERROR_INVALID_HANDLE); return 0; } @@ -1213,8 +1240,11 @@ NtGdiSetDCState ( HDC hDC, HDC hDCSave ) DC_UnlockDc ( hDCSave ); } else { DC_UnlockDc ( hDC ); + SetLastWin32Error(ERROR_INVALID_HANDLE); } } + else + SetLastWin32Error(ERROR_INVALID_HANDLE); } INT STDCALL @@ -1228,6 +1258,7 @@ NtGdiGetDeviceCaps(HDC hDC, dc = DC_LockDc(hDC); if (dc == NULL) { + SetLastWin32Error(ERROR_INVALID_HANDLE); return 0; } @@ -1436,6 +1467,7 @@ IntGdiGetObject(HANDLE Handle, INT Count, LPVOID Buffer) GdiObject = GDIOBJ_LockObj(Handle, GDI_OBJECT_TYPE_DONTCARE); if (NULL == GdiObject) { + SetLastWin32Error(ERROR_INVALID_HANDLE); return 0; } @@ -1519,7 +1551,10 @@ NtGdiGetObjectType(HANDLE handle) ptr = GDIOBJ_LockObj(handle, GDI_OBJECT_TYPE_DONTCARE); if (ptr == 0) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); return 0; + } objectType = GDIOBJ_GetObjectType(handle); switch(objectType) @@ -1576,10 +1611,10 @@ DC_GET_VAL( INT, NtGdiGetROP2, w.ROPmode ) DC_GET_VAL( INT, NtGdiGetStretchBltMode, w.stretchBltMode ) DC_GET_VAL( UINT, NtGdiGetTextAlign, w.textAlign ) DC_GET_VAL( COLORREF, NtGdiGetTextColor, w.textColor ) -DC_GET_VAL_EX( NtGdiGetViewportExtEx, IntGetViewportExtEx, vportExtX, vportExtY, SIZE ) -DC_GET_VAL_EX( NtGdiGetViewportOrgEx, IntGetViewportOrgEx, vportOrgX, vportOrgY, POINT ) -DC_GET_VAL_EX( NtGdiGetWindowExtEx, IntGetWindowExtEx, wndExtX, wndExtY, SIZE ) -DC_GET_VAL_EX( NtGdiGetWindowOrgEx, IntGetWindowOrgEx, wndOrgX, wndOrgY, POINT ) +DC_GET_VAL_EX( GetViewportExtEx, vportExtX, vportExtY, SIZE, cx, cy ) +DC_GET_VAL_EX( GetViewportOrgEx, vportOrgX, vportOrgY, POINT, x, y ) +DC_GET_VAL_EX( GetWindowExtEx, wndExtX, wndExtY, SIZE, cx, cy ) +DC_GET_VAL_EX( GetWindowOrgEx, wndOrgX, wndOrgY, POINT, x, y ) HDC STDCALL NtGdiResetDC(HDC hDC, CONST DEVMODEW *InitData) @@ -1596,6 +1631,7 @@ NtGdiRestoreDC(HDC hDC, INT SaveLevel) dc = DC_LockDc(hDC); if(!dc) { + SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } @@ -1664,12 +1700,14 @@ NtGdiSaveDC(HDC hDC) dcs = DC_LockDc (hdcs); if (dcs == NULL) { + SetLastWin32Error(ERROR_INVALID_HANDLE); return 0; } dc = DC_LockDc (hDC); if (dc == NULL) { DC_UnlockDc(dc); + SetLastWin32Error(ERROR_INVALID_HANDLE); return 0; } @@ -1925,6 +1963,7 @@ NtGdiSetHookFlags(HDC hDC, WORD Flags) if (NULL == dc) { + SetLastWin32Error(ERROR_INVALID_HANDLE); return 0; } From 18d53db81a6c7b751279a49727b26203a92aa60f Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sun, 25 Apr 2004 14:46:54 +0000 Subject: [PATCH 0952/1463] use "readable" parameter names in functions svn path=/trunk/; revision=9216 --- reactos/lib/gdi32/misc/stubs.c | 36 +-- reactos/lib/gdi32/misc/wingl.c | 40 +-- reactos/lib/gdi32/objects/bitblt.c | 319 ++++++++----------- reactos/lib/gdi32/objects/brush.c | 32 +- reactos/lib/gdi32/objects/clip.c | 18 +- reactos/lib/gdi32/objects/dc.c | 425 ++++++++++++++------------ reactos/lib/gdi32/objects/fillshap.c | 86 +++--- reactos/lib/gdi32/objects/font.c | 34 +-- reactos/lib/gdi32/objects/line.c | 88 +++--- reactos/lib/gdi32/objects/linedda.c | 6 +- reactos/lib/gdi32/objects/metafile.c | 20 +- reactos/lib/gdi32/objects/pen.c | 8 +- reactos/lib/gdi32/objects/region.c | 151 +++++---- reactos/lib/gdi32/objects/text.c | 184 +++++------ reactos/subsys/win32k/objects/brush.c | 11 +- 15 files changed, 702 insertions(+), 756 deletions(-) diff --git a/reactos/lib/gdi32/misc/stubs.c b/reactos/lib/gdi32/misc/stubs.c index d6e5fd8ac54..016457c0d0c 100644 --- a/reactos/lib/gdi32/misc/stubs.c +++ b/reactos/lib/gdi32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.54 2004/04/24 14:21:36 weiden Exp $ +/* $Id: stubs.c,v 1.55 2004/04/25 14:46:53 weiden Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -1225,40 +1225,6 @@ ScaleWindowExtEx( } -/* - * @unimplemented - */ -BOOL -STDCALL -SetBrushOrgEx( - HDC a0, - int a1, - int a2, - LPPOINT a3 - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - -/* - * @unimplemented - */ -BOOL -STDCALL -FixBrushOrgEx( - HDC a0, - int a1, - int a2, - LPPOINT a3 - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - /* * @unimplemented */ diff --git a/reactos/lib/gdi32/misc/wingl.c b/reactos/lib/gdi32/misc/wingl.c index fcc7712a9d8..62be71639c3 100644 --- a/reactos/lib/gdi32/misc/wingl.c +++ b/reactos/lib/gdi32/misc/wingl.c @@ -99,14 +99,14 @@ static BOOL OpenGLEnable(void) */ INT STDCALL -ChoosePixelFormat(HDC hDC, - CONST PIXELFORMATDESCRIPTOR * pfd) +ChoosePixelFormat(HDC hdc, + CONST PIXELFORMATDESCRIPTOR * ppfd) { if (glChoosePixelFormat == NULL) if (OpenGLEnable() == FALSE) return(0); - return(glChoosePixelFormat(hDC, pfd)); + return(glChoosePixelFormat(hdc, ppfd)); } @@ -116,16 +116,16 @@ ChoosePixelFormat(HDC hDC, */ INT STDCALL -DescribePixelFormat(HDC hDC, - INT PixelFormat, - UINT BufSize, - LPPIXELFORMATDESCRIPTOR pfd) +DescribePixelFormat(HDC hdc, + INT iPixelFormat, + UINT nBytes, + LPPIXELFORMATDESCRIPTOR ppfd) { if (glDescribePixelFormat == NULL) if (OpenGLEnable() == FALSE) return(0); - return(glDescribePixelFormat(hDC, PixelFormat, BufSize, pfd)); + return(glDescribePixelFormat(hdc, iPixelFormat, nBytes, ppfd)); } @@ -135,13 +135,13 @@ DescribePixelFormat(HDC hDC, */ INT STDCALL -GetPixelFormat(HDC hDC) +GetPixelFormat(HDC hdc) { if (glGetPixelFormat == NULL) if (OpenGLEnable() == FALSE) return(0); - return(glGetPixelFormat(hDC)); + return(glGetPixelFormat(hdc)); } @@ -151,15 +151,15 @@ GetPixelFormat(HDC hDC) */ BOOL STDCALL -SetPixelFormat(HDC hDC, - INT PixelFormat, - CONST PIXELFORMATDESCRIPTOR * pfd) +SetPixelFormat(HDC hdc, + INT iPixelFormat, + CONST PIXELFORMATDESCRIPTOR * ppfd) { if (glSetPixelFormat == NULL) if (OpenGLEnable() == FALSE) return(0); - return(glSetPixelFormat(hDC, PixelFormat, pfd)); + return(glSetPixelFormat(hdc, iPixelFormat, ppfd)); } @@ -169,14 +169,14 @@ SetPixelFormat(HDC hDC, */ BOOL STDCALL -SwapBuffers(HDC hDC) +SwapBuffers(HDC hdc) { if (glSwapBuffers == NULL) if (OpenGLEnable() == FALSE) return(0); - return(glSwapBuffers(hDC)); + return(glSwapBuffers(hdc)); } @@ -190,20 +190,20 @@ SwapBuffers(HDC hDC) UINT STDCALL GetEnhMetaFilePixelFormat( - HENHMETAFILE hEmh, - DWORD cbBufz, + HENHMETAFILE hemf, + DWORD cbBuffer, CONST PIXELFORMATDESCRIPTOR *ppfd ) { ENHMETAHEADER pemh; - if(GetEnhMetaFileHeader(hEmh, sizeof(ENHMETAHEADER), &pemh)) + if(GetEnhMetaFileHeader(hemf, sizeof(ENHMETAHEADER), &pemh)) { if(pemh.bOpenGL) { if(pemh.cbPixelFormat) { - memcpy((void*)ppfd, (const void *)pemh.offPixelFormat, cbBufz ); + memcpy((void*)ppfd, (const void *)pemh.offPixelFormat, cbBuffer ); return(pemh.cbPixelFormat); } } diff --git a/reactos/lib/gdi32/objects/bitblt.c b/reactos/lib/gdi32/objects/bitblt.c index 9cf0788be50..61f95e33dee 100644 --- a/reactos/lib/gdi32/objects/bitblt.c +++ b/reactos/lib/gdi32/objects/bitblt.c @@ -1,4 +1,4 @@ -/* $Id: bitblt.c,v 1.21 2004/04/09 20:03:13 navaraf Exp $ +/* $Id: bitblt.c,v 1.22 2004/04/25 14:46:54 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -22,17 +22,17 @@ */ BOOL STDCALL -BitBlt(HDC hDCDest, - INT XDest, - INT YDest, - INT Width, - INT Height, - HDC hDCSrc, - INT XSrc, - INT YSrc, - DWORD ROP) +BitBlt(HDC hdcDest, + INT nXDest, + INT nYDest, + INT nWidth, + INT nHeight, + HDC hdcSrc, + INT nXSrc, + INT nYSrc, + DWORD dwRop) { - return NtGdiBitBlt(hDCDest, XDest, YDest, Width, Height, hDCSrc, XSrc, YSrc, ROP); + return NtGdiBitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, dwRop); } @@ -41,13 +41,13 @@ BitBlt(HDC hDCDest, */ HBITMAP STDCALL -CreateBitmap(INT Width, - INT Height, - UINT Planes, - UINT BitsPerPel, - CONST VOID *Bits) +CreateBitmap(INT nWidth, + INT nHeight, + UINT cPlanes, + UINT cBitsPerPel, + CONST VOID *lpvBits) { - return NtGdiCreateBitmap(Width, Height, Planes, BitsPerPel, Bits); + return NtGdiCreateBitmap(nWidth, nHeight, cPlanes, cBitsPerPel, lpvBits); } @@ -56,9 +56,9 @@ CreateBitmap(INT Width, */ HBITMAP STDCALL -CreateBitmapIndirect(CONST BITMAP *BM) +CreateBitmapIndirect(CONST BITMAP *lpbm) { - return NtGdiCreateBitmapIndirect(BM); + return NtGdiCreateBitmapIndirect(lpbm); } @@ -67,11 +67,11 @@ CreateBitmapIndirect(CONST BITMAP *BM) */ HBITMAP STDCALL -CreateCompatibleBitmap(HDC hDC, - INT Width, - INT Height) +CreateCompatibleBitmap(HDC hdc, + INT nWidth, + INT nHeight) { - return NtGdiCreateCompatibleBitmap(hDC, Width, Height); + return NtGdiCreateCompatibleBitmap(hdc, nWidth, nHeight); } @@ -80,11 +80,11 @@ CreateCompatibleBitmap(HDC hDC, */ HBITMAP STDCALL -CreateDiscardableBitmap(HDC hDC, - INT Width, - INT Height) +CreateDiscardableBitmap(HDC hdc, + INT nWidth, + INT nHeight) { - return NtGdiCreateDiscardableBitmap(hDC, Width, Height); + return NtGdiCreateDiscardableBitmap(hdc, nWidth, nHeight); } @@ -93,14 +93,14 @@ CreateDiscardableBitmap(HDC hDC, */ HBITMAP STDCALL -CreateDIBitmap(HDC hDC, - CONST BITMAPINFOHEADER *bmih, - DWORD Init, - CONST VOID *bInit, - CONST BITMAPINFO *bmi, - UINT Usage) +CreateDIBitmap(HDC hdc, + CONST BITMAPINFOHEADER *lpbmih, + DWORD fdwInit, + CONST VOID *lpbInit, + CONST BITMAPINFO *lpbmi, + UINT fuUsage) { - return NtGdiCreateDIBitmap(hDC, bmih, Init, bInit, bmi, Usage); + return NtGdiCreateDIBitmap(hdc, lpbmih, fdwInit, lpbInit, lpbmi, fuUsage); } @@ -109,11 +109,11 @@ CreateDIBitmap(HDC hDC, */ LONG STDCALL -GetBitmapBits(HBITMAP hBitmap, - LONG Count, - LPVOID Bits) +GetBitmapBits(HBITMAP hbmp, + LONG cbBuffer, + LPVOID lpvBits) { - return NtGdiGetBitmapBits(hBitmap, Count, Bits); + return NtGdiGetBitmapBits(hbmp, cbBuffer, lpvBits); } @@ -123,9 +123,9 @@ GetBitmapBits(HBITMAP hBitmap, BOOL STDCALL GetBitmapDimensionEx(HBITMAP hBitmap, - LPSIZE Dimension) + LPSIZE lpDimension) { - return NtGdiGetBitmapDimensionEx(hBitmap, Dimension); + return NtGdiGetBitmapDimensionEx(hBitmap, lpDimension); } @@ -134,15 +134,15 @@ GetBitmapDimensionEx(HBITMAP hBitmap, */ int STDCALL -GetDIBits(HDC hDC, - HBITMAP hBitmap, - UINT StartScan, - UINT ScanLines, - LPVOID Bits, - LPBITMAPINFO bi, - UINT Usage) +GetDIBits(HDC hdc, + HBITMAP hbmp, + UINT uStartScan, + UINT cScanLines, + LPVOID lpvBits, + LPBITMAPINFO lpbi, + UINT uUsage) { - return NtGdiGetDIBits(hDC, hBitmap, StartScan, ScanLines, Bits, bi, Usage); + return NtGdiGetDIBits(hdc, hbmp, uStartScan, cScanLines, lpvBits, lpbi, uUsage); } @@ -151,20 +151,20 @@ GetDIBits(HDC hDC, */ BOOL STDCALL -MaskBlt(HDC hDCDest, - INT XDest, - INT YDest, - INT Width, - INT Height, - HDC hDCSrc, - INT XSrc, - INT YSrc, - HBITMAP hMaskBitmap, +MaskBlt(HDC hdcDest, + INT nXDest, + INT nYDest, + INT nWidth, + INT nHeight, + HDC hdcSrc, + INT nXSrc, + INT nYSrc, + HBITMAP hbmMask, INT xMask, INT yMask, - DWORD ROP) + DWORD dwRop) { - return NtGdiMaskBlt(hDCDest, XDest, YDest, Width, Height, hDCSrc, XSrc, YSrc, hMaskBitmap, xMask, yMask, ROP); + return NtGdiMaskBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, hbmMask, xMask, yMask, dwRop); } @@ -173,18 +173,18 @@ MaskBlt(HDC hDCDest, */ BOOL STDCALL -PlgBlt(HDC hDCDest, - CONST POINT *Point, - HDC hDCSrc, - INT XSrc, - INT YSrc, - INT Width, - INT Height, - HBITMAP hMaskBitmap, +PlgBlt(HDC hdcDest, + CONST POINT *lpPoint, + HDC hdcSrc, + INT nXSrc, + INT nYSrc, + INT nWidth, + INT nHeight, + HBITMAP hbmMask, INT xMask, INT yMask) { - return NtGdiPlgBlt(hDCDest, Point, hDCSrc, XSrc, YSrc, Width, Height, hMaskBitmap, xMask, yMask); + return NtGdiPlgBlt(hdcDest, lpPoint, hdcSrc, nXSrc, nYSrc, nWidth, nHeight, hbmMask, xMask, yMask); } @@ -193,11 +193,11 @@ PlgBlt(HDC hDCDest, */ LONG STDCALL -SetBitmapBits(HBITMAP hBitmap, - DWORD Bytes, - CONST VOID *Bits) +SetBitmapBits(HBITMAP hbmp, + DWORD cBytes, + CONST VOID *lpBits) { - return NtGdiSetBitmapBits(hBitmap, Bytes, Bits); + return NtGdiSetBitmapBits(hbmp, cBytes, lpBits); } @@ -206,15 +206,15 @@ SetBitmapBits(HBITMAP hBitmap, */ int STDCALL -SetDIBits(HDC hDC, - HBITMAP hBitmap, - UINT StartScan, - UINT ScanLines, - CONST VOID *Bits, - CONST BITMAPINFO *bmi, - UINT ColorUse) +SetDIBits(HDC hdc, + HBITMAP hbmp, + UINT uStartScan, + UINT cScanLines, + CONST VOID *lpvBits, + CONST BITMAPINFO *lpbmi, + UINT fuColorUse) { - return NtGdiSetDIBits(hDC, hBitmap, StartScan, ScanLines, Bits, bmi, ColorUse); + return NtGdiSetDIBits(hdc, hbmp, uStartScan, cScanLines, lpvBits, lpbmi, fuColorUse); } @@ -223,21 +223,21 @@ SetDIBits(HDC hDC, */ int STDCALL -SetDIBitsToDevice(HDC hDC, +SetDIBitsToDevice(HDC hdc, INT XDest, INT YDest, - DWORD Width, - DWORD Height, + DWORD dwWidth, + DWORD dwHeight, INT XSrc, INT YSrc, - UINT StartScan, - UINT ScanLines, - CONST VOID *Bits, - CONST BITMAPINFO *bmi, - UINT ColorUse) + UINT uStartScan, + UINT cScanLines, + CONST VOID *lpvBits, + CONST BITMAPINFO *lpbmi, + UINT fuColorUse) { - return NtGdiSetDIBitsToDevice(hDC, XDest, YDest, Width, Height, XSrc, YSrc, StartScan, ScanLines, - Bits, bmi, ColorUse); + return NtGdiSetDIBitsToDevice(hdc, XDest, YDest, dwWidth, dwHeight, XSrc, YSrc, uStartScan, cScanLines, + lpvBits, lpbmi, fuColorUse); } @@ -260,34 +260,14 @@ StretchBlt( DWORD dwRop // raster operation code ) { - //SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - if ( (nWidthDest==nWidthSrc) && (nHeightDest==nHeightSrc) ) - { - return BitBlt(hdcDest, - nXOriginDest, // x-coord of destination upper-left corner - nYOriginDest, // y-coord of destination upper-left corner - nWidthDest, // width of destination rectangle - nHeightDest, // height of destination rectangle - hdcSrc, // handle to source DC - nXOriginSrc, // x-coordinate of source upper-left corner - nYOriginSrc, // y-coordinate of source upper-left corner - dwRop // raster operation code - ); - } else - { - DPRINT1("FIXME: StretchBlt is in development phase now...\n"); - return NtGdiStretchBlt(hdcDest, - nXOriginDest, - nYOriginDest, - nWidthDest, - nHeightDest, - hdcSrc, - nXOriginSrc, - nYOriginSrc, - nWidthSrc, - nHeightSrc, - dwRop); - } + if ((nWidthDest != nWidthSrc) || (nHeightDest != nHeightSrc)) + { + return NtGdiStretchBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, + hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, dwRop); + } + + return BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hdcSrc, + nXOriginSrc, nYOriginSrc, dwRop); } @@ -296,22 +276,22 @@ StretchBlt( */ int STDCALL -StretchDIBits(HDC hDC, +StretchDIBits(HDC hdc, INT XDest, INT YDest, - INT DestWidth, - INT DestHeight, + INT nDestWidth, + INT nDestHeight, INT XSrc, INT YSrc, - INT SrcWidth, - INT SrcHeight, - CONST VOID *Bits, - CONST BITMAPINFO *BitsInfo, - UINT Usage, - DWORD ROP) + INT nSrcWidth, + INT nSrcHeight, + CONST VOID *lpBits, + CONST BITMAPINFO *lpBitsInfo, + UINT iUsage, + DWORD dwRop) { - return NtGdiStretchDIBits(hDC, XDest, YDest, DestWidth, DestHeight, XSrc, YSrc, - SrcWidth, SrcHeight, Bits, BitsInfo, Usage, ROP); + return NtGdiStretchDIBits(hdc, XDest, YDest, nDestWidth, nDestHeight, XSrc, YSrc, + nSrcWidth, nSrcHeight, lpBits, lpBitsInfo, iUsage, dwRop); } @@ -320,14 +300,14 @@ StretchDIBits(HDC hDC, */ HBITMAP STDCALL -CreateDIBSection(HDC hDC, - CONST BITMAPINFO *bmi, - UINT Usage, - PVOID *Bits, +CreateDIBSection(HDC hdc, + CONST BITMAPINFO *pbmi, + UINT iUsage, + VOID **ppvBits, HANDLE hSection, DWORD dwOffset) { - return NtGdiCreateDIBSection(hDC, bmi, Usage, Bits, hSection, dwOffset); + return NtGdiCreateDIBSection(hdc, pbmi, iUsage, ppvBits, hSection, dwOffset); } @@ -336,12 +316,12 @@ CreateDIBSection(HDC hDC, */ COLORREF STDCALL -SetPixel(HDC hDC, +SetPixel(HDC hdc, INT X, INT Y, - COLORREF Color) + COLORREF crColor) { - return NtGdiSetPixel(hDC, X, Y, Color); + return NtGdiSetPixel(hdc, X, Y, crColor); } @@ -350,9 +330,9 @@ SetPixel(HDC hDC, */ BOOL STDCALL -SetPixelV ( HDC hDC, int XPos, int YPos, COLORREF Color ) +SetPixelV ( HDC hdc, int X, int Y, COLORREF crColor ) { - return NtGdiSetPixelV ( hDC, XPos, YPos, Color ); + return NtGdiSetPixelV(hdc, X, Y, crColor); } @@ -361,9 +341,9 @@ SetPixelV ( HDC hDC, int XPos, int YPos, COLORREF Color ) */ COLORREF STDCALL -GetPixel(HDC hDC, int X, int Y) +GetPixel(HDC hdc, int nXPos, int nYPos) { - return NtGdiGetPixel(hDC, X, Y); + return NtGdiGetPixel(hdc, nXPos, nYPos); } @@ -371,9 +351,9 @@ GetPixel(HDC hDC, int X, int Y) * @implemented */ BOOL STDCALL -PatBlt(HDC hDC, INT Left, INT Top, INT Width, INT Height, ULONG Rop) +PatBlt(HDC hdc, INT nXLeft, INT nYLeft, INT nWidth, INT nHeight, DWORD dwRop) { - return NtGdiPatBlt(hDC, Left, Top, Width, Height, Rop); + return NtGdiPatBlt(hdc, nXLeft, nYLeft, nWidth, nHeight, dwRop); } /* @@ -381,9 +361,9 @@ PatBlt(HDC hDC, INT Left, INT Top, INT Width, INT Height, ULONG Rop) */ BOOL STDCALL -PolyPatBlt(HDC hDC,DWORD dwRop,PPATRECT pRects,int cRects,ULONG Reserved) +PolyPatBlt(HDC hdc, DWORD dwRop, PPATRECT lppRects, int cRects, ULONG Reserved) { - return NtGdiPolyPatBlt(hDC,dwRop,pRects,cRects,Reserved); + return NtGdiPolyPatBlt(hdc, dwRop, lppRects, cRects, Reserved); } /****************************************************************************** @@ -393,50 +373,11 @@ PolyPatBlt(HDC hDC,DWORD dwRop,PPATRECT pRects,int cRects,ULONG Reserved) */ WINBOOL STDCALL -GdiTransparentBlt(HDC hdcDst, int xDst, int yDst, int cxDst, int cyDst, - HDC hdcSrc, int xSrc, int ySrc, int cxSrc, int cySrc, - COLORREF TransColor) +GdiTransparentBlt(HDC hdcDst, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, + HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, + COLORREF crTransparent) { - return (WINBOOL)NtGdiTransparentBlt(hdcDst, xDst, yDst, cxDst, cyDst, hdcSrc, - xSrc, ySrc, cxSrc, cySrc, TransColor); + return (WINBOOL)NtGdiTransparentBlt(hdcDst, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hdcSrc, + nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, crTransparent); } -/* - -BOOL STDCALL NtGdiExtFloodFill(HDC hDC, INT XStart, INT YStart, COLORREF Color, UINT FillType) -BOOL STDCALL NtGdiFloodFill(HDC hDC, INT XStart, INT YStart, COLORREF Fill) -UINT STDCALL NtGdiGetDIBColorTable(HDC hDC, UINT StartIndex, UINT Entries, RGBQUAD *Colors) -COLORREF STDCALL NtGdiGetPixel(HDC hDC, - INT XPos, - INT YPos) -BOOL STDCALL NtGdiSetBitmapDimensionEx(HBITMAP hBitmap, - INT Width, - INT Height, - LPSIZE Size) -UINT STDCALL NtGdiSetDIBColorTable(HDC hDC, - UINT StartIndex, - UINT Entries, - CONST RGBQUAD *Colors) -BOOL STDCALL NtGdiSetPixelV(HDC hDC, - INT X, - INT Y, - COLORREF Color) -BOOL STDCALL NtGdiStretchBlt(HDC hDCDest, - INT XOriginDest, - INT YOriginDest, - INT WidthDest, - INT HeightDest, - HDC hDCSrc, - INT XOriginSrc, - INT YOriginSrc, - INT WidthSrc, - INT HeightSrc, - DWORD ROP) - -INT BITMAPOBJ_GetWidthBytes (INT bmWidth, INT bpp) -HBITMAP BITMAPOBJ_CopyBitmap(HBITMAP hBitmap) -int DIB_GetDIBWidthBytes(int width, int depth) -int DIB_GetDIBImageBytes (int width, int height, int depth) -int DIB_BitmapInfoSize (const BITMAPINFO * info, WORD coloruse) - -*/ diff --git a/reactos/lib/gdi32/objects/brush.c b/reactos/lib/gdi32/objects/brush.c index 63cebcaf172..ee9d627fa60 100644 --- a/reactos/lib/gdi32/objects/brush.c +++ b/reactos/lib/gdi32/objects/brush.c @@ -14,10 +14,10 @@ HBRUSH STDCALL CreateSolidBrush( - COLORREF a0 + COLORREF crColor ) { - return NtGdiCreateSolidBrush(a0); + return NtGdiCreateSolidBrush(crColor); } /* @@ -26,10 +26,10 @@ CreateSolidBrush( HBRUSH STDCALL CreateBrushIndirect( - CONST LOGBRUSH *a0 + CONST LOGBRUSH *lplb ) { - return NtGdiCreateBrushIndirect(a0); + return NtGdiCreateBrushIndirect(lplb); } /* @@ -38,11 +38,11 @@ CreateBrushIndirect( HBRUSH STDCALL CreateDIBPatternBrushPt( - CONST VOID *a0, - UINT a1 + CONST VOID *lpPackedDIB, + UINT iUsage ) { - return NtGdiCreateDIBPatternBrushPt(a0,a1); + return NtGdiCreateDIBPatternBrushPt(lpPackedDIB, iUsage); } /* @@ -51,9 +51,21 @@ CreateDIBPatternBrushPt( HBRUSH STDCALL CreateHatchBrush( - int a0, - COLORREF a1 + int fnStyle, + COLORREF clrref ) { - return NtGdiCreateHatchBrush(a0,a1); + return NtGdiCreateHatchBrush(fnStyle, clrref); +} + +/* + * @implemented + */ +HBRUSH +STDCALL +CreatePatternBrush( + HBITMAP hbmp + ) +{ + return NtGdiCreatePatternBrush ( hbmp ); } diff --git a/reactos/lib/gdi32/objects/clip.c b/reactos/lib/gdi32/objects/clip.c index 807e390445b..adb324fa6eb 100644 --- a/reactos/lib/gdi32/objects/clip.c +++ b/reactos/lib/gdi32/objects/clip.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: clip.c,v 1.4 2003/12/21 22:41:00 navaraf Exp $ +/* $Id: clip.c,v 1.5 2004/04/25 14:46:54 weiden Exp $ * * PROJECT: ReactOS gdi32.dll * FILE: lib/gdi32/objects/clip.c @@ -34,9 +34,9 @@ */ int STDCALL -SelectClipRgn(HDC DC, HRGN Rgn) +SelectClipRgn(HDC hdc, HRGN hrgn) { - return NtGdiSelectClipRgn(DC, Rgn); + return NtGdiSelectClipRgn(hdc, hrgn); } /* @@ -45,14 +45,14 @@ SelectClipRgn(HDC DC, HRGN Rgn) int STDCALL IntersectClipRect( - HDC hDc, - int a1, - int a2, - int a3, - int a4 + HDC hdc, + int nLeftRect, + int nTopRect, + int nRightRect, + int nBottomRect ) { - return NtGdiIntersectClipRect(hDc, a1, a2, a3, a4); + return NtGdiIntersectClipRect(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect); } diff --git a/reactos/lib/gdi32/objects/dc.c b/reactos/lib/gdi32/objects/dc.c index 0b4459131c8..d9e1dc8e196 100644 --- a/reactos/lib/gdi32/objects/dc.c +++ b/reactos/lib/gdi32/objects/dc.c @@ -17,10 +17,10 @@ DWORD STDCALL GetObjectType( - HGDIOBJ a0 + HGDIOBJ h ) { - return NtGdiGetObjectType(a0); + return NtGdiGetObjectType(h); } @@ -31,12 +31,12 @@ GetObjectType( BOOL STDCALL DPtoLP( - HDC a0, - LPPOINT a1, - int a2 + HDC hdc, + LPPOINT lpPoints, + int nCount ) { - return NtGdiDPtoLP(a0, a1, a2); + return NtGdiDPtoLP(hdc, lpPoints, nCount); } @@ -46,11 +46,11 @@ DPtoLP( COLORREF STDCALL SetBkColor( - HDC a0, - COLORREF a1 + HDC hdc, + COLORREF crColor ) { - return NtGdiSetBkColor(a0, a1); + return NtGdiSetBkColor(hdc, crColor); } @@ -60,10 +60,10 @@ SetBkColor( int STDCALL GetGraphicsMode( - HDC a0 + HDC hdc ) { - return NtGdiGetGraphicsMode(a0); + return NtGdiGetGraphicsMode(hdc); } @@ -77,7 +77,7 @@ SetGraphicsMode( int iMode ) { - return NtGdiSetGraphicsMode(hdc, iMode); + return NtGdiSetGraphicsMode(hdc, iMode); } @@ -87,10 +87,10 @@ SetGraphicsMode( int STDCALL GetMapMode( - HDC a0 + HDC hdc ) { - return NtGdiGetMapMode(a0); + return NtGdiGetMapMode(hdc); } /* @@ -99,11 +99,11 @@ GetMapMode( BOOL STDCALL GetCurrentPositionEx( - HDC a0, - LPPOINT a1 + HDC hdc, + LPPOINT lpPoint ) { - return NtGdiGetCurrentPositionEx(a0, a1); + return NtGdiGetCurrentPositionEx(hdc, lpPoint); } @@ -113,10 +113,10 @@ GetCurrentPositionEx( COLORREF STDCALL GetBkColor( - HDC a0 + HDC hdc ) { - return NtGdiGetBkColor(a0); + return NtGdiGetBkColor(hdc); } @@ -126,10 +126,10 @@ GetBkColor( int STDCALL GetBkMode( - HDC a0 + HDC hdc ) { - return NtGdiGetBkMode(a0); + return NtGdiGetBkMode(hdc); } /* @@ -138,11 +138,11 @@ GetBkMode( BOOL STDCALL GetBrushOrgEx( - HDC a0, - LPPOINT a1 + HDC hdc, + LPPOINT lppt ) { - return NtGdiGetBrushOrgEx(a0, a1); + return NtGdiGetBrushOrgEx(hdc, lppt); } @@ -152,11 +152,10 @@ GetBrushOrgEx( int STDCALL GetROP2( - HDC a0 + HDC hdc ) { - return NtGdiGetROP2(a0); - + return NtGdiGetROP2(hdc); } @@ -166,11 +165,10 @@ GetROP2( int STDCALL GetStretchBltMode( - HDC a0 + HDC hdc ) { - return NtGdiGetStretchBltMode(a0); - + return NtGdiGetStretchBltMode(hdc); } @@ -181,11 +179,10 @@ GetStretchBltMode( UINT STDCALL GetTextAlign( - HDC hDc + HDC hdc ) { - return NtGdiGetTextAlign(hDc); - + return NtGdiGetTextAlign(hdc); } @@ -195,11 +192,10 @@ GetTextAlign( COLORREF STDCALL GetTextColor( - HDC hDc + HDC hdc ) { - return NtGdiGetTextColor(hDc); - + return NtGdiGetTextColor(hdc); } @@ -209,12 +205,11 @@ GetTextColor( BOOL STDCALL GetViewportExtEx( - HDC hDc, + HDC hdc, LPSIZE lpSize ) { - return NtGdiGetViewportExtEx(hDc, lpSize); - + return NtGdiGetViewportExtEx(hdc, lpSize); } @@ -224,12 +219,11 @@ GetViewportExtEx( BOOL STDCALL GetViewportOrgEx( - HDC hDc, + HDC hdc, LPPOINT lpPoint ) { - return NtGdiGetViewportOrgEx(hDc, lpPoint); - + return NtGdiGetViewportOrgEx(hdc, lpPoint); } @@ -239,11 +233,11 @@ GetViewportOrgEx( BOOL STDCALL GetWindowExtEx( - HDC hDc, + HDC hdc, LPSIZE lpSize ) { - return NtGdiGetWindowExtEx(hDc, lpSize); + return NtGdiGetWindowExtEx(hdc, lpSize); } @@ -253,11 +247,11 @@ GetWindowExtEx( BOOL STDCALL GetWindowOrgEx( - HDC hDc, + HDC hdc, LPPOINT lpPoint ) { - return NtGdiGetWindowOrgEx(hDc, lpPoint); + return NtGdiGetWindowOrgEx(hdc, lpPoint); } @@ -267,12 +261,11 @@ GetWindowOrgEx( int STDCALL SetBkMode( - HDC a0, - int a1 + HDC hdc, + int iBkMode ) { - return NtGdiSetBkMode(a0, a1); - + return NtGdiSetBkMode(hdc, iBkMode); } @@ -282,11 +275,11 @@ SetBkMode( int STDCALL SetROP2( - HDC a0, - int a1 + HDC hdc, + int fnDrawMode ) { - return NtGdiSetROP2(a0, a1); + return NtGdiSetROP2(hdc, fnDrawMode); } @@ -296,12 +289,11 @@ SetROP2( int STDCALL SetStretchBltMode( - HDC a0, - int a1 + HDC hdc, + int iStretchMode ) { - return NtGdiSetStretchBltMode(a0, a1); - + return NtGdiSetStretchBltMode(hdc, iStretchMode); } @@ -311,12 +303,11 @@ SetStretchBltMode( DWORD STDCALL GetRelAbs( - HDC a0, - DWORD a1 + HDC hdc, + DWORD dwIgnore ) { - return NtGdiGetRelAbs(a0); - + return NtGdiGetRelAbs(hdc); } @@ -324,9 +315,9 @@ GetRelAbs( * @implemented */ HGDIOBJ STDCALL -GetStockObject(int Index) +GetStockObject(int fnObject) { - return(NtGdiGetStockObject(Index)); + return NtGdiGetStockObject(fnObject); } @@ -334,9 +325,11 @@ GetStockObject(int Index) * @implemented */ int STDCALL -GetClipBox(HDC hDc, LPRECT Rect) +GetClipBox( + HDC hdc, + LPRECT lprc) { - return(NtGdiGetClipBox(hDc, Rect)); + return NtGdiGetClipBox(hdc, lprc); } @@ -346,10 +339,10 @@ GetClipBox(HDC hDc, LPRECT Rect) int STDCALL GetPolyFillMode( - HDC a0 + HDC hdc ) { - return NtGdiGetPolyFillMode(a0); + return NtGdiGetPolyFillMode(hdc); } @@ -457,9 +450,9 @@ CreateDCW ( /* * @implemented */ -BOOL STDCALL DeleteDC( HDC hDC ) +BOOL STDCALL DeleteDC( HDC hdc ) { - return NtGdiDeleteDC( hDC ); + return NtGdiDeleteDC(hdc); } @@ -469,10 +462,10 @@ BOOL STDCALL DeleteDC( HDC hDC ) HDC STDCALL CreateCompatibleDC( - HDC hDC + HDC hdc ) { - return NtGdiCreateCompatableDC(hDC); + return NtGdiCreateCompatableDC(hdc); } @@ -482,11 +475,11 @@ CreateCompatibleDC( HGDIOBJ STDCALL SelectObject( - HDC hDC, - HGDIOBJ hGDIObj + HDC hdc, + HGDIOBJ hgdiobj ) { - return NtGdiSelectObject(hDC, hGDIObj); + return NtGdiSelectObject(hdc, hgdiobj); } @@ -496,11 +489,11 @@ SelectObject( int STDCALL SetMapMode( - HDC a0, - int a1 + HDC hdc, + int fnMapMode ) { - return NtGdiSetMapMode( a0, a1 ); + return NtGdiSetMapMode(hdc, fnMapMode); } @@ -510,13 +503,13 @@ SetMapMode( BOOL STDCALL SetViewportOrgEx( - HDC a0, - int a1, - int a2, - LPPOINT a3 + HDC hdc, + int X, + int Y, + LPPOINT lpPoint ) { - return NtGdiSetViewportOrgEx( a0, a1, a2, a3 ); + return NtGdiSetViewportOrgEx(hdc, X, Y, lpPoint); } @@ -526,13 +519,13 @@ SetViewportOrgEx( BOOL STDCALL OffsetViewportOrgEx( - HDC DC, - int XOffset, - int YOffset, - LPPOINT Point + HDC hdc, + int nXOffset, + int nYOffset, + LPPOINT lpPoint ) { - return NtGdiOffsetViewportOrgEx(DC, XOffset, YOffset, Point); + return NtGdiOffsetViewportOrgEx(hdc, nXOffset, nYOffset, lpPoint); } @@ -542,13 +535,13 @@ OffsetViewportOrgEx( BOOL STDCALL SetWindowOrgEx( - HDC a0, - int a1, - int a2, - LPPOINT a3 + HDC hdc, + int X, + int Y, + LPPOINT lpPoint ) { - return NtGdiSetWindowOrgEx( a0, a1, a2, a3 ); + return NtGdiSetWindowOrgEx(hdc, X, Y, lpPoint); } @@ -557,15 +550,15 @@ SetWindowOrgEx( */ BOOL STDCALL -DeleteObject(HGDIOBJ Obj) +DeleteObject(HGDIOBJ hObject) { - if (0 != ((DWORD) Obj & 0x00800000)) + if (0 != ((DWORD) hObject & 0x00800000)) { - DPRINT1("Trying to delete system object 0x%x\n", Obj); + DPRINT1("Trying to delete system object 0x%x\n", hObject); return FALSE; } - return NtGdiDeleteObject(Obj); + return NtGdiDeleteObject(hObject); } @@ -575,12 +568,12 @@ DeleteObject(HGDIOBJ Obj) HPALETTE STDCALL SelectPalette( - HDC a0, - HPALETTE a1, - BOOL a2 + HDC hdc, + HPALETTE hpal, + BOOL bForceBackground ) { - return NtGdiSelectPalette( a0, a1,a2 ); + return NtGdiSelectPalette(hdc, hpal, bForceBackground); } @@ -590,10 +583,10 @@ SelectPalette( UINT STDCALL RealizePalette( - HDC a0 + HDC hdc ) { - return NtGdiRealizePalette( a0 ); + return NtGdiRealizePalette(hdc); } @@ -603,12 +596,12 @@ RealizePalette( BOOL STDCALL LPtoDP( - HDC a0, - LPPOINT a1, - int a2 + HDC hdc, + LPPOINT lpPoints, + int nCount ) { - return NtGdiLPtoDP(a0, a1, a2); + return NtGdiLPtoDP(hdc, lpPoints, nCount); } @@ -618,11 +611,11 @@ LPtoDP( int STDCALL SetPolyFillMode( - HDC a0, - int a1 + HDC hdc, + int iPolyFillMode ) { - return NtGdiSetPolyFillMode(a0, a1); + return NtGdiSetPolyFillMode(hdc, iPolyFillMode); } @@ -632,11 +625,11 @@ SetPolyFillMode( int STDCALL GetDeviceCaps( - HDC DC, - int Index + HDC hdc, + int nIndex ) { - return NtGdiGetDeviceCaps(DC, Index); + return NtGdiGetDeviceCaps(hdc, nIndex); } /* @@ -645,10 +638,10 @@ GetDeviceCaps( HPALETTE STDCALL CreatePalette( - CONST LOGPALETTE *a0 + CONST LOGPALETTE *lplgpl ) { - return NtGdiCreatePalette((CONST PLOGPALETTE)a0); + return NtGdiCreatePalette((CONST PLOGPALETTE)lplgpl); } /* @@ -657,11 +650,11 @@ CreatePalette( COLORREF STDCALL GetNearestColor( - HDC a0, - COLORREF a1 + HDC hdc, + COLORREF crColor ) { - return NtGdiGetNearestColor(a0,a1); + return NtGdiGetNearestColor(hdc, crColor); } /* @@ -670,11 +663,11 @@ GetNearestColor( UINT STDCALL GetNearestPaletteIndex( - HPALETTE a0, - COLORREF a1 + HPALETTE hpal, + COLORREF crColor ) { - return NtGdiGetNearestPaletteIndex(a0,a1); + return NtGdiGetNearestPaletteIndex(hpal, crColor); } /* @@ -683,13 +676,13 @@ GetNearestPaletteIndex( UINT STDCALL GetPaletteEntries( - HPALETTE a0, - UINT a1, - UINT a2, - LPPALETTEENTRY a3 + HPALETTE hpal, + UINT iStartIndex, + UINT nEntries, + LPPALETTEENTRY lppe ) { - return NtGdiGetPaletteEntries(a0,a1,a2,a3); + return NtGdiGetPaletteEntries(hpal, iStartIndex, nEntries, lppe); } /* @@ -698,13 +691,13 @@ GetPaletteEntries( UINT STDCALL GetSystemPaletteEntries( - HDC a0, - UINT a1, - UINT a2, - LPPALETTEENTRY a3 + HDC hdc, + UINT iStartIndex, + UINT nEntries, + LPPALETTEENTRY lppe ) { - return NtGdiGetSystemPaletteEntries(a0,a1,a2,a3); + return NtGdiGetSystemPaletteEntries(hdc, iStartIndex, nEntries, lppe); } /* @@ -713,11 +706,11 @@ GetSystemPaletteEntries( BOOL STDCALL RestoreDC( - HDC a0, - int a1 + HDC hdc, + int nSavedDC ) { - return NtGdiRestoreDC(a0,a1); + return NtGdiRestoreDC(hdc, nSavedDC); } @@ -727,10 +720,10 @@ RestoreDC( int STDCALL SaveDC( - HDC a0 + HDC hdc ) { - return NtGdiSaveDC(a0); + return NtGdiSaveDC(hdc); } /* @@ -739,13 +732,13 @@ SaveDC( UINT STDCALL SetPaletteEntries( - HPALETTE a0, - UINT a1, - UINT a2, - CONST PALETTEENTRY *a3 + HPALETTE hpal, + UINT iStart, + UINT cEntries, + CONST PALETTEENTRY *lppe ) { - return NtGdiSetPaletteEntries(a0,a1,a2,(CONST PPALETTEENTRY)a3); + return NtGdiSetPaletteEntries(hpal, iStart, cEntries, (CONST PPALETTEENTRY)lppe); } /* @@ -755,10 +748,10 @@ BOOL STDCALL GetWorldTransform( HDC hdc, - LPXFORM a1 + LPXFORM lpXform ) { - return NtGdiGetWorldTransform(hdc,a1); + return NtGdiGetWorldTransform(hdc, lpXform); } /* @@ -767,11 +760,11 @@ GetWorldTransform( BOOL STDCALL SetWorldTransform( - HDC a0, - CONST XFORM *a1 + HDC hdc, + CONST XFORM *lpXform ) { - return NtGdiSetWorldTransform(a0,(CONST PXFORM)a1); + return NtGdiSetWorldTransform(hdc, (CONST PXFORM)lpXform); } /* @@ -780,12 +773,12 @@ SetWorldTransform( BOOL STDCALL ModifyWorldTransform( - HDC a0, - CONST XFORM *a1, - DWORD a2 + HDC hdc, + CONST XFORM *lpXform, + DWORD iMode ) { - return NtGdiModifyWorldTransform(a0,(CONST PXFORM)a1,a2); + return NtGdiModifyWorldTransform(hdc, (CONST PXFORM)lpXform, iMode); } /* @@ -794,12 +787,12 @@ ModifyWorldTransform( BOOL STDCALL CombineTransform( - LPXFORM a0, - CONST XFORM *a1, - CONST XFORM *a2 + LPXFORM lpxformResult, + CONST XFORM *lpxform1, + CONST XFORM *lpxform2 ) { - return NtGdiCombineTransform(a0,(CONST PXFORM)a1,(CONST PXFORM)a2); + return NtGdiCombineTransform(lpxformResult, (CONST PXFORM)lpxform1, (CONST PXFORM)lpxform2); } /* @@ -809,12 +802,12 @@ UINT STDCALL SetDIBColorTable( HDC hdc, - UINT a1, - UINT a2, - CONST RGBQUAD *a3 + UINT uStartIndex, + UINT cEntries, + CONST RGBQUAD *pColors ) { - return NtGdiSetDIBColorTable(hdc,a1,a2,(RGBQUAD*)a3); + return NtGdiSetDIBColorTable(hdc, uStartIndex, cEntries, (RGBQUAD*)pColors); } /* @@ -826,7 +819,7 @@ CreateHalftonePalette( HDC hdc ) { - return NtGdiCreateHalftonePalette(hdc); + return NtGdiCreateHalftonePalette(hdc); } /* @@ -835,13 +828,13 @@ CreateHalftonePalette( BOOL STDCALL SetViewportExtEx( - HDC a0, - int a1, - int a2, - LPSIZE a3 + HDC hdc, + int nXExtent, + int nYExtent, + LPSIZE lpSize ) { - return NtGdiSetViewportExtEx(a0,a1,a2,a3); + return NtGdiSetViewportExtEx(hdc, nXExtent, nYExtent, lpSize); } /* @@ -850,13 +843,13 @@ SetViewportExtEx( BOOL STDCALL SetWindowExtEx( - HDC a0, - int a1, - int a2, - LPSIZE a3 + HDC hdc, + int nXExtent, + int nYExtent, + LPSIZE lpSize ) { - return NtGdiSetWindowExtEx(a0,a1,a2,a3); + return NtGdiSetWindowExtEx(hdc, nXExtent, nYExtent, lpSize); } /* @@ -865,13 +858,13 @@ SetWindowExtEx( BOOL STDCALL OffsetWindowOrgEx( - HDC a0, - int a1, - int a2, - LPPOINT a3 + HDC hdc, + int nXOffset, + int nYOffset, + LPPOINT lpPoint ) { - return NtGdiOffsetWindowOrgEx(a0,a1,a2,a3); + return NtGdiOffsetWindowOrgEx(hdc, nXOffset, nYOffset, lpPoint); } /* @@ -880,13 +873,13 @@ OffsetWindowOrgEx( BOOL STDCALL SetBitmapDimensionEx( - HBITMAP a0, - int a1, - int a2, - LPSIZE a3 + HBITMAP hBitmap, + int nWidth, + int nHeight, + LPSIZE lpSize ) { - return NtGdiSetBitmapDimensionEx(a0,a1,a2,a3); + return NtGdiSetBitmapDimensionEx(hBitmap, nWidth, nHeight, lpSize); } /* @@ -895,11 +888,11 @@ SetBitmapDimensionEx( BOOL STDCALL GetDCOrgEx( - HDC a0, - LPPOINT a1 + HDC hdc, + LPPOINT lpPoint ) { - return NtGdiGetDCOrgEx(a0,a1); + return NtGdiGetDCOrgEx(hdc, lpPoint); } /* @@ -908,14 +901,14 @@ GetDCOrgEx( LONG STDCALL GetDCOrg( - HDC a0 + HDC hdc ) { - // Officially obsolete by Microsoft - POINT Pt; - if (!NtGdiGetDCOrgEx(a0,&Pt)) - return 0; - return(MAKELONG(Pt.x, Pt.y)); + // Officially obsolete by Microsoft + POINT Pt; + if (!NtGdiGetDCOrgEx(hdc, &Pt)) + return 0; + return(MAKELONG(Pt.x, Pt.y)); } /* @@ -924,11 +917,11 @@ GetDCOrg( BOOL STDCALL RectVisible( - HDC a0, - CONST RECT *a1 + HDC hdc, + CONST RECT *lprc ) { - return NtGdiRectVisible(a0,(RECT *)a1); + return NtGdiRectVisible(hdc, (RECT *)lprc); } /* @@ -937,15 +930,15 @@ RectVisible( int STDCALL ExtEscape( - HDC a0, - int a1, - int a2, - LPCSTR a3, - int a4, - LPSTR a5 + HDC hdc, + int nEscape, + int cbInput, + LPCSTR lpszInData, + int cbOutput, + LPSTR lpszOutData ) { - return NtGdiExtEscape(a0, a1, a2, a3, a4, a5); + return NtGdiExtEscape(hdc, nEscape, cbInput, lpszInData, cbOutput, lpszOutData); } @@ -999,3 +992,41 @@ GetObjectW(HGDIOBJ Handle, int Size, LPVOID Buffer) { return NtGdiGetObject(Handle, Size, Buffer); } + + +/* + * @implemented + */ +BOOL +STDCALL +SetBrushOrgEx( + HDC hdc, + int nXOrg, + int nYOrg, + LPPOINT lppt + ) +{ + return NtGdiSetBrushOrgEx(hdc, nXOrg, nYOrg, lppt); +} + + +/* + * @implemented + */ +BOOL +STDCALL +FixBrushOrgEx( + HDC hdc, + int nXOrg, + int nYOrg, + LPPOINT lppt + ) +{ + #if 0 + /* FIXME - Check if we're emulating win95, if so, forward to SetBrushOrgEx() */ + return SetBrushOrgEx(hdc, nXOrg, nYOrg, lppt); + #endif + + return FALSE; +} + diff --git a/reactos/lib/gdi32/objects/fillshap.c b/reactos/lib/gdi32/objects/fillshap.c index b74019055e1..5b7e81143f3 100644 --- a/reactos/lib/gdi32/objects/fillshap.c +++ b/reactos/lib/gdi32/objects/fillshap.c @@ -12,11 +12,11 @@ */ BOOL STDCALL -Polygon(HDC hDC, +Polygon(HDC hdc, CONST POINT *lpPoints, int nCount) { - return NtGdiPolygon(hDC, (CONST PPOINT)lpPoints, nCount); + return NtGdiPolygon(hdc, (CONST PPOINT)lpPoints, nCount); } @@ -25,13 +25,13 @@ Polygon(HDC hDC, */ BOOL STDCALL -Rectangle(HDC hDC, - int LeftRect, - int TopRect, - int RightRect, - int BottomRect) +Rectangle(HDC hdc, + int nLeftRect, + int nTopRect, + int nRightRect, + int nBottomRect) { - return NtGdiRectangle(hDC, LeftRect, TopRect, RightRect, BottomRect); + return NtGdiRectangle(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect); } /* @@ -41,15 +41,15 @@ BOOL STDCALL RoundRect( HDC hdc, - int left, - int top, - int right, - int bottom, - int width, - int height + int nLeftRect, + int nTopRect, + int nRightRect, + int nBottomRect, + int nWidth, + int nHeight ) { - return NtGdiRoundRect ( hdc, left, top, right, bottom, width, height ); + return NtGdiRoundRect(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect, nWidth, nHeight); } /* @@ -58,13 +58,13 @@ RoundRect( BOOL STDCALL PolyPolygon( - HDC a0, - CONST POINT *a1, - CONST INT *a2, - int a3 + HDC hdc, + CONST POINT *lpPoints, + CONST INT *lpPolyCounts, + int nCount ) { - return PolyPolygon(a0,(LPPOINT)a1,(LPINT)a2,a3); + return PolyPolygon(hdc, (LPPOINT)lpPoints, (LPINT)lpPolyCounts, nCount); } @@ -73,13 +73,13 @@ PolyPolygon( */ BOOL STDCALL -Ellipse(HDC hDc, - int Left, - int Top, - int Right, - int Bottom) +Ellipse(HDC hdc, + int nLeftRect, + int nTopRect, + int nRightRect, + int nBottomRect) { - return NtGdiEllipse(hDc, Left, Top, Right, Bottom); + return NtGdiEllipse(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect); } @@ -88,18 +88,18 @@ Ellipse(HDC hDc, */ BOOL STDCALL -Pie(HDC hDc, - int Left, - int Top, - int Right, - int Bottom, - int XRadialStart, - int YRadialStart, - int XRadialEnd, - int YRadialEnd) +Pie(HDC hdc, + int nLeftRect, + int nTopRect, + int nRightRect, + int nBottomRect, + int nXRadial1, + int nYRadial1, + int nXRadial2, + int nYRadial2) { - return NtGdiPie(hDc, Left, Top, Right, Bottom, XRadialStart, YRadialStart, - XRadialEnd, YRadialEnd); + return NtGdiPie(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect, nXRadial1, nYRadial1, + nXRadial2, nYRadial2); } BOOL STDCALL @@ -111,7 +111,7 @@ ExtFloodFill( UINT fuFillType // fill type ) { - return NtGdiExtFloodFill( hdc, nXStart, nYStart, crColor, fuFillType ); + return NtGdiExtFloodFill(hdc, nXStart, nYStart, crColor, fuFillType); } /* @@ -125,7 +125,7 @@ FloodFill( COLORREF crFill // fill color ) { - return NtGdiFloodFill(hdc,nXStart, nYStart, crFill ); + return NtGdiFloodFill(hdc, nXStart, nYStart, crFill); } /* @@ -135,12 +135,12 @@ BOOL STDCALL GdiGradientFill( HDC hdc, PTRIVERTEX pVertex, - ULONG uVertex, + ULONG dwNumVertex, PVOID pMesh, - ULONG uMesh, - ULONG ulMode + ULONG dwNumMesh, + ULONG dwMode ) { - return NtGdiGradientFill(hdc, pVertex, uVertex, pMesh, uMesh, ulMode); + return NtGdiGradientFill(hdc, pVertex, dwNumVertex, pMesh, dwNumMesh, dwMode); } diff --git a/reactos/lib/gdi32/objects/font.c b/reactos/lib/gdi32/objects/font.c index 7bc110e9821..02bdaf615e6 100644 --- a/reactos/lib/gdi32/objects/font.c +++ b/reactos/lib/gdi32/objects/font.c @@ -1,4 +1,4 @@ -/* $Id: font.c,v 1.3 2004/04/09 20:03:13 navaraf Exp $ +/* $Id: font.c,v 1.4 2004/04/25 14:46:54 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -194,9 +194,9 @@ NewTextMetricExW2A(NEWTEXTMETRICEXA *tma, NEWTEXTMETRICEXW *tmw) */ BOOL STDCALL -TranslateCharsetInfo(DWORD *Src, LPCHARSETINFO Cs, DWORD Flags) +TranslateCharsetInfo(DWORD *pSrc, LPCHARSETINFO lpCs, DWORD dwFlags) { - return NtGdiTranslateCharsetInfo(Src, Cs, Flags); + return NtGdiTranslateCharsetInfo(pSrc, lpCs, dwFlags); } static int FASTCALL @@ -277,10 +277,10 @@ IntEnumFontFamilies(HDC Dc, LPLOGFONTW LogFont, PVOID EnumProc, LPARAM lParam, * @implemented */ int STDCALL -EnumFontFamiliesExW(HDC Dc, LPLOGFONTW LogFont, FONTENUMPROCW EnumFontFamProc, - LPARAM lParam, DWORD Flags) +EnumFontFamiliesExW(HDC hdc, LPLOGFONTW lpLogfont, FONTENUMPROCW lpEnumFontFamExProc, + LPARAM lParam, DWORD dwFlags) { - return IntEnumFontFamilies(Dc, LogFont, EnumFontFamProc, lParam, TRUE); + return IntEnumFontFamilies(hdc, lpLogfont, lpEnumFontFamExProc, lParam, TRUE); } @@ -288,19 +288,19 @@ EnumFontFamiliesExW(HDC Dc, LPLOGFONTW LogFont, FONTENUMPROCW EnumFontFamProc, * @implemented */ int STDCALL -EnumFontFamiliesW(HDC Dc, LPCWSTR Family, FONTENUMPROCW EnumFontFamProc, +EnumFontFamiliesW(HDC hdc, LPCWSTR lpszFamily, FONTENUMPROCW lpEnumFontFamProc, LPARAM lParam) { LOGFONTW LogFont; ZeroMemory(&LogFont, sizeof(LOGFONTW)); LogFont.lfCharSet = DEFAULT_CHARSET; - if (NULL != Family) + if (NULL != lpszFamily) { - lstrcpynW(LogFont.lfFaceName, Family, LF_FACESIZE); + lstrcpynW(LogFont.lfFaceName, lpszFamily, LF_FACESIZE); } - return IntEnumFontFamilies(Dc, &LogFont, EnumFontFamProc, lParam, TRUE); + return IntEnumFontFamilies(hdc, &LogFont, lpEnumFontFamProc, lParam, TRUE); } @@ -308,15 +308,15 @@ EnumFontFamiliesW(HDC Dc, LPCWSTR Family, FONTENUMPROCW EnumFontFamProc, * @implemented */ int STDCALL -EnumFontFamiliesExA (HDC Dc, LPLOGFONTA LogFont, FONTENUMPROCA EnumFontFamProc, +EnumFontFamiliesExA (HDC hdc, LPLOGFONTA lpLogfont, FONTENUMPROCA lpEnumFontFamExProc, LPARAM lParam, DWORD dwFlags) { LOGFONTW LogFontW; - RosRtlLogFontA2W(&LogFontW, LogFont); + RosRtlLogFontA2W(&LogFontW, lpLogfont); /* no need to convert LogFontW back to lpLogFont b/c it's an [in] parameter only */ - return IntEnumFontFamilies(Dc, &LogFontW, EnumFontFamProc, lParam, FALSE); + return IntEnumFontFamilies(hdc, &LogFontW, lpEnumFontFamExProc, lParam, FALSE); } @@ -324,19 +324,19 @@ EnumFontFamiliesExA (HDC Dc, LPLOGFONTA LogFont, FONTENUMPROCA EnumFontFamProc, * @implemented */ int STDCALL -EnumFontFamiliesA(HDC Dc, LPCSTR Family, FONTENUMPROCA EnumFontFamProc, +EnumFontFamiliesA(HDC hdc, LPCSTR lpszFamily, FONTENUMPROCA lpEnumFontFamProc, LPARAM lParam) { LOGFONTW LogFont; ZeroMemory(&LogFont, sizeof(LOGFONTW)); LogFont.lfCharSet = DEFAULT_CHARSET; - if (NULL != Family) + if (NULL != lpszFamily) { - MultiByteToWideChar(CP_THREAD_ACP, 0, Family, -1, LogFont.lfFaceName, LF_FACESIZE); + MultiByteToWideChar(CP_THREAD_ACP, 0, lpszFamily, -1, LogFont.lfFaceName, LF_FACESIZE); } - return IntEnumFontFamilies(Dc, &LogFont, EnumFontFamProc, lParam, FALSE); + return IntEnumFontFamilies(hdc, &LogFont, lpEnumFontFamProc, lParam, FALSE); } diff --git a/reactos/lib/gdi32/objects/line.c b/reactos/lib/gdi32/objects/line.c index 09853ef1c20..015d913d7a5 100644 --- a/reactos/lib/gdi32/objects/line.c +++ b/reactos/lib/gdi32/objects/line.c @@ -14,18 +14,19 @@ BOOL STDCALL Arc( - HDC a0, - int a1, - int a2, - int a3, - int a4, - int a5, - int a6, - int a7, - int a8 + HDC hdc, + int nLeftRect, + int nTopRect, + int nRightRect, + int nBottomRect, + int nXStartArc, + int nYStartArc, + int nXEndArc, + int nYEndArc ) { - return NtGdiArc(a0,a1,a2,a3,a4,a5,a6,a7,a8); + return NtGdiArc(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect, + nXStartArc, nYStartArc, nXEndArc, nYEndArc); } /* @@ -35,10 +36,10 @@ int STDCALL SetArcDirection( HDC hdc, - int a1 + int ArcDirection ) { - return NtGdiSetArcDirection(hdc, a1); + return NtGdiSetArcDirection(hdc, ArcDirection); } @@ -51,7 +52,7 @@ GetArcDirection( HDC hdc ) { - return NtGdiGetArcDirection(hdc); + return NtGdiGetArcDirection(hdc); } @@ -60,9 +61,9 @@ GetArcDirection( */ BOOL STDCALL -LineTo(HDC hDC, int XEnd, int YEnd) +LineTo(HDC hdc, int nXEnd, int nYEnd) { - return NtGdiLineTo(hDC, XEnd, YEnd); + return NtGdiLineTo(hdc, nXEnd, nYEnd); } @@ -71,9 +72,9 @@ LineTo(HDC hDC, int XEnd, int YEnd) */ BOOL STDCALL -MoveToEx(HDC hDC, int X, int Y, LPPOINT Point) +MoveToEx(HDC hdc, int X, int Y, LPPOINT lpPoint) { - return NtGdiMoveToEx(hDC, X, Y, Point); + return NtGdiMoveToEx(hdc, X, Y, lpPoint); } @@ -84,7 +85,7 @@ BOOL STDCALL Polyline( HDC hdc, CONST POINT *lppt, int cPoints ) { - return NtGdiPolyline(hdc, (CONST LPPOINT) lppt, cPoints); + return NtGdiPolyline(hdc, (CONST LPPOINT) lppt, cPoints); } /* @@ -94,17 +95,18 @@ BOOL STDCALL ArcTo( HDC hdc, - int a1, - int a2, - int a3, - int a4, - int a5, - int a6, - int a7, - int a8 + int nLeftRect, + int nTopRect, + int nRightRect, + int nBottomRect, + int nXRadial1, + int nYRadial1, + int nXRadial2, + int nYRadial2 ) { - return NtGdiArcTo(hdc,a1,a2,a3,a4,a5,a6,a7,a8); + return NtGdiArcTo(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect, + nXRadial1, nYRadial1, nXRadial2, nYRadial2); } @@ -114,12 +116,12 @@ ArcTo( BOOL STDCALL PolyBezier( - HDC a0, - CONST POINT *a1, - DWORD a2 + HDC hdc, + CONST POINT *lppt, + DWORD cPoints ) { - return NtGdiPolyBezier(a0,(CONST PPOINT)a1,a2); + return NtGdiPolyBezier(hdc, (CONST PPOINT)lppt, cPoints); } /* @@ -128,12 +130,12 @@ PolyBezier( BOOL STDCALL PolyBezierTo( - HDC a0, - CONST POINT *a1, - DWORD a2 + HDC hdc, + CONST POINT *lppt, + DWORD cCount ) { - return NtGdiPolyBezierTo(a0,(CONST PPOINT)a1,a2); + return NtGdiPolyBezierTo(hdc, (CONST PPOINT)lppt, cCount); } @@ -143,12 +145,12 @@ PolyBezierTo( BOOL STDCALL PolylineTo( - HDC a0, - CONST POINT *a1, - DWORD a2 + HDC hdc, + CONST POINT *lppt, + DWORD cCount ) { - return NtGdiPolylineTo(a0,(CONST PPOINT)a1,a2); + return NtGdiPolylineTo(hdc, (CONST PPOINT)lppt, cCount); } /* @@ -158,10 +160,10 @@ BOOL STDCALL PolyPolyline( HDC hdc, - CONST POINT *a1, - CONST DWORD *a2, - DWORD a3 + CONST POINT *lppt, + CONST DWORD *lpdwPolyPoints, + DWORD cCount ) { - return NtGdiPolyPolyline(hdc,(LPPOINT)a1,(LPDWORD)a2,a3); + return NtGdiPolyPolyline(hdc, (LPPOINT)lppt, (LPDWORD)lpdwPolyPoints, cCount); } diff --git a/reactos/lib/gdi32/objects/linedda.c b/reactos/lib/gdi32/objects/linedda.c index d0cc5237264..005cf23b30e 100644 --- a/reactos/lib/gdi32/objects/linedda.c +++ b/reactos/lib/gdi32/objects/linedda.c @@ -37,7 +37,7 @@ * @implemented */ BOOL STDCALL LineDDA(INT nXStart, INT nYStart, INT nXEnd, INT nYEnd, - LINEDDAPROC callback, LPARAM lParam ) + LINEDDAPROC lpLineFunc, LPARAM lpData ) { INT xadd = 1, yadd = 1; INT err,erradd; @@ -54,7 +54,7 @@ BOOL STDCALL LineDDA(INT nXStart, INT nYStart, INT nXEnd, INT nYEnd, if (dx > dy) { /* line is "more horizontal" */ err = 2*dy - dx; erradd = 2*dy - 2*dx; for(cnt = 0;cnt <= dx; cnt++) { - callback(nXStart,nYStart,lParam); + lpLineFunc(nXStart,nYStart,lpData); if (err > 0) { nYStart += yadd; err += erradd; @@ -66,7 +66,7 @@ BOOL STDCALL LineDDA(INT nXStart, INT nYStart, INT nXEnd, INT nYEnd, } else { /* line is "more vertical" */ err = 2*dx - dy; erradd = 2*dx - 2*dy; for(cnt = 0;cnt <= dy; cnt++) { - callback(nXStart,nYStart,lParam); + lpLineFunc(nXStart,nYStart,lpData); if (err > 0) { nXStart += xadd; err += erradd; diff --git a/reactos/lib/gdi32/objects/metafile.c b/reactos/lib/gdi32/objects/metafile.c index 192bab1af46..bd641d98ef4 100644 --- a/reactos/lib/gdi32/objects/metafile.c +++ b/reactos/lib/gdi32/objects/metafile.c @@ -19,11 +19,11 @@ HMETAFILE STDCALL CopyMetaFileW( - HMETAFILE Src, - LPCWSTR File + HMETAFILE hmfSrc, + LPCWSTR lpszFile ) { - return NtGdiCopyMetaFile ( Src, File ); + return NtGdiCopyMetaFile (hmfSrc, lpszFile); } @@ -33,7 +33,7 @@ CopyMetaFileW( HMETAFILE STDCALL CopyMetaFileA( - HMETAFILE Src, + HMETAFILE hmfSrc, LPCSTR lpszFile ) { @@ -46,7 +46,7 @@ CopyMetaFileA( SetLastError (RtlNtStatusToDosError(Status)); else { - rc = NtGdiCopyMetaFile ( Src, lpszFileW ); + rc = NtGdiCopyMetaFile ( hmfSrc, lpszFileW ); HEAP_free ( lpszFileW ); } @@ -64,7 +64,7 @@ CreateMetaFileW( LPCWSTR lpszFile ) { - return NtGdiCreateMetaFile ( lpszFile ); + return NtGdiCreateMetaFile ( lpszFile ); } @@ -181,13 +181,13 @@ CopyEnhMetaFileA( HDC STDCALL CreateEnhMetaFileW( - HDC hdc, + HDC hdcRef, LPCWSTR lpFileName, CONST RECT *lpRect, LPCWSTR lpDescription ) { - return NtGdiCreateEnhMetaFile ( hdc, lpFileName, (CONST LPRECT)lpRect, lpDescription ); + return NtGdiCreateEnhMetaFile ( hdcRef, lpFileName, (CONST LPRECT)lpRect, lpDescription ); } @@ -197,7 +197,7 @@ CreateEnhMetaFileW( HDC STDCALL CreateEnhMetaFileA( - HDC hdc, + HDC hdcRef, LPCSTR lpFileName, CONST RECT *lpRect, LPCSTR lpDescription @@ -218,7 +218,7 @@ CreateEnhMetaFileA( else { rc = NtGdiCreateEnhMetaFile ( - hdc, lpFileNameW, (CONST LPRECT)lpRect, lpDescriptionW ); + hdcRef, lpFileNameW, (CONST LPRECT)lpRect, lpDescriptionW ); HEAP_free ( lpDescriptionW ); } diff --git a/reactos/lib/gdi32/objects/pen.c b/reactos/lib/gdi32/objects/pen.c index 8534a4d9a15..90854ac80a8 100644 --- a/reactos/lib/gdi32/objects/pen.c +++ b/reactos/lib/gdi32/objects/pen.c @@ -13,9 +13,9 @@ */ HPEN STDCALL -CreatePen(INT PenStyle, INT Width, COLORREF Color) +CreatePen(INT fnPenStyle, INT nWidth, COLORREF crColor) { - return NtGdiCreatePen(PenStyle, Width, Color); + return NtGdiCreatePen(fnPenStyle, nWidth, crColor); } @@ -24,7 +24,7 @@ CreatePen(INT PenStyle, INT Width, COLORREF Color) */ HPEN STDCALL -CreatePenIndirect(CONST LOGPEN *lgpn) +CreatePenIndirect(CONST LOGPEN *lplgpn) { - return NtGdiCreatePenIndirect((CONST PLOGPEN)lgpn); + return NtGdiCreatePenIndirect((CONST PLOGPEN)lplgpn); } diff --git a/reactos/lib/gdi32/objects/region.c b/reactos/lib/gdi32/objects/region.c index e9ad971f3ec..352e43d3b47 100644 --- a/reactos/lib/gdi32/objects/region.c +++ b/reactos/lib/gdi32/objects/region.c @@ -14,12 +14,12 @@ int STDCALL OffsetClipRgn( - HDC a0, - int a1, - int a2 + HDC hdc, + int nXOffset, + int nYOffset ) { - return NtGdiOffsetClipRgn(a0, a1, a2); + return NtGdiOffsetClipRgn(hdc, nXOffset, nYOffset); } @@ -29,14 +29,14 @@ OffsetClipRgn( int STDCALL GetClipRgn( - HDC a0, - HRGN a1 + HDC hdc, + HRGN hrgn ) { - HRGN rgn = NtGdiGetClipRgn(a0); + HRGN rgn = NtGdiGetClipRgn(hdc); if(rgn) { - if(NtGdiCombineRgn(a1, rgn, 0, RGN_COPY) != ERROR) return 1; + if(NtGdiCombineRgn(hrgn, rgn, 0, RGN_COPY) != ERROR) return 1; else return -1; } @@ -45,31 +45,31 @@ GetClipRgn( /* - * @unimplemented + * @implemented */ HRGN STDCALL CreateEllipticRgn( - int a0, - int a1, - int a2, - int a3 + int nLeftRect, + int nTopRect, + int nRightRect, + int nBottomRect ) { - return NtGdiCreateEllipticRgn(a0,a1,a2,a3); + return NtGdiCreateEllipticRgn(nLeftRect, nTopRect, nRightRect, nBottomRect); } /* - * @unimplemented + * @implemented */ HRGN STDCALL CreateEllipticRgnIndirect( - CONST RECT *a0 + CONST RECT *lprc ) { - return NtGdiCreateEllipticRgnIndirect((RECT *)a0); + return NtGdiCreateEllipticRgnIndirect((RECT *)lprc); } @@ -90,32 +90,19 @@ CreatePolyPolygonRgn( } -/* - * @implemented - */ -HBRUSH -STDCALL -CreatePatternBrush( - HBITMAP hbmp - ) -{ - return NtGdiCreatePatternBrush ( hbmp ); -} - - /* * @implemented */ HRGN STDCALL CreateRectRgn( - int a0, - int a1, - int a2, - int a3 + int nLeftRect, + int nTopRect, + int nRightRect, + int nBottomRect ) { - return NtGdiCreateRectRgn(a0,a1,a2,a3); + return NtGdiCreateRectRgn(nLeftRect, nTopRect, nRightRect, nBottomRect); } @@ -125,10 +112,10 @@ CreateRectRgn( HRGN STDCALL CreateRectRgnIndirect( - CONST RECT *a0 + CONST RECT *lprc ) { - return NtGdiCreateRectRgnIndirect((RECT *)a0); + return NtGdiCreateRectRgnIndirect((RECT *)lprc); } @@ -146,8 +133,8 @@ CreateRoundRectRgn( int nHeightEllipse ) { - return NtGdiCreateRoundRectRgn ( - nLeftRect, nTopRect, nRightRect, nBottomRect, nWidthEllipse, nHeightEllipse ); + return NtGdiCreateRoundRectRgn(nLeftRect, nTopRect, nRightRect, nBottomRect, + nWidthEllipse, nHeightEllipse); } @@ -157,11 +144,11 @@ CreateRoundRectRgn( BOOL STDCALL EqualRgn( - HRGN a0, - HRGN a1 + HRGN hSrcRgn1, + HRGN hSrcRgn2 ) { - return NtGdiEqualRgn(a0,a1); + return NtGdiEqualRgn(hSrcRgn1, hSrcRgn2); } @@ -171,12 +158,12 @@ EqualRgn( int STDCALL OffsetRgn( - HRGN a0, - int a1, - int a2 + HRGN hrgn, + int nXOffset, + int nYOffset ) { - return NtGdiOffsetRgn(a0,a1,a2); + return NtGdiOffsetRgn(hrgn, nXOffset, nYOffset); } @@ -186,11 +173,11 @@ OffsetRgn( int STDCALL GetRgnBox( - HRGN a0, - LPRECT a1 + HRGN hrgn, + LPRECT lprc ) { - return NtGdiGetRgnBox(a0,a1); + return NtGdiGetRgnBox(hrgn, lprc); } @@ -200,14 +187,14 @@ GetRgnBox( BOOL STDCALL SetRectRgn( - HRGN a0, - int a1, - int a2, - int a3, - int a4 + HRGN hrgn, + int nLeftRect, + int nTopRect, + int nRightRect, + int nBottomRect ) { - return NtGdiSetRectRgn(a0,a1,a2,a3,a4); + return NtGdiSetRectRgn(hrgn, nLeftRect, nTopRect, nRightRect, nBottomRect); } @@ -217,13 +204,13 @@ SetRectRgn( int STDCALL CombineRgn( - HRGN a0, - HRGN a1, - HRGN a2, - int a3 + HRGN hrgnDest, + HRGN hrgnSrc1, + HRGN hrgnSrc2, + int fnCombineMode ) { - return NtGdiCombineRgn(a0,a1,a2,a3); + return NtGdiCombineRgn(hrgnDest, hrgnSrc1, hrgnSrc2, fnCombineMode); } @@ -233,12 +220,12 @@ CombineRgn( DWORD STDCALL GetRegionData( - HRGN a0, - DWORD a1, - LPRGNDATA a2 + HRGN hRgn, + DWORD dwCount, + LPRGNDATA lpRgnData ) { - return NtGdiGetRegionData(a0,a1,a2); + return NtGdiGetRegionData(hRgn, dwCount, lpRgnData); } @@ -248,11 +235,11 @@ GetRegionData( BOOL STDCALL PaintRgn( - HDC a0, - HRGN a1 + HDC hdc, + HRGN hrgn ) { - return NtGdiPaintRgn( a0, a1 ); + return NtGdiPaintRgn(hdc, hrgn); } @@ -262,12 +249,12 @@ PaintRgn( BOOL STDCALL FillRgn( - HDC a0, - HRGN a1, - HBRUSH a2 + HDC hdc, + HRGN hrgn, + HBRUSH hbr ) { - return NtGdiFillRgn(a0, a1, a2); + return NtGdiFillRgn(hdc, hrgn, hbr); } /* @@ -276,12 +263,12 @@ FillRgn( BOOL STDCALL PtInRegion( - HRGN a0, - int a1, - int a2 + HRGN hrgn, + int X, + int Y ) { - return NtGdiPtInRegion(a0,a1,a2); + return NtGdiPtInRegion(hrgn, X, Y); } /* @@ -290,11 +277,11 @@ PtInRegion( BOOL STDCALL RectInRegion( - HRGN a0, - CONST RECT *a1 + HRGN hrgn, + CONST RECT *lprc ) { - return NtGdiRectInRegion(a0,(CONST PRECT)a1); + return NtGdiRectInRegion(hrgn, (CONST PRECT)lprc); } /* @@ -303,11 +290,11 @@ RectInRegion( BOOL STDCALL InvertRgn( - HDC hDc, - HRGN hRgn + HDC hdc, + HRGN hrgn ) { - return NtGdiInvertRgn(hDc, hRgn); + return NtGdiInvertRgn(hdc, hrgn); } /* @@ -323,5 +310,5 @@ FrameRgn( int nHeight ) { - return NtGdiFrameRgn(hdc, hrgn, hbr, nWidth, nHeight); + return NtGdiFrameRgn(hdc, hrgn, hbr, nWidth, nHeight); } diff --git a/reactos/lib/gdi32/objects/text.c b/reactos/lib/gdi32/objects/text.c index f3e393255af..dc21a606310 100644 --- a/reactos/lib/gdi32/objects/text.c +++ b/reactos/lib/gdi32/objects/text.c @@ -17,11 +17,11 @@ UINT STDCALL SetTextAlign( - HDC a0, - UINT a1 + HDC hdc, + UINT fMode ) { - return NtGdiSetTextAlign(a0, a1); + return NtGdiSetTextAlign(hdc, fMode); } @@ -31,24 +31,24 @@ SetTextAlign( BOOL STDCALL TextOutA( - HDC hDC, - int XStart, - int YStart, - LPCSTR String, - int Count) + HDC hdc, + int nXStart, + int nYStart, + LPCSTR lpString, + int cbString) { ANSI_STRING StringA; UNICODE_STRING StringU; BOOL ret; - if (NULL != String) + if (NULL != lpString) { - RtlInitAnsiString(&StringA, (LPSTR)String); + RtlInitAnsiString(&StringA, (LPSTR)lpString); RtlAnsiStringToUnicodeString(&StringU, &StringA, TRUE); } else StringU.Buffer = NULL; - ret = TextOutW(hDC, XStart, YStart, StringU.Buffer, Count); + ret = TextOutW(hdc, nXStart, nYStart, StringU.Buffer, cbString); RtlFreeUnicodeString(&StringU); return ret; } @@ -60,13 +60,13 @@ TextOutA( BOOL STDCALL TextOutW( - HDC hDC, - int XStart, - int YStart, - LPCWSTR String, - int Count) + HDC hdc, + int nXStart, + int nYStart, + LPCWSTR lpString, + int cbString) { - return NtGdiTextOut(hDC, XStart, YStart, String, Count); + return NtGdiTextOut(hdc, nXStart, nYStart, lpString, cbString); } @@ -74,9 +74,9 @@ TextOutW( * @implemented */ COLORREF STDCALL -SetTextColor(HDC hDC, COLORREF color) +SetTextColor(HDC hdc, COLORREF crColor) { - return(NtGdiSetTextColor(hDC, color)); + return NtGdiSetTextColor(hdc, crColor); } @@ -87,7 +87,7 @@ BOOL STDCALL GetTextMetricsA( HDC hdc, - LPTEXTMETRICA tm + LPTEXTMETRICA lptm ) { TEXTMETRICW tmw; @@ -97,7 +97,7 @@ GetTextMetricsA( return FALSE; } - return TextMetricW2A(tm, &tmw); + return TextMetricW2A(lptm, &tmw); } @@ -108,10 +108,10 @@ BOOL STDCALL GetTextMetricsW( HDC hdc, - LPTEXTMETRICW tm + LPTEXTMETRICW lptm ) { - return NtGdiGetTextMetrics(hdc, tm); + return NtGdiGetTextMetrics(hdc, lptm); } @@ -121,20 +121,20 @@ GetTextMetricsW( BOOL APIENTRY GetTextExtentPointA( - HDC hDC, - LPCSTR String, - int Count, - LPSIZE Size + HDC hdc, + LPCSTR lpString, + int cbString, + LPSIZE lpSize ) { ANSI_STRING StringA; UNICODE_STRING StringU; BOOL ret; - RtlInitAnsiString(&StringA, (LPSTR)String); + RtlInitAnsiString(&StringA, (LPSTR)lpString); RtlAnsiStringToUnicodeString(&StringU, &StringA, TRUE); - ret = GetTextExtentPointW(hDC, StringU.Buffer, Count, Size); + ret = GetTextExtentPointW(hdc, StringU.Buffer, cbString, lpSize); RtlFreeUnicodeString(&StringU); @@ -148,13 +148,13 @@ GetTextExtentPointA( BOOL APIENTRY GetTextExtentPointW( - HDC hDC, - LPCWSTR String, - int Count, - LPSIZE Size + HDC hdc, + LPCWSTR lpString, + int cbString, + LPSIZE lpSize ) { - return NtGdiGetTextExtentPoint(hDC, String, Count, Size); + return NtGdiGetTextExtentPoint(hdc, lpString, cbString, lpSize); } @@ -164,20 +164,20 @@ GetTextExtentPointW( BOOL APIENTRY GetTextExtentPoint32A( - HDC hDC, - LPCSTR String, - int Count, - LPSIZE Size + HDC hdc, + LPCSTR lpString, + int cbString, + LPSIZE lpSize ) { ANSI_STRING StringA; UNICODE_STRING StringU; BOOL ret; - RtlInitAnsiString(&StringA, (LPSTR)String); + RtlInitAnsiString(&StringA, (LPSTR)lpString); RtlAnsiStringToUnicodeString(&StringU, &StringA, TRUE); - ret = GetTextExtentPoint32W(hDC, StringU.Buffer, Count, Size); + ret = GetTextExtentPoint32W(hdc, StringU.Buffer, cbString, lpSize); RtlFreeUnicodeString(&StringU); @@ -191,13 +191,13 @@ GetTextExtentPoint32A( BOOL APIENTRY GetTextExtentPoint32W( - HDC hDC, - LPCWSTR String, - int Count, - LPSIZE Size + HDC hdc, + LPCWSTR lpString, + int cbString, + LPSIZE lpSize ) { - return NtGdiGetTextExtentPoint32(hDC, String, Count, Size); + return NtGdiGetTextExtentPoint32(hdc, lpString, cbString, lpSize); } @@ -207,24 +207,24 @@ GetTextExtentPoint32W( BOOL STDCALL ExtTextOutA( - HDC hDC, + HDC hdc, int X, int Y, - UINT Options, - CONST RECT *Rect, - LPCSTR String, - UINT Count, - CONST INT *Spacings + UINT fuOptions, + CONST RECT *lprc, + LPCSTR lpString, + UINT cbCount, + CONST INT *lpDx ) { ANSI_STRING StringA; UNICODE_STRING StringU; BOOL ret; - RtlInitAnsiString(&StringA, (LPSTR)String); + RtlInitAnsiString(&StringA, (LPSTR)lpString); RtlAnsiStringToUnicodeString(&StringU, &StringA, TRUE); - ret = ExtTextOutW(hDC, X, Y, Options, Rect, StringU.Buffer, Count, Spacings); + ret = ExtTextOutW(hdc, X, Y, fuOptions, lprc, StringU.Buffer, cbCount, lpDx); RtlFreeUnicodeString(&StringU); @@ -242,13 +242,13 @@ ExtTextOutW( int X, int Y, UINT fuOptions, - CONST RECT *lpRect, + CONST RECT *lprc, LPCWSTR lpString, UINT cbCount, CONST INT *lpDx ) { - return NtGdiExtTextOut(hdc, X, Y, fuOptions, lpRect, lpString, cbCount, lpDx); + return NtGdiExtTextOut(hdc, X, Y, fuOptions, lprc, lpString, cbCount, lpDx); } @@ -258,12 +258,12 @@ ExtTextOutW( HFONT STDCALL CreateFontIndirectA( - CONST LOGFONTA *lf + CONST LOGFONTA *lplf ) { LOGFONTW tlf; - RosRtlLogFontA2W(&tlf, lf); + RosRtlLogFontA2W(&tlf, lplf); return NtGdiCreateFontIndirect(&tlf); } @@ -275,10 +275,10 @@ CreateFontIndirectA( HFONT STDCALL CreateFontIndirectW( - CONST LOGFONTW *lf + CONST LOGFONTW *lplf ) { - return NtGdiCreateFontIndirect((CONST LPLOGFONTW)lf); + return NtGdiCreateFontIndirect((CONST LPLOGFONTW)lplf); } @@ -288,31 +288,31 @@ CreateFontIndirectW( HFONT STDCALL CreateFontA( - int Height, - int Width, - int Escapement, - int Orientation, - int Weight, - DWORD Italic, - DWORD Underline, - DWORD StrikeOut, - DWORD CharSet, - DWORD OutputPrecision, - DWORD ClipPrecision, - DWORD Quality, - DWORD PitchAndFamily, - LPCSTR Face + int nHeight, + int nWidth, + int nEscapement, + int nOrientation, + int fnWeight, + DWORD fdwItalic, + DWORD fdwUnderline, + DWORD fdwStrikeOut, + DWORD fdwCharSet, + DWORD fdwOutputPrecision, + DWORD fdwClipPrecision, + DWORD fdwQuality, + DWORD fdwPitchAndFamily, + LPCSTR lpszFace ) { ANSI_STRING StringA; UNICODE_STRING StringU; HFONT ret; - RtlInitAnsiString(&StringA, (LPSTR)Face); + RtlInitAnsiString(&StringA, (LPSTR)lpszFace); RtlAnsiStringToUnicodeString(&StringU, &StringA, TRUE); - ret = CreateFontW(Height, Width, Escapement, Orientation, Weight, Italic, Underline, StrikeOut, - CharSet, OutputPrecision, ClipPrecision, Quality, PitchAndFamily, StringU.Buffer); + ret = CreateFontW(nHeight, nWidth, nEscapement, nOrientation, fnWeight, fdwItalic, fdwUnderline, fdwStrikeOut, + fdwCharSet, fdwOutputPrecision, fdwClipPrecision, fdwQuality, fdwPitchAndFamily, StringU.Buffer); RtlFreeUnicodeString(&StringU); @@ -326,23 +326,23 @@ CreateFontA( HFONT STDCALL CreateFontW( - int Height, - int Width, - int Escapement, - int Orientation, - int Weight, - DWORD Italic, - DWORD Underline, - DWORD StrikeOut, - DWORD CharSet, - DWORD OutputPrecision, - DWORD ClipPrecision, - DWORD Quality, - DWORD PitchAndFamily, - LPCWSTR Face + int nHeight, + int nWidth, + int nEscapement, + int nOrientation, + int nWeight, + DWORD fnItalic, + DWORD fdwUnderline, + DWORD fdwStrikeOut, + DWORD fdwCharSet, + DWORD fdwOutputPrecision, + DWORD fdwClipPrecision, + DWORD fdwQuality, + DWORD fdwPitchAndFamily, + LPCWSTR lpszFace ) { - return NtGdiCreateFont(Height, Width, Escapement, Orientation, Weight, Italic, Underline, StrikeOut, - CharSet, OutputPrecision, ClipPrecision, Quality, PitchAndFamily, Face); + return NtGdiCreateFont(nHeight, nWidth, nEscapement, nOrientation, nWeight, fnItalic, fdwUnderline, fdwStrikeOut, + fdwCharSet, fdwOutputPrecision, fdwClipPrecision, fdwQuality, fdwPitchAndFamily, lpszFace); } diff --git a/reactos/subsys/win32k/objects/brush.c b/reactos/subsys/win32k/objects/brush.c index 6f87c62ea72..32934a77929 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.35 2004/04/25 11:34:13 weiden Exp $ + * $Id: brush.c,v 1.36 2004/04/25 14:46:54 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -336,10 +336,17 @@ NtGdiSetBrushOrgEx(HDC hDC, INT XOrg, INT YOrg, LPPOINT Point) if (Point != NULL) { + NTSTATUS Status; POINT SafePoint; SafePoint.x = dc->w.brushOrgX; SafePoint.y = dc->w.brushOrgY; - MmCopyToCaller(Point, &SafePoint, sizeof(POINT)); + Status = MmCopyToCaller(Point, &SafePoint, sizeof(POINT)); + if(!NT_SUCCESS(Status)) + { + DC_UnlockDc(hDC); + SetLastNtError(Status); + return FALSE; + } } dc->w.brushOrgX = XOrg; From eb9b7d6f5d9c05215a2678ca7bc82da62a5b5ee4 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sun, 25 Apr 2004 15:31:43 +0000 Subject: [PATCH 0953/1463] implemented GetCurrentObject() svn path=/trunk/; revision=9217 --- reactos/include/defines.h | 13 +++++---- reactos/lib/gdi32/misc/stubs.c | 17 +----------- reactos/lib/gdi32/objects/dc.c | 13 +++++++++ reactos/subsys/win32k/objects/dc.c | 44 ++++++++++++++++++++++++++++-- 4 files changed, 63 insertions(+), 24 deletions(-) diff --git a/reactos/include/defines.h b/reactos/include/defines.h index e71c52138cd..3c6b00db51a 100644 --- a/reactos/include/defines.h +++ b/reactos/include/defines.h @@ -1092,19 +1092,20 @@ extern "C" { #define TRUETYPE_FONTTYPE (4) /* EnumObjects, GetCurrentObject, GetObjectType */ -#define OBJ_BRUSH (2) #define OBJ_PEN (1) +#define OBJ_BRUSH (2) +#define OBJ_DC (3) +#define OBJ_METADC (4) #define OBJ_PAL (5) #define OBJ_FONT (6) #define OBJ_BITMAP (7) -#define OBJ_EXTPEN (11) #define OBJ_REGION (8) -#define OBJ_DC (3) -#define OBJ_MEMDC (10) #define OBJ_METAFILE (9) -#define OBJ_METADC (4) -#define OBJ_ENHMETAFILE (13) +#define OBJ_MEMDC (10) +#define OBJ_EXTPEN (11) #define OBJ_ENHMETADC (12) +#define OBJ_ENHMETAFILE (13) +#define OBJ_COLORSPACE (14) /* EnumPrinters */ diff --git a/reactos/lib/gdi32/misc/stubs.c b/reactos/lib/gdi32/misc/stubs.c index 016457c0d0c..ab3eeb849cc 100644 --- a/reactos/lib/gdi32/misc/stubs.c +++ b/reactos/lib/gdi32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.55 2004/04/25 14:46:53 weiden Exp $ +/* $Id: stubs.c,v 1.56 2004/04/25 15:31:43 weiden Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -256,21 +256,6 @@ GetMetaRgn( } -/* - * @unimplemented - */ -HGDIOBJ -STDCALL -GetCurrentObject( - HDC a0, - UINT a1 - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - /* * @unimplemented */ diff --git a/reactos/lib/gdi32/objects/dc.c b/reactos/lib/gdi32/objects/dc.c index d9e1dc8e196..643333aa17c 100644 --- a/reactos/lib/gdi32/objects/dc.c +++ b/reactos/lib/gdi32/objects/dc.c @@ -1030,3 +1030,16 @@ FixBrushOrgEx( return FALSE; } + +/* + * @implemented + */ +HGDIOBJ +STDCALL +GetCurrentObject( + HDC hdc, + UINT uObjectType + ) +{ + return NtGdiGetCurrentObject(hdc, uObjectType); +} diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index f930ace7f93..78e6494aa24 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.130 2004/04/25 12:51:53 weiden Exp $ +/* $Id: dc.c,v 1.131 2004/04/25 15:31:43 weiden Exp $ * * DC.C - Device context functions * @@ -56,6 +56,10 @@ #define NDEBUG #include +#ifndef OBJ_COLORSPACE +#define OBJ_COLORSPACE (14) +#endif + static GDIDEVICE PrimarySurface; /* FIXME: DCs should probably be thread safe */ @@ -962,7 +966,43 @@ DC_GET_VAL( HRGN, NtGdiGetClipRgn, w.hClipRgn ) HGDIOBJ STDCALL NtGdiGetCurrentObject(HDC hDC, UINT ObjectType) { - UNIMPLEMENTED; + HGDIOBJ SelObject; + DC *dc; + + if(!(dc = DC_LockDc(hDC))) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return NULL; + } + + switch(ObjectType) + { + case OBJ_PEN: + SelObject = dc->w.hPen; + break; + case OBJ_BRUSH: + SelObject = dc->w.hBrush; + break; + case OBJ_PAL: + DPRINT1("FIXME: NtGdiGetCurrentObject() ObjectType OBJ_PAL not supported yet!\n"); + break; + case OBJ_FONT: + SelObject = dc->w.hFont; + break; + case OBJ_BITMAP: + SelObject = dc->w.hBitmap; + break; + case OBJ_COLORSPACE: + DPRINT1("FIXME: NtGdiGetCurrentObject() ObjectType OBJ_COLORSPACE not supported yet!\n"); + break; + default: + SelObject = NULL; + SetLastWin32Error(ERROR_INVALID_PARAMETER); + break; + } + + DC_UnlockDc(hDC); + return SelObject; } DC_GET_VAL_EX ( GetCurrentPositionEx, w.CursPosX, w.CursPosY, POINT, x, y ) From 6a433d3812a1e0d21f35bfcb1b1f45a097958eb3 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sun, 25 Apr 2004 15:52:31 +0000 Subject: [PATCH 0954/1463] implemented PtVisible() svn path=/trunk/; revision=9218 --- reactos/lib/gdi32/misc/stubs.c | 18 +----------- reactos/lib/gdi32/objects/dc.c | 16 +++++++++++ reactos/subsys/win32k/objects/cliprgn.c | 37 +++++++++++++++++++++++-- 3 files changed, 52 insertions(+), 19 deletions(-) diff --git a/reactos/lib/gdi32/misc/stubs.c b/reactos/lib/gdi32/misc/stubs.c index ab3eeb849cc..cba5f52b32a 100644 --- a/reactos/lib/gdi32/misc/stubs.c +++ b/reactos/lib/gdi32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.56 2004/04/25 15:31:43 weiden Exp $ +/* $Id: stubs.c,v 1.57 2004/04/25 15:52:31 weiden Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -391,22 +391,6 @@ PlayMetaFile( } -/* - * @unimplemented - */ -BOOL -STDCALL -PtVisible( - HDC a0, - int a1, - int a2 - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - /* * @unimplemented */ diff --git a/reactos/lib/gdi32/objects/dc.c b/reactos/lib/gdi32/objects/dc.c index 643333aa17c..7083fee4230 100644 --- a/reactos/lib/gdi32/objects/dc.c +++ b/reactos/lib/gdi32/objects/dc.c @@ -1043,3 +1043,19 @@ GetCurrentObject( { return NtGdiGetCurrentObject(hdc, uObjectType); } + + +/* + * @implemented + */ +BOOL +STDCALL +PtVisible( + HDC hdc, + int X, + int Y + ) +{ + return NtGdiPtVisible(hdc, X, Y); +} + diff --git a/reactos/subsys/win32k/objects/cliprgn.c b/reactos/subsys/win32k/objects/cliprgn.c index 3ba6b6bbfb7..b9718b199bc 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.32 2004/04/24 14:21:37 weiden Exp $ */ +/* $Id: cliprgn.c,v 1.33 2004/04/25 15:52:31 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include @@ -124,9 +124,15 @@ NtGdiSelectVisRgn(HDC hdc, HRGN hrgn) DC *dc; if (!hrgn) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); return ERROR; + } if (!(dc = DC_LockDc(hdc))) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); return ERROR; + } dc->w.flags &= ~DC_DIRTY; @@ -168,10 +174,14 @@ IntGdiGetClipBox(HDC hDC, PDC dc; if (!(dc = DC_LockDc(hDC))) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); return ERROR; + } if(!(Rgn = RGNDATA_LockRgn(dc->w.hGCClipRgn))) { DC_UnlockDc( hDC ); + SetLastWin32Error(ERROR_INVALID_HANDLE); return ERROR; } retval = UnsafeIntGetRgnBox(Rgn, rc); @@ -219,7 +229,10 @@ int STDCALL NtGdiIntersectClipRect(HDC hDC, PDC dc = DC_LockDc(hDC); if (!dc) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); return ERROR; + } Rect.left = LeftRect; Rect.top = TopRect; @@ -262,7 +275,26 @@ BOOL STDCALL NtGdiPtVisible(HDC hDC, int X, int Y) { - UNIMPLEMENTED; + BOOL Ret; + DC *dc; + + if(!(dc = DC_LockDc(hDC))) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } + + if(dc->w.hClipRgn) + { + Ret = NtGdiPtInRegion(dc->w.hClipRgn, X, Y); + } + else + { + Ret = FALSE; + } + + DC_UnlockDc(hDC); + return Ret; } BOOL STDCALL NtGdiRectVisible(HDC hDC, @@ -276,6 +308,7 @@ BOOL STDCALL NtGdiRectVisible(HDC hDC, if (!dc) { + SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } From d69e5f4dee527f7d89b5b588e5055ed3eb201739 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sun, 25 Apr 2004 16:06:20 +0000 Subject: [PATCH 0955/1463] implemented ExcludeClipRect() svn path=/trunk/; revision=9219 --- reactos/lib/gdi32/misc/stubs.c | 20 +-------- reactos/lib/gdi32/objects/clip.c | 18 +++++++- reactos/subsys/win32k/objects/cliprgn.c | 58 ++++++++++++++++++++----- 3 files changed, 65 insertions(+), 31 deletions(-) diff --git a/reactos/lib/gdi32/misc/stubs.c b/reactos/lib/gdi32/misc/stubs.c index cba5f52b32a..96bb3a60e92 100644 --- a/reactos/lib/gdi32/misc/stubs.c +++ b/reactos/lib/gdi32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.57 2004/04/25 15:52:31 weiden Exp $ +/* $Id: stubs.c,v 1.58 2004/04/25 16:06:20 weiden Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -176,24 +176,6 @@ Escape( } -/* - * @unimplemented - */ -int -STDCALL -ExcludeClipRect( - HDC a0, - int a1, - int a2, - int a3, - int a4 - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - /* * @unimplemented */ diff --git a/reactos/lib/gdi32/objects/clip.c b/reactos/lib/gdi32/objects/clip.c index adb324fa6eb..9ba8170b0aa 100644 --- a/reactos/lib/gdi32/objects/clip.c +++ b/reactos/lib/gdi32/objects/clip.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: clip.c,v 1.5 2004/04/25 14:46:54 weiden Exp $ +/* $Id: clip.c,v 1.6 2004/04/25 16:06:20 weiden Exp $ * * PROJECT: ReactOS gdi32.dll * FILE: lib/gdi32/objects/clip.c @@ -55,4 +55,18 @@ IntersectClipRect( return NtGdiIntersectClipRect(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect); } - +/* + * @implemented + */ +int +STDCALL +ExcludeClipRect( + HDC hdc, + int nLeftRect, + int nTopRect, + int nRightRect, + int nBottomRect + ) +{ + return NtGdiExcludeClipRect(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect); +} diff --git a/reactos/subsys/win32k/objects/cliprgn.c b/reactos/subsys/win32k/objects/cliprgn.c index b9718b199bc..135c0b62f41 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.33 2004/04/25 15:52:31 weiden Exp $ */ +/* $Id: cliprgn.c,v 1.34 2004/04/25 16:06:20 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include @@ -149,15 +149,6 @@ NtGdiSelectVisRgn(HDC hdc, HRGN hrgn) return retval; } -int STDCALL NtGdiExcludeClipRect(HDC hDC, - int LeftRect, - int TopRect, - int RightRect, - int BottomRect) -{ - UNIMPLEMENTED; -} - int STDCALL NtGdiExtSelectClipRgn(HDC hDC, HRGN hrgn, int fnMode) @@ -217,6 +208,53 @@ int STDCALL NtGdiGetMetaRgn(HDC hDC, UNIMPLEMENTED; } +int STDCALL NtGdiExcludeClipRect(HDC hDC, + int LeftRect, + int TopRect, + int RightRect, + int BottomRect) +{ + INT Result; + RECT Rect; + HRGN NewRgn; + PDC dc = DC_LockDc(hDC); + + if (!dc) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return ERROR; + } + + Rect.left = LeftRect; + Rect.top = TopRect; + Rect.right = RightRect; + Rect.bottom = BottomRect; + + IntLPtoDP(dc, (LPPOINT)&Rect, 2); + + NewRgn = UnsafeIntCreateRectRgnIndirect(&Rect); + if (!NewRgn) + { + 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); + NtGdiDeleteObject(NewRgn); + } + if (Result != ERROR) + CLIPPING_UpdateGCRegion(dc); + + DC_UnlockDc(hDC); + + return Result; +} + int STDCALL NtGdiIntersectClipRect(HDC hDC, int LeftRect, int TopRect, From ffa06b86eb3b0cf0624bc7327c2f49ae7490ff75 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sun, 25 Apr 2004 16:40:39 +0000 Subject: [PATCH 0956/1463] implemented ExtSelectClipRgn() (untested!) svn path=/trunk/; revision=9220 --- reactos/lib/gdi32/misc/stubs.c | 17 +------ reactos/lib/gdi32/objects/clip.c | 17 ++++++- reactos/subsys/win32k/objects/cliprgn.c | 61 ++++++++++++++++++++++++- 3 files changed, 76 insertions(+), 19 deletions(-) diff --git a/reactos/lib/gdi32/misc/stubs.c b/reactos/lib/gdi32/misc/stubs.c index 96bb3a60e92..69261936a9f 100644 --- a/reactos/lib/gdi32/misc/stubs.c +++ b/reactos/lib/gdi32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.58 2004/04/25 16:06:20 weiden Exp $ +/* $Id: stubs.c,v 1.59 2004/04/25 16:40:39 weiden Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -387,21 +387,6 @@ ResizePalette( return FALSE; } -/* - * @unimplemented - */ -int -STDCALL -ExtSelectClipRgn( - HDC a0, - HRGN a1, - int a2 - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented diff --git a/reactos/lib/gdi32/objects/clip.c b/reactos/lib/gdi32/objects/clip.c index 9ba8170b0aa..a67d178643b 100644 --- a/reactos/lib/gdi32/objects/clip.c +++ b/reactos/lib/gdi32/objects/clip.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: clip.c,v 1.6 2004/04/25 16:06:20 weiden Exp $ +/* $Id: clip.c,v 1.7 2004/04/25 16:40:39 weiden Exp $ * * PROJECT: ReactOS gdi32.dll * FILE: lib/gdi32/objects/clip.c @@ -70,3 +70,18 @@ ExcludeClipRect( { return NtGdiExcludeClipRect(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect); } + +/* + * @implemented + */ +int +STDCALL +ExtSelectClipRgn( + HDC hdc, + HRGN hrgn, + int fnMode + ) +{ + return NtGdiExtSelectClipRgn(hdc, hrgn, fnMode); +} + diff --git a/reactos/subsys/win32k/objects/cliprgn.c b/reactos/subsys/win32k/objects/cliprgn.c index 135c0b62f41..c87f800fcf9 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.34 2004/04/25 16:06:20 weiden Exp $ */ +/* $Id: cliprgn.c,v 1.35 2004/04/25 16:40:39 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include @@ -153,7 +153,64 @@ int STDCALL NtGdiExtSelectClipRgn(HDC hDC, HRGN hrgn, int fnMode) { - UNIMPLEMENTED; + int retval; + DC *dc; + + if (!(dc = DC_LockDc(hDC))) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return ERROR; + } + + dc->w.flags &= ~DC_DIRTY; + + if (!hrgn) + { + if (fnMode == RGN_COPY) + { + NtGdiDeleteObject(dc->w.hGCClipRgn); + dc->w.hGCClipRgn = NULL; + } + else + { + DC_UnlockDc( hDC ); + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return ERROR; + } + } + else + { + if (!dc->w.hGCClipRgn) + { + PROSRGNDATA Rgn; + RECT rect; + if((Rgn = RGNDATA_LockRgn(dc->w.hVisRgn))) + { + UnsafeIntGetRgnBox(Rgn, &rect); + RGNDATA_UnlockRgn(dc->w.hVisRgn); + dc->w.hGCClipRgn = UnsafeIntCreateRectRgnIndirect(&rect); + } + else + { + dc->w.hGCClipRgn = NtGdiCreateRectRgn(0, 0, 0, 0); + } + } + if(fnMode == RGN_COPY) + NtGdiCombineRgn(dc->w.hGCClipRgn, hrgn, 0, fnMode); + else + NtGdiCombineRgn(dc->w.hGCClipRgn, dc->w.hGCClipRgn, hrgn, fnMode); + } + + if (dc->w.hVisRgn == NULL) + { + dc->w.hVisRgn = NtGdiCreateRectRgn(0, 0, 0, 0); + GDIOBJ_CopyOwnership(hDC, dc->w.hVisRgn); + } + + CLIPPING_UpdateGCRegion(dc); + DC_UnlockDc( hDC ); + + return retval; } int FASTCALL From c0380320382d72f1d3698060aca889b26fb0b8e3 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sun, 25 Apr 2004 20:05:30 +0000 Subject: [PATCH 0957/1463] implemented GetDCBrushColor(), SetDCBrushColor(), GetDCPenColor() and SetDCPenColor(). they're UNTESTED so far! svn path=/trunk/; revision=9221 --- reactos/include/win32k/ntuser.h | 3 + reactos/lib/gdi32/misc/stubs.c | 56 +----- reactos/lib/gdi32/objects/dc.c | 61 +++++++ reactos/subsys/win32k/include/intgdi.h | 6 + reactos/subsys/win32k/ntuser/misc.c | 16 +- reactos/subsys/win32k/objects/dc.c | 234 ++++++++++++++++++++++++- 6 files changed, 319 insertions(+), 57 deletions(-) diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index c8f711f7b9d..e69294d8278 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -183,6 +183,9 @@ NtUserCallOneParam( DWORD Param, DWORD Routine); +#define TWOPARAM_ROUTINE_SETDCPENCOLOR 0x45 +#define TWOPARAM_ROUTINE_SETDCBRUSHCOLOR 0x46 +#define TWOPARAM_ROUTINE_GETDCCOLOR 0x47 #define TWOPARAM_ROUTINE_GETWINDOWRGNBOX 0x48 #define TWOPARAM_ROUTINE_GETWINDOWRGN 0x49 #define TWOPARAM_ROUTINE_SETMENUBARHEIGHT 0x50 diff --git a/reactos/lib/gdi32/misc/stubs.c b/reactos/lib/gdi32/misc/stubs.c index 69261936a9f..45b67f7c15d 100644 --- a/reactos/lib/gdi32/misc/stubs.c +++ b/reactos/lib/gdi32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.59 2004/04/25 16:40:39 weiden Exp $ +/* $Id: stubs.c,v 1.60 2004/04/25 20:05:30 weiden Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -2285,32 +2285,6 @@ GetCharWidthI( return 0; } -/* - * @unimplemented - */ -COLORREF -STDCALL -GetDCBrushColor( - HDC hdc -) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - -/* - * @unimplemented - */ -COLORREF -STDCALL -GetDCPenColor( - HDC hdc -) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented */ @@ -2546,34 +2520,6 @@ SetBrushAttributes(HBRUSH hbm, DWORD dwFlags) return 0; } -/* - * @unimplemented - */ -COLORREF -STDCALL -SetDCBrushColor( - HDC hdc, - COLORREF crColor -) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - -/* - * @unimplemented - */ -COLORREF -STDCALL -SetDCPenColor( - HDC hdc, - COLORREF crColor -) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented */ diff --git a/reactos/lib/gdi32/objects/dc.c b/reactos/lib/gdi32/objects/dc.c index 7083fee4230..49c3d753705 100644 --- a/reactos/lib/gdi32/objects/dc.c +++ b/reactos/lib/gdi32/objects/dc.c @@ -11,6 +11,18 @@ #define NDEBUG #include +#define NtUserGetDCBrushColor(hbr) \ + (COLORREF)NtUserCallTwoParam((DWORD)(hbr), OBJ_BRUSH, TWOPARAM_ROUTINE_GETDCCOLOR) + +#define NtUserGetDCPenColor(hbr) \ + (COLORREF)NtUserCallTwoParam((DWORD)(hbr), OBJ_PEN, TWOPARAM_ROUTINE_GETDCCOLOR) + +#define NtUserSetDCBrushColor(hbr, crColor) \ + (COLORREF)NtUserCallTwoParam((DWORD)(hbr), (DWORD)crColor, TWOPARAM_ROUTINE_SETDCBRUSHCOLOR) + +#define NtUserSetDCPenColor(hbr, crColor) \ + (COLORREF)NtUserCallTwoParam((DWORD)(hbr), (DWORD)crColor, TWOPARAM_ROUTINE_SETDCPENCOLOR) + /* * @implemented */ @@ -1059,3 +1071,52 @@ PtVisible( return NtGdiPtVisible(hdc, X, Y); } +/* + * @implemented + */ +COLORREF +STDCALL +GetDCBrushColor( + HDC hdc +) +{ + return NtUserGetDCBrushColor(hdc); +} + +/* + * @implemented + */ +COLORREF +STDCALL +GetDCPenColor( + HDC hdc +) +{ + return NtUserGetDCPenColor(hdc); +} + +/* + * @implemented + */ +COLORREF +STDCALL +SetDCBrushColor( + HDC hdc, + COLORREF crColor +) +{ + return NtUserSetDCBrushColor(hdc, crColor); +} + +/* + * @implemented + */ +COLORREF +STDCALL +SetDCPenColor( + HDC hdc, + COLORREF crColor +) +{ + return NtUserSetDCPenColor(hdc, crColor); +} diff --git a/reactos/subsys/win32k/include/intgdi.h b/reactos/subsys/win32k/include/intgdi.h index 3374f5f6a34..131d3457553 100644 --- a/reactos/subsys/win32k/include/intgdi.h +++ b/reactos/subsys/win32k/include/intgdi.h @@ -121,6 +121,12 @@ IntGdiCreateDC(PUNICODE_STRING Driver, PUNICODE_STRING Output, CONST PDEVMODEW InitData); +COLORREF FASTCALL +IntGetDCColor(HDC hDC, ULONG Object); + +COLORREF FASTCALL +IntSetDCColor(HDC hDC, ULONG Object, COLORREF Color); + /* Coord functions */ BOOL FASTCALL diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index 21cc8ac14b1..c13af9e9110 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.62 2004/04/15 23:36:03 weiden Exp $ +/* $Id: misc.c,v 1.63 2004/04/25 20:05:30 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -18,6 +18,8 @@ #include #include #include +#include +#include #include #include #include @@ -208,6 +210,18 @@ NtUserCallTwoParam( switch(Routine) { + case TWOPARAM_ROUTINE_SETDCPENCOLOR: + { + return (DWORD)IntSetDCColor((HDC)Param1, OBJ_PEN, (COLORREF)Param2); + } + case TWOPARAM_ROUTINE_SETDCBRUSHCOLOR: + { + return (DWORD)IntSetDCColor((HDC)Param1, OBJ_BRUSH, (COLORREF)Param2); + } + case TWOPARAM_ROUTINE_GETDCCOLOR: + { + return (DWORD)IntGetDCColor((HDC)Param1, (ULONG)Param2); + } case TWOPARAM_ROUTINE_GETWINDOWRGNBOX: { DWORD Ret; diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index 78e6494aa24..fcbb256d011 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.131 2004/04/25 15:31:43 weiden Exp $ +/* $Id: dc.c,v 1.132 2004/04/25 20:05:30 weiden Exp $ * * DC.C - Device context functions * @@ -2221,4 +2221,236 @@ IntIsPrimarySurface(PSURFGDI SurfGDI) return SurfGDI == (PSURFGDI)AccessInternalObject((ULONG) PrimarySurface.Handle) ? TRUE : FALSE; } +/* + * Returns the color of the brush or pen that is currently selected into the DC. + * This function is called from GetDCBrushColor() and GetDCPenColor() + */ +COLORREF FASTCALL +IntGetDCColor(HDC hDC, ULONG Object) +{ + COLORREF Result; + DC *dc; + PPALGDI PalGDI; + PGDIBRUSHOBJ pen; + PGDIBRUSHOBJ brush; + XLATEOBJ *XlateObj; + HPALETTE Pal; + 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; + else + Pal = NtGdiGetStockObject(DEFAULT_PALETTE); + + 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; +} + +/* + * Changes the color of the brush or pen that is currently selected into the DC. + * This function is called from SetDCBrushColor() and SetDCPenColor() + */ +COLORREF FASTCALL +IntSetDCColor(HDC hDC, ULONG Object, COLORREF Color) +{ + COLORREF Result; + DC *dc; + PPALGDI PalGDI; + PGDIBRUSHOBJ pen; + PGDIBRUSHOBJ brush; + XLATEOBJ *XlateObj; + HPALETTE Pal; + 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; + else + Pal = NtGdiGetStockObject(DEFAULT_PALETTE); + + 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; +} + /* EOF */ From 375cb8f522273a9c671fb2b363676feaafe45c6b Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sun, 25 Apr 2004 20:22:04 +0000 Subject: [PATCH 0958/1463] handle GetDateFormat) failures (idea by Thomas Weidenmueller) svn path=/trunk/; revision=9222 --- reactos/subsys/system/explorer/doc/TODO.txt | 1 + reactos/subsys/system/explorer/shell/shellbrowser.cpp | 5 +++-- reactos/subsys/system/explorer/taskbar/traynotify.cpp | 6 ++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/reactos/subsys/system/explorer/doc/TODO.txt b/reactos/subsys/system/explorer/doc/TODO.txt index 2c3452cf651..3dbafff6367 100644 --- a/reactos/subsys/system/explorer/doc/TODO.txt +++ b/reactos/subsys/system/explorer/doc/TODO.txt @@ -1,3 +1,4 @@ +- rewrite autostart code and include all possible autostart locations - read "DESCRIPT.ION" files to display file descriptions - context menus for quick launch bar - detect display mode changes and adjust desktop bar size diff --git a/reactos/subsys/system/explorer/shell/shellbrowser.cpp b/reactos/subsys/system/explorer/shell/shellbrowser.cpp index f436b40e06e..d2e966798c8 100644 --- a/reactos/subsys/system/explorer/shell/shellbrowser.cpp +++ b/reactos/subsys/system/explorer/shell/shellbrowser.cpp @@ -536,7 +536,7 @@ String ShellBrowserChild::jump_to_int(LPCTSTR url) if (jump_to_pidl(ShellPath(dir))) return FmtString(TEXT("file://%s"), (LPCTSTR)dir); } - + return String(); } @@ -564,7 +564,8 @@ bool ShellBrowserChild::jump_to_pidl(LPCITEMIDLIST pidl) Entry* found = entry->find_entry(p); p = entry->get_next_path_component(p); - hitem = select_entry(hitem, found); + if (found) + hitem = select_entry(hitem, found); entry = found; } diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index 9c3bfb38bd5..effe294b9d2 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -1172,9 +1172,11 @@ int ClockWindow::Notify(int id, NMHDR* pnmh) TCHAR buffer[64]; GetLocalTime(&systime); - GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &systime, NULL, buffer, 64); - _tcscpy(pdi->szText, buffer); + if (GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &systime, NULL, buffer, 64)) + _tcscpy(pdi->szText, buffer); + else + pdi->szText[0] = '\0'; } return 0; From 772e31feb1b1203da08e1a6420307724533f006c Mon Sep 17 00:00:00 2001 From: James Tabor Date: Mon, 26 Apr 2004 05:46:35 +0000 Subject: [PATCH 0959/1463] Added Process HandleCount information. svn path=/trunk/; revision=9223 --- reactos/ntoskrnl/ex/sysinfo.c | 4 ++-- reactos/ntoskrnl/ps/process.c | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/ex/sysinfo.c b/reactos/ntoskrnl/ex/sysinfo.c index be8edc75a9a..434a557bfc1 100644 --- a/reactos/ntoskrnl/ex/sysinfo.c +++ b/reactos/ntoskrnl/ex/sysinfo.c @@ -1,4 +1,4 @@ -/* $Id: sysinfo.c,v 1.30 2004/04/23 06:19:28 jimtabor Exp $ +/* $Id: sysinfo.c,v 1.31 2004/04/26 05:46:35 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -550,7 +550,7 @@ QSI_DEF(SystemProcessInformation) SpiCur->BasePriority = pr->Pcb.BasePriority; SpiCur->ProcessId = pr->UniqueProcessId; SpiCur->InheritedFromProcessId = (DWORD)(pr->InheritedFromUniqueProcessId); - SpiCur->HandleCount = 0; // FIXME + SpiCur->HandleCount = ObGetObjectHandleCount(pr); SpiCur->VmCounters.PeakVirtualSize = pr->PeakVirtualSize; SpiCur->VmCounters.VirtualSize = pr->VirtualSize.QuadPart; SpiCur->VmCounters.PageFaultCount = pr->LastFaultCount; diff --git a/reactos/ntoskrnl/ps/process.c b/reactos/ntoskrnl/ps/process.c index 6b096a8bab5..cb242885b47 100644 --- a/reactos/ntoskrnl/ps/process.c +++ b/reactos/ntoskrnl/ps/process.c @@ -1,4 +1,4 @@ -/* $Id: process.c,v 1.129 2004/04/18 06:08:36 jimtabor Exp $ +/* $Id: process.c,v 1.130 2004/04/26 05:46:35 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1111,6 +1111,20 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle, case ProcessWorkingSetWatch: case ProcessWx86Information: case ProcessHandleCount: + if (ProcessInformationLength != sizeof(ULONG)) + { + Status = STATUS_INFO_LENGTH_MISMATCH; + } + else + { + PULONG HandleCount = (PULONG)ProcessInformation; + *HandleCount = ObGetObjectHandleCount(Process); + if (ReturnLength) + { + *ReturnLength = sizeof(ULONG); + } + } + break; case ProcessSessionInformation: case ProcessWow64Information: Status = STATUS_NOT_IMPLEMENTED; From 4043538723b7f8e4594e533b96144a778f29ef7a Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 26 Apr 2004 17:49:04 +0000 Subject: [PATCH 0960/1463] fixed hittest calculation svn path=/trunk/; revision=9224 --- reactos/lib/user32/windows/nonclient.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/user32/windows/nonclient.c b/reactos/lib/user32/windows/nonclient.c index 52f4cdd856e..060a7c7d9dc 100644 --- a/reactos/lib/user32/windows/nonclient.c +++ b/reactos/lib/user32/windows/nonclient.c @@ -685,7 +685,7 @@ DefWndNCHitTest(HWND hWnd, POINT Point) if (UserHasWindowEdge(Style, ExStyle)) { - DWORD XSize, YSize; + LONG XSize, YSize; UserGetWindowBorders(Style, ExStyle, &WindowBorders, FALSE); InflateRect(&WindowRect, -WindowBorders.cx, -WindowBorders.cy); From be07990679df93e5f28292e8c7a3ecb8c62bae12 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 26 Apr 2004 19:58:45 +0000 Subject: [PATCH 0961/1463] fixed NtGdiPtVisible() svn path=/trunk/; revision=9225 --- reactos/subsys/win32k/objects/cliprgn.c | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/reactos/subsys/win32k/objects/cliprgn.c b/reactos/subsys/win32k/objects/cliprgn.c index c87f800fcf9..79d2c4f305a 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.35 2004/04/25 16:40:39 weiden Exp $ */ +/* $Id: cliprgn.c,v 1.36 2004/04/26 19:58:45 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN #include @@ -370,7 +370,7 @@ BOOL STDCALL NtGdiPtVisible(HDC hDC, int X, int Y) { - BOOL Ret; + HRGN rgn; DC *dc; if(!(dc = DC_LockDc(hDC))) @@ -379,17 +379,10 @@ BOOL STDCALL NtGdiPtVisible(HDC hDC, return FALSE; } - if(dc->w.hClipRgn) - { - Ret = NtGdiPtInRegion(dc->w.hClipRgn, X, Y); - } - else - { - Ret = FALSE; - } - + rgn = dc->w.hClipRgn; DC_UnlockDc(hDC); - return Ret; + + return (rgn ? NtGdiPtInRegion(rgn, X, Y) : FALSE); } BOOL STDCALL NtGdiRectVisible(HDC hDC, From 68d020f48dd893c74c13e9864ffd3a226418dea0 Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes Date: Mon, 26 Apr 2004 20:19:21 +0000 Subject: [PATCH 0962/1463] make imagehlp import lib svn path=/trunk/; revision=9226 --- reactos/dk/w32/Makefile | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/reactos/dk/w32/Makefile b/reactos/dk/w32/Makefile index 7fd1a3d7bf1..6ae0c71cdba 100644 --- a/reactos/dk/w32/Makefile +++ b/reactos/dk/w32/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.7 2003/11/24 16:45:43 ekohl Exp $ +# $Id: Makefile,v 1.8 2004/04/26 20:19:21 gdalsnes Exp $ # # PROJECT : ReactOS Operating System # FILE : reactos/dk/w32/Makefile @@ -28,7 +28,8 @@ MODULES_CORE=\ MODULES_ADVANCED=\ $(TARGET_FOLDER_LIB)/advapi32.a\ - $(TARGET_FOLDER_LIB)/secur32.a + $(TARGET_FOLDER_LIB)/secur32.a\ + $(TARGET_FOLDER_LIB)/imagehlp.a MODULES_SHELL=\ $(TARGET_FOLDER_LIB)/comctl32.a\ @@ -122,6 +123,11 @@ $(TARGET_FOLDER_LIB)/secur32.a: $(PATH_TO_TOP)/lib/secur32/secur32.def -D secur32.dll\ -d $(PATH_TO_TOP)/lib/secur32/secur32.def +$(TARGET_FOLDER_LIB)/imagehlp.a: $(PATH_TO_TOP)/lib/imagehlp/imagehlp.def + $(DLLTOOL) \ + $(DTFLAGS)\ + -D imagehlp.dll\ + -d $(PATH_TO_TOP)/lib/imagehlp/imagehlp.def # --- SHELL --- $(TARGET_FOLDER_LIB)/shell32.a: $(PATH_TO_TOP)/lib/shell32/shell32.def From bdce3452a02df6e65e3678e99edd68c5e8ebfd77 Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes Date: Mon, 26 Apr 2004 20:20:11 +0000 Subject: [PATCH 0963/1463] build imagehlp svn path=/trunk/; revision=9227 --- reactos/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/Makefile b/reactos/Makefile index f0278c263d4..e08aa7fe1b7 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.218 2004/04/17 20:23:20 weiden Exp $ +# $Id: Makefile,v 1.219 2004/04/26 20:20:11 gdalsnes Exp $ # # Global makefile # @@ -48,7 +48,7 @@ DLLS = advapi32 cabinet cards comctl32 crtdll comdlg32 d3d8thk expat fmifs freet 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 \ - winmm winspool ws2help ws2_32 wsock32 wshirda $(DLLS_KBD) $(DLLS_CPL) + winmm winspool ws2help ws2_32 wsock32 wshirda imagehlp $(DLLS_KBD) $(DLLS_CPL) SUBSYS = smss win32k csrss ntvdm From 63bc13d624d1d94633b070d9819164f23797c316 Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes Date: Mon, 26 Apr 2004 20:24:04 +0000 Subject: [PATCH 0964/1463] fix broken MakeSureDirectoryPathExists. It depended on Wine's CreateDirectory, which seems to be more relaxed that the ros/Windows version. svn path=/trunk/; revision=9228 --- reactos/lib/imagehlp/imagehlp_main.c | 37 ++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/reactos/lib/imagehlp/imagehlp_main.c b/reactos/lib/imagehlp/imagehlp_main.c index 3803f2d9e70..7526476fde9 100644 --- a/reactos/lib/imagehlp/imagehlp_main.c +++ b/reactos/lib/imagehlp/imagehlp_main.c @@ -81,19 +81,40 @@ LPAPI_VERSION WINAPI ImagehlpApiVersionEx(LPAPI_VERSION AppVersion) /*********************************************************************** * MakeSureDirectoryPathExists (IMAGEHLP.@) + * + * Path may contain a file at the end. If a dir is at the end, the path + * must end with a backslash. + * + * Path may be absolute or relative (to current dir). + * */ BOOL WINAPI MakeSureDirectoryPathExists(LPCSTR DirPath) { - if (CreateDirectoryA(DirPath,NULL)) - return TRUE; - if (GetLastError() == ERROR_ALREADY_EXISTS) - { - SetLastError(ERROR_SUCCESS); - return TRUE; - } - return FALSE; + char Path[MAX_PATH]; + char *SlashPos = Path; + char Slash; + BOOL bRes; + + strcpy(Path, DirPath); + + while((SlashPos=strpbrk(SlashPos+1,"\\/"))) + { + Slash = *SlashPos; + *SlashPos = 0; + + bRes = CreateDirectoryA(Path, NULL); + if (bRes == FALSE && GetLastError() != ERROR_ALREADY_EXISTS) + { + return FALSE; + } + + *SlashPos = Slash; + } + + return TRUE; } + /*********************************************************************** * MarkImageAsRunFromSwap (IMAGEHLP.@) * FIXME From 42ad6cb85fa34315aa5099a6110605f488fc5c7f Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes Date: Mon, 26 Apr 2004 20:26:15 +0000 Subject: [PATCH 0965/1463] make sure temp directory exist svn path=/trunk/; revision=9229 --- reactos/subsys/system/cmd/cmd.c | 63 ++++++++++++++++++++++++++++- reactos/subsys/system/cmd/files.txt | 2 +- 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/system/cmd/cmd.c b/reactos/subsys/system/cmd/cmd.c index 4e3237be6b4..43f31780229 100644 --- a/reactos/subsys/system/cmd/cmd.c +++ b/reactos/subsys/system/cmd/cmd.c @@ -1,4 +1,4 @@ -/* $Id: cmd.c,v 1.10 2004/01/28 20:52:57 gvg Exp $ +/* $Id: cmd.c,v 1.11 2004/04/26 20:26:15 gdalsnes Exp $ * * CMD.C - command-line interface. * @@ -165,6 +165,58 @@ WORD wDefColor; /* default color */ #endif + +/*********************************************************************** + * MakeSureDirectoryPathExistsEx + * + * If a dir is at the end and the path ends with a backslash, FileAtEnd + * is ignored. If the path doesn't end with a backslash, FileAtEnd is + * used to determine if the last part of the path is a file name or a + * directory. + * + * Path may be absolute or relative to current dir. + * + * FIXME: maybe put this in a header/library where everyone can use it????? + */ +BOOL WINAPI MakeSureDirectoryPathExistsEx(LPCSTR DirPath, BOOL FileAtEnd) +{ + char Path[MAX_PATH]; + char *SlashPos = Path; + char Slash; + BOOL bRes; + + strcpy(Path, DirPath); + + while((SlashPos=strpbrk(SlashPos+1,"\\/"))) + { + Slash = *SlashPos; + *SlashPos = 0; + + bRes = CreateDirectoryA(Path, NULL); + if (bRes == FALSE && GetLastError() != ERROR_ALREADY_EXISTS) + { + return FALSE; + } + + *SlashPos = Slash; + + if (*(SlashPos+1) == 0) return TRUE; + } + + if (!FileAtEnd) + { + bRes = CreateDirectoryA(Path, NULL); + if (bRes == FALSE && GetLastError() != ERROR_ALREADY_EXISTS) + { + return FALSE; + } + } + + return TRUE; +} + + + /* * is character a delimeter when used on first word? * @@ -512,6 +564,7 @@ VOID ParseCommandLine (LPTSTR cmd) #ifdef FEATURE_REDIRECTION /* find the temp path to store temporary files */ GetTempPath (MAX_PATH, szTempPath); + MakeSureDirectoryPathExistsEx(szTempPath, FALSE); if (szTempPath[_tcslen (szTempPath) - 1] != _T('\\')) _tcscat (szTempPath, _T("\\")); @@ -571,10 +624,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); diff --git a/reactos/subsys/system/cmd/files.txt b/reactos/subsys/system/cmd/files.txt index fd3ef16082d..2a5e7d44c90 100644 --- a/reactos/subsys/system/cmd/files.txt +++ b/reactos/subsys/system/cmd/files.txt @@ -39,7 +39,7 @@ free.c Implements free command goto.c Implements goto command history.c Command-line history handling if.c Implements if command -internal.c Internal commands (DIR, RD, etc) +internal.c Internal commands (DIR, RD, CD, etc) label.c Implements label command locale.c Locale handling code memory.c Implements memory command From 855d8095ef1d3ce944dde11c87f1662b40f97be2 Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Mon, 26 Apr 2004 20:33:13 +0000 Subject: [PATCH 0966/1463] Added imm32 and psapi to the CD. (sorry if this messes up this is the first time I am doing development from a Linux cross-compile) svn path=/trunk/; revision=9230 --- reactos/bootdata/packages/reactos.dff | 354 +++++++++++++------------- 1 file changed, 178 insertions(+), 176 deletions(-) diff --git a/reactos/bootdata/packages/reactos.dff b/reactos/bootdata/packages/reactos.dff index a5864253240..76d8b4333f4 100755 --- a/reactos/bootdata/packages/reactos.dff +++ b/reactos/bootdata/packages/reactos.dff @@ -1,176 +1,178 @@ -; Main ReactOS package - -.Set DiskLabelTemplate="ReactOS" ; Label of disk -.Set CabinetNameTemplate="reactos.cab" ; reactos.cab -.Set InfFileName="reactos.inf" ; reactos.inf - - -;.Set Cabinet=on -;.Set Compress=on - -.InfBegin -[Version] -Signature = "$ReactOS$" - -[Directories] -1 = system32 -2 = system32\drivers -3 = media\fonts -4 = . - -.InfEnd - -; Contents of disk -.InfBegin -[SourceFiles] -.InfEnd -drivers\bus\acpi\acpi.sys 2 -drivers\bus\isapnp\isapnp.sys 2 -drivers\bus\pci\pci.sys 2 -drivers\dd\beep\beep.sys 2 -drivers\dd\bootvid\bootvid.sys 2 -drivers\dd\null\null.sys 2 -drivers\dd\serial\serial.sys 2 -drivers\video\displays\vga\vgaddi.dll 1 -drivers\video\displays\framebuf\framebuf.dll 1 -drivers\video\miniport\vga\vgamp.sys 2 -drivers\video\miniport\vbe\vbemp.sys 2 -drivers\video\videoprt\videoprt.sys 2 -drivers\fs\fs_rec\fs_rec.sys 2 -drivers\fs\ms\msfs.sys 2 -drivers\fs\mup\mup.sys 2 -drivers\fs\np\npfs.sys 2 -drivers\input\mouclass\mouclass.sys 2 -drivers\input\psaux\psaux.sys 2 -drivers\input\sermouse\sermouse.sys 2 -drivers\net\afd\afd.sys 2 -drivers\net\ndis\ndis.sys 2 -drivers\net\tcpip\tcpip.sys 2 -drivers\net\tdi\tdi.sys 2 -drivers\net\wshtcpip\wshtcpip.dll 1 -drivers\net\dd\ne2000\ne2000.sys 2 -lib\advapi32\advapi32.dll 1 -lib\cards\cards.dll 1 -lib\comctl32\comctl32.dll 1 -lib\comdlg32\comdlg32.dll 1 -lib\crtdll\crtdll.dll 1 -lib\expat\libexpat.dll 1 -lib\fmifs\fmifs.dll 1 -lib\freetype\freetype.dll 1 -lib\gdi32\gdi32.dll 1 -lib\iphlpapi\iphlpapi.dll 1 -lib\kbdfr\kbdfr.dll 1 -lib\kbdgr\kbdgr.dll 1 -lib\kbduk\kbduk.dll 1 -lib\kbdus\kbdus.dll 1 -lib\kernel32\kernel32.dll 1 -lib\lzexpand\lz32.dll 1 -lib\mpr\mpr.dll 1 -lib\msafd\msafd.dll 1 -lib\msgina\msgina.dll 1 -lib\msvcrt\msvcrt.dll 1 -lib\msvcrt20\msvcrt20.dll 1 -lib\netapi32\netapi32.dll 1 -lib\ntdll\ntdll.dll 1 -lib\ole32\ole32.dll 1 -lib\oleaut32\oleaut32.dll 1 -lib\richedit\riched32.dll 1 -lib\rpcrt4\rpcrt4.dll 1 -lib\samlib\samlib.dll 1 -lib\secur32\secur32.dll 1 -lib\setupapi\setupapi.dll 1 -lib\shell32\shell32.dll 1 -lib\shlwapi\shlwapi.dll 1 -lib\syssetup\syssetup.dll 1 -lib\twain\twain_32.dll 1 -lib\unicode\libwine_unicode.dll 1 -lib\user32\user32.dll 1 -lib\userenv\userenv.dll 1 -lib\version\version.dll 1 -lib\winspool\winspool.drv 1 -lib\wininet\wininet.dll 1 -lib\winmm\winmm.dll 1 -lib\ws2_32\ws2_32.dll 1 -lib\ws2help\ws2help.dll 1 -lib\wshirda\wshirda.dll 1 -lib\wsock32\wsock32.dll 1 -subsys\csrss\csrss.exe 1 -subsys\csrss\win32csr\win32csr.dll 1 -subsys\ntvdm\ntvdm.exe 1 -subsys\smss\smss.exe 1 -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\notifyhook.dll 1 -subsys\system\format\format.exe 1 -subsys\system\regedit\regedit.exe 4 -subsys\system\services\services.exe 1 -subsys\system\setup\setup.exe 1 -subsys\system\taskmgr\taskmgr.exe 1 -subsys\system\userinit\userinit.exe 1 -subsys\system\winlogon\winlogon.exe 1 -services\eventlog\eventlog.exe 1 -services\rpcss\rpcss.exe 1 -media\fonts\helb____.ttf 3 -media\fonts\timr____.ttf 3 -media\fonts\Vera.ttf 3 -media\fonts\VeraBd.ttf 3 -media\fonts\VeraBI.ttf 3 -media\fonts\VeraIt.ttf 3 -media\fonts\VeraMoBd.ttf 3 -media\fonts\VeraMoBI.ttf 3 -media\fonts\VeraMoIt.ttf 3 -media\fonts\VeraMono.ttf 3 -media\fonts\VeraSe.ttf 3 -media\fonts\VeraSeBd.ttf 3 -media\nls\c_037.nls 1 -media\nls\c_500.nls 1 -media\nls\c_737.nls 1 -media\nls\c_775.nls 1 -media\nls\c_850.nls 1 -media\nls\c_852.nls 1 -media\nls\c_855.nls 1 -media\nls\c_856.nls 1 -media\nls\c_857.nls 1 -media\nls\c_860.nls 1 -media\nls\c_861.nls 1 -media\nls\c_862.nls 1 -media\nls\c_863.nls 1 -media\nls\c_864.nls 1 -media\nls\c_865.nls 1 -media\nls\c_866.nls 1 -media\nls\c_869.nls 1 -media\nls\c_874.nls 1 -media\nls\c_875.nls 1 -media\nls\c_878.nls 1 -media\nls\c_932.nls 1 -media\nls\c_936.nls 1 -media\nls\c_949.nls 1 -media\nls\c_950.nls 1 -media\nls\c_1006.nls 1 -media\nls\c_1026.nls 1 -media\nls\c_1250.nls 1 -media\nls\c_1251.nls 1 -media\nls\c_1253.nls 1 -media\nls\c_1254.nls 1 -media\nls\c_1255.nls 1 -media\nls\c_1256.nls 1 -media\nls\c_1257.nls 1 -media\nls\c_1258.nls 1 -media\nls\c_10000.nls 1 -media\nls\c_10006.nls 1 -media\nls\c_10007.nls 1 -media\nls\c_10029.nls 1 -media\nls\c_10079.nls 1 -media\nls\c_10081.nls 1 -media\nls\c_20866.nls 1 -media\nls\c_28591.nls 1 -media\nls\c_28592.nls 1 -media\nls\c_28593.nls 1 -media\nls\c_28594.nls 1 -media\nls\c_28595.nls 1 -media\nls\c_28596.nls 1 -media\nls\c_28597.nls 1 -media\nls\c_28598.nls 1 -media\nls\c_28599.nls 1 +; Main ReactOS package + +.Set DiskLabelTemplate="ReactOS" ; Label of disk +.Set CabinetNameTemplate="reactos.cab" ; reactos.cab +.Set InfFileName="reactos.inf" ; reactos.inf + + +;.Set Cabinet=on +;.Set Compress=on + +.InfBegin +[Version] +Signature = "$ReactOS$" + +[Directories] +1 = system32 +2 = system32\drivers +3 = media\fonts +4 = . + +.InfEnd + +; Contents of disk +.InfBegin +[SourceFiles] +.InfEnd +drivers\bus\acpi\acpi.sys 2 +drivers\bus\isapnp\isapnp.sys 2 +drivers\bus\pci\pci.sys 2 +drivers\dd\beep\beep.sys 2 +drivers\dd\bootvid\bootvid.sys 2 +drivers\dd\null\null.sys 2 +drivers\dd\serial\serial.sys 2 +drivers\video\displays\vga\vgaddi.dll 1 +drivers\video\displays\framebuf\framebuf.dll 1 +drivers\video\miniport\vga\vgamp.sys 2 +drivers\video\miniport\vbe\vbemp.sys 2 +drivers\video\videoprt\videoprt.sys 2 +drivers\fs\fs_rec\fs_rec.sys 2 +drivers\fs\ms\msfs.sys 2 +drivers\fs\mup\mup.sys 2 +drivers\fs\np\npfs.sys 2 +drivers\input\mouclass\mouclass.sys 2 +drivers\input\psaux\psaux.sys 2 +drivers\input\sermouse\sermouse.sys 2 +drivers\net\afd\afd.sys 2 +drivers\net\ndis\ndis.sys 2 +drivers\net\tcpip\tcpip.sys 2 +drivers\net\tdi\tdi.sys 2 +drivers\net\wshtcpip\wshtcpip.dll 1 +drivers\net\dd\ne2000\ne2000.sys 2 +lib\advapi32\advapi32.dll 1 +lib\cards\cards.dll 1 +lib\comctl32\comctl32.dll 1 +lib\comdlg32\comdlg32.dll 1 +lib\crtdll\crtdll.dll 1 +lib\expat\libexpat.dll 1 +lib\fmifs\fmifs.dll 1 +lib\freetype\freetype.dll 1 +lib\gdi32\gdi32.dll 1 +lib\imm32\imm32 1 +lib\iphlpapi\iphlpapi.dll 1 +lib\kbdfr\kbdfr.dll 1 +lib\kbdgr\kbdgr.dll 1 +lib\kbduk\kbduk.dll 1 +lib\kbdus\kbdus.dll 1 +lib\kernel32\kernel32.dll 1 +lib\lzexpand\lz32.dll 1 +lib\mpr\mpr.dll 1 +lib\msafd\msafd.dll 1 +lib\msgina\msgina.dll 1 +lib\msvcrt\msvcrt.dll 1 +lib\msvcrt20\msvcrt20.dll 1 +lib\netapi32\netapi32.dll 1 +lib\ntdll\ntdll.dll 1 +lib\ole32\ole32.dll 1 +lib\oleaut32\oleaut32.dll 1 +lib\psapi\psapi.dll 1 +lib\richedit\riched32.dll 1 +lib\rpcrt4\rpcrt4.dll 1 +lib\samlib\samlib.dll 1 +lib\secur32\secur32.dll 1 +lib\setupapi\setupapi.dll 1 +lib\shell32\shell32.dll 1 +lib\shlwapi\shlwapi.dll 1 +lib\syssetup\syssetup.dll 1 +lib\twain\twain_32.dll 1 +lib\unicode\libwine_unicode.dll 1 +lib\user32\user32.dll 1 +lib\userenv\userenv.dll 1 +lib\version\version.dll 1 +lib\winspool\winspool.drv 1 +lib\wininet\wininet.dll 1 +lib\winmm\winmm.dll 1 +lib\ws2_32\ws2_32.dll 1 +lib\ws2help\ws2help.dll 1 +lib\wshirda\wshirda.dll 1 +lib\wsock32\wsock32.dll 1 +subsys\csrss\csrss.exe 1 +subsys\csrss\win32csr\win32csr.dll 1 +subsys\ntvdm\ntvdm.exe 1 +subsys\smss\smss.exe 1 +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\notifyhook.dll 1 +subsys\system\format\format.exe 1 +subsys\system\regedit\regedit.exe 4 +subsys\system\services\services.exe 1 +subsys\system\setup\setup.exe 1 +subsys\system\taskmgr\taskmgr.exe 1 +subsys\system\userinit\userinit.exe 1 +subsys\system\winlogon\winlogon.exe 1 +services\eventlog\eventlog.exe 1 +services\rpcss\rpcss.exe 1 +media\fonts\helb____.ttf 3 +media\fonts\timr____.ttf 3 +media\fonts\Vera.ttf 3 +media\fonts\VeraBd.ttf 3 +media\fonts\VeraBI.ttf 3 +media\fonts\VeraIt.ttf 3 +media\fonts\VeraMoBd.ttf 3 +media\fonts\VeraMoBI.ttf 3 +media\fonts\VeraMoIt.ttf 3 +media\fonts\VeraMono.ttf 3 +media\fonts\VeraSe.ttf 3 +media\fonts\VeraSeBd.ttf 3 +media\nls\c_037.nls 1 +media\nls\c_500.nls 1 +media\nls\c_737.nls 1 +media\nls\c_775.nls 1 +media\nls\c_850.nls 1 +media\nls\c_852.nls 1 +media\nls\c_855.nls 1 +media\nls\c_856.nls 1 +media\nls\c_857.nls 1 +media\nls\c_860.nls 1 +media\nls\c_861.nls 1 +media\nls\c_862.nls 1 +media\nls\c_863.nls 1 +media\nls\c_864.nls 1 +media\nls\c_865.nls 1 +media\nls\c_866.nls 1 +media\nls\c_869.nls 1 +media\nls\c_874.nls 1 +media\nls\c_875.nls 1 +media\nls\c_878.nls 1 +media\nls\c_932.nls 1 +media\nls\c_936.nls 1 +media\nls\c_949.nls 1 +media\nls\c_950.nls 1 +media\nls\c_1006.nls 1 +media\nls\c_1026.nls 1 +media\nls\c_1250.nls 1 +media\nls\c_1251.nls 1 +media\nls\c_1253.nls 1 +media\nls\c_1254.nls 1 +media\nls\c_1255.nls 1 +media\nls\c_1256.nls 1 +media\nls\c_1257.nls 1 +media\nls\c_1258.nls 1 +media\nls\c_10000.nls 1 +media\nls\c_10006.nls 1 +media\nls\c_10007.nls 1 +media\nls\c_10029.nls 1 +media\nls\c_10079.nls 1 +media\nls\c_10081.nls 1 +media\nls\c_20866.nls 1 +media\nls\c_28591.nls 1 +media\nls\c_28592.nls 1 +media\nls\c_28593.nls 1 +media\nls\c_28594.nls 1 +media\nls\c_28595.nls 1 +media\nls\c_28596.nls 1 +media\nls\c_28597.nls 1 +media\nls\c_28598.nls 1 +media\nls\c_28599.nls 1 From 17bf83aa3885e130099f1b7c4267b81232c53228 Mon Sep 17 00:00:00 2001 From: Jason Filby Date: Tue, 27 Apr 2004 17:48:52 +0000 Subject: [PATCH 0967/1463] Second MDL test svn path=/trunk/; revision=9231 --- reactos/regtests/kmregtests/tests/mdl-2.c | 81 +++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 reactos/regtests/kmregtests/tests/mdl-2.c diff --git a/reactos/regtests/kmregtests/tests/mdl-2.c b/reactos/regtests/kmregtests/tests/mdl-2.c new file mode 100644 index 00000000000..75624b3e02b --- /dev/null +++ b/reactos/regtests/kmregtests/tests/mdl-2.c @@ -0,0 +1,81 @@ +#include +#include + +#include "regtests.h" + +static int RunTest(char *Buffer) +{ + VOID *pmem1, *sysaddr1, *sysaddr2; + ULONG AllocSize; + PMDL Mdl; + + /* Allocate memory for use in testing */ + AllocSize = 1024; + pmem1 = ExAllocatePool(NonPagedPool, + AllocSize); + + /* MmCreateMdl test */ + Mdl = NULL; + Mdl = MmCreateMdl(NULL, + pmem1, + AllocSize); + if (Mdl == NULL) + { + strcpy(Buffer, "MmCreateMdl() failed for Mdl\n"); + return TS_FAILED; + } + + /* MmBuildMdlForNonPagedPool test */ + MmBuildMdlForNonPagedPool(Mdl); + + /* MmGetSystemAddressForMdl test for buffer built by MmBuildMdlForNonPagedPool */ + sysaddr1 = MmGetSystemAddressForMdl(Mdl); + if (sysaddr1 == NULL) + { + strcpy(Buffer, "MmGetSystemAddressForMdl() failed for Mdl after MmBuildMdlForNonPagedPool\n"); + return TS_FAILED; + } + + /* MmIsNonPagedSystemAddressValid test */ + if (MmIsNonPagedSystemAddressValid(sysaddr1) == FALSE) + { + strcpy(Buffer, "MmIsNonPagedSystemAddressValid() failed for Mdl for sysaddr1\n"); + return TS_FAILED; + } + + /* MmGetSystemAddressForMdlSafe test */ + sysaddr2 = MmGetSystemAddressForMdlSafe(Mdl, HighPagePriority); + if (sysaddr2 == NULL) + { + strcpy(Buffer, "MmGetSystemAddressForMdlSafe() failed for Mdl after MmBuildMdlForNonPagedPool\n"); + return TS_FAILED; + } + + /* MmIsNonPagedSystemAddressValid test */ + if (MmIsNonPagedSystemAddressValid(sysaddr2) == FALSE) + { + strcpy(Buffer, "MmIsNonPagedSystemAddressValid() failed for Mdl for sysaddr2\n"); + return TS_FAILED; + } + + /* Free memory used in test */ + ExFreePool(pmem1); + + return TS_OK; +} + +int +Mdl_2Test(int Command, char *Buffer) +{ + switch (Command) + { + case TESTCMD_RUN: + return RunTest(Buffer); + case TESTCMD_TESTNAME: + strcpy(Buffer, "Kernel Memory MDL API (2)"); + return TS_OK; + default: + break; + } + return TS_FAILED; +} From 6cb09490e51a51512e125874067b949f72de05cc Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Tue, 27 Apr 2004 20:16:42 +0000 Subject: [PATCH 0968/1463] - Fixed line endings and imm32.dll name. svn path=/trunk/; revision=9232 --- reactos/bootdata/packages/reactos.dff | 356 +++++++++++++------------- 1 file changed, 178 insertions(+), 178 deletions(-) diff --git a/reactos/bootdata/packages/reactos.dff b/reactos/bootdata/packages/reactos.dff index 76d8b4333f4..48cd59b37c7 100755 --- a/reactos/bootdata/packages/reactos.dff +++ b/reactos/bootdata/packages/reactos.dff @@ -1,178 +1,178 @@ -; Main ReactOS package - -.Set DiskLabelTemplate="ReactOS" ; Label of disk -.Set CabinetNameTemplate="reactos.cab" ; reactos.cab -.Set InfFileName="reactos.inf" ; reactos.inf - - -;.Set Cabinet=on -;.Set Compress=on - -.InfBegin -[Version] -Signature = "$ReactOS$" - -[Directories] -1 = system32 -2 = system32\drivers -3 = media\fonts -4 = . - -.InfEnd - -; Contents of disk -.InfBegin -[SourceFiles] -.InfEnd -drivers\bus\acpi\acpi.sys 2 -drivers\bus\isapnp\isapnp.sys 2 -drivers\bus\pci\pci.sys 2 -drivers\dd\beep\beep.sys 2 -drivers\dd\bootvid\bootvid.sys 2 -drivers\dd\null\null.sys 2 -drivers\dd\serial\serial.sys 2 -drivers\video\displays\vga\vgaddi.dll 1 -drivers\video\displays\framebuf\framebuf.dll 1 -drivers\video\miniport\vga\vgamp.sys 2 -drivers\video\miniport\vbe\vbemp.sys 2 -drivers\video\videoprt\videoprt.sys 2 -drivers\fs\fs_rec\fs_rec.sys 2 -drivers\fs\ms\msfs.sys 2 -drivers\fs\mup\mup.sys 2 -drivers\fs\np\npfs.sys 2 -drivers\input\mouclass\mouclass.sys 2 -drivers\input\psaux\psaux.sys 2 -drivers\input\sermouse\sermouse.sys 2 -drivers\net\afd\afd.sys 2 -drivers\net\ndis\ndis.sys 2 -drivers\net\tcpip\tcpip.sys 2 -drivers\net\tdi\tdi.sys 2 -drivers\net\wshtcpip\wshtcpip.dll 1 -drivers\net\dd\ne2000\ne2000.sys 2 -lib\advapi32\advapi32.dll 1 -lib\cards\cards.dll 1 -lib\comctl32\comctl32.dll 1 -lib\comdlg32\comdlg32.dll 1 -lib\crtdll\crtdll.dll 1 -lib\expat\libexpat.dll 1 -lib\fmifs\fmifs.dll 1 -lib\freetype\freetype.dll 1 -lib\gdi32\gdi32.dll 1 -lib\imm32\imm32 1 -lib\iphlpapi\iphlpapi.dll 1 -lib\kbdfr\kbdfr.dll 1 -lib\kbdgr\kbdgr.dll 1 -lib\kbduk\kbduk.dll 1 -lib\kbdus\kbdus.dll 1 -lib\kernel32\kernel32.dll 1 -lib\lzexpand\lz32.dll 1 -lib\mpr\mpr.dll 1 -lib\msafd\msafd.dll 1 -lib\msgina\msgina.dll 1 -lib\msvcrt\msvcrt.dll 1 -lib\msvcrt20\msvcrt20.dll 1 -lib\netapi32\netapi32.dll 1 -lib\ntdll\ntdll.dll 1 -lib\ole32\ole32.dll 1 -lib\oleaut32\oleaut32.dll 1 -lib\psapi\psapi.dll 1 -lib\richedit\riched32.dll 1 -lib\rpcrt4\rpcrt4.dll 1 -lib\samlib\samlib.dll 1 -lib\secur32\secur32.dll 1 -lib\setupapi\setupapi.dll 1 -lib\shell32\shell32.dll 1 -lib\shlwapi\shlwapi.dll 1 -lib\syssetup\syssetup.dll 1 -lib\twain\twain_32.dll 1 -lib\unicode\libwine_unicode.dll 1 -lib\user32\user32.dll 1 -lib\userenv\userenv.dll 1 -lib\version\version.dll 1 -lib\winspool\winspool.drv 1 -lib\wininet\wininet.dll 1 -lib\winmm\winmm.dll 1 -lib\ws2_32\ws2_32.dll 1 -lib\ws2help\ws2help.dll 1 -lib\wshirda\wshirda.dll 1 -lib\wsock32\wsock32.dll 1 -subsys\csrss\csrss.exe 1 -subsys\csrss\win32csr\win32csr.dll 1 -subsys\ntvdm\ntvdm.exe 1 -subsys\smss\smss.exe 1 -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\notifyhook.dll 1 -subsys\system\format\format.exe 1 -subsys\system\regedit\regedit.exe 4 -subsys\system\services\services.exe 1 -subsys\system\setup\setup.exe 1 -subsys\system\taskmgr\taskmgr.exe 1 -subsys\system\userinit\userinit.exe 1 -subsys\system\winlogon\winlogon.exe 1 -services\eventlog\eventlog.exe 1 -services\rpcss\rpcss.exe 1 -media\fonts\helb____.ttf 3 -media\fonts\timr____.ttf 3 -media\fonts\Vera.ttf 3 -media\fonts\VeraBd.ttf 3 -media\fonts\VeraBI.ttf 3 -media\fonts\VeraIt.ttf 3 -media\fonts\VeraMoBd.ttf 3 -media\fonts\VeraMoBI.ttf 3 -media\fonts\VeraMoIt.ttf 3 -media\fonts\VeraMono.ttf 3 -media\fonts\VeraSe.ttf 3 -media\fonts\VeraSeBd.ttf 3 -media\nls\c_037.nls 1 -media\nls\c_500.nls 1 -media\nls\c_737.nls 1 -media\nls\c_775.nls 1 -media\nls\c_850.nls 1 -media\nls\c_852.nls 1 -media\nls\c_855.nls 1 -media\nls\c_856.nls 1 -media\nls\c_857.nls 1 -media\nls\c_860.nls 1 -media\nls\c_861.nls 1 -media\nls\c_862.nls 1 -media\nls\c_863.nls 1 -media\nls\c_864.nls 1 -media\nls\c_865.nls 1 -media\nls\c_866.nls 1 -media\nls\c_869.nls 1 -media\nls\c_874.nls 1 -media\nls\c_875.nls 1 -media\nls\c_878.nls 1 -media\nls\c_932.nls 1 -media\nls\c_936.nls 1 -media\nls\c_949.nls 1 -media\nls\c_950.nls 1 -media\nls\c_1006.nls 1 -media\nls\c_1026.nls 1 -media\nls\c_1250.nls 1 -media\nls\c_1251.nls 1 -media\nls\c_1253.nls 1 -media\nls\c_1254.nls 1 -media\nls\c_1255.nls 1 -media\nls\c_1256.nls 1 -media\nls\c_1257.nls 1 -media\nls\c_1258.nls 1 -media\nls\c_10000.nls 1 -media\nls\c_10006.nls 1 -media\nls\c_10007.nls 1 -media\nls\c_10029.nls 1 -media\nls\c_10079.nls 1 -media\nls\c_10081.nls 1 -media\nls\c_20866.nls 1 -media\nls\c_28591.nls 1 -media\nls\c_28592.nls 1 -media\nls\c_28593.nls 1 -media\nls\c_28594.nls 1 -media\nls\c_28595.nls 1 -media\nls\c_28596.nls 1 -media\nls\c_28597.nls 1 -media\nls\c_28598.nls 1 -media\nls\c_28599.nls 1 +; Main ReactOS package + +.Set DiskLabelTemplate="ReactOS" ; Label of disk +.Set CabinetNameTemplate="reactos.cab" ; reactos.cab +.Set InfFileName="reactos.inf" ; reactos.inf + + +;.Set Cabinet=on +;.Set Compress=on + +.InfBegin +[Version] +Signature = "$ReactOS$" + +[Directories] +1 = system32 +2 = system32\drivers +3 = media\fonts +4 = . + +.InfEnd + +; Contents of disk +.InfBegin +[SourceFiles] +.InfEnd +drivers\bus\acpi\acpi.sys 2 +drivers\bus\isapnp\isapnp.sys 2 +drivers\bus\pci\pci.sys 2 +drivers\dd\beep\beep.sys 2 +drivers\dd\bootvid\bootvid.sys 2 +drivers\dd\null\null.sys 2 +drivers\dd\serial\serial.sys 2 +drivers\video\displays\vga\vgaddi.dll 1 +drivers\video\displays\framebuf\framebuf.dll 1 +drivers\video\miniport\vga\vgamp.sys 2 +drivers\video\miniport\vbe\vbemp.sys 2 +drivers\video\videoprt\videoprt.sys 2 +drivers\fs\fs_rec\fs_rec.sys 2 +drivers\fs\ms\msfs.sys 2 +drivers\fs\mup\mup.sys 2 +drivers\fs\np\npfs.sys 2 +drivers\input\mouclass\mouclass.sys 2 +drivers\input\psaux\psaux.sys 2 +drivers\input\sermouse\sermouse.sys 2 +drivers\net\afd\afd.sys 2 +drivers\net\ndis\ndis.sys 2 +drivers\net\tcpip\tcpip.sys 2 +drivers\net\tdi\tdi.sys 2 +drivers\net\wshtcpip\wshtcpip.dll 1 +drivers\net\dd\ne2000\ne2000.sys 2 +lib\advapi32\advapi32.dll 1 +lib\cards\cards.dll 1 +lib\comctl32\comctl32.dll 1 +lib\comdlg32\comdlg32.dll 1 +lib\crtdll\crtdll.dll 1 +lib\expat\libexpat.dll 1 +lib\fmifs\fmifs.dll 1 +lib\freetype\freetype.dll 1 +lib\gdi32\gdi32.dll 1 +lib\imm32\imm32.dll 1 +lib\iphlpapi\iphlpapi.dll 1 +lib\kbdfr\kbdfr.dll 1 +lib\kbdgr\kbdgr.dll 1 +lib\kbduk\kbduk.dll 1 +lib\kbdus\kbdus.dll 1 +lib\kernel32\kernel32.dll 1 +lib\lzexpand\lz32.dll 1 +lib\mpr\mpr.dll 1 +lib\msafd\msafd.dll 1 +lib\msgina\msgina.dll 1 +lib\msvcrt\msvcrt.dll 1 +lib\msvcrt20\msvcrt20.dll 1 +lib\netapi32\netapi32.dll 1 +lib\ntdll\ntdll.dll 1 +lib\ole32\ole32.dll 1 +lib\oleaut32\oleaut32.dll 1 +lib\psapi\psapi.dll 1 +lib\richedit\riched32.dll 1 +lib\rpcrt4\rpcrt4.dll 1 +lib\samlib\samlib.dll 1 +lib\secur32\secur32.dll 1 +lib\setupapi\setupapi.dll 1 +lib\shell32\shell32.dll 1 +lib\shlwapi\shlwapi.dll 1 +lib\syssetup\syssetup.dll 1 +lib\twain\twain_32.dll 1 +lib\unicode\libwine_unicode.dll 1 +lib\user32\user32.dll 1 +lib\userenv\userenv.dll 1 +lib\version\version.dll 1 +lib\winspool\winspool.drv 1 +lib\wininet\wininet.dll 1 +lib\winmm\winmm.dll 1 +lib\ws2_32\ws2_32.dll 1 +lib\ws2help\ws2help.dll 1 +lib\wshirda\wshirda.dll 1 +lib\wsock32\wsock32.dll 1 +subsys\csrss\csrss.exe 1 +subsys\csrss\win32csr\win32csr.dll 1 +subsys\ntvdm\ntvdm.exe 1 +subsys\smss\smss.exe 1 +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\notifyhook.dll 1 +subsys\system\format\format.exe 1 +subsys\system\regedit\regedit.exe 4 +subsys\system\services\services.exe 1 +subsys\system\setup\setup.exe 1 +subsys\system\taskmgr\taskmgr.exe 1 +subsys\system\userinit\userinit.exe 1 +subsys\system\winlogon\winlogon.exe 1 +services\eventlog\eventlog.exe 1 +services\rpcss\rpcss.exe 1 +media\fonts\helb____.ttf 3 +media\fonts\timr____.ttf 3 +media\fonts\Vera.ttf 3 +media\fonts\VeraBd.ttf 3 +media\fonts\VeraBI.ttf 3 +media\fonts\VeraIt.ttf 3 +media\fonts\VeraMoBd.ttf 3 +media\fonts\VeraMoBI.ttf 3 +media\fonts\VeraMoIt.ttf 3 +media\fonts\VeraMono.ttf 3 +media\fonts\VeraSe.ttf 3 +media\fonts\VeraSeBd.ttf 3 +media\nls\c_037.nls 1 +media\nls\c_500.nls 1 +media\nls\c_737.nls 1 +media\nls\c_775.nls 1 +media\nls\c_850.nls 1 +media\nls\c_852.nls 1 +media\nls\c_855.nls 1 +media\nls\c_856.nls 1 +media\nls\c_857.nls 1 +media\nls\c_860.nls 1 +media\nls\c_861.nls 1 +media\nls\c_862.nls 1 +media\nls\c_863.nls 1 +media\nls\c_864.nls 1 +media\nls\c_865.nls 1 +media\nls\c_866.nls 1 +media\nls\c_869.nls 1 +media\nls\c_874.nls 1 +media\nls\c_875.nls 1 +media\nls\c_878.nls 1 +media\nls\c_932.nls 1 +media\nls\c_936.nls 1 +media\nls\c_949.nls 1 +media\nls\c_950.nls 1 +media\nls\c_1006.nls 1 +media\nls\c_1026.nls 1 +media\nls\c_1250.nls 1 +media\nls\c_1251.nls 1 +media\nls\c_1253.nls 1 +media\nls\c_1254.nls 1 +media\nls\c_1255.nls 1 +media\nls\c_1256.nls 1 +media\nls\c_1257.nls 1 +media\nls\c_1258.nls 1 +media\nls\c_10000.nls 1 +media\nls\c_10006.nls 1 +media\nls\c_10007.nls 1 +media\nls\c_10029.nls 1 +media\nls\c_10079.nls 1 +media\nls\c_10081.nls 1 +media\nls\c_20866.nls 1 +media\nls\c_28591.nls 1 +media\nls\c_28592.nls 1 +media\nls\c_28593.nls 1 +media\nls\c_28594.nls 1 +media\nls\c_28595.nls 1 +media\nls\c_28596.nls 1 +media\nls\c_28597.nls 1 +media\nls\c_28598.nls 1 +media\nls\c_28599.nls 1 From de492d049ef97da5c6d751f0e0615cc316036efa Mon Sep 17 00:00:00 2001 From: Jason Filby Date: Tue, 27 Apr 2004 20:31:32 +0000 Subject: [PATCH 0969/1463] Followed Casper's advice to use macros to simplify regression tests svn path=/trunk/; revision=9233 --- reactos/regtests/kmregtests/tests/mdl-1.c | 49 ++----- reactos/regtests/kmregtests/tests/mdl-2.c | 52 ++------ reactos/regtests/kmregtests/tests/mm-1.c | 150 +++++++--------------- reactos/regtests/shared/regtests.h | 26 ++++ 4 files changed, 88 insertions(+), 189 deletions(-) diff --git a/reactos/regtests/kmregtests/tests/mdl-1.c b/reactos/regtests/kmregtests/tests/mdl-1.c index 7db8986a77a..753c488aac8 100644 --- a/reactos/regtests/kmregtests/tests/mdl-1.c +++ b/reactos/regtests/kmregtests/tests/mdl-1.c @@ -16,33 +16,18 @@ static int RunTest(char *Buffer) /* MmSizeOfMdl test */ MdlSize = 0; - MdlSize = MmSizeOfMdl(pmem1, - AllocSize); - if (MdlSize <= sizeof(MDL)) - { - strcpy(Buffer, "MmSizeOfMdl() failed\n"); - return TS_FAILED; - } + MdlSize = MmSizeOfMdl(pmem1, AllocSize); + FAIL_IF_LESS_EQUAL(MdlSize, sizeof(MDL), "MmSizeOfMdl() failed"); /* MmCreateMdl test */ Mdl = NULL; - Mdl = MmCreateMdl(NULL, - pmem1, - AllocSize); - if (Mdl == NULL) - { - strcpy(Buffer, "MmCreateMdl() failed for Mdl\n"); - return TS_FAILED; - } + Mdl = MmCreateMdl(NULL, pmem1, AllocSize); + FAIL_IF_NULL(Mdl, "MmCreateMdl() failed for Mdl"); /* MmGetMdlByteCount test */ MdlSize = 0; MdlSize = MmGetMdlByteCount(Mdl); - if (MdlSize != AllocSize) - { - strcpy(Buffer, "MmGetMdlByteCount() failed for Mdl\n"); - return TS_FAILED; - } + FAIL_IF_NOT_EQUAL(MdlSize, AllocSize, "MmGetMdlByteCount() failed for Mdl"); /* MmGetMdlByteOffset test */ MdlOffset = MmGetMdlByteOffset(Mdl); @@ -50,20 +35,12 @@ static int RunTest(char *Buffer) /* MmGetMdlPfnArray test */ MdlPfnArray = NULL; MdlPfnArray = MmGetMdlPfnArray(Mdl); - if (MdlPfnArray == NULL) - { - strcpy(Buffer, "MmGetMdlPfnArray() failed for Mdl\n"); - return TS_FAILED; - } + FAIL_IF_NULL(MdlPfnArray, "MmGetMdlPfnArray() failed for Mdl"); /* MmGetMdlVirtualAddress test */ MdlVirtAddr = NULL; MdlVirtAddr = MmGetMdlVirtualAddress(Mdl); - if (MdlVirtAddr == NULL) - { - strcpy(Buffer, "MmGetMdlVirtualAddress() failed for Mdl\n"); - return TS_FAILED; - } + FAIL_IF_NULL(MdlVirtAddr, "MmGetMdlVirtualAddress() failed for Mdl"); /* Free memory used in test */ ExFreePool(pmem1); @@ -74,15 +51,5 @@ static int RunTest(char *Buffer) int Mdl_1Test(int Command, char *Buffer) { - switch (Command) - { - case TESTCMD_RUN: - return RunTest(Buffer); - case TESTCMD_TESTNAME: - strcpy(Buffer, "Kernel Memory MDL API (1)"); - return TS_OK; - default: - break; - } - return TS_FAILED; + DISPATCHER("Kernel Memory MDL API (1)"); } diff --git a/reactos/regtests/kmregtests/tests/mdl-2.c b/reactos/regtests/kmregtests/tests/mdl-2.c index 75624b3e02b..2f4418e1bd2 100644 --- a/reactos/regtests/kmregtests/tests/mdl-2.c +++ b/reactos/regtests/kmregtests/tests/mdl-2.c @@ -7,56 +7,36 @@ static int RunTest(char *Buffer) { VOID *pmem1, *sysaddr1, *sysaddr2; ULONG AllocSize; + BOOLEAN BoolVal; PMDL Mdl; /* Allocate memory for use in testing */ AllocSize = 1024; - pmem1 = ExAllocatePool(NonPagedPool, - AllocSize); + pmem1 = ExAllocatePool(NonPagedPool, AllocSize); /* MmCreateMdl test */ Mdl = NULL; - Mdl = MmCreateMdl(NULL, - pmem1, - AllocSize); - if (Mdl == NULL) - { - strcpy(Buffer, "MmCreateMdl() failed for Mdl\n"); - return TS_FAILED; - } + Mdl = MmCreateMdl(NULL, pmem1, AllocSize); + FAIL_IF_NULL(Mdl, "MmCreateMdl() failed for Mdl"); /* MmBuildMdlForNonPagedPool test */ MmBuildMdlForNonPagedPool(Mdl); /* MmGetSystemAddressForMdl test for buffer built by MmBuildMdlForNonPagedPool */ sysaddr1 = MmGetSystemAddressForMdl(Mdl); - if (sysaddr1 == NULL) - { - strcpy(Buffer, "MmGetSystemAddressForMdl() failed for Mdl after MmBuildMdlForNonPagedPool\n"); - return TS_FAILED; - } + FAIL_IF_NULL(sysaddr1, "MmGetSystemAddressForMdl() failed for Mdl after MmBuildMdlForNonPagedPool"); /* MmIsNonPagedSystemAddressValid test */ - if (MmIsNonPagedSystemAddressValid(sysaddr1) == FALSE) - { - strcpy(Buffer, "MmIsNonPagedSystemAddressValid() failed for Mdl for sysaddr1\n"); - return TS_FAILED; - } + BoolVal = MmIsNonPagedSystemAddressValid(sysaddr1); + FAIL_IF_FALSE(BoolVal, "MmIsNonPagedSystemAddressValid() failed for Mdl for sysaddr1"); /* MmGetSystemAddressForMdlSafe test */ sysaddr2 = MmGetSystemAddressForMdlSafe(Mdl, HighPagePriority); - if (sysaddr2 == NULL) - { - strcpy(Buffer, "MmGetSystemAddressForMdlSafe() failed for Mdl after MmBuildMdlForNonPagedPool\n"); - return TS_FAILED; - } + FAIL_IF_NULL(sysaddr2, "MmGetSystemAddressForMdlSafe() failed for Mdl after MmBuildMdlForNonPagedPool"); /* MmIsNonPagedSystemAddressValid test */ - if (MmIsNonPagedSystemAddressValid(sysaddr2) == FALSE) - { - strcpy(Buffer, "MmIsNonPagedSystemAddressValid() failed for Mdl for sysaddr2\n"); - return TS_FAILED; - } + BoolVal = MmIsNonPagedSystemAddressValid(sysaddr2); + FAIL_IF_FALSE(BoolVal, "MmIsNonPagedSystemAddressValid() failed for Mdl for sysaddr2"); /* Free memory used in test */ ExFreePool(pmem1); @@ -67,15 +47,5 @@ static int RunTest(char *Buffer) int Mdl_2Test(int Command, char *Buffer) { - switch (Command) - { - case TESTCMD_RUN: - return RunTest(Buffer); - case TESTCMD_TESTNAME: - strcpy(Buffer, "Kernel Memory MDL API (2)"); - return TS_OK; - default: - break; - } - return TS_FAILED; + DISPATCHER("Kernel Memory MDL API (2)"); } diff --git a/reactos/regtests/kmregtests/tests/mm-1.c b/reactos/regtests/kmregtests/tests/mm-1.c index 3d7e94dd650..c69a77f92ae 100644 --- a/reactos/regtests/kmregtests/tests/mm-1.c +++ b/reactos/regtests/kmregtests/tests/mm-1.c @@ -9,19 +9,14 @@ static int RunTest(char *Buffer) PHYSICAL_ADDRESS LowestAcceptableAddress, HighestAcceptableAddress, BoundryAddressMultiple, PhysicalAddress; ULONG AllocSize1, AllocSize2, AllocSize3, AllocSize4, AllocSize5, MemSize; - BOOL Server; + BOOL Server, BoolVal; /* Various ways to allocate memory */ HighestAcceptableAddress.QuadPart = 0x00000000FFFFFF; /* 16MB */ AllocSize1 = 512; pmem1 = 0; - pmem1 = MmAllocateContiguousMemory(AllocSize1, - HighestAcceptableAddress); - if (pmem1 == 0) - { - strcpy(Buffer, "MmAllocateContiguousMemory() for pmem1 failed\n"); - return TS_FAILED; - } + pmem1 = MmAllocateContiguousMemory(AllocSize1, HighestAcceptableAddress); + FAIL_IF_EQUAL(pmem1, 0, "MmAllocateContiguousMemory() for pmem1 failed"); LowestAcceptableAddress.QuadPart = 0x00000000F00000; /* 15MB */ HighestAcceptableAddress.QuadPart = 0x00000000FFFFFF; /* 16MB */ @@ -29,15 +24,9 @@ static int RunTest(char *Buffer) AllocSize2 = 512; pmem2 = 0; pmem2 = MmAllocateContiguousMemorySpecifyCache(AllocSize2, - LowestAcceptableAddress, - HighestAcceptableAddress, - BoundryAddressMultiple, - MmNonCached); - if (pmem2 == 0) - { - strcpy(Buffer, "MmAllocateContiguousMemorySpecifyCache() for pmem2 failed\n"); - return TS_FAILED; - } + LowestAcceptableAddress, HighestAcceptableAddress, + BoundryAddressMultiple, MmNonCached); + FAIL_IF_EQUAL(pmem2, 0, "MmAllocateContiguousMemorySpecifyCache() for pmem2 failed"); LowestAcceptableAddress.QuadPart = 0x00000000000000; /* 15MB */ HighestAcceptableAddress.QuadPart = 0x0000000F000000; /* 250MB */ @@ -45,16 +34,9 @@ static int RunTest(char *Buffer) AllocSize3 = 512; pmem3 = 0; pmem3 = MmAllocateContiguousMemorySpecifyCache(AllocSize3, - LowestAcceptableAddress, - HighestAcceptableAddress, - BoundryAddressMultiple, - MmCached); - if (pmem3 == 0) - { - strcpy(Buffer, "MmAllocateContiguousMemorySpecifyCache() for pmem3 failed\n"); - return TS_FAILED; - } - + LowestAcceptableAddress, HighestAcceptableAddress, + BoundryAddressMultiple, MmCached); + FAIL_IF_EQUAL(pmem3, 0, "MmAllocateContiguousMemorySpecifyCache() for pmem3 failed"); LowestAcceptableAddress.QuadPart = 0x00000000000000; /* 0MB */ HighestAcceptableAddress.QuadPart = 0x00000000FFFFFF; /* 16MB */ @@ -62,85 +44,49 @@ static int RunTest(char *Buffer) AllocSize4 = 512; pmem4 = 0; pmem4 = MmAllocateContiguousMemorySpecifyCache(AllocSize4, - LowestAcceptableAddress, - HighestAcceptableAddress, - BoundryAddressMultiple, - MmWriteCombined); - if (pmem4 == 0) - { - strcpy(Buffer, "MmAllocateContiguousMemorySpecifyCache() for pmem4 failed\n"); - return TS_FAILED; - } + LowestAcceptableAddress, HighestAcceptableAddress, + BoundryAddressMultiple, MmWriteCombined); + FAIL_IF_EQUAL(pmem4, 0, "MmAllocateContiguousMemorySpecifyCache() for pmem4 failed"); AllocSize5 = 1048576; /* 1MB */ pmem5 = 0; pmem5 = MmAllocateNonCachedMemory(AllocSize5); - if (pmem5 == 0) - { - strcpy(Buffer, "MmAllocateNonCachedMemory() for pmem5 failed\n"); - return TS_FAILED; - } + FAIL_IF_EQUAL(pmem5, 0, "MmAllocateNonCachedMemory() for pmem5 failed"); /* Memory checking functions */ PhysicalAddress.QuadPart = 0; PhysicalAddress = MmGetPhysicalAddress(pmem1); - if (PhysicalAddress.QuadPart == 0) - { - strcpy(Buffer, "MmGetPhysicalAddress() failed\n"); - return TS_FAILED; - } + FAIL_IF_EQUAL(PhysicalAddress.QuadPart, 0, "MmGetPhysicalAddress() failed"); - if (MmIsAddressValid(pmem1) == FALSE) - { - strcpy(Buffer, "MmIsAddressValid() failed for pmem1\n"); - return TS_FAILED; - } - if (MmIsAddressValid(pmem2) == FALSE) - { - strcpy(Buffer, "MmIsAddressValid() failed for pmem2\n"); - return TS_FAILED; - } - if (MmIsAddressValid(pmem3) == FALSE) - { - strcpy(Buffer, "MmIsAddressValid() failed for pmem3\n"); - return TS_FAILED; - } - if (MmIsAddressValid(pmem4) == FALSE) - { - strcpy(Buffer, "MmIsAddressValid() failed for pmem4\n"); - return TS_FAILED; - } - if (MmIsAddressValid(pmem5) == FALSE) - { - strcpy(Buffer, "MmIsAddressValid() failed for pmem5\n"); - return TS_FAILED; - } + BoolVal = MmIsAddressValid(pmem1); + FAIL_IF_FALSE(BoolVal, "MmIsAddressValid() failed for pmem1"); - if (MmIsNonPagedSystemAddressValid(pmem1) == FALSE) - { - strcpy(Buffer, "MmIsAddressValid() failed for pmem1\n"); - return TS_FAILED; - } - if (MmIsNonPagedSystemAddressValid(pmem2) == FALSE) - { - strcpy(Buffer, "MmIsAddressValid() failed for pmem2\n"); - return TS_FAILED; - } - if (MmIsNonPagedSystemAddressValid(pmem3) == FALSE) - { - strcpy(Buffer, "MmIsAddressValid() failed for pmem3\n"); - return TS_FAILED; - } - if (MmIsNonPagedSystemAddressValid(pmem4) == FALSE) - { - strcpy(Buffer, "MmIsAddressValid() failed for pmem4\n"); - return TS_FAILED; - } - if (MmIsNonPagedSystemAddressValid(pmem5) == FALSE) - { - strcpy(Buffer, "MmIsAddressValid() failed for pmem5\n"); - return TS_FAILED; - } + BoolVal = MmIsAddressValid(pmem2); + FAIL_IF_FALSE(BoolVal, "MmIsAddressValid() failed for pmem2"); + + BoolVal = MmIsAddressValid(pmem3); + FAIL_IF_FALSE(BoolVal, "MmIsAddressValid() failed for pmem3"); + + BoolVal = MmIsAddressValid(pmem4); + FAIL_IF_FALSE(BoolVal, "MmIsAddressValid() failed for pmem4"); + + BoolVal = MmIsAddressValid(pmem5); + FAIL_IF_FALSE(BoolVal, "MmIsAddressValid() failed for pmem5"); + + BoolVal = MmIsNonPagedSystemAddressValid(pmem1); + FAIL_IF_FALSE(BoolVal, "MmIsAddressValid() failed for pmem1"); + + BoolVal = MmIsNonPagedSystemAddressValid(pmem2); + FAIL_IF_FALSE(BoolVal, "MmIsAddressValid() failed for pmem2"); + + BoolVal = MmIsNonPagedSystemAddressValid(pmem3); + FAIL_IF_FALSE(BoolVal, "MmIsAddressValid() failed for pmem3"); + + BoolVal = MmIsNonPagedSystemAddressValid(pmem4); + FAIL_IF_FALSE(BoolVal, "MmIsAddressValid() failed for pmem4"); + + BoolVal = MmIsNonPagedSystemAddressValid(pmem5); + FAIL_IF_FALSE(BoolVal, "MmIsAddressValid() failed for pmem5"); /* Misc functions */ Server = MmIsThisAnNtAsSystem(); @@ -174,15 +120,5 @@ static int RunTest(char *Buffer) int Mm_1Test(int Command, char *Buffer) { - switch (Command) - { - case TESTCMD_RUN: - return RunTest(Buffer); - case TESTCMD_TESTNAME: - strcpy(Buffer, "Kernel Core Memory API"); - return TS_OK; - default: - break; - } - return TS_FAILED; + DISPATCHER("Kernel Core Memory API"); } diff --git a/reactos/regtests/shared/regtests.h b/reactos/regtests/shared/regtests.h index 96572c4e5d0..1595a5730fd 100755 --- a/reactos/regtests/shared/regtests.h +++ b/reactos/regtests/shared/regtests.h @@ -17,6 +17,32 @@ #define TS_OK 0 #define TS_FAILED 1 +/* Macros to simplify tests */ +#define DISPATCHER(TestName) \ + switch (Command) \ + { \ + case TESTCMD_RUN: \ + return RunTest(Buffer); \ + case TESTCMD_TESTNAME: \ + strcpy(Buffer, TestName); \ + return TS_OK; \ + default: \ + break; \ + } \ + return TS_FAILED; + +#define FAIL(ErrorMessage) \ + sprintf(Buffer, "%s\n", ErrorMessage); \ + return TS_FAILED; + +#define FAIL_IF_NULL(GivenValue, ErrorMessage) if (GivenValue == NULL) { FAIL(ErrorMessage); } +#define FAIL_IF_TRUE(GivenValue, ErrorMessage) if (GivenValue == TRUE) { FAIL(ErrorMessage); } +#define FAIL_IF_FALSE(GivenValue, ErrorMessage) if (GivenValue == FALSE) { FAIL(ErrorMessage); } +#define FAIL_IF_EQUAL(GivenValue, FailValue, ErrorMessage) if (GivenValue == FailValue) { FAIL(ErrorMessage); } +#define FAIL_IF_NOT_EQUAL(GivenValue, FailValue, ErrorMessage) if (GivenValue != FailValue) { FAIL(ErrorMessage); } +#define FAIL_IF_LESS_EQUAL(GivenValue, FailValue, ErrorMessage) if (GivenValue <= FailValue) { FAIL(ErrorMessage); } +#define FAIL_IF_GREATER_EQUAL(GivenValue, FailValue, ErrorMessage) if (GivenValue >= FailValue) { FAIL(ErrorMessage); } + /* * Test routine prototype * Command - The command to process From 3f814d383784d85ff6163ccbc119af7044d8be44 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Wed, 28 Apr 2004 12:55:21 +0000 Subject: [PATCH 0970/1463] Sorry about that it took so long to commit this file - I was installing a new HDD -> means a new OS installation, etc. svn path=/trunk/; revision=9234 --- reactos/lib/mmdrv/auxil.c | 78 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 reactos/lib/mmdrv/auxil.c diff --git a/reactos/lib/mmdrv/auxil.c b/reactos/lib/mmdrv/auxil.c new file mode 100644 index 00000000000..c4f6308060c --- /dev/null +++ b/reactos/lib/mmdrv/auxil.c @@ -0,0 +1,78 @@ +/* + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Multimedia + * FILE: lib/mmdrv/auxil.c + * PURPOSE: Multimedia User Mode Driver + * PROGRAMMER: Andrew Greenwood + * Aleksey Bragin + * UPDATE HISTORY: + * Mar 16, 2004: Created skeleton implementation + */ + +#include "mmdrv.h" + + +APIENTRY DWORD auxMessage(UINT uDevice, + UINT uMessage, + DWORD dwUser, + DWORD dwParam1, + DWORD dwParam2) + +{ + printf("auxMessage\n"); + + // the following cases are documented by DDK + switch (uMessage) + { + case AUXDM_GETDEVCAPS: + return 0; + case AUXDM_GETNUMDEVS: + return 0; + case AUXDM_GETVOLUME: + return 0; + case AUXDM_SETVOLUME: + return 0; + } + + 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 47b812dde4ac5ba2a344b0ea28fc8b766b3adb1d Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Wed, 28 Apr 2004 18:38:07 +0000 Subject: [PATCH 0971/1463] - Simplified handling of palettes selected into device contexts. Now DC->w.hPalette should always point to palette object and shoudn't be NULL. - Fixed bitfield conversion when creating Color -> Mono XLATEOBJs. Fixes bug #275. svn path=/trunk/; revision=9235 --- reactos/subsys/win32k/eng/xlate.c | 6 ++--- reactos/subsys/win32k/objects/bitmaps.c | 32 +------------------------ reactos/subsys/win32k/objects/color.c | 14 +++++++++-- reactos/subsys/win32k/objects/dc.c | 13 +++++----- 4 files changed, 23 insertions(+), 42 deletions(-) diff --git a/reactos/subsys/win32k/eng/xlate.c b/reactos/subsys/win32k/eng/xlate.c index d9c54c9df8b..c139b944273 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.32 2004/04/09 20:39:10 navaraf Exp $ +/* $Id: xlate.c,v 1.33 2004/04/28 18:38:07 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -445,9 +445,9 @@ XLATEOBJ * STDCALL IntEngCreateMonoXlate( SourcePalGDI = PALETTE_LockPalette(PaletteSource); BitMasksFromPal(SourcePalType, SourcePalGDI, &XlateGDI->RedMask, &XlateGDI->BlueMask, &XlateGDI->GreenMask); - XlateGDI->RedShift = CalculateShift(0xFF0000) - CalculateShift(XlateGDI->RedMask); + XlateGDI->RedShift = CalculateShift(0xFF) - CalculateShift(XlateGDI->RedMask); XlateGDI->GreenShift = CalculateShift(0xFF00) - CalculateShift(XlateGDI->GreenMask); - XlateGDI->BlueShift = CalculateShift(0xFF) - CalculateShift(XlateGDI->BlueMask); + XlateGDI->BlueShift = CalculateShift(0xFF0000) - CalculateShift(XlateGDI->BlueMask); XlateGDI->BackgroundColor = ShiftAndMask(XlateGDI, BackgroundColor); PALETTE_UnlockPalette(PaletteSource); } diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index a1d49b6b695..71fb76aa4ea 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.70 2004/04/25 11:34:13 weiden Exp $ */ +/* $Id: bitmaps.c,v 1.71 2004/04/28 18:38:07 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -153,22 +153,10 @@ NtGdiBitBlt( } if (DCDest->w.hPalette != 0) - { DestPalette = DCDest->w.hPalette; - } - else - { - DestPalette = NtGdiGetStockObject(DEFAULT_PALETTE); - } if (UsesSource && DCSrc->w.hPalette != 0) - { SourcePalette = DCSrc->w.hPalette; - } - else - { - SourcePalette = NtGdiGetStockObject(DEFAULT_PALETTE); - } PalSourceGDI = PALETTE_LockPalette(SourcePalette); if (NULL == PalSourceGDI) @@ -319,13 +307,9 @@ NtGdiTransparentBlt( if(DCDest->w.hPalette) DestPalette = DCDest->w.hPalette; - else - DestPalette = NtGdiGetStockObject(DEFAULT_PALETTE); if(DCSrc->w.hPalette) SourcePalette = DCSrc->w.hPalette; - else - SourcePalette = NtGdiGetStockObject(DEFAULT_PALETTE); if(!(PalSourceGDI = PALETTE_LockPalette(SourcePalette))) { @@ -652,8 +636,6 @@ NtGdiGetPixel(HDC hDC, INT XPos, INT YPos) { if ( dc->w.hPalette != 0 ) Pal = dc->w.hPalette; - else - Pal = NtGdiGetStockObject(DEFAULT_PALETTE); PalGDI = PALETTE_LockPalette(Pal); if ( PalGDI ) { @@ -1203,22 +1185,10 @@ NtGdiStretchBlt( } if (DCDest->w.hPalette != 0) - { DestPalette = DCDest->w.hPalette; - } - else - { - DestPalette = NtGdiGetStockObject(DEFAULT_PALETTE); - } if (UsesSource && DCSrc->w.hPalette != 0) - { SourcePalette = DCSrc->w.hPalette; - } - else - { - SourcePalette = NtGdiGetStockObject(DEFAULT_PALETTE); - } PalSourceGDI = PALETTE_LockPalette(SourcePalette); if (NULL == PalSourceGDI) diff --git a/reactos/subsys/win32k/objects/color.c b/reactos/subsys/win32k/objects/color.c index aaa0baa8563..3011243c395 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.36 2004/04/09 20:03:20 navaraf Exp $ */ +/* $Id: color.c,v 1.37 2004/04/28 18:38:07 navaraf Exp $ */ // FIXME: Use PXLATEOBJ logicalToSystem instead of int *mapping @@ -167,7 +167,7 @@ COLORREF STDCALL NtGdiGetNearestColor(HDC hDC, dc = DC_LockDc(hDC); if (NULL != dc) { - HPALETTE hpal = (dc->w.hPalette) ? dc->w.hPalette : NtGdiGetStockObject(DEFAULT_PALETTE); + HPALETTE hpal = dc->w.hPalette; palGDI = (PPALGDI) PALETTE_LockPalette(hpal); if (!palGDI) { @@ -538,6 +538,15 @@ 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); + return RGB( + palPalEntry[index].peRed, + palPalEntry[index].peGreen, + palPalEntry[index].peBlue); +#else unsigned char spec_type = color >> 24; int i; PALETTEENTRY *COLOR_sysPal = (PALETTEENTRY*)ReturnSystemPalette(); @@ -559,6 +568,7 @@ COLORREF STDCALL COLOR_LookupNearestColor( PALETTEENTRY* palPalEntry, int size, 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 fcbb256d011..9dd8b4bc800 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.132 2004/04/25 20:05:30 weiden Exp $ +/* $Id: dc.c,v 1.133 2004/04/28 18:38:07 navaraf Exp $ * * DC.C - Device context functions * @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include "../eng/clip.h" @@ -1102,8 +1103,8 @@ NtGdiGetDCState(HDC hDC) newdc->w.hFirstBitmap = dc->w.hFirstBitmap; #if 0 newdc->w.hDevice = dc->w.hDevice; - newdc->w.hPalette = dc->w.hPalette; #endif + newdc->w.hPalette = dc->w.hPalette; newdc->w.totalExtent = dc->w.totalExtent; newdc->w.bitsPerPixel = dc->w.bitsPerPixel; newdc->w.ROPmode = dc->w.ROPmode; @@ -1271,6 +1272,8 @@ NtGdiSetDCState ( HDC hDC, HDC hDCSave ) NtGdiSetBkColor( hDC, dcs->w.backgroundColor); NtGdiSetTextColor( hDC, dcs->w.textColor); + NtGdiSelectPalette( hDC, dcs->w.hPalette, FALSE ); + #if 0 GDISelectPalette16( hDC, dcs->w.hPalette, FALSE ); #endif @@ -2085,6 +2088,8 @@ DC_AllocDC(PUNICODE_STRING Driver) NewDC->w.hFont = NtGdiGetStockObject(SYSTEM_FONT); TextIntRealizeFont(NewDC->w.hFont); + NewDC->w.hPalette = NtGdiGetStockObject(DEFAULT_PALETTE); + DC_UnlockDc(hDC); return hDC; @@ -2294,8 +2299,6 @@ IntGetDCColor(HDC hDC, ULONG Object) if(dc->w.hPalette) Pal = dc->w.hPalette; - else - Pal = NtGdiGetStockObject(DEFAULT_PALETTE); Result = CLR_INVALID; @@ -2432,8 +2435,6 @@ IntSetDCColor(HDC hDC, ULONG Object, COLORREF Color) if(dc->w.hPalette) Pal = dc->w.hPalette; - else - Pal = NtGdiGetStockObject(DEFAULT_PALETTE); Result = CLR_INVALID; From e9ee16d561a8d5400e6c9a50dbacf05597ca79ed Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Wed, 28 Apr 2004 20:20:00 +0000 Subject: [PATCH 0972/1463] - Fixed _chmod and _wchmod. svn path=/trunk/; revision=9236 --- reactos/lib/msvcrt/io/chmod.c | 33 +++++++++++++++++++-------------- reactos/lib/msvcrt/io/wchmod.c | 33 ++++++++++++++++++++------------- 2 files changed, 39 insertions(+), 27 deletions(-) diff --git a/reactos/lib/msvcrt/io/chmod.c b/reactos/lib/msvcrt/io/chmod.c index 08614ece0a1..7bff67f6228 100644 --- a/reactos/lib/msvcrt/io/chmod.c +++ b/reactos/lib/msvcrt/io/chmod.c @@ -14,28 +14,33 @@ int _chmod(const char* filename, mode_t mode) { DWORD FileAttributes = 0; + BOOLEAN Set = FALSE; + DPRINT("_chmod('%s', %x)\n", filename, mode); FileAttributes = GetFileAttributesA(filename); if ( FileAttributes == -1 ) { _dosmaperr(GetLastError()); return -1; - } + } if ( mode == 0 ) return -1; - - if ((mode & _S_IREAD) == _S_IREAD && (mode & _S_IWRITE) != _S_IWRITE) - FileAttributes &= FILE_ATTRIBUTE_READONLY; - else if (((mode & _S_IREAD) != _S_IREAD) && ((mode & _S_IWRITE) == _S_IWRITE)) - FileAttributes &= FILE_ATTRIBUTE_NORMAL; - else - FileAttributes &= FILE_ATTRIBUTE_NORMAL; - - if (SetFileAttributesA(filename, FileAttributes) == FALSE) { - _dosmaperr(GetLastError()); - return -1; + + if (mode & _S_IWRITE) { + if (FileAttributes & FILE_ATTRIBUTE_READONLY) { + FileAttributes &= ~FILE_ATTRIBUTE_READONLY; + Set = TRUE; } - - return 1; + } else { + if (!(FileAttributes & FILE_ATTRIBUTE_READONLY)) { + FileAttributes |= FILE_ATTRIBUTE_READONLY; + Set = TRUE; + } + } + if (Set && SetFileAttributesA(filename, FileAttributes) == FALSE) { + _dosmaperr(GetLastError()); + return -1; + } + return 0; } diff --git a/reactos/lib/msvcrt/io/wchmod.c b/reactos/lib/msvcrt/io/wchmod.c index 60f04ebdb40..7ac00622218 100644 --- a/reactos/lib/msvcrt/io/wchmod.c +++ b/reactos/lib/msvcrt/io/wchmod.c @@ -13,28 +13,35 @@ int _wchmod(const wchar_t* filename, mode_t mode) { DWORD FileAttributes = 0; + BOOLEAN Set = FALSE; + DPRINT("_wchmod('%S', %x)\n", filename, mode); FileAttributes = GetFileAttributesW(filename); if ( FileAttributes == -1 ) { - _dosmaperr(GetLastError()); + _dosmaperr(GetLastError()); return -1; - } + } if ( mode == 0 ) return -1; - if ((mode & _S_IREAD) == _S_IREAD && (mode & _S_IWRITE) != _S_IWRITE) - FileAttributes &= FILE_ATTRIBUTE_READONLY; - else if (((mode & _S_IREAD) != _S_IREAD) && ((mode & _S_IWRITE) == _S_IWRITE)) - FileAttributes &= FILE_ATTRIBUTE_NORMAL; - else - FileAttributes &= FILE_ATTRIBUTE_NORMAL; - - if (SetFileAttributesW(filename, FileAttributes) == FALSE) { - _dosmaperr(GetLastError()); - return -1; + if (mode & _S_IWRITE) { + if (FileAttributes & FILE_ATTRIBUTE_READONLY) { + FileAttributes &= ~FILE_ATTRIBUTE_READONLY; + Set = TRUE; } + } else { + if (!(FileAttributes & FILE_ATTRIBUTE_READONLY)) { + FileAttributes |= FILE_ATTRIBUTE_READONLY; + Set = TRUE; + } + } - return 1; + if (Set && SetFileAttributesW(filename, FileAttributes) == FALSE) { + _dosmaperr(GetLastError()); + return -1; + } + + return 0; } From 3c66806fb0da6bcc881667941874ed0c54f3575a Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Wed, 28 Apr 2004 20:42:01 +0000 Subject: [PATCH 0973/1463] - Call the DriverStartIo routine at DISPATCH_LEVEL in IoStartPacket. svn path=/trunk/; revision=9237 --- reactos/ntoskrnl/io/queue.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/io/queue.c b/reactos/ntoskrnl/io/queue.c index e7d73ced345..6b2e56dc09d 100644 --- a/reactos/ntoskrnl/io/queue.c +++ b/reactos/ntoskrnl/io/queue.c @@ -1,4 +1,4 @@ -/* $Id: queue.c,v 1.13 2003/07/10 15:47:00 royce Exp $ +/* $Id: queue.c,v 1.14 2004/04/28 20:42:01 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -134,13 +134,22 @@ IoStartPacket(PDEVICE_OBJECT DeviceObject, &Irp->Tail.Overlay.DeviceQueueEntry); } - IoReleaseCancelSpinLock(oldirql); if (!stat) { + IoReleaseCancelSpinLock(DISPATCH_LEVEL); DeviceObject->CurrentIrp = Irp; DeviceObject->DriverObject->DriverStartIo(DeviceObject,Irp); + if (oldirql < DISPATCH_LEVEL) + { + KeLowerIrql(oldirql); + } } + else + { + IoReleaseCancelSpinLock(oldirql); + } + } From a0588eb04b808c0467bb6175c6c619efad13b578 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Wed, 28 Apr 2004 20:46:03 +0000 Subject: [PATCH 0974/1463] - Set the offset for a physical page in MmGetPhysicalAddress. svn path=/trunk/; revision=9238 --- reactos/ntoskrnl/mm/i386/page.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/i386/page.c b/reactos/ntoskrnl/mm/i386/page.c index 340caaae5f0..b71e1a4b94c 100644 --- a/reactos/ntoskrnl/mm/i386/page.c +++ b/reactos/ntoskrnl/mm/i386/page.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: page.c,v 1.64 2004/04/10 22:36:07 gdalsnes Exp $ +/* $Id: page.c,v 1.65 2004/04/28 20:46:03 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/i386/page.c @@ -1356,6 +1356,7 @@ MmGetPhysicalAddress(PVOID vaddr) if (Pte & PA_PRESENT) { p.QuadPart = PAGE_MASK(Pte); + p.u.LowPart |= (ULONG_PTR)vaddr & (PAGE_SIZE - 1); } else { From 8111f57e17626025bf710f27117a6abbd4032f16 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Wed, 28 Apr 2004 20:50:02 +0000 Subject: [PATCH 0975/1463] - Dereference the idle process in some of the NtQuerySystemInformation functions. svn path=/trunk/; revision=9239 --- reactos/ntoskrnl/ex/sysinfo.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/ex/sysinfo.c b/reactos/ntoskrnl/ex/sysinfo.c index 434a557bfc1..1fc525c0ad8 100644 --- a/reactos/ntoskrnl/ex/sysinfo.c +++ b/reactos/ntoskrnl/ex/sysinfo.c @@ -1,4 +1,4 @@ -/* $Id: sysinfo.c,v 1.31 2004/04/26 05:46:35 jimtabor Exp $ +/* $Id: sysinfo.c,v 1.32 2004/04/28 20:50:02 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -446,7 +446,9 @@ QSI_DEF(SystemPerformanceInformation) Spi->FirstLevelTbFills = 0; /* FIXME */ Spi->SecondLevelTbFills = 0; /* FIXME */ Spi->SystemCalls = 0; /* FIXME */ - + + ObDereferenceObject(TheIdleProcess); + return (STATUS_SUCCESS); } @@ -653,6 +655,8 @@ QSI_DEF(SystemProcessorPerformanceInformation) Spi->TotalDPCTime.QuadPart = KiDpcTime * 100000; Spi->TotalInterruptTime = CurrentTime; Spi->TotalInterrupts = CurrentTime.QuadPart / 100000; // Interrupt Count + + ObDereferenceObject(TheIdleProcess); return (STATUS_SUCCESS); } @@ -831,6 +835,8 @@ QSI_DEF(SystemFullMemoryInformation) *Spi = MiMemoryConsumers[MC_USER].PagesUsed; + ObDereferenceObject(TheIdleProcess); + return (STATUS_SUCCESS); } From de1dd3b0d4a62917ee3c89966d666715c71397d4 Mon Sep 17 00:00:00 2001 From: Mike Nordell Date: Wed, 28 Apr 2004 23:46:26 +0000 Subject: [PATCH 0976/1463] stop kernel crashing on thread termination svn path=/trunk/; revision=9240 --- reactos/ntoskrnl/ps/kill.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/ps/kill.c b/reactos/ntoskrnl/ps/kill.c index 7bc7d5c3f57..e22774d860b 100644 --- a/reactos/ntoskrnl/ps/kill.c +++ b/reactos/ntoskrnl/ps/kill.c @@ -1,4 +1,4 @@ -/* $Id: kill.c,v 1.70 2004/01/05 14:28:21 weiden Exp $ +/* $Id: kill.c,v 1.71 2004/04/28 23:46:26 tamlin Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -252,7 +252,7 @@ PsTerminateOtherThread(PETHREAD Thread, { DPRINT("Unblocking thread\n"); Status = STATUS_THREAD_IS_TERMINATING; - PsUnblockThread(Thread, &Status); + KeRemoveAllWaitsThread(Thread, Status, TRUE); } } From 4056581a2164f0571bc0ad6d0ab21e6f148ec823 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Thu, 29 Apr 2004 14:41:26 +0000 Subject: [PATCH 0977/1463] Implement AddDesktopItem() and DeleteDesktopItem(). svn path=/trunk/; revision=9242 --- reactos/lib/userenv/desktop.c | 246 +++++++++++++++++++++++++++++++ reactos/lib/userenv/makefile | 8 +- reactos/lib/userenv/profile.c | 11 +- reactos/lib/userenv/userenv.def | 5 + reactos/lib/userenv/userenv.edf | 5 + reactos/w32api/include/userenv.h | 8 + 6 files changed, 278 insertions(+), 5 deletions(-) create mode 100644 reactos/lib/userenv/desktop.c diff --git a/reactos/lib/userenv/desktop.c b/reactos/lib/userenv/desktop.c new file mode 100644 index 00000000000..70a9fb6352f --- /dev/null +++ b/reactos/lib/userenv/desktop.c @@ -0,0 +1,246 @@ +/* $Id: desktop.c,v 1.1 2004/04/29 14:41:26 ekohl Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * FILE: lib/userenv/desktop.c + * PURPOSE: Desktop and start menu support functions. + * PROGRAMMER: Eric Kohl + */ + +#include +#include +#include +#include +#include + +#include "internal.h" + + +/* FUNCTIONS ***************************************************************/ + +static BOOL +GetDesktopPath (BOOL bCommonPath, + LPWSTR lpDesktopPath) +{ + WCHAR szPath[MAX_PATH]; + DWORD dwLength; + DWORD dwType; + HKEY hKey; + + DPRINT ("GetDesktopPath() called\n"); + + if (RegOpenKeyExW (HKEY_CURRENT_USER, + L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders", + 0, + KEY_ALL_ACCESS, + &hKey)) + { + DPRINT1 ("RegOpenKeyExW() failed\n"); + return FALSE; + } + + dwLength = MAX_PATH * sizeof(WCHAR); + if (RegQueryValueExW (hKey, + bCommonPath ? L"Common Desktop" : L"Desktop", + 0, + &dwType, + (LPBYTE)szPath, + &dwLength)) + { + DPRINT1 ("RegQueryValueExW() failed\n"); + RegCloseKey (hKey); + return FALSE; + } + + RegCloseKey (hKey); + + if (dwType == REG_EXPAND_SZ) + { + ExpandEnvironmentStringsW (szPath, + lpDesktopPath, + MAX_PATH); + } + else + { + wcscpy (lpDesktopPath, szPath); + } + + DPRINT ("GetDesktopPath() done\n"); + + return TRUE; +} + + +BOOL WINAPI +AddDesktopItemA (BOOL bCommonItem, + LPCSTR lpItemName, + LPCSTR lpArguments, + LPCSTR lpIconLocation, + INT iIcon, + LPCSTR lpWorkingDirectory, + WORD wHotKey, + INT iShowCmd) +{ + DPRINT1 ("AddDesktopItemA() not implemented!\n"); + return FALSE; +} + + +BOOL WINAPI +AddDesktopItemW (BOOL bCommonItem, + LPCWSTR lpItemName, + LPCWSTR lpArguments, + LPCWSTR lpIconLocation, + INT iIcon, + LPCWSTR lpWorkingDirectory, + WORD wHotKey, + INT iShowCmd) +{ + WCHAR szLinkPath[MAX_PATH]; + WCHAR szArguments[MAX_PATH]; + WCHAR szCommand[MAX_PATH]; + LPWSTR Ptr; + DWORD dwLength; + IShellLinkW* psl; + IPersistFile* ppf; + HRESULT hr; + BOOL bResult; + + DPRINT ("AddDesktopItemW() called\n"); + + bResult = FALSE; + + if (!GetDesktopPath (bCommonItem, szLinkPath)) + { + DPRINT1 ("GetDesktopPath() failed\n"); + return FALSE; + } + + DPRINT ("Desktop path: '%S'\n", szLinkPath); + + /* FIXME: Make sure the path exists */ + + wcscat (szLinkPath, L"\\"); + wcscat (szLinkPath, lpItemName); + wcscat (szLinkPath, L".lnk"); + DPRINT ("Link path: '%S'\n", szLinkPath); + + /* Split 'lpArguments' string into command and arguments */ + Ptr = wcschr (lpArguments, L' '); + DPRINT ("Ptr %p lpArguments %p\n", Ptr, lpArguments); + if (Ptr != NULL) + { + dwLength = (DWORD)(Ptr - lpArguments); + DPRINT ("dwLength %lu\n", dwLength); + memcpy (szCommand, lpArguments, dwLength * sizeof(WCHAR)); + szCommand[dwLength] = 0; + Ptr++; + wcscpy (szArguments, Ptr); + } + else + { + wcscpy (szCommand, lpArguments); + szArguments[0] = 0; + } + DPRINT ("szCommand: '%S'\n", szCommand); + DPRINT ("szArguments: '%S'\n", szArguments); + + CoInitialize(NULL); + + hr = CoCreateInstance(&CLSID_ShellLink, + NULL, + CLSCTX_INPROC_SERVER, + &IID_IShellLinkW, + (LPVOID*)&psl); + if (!SUCCEEDED(hr)) + { + CoUninitialize(); + return FALSE; + } + + hr = psl->lpVtbl->QueryInterface(psl, + &IID_IPersistFile, + (LPVOID*)&ppf); + if (SUCCEEDED(hr)) + { + psl->lpVtbl->SetDescription(psl, + lpItemName); + + psl->lpVtbl->SetPath(psl, + szCommand); + + psl->lpVtbl->SetArguments(psl, + szArguments); + + psl->lpVtbl->SetIconLocation(psl, + lpIconLocation, + iIcon); + + if (lpWorkingDirectory != NULL) + { + psl->lpVtbl->SetWorkingDirectory(psl, + lpWorkingDirectory); + } + else + { + psl->lpVtbl->SetWorkingDirectory(psl, + L"%HOMEDRIVE%%HOMEPATH%"); + } + + psl->lpVtbl->SetHotkey(psl, + wHotKey); + + psl->lpVtbl->SetShowCmd(psl, + iShowCmd); + + hr = ppf->lpVtbl->Save(ppf, + szLinkPath, + TRUE); + if (SUCCEEDED(hr)) + bResult = TRUE; + + ppf->lpVtbl->Release(ppf); + } + + psl->lpVtbl->Release(psl); + + CoUninitialize(); + + DPRINT ("AddDesktopItemW() done\n"); + + return bResult; +} + + +BOOL WINAPI +DeleteDesktopItemA (BOOL bCommonItem, + LPCSTR lpItemName) +{ + DPRINT1 ("DeleteDesktopItemA() not implemented!\n"); + return FALSE; +} + + +BOOL WINAPI +DeleteDesktopItemW (BOOL bCommonItem, + LPCWSTR lpItemName) +{ + WCHAR szLinkPath[MAX_PATH]; + + DPRINT ("DeleteDesktopItemW() called\n"); + + if (!GetDesktopPath (bCommonItem, szLinkPath)) + { + DPRINT1 ("GetDesktopPath() failed\n"); + return FALSE; + } + + wcscat (szLinkPath, L"\\"); + wcscat (szLinkPath, lpItemName); + wcscat (szLinkPath, L".lnk"); + DPRINT ("Link path: '%S'\n", szLinkPath); + + return DeleteFile (szLinkPath); +} + +/* EOF */ diff --git a/reactos/lib/userenv/makefile b/reactos/lib/userenv/makefile index 032ca9cbcf9..571786f411d 100644 --- a/reactos/lib/userenv/makefile +++ b/reactos/lib/userenv/makefile @@ -6,17 +6,17 @@ TARGET_NAME = userenv TARGET_BASE = 0x74850000 -TARGET_CFLAGS = -fno-builtin -D__USE_W32API +TARGET_CFLAGS = -fno-builtin -D__USE_W32API -D_WIN32_IE=0x0400 # require os code to explicitly request A/W version of structs/functions TARGET_CFLAGS += -DUNICODE -D_UNICODE -Wall -Werror TARGET_LFLAGS = -nostdlib -nostartfiles -TARGET_SDKLIBS = ntdll.a kernel32.a advapi32.a +TARGET_SDKLIBS = ntdll.a kernel32.a advapi32.a ole32.a wine_uuid.a -TARGET_OBJECTS = directory.o environment.o profile.o misc.o registry.o \ - setup.o userenv.o +TARGET_OBJECTS = desktop.o directory.o environment.o profile.o misc.o \ + registry.o setup.o userenv.o DEP_OBJECTS = $(TARGET_OBJECTS) diff --git a/reactos/lib/userenv/profile.c b/reactos/lib/userenv/profile.c index 664e24d02b7..d52872ecac8 100644 --- a/reactos/lib/userenv/profile.c +++ b/reactos/lib/userenv/profile.c @@ -1,4 +1,4 @@ -/* $Id: profile.c,v 1.9 2004/04/19 10:51:17 ekohl Exp $ +/* $Id: profile.c,v 1.10 2004/04/29 14:41:26 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -646,6 +646,15 @@ CheckForLoadedProfile (HANDLE hToken) } +BOOL WINAPI +LoadUserProfileA (HANDLE hToken, + LPPROFILEINFOA lpProfileInfo) +{ + DPRINT ("LoadUserProfileA() not implemented\n"); + return FALSE; +} + + BOOL WINAPI LoadUserProfileW (HANDLE hToken, LPPROFILEINFOW lpProfileInfo) diff --git a/reactos/lib/userenv/userenv.def b/reactos/lib/userenv/userenv.def index 8eb7e669068..4c52e97a033 100644 --- a/reactos/lib/userenv/userenv.def +++ b/reactos/lib/userenv/userenv.def @@ -3,12 +3,17 @@ EXPORTS InitializeProfiles@0 @100 NONAME CreateUserProfileA@8 @109 NONAME CreateUserProfileW@8 @110 NONAME +AddDesktopItemA@32 @113 NONAME +AddDesktopItemW@32 @114 NONAME +DeleteDesktopItemA@8 @115 NONAME +DeleteDesktopItemW@8 @116 NONAME CreateEnvironmentBlock@12 DestroyEnvironmentBlock@4 GetAllUsersProfileDirectoryW@8 GetDefaultUserProfileDirectoryW@8 GetProfilesDirectoryW@8 GetUserProfileDirectoryW@12 +LoadUserProfileA@8 LoadUserProfileW@8 UnloadUserProfile@8 ;EOF diff --git a/reactos/lib/userenv/userenv.edf b/reactos/lib/userenv/userenv.edf index 173edb76516..20a0169c053 100644 --- a/reactos/lib/userenv/userenv.edf +++ b/reactos/lib/userenv/userenv.edf @@ -3,12 +3,17 @@ EXPORTS InitializeProfiles=InitializeProfiles@0 @100 NONAME CreateUserProfileA=CreateUserProfileA@8 @109 NONAME CreateUserProfileW=CreateUserProfileW@8 @110 NONAME +AddDesktopItemA=AddDesktopItemA@32 @113 NONAME +AddDesktopItemW=AddDesktopItemW@32 @114 NONAME +DeleteDesktopItemA=DeleteDesktopItemA@8 @115 NONAME +DeleteDesktopItemW=DeleteDesktopItemW@8 @116 NONAME CreateEnvironmentBlock=CreateEnvironmentBlock@12 DestroyEnvironmentBlock=DestroyEnvironmentBlock@4 GetAllUsersProfileDirectoryW=GetAllUsersProfileDirectoryW@8 GetDefaultUserProfileDirectoryW=GetDefaultUserProfileDirectoryW@8 GetProfilesDirectoryW=GetProfilesDirectoryW@8 GetUserProfileDirectoryW=GetUserProfileDirectoryW@12 +LoadUserProfileA=LoadUserProfileA@8 LoadUserProfileW=LoadUserProfileW@8 UnloadUserProfile=UnloadUserProfile@8 ;EOF diff --git a/reactos/w32api/include/userenv.h b/reactos/w32api/include/userenv.h index 53d550b1165..3328758fe6c 100644 --- a/reactos/w32api/include/userenv.h +++ b/reactos/w32api/include/userenv.h @@ -40,6 +40,10 @@ typedef struct _PROFILEINFOW BOOL WINAPI InitializeProfiles (VOID); BOOL WINAPI CreateUserProfileA (PSID, LPCSTR); BOOL WINAPI CreateUserProfileW (PSID, LPCWSTR); +BOOL WINAPI AddDesktopItemA (BOOL, LPCSTR, LPCSTR, LPCSTR, INT, LPCSTR, WORD, INT); +BOOL WINAPI AddDesktopItemW (BOOL, LPCWSTR, LPCWSTR, LPCWSTR, INT, LPCWSTR, WORD, INT); +BOOL WINAPI DeleteDesktopItemA (BOOL, LPCSTR); +BOOL WINAPI DeleteDesktopItemW (BOOL, LPCWSTR); /* end private */ BOOL WINAPI LoadUserProfileA (HANDLE, LPPROFILEINFOA); BOOL WINAPI LoadUserProfileW (HANDLE, LPPROFILEINFOW); @@ -62,6 +66,8 @@ typedef PROFILEINFOW PROFILEINFO; typedef LPPROFILEINFOW LPPROFILEINFO; /* begin private */ #define CreateUserProfile CreateUserProfileW +#define AddDesktopItem AddDesktopItemW +#define DeleteDesktopItem DeleteDesktopItemW /* end private */ #define LoadUserProfile LoadUserProfileW #define GetAllUsersProfileDirectory GetAllUsersProfileDirectoryW @@ -73,6 +79,8 @@ typedef PROFILEINFOA PROFILEINFO; typedef LPPROFILEINFOA LPPROFILEINFO; /* begin private */ #define CreateUserProfile CreateUserProfileA +#define AddDesktopItem AddDesktopItemA +#define DeleteDesktopItem DeleteDesktopItemA /* end private */ #define LoadUserProfile LoadUserProfileA #define GetAllUsersProfileDirectory GetAllUsersProfileDirectoryA From 0419425cb7516f3b69db01129125d7266b7db120 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Thu, 29 Apr 2004 16:55:37 +0000 Subject: [PATCH 0978/1463] - Simplified the mapping of video memory. Now it works in Virtual PC 2004. svn path=/trunk/; revision=9243 --- reactos/drivers/video/miniport/vbe/vbemp.c | 49 +++++++--------------- 1 file changed, 16 insertions(+), 33 deletions(-) diff --git a/reactos/drivers/video/miniport/vbe/vbemp.c b/reactos/drivers/video/miniport/vbe/vbemp.c index 7f8a5a03d4e..1d40c57643d 100644 --- a/reactos/drivers/video/miniport/vbe/vbemp.c +++ b/reactos/drivers/video/miniport/vbe/vbemp.c @@ -343,7 +343,7 @@ VBEInitialize(PVOID HwDeviceExtension) VBEDeviceExtension->ModeNumbers[ModeCount] = ModeList[CurrentMode] | 0x4000; if (VbeModeInfo->XResolution == 640 && VbeModeInfo->YResolution == 480 && - VbeModeInfo->BitsPerPixel == 8) + VbeModeInfo->BitsPerPixel == 32) { DefaultMode = ModeCount; } @@ -588,47 +588,30 @@ VBEMapVideoMemory( PVIDEO_MEMORY_INFORMATION MapInformation, PSTATUS_BLOCK StatusBlock) { - KV86M_REGISTERS BiosRegisters; - PVBE_MODEINFO VbeModeInfo; PHYSICAL_ADDRESS FrameBuffer; ULONG inIoSpace = 0; StatusBlock->Information = sizeof(VIDEO_MEMORY_INFORMATION); - BiosRegisters.Eax = 0x4F01; - BiosRegisters.Ecx = DeviceExtension->ModeNumbers[DeviceExtension->CurrentMode]; - BiosRegisters.Edi = DeviceExtension->PhysicalAddress.QuadPart & 0xF; - BiosRegisters.Es = DeviceExtension->PhysicalAddress.QuadPart >> 4; - Ke386CallBios(0x10, &BiosRegisters); - VbeModeInfo = (PVBE_MODEINFO)DeviceExtension->TrampolineMemory; - if (BiosRegisters.Eax == 0x4F && - (VbeModeInfo->ModeAttributes & VBE_MODEATTR_LINEAR)) - { - FrameBuffer.QuadPart = VbeModeInfo->PhysBasePtr; - MapInformation->VideoRamBase = RequestedAddress->RequestedVirtualAddress; - MapInformation->VideoRamLength = ( - DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].XResolution * - DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].YResolution * - DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].BitsPerPixel - ) >> 3; + FrameBuffer.QuadPart = + DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].PhysBasePtr; + MapInformation->VideoRamBase = RequestedAddress->RequestedVirtualAddress; + MapInformation->VideoRamLength = ( + DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].XResolution * + DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].YResolution * + DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].BitsPerPixel + ) >> 3; - VideoPortMapMemory(DeviceExtension, FrameBuffer, - &MapInformation->VideoRamLength, &inIoSpace, - &MapInformation->VideoRamBase); + VideoPortMapMemory(DeviceExtension, FrameBuffer, + &MapInformation->VideoRamLength, &inIoSpace, + &MapInformation->VideoRamBase); - MapInformation->FrameBufferBase = MapInformation->VideoRamBase; - MapInformation->FrameBufferLength = MapInformation->VideoRamLength; + MapInformation->FrameBufferBase = MapInformation->VideoRamBase; + MapInformation->FrameBufferLength = MapInformation->VideoRamLength; - DeviceExtension->FrameBufferMemory = MapInformation->VideoRamBase; + DeviceExtension->FrameBufferMemory = MapInformation->VideoRamBase; - return TRUE; - } - else - { - DPRINT(("VBEMP: VBEMapVideoMemory Failed (%lx)\n", BiosRegisters.Eax)); - - return FALSE; - } + return TRUE; } /* From ed9f67afe7a5f0e1e86a35f77de7b0d0bdea2c02 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Thu, 29 Apr 2004 17:06:21 +0000 Subject: [PATCH 0979/1463] - Initialize the serial port to reasonable state after the detection. (Needed by Virtual PC) svn path=/trunk/; revision=9244 --- reactos/hal/halx86/kdbg.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/reactos/hal/halx86/kdbg.c b/reactos/hal/halx86/kdbg.c index 61e5d42d04d..6e55bc2cec9 100644 --- a/reactos/hal/halx86/kdbg.c +++ b/reactos/hal/halx86/kdbg.c @@ -1,4 +1,4 @@ -/* $Id: kdbg.c,v 1.7 2003/12/28 22:38:09 fireball Exp $ +/* $Id: kdbg.c,v 1.8 2004/04/29 17:06:21 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -34,6 +34,10 @@ #define SR_IER_ALL 0x0F #define SER_DLM(x) ((x)+1) #define SER_IIR(x) ((x)+2) +#define SER_FCR(x) ((x)+2) +#define SR_FCR_ENABLE_FIFO 0x01 +#define SR_FCR_CLEAR_RCVR 0x02 +#define SR_FCR_CLEAR_XMIT 0x04 #define SER_LCR(x) ((x)+3) #define SR_LCR_CS5 0x00 #define SR_LCR_CS6 0x01 @@ -118,7 +122,18 @@ KdpDoesComPortExist (PUCHAR BaseAddress) * equal to the lower nibble of the MCR (modem input bits) */ if ((msr & 0xF0) == 0xF0) + { + /* + * setup a resonable state for the port: + * enable fifo and clear recieve/transmit buffers + */ + WRITE_PORT_UCHAR (SER_FCR(BaseAddress), + (SR_FCR_ENABLE_FIFO | SR_FCR_CLEAR_RCVR | SR_FCR_CLEAR_XMIT)); + WRITE_PORT_UCHAR (SER_FCR(BaseAddress), 0); + READ_PORT_UCHAR (SER_RBR(BaseAddress)); + WRITE_PORT_UCHAR (SER_IER(BaseAddress), 0); found = TRUE; + } } /* restore MCR */ From ddcbbf2e8d5d4a7723521a9a13af5c1a2fd1f707 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Thu, 29 Apr 2004 20:26:35 +0000 Subject: [PATCH 0980/1463] implemented keybd_event(), mouse_event(), BlockInput() and SendInput() - the server side however isn't implemented yet svn path=/trunk/; revision=9245 --- reactos/include/win32k/ntuser.h | 12 +-- reactos/lib/user32/misc/stubs.c | 35 +------ reactos/lib/user32/windows/input.c | 63 +++++++++-- reactos/ntoskrnl/include/internal/ex.h | 3 + reactos/subsys/win32k/include/desktop.h | 3 + reactos/subsys/win32k/include/input.h | 6 ++ reactos/subsys/win32k/main/dllmain.c | 3 +- reactos/subsys/win32k/ntuser/input.c | 132 +++++++++++++++++++++++- reactos/subsys/win32k/ntuser/stubs.c | 25 +---- 9 files changed, 209 insertions(+), 73 deletions(-) diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index e69294d8278..9db51015fd3 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -72,10 +72,10 @@ NtUserBitBltSysBmp( DWORD Unknown6, DWORD Unknown7); -DWORD +BOOL STDCALL NtUserBlockInput( - DWORD Unknown0); + BOOL BlockIt); ULONG STDCALL @@ -1152,12 +1152,12 @@ DWORD STDCALL NtUserScrollWindowEx(HWND hWnd, INT dx, INT dy, const RECT *rect, const RECT *clipRect, HRGN hrgnUpdate, LPRECT rcUpdate, UINT flags); -DWORD +UINT STDCALL NtUserSendInput( - DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2); + UINT nInputs, + LPINPUT pInput, + INT cbSize); typedef struct tagNTUSERSENDMESSAGEINFO { diff --git a/reactos/lib/user32/misc/stubs.c b/reactos/lib/user32/misc/stubs.c index 7adac2d4d57..f58ef74e451 100644 --- a/reactos/lib/user32/misc/stubs.c +++ b/reactos/lib/user32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.58 2004/04/09 20:03:14 navaraf Exp $ +/* $Id: stubs.c,v 1.59 2004/04/29 20:26:35 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -250,39 +250,6 @@ WaitForInputIdle( return 0; } - -/* - * @unimplemented - */ -VOID -STDCALL -keybd_event( - BYTE bVk, - BYTE bScan, - DWORD dwFlags, - DWORD dwExtraInfo) - - -{ - UNIMPLEMENTED -} - - -/* - * @unimplemented - */ -VOID -STDCALL -mouse_event( - DWORD dwFlags, - DWORD dx, - DWORD dy, - DWORD cButtons, - DWORD dwExtraInfo) -{ - UNIMPLEMENTED -} - /****************************************************************************** * SetDebugErrorLevel [USER32.@] * Sets the minimum error level for generating debugging events diff --git a/reactos/lib/user32/windows/input.c b/reactos/lib/user32/windows/input.c index 426ab24fadb..88c168edff2 100644 --- a/reactos/lib/user32/windows/input.c +++ b/reactos/lib/user32/windows/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.23 2004/01/26 08:44:51 weiden Exp $ +/* $Id: input.c,v 1.24 2004/04/29 20:26:35 weiden Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/input.c @@ -62,13 +62,12 @@ ActivateKeyboardLayout(HKL hkl, /* - * @unimplemented + * @implemented */ BOOL STDCALL BlockInput(BOOL fBlockIt) { - UNIMPLEMENTED; - return FALSE; + return NtUserBlockInput(fBlockIt); } @@ -526,7 +525,7 @@ VkKeyScanW(WCHAR ch) /* - * @unimplemented + * @implemented */ UINT STDCALL @@ -535,8 +534,7 @@ SendInput( LPINPUT pInputs, int cbSize) { - UNIMPLEMENTED; - return 0; + return NtUserSendInput(nInputs, pInputs, cbSize); } /* @@ -559,4 +557,55 @@ PrivateCsrssAcquireOrReleaseInputOwnership(BOOL Release) NtUserAcquireOrReleaseInputOwnership(Release); } +/* + * @implemented + */ +VOID +STDCALL +keybd_event( + BYTE bVk, + BYTE bScan, + DWORD dwFlags, + ULONG_PTR dwExtraInfo) + + +{ + INPUT Input; + + Input.type = INPUT_KEYBOARD; + Input.ki.wVk = bVk; + Input.ki.wScan = bScan; + Input.ki.dwFlags = dwFlags; + Input.ki.time = 0; + Input.ki.dwExtraInfo = dwExtraInfo; + + NtUserSendInput(1, &Input, sizeof(INPUT)); +} + + +/* + * @implemented + */ +VOID +STDCALL +mouse_event( + DWORD dwFlags, + DWORD dx, + DWORD dy, + DWORD dwData, + ULONG_PTR dwExtraInfo) +{ + INPUT Input; + + Input.type = INPUT_MOUSE; + Input.mi.dx = dx; + Input.mi.dy = dy; + Input.mi.mouseData = dwData; + Input.mi.dwFlags = dwFlags; + Input.mi.time = 0; + Input.mi.dwExtraInfo = dwExtraInfo; + + NtUserSendInput(1, &Input, sizeof(INPUT)); +} + /* EOF */ diff --git a/reactos/ntoskrnl/include/internal/ex.h b/reactos/ntoskrnl/include/internal/ex.h index 633c262eea9..0775fc405e1 100644 --- a/reactos/ntoskrnl/include/internal/ex.h +++ b/reactos/ntoskrnl/include/internal/ex.h @@ -59,6 +59,7 @@ typedef struct _WINSTATION_OBJECT UINT CaretBlinkRate; HANDLE ShellWindow; HANDLE ShellListView; + BOOL DesktopLocked; struct _DESKTOP_OBJECT* ActiveDesktop; /* FIXME: Clipboard */ LIST_ENTRY HotKeyListHead; @@ -87,6 +88,8 @@ typedef struct _DESKTOP_OBJECT /* Handle of the desktop window. */ HANDLE DesktopWindow; HANDLE PrevActiveWindow; + /* Thread blocking input */ + PVOID BlockInputThread; } DESKTOP_OBJECT, *PDESKTOP_OBJECT; diff --git a/reactos/subsys/win32k/include/desktop.h b/reactos/subsys/win32k/include/desktop.h index 4ab292f46fe..565c673bdf0 100644 --- a/reactos/subsys/win32k/include/desktop.h +++ b/reactos/subsys/win32k/include/desktop.h @@ -46,6 +46,9 @@ IntShowDesktop(PDESKTOP_OBJECT Desktop, ULONG Width, ULONG Height); NTSTATUS FASTCALL IntHideDesktop(PDESKTOP_OBJECT Desktop); +#define IntIsActiveDesktop(Desktop) \ + ((Desktop)->WindowStation->ActiveDesktop == (Desktop)) + #endif /* _WIN32K_DESKTOP_H */ /* EOF */ diff --git a/reactos/subsys/win32k/include/input.h b/reactos/subsys/win32k/include/input.h index 4eae82a66c9..052dff854d0 100644 --- a/reactos/subsys/win32k/include/input.h +++ b/reactos/subsys/win32k/include/input.h @@ -10,5 +10,11 @@ InitKeyboardImpl(VOID); PUSER_MESSAGE_QUEUE W32kGetPrimitiveMessageQueue(VOID); PKBDTABLES W32kGetDefaultKeyLayout(VOID); VOID FASTCALL W32kKeyProcessMessage(LPMSG Msg, PKBDTABLES KeyLayout); +BOOL FASTCALL IntBlockInput(PW32THREAD W32Thread, BOOL BlockIt); +BOOL FASTCALL IntMouseInput(MOUSEINPUT *mi); +BOOL FASTCALL IntKeyboardInput(KEYBDINPUT *ki); + +#define ThreadHasInputAccess(W32Thread) \ + (TRUE) #endif /* _WIN32K_INPUT_H */ diff --git a/reactos/subsys/win32k/main/dllmain.c b/reactos/subsys/win32k/main/dllmain.c index 58daf9ef0e7..6acaadc50ed 100644 --- a/reactos/subsys/win32k/main/dllmain.c +++ b/reactos/subsys/win32k/main/dllmain.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: dllmain.c,v 1.68 2004/04/09 20:03:18 navaraf Exp $ +/* $Id: dllmain.c,v 1.69 2004/04/29 20:26:35 weiden Exp $ * * Entry Point for win32k.sys */ @@ -199,6 +199,7 @@ Win32kThreadCallback (struct _ETHREAD *Thread, RemoveTimersThread(Thread->Cid.UniqueThread); UnregisterThreadHotKeys(Thread); DestroyThreadWindows(Thread); + IntBlockInput(Win32Thread, FALSE); } return STATUS_SUCCESS; diff --git a/reactos/subsys/win32k/ntuser/input.c b/reactos/subsys/win32k/ntuser/input.c index 340b27a3f51..087b7221e1c 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.27 2004/02/10 18:11:12 navaraf Exp $ +/* $Id: input.c,v 1.28 2004/04/29 20:26:35 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -31,6 +31,7 @@ #include #include +#include #include #include #include @@ -470,4 +471,133 @@ NtUserDragDetect( return 0; } +BOOL FASTCALL +IntBlockInput(PW32THREAD W32Thread, BOOL BlockIt) +{ + PW32THREAD OldBlock; + ASSERT(W32Thread); + + if(W32Thread->IsExiting && BlockIt) + { + /* + * fail blocking if exiting the thread + */ + + return FALSE; + } + + /* + * FIXME - check access rights of the window station + * e.g. services running in the service window station cannot block input + */ + if(!ThreadHasInputAccess(W32Thread) || + !IntIsActiveDesktop(W32Thread->Desktop)) + { + SetLastWin32Error(ERROR_ACCESS_DENIED); + return FALSE; + } + + ASSERT(W32Thread->Desktop); + OldBlock = W32Thread->Desktop->BlockInputThread; + if(OldBlock) + { + if(OldBlock != W32Thread) + { + SetLastWin32Error(ERROR_ACCESS_DENIED); + return FALSE; + } + W32Thread->Desktop->BlockInputThread = (BlockIt ? W32Thread : NULL); + return OldBlock == NULL; + } + + W32Thread->Desktop->BlockInputThread = (BlockIt ? W32Thread : NULL); + return OldBlock == NULL; +} + +BOOL +STDCALL +NtUserBlockInput( + BOOL BlockIt) +{ + return IntBlockInput(PsGetWin32Thread(), BlockIt); +} + +BOOL FASTCALL +IntMouseInput(MOUSEINPUT *mi) +{ + return FALSE; +} + +BOOL FASTCALL +IntKeyboardInput(KEYBDINPUT *ki) +{ + return FALSE; +} + +UINT +STDCALL +NtUserSendInput( + UINT nInputs, + LPINPUT pInput, + INT cbSize) +{ + UINT cnt; + + if(!nInputs || !pInput || (cbSize != sizeof(INPUT))) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return 0; + } + + /* + * FIXME - check access rights of the window station + * e.g. services running in the service window station cannot block input + */ + if(!ThreadHasInputAccess(W32Thread) || + !IntIsActiveDesktop(PsGetWin32Thread()->Desktop)) + { + SetLastWin32Error(ERROR_ACCESS_DENIED); + return 0; + } + + cnt = 0; + while(nInputs--) + { + INPUT SafeInput; + NTSTATUS Status; + + Status = MmCopyFromCaller(&SafeInput, pInput++, sizeof(INPUT)); + if(!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return cnt; + } + + switch(SafeInput.type) + { + case INPUT_MOUSE: + if(IntMouseInput(&SafeInput.mi)) + { + cnt++; + } + break; + case INPUT_KEYBOARD: + if(IntKeyboardInput(&SafeInput.ki)) + { + cnt++; + } + break; + case INPUT_HARDWARE: + break; +#ifndef NDEBUG + default: + DPRINT1("SendInput(): Invalid input type: 0x%x\n", SafeInput.type); + break; +#endif + } + } + + return cnt; +} + /* EOF */ diff --git a/reactos/subsys/win32k/ntuser/stubs.c b/reactos/subsys/win32k/ntuser/stubs.c index 593aa3835c2..0f7455b9fe3 100644 --- a/reactos/subsys/win32k/ntuser/stubs.c +++ b/reactos/subsys/win32k/ntuser/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.44 2004/01/24 08:26:25 ekohl Exp $ +/* $Id: stubs.c,v 1.45 2004/04/29 20:26:35 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -54,17 +54,6 @@ NtUserBitBltSysBmp( return 0; } -DWORD -STDCALL -NtUserBlockInput( - DWORD Unknown0) -{ - UNIMPLEMENTED - - return 0; -} - - DWORD STDCALL NtUserCallHwnd( @@ -609,18 +598,6 @@ NtUserSBGetParms( return 0; } -DWORD -STDCALL -NtUserSendInput( - DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2) -{ - UNIMPLEMENTED - - return 0; -} - DWORD STDCALL NtUserSetConsoleReserveKeys( From 0f0200e106e9edf980cadb2bb3933b9a6f9ef841 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Thu, 29 Apr 2004 20:41:03 +0000 Subject: [PATCH 0981/1463] don't crash if no thread desktop set svn path=/trunk/; revision=9246 --- reactos/subsys/win32k/ntuser/input.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/input.c b/reactos/subsys/win32k/ntuser/input.c index 087b7221e1c..bbf71703487 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.28 2004/04/29 20:26:35 weiden Exp $ +/* $Id: input.c,v 1.29 2004/04/29 20:41:03 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -477,7 +477,7 @@ IntBlockInput(PW32THREAD W32Thread, BOOL BlockIt) PW32THREAD OldBlock; ASSERT(W32Thread); - if(W32Thread->IsExiting && BlockIt) + if(!W32Thread->Desktop || (W32Thread->IsExiting && BlockIt)) { /* * fail blocking if exiting the thread @@ -541,8 +541,17 @@ NtUserSendInput( LPINPUT pInput, INT cbSize) { + PW32THREAD W32Thread; UINT cnt; + W32Thread = PsGetWin32Thread(); + ASSERT(W32Thread); + + if(!W32Thread->Desktop) + { + return 0; + } + if(!nInputs || !pInput || (cbSize != sizeof(INPUT))) { SetLastWin32Error(ERROR_INVALID_PARAMETER); @@ -554,7 +563,7 @@ NtUserSendInput( * e.g. services running in the service window station cannot block input */ if(!ThreadHasInputAccess(W32Thread) || - !IntIsActiveDesktop(PsGetWin32Thread()->Desktop)) + !IntIsActiveDesktop(W32Thread->Desktop)) { SetLastWin32Error(ERROR_ACCESS_DENIED); return 0; From edbeb9c88b3344505ed80c370d5b922bd9ab93f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Thu, 29 Apr 2004 21:13:16 +0000 Subject: [PATCH 0982/1463] Implement DDE Execute: - Do required translations (KernelMode -> UserMode format, ASCII/Unicode) in GetMessage - Call window proc directly from DispatchMessage instead of via callback - Apply message filter to WM_PAINT and WM_NCPAINT messages - Implement marshalling of pointer lParams for PostMessage svn path=/trunk/; revision=9247 --- reactos/include/win32k/ntuser.h | 42 +- reactos/lib/user32/include/message.h | 14 + reactos/lib/user32/misc/ddeclient.c | 2 +- reactos/lib/user32/misc/ddeserver.c | 3 +- reactos/lib/user32/misc/dllmain.c | 2 + reactos/lib/user32/windows/message.c | 1085 ++++++++++++++++++---- reactos/lib/user32/windows/window.c | 49 +- reactos/subsys/win32k/include/msgqueue.h | 5 +- reactos/subsys/win32k/include/painting.h | 3 +- reactos/subsys/win32k/ntuser/keyboard.c | 8 +- reactos/subsys/win32k/ntuser/message.c | 846 +++++++++-------- reactos/subsys/win32k/ntuser/msgqueue.c | 16 +- reactos/subsys/win32k/ntuser/painting.c | 30 +- reactos/subsys/win32k/ntuser/timer.c | 4 +- 14 files changed, 1483 insertions(+), 626 deletions(-) create mode 100644 reactos/lib/user32/include/message.h diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index 9db51015fd3..ece27718a4c 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -384,9 +384,17 @@ NtUserDestroyCursorIcon( BOOLEAN STDCALL NtUserDestroyWindow(HWND Wnd); +typedef struct tagNTUSERDISPATCHMESSAGEINFO +{ + BOOL HandledByKernel; + BOOL Ansi; + WNDPROC Proc; + MSG Msg; +} NTUSERDISPATCHMESSAGEINFO, *PNTUSERDISPATCHMESSAGEINFO; + LRESULT STDCALL -NtUserDispatchMessage(CONST MSG* lpmsg); +NtUserDispatchMessage(PNTUSERDISPATCHMESSAGEINFO MsgInfo); BOOL STDCALL @@ -734,10 +742,16 @@ STDCALL NtUserGetListBoxInfo( DWORD Unknown0); +typedef struct tagNTUSERGETMESSAGEINFO +{ + MSG Msg; + ULONG LParamSize; +} NTUSERGETMESSAGEINFO, *PNTUSERGETMESSAGEINFO; + BOOL STDCALL NtUserGetMessage( - LPMSG lpMsg, + PNTUSERGETMESSAGEINFO MsgInfo, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax); @@ -1036,7 +1050,7 @@ NtUserPaintDesktop( BOOL STDCALL NtUserPeekMessage( - LPMSG lpMsg, + PNTUSERGETMESSAGEINFO MsgInfo, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, @@ -1717,6 +1731,28 @@ NtUserSetScrollBarInfo( LONG idObject, SETSCROLLBARINFO *info); +/* lParam of DDE messages */ +typedef struct tagKMDDEEXECUTEDATA +{ + HWND Sender; + HGLOBAL ClientMem; + /* BYTE Data[DataSize] */ +} KMDDEEXECUTEDATA, *PKMDDEEXECUTEDATA; + +typedef struct tagKMDDELPARAM +{ + BOOL Packed; + union + { + struct + { + UINT uiLo; + UINT uiHi; + } Packed; + LPARAM Unpacked; + } Value; +} KMDDELPARAM, *PKMDDELPARAM; + #endif /* __WIN32K_NTUSER_H */ /* EOF */ diff --git a/reactos/lib/user32/include/message.h b/reactos/lib/user32/include/message.h new file mode 100644 index 00000000000..7f1d9399bb0 --- /dev/null +++ b/reactos/lib/user32/include/message.h @@ -0,0 +1,14 @@ +/* $Id: message.h,v 1.1 2004/04/29 21:13:16 gvg Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS user32.dll + * FILE: include/message.h + * PURPOSE: Message management definitions + */ + +#ifndef LIB_USER32_INCLUDE_MESSAGE_H +#define LIB_USER32_INCLUDE_MESSAGE_H + +BOOL FASTCALL MessageInit(VOID); + +#endif /* LIB_USER32_INCLUDE_MESSAGE_H */ diff --git a/reactos/lib/user32/misc/ddeclient.c b/reactos/lib/user32/misc/ddeclient.c index 54af3c074ff..24b67237cd4 100644 --- a/reactos/lib/user32/misc/ddeclient.c +++ b/reactos/lib/user32/misc/ddeclient.c @@ -1340,7 +1340,7 @@ static LRESULT CALLBACK WDML_ClientProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPA } return (IsWindowUnicode(hwnd)) ? - DefWindowProcA(hwnd, iMsg, wParam, lParam) : DefWindowProcW(hwnd, iMsg, wParam, lParam); + DefWindowProcW(hwnd, iMsg, wParam, lParam) : DefWindowProcA(hwnd, iMsg, wParam, lParam); } /***************************************************************** diff --git a/reactos/lib/user32/misc/ddeserver.c b/reactos/lib/user32/misc/ddeserver.c index 29210b88121..8e3a28a9bbd 100644 --- a/reactos/lib/user32/misc/ddeserver.c +++ b/reactos/lib/user32/misc/ddeserver.c @@ -994,7 +994,8 @@ static LRESULT CALLBACK WDML_ServerConvProc(HWND hwndServer, UINT iMsg, WPARAM w } if (iMsg < WM_DDE_FIRST || iMsg > WM_DDE_LAST) { - return DefWindowProcA(hwndServer, iMsg, wParam, lParam); + return IsWindowUnicode(hwndServer) ? DefWindowProcW(hwndServer, iMsg, wParam, lParam) : + DefWindowProcA(hwndServer, iMsg, wParam, lParam); } EnterCriticalSection(&WDML_CritSect); diff --git a/reactos/lib/user32/misc/dllmain.c b/reactos/lib/user32/misc/dllmain.c index b636958f70a..15fbf11bc32 100644 --- a/reactos/lib/user32/misc/dllmain.c +++ b/reactos/lib/user32/misc/dllmain.c @@ -6,6 +6,7 @@ #include #include #include +#include #define _WIN32K_KAPI_H #include #include @@ -73,6 +74,7 @@ Init(VOID) User32TlsIndex = TlsAlloc(); MenuInit(); + MessageInit(); InitializeCriticalSection(&U32AccelCacheLock); InitializeCriticalSection(&gcsMPH); diff --git a/reactos/lib/user32/windows/message.c b/reactos/lib/user32/windows/message.c index 200c01a5740..b46f5af9604 100644 --- a/reactos/lib/user32/windows/message.c +++ b/reactos/lib/user32/windows/message.c @@ -1,4 +1,4 @@ -/* $Id: message.c,v 1.38 2004/04/10 00:54:35 navaraf Exp $ +/* $Id: message.c,v 1.39 2004/04/29 21:13:16 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -12,96 +12,329 @@ #include #include #include +#include +#include #define NTOS_MODE_USER #include -/* - * @implemented +/* DDE message exchange + * + * - Session initialization + * Client sends a WM_DDE_INITIATE message, usually a broadcast message. lParam of + * this message contains a pair of global atoms, the Application and Topic atoms. + * The client must destroy the atoms. + * Server window proc handles the WM_DDE_INITIATE message and if the Application + * and Topic atoms are recognized sends a WM_DDE_ACK message to the client. lParam + * of the reply message contains another pair of global atoms (Application and + * Topic again), which must be destroyed by the server. + * + * - Execute + * Client posts a WM_DDE_EXECUTE message to the server window. lParam of that message + * is a global memory handle containing the string to execute. After the command has + * been executed the server posts a WM_DDE_ACK message to the client, which contains + * a packed lParam which in turn contains that global memory handle. The client takes + * ownership of both the packed lParam (meaning it needs to call FreeDDElParam() on + * it and the global memory handle. + * This might work nice and easy in Win3.1, but things are more complicated for NT. + * Global memory handles in NT are not really global, they're still local to the + * process. So, what happens under the hood is that PostMessage must handle the + * WM_DDE_EXECUTE message specially. It will obtain the contents of the global memory + * area, repack that into a new structure together with the original memory handle + * and pass that off to the win32k. Win32k will marshall that data over to the target + * (server) process where it will be unpacked and stored in a newly allocated global + * memory area. The handle of that area will then be sent to the window proc, after + * storing it together with the "original" (client) handle in a table. + * The server will eventually post the WM_DDE_ACK response, containing the global + * memory handle it received. PostMessage must then lookup that memory handle (only + * valid in the server process) and replace it with the corresponding client memory + * handle. To avoid memory leaks, the server-side global memory block must be freed. + * Also, the WM_DDE_ACK lParam (a PackDDElParam() result) is unpacked and the + * individual components are handed to win32k.sys to post to the client side. Since + * the server side app hands over ownership of the packed lParam when it calls + * PostMessage(), the packed lParam needs to be freed on the server side too. + * When the WM_DDE_ACK message (containing the client-side global memory handle) + * arrives at the client side a new lParam is PackDDElParam()'ed and this is handed + * to the client side window proc which is expected to free/reuse it. */ -LPARAM -STDCALL -GetMessageExtraInfo(VOID) + +/* since the WM_DDE_ACK response to a WM_DDE_EXECUTE message should contain the handle + * to the memory handle, we keep track (in the server side) of all pairs of handle + * used (the client passes its value and the content of the memory handle), and + * the server stored both values (the client, and the local one, created after the + * content). When a ACK message is generated, the list of pair is searched for a + * matching pair, so that the client memory handle can be returned. + */ +typedef struct tagDDEPAIR { - return (LPARAM)NtUserCallNoParam(NOPARAM_ROUTINE_GETMESSAGEEXTRAINFO); + HGLOBAL ClientMem; + HGLOBAL ServerMem; +} DDEPAIR, *PDDEPAIR; + +static PDDEPAIR DdePairs = NULL; +static unsigned DdeNumAlloc = 0; +static unsigned DdeNumUsed = 0; +static CRITICAL_SECTION DdeCrst; + +static BOOL FASTCALL +DdeAddPair(HGLOBAL ClientMem, HGLOBAL ServerMem) +{ + unsigned i; + + EnterCriticalSection(&DdeCrst); + + /* now remember the pair of hMem on both sides */ + if (DdeNumUsed == DdeNumAlloc) + { +#define GROWBY 4 + PDDEPAIR New; + if (NULL != DdePairs) + { + New = HeapReAlloc(GetProcessHeap(), 0, DdePairs, + (DdeNumAlloc + GROWBY) * sizeof(DDEPAIR)); + } + else + { + New = HeapAlloc(GetProcessHeap(), 0, + (DdeNumAlloc + GROWBY) * sizeof(DDEPAIR)); + } + + if (NULL == New) + { + LeaveCriticalSection(&DdeCrst); + return FALSE; + } + DdePairs = New; + /* zero out newly allocated part */ + memset(&DdePairs[DdeNumAlloc], 0, GROWBY * sizeof(DDEPAIR)); + DdeNumAlloc += GROWBY; +#undef GROWBY + } + + for (i = 0; i < DdeNumAlloc; i++) + { + if (NULL == DdePairs[i].ServerMem) + { + DdePairs[i].ClientMem = ClientMem; + DdePairs[i].ServerMem = ServerMem; + DdeNumUsed++; + break; + } + } + LeaveCriticalSection(&DdeCrst); + + return TRUE; } - -/* - * @implemented - */ -DWORD -STDCALL -GetMessagePos(VOID) +static HGLOBAL FASTCALL +DdeGetPair(HGLOBAL ServerMem) { - PUSER32_THREAD_DATA ThreadData = User32GetThreadData(); - return(MAKELONG(ThreadData->LastMessage.pt.x, ThreadData->LastMessage.pt.y)); + unsigned i; + HGLOBAL Ret = NULL; + + EnterCriticalSection(&DdeCrst); + for (i = 0; i < DdeNumAlloc; i++) + { + if (DdePairs[i].ServerMem == ServerMem) + { + /* free this pair */ + DdePairs[i].ServerMem = 0; + DdeNumUsed--; + Ret = DdePairs[i].ClientMem; + break; + } + } + LeaveCriticalSection(&DdeCrst); + + return Ret; } - -/* - * @implemented - */ -LONG STDCALL -GetMessageTime(VOID) +static BOOL FASTCALL +MsgiUMToKMMessage(PMSG UMMsg, PMSG KMMsg, BOOL Posted) { - PUSER32_THREAD_DATA ThreadData = User32GetThreadData(); - return(ThreadData->LastMessage.time); + *KMMsg = *UMMsg; + + switch (UMMsg->message) + { + case WM_DDE_ACK: + { + PKMDDELPARAM DdeLparam; + DdeLparam = HeapAlloc(GetProcessHeap(), 0, sizeof(KMDDELPARAM)); + if (NULL == DdeLparam) + { + return FALSE; + } + if (Posted) + { + DdeLparam->Packed = TRUE; + if (! UnpackDDElParam(UMMsg->message, UMMsg->lParam, + &DdeLparam->Value.Packed.uiLo, + &DdeLparam->Value.Packed.uiHi)) + { + return FALSE; + } + if (0 != HIWORD(DdeLparam->Value.Packed.uiHi)) + { + /* uiHi should contain a hMem from WM_DDE_EXECUTE */ + HGLOBAL h = DdeGetPair((HGLOBAL) DdeLparam->Value.Packed.uiHi); + if (NULL != h) + { + GlobalFree((HGLOBAL) DdeLparam->Value.Packed.uiHi); + DdeLparam->Value.Packed.uiHi = (UINT) h; + } + } + FreeDDElParam(UMMsg->message, UMMsg->lParam); + } + else + { + DdeLparam->Packed = FALSE; + DdeLparam->Value.Unpacked = UMMsg->lParam; + } + KMMsg->lParam = (LPARAM) DdeLparam; + } + break; + case WM_DDE_EXECUTE: + { + SIZE_T Size; + PKMDDEEXECUTEDATA KMDdeExecuteData; + PVOID Data; + + Size = GlobalSize((HGLOBAL) UMMsg->lParam); + Data = GlobalLock((HGLOBAL) UMMsg->lParam); + if (NULL == Data) + { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + KMDdeExecuteData = HeapAlloc(GetProcessHeap(), 0, sizeof(KMDDEEXECUTEDATA) + Size); + if (NULL == KMDdeExecuteData) + { + SetLastError(ERROR_OUTOFMEMORY); + return FALSE; + } + KMDdeExecuteData->Sender = (HWND) UMMsg->wParam; + KMDdeExecuteData->ClientMem = (HGLOBAL) UMMsg->lParam; + memcpy((PVOID) (KMDdeExecuteData + 1), Data, Size); + KMMsg->wParam = sizeof(KMDDEEXECUTEDATA) + Size; + KMMsg->lParam = (LPARAM) KMDdeExecuteData; + GlobalUnlock((HGLOBAL) UMMsg->lParam); + } + break; + default: + break; + } + + return TRUE; } - -/* - * @unimplemented - */ -BOOL -STDCALL -InSendMessage(VOID) +static VOID FASTCALL +MsgiUMToKMCleanup(PMSG UMMsg, PMSG KMMsg) { - /* return(NtUserGetThreadState(THREADSTATE_INSENDMESSAGE) != ISMEX_NOSEND); */ - UNIMPLEMENTED; - return FALSE; + switch (KMMsg->message) + { + case WM_DDE_ACK: + case WM_DDE_EXECUTE: + HeapFree(GetProcessHeap(), 0, (LPVOID) KMMsg->lParam); + break; + default: + break; + } + + return; } - -/* - * @unimplemented - */ -DWORD -STDCALL -InSendMessageEx( - LPVOID lpReserved) +static BOOL FASTCALL +MsgiUMToKMReply(PMSG UMMsg, PMSG KMMsg, LRESULT *Result) { - /* return NtUserGetThreadState(THREADSTATE_INSENDMESSAGE); */ - UNIMPLEMENTED; - return 0; + MsgiUMToKMCleanup(UMMsg, KMMsg); + + return TRUE; } - -/* - * @unimplemented - */ -BOOL -STDCALL -ReplyMessage( - LRESULT lResult) +static BOOL FASTCALL +MsgiKMToUMMessage(PMSG KMMsg, PMSG UMMsg) { - UNIMPLEMENTED; - return FALSE; + *UMMsg = *KMMsg; + + switch (UMMsg->message) + { + case WM_DDE_ACK: + { + PKMDDELPARAM DdeLparam = (PKMDDELPARAM) KMMsg->lParam; + if (DdeLparam->Packed) + { + UMMsg->lParam = PackDDElParam(KMMsg->message, + DdeLparam->Value.Packed.uiLo, + DdeLparam->Value.Packed.uiHi); + } + else + { + UMMsg->lParam = DdeLparam->Value.Unpacked; + } + break; + } + case WM_DDE_EXECUTE: + { + PKMDDEEXECUTEDATA KMDdeExecuteData; + HGLOBAL GlobalData; + PVOID Data; + + KMDdeExecuteData = (PKMDDEEXECUTEDATA) KMMsg->lParam; + GlobalData = GlobalAlloc(GMEM_MOVEABLE, KMMsg->wParam - sizeof(KMDDEEXECUTEDATA)); + if (NULL == GlobalData) + { + return FALSE; + } + Data = GlobalLock(GlobalData); + if (NULL == Data) + { + GlobalFree(GlobalData); + return FALSE; + } + memcpy(Data, (PVOID) (KMDdeExecuteData + 1), KMMsg->wParam - sizeof(KMDDEEXECUTEDATA)); + GlobalUnlock(GlobalData); + if (! DdeAddPair(KMDdeExecuteData->ClientMem, GlobalData)) + { + GlobalFree(GlobalData); + return FALSE; + } + UMMsg->wParam = (WPARAM) KMDdeExecuteData->Sender; + UMMsg->lParam = (LPARAM) GlobalData; + } + break; + default: + break; + } + + return TRUE; } - -/* - * @implemented - */ -LPARAM -STDCALL -SetMessageExtraInfo( - LPARAM lParam) +static VOID FASTCALL +MsgiKMToUMCleanup(PMSG KMMsg, PMSG UMMsg) { - return NtUserSetMessageExtraInfo(lParam); + switch (KMMsg->message) + { + case WM_DDE_EXECUTE: +#ifdef TODO + HeapFree(GetProcessHeap(), 0, (LPVOID) KMMsg->lParam); + GlobalUnlock((HGLOBAL) UMMsg->lParam); +#endif + break; + default: + break; + } + + return; } +static BOOL FASTCALL +MsgiKMToUMReply(PMSG KMMsg, PMSG UMMsg, LRESULT *Result) +{ + MsgiKMToUMCleanup(KMMsg, UMMsg); -BOOL + return TRUE; +} + +static BOOL FASTCALL MsgiAnsiToUnicodeMessage(LPMSG UnicodeMsg, LPMSG AnsiMsg) { *UnicodeMsg = *AnsiMsg; @@ -196,7 +429,7 @@ MsgiAnsiToUnicodeMessage(LPMSG UnicodeMsg, LPMSG AnsiMsg) } -BOOL +static BOOL FASTCALL MsgiAnsiToUnicodeCleanup(LPMSG UnicodeMsg, LPMSG AnsiMsg) { switch (AnsiMsg->message) @@ -269,7 +502,7 @@ MsgiAnsiToUnicodeCleanup(LPMSG UnicodeMsg, LPMSG AnsiMsg) } -BOOL +static BOOL FASTCALL MsgiAnsiToUnicodeReply(LPMSG UnicodeMsg, LPMSG AnsiMsg, LRESULT *Result) { switch (AnsiMsg->message) @@ -304,104 +537,341 @@ MsgiAnsiToUnicodeReply(LPMSG UnicodeMsg, LPMSG AnsiMsg, LRESULT *Result) } -VOID STATIC -User32ConvertToAsciiMessage(UINT* Msg, WPARAM* wParam, LPARAM* lParam) +static BOOL FASTCALL +MsgiUnicodeToAnsiMessage(LPMSG AnsiMsg, LPMSG UnicodeMsg) { - switch((*Msg)) + *AnsiMsg = *UnicodeMsg; + + switch(UnicodeMsg->message) { - case WM_CREATE: - case WM_NCCREATE: - { - CREATESTRUCTA* CsA; - CREATESTRUCTW* CsW; - UNICODE_STRING UString; - ANSI_STRING AString; + case WM_CREATE: + case WM_NCCREATE: + { + CREATESTRUCTA* CsA; + CREATESTRUCTW* CsW; + UNICODE_STRING UString; + ANSI_STRING AString; + NTSTATUS Status; - CsW = (CREATESTRUCTW*)(*lParam); - CsA = RtlAllocateHeap(GetProcessHeap(), 0, sizeof(CREATESTRUCTA)); - memcpy(CsA, CsW, sizeof(CREATESTRUCTW)); + CsW = (CREATESTRUCTW*)(UnicodeMsg->lParam); + CsA = RtlAllocateHeap(GetProcessHeap(), 0, sizeof(CREATESTRUCTA)); + if (NULL == CsA) + { + return FALSE; + } + memcpy(CsA, CsW, sizeof(CREATESTRUCTW)); - RtlInitUnicodeString(&UString, CsW->lpszName); - RtlUnicodeStringToAnsiString(&AString, &UString, TRUE); - CsA->lpszName = AString.Buffer; - if (HIWORD((ULONG)CsW->lpszClass) != 0) - { - RtlInitUnicodeString(&UString, CsW->lpszClass); - RtlUnicodeStringToAnsiString(&AString, &UString, TRUE); - CsA->lpszClass = AString.Buffer; - } - (*lParam) = (LPARAM)CsA; - break; - } - case WM_SETTEXT: - { - ANSI_STRING AnsiString; - UNICODE_STRING UnicodeString; - RtlInitUnicodeString(&UnicodeString, (PWSTR) *lParam); - if (NT_SUCCESS(RtlUnicodeStringToAnsiString(&AnsiString, - &UnicodeString, - TRUE))) - { - *lParam = (LPARAM) AnsiString.Buffer; - } - break; - } + RtlInitUnicodeString(&UString, CsW->lpszName); + Status = RtlUnicodeStringToAnsiString(&AString, &UString, TRUE); + if (! NT_SUCCESS(Status)) + { + RtlFreeHeap(GetProcessHeap(), 0, CsA); + return FALSE; + } + CsA->lpszName = AString.Buffer; + if (HIWORD((ULONG)CsW->lpszClass) != 0) + { + RtlInitUnicodeString(&UString, CsW->lpszClass); + Status = RtlUnicodeStringToAnsiString(&AString, &UString, TRUE); + if (! NT_SUCCESS(Status)) + { + RtlInitAnsiString(&AString, CsA->lpszName); + RtlFreeAnsiString(&AString); + RtlFreeHeap(GetProcessHeap(), 0, CsA); + return FALSE; + } + CsA->lpszClass = AString.Buffer; + } + UnicodeMsg->lParam = (LPARAM)CsA; + break; + } + case WM_SETTEXT: + { + ANSI_STRING AnsiString; + UNICODE_STRING UnicodeString; + RtlInitUnicodeString(&UnicodeString, (PWSTR) UnicodeMsg->lParam); + if (! NT_SUCCESS(RtlUnicodeStringToAnsiString(&AnsiString, + &UnicodeString, + TRUE))) + { + return FALSE; + } + AnsiMsg->lParam = (LPARAM) AnsiString.Buffer; + break; + } } + + return TRUE; } -VOID STATIC -User32FreeAsciiConvertedMessage(UINT Msg, WPARAM wParam, LPARAM lParam) +static BOOL FASTCALL +MsgiUnicodeToAnsiCleanup(LPMSG AnsiMsg, LPMSG UnicodeMsg) { - switch(Msg) + switch(UnicodeMsg->message) + { + case WM_GETTEXT: + case WM_SETTEXT: + { + ANSI_STRING AString; + RtlInitAnsiString(&AString, (PSTR) AnsiMsg->lParam); + RtlFreeAnsiString(&AString); + break; + } + case WM_CREATE: + case WM_NCCREATE: + { + CREATESTRUCTA* Cs; + ANSI_STRING AString; + + Cs = (CREATESTRUCTA*) AnsiMsg->lParam; + RtlInitAnsiString(&AString, Cs->lpszName); + RtlFreeAnsiString(&AString); + if (HIWORD((ULONG)Cs->lpszClass) != 0) + { + RtlInitAnsiString(&AString, Cs->lpszClass); + RtlFreeAnsiString(&AString); + } + RtlFreeHeap(GetProcessHeap(), 0, Cs); + break; + } + } + + return TRUE; +} + + +static BOOL FASTCALL +MsgiUnicodeToAnsiReply(LPMSG AnsiMsg, LPMSG UnicodeMsg, LRESULT *Result) +{ + switch (UnicodeMsg->message) { case WM_GETTEXT: + case WM_ASKCBFORMATNAME: { - ANSI_STRING AnsiString; - UNICODE_STRING UnicodeString; - LPSTR TempString; - LPSTR InString; - InString = (LPSTR)lParam; - TempString = RtlAllocateHeap(GetProcessHeap(), 0, strlen(InString) + 1); - strcpy(TempString, InString); - RtlInitAnsiString(&AnsiString, TempString); - UnicodeString.Length = wParam * sizeof(WCHAR); - UnicodeString.MaximumLength = wParam * sizeof(WCHAR); - UnicodeString.Buffer = (PWSTR)lParam; - if (! NT_SUCCESS(RtlAnsiStringToUnicodeString(&UnicodeString, - &AnsiString, - FALSE))) - { - if (1 <= wParam) - { - UnicodeString.Buffer[0] = L'\0'; - } - } - RtlFreeHeap(GetProcessHeap(), 0, TempString); - break; + LPSTR Buffer = (LPSTR) AnsiMsg->lParam; + LPWSTR UBuffer = (LPWSTR) UnicodeMsg->lParam; + if (0 < AnsiMsg->wParam && + ! MultiByteToWideChar(CP_ACP, 0, Buffer, -1, UBuffer, UnicodeMsg->wParam)) + { + UBuffer[AnsiMsg->wParam - 1] = L'\0'; + } + break; } - case WM_SETTEXT: - { - ANSI_STRING AnsiString; - RtlInitAnsiString(&AnsiString, (PSTR) lParam); - RtlFreeAnsiString(&AnsiString); - break; - } - case WM_CREATE: - case WM_NCCREATE: - { - CREATESTRUCTA* Cs; - Cs = (CREATESTRUCTA*)lParam; - RtlFreeHeap(GetProcessHeap(), 0, (LPSTR)Cs->lpszName); - if (HIWORD((ULONG)Cs->lpszClass) != 0) - { - RtlFreeHeap(GetProcessHeap(), 0, (LPSTR)Cs->lpszClass); - } - RtlFreeHeap(GetProcessHeap(), 0, Cs); - break; + case WM_GETTEXTLENGTH: + case CB_GETLBTEXTLEN: + case LB_GETTEXTLEN: + { + /* FIXME: There may be one DBCS char for each Unicode char */ + *Result /= sizeof(WCHAR); + break; } } + + MsgiUnicodeToAnsiCleanup(UnicodeMsg, AnsiMsg); + + return TRUE; +} + +typedef struct tagMSGCONVERSION +{ + BOOL InUse; + BOOL Ansi; + MSG KMMsg; + MSG UnicodeMsg; + MSG AnsiMsg; + PMSG FinalMsg; + ULONG LParamSize; +} MSGCONVERSION, *PMSGCONVERSION; + +static PMSGCONVERSION MsgConversions = NULL; +static unsigned MsgConversionNumAlloc = 0; +static unsigned MsgConversionNumUsed = 0; +static CRITICAL_SECTION MsgConversionCrst; + +static BOOL FASTCALL +MsgConversionAdd(PMSGCONVERSION Conversion) +{ + unsigned i; + + EnterCriticalSection(&MsgConversionCrst); + + if (MsgConversionNumUsed == MsgConversionNumAlloc) + { +#define GROWBY 4 + PMSGCONVERSION New; + if (NULL != MsgConversions) + { + New = HeapReAlloc(GetProcessHeap(), 0, MsgConversions, + (MsgConversionNumAlloc + GROWBY) * sizeof(MSGCONVERSION)); + } + else + { + New = HeapAlloc(GetProcessHeap(), 0, + (MsgConversionNumAlloc + GROWBY) * sizeof(MSGCONVERSION)); + } + + if (NULL == New) + { + LeaveCriticalSection(&MsgConversionCrst); + return FALSE; + } + MsgConversions = New; + /* zero out newly allocated part */ + memset(MsgConversions + MsgConversionNumAlloc, 0, GROWBY * sizeof(MSGCONVERSION)); + MsgConversionNumAlloc += GROWBY; +#undef GROWBY + } + + for (i = 0; i < MsgConversionNumAlloc; i++) + { + if (! MsgConversions[i].InUse) + { + MsgConversions[i] = *Conversion; + MsgConversions[i].InUse = TRUE; + MsgConversionNumUsed++; + break; + } + } + LeaveCriticalSection(&MsgConversionCrst); + + return TRUE; +} + +static void FASTCALL +MsgConversionCleanup(CONST MSG *Msg, BOOL Ansi, BOOL CheckMsgContents, LRESULT *Result) +{ + BOOL Found; + PMSGCONVERSION Conversion; + LRESULT Dummy; + + EnterCriticalSection(&MsgConversionCrst); + for (Conversion = MsgConversions; + Conversion < MsgConversions + MsgConversionNumAlloc; + Conversion++) + { + if (Conversion->InUse && + ((Ansi && Conversion->Ansi) || + (! Ansi && ! Conversion->Ansi))) + { + Found = (Conversion->FinalMsg == Msg); + if (! Found && CheckMsgContents) + { + if (Ansi) + { + Found = (0 == memcmp(Msg, &Conversion->AnsiMsg, sizeof(MSG))); + } + else + { + Found = (0 == memcmp(Msg, &Conversion->UnicodeMsg, sizeof(MSG))); + } + } + if (Found) + { + if (Ansi) + { + MsgiUnicodeToAnsiReply(&Conversion->AnsiMsg, &Conversion->UnicodeMsg, + NULL == Result ? &Dummy : Result); + } + MsgiKMToUMReply(&Conversion->KMMsg, &Conversion->UnicodeMsg, + NULL == Result ? &Dummy : Result); + if (0 != Conversion->LParamSize) + { + NtFreeVirtualMemory(NtCurrentProcess(), (PVOID *) &Conversion->KMMsg.lParam, + &Conversion->LParamSize, MEM_DECOMMIT); + } + Conversion->InUse = FALSE; + MsgConversionNumUsed--; + } + } + } + LeaveCriticalSection(&MsgConversionCrst); +} + +/* + * @implemented + */ +LPARAM +STDCALL +GetMessageExtraInfo(VOID) +{ + return (LPARAM)NtUserCallNoParam(NOPARAM_ROUTINE_GETMESSAGEEXTRAINFO); +} + + +/* + * @implemented + */ +DWORD +STDCALL +GetMessagePos(VOID) +{ + PUSER32_THREAD_DATA ThreadData = User32GetThreadData(); + return(MAKELONG(ThreadData->LastMessage.pt.x, ThreadData->LastMessage.pt.y)); +} + + +/* + * @implemented + */ +LONG STDCALL +GetMessageTime(VOID) +{ + PUSER32_THREAD_DATA ThreadData = User32GetThreadData(); + return(ThreadData->LastMessage.time); +} + + +/* + * @unimplemented + */ +BOOL +STDCALL +InSendMessage(VOID) +{ + /* return(NtUserGetThreadState(THREADSTATE_INSENDMESSAGE) != ISMEX_NOSEND); */ + UNIMPLEMENTED; + return FALSE; +} + + +/* + * @unimplemented + */ +DWORD +STDCALL +InSendMessageEx( + LPVOID lpReserved) +{ + /* return NtUserGetThreadState(THREADSTATE_INSENDMESSAGE); */ + UNIMPLEMENTED; + return 0; +} + + +/* + * @unimplemented + */ +BOOL +STDCALL +ReplyMessage( + LRESULT lResult) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/* + * @implemented + */ +LPARAM +STDCALL +SetMessageExtraInfo( + LPARAM lParam) +{ + return NtUserSetMessageExtraInfo(lParam); } LRESULT FASTCALL @@ -412,13 +882,25 @@ IntCallWindowProcW(BOOL IsAnsiProc, WPARAM wParam, LPARAM lParam) { + MSG AnsiMsg; + MSG UnicodeMsg; LRESULT Result; if (IsAnsiProc) { - User32ConvertToAsciiMessage(&Msg, &wParam, &lParam); - Result = WndProc(hWnd, Msg, wParam, lParam); - User32FreeAsciiConvertedMessage(Msg, wParam, lParam); + UnicodeMsg.hwnd = hWnd; + UnicodeMsg.message = Msg; + UnicodeMsg.wParam = wParam; + UnicodeMsg.lParam = lParam; + if (! MsgiUnicodeToAnsiMessage(&AnsiMsg, &UnicodeMsg)) + { + return FALSE; + } + Result = WndProc(AnsiMsg.hwnd, AnsiMsg.message, AnsiMsg.wParam, AnsiMsg.lParam); + if (! MsgiUnicodeToAnsiReply(&AnsiMsg, &UnicodeMsg, &Result)) + { + return FALSE; + } return Result; } else @@ -525,7 +1007,21 @@ CallWindowProcW(WNDPROC lpPrevWndFunc, LRESULT STDCALL DispatchMessageA(CONST MSG *lpmsg) { - return(NtUserDispatchMessage(lpmsg)); + NTUSERDISPATCHMESSAGEINFO Info; + LRESULT Result; + + Info.Ansi = TRUE; + Info.Msg = *lpmsg; + Result = NtUserDispatchMessage(&Info); + if (! Info.HandledByKernel) + { + /* We need to send the message ourselves */ + Result = IntCallWindowProcA(Info.Ansi, Info.Proc, Info.Msg.hwnd, + Info.Msg.message, Info.Msg.wParam, Info.Msg.lParam); + } + MsgConversionCleanup(lpmsg, TRUE, TRUE, &Result); + + return Result; } @@ -535,7 +1031,21 @@ DispatchMessageA(CONST MSG *lpmsg) LRESULT STDCALL DispatchMessageW(CONST MSG *lpmsg) { - return(NtUserDispatchMessage((LPMSG)lpmsg)); + NTUSERDISPATCHMESSAGEINFO Info; + LRESULT Result; + + Info.Ansi = FALSE; + Info.Msg = *lpmsg; + Result = NtUserDispatchMessage(&Info); + if (! Info.HandledByKernel) + { + /* We need to send the message ourselves */ + Result = IntCallWindowProcW(Info.Ansi, Info.Proc, Info.Msg.hwnd, + Info.Msg.message, Info.Msg.wParam, Info.Msg.lParam); + } + MsgConversionCleanup(lpmsg, FALSE, TRUE, &Result); + + return Result; } @@ -549,14 +1059,38 @@ GetMessageA(LPMSG lpMsg, UINT wMsgFilterMax) { BOOL Res; + MSGCONVERSION Conversion; + NTUSERGETMESSAGEINFO Info; PUSER32_THREAD_DATA ThreadData = User32GetThreadData(); - Res = NtUserGetMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + MsgConversionCleanup(lpMsg, TRUE, FALSE, NULL); + Res = NtUserGetMessage(&Info, hWnd, wMsgFilterMin, wMsgFilterMax); + if (-1 == (int) Res) + { + return Res; + } + Conversion.LParamSize = Info.LParamSize; + Conversion.KMMsg = Info.Msg; + + if (! MsgiKMToUMMessage(&Conversion.KMMsg, &Conversion.UnicodeMsg)) + { + return (BOOL) -1; + } + if (! MsgiUnicodeToAnsiMessage(&Conversion.AnsiMsg, &Conversion.UnicodeMsg)) + { + MsgiKMToUMCleanup(&Info.Msg, &Conversion.UnicodeMsg); + return (BOOL) -1; + } + *lpMsg = Conversion.AnsiMsg; + Conversion.Ansi = TRUE; + Conversion.FinalMsg = lpMsg; + MsgConversionAdd(&Conversion); if (Res && lpMsg->message != WM_PAINT && lpMsg->message != WM_QUIT) { - ThreadData->LastMessage = *lpMsg; + ThreadData->LastMessage = Info.Msg; } - return(Res); + + return Res; } @@ -570,14 +1104,33 @@ GetMessageW(LPMSG lpMsg, UINT wMsgFilterMax) { BOOL Res; + MSGCONVERSION Conversion; + NTUSERGETMESSAGEINFO Info; PUSER32_THREAD_DATA ThreadData = User32GetThreadData(); - Res = NtUserGetMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + MsgConversionCleanup(lpMsg, FALSE, FALSE, NULL); + Res = NtUserGetMessage(&Info, hWnd, wMsgFilterMin, wMsgFilterMax); + if (-1 == (int) Res) + { + return Res; + } + Conversion.LParamSize = Info.LParamSize; + Conversion.KMMsg = Info.Msg; + + if (! MsgiKMToUMMessage(&Conversion.KMMsg, &Conversion.UnicodeMsg)) + { + return (BOOL) -1; + } + *lpMsg = Conversion.UnicodeMsg; + Conversion.Ansi = FALSE; + Conversion.FinalMsg = lpMsg; + MsgConversionAdd(&Conversion); if (Res && lpMsg->message != WM_PAINT && lpMsg->message != WM_QUIT) { - ThreadData->LastMessage = *lpMsg; + ThreadData->LastMessage = Info.Msg; } - return(Res); + + return Res; } @@ -592,14 +1145,38 @@ PeekMessageA(LPMSG lpMsg, UINT wRemoveMsg) { BOOL Res; + MSGCONVERSION Conversion; + NTUSERGETMESSAGEINFO Info; PUSER32_THREAD_DATA ThreadData = User32GetThreadData(); - Res = NtUserPeekMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); + MsgConversionCleanup(lpMsg, TRUE, FALSE, NULL); + Res = NtUserPeekMessage(&Info, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); + if (-1 == (int) Res || ! Res) + { + return Res; + } + Conversion.LParamSize = Info.LParamSize; + Conversion.KMMsg = Info.Msg; + + if (! MsgiKMToUMMessage(&Conversion.KMMsg, &Conversion.UnicodeMsg)) + { + return (BOOL) -1; + } + if (! MsgiUnicodeToAnsiMessage(&Conversion.AnsiMsg, &Conversion.UnicodeMsg)) + { + MsgiKMToUMCleanup(&Info.Msg, &Conversion.UnicodeMsg); + return (BOOL) -1; + } + *lpMsg = Conversion.AnsiMsg; + Conversion.Ansi = TRUE; + Conversion.FinalMsg = lpMsg; + MsgConversionAdd(&Conversion); if (Res && lpMsg->message != WM_PAINT && lpMsg->message != WM_QUIT) { - ThreadData->LastMessage = *lpMsg; + ThreadData->LastMessage = Info.Msg; } - return(Res); + + return Res; } @@ -616,14 +1193,33 @@ PeekMessageW( UINT wRemoveMsg) { BOOL Res; + MSGCONVERSION Conversion; + NTUSERGETMESSAGEINFO Info; PUSER32_THREAD_DATA ThreadData = User32GetThreadData(); - - Res = NtUserPeekMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); + + MsgConversionCleanup(lpMsg, FALSE, FALSE, NULL); + Res = NtUserPeekMessage(&Info, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); + if (-1 == (int) Res || ! Res) + { + return Res; + } + Conversion.LParamSize = Info.LParamSize; + Conversion.KMMsg = Info.Msg; + + if (! MsgiKMToUMMessage(&Conversion.KMMsg, &Conversion.UnicodeMsg)) + { + return (BOOL) -1; + } + *lpMsg = Conversion.UnicodeMsg; + Conversion.Ansi = FALSE; + Conversion.FinalMsg = lpMsg; + MsgConversionAdd(&Conversion); if (Res && lpMsg->message != WM_PAINT && lpMsg->message != WM_QUIT) { - ThreadData->LastMessage = *lpMsg; + ThreadData->LastMessage = Info.Msg; } - return(Res); + + return Res; } @@ -633,12 +1229,35 @@ PeekMessageW( BOOL STDCALL PostMessageA( - HWND hWnd, + HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) { - return NtUserPostMessage(hWnd, Msg, wParam, lParam); + MSG AnsiMsg, UcMsg; + MSG KMMsg; + LRESULT Result; + + AnsiMsg.hwnd = Wnd; + AnsiMsg.message = Msg; + AnsiMsg.wParam = wParam; + AnsiMsg.lParam = lParam; + if (! MsgiAnsiToUnicodeMessage(&UcMsg, &AnsiMsg)) + { + return FALSE; + } + + if (! MsgiUMToKMMessage(&UcMsg, &KMMsg, TRUE)) + { + MsgiAnsiToUnicodeCleanup(&UcMsg, &AnsiMsg); + return FALSE; + } + Result = NtUserPostMessage(KMMsg.hwnd, KMMsg.message, + KMMsg.wParam, KMMsg.lParam); + MsgiUMToKMCleanup(&UcMsg, &KMMsg); + MsgiAnsiToUnicodeCleanup(&UcMsg, &AnsiMsg); + + return Result; } @@ -648,12 +1267,27 @@ PostMessageA( BOOL STDCALL PostMessageW( - HWND hWnd, + HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) { - return NtUserPostMessage(hWnd, Msg, wParam, lParam); + MSG UMMsg, KMMsg; + LRESULT Result; + + UMMsg.hwnd = Wnd; + UMMsg.message = Msg; + UMMsg.wParam = wParam; + UMMsg.lParam = lParam; + if (! MsgiUMToKMMessage(&UMMsg, &KMMsg, TRUE)) + { + return FALSE; + } + Result = NtUserPostMessage(KMMsg.hwnd, KMMsg.message, + KMMsg.wParam, KMMsg.lParam); + MsgiUMToKMCleanup(&UMMsg, &KMMsg); + + return Result; } @@ -708,15 +1342,31 @@ SendMessageW(HWND Wnd, WPARAM wParam, LPARAM lParam) { + MSG UMMsg, KMMsg; NTUSERSENDMESSAGEINFO Info; LRESULT Result; + UMMsg.hwnd = Wnd; + UMMsg.message = Msg; + UMMsg.wParam = wParam; + UMMsg.lParam = lParam; + if (! MsgiUMToKMMessage(&UMMsg, &KMMsg, FALSE)) + { + return FALSE; + } Info.Ansi = FALSE; - Result = NtUserSendMessage(Wnd, Msg, wParam, lParam, &Info); + Result = NtUserSendMessage(KMMsg.hwnd, KMMsg.message, + KMMsg.wParam, KMMsg.lParam, &Info); if (! Info.HandledByKernel) { + MsgiUMToKMCleanup(&UMMsg, &KMMsg); /* We need to send the message ourselves */ - Result = IntCallWindowProcW(Info.Ansi, Info.Proc, Wnd, Msg, wParam, lParam); + Result = IntCallWindowProcW(Info.Ansi, Info.Proc, UMMsg.hwnd, UMMsg.message, + UMMsg.wParam, UMMsg.lParam); + } + else if (! MsgiUMToKMReply(&UMMsg, &KMMsg, &Result)) + { + return FALSE; } return Result; @@ -729,8 +1379,8 @@ SendMessageW(HWND Wnd, LRESULT STDCALL SendMessageA(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) { - MSG AnsiMsg; - MSG UcMsg; + MSG AnsiMsg, UcMsg; + MSG KMMsg; LRESULT Result; NTUSERSENDMESSAGEINFO Info; @@ -743,9 +1393,14 @@ SendMessageA(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) return FALSE; } + if (! MsgiUMToKMMessage(&UcMsg, &KMMsg, FALSE)) + { + MsgiAnsiToUnicodeCleanup(&UcMsg, &AnsiMsg); + return FALSE; + } Info.Ansi = TRUE; - Result = NtUserSendMessage(UcMsg.hwnd, UcMsg.message, - UcMsg.wParam, UcMsg.lParam, &Info); + Result = NtUserSendMessage(KMMsg.hwnd, KMMsg.message, + KMMsg.wParam, KMMsg.lParam, &Info); if (! Info.HandledByKernel) { /* We need to send the message ourselves */ @@ -753,6 +1408,7 @@ SendMessageA(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) { /* Ansi message and Ansi window proc, that's easy. Clean up the Unicode message though */ + MsgiUMToKMCleanup(&UcMsg, &KMMsg); MsgiAnsiToUnicodeCleanup(&UcMsg, &AnsiMsg); Result = IntCallWindowProcA(Info.Ansi, Info.Proc, Wnd, Msg, wParam, lParam); } @@ -769,13 +1425,11 @@ SendMessageA(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) } } } - else + /* Message sent by kernel. Convert back to Ansi */ + else if (! MsgiUMToKMReply(&UcMsg, &KMMsg, &Result) || + ! MsgiAnsiToUnicodeReply(&UcMsg, &AnsiMsg, &Result)) { - /* Message sent by kernel. Convert back to Ansi */ - if (! MsgiAnsiToUnicodeReply(&UcMsg, &AnsiMsg, &Result)) - { - return FALSE; - } + return FALSE; } return Result; @@ -1109,6 +1763,63 @@ BOOL STDCALL GetInputState(VOID) return wake_bits & (QS_KEY | QS_MOUSEBUTTON); } + +NTSTATUS STDCALL +User32CallWindowProcFromKernel(PVOID Arguments, ULONG ArgumentLength) +{ + PWINDOWPROC_CALLBACK_ARGUMENTS CallbackArgs; + MSG KMMsg, UMMsg; + + /* Make sure we don't try to access mem beyond what we were given */ + if (ArgumentLength < sizeof(WINDOWPROC_CALLBACK_ARGUMENTS)) + { + return STATUS_INFO_LENGTH_MISMATCH; + } + + CallbackArgs = (PWINDOWPROC_CALLBACK_ARGUMENTS) Arguments; + KMMsg.hwnd = CallbackArgs->Wnd; + KMMsg.message = CallbackArgs->Msg; + KMMsg.wParam = CallbackArgs->wParam; + /* Check if lParam is really a pointer and adjust it if it is */ + if (0 <= CallbackArgs->lParamBufferSize) + { + if (ArgumentLength != sizeof(WINDOWPROC_CALLBACK_ARGUMENTS) + + CallbackArgs->lParamBufferSize) + { + return STATUS_INFO_LENGTH_MISMATCH; + } + KMMsg.lParam = (LPARAM) ((char *) CallbackArgs + sizeof(WINDOWPROC_CALLBACK_ARGUMENTS)); + } + else + { + if (ArgumentLength != sizeof(WINDOWPROC_CALLBACK_ARGUMENTS)) + { + return STATUS_INFO_LENGTH_MISMATCH; + } + KMMsg.lParam = CallbackArgs->lParam; + } + + if (WM_NCCALCSIZE == CallbackArgs->Msg && CallbackArgs->wParam) + { + NCCALCSIZE_PARAMS *Params = (NCCALCSIZE_PARAMS *) KMMsg.lParam; + Params->lppos = (PWINDOWPOS) (Params + 1); + } + + if (! MsgiKMToUMMessage(&KMMsg, &UMMsg)) + { + } + + CallbackArgs->Result = IntCallWindowProcW(CallbackArgs->IsAnsiProc, CallbackArgs->Proc, + UMMsg.hwnd, UMMsg.message, + UMMsg.wParam, UMMsg.lParam); + + if (! MsgiKMToUMReply(&KMMsg, &UMMsg, &CallbackArgs->Result)) + { + } + + return ZwCallbackReturn(CallbackArgs, ArgumentLength, STATUS_SUCCESS); +} + /* * @implemented */ @@ -1240,3 +1951,11 @@ DWORD WINAPI MsgWaitForMultipleObjectsEx(DWORD nCount, CONST HANDLE *lpHandles, { return IsInsideMessagePumpHook() ? gmph.RealMsgWaitForMultipleObjectsEx(nCount, lpHandles, dwMilliseconds, dwWakeMask, dwFlags) : RealMsgWaitForMultipleObjectsEx(nCount, lpHandles,dwMilliseconds, dwWakeMask, dwFlags); } + +BOOL FASTCALL MessageInit() +{ + InitializeCriticalSection(&DdeCrst); + InitializeCriticalSection(&MsgConversionCrst); + + return TRUE; +} diff --git a/reactos/lib/user32/windows/window.c b/reactos/lib/user32/windows/window.c index 4a6a091189f..b7960e125cc 100644 --- a/reactos/lib/user32/windows/window.c +++ b/reactos/lib/user32/windows/window.c @@ -1,4 +1,4 @@ -/* $Id: window.c,v 1.112 2004/04/15 23:36:02 weiden Exp $ +/* $Id: window.c,v 1.113 2004/04/29 21:13:16 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -48,53 +48,6 @@ User32CallSendAsyncProcForKernel(PVOID Arguments, ULONG ArgumentLength) } -NTSTATUS STDCALL -User32CallWindowProcFromKernel(PVOID Arguments, ULONG ArgumentLength) -{ - PWINDOWPROC_CALLBACK_ARGUMENTS CallbackArgs; - LPARAM lParam; - - /* Make sure we don't try to access mem beyond what we were given */ - if (ArgumentLength < sizeof(WINDOWPROC_CALLBACK_ARGUMENTS)) - { - return STATUS_INFO_LENGTH_MISMATCH; - } - - CallbackArgs = (PWINDOWPROC_CALLBACK_ARGUMENTS) Arguments; - /* Check if lParam is really a pointer and adjust it if it is */ - if (0 <= CallbackArgs->lParamBufferSize) - { - if (ArgumentLength != sizeof(WINDOWPROC_CALLBACK_ARGUMENTS) - + CallbackArgs->lParamBufferSize) - { - return STATUS_INFO_LENGTH_MISMATCH; - } - lParam = (LPARAM) ((char *) CallbackArgs + sizeof(WINDOWPROC_CALLBACK_ARGUMENTS)); - } - else - { - if (ArgumentLength != sizeof(WINDOWPROC_CALLBACK_ARGUMENTS)) - { - return STATUS_INFO_LENGTH_MISMATCH; - } - lParam = CallbackArgs->lParam; - } - - if (WM_NCCALCSIZE == CallbackArgs->Msg && CallbackArgs->wParam) - { - NCCALCSIZE_PARAMS *Params = (NCCALCSIZE_PARAMS *) lParam; - Params->lppos = (PWINDOWPOS) (Params + 1); - } - - - CallbackArgs->Result = IntCallWindowProcW(CallbackArgs->IsAnsiProc, CallbackArgs->Proc, - CallbackArgs->Wnd, CallbackArgs->Msg, - CallbackArgs->wParam, lParam); - - return ZwCallbackReturn(CallbackArgs, ArgumentLength, STATUS_SUCCESS); -} - - /* * @unimplemented */ diff --git a/reactos/subsys/win32k/include/msgqueue.h b/reactos/subsys/win32k/include/msgqueue.h index bc9f77a43d7..7c0bbc833bb 100644 --- a/reactos/subsys/win32k/include/msgqueue.h +++ b/reactos/subsys/win32k/include/msgqueue.h @@ -11,6 +11,7 @@ typedef struct _USER_MESSAGE { LIST_ENTRY ListEntry; + BOOLEAN FreeLParam; MSG Msg; } USER_MESSAGE, *PUSER_MESSAGE; @@ -103,12 +104,12 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam, UINT uTimeout, BOOL Block, ULONG_PTR *uResult); PUSER_MESSAGE FASTCALL -MsqCreateMessage(LPMSG Msg); +MsqCreateMessage(LPMSG Msg, BOOLEAN FreeLParam); VOID FASTCALL MsqDestroyMessage(PUSER_MESSAGE Message); VOID FASTCALL MsqPostMessage(PUSER_MESSAGE_QUEUE MessageQueue, - MSG* Msg); + MSG* Msg, BOOLEAN FreeLParam); VOID FASTCALL MsqPostQuitMessage(PUSER_MESSAGE_QUEUE MessageQueue, ULONG ExitCode); BOOLEAN STDCALL diff --git a/reactos/subsys/win32k/include/painting.h b/reactos/subsys/win32k/include/painting.h index 1c01747c965..bba8478866b 100644 --- a/reactos/subsys/win32k/include/painting.h +++ b/reactos/subsys/win32k/include/painting.h @@ -12,7 +12,8 @@ IntValidateParent(PWINDOW_OBJECT Child, HRGN ValidRegion); BOOL FASTCALL IntRedrawWindow(PWINDOW_OBJECT Wnd, const RECT* UpdateRect, HRGN UpdateRgn, ULONG Flags); BOOL FASTCALL -IntGetPaintMessage(HWND hWnd, PW32THREAD Thread, MSG *Message, BOOL Remove); +IntGetPaintMessage(HWND hWnd, UINT MsgFilterMin, UINT MsgFilterMax, PW32THREAD Thread, + MSG *Message, BOOL Remove); BOOL STDCALL NtUserValidateRgn(HWND hWnd, HRGN hRgn); diff --git a/reactos/subsys/win32k/ntuser/keyboard.c b/reactos/subsys/win32k/ntuser/keyboard.c index b919e8a4f43..8c2fa92b50a 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.27 2004/03/15 19:06:35 dwelch Exp $ +/* $Id: keyboard.c,v 1.28 2004/04/29 21:13:16 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -659,14 +659,14 @@ IntTranslateKbdMessage(LPMSG lpMsg, NewMsg.wParam = dead_char; NewMsg.lParam = lpMsg->lParam; dead_char = 0; - MsqPostMessage(PsGetWin32Thread()->MessageQueue, &NewMsg); + MsqPostMessage(PsGetWin32Thread()->MessageQueue, &NewMsg, FALSE); } NewMsg.hwnd = lpMsg->hwnd; NewMsg.wParam = wp[0]; NewMsg.lParam = lpMsg->lParam; DPRINT( "CHAR='%c' %04x %08x\n", wp[0], wp[0], lpMsg->lParam ); - MsqPostMessage(PsGetWin32Thread()->MessageQueue, &NewMsg); + MsqPostMessage(PsGetWin32Thread()->MessageQueue, &NewMsg, FALSE); Result = TRUE; } else if (UState == -1) @@ -677,7 +677,7 @@ IntTranslateKbdMessage(LPMSG lpMsg, NewMsg.wParam = wp[0]; NewMsg.lParam = lpMsg->lParam; dead_char = wp[0]; - MsqPostMessage(PsGetWin32Thread()->MessageQueue, &NewMsg); + MsqPostMessage(PsGetWin32Thread()->MessageQueue, &NewMsg, FALSE); Result = TRUE; } diff --git a/reactos/subsys/win32k/ntuser/message.c b/reactos/subsys/win32k/ntuser/message.c index 0326fff7e56..1ba5935b310 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.59 2004/04/15 23:36:03 weiden Exp $ +/* $Id: message.c,v 1.60 2004/04/29 21:13:16 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -70,91 +70,242 @@ IntCleanupMessageImpl(VOID) return STATUS_SUCCESS; } -LRESULT FASTCALL -IntDispatchMessage(MSG* Msg) -{ - LRESULT Result; - PWINDOW_OBJECT WindowObject; - /* Process timer messages. */ - if (Msg->message == WM_TIMER) - { - if (Msg->lParam) - { - LARGE_INTEGER LargeTickCount; - /* FIXME: Call hooks. */ - - /* FIXME: Check for continuing validity of timer. */ - - KeQueryTickCount(&LargeTickCount); - return IntCallWindowProc((WNDPROC)Msg->lParam, - FALSE, - Msg->hwnd, - Msg->message, - Msg->wParam, - (LPARAM)LargeTickCount.u.LowPart, - -1); - } - } - - if( Msg->hwnd == 0 ) return 0; - - /* Get the window object. */ - WindowObject = IntGetWindowObject(Msg->hwnd); - if(!WindowObject) - { - SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); - return 0; - } - if(WindowObject->OwnerThread != PsGetCurrentThread()) +#define MMS_SIZE_WPARAM -1 +#define MMS_SIZE_WPARAMWCHAR -2 +#define MMS_SIZE_LPARAMSZ -3 +#define MMS_SIZE_SPECIAL -4 +#define MMS_FLAG_READ 0x01 +#define MMS_FLAG_WRITE 0x02 +#define MMS_FLAG_READWRITE (MMS_FLAG_READ | MMS_FLAG_WRITE) +typedef struct tagMSGMEMORY { - IntReleaseWindowObject(WindowObject); - DPRINT1("Window doesn't belong to the calling thread!\n"); - return 0; - } - /* FIXME: Call hook procedures. */ + UINT Message; + UINT Size; + INT Flags; + } MSGMEMORY, *PMSGMEMORY; - /* Call the window procedure. */ - if (0xFFFF0000 != ((DWORD) WindowObject->WndProcW & 0xFFFF0000)) +static MSGMEMORY MsgMemory[] = + { + { WM_CREATE, sizeof(CREATESTRUCTW), MMS_FLAG_READWRITE }, + { WM_DDE_ACK, sizeof(KMDDELPARAM), MMS_FLAG_READ }, + { WM_DDE_EXECUTE, MMS_SIZE_WPARAM, MMS_FLAG_READ }, + { WM_GETMINMAXINFO, sizeof(MINMAXINFO), MMS_FLAG_READWRITE }, + { WM_GETTEXT, MMS_SIZE_WPARAMWCHAR, MMS_FLAG_WRITE }, + { WM_NCCALCSIZE, MMS_SIZE_SPECIAL, MMS_FLAG_READWRITE }, + { WM_NCCREATE, sizeof(CREATESTRUCTW), MMS_FLAG_READWRITE }, + { WM_SETTEXT, MMS_SIZE_LPARAMSZ, MMS_FLAG_READ }, + { WM_STYLECHANGED, sizeof(STYLESTRUCT), MMS_FLAG_READ }, + { WM_STYLECHANGING, sizeof(STYLESTRUCT), MMS_FLAG_READWRITE }, + { WM_WINDOWPOSCHANGED, sizeof(WINDOWPOS), MMS_FLAG_READ }, + { WM_WINDOWPOSCHANGING, sizeof(WINDOWPOS), MMS_FLAG_READWRITE }, + }; + +static PMSGMEMORY FASTCALL +FindMsgMemory(UINT Msg) + { + PMSGMEMORY MsgMemoryEntry; + + /* See if this message type is present in the table */ + for (MsgMemoryEntry = MsgMemory; + MsgMemoryEntry < MsgMemory + sizeof(MsgMemory) / sizeof(MSGMEMORY); + MsgMemoryEntry++) { - Result = IntCallWindowProc(WindowObject->WndProcW, - FALSE, - Msg->hwnd, - Msg->message, - Msg->wParam, - Msg->lParam, - -1); + if (Msg == MsgMemoryEntry->Message) + { + return MsgMemoryEntry; + } + } + + return NULL; +} + +static UINT FASTCALL +MsgMemorySize(PMSGMEMORY MsgMemoryEntry, WPARAM wParam, LPARAM lParam) +{ + if (MMS_SIZE_WPARAM == MsgMemoryEntry->Size) + { + return (UINT) wParam; + } + else if (MMS_SIZE_WPARAMWCHAR == MsgMemoryEntry->Size) + { + return (UINT) (wParam * sizeof(WCHAR)); + } + else if (MMS_SIZE_LPARAMSZ == MsgMemoryEntry->Size) + { + return (UINT) ((wcslen((PWSTR) lParam) + 1) * sizeof(WCHAR)); + } + else if (MMS_SIZE_SPECIAL == MsgMemoryEntry->Size) + { + switch(MsgMemoryEntry->Message) + { + case WM_NCCALCSIZE: + return wParam ? sizeof(NCCALCSIZE_PARAMS) + sizeof(WINDOWPOS) : sizeof(RECT); + break; + default: + assert(FALSE); + return 0; + break; + } } else { - Result = IntCallWindowProc(WindowObject->WndProcA, - TRUE, - Msg->hwnd, - Msg->message, - Msg->wParam, - Msg->lParam, - -1); + return MsgMemoryEntry->Size; } - - IntReleaseWindowObject(WindowObject); - - return Result; +} + +static FASTCALL NTSTATUS +PackParam(LPARAM *lParamPacked, UINT Msg, WPARAM wParam, LPARAM lParam) +{ + NCCALCSIZE_PARAMS *UnpackedParams; + NCCALCSIZE_PARAMS *PackedParams; + + *lParamPacked = lParam; + if (WM_NCCALCSIZE == Msg && wParam) + { + UnpackedParams = (NCCALCSIZE_PARAMS *) lParam; + if (UnpackedParams->lppos != (PWINDOWPOS) (UnpackedParams + 1)) + { + PackedParams = ExAllocatePoolWithTag(PagedPool, + sizeof(NCCALCSIZE_PARAMS) + sizeof(WINDOWPOS), + TAG_MSG); + if (NULL == PackedParams) + { + DPRINT1("Not enough memory to pack lParam\n"); + return STATUS_NO_MEMORY; + } + RtlCopyMemory(PackedParams, UnpackedParams, sizeof(NCCALCSIZE_PARAMS)); + PackedParams->lppos = (PWINDOWPOS) (PackedParams + 1); + RtlCopyMemory(PackedParams->lppos, UnpackedParams->lppos, sizeof(WINDOWPOS)); + *lParamPacked = (LPARAM) PackedParams; + } + } + + return STATUS_SUCCESS; +} + +static FASTCALL NTSTATUS +UnpackParam(LPARAM lParamPacked, UINT Msg, WPARAM wParam, LPARAM lParam) +{ + NCCALCSIZE_PARAMS *UnpackedParams; + NCCALCSIZE_PARAMS *PackedParams; + PWINDOWPOS UnpackedWindowPos; + + if (lParamPacked == lParam) + { + return STATUS_SUCCESS; + } + + if (WM_NCCALCSIZE == Msg && wParam) + { + PackedParams = (NCCALCSIZE_PARAMS *) lParamPacked; + UnpackedParams = (NCCALCSIZE_PARAMS *) lParam; + UnpackedWindowPos = UnpackedParams->lppos; + RtlCopyMemory(UnpackedParams, PackedParams, sizeof(NCCALCSIZE_PARAMS)); + UnpackedParams->lppos = UnpackedWindowPos; + RtlCopyMemory(UnpackedWindowPos, PackedParams + 1, sizeof(WINDOWPOS)); + ExFreePool((PVOID) lParamPacked); + + return STATUS_SUCCESS; + } + + assert(FALSE); + + return STATUS_INVALID_PARAMETER; } LRESULT STDCALL -NtUserDispatchMessage(CONST MSG* UnsafeMsg) +NtUserDispatchMessage(PNTUSERDISPATCHMESSAGEINFO UnsafeMsgInfo) { NTSTATUS Status; - MSG Msg; + NTUSERDISPATCHMESSAGEINFO MsgInfo; + PWINDOW_OBJECT WindowObject; + LRESULT Result; - Status = MmCopyFromCaller(&Msg, (PVOID) UnsafeMsg, sizeof(MSG)); + Status = MmCopyFromCaller(&MsgInfo, UnsafeMsgInfo, sizeof(NTUSERDISPATCHMESSAGEINFO)); if (! NT_SUCCESS(Status)) { - SetLastNtError(Status); - return 0; + SetLastNtError(Status); + return 0; + } + + /* Process timer messages. */ + if (WM_TIMER == MsgInfo.Msg.message && 0 != MsgInfo.Msg.lParam) + { + LARGE_INTEGER LargeTickCount; + /* FIXME: Call hooks. */ + + /* FIXME: Check for continuing validity of timer. */ + + MsgInfo.HandledByKernel = FALSE; + KeQueryTickCount(&LargeTickCount); + MsgInfo.Proc = (WNDPROC) MsgInfo.Msg.lParam; + MsgInfo.Msg.lParam = (LPARAM)LargeTickCount.u.LowPart; + } + else if (NULL == MsgInfo.Msg.hwnd) + { + MsgInfo.HandledByKernel = TRUE; + Result = 0; + } + else + { + /* Get the window object. */ + WindowObject = IntGetWindowObject(MsgInfo.Msg.hwnd); + if (NULL == WindowObject) + { + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + MsgInfo.HandledByKernel = TRUE; + Result = 0; + } + else + { + if (WindowObject->OwnerThread != PsGetCurrentThread()) + { + IntReleaseWindowObject(WindowObject); + DPRINT1("Window doesn't belong to the calling thread!\n"); + MsgInfo.HandledByKernel = TRUE; + Result = 0; + } + else + { + /* FIXME: Call hook procedures. */ + + MsgInfo.HandledByKernel = FALSE; + Result = 0; + if (0xFFFF0000 != ((DWORD) WindowObject->WndProcW & 0xFFFF0000)) + { + if (0xFFFF0000 != ((DWORD) WindowObject->WndProcA & 0xFFFF0000)) + { + /* Both Unicode and Ansi winprocs are real, use whatever + usermode prefers */ + MsgInfo.Proc = (MsgInfo.Ansi ? WindowObject->WndProcA + : WindowObject->WndProcW); + } + else + { + /* Real Unicode winproc */ + MsgInfo.Ansi = FALSE; + MsgInfo.Proc = WindowObject->WndProcW; + } + } + else + { + /* Must have real Ansi winproc */ + MsgInfo.Ansi = TRUE; + MsgInfo.Proc = WindowObject->WndProcA; + } + } + IntReleaseWindowObject(WindowObject); + } + } + Status = MmCopyToCaller(UnsafeMsgInfo, &MsgInfo, sizeof(NTUSERDISPATCHMESSAGEINFO)); + if (! NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return 0; } - return IntDispatchMessage(&Msg); + return Result; } @@ -336,7 +487,7 @@ IntTranslateMouseMessage(PUSER_MESSAGE_QUEUE ThreadQueue, LPMSG Msg, USHORT *Hit * Internal version of PeekMessage() doing all the work */ BOOL FASTCALL -IntPeekMessage(LPMSG Msg, +IntPeekMessage(PUSER_MESSAGE Msg, HWND Wnd, UINT MsgFilterMin, UINT MsgFilterMax, @@ -372,10 +523,11 @@ IntPeekMessage(LPMSG Msg, { /* According to the PSDK, WM_QUIT messages are always returned, regardless of the filter specified */ - Msg->hwnd = NULL; - Msg->message = WM_QUIT; - Msg->wParam = ThreadQueue->QuitExitCode; - Msg->lParam = 0; + Msg->Msg.hwnd = NULL; + Msg->Msg.message = WM_QUIT; + Msg->Msg.wParam = ThreadQueue->QuitExitCode; + Msg->Msg.lParam = 0; + Msg->FreeLParam = FALSE; if (RemoveMessages) { ThreadQueue->QuitPosted = FALSE; @@ -393,7 +545,7 @@ IntPeekMessage(LPMSG Msg, &Message); if (Present) { - RtlCopyMemory(Msg, &Message->Msg, sizeof(MSG)); + RtlCopyMemory(Msg, Message, sizeof(USER_MESSAGE)); if (RemoveMessages) { MsqDestroyMessage(Message); @@ -411,7 +563,7 @@ IntPeekMessage(LPMSG Msg, &Message); if (Present) { - RtlCopyMemory(Msg, &Message->Msg, sizeof(MSG)); + RtlCopyMemory(Msg, Message, sizeof(USER_MESSAGE)); if (RemoveMessages) { MsqDestroyMessage(Message); @@ -423,8 +575,9 @@ IntPeekMessage(LPMSG Msg, while (MsqDispatchOneSentMessage(ThreadQueue)); /* Check for paint messages. */ - if (IntGetPaintMessage(Wnd, PsGetWin32Thread(), Msg, RemoveMessages)) + if (IntGetPaintMessage(Wnd, MsgFilterMin, MsgFilterMax, PsGetWin32Thread(), &Msg->Msg, RemoveMessages)) { + Msg->FreeLParam = FALSE; return TRUE; } @@ -438,12 +591,12 @@ IntPeekMessage(LPMSG Msg, { PWINDOW_OBJECT MsgWindow = NULL;; - if(Msg->hwnd && (MsgWindow = IntGetWindowObject(Msg->hwnd)) && - Msg->message >= WM_MOUSEFIRST && Msg->message <= WM_MOUSELAST) + if(Msg->Msg.hwnd && (MsgWindow = IntGetWindowObject(Msg->Msg.hwnd)) && + Msg->Msg.message >= WM_MOUSEFIRST && Msg->Msg.message <= WM_MOUSELAST) { USHORT HitTest; - if(IntTranslateMouseMessage(ThreadQueue, Msg, &HitTest, TRUE)) + if(IntTranslateMouseMessage(ThreadQueue, &Msg->Msg, &HitTest, TRUE)) /* FIXME - check message filter again, if the message doesn't match anymore, search again */ { @@ -453,10 +606,10 @@ IntPeekMessage(LPMSG Msg, } if(ThreadQueue->CaptureWindow == NULL) { - IntSendHitTestMessages(ThreadQueue, Msg); - if((Msg->message != WM_MOUSEMOVE && Msg->message != WM_NCMOUSEMOVE) && - IS_BTN_MESSAGE(Msg->message, DOWN) && - IntActivateWindowMouse(ThreadQueue, Msg, MsgWindow, &HitTest)) + IntSendHitTestMessages(ThreadQueue, &Msg->Msg); + if((Msg->Msg.message != WM_MOUSEMOVE && Msg->Msg.message != WM_NCMOUSEMOVE) && + IS_BTN_MESSAGE(Msg->Msg.message, DOWN) && + IntActivateWindowMouse(ThreadQueue, &Msg->Msg, MsgWindow, &HitTest)) { IntReleaseWindowObject(MsgWindow); /* eat the message, search again */ @@ -466,7 +619,7 @@ IntPeekMessage(LPMSG Msg, } else { - IntSendHitTestMessages(ThreadQueue, Msg); + IntSendHitTestMessages(ThreadQueue, &Msg->Msg); } if(MsgWindow) @@ -478,8 +631,8 @@ IntPeekMessage(LPMSG Msg, } USHORT HitTest; - if((Msg->hwnd && Msg->message >= WM_MOUSEFIRST && Msg->message <= WM_MOUSELAST) && - IntTranslateMouseMessage(ThreadQueue, Msg, &HitTest, FALSE)) + if((Msg->Msg.hwnd && Msg->Msg.message >= WM_MOUSEFIRST && Msg->Msg.message <= WM_MOUSELAST) && + IntTranslateMouseMessage(ThreadQueue, &Msg->Msg, &HitTest, FALSE)) /* FIXME - check message filter again, if the message doesn't match anymore, search again */ { @@ -494,43 +647,88 @@ IntPeekMessage(LPMSG Msg, } BOOL STDCALL -NtUserPeekMessage(LPMSG UnsafeMsg, +NtUserPeekMessage(PNTUSERGETMESSAGEINFO UnsafeInfo, HWND Wnd, UINT MsgFilterMin, UINT MsgFilterMax, UINT RemoveMsg) { - MSG SafeMsg; NTSTATUS Status; BOOL Present; + NTUSERGETMESSAGEINFO Info; PWINDOW_OBJECT Window; + PMSGMEMORY MsgMemoryEntry; + PVOID UserMem; + UINT Size; + USER_MESSAGE Msg; /* Validate input */ if (NULL != Wnd) { Window = IntGetWindowObject(Wnd); - if(!Window) - Wnd = NULL; + if (NULL == Window) + { + Wnd = NULL; + } else - IntReleaseWindowObject(Window); + { + IntReleaseWindowObject(Window); + } } + if (MsgFilterMax < MsgFilterMin) { MsgFilterMin = 0; MsgFilterMax = 0; } - Present = IntPeekMessage(&SafeMsg, Wnd, MsgFilterMin, MsgFilterMax, RemoveMsg); + Present = IntPeekMessage(&Msg, Wnd, MsgFilterMin, MsgFilterMax, RemoveMsg); if (Present) { - Status = MmCopyToCaller(UnsafeMsg, &SafeMsg, sizeof(MSG)); + Info.Msg = Msg.Msg; + /* See if this message type is present in the table */ + MsgMemoryEntry = FindMsgMemory(Info.Msg.message); + if (NULL == MsgMemoryEntry) + { + /* Not present, no copying needed */ + Info.LParamSize = 0; + } + else + { + /* Determine required size */ + Size = MsgMemorySize(MsgMemoryEntry, Info.Msg.wParam, + Info.Msg.lParam); + /* Allocate required amount of user-mode memory */ + Info.LParamSize = Size; + UserMem = NULL; + Status = ZwAllocateVirtualMemory(NtCurrentProcess(), &UserMem, 0, + &Info.LParamSize, MEM_COMMIT, PAGE_READWRITE); + if (! NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return (BOOL) -1; + } + /* Transfer lParam data to user-mode mem */ + Status = MmCopyToCaller(UserMem, (PVOID) Info.Msg.lParam, Size); + if (! NT_SUCCESS(Status)) + { + ZwFreeVirtualMemory(NtCurrentProcess(), (PVOID *) &UserMem, + &Info.LParamSize, MEM_DECOMMIT); + SetLastNtError(Status); + return (BOOL) -1; + } + Info.Msg.lParam = (LPARAM) UserMem; + } + if (Msg.FreeLParam && 0 != Msg.Msg.lParam) + { + ExFreePool((void *) Msg.Msg.lParam); + } + Status = MmCopyToCaller(UnsafeInfo, &Info, sizeof(NTUSERGETMESSAGEINFO)); if (! NT_SUCCESS(Status)) - { - /* There is error return documented for PeekMessage(). - Do the best we can */ - SetLastNtError(Status); - return FALSE; - } + { + SetLastNtError(Status); + return (BOOL) -1; + } } return Present; @@ -543,7 +741,7 @@ IntWaitMessage(HWND Wnd, { PUSER_MESSAGE_QUEUE ThreadQueue; NTSTATUS Status; - MSG Msg; + USER_MESSAGE Msg; ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue; @@ -565,7 +763,7 @@ IntWaitMessage(HWND Wnd, } BOOL STDCALL -NtUserGetMessage(LPMSG UnsafeMsg, +NtUserGetMessage(PNTUSERGETMESSAGEINFO UnsafeInfo, HWND Wnd, UINT MsgFilterMin, UINT MsgFilterMax) @@ -581,9 +779,13 @@ NtUserGetMessage(LPMSG UnsafeMsg, */ { BOOL GotMessage; - MSG SafeMsg; + NTUSERGETMESSAGEINFO Info; NTSTATUS Status; PWINDOW_OBJECT Window; + PMSGMEMORY MsgMemoryEntry; + PVOID UserMem; + UINT Size; + USER_MESSAGE Msg; /* Validate input */ if (NULL != Wnd) @@ -602,10 +804,49 @@ NtUserGetMessage(LPMSG UnsafeMsg, do { - GotMessage = IntPeekMessage(&SafeMsg, Wnd, MsgFilterMin, MsgFilterMax, PM_REMOVE); + GotMessage = IntPeekMessage(&Msg, Wnd, MsgFilterMin, MsgFilterMax, PM_REMOVE); if (GotMessage) { - Status = MmCopyToCaller(UnsafeMsg, &SafeMsg, sizeof(MSG)); + Info.Msg = Msg.Msg; + /* See if this message type is present in the table */ + MsgMemoryEntry = FindMsgMemory(Info.Msg.message); + if (NULL == MsgMemoryEntry) + { + /* Not present, no copying needed */ + Info.LParamSize = 0; + } + else + { + /* Determine required size */ + Size = MsgMemorySize(MsgMemoryEntry, Info.Msg.wParam, + Info.Msg.lParam); + /* Allocate required amount of user-mode memory */ + Info.LParamSize = Size; + UserMem = NULL; + Status = ZwAllocateVirtualMemory(NtCurrentProcess(), &UserMem, 0, + &Info.LParamSize, MEM_COMMIT, PAGE_READWRITE); + + if (! NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return (BOOL) -1; + } + /* Transfer lParam data to user-mode mem */ + Status = MmCopyToCaller(UserMem, (PVOID) Info.Msg.lParam, Size); + if (! NT_SUCCESS(Status)) + { + ZwFreeVirtualMemory(NtCurrentProcess(), (PVOID *) &UserMem, + &Info.LParamSize, MEM_DECOMMIT); + SetLastNtError(Status); + return (BOOL) -1; + } + Info.Msg.lParam = (LPARAM) UserMem; + } + if (Msg.FreeLParam && 0 != Msg.Msg.lParam) + { + ExFreePool((void *) Msg.Msg.lParam); + } + Status = MmCopyToCaller(UnsafeInfo, &Info, sizeof(NTUSERGETMESSAGEINFO)); if (! NT_SUCCESS(Status)) { SetLastNtError(Status); @@ -619,7 +860,7 @@ NtUserGetMessage(LPMSG UnsafeMsg, } while (! GotMessage); - return WM_QUIT != SafeMsg.message; + return WM_QUIT != Info.Msg.message; } DWORD @@ -638,21 +879,117 @@ NtUserMessageCall( return 0; } +static NTSTATUS FASTCALL +CopyMsgToKernelMem(MSG *KernelModeMsg, MSG *UserModeMsg, PMSGMEMORY MsgMemoryEntry) +{ + NTSTATUS Status; + + PVOID KernelMem; + UINT Size; + + *KernelModeMsg = *UserModeMsg; + + /* See if this message type is present in the table */ + if (NULL == MsgMemoryEntry) + { + /* Not present, no copying needed */ + return STATUS_SUCCESS; + } + + /* Determine required size */ + Size = MsgMemorySize(MsgMemoryEntry, UserModeMsg->wParam, UserModeMsg->lParam); + + if (0 != Size) + { + /* Allocate kernel mem */ + KernelMem = ExAllocatePoolWithTag(PagedPool, Size, TAG_MSG); + if (NULL == KernelMem) + { + DPRINT1("Not enough memory to copy message to kernel mem\n"); + return STATUS_NO_MEMORY; + } + KernelModeMsg->lParam = (LPARAM) KernelMem; + + /* Copy data if required */ + if (0 != (MsgMemoryEntry->Flags & MMS_FLAG_READ)) + { + Status = MmCopyFromCaller(KernelMem, (PVOID) UserModeMsg->lParam, Size); + if (! NT_SUCCESS(Status)) + { + DPRINT1("Failed to copy message to kernel: invalid usermode buffer\n"); + ExFreePool(KernelMem); + return Status; + } + } + else + { + /* Make sure we don't pass any secrets to usermode */ + RtlZeroMemory(KernelMem, Size); + } + } + else + { + KernelModeMsg->lParam = 0; + } + + return STATUS_SUCCESS; +} + +static NTSTATUS FASTCALL +CopyMsgToUserMem(MSG *UserModeMsg, MSG *KernelModeMsg) +{ + NTSTATUS Status; + PMSGMEMORY MsgMemoryEntry; + UINT Size; + + /* See if this message type is present in the table */ + MsgMemoryEntry = FindMsgMemory(UserModeMsg->message); + if (NULL == MsgMemoryEntry) + { + /* Not present, no copying needed */ + return STATUS_SUCCESS; + } + + /* Determine required size */ + Size = MsgMemorySize(MsgMemoryEntry, UserModeMsg->wParam, UserModeMsg->lParam); + + if (0 != Size) + { + /* Copy data if required */ + if (0 != (MsgMemoryEntry->Flags & MMS_FLAG_WRITE)) + { + Status = MmCopyToCaller((PVOID) UserModeMsg->lParam, (PVOID) KernelModeMsg->lParam, Size); + if (! NT_SUCCESS(Status)) + { + DPRINT1("Failed to copy message from kernel: invalid usermode buffer\n"); + ExFreePool((PVOID) KernelModeMsg->lParam); + return Status; + } + } + + ExFreePool((PVOID) KernelModeMsg->lParam); + } + + return STATUS_SUCCESS; +} + BOOL STDCALL -NtUserPostMessage(HWND hWnd, +NtUserPostMessage(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) { PWINDOW_OBJECT Window; - MSG Mesg; + MSG UserModeMsg, KernelModeMsg; LARGE_INTEGER LargeTickCount; + NTSTATUS Status; + PMSGMEMORY MsgMemoryEntry; if (WM_QUIT == Msg) { MsqPostQuitMessage(PsGetWin32Thread()->MessageQueue, wParam); } - else if (hWnd == HWND_BROADCAST) + else if (Wnd == HWND_BROADCAST) { HWND *List; PWINDOW_OBJECT DesktopWindow; @@ -670,21 +1007,30 @@ NtUserPostMessage(HWND hWnd, } else { - Window = IntGetWindowObject(hWnd); - if (!Window) + Window = IntGetWindowObject(Wnd); + if (NULL == Window) { - SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return FALSE; } - Mesg.hwnd = hWnd; - Mesg.message = Msg; - Mesg.wParam = wParam; - Mesg.lParam = lParam; - Mesg.pt.x = PsGetWin32Process()->WindowStation->SystemCursor.x; - Mesg.pt.y = PsGetWin32Process()->WindowStation->SystemCursor.y; + + UserModeMsg.hwnd = Wnd; + UserModeMsg.message = Msg; + UserModeMsg.wParam = wParam; + UserModeMsg.lParam = lParam; + MsgMemoryEntry = FindMsgMemory(UserModeMsg.message); + Status = CopyMsgToKernelMem(&KernelModeMsg, &UserModeMsg, MsgMemoryEntry); + if (! NT_SUCCESS(Status)) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return FALSE; + } + KernelModeMsg.pt.x = PsGetWin32Process()->WindowStation->SystemCursor.x; + KernelModeMsg.pt.y = PsGetWin32Process()->WindowStation->SystemCursor.y; KeQueryTickCount(&LargeTickCount); - Mesg.time = LargeTickCount.u.LowPart; - MsqPostMessage(Window->MessageQueue, &Mesg); + KernelModeMsg.time = LargeTickCount.u.LowPart; + MsqPostMessage(Window->MessageQueue, &KernelModeMsg, + NULL != MsgMemoryEntry && 0 != KernelModeMsg.lParam); IntReleaseWindowObject(Window); } @@ -697,11 +1043,11 @@ NtUserPostThreadMessage(DWORD idThread, WPARAM wParam, LPARAM lParam) { - MSG Mesg; - + MSG UserModeMsg, KernelModeMsg; PETHREAD peThread; PW32THREAD pThread; NTSTATUS Status; + PMSGMEMORY MsgMemoryEntry; Status = PsLookupThreadByThreadId((void *)idThread,&peThread); @@ -712,11 +1058,20 @@ NtUserPostThreadMessage(DWORD idThread, ObDereferenceObject( peThread ); return FALSE; } - Mesg.hwnd = 0; - Mesg.message = Msg; - Mesg.wParam = wParam; - Mesg.lParam = lParam; - MsqPostMessage(pThread->MessageQueue, &Mesg); + + UserModeMsg.hwnd = NULL; + UserModeMsg.message = Msg; + UserModeMsg.wParam = wParam; + UserModeMsg.lParam = lParam; + MsgMemoryEntry = FindMsgMemory(UserModeMsg.message); + Status = CopyMsgToKernelMem(&KernelModeMsg, &UserModeMsg, MsgMemoryEntry); + if (! NT_SUCCESS(Status)) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return FALSE; + } + MsqPostMessage(pThread->MessageQueue, &KernelModeMsg, + NULL != MsgMemoryEntry && 0 != KernelModeMsg.lParam); ObDereferenceObject( peThread ); return TRUE; } else { @@ -733,147 +1088,6 @@ NtUserQuerySendMessage(DWORD Unknown0) return 0; } -#define MMS_SIZE_WPARAM -1 -#define MMS_SIZE_WPARAMWCHAR -2 -#define MMS_SIZE_LPARAMSZ -3 -#define MMS_SIZE_SPECIAL -4 -#define MMS_FLAG_READ 0x01 -#define MMS_FLAG_WRITE 0x02 -#define MMS_FLAG_READWRITE (MMS_FLAG_READ | MMS_FLAG_WRITE) -typedef struct tagMSGMEMORY - { - UINT Message; - UINT Size; - INT Flags; - } MSGMEMORY, *PMSGMEMORY; - -static MSGMEMORY MsgMemory[] = - { - { WM_CREATE, sizeof(CREATESTRUCTW), MMS_FLAG_READWRITE }, - { WM_GETMINMAXINFO, sizeof(MINMAXINFO), MMS_FLAG_READWRITE }, - { WM_GETTEXT, MMS_SIZE_WPARAMWCHAR, MMS_FLAG_WRITE }, - { WM_NCCALCSIZE, MMS_SIZE_SPECIAL, MMS_FLAG_READWRITE }, - { WM_NCCREATE, sizeof(CREATESTRUCTW), MMS_FLAG_READWRITE }, - { WM_SETTEXT, MMS_SIZE_LPARAMSZ, MMS_FLAG_READ }, - { WM_STYLECHANGED, sizeof(STYLESTRUCT), MMS_FLAG_READ }, - { WM_STYLECHANGING, sizeof(STYLESTRUCT), MMS_FLAG_READWRITE }, - { WM_WINDOWPOSCHANGED, sizeof(WINDOWPOS), MMS_FLAG_READ }, - { WM_WINDOWPOSCHANGING, sizeof(WINDOWPOS), MMS_FLAG_READWRITE }, - }; - -static PMSGMEMORY FASTCALL -FindMsgMemory(UINT Msg) - { - PMSGMEMORY MsgMemoryEntry; - - /* See if this message type is present in the table */ - for (MsgMemoryEntry = MsgMemory; - MsgMemoryEntry < MsgMemory + sizeof(MsgMemory) / sizeof(MSGMEMORY); - MsgMemoryEntry++) - { - if (Msg == MsgMemoryEntry->Message) - { - return MsgMemoryEntry; - } - } - - return NULL; -} - -static UINT FASTCALL -MsgMemorySize(PMSGMEMORY MsgMemoryEntry, WPARAM wParam, LPARAM lParam) -{ - if (MMS_SIZE_WPARAM == MsgMemoryEntry->Size) - { - return (UINT) wParam; - } - else if (MMS_SIZE_WPARAMWCHAR == MsgMemoryEntry->Size) - { - return (UINT) (wParam * sizeof(WCHAR)); - } - else if (MMS_SIZE_LPARAMSZ == MsgMemoryEntry->Size) - { - return (UINT) ((wcslen((PWSTR) lParam) + 1) * sizeof(WCHAR)); - } - else if (MMS_SIZE_SPECIAL == MsgMemoryEntry->Size) - { - switch(MsgMemoryEntry->Message) - { - case WM_NCCALCSIZE: - return wParam ? sizeof(NCCALCSIZE_PARAMS) + sizeof(WINDOWPOS) : sizeof(RECT); - break; - default: - assert(FALSE); - return 0; - break; - } - } - else - { - return MsgMemoryEntry->Size; - } -} - -static NTSTATUS FASTCALL -PackParam(LPARAM *lParamPacked, UINT Msg, WPARAM wParam, LPARAM lParam) -{ - NCCALCSIZE_PARAMS *UnpackedParams; - NCCALCSIZE_PARAMS *PackedParams; - - *lParamPacked = lParam; - if (WM_NCCALCSIZE == Msg && wParam) - { - UnpackedParams = (NCCALCSIZE_PARAMS *) lParam; - if (UnpackedParams->lppos != (PWINDOWPOS) (UnpackedParams + 1)) - { - PackedParams = ExAllocatePoolWithTag(PagedPool, - sizeof(NCCALCSIZE_PARAMS) + sizeof(WINDOWPOS), - TAG_MSG); - if (NULL == PackedParams) - { - DPRINT1("Not enough memory to pack lParam\n"); - return STATUS_NO_MEMORY; - } - RtlCopyMemory(PackedParams, UnpackedParams, sizeof(NCCALCSIZE_PARAMS)); - PackedParams->lppos = (PWINDOWPOS) (PackedParams + 1); - RtlCopyMemory(PackedParams->lppos, UnpackedParams->lppos, sizeof(WINDOWPOS)); - *lParamPacked = (LPARAM) PackedParams; - } - } - - return STATUS_SUCCESS; -} - -static FASTCALL NTSTATUS -UnpackParam(LPARAM lParamPacked, UINT Msg, WPARAM wParam, LPARAM lParam) -{ - NCCALCSIZE_PARAMS *UnpackedParams; - NCCALCSIZE_PARAMS *PackedParams; - PWINDOWPOS UnpackedWindowPos; - - if (lParamPacked == lParam) - { - return STATUS_SUCCESS; - } - - if (WM_NCCALCSIZE == Msg && wParam) - { - PackedParams = (NCCALCSIZE_PARAMS *) lParamPacked; - UnpackedParams = (NCCALCSIZE_PARAMS *) lParam; - UnpackedWindowPos = UnpackedParams->lppos; - RtlCopyMemory(UnpackedParams, PackedParams, sizeof(NCCALCSIZE_PARAMS)); - UnpackedParams->lppos = UnpackedWindowPos; - RtlCopyMemory(UnpackedWindowPos, PackedParams + 1, sizeof(WINDOWPOS)); - ExFreePool((PVOID) lParamPacked); - - return STATUS_SUCCESS; - } - - assert(FALSE); - - return STATUS_INVALID_PARAMETER; -} - LRESULT FASTCALL IntSendMessage(HWND hWnd, UINT Msg, @@ -1030,62 +1244,6 @@ IntSendMessageTimeout(HWND hWnd, return (LRESULT) TRUE; } -static NTSTATUS FASTCALL -CopyMsgToKernelMem(MSG *KernelModeMsg, MSG *UserModeMsg) -{ - NTSTATUS Status; - PMSGMEMORY MsgMemoryEntry; - PVOID KernelMem; - UINT Size; - - *KernelModeMsg = *UserModeMsg; - - /* See if this message type is present in the table */ - MsgMemoryEntry = FindMsgMemory(UserModeMsg->message); - if (NULL == MsgMemoryEntry) - { - /* Not present, no copying needed */ - return STATUS_SUCCESS; - } - - /* Determine required size */ - Size = MsgMemorySize(MsgMemoryEntry, UserModeMsg->wParam, UserModeMsg->lParam); - - if (0 != Size) - { - /* Allocate kernel mem */ - KernelMem = ExAllocatePoolWithTag(PagedPool, Size, TAG_MSG); - if (NULL == KernelMem) - { - DPRINT1("Not enough memory to copy message to kernel mem\n"); - return STATUS_NO_MEMORY; - } - KernelModeMsg->lParam = (LPARAM) KernelMem; - - /* Copy data if required */ - if (0 != (MsgMemoryEntry->Flags & MMS_FLAG_READ)) - { - Status = MmCopyFromCaller(KernelMem, (PVOID) UserModeMsg->lParam, Size); - if (! NT_SUCCESS(Status)) - { - DPRINT1("Failed to copy message to kernel: invalid usermode buffer\n"); - ExFreePool(KernelMem); - return Status; - } - } - else - { - /* Make sure we don't pass any secrets to usermode */ - RtlZeroMemory(KernelMem, Size); - } - } - else - { - KernelModeMsg->lParam = 0; - } - - return STATUS_SUCCESS; -} /* This function posts a message if the destination's message queue belongs to another thread, otherwise it sends the message. It does not support broadcast @@ -1128,44 +1286,6 @@ IntPostOrSendMessage(HWND hWnd, return Result; } -static NTSTATUS FASTCALL -CopyMsgToUserMem(MSG *UserModeMsg, MSG *KernelModeMsg) -{ - NTSTATUS Status; - PMSGMEMORY MsgMemoryEntry; - UINT Size; - - /* See if this message type is present in the table */ - MsgMemoryEntry = FindMsgMemory(UserModeMsg->message); - if (NULL == MsgMemoryEntry) - { - /* Not present, no copying needed */ - return STATUS_SUCCESS; - } - - /* Determine required size */ - Size = MsgMemorySize(MsgMemoryEntry, UserModeMsg->wParam, UserModeMsg->lParam); - - if (0 != Size) - { - /* Copy data if required */ - if (0 != (MsgMemoryEntry->Flags & MMS_FLAG_WRITE)) - { - Status = MmCopyToCaller((PVOID) UserModeMsg->lParam, (PVOID) KernelModeMsg->lParam, Size); - if (! NT_SUCCESS(Status)) - { - DPRINT1("Failed to copy message from kernel: invalid usermode buffer\n"); - ExFreePool((PVOID) KernelModeMsg->lParam); - return Status; - } - } - - ExFreePool((PVOID) KernelModeMsg->lParam); - } - - return STATUS_SUCCESS; -} - LRESULT FASTCALL IntDoSendMessage(HWND Wnd, UINT Msg, @@ -1180,6 +1300,7 @@ IntDoSendMessage(HWND Wnd, NTUSERSENDMESSAGEINFO Info; MSG UserModeMsg; MSG KernelModeMsg; + PMSGMEMORY MsgMemoryEntry; RtlZeroMemory(&Info, sizeof(NTUSERSENDMESSAGEINFO)); @@ -1245,7 +1366,8 @@ IntDoSendMessage(HWND Wnd, UserModeMsg.message = Msg; UserModeMsg.wParam = wParam; UserModeMsg.lParam = lParam; - Status = CopyMsgToKernelMem(&KernelModeMsg, &UserModeMsg); + MsgMemoryEntry = FindMsgMemory(UserModeMsg.message); + Status = CopyMsgToKernelMem(&KernelModeMsg, &UserModeMsg, MsgMemoryEntry); if (! NT_SUCCESS(Status)) { MmCopyToCaller(UnsafeInfo, &Info, sizeof(NTUSERSENDMESSAGEINFO)); diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index 95e025ccb85..0b772992743 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.90 2004/04/16 18:53:53 weiden Exp $ +/* $Id: msgqueue.c,v 1.91 2004/04/29 21:13:16 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -493,6 +493,7 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, UserMsg = ExAllocateFromPagedLookasideList(&MessageLookasideList); /* What to do if out of memory? For now we just panic a bit in debug */ ASSERT(UserMsg); + UserMsg->FreeLParam = FALSE; UserMsg->Msg = Msg; InsertTailList(&HardwareMessageQueueHead, &UserMsg->ListEntry); IntLockSystemMessageQueue(OldIrql); @@ -597,7 +598,7 @@ MsqPostKeyboardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) FocusMessageQueue = IntGetFocusMessageQueue(); if( !IntGetScreenDC() ) { if( W32kGetPrimitiveMessageQueue() ) { - MsqPostMessage(W32kGetPrimitiveMessageQueue(), &Msg); + MsqPostMessage(W32kGetPrimitiveMessageQueue(), &Msg, FALSE); } } else { if (FocusMessageQueue == NULL) @@ -610,7 +611,7 @@ MsqPostKeyboardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { Msg.hwnd = FocusMessageQueue->FocusWindow; DPRINT("Msg.hwnd = %x\n", Msg.hwnd); - MsqPostMessage(FocusMessageQueue, &Msg); + MsqPostMessage(FocusMessageQueue, &Msg, FALSE); } else { @@ -665,7 +666,7 @@ MsqPostHotKeyMessage(PVOID Thread, HWND hWnd, WPARAM wParam, LPARAM lParam) // Mesg.pt.y = PsGetWin32Process()->WindowStation->SystemCursor.y; // KeQueryTickCount(&LargeTickCount); // Mesg.time = LargeTickCount.u.LowPart; - MsqPostMessage(Window->MessageQueue, &Mesg); + MsqPostMessage(Window->MessageQueue, &Mesg, FALSE); ObmDereferenceObject(Window); ObDereferenceObject (Thread); @@ -678,7 +679,7 @@ MsqPostHotKeyMessage(PVOID Thread, HWND hWnd, WPARAM wParam, LPARAM lParam) } PUSER_MESSAGE FASTCALL -MsqCreateMessage(LPMSG Msg) +MsqCreateMessage(LPMSG Msg, BOOLEAN FreeLParam) { PUSER_MESSAGE Message; @@ -688,6 +689,7 @@ MsqCreateMessage(LPMSG Msg) return NULL; } + Message->FreeLParam = FreeLParam; RtlMoveMemory(&Message->Msg, Msg, sizeof(MSG)); return Message; @@ -875,11 +877,11 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, } VOID FASTCALL -MsqPostMessage(PUSER_MESSAGE_QUEUE MessageQueue, MSG* Msg) +MsqPostMessage(PUSER_MESSAGE_QUEUE MessageQueue, MSG* Msg, BOOLEAN FreeLParam) { PUSER_MESSAGE Message; - if(!(Message = MsqCreateMessage(Msg))) + if(!(Message = MsqCreateMessage(Msg, FreeLParam))) { return; } diff --git a/reactos/subsys/win32k/ntuser/painting.c b/reactos/subsys/win32k/ntuser/painting.c index 90f17a070df..13ce85c3180 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.80 2004/04/09 20:03:19 navaraf Exp $ + * $Id: painting.c,v 1.81 2004/04/29 21:13:16 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -609,8 +609,8 @@ IntFindWindowToRepaint(HWND hWnd, PW32THREAD Thread) } BOOL FASTCALL -IntGetPaintMessage(HWND hWnd, PW32THREAD Thread, MSG *Message, - BOOL Remove) +IntGetPaintMessage(HWND hWnd, UINT MsgFilterMin, UINT MsgFilterMax, + PW32THREAD Thread, MSG *Message, BOOL Remove) { PWINDOW_OBJECT Window; PUSER_MESSAGE_QUEUE MessageQueue = (PUSER_MESSAGE_QUEUE)Thread->MessageQueue; @@ -625,13 +625,14 @@ IntGetPaintMessage(HWND hWnd, PW32THREAD Thread, MSG *Message, if (Message->hwnd == NULL) { -#if 0 - DPRINT1("PAINTING BUG: Thread marked as containing dirty windows, but no dirty windows found!\n"); -#endif - IntLockMessageQueue(MessageQueue); - MessageQueue->PaintPosted = 0; - MessageQueue->PaintCount = 0; - IntUnLockMessageQueue(MessageQueue); + if (NULL == hWnd) + { + DPRINT1("PAINTING BUG: Thread marked as containing dirty windows, but no dirty windows found!\n"); + IntLockMessageQueue(MessageQueue); + MessageQueue->PaintPosted = 0; + MessageQueue->PaintCount = 0; + IntUnLockMessageQueue(MessageQueue); + } return FALSE; } @@ -639,7 +640,10 @@ IntGetPaintMessage(HWND hWnd, PW32THREAD Thread, MSG *Message, if (Window != NULL) { IntLockWindowUpdate(Window); - if (Window->Flags & WINDOWOBJECT_NEED_NCPAINT) + if (0 != (Window->Flags & WINDOWOBJECT_NEED_NCPAINT) + && ((0 == MsgFilterMin && 0 == MsgFilterMax) || + (MsgFilterMin <= WM_NCPAINT && + WM_NCPAINT <= MsgFilterMax))) { Message->message = WM_NCPAINT; Message->wParam = (WPARAM)Window->NCUpdateRegion; @@ -651,7 +655,9 @@ IntGetPaintMessage(HWND hWnd, PW32THREAD Thread, MSG *Message, Window->Flags &= ~WINDOWOBJECT_NEED_NCPAINT; MsqDecPaintCountQueue(Window->MessageQueue); } - } else + } else if ((0 == MsgFilterMin && 0 == MsgFilterMax) || + (MsgFilterMin <= WM_PAINT && + WM_PAINT <= MsgFilterMax)) { Message->message = WM_PAINT; Message->wParam = Message->lParam = 0; diff --git a/reactos/subsys/win32k/ntuser/timer.c b/reactos/subsys/win32k/ntuser/timer.c index cb2e5301bb0..8dcd7b88f48 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.30 2004/04/09 20:03:19 navaraf Exp $ +/* $Id: timer.c,v 1.31 2004/04/29 21:13:16 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -418,7 +418,7 @@ TimerThreadMain(PVOID StartContext) continue; } - MsqPostMessage(((PW32THREAD)Thread->Win32Thread)->MessageQueue, &MsgTimer->Msg); + MsqPostMessage(((PW32THREAD)Thread->Win32Thread)->MessageQueue, &MsgTimer->Msg, FALSE); ThreadsToDereference[ThreadsToDereferencePos] = Thread; ++ThreadsToDereferencePos; From e9a87d53bd2f094d5e34a878d28f8190e718dbfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Thu, 29 Apr 2004 21:17:36 +0000 Subject: [PATCH 0983/1463] Return NULL only in error case svn path=/trunk/; revision=9248 --- reactos/subsys/win32k/ntuser/window.c | 28 +++++++++++++-------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index d8caa86f263..74eb319fed2 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.220 2004/04/24 14:21:36 weiden Exp $ +/* $Id: window.c,v 1.221 2004/04/29 21:17:36 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -206,25 +206,23 @@ IntWinListChildren(PWINDOW_OBJECT Window) for (Child = Window->FirstChild; Child; Child = Child->NextSibling) ++NumChildren; - if (NumChildren != 0) + List = ExAllocatePoolWithTag(PagedPool, (NumChildren + 1) * sizeof(HWND), TAG_WINLIST); + if(!List) { - List = ExAllocatePoolWithTag(PagedPool, (NumChildren + 1) * sizeof(HWND), TAG_WINLIST); - if(!List) - { - DPRINT1("Failed to allocate memory for children array\n"); - IntUnLockRelatives(Window); - return NULL; - } - for (Child = Window->FirstChild, Index = 0; - Child != NULL; - Child = Child->NextSibling, ++Index) - List[Index] = Child->Self; - List[Index] = NULL; + DPRINT1("Failed to allocate memory for children array\n"); + IntUnLockRelatives(Window); + SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); + return NULL; } + for (Child = Window->FirstChild, Index = 0; + Child != NULL; + Child = Child->NextSibling, ++Index) + List[Index] = Child->Self; + List[Index] = NULL; IntUnLockRelatives(Window); - return (NumChildren > 0) ? List : NULL; + return List; } /*********************************************************************** From 8d041e53555edfd3597285c17b1ea5bcf9f44ce6 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Thu, 29 Apr 2004 22:42:51 +0000 Subject: [PATCH 0984/1463] silence debug message svn path=/trunk/; revision=9249 --- reactos/subsys/win32k/ntuser/msgqueue.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index 0b772992743..eb2ba883787 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.91 2004/04/29 21:13:16 gvg Exp $ +/* $Id: msgqueue.c,v 1.92 2004/04/29 22:42:51 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -859,7 +859,7 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, Entry = Entry->Flink; } IntUnLockMessageQueue(MessageQueue); - DbgPrint("MsqSendMessage timed out\n"); + DPRINT("MsqSendMessage timed out\n"); break; } while (MsqDispatchOneSentMessage(ThreadQueue)) From db615bc523115c571f06475751098c9c465dffaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Fri, 30 Apr 2004 09:55:16 +0000 Subject: [PATCH 0985/1463] =?UTF-8?q?Fix=20TB=5FGETSTYLE=20to=20return=20t?= =?UTF-8?q?he=20style=20of=20the=20toolbar=20when=20wParam=20is=200.=20Spo?= =?UTF-8?q?tted=20by=20Maxime=20Belleng=EF=BF=BD=20.=20Fixes=20bug=20#290.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit svn path=/trunk/; revision=9250 --- reactos/lib/comctl32/toolbar.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/lib/comctl32/toolbar.c b/reactos/lib/comctl32/toolbar.c index c0c775b20e8..5362291e53b 100644 --- a/reactos/lib/comctl32/toolbar.c +++ b/reactos/lib/comctl32/toolbar.c @@ -3494,6 +3494,8 @@ TOOLBAR_GetStyle (HWND hwnd, WPARAM wParam, LPARAM lParam) TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); INT nIndex; + if (wParam == 0) return GetWindowLongW(hwnd, GWL_STYLE); + nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE); if (nIndex == -1) return -1; From 8352c9c08297b458a637c041a7bafaee8789fe11 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Fri, 30 Apr 2004 14:22:44 +0000 Subject: [PATCH 0986/1463] fixed brush origin svn path=/trunk/; revision=9251 --- reactos/subsys/win32k/eng/bitblt.c | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/reactos/subsys/win32k/eng/bitblt.c b/reactos/subsys/win32k/eng/bitblt.c index 784209f4d35..76968a1e8ee 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.52 2004/04/25 11:34:13 weiden Exp $ +/* $Id: bitblt.c,v 1.53 2004/04/30 14:22:44 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -371,7 +371,6 @@ EngBitBlt(SURFOBJ *DestObj, OutputRect.top = DestRect->top + Translate.y; OutputRect.bottom = DestRect->bottom + Translate.y; - #if 0 if(BrushOrigin) { AdjustedBrushOrigin.x = BrushOrigin->x + Translate.x; @@ -379,9 +378,6 @@ EngBitBlt(SURFOBJ *DestObj, } else AdjustedBrushOrigin = Translate; - #else - AdjustedBrushOrigin = (BrushOrigin ? *BrushOrigin : Translate); - #endif if (NULL != OutputObj) { @@ -742,7 +738,7 @@ EngStretchBlt( OutputRect.right = prclDest->right + Translate.x; OutputRect.top = prclDest->top + Translate.y; OutputRect.bottom = prclDest->bottom + Translate.y; -#if 0 + if(BrushOrigin) { AdjustedBrushOrigin.x = BrushOrigin->x + Translate.x; @@ -750,9 +746,6 @@ EngStretchBlt( } else AdjustedBrushOrigin = Translate; -#else - AdjustedBrushOrigin = (BrushOrigin ? *BrushOrigin : Translate); -#endif if (NULL != OutputObj) { @@ -1140,8 +1133,7 @@ EngMaskBitBlt(SURFOBJ *DestObj, OutputRect.right = DestRect->right + Translate.x; OutputRect.top = DestRect->top + Translate.y; OutputRect.bottom = DestRect->bottom + Translate.y; - -#if 0 + if(BrushOrigin) { AdjustedBrushOrigin.x = BrushOrigin->x + Translate.x; @@ -1149,9 +1141,6 @@ EngMaskBitBlt(SURFOBJ *DestObj, } else AdjustedBrushOrigin = Translate; -#else - AdjustedBrushOrigin = (BrushOrigin ? *BrushOrigin : Translate); -#endif if (NULL != OutputObj) { From c7eed44a9423033e51ff7cf892c191c6ff50dc30 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 30 Apr 2004 16:52:42 +0000 Subject: [PATCH 0987/1463] CMD Enhancements: - Fixed UNICODE build. - Make the DIR /W behave like in Windows. - Fixed various problems with command input going mad when the screen contents have scrolled. svn path=/trunk/; revision=9252 --- reactos/subsys/system/cmd/cmd.c | 63 ++++++------- reactos/subsys/system/cmd/cmdinput.c | 131 ++++++++++++++++----------- reactos/subsys/system/cmd/console.c | 20 +++- reactos/subsys/system/cmd/dir.c | 94 ++++++++++++++----- reactos/subsys/system/cmd/echo.c | 16 ++-- reactos/subsys/system/cmd/filecomp.c | 42 ++++++++- reactos/subsys/system/cmd/misc.c | 3 +- reactos/subsys/system/cmd/ver.c | 4 +- 8 files changed, 243 insertions(+), 130 deletions(-) diff --git a/reactos/subsys/system/cmd/cmd.c b/reactos/subsys/system/cmd/cmd.c index 43f31780229..2b04cef9ccc 100644 --- a/reactos/subsys/system/cmd/cmd.c +++ b/reactos/subsys/system/cmd/cmd.c @@ -1,4 +1,4 @@ -/* $Id: cmd.c,v 1.11 2004/04/26 20:26:15 gdalsnes Exp $ +/* $Id: cmd.c,v 1.12 2004/04/30 16:52:41 navaraf Exp $ * * CMD.C - command-line interface. * @@ -119,6 +119,9 @@ * * 23-Feb-2001 (Carl Nettelblad ) * %envvar% replacement conflicted with for. + * + * 30-Apr-2004 (Filip Navara ) + * Make MakeSureDirectoryPathExistsEx unicode safe. */ #include "config.h" @@ -178,41 +181,39 @@ WORD wDefColor; /* default color */ * * FIXME: maybe put this in a header/library where everyone can use it????? */ -BOOL WINAPI MakeSureDirectoryPathExistsEx(LPCSTR DirPath, BOOL FileAtEnd) +BOOL WINAPI MakeSureDirectoryPathExistsEx(LPCTSTR DirPath, BOOL FileAtEnd) { - char Path[MAX_PATH]; - char *SlashPos = Path; - char Slash; - BOOL bRes; + TCHAR Path[MAX_PATH]; + TCHAR *SlashPos = Path; + TCHAR Slash; + BOOL bRes; - strcpy(Path, DirPath); - - while((SlashPos=strpbrk(SlashPos+1,"\\/"))) - { - Slash = *SlashPos; - *SlashPos = 0; + _tcscpy(Path, DirPath); + while ((SlashPos = _tcspbrk(SlashPos + 1, _T("\\/")))) + { + Slash = *SlashPos; + *SlashPos = 0; - bRes = CreateDirectoryA(Path, NULL); - if (bRes == FALSE && GetLastError() != ERROR_ALREADY_EXISTS) - { - return FALSE; - } + bRes = CreateDirectory(Path, NULL); + if (bRes == FALSE && GetLastError() != ERROR_ALREADY_EXISTS) + { + return FALSE; + } - *SlashPos = Slash; - - if (*(SlashPos+1) == 0) return TRUE; - } + *SlashPos = Slash; + if (*(SlashPos + 1) == 0) return TRUE; + } - if (!FileAtEnd) - { - bRes = CreateDirectoryA(Path, NULL); - if (bRes == FALSE && GetLastError() != ERROR_ALREADY_EXISTS) - { - return FALSE; - } - } + if (!FileAtEnd) + { + bRes = CreateDirectory(Path, NULL); + if (bRes == FALSE && GetLastError() != ERROR_ALREADY_EXISTS) + { + return FALSE; + } + } - return TRUE; + return TRUE; } @@ -564,7 +565,7 @@ VOID ParseCommandLine (LPTSTR cmd) #ifdef FEATURE_REDIRECTION /* find the temp path to store temporary files */ GetTempPath (MAX_PATH, szTempPath); - MakeSureDirectoryPathExistsEx(szTempPath, FALSE); + MakeSureDirectoryPathExistsEx(szTempPath, FALSE); if (szTempPath[_tcslen (szTempPath) - 1] != _T('\\')) _tcscat (szTempPath, _T("\\")); diff --git a/reactos/subsys/system/cmd/cmdinput.c b/reactos/subsys/system/cmd/cmdinput.c index 4e4ae611273..bb8187052d2 100644 --- a/reactos/subsys/system/cmd/cmdinput.c +++ b/reactos/subsys/system/cmd/cmdinput.c @@ -92,6 +92,9 @@ * input queue when you pressed . This sometimes caused * some very strange effects. * Fixed some command line editing annoyances. + * + * 30-Apr-2004 (Filip Navara ) + * Fixed problems when the screen was scrolled away. */ #include "config.h" @@ -133,6 +136,7 @@ VOID ReadCommand (LPTSTR str, INT maxlen) SHORT orgy; SHORT curx; /*current x/y cursor position*/ SHORT cury; + SHORT tempscreen; INT count; /*used in some for loops*/ INT current = 0; /*the position of the cursor in the string (str)*/ INT charcount = 0;/*chars in the string (str)*/ @@ -149,6 +153,7 @@ VOID ReadCommand (LPTSTR str, INT maxlen) PrintPrompt(); GetCursorXY (&orgx, &orgy); + GetCursorXY (&curx, &cury); memset (str, 0, maxlen * sizeof (TCHAR)); @@ -179,6 +184,8 @@ VOID ReadCommand (LPTSTR str, INT maxlen) ClearCommandLine (str, maxlen, orgx, orgy); current = charcount = 0; + curx = orgx; + cury = orgy; bContinue=TRUE; break; } @@ -192,6 +199,7 @@ VOID ReadCommand (LPTSTR str, INT maxlen) History_del_current_entry(str); current = charcount = _tcslen (str); ConOutPrintf (_T("%s"), str); + GetCursorXY (&curx, &cury); bContinue=TRUE; break; } @@ -222,12 +230,15 @@ VOID ReadCommand (LPTSTR str, INT maxlen) if (GetCursorX () != 0) { ConOutPrintf (_T("\b \b")); + curx--; } else { SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1)); ConOutChar (_T(' ')); SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1)); + cury--; + curx = maxx - 1; } } else @@ -235,9 +246,16 @@ VOID ReadCommand (LPTSTR str, INT maxlen) for (count = current - 1; count < charcount; count++) str[count] = str[count + 1]; if (GetCursorX () != 0) + { SetCursorXY ((SHORT)(GetCursorX () - 1), GetCursorY ()); + curx--; + } else + { SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1)); + cury--; + curx = maxx - 1; + } GetCursorXY (&curx, &cury); ConOutPrintf (_T("%s "), &str[current - 1]); SetCursorXY (curx, cury); @@ -271,6 +289,8 @@ VOID ReadCommand (LPTSTR str, INT maxlen) if (current != 0) { SetCursorXY (orgx, orgy); + curx = orgx; + cury = orgy; current = 0; } break; @@ -281,6 +301,7 @@ VOID ReadCommand (LPTSTR str, INT maxlen) { SetCursorXY (orgx, orgy); ConOutPrintf (_T("%s"), str); + GetCursorXY (&curx, &cury); current = charcount; } break; @@ -295,6 +316,7 @@ VOID ReadCommand (LPTSTR str, INT maxlen) if (wLastKey != VK_TAB) { /* if first TAB, complete filename*/ + tempscreen = charcount; CompleteFilename (str, charcount); charcount = _tcslen (str); current = charcount; @@ -305,12 +327,24 @@ VOID ReadCommand (LPTSTR str, INT maxlen) SetCursorXY (orgx, orgy); ConOutPrintf (_T("%s"), str); - if ((charcount > (USHORT)(maxx - orgx)) && (orgy == maxy + 1)) - orgy--; + + if (tempscreen > charcount) + { + GetCursorXY (&curx, &cury); + for (count = tempscreen - charcount; count--; ) + ConOutChar (_T(' ')); + SetCursorXY (curx, cury); + } + else + { + if (((charcount + orgx) / maxx) + orgy > maxy - 1) + orgy += maxy - ((charcount + orgx) / maxx + orgy + 1); + } /* set cursor position */ SetCursorXY ((orgx + current) % maxx, orgy + (orgx + current) / maxx); + GetCursorXY (&curx, &cury); } else { @@ -324,6 +358,7 @@ VOID ReadCommand (LPTSTR str, INT maxlen) /* set cursor position */ SetCursorXY ((orgx + current) % maxx, orgy + (orgx + current) / maxx); + GetCursorXY (&curx, &cury); } } @@ -366,6 +401,8 @@ VOID ReadCommand (LPTSTR str, INT maxlen) case VK_ESCAPE: /* clear str Make this callable! */ ClearCommandLine (str, maxlen, orgx, orgy); + curx = orgx; + cury = orgy; current = charcount = 0; break; @@ -379,7 +416,10 @@ VOID ReadCommand (LPTSTR str, INT maxlen) ClearCommandLine (str, maxlen, orgx, orgy); History (-1, str); current = charcount = _tcslen (str); + if (((charcount + orgx) / maxx) + orgy > maxy - 1) + orgy += maxy - ((charcount + orgx) / maxx + orgy + 1); ConOutPrintf (_T("%s"), str); + GetCursorXY (&curx, &cury); #endif break; @@ -389,7 +429,10 @@ VOID ReadCommand (LPTSTR str, INT maxlen) ClearCommandLine (str, maxlen, orgx, orgy); History (1, str); current = charcount = _tcslen (str); + if (((charcount + orgx) / maxx) + orgy > maxy - 1) + orgy += maxy - ((charcount + orgx) / maxx + orgy + 1); ConOutPrintf (_T("%s"), str); + GetCursorXY (&curx, &cury); #endif break; @@ -399,9 +442,16 @@ VOID ReadCommand (LPTSTR str, INT maxlen) { current--; if (GetCursorX () == 0) + { SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1)); + curx = maxx - 1; + cury--; + } else + { SetCursorXY ((SHORT)(GetCursorX () - 1), GetCursorY ()); + curx--; + } } else { @@ -419,52 +469,19 @@ VOID ReadCommand (LPTSTR str, INT maxlen) { current++; if (GetCursorX () == maxx - 1) + { SetCursorXY (0, (SHORT)(GetCursorY () + 1)); + curx = 0; + cury++; + } else + { SetCursorXY ((SHORT)(GetCursorX () + 1), GetCursorY ()); + curx++; + } } break; -#if 0 - -#ifdef FEATURE_HISTORY - - - /*!!!WARNING!!!*/ - /*this will only work as long as the two if statement - evaluates the same expression and a break is included - in each if statement. - This can be used for any combination using CTRL. - For other combinations is needed another system*/ - - case 'K': - /*add the current command line to the history*/ - if (ir.Event.KeyEvent.dwControlKeyState & - (LEFT_CTRL_PRESSED|RIGHT_CTRL_PRESSED)) - { - - if (str[0]) - History(0,str); - - ClearCommandLine (str, maxlen, orgx, orgy); - current = charcount = 0; - break; - } - - case 'D': - if (ir.Event.KeyEvent.dwControlKeyState & - (LEFT_CTRL_PRESSED|RIGHT_CTRL_PRESSED)) - { - ClearCommandLine (str, maxlen, orgx, orgy); - History_del_current_entry(str); - current = charcount = _tcslen (str); - ConOutPrintf (_T("%s"), str); - break; - } - -#endif/*FEATURE_HISTORY*/ -#endif/*0*/ - default: #ifdef _UNICODE ch = ir.Event.KeyEvent.uChar.UnicodeChar; @@ -477,22 +494,24 @@ VOID ReadCommand (LPTSTR str, INT maxlen) /* insert character into string... */ if (bInsert && current != charcount) { + /* If this character insertion will cause screen scrolling, + * adjust the saved origin of the command prompt. */ + tempscreen = _tcslen(str + current) + curx; + if ((tempscreen % maxx) == (maxx - 1) && + (tempscreen / maxx) + cury == (maxy - 1)) + { + orgy--; + cury--; + } + for (count = charcount; count > current; count--) str[count] = str[count - 1]; str[current++] = ch; - if (GetCursorX () == maxx - 1) - { - curx = 0; - cury = GetCursorY () + 1; - } + if (curx == maxx - 1) + curx = 0, cury++; else - { - GetCursorXY (&curx, &cury); curx++; - } ConOutPrintf (_T("%s"), &str[current - 1]); - if ((_tcslen (str) > (USHORT)(maxx - orgx)) && (orgy == maxy + 1)) - cury--; SetCursorXY (curx, cury); charcount++; } @@ -501,10 +520,14 @@ VOID ReadCommand (LPTSTR str, INT maxlen) if (current == charcount) charcount++; str[current++] = ch; + if (GetCursorX () == maxx - 1 && GetCursorY () == maxy - 1) + orgy--, cury--; + if (GetCursorX () == maxx - 1) + curx = 0, cury++; + else + curx++; ConOutChar (ch); } - if ((_tcslen (str) > (USHORT)(maxx - orgx)) && (orgy == maxy + 1)) - orgy--; } #if 0 else diff --git a/reactos/subsys/system/cmd/console.c b/reactos/subsys/system/cmd/console.c index 5273b63974c..35a16c3a453 100644 --- a/reactos/subsys/system/cmd/console.c +++ b/reactos/subsys/system/cmd/console.c @@ -1,4 +1,4 @@ -/* $Id: console.c,v 1.4 2003/08/13 05:18:40 jimtabor Exp $ +/* $Id: console.c,v 1.5 2004/04/30 16:52:41 navaraf Exp $ * * CONSOLE.C - console input/output functions. * @@ -106,8 +106,8 @@ VOID ConInString (LPTSTR lpInput, DWORD dwLength) DWORD i; PCHAR pBuf; -#ifdef UNICODE - pBuf = (PCHAR)alloca(dwLength); +#ifdef _UNICODE + pBuf = (PCHAR)malloc(dwLength); #else pBuf = lpInput; #endif @@ -132,6 +132,10 @@ VOID ConInString (LPTSTR lpInput, DWORD dwLength) } } +#ifdef _UNICODE + free(pBuf); +#endif + SetConsoleMode (hFile, dwOldMode); } @@ -169,7 +173,7 @@ VOID ConPuts(LPTSTR szText, DWORD nStdHandle) len = _tcslen(szText); #ifdef _UNICODE - pBuf = alloca(len + 1); + pBuf = malloc(len + 1); len = WideCharToMultiByte(CP_ACP, 0, szText, len + 1, pBuf, len + 1, NULL, NULL) - 1; #else pBuf = szText; @@ -184,6 +188,9 @@ VOID ConPuts(LPTSTR szText, DWORD nStdHandle) 1, &dwWritten, NULL); +#ifdef UNICODE + free(pBuf); +#endif } VOID ConOutPuts (LPTSTR szText) @@ -201,7 +208,7 @@ VOID ConPrintf(LPTSTR szFormat, va_list arg_ptr, DWORD nStdHandle) len = _vstprintf (szOut, szFormat, arg_ptr); #ifdef _UNICODE - pBuf = alloca(len + 1); + pBuf = malloc(len + 1); len = WideCharToMultiByte(CP_ACP, 0, szOut, len + 1, pBuf, len + 1, NULL, NULL) - 1; #else pBuf = szOut; @@ -211,6 +218,9 @@ VOID ConPrintf(LPTSTR szFormat, va_list arg_ptr, DWORD nStdHandle) len, &dwWritten, NULL); +#ifdef UNICODE + free(pBuf); +#endif } diff --git a/reactos/subsys/system/cmd/dir.c b/reactos/subsys/system/cmd/dir.c index 05a2d351ae9..653f711e5c9 100644 --- a/reactos/subsys/system/cmd/dir.c +++ b/reactos/subsys/system/cmd/dir.c @@ -1,4 +1,4 @@ -/* $Id: dir.c,v 1.8 2004/01/28 17:47:27 gvg Exp $ +/* $Id: dir.c,v 1.9 2004/04/30 16:52:41 navaraf Exp $ * * DIR.C - dir internal command. * @@ -116,6 +116,9 @@ * * 28-Jan-2004 (Michael Fritscher ) * Fix for /p, so it is working under Windows in GUI-mode, too. + * + * 30-Apr-2004 (Filip Navara ) + * Fix /w to print long names. */ #include "config.h" @@ -131,10 +134,6 @@ #include "cmd.h" -typedef BOOL STDCALL -(*PGETFREEDISKSPACEEX)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER); - - /* flag definitions */ enum { @@ -150,6 +149,10 @@ enum }; +typedef BOOL STDCALL +(*PGETFREEDISKSPACEEX)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER); + + /* Globally save the # of dirs, files and bytes, * probabaly later pass them to functions. Rob Lake */ static ULONG recurse_dir_cnt; @@ -282,19 +285,36 @@ DirReadParam (LPTSTR line, LPTSTR *param, LPDWORD lpFlags) { if (*param) { - error_too_many_parameters (*param); + error_too_many_parameters (line); return FALSE; } *param = line; /* skip to end of line or next whitespace or next / */ - while (*line && !_istspace (*line) && *line != _T('/')) + if (*line != _T('\"')) + { + while (*line && !_istspace (*line) && *line != _T('/')) + line++; + + /* if end of line, return */ + if (!*line) + return TRUE; + } + else + { + /* skip over the initial quote */ + (*param)++; line++; - /* if end of line, return */ - if (!*line) - return TRUE; + while (*line && *line != _T('"')) + line++; + + if (*line == _T('"')) + *line = 0; + else + return TRUE; + } /* if parameter, remember to process it later */ if (*line == _T('/')) @@ -843,6 +863,8 @@ DirList (LPTSTR szPath, LPTSTR szFilespec, LPINT pLine, DWORD dwFlags) ULONG filecount = 0; ULONG dircount = 0; INT count; + USHORT screenwidth; + INT longestfname = 0; bytecount.QuadPart = 0; @@ -869,6 +891,34 @@ DirList (LPTSTR szPath, LPTSTR szFilespec, LPINT pLine, DWORD dwFlags) return 0; } + /* Get the size of longest filename for wide listing. FN */ + if (dwFlags & DIR_WIDE && (dwFlags & DIR_BARE) == 0) + { + do + { + if (_tcslen(file.cFileName) > longestfname) + { + longestfname = _tcslen(file.cFileName); + /* Directories get extra brackets around them. */ + if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + longestfname += 2; + } + } + while (FindNextFile (hFile, &file)); + FindClose (hFile); + + hFile = FindFirstFile (szFullPath, &file); + + /* Count the highest number of columns */ + GetScreenSize(&screenwidth, 0); + + /* For counting columns of output */ + count = 0; + + /* Increase by the number of spaces behind file name */ + longestfname += 3; + } + /* moved down here because if we are recursively searching and * don't find any files, we don't want just to print * Directory of C:\SOMEDIR @@ -885,9 +935,6 @@ DirList (LPTSTR szPath, LPTSTR szFilespec, LPINT pLine, DWORD dwFlags) return 1; } - /* For counting columns of output */ - count = 0; - do { /* next file, if user doesn't want all files */ @@ -907,27 +954,24 @@ DirList (LPTSTR szPath, LPTSTR szFilespec, LPINT pLine, DWORD dwFlags) if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - if (file.cAlternateFileName[0] == _T('\0')) - _stprintf (buffer, _T("[%s]"), file.cFileName); - else - _stprintf (buffer, _T("[%s]"), file.cAlternateFileName); + _stprintf (buffer, _T("[%s]"), file.cFileName); dircount++; } else { - if (file.cAlternateFileName[0] == _T('\0')) - _stprintf (buffer, _T("%s"), file.cFileName); - else - _stprintf (buffer, _T("%s"), file.cAlternateFileName); + _stprintf (buffer, _T("%s"), file.cFileName); filecount++; } - ConOutPrintf (_T("%-15s"), buffer); + ConOutPrintf (_T("%*s"), - longestfname, buffer); count++; - if (count == 5) + /* output as much columns as fits on the screen */ + if (count >= (screenwidth / longestfname)) { - /* output 5 columns */ - ConOutPrintf (_T("\n")); + /* print the new line only if we aren't on the + * last column, in this case it wraps anyway */ + if (count * longestfname != screenwidth) + ConOutPrintf (_T("\n")); if (IncLine (pLine, dwFlags)) return 1; count = 0; diff --git a/reactos/subsys/system/cmd/echo.c b/reactos/subsys/system/cmd/echo.c index 361292fcc50..0e5dfe9131b 100644 --- a/reactos/subsys/system/cmd/echo.c +++ b/reactos/subsys/system/cmd/echo.c @@ -1,4 +1,4 @@ -/* $Id: echo.c,v 1.2 2003/08/07 09:27:42 hbirr Exp $ +/* $Id: echo.c,v 1.3 2004/04/30 16:52:41 navaraf Exp $ * * ECHO.C - internal echo commands. * @@ -42,13 +42,13 @@ INT CommandEcho (LPTSTR cmd, LPTSTR param) if (!_tcsncmp (param, _T("/?"), 2)) { - ConOutPuts ("Displays a message or switches command echoing on or off.\n" - "\n" - " ECHO [ON | OFF]\n" - " ECHO [message]\n" - " ECHO. prints an empty line\n" - "\n" - "Type ECHO without a parameter to display the current ECHO setting."); + ConOutPuts (_T("Displays a message or switches command echoing on or off.\n" + "\n" + " ECHO [ON | OFF]\n" + " ECHO [message]\n" + " ECHO. prints an empty line\n" + "\n" + "Type ECHO without a parameter to display the current ECHO setting.")); return 0; } diff --git a/reactos/subsys/system/cmd/filecomp.c b/reactos/subsys/system/cmd/filecomp.c index abb4fb843e8..b79ce848756 100644 --- a/reactos/subsys/system/cmd/filecomp.c +++ b/reactos/subsys/system/cmd/filecomp.c @@ -11,6 +11,9 @@ * * 25-Jan-1999 (Eric Kohl ) * Cleanup. Unicode safe! + * + * 30-Apr-2004 (Filip Navara ) + * Make the file listing readable when there is a lot of long names. */ #include "config.h" @@ -217,6 +220,8 @@ BOOL ShowCompletionMatches (LPTSTR str, INT charcount) TCHAR path[MAX_PATH]; TCHAR fname[MAX_PATH]; TCHAR directory[MAX_PATH]; + INT longestfname = 0; + SHORT screenwidth; /* expand current file name */ count = charcount - 1; @@ -283,9 +288,33 @@ BOOL ShowCompletionMatches (LPTSTR str, INT charcount) hFile = FindFirstFile (path, &file); if (hFile != INVALID_HANDLE_VALUE) { + /* Get the size of longest filename first. */ + do + { + if (_tcslen(file.cFileName) > longestfname) + { + longestfname = _tcslen(file.cFileName); + /* Directories get extra brackets around them. */ + if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + longestfname += 2; + } + } + while (FindNextFile (hFile, &file)); + FindClose (hFile); + + hFile = FindFirstFile (path, &file); + + /* Count the highest number of columns */ + GetScreenSize(&screenwidth, 0); + + /* For counting columns of output */ + count = 0; + + /* Increase by the number of spaces behind file name */ + longestfname += 3; + /* find anything */ ConOutChar (_T('\n')); - count = 0; do { /* ignore . and .. */ @@ -298,10 +327,15 @@ BOOL ShowCompletionMatches (LPTSTR str, INT charcount) else _tcscpy (fname, file.cFileName); - ConOutPrintf (_T("%-14s"), fname); - if (++count == 5) + ConOutPrintf (_T("%*s"), - longestfname, fname); + count++; + /* output as much columns as fits on the screen */ + if (count >= (screenwidth / longestfname)) { - ConOutChar (_T('\n')); + /* print the new line only if we aren't on the + * last column, in this case it wraps anyway */ + if (count * longestfname != screenwidth) + ConOutPrintf (_T("\n")); count = 0; } } diff --git a/reactos/subsys/system/cmd/misc.c b/reactos/subsys/system/cmd/misc.c index 480b9d77921..4424e20c42f 100644 --- a/reactos/subsys/system/cmd/misc.c +++ b/reactos/subsys/system/cmd/misc.c @@ -376,7 +376,7 @@ BOOL FileGetString (HANDLE hFile, LPTSTR lpBuffer, INT nBufferLength) DWORD dwRead; INT len; #ifdef _UNICODE - lpString = alloca(nBufferLength); + lpString = malloc(nBufferLength); #else lpString = lpBuffer; #endif @@ -399,6 +399,7 @@ BOOL FileGetString (HANDLE hFile, LPTSTR lpBuffer, INT nBufferLength) lpString[len++] = '\0'; #ifdef _UNICODE MultiByteToWideChar(CP_ACP, 0, lpString, len, lpBuffer, len); + free(lpString); #endif return TRUE; } diff --git a/reactos/subsys/system/cmd/ver.c b/reactos/subsys/system/cmd/ver.c index 2f84d345712..5ffa9fe5c2f 100644 --- a/reactos/subsys/system/cmd/ver.c +++ b/reactos/subsys/system/cmd/ver.c @@ -41,11 +41,11 @@ VOID ShortVersion (VOID) VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); if (GetVersionEx(&VersionInfo) && 0 == _tcsnicmp(VersionInfo.szCSDVersion, _T("ReactOS"), 7)) { - ConOutPrintf(_T("%s running on %s"), SHELLVER, VersionInfo.szCSDVersion); + ConOutPrintf(_T("%S running on %s"), SHELLVER, VersionInfo.szCSDVersion); } else { - ConOutPuts(SHELLVER); + ConOutPrintf(_T("%S"), SHELLVER); } ConOutPuts (_T("\n")); } From afb4fdb6f1f87329fccfa6c6dfcba4ce11ab2492 Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Fri, 30 Apr 2004 17:56:14 +0000 Subject: [PATCH 0988/1463] Remove Visual Mingw. It didnt build anyway, svn path=/trunk/; revision=9253 --- rosapps/devutils/vmingw/.cvsignore | 8 - rosapps/devutils/vmingw/CList.cpp | 328 ---- rosapps/devutils/vmingw/CList.h | 79 - rosapps/devutils/vmingw/GNU-GPL.txt | 340 ---- rosapps/devutils/vmingw/Makefile.ros | 29 - rosapps/devutils/vmingw/SciLexer.dll | Bin 260096 -> 0 bytes rosapps/devutils/vmingw/SciLexer.h | 300 --- rosapps/devutils/vmingw/Scintilla.h | 599 ------ rosapps/devutils/vmingw/editor.cpp | 834 -------- rosapps/devutils/vmingw/editor.h | 165 -- rosapps/devutils/vmingw/license.htm | 121 -- rosapps/devutils/vmingw/license.txt | 59 - rosapps/devutils/vmingw/main.cpp | 2622 -------------------------- rosapps/devutils/vmingw/main.h | 385 ---- rosapps/devutils/vmingw/process.cpp | 682 ------- rosapps/devutils/vmingw/process.h | 146 -- rosapps/devutils/vmingw/project.cpp | 1453 -------------- rosapps/devutils/vmingw/project.h | 295 --- rosapps/devutils/vmingw/rsrc.h | 168 -- rosapps/devutils/vmingw/toolbar.bmp | Bin 4918 -> 0 bytes rosapps/devutils/vmingw/treeview.bmp | Bin 2870 -> 0 bytes rosapps/devutils/vmingw/vmingw.prj | 91 - rosapps/devutils/vmingw/vmingw.rc | 399 ---- rosapps/devutils/vmingw/winui.cpp | 2117 --------------------- rosapps/devutils/vmingw/winui.h | 529 ------ 25 files changed, 11749 deletions(-) delete mode 100644 rosapps/devutils/vmingw/.cvsignore delete mode 100644 rosapps/devutils/vmingw/CList.cpp delete mode 100644 rosapps/devutils/vmingw/CList.h delete mode 100644 rosapps/devutils/vmingw/GNU-GPL.txt delete mode 100644 rosapps/devutils/vmingw/Makefile.ros delete mode 100644 rosapps/devutils/vmingw/SciLexer.dll delete mode 100644 rosapps/devutils/vmingw/SciLexer.h delete mode 100644 rosapps/devutils/vmingw/Scintilla.h delete mode 100644 rosapps/devutils/vmingw/editor.cpp delete mode 100644 rosapps/devutils/vmingw/editor.h delete mode 100644 rosapps/devutils/vmingw/license.htm delete mode 100644 rosapps/devutils/vmingw/license.txt delete mode 100644 rosapps/devutils/vmingw/main.cpp delete mode 100644 rosapps/devutils/vmingw/main.h delete mode 100644 rosapps/devutils/vmingw/process.cpp delete mode 100644 rosapps/devutils/vmingw/process.h delete mode 100644 rosapps/devutils/vmingw/project.cpp delete mode 100644 rosapps/devutils/vmingw/project.h delete mode 100644 rosapps/devutils/vmingw/rsrc.h delete mode 100644 rosapps/devutils/vmingw/toolbar.bmp delete mode 100644 rosapps/devutils/vmingw/treeview.bmp delete mode 100644 rosapps/devutils/vmingw/vmingw.prj delete mode 100644 rosapps/devutils/vmingw/vmingw.rc delete mode 100644 rosapps/devutils/vmingw/winui.cpp delete mode 100644 rosapps/devutils/vmingw/winui.h diff --git a/rosapps/devutils/vmingw/.cvsignore b/rosapps/devutils/vmingw/.cvsignore deleted file mode 100644 index 2aa1a201b8e..00000000000 --- a/rosapps/devutils/vmingw/.cvsignore +++ /dev/null @@ -1,8 +0,0 @@ -*.o -*.sym -*.coff -*.exe -*.ini -*.bat -ChangeLog -*.map diff --git a/rosapps/devutils/vmingw/CList.cpp b/rosapps/devutils/vmingw/CList.cpp deleted file mode 100644 index a9666805be4..00000000000 --- a/rosapps/devutils/vmingw/CList.cpp +++ /dev/null @@ -1,328 +0,0 @@ -/******************************************************************** -* Class: CList.cpp. This is part of WinUI. -* -* Purpose: A simple way to create doubly linked lists. -* -* Authors: Originally coded by Claude Catonio. -* -* License: Original code was public domain. -* Present revised CList classes are covered by GNU General Public License. -* -* Revisions: -* Manu B. 10/05/01 Terms was translated to English. -* Manu B. 10/16/01 Add CList::Destroy(CNode *node) method. -* Manu B. 11/12/01 Add InsertBefore/InsertAfter methods. -* Manu B. 11/17/01 First() & Last() now returns an integer value. -* Manu B. 11/19/01 CNode::Destroy() returns next node by default. -* Manu B. 12/28/01 Simplify CList, add InsertSorted(). -* Manu B. 03/13/02 Suppress CNode methods, next and prev are public. -* Manu B. 03/28/02 Add Compare(). -* -********************************************************************/ -#include "CList.h" - -/******************************************************************** -* Class: CList. -* -* Purpose: List management. -* -* Revisions: -* -********************************************************************/ -CList::~CList(){ - //MessageBox (0, "CList", "destructor", MB_OK); - while (first != NULL){ - current = first; - first = first->next; - delete current; - } - current = last = first; - count = 0; -} - -/******************************************************************** -* Browse the list. -********************************************************************/ -CNode * CList::First(){ - current = first; -return current; -} - -CNode * CList::Last(){ - current = last; -return current; -} - -CNode * CList::Prev(){ - // Empty list ? - if (first != NULL){ - if(current->prev == NULL){ - // No previous node. - return NULL; - }else{ - // A previous one. - current = current->prev; - return current; - } - } -return NULL; -} - -CNode * CList::Next(){ - // Empty list ? - if (first != NULL){ - if(current->next == NULL){ - // No next node. - return NULL; - }else{ - // A next one. - current = current->next; - return current; - } - } -return NULL; -} - -/******************************************************************** -* Insert nodes. -********************************************************************/ -void CList::InsertFirst(CNode *node){ - if(first == NULL){ - // Empty list. - first = last = node; - }else{ - // Set node pointers. - node->prev = NULL; - node->next = first; - // Insert in the list. - first->prev = node; - first = node; - } - // Set current node, increment the node counter. - current = node; - count++; -} - -void CList::InsertLast(CNode *node){ - if(first == NULL){ - // Empty list. - first = last = node; - }else{ - // Set node pointers. - node->prev = last; - node->next = NULL; - // Insert in the list. - last->next = node; - last = node; - } - // Set current node, increment the node counter. - current = node; - count++; -} - -void CList::InsertBefore(CNode *node){ - if(first == NULL){ - // Empty list. - first = last = node; - }else{ - if (current == first) - first = node; - // Set node pointers. - node->prev = current->prev; - node->next = current; - // Insert in the list. - if (node->prev) - node->prev->next = node; - current->prev = node; - } - // Set current node, increment the node counter. - current = node; - count++; -} - -void CList::InsertAfter(CNode *node){ - if(first == NULL){ - // Empty list. - first = last = node; - }else{ - if (current == last) - last = node; - // Set node pointers. - node->prev = current; - node->next = current->next; - // Insert in the list. - if (node->next) - node->next->prev = node; - current->next = node; - } - // Set current node, increment the node counter. - current = node; - count++; -} - -bool CList::InsertSorted(CNode * newNode){ - // Get the current node. - CNode * currentNode = GetCurrent(); - int cmpResult; - - if(!currentNode){ - // The list is empty, InsertFirst() and return. - InsertFirst(newNode); - return true; - } - - // Compare new node and current node data to know if we must parse Up - // or Down from current node. - cmpResult = Compare(newNode, currentNode); - - // Search Up ----------------------------------------------------------------- - if (cmpResult == -1){ - // Parse the list while there's a previous node. - while (Prev()){ - currentNode = GetCurrent(); - cmpResult = Compare(newNode, currentNode); - - if (cmpResult == 1){ - // Correct position found. - InsertAfter(newNode); - return true; - }else if (cmpResult == 0){ - // Don't add a file twice. - return false; - } - } - // There's no previous node, so insert first. - InsertFirst(newNode); - return true; - } - // Search Down -------------------------------------------------------------- - else if (cmpResult == 1){ - // Parse the list while there's a next node. - while (Next()){ - currentNode = GetCurrent(); - cmpResult = Compare(newNode, currentNode); - - if (cmpResult == -1){ - // Correct position found. - InsertBefore(newNode); - return true; - }else if (cmpResult == 0){ - // Don't add a file twice. - return false; - } - } - // There's no next node, so insert last. - InsertLast(newNode); - return true; - } - // Don't add a file twice (cmpResult == 0) ------------------------------------- -return false; -} - - -int CList::InsertSorted_New(CNode * newNode){ - int cmpResult; - - /* Get the current node */ - CNode * currentNode = GetCurrent(); - if(!currentNode) - return EMPTY_LIST; - - /* Parse up or down ? */ - cmpResult = Compare(newNode, currentNode); - - /* -Up- */ - if (cmpResult == -1){ - // Parse the list while there's a previous node. - while (Prev()){ - currentNode = GetCurrent(); - cmpResult = Compare(newNode, currentNode); - - if (cmpResult == 1){ - // Correct position found. - return INSERT_AFTER; - }else if (cmpResult == 0){ - // Don't add a file twice. - return FILE_FOUND; - } - } - // There's no previous node, so insert first. - return INSERT_FIRST; - - /* -Down- */ - }else if (cmpResult == 1){ - // Parse the list while there's a next node. - while (Next()){ - currentNode = GetCurrent(); - cmpResult = Compare(newNode, currentNode); - - if (cmpResult == -1){ - // Correct position found. - return INSERT_BEFORE; - }else if (cmpResult == 0){ - // Don't add a file twice. - return FILE_FOUND; - } - } - // There's no next node, so insert last. - return INSERT_LAST; - } - // Don't add a file twice (cmpResult == 0) ------------------------------------- -return FILE_FOUND; -} - - -/******************************************************************** -* Destroy nodes. -********************************************************************/ -void CList::DestroyCurrent(){ -// CNode * node = current; - Destroy(current); -} - -void CList::Destroy(CNode * node){ - // Empty list ? - if (current != NULL){ - // Detach node from the list. - if (node->next != NULL) - node->next->prev = node->prev; - if (node->prev != NULL) - node->prev->next = node->next; - - // Set current node. - if(node->next != NULL) - current = node->next; - else - current = node->prev; - - if (current == NULL){ - // Now, the list is empty. - first = last = NULL; - - }else if (first == node){ - // Detached node was first. - first = current; - - }else if (last == node){ - // Detached node was last. - last = current; - } - delete node; - count--; - } -} - -void CList::DestroyList(){ - while (first != NULL){ - current = first; - first = first->next; - delete current; - } - current = last = first; - count = 0; -} - -int CList::Length(){ -return count; -} - diff --git a/rosapps/devutils/vmingw/CList.h b/rosapps/devutils/vmingw/CList.h deleted file mode 100644 index ac06e127575..00000000000 --- a/rosapps/devutils/vmingw/CList.h +++ /dev/null @@ -1,79 +0,0 @@ -/******************************************************************** -* Module: CList.h. This is part of WinUI. -* -* License: WinUI is covered by GNU General Public License, -* Copyright (C) 2001 Manu B. -* See license.htm for more details. -* -********************************************************************/ -#ifndef CLIST_H -#define CLIST_H - -#include - -/******************************************************************** -* Generic CNode. -********************************************************************/ -class CNode -{ - public: - CNode() {next = prev = NULL; /*type = 0;*/}; - virtual ~CNode() {}; - - CNode * prev; - CNode * next; - long type; - - protected: - - private: -}; - -/******************************************************************** -* Generic List. -********************************************************************/ -#define FILE_FOUND 0 -#define EMPTY_LIST 1 -#define INSERT_FIRST 2 -#define INSERT_LAST 3 -#define INSERT_BEFORE 4 -#define INSERT_AFTER 5 - -class CList -{ - public: - CList() {first = last = current = NULL; count = 0;}; - virtual ~CList(); - - CNode * GetCurrent() {return current;}; - CNode * First(); - CNode * Last(); - CNode * Prev(); - CNode * Next(); - - void InsertFirst(CNode *node); - void InsertLast(CNode *node); - void InsertBefore(CNode *node); - void InsertAfter(CNode *node); - bool InsertSorted(CNode * newNode); - int InsertSorted_New(CNode * newNode); - - void DestroyCurrent(); - void Destroy(CNode * node); - void DestroyList(); - - int Length(); - - protected: - virtual int Compare(CNode *, CNode *) {return 0;}; - - CNode *first; - CNode *last; - CNode *current; - int count; - - private: -}; - -#endif - diff --git a/rosapps/devutils/vmingw/GNU-GPL.txt b/rosapps/devutils/vmingw/GNU-GPL.txt deleted file mode 100644 index a3f6b12eec4..00000000000 --- a/rosapps/devutils/vmingw/GNU-GPL.txt +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - Appendix: How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) 19yy - - 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/rosapps/devutils/vmingw/Makefile.ros b/rosapps/devutils/vmingw/Makefile.ros deleted file mode 100644 index c075b61f3b2..00000000000 --- a/rosapps/devutils/vmingw/Makefile.ros +++ /dev/null @@ -1,29 +0,0 @@ -# $Id: Makefile.ros,v 1.1 2003/01/07 17:59:20 robd Exp $ -# - -PATH_TO_TOP = ../../../reactos - -TARGET_TYPE = program - -TARGET_APPTYPE = console - -TARGET_NAME = vmingw - -TARGET_CFLAGS = -D_WIN32_IE=0x0400 - -TARGET_SDKLIBS = user32.a comctl32.a ole32.a - -TARGET_OBJECTS = \ - CList.o\ - editor.o\ - main.o\ - process.o\ - project.o\ - rsrc.o\ - winui.o - -include $(PATH_TO_TOP)/rules.mak - -include $(TOOLS_PATH)/helper.mk - -# EOF diff --git a/rosapps/devutils/vmingw/SciLexer.dll b/rosapps/devutils/vmingw/SciLexer.dll deleted file mode 100644 index f1a143b9fbc3cc5da1a408b6954ccff9fdbe0d6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 260096 zcmeFaeSB2awKskyGr$OgGfKp$DMXEy2r4M8#DEPi2T_R*8IovAtW=~iMWr>Pw#`7o z%#a)oN7G8IZH?MnZMiM2SV5w^7!qyYBFLHClW8J5QCQYdfNye!)0b&Ma*gFdM*UG*SZ2r-#^jm&<#O z!rO%y;xB)t2stmzsc8kOEDI0@{+x$;>33_lO<<%)TQN#SjrcC`XaT1GU;ewS?v4lQ z0JCr>up~lkYo-yZvfDK6w#!y5uUn4Sq0{iiwvWZLL$wSc`71@tWnZ}WUcO8xj3Xn{ z8PC54=DSk?ls2R7S}qb^9+|(C`Mz@RS8hj=&;+#6*ayG=sC;*6o1zthH!FF5~#3kxs0_>)tLE}1&*(#tNt zx@7j8Yd%x@xnSarwkb((P^gJ0N76!#5O+P?ux ziP6Unja!aaYyF~6Yg*9O@-?7cATdFSxndGykl|)|y>PN*=w4rnSFL;fT=kg82eQ>{ z40xB@7vJdCRvPOUATqkoXWZ&Bo?nWv@%&=>UMBHC;Sv-|)1j+HaP*oLUQ_oaaui~N z!E$@{3{5-G<+Q5lIEU}dcq zG8-CDWvWLtF?FxU{*nWTPqW(2)Kf?p34I9JweIM`D>ThznWTvIFezo}L%~{i`4YPX z<>DRn7tGOI9xZ%cG%}PEKC59T3utvDbjU9J7Lf>aM|DO5o!V5$zG1J1`g)!E{5y2- zfiA@d2#-yNqsIzEs=;qAmIl|3wW|9=H6DmM|BjBJ?UU$0yrXWs)TKS;){-9M#EcFB zPI{QS*9s0s-~Xb&>2gT=RAKA3Grh}E*OpxG@@@G1HtVx1E1Vtwufk7#Ot~21H{w%| zPaQrh@L7h>DtwmWb1K}&5Vz?g;!n-@|F!phPMZ%p&qH{&Ps5CyT+`BiDWCVXv|q;O z-7W2x^SQF6eLA1FwzSXSv$CcA3O;XaX}^-sg)Qwf`Mjp3{Zo8?x}|*#*e`imOS_lP zi(A?`7bYjQw2$X=VoUp{neX(L_N(|D-O@e_Pc^0*kL^O9D#*9A{7?hR-n7o8HOD`n zN~IF(TR2FN4ZI$I)887u6|u%28g}!kh0nAi9pL?{)O{X%;`L-^4pB>QG2%BPL(qQu zE*A$!>MGNTSauI13XrSPesqe!ZPr`NYrSTb&%7yMem>XG8;pvWQPyl!Z#33#LjA@g zkMjG$$N2sDllZpu20*P0+RJaih(m$+3RGuS$Becb1}d73)>RCYZ8WUa2tZ_MI_*9zd<9?UN3hsQGnSMi7{h+{TkGWcSC$LYnxSrXUjPHN^FOk7XNA#(~ED ziyBWx@$^S;ld?g7>?#BZ?^=J;0}{8;zwRCc`mVtj;VtpU#z?}~{jo_vs&5J20PlN* zSI~I!Nr4wYWaG&uhGWx-&QwI8-x^PDm$=7JvhgHEqd&G9Yooq#>GT}5-yh?8#ozQJ zvl$Y=u#Av)Kzg}WCvjry+EjV65O2lr)D{=I* z{@B&X0lG+dB6I%&$!M=C^6{Y0hTMt+R7Fy_1X0(?r0g`S{2 z^L~uP^`0xiD4bfxpUnV9-=L%8a)w$3zVEv?Q_j=_L3`;5iiN<+=wMFxY8mZ;a{C5E zLK8zgqXU3at5w?nc{yPQk`tnXp1RYKmoR6|r|5>n9%Nxc%u$7dmA3s!;OS1+H)vJ_ z$}8>YU@Fzuk2ZrBF`iMP(*72(?Rz5=C;6)K5ZCR*4OH1b{vYDhi(1lQ;8&2)`@v#b zLLcD6s2()*Axu~aOhFQlDN7QT75XqO1voAJ$Z$vlGW}p4Dp`(7T7bxAPu*!%!M^j- zbrN5@6xBXzKG+YPyJ)W=Phb4p3MEB(x z`VphzD3VP5h*@!z_1yddX_AM@OyG=8PBl)b{D$6ZR2(LO^j@>#Ff%v7>V>{WW*G;r zO8d9lfaYP0bRvOqae(g!@m@uasV(SxL((`JE`rqzbLv&!B66~zY1kucOn>~lDpRHX zO<9Ywg0oR^t>)h&W8#T30rfs)l5yfhzSD%r<%n!?)~Z0kl2vOEEkuWgAqL2q>{G^^ zVc&jAOu$|;GKP#||K~eGX|y-7nGGv|o)BMziZb|?;HB?<$UTR*`i@H&l~mf#e1>HZ zc!WrwLHyc%XnCI(LBXF0kyhjPA+{eSfw;thp6_*mhJaAty0PgI`hw9r=Wd(3lWKOL()Z+_KT2FeP43ogto}F zalK_mhcVb7bWMB%XqEki&vGF37!`*|=txg0{5h+-C;D|yDqIfC zQqM0#flB+=bI}CJme3EPEI6{q(D$43Jy!L8V?J1OP?*(!4ViU+npr!HihZWuVOH!* z*8yJaF)I#{7e99y@cJ2Gu@A^=Ur&Bn(ajtUF|jz+13j_tVPt4AAE%H&C2W4B{i!q2 zh8^n}SJVs9j@6M%ORh@8S&}RQ93?Y?$xk5Mj@E0*8^C8`3`u@Q(ov@%ef1oy$S-R@ z{2A}^ppq8Og)Ir%8P(LcX1lR4 z8@6?9(0#L_UKFpprdggCA?HACTv6+yjpGl7P-50DCWGVp!Gb90r5X`p6z$oNJYqqjm@B|Txkz?3Sl1}djk^qME zb4H}kRyu39{<>yGj?Cy7dI4&PcKpW){Rm86m=(p?3bsdT6)Hdn9VsC;o@m6@!t>bP z=QZdI_AU7$H;VOR;c3IM^AT%w;l0v+Yz{c5%bJfFqM%ss508#U2DG|jr;3DbqdxGl z&(M#7;|#sunUWLwAUUbl<L|BwS9JtyZ*&k`n1-aM5fnZy zQ1%Oer~ugqjf$ZS)wvX{AxeyIY~;AF7=-<8Xz!80X`SUUSTVSq+UroG0vol=oCPceW#&D|{Bl zBc`$)QJPDG_KzgHSDsn4O^=(9-HM4#&9WDxxwS64SxWfO@uRl7l7*1nsN{>H)ncj) zd$wvx4%gc8_N~Z?*{Zce01Hj>F)onEh37i5ceDc<@{5=QWNL(|Qr3>&)=6=wi)x8m zzD~7(nu4sG|1t}VP~r9OSf?8CKX}JLW?lM8hrL;t>(F0Jbny4beg}R~m>om`Lx<6V zWn!Zm_Sx482>_cWm@50tC2Vm3VN=KOdFs)|4i`z!5D?V?sY#Z_y_H(g@V7-_U@+yS^Fwr#|Dhxh3*9oFGze2 zOcOU#sa1XXRm|Kn5MXMVJAe7ARZH(&&AklTtzkd6qSHSGodfV_%z8+|2pIeP|X zS)gH-77o-b#vTMrCN$C{ea4A~NUm0QW^f5a;Lp62;P(J}GSGq;w-ZBpr^j;onI6*+ z)X_&#FQtdi2VILcc+|r+zfiG>s`hokFozir$yZ@iSUV2z%I&wYFM=H{a2b`}`6ZQsh^P4ER}xWnE?SyvO|h>)akotqxd0UwLY^Y&PZEpS(fFcF>08 zLKhB&YDm$beGe>x>==MW8!@?*ff_zD8~{2Am#1gka;GuI60b2g0MlGoWP)+RTEe#8 zy3+7`c7Dk%f%?B2`#F;++Zy#4R57gU?ZHkpyCF*#1c9mGEFH%bPkIcnoWw86il?qN zrrm|TspMH$P0n;}c7?~FlfCG_c5Yb>??1NZ$g8x4^wA2~fKus=;W6H-Nj@@kTtyc>Op>d;rL@jlcDd4ftWbha&5;yE6Q1;4R` zfdsA1!M2Vlg@I_*p0`wpbIGxb#Ftv zMh^DJ$W{*P{O1hJeX>c#&P~tc<@QgI(};7=N^MwSE7kd`Yub~4gRQ|Tnm-;-ncN1mH*wnfA*jfv%UUOO>^&ZPod77%2_+=C1Q%^ zSlhWvQ)$1jgw;TkUJzoSK*FUJVA8$*XI^=+_`yHVqE&G3`!OXo`${^0=QwllEsuG z!_gc%ef)RN1G5m+xb!@O<+<)1MPn`Mt*x==U7E2uaLr&w zINem)KW`)DxiYA-AA;Qx>nh+tCH^SdP1@;0rNP>H_J2&JN((NGzgc$$vWM)|jDgzA zEI@1!Yq0C0SV!nX-Ja>HCCK$zCN6D25&l-X)5d4lHSGwl$_L)+%HyRmKejP;E{)^6) zDi(quoa%e&u{2<52EapTPwIY;{Z*i6K0&)ibRSj0 zN;~h_kS@}7+*2dySycauV#EU;`10j9nNP9o?G#`AvwEcesWfe^u@c=XoLWT zlAo0KxAE?h_p@ibiG2z7*Kx$LO9Dx^S&eQR3{}}DXAiRi_(tYk)!#mj>_=%|0WXr~ z;QydK4lqC@EWymO!J@sc1A8hfDk_Zq@BYnrO^sbH(yHvUN3`j4Xw$4up-ngA>o$C9 z@L7dVz4KX(XB|G#u4Bo|$iH2=$&2wUI-Z>DI-WcaZ8&=;4I~tS-^2j!L^?F%cZZ=EsC| zD=?gH0?mMCv)(~x1%Z#<9tEg^SoKT~o9?NAJjlp+(6bdkPapicfy{mmMd( z=E!=u`}x}4fZg{i;@B`~PT=evGUw%TsqKX{ z-2^kYw|O1i>^RB2ApUmYIV?N)@nuIAgqn->SAIfpPR?%uA`R_olL%|c`~-KSHS8Hk z9%h1da&tl5X_+)E-cIcGB0|qkNQ>b@qGk;!SkAoR*x0JMI)!>=>Uj-&6tY-R@Gp69 zdS_}}g8R%`@-&QV1@A;xLEUH-d!ozBAklEtS)*dm!lva7neBkVi#S;f%65PkRwAPU z_9Ljn{WK6^gf5#Z1ND#Jrgp8&by@lyhDL3Qv-Dm`XJ@D7T|L=V4=82QsCd*UdrXM_ z&uBG*P@734Qkv*Pao57*6cfxvgCVcdX0?T=dgQh&Y``dj$W457>korVl+EoCX#N;` zG0d#oU$G)Rr*I86KYS*PqWw^BdV*$|Z;3h2m+GM?gV$;OEf6Enf3WWYGsgd1NJ)_j z57@^U>O>^nSn>m}p2QsBZ-Z_DvCV;QErcoUgU=w7z6lHq2oo!V$a59)06mBvtV}j( z;YuPjk`@02LK782enDsj(O?Zef#x-O`{;7eVnw!6_mq+GV+;Yu!nhL3UP70Vnb3D} zFeda45*t`p;jP(2Nf9MY5DX}zJE3nObxr+IL*HywZ#F9)GeRCN-&0@q*xv&xroK7N zR!(bYb#aj`a*W$t8I=5neRkpt}-b<-mJ?=E)7wy)4U4Slryi>-+SR>1w? ziHUh?F*{GpD1HBpG>jjqvKAZ;N5RzdTQQTQp5KCRJNjM4Q&7ypX~pcJ^U>*GPg-tb z4+8*D4cWIa7PHt;rLw~ckgWow7C@k*-7g~{xdQdECYmdmNz}{|2PW0b`2z1W#_XN( zEASSODtUxiBj=$keHqsi?gmdzvuEr)l~iwM0Cs!43Z>Tyz!KpA9GMdfrMZqg$+nOE zOfws3Y{du}-`M^rXw~<>AlIhO=AN`}Sc87}zQz@y-op)?gnr0f%17@Ib_WysVZ`C> z2nlQGN1dIbgnmrL_p8T%dJGo8RO*OEw3B1rejZIt=uaxxPbt{K>Ir=-fqsvb8~Qd3 z9R;LAJ@%=`=D};AalwgOTgy!}`yNtG-<8n!(=6-k&7xy0{mGzxJrW)Nx{WBVR4W+I zOxiQCp;2YelHwa>0t=r@xA`uv4001cc4Ji#DiIDv@#B+RckuBpZkeL&>cs8;B>g>V>&2=rnK9%WPpF;rZ z{nGlY!82rTFk-km`hhFF00~v3?roUF?O(&|49ww63a3euew|xe!5c4yv;MI0;nvJn8pAPMEB2xwfvtQZosjJ{~PBYveqnWjrwLDhSivjzfmV0nz#oLv~OMNFvoz^ z;uy!L!zk})_(panl@%aEt$|Jgi4VrC7;Ag(0=7fmJB4CVwqgr zK;U1ZiF*eUQfCWD_v)d&f6lRXOaWg2N=+_?s{Pzd;SZ%VIaXN5WSuDW5kPlo0G~57 z!*gW{3-HL0XU+CR(`*3YpD{RcT`K$;_9jM?3^P*Jde&ykX;WvoULZHephQ<1z^B>g2;vJZvweyoz8zy*eTxpdqxLC_U*zj zoKZQzU~|N%{Ne4y4jYUxBGXNcIjd~?JdW%S**DRBi=u;me^WO|h86MR1#&LKt9zIK ztItMceGH#1`0T>xAU=oj8NkQPp(L$oz)Y3Ak^H6J-vkcHYlhz&na;JflfI7c^bc{~ zqkN~W*m;lPy*w=!k`p0|6x`ndZYDlsKN5aJM?}aW)^ns|rG5Q_!ei87FUJIFHF@5J zrFn3&zlq+dqyU=Uau8oPFZ3=ypTpOELtyJa8|9FOQCDF#X+pQ0`z~lq z<-+J(cWz^9qC81#wdrbG%9N{8!UbmZW|UUG32V>H%6Es#2Slqv_Obg;8F#BVuZ1Z` zt@Uc?eoEzU*yATQ{umcI(LEyS{BbHL(MSN%R0si63aTOgfaQY6UI$ElnD)MS59J#T zh4BvLY}j+UwC#2jG1qgCdMdm-D($VGBox?Mu^lJgVvZBeq9cqiK<=~?*?K1@fRD)e zH9MWtj0BQbO5bD(EpZA(0`7>fYDBqtnQ~jTp%*ZxrQZ4JyRRzTtOec_keh(geRa@g z)w(`|Bg7^AjIH%-Hnc6wHKqtRtD>LH8(j&Ve;ViIf$XOK0wPa&okCk%0h+*|X6%pJ zE6j>^G_|<1z8Iz5kI({F^s+T?1u*EtLIhwc?f&!AtxVHnO$HpNBK;@;LN`RC_z;bf za63;L6-TVo@WQH)K;kiU%|;8xNncv@l@p34kq(*@gC>#U+Iu4ku2`e-Nq*;C9HWo?nLdD!WWx znS%l`*h^!8}SNucI}|6y;M zEK{+uK&!)aQ0BZ-C^K$q*%qVhP|{C1IZO*wbjZ}VSiXQ!b~vH$%QU)!jn+HRJ~XKDmD@gP1vdaSdf}qC=b;m=JDO#7%+kxCqK;BS?KBk0 z+Ow4oq5alLCS4reeF$a+M|EwQ0$Q6p3h`akZ5%Jz!C@E?IT$jVxV91Jpt5b2N`>-(s-&TuN znXZhgb|toP*mu8=o=k<$GIz7~5p{o=O&6<=_c8#&LYxj%&=H3!%~s|vud;u3Cp;59 z*AS4Zz$iwZ^Nd^IYc?z^uTvNq*L#z>DjS?SfE1iMKx{nX`vLCvV;JHIBgRR)NiZXR z3{i=Ae>y?h|KegSMA4QU2$a^tNQ&-z5@s9IWz`pYtnD3$8G0cXaE?C>NJeg7^%m<@o(s%I=JHv74-zmQ_qU))E|CJ!HUiuqnM;7U=u@oqL9(48RZ61yEcNNIXv0v-y1wQFif$r9<3 z-9#UBoG_yB+?4VOHiTM6d>=A3>?Vt1lHG;MHnj4kx%DM{Tf60ZHB^iNqu;F%3fkAO zW~?!JE;H7QGG<)r>ZmIM9;xl@2k5gu|Ds}~bfQx3U9tfeFxptey`60|wiAmP9q5TO zOu?($lc$v`6af(~tSZ_qpn`TIAgh>C=1gY-K zvz4g2RKI1i1#M%p^irl-6q7;wT5P=}1Oqe~AtJ3pgu;;Z^rHxg9Id!}#XVa29r&6b zuG8kL`7|+*PZn-wm%Zq2oFZr8Gce)lJ=d8TdT2h9=!% z!RPv6z}m@GOO@RZ5pQ0(mHjSDg>#W+Ml&+D@e_{x!Zx;86KluTbl&7$9>Sqgpq=XZ zCuQeOI<@S$n#72*Zl!<%PYx&GsbE6MFu{9*5B$%DU0E|o_-YOcpmh!suq|Sj=p!?F1T)lvbwd~EOf z3^PB8#T}q?!pSkZrdIomwvBLmFe^POQzAaIpZaxbZ6ZDkAvHv2XF{b2Eqe`y%lHC> zlqJH5FGAR8U5xKUJcw`pIiAMd*hJ~p-@}M+Mm+>a-DwTF0j>tVML{dxg7~2QbxhJ& zkQkB;7%Fry93aw-I1w-(p}8jhtF*K3AhzVJHkJ-qduTzaGA-7z#I)F?CERsU2K_W! z+~X*3G{DvTqujeZwVjyTQB)!%ulp3yTF-jSU@m-*KLju+`#5QUlhOcbJaHPb0o?_w zB`^?CmX=R)ABmVUc8dL}ZiyqFj$zKth$pDM5L)Fm_hrj0?rs#Q`1?3ng zs?;*mYRvT;?d1kd5KMoCSd4k9`T#u)m3V$($02_!$U&|DriOhwG2s#g_}` zd`ezs;lCx$r?Zpe=@C>g%#;)`? z{Rh71%$A6I5bXP!g2Sx~HG%t^a12}PdmLYY^O(e62PN`MNW}k0OHbmv?={gq=6v7Jk``fJIOluvvJ5Z&rn~Vy zr%g&7XMSD|1RS20EUnD4?p|j3fkbRYux}^6(8t5}MNXp-9+iECK%@nu4>od~2kiR~ zWR$gOS`9x?501yVCld)RW)roUzO@X42Wfu(#{f#LLImE8cl>)gGYb3X;aG{lAQtJmcB8I7n6n9s*6ehA-x|bw5s#fSIB7LedG8w}!Jb#)zah*rS+IzA z-yy_1WoUZn+o#G%_{HHg8WQ?8t27Bej~{(%2&P#TN7&{uRmwJCmSK+Ym6RP@b2fIfjr~PEZUN2J z>i|x~GWm#kHYP2uA+eK+2NaP(E+gU6ga=oW<~nX8bH*u1=xXJCZF=Qh(SwyI7NP$H z06accUFFPh(7tH23fX@`Oy6}5pQUZ(=U;$G*oD}KG*b0lg0R^{i&NiZl~-|Sx6PM?w+Zo_E0oo2y}W@lEq!0men8#|OnsN3ci>o{slzE^pV71owHV*J z4d2pRU&SfvzReW+vc0nhQ?{{#@~`hkN!~EUl4pe@(1};z5(O#$bO5W(FCib^ zYEwJ_gOO!5Df{=$m@<+#VoZJDx&K;Z*!xzF^#mt^)XYit$u=S{%+A-P5GTnC#HL3W zRrb9=C3!{*S+EkX51?~C;=CX9Uf6@XOW`kE>Y?0mY^o}L^_gzL&NK$MYBnTk~OjtGt7VLX8n$Ci`3GJDrS}Ay}7!_Bm6W4AbcUXOETF0x7ag zVg^6yWY{RLee$X@?2?$*(-{Wj^?^CVRnX-%XrGDsS^)CgV$eQMUKNB~i8)PT0*Pn= zUip`Z7G^@TGojKyG|KJ>KFY5w-ciUw4#;BwgLnzw(iYPRUe14WWid9!1{iPN+LN zlc|a5huhK}U4SHj5swpf{S-1TLL`w$L>Fg5vj{`L1T&$fnb6Id5cj!NKJI_>uRFSp zp+vMjle8-n>d0i;hY(t_pAX4?Fq5e#6L%;R*P98^b(DXJC~pLCLJpl0(E)^*wL8kQ zjHqB)rr>Rv(27i`CKFnf39ZhA>YPw_^Z|qbtR4?VsfJ7_hR}tmF%fM>h<}Ob#!RRs z6WWZ>{g`ag{RpwmU>W?c*@Ccr-Z?noZ-@6l z6B5hpiD6c zk{4Hu$fQKdq~T0T>a>0$t2#=h*n=#8rLBw(?<1;6h92 zhe?l{6J`KfGS*g^{in1%OiQ#^E+lXWIE7({yrLP1QH}Vi%Fx)wc82UH@cN<~1cGCo)nU5dy*P~ne&MVd#EvIh(E%Fx?xtndS+mVn zI&{NYIFNm<`&u8ZI^wYUHJJ%v2p*LobftAIinl?%<&-u?&DPcvL=$gPF0(-th&wFUEM;By5&SK>2MyK(LfTIiM=0cV~ze=eS7TBu^4ribQh3q#tq zA+0>5RfMRk{Asy&`CIt>H$H#E=N)`b;PXB{AK;Vo1@H1v_;~RdhtKKwoPkd+K4;@| zE_;7_T>A#?Y)Rdj%mT-!t|`moFiyId>3TqE0CGWHekhPeG}?f zd?voJ*vB^@P|x85w6CmdBk zJT4q1s2VrZ>9nfc{v!;o1V3QKO9|Lo2)Uzx!q0m0dE{tc(QmO=)cD?$m_zOxXRa5X z*E_I9)LII8;6!*fOkK~NJVQ0HjkGYgv!SSo7quzG?MWP6#yi&2c}SAg{RkODZwZV+ zEXJosrJ^W-X2~Kit=<(>s5werklngQ&YZ!jiUCFWbW9;9*pRM{A#~$eag~}jAu7+XN=$+a`tc))A6U2*H^nd%^mjsI@!NO`H z7K#c%`zJQTiV6ks6OkDxVO6@!hghQMWj5hGW3T%m7G0va1M7mULV@URmewL;v8B!h z3Gf6usU5;EkH0}20>x58J?@Yh$lBL>4;$HivYCzUCF_t$gZAl4$eYgV!{`w6TOY$Z zz}6JlxV7~87ugi{VivnVMmvC;=V7b=064}JmNMegP^5Toq^box27a-=>N0cN z-MP3XDZL^4>w5o&SkW@%n?1hHGka|Ke8nzSKBS&7k3#*&ypy6gIUO`G-Yc;Pxc*0~ z8kd7vR_+LLJ8+)%BCE2B!@f7fJ{~tQ)5pr(9iM_cMk|3ze_xOFlRCdp1^;5an3BVE za^yd&mFWHTff9Xi?YNSPf%?%U6+`~VabVLQgI5S@COq?7WS3&>#e9u@*Ty&==k#x^ z#XA?lYRpJHh&|u)(cDysazXp^(4mZOWI~@qmS0L{3VtjzsWMZg3=5p_Z~Px6l^pK5 ztyghRx8FLf5-hAk;{{UJ+vhqGM!l{gF+YY)I)F!Ix!u}M2FYg&DNkg)a}qZdL@Y^P znV4pc?MyBHN2C(@$P>4KCmtQa6RjkP@Wo;ThWUcWX^*?gB zMx}<4+Kw48h5g!ZWXT*Q%iXzYK9F8tN=KB;_`2qGQV5rx`08atV|df}u@4|(xm%^i zqi8YPu#t?imG)=O`*>pY05?kfa{G=QpjWo+1+Cx_>cdL<2WO=T<%}W90F0rMj~_!7 zfl~*O$My4Mfa8RP>$}};rFaTuD(&S!)#%Ld8Qw@8~clU*5nvH#xILsi{u!u0UG|p+9i^A!Sk4L ztS2bzLw3`j(3ARMnWdSj(#bTLnL>6AlR1ZH#K{kEvmA(eiu;P1T5wgFet4=(CjMu{ zMg~_DjP@~(&kK!Wx;<46*!iD%LZ%-1Hmc!~GE}2QaKk4~sp2fiQTr#;(9inOQ{s== zt&FD+3vWg%^BOL?s?3E2$~NYDjU`my9W5COtI$U2t9rjWiHsv%FJq35?gM~q3ZG)J zgTd|l(0_!&vIYQLvw!U|AA>Uv4ser;%9o>wmV$Lf6Ad{LmouWve2`>k-S36H#gDTm>VoDY zd>TD)SIIG6E`9^wZxp|e@Ar%MW8~~F?!|Ynb(2fI8hZ%Ckiy;T#lS(T;(o}79bFk} z4DU2sn(9dtSm}sdaG|VsHG- zh}?Wy5FH%5mR@P*Xxz(GIvq#796vPp^(OlSO#nA>T?n1FogF(dN|B&s0` zJ`j_$)zoBxdL!ei9WRE zT48BFYFgxfMxq5W`dvVp1Zm|4jj~hj9Szy{W}toAEadO3}=QcKhv_|#8CExA;ZS-EPDA^;X{ijymy3G%bdoi-}9 z!F$Z;wkm9Mo@bG2t1%DDkpdyrU@bI=ejEm*2`k!hB4`)E>L@pgyLw(7#PO%pbF`D& z6Jh2v^g}4e%NN5?ZMYYznUO>8NI!Ilsrn%}t)37geIPvAi1gzc2FezH40}-Ug?L5V z3d=-)aoLgjJhS3RNyXq==xj&14)Yp4puYd{4h-kZpwO5V$GY`jYQ_8O&){0k$2?Ts8UP|1eKxVqGs9QWJZ-w;~y#9R|J>U~HJTcCt&}?kBOPAsXs|QR| z3^)1_tdb+A6(x$^OU?!@RHMD&vGD_IMoZ_zK#Dwr^^@?N3NyvauDx&{M#$AUwc?O9 zFQ<4fX7Ii71F&5lC>E%7=Nj@%BLMjz2<(K9K>Cn=dcNSi-SDDpa)re;FAacH9$ovMSvlG1q(P{m+%xC2q06i-A63DyREu-p28T*r-7Mv+K&~?!Y z?V_8-2Hkkf2aXh*V*t6M?KCTZPkS(7I-(Kd!AoBq+NI&cmtF)>OzMZsvH>M$a5l@R zJ_13}9lr{yrdGVrTR)+A;#z<4jlTM^#kYF!D-cX**e%Ka*xjgsO2F>vh(*;6?c55~ z>c)-Y#sdsO5{)`~xUUZ{aX8*r9EP`fBF-HvWQE((G=w<7;j;>b-(rFpJ7Y2007t?H zugBpKxUL%&J>p;9Yqm*-2=2a_yol|rn{y&o5<=*MI>_WBjS22>81=ZvVJUqD4qY4Q)kA$Jk}~4MMiuI z;DI+dtB<0}5VQ{+VtgUu6Y&Ckvz^`X$qZpAN?tB)#IDArtOjc@HKf413I42C-F0Rg z3q$!UY=K?@b%f5mne4AB{SV2bPV5VWe|KVEL3m>0+bNh}FXC5mA~Hr*2cG4vMdzZ0 z@Y#b7YsB*an6Z;;&k5PzlBisXD(L$O*tUgSzMHjEFUrDk87dVVO^c~>4a+OV2A2r= zGRVzjzPL})*i=*K5X^G-eB^J)fmK$(INA7T;%iEFK^+7r00Amlu$A?|KQ@5J5_^$Y zTX6iW?i2WV0caiJ(;9yXx;7-MTFf@K%Kziv<6dGX(JP6i$*axXY@YweA0#htamX8N z*gY9>THWQUW)RUIZvZS+c1=LadYv9i-qRxQf#lzu^jooJSvrR}teu^l4_V^GFGT!o zra*Wt_kswm&Z zGRXYaqv)g$v&NS(+<+@s5UdPrX=M!3$jcn0(_9HXGPezzOlfooTR zk;Ti&MC@RCoG$Jsfmc6>cID#8>EyMZ_=)hZQfVn-wo;t%l2b>PH1}{kaVU^43|e$t z7MTDoCZSj#rH;`?is9@X@*_!6EaF!TQxX~SZ@d8NVpQaAAZ1bL`VI4afDI2A;iI?` z$*8vBh-H*P$A!2(LcxeVj-~<<(GiTe8pjI*oe%OfOOQrR6Oq{Pk`n&Qu-66XXg!4c zY$qg=Stf=0!hGyyAR0Se_;x_kV2B_D_D48(;XoWtH`r}s>G)}5?IzaxY`aP%A9JEv zkw@J!eYb}dg5fIH=q`E<<)fWBi;6oV*i;{?D(4;E3{YeT?f1tJeGn6u!0Wk-RHO^H z79z$NEb67*71{nS*$PHx+ar-!XO}p+4j>}E3R8B8Ric-}oHs;@fO~N~KfN|x`#sQ> z2B-NPBhD(cmXWyWr7X8`@9Oagmko65$FX9=EJZP!whtULBYBByA%!r@ujl?7rln$i zkcQSltt5!Il~gm1g*fafLxq6=nCh7pK(oFPtd*zN303Yb54?XSMbM1CT0>ZVPY7G zFdYYQ82nl`bz>emDgrhd>RvD_U)xY|ym`|sBGMh3#Y%Aw@F2eN*e{PJ?Q%YWe|l~; zt8>lgIKKSPY<&!a*9h0!6-N&Gt=}Uhp>M-C9&*nFE?8kF08ccrv72?` zB-;kh6=vD4S)LhT?DpqHJMtT5yC&Z^wqbS-4gjx3akKg$4#ETF#spC@BJBwrjlmy& zP6HIW!pd#f`zH^$pkdcoUgrmejvRy=AESHo&B(3|9{=pg_phFP8cw_F`=cE>Gk*1M zcwZ?lnBO;*&X?^b4(oZ&NX{p(Lr(1SKkpeAwDbRnF^69rIaNsG{)K^Z7`K<$S93Ub z;F7d$X1Lw(JPx)Z9mMn@cQR~<=dOFGmahw3> z9+hyB{ToyO$`<#mJ(K5~K(9v9tF%Plwx%E6re@i;;+NN+MI7@+k)~$#epi0WJeVH; znu+o>(|NV*U`pQ>MgK+7c`1Dt_^CL&%fInz+Myx`wKZooM7m(C$`p$njC$I0z+Gs7 zk&`}-h(3q@KdgW21-O~X)C+OBx2aFzAl9eBkO$c`N=CB2iI*JlObER^w*>9~P^ugT zf5VHie5ktsebDei1IJt4M6-H&!`HE38qdpz%*JNK8u}J)I`5e&Im$R2MsiQl)n;Pw zVr*Qvo|)>3Sa`+(v4gvFF z4hQ2k42UPeu|{|!=Bly&XIf-`)5 zyxy4@67dI|5VdNHFKBhiIKM^ba-~1ZV2kHF`Ov@Hnav$;M$X1A8E~Q(ZSYJsTbVS= zb8dK!sZW<-moxdk84a_?OulcbSvK9o_QiF9;+N~jVa*Dg*4f4T>n50y>E^Y0i;4vm zfBb)OV8B%2J^6V?TOA-8ZL9IU_i28^Ux5!-FKnymEi2b$ekTBib$(;-oATo(a=oS% zbCHt`xvcbAES09?*ZhiKtM{4L(tJCrxYOUtTYNF!2O8Qv(xpYh4Er#pYjvla%|7{hD7mfFDOd4`~3fM`Qf%70kE*d?`07;qtOA>K0XcMZCBPS#rV` z4^#Puy!yNi3(m=(J+>}@T~wd>vlc?x&gy_{G?8z}Z_z2LZtz?^`!s+2(;U|pd&97n zF(W%cL|EI+eAV;ao^v=3D)PI%i3&ss?XYYqoofEvrFNZKxQDy ztAURep3o5aCgdOXMsN*s9i#YL51E@vtKk*01$(aGd6kil4HzX2dnB(v_79XWw+nW= z1?Bv!jNWg*8`)@d`JbuY*w=}4%5O<5$-m0K@rQ`P`N0RDz!SF>SLDIegYGB`Y-l_R ziWj=z`;*Y0L@F5nDKngJ)lG64+eIY~WANu&^?5m%!pv6DH7kxl$1)-|v@7aW(C+AX zXI4xv{;VfV>%k~`AVL9x9`huw-pXi2qGVGs64k5TQN5HtWGOnit2a7r6TPq`|3Ux8 zE2LlGEJ^xd86EosmeHgQw#x?bn@OkR6$CQZA46lz$WT$j4EHa@6kyHsI2wNS;0;Fj z2=)h|7h;`3w6XOmt%ru?mcXlnu1@ryT$yNY53+O98e%;(L|6u}Vy@(G>U;-NWXo(! zeKB+m+am0!c_gH3=U|d zxmo&SHd9smc$;Id@J9i;CcFvu&!Zk#8L4`ikxkfu_|zyD&Vh@85_2VWVa#eq1YH$y zx7d_|Jw>o%9ObR>Wyg$2k5S!gt#%pVL-M;&fO|yUn=6Rme6B%tRw>Ik+7I(Okq7|^ z6O0hvXTnNaeaxsnXhx1)YeYJ%d9cRr2iHTtOkcn&qovB+%>~D))3s?ab_u3Pvx(@r z@jDDAE@8t8trS-l7~yT#8x`$F^{x=S?|Gqw9o0ChruR+2DxbV=)dPTG`S88>X?|mN zo9;}TAUR{)`J;{Me%$n?RuOJrJG>W5s;BrLx*alrn96m`LFX=EC6=ddCtz!h%hFOHnn@n6CUA-0SMKe5TgxfPb#otW8Z_0J#fRRQLdKr+x z{Sy#T@|%ASGB3R^gjQ3PAS`+y4+eLCGPF-7(6l?bA^y;EQb)zI{ZYYytRl8%JoPa>wl<@XeKkuVyNgp*W_7;kSxu8o8a+2c zyKKV?N>#gxyv7+-6gIi>Qf4II%AHIP z_OdCE{eoQ4Fmf19X^V|AvCCOJrN$*AEttejH;~Gsiav~#jN(GfAX?p}gcTc|#_(g{ z3AN;osv}f^qX8dyTnULWQl%@d+L_fQpEuusAT(L~OC{KWB^ z-efUt5a>Htun31#{#VscNmoArD`aDW>N4(d{|769rPm+F!AuA|A8!ya*RelwA*!p& zp8F2alr?NR&iG|xHv)A{0yILjh9@b{CwJR4 zu&P{N)Znz0zGs_Jrpmqm)kOF8o6!!3P5)I>=VXE4&!tt`e?U8TvKBNp)4=3B&{yuw zTqGQVFfO#bS+S8ysN0wRaFt0tFMjX+vg;SLcMG5bprm$7 zQD0-%7W6w9(-*Wi$b<_+ig&|0ZoSULE)~6@8as)H(dq*)m)k3li{?RK{%vATZ}^i& z+>1mkEU#Cu-R@_(2WQ<15U6h;Ym+SR*C@k1H6^_pJH<%e>Ji{?w@Xv;3q_ZJzwzH% zm=iQDCN8ljzChbkwbyZRc+*sX3eZqfPBEB|u(>cbw`wSmh!4SWn5@yTM~I4xhAg6K z{MLv)AcVW~ss|SqgqwudVu(S|6J{0Y+cj|f`J))gaN)`%CfO>K`TTZT&vdj15r6!Y1ooVvoi>v+1KE*ivNzmQuJo<$IE#oVN>1iwGAB zG0S z^O9*1R=oH3ydL(a!=Xmfz%ITICDMrwtW z-r^JXZwn%mh>HA!PZ8=KRtIgY>tUWC;vYhj3ppMa;6jeZl?WhJ=q zICjIsG{7b=ERg{Y3oqq_LV zVF>{*<~Qen)dRYtz-VYqE7pj!1ys+h@lINTX z0X*tnM<5Cz_8S$Cjf|nnCx|2Dfl~-pcqi#Vx}M)WgL*oF?^JOx^gpAvejvfi4io&#ek%qNvP+}G znm`Xblg-b%)05LWmJc;JXvwbI`4qV?e7*TFCl|n_=yi+cM4v92Q+oyKlMa^v92Rw_ zx@{5USq?~Ng>_9XmtvdITyY10E$PQU`q7WXA8(pkh*_LaqrXGTVCWsNIA1pMjmK>m z!Q^^I?6t7{INN0mzI)N5k9(KD`rlXuV8unQDXOs1e*Az%t^b*@ZS-@O^_bC(Z3Elr zRWH~>D1&9+HulRqWerOPZTdn5)2|`>BD?}tCI-IcP7HpiFlaw=n8SN0ncs5i@{T{g z^?;<}p7Z_E+G73{6clI|t>Cx#LbOkN4C~OFey7%OAn-AjABH&-Ge3Pu)NzB7^#9ure=6T!V{VRPvFug_`Lmz0CR@{ zmId(pB0)PwSmZg8ou|UGSfCl&I}YsfN&qW<+pjnp1Bk}&3d2D-5%(d?KmMpi06zb; zT{FF5mv8B8KvO1f*@o4~$-f!Y)c2ucg;MMm zDaLT}%9iM$CwxUTRj~Hbk1JFlg$kt*!>kL(?t<`0TI+vM11UaKPrelS2YkHEIKxJK z*Y8OYD1_`ps88&aa(m2WvU~SYt3T`twI zX05j-`UJe#;zv*+>QPMkuuX#*A$JiF&1(set1^w-4us>ac0$tq1 zn(H%{+wbmPfVNr-^3WU)N~0v4_(mIT>IFJKa!(VVAZLwM11QWT+1FqNp>onf z=aW>2y=hhRLRzMnU(*ee`h?Zf^WLTln zI*VaJ5z9P;)rvwP&<9y9>jt<*G6ui7Au}QNXxKmHW}7tJfh`SpV3U@H16vVc7&h4j zT}xsH(}UM(GIW!mec|tj-2!0mk}gU~*66-c*hv7kSlD3gnX3OV)=Gl8{*6C_9E|QJ zlA8QE9gU|J90pddTi63z6OTOfb>`0ucQoU$Sdfq^Czl|#K7QMPDzOJ0A}5zHZbjFDw-wYcU$g$fN+|gFt*{R` zNY3D|9e)tSuc9r;x+ln?7dGZiIR{xRKR)1ZRV}|$7E17%P^y1j?9K3Mwrluu)2^4K zpB9;q@WcZADT5$Sc~*uqcS#2Ll6)E|>URFDEuDUe?K;_o=25|#`n6!O^U|=Nr9QZxf<_^6&kV4<+~har9{~NB{hp)7~JBDsA5TndX3W-#KSOqc8E? zDBLn$K{cfK@Kpkzz(k@(2B6fYs_daoFrjm5^zi-QYMv7H9L{1Mb2Ik60vqjXU}O5lR63E-n(`n39gVM+oXH=tw$<}O|Yne$(y za9||9@h+Iio7f!wCBM|-RIR5gAs)y0(p3cSQep;BJN5}ET=ougV|Mc=0i4u<`@@|^ zmncj|<~tqv(zh5pe!=NGv9jzVJ)I7;?AxdRu2>cg#>N&0dRBp7t27RJbvkZOeHudg z&|Beuq+_zmtyL8zj~7jHXXebAGiT16nK^T2<{c;%%{n3sznhV((DsyB^H8cu{Bc2w za%Y?OFeqjn(zto@2B}72q9}wp%T+*#{)6dHi~S@hngPXqU5)Szhs(y{tYA)pPck1g zu|B>;a>6UR=6Vz1s)qoY9T-Y}_6MX`q~fau&bs}_5s_ee4x7r+*UIrmW{!{RB?pjV z1qaJ)CoT{+|(p|5%49< zyza6jvnutkRst!W?!c}6XjxBN%_j4VCmaZid-uo1>xbioIO^Nl?syo;dh{`Rt}%za1t^^S4x1-qY}WZ* zb-z;Do#`SdIMaX=iYq1o6CB_DPm`r+K`Zwf{4R$){NFQC)H}2$vwo3JZW0bKhS;puT z>Lyt@5bxVUFA6#Ou>1KI>K^xAr8netVOAZS^R%baL7N9{OfpCo$?y(eO)#33F$dY- z{v3@?BYwu?Ki@&ztziOVFBj_iWF^pCEqo09)iX<*>LEO!hrO08HN@AgdLG4Lrv9wt zP+e>0AEcpxz(V~G(64#nQ0R_6$+DsmaW3}i@IvkrU7~!8b?ijLk4e|IG`<~lNx#wy zyf~V&uOg04*j<2QD&BoQc)3+ebowOb3#HxU?eI)SjHy%H zisy;XykD=zE_br(e%+l!=hxR_^s|gHn1`k2q}R%=_L!03-ATULEpA9pN3-S84!+h3 zvlZ@UABNPb&JkYz*{6VIQKf zcpvQ$KDXkNCH@apF~=3+@siwaW;SV4|1a}>^1sZ-r`=e+ ze~ZrWzQy1yo5Xw%gD>aeBnW2bFdr4ZUAVK|`vf2`P9bHn=bPG-wEa9!RrN$p!^Klz zxAJ%w<9ej2%Mh9KS`lL+o7@ra6K=TVXV-3ygqFeNk6lPK^)hvd$8=h|0{4KWpMuo7 zP+k_U6vv#uE;J}BknPN_3k~L9J9c^@w9;puPCethb2%o4DHDSIRuRo;Xc-RBOCJF& zUTx^vNam|D%Wd(T*5$Cb&P4?+d#lLHOeL3!51@@N??L8a-2LyQ6OArd($7e78G~UR z&lKa)DpoJh7x?x7U)<4(uRluzVT64lTD7bKigd~=oJ*`lgdDY4Ci9BrKiDHIF;``B z;NpD~S71hCjaN$cK?X|OrRwo-2)v0;u5|(1;mbh0FL$T#ntj*2u{RpwrnuM@d6iU0 zj(3n&g(@tQCbKHH^E_N4_M>bt^AOZ*BTw95RDZ!PPbehh1iv|Gd2XhdVXEfFiVV6E zL&N*8!RLApv@yomZi90$ocWlkhJQ>vYWuKEnG8f_bWX)x3(}%;rEn^a8>`U>cTy4O zy69jEynC)iIqOK3cmi(W={JIu zu+(_27R@X@l}-wno#A5re)^#;I#;J=TVB?{;>_Hr! zcHqrvzGXQGPu*7P=hAqA1r559tDzOuqUy&RxN7Qu`#f@aFaR1qti{Z+y8?Hy-HF|& zI0J`2WpLNNk;N~a~GrflcP&~cwg~KGak%qwoUJf>4c*emd zjNv~#{#dGjk&mh5BW2KB*Yq3J0wdR#ZgB3EP&KdFXY4IkkX?@@55b2V&c;Iwf$ zIfVa;Kw12({{o-JZ}AIdjN>rlYWjew9H?CNSUD@{Y#qm;PMua(!BD!m=^rBR*AGCFIa_oWt)m@G3_Z9Gb{V3jY&`Gdo>PJQ zi9Y;2V<^CW{Spj5lsMkph2?I1AY~b<68A#G^UJS457-`S3v)ipTqy(8fLB!qlSwWF zFuIN!BeKr4pZprlB|{&~9e#bw3YtRHe0Ieg@>~~sI8kK!4d@$I`U6a-sibI@UQ-5M z0|s>62NW`4#`lHNmGZR^HdBT6Dkq;YQhYIsnE)RMum)xlJ@kk6MV1|e48+V8R-orp ze~eExX*ib!pj;tn8v-B!XD)DnP`KlqH(j%Hef?rC5NII0YMe%-HV%4Cx56;A2Y zKA{?$xK2kIn2#lvQw5uQ8Bg4xqyTT;x$b)(g9Kn=*T63&xo5Kbda@0*O+U5#SBV4{ z^AVqRebx$z2jPfJ9syj%NNm3n7OP%*Et&f<^-Q54k@}3?lbPt#h=;EJ1)lEXTYNm- z!tL8H1}ciXN6b2ish7l>=!RkxL@~JkTUOv!DUZ$^jl2N(I;{*awzY?2U)<&jw0!f&>URWZ2hgTz!Zme(zzZrvL2@(vJ5Gf8U2kiqza zIP020RE`jpj|!+v`{8fcZ99M)gfptN>&`UVN6eBo@agxcHpkm}&;TI$^0nFIRwT4P zOJbr``zv%0BCQTZ8F+hB|GvszT+I1ePyKPpb1D7djz!c<#n-x;{?He~GOV%l57=tC zE34*B$L!be(~Y08>m9Qn!p}bZI5s$DUyGj_{JemlZTQLB=$JhcKiA^tA^fbu&o2Dz z!%sJU25)lAF2>Ik{LIA9T>RAGXBmFh;%7U4I`K2;Eyry4A04yv@iP%WbMbRGejdfo zF8p+~IcAr)J7zD(&wBj4ho60*F95oJyZQg0KYLIIJ7^z{pIgj23`0F@@B>jZWqB#p zwD}AxPZ=q-l%}aCqfsFkKI5MlaIAc`XwQ7Q4CKhCQ>Q?~A7|xzUGm|*E-LyG18aVn zPnzY+c!3U4uu+W|^f9gCZKCiHl^f9fdi%2`1-Ej@gS}bNZc|ieSJQ#P_B^90cz_T_oU@+^pmob&Xd){g3 zqI;iJSpjhhAiy>wkV$ho9%GW3hB7OEpiESfso1w*Rw96)6ZGx_}kuy(@o1)(%p!Hc~yJZqVOcY6S^Q!`-|*wL`d z2zz=aEbwyN&A>VM8ptv%oMmEgfZ~r)x~dtpvzs$|YV~KPQdv zHiS<}3oHAm*?zc4Q%`&gQ9l1S>!F*hkSSz78fRXAzux;R z(%3n#uV3%p$Itxu?c@*Kan7U2^|vrxm5zzs?WQz5@$)55b`X}>?sXk=k)8het{T1HkWMUo^p2kOh^G-75+O} zyo@k>6%IZ~i)zjVw$6bIPb!HINQDp8_Ab{{8Yv9^7s}*DMH|3pf7u#bwF!1?L}+dfSQQh zWR&Z)%C*p5L$q9#poW}0o0!W5b9Y*6o^`ENmKyZ1T&ctYknem*IVktQ0ff1DmU0!C z?7<}aeB(EOcvtvg@}9x~sxw>il7(0kV^7M|O~-^eg)ne#O2c!M(rpQoW?XBpmw;6D z^`xv+LG3s+d3-{eK16m1W=~qmk~q568W-5EvT%F{w7esDRhqrBF!K)akfUW59Igig zui^;aUv~>x4LdF4D(sLju4SCuCh&E4`h7|rFEC)n+3oPjQ`9Ks4AfDp%OJ@7es4_vY? zRJin;kjWG~q**)fHzC?`E%+n8iFMOLzw%b7TlE}JW(6hztLy~+>{r6awEW-R2(%l( zC-qiDw4VDu7#nh<_1yFUYiyf+{tAOHec`=M&I#&PJu6sGXY2P-MEdl(HxRlr+N35} z#sbN0)&cj*lKhPdK~!Dk1W&&s+JSiR> zGv_ImQEB9nCWJE}*UwdaN^)o*YA9TB-QNsmSandG!Lbd+naR)e=m6a@ zU&7>2v+TIZV>9q%-XSc)b*ej~k|my_9lAWN$oGT@cu6ia7+bA(Jp-*V&nkyTB2)C9 znGOy-LJ@_lr98M`k=-mQWGqu)Fvuq=E|GN`^pC8m5e6!~7sI9~R+@+>BRi-pY9j6c z-rnf6QqHqdh&yP*-I?he+48jFvUk4^))3gKV81a@E>gA1gnvW9qvwRqjD!wm1rW?1vRJtu{GW|)gsH)VjcoJrX z$aXYFYQH>#UhVUqqV(IvM41d5-g))=5?g@uH~?Z?EQXRs}?OVx+RzD%3=*-*`? z%O{0ypS}_~(@e2TuIN!Sv3h!0cd*m6X5L01dRMXi1z_zFS`E2RU^#*yrNpPN#e>u$ z?~HHY1`keDe9mhcWmrUC6ti)KejdmWnTun9hj}xj>DnHUrh{BJ+fOVjl}t3ozJyF7 zy*2NqGMH{%m_T*6*>n5jDl1D0B*hjmQ~H+4b&>b|0^8WY3=3?V-A%i2{5z~-MEwQPq8E7#cIEPzetGoo>b7<+Pu6fn@vI9 zJ02Caja1s#y?ELc~>b94SWRY7f*@Cckz`%`TIvu zT`uv=*8VB5ncEaSHX|O#7BBe7PMRd!)$l547Q79=k*`50t5MZMkm8M8l#teYMonS8 zgttn!NX@>;1nNg1b|`9&iR>rzq4DXxEoym^wnATqAYr;{`e6c&7iGh+|iBII&JS{+j6A*e?Y#*IF!(9Z#`9V+s=7xpe(A9p}T&DT-Y z-k6LtLA9SMRS=65*VeEzQz|$nnmdfaS<<+E{jP_FL%2Yqw<=-2nQ+`vGhrbo&6crc z^rc`Cq>btYlZAcAP1SX{>ECY@v!3>KfcwovBn`Z$DNP~yoOY% zpNwi*!&qvMj{`04yTSILlAB2}&@YQZ>`b9y`ym$u2WzhDgx+$Vr8d_ zz~@Afd4u*1mB_}L(Wwk3%^qYJl%CF5!JcgQ8J1(XU zLG-RRA1G+zvA(FJ@?LO^Ij>|D&Dvk%g0T04kmEH)EM}kF*xaFflFUh$IsdfU6K5P| zxjkK>(-hmSrf`;&(FaQKyTUh3U;b(G?TD10faz0(YeBlTMTFOu5*~HtF3Xv0WJqS3Q~fkxk_}4oK8`M?28e8Ab z!J9O*p5|489F;UIFV%FuH=-5R69nt1IQ*bYE1zF4SfUuZ)79`})LppQQZ)$94pvJ? zOXiB(kTHOxHSR1sjNy;h)umh>#2FFu5=<>F_z-g~O#bg9%Z)<-11~8B!RsSUcN<=6zAl&#T{#tbfFVY%p^7rTt z(!1Cr)~U(RPf{3h#Zq0m?DmoJ@`ax<5qPz&b2r-|-&ll#us?vuk<<&!>b2!XYr!#X z(RvXJA$y}_J(_IbkOnck;o0CG=?dlJ4r0}&>=9_ z(TtJQ8VuBUHA=Z5nCeMAucdoLL*YUV?>^5Wswq0?VG=|2f#t~kmm|7eLYo1t9;n7`tUL~k+W|4PwHSuhvUbE1jp$yO z2c&69nI8;oRq^@eg&j4VpJLuHXqLu5o#M%_q}TCE9_WTnir}~30NDWHH_mZkK7g?JS|#lk zmVGO2+(kvX2b(FL;~wur5DRY8DW$mV&9{8vtO%GFtaaM-8)@}q^Ta< z3?RY`{`ZvUO3oKK-!(Oot6@C)J;{K|tLO9%Qw0eWVBUa+@U**PV*nDpkE>T)LEDhS z&{D2gaRqI|w~%mIaE!!*DW>kuy<94;ZO>UmFwV2@SJ;dvRDZ#&tpu#8u%=(-7_Jg4 z37lBTax6@1r<&4$YY0=wCIDHy0>-V0={W4b5tRZ9HbMEPqX`}pO&6*g@7Id@g1{3O zt0q_^)m$%rR=D$GsaoDkEJ%l5A(85fU7r8qC$&b_Ngzn=3S?8Iwoqev+9D2#RvU75 zqb=p^MiUpzKQ(QuoO3(RwOijAPjtKZO zkBml~_@bhekH+;2Pp*4aEC$*VNul9lq?#Cn*Ng> z@%kwFh~UFIUp52ZVmMLj!YUZZi>jP_k=>1V0DIUbuzs3_d&~2b{h_;BEpy+JWfRmu z&;wppqX}P0#+;29S!`A6zf49#&#TC49dnul^oQ6eTD-|dQ)6JU>5G>(2u9Yml0U9S z+~!|Qm-kb1_`)&UXs# zcXaEjS^PVqbrmM-xX!C}RfvC2ZC!OQ{|;z(@h-1V_dzCbUSIeX9ANw%m|C^%#$NuVib%`ch~k^Q{{pCrY>~%-^S%Fq znHg9TuyPF#9FN~K0#5wCH-L8&6UBTqvlAkt?u!=R_8xd|5~8>q>yePh0=b#3$~&W# zj}aF=dJBFp>~(R~zk;V=)poHr5wuN`k0U|b74)FxCCoXqI`75+n!W?`02~2;3`@Ah z_W)uQX|@!X>I35EEoX>fx=<%iJZ-^~iq_Pjg@d@nFRy4x13s0_&9fhqLn|t9F>C{3 z-$)K`I0GSz2DcX6uLU9LNZC)XT}ZBm6z$a-;9~XUJd3BZ2f7~4khoLVL>JnFSJwoc za&D~DFD5#nlISq)6*AS0mw25He5lmRFzc~gu}z(pwA%t1Mt8Gw1tD(imTG;La{)v7 zjXQ(G5Q+ciE(8Dd#WCKr^fy#MQ{n}ms6LpBXmXA+mHo9bg3RjF;hzaMl$QbtV=`DS zr)OWj!Aeb0b6D(im{u*SlVKkDaQE*YSQqS^q;#fbYmvu;=OvQ+g|CmL8o@y`ImWVJIo^S(H@s|=P6JE2EAU=kR{mIQ+aIL zeR}zCF>3nt*a9Yv0+@9MMsl1LLNnj(dGZbrAn)<|^{)9n=<8$B7x1N3?aZ`d-$o7; zn|hCzx7+yi_g|Ef2OhiRWi^x#wOuXam-GSZVT=grcK|%DG%q0nPHAc`f*ft zvNZw1{*vFikYVe1WcB9dq$LA+CY}92Ct$3e%{qk~*{-E(d`_L$727kWc(8p(R_y^b zI5mN3m`}g@ZDC`$Yr2D@&7^$%Zu(s=p9S65n=ya*5o4CX(K6gcF9=t|f)g3@6@)e1 z^)@iM8a5oq7}|ZpU9U^b&=YX_YgV{xxr9D)Av7Y=g=h4hapKb*>2kUnw&K(HawM2` zDAF~+)o|m<2!AT!aMvr6@p@!*)t}-f;*}D!G!H<(2N2#o-5@b}#{=Vq;jYyZ+C2cF zyl~el3E7d~XaY2JO1Nu{#MOaVW4;ylmc+I8N3P?;T^l9zB`_M(R2gj&<3M`2i=DvL zFbLnqXe+;*$!oa9iTrnkyS56%)nL$qG2yQFB{a;${U-^14@l$N5kmh53Lk6q7sLpS zA4}Y$h$B7QB=kO*X>3q=K9QIb=6Tu5V@Kn-8YYs4Q^H-@63Rx%CC^wIf9Yr99wW{7 z1UUrU=Syh!Kw!E-;l5B}+`{dP&n?k`r{6%sd`I6&iN68bSAHUI)`uFgi@ zL5{p^<>8rmSHtj=kO%eOCZP*KldEYWejBd?Sa{3Bo~{NT;9T`5;&-@4bL5-H z%Uum;4ML78Rn}i5W-M!WNx18C3AG@7!Ju%LI=!mNQ95y>!VV0@L?2#<2T^yADdsYp1As?3d6P451$XkkCGs*YrK{7GOyLyx&Ot z9e{E*`SII04!;opoy2zzM((r1U56#~5<;$~_wYO1^{vDN@NKw2q135M;zm)C)c;MO zx+Ug9#Du&4CEpY9ZG5K6?k#o7&qo=ThP!ekbjc8ehT+X&2|XmZm?JV)#JHLsWc&sA1={;b{2<~*8}yOTQh{2GIO79+3cbfm${4~y2AvYhCB(Slf@h$_ zJUx`9=gIead>ccMD)~oBTpe<_nx4-h)Q==)4yC#z+;y^q_Mpj0$4L@8XBeR;;{+j4LFj!>s#M2|b9AtLa%n-HcyC`!q?po^n~g8j<0y3W=GA zm~a;_)^|0uP+os?meBEvf+rnKeW3xvT?-`UK`1|06Blyft{Ws~jPO&n%S?$`O^sL* z?z&P!PXjCY>X*>fq@byWC6(fr&~}xi3_61;ZA^I#zrc%YCH`8lpZTwr&?(X`qww3< zgkeSUUneOwOsT&Lzr$TWlbCzt`+E7VWsX0gTLbT{5_1dmGWF0+5^Cv<5ZdKN3AIAY zx|&w!BF|T-4D#G8@xzhF)$|gz_#cr0@jsXNWqlNlw@YX@l3Y!%;oDdOP@yp(DO1d` z;!X)YkC5R}GzBH595LapyX4!^7pbQrRq{tAZY*W5iDP-Vt4?BgCTYQxaM!&O8qBc~ zy!wTN{vl)5Eod?0Wqb;rT1ja}E?3h!{0?`8B<3vSG=2y4s8fT)j3H*=s#mz|%+ZbC z#s~N%xE4uDK2z%b_#N(QQm``OwaE9K?8#Nb1n6^$Q^>|t0Mv4ynM)c`&iBbA=g?x)Xjj1xmqP1NOqfRGB7D-RoCNTG4$g;+W)e=*J zQG+tJQbM1SD%6#d;cB>>>o>=IuO60BHXoI(vL@d zNbkoI>X3f^H|ovb;TQ7kkoYV>g}csX{-#@iEZo)2`1)({ZOn&O6M9Aq{?`y>9Y#s0 z79m&t_4pm`DwLQyd>dz5b+|y{uB1%Vw+PgQ65~fqxa%VMei7fsw`dB`Gg)Gq32*ih zxpD#Zp);^6vRm4=NaX{*1^JjqNr+=xxa(s178-s9j6(M~iCczrS5ph6M#Cq{nkex# zD2sh$f`nEh-PN?2P)+zH`O75bAZHKtU*LDRYm&q~FC~`Cw~QHust%PBqZ99S;jYUi zw1^>$)l(!iMe27Qeq%h4n3cd~e2oau<&&5IVd}3Im}wGor+il=zl{xu0K8l)F*4l6 zdnH_vw;*uP)cmf0T5|CA3D=@!l*aZ`%{slo{?y<@I>+#=-fu0~Aq?&C*BXDJ6RnWcapUamY%AB8iv z#*!?dnQ?Gj%f^-^?kzN)W4kLjJj4}+7eog`^l|!FR_yskE%ZM3Llv%)61ZQ zTaK`m_AGK3mB0wzFfPME?)5vsxGw196s~}om!-{R-jjYH@6VX`d&n8q%H$MH0>(ZG zlaG5Shp+d>{jSfq^)^d3z3F~GL0IW&bKSohP~ae6z%s9j9t_1tbG;l5Y9AZ4%xm z=+q|Bqgb2dG|B`o&UeAmiM>&gEB~!9Ai>*&9_nT^1?d2zvAgS5kd)hzjAHwkIXe(` zy}8x+7Bd*qqC*|2R3bQXi$XwX=6;5`C)tgSfYJ_W2ei({^`SvW$z?y)MH>%=vSCY` z>SzzIf^_j8dRHYp#|GR+3GcDbh+8Bfv`@jhWLzisNzaw|0%P0jEez2~cAP>8!Y&IN z-@!E3`=vKZgZL5`kyQGQ0E8i8{Urz&J{(mht2sg}THJv$>zRvs`;5myFlpEZb*AcA zp^xnV2ViPaJ@8r$>=U|2I{sk`ln1T@C z(6Nm1_ynJPsTOIuS(V_97m0j_%myX@Z(|zv%h;f4m!6d7L*7P#O5ELrw`qq7y*$xm z3FH|Ba3LD!0&%!VHrvdqo(h!o)-=Vs6Y7HX%Lk%{omhFQikpJH`V!$WyZ-B#uL4n8 z*FPOujTe!HG(4Tmn$|=IRJUUGI!RB@&M{tVXWvY(+I#5Rvi%ny*NT)LW5My)2|c)$ z6>gV3mB+WURbtj=`V;{&Kvtc*HW^dCllG@<-7Q%uO=&vfk$FNniJuY@rz`yE#H&UBw^28*@JTcsaD? zG^HBvt1z)hm@`HhJG2!vvKlX?(k1+~g#FcO>p|2<&X>U3oF1?GeB40%9TJZ|>t{tP z^mE=tuhV_r_40Cg{$)A+tgusk z64Z`y9yT(m8;+?7PQM)xdtsG=EIhnk1Ofa1nXU7{&p?SGo;*FqhPtDzJH z7&jtG^xebjk-xc~Z_XKy4+O2?Yqi;as_}4^6(<9X0i+93@n$PMzFlwD@u|WMd)$5C zi)Va|#R=*pq%hgog9vkOL^z{E!iU??5-{Pr-fRb`R!`8wZP^mHA>jt8+8YE9W19^7 z$tS6*A!3WJfVFxiE4CQ4L8v~qO3ECf!a%%Q%3L5}^3;dY*_YI~bIA=doTX`-`~qn| z6qh3^!e60pxe;|9gnZ2J&d7h{ddZKsRKX8Z^Iwh05hP&CKjN#w2jXWzyPQpQH};36i}vB z#xfr9y#|GwaTI5s7cwqWahZKHLw3%Enl^?3OyNpXiWeb;U9e9IZ${3c%=xA8`>4D_ zm_|Dv+KQR%sHm}Cg{hk){8F;5p2e5+r6h0f8jB1uL_;=v=#0-H?M6WI3Oh0eg7as9 z=ymIj>1H~-3(#ETv)@<@nKS8OuP|uok~xnWk{LHme-5o<miWt8JkhI%TIDSJMEl6f3 zS;04vjC&9=>mcDP{daf9>`MuFAAa*$ZA%K`pXq9IB}E>e86bKw(U{rS25mTD_w5oHAV?t zM_2p^IAaV%BIi$O)3th5<~ujyMK*ZpgRu`mvxc_a8&sB)ubAwapyTPMLx9N0@GwJx%{)6Qb&+9EoG+KKp0KoQkl7 zRw}XCiU#VWa^yrl=?4^BQ+bW2a#mw!vb7#S1vT$OGDGU*7B%W+4y$)b5-#~=C&D>L z0AVILfAr;^;Ntn`0)LNIda+uhD>`*?v)waZo4OdQ(boBP&)0Wujd~Zi*~hB>MS@0n zA2Oa(wp^5_6i~E|W^m&^L<_HJm5A2ysv_ea##wOMa*5;KD>$ir?^?GJT`NiTt})0k zN#Q!3vKY&NBIQ(**$G-mK_Q5Yt@$)hI-L4RbQbS=Y+2g#W@Y)|hv`{nQ4V0p zS`yy1vQFZwkU{!aH|mmP2W`;CSR|QpWLELWP(%+!w34}`IGl1O;`=e4G^Ur$`!bAw z_CKm@iQi$y_sGMm=Z!T-=aKm5l6kZh^j+0fjKXhYF`}hzj5F#GlKEO%m3FgAHzI*+ z5p!PCiS_~8EA$HicQ7oKBL(6*T5zq^fJQekTw@yC!63>s1@UNBq$xi_SBX?O4dA0 zWR_e<>m=?z#HH%Bjr1->&o<>w!Z#CFD7Vu26iXy7|#n zP&a$~F+D@p#zAh3_mlC-f&KT4e@)`k*LhE(hZ(;_w59jbCL+04A}ylQ((FmsoQH~f zo3#U?ib69)-h1kyca$D#>~u9c;)w*bP;QL27rVqO z(#Qe{GN$t8W+;Cz!<>em^sSA9S1_G9VZz@2vMcvu~ zgvmkoH9+Faf~Z;S>?6YfpG5$DY&5Ohw%i2^hOG2kKns8YBl znqU~F)(-Fymn(&9zKLr{IxYp2#C1gqS0`-Js=nxM=rRohcmJVJO-NSrqbHCoG;#Ay zbtscX_pD3Swi@8lw?R9%PLC?{0wVo!vdl?I7**z2CSM_Cs`{tWDIbneO#f#uX(RHd zcQQSVKg9%k2S99ds~!9NK@kb|wy6ASxnf#hPNbZ?!L|aAt#N)ab>H)dRMoWxPr0F> z4<_>lcaKdSnx+%3o{6N}rQK0}My@UB-vfNU_rgW*qU7Di5*FyvvhzOPy z^RD&jkIbRetOc!FSWvalNViRgBE23FN{?}jORH}!E4A<#_&5d`bC4i(CCBcU`Xic+jP{}3Mo2Je z9#BMRwJtth&S&MTM)c_yk%$wKjrBx6SS(U?{rF;)k81zZR#GncX#c<&HrT&XZJy-M zUC2Wn_m-K~O&MBG+_D5RDHE9fFfW{mNb$Zy}Rr z`;ewhTalYh%sA!ViUU`iJ;$~oWt8Am@iujBLy+<64p7CN_f{gJHvrKlmOW=X*i#Pf)->@u8#I3S9sF~;gu zKK;1sDTS+8QoWNh`Y>v#_Tn z_A~iKX7`eqfrLL|Ti`-Wd)*5FLhsDNnY$y|cX49dE{})jFs_f(lOU>c1}7{4i3*6Z z4M5tVYMj5Aha0vxbh>@6H`{1C>7}mZTU`eNeg_~^f0)s?GkU4yjU4HXoBr_`%e#yD z9vTUZ#R5LnVN{?rwCj=H3vNtHkJ?*}tB^(VUctPBnKw2VCKmE@nNQzv9eK1&i#!T^ zBpri}7sxOc^j-kpPj6<^;eK@(#=>zeMD` zGh~`QO@H@&G%%i925s|(;!GY2$6Y>*+@SJO7qI`#`xD|`W*iEGj%s9sJjHNIM==fr zRp|c*<{qOCiNf<5M8_-C{E^>=+{khWX?V$<@^mF2q5C*7Wf&-Y`Zr#n;E6_+?^))f zqBqyB304(5p2vAq|B88E@aYQ>Cr`aVG6^N5;sjN~;GHfh z9dB$#Q1U4|>my{xD`s5k?1XP7&rZC^c&NvGV5`&@gYSm#&z7yLTECYOcUgJO@Ei$) zt=cOuu>LgtO1+|C374DjqPNX8&nvQvfYao#+R!SaY&RA9^A)T=GLZhr8{9+VWj|D5 zHpD^?q}qpf{2B&217YjlkViSqDb7cTReD^&Mc;`mv~33d-%B1@gYa~m@oN)@wnCRF zK7yd1eM!R25>EB`eE^CFkd8Hse9sfPkXwJaIX_L`|2p=^D@+`Wk53|v?cqJF575Og zXaza#bqw=g{7h+YO6Foe^5Xt&z(+A`R8EW5Ed~VMgy31KW4tdkn3@sqUPWF2=8@a` z%|;KI`!weBu~OKkr+O(F?shaBjPDUH*VPyGh5F(Y06G?_Jj#Skt*o}lT&5Nt0uN*N z&TW&+hA^dd{Fj{P#BC70B1f)K_X=&yX^+ryz<=$LJCa|4O9sh#$x;PZvjgYe0fR>``G$Z`?~C3+HcBk1 zZeL`P6_d1~CNgb+%-XZio6HA8cmz|>}u|-sKMzzIWz^2n_3)!>x{G=;SerDw|zoZR&oCz zuBK&YPrIKmowgGA5M7i;nCYfYp(!5)q*8Z1$1goGY1q#8l>@xZF zLzgI8`Ubb+oH;-R+U)*2kce3zMI<2xTm5zqhtWY8R(qA=LX1c7tM(ndz?iNZRC_w` zo;z^iu;eGI+dy2d53gYbgzge1#^$53=PME#)`u=$gMO7&{P|tI)^O?scH%CR@eqZL zF?$gX?mG&;*E)Dd4B8Gyx{3T#AP45YtAH0TGNMgZ5r;*P)kbQ*=4{;QT09q!Y$#}+ zc6+tn2>j?c*b=<|a-?89?~7FrS4YSTxN7}pNr;A#h?X}X&q3+2`Q}>Z5IPS~;K=Pj zJmH?@y8l~H0CyqII?eg0)oyX5sCJtP43*Va*;i(d&?4X7|r<9cE@d(Hy*0R5lCL_dK~Zp862QEPeBCU zs*{Mm!5z!9Ji9|Y(+l$LlvF?v$WkpI759{Zn=dkD0Q3Gb&+eKwgqCXDLv<@=WMk$SChY~bKB;;CubHk28T6>G$uSg{Vz&p*+N`oF%ggP=))8r zQ1}Q;+aqttbT>GpJ}qU6RC_%GCU|t}u4(#v zsyNtX8fOu}yT|Py4m@qUmoFAp>83l)zca;}x<{M3U3;qu~|+z8Id^2J50?41<^j`wH(M@7rkm~ffuw^9nI+zY=LFcADW9?XqS zb!t;heiY!kgMGN#p#8s@Y(|6IdoY1#CeRv*7B+x2<+S=MWq}2!q~HQeOQ5;ghE{Xe zr!_ZxSx+Ttj)Z14HxR5cn>)nTtV?fhiqU7PE3mmM0f2gK_-+Uq4SXorj0+Std_P31 z+J=u2Rof^Fb~x#vzI(TP|DQ`j$5E2-3Fu9egt`;bCE+fRCX#>?#CW|Gvde~ohnv)Z{kk0fznfo;1i zZPs4ik~dZV_ZqpQM);w~bLOSdO2ObId!A>x7m^~KU zqqXAvsssw{)S&R8y_{9uwkOyFhz1v^Me+8>C^9)8^f^ z?sPCf#=UiC2qU+Zd%PXN-0=HUY8Ees50rX_)*@518k2Y2M6w4>i;9kz`kpp*pH}t5 zgx3h+NwPx@t$3Jznj$;l?SKHGMAza5Q5R;H_33XwMp4dK?@k$Xlr@O$^5`H`l3kQN zQC6Gk(Pf!?O*ytq906!X*EMBgItsC5Vt)x+x2H@jLC%y+7+$ z<@QWLX~nM5F$LvzI$~xB$_p9q7z{!pR3gSmTw7#5BYy-o9q$pJ?Zb*``m6Atw%*Xr zgSW6-`y}1dnYT+K?P?M~5T)2Nj87K17W_ggq!>p1Vh zHLRGPeFdjgd{^T0c&xRo$*ie2)9>n`e(>v!2f4!b>%T`n0nS`IaB;HGfeGm%RFh+T ztoDdn`4=BBXRg6nP{H9<$=Nw3j@${Gmxz^#-@i})J<1>hx(jyu<3nU_+zBIsvj0p^ z;^BQPFlqstPd^LfV5W|Ht{IuFiad^y$;S@Vc;CYN&+5L<5A>@0zE4nAyi!-%Sa~n| zV~4w7vGChmFK^X4c-0Sdh4|2U<#~}R=cRH_=#Y3{;A^w>8DFsdQqT4pSL25Zzm~g* z+HCpb%P(zQUu#FyH*L188R={4Sk@Qb*ItxdYW?=KRGW%7-pe;GILAFBFjqvWil z+ow;u0R4pvZ!Cr`7JEOcj`*hv1x0aw&|VfF+*;g6UULHWgg8j~_0wqVzzGUBR!}vY zwf&Y^Lh2pf*NycL&2GGw8b!)tzgovmnvy8Kg@KFbuLChHO|;~WkvSjUgm?mh%DFnS z$A0O?@Ls8RNO#LmB6<2NRkDe*05U^rK;UbmElqp;%Q%20}BOpsG0R>}B?(n@Ht`~U^7g>t_Gz!ZKUOVXt3&nvjw8J38 zDK`1_$56I3LcAaDV(TC1SKK$yn`g+JHGgE2WZDI+dgGQB-r-$St=b#+?h(xfpqFcB zP6hXHeH_|BUXfbF7Qquza#u5xmP!&IQd-KSf-Td)j^5Hp?#sZV-&*DN&+40Hy^kyF zSK7)BqB=0?`1Hq=+AQ2@e1{fP{ZYx@(DPJX`@0&siGljY=3}#$nH*+P-{1wD{s+zm zLG!Y~wtK%3$wH*f)vy$~=Go?M9n)vF@c_PQH!>c?2iB@gZxXER=GFRyWX7!E3G=e& zeuPYjex1{m1Myj)%fuAFG@ZtUKUOsM4UPlO?7&4Ng!sPs+9D(?cw7qKjlfqL9{^li zQ~`cOu=ju?QnPic!(oxQ_<%LOpu$lYCatc8@|CR(cQ=MtCskd);<~$f!(c+)0b@tY zMEBgDFWhb?c(R;VG13X7cMFjg*$^2_D>L+zl|* zrU1rG=D!7`X)W^U526vogptqrGXU^E$l_f;NtoM|W*X~FxEe>(tLP&dMOT}sY*< zi72eNAKuigwiS}|6|M<6<_Domhh@1MqS>6YVsR+jk3pI|@c-Pkn6T*sv9<5h$KMVJ zI*JeiEkf%kol86i7WUC*!7QQ2d&BR1pEgT3=QKD?w$CR^#6QD3Qr?-CxenrW75}!x z13n*F%;yA#C(h?G9QhKjuqeIePGJMeYvjdDs9F;54tO-dL?BTn$~KAGBPap5R~0l$ ze4*SP@4lMT@j$i5yEk-lLS?Mlt9Ed{{;NqNEHAsjwnV#kJER_U9v;nxS)yfncA~lJ z6WrMCYW$7F=e1-PUmYx#(#>*~0SP(~$_ZYR@a~IW1^GZtqQbN&Y+AdbCBqAF5$kp% z7jq+Q4})lA zQnSMxN$!v^7mF^2F-^)Z3hfP^81;6b3V1cCDzEP1s{_-)aLwBREWrVupdP?2qn`{5 zToMiHv03{eCYAcZNHz?3`$vAYx^c5W6uLcHqrf)sBl7B-_z|s=!N3dtCS3 z3`WZthT&Q^)~Lo$A&20Z=YZ=;?+5K(I5hB<(+{!&xYKkqIEETfhN4xQ&DUxc;jkj- zLRKv8sXqM<#^M;%@aV;q1nlG-k4xV&RwchkXu-E2yqK>Sbe3q|x7fzVH&@9^pRUH2 zQCM?_{i))UT}{8jcb#|B9^=2*X5bm8-C{Le>(hUPy<9mm!l|*Vfy4L3RhwLmlL6c2 zU1M8^zgeCmp>tw(4oPUnwH3OKy-)B5MP6(_k=FyS$tnX37`rAb_%VOG8XPP&G#Iu+ z-o)=}_y%~?TVUNW`w-lM%!(esq!EZ{Rr?U>3i5q?36*GB<7EU|V-rx3yL#cx6g$56 zT;%0$9K$J>7gkUB60THMPrznBE)0;K zz^Wydi$2>nPud=pyVEpq1y2|1?%>zrzU@IsZRr6e14h#$XXc54T)zE?@#M+Kk<0)s_ zsx$fYh3H9^9l@N3gEr>Ig$sDCZC0met1I>r_%D4>=7UcSrD5tYY8QD^2}eFzU9F$9 z*X$Sp+>XMCw-I666u$v?(Be&B4sfn@!NY#Nk0KqFnF{H|t;X#03(n!k9(k833HeD- zDhbG;CghvwRCaBDycePKxy(XAi~lJlV|CN*T3iXHWzLHu`?!yZwybg%?u^|rx6M8} zt2Eq|K(%W3^9|v;i}5lI+Q_vsyUjkzHUZ(_0lX7hxYOF(guz%goo-H+pHF1-|s$KdB$;A7WRqp22 zxyY$Cb3-XPhmig=%YiFlBWq04e=D#m*C+sHMPDVn@K1cMd^|zL6{cV2O1$3<+8G^T zD(t?nBI8&ajNsVsu&l!W&dyIT>0Cpnl7C`BjuLF*sFjG4EKA^I&QvV(9!HX3YR5E! z*O1^g@8|FiD+)S87rNFd!odR9I{S&Zk(2;J{Z}vpi{_>3``lKRkRp+*=AF9G=UIV@ zs6-TWT6GK23j7~zX=PUIL{!YG&nnBGA+j&IR)#RePiswc{;E!Se+@Rhzt)lXT8HTc zwzWvYxCY;vRhoK{I14{y+c(!BgXf*l5Xz4@tzpjS8Qc- z;oH;`|0Tul2n~*|HrGB;`v=kKAJ{ef``YyP?c+T=YQ7SZ2uQ)sYXd>r%r?8I8D>H+ zr8Ur}pL+qc;4FvsDq|DkZ@1iL)mUUgbPen*BI)L1nNjh8(>8g~iDTb`Sm`4n-U>7900V+X6!Wec92EOPZ2i~+}RrZb)bD0J6BZTp5j@TGeYq-pKi_t?cX zSu_YdI5v+GfdycWP*v{P5c2S_M^t5={o9Kx5=l!a=SG+z%twET8U>yV46M%YbMuU;%y=i^O`&qnVUsFiTmcGPl!K) zwLpD$Fvm2AL?=fSkl>SboKltNDgOm##KZ)Q=VB3y*rmvn1jjjGWEa~A0gqFFv~r3o z#ynL33dI<>->>Hi?O4$TZjWcT(wD`uA6Dy^n0WO+-^L08D7YK>Sg1wssTRme3&hp< zBt*#s^XuPZTa>ivzXSl+adk*F?ol9qeW7H-^d#WpT0OJ;bynV=TF6u7%Ou>VKW>3s zXriZO!#EYc*w_5J>%YT)wUybp^{D!p_=_x%Hh_@)4d{Bt8nZ9^_17gQ>BsA0J?TGk zidpvueh@$J^%3^mCisIl#IJjW?k4$xKJZaWvm8ya+P-!O`CqO7ALNAQ=xMJBVt2|~ zqhP-pKu1B?N>i2%^qG_%q(@e&X-kkd`Fe$4-vBQMOvb3JD4bq%%i>GeCJ={#yae(i z{(`3ifQbD1zp#Os6wLJkNx|G9#h4u40hnYln3mzap*wG}`qM=wPFKwIN=eW8l!;xR zAn+8=t;X-r^jvG8?T1=uTn(GiU`iy#Ol$T9x!07kX|oUn&eINv&4_-FUQ>vx^$V<$ zw%=?C%4hMjz&ojLs>AfR;9f|IH|1`uMXxKiB8kUbr26!GEmXNyao`ah+e|!%=UJ?V*%kW-toN-J$z}^( zWZ`&6fXU}i;^nQ!meWxpr-FyKTO|qkMmAiJ7T1q@$|7`Ldx>-HC;eu(gG@{qxL1sc zS&75eR?z3!}FVPT^1?V^66GYdZ~Jk%O3#Rk0_zw2t?xD;?`Q%2b%ZSF~t zjqdS9{c85KmAY*i`#EO$eg|gx7e*&^;!tR8u-o%#;FQ+Lru|@4wA2a5NAYS0NuH}6 z!M}sXXc=q`oj(2gk(gDKsj8N#s?vspIH_v-*b3f6t$Opj#BPm~NghOM;gv++O!QQ+ zVIW2fZ1%W{PQ!en%z<;UQTw2DzfE%=FPXn_=R)4?KN4%~tL-(tqq*gLPnB4?JO{=N zSaqA2CJwUG=53iEFTXwi)*EiU{mx(H&%SH+O}EUx?v@++LKc%ch;{Zl!JWu@41Kqv z+W4SDGA4Sy&SSz9+rj>HU(2)bD7S*w@iK@f3&p?1Rrfkq!G%xhsl7-J#v$i+Bc_g*m74{ckjQ+eEj+rvCP^ zfsvDgU$&LGlNB)AS=M3Pbah4+LJ)B#&|T2G0CyQajvCMps2hJ-6;D-nXt4IFDxnoO zv8djblbG5q$iLEdM0=0$x-lo74r{jUeH#%R>$e-=1l0Ip@PM}2;!zqtH}ToQ z$vz6#*A%O?{U}sqo>RYNC{}VCffMF?C#~sjs~{8r%=)yK%5ZNU>nl}5Ua1=LO5Fr+FU?~%&|0ZKgb(u& zn5vtSEv!#Z3;mdNE3-#xw%fC0S8QHRBCy@A>$0opMpFAkB;j9a(P=dwA&j=AHGwD9&;H>yc z9R?CmVXoQ1%>-iDbVb z@GeL*x`1{!Ogb3$9r6CG{q8D^hdJX-YJ2*3VKBkvc)9F3SF(50%#!WXN03n3=y8M6 z<;t*C?uJ$CwCLSV%7^_C&Aya&tZ(D}$V>auEVTIq&!;tNpk~V}qW*k_BI*vOcBNb0 z?`YC=d&$u>slDRTRQ6|(y*)#YkKP-G-oOx&8(E)?LD$n!BMu1G5FW%3PF8c4#n*%} z%v!_6A&&03d~)qXZ7U9o48jJ1#`L5R88udG)6I+m{WwPhHg~#tycDSE|=xcBua&u$}^hFXPN3tfBoQi1n?=5s_ zmyB^VEELy;27 z#WR+i?{4zETl0mMId4nxBT;gz{AA1vd0sU!KM$#iK&M?l0O)9G#@koQE{ypVj@(^?LJokvSK$xv@D5N_ zR*{tTC%Ct26Aws1kf=$(x!;K&yI!hx;dsS!&3+(IM}V2Ezkp1LZ=Z;GOLw5r)AcXC z3$UwYDc>0p+&{|ssHuVH07IO9V-=#1pF$l#6~HCfid1E68k)pl6%X}Yz~WQ7+f-dg z%LvfJUuFg1R6@XuZcUcDVd+F!rCj-_Y@keou`ehg>U8x_b5JtaeloD;OI%Ig{&_>IT)#S zG4&B9Ev7m<{xqsHw^oYI=G1U#GfykU06$18b+&j1HoSPYxCzST~nBu-4VeoGqp9<}!D3yq79xjQ3nbo6Re9D7&cx zIj)!b9-Pa^tn_l!BzCu>eNrc*wIf(R{7mt~v~m2JnzJpBs^->ij*Ueo@tOL#y_DNf z;3JGz@F=jsGnfBmSL>^RAZ4ZyTFknhh$+_vSpUWBb+N(qSk7agBeH29aPSl(->gNc zp3{PH$~P1{mhz9`t|&wvJ>h(U_2_BW=6L3_$0i)X#LF|@=~}#lb*$>%azi&!PQ{k` z7VOV*n&i_j0k5s)a(B<=GU^XWd0f`Y!i&^exe>X!C+sNtxpUzN?6nq}cLiy@kt8P@ zo4lv0szf&BMcVVq6lm>dq>eLLPdW=uh5V;@aJf0d!2Kqn!{S@rsf=6e1xDnFxTVRM&((SZVvi!p=t@fr&>1p>KX*oT)p9Ihb3Xmf(r`}F_9LMU44j7_ki_fTnDIV=&1 zO@FW#-bBr7tR=WXHqUc2Mig!PZ!l@(rP&A-U%7nZ5NW<|an#CnHC@ z>b@3N)jFN?N~bm<&suv)*fSvyH?JhuTJ(#L+~dru?ak$m>nWsA{?x+vGU1~ZDX!1P z)r@b~+9yLISl>4A*IBpW&)JdUzS)61xV^h=@3clX?kkU6oE^YicHx17Hf?|E&0Oip z&RE`qQEZd8sxlClD0iCQCT$L(K(*D;H1sLD%n=f?Jer7;u&(uN54mkyS|c0sN+KT6 z0T2BH1wsYu^g}e1m^4^x7Mf<@qF6S}r`O9w0N=&9{{w!=v9jrq@HW_6+smf2Rg>eB znoY8&t{j9(cdm9dmmmV778}~tZrgUPEUyjkAhng{+uF+pb1rB)fm`ii-s2I?Nv^qW zJV|Lx?1E#WU5fItM4RK6NNU>bSSg76mpC;`2xM0a+4)cl<^ru!FFqOShJ%{oE$4Tb zBu#SSpk`op=v=LBL=Xcw9*!u(Jg?fRb>vKP7i^EZ3O;R_eq5q?x-CH$o4>}-Mt(4; z0B$rm)q8Sl^dumOIdcJS+uve$H`|ZniCvxJDo%n;a_98cCgq9oC{wQmou2vbg>zAb z#C!+N-eD#XEgh_Fw0&snu&qaTEGo5!a%p-#01+CDOG5U)CbG})(iwD2{}28ja6E1t5#cWZM7Ba3#(!XG=tV&gL*4f zs?lYx%yoDYsLQD5X>Ac*}5&} zF7~@x=#RuRto2e)moo!vBIpN1t7=)GqG{>M+NC#reHl?(e)Gx{3{&S8(9LCY3Jhge z;i%#(v_AWxi1S*EPI?XIPwS@C)-^PJ^?G2-AZoE$)CYLR5LZ=?Q1mgO$NnMA#w#ax zcV%>D!GNDZBl1TUu@tYc->?qlti(iAA{Ui70pE^S50UB0x4>iBGZC(GZN4qIrgbem z;+CK_wZl8()3lFfeuAx{#>SJ-Y`)RL*U;`oZ^>My8vCAVFvNE{bIR$cxOb$e7jqe8 z9OhoM;k|Gu#D)VjRE<nXw(V=GZ7bj~n9r4C+RM-TOTd(Gmpkm^F& zkHhqp7v7Z-{)>IpW1V{}LaF|0;(-#)rfgjgZ_oCBgEVSg@5Nff2HdG;8JR|ZwU1`* zVv|0GsCR7Am)NAg5Ah5c;2-fUC|;Bs$_5wZ0OP#w;zcQa0r)!Maf~*fQieY4W25hE z*>h~8W1DibJyL}h@0X2iP&!7@=-k1xDZRB#xnJs1<4kyn<`Ft5{1FYDI669E$1E*L zq*H9){#wY1u6jzbzhwPHy|h$!_Qz;D0TjRS2w<4wm(SHzns46Mqt$Xd%kgOP8p{MY zVbSZrqKPt6-hUF|&I+icZ2wq(6!2q0A)HUx$$) zr93*!3n~D$M?P6NCSVj0##GjIet*&`_(jC*#oWFSf=c>#+Pv@D682dXyQoga%D(_f zw0lMIwIwZsmNZfP1X`rxuss!rg&dZGYA=ijthEis4J4;me1ow=Cdyn`FX6PmGS`tQ z+9smSd1^7?uJs##U5G)>=doA1?3I{@<;}vpu9E9MmC*S|u$ID|_M_Uqnb^sSzE=Wv z^&6AnwHR4z*FFZc;&mnKVLxgp1r%=B#G$;meZGD#AVoa+m=qTEhQ`SUq2?;=>Gbu(c5LPA zZw(Dh3QlVc_2&c;F9`_G@{Iyx>@XdvHD1R4vnmj`&-W^}(C?vI5L@0&i-T`ZmnW~Y z{?*nalLE8g6Pyz)Q;-A(rRKi9Bc*;Cj--{Y#%8zJXQbU=Ftk1|l5f|WrF7N5+F3t9 z;o#c?%etq?x2NSU!R%y|Fi8v>34nC~7+IFShgRAYE(hFS)Rs$s98ORQAfbz^TtT!8 z_M4Fx;kS-T4ZdVHd1LO*Pp}ancP3EwM;4W!-D-{N2>%wl_5o5BuPIqio7W<=Ri3m} z-rkX!Y^$rxw&HAO-E1yZ^&X|r!CWmQv>u3^+7033R!T8>C~v#! z`_0w^{-A1TCH2l-87RX-0sC|)-m!2dGUx=9JrUJ#a5F7ZAK0LDvy zbLx9c^sznon@~`oQ!>k>Mv|ld@HoIc^GnPsc!rbrs|i zYaI2}AbbTzF^fUi6)3ZdjDE~sV-4twn1t36q{9z)^AbY{6*>YTZHl6?_3XmTx3LsBXS8YUCt*gPvu+_Ua-U+FS35a_m zwVO-1+_Zj@*0-ULQ?}TN$cKaxPpMeHBXjchV)GvrQ!ctZ4RmC~Hr5Za`_PQBQl!Te z1bh1HT&qsiC+f~SHRpHHcCM8NV^~j(I=@RPju+0AAEiwFR%A=tX~pQJ8Qm(K{7V-u>kMQ>Ag2=@uSD}jC&(XVu_TxZdG*M?o=(z+l|LP?klT$h7FNm^He z)`I`Fq;&&nJ=vml!&q83kk*+Ai?EIO&l5s7xODi5^rMW1)!A;?wtFaKB(Cefg zm@Go23gs2P26uqZ7OyG^oe{o$feL(t=mr%Kz;)Pxp;s)>J==}6hkMMG-s8C?X zNM)|y(7>Iq5Ifu2%`I2*?m2=2%c++xbBy;-x z#z7d?X;#4AzsiNkX_Bq4ayraDGe|Sbv?G2K=0bTBH?kxz5p4A|ch!oeGdU9E)m~8zj1{mfR$+> z%}U$NI2Pt!3CK4v#qGI^jL}J~-@(W#PlM4TjE+lsd>$10{{Yr$FX!N8 zkG%Azy)VK0hsP$KkC%5HlQ_I%kU5|F6d#j0Vf=gYTd;xTWq2ny>T1j7=95F&i63BLHjsG4{b}^6uNL?T&sS#)AtzC0@kcAK_)${`5x4( zx6Q16Q1?9;DZ$VRq!2Er&{*yzmiObuBER8N4>KF_Of)6Utxls%-ru7VdDX+rMm&4< z>icVmQ=&pU5Irh#%>sT-U=WlC4DH^z6&r} zV5mR6%u;CWTT$4Pl3ok-Xw|#5#=BFBs=+yxXtXby#e^Q56}ku8jJG*__h`Ou!Bg;f z=L9LH`fjb-Dg(yvTV}^^nF|QriAw3dyER`A&MnjGQBtBth{<+02nKfe53D7iVM;aM zHof|Jd-Y~}^^@VJkS$3^X-VTN7IjE^H5(NDC4LK*!RTg;tdvNIxoLe)mbV+PQX-kF`Tk<*aF`_J zYrZ{N{VRG9%KUVSpZb2(vex*vj5t`$+g)RvI?=?B+`qfdI9Cc$D?TWiTb=!gUxd1Z zd!P&T_>BW1xjD;&D^@~;U5GVg85a<9svwomYmBLO*a+ZQ120tR2^WIHlqXiSOpN%^ zGJr(CE<_tO_J0Xz~1n6oYw;KrDg9cn~n{ud0N?wsPB0J5Y;oj?VC))R>NN0yx@f51x~CU=V=R^>3Ou1QuE|v zuHt^NmrC#vgcJbhp&>?-FlSrlBdu`&fF*pS2SF6EcFFjWjl){?K@B=76qwWDBc?TA zJw8{Kseru9K~VshOUs~ZquB3xjD#=O{Y-t{&i7r}I6N2e8sE>$?$_*eSX6mbMNTNn zlZCa!J5<)XcR!5>frn#XpDs=K@#8+jw5Q2@G3bh1>wJ+5_|~uwl`IHLpD?p1R*U2b zx3U*g#cT3XC38Si3GZ@+|7u^=tJc^1I%aUyDB3ZdKln$jKzZe;zR59JncFy3JOwFG zPSTIU6}MZ%r%EsL^QZvR!vva8pMU>HJ9d*=-S{$BAUerWmu`@ZLzk1Dj>QB{W6n4iBA2xrEl#hX7okU*iN9 zQVKSXLY8tlrhce%{>gAg!V==^vOI(5$rD5b;MFUMB(QoyAmY^nc!h9~R*L)hh;EH9 zKj7_7@anMpndr^|S9Y)a>78=G@P?OxN=9vjhR;a^i5|p#>evlYzz67)AO5S9aneDa_dE=P5+4co-5@i=Cj_$kDn0htgl_ym&cI)W5kX+T zj#NS$jbW2*Qnv$3?0i4xqIy7tyvf|akP%R{T<#qJg)%059xuFw=+%~tlDQj}K*a>P z$oMJ{h*mkDe*?259__^^833YH3;CovAh%}v3YPojH(w50!a@`HII<+K&TtByyr9T& z(-}B(CazU2v>NU40q{>2isBHF3|c30L)L=pT~DCySYcOGD=N|Ap8Bf?d)iDwl zU6j8QEL5heRQz4^Y}MrxK2gfH#T8PkuAqg~*#nxWI4fUAKLm^Gr`_MrvrD}2Kc9;- zAgPKf76v~nOspc`q-U%%?23$#2=lO}k6i=5Ic{PU-;84E!nJ=ThKG(10gP;mLYk+5wBUlQ%8XOww1Oua738qL| z1`32f7j`OPOK#MfATeSijJ?>!=5TybKM>>K0dZv~dgwZ=k_gk2Vu zRt`7EYv;crVR}1r5JxvC6|D$6&~U4IgmP$!mMUXHDP}B8CdPzlsaHKsS3fh<&w2bw z_Pu{F?sSigH}1ey2TXYe=uC^LvHlNiba(>f8jEooRqpYettmfay@E016UqHna*uJo zBp0kDxl}{1@FF>kvI_bclEzE4!@J>hCzaDHW~74r`+gIH>Bd{QjaEoy1*FtouQ(6M z^C|!Ag7O=ZN@x+@?QFdrd*@K#LDpucd{UGKTcz?#c&*bWX6TeL7`f_<_t0XvX|@?U za%1%Gt8iiJcd$7h_5-}JZ01T9iT|G0(DND5NZ|hgpI)c& z3#2j|RL5<)dm^ZcZ$Ll7Y2Ej+=!S1W{TYdx zzZ}2CY5WSQOg)nFoAhX205rJJjdQ`MK0?(h*k>|@B?Abf*+!pg1gQm>+XYN2d~vu| zAD1V~um<8hFol>AUW~A_wuRt%Ij=l}YZ0L+Zq=|7a z3ZBINXPkvMoUP^lb7++cTBtdigUxX8O=5(;1kI`yZDumiap=bQc#3YhLP5}NwAt0{ z0_{M71rpZXms=|A^_oD#K#(qrDI1VYwZoSa@Sc}Dd^n~ZzI`klr8j^w^)T-c_a?9H z68^zdD^Cx1VRM2e=0xBnQla}W*FY>!FdRQFEn-126gYi zK18(DeKVldVG;11D{Z#rQD+6`V+el?OMuS{g66XLAES&|0WBsfar)P5h`~d904?GB zrt0^T569N;KV^YRRRZjUmkJv|#3btXBkR+Lzx$`^_g~_M@hSB?TAf}$>>x_i zuMcIU*Dv+!T4FF>{h}YJ`e9zli2vXz1Zd2li)y<8YH&o2whx(ikV~!eY=H|+;t!Mf zkQq?rt_NmXFKAzfR*{_k+B$aEFA%Mhy3Kczn6GExwJzyWuu^hv`{E$@>H>wA!U!D= z`>U~38g1XxWg+!S;%>Kj2lSvjAqHWKOQL*#i}Ya;DT;%}M_{1)l=GB3v}R%a<9K7cc!q0fb* z<-+rHXf3Z2yY@w;m#;31ZySL5ZK<@~E)kn!J`FdOmuuGlxaSrIA4kL(Sp zn4?FdW9M1;JO*<(v>RZKkzsV_G7qe0o;sQT&BQwGS!feo>Rs&fU~_q|wio#2>+|ox z9;)w1eDmSRLtBAqqThsvl&>Cz2fXhP@@%9Q{$(Rr$Hg=jeqg@CBHYeK$(+y9Yfs6_ zt1%XGkOU9b8S9V%_YqhPDSX_Ldbi&Aa8eegrN1&g{kyLd`kv#bKRrGDW0L-rIr`kv#bzau^UG)ezPT6${?hEF$DReHFZs_M+wq!ptTqOBJ8 zwC)faNC1L;6b7+8fBb3M07%HAd#RzEM>6B72N}oFQ_@EejB)oPUD7_5m|2)p3Q@O{ z?E;Gr&2pFSMm2W)i+_NMqm>4+Geq&a*$hp%Bp$56#}0MSur4x62`}k?ZO-j= zPU8kXb(r!@H?~@K1z26NCJXH-F+Z^MpETU}zxprWP90F9ic<$|w#R214~bl zU3J&pa8uxh6)Tq7aJO*T+GQ)%nm5yiM>5@;K7o{uPjBCLXZBLSc?CcF@i&COQT*k8 zJ9}vX{^sHjDg&z5WM2=v)0IeTKHK;_FZt}`Gxt)P-!u4pdh)rA&-9ftzqjKV(~?vF z9rFZZ1+K9h;nQ>JgRnc;g7cB6X#)^3zW0jV_9MQ8jtEIfKb9t)A2y_az*bkz?`}+a zYZlZEg2X>h5XR4c%fjNgTKufqh++?|_ZRsf^De&UKK&qL>gRPQRBOZll0>LSA|1*> z=4Z!wKhk^zU%r?q4?vYM1Ezup>19yr;>uj2PxElARQ|F0GSi|Bu*7N{M zL|k@sOmnFgUP&=j+S+?Pp?HmJokL&aazFNtqw!#PS0)Z`#Q7=Vk0-95@N6zp>Pzyp zeTUCJ2>kc{IpRFk{n#EyHI^%=`YkekfE3V0iiWxI_h55|aV~0S$52NB1>26qZo#x? z1V%0{1>j^AF3X6iA5tng=jN(H6Qi2e88HyRGL@vtrMyKPG_mt{5t6n_(jFuov*J`# zk-G{D4!I;SmiR6D3Va=zNMcP$oZu;R=3s79hxu_ulK$|?mVBM&r<(M9$kiNg`j+`| zPHH}7!^I@jLp40t-_(UvsJgOkgJL+Kj%RXIf@*ZNH%|Rea0OP=X|XGWnvX1+mE|p& zW{ft#DgGI3Anlv~g*b@rMOMsBu`CdC^ku1`&Gc!o#-{}TC+Hw^A<2mKOPkU5GI=pY zX3O`KT`M;t!MI};Fr;H|H56%ZTD-8?1}E@QEbd}NnTJeZ#X94s=oLv@540{aO|#oL z8wvd4)N>YMT!SwX_*rQ@hCPucP9G(v!48@0m)^8g&9Arr={wm=&3xO_`?2v``083T zNcz=Bu^O6?LqLR_@CZ_Fg@b6~eM0i^Yx|xg95v9x8C6!`6z^E?)}_3&%I$(b=t&Pl z3jUCnPOjRG|F3M-s%0x>zt30BUe)Mbj_^y%uJ;y z7J7@+BaiYl=xTcYyBJ;Woegyl`}nbK6-?54DT}uS&Tl%wYqvGMjTBIMjptCa@Q5>* zV?5gj24bAY@W_O~ImVBXjegf7P5;fL#vK9%jP|%PeHiU{(XHQ`k3z(*10LgY7@`98 zlMF?BKp?C?0${4|m-L6AORfHyZb_!AQuxwG1;cZn+lJr5ICQo6Me%3&vcU)|`GOVX za5OjkqNEJ|fqG85&G;YKZTG!DM)w=b=ikR_hvIW<Z5ajyIlR-jCWKX)6&BGRFQpRG?Wd`%-cbmtV!IaQxO#i`AoiZBpUu(CB3%htJ9 zApR7BMx?m>O#(LBJjCa?)`<-&pGAC(Oo+YW5}c8XA*Z+{&xvTSIGJuC;u(Db5E!gu zKg!cjjsUk%u2!-!@r1?Zg&UoT$B;*B+31Q_CYBsIrg6bB==ulcF?iA>@`+hqVNc3D z$Q%>FH`p^r>1F&JS`;P3Z)4$`A0ez9b5!mnRH z9e&_DuykaL;UI`n4TDG?_6oy`fFO_3rF&O~9CA8yScWisFaENt<#i;+6wGl8&Q`yL ztFX1kUL+pe2oV|{$#AzbG9=Pqk8qw@+!lN%eiw%Ou#}lsywVk_;aqYNeK-&YR=JNa zid_45EXD%fGI;@^JBp|oCPLr9J4kTmVUlttAv7;=DZa(kvQ3Jt&x@~AG`SQB01(9~ zyxre=&%_J#hcUt~WvBuWBNI=9JxD;`Ye#Sifa>|h*SOq~NAQxk6901eKM)`0-wB#W z>JT&_Pha4?4E~@fsi=2d=FDFEUJd?Yqczx$0z{vphP%s2Jc4<}*ScDsh<&A-;@~2r ziIidQnlCRtTaw-+%J3-CfrTjHYQ0d3A+vIA?p#^$jo6hM5N9hSvU_4 zYy0Wbfxva}=|EI8%%ot&Scn=dMh##AMlGNT?Wg&dt}MCJjhA>l!afCL@#*o%B0Km< z^9^W-QQb(tz7!y^B!eo74C1yYC)jTSgt2Fd3azo03=2ggM{8PG`e*JTrr10ixx$WR zdPZck&;(U!nsx$D!4Wv;@yNqj0$Y(7Z4Q~SVQ4?NP+X|MmZ&Y`8!v#L-w5_#SLQ~( zY1cvrBe&p02ULGV8`h4%x;pdsHO4lK9NNyybet3Z!eS~2z@Ysa+-OJay(uyR+o85_ zOTdrn?JrF4NJvjTXosIz79;`(>!aWYHZ|Bhr{a(JiLYGhB zo}*g(d_0rox3JV%TUeyt&Jt#|3-}&%6?~QVSX~7%Tc+4K#Ai@ceN~Sz6+L(Em8J5= zA(ggVs~^xKgn1bpFxg5$7j}4oiria;9}gPaslOn(*=lsQT#R;C&Xzk3^zs|w!G+1s z3hm=rQnFS(pi32JZIPPQqfo(UPB9L3(eGvL9r6apys$_#G4`&o$SPH&)l&j#g+0i^ zjzU{vza7a4R>9_khWSvd@6jU!Y8Jo1so@yJv|?V-6-_)vOx~|PYK?EiDg;($@GF3& zkVb+;J$e{JLNK*|0>44J*-6D5s$!vjLVE)PshAh@AYGare(Lzfc{m?tu-3xW5lMQDGqNVGJ=MfF_pV@uc2*Q#s88L( zckKaOBUjnA$Xa=9;kCL|Yi!enVO@!_tzGI8VO>btkSo3>FTTdr z4F3QQZhH@)%)@XI=eTmS{uEihQhSO;>(bRQ%4+vs&qtH7BP>ss{)jzm+7=c(F5d-A z*^%y1{2&YLK!L(56Wndzl)|%v7eh9ni^W$$IKkO-?fV3aVBEB-c|uIcv&r1TJvg#anuU9q2TwEGaZ(V|qtv>cqF|y~A!o2!L4dU? z~~FEf$=al@40EE8MfGuwA1- zOREwY`#wK7=7`w@RH1SQA4Rd@5qGk!lI33ZspWo4HlUM6Ql->#2LvV6NXc?Hrj`pl z?vQ6mC7eGv8K^){JVDWQ{FVtxsmPQ{p!?q;flL`+rzELKoyU=W@J6ZQiSBl4w#+&{ z>@&uLJ^%Qy>n#eP(^%CMHrXnKqgESVjjl_MdO%*WvRLI(4Y$%vr3MT%jgnD#JNPS1 zEQA+4!8ONk`CG*mgS4O|q1gEDAA}Ic@Yq!eOtoP$fiTX8QZsBcfJg(D6ltH})gVpI zlv5|U+rMwpOJvnCocF;&;oOw+ryi&LR|Qk>3g%pi@>iypPlml+UXe0cx7N;aMSFoG*({M~YIshl6)&vi z_boC;L*dqZty+DX`fC4B^L1+Vo3&84R)4n^+NxFGlMoM>fHkATvjzSG6o@>O4>+kl zp-H<~5zsb6mzsKhx^3Z0Lh%$|#Ydl^%{63Qs$33yZKli zK9ap|m}mU-wYeT<(o%Hrbsw63GMq~nzWpLpLPXPWh5P)v^CGN)VF?H>9Uo#n0!nNY zClv8J4BSrEB_5scn89C6>#n*DfijeNBw-)Mu^9HKZ-jXeZu=08HlDc%{}%}A^Rs3! zPUs4)Z|3hH)55)e%)(HXm?gtp9D-}Q(~UxbL^&hztU8}84+9`9!>F#qSp-p@>&G^S zcz)WS1o4wTKf%zNsl)9<5>1xasFK$}Vaq>s3C{n=#qvX^N z90Y>BS)>eBSSzr>K2m`rqSlzkMH{~HW4mx?1wSa@+GUI;;@ePGvf{s1Z2 z{Wfg{J+Z3O_DJ^9?)|tNz@O*QJ9I-^?4oWla>izL zZ>Lp0c2@WH9R7Z$dpj+;u@k$ulVM^LySHPf3QWQh4E;Dg+s_Ro{T$o4)RCwE4bqOW-!|bt`UOMJwZFD^@J~`qCAN=c{i< zi1?*9-R509WARMyElY1$xyp8BaK#GT1_H}g-sHXErd2mwzf3;c>TmkS(!h01uwyQs zIew~=#q(?xw_Ug5hU-wq%4N%!tz34~b<2?P`elIjjT>%4-qhC#crz$>rR~p?`L}Ds zt_M+J?JbkN;o=VQD6t#@nT+iaJQv&^-Y#7-kW<(*c!$zM!Ipg+nbo$v0AwCqgV$-D z7bA4kXD|U|U6F6Z9r-=9&u%P`bWM(w?H3-n#J%ZyyaW$){v14T_b*UrW=Lc)LD(#5ld3i}=pt91vqw*+%r-Xe5 zVpwHjlTBq&)cvg=BRTNJ_(gBzde8D&O-}Tw5{N%lykrxQC_V@#=AmuQ@*QUesmwx^Noss1aFEJKvTD!r8YaULeOMrxuF`d7 z0{o;B)O;G`4}6hu1Za|Di^;LShUTmtDtt-g`2-5duKJHI^w@FQUmx~&mW4ldulvuz zDM-ckY5M|`*N@_a)QRr4PoQy?I0HE?1tmG_^Gh;YJV3o~!-JrYZF?P|e;vtNKb{qw ziXiumqpP65jCR>O9TjCTXcg^UIgEn@EBL3qg|qf5;+>8waJt@_zx6pLYOfF81MsSj zm0g+6ebQI1bZ?r6*XS!xf{nU|AJ1NT9{S3kKjm*TzWt*=EB^`;&e~6bXQloB>h~4k z!oSq=#y+QhFjf4R&<_-{V^4Tr$P#L<8xoD zYSZi3rg!0G>m`})wlCs_2Xd@Ctc%qy6>yWL_ z;i?#XUiG8aOI+@@EP0t-G58a_)DD4@BMbTk_z4NXMY-MTwA7;NgX^;U961%86Dwl3 zrNDoQ@IL~CK8GAtEgfw$=0{*TXcDn%**`OxU%N8#E>;5mqC8Q34f`*pr?CgUkJ*hx z_v%KE+0ZK;!#M?c`kYf#ulO%)&SOV}YF$)qxHr#WY!Z-T{c>S87a80;k!$KPYS*7XJurWL4g$oq{SZlF%h1bRB@+VP z*jKo&hfpI3*Cb0C0PHuq2)QqI9qTyK`c1nnc(ZmChb`5DcSgEO?FjM4v!04R35mT0 zcI1pYZ0mrghel!WxC3%N5x!$mFc$dv0-V+xM1*^rmlIfpQ?->dwv)KA37|z`kEQyV z`nDR^QUClwCu9&J!se`LfYcazQhaCfpUPf3AAeWlZ!`Yx!QaF9+m63i@HhSG?4_;v z+lN1lB{Y3!)Kw^)JA1pbfOpm0UU%EWkVV@`V3}d#44HiuaQt&`?#BDrpGd3pyf~Ik z8x9Yw-8te2|0%1>Irq#Cs-pl0LH#t&rWr)&OYlF)T71n~ciRHOxsT`Fdfbs>KHS;u z-jPKD6l|;-gv+4~&r^{++%rQf=&l+>gvdnxzzmj89UCVRCe`ckzn0hjVCWV1HFnpF1)iNi6&tD$O9d@^W0|gcbM_XPQoQRCz4J-t8 zWtC(ErmoKhTc1DpFqo#q5vZ3_8}S{q4dJ96&&++=t}B9nhd-w*4i4UpbnYE%?B>~7 zo)ChSnXRdi;DCg+vA)22+reT8Q>O8ZEl;R)OuA0rz}PpvUA_S|H{q0IewO{rjfxMv z*cbMz?buImi}4I3&^y}7o{Fm22EPsO5bcmXii5n|o7?dK9pNCR`5vB`jky!moui|q zw->XqU;zfxk@_)vBN^^N_&DuQ=hUj$mw=neBL(zw zxy={m1 zp0~7heAf$kD{~3uADFVW`Fp)=3l>iY;TCz~*5*p5-?&Mhy!2;606zqN5icReN5S6J zr70QfjEZDN*qA^4j zIHR-b483ByRyDn=Vn%1x3~qQ;tDS007W+^uVt->#u<|@M_d+2S94azjRRodo(Fzik z1}|UiliHzsCt@A@d&caTI#AyPR1=zCHRXL@zVoF!#37r)uAiSf7h_IF3&I)f=DE9k2Cc2!S@VN#pMvwoL=(gmH1rgUBf#gEk0;iJDKzsm=T zdb=9W>s)e%?wd^-H_qu?GNW}p$eA6j5=ZVB&0E40BfmyB#<5;$HY~1SgTK4VXDs)} zS5BAPGnV`1*K7WsVE#^Fl7jfk{P;=_41e(p>B?0O;gH;ihJEf>xUb3E@V*UuEU9P~q5>pE0DCt9hhp4V*&g3;Z=G5{Z6JqP=XAQxma ze%=$%*0E2p0AIMPp~1Ki^$}qh%nYwXbU<#GzLw{X!4=D+m!F5gPO-U&7n%>0XCfCV zRcTVF5)^{)f-6Tst;nAuDb^bUdV&$sBlZ^D4gIeIfyxp*<6)INlyZcU=UwtVUp@Ru z9_A)KX7)4Z0x0LrUgUihd;Jjn$?8;)xfmY%=!)w^Oc4A~D~U6Fxn!o+|Vm7O6Wste#@(&x>gn1FrN- zegYa*ew0o{LuSJvmL)E3(9C317&cJD#(+ zlHql3ktZ1wFn{=(Jjs|)<;0K{S&|q{AgZoT%Xx7!C-zazuySHhz_|;~DD9j!xaeCY z5BUvGTK+@7A|5Q6qoN^CD0zrJEIcn|81rC^OWGoAx*Rx0knZ;zzm_a{0;A6ONfO)v zod02gL#UFAN3MX#O9AnU-{?*Qu`&(B^%jU%v<_y| zIy?d*KLx}dzfqkA;({~~XILQiXdTR^brc8)ZwiRrej_Ih#1JNK(uzWhcjO7Q*sXOi zo7OR1K+MJUMM@CG^KyO#&Xcrw{=T&-MId0)PXvrbD=n>v+pQvcv<_y|I$ETNwiFQ0 zV{c#@h{`k&b1e|hYaPs{b#w}d%_$(Z`;9ZwKseGs{OuW58x`HIbugRO(T%Hg^tWKW zrh2zkW(Fd&S|A4~UpUQw%zh z;YCSn)%<}pICoia`eCBdHi%f*K(V0xX2Y&Af?-V>oG+!pxx#{jZH6u_EV3a?*|1?3 zJGn(3$cDl+C?}>tnP5TL0~aQ36LV^tC?2#=HtZTBAO@c#J*-;&MxMZ!A|PInClL^v zL_ln!fFO{$_!WO+voBnCn0*0I@_6LHkTe7PyM-{sL~B|>UrQ_KYOA0gX$I!hHd0cs z8OF$pxoL1tO@otb!FgVqLBz!diVHTw7=bbTL~6xflP9acUB7xe=0OuER^T_My}Y59x6e`C(E1SsQHzc~i*+>H zM-PR4_jtm+o-1zqufo@!LM7rghvcfVT?ZdvN8yNaH@j6yOmb zbiOmw06UX_p}rn^jJ2VV*L?c~@IJkMzt(ZT0De#aAHbEQh;|r>yP?G0Fz#TH#Mgu7 zU0(-#h*Zo(0$Ss}C`k7~Eo6`B>u{pA?a6??au-27QzIzpp!>Oy0+=;z1E}OB;)8sz zku*^5@{q>(=q1bpMb9&GU*@eBZ!O^pHSa7*4L$DaT!CoxN`}RFvQj|=|NR%l&s4?w zI@kv-BAS(eF1Ak+naUQC>mhQ9O9X*djVC3IsZB*Y?j|7oi*~S^Dl)Q@sylX3-t~2` zJ0cPLA^$}?*a!KquVVodMLQPaM<%u%e%zs#*!w!JQJ)s$hyS7-UrpSxFDlTp`7YYQ zj>;Kv;cL$c|J@;d-kD?XU{ah2utO5!e1+#v7Hk3;+w7eke2Ih4Z0p>5+l55xaQ_(s z3nJl)+n$Yfu%q)|wBr`@uCIfg9GJ6zwD!bt?pqiaRfnf!$e76PjXtl| z-XvnO@+|%l2%7Rz?WMUxUYesqRXDzWbrkTZjk2$$Bv&w&NOBzelZ&)jtKT)t&VwA0 zOfKAvSN1vMm3@L$wkN#H19;O`BM_lloJW{v=*APs*YvPo?kU;K5mrXJJ{boQ12oyEMB|I-R-ck&=u^)n`qYWZ zJ|(%WK6R?urvw)I)RnhAYnil^omk?5hzv?z#IAn%&(dtT#dw5CPL4B`Ur^*&8$L!y zV+zcnaOYl)1_05pf0)n8unRQ}HLf$3WB*f1Y!TBwTX+a#FG+pW8#ob=BAb{RpdLYT zfP#ir89usx^}EKkF#lv!ThH;*u{ELQ(4gd9py|}aYh0lC{Ks6KNg`Z8M z`at+O;t5+J z;x3>qJW^ou=wuW21dnxUmv(ES-UVg2`Ts-^idEs~4%DKSN@B(J8_4m zXHQF#nt>Vx4wlr99#G;xpl9}z?ypG-aNcy%q+8Q+ebfv z#%%obRW+d=ar^ffe@PP1au^I91B}?`bcPI;{N)u#sA&#QV`blBQ5;y%P)B}z+V1+4_YypPKKzw*C?Z-}4>jlyT?5)xb zU`Kob&G^th;32as@{qMqSlCneQql0LIm^SvwgBV5xS#P{5k9hhjiWSn;)Ww}Oqtif zqa;Jl{lsR-vZ4=GWi1bvTwx3Tho#eTfdC75jd_JH6&`|b;Hob#52FKJ-3?f42rH}8 zb4u(B+94C3cw=Yg_K05t+c`IPpwoFu8E-SEe=)a}51swiT_r)X%r&;)&mr0RaCAg! zJ+MErF&9O@R`mN-dEH&k3!SYcrK{~_dMWmYJe+PRnUc^4vjoqRHxy!K#3P-8j zlPj5eJyP5I$Gnpl*Z^0>T1-H(DHvAdYq99rgu?Vq+i>^~L_=wQyr28hasJ)9OD<1* z!IrGjf_VSTU3M%g<2YX?csn32Jd!g~$6Z^co_IfevhWdDECLP<*o6*n8jL;Vh&pUZ z!DRj62o}V0=(>6A`5i=|c^U`o#iz#W8uZc^O(6O+<9oncA zhn|>IJG2c$c|tD~pM~&qJ;)Ugvc`J&N!*8foPOg1T_n5~=GRC^F6ym?AC&t?Cqb{c zi|-LFBzHsaSBLTKE`AF?$Ez)r6P2VKgmk%^z{9q*@WZ$!a%O6Gsb}WVo==VydfPu7)E2dG0;{nju-Mr%F;L61D)QnE!Js+2xF>$eAB8JD< zUCbCMkHhP}?HROY(VMHN3@@r}TKW#ciM^(lx%9iPN3wElWLB8z?Y-)dxYcyE*TW(v z^wJsPY^sNuv{XAXOF-NE5r5nnDrARglY@JVEZ3zm!isxj;#JumG+!eWK6u7G#Z;t{}cF_ zSUe+bt5_MmdwoJgXh3HdAF9rnV;RXu_;XNF@lx^c%72H{UNA=gQV zXy34k`H%&#+=%nnv~9v00Dcz#VzpTiCIq3w*}?4M(5QPe{cEu8hvx+5Z2(Q6Lra?T znI>=!t~r4-aGeBsPtP2TPNOqJ*cCa79lUVCiNA(vn6tI|1B~!kmQ@a$-TzDS-O>eP zp9k-Do!B*b?#qE0k#g>NbF}sjM9OftI;(S!=zx*3fw{ebZ1;}WAk(lOcn7cE0Mpea?k~K%NI&rRMAF`heZ)f)oN6f{3xfjT=+*n3h93fK}(__nn z77*_$)u$k+qpfXdU;cacbX+3-wNdKRSnn9U?6!l6u{B}0z`_7O;~zRrgYk7a3oB*k zX7AR7w~&%~;UQ%k^FZ>o&V>gweYnG)#Di0`XzI)<@+IsR$d3n4MC_N;_Xq%zk4>g# zheUVb4ojZNiIXv%?j80*-$+^b&-PVtR2jieoL{x)F)H53;rDUD$BC_ZOn`yqGRQ>X=e%d1C50ol?zT5sGlY#Ym5e;= zJ0P;f-ByUtv#{M3p|O03S!IO#GPGzgJL+RxFB`{$0S)Dm>gZ#d8&5LH+Y4UHkU!#6UE`)ptoJCRT^P9Ox3F{^P1W6V%3;@bU&648sA zjA;S;M|DPve8iUnrG7^vyxng!Q-}830_e)HWMb|7S9gd|4TpxzmjG-$q+V*lA=QAn zg2T7e+i}}4L0}&i`oD*Qpav^?w%?8FMSY{CARbE*-ekPyvGu)G37nbVN;W3PEhvpc z2p<1CggxzZo{s8*Kef;>2iq~^lD+-(S@0c9ug>oxYE&Q7Nixw%im<ENh>S}<=>pqL!35ffOqyP&I7J09^&4-)>Me#`*2L_@>p`W2Yt zhX~dxxT<}FZ>JXd*5>0B2}{;Y*bE6pg3e0?zx%(iRkD~*hZB8$PFFo>le@rN43MFF!smeAO7O--bhWnxPEk9 zR;&_v(bsk!U3)`PtFxhVFKr9j!({wgG->vDp}715qt(ub2(WAE2O=V@7G`^5dxQN+Zj_3)%qJ1(L^3M>^SFP{lX-8EPs~-H@F2QeH z7Suk%sO{FVZx#E}y6XSfIW@9I)S2Q2qXqy??1Lwa=`Ssl<6Tob>;H%fwaz=&-5yc( zW|S1}$T0pcqn8l#SNJ55Q5_;wXOt*}KzIF`RGs8)(Mc}q9>30+DRrh!!a6^VH3^gWW0A zD>{_G9y`#L#bsdMFS7d*f>i_if#kq$>|&k0!dPia9|!gy$wv(A1LnZ~Z8LRfpEa<< zz52ZlAzS)L_=y&YF9Bq+>*eJ2V^C`#>jjTzWEo?Z(5e~cbu3aXk-N&2OX z>qmRp?*FrK{b;+{Z_}0EPaW4^MqS4?<2MC|{}Z8Nj)jF(iD;~meewF7 zxv&GlE~{Ugs|*3)4Vo$Df@o$`aCzf0J}Yl%&r=Kn`^|}@>^tQ0L%|&=G3uNvpAk!{ zdi1vYtrdD116ejo=J&$4RoR}cSn0n2_uou0oan*Png6bT)0HwZFPw}4Z&a_vw(8*P zus)o=Zf7_&3Vjan(6xXLVh)bh8ciSuv@q#)fpyw0Q`zr^Ln#D}m~8@e&?UfGsA8S* zMi2IGjWOCRo`}W&OA*2XNnD7rE=gQzqDzwGAcmD7IKMmu#mZ@V(lckqqn?;MJx1vJOV7S(Y4dJJ+``tFR zQmb^JR5;u0x}-*`^%rBOd#3Kx0Rp=o>stOf*e|ES<~cK6JOc?Kb#`Iz2&#@bdnUA@ z0**o0XO{`Y^0@BQ`pG0{T%Y6w;p3R%Q(@{_2yK>Q&aes((X@HF=s9rC5WhtC4(I89 z14~kn;uxKS(?D!~tIu0ri{%e^B;0I$3pn6v)|GpDXLY=?wd8bLaJ#hiNW{6t2|B^w zHOwYIsG9tCvrv=|3qe|&-5M{97X?Q`Y}jO3&S{tfS!D(DTSIZg^oe+;@faUCA$vLz zS!X2XCYf2!(=dte@ zW0e|OUf7@nh$Hdl5%Wz2V$_>@@m9PVF9g1M6h~jh6y>Fo=wE6*0@~Ds!q;F^8$*LK zwR07wl`moy(HgGvMH3wLLz5YL0sX-@+J{~Yf@(*wRj03V3hu=_vl8B!kxJ@{c@V!m zlKCK_N|(Z><~RNVOtoH|dSt$l5d_;=FRnE<0jNa~#ly+-o=FR_O#FiRD_wm~hqW9i zbrRaKnkEVrM4L>W#90QQ<>_v6Iin z`ArM)HDRkB^UZ5;3CXk%iXEFKlBTU6V;R|5N2~bh$ldg$dTucCq`E0<^U^2a+K~lK ztnDxuq;>riTX0@q)fDKsqwzI79}xcC;6g0wBPQV@Pt>^)Pw~=A<4C>wFF5<3)O;ieO)NL3jJxEm!GT2=(o}4<}g{^#{vv2aTYs z*4|lv_!7T8I6ble(X(^Qu}ESIoS+>lEAL`-F4rX)frIFWoI(W_RH*#LzLCI-`VTNO z!^%@jIRVG!kk6g>VWTVf9+7B}_Y?-4apQe?Syu+0voEm+4ssSoyA;nlBDmJM*9Ks% zx41yHLCSc*)+m?blhN-^Xn)P!c9b2d+SPg+Nag7(6H@VX$XX)+-UD+==%F>}hef_o z_qSd}a^luF3UkBWPXwM*pR<*$U7c5>e4c-a=+)L#0!x(W!FiBG7y6s_z_NwCtI{DM z@J?%wugk7LOu1MVU|xZMClCik)uZd~k2Pb?J{()Fie0}rwY-e6#l->e_{H6pDDD?1 zE>ntgrj+&IF)?_AkAmF4u8pAOQGw)k7FlPizmm6K3aWB_Z7Hueh&jM_D&=)HD-Qf1|ERXQ2J*HhNCWDey8uRVOf_WKl2K8~@A@Q|1>E(0@{N{`Ywt_nlfArt19D&~ro`Nj2 ztAkp9wbISmYJ3x1Cv5N1%bYkC5vr*6CQFHj#x6wNhS}8!cz8>X`{^Fc0V2++4s2ic z?Jq6%9SqHd4G(b!Fw4NsE-(G4<*bGSP}@fwzG1)7gkULp{ji3okv{Ciw}(asTfyEG zbiVx#ShKL-tp$w^%^hl2pjk~=&Y~;{(%*0@0N_*VJjQ>!ywZZhdi8z>%pTRySAfPu z6x!#U?JX6hi3ji=@LPBcJj1bI#Lfg5VSy+1x~m@`HiWXhZ*Jf>zw?H?_| zw><}P4gNb4ijSTPd~L+CdB4tql?pcK9kZF_k4VCPd;E6A9(&cS+kg*ijOi?F$TnG@ z8LwS463x2K$`N=|La&Jql4w@~Hhu(NGn>^et-9}@Y}GfURk7)(Ut0B&aOjP3T6JHd zRloi8v8}ohtxBBGuKlWAAO7a2wCfiEVobZPy)D_U{Z_jIkz?BxQ$v%#T*Tzqc3n>f zvf9*cHEFRblOtCT+6z22Za|T4E2@3_D*dcdCo(5&Cvx@#V*5|#T zb3$Gv>~OB|TufSF7r_)BoE$E>(-!=I%~3y;P%lpgg<*k+`VJ5!lD~SWsQQ3Al1F(o zE-@hVN|AQQLVM2AsBeHHIhRFni?^^t57_rguSo^bx`A0;Oprktj@R^na8ktWVK@T#$iWj6vvnp_JE@lpXb8^N#rQ(^~oOR zB?91c$k}{Te(5+U1d`v`106a$prgmTE)(0#hRE(Y8L(Fu{B#S z{n)D8d%)GIThrLOtwr`Rb$dKGrf#oc_BOU|f`HYDD~LmS<>J2m$@*3AFJ6%A-du{l zC-P+k6u$ykNgEqDw-+NEk*FVjmTZdRGPJ!lIH&OOW03PGp;vs)ea2p31-&INTymc+7{hqR6@dohzQFi? zAas!~2(Qn#1saeJ9;U{06f6OGlFn&!;c11@(aUy=Kk+;qsptcgJVtJfSFeJbD`)`w zvhWo|F!mzUqpKdPql#NL$}C8hxeeB}|3R7JrG+y8AS6{~zK14CEfY(vn1F~Ia-&D{ z=W7cJv}?RLe70&?Kn^jjxH))Jz-B#Nx%3;$YbMFW*WF_(N9V=?G=lfKw1_pbS0=@F{k;U4W&CsBbexnK*$! zm~EB}q0P1sJZ{n)K_F!|<6tU`^(95V&FjCQlr8kuQ^QD3zXxbtn`>AS_Q5=+7%mg9 z7$6si=1QbM$em1NQFG-xSE@vz%~Cpj27K7hws{;U6mcDp#n8p8lAVx7KZ)O8XJn&5 z%h>y_HV$`k|C;k}mu4ca*p#1aaEUz+@xIdmLA7%StfMXCT7-5w@ER`UC` z{LYgSJcfhceVt7=@)Zw7@fgDmeAU);a}vrQHd&Wf#UGI*kX+Du;nkaCLfZ-+l|BeC?zg7ZWIoJT=^PqXt4BR zuzfFDrMSOJxF2-_3Ti>}s(KSNCOQ}|(XW)lEb|Q*wd3?F`fk!}x1~OkMIU!0n`BxeZO|a^}$wv1GBk?PK8G*S;R`7Dry-kG_Qk zMONA)Oc3I$z|D&tKG{ij;Ba#?I}`0l$0q71*##XibM)m z_1Ynz{Kl<-oWK94!9=mv~ZO>flSZ+xJ(<6}UlP3eTwI=&Q zH=rHUel-Xvj3Y6(aGg-wayPCo7Uqmmif)TX=1j%XYEge^4l1yyi76ag2(Q+7;-{oH z@1X<9a-&RLUm(E2p8Lq`68Au{aXh!ugK2C4jHBs`y`t zrer!m&8q?a?P~?N3!Tp0=Ej5|+TMycs15Gg5_g@6yUn;OmCBM+wDwzY6_EmAkWqN3 z{ZQy6{RO@ptBwjZjHvU9`qp2fODT|56mlF+8}u#AgyD1+swDIx9z5Mcdy1tGK7vBQ z^NE~_jzu>rI(`(ELY05a?%$ZE-ne4v1nn*@bL#=}2JkrqS)-1Zsm zDUu_#R@muC%wnEsdy+mD%_3Wdg!(IxLVGhc8@!$LEzF>pu~-Nb`T|>6Z)bA9V+#wd zHN3z>mwU1#vnZD2-Qdp^Jxm!O&EhxCWt}V;aECOL;BWCHbAl(I`Ed%36NA=&-(d12 zvpAk2NLA@VD)W#53ImY=yiLJaeRD{w!u|vB>W#&fDml4QwO=YDayalBTbE1We&dtB zp;+$T3ST-GBa1DN{XhwRwLF~iauVNYC-Iq}EY>CuBaZBqgn;Dz3Duz44G zXaVjL&C*SizK|3H)!^XM|3RsbX<{ z2lbPOqUvhap4b=2?J?L82)jJ_`xBR}{z_~8i#tmOKuJ4X_4cEZ$(=XYTd0NhQFzwx zFM87*F2~tD2rJ&{ds7eX8@qeub7@)C&Y3YATqgd?3*7O2$D$5#LJoIV8i_ z1B#pefO0uUG z*%al#hVz9D{l=bO(#AUqUbP|8isswR9?SNhXn|K|0O4V2|2>0;p+8BQO$n65RFIlx zB4&g@=>LR2c9TE$B-ms3;4~Db_%WS7j!Ae964F27|CT?FDfR+|-#^J8*CTZblPhS0 zCJY{?jQw+OP7-d)akpQbnz|Wl#^}aeKcjAlZBy+!S{CWg4BiScc4qJ^5D?lY2-%#r zy%2MZMd zJ9o579h6W#Cz+Ar)av+PO9(PR%^R#iZq;t?b|3DgZyy~~iT`QecDH|szLvm23Atlr z`rvPoi1=r?+j}Lw*)KQVWA;OL`_J$m_4=H(+Tr+R{pK%CO}3J?Gy0=FQ{} zfzsXWugmAd6-sR%Ssd?`bPct=dk$5WAyfekqJ({;r zJS~IKqIg=ac}Iw+GR-?kJgv~Y*?6)>SAj4iL=6ta50KaX8*1%qYDoGBt005LR;q`b zntzeFMl@sNw-t%%xEwmeQ;M))gfjqFp0V!Y>>;DA&IXF#AR3{%8*skS;6Quaa5p?K zF6A27tE|1GZ2>GSF7Ph?ialk+#obe4c;8-s$)P7EBz$MJq8oz%tVuAar+wuT{1)m& z`6n~wpJI&fXfW3Mitd~Ugzs^zmGkx#uC{OJl(uCG|L&arZZV`KTs zRb`H{)yv^HqinUKY}NWQ$35%HO7C-&l`boHlxBhR%j(Z+( ztQ1*MLFop^`m$9k#BJ8?>?gxf zegvSI8<=(-eaHb{R^tp1#Z|?q5IOU3dg-ky7by15L!lh{;ND*5ZY6dBvDG;+x&K4b z6t|{9836@u|AO6;p6}-C;{6h97bM*eqk{gUw^P=t)U-+tj7}W(3BPYKM27|+>3=as z;9W%YeE~W^>^4V_1~vw2C}aM6n&%ZT-N1(`4!JI3)ZXY17U3&(r&4yOlDjkA-kktv znu{TePKmhaRH#}Os^&tOujZg9l^lmY+&|#ss*C%N-XXf5CAtsmMx&>j!{VmnA&RYL zI}HGk$%&hUG#RiO0|Ku;fuu^eE8x&?g>u}pj|Xm~xZlR9u{)n3yfs6<-ip_8b-@Im zXQrsNvDN7fi20b~MvZm|Vte>}LFkRg6qnY$mB9;>&*J``*MxWg);c0EhfpA1GsCwu^_w;*)#QAOGZa$4SjhFA{U(j`U@kvGY`kBiXDu?Ev)h2ska{BOoV zM1L^{9HZCVE_erbboe>*69s2hfcA}O?m6>=|8)4(W~^0?&#h6I(PJH{eE|JlwR(Rj?kC6qa*dZ-O)V#%kJoC{SJ3@ zvVOZex<$X)9o?)u-BFi5%^h8&7r3J(`t|PUBz=NATA+_{M+@N_Av#6Rbw|hOSGuF) zK4AWI04lL(Ln1js@H ziL_E&r|c-8`qS+)z{Rn~HWwxd}_OYQ#9PV9;B9 zN;Yv*6SxsHs{JQwe~CT*RpJ@XJm>iQd-~P>`r2R7D~w#e>Wf!R^oj@*=Q1)|`2bne z*A0C_mJi}8LKfa&WEOn?n7$Kt$W>_GJ$S_HPZM50DPFh4HK=)g;`JZna_j3*!58tb zmf+PHdPR}3#h7lzt8RnviYTRcm5)~$^eQ$?8o3t#ibj4(TtV6~2)x|{@CLNaKagHo z!&LckN*n>0iUQ7^MWI>$$_N8Jnyf9wzC5)3HPphqK#&j%Rt)_G1r&Qf_M0BFO!Amf zO?yeNTHY-hC`~vPBn+P$`Y+6|zCjRzxK279wdgiKN{~B(0E08fb8dehrbdJR)f$h@=fAk~WA)+5jSH*+kMb zB57)+Z8Zkj2V0Ry<+ECOQwT6;m(S1Ij@u-kujl~?9`SQFa)7}yTLd?6G5(Zn2LL)?$sA;v9dltKufq{TA_@dym{ZTKg`b#&IVU2VmH{3lEa>Fppc17Rv>qu_s zzx({;1|>&a4Ecfkd8;rXfVB*i+fqB0pll#BZJ|tyDH8onHeXOMCLYX+YdF5$Tm*{a zY-(_lCo*Mh$Qk%3GI zefMFIFMsjDg2yCt_!w_D*I7jaa}L6w-r8;s7O<-->`M=F#+crl{6ZeIcfJD+_Fv2{GVz5a7Uxr}r=QM|VTY6U3Uk6+V&5vobaGmL{J=BCJXtEK$_PNpN zr3dl<-7)E`T;u$Mj0Y1r;dJKFY%io3cufC_6;Nyw!!S`IFH_9`)*ueCkcZib1^F!OJ6t%Fm z+rwOhT*!m-NbCDBPLD$xB6(#pFoXJoYKe?uqRkJO$3vN+R+)iSa}GmOT$vWjjZ6-6 z4}L+jR978l7;n+fbcR7D-L+-?u35!(s(eXi9k)fh+hO<(@TBW1(k zVGP%C3|Ce&A0B0gYbwWjS8bfcI8Y|nxFxuxHDS^r542e`30cyF@;zPY7vbD&G3mFh z!O%TIblWy{-RZQ68QU!Lx%m0$(czfJ@tB6ijVXucuOq$}9NMJmQp@z5V0QrLy#M%74ac$0nZ!xchy5p(*fDnX}L!0St@ ziVvfHgutlGPMhX;z8n6k8dGr-MobaDxxINIuPRFZc2#3(;a;&sa&RF#v=gBBM{iG< z%JwLvU28mxh}q8TV4oQ*dyaPs=wg(v#db~_r(>$baxc#qg}tIr`K`29wET0Yd&Nb! zPsjcM`!JBl( zYOU8FShaHXy<<17)XP_{9=mp3+1hn$mX)nv4_%mHtX%FGH)<6A4{?keHxB=Yh&_3G z%MoB+;&E=4zh)J-@4&QFzYk~2yxWTn%2EE)@#&>laIDG#f@(FsdnrdW1DdG!8(7hh zgDM-C@4y4(iABiZ@Egsz!ISi7xWn+fLiKRh<1fJ#g_D%UGICE?+JogmGSLlq*%88S zQD8c@!+ChgWhO6U%+RX zHTV>s&F|s|eS&ShCz4_0xZ&JK^TH|&l|XOW9H?RyX@+?dUJ>nzq#H~_txxIZNXi{a zHD&}#BK5wz2%9|7ZQF)0y&j5N#e!6(dq@WL2yGPQf(*);H6P)X`3`N{4(F3g8IPKB5 zsJdtd_D#Cc9}3=_AGFWOpS zTyQ^nI?qUmz<>l0NjJI?Y6HxbxWdHlr_LWLG24m`$$({B!Kb%y4*RzP6FYJNjm;O* z1wDwSbb?>sMyCJ6um8g@f#;pBxkUWB1$s}~Z=%VxXK2RdOujNT?^XDKrKuB$pskhnt4ty)_lFNA%S{%BDt{qiwwt2gb3dDMpj(o0|BO+19L(M{{Zp~YIh)+ zJR@~N?f$#gwdRdrPic?dS=;*|Wawmje;S|F_WmfI%_k`TX{f{p114bSaxr8gY}1qM zV-DV>_=q%7ddmgLf`6;D>_Y$vxF+`0PYGhYr~U_?ut#H$beO-Sw^5v_G!SkPp22I2 z=QQjNDX-DQc;_MDw!yo{Q1txp&YJBX!XCGi*(P&lHQQV8Y;MI5_>t4YHD3;Q{^aog zoA2V5MB4IuXmOafz}qw~&kD{clW0Xc(TZ`Jk679Z+PMC%*3I`pb6F+;b=}SM_YBqn zKzJG;da2E5LkR%rpHc2gaCYzTKW=AtM-&AA+%MJ=f7FO{3#MG*fjaq?T7eS4R zo8ysOs*Ed05Wp^&4}=Eb{N%6y34YX^Pv{8!mLT711GAu+0F1vU91LF#dIt;k>jZlM z@egYlto%q}h^(Yk+y#d0mne35Tqj_My9Nhnu=+rB-RLxyj&ij}Vf(Fl2LkGL(oq3I zVXp=96~0521Pl28)iRXkZ3e~bl&{#044v&X_-ySocsAYm3C?KrM0#$(4T7=8?X>S5 zp!CL@-1}IgM6PmdDg;M(3(<|F6x}}KZbgK1TcpFPn@>_VTezEK%q6-> zX@_3Q{iC-Rv47*xKdO@Z*D3IUY>qJWNuA6O*6Lrf82`VfndVL`E%G&}@D}ElJj3&LBfG68S@$lU_o(qRmG{kiJq(@58z zTd2q8f8v*T_i@Hl(owRe zz9=;2Q>BNb+tZdpwoMhisR|-Ppq;!G<{E6{-C>)2KKd2WW@NY_%#ftIw@vLJdk*s^ zWQKlrsNk7B`^Yi@+h;|>F4?9q*{6WkhT#qSlYA%KUY$jW3*9vTzh0*RO1oO$Ul92B z(>>l(RbW%d;0dOyN%yJqMq&NY(xNISB`iJ$HIp7E!)dl*s$K&0)-WwC-SAluE%_9w5p|+II89Wzw-$E zv*F5}ABzc&{v(>_ZqTHv;>OD2hTx{8gf?O{hpG@~zX@6FXO^*ebB%$LL$E49L+y70 z8#1kh2EN1E$ah#9*blH9-g9Be={l68L%(z=#keBBBJH zTnzB&SAL!C0xCk4@SMPO44)9L4xGE+*&-+NC8*9Ca`c{6&W6-43guxHdH}z_5rXcH ze**1lrxm-k8lzQDoV_4WNUSl-^kD5;hrVo;jKyf((RT73ZQ3u(Hv!+uQ;P5t!OmZi zQofwb5AH{#Nj}+=8G2Y529$5147Vaf?7leqSdLAN;+7)fB;D@5*#7g_eyx2Qgu7!l z2=l=&oIHOsgrbnEjI3kW7yVdEqZymWX`&oDY&b z94I+i@4Js!M#%IVg>68OW$m8lQ!WVhoLTb?KrO*t)=54nQ70$)yUxh<9+|IB^51%v zUg0DkMgb6m;Iops+3(;PFd5e!v&w-md@_ zsgQ9zRf^YffJ!p+Rhy}rFU(9ZfO{350UxZbs|ZZ$C|+_mnA3}RHgn#%^(15$iCb~! z@74*$tq=-2L9b!>tkA1Jp3Q-jpR~QxQ8UJzE5|I)qga#nKRjkHy4dNM@1QYsyrjn9 zvl?>_o=pM*->be24-!Y%+TiLq{OA^^4Qs(VbeIEB0=NYn`Qm>qj=+U#yYNy+i5JXo z!`jNc0+r(kSMyzh2jI)_|84j}=K(M>gZl0w+oymvwF^=(O0nslTL1>&U{=6rp-`l6 z5-}+`>51kUV{w?07ccuK=&f6j*6HaLg)MGVnu_M&X+QP{Bk}p$elrmbcW`$_^HN{ zBe8mvz8+_L`f3;h=qo*uJbk$*GFo5aiHy+i!hwNa?1@a)i#(Cd`YoP_OP}e9Y}Ie{ zL>B3Vo=Ay)gC|m;U*m}s>Uo~X6kNQIjM0aBB4hPIp2*z@kQ})RjyNKd5R)&0OCX-e zG&+TtN(M!UGMpe3C(I?OVwhVyiRjMO1|UKfShiS_GG1I;tn=It{(88sq*fpMlj;cX z;h+lh&r&P%(K+m!6{0CcDM75?q^(O6j>6hAat`oy41d$eMt9-(JR@&L{yPvSMI7&} zM7l0)HQj~R=8@}`)}$(@@G)!24Axzg{{9l!mSiMR1eHj@G8I;`ErppK48L<%w9YwU zWgtNZPCp0Y`UrVTQ^ww0xIBAtdMWz`I>G`G^4)=apgAGw!nVDDs{)W7YUf@`TtjZxhsq(7 zhG!h7Q`5e00K@&C3!w10$krZ%pN?xb)DjKMNtXPl8nTQpZT}5P{8!OWe*KmkU=Dxk zV3vN3ls5v8lSQh44mr<(;VL5UEeuRYC0qv8k49bx;tCy8I zmaQsXzn(o9Fg|V(f|S4HI3vRG1}EJ}WnMwu=pqq`Q35@~>XR-A&{4W~${LTx?PZNZ zAevK9 za$NJIfK*n^*;Kdt6ULw0Id$6QCEx$P<=614%VOW4C}5*PrjyJ9nWqs8mlZ2>lSwYSFUv;j|#M zVu9L#aL464e7WX3?89jnd^qiL=(8@QSzH)MtGsDk^Nd-Z)=RVpIp%b6bA9S%@LgMb z|J|@PrVYVgFRzdKkf>ds@LFG2`vAQn-MY-FFR9%@uV~*>uWqgN(JR`R)vNs4s>EDZ z*9PeoF`Oz_-`bjlf~3wl;&s80U(YQIHashiwM{uXpL;}+@D^nsWL^YA+=OfOf9A650_u$4M$85G*h_kc?PhTHut#h zLkdHsoO(BaM(4o1npYnwr=Dl!)bsJmDXf;K10~PU64>!yEH}b9MOG@<%$($s~qCbeH)3dVcO81&guzJ`0^jzgP%L+LT7bZ`J<$g zdKHl>rOxUZK(qX1D?|VC7b(LN$YAY1cE2q`XQi%Nw)uN8?q9B7x6HBOp7oBk59sBN ziqZ|G>m3#Am#uTGEnn-{bpI+b)-ilxC9B@q>=^CJ02RW`@D+5v4xLs8h5Sk@ctR4i zCt?H*@dPY7rHD(~XwHZw180*@&l4BJn=7-s2Nzfu!{39Ga&;;ENzj$@oy)LsmNd@~ z9YX=JoYN*8VCT8et3}GI@qK>iHS1%qz08GH0c-jDqx}6_*7qKJX-$Rir?TJVZ(G$j zzW-JJ6u(@lUh3(4L6scgLgKGc<{AEcv-P>hURoew1h$WqKgZw3;u|a*x(X9!-}Ak0UqvnbntZdj#VYY;5Oqf2k;R(_9H#+&`<# zPV)bJy1I8?+(fR5<)!>{*_i(dh zW4Zw1HFzJK{u*59ZA@dZhjXff)0-$qnt)ms(pBVQ?=gz{gOF&-$0q8+4JA?ChQYED z&EM$xa}t>F1L@%bTsPO1Azt_J9MHnaEV@CqYH6@UBd{L+u?j$nq!M7S9(}nVqFO4u?I#yqt ze+(PyeqJB#H5ZpXPtQ9?cGWxZyhDxTJxTS>4^zGG>%H)|oB1vD(0_{7D;O7WVk2Ge zN(@6Z9w3%jyTF8jlM;5>SkGct9t6(}FkD*{YJtyNa^`@`Wo_^ZjGg7p;VCQz!YGO< z71F*gRdzbI{0~#WNTwQ@II;136@e4^6_J0Y#&FyDAzapE&^_u~aj#v*y&1A-+454o zbddwJY2{j7o*U4dB7#;)T0u$1#zoawZSB&b>_j>Q#;Q2ma%@ysNG=z_FdQffWny@h zH;rwciK#|Rr;Lr=JZG=m@I6o;3Wti$=pzB5mTCo}>yafXJRbS+9oo^X zd7-1$#{u*aZ4^=)r1w-C@P}^K2gv}cGt09{0QCd7+lAmI2M=GQAD}YCz@>P&1X_O+ z<^jRM_mZiBg0pR{Ah?|K!?C_9J^JqTNBT}3Ly4a zLTn&)cl0DLyoGTYQUKYF^`%NE*|0u+vY58x$ z1<9YU-0+e_T0~S1EqX*v2q7r0*q;e}hXfU5L2MP=_x-RabOY|0Vfr%QOLT?}S=W`_ zFZNBsPZYjY01@O42paEn3wjao&2o+ilwx`;Xd)@_6ad9Sdhiwn(3_C?FR0F4n5BRV z{QU4s=68Vv@V_wHl_s|Ldl~=4nN^q96*AiQ_X9U~X@3tI%?k+PW>7&KSpMP7wapcA ztS3#wY>Cp}N}P!w{8`Qf!;dBd$UR%{xpx-E74G3bwRg4+%Y~Q+Y0ySTh?)6|Kq_YF zlP{@lqQ?259iVqYrlEVt7Y0m5+J3>?1k%1u9FoM@=RpxxfX}Vnz6#)qvG7pd`loy)VesEfu4x`hcdB^+$Uj)x2IK>Q{2vHE-i-Vf$eGEN zRKI^w=xejd8MugB7NaYe#SIq;)|=3PU;lB>dZP2-4PJssVbSn0>)7_xKJe@{&=eyGdmmWs) zkCQ47DITnf?$*2M?u#3DU-()*_f5XXoqIRkxp&*|+{^a-)E;Wws%n(3AYpw{u0wK& zGd-dC$JsR4XkvQ}9NK1KAp~&oeGCMx!0c3ikPKJ?MQQ$;Vf-e;AIzbLY4A@q5DyGk z<@Rx#bo*HE8;?&w0vHs3Mh^ZPgrK!B^a)!i(0$+ha2oKy|3RxW13@8Rb$60zu2Oyk z?`|c9i_ldRg?_-ra$t$^Hn}ar{+Zb1>m*y)Yam4rX@Gp$+)KEd+zL-YHf>0dK9ICK z2DwNr=--t^S)ZlflsBWvl}*EvDt!*5ei^O&clXChl{F{Ok6%XpyC~R$=UMvI-i)UD zcZKk@{aN}Y9XrOdFtp+%#_bd1jX4RbaFicgli&o?_iL)nJ}5`|ab!Z*u46k8axZ`m z+G`;H_3_Gjsrm0_Ir`K8Qe&zS?T6p>$h^oLRzWPw;7c4PQaDjH?AoTC8iOk3Nbn zdfrTit5R80r~W`Glf8LWD4sP@{y^Q-eE)!tbH%kyUvSZ4PJd;uF_?zQK3L%k>;S&D z_2F=ZoMSN-KhJw8PJ@E8ydY}YgSXR%)=_Z& z%nzeA?__=$qj|5xgXraE_(J6Fx-{P)yfypcr`pqs%ln#@X_9fZd*9P&nw%x^Lnh>g zeQtVV^lD}NXOD-XDwr9N*94U_Q|8pX`>eMx*&uuAz%E)k?oXp{{yGIw)*dDc(EzW7 znbrPRHsKrLb-WkTYwcLrnHN*(+hP#m9GqUd3EfBfxKhx=AUz;lRbfwD-KdL%yA|db z-EW!cdw<)5zW2BG^EbU2Ng2r_J5|>M(-h>MGN{;hEQ7)EviK z&pw)3(j&q_ER%|Su8@4h@|Sje#MTg*C4__iE=E!U+`2!=wZhU(Qfb6G?jNWmF0!hI z2(Rbkq&GiK?!|~yVXXikhjgiuLRxoP@82sD%rKn(udq*lc?18j3-Q)sT5PMhz{Z>x5Vod`zgodCn0u4dgthu&P?i0kM#%&ls0^Z6U$Vj+vsLlZ}i(4X-l>2%%7r zNb}s#?mtQtvR7nd-L*LMlX!&FVy>qx8Zhp}CV{|WJ0I{&LvI7)1$L(zxdKC`8UvVYJcI!PG>}RdhkSPsrZ7i?i(8MOTyR#S zCo)@mXe>Tp8!2}|oxj1MXxq-M>80oU|9s0*{;ssqm3&>v(@|SpElc_6zW_8=-|f6E zpT=Y(WYBaZJgr&A4Py5%5>!Aqn^IKGqN{?azVitYRpu2y%UW;N@88zf)0(Y$`_W{z z!Y#Hrf}fUZ-bV=4TOZK8KgWYfcjIwR1&T=M0JnuWgk))WuDw}4N{h7_nhzoll5L(w z6`1S9@+3reT7D78IF)}*m5<2wgDg|aZjcDxX*F-Oa5do#f>$gG)R3@_xRA7L1i;i% z!irZ8x_rwb`cvyt9g(DaFtPam92w!kHMaNFrrp1;qAmuD*fy{%zVr*G!-#xi11-i|j}* z9r{vw=@?&nY0g99nbK*2^wQ<{@2yNP&G4p|zKH+yzPC_^_?s4%Rj|L~hydUsq%3A{Q(aMX& zLCV_?Ytzd665c4DJhuAdfEx>uF#(D#5(k+P*@Tkt?@v2=fi%FibV4=(!Co2^Nfbc% zseBX%Ro3?No?jIDY=Sx&@D1WmvECp^l%-_?Q^XF_%|DMJxbo4FRmb;K9me&dow0hJ zc*xU-iH9Zn72;tMX&k8YLr8f-4}4DSeP8o^2UUw#;|$2*1js_fcDCLw(!86I0BZz# zP72z20>5sVj{*7L6e=DYIbZWJ_CAiSdb+oPYoN@?12@F(DU_2W=BQaQIIM!g5Xs>Z zk0qr8DG4B6B6vI!vgU@4gd~p_PN}wL$-R#xb=+Bg14p6eoA{CQ1?l=BZjKh$6l1IB zbh07b4JdUkApRs(j2%@p8qUWa9Gen}Ahcfid+bX^uY{sGt-RS)u`aHXXWQzbdF^Om z!RchpI|>iAeb6b-={|5pLMbxP@|?aDp3Eq9DN<%Co~q;L{H1Z~%hKiw(YA2DQ;g|>*qxoMr-BC1k zxWR|d3UKX8g|$F^rdbD3P_{W)w3%2=fRmX_7Qp(-l2s^a!Ec;#pV(uj823=eQOVax zSr%aBs>Ke^W%Yx7WC@GIF2xD0{uFCz5c7GdZJbld*Na%Mcb#9GnQ;rU-8QMQ=Z3dg zTMNcqjJ4&x4K>@L(Bb@&QiJCAN)%A@i@Q_3sk|h5*Gq~gR$vifcn1rxw8^#r?afzo z58oy58~1Epy4qg1P`Zd6nd6fx^oXrT!un9R4(sj_w;%-#!-#G{Gx2om^r(vgTi+kA zQgkcVNEbmvKD1s9M;wtJL^qG%70XcZu;Sykdf!G6DZrh=;Us7*&TUkTWBoMP1*ySk zzJEe{fKh^uq=Slh<&cgIxA^~#$*3$)p z7Ebe@51oqf2`Y1X_mD zow0JzT)$w!Xb2cgPPj1|@b6zk;v&i?nblZ*!px{DH3gc*uFWkNEAI6_4Y9!~&$w1h zQl2qN$Wl`TpV;ASjqXm>0M+JSrBIKI2N#5TT`kj^54YSTr;9Lbzh_Vox*`en3 zA3b!kX3Ujf3+sIw03Dh}ZT~I;)clZdsG3bO5SbsEJWLT1DMVT0$}iatp^Q0PO>GY;{?_+hF(SUe0t5PE(yR$(Y&NRGZz zASU>ewmAR$#(11J*Ychq8^E#gKpHZM=|F{#kTAW;)_iBGR&bR5Q+$)?|4nHkDYd#4 zqeK2!D>yuamf7ryW~_Z~u`y2IL$2m6KoAL$7_NE8T8YJ)ZyB{dP{f!J{mV62S&Ie# zglbaQV^oYc$x#IGL!E`k>>{u&Br}yHEJor_JVAu)Q#9{$NSMFIPrH44s=uvoU$+wI zTf-G7=f)eW+;F2n5~IYvO$dGUC;?rHL$qdXgeJ$_jJgy{zDNu-kK#FSe~mAx1v9Ok z1!FN+*10h+9orc(EuG8J0Q$*9NNR{yf$7F4a#ecfatmEp@!uiKaxK6_)g9&nF>Okw8l>> ztk7dWkKb4Xjhn^b2X*d8OOW7d=cTset*3RS=G#OMo$*pPrVuY>pgi)$c&U6`OcygL zc&R_Aw9zgvMdiUuaW$GRg&U3MrRXg4TqlY<-xd;Pj;D2&=GzBlsu)?Wky%TN#C#sF zELukV5Fw%YDBhCZV1CFmK=oSiF9oXCa42on_V>%b+y_IA4z|)+p>c=W+e!tR<(T79 z)Z$HtcDP~kIg0sP%!=A?B!3US=C{yNc39AEp*4q5JIj0n1!S9c{^(g*Pe37%b-#P%8N7vE-}Q|BSOKg)$4=~(Vc+N?+`VD1ouGMcOE=}xr zDf(^B05KIj--6I1*$TCU4rA7(GOe+RkywX+mwWD=671)_=az+X>)P3KNp~>a(tK(3(Aj?b2PhTmeL4^h`C|L+&n{83DE8a!Fhpm9(f)o*<+0y#HSpvD zMwr-Vp}SDFKdiza+n;l7yZb=-YZvkI$`R-?)X1o%RcPj;W`)POO4pEUTqD<&G19I~ zsBLFW)tMQv4F#^&-c9wHnX&qYtNMnk`i3XeN4TD_M(fNsJ{R>Zq58hb_3_^S5KOQH zi4}YQR0UDZw;s8yb?|qpyI7MU5VIW-zbtg^fp+$OI&RBHDK-E0J$Q($O`X&vh_)sf z$f|OX6Q9CdNxDpW722eRD}fQ8-|5vwfiX=8j9Vt1Ls-O}9pS^G&uckoy0V5^G*_XS zYMhpcBbKUxy()L{`#b2pzz^&cGm)Yd-0si>f0Jj)GUp!K7wH%q-}w<5w<_*SCEu*^ z*Ue~qn#E&NjkmMgU~J;xsn1>>8}ln>HJYhLpGUJ(qN;&?<=8gSdoecbCKX79?}(-E zLR#pg@No_&_R!pDzG;+ml(laIE@Q2{NDQ&^B9Vsk8qJRouj5DSS zJRAkvYQDSW=OeJ%Ex;FZI%?&y6Ml>{F0*ShYF(5ghsGeP8mhM_0UhggRsuTK;Z_1V*2}HLX3d*vC0qz_Yb9V<^tm;%63zP?D=|s){+pF3(7Z>i z1T2&2j90)3+QFBs1g>K}Yb9XS@`RO`s(AxeVuM-mh4Rt(tc^5~d$Nf+w;L z1O_TlYreJkYG2hAU$r!Rggw%Jh$m=DulNZ%rP7-3DyvmY(C@(Gi2-4PKC%*+pm(hV zCaA$mV1iz=5}2SLSP4wf(^di#^bIS433|{Rss{W#7ba-=2;0$kkd+F zf+kuCOb{J}i6LNu23ZMAP#-IS34(`enGF;41rA?C8BEY;Rss`5q4~rYOi-hhzy#GH zVTSMnesId=4 zRo#nqUBG*oA>v1MENKb>c`FJ7pUf?2NVbn%YPD=OQ3DX$rNTE```u!rubt+b6Hr+7 z2fHJQXdMnAW=mSTLH6X2V24n5z3(fDxc|%U@wo5r(H`zoG2lLz)_l*Pw)R?Q``%lm zwWF~1t=%Yluoh*YBkO>zv1wmG0xkM^oI8ih@OozLS5c8UN{wT!9LM}nR>A-dsdP-U zflZt8V*p%C&!~NXD*F#`Q3|Hxi~_YC_p<|DY{z?;-x7OqUpq5pu8BZncuJrL%ypL{ zDH3F7L}NE8l%#k?`oc~0YB^p>ycmXeo9P`KLrERt)NX1<1iAP^rE#!f)%ABNPp8#x z1E|6ya6fvRk=xlt?`{(F+cA5~XR82h*8$e?lFvvrVSQjLBlWx|L2#|LXz6)Bz+3Q* zYZBK`5XPYP{lkfQ;&dDeQZb+)mqt4`)2#0l?eMlg%c@1pd#g%ozA}scW8VKxS!OM-nbx_Q@33tedt(~YYl{iIdDfmmb2yJ)(FTJ#T%9Xn#zg3Hv!va-{=KDuv6PWh*JBPdE#$nB&ydE91+Bd(-`$X$V zaLjlT0K?`k^vOhlM;TvHy5!`x!t43oQ;D|&V{@58un#AJPr_2>Gr}>kHCT2s?}>K@ z(3@NXp*D1BD?`LY()Ho;J=@ECkKWh&?oY(I;#TGpq+{9np-e}6I7h{Rb6grYH)E;cR< zJ%qB#KS(?5%w9}a96OVve2v^}R~ku|50Ly4+{vo7(UW~x2u~Kc%1M4H<`QcvUCYi! zGwk!c{DHM)>-4fsI(V6QpR!Xq4pKfg7x?i>dlgsXPQndOMQZs$@)uhU%`7x*;ww2E z6<@oRAE&Q3<172e^t9N0$$lHX`0KIVDh zyFkBZCDoOwgM%C4_iPY|I{3@f!9}5MXXNTL(%prF$C6jcM;!hy0?tYfkK{Rf&xXJr z1ju^Cq4(I6%)WClfk9_=5&1XUK2;v;>B)Oin6I^bB)*g2uIt%yKrQBC{&hoTt6k7@+4fz!w@&O6XqGeDUX@jH(b?r{TDJ-i?J zT}`MyP<%Z9nC4lJO%d)WE1kyzuBKTDUP*E1-c~e&T`weL=_RzB#m!;d`-|9|jW_Rs zpXFo9`FnRf!#@~%W4sCxDbj?|ml!u<^)`_YNLUG4F{H8(#cBVGIMHyB?YZm)oO>Rl zjA`5x*g4f400~|Ux9y&~IAd_By%>2 zTCNE0hv6(=-A-^FTNrx$&x(5Ag>e<=caTr%W9(DJhE966b zv}39NR+zj2o+l46EK^UzZ!R#4{8n;280jT50@P}{IR+*u0Uajos*pj@2cxsR z=)J>~u{~)GlpLEMdIyNbT#ioNnjZ?NZW@`gTiSyxbhwT|pNKxw5FyLvp-IdV)G`ip z2%c##az$W63yrBAM(eHmy8xq^R%QXCvnp+z3r5Bm1RXg8UnWiBvN%HvD57qPKM5C` zF{EM&K%@T^SZVv{gKZm3$9N%cPsXrli9W{nmpH%xnp$ApToNdp9z$U|yGTPJ*e$vc z1Zos6OnOl}S0XYe#m^+ZIm~w`hbz)u^ButxnqF+Ib-S8#b-2B69u7Bpu4X9wcjFr{ zQ!H42bVdR~cLnFI^?Gj{&WGV&k|x-I?>R+}y2l13K^Pu~eq`!c&CTh?)o#}pi}jpX zep<&i429N~U<_=kbbit5#HHZl`Nd7zjv%JQDulqEKb{Jn`#7F+5oa!UC2_kTw zkn=$V@Guj=!!`nl5CIX2_;^O!aU4vGH5}Uvy|w*g#|axg^ejF>fjMLja;0DP9B-hj zR<2)*H5Je23}ZeAD0{N}lUndGe|i%?FTVy>=hE_%#LT!ZW3EN{+(!?vBXc~*JbmR3g{;8Wq2(dwL#nzLRJWF>K*MN zikOI)%*0O}4HP#boXw#EjxL0g)5qAw5$^HIH618EL}W_PoPhICf`@DsGX;zlKH4Z! za|fK!(YBn?Jrqx)4QDjo>H-Zxw4Xp0GcC?Y175`QMo|QyIfOVp<}#c}K_8c440pSZ zX6i%mn@;!W)b^192q?PFE(tuXX~t#9waDm$4P+7g7dqcHdx*0$U#sTJBC+3fG>>+c z<~;ImuBt*9M5`*{HR2a^E<{yb&Q)de9lr+WyP(Dna}PeE-}s(u zct`orJBPW{$~TPq_P)cm>&4Z|OxZQaU5&PfcAgi5b(q~Lui#3K&JXoCA(yx2dl6qz z$0&Ure#hbd72u+;!0%{%DSi>648J4wJMcSMzYV{easSG7)TK|y?^eAKzl(7H%5}6v zACKPxeH4BR^;cSjxrFX~gByk^(*`0-m!O||T(oY=3s}!C}$?7x1f_ z<{OMzt#{T_17KbOsD4%>KoT_awn`f`5RS_unyN=r^{@`mKq(cCSPo;vT?Yj90&L8$_arUE|oHpgrb_0rk`b9NLyOblK|Q9Rv; zr`9>|YQB5$5UT@xT4Q(~XmV>$xppz2qcD>#5G5CD-U)F9dWK;Zos7GVw9aK-EiOm0 zZEZ0W&EE^Y$kPgzwoV{3Gmb~oi3UU$>wRJ!>TWh52f=o+0UQU{OArRX`#dTE_47L$ ztKfCN_$aJaB&D(fj&4Sl4hfpJb1pus;G0f7o44Rc(gw|UGZ&UrhE}q~>k07g7uPCC zeAwq{?V5GyLzg z8Q-_LiZ)DY0>R#7vGrf&c7_}4tS+5nTnROGMTW3;hj_V}X!t|{o;=tN5)ID~)EamB z#Q3c{_*o*~aGaGfiG}`?z&eb|fxc!4FF~I%-0Gb_1r+7dzXI<7QfN*EeR)Tv4U4|~ z6pQ|+R0orh?{OU{KR@(+l~?ms<1O0zpP;Y(t(mc}W{j!Id9>0Q1;^ni%+ym0Il$Tb zNv+OCmYf>32fr($Au^AHX|;(>f=SlP%T{x6I%D-RedU_f9EwiJQmd5X^!^Ck&9W52 zcZUE4UOgOg8=lpLEcFR3D1H?v{$w8BvMklSy{wsKsX5L5InXNQ6zq}S8}~44!?KiB zk(8xQjP_8bs?`3K&I4Ap)RK~C-oVHUj26vP28x1sga;~}uOph1zxd^XZ^-(;!S!Ef z6%WjLc`j;DtkcT{+y;0o4`)<5sRQ9G-1UCh-h+S(&8e}8TC9H5JIQc9%k6rdC94A* zX6|*Kg*{2U4^b>rd@h3_q3d;>MDy2|6RCQAg`f)!PTIB|=L?q?>YdM{WgvKDVW{9! zh2J@NwJ`L#O4HW%0&i_E@Gkm1u>5(4e(QO(2JL76AOx&AFIJ}Z@gJI2pPJ>E>36I2k-uete`-x zz?@HL?v)t&2|`Tyoy`)JNeq3R#n9K|#n4c|c$tuF$CK=1M`1t=yKQnPx6`v25sI3j zc4z!&IkZy9p++g~A05h}<1zknS0jE-)Iko_$}>KK9QvoU3y?!EhWr^9OD5nNIN|*U z5g;s_T#Y*iX;s-NKSltD9KA_an{{3e~3$z;cR|kNG9Xb<RU_#%~ZOwBlx8XVtZt#a#8vwk!usghl{v#4p zm}8j2)m=$e(&xb$trWf#Kvn>`>6)aX(9eHOS;-=X??8!hbVuY?)l_{lS~HtaBk+?T zzhy$wRmSyIH%&-Rgp`o2tSXYNDsY~WW!9jI2Ip~zCNOQJ4!VwaH^$078_es-qJ$BD zl!Z|OdC|qJ@Iumk9(NeGi+L&>rDqpT)w2pG>lp}^l~yI%F<)mLWsp6TbO{5tGiPsKJ-?hOrF?r$C^A)BN+O z96H64Ul`!I#TfwQfbR^d4d+pIgZhzN9V{m zP8ozSE(CAS05)P-BC_F(_tHxjh8}Ka#0CuklOuPcie&RKf+yXQOk&V6wwoP(^BZVm18JP*23>SJ5qeHQFm2ZGYE2d~AYi@P_7=5H3>#a@ivzN;U8P2g1Fx_+ARLw8WEhJ9;P&%M z!L)dO4q*6CB}fy@6Iv=ciO#HDm+RshwJr!1Dzmj&ycR_8?RE>>gLP->|G;S3adxH4 zM=-c_J#9O$gAH(-bq2r?SQAPHIdVWL&izT08B=6c-E@a0*HN+yD$j<2@%hoiG0TPebjLx@*DC4J{}6w zRuQxHBo6)sHJn!zx&;{Az^G42Dgs={v;HEg0}K%2Z^Om z^VFhZJSVi&lm~=CEFUo2jI&}>gXHtwT!~;NVJ~W1?GsBFb?k(v_ zBMjITNP4+2xPZ1HLhM?=km9C!T2qWG3P;-8PLTvuY6-t^7%OA7PBNI@e}hhmL8i6B z$;K^Izj%S52w5pOJDxAuI`!TWoY`u<Uy`XEyFjy15Zws=-6Vzwc!(;rDsQ zMEB;TJe;d+PR>inlW7*nJn>~S%%Sui1h4$n4@l-(eN6I8`e=H2fM0&udKur>B=bL^ z`9WXN&x-ElhdA>zsTmtPYvku!cAY37w`9Fg)*x%>*NJhvxa z&TX%~7S4aYm7m)aFNbu{UU%~cg5DvX@8>9P3*LDn4dFCb`RiY)sQ|BR17r_#4N6z< z$HY0z>+$G6wV%wb%u)P2;nW0pEr;ZKg=oWf3V2a4iOja3rP3wp^Ly{g z&TC!|vU$#?8>IE+Z?CCudXN3MH|q$m^qlQwT!Fz()Z(5wj(@|aPDkxnCchc3e{QK^Un4{kW0L}(p`|FgEJ9L-L9H4y6sh3AKccoCHOJ08r>(MhN;O2cFi{jj51AeF0|+ZC4Wx z1dNv2RiD@wzYYV5mfCgn4k{3-h84pJmL0O~@tzi&J!;%GZ`q-q0YywO_>2iecKJ7eZf@)2j^d8?NlcabBe8$Dqd5BfE>#AC&5%G{cJoirrSqE@VBYwm&`EG3 zC7BCYnMzo!9du1K4;ySs*gu5Z4=LaJT z7KVN=V$*ZP*;|@*c!M?Ij=D4->E#j!WRlxs$m~E4-{W{h*M}K%1qc$D zYWVj**ZFXU>Pfh_|CHUHC$ZV^mDDE1bA~Zt%yy>j?4V0DJ7m}CJf81t(st(YWXDa* zaS2MLnZ2h}UsmoQ<(p&ex;1OpJMJ&NuZ*}|M;Y5*xI`H)XeVu&_U$e>!>FYZC*PqhY1OJAv zJFep= zoo(+v#TCF}#NY1h-^Dop5&PGgdn(G7>3kXtoQtzbbY+ZorA>e>NUMG?@k2O+x$rRa zMWKwtz}mNPRiZMxJ5F(h0wT-*9z~pgYdyk!U%BDQ2Io$~o_c4X7jsy+R}pG~`Vi=Z zy$#3s)nnm+-Wf;@-%Bz@u%sGCGg+aYy_tN$n6(HWyMgN+6OP;X`r_3!^r{DH7pIaL zXbUUc5xx>*!{>bZ9NQLgzXHMPsoEH4j7tUq5ZjCxqZV-P494scIZV0GaV(Yx3~db( z>2v{fl@+K;XXhy2+LB(1x7V@$jDlr5qt?=uCAw_O3|7%!93pf-ok90R_$Yr*4g}Ez zLqZ5Ck~+vH#GZ|eHlxBuA;9{bM;e^OAYv}!3qkLTEPm%fOj4luNPeT{xfvWj&g&a1 zopk}%!N1_{NMqvNkw&+x&Su?Qmu{@VF>!|d&IpVP4_b6unlWIjh&uGiupjog4$0uZ z&J+1gwsby3mdqFjWb4JJmU=ZJ1AMR#3Ibw^hXio&+Qb>e8Nh; zT*zjtZg{78iKdxvsl1zw>v>KvmyK5=riANIQm1`l!&EOygWxU<9XqJ-1bQ5#ANi?F z!#_9jpf6xfA47w9fka{Nw)A9PpU z7X42AZr11F*9AZ5uDV6~O#GJU)9^b9e$ZWY1^RXPE!4;2cM3!^SKS!m*XqU*zg9Pu z__ewr#IMzjB{Q2k_(3OkE;L>8I!*|ueh1q%QB~A|6p;_35bbTQP%q8*9_B}`8E2i} z`9@Lb5O^`(dvy5egbBhM^Fl5KA+owb>$GO%`q6w-QJt{a#HxXv5(mOzWB?6N_N0%K zdkE)V%f>2Ej*8KN4#gaGKaJ_Yem0}ZzM-<1sN-g`d&Zi?bq}n`-e`r_UJHI1m$3Hg zd9G;fy@98TyY}wCXlrk%wf0CE{c?;kdwu%Cx`eX;j4l00SdFmkZY@;+}Oz#GM$ke>|;~_Q?J!v;EXX733Gf9MNbr4f##pOyehf>-VN+Fxp zI$YZyj+WD*(st5qNM%$E%X5c$3O|gexdxxO^PnoaoA3$2?;9ERjetEod)OdNT#RksB|WA2 z0oR2wz}T3?MjkWKpLFa!u$#8o8n;*cDHIWV)nWsfnmBR~)!ugGN@5*z9?T!d%4L?G54kW6%|m#CUB4lA9MSdc`H>FO%dp?IV)hR2j6d?vDLL z$Zi)yK3lhO)0%k;@4UV2tLs-RU$u7rJ#2l&3eb&vipzh`zgoM7>e__ut|?B7~R9gqciF?mlni@It1 z-=9y?9ky!HdNtW3JH`z@Q!}#tU+i|Af%}Kn)<6F6i(f+63f`37THwssa_eqK_;%9$ z!agF&?}RV}&!EztibG0lVSx+B%^Y~c=0y_%*Au*n<6dprq}0B~D>L0w9L6iVla!_( z>j{0Ra;6oIFw*yq#8L^5!MnmmM%vyIN)4(m+>B>(0~x-gnr!K`{RhHn$g_6}-a(&$ z@<5mdB%o)T238z$_OuLq5p{c7vT-U;ejO^3aNh`D5v;c)#Q1}90E|DYVHyd@D3*r* zJyDe5!sVdKZJm)?IRh2oWaL0mXbu2WIin|6v1G|jH{NmMk|mBMOPsgeguj!Q89LD- zl;7S$8bG^w6&dEiDsL6eP#Q$EHna)bFQmD3-x+!e`kLvGg}Pf5x)Y6ILhF6^;a!sO z?B($9T2866{#TabFYe_YFzMjse%RsM?rBZhfb*h=<4Ed;tTmUo-U2XebhE;3y6mUzwty;VP3S4UiZ;6 z#lt1W4dG<}htwH}4YAGym$VXgh^kOY0av2`s)7F!5D01E#DozE-XV|~3WeZCZV~Rn zcT2R}&1QUY{%Chir+VjOIG3vb$H-6rs<)R*L*bPwC{3e6MU^FE=3Y zT6TvzBO372h(_;V%uda!^i5-sL`1JC8&n50x_vZ1nx}pM?@v{`C?B*!eqSLTP(=Y( z0o~~iZf&|9RDl}G1SyrApvZCYE9zyn>}55VlQQ0=z`KB|I-z&LjmcCl9(>o^+v^N` za{sHzL65@O{uA+|r?d`)Fn}jlQJY?Jeio9Dy(3^Eec8lICj!-t7h(Csn}7yOSuM5HV9?nS!;8!^=Po zA^W`GLNz_0s+ex~zCYo$L%&z7fquA4$7l^I;4mAYIl}x@`A#BF;c)$uZE1zM`anLf zU8)Zw`YLi?M!CO9dM1%ZS7DMIO9Pi2<^!=beRuDpS{G9+Vd@!GA^HG)$!*A5?;A`# zV+vLWZ$3yAg?{>q-0*bhyiX!hBHqpmZTuJc)_^*k1GiC8cx2)lH1GS&=f>7(N3e*l zr&zk6n7lZOLW8Y(2Z~N2oC3hxjLHeTCS7|2eB9Cd4d^CfLC z1BZ=8`v5*2n&Xd2eJzYCf*LDw_|BMawzismGoZ3e&=Qt1`Wb{(bFnk z^p!RASxgrIgNgfu27`a`qcdx>=_4T_6bAT6+ZO&@Mt^t^uTVt`LbLZMY3O6jks3c5;_(kNwn?-)*VvdO6Q*p| zuY_`&aV1C3kgJVv{=Agr{Z}2w`!OI@WSD;di4kxi;Z!bzT~v`7g^C8WWSZs!{wnmQ z;#TZV#{Hrg*Th>xjGWzxvpjHEbTdbEXee|a+_Pa6B90naqV^3k*fCe5GuFD@tdACX zaK;XI`tS<+6A`B-0gdDKS1}=Mt#v1t8E337AT0Lw9%t_}kP-i}hIzuqw`JGB#?U7tT0+ui_I{8jcL2ck3J7(W{|AjgHdq zCtX&#J30a(g`*?sDNp~hJ31N))aYdWc6W4(ezQBeS$D!h0!IeXMS6idS^@=XbP__R zMhkEp6)n__V;!w zkG-9%X>V^|g(j`NeF+lfk4MvC&C`yzV+5pFirQG54GsA{%c;C(?~%QJ$d~dV`v;;OB0`w+R0GH^NbhfethvnAcwtz2PH(U7LwA$ zI-}4|`6~Lw%^n65w?W6X=*LH_IHO=9^Vi0;9gQPAfY!0Lzpf~>>7Ny@viLI$X7WI& zV9go)Ru0T+<)nB?H_5}JG4A;OwX9P+csmC zP>i#55WWnsXiqaj-JFJzXDSYdJ-1<9-q1A&5cpzyC}1HKDI4L`OKn>j1*{R$cK(_c zfvxxL5PEIr3&a{E6~UizLPAOY0RqkW!wAP_-yC>rOfVqTtxGd7b7dK zHr3bLm{ITRYp>6Jj`}FGdmk4Okvhn>p8KX5>+5}&*z3CP9CcA<_dYJ7dEW%b)(*rv zrXuDeB!h^yEq&{i!e@9@4XGNu|7!Hd{jw-IIGABMI6xc{NUTH;`;t+3Z$S*r-E>`N zgJaSz(oW#$g9ZCwQLDd(@QBGWUF2^KHX}K47uB!%CgF{rbDHDu$mRKqw*_sO^8SSA z<0YE!UgYV#Yu`i;>RL~9P4ksP=`A_}e4OmrM@=Ug*FlD}jfq4z&9?*XDI9*|yAmff z-tFHG-tKJGE-Yf{6OYxQJwocRcF>~3_RR-S0P|qe$|r9a zA!cBZK3F_-*QK7mhtkt$YrbhHSQVt%_x{W%Yzt#!L@Up9C67eGdiHOWaD>5|WHe0j z(PCq>dmkafVtt)`vjs~YBh_hw@@~Pt9@}KvA=6Nc3oUFCT%&Kemxb@ZB!-OuFO;oh-VOSxbd{_kdJ*p+^W_>d z1kR8SsH+N~k3LagHt#_-1moeV9_-)eu19KYz8R~B6q_Um^Z_UYDt^8o^eT?fF_Dl! zVc`dL+*h8KX-f-C*}Z4ND{h*B%zrk3EfDNP$5Y|H;^QB4M{?IBngcmNoXiZLW4*W z!lpHjHm#|&X$_%GYb?n=TVckB>RAfvsiYvqVcVBiMNG!Y5|f#vBc>k-;Irf@&W_1I zd3za25&|_#kt?>L2cM1L2BkQGFI#tx^Y>RS>s4C58!QAa0Un|A_XBVK_0Qi|-oJLu zI$ipI;JZB~kac0`+CsM#g#A#UxCLfjp#*nS{b~Ri@rB3vQ}59H>vd!BKl_|6X=O=pMV1!hNak;*h_%#fRPEYHTdK9qLNZvQ?$) z*E^P%t#FjCC*0*T+nwkm&TN6lII$)N{P9O^Yyhh+w~=wNxZ0-RfYan`aq@-^W)+2c zLh#~s1-s`*0yewzFH^rR+~_=53@5bxg15ogypO~GHd&fWAGFWcJ0I=^cd@m13;-~Q z)(ETcbi7Y9yAv&oM}a&f5Z~NxWVI7J>5()FGIT-qm8r%XC)H2gxIQYhU1aj z0R^6;>~>8GC^OqvHI3?0pMhRMoZinPh;0jAp>7s31{MK@l^LKti67 zOn?d!5&~2~7)T(&Kw>h(Lx~0_sW}W&V+ExOEwhK`CG5e|j(m21o(tUC5m)J*4uR^E- z&-oMze%E@8VEdRo${7aWxe?c;o#qB-Xrt4DV>K<#Z*UKxPi^}Tpt{O!KM9qdD|wJ# zW=AS=GsGFM$LKZ+M4bvI%3;h5MNI%mG~ze zmSMR4Vi^r?gR}b#iI(pY$M=V2{HEW+TRB{ZiI~uVRS1k3YPvlP!6I2`7B6X&HyG17 zfasz}IDD?WUxd|j<=S^E{wbOcQSNvdAuF}}O815MUhBqPPp3spu?9NsLsrC7Db8-s za{nUzixp$^M2TK*nluQ|<=!Akmk?7ZL7WYukx=KAjZM_rbza&iC(V#CHBlSaIk2&b z8Y)HJgWI)ayt{1W%5~${ltKzY$@ub;)g|R}`%jY{I&f#d- zj4rLz({tZcRo-*w)(7s+Rx{(wWR5Y9KPNfzD1y^Ck^!iBB@AI7#weDsSnYJFjzm1Cm~~Ay6LhwmwyX6 zid&Abff1tx<#P^5v7MH{fTxd96cTLwr*S?3LgZ1fYDzz4Cl zA7poC(pms{#CYOPu|$pT>pHKI-C`9tgZm=Le`4W`id&33=4liSKR+*iP3wH|FB~K} zKiNt?Ksrp}D4z}Wr-6uX3*k9M+|mtAC(b-cC53N0d54Lnqbsj#@$xck_~sEy$0t+b z3`ylS6?(sL<2@i2yNVsDS7MH<8AWIUb4|Y;GS2v?08{03q{wovxhmpk z4MM)mdxdkQxj zx!merE*lo&&JS~$gsCetq~XpFGo-t*PfUfHi90{cFb*4d%y1*7uFR0-9wi&Dz?~oF zGM*0oP%LcVJq=>1C5iQAVqr}|@@`^?Qj*FLw__c}Bl+<`uuDt*JBUW~R#~$R`IN~{ zdvk?SLnF7--W;XP&fSoKox7p!5jO7HdXIu&2H6LE<) za#tz%wo}5ydu-s|r!YCA8Ahmg;1Ed^CZC0*&;g4K`?E8-7lVhhFnIyI6(-MvxuXyt z*3W~$i!k-k^7+L|0mRq;0l{R7{LkfcYSqGJIV7Uv>G%~qiH;!y^-yNdc$r%4b!%c# z+$|Bc@p-@Xy^iH@rM4b>Ie%5_HQRn-(L6WcC>dC9fwp~))wR#qK^HpcdJk`(u`caZ znf6Mmv&6mEQk^9OyuSfc%R>Trn4=v~+p~{gM#`<` zg-2(y#Ii#LB}k$e&8Yio{^gz?`&&ee3tpdYdd}kKL)T(A4OBq{NpcK{c6ZMz|F z426l#1M4f8Lc$FIB_^kmxjiM;bZscN z=!Yf0Q-V8QB|CfeNeVhok{^SBE6S(kXDJD@Y5CGml@&f&N|We>RQldjXZPJhag9&# z#CdB@Vj}tqwVz^5JJ7{fhcTTuR1!4+;sL z$Aive44-D)jw5vaIh;!vy2pY}8UzB}V*<9fNLB!UzpBmp9&;SR97(7YKpmm5EK?*l zNhbHJOqvUgq?zO?jbwZz|m34+mYtY#&V}e+C z%<&|1ZDu$OWYj^a91%Q2H04J~L#$<&=*0Tw@l!1pH*TYlt#;}*o@)I?;5;(kPI!`*h?Aws|5@WjnWvHmD_Ojn~H{wOt|Jx^tznakBc^ZBEN5V{A$uugEdCVz0Y|}bcUH0(l9_S zPy>QOPNH`T_YS_Ib|lE^CNP0GF7}>6H?YRbjF9s2Ly{LO6K^szfs^YeGJaS4S~a@A zgx|K5TP4>1m^RdyY2AhJHVJN8RxKTaR;2VXD?Y_oyjc-bdXlz#UjHR+_bBZa-BDBS zTlVu--@oGirM&O4vZB}nAw;zOA*Zk2rKFDMU$FOaULDa~ZZZEa?|sa$Y4<)zI^6IV z3&@RD3bp$oe}tXwhkT!WQHLY;LjtgaHk$nq9AKsSiTbWzS&MSt^8f#RjtlQaZvPwa zbG%i{`H@w~xsrbaxBu@xhcY_ociZ59_c=N>dl3H}_BrU_f0TU=S_#B<2IfY(y$)*ILMfK3{ZVbTg#--FY%KdtHpou4*Xh5J2xOICQ^3FG;2tR(Vz8*mT(B{LQFuG|EIPg@X|UbHC`XVJb}i^X4>b* z&1|ykM53LqSw-l)sPXUGlL+rC_B&ly_Z2k{NwXz9zGM@1FG40Ln-F`Zcv*o8ZfxHW zZ3emr%Z5RkM^SxS$g3b?=8X*Vork|`+o4LwBHv}-g>53s+hLtU&sdL$=DhA>TzQe3`94+Xb4LHWocr3317dz;AcCm z*khu7hl07%g{Q$-EUa%kZOUSbrfe1+j=EXI8e>iZburU-_RXS!SPxg$(Z9mNLC38K zk9HRGk$KX^YgiTF`$hAlqlz6ent*}Kga32a(Q_DS&rzy;#vQrJj-u=sfY`LZPOU5U zj@|+BqwF1R_9#Ul?;Xup&F$Z1@91axy(6~9>0=jAX3-UG898)f%35dH=hVLwO5j*9 zL84s7S9z|LUD3Yq)&^ThIRGy^<0_ZX;eZum5v7IH>?7TUTb;Zn>|$WmCXoie$_^6o zc$oVy#@qjJ9=?5+0MXLO`$C0T}Gn!dWDjJ2^KP@!~zTPXl}&-7Kr zj{GCk|MWVL#R#mFXC#+*jDjb%C5*=n%HYC`1H!EL((Wmp2K)EZ>(iZa!}CQ%#N=3T=Ua#8L*vKbH?EW~g62D|#a%kbci zT6h;r-jMRiXHBBD?DuzK7YpxADZ^0}EdtNc@;}}LINn!;OrqD zS6_~lcVLhUOklHd9xokREouN-@WoS)%0f35(~Z_soor)-0igLR{MlJN#Ikrl9>sTg zv>;M@Lt0jtU~|AqI>R)ZJMbV%JVbKJlS(>8;vOq&bG9L zJ@NkOU`Sc6^ijNSDi*b-vG*^r8~QMl@C5qujN<8Z!jsSRoULgL6awDI0xIu7x3PDi zTeS(PAn27%K}azyEOTim+EONCqPIr z0yIYu;AP9Hpv7~u_{R+&%WL$_@)~{1`iYQQd#c&uw()n-?(N!G4u#5 zpt3kXEVZR3w)SWuBu3%@Ke3BUNnVz;c<&5|h=@7w!dAk06ETglBwyuOvX0vPe%Ivt z@~|B5n2yg3EIO>XsI-sP5yb!RTPj?Xh_N21r z9x3DSO>F8YG7dHC*c#dOGibpJhyHP@SHSymYWuTd6y4-NbC^!+C&~aqD4leZvJ{2U zr?N4uEV{@sL9QdFraLoQ3F7So2kx^ zR)YA@IM9AC5flMxPku%SA7V9`ZMa^n(pcF5M@>eU@cIqAWy6SomkELdDDuqcLR9xN z#mxU5Z-TVx-UMl*LKACRJEqVyrKSrTejlSrZgIAtSH$VLg~38;ODV5NZk&|GXnbaw zQn83e?2beW?ntxQvp?1^7b8n`}&vSh8&O>muZs>tg^9q2nB3)K_(+T$Yi7knT+%xlaU@|GSY)gMtYFRNDnd@=|LtV zJ;-FF2bqlYAd`_EWHQo&Oh$T;$w&_}8R_8!O?zkY zIRUPr$%C^N=gZ;peteli4OC~8_d& z@br~1>C@tZr(2oeX$aOJnG^aj*z704(;qS~rOm@zqph7|s9mq=iXnOXK_%58s1u%$MZFPDh>tOGEi<)U>lug|)_GN)@%yqiS zE_BFr4qnT`viidB&*F#&C@QxMcNMeTV{J-q8SEw8PJ=4BWoQPE;4A{cWi0@mWI_Bw zDNBtj*SXV*J-&VqqgxPlj;_xEk}91&$fUEQzCk)W>KkNUqrO2pJL((p2b0c@`UdIj zsBe(Yj`{`}>8Njz&W`#9>FlU)kj{?!MrF*Tv!lMDZ9#p5bavD?NM}cVgLHP(H_!z2 zEzI?L>FnV;g^~+4I6LuX2tAlm)Ea;9tzXi53+FGnIaK9b`%8AQ0e3aexTx3X*cgJrQ}3VRee$qymYM_~n>1jwz@D%l zFJHJ#Ei$c-qmiFHLHIiWT;rKWjmAP#j^>GHHi%IW2w%$trq}>WHkx$o6$%lEnnJh9(1C9mn zIAh@0g2$G=9l83K7%8?G2jayGb^K@*TlQ@#2M6P;VC-yW&hEhOaej z_}WLcip_^sjG`GG#;(fDiiV+>8vosM(e{WbA`Lu?%!dEKxjk{=ae$+(&lzaF=nX^9 z@jTs&-K=e9_{;@1@;pKpM0=-`zva#5!0j0My(o(gro(u0u88OW6gluy-Y{e@hht#< zQ&uV1yCS+twr(D-%!}LUeIfbX@eyea3)@A{akj#$3ja;^*7U@2MrgG=)F zal-9;gb~U==E(=>g`M-nS;vK}K88}INzoXA{1_UAF~ zs<_cx(`z^@eC(647&#pNHJ&V%5ode8G)&G3Rdcq;)DNww$D>4PfF#cu=Sou-GB>`T zGgk^J_W1gDktLED0l|5I>*NO0bD8o_zD{nrW3TZpuYd=Ins+S!A#-0^9&DlvnJ zlfl@g2V=!sSc$%kkaCIMxj@N`e1+PkWG3=x(c382w^6LUh&~T*m_tt8aY$KcW0z(a z?Z95j_QxaWIOS@LnP>gWh(eN>>XtFXl@Rd-17n|WZdDSe5yV{ScM3A`_4l*D{~k(S z!0?M;#5P`iRQ_Cnr(JMtl<&Jhx*!+@>#a3C13jyWlkW(J#86QQ$!i~~E?S~IFqW>F zVe>#n&VE~>$hRS%WrExjG8>9;X0}K0+)8zBFp{CV)j5+eiGz*mPG=Tmr#O$QC0~1s zLVUR{rznM?*5#up^rP$)Y7f-|&Et`KF&j`bC|B$goEXZ;Nb}|%ooD}dt$pq)`k%e_ zN%{XTSo>sT{jXX3T)l+LcZqfux%XC#rju^NrwcpNn zS7T%7Y6sVAxt_%JY_8{WeHzyna6N_V>0Hm}`h2dB;re2(o47uQ>*KgSoa>{xZsB?Y z*UelH{7uFem*N@TDO_K`^%-10$@OxsAK`jB*L%3Wo9oB9-putju3JvY>2z`XCaz0d zZ{&J6*BiKgjO$HYpU?FZT+inEF0PkyeHzytTsQIbE4jUu>-)LBhwIz8-plpHT%W`B z^<3Y<^**i_bKS_(*~#tgTo<^zo7=Z?J(uhGTsQM@o4I{0*K4`Hm+N(ZmFZc@^>VHs z;d&d_Yq?&^_2XPG=K5N$Z{_-Wu5adg6W8~0eLvTmxqgi6o4D@gdMno(xW1U{C%E3o z^<7-w$@Lvv-^TUbTn})457)c6E^)n^>%Cm>;ra+puQ6OtY{&e8bV9 zKN~CjTF9s_IJT-UJ7x6Ip+A4mBux1H>X_p?`FfnM`y8FUP-lNvm;PHid%iAw%=~w2?%jHH=udwIdX!ITHt6h07_!nYz`jDB zq2R-~2kw7u==Kj0{-&ncg3hk93Nbo|D^2%*U2M3_Quh~=aQ*n;1vVZ0PY!>&?#q3z z4c&Av!T(j>eByM2Vj`aUuPB0(>V;)*>zUItaFIh z*)2M|4jthN9sMrSg}+2+zffn_hu8ZLXs0n>xV&R^<=3V|=yjd_VjX>ry7;=_!UsBs z9p@!I^czhDi+Sr0Z*3cYndQNU!7t;!e6qd%r(b+ItJLzF2VlSUnRf^1{LMM}%i>?S z)Z%*{{F7wcS7v z`480DV{~?t&TiD%2kGpwI{RRqeSpsX!F88D|K-l3L+?)%Y8Q=bD|YSs;M2co?0?qz zfB2Z;z3VmpuI2HscX-3`<1ve(Ux0muysLHg#wlM+ddU3R&>crn-iwDcy{Y3TJ-?nW z!%^WqW|-FZD-FN>K^Om^&i<;-9?;o!)khenbJ)>rvRttG=+H+#7ZRUZRn?=*j==3I ze)s?Op{MumyVUagZOETv-jo|fjYa+Dp+*sov*WBrL&LL z*)PzQUxLm~;_T@cU|%6m&>=tv!{`@aUm=fnkLVX*Um6CS)tA?yPo8=Bv)6_`dYJ0N z4-Er!;nQ^XRGpm;<_#2E6QBNK zgqDA@U%A%0D)+Ua8g+G;>@Vr;%{u!VI{Q1Yf2A3p4AtS^ICJIs zDa(%zeaHm-O3&Miix2DQg&DK&%0~Yev!_9$M@Z*A9?ZU(0w-xfm!dE zF2arj`vqhzFHzRj_!~~#`s%?4!|kcAxf6!!%I|WWeT>dNR%aisv%jk2M-qiizX1CR zc@4VyBI@iqtMIZ8UQlOm(b+H7rFW6ePOEbC3$U+{cVuqjh@RUnv-nz3UYTiQFVXqy ztU~P*o;$o=u8QZ=gm6*IGw%yqe~Aw`HRKHa=|JRRx{@JCN-yj0|YroFFB=4kQ z_vkRaHtGB)>GG4JvwL;n1C#du;@9tm=VRB(<)W64NoTkGW%ki;m!LiWfw1Fn?6e7i z+kg7S75T3X{WUtyGQ-#`;k?KWK2~SPD`e~!khMGq0vd-lo+ z?$?IaIuL&G;I9nlU+?}n;WEnuH^Ywp#iye;y*5d|0Q;i1qDZkHhu;CrdU>4bp36t z&Ti1zhw1DwI{Q$aoujAXJ6Sg#I8R5=YjyS?>Bi^Bb^YhtI{RBXdy)>H^L6u|;X3=} zI{PI$d%Vs*OlQABXE*5VaXR~XI(v-HK1ydd>g;BneSpqBLT4YSvtOXITXgm-b@stJ z`&Byo5S@Lb&OTIUzffntOlQAHXHV4G2kGpW>g*Tm>m(5PQSL z7Wti$xKhHy-qPAQm$=yEFKYMIlK@#U-$-IvJdg{+W;Z~|hl4a7w5i+pST43gXu~xJ zHaWa6-{_kHzyXN$X*_@&&TJEBw)%1Me2US>(uL%q=68|EODx=upmQfR8~&LAapta| zbNBHz@GIHlckVz8gx!g-2#GVuQ;bM_g;5%YW>Bn8pe$@56bVlKVi@qw0=^7deJM=h z6ZF+&%1@!h?*R_(r!yKbFhPM3ijGb>(L+JU=ciPI1}#o14nB*|&nPyVD8TULS;e+x zDbd2Wg&`dS%F`?24A^Wbh+a)9pu#yt2YYc>10vyIE=nGOzTPK&VpF)8Y(wk5N39Yk)_08OOmOw^hTbPPp*g1!K{O94uu7=3$u46A%;I&!Ci;e}|C`1`C<9A-qQ z1OCV985DN9EwyCr(vnJd8Dy5FhFKY5!WLc!))Q0T0sx|OTXbGdzf;aDc-gs)GqM{3 z&SVnDWdO6HZAw{n+>eYQ9qCcbszm2j*-K_*mStzFxUvO#;i29QO9&X=wOvE|fM-k2)$g!CC!-y&(CVF(SIAWU@H zWP*tO^2Yr2VcML@8=p;zC>oVF?m;_uHs09Gp=x=9UhF;_Z=6u#XnA88BI$VJMie#R zNbkt4}E&*>w!De}6Q`vP*OPuQJck&71A79`~pya7`7;#agkYEV+l@W8%r%y69jQ;VsOy7yW?ETf>Vt~0bi{7Nt-bdKn0Bv zrw$hGBueMHu4Cp-i8LYP=$bGKWrxP)8=ELhOja29b*AGnYi^ zImD9v3#BKhU!tsY9(W(~86Rlk86>?80dP3`lbxW@eM1*5Zcvl`ON5fUZ;`#ZDE)#( zll!0`8+1^c)0vL5O*mV|gqVb?Ora_>A7K=kLymi;ZCLDLMeIILS`QLS@!$yLC&VCt z+^Nj4{(0W((x9YWKiWyJm0JO4JKAMwC6I2E9wpRypUV1cWjGVr65h*W1`yM?g}UHW zhN^p>$n+o^?690nIwK!!>>=ml80OMSKK6p3(o~cz%LfZY`5?pk=cVzvL^u;H!FnUU z1iNDmjl&2&>$yXfCf^ncQQ%`ia3qyzRjH&AUpJYJ)L6dwNR1k5^L~ufoO?v)F29qS zAs;K5pmUFAq*fbr*2yH;fxB%%=cao%fCMFterGLWAnbzU`jJ{`ACXc3KH)+*`|xBv zCo2mDu%L{OJtyj8U^FAOGtjw+qAKVp!L>N4IAEm4#(n4#mENCc6@)A$TKJf77@smy zlf`OFBat0x7ZzzloVcdcEmRQkn{XH?B>fpD)KJ&tK^~1s&pKv0q2!c}ndDIcW1|A; zLZqXDQTxRkkudl|dIzf{(An628w!N#R3TPw#Coa*V!fNl&C8Y;zMMwk&TdG1^fNa1 zv2a0Wx29|ZYDeELIw6ts$ZcLCW}7^2N7%YEM&X+%xAoKq`LBS0|q{0 z>UcFF9$|&a&|~p5g?UE$A8OP0@!(n{)I=G5D8Iu{oIF=ljFfHP7KWc%jAYA~<^pr+ z15k|ms|{TW4dX%A{%9yY{}0gcXOwph4b#u4AJgd6>N#mxUjL8L@LGzeq_5CWi^Mr; zNZF1~!(qT&+761zXD&_B2Q<#d$!_!{gKF0%K%DGL4e0!p`6}9D_{8}HHus^owWWJd zXRHAqIta~R&T6NzTzC$ULe{0OYPVobBBOgL$JnRgD~h3SVVyg~`f1?&VEqhyzjq%Je>@*1ztYGeNe9($+=Reb z#+e}In3Z<%R%P6w$=Am;L6T?hk@?z4pwG+~-EI3W`Fevz|3~vRq9Izo))Q^yeDOIs zawPMtn-vlrfr*-#c?3_N8F%Ix#dAi}^h3&x?O?vc>RH zfp2m`s7-$J>bNp^9{O;fV^_QG+qsc8U;iRhfcvW(H-Msms5;iQq$}lftvxt zA+g+Pfx(;~|Kb!&tno{{9tTY6PIMxczE*qb#k6Iq3;W!+duxUZZoFDgm;%5G0nfAG z2EYn>7*&omod)(MLid8$jQSfeC|v^o|osxH$yOkA{xNf6e!X_`B^ zAIBU>${44%rF?Fs@Tm#8O2qbvNao4B|UG(S_BZ> zOPfleBfqyal>-(Gv%MMQB+x7OJ*DL^N;Q;jvl)O#Np~Qd!2uKkd@OWcjB#-f7H5{o zL3mvEryDW|fhK_T3<;;M=8~65#(d;M@T3F>kbwX;O@jgJt>lg$MmMs?cFls>W@Z~O z1Ky=jEVM#1lH)&;2qV3G9SR0Ki_5HUknzx5rc)N)^Vp;b=oG2kdJ99zEc^ik@;0OM z^bChiwh$#rYj`q!)CU}nfwlEkm zzU>T3Z08`18Q!Cjv7CdokQEN`k1P{0SdI4#kPeV93+{{cPc!)};sw4^lh0)exs38y zPe+TF{M2146qsfd{RB>?fS)L^ol$^ch=!jExL*qVP^N&fvw-FRERPJbh-G00HC1q5 zP5I{tD)~Pn=YLcwe@_TaU*#^TT7`9-oQjo| zW#uJRiBmkwCnerokyzzfg?IZ(5~(3eT7=q30dsg~~6^{o)l zALWPMAlV&(t7&@Kc_EvFuShEGLiVr{6o0KCSOZFXg9ao1#q5EM_hd7;j^Lhh;7Q;j~eJ#D6G&1l~oyD_cEwE8k{DC8dMH{NrwJtl2VtZ~gn zY3A6fp}v~FPIG-|J^Ch7s?om2>}@fJoPFMOd&sk&qQoJJFV}18G>WIJ0ePKNOD{VwD=6Dm~6U_3$VBYX(?c< zDR8`+dN(X2x$P#=)90HxoFs;U!owrny+Moktv5X_7(DQ{_>7IQv7JLuUp~2-%@x%#kGwWTccXZDn+v6%qI^U= zxqO!5KPs7F22L$6B--meF(8L*Fu zAbP5?;;Hy&bLQ8sPg;O&FFBojX)Mz537xTxzJVC$=9mnzYD>n(DhiKbeg;CJ{qiqt z^s^bYSWmCEU}Zzxf-A@v)$YcZXc?^EteQ4)6BX)oljyI59bDvHiw7U+xr#P%3j`OT zQv@mco}=ZszdjzU-@#*b&_N`kZK1LL4G-O2HaB`FeTyeDShesTptyoNJ6O*Qj5?6$ zMTpQCrJhpDNAc65m2^9`(hM|^2~K9+1Ss5@E1m*hj6qkR#Kabw64P8D+0}Rynr@O8 z_`p@tqo}nqJZdTrFr3}9yayN=;_IlQc@MDsds6)e_5c;}k4hGO3=gq>8(bL$x55yt zr_jWXG6l(m61xRO<@49VYj$D2v`!u=`UF%Ev$&m{$)A-)zW5(9YF&i#AzwZD%Ebf} zF}10GhJwpTxySmq6H>k{goL<-@b~!%4{@g1dw>-o`nE4AJvnn|**}CtR-YUc)zjj; z$t?OCC}KUaK&sR1N$@SSbUdx*0S2Md&$76lB|zbjKtzFKB}9(xz6<3&y^L5qRtt$`vxm%E|xueArl3V|7B6bEWjMVrK;THNaQqE`gDXzmJr@fFn-lp42S)bZx!sFTh*DvbdAH^bjg6WTf?k2S9Z^)N^Kn#ZMp-r#_oyIu;fU&aSNa)Z0@Ph|(f4T`|){HF_e0)U>-a8p4 z*C8d;J2;3_%zo!4(OIh?ww(~06p7f^J!eDgFMQvMBi2QT8TEK+(;h{G`1iWjFrkfT|-@t4m&tm9>Lm#?+>{9UOnUpazTNWTd zv>;HMCdD4Z7k9!hwLc$|?{xvzVpeT4we#@FeZX$=>X`raGvh)qINgdhamg$y-o;Kh*CltFgsK*r|@?3 zsm^ieKhK48Igisq?Drm0Bi!GF4ip>)EX6^(!)d{Hm&v#KJMq^D8Qwp@Uw=l^B6DWH z{57-J`+*_#m3t;=c_9SkA}S^4itHZq`uK{#4{b+y#$DTf53V z_uAF1EMj==syw_b7+yZ(?Wl~yyJ*p(uAe;|6^HMg8;6f{IBa7}cvzIACNpwrl8yCc zJZATY$Ea=5Xz?A^@mwrom==3A%dE;eo}BhuXgi|P;L(3H?e}$QpX@j7@AsGX#oPbE ze1D%s4CnhuziGdZ_Z6e&`@w%S?YDGkkI-y8f#%q)rZa8cu2RXx(tfT1YbxFh`U;*h znw#rt!pNVTNrl7itl(s}$R0EtM}jQc8OykfSxkitlZ|sUs5DW6hYzh)=hCIp>s>^P z=NcJ4^o@?s6X(EZIsBvJ(|tC4D8a*r!g9e%rO7frTNys|jgC*oPtQ)D)BWO8%VPFJ zA4>4>p)w79o<^Gp`s`r%&^J0he>ev|_rX6peJndDC;i|<2_8OFt-obTIk^7(Vokj?Z~NJ3BuI z`^6`p#q5WFD8a*rsx<1r8@bDqF56aua z*)l$D@W2sce52!Y!_Uu7pHGl#bbKmV%zp5p1o7~!hCT;BVe~o9@S$&Xd=8ugpEdB0 zj*qbOEc{FfVyILmsQrai#;2X(L*MB5%w$meFRwxHkB(2{+3=wRflqlDpT|CC^pO}o z^o@?s`{%&t;ePQ+eEcl*p#*`?+AuytWqi6BKJ<-_&q@ZhfBIYt|LFADb2fY^LEuvz z#%BW#6r#WAW%$rHIzHc=1D|L6#V7k0XQ2-z2z>Y%dKzzhev;uMd`R_+zR~gVGpPO3 zXDa-o)2Hoh_)vm}4;5yvCj?yLDJyrEt(Om&CUEz&-Ey6Ieiln2xmyPZL(nz~F|- z#xUOAu5^~92}!1T%x;r3OFpZK^#L4|!A=YvuPKloh{IwM?ZTL2C(~guabZ_#w|k&; z1wuEHfY&vc0(P;p?tPF*PwP)~gBSa4MZJ&=*xR`rbn#D)@y&SKDB|Jp5f7y~`>Jie z^>3TRniIZRCb895(|!F^?55s5;`*B~`@Z`^dd=AQkhtJ&lRu#dOE^O3m4Ju2CgQI% zjSY%O=I%>HGX*jFjl=x;2Jw{NJj_4Y0N_;*Kq90NUw;>9-Qh!QoDrVc=ex*XcbKF>*o`2<4)T{Yh06u*KL?Aw#DKov5|I2Js*p$e2Az0PVHSCBL>CRSc89>4EGh9<`Wb#g`uR>-Eou* zSa1q9``uRYkb0IEM;qI*WlZVe)UsWgge)7JC&578Lq^(5mO4k!J|?}>jDy6|rBpGP zKRXuL?sJ}mk2nQ;Vm;!agCE8eN}mj&_3~~w6iV+gb1#>psO)4mC*m=908%8BtC(Gn zS`B0}{WV>Fk0hSLLs=013AEm1OPCQj`B5skd4-a}8{1A3PVcfa)r2{%-k*dc;ye2u_6>orUp(Dkpr9|@QqA_t#bhQ z`_=^1@{vRvx(-t)Ju2e{9MWQ|K1jnW^2R&p=wL&>FR5I zx0?Ot%-1`7MjtlxAwap>D8AMi7n^T}xoWU~ogwvf)%(_fvTG=mlnN1LN^9|S%E$Xs z-`F;KX(BKf4?|#Au&C?B?N2}qF}14V+kMu+Uw`2?UJ@`HP!>Od2l!yD__nX6=Q*rG z3mSiTK=@;C?LC9zK${M_(%-lXcNDmN9@)LUH^$%hAzH7{=z8I)IM>Oi<6Hsg%}{Mn?NHrNjyOissz$W>$fvoPZci;h9Cp)7nc zv9Tf?j2-m&7S(M~xi=qt+>1h?<1<9`LTMATqLqz*>SnWuHW~W{PIF6c%mQo|n7siD z+M|wV00J;o81v*vPE;c3W_4GUtx6fdFG?h%a}JE(ND zu)n64A;b7}F)KDIkkm49%6zO5i&IP;S45;2R0GXKpvm()NXiS(GiCCZ+#k6!Q|u4H z$SlpC6>jNrx+@vP{(RqaBs}D=kF!9P9WM~KpQ0{*a;11wY*D7Gf6D^I@E)|Z7?be!L9gGqC4jml8XxdaF;KNH6g06XN5jtd+Q_gQq$mhI}9u~5wGYLMzQDlXe{59UxV z1j#~=dq!&|mjW(Y$;YUX6mt?p)>SSH2n} zx6c~fu!5~aPsVF4?b$}diylqO$f z&{uFz1>annT5a+q`#_}_>g?ppL1u{>QR=*SHZ(*#AArQ;o!4RPRG8q!4JFU>N+=u& z>ERuf#NwMJk|W5v3+4PA(U*eZcu6jDkT2bg5NtfXq3Z}r72O}aQU3W-7uCo5IS2(z z&=Dk3#a`H6=-WbW1yUWIsbVLgnLq8nbdcN-|AEEur!$hQqWlI=Y%LR=`!F~V*|lOh zK8Cj5K;PJxVu$&wjQ;Hu#dm-u7PO@Pj?PzCWBj-R*O}XA7y4K-`O<~d_A5!Ic2~8F z2Ph;ucj_Y`fV|gVzW@&T;#URIaXh&x2ln~N(cq`Bz}3ex6)X5Fao>oN^i45|_48ri z2~WfmC2MT{1LTBpM+6E#(&ie2FYH?4@(P7qjSkeTIU(XS`yU?z_lU6<+s8&fP1j8O z_Q5xFuzkQmDb^c^zZ#oRS<;By4W-reRj(A^^e524U_mVE_D@CA(9?Mh8XlZh z_6_qHe}a|~&2K2%NQ0)Bpm8e&rB-mnR`1s#_hnR%Ek5%;pYaihw8#0Ku?NLg@$LG+ z`hBbg?-oZ`#IMk4BeALnts(1sX$$+Rhl4L!MB_dbyHPYgk~5V8d`e@dTQFdfTMK0# zDBlxA!E1Sp7>tC_=-oa8f_gXFr-WPR>PpQu=mFtyU zAHnq*TrcOko9m@qU(0nP*Vl8snCUCsrB#cn-JT`mmkLSfla%u5TX99{?q_k9wh14J zW@eaMUA>FNQNmD-$5GaN>EYjfgUcGqJf5`#%>B^sqq{$)4NqL?#H3>VfV3&5^|T** zk=$qFggI(Ez@PZdH=+0!0^xHVXpiVjwvzn*DE=yLozE#aQ1BEwf2Q6mp>|CH6071w zlc^%}9-;QRy*A|AJ!Dzh1Gy7$C~Grfo{{%w_A2mMABd4;EcjnO#{DMxXQdZJ3rw9M zJFTqkCrlwv0z0~=W@j?8qvRFX`D)8qm0)Ex~^d^%wpIUnDX`%$e zWv%tAd$xbSz9%F7RN4(<0D1WnLD5(2X~GhX^v$FQIo-^!PtGn6ai5JssCbu;Qt@W_ zSR2jko$@LHP92-Agd zL`yr<($H9noHR6)Y4XDuU5ru67H5F59u`^lTNpQi|7AYgh+%Rw-v0Y`Sw4}DD#IZy z9#Q8& z(O|?xgn2zOj9jOw3pjaLbN7qab#gz_kNe(!+_&}PUe}L%c|Y!R`f*S1$9;4^?&b)0 zg|6oP?`R0O{{?N{d6;|YfsZ5FU|U!)l~1CU!5!Zr%*^i)W~?R*xG*RXx2WyM3|jjr z_yfitI6(81+q z8kpxwFI@a>D43V9A2ef?v2R6jq5rngh0^vO5a~9P*sYmI5+7t6k1NAY%lm?(LiCpdo@BrhiWL?6natpD5 zx#TMWHZkjDO@RH(=Ow3x%ta1_w%*DlAEJ1G~4IS|d zdPl3Kbk&rtnl`JZt*U98YTCg~EZ-6=`O;P5H%eP|57N_M5ZvF8H*W+{$TwlV$iCM0&5?^ zq9~G)V3A1!tC7K)@6Fi33@P4>T4rDf=59n(vP(Y>10{RuGV-A)(o-N7Pmb)R>&SAsSg9vCNgPYwVf5#BRW{05-f@$?IBoX(!gpzE3BJ!u-+k96h$f~SY*<`+7Sg- zxL9Izu)@VMoM2I84Xo}cu)?(eJ!0^JtVO`mZwN1nA|1iNx`|90SbG?(bMlQ#2Q-Y} z8UWSu%|_xIf+{Vfc^Hmra!~IFZouWt<0!Ahc?uloG^`s6~J;92~eT*I)d_1EFU`}ERjs9L@X>ZSfTXz8DUvl_>*>@4UHZiRV)RB>b2t1I1BSG%G@`=emRs55mKOnY$WidIk(B1a zRcFHWEFj)Ojm?)DxcRgg*|fm?2X|^PO+zl zEfx-%J#t!P#vP#qT)M#{m&&G|vW}pv5qP^84Sox@?vDm7ube@HroPp2F4iM7hVa|{ z-eA{`VMAPtM-Fjq9XrI;eB%&TasCk3@TJh78{%@jG{m*PZHQ~{r$bzoy+d5x7h})Q z8s~CPk8=$#jB}OWhNcrgg4F~#tb_Y+{wclA12y7$lWQ~7Zm0lM?l_aH7-~J# zW~cy^mK-NxH{O7FP!6a$P>Z4Zpk|CWx#mN4LG?lzZ#22aKuv>M47C<&C)5$BlTcc? zdb0rznN~fofspkZc$jbDPG+)(xS7ISi!kGP7=fF~YT#xHW8`LR zoCpKBnU)0Sax-?dgn2OE$l=6rGg)J~ncxiMW`Z+_n+eW*ZYDV2hdGJExs031I)a-C zj+vVY&Ur9fdH5mROx8GVrts%;Glh?b*~Y_LxS6a&VYYMkVcbmC3t)C|_d3vx%w*lb z%>+M@havb2U{2=Y6S$eIUW6xi3V$!mkblH}7a|O->~|42Q+UNp;YV?IqE#&dQ+P`2 zR=DF?Oa_zOzt7F@0r-4wCOmVvnbMuh&4kZnZhjx(0gC-DhJnn4!*CdIev17rfq4SQ ze4bR(bTVJT&4lNbFwf!cSHWDw&7--Q!dwmWKl?MNKMqN?pJAW? z2H^~6)j@+wDE8Y>=sqZ=$TWV~>?Y)OzY(v>ZKlpyD6ffg?M8P;@+c=xYOfv4(ow>f{>NZfBa~uS^xUCn$M%|Bmfx9NOs?h}v~5?z{Th>NFI4MTlWYHIv|VtU57juw z@>NWTG74%rn$i6a$gB|s06^84_z7#cf?-{rQk;Twkgr^Q|P1MmtSRy zpqYXng)=@G>1TObwiABye;bM4xMMPY3VcO37lmPH@f*_=S>6<0>%VtKB+VTs2D?h3 z%utT^2fOA&xuF`N_CRg=(_ohb-So%7u7rJYuHNV3T;pKwh1mg>4|6S4Il`TQ(xye` z83Ts60#J^Dk^S|2@C5NiE0i{ls|z&K-p9IN2BlFU&=J;kG{h}XQJ<(11Nh^ zD1V~wj(5YfROq|sKO@Us!O?v`==DG(&g7T<;9%E&C?%YtCmx8TzXCrO?uz-J(Uo)* zef`KV4*Q$sv`PLQ`ESA~TnR_I>1EkYq9Vzz_n*W4lem8XBEcw}@}rB*WS++T6?eK| zOy0W({*Elvx~cL)1{vsl>Gy`c$>KUaqgZV%HaqW{rb3nw=N!C z115iyuFN)bcap_O{(3sKbAJ+!PW}xT36rk;#$k3q=Dq#Ir@QjxKjsIK@pg8H8+4<= zC@lVKtT68Lu-j<3NpPE{aoYnoV^6Hmrg3YA+a|c3(6~*DF$!DZw&05}yi&Lg|68oE zR^tXSHi83g{r!fYiWNpfWkbz}s)VYA+6uK3stKwY>KIfzR5z4xI##eijfP5xngdl1 zRR^^dYBy99R5Mf?)Jdprs6HrjZ>%r^Y8+HLl=7Pab1BqXs7+A2pp;)T%*UWkLUltK zzl;?UphiPEpr%1BhH^tSKy8KE1=R%A3UwSxg6f5`e1&*W4ybIX`B0TmwNQ;vTcLJB z?S*QFIsv8pdNgL?YvcuLIMisUB&c+#T&NjPbD$POl|!wCs)K5T+6J`?YA;j(>Il?v zsCK9>s9q>zAMk`40W}870hJ9k14{YLhq)ALEz~Bc9Z{zvK?R`Npd_dsDC4)tC)8*t2h=pE`B3FhwNQ;vJE5AP+MwE@ zx}k&+$_Xk7DirxE~_e8>YfaD2Y1hRm6y2PB|@@lhplSWlqyekDaD_lxRQH3yv$&FwDRLLrQ^XabEWZ{*l?(>9KBi&hOyKS;? zB&z#7;dRA*W{JD1Y-u&o>0Mb`T{SY4gS-?_#@-iZl&vb6Qvq+GU6@(18fNEOLHL`H zUs1kpIo<&ggs+5x5?6WIoh1r^;r0#OmbzW5mY0_ZMnge`XH_wSXEqdqhD+TF-Ol57 zCF(HP-BWH?$bfYR*oh94%gdG{F}q^tAubZ8uUrXI5ua34m(j~4g~-sV5RjW)D`nVY!tT>ttBP5Q+2odARk3t( zaWVL;nsB^>+~$-m1+^iIP!R4U``nVMY7o(hO#Q$xwY*}9t9&whuLx&wxt%bj_z!UV zjEbc!&s(^?5UfD{Te-bx72Z2Sh~F8QG(@tL6i;8Zw5nt!SX&TYG)%9~osv^Hqr_D_ zWu3c(_^Z`0qrz3p>4DsSWSHqG&n;U`a6cxqyNrU)shC$*T#{4jqB?WhfC^XXLDfP@ z$Xvkalo-PcofVcKl*XXIHMI4|6qc8iR0NvLl*eKNvI5 zRp!pCs44`nm6s^&EW8|}AT*~!#S-yLg+*(s%Fy`WH&$4*sI1ymy|k=MxQ>~ZRurKggB!7ZP= z$&CxuJVCe%?a4CPfz?`y>xCOgP_d53t5fW}ReD@-uB>#gi%9P`f^$_d$MOZVIpyW7 z85WLF`!A!+9Ny-38Pi;s8_aWpxp}HksQDFWG2SOTI=>H?UcNjBY&AU>^^w^tJm{nW zap~=IAl8)d{e;}}DwcW>_cJozRI;wnjZPhY-Q3OyGsCs6!s8a=SR3W4qDEmTnL)~m z@^WhLgbTv<0`w{j{zc4fUA59#T*B?{l9jwy!}>hA$@G~~v1&PyRu~(0V|mX&yR;fC zQVi5&>OgKQ+9Z{bsOAvRI(fCLtlWi65{!9b6~C9|$f{t|X$Fg^?0S?^DI`pQsPTCqmS5vEaw!gZ**EAw4d z==xBFtL3h7NX(on*V5bbHC0TwB&Mj6%2$m|YY_iNH8pp--8R0soZ96C;GtL3XU>Fw z?hIP%9|Qk?r@F~maI^3wj%I`v9fPj1niBQ>4 zat@dQpEG}atLjV-tqT!}6mE_(Md`(w0DLPHs9@;D1}xMds8}en3#8UUr9cgbLim1u zv|rZm4|m@}A8>_xWub1I%IvL%S{e%V#mXuGy&b9>s+YTc3q3^23v~$ULns1v=8twZ z4WL*yqn5lAY>RaO+qpC*#@8tnz%(5rsheS+j&B~!^gCeu>|10Q`?gd_gH=6?`O+B9 z$b7h!X&AoXH&<{8Re)0_lnW(*xk^|juqiKFXQQ3fDuh@iRKp*4ED^2(Hu?=V?lF=? zQ#>jI_bT|T5|&4Sw2FmE!k92gNQH7>l^_YRmIzk>ryRgr30|c%)*(kO*jP6Ya|y#L z5i5NaLNQ=hv$PWtQuZkYt*V8kEM>y1oZ&bgp{fv?es^PLVNh|(MLY^mxK>8wr7#MV zT$V@@QTkF;iS*pzR=PvIQ0$t8Ctp5qahXsP5eA26syJ)osq zlSASpeQDzS2%}+S96cqqbR=5-Kl?)ie-g+&mo(T~V12^2*Vbg)ZwuI(ZLPK=wl>=_ z+i}|oTf6O~O|o^_x@|qSUR$3{up8|ryV-8BC)kJEN7xhXqwQnta`jGW$>tg#gj-4qF zOnP)ucIK^F!eaT{%6!`b+hSX>t<+X-tF*aoYi;XowYEB2gKd+o(YD#P)wa#H!?x45 z%eLFLCkkhD+YEN<)Ts;Hoz|5mG|J`^M1vi&xytqfhp-1XqTuv-MsG%6hLCB@G-aAI zEtv_K!!t)@CT5P#9FsXNGbz)NnUa~FnVp%NIW2QWW`5?J%=wuMG8bnSXO?D`XI5sq zGuLLW&#cX?%WTNpl-ZcMIdf~~w#*%wJ2Q7>?#|qkxi_;ZbAM(avpKUh^GIe}=CRD< znI|&aGf!qpnO&LPnLU}knSGf;mNCneWzMo>C1efH8j+QlH9Bid*0`*sEJs#KR(e); zR&Lg`tQlGPS#z@HXD!HDoK>7vnpK`vndQz}nMXeb4%Vb-Hc2?avdve3q0Hl;PDZBE;owk>T(+Rn6HX}i<*r0q>>O52|nNNY}OO*@j-mUb-dcv@Blu~D`Yoc|ub&PeKHOcC*rdZRh+16a^H0um&zIBduzIB0hv9;J* zYAv@`THV&Q*7ep}Yn`>hy2;vT-E7@z-Dcfk-D%xr-L0ej5o??EnDw~zgtgsz(kfZI ztXJ8V+78)nx8Gxb(EdyN^Y)J%U5;)?kE7So=Ma*O$);p;vL!hoc}?=?$rntRKH;8; zm!({hGCswbBDB${OArpF9!ouu+L8K2YV4#NCOwFf`Dxna=}%+|?Xv%M6ShyZrnpml zDX*v8o@$=-mq{zrmS?_@DRj%cb1-QcaA~pS+5eRKS?X`nE=>nejOoVVYq0$qt?O*Z zF2~ywPfZ*Q-ncQPA?1QeBPLxl>BaO9(i=10z$3{q7z5zkT~cjQL(-3uwkB-=C4LQ_ zd%@abHQTPWjkBfMHh|ZrX3WSa%veJ8J~0M;t03e}`2K|Q3HMKUYC_9|_b2pB7&P(H zi8oBlM!UIeqIcp$6Yoi_OZBDdx$HMtd$OL*5|UzAy}H3#>%ihD!}nK?CP$0oZO5$S zMae6ZYm!|PD<|GP@rU5*i&L&nNltkv<98WCehj1A)k)VS-Iz2XDKF`!r2M3LNvG3~ zW?V?PEskOJrYkAddXaT3%6^u0iPd9$5T*H&^?WH=ZrvubThv^6% zqZT?rC+Re`(|PKk%hX9-bdzpT5B1VL>Z5=PR}m^wMX6{N1LfjXqDoRJiYZem<*HPb zrqb0km4RxXrE*oC%2$ikGF1St6sZzbs>-1C7FDU{dyBng_(UtcBCo_N^~%1cy8ioQ zhfbx?AN%|D)^Cr|Yuq#Xi~tYk5j>Jd@n{~y<9IwzQ3Fcm$crCbN9Dn$@wRNX^gLW5!cPlt>f@WTQMRkH}-P zMGm$j?Z@mfcCu~Q6YX^S1$(}|$bQ-WpCmR{B!;#|C-sXzjlQq}2o}j1bOr4`& z(o6LUU930g3cX!d>ssBQn{=~o)ouEmzND||ZhcqZ2TS3;4Bk781=(;G%My@1oY`yw zo5C_#4tt3$Wh+=Q+rTQ2pw&>Ofi!0Id+L%19RSG_gR<`G=>|oMuL%SaKknx z7*oLGImoA_#tNg@*kDu`+l^|Y7Wvy`G$XIturrs8Yeu(m*SK$l@gN@#KP2#E&biGe za4f0-cdzi6Czr?-a*eE%HFBSPPo9=t^0stn3B8K!IfkT(Qihs}oY<^(s8LpdHQ1hG zZ?gwGvz?zf-*H#FZ@TH;0_4L+^!pm`E$=NqP>Opv_}k;y0%l;Xi;PuR)hEUmMvx2c zff|Q~#zMEuPzA`oHFOcw9&XMsmztZ*o#uz=g^!3)VCr;nPdpGLe~xusk$;eJ#OVhh z>v!mVq+Jk6Hdn1xTh)8^3(h=et+Nq5@E6WOrwL4Q(mCsV;@of^I3wM7H_=UTnJe69 z-RIqGcaB@)mbx3=o$mYYpWG2%p*I?Yo~Z+s1M9wOMvCd8Q0x;o#4+s1Fd9wIQ8ulm zt@La99X+SA)q1rJKKon^w-QiwOE5XqSf5(At&#Rq_EGzk9dKeD%b5&z+T*TB z(qz!*6cFc1y&kUH3&)*@+j@0iFSJA^hO=RC7=yd=;jA)N#a@S-THvH!xF{NI^H7Zp zxTXw_sY9u%TlPCYEAMDRttIXcO(CTZGG? zOq8a4M&`&oSuCq$HL~S|JS)3pj|`$`CZkVg(R><*u9d1LtM5VUSJaPHpBwaIyh&cB z*XCXKzACYo=u%y#%k>srsjKuZy&Jn)r|b0ru*PA1L>~iF;(iyroPbRC_#|ZcEZ&Uy z_X3EZ3p208G&>`d9aQIWXXp|&ITxKT!D!>X7rkO{ zkJk!re&CJt$N4k;eZHZm>N$F=-jDTO(cs{g0Y5~8aNb3R3<23rHWq?dtHC69j3>Co zC-Oqf*l&kE3SGs-9Bu9~Pnc)S4)asO(S$kkw74KT#b@FRabNsJ43RN%v`mo(w4EfU%9%1>zATI6TDetjmp_%S zql+Ac(x>Fd*pKVTnm+kWilPxT2AYp23v@ICTr{5wu@h@(BRHrA`*5hg>OTPYbkb+k zjrtE)LqRxCsP8JSNIe6hnGKd%qE@SQ>PJY0-D;m|RBx-_sy6izYW1eNqx#e!Ynb)8 zHOd-;o@rapT6yRag;s-g&~CNc?elhrecA4`yX>3xExX6=weQ(|sO4}c!ijXEoH!@Y zj{AuHwHCo5Srm(AF)WV7vqYA}Qc!!TERChJY1sKJHjCx5Jk;W1wu}|9m8^)BfR@X^ z%V~d`_{%WkZ!s&)Dsvb1|D<^uG}-wt=71OxC*q+-l1LFunE!O<@bAtC{?p08X;k8Q z(IGBFy)JQ6+!8&a7m3>^0y11i$VeF_qoHP;jPI}2G?@i07lYgjhNESFo* zJF4U^xm)g)b+TSQ_j)|mG_`=fWj$)BB69N#ZcV;%*9op;RB%H6aO{$ zn#hfGxFQdHTL7*t2h;9V_3DUfQSGV&e&|sFE5eGh;;kf0S*bYxnFT)-SVdO3RcYa9lWh;`Cxw>qqwR?on}C$ixG -// The License.txt file describes the conditions under which this software may be distributed. - -// Most of this file is automatically generated from the Scintilla.iface interface definition -// file which contains any comments about the definitions. HFacer.py does the generation. - -#ifndef SCILEXER_H -#define SCILEXER_H - -// SciLexer features - not in standard Scintilla - -//++Autogenerated -- start of section automatically generated from Scintilla.iface -#define SCLEX_CONTAINER 0 -#define SCLEX_NULL 1 -#define SCLEX_PYTHON 2 -#define SCLEX_CPP 3 -#define SCLEX_HTML 4 -#define SCLEX_XML 5 -#define SCLEX_PERL 6 -#define SCLEX_SQL 7 -#define SCLEX_VB 8 -#define SCLEX_PROPERTIES 9 -#define SCLEX_ERRORLIST 10 -#define SCLEX_MAKEFILE 11 -#define SCLEX_BATCH 12 -#define SCLEX_XCODE 13 -#define SCLEX_LATEX 14 -#define SCLEX_LUA 15 -#define SCLEX_DIFF 16 -#define SCLEX_CONF 17 -#define SCLEX_PASCAL 18 -#define SCLEX_AVE 19 -#define SCLEX_ADA 20 -#define SCLEX_LISP 21 -#define SCLEX_RUBY 22 -#define SCLEX_EIFFEL 23 -#define SCLEX_EIFFELKW 24 -#define SCLEX_TCL 25 -#define SCLEX_AUTOMATIC 1000 -#define SCE_P_DEFAULT 0 -#define SCE_P_COMMENTLINE 1 -#define SCE_P_NUMBER 2 -#define SCE_P_STRING 3 -#define SCE_P_CHARACTER 4 -#define SCE_P_WORD 5 -#define SCE_P_TRIPLE 6 -#define SCE_P_TRIPLEDOUBLE 7 -#define SCE_P_CLASSNAME 8 -#define SCE_P_DEFNAME 9 -#define SCE_P_OPERATOR 10 -#define SCE_P_IDENTIFIER 11 -#define SCE_P_COMMENTBLOCK 12 -#define SCE_P_STRINGEOL 13 -#define SCE_C_DEFAULT 0 -#define SCE_C_COMMENT 1 -#define SCE_C_COMMENTLINE 2 -#define SCE_C_COMMENTDOC 3 -#define SCE_C_NUMBER 4 -#define SCE_C_WORD 5 -#define SCE_C_STRING 6 -#define SCE_C_CHARACTER 7 -#define SCE_C_UUID 8 -#define SCE_C_PREPROCESSOR 9 -#define SCE_C_OPERATOR 10 -#define SCE_C_IDENTIFIER 11 -#define SCE_C_STRINGEOL 12 -#define SCE_C_VERBATIM 13 -#define SCE_C_REGEX 14 -#define SCE_C_COMMENTLINEDOC 15 -#define SCE_C_WORD2 16 -#define SCE_H_DEFAULT 0 -#define SCE_H_TAG 1 -#define SCE_H_TAGUNKNOWN 2 -#define SCE_H_ATTRIBUTE 3 -#define SCE_H_ATTRIBUTEUNKNOWN 4 -#define SCE_H_NUMBER 5 -#define SCE_H_DOUBLESTRING 6 -#define SCE_H_SINGLESTRING 7 -#define SCE_H_OTHER 8 -#define SCE_H_COMMENT 9 -#define SCE_H_ENTITY 10 -#define SCE_H_TAGEND 11 -#define SCE_H_XMLSTART 12 -#define SCE_H_XMLEND 13 -#define SCE_H_SCRIPT 14 -#define SCE_H_ASP 15 -#define SCE_H_ASPAT 16 -#define SCE_H_CDATA 17 -#define SCE_H_QUESTION 18 -#define SCE_H_VALUE 19 -#define SCE_H_XCCOMMENT 20 -#define SCE_H_SGML 21 -#define SCE_HJ_START 40 -#define SCE_HJ_DEFAULT 41 -#define SCE_HJ_COMMENT 42 -#define SCE_HJ_COMMENTLINE 43 -#define SCE_HJ_COMMENTDOC 44 -#define SCE_HJ_NUMBER 45 -#define SCE_HJ_WORD 46 -#define SCE_HJ_KEYWORD 47 -#define SCE_HJ_DOUBLESTRING 48 -#define SCE_HJ_SINGLESTRING 49 -#define SCE_HJ_SYMBOLS 50 -#define SCE_HJ_STRINGEOL 51 -#define SCE_HJ_REGEX 52 -#define SCE_HJA_START 55 -#define SCE_HJA_DEFAULT 56 -#define SCE_HJA_COMMENT 57 -#define SCE_HJA_COMMENTLINE 58 -#define SCE_HJA_COMMENTDOC 59 -#define SCE_HJA_NUMBER 60 -#define SCE_HJA_WORD 61 -#define SCE_HJA_KEYWORD 62 -#define SCE_HJA_DOUBLESTRING 63 -#define SCE_HJA_SINGLESTRING 64 -#define SCE_HJA_SYMBOLS 65 -#define SCE_HJA_STRINGEOL 66 -#define SCE_HJA_REGEX 67 -#define SCE_HB_START 70 -#define SCE_HB_DEFAULT 71 -#define SCE_HB_COMMENTLINE 72 -#define SCE_HB_NUMBER 73 -#define SCE_HB_WORD 74 -#define SCE_HB_STRING 75 -#define SCE_HB_IDENTIFIER 76 -#define SCE_HB_STRINGEOL 77 -#define SCE_HBA_START 80 -#define SCE_HBA_DEFAULT 81 -#define SCE_HBA_COMMENTLINE 82 -#define SCE_HBA_NUMBER 83 -#define SCE_HBA_WORD 84 -#define SCE_HBA_STRING 85 -#define SCE_HBA_IDENTIFIER 86 -#define SCE_HBA_STRINGEOL 87 -#define SCE_HP_START 90 -#define SCE_HP_DEFAULT 91 -#define SCE_HP_COMMENTLINE 92 -#define SCE_HP_NUMBER 93 -#define SCE_HP_STRING 94 -#define SCE_HP_CHARACTER 95 -#define SCE_HP_WORD 96 -#define SCE_HP_TRIPLE 97 -#define SCE_HP_TRIPLEDOUBLE 98 -#define SCE_HP_CLASSNAME 99 -#define SCE_HP_DEFNAME 100 -#define SCE_HP_OPERATOR 101 -#define SCE_HP_IDENTIFIER 102 -#define SCE_HPA_START 105 -#define SCE_HPA_DEFAULT 106 -#define SCE_HPA_COMMENTLINE 107 -#define SCE_HPA_NUMBER 108 -#define SCE_HPA_STRING 109 -#define SCE_HPA_CHARACTER 110 -#define SCE_HPA_WORD 111 -#define SCE_HPA_TRIPLE 112 -#define SCE_HPA_TRIPLEDOUBLE 113 -#define SCE_HPA_CLASSNAME 114 -#define SCE_HPA_DEFNAME 115 -#define SCE_HPA_OPERATOR 116 -#define SCE_HPA_IDENTIFIER 117 -#define SCE_HPHP_DEFAULT 118 -#define SCE_HPHP_HSTRING 119 -#define SCE_HPHP_SIMPLESTRING 120 -#define SCE_HPHP_WORD 121 -#define SCE_HPHP_NUMBER 122 -#define SCE_HPHP_VARIABLE 123 -#define SCE_HPHP_COMMENT 124 -#define SCE_HPHP_COMMENTLINE 125 -#define SCE_HPHP_HSTRING_VARIABLE 126 -#define SCE_HPHP_OPERATOR 127 -#define SCE_PL_DEFAULT 0 -#define SCE_PL_ERROR 1 -#define SCE_PL_COMMENTLINE 2 -#define SCE_PL_POD 3 -#define SCE_PL_NUMBER 4 -#define SCE_PL_WORD 5 -#define SCE_PL_STRING 6 -#define SCE_PL_CHARACTER 7 -#define SCE_PL_PUNCTUATION 8 -#define SCE_PL_PREPROCESSOR 9 -#define SCE_PL_OPERATOR 10 -#define SCE_PL_IDENTIFIER 11 -#define SCE_PL_SCALAR 12 -#define SCE_PL_ARRAY 13 -#define SCE_PL_HASH 14 -#define SCE_PL_SYMBOLTABLE 15 -#define SCE_PL_REGEX 17 -#define SCE_PL_REGSUBST 18 -#define SCE_PL_LONGQUOTE 19 -#define SCE_PL_BACKTICKS 20 -#define SCE_PL_DATASECTION 21 -#define SCE_PL_HERE_DELIM 22 -#define SCE_PL_HERE_Q 23 -#define SCE_PL_HERE_QQ 24 -#define SCE_PL_HERE_QX 25 -#define SCE_PL_STRING_Q 26 -#define SCE_PL_STRING_QQ 27 -#define SCE_PL_STRING_QX 28 -#define SCE_PL_STRING_QR 29 -#define SCE_PL_STRING_QW 30 -#define SCE_L_DEFAULT 0 -#define SCE_L_COMMAND 1 -#define SCE_L_TAG 2 -#define SCE_L_MATH 3 -#define SCE_L_COMMENT 4 -#define SCE_LUA_DEFAULT 0 -#define SCE_LUA_COMMENT 1 -#define SCE_LUA_COMMENTLINE 2 -#define SCE_LUA_COMMENTDOC 3 -#define SCE_LUA_NUMBER 4 -#define SCE_LUA_WORD 5 -#define SCE_LUA_STRING 6 -#define SCE_LUA_CHARACTER 7 -#define SCE_LUA_LITERALSTRING 8 -#define SCE_LUA_PREPROCESSOR 9 -#define SCE_LUA_OPERATOR 10 -#define SCE_LUA_IDENTIFIER 11 -#define SCE_LUA_STRINGEOL 12 -#define SCE_ERR_DEFAULT 0 -#define SCE_ERR_PYTHON 1 -#define SCE_ERR_GCC 2 -#define SCE_ERR_MS 3 -#define SCE_ERR_CMD 4 -#define SCE_ERR_BORLAND 5 -#define SCE_ERR_PERL 6 -#define SCE_ERR_NET 7 -#define SCE_ERR_LUA 8 -#define SCE_ERR_DIFF_CHANGED 10 -#define SCE_ERR_DIFF_ADDITION 11 -#define SCE_ERR_DIFF_DELETION 12 -#define SCE_ERR_DIFF_MESSAGE 13 -#define SCE_BAT_DEFAULT 0 -#define SCE_BAT_COMMENT 1 -#define SCE_BAT_WORD 2 -#define SCE_BAT_LABEL 3 -#define SCE_BAT_HIDE 4 -#define SCE_BAT_COMMAND 5 -#define SCE_BAT_IDENTIFIER 6 -#define SCE_BAT_OPERATOR 7 -#define SCE_MAKE_DEFAULT 0 -#define SCE_MAKE_COMMENT 1 -#define SCE_MAKE_PREPROCESSOR 2 -#define SCE_MAKE_IDENTIFIER 3 -#define SCE_MAKE_OPERATOR 4 -#define SCE_MAKE_TARGET 5 -#define SCE_MAKE_IDEOL 9 -#define SCE_CONF_DEFAULT 0 -#define SCE_CONF_COMMENT 1 -#define SCE_CONF_NUMBER 2 -#define SCE_CONF_IDENTIFIER 3 -#define SCE_CONF_EXTENSION 4 -#define SCE_CONF_PARAMETER 5 -#define SCE_CONF_STRING 6 -#define SCE_CONF_OPERATOR 7 -#define SCE_CONF_IP 8 -#define SCE_CONF_DIRECTIVE 9 -#define SCE_AVE_DEFAULT 0 -#define SCE_AVE_COMMENT 1 -#define SCE_AVE_NUMBER 2 -#define SCE_AVE_WORD 3 -#define SCE_AVE_KEYWORD 4 -#define SCE_AVE_STATEMENT 5 -#define SCE_AVE_STRING 6 -#define SCE_AVE_ENUM 7 -#define SCE_AVE_STRINGEOL 8 -#define SCE_AVE_IDENTIFIER 9 -#define SCE_AVE_OPERATOR 10 -#define SCE_ADA_DEFAULT 0 -#define SCE_ADA_COMMENT 1 -#define SCE_ADA_NUMBER 2 -#define SCE_ADA_WORD 3 -#define SCE_ADA_STRING 4 -#define SCE_ADA_CHARACTER 5 -#define SCE_ADA_OPERATOR 6 -#define SCE_ADA_IDENTIFIER 7 -#define SCE_ADA_STRINGEOL 8 -#define SCE_LISP_DEFAULT 0 -#define SCE_LISP_COMMENT 1 -#define SCE_LISP_NUMBER 2 -#define SCE_LISP_KEYWORD 3 -#define SCE_LISP_STRING 6 -#define SCE_LISP_STRINGEOL 8 -#define SCE_LISP_IDENTIFIER 9 -#define SCE_LISP_OPERATOR 10 -#define SCE_EIFFEL_DEFAULT 0 -#define SCE_EIFFEL_COMMENTLINE 1 -#define SCE_EIFFEL_NUMBER 2 -#define SCE_EIFFEL_WORD 3 -#define SCE_EIFFEL_STRING 4 -#define SCE_EIFFEL_CHARACTER 5 -#define SCE_EIFFEL_OPERATOR 6 -#define SCE_EIFFEL_IDENTIFIER 7 -#define SCE_EIFFEL_STRINGEOL 8 -//--Autogenerated -- end of section automatically generated from Scintilla.iface - -#endif diff --git a/rosapps/devutils/vmingw/Scintilla.h b/rosapps/devutils/vmingw/Scintilla.h deleted file mode 100644 index 0185d3e5be6..00000000000 --- a/rosapps/devutils/vmingw/Scintilla.h +++ /dev/null @@ -1,599 +0,0 @@ -// Scintilla source code edit control -/** @file Scintilla.h - ** Interface to the edit control. - **/ -// Copyright 1998-2001 by Neil Hodgson -// The License.txt file describes the conditions under which this software may be distributed. - -// Most of this file is automatically generated from the Scintilla.iface interface definition -// file which contains any comments about the definitions. HFacer.py does the generation. - -#ifndef SCINTILLA_H -#define SCINTILLA_H - -// Compile-time configuration options -#define MACRO_SUPPORT 1 // Comment out to remove macro hooks - -#if PLAT_WIN -#ifdef STATIC_BUILD -void Scintilla_RegisterClasses(HINSTANCE hInstance); -#endif -#endif - -// Here should be placed typedefs for uptr_t, an unsigned integer type large enough to -// hold a pointer and sptr_t, a signed integer large enough to hold a pointer. -// May need to be changed for 64 bit platforms. -typedef unsigned long uptr_t; -typedef long sptr_t; - -typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, sptr_t lParam); - -//++Autogenerated -- start of section automatically generated from Scintilla.iface -#define INVALID_POSITION -1 -#define SCI_START 2000 -#define SCI_OPTIONAL_START 3000 -#define SCI_LEXER_START 4000 -#define SCI_ADDTEXT 2001 -#define SCI_ADDSTYLEDTEXT 2002 -#define SCI_INSERTTEXT 2003 -#define SCI_CLEARALL 2004 -#define SCI_CLEARDOCUMENTSTYLE 2005 -#define SCI_GETLENGTH 2006 -#define SCI_GETCHARAT 2007 -#define SCI_GETCURRENTPOS 2008 -#define SCI_GETANCHOR 2009 -#define SCI_GETSTYLEAT 2010 -#define SCI_REDO 2011 -#define SCI_SETUNDOCOLLECTION 2012 -#define SCI_SELECTALL 2013 -#define SCI_SETSAVEPOINT 2014 -#define SCI_GETSTYLEDTEXT 2015 -#define SCI_CANREDO 2016 -#define SCI_MARKERLINEFROMHANDLE 2017 -#define SCI_MARKERDELETEHANDLE 2018 -#define SCI_GETUNDOCOLLECTION 2019 -#define SCWS_INVISIBLE 0 -#define SCWS_VISIBLEALWAYS 1 -#define SCWS_VISIBLEAFTERINDENT 2 -#define SCI_GETVIEWWS 2020 -#define SCI_SETVIEWWS 2021 -#define SCI_POSITIONFROMPOINT 2022 -#define SCI_POSITIONFROMPOINTCLOSE 2023 -#define SCI_GOTOLINE 2024 -#define SCI_GOTOPOS 2025 -#define SCI_SETANCHOR 2026 -#define SCI_GETCURLINE 2027 -#define SCI_GETENDSTYLED 2028 -#define SC_EOL_CRLF 0 -#define SC_EOL_CR 1 -#define SC_EOL_LF 2 -#define SCI_CONVERTEOLS 2029 -#define SCI_GETEOLMODE 2030 -#define SCI_SETEOLMODE 2031 -#define SCI_STARTSTYLING 2032 -#define SCI_SETSTYLING 2033 -#define SCI_GETBUFFEREDDRAW 2034 -#define SCI_SETBUFFEREDDRAW 2035 -#define SCI_SETTABWIDTH 2036 -#define SCI_GETTABWIDTH 2121 -#define SC_CP_UTF8 65001 -#define SCI_SETCODEPAGE 2037 -#define SCI_SETUSEPALETTE 2039 -#define MARKER_MAX 31 -#define SC_MARK_CIRCLE 0 -#define SC_MARK_ROUNDRECT 1 -#define SC_MARK_ARROW 2 -#define SC_MARK_SMALLRECT 3 -#define SC_MARK_SHORTARROW 4 -#define SC_MARK_EMPTY 5 -#define SC_MARK_ARROWDOWN 6 -#define SC_MARK_MINUS 7 -#define SC_MARK_PLUS 8 -#define SC_MARK_VLINE 9 -#define SC_MARK_LCORNER 10 -#define SC_MARK_TCORNER 11 -#define SC_MARK_BOXPLUS 12 -#define SC_MARK_BOXPLUSCONNECTED 13 -#define SC_MARK_BOXMINUS 14 -#define SC_MARK_BOXMINUSCONNECTED 15 -#define SC_MARK_LCORNERCURVE 16 -#define SC_MARK_TCORNERCURVE 17 -#define SC_MARK_CIRCLEPLUS 18 -#define SC_MARK_CIRCLEPLUSCONNECTED 19 -#define SC_MARK_CIRCLEMINUS 20 -#define SC_MARK_CIRCLEMINUSCONNECTED 21 -#define SC_MARKNUM_FOLDEREND 25 -#define SC_MARKNUM_FOLDEROPENMID 26 -#define SC_MARKNUM_FOLDERMIDTAIL 27 -#define SC_MARKNUM_FOLDERTAIL 28 -#define SC_MARKNUM_FOLDERSUB 29 -#define SC_MARKNUM_FOLDER 30 -#define SC_MARKNUM_FOLDEROPEN 31 -#define SCI_MARKERDEFINE 2040 -#define SCI_MARKERSETFORE 2041 -#define SCI_MARKERSETBACK 2042 -#define SCI_MARKERADD 2043 -#define SCI_MARKERDELETE 2044 -#define SCI_MARKERDELETEALL 2045 -#define SCI_MARKERGET 2046 -#define SCI_MARKERNEXT 2047 -#define SCI_MARKERPREVIOUS 2048 -#define SC_MARGIN_SYMBOL 0 -#define SC_MARGIN_NUMBER 1 -#define SCI_SETMARGINTYPEN 2240 -#define SCI_GETMARGINTYPEN 2241 -#define SCI_SETMARGINWIDTHN 2242 -#define SCI_GETMARGINWIDTHN 2243 -#define SCI_SETMARGINMASKN 2244 -#define SCI_GETMARGINMASKN 2245 -#define SCI_SETMARGINSENSITIVEN 2246 -#define SCI_GETMARGINSENSITIVEN 2247 -#define STYLE_DEFAULT 32 -#define STYLE_LINENUMBER 33 -#define STYLE_BRACELIGHT 34 -#define STYLE_BRACEBAD 35 -#define STYLE_CONTROLCHAR 36 -#define STYLE_INDENTGUIDE 37 -#define STYLE_MAX 127 -#define SC_CHARSET_ANSI 0 -#define SC_CHARSET_DEFAULT 1 -#define SC_CHARSET_BALTIC 186 -#define SC_CHARSET_CHINESEBIG5 136 -#define SC_CHARSET_EASTEUROPE 238 -#define SC_CHARSET_GB2312 134 -#define SC_CHARSET_GREEK 161 -#define SC_CHARSET_HANGUL 129 -#define SC_CHARSET_MAC 77 -#define SC_CHARSET_OEM 255 -#define SC_CHARSET_RUSSIAN 204 -#define SC_CHARSET_SHIFTJIS 128 -#define SC_CHARSET_SYMBOL 2 -#define SC_CHARSET_TURKISH 162 -#define SC_CHARSET_JOHAB 130 -#define SC_CHARSET_HEBREW 177 -#define SC_CHARSET_ARABIC 178 -#define SC_CHARSET_VIETNAMESE 163 -#define SC_CHARSET_THAI 222 -#define SCI_STYLECLEARALL 2050 -#define SCI_STYLESETFORE 2051 -#define SCI_STYLESETBACK 2052 -#define SCI_STYLESETBOLD 2053 -#define SCI_STYLESETITALIC 2054 -#define SCI_STYLESETSIZE 2055 -#define SCI_STYLESETFONT 2056 -#define SCI_STYLESETEOLFILLED 2057 -#define SCI_STYLERESETDEFAULT 2058 -#define SCI_STYLESETUNDERLINE 2059 -#define SC_CASE_MIXED 0 -#define SC_CASE_UPPER 1 -#define SC_CASE_LOWER 2 -#define SCI_STYLESETCASE 2060 -#define SCI_STYLESETCHARACTERSET 2066 -#define SCI_SETSELFORE 2067 -#define SCI_SETSELBACK 2068 -#define SCI_SETCARETFORE 2069 -#define SCI_ASSIGNCMDKEY 2070 -#define SCI_CLEARCMDKEY 2071 -#define SCI_CLEARALLCMDKEYS 2072 -#define SCI_SETSTYLINGEX 2073 -#define SCI_STYLESETVISIBLE 2074 -#define SCI_GETCARETPERIOD 2075 -#define SCI_SETCARETPERIOD 2076 -#define SCI_SETWORDCHARS 2077 -#define SCI_BEGINUNDOACTION 2078 -#define SCI_ENDUNDOACTION 2079 -#define INDIC_MAX 7 -#define INDIC_PLAIN 0 -#define INDIC_SQUIGGLE 1 -#define INDIC_TT 2 -#define INDIC_DIAGONAL 3 -#define INDIC_STRIKE 4 -#define INDIC0_MASK 32 -#define INDIC1_MASK 64 -#define INDIC2_MASK 128 -#define INDICS_MASK INDIC0_MASK | INDIC1_MASK | INDIC2_MASK -#define SCI_INDICSETSTYLE 2080 -#define SCI_INDICGETSTYLE 2081 -#define SCI_INDICSETFORE 2082 -#define SCI_INDICGETFORE 2083 -#define SCI_SETSTYLEBITS 2090 -#define SCI_GETSTYLEBITS 2091 -#define SCI_SETLINESTATE 2092 -#define SCI_GETLINESTATE 2093 -#define SCI_GETMAXLINESTATE 2094 -#define SCI_GETCARETLINEVISIBLE 2095 -#define SCI_SETCARETLINEVISIBLE 2096 -#define SCI_GETCARETLINEBACK 2097 -#define SCI_SETCARETLINEBACK 2098 -#define SCI_AUTOCSHOW 2100 -#define SCI_AUTOCCANCEL 2101 -#define SCI_AUTOCACTIVE 2102 -#define SCI_AUTOCPOSSTART 2103 -#define SCI_AUTOCCOMPLETE 2104 -#define SCI_AUTOCSTOPS 2105 -#define SCI_AUTOCSETSEPARATOR 2106 -#define SCI_AUTOCGETSEPARATOR 2107 -#define SCI_AUTOCSELECT 2108 -#define SCI_AUTOCSETCANCELATSTART 2110 -#define SCI_AUTOCGETCANCELATSTART 2111 -#define SCI_AUTOCSETFILLUPS 2112 -#define SCI_AUTOCSETCHOOSESINGLE 2113 -#define SCI_AUTOCGETCHOOSESINGLE 2114 -#define SCI_AUTOCSETIGNORECASE 2115 -#define SCI_AUTOCGETIGNORECASE 2116 -#define SCI_USERLISTSHOW 2117 -#define SCI_AUTOCSETAUTOHIDE 2118 -#define SCI_AUTOCGETAUTOHIDE 2119 -#define SCI_SETINDENT 2122 -#define SCI_GETINDENT 2123 -#define SCI_SETUSETABS 2124 -#define SCI_GETUSETABS 2125 -#define SCI_SETLINEINDENTATION 2126 -#define SCI_GETLINEINDENTATION 2127 -#define SCI_GETLINEINDENTPOSITION 2128 -#define SCI_GETCOLUMN 2129 -#define SCI_SETHSCROLLBAR 2130 -#define SCI_GETHSCROLLBAR 2131 -#define SCI_SETINDENTATIONGUIDES 2132 -#define SCI_GETINDENTATIONGUIDES 2133 -#define SCI_SETHIGHLIGHTGUIDE 2134 -#define SCI_GETHIGHLIGHTGUIDE 2135 -#define SCI_GETLINEENDPOSITION 2136 -#define SCI_GETCODEPAGE 2137 -#define SCI_GETCARETFORE 2138 -#define SCI_GETUSEPALETTE 2139 -#define SCI_GETREADONLY 2140 -#define SCI_SETCURRENTPOS 2141 -#define SCI_SETSELECTIONSTART 2142 -#define SCI_GETSELECTIONSTART 2143 -#define SCI_SETSELECTIONEND 2144 -#define SCI_GETSELECTIONEND 2145 -#define SCI_SETPRINTMAGNIFICATION 2146 -#define SCI_GETPRINTMAGNIFICATION 2147 -#define SC_PRINT_NORMAL 0 -#define SC_PRINT_INVERTLIGHT 1 -#define SC_PRINT_BLACKONWHITE 2 -#define SC_PRINT_COLOURONWHITE 3 -#define SC_PRINT_COLOURONWHITEDEFAULTBG 4 -#define SCI_SETPRINTCOLOURMODE 2148 -#define SCI_GETPRINTCOLOURMODE 2149 -#define SCFIND_WHOLEWORD 2 -#define SCFIND_MATCHCASE 4 -#define SCFIND_WORDSTART 0x00100000 -#define SCFIND_REGEXP 0x00200000 -#define SCI_FINDTEXT 2150 -#define SCI_FORMATRANGE 2151 -#define SCI_GETFIRSTVISIBLELINE 2152 -#define SCI_GETLINE 2153 -#define SCI_GETLINECOUNT 2154 -#define SCI_SETMARGINLEFT 2155 -#define SCI_GETMARGINLEFT 2156 -#define SCI_SETMARGINRIGHT 2157 -#define SCI_GETMARGINRIGHT 2158 -#define SCI_GETMODIFY 2159 -#define SCI_SETSEL 2160 -#define SCI_GETSELTEXT 2161 -#define SCI_GETTEXTRANGE 2162 -#define SCI_HIDESELECTION 2163 -#define SCI_POINTXFROMPOSITION 2164 -#define SCI_POINTYFROMPOSITION 2165 -#define SCI_LINEFROMPOSITION 2166 -#define SCI_POSITIONFROMLINE 2167 -#define SCI_LINESCROLL 2168 -#define SCI_SCROLLCARET 2169 -#define SCI_REPLACESEL 2170 -#define SCI_SETREADONLY 2171 -#define SCI_NULL 2172 -#define SCI_CANPASTE 2173 -#define SCI_CANUNDO 2174 -#define SCI_EMPTYUNDOBUFFER 2175 -#define SCI_UNDO 2176 -#define SCI_CUT 2177 -#define SCI_COPY 2178 -#define SCI_PASTE 2179 -#define SCI_CLEAR 2180 -#define SCI_SETTEXT 2181 -#define SCI_GETTEXT 2182 -#define SCI_GETTEXTLENGTH 2183 -#define SCI_GETDIRECTFUNCTION 2184 -#define SCI_GETDIRECTPOINTER 2185 -#define SCI_SETOVERTYPE 2186 -#define SCI_GETOVERTYPE 2187 -#define SCI_SETCARETWIDTH 2188 -#define SCI_GETCARETWIDTH 2189 -#define SCI_SETTARGETSTART 2190 -#define SCI_GETTARGETSTART 2191 -#define SCI_SETTARGETEND 2192 -#define SCI_GETTARGETEND 2193 -#define SCI_REPLACETARGET 2194 -#define SCI_REPLACETARGETRE 2195 -#define SCI_SEARCHINTARGET 2197 -#define SCI_SETSEARCHFLAGS 2198 -#define SCI_GETSEARCHFLAGS 2199 -#define SCI_CALLTIPSHOW 2200 -#define SCI_CALLTIPCANCEL 2201 -#define SCI_CALLTIPACTIVE 2202 -#define SCI_CALLTIPPOSSTART 2203 -#define SCI_CALLTIPSETHLT 2204 -#define SCI_CALLTIPSETBACK 2205 -#define SCI_VISIBLEFROMDOCLINE 2220 -#define SCI_DOCLINEFROMVISIBLE 2221 -#define SC_FOLDLEVELBASE 0x400 -#define SC_FOLDLEVELWHITEFLAG 0x1000 -#define SC_FOLDLEVELHEADERFLAG 0x2000 -#define SC_FOLDLEVELNUMBERMASK 0x0FFF -#define SCI_SETFOLDLEVEL 2222 -#define SCI_GETFOLDLEVEL 2223 -#define SCI_GETLASTCHILD 2224 -#define SCI_GETFOLDPARENT 2225 -#define SCI_SHOWLINES 2226 -#define SCI_HIDELINES 2227 -#define SCI_GETLINEVISIBLE 2228 -#define SCI_SETFOLDEXPANDED 2229 -#define SCI_GETFOLDEXPANDED 2230 -#define SCI_TOGGLEFOLD 2231 -#define SCI_ENSUREVISIBLE 2232 -#define SCI_SETFOLDFLAGS 2233 -#define SCI_ENSUREVISIBLEENFORCEPOLICY 2234 -#define SCI_SETTABINDENTS 2260 -#define SCI_GETTABINDENTS 2261 -#define SCI_SETBACKSPACEUNINDENTS 2262 -#define SCI_GETBACKSPACEUNINDENTS 2263 -#define SC_TIME_FOREVER 10000000 -#define SCI_SETMOUSEDWELLTIME 2264 -#define SCI_GETMOUSEDWELLTIME 2265 -#define SCI_LINEDOWN 2300 -#define SCI_LINEDOWNEXTEND 2301 -#define SCI_LINEUP 2302 -#define SCI_LINEUPEXTEND 2303 -#define SCI_CHARLEFT 2304 -#define SCI_CHARLEFTEXTEND 2305 -#define SCI_CHARRIGHT 2306 -#define SCI_CHARRIGHTEXTEND 2307 -#define SCI_WORDLEFT 2308 -#define SCI_WORDLEFTEXTEND 2309 -#define SCI_WORDRIGHT 2310 -#define SCI_WORDRIGHTEXTEND 2311 -#define SCI_HOME 2312 -#define SCI_HOMEEXTEND 2313 -#define SCI_LINEEND 2314 -#define SCI_LINEENDEXTEND 2315 -#define SCI_DOCUMENTSTART 2316 -#define SCI_DOCUMENTSTARTEXTEND 2317 -#define SCI_DOCUMENTEND 2318 -#define SCI_DOCUMENTENDEXTEND 2319 -#define SCI_PAGEUP 2320 -#define SCI_PAGEUPEXTEND 2321 -#define SCI_PAGEDOWN 2322 -#define SCI_PAGEDOWNEXTEND 2323 -#define SCI_EDITTOGGLEOVERTYPE 2324 -#define SCI_CANCEL 2325 -#define SCI_DELETEBACK 2326 -#define SCI_TAB 2327 -#define SCI_BACKTAB 2328 -#define SCI_NEWLINE 2329 -#define SCI_FORMFEED 2330 -#define SCI_VCHOME 2331 -#define SCI_VCHOMEEXTEND 2332 -#define SCI_ZOOMIN 2333 -#define SCI_ZOOMOUT 2334 -#define SCI_DELWORDLEFT 2335 -#define SCI_DELWORDRIGHT 2336 -#define SCI_LINECUT 2337 -#define SCI_LINEDELETE 2338 -#define SCI_LINETRANSPOSE 2339 -#define SCI_LOWERCASE 2340 -#define SCI_UPPERCASE 2341 -#define SCI_LINESCROLLDOWN 2342 -#define SCI_LINESCROLLUP 2343 -#define SCI_MOVECARETINSIDEVIEW 2401 -#define SCI_LINELENGTH 2350 -#define SCI_BRACEHIGHLIGHT 2351 -#define SCI_BRACEBADLIGHT 2352 -#define SCI_BRACEMATCH 2353 -#define SCI_GETVIEWEOL 2355 -#define SCI_SETVIEWEOL 2356 -#define SCI_GETDOCPOINTER 2357 -#define SCI_SETDOCPOINTER 2358 -#define SCI_SETMODEVENTMASK 2359 -#define EDGE_NONE 0 -#define EDGE_LINE 1 -#define EDGE_BACKGROUND 2 -#define SCI_GETEDGECOLUMN 2360 -#define SCI_SETEDGECOLUMN 2361 -#define SCI_GETEDGEMODE 2362 -#define SCI_SETEDGEMODE 2363 -#define SCI_GETEDGECOLOUR 2364 -#define SCI_SETEDGECOLOUR 2365 -#define SCI_SEARCHANCHOR 2366 -#define SCI_SEARCHNEXT 2367 -#define SCI_SEARCHPREV 2368 -#define CARET_SLOP 0x01 -#define CARET_CENTER 0x02 -#define CARET_STRICT 0x04 -#define CARET_XEVEN 0x08 -#define CARET_XJUMPS 0x10 -#define SCI_SETCARETPOLICY 2369 -#define SCI_LINESONSCREEN 2370 -#define SCI_USEPOPUP 2371 -#define SCI_SELECTIONISRECTANGLE 2372 -#define SCI_SETZOOM 2373 -#define SCI_GETZOOM 2374 -#define SCI_CREATEDOCUMENT 2375 -#define SCI_ADDREFDOCUMENT 2376 -#define SCI_RELEASEDOCUMENT 2377 -#define SCI_GETMODEVENTMASK 2378 -#define SCI_SETFOCUS 2380 -#define SCI_GETFOCUS 2381 -#define SCI_SETSTATUS 2382 -#define SCI_GETSTATUS 2383 -#define SCI_SETMOUSEDOWNCAPTURES 2384 -#define SCI_GETMOUSEDOWNCAPTURES 2385 -#define SC_CURSORNORMAL -1 -#define SC_CURSORWAIT 3 -#define SCI_SETCURSOR 2386 -#define SCI_GETCURSOR 2387 -#define SCI_WORDPARTLEFT 2390 -#define SCI_WORDPARTLEFTEXTEND 2391 -#define SCI_WORDPARTRIGHT 2392 -#define SCI_WORDPARTRIGHTEXTEND 2393 -#define VISIBLE_SLOP 0x01 -#define VISIBLE_STRICT 0x04 -#define SCI_SETVISIBLEPOLICY 2394 -#define SCI_DELLINELEFT 2395 -#define SCI_DELLINERIGHT 2396 -#define SCI_GRABFOCUS 2400 -#define SCI_STARTRECORD 3001 -#define SCI_STOPRECORD 3002 -#define SCI_SETLEXER 4001 -#define SCI_GETLEXER 4002 -#define SCI_COLOURISE 4003 -#define SCI_SETPROPERTY 4004 -#define SCI_SETKEYWORDS 4005 -#define SCI_SETLEXERLANGUAGE 4006 -#define SC_MOD_INSERTTEXT 0x1 -#define SC_MOD_DELETETEXT 0x2 -#define SC_MOD_CHANGESTYLE 0x4 -#define SC_MOD_CHANGEFOLD 0x8 -#define SC_PERFORMED_USER 0x10 -#define SC_PERFORMED_UNDO 0x20 -#define SC_PERFORMED_REDO 0x40 -#define SC_LASTSTEPINUNDOREDO 0x100 -#define SC_MOD_CHANGEMARKER 0x200 -#define SC_MOD_BEFOREINSERT 0x400 -#define SC_MOD_BEFOREDELETE 0x800 -#define SC_MODEVENTMASKALL 0xF77 -#define SCEN_CHANGE 768 -#define SCEN_SETFOCUS 512 -#define SCEN_KILLFOCUS 256 -#define SCK_DOWN 300 -#define SCK_UP 301 -#define SCK_LEFT 302 -#define SCK_RIGHT 303 -#define SCK_HOME 304 -#define SCK_END 305 -#define SCK_PRIOR 306 -#define SCK_NEXT 307 -#define SCK_DELETE 308 -#define SCK_INSERT 309 -#define SCK_ESCAPE 7 -#define SCK_BACK 8 -#define SCK_TAB 9 -#define SCK_RETURN 13 -#define SCK_ADD 310 -#define SCK_SUBTRACT 311 -#define SCK_DIVIDE 312 -#define SCMOD_SHIFT 1 -#define SCMOD_CTRL 2 -#define SCMOD_ALT 4 -#define SCN_STYLENEEDED 2000 -#define SCN_CHARADDED 2001 -#define SCN_SAVEPOINTREACHED 2002 -#define SCN_SAVEPOINTLEFT 2003 -#define SCN_MODIFYATTEMPTRO 2004 -#define SCN_KEY 2005 -#define SCN_DOUBLECLICK 2006 -#define SCN_UPDATEUI 2007 -#define SCN_CHECKBRACE 2007 -#define SCN_MODIFIED 2008 -#define SCN_MACRORECORD 2009 -#define SCN_MARGINCLICK 2010 -#define SCN_NEEDSHOWN 2011 -#define SCN_POSCHANGED 2012 -#define SCN_PAINTED 2013 -#define SCN_USERLISTSELECTION 2014 -#define SCN_URIDROPPED 2015 -#define SCN_DWELLSTART 2016 -#define SCN_DWELLEND 2017 -//--Autogenerated -- end of section automatically generated from Scintilla.iface - -// Optional module for macro recording -#ifdef MACRO_SUPPORT -typedef void (tMacroRecorder)(unsigned int iMessage, unsigned long wParam, - long lParam, void *userData); -#endif - -// These structures are defined to be exactly the same shape as the Win32 -// CHARRANGE, TEXTRANGE, FINDTEXTEX, FORMATRANGE, and NMHDR structs. -// So older code that treats Scintilla as a RichEdit will work. - -struct CharacterRange { - long cpMin; - long cpMax; -}; - -struct TextRange { - struct CharacterRange chrg; - char *lpstrText; -}; - -struct TextToFind { - struct CharacterRange chrg; - char *lpstrText; - struct CharacterRange chrgText; -}; - -#ifdef PLATFORM_H - -// This structure is used in printing and requires some of the graphics types -// from Platform.h. Not needed by most client code. - -struct RangeToFormat { - SurfaceID hdc; - SurfaceID hdcTarget; - PRectangle rc; - PRectangle rcPage; - CharacterRange chrg; -}; - -#endif - -struct NotifyHeader { - // hwndFrom is really an environment specifc window handle or pointer - // but most clients of Scintilla.h do not have this type visible. - //WindowID hwndFrom; - void *hwndFrom; - unsigned int idFrom; - unsigned int code; -}; - -struct SCNotification { - struct NotifyHeader nmhdr; - int position; // SCN_STYLENEEDED, SCN_MODIFIED, SCN_DWELLSTART, SCN_DWELLEND - int ch; // SCN_CHARADDED, SCN_KEY - int modifiers; // SCN_KEY - int modificationType; // SCN_MODIFIED - const char *text; // SCN_MODIFIED - int length; // SCN_MODIFIED - int linesAdded; // SCN_MODIFIED -#ifdef MACRO_SUPPORT - int message; // SCN_MACRORECORD - uptr_t wParam; // SCN_MACRORECORD - sptr_t lParam; // SCN_MACRORECORD -#endif - int line; // SCN_MODIFIED - int foldLevelNow; // SCN_MODIFIED - int foldLevelPrev; // SCN_MODIFIED - int margin; // SCN_MARGINCLICK - int listType; // SCN_USERLISTSELECTION - int x; // SCN_DWELLSTART, SCN_DWELLEND - int y; // SCN_DWELLSTART, SCN_DWELLEND -}; - -#define SC_MASK_FOLDERS ((1< -#include -#include "commctrl.h" -#include "commdlg.h" -#include "editor.h" -#include "rsrc.h" - -extern CMessageBox MsgBox; - -int Minimum(int a, int b); -int Maximum(int a, int b); - -int Minimum(int a, int b){ - if (a < b) - return a; - else - return b; -} - -int Maximum(int a, int b){ - if (a > b) - return a; - else - return b; -} - -void EnsureRangeVisible(HWND hwndCtrl, int posStart, int posEnd, bool enforcePolicy){ - int lineStart = SendMessage(hwndCtrl, SCI_LINEFROMPOSITION, Minimum(posStart, posEnd), 0); - int lineEnd = SendMessage(hwndCtrl, SCI_LINEFROMPOSITION, Maximum(posStart, posEnd), 0); - for (int line = lineStart; line <= lineEnd; line++){ - SendMessage(hwndCtrl, - enforcePolicy ? SCI_ENSUREVISIBLEENFORCEPOLICY : SCI_ENSUREVISIBLE, line, 0); - } -} - -int LengthDocument(HWND hwndCtrl){ -return SendMessage(hwndCtrl, SCI_GETLENGTH, 0, 0); -} - -CharacterRange GetSelection(HWND hwndCtrl){ - CharacterRange crange; - crange.cpMin = SendMessage(hwndCtrl, SCI_GETSELECTIONSTART, 0, 0); - crange.cpMax = SendMessage(hwndCtrl, SCI_GETSELECTIONEND, 0, 0); -return crange; -} - - -/******************************************************************** -* Class: CChooseFontDlg. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CChooseFontDlg::CChooseFontDlg(){ - ZeroMemory(&lf, sizeof(LOGFONT)); -/* lf.lfHeight; - lf.lfWidth; - lf.lfEscapement; - lf.lfOrientation; - lf.lfWeight; - lf.lfItalic; - lf.lfUnderline; - lf.lfStrikeOut; - lf.lfCharSet; - lf.lfOutPrecision; - lf.lfClipPrecision; - lf.lfQuality; - lf.lfPitchAndFamily; - lf.lfFaceName[LF_FACESIZE];*/ - - cf.lStructSize = sizeof(CHOOSEFONT); - cf.hwndOwner = 0; - cf.hDC = NULL; - cf.lpLogFont = &lf;//&(Profile.LogFont); - cf.iPointSize = 0; - cf.Flags = /*CF_INITTOLOGFONTSTRUCT - |*/ CF_SCREENFONTS | CF_EFFECTS - /*| CF_ENABLEHOOK*/; - cf.rgbColors = 0;//Profile.rgbForeColor; - cf.lCustData = 0; - cf.lpfnHook = NULL; - cf.lpTemplateName = NULL; - cf.hInstance = NULL; - cf.lpszStyle = NULL; - cf.nFontType = SCREEN_FONTTYPE; - cf.nSizeMin = 0; - cf.nSizeMax = 0; -} - -CChooseFontDlg::~CChooseFontDlg(){ -} - -bool CChooseFontDlg::Create(CWindow * pWindow){ - cf.hwndOwner = pWindow->_hWnd; -return ChooseFont(&cf); -} - - -/*bool ChooseNewFont(HWND hWndListBox){ - static CHOOSEFONT cf; - static BOOL bFirstTime = TRUE; - HFONT hFont; - if(bFirstTime){ - bFirstTime = false; - } - if(ChooseFont(&cf)){ - HDC hDC; - hFont = CreateFontIndirect( &(Profile.LogFont) ); - hDC = GetDC( hWndListBox ); - SelectObject( hDC, hFont ); - Profile.rgbForeColor = cf.rgbColors; - InvalidateRect( hWndListBox, NULL, TRUE ); - SendMessage( hWndListBox, WM_CTLCOLORLISTBOX, (DWORD) hDC, (LONG) hWndListBox ); - SendMessage( hWndListBox, WM_SETFONT, (DWORD) hFont, TRUE ); - ReleaseDC( hWndListBox, hDC ); - } -return true; -}*/ - - -/******************************************************************** -* Class: CFindReplaceDlg. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CFindReplaceDlg::CFindReplaceDlg(){ - pEditor = NULL; - hEditor = 0; - resId = 0; - *findWhat = '\0'; - *replaceWhat = '\0'; - - bWholeWord = false; - bMatchCase = true; - bRegExp = false; - bWrapFind = false; - bUnSlash = false; - bReverseFind = false; - bHavefound = false; -} - -CFindReplaceDlg::~CFindReplaceDlg(){ -} - -HWND CFindReplaceDlg::Find(CScintilla * pEditor){ - if (_hWnd || !pEditor) - return 0; -return CreateParam(pEditor, IDD_FIND, (long) IDD_FIND); -} - -HWND CFindReplaceDlg::Replace(CScintilla * pEditor){ - if (_hWnd || !pEditor) - return 0; -return CreateParam(pEditor, IDD_REPLACE, (long) IDD_REPLACE); -} - -LRESULT CALLBACK CFindReplaceDlg::CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam){ - switch(Message){ - case WM_INITDIALOG: - return OnInitDialog((HWND) wParam, lParam); - - case WM_COMMAND: - OnCommand(HIWORD(wParam), LOWORD(wParam), (HWND) lParam); - break; - - case WM_CLOSE: - EndDlg(0); - break; - } -return FALSE; -} - -BOOL CFindReplaceDlg::OnInitDialog(HWND, LPARAM lInitParam){ - // Set pointers. - pEditor = (CEditor *) _pParent; - if (pEditor == NULL) - return TRUE; - - hEditor = pEditor->_hWnd; - resId = lInitParam; - - hFindWhat = GetItem(IDC_FINDWHAT); - hWholeWord = GetItem(IDC_WHOLEWORD); - hMatchCase = GetItem(IDC_MATCHCASE); - hRegExp = GetItem(IDC_REGEXP); - hWrap = GetItem(IDC_WRAP); - hUnSlash = GetItem(IDC_UNSLASH); - - if (resId == IDD_FIND) - return Find_OnInitDialog(); - else if (resId == IDD_REPLACE) - return Replace_OnInitDialog(); -return FALSE; -} - -BOOL CFindReplaceDlg::Find_OnInitDialog(void){ - - hUp = GetItem(IDC_DIRECTIONUP); - hDown = GetItem(IDC_DIRECTIONDOWN); - - SetItemText(hFindWhat, findWhat); - //FillComboFromMemory(wFindWhat, memFinds); - if (bWholeWord) - ::SendMessage(hWholeWord, BM_SETCHECK, BST_CHECKED, 0); - if (bMatchCase) - ::SendMessage(hMatchCase, BM_SETCHECK, BST_CHECKED, 0); - if (bRegExp) - ::SendMessage(hRegExp, BM_SETCHECK, BST_CHECKED, 0); - if (bWrapFind) - ::SendMessage(hWrap, BM_SETCHECK, BST_CHECKED, 0); - if (bUnSlash) - ::SendMessage(hUnSlash, BM_SETCHECK, BST_CHECKED, 0); - - if (bReverseFind) { - ::SendMessage(hUp, BM_SETCHECK, BST_CHECKED, 0); - } else { - ::SendMessage(hDown, BM_SETCHECK, BST_CHECKED, 0); - } -return TRUE; -} - -BOOL CFindReplaceDlg::Replace_OnInitDialog(void){ - SetItemText(hFindWhat, findWhat); - //FillComboFromMemory(wFindWhat, sci->memFinds); - - hReplaceWith = GetItem(IDC_REPLACEWITH); - SetItemText(hReplaceWith, replaceWhat); - //FillComboFromMemory(wReplaceWith, sci->memReplaces); - - if (bWholeWord) - ::SendMessage(hWholeWord, BM_SETCHECK, BST_CHECKED, 0); - if (bMatchCase) - ::SendMessage(hMatchCase, BM_SETCHECK, BST_CHECKED, 0); - if (bRegExp) - ::SendMessage(hRegExp, BM_SETCHECK, BST_CHECKED, 0); - if (bWrapFind) - ::SendMessage(hWrap, BM_SETCHECK, BST_CHECKED, 0); - if (bUnSlash) - ::SendMessage(hUnSlash, BM_SETCHECK, BST_CHECKED, 0); - if ((findWhat) != '\0'){ - ::SetFocus(hReplaceWith); - return FALSE; - } -return TRUE; -} - -BOOL CFindReplaceDlg::OnCommand(WORD, WORD wID, HWND){ - if (resId == IDD_FIND) - return Find_OnCommand(wID); - else if (resId == IDD_REPLACE) - return Replace_OnCommand(wID); -return FALSE; -} - -BOOL CFindReplaceDlg::Find_OnCommand(WORD wID){ - switch (wID){ - case IDOK: - char s[200]; - GetItemText(hFindWhat, s, sizeof(s)); - strcpy(findWhat, s); - //memFinds.Insert(s); - bWholeWord = BST_CHECKED == - ::SendMessage(hWholeWord, BM_GETCHECK, 0, 0); - bMatchCase = BST_CHECKED == - ::SendMessage(hMatchCase, BM_GETCHECK, 0, 0); - bRegExp = BST_CHECKED == - ::SendMessage(hRegExp, BM_GETCHECK, 0, 0); - bWrapFind = BST_CHECKED == - ::SendMessage(hWrap, BM_GETCHECK, 0, 0); - bUnSlash = BST_CHECKED == - ::SendMessage(hUnSlash, BM_GETCHECK, 0, 0); - bReverseFind = BST_CHECKED == - ::SendMessage(hUp, BM_GETCHECK, 0, 0); - - FindNext(bReverseFind, true); - return TRUE; - - case IDCANCEL: - EndDlg(IDCANCEL); - return FALSE; - } -return FALSE; -} - -BOOL CFindReplaceDlg::Replace_OnCommand(WORD wID){ - if (wID == IDCANCEL){ - EndDlg(IDCANCEL); - return FALSE; - }else{ - return HandleReplaceCommand(wID); - } -return FALSE; -} - -void CFindReplaceDlg::FindNext(bool reverseDirection, bool showWarnings){ - if (!hEditor){ - MsgBox.DisplayWarning("Can't get editor handle"); - return; - } - - if (!findWhat[0]) { // nothing to found - //Find(hEditor); - return; - } - char findTarget[FR_MAX_LEN + 1]; - strcpy(findTarget, findWhat); - - // for C conversions -> int lenFind = UnSlashAsNeeded(findTarget, unSlash, regExp); - int lenFind = strlen(findTarget); // normal return of UnSlashAsNeeded - - if (lenFind == 0) - return; - - CharacterRange cr = GetSelection(hEditor); - int startPosition = cr.cpMax; - int endPosition = LengthDocument(hEditor); - - if (reverseDirection){ - startPosition = cr.cpMin - 1; - endPosition = 0; - } - - int flags = (bWholeWord ? SCFIND_WHOLEWORD : 0) | - (bMatchCase ? SCFIND_MATCHCASE : 0) | - (bRegExp ? SCFIND_REGEXP : 0); - - ::SendMessage(hEditor, SCI_SETTARGETSTART, startPosition, 0); - ::SendMessage(hEditor, SCI_SETTARGETEND, endPosition, 0); - ::SendMessage(hEditor, SCI_SETSEARCHFLAGS, flags, 0); - int posFind = ::SendMessage(hEditor, SCI_SEARCHINTARGET, lenFind, (LPARAM) findTarget); - - if (posFind == -1 && bWrapFind){ // not found with wrapFind - - // Failed to find in indicated direction - // so search from the beginning (forward) or from the end (reverse) - // unless wrapFind is false - if (reverseDirection){ - startPosition = LengthDocument(hEditor); - endPosition = 0; - } else { - startPosition = 0; - endPosition = LengthDocument(hEditor); - } - ::SendMessage(hEditor, SCI_SETTARGETSTART, startPosition, 0); - ::SendMessage(hEditor, SCI_SETTARGETEND, endPosition, 0); - posFind = ::SendMessage(hEditor, SCI_SEARCHINTARGET, lenFind, (LPARAM) findTarget); - } - if (posFind == -1){ // not found - bHavefound = false; - if (showWarnings){ - - /*warn that not found - WarnUser(warnNotFound);*/ - - if (strlen(findWhat) > FR_MAX_LEN) - findWhat[FR_MAX_LEN] = '\0'; - char msg[FR_MAX_LEN + 50]; - strcpy(msg, "Cannot find the string \""); - strcat(msg, findWhat); - strcat(msg, "\"."); - if (_hWnd){ - MsgBox.DisplayWarning(msg); - }else{ - MessageBox(0, msg, "Message", MB_OK); - } - } - }else{ // found - bHavefound = true; - int start = ::SendMessage(hEditor, SCI_GETTARGETSTART, 0, 0); - int end = ::SendMessage(hEditor, SCI_GETTARGETEND, 0, 0); - EnsureRangeVisible(hEditor, start, end, true); - ::SendMessage(hEditor, SCI_SETSEL, start, end); - } -} - -BOOL CFindReplaceDlg::HandleReplaceCommand(int cmd){ - if (!hEditor){ - MsgBox.DisplayWarning("Can't get editor handle"); - return false; - } - - if ((cmd == IDOK) || (cmd == IDC_REPLACE) || (cmd == IDC_REPLACEALL) || (cmd == IDC_REPLACEINSEL)) { - GetItemText(hFindWhat, findWhat, sizeof(findWhat)); - //props.Set("find.what", findWhat); - //memFinds.Insert(findWhat); - - bWholeWord = BST_CHECKED == - ::SendMessage(hWholeWord, BM_GETCHECK, 0, 0); - bMatchCase = BST_CHECKED == - ::SendMessage(hMatchCase, BM_GETCHECK, 0, 0); - bRegExp = BST_CHECKED == - ::SendMessage(hRegExp, BM_GETCHECK, 0, 0); - bWrapFind = BST_CHECKED == - ::SendMessage(hWrap, BM_GETCHECK, 0, 0); - bUnSlash = BST_CHECKED == - ::SendMessage(hUnSlash, BM_GETCHECK, 0, 0); - } - if ((cmd == IDC_REPLACE) || (cmd == IDC_REPLACEALL) || (cmd == IDC_REPLACEINSEL)) { - GetItemText(hReplaceWith, replaceWhat, sizeof(replaceWhat)); - //memReplaces.Insert(replaceWhat); - } - - if (cmd == IDOK) { - FindNext(bReverseFind, true); // Find next - } else if (cmd == IDC_REPLACE) { - if (bHavefound){ - ReplaceOnce(); - } else { - CharacterRange crange = GetSelection(hEditor); - ::SendMessage(hEditor, SCI_SETSEL, crange.cpMin, crange.cpMin); - FindNext(bReverseFind, true); - if (bHavefound){ - ReplaceOnce(); - } - } - } else if ((cmd == IDC_REPLACEALL) || (cmd == IDC_REPLACEINSEL)){ - ReplaceAll(cmd == IDC_REPLACEINSEL); - } -return TRUE; -} - -void CFindReplaceDlg::ReplaceOnce(void){ - if (bHavefound){ - char replaceTarget[FR_MAX_LEN + 1]; - strcpy(replaceTarget, replaceWhat); - // for C conversions -> int replaceLen = UnSlashAsNeeded(replaceTarget, unSlash, regExp); - int replaceLen = strlen(replaceTarget); // normal return of UnSlashAsNeeded - - CharacterRange cr = GetSelection(hEditor); - ::SendMessage(hEditor, SCI_SETTARGETSTART, cr.cpMin, 0); - ::SendMessage(hEditor, SCI_SETTARGETEND, cr.cpMax, 0); - int lenReplaced = replaceLen; - if (bRegExp) - lenReplaced = ::SendMessage(hEditor, SCI_REPLACETARGETRE, replaceLen, (LPARAM) replaceTarget); - else // Allow \0 in replacement - ::SendMessage(hEditor, SCI_REPLACETARGET, replaceLen, (LPARAM) replaceTarget); - ::SendMessage(hEditor, SCI_SETSEL, cr.cpMin + lenReplaced, cr.cpMin); - bHavefound = false; - } - FindNext(bReverseFind, true); -} - -void CFindReplaceDlg::ReplaceAll(bool inSelection){ - char findTarget[FR_MAX_LEN + 1]; - strcpy(findTarget, findWhat); - - // for C conversions -> int findLen = UnSlashAsNeeded(findTarget, unSlash, regExp); - int findLen = strlen(findTarget); // normal return of UnSlashAsNeeded - - if (findLen == 0) { - MessageBox(_hWnd, "Find string for \"Replace All\" must not be empty.", "Message", MB_OK | MB_ICONWARNING); - return; - } - - CharacterRange cr = GetSelection(hEditor); - int startPosition = cr.cpMin; - int endPosition = cr.cpMax; - if (inSelection) { - if (startPosition == endPosition) { - MessageBox(_hWnd, "Selection for \"Replace in Selection\" must not be empty.", "Message", MB_OK | MB_ICONWARNING); - return; - } - } else { - endPosition = LengthDocument(hEditor); - if (bWrapFind) { - // Whole document - startPosition = 0; - } - // If not wrapFind, replace all only from caret to end of document - } - - char replaceTarget[FR_MAX_LEN + 1]; - strcpy(replaceTarget, replaceWhat); - - // for C conversions -> int replaceLen = UnSlashAsNeeded(replaceTarget, unSlash, regExp); - int replaceLen = strlen(replaceTarget); // normal return of UnSlashAsNeeded - - int flags = (bWholeWord ? SCFIND_WHOLEWORD : 0) | - (bMatchCase ? SCFIND_MATCHCASE : 0) | - (bRegExp ? SCFIND_REGEXP : 0); - ::SendMessage(hEditor, SCI_SETTARGETSTART, startPosition, 0); - ::SendMessage(hEditor, SCI_SETTARGETEND, endPosition, 0); - ::SendMessage(hEditor, SCI_SETSEARCHFLAGS, flags, 0); - int posFind = ::SendMessage(hEditor, SCI_SEARCHINTARGET, findLen, (LPARAM) findTarget); - if ((findLen == 1) && bRegExp && (findTarget[0] == '^')) { - // Special case for replace all start of line so it hits the first line - posFind = startPosition; - ::SendMessage(hEditor, SCI_SETTARGETSTART, startPosition, 0); - ::SendMessage(hEditor, SCI_SETTARGETEND, startPosition, 0); - } - if ((posFind != -1) && (posFind <= endPosition)) { - int lastMatch = posFind; - ::SendMessage(hEditor, SCI_BEGINUNDOACTION, 0, 0); - while (posFind != -1) { - int lenTarget = ::SendMessage(hEditor, SCI_GETTARGETEND, 0, 0) - ::SendMessage(hEditor, SCI_GETTARGETSTART, 0, 0); - int lenReplaced = replaceLen; - if (bRegExp) - lenReplaced = ::SendMessage(hEditor, SCI_REPLACETARGETRE, replaceLen, (LPARAM) replaceTarget); - else - ::SendMessage(hEditor, SCI_REPLACETARGET, replaceLen, (LPARAM) replaceTarget); - // Modify for change caused by replacement - endPosition += lenReplaced - lenTarget; - lastMatch = posFind + lenReplaced; - // For the special cases of start of line and end of line - // Something better could be done but there are too many special cases - if (lenTarget <= 0) - lastMatch++; - ::SendMessage(hEditor, SCI_SETTARGETSTART, lastMatch, 0); - ::SendMessage(hEditor, SCI_SETTARGETEND, endPosition, 0); - posFind = ::SendMessage(hEditor, SCI_SEARCHINTARGET, findLen, (LPARAM) findTarget); - } - if (inSelection) - ::SendMessage(hEditor, SCI_SETSEL, startPosition, endPosition); - else - ::SendMessage(hEditor, SCI_SETSEL, lastMatch, lastMatch); - ::SendMessage(hEditor, SCI_ENDUNDOACTION, 0, 0); - } else { - if (strlen(findWhat) > FR_MAX_LEN) - findWhat[FR_MAX_LEN] = '\0'; - char msg[FR_MAX_LEN + 50]; - strcpy(msg, "No replacements because string \""); - strcat(msg, findWhat); - strcat(msg, "\" was not present."); - MessageBox(_hWnd, msg, "Message", MB_OK | MB_ICONWARNING); - } -} - - -/******************************************************************** -* Class: CEditor. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CEditor::CEditor(){ - caretPos = 1; -} - -CEditor::~CEditor(){ -} - -void CEditor::LoadFile(CFileItem * file){ - if (!file || !_hWnd) - return; - - if (file->nFileOffset == 0) - return; // Untitled file. - - SetLexer(file->type); - ::SendMessage(_hWnd, SCI_CANCEL, 0, 0); - ::SendMessage(_hWnd, SCI_SETUNDOCOLLECTION, 0, 0); - - FILE *fp = fopen(file->szFileName, "rb"); - if (fp){ - char data[blockSize]; - int lenFile = fread(data, 1, sizeof(data), fp); - - while (lenFile > 0){ - ::SendMessage(_hWnd, SCI_ADDTEXT, lenFile, (LPARAM) data); - lenFile = fread(data, 1, sizeof(data), fp); - } - - fclose(fp); - - }else{ - MsgBox.DisplayWarning("Can't load file %s", file->szFileName); - } - - ::SendMessage(_hWnd, SCI_SETUNDOCOLLECTION, 1, 0); - ::SendMessage(_hWnd, EM_EMPTYUNDOBUFFER, 0, 0); - ::SendMessage(_hWnd, SCI_SETSAVEPOINT, 0 , 0); - ::SendMessage(_hWnd, SCI_GOTOPOS, 0, 0); -} - -void GetFileType(CFileItem * file){ - if (!file) - return; - - if (file->nFileExtension){ - char * ext = file->szFileName + file->nFileExtension; - // H_FILE ? - if (!stricmp(ext, "h")){ - file->type = H_FILE; - return; - }else if (!stricmp(ext, "hpp")){ - file->type = H_FILE; - return; - }else if (!stricmp(ext, "hxx")){ - file->type = H_FILE; - return; - // C_FILE ? - }else if (!stricmp(ext, "c")){ - file->type = C_FILE; - return; - }else if (!stricmp(ext, "cpp")){ - file->type = C_FILE; - return; - }else if (!stricmp(ext, "cxx")){ - file->type = C_FILE; - return; - // RC_FILE ? - }else if (!stricmp(ext, "rc")){ - file->type = RC_FILE; - return; - } - } - file->type = U_FILE; -return; -} - -void CEditor::SaveFile(char * fullPath){ - if (!_hWnd) - return; - - FILE *fp = fopen(fullPath, "wb"); - if (fp){ - char data[blockSize + 1]; - int lengthDoc = ::SendMessage(_hWnd, SCI_GETLENGTH, 0, 0); - for (int i = 0; i < lengthDoc; i += blockSize) { - int grabSize = lengthDoc - i; - if (grabSize > blockSize) - grabSize = blockSize; - GetRange(i, i + grabSize, data); - fwrite(data, grabSize, 1, fp); - } - fclose(fp); - ::SendMessage(_hWnd, SCI_SETSAVEPOINT, 0, 0); - - }else{ - MsgBox.DisplayWarning("Can't save file %s", fullPath); - } -} - -int CEditor::GetCurrentPos(void){ - int currentPos = ::SendMessage(_hWnd, SCI_GETCURRENTPOS, 0,0); - caretPos = ::SendMessage(_hWnd, SCI_LINEFROMPOSITION, currentPos, 0) + 1; -return caretPos; -} - -void CEditor::GetRange(int start, int end, char *text){ - TextRange tr; - tr.chrg.cpMin = start; - tr.chrg.cpMax = end; - tr.lpstrText = text; - ::SendMessage(_hWnd, SCI_GETTEXTRANGE, 0, (LPARAM) &tr); -} - -void CEditor::SetAStyle(int style, COLORREF fore, COLORREF back, int size, const char *face){ - ::SendMessage(_hWnd, SCI_STYLESETFORE, style, fore); - ::SendMessage(_hWnd, SCI_STYLESETBACK, style, back); - if (size >= 1) - ::SendMessage(_hWnd, SCI_STYLESETSIZE, style, size); - if (face) - ::SendMessage(_hWnd, SCI_STYLESETFONT, style, (LPARAM) face); -} - -void CEditor::DefineMarker(int marker, int markerType, COLORREF fore, COLORREF back) { - ::SendMessage(_hWnd, SCI_MARKERDEFINE, marker, markerType); - ::SendMessage(_hWnd, SCI_MARKERSETFORE, marker, fore); - ::SendMessage(_hWnd, SCI_MARKERSETBACK, marker, back); -} - -void CEditor::SetLexer(int fileType){ - switch (fileType){ - - case H_FILE: - case C_FILE: - case RC_FILE: - SetCppLexer(); - return; - - default: - // Global default style. - SetAStyle(STYLE_DEFAULT, black, white, 10, "Verdana"); - ::SendMessage(_hWnd, SCI_STYLECLEARALL, 0, 0); // Copies to all other styles. - - } -} - -void CEditor::SetCppLexer(void){ - ::SendMessage(_hWnd, SCI_SETLEXER, SCLEX_CPP, 0); - ::SendMessage(_hWnd, SCI_SETSTYLEBITS, 5, 0); - - ::SendMessage(_hWnd, SCI_SETKEYWORDS, 0, (LPARAM) cppKeyWords); - - // Global default style. - SetAStyle(STYLE_DEFAULT, black, white, 10, "Verdana"); - ::SendMessage(_hWnd, SCI_STYLECLEARALL, 0, 0); // Copies to all other styles. - - // C Styles. - SetAStyle(SCE_C_DEFAULT, black, white, 10, "Verdana"); //0 - SetAStyle(SCE_C_COMMENT, Green, white, 0, 0); //1 - SetAStyle(SCE_C_COMMENTLINE, Green, white, 0, 0); //2 - SetAStyle(SCE_C_COMMENTDOC, darkGreen, white, 0, 0); //3 - SetAStyle(SCE_C_NUMBER, Ice, white, 0, 0); //4 - SetAStyle(SCE_C_WORD, darkBlue, white, 0, 0); //5 - ::SendMessage(_hWnd, SCI_STYLESETBOLD, SCE_C_WORD, 1); - SetAStyle(SCE_C_STRING, Purple, white, 0, 0); //6 - SetAStyle(SCE_C_CHARACTER, Purple, white, 0, 0); //7 - SetAStyle(SCE_C_PREPROCESSOR, Olive, white, 0, 0); //9 - SetAStyle(SCE_C_OPERATOR, black, white, 0, 0); //10 - ::SendMessage(_hWnd, SCI_STYLESETBOLD, SCE_C_OPERATOR, 1); -// SetAStyle(SCE_C_STRINGEOL, darkBlue, white, 0, 0); //12 -// SetAStyle(SCE_C_COMMENTLINEDOC, darkBlue, white, 0, 0); //15 -// SetAStyle(SCE_C_WORD2, darkBlue, white, 0, 0); //16 - ::SendMessage(_hWnd, SCI_SETPROPERTY, (long)"fold", (long)"1"); - ::SendMessage(_hWnd, SCI_SETPROPERTY, (long)"fold.compact", (long)"1"); - ::SendMessage(_hWnd, SCI_SETPROPERTY, (long)"fold.symbols", (long)"1"); - - ::SendMessage(_hWnd, SCI_SETFOLDFLAGS, 16, 0); - - // To put the folder markers in the line number region - //SendEditor(SCI_SETMARGINMASKN, 0, SC_MASK_FOLDERS); - - ::SendMessage(_hWnd, SCI_SETMODEVENTMASK, SC_MOD_CHANGEFOLD, 0); - - // Create a margin column for the folding symbols - ::SendMessage(_hWnd, SCI_SETMARGINTYPEN, 2, SC_MARGIN_SYMBOL); - - ::SendMessage(_hWnd, SCI_SETMARGINWIDTHN, 2, /*foldMargin ? foldMarginWidth :*/ 16); - - ::SendMessage(_hWnd, SCI_SETMARGINMASKN, 2, SC_MASK_FOLDERS); - ::SendMessage(_hWnd, SCI_SETMARGINSENSITIVEN, 2, 1); - - DefineMarker(SC_MARKNUM_FOLDEROPEN, SC_MARK_MINUS, white, black); - DefineMarker(SC_MARKNUM_FOLDER, SC_MARK_PLUS, white, black); - DefineMarker(SC_MARKNUM_FOLDERSUB, SC_MARK_EMPTY, white, black); - DefineMarker(SC_MARKNUM_FOLDERTAIL, SC_MARK_EMPTY, white, black); - DefineMarker(SC_MARKNUM_FOLDEREND, SC_MARK_EMPTY, white, black); - DefineMarker(SC_MARKNUM_FOLDEROPENMID, SC_MARK_EMPTY, white, black); - DefineMarker(SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_EMPTY, white, black); - -return; -} - -void CEditor::GotoLine(int line, char * /*fileName*/){ - ::SendMessage(_hWnd, SCI_ENSUREVISIBLEENFORCEPOLICY, line, 0); - ::SendMessage(_hWnd, SCI_GOTOLINE, line, 0); -} - -bool CEditor::MarginClick(int position, int modifiers){ - int lineClick = ::SendMessage(_hWnd, SCI_LINEFROMPOSITION, position, 0); - //Platform::DebugPrintf("Margin click %d %d %x\n", position, lineClick, - // ::SendMessage(_hWnd, SCI_GETFOLDLEVEL, lineClick) & SC_FOLDLEVELHEADERFLAG); -/* if ((modifiers & SCMOD_SHIFT) && (modifiers & SCMOD_CTRL)) { - FoldAll(); - } else {*/ - int levelClick = ::SendMessage(_hWnd, SCI_GETFOLDLEVEL, lineClick, 0); - if (levelClick & SC_FOLDLEVELHEADERFLAG) { - if (modifiers & SCMOD_SHIFT) { - // Ensure all children visible - ::SendMessage(_hWnd, SCI_SETFOLDEXPANDED, lineClick, 1); - Expand(lineClick, true, true, 100, levelClick); - } else if (modifiers & SCMOD_CTRL) { - if (::SendMessage(_hWnd, SCI_GETFOLDEXPANDED, lineClick, 0)) { - // Contract this line and all children - ::SendMessage(_hWnd, SCI_SETFOLDEXPANDED, lineClick, 0); - Expand(lineClick, false, true, 0, levelClick); - } else { - // Expand this line and all children - ::SendMessage(_hWnd, SCI_SETFOLDEXPANDED, lineClick, 1); - Expand(lineClick, true, true, 100, levelClick); - } - } else { - // Toggle this line - ::SendMessage(_hWnd, SCI_TOGGLEFOLD, lineClick, 0); - } - } -/* }*/ - return true; -} - -void CEditor::Expand(int &line, bool doExpand, bool force, int visLevels, int level){ - int lineMaxSubord = ::SendMessage(_hWnd, SCI_GETLASTCHILD, line, level & SC_FOLDLEVELNUMBERMASK); - line++; - while (line <= lineMaxSubord) { - if (force) { - if (visLevels > 0) - ::SendMessage(_hWnd, SCI_SHOWLINES, line, line); - else - ::SendMessage(_hWnd, SCI_HIDELINES, line, line); - } else { - if (doExpand) - ::SendMessage(_hWnd, SCI_SHOWLINES, line, line); - } - int levelLine = level; - if (levelLine == -1) - levelLine = ::SendMessage(_hWnd, SCI_GETFOLDLEVEL, line, 0); - if (levelLine & SC_FOLDLEVELHEADERFLAG) { - if (force) { - if (visLevels > 1) - ::SendMessage(_hWnd, SCI_SETFOLDEXPANDED, line, 1); - else - ::SendMessage(_hWnd, SCI_SETFOLDEXPANDED, line, 0); - Expand(line, doExpand, force, visLevels - 1); - } else { - if (doExpand) { - if (!::SendMessage(_hWnd, SCI_GETFOLDEXPANDED, line, 0)) - ::SendMessage(_hWnd, SCI_SETFOLDEXPANDED, line, 1); - Expand(line, true, force, visLevels - 1); - } else { - Expand(line, false, force, visLevels - 1); - } - } - } else { - line++; - } - } -} - diff --git a/rosapps/devutils/vmingw/editor.h b/rosapps/devutils/vmingw/editor.h deleted file mode 100644 index c098f871963..00000000000 --- a/rosapps/devutils/vmingw/editor.h +++ /dev/null @@ -1,165 +0,0 @@ -/******************************************************************** -* Module: editor.h. This is part of Visual-MinGW. -* -* License: Visual-MinGW is covered by GNU General Public License, -* Copyright (C) 2001 Manu B. -* See license.htm for more details. -* -*******************************************************************/ -#ifndef EDITOR_H -#define EDITOR_H - -#include "Scintilla.h" -#include "SciLexer.h" -#include "winui.h" - -#define U_FILE 3 -#define H_FILE (U_FILE+1) -#define C_FILE (U_FILE+2) -#define RC_FILE (U_FILE+3) - -// Default block size. -const int blockSize = 131072; - -// Default colors. -const COLORREF black = RGB(0,0,0); -const COLORREF white = RGB(0xff,0xff,0xff); -const COLORREF darkBlue = RGB(0, 0, 0x7f); -const COLORREF Green = RGB(0, 0x7f, 0); -const COLORREF darkGreen = RGB(0x3f, 0x70, 0x3f); -const COLORREF Purple = RGB(0x7f, 0x00, 0x7f); -const COLORREF Ice = RGB(0x00, 0x7f, 0x7f); -const COLORREF Olive = RGB(0x7f, 0x7f, 0x00); - -// Default Cpp keywords. -const char cppKeyWords[] = -"asm auto bool break case catch char class const const_cast continue " -"default delete do double dynamic_cast else enum explicit export extern false float for " -"friend goto if inline int long mutable namespace new operator private protected public " -"register reinterpret_cast return short signed sizeof static static_cast struct switch " -"template this throw true try typedef typeid typename union unsigned using " -"virtual void volatile wchar_t while"; - -void EnsureRangeVisible(HWND hwndCtrl, int posStart, int posEnd, bool enforcePolicy); -int LengthDocument(HWND hwndCtrl); -CharacterRange GetSelection(HWND hwndCtrl); - -class CFileItem : public CNode -{ - public: - CFileItem(); - ~CFileItem(); - - // File name. - char szFileName[MAX_PATH]; - WORD nFileOffset; - WORD nFileExtension; - - // Owner tree view. - CTreeView * pTreeView; - HTREEITEM _hItem; - HTREEITEM _hDirItem; - - // Owner child window. - CMDIChild * pMdiChild; - int show; - bool isInProject; - - protected: - - private: -}; - -void GetFileType(CFileItem * file); - -class CEditor : public CScintilla -{ - public: - CEditor(); - ~CEditor(); - - void LoadFile(CFileItem * file); - void SaveFile(char * fullPath); - int GetCurrentPos(void); - void GotoLine(int line, char * fileName = NULL); - int caretPos; - void SetLexer(int fileType); - void SetCppLexer(void); - bool MarginClick(int position, int modifiers); - - protected: - - private: - void DefineMarker(int marker, int markerType, COLORREF fore, COLORREF back); - void GetRange(int start, int end, char *text); - void SetAStyle(int style, COLORREF fore, COLORREF back, int size, const char *face); - void Expand(int &line, bool doExpand, bool force = false, - int visLevels = 0, int level = -1); -}; - -#define FR_MAX_LEN 200 - -class CFindReplaceDlg : public CDlgBase -{ - public: - CFindReplaceDlg(); - virtual ~CFindReplaceDlg(); - - HWND Find(CScintilla * pEditor); - HWND Replace(CScintilla * pEditor); - - protected: - void FindNext(bool reverseDirection, bool showWarnings); - virtual LRESULT CALLBACK CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam); - BOOL OnInitDialog(HWND hwndFocus, LPARAM lInitParam); - BOOL Find_OnInitDialog(void); - BOOL Replace_OnInitDialog(void); - BOOL OnCommand(WORD wNotifyCode, WORD wID, HWND hwndCtl); - BOOL Find_OnCommand(WORD wIDl); - BOOL Replace_OnCommand(WORD wID); - BOOL HandleReplaceCommand(int cmd); - void ReplaceOnce(void); - void ReplaceAll(bool inSelection); - - private: - HWND hFindWhat; - HWND hReplaceWith; - HWND hWholeWord; - HWND hMatchCase; - HWND hRegExp; - HWND hWrap; - HWND hUnSlash; - HWND hUp; - HWND hDown; - char findWhat[FR_MAX_LEN + 1]; - char replaceWhat[FR_MAX_LEN + 1]; - - bool bWholeWord; - bool bMatchCase; - bool bRegExp; - bool bWrapFind; - bool bUnSlash; - bool bReverseFind; - bool bHavefound; - - CEditor * pEditor; - HWND hEditor; - int resId; -}; - -class CChooseFontDlg : public CWindow -{ - public: - CChooseFontDlg(); - ~CChooseFontDlg(); - - bool Create(CWindow * pWindow); - - protected: - CHOOSEFONT cf; - LOGFONT lf; - - private: -}; - -#endif diff --git a/rosapps/devutils/vmingw/license.htm b/rosapps/devutils/vmingw/license.htm deleted file mode 100644 index fefc521bf06..00000000000 --- a/rosapps/devutils/vmingw/license.htm +++ /dev/null @@ -1,121 +0,0 @@ - - - -Visual-MinGW license agreement. - - - - - -
- - - - - - - - - - - - -

Visual-MinGW's - license

- - - -

  - - - - - - - - - - - - -

 

Visual-MinGW - is a C/C++ Integrated Development Environment.
- Copyright (C) 2001  Manu B.

-

The following license - terms applies to Visual-MinGW:

-

This program is free software; - you can redistribute it and/or modify it - under the
terms of the GNU General Public - License version 2 as published by the Free -
- Software Foundation.

-

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., 59 Temple Place - Suite 330, Boston, - MA 02111-1307,USA.

-

 


 

Visual-MinGW - uses Neil Hodgson's - Scintilla - editing component as source - code
- editor.

-

The - following license terms applies to both - Scintilla - and SciTE.

-

 

License - for Scintilla and SciTE

- - - -
- - - - -

 

-

 

Copyright - 1998-2001 by Neil Hodgson <neilh@scintilla.org>

-

All Rights Reserved

-

Permission to use, copy, - modify, and distribute this software and - its
documentation for any purpose and - without fee is hereby granted,
provided - that the above copyright notice appear in - all copies and that
both that copyright - notice and this permission notice appear - in
supporting documentation.

-

NEIL HODGSON DISCLAIMS - ALL WARRANTIES WITH REGARD TO THIS
- SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES - OF MERCHANTABILITY
AND FITNESS, IN - NO EVENT SHALL NEIL HODGSON BE LIABLE FOR - ANY
SPECIAL, INDIRECT OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING - FROM LOSS OF USE, DATA OR PROFITS,
- WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - OR OTHER
TORTIOUS ACTION, ARISING OUT - OF OR IN CONNECTION WITH THE USE
OR - PERFORMANCE OF THIS SOFTWARE.

-

 

-

 

-

 

- - - \ No newline at end of file diff --git a/rosapps/devutils/vmingw/license.txt b/rosapps/devutils/vmingw/license.txt deleted file mode 100644 index efd4e80ea66..00000000000 --- a/rosapps/devutils/vmingw/license.txt +++ /dev/null @@ -1,59 +0,0 @@ -Visual-MinGW's license ----------------------- - -Visual-MinGW is a C/C++ Integrated Development Environment. -Copyright (C) 2001 Manu B. - -The following license terms applies to Visual-MinGW: - -This program is free software; you can redistribute it and/or modify it under the -terms of the GNU General Public License version 2 as published by the Free -Software Foundation. - -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., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA. - --------------------------------------------------------------------------------- - -Visual-MinGW uses Neil Hodgson's Scintilla editing component as source code -editor. - -The following license terms applies to both Scintilla and SciTE. - - -License for Scintilla and SciTE -------------------------------- - -Copyright 1998-2001 by Neil Hodgson - -All Rights Reserved - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation. - -NEIL HODGSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS -SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS, IN NO EVENT SHALL NEIL HODGSON BE LIABLE FOR ANY -SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE -OR PERFORMANCE OF THIS SOFTWARE. - - - - - - - - - diff --git a/rosapps/devutils/vmingw/main.cpp b/rosapps/devutils/vmingw/main.cpp deleted file mode 100644 index 17f80dfd6c3..00000000000 --- a/rosapps/devutils/vmingw/main.cpp +++ /dev/null @@ -1,2622 +0,0 @@ -/******************************************************************** -* Module: main.cpp. This is part of Visual-MinGW. -* -* Purpose: Main module. -* -* Authors: Manu B. -* -* License: Visual-MinGW is a C/C++ Integrated Development Environment. -* Copyright (C) 2001 Manu. -* -* 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, -* USA. -* -* (See license.htm for more details.) -* -* Revisions: -* Manu B. 12/15/01 CFileList created. -* -********************************************************************/ -#include -#include -#include -#include -#include "process.h" -#include "project.h" -#include "main.h" -#include "rsrc.h" - -#define MSG_MODIFIED "Modified" - -CCriticalSection CriticalSection; -extern CMessageBox MsgBox; -CFindReplaceDlg EditorDlg; -void Main_CmdTest(HWND hwnd); - -/* Globals */ -char * g_env_path = NULL; -char * g_vm_path = NULL; -CWinApp winApp; -CProject Project; -CChrono Chrono; - -// File filters & flags. -DWORD singleFileOpen = OFN_EXPLORER | OFN_FILEMUSTEXIST; -DWORD multipleFileOpen = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT; -DWORD fileSave = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | - OFN_OVERWRITEPROMPT; - -char * defFilter = "All Sources\0*.c;*.cpp;*.cxx;*.h;*.hpp;*.hxx;*.rc;*.mingw;*.prj\0" - "C Files\0*.c;*.cpp;*.cxx;*.rc\0" - "Headers\0*.h;*.hpp;*.hxx\0" - "Ini file\0*.ini\0" - "All Files (*.*)\0*.*\0\0"; - -char * prjFilter = "Project Files (*.prj)\0*.prj\0All Files (*.*)\0*.*\0\0"; -char * prjDefExt = "prj"; - -char * srcFilter = "All Sources\0*.c;*.cpp;*.cxx;*.h;*.hpp;*.hxx;*.rc\0" - "C Files\0*.c;*.cpp;*.cxx;*.rc\0" - "Headers\0*.h;*.hpp;*.hxx\0" - "All Files (*.*)\0*.*\0\0"; -char * srcDefExt = "cpp"; - -/* For tests */ - CChooseFontDlg CChooseFont; -void Main_CmdTest(HWND){ - winApp.Process.AddTask( - "sh.exe", - IN_PIPE || OUTERR_PIPE, - LVOUT_ERROR); - winApp.Process.Run(); -/* CChooseFont.Create(&winApp);*/ -return; -} - - -/******************************************************************** -* Class: CFileDlg. -* -* Purpose: A CFileDlgBase for Open/Save dlg boxes. -* -* Revisions: -* -********************************************************************/ -CFileDlg::CFileDlg(){ -} - -CFileDlg::~CFileDlg(){ -} - -bool CFileDlg::Open(CWindow * pWindow, char * pszFileName, DWORD nMaxFile, int fileflag){ - - switch(fileflag){ - // Project file. - case PRJ_FILE: - SetData(prjFilter, prjDefExt, singleFileOpen); - break; - - // Add multiple files to project. - case ADD_SRC_FILE: - Reset(); - SetTitle("Add files to project"); - nMaxFile = 2048; - SetFilterIndex(1); - SetData(srcFilter, srcDefExt, multipleFileOpen); - break; - - default: // SRC_FILE - SetData(defFilter, srcDefExt, singleFileOpen); - SetFilterIndex(1); - break; - } -return OpenFileName(pWindow, pszFileName, nMaxFile); -} - -bool CFileDlg::Save(CWindow * pWindow, char * pszFileName, DWORD nMaxFile, int fileflag){ - Reset(); - - switch(fileflag){ - case SRC_FILE: - SetData(defFilter, srcDefExt, fileSave); - SetFilterIndex(1); - break; - - default: // PRJ_FILE - SetData(prjFilter, prjDefExt, fileSave); - break; - } -return SaveFileName(pWindow, pszFileName, nMaxFile); -} - - -/******************************************************************** -* Class: CPreferencesDlg. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CPreferencesDlg::CPreferencesDlg(){ -} - -CPreferencesDlg::~CPreferencesDlg(){ -} - -int CPreferencesDlg::Create(void){ -return CreateModal(&winApp, IDD_PREFERENCES, (LPARAM) this); -} - -LRESULT CALLBACK CPreferencesDlg::CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam){ - switch(Message){ - case WM_INITDIALOG: - return OnInitDialog((HWND) wParam, lParam); - - case WM_NOTIFY: - OnNotify((int) wParam, (LPNMHDR) lParam); - break; - - case WM_COMMAND: - OnCommand(HIWORD(wParam), LOWORD(wParam), (HWND) lParam); - break; - - case WM_CLOSE: - EndDlg(0); - break; - } -return FALSE; -} - -BOOL CPreferencesDlg::OnInitDialog(HWND, LPARAM){ - // Tab control handle and TCITEM. - _hWndTab = ::GetDlgItem(_hWnd, IDC_PREF_TABS); - tcitem.mask = TCIF_TEXT | TCIF_PARAM; - - // Insert tabs. - HWND hwndChild = EnvDlg.Create(this, IDD_ENVIRON, NULL, (long) NULL); - tcitem.pszText = "Environment"; - tcitem.lParam = (long) &EnvDlg; - ::SendMessage(_hWndTab, TCM_INSERTITEM, 0, (LPARAM)&tcitem); - SetChildPosition(hwndChild); - -/* tcitem.pszText = "General"; - tcitem.lParam = (long) NULL; - ::SendMessage(_hWndTab, TCM_INSERTITEM, 1, (LPARAM)&tcitem); - - tcitem.pszText = "Find in files"; - tcitem.lParam = (long) NULL; - ::SendMessage(_hWndTab, TCM_INSERTITEM, 2, (LPARAM)&tcitem);*/ - - // Show the dialog and default pane. - Show(); - EnvDlg.Show(); - EnvDlg.SetFocus(); -return TRUE; -} - -BOOL CPreferencesDlg::OnCommand(WORD, WORD wID, HWND){ - switch (wID){ - case IDOK: - EnvDlg.OnCommand(0, wID, 0); - EndDlg(IDOK); - return TRUE; - - case IDCANCEL: - EndDlg(IDCANCEL); - return FALSE; - - case IDAPPLY: - EnvDlg.OnCommand(0, wID, 0); - return TRUE; - } -return FALSE; -} - -BOOL CPreferencesDlg::EndDlg(int nResult){ - EnvDlg.EndDlg(0); - EnvDlg.bIsVisible = false; - if (_hWnd){ - BOOL result = ::EndDialog(_hWnd, nResult); - _hWnd = 0; - return result; - } -return false; -} - - -/******************************************************************** -* Class: CEnvDlg. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CEnvDlg::CEnvDlg(){ -} - -CEnvDlg::~CEnvDlg(){ -} - -LRESULT CALLBACK CEnvDlg::CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam){ - switch(Message){ - case WM_INITDIALOG: - return OnInitDialog((HWND) wParam, lParam); - - case WM_COMMAND: - OnCommand(HIWORD(wParam), LOWORD(wParam), (HWND) lParam); - break; - } -return FALSE; -} - -BOOL CEnvDlg::OnInitDialog(HWND, LPARAM){ - bIsVisible = false; - bModified = false; - /* Get control handles */ - hApply = ::GetDlgItem(_pParent->_hWnd, IDAPPLY); - hSetCcBin = GetItem(IDC_SET_CCBIN); - hCcBinDir = GetItem(IDC_CCBIN); - hBrowseCc = GetItem(IDC_BROWSE_CC); - hSetCmdBin = GetItem(IDC_SET_CMDBIN); - hCmdBinDir = GetItem(IDC_CMDBIN); - hBrowseCmd = GetItem(IDC_BROWSE_CMD); - hAutoexec = GetItem(IDC_AUTOEXEC); - hEnvView = GetItem(IDC_ENV_VIEW); - - if (winApp.bSetCcEnv) - ::SendMessage(hSetCcBin, BM_SETCHECK, BST_CHECKED, 0); - if (winApp.bSetCmdEnv) - ::SendMessage(hSetCmdBin, BM_SETCHECK, BST_CHECKED, 0); - if (winApp.bSetDefEnv) - ::SendMessage(hAutoexec, BM_SETCHECK, BST_CHECKED, 0); - - SetItemText(hCcBinDir, winApp.szCcBinDir); - SetItemText(hCmdBinDir, winApp.szCmdBinDir); - SetEnvText(); -/* hCcIncDir = GetItem(IDC_CC_INCDIR); - - SetItemText(hCcIncDir, winApp.includeDir);*/ - bIsVisible = true; -return TRUE; -} - -BOOL CEnvDlg::OnCommand(WORD wNotifyCode, WORD wID, HWND){ - char directory[MAX_PATH]; - - switch (wID){ - case IDC_BROWSE_CC: - if (winApp.ShellDlg.BrowseForFolder(&winApp, directory, "Browse", - BIF_RETURNONLYFSDIRS)){ - SetItemText(hCcBinDir, directory); - } - return TRUE; - - case IDC_BROWSE_CMD: - if (winApp.ShellDlg.BrowseForFolder(&winApp, directory, "Browse", - BIF_RETURNONLYFSDIRS)){ - SetItemText(hCmdBinDir, directory); - } - return TRUE; - - case IDOK: - winApp.bSetCcEnv = - (BST_CHECKED==::SendMessage(hSetCcBin, BM_GETCHECK, 0, 0)); - winApp.bSetCmdEnv = - (BST_CHECKED==::SendMessage(hSetCmdBin, BM_GETCHECK, 0, 0)); - winApp.bSetDefEnv = - (BST_CHECKED==::SendMessage(hAutoexec, BM_GETCHECK, 0, 0)); - - GetItemText(hCcBinDir, winApp.szCcBinDir, MAX_PATH); - GetItemText(hCmdBinDir, winApp.szCmdBinDir, MAX_PATH); -// GetItemText(hCcIncDir, winApp.includeDir, MAX_PATH); - if (bModified) - winApp.SetEnv(); - return TRUE; - - case IDCANCEL: - return FALSE; - - case IDAPPLY: - if (bModified){ - winApp.bSetCcEnv = - (BST_CHECKED==::SendMessage(hSetCcBin, BM_GETCHECK, 0, 0)); - winApp.bSetCmdEnv = - (BST_CHECKED==::SendMessage(hSetCmdBin, BM_GETCHECK, 0, 0)); - winApp.bSetDefEnv = - (BST_CHECKED==::SendMessage(hAutoexec, BM_GETCHECK, 0, 0)); - - GetItemText(hCcBinDir, winApp.szCcBinDir, MAX_PATH); - GetItemText(hCmdBinDir, winApp.szCmdBinDir, MAX_PATH); - winApp.SetEnv(); - SetEnvText(); - bModified = false; - ::EnableWindow(hApply, false); - } - return TRUE; - - default: - if (bIsVisible && !bModified){ - switch(wNotifyCode){ - case EN_CHANGE: - case BN_CLICKED: - bModified = true; - ::EnableWindow(hApply, true); - return TRUE; - } - } - break; - } -return FALSE; -} - -void CEnvDlg::SetEnvText(void){ - if (g_vm_path){ - char * text = (char *) malloc(strlen(g_vm_path)+20); // 10 lines max. - char * start = text; - char * parse = g_vm_path; - while (*parse){ - if (*parse == ';'){ - // Change ';' into CR/LF. - *text = '\r'; - text++; - *text = '\n'; - text++; - parse++; - }else if (*parse == '='){ - // Rewind buffer. - text = start; - parse++; - }else{ - // Copy one char. - *text = *parse; - text++; - parse++; - } - } - *text = '\0'; - SetItemText(hEnvView, start); - free(start); - } -} - - -/******************************************************************** -* Class: CGrepDlg. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CGrepDlg::CGrepDlg(){ - *findWhat = '\0'; - *gDir = '\0'; -} - -CGrepDlg::~CGrepDlg(){ -} - -int CGrepDlg::Create(void){ -return CreateModal(&winApp, IDD_GREP, (LPARAM) this); -} - -LRESULT CALLBACK CGrepDlg::CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam){ - switch(Message){ - case WM_INITDIALOG: - return OnInitDialog((HWND) wParam, lParam); - - case WM_COMMAND: - OnCommand(HIWORD(wParam), LOWORD(wParam), (HWND) lParam); - break; - - case WM_CLOSE: - EndDlg(0); - break; - } -return FALSE; -} - -BOOL CGrepDlg::OnInitDialog(HWND, LPARAM){ - hFindWhat = GetItem(IDC_FINDWHAT); - hgDir = GetItem(IDC_GFILTER); - - SetItemText(hFindWhat, findWhat); - SetItemText(hgDir, gDir); - // Show the dialog and default pane. - Show(); -return TRUE; -} - -BOOL CGrepDlg::OnCommand(WORD, WORD wID, HWND){ - switch (wID){ - case IDOK: - GetItemText(hFindWhat, findWhat, sizeof(findWhat)); - GetItemText(hgDir, gDir, sizeof(gDir)); - FindInFiles(findWhat, gDir); - return TRUE; - - case IDCANCEL: - EndDlg(IDCANCEL); - return FALSE; - } -return FALSE; -} - -void CGrepDlg::FindInFiles(char * findWhat, char * fileFilter){ - if (!findWhat || !fileFilter || winApp.Process.isRunning()) - return; - - winApp.Report.Clear(); - winApp.Report.Append("Grep search...", LVOUT_NORMAL); - - winApp.Process.AddTask("grep -G -n -H ", OUTERR_PIPE, LVOUT_ERROR); - winApp.Process.CmdCat(findWhat); - winApp.Process.CmdCat(" "); - winApp.Process.CmdCat(fileFilter); - - winApp.Process.Run(); -} - - -/******************************************************************** -* Functions: WinMain procedure. -* -* Purpose: Runs the application. -* -* Revisions: -* -********************************************************************/ -int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ -return winApp.Run(hInstance, hPrevInstance, lpCmdLine, nCmdShow); -} - - -/******************************************************************** -* Class: CWinApp. -* -* Purpose: Manages the all application. -* -* Revisions: -* -********************************************************************/ -CWinApp::CWinApp(){ - *iniFileName = '\0'; - hmod = NULL; - *openFilesDir ='\0'; - *projectDir = '\0'; - *includeDir = '\0'; - bSetCcEnv = false; - bSetCmdEnv = false; - bSetDefEnv = false; - *szCcBinDir = '\0'; - *szCmdBinDir = '\0'; - - firstRun = false; - // Child windows dimensions. - deltaY = 0; - tbarHeight = 26; - sbarHeight = 20; - tvWidth = 140; - lvHeight = 120; - - hSplitter = 4; - vSplitter = 4; -} - -CWinApp::~CWinApp(){ -} - -bool CWinApp::CustomInit(void){ - /* Get PATH environment variable */ - char * env_path = getenv("PATH"); - if (env_path) - g_env_path = strdup(env_path); - - SetName("Visual MinGW", APP_VERSION); - MsgBox.SetCaption("Visual MinGW"); - IsWinNT(); - ReadIniFile("visual-mingw.ini"); - - hAccel = LoadAccelerators(_hInst, "ACCELS"); - hmod = LoadLibrary("SciLexer.DLL"); - if (!hmod){ - MsgBox.DisplayFatal("Unable to load SciLexer.DLL"); - return false; - } -return true; -} - -bool CWinApp::Release(void){ - WriteIniFile(); - if (hmod) - FreeLibrary(hmod); - if (g_env_path) - free(g_env_path); -return true; -} - -bool CWinApp::ReadIniFile(char * fileName){ - ParseCmdLine(iniFileName); - strcat(iniFileName, fileName); - - if (!IniFile.Load(iniFileName)){ - /* Create an empty file and fill it */ - firstRun = true; - MsgBox.DisplayWarning("Visual-MinGW first run !\n" - "Step 1: User interface initialization.\n" - "Please report bugs to Visual-MinGW home page.\n" - "See the Readme text for more information."); - FILE * file = fopen(iniFileName, "wb"); - if (!file) - return false; - SaveIniFile(file); - fclose(file); - return false; - } - // [General] section - IniFile.GetString(openFilesDir, "FilesDirectory", "General" ); - IniFile.GetString(projectDir, "ProjectDirectory" ); - bSetDefEnv = IniFile.GetInt( "SetDefEnv" ); - bSetCmdEnv = IniFile.GetInt( "SetBinDir" ); - IniFile.GetString(szCmdBinDir, "BinDir" ); - // [Compiler] section - IniFile.GetString(includeDir, "IncludeDir", "Compiler" ); - bSetCcEnv = IniFile.GetInt( "SetBinDir" ); - IniFile.GetString(szCcBinDir, "BinDir" ); - - SetEnv(); -return true; -} - -void CWinApp::SaveIniFile(FILE * file){ - // [General] - fprintf (file, "\t; Generated automatically by Visual-MinGW.\n"); - fprintf (file, "\t ; http://visual-mingw.sourceforge.net/\n"); - fprintf (file, "[General]\nSignature = 40"); - fprintf (file, "\nFilesDirectory = %s", openFilesDir); - fprintf (file, "\nProjectDirectory = %s", projectDir); - fprintf (file, "\nTvWidth = %d", tvWidth); - fprintf (file, "\nLvHeight = %d", lvHeight); - fprintf (file, "\nSetDefEnv = %d", bSetDefEnv); - fprintf (file, "\nSetBinDir = %d", bSetCmdEnv); - fprintf (file, "\nBinDir = %s", szCmdBinDir); - // [Compiler] - fprintf (file, "\n\n[Compiler]\nIncludeDir = %s", includeDir); - fprintf (file, "\nSetBinDir = %d", bSetCcEnv); - fprintf (file, "\nBinDir = %s", szCcBinDir); -} - -bool CWinApp::WriteIniFile(void){ - if (*iniFileName == '\0') - return false; - FILE * file = fopen(iniFileName, "wb"); - if (!file) - return false; - SaveIniFile(file); - fclose(file); - IniFile.Close(); -return true; -} - -bool CWinApp::SetEnv(void){ - // Free previous variable. - //getenv("PATH="); - // Malloc a buffer. - int len = 0; - if (bSetCcEnv) - len += strlen(winApp.szCcBinDir); - if (bSetCmdEnv) - len += strlen(winApp.szCmdBinDir); - if (bSetDefEnv && g_env_path) - len += strlen(g_env_path); - g_vm_path = (char *) malloc(len+8); - - // Copy the environment variable. - strcpy(g_vm_path, "PATH="); - if (bSetCcEnv && *winApp.szCcBinDir){ - strcat(g_vm_path, winApp.szCcBinDir); - strcat(g_vm_path, ";"); - } - if (bSetCmdEnv && *winApp.szCmdBinDir){ - strcat(g_vm_path, winApp.szCmdBinDir); - strcat(g_vm_path, ";"); - } - if (bSetDefEnv && g_env_path) - strcat(g_vm_path, g_env_path); - - len = strlen(g_vm_path) - 1; - if (g_vm_path[len] == ';') - g_vm_path[len] = '\0'; - if (putenv(g_vm_path) == -1){ - free(g_vm_path); - g_vm_path = NULL; - return false; - } -return true; -} - - -/******************************************************************** -* CWinApp: Create each application's window. -********************************************************************/ -bool CWinApp::CreateUI(void){ - - InitCommonControls(); - - // Custom values. - wc.style = 0; - wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); - wc.hCursor = NULL; - wc.hbrBackground = //NULL; - (HBRUSH)(COLOR_INACTIVEBORDER + 1); - wc.lpszMenuName = MAKEINTRESOURCE(ID_MENU); - wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); - - if(!MainRegisterEx("main_class")) { - MsgBox.DisplayFatal("Can't Register Main Window"); - return false; - } - - // Custom values. - wc.hbrBackground = NULL; - wc.lpszMenuName = 0; - - if(!ChildRegisterEx("child_class")) { - MsgBox.DisplayFatal("Can't Register MDI Class"); - return false; - } - - // Use a CreateWindowEx like procedure. - HWND hwnd = CreateEx( - this, // Owner class. - 0, - mainClass, - appName, - WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, - CW_USEDEFAULT, - CW_USEDEFAULT, - CW_USEDEFAULT, - CW_USEDEFAULT, - 0, - NULL); - - if(!hwnd) { - MsgBox.DisplayFatal("Can't create Main window"); - return false; - } - MsgBox.SetParent(hwnd); - - // SW_SHOWMAXIMIZED. - ::ShowWindow(hwnd, SW_SHOWMAXIMIZED); - ::UpdateWindow(hwnd); - if (firstRun) - FirstRunTest(); - firstRun = false; -return true; -} - -void CWinApp::FirstRunTest(void){ - MsgBox.DisplayWarning("Visual-MinGW first run !\n" - "Step 2: You will now set your environment variables.\n" - "\"Use default environment variables\" should be checked.\n" - "Then Visual-MinGW will try to launch the compiler."); - PreferencesDlg.Create(); - MsgBox.DisplayWarning("Visual-MinGW first run !\n" - "Step 3: Installation checking.\n" - "Try to launch rm and gcc.\n" - "See \"Main\" or \"Log\" report views for results.\n"); - winApp.Report.Clear(); - winApp.Report.Append("Testing for first run...", LVOUT_NORMAL); - - // Put the command line and the run flag in the command stack. - winApp.Process.AddTask("gcc -v", OUTERR_PIPE, LVOUT_NORMAL); - winApp.Process.AddTask("rm --version", OUTERR_PIPE, LVOUT_NORMAL); - winApp.Process.Run(); -return; -} - -void CWinApp::CreateToolbar(void){ - Toolbar.CreateEx( - this, - 0, - WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS - |TBSTYLE_FLAT | TBSTYLE_TOOLTIPS - | CCS_NORESIZE); - - Toolbar.AddBitmap(IDB_TOOLBAR, 15); - - TBBUTTON tbButtons [] = - { { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0, 0}, 0, 0}, - { 0, IDM_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0}, - { 1, IDM_OPEN, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0}, - { 2, IDM_SAVE, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0}, - { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0, 0}, 0, 0}, - { 3, IDM_CUT, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0}, - { 4, IDM_COPY, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0}, - { 5, IDM_PASTE, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0}, - { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0, 0}, 0, 0}, - { 6, IDM_UNDO, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0}, - { 7, IDM_REDO, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0} }; - - int numbutton = sizeof tbButtons/sizeof tbButtons[0]; - - Toolbar.AddButtons(&tbButtons[0], numbutton); -} - -void CWinApp::CreateSplitter(void){ - MainSplitter.Init(&ChildSplitter, &Report, SPLSTYLE_HORZ, lvHeight, SPLMODE_2); - ChildSplitter.Init(&Manager, &MdiClient, SPLSTYLE_VERT, tvWidth, SPLMODE_1); - - // File Manager. - Manager.Create(this); - // MDI client. - CreateMDI(); - // ListView. - Report.Create(this); -} - -void CWinApp::CreateMDI(void){ - MdiClient.Init(3, ID_FIRSTCHILD); - MdiClient.CreateEx( - this, - WS_EX_CLIENTEDGE, - WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS - | WS_VSCROLL | WS_HSCROLL - ); -} - -HWND CWinApp::CreateChild(char * caption, LPVOID lParam){ - - CChildView * mdiChild = new CChildView; - - HWND hwnd = mdiChild->CreateEx( - &MdiClient, // MUST be an MdiClient *. - WS_EX_MDICHILD, - MDIS_ALLCHILDSTYLES | WS_CHILD | WS_SYSMENU | WS_CAPTION - | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX - | WS_MAXIMIZE, - caption, - 0, - lParam); - - if (!hwnd) - delete mdiChild; -return hwnd; -} - -void CWinApp::CreateStatusBar(void){ - Sbar.CreateEx( - this, - 0, - WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | SBARS_SIZEGRIP); - - int sbWidths[] = {60, 120, -1}; - - int numparts = sizeof sbWidths/sizeof sbWidths[0]; - - Sbar.SetParts(numparts, &sbWidths[0]); -} - -void CWinApp::SendCaretPos(int caretPos) { - // To display the "Line : xxxx" message, we use our standard msgBuf[256]. - sprintf(msgBuf, "Line : %d", caretPos); - Sbar.SendMessage(SB_SETTEXT, 0, (LPARAM) msgBuf); -return; -} - - -/******************************************************************** -* CWinApp: Message handling procedures. -********************************************************************/ -LRESULT CALLBACK CWinApp::CMainWndProc(UINT Message, WPARAM wParam, LPARAM lParam){ - switch(Message){ - case WM_CREATE: - return OnCreate((LPCREATESTRUCT) lParam); - - case WM_PAINT: - return OnPaint((HDC) wParam); - - case WM_SIZE: - return OnSize(wParam, LOWORD(lParam), HIWORD(lParam)); - - case WM_DESTROY: - return OnDestroy(); - - case WM_COMMAND: - return OnCommand(wParam, lParam); - - case WM_CLOSE: - return OnClose(); - - case WM_NOTIFY: - return OnNotify((int) wParam, (LPNMHDR) lParam); - - case WM_LBUTTONDOWN: - return OnLButtonDown((short) LOWORD(lParam), (short) HIWORD(lParam), wParam); - - case WM_MOUSEMOVE: - return OnMouseMove((short) LOWORD(lParam), (short) HIWORD(lParam), wParam); - - case WM_LBUTTONUP: - return OnLButtonUp((short) LOWORD(lParam), (short) HIWORD(lParam), wParam); - - case WM_SETCURSOR: - OnSetCursor((HWND) wParam, (UINT) LOWORD(lParam), (UINT) HIWORD(lParam)); - return DefWindowProc(_hWnd, Message, wParam, lParam); - - default: - return DefFrameProc(_hWnd, MdiClient.GetId(), Message, wParam, lParam); - } -return 0; -} - -BOOL CWinApp::OnCreate(LPCREATESTRUCT){ - // Toolbar. - CreateToolbar(); - // Splitter. - CreateSplitter(); - // Statusbar. - CreateStatusBar(); -return TRUE; -} - -BOOL CWinApp::OnPaint(HDC){ - PAINTSTRUCT ps; - BeginPaint(_hWnd, &ps); - EndPaint(_hWnd, &ps); -return 0; -} - -BOOL CWinApp::OnSize(UINT, int width, int height){ - // TreeView and MDI Client delta-height. - deltaY = height-sbarHeight-lvHeight-vSplitter-tbarHeight; - - if (deltaY>3){ - Toolbar.SetPosition(0, - 0, 0, - width, tbarHeight, - 0); - - MainSplitter.SetPosition(0, - 0, tbarHeight, - width, height-tbarHeight-sbarHeight, - 0); - - Sbar.SetPosition(0, - 0, height-sbarHeight, - width, sbarHeight, - 0); - } - InvalidateRect(_hWnd, NULL, false); -return 0; -} - -BOOL CWinApp::OnDestroy(void){ - PostQuitMessage(0); -return 0; -} - -BOOL CWinApp::OnClose(void){ - if (IDCANCEL == Manager.SaveAll(IDASK)) // Ask to save. - return TRUE; // Cancelled by user. - ::DestroyWindow(_hWnd); -return 0; -} - -BOOL CWinApp::OnNotify(int idCtrl, LPNMHDR notify){ - Manager.OnNotify(idCtrl, notify); - Report.OnNotify(idCtrl, notify); -return 0; -} - -BOOL CWinApp::OnLButtonDown(short xPos, short yPos, UINT){ - MainSplitter.OnLButtonDown(_hWnd, xPos, yPos); - ChildSplitter.OnLButtonDown(_hWnd, xPos, yPos); -return 0; -} - -BOOL CWinApp::OnMouseMove(short xPos, short yPos, UINT){ - MainSplitter.OnMouseMove(_hWnd, xPos, yPos); - ChildSplitter.OnMouseMove(_hWnd, xPos, yPos); -return 0; -} - -BOOL CWinApp::OnLButtonUp(short xPos, short yPos, UINT){ - MainSplitter.OnLButtonUp(_hWnd, xPos, yPos); - ChildSplitter.OnLButtonUp(_hWnd, xPos, yPos); -return 0; -} - -BOOL CWinApp::OnSetCursor(HWND, UINT nHittest, UINT){ - if (nHittest == HTCLIENT) { - if (MainSplitter.OnSetCursor(_hWnd, 0)){ - return 0; - }else if (ChildSplitter.OnSetCursor(_hWnd, 0)){ - return 0; - }else{ - ::SetCursor(::LoadCursor(NULL, IDC_ARROW)); - } - } -return 0; -} - - -/******************************************************************** -* CWinApp: Dispatch command messages. -********************************************************************/ -BOOL CWinApp::OnCommand(WPARAM wParam, LPARAM lParam){ - int wID = LOWORD(wParam); - - switch (wID){ - /* File Menu */ - case IDM_NEW: - Manager.FilesView.New(); - break; - - case IDM_OPEN: - Manager.OpenFileDialog(); - break; - - case IDM_NEW_PROJECT: - Manager.NewProjectDialog(); - break; - - case IDM_OPEN_PROJECT: - Manager.OpenProjectDialog(); - break; - - case IDM_SAVE_PROJECT: - Manager.SaveProjectFiles(IDYES); - break; - - case IDM_CLOSE_PROJECT: - Manager.CloseProject(); - break; - - case IDM_PREFERENCES: - PreferencesDlg.Create(); - break; - - case IDM_QUIT: - PostMessage(_hWnd, WM_CLOSE, 0, 0); - break; - - /* Find Menu */ - case IDM_GREP: - GrepDlg.Create(); - break; - - /* Window Menu */ - case IDM_CASCADE: - PostMessage(MdiClient.GetId(), WM_MDICASCADE, 0, 0); - break; - case IDM_TILEHORZ: - PostMessage(MdiClient.GetId(), WM_MDITILE, MDITILE_HORIZONTAL, 0); - break; - case IDM_TILEVERT: - PostMessage(MdiClient.GetId(), WM_MDITILE, MDITILE_VERTICAL, 0); - break; - case IDM_ARRANGE: - PostMessage(MdiClient.GetId(), WM_MDIICONARRANGE, 0, 0); - break; - - /* Project Menu */ - case IDM_NEW_MODULE: - Project.NewModuleDlg(); - break; - - case IDM_ADD: - Project.AddFiles(); - break; - - case IDM_REMOVE_FILE: - Manager.RemoveProjectFile(); - break; - - case IDM_REMOVE_MODULE: - Manager.RemoveProjectModule(); - break; - - case IDM_OPTION: - Project.OptionsDlg(); - break; - - case IDM_ZIP_SRCS: - Project.ZipSrcs(); - break; - - case IDM_EXPLORE: - Project.Explore(_hWnd); - break; - - /* Build Menu */ - case IDM_BUILD: - Project.Build(); - break; - - case IDM_REBUILDALL: - Project.RebuildAll(); - break; - - case IDM_RUN_TARGET: - Project.RunTarget(); - break; - - case IDM_MKCLEAN: - Project.MakeClean(); - break; - - case IDM_MKF_BUILD: - Project.BuildMakefile(); - break; - - case IDM_RUN_CMD: - winApp.Process.CommandDlg.Create(); - break; - - case IDM_TEST: - Main_CmdTest(_hWnd); - break; - - default:{ - if (wID >= ID_FIRSTCHILD){ - DefFrameProc(_hWnd, MdiClient.GetId(), WM_COMMAND, wParam, lParam); - }else{ - HWND hChildWindow = (HWND) MdiClient.SendMessage(WM_MDIGETACTIVE); - - if (hChildWindow) - ::SendMessage(hChildWindow, WM_COMMAND, wParam, lParam); - } - } - } -return TRUE; -} - - -/******************************************************************** -* CWinApp: Handles child messages. -********************************************************************/ -LRESULT CALLBACK CWinApp::CChildWndProc(CWindow * pWnd, UINT Message, WPARAM wParam, LPARAM lParam){ - - CChildView * childView = (CChildView *) pWnd; - HWND hwndChild = childView->_hWnd; - - switch(Message){ - case WM_CREATE: - childView->OnCreate((LPCREATESTRUCT) lParam); - break; - - case WM_SIZE: - childView->OnSize(wParam, LOWORD(lParam), HIWORD(lParam)); - break; - - case WM_COMMAND: - childView->OnCommand(wParam, lParam); - break; - - case WM_DESTROY: - childView->OnDestroy(); - break; - - case WM_CLOSE: - if (childView->OnClose()){ - MdiClient.SendMessage(WM_MDIDESTROY,(WPARAM) hwndChild, 0); - } - return true; - - case WM_NOTIFY: - childView->OnNotify((int) wParam, (LPNMHDR) lParam); - break; - - case WM_SETFOCUS: - childView->OnSetFocus((HWND) wParam); - break; - - case WM_MDIACTIVATE: - childView->OnActivate((HWND) wParam, (HWND) lParam); - break; - } -return DefMDIChildProc(hwndChild, Message, wParam, lParam); -} - - -/******************************************************************** -* Class: CChildView. -* -* Purpose: MDI child window class. -* -* Revisions: -* -********************************************************************/ -CChildView::CChildView(){ - modified = false; -} - -CChildView::~CChildView(){ -} - -bool CChildView::OnCreate(LPCREATESTRUCT){ - CFileItem * file = (CFileItem *) GetLong(GWL_USERDATA); - - // Create Scintilla Editor Control. - HWND hwnd = Editor.CreateEx( - this, - 0, - WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS - | WS_VSCROLL | WS_HSCROLL); - - if (!hwnd) - return false; // @@TODO need to manage creation failure. - - // Set window handles - file->pMdiChild = this; - - // Load a file if there is one to load. - Editor.LoadFile(file); -return true; -} - -bool CChildView::OnSize(UINT wParam, int width, int height){ - if(wParam != SIZE_MINIMIZED){ - Editor.SetPosition(0, - 0, - 0, - width, - height, - 0); - } -return true; -} - -BOOL CChildView::OnClose(void){ - if (modified){ - int decision = MsgBox.AskToSave(true); - switch (decision){ - case IDCANCEL: - return FALSE; - - case IDYES: - CmdSave(); - break; - } - } -return TRUE; -} - -BOOL CChildView::OnDestroy(void){ - CFileItem * file = (CFileItem*) GetLong(GWL_USERDATA); - - if (file){ - if (!file->isInProject){ - // A simple file. - winApp.Manager.FilesView.CloseFile(file); - }else{ - // A project one. - file->pMdiChild = NULL; - //modified = false; - } - } -return 0; -} - -BOOL CChildView::OnNotify(int, LPNMHDR notify){ - SCNotification * notification = (SCNotification *) notify; - - // Notify Message from Current Editor Control. - if (notify->hwndFrom == Editor._hWnd){ - switch (notify->code){ - case SCN_UPDATEUI: - Editor.GetCurrentPos(); - winApp.SendCaretPos(Editor.caretPos); - break; - - case SCN_SAVEPOINTREACHED: - modified = false; - winApp.Sbar.WriteString("", 1); - break; - - case SCN_SAVEPOINTLEFT: - modified = true; - winApp.Sbar.WriteString(MSG_MODIFIED, 1); - break; - - case SCN_MARGINCLICK: - if (notification->margin == 2) - Editor.MarginClick(notification->position, notification->modifiers); - break; - } - } -return 0; -} - -BOOL CChildView::OnSetFocus(HWND){ - CFileItem * file = (CFileItem*) GetLong(GWL_USERDATA); - if (!file) - return false; - // Select corresponding TreeView item. - CTreeView * pTreeView = file->pTreeView; - - if(!pTreeView) - return false; - - pTreeView->SendMessage(TVM_SELECTITEM, (WPARAM)TVGN_CARET, (LPARAM)file->_hItem); - - // Set Focus on Editor Control. - Editor.SetFocus(); - - // Display "Modified" message or nothing in the Status Bar. - winApp.SendCaretPos(Editor.caretPos); - - if(modified) - winApp.Sbar.SendMessage(SB_SETTEXT, 1, (LPARAM) MSG_MODIFIED); - else - winApp.Sbar.SendMessage(SB_SETTEXT, 1, (LPARAM) ""); - - int selectedTab = winApp.Manager.SendMessage(TCM_GETCURSEL); - - if (file->isInProject == true && selectedTab != PROJECT_TAB){ - winApp.Manager.SendMessage(TCM_SETCURFOCUS, PROJECT_TAB); - }else if (file->isInProject == false && selectedTab != FILES_TAB){ - winApp.Manager.SendMessage(TCM_SETCURFOCUS, FILES_TAB); - } -return 0; -} - -BOOL CChildView::OnActivate(HWND, HWND hwndChildAct){ - HMENU hMenu; - HMENU hFileMenu; - BOOL EnableFlag; - HWND hwndMain = winApp._hWnd; - - hMenu = GetMenu(hwndMain); - - if(_hWnd == hwndChildAct){ - EnableFlag = TRUE; //being activated - }else{ - EnableFlag = FALSE; //being de-activated - } - // Menu items. - EnableMenuItem(hMenu, 1, MF_BYPOSITION | (EnableFlag ? MF_ENABLED : MF_GRAYED)); - EnableMenuItem(hMenu, 3, MF_BYPOSITION | (EnableFlag ? MF_ENABLED : MF_GRAYED)); - - // Sub-menu items. - hFileMenu = GetSubMenu(hMenu, 0); - EnableMenuItem(hFileMenu, IDM_SAVE, MF_BYCOMMAND | (EnableFlag ? MF_ENABLED : MF_GRAYED)); - EnableMenuItem(hFileMenu, IDM_SAVEAS, MF_BYCOMMAND | (EnableFlag ? MF_ENABLED : MF_GRAYED)); - hFileMenu = GetSubMenu(hMenu, 2); - EnableMenuItem(hFileMenu, IDM_FIND, MF_BYCOMMAND | (EnableFlag ? MF_ENABLED : MF_GRAYED)); - EnableMenuItem(hFileMenu, IDM_REPLACE, MF_BYCOMMAND | (EnableFlag ? MF_ENABLED : MF_GRAYED)); - DrawMenuBar(hwndMain); -return 0; -} - -void CChildView::CmdSave(void){ - CFileItem * file = (CFileItem*) GetLong(GWL_USERDATA); - - if (!file) - return; - /* Untitled file ? */ - if (file->nFileOffset == 0){ - CmdSaveAs(); - return; - } - - if (!file->isInProject){ - // A simple file. - Editor.SaveFile(file->szFileName); - }else{ - // A project one. - Project.szDirBuffer[Project.nFileOffset - 1] = '\\'; - strcpy(&Project.szDirBuffer[Project.nFileOffset], file->szFileName); - Editor.SaveFile(Project.szDirBuffer); - Project.szDirBuffer[Project.nFileOffset - 1] = '\0'; - } -} - -void CChildView::CmdSaveAs(void){ - CFileItem * file = (CFileItem*) GetLong(GWL_USERDATA); - if (!file) - return; - - char fileName[MAX_PATH]; - if (!winApp.FileDlg.Save(&winApp, fileName, MAX_PATH, SRC_FILE)) //@@ - return; // canceled by user - - ::SetWindowText(_hWnd, fileName); - strcpy(file->szFileName, fileName); - - Editor.SaveFile(file->szFileName); - //@@ TODO we need to check for errors -} - -BOOL CChildView::OnCommand(WPARAM wParam, LPARAM){ - CFileItem * file = (CFileItem*) GetLong(GWL_USERDATA); - - if(!file) - return false; - - switch (LOWORD(wParam)){ - case IDM_SAVE: - CmdSave(); - break; - - case IDM_SAVEAS: - CmdSaveAs(); - break; - - case IDM_SAVEALL: - winApp.Manager.SaveAll(IDYES); // Silent. - break; - -/* case IDM_CLOSE: - PostMessage(pWnd, WM_CLOSE, 0, 0); - break; -*/ - // To Scintilla control. - case IDM_FIND: - EditorDlg.Find(&Editor); - break; - - case IDM_REPLACE: - EditorDlg.Replace(&Editor); - break; - - case IDM_CUT: - Editor.SendMessage(SCI_CUT); - break; - case IDM_COPY: - Editor.SendMessage(SCI_COPY); - break; - case IDM_PASTE: - Editor.SendMessage(SCI_PASTE); - break; - case IDM_UNDO: - Editor.SendMessage(SCI_UNDO); - break; - case IDM_REDO: - Editor.SendMessage(SCI_REDO); - break; - case IDM_SELECTALL: - Editor.SendMessage(SCI_SELECTALL); - break; - } -return TRUE; -} - - -/******************************************************************** -* Class: CManager. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CManager::CManager(){ -} - -CManager::~CManager(){ -} - -void CManager::OpenFileDialog(void){ - CFileItem * file = new CFileItem; - - /* Show the "Open file" dialog */ - winApp.FileDlg.Reset(); - winApp.FileDlg.SetInitialDir(winApp.openFilesDir); - - if(!winApp.FileDlg.Open(&winApp, file->szFileName, MAX_PATH, SRC_FILE)){ - delete file; - return; // canceled by user - } - - /* Get file information */ - file->nFileExtension = winApp.FileDlg.GetFileExtension(); - file->nFileOffset = winApp.FileDlg.GetFileOffset(); - GetFileType(file); - // Copy file directory. - strncpy(winApp.openFilesDir, file->szFileName, (file->nFileOffset - 1)); - winApp.openFilesDir[file->nFileOffset-1] = '\0'; - - /* Load the file */ - if(!OpenFile(file)){ - delete file; - MsgBox.DisplayString("This file is already opened."); - } -} - -bool CManager::OpenFile(CFileItem * file){ - if (!file) - return false; - - if (!file->isInProject){ - if (!FilesView.OpenFile(file)) - return false; - }else{ - if (!ProjectView.OpenFile(file)) - return false; - } -return true; -} - -bool CManager::NewProjectDialog(void){ - if(IDYES == Project.CloseDecision()) - CloseProject(); - - char fileName[MAX_PATH]; - WORD fileOffset; - *fileName = '\0'; - - - if (!winApp.FileDlg.Save(&winApp, fileName, MAX_PATH, PRJ_FILE)){ - return false; // canceled by user - } - // Copy prj file's directory. - fileOffset = winApp.FileDlg.GetFileOffset(); - - ProjectView.CreateRoot("Project"); - if (!Project.New(fileName, fileOffset)){ - ProjectView.DestroyRoot(); - ProjectView.DestroyList(); - return false; - } -return true; -} - -bool CManager::OpenProjectDialog(void){ - if(IDYES == Project.CloseDecision()) - CloseProject(); - - char fileName[MAX_PATH]; - WORD offset; - *fileName = '\0'; - - // Load default values. - winApp.FileDlg.Reset(); - winApp.FileDlg.SetInitialDir(winApp.projectDir); - - if (!winApp.FileDlg.Open(&winApp, fileName, MAX_PATH, PRJ_FILE)){ - return false; // canceled by user - } - // Copy project file's directory. - offset = winApp.FileDlg.GetFileOffset(); - - // Initialize project tree view. - ProjectView.CreateRoot(fileName+offset); - - if (!Project.Open(fileName, offset)){ - ProjectView.DestroyRoot(); - ProjectView.DestroyList(); - return false; - } -return true; -} - -bool CManager::CloseProject(void){ -return ProjectView.Close(); -} - -void CManager::RemoveProjectFile(void){ - ProjectView.RemoveFile(); -} - -void CManager::RemoveProjectModule(void){ - ProjectView.RemoveModule(); -} - -int CManager::SaveProjectFiles(int decision){ -return ProjectView.SaveAll(decision); -} - -int CManager::SaveAll(int decision){ - /* Save open files ? */ - decision = FilesView.SaveAll(decision); - /* Save project files ? */ - decision = ProjectView.SaveAll(decision); -return decision; -} - -void CManager::CreateImageList(void){ - // Create an empty image list. - ImgList.Create(16, 16, ILC_COLORDDB|ILC_MASK, 8, 1); - - // Load treeview bmp and add it to the image list. - CBitmap tvBitmap; - tvBitmap.Load(this, IDB_TREEVIEW); - ImgList.AddMasked(&tvBitmap, RGB(255,0,255)); - - // We no longer need treeview bmp. - tvBitmap.Destroy(); -} - -void CManager::Create(CWindow * pParent){ - // Create the Tab Control. - CreateEx( - pParent, - WS_EX_CLIENTEDGE, - WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS - | TCS_BOTTOM | TCS_FOCUSNEVER); - - // Give it the default font, create tabs, select first one and show the control. - SendMessage(WM_SETFONT, (long) GetStockObject(DEFAULT_GUI_FONT), 0); - - InsertItem(FILES_TAB, TCIF_TEXT, 0, 0, "Files", 16, 0, 0); - InsertItem(PROJECT_TAB, TCIF_TEXT, 0, 0, "Project", 16, 0, 0); - Show(); - - // Create an Image list and then the Project TreeView. - CreateImageList(); - ProjectView.Create(this, &ImgList); - SetItem_Param(PROJECT_TAB, (long) &ProjectView); - FilesView.Create(this, &ImgList); - SetItem_Param(FILES_TAB, (long) &FilesView); -} - -bool CManager::SetPosition(HWND, int x, int y, int width, int height, UINT){ - /* Overwrites CTabCtrl::SetPosition() so that all child windows are also resized */ - - // Tab Control. - ::SetWindowPos(_hWnd, 0, - x, - y, - width, - height, - 0); - // Child windows. - RECT Rect; - ::GetClientRect(_hWnd, &Rect); - ProjectView.SetPosition(0, Rect.top +5, Rect.left +5, - Rect.right-10, Rect.bottom-30, 0); - - FilesView.SetPosition(0, Rect.top +5, Rect.left +5, - Rect.right-10, Rect.bottom-30, 0); -return true; -} - -BOOL CManager::OnNotify(int, LPNMHDR notify){ - // Dispatch messages. - switch (notify->code){ - // Tab Control. - case TCN_SELCHANGING: - OnSelChanging(notify); - break; - - case TCN_SELCHANGE: - OnSelChange(notify); - break; - - // TreeView. - case TVN_SELCHANGED: - Tv_OnSelchanged((LPNMTREEVIEW) notify); - break; - } -return TRUE; -} - -void CManager::OnSelChanging(LPNMHDR notify){ - if (_hWnd == notify->hwndFrom){ - CTreeView * pTreeView = (CTreeView *) GetItem_Param(GetCurSel()); - if (pTreeView){ - pTreeView->Hide(); - } - } -} - -void CManager::OnSelChange(LPNMHDR notify){ - if (_hWnd == notify->hwndFrom){ - CTreeView * pTreeView = (CTreeView *) GetItem_Param(GetCurSel()); - if (pTreeView){ - pTreeView->Show(); - } - } -} - -void CManager::Tv_OnSelchanged(LPNMTREEVIEW notify){ - // Get lParam of current tree item. - CFileItem * file = (CFileItem *) notify->itemNew.lParam; - - if (file){ - CChildView * pMdiChild = (CChildView *) file->pMdiChild; - - if(pMdiChild){ - // An editor, focus it. - ::SetFocus((HWND) pMdiChild->_hWnd); - }else{ - // No editor, the item is part of a project. - Project.SwitchCurrentDir(); - winApp.CreateChild(file->szFileName, file); - } - } -} - - -/******************************************************************** -* Class: CFilesView. -* -* Purpose: Open files TreeView. -* -* Revisions: -* -********************************************************************/ -CFilesView::CFilesView(){ - hRoot = NULL; -} - -CFilesView::~CFilesView(){ -} - -void CFilesView::New(void){ - CFileItem * file = new CFileItem; - if(!winApp.Manager.OpenFile(file)){ - delete file; - MsgBox.DisplayString("Untitled file already exist."); - } -} - -bool CFilesView::OpenFile(CFileItem * file){ - if (!file) - return false; - - int listAction; - char * fileName = file->szFileName + file->nFileOffset; - - /* Untitled file ? */ - if (file->nFileOffset == 0){ - //@@TODO add a counter to get Untitled01, 02, etc... - strcpy(file->szFileName, "Untitled"); - } - - /* Check if this file is already opened */ - listAction = InsertSorted_New(file); - - if (listAction == FILE_FOUND){ - /* Focus the editor window */ - CFileItem * currentFile = (CFileItem *) GetCurrent(); - if (currentFile){ - CMDIChild * pMdiChild = currentFile->pMdiChild; - if (pMdiChild) - pMdiChild->SetFocus(); - } - return false; - } - - /* Create the editor window */ - if (!winApp.CreateChild(file->szFileName, file)){ - MsgBox.DisplayFatal("Can't create child window"); - return false; - } - // Note: A WM_SETFOCUS message will be send to the child window. - - /* Append the file to the list */ - InsertLast(file); - - /* Create a Tree View item */ - file->_hItem = CreateItem( - hRoot, //@@ use a GetRootItem() ? - TVI_LAST, - file->type, - fileName, - (LPARAM) file); - - file->pTreeView = this; -return true; -} - -void CFilesView::CloseFile(CFileItem * file){ - SendMessage(TVM_DELETEITEM, 0, (LPARAM) file->_hItem); - Destroy(file); -} - -int CFilesView::SaveAll(int decision){ - if (decision == IDNO || decision == IDCANCEL) - return decision; - CFileItem * file = (CFileItem*) First(); - while (file){ - if (file->pMdiChild){ - CChildView * childView = (CChildView *) file->pMdiChild; - /* Modified ? */ - if (childView->modified){ - /* Ask ? */ - if (decision == IDASK){ - decision = MsgBox.AskToSave(true); // Cancel button. - if (decision != IDYES) - return decision; // IDNO or IDCANCEL. - } - childView->CmdSave(); - } - } - file = (CFileItem*) Next(); - } -return decision; -} - -HWND CFilesView::Create(CWindow * pParent, CImageList * imgList){ - // Create TreeView. - CreateEx( - pParent, - WS_EX_CLIENTEDGE, - WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS - | TVS_EDITLABELS | TVS_HASLINES | TVS_HASBUTTONS, - 0, - (void*) 12); - - // Assign the image list to the treeview control. - SendMessage(TVM_SETIMAGELIST, (long)TVSIL_NORMAL, (long) imgList->GetId()); - hRoot = CreateItem(TVI_ROOT, TVI_LAST, WORKSPACE, "Workspace", 0); -return _hWnd; -} - - -/******************************************************************** -* Class: CProjectView. -* -* Purpose: Project TreeView. -* -* Revisions: -* -********************************************************************/ -CProjectView::CProjectView(){ - hRoot = NULL; -} - -CProjectView::~CProjectView(){ -} - -CFileItem * CProjectView::NewFile(char * name){ - CFileItem * current = (CFileItem *) GetCurrent(); - CFileItem * srcFile = new CFileItem; - - // Copy directory name. - if (current){ - strncpy(srcFile->szFileName, current->szFileName, current->nFileOffset); - srcFile->nFileOffset = current->nFileOffset; - }else{ - // No files in the project yet, use makefile directory. - strcpy(srcFile->szFileName, Project.Makefile.mkfDir); - srcFile->nFileOffset = strlen(srcFile->szFileName)+1; - } - - srcFile->szFileName[srcFile->nFileOffset - 1] = '\\'; - - // Append file name. - strcpy(&srcFile->szFileName[srcFile->nFileOffset], name); - //MsgBox.DisplayString(srcFile->szFileName); - - if (::CheckFile(srcFile)){ - ::GetFileType(srcFile); - srcFile->isInProject = true; - HANDLE hFile; - hFile = ::CreateFile(srcFile->szFileName, - 0, - 0, - NULL, - CREATE_NEW, - FILE_ATTRIBUTE_ARCHIVE, - NULL); - - if (hFile != INVALID_HANDLE_VALUE){ - CloseHandle(hFile); - // Try to add new file to the project. - if(OpenFile(srcFile)){ - Project.modified = true; - return srcFile; - } - } - } - delete srcFile; -return NULL; -} - -bool CProjectView::OpenFile(CFileItem * file){ - if (!file) - return false; - - int listAction; - char * fileName = file->szFileName + file->nFileOffset; - - /* Check if this file is already opened */ - listAction = InsertSorted_New(file); - - if (listAction == FILE_FOUND){ - /* Focus the editor window */ - CFileItem * currentFile = (CFileItem *) GetCurrent(); - if (currentFile){ - CMDIChild * pMdiChild = currentFile->pMdiChild; - if (!pMdiChild){ - /* Create a child window */ - Project.SwitchCurrentDir(); - winApp.CreateChild(file->szFileName, file); - }else{ - pMdiChild->SetFocus(); - } - } - return false; - } - - file->_hDirItem = hRoot; - CreateSubDirItem(file); - - if (listAction == EMPTY_LIST){ - InsertFirst(file); - }else if (listAction == INSERT_FIRST){ - InsertFirst(file); - }else if (listAction == INSERT_LAST){ - InsertLast(file); - }else if (listAction == INSERT_BEFORE){ - InsertBefore(file); - }else if (listAction == INSERT_AFTER){ - InsertAfter(file); - } - - /* Create the file icon */ - file->_hItem = CreateItem( - file->_hDirItem, - TVI_SORT, - file->type, - fileName, - (LPARAM) file); - - file->pTreeView = this; - - /* Create an editor view */ - if (file->show){ - winApp.CreateChild(file->szFileName, file); - } -return true; -} - -bool CProjectView::Close(){ - if (Project.NoProject()) - return false; - - int decision = IDASK; - decision = SaveAll(decision); - if (decision == IDCANCEL) - return false; - - // Parse the list while there's a next node. - CFileItem * srcFile = (CFileItem *) First(); - while(srcFile){ - DestroyFile(srcFile, decision); - srcFile = (CFileItem *) Next(); - } - Project.loaded = false; - - DestroyRoot(); - DestroyList(); - winApp.Report.Clear(); -return true; -} - -void CProjectView::RemoveFile(void){ - if (Project.NoProject()) - return; - - CFileItem * srcFile = (CFileItem *) GetSelectedItemParam(); - - if (srcFile){ - if (srcFile->pMdiChild) - DestroyFile(srcFile); - TreeView_DeleteItem(_hWnd, srcFile->_hItem); - if (!TreeView_GetChild(_hWnd, srcFile->_hDirItem)) - TreeView_DeleteItem(_hWnd, srcFile->_hDirItem); -/* else - TreeView_SelectItem(_hWnd, srcFile->_hDirItem);*/ - Destroy(srcFile); - - // we need to save prj file before exit. - //@@ Project.CloseFile, modified & buildMakefile should be private. - Project.modified = true; - Project.buildMakefile = true; - }else{ - MsgBox.DisplayWarning("No project file selected"); - } -} - -void CProjectView::RemoveModule(void){ - if (Project.NoProject()) - return; - - CFileItem * srcFile = (CFileItem *) GetSelectedItemParam(); - CFileItem * otherFile; - - if (srcFile){ - if (srcFile->prev){ - otherFile = (CFileItem *) srcFile->prev; - if (otherFile->nFileExtension != 0){ - if (0 == strnicmp(srcFile->szFileName, otherFile->szFileName, otherFile->nFileExtension)){ - if (otherFile->pMdiChild) - DestroyFile(otherFile); - TreeView_DeleteItem(_hWnd, otherFile->_hItem); - Destroy(otherFile); - } - } - } - if (srcFile->next){ - otherFile = (CFileItem *) srcFile->next; - if (otherFile->nFileExtension != 0){ - if (0 == strnicmp(srcFile->szFileName, otherFile->szFileName, otherFile->nFileExtension)){ - if (otherFile->pMdiChild) - DestroyFile(otherFile); - TreeView_DeleteItem(_hWnd, otherFile->_hItem); - Destroy(otherFile); - } - } - } - if (srcFile->pMdiChild) - DestroyFile(srcFile); - TreeView_DeleteItem(_hWnd, srcFile->_hItem); - Destroy(srcFile); - - // we need to save prj file before exit. - //@@ Project.CloseFile, modified & buildMakefile should be private. - Project.modified = true; - Project.buildMakefile = true; - }else{ - MsgBox.DisplayWarning("No project file selected"); - } -} - -int CProjectView::DestroyFile(CFileItem * file, int decision){ - if (file && file->pMdiChild){ - CChildView * pMdiChild = (CChildView *) file->pMdiChild; - - if (pMdiChild->modified && decision != IDNO){ - // Ask ? - if (decision == IDASK){ - decision = MsgBox.AskToSave(true); // (Cancel button) - if (decision == IDCANCEL) - return decision; - } - pMdiChild->CmdSave(); - } - - if (pMdiChild->_hWnd) // have an editor window, so destroy it. - winApp.MdiClient.SendMessage(WM_MDIDESTROY, (WPARAM)pMdiChild->_hWnd, 0); - } -return decision; -} - -int CProjectView::SaveAll(int decision){ - if (!Project.loaded) - return 0; - - if (decision == IDNO || decision == IDCANCEL) - return decision; - - CFileItem * file = (CFileItem*) First(); - while (file){ - if (file->pMdiChild){ - CChildView * childView = (CChildView *) file->pMdiChild; - /* Modified ? */ - if (childView->modified){ - /* Ask ? */ - if (decision == IDASK){ - decision = MsgBox.AskToSave(true); // Cancel button. - if (decision != IDYES) - return decision; // IDNO or IDCANCEL. - } - childView->CmdSave(); - } - } - file = (CFileItem*) Next(); - } - - if (Project.modified) - return Project.SavePrjFile(decision); -return decision; -} - -bool CProjectView::CreateSubDirItem(CFileItem * file){ - /* Initialize _hDirItem and get a pointer to current file */ - file->_hDirItem = hRoot; - CFileItem * currentFile = (CFileItem *) GetCurrent(); - - /* See if our new file is in the same directory than current file */ - if (currentFile){ - // There's some files in the list. - if (file->nFileOffset == currentFile->nFileOffset){ - // Same directory length, we may have found the directory. - if (0 == strnicmp(file->szFileName, currentFile->szFileName, currentFile->nFileOffset)){ - /* We have found the directory, then copy _hDirItem */ - file->_hDirItem = currentFile->_hDirItem; - return true; - } - } - } - - /* We need to parse the tree view and create directory icons */ - char * parse = file->szFileName; - if (*parse == '.' && *(parse+1) == '\\'){ - /* This is a valid relative path */ - char dir[MAX_PATH]; - strcpy(dir, file->szFileName); - parse = dir+2; - char * dirStart; - HTREEITEM hParent = hRoot; - HTREEITEM hFound; - if (*parse){ - for ( ; ; ){ - /* Found each backslash */ - dirStart = parse; - parse = strchr(parse, '\\'); - if (!parse) - break; // No more backslash. - else if (parse == dirStart) - return false; // Avoids an endless loop. - *parse = '\0'; - - /* Find the directory */ - hFound = FindDirItem(hParent, dirStart); - if (!hFound){ - /* Append a new directory icon */ - hParent = CreateDirItem(hParent, dirStart); - } - parse++; - } - } - file->_hDirItem = hParent; - } -return true; -} - -HTREEITEM CProjectView::FindDirItem(HTREEITEM hItem, char * dir){ - char buffer[_MAX_DIR]; - HTREEITEM hNext = TreeView_GetChild(_hWnd, hItem); - while (hNext){ - _TvItem.hItem = hNext; - _TvItem.mask = TVIF_HANDLE | TVIF_TEXT; - _TvItem.pszText = buffer; - _TvItem.cchTextMax = _MAX_DIR; - if (TreeView_GetItem(_hWnd, &_TvItem)){ - if (!stricmp(dir, buffer)) - return hNext; - } - hNext = TreeView_GetNextSibling(_hWnd, hNext); - } -return NULL; -} - -HWND CProjectView::Create(CWindow * pParent, CImageList * imgList){ - // Create TreeView. - CreateEx( - pParent, - WS_EX_CLIENTEDGE, - WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS - | TVS_EDITLABELS | TVS_HASLINES | TVS_HASBUTTONS); - - // Assign the image list to the treeview control. - SendMessage(TVM_SETIMAGELIST, (long)TVSIL_NORMAL, (long) imgList->GetId()); -return _hWnd; -} - -void CProjectView::CreateRoot(char * projectName){ - - _pParent->SendMessage(TCM_SETCURFOCUS, 1, 0); - - // Create Root Item. - hRoot = CreateItem(TVI_ROOT, TVI_LAST, PROJECT, projectName, 0); - SendMessage(TVM_EXPAND, (long) TVE_EXPAND, (long) hRoot); -} - -void CProjectView::DestroyRoot(void){ - TreeView_DeleteItem(_hWnd, hRoot); - hRoot = 0; - - _pParent->SendMessage(TCM_SETCURFOCUS, 0, 0); -} - -HTREEITEM CProjectView::CreateDirItem(HTREEITEM hParent, char * dir){ -return CreateItem(hParent, TVI_SORT, DIR, dir, 0); -} - -CFileItem * CProjectView::FindFile(char * szFileName){ - if (!szFileName || !*szFileName) - return NULL; - - char * currentFile; - bool stripDir = true; - if (*szFileName == '.') - stripDir = false; - // Get the current node. - CFileItem * currentNode = (CFileItem *) GetCurrent(); - - if(!currentNode) - return NULL; // The list is empty. - - currentFile = GetFileName(currentNode, stripDir); - int cmpResult = stricmp(szFileName, currentFile); - // Compare names to know if we must parse Up - // or Down from current node. - if (cmpResult == 0){ - return currentNode; // Found ! - } - // Search Up ----------------------------------------------------------------- - else if (cmpResult == -1){ - // Parse the list while there's a previous node. - while (Prev()){ - currentNode = (CFileItem *) GetCurrent(); - currentFile = GetFileName(currentNode, stripDir); - if(!stricmp(szFileName, currentFile)) - return currentNode; // Found ! - } - } - // Search Down -------------------------------------------------------------- - else if (cmpResult == 1){ - // Parse the list while there's a next node. - while (Next()){ - currentNode = (CFileItem *) GetCurrent(); - currentFile = GetFileName(currentNode, stripDir); - if(!stricmp(szFileName, currentFile)) - return currentNode; // Found ! - } - } -return NULL; -} - -char * CProjectView::GetFileName(CFileItem * currentNode, bool flag){ - char * fileName = currentNode->szFileName; - if (flag == true){ - fileName += currentNode->nFileOffset; - } -return fileName; -} - - -/******************************************************************** -* Class: CReport. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CReport::CReport(){ -} - -CReport::~CReport(){ -} - -void CReport::Create(CWindow * pParent){ - // Create the Tab Control. - CreateEx( - pParent, - WS_EX_CLIENTEDGE, - WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS - /*| TCS_BOTTOM*/ | TCS_MULTILINE | TCS_VERTICAL - | TCS_FOCUSNEVER); - - // Give it a smart font, create tabs, select first one and show the control. - SendMessage(WM_SETFONT, (long) GetStockObject(DEFAULT_GUI_FONT), 0); - - InsertItem(REPORT_MAIN_TAB, TCIF_TEXT, 0, 0, "Main", 16, 0, 0); - InsertItem(REPORT_LOG_TAB, TCIF_TEXT, 0, 0, "Log", 16, 0, 0); - Show(); - - // Create an Image list and then the Project TreeView. - MainList.Create(this); - SetItem_Param(REPORT_MAIN_TAB, (long) &MainList); - LogList.Create(this); - SetItem_Param(REPORT_LOG_TAB, (long) &LogList); -} - -bool CReport::SetPosition(HWND, int x, int y, int width, int height, UINT){ - /* Overwrites CTabCtrl::SetPosition() so that all child windows are also resized */ - - // Tab Control. - ::SetWindowPos(_hWnd, 0, - x, - y, - width, - height, - 0); - - // Get tab's display area. - RECT area; - area.left = 0; - area.top = 0; - area.right = width; - area.bottom = height; - ::SendMessage(_hWnd, TCM_ADJUSTRECT, FALSE, (LPARAM) &area); - area.right -= area.left; - area.bottom -= area.top; - /* WS_EX_CLIENTEDGE correction */ - area.top -= 2; - area.right -= 2; - // Borders. - area.left += 3; - area.top += 3; - area.right -= 6; - area.bottom -= 6; - - // Child windows. - MainList.SetPosition(0, area.left, area.top, - area.right, area.bottom, 0); - LogList.SetPosition(0, area.left, area.top, - area.right, area.bottom, 0); -return true; -} - -BOOL CReport::OnNotify(int, LPNMHDR notify){ - // Dispatch messages. - switch (notify->code){ - // Tab Control. - case TCN_SELCHANGING: - OnSelChanging(notify); - break; - - case TCN_SELCHANGE: - OnSelChange(notify); - break; - - // Main list. - case NM_DBLCLK: - MainList.Lv_OnDbClick((LPNMLISTVIEW) notify); - break; - } -return TRUE; -} - -void CReport::OnSelChanging(LPNMHDR notify){ - if (_hWnd == notify->hwndFrom){ - CWindow * pWindow = (CWindow *) GetItem_Param(GetCurSel()); - if (pWindow){ - pWindow->Hide(); - } - } -} - -void CReport::OnSelChange(LPNMHDR notify){ - if (_hWnd == notify->hwndFrom){ - CWindow * pWindow = (CWindow *) GetItem_Param(GetCurSel()); - if (pWindow){ - pWindow->Show(); - } - } -} - -void CReport::Clear(void){ - MainList.Clear(); - LogList.Clear(); -} - -bool CReport::Append(char * line, WORD outputFlag){ - LogList.Append(line, outputFlag); - MainList.Append(line, outputFlag); -return true; -} - - -/******************************************************************** -* Class: CMainList. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CMainList::CMainList(){ -} - -CMainList::~CMainList(){ -} - -void CMainList::Create(CWindow * pParent){ - CreateEx( - pParent, - WS_EX_CLIENTEDGE, - WS_VISIBLE | WS_CHILD| WS_CLIPCHILDREN | WS_CLIPSIBLINGS - | LVS_REPORT); - - SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, - LVS_EX_GRIDLINES, LVS_EX_GRIDLINES); - SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, - LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT); - - // Insert columns. - LVCOLUMN lvc; - lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; - lvc.fmt = LVCFMT_LEFT; - - lvc.iSubItem = 0; - lvc.cx = 35; - lvc.pszText = "Line"; - SendMessage(LVM_INSERTCOLUMN, 0, (LPARAM) &lvc); - - lvc.iSubItem = 1; - lvc.cx = 70; - lvc.pszText = "Unit"; - SendMessage(LVM_INSERTCOLUMN, 1, (LPARAM) &lvc); - - lvc.iSubItem = 2; - lvc.cx = 640; - lvc.pszText = "Message"; - SendMessage(LVM_INSERTCOLUMN, 2, (LPARAM) &lvc); -} - -void CMainList::Lv_OnDbClick(LPNMLISTVIEW lpnmlv){ - if (_hWnd == lpnmlv->hdr.hwndFrom){ - char lineBuff[256]; - *lineBuff = '\0'; - char * c = lineBuff; - LV_ITEM lvi; - lvi.mask = LVIF_TEXT; - lvi.iItem = lpnmlv->iItem; - lvi.iSubItem = 0; - lvi.pszText = lineBuff; - lvi.cchTextMax = 256; - lvi.lParam = 0; - if (!SendMessage(LVM_GETITEMTEXT, lpnmlv->iItem, (long) &lvi)) - return; - while(*c){ - if (!isdigit(*c)) - return; - c++; - } - int line = atoi(lineBuff); - - //MsgBox.DisplayLong((long) line); - - lvi.iSubItem = 1; - if (!SendMessage(LVM_GETITEMTEXT, lpnmlv->iItem, (long) &lvi)) - return; - CFileItem * item = winApp.Manager.ProjectView.FindFile(lineBuff); - if (item && item->isInProject){ - CChildView * pMdiChild = (CChildView *) item->pMdiChild; - - if(pMdiChild){ - // An editor, focus it. - ::SetFocus((HWND) pMdiChild->_hWnd); - }else{ - // No editor, the item is part of a project. - Project.SwitchCurrentDir(); - winApp.CreateChild(item->szFileName, item); - } - pMdiChild = (CChildView *) item->pMdiChild; - if (pMdiChild) - pMdiChild->Editor.GotoLine(line-1); - } - } -} - -bool CMainList::Append(char * line, WORD outputFlag){ - int row; - - *szLine = '\0'; - *szUnit = '\0'; - *szMsg = '\0'; - - if (outputFlag == LVOUT_ERROR){ - if (!SplitErrorLine(line)) - return false; - }else if (outputFlag == LVOUT_NORMAL){ - strcpy (szMsg, line); - }else{ - strcpy (szMsg, "Unrecognized outputFlag"); - } - - // Fill in List View columns, first is column 0. - LV_ITEM lvi; - lvi.mask = LVIF_TEXT; // | LVIF_PARAM; - lvi.iItem = 0x7FFF; - lvi.iSubItem = 0; - lvi.pszText = szLine; - lvi.cchTextMax = strlen(lvi.pszText)+1; - lvi.lParam = 0; - - row = SendMessage(LVM_INSERTITEM, 0, (LPARAM) &lvi); - - // Continue with column 1. - lvi.iSubItem = 1; - lvi.pszText = szUnit; - lvi.cchTextMax = strlen(lvi.pszText)+1; - SendMessage(LVM_SETITEMTEXT, (WPARAM)row, (LPARAM)&lvi); - - // Continue with column 2. - lvi.iSubItem = 2; - lvi.pszText = szMsg; - lvi.cchTextMax = strlen(lvi.pszText)+1; - SendMessage(LVM_SETITEMTEXT, (WPARAM)row, (LPARAM)&lvi); - - // Save last row position - lastRow = row+1; - -return true; -} - -bool CMainList::SplitErrorLine(char * line){ - char * chr = line; - char * col; - // line => [unit]:[line_n癩: [error message] - // or => [unit]: [error message] - - if (!*line) - return false; - - /* Unit */ - col = szUnit; - for ( ; ; ){ - if (!*chr){ - /* Not an error line */ - //strcpy(szMsg, szUnit); - *szUnit = '\0'; - return false; - }else if (*chr == ':'){ - if (*(chr+1) == '\\'){ - *col = *chr; - col++; - chr++; - continue; - }else{ - chr++; - break; - } - } - *col = *chr; - col++; - chr++; - } - *col = '\0'; - - /* Line number ? */ - col = szLine; - if (*chr && isdigit(*chr)){ //@@ *chr=0 ? - while (*chr && *chr != ':'){ - *col = *chr; - col++; - chr++; - } - *col = '\0'; - chr++; - } - - /* Message */ - col = szMsg; - if (isspace(*chr)){ - /**col = '>'; - col++; - *col = ' '; - col++;*/ - chr++; - } - - while (*chr){ - *col = *chr; - col++; - chr++; - } - *col = '\0'; -return true; -} - - -/******************************************************************** -* Class: CLogList. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CLogList::CLogList(){ -} - -CLogList::~CLogList(){ -} - -void CLogList::Create(CWindow * pParent){ - CreateEx( - pParent, - WS_EX_CLIENTEDGE, - WS_CHILD| WS_CLIPCHILDREN | WS_CLIPSIBLINGS | LVS_REPORT - | LVS_NOCOLUMNHEADER); - - SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, - LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT); - - // Insert columns. - LVCOLUMN lvc; - lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; - lvc.fmt = LVCFMT_LEFT; - - lvc.iSubItem = 0; - lvc.cx = 100; - lvc.pszText = "Message"; - SendMessage(LVM_INSERTCOLUMN, 0, (LPARAM) &lvc); -} - -bool CLogList::SetPosition(HWND hInsertAfter, int x, int y, int width, int height, UINT uFlags){ - ::SendMessage(_hWnd, WM_SETREDRAW, FALSE, 0); - ::SetWindowPos(_hWnd, hInsertAfter, x, y, width, height, uFlags); - ::SendMessage(_hWnd, LVM_SETCOLUMNWIDTH, 0, MAKELPARAM((int) width-22, 0)); - ::SendMessage(_hWnd, WM_SETREDRAW, TRUE, 0); -return true; -} - -bool CLogList::Append(char * line, WORD /*outputFlag*/){ - int row; - - *szMsg = '\0'; - -/* if (outputFlag != LVOUT_ERROR) - return false; -*/ - // Fill in List View columns, first is column 0. - LV_ITEM lvi; - lvi.mask = LVIF_TEXT; // | LVIF_PARAM; - lvi.iItem = 0x7FFF; - lvi.iSubItem = 0; - lvi.pszText = line; - lvi.cchTextMax = strlen(lvi.pszText)+1; - lvi.lParam = 0; - - row = SendMessage(LVM_INSERTITEM, 0, (LPARAM) &lvi); - - // Save last row position - lastRow = row+1; - -return true; -} - - -/******************************************************************** -* Class: CFileItem. -* -* Purpose: Linked List Node for file parameters. -* -* Revisions: -* -********************************************************************/ -CFileItem::CFileItem(){ - type = U_FILE; - - *szFileName = '\0'; - szFileName[MAX_PATH - 1] = '\0'; // security. - nFileOffset = 0; - nFileExtension = 0; - - pTreeView = NULL; - _hDirItem = 0; - _hItem = 0; - - pMdiChild = NULL; - show = 0; - isInProject = false; -} - -CFileItem::~CFileItem(){ -} - - -/******************************************************************** -* Class: CFileList. -* -* Purpose: A CList with a dedicated Compare() procedure. -* -* Revisions: -* -********************************************************************/ -CFileList::CFileList(){ -} - -CFileList::~CFileList(){ -} - -int CFileList::Compare(CNode *node1, CNode *node2){ -return stricmp(((CFileItem *)node1)->szFileName, ((CFileItem *)node2)->szFileName); -} - diff --git a/rosapps/devutils/vmingw/main.h b/rosapps/devutils/vmingw/main.h deleted file mode 100644 index 4aa4cc70a52..00000000000 --- a/rosapps/devutils/vmingw/main.h +++ /dev/null @@ -1,385 +0,0 @@ -/******************************************************************** -* Module: main.h. This is part of Visual-MinGW. -* -* License: Visual-MinGW is covered by GNU General Public License, -* Copyright (C) 2001 Manu B. -* See license.htm for more details. -* -********************************************************************/ -#ifndef MAIN_H -#define MAIN_H - -#include "CList.h" -#include "winui.h" -#include "editor.h" -#include "process.h" - -#define LVOUT_NORMAL (STDOUT_USER) -#define LVOUT_ERROR (STDOUT_USER+1) -#define IDASK 21 - -#define WORKSPACE 0 -#define PROJECT 1 -#define DIR 2 - -#define PRJ_FILE 0 -#define SRC_FILE 1 -#define ADD_SRC_FILE 2 - -#define FILES_TAB 0 -#define PROJECT_TAB 1 - -#define REPORT_MAIN_TAB 0 -#define REPORT_LOG_TAB 1 - - -class CChildView : public CMDIChild -{ - public: - CChildView(); - virtual ~CChildView(); - - bool modified; - - bool OnCreate(LPCREATESTRUCT lParam); - bool OnSize(UINT wParam, int width, int height); - BOOL OnClose(void); - BOOL OnDestroy(void); - - BOOL OnCommand(WPARAM wParam, LPARAM lParam); - BOOL OnNotify(int idCtrl, LPNMHDR notify); - BOOL OnSetFocus(HWND hwndLoseFocus); - BOOL OnActivate(HWND hwndChildDeact, HWND hwndChildAct); - - void CmdSave(void); - void CmdSaveAs(void); - CEditor Editor; - - protected: - - private: -}; - -class CFileList : public CList -{ - public: - CFileList(); - ~CFileList(); - - protected: - virtual int Compare(CNode *node1, CNode *node2); - - private: -}; - -class CProjectView : public CTreeView, public CFileList -{ - public: - CProjectView(); - ~CProjectView(); - - CFileItem * NewFile(char * name); - bool OpenFile(CFileItem * file); - void RemoveFile(void); - void RemoveModule(void); - int DestroyFile(CFileItem * file, int decision=IDASK); - int SaveAll(int decision); - bool Close(); - - void CreateRoot(char * projectName); - void DestroyRoot(void); - CFileItem * FindFile(char * szFileName); - char * GetFileName(CFileItem * currentNode, bool flag); - - HWND Create(CWindow * pParent, CImageList * imgList); - HTREEITEM CreateDirItem(HTREEITEM hParent, char * dir); - - protected: - - private: - bool CreateSubDirItem(CFileItem * file); - HTREEITEM FindDirItem(HTREEITEM hItem, char * dir); - HTREEITEM hRoot; -}; - -class CFilesView : public CTreeView, public CFileList -{ - public: - CFilesView(); - ~CFilesView(); - - bool OpenFile(CFileItem * file); - void New (void); - void CloseFile(CFileItem * file); - int SaveAll(int decision); - - HWND Create(CWindow * pParent, CImageList * imgList); - - protected: - - private: - HTREEITEM hRoot; -}; - -class CManager : public CTabCtrl -{ - public: - CManager(); - ~CManager(); - - void OpenFileDialog(void); - bool OpenFile(CFileItem * file); - int SaveAll(int silent); - - bool NewProjectDialog(void); - bool OpenProjectDialog(void); - bool CloseProject(void); - int SaveProjectFiles(int decision); - void RemoveProjectFile(void); - void RemoveProjectModule(void); - - void Create(CWindow * pParent); - bool SetPosition(HWND hInsertAfter, int x, int y, int width, int height, UINT uFlags); - - BOOL OnNotify(int idCtrl, LPNMHDR notify); - void Tv_OnDeleteItem(LPNMTREEVIEW notify); - void Tv_OnSelchanged(LPNMTREEVIEW notify); - void OnSelChanging(LPNMHDR notify); - void OnSelChange(LPNMHDR notify); - - CImageList ImgList; - CFilesView FilesView; - CProjectView ProjectView; - - protected: - - private: - void CreateImageList(void); - -}; - -class CLogList : public CListView -{ - public: - CLogList(); - ~CLogList(); - - void Create(CWindow * pParent); - bool SetPosition(HWND hInsertAfter, int x, int y, int width, int height, UINT uFlags); - bool Append(char * line, WORD outputFlag); - - protected: - - private: - char szMsg[1024]; -}; - -class CMainList : public CListView -{ - public: - CMainList(); - ~CMainList(); - - void Create(CWindow * pParent); - void Lv_OnDbClick(LPNMLISTVIEW lpnmlv); - bool Append(char * line, WORD outputFlag); - - protected: - - private: - char szLine[512]; - char szUnit[512]; - char szMsg[512]; - - bool SplitErrorLine(char * line); -}; - -class CReport : public CTabCtrl -{ - public: - CReport(); - ~CReport(); - - bool Append(char * line, WORD outputFlag); - void Clear(void); - void Create(CWindow * pParent); - bool SetPosition(HWND hInsertAfter, int x, int y, int width, int height, UINT uFlags); - - BOOL OnNotify(int idCtrl, LPNMHDR notify); - void OnSelChanging(LPNMHDR notify); - void OnSelChange(LPNMHDR notify); - - CMainList MainList; - CLogList LogList; - - protected: - - private: - void CreateImageList(void); -}; - -class CFileDlg : public CFileDlgBase -{ - public: - CFileDlg(); - ~CFileDlg(); - - bool Open(CWindow * pWindow, char * pszFileName, DWORD nMaxFile, int fileflag); - bool Save(CWindow * pWindow, char * pszFileName, DWORD nMaxFile, int fileflag); - - protected: - - private: -}; - -class CGrepDlg : public CDlgBase -{ - public: - CGrepDlg(); - ~CGrepDlg(); - - int Create(void); - LRESULT CALLBACK CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam); - BOOL OnInitDialog(HWND hwndFocus, LPARAM lInitParam); - BOOL OnCommand(WORD wNotifyCode, WORD wID, HWND hwndCtl); - void FindInFiles(char * findWhat, char * fileFilter); - char gDir[MAX_PATH]; - char findWhat[200]; - - protected: - - private: - HWND hFindWhat; - HWND hgDir; -}; - -class CEnvDlg : public CDlgBase -{ - public: - CEnvDlg(); - virtual ~CEnvDlg(); - - virtual LRESULT CALLBACK CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam); - BOOL OnInitDialog(HWND hwndFocus, LPARAM lInitParam); - BOOL OnCommand(WORD wNotifyCode, WORD wID, HWND hwndCtl); - void SetEnvText(void); - bool bIsVisible; - bool bModified; - - protected: - - private: - HWND hApply; - HWND hSetCcBin; - HWND hCcBinDir; - HWND hBrowseCc; - HWND hSetCmdBin; - HWND hCmdBinDir; - HWND hBrowseCmd; - HWND hAutoexec; - HWND hEnvView; -}; - -class CPreferencesDlg : public CTabbedDlg -{ - public: - CPreferencesDlg(); - virtual ~CPreferencesDlg(); - - int Create(void); - BOOL EndDlg(int nResult); - virtual LRESULT CALLBACK CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam); - BOOL OnInitDialog(HWND hwndFocus, LPARAM lInitParam); - BOOL OnCommand(WORD wNotifyCode, WORD wID, HWND hwndCtl); - - protected: - - private: - CEnvDlg EnvDlg; -}; - -class CWinApp : public CMDIBase -{ - public: - CWinApp(); - ~CWinApp(); - - void FirstRunTest(void); - bool ReadIniFile(char * iniFile); - void SaveIniFile(FILE * file); - bool WriteIniFile(void); - bool CustomInit(void); - bool Release(void); - bool SetEnv(void); - - bool CreateUI(void); - void CreateToolbar(void); - void CreateSplitter(void); - void CreateMDI(void); - HWND CreateChild(char * caption, LPVOID lParam); - void CreateStatusBar(void); - - void SendCaretPos(int caretPos); - - // Main window. - LRESULT CALLBACK CMainWndProc(UINT Message, WPARAM wParam, LPARAM lParam); - - BOOL OnCreate(LPCREATESTRUCT lParam); - BOOL OnPaint(HDC wParam); - BOOL OnSize(UINT wParam, int width, int height); - BOOL OnDestroy(void); - BOOL OnClose (void); - BOOL OnNotify(int idCtrl, LPNMHDR notify); - - BOOL OnLButtonDown(short xPos, short yPos, UINT fwKeys); - BOOL OnMouseMove(short xPos, short yPos, UINT fwKeys); - BOOL OnLButtonUp(short xPos, short yPos, UINT fwKeys); - BOOL OnSetCursor(HWND hwnd, UINT nHittest, UINT wMouseMsg); - - BOOL OnCommand(WPARAM wParam, LPARAM lParam); - - // Child window. - LRESULT CALLBACK CChildWndProc(CWindow * pWnd, UINT Message, WPARAM wParam, LPARAM lParam); - - HMODULE hmod; - char iniFileName[MAX_PATH]; - CIniFile IniFile; - CPreferencesDlg PreferencesDlg; - CGrepDlg GrepDlg; - CShellDlg ShellDlg; - CFileDlg FileDlg; - CProcess Process; - - CToolBar Toolbar; - CSplitter MainSplitter; - CSplitter ChildSplitter; - CManager Manager; - CReport Report; - CStatusBar Sbar; - - /* Preferences */ - char openFilesDir[MAX_PATH]; - char projectDir[MAX_PATH]; - bool bSetCcEnv; - bool bSetCmdEnv; - bool bSetDefEnv; - char szCcBinDir[MAX_PATH]; - char szCmdBinDir[MAX_PATH]; - char includeDir[MAX_PATH]; - - protected: - - private: - bool firstRun; - // Child windows dimensions. - int deltaY; - int tbarHeight; - int sbarHeight; - int tvWidth; - int lvHeight; - - int hSplitter; - int vSplitter; -}; - -#endif diff --git a/rosapps/devutils/vmingw/process.cpp b/rosapps/devutils/vmingw/process.cpp deleted file mode 100644 index 092f41b56ae..00000000000 --- a/rosapps/devutils/vmingw/process.cpp +++ /dev/null @@ -1,682 +0,0 @@ -/******************************************************************** -* Module: process.cpp. This is part of Visual-MinGW. -* -* Purpose: Procedures to invoke MinGW compiler. -* -* Authors: Manu B. -* -* License: Visual-MinGW is covered by GNU General Public License, -* Copyright (C) 2001 Manu B. -* See license.htm for more details. -* -* Note: The following article from MSDN explanes how to handle Callback -* procedures : -* Calling All Members: Member Functions as Callbacks. -* by Dale Rogerson. -* Microsoft Developer Network Technology Group. -* April 30, 1992. -* http://msdn.microsoft.com/archive/default.asp -* -* Revisions: -* -********************************************************************/ -#include -#include -#include -#include -#include -#include "process.h" -#include "project.h" -#include "main.h" -#include "rsrc.h" - -extern CCriticalSection CriticalSection; -extern CMessageBox MsgBox; -char errmsg[128]; - -// For winApp.isWinNT and winApp.Report.Append -extern CWinApp winApp; - -/******************************************************************** -* Class: CCommandDlg. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CCommandDlg::CCommandDlg(){ - *cmdLine = '\0'; -} - -CCommandDlg::~CCommandDlg(){ -} - -HWND CCommandDlg::Create(void){ -return CreateParam(&winApp, IDD_COMMAND, 0); -} - -LRESULT CALLBACK CCommandDlg::CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam){ - switch(Message){ - case WM_INITDIALOG: - return OnInitDialog((HWND) wParam, lParam); - - case WM_COMMAND: - OnCommand(HIWORD(wParam), LOWORD(wParam), (HWND) lParam); - break; - - case WM_CLOSE: - EndDlg(0); - break; - } -return FALSE; -} - -BOOL CCommandDlg::OnInitDialog(HWND, LPARAM){ - hCmdLine = GetItem(IDC_CMDLINE); - - SetItemText(hCmdLine, cmdLine); - // Show the dialog. - Show(); -return TRUE; -} - -BOOL CCommandDlg::OnCommand(WORD, WORD wID, HWND){ - switch (wID){ - case IDOK: - GetItemText(hCmdLine, cmdLine, sizeof(cmdLine)); - //MsgBox.DisplayString(cmdLine); - winApp.Process.CommandLine(cmdLine); - return TRUE; - - case IDCANCEL: - EndDlg(IDCANCEL); - return FALSE; - } -return FALSE; -} - - -/******************************************************************** -* Class: CTask. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CTask::CTask(){ - *cmdLine = '\0'; - *szFileName = '\0'; - creationFlag = 0; - outputFlag = 0; -} - -CTask::~CTask(){ -} - - -/******************************************************************** -* Class: CStack. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CStack::CStack(){ - retBuf = NULL; -} - -CStack::~CStack(){ - DestroyList(); - if (retBuf) - delete retBuf; -} - -void CStack::DetachCurrent(void){ - // Empty list ? - if (current != NULL){ - CNode * node = current; - - // Detach node from the list. - if (node->next != NULL) - node->next->prev = node->prev; - if (node->prev != NULL) - node->prev->next = node->next; - - // Set current node. - if(node->next != NULL) - current = node->next; - else - current = node->prev; - - if (current == NULL){ - // Now, the list is empty. - first = last = NULL; - - }else if (first == node){ - // Detached node was first. - first = current; - - }else if (last == node){ - // Detached node was last. - last = current; - } - count--; - } -} - -/******************************************************************** -* Push/Pop/Flush. -********************************************************************/ -int CStack::Push(CTask * newTask){ - InsertLast(newTask); -return Length(); -} - -CTask * CStack::Pop(void){ - // Delete return buffer. - if (retBuf){ - delete retBuf; - retBuf = NULL; - } - - // Get first node. (FIFO stack) - retBuf = (CTask*) First(); - - // The Stack is empty ? - if (!retBuf) - return NULL; - - // Detach current node from the list. Return a pointer to it. - DetachCurrent(); -return retBuf; -} - -void CStack::Flush(void){ - DestroyList(); - if (retBuf) - delete retBuf; - retBuf = NULL; -} - - -/******************************************************************** -* Class: CPipes. -* -* Purpose: Creates needed pipes, depending on creationFlag. -* Like GNU Make does, we use an Handle array for our pipes. -* Parent Process Side is stdXXX[0] and Child Process Side is stdXXX[1]. -* -* Ex: PARENT ->[0]IN_PIPE[1]-> CHILD_IO ->[1]OUT_PIPE[0]-> PARENT -* ->[1]ERR_PIPE[0]-> PARENT -* Revisions: -* -********************************************************************/ -CPipes::CPipes(){ - hIn[0] = NULL; - hIn[1] = NULL; - hOut[0] = NULL; - hOut[1] = NULL; - hErr[0] = NULL; - hErr[1] = NULL; -} - -CPipes::~CPipes(){ -} - -bool CPipes::Create(WORD creationFlag, bool winNT){ - /* Create needed pipes according to creationFlag */ - /* Parent side of pipes is [0], child side is [1] */ - HANDLE hDup; - SECURITY_ATTRIBUTES sa; - sa.nLength = sizeof(SECURITY_ATTRIBUTES); - sa.bInheritHandle = TRUE; - sa.lpSecurityDescriptor = NULL; - - if (winNT){ - /* Create a security descriptor for Windows NT */ - SECURITY_DESCRIPTOR sd; - if (!InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION)){ - sprintf(errmsg, "vm error: Process.cpp InitializeSecurityDescriptor(winNT) failed (e=%d)", (int)GetLastError()); - winApp.Report.Append(errmsg, LVOUT_ERROR); - return false; - } - if (!SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE)){ - sprintf(errmsg, "vm error: Process.cpp SetSecurityDescriptorDacl(winNT) failed (e=%d)", (int)GetLastError()); - winApp.Report.Append(errmsg, LVOUT_ERROR); - return false; - } - sa.lpSecurityDescriptor = &sd; - } - - /* Input pipe */ - if (!CreatePipe(&hIn[1], &hIn[0], &sa, 0)){ - sprintf(errmsg, "vm error: Process.cpp CreatePipe(In) failed (e=%d)", (int)GetLastError()); - winApp.Report.Append(errmsg, LVOUT_ERROR); - return false; - } - - if (!DuplicateHandle(GetCurrentProcess(), - hIn[0], - GetCurrentProcess(), - &hDup, - 0, - FALSE, - DUPLICATE_SAME_ACCESS)){ - sprintf(errmsg, "vm error: Process.cpp DuplicateHandle(In) failed (e=%d)", (int)GetLastError()); - winApp.Report.Append(errmsg, LVOUT_ERROR); - return false; - } - CloseHandle(hIn[0]); - hIn[0] = hDup; - - /* Output pipe */ - if (!CreatePipe(&hOut[0], &hOut[1], &sa, 0)){ - sprintf(errmsg, "vm error: Process.cpp CreatePipe(Out) failed (e=%d)", (int)GetLastError()); - winApp.Report.Append(errmsg, LVOUT_ERROR); - return false; - } - - if (!DuplicateHandle(GetCurrentProcess(), - hOut[0], - GetCurrentProcess(), - &hDup, - 0, - FALSE, - DUPLICATE_SAME_ACCESS)){ - sprintf(errmsg, "vm error: Process.cpp DuplicateHandle(Out) failed (e=%d)", (int)GetLastError()); - winApp.Report.Append(errmsg, LVOUT_ERROR); - return false; - } - CloseHandle(hOut[0]); - hOut[0] = hDup; - - /* Error pipe */ - if (!(creationFlag & OUTERR_PIPE) && (creationFlag & ERR_PIPE)){ - if (!CreatePipe(&hErr[0], &hErr[1], &sa, 0)){ - sprintf(errmsg, "vm error: Process.cpp CreatePipe(Err) failed (e=%d)", (int)GetLastError()); - winApp.Report.Append(errmsg, LVOUT_ERROR); - return false; - } - - if (!DuplicateHandle(GetCurrentProcess(), - hErr[0], - GetCurrentProcess(), - &hDup, - 0, - FALSE, - DUPLICATE_SAME_ACCESS)){ - sprintf(errmsg, "vm error: Process.cpp DuplicateHandle(Err) failed (e=%d)", (int)GetLastError()); - winApp.Report.Append(errmsg, LVOUT_ERROR); - return false; - } - CloseHandle(hErr[0]); - hErr[0] = hDup; - } -return true; -} - -bool CPipes::CloseChildSide(void){ -return Close(1); -} - -bool CPipes::CloseParentSide(void){ -return Close(0); -} - -bool CPipes::Close(int side){ - - if (side < 0 || side > 1) - return false; - - if (hIn[side]){ - CloseHandle(hIn[side]); - hIn[side] = NULL; - } - - if (hOut[side]){ - CloseHandle(hOut[side]); - hOut[side] = NULL; - } - - if (hErr[side]){ - CloseHandle(hErr[side]); - hErr[side] = NULL; - } -return true; -} - - -/******************************************************************** -* Class: CProcess. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CProcess::CProcess(){ - Running = false; - exitCode = 0; - - pi.hProcess = 0; - pi.hThread = 0; - pi.dwProcessId = 0; - pi.dwThreadId = 0; -} - -CProcess::~CProcess(){ -} - -/******************************************************************** -* Manage Tasks. -********************************************************************/ -bool CProcess::isRunning(void){ - if (Running){ - MsgBox.DisplayWarning("A process is already running !"); - return true; - } -return false; -} - -CTask * CProcess::AddTask(char * cmdLine, WORD creationFlag, WORD outputFlag){ - CTask * newTask = new CTask; - - strcpy(newTask->cmdLine, cmdLine); - newTask->creationFlag = creationFlag; - newTask->outputFlag = outputFlag; - Push(newTask); -return newTask; -} - -bool CProcess::CmdCat(char * cmdLine){ - CTask * task = (CTask*) GetCurrent(); - if (!task) - return false; - - strcat(task->cmdLine, cmdLine); -return true; -} - -/******************************************************************** -* RunNext/Run/RunProcess. -********************************************************************/ -void __cdecl call_thread(void * ptr){ - /* C++ adapter */ - ((CProcess *) ptr)->Run_Thread_Internal(); -} - -void CProcess::Run(void){ - // Check if something is already running before creating a thread. - if (!Running){ - // Call Run_Thread_Internal() - _beginthread(call_thread, 1024 * 1024, (void *) this); - } -} - -void CProcess::Run_Thread_Internal(void){ - exitCode = 0; - /* Execute each task */ - for ( ; ; ){ - /* If previous task returns an error code, abort */ - if (exitCode != 0) - break; - - // Get one task to execute. - currTask = Pop(); - - // Nothing to run. - if (!currTask) - break; - - /* Show command lines ?*/ - winApp.Report.Append(currTask->cmdLine, LVOUT_NORMAL); - - if (RunProcess(currTask)){ - winApp.Report.Append("Abort !", LVOUT_NORMAL); - exitCode = 1; - break; - } - } - - // Successful ? - if (exitCode == 0) - winApp.Report.Append("Performed successfully.", LVOUT_NORMAL); - - Flush(); - Running = false; -return; -} - -bool CProcess::RunProcess(CTask * task){ - if (!task) - return false; - - bool usePipes = task->creationFlag; - STARTUPINFO si = {sizeof(STARTUPINFO), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0}; - - /* PROCESS_INFORMATION */ - pi.hProcess = 0; - pi.hThread = 0; - pi.dwProcessId = 0; - pi.dwThreadId = 0; - - /* Process creation with pipes */ - if (usePipes){ - /* Create needed pipes according to creationFlag */ - if(!Pipes.Create(task->creationFlag, winApp.isWinNT)){ - Pipes.CloseChildSide(); - Pipes.CloseParentSide(); - return false; - } - - si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; - si.wShowWindow = SW_HIDE; - //si.wShowWindow = SW_SHOWNORMAL; - - /* Set pipe handles */ - if (Pipes.hIn[1] != NULL && Pipes.hOut[1] != NULL){ - si.hStdInput = Pipes.hIn[1]; - si.hStdOutput = Pipes.hOut[1]; - if (Pipes.hErr[1] == NULL) - si.hStdError = Pipes.hOut[1]; - else - si.hStdError = Pipes.hErr[1]; - }else{ - sprintf(errmsg, "vm error: Process.cpp Invalid pipe handle"); - winApp.Report.Append(errmsg, LVOUT_ERROR); - Pipes.CloseChildSide(); - Pipes.CloseParentSide(); - return false; - } - } - - /* Create the child process */ - Running = CreateProcess(NULL, - task->cmdLine, - NULL, - NULL, - usePipes, - 0, - NULL, - /*startDir[0] ? startDir :*/ NULL, - &si, - &pi); - - if (!Running){ - /* CreateProcess failed. Close handles and return */ - Pipes.CloseChildSide(); - Pipes.CloseParentSide(); - sprintf(errmsg, "vm error: Process.cpp CreateProcess failed (e=%d)", (int)GetLastError()); - winApp.Report.Append(errmsg, LVOUT_ERROR); - return false; - }else{ - /* Close child process handles */ - Pipes.CloseChildSide(); - - if (!(usePipes & IN_PIPE)){ - /* Don't use the Input pipe */ - ::CloseHandle(Pipes.hIn[0]); - Pipes.hIn[0] = NULL; - } - } - - //sprintf(errmsg, "vm debug: enter io loop"); - //winApp.Report.Append(errmsg, LVOUT_ERROR); - if (usePipes){ - /* Initialize buffers */ - *outBuf = 0; - chr = outBuf; - bool bResult; - for ( ; ; ){ - Sleep(100L); - - bResult = ReadStdOut(task, Pipes.hOut[0]); - if (bResult != NO_ERROR) - break; - - ::GetExitCodeProcess(pi.hProcess, &exitCode); - if (exitCode != STILL_ACTIVE){ - break; - } - } - } - //sprintf(errmsg, "vm debug: exit io loop"); - //winApp.Report.Append(errmsg, LVOUT_ERROR); - - /* The child process is running. Perform I/O until terminated */ - ::WaitForSingleObject(pi.hProcess, INFINITE); - /* Process terminated. Get exit code. */ - ::GetExitCodeProcess(pi.hProcess, &exitCode); - if (exitCode == NO_ERROR){ - return NO_ERROR; - } - /* Close handles */ - Pipes.CloseParentSide(); - ::CloseHandle(pi.hProcess); - if (pi.hThread){ - ::CloseHandle(pi.hThread); - pi.hThread = NULL; - } -return exitCode; -} - -/******************************************************************** -* Pipes input/output. -********************************************************************/ -void CProcess::WriteStdIn(HANDLE hPipe, WORD){ - if (!hPipe) - return; - -return; -} - -void CProcess::ReadStdErr(HANDLE hPipe, WORD){ - if (!hPipe) - return; - -return; -} - -long CProcess::ReadStdOut(CTask * task, HANDLE hPipe){ - if (!task || !hPipe) - return ERROR_INVALID_FUNCTION; - - /* Copy each char and output lines while there is something to read */ - for ( ; ; ){ - // Copy one char, return if nothing available. - if (!ReadOneChar(hPipe, chr)) - break; - - // Ignore CR. - if (*chr == '\r') - continue; - - if (*chr != '\n'){ - chr++; - /* @@TODO Overflow - if ((chr - outBuf) >= max_len) - realloc(buffer);*/ - // End of line - }else if (*chr =='\n'){ - *chr = '\0'; - // Output error lines to List View. - if (task->outputFlag == STDOUT_FILE_APPEND){ - WriteFileAppend(task->szFileName, outBuf, (chr - outBuf)); - }else{ - OutputLine(task->outputFlag, outBuf, (chr - outBuf)); - } - *outBuf = '\0'; - chr = outBuf; - } - } -return NO_ERROR; -} - -int CProcess::ReadOneChar(HANDLE hPipe, char * chrin){ - DWORD bytesRead = 0; - DWORD bytesAvail = 0; - - if (!PeekNamedPipe(hPipe, chrin, (DWORD)1, &bytesRead, &bytesAvail, NULL)) - return 0; - - if (bytesAvail == 0) - return 0; - - if (!ReadFile(hPipe, chrin, (DWORD)1, &bytesRead, NULL)) - return 0; - -return bytesRead; -} - -bool CProcess::CommandLine(char * cmdLine){ - if (!Pipes.hIn[0]) - return false; - if (!Running || !currTask || !currTask->creationFlag) - return false; - int len = strlen(cmdLine); - if (len){ - strcpy(inBuf, cmdLine); - char * s = inBuf; - s+=len; - *s = '\r'; - s++; - *s = '\n'; - s++; - *s = '\0'; - } - DWORD written; - - if (!WriteFile(Pipes.hIn[0], inBuf, strlen(inBuf), &written, 0)) - return false; - -return true; -} - -bool CProcess::WriteFileAppend(char * fileName, char * line, int /*len*/){ - if (!*fileName) - return false; - - /* Append one line of text to a file */ - FILE * file = fopen(fileName, "a"); - if (file){ - fprintf(file, line); - fprintf(file, "\n"); - fclose(file); - return true; - } -return false; -} - -bool CProcess::OutputLine(WORD outputFlag, char * line, int /*len*/){ - /* Output error lines to List View */ - - CriticalSection.Enter(); - winApp.Report.Append(line, outputFlag); - CriticalSection.Leave(); -return true; -} - diff --git a/rosapps/devutils/vmingw/process.h b/rosapps/devutils/vmingw/process.h deleted file mode 100644 index f6bbaf01550..00000000000 --- a/rosapps/devutils/vmingw/process.h +++ /dev/null @@ -1,146 +0,0 @@ -/******************************************************************** -* Module: process.h. This is part of Visual-MinGW. -* -* License: Visual-MinGW is covered by GNU General Public License, -* Copyright (C) 2001 Manu B. -* See license.htm for more details. -* -********************************************************************/ -#ifndef PROCESS_H -#define PROCESS_H -#include "winui.h" -#include "CList.h" - - -class CCommandDlg : public CDlgBase -{ - public: - CCommandDlg(); - ~CCommandDlg(); - - HWND Create(void); - LRESULT CALLBACK CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam); - BOOL OnInitDialog(HWND hwndFocus, LPARAM lInitParam); - BOOL OnCommand(WORD wNotifyCode, WORD wID, HWND hwndCtl); - char cmdLine[1024]; - - protected: - - private: - HWND hCmdLine; -}; - -/******************************************************** - creationFlag truth table - ----------------------------------- - 8 4 2 1 - ------------------ - NO_PIPE 0 0 0 0 - IN_PIPE 0 0 0 1 - OUT_PIPE 0 0 1 0 - ERR_PIPE 0 1 0 0 - OUTERR_PIPE 1 0 1 0 - -*********************************************************/ -#define NO_PIPE 0x0000 -#define IN_PIPE 0x0001 -#define OUT_PIPE 0x0002 -#define ERR_PIPE 0x0004 -#define OUTERR_PIPE 0x000A - -#define STDOUT_NONE 0 -#define STDOUT_FILE_APPEND 1 -#define STDOUT_USER 2 - -class CTask : public CNode -{ - public: - CTask(); - ~CTask(); - - char cmdLine[MAX_PATH]; - char szFileName[MAX_PATH]; - WORD creationFlag; - WORD outputFlag; - - protected: - - private: - -}; - -class CStack : public CList -{ - public: - CStack(); - ~CStack(); - - int Push(CTask * newTask); - CTask * Pop(void); - void Flush(void); - - protected: - - private: - CTask * retBuf; - void DetachCurrent(void); -}; - -class CPipes -{ - public: - CPipes(); - ~CPipes(); - - HANDLE hIn[2]; - HANDLE hOut[2]; - HANDLE hErr[2]; - - bool Create(WORD creationFlag, bool winNT); - bool CloseChildSide(void); - bool CloseParentSide(void); - protected: - - private: - bool Close(int side); -}; - -class CProcess : public CStack -{ - public: - CProcess(); - ~CProcess(); - - bool CommandLine(char * cmdLine); - bool isRunning(void); - CTask * AddTask(char * cmdLine, WORD creationFlag, WORD outputFlag/* = STDOUT_NONE*/); - bool CmdCat(char * cmdLine); - void Run(void); - void Run_Thread_Internal(void); - - CCommandDlg CommandDlg; - protected: - - private: - PROCESS_INFORMATION pi; - bool Running; - DWORD exitCode; - CTask * currTask; - CPipes Pipes; - char * chr; - char inBuf[1024]; - char outBuf[1024]; - char errBuf[1024]; - - bool RunProcess(CTask * task); - - void WriteStdIn(HANDLE hPipe, WORD creationFlag); - void ReadStdErr(HANDLE hPipe, WORD creationFlag); - long ReadStdOut(CTask * task, HANDLE hPipe); - int ReadOneChar(HANDLE hPipe, char * chrin); - - bool WriteFileAppend(char * fileName, char * line, int len=-1); - bool OutputLine(WORD outputFlag, char * line, int len=-1); -}; - -#endif diff --git a/rosapps/devutils/vmingw/project.cpp b/rosapps/devutils/vmingw/project.cpp deleted file mode 100644 index 2b0969f4d3d..00000000000 --- a/rosapps/devutils/vmingw/project.cpp +++ /dev/null @@ -1,1453 +0,0 @@ -/******************************************************************** -* Module: project.cpp. This is part of Visual-MinGW. -* -* Purpose: Procedures to manage a loaded project. -* -* Authors: Manu B. -* -* License: Visual-MinGW is covered by GNU General Public License, -* Copyright (C) 2001 Manu B. -* See license.htm for more details. -* -* Revisions: -* -********************************************************************/ -#include -#include - -#include "project.h" -#include "rsrc.h" - -extern CMessageBox MsgBox; - -// For dialogs. -extern CWinApp winApp; - -WORD AppendPath(char * dirBuffer, WORD offset, char * absolutePath); - -bool CheckFile(CFileItem * file){ - if (!file) - return false; - - char * fileName = file->szFileName; - char * s = fileName; - char * dot = fileName; - char * bkslash = fileName+1; - // Valid relative path ? - if (*dot == '.' && *bkslash == '\\'){ - s+=2; - // Find backslashes & dots. - while (*s != '\0'){ - if (*s == '\\'){ - bkslash = s; - }else if (*s == '.'){ - dot = s; - } - s++; - } - if (*bkslash != '\0'){ - file->nFileOffset = (bkslash - fileName) +1; - }else{ - file->nFileOffset = 0; - return false; - } - - if (dot != fileName) - file->nFileExtension = (dot - fileName) +1; - else - file->nFileExtension = 0; - return true; - } -return false; -} - -WORD AppendPath(char * dirBuffer, WORD offset, char * absolutePath){ - WORD len = 0; - if (absolutePath[0] == '.'){ - if (absolutePath[1] == '\\' && absolutePath[2] != '\0'){ - dirBuffer[offset-1] = '\\'; - strcpy(&dirBuffer[offset], &absolutePath[2]); - len = strlen(&dirBuffer[offset]); - len++; - } - } -return len; -} - - -/******************************************************************** -* Class: COptionsDlg. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -COptionsDlg::COptionsDlg(){ - pProject = NULL; - pMakefile = NULL; -} - -COptionsDlg::~COptionsDlg(){ -} - -LRESULT CALLBACK COptionsDlg::CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam){ - switch(Message){ - case WM_INITDIALOG: - return OnInitDialog((HWND) wParam, lParam); - - case WM_NOTIFY: - OnNotify((int) wParam, (LPNMHDR) lParam); - break; - - case WM_COMMAND: - OnCommand(HIWORD(wParam), LOWORD(wParam), (HWND) lParam); - break; - - case WM_CLOSE: - EndDlg(0); - break; - } -return FALSE; -} - -BOOL COptionsDlg::OnInitDialog(HWND, LPARAM lInitParam){ - // Set pointers. - pProject = (CProject *) lInitParam; - if (pProject == NULL) - return TRUE; - - // Tab control handle and TCITEM. - _hWndTab = ::GetDlgItem(_hWnd, IDC_OPTION_TABS); - tcitem.mask = TCIF_TEXT | TCIF_PARAM; - - // Insert General tab. - HWND hwndChild = GeneralDlg.Create(this, IDD_GENERAL_PANE, NULL, (long) pProject); - tcitem.pszText = "General"; - tcitem.lParam = (long) &GeneralDlg; - ::SendMessage(_hWndTab, TCM_INSERTITEM, 0, - (LPARAM)&tcitem); - SetChildPosition(hwndChild); - - // Insert Compiler tab item. - CompilerDlg.Create(this, IDD_COMPILER, &Pos, (long) pProject); - tcitem.pszText = "Compiler"; - tcitem.lParam = (long) &CompilerDlg; - ::SendMessage(_hWndTab, TCM_INSERTITEM, 1, - (LPARAM)&tcitem); - - // Insert Linker tab. - LinkerDlg.Create(this, IDD_LINKER, &Pos, (long) pProject); - tcitem.pszText = "Linker"; - tcitem.lParam = (long) &LinkerDlg; - ::SendMessage(_hWndTab, TCM_INSERTITEM, 2, - (LPARAM)&tcitem); - - // Insert Archives tab. - ZipDlg.Create(this, IDD_ZIP, &Pos, (long) pProject); - tcitem.pszText = "Archives"; - tcitem.lParam = (long) &ZipDlg; - ::SendMessage(_hWndTab, TCM_INSERTITEM, 3, - (LPARAM)&tcitem); - - // Show the dialog and default pane. - Show(); - GeneralDlg.Show(); - GeneralDlg.SetFocus(); -return TRUE; -} - -BOOL COptionsDlg::OnCommand(WORD wNotifyCode, WORD wID, HWND hwndCtl){ - switch (wID){ - case IDOK: - GeneralDlg.OnCommand(wNotifyCode, wID, hwndCtl); - CompilerDlg.OnCommand(wNotifyCode, wID, hwndCtl); - LinkerDlg.OnCommand(wNotifyCode, wID, hwndCtl); - ZipDlg.OnCommand(wNotifyCode, wID, hwndCtl); - pProject->buildMakefile = true; - pProject->modified = true; - EndDlg(IDOK); - return TRUE; - - case IDCANCEL: - EndDlg(IDCANCEL); - break; - } -return 0; -} - -BOOL COptionsDlg::EndDlg(int nResult){ - GeneralDlg.EndDlg(0); - CompilerDlg.EndDlg(0); - LinkerDlg.EndDlg(0); - ZipDlg.EndDlg(0); - if (_hWnd){ - BOOL result = ::EndDialog(_hWnd, nResult); - _hWnd = 0; - return result; - } -return false; -} - - -/******************************************************************** -* Class: CGeneralDlg. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CGeneralDlg::CGeneralDlg(){ - pProject = NULL; - pMakefile = NULL; -} - -CGeneralDlg::~CGeneralDlg(){ -} - -LRESULT CALLBACK CGeneralDlg::CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam){ - switch(Message){ - case WM_INITDIALOG: - return OnInitDialog((HWND) wParam, lParam); - - case WM_COMMAND: - OnCommand(HIWORD(wParam), LOWORD(wParam), (HWND) lParam); - break; - - case WM_CLOSE: - EndDlg(0); - break; - } -return FALSE; -} - -BOOL CGeneralDlg::OnInitDialog(HWND, LPARAM lInitParam){ - /* Set pointers */ - pProject = (CProject *) lInitParam; - if (pProject == NULL || &pProject->Makefile == NULL) - return TRUE; - pMakefile = &pProject->Makefile; - - /* Get control handles */ - hStatLib = GetItem(IDC_STATLIB); - hDll = GetItem(IDC_DLL); - hConsole = GetItem(IDC_CONSOLE); - hGuiExe = GetItem(IDC_GUIEXE); - hDbgSym = GetItem(IDC_DBGSYM); - hLangC = GetItem(IDC_LANGC); - hLangCpp = GetItem(IDC_LANGCPP); - hMkfName = GetItem(IDC_MKF_NAME); - hMkfDir = GetItem(IDC_MKF_DIR); - hUserMkf = GetItem(IDC_USER_MKF); - hTgtName = GetItem(IDC_TGT_NAME); - hTgtDir = GetItem(IDC_TGT_DIR); - - /* Set buttons state */ - switch(pMakefile->buildWhat){ - case BUILD_STATLIB: - ::SendMessage(hStatLib, BM_SETCHECK, BST_CHECKED, 0); - break; - case BUILD_DLL: - ::SendMessage(hDll, BM_SETCHECK, BST_CHECKED, 0); - break; - case BUILD_EXE: - ::SendMessage(hConsole, BM_SETCHECK, BST_CHECKED, 0); - break; - case BUILD_GUIEXE: - ::SendMessage(hGuiExe, BM_SETCHECK, BST_CHECKED, 0); - break; - } - if (pMakefile->debug) - ::SendMessage(hDbgSym, BM_SETCHECK, BST_CHECKED, 0); - - if (pMakefile->lang == LANGCPP) - ::SendMessage(hLangCpp, BM_SETCHECK, BST_CHECKED, 0); - else - ::SendMessage(hLangC, BM_SETCHECK, BST_CHECKED, 0); - - /* Set text */ - char name[64]; - if (pMakefile->nFileOffset){ - strcpy(name, &pMakefile->szFileName[pMakefile->nFileOffset]); - }else{ - strcpy(name, "noname"); - } - - SetItemText(hMkfName, name); - SetItemText(hMkfDir, pMakefile->mkfDir); - SetItemText(hTgtName, pMakefile->target); - SetItemText(hTgtDir, pMakefile->tgtDir); -return TRUE; -} - -BOOL CGeneralDlg::OnCommand(WORD, WORD wID, HWND){ - switch (wID){ - case IDOK:{ - /* Get text */ - char name[64]; - GetItemText(hMkfName, name, 64); - GetItemText(hMkfDir, pMakefile->mkfDir, MAX_PATH); - GetItemText(hTgtName, pMakefile->target, 64); - GetItemText(hTgtDir, pMakefile->tgtDir, MAX_PATH); - - pMakefile->GetFullPath(pMakefile->szFileName, pProject->nFileOffset, name); - //@@TODO check if directories exist. - - /* Get buttons state */ - char * pExt = strrchr(pMakefile->target, '.'); - if (!pExt){ - int len = strlen(pMakefile->target); - if (!len){ - strcpy(pMakefile->target, "noname"); - len = strlen(pMakefile->target); - } - pExt = pMakefile->target + len; - } - if (BST_CHECKED == ::SendMessage(hStatLib, BM_GETCHECK, 0, 0)){ - pMakefile->buildWhat = BUILD_STATLIB; - strcpy(pExt, ".a"); - }else if (BST_CHECKED == ::SendMessage(hDll, BM_GETCHECK, 0, 0)){ - pMakefile->buildWhat = BUILD_DLL; - strcpy(pExt, ".dll"); - }else if (BST_CHECKED == ::SendMessage(hConsole, BM_GETCHECK, 0, 0)){ - pMakefile->buildWhat = BUILD_EXE; - strcpy(pExt, ".exe"); - }else if (BST_CHECKED == ::SendMessage(hGuiExe, BM_GETCHECK, 0, 0)){ - pMakefile->buildWhat = BUILD_GUIEXE; - strcpy(pExt, ".exe"); - } - pMakefile->debug = - (BST_CHECKED==::SendMessage(hDbgSym, BM_GETCHECK, 0, 0)); - - if (BST_CHECKED == ::SendMessage(hLangCpp, BM_GETCHECK, 0, 0)){ - pMakefile->lang = LANGCPP; - strcpy(pMakefile->cc, "g++"); - }else{ - pMakefile->lang = LANGC; - strcpy(pMakefile->cc, "gcc"); - } - } - return TRUE; - - case IDCANCEL: - return FALSE; - } -return FALSE; -} - - -/******************************************************************** -* Class: CCompilerDlg. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CCompilerDlg::CCompilerDlg(){ - pProject = NULL; - pMakefile = NULL; -} - -CCompilerDlg::~CCompilerDlg(){ -} - -LRESULT CALLBACK CCompilerDlg::CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam){ - switch(Message){ - case WM_INITDIALOG: - return OnInitDialog((HWND) wParam, lParam); - - case WM_COMMAND: - OnCommand(HIWORD(wParam), LOWORD(wParam), (HWND) lParam); - break; - - case WM_CLOSE: - EndDlg(0); - break; - } -return FALSE; -} - -BOOL CCompilerDlg::OnInitDialog(HWND, LPARAM lInitParam){ - // Set pointers. - pProject = (CProject *) lInitParam; - if (pProject == NULL || &pProject->Makefile == NULL) - return TRUE; - pMakefile = &pProject->Makefile; - - hCppFlags = GetItem(IDC_CPPFLAGS); - hWarning = GetItem(IDC_WARNING); - hOptimiz = GetItem(IDC_OPTIMIZ); - hCFlags = GetItem(IDC_CFLAGS); - hIncDirs = GetItem(IDC_INCDIRS); - - SetItemText(hCppFlags, pMakefile->cppFlags); - SetItemText(hWarning, pMakefile->warning); - SetItemText(hOptimiz, pMakefile->optimize); - SetItemText(hCFlags, pMakefile->cFlags); - SetItemText(hIncDirs, pMakefile->incDirs); -return TRUE; -} - -BOOL CCompilerDlg::OnCommand(WORD, WORD wID, HWND){ - switch (wID){ - case IDOK: - GetItemText(hCppFlags, pMakefile->cppFlags, 256); - GetItemText(hWarning, pMakefile->warning, 64); - GetItemText(hOptimiz, pMakefile->optimize, 64); - GetItemText(hCFlags, pMakefile->cFlags, 64); - GetItemText(hIncDirs, pMakefile->incDirs, 256); - return TRUE; - - case IDCANCEL: - return FALSE; - } -return FALSE; -} - - -/******************************************************************** -* Class: CLinkerDlg. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CLinkerDlg::CLinkerDlg(){ - pProject = NULL; - pMakefile = NULL; -} - -CLinkerDlg::~CLinkerDlg(){ -} - -LRESULT CALLBACK CLinkerDlg::CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam){ - switch(Message){ - case WM_INITDIALOG: - return OnInitDialog((HWND) wParam, lParam); - - case WM_COMMAND: - OnCommand(HIWORD(wParam), LOWORD(wParam), (HWND) lParam); - break; - - case WM_CLOSE: - EndDlg(0); - break; - } -return FALSE; -} - -BOOL CLinkerDlg::OnInitDialog(HWND, LPARAM lInitParam){ - // Set pointers. - pProject = (CProject *) lInitParam; - if (pProject == NULL || &pProject->Makefile == NULL) - return TRUE; - pMakefile = &pProject->Makefile; - - hLdStrip = GetItem(IDC_LDSTRIP); - hLdOpts = GetItem(IDC_LDOPTS); - hLdLibs = GetItem(IDC_LDLIBS); - hLibsDirs = GetItem(IDC_LIBDIRS); - - SetItemText(hLdStrip, pMakefile->ldStrip); - SetItemText(hLdOpts, pMakefile->ldOpts); - SetItemText(hLdLibs, pMakefile->ldLibs); - SetItemText(hLibsDirs, pMakefile->libDirs); -return TRUE; -} - -BOOL CLinkerDlg::OnCommand(WORD, WORD wID, HWND){ - switch (wID){ - case IDOK: - GetItemText(hLdStrip, pMakefile->ldStrip, 32); - GetItemText(hLdOpts, pMakefile->ldOpts, 64); - GetItemText(hLdLibs, pMakefile->ldLibs, 64); - GetItemText(hLibsDirs, pMakefile->libDirs, 256); - return TRUE; - - case IDCANCEL: - return FALSE; - } -return FALSE; -} - - -/******************************************************************** -* Class: CZipDlg. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CZipDlg::CZipDlg(){ - pProject = NULL; - pMakefile = NULL; -} - -CZipDlg::~CZipDlg(){ -} - -LRESULT CALLBACK CZipDlg::CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam){ - switch(Message){ - case WM_INITDIALOG: - return OnInitDialog((HWND) wParam, lParam); - - case WM_COMMAND: - OnCommand(HIWORD(wParam), LOWORD(wParam), (HWND) lParam); - break; - - case WM_CLOSE: - EndDlg(0); - break; - } -return FALSE; -} - -BOOL CZipDlg::OnInitDialog(HWND, LPARAM lInitParam){ - // Set pointers. - pProject = (CProject *) lInitParam; - if (pProject == NULL || &pProject->Makefile == NULL) - return TRUE; - pMakefile = &pProject->Makefile; - - hZipDir = GetItem(IDC_ZIP_DIR); - hZipFlags = GetItem(IDC_ZIPFLAGS); - SetItemText(hZipDir, pProject->zipDir); - SetItemText(hZipFlags, pProject->zipFlags); -return TRUE; -} - -BOOL CZipDlg::OnCommand(WORD, WORD wID, HWND){ - switch (wID){ - case IDOK: - GetItemText(hZipDir, pProject->zipDir, MAX_PATH); - GetItemText(hZipFlags, pProject->zipFlags, 256); - return TRUE; - - case IDCANCEL: - return FALSE; - } -return FALSE; -} - - -/******************************************************************** -* Class: CNewModuleDlg. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CNewModuleDlg::CNewModuleDlg(){ - pProject = NULL; -} - -CNewModuleDlg::~CNewModuleDlg(){ -} - -LRESULT CALLBACK CNewModuleDlg::CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam){ - - char fileName[64]; - bool createHeader = true; - HWND wCreateHeader = GetItem(IDC_HEADER); - - switch(Message){ - case WM_INITDIALOG: - pProject = (CProject *) lParam; - if (createHeader) - ::SendMessage(wCreateHeader, BM_SETCHECK, BST_CHECKED, 0); - strcpy(fileName, "new.cpp"); - ::SetDlgItemText(_hWnd, 301, fileName); - return TRUE; - - case WM_COMMAND: - if (LOWORD(wParam) == IDCANCEL){ - fileName[0] = 0; - EndDlg(IDCANCEL); - return FALSE; - }else if(LOWORD(wParam) == IDOK){ - ::GetDlgItemText(_hWnd, 301, fileName, 64); - createHeader = BST_CHECKED == - ::SendMessage(wCreateHeader, BM_GETCHECK, 0, 0); - pProject->NewModule(fileName, createHeader); - EndDlg(IDCANCEL); - return TRUE; - } - break; - - case WM_CLOSE: - EndDlg(0); - break; - } -return FALSE; -} - - -/******************************************************************** -* Class: CProject. -* -* Purpose: Project management. -* -* Revisions: -* -********************************************************************/ -//@@TODO close project Dlg's before closing Project. -CProject::CProject(){ - prjVer = 40; -} - -CProject::~CProject(){ -} - -void CProject::Reset(){ - szFileName[MAX_PATH - 1] = '\0'; // security. - szFileName[0] = '\0'; - szDirBuffer[0] = '\0'; - nFileOffset = 0; - nFileExtension = 0; - - strcpy (zipDir, "."); - strcpy (zipFlags, "*.*"); - numFiles = 0; - loaded = false; - modified = false; - buildMakefile = true; - - compilerName[0] = '\0'; - - Makefile.Init(); -} - -bool CProject::NoProject(void){ - if (!loaded){ - MsgBox.DisplayWarning("No project loaded"); - // Or directly show open project dlg. - return true; - } -return false; -} - -int CProject::CloseDecision(void){ - if (loaded){ - return MsgBox.Ask("Close current project ?", false); - } -return IDNO; -} - -bool CProject::SwitchCurrentDir(void){ - // Switch to Project Directory - szDirBuffer[nFileOffset-1] = '\0'; -return ::SetCurrentDirectory(szDirBuffer); -} - -bool CProject::RelativeToAbsolute(char * relativePath){ - if (*szDirBuffer && nFileOffset){ - if (relativePath[0] == '.' && relativePath[1] == '\\' - && relativePath[2] != '\0'){ - szDirBuffer[nFileOffset-1] = '\\'; - strcpy(&szDirBuffer[nFileOffset], &relativePath[2]); - return true; - } - } -return false; -} - - -/******************************************************************** -* New Project. -********************************************************************/ -bool CProject::New(char * fileName, WORD fileOffset){ - // Load default values. - Reset(); - - // Copy project file's directory. - strcpy(szFileName, fileName); - nFileOffset = fileOffset; - - strncpy(szDirBuffer, szFileName, (nFileOffset - 1)); - szDirBuffer[nFileOffset-1] = '\0'; - strcpy(winApp.projectDir, szDirBuffer); - - // Makefile: Get target name. - nFileExtension = winApp.FileDlg.GetFileExtension(); - strcpy(Makefile.target, &szFileName[nFileOffset]); - char * pExt = strrchr(Makefile.target, '.'); - if (pExt){ - *pExt='\0'; - } - loaded = true; - - AddFiles(); - - Makefile.GetFullPath(szFileName, nFileOffset, "makefile"); - - buildMakefile = true; - OptionsDlg(); - SavePrjFile(IDYES); -return true; -} - -/******************************************************************** -* Open Project. -********************************************************************/ -bool CProject::Open(char * fileName, WORD fileOffset){ - // Initialize project tree view. - Reset(); - - // Copy project file's directory. - strcpy(szFileName, fileName); - nFileOffset = fileOffset; - - strncpy(szDirBuffer, szFileName, (nFileOffset - 1)); - szDirBuffer[nFileOffset-1] = '\0'; - strcpy(winApp.projectDir, szDirBuffer); - - // Load project file in a buffer. - if (!PrjFile.Load(szFileName)){ - MsgBox.DisplayFatal("Can't load project file !"); - //@@ should close inifile ? - return false; - } - - char name[64]; - *name = '\0'; - // [Project] section - int signature = PrjFile.GetInt( "Signature", "Project" ); - if (signature != prjVer){ - MsgBox.DisplayFatal("Bad signature in the project file !"); - return false; - } - - numFiles = PrjFile.GetInt( "NumFiles" ); - PrjFile.GetString(compilerName, "Compiler" ); - buildMakefile = PrjFile.GetInt( "BuildMakefile" ); - - // [Archives] section - PrjFile.GetString(zipDir, "Directory", "Archives" ); - PrjFile.GetString(zipFlags, "Flags"); - - // [Makefile] section - PrjFile.GetString(Makefile.make, "Make", "Makefile" ); - PrjFile.GetString(Makefile.cc, "CC" ); - PrjFile.GetString(Makefile.wres, "WRES" ); - PrjFile.GetString(Makefile.test, "TEST" ); - PrjFile.GetString(name, "Makefile" ); - PrjFile.GetString(Makefile.mkfDir, "MakefileDir"); - PrjFile.GetString(Makefile.target, "Target" ); - PrjFile.GetString(Makefile.tgtDir, "TargetDir" ); - Makefile.buildWhat = PrjFile.GetInt( "Build" ); - Makefile.debug = PrjFile.GetInt( "Debug" ); - Makefile.lang = PrjFile.GetInt( "Lang" ); - PrjFile.GetString(Makefile.cppFlags, "CppFlags" ); - PrjFile.GetString(Makefile.warning, "CcWarning"); - PrjFile.GetString(Makefile.optimize, "CcOptimize"); - PrjFile.GetString(Makefile.cFlags, "CcFlags" ); - PrjFile.GetString(Makefile.incDirs, "IncDirs" ); - PrjFile.GetString(Makefile.ldStrip, "LdStrip" ); - PrjFile.GetString(Makefile.ldOpts, "LdOptions" ); - PrjFile.GetString(Makefile.ldLibs, "LdLibraries"); - PrjFile.GetString(Makefile.libDirs, "LdLibDirs" ); - - Makefile.GetFullPath(szFileName, nFileOffset, name); - - if (numFiles){ - CFileItem * srcFile; - // [FileXX] section - char fileNumber [8]; - char fileSection [16]; - - for (int n=1; n<=numFiles; n++){ - itoa(n, fileNumber, 10); - strcpy(fileSection, "File"); - strcat(fileSection, fileNumber); - - // SrcFile - srcFile = new CFileItem; - srcFile->isInProject = true; - PrjFile.GetString(srcFile->szFileName, "Name", fileSection); - CheckFile(srcFile); - ::GetFileType(srcFile); - srcFile->show = PrjFile.GetInt( "Show" ); - - if(!winApp.Manager.OpenFile(srcFile)){ - delete srcFile; - return false; - } - } - } - loaded = true; -return true; -} - -int CProject::SavePrjFile(int decision){ - if (!loaded || !modified) - return decision; - if (decision == IDNO || decision == IDCANCEL) - return decision; - - /* Ask ? */ - if (decision == IDASK){ - decision = MsgBox.AskToSave(true); // Cancel button. - if (decision != IDYES) - return decision; // IDNO or IDCANCEL. - } - - CProjectView * pProjectView = &winApp.Manager.ProjectView; - FILE * file; - CFileItem * srcFile; - int count = 0; - - numFiles = pProjectView->Length(); - - file = fopen(szFileName, "w"); - if (!file){ - MsgBox.DisplayFatal("Can't save project file !"); - return decision; - } - - // [Project] - fprintf (file, "[Project]\nSignature = %d" , prjVer ); - fprintf (file, "\nNumFiles = %d" , numFiles ); - fprintf (file, "\nCompiler = %s" , compilerName ); - fprintf (file, "\nBuildMakefile = %d" , buildMakefile ); - - // [Archives] - fprintf (file, "\n\n[Archives]\nDirectory = %s" , zipDir ); - fprintf (file, "\nFlags = %s" , zipFlags ); - - // [Makefile] - fprintf (file, "\n\n[Makefile]\nMAKE = %s" , Makefile.make ); - fprintf (file, "\nCC = %s" , Makefile.cc ); - fprintf (file, "\nWRES = %s" , Makefile.wres ); - fprintf (file, "\nTEST = %s" , Makefile.test ); - fprintf (file, "\nMakefile = %s" , &Makefile.szFileName[Makefile.nFileOffset]); - fprintf (file, "\nMakefileDir = %s" , Makefile.mkfDir ); - fprintf (file, "\nTarget = %s" , Makefile.target ); - fprintf (file, "\nTargetDir = %s" , Makefile.tgtDir ); - fprintf (file, "\nBuild = %d" , Makefile.buildWhat ); - fprintf (file, "\nDebug = %d" , Makefile.debug ); - fprintf (file, "\nLang = %d" , Makefile.lang ); - fprintf (file, "\nCppFlags = %s" , Makefile.cppFlags ); - fprintf (file, "\nCcWarning = %s" , Makefile.warning ); - fprintf (file, "\nCcOptimize = %s" , Makefile.optimize ); - fprintf (file, "\nCcFlags = %s" , Makefile.cFlags ); - fprintf (file, "\nIncDirs = %s" , Makefile.incDirs ); - fprintf (file, "\nLdStrip = %s" , Makefile.ldStrip ); - fprintf (file, "\nLdOptions = %s" , Makefile.ldOpts ); - fprintf (file, "\nLdLibraries = %s" , Makefile.ldLibs ); - fprintf (file, "\nLdLibDirs = %s" , Makefile.libDirs ); - - /* [Filexx] */ - srcFile = (CFileItem *) pProjectView->First(); - while (srcFile){ - count++; - fprintf (file, "\n\n[File%d" , count ); - fprintf (file, "]\nName = %s" , srcFile->szFileName ); - fprintf (file, "\nShow = %d" , 0 ); - srcFile = (CFileItem *) pProjectView->Next(); - } - fprintf (file, "\n"); - fclose(file); - modified = false; -return decision; -} - -bool CProject::NewModule(char * name, bool createHeader){ - if (NoProject()) - return false; - - SwitchCurrentDir(); - - CFileItem * srcFile = winApp.Manager.ProjectView.NewFile(name); - if (!srcFile){ - MsgBox.DisplayWarning("Can't create file : %s", name); - return false; - } - if (createHeader && srcFile->type != H_FILE){ - char header[64]; - strcpy(header, name); - char ext[] = "h"; - ChangeFileExt(header, ext); - - if (!winApp.Manager.ProjectView.NewFile(header)){ - MsgBox.DisplayWarning("Can't create file : %s", header); - return false; - } - } -return true; -} - -bool CProject::AddFiles(void){ - if (NoProject()) - return false; - - CFileItem * srcFile; - char srcFiles[2048]; - srcFiles [0] = 0; - WORD fileOffset; - - // Show Open dialog. - if (!winApp.FileDlg.Open(&winApp, srcFiles, 2048, ADD_SRC_FILE)) - return false; // canceled by user - - // Check if srcFiles path includes projectDir. - int n = 0; - int maxlen = nFileOffset - 1; - while (n 2){ - relativePath[nn] = '\\'; - nn++; - } - relativePath[nn] = '\0'; - - // Append each file name. - fileOffset = winApp.FileDlg.GetFileOffset(); - - while (fileOffset){ - // Try to add each file to the project. - srcFile = new CFileItem; - strcpy(srcFile->szFileName, relativePath); - - strcat(srcFile->szFileName, &srcFiles[fileOffset]); - - CheckFile(srcFile); - ::GetFileType(srcFile); - srcFile->show = 0; - srcFile->isInProject = true; - - if(!winApp.Manager.ProjectView.OpenFile(srcFile)){ - delete srcFile; - return false; - } - - fileOffset = winApp.FileDlg.GetNextFileOffset(); - } - modified = true; - buildMakefile = true; - return true; - } - MsgBox.DisplayString("Out of the project"); -return false; -} - -/******************************************************************** -* Dialogs. -********************************************************************/ -bool CProject::OptionsDlg(void){ -/**/ if (NoProject()) - return false; - - _OptionsDlg.CreateModal(&winApp, IDD_OPTION, (LPARAM) this); -return true; -} - -bool CProject::NewModuleDlg(void){ - if (NoProject()) - return false; - - _NewModuleDlg.CreateModal(&winApp, IDD_NEW_MODULE, (LPARAM) this); -return true; -} - -/******************************************************************** -* Project Commands. -********************************************************************/ -void CProject::ZipSrcs(void){ - if (NoProject() || winApp.Process.isRunning()) - return; - - // Switch to Project Directory - SwitchCurrentDir(); - - winApp.Report.Clear(); - - char fileName[64]; - char date[16]; - date[0] = 0; - - // Archive name = zipDir\month+day+year+src.zip - GetDateFormat(LOCALE_USER_DEFAULT, 0, NULL, "MMddyyyy", - date, 16); - - if (*zipDir == '\0') - strcpy (zipDir, "."); - strcpy (fileName, zipDir); - strcat (fileName, "\\"); - strcat (fileName, date); - strcat (fileName, "src"); - strcat (fileName, ".zip"); - - char msgBuf[128]; - sprintf(msgBuf, "Create archive > %s", fileName); - winApp.Report.Append(msgBuf, LVOUT_NORMAL); - - // Put the command line and the run flag in the command stack. - winApp.Process.AddTask( - "zip ", - OUTERR_PIPE, - LVOUT_NORMAL); - - winApp.Process.CmdCat(fileName); - if (*zipFlags){ - winApp.Process.CmdCat(" "); - winApp.Process.CmdCat(zipFlags); - } - - winApp.Process.Run(); -} - -void CProject::Explore(HWND hwnd){ - if (NoProject()) - return; - - if(ShellExecute(hwnd, "explore", szDirBuffer, NULL, NULL, SW_SHOWMAXIMIZED) - < (HINSTANCE) 32){ - MsgBox.DisplayString("Can't launch Explorer"); - return; - } -} - -/******************************************************************** -* Compiler Commands. -********************************************************************/ -void CProject::Build(void){ - if (NoProject() || winApp.Process.isRunning()) - return; - - winApp.Report.Clear(); - winApp.Report.Append("Invoking compiler...", LVOUT_NORMAL); - - // Save modified files - winApp.Manager.ProjectView.SaveAll(IDYES); // Silent. - - // Switch to Makefile Directory - Makefile.SwitchCurrentDir(); - - /* Build makefile ? */ - if (buildMakefile){ - winApp.Report.Append("Building makefile...", LVOUT_NORMAL); - - // Fill buffers and initialize a new process. - Makefile.Build(&winApp.Manager.ProjectView, &winApp.Process); - buildMakefile = false; - modified = true; - } - - // Put the command line and the run flag in the command stack. - winApp.Process.AddTask( - Makefile.make, - OUTERR_PIPE, - LVOUT_ERROR); - - winApp.Process.CmdCat(" -f "); - winApp.Process.CmdCat(&Makefile.szFileName[Makefile.nFileOffset]); - if (Makefile.debug) - winApp.Process.CmdCat(" debug"); - - winApp.Process.Run(); -} - -void CProject::RebuildAll(void){ - if (NoProject() || winApp.Process.isRunning()) - return; - - // Switch to Makefile Directory - Makefile.SwitchCurrentDir(); - - winApp.Report.Clear(); - winApp.Report.Append("Invoking compiler...", LVOUT_NORMAL); - - // Save modified files - winApp.Manager.ProjectView.SaveAll(IDYES); // Silent. - - // Build makefile. - Makefile.Build(&winApp.Manager.ProjectView, &winApp.Process); - buildMakefile = false; - modified = true; - - // Make clean. - winApp.Process.AddTask( - Makefile.make, - OUTERR_PIPE, - LVOUT_ERROR); - - winApp.Process.CmdCat(" -f "); - winApp.Process.CmdCat(&Makefile.szFileName[Makefile.nFileOffset]); - winApp.Process.CmdCat(" clean"); - - // Build. - winApp.Process.AddTask( - Makefile.make, - OUTERR_PIPE, - LVOUT_ERROR); - - winApp.Process.CmdCat(" -f "); - winApp.Process.CmdCat(&Makefile.szFileName[Makefile.nFileOffset]); - if (Makefile.debug) - winApp.Process.CmdCat(" debug"); - - winApp.Process.Run(); -} - -void CProject::RunTarget(void){ - if (NoProject() || winApp.Process.isRunning()) - return; - - if (Makefile.buildWhat == BUILD_STATLIB - || Makefile.buildWhat ==BUILD_DLL) - return; - - winApp.Report.Clear(); - winApp.Report.Append("Run target...", LVOUT_NORMAL); - - // Put the command line and the run flag in the command stack. - winApp.Process.AddTask(szDirBuffer, NO_PIPE, STDOUT_NONE); - winApp.Process.CmdCat("\\"); - if (Makefile.tgtDir[0] == '.'){ - if (Makefile.tgtDir[1] == '.' && Makefile.tgtDir[2] == '\\' - && Makefile.tgtDir[3] != '\0'){ - winApp.Process.CmdCat(&Makefile.tgtDir[3]); - }else{ - // Invalid dir, try ".\target". - winApp.Process.CmdCat("."); - } - } - winApp.Process.CmdCat("\\"); - winApp.Process.CmdCat(Makefile.target); - - winApp.Process.Run(); -} - -void CProject::MakeClean(void){ - if (NoProject() || winApp.Process.isRunning()) - return; - - // Switch to Makefile Directory - Makefile.SwitchCurrentDir(); - - winApp.Report.Clear(); - winApp.Report.Append("Deleting objects...", LVOUT_NORMAL); - - // Put the command line and the output flag in the command stack. - winApp.Process.AddTask( - Makefile.make, - OUTERR_PIPE, - LVOUT_ERROR); - - winApp.Process.CmdCat(" -f "); - winApp.Process.CmdCat(&Makefile.szFileName[Makefile.nFileOffset]); - winApp.Process.CmdCat(" clean"); - - winApp.Process.Run(); -} - -void CProject::BuildMakefile(void){ - if (NoProject() || winApp.Process.isRunning()) - return; - - // Switch to Project Directory - Makefile.SwitchCurrentDir(); - - winApp.Report.Clear(); - winApp.Report.Append("Building makefile...", LVOUT_NORMAL); - - // Fill buffers and initialize a new process. - Makefile.Build(&winApp.Manager.ProjectView, &winApp.Process); - buildMakefile = false; - modified = true; - // Run the process. - winApp.Process.Run(); -} - - -/******************************************************************** -* Class: CMakefile. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CMakefile::CMakefile(){ - Init(); -} - -CMakefile::~CMakefile(){ -} - -void CMakefile::Init(void){ - szFileName[MAX_PATH - 1] = '\0'; // security. - szFileName[0] = '\0'; - nFileOffset = 0; - strcpy (mkfDir, "."); - - strcpy (cc, "gcc"); - strcpy (make, "make"); - strcpy (wres, "windres"); - strcpy (test, "gcc -v"); - - target[0] = '\0'; - strcpy (tgtDir, "."); - buildWhat = BUILD_EXE; - debug = false; - lang = LANGC; - - cppFlags[0] = '\0'; - strcpy (warning, "-W -Wall -pedantic"); - strcpy (optimize, "-O2"); - cFlags[0] = '\0'; - incDirs[0] = '\0'; - - strcpy (ldStrip, "-s"); - ldOpts[0] = '\0'; - ldLibs[0] = '\0'; - libDirs[0] = '\0'; - *arFlags = '\0'; -} - -void CMakefile::GetFullPath(char * prjFileName, WORD offset, char * name){ - // Copy project directory and append makefile relative dir. - strncpy(szFileName, prjFileName, offset); - WORD len = AppendPath(szFileName, offset, mkfDir); - // Increment file offset. - if (len){ - offset += len; - }else{ - strcpy(mkfDir, "."); - } - // Append makefile name. - szFileName[offset-1] = '\\'; - if (*name){ - strcpy(&szFileName[offset], name); - }else{ - strcpy(name, "makefile"); - } - nFileOffset = offset; -} - -bool CMakefile::SwitchCurrentDir(void){ - // Switch to Makefile Directory. - if (nFileOffset < 2) - return false; - szFileName[nFileOffset-1] = '\0'; - bool result = SetCurrentDirectory(szFileName); - szFileName[nFileOffset-1] = '\\'; -return result; -} - -void CMakefile::Build(CProjectView * Tree, CProcess* /*Process*/){ - SrcList2Buffers(Tree); - // Write the first part of the Makefile. - Write(); - - /* Invokes compiler to get dependencies with something like: - "gcc -MM file1.cpp file2.cpp ..." */ - - CTask * task = winApp.Process.AddTask( - depBuf, - OUTERR_PIPE, - STDOUT_FILE_APPEND); - strcpy(task->szFileName, szFileName); -} - -void CMakefile::SrcList2Buffers(CProjectView * Tree){ - - // 1. Begin to fill each buffer. - strcpy(depBuf, cc); - if (*cppFlags != '\0'){ - strcat(depBuf, " "); - strcat(depBuf, cppFlags); - } - strcat(depBuf, " -MM "); - if (*incDirs != '\0'){ - strcat(depBuf, incDirs); - strcat(depBuf, " "); - } - - strcpy(srcBuf, "\nSRCS\t=\\\n"); - strcpy(objBuf, "\nOBJS\t=\\\n"); - resBuf [0] = 0; - - // 2. Parse the module list and retrieve sources files names. - CFileItem* srcFile; - - if(!Tree->First()) - return; // The list is empty, nothing to search. - - do { srcFile = (CFileItem *) Tree->GetCurrent(); - - if (srcFile->type == C_FILE || srcFile->type == RC_FILE){ - // Source files and objects buffers. - strcat (srcBuf, "\t"); - strcat (srcBuf, &srcFile->szFileName[srcFile->nFileOffset]); - strcat (srcBuf, "\\\n"); - - // Change file extension. - char ext[] = "o"; - strcpy(objFile, &srcFile->szFileName[srcFile->nFileOffset]); - ChangeFileExt(objFile, ext); - strcat (objBuf, "\t"); - strcat (objBuf, objFile); - strcat (objBuf, "\\\n"); - - if (srcFile->type == C_FILE){ - // Dependencies buffer. - strcat(depBuf, &srcFile->szFileName[srcFile->nFileOffset]); - strcat(depBuf, " "); - }else if (srcFile->type == RC_FILE){ - // Resource buffer. - strcat (resBuf, objFile); - strcat (resBuf, ": "); - strcat (resBuf, &srcFile->szFileName[srcFile->nFileOffset]); - strcat (resBuf, "\n\n"); - } - } - } while (Tree->Next()); - - int len = strlen(srcBuf); - srcBuf[len-2] = '\n'; - srcBuf[len-1] = 0; - - len = strlen(objBuf); - objBuf[len-2] = '\n'; - objBuf[len-1] = 0; -} - -void CMakefile::Write(void){ - FILE * file; - - file = fopen(szFileName, "w"); - if (!file){ - MsgBox.DisplayString("Can't open file :\r\n%s", szFileName); - return; - } - - /* Signature */ - fprintf (file, "# Generated automatically by Visual-MinGW.\n"); - fprintf (file, "# http://visual-mingw.sourceforge.net/\n"); - - /* Standard defines */ - fprintf (file, "\nCC = %s", cc); - fprintf (file, "\nWRES = %s", wres ); - fprintf (file, "\nDLLWRAP = dllwrap" ); - fprintf (file, "\nCPPFLAGS = %s", cppFlags ); - - if (buildWhat == BUILD_GUIEXE) - fprintf (file, "\nLDBASEFLAGS = -mwindows %s %s", ldOpts, ldLibs ); - else - fprintf (file, "\nLDBASEFLAGS = %s %s", ldOpts, ldLibs ); - fprintf (file, "\nINCDIRS = %s", incDirs ); - fprintf (file, "\nOPTIMIZ = %s", optimize ); - fprintf (file, "\nSTRIP = %s", ldStrip ); - /* Debug symbols ? Language ? */ - fprintf (file, "\n\nifeq ($(MAKECMDGOALS),debug)"); - if (lang == LANGCPP){ - fprintf (file, "\nCXXFLAGS = %s $(INCDIRS) -g %s", warning, cFlags); - fprintf (file, "\nLDFLAGS = $(LDBASEFLAGS)"); - fprintf (file, "\nelse"); - fprintf (file, "\nCXXFLAGS = %s $(INCDIRS) $(OPTIMIZ) %s", warning, cFlags); - fprintf (file, "\nLDFLAGS = $(STRIP) $(LDBASEFLAGS)"); - fprintf (file, "\nendif"); - }else{ - fprintf (file, "\nCFLAGS = %s $(INCDIRS) -g %s", warning, cFlags); - fprintf (file, "\nLDFLAGS = $(LDBASEFLAGS)"); - fprintf (file, "\nelse"); - fprintf (file, "\nCFLAGS = %s $(INCDIRS) $(OPTIMIZ) %s", warning, cFlags); - fprintf (file, "\nLDFLAGS = $(STRIP) $(LDBASEFLAGS)"); - fprintf (file, "\nendif"); - } - /* Directories */ - fprintf (file, "\n\nSRCDIR = %s", mkfDir ); - fprintf (file, "\nBINDIR = %s", tgtDir ); - fprintf (file, "\nLIBDIRS = %s", libDirs ); - /* Rule to compile rc files */ - fprintf (file, "\n\n%c.o : %c.rc\n\t$(WRES) $(CPPFLAGS) $< $@", '%', '%' ); - /* List of objects */ - fprintf (file, "\n%s", objBuf ); - /* Target */ - fprintf (file, "\nTARGET =\t$(BINDIR)\\%s" , target ); - /* all, alldebug */ - fprintf (file, "\n\n# Targets\n" ); - fprintf (file, "all:\t$(TARGET)\n\ndebug:\t$(TARGET)\n\n" ); - /* clean */ - fprintf (file, "cleanobjs:\n\trm -f $(OBJS)\n\n" ); - fprintf (file, "cleanbin:\n\trm -f $(TARGET)\n\n" ); - fprintf (file, "clean:\tcleanobjs cleanbin\n\n" ); - /* Dependencies */ - fprintf (file, "# Dependency rules\n" ); - /* Language */ - if (buildWhat == BUILD_STATLIB){ - fprintf (file, "$(TARGET): $(OBJS)\n\t$(AR) -ru $(BINDIR)\\%s", target); - fprintf (file, " $(OBJS) $(INCDIRS) $(LIBDIRS)\n\n%s", resBuf); - }else if (buildWhat == BUILD_DLL){ - fprintf (file, "$(TARGET): $(OBJS)\n\t$(DLLWRAP) -o $@ $(OBJS) $(LDFLAGS)\n\n" ); - }else if (lang == LANGCPP){ - fprintf (file, "$(TARGET): $(OBJS)\n\t$(CXX) -o $(BINDIR)\\%s", target); - fprintf (file, " $(OBJS) $(INCDIRS) $(LIBDIRS) $(LDFLAGS)\n\n%s",resBuf); - }else{ - fprintf (file, "$(TARGET): $(OBJS)\n\t$(CC) -o $(BINDIR)\\%s", target); - fprintf (file, " $(OBJS) $(INCDIRS) $(LIBDIRS) $(LDFLAGS)\n\n%s",resBuf); - } - fclose(file); -} - - -/******************************************************************** -* Class: CCompiler. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CCompiler::CCompiler(){ - make[0] = '\0'; - cc[0] = '\0'; - cFlags[0] = '\0'; - ldFlags[0] = '\0'; - wres[0] = '\0'; - debug[0] = '\0'; - test[0] = '\0'; -} - -CCompiler::~CCompiler(){ -} - -bool CCompiler::LoadData(char * fullpath){ - Load(fullpath); - // [Common] section - GetString(make, "MAKE", "Common"); - GetString(cc, "CC" ); - GetString(cFlags, "CFLAGS" ); - GetString(ldFlags, "LDFLAGS" ); - GetString(wres, "WRES" ); - GetString(debug, "DEBUG" ); - GetString(test, "TEST" ); -return true; -} - diff --git a/rosapps/devutils/vmingw/project.h b/rosapps/devutils/vmingw/project.h deleted file mode 100644 index 8441579576f..00000000000 --- a/rosapps/devutils/vmingw/project.h +++ /dev/null @@ -1,295 +0,0 @@ -/******************************************************************** -* Module: project.h. This is part of Visual-MinGW. -* -* License: Visual-MinGW is covered by GNU General Public License, -* Copyright (C) 2001 Manu B. -* See license.htm for more details. -* -********************************************************************/ -#ifndef PROJECT_H -#define PROJECT_H - -#include "winui.h" -#include "main.h" -#include "process.h" - -#define BUILD_STATLIB 0 -#define BUILD_DLL 1 -#define BUILD_EXE 2 -#define BUILD_GUIEXE 3 -#define LANGC 0 -#define LANGCPP 1 - -class CProject; -class CMakefile; - -bool CheckFile(CFileItem * file); - -class CGeneralDlg : public CDlgBase -{ - public: - CGeneralDlg(); - virtual ~CGeneralDlg(); - - virtual LRESULT CALLBACK CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam); - BOOL OnInitDialog(HWND hwndFocus, LPARAM lInitParam); - BOOL OnCommand(WORD wNotifyCode, WORD wID, HWND hwndCtl); - - protected: - - private: - CProject *pProject; - CMakefile *pMakefile; - HWND hStatLib; - HWND hDll; - HWND hConsole; - HWND hGuiExe; - HWND hDbgSym; - HWND hLangC; - HWND hLangCpp; - HWND hMkfName; - HWND hMkfDir; - HWND hUserMkf; - HWND hTgtName; - HWND hTgtDir; -}; - -class CCompilerDlg : public CDlgBase -{ - public: - CCompilerDlg(); - virtual ~CCompilerDlg(); - - virtual LRESULT CALLBACK CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam); - BOOL OnInitDialog(HWND hwndFocus, LPARAM lInitParam); - BOOL OnCommand(WORD wNotifyCode, WORD wID, HWND hwndCtl); - - protected: - - private: - CProject *pProject; - CMakefile *pMakefile; - HWND hCppFlags; - HWND hWarning; - HWND hOptimiz; - HWND hCFlags; - HWND hIncDirs; -}; - -class CZipDlg : public CDlgBase -{ - public: - CZipDlg(); - virtual ~CZipDlg(); - - virtual LRESULT CALLBACK CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam); - BOOL OnInitDialog(HWND hwndFocus, LPARAM lInitParam); - BOOL OnCommand(WORD wNotifyCode, WORD wID, HWND hwndCtl); - - protected: - - private: - CProject *pProject; - CMakefile *pMakefile; - HWND hZipDir; - HWND hZipFlags; -}; - -class CLinkerDlg : public CDlgBase -{ - public: - CLinkerDlg(); - virtual ~CLinkerDlg(); - - virtual LRESULT CALLBACK CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam); - BOOL OnInitDialog(HWND hwndFocus, LPARAM lInitParam); - BOOL OnCommand(WORD wNotifyCode, WORD wID, HWND hwndCtl); - - protected: - - private: - CProject *pProject; - CMakefile *pMakefile; - HWND hLdStrip; - HWND hLdOpts; - HWND hLdLibs; - HWND hLibsDirs; -}; - -class COptionsDlg : public CTabbedDlg -{ - public: - COptionsDlg(); - virtual ~COptionsDlg(); - - BOOL EndDlg(int nResult); - virtual LRESULT CALLBACK CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam); - BOOL OnInitDialog(HWND hwndFocus, LPARAM lInitParam); - BOOL OnCommand(WORD wNotifyCode, WORD wID, HWND hwndCtl); - - protected: - - private: - CProject *pProject; - CMakefile *pMakefile; - CGeneralDlg GeneralDlg; - CCompilerDlg CompilerDlg; - CLinkerDlg LinkerDlg; - CZipDlg ZipDlg; -}; - -class CNewModuleDlg : public CDlgBase -{ - public: - CNewModuleDlg(); - virtual ~CNewModuleDlg(); - - virtual LRESULT CALLBACK CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam); - - protected: - - private: - CProject *pProject; -}; - -class CCompiler : public CIniFile -{ - public: - CCompiler(); - ~CCompiler(); - - bool LoadData(char * fullpath); - - char make[64]; - - char cc[16]; - char cFlags[64]; - char ldFlags[64]; - char wres[16]; - - char debug[16]; - char test[16]; - - protected: - - private: -}; - -class CMakefile -{ - public: - CMakefile(); - ~CMakefile(); - - void Init(void); - bool SwitchCurrentDir(void); - void GetFullPath(char * prjFileName, WORD offset, char * name); - void Build(CProjectView * Tree, CProcess* Process); - void SrcList2Buffers(CProjectView * Tree); - void Write(void); - - // File. - char szFileName[MAX_PATH]; - WORD nFileOffset; - char mkfDir[MAX_PATH]; - - // Compiler dependent. - char cc[4]; - char make[64]; - char wres[16]; - char test[16]; - - char target[64]; - char tgtDir[MAX_PATH]; - UINT buildWhat; - bool debug; - UINT lang; - - // Compiler data. - char cppFlags[256]; - char warning[64]; - char optimize[64]; - char cFlags[64]; - char incDirs[256]; - - // Linker data. - char ldStrip[32]; - char ldOpts[64]; - char ldLibs[64]; - char libDirs[256]; - - // Archiver. - char arFlags[64]; - - protected: - - private: - // Buffers. - char objFile[64]; - char srcBuf [1024]; - char objBuf [1024]; - char resBuf [1024]; - char depBuf [256]; -}; - -class CProject //: public CIniFile -{ - public: - CProject(); - ~CProject(); - - bool NoProject(void); - int CloseDecision(void); - bool New(char * fileName, WORD fileOffset); - bool Open(char * fileName, WORD fileOffset); - - bool RelativeToAbsolute(char * relativePath); - bool AddFiles(void); - - bool OptionsDlg(void); - bool NewModuleDlg(void); - bool NewModule(char * srcFile, bool createHeader); - - void ZipSrcs(void); - void Explore(HWND hwnd); - - void Build(void); - void RebuildAll(void); - void RunTarget(void); - void MakeClean(void); - void BuildMakefile(void); - - bool SwitchCurrentDir(void); - - CMakefile Makefile; - - /* May be private members */ - int numFiles; - bool loaded; - bool modified; - bool buildMakefile; - int SavePrjFile(int decision); - - char szFileName[MAX_PATH]; - WORD nFileOffset; - WORD nFileExtension; - char szDirBuffer[MAX_PATH]; - - char zipDir[MAX_PATH]; - char zipFlags[256]; - - char compilerName[64]; - - protected: - - private: - void Reset(); - -CIniFile PrjFile; - COptionsDlg _OptionsDlg; - CNewModuleDlg _NewModuleDlg; - - int prjVer; -}; - -#endif diff --git a/rosapps/devutils/vmingw/rsrc.h b/rosapps/devutils/vmingw/rsrc.h deleted file mode 100644 index 2003f47d156..00000000000 --- a/rosapps/devutils/vmingw/rsrc.h +++ /dev/null @@ -1,168 +0,0 @@ -/******************************************************************** -* Module: resource.h. This is part of Visual-MinGW. -* -* License: Visual-MinGW is covered by GNU General Public License, -* Copyright (C) 2001 Manu B. -* See license.htm for more details. -* -********************************************************************/ -#define APP_VERSION "0.43a" -#define FULL_APP_VERSION "0.43 alpha" - -// Static control ---------------------------- -#define IDC_STATIC -1 - -// Bitmaps ---------------------------------- -#define IDB_TOOLBAR 10 -#define IDB_TREEVIEW 11 - -#define IDAPPLY 20 - -// Preferences Dialog ----------------------- -#define IDD_PREFERENCES 100 -#define IDC_PREF_TABS 101 - -#define IDD_ENVIRON 110 -#define IDC_SET_CCBIN 111 -#define IDC_CCBIN 112 -#define IDC_BROWSE_CC 113 -#define IDC_SET_CMDBIN 114 -#define IDC_CMDBIN 115 -#define IDC_BROWSE_CMD 116 -#define IDC_AUTOEXEC 117 -#define IDC_ENV_VIEW 118 -/*#define IDC_CC_INCDIR 101 -#define IDC_BROWSE 102*/ - -// Find Dialog ------------------------------- -#define IDD_FIND 120 -#define IDC_FINDWHAT 121 -#define IDC_WHOLEWORD 122 -#define IDC_MATCHCASE 123 -#define IDC_REGEXP 124 -#define IDC_WRAP 125 -#define IDC_UNSLASH 126 -#define IDC_DIRECTIONUP 127 -#define IDC_DIRECTIONDOWN 128 - -// Replace ---------------------------------- -#define IDD_REPLACE 130 -#define IDC_REPLACEWITH 131 -#define IDC_REPLACE 132 -#define IDC_REPLACEALL 133 -#define IDC_REPLACEINSEL 134 - -// Find in files ------------------------------- -#define IDD_GREP 135 -#define IDC_GFILTER 136 -#define IDC_GDIR 137 -#define IDC_GBROWSE 139 - -// New module ------------------------------ -#define IDD_NEW_MODULE 140 -#define IDC_HEADER 141 - -// Options ---------------------------------- -#define IDD_OPTION 150 -#define IDC_OPTION_TABS 151 -#define IDC_HELP_BTN 152 - -// General tab --------------------------------- -#define IDD_GENERAL_PANE 160 -#define IDC_STATLIB 161 -#define IDC_DLL 162 -#define IDC_CONSOLE 163 -#define IDC_GUIEXE 164 -#define IDC_DBGSYM 165 -#define IDC_LANGC 166 -#define IDC_LANGCPP 167 -#define IDC_MKF_NAME 168 -#define IDC_MKF_DIR 169 -#define IDC_USER_MKF 170 -#define IDC_TGT_NAME 171 -#define IDC_TGT_DIR 172 - -// Compiler tab ----------------------------- -#define IDD_COMPILER 180 -#define IDC_CPPFLAGS 181 -#define IDC_WARNING 182 -#define IDC_OPTIMIZ 183 -#define IDC_CFLAGS 184 -#define IDC_INCDIRS 185 - -// Linker tab -------------------------------- -#define IDD_LINKER 190 -#define IDC_LDSTRIP 191 -#define IDC_LDOPTS 192 -#define IDC_LDLIBS 193 -#define IDC_LIBDIRS 194 - -#define IDD_ZIP 200 -#define IDC_INFOZIP 201 -#define IDC_TAR_GZIP 202 -#define IDC_TAR_BZ2 203 -#define IDC_ZIP_TEST 204 -#define IDC_ZIP_DIR 205 -#define IDC_ZIPFLAGS 206 -// About ------------------------------------ -#define IDD_ABOUT 210 - -#define IDD_COMMAND 220 -#define IDC_CMDLINE 221 -// Menu ------------------------------------- -#define ID_MENU 1000 -#define IDM_NEW 1001 -#define IDM_OPEN 1002 -//#define IDM_CLOSE 1003 -#define IDM_NEW_PROJECT 1004 -#define IDM_OPEN_PROJECT 1005 -#define IDM_SAVE_PROJECT 1006 -#define IDM_CLOSE_PROJECT 1007 -#define IDM_SAVE 1008 -#define IDM_SAVEAS 1009 -#define IDM_SAVEALL 1010 -#define IDM_PREFERENCES 1011 -#define IDM_PAGESETUP 1012 -#define IDM_PRINT 1013 -#define IDM_QUIT 1014 - -#define IDM_UNDO 1020 -#define IDM_REDO 1021 -#define IDM_CUT 1022 -#define IDM_COPY 1023 -#define IDM_PASTE 1024 -#define IDM_SELECTALL 1025 - -#define IDM_FIND 1030 -#define IDM_REPLACE 1031 -#define IDM_GREP 1032 - -#define IDM_CASCADE 1040 -#define IDM_TILEHORZ 1041 -#define IDM_TILEVERT 1042 -#define IDM_ARRANGE 1043 - -#define IDM_NEW_MODULE 1050 -#define IDM_ADD 1051 -#define IDM_REMOVE_FILE 1052 -#define IDM_REMOVE_MODULE 1053 -#define IDM_OPTION 1054 -#define IDM_ZIP_SRCS 1055 -#define IDM_EXPLORE 1056 - -#define IDM_BUILD 1060 -#define IDM_REBUILDALL 1061 -#define IDM_RUN_TARGET 1062 -#define IDM_MKCLEAN 1063 -#define IDM_MKF_BUILD 1064 -#define IDM_RUN_CMD 1065 - -#define IDM_TEST 1070 - -#define IDM_HELP 1080 -#define IDM_ABOUT 1081 - -#define ID_POPMENU 1100 - -#define ID_FIRSTCHILD 2000 - diff --git a/rosapps/devutils/vmingw/toolbar.bmp b/rosapps/devutils/vmingw/toolbar.bmp deleted file mode 100644 index 17c5497cf7ca606773ca35eec4ca9cf301a87a78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4918 zcmcJSZERE58OQ$=OU{SVMQKd)u^mNP1erwHO^HFHxC1epCXOjD%U6%`;w=?29Ta~7 z$)h7O-PTxHI{8CC%oTBGby1a)pc#b^iG~Z#m>@-Yla|<6TAXVWOE@c9z5hA)Ui*dw zw4v?B=bm$)bIx;~-}yiHC62e6UxYlGEx`BKDzMbDtU-;m<2za<&ue6dZa4?#f$YeD7QkJ5wA2VXngH8D9z1i zW&cT*ntfdRIP3RnQ0s3194*+ocPrp;LX)ovPKSc}Mh`asU^i-O18A)EqG5|4ja$8_ zaX8W7ba0Lbjcjjoyor{ByV30Q;C0Udz}JBmZwJs3K-0dHsPX#IbToh;?b*#KPIR#B z+50y395{%#4<3ZK!vTlS2?ysKI&uikfCpZ$6Mmlu0lx=t{^SULeB>DWj>6;jVefH2 z_WMr3=?~zL|9$-Qop*4AcE8_?6FxtVpE`wKoH>I_`%deIt8!4giuQe zp+FENe;5cwfZu#U=mc7S6^8dh2=D(gh(I_5Unq<~FalpVg3~<_v|jp*wkU0Jc*Ak{ zBT=#?5QxSRh!4P74k3_bnc|N8 zrLsiJVthQ$x`b3Vi?0_JFkLEPe*PaQ+MM~FF7bHD;7qU@c>Nns$;y-nYn5ykoPz7NEFoHd7#0 z>of7XUGoXIi?}unilvcSVAh!Yk~bEsUZb<~!OhH&VpvEkerD(@pN!eU)RBjIj4|C> zX)NPr0CS9G=ZRy-Hgg31*zK-X#a3?~{!F~K$%WkHZkLsBrINtS<#GhB5~CZj?*59z zxZb(z<##jc*jxI_l2@K80ULl8EUo3AMcg(#%4S}J(;R=rffcivS?k;^jtvhV+W{*S zyIoNfm(5mZR`^+XTNAlldU9ePuI# zRy0bk$@x^<_myqyn%(RqZiP23V?npnm%K8kaXqhgZcpY_S7)alE3;Q-wD2uCVE~%- zEsG>KFR#tkeV98mH}UwZ5_qSOH#s&oR!UyWSd}`PQdM{buSEc_U;h-~L3?`Il^FS* z%Qn?xyT%vabcI(BsJ}>kyJLMUR0L|VSm^BB{<9eY;V3kR|t168JhH~-^w^CoZ36(Jd6dJD4 zsQQwN^20;&iig&$(D&w;sutA;YCfaz^H+=!#|nL|?G_7pwcb_F&$}llThi%NVpBSI zqZ#UgZD^Xjyn{8bh!r1#(o$e1wv?B^lDM)ggEo9u^_BUn>nl>(V$lcT;zeft*(&c@ zUeac`U=39Tc>zALFvnHL)Z$`ckvGvcm!i~FhOXqbwztciHaT0~tm{ckwhhgu+T6L6 zy#zIHn-shi-2VRJ!y*G>I`?%0KNs@KBX5#~{km6^z9N6M=d*lhEv?nYpsVZb#j`{< z;vg&yU0oFec^{BB4rGXXP>ckVSskr3F z*!tA;w0J=4tBX`7Fp;~vyZeCae>Zqlb9@zn4SmH;%>1Rk+zWXuEg3GQzUE-q|G2(+ z6(P*s!Ow8$fS5;_uPv!+?tZ4S6s;?HJ)ZXVrvle!+!M3nj?K04n*(mw)URjz(PFWg5j#9zx$TwEU$3RZ2r&5xX|le16QvgjS)>&f>5TSo54L zJfQV{rc|B28ZR^YX~1=ZBLpPyNSkmgq!6zpBYeJu_;sZdlUIzmL*zpB;Y^b-i`lHi zlZnLImC$!B_^-?(k=TaO7^{zwRi#fe3f{SlcnKdSv2L>#^LceqHGS-^;N9=BTA!}4 zd!2hy@J=>g)7KZkb$VNB!7ZT5#fOG4f><@85CcU(Mo^Ns8ok&*JR&gie3*h_e z+#C)cs?0;N_+XJMRSYZhdB5=Od78dftKHUe*=C*S$F^d diff --git a/rosapps/devutils/vmingw/treeview.bmp b/rosapps/devutils/vmingw/treeview.bmp deleted file mode 100644 index 04b147f272f47287b944cae03eb9f4fcf135186b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2870 zcmeH|KWx)L6vn?wNI`08D@dR~n-&m|(3U1NEu>NYIK?AsMz&_`MmD;Utz)t=x&va( z$m$J=#o1Vp=+-gWk!rs8&gZ01P%E(@^~Go3^E=<~zIV?~{nh3q)HbgG8TMLivuqQ% zs`rsF7d=mCAiB{8c%a=j7oORL@B8q-`51or$RMyb+eGzs4YeBE-VS#58)&s!@EL2@ zfL;Uen$mLcdF}53M_j~!ZMYBY9yGDrY2uC7Lf`>mXAxn*fuPf5%LRD55OPi*t^Gb4 zjS%vK=P}H<7vS9iTc-~MA(}zJb+*y%cG2#2(Ea40+v}n8K49yk(V3+|d51Nq&rR2eN-FjHG!5MHSi11&Ggpgd2@xsl#K`ZzfO5($YH1m{{{UjJuS zRworWGmVV$EYkAE^y$*|WY%xCHyU8qgA@Ktyx`1g&?wCF$%iW&o0AHZ@{D*UrIt6Q z52X@ZIZ>nPqZX=B#o}{l4y48UTqjR?Jc>@CC_JoeJSR_zrZUo}NwvIa`DQ-l#rvbF zGir3d6vYL^`dk4%xi9*h0(td1s1IPpV4NokEl*ZOGkQwwsXWyuJl-Gaqck~0vW!m_ z1-SfFfyETCP2MU{CGG|jYWI&@SUR&lnM<0MpXwE!HOZ%@S6651GXjzsih} z{I-7z&>@URJo5y7eqR*mE>mGzc=hdil?L3I(*k|z@DNRn*Xr7l}+|$0) qD2=1y(5a5iXF{hR<@daPJlW$1QCF7~-~P3evla!c8{sp5^?w2xK%njb diff --git a/rosapps/devutils/vmingw/vmingw.prj b/rosapps/devutils/vmingw/vmingw.prj deleted file mode 100644 index 59188463956..00000000000 --- a/rosapps/devutils/vmingw/vmingw.prj +++ /dev/null @@ -1,91 +0,0 @@ -[Project] -Signature = 40 -NumFiles = 15 -Compiler = mingw -BuildMakefile = 0 - -[Archives] -Directory = .\zip -Flags = *.prj .\bin\*.dll .\src\*.* .\include\*.h -x *.o - -[Makefile] -MAKE = make -CC = g++ -WRES = windres -TEST = gcc -v -Makefile = makefile -MakefileDir = .\src -Target = visual-mingw.exe -TargetDir = ..\bin -Build = 3 -Debug = 0 -Lang = 1 -CppFlags = -D_WIN32_IE=0x0400 -CcWarning = -W -Wall -pedantic -CcOptimize = -O2 -CcFlags = -fvtable-thunks -fno-rtti -IncDirs = -I ../include -LdStrip = -s -LdOptions = -LdLibraries = -lcomctl32 -lole32 -LdLibDirs = - -[File1] -Name = .\src\ChangeLog -Show = 0 - -[File2] -Name = .\src\CList.cpp -Show = 0 - -[File3] -Name = .\src\CList.h -Show = 0 - -[File4] -Name = .\src\editor.cpp -Show = 0 - -[File5] -Name = .\src\editor.h -Show = 0 - -[File6] -Name = .\src\main.cpp -Show = 0 - -[File7] -Name = .\src\main.h -Show = 0 - -[File8] -Name = .\src\process.cpp -Show = 0 - -[File9] -Name = .\src\process.h -Show = 0 - -[File10] -Name = .\src\project.cpp -Show = 0 - -[File11] -Name = .\src\project.h -Show = 0 - -[File12] -Name = .\src\rsrc.h -Show = 0 - -[File13] -Name = .\src\rsrc.rc -Show = 0 - -[File14] -Name = .\src\winui.cpp -Show = 0 - -[File15] -Name = .\src\winui.h -Show = 0 diff --git a/rosapps/devutils/vmingw/vmingw.rc b/rosapps/devutils/vmingw/vmingw.rc deleted file mode 100644 index 0acb13d92fd..00000000000 --- a/rosapps/devutils/vmingw/vmingw.rc +++ /dev/null @@ -1,399 +0,0 @@ -/******************************************************************** -* Module: rsrc.rc. This is part of Visual-MinGW. -* -* Purpose: Resource file. -* -* Authors: Manu B. -* -* License: Visual-MinGW is covered by GNU General Public License, -* Copyright (C) 2001 Manu B. -* See license.htm for more details. -* -* Revisions: 11/06/01. -* -********************************************************************/ -// For Borland Resource Workshop. (It doesn't like windows.h) -#ifndef WORKSHOP_INVOKED -#include "windows.h" -#endif -#include "rsrc.h" - -ID_MENU MENU -BEGIN - POPUP "&File" - BEGIN - MENUITEM "&New" , IDM_NEW - MENUITEM "&Open" , IDM_OPEN - MENUITEM "&Close" , IDM_OPEN, GRAYED - MENUITEM SEPARATOR - MENUITEM "&New Project" , IDM_NEW_PROJECT - MENUITEM "&Open Project" , IDM_OPEN_PROJECT - MENUITEM "&Save Project" , IDM_SAVE_PROJECT - MENUITEM "&Close Project" , IDM_CLOSE_PROJECT - MENUITEM SEPARATOR - MENUITEM "&Save\tCtrl+S" , IDM_SAVE, GRAYED - MENUITEM "Save as" , IDM_SAVEAS, GRAYED - MENUITEM "&Save all" , IDM_SAVEALL - MENUITEM SEPARATOR - MENUITEM "Preferences" , IDM_PREFERENCES - MENUITEM "Page setup" , IDM_PAGESETUP, GRAYED - MENUITEM "&Print" , IDM_PRINT, GRAYED - MENUITEM SEPARATOR - MENUITEM "&Quit" , IDM_QUIT - END - - POPUP "&Edit", GRAYED - BEGIN - MENUITEM "&Undo" , IDM_UNDO - MENUITEM "&Redo" , IDM_REDO - MENUITEM SEPARATOR - MENUITEM "&Cut" , IDM_CUT - MENUITEM "&Copy" , IDM_COPY - MENUITEM "&Paste" , IDM_PASTE - MENUITEM SEPARATOR - MENUITEM "&Select all" , IDM_SELECTALL - END - - POPUP "&Find" - BEGIN - MENUITEM "&Search..." , IDM_FIND, GRAYED - MENUITEM "&Replace" , IDM_REPLACE, GRAYED - MENUITEM "Find in files" , IDM_GREP - END - - POPUP "&Window", GRAYED - BEGIN - MENUITEM "&Cascade" , IDM_CASCADE - MENUITEM "Tile &Horizontal" , IDM_TILEHORZ - MENUITEM "Tile &Vertical" , IDM_TILEVERT - MENUITEM "Arrange &Icons" , IDM_ARRANGE - END - - POPUP "&Project" - BEGIN - MENUITEM "&New Module" , IDM_NEW_MODULE - MENUITEM "&Add files" , IDM_ADD - MENUITEM "&Remove File" , IDM_REMOVE_FILE - MENUITEM "&Remove Module" , IDM_REMOVE_MODULE - MENUITEM "&Options" , IDM_OPTION - MENUITEM "&Create archive" , IDM_ZIP_SRCS - MENUITEM "&Explore" , IDM_EXPLORE - END - - POPUP "&Build" - BEGIN - MENUITEM "&Build" , IDM_BUILD - MENUITEM "&Rebuild All" , IDM_REBUILDALL - MENUITEM "&Run" , IDM_RUN_TARGET - MENUITEM "&Make Clean" , IDM_MKCLEAN - MENUITEM "&Build Makefile" , IDM_MKF_BUILD -#ifdef DEBUG - MENUITEM "&Run command" , IDM_RUN_CMD -#endif - END - -#ifdef DEBUG - POPUP "&Testing" - BEGIN - MENUITEM "a_new_procedure" , IDM_TEST - END -#endif - - POPUP "&?" - BEGIN - MENUITEM "&Help" , IDM_HELP, GRAYED - MENUITEM "&About" , IDM_ABOUT - END -END - -PopupMenu MENU -BEGIN - POPUP "&Editer" - BEGIN - MENUITEM "&Remove" , IDM_REMOVE_MODULE - END -END - -STRINGTABLE DISCARDABLE -BEGIN - IDM_NEW "New" - IDM_OPEN "Open" - IDM_SAVE "Save" - - IDM_CUT "Cut" - IDM_COPY "Copy" - IDM_PASTE "Paste" - - IDM_UNDO "Undo" - IDM_REDO "Redo" - IDM_FIND "Search" - - IDM_PRINT "Print" -END - -IDB_TOOLBAR BITMAP DISCARDABLE "toolbar.bmp" -IDB_TREEVIEW BITMAP DISCARDABLE "treeview.bmp" - -IDD_PREFERENCES DIALOG 0, 0, 283, 197 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Program Preferences" -FONT 8, "MS Sans Serif" -BEGIN - PUSHBUTTON "Ok", IDOK, 115, 179, 50, 14 - PUSHBUTTON "Cancel", IDCANCEL, 172, 179, 50, 14 - CONTROL "", IDC_PREF_TABS, "SysTabControl32", 0x0 | WS_CLIPSIBLINGS, 4, 4, 275, 169 - PUSHBUTTON "Apply", IDAPPLY, 229, 179, 50, 14, WS_DISABLED -END - -// "NOT WS_POPUP" is a workaround for windres prior version 2.11.92. -// LCC's weditres doesn't recognize this flag. -IDD_ENVIRON DIALOG 0, 0, 259, 148 -#ifdef __LCC__ -STYLE DS_CONTROL | WS_CHILD -#else -STYLE DS_CONTROL | WS_CHILD | NOT WS_POPUP -#endif -FONT 8, "MS Sans Serif" -BEGIN - GROUPBOX "Path variable", IDC_STATIC, 3, 3, 252, 140 - EDITTEXT IDC_CCBIN, 20, 26, 165, 12, ES_AUTOHSCROLL - AUTOCHECKBOX "Compiler bin directory", IDC_SET_CCBIN, 8, 16, 86, 10 - PUSHBUTTON "Browse", IDC_BROWSE_CC, 197, 25, 45, 14 - EDITTEXT IDC_CMDBIN, 20, 55, 165, 12, ES_AUTOHSCROLL - AUTOCHECKBOX "Default bin directory", IDC_SET_CMDBIN, 8, 45, 86, 10 - PUSHBUTTON "Browse", IDC_BROWSE_CMD, 197, 54, 45, 14 - AUTOCHECKBOX "Use default environment variables", IDC_AUTOEXEC, 8, 75, 125, 10 - EDITTEXT IDC_ENV_VIEW, 8, 88, 242, 49, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY, WS_EX_TRANSPARENT -END - -IDD_FIND DIALOG 0, 0, 236, 92 -STYLE DS_MODALFRAME | WS_VISIBLE | DS_CENTER | DS_3DLOOK | WS_POPUP | WS_CAPTION -CAPTION "Find" -FONT 8, "MS Sans Serif" -BEGIN - LTEXT "Fi&nd what:",-1,4,8,42,8 - COMBOBOX IDC_FINDWHAT,47,7,128,50, WS_TABSTOP | CBS_DROPDOWN | CBS_AUTOHSCROLL - AUTOCHECKBOX "Match &whole word only", IDC_WHOLEWORD,4,26,100,10, WS_GROUP | WS_TABSTOP - AUTOCHECKBOX "Match &case", IDC_MATCHCASE,4,38,100,10, WS_GROUP | WS_TABSTOP - AUTOCHECKBOX "Regular &expression", IDC_REGEXP,4,50,100,10, WS_GROUP | WS_TABSTOP - AUTOCHECKBOX "Wrap aroun&d", IDC_WRAP,4,62,100,10, WS_GROUP | WS_TABSTOP - AUTOCHECKBOX "Transform &backslash expressions", IDC_UNSLASH,4,74,150,10, WS_GROUP | WS_TABSTOP - GROUPBOX "Direction",1072,107,26,68,28,WS_GROUP - AUTORADIOBUTTON "&Up",IDC_DIRECTIONUP,111,38,25,12, WS_GROUP - AUTORADIOBUTTON "&Down",IDC_DIRECTIONDOWN,138,38,35,12 - DEFPUSHBUTTON "&Find Next",IDOK,182,5,50,14,WS_GROUP - PUSHBUTTON "Cancel",IDCANCEL,182,23,50,14 -END - -IDD_REPLACE DIALOG 0, 0, 260, 108 -STYLE DS_MODALFRAME | WS_VISIBLE | DS_CENTER | DS_3DLOOK | WS_POPUP | WS_CAPTION -CAPTION "Replace" -FONT 8, "MS Sans Serif" -BEGIN - LTEXT "Fi&nd what:",-1,4,9,48,8 - COMBOBOX IDC_FINDWHAT,54,7,114,50,WS_TABSTOP | CBS_DROPDOWN | CBS_AUTOHSCROLL - LTEXT "Re&place with:",-1,4,26,48,8 - COMBOBOX IDC_REPLACEWITH,54,24,114,50,WS_TABSTOP | CBS_DROPDOWN | CBS_AUTOHSCROLL - AUTOCHECKBOX "Match &whole word only", IDC_WHOLEWORD,4,44,100,10, WS_GROUP | WS_TABSTOP - AUTOCHECKBOX "Match &case", IDC_MATCHCASE,4,56,100,10, WS_GROUP | WS_TABSTOP - AUTOCHECKBOX "Regular &expression", IDC_REGEXP,4,68,100,10, WS_GROUP | WS_TABSTOP - AUTOCHECKBOX "Wrap aroun&d", IDC_WRAP,4,80,100,10, WS_GROUP | WS_TABSTOP - AUTOCHECKBOX "Transform &backslash expressions", IDC_UNSLASH,4,92,150,10, WS_GROUP | WS_TABSTOP - DEFPUSHBUTTON "&Find Next",IDOK,174,4,80,14,WS_GROUP - PUSHBUTTON "&Replace",IDC_REPLACE,174,21,80,14 - PUSHBUTTON "Replace &All",IDC_REPLACEALL,174,38,80,14 - PUSHBUTTON "Replace in &Selection",IDC_REPLACEINSEL,174,55,80,14 - PUSHBUTTON "Close",IDCANCEL,174,72,80,14 -END - -IDD_GREP DIALOG 26, 41, 226, 66 -STYLE DS_MODALFRAME | DS_CENTER | DS_3DLOOK | WS_POPUP | WS_CAPTION -CAPTION "Find in Files" -FONT 8, "MS Sans Serif" -BEGIN - LTEXT "Fi&nd what:", IDC_STATIC, 5, 8, 35, 8, NOT WS_GROUP - COMBOBOX IDC_FINDWHAT, 40, 7, 120, 50, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_BORDER | WS_TABSTOP - LTEXT "F&iles:", IDC_STATIC, 5, 28, 30, 8, NOT WS_GROUP - COMBOBOX IDC_GFILTER, 40, 27, 120, 50, CBS_DROPDOWN | WS_BORDER | WS_TABSTOP - LTEXT "&Directory:", IDC_STATIC, 5, 48, 30, 8, NOT WS_GROUP - DEFPUSHBUTTON "&Find", IDOK, 168, 6, 50, 14 - PUSHBUTTON "Cancel", IDCANCEL, 168, 26, 50, 14 - COMBOBOX 138, 40, 47, 120, 50, CBS_DROPDOWN | WS_BORDER | WS_TABSTOP - PUSHBUTTON "Browse", IDC_GBROWSE, 168, 46, 50, 14 -END - -IDD_OPTION DIALOGEX 0, 0, 252, 202 -STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "Project options" -FONT 8, "MS Sans Serif" -BEGIN - CONTROL "", IDC_OPTION_TABS, "SysTabControl32", 0x8000, 4, 5, 244, 173 - PUSHBUTTON "Ok", IDOK, 79, 184, 50, 14 - PUSHBUTTON "Cancel", IDCANCEL, 141, 184, 50, 14 - PUSHBUTTON "Help", IDC_HELP_BTN, 198, 184, 50, 14 -END - -IDD_GENERAL_PANE DIALOG 0, 0, 230, 139 -#ifdef __LCC__ -STYLE DS_CONTROL | WS_CHILD -#else -STYLE DS_CONTROL | WS_CHILD | NOT WS_POPUP -#endif -FONT 8, "MS Sans Serif" -BEGIN - GROUPBOX "Build what ?", IDC_STATIC, 5, 3, 107, 79 - AUTORADIOBUTTON "Static library", IDC_STATLIB, 12, 15, 59, 10, WS_GROUP | WS_TABSTOP - AUTORADIOBUTTON "Dll", IDC_DLL, 12, 28, 59, 10 - AUTORADIOBUTTON "Console executable", IDC_CONSOLE, 12, 41, 78, 10 - AUTORADIOBUTTON "GUI executable", IDC_GUIEXE, 12, 54, 65, 10 - AUTOCHECKBOX "Generate debug symbols", IDC_DBGSYM, 12, 67, 97, 10 - GROUPBOX "Language", IDC_STATIC, 5, 86, 107, 46 - AUTORADIOBUTTON "C", IDC_LANGC, 12, 101, 25, 10, WS_GROUP | WS_TABSTOP - AUTORADIOBUTTON "C++", IDC_LANGCPP, 12, 114, 29, 10 - GROUPBOX "Makefile", IDC_STATIC, 120, 3, 104, 67 - LTEXT "Name", IDC_STATIC, 124, 18, 23, 9 - EDITTEXT IDC_MKF_NAME, 156, 16, 61, 12, ES_AUTOHSCROLL - LTEXT "Directory", IDC_STATIC, 124, 35, 30, 9 - EDITTEXT IDC_MKF_DIR, 156, 33, 61, 12, ES_AUTOHSCROLL - AUTOCHECKBOX "User makefile", IDC_USER_MKF, 125, 52, 62, 10, WS_DISABLED - GROUPBOX "Output file", IDC_STATIC, 120, 76, 104, 56 - LTEXT "Name", IDC_STATIC, 124, 95, 23, 9 - EDITTEXT IDC_TGT_NAME, 156, 93, 61, 12, ES_AUTOHSCROLL - LTEXT "Directory", 133, 123, 112, 30, 9 - EDITTEXT IDC_TGT_DIR, 156, 110, 61, 12, ES_AUTOHSCROLL -END - -IDD_COMPILER DIALOG 0, 0, 230, 139 -#ifdef __LCC__ -STYLE DS_CONTROL | WS_CHILD -#else -STYLE DS_CONTROL | WS_CHILD | NOT WS_POPUP -#endif -FONT 8, "MS Sans Serif" -BEGIN - GROUPBOX "Compiler options", IDC_STATIC, 17, 11, 194, 111 - LTEXT "Preprocessor", IDC_STATIC, 22, 25, 46, 9 - EDITTEXT IDC_CPPFLAGS, 67, 24, 138, 12, ES_AUTOHSCROLL - LTEXT "Warning", IDC_STATIC, 22, 42, 31, 9 - EDITTEXT IDC_WARNING, 67, 40, 138, 12, ES_AUTOHSCROLL - LTEXT "Optimization", IDC_STATIC, 22, 58, 42, 9 - EDITTEXT IDC_OPTIMIZ, 67, 56, 138, 12, ES_AUTOHSCROLL - LTEXT "C/C++", IDC_STATIC, 23, 73, 24, 9 - EDITTEXT IDC_CFLAGS, 67, 72, 138, 12, ES_AUTOHSCROLL - LTEXT "Include directories", IDC_STATIC, 22, 92, 61, 9 - EDITTEXT IDC_INCDIRS, 22, 101, 183, 12, ES_AUTOHSCROLL -END - -IDD_LINKER DIALOG 0, 0, 230, 139 -#ifdef __LCC__ -STYLE DS_CONTROL | WS_CHILD -#else -STYLE DS_CONTROL | WS_CHILD | NOT WS_POPUP -#endif -FONT 8, "MS Sans Serif" -BEGIN - GROUPBOX "Linker", IDC_STATIC, 17, 16, 194, 103 - LTEXT "Strip", IDC_STATIC, 23, 37, 18, 9 - EDITTEXT IDC_LDSTRIP, 53, 36, 53, 12, ES_AUTOHSCROLL - LTEXT "Options", IDC_STATIC, 23, 53, 29, 9 - EDITTEXT IDC_LDOPTS, 53, 52, 151, 12, ES_AUTOHSCROLL - LTEXT "Libraries", IDC_STATIC, 23, 69, 34, 9 - EDITTEXT IDC_LDLIBS, 53, 68, 151, 12, ES_AUTOHSCROLL - LTEXT "Library directories", IDC_STATIC, 23, 88, 61, 9 - EDITTEXT IDC_LIBDIRS, 22, 98, 182, 12, ES_AUTOHSCROLL -END - -IDD_ZIP DIALOG 0, 0, 230, 139 -#ifdef __LCC__ -STYLE DS_CONTROL | WS_CHILD -#else -STYLE DS_CONTROL | WS_CHILD | NOT WS_POPUP -#endif -FONT 8, "MS Sans Serif" -BEGIN - GROUPBOX "Archiver", 304, 15, 7, 87, 58 - AUTORADIOBUTTON "Info-ZIP", IDC_INFOZIP, 20, 17, 39, 10, WS_GROUP - AUTORADIOBUTTON "Tar/Gzip", IDC_TAR_GZIP, 20, 32, 46, 10, WS_DISABLED - AUTORADIOBUTTON "Tar/Bz2", IDC_TAR_BZ2, 20, 47, 44, 10, WS_DISABLED - GROUPBOX "Output File", IDC_STATIC, 15, 71, 195, 56 - LTEXT "Directory", IDC_STATIC, 21, 86, 30, 9 - EDITTEXT IDC_ZIP_DIR, 56, 84, 61, 12, ES_AUTOHSCROLL - LTEXT "Options", IDC_STATIC, 21, 109, 29, 9 - EDITTEXT IDC_ZIPFLAGS, 51, 108, 151, 12, ES_AUTOHSCROLL - GROUPBOX "Date format", 207, 112, 7, 97, 58 - AUTORADIOBUTTON "mmddyyyy", 208, 117, 17, 53, 10 - AUTORADIOBUTTON "ddmmyyyy", 209, 117, 32, 49, 10, WS_DISABLED - AUTORADIOBUTTON "yyyymmdd", 211, 117, 47, 50, 10, WS_DISABLED -END - -IDD_NEW_MODULE DIALOG 226, 122, 142, 39 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "New module" -FONT 8, "MS Sans Serif" -BEGIN - EDITTEXT 301, 6, 4, 84, 12, ES_AUTOHSCROLL - AUTOCHECKBOX "Create header", IDC_HEADER, 21, 22, 58, 10 - PUSHBUTTON "Ok", IDOK, 97, 3, 40, 14 - PUSHBUTTON "Cancel", IDCANCEL, 97, 22, 40, 14 -END - -IDD_ABOUT DIALOG 14, 26, 200, 78 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "About this software..." -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "&OK", IDOK, 140, 18, 50, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - ICON 500, IDC_STATIC, 16, 24, 18, 20, WS_GROUP - GROUPBOX "Informations", IDC_STATIC, 4, 3, 192, 70 - LTEXT "Version 0.42a", IDC_STATIC, 57, 15, 67, 52 -END - -IDD_COMMAND DIALOG 0, 0, 216, 45 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Dialog Title" -FONT 8, "MS Sans Serif" -BEGIN - LTEXT "Command line", IDC_STATIC, 5, 8, 48, 9 - EDITTEXT IDC_CMDLINE, 59, 7, 148, 12, ES_AUTOHSCROLL - PUSHBUTTON "Enter", IDOK, 157, 25, 50, 14 -END - -ACCELS ACCELERATORS -BEGIN - "S", IDM_SAVE, VIRTKEY, CONTROL -END - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,43,0,0 - PRODUCTVERSION 0,43,0,0 - FILEFLAGSMASK 0x3fL -#ifdef DEBUG - FILEFLAGS VS_FF_PRERELEASE -#else - FILEFLAGS 0x0L -#endif - FILEOS VOS_NT_WINDOWS32 - FILETYPE VFT_APP - FILESUBTYPE VFT2_UNKNOWN -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "04090000" - BEGIN - VALUE "CompanyName", "Visual-MinGW project\0" - VALUE "FileDescription", "Visual-MinGW\0" - VALUE "FileVersion", FULL_APP_VERSION - VALUE "InternalName", "visual-mingw\0" - VALUE "LegalCopyright", "Copyright (C) 2001 Manu B\0" - VALUE "OriginalFilename", "visual-mingw.exe\0" - VALUE "ProductName", "Visual-MinGW\0" - VALUE "ProductVersion", FULL_APP_VERSION - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 0 - END -END - diff --git a/rosapps/devutils/vmingw/winui.cpp b/rosapps/devutils/vmingw/winui.cpp deleted file mode 100644 index 9b36390ab2a..00000000000 --- a/rosapps/devutils/vmingw/winui.cpp +++ /dev/null @@ -1,2117 +0,0 @@ -/******************************************************************** -* Module: winui.cpp. This is part of WinUI. -* -* Purpose: WinUI main module. Contains procedures relative to User Interface -* and general purpose procedures. -* -* Authors: Manu B. -* -* License: WinUI is covered by GNU General Public License, -* Copyright (C) 2001 Manu B. -* See license.htm for more details. -* -* Revisions: -* Manu B. 11/19/01 OpenDlg & SaveDlg enhancement. -* Manu B. 12/07/01 CIniFile created. -* Manu B. 12/15/01 CWinApp created. -* -********************************************************************/ -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include "winui.h" - -// Callback procedures. -LRESULT CALLBACK MainWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam); -LRESULT CALLBACK ChildWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam); -LRESULT CALLBACK DlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam); - -// Declare a CMessageBox instance to use anywhere in the whole app. -CMessageBox MsgBox; - - -/******************************************************************** -* Function: char *StpCpy(char *dest, const char *src). -* -* Purpose: stpcpy clone. -* -* Revisions: -* -********************************************************************/ -char *StpCpy(char *dest, const char *src){ - while (*src != '\0'){ - *dest = *src; - src++; - dest++; - } -return dest; -} - -size_t strcpylen(char *dest, const char *src){ - char * start = dest; - while (*src != '\0'){ - *dest = *src; - dest++; - src++; - } - *dest = '\0'; -return (dest-start); -} - - -/******************************************************************** -* Class: CChrono. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CChrono::CChrono(){ - _time = 0; -} - -CChrono::~CChrono(){ -} - -void CChrono::Start(void){ - _time = ::GetTickCount(); -} - -DWORD CChrono::Stop(void){ - DWORD diff = ::GetTickCount() - _time; - _time = 0; -return diff; -} - - -/******************************************************************** -* Class: Base Window class. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CWindow::CWindow(){ - _pParent = NULL; - _hInst = 0; - _hWnd = 0; - _lParam = NULL; -} - -CWindow::~CWindow(){ -} - -HWND CWindow::CreateEx( - CWindow * pWindow, - DWORD dwExStyle, - LPCTSTR lpClassName, - LPCTSTR lpWindowName, - DWORD dwStyle, - int x, int y, int nWidth, int nHeight, - HMENU hMenu, - LPVOID lpParam){ - - // Store a pointer to parent class and to lpParam. - _pParent = pWindow; - _lParam = lpParam; - - // Get parent class handles. - HWND hParent; - HINSTANCE hInst; - - if(_pParent){ - // Have a parent window. - hParent = _pParent->_hWnd; - hInst = _pParent->_hInst; - }else{ - // Parent window is desktop. - hParent = 0; - hInst = GetModuleHandle(NULL); - } - - _hWnd = CreateWindowEx( - dwExStyle, - lpClassName, - lpWindowName, - dwStyle, - x, - y, - nWidth, - nHeight, - hParent, - (HMENU) hMenu, - hInst, - this); // Retrieve lpParam using this->_lParam. - -return _hWnd; -} - -HWND CWindow::GetId(void){ -return _hWnd; -} - -LONG CWindow::SetLong(int nIndex, LONG dwNewLong){ -return ::SetWindowLong(_hWnd, nIndex, dwNewLong); -} - -LONG CWindow::GetLong(int nIndex){ -return ::GetWindowLong(_hWnd, nIndex); -} - -LRESULT CWindow::SendMessage(UINT Msg, WPARAM wParam, LPARAM lParam){ -return ::SendMessage(_hWnd, Msg, wParam, lParam); -} - -bool CWindow::SetPosition(HWND hInsertAfter, int x, int y, int width, int height, UINT uFlags){ -return ::SetWindowPos(_hWnd, hInsertAfter, x, y, width, height, uFlags); -} - -bool CWindow::Show(int nCmdShow){ -return ::ShowWindow(_hWnd, nCmdShow); -} - -bool CWindow::Hide(void){ -return ::ShowWindow(_hWnd, SW_HIDE); -} - -HWND CWindow::SetFocus(void){ -return ::SetFocus(_hWnd); -} - -/******************************************************************** -* Class: CWinBase. -* -* Purpose: Base Application class. -* -* Revisions: -* -********************************************************************/ -CWinBase::CWinBase(){ - hPrevInst = 0; - lpCmdLine = NULL; - nCmdShow = SW_SHOW; - - isWinNT = false; - strcpy( appName, "CWinBase"); -} - -CWinBase::~CWinBase(){ -} - -bool CWinBase::Init(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, - int nCmdShow){ - _hInst = hInstance; - hPrevInst = hPrevInstance; - lpCmdLine = lpCmdLine; - nCmdShow = nCmdShow; -return true; -} - -bool CWinBase::SetName(char * name, char * version){ - strcpy(appName, name); - strcat(appName, " "); - - if(version) - strcat(appName, version); -return true; -} - -bool CWinBase::IsWinNT(void){ - - OSVERSIONINFO osv = {sizeof(OSVERSIONINFO), 0, 0, 0, 0, ""}; - GetVersionEx(&osv); - - isWinNT = (osv.dwPlatformId == VER_PLATFORM_WIN32_NT); -return isWinNT; -} - -void CWinBase::ParseCmdLine(char * outBuff){ - int len = 0; - outBuff[len] = '\0'; - - LPTSTR cmdLine = GetCommandLine(); - - while (*cmdLine){ - if (*cmdLine == '\"'){ - cmdLine++; - while (*cmdLine && *cmdLine != '\"'){ - outBuff[len] = *cmdLine; - len++; - cmdLine++; - } - break; - }else{ - while (*cmdLine && *cmdLine != ' '){ - outBuff[len] = *cmdLine; - len++; - cmdLine++; - } - break; - } - } - outBuff[len] = '\0'; - SplitFileName(outBuff, 0); -return; -} - - -/******************************************************************** -* Class: CSDIBase. -* -* Purpose: Base SDI class. -* -* Revisions: -* -********************************************************************/ -CSDIBase::CSDIBase(){ -mainClass[0] = 0; -hAccel = NULL; -} - -CSDIBase::~CSDIBase(){ -} - -int CSDIBase::Run(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, - int nCmdShow){ - Init(hInstance, hPrevInstance, lpCmdLine, nCmdShow); - if (!CustomInit()){ - Release(); - return 1; - } - - MSG Msg; - if (CreateUI()){ - while(GetMessage(&Msg, NULL, 0, 0)){ - if (!TranslateAccelerator(_hWnd, hAccel, &Msg)){ - TranslateMessage(&Msg); - DispatchMessage(&Msg); - } - } - }else{ - MsgBox.DisplayFatal("CreateUI() failed !"); - } - - Release(); -return Msg.wParam; -} - -bool CSDIBase::CustomInit(void){ -return true; -} - -bool CSDIBase::Release(void){ -return true; -} - -bool CSDIBase::CreateUI(void){ -return false; -} - -bool CSDIBase::MainRegisterEx(const char * className){ - strcpy(mainClass, className); - - // Default values. - wc.cbSize = sizeof(WNDCLASSEX); - wc.lpfnWndProc = MainWndProc; - wc.hInstance = _hInst; - wc.lpszClassName = mainClass; - wc.cbClsExtra = 0; - wc.cbWndExtra = sizeof(CSDIBase *); -return RegisterClassEx(&wc); -} - -LRESULT CALLBACK CSDIBase::CMainWndProc(UINT Message, WPARAM wParam, LPARAM lParam){ - - switch (Message){ - case WM_DESTROY: - PostQuitMessage (0); - return 0; - } - -return DefWindowProc(_hWnd, Message, wParam, lParam); -} - -/******************************************************************** -* Callback procedure. -********************************************************************/ -LRESULT CALLBACK MainWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam){ - // Get a pointer to the CWindow class that owns this window. - CSDIBase * pSdiBase = (CSDIBase *) (GetWindowLong(hwnd, 0)); - - if (pSdiBase == 0){ // The pointer isn't set yet. - if (Message == WM_NCCREATE){ - // First, get the CSDIBase pointer. - pSdiBase = (CSDIBase *) ((CREATESTRUCT *)lParam)->lpCreateParams; - - // Attach pSdiBase and lParam to the window. - SetWindowLong(hwnd, 0, (LONG)(pSdiBase)); - SetWindowLong(hwnd, GWL_USERDATA, (LONG) pSdiBase->_lParam); - - // Store window handle. - pSdiBase->_hWnd = hwnd; - - // Let Windows continue the job. - return pSdiBase->CMainWndProc(Message, wParam, lParam); - }else{ - return DefWindowProc(hwnd, Message, wParam, lParam); - } - } -return pSdiBase->CMainWndProc(Message, wParam, lParam); -} - - -/******************************************************************** -* Class: CMDIBase. -* -* Purpose: Base MDI class. -* -* Revisions: -* -********************************************************************/ -CMDIBase::CMDIBase(){ -} - -CMDIBase::~CMDIBase(){ -} - -bool CMDIBase::ChildRegisterEx(const char * className){ - strcpy(MdiClient.childClass, className); - - // Default values. - wc.cbSize = sizeof(WNDCLASSEX); - wc.lpfnWndProc = ChildWndProc; - wc.hInstance = _hInst; - wc.lpszClassName = className; - wc.cbClsExtra = 0; - wc.cbWndExtra = 8;//sizeof(CMDIBase *); -return RegisterClassEx(&wc); -} - -int CMDIBase::Run(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, - int nCmdShow){ - Init(hInstance, hPrevInstance, lpCmdLine, nCmdShow); - if (!CustomInit()){ - Release(); - return 1; - } - - MSG Msg; - if (CreateUI()){ - while(GetMessage(&Msg, NULL, 0, 0)){ - if (!TranslateAccelerator(_hWnd, hAccel, &Msg)){ - if (!TranslateMDISysAccel(MdiClient.GetId(), &Msg)){ - TranslateMessage(&Msg); - DispatchMessage(&Msg); - } - } - } - }else{ - MsgBox.DisplayFatal("CreateUI() failed !"); - } - - Release(); -return Msg.wParam; -} - -bool CMDIBase::CustomInit(void){ -return true; -} - -bool CMDIBase::Release(void){ -return true; -} - -bool CMDIBase::CreateUI(void){ -return false; -} - -LRESULT CALLBACK CMDIBase::CMainWndProc(UINT, WPARAM, LPARAM){ -return 0; -} - -LRESULT CALLBACK CMDIBase::CChildWndProc(CWindow *, UINT, WPARAM, LPARAM){ -return 0; -} - -/******************************************************************** -* Child window callback procedure. -********************************************************************/ -LRESULT CALLBACK ChildWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam){ - // Get a pointer to the CWindow class that owns this window. - CMDIChild * pMdiChild = (CMDIChild *) (GetWindowLong(hwnd, 0)); - - if (pMdiChild == 0){ // The pointer isn't set yet. - if (Message == WM_NCCREATE){ - // First, get the CMDIChild pointer. - pMdiChild = (CMDIChild *) ((MDICREATESTRUCT *) ((CREATESTRUCT *)lParam)->lpCreateParams)->lParam; - - // Attach pMdiChild and lParam to the window. - //MsgBox.DisplayLong((long) pMdiChild); - - SetWindowLong(hwnd, 0, (long)(pMdiChild)); - SetWindowLong(hwnd, GWL_USERDATA, (long) pMdiChild->_lParam); - - // Store window handle. - pMdiChild->_hWnd = hwnd; - - // Attach to a childList so that the list can destroy all MdiChild objects. - ((CMDIClient *) pMdiChild->_pParent)->childList.InsertFirst(pMdiChild); - - // Let Windows continue the job. - return pMdiChild->_pFrame->CChildWndProc(pMdiChild, Message, wParam, lParam); - }else{ - return DefWindowProc(hwnd, Message, wParam, lParam); - } - - // Free pMdiChild object. - }else if (Message == WM_NCDESTROY){ - ((CMDIClient *) pMdiChild->_pParent)->childList.Destroy(pMdiChild); - } -return pMdiChild->_pFrame->CChildWndProc(pMdiChild, Message, wParam, lParam); -} - - -/******************************************************************** -* Class: CMDIClient. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CMDIClient::CMDIClient(){ - initialized = false; - childClass[0] = 0; -} - -CMDIClient::~CMDIClient(){ -} - -void CMDIClient::Init(int menuIndex, UINT idFirstChild){ - nPos = menuIndex; - - // ID of first created child. - ccs.idFirstChild = idFirstChild; - initialized = true; -} - -HWND CMDIClient::CreateEx(CWindow * pWindow, DWORD dwExStyle, DWORD dwStyle, UINT resId){ - - if (!pWindow || !initialized) - return 0; - - // Store a pointer to parent class. - _pParent = pWindow; - - // Get parent class handles. - _hInst = _pParent->_hInst; - - // Get our "Window menu" handle. - ccs.hWindowMenu = GetSubMenu(GetMenu(_pParent->_hWnd), nPos); - - _hWnd = CreateWindowEx( - dwExStyle, - "mdiclient", - NULL, - dwStyle, - 0, - 0, - 100, - 100, - _pParent->_hWnd, - (HMENU) resId, - _hInst, - (LPVOID) &ccs); - -return _hWnd; -} - -LPARAM CMDIClient::GetParam(LPARAM lParam){ - MDICREATESTRUCT *mcs = (MDICREATESTRUCT *) ((CREATESTRUCT *) lParam)->lpCreateParams; -return mcs->lParam; -} - - -/******************************************************************** -* Class: CMDIChild. -* -* Purpose: Base Windows Class. -* -* Revisions: -* -********************************************************************/ -CMDIChild::CMDIChild(){ - _pFrame = NULL; -} - -CMDIChild::~CMDIChild(){ -} - -HWND CMDIChild::CreateEx(CMDIClient * pMdiClient, DWORD dwExStyle, DWORD dwStyle, char * caption, UINT resId, LPVOID lParam){ - - if (!pMdiClient || !pMdiClient->initialized) - return 0; - - // Store pointers, lParam and _hInst. - _pParent = pMdiClient; - _pFrame = (CMDIBase *) pMdiClient->_pParent; // Owner of CChildWndProc. - _lParam = lParam; - _hInst = _pParent->_hInst; - - HWND hwnd = CreateWindowEx( - dwExStyle, - pMdiClient->childClass, - caption, - dwStyle, - 0, - 0, - 100, - 100, - _pParent->_hWnd, - (HMENU) resId, - _hInst, - this); - -return hwnd; -} - - -/******************************************************************** -* Class: CDlgBase. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CDlgBase::CDlgBase(){ -} - -CDlgBase::~CDlgBase(){ -} - -HWND CDlgBase::Create(CWindow * pWindow, WORD wResId, RECT * Pos, LPARAM lParam){ - HWND hwnd = 0; - if (pWindow){ - hwnd = CreateParam(pWindow, wResId, lParam); - if (Pos) - SetPosition(0, Pos->left, Pos->top, Pos->right, Pos->bottom, 0); - } -return hwnd; -} - -int CDlgBase::CreateModal(CWindow * pWindow, WORD wResId, LPARAM lParam){ - if (pWindow == NULL) - return 0; - - // Don't create a modal dialog if a modeless one already exists. - else if (_hWnd != 0) - return 0; - - // Store a pointer to parent class. - _pParent = pWindow; - _lParam = (LPVOID) lParam; - - // Get parent class handles. - _hInst = _pParent->_hInst; - -return ::DialogBoxParam(_hInst, MAKEINTRESOURCE(wResId), _pParent->_hWnd, - (DLGPROC) DlgProc, (long) this); -} - -HWND CDlgBase::CreateParam(CWindow * pWindow, WORD wResId, LPARAM lParam){ - if (pWindow == NULL) - return 0; - // Don't create a dialog twice. - else if (_hWnd != 0) - return _hWnd; - - // Store a pointer to parent class. - _pParent = pWindow; - _lParam = (LPVOID) lParam; - - // Get parent class handles. - _hInst = _pParent->_hInst; - - HWND hwnd = CreateDialogParam(_hInst, - MAKEINTRESOURCE(wResId), - _pParent->_hWnd, - (DLGPROC) DlgProc, - (long) this); -return hwnd; -} - -BOOL CDlgBase::EndDlg(int nResult){ - if (_hWnd){ - BOOL result = ::EndDialog(_hWnd, nResult); - _hWnd = 0; - return result; - } -return false; -} - -HWND CDlgBase::GetItem(int nIDDlgItem){ -return ::GetDlgItem(_hWnd, nIDDlgItem); -} - -BOOL CDlgBase::SetItemText(HWND hItem, LPCTSTR lpString){ -return ::SendMessage(hItem, WM_SETTEXT, 0, (long)lpString); -} - -UINT CDlgBase::GetItemText(HWND hItem, LPTSTR lpString, int nMaxCount){ -return ::SendMessage(hItem, WM_GETTEXT, nMaxCount, (long)lpString); -} - -LRESULT CALLBACK CDlgBase::CDlgProc(UINT Message, WPARAM, LPARAM){ - - switch(Message){ - case WM_INITDIALOG: - return TRUE; - - case WM_CLOSE: - EndDlg(0); - break; - } -return FALSE; -} - - -/******************************************************************** -* Class: CTabbedDlg. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CTabbedDlg::CTabbedDlg(){ - _hWndTab = 0; - Pos.left = 0; - Pos.top = 0; - Pos.right = 100; - Pos.bottom = 100; -} - -CTabbedDlg::~CTabbedDlg(){ -} - -bool CTabbedDlg::SetChildPosition(HWND hChild){ - if (!_hWndTab) - return false; - // Get tab's display area. - RECT area; - ::GetWindowRect(_hWndTab, &area); - ::ScreenToClient(_hWnd, (POINT *) &area.left); - ::ScreenToClient(_hWnd, (POINT *) &area.right); - ::SendMessage(_hWndTab, TCM_ADJUSTRECT, FALSE, (LPARAM) &area); - ::CopyRect(&Pos, &area); - - // Get child dialog's rect. - RECT child; - ::GetWindowRect(hChild, &child); - ::ScreenToClient(_hWnd, (POINT *) &child.left); - ::ScreenToClient(_hWnd, (POINT *) &child.right); - - // Center child dialog. - int childWidth = child.right-child.left; - int childHeight = child.bottom-child.top; - int hMargin = ((area.right-area.left)-childWidth)/2; - int vMargin = ((area.bottom-area.top)-childHeight)/2; - Pos.left += hMargin; - Pos.top += vMargin; - Pos.right = childWidth; - Pos.bottom = childHeight; - -return ::SetWindowPos(hChild, 0, Pos.left, Pos.top, Pos.right, Pos.bottom, 0); -} - -void CTabbedDlg::OnNotify(int, LPNMHDR notify){ - // Dispatch tab control messages. - switch (notify->code){ - case TCN_SELCHANGING: - OnSelChanging(notify); - break; - - case TCN_SELCHANGE: - OnSelChange(notify); - break; - } -} - -void CTabbedDlg::OnSelChanging(LPNMHDR notify){ - // Hide child dialog that is deselected. - if (notify->hwndFrom == _hWndTab){ - CWindow * pPaneDlg = (CWindow *) GetParam(); - if (pPaneDlg){ - if (pPaneDlg->_hWnd) - pPaneDlg->Hide(); - } - } -} - -void CTabbedDlg::OnSelChange(LPNMHDR notify){ - // Show child dialog that is selected. - if (notify->hwndFrom == _hWndTab){ - CWindow * pPaneDlg = (CWindow *) GetParam(); - if (pPaneDlg){ - if (pPaneDlg->_hWnd) - pPaneDlg->Show(); - pPaneDlg->SetFocus(); - } - } -} - -LPARAM CTabbedDlg::GetParam(void){ - if (!_hWndTab) - return false; - int iItem = ::SendMessage(_hWndTab, TCM_GETCURSEL, 0, 0); - - tcitem.mask = TCIF_PARAM; - BOOL result = ::SendMessage(_hWndTab, TCM_GETITEM, iItem, (long) &tcitem); - if (result) - return tcitem.lParam; -return 0; -} - - -/******************************************************************** -* Callback procedure. -********************************************************************/ -LRESULT CALLBACK DlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam){ - // Get a pointer to the CWindow class that owns this window. - CDlgBase * pDlgBase = (CDlgBase *) (GetWindowLong(hwnd, DWL_USER)); - - if (pDlgBase == 0){ // The pointer isn't set yet. - if (Message == WM_INITDIALOG){ - // First, get the CDlgBase pointer. - pDlgBase = (CDlgBase *) lParam; - - // Attach pDlgBase and lParam to the window. - SetWindowLong(hwnd, DWL_USER, (LONG) pDlgBase); - SetWindowLong(hwnd, GWL_USERDATA, (LONG) pDlgBase->_lParam); - - // Store window handle. - pDlgBase->_hWnd = hwnd; - - // Let Windows continue the job. - return pDlgBase->CDlgProc(Message, wParam, (LONG) pDlgBase->_lParam); - }else{ - return FALSE; - } - } -return pDlgBase->CDlgProc(Message, wParam, lParam); -} - - -/******************************************************************** -* Class: CToolBar. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CToolBar::CToolBar(){ -} - -CToolBar::~CToolBar(){ -} - -HWND CToolBar::CreateEx(CWindow * pWindow, DWORD dwExStyle, DWORD dwStyle, UINT resId){ - - if (!pWindow) - return 0; - - // Store a pointer to parent class. - _pParent = pWindow; - - // Get parent class handles. - _hInst = _pParent->_hInst; - - _hWnd = CreateWindowEx( - dwExStyle, - TOOLBARCLASSNAME, - NULL, - dwStyle, - 0, - 0, - 100, - 100, - _pParent->_hWnd, - (HMENU) resId, - _hInst, - NULL); - - if(_hWnd) - // For backward compatibility. - ::SendMessage(_hWnd, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0); -return _hWnd; -} - -LRESULT CToolBar::AddBitmap(UINT resId, int nBmp, HINSTANCE hInstance){ - if (!_hWnd) - return -1; - - // Add the bitmap containing button images to the toolbar. - TBADDBITMAP tbab; - if (hInstance == HINST_COMMCTRL) - tbab.hInst = hInstance; - else - tbab.hInst = _hInst; - tbab.nID = resId; -return ::SendMessage(_hWnd, TB_ADDBITMAP, (WPARAM) nBmp, (WPARAM) &tbab); -} - -BOOL CToolBar::AddButtons(TBBUTTON * tbButtons, UINT numButtons){ - if (!_hWnd) - return FALSE; - - // Add the buttons to the toolbar. -return ::SendMessage(_hWnd, TB_ADDBUTTONS, (WPARAM) numButtons, (LPARAM) tbButtons); -} - - -/******************************************************************** -* Class: CStatusBar. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CStatusBar::CStatusBar(){ - numParts = 0; -} - -CStatusBar::~CStatusBar(){ -} - -HWND CStatusBar::CreateEx(CWindow * pWindow, DWORD dwExStyle, DWORD dwStyle, UINT resId){ - - if (!pWindow) - return 0; - - // Store a pointer to parent class. - _pParent = pWindow; - - // Get parent class handles. - _hInst = _pParent->_hInst; - - _hWnd = CreateWindowEx( - dwExStyle, - STATUSCLASSNAME, - NULL, - dwStyle, - 0, - 0, - 100, - 100, - _pParent->_hWnd, - (HMENU) resId, - _hInst, - NULL); - -return _hWnd; -} - -void CStatusBar::SetParts(int nParts, int * aWidths){ - numParts = nParts; - ::SendMessage(_hWnd, SB_SETPARTS, nParts, (LPARAM) aWidths); -} - -void CStatusBar::WriteString(char * string, int part){ - if (part <= numParts) - ::SendMessage(_hWnd, SB_SETTEXT, part, (LPARAM) string); -} - -void CStatusBar::WriteLong(long number, int part){ - char longbuf[10]; - itoa (number, longbuf, 10); - WriteString(longbuf, part); -} - - -/******************************************************************** -* Class: CTabCtrl. -* -* Purpose: Tab control. -* -* Revisions: -* -********************************************************************/ -CTabCtrl::CTabCtrl(){ -} - -CTabCtrl::~CTabCtrl(){ -} - -HWND CTabCtrl::CreateEx(CWindow * pWindow, DWORD dwExStyle, DWORD dwStyle, UINT resId, LPVOID lpParam){ - - if (!pWindow) - return 0; - - // TODO also use lpParam for each control ? - // Store a pointer to parent class and to lpParam. - _pParent = pWindow; - _lParam = lpParam; - - // Get parent class handles. - _hInst = _pParent->_hInst; - - _hWnd = CreateWindowEx( - dwExStyle, - WC_TABCONTROL, - NULL, - dwStyle, - 0, - 0, - 100, - 100, - _pParent->_hWnd, - (HMENU) resId, - _hInst, - lpParam); - -return _hWnd; -} - -int CTabCtrl::InsertItem(int iItem, UINT mask, DWORD dwState, DWORD dwStateMask, - LPTSTR pszText, int cchTextMax, int iImage, LPARAM lParam){ - - tcitem.mask = mask; - - #if (_WIN32_IE >= 0x0300) - tcitem.dwState = dwState; - tcitem.dwStateMask = dwStateMask; - #else - tcitem.lpReserved1 = 0; - tcitem.lpReserved2 = 0; - #endif - - tcitem.pszText = pszText; - tcitem.cchTextMax = cchTextMax; - tcitem.iImage = iImage; - tcitem.lParam = lParam; - -return ::SendMessage(_hWnd, TCM_INSERTITEM, iItem, (long) &tcitem); -} - -BOOL CTabCtrl::SetItem_Param(int iItem, LPARAM lParam){ - - tcitem.mask = TCIF_PARAM; - tcitem.lParam = lParam; - -return ::SendMessage(_hWnd, TCM_SETITEM, iItem, (long) &tcitem); -} - -int CTabCtrl::GetCurSel(void){ - -return ::SendMessage(_hWnd, TCM_GETCURSEL, 0, 0); -} - -LPARAM CTabCtrl::GetItem_Param(int iItem){ - - tcitem.mask = TCIF_PARAM; - BOOL result = ::SendMessage(_hWnd, TCM_GETITEM, iItem, (long) &tcitem); - if (result) - return tcitem.lParam; -return 0; -} - - -/******************************************************************** -* Class: CTreeView. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CTreeView::CTreeView(){ -} - -CTreeView::~CTreeView(){ -} - -HWND CTreeView::CreateEx(CWindow * pWindow, DWORD dwExStyle, DWORD dwStyle, UINT resId, LPVOID lpParam){ - - if (!pWindow) - return 0; - - // Store a pointer to parent class. - _pParent = pWindow; - - // Get parent class handles. - _hInst = _pParent->_hInst; - - _hWnd = CreateWindowEx( - dwExStyle, - WC_TREEVIEW, - NULL, - dwStyle, - 0, - 0, - 100, - 100, - _pParent->_hWnd, - (HMENU) resId, - _hInst, - lpParam); - -return _hWnd; -} - -HTREEITEM CTreeView::CreateItem(HTREEITEM hParent, HTREEITEM hInsertAfter, int iImage, LPTSTR pszText, LPARAM lParam){ - - tvi.hParent = hParent; - tvi.hInsertAfter = hInsertAfter; - - tvi.item.mask = TVIF_STATE | TVIF_TEXT | TVIF_IMAGE - | TVIF_SELECTEDIMAGE | TVIF_PARAM ; - tvi.item.stateMask = TVIS_EXPANDED; - tvi.item.state = TVIS_EXPANDED; - tvi.item.pszText = pszText; - tvi.item.iImage = iImage; - tvi.item.iSelectedImage = iImage; - tvi.item.lParam = (LPARAM) lParam; - -return (HTREEITEM) ::SendMessage(_hWnd, TVM_INSERTITEM, 0, (LPARAM)&tvi); -} - -LPARAM CTreeView::GetSelectedItemParam(void){ - _TvItem.hItem = TreeView_GetSelection(_hWnd); - _TvItem.mask = TVIF_PARAM; - _TvItem.lParam = 0; - TreeView_GetItem(_hWnd, (long) &_TvItem); -return _TvItem.lParam; -} - -/******************************************************************** -* Class: CListView. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CListView::CListView(){ - lastRow = 0; -} - -CListView::~CListView(){ -} - -HWND CListView::CreateEx(CWindow * pWindow, DWORD dwExStyle, DWORD dwStyle, UINT resId){ - - if (!pWindow) - return 0; - - // Store a pointer to parent class. - _pParent = pWindow; - - // Get parent class handles. - _hInst = _pParent->_hInst; - - _hWnd = CreateWindowEx( - dwExStyle, - WC_LISTVIEW, - NULL, - dwStyle, - 0, - 0, - 100, - 100, - _pParent->_hWnd, - (HMENU) resId, - _hInst, - NULL); - -return _hWnd; -} - -void CListView::Clear(void){ - // Win9x ListView clear is too slow. - int numitems = ::SendMessage(_hWnd, LVM_GETITEMCOUNT, 0, 0); - for (int n = 0; n < numitems; n++){ - ::SendMessage(_hWnd, LVM_DELETEITEM, (WPARAM) 0, 0); - } - lastRow = 0; -} - - -/******************************************************************** -* Class: CScintilla. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CScintilla::CScintilla(){ -} - -CScintilla::~CScintilla(){ -} - -HWND CScintilla::CreateEx(CWindow * pWindow, DWORD dwExStyle, DWORD dwStyle, UINT resId, LPVOID lpParam){ - - if (!pWindow) - return 0; - - // Store a pointer to parent class. - _pParent = pWindow; - - // Get parent class handles. - _hInst = _pParent->_hInst; - - _hWnd = CreateWindowEx( - dwExStyle, - "Scintilla", - NULL, - dwStyle, - 0, - 0, - 100, - 100, - _pParent->_hWnd, - (HMENU) resId, - _hInst, - lpParam); - -return _hWnd; -} - - -/******************************************************************** -* Class: CSplitter. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CSplitter::CSplitter(){ - Pane1 = NULL; - Pane2 = NULL; - size = 4; - p = 0; - isActive = false; - initialized = false; -} - -CSplitter::~CSplitter(){ -} - -void CSplitter::Init(CWindow * pane1, CWindow * pane2, bool vertical, - int barPos, int barMode){ - Pane1 = pane1; - Pane2 = pane2; - - if(Pane1 && Pane2) - initialized = true; - - isVertical = vertical; - - p = barPos; - mode = barMode; -} - -bool CSplitter::Show(int){ -return false; -} - -bool CSplitter::Hide(void){ -return false; -} - -bool CSplitter::SetPosition(HWND, int x, int y, int width, int height, UINT){ - pos.left = x; - pos.top = y; - pos.right = width; - pos.bottom = height; - - if(isVertical) - SetVertPosition(); - else - SetHorzPosition(); -return true; -} - -void CSplitter::SetVertPosition(void){ - psize = p+size; - - barPos.left = pos.left+p; - barPos.top = pos.top; - barPos.right = size; - barPos.bottom = pos.bottom; - - Pane1->SetPosition(0, - pos.left, - pos.top, - p, - pos.bottom, - 0); - - Pane2->SetPosition(0, - pos.left +psize, - pos.top, - pos.right -psize, - pos.bottom, - 0); -} - -void CSplitter::SetHorzPosition(void){ - psize = p+size; - - barPos.left = pos.left; - barPos.top = pos.top+pos.bottom-psize; - barPos.right = pos.right; - barPos.bottom = size; - - Pane1->SetPosition(0, - pos.left, - pos.top, - pos.right, - pos.bottom -psize, - 0); - - Pane2->SetPosition(0, - pos.left, - pos.top +pos.bottom-p, - pos.right, - p, - 0); -} - -bool CSplitter::HaveMouse(HWND hwnd, short, short){ - POINT ptCursor; - ::GetCursorPos(&ptCursor); - POINT ptClient = ptCursor; - ::ScreenToClient(hwnd, &ptClient); - - if ( ptClient.x >= barPos.left - && ptClient.x <= barPos.left+barPos.right - && ptClient.y >= barPos.top - && ptClient.y <= barPos.top+barPos.bottom){ - return true; - } -return false; -} - -bool CSplitter::OnSetCursor(HWND hwnd, LPARAM){ - if(HaveMouse(hwnd, 0, 0)){ - if (isVertical){ - ::SetCursor(::LoadCursor(NULL, IDC_SIZEWE)); - return true; - }else{ - ::SetCursor(::LoadCursor(NULL, IDC_SIZENS)); - return true; - } - } -return false; -} - -bool CSplitter::OnLButtonDown(HWND hwnd, short xPos, short yPos){ - if (HaveMouse(hwnd, 0, 0)){ - // Begin of mouse capture. - isActive = true; - ::SetCapture(hwnd); - - // Save initial mouse position. - initialPos.x = xPos; - initialPos.y = yPos; - - // Converts bar position for Xor bar. - POINT xorPos; - RECT rect; - xorPos.x = barPos.left; - xorPos.y = barPos.top; - - ClientToWindow(hwnd, &xorPos, &rect); - - // Draw the Xor bar. - HDC hdc; - hdc = GetWindowDC(hwnd); - DrawXorBar(hdc, xorPos.x, xorPos.y, barPos.right, barPos.bottom); - - // Save initial position for future erasing. - initialXorPos.x = xorPos.x; - initialXorPos.y = xorPos.y; - - ReleaseDC(hwnd, hdc); - } -return isActive; -} - -void CSplitter::OnLButtonUp(HWND hwnd, short xPos, short yPos){ - if (isActive) { - - // Erase the Xor bar ********************* - HDC hdc; - hdc = GetWindowDC(hwnd); - DrawXorBar(hdc, initialXorPos.x, initialXorPos.y, barPos.right, barPos.bottom); - ReleaseDC(hwnd, hdc); - - // Move Splitter to new position ******************* - newPos.x = xPos; - newPos.y = yPos; - - if(isVertical) - deltaPos = newPos.x - initialPos.x; - else - deltaPos = newPos.y - initialPos.y;/**/ - - if (deltaPos != 0) - Move(barPos.left + deltaPos, barPos.top + deltaPos); - - // End of capture. - ::ReleaseCapture(); - isActive = false; - } -} - -void CSplitter::OnMouseMove(HWND hwnd, short xPos, short yPos){ - if (isActive) { - newPos.x = xPos; - newPos.y = yPos; - - // Draw the Xor bar ********************* - POINT xorPos; - RECT rect; - - if(isVertical){ - deltaPos = newPos.x - initialPos.x; - xorPos.x = barPos.left + deltaPos; - xorPos.y = barPos.top; - - // Convert coordinates. - ClientToWindow(hwnd, &xorPos, &rect); - - // Convert rect. - OffsetRect(&rect, -rect.left, -rect.top); - - if(xorPos.x < 20) - xorPos.x = 20; - if(xorPos.x > rect.right-24) - xorPos.x = rect.right-24; - }else{ - deltaPos = newPos.y - initialPos.y; - xorPos.x = barPos.left; - xorPos.y = barPos.top + deltaPos; - - // Convert coordinates. - ClientToWindow(hwnd, &xorPos, &rect); - - // Convert rect. - OffsetRect(&rect, -rect.left, -rect.top); - - if(xorPos.y < 20) - xorPos.y = 20; - if(xorPos.y > rect.bottom-24) - xorPos.y = rect.bottom-24; - } - - HDC hdc; - hdc = GetWindowDC(hwnd); - DrawXorBar(hdc, initialXorPos.x, initialXorPos.y, barPos.right, barPos.bottom); - DrawXorBar(hdc, xorPos.x, xorPos.y, barPos.right, barPos.bottom); - initialXorPos.x = xorPos.x; - initialXorPos.y = xorPos.y; - ReleaseDC(hwnd, hdc); - } -} - -void CSplitter::Move(int mouseX, int mouseY){ - - if(isVertical){ - p = mouseX; - SetVertPosition(); - }else{ - p = pos.bottom - size - mouseY+pos.top; - SetHorzPosition(); - } -} - -void CSplitter::ClientToWindow(HWND hwnd, POINT * pt, RECT * rect){ - // Bar position. - ClientToScreen(hwnd, pt); - // Window rect. - GetWindowRect(hwnd, rect); - - // Convert the bar coordinates relative to the top-left of the window. - pt->x -= rect->left; - pt->y -= rect->top; -} - -void CSplitter::DrawXorBar(HDC hdc, int x1, int y1, int width, int height){ - static WORD _dotPatternBmp[8] = - { - 0x00aa, 0x0055, 0x00aa, 0x0055, - 0x00aa, 0x0055, 0x00aa, 0x0055 - }; - - HBITMAP hbm; - HBRUSH hbr, hbrushOld; - - hbm = CreateBitmap(8, 8, 1, 1, _dotPatternBmp); - hbr = CreatePatternBrush(hbm); - - SetBrushOrgEx(hdc, x1, y1, 0); - hbrushOld = (HBRUSH)SelectObject(hdc, hbr); - - PatBlt(hdc, x1, y1, width, height, PATINVERT); - - SelectObject(hdc, hbrushOld); - - DeleteObject(hbr); - DeleteObject(hbm); -} - - -/******************************************************************** -* Class: CBitmap. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CBitmap::CBitmap(){ - hBitmap = NULL; -} - -CBitmap::~CBitmap(){ - if (hBitmap) - DeleteObject(hBitmap); -} - -HBITMAP CBitmap::Load(CWindow * pWindow, LPCTSTR lpBitmapName){ - if (!hBitmap) // Don't create twice. - hBitmap = ::LoadBitmap(pWindow->_hInst, lpBitmapName); -return hBitmap; -} - -HBITMAP CBitmap::Load(CWindow * pWindow, WORD wResId){ - if (!hBitmap) //Don't create twice. - hBitmap = ::LoadBitmap(pWindow->_hInst, MAKEINTRESOURCE(wResId)); -return hBitmap; -} - -BOOL CBitmap::Destroy(void){ - BOOL result = false; - if (hBitmap) - result = DeleteObject(hBitmap); -return result; -} - - -/******************************************************************** -* Class: CImageList. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CImageList::CImageList(){ - hImgList = NULL; -} - -CImageList::~CImageList(){ - if (hImgList) - ImageList_Destroy(hImgList); -} - -HIMAGELIST CImageList::Create(int cx, int cy, UINT flags, int cInitial, int cGrow){ - if (!hImgList) // Don't create twice. - hImgList = ::ImageList_Create(cx, cy, flags, cInitial, cGrow); -return hImgList; -} - -int CImageList::AddMasked(CBitmap * pBitmap, COLORREF crMask){ -return ImageList_AddMasked(hImgList, pBitmap->hBitmap, crMask); -} - - -/******************************************************************** -* Class: CMessageBox. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CMessageBox::CMessageBox(){ - hParent = 0; - strcpy(caption, "CMessageBox"); -} - -CMessageBox::~CMessageBox(){ -} - -void CMessageBox::SetParent(HWND hwnd){ - hParent = hwnd; -} - -void CMessageBox::SetCaption(char * string){ - strcpy(caption, string); -} - -void CMessageBox::DisplayString(char * string, char * substring, UINT uType){ - if(!substring){ - MessageBox (hParent, string, caption, uType); - }else{ - sprintf(msgBuf, string, substring); - MessageBox (hParent, msgBuf, caption, uType); - } -} - -void CMessageBox::DisplayFatal(char * string, char * substring){ - DisplayString(string, substring, MB_OK | MB_ICONERROR); -} - -void CMessageBox::DisplayWarning(char * string, char * substring){ - DisplayString(string, substring, MB_OK | MB_ICONWARNING); -} - -void CMessageBox::DisplayLong(long number){ - char longbuf[10]; - itoa (number, longbuf, 10); - DisplayString(longbuf); -} - -void CMessageBox::DisplayRect(RECT * rect){ - if (!rect) - return; - sprintf(msgBuf, "left: %ld top: %ld right: %ld bottom: %ld", rect->left, rect->top, rect->right, rect->bottom); - MessageBox (hParent, msgBuf, caption, MB_OK); -} - -int CMessageBox::Ask(char * question, bool canCancel){ - - if (canCancel){ - // Cancel button. - return MessageBox(hParent, question, caption, MB_YESNOCANCEL | MB_ICONWARNING); - }else{ - // No cancel. - return MessageBox(hParent, question, caption, MB_YESNO | MB_ICONWARNING); - } -} - -int CMessageBox::AskToSave(bool canCancel){ - - char question[] = "Save changes ?"; - - if (canCancel){ - // Cancel button. - return Ask(question, true); - }else{ - // No cancel. - return Ask(question, false); - } -} - - -/******************************************************************** -* Class: CFileDlgBase. -* -* Purpose: Open/Save Dlg. -* -* Revisions: -* -********************************************************************/ -CFileDlgBase::CFileDlgBase(){ - ofn.lStructSize = sizeof(OPENFILENAME); // DWORD - Reset(); -} - -CFileDlgBase::~CFileDlgBase(){ -} - -void CFileDlgBase::Reset(void){ - // Set methods. - ofn.lpstrTitle = 0; // LPCTSTR - ofn.nFilterIndex = 0; // DWORD - ofn.lpstrFilter = 0; // LPCTSTR - ofn.lpstrDefExt = 0; // LPCTSTR - ofn.Flags = 0; // DWORD - - ofn.lpstrInitialDir = 0; // LPCTSTR - - // Get methods. - nNextFileOffset = 0; - ofn.nFileOffset = 0; // WORD - ofn.nFileExtension = 0; // WORD - - // Unused. - ofn.hInstance = 0; // HINSTANCE - ofn.lpstrCustomFilter = 0; // LPTSTR - ofn.nMaxCustFilter = 0; // DWORD - ofn.lpstrFileTitle = 0; // LPTSTR - ofn.nMaxFileTitle = 0; // DWORD - ofn.lCustData = 0; // DWORD - ofn.lpfnHook = 0; // LPOFNHOOKPROC - ofn.lpTemplateName = 0; // LPCTSTR -} - -void CFileDlgBase::SetData(char * filter, char * defExt, DWORD flags){ - SetFilter(filter); - SetDefExt(defExt); - SetFlags(flags); -} - -void CFileDlgBase::SetTitle(char * title){ - ofn.lpstrTitle = title; -} - -void CFileDlgBase::SetFilterIndex(DWORD filterIndex){ - ofn.nFilterIndex = filterIndex; -} - -void CFileDlgBase::SetFilter(char * filter){ - ofn.lpstrFilter = filter; -} - -void CFileDlgBase::SetDefExt(char * defExt){ - ofn.lpstrDefExt = defExt; -} - -void CFileDlgBase::SetFlags(DWORD flags){ - ofn.Flags = flags; -} - -void CFileDlgBase::SetInitialDir(char * lpstrInitialDir){ - ofn.lpstrInitialDir = lpstrInitialDir; -} - -WORD CFileDlgBase::GetFileOffset(void){ -return ofn.nFileOffset; -} - -WORD CFileDlgBase::GetFileExtension(void){ -return ofn.nFileExtension; -} - -WORD CFileDlgBase::GetNextFileOffset(void){ - // Analyses a "path\0file1\0file2\0file[...]\0\0" string returned by Open/SaveDlg. - char * srcFiles = ofn.lpstrFile; - if (srcFiles){ - if ((ofn.Flags & OFN_ALLOWMULTISELECT) == OFN_ALLOWMULTISELECT){ - // Initialize first call. - if (!nNextFileOffset) - nNextFileOffset = ofn.nFileOffset; - // Parse the string. - while (srcFiles[nNextFileOffset] != '\0') - nNextFileOffset++; - // Get next char. - nNextFileOffset++; - // End of string ? - if (srcFiles[nNextFileOffset] == '\0') - nNextFileOffset = 0; - return nNextFileOffset; - } - } -return 0; -} - -bool CFileDlgBase::OpenFileName(CWindow * pWindow, char * pszFileName, DWORD nMaxFile){ - if (!pWindow) - return false; - - ofn.hwndOwner = pWindow->_hWnd; // HWND - ofn.lpstrFile = pszFileName; // LPTSTR - ofn.nMaxFile = nMaxFile; // DWORD - -return ::GetOpenFileName(&ofn); -} - -bool CFileDlgBase::SaveFileName(CWindow * pWindow, char * pszFileName, DWORD nMaxFile){ - if (!pWindow) - return false; - pszFileName[0] = '\0'; - ofn.hwndOwner = pWindow->_hWnd; // HWND - ofn.lpstrFile = pszFileName; // LPTSTR - ofn.nMaxFile = nMaxFile; // DWORD - -return ::GetSaveFileName(&ofn); -} - - -/******************************************************************** -* Class: CPath. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CPath::CPath(){ -} - -CPath::~CPath(){ -} - -bool CPath::ChangeDirectory(char * dir){ - return SetCurrentDirectory(dir); -} - - -/******************************************************************** -* Paths. -********************************************************************/ -void SplitFileName(char * dirName, char * fileName){ - int n; - int len = strlen (dirName); - - for (n = len; n > 2; n--){ - if (dirName[n] == '\\' ){ - if (fileName) - strcpy (fileName, &dirName[n+1]); - dirName[n+1] = 0; - break; - } - } -} - -bool ChangeFileExt(char * fileName, char * ext){ - int len = strlen(fileName); - for (int n=len; n > 0; n--){ - if (fileName[n] == '.'){ - fileName[n+1] = 0; - strcat(fileName, ext); - return true; - } - } -return false; // No file extension. -} - - -/******************************************************************** -* Class: CIniFile. -* -* Purpose: "GetPrivateProfileString()" like procedure. -* -* Revisions: -* -********************************************************************/ -CIniFile::CIniFile(){ - buffer = NULL; - pcurrent = NULL; - psection = NULL; -} - -CIniFile::~CIniFile(){ - Close(); -} - -void CIniFile::Close(void){ - if (buffer) - free(buffer); - buffer = NULL; - pcurrent = NULL; - psection = NULL; -} - -bool CIniFile::Load(char * fullPath){ - if (buffer) - Close(); - - FILE * file; - - /* FIXME: ZeroMemory because open/close projects can cause - GetString to found data from previous projects. */ -// ZeroMemory(buffer, MAX_BLOC_SIZE); - - file = fopen(fullPath, "rb"); - if (file){ - buffer = (char *) malloc(MAX_BLOC_SIZE); - if (!buffer) - return false; - fread(buffer, 1, MAX_BLOC_SIZE, file); - if (0 != fread(buffer, 1, sizeof(buffer), file)){ - MsgBox.DisplayString("CIniFile ERROR: OVERFOW"); - fclose(file); - Close(); - return false; - } - fclose(file); - - // Initialize current pointer. - pcurrent = buffer; - return true; - } -return false; -} - -int CIniFile::GetInt(char * key, char * section){ - - char integer[32]; - - if (GetString(integer, key, section)){ - return atoi(integer); - } - -return 0; -} - -//****************************************************** -// Reminder : -// GetPrivateProfileString("Section", "Key", "default_string", data, size, iniFilePath); -//****************************************************** -bool CIniFile::GetString(char * data, char * key, char * section){ - /* Copies data and returns true if successfull */ - char *pstop; - if (section){ - /* Parse from pcurrent until the end of buffer */ - pstop = pcurrent; - for ( ; ; ){ - if (*pcurrent == '\0'){ - /* Parse again from beginning to pstop */ - pcurrent = buffer; - for ( ; ; ){ - if (FindSection(pcurrent, section)) - break; // Found ! - if (pcurrent >= pstop) - return false; // Not found ! - } - } - if (FindSection(pcurrent, section)) - break; // Found ! - } - } - - if (psection){ - /* Section Found */ - pstop = pcurrent; - //MsgBox.DisplayString(pcurrent); - for ( ; ; ){ - if (*pcurrent == '\0' || *pcurrent == '['){ - /* Parse again from beginning to pstop */ - pcurrent = psection; - for ( ; ; ){ - if (FindData(pcurrent, key, data)) - break; // Found ! - if (pcurrent >= pstop) - return false; // Not found ! - } - } - if (FindData(pcurrent, key, data)) - break; // Found ! - } - } - //MsgBox.DisplayString(pcurrent); -return true; -} - -bool CIniFile::FindSection(char * s, char * section){ - /* Search the section through one line of text */ - /* Returns true if successful, false otherwise */ - /* This procedure increments current pointer to the end of line */ - - if (!section) - return false; - - bool sectionFound = false; - psection = NULL; - - /* Skip spaces and comments */ - s = SkipUnwanted(s); - - /* End of buffer ? */ - if (*s == '\0'){ - pcurrent = s; - return false; - - /* A section ? */ - }else if (*s == '['){ - s++; - if (*s == '\0'){ - pcurrent = s; - return false; - } - - /* Parse the section name */ - int len = strlen(section); - if (!strncmp(s, section, len)){ - s+=len; - if (*s == ']'){ - /* Section found ! */ - sectionFound = true; - } - } - } - - /* Increment current pointer until the end of current line */ - while (*s != '\0' && *s != '\n') - s++; - pcurrent = s; - - if (sectionFound) - psection = pcurrent; -return sectionFound; -} - -bool CIniFile::FindData(char * s, char * key, char * data){ - /* Search the key through one line of text */ - /* Returns true if successful, false otherwise */ - /* This procedure increments current pointer to the end of line */ - - bool keyFound = false; - /* Skip spaces and comments */ - s = SkipUnwanted(s); - - /* End of buffer ? End of section ? */ - if (*s == '\0' || *s == '['){ - pcurrent = s; - return false; - - /* Search the key */ - }else{ - int len = strlen(key); - /* Compare key and s */ - if (!strncmp(s, key, len)){ - s+=len; - /* Search an '=' sign */ - while (isspace(*s)){ - if (*s == '\n') - break; - s++; - } - - if (*s == '='){ - /* Key found ! */ - keyFound = true; - s++; - while (isspace(*s)){ - if (*s == '\n') - break; - s++; - } - - /* Copy data ! */ - s += CopyData(data, s); - } - } - } - - /* Increment current pointer until the end of current line */ - while (*s != '\0' && *s != '\n') - s++; - pcurrent = s; -return keyFound; -} - -long CIniFile::CopyData(char * data, char * s){ -/* Returns the number of characters copied not including the terminating null char */ - char *pdata = data; - while (*s != '\0' && *s != '\r' && *s != '\n'){ - *pdata = *s; - pdata++; - s++; - - /* @@ Overflow @@ - n++; - if (n == n_max){ - *data = '\0'; - return - }*/ - } - *pdata = '\0'; -return (pdata-data); -} - -char * CIniFile::SkipUnwanted(char *s){ - for ( ; ; ){ - /* End of buffer ? */ - if (*s == '\0') - return s; - if (isspace(*s)){ - /* Skip spaces */ - s++; - }else if (*s == ';'){ - /* Skip comments */ - char * end_of_line = strchr(s, '\n'); - if (end_of_line){ - /* End of comment */ - s = end_of_line+1; - continue; - }else{ - /* End of buffer */ - return end_of_line; - } - /* Done */ - }else{ - return s; - } - } -} - - -/******************************************************************** -* Class: CShellDlg. -* -* Purpose: -* -* Revisions: -* -********************************************************************/ -CShellDlg::CShellDlg(){ - // Get shell task allocator. - if(SHGetMalloc(&pMalloc) == (HRESULT) E_FAIL) - pMalloc = NULL; -} - -CShellDlg::~CShellDlg(){ - // Decrements the reference count. - if (pMalloc) - pMalloc->Release(); -} - -bool CShellDlg::BrowseForFolder(CWindow * pWindow, LPSTR pszDisplayName, - LPCSTR lpszTitle, UINT ulFlags, BFFCALLBACK lpfn, LPARAM lParam, int iImage){ - - // Initialize output buffer. - *pszDisplayName = '\0'; - // BROWSEINFO. - if (!pWindow) - bi.hwndOwner = 0; - else - bi.hwndOwner = pWindow->_hWnd; - bi.pidlRoot = NULL; - bi.pszDisplayName = pszDisplayName; - bi.lpszTitle = lpszTitle; - bi.ulFlags = ulFlags; - bi.lpfn = lpfn; - bi.lParam = lParam; - bi.iImage = iImage; - - LPITEMIDLIST pidl = SHBrowseForFolder(&bi); - if(!pidl) - return false; - - if(!SHGetPathFromIDList(pidl, pszDisplayName)) - return false; - - pMalloc->Free(pidl); -return true; -} - -CCriticalSection::CCriticalSection(){ - ::InitializeCriticalSection(&cs); -} - -CCriticalSection::~CCriticalSection(){ - ::DeleteCriticalSection(&cs); -} - -void CCriticalSection::Enter(){ - ::EnterCriticalSection(&cs); -} - -void CCriticalSection::Leave(){ - ::LeaveCriticalSection(&cs); -} - diff --git a/rosapps/devutils/vmingw/winui.h b/rosapps/devutils/vmingw/winui.h deleted file mode 100644 index b20ddb8ec58..00000000000 --- a/rosapps/devutils/vmingw/winui.h +++ /dev/null @@ -1,529 +0,0 @@ -/******************************************************************** -* Module: winui.h. This is part of WinUI. -* -* License: WinUI is covered by GNU General Public License, -* Copyright (C) 2001 Manu B. -* See license.htm for more details. -* -********************************************************************/ -#ifndef WINUI_H -#define WINUI_H - -/* These are patched headers */ -#include "commdlg.h" -#include "commctrl.h" -#include -#include -#include -// OLE. -#include - -#include "CList.h" - -#define SPLSTYLE_HORZ 0 -#define SPLSTYLE_VERT 1 -#define SPLMODE_1 0 -#define SPLMODE_2 1 - -char *StpCpy(char *dest, const char *src); -size_t strcpylen(char *dest, const char *src); - -void SplitFileName(char * dirName, char * fileName); -bool ChangeFileExt(char * fileName, char * ext); - -class CMessageBox -{ - public: - CMessageBox(); - ~CMessageBox(); - - void SetParent(HWND hwnd); - void SetCaption(char * string); - void DisplayString(char * string, char * substring = NULL, UINT uType = MB_OK); - void DisplayWarning(char * string, char * substring = NULL); - void DisplayFatal(char * string, char * substring = NULL); - void DisplayLong(long number); - void DisplayRect(RECT * rect); - int Ask(char * question, bool canCancel); - int AskToSave(bool canCancel); - - protected: - HWND hParent; - char msgBuf[256]; - char caption[64]; - - private: -}; - -class CPath -{ - public: - CPath(); - ~CPath(); - - bool ChangeDirectory(char * dir); - - protected: - - private: - char pathBuf[MAX_PATH]; -}; - -class CWindow -{ - public: - CWindow(); - virtual ~CWindow(); - - virtual HWND CreateEx(CWindow * pWindow, DWORD dwExStyle, - LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, - int nWidth, int nHeight, HMENU hMenu, LPVOID lpParam); - - HWND GetId(void); - LONG SetLong(int nIndex, LONG dwNewLong); - LONG GetLong(int nIndex); - LRESULT SendMessage(UINT msg, WPARAM wParam = 0, LPARAM lParam = 0); - - virtual bool SetPosition(HWND hInsertAfter, int x, int y, int width, int height, UINT uFlags); - virtual bool Show(int nCmdShow = SW_SHOWNORMAL); - virtual bool Hide(void); - HWND SetFocus(void); - CWindow * _pParent; - HWND _hWnd; - HINSTANCE _hInst; - LPVOID _lParam; - - protected: - - private: -}; - -class CWinBase : public CWindow -{ - public: - CWinBase(); - ~CWinBase(); - - HINSTANCE hPrevInst; - LPSTR lpCmdLine; - int nCmdShow; - - char appName[64]; - char msgBuf[256]; - bool isWinNT; - - bool Init(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, - int nCmdShow); - bool SetName(char * name, char * version = NULL); - void ParseCmdLine(char * outBuff); - bool IsWinNT(void); - - bool ChangeDirectory(char * dir); - - protected: - - private: -}; - -class CSDIBase : public CWinBase -{ - public: - CSDIBase(); - virtual ~CSDIBase(); - - virtual int Run(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow); - virtual bool CustomInit(void); - virtual bool Release(void); - virtual bool CreateUI(void); - bool MainRegisterEx(const char * className); - virtual LRESULT CALLBACK CMainWndProc(UINT Message, WPARAM wParam, LPARAM lParam); - - protected: - WNDCLASSEX wc; - HACCEL hAccel; - char mainClass[16]; - - private: -}; - -class CMDIChild; - -class CMDIClient : public CWindow -{ - public: - CMDIClient(); - ~CMDIClient(); - - void Init(int menuIndex, UINT idFirstChild); - HWND CreateEx(CWindow * pWindow, DWORD dwExStyle, DWORD dwStyle = WS_CHILD, UINT resId = 0); - LPARAM GetParam(LPARAM lParam); - - bool initialized; - char childClass[16]; - CList childList; - - protected: - CLIENTCREATESTRUCT ccs; - int nPos; - - private: -}; - -class UseOle -{ - public: - UseOle(){oleError = OleInitialize(NULL);} - ~UseOle(){OleUninitialize();} - HRESULT GetError(void){return oleError;} - protected: - HRESULT oleError; - private: -}; - -class CMDIBase : public CSDIBase -{ - public: - CMDIBase(); - virtual ~CMDIBase(); - - virtual int Run(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow); - virtual bool CustomInit(void); - virtual bool Release(void); - virtual bool CreateUI(void); - bool ChildRegisterEx(const char * className); - virtual LRESULT CALLBACK CMainWndProc(UINT Message, WPARAM wParam, LPARAM lParam); - virtual LRESULT CALLBACK CChildWndProc(CWindow * pWnd, UINT Message, WPARAM wParam, LPARAM lParam); - - CMDIClient MdiClient; - - protected: - UseOle useOle; - - private: -}; - -class CMDIChild : public CNode, public CWindow -{ - public: - CMDIChild(); - virtual ~CMDIChild(); - - HWND CreateEx(CMDIClient * pMdiClient, DWORD dwExStyle, DWORD dwStyle, char * caption, UINT resId = 0, LPVOID lParam = NULL); - - CMDIBase * _pFrame; - - protected: - - private: -}; - -class CFileDlgBase : public CWindow -{ - public: - CFileDlgBase(); - ~CFileDlgBase(); - - void Reset(void); - void SetData(char * filter, char * defExt, DWORD flags); - void SetTitle(char * title); - void SetFilterIndex(DWORD filterIndex); - void SetFilter(char * filter); - void SetDefExt(char * defExt); - void SetFlags(DWORD flags); - void SetInitialDir(char * lpstrInitialDir); - - WORD GetFileOffset(void); - WORD GetFileExtension(void); - WORD GetNextFileOffset(void); - - bool OpenFileName(CWindow * pWindow, char * pszFileName, DWORD nMaxFile); - bool SaveFileName(CWindow * pWindow, char * pszFileName, DWORD nMaxFile); - OPENFILENAME ofn; - - protected: - - WORD nNextFileOffset; - private: -}; - -class CDlgBase : public CWindow -{ - public: - CDlgBase(); - virtual ~CDlgBase(); - - HWND Create(CWindow * pWindow, WORD wResId, RECT * Pos, LPARAM lParam); - int CreateModal(CWindow * pWindow, WORD wResId, LPARAM lParam); - HWND CreateParam(CWindow * pWindow, WORD wResId, LPARAM lParam); - BOOL EndDlg(int nResult); - virtual LRESULT CALLBACK CDlgProc(UINT Message, WPARAM wParam, LPARAM lParam); - HWND GetItem(int nIDDlgItem); - BOOL SetItemText(HWND hItem, LPCTSTR lpString); - UINT GetItemText(HWND hItem, LPTSTR lpString, int nMaxCount); -/* BOOL SetItemInt(HWND hItem, UINT uValue, BOOL bSigned); - UINT GetItemInt(HWND hItem, BOOL *lpTranslated, BOOL bSigned); -*/ - protected: - - private: -}; - -class CTabbedDlg : public CDlgBase -{ - public: - CTabbedDlg(); - virtual ~CTabbedDlg(); - - virtual void OnNotify(int idCtrl, LPNMHDR notify); - virtual void OnSelChanging(LPNMHDR notify); - virtual void OnSelChange(LPNMHDR notify); - virtual bool SetChildPosition(HWND hChild); - - protected: - LPARAM GetParam(void); - HWND _hWndTab; - RECT Pos; - TCITEM tcitem; - - private: -}; - -class CToolBar : public CWindow -{ - public: - CToolBar(); - ~CToolBar(); - - HWND CreateEx(CWindow * pWindow, DWORD dwExStyle, DWORD dwStyle = WS_CHILD, UINT resId = 0); - LRESULT AddBitmap(UINT resId, int nBmp, HINSTANCE hInstance = 0); - BOOL AddButtons(TBBUTTON * tbButtons, UINT numButtons); - - protected: - - private: -}; - -class CBitmap -{ - public: - CBitmap(); - ~CBitmap(); - - HBITMAP Load(CWindow * pWindow, LPCTSTR lpBitmapName); - HBITMAP Load(CWindow * pWindow, WORD wResId); - BOOL Destroy(void); - - HBITMAP hBitmap; - - protected: - - private: -}; - -class CImageList -{ - public: - CImageList(); - ~CImageList(); - - HIMAGELIST Create(int cx, int cy, UINT flags, int cInitial, int cGrow); - int AddMasked(CBitmap * pBitmap, COLORREF crMask); - HIMAGELIST GetId(void){return hImgList;}; - - protected: - HIMAGELIST hImgList; - - private: -}; - -class CTabCtrl : public CWindow -{ - public: - CTabCtrl(); - ~CTabCtrl(); - - HWND CreateEx(CWindow * pWindow, DWORD dwExStyle, DWORD dwStyle = WS_CHILD, UINT resId = 0, LPVOID lParam = NULL); - BOOL SetItem_Param(int iItem, LPARAM lParam); - LPARAM GetItem_Param(int iItem); - int GetCurSel(void); - int InsertItem(int iItem, UINT mask, DWORD dwState, DWORD dwStateMask, - LPTSTR pszText, int cchTextMax, int iImage, LPARAM lParam); - - protected: - TCITEM tcitem; - - private: -}; - -class CTreeView : public CWindow -{ - public: - CTreeView(); - ~CTreeView(); - - TVINSERTSTRUCT tvi; - TVITEM _TvItem; - HWND CreateEx(CWindow * pWindow, DWORD dwExStyle, DWORD dwStyle = WS_CHILD, UINT resId = 0, LPVOID lParam = NULL); - HTREEITEM CreateItem(HTREEITEM hParent, HTREEITEM hInsertAfter, int iImage, LPTSTR pszText, LPARAM lParam); - LPARAM GetSelectedItemParam(void); - - protected: - private: -}; - -class CScintilla : public CWindow -{ - public: - CScintilla(); - ~CScintilla(); - - HWND CreateEx(CWindow * pWindow, DWORD dwExStyle, DWORD dwStyle = WS_CHILD, UINT resId = 0, LPVOID lParam = NULL); - - protected: - private: -}; - -class CListView : public CWindow -{ - public: - CListView(); - ~CListView(); - - HWND CreateEx(CWindow * pWindow, DWORD dwExStyle, DWORD dwStyle = WS_CHILD, UINT resId = 0); - void Clear(void); - - protected: - DWORD lastRow; - - private: -}; - -class CStatusBar : public CWindow -{ - public: - CStatusBar(); - ~CStatusBar(); - - HWND CreateEx(CWindow * pWindow, DWORD dwExStyle, DWORD dwStyle = WS_CHILD, UINT resId = 0); - void SetParts(int nParts, int * aWidths); - - void WriteString(char * string, int part); - void WriteLong(long number, int part); - - protected: - - private: - int numParts; -}; - -class CSplitter : public CWindow -{ - public: - CSplitter(); - ~CSplitter(); - - void Init(CWindow * pane1, CWindow * pane2, bool vertical, - int barPos, int barMode); - bool SetPosition(HWND hInsertAfter, int x, int y, int width, int height, UINT uFlags); - bool Show(int nCmdShow = SW_SHOWNORMAL); - bool Hide(void); - bool HaveMouse(HWND hwnd, short xPos, short yPos); - void Move(int mouseX, int mouseY); - bool OnLButtonDown(HWND hwnd, short xPos, short yPos); - void OnMouseMove(HWND hwnd, short xPos, short yPos); - void OnLButtonUp(HWND hwnd, short xPos, short yPos); - bool OnSetCursor(HWND hwnd, LPARAM lParam); - - protected: - void SetVertPosition(void); - void SetHorzPosition(void); - void DrawXorBar(HDC hdc, int x1, int y1, int width, int height); - void ClientToWindow(HWND hwnd, POINT * pt, RECT * rect); - - CWindow * Pane1; - CWindow * Pane2; - int p; - int size; - int psize; - bool isVertical; - int mode; - bool isActive; - RECT pos; - RECT barPos; - int deltaPos; - POINT initialXorPos; - - POINT initialPos; - POINT newPos; - private: - bool initialized; -}; - -#define MAX_BLOC_SIZE 16384 -class CIniFile -{ - public: - CIniFile(); - ~CIniFile(); - - bool Load(char * fullPath); - void Close(void); - bool GetString(char * data, char * key, char * section = NULL); - int GetInt(char * key, char * section = NULL); - - protected: - - private: - - char * buffer; - char * pcurrent; - char * psection; - - bool FindSection(char * pcurrent, char * section); - bool FindData(char * s, char * key, char * data); - long CopyData(char * data, char * s); - char *SkipUnwanted(char *s); -}; - -class CChrono -{ - public: - CChrono(); - ~CChrono(); - - void Start(void); - DWORD Stop(void); - - protected: - DWORD _time; - - private: -}; - -class CShellDlg -{ - public: - CShellDlg(); - ~CShellDlg(); - bool BrowseForFolder(CWindow * pWindow, LPSTR pszDisplayName, LPCSTR lpszTitle, - UINT ulFlags, BFFCALLBACK lpfn=0, LPARAM lParam=0, int iImage=0); - - protected: - IMalloc* pMalloc; - BROWSEINFO bi; - - private: -}; - -class CCriticalSection -{ -public: - CCriticalSection(); - ~CCriticalSection(); - void Enter(); - void Leave(); -private: - CRITICAL_SECTION cs; -}; - -#endif From d25a045798b01d0fba14b3964fb9eaf746577d68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Fri, 30 Apr 2004 20:49:39 +0000 Subject: [PATCH 0989/1463] Change bugcheck parameter to easily find out which SESSION5_INITIALIZATION_FAILED bugcheck occurred svn path=/trunk/; revision=9254 --- reactos/ntoskrnl/ke/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/ke/main.c b/reactos/ntoskrnl/ke/main.c index 51c978d92cc..3c4028fcd88 100644 --- a/reactos/ntoskrnl/ke/main.c +++ b/reactos/ntoskrnl/ke/main.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: main.c,v 1.185 2004/03/15 21:10:34 hbirr Exp $ +/* $Id: main.c,v 1.186 2004/04/30 20:49:39 gvg Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/main.c @@ -787,7 +787,7 @@ ExpInitializeExecutive(VOID) &Timeout); if (Status != STATUS_TIMEOUT) { - KEBUGCHECKEX(SESSION5_INITIALIZATION_FAILED, Status, 0, 0, 0); + KEBUGCHECKEX(SESSION5_INITIALIZATION_FAILED, Status, 1, 0, 0); } } From c2d319d2d23544fcc7a7218ed42b056648667b43 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Fri, 30 Apr 2004 22:18:00 +0000 Subject: [PATCH 0990/1463] use SendInput() to send mouse input data svn path=/trunk/; revision=9255 --- reactos/subsys/win32k/eng/mouse.c | 403 ++++++--------------- reactos/subsys/win32k/include/mouse.h | 15 +- reactos/subsys/win32k/ntuser/input.c | 223 +++++++++++- reactos/subsys/win32k/ntuser/misc.c | 21 +- reactos/subsys/win32k/objects/cursoricon.c | 29 +- 5 files changed, 369 insertions(+), 322 deletions(-) diff --git a/reactos/subsys/win32k/eng/mouse.c b/reactos/subsys/win32k/eng/mouse.c index 171100f5f53..c7618f18f7e 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.66 2004/04/16 18:53:53 weiden Exp $ +/* $Id: mouse.c,v 1.67 2004/04/30 22:17:59 weiden Exp $ * * PROJECT: ReactOS kernel * PURPOSE: Mouse @@ -45,45 +45,65 @@ #include "include/eng.h" #include "include/tags.h" #include +#include #define NDEBUG #include -#define GETSYSCURSOR(x) ((x) - OCR_NORMAL) - /* FUNCTIONS *****************************************************************/ BOOL FASTCALL IntIsPrimarySurface(PSURFGDI SurfGDI); - -BOOL FASTCALL -IntCheckClipCursor(LONG *x, LONG *y, PSYSTEM_CURSORINFO CurInfo) +VOID FASTCALL +EnableMouse(HDC hDisplayDC) { - if(CurInfo->CursorClipInfo.IsClipped) + PDC dc; + SURFOBJ *SurfObj; + PSURFGDI SurfGDI; + + if( hDisplayDC && InputWindowStation) { - if(*x > CurInfo->CursorClipInfo.Right) - *x = CurInfo->CursorClipInfo.Right; - if(*x < CurInfo->CursorClipInfo.Left) - *x = CurInfo->CursorClipInfo.Left; - if(*y > CurInfo->CursorClipInfo.Bottom) - *y = CurInfo->CursorClipInfo.Bottom; - if(*y < CurInfo->CursorClipInfo.Top) - *y = CurInfo->CursorClipInfo.Top; - return TRUE; + if(!IntGetWindowStationObject(InputWindowStation)) + { + InputWindowStation->SystemCursor.Enabled = FALSE; + return; + } + + dc = DC_LockDc(hDisplayDC); + SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface); + SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) dc->Surface); + DC_UnlockDc( hDisplayDC ); + + IntSetCursor(InputWindowStation, NULL, TRUE); + + InputWindowStation->SystemCursor.Enabled = (SPS_ACCEPT_EXCLUDE == SurfGDI->PointerStatus || + SPS_ACCEPT_NOEXCLUDE == SurfGDI->PointerStatus); + + /* 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); + #if 0 + ExAcquireFastMutex(&CurInfo->CursorMutex); + MouseMoveCursor(SurfObj->sizlBitmap.cx / 2, SurfObj->sizlBitmap.cy / 2); + ExReleaseFastMutex(&CurInfo->CursorMutex); + #endif + + ObDereferenceObject(InputWindowStation); + } + else + { + if(IntGetWindowStationObject(InputWindowStation)) + { + IntSetCursor(InputWindowStation, NULL, TRUE); + InputWindowStation->SystemCursor.Enabled = FALSE; + InputWindowStation->SystemCursor.CursorClipInfo.IsClipped = FALSE; + ObDereferenceObject(InputWindowStation); + return; + } } - return TRUE; } -BOOL FASTCALL -IntSwapMouseButton(PWINSTATION_OBJECT WinStaObject, BOOL Swap) -{ - BOOL res = WinStaObject->SystemCursor.SwapButtons; - WinStaObject->SystemCursor.SwapButtons = Swap; - return res; -} - -INT STDCALL +INT FASTCALL MouseSafetyOnDrawStart(SURFOBJ *SurfObj, PSURFGDI SurfGDI, LONG HazardX1, LONG HazardY1, LONG HazardX2, LONG HazardY2) /* @@ -166,7 +186,7 @@ MouseSafetyOnDrawStart(SURFOBJ *SurfObj, PSURFGDI SurfGDI, LONG HazardX1, return(TRUE); } -STATIC VOID FASTCALL +VOID FASTCALL SetPointerRect(PSYSTEM_CURSORINFO CurInfo, PRECTL PointerRect) { CurInfo->PointerRectLeft = PointerRect->left; @@ -237,306 +257,101 @@ MouseSafetyOnDrawEnd(SURFOBJ *SurfObj, SURFGDI *SurfGDI) return(TRUE); } -BOOL FASTCALL -MouseMoveCursor(LONG X, LONG Y) -{ - HDC hDC; - PDC dc; - BOOL res = FALSE; - SURFOBJ *SurfObj; - PSURFGDI SurfGDI; - PSYSTEM_CURSORINFO CurInfo; - MSG Msg; - LARGE_INTEGER LargeTickCount; - ULONG TickCount; - RECTL PointerRect; - - if(!InputWindowStation) - return FALSE; - - if(IntGetWindowStationObject(InputWindowStation)) - { - CurInfo = &InputWindowStation->SystemCursor; - if(!CurInfo->Enabled) - { - ObDereferenceObject(InputWindowStation); - return FALSE; - } - hDC = IntGetScreenDC(); - if(!hDC) - { - ObDereferenceObject(InputWindowStation); - return FALSE; - } - dc = DC_LockDc(hDC); - SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface); - SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) dc->Surface); - DC_UnlockDc( hDC ); - IntCheckClipCursor(&X, &Y, CurInfo); - if((X != CurInfo->x) || (Y != CurInfo->y)) - { - /* move cursor */ - CurInfo->x = X; - CurInfo->y = Y; - if(CurInfo->Enabled) - { - ExAcquireFastMutex(&CurInfo->CursorMutex); - IntLockGDIDriver(SurfGDI); - if (SurfGDI->MovePointer != NULL) - SurfGDI->MovePointer(SurfObj, CurInfo->x, CurInfo->y, &PointerRect); - IntUnLockGDIDriver(SurfGDI); - SetPointerRect(CurInfo, &PointerRect); - ExReleaseFastMutex(&CurInfo->CursorMutex); - } - /* send MOUSEMOVE message */ - KeQueryTickCount(&LargeTickCount); - TickCount = LargeTickCount.u.LowPart; - Msg.wParam = CurInfo->ButtonsDown; - Msg.lParam = MAKELPARAM(X, Y); - Msg.message = WM_MOUSEMOVE; - Msg.time = TickCount; - Msg.pt.x = X; - Msg.pt.y = Y; - MsqInsertSystemMessage(&Msg); - res = TRUE; - } - - ObDereferenceObject(InputWindowStation); - return res; - } - else - return FALSE; -} +#define ClearMouseInput(mi) \ + mi.dx = 0; \ + mi.dy = 0; \ + mi.mouseData = 0; \ + mi.dwFlags = 0; + +#define SendMouseEvent(mi) \ + if(mi.dx != 0 || mi.dy != 0) \ + mi.dwFlags |= MOUSEEVENTF_MOVE; \ + if(mi.dwFlags) \ + IntMouseInput(&mi); \ + ClearMouseInput(mi); VOID /* STDCALL */ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount) -/* - * FUNCTION: Call by the mouse driver when input events occur. - */ { + PMOUSE_INPUT_DATA mid; + MOUSEINPUT mi; ULONG i; - PSYSTEM_CURSORINFO CurInfo; - BOOL MouseEnabled = FALSE; - BOOL Moved = FALSE; - LONG mouse_ox, mouse_oy; - LONG mouse_cx = 0, mouse_cy = 0; - LONG dScroll = 0; - HDC hDC; - PDC dc; - SURFOBJ *SurfObj; - PSURFGDI SurfGDI; - MSG Msg; - RECTL PointerRect; - hDC = IntGetScreenDC(); - - if(!hDC || !InputWindowStation) - return; - - if(IntGetWindowStationObject(InputWindowStation)) + ClearMouseInput(mi); + mi.time = 0; + mi.dwExtraInfo = 0; + for(i = 0; i < InputCount; i++) { - CurInfo = &InputWindowStation->SystemCursor; - MouseEnabled = CurInfo->Enabled; - if(!MouseEnabled) + mid = (Data + i); + mi.dx += mid->LastX; + mi.dy += mid->LastY; + + if(mid->ButtonFlags) { - ObDereferenceObject(InputWindowStation); - return; - } - mouse_ox = CurInfo->x; - mouse_oy = CurInfo->y; - } - else - return; - - dc = DC_LockDc(hDC); - SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface); - SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) dc->Surface); - DC_UnlockDc( hDC ); - - /* Compile the total mouse movement change and dispatch button events. */ - for (i = 0; i < InputCount; i++) - { - mouse_cx += Data[i].LastX; - mouse_cy += Data[i].LastY; - - CurInfo->x += Data[i].LastX; - CurInfo->y += Data[i].LastY; - - CurInfo->x = max(CurInfo->x, 0); - CurInfo->y = max(CurInfo->y, 0); - CurInfo->x = min(CurInfo->x, SurfObj->sizlBitmap.cx - 1); - CurInfo->y = min(CurInfo->y, SurfObj->sizlBitmap.cy - 1); - - IntCheckClipCursor(&CurInfo->x, &CurInfo->y, CurInfo); - - Msg.wParam = CurInfo->ButtonsDown; - Msg.lParam = MAKELPARAM(CurInfo->x, CurInfo->y); - Msg.message = WM_MOUSEMOVE; - Msg.pt.x = CurInfo->x; - Msg.pt.y = CurInfo->y; - - if (Data[i].ButtonFlags != 0) - { - if ((Data[i].ButtonFlags & MOUSE_LEFT_BUTTON_DOWN) > 0) + if(mid->ButtonFlags & MOUSE_LEFT_BUTTON_DOWN) { - CurInfo->ButtonsDown |= (CurInfo->SwapButtons ? MK_RBUTTON : MK_LBUTTON); - Msg.message = (CurInfo->SwapButtons ? WM_RBUTTONDOWN : WM_LBUTTONDOWN); + mi.dwFlags |= MOUSEEVENTF_LEFTDOWN; + SendMouseEvent(mi); } - if ((Data[i].ButtonFlags & MOUSE_MIDDLE_BUTTON_DOWN) > 0) + if(mid->ButtonFlags & MOUSE_LEFT_BUTTON_UP) { - CurInfo->ButtonsDown |= MK_MBUTTON; - Msg.message = WM_MBUTTONDOWN; + mi.dwFlags |= MOUSEEVENTF_LEFTUP; + SendMouseEvent(mi); } - if ((Data[i].ButtonFlags & MOUSE_RIGHT_BUTTON_DOWN) > 0) + if(mid->ButtonFlags & MOUSE_MIDDLE_BUTTON_DOWN) { - CurInfo->ButtonsDown |= (CurInfo->SwapButtons ? MK_LBUTTON : MK_RBUTTON); - Msg.message = (CurInfo->SwapButtons ? WM_LBUTTONDOWN : WM_RBUTTONDOWN); + mi.dwFlags |= MOUSEEVENTF_MIDDLEDOWN; + SendMouseEvent(mi); } - - if ((Data[i].ButtonFlags & MOUSE_BUTTON_4_DOWN) > 0) + if(mid->ButtonFlags & MOUSE_MIDDLE_BUTTON_UP) { - CurInfo->ButtonsDown |= MK_XBUTTON1; - Msg.message = WM_XBUTTONDOWN; + mi.dwFlags |= MOUSEEVENTF_MIDDLEUP; + SendMouseEvent(mi); } - if ((Data[i].ButtonFlags & MOUSE_BUTTON_5_DOWN) > 0) + if(mid->ButtonFlags & MOUSE_RIGHT_BUTTON_DOWN) { - CurInfo->ButtonsDown |= MK_XBUTTON2; - Msg.message = WM_XBUTTONDOWN; + mi.dwFlags |= MOUSEEVENTF_RIGHTDOWN; + SendMouseEvent(mi); } - - if ((Data[i].ButtonFlags & MOUSE_LEFT_BUTTON_UP) > 0) + if(mid->ButtonFlags & MOUSE_RIGHT_BUTTON_UP) { - CurInfo->ButtonsDown &= (CurInfo->SwapButtons ? ~MK_RBUTTON : ~MK_LBUTTON); - Msg.message = (CurInfo->SwapButtons ? WM_RBUTTONUP : WM_LBUTTONUP); + mi.dwFlags |= MOUSEEVENTF_RIGHTUP; + SendMouseEvent(mi); } - if ((Data[i].ButtonFlags & MOUSE_MIDDLE_BUTTON_UP) > 0) + if(mid->ButtonFlags & MOUSE_BUTTON_4_DOWN) { - CurInfo->ButtonsDown &= ~MK_MBUTTON; - Msg.message = WM_MBUTTONUP; + mi.mouseData |= XBUTTON1; + mi.dwFlags |= MOUSEEVENTF_XDOWN; + SendMouseEvent(mi); } - if ((Data[i].ButtonFlags & MOUSE_RIGHT_BUTTON_UP) > 0) + if(mid->ButtonFlags & MOUSE_BUTTON_4_UP) { - CurInfo->ButtonsDown &= (CurInfo->SwapButtons ? ~MK_LBUTTON : ~MK_RBUTTON); - Msg.message = (CurInfo->SwapButtons ? WM_LBUTTONUP : WM_RBUTTONUP); + mi.mouseData |= XBUTTON1; + mi.dwFlags |= MOUSEEVENTF_XUP; + SendMouseEvent(mi); } - if ((Data[i].ButtonFlags & MOUSE_BUTTON_4_UP) > 0) + if(mid->ButtonFlags & MOUSE_BUTTON_5_DOWN) { - CurInfo->ButtonsDown &= ~MK_XBUTTON1; - Msg.message = WM_XBUTTONUP; + mi.mouseData |= XBUTTON2; + mi.dwFlags |= MOUSEEVENTF_XDOWN; + SendMouseEvent(mi); } - if ((Data[i].ButtonFlags & MOUSE_BUTTON_5_UP) > 0) + if(mid->ButtonFlags & MOUSE_BUTTON_5_UP) { - CurInfo->ButtonsDown &= ~MK_XBUTTON2; - Msg.message = WM_XBUTTONUP; + mi.mouseData |= XBUTTON2; + mi.dwFlags |= MOUSEEVENTF_XUP; + SendMouseEvent(mi); } - if ((Data[i].ButtonFlags & MOUSE_WHEEL) > 0) + if(mid->ButtonFlags & MOUSE_WHEEL) { - dScroll += (LONG)Data[i].ButtonData; + mi.mouseData = mid->ButtonData; + mi.dwFlags |= MOUSEEVENTF_WHEEL; + SendMouseEvent(mi); } - - if (Data[i].ButtonFlags != MOUSE_WHEEL) - { - Moved = (0 != mouse_cx) || (0 != mouse_cy); - if(Moved && MouseEnabled) - { - if (!CurInfo->SafetySwitch && 0 == CurInfo->SafetyRemoveCount && - ((mouse_ox != CurInfo->x) || (mouse_oy != CurInfo->y))) - { - ExAcquireFastMutex(&CurInfo->CursorMutex); - IntLockGDIDriver(SurfGDI); - SurfGDI->MovePointer(SurfObj, CurInfo->x, CurInfo->y, &PointerRect); - IntUnLockGDIDriver(SurfGDI); - SetPointerRect(CurInfo, &PointerRect); - ExReleaseFastMutex(&CurInfo->CursorMutex); - mouse_cx = 0; - mouse_cy = 0; - } - } - - Msg.wParam = CurInfo->ButtonsDown; - MsqInsertSystemMessage(&Msg); - } - } - } - - /* If the mouse moved then move the pointer. */ - if ((mouse_cx != 0 || mouse_cy != 0) && MouseEnabled) - { - Msg.wParam = CurInfo->ButtonsDown; - Msg.message = WM_MOUSEMOVE; - Msg.pt.x = CurInfo->x; - Msg.pt.y = CurInfo->y; - Msg.lParam = MAKELPARAM(CurInfo->x, CurInfo->y); - MsqInsertSystemMessage(&Msg); - - if (!CurInfo->SafetySwitch && 0 == CurInfo->SafetyRemoveCount && - ((mouse_ox != CurInfo->x) || (mouse_oy != CurInfo->y))) - { - ExAcquireFastMutex(&CurInfo->CursorMutex); - IntLockGDIDriver(SurfGDI); - SurfGDI->MovePointer(SurfObj, CurInfo->x, CurInfo->y, &PointerRect); - IntUnLockGDIDriver(SurfGDI); - SetPointerRect(CurInfo, &PointerRect); - ExReleaseFastMutex(&CurInfo->CursorMutex); } } - /* send WM_MOUSEWHEEL message */ - if(dScroll && MouseEnabled) - { - Msg.message = WM_MOUSEWHEEL; - Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, dScroll); - Msg.lParam = MAKELPARAM(CurInfo->x, CurInfo->y); - Msg.pt.x = CurInfo->x; - Msg.pt.y = CurInfo->y; - MsqInsertSystemMessage(&Msg); - } - - ObDereferenceObject(InputWindowStation); -} - -VOID FASTCALL -EnableMouse(HDC hDisplayDC) -{ - PDC dc; - SURFOBJ *SurfObj; - PSURFGDI SurfGDI; - - if( hDisplayDC && InputWindowStation) - { - if(!IntGetWindowStationObject(InputWindowStation)) - { - InputWindowStation->SystemCursor.Enabled = FALSE; - return; - } - - dc = DC_LockDc(hDisplayDC); - SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface); - SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) dc->Surface); - DC_UnlockDc( hDisplayDC ); - - IntSetCursor(InputWindowStation, NULL, TRUE); - - InputWindowStation->SystemCursor.Enabled = (SPS_ACCEPT_EXCLUDE == SurfGDI->PointerStatus || - SPS_ACCEPT_NOEXCLUDE == SurfGDI->PointerStatus); - - /* 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); - MouseMoveCursor(SurfObj->sizlBitmap.cx / 2, SurfObj->sizlBitmap.cy / 2); - - ObDereferenceObject(InputWindowStation); - } - else - { - if(IntGetWindowStationObject(InputWindowStation)) - { - IntSetCursor(InputWindowStation, NULL, TRUE); - InputWindowStation->SystemCursor.Enabled = FALSE; - InputWindowStation->SystemCursor.CursorClipInfo.IsClipped = FALSE; - ObDereferenceObject(InputWindowStation); - return; - } - } + SendMouseEvent(mi); } /* SOFTWARE MOUSE POINTER IMPLEMENTATION **************************************/ diff --git a/reactos/subsys/win32k/include/mouse.h b/reactos/subsys/win32k/include/mouse.h index 30ce73fcb82..cd8de7d3ed8 100644 --- a/reactos/subsys/win32k/include/mouse.h +++ b/reactos/subsys/win32k/include/mouse.h @@ -7,11 +7,24 @@ BOOL FASTCALL IntCheckClipCursor(LONG *x, LONG *y, PSYSTEM_CURSORINFO CurInfo); BOOL FASTCALL IntSwapMouseButton(PWINSTATION_OBJECT WinStaObject, BOOL Swap); -INT STDCALL MouseSafetyOnDrawStart(SURFOBJ *SurfObj, SURFGDI *SurfGDI, LONG HazardX1, LONG HazardY1, LONG HazardX2, LONG HazardY2); +INT FASTCALL MouseSafetyOnDrawStart(SURFOBJ *SurfObj, SURFGDI *SurfGDI, LONG HazardX1, LONG HazardY1, LONG HazardX2, LONG HazardY2); INT FASTCALL MouseSafetyOnDrawEnd(SURFOBJ *SurfObj, SURFGDI *SurfGDI); BOOL FASTCALL MouseMoveCursor(LONG X, LONG Y); VOID FASTCALL EnableMouse(HDC hDisplayDC); VOID MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount); +VOID FASTCALL SetPointerRect(PSYSTEM_CURSORINFO CurInfo, PRECTL PointerRect); +#ifndef XBUTTON1 +#define XBUTTON1 (0x01) +#endif +#ifndef XBUTTON2 +#define XBUTTON2 (0x02) +#endif +#ifndef MOUSEEVENTF_XDOWN +#define MOUSEEVENTF_XDOWN (0x80) +#endif +#ifndef MOUSEEVENTF_XUP +#define MOUSEEVENTF_XUP (0x100) +#endif #endif /* _WIN32K_MOUSE_H */ diff --git a/reactos/subsys/win32k/ntuser/input.c b/reactos/subsys/win32k/ntuser/input.c index bbf71703487..17c985ac352 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.29 2004/04/29 20:41:03 weiden Exp $ +/* $Id: input.c,v 1.30 2004/04/30 22:18:00 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -41,6 +41,7 @@ #include #include #include +#include #include #define NDEBUG @@ -522,10 +523,228 @@ NtUserBlockInput( return IntBlockInput(PsGetWin32Thread(), BlockIt); } +BOOL FASTCALL +IntSwapMouseButton(PWINSTATION_OBJECT WinStaObject, BOOL Swap) +{ + BOOL res = WinStaObject->SystemCursor.SwapButtons; + WinStaObject->SystemCursor.SwapButtons = Swap; + return res; +} + BOOL FASTCALL IntMouseInput(MOUSEINPUT *mi) { - return FALSE; + const UINT SwapBtnMsg[2][2] = {{WM_LBUTTONDOWN, WM_RBUTTONDOWN}, + {WM_LBUTTONUP, WM_RBUTTONUP}}; + const WPARAM SwapBtn[2] = {MK_LBUTTON, MK_RBUTTON}; + POINT MousePos; + PSYSTEM_CURSORINFO CurInfo; + PWINSTATION_OBJECT WinSta; + BOOL DoMove, SwapButtons; + MSG Msg; + SURFOBJ *SurfObj; + PSURFGDI SurfGDI; + PDC dc; + RECTL PointerRect; + +#if 1 + HDC hDC; + + /* FIXME - get the screen dc from the window station or desktop */ + if(!(hDC = IntGetScreenDC())) + { + return FALSE; + } +#endif + + ASSERT(mi); +#if 0 + WinSta = PsGetWin32Process()->WindowStation; +#else + /* FIXME - ugly hack but as long as we're using this dumb callback from the + mouse class driver, we can't access the window station from the calling + process */ + WinSta = InputWindowStation; +#endif + ASSERT(WinSta); + + CurInfo = &WinSta->SystemCursor; + + 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; + KeQueryTickCount(&LargeTickCount); + mi->time = LargeTickCount.u.LowPart; + } + + SwapButtons = WinSta->SystemCursor.SwapButtons; + DoMove = FALSE; + ExAcquireFastMutex(&CurInfo->CursorMutex); + MousePos.x = CurInfo->x; + MousePos.y = CurInfo->y; + if(mi->dwFlags & MOUSEEVENTF_MOVE) + { + if(mi->dwFlags & MOUSEEVENTF_ABSOLUTE) + { + MousePos.x = mi->dx; + MousePos.y = mi->dy; + } + else + { + MousePos.x += mi->dx; + MousePos.y += mi->dy; + } + + if(CurInfo->CursorClipInfo.IsClipped) + { + /* The mouse cursor needs to be clipped */ + + if(MousePos.x > CurInfo->CursorClipInfo.Right) + MousePos.x = CurInfo->CursorClipInfo.Right; + if(MousePos.x <= CurInfo->CursorClipInfo.Left) + MousePos.x = CurInfo->CursorClipInfo.Left; + if(MousePos.y > CurInfo->CursorClipInfo.Bottom) + MousePos.y = CurInfo->CursorClipInfo.Bottom; + if(MousePos.y <= CurInfo->CursorClipInfo.Top) + MousePos.y = CurInfo->CursorClipInfo.Top; + } + + 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((DoMove = (MousePos.x != CurInfo->x || MousePos.y != CurInfo->y))) + { + 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); + + /* + * Insert the messages into the system queue + */ + + Msg.wParam = CurInfo->ButtonsDown; + Msg.lParam = MAKELPARAM(MousePos.x, MousePos.y); + Msg.pt = MousePos; + if(DoMove) + { + Msg.message = WM_MOUSEMOVE; + MsqInsertSystemMessage(&Msg); + } + + Msg.message = 0; + if(mi->dwFlags & MOUSEEVENTF_LEFTDOWN) + { + Msg.message = SwapBtnMsg[0][SwapButtons]; + CurInfo->ButtonsDown |= SwapBtn[SwapButtons]; + MsqInsertSystemMessage(&Msg); + } + else if(mi->dwFlags & MOUSEEVENTF_LEFTUP) + { + Msg.message = SwapBtnMsg[1][SwapButtons]; + CurInfo->ButtonsDown &= ~SwapBtn[SwapButtons]; + MsqInsertSystemMessage(&Msg); + } + if(mi->dwFlags & MOUSEEVENTF_MIDDLEDOWN) + { + Msg.message = WM_MBUTTONDOWN; + CurInfo->ButtonsDown |= MK_MBUTTON; + MsqInsertSystemMessage(&Msg); + } + else if(mi->dwFlags & MOUSEEVENTF_MIDDLEUP) + { + Msg.message = WM_MBUTTONUP; + CurInfo->ButtonsDown &= ~MK_MBUTTON; + MsqInsertSystemMessage(&Msg); + } + if(mi->dwFlags & MOUSEEVENTF_RIGHTDOWN) + { + Msg.message = SwapBtnMsg[0][!SwapButtons]; + CurInfo->ButtonsDown |= SwapBtn[!SwapButtons]; + MsqInsertSystemMessage(&Msg); + } + else if(mi->dwFlags & MOUSEEVENTF_RIGHTUP) + { + Msg.message = SwapBtnMsg[1][!SwapButtons]; + CurInfo->ButtonsDown &= ~SwapBtn[!SwapButtons]; + MsqInsertSystemMessage(&Msg); + } + + if((mi->dwFlags & (MOUSEEVENTF_XDOWN | MOUSEEVENTF_XUP)) && + (mi->dwFlags & MOUSEEVENTF_WHEEL)) + { + /* fail because both types of events use the mouseData field */ + return FALSE; + } + + if(mi->dwFlags & MOUSEEVENTF_XDOWN) + { + Msg.message = WM_XBUTTONDOWN; + if(mi->mouseData & XBUTTON1) + { + Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON1); + CurInfo->ButtonsDown |= XBUTTON1; + MsqInsertSystemMessage(&Msg); + } + if(mi->mouseData & XBUTTON2) + { + Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON2); + CurInfo->ButtonsDown |= XBUTTON2; + MsqInsertSystemMessage(&Msg); + } + } + else if(mi->dwFlags & MOUSEEVENTF_XUP) + { + Msg.message = WM_XBUTTONUP; + if(mi->mouseData & XBUTTON1) + { + Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON1); + CurInfo->ButtonsDown &= ~XBUTTON1; + MsqInsertSystemMessage(&Msg); + } + if(mi->mouseData & XBUTTON2) + { + Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON2); + CurInfo->ButtonsDown &= ~XBUTTON2; + MsqInsertSystemMessage(&Msg); + } + } + if(mi->dwFlags & MOUSEEVENTF_WHEEL) + { + Msg.message = WM_MOUSEWHEEL; + Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, mi->mouseData); + MsqInsertSystemMessage(&Msg); + } + + return TRUE; } BOOL FASTCALL diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index c13af9e9110..100b6138f43 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.63 2004/04/25 20:05:30 weiden Exp $ +/* $Id: misc.c,v 1.64 2004/04/30 22:18:00 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -204,7 +205,6 @@ NtUserCallTwoParam( { NTSTATUS Status; PWINDOW_OBJECT WindowObject; - PSYSTEM_CURSORINFO CurInfo; PWINSTATION_OBJECT WinStaObject; POINT Pos; @@ -329,6 +329,7 @@ NtUserCallTwoParam( if(Param2) { /* set cursor position */ + MOUSEINPUT mi; Status = MmCopyFromCaller(&Pos, (PPOINT)Param1, sizeof(POINT)); if(!NT_SUCCESS(Status)) @@ -338,15 +339,13 @@ NtUserCallTwoParam( return FALSE; } - CurInfo = &WinStaObject->SystemCursor; - /* FIXME - check if process has WINSTA_WRITEATTRIBUTES */ - - //CheckClipCursor(&Pos->x, &Pos->y, CurInfo); - if((Pos.x != CurInfo->x) || (Pos.y != CurInfo->y)) - { - MouseMoveCursor(Pos.x, Pos.y); - } - + mi.dx = Pos.x; + mi.dy = Pos.y; + mi.mouseData = 0; + mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE; + mi.time = 0; + mi.dwExtraInfo = 0; + IntMouseInput(&mi); } else { diff --git a/reactos/subsys/win32k/objects/cursoricon.c b/reactos/subsys/win32k/objects/cursoricon.c index 7fbbd187df6..9893b52ac26 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.53 2004/04/09 20:03:20 navaraf Exp $ */ +/* $Id: cursoricon.c,v 1.54 2004/04/30 22:18:00 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -81,15 +82,6 @@ IntCopyBitmap(HBITMAP bmp) return ret; } -STATIC VOID FASTCALL -SetPointerRect(PSYSTEM_CURSORINFO CurInfo, PRECTL PointerRect) -{ - CurInfo->PointerRectLeft = PointerRect->left; - CurInfo->PointerRectRight = PointerRect->right; - CurInfo->PointerRectTop = PointerRect->top; - CurInfo->PointerRectBottom = PointerRect->bottom; -} - #define COLORCURSORS_ALLOWED FALSE HCURSOR FASTCALL IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, @@ -740,6 +732,8 @@ NtUserClipCursor( if((Rect.right > Rect.left) && (Rect.bottom > Rect.top) && DesktopWindow) { + MOUSEINPUT mi; + CurInfo->CursorClipInfo.IsClipped = TRUE; CurInfo->CursorClipInfo.Left = max(Rect.left, DesktopWindow->WindowRect.left); CurInfo->CursorClipInfo.Top = max(Rect.top, DesktopWindow->WindowRect.top); @@ -747,11 +741,18 @@ NtUserClipCursor( CurInfo->CursorClipInfo.Bottom = min(Rect.bottom - 1, DesktopWindow->WindowRect.bottom - 1); IntReleaseWindowObject(DesktopWindow); - MouseMoveCursor(CurInfo->x, CurInfo->y); - } - else - WinStaObject->SystemCursor.CursorClipInfo.IsClipped = FALSE; + mi.dx = CurInfo->x; + mi.dy = CurInfo->y; + mi.mouseData = 0; + mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE; + mi.time = 0; + mi.dwExtraInfo = 0; + IntMouseInput(&mi); + return TRUE; + } + + WinStaObject->SystemCursor.CursorClipInfo.IsClipped = FALSE; ObDereferenceObject(WinStaObject); return TRUE; From 8b99b4b1c02f717a02077253b1b5b3b63d31733e Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 30 Apr 2004 23:42:20 +0000 Subject: [PATCH 0991/1463] - Avoid potencial access violation. Might fix bug #297. svn path=/trunk/; revision=9256 --- reactos/subsys/win32k/dib/dib8bpp.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib8bpp.c b/reactos/subsys/win32k/dib/dib8bpp.c index a813c04f5aa..c83aff8701b 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.23 2004/04/25 11:34:12 weiden Exp $ */ +/* $Id: dib8bpp.c,v 1.24 2004/04/30 23:42:20 navaraf Exp $ */ #undef WIN32_LEAN_AND_MEAN #include #include @@ -368,9 +368,10 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (i < DestRect->right) { - Dest = *DestBits; for (; i < DestRect->right; i++) { + Dest = DIB_8BPP_GetPixel(DestSurf, i, j); + if (UsesSource) { Source = DIB_GetSource(SourceSurf, SourceGDI, sx + (i - DestRect->left), sy, ColorTranslation); @@ -382,7 +383,6 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } DIB_8BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xFFFF); - Dest >>= 8; } } From 5b7d8220d3f17d876059d419611777cb9a59ea54 Mon Sep 17 00:00:00 2001 From: Mike Nordell Date: Sat, 1 May 2004 00:25:41 +0000 Subject: [PATCH 0992/1463] Make MmQuerySectionView tell how many bytes it actually did set. Fixes VirtualQuery. svn path=/trunk/; revision=9257 --- reactos/ntoskrnl/mm/section.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/section.c b/reactos/ntoskrnl/mm/section.c index 6b8432f917b..070147e811c 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.147 2004/04/10 22:35:26 gdalsnes Exp $ +/* $Id: section.c,v 1.148 2004/05/01 00:25:41 tamlin Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/section.c @@ -2041,6 +2041,7 @@ MmQuerySectionView(PMEMORY_AREA MemoryArea, Info->Type = MEM_MAPPED; } + *ResultLength = sizeof(MEMORY_BASIC_INFORMATION); return(STATUS_SUCCESS); } From 1eeed5accdaad92a38399ea4d092f0c2e7bd8372 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sat, 1 May 2004 00:51:51 +0000 Subject: [PATCH 0993/1463] - Add ASSERT for a palette size. svn path=/trunk/; revision=9258 --- reactos/subsys/win32k/objects/color.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/objects/color.c b/reactos/subsys/win32k/objects/color.c index 3011243c395..00104c76b0d 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.37 2004/04/28 18:38:07 navaraf Exp $ */ +/* $Id: color.c,v 1.38 2004/05/01 00:51:51 navaraf Exp $ */ // FIXME: Use PXLATEOBJ logicalToSystem instead of int *mapping @@ -341,6 +341,7 @@ UINT STDCALL NtGdiRealizePalette(HDC hDC) if(SurfGDI->SetPalette) { IntLockGDIDriver(SurfGDI); + ASSERT(sysGDI->NumColors <= 256); success = SurfGDI->SetPalette(dc->PDev, sysPtr, 0, 0, sysGDI->NumColors); IntUnLockGDIDriver(SurfGDI); } From b88aed24cba4fbccd0d9e5c2a8dd548163401127 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 1 May 2004 08:47:14 +0000 Subject: [PATCH 0994/1463] fix mouse clipping svn path=/trunk/; revision=9259 --- reactos/subsys/win32k/ntuser/input.c | 30 ++++++++++++++-------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/input.c b/reactos/subsys/win32k/ntuser/input.c index 17c985ac352..439bc215b23 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.30 2004/04/30 22:18:00 weiden Exp $ +/* $Id: input.c,v 1.31 2004/05/01 08:47:14 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -602,20 +602,6 @@ IntMouseInput(MOUSEINPUT *mi) MousePos.y += mi->dy; } - if(CurInfo->CursorClipInfo.IsClipped) - { - /* The mouse cursor needs to be clipped */ - - if(MousePos.x > CurInfo->CursorClipInfo.Right) - MousePos.x = CurInfo->CursorClipInfo.Right; - if(MousePos.x <= CurInfo->CursorClipInfo.Left) - MousePos.x = CurInfo->CursorClipInfo.Left; - if(MousePos.y > CurInfo->CursorClipInfo.Bottom) - MousePos.y = CurInfo->CursorClipInfo.Bottom; - if(MousePos.y <= CurInfo->CursorClipInfo.Top) - MousePos.y = CurInfo->CursorClipInfo.Top; - } - if(MousePos.x < 0) MousePos.x = 0; if(MousePos.y < 0) @@ -625,6 +611,20 @@ IntMouseInput(MOUSEINPUT *mi) if(MousePos.y >= SurfObj->sizlBitmap.cy) MousePos.y = SurfObj->sizlBitmap.cy - 1; + if(CurInfo->CursorClipInfo.IsClipped) + { + /* The mouse cursor needs to be clipped */ + + if(MousePos.x >= (LONG)CurInfo->CursorClipInfo.Right) + MousePos.x = (LONG)CurInfo->CursorClipInfo.Right; + if(MousePos.x < (LONG)CurInfo->CursorClipInfo.Left) + MousePos.x = (LONG)CurInfo->CursorClipInfo.Left; + if(MousePos.y >= (LONG)CurInfo->CursorClipInfo.Bottom) + MousePos.y = (LONG)CurInfo->CursorClipInfo.Bottom; + if(MousePos.y < (LONG)CurInfo->CursorClipInfo.Top) + MousePos.y = (LONG)CurInfo->CursorClipInfo.Top; + } + if((DoMove = (MousePos.x != CurInfo->x || MousePos.y != CurInfo->y))) { CurInfo->x = MousePos.x; From b4abd1fae03fc510beb619dc929ae7489d254bb0 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 1 May 2004 08:55:04 +0000 Subject: [PATCH 0995/1463] setup the cursor in the middle of the screen svn path=/trunk/; revision=9260 --- reactos/subsys/win32k/eng/mouse.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/reactos/subsys/win32k/eng/mouse.c b/reactos/subsys/win32k/eng/mouse.c index c7618f18f7e..ed9b2a23e84 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.67 2004/04/30 22:17:59 weiden Exp $ +/* $Id: mouse.c,v 1.68 2004/05/01 08:55:04 weiden Exp $ * * PROJECT: ReactOS kernel * PURPOSE: Mouse @@ -75,19 +75,17 @@ EnableMouse(HDC hDisplayDC) SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) dc->Surface); DC_UnlockDc( hDisplayDC ); + /* 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(&InputWindowStation->SystemCursor.CursorMutex); + InputWindowStation->SystemCursor.x = SurfObj->sizlBitmap.cx / 2; + InputWindowStation->SystemCursor.y = SurfObj->sizlBitmap.cy / 2; + ExReleaseFastMutex(&InputWindowStation->SystemCursor.CursorMutex); IntSetCursor(InputWindowStation, NULL, TRUE); InputWindowStation->SystemCursor.Enabled = (SPS_ACCEPT_EXCLUDE == SurfGDI->PointerStatus || SPS_ACCEPT_NOEXCLUDE == SurfGDI->PointerStatus); - /* 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); - #if 0 - ExAcquireFastMutex(&CurInfo->CursorMutex); - MouseMoveCursor(SurfObj->sizlBitmap.cx / 2, SurfObj->sizlBitmap.cy / 2); - ExReleaseFastMutex(&CurInfo->CursorMutex); - #endif - ObDereferenceObject(InputWindowStation); } else From d490382a4f516b3506867cc2d934e612022a701e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sat, 1 May 2004 09:04:37 +0000 Subject: [PATCH 0996/1463] Use only LSBit for 1bpp putpixel svn path=/trunk/; revision=9261 --- reactos/subsys/win32k/dib/dib1bpp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib1bpp.c b/reactos/subsys/win32k/dib/dib1bpp.c index 8f8b5fbf817..6aab975bccb 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.25 2004/04/25 11:34:12 weiden Exp $ */ +/* $Id: dib1bpp.c,v 1.26 2004/05/01 09:04:37 gvg Exp $ */ #undef WIN32_LEAN_AND_MEAN #include @@ -35,7 +35,7 @@ DIB_1BPP_PutPixel(SURFOBJ *SurfObj, LONG x, LONG y, ULONG c) { PBYTE addr = SurfObj->pvScan0 + y * SurfObj->lDelta + (x >> 3); - if ( !c ) + if (0 == (c & 0x01)) *addr &= ~MASK1BPP(x); else *addr |= MASK1BPP(x); From 9900ed382e69d9abf520112fdba316395a00e393 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 1 May 2004 09:31:59 +0000 Subject: [PATCH 0997/1463] changed SetCursorPos() to use SendInput() svn path=/trunk/; revision=9262 --- reactos/include/win32k/ntuser.h | 2 +- reactos/lib/user32/include/user32.h | 9 +-- reactos/lib/user32/windows/cursor.c | 18 ++++-- reactos/subsys/win32k/ntuser/misc.c | 86 +++++++++++------------------ 4 files changed, 48 insertions(+), 67 deletions(-) diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index ece27718a4c..3ab2b9086e9 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -177,6 +177,7 @@ NtUserCallNoParam( #define ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS 0x09 #define ONEPARAM_ROUTINE_GETWINDOWINSTANCE 0x10 #define ONEPARAM_ROUTINE_SETMESSAGEEXTRAINFO 0x0a +#define ONEPARAM_ROUTINE_GETCURSORPOSITION 0x0b DWORD STDCALL NtUserCallOneParam( @@ -203,7 +204,6 @@ NtUserCallOneParam( #define TWOPARAM_ROUTINE_SWITCHTOTHISWINDOW 0x56 #define TWOPARAM_ROUTINE_VALIDATERGN 0x57 #define TWOPARAM_ROUTINE_SETWNDCONTEXTHLPID 0x58 -#define TWOPARAM_ROUTINE_CURSORPOSITION 0x59 #define TWOPARAM_ROUTINE_SETCARETPOS 0x60 #define TWOPARAM_ROUTINE_GETWINDOWINFO 0x61 DWORD diff --git a/reactos/lib/user32/include/user32.h b/reactos/lib/user32/include/user32.h index fff142e46bd..25f0fa8fb6d 100644 --- a/reactos/lib/user32/include/user32.h +++ b/reactos/lib/user32/include/user32.h @@ -40,12 +40,6 @@ void DrawCaret(HWND hWnd, PTHRDCARETINFO CaretInfo); #define NtUserSetCaretPos(X, Y) \ (BOOL)NtUserCallTwoParam((DWORD)X, (DWORD)Y, TWOPARAM_ROUTINE_SETCARETPOS) -#define NtUserGetCursorPos(lpPoint) \ - (BOOL)NtUserCallTwoParam((DWORD)lpPoint, (DWORD)FALSE, TWOPARAM_ROUTINE_CURSORPOSITION) - -#define NtUserSetCursorPos(lpPoint) \ - (BOOL)NtUserCallTwoParam((DWORD)lpPoint, (DWORD)TRUE, TWOPARAM_ROUTINE_CURSORPOSITION) - #define NtUserSetGUIThreadHandle(field, hwnd) \ (BOOL)NtUserCallTwoParam((DWORD)field, (DWORD)hwnd, TWOPARAM_ROUTINE_SETGUITHRDHANDLE) @@ -88,6 +82,9 @@ void DrawCaret(HWND hWnd, PTHRDCARETINFO CaretInfo); #define NtUserGetWindowInstance(hwnd) \ (HINSTANCE)NtUserCallOneParam((DWORD)hwnd, ONEPARAM_ROUTINE_GETWINDOWINSTANCE) +#define NtUserGetCursorPos(lpPoint) \ + (BOOL)NtUserCallOneParam((DWORD)lpPoint, ONEPARAM_ROUTINE_GETCURSORPOSITION) + LONG WINAPI RegCloseKey(HKEY); LONG WINAPI RegOpenKeyExW(HKEY,LPCWSTR,DWORD,REGSAM,PHKEY); LONG WINAPI RegQueryValueExW(HKEY,LPCWSTR,LPDWORD,LPDWORD,LPBYTE,LPDWORD); diff --git a/reactos/lib/user32/windows/cursor.c b/reactos/lib/user32/windows/cursor.c index 128f9baa1b9..a2b840b8445 100644 --- a/reactos/lib/user32/windows/cursor.c +++ b/reactos/lib/user32/windows/cursor.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: cursor.c,v 1.20 2004/04/09 20:03:14 navaraf Exp $ +/* $Id: cursor.c,v 1.21 2004/05/01 09:31:59 weiden Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/cursor.c @@ -260,10 +260,18 @@ BOOL STDCALL SetCursorPos(int X, int Y) { - POINT pos; - pos.x = (LONG)X; - pos.y = (LONG)Y; - return NtUserSetCursorPos(&pos); + INPUT Input; + + Input.type = INPUT_MOUSE; + Input.mi.dx = (LONG)X; + Input.mi.dy = (LONG)Y; + Input.mi.mouseData = 0; + Input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE; + Input.mi.time = 0; + Input.mi.dwExtraInfo = 0; + + NtUserSendInput(1, &Input, sizeof(INPUT)); + return TRUE; } diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index 100b6138f43..1fe2e0f3230 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.64 2004/04/30 22:18:00 weiden Exp $ +/* $Id: misc.c,v 1.65 2004/05/01 09:31:59 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -185,6 +185,36 @@ NtUserCallOneParam( case ONEPARAM_ROUTINE_SETMESSAGEEXTRAINFO: return (DWORD)MsqSetMessageExtraInfo((LPARAM)Param); + + case ONEPARAM_ROUTINE_GETCURSORPOSITION: + { + POINT Pos; + + if(!Param) + return (DWORD)FALSE; + Status = IntValidateWindowStationHandle(PROCESS_WINDOW_STATION(), + KernelMode, + 0, + &WinStaObject); + if (!NT_SUCCESS(Status)) + return (DWORD)FALSE; + + /* FIXME - check if process has WINSTA_READATTRIBUTES */ + Pos.x = WinStaObject->SystemCursor.x; + Pos.y = WinStaObject->SystemCursor.y; + + Status = MmCopyToCaller((PPOINT)Param, &Pos, sizeof(POINT)); + if(!NT_SUCCESS(Status)) + { + ObDereferenceObject(WinStaObject); + SetLastNtError(Status); + return FALSE; + } + + ObDereferenceObject(WinStaObject); + + return (DWORD)TRUE; + } } DPRINT1("Calling invalid routine number 0x%x in NtUserCallOneParam()\n Param=0x%x\n", Routine, Param); @@ -205,8 +235,6 @@ NtUserCallTwoParam( { NTSTATUS Status; PWINDOW_OBJECT WindowObject; - PWINSTATION_OBJECT WinStaObject; - POINT Pos; switch(Routine) { @@ -315,58 +343,6 @@ NtUserCallTwoParam( IntReleaseWindowObject(WindowObject); return (DWORD)TRUE; - - case TWOPARAM_ROUTINE_CURSORPOSITION: - if(!Param1) - return (DWORD)FALSE; - Status = IntValidateWindowStationHandle(PROCESS_WINDOW_STATION(), - KernelMode, - 0, - &WinStaObject); - if (!NT_SUCCESS(Status)) - return (DWORD)FALSE; - - if(Param2) - { - /* set cursor position */ - MOUSEINPUT mi; - - Status = MmCopyFromCaller(&Pos, (PPOINT)Param1, sizeof(POINT)); - if(!NT_SUCCESS(Status)) - { - ObDereferenceObject(WinStaObject); - SetLastNtError(Status); - return FALSE; - } - - mi.dx = Pos.x; - mi.dy = Pos.y; - mi.mouseData = 0; - mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE; - mi.time = 0; - mi.dwExtraInfo = 0; - IntMouseInput(&mi); - } - else - { - /* get cursor position */ - /* FIXME - check if process has WINSTA_READATTRIBUTES */ - Pos.x = WinStaObject->SystemCursor.x; - Pos.y = WinStaObject->SystemCursor.y; - - Status = MmCopyToCaller((PPOINT)Param1, &Pos, sizeof(POINT)); - if(!NT_SUCCESS(Status)) - { - ObDereferenceObject(WinStaObject); - SetLastNtError(Status); - return FALSE; - } - - } - - ObDereferenceObject(WinStaObject); - - return (DWORD)TRUE; case TWOPARAM_ROUTINE_SETCARETPOS: return (DWORD)IntSetCaretPos((int)Param1, (int)Param2); From 36599d2a2b40dbe584ee27db50ebb08c641a91c9 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 1 May 2004 11:38:28 +0000 Subject: [PATCH 0998/1463] fixed DrawFocusRect() to use values from SPI_GETFOCUSBORDERWIDTH/HEIGHT svn path=/trunk/; revision=9263 --- reactos/lib/user32/windows/draw.c | 29 +- reactos/subsys/win32k/ntuser/misc.c | 417 ++++++++++++++++++---------- 2 files changed, 290 insertions(+), 156 deletions(-) diff --git a/reactos/lib/user32/windows/draw.c b/reactos/lib/user32/windows/draw.c index 6ed31ee4f1f..e4422576db2 100644 --- a/reactos/lib/user32/windows/draw.c +++ b/reactos/lib/user32/windows/draw.c @@ -37,7 +37,14 @@ #include #include #include -#include +#include +#include + +/* FIXME - not yet defined in w32api :( */ +#define SPI_GETFOCUSBORDERWIDTH (8206) +#define SPI_SETFOCUSBORDERWIDTH (8207) +#define SPI_GETFOCUSBORDERHEIGHT (8208) +#define SPI_SETFOCUSBORDERHEIGHT (8209) /* GLOBALS *******************************************************************/ @@ -1845,6 +1852,7 @@ DrawFocusRect(HDC hdc, CONST RECT *rect) { static HBRUSH hFocusRectBrush = NULL; HGDIOBJ OldObj; + UINT cx, cy; if(!hFocusRectBrush) { @@ -1855,16 +1863,19 @@ DrawFocusRect(HDC hdc, CONST RECT *rect) hFocusRectBrush = CreatePatternBrush(hFocusPattern); } + NtUserSystemParametersInfo(SPI_GETFOCUSBORDERWIDTH, 0, &cx, 0); + NtUserSystemParametersInfo(SPI_GETFOCUSBORDERHEIGHT, 0, &cy, 0); + OldObj = SelectObject(hdc, hFocusRectBrush); - PatBlt(hdc, rect->left, rect->top, - rect->right - rect->left - 1, 1, PATINVERT); - PatBlt(hdc, rect->left, rect->top + 1, 1, - rect->bottom - rect->top - 1, PATINVERT); - PatBlt(hdc, rect->left + 1, rect->bottom - 1, - rect->right - rect->left - 1, -1, PATINVERT); - PatBlt(hdc, rect->right - 1, rect->top, -1, - rect->bottom - rect->top - 1, PATINVERT); + /* top */ + PatBlt(hdc, rect->left, rect->top, rect->right - rect->left, cy, PATINVERT); + /* bottom */ + PatBlt(hdc, rect->left, rect->bottom - cy, rect->right - rect->left, cy, PATINVERT); + /* left */ + PatBlt(hdc, rect->left, rect->top + cy, cx, rect->bottom - rect->top - (2 * cy), PATINVERT); + /* right */ + PatBlt(hdc, rect->right - cx, rect->top + cy, cx, rect->bottom - rect->top - (2 * cy), PATINVERT); SelectObject(hdc, OldObj); return TRUE; diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index 1fe2e0f3230..99e3ffe5b0c 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.65 2004/05/01 09:31:59 weiden Exp $ +/* $Id: misc.c,v 1.66 2004/05/01 11:38:28 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -8,6 +8,7 @@ * REVISION HISTORY: * 2003/05/22 Created */ +#define __WIN32K__ #include #include #include @@ -35,6 +36,12 @@ #define NDEBUG #include +/* 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 ) { @@ -507,24 +514,22 @@ IntGetFontMetricSetting(LPWSTR lpValueName, PLOGFONTW font) } } -/* - * @implemented - */ -DWORD -STDCALL -NtUserSystemParametersInfo( +ULONG FASTCALL +IntSystemParametersInfo( UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni) { - static BOOL GradientCaptions = TRUE; - NTSTATUS Status; PWINSTATION_OBJECT WinStaObject; + NTSTATUS Status; static BOOL bInitialized = FALSE; static LOGFONTW IconFont; static NONCLIENTMETRICSW pMetrics; + static BOOL GradientCaptions = TRUE; + static UINT FocusBorderHeight = 1; + static UINT FocusBorderWidth = 1; if (!bInitialized) { @@ -551,161 +556,279 @@ NtUserSystemParametersInfo( bInitialized = TRUE; } + + switch(uiAction) + { + case SPI_SETDOUBLECLKWIDTH: + case SPI_SETDOUBLECLKHEIGHT: + case SPI_SETDOUBLECLICKTIME: + { + Status = IntValidateWindowStationHandle(PROCESS_WINDOW_STATION(), + KernelMode, + 0, + &WinStaObject); + if(!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return (DWORD)FALSE; + } + + switch(uiAction) + { + case SPI_SETDOUBLECLKWIDTH: + /* FIXME limit the maximum value? */ + WinStaObject->SystemCursor.DblClickWidth = uiParam; + break; + case SPI_SETDOUBLECLKHEIGHT: + /* FIXME limit the maximum value? */ + WinStaObject->SystemCursor.DblClickHeight = uiParam; + break; + case SPI_SETDOUBLECLICKTIME: + /* FIXME limit the maximum time to 1000 ms? */ + WinStaObject->SystemCursor.DblClickSpeed = uiParam; + break; + } + + /* FIXME save the value to the registry */ + + ObDereferenceObject(WinStaObject); + return TRUE; + } + case SPI_SETWORKAREA: + { + RECT *rc; + PDESKTOP_OBJECT Desktop = PsGetWin32Thread()->Desktop; + + if(!Desktop) + { + /* FIXME - Set last error */ + return FALSE; + } + + ASSERT(pvParam); + rc = (RECT*)pvParam; + Desktop->WorkArea = *rc; + + return TRUE; + } + case SPI_GETWORKAREA: + { + PDESKTOP_OBJECT Desktop = PsGetWin32Thread()->Desktop; + + if(!Desktop) + { + /* FIXME - Set last error */ + return FALSE; + } + + ASSERT(pvParam); + *((PRECT)pvParam) = *(IntGetDesktopWorkArea(Desktop)); + + return TRUE; + } + case SPI_SETGRADIENTCAPTIONS: + { + GradientCaptions = (pvParam != NULL); + /* FIXME - should be checked if the color depth is higher than 8bpp? */ + return TRUE; + } + 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); + + ASSERT(pvParam); + *((PBOOL)pvParam) = Ret; + return TRUE; + } + return FALSE; + } + case SPI_SETFONTSMOOTHING: + { + IntEnableFontRendering(uiParam != 0); + return TRUE; + } + case SPI_GETFONTSMOOTHING: + { + ASSERT(pvParam); + *((BOOL*)pvParam) = IntIsFontRenderingEnabled(); + return TRUE; + } + case SPI_GETICONTITLELOGFONT: + { + ASSERT(pvParam); + *((LOGFONTW*)pvParam) = IconFont; + return TRUE; + } + case SPI_GETNONCLIENTMETRICS: + { + ASSERT(pvParam); + *((NONCLIENTMETRICSW*)pvParam) = pMetrics; + return TRUE; + } + case SPI_GETFOCUSBORDERHEIGHT: + { + ASSERT(pvParam); + *((UINT*)pvParam) = FocusBorderHeight; + return TRUE; + } + case SPI_GETFOCUSBORDERWIDTH: + { + ASSERT(pvParam); + *((UINT*)pvParam) = FocusBorderWidth; + return TRUE; + } + case SPI_SETFOCUSBORDERHEIGHT: + { + FocusBorderHeight = (UINT)pvParam; + return TRUE; + } + case SPI_SETFOCUSBORDERWIDTH: + { + FocusBorderWidth = (UINT)pvParam; + return TRUE; + } + + default: + { + DPRINT1("SystemParametersInfo: Unsupported Action 0x%x (uiParam: 0x%x, pvParam: 0x%x, fWinIni: 0x%x)\n", + uiAction, uiParam, pvParam, fWinIni); + return FALSE; + } + } + return FALSE; +} + +/* + * @implemented + */ +DWORD +STDCALL +NtUserSystemParametersInfo( + UINT uiAction, + UINT uiParam, + PVOID pvParam, + UINT fWinIni) +{ + NTSTATUS Status; switch(uiAction) { case SPI_SETDOUBLECLKWIDTH: case SPI_SETDOUBLECLKHEIGHT: case SPI_SETDOUBLECLICKTIME: - { - Status = IntValidateWindowStationHandle(PROCESS_WINDOW_STATION(), - KernelMode, - 0, - &WinStaObject); - if (!NT_SUCCESS(Status)) - return (DWORD)FALSE; - - switch(uiAction) - { - case SPI_SETDOUBLECLKWIDTH: - /* FIXME limit the maximum value? */ - WinStaObject->SystemCursor.DblClickWidth = uiParam; - break; - case SPI_SETDOUBLECLKHEIGHT: - /* FIXME limit the maximum value? */ - WinStaObject->SystemCursor.DblClickHeight = uiParam; - break; - case SPI_SETDOUBLECLICKTIME: - /* FIXME limit the maximum time to 1000 ms? */ - WinStaObject->SystemCursor.DblClickSpeed = uiParam; - break; - } - - /* FIXME save the value to the registry */ - - ObDereferenceObject(WinStaObject); - return TRUE; - } - case SPI_SETWORKAREA: - { - PDESKTOP_OBJECT Desktop = PsGetWin32Thread()->Desktop; - - if(!Desktop) - { - /* FIXME - Set last error */ - return FALSE; - } - - Status = MmCopyFromCaller(Desktop->WorkArea, (PRECT)pvParam, sizeof(RECT)); - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return FALSE; - } - - return TRUE; - } - case SPI_GETWORKAREA: - { - PRECT Rect; - PDESKTOP_OBJECT Desktop = PsGetWin32Thread()->Desktop; - - if(!Desktop) - { - /* FIXME - Set last error */ - return FALSE; - } - - Rect = IntGetDesktopWorkArea(Desktop); - - Status = MmCopyToCaller((PRECT)pvParam, Desktop->WorkArea, sizeof(RECT)); - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return FALSE; - } - - return TRUE; - } - 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); - DC_UnlockDc(hDC); - } - - Status = MmCopyToCaller(pvParam, &Ret, sizeof(BOOL)); - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return FALSE; - } - return TRUE; - } case SPI_SETGRADIENTCAPTIONS: - { - Status = MmCopyFromCaller(&GradientCaptions, pvParam, sizeof(BOOL)); - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return FALSE; - } - return TRUE; - } case SPI_SETFONTSMOOTHING: + case SPI_SETFOCUSBORDERHEIGHT: + case SPI_SETFOCUSBORDERWIDTH: + { + return (DWORD)IntSystemParametersInfo(uiAction, uiParam, pvParam, fWinIni); + } + case SPI_SETWORKAREA: + { + RECT rc; + Status = MmCopyFromCaller(&rc, (PRECT)pvParam, sizeof(RECT)); + if(!NT_SUCCESS(Status)) { - BOOL Enable; - - Status = MmCopyFromCaller(&Enable, pvParam, sizeof(BOOL)); - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return FALSE; - } - - IntEnableFontRendering(Enable); - - return TRUE; + SetLastNtError(Status); + return FALSE; } + return (DWORD)IntSystemParametersInfo(uiAction, uiParam, &rc, fWinIni); + } + case SPI_GETWORKAREA: + { + RECT rc; + + if(!IntSystemParametersInfo(uiAction, uiParam, &rc, fWinIni)) + { + return FALSE; + } + + Status = MmCopyToCaller((PRECT)pvParam, &rc, sizeof(RECT)); + if(!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return FALSE; + } + return TRUE; + } case SPI_GETFONTSMOOTHING: + case SPI_GETGRADIENTCAPTIONS: + case SPI_GETFOCUSBORDERHEIGHT: + case SPI_GETFOCUSBORDERWIDTH: + { + BOOL Ret; + + if(!IntSystemParametersInfo(uiAction, uiParam, &Ret, fWinIni)) { - BOOL Enabled = IntIsFontRenderingEnabled(); - - Status = MmCopyToCaller(pvParam, &Enabled, sizeof(BOOL)); - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return FALSE; - } - return TRUE; + return FALSE; } + + Status = MmCopyToCaller(pvParam, &Ret, sizeof(BOOL)); + if(!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return FALSE; + } + return TRUE; + } case SPI_GETICONTITLELOGFONT: { - MmCopyToCaller(pvParam, (PVOID)&IconFont, sizeof(LOGFONTW)); - return TRUE; - } + LOGFONTW IconFont; + + if(!IntSystemParametersInfo(uiAction, uiParam, &IconFont, fWinIni)) + { + return FALSE; + } + + Status = MmCopyToCaller(pvParam, &IconFont, sizeof(LOGFONTW)); + if(!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return FALSE; + } + return TRUE; + } case SPI_GETNONCLIENTMETRICS: { - /* FIXME: Is this windows default behavior? */ - LPNONCLIENTMETRICSW lpMetrics = (LPNONCLIENTMETRICSW)pvParam; - if ( lpMetrics->cbSize != sizeof(NONCLIENTMETRICSW) || - uiParam != sizeof(NONCLIENTMETRICSW )) - { - return FALSE; - } - DPRINT("FontName: %S, Size: %i\n",pMetrics.lfMessageFont.lfFaceName, pMetrics.lfMessageFont.lfHeight); - MmCopyToCaller(pvParam, (PVOID)&pMetrics, sizeof(NONCLIENTMETRICSW)); - return TRUE; + NONCLIENTMETRICSW metrics; + + Status = MmCopyFromCaller(&metrics.cbSize, pvParam, sizeof(UINT)); + if(!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return FALSE; + } + if((metrics.cbSize != sizeof(NONCLIENTMETRICSW)) || + (uiParam != sizeof(NONCLIENTMETRICSW))) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return FALSE; + } + + if(!IntSystemParametersInfo(uiAction, uiParam, &metrics, fWinIni)) + { + return FALSE; + } + + Status = MmCopyToCaller(pvParam, &metrics.cbSize, sizeof(NONCLIENTMETRICSW)); + if(!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return FALSE; + } + return TRUE; } } return FALSE; From 29963dba5d2bdf2c6972ab7609b1731e50e94a08 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 1 May 2004 11:43:52 +0000 Subject: [PATCH 0999/1463] don't use DrawFocusFrame for thin window moving rectangles svn path=/trunk/; revision=9264 --- reactos/lib/user32/windows/defwnd.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/reactos/lib/user32/windows/defwnd.c b/reactos/lib/user32/windows/defwnd.c index 808a1e2bf4e..9a194596c02 100644 --- a/reactos/lib/user32/windows/defwnd.c +++ b/reactos/lib/user32/windows/defwnd.c @@ -1,4 +1,4 @@ -/* $Id: defwnd.c,v 1.134 2004/04/15 23:36:02 weiden Exp $ +/* $Id: defwnd.c,v 1.135 2004/05/01 11:43:52 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -480,7 +480,9 @@ UserDrawMovingFrame(HDC hdc, RECT *rect, BOOL thickframe, HRGN ClipRgn) UserDrawWindowFrame(hdc, rect, GetSystemMetrics(SM_CXFRAME), GetSystemMetrics(SM_CYFRAME)); } else - DrawFocusRect( hdc, rect ); + { + UserDrawWindowFrame(hdc, rect, 1, 1); + } if(ClipRgn) { From 58fa3560b292a8348f0948c299ccca64a58bdb0d Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 1 May 2004 11:53:20 +0000 Subject: [PATCH 1000/1463] Add required user shell folder settings. svn path=/trunk/; revision=9265 --- reactos/bootdata/hivedef.inf | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/reactos/bootdata/hivedef.inf b/reactos/bootdata/hivedef.inf index 137de793c4b..5c0a929e7ea 100644 --- a/reactos/bootdata/hivedef.inf +++ b/reactos/bootdata/hivedef.inf @@ -12,7 +12,6 @@ HKCU,"Control Panel\International","Locale",0x00000000,"0409" HKCU,"Environment",,0x00000012 - HKCU,"SOFTWARE",,0x00000012 HKCU,"SOFTWARE\Microsoft",,0x00000012 @@ -20,6 +19,7 @@ HKCU,"SOFTWARE\Microsoft",,0x00000012 HKCU,"SOFTWARE\Microsoft\Windows",,0x00000012 HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion",,0x00000012 HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer",,0x00000012 +HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders",,0x00000012 HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Desktop",0x00020000,"%SystemDrive%\Documents and Settings\Default\Desktop" HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","AppData",0x00020000,"%SystemDrive%\Documents and Settings\Default\Application Data" HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Programs",0x00020000,"%SystemDrive%\Documents and Settings\Default\Start Menu\Programs" @@ -31,8 +31,15 @@ HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Persona HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","SendTo",0x00020000,"%SystemDrive%\Documents and Settings\Default\SendTo" HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Recent",0x00020000,"%SystemDrive%\Documents and Settings\Default\Recent" HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","NetHood",0x00020000,"%SystemDrive%\Documents and Settings\Default\NetHood" -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders","Personal",0x00020000,"%SystemDrive%\Documents and Settings\Default\My Documents" -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders","Favorites",0x00020000,"%SystemDrive%\Documents and Settings\Default\Favorites" +HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders",,0x00000012 +HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders","Common Desktop",0x00020000,"%ALLUSERSPROFILE%\Desktop" +HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders","Common Programs",0x00020000,"%ALLUSERSPROFILE%\Start Menu\Programs" +HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders","Common Start Menu",0x00020000,"%ALLUSERSPROFILE%\Start Menu" +HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders","Desktop",0x00020000,"%USERPROFILE%\Desktop" +HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders","Favorites",0x00020000,"%USERPROFILE%\Favorites" +HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders","Personal",0x00020000,"%USERPROFILE%\My Documents" +HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders","Programs",0x00020000,"%USERPROFILE%\Start Menu\Programs" +HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders","Start Menu",0x00020000,"%USERPROFILE%\Start Menu" HKCU,"SOFTWARE\Microsoft\Windows NT",,0x00000012 From 346aa0cca202c5d13b10133111ce9f95d568053b Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 1 May 2004 11:55:38 +0000 Subject: [PATCH 1001/1463] - Set ALLUSERSPROFILE environment variable upon logon. - Implement CreateGroup(). svn path=/trunk/; revision=9266 --- reactos/lib/userenv/desktop.c | 99 ++++++++++++++++++++++++++++++- reactos/lib/userenv/environment.c | 12 +++- reactos/lib/userenv/userenv.def | 2 + reactos/lib/userenv/userenv.edf | 2 + reactos/w32api/include/userenv.h | 4 ++ 5 files changed, 117 insertions(+), 2 deletions(-) diff --git a/reactos/lib/userenv/desktop.c b/reactos/lib/userenv/desktop.c index 70a9fb6352f..0655be3c881 100644 --- a/reactos/lib/userenv/desktop.c +++ b/reactos/lib/userenv/desktop.c @@ -1,4 +1,4 @@ -/* $Id: desktop.c,v 1.1 2004/04/29 14:41:26 ekohl Exp $ +/* $Id: desktop.c,v 1.2 2004/05/01 11:55:01 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -71,6 +71,60 @@ GetDesktopPath (BOOL bCommonPath, } +static BOOL +GetProgramsPath (BOOL bCommonPath, + LPWSTR lpProgramsPath) +{ + WCHAR szPath[MAX_PATH]; + DWORD dwLength; + DWORD dwType; + HKEY hKey; + + DPRINT ("GetProgramsPath() called\n"); + + if (RegOpenKeyExW (HKEY_CURRENT_USER, + L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders", + 0, + KEY_ALL_ACCESS, + &hKey)) + { + DPRINT1 ("RegOpenKeyExW() failed\n"); + return FALSE; + } + + dwLength = MAX_PATH * sizeof(WCHAR); + if (RegQueryValueExW (hKey, + bCommonPath ? L"Common Programs" : L"Programs", + 0, + &dwType, + (LPBYTE)szPath, + &dwLength)) + { + DPRINT1 ("RegQueryValueExW() failed\n"); + RegCloseKey (hKey); + return FALSE; + } + + RegCloseKey (hKey); + + if (dwType == REG_EXPAND_SZ) + { + ExpandEnvironmentStringsW (szPath, + lpProgramsPath, + MAX_PATH); + } + else + { + wcscpy (lpProgramsPath, + szPath); + } + + DPRINT ("GetProgramsPath() done\n"); + + return TRUE; +} + + BOOL WINAPI AddDesktopItemA (BOOL bCommonItem, LPCSTR lpItemName, @@ -243,4 +297,47 @@ DeleteDesktopItemW (BOOL bCommonItem, return DeleteFile (szLinkPath); } + +BOOL WINAPI +CreateGroupA (LPCSTR lpGroupName, + BOOL bCommonGroup) +{ + DPRINT1 ("CreateGroupA() not implemented!\n"); + return FALSE; +} + + +BOOL WINAPI +CreateGroupW (LPCWSTR lpGroupName, + BOOL bCommonGroup) +{ + WCHAR szGroupPath[MAX_PATH]; + + DPRINT ("CreateGroupW() called\n"); + + if (lpGroupName == NULL || *lpGroupName == 0) + return TRUE; + + if (!GetProgramsPath (bCommonGroup, szGroupPath)) + { + DPRINT1 ("GetProgramsPath() failed\n"); + return FALSE; + } + DPRINT ("Programs path: '%S'\n", szGroupPath); + + wcscat (szGroupPath, L"\\"); + wcscat (szGroupPath, lpGroupName); + DPRINT ("Group path: '%S'\n", szGroupPath); + + /* FIXME: Create nested directories */ + if (!CreateDirectory (szGroupPath, NULL)) + return FALSE; + + /* FIXME: Notify the shell */ + + DPRINT ("CreateGroupW() done\n"); + + return TRUE; +} + /* EOF */ diff --git a/reactos/lib/userenv/environment.c b/reactos/lib/userenv/environment.c index e77be56f261..c65962b6e71 100644 --- a/reactos/lib/userenv/environment.c +++ b/reactos/lib/userenv/environment.c @@ -1,4 +1,4 @@ -/* $Id: environment.c,v 1.2 2004/03/24 16:00:01 ekohl Exp $ +/* $Id: environment.c,v 1.3 2004/05/01 11:55:01 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -270,6 +270,16 @@ CreateEnvironmentBlock (LPVOID *lpEnvironment, return FALSE; } + /* Set 'ALLUSERSPROFILE' variable */ + Length = MAX_PATH; + if (GetAllUsersProfileDirectoryW (Buffer, + &Length)) + { + SetUserEnvironmentVariable (lpEnvironment, + L"ALLUSERSPROFILE", + Buffer); + } + /* Set 'USERPROFILE' variable */ Length = MAX_PATH; if (GetUserProfileDirectoryW (hToken, diff --git a/reactos/lib/userenv/userenv.def b/reactos/lib/userenv/userenv.def index 4c52e97a033..544305f2aa2 100644 --- a/reactos/lib/userenv/userenv.def +++ b/reactos/lib/userenv/userenv.def @@ -1,6 +1,8 @@ LIBRARY userenv.dll EXPORTS InitializeProfiles@0 @100 NONAME +CreateGroupA@8 @101 NONAME +CreateGroupW@8 @102 NONAME CreateUserProfileA@8 @109 NONAME CreateUserProfileW@8 @110 NONAME AddDesktopItemA@32 @113 NONAME diff --git a/reactos/lib/userenv/userenv.edf b/reactos/lib/userenv/userenv.edf index 20a0169c053..df109f85fe7 100644 --- a/reactos/lib/userenv/userenv.edf +++ b/reactos/lib/userenv/userenv.edf @@ -1,6 +1,8 @@ LIBRARY userenv.dll EXPORTS InitializeProfiles=InitializeProfiles@0 @100 NONAME +CreateGroupA=CreateGroupA@8 @101 NONAME +CreateGroupW=CreateGroupW@8 @102 NONAME CreateUserProfileA=CreateUserProfileA@8 @109 NONAME CreateUserProfileW=CreateUserProfileW@8 @110 NONAME AddDesktopItemA=AddDesktopItemA@32 @113 NONAME diff --git a/reactos/w32api/include/userenv.h b/reactos/w32api/include/userenv.h index 3328758fe6c..d228d679d9a 100644 --- a/reactos/w32api/include/userenv.h +++ b/reactos/w32api/include/userenv.h @@ -44,6 +44,8 @@ BOOL WINAPI AddDesktopItemA (BOOL, LPCSTR, LPCSTR, LPCSTR, INT, LPCSTR, WORD, IN BOOL WINAPI AddDesktopItemW (BOOL, LPCWSTR, LPCWSTR, LPCWSTR, INT, LPCWSTR, WORD, INT); BOOL WINAPI DeleteDesktopItemA (BOOL, LPCSTR); BOOL WINAPI DeleteDesktopItemW (BOOL, LPCWSTR); +BOOL WINAPI CreateGroupA (LPCSTR, BOOL); +BOOL WINAPI CreateGroupW (LPCWSTR, BOOL); /* end private */ BOOL WINAPI LoadUserProfileA (HANDLE, LPPROFILEINFOA); BOOL WINAPI LoadUserProfileW (HANDLE, LPPROFILEINFOW); @@ -68,6 +70,7 @@ typedef LPPROFILEINFOW LPPROFILEINFO; #define CreateUserProfile CreateUserProfileW #define AddDesktopItem AddDesktopItemW #define DeleteDesktopItem DeleteDesktopItemW +#define CreateGroup CreateGroupW /* end private */ #define LoadUserProfile LoadUserProfileW #define GetAllUsersProfileDirectory GetAllUsersProfileDirectoryW @@ -81,6 +84,7 @@ typedef LPPROFILEINFOA LPPROFILEINFO; #define CreateUserProfile CreateUserProfileA #define AddDesktopItem AddDesktopItemA #define DeleteDesktopItem DeleteDesktopItemA +#define CreateGroup CreateGroupA /* end private */ #define LoadUserProfile LoadUserProfileA #define GetAllUsersProfileDirectory GetAllUsersProfileDirectoryA From 56ee4446f03ab82e296c90a1d2b1260abdc66945 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 1 May 2004 16:43:15 +0000 Subject: [PATCH 1002/1463] implemented RegisterLogonProcess(), LockWindowStation() and UnlockWindowStation() svn path=/trunk/; revision=9267 --- reactos/include/funcs.h | 2 +- reactos/include/win32k/ntuser.h | 1 + reactos/lib/user32/include/user32.h | 3 ++ reactos/lib/user32/misc/misc.c | 12 +++++- reactos/lib/user32/misc/stubs.c | 13 +------ reactos/ntoskrnl/include/internal/ex.h | 2 +- reactos/subsys/win32k/include/winsta.h | 5 +++ reactos/subsys/win32k/main/dllmain.c | 10 ++++- reactos/subsys/win32k/ntuser/desktop.c | 16 +++++++- reactos/subsys/win32k/ntuser/misc.c | 52 ++++++++++++++++++++++++-- 10 files changed, 94 insertions(+), 22 deletions(-) diff --git a/reactos/include/funcs.h b/reactos/include/funcs.h index 8c5acbb632f..7c8423d1c9a 100644 --- a/reactos/include/funcs.h +++ b/reactos/include/funcs.h @@ -4624,7 +4624,7 @@ RegisterSystemThread( DWORD reserved ); -DWORD +BOOL STDCALL RegisterLogonProcess( HANDLE hprocess, diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index 3ab2b9086e9..835e144e190 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -206,6 +206,7 @@ NtUserCallOneParam( #define TWOPARAM_ROUTINE_SETWNDCONTEXTHLPID 0x58 #define TWOPARAM_ROUTINE_SETCARETPOS 0x60 #define TWOPARAM_ROUTINE_GETWINDOWINFO 0x61 +#define TWOPARAM_ROUTINE_REGISTERLOGONPROC 0x62 DWORD STDCALL NtUserCallTwoParam( diff --git a/reactos/lib/user32/include/user32.h b/reactos/lib/user32/include/user32.h index 25f0fa8fb6d..8853a44cf71 100644 --- a/reactos/lib/user32/include/user32.h +++ b/reactos/lib/user32/include/user32.h @@ -52,6 +52,9 @@ void DrawCaret(HWND hWnd, PTHRDCARETINFO CaretInfo); #define NtUserGetWindowInfo(hwnd, pwi) \ (BOOL)NtUserCallTwoParam((DWORD)hwnd, (DWORD)pwi, TWOPARAM_ROUTINE_GETWINDOWINFO) +#define NtUserRegisterLogonProcess(hproc, x) \ + (BOOL)NtUserCallTwoParam((DWORD)hproc, (DWORD)x, TWOPARAM_ROUTINE_REGISTERLOGONPROC) + #define NtUserSetCaretBlinkTime(uMSeconds) \ (BOOL)NtUserCallOneParam((DWORD)uMSeconds, ONEPARAM_ROUTINE_SETCARETBLINKTIME) diff --git a/reactos/lib/user32/misc/misc.c b/reactos/lib/user32/misc/misc.c index 1a7a938438d..15503839f79 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.3 2003/12/07 23:02:57 gvg Exp $ +/* $Id: misc.c,v 1.4 2004/05/01 16:43:14 weiden Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/misc/misc.c @@ -56,3 +56,13 @@ PrivateCsrssManualGuiCheck(LONG Check) { NtUserManualGuiCheck(Check); } + +/* + * @implemented + */ +BOOL +STDCALL +RegisterLogonProcess ( HANDLE hprocess, BOOL x ) +{ + return NtUserRegisterLogonProcess(hprocess, x); +} diff --git a/reactos/lib/user32/misc/stubs.c b/reactos/lib/user32/misc/stubs.c index f58ef74e451..1209780ac5f 100644 --- a/reactos/lib/user32/misc/stubs.c +++ b/reactos/lib/user32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.59 2004/04/29 20:26:35 weiden Exp $ +/* $Id: stubs.c,v 1.60 2004/05/01 16:43:14 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -372,17 +372,6 @@ RegisterSystemThread ( DWORD flags, DWORD reserved ) UNIMPLEMENTED; } -/* - * @unimplemented - */ -DWORD -STDCALL -RegisterLogonProcess ( HANDLE hprocess, BOOL x ) -{ - UNIMPLEMENTED; - return FALSE; -} - /* * @unimplemented */ diff --git a/reactos/ntoskrnl/include/internal/ex.h b/reactos/ntoskrnl/include/internal/ex.h index 0775fc405e1..091ae13c79c 100644 --- a/reactos/ntoskrnl/include/internal/ex.h +++ b/reactos/ntoskrnl/include/internal/ex.h @@ -59,7 +59,7 @@ typedef struct _WINSTATION_OBJECT UINT CaretBlinkRate; HANDLE ShellWindow; HANDLE ShellListView; - BOOL DesktopLocked; + ULONG Flags; struct _DESKTOP_OBJECT* ActiveDesktop; /* FIXME: Clipboard */ LIST_ENTRY HotKeyListHead; diff --git a/reactos/subsys/win32k/include/winsta.h b/reactos/subsys/win32k/include/winsta.h index d51d691dd14..c0e2fff1686 100644 --- a/reactos/subsys/win32k/include/winsta.h +++ b/reactos/subsys/win32k/include/winsta.h @@ -16,7 +16,12 @@ #define WINSTA_ROOT_NAME L"\\Windows\\WindowStations" #define WINSTA_ROOT_NAME_LENGTH 23 +/* Window Station Status Flags */ +#define WSS_LOCKED (1) +#define WSS_NOINTERACTIVE (2) + extern WINSTATION_OBJECT *InputWindowStation; +extern PW32PROCESS LogonProcess; NTSTATUS FASTCALL InitWindowStationImpl(VOID); diff --git a/reactos/subsys/win32k/main/dllmain.c b/reactos/subsys/win32k/main/dllmain.c index 6acaadc50ed..275e7930b2f 100644 --- a/reactos/subsys/win32k/main/dllmain.c +++ b/reactos/subsys/win32k/main/dllmain.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: dllmain.c,v 1.69 2004/04/29 20:26:35 weiden Exp $ +/* $Id: dllmain.c,v 1.70 2004/05/01 16:43:14 weiden Exp $ * * Entry Point for win32k.sys */ @@ -138,6 +138,14 @@ Win32kProcessCallback (struct _EPROCESS *Process, CleanupForProcess(Process, Process->UniqueProcessId); IntGraphicsCheck(FALSE); + + /* + * Deregister logon application automatically + */ + if(LogonProcess == Win32Process) + { + LogonProcess = NULL; + } } return STATUS_SUCCESS; diff --git a/reactos/subsys/win32k/ntuser/desktop.c b/reactos/subsys/win32k/ntuser/desktop.c index f0f5a02740a..5d8132d6b94 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.10 2004/04/09 20:03:19 navaraf Exp $ + * $Id: desktop.c,v 1.11 2004/05/01 16:43:15 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -719,7 +719,19 @@ NtUserSwitchDesktop(HDESK hDesktop) DPRINT("Validation of desktop handle (0x%X) failed\n", hDesktop); return FALSE; } - + + /* + * Don't allow applications switch the desktop if it's locked, unless the caller + * is the logon application itself + */ + if((DesktopObject->WindowStation->Flags & WSS_LOCKED) && + LogonProcess != NULL && LogonProcess != PsGetWin32Process()) + { + ObDereferenceObject(DesktopObject); + DPRINT1("Switching desktop 0x%x denied because the work station is locked!\n", hDesktop); + return FALSE; + } + /* FIXME: Fail if the desktop belong to an invisible window station */ /* FIXME: Fail if the process is associated with a secured desktop such as Winlogon or Screen-Saver */ diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index 99e3ffe5b0c..8209a506f4a 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.66 2004/05/01 11:38:28 weiden Exp $ +/* $Id: misc.c,v 1.67 2004/05/01 16:43:15 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -36,6 +36,9 @@ #define NDEBUG #include +/* registered Logon process */ +PW32PROCESS LogonProcess = NULL; + /* FIXME - not yet defined in w32api :( */ #define SPI_GETFOCUSBORDERWIDTH (8206) #define SPI_SETFOCUSBORDERWIDTH (8207) @@ -61,6 +64,43 @@ PUSER_MESSAGE_QUEUE W32kGetPrimitiveMessageQueue() { return pmPrimitiveMessageQueue; } +BOOL FASTCALL +IntRegisterLogonProcess(HANDLE hProcess, BOOL x) +{ + PEPROCESS Process; + NTSTATUS Status; + + if(LogonProcess != NULL && LogonProcess != PsGetWin32Process()) + { + SetLastWin32Error(ERROR_ACCESS_DENIED); + return FALSE; + } + + if(hProcess) + { + Status = ObReferenceObjectByHandle(hProcess, + PROCESS_QUERY_INFORMATION, + PsProcessType, + ExGetPreviousMode(), + (PVOID*)&Process, + NULL); + if(!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return 0; + } + + LogonProcess = Process->Win32Process; + ObDereferenceObject(Process); + } + else + { + /* deregister the logon process */ + LogonProcess = NULL; + } + return TRUE; +} + /* * @unimplemented */ @@ -94,7 +134,7 @@ NtUserCallNoParam(DWORD Routine) break; default: - DPRINT1("Calling invalid routine number 0x%x in NtUserCallTwoParam\n"); + DPRINT1("Calling invalid routine number 0x%x in NtUserCallNoParam\n"); SetLastWin32Error(ERROR_INVALID_PARAMETER); break; } @@ -223,7 +263,7 @@ NtUserCallOneParam( return (DWORD)TRUE; } } - DPRINT1("Calling invalid routine number 0x%x in NtUserCallOneParam()\n Param=0x%x\n", + DPRINT1("Calling invalid routine number 0x%x in NtUserCallOneParam(), Param=0x%x\n", Routine, Param); SetLastWin32Error(ERROR_INVALID_PARAMETER); return 0; @@ -394,8 +434,12 @@ NtUserCallTwoParam( IntReleaseWindowObject(WindowObject); return Ret; } + + case TWOPARAM_ROUTINE_REGISTERLOGONPROC: + return (DWORD)IntRegisterLogonProcess((HANDLE)Param1, (BOOL)Param2); + } - DPRINT1("Calling invalid routine number 0x%x in NtUserCallTwoParam()\n Param1=0x%x Parm2=0x%x\n", + DPRINT1("Calling invalid routine number 0x%x in NtUserCallTwoParam(), Param1=0x%x Parm2=0x%x\n", Routine, Param1, Param2); SetLastWin32Error(ERROR_INVALID_PARAMETER); return 0; From 9e1f52330841380521c12ba98609955dd384cbdd Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 1 May 2004 17:06:55 +0000 Subject: [PATCH 1003/1463] implemented LockWindowStation() and UnlockWindowStation() (forgot to commit these changes in my previous commit) svn path=/trunk/; revision=9268 --- reactos/subsys/win32k/ntuser/winsta.c | 74 ++++++++++++++++++++++++--- 1 file changed, 67 insertions(+), 7 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/winsta.c b/reactos/subsys/win32k/ntuser/winsta.c index 02b5ab9e2e4..856beaf0c0f 100644 --- a/reactos/subsys/win32k/ntuser/winsta.c +++ b/reactos/subsys/win32k/ntuser/winsta.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: winsta.c,v 1.57 2004/04/09 20:03:19 navaraf Exp $ + * $Id: winsta.c,v 1.58 2004/05/01 17:06:55 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -740,31 +740,91 @@ NtUserSetProcessWindowStation(HWINSTA hWindowStation) /* * NtUserLockWindowStation * + * Locks switching desktops. Only the logon application is allowed to call this function. + * * Status - * @unimplemented + * @implemented */ BOOL STDCALL NtUserLockWindowStation(HWINSTA hWindowStation) { - UNIMPLEMENTED + PWINSTATION_OBJECT Object; + NTSTATUS Status; - return 0; + DPRINT("About to set process window station with handle (0x%X)\n", + hWindowStation); + + if(PsGetWin32Process() != LogonProcess) + { + DPRINT1("Unauthorized process attempted to lock the window station!\n"); + SetLastWin32Error(ERROR_ACCESS_DENIED); + return FALSE; + } + + Status = IntValidateWindowStationHandle( + hWindowStation, + KernelMode, + 0, + &Object); + if (!NT_SUCCESS(Status)) + { + DPRINT("Validation of window station handle (0x%X) failed\n", + hWindowStation); + SetLastNtError(Status); + return FALSE; + } + + Object->Flags |= WSS_LOCKED; + + ObDereferenceObject(Object); + return TRUE; } /* * NtUserUnlockWindowStation * + * Unlocks switching desktops. Only the logon application is allowed to call this function. + * * Status - * @unimplemented + * @implemented */ BOOL STDCALL NtUserUnlockWindowStation(HWINSTA hWindowStation) { - UNIMPLEMENTED + PWINSTATION_OBJECT Object; + NTSTATUS Status; + BOOL Ret; - return FALSE; + DPRINT("About to set process window station with handle (0x%X)\n", + hWindowStation); + + if(PsGetWin32Process() != LogonProcess) + { + DPRINT1("Unauthorized process attempted to unlock the window station!\n"); + SetLastWin32Error(ERROR_ACCESS_DENIED); + return FALSE; + } + + Status = IntValidateWindowStationHandle( + hWindowStation, + KernelMode, + 0, + &Object); + if (!NT_SUCCESS(Status)) + { + DPRINT("Validation of window station handle (0x%X) failed\n", + hWindowStation); + SetLastNtError(Status); + return FALSE; + } + + Ret = (Object->Flags & WSS_LOCKED) == WSS_LOCKED; + Object->Flags &= ~WSS_LOCKED; + + ObDereferenceObject(Object); + return Ret; } /* From 86805ab86ac7c287dae6a60857316e82aa2b9906 Mon Sep 17 00:00:00 2001 From: Mike Nordell Date: Sat, 1 May 2004 17:11:34 +0000 Subject: [PATCH 1004/1463] MmQuerySectionView now returns correct AllocationBase (Hartmut Birr) svn path=/trunk/; revision=9269 --- reactos/ntoskrnl/mm/section.c | 40 ++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/reactos/ntoskrnl/mm/section.c b/reactos/ntoskrnl/mm/section.c index 070147e811c..efb0ee38204 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.148 2004/05/01 00:25:41 tamlin Exp $ +/* $Id: section.c,v 1.149 2004/05/01 17:11:34 tamlin Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/section.c @@ -2018,6 +2018,10 @@ MmQuerySectionView(PMEMORY_AREA MemoryArea, { PMM_REGION Region; PVOID RegionBaseAddress; + PSECTION_OBJECT Section; + PLIST_ENTRY CurrentEntry; + PMEMORY_AREA CurrentMArea; + KIRQL oldIrql; Region = MmFindRegion(MemoryArea->BaseAddress, &MemoryArea->Data.SectionData.RegionListHead, @@ -2026,20 +2030,40 @@ MmQuerySectionView(PMEMORY_AREA MemoryArea, { return STATUS_UNSUCCESSFUL; } - Info->BaseAddress = (PVOID)PAGE_ROUND_DOWN(Address); - Info->AllocationBase = MemoryArea->BaseAddress; - Info->AllocationProtect = MemoryArea->Attributes; - Info->RegionSize = MemoryArea->Length; - Info->State = MEM_COMMIT; - Info->Protect = Region->Protect; - if (MemoryArea->Data.SectionData.Section->AllocationAttributes & SEC_IMAGE) + Section = MemoryArea->Data.SectionData.Section; + if (Section->AllocationAttributes & SEC_IMAGE) { + KeAcquireSpinLock(&Section->ViewListLock, &oldIrql); + CurrentEntry = Section->ViewListHead.Flink; + Info->AllocationBase = NULL; + while (CurrentEntry != &Section->ViewListHead) + { + CurrentMArea = CONTAINING_RECORD(CurrentEntry, MEMORY_AREA, Data.SectionData.ViewListEntry); + CurrentEntry = CurrentEntry->Flink; + if (Info->AllocationBase == NULL) + { + Info->AllocationBase = CurrentMArea->BaseAddress; + } + else if (CurrentMArea->BaseAddress < Info->AllocationBase) + { + Info->AllocationBase = CurrentMArea->BaseAddress; + } + } + KeReleaseSpinLock(&Section->ViewListLock, oldIrql); + Info->BaseAddress = MemoryArea->BaseAddress; + Info->AllocationProtect = MemoryArea->Attributes; Info->Type = MEM_IMAGE; } else { + Info->BaseAddress = RegionBaseAddress; + Info->AllocationBase = MemoryArea->BaseAddress; + Info->AllocationProtect = Region->Protect; Info->Type = MEM_MAPPED; } + Info->RegionSize = MemoryArea->Length; + Info->State = MEM_COMMIT; + Info->Protect = Region->Protect; *ResultLength = sizeof(MEMORY_BASIC_INFORMATION); return(STATUS_SUCCESS); From 1c49860e4671a5945dfc5924a294b5ef8e59deb9 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 1 May 2004 18:06:59 +0000 Subject: [PATCH 1005/1463] implemented AnyPopup() svn path=/trunk/; revision=9270 --- reactos/include/win32k/ntuser.h | 11 +++++---- reactos/lib/user32/include/user32.h | 2 ++ reactos/lib/user32/misc/stubs.c | 13 +---------- reactos/lib/user32/windows/window.c | 12 +++++++++- reactos/subsys/win32k/include/window.h | 3 +++ reactos/subsys/win32k/ntuser/misc.c | 8 +++++-- reactos/subsys/win32k/ntuser/window.c | 32 +++++++++++++++++++++++++- 7 files changed, 60 insertions(+), 21 deletions(-) diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index 835e144e190..b5ecb94beba 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -156,11 +156,12 @@ NtUserCallNextHookEx( WPARAM wParam, LPARAM lParam); -#define NOPARAM_ROUTINE_REGISTER_PRIMITIVE 0xffff0001 /* Private ROS */ -#define NOPARAM_ROUTINE_DESTROY_CARET 0xffff0002 -#define NOPARAM_ROUTINE_UNINIT_MESSAGE_PUMP 0xffff0003 -#define NOPARAM_ROUTINE_INIT_MESSAGE_PUMP 0xffff0004 -#define NOPARAM_ROUTINE_GETMESSAGEEXTRAINFO 0xffff0005 +#define NOPARAM_ROUTINE_REGISTER_PRIMITIVE 0xffff0001 /* Private ROS */ +#define NOPARAM_ROUTINE_DESTROY_CARET 0xffff0002 +#define NOPARAM_ROUTINE_UNINIT_MESSAGE_PUMP 0xffff0003 +#define NOPARAM_ROUTINE_INIT_MESSAGE_PUMP 0xffff0004 +#define NOPARAM_ROUTINE_GETMESSAGEEXTRAINFO 0xffff0005 +#define NOPARAM_ROUTINE_ANYPOPUP 0xffff0006 DWORD STDCALL NtUserCallNoParam( diff --git a/reactos/lib/user32/include/user32.h b/reactos/lib/user32/include/user32.h index 8853a44cf71..58c8f371286 100644 --- a/reactos/lib/user32/include/user32.h +++ b/reactos/lib/user32/include/user32.h @@ -30,6 +30,8 @@ VOID CreateFrameBrushes(VOID); VOID DeleteFrameBrushes(VOID); void DrawCaret(HWND hWnd, PTHRDCARETINFO CaretInfo); +#define NtUserAnyPopup() \ + (BOOL)NtUserCallNoParam(NOPARAM_ROUTINE_ANYPOPUP) #define NtUserValidateRgn(hWnd, hRgn) \ (BOOL)NtUserCallTwoParam((DWORD)hWnd, (DWORD)hRgn, TWOPARAM_ROUTINE_VALIDATERGN) diff --git a/reactos/lib/user32/misc/stubs.c b/reactos/lib/user32/misc/stubs.c index 1209780ac5f..40bc361982e 100644 --- a/reactos/lib/user32/misc/stubs.c +++ b/reactos/lib/user32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.60 2004/05/01 16:43:14 weiden Exp $ +/* $Id: stubs.c,v 1.61 2004/05/01 18:06:59 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -18,17 +18,6 @@ typedef PVOID LPIMEPROW, LPIMEPROA; #endif -/* - * @unimplemented - */ -BOOL -STDCALL -AnyPopup(VOID) -{ - UNIMPLEMENTED; - return FALSE; -} - /* * @unimplemented */ diff --git a/reactos/lib/user32/windows/window.c b/reactos/lib/user32/windows/window.c index b7960e125cc..2e9f12185e9 100644 --- a/reactos/lib/user32/windows/window.c +++ b/reactos/lib/user32/windows/window.c @@ -1,4 +1,4 @@ -/* $Id: window.c,v 1.113 2004/04/29 21:13:16 gvg Exp $ +/* $Id: window.c,v 1.114 2004/05/01 18:06:59 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -1645,5 +1645,15 @@ ScrollWindowEx(HWND hWnd, int dx, int dy, CONST RECT *prcScroll, prcUpdate, flags); } +/* + * @implemented + */ +BOOL +STDCALL +AnyPopup(VOID) +{ + return NtUserAnyPopup(); +} + /* EOF */ diff --git a/reactos/subsys/win32k/include/window.h b/reactos/subsys/win32k/include/window.h index 94d2982efc1..65a2e06653b 100644 --- a/reactos/subsys/win32k/include/window.h +++ b/reactos/subsys/win32k/include/window.h @@ -210,6 +210,9 @@ IntGetWindowInfo(PWINDOW_OBJECT WindowObject, PWINDOWINFO pwi); VOID FASTCALL IntGetWindowBorderMeasures(PWINDOW_OBJECT WindowObject, INT *cx, INT *cy); +BOOL FASTCALL +IntAnyPopup(VOID); + DWORD IntRemoveWndProcHandle(WNDPROC Handle); DWORD IntRemoveProcessWndProcHandles(HANDLE ProcessID); DWORD IntAddWndProcHandle(WNDPROC WindowProc, BOOL IsUnicode); diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index 8209a506f4a..9bb70ae002f 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.67 2004/05/01 16:43:15 weiden Exp $ +/* $Id: misc.c,v 1.68 2004/05/01 18:06:59 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -132,7 +132,11 @@ NtUserCallNoParam(DWORD Routine) case NOPARAM_ROUTINE_GETMESSAGEEXTRAINFO: Result = (DWORD)MsqGetMessageExtraInfo(); break; - + + case NOPARAM_ROUTINE_ANYPOPUP: + Result = (DWORD)IntAnyPopup(); + break; + default: DPRINT1("Calling invalid routine number 0x%x in NtUserCallNoParam\n"); SetLastWin32Error(ERROR_INVALID_PARAMETER); diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 74eb319fed2..60656074bbd 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.221 2004/04/29 21:17:36 gvg Exp $ +/* $Id: window.c,v 1.222 2004/05/01 18:06:59 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1070,6 +1070,36 @@ IntUnlinkWindow(PWINDOW_OBJECT Wnd) IntUnLockRelatives(Wnd); } +BOOL FASTCALL +IntAnyPopup(VOID) +{ + PWINDOW_OBJECT Window, Child; + + if(!(Window = IntGetWindowObject(IntGetDesktopWindow()))) + { + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + return FALSE; + } + + IntLockRelatives(Window); + for(Child = Window->FirstChild; Child; Child = Child->NextSibling) + { + if(Child->Owner && Child->Style & WS_VISIBLE) + { + /* + * The desktop has a popup window if one of them has + * an owner window and is visible + */ + IntUnLockRelatives(Window); + IntReleaseWindowObject(Window); + return TRUE; + } + } + IntUnLockRelatives(Window); + IntReleaseWindowObject(Window); + return FALSE; +} + /* FUNCTIONS *****************************************************************/ /* From 6afc02946b7c2b3059174d5a83463afdb6680783 Mon Sep 17 00:00:00 2001 From: Mike Nordell Date: Sat, 1 May 2004 18:09:53 +0000 Subject: [PATCH 1006/1463] Display module names with the stack trace on unhandled exception (debug) svn path=/trunk/; revision=9271 --- reactos/lib/kernel32/process/create.c | 32 +++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/reactos/lib/kernel32/process/create.c b/reactos/lib/kernel32/process/create.c index b7c7215501d..05ebbd9d6b7 100644 --- a/reactos/lib/kernel32/process/create.c +++ b/reactos/lib/kernel32/process/create.c @@ -1,4 +1,4 @@ -/* $Id: create.c,v 1.81 2004/01/28 20:52:57 gvg Exp $ +/* $Id: create.c,v 1.82 2004/05/01 18:09:53 tamlin Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -311,6 +311,23 @@ BOOL STDCALL CreateProcessA return bRetVal; } + +/* + * 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; +} + static int _except_recursion_trap = 0; struct _CONTEXT; @@ -325,8 +342,14 @@ _except_handler( struct _CONTEXT *ContextRecord, void * DispatcherContext ) { - DPRINT1("Process terminated abnormally due to unhandled exception\n"); - DPRINT1("Address: %x\n", ExceptionRecord->ExceptionAddress); +#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_ { @@ -335,7 +358,8 @@ _except_handler( Frame = (PULONG)((CONTEXT *)ContextRecord)->Ebp; while ((PVOID)Frame[1] != NULL && (PULONG)Frame[1] != (PULONG)0xdeadbeef) { - DPRINT1("%x\n", (PVOID)Frame[1]); + _module_name_from_addr((const void*)Frame[1], szMod, sizeof(szMod)); + DPRINT1("%8x %s\n", (PVOID)Frame[1], szMod); Frame = (PULONG)Frame[0]; } } From 9c2e9ae15dfc3a2d40f13f29026d98ecb57a7707 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 1 May 2004 19:05:29 +0000 Subject: [PATCH 1007/1463] include welcome.exe on the bootcd svn path=/trunk/; revision=9272 --- reactos/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/Makefile b/reactos/Makefile index e08aa7fe1b7..98da587b825 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.219 2004/04/26 20:20:11 gdalsnes Exp $ +# $Id: Makefile,v 1.220 2004/05/01 19:05:29 weiden Exp $ # # Global makefile # @@ -183,6 +183,7 @@ bootcd_install_before: $(RLINE) bootdata/hivesys.inf $(BOOTCD_DIR)/reactos/hivesys.inf $(RLINE) bootdata/txtsetup.sif $(BOOTCD_DIR)/reactos/txtsetup.sif $(CP) bootdata/icon.ico $(BOOTCD_DIR)/icon.ico + $(CP) subsys/system/welcome/welcome.exe $(BOOTCD_DIR)/reactos/welcome.exe $(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 From db2d21de92fc78fdbfdcb2d1934490701ebb8eaa Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 1 May 2004 19:22:49 +0000 Subject: [PATCH 1008/1463] Fix Nt/ZwGetTickCount. svn path=/trunk/; revision=9273 --- reactos/iface/native/sysfuncs.lst | 2 +- reactos/include/ntos/zw.h | 8 ++++---- reactos/lib/ntdll/def/ntdll.def | 6 +++--- reactos/lib/ntdll/def/ntdll.edf | 6 +++--- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/reactos/iface/native/sysfuncs.lst b/reactos/iface/native/sysfuncs.lst index cde4c07bab8..cceb6c8a182 100644 --- a/reactos/iface/native/sysfuncs.lst +++ b/reactos/iface/native/sysfuncs.lst @@ -61,7 +61,7 @@ NtFreeVirtualMemory ZwFreeVirtualMemory 4 NtFsControlFile ZwFsControlFile 10 NtGetContextThread ZwGetContextThread 2 NtGetPlugPlayEvent ZwGetPlugPlayEvent 4 -NtGetTickCount ZwGetTickCount 1 +NtGetTickCount ZwGetTickCount 0 NtImpersonateClientOfPort ZwImpersonateClientOfPort 2 NtImpersonateThread ZwImpersonateThread 3 NtInitializeRegistry ZwInitializeRegistry 1 diff --git a/reactos/include/ntos/zw.h b/reactos/include/ntos/zw.h index e66eba54a0d..8549f481f39 100755 --- a/reactos/include/ntos/zw.h +++ b/reactos/include/ntos/zw.h @@ -1,5 +1,5 @@ -/* $Id: zw.h,v 1.23 2004/04/20 20:39:19 jimtabor Exp $ +/* $Id: zw.h,v 1.24 2004/05/01 19:22:49 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -5413,10 +5413,10 @@ ZwFlushVirtualMemory( * UpTime = Number of clock ticks since boot. * RETURNS: Status */ -NTSTATUS -STDCALL +ULONG +STDCALL ZwGetTickCount( - PULONG UpTime + VOID ); /* diff --git a/reactos/lib/ntdll/def/ntdll.def b/reactos/lib/ntdll/def/ntdll.def index aa7a4ccc3fc..4b3715dab8a 100644 --- a/reactos/lib/ntdll/def/ntdll.def +++ b/reactos/lib/ntdll/def/ntdll.def @@ -1,4 +1,4 @@ -; $Id: ntdll.def,v 1.118 2004/03/24 23:42:39 gdalsnes Exp $ +; $Id: ntdll.def,v 1.119 2004/05/01 19:21:44 ekohl Exp $ ; ; ReactOS Operating System ; @@ -126,7 +126,7 @@ NtFreeVirtualMemory@16 NtFsControlFile@40 NtGetContextThread@8 NtGetPlugPlayEvent@16 -NtGetTickCount@4 +NtGetTickCount@0 NtImpersonateClientOfPort@8 NtImpersonateThread@12 NtInitializeRegistry@4 @@ -710,7 +710,7 @@ ZwFreeVirtualMemory@16 ZwFsControlFile@40 ZwGetContextThread@8 ZwGetPlugPlayEvent@16 -ZwGetTickCount@4 +ZwGetTickCount@0 ZwImpersonateClientOfPort@8 ZwImpersonateThread@12 ZwInitializeRegistry@4 diff --git a/reactos/lib/ntdll/def/ntdll.edf b/reactos/lib/ntdll/def/ntdll.edf index 627e323b779..a97cacd4be9 100644 --- a/reactos/lib/ntdll/def/ntdll.edf +++ b/reactos/lib/ntdll/def/ntdll.edf @@ -1,4 +1,4 @@ -; $Id: ntdll.edf,v 1.108 2004/03/24 23:42:39 gdalsnes Exp $ +; $Id: ntdll.edf,v 1.109 2004/05/01 19:21:44 ekohl Exp $ ; ; ReactOS Operating System ; @@ -126,7 +126,7 @@ NtFreeVirtualMemory=NtFreeVirtualMemory@16 NtFsControlFile=NtFsControlFile@40 NtGetContextThread=NtGetContextThread@8 NtGetPlugPlayEvent=NtGetPlugPlayEvent@16 -NtGetTickCount=NtGetTickCount@4 +NtGetTickCount=NtGetTickCount@0 NtImpersonateClientOfPort=NtImpersonateClientOfPort@8 NtImpersonateThread=NtImpersonateThread@12 NtInitializeRegistry=NtInitializeRegistry@4 @@ -711,7 +711,7 @@ ZwFreeVirtualMemory=ZwFreeVirtualMemory@16 ZwFsControlFile=ZwFsControlFile@40 ZwGetContextThread=ZwGetContextThread@8 ZwGetPlugPlayEvent=ZwGetPlugPlayEvent@16 -ZwGetTickCount=ZwGetTickCount@4 +ZwGetTickCount=ZwGetTickCount@0 ZwImpersonateClientOfPort=ZwImpersonateClientOfPort@8 ZwImpersonateThread=ZwImpersonateThread@12 ZwInitializeRegistry=ZwInitializeRegistry@4 From f36cfa653a51801ec7b3b86d2fc598dd830fb675 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sat, 1 May 2004 21:22:18 +0000 Subject: [PATCH 1009/1463] Always reset AUTO_RESIZE flag on exit from REBAR_ForceResize svn path=/trunk/; revision=9274 --- reactos/lib/comctl32/rebar.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/comctl32/rebar.c b/reactos/lib/comctl32/rebar.c index 9072f0314a7..bd552e1eefd 100644 --- a/reactos/lib/comctl32/rebar.c +++ b/reactos/lib/comctl32/rebar.c @@ -1276,6 +1276,7 @@ REBAR_ForceResize (REBAR_INFO *infoPtr) x, y, width, height); SetWindowPos (infoPtr->hwndSelf, 0, x, y, width, height, SWP_NOZORDER); + infoPtr->fStatus &= ~AUTO_RESIZE; } @@ -4484,7 +4485,6 @@ REBAR_Size (REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam) infoPtr->fStatus |= BAND_NEEDS_LAYOUT; REBAR_Layout (infoPtr, &rcClient, TRUE, TRUE); - infoPtr->fStatus &= ~AUTO_RESIZE; return 0; } From f9df303240759848be852e7cf435c0a4a7c56a59 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sun, 2 May 2004 04:40:25 +0000 Subject: [PATCH 1010/1463] Proper way for counting process handles. svn path=/trunk/; revision=9275 --- reactos/ntoskrnl/ex/sysinfo.c | 4 ++-- reactos/ntoskrnl/include/internal/ob.h | 4 ++++ reactos/ntoskrnl/ob/handle.c | 33 +++++++++++++++++++++++++- reactos/ntoskrnl/ps/process.c | 4 ++-- 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/reactos/ntoskrnl/ex/sysinfo.c b/reactos/ntoskrnl/ex/sysinfo.c index 1fc525c0ad8..0b4ee629b1e 100644 --- a/reactos/ntoskrnl/ex/sysinfo.c +++ b/reactos/ntoskrnl/ex/sysinfo.c @@ -1,4 +1,4 @@ -/* $Id: sysinfo.c,v 1.32 2004/04/28 20:50:02 hbirr Exp $ +/* $Id: sysinfo.c,v 1.33 2004/05/02 04:40:24 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -552,7 +552,7 @@ QSI_DEF(SystemProcessInformation) SpiCur->BasePriority = pr->Pcb.BasePriority; SpiCur->ProcessId = pr->UniqueProcessId; SpiCur->InheritedFromProcessId = (DWORD)(pr->InheritedFromUniqueProcessId); - SpiCur->HandleCount = ObGetObjectHandleCount(pr); + SpiCur->HandleCount = ObpGetHandleCountbyHandleTable(&pr->HandleTable); SpiCur->VmCounters.PeakVirtualSize = pr->PeakVirtualSize; SpiCur->VmCounters.VirtualSize = pr->VirtualSize.QuadPart; SpiCur->VmCounters.PageFaultCount = pr->LastFaultCount; diff --git a/reactos/ntoskrnl/include/internal/ob.h b/reactos/ntoskrnl/include/internal/ob.h index 37205fed06c..fc061e3bd92 100644 --- a/reactos/ntoskrnl/include/internal/ob.h +++ b/reactos/ntoskrnl/include/internal/ob.h @@ -133,4 +133,8 @@ ObDuplicateObject(PEPROCESS SourceProcess, BOOLEAN InheritHandle, ULONG Options); +ULONG +ObpGetHandleCountbyHandleTable(PHANDLE_TABLE HandleTable); + + #endif /* __INCLUDE_INTERNAL_OBJMGR_H */ diff --git a/reactos/ntoskrnl/ob/handle.c b/reactos/ntoskrnl/ob/handle.c index 439eb3be83a..68f51ee56df 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.54 2003/10/21 21:46:02 ekohl Exp $ +/* $Id: handle.c,v 1.55 2004/05/02 04:40:25 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -949,4 +949,35 @@ ObInsertObject(IN PVOID Object, Handle)); } + +ULONG +ObpGetHandleCountbyHandleTable(PHANDLE_TABLE HandleTable) +{ +unsigned int i, Count=0; +PHANDLE_BLOCK blk; +POBJECT_HEADER Header; +PVOID ObjectBody; +PLIST_ENTRY current = HandleTable->ListHead.Flink; + + while (current != &HandleTable->ListHead) + { + 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; + } + return (Count); +} + /* EOF */ diff --git a/reactos/ntoskrnl/ps/process.c b/reactos/ntoskrnl/ps/process.c index cb242885b47..7cf0612b1c5 100644 --- a/reactos/ntoskrnl/ps/process.c +++ b/reactos/ntoskrnl/ps/process.c @@ -1,4 +1,4 @@ -/* $Id: process.c,v 1.130 2004/04/26 05:46:35 jimtabor Exp $ +/* $Id: process.c,v 1.131 2004/05/02 04:40:25 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1118,7 +1118,7 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle, else { PULONG HandleCount = (PULONG)ProcessInformation; - *HandleCount = ObGetObjectHandleCount(Process); + *HandleCount = ObpGetHandleCountbyHandleTable(&Process->HandleTable); if (ReturnLength) { *ReturnLength = sizeof(ULONG); From 223730ca41d32b705e812871e2944a37e20ba49a Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Sun, 2 May 2004 07:24:43 +0000 Subject: [PATCH 1011/1463] First rev where a full connect - receive - disconnect cycle worked, although data wasn't delivered to the client program. The TCP performed correctly in handling incoming data, connecting and acknowledging traffic. Pared down files to minimum needed. I'll be able to do more later with the directory structure, but this is quite workable. Now working on the rest of the interface to the upper layer. I'm trying to make this interface as generic as possible so that when IPv6 is added to reactos, there won't have to be too many changes. svn path=/trunk/; revision=9277 --- .../include/freebsd/dev/include/vm/vm.h | 42 + .../include/freebsd/dev/include/vm/vm_param.h | 27 + .../include/freebsd/net/include/arpa/inet.h | 53 + .../include/freebsd/net/include/imp.h | 1 + .../include/freebsd/src/sys/machine/ansi.h | 96 + .../include/freebsd/src/sys/machine/cpufunc.h | 460 ++++ .../include/freebsd/src/sys/machine/endian.h | 119 + .../include/freebsd/src/sys/machine/ipl.h | 41 + .../include/freebsd/src/sys/machine/limits.h | 96 + .../include/freebsd/src/sys/machine/param.h | 161 ++ .../include/freebsd/src/sys/machine/proc.h | 49 + .../include/freebsd/src/sys/machine/signal.h | 80 + .../include/freebsd/src/sys/machine/spl.h | 221 ++ .../include/freebsd/src/sys/machine/stdarg.h | 63 + .../include/freebsd/src/sys/machine/trap.h | 95 + .../include/freebsd/src/sys/machine/types.h | 65 + .../include/freebsd/src/sys/machine/vmparam.h | 136 ++ .../oskittcp/include/freebsd/src/sys/net/if.h | 394 +++ .../include/freebsd/src/sys/net/if_arp.h | 92 + .../include/freebsd/src/sys/net/netisr.h | 86 + .../include/freebsd/src/sys/net/radix.h | 170 ++ .../include/freebsd/src/sys/net/raw_cb.h | 74 + .../include/freebsd/src/sys/net/route.h | 258 ++ .../freebsd/src/sys/netinet/if_ether.h | 237 ++ .../freebsd/src/sys/netinet/igmp_var.h | 91 + .../include/freebsd/src/sys/netinet/in.h | 262 ++ .../include/freebsd/src/sys/netinet/in_pcb.h | 107 + .../freebsd/src/sys/netinet/in_systm.h | 61 + .../include/freebsd/src/sys/netinet/in_var.h | 233 ++ .../include/freebsd/src/sys/netinet/ip.h | 174 ++ .../include/freebsd/src/sys/netinet/ip_fw.h | 145 ++ .../include/freebsd/src/sys/netinet/ip_icmp.h | 184 ++ .../include/freebsd/src/sys/netinet/ip_var.h | 210 ++ .../include/freebsd/src/sys/netinet/tcp.h | 121 + .../freebsd/src/sys/netinet/tcp_debug.h | 64 + .../include/freebsd/src/sys/netinet/tcp_fsm.h | 91 + .../include/freebsd/src/sys/netinet/tcp_seq.h | 86 + .../freebsd/src/sys/netinet/tcp_timer.h | 136 ++ .../include/freebsd/src/sys/netinet/tcp_var.h | 387 +++ .../include/freebsd/src/sys/netinet/tcpip.h | 74 + .../include/freebsd/src/sys/netinet/udp.h | 50 + .../include/freebsd/src/sys/netinet/udp_var.h | 105 + .../include/freebsd/src/sys/sys/buf.h | 254 ++ .../include/freebsd/src/sys/sys/callout.h | 56 + .../include/freebsd/src/sys/sys/cdefs.h | 147 ++ .../include/freebsd/src/sys/sys/domain.h | 73 + .../include/freebsd/src/sys/sys/errno.h | 168 ++ .../include/freebsd/src/sys/sys/fcntl.h | 190 ++ .../include/freebsd/src/sys/sys/file.h | 83 + .../include/freebsd/src/sys/sys/filedesc.h | 108 + .../include/freebsd/src/sys/sys/filio.h | 57 + .../include/freebsd/src/sys/sys/ioccom.h | 68 + .../include/freebsd/src/sys/sys/ioctl.h | 84 + .../include/freebsd/src/sys/sys/kernel.h | 116 + .../include/freebsd/src/sys/sys/libkern.h | 64 + .../include/freebsd/src/sys/sys/malloc.h | 333 +++ .../include/freebsd/src/sys/sys/mbuf.h | 512 ++++ .../include/freebsd/src/sys/sys/param.h | 224 ++ .../include/freebsd/src/sys/sys/proc.h | 336 +++ .../include/freebsd/src/sys/sys/protosw.h | 221 ++ .../include/freebsd/src/sys/sys/queue.h | 391 +++ .../include/freebsd/src/sys/sys/resource.h | 127 + .../include/freebsd/src/sys/sys/resourcevar.h | 97 + .../include/freebsd/src/sys/sys/rtprio.h | 69 + .../include/freebsd/src/sys/sys/select.h | 63 + .../include/freebsd/src/sys/sys/signal.h | 194 ++ .../include/freebsd/src/sys/sys/signalvar.h | 170 ++ .../include/freebsd/src/sys/sys/socket.h | 357 +++ .../include/freebsd/src/sys/sys/socketvar.h | 264 ++ .../include/freebsd/src/sys/sys/sockio.h | 88 + .../include/freebsd/src/sys/sys/stat.h | 203 ++ .../include/freebsd/src/sys/sys/sysctl.h | 412 ++++ .../include/freebsd/src/sys/sys/syslimits.h | 65 + .../include/freebsd/src/sys/sys/syslog.h | 202 ++ .../include/freebsd/src/sys/sys/systm.h | 245 ++ .../include/freebsd/src/sys/sys/time.h | 135 ++ .../include/freebsd/src/sys/sys/ttycom.h | 139 ++ .../include/freebsd/src/sys/sys/types.h | 167 ++ .../include/freebsd/src/sys/sys/ucred.h | 63 + .../include/freebsd/src/sys/sys/uio.h | 91 + .../include/freebsd/src/sys/sys/unistd.h | 121 + reactos/lib/oskittcp/include/memtrack.h | 73 + reactos/lib/oskittcp/include/oskitdebug.h | 94 + reactos/lib/oskittcp/include/oskiterrno.h | 170 ++ reactos/lib/oskittcp/include/oskitfreebsd.h | 14 + reactos/lib/oskittcp/include/oskittcp.h | 106 + reactos/lib/oskittcp/include/oskittypes.h | 60 + reactos/lib/oskittcp/makefile | 83 + reactos/lib/oskittcp/oskittcp/defaults.c | 215 ++ reactos/lib/oskittcp/oskittcp/in.c | 181 ++ reactos/lib/oskittcp/oskittcp/in_cksum.c | 150 ++ reactos/lib/oskittcp/oskittcp/in_pcb.c | 521 ++++ reactos/lib/oskittcp/oskittcp/in_proto.c | 150 ++ reactos/lib/oskittcp/oskittcp/in_rmx.c | 91 + reactos/lib/oskittcp/oskittcp/inet_ntoa.c | 51 + reactos/lib/oskittcp/oskittcp/interface.c | 292 +++ reactos/lib/oskittcp/oskittcp/ip_input.c | 190 ++ reactos/lib/oskittcp/oskittcp/ip_output.c | 300 +++ reactos/lib/oskittcp/oskittcp/kern_clock.c | 361 +++ reactos/lib/oskittcp/oskittcp/kern_subr.c | 252 ++ reactos/lib/oskittcp/oskittcp/malloc.c | 16 + reactos/lib/oskittcp/oskittcp/param.c | 24 + reactos/lib/oskittcp/oskittcp/radix.c | 1006 ++++++++ reactos/lib/oskittcp/oskittcp/random.c | 63 + reactos/lib/oskittcp/oskittcp/route.c | 807 ++++++ reactos/lib/oskittcp/oskittcp/rtsock.c | 79 + reactos/lib/oskittcp/oskittcp/scanc.c | 52 + reactos/lib/oskittcp/oskittcp/sleep.c | 209 ++ reactos/lib/oskittcp/oskittcp/tcp_debug.c | 163 ++ reactos/lib/oskittcp/oskittcp/tcp_input.c | 2160 +++++++++++++++++ reactos/lib/oskittcp/oskittcp/tcp_output.c | 823 +++++++ reactos/lib/oskittcp/oskittcp/tcp_subr.c | 610 +++++ reactos/lib/oskittcp/oskittcp/tcp_timer.c | 358 +++ reactos/lib/oskittcp/oskittcp/tcp_usrreq.c | 773 ++++++ reactos/lib/oskittcp/oskittcp/uipc_domain.c | 231 ++ reactos/lib/oskittcp/oskittcp/uipc_mbuf.c | 769 ++++++ reactos/lib/oskittcp/oskittcp/uipc_socket.c | 1061 ++++++++ reactos/lib/oskittcp/oskittcp/uipc_socket2.c | 812 +++++++ 118 files changed, 25824 insertions(+) create mode 100644 reactos/lib/oskittcp/include/freebsd/dev/include/vm/vm.h create mode 100644 reactos/lib/oskittcp/include/freebsd/dev/include/vm/vm_param.h create mode 100644 reactos/lib/oskittcp/include/freebsd/net/include/arpa/inet.h create mode 100644 reactos/lib/oskittcp/include/freebsd/net/include/imp.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/machine/ansi.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/machine/cpufunc.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/machine/endian.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/machine/ipl.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/machine/limits.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/machine/param.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/machine/proc.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/machine/signal.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/machine/spl.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/machine/stdarg.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/machine/trap.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/machine/types.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/machine/vmparam.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/net/if.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/net/if_arp.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/net/netisr.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/net/radix.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/net/raw_cb.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/net/route.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/if_ether.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/igmp_var.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in_pcb.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in_systm.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in_var.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip_fw.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip_icmp.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip_var.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_debug.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_fsm.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_seq.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_timer.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_var.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcpip.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/udp.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/udp_var.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/buf.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/callout.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/cdefs.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/domain.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/errno.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/fcntl.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/file.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/filedesc.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/filio.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/ioccom.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/ioctl.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/kernel.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/libkern.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/malloc.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/mbuf.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/param.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/proc.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/protosw.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/queue.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/resource.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/resourcevar.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/rtprio.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/select.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/signal.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/signalvar.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/socket.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/socketvar.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/sockio.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/stat.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/sysctl.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/syslimits.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/syslog.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/systm.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/time.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/ttycom.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/types.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/ucred.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/uio.h create mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/unistd.h create mode 100644 reactos/lib/oskittcp/include/memtrack.h create mode 100644 reactos/lib/oskittcp/include/oskitdebug.h create mode 100644 reactos/lib/oskittcp/include/oskiterrno.h create mode 100644 reactos/lib/oskittcp/include/oskitfreebsd.h create mode 100644 reactos/lib/oskittcp/include/oskittcp.h create mode 100644 reactos/lib/oskittcp/include/oskittypes.h create mode 100644 reactos/lib/oskittcp/makefile create mode 100644 reactos/lib/oskittcp/oskittcp/defaults.c create mode 100644 reactos/lib/oskittcp/oskittcp/in.c create mode 100644 reactos/lib/oskittcp/oskittcp/in_cksum.c create mode 100644 reactos/lib/oskittcp/oskittcp/in_pcb.c create mode 100644 reactos/lib/oskittcp/oskittcp/in_proto.c create mode 100644 reactos/lib/oskittcp/oskittcp/in_rmx.c create mode 100644 reactos/lib/oskittcp/oskittcp/inet_ntoa.c create mode 100644 reactos/lib/oskittcp/oskittcp/interface.c create mode 100644 reactos/lib/oskittcp/oskittcp/ip_input.c create mode 100644 reactos/lib/oskittcp/oskittcp/ip_output.c create mode 100644 reactos/lib/oskittcp/oskittcp/kern_clock.c create mode 100644 reactos/lib/oskittcp/oskittcp/kern_subr.c create mode 100644 reactos/lib/oskittcp/oskittcp/malloc.c create mode 100644 reactos/lib/oskittcp/oskittcp/param.c create mode 100644 reactos/lib/oskittcp/oskittcp/radix.c create mode 100644 reactos/lib/oskittcp/oskittcp/random.c create mode 100644 reactos/lib/oskittcp/oskittcp/route.c create mode 100644 reactos/lib/oskittcp/oskittcp/rtsock.c create mode 100644 reactos/lib/oskittcp/oskittcp/scanc.c create mode 100644 reactos/lib/oskittcp/oskittcp/sleep.c create mode 100644 reactos/lib/oskittcp/oskittcp/tcp_debug.c create mode 100644 reactos/lib/oskittcp/oskittcp/tcp_input.c create mode 100644 reactos/lib/oskittcp/oskittcp/tcp_output.c create mode 100644 reactos/lib/oskittcp/oskittcp/tcp_subr.c create mode 100644 reactos/lib/oskittcp/oskittcp/tcp_timer.c create mode 100644 reactos/lib/oskittcp/oskittcp/tcp_usrreq.c create mode 100644 reactos/lib/oskittcp/oskittcp/uipc_domain.c create mode 100644 reactos/lib/oskittcp/oskittcp/uipc_mbuf.c create mode 100644 reactos/lib/oskittcp/oskittcp/uipc_socket.c create mode 100644 reactos/lib/oskittcp/oskittcp/uipc_socket2.c diff --git a/reactos/lib/oskittcp/include/freebsd/dev/include/vm/vm.h b/reactos/lib/oskittcp/include/freebsd/dev/include/vm/vm.h new file mode 100644 index 00000000000..d3b2f6d469d --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/dev/include/vm/vm.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 1997-1998 University of Utah and the Flux Group. + * All rights reserved. + * + * This file is part of the Flux OSKit. The OSKit is free software, also known + * as "open source;" you can redistribute it and/or modify it under the terms + * of the GNU General Public License (GPL), version 2, as published by the Free + * Software Foundation (FSF). To explore alternate licensing terms, contact + * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. + * + * The OSKit 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 GPL for more details. You should have + * received a copy of the GPL along with the OSKit; see the file COPYING. If + * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. + */ +/* + * here's vm.h's primary purpose in life: + * + * define `vm_map_t' for the first arg to kmem_alloc() + */ +#ifndef _FAKE_VM_H +#define _FAKE_VM_H + +typedef void *vm_map_t; + +#include + +/* + * XXX This is used by syscons to compute the address of the video buffer. + * This definition means the driver will only work when kva == pa. + * The real solution would be to modify the driver to map the buffer explicitly. + */ +#define vtophys(va) va + +/* + * ip_icmp.c and possibly other files rely on vm/vm.h to get sys/proc ... + */ +#include +#include + +#endif /* _FAKE_VM_H */ diff --git a/reactos/lib/oskittcp/include/freebsd/dev/include/vm/vm_param.h b/reactos/lib/oskittcp/include/freebsd/dev/include/vm/vm_param.h new file mode 100644 index 00000000000..4d48e0391d6 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/dev/include/vm/vm_param.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 1997-1998 University of Utah and the Flux Group. + * All rights reserved. + * + * This file is part of the Flux OSKit. The OSKit is free software, also known + * as "open source;" you can redistribute it and/or modify it under the terms + * of the GNU General Public License (GPL), version 2, as published by the Free + * Software Foundation (FSF). To explore alternate licensing terms, contact + * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. + * + * The OSKit 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 GPL for more details. You should have + * received a copy of the GPL along with the OSKit; see the file COPYING. If + * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. + */ +#ifndef _VM_PARAM_ +#define _VM_PARAM_ + +#include + +typedef int boolean_t; + +#define TRUE 1 +#define FALSE 0 + +#endif /* _VM_PARAM_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/net/include/arpa/inet.h b/reactos/lib/oskittcp/include/freebsd/net/include/arpa/inet.h new file mode 100644 index 00000000000..014277cb4c1 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/net/include/arpa/inet.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)inet.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _ARPA_INET_H_ +#define _ARPA_INET_H_ + +/* External definitions for functions in inet(3) */ + +#include + +__BEGIN_DECLS +unsigned long inet_addr __P((const char *)); +int inet_aton __P((const char *, struct in_addr *)); +unsigned long inet_lnaof __P((struct in_addr)); +struct in_addr inet_makeaddr __P((u_long , u_long)); +unsigned long inet_netof __P((struct in_addr)); +unsigned long inet_network __P((const char *)); +char *inet_ntoa __P((struct in_addr)); +__END_DECLS + +#endif /* !_INET_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/net/include/imp.h b/reactos/lib/oskittcp/include/freebsd/net/include/imp.h new file mode 100644 index 00000000000..ef8ea49c607 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/net/include/imp.h @@ -0,0 +1 @@ +#define NIMP 0 diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/ansi.h b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/ansi.h new file mode 100644 index 00000000000..7d84a8237ef --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/ansi.h @@ -0,0 +1,96 @@ +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ansi.h 8.2 (Berkeley) 1/4/94 + */ + +#ifndef _MACHINE_ANSI_H_ +#define _MACHINE_ANSI_H_ + +/* + * Types which are fundamental to the implementation and must be declared + * in more than one standard header are defined here. Standard headers + * then use: + * #ifdef _BSD_SIZE_T_ + * typedef _BSD_SIZE_T_ size_t; + * #undef _BSD_SIZE_T_ + * #endif + */ +#define _BSD_CLOCK_T_ unsigned long /* clock() */ +#define _BSD_PTRDIFF_T_ int /* ptr1 - ptr2 */ +#ifndef _BSD_SIZE_T_ +#define _BSD_SIZE_T_ unsigned int /* sizeof() */ +#endif +#define _BSD_SSIZE_T_ int /* byte count or error */ +#define _BSD_TIME_T_ long /* time() */ + +/* + * Types which are fundamental to the implementation and must be used + * in more than one standard header although they are only declared in + * one (perhaps nonstandard) header are defined here. Standard headers + * use _BSD_XXX_T_ without undef'ing it. + */ +#define _BSD_OFF_T_ long long /* file offset */ +#define _BSD_PID_T_ long /* process [group] */ +#define _BSD_VA_LIST_ char * /* va_list */ + +/* + * Runes (wchar_t) is declared to be an ``int'' instead of the more natural + * ``unsigned long'' or ``long''. Two things are happening here. It is not + * unsigned so that EOF (-1) can be naturally assigned to it and used. Also, + * it looks like 10646 will be a 31 bit standard. This means that if your + * ints cannot hold 32 bits, you will be in trouble. The reason an int was + * chosen over a long is that the is*() and to*() routines take ints (says + * ANSI C), but they use _RUNE_T_ instead of int. By changing it here, you + * lose a bit of ANSI conformance, but your programs will still work. + * + * Note that _WCHAR_T_ and _RUNE_T_ must be of the same type. When wchar_t + * and rune_t are typedef'd, _WCHAR_T_ will be undef'd, but _RUNE_T remains + * defined for ctype.h. + */ +#define _BSD_WCHAR_T_ int /* wchar_t */ +#define _BSD_RUNE_T_ int /* rune_t */ + +/* + * Frequencies of the clock ticks reported by clock() and times(). They + * are the same as stathz for bogus historical reasons. They should be + * 1e6 because clock() and times() are implemented using getrusage() and + * there is no good reason why they should be less accurate. There is + * the bad reason that (broken) programs might not like clock_t or + * CLOCKS_PER_SEC being ``double'' (``unsigned long'' is not large enough + * to hold the required 24 hours worth of ticks if the frequency is + * 1000000ul, and ``unsigned long long'' would be nonstandard). + */ +#define _BSD_CLK_TCK_ 128 +#define _BSD_CLOCKS_PER_SEC_ 128 + +#endif /* !_MACHINE_ANSI_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/cpufunc.h b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/cpufunc.h new file mode 100644 index 00000000000..8ccb08fff28 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/cpufunc.h @@ -0,0 +1,460 @@ +/*- + * Copyright (c) 1993 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +/* + * Functions to provide access to special i386 instructions. + */ + +#ifndef _MACHINE_CPUFUNC_H_ +#define _MACHINE_CPUFUNC_H_ + +#include +#include + +#include /* XXX belongs elsewhere */ + +#ifdef __GNUC__ + +#ifdef BDE_DEBUGGER +extern int bdb_exists; + +static __inline int +bdb(void) +{ + if (!bdb_exists) + return (0); + __asm __volatile("int $3"); + return (1); +} +#endif /* BDE_DEBUGGER */ + +static __inline void +disable_intr(void) +{ +#ifdef OSKIT + osenv_intr_disable(); +#else + __asm __volatile("cli" : : : "memory"); +#endif +} + +static __inline void +enable_intr(void) +{ +#ifdef OSKIT + osenv_intr_enable(); +#else + __asm __volatile("sti"); +#endif +} + +#define HAVE_INLINE_FFS + +static __inline int +ffs(int mask) +{ + int result; + /* + * bsfl turns out to be not all that slow on 486's. It can beaten + * using a binary search to reduce to 4 bits and then a table lookup, + * but only if the code is inlined and in the cache, and the code + * is quite large so inlining it probably busts the cache. + * + * Note that gcc-2's builtin ffs would be used if we didn't declare + * this inline or turn off the builtin. The builtin is faster but + * broken in gcc-2.4.5 and slower but working in gcc-2.5 and 2.6. + */ + __asm __volatile("testl %0,%0; je 1f; bsfl %0,%0; incl %0; 1:" + : "=r" (result) : "0" (mask)); + return (result); +} + +#if __GNUC__ < 2 + +#define inb(port) inbv(port) +#define outb(port, data) outbv(port, data) + +#else /* __GNUC >= 2 */ + +/* + * The following complications are to get around gcc not having a + * constraint letter for the range 0..255. We still put "d" in the + * constraint because "i" isn't a valid constraint when the port + * isn't constant. This only matters for -O0 because otherwise + * the non-working version gets optimized away. + * + * Use an expression-statement instead of a conditional expression + * because gcc-2.6.0 would promote the operands of the conditional + * and produce poor code for "if ((inb(var) & const1) == const2)". + */ +#define inb(port) ({ \ + u_char _data; \ + if (__builtin_constant_p((int) (port)) && (port) < 256ul) \ + _data = inbc(port); \ + else \ + _data = inbv(port); \ + _data; }) + +#define outb(port, data) \ + (__builtin_constant_p((int) (port)) && (port) < 256ul \ + ? outbc(port, data) : outbv(port, data)) + +static __inline u_char +inbc(u_int port) +{ + u_char data; + + __asm __volatile("inb %1,%0" : "=a" (data) : "id" ((u_short)(port))); + return (data); +} + +static __inline void +outbc(u_int port, u_char data) +{ + __asm __volatile("outb %0,%1" : : "a" (data), "id" ((u_short)(port))); +} + +#endif /* __GNUC <= 2 */ + +static __inline u_char +inbv(u_int port) +{ + u_char data; + /* + * We use %%dx and not %1 here because i/o is done at %dx and not at + * %edx, while gcc generates inferior code (movw instead of movl) + * if we tell it to load (u_short) port. + */ + __asm __volatile("inb %%dx,%0" : "=a" (data) : "d" (port)); + return (data); +} + +static __inline u_long +inl(u_int port) +{ + u_long data; + + __asm __volatile("inl %%dx,%0" : "=a" (data) : "d" (port)); + return (data); +} + +static __inline void +insb(u_int port, void *addr, size_t cnt) +{ + __asm __volatile("cld; rep; insb" + : : "d" (port), "D" (addr), "c" (cnt) + : "di", "cx", "memory"); +} + +static __inline void +insw(u_int port, void *addr, size_t cnt) +{ + __asm __volatile("cld; rep; insw" + : : "d" (port), "D" (addr), "c" (cnt) + : "di", "cx", "memory"); +} + +static __inline void +insl(u_int port, void *addr, size_t cnt) +{ + __asm __volatile("cld; rep; insl" + : : "d" (port), "D" (addr), "c" (cnt) + : "di", "cx", "memory"); +} + +static __inline u_short +inw(u_int port) +{ + u_short data; + + __asm __volatile("inw %%dx,%0" : "=a" (data) : "d" (port)); + return (data); +} + +static __inline unsigned +loadandclear(u_int *addr) +{ + u_int result; + + __asm __volatile("xorl %0,%0; xchgl %1,%0" + : "=&r" (result) : "m" (*addr)); + return (result); +} + +static __inline void +outbv(u_int port, u_char data) +{ + u_char al; + /* + * Use an unnecessary assignment to help gcc's register allocator. + * This make a large difference for gcc-1.40 and a tiny difference + * for gcc-2.6.0. For gcc-1.40, al had to be ``asm("ax")'' for + * best results. gcc-2.6.0 can't handle this. + */ + al = data; + __asm __volatile("outb %0,%%dx" : : "a" (al), "d" (port)); +} + +static __inline void +outl(u_int port, u_long data) +{ + /* + * outl() and outw() aren't used much so we haven't looked at + * possible micro-optimizations such as the unnecessary + * assignment for them. + */ + __asm __volatile("outl %0,%%dx" : : "a" (data), "d" (port)); +} + +static __inline void +outsb(u_int port, void *addr, size_t cnt) +{ + __asm __volatile("cld; rep; outsb" + : : "d" (port), "S" (addr), "c" (cnt) + : "si", "cx"); +} + +static __inline void +outsw(u_int port, void *addr, size_t cnt) +{ + __asm __volatile("cld; rep; outsw" + : : "d" (port), "S" (addr), "c" (cnt) + : "si", "cx"); +} + +static __inline void +outsl(u_int port, void *addr, size_t cnt) +{ + __asm __volatile("cld; rep; outsl" + : : "d" (port), "S" (addr), "c" (cnt) + : "si", "cx"); +} + +static __inline void +outw(u_int port, u_short data) +{ + __asm __volatile("outw %0,%%dx" : : "a" (data), "d" (port)); +} + +static __inline void +pmap_update(void) +{ + u_long temp; + /* + * This should be implemented as load_cr3(rcr3()) when load_cr3() + * is inlined. + */ + __asm __volatile("movl %%cr3, %0; movl %0, %%cr3" : "=r" (temp) + : : "memory"); +} + +static __inline u_long +rcr2(void) +{ + u_long data; + + __asm __volatile("movl %%cr2,%0" : "=r" (data)); + return (data); +} + +static __inline u_long +read_eflags(void) +{ + u_long ef; + + __asm __volatile("pushfl; popl %0" : "=r" (ef)); + return (ef); +} + +static __inline void +write_eflags(u_long ef) +{ + __asm __volatile("pushl %0; popfl" : : "r" (ef)); +} + +/* + * XXX queue stuff belongs elsewhere. + */ +struct quehead { + struct quehead *qh_link; + struct quehead *qh_rlink; +}; + +static __inline void +insque(void *a, void *b) +{ + struct quehead *element = (struct quehead *)a, + *head = (struct quehead *)b; + + element->qh_link = head->qh_link; + element->qh_rlink = head; + head->qh_link = element; + element->qh_link->qh_rlink = element; +} + +static __inline void +remque(void *a) +{ + struct quehead *element = (struct quehead *)a; + + element->qh_link->qh_rlink = element->qh_rlink; + element->qh_rlink->qh_link = element->qh_link; + element->qh_rlink = 0; +} + +#else /* !__GNUC__ */ + +int bdb __P((void)); +void disable_intr __P((void)); +void enable_intr __P((void)); +u_char inb __P((u_int port)); +u_long inl __P((u_int port)); +void insb __P((u_int port, void *addr, size_t cnt)); +void insl __P((u_int port, void *addr, size_t cnt)); +void insw __P((u_int port, void *addr, size_t cnt)); +u_short inw __P((u_int port)); +u_int loadandclear __P((u_int *addr)); +void outb __P((u_int port, u_char data)); +void outl __P((u_int port, u_long data)); +void outsb __P((u_int port, void *addr, size_t cnt)); +void outsl __P((u_int port, void *addr, size_t cnt)); +void outsw __P((u_int port, void *addr, size_t cnt)); +void outw __P((u_int port, u_short data)); +void pmap_update __P((void)); +u_long read_eflags __P((void)); +u_long rcr2 __P((void)); +void write_eflags __P((u_long ef)); + +void insque __P((void *a, void *b)); +void remque __P((void *a)); + +#endif /* __GNUC__ */ + +/* + * XXX the following declarations document garbage in support.s. + * gcc hasn't needed _divsi* for years. + * bcopy[bwx]() was used by pccons but isn't used now. + */ +int __divsi3 __P((int factor1, int factor2)); +u_int __udivsi3 __P((u_int factor1, u_int factor2)); +void bcopyb __P((const void *from, void *to, size_t len)); +void bcopyw __P((const void *from, void *to, size_t len)); +void bcopyx __P((const void *from, void *to, size_t len, + int stride)); + +#if 0 +/* + * These functions in support.s are declared elsewhere. + */ +void bcopy __P((const void *from, void *to, size_t len)); +void blkclr __P((void *buf, size_t len)); +void bzero __P((void *buf, size_t len)); +int copyin __P((void *udaddr, void *kaddr, size_t len)); +int copyinstr __P((void *udaddr, void *kaddr, size_t len, + size_t *lencopied)); +int copyout __P((void *kaddr, void *udaddr, size_t len)); +int copystr __P((void *kfaddr, void *kdaddr, size_t len, + size_t *lencopied)); +int fubyte __P((void *base)); +int fuswintr __P((void *base)); +int fuibyte __P((void *base)); +int fuword __P((void *base)); +struct region_descriptor; +void lgdt __P((struct region_descriptor *rdp)); +void lidt __P((struct region_descriptor *rdp)); +void lldt __P((u_short sel)); +/* + * longjmp() and setjmp() are only used by ddb. They probably shouldn't + * shouldn't be supported in the kernel. + */ +#include +void longjmp __P((jmp_buf jb, int rv)); +void ovbcopy __P((const void *from, void *to, size_t len); +int setjmp __P((jmp_buf jb)); +struct soft_segment_descriptor; +union descriptor; +int ssdtosd __P((struct soft_segment_descriptor *ssdp, + union descriptor *sdp)); +int subyte __P((void *base, int byte)); +int suibyte __P((void *base, int byte)); +int suswintr __P((void *base, int word)); +int suword __P((void *base, int word)); + +/* + * These functions in support.s are declared elsewhere, but never used. + * A silly amount of effort went into copyoutstr(). It's not worth + * maintaining, since the string length is usually known so copyout + * works better, or is easy to find so copyout() can be used. + */ +int copyoutstr __P((void *kaddr, void *udaddr, size_t len, + size_t *lencopied)); +int fuiword __P((void *base)); +int suiword __P((void *base, int word)); + +/* + * These functions in support.s are also in libkern.a and are declared in + * libkern.h. + * ffs() is built in to gcc-2 and was buggy in gcc-2.4.5 so we may may the + * buggy version if we don't replace it by an inline. + */ +int bcmp __P((const void *b1, const void *b2, size_t length)); +int ffs __P((int mask)); +#endif /* 0 */ + +/* + * These variables and functions in support.s are used. + */ +extern u_int atdevbase; /* offset in virtual memory of ISA io mem */ + +void filli __P((int pat, void *base, size_t cnt)); +void fillw __P((int /*u_short*/ pat, void *base, size_t cnt)); +int fusword __P((void *base)); +void load_cr0 __P((u_long cr0)); +void load_cr3 __P((u_long cr3)); +void ltr __P((u_short sel)); +u_int rcr0 __P((void)); +u_long rcr3 __P((void)); +int rtcin __P((int val)); + +/* + * These functions are NOT in support.s and should be declared elsewhere. + */ +void Debugger __P((const char *msg)); +u_long kvtop __P((void *addr)); +typedef void alias_for_inthand_t __P((u_int cs, u_int ef, u_int esp, + u_int ss)); +void setidt __P((int idx, alias_for_inthand_t *func, int typ, + int dpl, int selec)); + +#endif /* !_MACHINE_CPUFUNC_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/endian.h b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/endian.h new file mode 100644 index 00000000000..c804477311e --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/endian.h @@ -0,0 +1,119 @@ +/* + * Copyright (c) 1987, 1991 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: @(#)endian.h 7.8 (Berkeley) 4/3/91 + */ + +#ifndef _MACHINE_ENDIAN_H_ +#define _MACHINE_ENDIAN_H_ 1 + +/* + * Define the order of 32-bit words in 64-bit words. + */ +#define _QUAD_HIGHWORD 1 +#define _QUAD_LOWWORD 0 + +/* + * Definitions for byte order, according to byte significance from low + * address to high. + */ +#define LITTLE_ENDIAN 1234 /* LSB first: i386, vax */ +#define BIG_ENDIAN 4321 /* MSB first: 68000, ibm, net */ +#define PDP_ENDIAN 3412 /* LSB first in word, MSW first in long */ + +#define BYTE_ORDER LITTLE_ENDIAN + +#ifndef KERNEL +#include +#endif + +#define __word_swap_long(x) \ +({ register u_long __X = (x); \ + __asm ("rorl $16, %1" \ + : "=r" (__X) \ + : "0" (__X)); \ + __X; }) +#if __GNUC__ >= 2 +#define __byte_swap_long(x) \ +__extension__ ({ register u_long __X = (x); \ + __asm ("xchgb %h1, %b1\n\trorl $16, %1\n\txchgb %h1, %b1" \ + : "=q" (__X) \ + : "0" (__X)); \ + __X; }) +#define __byte_swap_word(x) \ +__extension__ ({ register u_short __X = (x); \ + __asm ("xchgb %h1, %b1" \ + : "=q" (__X) \ + : "0" (__X)); \ + __X; }) +#else /* __GNUC__ >= 2 */ +#define __byte_swap_long(x) \ +({ register u_long __X = (x); \ + __asm ("rorw $8, %w1\n\trorl $16, %1\n\trorw $8, %w1" \ + : "=r" (__X) \ + : "0" (__X)); \ + __X; }) +#define __byte_swap_word(x) \ +({ register u_short __X = (x); \ + __asm ("rorw $8, %w1" \ + : "=r" (__X) \ + : "0" (__X)); \ + __X; }) +#endif /* __GNUC__ >= 2 */ + +/* + * Macros for network/external number representation conversion. + */ +#if BYTE_ORDER == BIG_ENDIAN && !defined(lint) +#define ntohl(x) (x) +#define ntohs(x) (x) +#define htonl(x) (x) +#define htons(x) (x) + +#define NTOHL(x) (x) +#define NTOHS(x) (x) +#define HTONL(x) (x) +#define HTONS(x) (x) + +#else + +#define ntohl __byte_swap_long +#define ntohs __byte_swap_word +#define htonl __byte_swap_long +#define htons __byte_swap_word + +#define NTOHL(x) (x) = ntohl((u_long)x) +#define NTOHS(x) (x) = ntohs((u_short)x) +#define HTONL(x) (x) = htonl((u_long)x) +#define HTONS(x) (x) = htons((u_short)x) +#endif +#endif /* _MACHINE_ENDIAN_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/ipl.h b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/ipl.h new file mode 100644 index 00000000000..f006d9551b6 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/ipl.h @@ -0,0 +1,41 @@ +/*- + * Copyright (c) 1993 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +#ifndef _ISA_IPL_H_ +#define _ISA_IPL_H_ + +#define NHWI 16 /* number of h/w interrupts */ +#define HWI_MASK 0xffff /* bits corresponding to h/w interrupts */ + +#endif /* _ISA_IPL_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/limits.h b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/limits.h new file mode 100644 index 00000000000..f90ed760fcc --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/limits.h @@ -0,0 +1,96 @@ +/* + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)limits.h 8.3 (Berkeley) 1/4/94 + */ + +#ifndef _MACHINE_LIMITS_H_ +#define _MACHINE_LIMITS_H_ + +#define CHAR_BIT 8 /* number of bits in a char */ +#ifndef __REACTOS__ +#define MB_LEN_MAX 6 /* Allow 31 bit UTF2 */ +#endif + +/* + * According to ANSI (section 2.2.4.2), the values below must be usable by + * #if preprocessing directives. Additionally, the expression must have the + * same type as would an expression that is an object of the corresponding + * type converted according to the integral promotions. The subtraction for + * INT_MIN and LONG_MIN is so the value is not unsigned; 2147483648 is an + * unsigned int for 32-bit two's complement ANSI compilers (section 3.1.3.2). + * These numbers work for pcc as well. The UINT_MAX and ULONG_MAX values + * are written as hex so that GCC will be quiet about large integer constants. + */ +#define SCHAR_MAX 127 /* min value for a signed char */ +#define SCHAR_MIN (-128) /* max value for a signed char */ + +#define UCHAR_MAX 255 /* max value for an unsigned char */ +#ifndef __REACTOS__ +#define CHAR_MAX 127 /* max value for a char */ +#define CHAR_MIN (-128) /* min value for a char */ +#endif + +#ifndef SHRT_MAX +#define USHRT_MAX 65535 /* max value for an unsigned short */ +#define SHRT_MAX 32767 /* max value for a short */ +#define SHRT_MIN (-32768) /* min value for a short */ +#endif + +#ifndef INT_MAX +#define UINT_MAX 0xffffffff /* max value for an unsigned int */ +#define INT_MAX 2147483647 /* max value for an int */ +#define INT_MIN (-2147483647-1) /* min value for an int */ +#endif + +#ifndef LONG_MAX +#define ULONG_MAX 0xffffffff /* max value for an unsigned long */ +#define LONG_MAX 2147483647 /* max value for a long */ +#define LONG_MIN (-2147483647-1) /* min value for a long */ +#endif + +#if !defined(_ANSI_SOURCE) +#define SSIZE_MAX INT_MAX /* max value for a ssize_t */ + +#if !defined(_POSIX_SOURCE) +#define SIZE_T_MAX UINT_MAX /* max value for a size_t */ + +/* GCC requires that quad constants be written as expressions. */ +#define UQUAD_MAX ((u_quad_t)0-1) /* max value for a uquad_t */ + /* max value for a quad_t */ +#define QUAD_MAX ((quad_t)(UQUAD_MAX >> 1)) +#define QUAD_MIN (-QUAD_MAX-1) /* min value for a quad_t */ + +#endif /* !_POSIX_SOURCE */ +#endif /* !_ANSI_SOURCE */ + +#endif /* !_MACHINE_LIMITS_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/param.h b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/param.h new file mode 100644 index 00000000000..3926e8d380b --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/param.h @@ -0,0 +1,161 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: @(#)param.h 5.8 (Berkeley) 6/28/91 + */ + +#ifndef _MACHINE_PARAM_H_ +#define _MACHINE_PARAM_H_ + +/* + * Machine dependent constants for Intel 386. + */ + +#define MACHINE "i386" +#define MID_MACHINE MID_I386 + +/* + * Round p (pointer or byte index) up to a correctly-aligned value + * for all data types (int, long, ...). The result is unsigned int + * and must be cast to any desired pointer type. + */ +#define ALIGNBYTES (sizeof(int) - 1) +#define ALIGN(p) (((unsigned)(p) + ALIGNBYTES) & ~ALIGNBYTES) + +#ifndef PAGE_SIZE +/* XXX PGSHIFT and PG_SHIFT are two names for the same thing */ +#define PGSHIFT 12 /* LOG2(NBPG) */ +#define PAGE_SHIFT 12 +#define NBPG (1 << PAGE_SHIFT) /* bytes/page */ +#define PAGE_SIZE (1 << PAGE_SHIFT) +#define PAGE_MASK (PAGE_SIZE-1) +#define PGOFSET (NBPG-1) /* byte offset into page */ +#define NPTEPG (NBPG/(sizeof (pt_entry_t))) +#endif + +/* XXX PDRSHIFT and PD_SHIFT are two names for the same thing */ +#define PDRSHIFT 22 /* LOG2(NBPDR) */ +#define NBPDR (1 << PDRSHIFT) /* bytes/page dir */ +#define PDROFSET (NBPDR-1) /* byte offset into page dir */ + +/* + * XXX This should really be KPTDPTDI << PDRSHIFT, but since KPTDPTDI is + * defined in pmap.h which is included after this we can't do that + * (YET!) + */ +#define BTOPKERNBASE (KERNBASE >> PGSHIFT) + +#define DEV_BSHIFT 9 /* log2(DEV_BSIZE) */ +#define DEV_BSIZE (1 << DEV_BSHIFT) + +#define BLKDEV_IOSIZE 2048 +#define MAXPHYS (64 * 1024) /* max raw I/O transfer size */ + +#define CLSIZELOG2 0 +#define CLSIZE (1 << CLSIZELOG2) + +/* NOTE: SSIZE, SINCR and UPAGES must be multiples of CLSIZE */ +#define SSIZE 1 /* initial stack size/NBPG */ +#define SINCR 1 /* increment of stack/NBPG */ + +#define UPAGES 2 /* pages of u-area */ + +/* + * Constants related to network buffer management. + * MCLBYTES must be no larger than CLBYTES (the software page size), and, + * on machines that exchange pages of input or output buffers with mbuf + * clusters (MAPPED_MBUFS), MCLBYTES must also be an integral multiple + * of the hardware page size. + */ +#ifndef MSIZE +#define MSIZE 128 /* size of an mbuf */ +#endif /* MSIZE */ + +#ifndef MCLSHIFT +#define MCLSHIFT 11 /* convert bytes to m_buf clusters */ +#endif /* MCLSHIFT */ +#define MCLBYTES (1 << MCLSHIFT) /* size of an m_buf cluster */ +#define MCLOFSET (MCLBYTES - 1) /* offset within an m_buf cluster */ + +/* + * Some macros for units conversion + */ +/* Core clicks (4096 bytes) to segments and vice versa */ +#define ctos(x) (x) +#define stoc(x) (x) + +/* Core clicks (4096 bytes) to disk blocks */ +#define ctod(x) ((x)<<(PGSHIFT-DEV_BSHIFT)) +#define dtoc(x) ((x)>>(PGSHIFT-DEV_BSHIFT)) +#define dtob(x) ((x)<>PGSHIFT) + +/* + * This is messy and perhaps slow because `bytes' may be an off_t. We + * have to shift an unsigned type to avoid sign extension and we don't + * want to widen `bytes' unnecessarily. Assume that off_t is long long + * and daddr_t is unsigned long. + */ +#define btodb(bytes) /* calculates (bytes / DEV_BSIZE) */ \ + (sizeof (bytes) > sizeof(long) \ + ? (unsigned long)((unsigned long long)(bytes) >> DEV_BSHIFT) \ + : (unsigned long)((unsigned long)(bytes) >> DEV_BSHIFT)) +#define dbtob(db) /* calculates (db * DEV_BSIZE) */ \ + ((unsigned long long)(db) << DEV_BSHIFT) + +/* + * Mach derived conversion macros + */ +#define trunc_page(x) ((unsigned)(x) & ~(NBPG-1)) +#define round_page(x) ((((unsigned)(x)) + NBPG - 1) & ~(NBPG-1)) + +#define atop(x) ((unsigned)(x) >> PG_SHIFT) +#define ptoa(x) ((unsigned)(x) << PG_SHIFT) + +#define i386_round_pdr(x) ((((unsigned)(x)) + NBPDR - 1) & ~(NBPDR-1)) +#define i386_trunc_pdr(x) ((unsigned)(x) & ~(NBPDR-1)) +#define i386_round_page(x) ((((unsigned)(x)) + NBPG - 1) & ~(NBPG-1)) +#define i386_trunc_page(x) ((unsigned)(x) & ~(NBPG-1)) +#define i386_btod(x) ((unsigned)(x) >> PDRSHIFT) +#define i386_dtob(x) ((unsigned)(x) << PDRSHIFT) +#define i386_btop(x) ((unsigned)(x) >> PGSHIFT) +#define i386_ptob(x) ((unsigned)(x) << PGSHIFT) + +#endif /* !_MACHINE_PARAM_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/proc.h b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/proc.h new file mode 100644 index 00000000000..583b10e2bd9 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/proc.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 1991 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: @(#)proc.h 7.1 (Berkeley) 5/15/91 + */ + +#ifndef _MACHINE_PROC_H_ +#define _MACHINE_PROC_H_ 1 + +/* + * Machine-dependent part of the proc structure for i386. + */ +struct mdproc { + int md_flags; /* machine-dependent flags */ + int *md_regs; /* registers on current frame */ +}; + +/* md_flags */ +#define MDP_AST 0x0001 /* async trap pending */ +#endif /* _MACHINE_PROC_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/signal.h b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/signal.h new file mode 100644 index 00000000000..e1ede966902 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/signal.h @@ -0,0 +1,80 @@ +/* + * Copyright (c) 1986, 1989, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)signal.h 8.1 (Berkeley) 6/11/93 + */ + +#ifndef _I386_MACHINE_SIGNAL_H_ +#define _I386_MACHINE_SIGNAL_H_ + +/* + * Machine-dependent signal definitions + */ + +typedef int sig_atomic_t; + +#ifndef _POSIX_SOURCE +#include /* codes for SIGILL, SIGFPE */ +#endif + +/* + * Information pushed on stack when a signal is delivered. + * This is used by the kernel to restore state following + * execution of the signal handler. It is also made available + * to the handler to allow it to restore state properly if + * a non-standard exit is performed. + */ +struct sigcontext { + int sc_onstack; /* sigstack state to restore */ + int sc_mask; /* signal mask to restore */ + int sc_esp; /* machine state */ + int sc_ebp; + int sc_isp; + int sc_eip; + int sc_efl; + int sc_es; + int sc_ds; + int sc_cs; + int sc_ss; + int sc_edi; + int sc_esi; + int sc_ebx; + int sc_edx; + int sc_ecx; + int sc_eax; +# define sc_sp sc_esp +# define sc_fp sc_ebp +# define sc_pc sc_eip +# define sc_ps sc_efl +}; + +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/spl.h b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/spl.h new file mode 100644 index 00000000000..578a36e5b9a --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/spl.h @@ -0,0 +1,221 @@ +/* + * Copyright (c) 1996-1999 University of Utah and the Flux Group. + * All rights reserved. + * + * This file is part of the Flux OSKit. The OSKit is free software, also known + * as "open source;" you can redistribute it and/or modify it under the terms + * of the GNU General Public License (GPL), version 2, as published by the Free + * Software Foundation (FSF). To explore alternate licensing terms, contact + * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. + * + * The OSKit 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 GPL for more details. You should have + * received a copy of the GPL along with the OSKit; see the file COPYING. If + * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. + */ +/*- + * Copyright (c) 1993 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +#ifndef _MACHINE_IPL_H_ +#define _MACHINE_IPL_H_ + +#include /* XXX "machine" means cpu for i386 */ + +/* + * Software interrupt bit numbers in priority order. The priority only + * determines which swi will be dispatched next; a higher priority swi + * may be dispatched when a nested h/w interrupt handler returns. + */ +#define SWI_TTY (NHWI + 0) +#define SWI_NET (NHWI + 1) +#define SWI_CLOCK 30 +#define SWI_AST 31 + +/* + * Corresponding interrupt-pending bits for ipending. + */ +#define SWI_TTY_PENDING (1 << SWI_TTY) +#define SWI_NET_PENDING (1 << SWI_NET) +#define SWI_CLOCK_PENDING (1 << SWI_CLOCK) +#define SWI_AST_PENDING (1 << SWI_AST) + +/* + * Corresponding interrupt-disable masks for cpl. The ordering is now by + * inclusion (where each mask is considered as a set of bits). Everything + * except SWI_AST_MASK includes SWI_CLOCK_MASK so that softclock() doesn't + * run while other swi handlers are running and timeout routines can call + * swi handlers. Everything includes SWI_AST_MASK so that AST's are masked + * until just before return to user mode. SWI_TTY_MASK includes SWI_NET_MASK + * in case tty interrupts are processed at splsofttty() for a tty that is in + * SLIP or PPP line discipline (this is weaker than merging net_imask with + * tty_imask in isa.c - splimp() must mask hard and soft tty interrupts, but + * spltty() apparently only needs to mask soft net interrupts). + */ +#define SWI_TTY_MASK (SWI_TTY_PENDING | SWI_CLOCK_MASK | SWI_NET_MASK) +#define SWI_NET_MASK (SWI_NET_PENDING | SWI_CLOCK_MASK) +#define SWI_CLOCK_MASK (SWI_CLOCK_PENDING | SWI_AST_MASK) +#define SWI_AST_MASK SWI_AST_PENDING +#define SWI_MASK (~HWI_MASK) + +#ifdef OSKIT +#include "osenv.h" + +extern unsigned oskit_freebsd_cpl; +extern unsigned oskit_freebsd_ipending; + +#define GENERIC_SPL(you_name_it) \ +static __inline int spl##you_name_it(void) \ +{ \ + int t; \ + osenv_intr_disable(); \ + t = oskit_freebsd_cpl; \ + oskit_freebsd_cpl = 1; \ + return t; \ +} + +GENERIC_SPL(imp) +GENERIC_SPL(net) +GENERIC_SPL(bio) +GENERIC_SPL(high) +GENERIC_SPL(clock) +GENERIC_SPL(tty) +GENERIC_SPL(softtty) +/* + * this is used to reduce the clock spl to a softclock spl before + * calling the softclock handler directly. It will never call splx! + */ +#define splsoftclock() 0 + +static __inline void splx(int x) +{ + if (x == 0) { + oskit_freebsd_cpl = 0; + osenv_intr_enable(); + } +} + +/* for code from NetBSD */ +#define spl0() splx(0) + +#define setsoftclock() (oskit_freebsd_ipending |= SWI_CLOCK_PENDING) +#define setsofttty() (oskit_freebsd_ipending |= SWI_TTY_PENDING) + +#define schedsofttty() (oskit_freebsd_ipending |= SWI_TTY_PENDING) + +/* + * functions to save and restore the current cpl + */ +static __inline void save_cpl(unsigned *x) +{ + *x = oskit_freebsd_cpl; +} + +static __inline void restore_cpl(unsigned x) +{ + oskit_freebsd_cpl = x; +} + +#else /* !OSKIT */ +#ifndef LOCORE + +extern unsigned bio_imask; /* group of interrupts masked with splbio() */ +extern unsigned cpl; /* current priority level mask */ +extern volatile unsigned idelayed; /* interrupts to become pending */ +extern volatile unsigned ipending; /* active interrupts masked by cpl */ +extern unsigned net_imask; /* group of interrupts masked with splimp() */ +extern unsigned stat_imask; /* interrupts masked with splstatclock() */ +extern unsigned tty_imask; /* group of interrupts masked with spltty() */ + +/* + * ipending has to be volatile so that it is read every time it is accessed + * in splx() and spl0(), but we don't want it to be read nonatomically when + * it is changed. Pretending that ipending is a plain int happens to give + * suitable atomic code for "ipending |= constant;". + */ +#define setdelayed() (*(unsigned *)&ipending |= loadandclear(&idelayed)) +#define setsoftast() (*(unsigned *)&ipending |= SWI_AST_PENDING) +#define setsoftclock() (*(unsigned *)&ipending |= SWI_CLOCK_PENDING) +#define setsoftnet() (*(unsigned *)&ipending |= SWI_NET_PENDING) +#define setsofttty() (*(unsigned *)&ipending |= SWI_TTY_PENDING) + +#define schedsofttty() (*(unsigned *)&idelayed |= SWI_TTY_PENDING) + +#ifdef __GNUC__ + +void splz __P((void)); + +#define GENSPL(name, set_cpl) \ +static __inline int name(void) \ +{ \ + unsigned x; \ + \ + __asm __volatile("" : : : "memory"); \ + x = cpl; \ + set_cpl; \ + return (x); \ +} + +GENSPL(splbio, cpl |= bio_imask) +GENSPL(splclock, cpl = HWI_MASK | SWI_MASK) +GENSPL(splhigh, cpl = HWI_MASK | SWI_MASK) +GENSPL(splimp, cpl |= net_imask) +GENSPL(splnet, cpl |= SWI_NET_MASK) +GENSPL(splsoftclock, cpl = SWI_CLOCK_MASK) +GENSPL(splsofttty, cpl |= SWI_TTY_MASK) +GENSPL(splstatclock, cpl |= stat_imask) +GENSPL(spltty, cpl |= tty_imask) + +static __inline void +spl0(void) +{ + cpl = SWI_AST_MASK; + if (ipending & ~SWI_AST_MASK) + splz(); +} + +static __inline void +splx(int ipl) +{ + cpl = ipl; + if (ipending & ~ipl) + splz(); +} + +#endif /* __GNUC__ */ + +#endif /* !LOCORE */ +#endif /* !OSKIT */ + +#endif /* !_MACHINE_IPL_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/stdarg.h b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/stdarg.h new file mode 100644 index 00000000000..64014667714 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/stdarg.h @@ -0,0 +1,63 @@ +/*- + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)stdarg.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _STDARG_H_ +#define _STDARG_H_ + +typedef char *va_list; + +#ifdef __GNUC__ +#define va_start(AP, LASTARG) \ + (AP = ((va_list) __builtin_next_arg (LASTARG))) +#else +#define __va_promote(type) \ + (((sizeof(type) + sizeof(int) - 1) / sizeof(int)) * sizeof(int)) + +#define va_start(ap, last) \ + (ap = ((va_list)&(last) + __va_promote(last))) +#endif + +#ifdef KERNEL +#define va_arg(ap, type) \ + ((type *)(ap += sizeof(type)))[-1] +#else +#define va_arg(ap, type) \ + ((type *)(ap += sizeof(type) < sizeof(int) ? \ + (abort(), 0) : sizeof(type)))[-1] +#endif + +#define va_end(ap) + +#endif /* !_STDARG_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/trap.h b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/trap.h new file mode 100644 index 00000000000..bd136824224 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/trap.h @@ -0,0 +1,95 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: @(#)trap.h 5.4 (Berkeley) 5/9/91 + */ + +#ifndef _MACHINE_TRAP_H_ +#define _MACHINE_TRAP_H_ + +/* + * Trap type values + * also known in trap.c for name strings + */ + +#define T_PRIVINFLT 1 /* privileged instruction */ +#define T_BPTFLT 3 /* breakpoint instruction */ +#define T_ARITHTRAP 6 /* arithmetic trap */ +#define T_ASTFLT 7 /* system forced exception */ +#define T_PROTFLT 9 /* protection fault */ +#define T_TRCTRAP 10 /* debug exception (sic) */ +#define T_PAGEFLT 12 /* page fault */ +#define T_ALIGNFLT 14 /* alignment fault */ + +#define T_DIVIDE 18 /* integer divide fault */ +#define T_NMI 19 /* non-maskable trap */ +#define T_OFLOW 20 /* overflow trap */ +#define T_BOUND 21 /* bound instruction fault */ +#define T_DNA 22 /* device not available fault */ +#define T_DOUBLEFLT 23 /* double fault */ +#define T_FPOPFLT 24 /* fp coprocessor operand fetch fault */ +#define T_TSSFLT 25 /* invalid tss fault */ +#define T_SEGNPFLT 26 /* segment not present fault */ +#define T_STKFLT 27 /* stack fault */ +#define T_RESERVED 28 /* reserved (unknown) */ + +/* XXX most of the following codes aren't used, but could be. */ + +/* definitions for */ +#define ILL_RESAD_FAULT T_RESADFLT +#define ILL_PRIVIN_FAULT T_PRIVINFLT +#define ILL_RESOP_FAULT T_RESOPFLT +#define ILL_ALIGN_FAULT T_ALIGNFLT +#define ILL_FPOP_FAULT T_FPOPFLT /* coprocessor operand fault */ + +/* codes for SIGFPE/ARITHTRAP */ +#define FPE_INTOVF_TRAP 0x1 /* integer overflow */ +#define FPE_INTDIV_TRAP 0x2 /* integer divide by zero */ +#define FPE_FLTDIV_TRAP 0x3 /* floating/decimal divide by zero */ +#define FPE_FLTOVF_TRAP 0x4 /* floating overflow */ +#define FPE_FLTUND_TRAP 0x5 /* floating underflow */ +#define FPE_FPU_NP_TRAP 0x6 /* floating point unit not present */ +#define FPE_SUBRNG_TRAP 0x7 /* subrange out of bounds */ + +/* codes for SIGBUS */ +#define BUS_PAGE_FAULT T_PAGEFLT /* page fault protection base */ +#define BUS_SEGNP_FAULT T_SEGNPFLT /* segment not present */ +#define BUS_STK_FAULT T_STKFLT /* stack segment */ +#define BUS_SEGM_FAULT T_RESERVED /* segment protection base */ + +/* Trap's coming from user mode */ +#define T_USER 0x100 + +#endif /* !_MACHINE_TRAP_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/types.h b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/types.h new file mode 100644 index 00000000000..dcbb29c08fe --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/types.h @@ -0,0 +1,65 @@ +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)types.h 8.3 (Berkeley) 1/5/94 + */ + +#ifndef _MACHTYPES_H_ +#define _MACHTYPES_H_ + +#if !defined(_ANSI_SOURCE) && !defined(_POSIX_SOURCE) +typedef struct _physadr { + int r[1]; +} *physadr; + +typedef struct label_t { + int val[6]; +} label_t; +#endif + +typedef unsigned long vm_offset_t; +typedef unsigned long vm_size_t; + +/* + * Basic integral types. Omit the typedef if + * not possible for a machine/compiler combination. + */ +typedef __signed char int8_t; +typedef unsigned char u_int8_t; +typedef short int16_t; +typedef unsigned short u_int16_t; +typedef int int32_t; +typedef unsigned int u_int32_t; +typedef long long int64_t; +typedef unsigned long long u_int64_t; + +#endif /* _MACHTYPES_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/vmparam.h b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/vmparam.h new file mode 100644 index 00000000000..d5944b3d62b --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/vmparam.h @@ -0,0 +1,136 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * Copyright (c) 1994 John S. Dyson + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: @(#)vmparam.h 5.9 (Berkeley) 5/12/91 + */ + + +#ifndef _MACHINE_VMPARAM_H_ +#define _MACHINE_VMPARAM_H_ 1 + +/* + * Machine dependent constants for 386. + */ + +/* + * Virtual memory related constants, all in bytes + */ +#define MAXTSIZ (16UL*1024*1024) /* max text size */ +#ifndef DFLDSIZ +#define DFLDSIZ (64UL*1024*1024) /* initial data size limit */ +#endif +#ifndef MAXDSIZ +#define MAXDSIZ (128UL*1024*1024) /* max data size */ +#endif +#ifndef DFLSSIZ +#define DFLSSIZ (8UL*1024*1024) /* initial stack size limit */ +#endif +#ifndef MAXSSIZ +#define MAXSSIZ (64UL*1024*1024) /* max stack size */ +#endif +#ifndef SGROWSIZ +#define SGROWSIZ (128UL*1024) /* amount to grow stack */ +#endif + +#define USRTEXT (1*NBPG) /* base of user text XXX bogus */ + +/* + * Default sizes of swap allocation chunks (see dmap.h). + * The actual values may be changed in vminit() based on MAXDSIZ. + * With MAXDSIZ of 16Mb and NDMAP of 38, dmmax will be 1024. + */ +#define DMMIN 32 /* smallest swap allocation */ +#define DMMAX 4096 /* largest potential swap allocation */ +#define DMTEXT 1024 /* swap allocation for text */ + +/* + * Sizes of the system and user portions of the system page table. + */ +#define SYSPTSIZE (2*NPTEPG) +#define USRPTSIZE (2*NPTEPG) + +/* + * Size of the Shared Memory Pages page table. + */ +#ifndef SHMMAXPGS +#define SHMMAXPGS 1024 /* XXX until we have more kmap space */ +#endif + +/* + * Size of User Raw I/O map + */ +#define USRIOSIZE 1024 + +/* + * The time for a process to be blocked before being very swappable. + * This is a number of seconds which the system takes as being a non-trivial + * amount of real time. You probably shouldn't change this; + * it is used in subtle ways (fractions and multiples of it are, that is, like + * half of a ``long time'', almost a long time, etc.) + * It is related to human patience and other factors which don't really + * change over time. + */ +#define MAXSLP 20 + +/* + * Mach derived constants + */ + +/* user/kernel map constants */ +#ifdef OSKIT +#define KERNBASE 0 /* XXX */ +#else +#define KERNBASE ((0x400-1-NKPDE)*(NBPG*NPTEPG)) +#endif + +#define VM_MIN_ADDRESS ((vm_offset_t)0) +#define VM_MAXUSER_ADDRESS ((vm_offset_t)KERNBASE - (NBPG*(NPTEPG+UPAGES))) +#define USRSTACK VM_MAXUSER_ADDRESS +#define UPT_MIN_ADDRESS ((vm_offset_t)KERNBASE - (NBPG*NPTEPG)) +#define UPT_MAX_ADDRESS ((vm_offset_t)KERNBASE - (NBPG*(NKPDE+2))) +#define VM_MAX_ADDRESS UPT_MAX_ADDRESS +#define VM_MIN_KERNEL_ADDRESS ((vm_offset_t)KERNBASE - (NBPG*(NKPDE+2))) +#define UPDT VM_MIN_KERNEL_ADDRESS +#define KPT_MIN_ADDRESS ((vm_offset_t)KERNBASE - NBPG*(NKPDE+1)) +#define KPT_MAX_ADDRESS ((vm_offset_t)KERNBASE - NBPG) +#define VM_MAX_KERNEL_ADDRESS ((vm_offset_t)KERNBASE + NKPDE*NBPG*NPTEPG) + +/* virtual sizes (bytes) for various kernel submaps */ +#define VM_KMEM_SIZE (32 * 1024 * 1024) +#define VM_PHYS_SIZE (USRIOSIZE*CLBYTES) + +#endif /* _MACHINE_VMPARAM_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/net/if.h b/reactos/lib/oskittcp/include/freebsd/src/sys/net/if.h new file mode 100644 index 00000000000..aca7de714cb --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/net/if.h @@ -0,0 +1,394 @@ +/* + * Copyright (c) 1982, 1986, 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)if.h 8.1 (Berkeley) 6/10/93 + * $\Id: if.h,v 1.18.4.1 1996/06/24 22:04:13 gpalmer Exp $ + */ + +#ifndef _NET_IF_H_ +#define _NET_IF_H_ + +/* + * Structures defining a network interface, providing a packet + * transport mechanism (ala level 0 of the PUP protocols). + * + * Each interface accepts output datagrams of a specified maximum + * length, and provides higher level routines with input datagrams + * received from its medium. + * + * Output occurs when the routine if_output is called, with three parameters: + * (*ifp->if_output)(ifp, m, dst, rt) + * Here m is the mbuf chain to be sent and dst is the destination address. + * The output routine encapsulates the supplied datagram if necessary, + * and then transmits it on its medium. + * + * On input, each interface unwraps the data received by it, and either + * places it on the input queue of a internetwork datagram routine + * and posts the associated software interrupt, or passes the datagram to a raw + * packet input routine. + * + * Routines exist for locating interfaces by their addresses + * or for locating a interface on a certain network, as well as more general + * routing and gateway routines maintaining information used to locate + * interfaces. These routines live in the files if.c and route.c + */ + +#include /* for struct sockaddr */ + +#ifndef _TIME_ /* XXX fast fix for SNMP, going away soon */ +#include +#endif + +#ifdef __STDC__ +/* + * Forward structure declarations for function prototypes [sic]. + */ +struct mbuf; +struct proc; +struct rtentry; +struct socket; +struct ether_header; +#endif +/* + * Structure describing information about an interface + * which may be of interest to management entities. + */ +/* + * Structure defining a queue for a network interface. + * + * (Would like to call this struct ``if'', but C isn't PL/1.) + */ + +struct ifnet { + char *if_name; /* name, e.g. ``en'' or ``lo'' */ + struct ifnet *if_next; /* all struct ifnets are chained */ + struct ifaddr *if_addrlist; /* linked list of addresses per if */ + int if_pcount; /* number of promiscuous listeners */ + caddr_t if_bpf; /* packet filter structure */ + u_short if_index; /* numeric abbreviation for this if */ + short if_unit; /* sub-unit for lower level driver */ + short if_timer; /* time 'til if_watchdog called */ + short if_flags; /* up/down, broadcast, etc. */ + struct if_data { +/* generic interface information */ + u_char ifi_type; /* ethernet, tokenring, etc */ + u_char ifi_physical; /* e.g., AUI, Thinnet, 10base-T, etc */ + u_char ifi_addrlen; /* media address length */ + u_char ifi_hdrlen; /* media header length */ + u_long ifi_mtu; /* maximum transmission unit */ + u_long ifi_metric; /* routing metric (external only) */ + u_long ifi_baudrate; /* linespeed */ +/* volatile statistics */ + u_long ifi_ipackets; /* packets received on interface */ + u_long ifi_ierrors; /* input errors on interface */ + u_long ifi_opackets; /* packets sent on interface */ + u_long ifi_oerrors; /* output errors on interface */ + u_long ifi_collisions; /* collisions on csma interfaces */ + u_long ifi_ibytes; /* total number of octets received */ + u_long ifi_obytes; /* total number of octets sent */ + u_long ifi_imcasts; /* packets received via multicast */ + u_long ifi_omcasts; /* packets sent via multicast */ + u_long ifi_iqdrops; /* dropped on input, this interface */ + u_long ifi_noproto; /* destined for unsupported protocol */ + struct timeval ifi_lastchange;/* time of last administrative change */ + } if_data; +/* procedure handles */ + void (*if_init) /* init routine */ + __P((int)); + int (*if_output) /* output routine (enqueue) */ + __P((struct ifnet *, struct mbuf *, struct sockaddr *, + struct rtentry *)); + void (*if_start) /* initiate output routine */ + __P((struct ifnet *)); + int (*if_done) /* output complete routine */ + __P((struct ifnet *)); /* (XXX not used; fake prototype) */ + int (*if_ioctl) /* ioctl routine */ + __P((struct ifnet *, int, caddr_t)); + void (*if_reset) + __P((int)); /* new autoconfig will permit removal */ + void (*if_watchdog) /* timer routine */ + __P((int)); + struct ifqueue { + struct mbuf *ifq_head; + struct mbuf *ifq_tail; + int ifq_len; + int ifq_maxlen; + int ifq_drops; + } if_snd; /* output queue */ +}; +#define if_mtu if_data.ifi_mtu +#define if_type if_data.ifi_type +#define if_physical if_data.ifi_physical +#define if_addrlen if_data.ifi_addrlen +#define if_hdrlen if_data.ifi_hdrlen +#define if_metric if_data.ifi_metric +#define if_baudrate if_data.ifi_baudrate +#define if_ipackets if_data.ifi_ipackets +#define if_ierrors if_data.ifi_ierrors +#define if_opackets if_data.ifi_opackets +#define if_oerrors if_data.ifi_oerrors +#define if_collisions if_data.ifi_collisions +#define if_ibytes if_data.ifi_ibytes +#define if_obytes if_data.ifi_obytes +#define if_imcasts if_data.ifi_imcasts +#define if_omcasts if_data.ifi_omcasts +#define if_iqdrops if_data.ifi_iqdrops +#define if_noproto if_data.ifi_noproto +#define if_lastchange if_data.ifi_lastchange +#define if_rawoutput(if, m, sa) if_output(if, m, sa, (struct rtentry *)0) + +#define IFF_UP 0x1 /* interface is up */ +#define IFF_BROADCAST 0x2 /* broadcast address valid */ +#define IFF_DEBUG 0x4 /* turn on debugging */ +#define IFF_LOOPBACK 0x8 /* is a loopback net */ +#define IFF_POINTOPOINT 0x10 /* interface is point-to-point link */ +#define IFF_NOTRAILERS 0x20 /* avoid use of trailers */ +#define IFF_RUNNING 0x40 /* resources allocated */ +#define IFF_NOARP 0x80 /* no address resolution protocol */ +#define IFF_PROMISC 0x100 /* receive all packets */ +#define IFF_ALLMULTI 0x200 /* receive all multicast packets */ +#define IFF_OACTIVE 0x400 /* transmission in progress */ +#define IFF_SIMPLEX 0x800 /* can't hear own transmissions */ +#define IFF_LINK0 0x1000 /* per link layer defined bit */ +#define IFF_LINK1 0x2000 /* per link layer defined bit */ +#define IFF_LINK2 0x4000 /* per link layer defined bit */ +#define IFF_ALTPHYS IFF_LINK2 /* use alternate physical connection */ +#define IFF_MULTICAST 0x8000 /* supports multicast */ + +/* flags set internally only: */ +#define IFF_CANTCHANGE \ + (IFF_BROADCAST|IFF_POINTOPOINT|IFF_RUNNING|IFF_OACTIVE|\ + IFF_SIMPLEX|IFF_MULTICAST|IFF_ALLMULTI) + + +/* + * These really don't belong here, but there's no other obviously appropriate + * location. + */ +#define IFP_AUI 0 +#define IFP_10BASE2 1 +#define IFP_10BASET 2 +/* etc. */ + +/* + * Output queues (ifp->if_snd) and internetwork datagram level (pup level 1) + * input routines have queues of messages stored on ifqueue structures + * (defined above). Entries are added to and deleted from these structures + * by these macros, which should be called with ipl raised to splimp(). + */ +#define IF_QFULL(ifq) ((ifq)->ifq_len >= (ifq)->ifq_maxlen) +#define IF_DROP(ifq) ((ifq)->ifq_drops++) +#define IF_ENQUEUE(ifq, m) { \ + (m)->m_nextpkt = 0; \ + if ((ifq)->ifq_tail == 0) \ + (ifq)->ifq_head = m; \ + else \ + (ifq)->ifq_tail->m_nextpkt = m; \ + (ifq)->ifq_tail = m; \ + (ifq)->ifq_len++; \ +} +#define IF_PREPEND(ifq, m) { \ + (m)->m_nextpkt = (ifq)->ifq_head; \ + if ((ifq)->ifq_tail == 0) \ + (ifq)->ifq_tail = (m); \ + (ifq)->ifq_head = (m); \ + (ifq)->ifq_len++; \ +} +#define IF_DEQUEUE(ifq, m) { \ + (m) = (ifq)->ifq_head; \ + if (m) { \ + if (((ifq)->ifq_head = (m)->m_nextpkt) == 0) \ + (ifq)->ifq_tail = 0; \ + (m)->m_nextpkt = 0; \ + (ifq)->ifq_len--; \ + } \ +} + +#define IFQ_MAXLEN 50 +#define IFNET_SLOWHZ 1 /* granularity is 1 second */ + +#ifndef __REACTOS__ +/* + * The ifaddr structure contains information about one address + * of an interface. They are maintained by the different address families, + * are allocated and attached when an address is set, and are linked + * together so all addresses for an interface can be located. + */ +struct ifaddr { + struct sockaddr *ifa_addr; /* address of interface */ + struct sockaddr *ifa_dstaddr; /* other end of p-to-p link */ +#define ifa_broadaddr ifa_dstaddr /* broadcast address interface */ + struct sockaddr *ifa_netmask; /* used to determine subnet */ + struct ifnet *ifa_ifp; /* back-pointer to interface */ + struct ifaddr *ifa_next; /* next address for interface */ + void (*ifa_rtrequest) /* check or clean routes (+ or -)'d */ + __P((int, struct rtentry *, struct sockaddr *)); + u_short ifa_flags; /* mostly rt_flags for cloning */ + short ifa_refcnt; /* extra to malloc for link info */ + int ifa_metric; /* cost of going out this interface */ +#ifdef notdef + struct rtentry *ifa_rt; /* XXXX for ROUTETOIF ????? */ +#endif +}; +#define IFA_ROUTE RTF_UP /* route installed */ +#endif + +/* + * Message format for use in obtaining information about interfaces + * from getkerninfo and the routing socket + */ +struct if_msghdr { + u_short ifm_msglen; /* to skip over non-understood messages */ + u_char ifm_version; /* future binary compatability */ + u_char ifm_type; /* message type */ + int ifm_addrs; /* like rtm_addrs */ + int ifm_flags; /* value of if_flags */ + u_short ifm_index; /* index for associated ifp */ + struct if_data ifm_data;/* statistics and other data about if */ +}; + +/* + * Message format for use in obtaining information about interface addresses + * from getkerninfo and the routing socket + */ +struct ifa_msghdr { + u_short ifam_msglen; /* to skip over non-understood messages */ + u_char ifam_version; /* future binary compatability */ + u_char ifam_type; /* message type */ + int ifam_addrs; /* like rtm_addrs */ + int ifam_flags; /* value of ifa_flags */ + u_short ifam_index; /* index for associated ifp */ + int ifam_metric; /* value of ifa_metric */ +}; + +/* + * Interface request structure used for socket + * ioctl's. All interface ioctl's must have parameter + * definitions which begin with ifr_name. The + * remainder may be interface specific. + */ +struct ifreq { +#define IFNAMSIZ 16 + char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */ + union { + struct sockaddr ifru_addr; + struct sockaddr ifru_dstaddr; + struct sockaddr ifru_broadaddr; + short ifru_flags; + int ifru_metric; + int ifru_mtu; + int ifru_phys; + caddr_t ifru_data; + } ifr_ifru; +#define ifr_addr ifr_ifru.ifru_addr /* address */ +#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */ +#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */ +#define ifr_flags ifr_ifru.ifru_flags /* flags */ +#define ifr_metric ifr_ifru.ifru_metric /* metric */ +#define ifr_mtu ifr_ifru.ifru_mtu /* mtu */ +#define ifr_phys ifr_ifru.ifru_phys /* physical wire */ +#define ifr_data ifr_ifru.ifru_data /* for use by interface */ +}; + +struct ifaliasreq { + char ifra_name[IFNAMSIZ]; /* if name, e.g. "en0" */ + struct sockaddr ifra_addr; + struct sockaddr ifra_broadaddr; + struct sockaddr ifra_mask; +}; + +/* + * Structure used in SIOCGIFCONF request. + * Used to retrieve interface configuration + * for machine (useful for programs which + * must know all networks accessible). + */ +struct ifconf { + int ifc_len; /* size of associated buffer */ + union { + caddr_t ifcu_buf; + struct ifreq *ifcu_req; + } ifc_ifcu; +#define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */ +#define ifc_req ifc_ifcu.ifcu_req /* array of structures returned */ +}; + +#include + +#ifdef KERNEL +#define IFAFREE(ifa) \ + if ((ifa)->ifa_refcnt <= 0) \ + ifafree(ifa); \ + else \ + (ifa)->ifa_refcnt--; + +extern struct ifnet *ifnet; +extern struct ifnet loif[]; + +void ether_ifattach __P((struct ifnet *)); +void ether_input __P((struct ifnet *, struct ether_header *, struct mbuf *)); +int ether_output __P((struct ifnet *, + struct mbuf *, struct sockaddr *, struct rtentry *)); +char *ether_sprintf __P((u_char *)); + +void if_attach __P((struct ifnet *)); +void if_down __P((struct ifnet *)); +void if_qflush __P((struct ifqueue *)); +void if_slowtimo __P((void *)); +void if_up __P((struct ifnet *)); +#ifdef vax +void ifubareset __P((int)); +#endif +int ifconf __P((int, caddr_t)); +/*void ifinit __P((void));*/ /* declared in systm.h for main() */ +int ifioctl __P((struct socket *, int, caddr_t, struct proc *)); +int ifpromisc __P((struct ifnet *, int)); +struct ifnet *ifunit __P((char *)); + +int ifa_ifwithaddr __P((struct sockaddr *, struct ifaddr *)); +struct ifaddr *ifa_ifwithaf __P((int)); +struct ifaddr *ifa_ifwithdstaddr __P((struct sockaddr *, struct ifaddr *)); +int ifa_ifwithnet __P((struct sockaddr *, struct ifaddr *)); +struct ifaddr *ifa_ifwithroute __P((int, struct sockaddr *, + struct sockaddr *)); +struct ifaddr *ifaof_ifpforaddr __P((struct sockaddr *, struct ifnet *)); +void ifafree __P((struct ifaddr *)); +void link_rtrequest __P((int, struct rtentry *, struct sockaddr *)); + +int loioctl __P((struct ifnet *, int, caddr_t)); +void loopattach __P((void)); +int looutput __P((struct ifnet *, + struct mbuf *, struct sockaddr *, struct rtentry *)); +void lortrequest __P((int, struct rtentry *, struct sockaddr *)); +#endif /* KERNEL */ + +#endif /* !_NET_IF_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/net/if_arp.h b/reactos/lib/oskittcp/include/freebsd/src/sys/net/if_arp.h new file mode 100644 index 00000000000..acac0855c11 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/net/if_arp.h @@ -0,0 +1,92 @@ +/* + * Copyright (c) 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)if_arp.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NET_IF_ARP_H_ +#define _NET_IF_ARP_H_ + +#include /* for struct sockaddr */ + +/* + * Address Resolution Protocol. + * + * See RFC 826 for protocol description. ARP packets are variable + * in size; the arphdr structure defines the fixed-length portion. + * Protocol type values are the same as those for 10 Mb/s Ethernet. + * It is followed by the variable-sized fields ar_sha, arp_spa, + * arp_tha and arp_tpa in that order, according to the lengths + * specified. Field names used correspond to RFC 826. + */ +struct arphdr { + u_short ar_hrd; /* format of hardware address */ +#define ARPHRD_ETHER 1 /* ethernet hardware format */ +#define ARPHRD_FRELAY 15 /* frame relay hardware format */ + u_short ar_pro; /* format of protocol address */ + u_char ar_hln; /* length of hardware address */ + u_char ar_pln; /* length of protocol address */ + u_short ar_op; /* one of: */ +#define ARPOP_REQUEST 1 /* request to resolve address */ +#define ARPOP_REPLY 2 /* response to previous request */ +#define ARPOP_REVREQUEST 3 /* request protocol address given hardware */ +#define ARPOP_REVREPLY 4 /* response giving protocol address */ +#define ARPOP_INVREQUEST 8 /* request to identify peer */ +#define ARPOP_INVREPLY 9 /* response identifying peer */ +/* + * The remaining fields are variable in size, + * according to the sizes above. + */ +#ifdef COMMENT_ONLY + u_char ar_sha[]; /* sender hardware address */ + u_char ar_spa[]; /* sender protocol address */ + u_char ar_tha[]; /* target hardware address */ + u_char ar_tpa[]; /* target protocol address */ +#endif +}; + +/* + * ARP ioctl request + */ +struct arpreq { + struct sockaddr arp_pa; /* protocol address */ + struct sockaddr arp_ha; /* hardware address */ + int arp_flags; /* flags */ +}; +/* arp_flags and at_flags field values */ +#define ATF_INUSE 0x01 /* entry in use */ +#define ATF_COM 0x02 /* completed entry (enaddr valid) */ +#define ATF_PERM 0x04 /* permanent entry */ +#define ATF_PUBL 0x08 /* publish entry (respond for other host) */ +#define ATF_USETRAILERS 0x10 /* has requested trailers */ + +#endif /* !_NET_IF_ARP_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/net/netisr.h b/reactos/lib/oskittcp/include/freebsd/src/sys/net/netisr.h new file mode 100644 index 00000000000..f212d63b8f4 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/net/netisr.h @@ -0,0 +1,86 @@ +/* + * Copyright (c) 1980, 1986, 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)netisr.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NET_NETISR_H_ +#define _NET_NETISR_H_ + +/* + * The networking code runs off software interrupts. + * + * You can switch into the network by doing splnet() and return by splx(). + * The software interrupt level for the network is higher than the software + * level for the clock (so you can enter the network in routines called + * at timeout time). + */ +#if defined(vax) || defined(tahoe) +#define setsoftnet() mtpr(SIRR, 12) +#endif + +/* + * Each ``pup-level-1'' input queue has a bit in a ``netisr'' status + * word which is used to de-multiplex a single software + * interrupt used for scheduling the network code to calls + * on the lowest level routine of each protocol. + */ +#define NETISR_RAW 0 /* same as AF_UNSPEC */ +#define NETISR_IP 2 /* same as AF_INET */ +#define NETISR_IMP 3 /* same as AF_IMPLINK */ +#define NETISR_NS 6 /* same as AF_NS */ +#define NETISR_ISO 7 /* same as AF_ISO */ +#define NETISR_CCITT 10 /* same as AF_CCITT */ +#define NETISR_ARP 18 /* same as AF_LINK */ +#define NETISR_ISDN 26 /* same as AF_E164 */ + +#define schednetisr(anisr) { netisr |= 1<<(anisr); setsoftnet(); } + +#ifndef LOCORE +#ifdef KERNEL +extern volatile unsigned int netisr; /* scheduling bits for network */ + +typedef void netisr_t(void); + +struct netisrtab { + int nit_num; + netisr_t *nit_isr; +}; + +#define NETISR_SET(num, isr) \ + static struct netisrtab mod_nit = { num, isr }; \ + DATA_SET(netisr_set, mod_nit); + +#endif +#endif + +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/net/radix.h b/reactos/lib/oskittcp/include/freebsd/src/sys/net/radix.h new file mode 100644 index 00000000000..c37058b3cac --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/net/radix.h @@ -0,0 +1,170 @@ +/* + * Copyright (c) 1988, 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)radix.h 8.2 (Berkeley) 10/31/94 + */ + +#ifndef _RADIX_H_ +#define _RADIX_H_ + +/* + * Radix search tree node layout. + */ + +struct radix_node { + struct radix_mask *rn_mklist; /* list of masks contained in subtree */ + struct radix_node *rn_p; /* parent */ + short rn_b; /* bit offset; -1-index(netmask) */ + char rn_bmask; /* node: mask for bit test*/ + u_char rn_flags; /* enumerated next */ +#define RNF_NORMAL 1 /* leaf contains normal route */ +#define RNF_ROOT 2 /* leaf is root leaf for tree */ +#define RNF_ACTIVE 4 /* This node is alive (for rtfree) */ + union { + struct { /* leaf only data: */ + caddr_t rn_Key; /* object of search */ + caddr_t rn_Mask; /* netmask, if present */ + struct radix_node *rn_Dupedkey; + } rn_leaf; + struct { /* node only data: */ + int rn_Off; /* where to start compare */ + struct radix_node *rn_L;/* progeny */ + struct radix_node *rn_R;/* progeny */ + } rn_node; + } rn_u; +#ifdef RN_DEBUG + int rn_info; + struct radix_node *rn_twin; + struct radix_node *rn_ybro; +#endif +}; + +#define rn_dupedkey rn_u.rn_leaf.rn_Dupedkey +#define rn_key rn_u.rn_leaf.rn_Key +#define rn_mask rn_u.rn_leaf.rn_Mask +#define rn_off rn_u.rn_node.rn_Off +#define rn_l rn_u.rn_node.rn_L +#define rn_r rn_u.rn_node.rn_R + +/* + * Annotations to tree concerning potential routes applying to subtrees. + */ + +extern struct radix_mask { + short rm_b; /* bit offset; -1-index(netmask) */ + char rm_unused; /* cf. rn_bmask */ + u_char rm_flags; /* cf. rn_flags */ + struct radix_mask *rm_mklist; /* more masks to try */ + union { + caddr_t rmu_mask; /* the mask */ + struct radix_node *rmu_leaf; /* for normal routes */ + } rm_rmu; + int rm_refs; /* # of references to this struct */ +} *rn_mkfreelist; + +#define rm_mask rm_rmu.rmu_mask +#define rm_leaf rm_rmu.rmu_leaf /* extra field would make 32 bytes */ + +#define MKGet(m) {\ + if (rn_mkfreelist) {\ + m = rn_mkfreelist; \ + rn_mkfreelist = (m)->rm_mklist; \ + } else \ + R_Malloc(m, struct radix_mask *, sizeof (*(m))); }\ + +#define MKFree(m) { (m)->rm_mklist = rn_mkfreelist; rn_mkfreelist = (m);} + +typedef int walktree_f_t __P((struct radix_node *, void *)); + +struct radix_node_head { + struct radix_node *rnh_treetop; + int rnh_addrsize; /* permit, but not require fixed keys */ + int rnh_pktsize; /* permit, but not require fixed keys */ + struct radix_node *(*rnh_addaddr) /* add based on sockaddr */ + __P((void *v, void *mask, + struct radix_node_head *head, struct radix_node nodes[])); + struct radix_node *(*rnh_addpkt) /* add based on packet hdr */ + __P((void *v, void *mask, + struct radix_node_head *head, struct radix_node nodes[])); + struct radix_node *(*rnh_deladdr) /* remove based on sockaddr */ + __P((void *v, void *mask, struct radix_node_head *head)); + struct radix_node *(*rnh_delpkt) /* remove based on packet hdr */ + __P((void *v, void *mask, struct radix_node_head *head)); + struct radix_node *(*rnh_matchaddr) /* locate based on sockaddr */ + __P((void *v, struct radix_node_head *head)); + struct radix_node *(*rnh_lookup) /* locate based on sockaddr */ + __P((void *v, void *mask, struct radix_node_head *head)); + struct radix_node *(*rnh_matchpkt) /* locate based on packet hdr */ + __P((void *v, struct radix_node_head *head)); + int (*rnh_walktree) /* traverse tree */ + __P((struct radix_node_head *head, walktree_f_t *f, void *w)); + int (*rnh_walktree_from) /* traverse tree below a */ + __P((struct radix_node_head *head, void *a, void *m, + walktree_f_t *f, void *w)); + void (*rnh_close) /* do something when the last ref drops */ + __P((struct radix_node *rn, struct radix_node_head *head)); + struct radix_node rnh_nodes[3]; /* empty tree for common case */ +}; + +#ifndef KERNEL +#define Bcmp(a, b, n) bcmp(((char *)(a)), ((char *)(b)), (n)) +#define Bcopy(a, b, n) bcopy(((char *)(a)), ((char *)(b)), (unsigned)(n)) +#define Bzero(p, n) bzero((char *)(p), (int)(n)); +#define R_Malloc(p, t, n) (p = (t) malloc((unsigned int)(n))) +#define Free(p) free((char *)p); +#else +#define Bcmp(a, b, n) bcmp(((caddr_t)(a)), ((caddr_t)(b)), (unsigned)(n)) +#define Bcopy(a, b, n) bcopy(((caddr_t)(a)), ((caddr_t)(b)), (unsigned)(n)) +#define Bzero(p, n) bzero((caddr_t)(p), (unsigned)(n)); +#define R_Malloc(p, t, n) (p = (t) malloc((unsigned long)(n), M_RTABLE, M_DONTWAIT)) +#define Free(p) free((caddr_t)p, M_RTABLE); +#endif /*KERNEL*/ + +extern struct radix_node_head *mask_rnhead; + +void rn_init __P((void)); +int rn_inithead __P((void **, int)); +int rn_refines __P((void *, void *)); +int rn_walktree __P((struct radix_node_head *, walktree_f_t *, void *)); +struct radix_node + *rn_addmask __P((void *, int, int)), + *rn_addroute __P((void *, void *, struct radix_node_head *, + struct radix_node [2])), + *rn_delete __P((void *, void *, struct radix_node_head *)), + *rn_insert __P((void *, struct radix_node_head *, int *, + struct radix_node [2])), + *rn_match __P((void *, struct radix_node_head *)), + *rn_newpair __P((void *, int, struct radix_node[2])), + *rn_search __P((void *, struct radix_node *)), + *rn_search_m __P((void *, struct radix_node *, void *)); + +#endif /* _RADIX_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/net/raw_cb.h b/reactos/lib/oskittcp/include/freebsd/src/sys/net/raw_cb.h new file mode 100644 index 00000000000..c1273190505 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/net/raw_cb.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 1980, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)raw_cb.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NET_RAW_CB_H_ +#define _NET_RAW_CB_H_ + +/* + * Raw protocol interface control block. Used + * to tie a socket to the generic raw interface. + */ +struct rawcb { + struct rawcb *rcb_next; /* doubly linked list */ + struct rawcb *rcb_prev; + struct socket *rcb_socket; /* back pointer to socket */ + struct sockaddr *rcb_faddr; /* destination address */ + struct sockaddr *rcb_laddr; /* socket's address */ + struct sockproto rcb_proto; /* protocol family, protocol */ +}; + +#define sotorawcb(so) ((struct rawcb *)(so)->so_pcb) + +/* + * Nominal space allocated to a raw socket. + */ +#define RAWSNDQ 8192 +#define RAWRCVQ 8192 + +#ifdef KERNEL +struct rawcb rawcb; /* head of list */ + +int raw_attach __P((struct socket *, int)); +void raw_ctlinput __P((int, struct sockaddr *)); +void raw_detach __P((struct rawcb *)); +void raw_disconnect __P((struct rawcb *)); +void raw_init __P((void)); +void raw_input __P((struct mbuf *, + struct sockproto *, struct sockaddr *, struct sockaddr *)); +int raw_usrreq __P((struct socket *, + int, struct mbuf *, struct mbuf *, struct mbuf *)); +#endif + +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/net/route.h b/reactos/lib/oskittcp/include/freebsd/src/sys/net/route.h new file mode 100644 index 00000000000..ef78cbb9392 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/net/route.h @@ -0,0 +1,258 @@ +/* + * Copyright (c) 1980, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)route.h 8.3 (Berkeley) 4/19/94 + */ + +#ifndef _NET_ROUTE_H_ +#define _NET_ROUTE_H_ + +#include + +/* + * Kernel resident routing tables. + * + * The routing tables are initialized when interface addresses + * are set by making entries for all directly connected interfaces. + */ + +/* + * A route consists of a destination address and a reference + * to a routing entry. These are often held by protocols + * in their control blocks, e.g. inpcb. + */ +struct route { + struct rtentry ro_rt; + struct sockaddr ro_dst; +}; + +/* + * rmx_rtt and rmx_rttvar are stored as microseconds; + * RTTTOPRHZ(rtt) converts to a value suitable for use + * by a protocol slowtimo counter. + */ +#define RTM_RTTUNIT 1000000 /* units for rtt, rttvar, as units per sec */ +#define RTTTOPRHZ(r) ((r) / (RTM_RTTUNIT / PR_SLOWHZ)) + +/* + * XXX kernel function pointer `rt_output' is visible to applications. + */ +struct mbuf; + +/* + * We distinguish between routes to hosts and routes to networks, + * preferring the former if available. For each route we infer + * the interface to use from the gateway address supplied when + * the route was entered. Routes that forward packets through + * gateways are marked so that the output routines know to address the + * gateway rather than the ultimate destination. + */ +#ifndef RNF_NORMAL +#include +#endif + +#include + +#ifndef __REACTOS__ +/* + * Following structure necessary for 4.3 compatibility; + * We should eventually move it to a compat file. + */ +struct rtentry { + u_long rt_hash; /* to speed lookups */ + struct sockaddr rt_dst; /* key */ + struct sockaddr rt_gateway; /* value */ + short rt_flags; /* up/down?, host/net */ + short rt_refcnt; /* # held references */ + u_long rt_use; /* raw # packets forwarded */ + struct ifnet *rt_ifp; /* the answer: interface to use */ +}; +#endif + +#define rt_use rt_rmx.rmx_pksent + +#define RTF_UP 0x1 /* route usable */ +#define RTF_GATEWAY 0x2 /* destination is a gateway */ +#define RTF_HOST 0x4 /* host entry (net otherwise) */ +#define RTF_REJECT 0x8 /* host or net unreachable */ +#define RTF_DYNAMIC 0x10 /* created dynamically (by redirect) */ +#define RTF_MODIFIED 0x20 /* modified dynamically (by redirect) */ +#define RTF_DONE 0x40 /* message confirmed */ +#define RTF_MASK 0x80 /* subnet mask present */ +#define RTF_CLONING 0x100 /* generate new routes on use */ +#define RTF_XRESOLVE 0x200 /* external daemon resolves name */ +#define RTF_LLINFO 0x400 /* generated by ARP or ESIS */ +#define RTF_STATIC 0x800 /* manually added */ +#define RTF_BLACKHOLE 0x1000 /* just discard pkts (during updates) */ +#define RTF_PROTO2 0x4000 /* protocol specific routing flag */ +#define RTF_PROTO1 0x8000 /* protocol specific routing flag */ + +#define RTF_PRCLONING 0x10000 /* protocol requires cloning */ +#define RTF_WASCLONED 0x20000 /* route generated through cloning */ +#define RTF_PROTO3 0x40000 /* protocol specific routing flag */ +#define RTF_CHAINDELETE 0x80000 /* chain is being deleted (internal) */ +#define RTF_PINNED 0x100000 /* future use */ + /* 0x200000 and up unassigned */ + +/* + * Routing statistics. + */ +struct rtstat { + short rts_badredirect; /* bogus redirect calls */ + short rts_dynamic; /* routes created by redirects */ + short rts_newgateway; /* routes modified by redirects */ + short rts_unreach; /* lookups which failed */ + short rts_wildcard; /* lookups satisfied by a wildcard */ +}; +/* + * Structures for routing messages. + */ +struct rt_msghdr { + u_short rtm_msglen; /* to skip over non-understood messages */ + u_char rtm_version; /* future binary compatibility */ + u_char rtm_type; /* message type */ + u_short rtm_index; /* index for associated ifp */ + int rtm_flags; /* flags, incl. kern & message, e.g. DONE */ + int rtm_addrs; /* bitmask identifying sockaddrs in msg */ + pid_t rtm_pid; /* identify sender */ + int rtm_seq; /* for sender to identify action */ + int rtm_errno; /* why failed */ + int rtm_use; /* from rtentry */ + u_long rtm_inits; /* which metrics we are initializing */ + struct rt_metrics rtm_rmx; /* metrics themselves */ +}; + +#define RTM_VERSION 5 /* Up the ante and ignore older versions */ + +#define RTM_ADD 0x1 /* Add Route */ +#define RTM_DELETE 0x2 /* Delete Route */ +#define RTM_CHANGE 0x3 /* Change Metrics or flags */ +#define RTM_GET 0x4 /* Report Metrics */ +#define RTM_LOSING 0x5 /* Kernel Suspects Partitioning */ +#define RTM_REDIRECT 0x6 /* Told to use different route */ +#define RTM_MISS 0x7 /* Lookup failed on this address */ +#define RTM_LOCK 0x8 /* fix specified metrics */ +#define RTM_OLDADD 0x9 /* caused by SIOCADDRT */ +#define RTM_OLDDEL 0xa /* caused by SIOCDELRT */ +#define RTM_RESOLVE 0xb /* req to resolve dst to LL addr */ +#define RTM_NEWADDR 0xc /* address being added to iface */ +#define RTM_DELADDR 0xd /* address being removed from iface */ +#define RTM_IFINFO 0xe /* iface going up/down etc. */ + +#define RTV_MTU 0x1 /* init or lock _mtu */ +#define RTV_HOPCOUNT 0x2 /* init or lock _hopcount */ +#define RTV_EXPIRE 0x4 /* init or lock _hopcount */ +#define RTV_RPIPE 0x8 /* init or lock _recvpipe */ +#define RTV_SPIPE 0x10 /* init or lock _sendpipe */ +#define RTV_SSTHRESH 0x20 /* init or lock _ssthresh */ +#define RTV_RTT 0x40 /* init or lock _rtt */ +#define RTV_RTTVAR 0x80 /* init or lock _rttvar */ + +/* + * Bitmask values for rtm_addr. + */ +#define RTA_DST 0x1 /* destination sockaddr present */ +#define RTA_GATEWAY 0x2 /* gateway sockaddr present */ +#define RTA_NETMASK 0x4 /* netmask sockaddr present */ +#define RTA_GENMASK 0x8 /* cloning mask sockaddr present */ +#define RTA_IFP 0x10 /* interface name sockaddr present */ +#define RTA_IFA 0x20 /* interface addr sockaddr present */ +#define RTA_AUTHOR 0x40 /* sockaddr for author of redirect */ +#define RTA_BRD 0x80 /* for NEWADDR, broadcast or p-p dest addr */ + +/* + * Index offsets for sockaddr array for alternate internal encoding. + */ +#define RTAX_DST 0 /* destination sockaddr present */ +#define RTAX_GATEWAY 1 /* gateway sockaddr present */ +#define RTAX_NETMASK 2 /* netmask sockaddr present */ +#define RTAX_GENMASK 3 /* cloning mask sockaddr present */ +#define RTAX_IFP 4 /* interface name sockaddr present */ +#define RTAX_IFA 5 /* interface addr sockaddr present */ +#define RTAX_AUTHOR 6 /* sockaddr for author of redirect */ +#define RTAX_BRD 7 /* for NEWADDR, broadcast or p-p dest addr */ +#define RTAX_MAX 8 /* size of array to allocate */ + +struct rt_addrinfo { + int rti_addrs; + struct sockaddr *rti_info[RTAX_MAX]; +}; + +struct route_cb { + int ip_count; + int ns_count; + int iso_count; + int any_count; +}; + +#ifdef KERNEL +#ifndef __REACTOS__ +#define RTFREE(rt) \ + if ((rt)->rt_refcnt <= 1) \ + rtfree(rt); \ + else \ + (rt)->rt_refcnt--; +#else +#define RTFREE(rt) rtfree(rt) +#endif + +struct route_cb route_cb; +struct rtstat rtstat; +struct radix_node_head *rt_tables[AF_MAX+1]; + +void route_init __P((void)); +int route_output __P((struct mbuf *, struct socket *)); +int route_usrreq __P((struct socket *, + int, struct mbuf *, struct mbuf *, struct mbuf *)); +void rt_ifmsg __P((struct ifnet *)); +void rt_maskedcopy __P((struct sockaddr *, + struct sockaddr *, struct sockaddr *)); +void rt_missmsg __P((int, struct rt_addrinfo *, int, int)); +void rt_newaddrmsg __P((int, struct ifaddr *, int, struct rtentry *)); +int rt_setgate __P((struct rtentry *, + struct sockaddr *, struct sockaddr *)); +void rt_setmetrics __P((u_long, struct rt_metrics *, struct rt_metrics *)); +void rtable_init __P((void **)); +void rtalloc __P((struct route *)); +void rtalloc_ign __P((struct route *, unsigned long)); +struct rtentry * + rtalloc1 __P((struct sockaddr *, int, unsigned long)); +void rtfree __P((struct rtentry *)); +int rtinit __P((struct ifaddr *, int, int)); +int rtioctl __P((int, caddr_t, struct proc *)); +void rtredirect __P((struct sockaddr *, struct sockaddr *, + struct sockaddr *, int, struct sockaddr *, struct rtentry **)); +int rtrequest __P((int, struct sockaddr *, + struct sockaddr *, struct sockaddr *, int, struct rtentry **)); +#endif + +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/if_ether.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/if_ether.h new file mode 100644 index 00000000000..057878f9ca1 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/if_ether.h @@ -0,0 +1,237 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)if_ether.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_IF_ETHER_H_ +#define _NETINET_IF_ETHER_H_ + +#include + +/* + * Structure of a 10Mb/s Ethernet header. + */ +struct ether_header { + u_char ether_dhost[6]; + u_char ether_shost[6]; + u_short ether_type; +}; + +/* + * Structure of a 48-bit Ethernet address. + */ +struct ether_addr { + u_char octet[6]; +}; + +#define ETHERTYPE_PUP 0x0200 /* PUP protocol */ +#define ETHERTYPE_IP 0x0800 /* IP protocol */ +#define ETHERTYPE_ARP 0x0806 /* Addr. resolution protocol */ +#define ETHERTYPE_REVARP 0x8035 /* reverse Addr. resolution protocol */ + +/* + * The ETHERTYPE_NTRAILER packet types starting at ETHERTYPE_TRAIL have + * (type-ETHERTYPE_TRAIL)*512 bytes of data followed + * by an ETHER type (as given above) and then the (variable-length) header. + */ +#define ETHERTYPE_TRAIL 0x1000 /* Trailer packet */ +#define ETHERTYPE_NTRAILER 16 + +#define ETHERMTU 1500 +#define ETHERMIN (60-14) + +#ifdef KERNEL +/* + * Macro to map an IP multicast address to an Ethernet multicast address. + * The high-order 25 bits of the Ethernet address are statically assigned, + * and the low-order 23 bits are taken from the low end of the IP address. + */ +#define ETHER_MAP_IP_MULTICAST(ipaddr, enaddr) \ + /* struct in_addr *ipaddr; */ \ + /* u_char enaddr[6]; */ \ +{ \ + (enaddr)[0] = 0x01; \ + (enaddr)[1] = 0x00; \ + (enaddr)[2] = 0x5e; \ + (enaddr)[3] = ((u_char *)ipaddr)[1] & 0x7f; \ + (enaddr)[4] = ((u_char *)ipaddr)[2]; \ + (enaddr)[5] = ((u_char *)ipaddr)[3]; \ +} +#endif + +/* + * Ethernet Address Resolution Protocol. + * + * See RFC 826 for protocol description. Structure below is adapted + * to resolving internet addresses. Field names used correspond to + * RFC 826. + */ +struct ether_arp { + struct arphdr ea_hdr; /* fixed-size header */ + u_char arp_sha[6]; /* sender hardware address */ + u_char arp_spa[4]; /* sender protocol address */ + u_char arp_tha[6]; /* target hardware address */ + u_char arp_tpa[4]; /* target protocol address */ +}; +#define arp_hrd ea_hdr.ar_hrd +#define arp_pro ea_hdr.ar_pro +#define arp_hln ea_hdr.ar_hln +#define arp_pln ea_hdr.ar_pln +#define arp_op ea_hdr.ar_op + + +/* + * Structure shared between the ethernet driver modules and + * the address resolution code. For example, each ec_softc or il_softc + * begins with this structure. + */ +struct arpcom { + struct ifnet ac_if; /* network-visible interface */ + u_char ac_enaddr[6]; /* ethernet hardware address */ + struct in_addr ac_ipaddr; /* copy of ip address- XXX */ + struct ether_multi *ac_multiaddrs; /* list of ether multicast addrs */ + int ac_multicnt; /* length of ac_multiaddrs list */ +}; + +struct llinfo_arp { + struct llinfo_arp *la_next; + struct llinfo_arp *la_prev; + struct rtentry *la_rt; + struct mbuf *la_hold; /* last packet until resolved/timeout */ + long la_asked; /* last time we QUERIED for this addr */ +#define la_timer la_rt->rt_rmx.rmx_expire /* deletion time in seconds */ +}; + +struct sockaddr_inarp { + u_char sin_len; + u_char sin_family; + u_short sin_port; + struct in_addr sin_addr; + struct in_addr sin_srcaddr; + u_short sin_tos; + u_short sin_other; +#define SIN_PROXY 1 +}; +/* + * IP and ethernet specific routing flags + */ +#define RTF_USETRAILERS RTF_PROTO1 /* use trailers */ +#define RTF_ANNOUNCE RTF_PROTO2 /* announce new arp entry */ + +#ifdef KERNEL +extern u_char etherbroadcastaddr[6]; +extern u_char ether_ipmulticast_min[6]; +extern u_char ether_ipmulticast_max[6]; +extern struct ifqueue arpintrq; + +struct llinfo_arp *arptnew __P((struct in_addr *)); +extern struct llinfo_arp llinfo_arp; /* head of the llinfo queue */ + +void arpwhohas __P((struct arpcom *, struct in_addr *)); +void arpintr __P((void)); +int arpresolve __P((struct arpcom *, struct rtentry *, struct mbuf *, + struct sockaddr *, u_char *, struct rtentry *)); +void arp_ifinit __P((struct arpcom *, struct ifaddr *)); + +int ether_addmulti __P((struct ifreq *, struct arpcom *)); +int ether_delmulti __P((struct ifreq *, struct arpcom *)); + +/* + * Ethernet multicast address structure. There is one of these for each + * multicast address or range of multicast addresses that we are supposed + * to listen to on a particular interface. They are kept in a linked list, + * rooted in the interface's arpcom structure. (This really has nothing to + * do with ARP, or with the Internet address family, but this appears to be + * the minimally-disrupting place to put it.) + */ +struct ether_multi { + u_char enm_addrlo[6]; /* low or only address of range */ + u_char enm_addrhi[6]; /* high or only address of range */ + struct arpcom *enm_ac; /* back pointer to arpcom */ + u_int enm_refcount; /* no. claims to this addr/range */ + struct ether_multi *enm_next; /* ptr to next ether_multi */ +}; + +/* + * Structure used by macros below to remember position when stepping through + * all of the ether_multi records. + */ +struct ether_multistep { + struct ether_multi *e_enm; +}; + +/* + * Macro for looking up the ether_multi record for a given range of Ethernet + * multicast addresses connected to a given arpcom structure. If no matching + * record is found, "enm" returns NULL. + */ +#define ETHER_LOOKUP_MULTI(addrlo, addrhi, ac, enm) \ + /* u_char addrlo[6]; */ \ + /* u_char addrhi[6]; */ \ + /* struct arpcom *ac; */ \ + /* struct ether_multi *enm; */ \ +{ \ + for ((enm) = (ac)->ac_multiaddrs; \ + (enm) != NULL && \ + (bcmp((enm)->enm_addrlo, (addrlo), 6) != 0 || \ + bcmp((enm)->enm_addrhi, (addrhi), 6) != 0); \ + (enm) = (enm)->enm_next); \ +} + +/* + * Macro to step through all of the ether_multi records, one at a time. + * The current position is remembered in "step", which the caller must + * provide. ETHER_FIRST_MULTI(), below, must be called to initialize "step" + * and get the first record. Both macros return a NULL "enm" when there + * are no remaining records. + */ +#define ETHER_NEXT_MULTI(step, enm) \ + /* struct ether_multistep step; */ \ + /* struct ether_multi *enm; */ \ +{ \ + if (((enm) = (step).e_enm) != NULL) \ + (step).e_enm = (enm)->enm_next; \ +} + +#define ETHER_FIRST_MULTI(step, ac, enm) \ + /* struct ether_multistep step; */ \ + /* struct arpcom *ac; */ \ + /* struct ether_multi *enm; */ \ +{ \ + (step).e_enm = (ac)->ac_multiaddrs; \ + ETHER_NEXT_MULTI((step), (enm)); \ +} + +#endif + +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/igmp_var.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/igmp_var.h new file mode 100644 index 00000000000..fee5e431cd9 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/igmp_var.h @@ -0,0 +1,91 @@ +/* + * Copyright (c) 1988 Stephen Deering. + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Stephen Deering of Stanford University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)igmp_var.h 8.1 (Berkeley) 7/19/93 + */ + +#ifndef _NETINET_IGMP_VAR_H_ +#define _NETINET_IGMP_VAR_H_ + +/* + * Internet Group Management Protocol (IGMP), + * implementation-specific definitions. + * + * Written by Steve Deering, Stanford, May 1988. + * + * MULTICAST Revisiob: 3.3.1.1 + */ + +struct igmpstat { + u_int igps_rcv_total; /* total IGMP messages received */ + u_int igps_rcv_tooshort; /* received with too few bytes */ + u_int igps_rcv_badsum; /* received with bad checksum */ + u_int igps_rcv_queries; /* received membership queries */ + u_int igps_rcv_badqueries; /* received invalid queries */ + u_int igps_rcv_reports; /* received membership reports */ + u_int igps_rcv_badreports; /* received invalid reports */ + u_int igps_rcv_ourreports; /* received reports for our groups */ + u_int igps_snd_reports; /* sent membership reports */ +}; + +#ifdef KERNEL +extern struct igmpstat igmpstat; + +#define IGMP_RANDOM_DELAY(X) (random() % (X) + 1) + +void igmp_init __P((void)); +void igmp_input __P((struct mbuf *, int)); +void igmp_joingroup __P((struct in_multi *)); +void igmp_leavegroup __P((struct in_multi *)); +void igmp_fasttimo __P((void)); +void igmp_slowtimo __P((void)); +int igmp_sysctl(int *, u_int, void *, size_t *, void *, size_t); +#endif + +/* + * Names for IGMP sysctl objects + */ +#define IGMPCTL_STATS 1 /* statistics (read-only) */ +#define IGMPCTL_MAXID 2 + +#define IGMPCTL_NAMES { \ + { 0, 0 }, \ + { "stats", CTLTYPE_STRUCT }, \ +} + +#endif + + diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in.h new file mode 100644 index 00000000000..39fe9675ff8 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in.h @@ -0,0 +1,262 @@ +/* + * Copyright (c) 1982, 1986, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)in.h 8.3 (Berkeley) 1/3/94 + */ + +#ifndef _NETINET_IN_H_ +#define _NETINET_IN_H_ + +/* + * Constants and structures defined by the internet system, + * Per RFC 790, September 1981, and numerous additions. + */ + +/* + * Protocols + */ +#define IPPROTO_IP 0 /* dummy for IP */ +#define IPPROTO_ICMP 1 /* control message protocol */ +#define IPPROTO_IGMP 2 /* group mgmt protocol */ +#define IPPROTO_GGP 3 /* gateway^2 (deprecated) */ +#define IPPROTO_IPIP 4 /* IP encapsulation in IP */ +#define IPPROTO_TCP 6 /* tcp */ +#define IPPROTO_EGP 8 /* exterior gateway protocol */ +#define IPPROTO_PUP 12 /* pup */ +#define IPPROTO_UDP 17 /* user datagram protocol */ +#define IPPROTO_IDP 22 /* xns idp */ +#define IPPROTO_TP 29 /* tp-4 w/ class negotiation */ +#define IPPROTO_RSVP 46 /* resource reservation */ +#define IPPROTO_EON 80 /* ISO cnlp */ +#define IPPROTO_ENCAP 98 /* encapsulation header */ + +#define IPPROTO_RAW 255 /* raw IP packet */ +#define IPPROTO_MAX 256 + + +/* + * Local port number conventions: + * Ports < IPPORT_RESERVED are reserved for + * privileged processes (e.g. root). + * Ports > IPPORT_USERRESERVED are reserved + * for servers, not necessarily privileged. + */ +#define IPPORT_RESERVED 1024 +#define IPPORT_USERRESERVED 5000 + +/* + * Internet address (a structure for historical reasons) + */ +struct in_addr { + u_long s_addr; +}; + +/* + * Definitions of bits in internet address integers. + * On subnets, the decomposition of addresses to host and net parts + * is done according to subnet mask, not the masks here. + */ +#define IN_CLASSA(i) (((long)(i) & 0x80000000) == 0) +#define IN_CLASSA_NET 0xff000000 +#define IN_CLASSA_NSHIFT 24 +#define IN_CLASSA_HOST 0x00ffffff +#define IN_CLASSA_MAX 128 + +#define IN_CLASSB(i) (((long)(i) & 0xc0000000) == 0x80000000) +#define IN_CLASSB_NET 0xffff0000 +#define IN_CLASSB_NSHIFT 16 +#define IN_CLASSB_HOST 0x0000ffff +#define IN_CLASSB_MAX 65536 + +#define IN_CLASSC(i) (((long)(i) & 0xe0000000) == 0xc0000000) +#define IN_CLASSC_NET 0xffffff00 +#define IN_CLASSC_NSHIFT 8 +#define IN_CLASSC_HOST 0x000000ff + +#define IN_CLASSD(i) (((long)(i) & 0xf0000000) == 0xe0000000) +#define IN_CLASSD_NET 0xf0000000 /* These ones aren't really */ +#define IN_CLASSD_NSHIFT 28 /* net and host fields, but */ +#define IN_CLASSD_HOST 0x0fffffff /* routing needn't know. */ +#define IN_MULTICAST(i) IN_CLASSD(i) + +#define IN_EXPERIMENTAL(i) (((long)(i) & 0xf0000000) == 0xf0000000) +#define IN_BADCLASS(i) (((long)(i) & 0xf0000000) == 0xf0000000) + +#define INADDR_ANY (u_long)0x00000000 +#define INADDR_BROADCAST (u_long)0xffffffff /* must be masked */ +#ifndef KERNEL +#define INADDR_NONE 0xffffffff /* -1 return */ +#endif + +#define INADDR_UNSPEC_GROUP (u_long)0xe0000000 /* 224.0.0.0 */ +#define INADDR_ALLHOSTS_GROUP (u_long)0xe0000001 /* 224.0.0.1 */ +#define INADDR_MAX_LOCAL_GROUP (u_long)0xe00000ff /* 224.0.0.255 */ + +#define IN_LOOPBACKNET 127 /* official! */ + +/* + * Socket address, internet style. + */ +struct sockaddr_in { + u_char sin_len; + u_char sin_family; + u_short sin_port; + struct in_addr sin_addr; + char sin_zero[8]; +}; + +/* + * Structure used to describe IP options. + * Used to store options internally, to pass them to a process, + * or to restore options retrieved earlier. + * The ip_dst is used for the first-hop gateway when using a source route + * (this gets put into the header proper). + */ +struct ip_opts { + struct in_addr ip_dst; /* first hop, 0 w/o src rt */ + char ip_opts[40]; /* actually variable in size */ +}; + +/* + * Options for use with [gs]etsockopt at the IP level. + * First word of comment is data type; bool is stored in int. + */ +#define IP_OPTIONS 1 /* buf/ip_opts; set/get IP options */ +#define IP_HDRINCL 2 /* int; header is included with data */ +#define IP_TOS 3 /* int; IP type of service and preced. */ +#define IP_TTL 4 /* int; IP time to live */ +#define IP_RECVOPTS 5 /* bool; receive all IP opts w/dgram */ +#define IP_RECVRETOPTS 6 /* bool; receive IP opts for response */ +#define IP_RECVDSTADDR 7 /* bool; receive IP dst addr w/dgram */ +#define IP_RETOPTS 8 /* ip_opts; set/get IP options */ +#define IP_MULTICAST_IF 9 /* u_char; set/get IP multicast i/f */ +#define IP_MULTICAST_TTL 10 /* u_char; set/get IP multicast ttl */ +#define IP_MULTICAST_LOOP 11 /* u_char; set/get IP multicast loopback */ +#define IP_ADD_MEMBERSHIP 12 /* ip_mreq; add an IP group membership */ +#define IP_DROP_MEMBERSHIP 13 /* ip_mreq; drop an IP group membership */ +#define IP_MULTICAST_VIF 14 /* set/get IP mcast virt. iface */ +#define IP_RSVP_ON 15 /* enable RSVP in kernel */ +#define IP_RSVP_OFF 16 /* disable RSVP in kernel */ +#define IP_RSVP_VIF_ON 17 /* set RSVP per-vif socket */ +#define IP_RSVP_VIF_OFF 18 /* unset RSVP per-vif socket */ + +/* + * Defaults and limits for options + */ +#define IP_DEFAULT_MULTICAST_TTL 1 /* normally limit m'casts to 1 hop */ +#define IP_DEFAULT_MULTICAST_LOOP 1 /* normally hear sends if a member */ +#define IP_MAX_MEMBERSHIPS 20 /* per socket */ + +/* + * Argument structure for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP. + */ +struct ip_mreq { + struct in_addr imr_multiaddr; /* IP multicast address of group */ + struct in_addr imr_interface; /* local IP address of interface */ +}; + +/* + * Definitions for inet sysctl operations. + * + * Third level is protocol number. + * Fourth level is desired variable within that protocol. + */ +#define IPPROTO_MAXID (IPPROTO_IDP + 1) /* don't list to IPPROTO_MAX */ + +#define CTL_IPPROTO_NAMES { \ + { "ip", CTLTYPE_NODE }, \ + { "icmp", CTLTYPE_NODE }, \ + { "igmp", CTLTYPE_NODE }, \ + { "ggp", CTLTYPE_NODE }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { "tcp", CTLTYPE_NODE }, \ + { 0, 0 }, \ + { "egp", CTLTYPE_NODE }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { "pup", CTLTYPE_NODE }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { "udp", CTLTYPE_NODE }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { "idp", CTLTYPE_NODE }, \ +} + +/* + * Names for IP sysctl objects + */ +#define IPCTL_FORWARDING 1 /* act as router */ +#define IPCTL_SENDREDIRECTS 2 /* may send redirects when forwarding */ +#define IPCTL_DEFTTL 3 /* default TTL */ +#ifdef notyet +#define IPCTL_DEFMTU 4 /* default MTU */ +#define IPCTL_RTEXPIRE 5 /* cloned route expiration time */ +#define IPCTL_RTMINEXPIRE 6 /* min value for expiration time */ +#define IPCTL_RTMAXCACHE 7 /* trigger level for dynamic expire */ +#define IPCTL_SOURCEROUTE 8 /* may perform source routes */ +#define IPCTL_MAXID 9 +#endif + +#define IPCTL_NAMES { \ + { 0, 0 }, \ + { "forwarding", CTLTYPE_INT }, \ + { "redirect", CTLTYPE_INT }, \ + { "ttl", CTLTYPE_INT }, \ + { "mtu", CTLTYPE_INT }, \ + { "rtexpire", CTLTYPE_INT }, \ + { "rtminexpire", CTLTYPE_INT }, \ + { "rtmaxcache", CTLTYPE_INT }, \ + { "sourceroute", CTLTYPE_INT }, \ +} + + +#ifdef KERNEL +struct ifnet; struct mbuf; /* forward declarations for Standard C */ + +int in_broadcast __P((struct in_addr, struct ifnet *)); +int in_canforward __P((struct in_addr)); +int in_cksum __P((struct mbuf *, int)); +int in_localaddr __P((struct in_addr)); +u_long in_netof __P((struct in_addr)); +void in_socktrim __P((struct sockaddr_in *)); +char *inet_ntoa __P((struct in_addr)); /* in libkern */ +#endif + +#endif + diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in_pcb.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in_pcb.h new file mode 100644 index 00000000000..f40058a4f20 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in_pcb.h @@ -0,0 +1,107 @@ +/* + * Copyright (c) 1982, 1986, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)in_pcb.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_IN_PCB_H_ +#define _NETINET_IN_PCB_H_ + +/* + * Common structure pcb for internet protocol implementation. + * Here are stored pointers to local and foreign host table + * entries, local and foreign socket numbers, and pointers + * up (to a socket structure) and down (to a protocol-specific) + * control block. + */ +LIST_HEAD(inpcbhead, inpcb); + +struct inpcb { + LIST_ENTRY(inpcb) inp_list; /* list for all PCBs of this proto */ + LIST_ENTRY(inpcb) inp_hash; /* hash list */ + struct inpcbinfo *inp_pcbinfo; + struct in_addr inp_faddr; /* foreign host table entry */ + u_short inp_fport; /* foreign port */ + struct in_addr inp_laddr; /* local host table entry */ + u_short inp_lport; /* local port */ + struct socket *inp_socket; /* back pointer to socket */ + caddr_t inp_ppcb; /* pointer to per-protocol pcb */ + struct route inp_route; /* placeholder for routing entry */ + int inp_flags; /* generic IP/datagram flags */ + struct ip inp_ip; /* header prototype; should have more */ + struct mbuf *inp_options; /* IP options */ + struct ip_moptions *inp_moptions; /* IP multicast options */ +}; + +struct inpcbinfo { + struct inpcbhead *listhead; + struct inpcbhead *hashbase; + unsigned long hashsize; + unsigned short lastport; +}; + +/* flags in inp_flags: */ +#define INP_RECVOPTS 0x01 /* receive incoming IP options */ +#define INP_RECVRETOPTS 0x02 /* receive IP options for reply */ +#define INP_RECVDSTADDR 0x04 /* receive IP dst address */ +#define INP_CONTROLOPTS (INP_RECVOPTS|INP_RECVRETOPTS|INP_RECVDSTADDR) +#define INP_HDRINCL 0x08 /* user supplies entire IP header */ + +#define INPLOOKUP_WILDCARD 1 + +#define sotoinpcb(so) ((struct inpcb *)(so)->so_pcb) + +#ifdef KERNEL +void in_losing __P((struct inpcb *)); +int in_pcballoc __P((struct socket *, struct inpcbinfo *)); +int in_pcbbind __P((struct inpcb *, struct mbuf *)); +int in_pcbconnect __P((struct inpcb *, struct mbuf *)); +void in_pcbdetach __P((struct inpcb *)); +void in_pcbdisconnect __P((struct inpcb *)); +void in_pcbinshash __P((struct inpcb *)); +int in_pcbladdr __P((struct inpcb *, struct mbuf *, + struct sockaddr_in *)); /* XXX Reactos * <- ** */ +struct inpcb * + in_pcblookup __P((struct inpcbhead *, + struct in_addr, u_int, struct in_addr, u_int, int)); +struct inpcb * + in_pcblookuphash __P((struct inpcbinfo *, + struct in_addr, u_int, struct in_addr, u_int)); +void in_pcbnotify __P((struct inpcbhead *, struct sockaddr *, + u_int, struct in_addr, u_int, int, void (*)(struct inpcb *, int))); +void in_pcbrehash __P((struct inpcb *)); +void in_rtchange __P((struct inpcb *, int)); +void in_setpeeraddr __P((struct inpcb *, struct mbuf *)); +void in_setsockaddr __P((struct inpcb *, struct mbuf *)); +#endif + +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in_systm.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in_systm.h new file mode 100644 index 00000000000..6c75203f60c --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in_systm.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)in_systm.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_IN_SYSTM_H_ +#define _NETINET_IN_SYSTM_H_ + +/* + * Miscellaneous internetwork + * definitions for kernel. + */ + +/* + * Network types. + * + * Internally the system keeps counters in the headers with the bytes + * swapped so that VAX instructions will work on them. It reverses + * the bytes before transmission at each protocol level. The n_ types + * represent the types with the bytes in ``high-ender'' order. + */ +typedef u_short n_short; /* short as received from the net */ +typedef u_long n_long; /* long as received from the net */ + +typedef u_long n_time; /* ms since 00:00 GMT, byte rev */ + +#ifdef KERNEL +n_time iptime __P((void)); +#endif + +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in_var.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in_var.h new file mode 100644 index 00000000000..bb6c9cc5375 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in_var.h @@ -0,0 +1,233 @@ +/* + * Copyright (c) 1985, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)in_var.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_IN_VAR_H_ +#define _NETINET_IN_VAR_H_ + +#include +/* + * Interface address, Internet version. One of these structures + * is allocated for each interface with an Internet address. + * The ifaddr structure contains the protocol-independent part + * of the structure and is assumed to be first. + */ +struct in_ifaddr { + struct ifaddr ia_ifa; /* protocol-independent info */ +#define ia_ifp ia_ifa.ifa_ifp +#define ia_flags ia_ifa.ifa_flags + /* ia_{,sub}net{,mask} in host order */ + u_long ia_net; /* network number of interface */ + u_long ia_netmask; /* mask of net part */ + u_long ia_subnet; /* subnet number, including net */ + u_long ia_subnetmask; /* mask of subnet part */ + struct in_addr ia_netbroadcast; /* to recognize net broadcasts */ + struct in_ifaddr *ia_next; /* next in list of internet addresses */ + struct sockaddr_in ia_addr; /* reserve space for interface name */ + struct sockaddr_in ia_dstaddr; /* reserve space for broadcast addr */ +#define ia_broadaddr ia_dstaddr + struct sockaddr_in ia_sockmask; /* reserve space for general netmask */ + LIST_HEAD(in_multihead, in_multi) ia_multiaddrs; + /* list of multicast addresses */ +}; + +struct in_aliasreq { + char ifra_name[IFNAMSIZ]; /* if name, e.g. "en0" */ + struct sockaddr_in ifra_addr; + struct sockaddr_in ifra_broadaddr; +#define ifra_dstaddr ifra_broadaddr + struct sockaddr_in ifra_mask; +}; +/* + * Given a pointer to an in_ifaddr (ifaddr), + * return a pointer to the addr as a sockaddr_in. + */ +#define IA_SIN(ia) (&(((struct in_ifaddr *)(ia))->ia_addr)) +#define IA_DSTSIN(ia) (&(((struct in_ifaddr *)(ia))->ia_dstaddr)) + +#define IN_LNAOF(in, ifa) \ + ((ntohl((in).s_addr) & ~((struct in_ifaddr *)(ifa)->ia_subnetmask)) + + +#ifdef KERNEL +extern struct in_ifaddr *in_ifaddr; +extern struct ifqueue ipintrq; /* ip packet input queue */ +extern struct in_addr zeroin_addr; +extern u_char inetctlerrmap[]; +extern int rtq_reallyold; /* XXX */ +extern int rtq_minreallyold; /* XXX */ +extern int rtq_toomany; /* XXX */ + +/* + * Macro for finding the interface (ifnet structure) corresponding to one + * of our IP addresses. + */ +#define INADDR_TO_IFP(addr, ifp) \ + /* struct in_addr addr; */ \ + /* struct ifnet *ifp; */ \ +{ \ + register struct in_ifaddr *ia; \ +\ + for (ia = in_ifaddr; \ + ia != NULL && ((ia->ia_ifp->if_flags & IFF_POINTOPOINT)? \ + IA_DSTSIN(ia):IA_SIN(ia))->sin_addr.s_addr != (addr).s_addr; \ + ia = ia->ia_next) \ + continue; \ + if (ia == NULL) \ + for (ia = in_ifaddr; \ + ia != NULL; \ + ia = ia->ia_next) \ + if (ia->ia_ifp->if_flags & IFF_POINTOPOINT && \ + IA_SIN(ia)->sin_addr.s_addr == (addr).s_addr) \ + break; \ + (ifp) = (ia == NULL) ? NULL : ia->ia_ifp; \ +} + +/* + * Macro for finding the internet address structure (in_ifaddr) corresponding + * to a given interface (ifnet structure). + */ +#define IFP_TO_IA(ifp, ia) \ + /* struct ifnet *ifp; */ \ + /* struct in_ifaddr *ia; */ \ +{ \ + for ((ia) = in_ifaddr; \ + (ia) != NULL && (ia)->ia_ifp != (ifp); \ + (ia) = (ia)->ia_next) \ + continue; \ +} +#endif + +/* + * This information should be part of the ifnet structure but we don't wish + * to change that - as it might break a number of things + */ + +struct router_info { + struct ifnet *ifp; + int type; /* type of router which is querier on this interface */ + int time; /* # of slow timeouts since last old query */ + struct router_info *next; +}; + +/* + * Internet multicast address structure. There is one of these for each IP + * multicast group to which this host belongs on a given network interface. + * They are kept in a linked list, rooted in the interface's in_ifaddr + * structure. + */ +struct in_multi { + LIST_ENTRY(in_multi) inm_entry; /* list glue */ + struct in_addr inm_addr; /* IP multicast address */ + struct ifnet *inm_ifp; /* back pointer to ifnet */ + struct in_ifaddr *inm_ia; /* back pointer to in_ifaddr */ + u_int inm_refcount; /* no. membership claims by sockets */ + u_int inm_timer; /* IGMP membership report timer */ + u_int inm_state; /* state of the membership */ + struct router_info *inm_rti; /* router info*/ +}; + +#ifdef KERNEL +/* + * Structure used by macros below to remember position when stepping through + * all of the in_multi records. + */ +struct in_multistep { + struct in_ifaddr *i_ia; + struct in_multi *i_inm; +}; + +/* + * Macro for looking up the in_multi record for a given IP multicast address + * on a given interface. If no matching record is found, "inm" returns NULL. + */ +#define IN_LOOKUP_MULTI(addr, ifp, inm) \ + /* struct in_addr addr; */ \ + /* struct ifnet *ifp; */ \ + /* struct in_multi *inm; */ \ +{ \ + register struct in_ifaddr *ia; \ +\ + IFP_TO_IA((ifp), ia); \ + if (ia == NULL) \ + (inm) = NULL; \ + else \ + for ((inm) = ia->ia_multiaddrs.lh_first; \ + (inm) != NULL && (inm)->inm_addr.s_addr != (addr).s_addr; \ + (inm) = inm->inm_entry.le_next) \ + continue; \ +} + +/* + * Macro to step through all of the in_multi records, one at a time. + * The current position is remembered in "step", which the caller must + * provide. IN_FIRST_MULTI(), below, must be called to initialize "step" + * and get the first record. Both macros return a NULL "inm" when there + * are no remaining records. + */ +#define IN_NEXT_MULTI(step, inm) \ + /* struct in_multistep step; */ \ + /* struct in_multi *inm; */ \ +{ \ + if (((inm) = (step).i_inm) != NULL) \ + (step).i_inm = (inm)->inm_entry.le_next; \ + else \ + while ((step).i_ia != NULL) { \ + (inm) = (step).i_ia->ia_multiaddrs.lh_first; \ + (step).i_ia = (step).i_ia->ia_next; \ + if ((inm) != NULL) { \ + (step).i_inm = (inm)->inm_entry.le_next; \ + break; \ + } \ + } \ +} + +#define IN_FIRST_MULTI(step, inm) \ + /* struct in_multistep step; */ \ + /* struct in_multi *inm; */ \ +{ \ + (step).i_ia = in_ifaddr; \ + (step).i_inm = NULL; \ + IN_NEXT_MULTI((step), (inm)); \ +} + +int in_ifinit __P((struct ifnet *, + struct in_ifaddr *, struct sockaddr_in *, int)); +struct in_multi *in_addmulti __P((struct in_addr *, struct ifnet *)); +void in_delmulti __P((struct in_multi *)); +void in_ifscrub __P((struct ifnet *, struct in_ifaddr *)); +int in_control __P((struct socket *, int, caddr_t, struct ifnet *)); + +#endif +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip.h new file mode 100644 index 00000000000..6b216deceff --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip.h @@ -0,0 +1,174 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ip.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_IP_H_ +#define _NETINET_IP_H_ + +/* + * Definitions for internet protocol version 4. + * Per RFC 791, September 1981. + */ +#define IPVERSION 4 + +/* + * Structure of an internet header, naked of options. + * + * We declare ip_len and ip_off to be short, rather than u_short + * pragmatically since otherwise unsigned comparisons can result + * against negative integers quite easily, and fail in subtle ways. + */ +struct ip { +#if BYTE_ORDER == LITTLE_ENDIAN + u_char ip_hl:4, /* header length */ + ip_v:4; /* version */ +#endif +#if BYTE_ORDER == BIG_ENDIAN + u_char ip_v:4, /* version */ + ip_hl:4; /* header length */ +#endif + u_char ip_tos; /* type of service */ + short ip_len; /* total length */ + u_short ip_id; /* identification */ + short ip_off; /* fragment offset field */ +#define IP_DF 0x4000 /* dont fragment flag */ +#define IP_MF 0x2000 /* more fragments flag */ +#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ + u_char ip_ttl; /* time to live */ + u_char ip_p; /* protocol */ + u_short ip_sum; /* checksum */ + struct in_addr ip_src,ip_dst; /* source and dest address */ +}; + +#define IP_MAXPACKET 65535 /* maximum packet size */ + +/* + * Definitions for IP type of service (ip_tos) + */ +#define IPTOS_LOWDELAY 0x10 +#define IPTOS_THROUGHPUT 0x08 +#define IPTOS_RELIABILITY 0x04 +#define IPTOS_MINCOST 0x02 + +/* + * Definitions for IP precedence (also in ip_tos) (hopefully unused) + */ +#define IPTOS_PREC_NETCONTROL 0xe0 +#define IPTOS_PREC_INTERNETCONTROL 0xc0 +#define IPTOS_PREC_CRITIC_ECP 0xa0 +#define IPTOS_PREC_FLASHOVERRIDE 0x80 +#define IPTOS_PREC_FLASH 0x60 +#define IPTOS_PREC_IMMEDIATE 0x40 +#define IPTOS_PREC_PRIORITY 0x20 +#define IPTOS_PREC_ROUTINE 0x00 + +/* + * Definitions for options. + */ +#define IPOPT_COPIED(o) ((o)&0x80) +#define IPOPT_CLASS(o) ((o)&0x60) +#define IPOPT_NUMBER(o) ((o)&0x1f) + +#define IPOPT_CONTROL 0x00 +#define IPOPT_RESERVED1 0x20 +#define IPOPT_DEBMEAS 0x40 +#define IPOPT_RESERVED2 0x60 + +#define IPOPT_EOL 0 /* end of option list */ +#define IPOPT_NOP 1 /* no operation */ + +#define IPOPT_RR 7 /* record packet route */ +#define IPOPT_TS 68 /* timestamp */ +#define IPOPT_SECURITY 130 /* provide s,c,h,tcc */ +#define IPOPT_LSRR 131 /* loose source route */ +#define IPOPT_SATID 136 /* satnet id */ +#define IPOPT_SSRR 137 /* strict source route */ + +/* + * Offsets to fields in options other than EOL and NOP. + */ +#define IPOPT_OPTVAL 0 /* option ID */ +#define IPOPT_OLEN 1 /* option length */ +#define IPOPT_OFFSET 2 /* offset within option */ +#define IPOPT_MINOFF 4 /* min value of above */ + +/* + * Time stamp option structure. + */ +struct ip_timestamp { + u_char ipt_code; /* IPOPT_TS */ + u_char ipt_len; /* size of structure (variable) */ + u_char ipt_ptr; /* index of current entry */ +#if BYTE_ORDER == LITTLE_ENDIAN + u_char ipt_flg:4, /* flags, see below */ + ipt_oflw:4; /* overflow counter */ +#endif +#if BYTE_ORDER == BIG_ENDIAN + u_char ipt_oflw:4, /* overflow counter */ + ipt_flg:4; /* flags, see below */ +#endif + union ipt_timestamp { + n_long ipt_time[1]; + struct ipt_ta { + struct in_addr ipt_addr; + n_long ipt_time; + } ipt_ta[1]; + } ipt_timestamp; +}; + +/* flag bits for ipt_flg */ +#define IPOPT_TS_TSONLY 0 /* timestamps only */ +#define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */ +#define IPOPT_TS_PRESPEC 3 /* specified modules only */ + +/* bits for security (not byte swapped) */ +#define IPOPT_SECUR_UNCLASS 0x0000 +#define IPOPT_SECUR_CONFID 0xf135 +#define IPOPT_SECUR_EFTO 0x789a +#define IPOPT_SECUR_MMMM 0xbc4d +#define IPOPT_SECUR_RESTR 0xaf13 +#define IPOPT_SECUR_SECRET 0xd788 +#define IPOPT_SECUR_TOPSECRET 0x6bc5 + +/* + * Internet implementation parameters. + */ +#define MAXTTL 255 /* maximum time to live (seconds) */ +#define IPDEFTTL 64 /* default ttl, from RFC 1340 */ +#define IPFRAGTTL 60 /* time to live for frags, slowhz */ +#define IPTTLDEC 1 /* subtracted when forwarding */ + +#define IP_MSS 576 /* default maximum segment size */ + +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip_fw.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip_fw.h new file mode 100644 index 00000000000..e102a864225 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip_fw.h @@ -0,0 +1,145 @@ +/* + * Copyright (c) 1993 Daniel Boulet + * Copyright (c) 1994 Ugen J.S.Antsilevich + * + * Redistribution and use in source forms, with and without modification, + * are permitted provided that this entire comment appears intact. + * + * Redistribution in binary form may occur without any restrictions. + * Obviously, it would be nice if you gave credit where credit is due + * but requiring it would be too onerous. + * + * This software is provided ``AS IS'' without any warranties of any kind. + * + */ + +/* + * Format of an IP firewall descriptor + * + * fw_src, fw_dst, fw_smsk, fw_dmsk are always stored in network byte order. + * fw_flg and fw_n*p are stored in host byte order (of course). + * Port numbers are stored in HOST byte order. + */ +#ifndef _IP_FW_H +#define _IP_FW_H + +struct ip_fw { + u_long fw_pcnt,fw_bcnt; /* Packet and byte counters */ + struct in_addr fw_src, fw_dst; /* Source and destination IP addr */ + struct in_addr fw_smsk, fw_dmsk; /* Mask for src and dest IP addr */ + union { + struct in_addr fu_via_ip; + struct { +#define FW_IFNLEN 6 /* To keep structure on 2^x boundary */ + char fu_via_name[FW_IFNLEN]; + short fu_via_unit; + } fu_via_if; + } fu_via_un; +#define fw_via_ip fu_via_un.fu_via_ip +#define fw_via_name fu_via_un.fu_via_if.fu_via_name +#define fw_via_unit fu_via_un.fu_via_if.fu_via_unit + u_short fw_number; + u_short fw_flg; /* Flags word */ + u_short fw_nsp, fw_ndp; /* N'of src ports and # of dst ports */ + /* in ports array (dst ports follow */ + /* src ports; max of 10 ports in all; */ + /* count of 0 means match all ports) */ +#define IP_FW_MAX_PORTS 10 /* A reasonable maximum */ + u_short fw_pts[IP_FW_MAX_PORTS]; /* Array of port numbers to match */ + u_char fw_ipopt,fw_ipnopt; /* IP options set/unset */ + u_char fw_tcpf,fw_tcpnf; /* TCP flags set/unset */ +#define IP_FW_ICMPTYPES_DIM (256 / (sizeof(unsigned) * 8)) + unsigned fw_icmptypes[IP_FW_ICMPTYPES_DIM]; /* ICMP types bitmap */ + long timestamp; /* timestamp (tv_sec) of last match */ +}; + +struct ip_fw_chain { + LIST_ENTRY(ip_fw_chain) chain; + struct ip_fw *rule; +}; + +/* + * Values for "flags" field . + */ + +#define IP_FW_F_ALL 0x0000 /* This is a universal packet rule */ +#define IP_FW_F_TCP 0x0001 /* This is a TCP packet rule */ +#define IP_FW_F_UDP 0x0002 /* This is a UDP packet rule */ +#define IP_FW_F_ICMP 0x0003 /* This is a ICMP packet rule */ +#define IP_FW_F_KIND 0x0003 /* Mask to isolate rule kind */ + +#define IP_FW_F_IN 0x0004 /* Inbound */ +#define IP_FW_F_OUT 0x0008 /* Outbound */ + +#define IP_FW_F_ACCEPT 0x0010 /* This is an accept rule */ +#define IP_FW_F_COUNT 0x0020 /* This is an accept rule */ +#define IP_FW_F_PRN 0x0040 /* Print if this rule matches */ +#define IP_FW_F_ICMPRPL 0x0080 /* Send back icmp unreachable packet */ + +#define IP_FW_F_SRNG 0x0100 /* The first two src ports are a min * + * and max range (stored in host byte * + * order). */ + +#define IP_FW_F_DRNG 0x0200 /* The first two dst ports are a min * + * and max range (stored in host byte * + * order). */ + +#define IP_FW_F_IFNAME 0x0400 /* Use interface name/unit (not IP) */ + +#define IP_FW_F_FRAG 0x0800 /* Fragment */ + +#define IP_FW_F_ICMPBIT 0x1000 /* ICMP type bitmap is valid */ + +#define IP_FW_F_IFUWILD 0x2000 /* Match all interface units */ + +#define IP_FW_F_MASK 0x3FFF /* All possible flag bits mask */ + +/* + * Definitions for IP option names. + */ +#define IP_FW_IPOPT_LSRR 0x01 +#define IP_FW_IPOPT_SSRR 0x02 +#define IP_FW_IPOPT_RR 0x04 +#define IP_FW_IPOPT_TS 0x08 + +/* + * Definitions for TCP flags. + */ +#define IP_FW_TCPF_FIN TH_FIN +#define IP_FW_TCPF_SYN TH_SYN +#define IP_FW_TCPF_RST TH_RST +#define IP_FW_TCPF_PSH TH_PUSH +#define IP_FW_TCPF_ACK TH_ACK +#define IP_FW_TCPF_URG TH_URG +#define IP_FW_TCPF_ESTAB 0x40 + +/* + * New IP firewall options for [gs]etsockopt at the RAW IP level. + */ +#define IP_FW_BASE_CTL 50 + +#define IP_FW_ADD (IP_FW_BASE_CTL+0) +#define IP_FW_DEL (IP_FW_BASE_CTL+1) +#define IP_FW_FLUSH (IP_FW_BASE_CTL+2) +#define IP_FW_ZERO (IP_FW_BASE_CTL+3) +#define IP_FW_GET (IP_FW_BASE_CTL+4) + +/* + * Main firewall chains definitions and global var's definitions. + */ +#ifdef KERNEL + +/* + * Function pointers. + */ +extern int (*ip_fw_chk_ptr)(struct mbuf *, struct ip *,struct ifnet *, int dir); +extern int (*ip_fw_ctl_ptr)(int,struct mbuf **); + +/* + * Function definitions. + */ +void ip_fw_init(void); + +#endif /* KERNEL */ + +#endif /* _IP_FW_H */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip_icmp.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip_icmp.h new file mode 100644 index 00000000000..a4b49c36706 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip_icmp.h @@ -0,0 +1,184 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ip_icmp.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_IP_ICMP_H_ +#define _NETINET_IP_ICMP_H_ + +/* + * Interface Control Message Protocol Definitions. + * Per RFC 792, September 1981. + */ + +/* + * Internal of an ICMP Router Advertisement + */ +struct icmp_ra_addr { + u_int32_t ira_addr; + u_int32_t ira_preference; +}; + +/* + * Structure of an icmp header. + */ +struct icmp { + u_char icmp_type; /* type of message, see below */ + u_char icmp_code; /* type sub code */ + u_short icmp_cksum; /* ones complement cksum of struct */ + union { + u_char ih_pptr; /* ICMP_PARAMPROB */ + struct in_addr ih_gwaddr; /* ICMP_REDIRECT */ + struct ih_idseq { + n_short icd_id; + n_short icd_seq; + } ih_idseq; + int ih_void; + + /* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */ + struct ih_pmtu { + n_short ipm_void; + n_short ipm_nextmtu; + } ih_pmtu; + + struct ih_rtradv { + u_char irt_num_addrs; + u_char irt_wpa; + u_int16_t irt_lifetime; + } ih_rtradv; + } icmp_hun; +#define icmp_pptr icmp_hun.ih_pptr +#define icmp_gwaddr icmp_hun.ih_gwaddr +#define icmp_id icmp_hun.ih_idseq.icd_id +#define icmp_seq icmp_hun.ih_idseq.icd_seq +#define icmp_void icmp_hun.ih_void +#define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void +#define icmp_nextmtu icmp_hun.ih_pmtu.ipm_nextmtu +#define icmp_num_addrs icmp_hun.ih_rtradv.irt_num_addrs +#define icmp_wpa icmp_hun.ih_rtradv.irt_wpa +#define icmp_lifetime icmp_hun.ih_rtradv.irt_lifetime + union { + struct id_ts { + n_time its_otime; + n_time its_rtime; + n_time its_ttime; + } id_ts; + struct id_ip { + struct ip idi_ip; + /* options and then 64 bits of data */ + } id_ip; + struct icmp_ra_addr id_radv; + u_long id_mask; + char id_data[1]; + } icmp_dun; +#define icmp_otime icmp_dun.id_ts.its_otime +#define icmp_rtime icmp_dun.id_ts.its_rtime +#define icmp_ttime icmp_dun.id_ts.its_ttime +#define icmp_ip icmp_dun.id_ip.idi_ip +#define icmp_radv icmp_dun.id_radv +#define icmp_mask icmp_dun.id_mask +#define icmp_data icmp_dun.id_data +}; + +/* + * Lower bounds on packet lengths for various types. + * For the error advice packets must first insure that the + * packet is large enough to contain the returned ip header. + * Only then can we do the check to see if 64 bits of packet + * data have been returned, since we need to check the returned + * ip header length. + */ +#define ICMP_MINLEN 8 /* abs minimum */ +#define ICMP_TSLEN (8 + 3 * sizeof (n_time)) /* timestamp */ +#define ICMP_MASKLEN 12 /* address mask */ +#define ICMP_ADVLENMIN (8 + sizeof (struct ip) + 8) /* min */ +#define ICMP_ADVLEN(p) (8 + ((p)->icmp_ip.ip_hl << 2) + 8) + /* N.B.: must separately check that ip_hl >= 5 */ + +/* + * Definition of type and code field values. + */ +#define ICMP_ECHOREPLY 0 /* echo reply */ +#define ICMP_UNREACH 3 /* dest unreachable, codes: */ +#define ICMP_UNREACH_NET 0 /* bad net */ +#define ICMP_UNREACH_HOST 1 /* bad host */ +#define ICMP_UNREACH_PROTOCOL 2 /* bad protocol */ +#define ICMP_UNREACH_PORT 3 /* bad port */ +#define ICMP_UNREACH_NEEDFRAG 4 /* IP_DF caused drop */ +#define ICMP_UNREACH_SRCFAIL 5 /* src route failed */ +#define ICMP_UNREACH_NET_UNKNOWN 6 /* unknown net */ +#define ICMP_UNREACH_HOST_UNKNOWN 7 /* unknown host */ +#define ICMP_UNREACH_ISOLATED 8 /* src host isolated */ +#define ICMP_UNREACH_NET_PROHIB 9 /* prohibited access */ +#define ICMP_UNREACH_HOST_PROHIB 10 /* ditto */ +#define ICMP_UNREACH_TOSNET 11 /* bad tos for net */ +#define ICMP_UNREACH_TOSHOST 12 /* bad tos for host */ +#define ICMP_SOURCEQUENCH 4 /* packet lost, slow down */ +#define ICMP_REDIRECT 5 /* shorter route, codes: */ +#define ICMP_REDIRECT_NET 0 /* for network */ +#define ICMP_REDIRECT_HOST 1 /* for host */ +#define ICMP_REDIRECT_TOSNET 2 /* for tos and net */ +#define ICMP_REDIRECT_TOSHOST 3 /* for tos and host */ +#define ICMP_ECHO 8 /* echo service */ +#define ICMP_ROUTERADVERT 9 /* router advertisement */ +#define ICMP_ROUTERSOLICIT 10 /* router solicitation */ +#define ICMP_TIMXCEED 11 /* time exceeded, code: */ +#define ICMP_TIMXCEED_INTRANS 0 /* ttl==0 in transit */ +#define ICMP_TIMXCEED_REASS 1 /* ttl==0 in reass */ +#define ICMP_PARAMPROB 12 /* ip header bad */ +#define ICMP_PARAMPROB_OPTABSENT 1 /* req. opt. absent */ +#define ICMP_TSTAMP 13 /* timestamp request */ +#define ICMP_TSTAMPREPLY 14 /* timestamp reply */ +#define ICMP_IREQ 15 /* information request */ +#define ICMP_IREQREPLY 16 /* information reply */ +#define ICMP_MASKREQ 17 /* address mask request */ +#define ICMP_MASKREPLY 18 /* address mask reply */ + +#define ICMP_MAXTYPE 18 + +#define ICMP_INFOTYPE(type) \ + ((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || \ + (type) == ICMP_ROUTERADVERT || (type) == ICMP_ROUTERSOLICIT || \ + (type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \ + (type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || \ + (type) == ICMP_MASKREQ || (type) == ICMP_MASKREPLY) + +#ifdef KERNEL +void icmp_error __P((struct mbuf *, int, int, n_long, struct ifnet *)); +void icmp_input __P((struct mbuf *, int)); +void icmp_reflect __P((struct mbuf *)); +void icmp_send __P((struct mbuf *, struct mbuf *)); +int icmp_sysctl __P((int *, u_int, void *, size_t *, void *, size_t)); +#endif + +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip_var.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip_var.h new file mode 100644 index 00000000000..351ebf146e9 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip_var.h @@ -0,0 +1,210 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ip_var.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_IP_VAR_H_ +#define _NETINET_IP_VAR_H_ + +/* + * Overlay for ip header used by other protocols (tcp, udp). + */ +struct ipovly { + caddr_t ih_next, ih_prev; /* for protocol sequence q's */ + u_char ih_x1; /* (unused) */ + u_char ih_pr; /* protocol */ + short ih_len; /* protocol length */ + struct in_addr ih_src; /* source internet address */ + struct in_addr ih_dst; /* destination internet address */ +}; + +/* + * Ip reassembly queue structure. Each fragment + * being reassembled is attached to one of these structures. + * They are timed out after ipq_ttl drops to 0, and may also + * be reclaimed if memory becomes tight. + */ +struct ipq { + struct ipq *next,*prev; /* to other reass headers */ + u_char ipq_ttl; /* time for reass q to live */ + u_char ipq_p; /* protocol of this fragment */ + u_short ipq_id; /* sequence id for reassembly */ + struct ipasfrag *ipq_next,*ipq_prev; + /* to ip headers of fragments */ + struct in_addr ipq_src,ipq_dst; +}; + +/* + * Ip header, when holding a fragment. + * + * Note: ipf_next must be at same offset as ipq_next above + */ +struct ipasfrag { +#if BYTE_ORDER == LITTLE_ENDIAN + u_char ip_hl:4, + ip_v:4; +#endif +#if BYTE_ORDER == BIG_ENDIAN + u_char ip_v:4, + ip_hl:4; +#endif + u_char ipf_mff; /* XXX overlays ip_tos: use low bit + * to avoid destroying tos; + * copied from (ip_off&IP_MF) */ + short ip_len; + u_short ip_id; + short ip_off; + u_char ip_ttl; + u_char ip_p; + u_short ip_sum; + struct ipasfrag *ipf_next; /* next fragment */ + struct ipasfrag *ipf_prev; /* previous fragment */ +}; + +/* + * Structure stored in mbuf in inpcb.ip_options + * and passed to ip_output when ip options are in use. + * The actual length of the options (including ipopt_dst) + * is in m_len. + */ +#define MAX_IPOPTLEN 40 + +struct ipoption { + struct in_addr ipopt_dst; /* first-hop dst if source routed */ + char ipopt_list[MAX_IPOPTLEN]; /* options proper */ +}; + +/* + * Structure attached to inpcb.ip_moptions and + * passed to ip_output when IP multicast options are in use. + */ +struct ip_moptions { + struct ifnet *imo_multicast_ifp; /* ifp for outgoing multicasts */ + u_char imo_multicast_ttl; /* TTL for outgoing multicasts */ + u_char imo_multicast_loop; /* 1 => hear sends if a member */ + u_short imo_num_memberships; /* no. memberships this socket */ + struct in_multi *imo_membership[IP_MAX_MEMBERSHIPS]; + u_long imo_multicast_vif; /* vif num outgoing multicasts */ +}; + +struct ipstat { + u_long ips_total; /* total packets received */ + u_long ips_badsum; /* checksum bad */ + u_long ips_tooshort; /* packet too short */ + u_long ips_toosmall; /* not enough data */ + u_long ips_badhlen; /* ip header length < data size */ + u_long ips_badlen; /* ip length < ip header length */ + u_long ips_fragments; /* fragments received */ + u_long ips_fragdropped; /* frags dropped (dups, out of space) */ + u_long ips_fragtimeout; /* fragments timed out */ + u_long ips_forward; /* packets forwarded */ + u_long ips_cantforward; /* packets rcvd for unreachable dest */ + u_long ips_redirectsent; /* packets forwarded on same net */ + u_long ips_noproto; /* unknown or unsupported protocol */ + u_long ips_delivered; /* datagrams delivered to upper level*/ + u_long ips_localout; /* total ip packets generated here */ + u_long ips_odropped; /* lost packets due to nobufs, etc. */ + u_long ips_reassembled; /* total packets reassembled ok */ + u_long ips_fragmented; /* datagrams sucessfully fragmented */ + u_long ips_ofragments; /* output fragments created */ + u_long ips_cantfrag; /* don't fragment flag was set, etc. */ + u_long ips_badoptions; /* error in option processing */ + u_long ips_noroute; /* packets discarded due to no route */ + u_long ips_badvers; /* ip version != 4 */ + u_long ips_rawout; /* total raw ip packets generated */ +}; + +#ifdef KERNEL +/* flags passed to ip_output as last parameter */ +#define IP_FORWARDING 0x1 /* most of ip header exists */ +#define IP_RAWOUTPUT 0x2 /* raw ip header exists */ +#define IP_ROUTETOIF SO_DONTROUTE /* bypass routing tables */ +#define IP_ALLOWBROADCAST SO_BROADCAST /* can send broadcast packets */ + +extern struct ipstat ipstat; +extern struct ipq ipq; /* ip reass. queue */ +extern u_short ip_id; /* ip packet ctr, for ids */ +extern int ip_defttl; /* default IP ttl */ +extern u_char ip_protox[]; +extern struct socket *ip_rsvpd; /* reservation protocol daemon */ +extern struct socket *ip_mrouter; /* multicast routing daemon */ +extern int (*legal_vif_num) __P((int)); +extern u_long (*ip_mcast_src) __P((int)); +extern int rsvp_on; + +int ip_ctloutput __P((int, struct socket *, int, int, struct mbuf **)); +void ip_deq __P((struct ipasfrag *)); +int ip_dooptions __P((struct mbuf *)); +void ip_drain __P((void)); +void ip_enq __P((struct ipasfrag *, struct ipasfrag *)); +void ip_forward __P((struct mbuf *, int)); +void ip_freef __P((struct ipq *)); +void ip_freemoptions __P((struct ip_moptions *)); +int ip_getmoptions __P((int, struct ip_moptions *, struct mbuf **)); +void ip_init __P((void)); +extern int (*ip_mforward) __P((struct ip *, struct ifnet *, struct mbuf *, + struct ip_moptions *)); +int ip_next_mtu __P((int, int)); +int ip_optcopy __P((struct ip *, struct ip *)); +int ip_output __P((struct socket *so, struct mbuf *, + struct mbuf *, struct route *, int, struct ip_moptions *)); +int ip_pcbopts __P((struct mbuf **, struct mbuf *)); +struct ip * + ip_reass __P((struct ipasfrag *, struct ipq *)); +struct in_ifaddr * + ip_rtaddr __P((struct in_addr)); +int ip_setmoptions __P((int, struct ip_moptions **, struct mbuf *)); +void ip_slowtimo __P((void)); +struct mbuf * + ip_srcroute __P((void)); +void ip_stripoptions __P((struct mbuf *, struct mbuf *)); +int ip_sysctl __P((int *, u_int, void *, size_t *, void *, size_t)); +void ipintr __P((void)); +int rip_ctloutput __P((int, struct socket *, int, int, struct mbuf **)); +void rip_init __P((void)); +void rip_input __P((struct mbuf *)); +int rip_output __P((struct mbuf *, struct socket *, u_long)); +int rip_usrreq __P((struct socket *, + int, struct mbuf *, struct mbuf *, struct mbuf *)); +int ip_rsvp_init __P((struct socket *)); +int ip_rsvp_done __P((void)); +int ip_rsvp_vif_init __P((struct socket *, struct mbuf *)); +int ip_rsvp_vif_done __P((struct socket *, struct mbuf *)); +void ip_rsvp_force_done __P((struct socket *)); + +void rip_ip_input __P((struct mbuf *mm, + register struct socket *ip_mrouter, struct sockaddr *src)); + +#endif + +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp.h new file mode 100644 index 00000000000..d8af2c684da --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp.h @@ -0,0 +1,121 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcp.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_TCP_H_ +#define _NETINET_TCP_H_ + +typedef u_long tcp_seq; +typedef u_long tcp_cc; /* connection count per rfc1644 */ + +/* + * TCP header. + * Per RFC 793, September, 1981. + */ +struct tcphdr { + u_short th_sport; /* source port */ + u_short th_dport; /* destination port */ + tcp_seq th_seq; /* sequence number */ + tcp_seq th_ack; /* acknowledgement number */ +#if BYTE_ORDER == LITTLE_ENDIAN + u_char th_x2:4, /* (unused) */ + th_off:4; /* data offset */ +#endif +#if BYTE_ORDER == BIG_ENDIAN + u_char th_off:4, /* data offset */ + th_x2:4; /* (unused) */ +#endif + u_char th_flags; +#define TH_FIN 0x01 +#define TH_SYN 0x02 +#define TH_RST 0x04 +#define TH_PUSH 0x08 +#define TH_ACK 0x10 +#define TH_URG 0x20 +#define TH_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG) + + u_short th_win; /* window */ + u_short th_sum; /* checksum */ + u_short th_urp; /* urgent pointer */ +}; + +#define TCPOPT_EOL 0 +#define TCPOPT_NOP 1 +#define TCPOPT_MAXSEG 2 +#define TCPOLEN_MAXSEG 4 +#define TCPOPT_WINDOW 3 +#define TCPOLEN_WINDOW 3 +#define TCPOPT_SACK_PERMITTED 4 /* Experimental */ +#define TCPOLEN_SACK_PERMITTED 2 +#define TCPOPT_SACK 5 /* Experimental */ +#define TCPOPT_TIMESTAMP 8 +#define TCPOLEN_TIMESTAMP 10 +#define TCPOLEN_TSTAMP_APPA (TCPOLEN_TIMESTAMP+2) /* appendix A */ +#define TCPOPT_TSTAMP_HDR \ + (TCPOPT_NOP<<24|TCPOPT_NOP<<16|TCPOPT_TIMESTAMP<<8|TCPOLEN_TIMESTAMP) + +#define TCPOPT_CC 11 /* CC options: RFC-1644 */ +#define TCPOPT_CCNEW 12 +#define TCPOPT_CCECHO 13 +#define TCPOLEN_CC 6 +#define TCPOLEN_CC_APPA (TCPOLEN_CC+2) +#define TCPOPT_CC_HDR(ccopt) \ + (TCPOPT_NOP<<24|TCPOPT_NOP<<16|(ccopt)<<8|TCPOLEN_CC) + +/* + * Default maximum segment size for TCP. + * With an IP MSS of 576, this is 536, + * but 512 is probably more convenient. + * This should be defined as MIN(512, IP_MSS - sizeof (struct tcpiphdr)). + */ +#define TCP_MSS 512 + +#define TCP_MAXWIN 65535 /* largest value for (unscaled) window */ +#define TTCP_CLIENT_SND_WND 4096 /* dflt send window for T/TCP client */ + +#define TCP_MAX_WINSHIFT 14 /* maximum window shift */ + +#define TCP_MAXHLEN (0xf<<2) /* max length of header in bytes */ +#define TCP_MAXOLEN (TCP_MAXHLEN - sizeof(struct tcphdr)) + /* max space left for options */ + +/* + * User-settable options (used with setsockopt). + */ +#define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */ +#define TCP_MAXSEG 0x02 /* set maximum segment size */ +#define TCP_NOPUSH 0x04 /* don't push last block of write */ +#define TCP_NOOPT 0x08 /* don't use TCP options */ + +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_debug.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_debug.h new file mode 100644 index 00000000000..5266eeb64f1 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_debug.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcp_debug.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_TCP_DEBUG_H_ +#define _NETINET_TCP_DEBUG_H_ + +struct tcp_debug { + n_time td_time; + short td_act; + short td_ostate; + caddr_t td_tcb; + struct tcpiphdr td_ti; + short td_req; + struct tcpcb td_cb; +}; + +#define TA_INPUT 0 +#define TA_OUTPUT 1 +#define TA_USER 2 +#define TA_RESPOND 3 +#define TA_DROP 4 + +#ifdef TANAMES +char *tanames[] = + { "input", "output", "user", "respond", "drop" }; +#endif + +#define TCP_NDEBUG 100 +struct tcp_debug tcp_debug[TCP_NDEBUG]; +int tcp_debx; + +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_fsm.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_fsm.h new file mode 100644 index 00000000000..5cbb3ec697b --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_fsm.h @@ -0,0 +1,91 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcp_fsm.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_TCP_FSM_H_ +#define _NETINET_TCP_FSM_H_ + +/* + * TCP FSM state definitions. + * Per RFC793, September, 1981. + */ + +#define TCP_NSTATES 11 + +#define TCPS_CLOSED 0 /* closed */ +#define TCPS_LISTEN 1 /* listening for connection */ +#define TCPS_SYN_SENT 2 /* active, have sent syn */ +#define TCPS_SYN_RECEIVED 3 /* have send and received syn */ +/* states < TCPS_ESTABLISHED are those where connections not established */ +#define TCPS_ESTABLISHED 4 /* established */ +#define TCPS_CLOSE_WAIT 5 /* rcvd fin, waiting for close */ +/* states > TCPS_CLOSE_WAIT are those where user has closed */ +#define TCPS_FIN_WAIT_1 6 /* have closed, sent fin */ +#define TCPS_CLOSING 7 /* closed xchd FIN; await FIN ACK */ +#define TCPS_LAST_ACK 8 /* had fin and close; await FIN ACK */ +/* states > TCPS_CLOSE_WAIT && < TCPS_FIN_WAIT_2 await ACK of FIN */ +#define TCPS_FIN_WAIT_2 9 /* have closed, fin is acked */ +#define TCPS_TIME_WAIT 10 /* in 2*msl quiet wait after close */ + +#define TCPS_HAVERCVDSYN(s) ((s) >= TCPS_SYN_RECEIVED) +#define TCPS_HAVEESTABLISHED(s) ((s) >= TCPS_ESTABLISHED) +#define TCPS_HAVERCVDFIN(s) ((s) >= TCPS_TIME_WAIT) + +#ifdef TCPOUTFLAGS +/* + * Flags used when sending segments in tcp_output. + * Basic flags (TH_RST,TH_ACK,TH_SYN,TH_FIN) are totally + * determined by state, with the proviso that TH_FIN is sent only + * if all data queued for output is included in the segment. + */ +u_char tcp_outflags[TCP_NSTATES] = { + TH_RST|TH_ACK, 0, TH_SYN, TH_SYN|TH_ACK, + TH_ACK, TH_ACK, + TH_FIN|TH_ACK, TH_FIN|TH_ACK, TH_FIN|TH_ACK, TH_ACK, TH_ACK, +}; +#endif + +#ifdef KPROF +int tcp_acounts[TCP_NSTATES][PRU_NREQ]; +#endif + +#ifdef TCPSTATES +char *tcpstates[] = { + "CLOSED", "LISTEN", "SYN_SENT", "SYN_RCVD", + "ESTABLISHED", "CLOSE_WAIT", "FIN_WAIT_1", "CLOSING", + "LAST_ACK", "FIN_WAIT_2", "TIME_WAIT", +}; +#endif + +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_seq.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_seq.h new file mode 100644 index 00000000000..9baf72e5e2f --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_seq.h @@ -0,0 +1,86 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcp_seq.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_TCP_SEQ_H_ +#define _NETINET_TCP_SEQ_H_ +/* + * TCP sequence numbers are 32 bit integers operated + * on with modular arithmetic. These macros can be + * used to compare such integers. + */ +#define SEQ_LT(a,b) ((int)((a)-(b)) < 0) +#define SEQ_LEQ(a,b) ((int)((a)-(b)) <= 0) +#define SEQ_GT(a,b) ((int)((a)-(b)) > 0) +#define SEQ_GEQ(a,b) ((int)((a)-(b)) >= 0) + +/* for modulo comparisons of timestamps */ +#define TSTMP_LT(a,b) ((int)((a)-(b)) < 0) +#define TSTMP_GEQ(a,b) ((int)((a)-(b)) >= 0) + +/* + * TCP connection counts are 32 bit integers operated + * on with modular arithmetic. These macros can be + * used to compare such integers. + */ +#define CC_LT(a,b) ((int)((a)-(b)) < 0) +#define CC_LEQ(a,b) ((int)((a)-(b)) <= 0) +#define CC_GT(a,b) ((int)((a)-(b)) > 0) +#define CC_GEQ(a,b) ((int)((a)-(b)) >= 0) + +/* Macro to increment a CC: skip 0 which has a special meaning */ +#define CC_INC(c) (++(c) == 0 ? ++(c) : (c)) + +/* + * Macros to initialize tcp sequence numbers for + * send and receive from initial send and receive + * sequence numbers. + */ +#define tcp_rcvseqinit(tp) \ + (tp)->rcv_adv = (tp)->rcv_nxt = (tp)->irs + 1 + +#define tcp_sendseqinit(tp) \ + (tp)->snd_una = (tp)->snd_nxt = (tp)->snd_max = (tp)->snd_up = \ + (tp)->iss + +#define TCP_ISSINCR (125*1024) /* increment for tcp_iss each second */ + +#define TCP_PAWS_IDLE (24 * 24 * 60 * 60 * PR_SLOWHZ) + /* timestamp wrap-around time */ + +#ifdef KERNEL +extern tcp_seq tcp_iss; /* tcp initial send seq # */ +extern tcp_cc tcp_ccgen; /* global connection count */ +#endif +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_timer.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_timer.h new file mode 100644 index 00000000000..dd96dc9bf14 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_timer.h @@ -0,0 +1,136 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcp_timer.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_TCP_TIMER_H_ +#define _NETINET_TCP_TIMER_H_ + +/* + * Definitions of the TCP timers. These timers are counted + * down PR_SLOWHZ times a second. + */ +#define TCPT_NTIMERS 4 + +#define TCPT_REXMT 0 /* retransmit */ +#define TCPT_PERSIST 1 /* retransmit persistance */ +#define TCPT_KEEP 2 /* keep alive */ +#define TCPT_2MSL 3 /* 2*msl quiet time timer */ + +/* + * The TCPT_REXMT timer is used to force retransmissions. + * The TCP has the TCPT_REXMT timer set whenever segments + * have been sent for which ACKs are expected but not yet + * received. If an ACK is received which advances tp->snd_una, + * then the retransmit timer is cleared (if there are no more + * outstanding segments) or reset to the base value (if there + * are more ACKs expected). Whenever the retransmit timer goes off, + * we retransmit one unacknowledged segment, and do a backoff + * on the retransmit timer. + * + * The TCPT_PERSIST timer is used to keep window size information + * flowing even if the window goes shut. If all previous transmissions + * have been acknowledged (so that there are no retransmissions in progress), + * and the window is too small to bother sending anything, then we start + * the TCPT_PERSIST timer. When it expires, if the window is nonzero, + * we go to transmit state. Otherwise, at intervals send a single byte + * into the peer's window to force him to update our window information. + * We do this at most as often as TCPT_PERSMIN time intervals, + * but no more frequently than the current estimate of round-trip + * packet time. The TCPT_PERSIST timer is cleared whenever we receive + * a window update from the peer. + * + * The TCPT_KEEP timer is used to keep connections alive. If an + * connection is idle (no segments received) for TCPTV_KEEP_INIT amount of time, + * but not yet established, then we drop the connection. Once the connection + * is established, if the connection is idle for TCPTV_KEEP_IDLE time + * (and keepalives have been enabled on the socket), we begin to probe + * the connection. We force the peer to send us a segment by sending: + * + * This segment is (deliberately) outside the window, and should elicit + * an ack segment in response from the peer. If, despite the TCPT_KEEP + * initiated segments we cannot elicit a response from a peer in TCPT_MAXIDLE + * amount of time probing, then we drop the connection. + */ + +/* + * Time constants. + */ +#define TCPTV_MSL ( 30*PR_SLOWHZ) /* max seg lifetime (hah!) */ +#define TCPTV_SRTTBASE 0 /* base roundtrip time; + if 0, no idea yet */ +#define TCPTV_SRTTDFLT ( 3*PR_SLOWHZ) /* assumed RTT if no info */ + +#define TCPTV_PERSMIN ( 5*PR_SLOWHZ) /* retransmit persistance */ +#define TCPTV_PERSMAX ( 60*PR_SLOWHZ) /* maximum persist interval */ + +#define TCPTV_KEEP_INIT ( 75*PR_SLOWHZ) /* initial connect keep alive */ +#define TCPTV_KEEP_IDLE (120*60*PR_SLOWHZ) /* dflt time before probing */ +#define TCPTV_KEEPINTVL ( 75*PR_SLOWHZ) /* default probe interval */ +#define TCPTV_KEEPCNT 8 /* max probes before drop */ + +#define TCPTV_MIN ( 1*PR_SLOWHZ) /* minimum allowable value */ +#define TCPTV_REXMTMAX ( 64*PR_SLOWHZ) /* max allowable REXMT value */ + +#define TCPTV_TWTRUNC 8 /* RTO factor to truncate TW */ + +#define TCP_LINGERTIME 120 /* linger at most 2 minutes */ + +#define TCP_MAXRXTSHIFT 12 /* maximum retransmits */ + +#ifdef TCPTIMERS +char *tcptimers[] = + { "REXMT", "PERSIST", "KEEP", "2MSL" }; +#endif + +/* + * Force a time value to be in a certain range. + */ +#define TCPT_RANGESET(tv, value, tvmin, tvmax) { \ + (tv) = (value); \ + if ((u_long)(tv) < (u_long)(tvmin)) \ + (tv) = (tvmin); \ + else if ((u_long)(tv) > (u_long)(tvmax)) \ + (tv) = (tvmax); \ +} + +#ifdef KERNEL +extern int tcp_keepinit; /* time to establish connection */ +extern int tcp_keepidle; /* time before keepalive probes begin */ +extern int tcp_keepintvl; /* time between keepalive probes */ +extern int tcp_maxidle; /* time to drop after starting probes */ +extern int tcp_ttl; /* time to live for TCP segs */ +extern int tcp_backoff[]; +#endif + +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_var.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_var.h new file mode 100644 index 00000000000..a7eb3e2ac42 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_var.h @@ -0,0 +1,387 @@ +/* + * Copyright (c) 1982, 1986, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcp_var.h 8.3 (Berkeley) 4/10/94 + */ + +#ifndef _NETINET_TCP_VAR_H_ +#define _NETINET_TCP_VAR_H_ +/* + * Kernel variables for tcp. + */ + +/* + * Tcp control block, one per tcp; fields: + */ +struct tcpcb { + struct tcpiphdr *seg_next; /* sequencing queue */ + struct tcpiphdr *seg_prev; + int t_state; /* state of this connection */ + int t_timer[TCPT_NTIMERS]; /* tcp timers */ + int t_rxtshift; /* log(2) of rexmt exp. backoff */ + int t_rxtcur; /* current retransmit value */ + int t_dupacks; /* consecutive dup acks recd */ + u_int t_maxseg; /* maximum segment size */ + u_int t_maxopd; /* mss plus options */ + int t_force; /* 1 if forcing out a byte */ + u_int t_flags; +#define TF_ACKNOW 0x0001 /* ack peer immediately */ +#define TF_DELACK 0x0002 /* ack, but try to delay it */ +#define TF_NODELAY 0x0004 /* don't delay packets to coalesce */ +#define TF_NOOPT 0x0008 /* don't use tcp options */ +#define TF_SENTFIN 0x0010 /* have sent FIN */ +#define TF_REQ_SCALE 0x0020 /* have/will request window scaling */ +#define TF_RCVD_SCALE 0x0040 /* other side has requested scaling */ +#define TF_REQ_TSTMP 0x0080 /* have/will request timestamps */ +#define TF_RCVD_TSTMP 0x0100 /* a timestamp was received in SYN */ +#define TF_SACK_PERMIT 0x0200 /* other side said I could SACK */ +#define TF_NEEDSYN 0x0400 /* send SYN (implicit state) */ +#define TF_NEEDFIN 0x0800 /* send FIN (implicit state) */ +#define TF_NOPUSH 0x1000 /* don't push */ +#define TF_REQ_CC 0x2000 /* have/will request CC */ +#define TF_RCVD_CC 0x4000 /* a CC was received in SYN */ +#define TF_SENDCCNEW 0x8000 /* send CCnew instead of CC in SYN */ + + struct tcpiphdr *t_template; /* skeletal packet for transmit */ + struct inpcb *t_inpcb; /* back pointer to internet pcb */ +/* + * The following fields are used as in the protocol specification. + * See RFC783, Dec. 1981, page 21. + */ +/* send sequence variables */ + tcp_seq snd_una; /* send unacknowledged */ + tcp_seq snd_nxt; /* send next */ + tcp_seq snd_up; /* send urgent pointer */ + tcp_seq snd_wl1; /* window update seg seq number */ + tcp_seq snd_wl2; /* window update seg ack number */ + tcp_seq iss; /* initial send sequence number */ + u_long snd_wnd; /* send window */ +/* receive sequence variables */ + u_long rcv_wnd; /* receive window */ + tcp_seq rcv_nxt; /* receive next */ + tcp_seq rcv_up; /* receive urgent pointer */ + tcp_seq irs; /* initial receive sequence number */ +/* + * Additional variables for this implementation. + */ +/* receive variables */ + tcp_seq rcv_adv; /* advertised window */ +/* retransmit variables */ + tcp_seq snd_max; /* highest sequence number sent; + * used to recognize retransmits + */ +/* congestion control (for slow start, source quench, retransmit after loss) */ + u_long snd_cwnd; /* congestion-controlled window */ + u_long snd_ssthresh; /* snd_cwnd size threshhold for + * for slow start exponential to + * linear switch + */ +/* + * transmit timing stuff. See below for scale of srtt and rttvar. + * "Variance" is actually smoothed difference. + */ + u_int t_idle; /* inactivity time */ + int t_rtt; /* round trip time */ + tcp_seq t_rtseq; /* sequence number being timed */ + int t_srtt; /* smoothed round-trip time */ + int t_rttvar; /* variance in round-trip time */ + u_int t_rttmin; /* minimum rtt allowed */ + u_long max_sndwnd; /* largest window peer has offered */ + +/* out-of-band data */ + char t_oobflags; /* have some */ + char t_iobc; /* input character */ +#define TCPOOB_HAVEDATA 0x01 +#define TCPOOB_HADDATA 0x02 + int t_softerror; /* possible error not yet reported */ + +/* RFC 1323 variables */ + u_char snd_scale; /* window scaling for send window */ + u_char rcv_scale; /* window scaling for recv window */ + u_char request_r_scale; /* pending window scaling */ + u_char requested_s_scale; + u_long ts_recent; /* timestamp echo data */ + u_long ts_recent_age; /* when last updated */ + tcp_seq last_ack_sent; +/* RFC 1644 variables */ + tcp_cc cc_send; /* send connection count */ + tcp_cc cc_recv; /* receive connection count */ + u_long t_duration; /* connection duration */ + +/* TUBA stuff */ + caddr_t t_tuba_pcb; /* next level down pcb for TCP over z */ +/* More RTT stuff */ + u_long t_rttupdated; /* number of times rtt sampled */ +}; + +/* + * Structure to hold TCP options that are only used during segment + * processing (in tcp_input), but not held in the tcpcb. + * It's basically used to reduce the number of parameters + * to tcp_dooptions. + */ +struct tcpopt { + u_long to_flag; /* which options are present */ +#define TOF_TS 0x0001 /* timestamp */ +#define TOF_CC 0x0002 /* CC and CCnew are exclusive */ +#define TOF_CCNEW 0x0004 +#define TOF_CCECHO 0x0008 + u_long to_tsval; + u_long to_tsecr; + tcp_cc to_cc; /* holds CC or CCnew */ + tcp_cc to_ccecho; +}; + +/* + * The TAO cache entry which is stored in the protocol family specific + * portion of the route metrics. + */ +struct rmxp_tao { + tcp_cc tao_cc; /* latest CC in valid SYN */ + tcp_cc tao_ccsent; /* latest CC sent to peer */ + u_short tao_mssopt; /* peer's cached MSS */ +#ifdef notyet + u_short tao_flags; /* cache status flags */ +#define TAOF_DONT 0x0001 /* peer doesn't understand rfc1644 */ +#define TAOF_OK 0x0002 /* peer does understand rfc1644 */ +#define TAOF_UNDEF 0 /* we don't know yet */ +#endif /* notyet */ +}; +#define rmx_taop(r) ((struct rmxp_tao *)(r).rmx_filler) + +#define intotcpcb(ip) ((struct tcpcb *)(ip)->inp_ppcb) +#define sototcpcb(so) (intotcpcb(sotoinpcb(so))) + +/* + * The smoothed round-trip time and estimated variance + * are stored as fixed point numbers scaled by the values below. + * For convenience, these scales are also used in smoothing the average + * (smoothed = (1/scale)sample + ((scale-1)/scale)smoothed). + * With these scales, srtt has 3 bits to the right of the binary point, + * and thus an "ALPHA" of 0.875. rttvar has 2 bits to the right of the + * binary point, and is smoothed with an ALPHA of 0.75. + */ +#define TCP_RTT_SCALE 8 /* multiplier for srtt; 3 bits frac. */ +#define TCP_RTT_SHIFT 3 /* shift for srtt; 3 bits frac. */ +#define TCP_RTTVAR_SCALE 4 /* multiplier for rttvar; 2 bits */ +#define TCP_RTTVAR_SHIFT 2 /* shift for rttvar; 2 bits */ + +/* + * The initial retransmission should happen at rtt + 4 * rttvar. + * Because of the way we do the smoothing, srtt and rttvar + * will each average +1/2 tick of bias. When we compute + * the retransmit timer, we want 1/2 tick of rounding and + * 1 extra tick because of +-1/2 tick uncertainty in the + * firing of the timer. The bias will give us exactly the + * 1.5 tick we need. But, because the bias is + * statistical, we have to test that we don't drop below + * the minimum feasible timer (which is 2 ticks). + * This macro assumes that the value of TCP_RTTVAR_SCALE + * is the same as the multiplier for rttvar. + */ +#define TCP_REXMTVAL(tp) \ + (((tp)->t_srtt >> TCP_RTT_SHIFT) + (tp)->t_rttvar) + +/* XXX + * We want to avoid doing m_pullup on incoming packets but that + * means avoiding dtom on the tcp reassembly code. That in turn means + * keeping an mbuf pointer in the reassembly queue (since we might + * have a cluster). As a quick hack, the source & destination + * port numbers (which are no longer needed once we've located the + * tcpcb) are overlayed with an mbuf pointer. + */ +#define REASS_MBUF(ti) (*(struct mbuf **)&((ti)->ti_t)) + +/* + * TCP statistics. + * Many of these should be kept per connection, + * but that's inconvenient at the moment. + */ +struct tcpstat { + u_long tcps_connattempt; /* connections initiated */ + u_long tcps_accepts; /* connections accepted */ + u_long tcps_connects; /* connections established */ + u_long tcps_drops; /* connections dropped */ + u_long tcps_conndrops; /* embryonic connections dropped */ + u_long tcps_closed; /* conn. closed (includes drops) */ + u_long tcps_segstimed; /* segs where we tried to get rtt */ + u_long tcps_rttupdated; /* times we succeeded */ + u_long tcps_delack; /* delayed acks sent */ + u_long tcps_timeoutdrop; /* conn. dropped in rxmt timeout */ + u_long tcps_rexmttimeo; /* retransmit timeouts */ + u_long tcps_persisttimeo; /* persist timeouts */ + u_long tcps_keeptimeo; /* keepalive timeouts */ + u_long tcps_keepprobe; /* keepalive probes sent */ + u_long tcps_keepdrops; /* connections dropped in keepalive */ + + u_long tcps_sndtotal; /* total packets sent */ + u_long tcps_sndpack; /* data packets sent */ + u_long tcps_sndbyte; /* data bytes sent */ + u_long tcps_sndrexmitpack; /* data packets retransmitted */ + u_long tcps_sndrexmitbyte; /* data bytes retransmitted */ + u_long tcps_sndacks; /* ack-only packets sent */ + u_long tcps_sndprobe; /* window probes sent */ + u_long tcps_sndurg; /* packets sent with URG only */ + u_long tcps_sndwinup; /* window update-only packets sent */ + u_long tcps_sndctrl; /* control (SYN|FIN|RST) packets sent */ + + u_long tcps_rcvtotal; /* total packets received */ + u_long tcps_rcvpack; /* packets received in sequence */ + u_long tcps_rcvbyte; /* bytes received in sequence */ + u_long tcps_rcvbadsum; /* packets received with ccksum errs */ + u_long tcps_rcvbadoff; /* packets received with bad offset */ + u_long tcps_rcvshort; /* packets received too short */ + u_long tcps_rcvduppack; /* duplicate-only packets received */ + u_long tcps_rcvdupbyte; /* duplicate-only bytes received */ + u_long tcps_rcvpartduppack; /* packets with some duplicate data */ + u_long tcps_rcvpartdupbyte; /* dup. bytes in part-dup. packets */ + u_long tcps_rcvoopack; /* out-of-order packets received */ + u_long tcps_rcvoobyte; /* out-of-order bytes received */ + u_long tcps_rcvpackafterwin; /* packets with data after window */ + u_long tcps_rcvbyteafterwin; /* bytes rcvd after window */ + u_long tcps_rcvafterclose; /* packets rcvd after "close" */ + u_long tcps_rcvwinprobe; /* rcvd window probe packets */ + u_long tcps_rcvdupack; /* rcvd duplicate acks */ + u_long tcps_rcvacktoomuch; /* rcvd acks for unsent data */ + u_long tcps_rcvackpack; /* rcvd ack packets */ + u_long tcps_rcvackbyte; /* bytes acked by rcvd acks */ + u_long tcps_rcvwinupd; /* rcvd window update packets */ + u_long tcps_pawsdrop; /* segments dropped due to PAWS */ + u_long tcps_predack; /* times hdr predict ok for acks */ + u_long tcps_preddat; /* times hdr predict ok for data pkts */ + u_long tcps_pcbcachemiss; + u_long tcps_cachedrtt; /* times cached RTT in route updated */ + u_long tcps_cachedrttvar; /* times cached rttvar updated */ + u_long tcps_cachedssthresh; /* times cached ssthresh updated */ + u_long tcps_usedrtt; /* times RTT initialized from route */ + u_long tcps_usedrttvar; /* times RTTVAR initialized from rt */ + u_long tcps_usedssthresh; /* times ssthresh initialized from rt*/ + u_long tcps_persistdrop; /* timeout in persist state */ + u_long tcps_badsyn; /* bogus SYN, e.g. premature ACK */ + u_long tcps_mturesent; /* resends due to MTU discovery */ + u_long tcps_listendrop; /* listen queue overflows */ +}; + +/* + * Names for TCP sysctl objects + */ +#define TCPCTL_DO_RFC1323 1 /* use RFC-1323 extensions */ +#define TCPCTL_DO_RFC1644 2 /* use RFC-1644 extensions */ +#define TCPCTL_MSSDFLT 3 /* MSS default */ +#define TCPCTL_STATS 4 /* statistics (read-only) */ +#define TCPCTL_RTTDFLT 5 /* default RTT estimate */ +#define TCPCTL_KEEPIDLE 6 /* keepalive idle timer */ +#define TCPCTL_KEEPINTVL 7 /* interval to send keepalives */ +#define TCPCTL_SENDSPACE 8 /* send buffer space */ +#define TCPCTL_RECVSPACE 9 /* receive buffer space */ +#define TCPCTL_KEEPINIT 10 /* interval to wait for established */ +#define TCPCTL_MAXID 11 + +#define TCPCTL_NAMES { \ + { 0, 0 }, \ + { "rfc1323", CTLTYPE_INT }, \ + { "rfc1644", CTLTYPE_INT }, \ + { "mssdflt", CTLTYPE_INT }, \ + { "stats", CTLTYPE_STRUCT }, \ + { "rttdflt", CTLTYPE_INT }, \ + { "keepidle", CTLTYPE_INT }, \ + { "keepintvl", CTLTYPE_INT }, \ + { "sendspace", CTLTYPE_INT }, \ + { "recvspace", CTLTYPE_INT }, \ + { "keepinit", CTLTYPE_INT }, \ +} + +#ifdef KERNEL +extern struct inpcbhead tcb; /* head of queue of active tcpcb's */ +extern struct inpcbinfo tcbinfo; +extern struct tcpstat tcpstat; /* tcp statistics */ +extern int tcp_do_rfc1323; /* XXX */ +extern int tcp_do_rfc1644; /* XXX */ +extern int tcp_mssdflt; /* XXX */ +extern u_long tcp_now; /* for RFC 1323 timestamps */ +extern int tcp_rttdflt; /* XXX */ +extern u_short tcp_lastport; /* last assigned port */ + +int tcp_attach __P((struct socket *)); +void tcp_canceltimers __P((struct tcpcb *)); +struct tcpcb * + tcp_close __P((struct tcpcb *)); +int tcp_connect __P((struct tcpcb *, struct mbuf *)); +void tcp_ctlinput __P((int, struct sockaddr *, struct ip *)); +int tcp_ctloutput __P((int, struct socket *, int, int, struct mbuf **)); +struct tcpcb * + tcp_disconnect __P((struct tcpcb *)); +struct tcpcb * + tcp_drop __P((struct tcpcb *, int)); +void tcp_dooptions __P((struct tcpcb *, + u_char *, int, struct tcpiphdr *, struct tcpopt *)); +void tcp_drain __P((void)); +void tcp_fasttimo __P((void)); +struct rmxp_tao * + tcp_gettaocache __P((struct inpcb *)); +void tcp_init __P((void)); +void tcp_input __P((struct mbuf *, int)); +void tcp_mss __P((struct tcpcb *, int)); +int tcp_mssopt __P((struct tcpcb *)); +void tcp_mtudisc __P((struct inpcb *, int)); +struct tcpcb * + tcp_newtcpcb __P((struct inpcb *)); +void tcp_notify __P((struct inpcb *, int)); +int tcp_output __P((struct tcpcb *)); +void tcp_pulloutofband __P((struct socket *, + struct tcpiphdr *, struct mbuf *)); +void tcp_quench __P((struct inpcb *, int)); +int tcp_reass __P((struct tcpcb *, struct tcpiphdr *, struct mbuf *)); +void tcp_respond __P((struct tcpcb *, + struct tcpiphdr *, struct mbuf *, u_long, u_long, int)); +struct rtentry * + tcp_rtlookup __P((struct inpcb *)); +void tcp_setpersist __P((struct tcpcb *)); +void tcp_slowtimo __P((void)); +int tcp_sysctl __P((int *, u_int, void *, size_t *, void *, size_t)); +struct tcpiphdr * + tcp_template __P((struct tcpcb *)); +struct tcpcb * + tcp_timers __P((struct tcpcb *, int)); +void tcp_trace __P((int, int, struct tcpcb *, struct tcpiphdr *, int)); +struct tcpcb * + tcp_usrclosed __P((struct tcpcb *)); +int tcp_usrreq __P((struct socket *, + int, struct mbuf *, struct mbuf *, struct mbuf *)); +void tcp_xmit_timer __P((struct tcpcb *, int)); + +extern u_long tcp_sendspace; +extern u_long tcp_recvspace; + +#endif /* KERNEL */ + +#endif /* _NETINET_TCP_VAR_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcpip.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcpip.h new file mode 100644 index 00000000000..45c115cf708 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcpip.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcpip.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_TCPIP_H_ +#define _NETINET_TCPIP_H_ + +/* + * Tcp+ip header, after ip options removed. + */ +struct tcpiphdr { + struct ipovly ti_i; /* overlaid ip structure */ + struct tcphdr ti_t; /* tcp header */ +}; +#ifdef notyet +/* + * Tcp+ip header, after ip options removed but including TCP options. + */ +struct full_tcpiphdr { + struct ipovly ti_i; /* overlaid ip structure */ + struct tcphdr ti_t; /* tcp header */ + char ti_o[TCP_MAXOLEN]; /* space for tcp options */ +}; +#endif /* notyet */ +#define ti_next ti_i.ih_next +#define ti_prev ti_i.ih_prev +#define ti_x1 ti_i.ih_x1 +#define ti_pr ti_i.ih_pr +#define ti_len ti_i.ih_len +#define ti_src ti_i.ih_src +#define ti_dst ti_i.ih_dst +#define ti_sport ti_t.th_sport +#define ti_dport ti_t.th_dport +#define ti_seq ti_t.th_seq +#define ti_ack ti_t.th_ack +#define ti_x2 ti_t.th_x2 +#define ti_off ti_t.th_off +#define ti_flags ti_t.th_flags +#define ti_win ti_t.th_win +#define ti_sum ti_t.th_sum +#define ti_urp ti_t.th_urp + +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/udp.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/udp.h new file mode 100644 index 00000000000..b05e19b401d --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/udp.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)udp.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_UDP_H_ +#define _NETINET_UDP_H_ + +/* + * Udp protocol header. + * Per RFC 768, September, 1981. + */ +struct udphdr { + u_short uh_sport; /* source port */ + u_short uh_dport; /* destination port */ + short uh_ulen; /* udp length */ + u_short uh_sum; /* udp checksum */ +}; + +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/udp_var.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/udp_var.h new file mode 100644 index 00000000000..fc808e51047 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/udp_var.h @@ -0,0 +1,105 @@ +/* + * Copyright (c) 1982, 1986, 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)udp_var.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_UDP_VAR_H_ +#define _NETINET_UDP_VAR_H_ + +/* + * UDP kernel structures and variables. + */ +struct udpiphdr { + struct ipovly ui_i; /* overlaid ip structure */ + struct udphdr ui_u; /* udp header */ +}; +#define ui_next ui_i.ih_next +#define ui_prev ui_i.ih_prev +#define ui_x1 ui_i.ih_x1 +#define ui_pr ui_i.ih_pr +#define ui_len ui_i.ih_len +#define ui_src ui_i.ih_src +#define ui_dst ui_i.ih_dst +#define ui_sport ui_u.uh_sport +#define ui_dport ui_u.uh_dport +#define ui_ulen ui_u.uh_ulen +#define ui_sum ui_u.uh_sum + +struct udpstat { + /* input statistics: */ + u_long udps_ipackets; /* total input packets */ + u_long udps_hdrops; /* packet shorter than header */ + u_long udps_badsum; /* checksum error */ + u_long udps_badlen; /* data length larger than packet */ + u_long udps_noport; /* no socket on port */ + u_long udps_noportbcast; /* of above, arrived as broadcast */ + u_long udps_fullsock; /* not delivered, input socket full */ + u_long udpps_pcbcachemiss; /* input packets missing pcb cache */ + u_long udpps_pcbhashmiss; /* input packets not for hashed pcb */ + /* output statistics: */ + u_long udps_opackets; /* total output packets */ +}; + +/* + * Names for UDP sysctl objects + */ +#define UDPCTL_CHECKSUM 1 /* checksum UDP packets */ +#define UDPCTL_STATS 2 /* statistics (read-only) */ +#define UDPCTL_MAXDGRAM 3 /* max datagram size */ +#define UDPCTL_RECVSPACE 4 /* default receive buffer space */ +#define UDPCTL_MAXID 5 + +#define UDPCTL_NAMES { \ + { 0, 0 }, \ + { "checksum", CTLTYPE_INT }, \ + { "stats", CTLTYPE_STRUCT }, \ + { "maxdgram", CTLTYPE_INT }, \ + { "recvspace", CTLTYPE_INT }, \ +} + +#ifdef KERNEL +extern struct inpcbhead udb; +extern struct inpcbinfo udbinfo; +extern struct udpstat udpstat; + +void udp_ctlinput __P((int, struct sockaddr *, struct ip *)); +void udp_init __P((void)); +void udp_input __P((struct mbuf *, int)); +int udp_output __P((struct inpcb *, + struct mbuf *, struct mbuf *, struct mbuf *)); +int udp_sysctl __P((int *, u_int, void *, size_t *, void *, size_t)); +int udp_usrreq __P((struct socket *, + int, struct mbuf *, struct mbuf *, struct mbuf *)); +#endif + +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/buf.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/buf.h new file mode 100644 index 00000000000..3523331430d --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/buf.h @@ -0,0 +1,254 @@ +/* + * Copyright (c) 1982, 1986, 1989, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)buf.h 8.7 (Berkeley) 1/21/94 + */ + +#ifndef _SYS_BUF_H_ +#define _SYS_BUF_H_ +#include + +#define NOLIST ((struct buf *)0x87654321) + +struct buf; + +struct iodone_chain { + long ic_prev_flags; + void (*ic_prev_iodone) __P((struct buf *)); + void *ic_prev_iodone_chain; + struct { + long ia_long; + void *ia_ptr; + } ic_args[5]; +}; + +/* + * The buffer header describes an I/O operation in the kernel. + */ +struct buf { + LIST_ENTRY(buf) b_hash; /* Hash chain. */ + LIST_ENTRY(buf) b_vnbufs; /* Buffer's associated vnode. */ + TAILQ_ENTRY(buf) b_freelist; /* Free list position if not active. */ + struct buf *b_actf, **b_actb; /* Device driver queue when active. */ + struct proc *b_proc; /* Associated proc; NULL if kernel. */ + volatile long b_flags; /* B_* flags. */ + int b_qindex; /* buffer queue index */ + int b_error; /* Errno value. */ + long b_bufsize; /* Allocated buffer size. */ + long b_bcount; /* Valid bytes in buffer. */ + long b_resid; /* Remaining I/O. */ + dev_t b_dev; /* Device associated with buffer. */ + struct { + caddr_t b_addr; /* Memory, superblocks, indirect etc. */ + } b_un; + void *b_saveaddr; /* Original b_addr for physio. */ + daddr_t b_lblkno; /* Logical block number. */ + daddr_t b_blkno; /* Underlying physical block number. */ + /* Function to call upon completion. */ + void (*b_iodone) __P((struct buf *)); + /* For nested b_iodone's. */ + struct iodone_chain *b_iodone_chain; + struct vnode *b_vp; /* Device vnode. */ + int b_pfcent; /* Center page when swapping cluster. */ + int b_dirtyoff; /* Offset in buffer of dirty region. */ + int b_dirtyend; /* Offset of end of dirty region. */ + struct ucred *b_rcred; /* Read credentials reference. */ + struct ucred *b_wcred; /* Write credentials reference. */ + int b_validoff; /* Offset in buffer of valid region. */ + int b_validend; /* Offset of end of valid region. */ + daddr_t b_pblkno; /* physical block number */ + caddr_t b_savekva; /* saved kva for transfer while bouncing */ + void *b_driver1; /* for private use by the driver */ + void *b_driver2; /* for private use by the driver */ + void *b_spc; + struct vm_page *b_pages[(MAXPHYS + PAGE_SIZE - 1)/PAGE_SIZE]; + int b_npages; +}; + +/* Device driver compatibility definitions. */ +#define b_active b_bcount /* Driver queue head: drive active. */ +#define b_data b_un.b_addr /* b_un.b_addr is not changeable. */ +#define b_errcnt b_resid /* Retry count while I/O in progress. */ +#define iodone biodone /* Old name for biodone. */ +#define iowait biowait /* Old name for biowait. */ + +/* + * These flags are kept in b_flags. + */ +#define B_AGE 0x00000001 /* Move to age queue when I/O done. */ +#define B_APPENDWRITE 0x00000002 /* Append-write in progress. */ +#define B_ASYNC 0x00000004 /* Start I/O, do not wait. */ +#define B_BAD 0x00000008 /* Bad block revectoring in progress. */ +#define B_BUSY 0x00000010 /* I/O in progress. */ +#define B_CACHE 0x00000020 /* Bread found us in the cache. */ +#define B_CALL 0x00000040 /* Call b_iodone from biodone. */ +#define B_DELWRI 0x00000080 /* Delay I/O until buffer reused. */ +#define B_DIRTY 0x00000100 /* Dirty page to be pushed out async. */ +#define B_DONE 0x00000200 /* I/O completed. */ +#define B_EINTR 0x00000400 /* I/O was interrupted */ +#define B_ERROR 0x00000800 /* I/O error occurred. */ +#define B_GATHERED 0x00001000 /* LFS: already in a segment. */ +#define B_INVAL 0x00002000 /* Does not contain valid info. */ +#define B_LOCKED 0x00004000 /* Locked in core (not reusable). */ +#define B_NOCACHE 0x00008000 /* Do not cache block after use. */ +#define B_MALLOC 0x00010000 /* malloced b_data */ +#define B_CLUSTEROK 0x00020000 /* Pagein op, so swap() can count it. */ +#define B_PHYS 0x00040000 /* I/O to user memory. */ +#define B_RAW 0x00080000 /* Set by physio for raw transfers. */ +#define B_READ 0x00100000 /* Read buffer. */ +#define B_TAPE 0x00200000 /* Magnetic tape I/O. */ +#define B_RELBUF 0x00400000 /* Release VMIO buffer. */ +#define B_WANTED 0x00800000 /* Process wants this buffer. */ +#define B_WRITE 0x00000000 /* Write buffer (pseudo flag). */ +#define B_WRITEINPROG 0x01000000 /* Write in progress. */ +#define B_XXX 0x02000000 /* Debugging flag. */ +#define B_PAGING 0x04000000 /* volatile paging I/O -- bypass VMIO */ +#define B_VMIO 0x20000000 /* VMIO flag */ +#define B_CLUSTER 0x40000000 /* pagein op, so swap() can count it */ +#define B_BOUNCE 0x80000000 /* bounce buffer flag */ + +/* + * This structure describes a clustered I/O. It is stored in the b_saveaddr + * field of the buffer on which I/O is done. At I/O completion, cluster + * callback uses the structure to parcel I/O's to individual buffers, and + * then free's this structure. + */ +struct cluster_save { + long bs_bcount; /* Saved b_bcount. */ + long bs_bufsize; /* Saved b_bufsize. */ + void *bs_saveaddr; /* Saved b_addr. */ + int bs_nchildren; /* Number of associated buffers. */ + struct buf **bs_children; /* List of associated buffers. */ +}; + +/* + * number of buffer hash entries + */ +#define BUFHSZ 512 + +/* + * buffer hash table calculation, originally by David Greenman + */ +#define BUFHASH(vnp, bn) \ + (&bufhashtbl[(((unsigned long)(vnp) >> 7)+(int)(bn)) % BUFHSZ]) + +/* + * Definitions for the buffer free lists. + */ +#define BUFFER_QUEUES 6 /* number of free buffer queues */ + +LIST_HEAD(bufhashhdr, buf) bufhashtbl[BUFHSZ], invalhash; +TAILQ_HEAD(bqueues, buf) bufqueues[BUFFER_QUEUES]; + +#define QUEUE_NONE 0 /* on no queue */ +#define QUEUE_LOCKED 1 /* locked buffers */ +#define QUEUE_LRU 2 /* useful buffers */ +#define QUEUE_VMIO 3 /* VMIO buffers */ +#define QUEUE_AGE 4 /* not-useful buffers */ +#define QUEUE_EMPTY 5 /* empty buffer headers*/ + +/* + * Zero out the buffer's data area. + */ +#define clrbuf(bp) { \ + blkclr((bp)->b_data, (u_int)(bp)->b_bcount); \ + (bp)->b_resid = 0; \ +} + +/* Flags to low-level allocation routines. */ +#define B_CLRBUF 0x01 /* Request allocated buffer be cleared. */ +#define B_SYNC 0x02 /* Do all allocations synchronously. */ + +#ifdef KERNEL +extern int nbuf; /* The number of buffer headers */ +extern struct buf *buf; /* The buffer headers. */ +extern char *buffers; /* The buffer contents. */ +extern int bufpages; /* Number of memory pages in the buffer pool. */ +extern struct buf *swbuf; /* Swap I/O buffer headers. */ +extern int nswbuf; /* Number of swap I/O buffer headers. */ +extern TAILQ_HEAD(swqueue, buf) bswlist; + +__BEGIN_DECLS +void bufinit __P((void)); +void bremfree __P((struct buf *)); +int bread __P((struct vnode *, daddr_t, int, + struct ucred *, struct buf **)); +int breadn __P((struct vnode *, daddr_t, int, daddr_t *, int *, int, + struct ucred *, struct buf **)); +int bwrite __P((struct buf *)); +void bdwrite __P((struct buf *)); +void bawrite __P((struct buf *)); +void brelse __P((struct buf *)); +void vfs_bio_awrite __P((struct buf *)); +struct buf * getpbuf __P((void)); +struct buf *incore __P((struct vnode *, daddr_t)); +int inmem __P((struct vnode *, daddr_t)); +struct buf *getblk __P((struct vnode *, daddr_t, int, int, int)); +struct buf *geteblk __P((int)); +int allocbuf __P((struct buf *, int)); +int biowait __P((struct buf *)); +void biodone __P((struct buf *)); + +void cluster_callback __P((struct buf *)); +int cluster_read __P((struct vnode *, u_quad_t, daddr_t, long, + struct ucred *, struct buf **)); +void cluster_wbuild __P((struct vnode *, struct buf *, long, daddr_t, int, + daddr_t)); +void cluster_write __P((struct buf *, u_quad_t)); +int physio __P((void (*)(), struct buf *, dev_t, int, u_int (*)(), + struct uio *)); +u_int minphys __P((struct buf *)); +void vfs_bio_clrbuf __P((struct buf *)); +void vfs_busy_pages __P((struct buf *, int clear_modify)); +void vfs_unbusy_pages(struct buf *); +void vwakeup __P((struct buf *)); +void vmapbuf __P((struct buf *)); +void vunmapbuf __P((struct buf *)); +void relpbuf __P((struct buf *)); +void brelvp __P((struct buf *)); +void bgetvp __P((struct vnode *, struct buf *)); +void pbgetvp __P((struct vnode *, struct buf *)); +void pbrelvp __P((struct buf *)); +void reassignbuf __P((struct buf *, struct vnode *)); +struct buf *trypbuf __P((void)); +void vm_bounce_alloc __P((struct buf *)); +void vm_bounce_free __P((struct buf *)); +vm_offset_t vm_bounce_kva_alloc __P((int)); +void vm_bounce_kva_alloc_free __P((vm_offset_t, int)); +__END_DECLS +#endif +#endif /* !_SYS_BUF_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/callout.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/callout.h new file mode 100644 index 00000000000..76d7519b5fa --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/callout.h @@ -0,0 +1,56 @@ +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)callout.h 8.2 (Berkeley) 1/21/94 + */ + +#ifndef _SYS_CALLOUT_H_ +#define _SYS_CALLOUT_H_ + +struct callout { + struct callout *c_next; /* next callout in queue */ + void *c_arg; /* function argument */ + void (*c_func) __P((void *)); /* function to call */ + int c_time; /* ticks to the event */ +}; + +#ifdef KERNEL +extern struct callout *callfree, *callout, calltodo; +extern int ncallout; +#endif + +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/cdefs.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/cdefs.h new file mode 100644 index 00000000000..99d44c71415 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/cdefs.h @@ -0,0 +1,147 @@ +/* + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Berkeley Software Design, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)cdefs.h 8.7 (Berkeley) 1/21/94 + */ + +#ifndef _SYS_CDEFS_H_ +#define _SYS_CDEFS_H_ + +#if defined(__cplusplus) +#define __BEGIN_DECLS extern "C" { +#define __END_DECLS }; +#else +#define __BEGIN_DECLS +#define __END_DECLS +#endif + +/* + * The __CONCAT macro is used to concatenate parts of symbol names, e.g. + * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo. + * The __CONCAT macro is a bit tricky -- make sure you don't put spaces + * in between its arguments. __CONCAT can also concatenate double-quoted + * strings produced by the __STRING macro, but this only works with ANSI C. + */ +#if defined(__STDC__) || defined(__cplusplus) +#define __P(protos) protos /* full-blown ANSI C */ +#define __CONCAT1(x,y) x ## y +#define __CONCAT(x,y) __CONCAT1(x,y) +#define __STRING(x) #x + +#define __const const /* define reserved names to standard */ +#define __signed signed +#define __volatile volatile +#if defined(__cplusplus) +#define __inline inline /* convert to C++ keyword */ +#else +#ifndef __GNUC__ +#define __inline /* delete GCC keyword */ +#endif /* !__GNUC__ */ +#endif /* !__cplusplus */ + +#else /* !(__STDC__ || __cplusplus) */ +#define __P(protos) () /* traditional C preprocessor */ +#define __CONCAT(x,y) x/**/y +#define __STRING(x) "x" + +#ifndef __GNUC__ +#define __const /* delete pseudo-ANSI C keywords */ +#define __inline +#define __signed +#define __volatile +/* + * In non-ANSI C environments, new programs will want ANSI-only C keywords + * deleted from the program and old programs will want them left alone. + * When using a compiler other than gcc, programs using the ANSI C keywords + * const, inline etc. as normal identifiers should define -DNO_ANSI_KEYWORDS. + * When using "gcc -traditional", we assume that this is the intent; if + * __GNUC__ is defined but __STDC__ is not, we leave the new keywords alone. + */ +#ifndef NO_ANSI_KEYWORDS +#define const /* delete ANSI C keywords */ +#define inline +#define signed +#define volatile +#endif +#endif /* !NO_ANSI_KEYWORDS */ +#endif /* !(__STDC__ || __cplusplus) */ + +/* + * GCC1 and some versions of GCC2 declare dead (non-returning) and + * pure (no side effects) functions using "volatile" and "const"; + * unfortunately, these then cause warnings under "-ansi -pedantic". + * GCC2.5 uses a new, peculiar __attribute__((attrs)) style. All of + * these work for GNU C++ (modulo a slight glitch in the C++ grammar + * in the distribution version of 2.5.5). + */ +#if __GNUC__ < 2 +#define __dead +#define __dead2 +#define __pure +#define __pure2 +#define __attribute__(x) +#endif +#if __GNUC__ == 2 && __GNUC_MINOR__ < 5 +#define __dead __volatile +#define __dead2 +#define __pure __const +#define __pure2 +#endif +#if __GNUC__ == 2 && __GNUC_MINOR__ > 5 || __GNUC__ >= 3 +#define __dead +#define __dead2 __attribute__((noreturn)) +#define __pure +#define __pure2 __attribute__((const)) +#endif + +#ifdef __GNUC__ +#ifdef __STDC__ +#define __weak_reference(sym,alias) \ + __asm__(".stabs \"_" #alias "\",11,0,0,0"); \ + __asm__(".stabs \"_" #sym "\",1,0,0,0") +#define __warn_references(sym,msg) \ + __asm__(".stabs \"" msg "\",30,0,0,0"); \ + __asm__(".stabs \"_" #sym "\",1,0,0,0") +#else +#define __weak_reference(sym,alias) \ + __asm__(".stabs \"_/**/alias\",11,0,0,0"); \ + __asm__(".stabs \"_/**/sym\",1,0,0,0") +#define __warn_references(sym,msg) \ + __asm__(".stabs msg,30,0,0,0"); \ + __asm__(".stabs \"_/**/sym\",1,0,0,0") +#endif +#endif + +#endif /* !_SYS_CDEFS_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/domain.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/domain.h new file mode 100644 index 00000000000..5c8e4418ce1 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/domain.h @@ -0,0 +1,73 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)domain.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _SYS_DOMAIN_H_ +#define _SYS_DOMAIN_H_ + +/* + * Structure per communications domain. + */ + +/* + * Forward structure declarations for function prototypes [sic]. + */ +struct mbuf; + +struct domain { + int dom_family; /* AF_xxx */ + char *dom_name; + void (*dom_init) /* initialize domain data structures */ + __P((void)); + int (*dom_externalize) /* externalize access rights */ + __P((struct mbuf *)); + int (*dom_dispose) /* dispose of internalized rights */ + __P((struct mbuf *)); + struct protosw *dom_protosw, *dom_protoswNPROTOSW; + struct domain *dom_next; + int (*dom_rtattach) /* initialize routing table */ + __P((void **, int)); + int dom_rtoffset; /* an arg to rtattach, in bits */ + int dom_maxrtkey; /* for routing layer */ +}; + +#ifdef KERNEL +extern struct domain *domains; + +#define DOMAIN_SET(name) \ + DATA_SET(domain_set, name ## domain); + +#endif + +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/errno.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/errno.h new file mode 100644 index 00000000000..0fd2fd754eb --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/errno.h @@ -0,0 +1,168 @@ +/* + * Copyright (c) 1982, 1986, 1989, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)errno.h 8.5 (Berkeley) 1/21/94 + */ + +#ifndef _SYS_ERRNO_H_ +#define _SYS_ERRNO_H_ + +#ifndef KERNEL +extern int errno; /* global error number */ +#endif + +#define EPERM 1 /* Operation not permitted */ +#define ENOENT 2 /* No such file or directory */ +#define ESRCH 3 /* No such process */ +#define EINTR 4 /* Interrupted system call */ +#define EIO 5 /* Input/output error */ +#define ENXIO 6 /* Device not configured */ +#define E2BIG 7 /* Argument list too long */ +#define ENOEXEC 8 /* Exec format error */ +#define EBADF 9 /* Bad file descriptor */ +#define ECHILD 10 /* No child processes */ +#define EDEADLK 11 /* Resource deadlock avoided */ + /* 11 was EAGAIN */ +#define ENOMEM 12 /* Cannot allocate memory */ +#define EACCES 13 /* Permission denied */ +#define EFAULT 14 /* Bad address */ +#ifndef _POSIX_SOURCE +#define ENOTBLK 15 /* Block device required */ +#endif +#define EBUSY 16 /* Device busy */ +#define EEXIST 17 /* File exists */ +#define EXDEV 18 /* Cross-device link */ +#define ENODEV 19 /* Operation not supported by device */ +#define ENOTDIR 20 /* Not a directory */ +#define EISDIR 21 /* Is a directory */ +#define EINVAL 22 /* Invalid argument */ +#define ENFILE 23 /* Too many open files in system */ +#define EMFILE 24 /* Too many open files */ +#define ENOTTY 25 /* Inappropriate ioctl for device */ +#ifndef _POSIX_SOURCE +#define ETXTBSY 26 /* Text file busy */ +#endif +#define EFBIG 27 /* File too large */ +#define ENOSPC 28 /* No space left on device */ +#define ESPIPE 29 /* Illegal seek */ +#define EROFS 30 /* Read-only file system */ +#define EMLINK 31 /* Too many links */ +#define EPIPE 32 /* Broken pipe */ + +/* math software */ +#define EDOM 33 /* Numerical argument out of domain */ +#define ERANGE 34 /* Result too large */ + +/* non-blocking and interrupt i/o */ +#define EAGAIN 35 /* Resource temporarily unavailable */ +#ifndef _POSIX_SOURCE +#define EWOULDBLOCK EAGAIN /* Operation would block */ +#define EINPROGRESS 36 /* Operation now in progress */ +#define EALREADY 37 /* Operation already in progress */ + +/* ipc/network software -- argument errors */ +#define ENOTSOCK 38 /* Socket operation on non-socket */ +#define EDESTADDRREQ 39 /* Destination address required */ +#define EMSGSIZE 40 /* Message too long */ +#define EPROTOTYPE 41 /* Protocol wrong type for socket */ +#define ENOPROTOOPT 42 /* Protocol not available */ +#define EPROTONOSUPPORT 43 /* Protocol not supported */ +#define ESOCKTNOSUPPORT 44 /* Socket type not supported */ +#define EOPNOTSUPP 45 /* Operation not supported */ +#define EPFNOSUPPORT 46 /* Protocol family not supported */ +#define EAFNOSUPPORT 47 /* Address family not supported by protocol family */ +#define EADDRINUSE 48 /* Address already in use */ +#define EADDRNOTAVAIL 49 /* Can't assign requested address */ + +/* ipc/network software -- operational errors */ +#define ENETDOWN 50 /* Network is down */ +#define ENETUNREACH 51 /* Network is unreachable */ +#define ENETRESET 52 /* Network dropped connection on reset */ +#define ECONNABORTED 53 /* Software caused connection abort */ +#define ECONNRESET 54 /* Connection reset by peer */ +#define ENOBUFS 55 /* No buffer space available */ +#define EISCONN 56 /* Socket is already connected */ +#define ENOTCONN 57 /* Socket is not connected */ +#define ESHUTDOWN 58 /* Can't send after socket shutdown */ +#define ETOOMANYREFS 59 /* Too many references: can't splice */ +#define ETIMEDOUT 60 /* Operation timed out */ +#define ECONNREFUSED 61 /* Connection refused */ + +#define ELOOP 62 /* Too many levels of symbolic links */ +#endif /* _POSIX_SOURCE */ +#define ENAMETOOLONG 63 /* File name too long */ + +/* should be rearranged */ +#ifndef _POSIX_SOURCE +#define EHOSTDOWN 64 /* Host is down */ +#define EHOSTUNREACH 65 /* No route to host */ +#endif /* _POSIX_SOURCE */ +#define ENOTEMPTY 66 /* Directory not empty */ + +/* quotas & mush */ +#ifndef _POSIX_SOURCE +#define EPROCLIM 67 /* Too many processes */ +#define EUSERS 68 /* Too many users */ +#define EDQUOT 69 /* Disc quota exceeded */ + +/* Network File System */ +#define ESTALE 70 /* Stale NFS file handle */ +#define EREMOTE 71 /* Too many levels of remote in path */ +#define EBADRPC 72 /* RPC struct is bad */ +#define ERPCMISMATCH 73 /* RPC version wrong */ +#define EPROGUNAVAIL 74 /* RPC prog. not avail */ +#define EPROGMISMATCH 75 /* Program version wrong */ +#define EPROCUNAVAIL 76 /* Bad procedure for program */ +#endif /* _POSIX_SOURCE */ + +#define ENOLCK 77 /* No locks available */ +#define ENOSYS 78 /* Function not implemented */ + +#ifndef _POSIX_SOURCE +#define EFTYPE 79 /* Inappropriate file type or format */ +#define EAUTH 80 /* Authentication error */ +#define ENEEDAUTH 81 /* Need authenticator */ +#define ELAST 81 /* Must be equal largest errno */ +#endif /* _POSIX_SOURCE */ + +#ifdef KERNEL +/* pseudo-errors returned inside kernel to modify return to process */ +#define ERESTART -1 /* restart syscall */ +#define EJUSTRETURN -2 /* don't modify regs, just return */ +#endif + +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/fcntl.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/fcntl.h new file mode 100644 index 00000000000..62762f3498a --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/fcntl.h @@ -0,0 +1,190 @@ +/*- + * Copyright (c) 1983, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)fcntl.h 8.3 (Berkeley) 1/21/94 + */ + +#ifndef _SYS_FCNTL_H_ +#define _SYS_FCNTL_H_ + +/* + * This file includes the definitions for open and fcntl + * described by POSIX for ; it also includes + * related kernel definitions. + */ + +#ifndef KERNEL +#include +#endif + +/* + * File status flags: these are used by open(2), fcntl(2). + * They are also used (indirectly) in the kernel file structure f_flags, + * which is a superset of the open/fcntl flags. Open flags and f_flags + * are inter-convertible using OFLAGS(fflags) and FFLAGS(oflags). + * Open/fcntl flags begin with O_; kernel-internal flags begin with F. + */ +/* open-only flags */ +#define O_RDONLY 0x0000 /* open for reading only */ +#define O_WRONLY 0x0001 /* open for writing only */ +#define O_RDWR 0x0002 /* open for reading and writing */ +#define O_ACCMODE 0x0003 /* mask for above modes */ + +/* + * Kernel encoding of open mode; separate read and write bits that are + * independently testable: 1 greater than the above. + * + * XXX + * FREAD and FWRITE are excluded from the #ifdef KERNEL so that TIOCFLUSH, + * which was documented to use FREAD/FWRITE, continues to work. + */ +#ifndef _POSIX_SOURCE +#define FREAD 0x0001 +#define FWRITE 0x0002 +#endif +#define O_NONBLOCK 0x0004 /* no delay */ +#define O_APPEND 0x0008 /* set append mode */ +#ifndef _POSIX_SOURCE +#define O_SHLOCK 0x0010 /* open with shared file lock */ +#define O_EXLOCK 0x0020 /* open with exclusive file lock */ +#define O_ASYNC 0x0040 /* signal pgrp when data ready */ +#define O_FSYNC 0x0080 /* synchronous writes */ +#endif +#define O_CREAT 0x0200 /* create if nonexistant */ +#define O_TRUNC 0x0400 /* truncate to zero length */ +#define O_EXCL 0x0800 /* error if already exists */ +#ifdef KERNEL +#define FMARK 0x1000 /* mark during gc() */ +#define FDEFER 0x2000 /* defer for next gc pass */ +#define FHASLOCK 0x4000 /* descriptor holds advisory lock */ +#endif + +/* defined by POSIX 1003.1; BSD default, so no bit required */ +#define O_NOCTTY 0 /* don't assign controlling terminal */ + +#ifdef KERNEL +/* convert from open() flags to/from fflags; convert O_RD/WR to FREAD/FWRITE */ +#define FFLAGS(oflags) ((oflags) + 1) +#define OFLAGS(fflags) ((fflags) - 1) + +/* bits to save after open */ +#define FMASK (FREAD|FWRITE|FAPPEND|FASYNC|FFSYNC|FNONBLOCK) +/* bits settable by fcntl(F_SETFL, ...) */ +#define FCNTLFLAGS (FAPPEND|FASYNC|FFSYNC|FNONBLOCK) +#endif + +/* + * The O_* flags used to have only F* names, which were used in the kernel + * and by fcntl. We retain the F* names for the kernel f_flags field + * and for backward compatibility for fcntl. + */ +#ifndef _POSIX_SOURCE +#define FAPPEND O_APPEND /* kernel/compat */ +#define FASYNC O_ASYNC /* kernel/compat */ +#define FFSYNC O_FSYNC /* kernel */ +#define FNONBLOCK O_NONBLOCK /* kernel */ +#define FNDELAY O_NONBLOCK /* compat */ +#define O_NDELAY O_NONBLOCK /* compat */ +#endif + +/* + * Constants used for fcntl(2) + */ + +/* command values */ +#define F_DUPFD 0 /* duplicate file descriptor */ +#define F_GETFD 1 /* get file descriptor flags */ +#define F_SETFD 2 /* set file descriptor flags */ +#define F_GETFL 3 /* get file status flags */ +#define F_SETFL 4 /* set file status flags */ +#ifndef _POSIX_SOURCE +#define F_GETOWN 5 /* get SIGIO/SIGURG proc/pgrp */ +#define F_SETOWN 6 /* set SIGIO/SIGURG proc/pgrp */ +#endif +#define F_GETLK 7 /* get record locking information */ +#define F_SETLK 8 /* set record locking information */ +#define F_SETLKW 9 /* F_SETLK; wait if blocked */ + +/* file descriptor flags (F_GETFD, F_SETFD) */ +#define FD_CLOEXEC 1 /* close-on-exec flag */ + +/* record locking flags (F_GETLK, F_SETLK, F_SETLKW) */ +#define F_RDLCK 1 /* shared or read lock */ +#define F_UNLCK 2 /* unlock */ +#define F_WRLCK 3 /* exclusive or write lock */ +#ifdef KERNEL +#define F_WAIT 0x010 /* Wait until lock is granted */ +#define F_FLOCK 0x020 /* Use flock(2) semantics for lock */ +#define F_POSIX 0x040 /* Use POSIX semantics for lock */ +#endif + +/* + * Advisory file segment locking data type - + * information passed to system by user + */ +struct flock { + off_t l_start; /* starting offset */ + off_t l_len; /* len = 0 means until end of file */ + pid_t l_pid; /* lock owner */ + short l_type; /* lock type: read/write, etc. */ + short l_whence; /* type of l_start */ +}; + + +#ifndef _POSIX_SOURCE +/* lock operations for flock(2) */ +#define LOCK_SH 0x01 /* shared file lock */ +#define LOCK_EX 0x02 /* exclusive file lock */ +#define LOCK_NB 0x04 /* don't block when locking */ +#define LOCK_UN 0x08 /* unlock file */ +#endif + + +#ifndef KERNEL +#include + +__BEGIN_DECLS +int open __P((const char *, int, ...)); +int creat __P((const char *, mode_t)); +int fcntl __P((int, int, ...)); +#ifndef _POSIX_SOURCE +int flock __P((int, int)); +#endif /* !_POSIX_SOURCE */ +__END_DECLS +#endif + +#endif /* !_SYS_FCNTL_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/file.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/file.h new file mode 100644 index 00000000000..6f122605b13 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/file.h @@ -0,0 +1,83 @@ +/* + * Copyright (c) 1982, 1986, 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)file.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _SYS_FILE_H_ +#define _SYS_FILE_H_ + +#include +#include + +#ifdef KERNEL +struct proc; +struct uio; + +/* + * Kernel descriptor table. + * One entry for each open kernel vnode and socket. + */ +struct file { + struct file *f_filef; /* list of active files */ + struct file **f_fileb; /* list of active files */ + short f_flag; /* see fcntl.h */ +#define DTYPE_VNODE 1 /* file */ +#define DTYPE_SOCKET 2 /* communications endpoint */ + short f_type; /* descriptor type */ + short f_count; /* reference count */ + short f_msgcount; /* references from message queue */ + struct ucred *f_cred; /* credentials associated with descriptor */ + struct fileops { + int (*fo_read) __P((struct file *fp, struct uio *uio, + struct ucred *cred)); + int (*fo_write) __P((struct file *fp, struct uio *uio, + struct ucred *cred)); + int (*fo_ioctl) __P((struct file *fp, int com, + caddr_t data, struct proc *p)); + int (*fo_select) __P((struct file *fp, int which, + struct proc *p)); + int (*fo_close) __P((struct file *fp, struct proc *p)); + } *f_ops; + off_t f_offset; + caddr_t f_data; /* vnode or socket */ +}; + +extern struct file *filehead; /* head of list of open files */ +extern struct fileops vnops; +extern int maxfiles; /* kernel limit on number of open files */ +extern int maxfilesperproc; /* per process limit on number of open files */ +extern int nfiles; /* actual number of open files */ + +#endif /* KERNEL */ + +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/filedesc.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/filedesc.h new file mode 100644 index 00000000000..4b0dec7cff7 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/filedesc.h @@ -0,0 +1,108 @@ +/* + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)filedesc.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _SYS_FILEDESC_H_ +#define _SYS_FILEDESC_H_ + +/* + * This structure is used for the management of descriptors. It may be + * shared by multiple processes. + * + * A process is initially started out with NDFILE descriptors stored within + * this structure, selected to be enough for typical applications based on + * the historical limit of 20 open files (and the usage of descriptors by + * shells). If these descriptors are exhausted, a larger descriptor table + * may be allocated, up to a process' resource limit; the internal arrays + * are then unused. The initial expansion is set to NDEXTENT; each time + * it runs out, it is doubled until the resource limit is reached. NDEXTENT + * should be selected to be the biggest multiple of OFILESIZE (see below) + * that will fit in a power-of-two sized piece of memory. + */ +#define NDFILE 20 +#define NDEXTENT 50 /* 250 bytes in 256-byte alloc. */ + +struct filedesc { + struct file **fd_ofiles; /* file structures for open files */ + char *fd_ofileflags; /* per-process open file flags */ + struct vnode *fd_cdir; /* current directory */ + struct vnode *fd_rdir; /* root directory */ + int fd_nfiles; /* number of open files allocated */ + u_short fd_lastfile; /* high-water mark of fd_ofiles */ + u_short fd_freefile; /* approx. next free file */ + u_short fd_cmask; /* mask for file creation */ + u_short fd_refcnt; /* reference count */ +}; + +/* + * Basic allocation of descriptors: + * one of the above, plus arrays for NDFILE descriptors. + */ +struct filedesc0 { + struct filedesc fd_fd; + /* + * These arrays are used when the number of open files is + * <= NDFILE, and are then pointed to by the pointers above. + */ + struct file *fd_dfiles[NDFILE]; + char fd_dfileflags[NDFILE]; +}; + +/* + * Per-process open flags. + */ +#define UF_EXCLOSE 0x01 /* auto-close on exec */ +#define UF_MAPPED 0x02 /* mapped from device */ + +/* + * Storage required per open file descriptor. + */ +#define OFILESIZE (sizeof(struct file *) + sizeof(char)) + +#ifdef KERNEL +/* + * Kernel global variables and routines. + */ +int dupfdopen __P((struct filedesc *, int, int, int, int)); +int fdalloc __P((struct proc *p, int want, int *result)); +int fdavail __P((struct proc *p, int n)); +int falloc __P((struct proc *p, struct file **resultfp, int *resultfd)); +void ffree __P((struct file *)); +struct filedesc *fdcopy __P((struct proc *p)); +void fdfree __P((struct proc *p)); +int closef __P((struct file *fp,struct proc *p)); +void fdcloseexec __P((struct proc *p)); +#endif + +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/filio.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/filio.h new file mode 100644 index 00000000000..c1566c26495 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/filio.h @@ -0,0 +1,57 @@ +/*- + * Copyright (c) 1982, 1986, 1990, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)filio.h 8.1 (Berkeley) 3/28/94 + */ + +#ifndef _SYS_FILIO_H_ +#define _SYS_FILIO_H_ + +#ifndef __REACTOS__ +#include + +/* Generic file-descriptor ioctl's. */ +#define FIOCLEX _IO('f', 1) /* set close on exec on fd */ +#define FIONCLEX _IO('f', 2) /* remove close on exec */ +#define FIONREAD _IOR('f', 127, int) /* get # bytes to read */ +#define FIONBIO _IOW('f', 126, int) /* set/clear non-blocking i/o */ +#define FIOASYNC _IOW('f', 125, int) /* set/clear async i/o */ +#define FIOSETOWN _IOW('f', 124, int) /* set owner */ +#define FIOGETOWN _IOR('f', 123, int) /* get owner */ +#endif + +#endif /* !_SYS_FILIO_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/ioccom.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/ioccom.h new file mode 100644 index 00000000000..355df44d6ee --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/ioccom.h @@ -0,0 +1,68 @@ +/*- + * Copyright (c) 1982, 1986, 1990, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ioccom.h 8.2 (Berkeley) 3/28/94 + */ + +#ifndef _SYS_IOCCOM_H_ +#define _SYS_IOCCOM_H_ + +/* + * Ioctl's have the command encoded in the lower word, and the size of + * any in or out parameters in the upper word. The high 3 bits of the + * upper word are used to encode the in/out status of the parameter. + */ +#ifndef __REACTOS__ +#define IOCPARM_MASK 0x1fff /* parameter length, at most 13 bits */ +#define IOCPARM_LEN(x) (((x) >> 16) & IOCPARM_MASK) +#define IOCBASECMD(x) ((x) & ~(IOCPARM_MASK << 16)) +#define IOCGROUP(x) (((x) >> 8) & 0xff) +#endif + +#define IOCPARM_MAX NBPG /* max size of ioctl, mult. of NBPG */ +#define IOC_VOID 0x20000000 /* no parameters */ +#define IOC_OUT 0x40000000 /* copy out parameters */ +#define IOC_IN 0x80000000 /* copy in parameters */ +#define IOC_INOUT (IOC_IN|IOC_OUT) +#define IOC_DIRMASK 0xe0000000 /* mask for IN/OUT/VOID */ + +#ifndef __REACTOS__ +#define _IOC(inout,group,num,len) \ + (inout | ((len & IOCPARM_MASK) << 16) | ((group) << 8) | (num)) +#define _IO(g,n) _IOC(IOC_VOID, (g), (n), 0) +#define _IOR(g,n,t) _IOC(IOC_OUT, (g), (n), sizeof(t)) +#define _IOW(g,n,t) _IOC(IOC_IN, (g), (n), sizeof(t)) +/* this should be _IORW, but stdio got there first */ +#define _IOWR(g,n,t) _IOC(IOC_INOUT, (g), (n), sizeof(t)) +#endif + +#endif /* !_SYS_IOCCOM_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/ioctl.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/ioctl.h new file mode 100644 index 00000000000..d04394fd181 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/ioctl.h @@ -0,0 +1,84 @@ +/*- + * Copyright (c) 1982, 1986, 1990, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ioctl.h 8.6 (Berkeley) 3/28/94 + */ + +#ifndef _SYS_IOCTL_H_ +#define _SYS_IOCTL_H_ + +#include + +/* + * Pun for SunOS prior to 3.2. SunOS 3.2 and later support TIOCGWINSZ + * and TIOCSWINSZ (yes, even 3.2-3.5, the fact that it wasn't documented + * nonwithstanding). + */ +struct ttysize { + unsigned short ts_lines; + unsigned short ts_cols; + unsigned short ts_xxx; + unsigned short ts_yyy; +}; +#define TIOCGSIZE TIOCGWINSZ +#define TIOCSSIZE TIOCSWINSZ + +#include + +#include +#include + +#ifndef KERNEL + +#include + +__BEGIN_DECLS +int ioctl __P((int, unsigned long, ...)); +__END_DECLS +#endif /* !KERNEL */ +#endif /* !_SYS_IOCTL_H_ */ + +/* + * Keep outside _SYS_IOCTL_H_ + * Compatability with old terminal driver + * + * Source level -> #define USE_OLD_TTY + * Kernel level -> options COMPAT_43 or COMPAT_SUNOS + */ +#if defined(USE_OLD_TTY) || defined(COMPAT_43) || defined(COMPAT_SUNOS) +#include +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/kernel.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/kernel.h new file mode 100644 index 00000000000..530fd7f5e12 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/kernel.h @@ -0,0 +1,116 @@ +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)kernel.h 8.3 (Berkeley) 1/21/94 + * $\Id: kernel.h,v 1.9 1995/03/20 19:20:26 wollman Exp $ + */ + +#ifndef _SYS_KERNEL_H_ +#define _SYS_KERNEL_H_ + +/* Global variables for the kernel. */ + +/* 1.1 */ +extern long hostid; +extern char hostname[MAXHOSTNAMELEN]; +extern int hostnamelen; +extern char domainname[MAXHOSTNAMELEN]; +extern int domainnamelen; +extern char kernelname[MAXPATHLEN]; + +/* 1.2 */ +extern volatile struct timeval mono_time; +extern struct timeval boottime; +extern struct timeval runtime; +extern volatile struct timeval time; +extern struct timezone tz; /* XXX */ + +extern int tick; /* usec per tick (1000000 / hz) */ +extern int hz; /* system clock's frequency */ +extern int stathz; /* statistics clock's frequency */ +extern int profhz; /* profiling clock's frequency */ +extern int ticks; +extern int lbolt; /* once a second sleep address */ +extern int tickdelta; +extern long timedelta; + +/* + * The following macros are used to declare global sets of objects, which + * are collected by the linker into a `struct linker_set' as defined below. + * + * NB: the constants defined below must match those defined in + * ld/ld.h. Since their calculation requires arithmetic, we + * can't name them symbolically (e.g., 23 is N_SETT | N_EXT). + */ +#define MAKE_SET(set, sym, type) \ + asm(".stabs \"_" #set "\", " #type ", 0, 0, _" #sym) +#define TEXT_SET(set, sym) MAKE_SET(set, sym, 23) +#define DATA_SET(set, sym) MAKE_SET(set, sym, 25) +#define BSS_SET(set, sym) MAKE_SET(set, sym, 27) +#define ABS_SET(set, sym) MAKE_SET(set, sym, 21) + +#ifdef PSEUDO_LKM +#include +#include +#include +#include + +#define PSEUDO_SET(init, name) \ + extern struct linker_set MODVNOPS; \ + MOD_MISC(#name); \ + int name ## _load(struct lkm_table *lkmtp, int cmd) \ + { init(); return 0; } \ + int name ## _unload(struct lkm_table *lkmtp, int cmd) \ + { return EINVAL; } \ + int \ + name ## _mod(struct lkm_table *lkmtp, int cmd, int ver) { \ + DISPATCH(lkmtp, cmd, ver, name ## _load, name ## _unload, \ + nosys); } +#else /* PSEUDO_LKM */ + +#define PSEUDO_SET(sym, name) TEXT_SET(pseudo_set, sym) + +#endif /* PSEUDO_LKM */ + +struct linker_set { + int ls_length; + caddr_t ls_items[1]; /* really ls_length of them, trailing NULL */ +}; + +extern const struct linker_set execsw_set; + +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/libkern.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/libkern.h new file mode 100644 index 00000000000..e31b51605f1 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/libkern.h @@ -0,0 +1,64 @@ +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)libkern.h 8.1 (Berkeley) 6/10/93 + */ + +#include + +static __inline int imax(int a, int b) { return (a > b ? a : b); } +static __inline int imin(int a, int b) { return (a < b ? a : b); } +static __inline long lmax(long a, long b) { return (a > b ? a : b); } +static __inline long lmin(long a, long b) { return (a < b ? a : b); } +static __inline u_int max(u_int a, u_int b) { return (a > b ? a : b); } +static __inline u_int min(u_int a, u_int b) { return (a < b ? a : b); } +static __inline quad_t qmax(quad_t a, quad_t b) { return (a > b ? a : b); } +static __inline quad_t qmin(quad_t a, quad_t b) { return (a < b ? a : b); } +static __inline u_long ulmax(u_long a, u_long b) { return (a > b ? a : b); } +static __inline u_long ulmin(u_long a, u_long b) { return (a < b ? a : b); } + +/* Prototypes for non-quad routines. */ +int bcmp __P((const void *, const void *, size_t)); +#ifndef HAVE_INLINE_FFS +int ffs __P((int)); +#endif +int locc __P((int, char *, u_int)); +u_long random __P((void)); +char *rindex __P((const char *, int)); +int scanc __P((u_int, u_char *, u_char *, int)); +int skpc __P((int, int, char *)); +char *strcat __P((char *, const char *)); +int strcmp __P((const char *, const char *)); +char *strcpy __P((char *, const char *)); +size_t strlen __P((const char *)); +int strncmp __P((const char *, const char *, size_t)); +char *strncpy __P((char *, const char *, size_t)); diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/malloc.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/malloc.h new file mode 100644 index 00000000000..d21a9193939 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/malloc.h @@ -0,0 +1,333 @@ +/* + * Copyright (c) 1987, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)malloc.h 8.3 (Berkeley) 1/12/94 + */ + +#ifndef _SYS_MALLOC_H_ +#define _SYS_MALLOC_H_ + +#ifndef OSKIT +#define KMEMSTATS +#endif + +/* + * flags to malloc + */ +#define M_WAITOK 0x0000 +#define M_NOWAIT 0x0001 +#define M_KERNEL 0x0002 + +/* + * Types of memory to be allocated + */ +#define M_FREE 0 /* should be on free list */ +#define M_MBUF 1 /* mbuf */ +#define M_DEVBUF 2 /* device driver memory */ +#define M_SOCKET 3 /* socket structure */ +#define M_PCB 4 /* protocol control block */ +#define M_RTABLE 5 /* routing tables */ +#define M_HTABLE 6 /* IMP host tables */ +#define M_FTABLE 7 /* fragment reassembly header */ +#define M_ZOMBIE 8 /* zombie proc status */ +#define M_IFADDR 9 /* interface address */ +#define M_SOOPTS 10 /* socket options */ +#define M_SONAME 11 /* socket name */ +#define M_NAMEI 12 /* namei path name buffer */ +#define M_GPROF 13 /* kernel profiling buffer */ +#define M_IOCTLOPS 14 /* ioctl data buffer */ +#define M_MAPMEM 15 /* mapped memory descriptors */ +#define M_CRED 16 /* credentials */ +#define M_PGRP 17 /* process group header */ +#define M_SESSION 18 /* session header */ +#define M_IOV 19 /* large iov's */ +#define M_MOUNT 20 /* vfs mount struct */ +#define M_FHANDLE 21 /* network file handle */ +#define M_NFSREQ 22 /* NFS request header */ +#define M_NFSMNT 23 /* NFS mount structure */ +#define M_NFSNODE 24 /* NFS vnode private part */ +#define M_VNODE 25 /* Dynamically allocated vnodes */ +#define M_CACHE 26 /* Dynamically allocated cache entries */ +#define M_DQUOT 27 /* UFS quota entries */ +#define M_UFSMNT 28 /* UFS mount structure */ +#define M_SHM 29 /* SVID compatible shared memory segments */ +#define M_VMMAP 30 /* VM map structures */ +#define M_VMMAPENT 31 /* VM map entry structures */ +#define M_VMOBJ 32 /* VM object structure */ +#define M_VMOBJHASH 33 /* VM object hash structure */ +#define M_VMPMAP 34 /* VM pmap */ +#define M_VMPVENT 35 /* VM phys-virt mapping entry */ +#define M_VMPAGER 36 /* XXX: VM pager struct */ +#define M_VMPGDATA 37 /* XXX: VM pager private data */ +#define M_FILE 38 /* Open file structure */ +#define M_FILEDESC 39 /* Open file descriptor table */ +#define M_LOCKF 40 /* Byte-range locking structures */ +#define M_PROC 41 /* Proc structures */ +#define M_SUBPROC 42 /* Proc sub-structures */ +#define M_SEGMENT 43 /* Segment for LFS */ +#define M_LFSNODE 44 /* LFS vnode private part */ +#define M_FFSNODE 45 /* FFS vnode private part */ +#define M_MFSNODE 46 /* MFS vnode private part */ +#define M_NQLEASE 47 /* Nqnfs lease */ +#define M_NQMHOST 48 /* Nqnfs host address table */ +#define M_NETADDR 49 /* Export host address structure */ +#define M_NFSSVC 50 /* Nfs server structure */ +#define M_NFSUID 51 /* Nfs uid mapping structure */ +#define M_NFSD 52 /* Nfs server daemon structure */ +#define M_IPMOPTS 53 /* internet multicast options */ +#define M_IPMADDR 54 /* internet multicast address */ +#define M_IFMADDR 55 /* link-level multicast address */ +#define M_MRTABLE 56 /* multicast routing tables */ +#define M_ISOFSMNT 57 /* ISOFS mount structure */ +#define M_ISOFSNODE 58 /* ISOFS vnode private part */ +#define M_MSDOSFSMNT 59 /* MSDOSFS mount structure */ +#define M_MSDOSFSNODE 60 /* MSDOSFS vnode private part */ +#define M_MSDOSFSFAT 61 /* MSDOSFS file allocation table */ +#define M_DEVFSMNT 62 /* DEVFS mount structure */ +#define M_DEVFSBACK 63 /* DEVFS Back node */ +#define M_DEVFSFRONT 64 /* DEVFS Front node */ +#define M_DEVFSNODE 65 /* DEVFS node */ +#define M_TEMP 74 /* misc temporary data buffers */ +#define M_TTYS 75 /* tty data structures */ +#define M_GZIP 76 /* Gzip trees */ +#define M_IPFW 77 /* IpFw/IpAcct chain's */ +#define M_DEVL 78 /* isa_device lists in userconfig() */ +#define M_LAST 79 /* Must be last type + 1 */ + +#define INITKMEMNAMES { \ + "free", /* 0 M_FREE */ \ + "mbuf", /* 1 M_MBUF */ \ + "devbuf", /* 2 M_DEVBUF */ \ + "socket", /* 3 M_SOCKET */ \ + "pcb", /* 4 M_PCB */ \ + "routetbl", /* 5 M_RTABLE */ \ + "hosttbl", /* 6 M_HTABLE */ \ + "fragtbl", /* 7 M_FTABLE */ \ + "zombie", /* 8 M_ZOMBIE */ \ + "ifaddr", /* 9 M_IFADDR */ \ + "soopts", /* 10 M_SOOPTS */ \ + "soname", /* 11 M_SONAME */ \ + "namei", /* 12 M_NAMEI */ \ + "gprof", /* 13 M_GPROF */ \ + "ioctlops", /* 14 M_IOCTLOPS */ \ + "mapmem", /* 15 M_MAPMEM */ \ + "cred", /* 16 M_CRED */ \ + "pgrp", /* 17 M_PGRP */ \ + "session", /* 18 M_SESSION */ \ + "iov", /* 19 M_IOV */ \ + "mount", /* 20 M_MOUNT */ \ + "fhandle", /* 21 M_FHANDLE */ \ + "NFS req", /* 22 M_NFSREQ */ \ + "NFS mount", /* 23 M_NFSMNT */ \ + "NFS node", /* 24 M_NFSNODE */ \ + "vnodes", /* 25 M_VNODE */ \ + "namecache", /* 26 M_CACHE */ \ + "UFS quota", /* 27 M_DQUOT */ \ + "UFS mount", /* 28 M_UFSMNT */ \ + "shm", /* 29 M_SHM */ \ + "VM map", /* 30 M_VMMAP */ \ + "VM mapent", /* 31 M_VMMAPENT */ \ + "VM object", /* 32 M_VMOBJ */ \ + "VM objhash", /* 33 M_VMOBJHASH */ \ + "VM pmap", /* 34 M_VMPMAP */ \ + "VM pvmap", /* 35 M_VMPVENT */ \ + "VM pager", /* 36 M_VMPAGER */ \ + "VM pgdata", /* 37 M_VMPGDATA */ \ + "file", /* 38 M_FILE */ \ + "file desc", /* 39 M_FILEDESC */ \ + "lockf", /* 40 M_LOCKF */ \ + "proc", /* 41 M_PROC */ \ + "subproc", /* 42 M_SUBPROC */ \ + "LFS segment", /* 43 M_SEGMENT */ \ + "LFS node", /* 44 M_LFSNODE */ \ + "FFS node", /* 45 M_FFSNODE */ \ + "MFS node", /* 46 M_MFSNODE */ \ + "NQNFS Lease", /* 47 M_NQLEASE */ \ + "NQNFS Host", /* 48 M_NQMHOST */ \ + "Export Host", /* 49 M_NETADDR */ \ + "NFS srvsock", /* 50 M_NFSSVC */ \ + "NFS uid", /* 51 M_NFSUID */ \ + "NFS daemon", /* 52 M_NFSD */ \ + "ip_moptions", /* 53 M_IPMOPTS */ \ + "in_multi", /* 54 M_IPMADDR */ \ + "ether_multi", /* 55 M_IFMADDR */ \ + "mrt", /* 56 M_MRTABLE */ \ + "ISOFS mount", /* 57 M_ISOFSMNT */ \ + "ISOFS node", /* 58 M_ISOFSNODE */ \ + "MSDOSFS mount",/* 59 M_MSDOSFSMNT */ \ + "MSDOSFS node", /* 60 M_MSDOSFSNODE */ \ + "MSDOSFS FAT", /* 61 M_MSDOSFSFAR */ \ + "DEVFS mount", /* 62 M_DEVFSMNT */ \ + "DEVFS back", /* 63 M_DEVFSBACK */ \ + "DEVFS front", /* 64 M_DEVFSFRONT */ \ + "DEVFS node", /* 65 M_DEVFSNODE */ \ + NULL, \ + NULL, NULL, NULL, NULL, NULL, \ + NULL, NULL, \ + "temp", /* 74 M_TEMP */ \ + "ttys", /* 75 M_TTYS */ \ + "Gzip trees", /* 76 M_GZIP */ \ + "IpFw/IpAcct", /* 77 M_IPFW */ \ + "isa_devlist", /* 78 M_DEVL */ \ +} + +struct kmemstats { + long ks_inuse; /* # of packets of this type currently in use */ + long ks_calls; /* total packets of this type ever allocated */ + long ks_memuse; /* total memory held in bytes */ + u_short ks_limblocks; /* number of times blocked for hitting limit */ + u_short ks_mapblocks; /* number of times blocked for kernel map */ + long ks_maxused; /* maximum number ever used */ + long ks_limit; /* most that are allowed to exist */ + long ks_size; /* sizes of this thing that are allocated */ + long ks_spare; +}; + +/* + * Array of descriptors that describe the contents of each page + */ +struct kmemusage { + short ku_indx; /* bucket index */ + union { + u_short freecnt;/* for small allocations, free pieces in page */ + u_short pagecnt;/* for large allocations, pages alloced */ + } ku_un; +}; +#define ku_freecnt ku_un.freecnt +#define ku_pagecnt ku_un.pagecnt + +/* + * Set of buckets for each size of memory block that is retained + */ +struct kmembuckets { + caddr_t kb_next; /* list of free blocks */ + caddr_t kb_last; /* last free block */ + long kb_calls; /* total calls to allocate this size */ + long kb_total; /* total number of blocks allocated */ + long kb_totalfree; /* # of free elements in this bucket */ + long kb_elmpercl; /* # of elements in this sized allocation */ + long kb_highwat; /* high water mark */ + long kb_couldfree; /* over high water mark and could free */ +}; + +#ifdef KERNEL +#define MINALLOCSIZE (1 << MINBUCKET) +#define BUCKETINDX(size) \ + (size) <= (MINALLOCSIZE * 128) \ + ? (size) <= (MINALLOCSIZE * 8) \ + ? (size) <= (MINALLOCSIZE * 2) \ + ? (size) <= (MINALLOCSIZE * 1) \ + ? (MINBUCKET + 0) \ + : (MINBUCKET + 1) \ + : (size) <= (MINALLOCSIZE * 4) \ + ? (MINBUCKET + 2) \ + : (MINBUCKET + 3) \ + : (size) <= (MINALLOCSIZE* 32) \ + ? (size) <= (MINALLOCSIZE * 16) \ + ? (MINBUCKET + 4) \ + : (MINBUCKET + 5) \ + : (size) <= (MINALLOCSIZE * 64) \ + ? (MINBUCKET + 6) \ + : (MINBUCKET + 7) \ + : (size) <= (MINALLOCSIZE * 2048) \ + ? (size) <= (MINALLOCSIZE * 512) \ + ? (size) <= (MINALLOCSIZE * 256) \ + ? (MINBUCKET + 8) \ + : (MINBUCKET + 9) \ + : (size) <= (MINALLOCSIZE * 1024) \ + ? (MINBUCKET + 10) \ + : (MINBUCKET + 11) \ + : (size) <= (MINALLOCSIZE * 8192) \ + ? (size) <= (MINALLOCSIZE * 4096) \ + ? (MINBUCKET + 12) \ + : (MINBUCKET + 13) \ + : (size) <= (MINALLOCSIZE * 16384) \ + ? (MINBUCKET + 14) \ + : (MINBUCKET + 15) + +/* + * Turn virtual addresses into kmem map indicies + */ +#define kmemxtob(alloc) (kmembase + (alloc) * NBPG) +#define btokmemx(addr) (((caddr_t)(addr) - kmembase) / NBPG) +#define btokup(addr) (&kmemusage[((caddr_t)(addr) - kmembase) >> CLSHIFT]) + +/* + * Macro versions for the usual cases of malloc/free + */ +#if defined(KMEMSTATS) || defined(DIAGNOSTIC) +#define MALLOC(space, cast, size, type, flags) \ + (space) = (cast)fbsd_malloc((u_long)(size), __FILE__, __LINE__, type, flags) +#define FREE(addr, type) fbsd_free((caddr_t)(addr), __FILE__, __LINE__, type) + +#else /* do not collect statistics */ +#define MALLOC(space, cast, size, type, flags) { \ + register struct kmembuckets *kbp = &bucket[BUCKETINDX(size)]; \ + long s = splimp(); \ + if (kbp->kb_next == NULL) { \ + (space) = (cast)fbsd_malloc((u_long)(size), __FILE__, __LINE__, type, flags); \ + } else { \ + (space) = (cast)kbp->kb_next; \ + kbp->kb_next = *(caddr_t *)(space); \ + } \ + splx(s); \ +} + +#define FREE(addr, type) { \ + register struct kmembuckets *kbp; \ + register struct kmemusage *kup = btokup(addr); \ + long s = splimp(); \ + if (1 << kup->ku_indx > MAXALLOCSAVE) { \ + fbsd_free((caddr_t)(addr), __FILE__, __LINE__, type); \ + } else { \ + kbp = &bucket[kup->ku_indx]; \ + if (kbp->kb_next == NULL) \ + kbp->kb_next = (caddr_t)(addr); \ + else \ + *(caddr_t *)(kbp->kb_last) = (caddr_t)(addr); \ + *(caddr_t *)(addr) = NULL; \ + kbp->kb_last = (caddr_t)(addr); \ + } \ + splx(s); \ +} +#endif /* do not collect statistics */ + +extern struct kmemstats kmemstats[]; +extern struct kmemusage *kmemusage; +extern char *kmembase; +extern struct kmembuckets bucket[]; +#ifndef __REACTOS__ +extern void *malloc __P((unsigned long size, ...)); +extern void free __P((void *addr, ...)); +#endif +#endif /* KERNEL */ +#endif /* !_SYS_MALLOC_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/mbuf.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/mbuf.h new file mode 100644 index 00000000000..3583ee7da50 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/mbuf.h @@ -0,0 +1,512 @@ +/* + * Copyright (c) 1997-1998 University of Utah and the Flux Group. + * All rights reserved. + * + * This file is part of the Flux OSKit. The OSKit is free software, also known + * as "open source;" you can redistribute it and/or modify it under the terms + * of the GNU General Public License (GPL), version 2, as published by the Free + * Software Foundation (FSF). To explore alternate licensing terms, contact + * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. + * + * The OSKit 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 GPL for more details. You should have + * received a copy of the GPL along with the OSKit; see the file COPYING. If + * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. + */ +/* + * Copyright (c) 1982, 1986, 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)mbuf.h 8.3 (Berkeley) 1/21/94 + * $\Id: mbuf.h,v 1.9 1994/11/14 13:54:20 bde Exp $ + */ + +#ifndef _SYS_MBUF_H_ +#define _SYS_MBUF_H_ + +#ifndef M_WAITOK +#include +#endif + +/* + * Mbufs are of a single size, MSIZE (machine/machparam.h), which + * includes overhead. An mbuf may add a single "mbuf cluster" of size + * MCLBYTES (also in machine/machparam.h), which has no additional overhead + * and is used instead of the internal data area; this is done when + * at least MINCLSIZE of data must be stored. + */ + +#define MLEN (MSIZE - sizeof(struct m_hdr)) /* normal data len */ +#define MHLEN (MLEN - sizeof(struct pkthdr)) /* data len w/pkthdr */ + +#define MINCLSIZE (MHLEN + MLEN) /* smallest amount to put in cluster */ +#define M_MAXCOMPRESS (MHLEN / 2) /* max amount to copy for compression */ + +/* + * Macros for type conversion + * mtod(m,t) - convert mbuf pointer to data pointer of correct type + * dtom(x) - convert data pointer within mbuf to mbuf pointer (XXX) + * mtocl(x) - convert pointer within cluster to cluster index # + * cltom(x) - convert cluster # to ptr to beginning of cluster + */ +#define mtod(m,t) ((t)((m)->m_data)) +#define dtom(x) ((struct mbuf *)((int)(x) - sizeof(struct m_hdr))) +#ifndef OSKIT +#define mtocl(x) (((u_int)(x) - (u_int)mbutl) >> MCLSHIFT) +#define cltom(x) ((caddr_t)((u_int)mbutl + ((u_int)(x) << MCLSHIFT))) +#endif /* OSKIT */ + +/* header at beginning of each mbuf: */ +struct m_hdr { + struct mbuf *mh_next; /* next buffer in chain */ + struct mbuf *mh_nextpkt; /* next chain in queue/record */ + int mh_len; /* amount of data in this mbuf */ + caddr_t mh_data; /* location of data */ + short mh_type; /* type of data in this mbuf */ + short mh_flags; /* flags; see below */ +}; + +/* record/packet header in first mbuf of chain; valid if M_PKTHDR set */ +struct pkthdr { + int len; /* total packet length */ + struct ifnet *rcvif; /* rcv interface */ +}; + +/* description of external storage mapped into mbuf, valid if M_EXT set */ +struct m_ext { + caddr_t ext_buf; /* start of buffer */ +#ifdef OSKIT + struct oskit_bufio *ext_bufio; /* OS Kit bufio pointer */ +#else + void (*ext_free) /* free routine if not the usual */ + __P((caddr_t, u_int)); +#endif + u_int ext_size; /* size of buffer, for ext_free */ +}; + +struct mbuf { + struct m_hdr m_hdr; + union { + struct { + struct pkthdr MH_pkthdr; /* M_PKTHDR set */ + union { + struct m_ext MH_ext; /* M_EXT set */ + char MH_databuf[MHLEN]; + } MH_dat; + } MH; + char M_databuf[MLEN]; /* !M_PKTHDR, !M_EXT */ + } M_dat; +}; +#define m_next m_hdr.mh_next +#define m_len m_hdr.mh_len +#define m_data m_hdr.mh_data +#define m_type m_hdr.mh_type +#define m_flags m_hdr.mh_flags +#define m_nextpkt m_hdr.mh_nextpkt +#define m_act m_nextpkt +#define m_pkthdr M_dat.MH.MH_pkthdr +#define m_ext M_dat.MH.MH_dat.MH_ext +#define m_pktdat M_dat.MH.MH_dat.MH_databuf +#define m_dat M_dat.M_databuf + +/* mbuf flags */ +#ifdef OSKIT +#include +/* + * A small step for mankind, but a huge leap for BSD: + * We consistently use oskit_bufios for external mbufs + */ +#endif +#define M_EXT 0x0001 /* has associated external storage */ +#define M_PKTHDR 0x0002 /* start of record */ +#define M_EOR 0x0004 /* end of record */ + +/* mbuf pkthdr flags, also in m_flags */ +#define M_BCAST 0x0100 /* send/received as link-level broadcast */ +#define M_MCAST 0x0200 /* send/received as link-level multicast */ + +/* flags copied when copying m_pkthdr */ +#define M_COPYFLAGS (M_PKTHDR|M_EOR|M_BCAST|M_MCAST) + +/* mbuf types */ +#define MT_FREE 0 /* should be on free list */ +#define MT_DATA 1 /* dynamic (data) allocation */ +#define MT_HEADER 2 /* packet header */ +#define MT_SOCKET 3 /* socket structure */ +#define MT_PCB 4 /* protocol control block */ +#define MT_RTABLE 5 /* routing tables */ +#define MT_HTABLE 6 /* IMP host tables */ +#define MT_ATABLE 7 /* address resolution tables */ +#define MT_SONAME 8 /* socket name */ +#define MT_SOOPTS 10 /* socket options */ +#define MT_FTABLE 11 /* fragment reassembly header */ +#define MT_RIGHTS 12 /* access rights */ +#define MT_IFADDR 13 /* interface address */ +#define MT_CONTROL 14 /* extra-data protocol message */ +#define MT_OOBDATA 15 /* expedited data */ + +/* flags to m_get/MGET */ +#define M_DONTWAIT M_NOWAIT +#define M_WAIT M_WAITOK + +/* + * mbuf utility macros: + * + * MBUFLOCK(code) + * prevents a section of code from from being interrupted by network + * drivers. + */ +#define MBUFLOCK(code) \ + { int ms = splimp(); \ + { code } \ + splx(ms); \ + } + +/* + * mbuf allocation/deallocation macros: + * + * MGET(struct mbuf *m, int how, int type) + * allocates an mbuf and initializes it to contain internal data. + * + * MGETHDR(struct mbuf *m, int how, int type) + * allocates an mbuf and initializes it to contain a packet header + * and internal data. + */ +#define MGET(m, how, type) { \ + MALLOC((m), struct mbuf *, MSIZE, mbtypes[type], (how)); \ + if (m) { \ + (m)->m_type = (type); \ + MBUFLOCK(mbstat.m_mtypes[type]++;) \ + (m)->m_next = (struct mbuf *)NULL; \ + (m)->m_nextpkt = (struct mbuf *)NULL; \ + (m)->m_data = (m)->m_dat; \ + (m)->m_flags = 0; \ + } else \ + (m) = m_retry((how), (type)); \ +} + +#define MGETHDR(m, how, type) { \ + MALLOC((m), struct mbuf *, MSIZE, mbtypes[type], (how)); \ + if (m) { \ + (m)->m_type = (type); \ + MBUFLOCK(mbstat.m_mtypes[type]++;) \ + (m)->m_next = (struct mbuf *)NULL; \ + (m)->m_nextpkt = (struct mbuf *)NULL; \ + (m)->m_data = (m)->m_pktdat; \ + (m)->m_flags = M_PKTHDR; \ + } else { \ + (m) = m_retryhdr((how), (type)); \ + } \ +} + +#if defined(OSKIT) || defined(__REACTOS__) +#define MGET_DONT_RECURSE(m, how, type) { \ + MALLOC((m), struct mbuf *, MSIZE, mbtypes[type], (how)); \ + if (m) { \ + (m)->m_type = (type); \ + MBUFLOCK(mbstat.m_mtypes[type]++;) \ + (m)->m_next = (struct mbuf *)NULL; \ + (m)->m_nextpkt = (struct mbuf *)NULL; \ + (m)->m_data = (m)->m_dat; \ + (m)->m_flags = 0; \ + } else \ + (m) = (struct mbuf *)0; \ +} + +#define MGETHDR_DONT_RECURSE(m, how, type) { \ + MALLOC((m), struct mbuf *, MSIZE, mbtypes[type], (how)); \ + if (m) { \ + (m)->m_type = (type); \ + MBUFLOCK(mbstat.m_mtypes[type]++;) \ + (m)->m_next = (struct mbuf *)NULL; \ + (m)->m_nextpkt = (struct mbuf *)NULL; \ + (m)->m_data = (m)->m_pktdat; \ + (m)->m_flags = M_PKTHDR; \ + } else \ + (m) = (struct mbuf *)0; \ +} +#endif /* OSKIT */ + +#ifndef OSKIT +/* + * Mbuf cluster macros. + * MCLALLOC(caddr_t p, int how) allocates an mbuf cluster. + * MCLGET adds such clusters to a normal mbuf; + * the flag M_EXT is set upon success. + * MCLFREE releases a reference to a cluster allocated by MCLALLOC, + * freeing the cluster if the reference count has reached 0. + * + * Normal mbuf clusters are normally treated as character arrays + * after allocation, but use the first word of the buffer as a free list + * pointer while on the free list. + */ +union mcluster { + union mcluster *mcl_next; + char mcl_buf[MCLBYTES]; +}; + +#define MCLALLOC(p, how) \ + MBUFLOCK( \ + if (mclfree == 0) \ + (void)m_clalloc(1, (how)); \ + (p) = (caddr_t)mclfree; \ + if ((p)) { \ + ++mclrefcnt[mtocl(p)]; \ + mbstat.m_clfree--; \ + mclfree = ((union mcluster *)(p))->mcl_next; \ + } \ + ) + +#define MCLGET(m, how) \ + { MCLALLOC((m)->m_ext.ext_buf, (how)); \ + if ((m)->m_ext.ext_buf != NULL) { \ + (m)->m_data = (m)->m_ext.ext_buf; \ + (m)->m_flags |= M_EXT; \ + (m)->m_ext.ext_size = MCLBYTES; \ + } \ + } + +#define MCLFREE(p) \ + MBUFLOCK ( \ + if (--mclrefcnt[mtocl(p)] == 0) { \ + ((union mcluster *)(p))->mcl_next = mclfree; \ + mclfree = (union mcluster *)(p); \ + mbstat.m_clfree++; \ + } \ + ) +#else +#define MCLGET(m, how) \ + { (m)->m_ext.ext_bufio = oskit_bufio_create(MCLBYTES); \ + oskit_bufio_map((m)->m_ext.ext_bufio, \ + (void **)&((m)->m_ext.ext_buf), 0, MCLBYTES); \ + if ((m)->m_ext.ext_buf != NULL) { \ + (m)->m_data = (m)->m_ext.ext_buf; \ + (m)->m_flags |= M_EXT; \ + (m)->m_ext.ext_size = MCLBYTES; \ + } \ + } + +#endif /* !OSKIT */ + +/* + * MFREE(struct mbuf *m, struct mbuf *n) + * Free a single mbuf and associated external storage. + * Place the successor, if any, in n. + */ +#ifdef notyet +#define MFREE(m, n) \ + { MBUFLOCK(mbstat.m_mtypes[(m)->m_type]--;) \ + if ((m)->m_flags & M_EXT) { \ + if ((m)->m_ext.ext_free) \ + (*((m)->m_ext.ext_free))((m)->m_ext.ext_buf, \ + (m)->m_ext.ext_size); \ + else \ + MCLFREE((m)->m_ext.ext_buf); \ + } \ + (n) = (m)->m_next; \ + FREE((m), mbtypes[(m)->m_type]); \ + } +#else /* notyet */ +#ifdef OSKIT +#define MFREE(m, nn) \ + { MBUFLOCK(mbstat.m_mtypes[(m)->m_type]--;) \ + if ((m)->m_flags & M_EXT) { \ + oskit_bufio_release((m)->m_ext.ext_bufio); \ + } \ + (nn) = (m)->m_next; \ + FREE((m), mbtypes[(m)->m_type]); \ + } +#else /* !OSKIT */ +#define MFREE(m, nn) \ + { MBUFLOCK(mbstat.m_mtypes[(m)->m_type]--;) \ + if ((m)->m_flags & M_EXT) { \ + MCLFREE((m)->m_ext.ext_buf); \ + } \ + (nn) = (m)->m_next; \ + FREE((m), mbtypes[(m)->m_type]); \ + } +#endif /* OSKIT */ +#endif + +/* + * Copy mbuf pkthdr from from to to. + * from must have M_PKTHDR set, and to must be empty. + */ +#define M_COPY_PKTHDR(to, from) { \ + (to)->m_pkthdr = (from)->m_pkthdr; \ + (to)->m_flags = (from)->m_flags & M_COPYFLAGS; \ + (to)->m_data = (to)->m_pktdat; \ +} + +/* + * Set the m_data pointer of a newly-allocated mbuf (m_get/MGET) to place + * an object of the specified size at the end of the mbuf, longword aligned. + */ +#define M_ALIGN(m, len) \ + { (m)->m_data += (MLEN - (len)) &~ (sizeof(long) - 1); } +/* + * As above, for mbufs allocated with m_gethdr/MGETHDR + * or initialized by M_COPY_PKTHDR. + */ +#define MH_ALIGN(m, len) \ + { (m)->m_data += (MHLEN - (len)) &~ (sizeof(long) - 1); } + +/* + * Compute the amount of space available + * before the current start of data in an mbuf. + */ +#ifdef OSKIT +/* Be bold and strong: why shouldn't that work??? */ +#define M_LEADINGSPACE(m) \ + ((m)->m_flags & M_EXT ? (m)->m_data - (m)->m_ext.ext_buf : \ + (m)->m_flags & M_PKTHDR ? (m)->m_data - (m)->m_pktdat : \ + (m)->m_data - (m)->m_dat) +#else +#define M_LEADINGSPACE(m) \ + ((m)->m_flags & M_EXT ? /* (m)->m_data - (m)->m_ext.ext_buf */ 0 : \ + (m)->m_flags & M_PKTHDR ? (m)->m_data - (m)->m_pktdat : \ + (m)->m_data - (m)->m_dat) +#endif /* OSKIT */ + +/* + * Compute the amount of space available + * after the end of data in an mbuf. + */ +#define M_TRAILINGSPACE(m) \ + ((m)->m_flags & M_EXT ? (m)->m_ext.ext_buf + (m)->m_ext.ext_size - \ + ((m)->m_data + (m)->m_len) : \ + &(m)->m_dat[MLEN] - ((m)->m_data + (m)->m_len)) + +/* + * Arrange to prepend space of size plen to mbuf m. + * If a new mbuf must be allocated, how specifies whether to wait. + * If how is M_DONTWAIT and allocation fails, the original mbuf chain + * is freed and m is set to NULL. + */ +#define M_PREPEND(m, plen, how) { \ + if (M_LEADINGSPACE(m) >= (plen)) { \ + (m)->m_data -= (plen); \ + (m)->m_len += (plen); \ + } else \ + (m) = m_prepend((m), (plen), (how)); \ + if ((m) && (m)->m_flags & M_PKTHDR) \ + (m)->m_pkthdr.len += (plen); \ +} + +/* change mbuf to new type */ +#define MCHTYPE(m, t) { \ + MBUFLOCK(mbstat.m_mtypes[(m)->m_type]--; mbstat.m_mtypes[t]++;) \ + (m)->m_type = t;\ +} + +/* length to m_copy to copy all */ +#define M_COPYALL 1000000000 + +/* compatiblity with 4.3 */ +#define m_copy(m, o, l) m_copym((m), (o), (l), M_DONTWAIT) + +/* + * Mbuf statistics. + */ +struct mbstat { + u_long m_mbufs; /* mbufs obtained from page pool */ + u_long m_clusters; /* clusters obtained from page pool */ + u_long m_spare; /* spare field */ + u_long m_clfree; /* free clusters */ + u_long m_drops; /* times failed to find space */ + u_long m_wait; /* times waited for space */ + u_long m_drain; /* times drained protocols for space */ + u_short m_mtypes[256]; /* type specific mbuf allocations */ +}; + +#ifdef KERNEL +#ifndef OSKIT +extern struct mbuf *mbutl; /* virtual address of mclusters */ +extern char *mclrefcnt; /* cluster reference counts */ +#endif /* !OSKIT */ +struct mbstat mbstat; +#ifndef OSKIT +extern int nmbclusters; +union mcluster *mclfree; +#endif /* !OSKIT */ +int max_linkhdr; /* largest link-level header */ +int max_protohdr; /* largest protocol header */ +int max_hdr; /* largest link+protocol header */ +int max_datalen; /* MHLEN - max_hdr */ +extern int mbtypes[]; /* XXX */ + +int m_clalloc __P((int, int)); +void m_copyback __P((struct mbuf *, int, int, caddr_t)); +struct mbuf *m_retry __P((int, int)); +struct mbuf *m_retryhdr __P((int, int)); +void m_reclaim __P((void)); +struct mbuf *m_get __P((int, int)); +struct mbuf *m_gethdr __P((int, int)); +struct mbuf *m_getclr __P((int, int)); +struct mbuf *m_free __P((struct mbuf *)); +void m_freem __P((struct mbuf *)); +struct mbuf *m_prepend __P((struct mbuf *,int,int)); +struct mbuf *m_copym __P((struct mbuf *, int, int, int)); +void m_copydata __P((struct mbuf *,int,int,caddr_t)); +void m_cat __P((struct mbuf *,struct mbuf *)); +void m_adj __P((struct mbuf *,int)); +struct mbuf *m_pullup __P((struct mbuf *, int)); +struct mbuf *m_split __P((struct mbuf *,int,int)); +struct mbuf *m_devget __P((char *, int, int, struct ifnet *, + void (*copy)(struct mbuf *, caddr_t, u_int))); + +#ifdef MBTYPES +int mbtypes[] = { /* XXX */ + M_FREE, /* MT_FREE 0 should be on free list */ + M_MBUF, /* MT_DATA 1 dynamic (data) allocation */ + M_MBUF, /* MT_HEADER 2 packet header */ + M_SOCKET, /* MT_SOCKET 3 socket structure */ + M_PCB, /* MT_PCB 4 protocol control block */ + M_RTABLE, /* MT_RTABLE 5 routing tables */ + M_HTABLE, /* MT_HTABLE 6 IMP host tables */ + 0, /* MT_ATABLE 7 address resolution tables */ + M_MBUF, /* MT_SONAME 8 socket name */ + 0, /* 9 */ + M_SOOPTS, /* MT_SOOPTS 10 socket options */ + M_FTABLE, /* MT_FTABLE 11 fragment reassembly header */ + M_MBUF, /* MT_RIGHTS 12 access rights */ + M_IFADDR, /* MT_IFADDR 13 interface address */ + M_MBUF, /* MT_CONTROL 14 extra-data protocol message */ + M_MBUF, /* MT_OOBDATA 15 expedited data */ +#ifdef DATAKIT + 25, 26, 27, 28, 29, 30, 31, 32 /* datakit ugliness */ +#endif +}; +#endif +#endif + +#endif /* !_SYS_MBUF_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/param.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/param.h new file mode 100644 index 00000000000..99f983d0189 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/param.h @@ -0,0 +1,224 @@ +/*- + * Copyright (c) 1982, 1986, 1989, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)param.h 8.2 (Berkeley) 1/21/94 + */ + +#ifndef _SYS_PARAM_H_ +#define _SYS_PARAM_H_ + +#define BSD 199306 /* System version (year & month). */ +#define BSD4_3 1 +#define BSD4_4 1 + +#ifndef NULL +#define NULL 0 +#endif + +#ifndef LOCORE +#include +#endif + +/* + * Machine-independent constants (some used in following include files). + * Redefined constants are from POSIX 1003.1 limits file. + * + * MAXCOMLEN should be >= sizeof(ac_comm) (see ) + * MAXLOGNAME should be >= UT_NAMESIZE (see ) + */ +#include + +#define MAXCOMLEN 16 /* max command name remembered */ +#define MAXINTERP 32 /* max interpreter file name length */ +#define MAXLOGNAME 12 /* max login name length */ +#define MAXUPRC CHILD_MAX /* max simultaneous processes */ +#define NCARGS ARG_MAX /* max bytes for an exec function */ +#define NGROUPS NGROUPS_MAX /* max number groups */ +#define NOFILE OPEN_MAX /* max open files per process */ +#define NOGROUP 65535 /* marker for empty group set member */ +#define MAXHOSTNAMELEN 256 /* max hostname size */ + +/* More types and definitions used throughout the kernel. */ +#ifdef KERNEL +#include +#include +#include +#include +#include +#include +#include +#endif + +/* Signals. */ +#include + +/* Machine type dependent parameters. */ +#include +#include + +/* + * Priorities. Note that with 32 run queues, differences less than 4 are + * insignificant. + */ +#define PSWP 0 +#define PVM 4 +#define PINOD 8 +#define PRIBIO 16 +#define PVFS 20 +#define PZERO 22 /* No longer magic, shouldn't be here. XXX */ +#define PSOCK 24 +#define PWAIT 32 +#define PLOCK 36 +#define PPAUSE 40 +#define PUSER 50 +#define MAXPRI 127 /* Priorities range from 0 through MAXPRI. */ + +#define PRIMASK 0x0ff +#define PCATCH 0x100 /* OR'd with pri for tsleep to check signals */ + +#define NZERO 0 /* default "nice" */ + +#define NBPW sizeof(int) /* number of bytes per word (integer) */ + +#define CMASK 022 /* default file mask: S_IWGRP|S_IWOTH */ +#define NODEV (dev_t)(-1) /* non-existent device */ + +/* + * Clustering of hardware pages on machines with ridiculously small + * page sizes is done here. The paging subsystem deals with units of + * CLSIZE pte's describing NBPG (from machine/machparam.h) pages each. + */ +#define CLBYTES (CLSIZE*NBPG) +#define CLOFSET (CLSIZE*NBPG-1) /* for clusters, like PGOFSET */ +#define claligned(x) ((((int)(x))&CLOFSET)==0) +#define CLOFF CLOFSET +#define CLSHIFT (PGSHIFT+CLSIZELOG2) + +#if CLSIZE==1 +#define clbase(i) (i) +#define clrnd(i) (i) +#else +/* Give the base virtual address (first of CLSIZE). */ +#define clbase(i) ((i) &~ (CLSIZE-1)) +/* Round a number of clicks up to a whole cluster. */ +#define clrnd(i) (((i) + (CLSIZE-1)) &~ (CLSIZE-1)) +#endif + +#define CBLOCK 128 /* Clist block size, must be a power of 2. */ +#define CBQSIZE (CBLOCK/NBBY) /* Quote bytes/cblock - can do better. */ + /* Data chars/clist. */ +#define CBSIZE (CBLOCK - sizeof(struct cblock *) - CBQSIZE) +#define CROUND (CBLOCK - 1) /* Clist rounding. */ + +/* + * File system parameters and macros. + * + * The file system is made out of blocks of at most MAXBSIZE units, with + * smaller units (fragments) only in the last direct block. MAXBSIZE + * primarily determines the size of buffers in the buffer pool. It may be + * made larger without any effect on existing file systems; however making + * it smaller make make some file systems unmountable. Also, MAXBSIZE + * must be less than MAXPHYS!!! + */ +#define MAXBSIZE 16384 +#define MAXFRAG 8 + +/* + * MAXPATHLEN defines the longest permissable path length after expanding + * symbolic links. It is used to allocate a temporary buffer from the buffer + * pool in which to do the name expansion, hence should be a power of two, + * and must be less than or equal to MAXBSIZE. MAXSYMLINKS defines the + * maximum number of symbolic links that may be expanded in a path name. + * It should be set high enough to allow all legitimate uses, but halt + * infinite loops reasonably quickly. + */ +#define MAXPATHLEN PATH_MAX +#define MAXSYMLINKS 32 + +/* Bit map related macros. */ +#define setbit(a,i) ((a)[(i)/NBBY] |= 1<<((i)%NBBY)) +#define clrbit(a,i) ((a)[(i)/NBBY] &= ~(1<<((i)%NBBY))) +#define isset(a,i) ((a)[(i)/NBBY] & (1<<((i)%NBBY))) +#define isclr(a,i) (((a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0) + +/* Macros for counting and rounding. */ +#ifndef howmany +#define howmany(x, y) (((x)+((y)-1))/(y)) +#endif +#define rounddown(x, y) (((x)/(y))*(y)) +#define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) +#define powerof2(x) ((((x)-1)&(x))==0) + +/* Macros for min/max. */ +#ifndef KERNEL +#define MIN(a,b) (((a)<(b))?(a):(b)) +#define MAX(a,b) (((a)>(b))?(a):(b)) +#endif + +/* + * Constants for setting the parameters of the kernel memory allocator. + * + * 2 ** MINBUCKET is the smallest unit of memory that will be + * allocated. It must be at least large enough to hold a pointer. + * + * Units of memory less or equal to MAXALLOCSAVE will permanently + * allocate physical memory; requests for these size pieces of + * memory are quite fast. Allocations greater than MAXALLOCSAVE must + * always allocate and free physical memory; requests for these + * size allocations should be done infrequently as they will be slow. + * + * Constraints: CLBYTES <= MAXALLOCSAVE <= 2 ** (MINBUCKET + 14), and + * MAXALLOCSIZE must be a power of two. + */ +#define MINBUCKET 4 /* 4 => min allocation of 16 bytes */ +#define MAXALLOCSAVE (2 * CLBYTES) + +/* + * Scale factor for scaled integers used to count %cpu time and load avgs. + * + * The number of CPU `tick's that map to a unique `%age' can be expressed + * by the formula (1 / (2 ^ (FSHIFT - 11))). The maximum load average that + * can be calculated (assuming 32 bits) can be closely approximated using + * the formula (2 ^ (2 * (16 - FSHIFT))) for (FSHIFT < 15). + * + * For the scheduler to maintain a 1:1 mapping of CPU `tick' to `%age', + * FSHIFT must be at least 11; this gives us a maximum load avg of ~1024. + */ +#define FSHIFT 11 /* bits to right of fixed binary point */ +#define FSCALE (1< /* Machine-dependent proc substruct. */ +#include /* For struct rtprio. */ +#include /* For struct selinfo. */ +#include /* For structs itimerval, timeval. */ + +#ifdef OSKIT +#include +#endif + +/* + * One structure allocated per session. + */ +struct session { + int s_count; /* Ref cnt; pgrps in session. */ + struct proc *s_leader; /* Session leader. */ + struct vnode *s_ttyvp; /* Vnode of controlling terminal. */ + struct tty *s_ttyp; /* Controlling terminal. */ + char s_login[MAXLOGNAME]; /* Setlogin() name. */ +}; + +/* + * One structure allocated per process group. + */ +struct pgrp { + struct pgrp *pg_hforw; /* Forward link in hash bucket. */ + struct proc *pg_mem; /* Pointer to pgrp members. */ + struct session *pg_session; /* Pointer to session. */ + pid_t pg_id; /* Pgrp id. */ + int pg_jobc; /* # procs qualifying pgrp for job control */ +}; + +/* + * Description of a process. + * + * This structure contains the information needed to manage a thread of + * control, known in UN*X as a process; it has references to substructures + * containing descriptions of things that the process uses, but may share + * with related processes. The process structure and the substructures + * are always addressible except for those marked "(PROC ONLY)" below, + * which might be addressible only on a processor on which the process + * is running. + */ +struct proc { +#ifndef OSKIT + struct proc *p_forw; /* Doubly-linked run/sleep queue. */ + struct proc *p_back; + struct proc *p_next; /* Linked list of active procs */ + struct proc **p_prev; /* and zombies. */ + + /* substructures: */ + struct pcred *p_cred; /* Process owner's identity. */ + struct filedesc *p_fd; /* Ptr to open files structure. */ + struct pstats *p_stats; /* Accounting/statistics (PROC ONLY). */ + struct plimit *p_limit; /* Process limits. */ + struct vmspace *p_vmspace; /* Address space. */ + struct sigacts *p_sigacts; /* Signal actions, state (PROC ONLY). */ + +#define p_ucred p_cred->pc_ucred +#define p_rlimit p_limit->pl_rlimit + + int p_flag; /* P_* flags. */ + char p_stat; /* S* process status. */ + + char p_pad1[3]; + + pid_t p_pid; /* Process identifier. */ + struct proc *p_hash; /* Hashed based on p_pid for kill+exit+... */ + struct proc *p_pgrpnxt; /* Pointer to next process in process group. */ + struct proc *p_pptr; /* Pointer to process structure of parent. */ + struct proc *p_osptr; /* Pointer to older sibling processes. */ + +/* The following fields are all zeroed upon creation in fork. */ +#define p_startzero p_ysptr + struct proc *p_ysptr; /* Pointer to younger siblings. */ + struct proc *p_cptr; /* Pointer to youngest living child. */ + pid_t p_oppid; /* Save parent pid during ptrace. XXX */ + int p_dupfd; /* Sideways return value from fdopen. XXX */ + + /* scheduling */ + u_int p_estcpu; /* Time averaged value of p_cpticks. */ + int p_cpticks; /* Ticks of cpu time. */ + fixpt_t p_pctcpu; /* %cpu for this process during p_swtime */ + void *p_wchan; /* Sleep address. */ + char *p_wmesg; /* Reason for sleep. */ + u_int p_swtime; /* Time swapped in or out. */ + u_int p_slptime; /* Time since last blocked. */ + + struct itimerval p_realtimer; /* Alarm timer. */ + struct timeval p_rtime; /* Real time. */ + u_quad_t p_uticks; /* Statclock hits in user mode. */ + u_quad_t p_sticks; /* Statclock hits in system mode. */ + u_quad_t p_iticks; /* Statclock hits processing intr. */ + + int p_traceflag; /* Kernel trace points. */ + struct vnode *p_tracep; /* Trace to vnode. */ + + int p_siglist; /* Signals arrived but not delivered. */ + + struct vnode *p_textvp; /* Vnode of executable. */ + + char p_lock; /* Process lock count. */ + char p_pad2[3]; /* alignment */ + long p_spare[2]; /* Pad to 256, avoid shifting eproc. XXX */ + +/* End area that is zeroed on creation. */ +#define p_endzero p_startcopy + +/* The following fields are all copied upon creation in fork. */ +#define p_startcopy p_sigmask + + sigset_t p_sigmask; /* Current signal mask. */ + sigset_t p_sigignore; /* Signals being ignored. */ + sigset_t p_sigcatch; /* Signals being caught by user. */ + + u_char p_priority; /* Process priority. */ + u_char p_usrpri; /* User-priority based on p_cpu and p_nice. */ + char p_nice; /* Process "nice" value. */ + char p_comm[MAXCOMLEN+1]; + + struct pgrp *p_pgrp; /* Pointer to process group. */ + + struct sysentvec *p_sysent; /* System call dispatch information. */ + + struct rtprio p_rtprio; /* Realtime priority. */ +/* End area that is copied on creation. */ +#define p_endcopy p_thread + int p_thread; /* Id for this "thread"; Mach glue. XXX */ + struct user *p_addr; /* Kernel virtual addr of u-area (PROC ONLY). */ + struct mdproc p_md; /* Any machine-dependent fields. */ + + u_short p_xstat; /* Exit status for wait; also stop signal. */ + u_short p_acflag; /* Accounting flags. */ + struct rusage *p_ru; /* Exit information. XXX */ +#else /* OSKIT */ + /* + * let's build our own rudimentary struct proc + */ + struct proc *p_forw; /* Doubly-linked run/sleep queue. */ + struct pcred *p_cred; /* Process owner's identity. */ + struct pstats *p_stats; /* Accounting/statistics (PROC ONLY). */ +#define p_ucred p_cred->pc_ucred + int p_flag; /* P_* flags. */ + char p_stat; /* S* process status. */ + pid_t p_pid; /* Process identifier. */ + void *p_wchan; /* Sleep address. */ + char *p_wmesg; /* Reason for sleep. */ + u_short p_acflag; /* Accounting flags. */ + + osenv_sleeprec_t p_sr; + /* + * When selrecord is invoked, this points to an object used to + * manage a set of listeners + */ + struct listener_mgr *p_sel; +#endif /* !OSKIT */ +}; + +#define p_session p_pgrp->pg_session +#define p_pgid p_pgrp->pg_id + +/* Status values. */ +#define SIDL 1 /* Process being created by fork. */ +#define SRUN 2 /* Currently runnable. */ +#define SSLEEP 3 /* Sleeping on an address. */ +#define SSTOP 4 /* Process debugging or suspension. */ +#define SZOMB 5 /* Awaiting collection by parent. */ + +/* These flags are kept in p_flags. */ +#define P_ADVLOCK 0x00001 /* Process may hold a POSIX advisory lock. */ +#define P_CONTROLT 0x00002 /* Has a controlling terminal. */ +#define P_INMEM 0x00004 /* Loaded into memory. */ +#define P_NOCLDSTOP 0x00008 /* No SIGCHLD when children stop. */ +#define P_PPWAIT 0x00010 /* Parent is waiting for child to exec/exit. */ +#define P_PROFIL 0x00020 /* Has started profiling. */ +#define P_SELECT 0x00040 /* Selecting; wakeup/waiting danger. */ +#define P_SINTR 0x00080 /* Sleep is interruptible. */ +#define P_SUGID 0x00100 /* Had set id privileges since last exec. */ +#define P_SYSTEM 0x00200 /* System proc: no sigs, stats or swapping. */ +#define P_TIMEOUT 0x00400 /* Timing out during sleep. */ +#define P_TRACED 0x00800 /* Debugged process being traced. */ +#define P_WAITED 0x01000 /* Debugging process has waited for child. */ +#define P_WEXIT 0x02000 /* Working on exiting. */ +#define P_EXEC 0x04000 /* Process called exec. */ +#define P_SWAPPING 0x40000 /* Process is being swapped. */ + +/* Should probably be changed into a hold count (They have. -DG). */ +#define P_NOSWAP 0x08000 /* Another flag to prevent swap out. */ +#define P_PHYSIO 0x10000 /* Doing physical I/O. */ + +/* Should be moved to machine-dependent areas. */ +#define P_OWEUPC 0x20000 /* Owe process an addupc() call at next ast. */ + +/* + * MOVE TO ucred.h? + * + * Shareable process credentials (always resident). This includes a reference + * to the current user credentials as well as real and saved ids that may be + * used to change ids. + */ +struct pcred { + struct ucred *pc_ucred; /* Current credentials. */ + uid_t p_ruid; /* Real user id. */ + uid_t p_svuid; /* Saved effective user id. */ + gid_t p_rgid; /* Real group id. */ + gid_t p_svgid; /* Saved effective group id. */ + int p_refcnt; /* Number of references. */ +}; + +#ifdef KERNEL +/* + * We use process IDs <= PID_MAX; PID_MAX + 1 must also fit in a pid_t, + * as it is used to represent "no process group". + */ +#define PID_MAX 30000 +#define NO_PID 30001 +#define PIDHASH(pid) ((pid) & pidhashmask) + +#define SESS_LEADER(p) ((p)->p_session->s_leader == (p)) +#define SESSHOLD(s) ((s)->s_count++) +#define SESSRELE(s) { \ + if (--(s)->s_count == 0) \ + FREE(s, M_SESSION); \ +} + +extern struct proc *pidhash[]; /* In param.c. */ +extern struct pgrp *pgrphash[]; /* In param.c. */ +extern struct proc *curproc; /* Current running proc. */ +extern struct proc proc0; /* Process slot for swapper. */ +extern int nprocs, maxproc; /* Current and max number of procs. */ +extern int maxprocperuid; /* Max procs per uid. */ +extern int pidhashmask; /* In param.c. */ + +extern volatile struct proc *allproc; /* List of active procs. */ +extern struct proc *zombproc; /* List of zombie procs. */ +extern struct proc *initproc, *pageproc; /* Process slots for init, pager. */ + +#define NQS 32 /* 32 run queues. */ +extern struct prochd qs[]; +extern struct prochd rtqs[]; +extern struct prochd idqs[]; +extern int whichqs; /* Bit mask summary of non-empty Q's. */ +struct prochd { + struct proc *ph_link; /* Linked list of running processes. */ + struct proc *ph_rlink; +}; + +int chgproccnt __P((uid_t, int)); +struct proc *pfind __P((pid_t)); /* Find process by id. */ +struct proc *zpfind __P((pid_t)); /* Find zombie process by id. */ +struct pgrp *pgfind __P((pid_t)); /* Find process group by id. */ +void mi_switch __P((void)); +void resetpriority __P((struct proc *)); +void roundrobin __P((void *)); +void schedcpu __P((void *)); +void setrunnable __P((struct proc *)); +void setrunqueue __P((struct proc *)); +void remrq __P((struct proc *)); +void cpu_switch __P((struct proc *)); +void sleep __P((void *chan, int pri)); +int tsleep __P((void *chan, int pri, char *wmesg, int timo)); +void unsleep __P((struct proc *)); +void wakeup __P((void *chan)); + +__dead void cpu_exit __P((struct proc *)) __dead2; +__dead void exit1 __P((struct proc *, int)) __dead2; +void fixjobc __P((struct proc *, struct pgrp *, int)); +int acct_process __P((struct proc *)); +int leavepgrp __P((struct proc *)); +int enterpgrp __P((struct proc *, pid_t, int)); +int trace_req __P((struct proc *)); +void cpu_wait __P((struct proc *)); +int cpu_coredump __P((struct proc *, struct vnode *, struct ucred *)); +int inferior __P((struct proc *)); +#endif /* KERNEL */ + +#endif /* !_SYS_PROC_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/protosw.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/protosw.h new file mode 100644 index 00000000000..8d5e161e5a3 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/protosw.h @@ -0,0 +1,221 @@ +/*- + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)protosw.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _SYS_PROTOSW_H_ +#define _SYS_PROTOSW_H_ + +/* + * Protocol switch table. + * + * Each protocol has a handle initializing one of these structures, + * which is used for protocol-protocol and system-protocol communication. + * + * A protocol is called through the pr_init entry before any other. + * Thereafter it is called every 200ms through the pr_fasttimo entry and + * every 500ms through the pr_slowtimo for timer based actions. + * The system will call the pr_drain entry if it is low on space and + * this should throw away any non-critical data. + * + * Protocols pass data between themselves as chains of mbufs using + * the pr_input and pr_output hooks. Pr_input passes data up (towards + * UNIX) and pr_output passes it down (towards the imps); control + * information passes up and down on pr_ctlinput and pr_ctloutput. + * The protocol is responsible for the space occupied by any the + * arguments to these entries and must dispose it. + * + * The userreq routine interfaces protocols to the system and is + * described below. + */ +struct protosw { + short pr_type; /* socket type used for */ + struct domain *pr_domain; /* domain protocol a member of */ + short pr_protocol; /* protocol number */ + short pr_flags; /* see below */ +/* protocol-protocol hooks */ + void (*pr_input)(); /* input to protocol (from below) */ + int (*pr_output)(); /* output to protocol (from above) */ + void (*pr_ctlinput)(); /* control input (from below) */ + int (*pr_ctloutput)(); /* control output (from above) */ +/* user-protocol hook */ + int (*pr_usrreq)(); /* user request: see list below */ +/* utility hooks */ + void (*pr_init)(); /* initialization hook */ + void (*pr_fasttimo)(); /* fast timeout (200ms) */ + void (*pr_slowtimo)(); /* slow timeout (500ms) */ + void (*pr_drain)(); /* flush any excess space possible */ + int (*pr_sysctl)(); /* sysctl for protocol */ +}; + +#define PR_SLOWHZ 2 /* 2 slow timeouts per second */ +#define PR_FASTHZ 5 /* 5 fast timeouts per second */ + +/* + * Values for pr_flags. + * PR_ADDR requires PR_ATOMIC; + * PR_ADDR and PR_CONNREQUIRED are mutually exclusive. + * PR_IMPLOPCL means that the protocol allows sendto without prior connect, + * and the protocol understands the MSG_EOF flag. The first property is + * is only relevant if PR_CONNREQUIRED is set (otherwise sendto is allowed + * anyhow). + */ +#define PR_ATOMIC 0x01 /* exchange atomic messages only */ +#define PR_ADDR 0x02 /* addresses given with messages */ +#define PR_CONNREQUIRED 0x04 /* connection required by protocol */ +#define PR_WANTRCVD 0x08 /* want PRU_RCVD calls */ +#define PR_RIGHTS 0x10 /* passes capabilities */ +#define PR_IMPLOPCL 0x20 /* implied open/close */ + +/* + * The arguments to usrreq are: + * (*protosw[].pr_usrreq)(up, req, m, nam, opt); + * where up is a (struct socket *), req is one of these requests, + * m is a optional mbuf chain containing a message, + * nam is an optional mbuf chain containing an address, + * and opt is a pointer to a socketopt structure or nil. + * The protocol is responsible for disposal of the mbuf chain m, + * the caller is responsible for any space held by nam and opt. + * A non-zero return from usrreq gives an + * UNIX error number which should be passed to higher level software. + */ +#define PRU_ATTACH 0 /* attach protocol to up */ +#define PRU_DETACH 1 /* detach protocol from up */ +#define PRU_BIND 2 /* bind socket to address */ +#define PRU_LISTEN 3 /* listen for connection */ +#define PRU_CONNECT 4 /* establish connection to peer */ +#define PRU_ACCEPT 5 /* accept connection from peer */ +#define PRU_DISCONNECT 6 /* disconnect from peer */ +#define PRU_SHUTDOWN 7 /* won't send any more data */ +#define PRU_RCVD 8 /* have taken data; more room now */ +#define PRU_SEND 9 /* send this data */ +#define PRU_ABORT 10 /* abort (fast DISCONNECT, DETATCH) */ +#define PRU_CONTROL 11 /* control operations on protocol */ +#define PRU_SENSE 12 /* return status into m */ +#define PRU_RCVOOB 13 /* retrieve out of band data */ +#define PRU_SENDOOB 14 /* send out of band data */ +#define PRU_SOCKADDR 15 /* fetch socket's address */ +#define PRU_PEERADDR 16 /* fetch peer's address */ +#define PRU_CONNECT2 17 /* connect two sockets */ +/* begin for protocols internal use */ +#define PRU_FASTTIMO 18 /* 200ms timeout */ +#define PRU_SLOWTIMO 19 /* 500ms timeout */ +#define PRU_PROTORCV 20 /* receive from below */ +#define PRU_PROTOSEND 21 /* send to below */ +#define PRU_SEND_EOF 22 /* send and close */ +#define PRU_NREQ 22 + +#ifdef PRUREQUESTS +char *prurequests[] = { + "ATTACH", "DETACH", "BIND", "LISTEN", + "CONNECT", "ACCEPT", "DISCONNECT", "SHUTDOWN", + "RCVD", "SEND", "ABORT", "CONTROL", + "SENSE", "RCVOOB", "SENDOOB", "SOCKADDR", + "PEERADDR", "CONNECT2", "FASTTIMO", "SLOWTIMO", + "PROTORCV", "PROTOSEND", + "SEND_EOF", +}; +#endif + +/* + * The arguments to the ctlinput routine are + * (*protosw[].pr_ctlinput)(cmd, sa, arg); + * where cmd is one of the commands below, sa is a pointer to a sockaddr, + * and arg is an optional caddr_t argument used within a protocol family. + */ +#define PRC_IFDOWN 0 /* interface transition */ +#define PRC_ROUTEDEAD 1 /* select new route if possible ??? */ +#define PRC_QUENCH2 3 /* DEC congestion bit says slow down */ +#define PRC_QUENCH 4 /* some one said to slow down */ +#define PRC_MSGSIZE 5 /* message size forced drop */ +#define PRC_HOSTDEAD 6 /* host appears to be down */ +#define PRC_HOSTUNREACH 7 /* deprecated (use PRC_UNREACH_HOST) */ +#define PRC_UNREACH_NET 8 /* no route to network */ +#define PRC_UNREACH_HOST 9 /* no route to host */ +#define PRC_UNREACH_PROTOCOL 10 /* dst says bad protocol */ +#define PRC_UNREACH_PORT 11 /* bad port # */ +/* was PRC_UNREACH_NEEDFRAG 12 (use PRC_MSGSIZE) */ +#define PRC_UNREACH_SRCFAIL 13 /* source route failed */ +#define PRC_REDIRECT_NET 14 /* net routing redirect */ +#define PRC_REDIRECT_HOST 15 /* host routing redirect */ +#define PRC_REDIRECT_TOSNET 16 /* redirect for type of service & net */ +#define PRC_REDIRECT_TOSHOST 17 /* redirect for tos & host */ +#define PRC_TIMXCEED_INTRANS 18 /* packet lifetime expired in transit */ +#define PRC_TIMXCEED_REASS 19 /* lifetime expired on reass q */ +#define PRC_PARAMPROB 20 /* header incorrect */ + +#define PRC_NCMDS 21 + +#define PRC_IS_REDIRECT(cmd) \ + ((cmd) >= PRC_REDIRECT_NET && (cmd) <= PRC_REDIRECT_TOSHOST) + +#ifdef PRCREQUESTS +char *prcrequests[] = { + "IFDOWN", "ROUTEDEAD", "#2", "DEC-BIT-QUENCH2", + "QUENCH", "MSGSIZE", "HOSTDEAD", "#7", + "NET-UNREACH", "HOST-UNREACH", "PROTO-UNREACH", "PORT-UNREACH", + "#12", "SRCFAIL-UNREACH", "NET-REDIRECT", "HOST-REDIRECT", + "TOSNET-REDIRECT", "TOSHOST-REDIRECT", "TX-INTRANS", "TX-REASS", + "PARAMPROB" +}; +#endif + +/* + * The arguments to ctloutput are: + * (*protosw[].pr_ctloutput)(req, so, level, optname, optval); + * req is one of the actions listed below, so is a (struct socket *), + * level is an indication of which protocol layer the option is intended. + * optname is a protocol dependent socket option request, + * optval is a pointer to a mbuf-chain pointer, for value-return results. + * The protocol is responsible for disposal of the mbuf chain *optval + * if supplied, + * the caller is responsible for any space held by *optval, when returned. + * A non-zero return from usrreq gives an + * UNIX error number which should be passed to higher level software. + */ +#define PRCO_GETOPT 0 +#define PRCO_SETOPT 1 + +#define PRCO_NCMDS 2 + +#ifdef PRCOREQUESTS +char *prcorequests[] = { + "GETOPT", "SETOPT", +}; +#endif + +#ifdef KERNEL +extern struct protosw *pffindproto(), *pffindtype(); +#endif + +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/queue.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/queue.h new file mode 100644 index 00000000000..fee9536f9e6 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/queue.h @@ -0,0 +1,391 @@ +/* + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)queue.h 8.5 (Berkeley) 8/20/94 + */ + +#ifndef _SYS_QUEUE_H_ +#define _SYS_QUEUE_H_ + +/* + * This file defines five types of data structures: singly-linked lists, + * slingly-linked tail queues, lists, tail queues, and circular queues. + * + * A singly-linked list is headed by a single forward pointer. The elements + * are singly linked for minimum space and pointer manipulation overhead at + * the expense of O(n) removal for arbitrary elements. New elements can be + * added to the list after an existing element or at the head of the list. + * Elements being removed from the head of the list should use the explicit + * macro for this purpose for optimum efficiency. A singly-linked list may + * only be traversed in the forward direction. Singly-linked lists are ideal + * for applications with large datasets and few or no removals or for + * implementing a LIFO queue. + * + * A singly-linked tail queue is headed by a pair of pointers, one to the + * head of the list and the other to the tail of the list. The elements are + * singly linked for minimum space and pointer manipulation overhead at the + * expense of O(n) removal for arbitrary elements. New elements can be added + * to the list after an existing element, at the head of the list, or at the + * end of the list. Elements being removed from the head of the tail queue + * should use the explicit macro for this purpose for optimum efficiency. + * A singly-linked tail queue may only be traversed in the forward direction. + * Singly-linked tail queues are ideal for applications with large datasets + * and few or no removals or for implementing a FIFO queue. + * + * A list is headed by a single forward pointer (or an array of forward + * pointers for a hash table header). The elements are doubly linked + * so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before + * or after an existing element or at the head of the list. A list + * may only be traversed in the forward direction. + * + * A tail queue is headed by a pair of pointers, one to the head of the + * list and the other to the tail of the list. The elements are doubly + * linked so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before or + * after an existing element, at the head of the list, or at the end of + * the list. A tail queue may only be traversed in the forward direction. + * + * A circle queue is headed by a pair of pointers, one to the head of the + * list and the other to the tail of the list. The elements are doubly + * linked so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before or after + * an existing element, at the head of the list, or at the end of the list. + * A circle queue may be traversed in either direction, but has a more + * complex end of list detection. + * + * For details on the use of these macros, see the queue(3) manual page. + */ + +#undef SLIST_HEAD +#undef SLIST_ENTRY +#undef SLIST_INIT + +/* + * Singly-linked List definitions. + */ +#define SLIST_HEAD(name, type) \ +struct name { \ + struct type *slh_first; /* first element */ \ +} + +#define SLIST_ENTRY(type) \ +struct { \ + struct type *sle_next; /* next element */ \ +} + +/* + * Singly-linked List functions. + */ +#define SLIST_INIT(head) { \ + (head)->slh_first = NULL; \ +} + +#define SLIST_INSERT_AFTER(slistelm, elm, field) { \ + (elm)->field.sle_next = (slistelm)->field.sle_next; \ + (slistelm)->field.sle_next = (elm); \ +} + +#define SLIST_INSERT_HEAD(head, elm, field) { \ + (elm)->field.sle_next = (head)->slh_first; \ + (head)->slh_first = (elm); \ +} + +#define SLIST_REMOVE_HEAD(head, field) { \ + (head)->slh_first = (head)->slh_first->field.sle_next; \ +} + +#define SLIST_REMOVE(head, elm, type, field) { \ + if ((head)->slh_first == (elm)) { \ + SLIST_REMOVE_HEAD((head), field); \ + } \ + else { \ + struct type *curelm = (head)->slh_first; \ + while( curelm->field.sle_next != (elm) ) \ + curelm = curelm->field.sle_next; \ + curelm->field.sle_next = \ + curelm->field.sle_next->field.sle_next; \ + } \ +} + +/* + * Singly-linked Tail queue definitions. + */ +#define STAILQ_HEAD(name, type) \ +struct name { \ + struct type *stqh_first;/* first element */ \ + struct type **stqh_last;/* addr of last next element */ \ +} + +#define STAILQ_ENTRY(type) \ +struct { \ + struct type *stqe_next; /* next element */ \ +} + +/* + * Singly-linked Tail queue functions. + */ +#define STAILQ_INIT(head) { \ + (head)->stqh_first = NULL; \ + (head)->stqh_last = &(head)->stqh_first; \ +} + +#define STAILQ_INSERT_HEAD(head, elm, field) { \ + if (((elm)->field.stqe_next = (head)->stqh_first) == NULL) \ + (head)->stqh_last = &(elm)->field.stqe_next; \ + (head)->stqh_first = (elm); \ +} + +#define STAILQ_INSERT_TAIL(head, elm, field) { \ + (elm)->field.stqe_next = NULL; \ + *(head)->stqh_last = (elm); \ + (head)->stqh_last = &(elm)->field.stqe_next; \ +} + +#define STAILQ_INSERT_AFTER(head, tqelm, elm, field) { \ + if (((elm)->field.stqe_next = (tqelm)->field.stqe_next) == NULL)\ + (head)->stqh_last = &(elm)->field.stqe_next; \ + (tqelm)->field.stqe_next = (elm); \ +} + +#define STAILQ_REMOVE_HEAD(head, field) { \ + if (((head)->stqh_first = \ + (head)->stqh_first->field.stqe_next) == NULL) \ + (head)->stqh_last = &(head)->stqh_first; \ +} + +#define STAILQ_REMOVE(head, elm, type, field) { \ + if ((head)->stqh_first == (elm)) { \ + STAILQ_REMOVE_HEAD(head, field); \ + } \ + else { \ + struct type *curelm = (head)->stqh_first; \ + while( curelm->field.stqe_next != (elm) ) \ + curelm = curelm->field.stqe_next; \ + if((curelm->field.stqe_next = \ + curelm->field.stqe_next->field.stqe_next) == NULL) \ + (head)->stqh_last = &(curelm)->field.stqe_next; \ + } \ +} + +/* + * List definitions. + */ +#define LIST_HEAD(name, type) \ +struct name { \ + struct type *lh_first; /* first element */ \ +} + +#define LIST_ENTRY(type) \ +struct { \ + struct type *le_next; /* next element */ \ + struct type **le_prev; /* address of previous next element */ \ +} + +/* + * List functions. + */ +#define LIST_INIT(head) { \ + (head)->lh_first = NULL; \ +} + +#define LIST_INSERT_AFTER(listelm, elm, field) { \ + if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \ + (listelm)->field.le_next->field.le_prev = \ + &(elm)->field.le_next; \ + (listelm)->field.le_next = (elm); \ + (elm)->field.le_prev = &(listelm)->field.le_next; \ +} + +#define LIST_INSERT_BEFORE(listelm, elm, field) { \ + (elm)->field.le_prev = (listelm)->field.le_prev; \ + (elm)->field.le_next = (listelm); \ + *(listelm)->field.le_prev = (elm); \ + (listelm)->field.le_prev = &(elm)->field.le_next; \ +} + +#define LIST_INSERT_HEAD(head, elm, field) { \ + if (((elm)->field.le_next = (head)->lh_first) != NULL) \ + (head)->lh_first->field.le_prev = &(elm)->field.le_next;\ + (head)->lh_first = (elm); \ + (elm)->field.le_prev = &(head)->lh_first; \ +} + +#define LIST_REMOVE(elm, field) { \ + if ((elm)->field.le_next != NULL) \ + (elm)->field.le_next->field.le_prev = \ + (elm)->field.le_prev; \ + *(elm)->field.le_prev = (elm)->field.le_next; \ +} + +/* + * Tail queue definitions. + */ +#define TAILQ_HEAD(name, type) \ +struct name { \ + struct type *tqh_first; /* first element */ \ + struct type **tqh_last; /* addr of last next element */ \ +} + +#define TAILQ_ENTRY(type) \ +struct { \ + struct type *tqe_next; /* next element */ \ + struct type **tqe_prev; /* address of previous next element */ \ +} + +/* + * Tail queue functions. + */ +#define TAILQ_INIT(head) { \ + (head)->tqh_first = NULL; \ + (head)->tqh_last = &(head)->tqh_first; \ +} + +#define TAILQ_INSERT_HEAD(head, elm, field) { \ + if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \ + (head)->tqh_first->field.tqe_prev = \ + &(elm)->field.tqe_next; \ + else \ + (head)->tqh_last = &(elm)->field.tqe_next; \ + (head)->tqh_first = (elm); \ + (elm)->field.tqe_prev = &(head)->tqh_first; \ +} + +#define TAILQ_INSERT_TAIL(head, elm, field) { \ + (elm)->field.tqe_next = NULL; \ + (elm)->field.tqe_prev = (head)->tqh_last; \ + *(head)->tqh_last = (elm); \ + (head)->tqh_last = &(elm)->field.tqe_next; \ +} + +#define TAILQ_INSERT_AFTER(head, listelm, elm, field) { \ + if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\ + (elm)->field.tqe_next->field.tqe_prev = \ + &(elm)->field.tqe_next; \ + else \ + (head)->tqh_last = &(elm)->field.tqe_next; \ + (listelm)->field.tqe_next = (elm); \ + (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ +} + +#define TAILQ_INSERT_BEFORE(listelm, elm, field) { \ + (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ + (elm)->field.tqe_next = (listelm); \ + *(listelm)->field.tqe_prev = (elm); \ + (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ +} + +#define TAILQ_REMOVE(head, elm, field) { \ + if (((elm)->field.tqe_next) != NULL) \ + (elm)->field.tqe_next->field.tqe_prev = \ + (elm)->field.tqe_prev; \ + else \ + (head)->tqh_last = (elm)->field.tqe_prev; \ + *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ +} + +/* + * Circular queue definitions. + */ +#define CIRCLEQ_HEAD(name, type) \ +struct name { \ + struct type *cqh_first; /* first element */ \ + struct type *cqh_last; /* last element */ \ +} + +#define CIRCLEQ_ENTRY(type) \ +struct { \ + struct type *cqe_next; /* next element */ \ + struct type *cqe_prev; /* previous element */ \ +} + +/* + * Circular queue functions. + */ +#define CIRCLEQ_INIT(head) { \ + (head)->cqh_first = (void *)(head); \ + (head)->cqh_last = (void *)(head); \ +} + +#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) { \ + (elm)->field.cqe_next = (listelm)->field.cqe_next; \ + (elm)->field.cqe_prev = (listelm); \ + if ((listelm)->field.cqe_next == (void *)(head)) \ + (head)->cqh_last = (elm); \ + else \ + (listelm)->field.cqe_next->field.cqe_prev = (elm); \ + (listelm)->field.cqe_next = (elm); \ +} + +#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) { \ + (elm)->field.cqe_next = (listelm); \ + (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \ + if ((listelm)->field.cqe_prev == (void *)(head)) \ + (head)->cqh_first = (elm); \ + else \ + (listelm)->field.cqe_prev->field.cqe_next = (elm); \ + (listelm)->field.cqe_prev = (elm); \ +} + +#define CIRCLEQ_INSERT_HEAD(head, elm, field) { \ + (elm)->field.cqe_next = (head)->cqh_first; \ + (elm)->field.cqe_prev = (void *)(head); \ + if ((head)->cqh_last == (void *)(head)) \ + (head)->cqh_last = (elm); \ + else \ + (head)->cqh_first->field.cqe_prev = (elm); \ + (head)->cqh_first = (elm); \ +} + +#define CIRCLEQ_INSERT_TAIL(head, elm, field) { \ + (elm)->field.cqe_next = (void *)(head); \ + (elm)->field.cqe_prev = (head)->cqh_last; \ + if ((head)->cqh_first == (void *)(head)) \ + (head)->cqh_first = (elm); \ + else \ + (head)->cqh_last->field.cqe_next = (elm); \ + (head)->cqh_last = (elm); \ +} + +#define CIRCLEQ_REMOVE(head, elm, field) { \ + if ((elm)->field.cqe_next == (void *)(head)) \ + (head)->cqh_last = (elm)->field.cqe_prev; \ + else \ + (elm)->field.cqe_next->field.cqe_prev = \ + (elm)->field.cqe_prev; \ + if ((elm)->field.cqe_prev == (void *)(head)) \ + (head)->cqh_first = (elm)->field.cqe_next; \ + else \ + (elm)->field.cqe_prev->field.cqe_next = \ + (elm)->field.cqe_next; \ +} +#endif /* !_SYS_QUEUE_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/resource.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/resource.h new file mode 100644 index 00000000000..cff763c56e5 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/resource.h @@ -0,0 +1,127 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)resource.h 8.2 (Berkeley) 1/4/94 + */ + +#ifndef _SYS_RESOURCE_H_ +#define _SYS_RESOURCE_H_ + +/* + * Process priority specifications to get/setpriority. + */ +#define PRIO_MIN -20 +#define PRIO_MAX 20 + +#define PRIO_PROCESS 0 +#define PRIO_PGRP 1 +#define PRIO_USER 2 + +/* + * Resource utilization information. + */ + +#define RUSAGE_SELF 0 +#define RUSAGE_CHILDREN -1 + +struct rusage { + struct timeval ru_utime; /* user time used */ + struct timeval ru_stime; /* system time used */ + long ru_maxrss; /* max resident set size */ +#define ru_first ru_ixrss + long ru_ixrss; /* integral shared memory size */ + long ru_idrss; /* integral unshared data " */ + long ru_isrss; /* integral unshared stack " */ + long ru_minflt; /* page reclaims */ + long ru_majflt; /* page faults */ + long ru_nswap; /* swaps */ + long ru_inblock; /* block input operations */ + long ru_oublock; /* block output operations */ + long ru_msgsnd; /* messages sent */ + long ru_msgrcv; /* messages received */ + long ru_nsignals; /* signals received */ + long ru_nvcsw; /* voluntary context switches */ + long ru_nivcsw; /* involuntary " */ +#define ru_last ru_nivcsw +}; + +/* + * Resource limits + */ +#define RLIMIT_CPU 0 /* cpu time in milliseconds */ +#define RLIMIT_FSIZE 1 /* maximum file size */ +#define RLIMIT_DATA 2 /* data size */ +#define RLIMIT_STACK 3 /* stack size */ +#define RLIMIT_CORE 4 /* core file size */ +#define RLIMIT_RSS 5 /* resident set size */ +#define RLIMIT_MEMLOCK 6 /* locked-in-memory address space */ +#define RLIMIT_NPROC 7 /* number of processes */ +#define RLIMIT_NOFILE 8 /* number of open files */ + +#define RLIM_NLIMITS 9 /* number of resource limits */ + +#include /* XXX for quad_t */ + +#define RLIM_INFINITY (((u_quad_t)1 << 63) - 1) + +struct orlimit { + long rlim_cur; /* current (soft) limit */ + long rlim_max; /* maximum value for rlim_cur */ +}; + +struct rlimit { + quad_t rlim_cur; /* current (soft) limit */ + quad_t rlim_max; /* maximum value for rlim_cur */ +}; + +/* Load average structure. */ +struct loadavg { + fixpt_t ldavg[3]; + long fscale; +}; + +#ifdef KERNEL +extern struct loadavg averunnable; + +#else +#include + +__BEGIN_DECLS +int getpriority __P((int, int)); +int getrlimit __P((int, struct rlimit *)); +int getrusage __P((int, struct rusage *)); +int setpriority __P((int, int, int)); +int setrlimit __P((int, const struct rlimit *)); +__END_DECLS + +#endif /* KERNEL */ +#endif /* !_SYS_RESOURCE_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/resourcevar.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/resourcevar.h new file mode 100644 index 00000000000..1dd0dc55418 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/resourcevar.h @@ -0,0 +1,97 @@ +/* + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)resourcevar.h 8.3 (Berkeley) 2/22/94 + */ + +#ifndef _SYS_RESOURCEVAR_H_ +#define _SYS_RESOURCEVAR_H_ + +/* + * Kernel per-process accounting / statistics + * (not necessarily resident except when running). + */ +struct pstats { +#define pstat_startzero p_ru + struct rusage p_ru; /* stats for this proc */ + struct rusage p_cru; /* sum of stats for reaped children */ +#define pstat_endzero pstat_startcopy + +#define pstat_startcopy p_timer + struct itimerval p_timer[3]; /* virtual-time timers */ + + struct uprof { /* profile arguments */ + caddr_t pr_base; /* buffer base */ + u_long pr_size; /* buffer size */ + u_long pr_off; /* pc offset */ + u_long pr_scale; /* pc scaling */ + u_long pr_addr; /* temp storage for addr until AST */ + u_long pr_ticks; /* temp storage for ticks until AST */ + } p_prof; +#define pstat_endcopy p_start + struct timeval p_start; /* starting time */ +}; + +/* + * Kernel shareable process resource limits. Because this structure + * is moderately large but changes infrequently, it is normally + * shared copy-on-write after forks. If a group of processes + * ("threads") share modifications, the PL_SHAREMOD flag is set, + * and a copy must be made for the child of a new fork that isn't + * sharing modifications to the limits. + */ +struct plimit { + struct rlimit pl_rlimit[RLIM_NLIMITS]; +#define PL_SHAREMOD 0x01 /* modifications are shared */ + int p_lflags; + int p_refcnt; /* number of references */ +}; + +/* add user profiling from AST */ +#define ADDUPROF(p) \ + addupc_task(p, \ + (p)->p_stats->p_prof.pr_addr, (p)->p_stats->p_prof.pr_ticks) + +#ifdef KERNEL +int addupc __P((int pc, struct uprof *up, int ticks)); +void addupc_intr __P((struct proc *p, u_long pc, u_int ticks)); +void addupc_task __P((struct proc *p, u_long pc, u_int ticks)); +void calcru __P((struct proc *p, struct timeval *up, struct timeval *sp, + struct timeval *ip)); +int fuswintr __P((void *base)); +struct plimit + *limcopy __P((struct plimit *lim)); +void ruadd __P((struct rusage *ru, struct rusage *ru2)); +int suswintr __P((void *base, int word)); +#endif + +#endif /* !_SYS_RESOURCEVAR_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/rtprio.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/rtprio.h new file mode 100644 index 00000000000..9719930d324 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/rtprio.h @@ -0,0 +1,69 @@ +/* + * Copyright (c) 1994, Henrik Vestergaard Draboel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by (name). + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +#ifndef _SYS_RTPRIO_H_ +#define _SYS_RTPRIO_H_ + +/* + * Process realtime-priority specifications to rtprio. + */ + +/* priority types */ +#define RTP_PRIO_REALTIME 0 +#define RTP_PRIO_NORMAL 1 +#define RTP_PRIO_IDLE 2 + +/* priority range */ +#define RTP_PRIO_MIN 0 /* Highest priority */ +#define RTP_PRIO_MAX 31 /* Lowest priority */ + +/* + * rtprio() syscall functions + */ +#define RTP_LOOKUP 0 +#define RTP_SET 1 + +#ifndef LOCORE +struct rtprio { + u_short type; + u_short prio; +}; +#endif + +#ifndef KERNEL +#include + +__BEGIN_DECLS +int rtprio __P((int, pid_t, struct rtprio *)); +__END_DECLS +#endif /* !KERNEL */ +#endif /* !_SYS_RTPRIO_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/select.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/select.h new file mode 100644 index 00000000000..bbb19ffd9a7 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/select.h @@ -0,0 +1,63 @@ +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)select.h 8.2 (Berkeley) 1/4/94 + */ + +#ifndef _SYS_SELECT_H_ +#define _SYS_SELECT_H_ + +#if defined(OSKIT) +struct listener_mgr; +#endif + +/* + * Used to maintain information about processes that wish to be + * notified when I/O becomes possible. + */ +struct selinfo { +#if defined(OSKIT) + struct listener_mgr *si_sel; +#endif /* OSKIT */ + pid_t si_pid; /* process to be notified */ + short si_flags; /* see below */ +}; +#define SI_COLL 0x0001 /* collision occurred */ + +#ifdef KERNEL +struct proc; + +void selrecord __P((struct proc *selector, struct selinfo *)); +void selwakeup __P((struct selinfo *)); +#endif + +#endif /* !_SYS_SELECT_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/signal.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/signal.h new file mode 100644 index 00000000000..ad025895730 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/signal.h @@ -0,0 +1,194 @@ +/* + * Copyright (c) 1982, 1986, 1989, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)signal.h 8.2 (Berkeley) 1/21/94 + */ + +#ifndef _SYS_SIGNAL_H_ +#define _SYS_SIGNAL_H_ + +#define NSIG 32 /* counting 0; could be 33 (mask is 1-32) */ + +#ifndef _ANSI_SOURCE +#include /* sigcontext; codes for SIGILL, SIGFPE */ +#endif + +#define SIGHUP 1 /* hangup */ +#define SIGINT 2 /* interrupt */ +#define SIGQUIT 3 /* quit */ +#define SIGILL 4 /* illegal instruction (not reset when caught) */ +#ifndef _POSIX_SOURCE +#define SIGTRAP 5 /* trace trap (not reset when caught) */ +#endif +#define SIGABRT 6 /* abort() */ +#ifndef _POSIX_SOURCE +#define SIGIOT SIGABRT /* compatibility */ +#define SIGEMT 7 /* EMT instruction */ +#endif +#define SIGFPE 8 /* floating point exception */ +#define SIGKILL 9 /* kill (cannot be caught or ignored) */ +#ifndef _POSIX_SOURCE +#define SIGBUS 10 /* bus error */ +#endif +#define SIGSEGV 11 /* segmentation violation */ +#ifndef _POSIX_SOURCE +#define SIGSYS 12 /* bad argument to system call */ +#endif +#define SIGPIPE 13 /* write on a pipe with no one to read it */ +#define SIGALRM 14 /* alarm clock */ +#define SIGTERM 15 /* software termination signal from kill */ +#ifndef _POSIX_SOURCE +#define SIGURG 16 /* urgent condition on IO channel */ +#endif +#define SIGSTOP 17 /* sendable stop signal not from tty */ +#define SIGTSTP 18 /* stop signal from tty */ +#define SIGCONT 19 /* continue a stopped process */ +#define SIGCHLD 20 /* to parent on child stop or exit */ +#define SIGTTIN 21 /* to readers pgrp upon background tty read */ +#define SIGTTOU 22 /* like TTIN for output if (tp->t_local<OSTOP) */ +#ifndef _POSIX_SOURCE +#define SIGIO 23 /* input/output possible signal */ +#define SIGXCPU 24 /* exceeded CPU time limit */ +#define SIGXFSZ 25 /* exceeded file size limit */ +#define SIGVTALRM 26 /* virtual time alarm */ +#define SIGPROF 27 /* profiling time alarm */ +#define SIGWINCH 28 /* window size changes */ +#define SIGINFO 29 /* information request */ +#endif +#define SIGUSR1 30 /* user defined signal 1 */ +#define SIGUSR2 31 /* user defined signal 2 */ + +#if defined(_ANSI_SOURCE) || defined(__cplusplus) +/* + * Language spec sez we must list exactly one parameter, even though we + * actually supply three. Ugh! + */ +#define SIG_DFL (void (*)(int))0 +#define SIG_IGN (void (*)(int))1 +#define SIG_ERR (void (*)(int))-1 +#else +#define SIG_DFL (void (*)())0 +#define SIG_IGN (void (*)())1 +#define SIG_ERR (void (*)())-1 +#endif + +#ifndef _ANSI_SOURCE +typedef unsigned int sigset_t; + +/* + * Signal vector "template" used in sigaction call. + */ +struct sigaction { + void (*sa_handler)(); /* signal handler */ + sigset_t sa_mask; /* signal mask to apply */ + int sa_flags; /* see signal options below */ +}; +#ifndef _POSIX_SOURCE +#define SA_ONSTACK 0x0001 /* take signal on signal stack */ +#define SA_RESTART 0x0002 /* restart system on signal return */ +#define SA_DISABLE 0x0004 /* disable taking signals on alternate stack */ +#ifdef COMPAT_SUNOS +#define SA_USERTRAMP 0x0100 /* do not bounce off kernel's sigtramp */ +#endif +#endif +#define SA_NOCLDSTOP 0x0008 /* do not generate SIGCHLD on child stop */ + +/* + * Flags for sigprocmask: + */ +#define SIG_BLOCK 1 /* block specified signal set */ +#define SIG_UNBLOCK 2 /* unblock specified signal set */ +#define SIG_SETMASK 3 /* set specified signal set */ + +#ifndef _POSIX_SOURCE +#ifndef KERNEL +#include +#endif +typedef void (*sig_t) __P((int)); /* type of signal function */ + +/* + * Structure used in sigaltstack call. + */ +struct sigaltstack { + char *ss_sp; /* signal stack base */ + int ss_size; /* signal stack length */ + int ss_flags; /* SA_DISABLE and/or SA_ONSTACK */ +}; +#define MINSIGSTKSZ 8192 /* minimum allowable stack */ +#define SIGSTKSZ (MINSIGSTKSZ + 32768) /* recommended stack size */ + +/* + * 4.3 compatibility: + * Signal vector "template" used in sigvec call. + */ +struct sigvec { + void (*sv_handler)(); /* signal handler */ + int sv_mask; /* signal mask to apply */ + int sv_flags; /* see signal options below */ +}; + +#define SV_ONSTACK SA_ONSTACK +#define SV_INTERRUPT SA_RESTART /* same bit, opposite sense */ +#define sv_onstack sv_flags /* isn't compatibility wonderful! */ + +/* + * Structure used in sigstack call. + */ +struct sigstack { + char *ss_sp; /* signal stack pointer */ + int ss_onstack; /* current status */ +}; + +/* + * Macro for converting signal number to a mask suitable for + * sigblock(). + */ +#define sigmask(m) (1 << ((m)-1)) + +#define BADSIG SIG_ERR + +#endif /* !_POSIX_SOURCE */ +#endif /* !_ANSI_SOURCE */ + +/* + * For historical reasons; programs expect signal's return value to be + * defined by . + */ +__BEGIN_DECLS +void (*signal __P((int, void (*) __P((int))))) __P((int)); +__END_DECLS +#endif /* !_SYS_SIGNAL_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/signalvar.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/signalvar.h new file mode 100644 index 00000000000..2c5394d96f4 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/signalvar.h @@ -0,0 +1,170 @@ +/* + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)signalvar.h 8.3 (Berkeley) 1/4/94 + */ + +#ifndef _SYS_SIGNALVAR_H_ /* tmp for user.h */ +#define _SYS_SIGNALVAR_H_ + +/* + * Kernel signal definitions and data structures, + * not exported to user programs. + */ + +/* + * Process signal actions and state, needed only within the process + * (not necessarily resident). + */ +struct sigacts { + sig_t ps_sigact[NSIG]; /* disposition of signals */ + sigset_t ps_catchmask[NSIG]; /* signals to be blocked */ + sigset_t ps_sigonstack; /* signals to take on sigstack */ + sigset_t ps_sigintr; /* signals that interrupt syscalls */ + sigset_t ps_oldmask; /* saved mask from before sigpause */ + int ps_flags; /* signal flags, below */ + struct sigaltstack ps_sigstk; /* sp & on stack state variable */ + int ps_sig; /* for core dump/debugger XXX */ + int ps_code; /* for core dump/debugger XXX */ + int ps_addr; /* for core dump/debugger XXX */ + sigset_t ps_usertramp; /* SunOS compat; libc sigtramp XXX */ +}; + +/* signal flags */ +#define SAS_OLDMASK 0x01 /* need to restore mask before pause */ +#define SAS_ALTSTACK 0x02 /* have alternate signal stack */ + +/* additional signal action values, used only temporarily/internally */ +#define SIG_CATCH (void (*)())2 +#define SIG_HOLD (void (*)())3 + +/* + * get signal action for process and signal; currently only for current process + */ +#define SIGACTION(p, sig) (p->p_sigacts->ps_sigact[(sig)]) + +/* + * Determine signal that should be delivered to process p, the current + * process, 0 if none. If there is a pending stop signal with default + * action, the process stops in issig(). + */ +#define CURSIG(p) \ + (((p)->p_siglist == 0 || \ + (((p)->p_flag & P_TRACED) == 0 && \ + ((p)->p_siglist & ~(p)->p_sigmask) == 0)) ? \ + 0 : issignal(p)) + +/* + * Clear a pending signal from a process. + */ +#define CLRSIG(p, sig) { (p)->p_siglist &= ~sigmask(sig); } + +/* + * Signal properties and actions. + * The array below categorizes the signals and their default actions + * according to the following properties: + */ +#define SA_KILL 0x01 /* terminates process by default */ +#define SA_CORE 0x02 /* ditto and coredumps */ +#define SA_STOP 0x04 /* suspend process */ +#define SA_TTYSTOP 0x08 /* ditto, from tty */ +#define SA_IGNORE 0x10 /* ignore by default */ +#define SA_CONT 0x20 /* continue if suspended */ +#define SA_CANTMASK 0x40 /* non-maskable, catchable */ + +#ifdef SIGPROP +int sigprop[NSIG + 1] = { + 0, /* unused */ + SA_KILL, /* SIGHUP */ + SA_KILL, /* SIGINT */ + SA_KILL|SA_CORE, /* SIGQUIT */ + SA_KILL|SA_CORE, /* SIGILL */ + SA_KILL|SA_CORE, /* SIGTRAP */ + SA_KILL|SA_CORE, /* SIGABRT */ + SA_KILL|SA_CORE, /* SIGEMT */ + SA_KILL|SA_CORE, /* SIGFPE */ + SA_KILL, /* SIGKILL */ + SA_KILL|SA_CORE, /* SIGBUS */ + SA_KILL|SA_CORE, /* SIGSEGV */ + SA_KILL|SA_CORE, /* SIGSYS */ + SA_KILL, /* SIGPIPE */ + SA_KILL, /* SIGALRM */ + SA_KILL, /* SIGTERM */ + SA_IGNORE, /* SIGURG */ + SA_STOP, /* SIGSTOP */ + SA_STOP|SA_TTYSTOP, /* SIGTSTP */ + SA_IGNORE|SA_CONT, /* SIGCONT */ + SA_IGNORE, /* SIGCHLD */ + SA_STOP|SA_TTYSTOP, /* SIGTTIN */ + SA_STOP|SA_TTYSTOP, /* SIGTTOU */ + SA_IGNORE, /* SIGIO */ + SA_KILL, /* SIGXCPU */ + SA_KILL, /* SIGXFSZ */ + SA_KILL, /* SIGVTALRM */ + SA_KILL, /* SIGPROF */ + SA_IGNORE, /* SIGWINCH */ + SA_IGNORE, /* SIGINFO */ + SA_KILL, /* SIGUSR1 */ + SA_KILL, /* SIGUSR2 */ +}; + +#define contsigmask (sigmask(SIGCONT)) +#define stopsigmask (sigmask(SIGSTOP) | sigmask(SIGTSTP) | \ + sigmask(SIGTTIN) | sigmask(SIGTTOU)) + +#endif /* SIGPROP */ + +#define sigcantmask (sigmask(SIGKILL) | sigmask(SIGSTOP)) + +#ifdef KERNEL +/* + * Machine-independent functions: + */ +int coredump __P((struct proc *p)); +void execsigs __P((struct proc *p)); +void gsignal __P((int pgid, int sig)); +int issig __P((struct proc *p)); +int issignal __P((struct proc *p)); +void killproc __P((struct proc *, char *)); +void pgsignal __P((struct pgrp *pgrp, int sig, int checkctty)); +void postsig __P((int sig)); +void psignal __P((struct proc *p, int sig)); +void sigexit __P((struct proc *, int)); +void siginit __P((struct proc *p)); +void trapsignal __P((struct proc *p, int sig, unsigned code)); + +/* + * Machine-dependent functions: + */ +void sendsig __P((sig_t action, int sig, int returnmask, unsigned code)); +#endif /* KERNEL */ +#endif /* !_SYS_SIGNALVAR_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/socket.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/socket.h new file mode 100644 index 00000000000..63183ec87e3 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/socket.h @@ -0,0 +1,357 @@ +/* + * Copyright (c) 1982, 1985, 1986, 1988, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)socket.h 8.4 (Berkeley) 2/21/94 + */ + +#ifndef _OSK_SYS_SOCKET_H_ +#define _OSK_SYS_SOCKET_H_ + +/* + * Definitions related to sockets: types, address families, options. + */ + +/* + * Types + */ +#define SOCK_STREAM 1 /* stream socket */ +#define SOCK_DGRAM 2 /* datagram socket */ +#define SOCK_RAW 3 /* raw-protocol interface */ +#define SOCK_RDM 4 /* reliably-delivered message */ +#define SOCK_SEQPACKET 5 /* sequenced packet stream */ + +/* + * Option flags per-socket. + */ +#define SO_DEBUG 0x0001 /* turn on debugging info recording */ +#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */ +#define SO_REUSEADDR 0x0004 /* allow local address reuse */ +#define SO_KEEPALIVE 0x0008 /* keep connections alive */ +#define SO_DONTROUTE 0x0010 /* just use interface addresses */ +#define SO_BROADCAST 0x0020 /* permit sending of broadcast msgs */ +#define SO_USELOOPBACK 0x0040 /* bypass hardware when possible */ +#define SO_LINGER 0x0080 /* linger on close if data present */ +#define SO_OOBINLINE 0x0100 /* leave received OOB data in line */ +#define SO_REUSEPORT 0x0200 /* allow local address & port reuse */ + +/* + * Additional options, not kept in so_options. + */ +#define SO_SNDBUF 0x1001 /* send buffer size */ +#define SO_RCVBUF 0x1002 /* receive buffer size */ +#define SO_SNDLOWAT 0x1003 /* send low-water mark */ +#define SO_RCVLOWAT 0x1004 /* receive low-water mark */ +#define SO_SNDTIMEO 0x1005 /* send timeout */ +#define SO_RCVTIMEO 0x1006 /* receive timeout */ +#define SO_ERROR 0x1007 /* get error status and clear */ +#define SO_TYPE 0x1008 /* get socket type */ + +/* + * Structure used for manipulating linger option. + */ +struct linger { + int l_onoff; /* option on/off */ + int l_linger; /* linger time */ +}; + +/* + * Level number for (get/set)sockopt() to apply to socket itself. + */ +#define SOL_SOCKET 0xffff /* options for socket level */ + +/* + * Address families. + */ +#define AF_UNSPEC 0 /* unspecified */ +#define AF_LOCAL 1 /* local to host (pipes, portals) */ +#define AF_UNIX AF_LOCAL /* backward compatibility */ +#define AF_INET 2 /* internetwork: UDP, TCP, etc. */ +#define AF_IMPLINK 3 /* arpanet imp addresses */ +#define AF_PUP 4 /* pup protocols: e.g. BSP */ +#define AF_CHAOS 5 /* mit CHAOS protocols */ +#define AF_NS 6 /* XEROX NS protocols */ +#define AF_ISO 7 /* ISO protocols */ +#define AF_OSI AF_ISO +#define AF_ECMA 8 /* european computer manufacturers */ +#define AF_DATAKIT 9 /* datakit protocols */ +#define AF_CCITT 10 /* CCITT protocols, X.25 etc */ +#define AF_SNA 11 /* IBM SNA */ +#define AF_DECnet 12 /* DECnet */ +#define AF_DLI 13 /* DEC Direct data link interface */ +#define AF_LAT 14 /* LAT */ +#define AF_HYLINK 15 /* NSC Hyperchannel */ +#define AF_APPLETALK 16 /* Apple Talk */ +#define AF_ROUTE 17 /* Internal Routing Protocol */ +#define AF_LINK 18 /* Link layer interface */ +#define pseudo_AF_XTP 19 /* eXpress Transfer Protocol (no AF) */ +#define AF_COIP 20 /* connection-oriented IP, aka ST II */ +#define AF_CNT 21 /* Computer Network Technology */ +#define pseudo_AF_RTIP 22 /* Help Identify RTIP packets */ +#define AF_IPX 23 /* Novell Internet Protocol */ +#define AF_SIP 24 /* Simple Internet Protocol */ +#define pseudo_AF_PIP 25 /* Help Identify PIP packets */ +#define AF_ISDN 26 /* Integrated Services Digital Network*/ +#define AF_E164 AF_ISDN /* CCITT E.164 recommendation */ +#define pseudo_AF_KEY 27 /* Internal key-management function */ +#define AF_INET6 28 /* IPv6 */ + +#define AF_MAX 29 + +/* + * Structure used by kernel to store most + * addresses. + */ +struct sockaddr { + u_char sa_len; /* total length */ + u_char sa_family; /* address family */ + char sa_data[14]; /* actually longer; address value */ +}; + +/* + * Structure used by kernel to pass protocol + * information in raw sockets. + */ +struct sockproto { + u_short sp_family; /* address family */ + u_short sp_protocol; /* protocol */ +}; + +/* + * Protocol families, same as address families for now. + */ +#define PF_UNSPEC AF_UNSPEC +#define PF_LOCAL AF_LOCAL +#define PF_UNIX PF_LOCAL /* backward compatibility */ +#define PF_INET AF_INET +#define PF_IMPLINK AF_IMPLINK +#define PF_PUP AF_PUP +#define PF_CHAOS AF_CHAOS +#define PF_NS AF_NS +#define PF_ISO AF_ISO +#define PF_OSI AF_ISO +#define PF_ECMA AF_ECMA +#define PF_DATAKIT AF_DATAKIT +#define PF_CCITT AF_CCITT +#define PF_SNA AF_SNA +#define PF_DECnet AF_DECnet +#define PF_DLI AF_DLI +#define PF_LAT AF_LAT +#define PF_HYLINK AF_HYLINK +#define PF_APPLETALK AF_APPLETALK +#define PF_ROUTE AF_ROUTE +#define PF_LINK AF_LINK +#define PF_XTP pseudo_AF_XTP /* really just proto family, no AF */ +#define PF_COIP AF_COIP +#define PF_CNT AF_CNT +#define PF_SIP AF_SIP +#define PF_IPX AF_IPX /* same format as AF_NS */ +#define PF_RTIP pseudo_AF_FTIP /* same format as AF_INET */ +#define PF_PIP pseudo_AF_PIP +#define PF_ISDN AF_ISDN + +#define PF_MAX AF_MAX + +/* + * Definitions for network related sysctl, CTL_NET. + * + * Second level is protocol family. + * Third level is protocol number. + * + * Further levels are defined by the individual families below. + */ +#define NET_MAXID AF_MAX + +#define CTL_NET_NAMES { \ + { 0, 0 }, \ + { "unix", CTLTYPE_NODE }, \ + { "inet", CTLTYPE_NODE }, \ + { "implink", CTLTYPE_NODE }, \ + { "pup", CTLTYPE_NODE }, \ + { "chaos", CTLTYPE_NODE }, \ + { "xerox_ns", CTLTYPE_NODE }, \ + { "iso", CTLTYPE_NODE }, \ + { "emca", CTLTYPE_NODE }, \ + { "datakit", CTLTYPE_NODE }, \ + { "ccitt", CTLTYPE_NODE }, \ + { "ibm_sna", CTLTYPE_NODE }, \ + { "decnet", CTLTYPE_NODE }, \ + { "dec_dli", CTLTYPE_NODE }, \ + { "lat", CTLTYPE_NODE }, \ + { "hylink", CTLTYPE_NODE }, \ + { "appletalk", CTLTYPE_NODE }, \ + { "route", CTLTYPE_NODE }, \ + { "link_layer", CTLTYPE_NODE }, \ + { "xtp", CTLTYPE_NODE }, \ + { "coip", CTLTYPE_NODE }, \ + { "cnt", CTLTYPE_NODE }, \ + { "rtip", CTLTYPE_NODE }, \ + { "ipx", CTLTYPE_NODE }, \ + { "sip", CTLTYPE_NODE }, \ + { "pip", CTLTYPE_NODE }, \ +} + +/* + * PF_ROUTE - Routing table + * + * Three additional levels are defined: + * Fourth: address family, 0 is wildcard + * Fifth: type of info, defined below + * Sixth: flag(s) to mask with for NET_RT_FLAGS + */ +#define NET_RT_DUMP 1 /* dump; may limit to a.f. */ +#define NET_RT_FLAGS 2 /* by flags, e.g. RESOLVING */ +#define NET_RT_IFLIST 3 /* survey interface list */ +#define NET_RT_MAXID 4 + +#define CTL_NET_RT_NAMES { \ + { 0, 0 }, \ + { "dump", CTLTYPE_STRUCT }, \ + { "flags", CTLTYPE_STRUCT }, \ + { "iflist", CTLTYPE_STRUCT }, \ +} + +/* + * Maximum queue length specifiable by listen. + */ +#define SOMAXCONN 128 + +/* + * Message header for recvmsg and sendmsg calls. + * Used value-result for recvmsg, value only for sendmsg. + */ +struct msghdr { + caddr_t msg_name; /* optional address */ + u_int msg_namelen; /* size of address */ + struct iovec *msg_iov; /* scatter/gather array */ + u_int msg_iovlen; /* # elements in msg_iov */ + caddr_t msg_control; /* ancillary data, see below */ + u_int msg_controllen; /* ancillary data buffer len */ + int msg_flags; /* flags on received message */ +}; + +#endif + +#ifndef MSG_OOB +#define MSG_OOB 0x1 /* process out-of-band data */ +#define MSG_PEEK 0x2 /* peek at incoming message */ +#define MSG_DONTROUTE 0x4 /* send without using routing tables */ +#endif +#ifndef MSG_EOR +#define MSG_EOR 0x8 /* data completes record */ +#define MSG_TRUNC 0x10 /* data discarded before delivery */ +#define MSG_CTRUNC 0x20 /* control data lost before delivery */ +#define MSG_WAITALL 0x40 /* wait for full request or error */ +#endif +#ifndef MSG_DONTWAIT +#define MSG_DONTWAIT 0x80 /* this message should be nonblocking */ +#define MSG_EOF 0x100 /* data completes connection */ +#define MSG_COMPAT 0x8000 /* used in sendit() */ +#endif + +#ifndef __REACTOS__ +/* + * Header for ancillary data objects in msg_control buffer. + * Used for additional information with/about a datagram + * not expressible by flags. The format is a sequence + * of message elements headed by cmsghdr structures. + */ +struct cmsghdr { + u_int cmsg_len; /* data byte count, including hdr */ + int cmsg_level; /* originating protocol */ + int cmsg_type; /* protocol-specific type */ +/* followed by u_char cmsg_data[]; */ +}; + +/* given pointer to struct cmsghdr, return pointer to data */ +#define CMSG_DATA(cmsg) ((u_char *)((cmsg) + 1)) + +/* given pointer to struct cmsghdr, return pointer to next cmsghdr */ +#define CMSG_NXTHDR(mhdr, cmsg) \ + (((caddr_t)(cmsg) + (cmsg)->cmsg_len + sizeof(struct cmsghdr) > \ + (mhdr)->msg_control + (mhdr)->msg_controllen) ? \ + (struct cmsghdr *)NULL : \ + (struct cmsghdr *)((caddr_t)(cmsg) + ALIGN((cmsg)->cmsg_len))) + +#define CMSG_FIRSTHDR(mhdr) ((struct cmsghdr *)(mhdr)->msg_control) + +/* "Socket"-level control message types: */ +#define SCM_RIGHTS 0x01 /* access rights (array of int) */ + +/* + * 4.3 compat sockaddr, move to compat file later + */ +struct osockaddr { + u_short sa_family; /* address family */ + char sa_data[14]; /* up to 14 bytes of direct address */ +}; + +/* + * 4.3-compat message header (move to compat file later). + */ +struct omsghdr { + caddr_t msg_name; /* optional address */ + int msg_namelen; /* size of address */ + struct iovec *msg_iov; /* scatter/gather array */ + int msg_iovlen; /* # elements in msg_iov */ + caddr_t msg_accrights; /* access rights sent/received */ + int msg_accrightslen; +}; + +#ifndef KERNEL + +#include + +__BEGIN_DECLS +int accept __P((int, struct sockaddr *, int *)); +int bind __P((int, const struct sockaddr *, int)); +int connect __P((int, const struct sockaddr *, int)); +int getpeername __P((int, struct sockaddr *, int *)); +int getsockname __P((int, struct sockaddr *, int *)); +int getsockopt __P((int, int, int, void *, int *)); +int listen __P((int, int)); +ssize_t recv __P((int, void *, size_t, int)); +ssize_t recvfrom __P((int, void *, size_t, int, struct sockaddr *, int *)); +ssize_t recvmsg __P((int, struct msghdr *, int)); +ssize_t send __P((int, const void *, size_t, int)); +ssize_t sendto __P((int, const void *, + size_t, int, const struct sockaddr *, int)); +ssize_t sendmsg __P((int, const struct msghdr *, int)); +int setsockopt __P((int, int, int, const void *, int)); +int shutdown __P((int, int)); +int socket __P((int, int, int)); +int socketpair __P((int, int, int, int *)); +__END_DECLS + +#else /* KERNEL */ +void pfctlinput __P((int, struct sockaddr *)); +#endif /* !KERNEL */ +#endif /* !_OSK_SYS_SOCKET_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/socketvar.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/socketvar.h new file mode 100644 index 00000000000..d5b4fb59f90 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/socketvar.h @@ -0,0 +1,264 @@ +/*- + * Copyright (c) 1982, 1986, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)socketvar.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _SYS_SOCKETVAR_H_ +#define _SYS_SOCKETVAR_H_ + +#include /* for struct stat */ +#include /* for struct filedesc */ +#include /* for struct selinfo */ + +/* + * Kernel structure per socket. + * Contains send and receive buffer queues, + * handle on protocol and pointer to protocol + * private data and error information. + */ +struct socket { + short so_type; /* generic type, see socket.h */ + short so_options; /* from socket call, see socket.h */ + short so_linger; /* time to linger while closing */ + short so_state; /* internal state flags SS_*, below */ + caddr_t so_pcb; /* protocol control block */ + struct protosw *so_proto; /* protocol handle */ +/* + * Variables for connection queueing. + * Socket where accepts occur is so_head in all subsidiary sockets. + * If so_head is 0, socket is not related to an accept. + * For head socket so_q0 queues partially completed connections, + * while so_q is a queue of connections ready to be accepted. + * If a connection is aborted and it has so_head set, then + * it has to be pulled out of either so_q0 or so_q. + * We allow connections to queue up based on current queue lengths + * and limit on number of queued connections for this socket. + */ + struct socket *so_head; /* back pointer to accept socket */ + struct socket *so_q0; /* queue of partial connections */ + struct socket *so_q; /* queue of incoming connections */ + short so_q0len; /* partials on so_q0 */ + short so_qlen; /* number of connections on so_q */ + short so_qlimit; /* max number queued connections */ + short so_timeo; /* connection timeout */ + u_short so_error; /* error affecting connection */ + pid_t so_pgid; /* pgid for signals */ + u_long so_oobmark; /* chars to oob mark */ +/* + * Variables for socket buffering. + */ + struct sockbuf { + u_long sb_cc; /* actual chars in buffer */ + u_long sb_hiwat; /* max actual char count */ + u_long sb_mbcnt; /* chars of mbufs used */ + u_long sb_mbmax; /* max chars of mbufs to use */ + long sb_lowat; /* low water mark */ + struct mbuf *sb_mb; /* the mbuf chain */ + struct selinfo sb_sel; /* process selecting read/write */ + short sb_flags; /* flags, see below */ + short sb_timeo; /* timeout for read/write */ + } so_rcv, so_snd; +#define SB_MAX (256*1024) /* default for max chars in sockbuf */ +#define SB_LOCK 0x01 /* lock on data queue */ +#define SB_WANT 0x02 /* someone is waiting to lock */ +#define SB_WAIT 0x04 /* someone is waiting for data/space */ +#define SB_SEL 0x08 /* someone is selecting */ +#define SB_ASYNC 0x10 /* ASYNC I/O, need signals */ +#define SB_NOTIFY (SB_WAIT|SB_SEL|SB_ASYNC) +#define SB_NOINTR 0x40 /* operations not interruptible */ + + caddr_t so_tpcb; /* Wisc. protocol control block XXX */ + void (*so_upcall) __P((struct socket *so, caddr_t arg, int waitf)); + caddr_t so_upcallarg; /* Arg for above */ + +#ifdef __REACTOS__ + void *so_connection; /* The connection object used by our parent */ +#endif +}; + +/* + * Socket state bits. + */ +#define SS_NOFDREF 0x001 /* no file table ref any more */ +#define SS_ISCONNECTED 0x002 /* socket connected to a peer */ +#define SS_ISCONNECTING 0x004 /* in process of connecting to peer */ +#define SS_ISDISCONNECTING 0x008 /* in process of disconnecting */ +#define SS_CANTSENDMORE 0x010 /* can't send more data to peer */ +#define SS_CANTRCVMORE 0x020 /* can't receive more data from peer */ +#define SS_RCVATMARK 0x040 /* at mark on input */ + +#define SS_PRIV 0x080 /* privileged for broadcast, raw... */ +#define SS_NBIO 0x100 /* non-blocking ops */ +#define SS_ASYNC 0x200 /* async i/o notify */ +#define SS_ISCONFIRMING 0x400 /* deciding to accept connection req */ + + +/* + * Macros for sockets and socket buffering. + */ + +/* + * How much space is there in a socket buffer (so->so_snd or so->so_rcv)? + * This is problematical if the fields are unsigned, as the space might + * still be negative (cc > hiwat or mbcnt > mbmax). Should detect + * overflow and return 0. Should use "lmin" but it doesn't exist now. + */ +#define sbspace(sb) \ + ((long) imin((int)((sb)->sb_hiwat - (sb)->sb_cc), \ + (int)((sb)->sb_mbmax - (sb)->sb_mbcnt))) + +/* do we have to send all at once on a socket? */ +#define sosendallatonce(so) \ + ((so)->so_proto->pr_flags & PR_ATOMIC) + +/* can we read something from so? */ +#define soreadable(so) \ + ((so)->so_rcv.sb_cc >= (so)->so_rcv.sb_lowat || \ + ((so)->so_state & SS_CANTRCVMORE) || \ + (so)->so_qlen || (so)->so_error) + +/* can we write something to so? */ +#define sowriteable(so) \ + ((sbspace(&(so)->so_snd) >= (so)->so_snd.sb_lowat && \ + (((so)->so_state&SS_ISCONNECTED) || \ + ((so)->so_proto->pr_flags&PR_CONNREQUIRED)==0)) || \ + ((so)->so_state & SS_CANTSENDMORE) || \ + (so)->so_error) + +/* adjust counters in sb reflecting allocation of m */ +#define sballoc(sb, m) { \ + (sb)->sb_cc += (m)->m_len; \ + (sb)->sb_mbcnt += MSIZE; \ + if ((m)->m_flags & M_EXT) \ + (sb)->sb_mbcnt += (m)->m_ext.ext_size; \ +} + +/* adjust counters in sb reflecting freeing of m */ +#define sbfree(sb, m) { \ + (sb)->sb_cc -= (m)->m_len; \ + (sb)->sb_mbcnt -= MSIZE; \ + if ((m)->m_flags & M_EXT) \ + (sb)->sb_mbcnt -= (m)->m_ext.ext_size; \ +} + +/* + * Set lock on sockbuf sb; sleep if lock is already held. + * Unless SB_NOINTR is set on sockbuf, sleep is interruptible. + * Returns error without lock if sleep is interrupted. + */ +#define sblock(sb, wf) ((sb)->sb_flags & SB_LOCK ? \ + (((wf) == M_WAITOK) ? sb_lock(sb) : EWOULDBLOCK) : \ + ((sb)->sb_flags |= SB_LOCK), 0) + +/* release lock on sockbuf sb */ +#define sbunlock(sb) { \ + (sb)->sb_flags &= ~SB_LOCK; \ + if ((sb)->sb_flags & SB_WANT) { \ + (sb)->sb_flags &= ~SB_WANT; \ + wakeup((caddr_t)&(sb)->sb_flags); \ + } \ +} + +#define sorwakeup(so) { sowakeup((so), &(so)->so_rcv); \ + if ((so)->so_upcall) \ + (*((so)->so_upcall))((so), (so)->so_upcallarg, M_DONTWAIT); \ + } + +#define sowwakeup(so) sowakeup((so), &(so)->so_snd) + +#ifdef KERNEL +extern u_long sb_max; +/* to catch callers missing new second argument to sonewconn: */ +#define sonewconn(head, connstatus) sonewconn1((head), (connstatus)) +struct socket *sonewconn1 __P((struct socket *head, int connstatus)); + +/* strings for sleep message: */ +extern char netio[], netcon[], netcls[]; + +/* + * File operations on sockets. + */ +int soo_read __P((struct file *fp, struct uio *uio, struct ucred *cred)); +int soo_write __P((struct file *fp, struct uio *uio, struct ucred *cred)); +int soo_ioctl __P((struct file *fp, int com, caddr_t data, struct proc *p)); +int soo_select __P((struct file *fp, int which, struct proc *p)); +int soo_close __P((struct file *fp, struct proc *p)); +int soo_stat __P((struct socket *, struct stat *)); + +/* + * From uipc_socket and friends + */ +void soqinsque __P((struct socket *, struct socket *, int)); +void sowakeup __P((struct socket *, struct sockbuf *)); +void socantrcvmore __P((struct socket *)); +void socantsendmore __P((struct socket *)); +void sbrelease __P((struct sockbuf *)); +void sbappend __P((struct socket *, struct sockbuf *, struct mbuf *)); +void sbappendrecord __P((struct sockbuf *, struct mbuf *)); +int sbappendcontrol __P((struct sockbuf *, struct mbuf *, struct mbuf *)); +int sbappendaddr __P((struct sockbuf *, struct sockaddr *, struct mbuf *, struct mbuf *)); +void sbdroprecord __P((struct sockbuf *)); +void sbcompress __P((struct sockbuf *, struct mbuf *, struct mbuf *)); +void sbflush __P((struct sockbuf *)); +int sbreserve __P((struct sockbuf *,u_long)); +int soreserve __P((struct socket *,u_long,u_long)); +int sb_lock __P((struct sockbuf *)); +int sbwait __P((struct sockbuf *)); +void sbdrop __P((struct sockbuf *, int)); +void sofree __P((struct socket *)); +void sorflush __P((struct socket *)); +int soqremque __P((struct socket *,int)); +int soabort __P((struct socket *)); +void soisdisconnected __P((struct socket *)); +void soisconnected __P((struct socket *)); +void soisconnecting __P((struct socket *)); +void soisdisconnecting __P((struct socket *)); +void sohasoutofband __P((struct socket *)); +int sodisconnect __P((struct socket *)); +int sosend __P((struct socket *,struct mbuf *, struct uio *, struct mbuf *, struct mbuf *, int)); +int socreate __P((int, struct socket **,int,int)); +int getsock __P((struct filedesc *,int,struct file **)); +int sockargs __P((struct mbuf **,caddr_t,int,int)); +int sobind __P((struct socket *,struct mbuf *)); +int solisten __P((struct socket *,int)); +int soaccept __P((struct socket *,struct mbuf *)); +int soconnect __P((struct socket *,struct mbuf *)); +int soconnect2 __P((struct socket *,struct socket *)); +int soclose __P((struct socket *)); +int soshutdown __P((struct socket *,int)); +int soreceive __P((struct socket *,struct mbuf **,struct uio *,struct mbuf **,struct mbuf **,int *)); +int sosetopt __P((struct socket *,int, int, struct mbuf *)); +int sogetopt __P((struct socket *,int, int, struct mbuf **)); +#endif + +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/sockio.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/sockio.h new file mode 100644 index 00000000000..05dfd904a5f --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/sockio.h @@ -0,0 +1,88 @@ +/*- + * Copyright (c) 1982, 1986, 1990, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)sockio.h 8.1 (Berkeley) 3/28/94 + */ + +#ifndef _SYS_SOCKIO_H_ +#define _SYS_SOCKIO_H_ + +#ifndef __REACTOS__ +#include + +/* Socket ioctl's. */ +#define SIOCSHIWAT _IOW('s', 0, int) /* set high watermark */ +#define SIOCGHIWAT _IOR('s', 1, int) /* get high watermark */ +#define SIOCSLOWAT _IOW('s', 2, int) /* set low watermark */ +#define SIOCGLOWAT _IOR('s', 3, int) /* get low watermark */ +#define SIOCATMARK _IOR('s', 7, int) /* at oob mark? */ +#define SIOCSPGRP _IOW('s', 8, int) /* set process group */ +#define SIOCGPGRP _IOR('s', 9, int) /* get process group */ + +#define SIOCADDRT _IOW('r', 10, struct ortentry) /* add route */ +#define SIOCDELRT _IOW('r', 11, struct ortentry) /* delete route */ +#define SIOCSETRTINFO _IOWR('r', 12, struct fullrtentry) /* change aux info */ +#define SIOCGETRTINFO _IOWR('r', 13, struct fullrtentry) /* read aux info */ +#define SIOCGETVIFINF _IOWR('r', 14, struct vif_conf) /* read m/c vifs */ +#define SIOCGETVIFCNT _IOWR('r', 15, struct sioc_vif_req)/* get vif pkt cnt */ +#define SIOCGETSGCNT _IOWR('r', 16, struct sioc_sg_req) /* get s,g pkt cnt */ + +#define SIOCSIFADDR _IOW('i', 12, struct ifreq) /* set ifnet address */ +#define OSIOCGIFADDR _IOWR('i', 13, struct ifreq) /* get ifnet address */ +#define SIOCGIFADDR _IOWR('i', 33, struct ifreq) /* get ifnet address */ +#define SIOCSIFDSTADDR _IOW('i', 14, struct ifreq) /* set p-p address */ +#define OSIOCGIFDSTADDR _IOWR('i', 15, struct ifreq) /* get p-p address */ +#define SIOCGIFDSTADDR _IOWR('i', 34, struct ifreq) /* get p-p address */ +#define SIOCSIFFLAGS _IOW('i', 16, struct ifreq) /* set ifnet flags */ +#define SIOCGIFFLAGS _IOWR('i', 17, struct ifreq) /* get ifnet flags */ +#define OSIOCGIFBRDADDR _IOWR('i', 18, struct ifreq) /* get broadcast addr */ +#define SIOCGIFBRDADDR _IOWR('i', 35, struct ifreq) /* get broadcast addr */ +#define SIOCSIFBRDADDR _IOW('i', 19, struct ifreq) /* set broadcast addr */ +#define OSIOCGIFCONF _IOWR('i', 20, struct ifconf) /* get ifnet list */ +#define SIOCGIFCONF _IOWR('i', 36, struct ifconf) /* get ifnet list */ +#define OSIOCGIFNETMASK _IOWR('i', 21, struct ifreq) /* get net addr mask */ +#define SIOCGIFNETMASK _IOWR('i', 37, struct ifreq) /* get net addr mask */ +#define SIOCSIFNETMASK _IOW('i', 22, struct ifreq) /* set net addr mask */ +#define SIOCGIFMETRIC _IOWR('i', 23, struct ifreq) /* get IF metric */ +#define SIOCSIFMETRIC _IOW('i', 24, struct ifreq) /* set IF metric */ +#define SIOCDIFADDR _IOW('i', 25, struct ifreq) /* delete IF addr */ +#define SIOCAIFADDR _IOW('i', 26, struct ifaliasreq)/* add/chg IF alias */ + +#define SIOCADDMULTI _IOW('i', 49, struct ifreq) /* add m'cast addr */ +#define SIOCDELMULTI _IOW('i', 50, struct ifreq) /* del m'cast addr */ +#define SIOCGIFMTU _IOWR('i', 51, struct ifreq) /* get IF mtu */ +#define SIOCSIFMTU _IOW('i', 52, struct ifreq) /* set IF mtu */ +#define SIOCGIFPHYS _IOWR('i', 53, struct ifreq) /* get IF wire */ +#define SIOCSIFPHYS _IOW('i', 54, struct ifreq) /* set IF wire */ +#endif + +#endif /* !_SYS_SOCKIO_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/stat.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/stat.h new file mode 100644 index 00000000000..87e6e5f1f88 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/stat.h @@ -0,0 +1,203 @@ +/*- + * Copyright (c) 1982, 1986, 1989, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)stat.h 8.6 (Berkeley) 3/8/94 + */ + +#ifndef _SYS_STAT_H_ +#define _SYS_STAT_H_ + +/* + * XXX we need this for struct timespec. We get miscellaneous namespace + * pollution with it. struct timespace itself is namespace pollution if + * _POSIX_SOURCE is defined. + */ +#include + +#ifndef _POSIX_SOURCE +struct ostat { + unsigned short st_dev; /* inode's device */ + ino_t st_ino; /* inode's number */ + mode_t st_mode; /* inode protection mode */ + nlink_t st_nlink; /* number of hard links */ + unsigned short st_uid; /* user ID of the file's owner */ + unsigned short st_gid; /* group ID of the file's group */ + unsigned short st_rdev; /* device type */ + long st_size; /* file size, in bytes */ + struct timespec st_atimespec; /* time of last access */ + struct timespec st_mtimespec; /* time of last data modification */ + struct timespec st_ctimespec; /* time of last file status change */ + long st_blksize; /* optimal blocksize for I/O */ + long st_blocks; /* blocks allocated for file */ + unsigned long st_flags; /* user defined flags for file */ + unsigned long st_gen; /* file generation number */ +}; +#endif /* !_POSIX_SOURCE */ + +struct stat { + dev_t st_dev; /* inode's device */ + ino_t st_ino; /* inode's number */ + mode_t st_mode; /* inode protection mode */ + nlink_t st_nlink; /* number of hard links */ + uid_t st_uid; /* user ID of the file's owner */ + gid_t st_gid; /* group ID of the file's group */ + dev_t st_rdev; /* device type */ + struct timespec st_atimespec; /* time of last access */ + struct timespec st_mtimespec; /* time of last data modification */ + struct timespec st_ctimespec; /* time of last file status change */ + off_t st_size; /* file size, in bytes */ + quad_t st_blocks; /* blocks allocated for file */ + unsigned long st_blksize; /* optimal blocksize for I/O */ + unsigned long st_flags; /* user defined flags for file */ + unsigned long st_gen; /* file generation number */ + long st_lspare; + quad_t st_qspare[2]; +}; +#define st_atime st_atimespec.ts_sec +#define st_mtime st_mtimespec.ts_sec +#define st_ctime st_ctimespec.ts_sec + +#define S_ISUID 0004000 /* set user id on execution */ +#define S_ISGID 0002000 /* set group id on execution */ +#ifndef _POSIX_SOURCE +#define S_ISTXT 0001000 /* sticky bit */ +#endif + +#define S_IRWXU 0000700 /* RWX mask for owner */ +#define S_IRUSR 0000400 /* R for owner */ +#define S_IWUSR 0000200 /* W for owner */ +#define S_IXUSR 0000100 /* X for owner */ + +#ifndef _POSIX_SOURCE +#define S_IREAD S_IRUSR +#define S_IWRITE S_IWUSR +#define S_IEXEC S_IXUSR +#endif + +#define S_IRWXG 0000070 /* RWX mask for group */ +#define S_IRGRP 0000040 /* R for group */ +#define S_IWGRP 0000020 /* W for group */ +#define S_IXGRP 0000010 /* X for group */ + +#define S_IRWXO 0000007 /* RWX mask for other */ +#define S_IROTH 0000004 /* R for other */ +#define S_IWOTH 0000002 /* W for other */ +#define S_IXOTH 0000001 /* X for other */ + +#ifndef _POSIX_SOURCE +#define S_IFMT 0170000 /* type of file mask */ +#define S_IFIFO 0010000 /* named pipe (fifo) */ +#define S_IFCHR 0020000 /* character special */ +#define S_IFDIR 0040000 /* directory */ +#define S_IFBLK 0060000 /* block special */ +#define S_IFREG 0100000 /* regular */ +#define S_IFLNK 0120000 /* symbolic link */ +#define S_IFSOCK 0140000 /* socket */ +#define S_ISVTX 0001000 /* save swapped text even after use */ +#endif + +#define S_ISDIR(m) (((m) & 0170000) == 0040000) /* directory */ +#define S_ISCHR(m) (((m) & 0170000) == 0020000) /* char special */ +#define S_ISBLK(m) (((m) & 0170000) == 0060000) /* block special */ +#define S_ISREG(m) (((m) & 0170000) == 0100000) /* regular file */ +#define S_ISFIFO(m) (((m) & 0170000) == 0010000 || \ + ((m) & 0170000) == 0140000) /* fifo or socket */ +#ifndef _POSIX_SOURCE +#define S_ISLNK(m) (((m) & 0170000) == 0120000) /* symbolic link */ +#define S_ISSOCK(m) (((m) & 0170000) == 0010000 || \ + ((m) & 0170000) == 0140000) /* fifo or socket */ +#endif + +#ifndef _POSIX_SOURCE +#define ACCESSPERMS (S_IRWXU|S_IRWXG|S_IRWXO) /* 0777 */ + /* 7777 */ +#define ALLPERMS (S_ISUID|S_ISGID|S_ISTXT|S_IRWXU|S_IRWXG|S_IRWXO) + /* 0666 */ +#define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) + +#define S_BLKSIZE 512 /* block size used in the stat struct */ + +/* + * Definitions of flags stored in file flags word. + * + * Super-user and owner changeable flags. + */ +#define UF_SETTABLE 0x0000ffff /* mask of owner changeable flags */ +#define UF_NODUMP 0x00000001 /* do not dump file */ +#define UF_IMMUTABLE 0x00000002 /* file may not be changed */ +#define UF_APPEND 0x00000004 /* writes to file may only append */ +/* + * Super-user changeable flags. + */ +#define SF_SETTABLE 0xffff0000 /* mask of superuser changeable flags */ +#define SF_ARCHIVED 0x00010000 /* file is archived */ +#define SF_IMMUTABLE 0x00020000 /* file may not be changed */ +#define SF_APPEND 0x00040000 /* writes to file may only append */ + +#ifdef KERNEL +/* + * Shorthand abbreviations of above. + */ +#define APPEND (UF_APPEND | SF_APPEND) +#define IMMUTABLE (UF_IMMUTABLE | SF_IMMUTABLE) +#endif + +#endif /* !_POSIX_SOURCE */ + +#ifdef KERNEL +void cvtstat __P((struct stat *, struct ostat *)); +#else /* KERNEL */ +#include + +__BEGIN_DECLS +int chmod __P((const char *, mode_t)); +int fstat __P((int, struct stat *)); +int mkdir __P((const char *, mode_t)); +int mkfifo __P((const char *, mode_t)); +int stat __P((const char *, struct stat *)); +mode_t umask __P((mode_t)); +#ifndef _POSIX_SOURCE +int chflags __P((const char *, u_long)); +int fchflags __P((int, u_long)); +int fchmod __P((int, mode_t)); +int lstat __P((const char *, struct stat *)); +#endif +__END_DECLS + +#endif /* KERNEL */ + +#endif /* !_SYS_STAT_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/sysctl.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/sysctl.h new file mode 100644 index 00000000000..c3aa9667fcc --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/sysctl.h @@ -0,0 +1,412 @@ +/* + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Mike Karels at Berkeley Software Design, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)sysctl.h 8.1 (Berkeley) 6/2/93 + * $\Id: sysctl.h,v 1.23.4.5 1996/09/19 08:19:00 pst Exp $ + */ + +#ifndef _SYS_SYSCTL_H_ +#define _SYS_SYSCTL_H_ + +/* + * These are for the eproc structure defined below. + */ +#ifndef KERNEL +#include +#include +#include +#include +#endif + +/* + * Definitions for sysctl call. The sysctl call uses a hierarchical name + * for objects that can be examined or modified. The name is expressed as + * a sequence of integers. Like a file path name, the meaning of each + * component depends on its place in the hierarchy. The top-level and kern + * identifiers are defined here, and other identifiers are defined in the + * respective subsystem header files. + */ + +#define CTL_MAXNAME 12 /* largest number of components supported */ + +/* + * Each subsystem defined by sysctl defines a list of variables + * for that subsystem. Each name is either a node with further + * levels defined below it, or it is a leaf of some particular + * type given below. Each sysctl level defines a set of name/type + * pairs to be used by sysctl(1) in manipulating the subsystem. + */ +struct ctlname { + char *ctl_name; /* subsystem name */ + int ctl_type; /* type of name */ +}; +#define CTLTYPE_NODE 1 /* name is a node */ +#define CTLTYPE_INT 2 /* name describes an integer */ +#define CTLTYPE_STRING 3 /* name describes a string */ +#define CTLTYPE_QUAD 4 /* name describes a 64-bit number */ +#define CTLTYPE_STRUCT 5 /* name describes a structure */ + +/* + * Top-level identifiers + */ +#define CTL_UNSPEC 0 /* unused */ +#define CTL_KERN 1 /* "high kernel": proc, limits */ +#define CTL_VM 2 /* virtual memory */ +#define CTL_FS 3 /* file system, mount type is next */ +#define CTL_NET 4 /* network, see socket.h */ +#define CTL_DEBUG 5 /* debugging parameters */ +#define CTL_HW 6 /* generic cpu/io */ +#define CTL_MACHDEP 7 /* machine dependent */ +#define CTL_USER 8 /* user-level */ +#define CTL_MAXID 9 /* number of valid top-level ids */ + +#define CTL_NAMES { \ + { 0, 0 }, \ + { "kern", CTLTYPE_NODE }, \ + { "vm", CTLTYPE_NODE }, \ + { "fs", CTLTYPE_NODE }, \ + { "net", CTLTYPE_NODE }, \ + { "debug", CTLTYPE_NODE }, \ + { "hw", CTLTYPE_NODE }, \ + { "machdep", CTLTYPE_NODE }, \ + { "user", CTLTYPE_NODE }, \ +} + +/* + * CTL_KERN identifiers + */ +#define KERN_OSTYPE 1 /* string: system version */ +#define KERN_OSRELEASE 2 /* string: system release */ +#define KERN_OSREV 3 /* int: system revision */ +#define KERN_VERSION 4 /* string: compile time info */ +#define KERN_MAXVNODES 5 /* int: max vnodes */ +#define KERN_MAXPROC 6 /* int: max processes */ +#define KERN_MAXFILES 7 /* int: max open files */ +#define KERN_ARGMAX 8 /* int: max arguments to exec */ +#define KERN_SECURELVL 9 /* int: system security level */ +#define KERN_HOSTNAME 10 /* string: hostname */ +#define KERN_HOSTID 11 /* int: host identifier */ +#define KERN_CLOCKRATE 12 /* struct: struct clockrate */ +#define KERN_VNODE 13 /* struct: vnode structures */ +#define KERN_PROC 14 /* struct: process entries */ +#define KERN_FILE 15 /* struct: file entries */ +#define KERN_PROF 16 /* node: kernel profiling info */ +#define KERN_POSIX1 17 /* int: POSIX.1 version */ +#define KERN_NGROUPS 18 /* int: # of supplemental group ids */ +#define KERN_JOB_CONTROL 19 /* int: is job control available */ +#define KERN_SAVED_IDS 20 /* int: saved set-user/group-ID */ +#define KERN_BOOTTIME 21 /* struct: time kernel was booted */ +#define KERN_DOMAINNAME 22 /* string: YP domain name */ +#define KERN_UPDATEINTERVAL 23 /* int: update process sleep time */ +#define KERN_OSRELDATE 24 /* int: OS release date */ +#define KERN_NTP_PLL 25 /* node: NTP PLL control */ +#define KERN_BOOTFILE 26 /* string: name of booted kernel */ +#define KERN_MAXFILESPERPROC 27 /* int: max open files per proc */ +#define KERN_MAXPROCPERUID 28 /* int: max processes per uid */ +#define KERN_DUMPDEV 29 /* dev_t: device to dump on */ +#define KERN_SOMAXCONN 30 /* int: max connections in listen q */ +#define KERN_MAXSOCKBUF 31 /* int: max size of a socket buffer */ +#define KERN_PS_STRINGS 32 /* int: address of PS_STRINGS */ +#define KERN_USRSTACK 33 /* int: address of USRSTACK */ +#define KERN_SOCKBUF_WASTE 34 /* int: reserved sockbuf space */ +#define KERN_SOMINQUEUE 35 /* int: override socket listen() */ +#define KERN_MAXID 36 /* number of valid kern ids */ + +#define CTL_KERN_NAMES { \ + { 0, 0 }, \ + { "ostype", CTLTYPE_STRING }, \ + { "osrelease", CTLTYPE_STRING }, \ + { "osrevision", CTLTYPE_INT }, \ + { "version", CTLTYPE_STRING }, \ + { "maxvnodes", CTLTYPE_INT }, \ + { "maxproc", CTLTYPE_INT }, \ + { "maxfiles", CTLTYPE_INT }, \ + { "argmax", CTLTYPE_INT }, \ + { "securelevel", CTLTYPE_INT }, \ + { "hostname", CTLTYPE_STRING }, \ + { "hostid", CTLTYPE_INT }, \ + { "clockrate", CTLTYPE_STRUCT }, \ + { "vnode", CTLTYPE_STRUCT }, \ + { "proc", CTLTYPE_STRUCT }, \ + { "file", CTLTYPE_STRUCT }, \ + { "profiling", CTLTYPE_NODE }, \ + { "posix1version", CTLTYPE_INT }, \ + { "ngroups", CTLTYPE_INT }, \ + { "job_control", CTLTYPE_INT }, \ + { "saved_ids", CTLTYPE_INT }, \ + { "boottime", CTLTYPE_STRUCT }, \ + { "domainname", CTLTYPE_STRING }, \ + { "update", CTLTYPE_INT }, \ + { "osreldate", CTLTYPE_INT }, \ + { "ntp_pll", CTLTYPE_NODE }, \ + { "bootfile", CTLTYPE_STRING }, \ + { "maxfilesperproc", CTLTYPE_INT }, \ + { "maxprocperuid", CTLTYPE_INT }, \ + { "dumpdev", CTLTYPE_STRUCT }, /* we lie; don't print as int */ \ + { "somaxconn", CTLTYPE_INT }, \ + { "maxsockbuf", CTLTYPE_INT }, \ + { "ps_strings", CTLTYPE_INT }, \ + { "usrstack", CTLTYPE_INT }, \ + { "sockbuf_waste_factor", CTLTYPE_INT }, \ + { "sominqueue", CTLTYPE_INT }, \ +} + +/* + * CTL_FS identifiers + */ +#define FS_VFSCONF 0 /* get configured filesystems */ +#define FS_MAXID 1 /* number of items */ + +#define CTL_FS_NAMES { \ + { "vfsconf", CTLTYPE_STRUCT }, \ +} + +/* + * KERN_PROC subtypes + */ +#define KERN_PROC_ALL 0 /* everything */ +#define KERN_PROC_PID 1 /* by process id */ +#define KERN_PROC_PGRP 2 /* by process group id */ +#define KERN_PROC_SESSION 3 /* by session of pid */ +#define KERN_PROC_TTY 4 /* by controlling tty */ +#define KERN_PROC_UID 5 /* by effective uid */ +#define KERN_PROC_RUID 6 /* by real uid */ + +/* + * KERN_PROC subtype ops return arrays of augmented proc structures: + */ +struct kinfo_proc { + struct proc kp_proc; /* proc structure */ + struct eproc { + struct proc *e_paddr; /* address of proc */ + struct session *e_sess; /* session pointer */ + struct pcred e_pcred; /* process credentials */ + struct ucred e_ucred; /* current credentials */ +#if defined(sparc) || defined(__REACTOS__) + struct { + segsz_t vm_rssize; /* resident set size */ + segsz_t vm_tsize; /* text size */ + segsz_t vm_dsize; /* data size */ + segsz_t vm_ssize; /* stack size */ + } e_vm; +#else +#ifndef OSKIT + struct vmspace e_vm; /* address space */ +#endif +#endif + pid_t e_ppid; /* parent process id */ + pid_t e_pgid; /* process group id */ + short e_jobc; /* job control counter */ + dev_t e_tdev; /* controlling tty dev */ + pid_t e_tpgid; /* tty process group id */ + struct session *e_tsess; /* tty session pointer */ +#define WMESGLEN 7 + char e_wmesg[WMESGLEN+1]; /* wchan message */ + segsz_t e_xsize; /* text size */ + short e_xrssize; /* text rss */ + short e_xccount; /* text references */ + short e_xswrss; + long e_flag; +#define EPROC_CTTY 0x01 /* controlling tty vnode active */ +#define EPROC_SLEADER 0x02 /* session leader */ + char e_login[MAXLOGNAME]; /* setlogin() name */ + long e_spare[4]; + } kp_eproc; +}; + +/* + * CTL_HW identifiers + */ +#define HW_MACHINE 1 /* string: machine class */ +#define HW_MODEL 2 /* string: specific machine model */ +#define HW_NCPU 3 /* int: number of cpus */ +#define HW_BYTEORDER 4 /* int: machine byte order */ +#define HW_PHYSMEM 5 /* int: total memory */ +#define HW_USERMEM 6 /* int: non-kernel memory */ +#define HW_PAGESIZE 7 /* int: software page size */ +#define HW_DISKNAMES 8 /* strings: disk drive names */ +#define HW_DISKSTATS 9 /* struct: diskstats[] */ +#define HW_FLOATINGPT 10 /* int: has HW floating point? */ +#define HW_DEVCONF 11 /* node: device configuration */ +#define HW_MAXID 12 /* number of valid hw ids */ + +#define CTL_HW_NAMES { \ + { 0, 0 }, \ + { "machine", CTLTYPE_STRING }, \ + { "model", CTLTYPE_STRING }, \ + { "ncpu", CTLTYPE_INT }, \ + { "byteorder", CTLTYPE_INT }, \ + { "physmem", CTLTYPE_INT }, \ + { "usermem", CTLTYPE_INT }, \ + { "pagesize", CTLTYPE_INT }, \ + { "disknames", CTLTYPE_STRUCT }, \ + { "diskstats", CTLTYPE_STRUCT }, \ + { "floatingpoint", CTLTYPE_INT }, \ + { "devconf", CTLTYPE_NODE }, \ +} + +/* + * CTL_USER definitions + */ +#define USER_CS_PATH 1 /* string: _CS_PATH */ +#define USER_BC_BASE_MAX 2 /* int: BC_BASE_MAX */ +#define USER_BC_DIM_MAX 3 /* int: BC_DIM_MAX */ +#define USER_BC_SCALE_MAX 4 /* int: BC_SCALE_MAX */ +#define USER_BC_STRING_MAX 5 /* int: BC_STRING_MAX */ +#define USER_COLL_WEIGHTS_MAX 6 /* int: COLL_WEIGHTS_MAX */ +#define USER_EXPR_NEST_MAX 7 /* int: EXPR_NEST_MAX */ +#define USER_LINE_MAX 8 /* int: LINE_MAX */ +#define USER_RE_DUP_MAX 9 /* int: RE_DUP_MAX */ +#define USER_POSIX2_VERSION 10 /* int: POSIX2_VERSION */ +#define USER_POSIX2_C_BIND 11 /* int: POSIX2_C_BIND */ +#define USER_POSIX2_C_DEV 12 /* int: POSIX2_C_DEV */ +#define USER_POSIX2_CHAR_TERM 13 /* int: POSIX2_CHAR_TERM */ +#define USER_POSIX2_FORT_DEV 14 /* int: POSIX2_FORT_DEV */ +#define USER_POSIX2_FORT_RUN 15 /* int: POSIX2_FORT_RUN */ +#define USER_POSIX2_LOCALEDEF 16 /* int: POSIX2_LOCALEDEF */ +#define USER_POSIX2_SW_DEV 17 /* int: POSIX2_SW_DEV */ +#define USER_POSIX2_UPE 18 /* int: POSIX2_UPE */ +#define USER_STREAM_MAX 19 /* int: POSIX2_STREAM_MAX */ +#define USER_TZNAME_MAX 20 /* int: POSIX2_TZNAME_MAX */ +#define USER_MAXID 21 /* number of valid user ids */ + +#define CTL_USER_NAMES { \ + { 0, 0 }, \ + { "cs_path", CTLTYPE_STRING }, \ + { "bc_base_max", CTLTYPE_INT }, \ + { "bc_dim_max", CTLTYPE_INT }, \ + { "bc_scale_max", CTLTYPE_INT }, \ + { "bc_string_max", CTLTYPE_INT }, \ + { "coll_weights_max", CTLTYPE_INT }, \ + { "expr_nest_max", CTLTYPE_INT }, \ + { "line_max", CTLTYPE_INT }, \ + { "re_dup_max", CTLTYPE_INT }, \ + { "posix2_version", CTLTYPE_INT }, \ + { "posix2_c_bind", CTLTYPE_INT }, \ + { "posix2_c_dev", CTLTYPE_INT }, \ + { "posix2_char_term", CTLTYPE_INT }, \ + { "posix2_fort_dev", CTLTYPE_INT }, \ + { "posix2_fort_run", CTLTYPE_INT }, \ + { "posix2_localedef", CTLTYPE_INT }, \ + { "posix2_sw_dev", CTLTYPE_INT }, \ + { "posix2_upe", CTLTYPE_INT }, \ + { "stream_max", CTLTYPE_INT }, \ + { "tzname_max", CTLTYPE_INT }, \ +} + +/* + * CTL_DEBUG definitions + * + * Second level identifier specifies which debug variable. + * Third level identifier specifies which stucture component. + */ +#define CTL_DEBUG_NAME 0 /* string: variable name */ +#define CTL_DEBUG_VALUE 1 /* int: variable value */ +#define CTL_DEBUG_MAXID 20 + +#ifdef KERNEL +#if defined(DEBUG) || defined(DIAGNOSTIC) +/* + * CTL_DEBUG variables. + * + * These are declared as separate variables so that they can be + * individually initialized at the location of their associated + * variable. The loader prevents multiple use by issuing errors + * if a variable is initialized in more than one place. They are + * aggregated into an array in debug_sysctl(), so that it can + * conveniently locate them when querried. If more debugging + * variables are added, they must also be declared here and also + * entered into the array. + */ +struct ctldebug { + char *debugname; /* name of debugging variable */ + int *debugvar; /* pointer to debugging variable */ +}; +extern struct ctldebug debug0, debug1, debug2, debug3, debug4; +extern struct ctldebug debug5, debug6, debug7, debug8, debug9; +extern struct ctldebug debug10, debug11, debug12, debug13, debug14; +extern struct ctldebug debug15, debug16, debug17, debug18, debug19; +#endif /* DEBUG */ + +extern char cpu_model[]; +extern int hw_float; +extern char machine[]; +extern char osrelease[]; +extern char ostype[]; + +/* + * Internal sysctl function calling convention: + * + * (*sysctlfn)(name, namelen, oldval, oldlenp, newval, newlen, p); + * + * The name parameter points at the next component of the name to be + * interpreted. The namelen parameter is the number of integers in + * the name. + */ +typedef int (sysctlfn) + __P((int *, u_int, void *, size_t *, void *, size_t, struct proc *)); + +sysctlfn cpu_sysctl; +sysctlfn dev_sysctl; +sysctlfn fs_sysctl; +sysctlfn hw_sysctl; +sysctlfn kern_sysctl; +sysctlfn net_sysctl; +sysctlfn ntp_sysctl; +sysctlfn vm_sysctl; + +int sysctl_int __P((void *, size_t *, void *, size_t, int *)); +int sysctl_rdint __P((void *, size_t *, void *, int)); +int sysctl_string __P((void *, size_t *, void *, size_t, char *, int)); +int sysctl_rdstring __P((void *, size_t *, void *, char *)); +int sysctl_rdstruct __P((void *, size_t *, void *, void *, int)); +int sysctl_struct __P((void *oldp, size_t *, void *, size_t, void *, int)); +void fill_eproc __P((struct proc *, struct eproc *)); + +int sysctl_clockrate __P((char *, size_t*)); +int sysctl_vnode __P((char *, size_t*)); +int sysctl_file __P((char *, size_t*)); +int sysctl_doproc __P((int *, u_int, char *, size_t*)); +int sysctl_doprof __P((int *, u_int, void *, size_t *, void *, size_t)); + +#else /* !KERNEL */ +#include + +__BEGIN_DECLS +int sysctl __P((int *, u_int, void *, size_t *, void *, size_t)); +__END_DECLS +#endif /* KERNEL */ + +#endif /* !_SYS_SYSCTL_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/syslimits.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/syslimits.h new file mode 100644 index 00000000000..502474c96de --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/syslimits.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)syslimits.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _SYS_SYSLIMITS_H_ +#define _SYS_SYSLIMITS_H_ + +#define ARG_MAX 65536 /* max bytes for an exec function */ +#ifndef CHILD_MAX +#define CHILD_MAX 40 /* max simultaneous processes */ +#endif +#define LINK_MAX 32767 /* max file link count */ +#define MAX_CANON 255 /* max bytes in term canon input line */ +#define MAX_INPUT 255 /* max bytes in terminal input */ +#define NAME_MAX 255 /* max bytes in a file name */ +#define NGROUPS_MAX 16 /* max supplemental group id's */ +#ifndef OPEN_MAX +#define OPEN_MAX 64 /* max open files per process */ +#endif +#ifndef PATH_MAX +#define PATH_MAX 1024 /* max bytes in pathname */ +#endif +#define PIPE_BUF 512 /* max bytes for atomic pipe writes */ + +#define BC_BASE_MAX 99 /* max ibase/obase values in bc(1) */ +#define BC_DIM_MAX 2048 /* max array elements in bc(1) */ +#define BC_SCALE_MAX 99 /* max scale value in bc(1) */ +#define BC_STRING_MAX 1000 /* max const string length in bc(1) */ +#define COLL_WEIGHTS_MAX 0 /* max weights for order keyword */ +#define EXPR_NEST_MAX 32 /* max expressions nested in expr(1) */ +#define LINE_MAX 2048 /* max bytes in an input line */ +#define RE_DUP_MAX 255 /* max RE's in interval notation */ + +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/syslog.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/syslog.h new file mode 100644 index 00000000000..34f7c2a89a7 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/syslog.h @@ -0,0 +1,202 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)syslog.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _SYS_SYSLOG_H_ +#define _SYS_SYSLOG_H_ + +#define _PATH_LOG "/dev/log" + +/* + * priorities/facilities are encoded into a single 32-bit quantity, where the + * bottom 3 bits are the priority (0-7) and the top 28 bits are the facility + * (0-big number). Both the priorities and the facilities map roughly + * one-to-one to strings in the syslogd(8) source code. This mapping is + * included in this file. + * + * priorities (these are ordered) + */ +#define LOG_EMERG 0 /* system is unusable */ +#define LOG_ALERT 1 /* action must be taken immediately */ +#define LOG_CRIT 2 /* critical conditions */ +#define LOG_ERR 3 /* error conditions */ +#define LOG_WARNING 4 /* warning conditions */ +#define LOG_NOTICE 5 /* normal but significant condition */ +#define LOG_INFO 6 /* informational */ +#define LOG_DEBUG 7 /* debug-level messages */ + +#define LOG_PRIMASK 0x07 /* mask to extract priority part (internal) */ + /* extract priority */ +#define LOG_PRI(p) ((p) & LOG_PRIMASK) +#define LOG_MAKEPRI(fac, pri) (((fac) << 3) | (pri)) + +#ifdef SYSLOG_NAMES +#define INTERNAL_NOPRI 0x10 /* the "no priority" priority */ + /* mark "facility" */ +#define INTERNAL_MARK LOG_MAKEPRI(LOG_NFACILITIES, 0) +typedef struct _code { + char *c_name; + int c_val; +} CODE; + +CODE prioritynames[] = { + "alert", LOG_ALERT, + "crit", LOG_CRIT, + "debug", LOG_DEBUG, + "emerg", LOG_EMERG, + "err", LOG_ERR, + "error", LOG_ERR, /* DEPRECATED */ + "info", LOG_INFO, + "none", INTERNAL_NOPRI, /* INTERNAL */ + "notice", LOG_NOTICE, + "panic", LOG_EMERG, /* DEPRECATED */ + "warn", LOG_WARNING, /* DEPRECATED */ + "warning", LOG_WARNING, + NULL, -1, +}; +#endif + +/* facility codes */ +#define LOG_KERN (0<<3) /* kernel messages */ +#define LOG_USER (1<<3) /* random user-level messages */ +#define LOG_MAIL (2<<3) /* mail system */ +#define LOG_DAEMON (3<<3) /* system daemons */ +#define LOG_AUTH (4<<3) /* security/authorization messages */ +#define LOG_SYSLOG (5<<3) /* messages generated internally by syslogd */ +#define LOG_LPR (6<<3) /* line printer subsystem */ +#define LOG_NEWS (7<<3) /* network news subsystem */ +#define LOG_UUCP (8<<3) /* UUCP subsystem */ +#define LOG_CRON (9<<3) /* clock daemon */ +#define LOG_AUTHPRIV (10<<3) /* security/authorization messages (private) */ +#define LOG_FTP (11<<3) /* ftp daemon */ + + /* other codes through 15 reserved for system use */ +#define LOG_LOCAL0 (16<<3) /* reserved for local use */ +#define LOG_LOCAL1 (17<<3) /* reserved for local use */ +#define LOG_LOCAL2 (18<<3) /* reserved for local use */ +#define LOG_LOCAL3 (19<<3) /* reserved for local use */ +#define LOG_LOCAL4 (20<<3) /* reserved for local use */ +#define LOG_LOCAL5 (21<<3) /* reserved for local use */ +#define LOG_LOCAL6 (22<<3) /* reserved for local use */ +#define LOG_LOCAL7 (23<<3) /* reserved for local use */ + +#define LOG_NFACILITIES 24 /* current number of facilities */ +#define LOG_FACMASK 0x03f8 /* mask to extract facility part */ + /* facility of pri */ +#define LOG_FAC(p) (((p) & LOG_FACMASK) >> 3) + +#ifdef SYSLOG_NAMES +CODE facilitynames[] = { + "auth", LOG_AUTH, + "authpriv", LOG_AUTHPRIV, + "cron", LOG_CRON, + "daemon", LOG_DAEMON, + "ftp", LOG_FTP, + "kern", LOG_KERN, + "lpr", LOG_LPR, + "mail", LOG_MAIL, + "mark", INTERNAL_MARK, /* INTERNAL */ + "news", LOG_NEWS, + "security", LOG_AUTH, /* DEPRECATED */ + "syslog", LOG_SYSLOG, + "user", LOG_USER, + "uucp", LOG_UUCP, + "local0", LOG_LOCAL0, + "local1", LOG_LOCAL1, + "local2", LOG_LOCAL2, + "local3", LOG_LOCAL3, + "local4", LOG_LOCAL4, + "local5", LOG_LOCAL5, + "local6", LOG_LOCAL6, + "local7", LOG_LOCAL7, + NULL, -1, +}; +#endif + +#ifdef KERNEL +#define LOG_PRINTF -1 /* pseudo-priority to indicate use of printf */ +#endif + +/* + * arguments to setlogmask. + */ +#define LOG_MASK(pri) (1 << (pri)) /* mask for one priority */ +#define LOG_UPTO(pri) ((1 << ((pri)+1)) - 1) /* all priorities through pri */ + +/* + * Option flags for openlog. + * + * LOG_ODELAY no longer does anything. + * LOG_NDELAY is the inverse of what it used to be. + */ +#define LOG_PID 0x01 /* log the pid with each message */ +#define LOG_CONS 0x02 /* log on the console if errors in sending */ +#define LOG_ODELAY 0x04 /* delay open until first syslog() (default) */ +#define LOG_NDELAY 0x08 /* don't delay open */ +#define LOG_NOWAIT 0x10 /* don't wait for console forks: DEPRECATED */ +#define LOG_PERROR 0x20 /* log to stderr as well */ + +#ifdef KERNEL + +#else /* not KERNEL */ + +/* + * Don't use va_list in the vsyslog() prototype. Va_list is typedef'd in two + * places ( and ), so if we include one + * of them here we may collide with the utility's includes. It's unreasonable + * for utilities to have to include one of them to include syslog.h, so we get + * _BSD_VA_LIST_ from and use it. + */ +#include +#include + +__BEGIN_DECLS +void closelog __P((void)); +void openlog __P((const char *, int, int)); +int setlogmask __P((int)); +void syslog __P((int, const char *, ...)); +void vsyslog __P((int, const char *, _BSD_VA_LIST_)); +__END_DECLS + +#ifdef OSKIT +/* + * Silliness. + */ +typedef void (*oskit_syslogger_t)(int, const char *, ...); +extern oskit_syslogger_t oskit_libc_syslogger; +#endif + +#endif /* !KERNEL */ + +#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/systm.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/systm.h new file mode 100644 index 00000000000..fc5bb5a941a --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/systm.h @@ -0,0 +1,245 @@ +/*- + * Copyright (c) 1982, 1988, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)systm.h 8.4 (Berkeley) 2/23/94 + */ + +#ifndef _SYS_SYSTM_H_ +#define _SYS_SYSTM_H_ + +#include +#include + +/* + * The `securelevel' variable controls the security level of the system. + * It can only be decreased by process 1 (/sbin/init). + * + * Security levels are as follows: + * -1 permannently insecure mode - always run system in level 0 mode. + * 0 insecure mode - immutable and append-only flags make be turned off. + * All devices may be read or written subject to permission modes. + * 1 secure mode - immutable and append-only flags may not be changed; + * raw disks of mounted filesystems, /dev/mem, and /dev/kmem are + * read-only. + * 2 highly secure mode - same as (1) plus raw disks are always + * read-only whether mounted or not. This level precludes tampering + * with filesystems by unmounting them, but also inhibits running + * newfs while the system is secured. + * + * In normal operation, the system runs in level 0 mode while single user + * and in level 1 mode while multiuser. If level 2 mode is desired while + * running multiuser, it can be set in the multiuser startup script + * (/etc/rc.local) using sysctl(1). If it is desired to run the system + * in level 0 mode while multiuser, initialize the variable securelevel + * in /sys/kern/kern_sysctl.c to -1. Note that it is NOT initialized to + * zero as that would allow the kernel binary to be patched to -1. + * Without initialization, securelevel loads in the BSS area which only + * comes into existence when the kernel is loaded and hence cannot be + * patched by a stalking hacker. + */ +extern int securelevel; /* system security level */ + +extern int cold; /* nonzero if we are doing a cold boot */ +extern const char *panicstr; /* panic message */ +extern char version[]; /* system version */ +extern char copyright[]; /* system copyright */ + +extern int nblkdev; /* number of entries in bdevsw */ +extern int nchrdev; /* number of entries in cdevsw */ +extern struct swdevt *swdevt; /* swap-device information */ +extern int nswdev; /* number of swap devices */ +extern int nswap; /* size of swap space */ + +extern int selwait; /* select timeout address */ + +extern u_char curpriority; /* priority of current process */ + +extern int physmem; /* physical memory */ + +extern dev_t dumpdev; /* dump device */ +extern long dumplo; /* offset into dumpdev */ + +extern dev_t rootdev; /* root device */ +extern struct vnode *rootvp; /* vnode equivalent to above */ + +extern dev_t swapdev; /* swapping device */ +extern struct vnode *swapdev_vp;/* vnode equivalent to above */ + +extern int boothowto; /* reboot flags, from console subsystem */ + +/* + * General function declarations. + */ +int nullop __P((void)); +int enodev __P((void)); +int enoioctl __P((void)); +int enxio __P((void)); +int eopnotsupp __P((void)); +int seltrue __P((dev_t dev, int which, struct proc *p)); +int ureadc __P((int, struct uio *)); +void *hashinit __P((int count, int type, u_long *hashmask)); +void *phashinit __P((int count, int type, u_long *nentries)); + +__dead void panic __P((const char *, ...)) __dead2; +__dead void boot __P((int)) __dead2; +void tablefull __P((const char *)); +void addlog __P((const char *, ...)); +#ifndef __REACTOS__ +void log __P((int, const char *, ...)); +void printf __P((const char *, ...)); +#else +#include +#include +#define log(x,...) OS_DbgPrint(x,(__VA_ARGS__)) +#endif +void uprintf __P((const char *, ...)); +int sprintf __P((char *buf, const char *, ...)); +void ttyprintf __P((struct tty *, const char *, ...)); +void kprintf __P((const char *fmt, int flags, struct tty *tp, va_list ap)); + +#ifndef __REACTOS__ +void bcopy __P((const void *from, void *to, size_t len)); +#endif +void ovbcopy __P((const void *from, void *to, size_t len)); +void blkclr __P((void *buf, u_int len)); +void bzero __P((void *buf, size_t len)); + +#ifndef __REACTOS__ +void *memcpy __P((void *to, const void *from, size_t len)); +#endif + +int copystr __P((void *kfaddr, void *kdaddr, u_int len, u_int *done)); +int copyinstr __P((void *udaddr, void *kaddr, u_int len, u_int *done)); +int copyoutstr __P((void *kaddr, void *udaddr, u_int len, u_int *done)); +int copyin __P((void *udaddr, void *kaddr, u_int len)); +int copyout __P((void *kaddr, void *udaddr, u_int len)); + +int fubyte __P((void *base)); +int fuibyte __P((void *base)); +int subyte __P((void *base, int byte)); +int suibyte __P((void *base, int byte)); +int fuword __P((void *base)); +int fuiword __P((void *base)); +int suword __P((void *base, int word)); +int susword __P((void *base, int word)); +int suiword __P((void *base, int word)); + +int hzto __P((struct timeval *tv)); +void realitexpire __P((void *)); + +struct clockframe; +void hardclock __P((struct clockframe *frame)); +void softclock __P((void)); +void statclock __P((struct clockframe *frame)); + +void initclocks __P((void)); + +void startprofclock __P((struct proc *)); +void stopprofclock __P((struct proc *)); +void setstatclockrate __P((int hzrate)); + +void hardupdate __P((long)); +#include + +/* Initialize the world */ +extern void consinit(void); +extern void kmeminit(void); +extern void cpu_startup(void); +extern void usrinfoinit(void); +extern void rqinit(void); +extern void vfsinit(void); +extern void mbinit(void); +extern void clist_init(void); +extern void ifinit(void); +extern void domaininit(void); +extern void cpu_initclocks(void); +extern void vntblinit(void); +extern void nchinit(void); + +/* Finalize the world. */ +void shutdown_nice __P((void)); + +extern __dead void vm_pageout(void) __dead2; /* pagedaemon, called in proc 2 */ +extern __dead void vfs_update(void) __dead2; /* update, called in proc 3 */ +extern __dead void scheduler(void) __dead2; /* sched, called in process 0 */ + +/* + * Kernel to clock driver interface. + */ +void inittodr __P((time_t base)); +void resettodr __P((void)); +void startrtclock __P((void)); + +/* Timeouts */ +typedef void (timeout_t)(void *); /* actual timeout function type */ +typedef timeout_t *timeout_func_t; /* a pointer to this type */ + +void timeout(timeout_func_t, void *, int); +void untimeout(timeout_func_t, void *); +void logwakeup __P((void)); + +/* Syscalls that are called internally. */ +struct close_args { + int fd; +}; +int close __P((struct proc *, struct close_args *uap, int *retval)); +struct execve_args { + char *fname; + char **argv; + char **envv; +}; +int execve __P((struct proc *, struct execve_args *, int *retval)); +struct fork_args { + int dummy; +}; +int fork __P((struct proc *, struct fork_args *, int retval[])); +struct sync_args { + int dummy; +}; +int sync __P((struct proc *, struct sync_args *, int *retval)); +struct wait_args { + int pid; + int *status; + int options; + struct rusage *rusage; +#if defined(COMPAT_43) || defined(COMPAT_IBCS2) + int compat; /* pseudo */ +#endif +}; +int wait1 __P((struct proc *, struct wait_args *, int retval[])); + +#endif /* !_SYS_SYSTM_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/time.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/time.h new file mode 100644 index 00000000000..dc28aa72865 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/time.h @@ -0,0 +1,135 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)time.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _SYS_TIME_H_ +#define _SYS_TIME_H_ + +/* + * Structure returned by gettimeofday(2) system call, + * and used in other calls. + */ +struct timeval { + long tv_sec; /* seconds */ + long tv_usec; /* and microseconds */ +}; + +/* + * Structure defined by POSIX.4 to be like a timeval. + */ +struct timespec { + long ts_sec; /* seconds */ + long ts_nsec; /* and nanoseconds */ +}; + +#define TIMEVAL_TO_TIMESPEC(tv, ts) { \ + (ts)->ts_sec = (tv)->tv_sec; \ + (ts)->ts_nsec = (tv)->tv_usec * 1000; \ +} +#define TIMESPEC_TO_TIMEVAL(tv, ts) { \ + (tv)->tv_sec = (ts)->ts_sec; \ + (tv)->tv_usec = (ts)->ts_nsec / 1000; \ +} + +struct timezone { + int tz_minuteswest; /* minutes west of Greenwich */ + int tz_dsttime; /* type of dst correction */ +}; +#define DST_NONE 0 /* not on dst */ +#define DST_USA 1 /* USA style dst */ +#define DST_AUST 2 /* Australian style dst */ +#define DST_WET 3 /* Western European dst */ +#define DST_MET 4 /* Middle European dst */ +#define DST_EET 5 /* Eastern European dst */ +#define DST_CAN 6 /* Canada */ + +/* Operations on timevals. */ +#define timerclear(tvp) (tvp)->tv_sec = (tvp)->tv_usec = 0 +#define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec) +#define timercmp(tvp, uvp, cmp) \ + (((tvp)->tv_sec == (uvp)->tv_sec) ? \ + ((tvp)->tv_usec cmp (uvp)->tv_usec) : \ + ((tvp)->tv_sec cmp (uvp)->tv_sec)) + +/* + * Names of the interval timers, and structure + * defining a timer setting. + */ +#define ITIMER_REAL 0 +#define ITIMER_VIRTUAL 1 +#define ITIMER_PROF 2 + +struct itimerval { + struct timeval it_interval; /* timer interval */ + struct timeval it_value; /* current value */ +}; + +/* + * Getkerninfo clock information structure + */ +struct clockinfo { + int hz; /* clock frequency */ + int tick; /* micro-seconds per hz tick */ + int stathz; /* statistics clock frequency */ + int profhz; /* profiling clock frequency */ +}; + +#ifdef KERNEL + +int itimerdecr __P((struct itimerval *itp,int usec)); +int itimerfix __P((struct timeval *)); +void microtime __P((struct timeval *)); +void timevaladd __P((struct timeval *, struct timeval *)); +void timevalfix __P((struct timeval *)); +void timevalsub __P((struct timeval *, struct timeval *)); + +#else /* not KERNEL */ +#include + +#ifndef _POSIX_SOURCE +#include + +__BEGIN_DECLS +int adjtime __P((const struct timeval *, struct timeval *)); +int getitimer __P((int, struct itimerval *)); +int gettimeofday __P((struct timeval *, struct timezone *)); +int setitimer __P((int, const struct itimerval *, struct itimerval *)); +int settimeofday __P((const struct timeval *, const struct timezone *)); +int utimes __P((const char *, const struct timeval *)); +__END_DECLS +#endif /* !POSIX */ + +#endif /* !KERNEL */ + +#endif /* !_SYS_TIME_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/ttycom.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/ttycom.h new file mode 100644 index 00000000000..3ae6ee516e0 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/ttycom.h @@ -0,0 +1,139 @@ +/*- + * Copyright (c) 1982, 1986, 1990, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ttycom.h 8.1 (Berkeley) 3/28/94 + */ + +#ifndef _SYS_TTYCOM_H_ +#define _SYS_TTYCOM_H_ + +#include + +/* + * Tty ioctl's except for those supported only for backwards compatibility + * with the old tty driver. + */ + +/* + * Window/terminal size structure. This information is stored by the kernel + * in order to provide a consistent interface, but is not used by the kernel. + */ +struct winsize { + unsigned short ws_row; /* rows, in characters */ + unsigned short ws_col; /* columns, in characters */ + unsigned short ws_xpixel; /* horizontal size, pixels */ + unsigned short ws_ypixel; /* vertical size, pixels */ +}; + +#define TIOCMODG _IOR('t', 3, int) /* get modem control state */ +#define TIOCMODS _IOW('t', 4, int) /* set modem control state */ +#define TIOCM_LE 0001 /* line enable */ +#define TIOCM_DTR 0002 /* data terminal ready */ +#define TIOCM_RTS 0004 /* request to send */ +#define TIOCM_ST 0010 /* secondary transmit */ +#define TIOCM_SR 0020 /* secondary receive */ +#define TIOCM_CTS 0040 /* clear to send */ +#define TIOCM_CAR 0100 /* carrier detect */ +#define TIOCM_CD TIOCM_CAR +#define TIOCM_RNG 0200 /* ring */ +#define TIOCM_RI TIOCM_RNG +#define TIOCM_DSR 0400 /* data set ready */ + /* 8-10 compat */ +#define TIOCEXCL _IO('t', 13) /* set exclusive use of tty */ +#define TIOCNXCL _IO('t', 14) /* reset exclusive use of tty */ + /* 15 unused */ +#define TIOCFLUSH _IOW('t', 16, int) /* flush buffers */ + /* 17-18 compat */ +#define TIOCGETA _IOR('t', 19, struct termios) /* get termios struct */ +#define TIOCSETA _IOW('t', 20, struct termios) /* set termios struct */ +#define TIOCSETAW _IOW('t', 21, struct termios) /* drain output, set */ +#define TIOCSETAF _IOW('t', 22, struct termios) /* drn out, fls in, set */ +#define TIOCGETD _IOR('t', 26, int) /* get line discipline */ +#define TIOCSETD _IOW('t', 27, int) /* set line discipline */ + /* 127-124 compat */ +#define TIOCSBRK _IO('t', 123) /* set break bit */ +#define TIOCCBRK _IO('t', 122) /* clear break bit */ +#define TIOCSDTR _IO('t', 121) /* set data terminal ready */ +#define TIOCCDTR _IO('t', 120) /* clear data terminal ready */ +#define TIOCGPGRP _IOR('t', 119, int) /* get pgrp of tty */ +#define TIOCSPGRP _IOW('t', 118, int) /* set pgrp of tty */ + /* 117-116 compat */ +#define TIOCOUTQ _IOR('t', 115, int) /* output queue size */ +#define TIOCSTI _IOW('t', 114, char) /* simulate terminal input */ +#define TIOCNOTTY _IO('t', 113) /* void tty association */ +#define TIOCPKT _IOW('t', 112, int) /* pty: set/clear packet mode */ +#define TIOCPKT_DATA 0x00 /* data packet */ +#define TIOCPKT_FLUSHREAD 0x01 /* flush packet */ +#define TIOCPKT_FLUSHWRITE 0x02 /* flush packet */ +#define TIOCPKT_STOP 0x04 /* stop output */ +#define TIOCPKT_START 0x08 /* start output */ +#define TIOCPKT_NOSTOP 0x10 /* no more ^S, ^Q */ +#define TIOCPKT_DOSTOP 0x20 /* now do ^S ^Q */ +#define TIOCPKT_IOCTL 0x40 /* state change of pty driver */ +#define TIOCSTOP _IO('t', 111) /* stop output, like ^S */ +#define TIOCSTART _IO('t', 110) /* start output, like ^Q */ +#define TIOCMSET _IOW('t', 109, int) /* set all modem bits */ +#define TIOCMBIS _IOW('t', 108, int) /* bis modem bits */ +#define TIOCMBIC _IOW('t', 107, int) /* bic modem bits */ +#define TIOCMGET _IOR('t', 106, int) /* get all modem bits */ +#define TIOCREMOTE _IOW('t', 105, int) /* remote input editing */ +#define TIOCGWINSZ _IOR('t', 104, struct winsize) /* get window size */ +#define TIOCSWINSZ _IOW('t', 103, struct winsize) /* set window size */ +#define TIOCUCNTL _IOW('t', 102, int) /* pty: set/clr usr cntl mode */ +#define TIOCSTAT _IO('t', 101) /* simulate a control-T status msg */ +#define UIOCCMD(n) _IO('u', n) /* usr cntl op "n" */ +#define TIOCCONS _IOW('t', 98, int) /* become virtual console */ +#define TIOCSCTTY _IO('t', 97) /* become controlling tty */ +#define TIOCEXT _IOW('t', 96, int) /* pty: external processing */ +#define TIOCSIG _IO('t', 95) /* pty: generate signal */ +#define TIOCDRAIN _IO('t', 94) /* wait till output drained */ +#define TIOCMSDTRWAIT _IOW('t', 91, int) /* modem: set wait on close */ +#define TIOCMGDTRWAIT _IOR('t', 90, int) /* modem: get wait on close */ +#define TIOCTIMESTAMP _IOR('t', 89, struct timeval) /* get timestamp of + last interrupt for xntp. */ +#define TIOCDSIMICROCODE _IO('t', 85) /* Download microcode to + DSI Softmodem */ +#define TIOCSDRAINWAIT _IOW('t', 87, int) /* set ttywait timeout */ +#define TIOCGDRAINWAIT _IOR('t', 86, int) /* get ttywait timeout */ + +#define TTYDISC 0 /* termios tty line discipline */ +#define TABLDISC 3 /* tablet discipline */ +#define SLIPDISC 4 /* serial IP discipline */ +#define PPPDISC 5 /* PPP discipline */ + + +#endif /* !_SYS_TTYCOM_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/types.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/types.h new file mode 100644 index 00000000000..dbcacb42530 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/types.h @@ -0,0 +1,167 @@ +/*- + * Copyright (c) 1982, 1986, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)types.h 8.4 (Berkeley) 1/21/94 + */ + +#ifndef _SYS_TYPES_H_ +#define _SYS_TYPES_H_ + +#include + +/* Machine type dependent parameters. */ +#include + +#if !defined(_POSIX_SOURCE) +typedef unsigned char u_char; +typedef unsigned short u_short; +typedef unsigned int u_int; +typedef unsigned long u_long; +typedef unsigned short ushort; /* Sys V compatibility */ +typedef unsigned int uint; /* Sys V compatibility */ + +typedef unsigned long long u_quad_t; /* quads */ +typedef long long quad_t; +typedef quad_t * qaddr_t; + +typedef char * caddr_t; /* core address */ +typedef long daddr_t; /* disk address */ +typedef unsigned long dev_t; /* device number */ +typedef unsigned long fixpt_t; /* fixed point number */ +typedef unsigned long gid_t; /* group id */ +typedef unsigned long ino_t; /* inode number */ +typedef unsigned short mode_t; /* permissions */ +typedef unsigned short nlink_t; /* link count */ +typedef quad_t off_t; /* file offset */ +typedef long pid_t; /* process id */ +typedef long segsz_t; /* segment size */ +typedef long swblk_t; /* swap offset */ +typedef unsigned long uid_t; /* user id */ +#endif + +/* + * This belongs in unistd.h, but is placed here to ensure that programs + * casting the second parameter of lseek to off_t will get the correct + * version of lseek. + */ +#ifndef KERNEL +__BEGIN_DECLS +off_t lseek __P((int, off_t, int)); +__END_DECLS +#endif + +#ifndef _POSIX_SOURCE +/* + * minor() gives a cookie instead of an index since we don't want to + * change the meanings of bits 0-15 or waste time and space shifting + * bits 16-31 for devices that don't use them. + */ +#define major(x) ((int)(((u_int)(x) >> 8)&0xff)) /* major number */ +#define minor(x) ((int)((x)&0xffff00ff)) /* minor number */ +#define makedev(x,y) ((dev_t)(((x)<<8) | (y))) /* create dev_t */ +#endif + +#include +#include + +#ifdef _BSD_CLOCK_T_ +typedef _BSD_CLOCK_T_ clock_t; +#undef _BSD_CLOCK_T_ +#endif + +#ifdef _BSD_SIZE_T_ +typedef _BSD_SIZE_T_ size_t; +#undef _BSD_SIZE_T_ +#endif + +#ifdef _BSD_SSIZE_T_ +typedef _BSD_SSIZE_T_ ssize_t; +#undef _BSD_SSIZE_T_ +#endif + +#ifdef _BSD_TIME_T_ +typedef _BSD_TIME_T_ time_t; +#undef _BSD_TIME_T_ +#endif + +#ifndef _POSIX_SOURCE +#define NBBY 8 /* number of bits in a byte */ + +/* + * Select uses bit masks of file descriptors in longs. These macros + * manipulate such bit fields (the filesystem macros use chars). + * FD_SETSIZE may be defined by the user, but the default here should + * be enough for most uses. + */ +#ifndef FD_SETSIZE +#define FD_SETSIZE 256 +#endif + +typedef long fd_mask; +#define NFDBITS (sizeof(fd_mask) * NBBY) /* bits per mask */ + +#ifndef howmany +#define howmany(x, y) (((x)+((y)-1))/(y)) +#endif + +typedef struct fd_set { + fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)]; +} fd_set; + +#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS))) +#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS))) +#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS))) +#define FD_COPY(f, t) bcopy(f, t, sizeof(*(f))) +#define FD_ZERO(p) bzero(p, sizeof(*(p))) + +#if defined(__STDC__) && defined(KERNEL) +/* + * Forward structure declarations for function prototypes. We include the + * common structures that cross subsystem boundaries here; others are mostly + * used in the same place that the structure is defined. + */ +struct proc; +struct pgrp; +struct ucred; +struct rusage; +struct file; +struct buf; +struct tty; +struct uio; +#endif +#endif /* !_POSIX_SOURCE */ +#endif /* !_SYS_TYPES_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/ucred.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/ucred.h new file mode 100644 index 00000000000..0d74bd9d02e --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/ucred.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ucred.h 8.2 (Berkeley) 1/4/94 + */ + +#ifndef _SYS_UCRED_H_ +#define _SYS_UCRED_H_ + +/* + * Credentials. + */ +struct ucred { + u_short cr_ref; /* reference count */ + uid_t cr_uid; /* effective user id */ + short cr_ngroups; /* number of groups */ + gid_t cr_groups[NGROUPS]; /* groups */ +}; +#define cr_gid cr_groups[0] +#define NOCRED ((struct ucred *)-1) /* no credential available */ +#define FSCRED ((struct ucred *)-2) /* filesystem credential */ + +#ifdef KERNEL +#define crhold(cr) (cr)->cr_ref++ +struct ucred *crget(void); +struct ucred *crcopy(struct ucred *); +struct ucred *crdup(struct ucred *); +extern void crfree(struct ucred *); +extern int suser(struct ucred *, u_short *); +int groupmember __P((gid_t, struct ucred *)); + +#endif /* KERNEL */ + +#endif /* !_SYS_UCRED_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/uio.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/uio.h new file mode 100644 index 00000000000..35e46ab1021 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/uio.h @@ -0,0 +1,91 @@ +/* + * Copyright (c) 1982, 1986, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)uio.h 8.5 (Berkeley) 2/22/94 + */ + +#ifndef _SYS_UIO_H_ +#define _SYS_UIO_H_ + +/* + * XXX + * iov_base should be a void *. + */ +struct iovec { + char *iov_base; /* Base address. */ + size_t iov_len; /* Length. */ +}; + +enum uio_rw { UIO_READ, UIO_WRITE }; + +/* Segment flag values. */ +enum uio_seg { + UIO_USERSPACE, /* from user data space */ + UIO_SYSSPACE, /* from system space */ + UIO_USERISPACE, /* from user I space */ + UIO_NOCOPY /* don't copy, already in object */ +}; + +#ifdef KERNEL +struct uio { + struct iovec *uio_iov; + int uio_iovcnt; + off_t uio_offset; + int uio_resid; + enum uio_seg uio_segflg; + enum uio_rw uio_rw; + struct proc *uio_procp; +}; + +/* + * Limits + */ +#define UIO_MAXIOV 1024 /* max 1K of iov's */ +#define UIO_SMALLIOV 8 /* 8 on stack, else malloc */ +#endif /* KERNEL */ + +#ifdef KERNEL + +int uiomove __P((caddr_t, int, struct uio *)); + +#else /* !KERNEL */ + +#include + +__BEGIN_DECLS +ssize_t readv __P((int, const struct iovec *, int)); +ssize_t writev __P((int, const struct iovec *, int)); +__END_DECLS + +#endif /* KERNEL */ + +#endif /* !_SYS_UIO_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/unistd.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/unistd.h new file mode 100644 index 00000000000..cb4b33e1299 --- /dev/null +++ b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/unistd.h @@ -0,0 +1,121 @@ +/* + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)unistd.h 8.2 (Berkeley) 1/7/94 + */ + +#ifndef _SYS_UNISTD_H_ +#define _SYS_UNISTD_H_ + +/* compile-time symbolic constants */ +#define _POSIX_JOB_CONTROL /* implementation supports job control */ + +/* + * This feature does not work for root according to POSIX 1003.1. + * We use the saved IDs in seteuid/setegid, which are not currently + * part of the POSIX 1003.1 specification. + */ +#define _POSIX_SAVED_IDS /* saved set-user-ID and set-group-ID */ + +#define _POSIX_VERSION 198808L +#define _POSIX2_VERSION 199212L + +/* execution-time symbolic constants */ + /* chown requires appropriate privileges */ +#define _POSIX_CHOWN_RESTRICTED 1 + /* too-long path components generate errors */ +#define _POSIX_NO_TRUNC 1 + /* may disable terminal special characters */ +#define _POSIX_VDISABLE 0xff + +/* access function */ +#define F_OK 0 /* test for existence of file */ +#define X_OK 0x01 /* test for execute or search permission */ +#define W_OK 0x02 /* test for write permission */ +#define R_OK 0x04 /* test for read permission */ + +/* whence values for lseek(2) */ +#define SEEK_SET 0 /* set file offset to offset */ +#define SEEK_CUR 1 /* set file offset to current plus offset */ +#define SEEK_END 2 /* set file offset to EOF plus offset */ + +#ifndef _POSIX_SOURCE +/* whence values for lseek(2); renamed by POSIX 1003.1 */ +#define L_SET SEEK_SET +#define L_INCR SEEK_CUR +#define L_XTND SEEK_END +#endif + +/* configurable pathname variables */ +#define _PC_LINK_MAX 1 +#define _PC_MAX_CANON 2 +#define _PC_MAX_INPUT 3 +#define _PC_NAME_MAX 4 +#define _PC_PATH_MAX 5 +#define _PC_PIPE_BUF 6 +#define _PC_CHOWN_RESTRICTED 7 +#define _PC_NO_TRUNC 8 +#define _PC_VDISABLE 9 + +/* configurable system variables */ +#define _SC_ARG_MAX 1 +#define _SC_CHILD_MAX 2 +#define _SC_CLK_TCK 3 +#define _SC_NGROUPS_MAX 4 +#define _SC_OPEN_MAX 5 +#define _SC_JOB_CONTROL 6 +#define _SC_SAVED_IDS 7 +#define _SC_VERSION 8 +#define _SC_BC_BASE_MAX 9 +#define _SC_BC_DIM_MAX 10 +#define _SC_BC_SCALE_MAX 11 +#define _SC_BC_STRING_MAX 12 +#define _SC_COLL_WEIGHTS_MAX 13 +#define _SC_EXPR_NEST_MAX 14 +#define _SC_LINE_MAX 15 +#define _SC_RE_DUP_MAX 16 +#define _SC_2_VERSION 17 +#define _SC_2_C_BIND 18 +#define _SC_2_C_DEV 19 +#define _SC_2_CHAR_TERM 20 +#define _SC_2_FORT_DEV 21 +#define _SC_2_FORT_RUN 22 +#define _SC_2_LOCALEDEF 23 +#define _SC_2_SW_DEV 24 +#define _SC_2_UPE 25 +#define _SC_STREAM_MAX 26 +#define _SC_TZNAME_MAX 27 + +/* configurable system strings */ +#define _CS_PATH 1 + +#endif /* !_SYS_UNISTD_H_ */ diff --git a/reactos/lib/oskittcp/include/memtrack.h b/reactos/lib/oskittcp/include/memtrack.h new file mode 100644 index 00000000000..b4c0bbc6b49 --- /dev/null +++ b/reactos/lib/oskittcp/include/memtrack.h @@ -0,0 +1,73 @@ +#ifndef MEMTRACK_H +#define MEMTRACK_H + +#ifndef FOURCC +#define FOURCC(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d)) +#endif + +#define FBSD_MALLOC FOURCC('d','s','b','f') +#define EXALLOC_TAG FOURCC('E','x','A','l') + +#ifdef MEMTRACK +#define MTMARK() TrackDumpFL(__FILE__, __LINE__) +#define NdisAllocateBuffer(x,y,z,a,b) { \ + NdisAllocateBuffer(x,y,z,a,b); \ + if( *x == NDIS_STATUS_SUCCESS ) { \ + Track(NDIS_BUFFER_TAG, *y); \ + } \ +} +#define NdisAllocatePacket(x,y,z) { \ + NdisAllocatePacket(x,y,z); \ + if( *x == NDIS_STATUS_SUCCESS ) { \ + Track(NDIS_PACKET_TAG, *y); \ + } \ +} +#define FreeNdisPacket(x) { TI_DbgPrint(MID_TRACE,("Deleting Packet %x\n", x)); FreeNdisPacketX(x); } +#define NdisFreePacket(x) { Untrack(x); NdisFreePacket(x); } +#define NdisFreeBuffer(x) { Untrack(x); NdisFreeBuffer(x); } +#define exAllocatePool(x,y) ExAllocatePoolX(x,y,__FILE__,__LINE__) +#define exAllocatePoolWithTag(x,y,z) ExAllocatePoolX(x,y,__FILE__,__LINE__) +#define exFreePool(x) ExFreePoolX(x,__FILE__,__LINE__) + +extern LIST_ENTRY AllocatedObjectsHead; +extern KSPIN_LOCK AllocatedObjectsLock; + +typedef struct _ALLOCATION_TRACKER { + LIST_ENTRY Entry; + DWORD Tag; + PVOID Thing; + PCHAR FileName; + DWORD LineNo; +} ALLOCATION_TRACKER, *PALLOCATION_TRACKER; + +VOID TrackingInit(); +VOID TrackWithTag( DWORD Tag, PVOID Thing, PCHAR File, DWORD Line ); +#define Track(Tag,Thing) TrackWithTag(Tag,Thing,__FILE__,__LINE__) +VOID UntrackFL( PCHAR File, DWORD Line, PVOID Thing ); +#define Untrack(Thing) UntrackFL(__FILE__,__LINE__,Thing) +VOID TrackDumpFL( PCHAR File, DWORD Line ); +#define TrackDump() TrackDumpFL(__FILE__,__LINE__) +VOID TrackTag( DWORD Tag ); + +static inline PVOID ExAllocatePoolX( POOL_TYPE type, SIZE_T size, PCHAR File, ULONG Line ) { + PVOID Out = ExAllocatePool( type, size ); + if( Out ) TrackWithTag( EXALLOC_TAG, Out, File, Line ); + return Out; +} +static inline VOID ExFreePoolX( PVOID Data, PCHAR File, ULONG Line ) { + UntrackFL(File, Line, Data); + ExFreePool(Data); +} + +#define MEMTRACK_MAX_TAGS_TO_TRACK 64 +#else +#define MTMARK() +#define Track(x,y) +#define TrackingInit() +#define TrackDump() +#define Untrack(x) +#define TrackTag(x) +#define FreeNdisPacket FreeNdisPacketX +#endif + +#endif/*MEMMTRAC_H*/ diff --git a/reactos/lib/oskittcp/include/oskitdebug.h b/reactos/lib/oskittcp/include/oskitdebug.h new file mode 100644 index 00000000000..c263b4b8575 --- /dev/null +++ b/reactos/lib/oskittcp/include/oskitdebug.h @@ -0,0 +1,94 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS TCP/IP protocol driver + * FILE: include/debug.h + * PURPOSE: Debugging support macros + * DEFINES: DBG - Enable debug output + * NASSERT - Disable assertions + */ +#ifndef __OSKITDEBUG_H +#define __OSKITDEBUG_H + +#define OSK_NORMAL_MASK 0x000000FF +#define OSK_SPECIAL_MASK 0xFFFFFF00 +#define OSK_MIN_TRACE 0x00000001 +#define OSK_MID_TRACE 0x00000002 +#define OSK_MAX_TRACE 0x00000003 + +#define OSK_DEBUG_CHECK 0x00000100 +#define OSK_DEBUG_MEMORY 0x00000200 +#define OSK_DEBUG_BUFFER 0x00000400 +#define OSK_DEBUG_IRP 0x00000800 +#define OSK_DEBUG_REFCOUNT 0x00001000 +#define OSK_DEBUG_ADDRFILE 0x00002000 +#define OSK_DEBUG_DATALINK 0x00004000 +#define OSK_DEBUG_ARP 0x00008000 +#define OSK_DEBUG_IP 0x00010000 +#define OSK_DEBUG_UDP 0x00020000 +#define OSK_DEBUG_TCP 0x00040000 +#define OSK_DEBUG_ICMP 0x00080000 +#define OSK_DEBUG_ROUTER 0x00100000 +#define OSK_DEBUG_RCACHE 0x00200000 +#define OSK_DEBUG_NCACHE 0x00400000 +#define OSK_DEBUG_CPOINT 0x00800000 +#define OSK_DEBUG_ULTRA 0xFFFFFFFF + +#include +#include + +#ifdef DBG + +extern OSK_UINT OskitDebugTraceLevel; + +#ifdef _MSC_VER + +#define OS_DbgPrint(_t_, _x_) \ + if (((OskitDebugTraceLevel & OSK_NORMAL_MASK) >= _t_) || \ + ((OskitDebugTraceLevel & _t_) > OSK_NORMAL_MASK)) { \ + DbgPrint("(%s:%d) ", __FILE__, __LINE__); \ + DbgPrint _x_ ; \ + } + +#else /* _MSC_VER */ + +#define OS_DbgPrint(_t_, _x_) \ + if (((OskitDebugTraceLevel & OSK_NORMAL_MASK) >= _t_) || \ + ((OskitDebugTraceLevel & _t_) > OSK_NORMAL_MASK)) { \ + DbgPrint("(%s:%d)(%s) ", __FILE__, __LINE__, __FUNCTION__); \ + DbgPrint _x_ ; \ + } + +#endif /* _MSC_VER */ + +#if 0 +#ifdef ASSERT +#undef ASSERT +#endif + +#ifdef NASSERT +#define ASSERT(x) +#else /* NASSERT */ +#define ASSERT(x) if (!(x)) { OS_DbgPrint(MIN_TRACE, ("Assertion "#x" failed at %s:%d\n", __FILE__, __LINE__)); KeBugCheck(0); } +#endif /* NASSERT */ +#endif + +#define ASSERT_IRQL(x) ASSERT(KeGetCurrentIrql() <= (x)) + +#else /* DBG */ + +#define OS_DbgPrint(_t_, _x_) + +#if 0 +#define ASSERT_IRQL(x) +#define ASSERT(x) +#endif + +#endif /* DBG */ + + +#define assert(x) ASSERT(x) +#define assert_irql(x) ASSERT_IRQL(x) + +#endif /* __OSKITDEBUG_H */ + +/* EOF */ diff --git a/reactos/lib/oskittcp/include/oskiterrno.h b/reactos/lib/oskittcp/include/oskiterrno.h new file mode 100644 index 00000000000..d8d2efa8ed6 --- /dev/null +++ b/reactos/lib/oskittcp/include/oskiterrno.h @@ -0,0 +1,170 @@ +/* + * Copyright (c) 1982, 1986, 1989, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)errno.h 8.5 (Berkeley) 1/21/94 + */ + +#ifndef _OSK_SYS_ERRNO_H_ +#define _OSK_SYS_ERRNO_H_ + +#ifndef __REACTOS__ +#ifndef KERNEL +extern int errno; /* global error number */ +#endif +#endif + +#define OSK_EPERM 1 /* Operation not permitted */ +#define OSK_ENOENT 2 /* No such file or directory */ +#define OSK_ESRCH 3 /* No such process */ +#define OSK_EINTR 4 /* Interrupted system call */ +#define OSK_EIO 5 /* Input/output error */ +#define OSK_ENXIO 6 /* Device not configured */ +#define OSK_E2BIG 7 /* Argument list too long */ +#define OSK_ENOEXEC 8 /* Exec format error */ +#define OSK_EBADF 9 /* Bad file descriptor */ +#define OSK_ECHILD 10 /* No child processes */ +#define OSK_EDEADLK 11 /* Resource deadlock avoided */ +/* 11 was OSK_EAGAIN */ +#define OSK_ENOMEM 12 /* Cannot allocate memory */ +#define OSK_EACCES 13 /* Permission denied */ +#define OSK_EFAULT 14 /* Bad address */ +#ifndef _POSIX_SOURCOSK_E +#define OSK_ENOTBLK 15 /* Block device required */ +#endif +#define OSK_EBUSY 16 /* Device busy */ +#define OSK_EEXIST 17 /* File exists */ +#define OSK_EXDEV 18 /* Cross-device link */ +#define OSK_ENODEV 19 /* Operation not supported by device */ +#define OSK_ENOTDIR 20 /* Not a directory */ +#define OSK_EISDIR 21 /* Is a directory */ +#define OSK_EINVAL 22 /* Invalid argument */ +#define OSK_ENFILE 23 /* Too many open files in system */ +#define OSK_EMFILE 24 /* Too many open files */ +#define OSK_ENOTTY 25 /* Inappropriate ioctl for device */ +#ifndef _POSIX_SOURCE +#define OSK_ETXTBSY 26 /* Text file busy */ +#endif +#define OSK_EFBIG 27 /* File too large */ +#define OSK_ENOSPC 28 /* No space left on device */ +#define OSK_ESPIPE 29 /* Illegal seek */ +#define OSK_EROFS 30 /* Read-only file system */ +#define OSK_EMLINK 31 /* Too many links */ +#define OSK_EPIPE 32 /* Broken pipe */ + +/* math software */ +#define OSK_EDOM 33 /* Numerical argument out of domain */ +#define OSK_ERANGE 34 /* Result too large */ + +/* non-blocking and interrupt i/o */ +#define OSK_EAGAIN 35 /* Resource temporarily unavailable */ +#ifndef _POSIX_SOURCE +#define OSK_EWOULDBLOCK EAGAIN /* Operation would block */ +#define OSK_EINPROGRESS 36 /* Operation now in progress */ +#define OSK_EALREADY 37 /* Operation already in progress */ + +/* ipc/network software -- argument errors */ +#define OSK_ENOTSOCK 38 /* Socket operation on non-socket */ +#define OSK_EDESTADDRREQ 39 /* Destination address required */ +#define OSK_EMSGSIZE 40 /* Message too long */ +#define OSK_EPROTOTYPE 41 /* Protocol wrong type for socket */ +#define OSK_ENOPROTOOPT 42 /* Protocol not available */ +#define OSK_EPROTONOSUPPORT 43 /* Protocol not supported */ +#define OSK_ESOCKTNOSUPPORT 44 /* Socket type not supported */ +#define OSK_EOPNOTSUPP 45 /* Operation not supported */ +#define OSK_EPFNOSUPPORT 46 /* Protocol family not supported */ +#define OSK_EAFNOSUPPORT 47 /* Address family not supported by protocol family */ +#define OSK_EADDRINUSE 48 /* Address already in use */ +#define OSK_EADDRNOTAVAIL 49 /* Can't assign requested address */ + +/* ipc/network software -- operational errors */ +#define OSK_ENETDOWN 50 /* Network is down */ +#define OSK_ENETUNREACH 51 /* Network is unreachable */ +#define OSK_ENETRESET 52 /* Network dropped connection on reset */ +#define OSK_ECONNABORTED 53 /* Software caused connection abort */ +#define OSK_ECONNRESET 54 /* Connection reset by peer */ +#define OSK_ENOBUFS 55 /* No buffer space available */ +#define OSK_EISCONN 56 /* Socket is already connected */ +#define OSK_ENOTCONN 57 /* Socket is not connected */ +#define OSK_ESHUTDOWN 58 /* Can't send after socket shutdown */ +#define OSK_ETOOMANYREFS 59 /* Too many references: can't splice */ +#define OSK_ETIMEDOUT 60 /* Operation timed out */ +#define OSK_ECONNREFUSED 61 /* Connection refused */ + +#define OSK_ELOOP 62 /* Too many levels of symbolic links */ +#endif /* _POSIX_SOURCE */ +#define OSK_ENAMETOOLONG 63 /* File name too long */ + +/* should be rearranged */ +#ifndef _POSIX_SOURCE +#define OSK_EHOSTDOWN 64 /* Host is down */ +#define OSK_EHOSTUNREACH 65 /* No route to host */ +#endif /* _POSIX_SOURCE */ +#define OSK_ENOTEMPTY 66 /* Directory not empty */ + +/* quotas & mush */ +#ifndef _POSIX_SOURCE +#define OSK_EPROCLIM 67 /* Too many processes */ +#define OSK_EUSERS 68 /* Too many users */ +#define OSK_EDQUOT 69 /* Disc quota exceeded */ + +/* Network File System */ +#define OSK_ESTALE 70 /* Stale NFS file handle */ +#define OSK_EREMOTE 71 /* Too many levels of remote in path */ +#define OSK_EBADRPC 72 /* RPC struct is bad */ +#define OSK_ERPCMISMATCH 73 /* RPC version wrong */ +#define OSK_EPROGUNAVAIL 74 /* RPC prog. not avail */ +#define OSK_EPROGMISMATCH 75 /* Program version wrong */ +#define OSK_EPROCUNAVAIL 76 /* Bad procedure for program */ +#endif /* _POSIX_SOURCE */ + +#define OSK_ENOLCK 77 /* No locks available */ +#define OSK_ENOSYS 78 /* Function not implemented */ + +#ifndef _POSIX_SOURCE +#define OSK_EFTYPE 79 /* Inappropriate file type or format */ +#define OSK_EAUTH 80 /* Authentication error */ +#define OSK_ENEEDAUTH 81 /* Need authenticator */ +#define OSK_ELAST 81 /* Must be equal largest errno */ +#endif /* _POSIX_SOURCE */ + +#ifdef KERNEL +/* pseudo-errors returned inside kernel to modify return to process */ +#define OSK_ERESTART -1 /* restart syscall */ +#define OSK_EJUSTRETURN -2 /* don't modify regs, just return */ +#endif + +#endif/*OSK_SYS_ERRNO*/ diff --git a/reactos/lib/oskittcp/include/oskitfreebsd.h b/reactos/lib/oskittcp/include/oskitfreebsd.h new file mode 100644 index 00000000000..36ba212f1b9 --- /dev/null +++ b/reactos/lib/oskittcp/include/oskitfreebsd.h @@ -0,0 +1,14 @@ +#ifndef _OSKITFREEBSD_H +#define _OSKITFREEBSD_H + +extern void oskittcp_die(const char *file, int line); + +#define printf DbgPrint +#define ovbcopy(x,y,z) bcopy(x,y,z) +#define bzero(x,y) memset(x,0,y) +#define bcopy memcpy +#define panic(...) do { DbgPrint(__VA_ARGS__); \ + oskittcp_die(__FILE__,__LINE__); } while(0) +#define kmem_malloc(x,y,z) malloc(y) + +#endif//_OSKITFREEBSD_H diff --git a/reactos/lib/oskittcp/include/oskittcp.h b/reactos/lib/oskittcp/include/oskittcp.h new file mode 100644 index 00000000000..b98b2fe2df7 --- /dev/null +++ b/reactos/lib/oskittcp/include/oskittcp.h @@ -0,0 +1,106 @@ +#ifndef OSKITTCP_H +#define OSKITTCP_H + +#include +#ifdef KERNEL +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct connect_args { + int s; + caddr_t name; + int namelen; +}; +#endif + +#include + +#define IPHDR_SIZE 20 + +typedef void (*OSKITTCP_SOCKET_DATA_AVAILABLE) + ( void *ClientData, + void *WhichSocket, + void *WhichConnection, + OSK_PCHAR Data, + OSK_UINT Len ); +typedef void (*OSKITTCP_SOCKET_CONNECT_INDICATION) + ( void *ClientData, + void *WhichSocket, + void *WhichConnection ); +typedef void (*OSKITTCP_SOCKET_CLOSE_INDICATION) + ( void *WhichSocket ); +typedef void (*OSKITTCP_SOCKET_PENDING_CONNECT_INDICATION) + ( void *WhichSocket ); +typedef void (*OSKITTCP_SOCKET_RESET_INDICATION) + ( void *WhichSocket ); +typedef int (*OSKITTCP_SEND_PACKET) + ( void *ClientData, + void *WhichSocket, + void *WhichConnection, + OSK_PCHAR Data, + OSK_UINT Len ); +typedef int (*OSKITTCP_NEED_BIND) + ( void *ClientData, + void *WhichSocket, + void *WhichConnection, + struct sockaddr *address, + OSK_UINT addrlen, + OSK_UINT reuseport ); + +typedef struct _OSKITTCP_EVENT_HANDLERS { + void *ClientData; + OSKITTCP_SOCKET_DATA_AVAILABLE SocketDataAvailable; + OSKITTCP_SOCKET_CONNECT_INDICATION SocketConnectIndication; + OSKITTCP_SOCKET_CLOSE_INDICATION SocketCloseIndication; + OSKITTCP_SOCKET_PENDING_CONNECT_INDICATION SocketPendingConnectIndication; + OSKITTCP_SOCKET_RESET_INDICATION SocketResetIndication; + OSKITTCP_SEND_PACKET PacketSend; + OSKITTCP_NEED_BIND Bind; +} OSKITTCP_EVENT_HANDLERS, *POSKITTCP_EVENT_HANDLERS; + +extern OSKITTCP_EVENT_HANDLERS OtcpEvent; + +extern void InitOskitTCP(); +extern void DeinitOskitTCP(); +extern void TimerOskitTCP(); +extern int OskitTCPSocket( void *Connection, void **ConnectionContext, + int Af, int Type, int Proto ); +extern void RegisterOskitTCPEventHandlers +( POSKITTCP_EVENT_HANDLERS EventHandlers ); +extern void OskitTCPReceiveDatagram( OSK_PCHAR Data, OSK_UINT Len, + OSK_UINT IpHeaderLen ); + +#undef errno + +#define malloc(x,...) fbsd_malloc(x,__FILE__,__LINE__) +#define free(x,...) fbsd_free(x,__FILE__,__LINE__) + +/* Error codes */ +#include + +#define SOCK_MAXADDRLEN 255 + +#endif/*OSKITTCP_H*/ diff --git a/reactos/lib/oskittcp/include/oskittypes.h b/reactos/lib/oskittcp/include/oskittypes.h new file mode 100644 index 00000000000..1040980e2db --- /dev/null +++ b/reactos/lib/oskittcp/include/oskittypes.h @@ -0,0 +1,60 @@ + +#ifndef OSKITTYPES_H +#define OSKITTYPES_H + +typedef struct sockaddr OSK_SOCKADDR; +typedef unsigned char *OSK_PCHAR; +typedef unsigned int OSK_UINT; +typedef unsigned short OSK_UI16; +typedef char * osk_caddr_t; + +#define SWAP_FAMILY_LEN(sabuf,s) \ + (sabuf)->sin_family = htons((sabuf)->sin_family) +/* do { s = (sabuf)->sin_family; (sabuf)->sin_family = (sabuf)->sin_len; (sabuf)->sin_len = s; } while(0); */ + +/* + * The ifaddr structure contains information about one address + * of an interface. They are maintained by the different address families, + * are allocated and attached when an address is set, and are linked + * together so all addresses for an interface can be located. + */ +struct ifaddr { + struct sockaddr *ifa_addr; /* address of interface */ + struct sockaddr *ifa_dstaddr; /* other end of p-to-p link */ +#define ifa_broadaddr ifa_dstaddr /* broadcast address interface */ + struct sockaddr *ifa_netmask; /* used to determine subnet */ + u_short ifa_flags; /* mostly rt_flags for cloning */ + short ifa_refcnt; /* extra to malloc for link info */ + int ifa_metric; /* cost of going out this interface */ + u_short ifa_mtu; /* MTU */ +}; +#define IFA_ROUTE RTF_UP /* route installed */ +#define OSK_IFQ_MAXLEN 50 + +/* + * These numbers are used by reliable protocols for determining + * retransmission behavior and are included in the routing structure. + */ +struct rt_metrics { + u_long rmx_locks; /* Kernel must leave these values alone */ + u_long rmx_mtu; /* MTU for this path */ + u_long rmx_hopcount; /* max hops expected */ + u_long rmx_expire; /* lifetime for route, e.g. redirect */ + u_long rmx_recvpipe; /* inbound delay-bandwith product */ + u_long rmx_sendpipe; /* outbound delay-bandwith product */ + u_long rmx_ssthresh; /* outbound gateway buffer limit */ + u_long rmx_rtt; /* estimated round trip time */ + u_long rmx_rttvar; /* estimated rtt variance */ + u_long rmx_pksent; /* packets sent using this route */ + u_long rmx_filler[4]; /* will be used for T/TCP later */ +}; + +struct rtentry { + struct sockaddr *rt_gateway; /* value */ + u_long rt_flags; /* up/down?, host/net */ + struct ifaddr rt_ifa; /* the answer: interface to use */ + struct rt_metrics rt_rmx; /* metrics used by rx'ing protocols */ + u_long rt_mtu; /* Path MTU */ +}; + +#endif/*OSKITTYPES_H*/ diff --git a/reactos/lib/oskittcp/makefile b/reactos/lib/oskittcp/makefile new file mode 100644 index 00000000000..e555c1b23fc --- /dev/null +++ b/reactos/lib/oskittcp/makefile @@ -0,0 +1,83 @@ + + +# $Id: makefile,v 1.1 2004/05/02 07:21:58 arty Exp $ + +PATH_TO_TOP = ../.. + +TARGET_BOOTSTRAP = yes + +TARGET_TYPE = library + +TARGET_NAME = oskittcp + +TARGET_CFLAGS = -g -D__REACTOS__=1 -DKERNEL -Iinclude/freebsd -Iinclude/freebsd/sys/include -Iinclude/freebsd/src/sys -Iinclude/freebsd/dev/include -Iinclude/freebsd/net/include -Iinclude -I$(PATH_TO_TOP)/w32api/include -I$(PATH_TO_TOP)/include -DMEMTRACK + +# require os code to explicitly request A/W version of structs/functions +TARGET_CFLAGS += -D_DISABLE_TIDENTS + +TARGET_ASFLAGS = -I $(PATH_TO_TOP)/include + +TARGET_LFLAGS = -Wl,--file-alignment,0x1000 \ + -Wl,--section-alignment,0x1000 \ + -nostartfiles -nostdlib \ + +TARGET_GCCLIBS = gcc + +TARGET_BASE = 0x79f60000 + +TARGET_PATH = + +REACTOS_OBJECTS = \ + oskittcp/defaults.o \ + oskittcp/in.o \ + oskittcp/in_cksum.o \ + oskittcp/in_pcb.o \ + oskittcp/in_proto.o \ + oskittcp/in_rmx.o \ + oskittcp/inet_ntoa.o \ + oskittcp/interface.o \ + oskittcp/ip_input.o \ + oskittcp/ip_output.o \ + oskittcp/kern_clock.o \ + oskittcp/kern_subr.o \ + oskittcp/malloc.o \ + oskittcp/param.o \ + oskittcp/radix.o \ + oskittcp/random.o \ + oskittcp/rtsock.o \ + oskittcp/scanc.o \ + oskittcp/sleep.o \ + oskittcp/tcp_input.o \ + oskittcp/tcp_output.o \ + oskittcp/tcp_subr.o \ + oskittcp/tcp_usrreq.o \ + oskittcp/tcp_debug.o \ + oskittcp/tcp_timer.o \ + oskittcp/uipc_domain.o \ + oskittcp/uipc_mbuf.o \ + oskittcp/uipc_socket.o \ + oskittcp/uipc_socket2.o + +TARGET_OBJECTS = $(FREEBSD_OBJECTS) $(REACTOS_OBJECTS) +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: csr/TAGS dbg/TAGS ldr/TAGS main/TAGS rtl/TAGS stdio/TAGS stdlib/TAGS string/TAGS stubs/TAGS + etags -i csr/TAGS -i dbg/TAGS -i ldr/TAGS -i main/TAGS -i rtl/TAGS -i stdio/TAGS -i stdlib/TAGS -i string/TAGS -i stubs/TAGS + + +docu: + doxygen Doxyfile + +.PHONY: docu + + +# EOF diff --git a/reactos/lib/oskittcp/oskittcp/defaults.c b/reactos/lib/oskittcp/oskittcp/defaults.c new file mode 100644 index 00000000000..0133e6531d4 --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/defaults.c @@ -0,0 +1,215 @@ +/* + * Copyright (c) 1996-1998 University of Utah and the Flux Group. + * All rights reserved. + * + * This file is part of the Flux OSKit. The OSKit is free software, also known + * as "open source;" you can redistribute it and/or modify it under the terms + * of the GNU General Public License (GPL), version 2, as published by the Free + * Software Foundation (FSF). To explore alternate licensing terms, contact + * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. + * + * The OSKit 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 GPL for more details. You should have + * received a copy of the GPL along with the OSKit; see the file COPYING. If + * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. + */ +/* + * Routines necessary for the bsdnet code. + */ + +#include +#include +#include +#include +#include +#include +#include "net/netisr.h" + +int oskit_cpl; /* for machine/spl.h */ +int bootverbose; /* networking code wants to know whether booting + is to be verbose */ +int securelevel = 3; /* used in ip_fw.c:ip_fw_ctl -- make it > 2 */ + +vm_map_t mb_map; /* this is passed in kmem_alloc, but ignored there */ + +struct proc proc0; +struct proc *curproc = &proc0; + +struct domain localdomain; /* see uipc_domain.c ADDDOMAIN macro */ + +/* ---------------------------------------------------------------------- */ + +/* + * find a process by pid + */ +struct proc * +pfind(pid_t pid) +{ + printf(__FUNCTION__" called, pid=%d, returning x%p\n", + (int)pid, (void*)&proc0); + return &proc0; +} + +/* + * signal a process + */ +void +psignal (struct proc *p, int sig) +{ + printf(__FUNCTION__" called, proc=x%p sig=%d\n", p, sig); +} + +/* + * signal a process group + */ +void +gsignal (int pgid, int sig) +{ + printf(__FUNCTION__" called, pgid=%d sig=%d\n", pgid, sig); +} + +/* ---------------------------------------------------------------------- */ + +/* + * copy in from userspace + */ +int +copyin (void *udaddr, void *kaddr, u_int len) +{ + memcpy(kaddr, udaddr, len); + return 0; +} + +/* + * copy out to userspace + */ +int +copyout (void *kaddr, void *udaddr, u_int len) +{ + memcpy(udaddr, kaddr, len); + return 0; +} + +/* + * even though these functions have an odd signature, + * they only copy one byte + */ +int subyte (void *base, int byte) +{ + return (int)((char *)base = (char)byte); +} + +int suibyte (void *base, int byte) +{ + return (int)((char *)base = (char)byte); +} + +/* ---------------------------------------------------------------------- */ + +#ifndef __REACTOS__ +/* + * log some information + */ +void +log (int level, const char *format, ...) +{ + extern int vprintf(const char *, va_list); + va_list args; + va_start(args, format); + printf("__FUNCTION__(%d):", level); + vprintf(format, args); + va_end(args); +} +#endif + +/* ---------------------------------------------------------------------- */ + +/* + * do we have super user credentials? + */ +/* ARGSUSED */ +int +suser(struct ucred *ucred, u_short *acflag) +{ + /* of course. */ + return 0; +} + +/* ---------------------------------------------------------------------- */ +/* + * stuff stolen from kern/kern_sysctl.c + */ +/* + * Validate parameters and get old / set new parameters + * for an integer-valued sysctl function. + */ +int +sysctl_int(oldp, oldlenp, newp, newlen, valp) + void *oldp; + size_t *oldlenp; + void *newp; + size_t newlen; + int *valp; +{ + int error = 0; + + if (oldp && *oldlenp < sizeof(int)) + return (ENOMEM); + if (newp && newlen != sizeof(int)) + return (EINVAL); + *oldlenp = sizeof(int); + if (oldp) + error = copyout(valp, oldp, sizeof(int)); + if (error == 0 && newp) + error = copyin(newp, valp, sizeof(int)); + return (error); +} + +/* + * Validate parameters and get old parameters + * for a structure oriented sysctl function. + */ +int +sysctl_rdstruct(oldp, oldlenp, newp, sp, len) + void *oldp; + size_t *oldlenp; + void *newp, *sp; + int len; +{ + int error = 0; + + if (oldp && *oldlenp < len) + return (ENOMEM); + if (newp) + return (EPERM); + *oldlenp = len; + if (oldp) + error = copyout(sp, oldp, len); + return (error); +} + +/* ---------------------------------------------------------------------- */ +/* + * normally, this is a builtin function in gcc + * net/if.c doesn't seem to get it, though + */ +int +memcmp(const void *s1v, const void *s2v, size_t size) +{ + register const char *s1 = s1v, *s2 = s2v; + register unsigned int a, b; + + while (size-- > 0) { + if ((a = *s1++) != (b = *s2++)) + return (a-b); + } + + return 0; +} + +int bcmp(const void *b1, const void *b2, size_t len) +{ + return memcmp(b1, b2, len); +} + diff --git a/reactos/lib/oskittcp/oskittcp/in.c b/reactos/lib/oskittcp/oskittcp/in.c new file mode 100644 index 00000000000..89ad849f36f --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/in.c @@ -0,0 +1,181 @@ +/* + * Copyright (c) 1982, 1986, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)in.c 8.2 (Berkeley) 11/15/93 + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include + +/* + * This structure is used to keep track of in_multi chains which belong to + * deleted interface addresses. + */ +static LIST_HEAD(, multi_kludge) in_mk; /* XXX BSS initialization */ + +struct multi_kludge { + LIST_ENTRY(multi_kludge) mk_entry; + struct ifnet *mk_ifp; + struct in_multihead mk_head; +}; + +/* + * Return the network number from an internet address. + */ +u_long +in_netof(in) + struct in_addr in; +{ + register u_long i = ntohl(in.s_addr); + register u_long net; + register struct in_ifaddr *ia; + + if (IN_CLASSA(i)) + net = i & IN_CLASSA_NET; + else if (IN_CLASSB(i)) + net = i & IN_CLASSB_NET; + else if (IN_CLASSC(i)) + net = i & IN_CLASSC_NET; + else if (IN_CLASSD(i)) + net = i & IN_CLASSD_NET; + else + return (0); + + /* + * Check whether network is a subnet; + * if so, return subnet number. + */ + for (ia = in_ifaddr; ia; ia = ia->ia_next) + if (net == ia->ia_net) + return (i & ia->ia_subnetmask); + return (net); +} + +#ifndef SUBNETSARELOCAL +#define SUBNETSARELOCAL 1 +#endif +int subnetsarelocal = SUBNETSARELOCAL; +/* + * Return 1 if an internet address is for a ``local'' host + * (one to which we have a connection). If subnetsarelocal + * is true, this includes other subnets of the local net. + * Otherwise, it includes only the directly-connected (sub)nets. + */ +int +in_localaddr(in) + struct in_addr in; +{ + register u_long i = ntohl(in.s_addr); + register struct in_ifaddr *ia; + + if (subnetsarelocal) { + for (ia = in_ifaddr; ia; ia = ia->ia_next) + if ((i & ia->ia_netmask) == ia->ia_net) + return (1); + } else { + for (ia = in_ifaddr; ia; ia = ia->ia_next) + if ((i & ia->ia_subnetmask) == ia->ia_subnet) + return (1); + } + return (0); +} + +int in_interfaces; /* number of external internet interfaces */ + +/* + * Generic internet control operations (ioctl's). + * Ifp is 0 if not an interface-specific ioctl. + */ +/* ARGSUSED */ +int +in_control(so, cmd, data, ifp) + struct socket *so; + int cmd; + caddr_t data; + register struct ifnet *ifp; +{ + return (0); +} + +/* + * Delete a multicast address record. + */ +void +in_delmulti(inm) + register struct in_multi *inm; +{ +#if 0 + register struct in_multi **p; + struct ifreq ifr; + int s = splnet(); + + if (--inm->inm_refcount == 0) { + /* + * No remaining claims to this record; let IGMP know that + * we are leaving the multicast group. + */ + /* igmp_leavegroup(inm); XXX arty */ + /* + * Unlink from list. + */ + LIST_REMOVE(inm, inm_entry); + + /* + * Notify the network driver to update its multicast reception + * filter. + */ + ((struct sockaddr_in *)&(ifr.ifr_addr))->sin_family = AF_INET; + ((struct sockaddr_in *)&(ifr.ifr_addr))->sin_addr = + inm->inm_addr; + (*inm->inm_ifp->if_ioctl)(inm->inm_ifp, SIOCDELMULTI, + (caddr_t)&ifr); + free(inm, M_IPMADDR); + } + splx(s); +#endif +} diff --git a/reactos/lib/oskittcp/oskittcp/in_cksum.c b/reactos/lib/oskittcp/oskittcp/in_cksum.c new file mode 100644 index 00000000000..4175f8cb087 --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/in_cksum.c @@ -0,0 +1,150 @@ +/* + * Copyright (c) 1988, 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)in_cksum.c 8.1 (Berkeley) 6/10/93 + */ + +#include +#include +#include + +/* + * Checksum routine for Internet Protocol family headers (Portable Version). + * + * This routine is very heavily used in the network + * code and should be modified for each CPU to be as fast as possible. + */ + +#define ADDCARRY(x) (x > 65535 ? x -= 65535 : x) +#define REDUCE {l_util.l = sum; sum = l_util.s[0] + l_util.s[1]; ADDCARRY(sum);} + +int +in_cksum(m, len) + register struct mbuf *m; + register int len; +{ + register u_short *w; + register int sum = 0; + register int mlen = 0; + int byte_swapped = 0; + + union { + char c[2]; + u_short s; + } s_util; + union { + u_short s[2]; + long l; + } l_util; + + for (;m && len; m = m->m_next) { + if (m->m_len == 0) + continue; + w = mtod(m, u_short *); + if (mlen == -1) { + /* + * The first byte of this mbuf is the continuation + * of a word spanning between this mbuf and the + * last mbuf. + * + * s_util.c[0] is already saved when scanning previous + * mbuf. + */ + s_util.c[1] = *(char *)w; + sum += s_util.s; + w = (u_short *)((char *)w + 1); + mlen = m->m_len - 1; + len--; + } else + mlen = m->m_len; + if (len < mlen) + mlen = len; + len -= mlen; + /* + * Force to even boundary. + */ + if ((1 & (int) w) && (mlen > 0)) { + REDUCE; + sum <<= 8; + s_util.c[0] = *(u_char *)w; + w = (u_short *)((char *)w + 1); + mlen--; + byte_swapped = 1; + } + /* + * Unroll the loop to make overhead from + * branches &c small. + */ + while ((mlen -= 32) >= 0) { + sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3]; + sum += w[4]; sum += w[5]; sum += w[6]; sum += w[7]; + sum += w[8]; sum += w[9]; sum += w[10]; sum += w[11]; + sum += w[12]; sum += w[13]; sum += w[14]; sum += w[15]; + w += 16; + } + mlen += 32; + while ((mlen -= 8) >= 0) { + sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3]; + w += 4; + } + mlen += 8; + if (mlen == 0 && byte_swapped == 0) + continue; + REDUCE; + while ((mlen -= 2) >= 0) { + sum += *w++; + } + if (byte_swapped) { + REDUCE; + sum <<= 8; + byte_swapped = 0; + if (mlen == -1) { + s_util.c[1] = *(char *)w; + sum += s_util.s; + mlen = 0; + } else + mlen = -1; + } else if (mlen == -1) + s_util.c[0] = *(char *)w; + } + if (len) + printf("cksum: out of data\n"); + if (mlen == -1) { + /* The last mbuf has odd # of bytes. Follow the + standard (the odd byte may be shifted left by 8 bits + or not as determined by endian-ness of the machine) */ + s_util.c[1] = 0; + sum += s_util.s; + } + REDUCE; + return (~sum & 0xffff); +} diff --git a/reactos/lib/oskittcp/oskittcp/in_pcb.c b/reactos/lib/oskittcp/oskittcp/in_pcb.c new file mode 100644 index 00000000000..f050eb655d4 --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/in_pcb.c @@ -0,0 +1,521 @@ +/* + * Copyright (c) 1982, 1986, 1991, 1993, 1995 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)in_pcb.c 8.2 (Berkeley) 1/4/94 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +struct in_addr zeroin_addr; + +int +in_pcballoc(so, pcbinfo) + struct socket *so; + struct inpcbinfo *pcbinfo; +{ + register struct inpcb *inp; + int s; + + MALLOC(inp, struct inpcb *, sizeof(*inp), M_PCB, M_NOWAIT); + if (inp == NULL) + return (ENOBUFS); + bzero((caddr_t)inp, sizeof(*inp)); + inp->inp_pcbinfo = pcbinfo; + inp->inp_socket = so; + s = splnet(); + LIST_INSERT_HEAD(pcbinfo->listhead, inp, inp_list); + in_pcbinshash(inp); + splx(s); + so->so_pcb = (caddr_t)inp; + return (0); +} + +int +in_pcbbind(inp, nam) + register struct inpcb *inp; + struct mbuf *nam; +{ + register struct socket *so = inp->inp_socket; + struct inpcbhead *head = inp->inp_pcbinfo->listhead; + unsigned short *lastport = &inp->inp_pcbinfo->lastport; + struct sockaddr_in *sin; + struct proc *p = curproc; /* XXX */ + struct ifaddr ifa; + u_short lport = 0; + int wild = 0, reuseport = (so->so_options & SO_REUSEPORT); + int error; + + if (inp->inp_lport || inp->inp_laddr.s_addr != INADDR_ANY) + return (EINVAL); + if ((so->so_options & (SO_REUSEADDR|SO_REUSEPORT)) == 0 && + ((so->so_proto->pr_flags & PR_CONNREQUIRED) == 0 || + (so->so_options & SO_ACCEPTCONN) == 0)) + wild = INPLOOKUP_WILDCARD; + if (nam) { + sin = mtod(nam, struct sockaddr_in *); + if (nam->m_len != sizeof (*sin)) + return (EINVAL); +#ifdef notdef + /* + * We should check the family, but old programs + * incorrectly fail to initialize it. + */ + if (sin->sin_family != AF_INET) + return (EAFNOSUPPORT); +#endif + lport = sin->sin_port; + if (IN_MULTICAST(ntohl(sin->sin_addr.s_addr))) { + /* + * Treat SO_REUSEADDR as SO_REUSEPORT for multicast; + * allow complete duplication of binding if + * SO_REUSEPORT is set, or if SO_REUSEADDR is set + * and a multicast address is bound on both + * new and duplicated sockets. + */ + if (so->so_options & SO_REUSEADDR) + reuseport = SO_REUSEADDR|SO_REUSEPORT; + } else if (sin->sin_addr.s_addr != INADDR_ANY) { + sin->sin_port = 0; /* yech... */ + if (ifa_ifwithaddr((struct sockaddr *)sin, &ifa) != 0) + return (EADDRNOTAVAIL); + } + if (lport) { + struct inpcb *t; + + /* GROSS */ + if (ntohs(lport) < IPPORT_RESERVED && + (error = suser(p->p_ucred, &p->p_acflag))) + return (EACCES); + t = in_pcblookup(head, zeroin_addr, 0, + sin->sin_addr, lport, wild); + if (t && (reuseport & t->inp_socket->so_options) == 0) + return (EADDRINUSE); + } + inp->inp_laddr = sin->sin_addr; + } + if (lport == 0) + do { + ++*lastport; + if (*lastport < IPPORT_RESERVED || + *lastport > IPPORT_USERRESERVED) + *lastport = IPPORT_RESERVED; + lport = htons(*lastport); + } while (in_pcblookup(head, + zeroin_addr, 0, inp->inp_laddr, lport, wild)); + inp->inp_lport = lport; + in_pcbrehash(inp); + return (0); +} + +/* + * Transform old in_pcbconnect() into an inner subroutine for new + * in_pcbconnect(): Do some validity-checking on the remote + * address (in mbuf 'nam') and then determine local host address + * (i.e., which interface) to use to access that remote host. + * + * This preserves definition of in_pcbconnect(), while supporting a + * slightly different version for T/TCP. (This is more than + * a bit of a kludge, but cleaning up the internal interfaces would + * have forced minor changes in every protocol). + */ + +int +in_pcbladdr(inp, nam, plocal_sin) + register struct inpcb *inp; + struct mbuf *nam; + struct sockaddr_in *plocal_sin; +{ + struct ifaddr ifa; + struct sockaddr_in *ifaddr = 0; + register struct sockaddr_in *sin = mtod(nam, struct sockaddr_in *); + + if (nam->m_len != sizeof (*sin)) + return (EINVAL); + if (sin->sin_family != AF_INET) { + OS_DbgPrint(OSK_MID_TRACE,("EAFNOSUPPORT: %d\n", sin->sin_family)); + return (EAFNOSUPPORT); + } + if (sin->sin_port == 0) + return (EADDRNOTAVAIL); + if (inp->inp_laddr.s_addr == INADDR_ANY) { + register struct route *ro; + /* + * If route is known or can be allocated now, + * our src addr is taken from the i/f, else punt. + */ + ro = &inp->inp_route; + if ((inp->inp_socket->so_options & SO_DONTROUTE) == 0) { + /* No route yet, so try to acquire one */ + ro->ro_dst.sa_family = AF_INET; + /* ro->ro_dst.sa_len = sizeof(struct sockaddr_in); */ + ((struct sockaddr_in *) &ro->ro_dst)->sin_addr = + sin->sin_addr; + if( ifa_ifwithnet( sin, &ifa ) == 0 ) { + inp->inp_laddr = + ((struct sockaddr_in *)&ifa.ifa_addr)->sin_addr; + OS_DbgPrint(OSK_MID_TRACE, + ("Assigning local address: %x\n", + inp->inp_laddr.s_addr)); + } + } + } + /* + * Don't do pcblookup call here; return interface in plocal_sin + * and exit to caller, that will do the lookup. + */ + plocal_sin->sin_family = AF_INET; + plocal_sin->sin_addr = ((struct sockaddr_in *)&ifa.ifa_addr)->sin_addr; + plocal_sin->sin_port = sin->sin_port; + return(0); +} + +/* + * Outer subroutine: + * Connect from a socket to a specified address. + * Both address and port must be specified in argument sin. + * If don't have a local address for this socket yet, + * then pick one. + */ +int +in_pcbconnect(inp, nam) + register struct inpcb *inp; + struct mbuf *nam; +{ + struct sockaddr_in ifaddr; + register struct sockaddr_in *sin = mtod(nam, struct sockaddr_in *); + int error; + + /* + * Call inner routine, to assign local interface address. + */ + if (error = in_pcbladdr(inp, nam, &ifaddr)) + return(error); + + if (in_pcblookuphash(inp->inp_pcbinfo, sin->sin_addr, sin->sin_port, + inp->inp_laddr.s_addr ? inp->inp_laddr : + ifaddr.sin_addr, + inp->inp_lport) != NULL) + return (EADDRINUSE); + if (inp->inp_laddr.s_addr == INADDR_ANY) { + if (inp->inp_lport == 0) + (void)in_pcbbind(inp, (struct mbuf *)0); + inp->inp_laddr = ifaddr.sin_addr; + } + inp->inp_faddr = sin->sin_addr; + inp->inp_fport = sin->sin_port; + in_pcbrehash(inp); + return (0); +} + +void +in_pcbdisconnect(inp) + struct inpcb *inp; +{ + + inp->inp_faddr.s_addr = INADDR_ANY; + inp->inp_fport = 0; + in_pcbrehash(inp); + if (inp->inp_socket->so_state & SS_NOFDREF) + in_pcbdetach(inp); +} + +void +in_pcbdetach(inp) + struct inpcb *inp; +{ + struct socket *so = inp->inp_socket; + int s; + + so->so_pcb = 0; + sofree(so); + if (inp->inp_options) + (void)m_free(inp->inp_options); + ip_freemoptions(inp->inp_moptions); + s = splnet(); + LIST_REMOVE(inp, inp_hash); + LIST_REMOVE(inp, inp_list); + splx(s); + FREE(inp, M_PCB); +} + +void +in_setsockaddr(inp, nam) + register struct inpcb *inp; + struct mbuf *nam; +{ + register struct sockaddr_in *sin; + + nam->m_len = sizeof (*sin); + sin = mtod(nam, struct sockaddr_in *); + bzero((caddr_t)sin, sizeof (*sin)); + sin->sin_family = AF_INET; + /* sin->sin_len = sizeof(*sin); */ + sin->sin_port = inp->inp_lport; + sin->sin_addr = inp->inp_laddr; +} + +void +in_setpeeraddr(inp, nam) + struct inpcb *inp; + struct mbuf *nam; +{ + register struct sockaddr_in *sin; + + nam->m_len = sizeof (*sin); + sin = mtod(nam, struct sockaddr_in *); + bzero((caddr_t)sin, sizeof (*sin)); + sin->sin_family = AF_INET; + /* sin->sin_len = sizeof(*sin); */ + sin->sin_port = inp->inp_fport; + sin->sin_addr = inp->inp_faddr; +} + +/* + * Pass some notification to all connections of a protocol + * associated with address dst. The local address and/or port numbers + * may be specified to limit the search. The "usual action" will be + * taken, depending on the ctlinput cmd. The caller must filter any + * cmds that are uninteresting (e.g., no error in the map). + * Call the protocol specific routine (if any) to report + * any errors for each matching socket. + * + * Must be called at splnet. + */ +void +in_pcbnotify(head, dst, fport_arg, laddr, lport_arg, cmd, notify) + struct inpcbhead *head; + struct sockaddr *dst; + u_int fport_arg, lport_arg; + struct in_addr laddr; + int cmd; + void (*notify) __P((struct inpcb *, int)); +{ + register struct inpcb *inp, *oinp; + struct in_addr faddr; + u_short fport = fport_arg, lport = lport_arg; + int errno, s; + + if ((unsigned)cmd > PRC_NCMDS || dst->sa_family != AF_INET) + return; + faddr = ((struct sockaddr_in *)dst)->sin_addr; + if (faddr.s_addr == INADDR_ANY) + return; + + /* + * Redirects go to all references to the destination, + * and use in_rtchange to invalidate the route cache. + * Dead host indications: notify all references to the destination. + * Otherwise, if we have knowledge of the local port and address, + * deliver only to that socket. + */ + if (PRC_IS_REDIRECT(cmd) || cmd == PRC_HOSTDEAD) { + fport = 0; + lport = 0; + laddr.s_addr = 0; + if (cmd != PRC_HOSTDEAD) + notify = in_rtchange; + } + errno = inetctlerrmap[cmd]; + s = splnet(); + for (inp = head->lh_first; inp != NULL;) { + if (inp->inp_faddr.s_addr != faddr.s_addr || + inp->inp_socket == 0 || + (lport && inp->inp_lport != lport) || + (laddr.s_addr && inp->inp_laddr.s_addr != laddr.s_addr) || + (fport && inp->inp_fport != fport)) { + inp = inp->inp_list.le_next; + continue; + } + oinp = inp; + inp = inp->inp_list.le_next; + if (notify) + (*notify)(oinp, errno); + } + splx(s); +} + +/* + * After a routing change, flush old routing + * and allocate a (hopefully) better one. + */ +void +in_rtchange(inp, errno) + register struct inpcb *inp; + int errno; +{ +} + +struct inpcb * +in_pcblookup(head, faddr, fport_arg, laddr, lport_arg, flags) + struct inpcbhead *head; + struct in_addr faddr, laddr; + u_int fport_arg, lport_arg; + int flags; +{ + register struct inpcb *inp, *match = NULL; + int matchwild = 3, wildcard; + u_short fport = fport_arg, lport = lport_arg; + int s; + + s = splnet(); + + for (inp = head->lh_first; inp != NULL; inp = inp->inp_list.le_next) { + if (inp->inp_lport != lport) + continue; + wildcard = 0; + if (inp->inp_faddr.s_addr != INADDR_ANY) { + if (faddr.s_addr == INADDR_ANY) + wildcard++; + else if (inp->inp_faddr.s_addr != faddr.s_addr || + inp->inp_fport != fport) + continue; + } else { + if (faddr.s_addr != INADDR_ANY) + wildcard++; + } + if (inp->inp_laddr.s_addr != INADDR_ANY) { + if (laddr.s_addr == INADDR_ANY) + wildcard++; + else if (inp->inp_laddr.s_addr != laddr.s_addr) + continue; + } else { + if (laddr.s_addr != INADDR_ANY) + wildcard++; + } + if (wildcard && (flags & INPLOOKUP_WILDCARD) == 0) + continue; + if (wildcard < matchwild) { + match = inp; + matchwild = wildcard; + if (matchwild == 0) { + break; + } + } + } + splx(s); + return (match); +} + +/* + * Lookup PCB in hash list. + */ +struct inpcb * +in_pcblookuphash(pcbinfo, faddr, fport_arg, laddr, lport_arg) + struct inpcbinfo *pcbinfo; + struct in_addr faddr, laddr; + u_int fport_arg, lport_arg; +{ + struct inpcbhead *head; + register struct inpcb *inp; + u_short fport = fport_arg, lport = lport_arg; + int s; + + s = splnet(); + /* + * First look for an exact match. + */ + head = &pcbinfo->hashbase[(faddr.s_addr + lport + fport) % pcbinfo->hashsize]; + + for (inp = head->lh_first; inp != NULL; inp = inp->inp_hash.le_next) { + if (inp->inp_faddr.s_addr != faddr.s_addr || + inp->inp_fport != fport || + inp->inp_lport != lport || + inp->inp_laddr.s_addr != laddr.s_addr) + continue; + /* + * Move PCB to head of this hash chain so that it can be + * found more quickly in the future. + */ + if (inp != head->lh_first) { + LIST_REMOVE(inp, inp_hash); + LIST_INSERT_HEAD(head, inp, inp_hash); + } + break; + } + splx(s); + return (inp); +} + +/* + * Insert PCB into hash chain. Must be called at splnet. + */ +void +in_pcbinshash(inp) + struct inpcb *inp; +{ + struct inpcbhead *head; + + head = &inp->inp_pcbinfo->hashbase[(inp->inp_faddr.s_addr + + inp->inp_lport + inp->inp_fport) % inp->inp_pcbinfo->hashsize]; + + LIST_INSERT_HEAD(head, inp, inp_hash); +} + +void +in_pcbrehash(inp) + struct inpcb *inp; +{ + struct inpcbhead *head; + int s; + + s = splnet(); + LIST_REMOVE(inp, inp_hash); + + head = &inp->inp_pcbinfo->hashbase[(inp->inp_faddr.s_addr + + inp->inp_lport + inp->inp_fport) % inp->inp_pcbinfo->hashsize]; + + LIST_INSERT_HEAD(head, inp, inp_hash); + splx(s); +} + +void in_losing(struct inpcb *inp) { } diff --git a/reactos/lib/oskittcp/oskittcp/in_proto.c b/reactos/lib/oskittcp/oskittcp/in_proto.c new file mode 100644 index 00000000000..3c8ce2f0fbf --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/in_proto.c @@ -0,0 +1,150 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * From: @(#)in_proto.c 8.1 (Berkeley) 6/10/93 + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef TCPDEBUG +#include +#endif +#include +#include +/* + * TCP/IP protocol family: IP, ICMP, UDP, TCP. + */ + +#ifdef NSIP +void idpip_input(), nsip_ctlinput(); +#endif + +#ifdef TPIP +void tpip_input(), tpip_ctlinput(), tp_ctloutput(); +int tp_init(), tp_slowtimo(), tp_drain(), tp_usrreq(); +#endif + +#ifdef EON +void eoninput(), eonctlinput(), eonprotoinit(); +#endif /* EON */ + +void rsvp_input(struct mbuf *, int); +void ipip_input(struct mbuf *, int); + +extern struct domain inetdomain; + +struct protosw inetsw[] = { +{ SOCK_STREAM, &inetdomain, IPPROTO_TCP, + PR_CONNREQUIRED|PR_IMPLOPCL|PR_WANTRCVD, + tcp_input, 0, tcp_ctlinput, tcp_ctloutput, + tcp_usrreq, + tcp_init, tcp_fasttimo, tcp_slowtimo, tcp_drain, tcp_sysctl +}, +}; + +extern int in_inithead(void **, int); + +struct domain inetdomain = + { AF_INET, "internet", 0, 0, 0, + inetsw, &inetsw[sizeof(inetsw)/sizeof(inetsw[0])], 0, + in_inithead, 32, sizeof(struct sockaddr_in) + }; + +DOMAIN_SET(inet); + +#include "imp.h" +#if NIMP > 0 +extern struct domain impdomain; +int rimp_output(), hostslowtimo(); + +struct protosw impsw[] = { +{ SOCK_RAW, &impdomain, 0, PR_ATOMIC|PR_ADDR, + 0, rimp_output, 0, 0, + rip_usrreq, + 0, 0, hostslowtimo, 0, +}, +}; + +struct domain impdomain = + { AF_IMPLINK, "imp", 0, 0, 0, + impsw, &impsw[sizeof (impsw)/sizeof(impsw[0])] }; + +DOMAIN_SET(imp); + +#endif + +#if 0 +#include "hy.h" +#if NHY > 0 +/* + * HYPERchannel protocol family: raw interface. + */ +int rhy_output(); +extern struct domain hydomain; + +struct protosw hysw[] = { +{ SOCK_RAW, &hydomain, 0, PR_ATOMIC|PR_ADDR, + 0, rhy_output, 0, 0, + rip_usrreq, + 0, 0, 0, 0, +}, +}; + +struct domain hydomain = + { AF_HYLINK, "hy", 0, 0, 0, hysw, &hysw[sizeof (hysw)/sizeof(hysw[0])] }; + +DOMAIN_SET(hy); +#endif +#endif diff --git a/reactos/lib/oskittcp/oskittcp/in_rmx.c b/reactos/lib/oskittcp/oskittcp/in_rmx.c new file mode 100644 index 00000000000..ce8d1b0e2d1 --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/in_rmx.c @@ -0,0 +1,91 @@ +/* + * Copyright 1994, 1995 Massachusetts Institute of Technology + * + * Permission to use, copy, modify, and distribute this software and + * its documentation for any purpose and without fee is hereby + * granted, provided that both the above copyright notice and this + * permission notice appear in all copies, that both the above + * copyright notice and this permission notice appear in all + * supporting documentation, and that the name of M.I.T. not be used + * in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. M.I.T. makes + * no representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied + * warranty. + * + * THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS + * ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + * SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +/* + * This code does two things necessary for the enhanced TCP metrics to + * function in a useful manner: + * 1) It marks all non-host routes as `cloning', thus ensuring that + * every actual reference to such a route actually gets turned + * into a reference to a host route to the specific destination + * requested. + * 2) When such routes lose all their references, it arranges for them + * to be deleted in some random collection of circumstances, so that + * a large quantity of stale routing data is not kept in kernel memory + * indefinitely. See in_rtqtimo() below for the exact mechanism. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +/* + * Initialize our routing tree. + */ +int +in_inithead(void **head, int off) +{ + struct radix_node_head *rnh; + + if(!rn_inithead(head, off)) + return 0; + + if(head != (void **)&rt_tables[AF_INET]) /* BOGUS! */ + return 1; /* only do this for the real routing table */ + + rnh = *head; +#if 0 + rnh->rnh_addaddr = in_addroute; + rnh->rnh_matchaddr = in_matroute; + rnh->rnh_close = in_clsroute; + in_rtqtimo(rnh); /* kick off timeout first time */ +#endif + return 1; +} + diff --git a/reactos/lib/oskittcp/oskittcp/inet_ntoa.c b/reactos/lib/oskittcp/oskittcp/inet_ntoa.c new file mode 100644 index 00000000000..d25dff83f84 --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/inet_ntoa.c @@ -0,0 +1,51 @@ + +/* + * Copyright 1994, 1995 Massachusetts Institute of Technology + * + * Permission to use, copy, modify, and distribute this software and + * its documentation for any purpose and without fee is hereby + * granted, provided that both the above copyright notice and this + * permission notice appear in all copies, that both the above + * copyright notice and this permission notice appear in all + * supporting documentation, and that the name of M.I.T. not be used + * in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. M.I.T. makes + * no representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied + * warranty. + * + * THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS + * ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + * SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#include + +#ifndef __REACTOS__ +char * +inet_ntoa(struct in_addr ina) +{ + static char buf[4*sizeof "123"]; + unsigned char *ucp = (unsigned char *)&ina; + + sprintf(buf, "%d.%d.%d.%d", + ucp[0] & 0xff, + ucp[1] & 0xff, + ucp[2] & 0xff, + ucp[3] & 0xff); + return buf; +} + +#endif diff --git a/reactos/lib/oskittcp/oskittcp/interface.c b/reactos/lib/oskittcp/oskittcp/interface.c new file mode 100644 index 00000000000..08ef28fd604 --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/interface.c @@ -0,0 +1,292 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct linker_set domain_set; + +OSKITTCP_EVENT_HANDLERS OtcpEvent = { 0 }; + +OSK_UINT OskitDebugTraceLevel = OSK_DEBUG_ULTRA; + +/* SPL */ +unsigned cpl; +unsigned net_imask; +unsigned volatile ipending; +struct timeval boottime; + +void InitOskitTCP() { + OS_DbgPrint(OSK_MID_TRACE,("Init Called\n")); + OS_DbgPrint(OSK_MID_TRACE,("Init fake freebsd scheduling\n")); + init_freebsd_sched(); + OS_DbgPrint(OSK_MID_TRACE,("Init clock\n")); + clock_init(); + OS_DbgPrint(OSK_MID_TRACE,("Init TCP\n")); + tcp_init(); + OS_DbgPrint(OSK_MID_TRACE,("Init routing\n")); + domaininit(); + memset( &OtcpEvent, 0, sizeof( OtcpEvent ) ); + OS_DbgPrint(OSK_MID_TRACE,("Init Finished\n")); + tcp_iss = 1024; +} + +void DeinitOskitTCP() { +} + +void TimerOskitTCP() { + tcp_slowtimo(); +} + +void RegisterOskitTCPEventHandlers( POSKITTCP_EVENT_HANDLERS EventHandlers ) { + memcpy( &OtcpEvent, EventHandlers, sizeof(OtcpEvent) ); + if( OtcpEvent.PacketSend ) + OS_DbgPrint(OSK_MID_TRACE,("SendPacket handler registered: %x\n", + OtcpEvent.PacketSend)); + if( OtcpEvent.Bind ) + OS_DbgPrint(OSK_MID_TRACE,("Bind handler registered: %x\n", + OtcpEvent.Bind)); +} + +void OskitDumpBuffer( OSK_PCHAR Data, OSK_UINT Len ) { + unsigned int i; + + for( i = 0; i < Len; i++ ) { + if( i && !(i & 0xf) ) DbgPrint( "\n" ); + if( !(i & 0xf) ) DbgPrint( "%08x: ", (UINT)(Data + i) ); + DbgPrint( " %02x", Data[i] ); + } + DbgPrint("\n"); +} + +/* From uipc_syscalls.c */ + +int OskitTCPSocket( void *context, + void **aso, + int domain, + int type, + int proto ) +{ + struct socket *so; + int error = socreate(domain, &so, type, proto); + if( !error ) { + so->so_connection = context; + *aso = so; + } + return error; +#if 0 + register struct protosw *prp; + register struct socket *so; + register int error; + + if (proto) { + prp = pffindproto(domain, proto, type); + } else { + prp = pffindtype(domain, type); + } + if (prp == 0 || prp->pr_usrreq == 0) { + return (EPROTONOSUPPORT); + } + if (prp->pr_type != type) { + return (EPROTOTYPE); + } + MALLOC(so, struct socket *, sizeof(*so), M_SOCKET, M_WAIT); + bzero((caddr_t)so, sizeof(*so)); + so->so_type = type; + so->so_proto = prp; + error = + (*prp->pr_usrreq)(so, PRU_ATTACH, + (struct mbuf *)0, + (struct mbuf *)proto, + (struct mbuf *)0); + if (error) { + so->so_state |= SS_NOFDREF; + sofree(so); + return (error); + } + *aso = so; + OS_DbgPrint(OSK_MAX_TRACE,("Returning Socket %x\n", so)); + return STATUS_SUCCESS; +#endif +} + +static int +getsockaddr(namp, uaddr, len) +/* [<][>][^][v][top][bottom][index][help] */ + struct sockaddr **namp; +caddr_t uaddr; +size_t len; +{ + struct sockaddr *sa; + int error; + + if (len > SOCK_MAXADDRLEN) + return ENAMETOOLONG; + MALLOC(sa, struct sockaddr *, len, M_SONAME, M_WAITOK); + error = copyin(uaddr, sa, len); + if (error) { + FREE(sa, M_SONAME); + } else { + *namp = sa; + } + return error; +} + +NTSTATUS OskitTCPConnect( PVOID socket, PVOID connection, + PVOID nam, OSK_UINT namelen ) { + struct socket *so = socket; + struct connect_args _uap = { + 0, nam, namelen + }, *uap = &_uap; + int error = EFAULT, s; + struct mbuf sabuf = { 0 }; + struct sockaddr addr; + + OS_DbgPrint(OSK_MID_TRACE,("Called, socket = %08x\n", socket)); + + so->so_connection = connection; + + if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) { + error = EALREADY; + goto done; + } + + OS_DbgPrint(OSK_MIN_TRACE,("Nam: %x\n", nam)); + if( nam ) + addr = *((struct sockaddr *)nam); + + sabuf.m_data = (void *)&addr; + sabuf.m_len = sizeof(addr); + + addr.sa_family = addr.sa_len; + addr.sa_len = sizeof(struct sockaddr); + + error = soconnect(so, &sabuf); + + if (error) + goto bad; + + if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) { + error = EINPROGRESS; + 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; + + if (error == ERESTART) + error = EINTR; + +done: + OS_DbgPrint(OSK_MID_TRACE,("Ending: %08x\n", error)); + return (error); +} + +DWORD OskitTCPClose( VOID *socket ) { +} + +DWORD OskitTCPSend( VOID *socket, OSK_PCHAR Data, OSK_UINT Len, int flags ) { + OskitDumpBuffer( Data, Len ); + struct mbuf mb; + mb.m_data = Data; + mb.m_len = Len; + return sosend( socket, NULL, NULL, (struct mbuf *)&mb, NULL, 0 ); +} + +void OskitTCPReceive( VOID *socket, PVOID AddrOut, + OSK_PCHAR Data, OSK_UINT Len, OSK_UINT *OutLen ) { +} + +VOID *OskitTCPAccept( VOID *socket, PVOID AddrOut ) { +} + +void OskitTCPReceiveDatagram( OSK_PCHAR Data, OSK_UINT Len, + OSK_UINT IpHeaderLen ) { + struct mbuf *Ip = m_get(M_DONTWAIT, MT_DATA); + char *NewData = malloc( Len ); + + OS_DbgPrint(OSK_MAX_TRACE, ("OskitTCPReceiveDatagram: %d Bytes\n", Len)); + + OskitDumpBuffer( Data, Len ); + + memset( Ip, 0, sizeof( *Ip ) ); + Ip->m_len = Len; + Ip->m_data = NewData; + memcpy( Ip->m_data, Data, Len ); + + tcp_input(Ip, IpHeaderLen); + + /* The buffer Ip is freed by tcp_input */ +} + +void OskitTCPBind( VOID *socket, PVOID name ) { +} + +void OskitTCPListen( VOID *socket, int backlog ) { +} + +void OskitTCPSetAddress( VOID *socket, + ULONG LocalAddress, + USHORT LocalPort, + ULONG RemoteAddress, + USHORT RemotePort ) { + struct socket *so = socket; + struct inpcb *inp = so->so_pcb; + inp->inp_laddr.s_addr = LocalAddress; + inp->inp_lport = LocalPort; + inp->inp_faddr.s_addr = RemoteAddress; + inp->inp_fport = RemotePort; + DbgPrint("OSKIT: SET ADDR %x:%x -> %x:%x\n", + LocalAddress, LocalPort, + RemoteAddress, RemotePort); +} + +void OskitTCPGetAddress( VOID *socket, + PULONG LocalAddress, + PUSHORT LocalPort, + PULONG RemoteAddress, + PUSHORT RemotePort ) { + struct socket *so = socket; + struct inpcb *inp = so ? so->so_pcb : 0; + if( inp ) { + *LocalAddress = inp->inp_laddr.s_addr; + *LocalPort = inp->inp_lport; + *RemoteAddress = inp->inp_faddr.s_addr; + *RemotePort = inp->inp_fport; + DbgPrint("OSKIT: GET ADDR %x:%x -> %x:%x\n", + *LocalAddress, *LocalPort, + *RemoteAddress, *RemotePort); + } +} + +void oskittcp_die( const char *file, int line ) { + DbgPrint("\n\n*** OSKITTCP: Panic Called at %s:%d ***\n", file, line); + KeBugCheck(0); +} diff --git a/reactos/lib/oskittcp/oskittcp/ip_input.c b/reactos/lib/oskittcp/oskittcp/ip_input.c new file mode 100644 index 00000000000..d816fe69725 --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/ip_input.c @@ -0,0 +1,190 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ip_input.c 8.2 (Berkeley) 1/4/94 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +u_char inetctlerrmap[PRC_NCMDS] = { + 0, 0, 0, 0, + 0, EMSGSIZE, EHOSTDOWN, EHOSTUNREACH, + EHOSTUNREACH, EHOSTUNREACH, ECONNREFUSED, ECONNREFUSED, + EMSGSIZE, EHOSTUNREACH, 0, 0, + 0, 0, 0, 0, + ENOPROTOOPT +}; + +struct in_ifaddr *in_ifaddr; /* first inet address */ +int ip_defttl = IPDEFTTL; +struct ipstat ipstat; + +/* + * We need to save the IP options in case a protocol wants to respond + * to an incoming packet over the same route if the packet got here + * using IP source routing. This allows connection establishment and + * maintenance when the remote end is on a network that is not known + * to us. + */ +int ip_nhops = 0; +static struct ip_srcrt { + struct in_addr dst; /* final destination */ + char nop; /* one NOP to align */ + char srcopt[IPOPT_OFFSET + 1]; /* OPTVAL, OLEN and OFFSET */ + struct in_addr route[MAX_IPOPTLEN/sizeof(struct in_addr)]; +} ip_srcrt; + +/* + * Strip out IP options, at higher + * level protocol in the kernel. + * Second argument is buffer to which options + * will be moved, and return value is their length. + * XXX should be deleted; last arg currently ignored. + */ +void +ip_stripoptions(m, mopt) + register struct mbuf *m; + struct mbuf *mopt; +{ + register int i; + struct ip *ip = mtod(m, struct ip *); + register caddr_t opts; + int olen; + + olen = (ip->ip_hl<<2) - sizeof (struct ip); + opts = (caddr_t)(ip + 1); + i = m->m_len - (sizeof (struct ip) + olen); + bcopy(opts + olen, opts, (unsigned)i); + m->m_len -= olen; + if (m->m_flags & M_PKTHDR) + m->m_pkthdr.len -= olen; + ip->ip_hl = sizeof(struct ip) >> 2; +} + +/* + * Retrieve incoming source route for use in replies, + * in the same form used by setsockopt. + * The first hop is placed before the options, will be removed later. + */ +struct mbuf * +ip_srcroute() +{ + register struct in_addr *p, *q; + register struct mbuf *m; + + if (ip_nhops == 0) + return ((struct mbuf *)0); + m = m_get(M_DONTWAIT, MT_SOOPTS); + if (m == 0) + return ((struct mbuf *)0); + +#define OPTSIZ (sizeof(ip_srcrt.nop) + sizeof(ip_srcrt.srcopt)) + + /* length is (nhops+1)*sizeof(addr) + sizeof(nop + srcrt header) */ + m->m_len = ip_nhops * sizeof(struct in_addr) + sizeof(struct in_addr) + + OPTSIZ; +#ifdef DIAGNOSTIC + if (ipprintfs) + printf("ip_srcroute: nhops %d mlen %d", ip_nhops, m->m_len); +#endif + + /* + * First save first hop for return route + */ + p = &ip_srcrt.route[ip_nhops - 1]; + *(mtod(m, struct in_addr *)) = *p--; +#ifdef DIAGNOSTIC + if (ipprintfs) + printf(" hops %lx", ntohl(mtod(m, struct in_addr *)->s_addr)); +#endif + + /* + * Copy option fields and padding (nop) to mbuf. + */ + ip_srcrt.nop = IPOPT_NOP; + ip_srcrt.srcopt[IPOPT_OFFSET] = IPOPT_MINOFF; + (void)memcpy(mtod(m, caddr_t) + sizeof(struct in_addr), + &ip_srcrt.nop, OPTSIZ); + q = (struct in_addr *)(mtod(m, caddr_t) + + sizeof(struct in_addr) + OPTSIZ); +#undef OPTSIZ + /* + * Record return path as an IP source route, + * reversing the path (pointers are now aligned). + */ + while (p >= ip_srcrt.route) { +#ifdef DIAGNOSTIC + if (ipprintfs) + printf(" %lx", ntohl(q->s_addr)); +#endif + *q++ = *p--; + } + /* + * Last hop goes to final destination. + */ + *q = ip_srcrt.dst; +#ifdef DIAGNOSTIC + if (ipprintfs) + printf(" %lx\n", ntohl(q->s_addr)); +#endif + return (m); +} diff --git a/reactos/lib/oskittcp/oskittcp/ip_output.c b/reactos/lib/oskittcp/oskittcp/ip_output.c new file mode 100644 index 00000000000..4a00269f56c --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/ip_output.c @@ -0,0 +1,300 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ip_output.c 8.3 (Berkeley) 1/21/94 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#ifdef vax +#include +#endif +#include + +u_short ip_id; + +/* + * Discard the IP multicast options. + */ +void +ip_freemoptions(imo) + register struct ip_moptions *imo; +{ + register int i; + + if (imo != NULL) { + for (i = 0; i < imo->imo_num_memberships; ++i) + in_delmulti(imo->imo_membership[i]); + free(imo, M_IPMOPTS); + } +} + +/* + * IP output. The packet in mbuf chain m contains a skeletal IP + * header (with len, off, ttl, proto, tos, src, dst). + * The mbuf chain containing the packet will be freed. + * The mbuf opt, if present, will not be freed. + */ +int +ip_output(so, m0, opt, ro, flags, imo) + struct socket *so; + struct mbuf *m0; + struct mbuf *opt; + struct route *ro; + int flags; + struct ip_moptions *imo; +{ + register struct mbuf *m = m0; + int error = ENETDOWN; + /* + * It might seem obvious at first glance that one could easily + * make a one-behind cache out of this by simply making `iproute' + * static and eliminating the bzero() below. However, this turns + * out not to work, for two reasons: + * + * 1) This routine needs to be reentrant. It can be called + * recursively from encapsulating network interfaces, and it + * is always called recursively from ip_mforward(). + * + * 2) You turn out not to gain much. There is already a one- + * behind cache implemented for the specific case of forwarding, + * and sends on a connected socket will use a route associated + * with the PCB. The only cases left are sends on unconnected + * and raw sockets, and if these cases are really significant, + * something is seriously wrong. + */ + ipstat.ips_localout++; + + /* + * If this is the case, we probably don't want to allocate + * a protocol-cloned route since we didn't get one from the + * ULP. This lets TCP do its thing, while not burdening + * forwarding or ICMP with the overhead of cloning a route. + * Of course, we still want to do any cloning requested by + * the link layer, as this is probably required in all cases + * for correct operation (as it is for ARP). + */ + + if( OtcpEvent.PacketSend ) { + error = OtcpEvent.PacketSend + ( OtcpEvent.ClientData, + so, + so ? so->so_connection : 0, + m->m_data + IPHDR_SIZE, m->m_len - IPHDR_SIZE ); + } + + return (error); +} + +/* + * Copy options from ip to jp, + * omitting those not copied during fragmentation. + */ +int +ip_optcopy(ip, jp) + struct ip *ip, *jp; +{ + register u_char *cp, *dp; + int opt, optlen, cnt; + + cp = (u_char *)(ip + 1); + dp = (u_char *)(jp + 1); + cnt = (ip->ip_hl << 2) - sizeof (struct ip); + for (; cnt > 0; cnt -= optlen, cp += optlen) { + opt = cp[0]; + if (opt == IPOPT_EOL) + break; + if (opt == IPOPT_NOP) { + /* Preserve for IP mcast tunnel's LSRR alignment. */ + *dp++ = IPOPT_NOP; + optlen = 1; + continue; + } else + optlen = cp[IPOPT_OLEN]; + /* bogus lengths should have been caught by ip_dooptions */ + if (optlen > cnt) + optlen = cnt; + if (IPOPT_COPIED(opt)) { + (void)memcpy(dp, cp, (unsigned)optlen); + dp += optlen; + } + } + for (optlen = dp - (u_char *)(jp+1); optlen & 0x3; optlen++) + *dp++ = IPOPT_EOL; + return (optlen); +} + +/* + * IP socket option processing. + */ +int +ip_ctloutput(op, so, level, optname, mp) + int op; + struct socket *so; + int level, optname; + struct mbuf **mp; +{ + register struct inpcb *inp = sotoinpcb(so); + register struct mbuf *m = *mp; + register int optval = 0; + int error = 0; + + if (level != IPPROTO_IP) { + error = EINVAL; + if (op == PRCO_SETOPT && *mp) + (void) m_free(*mp); + } else switch (op) { + + case PRCO_SETOPT: + switch (optname) { + case IP_TOS: + case IP_TTL: + case IP_RECVOPTS: + case IP_RECVRETOPTS: + case IP_RECVDSTADDR: + if (m == 0 || m->m_len != sizeof(int)) + error = EINVAL; + else { + optval = *mtod(m, int *); + switch (optname) { + + case IP_TOS: + inp->inp_ip.ip_tos = optval; + break; + + case IP_TTL: + inp->inp_ip.ip_ttl = optval; + break; +#define OPTSET(bit) \ + if (optval) \ + inp->inp_flags |= bit; \ + else \ + inp->inp_flags &= ~bit; + + case IP_RECVOPTS: + OPTSET(INP_RECVOPTS); + break; + + case IP_RECVRETOPTS: + OPTSET(INP_RECVRETOPTS); + break; + + case IP_RECVDSTADDR: + OPTSET(INP_RECVDSTADDR); + break; + } + } + break; +#undef OPTSET + default: + error = ENOPROTOOPT; + break; + } + if (m) + (void)m_free(m); + break; + + case PRCO_GETOPT: + switch (optname) { + case IP_OPTIONS: + case IP_RETOPTS: + *mp = m = m_get(M_WAIT, MT_SOOPTS); + if (inp->inp_options) { + m->m_len = inp->inp_options->m_len; + (void)memcpy(mtod(m, void *), + mtod(inp->inp_options, void *), (unsigned)m->m_len); + } else + m->m_len = 0; + break; + + case IP_TOS: + case IP_TTL: + case IP_RECVOPTS: + case IP_RECVRETOPTS: + case IP_RECVDSTADDR: + *mp = m = m_get(M_WAIT, MT_SOOPTS); + m->m_len = sizeof(int); + switch (optname) { + + case IP_TOS: + optval = inp->inp_ip.ip_tos; + break; + + case IP_TTL: + optval = inp->inp_ip.ip_ttl; + break; + +#define OPTBIT(bit) (inp->inp_flags & bit ? 1 : 0) + + case IP_RECVOPTS: + optval = OPTBIT(INP_RECVOPTS); + break; + + case IP_RECVRETOPTS: + optval = OPTBIT(INP_RECVRETOPTS); + break; + + case IP_RECVDSTADDR: + optval = OPTBIT(INP_RECVDSTADDR); + break; + } + *mtod(m, int *) = optval; + break; + + default: + error = ENOPROTOOPT; + break; + } + break; + } + return (error); +} diff --git a/reactos/lib/oskittcp/oskittcp/kern_clock.c b/reactos/lib/oskittcp/oskittcp/kern_clock.c new file mode 100644 index 00000000000..c53581fd5fe --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/kern_clock.c @@ -0,0 +1,361 @@ +/* + * Copyright (c) 1997-1998 University of Utah and the Flux Group. + * All rights reserved. + * + * This file is part of the Flux OSKit. The OSKit is free software, also known + * as "open source;" you can redistribute it and/or modify it under the terms + * of the GNU General Public License (GPL), version 2, as published by the Free + * Software Foundation (FSF). To explore alternate licensing terms, contact + * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. + * + * The OSKit 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 GPL for more details. You should have + * received a copy of the GPL along with the OSKit; see the file COPYING. If + * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. + */ +/* + * I am having no mercy with this file. + * I ripped out everything I didn't need + */ +/*- + * Copyright (c) 1982, 1986, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)kern_clock.c 8.5 (Berkeley) 1/21/94 + * $\Id: kern_clock.c,v 1.26 1996/07/30 16:59:22 bde Exp $ + */ + +/* Portions of this software are covered by the following: */ +/****************************************************************************** + * * + * Copyright (c) David L. Mills 1993, 1994 * + * * + * Permission to use, copy, modify, and distribute this software and its * + * documentation for any purpose and without fee is hereby granted, provided * + * that the above copyright notice appears in all copies and that both the * + * copyright notice and this permission notice appear in supporting * + * documentation, and that the name University of Delaware not be used in * + * advertising or publicity pertaining to distribution of the software * + * without specific, written prior permission. The University of Delaware * + * makes no representations about the suitability this software for any * + * purpose. It is provided "as is" without express or implied warranty. * + * * + *****************************************************************************/ + +#include +#include +#include +#include +#include + +/* Exported to machdep.c. */ +struct callout *callfree, *callout; + +static struct callout calltodo; + +long tk_cancc; +long tk_nin; +long tk_nout; +long tk_rawcc; + +/* + * Clock handling routines. + * + * This code is written to operate with two timers that run independently of + * each other. The main clock, running hz times per second, is used to keep + * track of real time. The second timer handles kernel and user profiling, + * and does resource use estimation. If the second timer is programmable, + * it is randomized to avoid aliasing between the two clocks. For example, + * the randomization prevents an adversary from always giving up the cpu + * just before its quantum expires. Otherwise, it would never accumulate + * cpu ticks. The mean frequency of the second timer is stathz. + * + * If no second timer exists, stathz will be zero; in this case we drive + * profiling and statistics off the main clock. This WILL NOT be accurate; + * do not do it unless absolutely necessary. + * + * The statistics clock may (or may not) be run at a higher rate while + * profiling. This profile clock runs at profhz. We require that profhz + * be an integral multiple of stathz. + * + * If the statistics clock is running fast, it must be divided by the ratio + * profhz/stathz for statistics. (For profiling, every tick counts.) + */ + +/* + * TODO: + * allocate more timeout table slots when table overflows. + */ + +/* + * Bump a timeval by a small number of usec's. + */ +#define BUMPTIME(t, usec) { \ + register volatile struct timeval *tp = (t); \ + register long us; \ + \ + tp->tv_usec = us = tp->tv_usec + (usec); \ + if (us >= 1000000) { \ + tp->tv_usec = us - 1000000; \ + tp->tv_sec++; \ + } \ +} + +int ticks; +volatile struct timeval time; +volatile struct timeval mono_time; + +/* + * The real-time timer, interrupting hz times per second. + */ +void bsd_hardclock(void) +{ + register struct callout *p1; + register int needsoft; + unsigned cpl; + int s; + + save_cpl(&cpl); + splhigh(); + + /* + * Update real-time timeout queue. + * At front of queue are some number of events which are ``due''. + * The time to these is <= 0 and if negative represents the + * number of ticks which have passed since it was supposed to happen. + * The rest of the q elements (times > 0) are events yet to happen, + * where the time for each is given as a delta from the previous. + * Decrementing just the first of these serves to decrement the time + * to all events. + */ + needsoft = 0; + for (p1 = calltodo.c_next; p1 != NULL; p1 = p1->c_next) { + if (--p1->c_time > 0) + break; + needsoft = 1; + if (p1->c_time == 0) + break; + } + + /* + * Increment the time-of-day. + */ + ticks++; + BUMPTIME(&mono_time, tick); + BUMPTIME(&time, tick); + + /* + * At this point, we might need a soft interrupt. We say, what the + * heck, let's do the work now. Reduce priority level to softclock + * first, though. The alternative (postponing it) would be called + * 'setsoftclock' + */ + if (needsoft) { + (void)splsoftclock(); + softclock(); + } + + restore_cpl(cpl); +} + +/* + * Software (low priority) clock interrupt. + * Run periodic events from timeout queue. + */ +/*ARGSUSED*/ +void +softclock() +{ + register struct callout *c; + register void *arg; + register void (*func) __P((void *)); + register int s; + + s = splhigh(); + while ((c = calltodo.c_next) != NULL && c->c_time <= 0) { + func = c->c_func; + arg = c->c_arg; + calltodo.c_next = c->c_next; + c->c_next = callfree; + callfree = c; + splx(s); + (*func)(arg); + (void) splhigh(); + } + splx(s); +} + +/* + * timeout -- + * Execute a function after a specified length of time. + * + * untimeout -- + * Cancel previous timeout function call. + * + * See AT&T BCI Driver Reference Manual for specification. This + * implementation differs from that one in that no identification + * value is returned from timeout, rather, the original arguments + * to timeout are used to identify entries for untimeout. + */ +void +timeout(ftn, arg, ticks) + timeout_t ftn; + void *arg; + register int ticks; +{ + register struct callout *new, *p, *t; + register int s; + + if (ticks <= 0) + ticks = 1; + + /* Lock out the clock. */ + s = splhigh(); + + /* Fill in the next free callout structure. */ + if (callfree == NULL) + panic("timeout table full"); + new = callfree; + callfree = new->c_next; + new->c_arg = arg; + new->c_func = ftn; + + /* + * The time for each event is stored as a difference from the time + * of the previous event on the queue. Walk the queue, correcting + * the ticks argument for queue entries passed. Correct the ticks + * value for the queue entry immediately after the insertion point + * as well. Watch out for negative c_time values; these represent + * overdue events. + */ + for (p = &calltodo; + (t = p->c_next) != NULL && ticks > t->c_time; p = t) + if (t->c_time > 0) + ticks -= t->c_time; + new->c_time = ticks; + if (t != NULL) + t->c_time -= ticks; + + /* Insert the new entry into the queue. */ + p->c_next = new; + new->c_next = t; + splx(s); +} + +void +untimeout(ftn, arg) + timeout_t ftn; + void *arg; +{ + register struct callout *p, *t; + register int s; + + s = splhigh(); + for (p = &calltodo; (t = p->c_next) != NULL; p = t) + if (t->c_func == ftn && t->c_arg == arg) { + /* Increment next entry's tick count. */ + if (t->c_next && t->c_time > 0) + t->c_next->c_time += t->c_time; + + /* Move entry from callout queue to callfree queue. */ + p->c_next = t->c_next; + t->c_next = callfree; + callfree = t; + break; + } + splx(s); +} + +/* + * Compute number of hz until specified time. Used to + * compute third argument to timeout() from an absolute time. + */ +int +hzto(tv) + struct timeval *tv; +{ + register unsigned long ticks; + register long sec, usec; + int s; + + /* + * If the number of usecs in the whole seconds part of the time + * difference fits in a long, then the total number of usecs will + * fit in an unsigned long. Compute the total and convert it to + * ticks, rounding up and adding 1 to allow for the current tick + * to expire. Rounding also depends on unsigned long arithmetic + * to avoid overflow. + * + * Otherwise, if the number of ticks in the whole seconds part of + * the time difference fits in a long, then convert the parts to + * ticks separately and add, using similar rounding methods and + * overflow avoidance. This method would work in the previous + * case but it is slightly slower and assumes that hz is integral. + * + * Otherwise, round the time difference down to the maximum + * representable value. + * + * If ints have 32 bits, then the maximum value for any timeout in + * 10ms ticks is 248 days. + */ + s = splclock(); + sec = tv->tv_sec - time.tv_sec; + usec = tv->tv_usec - time.tv_usec; + splx(s); + if (usec < 0) { + sec--; + usec += 1000000; + } + if (sec < 0) { +#ifdef DIAGNOSTIC + printf("hzto: negative time difference %ld sec %ld usec\n", + sec, usec); +#endif + ticks = 1; + } else if (sec <= LONG_MAX / 1000000) + ticks = (sec * 1000000 + (unsigned long)usec + (tick - 1)) + / tick + 1; + else if (sec <= LONG_MAX / hz) + ticks = sec * hz + + ((unsigned long)usec + (tick - 1)) / tick + 1; + else + ticks = LONG_MAX; + if (ticks > INT_MAX) + ticks = INT_MAX; + return (ticks); +} + diff --git a/reactos/lib/oskittcp/oskittcp/kern_subr.c b/reactos/lib/oskittcp/oskittcp/kern_subr.c new file mode 100644 index 00000000000..a7daef481f3 --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/kern_subr.c @@ -0,0 +1,252 @@ +/* + * Copyright (c) 1982, 1986, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)kern_subr.c 8.3 (Berkeley) 1/21/94 + */ + +#include +#include +#include +#include +#include +#include + +int +uiomove(cp, n, uio) + register caddr_t cp; + register int n; + register struct uio *uio; +{ + register struct iovec *iov; + u_int cnt; + int error; + +#ifdef DIAGNOSTIC + if (uio->uio_rw != UIO_READ && uio->uio_rw != UIO_WRITE) + panic("uiomove: mode"); + if (uio->uio_segflg == UIO_USERSPACE && uio->uio_procp != curproc) + panic("uiomove proc"); +#endif + while (n > 0 && uio->uio_resid) { + iov = uio->uio_iov; + cnt = iov->iov_len; + if (cnt == 0) { + uio->uio_iov++; + uio->uio_iovcnt--; + continue; + } + if (cnt > n) + cnt = n; + + switch (uio->uio_segflg) { + + case UIO_USERSPACE: + case UIO_USERISPACE: + if (uio->uio_rw == UIO_READ) + error = copyout(cp, iov->iov_base, cnt); + else + error = copyin(iov->iov_base, cp, cnt); + if (error) + return (error); + break; + + case UIO_SYSSPACE: + if (uio->uio_rw == UIO_READ) + bcopy((caddr_t)cp, iov->iov_base, cnt); + else + bcopy(iov->iov_base, (caddr_t)cp, cnt); + break; + case UIO_NOCOPY: + break; + } + iov->iov_base += cnt; + iov->iov_len -= cnt; + uio->uio_resid -= cnt; + uio->uio_offset += cnt; + cp += cnt; + n -= cnt; + } + return (0); +} + +/* + * Give next character to user as result of read. + */ +int +ureadc(c, uio) + register int c; + register struct uio *uio; +{ + register struct iovec *iov; + +again: + if (uio->uio_iovcnt == 0 || uio->uio_resid == 0) + panic("ureadc"); + iov = uio->uio_iov; + if (iov->iov_len == 0) { + uio->uio_iovcnt--; + uio->uio_iov++; + goto again; + } + switch (uio->uio_segflg) { + + case UIO_USERSPACE: + if (subyte(iov->iov_base, c) < 0) + return (EFAULT); + break; + + case UIO_SYSSPACE: + *iov->iov_base = c; + break; + + case UIO_USERISPACE: + if (suibyte(iov->iov_base, c) < 0) + return (EFAULT); + break; + case UIO_NOCOPY: + break; + } + iov->iov_base++; + iov->iov_len--; + uio->uio_resid--; + uio->uio_offset++; + return (0); +} + +#ifdef vax /* unused except by ct.c, other oddities XXX */ +/* + * Get next character written in by user from uio. + */ +int +uwritec(uio) + struct uio *uio; +{ + register struct iovec *iov; + register int c; + + if (uio->uio_resid <= 0) + return (-1); +again: + if (uio->uio_iovcnt <= 0) + panic("uwritec"); + iov = uio->uio_iov; + if (iov->iov_len == 0) { + uio->uio_iov++; + if (--uio->uio_iovcnt == 0) + return (-1); + goto again; + } + switch (uio->uio_segflg) { + + case UIO_USERSPACE: + c = fubyte(iov->iov_base); + break; + + case UIO_SYSSPACE: + c = *(u_char *) iov->iov_base; + break; + + case UIO_USERISPACE: + c = fuibyte(iov->iov_base); + break; + } + if (c < 0) + return (-1); + iov->iov_base++; + iov->iov_len--; + uio->uio_resid--; + uio->uio_offset++; + return (c); +} +#endif /* vax */ + +/* + * General routine to allocate a hash table. + */ +void * +hashinit(elements, type, hashmask) + int elements, type; + u_long *hashmask; +{ + long hashsize; + LIST_HEAD(generic, generic) *hashtbl; + int i; + + if (elements <= 0) + panic("hashinit: bad elements"); + for (hashsize = 1; hashsize <= elements; hashsize <<= 1) + continue; + hashsize >>= 1; + hashtbl = malloc((u_long)hashsize * sizeof(*hashtbl), type, M_WAITOK); + for (i = 0; i < hashsize; i++) + LIST_INIT(&hashtbl[i]); + *hashmask = hashsize - 1; + return (hashtbl); +} + +#define NPRIMES 27 +static int primes[] = { 1, 13, 31, 61, 127, 251, 509, 761, 1021, 1531, 2039, + 2557, 3067, 3583, 4093, 4603, 5119, 5623, 6143, 6653, + 7159, 7673, 8191, 12281, 16381, 24571, 32749 }; + +/* + * General routine to allocate a prime number sized hash table. + */ +void * +phashinit(elements, type, nentries) + int elements, type; + u_long *nentries; +{ + long hashsize; + LIST_HEAD(generic, generic) *hashtbl; + int i; + + if (elements <= 0) + panic("phashinit: bad elements"); + for (i = 1, hashsize = primes[1]; hashsize <= elements;) { + i++; + if (i == NPRIMES) + break; + hashsize = primes[i]; + } + hashsize = primes[i - 1]; + hashtbl = malloc((u_long)hashsize * sizeof(*hashtbl), type, M_WAITOK); + for (i = 0; i < hashsize; i++) + LIST_INIT(&hashtbl[i]); + *nentries = hashsize; + return (hashtbl); +} diff --git a/reactos/lib/oskittcp/oskittcp/malloc.c b/reactos/lib/oskittcp/oskittcp/malloc.c new file mode 100644 index 00000000000..2d3fb43500a --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/malloc.c @@ -0,0 +1,16 @@ +#include +#include +#include +#include + +void *fbsd_malloc( size_t size, char *file, int line, ... ) { + void *v; + v = ExAllocatePool( NonPagedPool, size ); + if( v ) TrackWithTag(FBSD_MALLOC,v,file,line); + return v; +} + +void fbsd_free( void *data, char *file, int line, ... ) { + UntrackFL(file,line,data); + ExFreePool( data ); +} diff --git a/reactos/lib/oskittcp/oskittcp/param.c b/reactos/lib/oskittcp/oskittcp/param.c new file mode 100644 index 00000000000..871441fa780 --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/param.c @@ -0,0 +1,24 @@ +/* + * Copyright (c) 1997-1998 University of Utah and the Flux Group. + * All rights reserved. + * + * This file is part of the Flux OSKit. The OSKit is free software, also known + * as "open source;" you can redistribute it and/or modify it under the terms + * of the GNU General Public License (GPL), version 2, as published by the Free + * Software Foundation (FSF). To explore alternate licensing terms, contact + * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. + * + * The OSKit 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 GPL for more details. You should have + * received a copy of the GPL along with the OSKit; see the file COPYING. If + * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. + */ + +#define HZ 100 +#define MAXUSERS 64 + +int hz = HZ; +int tick = 1000000 / HZ; +int nmbclusters = 512 + MAXUSERS * 16; + diff --git a/reactos/lib/oskittcp/oskittcp/radix.c b/reactos/lib/oskittcp/oskittcp/radix.c new file mode 100644 index 00000000000..a23552cc517 --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/radix.c @@ -0,0 +1,1006 @@ +/* + * Copyright (c) 1988, 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)radix.c 8.4 (Berkeley) 11/2/94 + */ + +/* + * Routines to build and maintain radix trees for routing lookups. + */ +#ifndef _RADIX_H_ +#include +#ifdef KERNEL +#include +#include +#define M_DONTWAIT M_NOWAIT +#include +#else +#include +#endif +#include +#include +#endif +#include + +int max_keylen; +struct radix_mask *rn_mkfreelist; +struct radix_node_head *mask_rnhead; +static char *addmask_key; +static char normal_chars[] = {0, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, -1}; +static char *rn_zeros, *rn_ones; + +#define rn_masktop (mask_rnhead->rnh_treetop) +#undef Bcmp +#define Bcmp(a, b, l) (l == 0 ? 0 : bcmp((caddr_t)(a), (caddr_t)(b), (u_long)l)) +/* + * The data structure for the keys is a radix tree with one way + * branching removed. The index rn_b at an internal node n represents a bit + * position to be tested. The tree is arranged so that all descendants + * of a node n have keys whose bits all agree up to position rn_b - 1. + * (We say the index of n is rn_b.) + * + * There is at least one descendant which has a one bit at position rn_b, + * and at least one with a zero there. + * + * A route is determined by a pair of key and mask. We require that the + * bit-wise logical and of the key and mask to be the key. + * We define the index of a route to associated with the mask to be + * the first bit number in the mask where 0 occurs (with bit number 0 + * representing the highest order bit). + * + * We say a mask is normal if every bit is 0, past the index of the mask. + * If a node n has a descendant (k, m) with index(m) == index(n) == rn_b, + * and m is a normal mask, then the route applies to every descendant of n. + * If the index(m) < rn_b, this implies the trailing last few bits of k + * before bit b are all 0, (and hence consequently true of every descendant + * of n), so the route applies to all descendants of the node as well. + * + * Similar logic shows that a non-normal mask m such that + * index(m) <= index(n) could potentially apply to many children of n. + * Thus, for each non-host route, we attach its mask to a list at an internal + * node as high in the tree as we can go. + * + * The present version of the code makes use of normal routes in short- + * circuiting an explict mask and compare operation when testing whether + * a key satisfies a normal route, and also in remembering the unique leaf + * that governs a subtree. + */ + +struct radix_node * +rn_search(v_arg, head) + void *v_arg; + struct radix_node *head; +{ + register struct radix_node *x; + register caddr_t v; + + for (x = head, v = v_arg; x->rn_b >= 0;) { + if (x->rn_bmask & v[x->rn_off]) + x = x->rn_r; + else + x = x->rn_l; + } + return (x); +}; + +struct radix_node * +rn_search_m(v_arg, head, m_arg) + struct radix_node *head; + void *v_arg, *m_arg; +{ + register struct radix_node *x; + register caddr_t v = v_arg, m = m_arg; + + for (x = head; x->rn_b >= 0;) { + if ((x->rn_bmask & m[x->rn_off]) && + (x->rn_bmask & v[x->rn_off])) + x = x->rn_r; + else + x = x->rn_l; + } + return x; +}; + +int +rn_refines(m_arg, n_arg) + void *m_arg, *n_arg; +{ + register caddr_t m = m_arg, n = n_arg; + register caddr_t lim, lim2 = lim = n + *(u_char *)n; + int longer = (*(u_char *)n++) - (int)(*(u_char *)m++); + int masks_are_equal = 1; + + if (longer > 0) + lim -= longer; + while (n < lim) { + if (*n & ~(*m)) + return 0; + if (*n++ != *m++) + masks_are_equal = 0; + } + while (n < lim2) + if (*n++) + return 0; + if (masks_are_equal && (longer < 0)) + for (lim2 = m - longer; m < lim2; ) + if (*m++) + return 1; + return (!masks_are_equal); +} + +struct radix_node * +rn_lookup(v_arg, m_arg, head) + void *v_arg, *m_arg; + struct radix_node_head *head; +{ + register struct radix_node *x; + caddr_t netmask = 0; + + if (m_arg) { + if ((x = rn_addmask(m_arg, 1, head->rnh_treetop->rn_off)) == 0) + return (0); + netmask = x->rn_key; + } + x = rn_match(v_arg, head); + if (x && netmask) { + while (x && x->rn_mask != netmask) + x = x->rn_dupedkey; + } + return x; +} + +static int +rn_satsifies_leaf(trial, leaf, skip) + char *trial; + register struct radix_node *leaf; + int skip; +{ + register char *cp = trial, *cp2 = leaf->rn_key, *cp3 = leaf->rn_mask; + char *cplim; + int length = min(*(u_char *)cp, *(u_char *)cp2); + + if (cp3 == 0) + cp3 = rn_ones; + else + length = min(length, *(u_char *)cp3); + cplim = cp + length; cp3 += skip; cp2 += skip; + for (cp += skip; cp < cplim; cp++, cp2++, cp3++) + if ((*cp ^ *cp2) & *cp3) + return 0; + return 1; +} + +struct radix_node * +rn_match(v_arg, head) + void *v_arg; + struct radix_node_head *head; +{ + caddr_t v = v_arg; + register struct radix_node *t = head->rnh_treetop, *x; + register caddr_t cp = v, cp2; + caddr_t cplim; + struct radix_node *saved_t, *top = t; + int off = t->rn_off, vlen = *(u_char *)cp, matched_off; + register int test, b, rn_b; + + /* + * Open code rn_search(v, top) to avoid overhead of extra + * subroutine call. + */ + for (; t->rn_b >= 0; ) { + if (t->rn_bmask & cp[t->rn_off]) + t = t->rn_r; + else + t = t->rn_l; + } + /* + * See if we match exactly as a host destination + * or at least learn how many bits match, for normal mask finesse. + * + * It doesn't hurt us to limit how many bytes to check + * to the length of the mask, since if it matches we had a genuine + * match and the leaf we have is the most specific one anyway; + * if it didn't match with a shorter length it would fail + * with a long one. This wins big for class B&C netmasks which + * are probably the most common case... + */ + if (t->rn_mask) + vlen = *(u_char *)t->rn_mask; + cp += off; cp2 = t->rn_key + off; cplim = v + vlen; + for (; cp < cplim; cp++, cp2++) + if (*cp != *cp2) + goto on1; + /* + * This extra grot is in case we are explicitly asked + * to look up the default. Ugh! + */ + if ((t->rn_flags & RNF_ROOT) && t->rn_dupedkey) + t = t->rn_dupedkey; + return t; +on1: + test = (*cp ^ *cp2) & 0xff; /* find first bit that differs */ + for (b = 7; (test >>= 1) > 0;) + b--; + matched_off = cp - v; + b += matched_off << 3; + rn_b = -1 - b; + /* + * If there is a host route in a duped-key chain, it will be first. + */ + if ((saved_t = t)->rn_mask == 0) + t = t->rn_dupedkey; + for (; t; t = t->rn_dupedkey) + /* + * Even if we don't match exactly as a host, + * we may match if the leaf we wound up at is + * a route to a net. + */ + if (t->rn_flags & RNF_NORMAL) { + if (rn_b <= t->rn_b) + return t; + } else if (rn_satsifies_leaf(v, t, matched_off)) + return t; + t = saved_t; + /* start searching up the tree */ + do { + register struct radix_mask *m; + t = t->rn_p; + m = t->rn_mklist; + if (m) { + /* + * If non-contiguous masks ever become important + * we can restore the masking and open coding of + * the search and satisfaction test and put the + * calculation of "off" back before the "do". + */ + do { + if (m->rm_flags & RNF_NORMAL) { + if (rn_b <= m->rm_b) + return (m->rm_leaf); + } else { + off = min(t->rn_off, matched_off); + x = rn_search_m(v, t, m->rm_mask); + while (x && x->rn_mask != m->rm_mask) + x = x->rn_dupedkey; + if (x && rn_satsifies_leaf(v, x, off)) + return x; + } + m = m->rm_mklist; + } while (m); + } + } while (t != top); + return 0; +}; + +#ifdef RN_DEBUG +int rn_nodenum; +struct radix_node *rn_clist; +int rn_saveinfo; +int rn_debug = 1; +#endif + +struct radix_node * +rn_newpair(v, b, nodes) + void *v; + int b; + struct radix_node nodes[2]; +{ + register struct radix_node *tt = nodes, *t = tt + 1; + t->rn_b = b; t->rn_bmask = 0x80 >> (b & 7); + t->rn_l = tt; t->rn_off = b >> 3; + tt->rn_b = -1; tt->rn_key = (caddr_t)v; tt->rn_p = t; + tt->rn_flags = t->rn_flags = RNF_ACTIVE; +#ifdef RN_DEBUG + tt->rn_info = rn_nodenum++; t->rn_info = rn_nodenum++; + tt->rn_twin = t; tt->rn_ybro = rn_clist; rn_clist = tt; +#endif + return t; +} + +struct radix_node * +rn_insert(v_arg, head, dupentry, nodes) + void *v_arg; + struct radix_node_head *head; + int *dupentry; + struct radix_node nodes[2]; +{ + caddr_t v = v_arg; + struct radix_node *top = head->rnh_treetop; + int head_off = top->rn_off, vlen = (int)*((u_char *)v); + register struct radix_node *t = rn_search(v_arg, top); + register caddr_t cp = v + head_off; + register int b; + struct radix_node *tt; + /* + * Find first bit at which v and t->rn_key differ + */ + { + register caddr_t cp2 = t->rn_key + head_off; + register int cmp_res; + caddr_t cplim = v + vlen; + + while (cp < cplim) + if (*cp2++ != *cp++) + goto on1; + *dupentry = 1; + return t; +on1: + *dupentry = 0; + cmp_res = (cp[-1] ^ cp2[-1]) & 0xff; + for (b = (cp - v) << 3; cmp_res; b--) + cmp_res >>= 1; + } + { + register struct radix_node *p, *x = top; + cp = v; + do { + p = x; + if (cp[x->rn_off] & x->rn_bmask) + x = x->rn_r; + else x = x->rn_l; + } while (b > (unsigned) x->rn_b); /* x->rn_b < b && x->rn_b >= 0 */ +#ifdef RN_DEBUG + if (rn_debug) + log(LOG_DEBUG, "rn_insert: Going In:\n"), traverse(p); +#endif + t = rn_newpair(v_arg, b, nodes); tt = t->rn_l; + if ((cp[p->rn_off] & p->rn_bmask) == 0) + p->rn_l = t; + else + p->rn_r = t; + x->rn_p = t; t->rn_p = p; /* frees x, p as temp vars below */ + if ((cp[t->rn_off] & t->rn_bmask) == 0) { + t->rn_r = x; + } else { + t->rn_r = tt; t->rn_l = x; + } +#ifdef RN_DEBUG + if (rn_debug) + log(LOG_DEBUG, "rn_insert: Coming Out:\n"), traverse(p); +#endif + } + return (tt); +} + +struct radix_node * +rn_addmask(n_arg, search, skip) + int search, skip; + void *n_arg; +{ + caddr_t netmask = (caddr_t)n_arg; + register struct radix_node *x; + register caddr_t cp, cplim; + register int b = 0, mlen, j; + int maskduplicated, m0, isnormal; + struct radix_node *saved_x; + static int last_zeroed = 0; + + if ((mlen = *(u_char *)netmask) > max_keylen) + mlen = max_keylen; + if (skip == 0) + skip = 1; + if (mlen <= skip) + return (mask_rnhead->rnh_nodes); + if (skip > 1) + Bcopy(rn_ones + 1, addmask_key + 1, skip - 1); + if ((m0 = mlen) > skip) + Bcopy(netmask + skip, addmask_key + skip, mlen - skip); + /* + * Trim trailing zeroes. + */ + for (cp = addmask_key + mlen; (cp > addmask_key) && cp[-1] == 0;) + cp--; + mlen = cp - addmask_key; + if (mlen <= skip) { + if (m0 >= last_zeroed) + last_zeroed = mlen; + return (mask_rnhead->rnh_nodes); + } + if (m0 < last_zeroed) + Bzero(addmask_key + m0, last_zeroed - m0); + *addmask_key = last_zeroed = mlen; + x = rn_search(addmask_key, rn_masktop); + if (Bcmp(addmask_key, x->rn_key, mlen) != 0) + x = 0; + if (x || search) + return (x); + R_Malloc(x, struct radix_node *, max_keylen + 2 * sizeof (*x)); + if ((saved_x = x) == 0) + return (0); + Bzero(x, max_keylen + 2 * sizeof (*x)); + netmask = cp = (caddr_t)(x + 2); + Bcopy(addmask_key, cp, mlen); + x = rn_insert(cp, mask_rnhead, &maskduplicated, x); + if (maskduplicated) { + log(LOG_ERR, "rn_addmask: mask impossibly already in tree"); + Free(saved_x); + return (x); + } + /* + * Calculate index of mask, and check for normalcy. + */ + cplim = netmask + mlen; isnormal = 1; + for (cp = netmask + skip; (cp < cplim) && *(u_char *)cp == 0xff;) + cp++; + if (cp != cplim) { + for (j = 0x80; (j & *cp) != 0; j >>= 1) + b++; + if (*cp != normal_chars[b] || cp != (cplim - 1)) + isnormal = 0; + } + b += (cp - netmask) << 3; + x->rn_b = -1 - b; + if (isnormal) + x->rn_flags |= RNF_NORMAL; + return (x); +} + +static int /* XXX: arbitrary ordering for non-contiguous masks */ +rn_lexobetter(m_arg, n_arg) + void *m_arg, *n_arg; +{ + register u_char *mp = m_arg, *np = n_arg, *lim; + + if (*mp > *np) + return 1; /* not really, but need to check longer one first */ + if (*mp == *np) + for (lim = mp + *mp; mp < lim;) + if (*mp++ > *np++) + return 1; + return 0; +} + +static struct radix_mask * +rn_new_radix_mask(tt, next) + register struct radix_node *tt; + register struct radix_mask *next; +{ + register struct radix_mask *m; + + MKGet(m); + if (m == 0) { + log(LOG_ERR, "Mask for route not entered\n"); + return (0); + } + Bzero(m, sizeof *m); + m->rm_b = tt->rn_b; + m->rm_flags = tt->rn_flags; + if (tt->rn_flags & RNF_NORMAL) + m->rm_leaf = tt; + else + m->rm_mask = tt->rn_mask; + m->rm_mklist = next; + tt->rn_mklist = m; + return m; +} + +struct radix_node * +rn_addroute(v_arg, n_arg, head, treenodes) + void *v_arg, *n_arg; + struct radix_node_head *head; + struct radix_node treenodes[2]; +{ + caddr_t v = (caddr_t)v_arg, netmask = (caddr_t)n_arg; + register struct radix_node *t, *x = 0, *tt; + struct radix_node *saved_tt, *top = head->rnh_treetop; + short b = 0, b_leaf = 0; + int keyduplicated; + caddr_t mmask; + struct radix_mask *m, **mp; + + /* + * In dealing with non-contiguous masks, there may be + * many different routes which have the same mask. + * We will find it useful to have a unique pointer to + * the mask to speed avoiding duplicate references at + * nodes and possibly save time in calculating indices. + */ + if (netmask) { + if ((x = rn_addmask(netmask, 0, top->rn_off)) == 0) + return (0); + b_leaf = x->rn_b; + b = -1 - x->rn_b; + netmask = x->rn_key; + } + /* + * Deal with duplicated keys: attach node to previous instance + */ + saved_tt = tt = rn_insert(v, head, &keyduplicated, treenodes); + if (keyduplicated) { + for (t = tt; tt; t = tt, tt = tt->rn_dupedkey) { + if (tt->rn_mask == netmask) + return (0); + if (netmask == 0 || + (tt->rn_mask && + ((b_leaf < tt->rn_b) || /* index(netmask) > node */ + rn_refines(netmask, tt->rn_mask) || + rn_lexobetter(netmask, tt->rn_mask)))) + break; + } + /* + * If the mask is not duplicated, we wouldn't + * find it among possible duplicate key entries + * anyway, so the above test doesn't hurt. + * + * We sort the masks for a duplicated key the same way as + * in a masklist -- most specific to least specific. + * This may require the unfortunate nuisance of relocating + * the head of the list. + */ + if (tt == saved_tt) { + struct radix_node *xx = x; + /* link in at head of list */ + (tt = treenodes)->rn_dupedkey = t; + tt->rn_flags = t->rn_flags; + tt->rn_p = x = t->rn_p; + t->rn_p = tt; /* parent */ + if (x->rn_l == t) x->rn_l = tt; else x->rn_r = tt; + saved_tt = tt; x = xx; + } else { + (tt = treenodes)->rn_dupedkey = t->rn_dupedkey; + t->rn_dupedkey = tt; + tt->rn_p = t; /* parent */ + if (tt->rn_dupedkey) /* parent */ + tt->rn_dupedkey->rn_p = tt; /* parent */ + } +#ifdef RN_DEBUG + t=tt+1; tt->rn_info = rn_nodenum++; t->rn_info = rn_nodenum++; + tt->rn_twin = t; tt->rn_ybro = rn_clist; rn_clist = tt; +#endif + tt->rn_key = (caddr_t) v; + tt->rn_b = -1; + tt->rn_flags = RNF_ACTIVE; + } + /* + * Put mask in tree. + */ + if (netmask) { + tt->rn_mask = netmask; + tt->rn_b = x->rn_b; + tt->rn_flags |= x->rn_flags & RNF_NORMAL; + } + t = saved_tt->rn_p; + if (keyduplicated) + goto on2; + b_leaf = -1 - t->rn_b; + if (t->rn_r == saved_tt) x = t->rn_l; else x = t->rn_r; + /* Promote general routes from below */ + if (x->rn_b < 0) { + for (mp = &t->rn_mklist; x; x = x->rn_dupedkey) + if (x->rn_mask && (x->rn_b >= b_leaf) && x->rn_mklist == 0) { + *mp = m = rn_new_radix_mask(x, 0); + if (m) + mp = &m->rm_mklist; + } + } else if (x->rn_mklist) { + /* + * Skip over masks whose index is > that of new node + */ + for (mp = &x->rn_mklist; (m = *mp); mp = &m->rm_mklist) + if (m->rm_b >= b_leaf) + break; + t->rn_mklist = m; *mp = 0; + } +on2: + /* Add new route to highest possible ancestor's list */ + if ((netmask == 0) || (b > t->rn_b )) + return tt; /* can't lift at all */ + b_leaf = tt->rn_b; + do { + x = t; + t = t->rn_p; + } while (b <= t->rn_b && x != top); + /* + * Search through routes associated with node to + * insert new route according to index. + * Need same criteria as when sorting dupedkeys to avoid + * double loop on deletion. + */ + for (mp = &x->rn_mklist; (m = *mp); mp = &m->rm_mklist) { + if (m->rm_b < b_leaf) + continue; + if (m->rm_b > b_leaf) + break; + if (m->rm_flags & RNF_NORMAL) { + mmask = m->rm_leaf->rn_mask; + if (tt->rn_flags & RNF_NORMAL) { + log(LOG_ERR, + "Non-unique normal route, mask not entered"); + return tt; + } + } else + mmask = m->rm_mask; + if (mmask == netmask) { + m->rm_refs++; + tt->rn_mklist = m; + return tt; + } + if (rn_refines(netmask, mmask) || rn_lexobetter(netmask, mmask)) + break; + } + *mp = rn_new_radix_mask(tt, *mp); + return tt; +} + +struct radix_node * +rn_delete(v_arg, netmask_arg, head) + void *v_arg, *netmask_arg; + struct radix_node_head *head; +{ + register struct radix_node *t, *p, *x, *tt; + struct radix_mask *m, *saved_m, **mp; + struct radix_node *dupedkey, *saved_tt, *top; + caddr_t v, netmask; + int b, head_off, vlen; + + v = v_arg; + netmask = netmask_arg; + x = head->rnh_treetop; + tt = rn_search(v, x); + head_off = x->rn_off; + vlen = *(u_char *)v; + saved_tt = tt; + top = x; + if (tt == 0 || + Bcmp(v + head_off, tt->rn_key + head_off, vlen - head_off)) + return (0); + /* + * Delete our route from mask lists. + */ + if (netmask) { + if ((x = rn_addmask(netmask, 1, head_off)) == 0) + return (0); + netmask = x->rn_key; + while (tt->rn_mask != netmask) + if ((tt = tt->rn_dupedkey) == 0) + return (0); + } + if (tt->rn_mask == 0 || (saved_m = m = tt->rn_mklist) == 0) + goto on1; + if (tt->rn_flags & RNF_NORMAL) { + if (m->rm_leaf != tt || m->rm_refs > 0) { + log(LOG_ERR, "rn_delete: inconsistent annotation\n"); + return 0; /* dangling ref could cause disaster */ + } + } else { + if (m->rm_mask != tt->rn_mask) { + log(LOG_ERR, "rn_delete: inconsistent annotation\n"); + goto on1; + } + if (--m->rm_refs >= 0) + goto on1; + } + b = -1 - tt->rn_b; + t = saved_tt->rn_p; + if (b > t->rn_b) + goto on1; /* Wasn't lifted at all */ + do { + x = t; + t = t->rn_p; + } while (b <= t->rn_b && x != top); + for (mp = &x->rn_mklist; (m = *mp); mp = &m->rm_mklist) + if (m == saved_m) { + *mp = m->rm_mklist; + MKFree(m); + break; + } + if (m == 0) { + log(LOG_ERR, "rn_delete: couldn't find our annotation\n"); + if (tt->rn_flags & RNF_NORMAL) + return (0); /* Dangling ref to us */ + } +on1: + /* + * Eliminate us from tree + */ + if (tt->rn_flags & RNF_ROOT) + return (0); +#ifdef RN_DEBUG + /* Get us out of the creation list */ + for (t = rn_clist; t && t->rn_ybro != tt; t = t->rn_ybro) {} + if (t) t->rn_ybro = tt->rn_ybro; +#endif + t = tt->rn_p; + dupedkey = saved_tt->rn_dupedkey; + if (dupedkey) { + /* + * at this point, tt is the deletion target and saved_tt + * is the head of the dupekey chain + */ + if (tt == saved_tt) { + /* remove from head of chain */ + x = dupedkey; x->rn_p = t; + if (t->rn_l == tt) t->rn_l = x; else t->rn_r = x; + } else { + /* find node in front of tt on the chain */ + for (x = p = saved_tt; p && p->rn_dupedkey != tt;) + p = p->rn_dupedkey; + if (p) { + p->rn_dupedkey = tt->rn_dupedkey; + if (tt->rn_dupedkey) /* parent */ + tt->rn_dupedkey->rn_p = p; /* parent */ + } else log(LOG_ERR, "rn_delete: couldn't find us\n"); + } + t = tt + 1; + if (t->rn_flags & RNF_ACTIVE) { +#ifndef RN_DEBUG + *++x = *t; p = t->rn_p; +#else + b = t->rn_info; *++x = *t; t->rn_info = b; p = t->rn_p; +#endif + if (p->rn_l == t) p->rn_l = x; else p->rn_r = x; + x->rn_l->rn_p = x; x->rn_r->rn_p = x; + } + goto out; + } + if (t->rn_l == tt) x = t->rn_r; else x = t->rn_l; + p = t->rn_p; + if (p->rn_r == t) p->rn_r = x; else p->rn_l = x; + x->rn_p = p; + /* + * Demote routes attached to us. + */ + if (t->rn_mklist) { + if (x->rn_b >= 0) { + for (mp = &x->rn_mklist; (m = *mp);) + mp = &m->rm_mklist; + *mp = t->rn_mklist; + } else { + /* If there are any key,mask pairs in a sibling + duped-key chain, some subset will appear sorted + in the same order attached to our mklist */ + for (m = t->rn_mklist; m && x; x = x->rn_dupedkey) + if (m == x->rn_mklist) { + struct radix_mask *mm = m->rm_mklist; + x->rn_mklist = 0; + if (--(m->rm_refs) < 0) + MKFree(m); + m = mm; + } + if (m) + log(LOG_ERR, "%s %p at %x\n", + "rn_delete: Orphaned Mask", m, x); + } + } + /* + * We may be holding an active internal node in the tree. + */ + x = tt + 1; + if (t != x) { +#ifndef RN_DEBUG + *t = *x; +#else + b = t->rn_info; *t = *x; t->rn_info = b; +#endif + t->rn_l->rn_p = t; t->rn_r->rn_p = t; + p = x->rn_p; + if (p->rn_l == x) p->rn_l = t; else p->rn_r = t; + } +out: + tt->rn_flags &= ~RNF_ACTIVE; + tt[1].rn_flags &= ~RNF_ACTIVE; + return (tt); +} + +/* + * This is the same as rn_walktree() except for the parameters and the + * exit. + */ +int +rn_walktree_from(h, a, m, f, w) + struct radix_node_head *h; + void *a, *m; + register int (*f)(); + void *w; +{ + int error; + struct radix_node *base, *next; + u_char *xa = (u_char *)a; + u_char *xm = (u_char *)m; + register struct radix_node *rn, *last = 0 /* shut up gcc */; + int stopping = 0; + int lastb; + + /* + * rn_search_m is sort-of-open-coded here. + */ + /* printf("about to search\n"); */ + for (rn = h->rnh_treetop; rn->rn_b >= 0; ) { + last = rn; + /* printf("rn_b %d, rn_bmask %x, xm[rn_off] %x\n", + rn->rn_b, rn->rn_bmask, xm[rn->rn_off]); */ + if (!(rn->rn_bmask & xm[rn->rn_off])) { + break; + } + if (rn->rn_bmask & xa[rn->rn_off]) { + rn = rn->rn_r; + } else { + rn = rn->rn_l; + } + } + /* printf("done searching\n"); */ + + /* + * Two cases: either we stepped off the end of our mask, + * in which case last == rn, or we reached a leaf, in which + * case we want to start from the last node we looked at. + * Either way, last is the node we want to start from. + */ + rn = last; + lastb = rn->rn_b; + + /* printf("rn %p, lastb %d\n", rn, lastb);*/ + + /* + * This gets complicated because we may delete the node + * while applying the function f to it, so we need to calculate + * the successor node in advance. + */ + while (rn->rn_b >= 0) + rn = rn->rn_l; + + while (!stopping) { + /* printf("node %p (%d)\n", rn, rn->rn_b); */ + base = rn; + /* If at right child go back up, otherwise, go right */ + while (rn->rn_p->rn_r == rn && !(rn->rn_flags & RNF_ROOT)) { + rn = rn->rn_p; + + /* if went up beyond last, stop */ + if (rn->rn_b < lastb) { + stopping = 1; + /* printf("up too far\n"); */ + } + } + + /* Find the next *leaf* since next node might vanish, too */ + for (rn = rn->rn_p->rn_r; rn->rn_b >= 0;) + rn = rn->rn_l; + next = rn; + /* Process leaves */ + while ((rn = base) != 0) { + base = rn->rn_dupedkey; + /* printf("leaf %p\n", rn); */ + if (!(rn->rn_flags & RNF_ROOT) + && (error = (*f)(rn, w))) + return (error); + } + rn = next; + + if (rn->rn_flags & RNF_ROOT) { + /* printf("root, stopping"); */ + stopping = 1; + } + + } + return 0; +} + +int +rn_walktree(h, f, w) + struct radix_node_head *h; + register int (*f)(); + void *w; +{ + int error; + struct radix_node *base, *next; + register struct radix_node *rn = h->rnh_treetop; + /* + * This gets complicated because we may delete the node + * while applying the function f to it, so we need to calculate + * the successor node in advance. + */ + /* First time through node, go left */ + while (rn->rn_b >= 0) + rn = rn->rn_l; + for (;;) { + base = rn; + /* If at right child go back up, otherwise, go right */ + while (rn->rn_p->rn_r == rn && (rn->rn_flags & RNF_ROOT) == 0) + rn = rn->rn_p; + /* Find the next *leaf* since next node might vanish, too */ + for (rn = rn->rn_p->rn_r; rn->rn_b >= 0;) + rn = rn->rn_l; + next = rn; + /* Process leaves */ + while ((rn = base)) { + base = rn->rn_dupedkey; + if (!(rn->rn_flags & RNF_ROOT) && (error = (*f)(rn, w))) + return (error); + } + rn = next; + if (rn->rn_flags & RNF_ROOT) + return (0); + } + /* NOTREACHED */ +} + +int +rn_inithead(head, off) + void **head; + int off; +{ + register struct radix_node_head *rnh; + register struct radix_node *t, *tt, *ttt; + if (*head) + return (1); + R_Malloc(rnh, struct radix_node_head *, sizeof (*rnh)); + if (rnh == 0) + return (0); + Bzero(rnh, sizeof (*rnh)); + *head = rnh; + t = rn_newpair(rn_zeros, off, rnh->rnh_nodes); + ttt = rnh->rnh_nodes + 2; + t->rn_r = ttt; + t->rn_p = t; + tt = t->rn_l; + tt->rn_flags = t->rn_flags = RNF_ROOT | RNF_ACTIVE; + tt->rn_b = -1 - off; + *ttt = *tt; + ttt->rn_key = rn_ones; + rnh->rnh_addaddr = rn_addroute; + rnh->rnh_deladdr = rn_delete; + rnh->rnh_matchaddr = rn_match; + rnh->rnh_lookup = rn_lookup; + rnh->rnh_walktree = rn_walktree; + rnh->rnh_walktree_from = rn_walktree_from; + rnh->rnh_treetop = t; + return (1); +} + +void +rn_init() +{ + char *cp, *cplim; +#ifdef KERNEL + struct domain *dom; + + for (dom = domains; dom; dom = dom->dom_next) + if (dom->dom_maxrtkey > max_keylen) + max_keylen = dom->dom_maxrtkey; +#endif + if (max_keylen == 0) { + log(LOG_ERR, + "rn_init: radix functions require max_keylen be set\n"); + return; + } + R_Malloc(rn_zeros, char *, 3 * max_keylen); + if (rn_zeros == NULL) + panic("rn_init"); + Bzero(rn_zeros, 3 * max_keylen); + rn_ones = cp = rn_zeros + max_keylen; + addmask_key = cplim = rn_ones + max_keylen; + while (cp < cplim) + *cp++ = -1; + if (rn_inithead((void **)&mask_rnhead, 0) == 0) + panic("rn_init 2"); +} diff --git a/reactos/lib/oskittcp/oskittcp/random.c b/reactos/lib/oskittcp/oskittcp/random.c new file mode 100644 index 00000000000..ffbf03030e1 --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/random.c @@ -0,0 +1,63 @@ +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)random.c 8.1 (Berkeley) 6/10/93 + */ + +#include + +/* + * Pseudo-random number generator for randomizing the profiling clock, + * and whatever else we might use it for. The result is uniform on + * [0, 2^31 - 1]. + */ +unsigned long +random() +{ + static unsigned long randseed = 1; + register long x, hi, lo, t; + + /* + * Compute x[n + 1] = (7^5 * x[n]) mod (2^31 - 1). + * From "Random number generators: good ones are hard to find", + * Park and Miller, Communications of the ACM, vol. 31, no. 10, + * October 1988, p. 1195. + */ + x = randseed; + hi = x / 127773; + lo = x % 127773; + t = 16807 * lo - 2836 * hi; + if (t <= 0) + t += 0x7fffffff; + randseed = t; + return (t); +} diff --git a/reactos/lib/oskittcp/oskittcp/route.c b/reactos/lib/oskittcp/oskittcp/route.c new file mode 100644 index 00000000000..a7b2f1edfaa --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/route.c @@ -0,0 +1,807 @@ +/* + * Copyright (c) 1980, 1986, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)route.c 8.2 (Berkeley) 11/15/93 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#define SA(p) ((struct sockaddr *)(p)) + +int rttrash; /* routes not in table but not freed */ +struct sockaddr wildcard; /* zero valued cookie for wildcard searches */ + +#define UNIMP panic("Unimplemented function") + +/* + * Packet routing routines. + */ +void +rtalloc(ro) + register struct route *ro; +{ +#if 0 + if (ro->ro_rt && ro->ro_rt->rt_ifp && (ro->ro_rt->rt_flags & RTF_UP)) + return; /* XXX */ + ro->ro_rt = rtalloc1(&ro->ro_dst, 1, 0UL); +#endif + UNIMP; +} + +void +rtalloc_ign(ro, ignore) + register struct route *ro; + u_long ignore; +{ +#if 0 + if (ro->ro_rt && ro->ro_rt->rt_ifp && (ro->ro_rt->rt_flags & RTF_UP)) + return; /* XXX */ + ro->ro_rt = rtalloc1(&ro->ro_dst, 1, ignore); +#endif + UNIMP; +} + +struct rtentry * +rtalloc1(dst, report, ignflags) + register struct sockaddr *dst; + int report; + u_long ignflags; +{ +#if 0 + register struct radix_node_head *rnh = rt_tables[dst->sa_family]; + register struct rtentry *rt; + register struct radix_node *rn; + struct rtentry *newrt = 0; + struct rt_addrinfo info; + u_long nflags; + int s = splnet(), err = 0, msgtype = RTM_MISS; + + if (rnh && (rn = rnh->rnh_matchaddr((caddr_t)dst, rnh)) && + ((rn->rn_flags & RNF_ROOT) == 0)) { + newrt = rt = (struct rtentry *)rn; + nflags = rt->rt_flags & ~ignflags; + if (report && (nflags & (RTF_CLONING | RTF_PRCLONING))) { + err = rtrequest(RTM_RESOLVE, dst, SA(0), + SA(0), 0, &newrt); + if (err) { + newrt = rt; + rt->rt_refcnt++; + goto miss; + } + if ((rt = newrt) && (rt->rt_flags & RTF_XRESOLVE)) { + msgtype = RTM_RESOLVE; + goto miss; + } + } else + rt->rt_refcnt++; + } else { + rtstat.rts_unreach++; + miss: if (report) { + bzero((caddr_t)&info, sizeof(info)); + info.rti_info[RTAX_DST] = dst; + rt_missmsg(msgtype, &info, 0, err); + } + } + splx(s); + return (newrt); +#endif + UNIMP; +} + +void +rtfree(rt) + register struct rtentry *rt; +{ +#if 0 + register struct radix_node_head *rnh = + rt_tables[rt_key(rt)->sa_family]; + register struct ifaddr *ifa; + + if (rt == 0 || rnh == 0) + panic("rtfree"); + rt->rt_refcnt--; + if(rnh->rnh_close && rt->rt_refcnt == 0) { + rnh->rnh_close((struct radix_node *)rt, rnh); + } + if (rt->rt_refcnt <= 0 && (rt->rt_flags & RTF_UP) == 0) { + if (rt->rt_nodes->rn_flags & (RNF_ACTIVE | RNF_ROOT)) + panic ("rtfree 2"); + rttrash--; + if (rt->rt_refcnt < 0) { + printf("rtfree: %p not freed (neg refs)\n", rt); + return; + } + ifa = rt->rt_ifa; + IFAFREE(ifa); + if (rt->rt_parent) { + RTFREE(rt->rt_parent); + } + Free(rt_key(rt)); + Free(rt); + } +#endif + UNIMP; +} + +void +ifafree(ifa) + register struct ifaddr *ifa; +{ +#if 0 + if (ifa == NULL) + panic("ifafree"); + if (ifa->ifa_refcnt == 0) + free(ifa, M_IFADDR); + else + ifa->ifa_refcnt--; +#endif + UNIMP; +} + +/* + * Force a routing table entry to the specified + * destination to go through the given gateway. + * Normally called as a result of a routing redirect + * message from the network layer. + * + * N.B.: must be called at splnet + * + */ +void +rtredirect(dst, gateway, netmask, flags, src, rtp) + struct sockaddr *dst, *gateway, *netmask, *src; + int flags; + struct rtentry **rtp; +{ +#if 0 + register struct rtentry *rt; + int error = 0; + short *stat = 0; + struct rt_addrinfo info; + struct ifaddr *ifa; + + /* verify the gateway is directly reachable */ + if ((ifa = ifa_ifwithnet(gateway)) == 0) { + error = ENETUNREACH; + goto out; + } + rt = rtalloc1(dst, 0, 0UL); + /* + * If the redirect isn't from our current router for this dst, + * it's either old or wrong. If it redirects us to ourselves, + * we have a routing loop, perhaps as a result of an interface + * going down recently. + */ +#define equal(a1, a2) (bcmp((caddr_t)(a1), (caddr_t)(a2), (a1)->sa_len) == 0) + if (!(flags & RTF_DONE) && rt && + (!equal(src, rt->rt_gateway) || rt->rt_ifa != ifa)) + error = EINVAL; + else if (ifa_ifwithaddr(gateway)) + error = EHOSTUNREACH; + if (error) + goto done; + /* + * Create a new entry if we just got back a wildcard entry + * or the the lookup failed. This is necessary for hosts + * which use routing redirects generated by smart gateways + * to dynamically build the routing tables. + */ + if ((rt == 0) || (rt_mask(rt) && rt_mask(rt)->sa_len < 2)) + goto create; + /* + * Don't listen to the redirect if it's + * for a route to an interface. + */ + if (rt->rt_flags & RTF_GATEWAY) { + if (((rt->rt_flags & RTF_HOST) == 0) && (flags & RTF_HOST)) { + /* + * Changing from route to net => route to host. + * Create new route, rather than smashing route to net. + */ + create: + flags |= RTF_GATEWAY | RTF_DYNAMIC; + error = rtrequest((int)RTM_ADD, dst, gateway, + netmask, flags, + (struct rtentry **)0); + stat = &rtstat.rts_dynamic; + } else { + /* + * Smash the current notion of the gateway to + * this destination. Should check about netmask!!! + */ + rt->rt_flags |= RTF_MODIFIED; + flags |= RTF_MODIFIED; + stat = &rtstat.rts_newgateway; + rt_setgate(rt, rt_key(rt), gateway); + } + } else + error = EHOSTUNREACH; +done: + if (rt) { + if (rtp && !error) + *rtp = rt; + else + rtfree(rt); + } +out: + if (error) + rtstat.rts_badredirect++; + else if (stat != NULL) + (*stat)++; + bzero((caddr_t)&info, sizeof(info)); + info.rti_info[RTAX_DST] = dst; + info.rti_info[RTAX_GATEWAY] = gateway; + info.rti_info[RTAX_NETMASK] = netmask; + info.rti_info[RTAX_AUTHOR] = src; + rt_missmsg(RTM_REDIRECT, &info, flags, error); +#endif + UNIMP; +} + +/* +* Routing table ioctl interface. +*/ +int +rtioctl(req, data, p) + int req; + caddr_t data; + struct proc *p; +{ +#if 0 +#ifdef INET + /* Multicast goop, grrr... */ + return mrt_ioctl(req, data, p); +#else /* INET */ + return ENXIO; +#endif /* INET */ +#endif + UNIMP; +} + +struct ifaddr * +ifa_ifwithroute(flags, dst, gateway) + int flags; + struct sockaddr *dst, *gateway; +{ +#if 0 + register struct ifaddr *ifa; + if ((flags & RTF_GATEWAY) == 0) { + /* + * If we are adding a route to an interface, + * and the interface is a pt to pt link + * we should search for the destination + * as our clue to the interface. Otherwise + * we can use the local address. + */ + ifa = 0; + if (flags & RTF_HOST) { + ifa = ifa_ifwithdstaddr(dst); + } + if (ifa == 0) + ifa = ifa_ifwithaddr(gateway); + } else { + /* + * If we are adding a route to a remote net + * or host, the gateway may still be on the + * other end of a pt to pt link. + */ + ifa = ifa_ifwithdstaddr(gateway); + } + if (ifa == 0) + ifa = ifa_ifwithnet(gateway); + if (ifa == 0) { + struct rtentry *rt = rtalloc1(dst, 0, 0UL); + if (rt == 0) + return (0); + rt->rt_refcnt--; + if ((ifa = rt->rt_ifa) == 0) + return (0); + } + if (ifa->ifa_addr->sa_family != dst->sa_family) { + struct ifaddr *oifa = ifa; + ifa = ifaof_ifpforaddr(dst, ifa->ifa_ifp); + if (ifa == 0) + ifa = oifa; + } + return (ifa); +#endif + UNIMP; +} + +#define ROUNDUP(a) (a>0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long)) + +static int rt_fixdelete(struct radix_node *, void *); +static int rt_fixchange(struct radix_node *, void *); + +struct rtfc_arg { + struct rtentry *rt0; + struct radix_node_head *rnh; +}; + +int +rtrequest(req, dst, gateway, netmask, flags, ret_nrt) + int req, flags; + struct sockaddr *dst, *gateway, *netmask; + struct rtentry **ret_nrt; +{ +#if 0 + int s = splnet(); int error = 0; + register struct rtentry *rt; + register struct radix_node *rn; + register struct radix_node_head *rnh; + struct ifaddr *ifa; + struct sockaddr *ndst; + u_long prflags = 0UL; +#define senderr(x) { error = x ; goto bad; } + + if ((rnh = rt_tables[dst->sa_family]) == 0) + senderr(ESRCH); + if (flags & RTF_HOST) + netmask = 0; + switch (req) { + case RTM_DELETE: + if ((rn = rnh->rnh_deladdr(dst, netmask, rnh)) == 0) + senderr(ESRCH); + if (rn->rn_flags & (RNF_ACTIVE | RNF_ROOT)) + panic ("rtrequest delete"); + rt = (struct rtentry *)rn; + + /* + * Now search what's left of the subtree for any cloned + * routes which might have been formed from this node. + */ + if ((rt->rt_flags & RTF_PRCLONING) && netmask) { + rnh->rnh_walktree_from(rnh, dst, netmask, + rt_fixdelete, rt); + } + + if (rt->rt_gwroute) { + rt = rt->rt_gwroute; RTFREE(rt); + (rt = (struct rtentry *)rn)->rt_gwroute = 0; + } + + /* + * NB: RTF_UP must be set during the search above, + * because we might delete the last ref, causing + * rt to get freed prematurely. + */ + rt->rt_flags &= ~RTF_UP; + + if ((ifa = rt->rt_ifa) && ifa->ifa_rtrequest) + ifa->ifa_rtrequest(RTM_DELETE, rt, SA(0)); + rttrash++; + if (ret_nrt) + *ret_nrt = rt; + else if (rt->rt_refcnt <= 0) { + rt->rt_refcnt++; + rtfree(rt); + } + break; + + case RTM_RESOLVE: + if (ret_nrt == 0 || (rt = *ret_nrt) == 0) + senderr(EINVAL); + ifa = rt->rt_ifa; + flags = rt->rt_flags & + ~(RTF_CLONING | RTF_PRCLONING | RTF_STATIC); + flags |= RTF_WASCLONED; + gateway = rt->rt_gateway; + if ((netmask = rt->rt_genmask) == 0) + flags |= RTF_HOST; + goto makeroute; + + case RTM_ADD: + if ((flags & RTF_GATEWAY) && !gateway) + panic("rtrequest: GATEWAY but no gateway"); + + if ((ifa = ifa_ifwithroute(flags, dst, gateway)) == 0) + senderr(ENETUNREACH); + + makeroute: + R_Malloc(rt, struct rtentry *, sizeof(*rt)); + if (rt == 0) + senderr(ENOBUFS); + Bzero(rt, sizeof(*rt)); + rt->rt_flags = RTF_UP | flags; + if (rt_setgate(rt, dst, gateway)) { + Free(rt); + senderr(ENOBUFS); + } + ndst = rt_key(rt); + if (netmask) { + rt_maskedcopy(dst, ndst, netmask); + } else + Bcopy(dst, ndst, dst->sa_len); + + /* + * This moved from below so that rnh->rnh_addaddr() can + * examine the ifa and ifp if it so desires. + */ + ifa->ifa_refcnt++; + rt->rt_ifa = ifa; + rt->rt_ifp = ifa->ifa_ifp; + + rn = rnh->rnh_addaddr((caddr_t)ndst, (caddr_t)netmask, + rnh, rt->rt_nodes); + if (rn == 0) { + struct rtentry *rt2; + /* + * Uh-oh, we already have one of these in the tree. + * We do a special hack: if the route that's already + * there was generated by the protocol-cloning + * mechanism, then we just blow it away and retry + * the insertion of the new one. + */ + rt2 = rtalloc1(dst, 0, RTF_PRCLONING); + if (rt2 && rt2->rt_parent) { + rtrequest(RTM_DELETE, + (struct sockaddr *)rt_key(rt2), + rt2->rt_gateway, + rt_mask(rt2), rt2->rt_flags, 0); + RTFREE(rt2); + rn = rnh->rnh_addaddr((caddr_t)ndst, + (caddr_t)netmask, + rnh, rt->rt_nodes); + } else if (rt2) { + RTFREE(rt2); + } + } + + if (rn == 0) { + if (rt->rt_gwroute) + rtfree(rt->rt_gwroute); + if (rt->rt_ifa) { + IFAFREE(rt->rt_ifa); + } + Free(rt_key(rt)); + Free(rt); + senderr(EEXIST); + } + rt->rt_parent = 0; + + if (req == RTM_RESOLVE) { + rt->rt_rmx = (*ret_nrt)->rt_rmx; /* copy metrics */ + if ((*ret_nrt)->rt_flags & RTF_PRCLONING) { + rt->rt_parent = (*ret_nrt); + (*ret_nrt)->rt_refcnt++; + } + } + if (ifa->ifa_rtrequest) + ifa->ifa_rtrequest(req, rt, SA(ret_nrt ? *ret_nrt : 0)); + /* + * We repeat the same procedure from rt_setgate() here because + * it doesn't fire when we call it there because the node + * hasn't been added to the tree yet. + */ + if (!(rt->rt_flags & RTF_HOST)) { + struct rtfc_arg arg; + arg.rnh = rnh; + arg.rt0 = rt; + rnh->rnh_walktree_from(rnh, rt_key(rt), rt_mask(rt), + rt_fixchange, &arg); + } + + if (ret_nrt) { + *ret_nrt = rt; + rt->rt_refcnt++; + } + break; + } +bad: + splx(s); + return (error); +#endif + UNIMP; +} + +/* + * Called from rtrequest(RTM_DELETE, ...) to fix up the route's ``family'' + * (i.e., the routes related to it by the operation of cloning). This + * routine is iterated over all potential former-child-routes by way of + * rnh->rnh_walktree_from() above, and those that actually are children of + * the late parent (passed in as VP here) are themselves deleted. + */ +static int +rt_fixdelete(struct radix_node *rn, void *vp) +{ +#if 0 + struct rtentry *rt = (struct rtentry *)rn; + struct rtentry *rt0 = vp; + + if (rt->rt_parent == rt0 && !(rt->rt_flags & RTF_PINNED)) { + return rtrequest(RTM_DELETE, rt_key(rt), + (struct sockaddr *)0, rt_mask(rt), + rt->rt_flags, (struct rtentry **)0); + } + return 0; +#endif + UNIMP; +} + +/* + * This routine is called from rt_setgate() to do the analogous thing for + * adds and changes. There is the added complication in this case of a + * middle insert; i.e., insertion of a new network route between an older + * network route and (cloned) host routes. For this reason, a simple check + * of rt->rt_parent is insufficient; each candidate route must be tested + * against the (mask, value) of the new route (passed as before in vp) + * to see if the new route matches it. Unfortunately, this has the obnoxious + * property of also triggering for insertion /above/ a pre-existing network + * route and clones. Sigh. This may be fixed some day. + * + * XXX - it may be possible to do fixdelete() for changes and reserve this + * routine just for adds. I'm not sure why I thought it was necessary to do + * changes this way. + */ +#ifdef DEBUG +int rtfcdebug = 0; +#endif + +static int +rt_fixchange(struct radix_node *rn, void *vp) +{ + struct rtentry *rt = (struct rtentry *)rn; + struct rtfc_arg *ap = vp; + struct rtentry *rt0 = ap->rt0; + struct radix_node_head *rnh = ap->rnh; + u_char *xk1, *xm1, *xk2; + int i, len; + +#if 0 +#ifdef DEBUG + if (rtfcdebug) + printf("rt_fixchange: rt %p, rt0 %p\n", rt, rt0); +#endif + + if (!rt->rt_parent || (rt->rt_flags & RTF_PINNED)) { +#ifdef DEBUG + if(rtfcdebug) printf("no parent or pinned\n"); +#endif + return 0; + } + + if (rt->rt_parent == rt0) { +#ifdef DEBUG + if(rtfcdebug) printf("parent match\n"); +#endif + return rtrequest(RTM_DELETE, rt_key(rt), + (struct sockaddr *)0, rt_mask(rt), + rt->rt_flags, (struct rtentry **)0); + } + + /* + * There probably is a function somewhere which does this... + * if not, there should be. + */ + len = imin(((struct sockaddr *)rt_key(rt0))->sa_len, + ((struct sockaddr *)rt_key(rt))->sa_len); + + xk1 = (u_char *)rt_key(rt0); + xm1 = (u_char *)rt_mask(rt0); + xk2 = (u_char *)rt_key(rt); + + for (i = rnh->rnh_treetop->rn_off; i < len; i++) { + if ((xk2[i] & xm1[i]) != xk1[i]) { +#ifdef DEBUG + if(rtfcdebug) printf("no match\n"); +#endif + return 0; + } + } + + /* + * OK, this node is a clone, and matches the node currently being + * changed/added under the node's mask. So, get rid of it. + */ +#ifdef DEBUG + if(rtfcdebug) printf("deleting\n"); +#endif + return rtrequest(RTM_DELETE, rt_key(rt), (struct sockaddr *)0, + rt_mask(rt), rt->rt_flags, (struct rtentry **)0); +#endif + UNIMP; +} + +int +rt_setgate(rt0, dst, gate) + struct rtentry *rt0; + struct sockaddr *dst, *gate; +{ +#if 0 + caddr_t new, old; + int dlen = ROUNDUP(dst->sa_len), glen = ROUNDUP(gate->sa_len); + register struct rtentry *rt = rt0; + struct radix_node_head *rnh = rt_tables[dst->sa_family]; + + if (rt->rt_gateway == 0 || glen > ROUNDUP(rt->rt_gateway->sa_len)) { + old = (caddr_t)rt_key(rt); + R_Malloc(new, caddr_t, dlen + glen); + if (new == 0) + return 1; + rt->rt_nodes->rn_key = new; + } else { + new = rt->rt_nodes->rn_key; + old = 0; + } + Bcopy(gate, (rt->rt_gateway = (struct sockaddr *)(new + dlen)), glen); + if (old) { + Bcopy(dst, new, dlen); + Free(old); + } + if (rt->rt_gwroute) { + rt = rt->rt_gwroute; RTFREE(rt); + rt = rt0; rt->rt_gwroute = 0; + } + /* + * Cloning loop avoidance: + * In the presence of protocol-cloning and bad configuration, + * it is possible to get stuck in bottomless mutual recursion + * (rtrequest rt_setgate rtalloc1). We avoid this by not allowing + * protocol-cloning to operate for gateways (which is probably the + * correct choice anyway), and avoid the resulting reference loops + * by disallowing any route to run through itself as a gateway. + * This is obviuosly mandatory when we get rt->rt_output(). + */ + if (rt->rt_flags & RTF_GATEWAY) { + rt->rt_gwroute = rtalloc1(gate, 1, RTF_PRCLONING); + if (rt->rt_gwroute == rt) { + RTFREE(rt->rt_gwroute); + rt->rt_gwroute = 0; + return 1; /* failure */ + } + } + + /* + * This isn't going to do anything useful for host routes, so + * don't bother. Also make sure we have a reasonable mask + * (we don't yet have one during adds). + */ + if (!(rt->rt_flags & RTF_HOST) && rt_mask(rt) != 0) { + struct rtfc_arg arg; + arg.rnh = rnh; + arg.rt0 = rt; + rnh->rnh_walktree_from(rnh, rt_key(rt), rt_mask(rt), + rt_fixchange, &arg); + } + + return 0; +#endif + UNIMP; +} + +void +rt_maskedcopy(src, dst, netmask) + struct sockaddr *src, *dst, *netmask; +{ +#if 0 + register u_char *cp1 = (u_char *)src; + register u_char *cp2 = (u_char *)dst; + register u_char *cp3 = (u_char *)netmask; + u_char *cplim = cp2 + *cp3; + u_char *cplim2 = cp2 + *cp1; + + *cp2++ = *cp1++; *cp2++ = *cp1++; /* copies sa_len & sa_family */ + cp3 += 2; + if (cplim > cplim2) + cplim = cplim2; + while (cp2 < cplim) + *cp2++ = *cp1++ & *cp3++; + if (cp2 < cplim2) + bzero((caddr_t)cp2, (unsigned)(cplim2 - cp2)); +#endif + UNIMP; +} + +/* + * Set up a routing table entry, normally + * for an interface. + */ +int +rtinit(ifa, cmd, flags) + register struct ifaddr *ifa; + int cmd, flags; +{ +#if 0 + register struct rtentry *rt; + register struct sockaddr *dst; + register struct sockaddr *deldst; + struct mbuf *m = 0; + struct rtentry *nrt = 0; + int error; + + dst = flags & RTF_HOST ? ifa->ifa_dstaddr : ifa->ifa_addr; + if (cmd == RTM_DELETE) { + if ((flags & RTF_HOST) == 0 && ifa->ifa_netmask) { + m = m_get(M_WAIT, MT_SONAME); + deldst = mtod(m, struct sockaddr *); + rt_maskedcopy(dst, deldst, ifa->ifa_netmask); + dst = deldst; + } + rt = rtalloc1(dst, 0, 0UL); + if (rt) { + rt->rt_refcnt--; + if (rt->rt_ifa != ifa) { + if (m) + (void) m_free(m); + return (flags & RTF_HOST ? EHOSTUNREACH + : ENETUNREACH); + } + } + } + error = rtrequest(cmd, dst, ifa->ifa_addr, ifa->ifa_netmask, + flags | ifa->ifa_flags, &nrt); + if (m) + (void) m_free(m); + if (cmd == RTM_DELETE && error == 0 && (rt = nrt)) { + rt_newaddrmsg(cmd, ifa, error, nrt); + if (rt->rt_refcnt <= 0) { + rt->rt_refcnt++; + rtfree(rt); + } + } + if (cmd == RTM_ADD && error == 0 && (rt = nrt)) { + rt->rt_refcnt--; + if (rt->rt_ifa != ifa) { + printf("rtinit: wrong ifa (%p) was (%p)\n", ifa, + rt->rt_ifa); + if (rt->rt_ifa->ifa_rtrequest) + rt->rt_ifa->ifa_rtrequest(RTM_DELETE, rt, SA(0)); + IFAFREE(rt->rt_ifa); + rt->rt_ifa = ifa; + rt->rt_ifp = ifa->ifa_ifp; + ifa->ifa_refcnt++; + if (ifa->ifa_rtrequest) + ifa->ifa_rtrequest(RTM_ADD, rt, SA(0)); + } + rt_newaddrmsg(cmd, ifa, error, nrt); + } + return (error); +#endif + UNIMP; +} diff --git a/reactos/lib/oskittcp/oskittcp/rtsock.c b/reactos/lib/oskittcp/oskittcp/rtsock.c new file mode 100644 index 00000000000..51cc2efe84a --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/rtsock.c @@ -0,0 +1,79 @@ +/* + * Copyright (c) 1988, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)rtsock.c 8.5 (Berkeley) 11/2/94 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +/* + * This routine is called to generate a message from the routing + * socket indicating that a redirect has occured, a routing lookup + * has failed, or that a protocol has detected timeouts to a particular + * destination. + */ +void +rt_missmsg(type, rtinfo, flags, error) + int type, flags, error; + register struct rt_addrinfo *rtinfo; +{ +#if 0 + register struct rt_msghdr *rtm; + register struct mbuf *m; + struct sockaddr *sa = rtinfo->rti_info[RTAX_DST]; + + if (route_cb.any_count == 0) + return; + m = rt_msg1(type, rtinfo); + if (m == 0) + return; + rtm = mtod(m, struct rt_msghdr *); + rtm->rtm_flags = RTF_DONE | flags; + rtm->rtm_errno = error; + rtm->rtm_addrs = rtinfo->rti_addrs; + route_proto.sp_protocol = sa ? sa->sa_family : 0; + raw_input(m, &route_proto, &route_src, &route_dst); +#endif + panic("Unimplemented function\n"); +} diff --git a/reactos/lib/oskittcp/oskittcp/scanc.c b/reactos/lib/oskittcp/oskittcp/scanc.c new file mode 100644 index 00000000000..491bd36464d --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/scanc.c @@ -0,0 +1,52 @@ +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)scanc.c 8.1 (Berkeley) 6/10/93 + * + * $\Id: scanc.c,v 1.3 1995/03/17 06:15:39 phk Exp $ + */ + +#include + +int +scanc(size, cp, table, mask0) + u_int size; + register u_char *cp, table[]; + int mask0; +{ + register u_char *end; + register u_char mask; + + mask = mask0; + for (end = &cp[size]; cp < end && (table[*cp] & mask) == 0; ++cp); + return (end - cp); +} diff --git a/reactos/lib/oskittcp/oskittcp/sleep.c b/reactos/lib/oskittcp/oskittcp/sleep.c new file mode 100644 index 00000000000..83bed686a77 --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/sleep.c @@ -0,0 +1,209 @@ +#include +#include +#include +#include +#include +#include + +typedef struct _SLEEPING_THREAD { + LIST_ENTRY Entry; + PVOID SleepToken; + KEVENT Event; +} SLEEPING_THREAD, *PSLEEPING_THREAD; + +LIST_ENTRY SleepingThreadsList; +KSPIN_LOCK SleepingThreadsLock; + +/* clock_init */ +int ncallout = 256; +struct callout *callout; + +void init_freebsd_sched() { + KeInitializeSpinLock( &SleepingThreadsLock ); + InitializeListHead( &SleepingThreadsList ); +} + +void tsleep( void *token, int priority, char *wmesg, int tmio ) { + KIRQL OldIrql; + KEVENT Event; + PLIST_ENTRY Entry; + PSLEEPING_THREAD SleepingThread; + + OS_DbgPrint(OSK_MID_TRACE, + ("Called TSLEEP: tok = %x, pri = %d, wmesg = %s, tmio = %x\n", + token, priority, wmesg, tmio)); + + SleepingThread = ExAllocatePool( NonPagedPool, sizeof( *SleepingThread ) ); + if( SleepingThread ) { + KeInitializeEvent( &SleepingThread->Event, NotificationEvent, FALSE ); + SleepingThread->SleepToken = token; + ExInterlockedInsertTailList( &SleepingThreadsList, + &SleepingThread->Entry, + &SleepingThreadsLock ); + } + + OS_DbgPrint(OSK_MID_TRACE,("Waiting on %x\n", token)); + KeWaitForSingleObject( &SleepingThread->Event, + WrSuspended, + KernelMode, + TRUE, + NULL ); + OS_DbgPrint(OSK_MID_TRACE,("Waiting finished: %x\n", token)); +} + +void wakeup( void *token ) { + KIRQL OldIrql; + KEVENT Event; + PLIST_ENTRY Entry; + PSLEEPING_THREAD SleepingThread; + + OS_DbgPrint(OSK_MID_TRACE,("Wakeup %x!\n",token)); + + KeAcquireSpinLock( &SleepingThreadsLock, &OldIrql ); + Entry = SleepingThreadsList.Flink; + while( Entry != &SleepingThreadsList ) { + SleepingThread = CONTAINING_RECORD(Entry, SLEEPING_THREAD, Entry); + if( SleepingThread->SleepToken == token ) { + RemoveEntryList(Entry); + KeReleaseSpinLock( &SleepingThreadsLock, OldIrql ); + OS_DbgPrint(OSK_MID_TRACE,("Setting event to wake %x\n", token)); + KeSetEvent( &SleepingThread->Event, IO_NO_INCREMENT, FALSE ); + ExFreePool( SleepingThread ); + return; + } + Entry = Entry->Flink; + } + KeReleaseSpinLock( &SleepingThreadsLock, OldIrql ); + OS_DbgPrint(OSK_MID_TRACE,("Wakeup done %x\n", token)); +} + +/* ---------------------------------------------------------------------- */ + + +static void +timeout_init(void) +{ + int i; + + callout = (struct callout *) + malloc(sizeof(struct callout) * ncallout, M_FREE, M_WAITOK); + if (!callout) + panic("can't allocate callout queue!\n"); + + /* + * Initialize callouts + */ + callfree = callout; + for (i = 1; i < ncallout; i++) + callout[i-1].c_next = &callout[i]; + +} + +/* get clock up and running */ +void clock_init() +{ + timeout_init(); + /* inittodr(0); // what does this do? */ + boottime = time; + /* Start a clock we can use for timeouts */ +} + + +extern unsigned bio_imask; /* group of interrupts masked with splbio() */ +extern unsigned cpl; /* current priority level mask */ +extern volatile unsigned idelayed; /* interrupts to become pending */ +extern volatile unsigned ipending; /* active interrupts masked by cpl */ +extern unsigned net_imask; /* group of interrupts masked with splimp() */ +extern unsigned stat_imask; /* interrupts masked with splstatclock() */ +extern unsigned tty_imask; /* group of interrupts masked with spltty() */ + +/* + * ipending has to be volatile so that it is read every time it is accessed + * in splx() and spl0(), but we don't want it to be read nonatomically when + * it is changed. Pretending that ipending is a plain int happens to give + * suitable atomic code for "ipending |= constant;". + */ +#define setdelayed() (*(unsigned *)&ipending |= loadandclear(&idelayed)) +#define setsoftast() (*(unsigned *)&ipending |= SWI_AST_PENDING) +#define setsoftclock() (*(unsigned *)&ipending |= SWI_CLOCK_PENDING) +#define setsoftnet() (*(unsigned *)&ipending |= SWI_NET_PENDING) +#define setsofttty() (*(unsigned *)&ipending |= SWI_TTY_PENDING) + +#define schedsofttty() (*(unsigned *)&idelayed |= SWI_TTY_PENDING) + +#define GENSPL(name, set_cpl) \ +static __inline int name(void) \ +{ \ + unsigned x; \ + \ + __asm __volatile("" : : : "memory"); \ + x = cpl; \ + set_cpl; \ + return (x); \ +} + +#if 0 +GENSPL(splbio, cpl |= bio_imask) +GENSPL(splclock, cpl = HWI_MASK | SWI_MASK) +GENSPL(splhigh, cpl = HWI_MASK | SWI_MASK) +GENSPL(splimp, cpl |= net_imask) +GENSPL(splnet, cpl |= SWI_NET_MASK) +GENSPL(splsoftclock, cpl = SWI_CLOCK_MASK) +GENSPL(splsofttty, cpl |= SWI_TTY_MASK) +GENSPL(splstatclock, cpl |= stat_imask) +GENSPL(spltty, cpl |= tty_imask) +#endif + +#if 0 +void spl0(void) { + cpl = SWI_AST_MASK; + if (ipending & ~SWI_AST_MASK) + splz(); +} + +void splx(int ipl) { + cpl = ipl; + if (ipending & ~ipl) + splz(); +} +#endif + +void splz(void) { + OS_DbgPrint(OSK_MID_TRACE,("Called SPLZ\n")); +} + +/* + * functions to save and restore the current cpl + */ +void save_cpl(unsigned *x) +{ + *x = cpl; +} + +void restore_cpl(unsigned x) +{ + cpl = x; +} + +void selrecord( struct proc *selector, struct selinfo *sip) { + OS_DbgPrint(OSK_MID_TRACE,("Called selrecord\n")); +} + +void wakeupsocket( struct socket *so, struct selinfo *sel ) { + void *connection = so->so_connection; + char *data = 0; + int datalen = 0; + int flags = 0; + + OS_DbgPrint(OSK_MID_TRACE,("Wakeup: %x\n", so)); +#if 0 + if( soreceive(so, &paddr, 0, &mp0, &controlp, flags) == 0 ) { + /* We have data available */ + OS_DbgPrint(OSK_MID_TRACE,("Data available on %x\n", so)); + } +#endif +} + +void selwakeup( struct selinfo *sel ) { + OS_DbgPrint(OSK_MID_TRACE,("Called selwakeup\n")); +} diff --git a/reactos/lib/oskittcp/oskittcp/tcp_debug.c b/reactos/lib/oskittcp/oskittcp/tcp_debug.c new file mode 100644 index 00000000000..5d48032a9a1 --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/tcp_debug.c @@ -0,0 +1,163 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcp_debug.c 8.1 (Berkeley) 6/10/93 + */ + +#ifdef TCPDEBUG +/* load symbolic names */ +#define PRUREQUESTS +#define TCPSTATES +#define TCPTIMERS +#define TANAMES +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef TCPDEBUG +int tcpconsdebug = 0; +#endif +/* + * Tcp debug routines + */ +void +tcp_trace(act, ostate, tp, ti, req) + short act, ostate; + struct tcpcb *tp; + struct tcpiphdr *ti; + int req; +{ + tcp_seq seq, ack; + int len, flags; + struct tcp_debug *td = &tcp_debug[tcp_debx++]; + + if (tcp_debx == TCP_NDEBUG) + tcp_debx = 0; + td->td_time = iptime(); + td->td_act = act; + td->td_ostate = ostate; + td->td_tcb = (caddr_t)tp; + if (tp) + td->td_cb = *tp; + else + bzero((caddr_t)&td->td_cb, sizeof (*tp)); + if (ti) + td->td_ti = *ti; + else + bzero((caddr_t)&td->td_ti, sizeof (*ti)); + td->td_req = req; +#ifdef TCPDEBUG + if (tcpconsdebug == 0) + return; + if (tp) + printf("%p %s:", tp, tcpstates[ostate]); + else + printf("???????? "); + printf("%s ", tanames[act]); + switch (act) { + + case TA_INPUT: + case TA_OUTPUT: + case TA_DROP: + if (ti == 0) + break; + seq = ti->ti_seq; + ack = ti->ti_ack; + len = ti->ti_len; + if (act == TA_OUTPUT) { + seq = ntohl(seq); + ack = ntohl(ack); + len = ntohs((u_short)len); + } + if (act == TA_OUTPUT) + len -= sizeof (struct tcphdr); + if (len) + printf("[%x..%x)", seq, seq+len); + else + printf("%x", seq); + printf("@%x, urp=%x", ack, ti->ti_urp); + flags = ti->ti_flags; + if (flags) { + char *cp = "<"; +#define pf(f) { \ + if (ti->ti_flags & TH_##f) { \ + printf("%s%s", cp, #f); \ + cp = ","; \ + } \ +} + pf(SYN); pf(ACK); pf(FIN); pf(RST); pf(PUSH); pf(URG); + printf(">"); + } + break; + + case TA_USER: + printf("%s", prurequests[req&0xff]); + if ((req & 0xff) == PRU_SLOWTIMO) + printf("<%s>", tcptimers[req>>8]); + break; + } + if (tp) + printf(" -> %s", tcpstates[tp->t_state]); + /* print out internal state of tp !?! */ + printf("\n"); + if (tp == 0) + return; + printf("\trcv_(nxt,wnd,up) (%x,%x,%x) snd_(una,nxt,max) (%x,%x,%x)\n", + tp->rcv_nxt, tp->rcv_wnd, tp->rcv_up, tp->snd_una, tp->snd_nxt, + tp->snd_max); + printf("\tsnd_(wl1,wl2,wnd) (%x,%x,%x)\n", + tp->snd_wl1, tp->snd_wl2, tp->snd_wnd); +#endif /* TCPDEBUG */ +} diff --git a/reactos/lib/oskittcp/oskittcp/tcp_input.c b/reactos/lib/oskittcp/oskittcp/tcp_input.c new file mode 100644 index 00000000000..260b695237f --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/tcp_input.c @@ -0,0 +1,2160 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1990, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * From: @(#)tcp_input.c 8.5 (Berkeley) 4/10/94 + */ + +#ifndef TUBA_INCLUDE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef TCPDEBUG +#include +struct tcpiphdr tcp_saveti; +#endif + +int tcprexmtthresh = 3; +tcp_seq tcp_iss; +tcp_cc tcp_ccgen; +struct tcpstat tcpstat; +u_long tcp_now; +struct inpcbhead tcb; +struct inpcbinfo tcbinfo; + +#endif /* TUBA_INCLUDE */ + +/* + * Insert segment ti into reassembly queue of tcp with + * control block tp. Return TH_FIN if reassembly now includes + * a segment with FIN. The macro form does the common case inline + * (segment is the next to be received on an established connection, + * and the queue is empty), avoiding linkage into and removal + * from the queue and repetition of various conversions. + * Set DELACK for segments received in order, but ack immediately + * when segments are out of order (so fast retransmit can work). + */ +#ifdef TCP_ACK_HACK +#define TCP_REASS(tp, ti, m, so, flags) { \ + if ((ti)->ti_seq == (tp)->rcv_nxt && \ + (tp)->seg_next == (struct tcpiphdr *)(tp) && \ + (tp)->t_state == TCPS_ESTABLISHED) { \ + if (ti->ti_flags & TH_PUSH) \ + tp->t_flags |= TF_ACKNOW; \ + else \ + tp->t_flags |= TF_DELACK; \ + (tp)->rcv_nxt += (ti)->ti_len - IPHDR_SIZE; \ + OS_DbgPrint(OSK_MID_TRACE,("Added %d to rcv_nxt\n", \ + (ti)->ti_len - IPHDR_SIZE)); \ + flags = (ti)->ti_flags & TH_FIN; \ + tcpstat.tcps_rcvpack++;\ + tcpstat.tcps_rcvbyte += (ti)->ti_len;\ + sbappend(so, &(so)->so_rcv, (m)); \ + sorwakeup(so); \ + } else { \ + (flags) = tcp_reass((tp), (ti), (m)); \ + tp->t_flags |= TF_ACKNOW; \ + } \ +} +#else +#define TCP_REASS(tp, ti, m, so, flags) { \ + if ((ti)->ti_seq == (tp)->rcv_nxt && \ + (tp)->seg_next == (struct tcpiphdr *)(tp) && \ + (tp)->t_state == TCPS_ESTABLISHED) { \ + tp->t_flags |= TF_DELACK; \ + (tp)->rcv_nxt += (ti)->ti_len - IPHDR_SIZE; \ + OS_DbgPrint(OSK_MID_TRACE,("Added %d to rcv_nxt\n", \ + (ti)->ti_len - IPHDR_SIZE)); \ + flags = (ti)->ti_flags & TH_FIN; \ + tcpstat.tcps_rcvpack++;\ + tcpstat.tcps_rcvbyte += (ti)->ti_len;\ + sbappend(so, &(so)->so_rcv, (m)); \ + sorwakeup(so); \ + } else { \ + (flags) = tcp_reass((tp), (ti), (m)); \ + tp->t_flags |= TF_ACKNOW; \ + } \ +} +#endif +#ifndef TUBA_INCLUDE + +int +tcp_reass(tp, ti, m) + register struct tcpcb *tp; + register struct tcpiphdr *ti; + struct mbuf *m; +{ + register struct tcpiphdr *q; + struct socket *so = tp->t_inpcb->inp_socket; + int flags; + + /* + * Call with ti==0 after become established to + * force pre-ESTABLISHED data up to user socket. + */ + if (ti == 0) + goto present; + + /* + * 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; + + /* + * If there is a preceding segment, it may provide some of + * our data already. If so, drop the data from the incoming + * segment. If it provides all of our data, drop us. + */ + if ((struct tcpiphdr *)q->ti_prev != (struct tcpiphdr *)tp) { + register int i; + q = (struct tcpiphdr *)q->ti_prev; + /* conversion to int (in i) handles seq wraparound */ + i = q->ti_seq + q->ti_len - ti->ti_seq; + if (i > 0) { + if (i >= ti->ti_len) { + tcpstat.tcps_rcvduppack++; + tcpstat.tcps_rcvdupbyte += ti->ti_len; + m_freem(m); + /* + * Try to present any queued data + * at the left window edge to the user. + * This is needed after the 3-WHS + * completes. + */ + goto present; /* ??? */ + } + m_adj(m, i); + ti->ti_len -= i; + ti->ti_seq += i; + } + q = (struct tcpiphdr *)(q->ti_next); + } + tcpstat.tcps_rcvoopack++; + tcpstat.tcps_rcvoobyte += ti->ti_len; + REASS_MBUF(ti) = m; /* XXX */ + + /* + * While we overlap succeeding segments trim them or, + * if they are completely covered, dequeue them. + */ + while (q != (struct tcpiphdr *)tp) { + register int i = (ti->ti_seq + ti->ti_len) - q->ti_seq; + if (i <= 0) + break; + if (i < q->ti_len) { + q->ti_seq += i; + q->ti_len -= i; + m_adj(REASS_MBUF(q), i); + break; + } + q = (struct tcpiphdr *)q->ti_next; + m = REASS_MBUF((struct tcpiphdr *)q->ti_prev); + remque(q->ti_prev); + m_freem(m); + } + + /* + * Stick new segment in its place. + */ + insque(ti, q->ti_prev); + +present: + /* + * Present data to user, advancing rcv_nxt through + * completed sequence space. + */ + if (!TCPS_HAVEESTABLISHED(tp->t_state)) + return (0); + ti = tp->seg_next; + if (ti == (struct tcpiphdr *)tp || ti->ti_seq != tp->rcv_nxt) + return (0); + do { + tp->rcv_nxt += ti->ti_len; + OS_DbgPrint(OSK_MID_TRACE,("Added %d to rcv_nxt\n", + ti->ti_len)); + flags = ti->ti_flags & TH_FIN; + remque(ti); + m = REASS_MBUF(ti); + ti = (struct tcpiphdr *)ti->ti_next; + if (so->so_state & SS_CANTRCVMORE) + m_freem(m); + else + sbappend(so, &so->so_rcv, m); + } while (ti != (struct tcpiphdr *)tp && ti->ti_seq == tp->rcv_nxt); + sorwakeup(so); + return (flags); +} + +/* + * TCP input routine, follows pages 65-76 of the + * protocol specification dated September, 1981 very closely. + */ +void +tcp_input(m, iphlen) + register struct mbuf *m; + int iphlen; +{ + register struct tcpiphdr *ti; + register struct inpcb *inp; + caddr_t optp = NULL; + int optlen = 0; + int len, tlen, off; + register struct tcpcb *tp = 0; + register int tiflags; + struct socket *so = 0; + int todrop, acked, ourfinisacked, needoutput = 0; + struct in_addr laddr; + int dropsocket = 0; + int iss = 0; + u_long tiwin; + struct tcpopt to; /* options in this segment */ + struct rmxp_tao *taop; /* pointer to our TAO cache entry */ + struct rmxp_tao tao_noncached; /* in case there's no cached entry */ +#ifdef TCPDEBUG + short ostate = 0; +#endif + + bzero((char *)&to, sizeof(to)); + + tcpstat.tcps_rcvtotal++; + /* + * Get IP and TCP header together in first mbuf. + * Note: IP leaves IP header in first mbuf. + */ + ti = mtod(m, struct tcpiphdr *); + if (iphlen > sizeof (struct ip)) + ip_stripoptions(m, (struct mbuf *)0); + if (m->m_len < sizeof (struct tcpiphdr)) { + if ((m = m_pullup(m, sizeof (struct tcpiphdr))) == 0) { + tcpstat.tcps_rcvshort++; + return; + } + ti = mtod(m, struct tcpiphdr *); + } + + /* + * Checksum extended TCP header and data. + */ + tlen = ntohs(((struct ip *)ti)->ip_len); + len = sizeof (struct ip); + OS_DbgPrint(OSK_MID_TRACE,("tlen = %x, len = %x, m_len = %d\n", tlen, len, m->m_len)); + OS_DbgPrint(OSK_MID_TRACE,("ti->ti_len = %x\n", htons(ti->ti_len))); + ti->ti_sum = in_cksum(m, len); + OskitDumpBuffer(m->m_data, len); + ti->ti_next = ti->ti_prev = 0; + ti->ti_x1 = 0; + if (ti->ti_sum) { + tcpstat.tcps_rcvbadsum++; + OS_DbgPrint(OSK_MID_TRACE,("Dropping packet due to bad csum (%x)\n", ti->ti_sum)); + goto drop; + } + ti->ti_len = htons((u_short)tlen); +#endif /* TUBA_INCLUDE */ + + /* + * Check that TCP offset makes sense, + * pull out TCP options and adjust length. XXX + */ + off = ti->ti_off << 2; + if (off < sizeof (struct tcphdr) || off > tlen) { + tcpstat.tcps_rcvbadoff++; + goto drop; + } + tlen -= off; + ti->ti_len = tlen; + if (off > sizeof (struct tcphdr)) { + if (m->m_len < sizeof(struct ip) + off) { + if ((m = m_pullup(m, sizeof (struct ip) + off)) == 0) { + tcpstat.tcps_rcvshort++; + return; + } + ti = mtod(m, struct tcpiphdr *); + } + optlen = off - sizeof (struct tcphdr); + optp = mtod(m, caddr_t) + sizeof (struct tcpiphdr); + } + tiflags = ti->ti_flags; + + /* + * Convert TCP protocol specific fields to host format. + */ + NTOHL(ti->ti_seq); + NTOHL(ti->ti_ack); + NTOHS(ti->ti_win); + NTOHS(ti->ti_urp); + + /* + * Drop TCP, IP headers and TCP options. + */ + m->m_data += sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr); + m->m_len -= sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr); + + /* + * Locate pcb for segment. + */ +findpcb: + /* + * First look for an exact match. + */ + inp = in_pcblookuphash(&tcbinfo, ti->ti_src, ti->ti_sport, + ti->ti_dst, ti->ti_dport); + /* + * ...and if that fails, do a wildcard search. + */ + if (inp == NULL) { + inp = in_pcblookup(&tcb, ti->ti_src, ti->ti_sport, + ti->ti_dst, ti->ti_dport, INPLOOKUP_WILDCARD); + } + + /* + * If the state is CLOSED (i.e., TCB does not exist) then + * all data in the incoming segment is discarded. + * If the TCB exists but is in CLOSED state, it is embryonic, + * but should either do a listen or a connect soon. + */ + if (inp == NULL) + goto dropwithreset; + tp = intotcpcb(inp); + if (tp == 0) + goto dropwithreset; + if (tp->t_state == TCPS_CLOSED) + goto drop; + + /* Unscale the window into a 32-bit value. */ + if ((tiflags & TH_SYN) == 0) + tiwin = ti->ti_win << tp->snd_scale; + else + tiwin = ti->ti_win; + + so = inp->inp_socket; + if (so->so_options & (SO_DEBUG|SO_ACCEPTCONN)) { +#ifdef TCPDEBUG + if (so->so_options & SO_DEBUG) { + ostate = tp->t_state; + tcp_saveti = *ti; + } +#endif + if (so->so_options & SO_ACCEPTCONN) { + register struct tcpcb *tp0 = tp; + struct socket *so2; + if ((tiflags & (TH_RST|TH_ACK|TH_SYN)) != TH_SYN) { + /* + * Note: dropwithreset makes sure we don't + * send a RST in response to a RST. + */ + if (tiflags & TH_ACK) { + tcpstat.tcps_badsyn++; + goto dropwithreset; + } + goto drop; + } + so2 = sonewconn(so, 0); + if (so2 == 0) { + unsigned int i, j, qlen; + + static int rnd; + static long old_mono_secs; + static unsigned int cur_cnt, old_cnt; + + tcpstat.tcps_listendrop++; + + /* + * Keep a decaying average of the number + * of overruns we've been getting. + */ + if ((i = (mono_time.tv_sec - + old_mono_secs)) != 0) { + old_mono_secs = mono_time.tv_sec; + old_cnt = cur_cnt / i; + cur_cnt = 0; + } + + so2 = so->so_q0; + if (so2 == 0) + goto drop; + + /* + * If we've been getting a lot of hits, + * random drop an incomplete connection + * from the queue, otherwise, fall through + * so we head-drop from the queue. + */ + qlen = so->so_q0len; + if (++cur_cnt > qlen || old_cnt > qlen) { + rnd = (314159 * rnd + 66329) & 0xffff; + j = ((qlen + 1) * rnd) >> 16; + + while (j-- && so2) + so2 = so2->so_q0; + } + if (so2) { + tcp_drop(sototcpcb(so2), ETIMEDOUT); + so2 = sonewconn(so, 0); + } + if (!so2) + goto drop; + } + so = so2; + /* + * This is ugly, but .... + * + * Mark socket as temporary until we're + * committed to keeping it. The code at + * ``drop'' and ``dropwithreset'' check the + * flag dropsocket to see if the temporary + * socket created here should be discarded. + * We mark the socket as discardable until + * we're committed to it below in TCPS_LISTEN. + */ + dropsocket++; + inp = (struct inpcb *)so->so_pcb; + inp->inp_laddr = ti->ti_dst; + inp->inp_lport = ti->ti_dport; + in_pcbrehash(inp); +#if BSD>=43 + inp->inp_options = ip_srcroute(); +#endif + tp = intotcpcb(inp); + tp->t_state = TCPS_LISTEN; + tp->t_flags |= tp0->t_flags & (TF_NOPUSH|TF_NOOPT); + + /* Compute proper scaling value from buffer space */ + while (tp->request_r_scale < TCP_MAX_WINSHIFT && + TCP_MAXWIN << tp->request_r_scale < so->so_rcv.sb_hiwat) + tp->request_r_scale++; + } + } + + /* + * Segment received on connection. + * Reset idle time and keep-alive timer. + */ + tp->t_idle = 0; + if (TCPS_HAVEESTABLISHED(tp->t_state)) + tp->t_timer[TCPT_KEEP] = tcp_keepidle; + + /* + * Process options if not in LISTEN state, + * else do it below (after getting remote address). + */ + if (tp->t_state != TCPS_LISTEN) + tcp_dooptions(tp, optp, optlen, ti, &to); + + /* + * Header prediction: check for the two common cases + * of a uni-directional data xfer. If the packet has + * no control flags, is in-sequence, the window didn't + * change and we're not retransmitting, it's a + * candidate. If the length is zero and the ack moved + * forward, we're the sender side of the xfer. Just + * free the data acked & wake any higher level process + * that was blocked waiting for space. If the length + * is non-zero and the ack didn't move, we're the + * receiver side. If we're getting packets in-order + * (the reassembly queue is empty), add the data to + * the socket buffer and note that we need a delayed ack. + * Make sure that the hidden state-flags are also off. + * Since we check for TCPS_ESTABLISHED above, it can only + * be TH_NEEDSYN. + */ + if (tp->t_state == TCPS_ESTABLISHED && + (tiflags & (TH_SYN|TH_FIN|TH_RST|TH_URG|TH_ACK)) == TH_ACK && + ((tp->t_flags & (TF_NEEDSYN|TF_NEEDFIN)) == 0) && + ((to.to_flag & TOF_TS) == 0 || + TSTMP_GEQ(to.to_tsval, tp->ts_recent)) && + /* + * Using the CC option is compulsory if once started: + * the segment is OK if no T/TCP was negotiated or + * if the segment has a CC option equal to CCrecv + */ + ((tp->t_flags & (TF_REQ_CC|TF_RCVD_CC)) != (TF_REQ_CC|TF_RCVD_CC) || + (to.to_flag & TOF_CC) != 0 && to.to_cc == tp->cc_recv) && + ti->ti_seq == tp->rcv_nxt && + tiwin && tiwin == tp->snd_wnd && + tp->snd_nxt == tp->snd_max) { + + /* + * If last ACK falls within this segment's sequence numbers, + * record the timestamp. + * NOTE that the test is modified according to the latest + * proposal of the tcplw@cray.com list (Braden 1993/04/26). + */ + if ((to.to_flag & TOF_TS) != 0 && + SEQ_LEQ(ti->ti_seq, tp->last_ack_sent)) { + tp->ts_recent_age = tcp_now; + tp->ts_recent = to.to_tsval; + } + + if (ti->ti_len == 0) { + if (SEQ_GT(ti->ti_ack, tp->snd_una) && + SEQ_LEQ(ti->ti_ack, tp->snd_max) && + tp->snd_cwnd >= tp->snd_wnd) { + /* + * this is a pure ack for outstanding data. + */ + ++tcpstat.tcps_predack; + if ((to.to_flag & TOF_TS) != 0) + tcp_xmit_timer(tp, + tcp_now - to.to_tsecr + 1); + else if (tp->t_rtt && + SEQ_GT(ti->ti_ack, tp->t_rtseq)) + tcp_xmit_timer(tp, tp->t_rtt); + acked = ti->ti_ack - tp->snd_una; + tcpstat.tcps_rcvackpack++; + tcpstat.tcps_rcvackbyte += acked; + sbdrop(&so->so_snd, acked); + tp->snd_una = ti->ti_ack; + m_freem(m); + + /* + * If all outstanding data are acked, stop + * retransmit timer, otherwise restart timer + * using current (possibly backed-off) value. + * If process is waiting for space, + * wakeup/selwakeup/signal. If data + * are ready to send, let tcp_output + * decide between more output or persist. + */ + if (tp->snd_una == tp->snd_max) + tp->t_timer[TCPT_REXMT] = 0; + else if (tp->t_timer[TCPT_PERSIST] == 0) + tp->t_timer[TCPT_REXMT] = tp->t_rxtcur; + + if (so->so_snd.sb_flags & SB_NOTIFY) + sowwakeup(so); + if (so->so_snd.sb_cc) + (void) tcp_output(tp); + return; + } + } else if (ti->ti_ack == tp->snd_una && + tp->seg_next == (struct tcpiphdr *)tp && + ti->ti_len <= sbspace(&so->so_rcv)) { + /* + * this is a pure, in-sequence data packet + * with nothing on the reassembly queue and + * we have enough buffer space to take it. + */ + ++tcpstat.tcps_preddat; + tp->rcv_nxt += ti->ti_len; + OS_DbgPrint(OSK_MID_TRACE,("Added %d to rcv_nxt\n", + ti->ti_len)); + tcpstat.tcps_rcvpack++; + tcpstat.tcps_rcvbyte += ti->ti_len; + /* + * Add data to socket buffer. + */ + sbappend(so, &so->so_rcv, m); + sorwakeup(so); +#ifdef TCP_ACK_HACK + /* + * If this is a short packet, then ACK now - with Nagel + * congestion avoidance sender won't send more until + * he gets an ACK. + */ + if (tiflags & TH_PUSH) { + tp->t_flags |= TF_ACKNOW; + tcp_output(tp); + } else { + tp->t_flags |= TF_DELACK; + } +#else + tp->t_flags |= TF_DELACK; +#endif + return; + } + } + + /* + * Calculate amount of space in receive window, + * and then do TCP input processing. + * Receive window is amount of space in rcv queue, + * but not less than advertised window. + */ + { int win; + + win = sbspace(&so->so_rcv); + if (win < 0) + win = 0; + tp->rcv_wnd = max(win, (int)(tp->rcv_adv - tp->rcv_nxt)); + } + + switch (tp->t_state) { + + /* + * If the state is LISTEN then ignore segment if it contains an RST. + * If the segment contains an ACK then it is bad and send a RST. + * If it does not contain a SYN then it is not interesting; drop it. + * Don't bother responding if the destination was a broadcast. + * Otherwise initialize tp->rcv_nxt, and tp->irs, select an initial + * tp->iss, and send a segment: + * + * Also initialize tp->snd_nxt to tp->iss+1 and tp->snd_una to tp->iss. + * Fill in remote peer address fields if not previously specified. + * Enter SYN_RECEIVED state, and process any other fields of this + * segment in this state. + */ + case TCPS_LISTEN: { + struct mbuf *am; + register struct sockaddr_in *sin; + + if (tiflags & TH_RST) + goto drop; + if (tiflags & TH_ACK) + goto dropwithreset; + if ((tiflags & TH_SYN) == 0) + goto drop; + /* + * RFC1122 4.2.3.10, p. 104: discard bcast/mcast SYN + * in_broadcast() should never return true on a received + * packet with M_BCAST not set. + */ + if (m->m_flags & (M_BCAST|M_MCAST) || + IN_MULTICAST(ntohl(ti->ti_dst.s_addr))) + goto drop; + am = m_get(M_DONTWAIT, MT_SONAME); /* XXX */ + if (am == NULL) + goto drop; + am->m_len = sizeof (struct sockaddr_in); + sin = mtod(am, struct sockaddr_in *); + sin->sin_family = AF_INET; + /*sin->sin_len = sizeof(*sin); */ + sin->sin_addr = ti->ti_src; + sin->sin_port = ti->ti_sport; + bzero((caddr_t)sin->sin_zero, sizeof(sin->sin_zero)); + laddr = inp->inp_laddr; + if (inp->inp_laddr.s_addr == INADDR_ANY) + inp->inp_laddr = ti->ti_dst; + if (in_pcbconnect(inp, am)) { + inp->inp_laddr = laddr; + /*(void) m_free(am);*/ + goto drop; + } + /*(void) m_free(am);*/ + tp->t_template = tcp_template(tp); + if (tp->t_template == 0) { + tp = tcp_drop(tp, ENOBUFS); + dropsocket = 0; /* socket is already gone */ + goto drop; + } + if ((taop = tcp_gettaocache(inp)) == NULL) { + taop = &tao_noncached; + bzero(taop, sizeof(*taop)); + } + tcp_dooptions(tp, optp, optlen, ti, &to); + if (iss) + tp->iss = iss; + else + tp->iss = tcp_iss; + tcp_iss += TCP_ISSINCR/2; + tp->irs = ti->ti_seq; + tcp_sendseqinit(tp); + tcp_rcvseqinit(tp); + /* + * Initialization of the tcpcb for transaction; + * set SND.WND = SEG.WND, + * initialize CCsend and CCrecv. + */ + tp->snd_wnd = tiwin; /* initial send-window */ + tp->cc_send = CC_INC(tcp_ccgen); + tp->cc_recv = to.to_cc; + /* + * Perform TAO test on incoming CC (SEG.CC) option, if any. + * - compare SEG.CC against cached CC from the same host, + * if any. + * - if SEG.CC > chached value, SYN must be new and is accepted + * immediately: save new CC in the cache, mark the socket + * connected, enter ESTABLISHED state, turn on flag to + * send a SYN in the next segment. + * A virtual advertised window is set in rcv_adv to + * initialize SWS prevention. Then enter normal segment + * processing: drop SYN, process data and FIN. + * - otherwise do a normal 3-way handshake. + */ + if ((to.to_flag & TOF_CC) != 0) { + if (taop->tao_cc != 0 && CC_GT(to.to_cc, taop->tao_cc)) { + taop->tao_cc = to.to_cc; + tp->t_state = TCPS_ESTABLISHED; + + /* + * If there is a FIN, or if there is data and the + * connection is local, then delay SYN,ACK(SYN) in + * the hope of piggy-backing it on a response + * segment. Otherwise must send ACK now in case + * the other side is slow starting. + */ + if ((tiflags & TH_FIN) || (ti->ti_len != 0 && + in_localaddr(inp->inp_faddr))) + tp->t_flags |= (TF_DELACK | TF_NEEDSYN); + else + tp->t_flags |= (TF_ACKNOW | TF_NEEDSYN); + + /* + * Limit the `virtual advertised window' to TCP_MAXWIN + * here. Even if we requested window scaling, it will + * become effective only later when our SYN is acked. + */ + tp->rcv_adv += min(tp->rcv_wnd, TCP_MAXWIN); + tcpstat.tcps_connects++; + soisconnected(so); + tp->t_timer[TCPT_KEEP] = tcp_keepinit; + dropsocket = 0; /* committed to socket */ + tcpstat.tcps_accepts++; + goto trimthenstep6; + } + /* else do standard 3-way handshake */ + } else { + /* + * No CC option, but maybe CC.NEW: + * invalidate cached value. + */ + taop->tao_cc = 0; + } + /* + * TAO test failed or there was no CC option, + * do a standard 3-way handshake. + */ + tp->t_flags |= TF_ACKNOW; + tp->t_state = TCPS_SYN_RECEIVED; + tp->t_timer[TCPT_KEEP] = tcp_keepinit; + dropsocket = 0; /* committed to socket */ + tcpstat.tcps_accepts++; + goto trimthenstep6; + } + + /* + * If the state is SYN_RECEIVED: + * do just the ack and RST checks from SYN_SENT state. + * If the state is SYN_SENT: + * if seg contains an ACK, but not for our SYN, drop the input. + * if seg contains a RST, then drop the connection. + * if seg does not contain SYN, then drop it. + * Otherwise this is an acceptable SYN segment + * initialize tp->rcv_nxt and tp->irs + * if seg contains ack then advance tp->snd_una + * if SYN has been acked change to ESTABLISHED else SYN_RCVD state + * arrange for segment to be acked (eventually) + * continue processing rest of data/controls, beginning with URG + */ + case TCPS_SYN_RECEIVED: + case TCPS_SYN_SENT: + if ((taop = tcp_gettaocache(inp)) == NULL) { + taop = &tao_noncached; + bzero(taop, sizeof(*taop)); + } + + if ((tiflags & TH_ACK) && + (SEQ_LEQ(ti->ti_ack, tp->iss) || + SEQ_GT(ti->ti_ack, tp->snd_max))) { + /* + * If we have a cached CCsent for the remote host, + * hence we haven't just crashed and restarted, + * do not send a RST. This may be a retransmission + * from the other side after our earlier ACK was lost. + * Our new SYN, when it arrives, will serve as the + * needed ACK. + */ + if (taop->tao_ccsent != 0) + goto drop; + else + goto dropwithreset; + } + if (tiflags & TH_RST) { + if (tiflags & TH_ACK) + tp = tcp_drop(tp, ECONNREFUSED); + goto drop; + } + if (tp->t_state == TCPS_SYN_RECEIVED) + break; + if ((tiflags & TH_SYN) == 0) + goto drop; + tp->snd_wnd = ti->ti_win; /* initial send window */ + tp->cc_recv = to.to_cc; /* foreign CC */ + + tp->irs = ti->ti_seq; + tcp_rcvseqinit(tp); + if (tiflags & TH_ACK) { + /* + * Our SYN was acked. If segment contains CC.ECHO + * option, check it to make sure this segment really + * matches our SYN. If not, just drop it as old + * duplicate, but send an RST if we're still playing + * by the old rules. + */ + if ((to.to_flag & TOF_CCECHO) && + tp->cc_send != to.to_ccecho) { + if (taop->tao_ccsent != 0) + goto drop; + else + goto dropwithreset; + } + tcpstat.tcps_connects++; + soisconnected(so); + /* Do window scaling on this connection? */ + if ((tp->t_flags & (TF_RCVD_SCALE|TF_REQ_SCALE)) == + (TF_RCVD_SCALE|TF_REQ_SCALE)) { + tp->snd_scale = tp->requested_s_scale; + tp->rcv_scale = tp->request_r_scale; + } + /* Segment is acceptable, update cache if undefined. */ + if (taop->tao_ccsent == 0) + taop->tao_ccsent = to.to_ccecho; + + tp->rcv_adv += tp->rcv_wnd; + tp->snd_una++; /* SYN is acked */ + /* + * If there's data, delay ACK; if there's also a FIN + * ACKNOW will be turned on later. + */ + if (ti->ti_len != 0) + tp->t_flags |= TF_DELACK; + else + tp->t_flags |= TF_ACKNOW; + /* + * Received in SYN_SENT[*] state. + * Transitions: + * SYN_SENT --> ESTABLISHED + * SYN_SENT* --> FIN_WAIT_1 + */ + if (tp->t_flags & TF_NEEDFIN) { + tp->t_state = TCPS_FIN_WAIT_1; + tp->t_flags &= ~TF_NEEDFIN; + tiflags &= ~TH_SYN; + } else { + OS_DbgPrint + (OSK_MID_TRACE, + ("Socket %x entered ESTABLISHED state\n", + so)); + tp->t_state = TCPS_ESTABLISHED; + tp->t_timer[TCPT_KEEP] = tcp_keepidle; + } + } else { + /* + * Received initial SYN in SYN-SENT[*] state => simul- + * taneous open. If segment contains CC option and there is + * a cached CC, apply TAO test; if it succeeds, connection is + * half-synchronized. Otherwise, do 3-way handshake: + * SYN-SENT -> SYN-RECEIVED + * SYN-SENT* -> SYN-RECEIVED* + * If there was no CC option, clear cached CC value. + */ + tp->t_flags |= TF_ACKNOW; + tp->t_timer[TCPT_REXMT] = 0; + if (to.to_flag & TOF_CC) { + if (taop->tao_cc != 0 && + CC_GT(to.to_cc, taop->tao_cc)) { + /* + * update cache and make transition: + * SYN-SENT -> ESTABLISHED* + * SYN-SENT* -> FIN-WAIT-1* + */ + taop->tao_cc = to.to_cc; + if (tp->t_flags & TF_NEEDFIN) { + tp->t_state = TCPS_FIN_WAIT_1; + tp->t_flags &= ~TF_NEEDFIN; + } else { + tp->t_state = TCPS_ESTABLISHED; + tp->t_timer[TCPT_KEEP] = tcp_keepidle; + } + tp->t_flags |= TF_NEEDSYN; + } else + tp->t_state = TCPS_SYN_RECEIVED; + } else { + /* CC.NEW or no option => invalidate cache */ + taop->tao_cc = 0; + tp->t_state = TCPS_SYN_RECEIVED; + } + } + +trimthenstep6: + /* + * Advance ti->ti_seq to correspond to first data byte. + * If data, trim to stay within window, + * dropping FIN if necessary. + */ + ti->ti_seq++; + if (ti->ti_len > tp->rcv_wnd) { + todrop = ti->ti_len - tp->rcv_wnd; + m_adj(m, -todrop); + ti->ti_len = tp->rcv_wnd; + tiflags &= ~TH_FIN; + tcpstat.tcps_rcvpackafterwin++; + tcpstat.tcps_rcvbyteafterwin += todrop; + } + tp->snd_wl1 = ti->ti_seq - 1; + tp->rcv_up = ti->ti_seq; + /* + * Client side of transaction: already sent SYN and data. + * If the remote host used T/TCP to validate the SYN, + * our data will be ACK'd; if so, enter normal data segment + * processing in the middle of step 5, ack processing. + * Otherwise, goto step 6. + */ + if (tiflags & TH_ACK) + goto process_ACK; + goto step6; + /* + * If the state is LAST_ACK or CLOSING or TIME_WAIT: + * if segment contains a SYN and CC [not CC.NEW] option: + * if state == TIME_WAIT and connection duration > MSL, + * drop packet and send RST; + * + * if SEG.CC > CCrecv then is new SYN, and can implicitly + * ack the FIN (and data) in retransmission queue. + * Complete close and delete TCPCB. Then reprocess + * segment, hoping to find new TCPCB in LISTEN state; + * + * else must be old SYN; drop it. + * else do normal processing. + */ + case TCPS_LAST_ACK: + case TCPS_CLOSING: + case TCPS_TIME_WAIT: + if ((tiflags & TH_SYN) && + (to.to_flag & TOF_CC) && tp->cc_recv != 0) { + if (tp->t_state == TCPS_TIME_WAIT && + tp->t_duration > TCPTV_MSL) + goto dropwithreset; + if (CC_GT(to.to_cc, tp->cc_recv)) { + tp = tcp_close(tp); + goto findpcb; + } + else + goto drop; + } + break; /* continue normal processing */ + } + + /* + * States other than LISTEN or SYN_SENT. + * First check timestamp, if present. + * Then check the connection count, if present. + * Then check that at least some bytes of segment are within + * receive window. If segment begins before rcv_nxt, + * drop leading data (and SYN); if nothing left, just ack. + * + * RFC 1323 PAWS: If we have a timestamp reply on this segment + * and it's less than ts_recent, drop it. + */ + if ((to.to_flag & TOF_TS) != 0 && (tiflags & TH_RST) == 0 && + tp->ts_recent && TSTMP_LT(to.to_tsval, tp->ts_recent)) { + + /* Check to see if ts_recent is over 24 days old. */ + if ((int)(tcp_now - tp->ts_recent_age) > TCP_PAWS_IDLE) { + /* + * Invalidate ts_recent. If this segment updates + * ts_recent, the age will be reset later and ts_recent + * will get a valid value. If it does not, setting + * ts_recent to zero will at least satisfy the + * requirement that zero be placed in the timestamp + * echo reply when ts_recent isn't valid. The + * age isn't reset until we get a valid ts_recent + * because we don't want out-of-order segments to be + * dropped when ts_recent is old. + */ + tp->ts_recent = 0; + } else { + tcpstat.tcps_rcvduppack++; + tcpstat.tcps_rcvdupbyte += ti->ti_len; + tcpstat.tcps_pawsdrop++; + goto dropafterack; + } + } + + /* + * T/TCP mechanism + * If T/TCP was negotiated and the segment doesn't have CC, + * or if it's CC is wrong then drop the segment. + * RST segments do not have to comply with this. + */ + if ((tp->t_flags & (TF_REQ_CC|TF_RCVD_CC)) == (TF_REQ_CC|TF_RCVD_CC) && + ((to.to_flag & TOF_CC) == 0 || tp->cc_recv != to.to_cc) && + (tiflags & TH_RST) == 0) + goto dropafterack; + + todrop = tp->rcv_nxt - ti->ti_seq; + if (todrop > 0) { + if (tiflags & TH_SYN) { + tiflags &= ~TH_SYN; + ti->ti_seq++; + if (ti->ti_urp > 1) + ti->ti_urp--; + else + tiflags &= ~TH_URG; + todrop--; + } + /* + * Following if statement from Stevens, vol. 2, p. 960. + */ + if (todrop > ti->ti_len + || (todrop == ti->ti_len && (tiflags & TH_FIN) == 0)) { + /* + * Any valid FIN must be to the left of the window. + * At this point the FIN must be a duplicate or out + * of sequence; drop it. + */ + tiflags &= ~TH_FIN; + + /* + * Send an ACK to resynchronize and drop any data. + * But keep on processing for RST or ACK. + */ + tp->t_flags |= TF_ACKNOW; + todrop = ti->ti_len; + tcpstat.tcps_rcvduppack++; + tcpstat.tcps_rcvdupbyte += todrop; + } else { + tcpstat.tcps_rcvpartduppack++; + tcpstat.tcps_rcvpartdupbyte += todrop; + } + m_adj(m, todrop); + ti->ti_seq += todrop; + ti->ti_len -= todrop; + if (ti->ti_urp > todrop) + ti->ti_urp -= todrop; + else { + tiflags &= ~TH_URG; + ti->ti_urp = 0; + } + } + + /* + * If new data are received on a connection after the + * user processes are gone, then RST the other end. + */ + if ((so->so_state & SS_NOFDREF) && + tp->t_state > TCPS_CLOSE_WAIT && ti->ti_len) { + tp = tcp_close(tp); + tcpstat.tcps_rcvafterclose++; + goto dropwithreset; + } + + /* + * If segment ends after window, drop trailing data + * (and PUSH and FIN); if nothing left, just ACK. + */ + todrop = (ti->ti_seq+ti->ti_len) - (tp->rcv_nxt+tp->rcv_wnd); + if (todrop > 0) { + tcpstat.tcps_rcvpackafterwin++; + if (todrop >= ti->ti_len) { + tcpstat.tcps_rcvbyteafterwin += ti->ti_len; + /* + * If a new connection request is received + * while in TIME_WAIT, drop the old connection + * and start over if the sequence numbers + * are above the previous ones. + */ + if (tiflags & TH_SYN && + tp->t_state == TCPS_TIME_WAIT && + SEQ_GT(ti->ti_seq, tp->rcv_nxt)) { + iss = tp->rcv_nxt + TCP_ISSINCR; + tp = tcp_close(tp); + goto findpcb; + } + /* + * If window is closed can only take segments at + * window edge, and have to drop data and PUSH from + * incoming segments. Continue processing, but + * remember to ack. Otherwise, drop segment + * and ack. + */ + if (tp->rcv_wnd == 0 && ti->ti_seq == tp->rcv_nxt) { + tp->t_flags |= TF_ACKNOW; + tcpstat.tcps_rcvwinprobe++; + } else + goto dropafterack; + } else + tcpstat.tcps_rcvbyteafterwin += todrop; + m_adj(m, -todrop); + ti->ti_len -= todrop; + tiflags &= ~(TH_PUSH|TH_FIN); + } + + /* + * If last ACK falls within this segment's sequence numbers, + * record its timestamp. + * NOTE that the test is modified according to the latest + * proposal of the tcplw@cray.com list (Braden 1993/04/26). + */ + if ((to.to_flag & TOF_TS) != 0 && + SEQ_LEQ(ti->ti_seq, tp->last_ack_sent)) { + tp->ts_recent_age = tcp_now; + tp->ts_recent = to.to_tsval; + } + + /* + * If the RST bit is set examine the state: + * SYN_RECEIVED STATE: + * If passive open, return to LISTEN state. + * If active open, inform user that connection was refused. + * ESTABLISHED, FIN_WAIT_1, FIN_WAIT2, CLOSE_WAIT STATES: + * Inform user that connection was reset, and close tcb. + * CLOSING, LAST_ACK, TIME_WAIT STATES + * Close the tcb. + */ + if (tiflags&TH_RST) switch (tp->t_state) { + + case TCPS_SYN_RECEIVED: + so->so_error = ECONNREFUSED; + goto close; + + case TCPS_ESTABLISHED: + case TCPS_FIN_WAIT_1: + case TCPS_FIN_WAIT_2: + case TCPS_CLOSE_WAIT: + so->so_error = ECONNRESET; + close: + tp->t_state = TCPS_CLOSED; + tcpstat.tcps_drops++; + tp = tcp_close(tp); + goto drop; + + case TCPS_CLOSING: + case TCPS_LAST_ACK: + case TCPS_TIME_WAIT: + tp = tcp_close(tp); + goto drop; + } + + /* + * If a SYN is in the window, then this is an + * error and we send an RST and drop the connection. + */ + if (tiflags & TH_SYN) { + tp = tcp_drop(tp, ECONNRESET); + goto dropwithreset; + } + + /* + * If the ACK bit is off: if in SYN-RECEIVED state or SENDSYN + * flag is on (half-synchronized state), then queue data for + * later processing; else drop segment and return. + */ + if ((tiflags & TH_ACK) == 0) { + if (tp->t_state == TCPS_SYN_RECEIVED || + (tp->t_flags & TF_NEEDSYN)) + goto step6; + else + goto drop; + } + + /* + * Ack processing. + */ + switch (tp->t_state) { + + /* + * In SYN_RECEIVED state if the ack ACKs our SYN then enter + * ESTABLISHED state and continue processing, otherwise + * send an RST. + */ + case TCPS_SYN_RECEIVED: + if (SEQ_GT(tp->snd_una, ti->ti_ack) || + SEQ_GT(ti->ti_ack, tp->snd_max)) + goto dropwithreset; + + tcpstat.tcps_connects++; + soisconnected(so); + /* Do window scaling? */ + if ((tp->t_flags & (TF_RCVD_SCALE|TF_REQ_SCALE)) == + (TF_RCVD_SCALE|TF_REQ_SCALE)) { + tp->snd_scale = tp->requested_s_scale; + tp->rcv_scale = tp->request_r_scale; + } + /* + * Upon successful completion of 3-way handshake, + * update cache.CC if it was undefined, pass any queued + * data to the user, and advance state appropriately. + */ + if ((taop = tcp_gettaocache(inp)) != NULL && + taop->tao_cc == 0) + taop->tao_cc = tp->cc_recv; + + /* + * Make transitions: + * SYN-RECEIVED -> ESTABLISHED + * SYN-RECEIVED* -> FIN-WAIT-1 + */ + if (tp->t_flags & TF_NEEDFIN) { + tp->t_state = TCPS_FIN_WAIT_1; + tp->t_flags &= ~TF_NEEDFIN; + } else { + tp->t_state = TCPS_ESTABLISHED; + tp->t_timer[TCPT_KEEP] = tcp_keepidle; + } + /* + * If segment contains data or ACK, will call tcp_reass() + * later; if not, do so now to pass queued data to user. + */ + if (ti->ti_len == 0 && (tiflags & TH_FIN) == 0) + (void) tcp_reass(tp, (struct tcpiphdr *)0, + (struct mbuf *)0); + tp->snd_wl1 = ti->ti_seq - 1; + /* fall into ... */ + + /* + * In ESTABLISHED state: drop duplicate ACKs; ACK out of range + * ACKs. If the ack is in the range + * tp->snd_una < ti->ti_ack <= tp->snd_max + * then advance tp->snd_una to ti->ti_ack and drop + * data from the retransmission queue. If this ACK reflects + * more up to date window information we update our window information. + */ + case TCPS_ESTABLISHED: + case TCPS_FIN_WAIT_1: + case TCPS_FIN_WAIT_2: + case TCPS_CLOSE_WAIT: + case TCPS_CLOSING: + case TCPS_LAST_ACK: + case TCPS_TIME_WAIT: + + if (SEQ_LEQ(ti->ti_ack, tp->snd_una)) { + if (ti->ti_len == 0 && tiwin == tp->snd_wnd) { + tcpstat.tcps_rcvdupack++; + /* + * If we have outstanding data (other than + * a window probe), this is a completely + * duplicate ack (ie, window info didn't + * change), the ack is the biggest we've + * seen and we've seen exactly our rexmt + * threshhold of them, assume a packet + * has been dropped and retransmit it. + * Kludge snd_nxt & the congestion + * window so we send only this one + * packet. + * + * We know we're losing at the current + * window size so do congestion avoidance + * (set ssthresh to half the current window + * and pull our congestion window back to + * the new ssthresh). + * + * Dup acks mean that packets have left the + * network (they're now cached at the receiver) + * so bump cwnd by the amount in the receiver + * to keep a constant cwnd packets in the + * network. + */ + if (tp->t_timer[TCPT_REXMT] == 0 || + ti->ti_ack != tp->snd_una) + tp->t_dupacks = 0; + else if (++tp->t_dupacks == tcprexmtthresh) { + tcp_seq onxt = tp->snd_nxt; + u_int win = + min(tp->snd_wnd, tp->snd_cwnd) / 2 / + tp->t_maxseg; + + if (win < 2) + win = 2; + tp->snd_ssthresh = win * tp->t_maxseg; + tp->t_timer[TCPT_REXMT] = 0; + tp->t_rtt = 0; + tp->snd_nxt = ti->ti_ack; + tp->snd_cwnd = tp->t_maxseg; + (void) tcp_output(tp); + tp->snd_cwnd = tp->snd_ssthresh + + tp->t_maxseg * tp->t_dupacks; + if (SEQ_GT(onxt, tp->snd_nxt)) + tp->snd_nxt = onxt; + goto drop; + } else if (tp->t_dupacks > tcprexmtthresh) { + tp->snd_cwnd += tp->t_maxseg; + (void) tcp_output(tp); + goto drop; + } + } else + tp->t_dupacks = 0; + break; + } + /* + * If the congestion window was inflated to account + * for the other side's cached packets, retract it. + */ + if (tp->t_dupacks > tcprexmtthresh && + tp->snd_cwnd > tp->snd_ssthresh) + tp->snd_cwnd = tp->snd_ssthresh; + tp->t_dupacks = 0; + if (SEQ_GT(ti->ti_ack, tp->snd_max)) { + tcpstat.tcps_rcvacktoomuch++; + goto dropafterack; + } + /* + * If we reach this point, ACK is not a duplicate, + * i.e., it ACKs something we sent. + */ + if (tp->t_flags & TF_NEEDSYN) { + /* + * T/TCP: Connection was half-synchronized, and our + * SYN has been ACK'd (so connection is now fully + * synchronized). Go to non-starred state, + * increment snd_una for ACK of SYN, and check if + * we can do window scaling. + */ + tp->t_flags &= ~TF_NEEDSYN; + tp->snd_una++; + /* Do window scaling? */ + if ((tp->t_flags & (TF_RCVD_SCALE|TF_REQ_SCALE)) == + (TF_RCVD_SCALE|TF_REQ_SCALE)) { + tp->snd_scale = tp->requested_s_scale; + tp->rcv_scale = tp->request_r_scale; + } + } + +process_ACK: + acked = ti->ti_ack - tp->snd_una; + tcpstat.tcps_rcvackpack++; + tcpstat.tcps_rcvackbyte += acked; + + /* + * If we have a timestamp reply, update smoothed + * round trip time. If no timestamp is present but + * transmit timer is running and timed sequence + * number was acked, update smoothed round trip time. + * Since we now have an rtt measurement, cancel the + * timer backoff (cf., Phil Karn's retransmit alg.). + * Recompute the initial retransmit timer. + */ + if (to.to_flag & TOF_TS) + tcp_xmit_timer(tp, tcp_now - to.to_tsecr + 1); + else if (tp->t_rtt && SEQ_GT(ti->ti_ack, tp->t_rtseq)) + tcp_xmit_timer(tp,tp->t_rtt); + + /* + * If all outstanding data is acked, stop retransmit + * timer and remember to restart (more output or persist). + * If there is more data to be acked, restart retransmit + * timer, using current (possibly backed-off) value. + */ + if (ti->ti_ack == tp->snd_max) { + tp->t_timer[TCPT_REXMT] = 0; + needoutput = 1; + } else if (tp->t_timer[TCPT_PERSIST] == 0) + tp->t_timer[TCPT_REXMT] = tp->t_rxtcur; + + /* + * If no data (only SYN) was ACK'd, + * skip rest of ACK processing. + */ + if (acked == 0) + goto step6; + + /* + * When new data is acked, open the congestion window. + * If the window gives us less than ssthresh packets + * in flight, open exponentially (maxseg per packet). + * Otherwise open linearly: maxseg per window + * (maxseg^2 / cwnd per packet). + */ + { + register u_int cw = tp->snd_cwnd; + register u_int incr = tp->t_maxseg; + + if (cw > tp->snd_ssthresh) + incr = incr * incr / cw; + tp->snd_cwnd = min(cw + incr, TCP_MAXWIN<snd_scale); + } + if (acked > so->so_snd.sb_cc) { + tp->snd_wnd -= so->so_snd.sb_cc; + sbdrop(&so->so_snd, (int)so->so_snd.sb_cc); + ourfinisacked = 1; + } else { + sbdrop(&so->so_snd, acked); + tp->snd_wnd -= acked; + ourfinisacked = 0; + } + if (so->so_snd.sb_flags & SB_NOTIFY) + sowwakeup(so); + tp->snd_una = ti->ti_ack; + if (SEQ_LT(tp->snd_nxt, tp->snd_una)) + tp->snd_nxt = tp->snd_una; + + switch (tp->t_state) { + + /* + * In FIN_WAIT_1 STATE in addition to the processing + * for the ESTABLISHED state if our FIN is now acknowledged + * then enter FIN_WAIT_2. + */ + case TCPS_FIN_WAIT_1: + if (ourfinisacked) { + /* + * If we can't receive any more + * data, then closing user can proceed. + * Starting the timer is contrary to the + * specification, but if we don't get a FIN + * we'll hang forever. + */ + if (so->so_state & SS_CANTRCVMORE) { + soisdisconnected(so); + tp->t_timer[TCPT_2MSL] = tcp_maxidle; + } + tp->t_state = TCPS_FIN_WAIT_2; + } + break; + + /* + * In CLOSING STATE in addition to the processing for + * the ESTABLISHED state if the ACK acknowledges our FIN + * then enter the TIME-WAIT state, otherwise ignore + * the segment. + */ + case TCPS_CLOSING: + if (ourfinisacked) { + tp->t_state = TCPS_TIME_WAIT; + tcp_canceltimers(tp); + /* Shorten TIME_WAIT [RFC-1644, p.28] */ + if (tp->cc_recv != 0 && + tp->t_duration < TCPTV_MSL) + tp->t_timer[TCPT_2MSL] = + tp->t_rxtcur * TCPTV_TWTRUNC; + else + tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL; + soisdisconnected(so); + } + break; + + /* + * In LAST_ACK, we may still be waiting for data to drain + * and/or to be acked, as well as for the ack of our FIN. + * If our FIN is now acknowledged, delete the TCB, + * enter the closed state and return. + */ + case TCPS_LAST_ACK: + if (ourfinisacked) { + tp = tcp_close(tp); + goto drop; + } + break; + + /* + * In TIME_WAIT state the only thing that should arrive + * is a retransmission of the remote FIN. Acknowledge + * it and restart the finack timer. + */ + case TCPS_TIME_WAIT: + tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL; + goto dropafterack; + } + } + +step6: + /* + * Update window information. + * Don't look at window if no ACK: TAC's send garbage on first SYN. + */ + if ((tiflags & TH_ACK) && + (SEQ_LT(tp->snd_wl1, ti->ti_seq) || + (tp->snd_wl1 == ti->ti_seq && (SEQ_LT(tp->snd_wl2, ti->ti_ack) || + (tp->snd_wl2 == ti->ti_ack && tiwin > tp->snd_wnd))))) { + /* keep track of pure window updates */ + if (ti->ti_len == 0 && + tp->snd_wl2 == ti->ti_ack && tiwin > tp->snd_wnd) + tcpstat.tcps_rcvwinupd++; + tp->snd_wnd = tiwin; + tp->snd_wl1 = ti->ti_seq; + tp->snd_wl2 = ti->ti_ack; + if (tp->snd_wnd > tp->max_sndwnd) + tp->max_sndwnd = tp->snd_wnd; + needoutput = 1; + } + + /* + * Process segments with URG. + */ + if ((tiflags & TH_URG) && ti->ti_urp && + TCPS_HAVERCVDFIN(tp->t_state) == 0) { + /* + * This is a kludge, but if we receive and accept + * random urgent pointers, we'll crash in + * soreceive. It's hard to imagine someone + * actually wanting to send this much urgent data. + */ + if (ti->ti_urp + so->so_rcv.sb_cc > sb_max) { + ti->ti_urp = 0; /* XXX */ + tiflags &= ~TH_URG; /* XXX */ + goto dodata; /* XXX */ + } + /* + * If this segment advances the known urgent pointer, + * then mark the data stream. This should not happen + * in CLOSE_WAIT, CLOSING, LAST_ACK or TIME_WAIT STATES since + * a FIN has been received from the remote side. + * In these states we ignore the URG. + * + * According to RFC961 (Assigned Protocols), + * the urgent pointer points to the last octet + * of urgent data. We continue, however, + * to consider it to indicate the first octet + * of data past the urgent section as the original + * spec states (in one of two places). + */ + if (SEQ_GT(ti->ti_seq+ti->ti_urp, tp->rcv_up)) { + tp->rcv_up = ti->ti_seq + ti->ti_urp; + so->so_oobmark = so->so_rcv.sb_cc + + (tp->rcv_up - tp->rcv_nxt) - 1; + if (so->so_oobmark == 0) + so->so_state |= SS_RCVATMARK; + sohasoutofband(so); + tp->t_oobflags &= ~(TCPOOB_HAVEDATA | TCPOOB_HADDATA); + } + /* + * Remove out of band data so doesn't get presented to user. + * This can happen independent of advancing the URG pointer, + * but if two URG's are pending at once, some out-of-band + * data may creep in... ick. + */ + if (ti->ti_urp <= (u_long)ti->ti_len +#ifdef SO_OOBINLINE + && (so->so_options & SO_OOBINLINE) == 0 +#endif + ) + tcp_pulloutofband(so, ti, m); + } else + /* + * If no out of band data is expected, + * pull receive urgent pointer along + * with the receive window. + */ + if (SEQ_GT(tp->rcv_nxt, tp->rcv_up)) + tp->rcv_up = tp->rcv_nxt; +dodata: /* XXX */ + + /* + * Process the segment text, merging it into the TCP sequencing queue, + * and arranging for acknowledgment of receipt if necessary. + * This process logically involves adjusting tp->rcv_wnd as data + * is presented to the user (this happens in tcp_usrreq.c, + * case PRU_RCVD). If a FIN has already been received on this + * connection then we just ignore the text. + */ + if ((ti->ti_len || (tiflags&TH_FIN)) && + TCPS_HAVERCVDFIN(tp->t_state) == 0) { + TCP_REASS(tp, ti, m, so, tiflags); + /* + * Note the amount of data that peer has sent into + * our window, in order to estimate the sender's + * buffer size. + */ + len = so->so_rcv.sb_hiwat - (tp->rcv_adv - tp->rcv_nxt); + } else { + m_freem(m); + tiflags &= ~TH_FIN; + } + + /* + * If FIN is received ACK the FIN and let the user know + * that the connection is closing. + */ + if (tiflags & TH_FIN) { + if (TCPS_HAVERCVDFIN(tp->t_state) == 0) { + socantrcvmore(so); + /* + * If connection is half-synchronized + * (ie NEEDSYN flag on) then delay ACK, + * so it may be piggybacked when SYN is sent. + * Otherwise, since we received a FIN then no + * more input can be expected, send ACK now. + */ + if (tp->t_flags & TF_NEEDSYN) + tp->t_flags |= TF_DELACK; + else + tp->t_flags |= TF_ACKNOW; + tp->rcv_nxt++; + } + switch (tp->t_state) { + + /* + * In SYN_RECEIVED and ESTABLISHED STATES + * enter the CLOSE_WAIT state. + */ + case TCPS_SYN_RECEIVED: + case TCPS_ESTABLISHED: + tp->t_state = TCPS_CLOSE_WAIT; + break; + + /* + * If still in FIN_WAIT_1 STATE FIN has not been acked so + * enter the CLOSING state. + */ + case TCPS_FIN_WAIT_1: + tp->t_state = TCPS_CLOSING; + break; + + /* + * In FIN_WAIT_2 state enter the TIME_WAIT state, + * starting the time-wait timer, turning off the other + * standard timers. + */ + case TCPS_FIN_WAIT_2: + tp->t_state = TCPS_TIME_WAIT; + tcp_canceltimers(tp); + /* Shorten TIME_WAIT [RFC-1644, p.28] */ + if (tp->cc_recv != 0 && + tp->t_duration < TCPTV_MSL) { + tp->t_timer[TCPT_2MSL] = + tp->t_rxtcur * TCPTV_TWTRUNC; + /* For transaction client, force ACK now. */ + tp->t_flags |= TF_ACKNOW; + } + else + tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL; + soisdisconnected(so); + break; + + /* + * In TIME_WAIT state restart the 2 MSL time_wait timer. + */ + case TCPS_TIME_WAIT: + tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL; + break; + } + } +#ifdef TCPDEBUG + if (so->so_options & SO_DEBUG) + tcp_trace(TA_INPUT, ostate, tp, &tcp_saveti, 0); +#endif + + /* + * Return any desired output. + */ + OS_DbgPrint(OSK_MID_TRACE, + ("needoutput: %d, tp->t_flags & TF_ACKNOW: %d\n", + needoutput, tp->t_flags & TF_ACKNOW)); + + if (needoutput || (tp->t_flags & TF_ACKNOW)) + (void) tcp_output(tp); + return; + +dropafterack: + /* + * Generate an ACK dropping incoming segment if it occupies + * sequence space, where the ACK reflects our state. + */ + if (tiflags & TH_RST) + goto drop; +#ifdef TCPDEBUG + if (so->so_options & SO_DEBUG) + tcp_trace(TA_DROP, ostate, tp, &tcp_saveti, 0); +#endif + m_freem(m); + tp->t_flags |= TF_ACKNOW; + (void) tcp_output(tp); + return; + +dropwithreset: + /* + * Generate a RST, dropping incoming segment. + * Make ACK acceptable to originator of segment. + * Don't bother to respond if destination was broadcast/multicast. + */ + if ((tiflags & TH_RST) || m->m_flags & (M_BCAST|M_MCAST) || + IN_MULTICAST(ntohl(ti->ti_dst.s_addr))) + goto drop; +#ifdef TCPDEBUG + if (tp == 0 || (tp->t_inpcb->inp_socket->so_options & SO_DEBUG)) + tcp_trace(TA_DROP, ostate, tp, &tcp_saveti, 0); +#endif + if (tiflags & TH_ACK) + tcp_respond(tp, ti, m, (tcp_seq)0, ti->ti_ack, TH_RST); + else { + if (tiflags & TH_SYN) + ti->ti_len++; + tcp_respond(tp, ti, m, ti->ti_seq+ti->ti_len, (tcp_seq)0, + TH_RST|TH_ACK); + } + /* destroy temporarily created socket */ + if (dropsocket) + (void) soabort(so); + return; + +drop: + /* + * Drop space held by incoming segment and return. + */ +#ifdef TCPDEBUG + if (tp == 0 || (tp->t_inpcb->inp_socket->so_options & SO_DEBUG)) + tcp_trace(TA_DROP, ostate, tp, &tcp_saveti, 0); +#endif + /* destroy temporarily created socket */ + if (dropsocket) + (void) soabort(so); + return; +#ifndef TUBA_INCLUDE +} + +void +tcp_dooptions(tp, cp, cnt, ti, to) + struct tcpcb *tp; + u_char *cp; + int cnt; + struct tcpiphdr *ti; + struct tcpopt *to; +{ + u_short mss = 0; + int opt, optlen; + + for (; cnt > 0; cnt -= optlen, cp += optlen) { + opt = cp[0]; + if (opt == TCPOPT_EOL) + break; + if (opt == TCPOPT_NOP) + optlen = 1; + else { + optlen = cp[1]; + if (optlen <= 0) + break; + } + switch (opt) { + + default: + continue; + + case TCPOPT_MAXSEG: + if (optlen != TCPOLEN_MAXSEG) + continue; + if (!(ti->ti_flags & TH_SYN)) + continue; + bcopy((char *) cp + 2, (char *) &mss, sizeof(mss)); + NTOHS(mss); + break; + + case TCPOPT_WINDOW: + if (optlen != TCPOLEN_WINDOW) + continue; + if (!(ti->ti_flags & TH_SYN)) + continue; + tp->t_flags |= TF_RCVD_SCALE; + tp->requested_s_scale = min(cp[2], TCP_MAX_WINSHIFT); + break; + + case TCPOPT_TIMESTAMP: + if (optlen != TCPOLEN_TIMESTAMP) + continue; + to->to_flag |= TOF_TS; + bcopy((char *)cp + 2, + (char *)&to->to_tsval, sizeof(to->to_tsval)); + NTOHL(to->to_tsval); + bcopy((char *)cp + 6, + (char *)&to->to_tsecr, sizeof(to->to_tsecr)); + NTOHL(to->to_tsecr); + + /* + * A timestamp received in a SYN makes + * it ok to send timestamp requests and replies. + */ + if (ti->ti_flags & TH_SYN) { + tp->t_flags |= TF_RCVD_TSTMP; + tp->ts_recent = to->to_tsval; + tp->ts_recent_age = tcp_now; + } + break; + case TCPOPT_CC: + if (optlen != TCPOLEN_CC) + continue; + to->to_flag |= TOF_CC; + bcopy((char *)cp + 2, + (char *)&to->to_cc, sizeof(to->to_cc)); + NTOHL(to->to_cc); + /* + * A CC or CC.new option received in a SYN makes + * it ok to send CC in subsequent segments. + */ + if (ti->ti_flags & TH_SYN) + tp->t_flags |= TF_RCVD_CC; + break; + case TCPOPT_CCNEW: + if (optlen != TCPOLEN_CC) + continue; + if (!(ti->ti_flags & TH_SYN)) + continue; + to->to_flag |= TOF_CCNEW; + bcopy((char *)cp + 2, + (char *)&to->to_cc, sizeof(to->to_cc)); + NTOHL(to->to_cc); + /* + * A CC or CC.new option received in a SYN makes + * it ok to send CC in subsequent segments. + */ + tp->t_flags |= TF_RCVD_CC; + break; + case TCPOPT_CCECHO: + if (optlen != TCPOLEN_CC) + continue; + if (!(ti->ti_flags & TH_SYN)) + continue; + to->to_flag |= TOF_CCECHO; + bcopy((char *)cp + 2, + (char *)&to->to_ccecho, sizeof(to->to_ccecho)); + NTOHL(to->to_ccecho); + break; + } + } + if (ti->ti_flags & TH_SYN) + tcp_mss(tp, mss); /* sets t_maxseg */ +} + +/* + * Pull out of band byte out of a segment so + * it doesn't appear in the user's data queue. + * It is still reflected in the segment length for + * sequencing purposes. + */ +void +tcp_pulloutofband(so, ti, m) + struct socket *so; + struct tcpiphdr *ti; + register struct mbuf *m; +{ + int cnt = ti->ti_urp - 1; + + while (cnt >= 0) { + if (m->m_len > cnt) { + char *cp = mtod(m, caddr_t) + cnt; + struct tcpcb *tp = sototcpcb(so); + + tp->t_iobc = *cp; + tp->t_oobflags |= TCPOOB_HAVEDATA; + bcopy(cp+1, cp, (unsigned)(m->m_len - cnt - 1)); + m->m_len--; + return; + } + cnt -= m->m_len; + m = m->m_next; + if (m == 0) + break; + } + panic("tcp_pulloutofband"); +} + +/* + * Collect new round-trip time estimate + * and update averages and current timeout. + */ +void +tcp_xmit_timer(tp, rtt) + register struct tcpcb *tp; + short rtt; +{ + register short delta; + + tcpstat.tcps_rttupdated++; + tp->t_rttupdated++; + if (tp->t_srtt != 0) { + /* + * srtt is stored as fixed point with 3 bits after the + * binary point (i.e., scaled by 8). The following magic + * is equivalent to the smoothing algorithm in rfc793 with + * an alpha of .875 (srtt = rtt/8 + srtt*7/8 in fixed + * point). Adjust rtt to origin 0. + */ + delta = rtt - 1 - (tp->t_srtt >> TCP_RTT_SHIFT); + if ((tp->t_srtt += delta) <= 0) + tp->t_srtt = 1; + /* + * We accumulate a smoothed rtt variance (actually, a + * smoothed mean difference), then set the retransmit + * timer to smoothed rtt + 4 times the smoothed variance. + * rttvar is stored as fixed point with 2 bits after the + * binary point (scaled by 4). The following is + * equivalent to rfc793 smoothing with an alpha of .75 + * (rttvar = rttvar*3/4 + |delta| / 4). This replaces + * rfc793's wired-in beta. + */ + if (delta < 0) + delta = -delta; + delta -= (tp->t_rttvar >> TCP_RTTVAR_SHIFT); + if ((tp->t_rttvar += delta) <= 0) + tp->t_rttvar = 1; + } else { + /* + * No rtt measurement yet - use the unsmoothed rtt. + * Set the variance to half the rtt (so our first + * retransmit happens at 3*rtt). + */ + tp->t_srtt = rtt << TCP_RTT_SHIFT; + tp->t_rttvar = rtt << (TCP_RTTVAR_SHIFT - 1); + } + tp->t_rtt = 0; + tp->t_rxtshift = 0; + + /* + * the retransmit should happen at rtt + 4 * rttvar. + * Because of the way we do the smoothing, srtt and rttvar + * will each average +1/2 tick of bias. When we compute + * the retransmit timer, we want 1/2 tick of rounding and + * 1 extra tick because of +-1/2 tick uncertainty in the + * firing of the timer. The bias will give us exactly the + * 1.5 tick we need. But, because the bias is + * statistical, we have to test that we don't drop below + * the minimum feasible timer (which is 2 ticks). + */ + TCPT_RANGESET(tp->t_rxtcur, TCP_REXMTVAL(tp), + tp->t_rttmin, TCPTV_REXMTMAX); + + /* + * We received an ack for a packet that wasn't retransmitted; + * it is probably safe to discard any error indications we've + * received recently. This isn't quite right, but close enough + * for now (a route might have failed after we sent a segment, + * and the return path might not be symmetrical). + */ + tp->t_softerror = 0; +} + +/* + * Determine a reasonable value for maxseg size. + * If the route is known, check route for mtu. + * If none, use an mss that can be handled on the outgoing + * interface without forcing IP to fragment; if bigger than + * an mbuf cluster (MCLBYTES), round down to nearest multiple of MCLBYTES + * to utilize large mbufs. If no route is found, route has no mtu, + * or the destination isn't local, use a default, hopefully conservative + * size (usually 512 or the default IP max size, but no more than the mtu + * of the interface), as we can't discover anything about intervening + * gateways or networks. We also initialize the congestion/slow start + * window to be a single segment if the destination isn't local. + * While looking at the routing entry, we also initialize other path-dependent + * parameters from pre-set or cached values in the routing entry. + * + * Also take into account the space needed for options that we + * send regularly. Make maxseg shorter by that amount to assure + * that we can send maxseg amount of data even when the options + * are present. Store the upper limit of the length of options plus + * data in maxopd. + * + * NOTE that this routine is only called when we process an incoming + * segment, for outgoing segments only tcp_mssopt is called. + * + * In case of T/TCP, we call this routine during implicit connection + * setup as well (offer = -1), to initialize maxseg from the cached + * MSS of our peer. + */ +void +tcp_mss(tp, offer) + struct tcpcb *tp; + int offer; +{ + register struct rtentry *rt; + struct ifnet *ifp; + register int rtt, mss; + u_long bufsize; + struct inpcb *inp; + struct socket *so; + struct rmxp_tao *taop; + int origoffer = offer; + + inp = tp->t_inpcb; + if ((rt = tcp_rtlookup(inp)) == NULL) { + tp->t_maxopd = tp->t_maxseg = tcp_mssdflt; + return; + } + so = inp->inp_socket; + + taop = rmx_taop(rt->rt_rmx); + /* + * Offer == -1 means that we didn't receive SYN yet, + * use cached value in that case; + */ + if (offer == -1) + offer = taop->tao_mssopt; + /* + * Offer == 0 means that there was no MSS on the SYN segment, + * in this case we use tcp_mssdflt. + */ + if (offer == 0) + offer = tcp_mssdflt; + else + /* + * Sanity check: make sure that maxopd will be large + * enough to allow some data on segments even is the + * all the option space is used (40bytes). Otherwise + * funny things may happen in tcp_output. + */ + offer = max(offer, 64); + taop->tao_mssopt = offer; + + /* + * While we're here, check if there's an initial rtt + * or rttvar. Convert from the route-table units + * to scaled multiples of the slow timeout timer. + */ + if (tp->t_srtt == 0 && (rtt = rt->rt_rmx.rmx_rtt)) { + /* + * XXX the lock bit for RTT indicates that the value + * is also a minimum value; this is subject to time. + */ + if (rt->rt_rmx.rmx_locks & RTV_RTT) + tp->t_rttmin = rtt / (RTM_RTTUNIT / PR_SLOWHZ); + tp->t_srtt = rtt / (RTM_RTTUNIT / (PR_SLOWHZ * TCP_RTT_SCALE)); + tcpstat.tcps_usedrtt++; + if (rt->rt_rmx.rmx_rttvar) { + tp->t_rttvar = rt->rt_rmx.rmx_rttvar / + (RTM_RTTUNIT / (PR_SLOWHZ * TCP_RTTVAR_SCALE)); + tcpstat.tcps_usedrttvar++; + } else { + /* default variation is +- 1 rtt */ + tp->t_rttvar = + tp->t_srtt * TCP_RTTVAR_SCALE / TCP_RTT_SCALE; + } + TCPT_RANGESET(tp->t_rxtcur, + ((tp->t_srtt >> 2) + tp->t_rttvar) >> 1, + tp->t_rttmin, TCPTV_REXMTMAX); + } + /* + * if there's an mtu associated with the route, use it + */ + if (rt->rt_rmx.rmx_mtu) + mss = rt->rt_rmx.rmx_mtu - sizeof(struct tcpiphdr); + else + { + mss = rt->rt_mtu - sizeof(struct tcpiphdr); + if (!in_localaddr(inp->inp_faddr)) + mss = min(mss, tcp_mssdflt); + } + mss = min(mss, offer); + /* + * maxopd stores the maximum length of data AND options + * in a segment; maxseg is the amount of data in a normal + * segment. We need to store this value (maxopd) apart + * from maxseg, because now every segment carries options + * and thus we normally have somewhat less data in segments. + */ + tp->t_maxopd = mss; + + /* + * In case of T/TCP, origoffer==-1 indicates, that no segments + * were received yet. In this case we just guess, otherwise + * we do the same as before T/TCP. + */ + if ((tp->t_flags & (TF_REQ_TSTMP|TF_NOOPT)) == TF_REQ_TSTMP && + (origoffer == -1 || + (tp->t_flags & TF_RCVD_TSTMP) == TF_RCVD_TSTMP)) + mss -= TCPOLEN_TSTAMP_APPA; + if ((tp->t_flags & (TF_REQ_CC|TF_NOOPT)) == TF_REQ_CC && + (origoffer == -1 || + (tp->t_flags & TF_RCVD_CC) == TF_RCVD_CC)) + mss -= TCPOLEN_CC_APPA; + +#if (MCLBYTES & (MCLBYTES - 1)) == 0 + if (mss > MCLBYTES) + mss &= ~(MCLBYTES-1); +#else + if (mss > MCLBYTES) + mss = mss / MCLBYTES * MCLBYTES; +#endif + /* + * If there's a pipesize, change the socket buffer + * to that size. Make the socket buffers an integral + * number of mss units; if the mss is larger than + * the socket buffer, decrease the mss. + */ +#ifdef RTV_SPIPE + if ((bufsize = rt->rt_rmx.rmx_sendpipe) == 0) +#endif + bufsize = so->so_snd.sb_hiwat; + if (bufsize < mss) + mss = bufsize; + else { + bufsize = roundup(bufsize, mss); + if (bufsize > sb_max) + bufsize = sb_max; + (void)sbreserve(&so->so_snd, bufsize); + } + tp->t_maxseg = mss; + +#ifdef RTV_RPIPE + if ((bufsize = rt->rt_rmx.rmx_recvpipe) == 0) +#endif + bufsize = so->so_rcv.sb_hiwat; + if (bufsize > mss) { + bufsize = roundup(bufsize, mss); + if (bufsize > sb_max) + bufsize = sb_max; + (void)sbreserve(&so->so_rcv, bufsize); + } + /* + * Don't force slow-start on local network. + */ + if (!in_localaddr(inp->inp_faddr)) + tp->snd_cwnd = mss; + + if (rt->rt_rmx.rmx_ssthresh) { + /* + * There's some sort of gateway or interface + * buffer limit on the path. Use this to set + * the slow start threshhold, but set the + * threshold to no less than 2*mss. + */ + tp->snd_ssthresh = max(2 * mss, rt->rt_rmx.rmx_ssthresh); + tcpstat.tcps_usedssthresh++; + } +} + +/* + * Determine the MSS option to send on an outgoing SYN. + */ +int +tcp_mssopt(tp) + struct tcpcb *tp; +{ + struct rtentry *rt; + + rt = tcp_rtlookup(tp->t_inpcb); + if (rt == NULL) + return tcp_mssdflt; + + return rt->rt_mtu - sizeof(struct tcpiphdr); +} +#endif /* TUBA_INCLUDE */ diff --git a/reactos/lib/oskittcp/oskittcp/tcp_output.c b/reactos/lib/oskittcp/oskittcp/tcp_output.c new file mode 100644 index 00000000000..976057494d3 --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/tcp_output.c @@ -0,0 +1,823 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcp_output.c 8.3 (Berkeley) 12/30/93 + */ + +#define TCPOUTFLAGS +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef TCPDEBUG +#include +#endif +#include + +#ifdef notyet +extern struct mbuf *m_copypack(); +#endif + + +/* + * Tcp output routine: figure out what should be sent and send it. + */ +int +tcp_output(tp) + register struct tcpcb *tp; +{ + register struct socket *so = tp->t_inpcb->inp_socket; + register long len, win; + int off, flags, error = EINVAL; + register struct mbuf *m; + register struct tcpiphdr *ti; + u_char opt[TCP_MAXOLEN]; + unsigned optlen, hdrlen; + int idle, sendalot; + struct rmxp_tao *taop; + struct rmxp_tao tao_noncached; + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); + + /* + * Determine length of data that should be transmitted, + * and flags that will be used. + * If there is some data or critical controls (SYN, RST) + * to send, then transmit; otherwise, investigate further. + */ + idle = (tp->snd_max == tp->snd_una); + if (idle && tp->t_idle >= tp->t_rxtcur) + /* + * We have been idle for "a while" and no acks are + * expected to clock out any data we send -- + * slow start to get ack "clock" running again. + */ + tp->snd_cwnd = tp->t_maxseg; +again: + sendalot = 0; + off = tp->snd_nxt - tp->snd_una; + win = min(tp->snd_wnd, tp->snd_cwnd); + + flags = tcp_outflags[tp->t_state]; + /* + * Get standard flags, and add SYN or FIN if requested by 'hidden' + * state flags. + */ + if (tp->t_flags & TF_NEEDFIN) + flags |= TH_FIN; + if (tp->t_flags & TF_NEEDSYN) + flags |= TH_SYN; + + /* + * If in persist timeout with window of 0, send 1 byte. + * Otherwise, if window is small but nonzero + * and timer expired, we will send what we can + * and go to transmit state. + */ + if (tp->t_force) { + if (win == 0) { + /* + * If we still have some data to send, then + * clear the FIN bit. Usually this would + * happen below when it realizes that we + * aren't sending all the data. However, + * if we have exactly 1 byte of unset data, + * then it won't clear the FIN bit below, + * and if we are in persist state, we wind + * up sending the packet without recording + * that we sent the FIN bit. + * + * We can't just blindly clear the FIN bit, + * because if we don't have any more data + * to send then the probe will be the FIN + * itself. + */ + if (off < so->so_snd.sb_cc) + flags &= ~TH_FIN; + win = 1; + } else { + tp->t_timer[TCPT_PERSIST] = 0; + tp->t_rxtshift = 0; + } + } + + len = min(so->so_snd.sb_cc, win) - off; + + if ((taop = tcp_gettaocache(tp->t_inpcb)) == NULL) { + taop = &tao_noncached; + bzero(taop, sizeof(*taop)); + } + + /* + * Lop off SYN bit if it has already been sent. However, if this + * is SYN-SENT state and if segment contains data and if we don't + * know that foreign host supports TAO, suppress sending segment. + */ + if ((flags & TH_SYN) && SEQ_GT(tp->snd_nxt, tp->snd_una)) { + flags &= ~TH_SYN; + off--, len++; + if (len > 0 && tp->t_state == TCPS_SYN_SENT && + taop->tao_ccsent == 0) + return 0; + } + + /* + * Be careful not to send data and/or FIN on SYN segments + * in cases when no CC option will be sent. + * This measure is needed to prevent interoperability problems + * with not fully conformant TCP implementations. + */ + if ((flags & TH_SYN) && + ((tp->t_flags & TF_NOOPT) || !(tp->t_flags & TF_REQ_CC) || + ((flags & TH_ACK) && !(tp->t_flags & TF_RCVD_CC)))) { + len = 0; + flags &= ~TH_FIN; + } + + if (len < 0) { + /* + * If FIN has been sent but not acked, + * but we haven't been called to retransmit, + * len will be -1. Otherwise, window shrank + * after we sent into it. If window shrank to 0, + * cancel pending retransmit, pull snd_nxt back + * to (closed) window, and set the persist timer + * if it isn't already going. If the window didn't + * close completely, just wait for an ACK. + */ + len = 0; + if (win == 0) { + tp->t_timer[TCPT_REXMT] = 0; + tp->t_rxtshift = 0; + tp->snd_nxt = tp->snd_una; + if (tp->t_timer[TCPT_PERSIST] == 0) + tcp_setpersist(tp); + } + } + if (len > tp->t_maxseg) { + len = tp->t_maxseg; + sendalot = 1; + } + if (SEQ_LT(tp->snd_nxt + len, tp->snd_una + so->so_snd.sb_cc)) + flags &= ~TH_FIN; + + win = sbspace(&so->so_rcv); + + /* + * Sender silly window avoidance. If connection is idle + * and can send all data, a maximum segment, + * at least a maximum default-size segment do it, + * or are forced, do it; otherwise don't bother. + * If peer's buffer is tiny, then send + * when window is at least half open. + * If retransmitting (possibly after persist timer forced us + * to send into a small window), then must resend. + */ + if (len) { + if (len == tp->t_maxseg) + goto send; + if ((idle || tp->t_flags & TF_NODELAY) && + (tp->t_flags & TF_NOPUSH) == 0 && + len + off >= so->so_snd.sb_cc) + goto send; + if (tp->t_force) + goto send; + if (len >= tp->max_sndwnd / 2 && tp->max_sndwnd > 0) + goto send; + if (SEQ_LT(tp->snd_nxt, tp->snd_max)) + goto send; + } + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); + + /* + * Compare available window to amount of window + * known to peer (as advertised window less + * next expected input). If the difference is at least two + * max size segments, or at least 50% of the maximum possible + * window, then want to send a window update to peer. + */ + if (win > 0) { + /* + * "adv" is the amount we can increase the window, + * taking into account that we are limited by + * TCP_MAXWIN << tp->rcv_scale. + */ + long adv = min(win, (long)TCP_MAXWIN << tp->rcv_scale) - + (tp->rcv_adv - tp->rcv_nxt); + + if (adv >= (long) (2 * tp->t_maxseg)) + goto send; + if (2 * adv >= (long) so->so_rcv.sb_hiwat) + goto send; + } + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); + + /* + * Send if we owe peer an ACK. + */ + if (tp->t_flags & TF_ACKNOW) + goto send; + if ((flags & TH_RST) || + ((flags & TH_SYN) && (tp->t_flags & TF_NEEDSYN) == 0)) + goto send; + if (SEQ_GT(tp->snd_up, tp->snd_una)) + goto send; + /* + * If our state indicates that FIN should be sent + * and we have not yet done so, or we're retransmitting the FIN, + * then we need to send. + */ + if (flags & TH_FIN && + ((tp->t_flags & TF_SENTFIN) == 0 || tp->snd_nxt == tp->snd_una)) + goto send; + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); + + /* + * TCP window updates are not reliable, rather a polling protocol + * using ``persist'' packets is used to insure receipt of window + * updates. The three ``states'' for the output side are: + * idle not doing retransmits or persists + * persisting to move a small or zero window + * (re)transmitting and thereby not persisting + * + * tp->t_timer[TCPT_PERSIST] + * is set when we are in persist state. + * tp->t_force + * is set when we are called to send a persist packet. + * tp->t_timer[TCPT_REXMT] + * is set when we are retransmitting + * The output side is idle when both timers are zero. + * + * If send window is too small, there is data to transmit, and no + * retransmit or persist is pending, then go to persist state. + * If nothing happens soon, send when timer expires: + * if window is nonzero, transmit what we can, + * otherwise force out a byte. + */ + if (so->so_snd.sb_cc && tp->t_timer[TCPT_REXMT] == 0 && + tp->t_timer[TCPT_PERSIST] == 0) { + tp->t_rxtshift = 0; + tcp_setpersist(tp); + } + + /* + * No reason to send a segment, just return. + */ + /*return (0);*/ + +send: + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); + + /* + * Before ESTABLISHED, force sending of initial options + * unless TCP set not to do any options. + * NOTE: we assume that the IP/TCP header plus TCP options + * always fit in a single mbuf, leaving room for a maximum + * link header, i.e. + * max_linkhdr + sizeof (struct tcpiphdr) + optlen <= MHLEN + */ + optlen = 0; + hdrlen = sizeof (struct tcpiphdr); + if (flags & TH_SYN) { + tp->snd_nxt = tp->iss; + if ((tp->t_flags & TF_NOOPT) == 0) { + u_short mss; + + opt[0] = TCPOPT_MAXSEG; + opt[1] = TCPOLEN_MAXSEG; + mss = htons((u_short) tcp_mssopt(tp)); + (void)memcpy(opt + 2, &mss, sizeof(mss)); + optlen = TCPOLEN_MAXSEG; + + if ((tp->t_flags & TF_REQ_SCALE) && + ((flags & TH_ACK) == 0 || + (tp->t_flags & TF_RCVD_SCALE))) { + *((u_long *) (opt + optlen)) = htonl( + TCPOPT_NOP << 24 | + TCPOPT_WINDOW << 16 | + TCPOLEN_WINDOW << 8 | + tp->request_r_scale); + optlen += 4; + } + } + } + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); + + /* + * Send a timestamp and echo-reply if this is a SYN and our side + * wants to use timestamps (TF_REQ_TSTMP is set) or both our side + * and our peer have sent timestamps in our SYN's. + */ + if ((tp->t_flags & (TF_REQ_TSTMP|TF_NOOPT)) == TF_REQ_TSTMP && + (flags & TH_RST) == 0 && + ((flags & TH_ACK) == 0 || + (tp->t_flags & TF_RCVD_TSTMP))) { + u_long *lp = (u_long *)(opt + optlen); + + /* Form timestamp option as shown in appendix A of RFC 1323. */ + *lp++ = htonl(TCPOPT_TSTAMP_HDR); + *lp++ = htonl(tcp_now); + *lp = htonl(tp->ts_recent); + optlen += TCPOLEN_TSTAMP_APPA; + } + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); + + /* + * Send `CC-family' options if our side wants to use them (TF_REQ_CC), + * options are allowed (!TF_NOOPT) and it's not a RST. + */ + if ((tp->t_flags & (TF_REQ_CC|TF_NOOPT)) == TF_REQ_CC && + (flags & TH_RST) == 0) { + switch (flags & (TH_SYN|TH_ACK)) { + /* + * This is a normal ACK, send CC if we received CC before + * from our peer. + */ + case TH_ACK: + if (!(tp->t_flags & TF_RCVD_CC)) + break; + /*FALLTHROUGH*/ + + /* + * We can only get here in T/TCP's SYN_SENT* state, when + * we're a sending a non-SYN segment without waiting for + * the ACK of our SYN. A check above assures that we only + * do this if our peer understands T/TCP. + */ + case 0: + opt[optlen++] = TCPOPT_NOP; + opt[optlen++] = TCPOPT_NOP; + opt[optlen++] = TCPOPT_CC; + opt[optlen++] = TCPOLEN_CC; + *(u_int32_t *)&opt[optlen] = htonl(tp->cc_send); + + optlen += 4; + break; + + /* + * This is our initial SYN, check whether we have to use + * CC or CC.new. + */ + case TH_SYN: +#if 0 + opt[optlen++] = TCPOPT_NOP; + opt[optlen++] = TCPOPT_NOP; + opt[optlen++] = tp->t_flags & TF_SENDCCNEW ? + TCPOPT_CCNEW : TCPOPT_CC; + opt[optlen++] = TCPOLEN_CC; + *(u_int32_t *)&opt[optlen] = htonl(tp->cc_send); + optlen += 4; +#endif + break; + + /* + * This is a SYN,ACK; send CC and CC.echo if we received + * CC from our peer. + */ + case (TH_SYN|TH_ACK): + if (tp->t_flags & TF_RCVD_CC) { + opt[optlen++] = TCPOPT_NOP; + opt[optlen++] = TCPOPT_NOP; + opt[optlen++] = TCPOPT_CC; + opt[optlen++] = TCPOLEN_CC; + *(u_int32_t *)&opt[optlen] = + htonl(tp->cc_send); + optlen += 4; + opt[optlen++] = TCPOPT_NOP; + opt[optlen++] = TCPOPT_NOP; + opt[optlen++] = TCPOPT_CCECHO; + opt[optlen++] = TCPOLEN_CC; + *(u_int32_t *)&opt[optlen] = + htonl(tp->cc_recv); + optlen += 4; + } + break; + } + } + + hdrlen += optlen; + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); + + /* + * Adjust data length if insertion of options will + * bump the packet length beyond the t_maxopd length. + * Clear the FIN bit because we cut off the tail of + * the segment. + */ + if (len + optlen > tp->t_maxopd) { + /* + * If there is still more to send, don't close the connection. + */ + flags &= ~TH_FIN; + len = tp->t_maxopd - optlen; + sendalot = 1; + } + +/*#ifdef DIAGNOSTIC*/ + if (max_linkhdr + hdrlen > MHLEN) + panic("tcphdr too big"); +/*#endif*/ + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); + + /* + * Grab a header mbuf, attaching a copy of data to + * be transmitted, and initialize the header from + * the template for sends on this connection. + */ + if (len) { + if (tp->t_force && len == 1) + tcpstat.tcps_sndprobe++; + else if (SEQ_LT(tp->snd_nxt, tp->snd_max)) { + tcpstat.tcps_sndrexmitpack++; + tcpstat.tcps_sndrexmitbyte += len; + } else { + tcpstat.tcps_sndpack++; + tcpstat.tcps_sndbyte += len; + } +#ifdef notyet + if ((m = m_copypack(so->so_snd.sb_mb, off, + (int)len, max_linkhdr + hdrlen)) == 0) { + error = ENOBUFS; + goto out; + } + /* + * m_copypack left space for our hdr; use it. + */ + m->m_len += hdrlen; + m->m_data -= hdrlen; +#else + MGETHDR(m, M_DONTWAIT, MT_HEADER); + if (m == NULL) { + error = ENOBUFS; + goto out; + } + m->m_data += max_linkhdr; + m->m_len = hdrlen; + if (len <= MHLEN - hdrlen - max_linkhdr) { + m_copydata(so->so_snd.sb_mb, off, (int) len, + mtod(m, caddr_t) + hdrlen); + m->m_len += len; + } else { + m->m_next = m_copy(so->so_snd.sb_mb, off, (int) len); + if (m->m_next == 0) { + (void) m_free(m); + error = ENOBUFS; + goto out; + } + } +#endif + /* + * If we're sending everything we've got, set PUSH. + * (This will keep happy those implementations which only + * give data to the user when a buffer fills or + * a PUSH comes in.) + */ + if (off + len == so->so_snd.sb_cc) + flags |= TH_PUSH; + } else { + if (tp->t_flags & TF_ACKNOW) + tcpstat.tcps_sndacks++; + else if (flags & (TH_SYN|TH_FIN|TH_RST)) + tcpstat.tcps_sndctrl++; + else if (SEQ_GT(tp->snd_up, tp->snd_una)) + tcpstat.tcps_sndurg++; + else + tcpstat.tcps_sndwinup++; + + MGETHDR(m, M_DONTWAIT, MT_HEADER); + if (m == NULL) { + error = ENOBUFS; + goto out; + } + m->m_data += max_linkhdr; + m->m_len = hdrlen; + } + + m->m_pkthdr.rcvif = (struct ifnet *)0; + ti = mtod(m, struct tcpiphdr *); + if (tp->t_template == 0) + panic("tcp_output"); + (void)memcpy(ti, tp->t_template, sizeof (struct tcpiphdr)); + + /* + * Fill in fields, remembering maximum advertised + * window for use in delaying messages about window sizes. + * If resending a FIN, be sure not to use a new sequence number. + */ + + if (flags & TH_FIN && tp->t_flags & TF_SENTFIN && + tp->snd_nxt == tp->snd_max) + tp->snd_nxt--; + + /* + * If we are doing retransmissions, then snd_nxt will + * not reflect the first unsent octet. For ACK only + * packets, we do not want the sequence number of the + * retransmitted packet, we want the sequence number + * of the next unsent octet. So, if there is no data + * (and no SYN or FIN), use snd_max instead of snd_nxt + * when filling in ti_seq. But if we are in persist + * state, snd_max might reflect one byte beyond the + * right edge of the window, so use snd_nxt in that + * case, since we know we aren't doing a retransmission. + * (retransmit and persist are mutually exclusive...) + */ + if (len || (flags & (TH_SYN|TH_FIN)) || tp->t_timer[TCPT_PERSIST]) + ti->ti_seq = htonl(tp->snd_nxt); + else + ti->ti_seq = htonl(tp->snd_max); + + ti->ti_ack = htonl(tp->rcv_nxt); + + if (optlen) { + (void)memcpy(ti + 1, opt, optlen); + ti->ti_off = (sizeof (struct tcphdr) + optlen) >> 2; + } + + ti->ti_flags = flags; + + /* + * Calculate receive window. Don't shrink window, + * but avoid silly window syndrome. + */ + if (win < (long)(so->so_rcv.sb_hiwat / 4) && win < (long)tp->t_maxseg) + win = 0; + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); + + if (win > (long)TCP_MAXWIN << tp->rcv_scale) + win = (long)TCP_MAXWIN << tp->rcv_scale; + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); + + if (win < (long)(tp->rcv_adv - tp->rcv_nxt)) + win = (long)(tp->rcv_adv - tp->rcv_nxt); + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); + + ti->ti_win = htons((u_short) (win>>tp->rcv_scale)); + if (SEQ_GT(tp->snd_up, tp->snd_nxt)) { + ti->ti_urp = htons((u_short)(tp->snd_up - tp->snd_nxt)); + ti->ti_flags |= TH_URG; + } else + /* + * If no urgent pointer to send, then we pull + * the urgent pointer to the left edge of the send window + * so that it doesn't drift into the send window on sequence + * number wraparound. + */ + tp->snd_up = tp->snd_una; /* drag it along */ + + /* + * Put TCP length in extended header, and then + * checksum extended header and data. + */ + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); + + if (len + optlen) { + ti->ti_src.s_addr = tp->t_inpcb->inp_laddr.s_addr; + ti->ti_dst.s_addr = tp->t_inpcb->inp_faddr.s_addr; + ti->ti_pr = 6; + ti->ti_len = htons((u_short)(sizeof (struct tcphdr) + + optlen + len)); + } + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); + + ti->ti_sum = in_cksum(m, (int)(hdrlen + len)); + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); + + /* + * In transmit state, time the transmission and arrange for + * the retransmit. In persist state, just set snd_max. + */ + if (tp->t_force == 0 || tp->t_timer[TCPT_PERSIST] == 0) { + tcp_seq startseq = tp->snd_nxt; + + /* + * Advance snd_nxt over sequence space of this segment. + */ + if (flags & (TH_SYN|TH_FIN)) { + if (flags & TH_SYN) + tp->snd_nxt++; + if (flags & TH_FIN) { + tp->snd_nxt++; + tp->t_flags |= TF_SENTFIN; + } + } + tp->snd_nxt += len; + if (SEQ_GT(tp->snd_nxt, tp->snd_max)) { + tp->snd_max = tp->snd_nxt; + /* + * Time this transmission if not a retransmission and + * not currently timing anything. + */ + if (tp->t_rtt == 0) { + tp->t_rtt = 1; + tp->t_rtseq = startseq; + tcpstat.tcps_segstimed++; + } + } + + /* + * Set retransmit timer if not currently set, + * and not doing an ack or a keep-alive probe. + * Initial value for retransmit timer is smoothed + * round-trip time + 2 * round-trip time variance. + * Initialize shift counter which is used for backoff + * of retransmit time. + */ + if (tp->t_timer[TCPT_REXMT] == 0 && + tp->snd_nxt != tp->snd_una) { + tp->t_timer[TCPT_REXMT] = tp->t_rxtcur; + if (tp->t_timer[TCPT_PERSIST]) { + tp->t_timer[TCPT_PERSIST] = 0; + tp->t_rxtshift = 0; + } + } + } else + if (SEQ_GT(tp->snd_nxt + len, tp->snd_max)) + tp->snd_max = tp->snd_nxt + len; + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); + +#ifdef TCPDEBUG + /* + * Trace. + */ + if (so->so_options & SO_DEBUG) + tcp_trace(TA_OUTPUT, tp->t_state, tp, ti, 0); +#endif + + /* + * Fill in IP length and desired time to live and + * send to IP level. There should be a better way + * to handle ttl and tos; we could keep them in + * the template, but need a way to checksum without them. + */ + m->m_pkthdr.len = hdrlen + len; +#ifdef TUBA + if (tp->t_tuba_pcb) + error = tuba_output(m, tp); + else +#endif + { +#if 1 + struct rtentry *rt; +#endif + ((struct ip *)ti)->ip_len = m->m_pkthdr.len; + ((struct ip *)ti)->ip_ttl = tp->t_inpcb->inp_ip.ip_ttl; /* XXX */ + ((struct ip *)ti)->ip_tos = tp->t_inpcb->inp_ip.ip_tos; /* XXX */ +#if 1 + /* + * See if we should do MTU discovery. We do it only if the following + * are true: + * 1) we have a valid route to the destination + * 2) the MTU is not locked (if it is, then discovery has been + * disabled) + */ + if ((rt = &tp->t_inpcb->inp_route.ro_rt) + && rt->rt_flags & RTF_UP + && !(rt->rt_rmx.rmx_locks & RTV_MTU)) { + ((struct ip *)ti)->ip_off |= IP_DF; + } +#endif + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); + + error = ip_output(so, m, tp->t_inpcb->inp_options, &tp->t_inpcb->inp_route, + so->so_options & SO_DONTROUTE, 0); + } + if (error) { +out: + if (error == ENOBUFS) { + tcp_quench(tp->t_inpcb, 0); + return (0); + } +#if 1 + if (error == EMSGSIZE) { + /* + * ip_output() will have already fixed the route + * for us. tcp_mtudisc() will, as its last action, + * initiate retransmission, so it is important to + * not do so here. + */ + tcp_mtudisc(tp->t_inpcb, 0); + return 0; + } +#endif + if ((error == EHOSTUNREACH || error == ENETDOWN) + && TCPS_HAVERCVDSYN(tp->t_state)) { + tp->t_softerror = error; + return (0); + } + return (error); + } + tcpstat.tcps_sndtotal++; + + /* + * Data sent (as far as we can tell). + * If this advertises a larger window than any other segment, + * then remember the size of the advertised window. + * Any pending ACK has now been sent. + */ + if (win > 0 && SEQ_GT(tp->rcv_nxt+win, tp->rcv_adv)) + tp->rcv_adv = tp->rcv_nxt + win; + tp->last_ack_sent = tp->rcv_nxt; + tp->t_flags &= ~(TF_ACKNOW|TF_DELACK); + if (sendalot) + goto again; + return (0); +} + +void +tcp_setpersist(tp) + register struct tcpcb *tp; +{ + register t = ((tp->t_srtt >> 2) + tp->t_rttvar) >> 1; + + if (tp->t_timer[TCPT_REXMT]) + panic("tcp_output REXMT"); + /* + * Start/restart persistance timer. + */ + TCPT_RANGESET(tp->t_timer[TCPT_PERSIST], + t * tcp_backoff[tp->t_rxtshift], + TCPTV_PERSMIN, TCPTV_PERSMAX); + if (tp->t_rxtshift < TCP_MAXRXTSHIFT) + tp->t_rxtshift++; +} diff --git a/reactos/lib/oskittcp/oskittcp/tcp_subr.c b/reactos/lib/oskittcp/oskittcp/tcp_subr.c new file mode 100644 index 00000000000..b67a1e91db5 --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/tcp_subr.c @@ -0,0 +1,610 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcp_subr.c 8.1 (Berkeley) 6/10/93 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef TCPDEBUG +#include +#endif + +/* patchable/settable parameters for tcp */ +int tcp_mssdflt = TCP_MSS; +int tcp_rttdflt = TCPTV_SRTTDFLT / PR_SLOWHZ; +int tcp_do_rfc1323 = 1; +int tcp_do_rfc1644 = 1; +static void tcp_cleartaocache(void); + +/* + * Target size of TCP PCB hash table. Will be rounded down to a prime + * number. + */ +#ifndef TCBHASHSIZE +#define TCBHASHSIZE 128 +#endif + +/* + * Tcp initialization + */ +void +tcp_init() +{ + + tcp_iss = boottime.tv_sec; /* wrong */ + tcp_ccgen = 1; + tcp_cleartaocache(); + LIST_INIT(&tcb); + tcbinfo.listhead = &tcb; + tcbinfo.hashbase = phashinit(TCBHASHSIZE, M_PCB, &tcbinfo.hashsize); + if (max_protohdr < sizeof(struct tcpiphdr)) + max_protohdr = sizeof(struct tcpiphdr); + if (max_linkhdr + sizeof(struct tcpiphdr) > MHLEN) + panic("tcp_init"); +} + +/* + * Create template to be used to send tcp packets on a connection. + * Call after host entry created, allocates an mbuf and fills + * in a skeletal tcp/ip header, minimizing the amount of work + * necessary when the connection is used. + */ +struct tcpiphdr * +tcp_template(tp) + struct tcpcb *tp; +{ + register struct inpcb *inp = tp->t_inpcb; + register struct mbuf *m; + register struct tcpiphdr *n; + + if ((n = tp->t_template) == 0) { + m = m_get(M_DONTWAIT, MT_HEADER); + OS_DbgPrint(OSK_MID_TRACE,("Allocated template mbuf at %x\n", m)); + if (m == NULL) + return (0); + m->m_len = sizeof (struct tcpiphdr); + n = mtod(m, struct tcpiphdr *); + } + n->ti_next = n->ti_prev = 0; + n->ti_x1 = 0; + n->ti_pr = IPPROTO_TCP; + n->ti_len = htons(sizeof (struct tcpiphdr) - sizeof (struct ip)); + n->ti_src = inp->inp_laddr; + n->ti_dst = inp->inp_faddr; + n->ti_sport = inp->inp_lport; + n->ti_dport = inp->inp_fport; + n->ti_seq = 0; + n->ti_ack = 0; + n->ti_x2 = 0; + n->ti_off = 5; + n->ti_flags = 0; + n->ti_win = 0; + n->ti_sum = 0; + n->ti_urp = 0; + return (n); +} + +/* + * Send a single message to the TCP at address specified by + * the given TCP/IP header. If m == 0, then we make a copy + * of the tcpiphdr at ti and send directly to the addressed host. + * This is used to force keep alive messages out using the TCP + * template for a connection tp->t_template. If flags are given + * then we send a message back to the TCP which originated the + * segment ti, and discard the mbuf containing it and any other + * attached mbufs. + * + * In any case the ack and sequence number of the transmitted + * segment are as specified by the parameters. + */ +void +tcp_respond(tp, ti, m, ack, seq, flags) + struct tcpcb *tp; + register struct tcpiphdr *ti; + register struct mbuf *m; + tcp_seq ack, seq; + int flags; +{ + register int tlen; + int win = 0; + struct route *ro = 0; + + if (tp) { + win = sbspace(&tp->t_inpcb->inp_socket->so_rcv); + ro = &tp->t_inpcb->inp_route; + } + if (m == 0) { + m = m_gethdr(M_DONTWAIT, MT_HEADER); + if (m == NULL) + return; +#ifdef TCP_COMPAT_42 + tlen = 1; +#else + tlen = 0; +#endif + m->m_data += max_linkhdr; + *mtod(m, struct tcpiphdr *) = *ti; + ti = mtod(m, struct tcpiphdr *); + flags = TH_ACK; + } else { + m_freem(m->m_next); + m->m_next = 0; + m->m_data = (caddr_t)ti; + m->m_len = sizeof (struct tcpiphdr); + tlen = 0; +#define xchg(a,b,type) { type t; t=a; a=b; b=t; } + xchg(ti->ti_dst.s_addr, ti->ti_src.s_addr, u_long); + xchg(ti->ti_dport, ti->ti_sport, u_short); +#undef xchg + } + ti->ti_len = htons((u_short)(sizeof (struct tcphdr) + tlen)); + tlen += sizeof (struct tcpiphdr); + m->m_len = tlen; + m->m_pkthdr.len = tlen; + m->m_pkthdr.rcvif = (struct ifnet *) 0; + ti->ti_next = ti->ti_prev = 0; + ti->ti_x1 = 0; + ti->ti_seq = htonl(seq); + ti->ti_ack = htonl(ack); + ti->ti_x2 = 0; + ti->ti_off = sizeof (struct tcphdr) >> 2; + ti->ti_flags = flags; + if (tp) + ti->ti_win = htons((u_short) (win >> tp->rcv_scale)); + else + ti->ti_win = htons((u_short)win); + ti->ti_urp = 0; + ti->ti_sum = 0; + ti->ti_sum = in_cksum(m, tlen); + ((struct ip *)ti)->ip_len = tlen; + ((struct ip *)ti)->ip_ttl = ip_defttl; +#ifdef TCPDEBUG + if (tp == NULL || (tp->t_inpcb->inp_socket->so_options & SO_DEBUG)) + tcp_trace(TA_OUTPUT, 0, tp, ti, 0); +#endif + (void) ip_output(0, m, NULL, ro, 0, NULL); +} + +/* + * Create a new TCP control block, making an + * empty reassembly queue and hooking it to the argument + * protocol control block. + */ +struct tcpcb * +tcp_newtcpcb(inp) + struct inpcb *inp; +{ + register struct tcpcb *tp; + + tp = malloc(sizeof(*tp), M_PCB, M_NOWAIT); + if (tp == NULL) + return ((struct tcpcb *)0); + bzero((char *) tp, sizeof(struct tcpcb)); + tp->seg_next = tp->seg_prev = (struct tcpiphdr *)tp; + tp->t_maxseg = tp->t_maxopd = tcp_mssdflt; + + if (tcp_do_rfc1323) + tp->t_flags = (TF_REQ_SCALE|TF_REQ_TSTMP); + if (tcp_do_rfc1644) + tp->t_flags |= TF_REQ_CC; + tp->t_inpcb = inp; + /* + * Init srtt to TCPTV_SRTTBASE (0), so we can tell that we have no + * rtt estimate. Set rttvar so that srtt + 2 * rttvar gives + * reasonable initial retransmit time. + */ + tp->t_srtt = TCPTV_SRTTBASE; + tp->t_rttvar = tcp_rttdflt * PR_SLOWHZ << 2; + tp->t_rttmin = TCPTV_MIN; + TCPT_RANGESET(tp->t_rxtcur, + ((TCPTV_SRTTBASE >> 2) + (TCPTV_SRTTDFLT << 2)) >> 1, + TCPTV_MIN, TCPTV_REXMTMAX); + tp->snd_cwnd = TCP_MAXWIN << TCP_MAX_WINSHIFT; + tp->snd_ssthresh = TCP_MAXWIN << TCP_MAX_WINSHIFT; + inp->inp_ip.ip_ttl = ip_defttl; + inp->inp_ppcb = (caddr_t)tp; + return (tp); +} + +/* + * Drop a TCP connection, reporting + * the specified error. If connection is synchronized, + * then send a RST to peer. + */ +struct tcpcb * +tcp_drop(tp, errno) + register struct tcpcb *tp; + int errno; +{ + struct socket *so = tp->t_inpcb->inp_socket; + + if (TCPS_HAVERCVDSYN(tp->t_state)) { + tp->t_state = TCPS_CLOSED; + (void) tcp_output(tp); + tcpstat.tcps_drops++; + } else + tcpstat.tcps_conndrops++; + if (errno == ETIMEDOUT && tp->t_softerror) + errno = tp->t_softerror; + so->so_error = errno; + return (tcp_close(tp)); +} + +/* + * Close a TCP control block: + * discard all space held by the tcp + * discard internet protocol block + * wake up any sleepers + */ +struct tcpcb * +tcp_close(tp) + register struct tcpcb *tp; +{ + register struct tcpiphdr *t; + struct inpcb *inp = tp->t_inpcb; + struct socket *so = inp->inp_socket; + register struct mbuf *m; +#ifdef RTV_RTT + register struct rtentry *rt; + + /* + * If we got enough samples through the srtt filter, + * save the rtt and rttvar in the routing entry. + * 'Enough' is arbitrarily defined as the 16 samples. + * 16 samples is enough for the srtt filter to converge + * to within 5% of the correct value; fewer samples and + * we could save a very bogus rtt. + * + * Don't update the default route's characteristics and don't + * update anything that the user "locked". + */ + if (tp->t_rttupdated >= 16 && (rt = &inp->inp_route.ro_rt)) { + register u_long i = 0; + + if ((rt->rt_rmx.rmx_locks & RTV_RTT) == 0) { + i = tp->t_srtt * + (RTM_RTTUNIT / (PR_SLOWHZ * TCP_RTT_SCALE)); + if (rt->rt_rmx.rmx_rtt && i) + /* + * filter this update to half the old & half + * the new values, converting scale. + * See route.h and tcp_var.h for a + * description of the scaling constants. + */ + rt->rt_rmx.rmx_rtt = + (rt->rt_rmx.rmx_rtt + i) / 2; + else + rt->rt_rmx.rmx_rtt = i; + tcpstat.tcps_cachedrtt++; + } + if ((rt->rt_rmx.rmx_locks & RTV_RTTVAR) == 0) { + i = tp->t_rttvar * + (RTM_RTTUNIT / (PR_SLOWHZ * TCP_RTTVAR_SCALE)); + if (rt->rt_rmx.rmx_rttvar && i) + rt->rt_rmx.rmx_rttvar = + (rt->rt_rmx.rmx_rttvar + i) / 2; + else + rt->rt_rmx.rmx_rttvar = i; + tcpstat.tcps_cachedrttvar++; + } + /* + * update the pipelimit (ssthresh) if it has been updated + * already or if a pipesize was specified & the threshhold + * got below half the pipesize. I.e., wait for bad news + * before we start updating, then update on both good + * and bad news. + */ + if (((rt->rt_rmx.rmx_locks & RTV_SSTHRESH) == 0 && + ((i = tp->snd_ssthresh) != 0) && rt->rt_rmx.rmx_ssthresh) || + i < (rt->rt_rmx.rmx_sendpipe / 2)) { + /* + * convert the limit from user data bytes to + * packets then to packet data bytes. + */ + i = (i + tp->t_maxseg / 2) / tp->t_maxseg; + if (i < 2) + i = 2; + i *= (u_long)(tp->t_maxseg + sizeof (struct tcpiphdr)); + if (rt->rt_rmx.rmx_ssthresh) + rt->rt_rmx.rmx_ssthresh = + (rt->rt_rmx.rmx_ssthresh + i) / 2; + else + rt->rt_rmx.rmx_ssthresh = i; + tcpstat.tcps_cachedssthresh++; + } + } +#endif /* RTV_RTT */ + /* free the reassembly queue, if any */ + t = tp->seg_next; + while (t != (struct tcpiphdr *)tp) { + t = (struct tcpiphdr *)t->ti_next; + m = REASS_MBUF((struct tcpiphdr *)t->ti_prev); + remque(t->ti_prev); + m_freem(m); + } + if (tp->t_template) { + (void) m_free(dtom(tp->t_template)); + OS_DbgPrint(OSK_MID_TRACE,("Freeing template mbuf at %x\n", + tp->t_template)); + tp->t_template = 0; + } + free(tp, M_PCB); + inp->inp_ppcb = 0; + soisdisconnected(so); + in_pcbdetach(inp); + tcpstat.tcps_closed++; + return ((struct tcpcb *)0); +} + +void +tcp_drain() +{ + +} + +/* + * Notify a tcp user of an asynchronous error; + * store error as soft error, but wake up user + * (for now, won't do anything until can select for soft error). + */ +void +tcp_notify(inp, error) + struct inpcb *inp; + int error; +{ + register struct tcpcb *tp = (struct tcpcb *)inp->inp_ppcb; + register struct socket *so = inp->inp_socket; + + /* + * Ignore some errors if we are hooked up. + * If connection hasn't completed, has retransmitted several times, + * and receives a second error, give up now. This is better + * than waiting a long time to establish a connection that + * can never complete. + */ + if (tp->t_state == TCPS_ESTABLISHED && + (error == EHOSTUNREACH || error == ENETUNREACH || + error == EHOSTDOWN)) { + return; + } else if (tp->t_state < TCPS_ESTABLISHED && tp->t_rxtshift > 3 && + tp->t_softerror) + so->so_error = error; + else + tp->t_softerror = error; + wakeup((caddr_t) &so->so_timeo); + sorwakeup(so); + sowwakeup(so); +} + +void +tcp_ctlinput(cmd, sa, ip) + int cmd; + struct sockaddr *sa; + register struct ip *ip; +{ + register struct tcphdr *th; + void (*notify) __P((struct inpcb *, int)) = tcp_notify; + + if (cmd == PRC_QUENCH) + notify = tcp_quench; +#if 1 + else if (cmd == PRC_MSGSIZE) + notify = tcp_mtudisc; +#endif + else if (!PRC_IS_REDIRECT(cmd) && + ((unsigned)cmd > PRC_NCMDS || inetctlerrmap[cmd] == 0)) + return; + if (ip) { + th = (struct tcphdr *)((caddr_t)ip + (ip->ip_hl << 2)); + in_pcbnotify(&tcb, sa, th->th_dport, ip->ip_src, th->th_sport, + cmd, notify); + } else + in_pcbnotify(&tcb, sa, 0, zeroin_addr, 0, cmd, notify); +} + +/* + * When a source quench is received, close congestion window + * to one segment. We will gradually open it again as we proceed. + */ +void +tcp_quench(inp, errno) + struct inpcb *inp; + int errno; +{ + struct tcpcb *tp = intotcpcb(inp); + + if (tp) + tp->snd_cwnd = tp->t_maxseg; +} + +#if 1 +/* + * When `need fragmentation' ICMP is received, update our idea of the MSS + * based on the new value in the route. Also nudge TCP to send something, + * since we know the packet we just sent was dropped. + * This duplicates some code in the tcp_mss() function in tcp_input.c. + */ +void +tcp_mtudisc(inp, errno) + struct inpcb *inp; + int errno; +{ + struct tcpcb *tp = intotcpcb(inp); + struct rtentry *rt; + struct rmxp_tao *taop; + struct socket *so = inp->inp_socket; + int offered; + int mss; + + if (tp) { + rt = tcp_rtlookup(inp); + if (!rt || !rt->rt_rmx.rmx_mtu) { + tp->t_maxopd = tp->t_maxseg = tcp_mssdflt; + return; + } + taop = rmx_taop(rt->rt_rmx); + offered = taop->tao_mssopt; + mss = rt->rt_rmx.rmx_mtu - sizeof(struct tcpiphdr); + if (offered) + mss = min(mss, offered); + /* + * XXX - The above conditional probably violates the TCP + * spec. The problem is that, since we don't know the + * other end's MSS, we are supposed to use a conservative + * default. But, if we do that, then MTU discovery will + * never actually take place, because the conservative + * default is much less than the MTUs typically seen + * on the Internet today. For the moment, we'll sweep + * this under the carpet. + * + * The conservative default might not actually be a problem + * if the only case this occurs is when sending an initial + * SYN with options and data to a host we've never talked + * to before. Then, they will reply with an MSS value which + * will get recorded and the new parameters should get + * recomputed. For Further Study. + */ + if (tp->t_maxopd <= mss) + return; + tp->t_maxopd = mss; + + if ((tp->t_flags & (TF_REQ_TSTMP|TF_NOOPT)) == TF_REQ_TSTMP && + (tp->t_flags & TF_RCVD_TSTMP) == TF_RCVD_TSTMP) + mss -= TCPOLEN_TSTAMP_APPA; + if ((tp->t_flags & (TF_REQ_CC|TF_NOOPT)) == TF_REQ_CC && + (tp->t_flags & TF_RCVD_CC) == TF_RCVD_CC) + mss -= TCPOLEN_CC_APPA; +#if (MCLBYTES & (MCLBYTES - 1)) == 0 + if (mss > MCLBYTES) + mss &= ~(MCLBYTES-1); +#else + if (mss > MCLBYTES) + mss = mss / MCLBYTES * MCLBYTES; +#endif + if (so->so_snd.sb_hiwat < mss) + mss = so->so_snd.sb_hiwat; + + tp->t_maxseg = mss; + + tcpstat.tcps_mturesent++; + tp->t_rtt = 0; + tp->snd_nxt = tp->snd_una; + tcp_output(tp); + } +} +#endif + +/* + * Look-up the routing entry to the peer of this inpcb. If no route + * is found and it cannot be allocated the return NULL. This routine + * is called by TCP routines that access the rmx structure and by tcp_mss + * to get the interface MTU. + */ +struct rtentry * +tcp_rtlookup(inp) + struct inpcb *inp; +{ + struct route *ro; + struct rtentry *rt; + + ro = &inp->inp_route; + rt = &ro->ro_rt; + if (!(rt->rt_flags & RTF_UP)) { + /* No route yet, so try to acquire one */ + if (inp->inp_faddr.s_addr != INADDR_ANY) { + ro->ro_dst.sa_family = AF_INET; + /* ro->ro_dst.sa_len = sizeof(ro->ro_dst); */ + ((struct sockaddr_in *) &ro->ro_dst)->sin_addr = + inp->inp_faddr; + rt = &ro->ro_rt; + } + } + return rt; +} + +/* + * Return a pointer to the cached information about the remote host. + * The cached information is stored in the protocol specific part of + * the route metrics. + */ +struct rmxp_tao * +tcp_gettaocache(inp) + struct inpcb *inp; +{ + struct rtentry *rt = tcp_rtlookup(inp); + + /* Make sure this is a host route and is up. */ + if (rt == NULL || + (rt->rt_flags & (RTF_UP|RTF_HOST)) != (RTF_UP|RTF_HOST)) + return NULL; + + return rmx_taop(rt->rt_rmx); +} + +/* + * Clear all the TAO cache entries, called from tcp_init. + * + * XXX + * This routine is just an empty one, because we assume that the routing + * routing tables are initialized at the same time when TCP, so there is + * nothing in the cache left over. + */ +static void +tcp_cleartaocache(void) +{ } diff --git a/reactos/lib/oskittcp/oskittcp/tcp_timer.c b/reactos/lib/oskittcp/oskittcp/tcp_timer.c new file mode 100644 index 00000000000..dd2ff8d276c --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/tcp_timer.c @@ -0,0 +1,358 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcp_timer.c 8.1 (Berkeley) 6/10/93 + */ + +#ifndef TUBA_INCLUDE +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef TCPDEBUG +#include +#endif + +int tcp_keepidle = TCPTV_KEEP_IDLE; +int tcp_keepintvl = TCPTV_KEEPINTVL; +int tcp_keepinit = TCPTV_KEEP_INIT; +int tcp_maxidle; +int tcp_maxpersistidle = TCPTV_KEEP_IDLE; +int tcp_totbackoff = 511; +#endif /* TUBA_INCLUDE */ +/* + * Fast timeout routine for processing delayed acks + */ +void +tcp_fasttimo() +{ + register struct inpcb *inp; + register struct tcpcb *tp; + int s; + + s = splnet(); + + for (inp = tcb.lh_first; inp != NULL; inp = inp->inp_list.le_next) { + if ((tp = (struct tcpcb *)inp->inp_ppcb) && + (tp->t_flags & TF_DELACK)) { + tp->t_flags &= ~TF_DELACK; + tp->t_flags |= TF_ACKNOW; + tcpstat.tcps_delack++; + (void) tcp_output(tp); + } + } + splx(s); +} + +/* + * Tcp protocol timeout routine called every 500 ms. + * Updates the timers in all active tcb's and + * causes finite state machine actions if timers expire. + */ +void +tcp_slowtimo() +{ + register struct inpcb *ip, *ipnxt; + register struct tcpcb *tp; + register int i; + int s; +#ifdef TCPDEBUG + int ostate; +#endif + + s = splnet(); + + tcp_maxidle = TCPTV_KEEPCNT * tcp_keepintvl; + + ip = tcb.lh_first; + if (ip == NULL) { + splx(s); + return; + } + /* + * Search through tcb's and update active timers. + */ + for (; ip != NULL; ip = ipnxt) { + ipnxt = ip->inp_list.le_next; + tp = intotcpcb(ip); + if (tp == 0) + continue; + for (i = 0; i < TCPT_NTIMERS; i++) { + if (tp->t_timer[i] && --tp->t_timer[i] == 0) { +#ifdef TCPDEBUG + ostate = tp->t_state; +#endif + tp = tcp_timers(tp, i); + if (tp == NULL) + goto tpgone; +#ifdef TCPDEBUG + if (tp->t_inpcb->inp_socket->so_options + & SO_DEBUG) + tcp_trace(TA_USER, ostate, tp, + (struct tcpiphdr *)0, + PRU_SLOWTIMO); +#endif + } + } + tp->t_idle++; + tp->t_duration++; + if (tp->t_rtt) + tp->t_rtt++; +tpgone: + ; + } + tcp_iss += TCP_ISSINCR/PR_SLOWHZ; /* increment iss */ +#ifdef TCP_COMPAT_42 + if ((int)tcp_iss < 0) + tcp_iss = 0; /* XXX */ +#endif + tcp_now++; /* for timestamps */ + splx(s); +} +#ifndef TUBA_INCLUDE + +/* + * Cancel all timers for TCP tp. + */ +void +tcp_canceltimers(tp) + struct tcpcb *tp; +{ + register int i; + + for (i = 0; i < TCPT_NTIMERS; i++) + tp->t_timer[i] = 0; +} + +int tcp_backoff[TCP_MAXRXTSHIFT + 1] = + { 1, 2, 4, 8, 16, 32, 64, 64, 64, 64, 64, 64, 64 }; + +/* + * TCP timer processing. + */ +struct tcpcb * +tcp_timers(tp, timer) + register struct tcpcb *tp; + int timer; +{ + register int rexmt; + + switch (timer) { + + /* + * 2 MSL timeout in shutdown went off. If we're closed but + * still waiting for peer to close and connection has been idle + * too long, or if 2MSL time is up from TIME_WAIT, delete connection + * control block. Otherwise, check again in a bit. + */ + case TCPT_2MSL: + if (tp->t_state != TCPS_TIME_WAIT && + tp->t_idle <= tcp_maxidle) + tp->t_timer[TCPT_2MSL] = tcp_keepintvl; + else + tp = tcp_close(tp); + break; + + /* + * Retransmission timer went off. Message has not + * been acked within retransmit interval. Back off + * to a longer retransmit interval and retransmit one segment. + */ + case TCPT_REXMT: + if (++tp->t_rxtshift > TCP_MAXRXTSHIFT) { + tp->t_rxtshift = TCP_MAXRXTSHIFT; + tcpstat.tcps_timeoutdrop++; + tp = tcp_drop(tp, tp->t_softerror ? + tp->t_softerror : ETIMEDOUT); + break; + } + tcpstat.tcps_rexmttimeo++; + rexmt = TCP_REXMTVAL(tp) * tcp_backoff[tp->t_rxtshift]; + TCPT_RANGESET(tp->t_rxtcur, rexmt, + tp->t_rttmin, TCPTV_REXMTMAX); + tp->t_timer[TCPT_REXMT] = tp->t_rxtcur; + /* + * If losing, let the lower level know and try for + * a better route. Also, if we backed off this far, + * our srtt estimate is probably bogus. Clobber it + * so we'll take the next rtt measurement as our srtt; + * move the current srtt into rttvar to keep the current + * retransmit times until then. + */ + if (tp->t_rxtshift > TCP_MAXRXTSHIFT / 4) { + in_losing(tp->t_inpcb); + tp->t_rttvar += (tp->t_srtt >> TCP_RTT_SHIFT); + tp->t_srtt = 0; + } + tp->snd_nxt = tp->snd_una; + /* + * Force a segment to be sent. + */ + tp->t_flags |= TF_ACKNOW; + /* + * If timing a segment in this window, stop the timer. + */ + tp->t_rtt = 0; + /* + * Close the congestion window down to one segment + * (we'll open it by one segment for each ack we get). + * Since we probably have a window's worth of unacked + * data accumulated, this "slow start" keeps us from + * dumping all that data as back-to-back packets (which + * might overwhelm an intermediate gateway). + * + * There are two phases to the opening: Initially we + * open by one mss on each ack. This makes the window + * size increase exponentially with time. If the + * window is larger than the path can handle, this + * exponential growth results in dropped packet(s) + * almost immediately. To get more time between + * drops but still "push" the network to take advantage + * of improving conditions, we switch from exponential + * to linear window opening at some threshhold size. + * For a threshhold, we use half the current window + * size, truncated to a multiple of the mss. + * + * (the minimum cwnd that will give us exponential + * growth is 2 mss. We don't allow the threshhold + * to go below this.) + */ + { + u_int win = min(tp->snd_wnd, tp->snd_cwnd) / 2 / tp->t_maxseg; + if (win < 2) + win = 2; + tp->snd_cwnd = tp->t_maxseg; + tp->snd_ssthresh = win * tp->t_maxseg; + tp->t_dupacks = 0; + } + (void) tcp_output(tp); + break; + + /* + * Persistance timer into zero window. + * Force a byte to be output, if possible. + */ + case TCPT_PERSIST: + tcpstat.tcps_persisttimeo++; + /* + * Hack: if the peer is dead/unreachable, we do not + * time out if the window is closed. After a full + * backoff, drop the connection if the idle time + * (no responses to probes) reaches the maximum + * backoff that we would use if retransmitting. + */ + if (tp->t_rxtshift == TCP_MAXRXTSHIFT) { + u_long maxidle = TCP_REXMTVAL(tp); + if (maxidle < tp->t_rttmin) + maxidle = tp->t_rttmin; + maxidle *= tcp_totbackoff; + if (tp->t_idle >= tcp_maxpersistidle || + tp->t_idle >= maxidle) { + tcpstat.tcps_persistdrop++; + tp = tcp_drop(tp, ETIMEDOUT); + break; + } + } + tcp_setpersist(tp); + tp->t_force = 1; + (void) tcp_output(tp); + tp->t_force = 0; + break; + + /* + * Keep-alive timer went off; send something + * or drop connection if idle for too long. + */ + case TCPT_KEEP: + tcpstat.tcps_keeptimeo++; + if (tp->t_state < TCPS_ESTABLISHED) + goto dropit; + if (tp->t_inpcb->inp_socket->so_options & SO_KEEPALIVE && + tp->t_state <= TCPS_CLOSING) { + if (tp->t_idle >= tcp_keepidle + tcp_maxidle) + goto dropit; + /* + * Send a packet designed to force a response + * if the peer is up and reachable: + * either an ACK if the connection is still alive, + * or an RST if the peer has closed the connection + * due to timeout or reboot. + * Using sequence number tp->snd_una-1 + * causes the transmitted zero-length segment + * to lie outside the receive window; + * by the protocol spec, this requires the + * correspondent TCP to respond. + */ + tcpstat.tcps_keepprobe++; +#ifdef TCP_COMPAT_42 + /* + * The keepalive packet must have nonzero length + * to get a 4.2 host to respond. + */ + tcp_respond(tp, tp->t_template, (struct mbuf *)NULL, + tp->rcv_nxt - 1, tp->snd_una - 1, 0); +#else + tcp_respond(tp, tp->t_template, (struct mbuf *)NULL, + tp->rcv_nxt, tp->snd_una - 1, 0); +#endif + tp->t_timer[TCPT_KEEP] = tcp_keepintvl; + } else + tp->t_timer[TCPT_KEEP] = tcp_keepidle; + break; + dropit: + tcpstat.tcps_keepdrops++; + tp = tcp_drop(tp, ETIMEDOUT); + break; + } + return (tp); +} +#endif /* TUBA_INCLUDE */ diff --git a/reactos/lib/oskittcp/oskittcp/tcp_usrreq.c b/reactos/lib/oskittcp/oskittcp/tcp_usrreq.c new file mode 100644 index 00000000000..ac61c4eb609 --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/tcp_usrreq.c @@ -0,0 +1,773 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * From: @(#)tcp_usrreq.c 8.2 (Berkeley) 1/3/94 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef TCPDEBUG +#include +#endif + +/* + * TCP protocol interface to socket abstraction. + */ +extern char *tcpstates[]; + +/* + * Process a TCP user request for TCP tb. If this is a send request + * then m is the mbuf chain of send data. If this is a timer expiration + * (called from the software clock routine), then timertype tells which timer. + */ +/*ARGSUSED*/ +int +tcp_usrreq(so, req, m, nam, control) + struct socket *so; + int req; + struct mbuf *m, *nam, *control; +{ + register struct inpcb *inp; + register struct tcpcb *tp = 0; + struct sockaddr_in *sinp; + int s; + int error = 0; + + if (req == PRU_CONTROL) + return (in_control(so, (u_long)m, (caddr_t)nam, + (struct ifnet *)control)); + if (control && control->m_len) { + m_freem(control); + if (m) + m_freem(m); + return (EINVAL); + } + + s = splnet(); + inp = sotoinpcb(so); + + /* + * When a TCP is attached to a socket, then there will be + * a (struct inpcb) pointed at by the socket, and this + * structure will point at a subsidary (struct tcpcb). + */ + if (inp == 0 && req != PRU_ATTACH) { + splx(s); + /* safer version of fix for mbuf leak */ + if (m && (req == PRU_SEND || req == PRU_SENDOOB)) + m_freem(m); + } + + if( inp ) + tp = intotcpcb(inp); + + switch (req) { + /* + * TCP attaches to socket via PRU_ATTACH, reserving space, + * and an internet control block. + */ + case PRU_ATTACH: + if (inp) { + error = EISCONN; + break; + } + error = tcp_attach(so); + if (error) + break; + if ((so->so_options & SO_LINGER) && so->so_linger == 0) + so->so_linger = TCP_LINGERTIME * hz; + tp = sototcpcb(so); + break; + + /* + * PRU_DETACH detaches the TCP protocol from the socket. + * If the protocol state is non-embryonic, then can't + * do this directly: have to initiate a PRU_DISCONNECT, + * which may finish later; embryonic TCB's can just + * be discarded here. + */ + case PRU_DETACH: + if (tp->t_state > TCPS_LISTEN) + tp = tcp_disconnect(tp); + else + tp = tcp_close(tp); + break; + + /* + * Give the socket an address. + */ + case PRU_BIND: + /* + * Must check for multicast addresses and disallow binding + * to them. + */ + sinp = mtod(nam, struct sockaddr_in *); + error = in_pcbbind(inp, nam); + if (error) + break; + break; + + /* + * Prepare to accept connections. + */ + case PRU_LISTEN: + if (inp->inp_lport == 0) + error = in_pcbbind(inp, NULL); + if (error == 0) + tp->t_state = TCPS_LISTEN; + break; + + /* + * Initiate connection to peer. + * Create a template for use in transmissions on this connection. + * Enter SYN_SENT state, and mark socket as connecting. + * Start keep-alive timer, and seed output sequence space. + * Send initial segment on connection. + */ + case PRU_CONNECT: + /* + * Must disallow TCP ``connections'' to multicast addresses. + */ + sinp = mtod(nam, struct sockaddr_in *); + if ((error = tcp_connect(tp, nam)) != 0) { + OS_DbgPrint(OSK_MID_TRACE,("TC: %d\n", error)); + break; + } + error = tcp_output(tp); + OS_DbgPrint(OSK_MID_TRACE,("TO: %d\n", error)); + break; + + /* + * Create a TCP connection between two sockets. + */ + case PRU_CONNECT2: + error = EOPNOTSUPP; + break; + + /* + * Initiate disconnect from peer. + * If connection never passed embryonic stage, just drop; + * else if don't need to let data drain, then can just drop anyways, + * else have to begin TCP shutdown process: mark socket disconnecting, + * drain unread data, state switch to reflect user close, and + * send segment (e.g. FIN) to peer. Socket will be really disconnected + * when peer sends FIN and acks ours. + * + * SHOULD IMPLEMENT LATER PRU_CONNECT VIA REALLOC TCPCB. + */ + case PRU_DISCONNECT: + tp = tcp_disconnect(tp); + break; + + /* + * Accept a connection. Essentially all the work is + * done at higher levels; just return the address + * of the peer, storing through addr. + */ + case PRU_ACCEPT: + in_setpeeraddr(inp, nam); + break; + + /* + * Mark the connection as being incapable of further output. + */ + case PRU_SHUTDOWN: + socantsendmore(so); + tp = tcp_usrclosed(tp); + if (tp) + error = tcp_output(tp); + break; + + /* + * After a receive, possibly send window update to peer. + */ + case PRU_RCVD: + (void) tcp_output(tp); + break; + + /* + * Do a send by putting data in output queue and updating urgent + * marker if URG set. Possibly send more data. + */ + case PRU_SEND_EOF: + case PRU_SEND: + sbappend(so, &so->so_snd, m); + if (nam && tp->t_state < TCPS_SYN_SENT) { + /* + * Do implied connect if not yet connected, + * initialize window to default value, and + * initialize maxseg/maxopd using peer's cached + * MSS. + */ + error = tcp_connect(tp, nam); + if (error) + break; + tp->snd_wnd = TTCP_CLIENT_SND_WND; + tcp_mss(tp, -1); + } + + if (req == PRU_SEND_EOF) { + /* + * Close the send side of the connection after + * the data is sent. + */ + socantsendmore(so); + tp = tcp_usrclosed(tp); + } + if (tp != NULL) + error = tcp_output(tp); + break; + + /* + * Abort the TCP. + */ + case PRU_ABORT: + tp = tcp_drop(tp, ECONNABORTED); + break; + + case PRU_SENSE: + ((struct stat *) m)->st_blksize = so->so_snd.sb_hiwat; + (void) splx(s); + return (0); + + case PRU_RCVOOB: + if ((so->so_oobmark == 0 && + (so->so_state & SS_RCVATMARK) == 0) || + so->so_options & SO_OOBINLINE || + tp->t_oobflags & TCPOOB_HADDATA) { + error = EINVAL; + break; + } + if ((tp->t_oobflags & TCPOOB_HAVEDATA) == 0) { + error = EWOULDBLOCK; + break; + } + m->m_len = 1; + *mtod(m, caddr_t) = tp->t_iobc; + if (((int)nam & MSG_PEEK) == 0) + tp->t_oobflags ^= (TCPOOB_HAVEDATA | TCPOOB_HADDATA); + break; + + case PRU_SENDOOB: + if (sbspace(&so->so_snd) < -512) { + m_freem(m); + error = ENOBUFS; + break; + } + /* + * According to RFC961 (Assigned Protocols), + * the urgent pointer points to the last octet + * of urgent data. We continue, however, + * to consider it to indicate the first octet + * of data past the urgent section. + * Otherwise, snd_up should be one lower. + */ + sbappend(so, &so->so_snd, m); + if (nam && tp->t_state < TCPS_SYN_SENT) { + /* + * Do implied connect if not yet connected, + * initialize window to default value, and + * initialize maxseg/maxopd using peer's cached + * MSS. + */ + error = tcp_connect(tp, nam); + if (error) + break; + tp->snd_wnd = TTCP_CLIENT_SND_WND; + tcp_mss(tp, -1); + } + tp->snd_up = tp->snd_una + so->so_snd.sb_cc; + tp->t_force = 1; + error = tcp_output(tp); + tp->t_force = 0; + break; + + case PRU_SOCKADDR: + in_setsockaddr(inp, nam); + break; + + case PRU_PEERADDR: + in_setpeeraddr(inp, nam); + break; + + /* + * TCP slow timer went off; going through this + * routine for tracing's sake. + */ + case PRU_SLOWTIMO: + tp = tcp_timers(tp, (int)nam); +#ifdef TCPDEBUG + req |= (int)nam << 8; /* for debug's sake */ +#endif + break; + + default: + panic("tcp_usrreq"); + } +#ifdef TCPDEBUG + if (tp && (so->so_options & SO_DEBUG)) + tcp_trace(TA_USER, ostate, tp, (struct tcpiphdr *)0, req); +#endif + splx(s); + return (error); +} + +/* + * Common subroutine to open a TCP connection to remote host specified + * by struct sockaddr_in in mbuf *nam. Call in_pcbbind to assign a local + * port number if needed. Call in_pcbladdr to do the routing and to choose + * a local host address (interface). If there is an existing incarnation + * of the same connection in TIME-WAIT state and if the remote host was + * sending CC options and if the connection duration was < MSL, then + * truncate the previous TIME-WAIT state and proceed. + * Initialize connection parameters and enter SYN-SENT state. + */ +int +tcp_connect(tp, nam) + register struct tcpcb *tp; + struct mbuf *nam; +{ + struct inpcb *inp/* = tp->t_inpcb */, *oinp; + struct socket *so; + struct tcpcb *otp; + struct sockaddr_in *sin = mtod(nam, struct sockaddr_in *); + struct sockaddr_in ifaddr; + int error; + struct rmxp_tao *taop; + struct rmxp_tao tao_noncached; + + if( !tp ) + panic( "No tcpcb provided.\n" ); + + if( !tp->t_inpcb ) + panic( "No inpcb provided.\n" ); + + inp = tp->t_inpcb; + + if( !inp->inp_socket ) + panic( "No socket provided.\n" ); + + so = inp->inp_socket; + + if (inp->inp_lport == 0) { + error = in_pcbbind(inp, NULL); + if (error) { + OS_DbgPrint(OSK_MID_TRACE,("error %d\n", error)); + return error; + } + } + /* + * Cannot simply call in_pcbconnect, because there might be an + * earlier incarnation of this same connection still in + * TIME_WAIT state, creating an ADDRINUSE error. + */ + error = in_pcbladdr(inp, nam, &ifaddr); + + if (error) { + OS_DbgPrint(OSK_MID_TRACE,("error %d\n", error)); + return error; + } + + oinp = in_pcblookup(inp->inp_pcbinfo->listhead, + sin->sin_addr, sin->sin_port, + inp->inp_laddr.s_addr != INADDR_ANY ? inp->inp_laddr + : ifaddr.sin_addr, + inp->inp_lport, 0); + + if (oinp) { + + if (oinp != inp && (otp = intotcpcb(oinp)) != NULL && + otp->t_state == TCPS_TIME_WAIT && + otp->t_duration < TCPTV_MSL && + (otp->t_flags & TF_RCVD_CC)) + otp = tcp_close(otp); + else { + + OS_DbgPrint(OSK_MID_TRACE,("error EADDRINUSE\n")); + return EADDRINUSE; + } + + } + + if (inp->inp_laddr.s_addr == INADDR_ANY) + inp->inp_laddr = ifaddr.sin_addr; + + inp->inp_faddr = sin->sin_addr; + inp->inp_fport = sin->sin_port; + + in_pcbrehash(inp); + + + tp->t_template = tcp_template(tp); + + if (tp->t_template == 0) { + in_pcbdisconnect(inp); + OS_DbgPrint(OSK_MID_TRACE,("error ENOBUFS\n")); + return ENOBUFS; + } + + + /* Compute window scaling to request. */ + while (tp->request_r_scale < TCP_MAX_WINSHIFT && + (TCP_MAXWIN << tp->request_r_scale) < so->so_rcv.sb_hiwat) + tp->request_r_scale++; + + + soisconnecting(so); + + tcpstat.tcps_connattempt++; + tp->t_state = TCPS_SYN_SENT; + tp->t_timer[TCPT_KEEP] = tcp_keepinit; + tp->rcv_nxt = 0; + tp->iss = tcp_iss; tcp_iss += TCP_ISSINCR/2; + + tcp_sendseqinit(tp); + + + /* + * Generate a CC value for this connection and + * check whether CC or CCnew should be used. + */ + if ((taop = tcp_gettaocache(tp->t_inpcb)) == NULL) { + taop = &tao_noncached; + bzero(taop, sizeof(*taop)); + } + + tp->cc_send = CC_INC(tcp_ccgen); + if (taop->tao_ccsent != 0 && + CC_GEQ(tp->cc_send, taop->tao_ccsent)) { + taop->tao_ccsent = tp->cc_send; + } else { + taop->tao_ccsent = 0; + tp->t_flags |= TF_SENDCCNEW; + } + + return 0; +} + +int +tcp_ctloutput(op, so, level, optname, mp) + int op; + struct socket *so; + int level, optname; + struct mbuf **mp; +{ + int error = 0, s; + struct inpcb *inp; + register struct tcpcb *tp; + register struct mbuf *m; + register int i; + + s = splnet(); + inp = sotoinpcb(so); + if (inp == NULL) { + splx(s); + if (op == PRCO_SETOPT && *mp) + (void) m_free(*mp); + return (ECONNRESET); + } + if (level != IPPROTO_TCP) { + error = ip_ctloutput(op, so, level, optname, mp); + splx(s); + return (error); + } + tp = intotcpcb(inp); + + switch (op) { + + case PRCO_SETOPT: + m = *mp; + switch (optname) { + + case TCP_NODELAY: + if (m == NULL || m->m_len < sizeof (int)) + error = EINVAL; + else if (*mtod(m, int *)) + tp->t_flags |= TF_NODELAY; + else + tp->t_flags &= ~TF_NODELAY; + break; + + case TCP_MAXSEG: + if (m && (i = *mtod(m, int *)) > 0 && i <= tp->t_maxseg) + tp->t_maxseg = i; + else + error = EINVAL; + break; + + case TCP_NOOPT: + if (m == NULL || m->m_len < sizeof (int)) + error = EINVAL; + else if (*mtod(m, int *)) + tp->t_flags |= TF_NOOPT; + else + tp->t_flags &= ~TF_NOOPT; + break; + + case TCP_NOPUSH: + if (m == NULL || m->m_len < sizeof (int)) + error = EINVAL; + else if (*mtod(m, int *)) + tp->t_flags |= TF_NOPUSH; + else + tp->t_flags &= ~TF_NOPUSH; + break; + + default: + error = ENOPROTOOPT; + break; + } + if (m) + (void) m_free(m); + break; + + case PRCO_GETOPT: + *mp = m = m_get(M_WAIT, MT_SOOPTS); + m->m_len = sizeof(int); + + switch (optname) { + case TCP_NODELAY: + *mtod(m, int *) = tp->t_flags & TF_NODELAY; + break; + case TCP_MAXSEG: + *mtod(m, int *) = tp->t_maxseg; + break; + case TCP_NOOPT: + *mtod(m, int *) = tp->t_flags & TF_NOOPT; + break; + case TCP_NOPUSH: + *mtod(m, int *) = tp->t_flags & TF_NOPUSH; + break; + default: + error = ENOPROTOOPT; + break; + } + break; + } + splx(s); + return (error); +} + +/* + * tcp_sendspace and tcp_recvspace are the default send and receive window + * sizes, respectively. These are obsolescent (this information should + * be set by the route). + */ +u_long tcp_sendspace = 1024*16; +u_long tcp_recvspace = 1024*16; + +/* + * Attach TCP protocol to socket, allocating + * internet protocol control block, tcp control block, + * bufer space, and entering LISTEN state if to accept connections. + */ +int +tcp_attach(so) + struct socket *so; +{ + register struct tcpcb *tp; + struct inpcb *inp; + int error; + + if (so->so_snd.sb_hiwat == 0 || so->so_rcv.sb_hiwat == 0) { + error = soreserve(so, tcp_sendspace, tcp_recvspace); + if (error) + return (error); + } + error = in_pcballoc(so, &tcbinfo); + if (error) + return (error); + inp = sotoinpcb(so); + tp = tcp_newtcpcb(inp); + if (tp == 0) { + int nofd = so->so_state & SS_NOFDREF; /* XXX */ + + so->so_state &= ~SS_NOFDREF; /* don't free the socket yet */ + in_pcbdetach(inp); + so->so_state |= nofd; + OS_DbgPrint(OSK_MID_TRACE,("ENOBUFS: no tcpcb allocated\n")); + return (ENOBUFS); + } + tp->t_state = TCPS_CLOSED; + return (0); +} + +/* + * Initiate (or continue) disconnect. + * If embryonic state, just send reset (once). + * If in ``let data drain'' option and linger null, just drop. + * Otherwise (hard), mark socket disconnecting and drop + * current input data; switch states based on user close, and + * send segment to peer (with FIN). + */ +struct tcpcb * +tcp_disconnect(tp) + register struct tcpcb *tp; +{ + struct socket *so = tp->t_inpcb->inp_socket; + + if (tp->t_state < TCPS_ESTABLISHED) + tp = tcp_close(tp); + else if ((so->so_options & SO_LINGER) && so->so_linger == 0) + tp = tcp_drop(tp, 0); + else { + soisdisconnecting(so); + sbflush(&so->so_rcv); + tp = tcp_usrclosed(tp); + if (tp) + (void) tcp_output(tp); + } + return (tp); +} + +/* + * User issued close, and wish to trail through shutdown states: + * if never received SYN, just forget it. If got a SYN from peer, + * but haven't sent FIN, then go to FIN_WAIT_1 state to send peer a FIN. + * If already got a FIN from peer, then almost done; go to LAST_ACK + * state. In all other cases, have already sent FIN to peer (e.g. + * after PRU_SHUTDOWN), and just have to play tedious game waiting + * for peer to send FIN or not respond to keep-alives, etc. + * We can let the user exit from the close as soon as the FIN is acked. + */ +struct tcpcb * +tcp_usrclosed(tp) + register struct tcpcb *tp; +{ + + switch (tp->t_state) { + + case TCPS_CLOSED: + case TCPS_LISTEN: + tp->t_state = TCPS_CLOSED; + tp = tcp_close(tp); + break; + + case TCPS_SYN_SENT: + case TCPS_SYN_RECEIVED: + tp->t_flags |= TF_NEEDFIN; + break; + + case TCPS_ESTABLISHED: + tp->t_state = TCPS_FIN_WAIT_1; + break; + + case TCPS_CLOSE_WAIT: + tp->t_state = TCPS_LAST_ACK; + break; + } + if (tp && tp->t_state >= TCPS_FIN_WAIT_2) { + soisdisconnected(tp->t_inpcb->inp_socket); + /* To prevent the connection hanging in FIN_WAIT_2 forever. */ + if (tp->t_state == TCPS_FIN_WAIT_2) + tp->t_timer[TCPT_2MSL] = tcp_maxidle; + } + return (tp); +} + +/* + * Sysctl for tcp variables. + */ +int +tcp_sysctl(name, namelen, oldp, oldlenp, newp, newlen) + int *name; + u_int namelen; + void *oldp; + size_t *oldlenp; + void *newp; + size_t newlen; +{ + /* All sysctl names at this level are terminal. */ + if (namelen != 1) + return (ENOTDIR); + + switch (name[0]) { + case TCPCTL_DO_RFC1323: + return (sysctl_int(oldp, oldlenp, newp, newlen, + &tcp_do_rfc1323)); + case TCPCTL_DO_RFC1644: + return (sysctl_int(oldp, oldlenp, newp, newlen, + &tcp_do_rfc1644)); + case TCPCTL_MSSDFLT: + return (sysctl_int(oldp, oldlenp, newp, newlen, + &tcp_mssdflt)); + case TCPCTL_STATS: + return (sysctl_rdstruct(oldp, oldlenp, newp, &tcpstat, + sizeof tcpstat)); + case TCPCTL_RTTDFLT: + return (sysctl_int(oldp, oldlenp, newp, newlen, &tcp_rttdflt)); + case TCPCTL_KEEPIDLE: + return (sysctl_int(oldp, oldlenp, newp, newlen, + &tcp_keepidle)); + case TCPCTL_KEEPINTVL: + return (sysctl_int(oldp, oldlenp, newp, newlen, + &tcp_keepintvl)); + case TCPCTL_SENDSPACE: + return (sysctl_int(oldp, oldlenp, newp, newlen, + (int *)&tcp_sendspace)); /* XXX */ + case TCPCTL_RECVSPACE: + return (sysctl_int(oldp, oldlenp, newp, newlen, + (int *)&tcp_recvspace)); /* XXX */ + case TCPCTL_KEEPINIT: + return (sysctl_int(oldp, oldlenp, newp, newlen, + &tcp_keepinit)); + default: + return (ENOPROTOOPT); + } + /* NOTREACHED */ +} diff --git a/reactos/lib/oskittcp/oskittcp/uipc_domain.c b/reactos/lib/oskittcp/oskittcp/uipc_domain.c new file mode 100644 index 00000000000..08a1800eb41 --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/uipc_domain.c @@ -0,0 +1,231 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)uipc_domain.c 8.2 (Berkeley) 10/18/93 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void pffasttimo __P((void *)); +void pfslowtimo __P((void *)); + +struct domain *domains; + +#define ADDDOMAIN(x) { \ + extern struct domain __CONCAT(x,domain); \ + __CONCAT(x,domain.dom_next) = domains; \ + domains = &__CONCAT(x,domain); \ +} + +extern struct linker_set domain_set; + +void +domaininit() +{ + register struct domain *dp, **dpp; + register struct protosw *pr; + + printf("domaininit starting\n"); + + /* + * NB - local domain is always present. + */ + ADDDOMAIN(local); + ADDDOMAIN(inet); + + for (dpp = (struct domain **)domain_set.ls_items; *dpp; dpp++) { + printf("(1) Domain %s counting\n", (**dpp).dom_name); + (**dpp).dom_next = domains; + domains = *dpp; + } + +/* - not in our sources +#ifdef ISDN + ADDDOMAIN(isdn); +#endif +*/ + for (dp = domains; dp; dp = dp->dom_next) { + printf("(1) Domain %s initializing\n", dp->dom_name); + if (dp->dom_init) + (*dp->dom_init)(); + for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) { + printf("Registering protocols for %s\n", dp->dom_name); + if (pr->pr_init) + (*pr->pr_init)(); + } + if( dp->dom_next && !dp->dom_next->dom_name ) + dp->dom_next = 0; + } + + if (max_linkhdr < 16) /* XXX */ + max_linkhdr = 16; + max_hdr = max_linkhdr + max_protohdr; + max_datalen = MHLEN - max_hdr; + timeout(pffasttimo, (void *)0, 1); + timeout(pfslowtimo, (void *)0, 1); + + printf("Domaininit done\n"); +} + +struct protosw * +pffindtype(family, type) + int family, type; +{ + register struct domain *dp; + register struct protosw *pr; + + for (dp = domains; dp; dp = dp->dom_next) + if (dp->dom_family == family) + goto found; + return (0); +found: + for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) + if (pr->pr_type && pr->pr_type == type) + return (pr); + return (0); +} + +struct protosw * +pffindproto(family, protocol, type) + int family, protocol, type; +{ + register struct domain *dp; + register struct protosw *pr; + struct protosw *maybe = 0; + + if (family == 0) + return (0); + for (dp = domains; dp; dp = dp->dom_next) + if (dp->dom_family == family) + goto found; + return (0); +found: + for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) { + if ((pr->pr_protocol == protocol) && (pr->pr_type == type)) + return (pr); + + if (type == SOCK_RAW && pr->pr_type == SOCK_RAW && + pr->pr_protocol == 0 && maybe == (struct protosw *)0) + maybe = pr; + } + return (maybe); +} + +int +net_sysctl(name, namelen, oldp, oldlenp, newp, newlen, p) + int *name; + u_int namelen; + void *oldp; + size_t *oldlenp; + void *newp; + size_t newlen; + struct proc *p; +{ + register struct domain *dp; + register struct protosw *pr; + int family, protocol; + + /* + * All sysctl names at this level are nonterminal; + * next two components are protocol family and protocol number, + * then at least one addition component. + */ + if (namelen < 3) + return (EISDIR); /* overloaded */ + family = name[0]; + protocol = name[1]; + + if (family == 0) + return (0); + for (dp = domains; dp; dp = dp->dom_next) + if (dp->dom_family == family) + goto found; + return (ENOPROTOOPT); +found: + for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) + if (pr->pr_protocol == protocol && pr->pr_sysctl) + return ((*pr->pr_sysctl)(name + 2, namelen - 2, + oldp, oldlenp, newp, newlen)); + return (ENOPROTOOPT); +} + +void +pfctlinput(cmd, sa) + int cmd; + struct sockaddr *sa; +{ + register struct domain *dp; + register struct protosw *pr; + + for (dp = domains; dp; dp = dp->dom_next) + for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) + if (pr->pr_ctlinput) + (*pr->pr_ctlinput)(cmd, sa, (caddr_t)0); +} + +void +pfslowtimo(arg) + void *arg; +{ + register struct domain *dp; + register struct protosw *pr; + + for (dp = domains; dp; dp = dp->dom_next) + for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) + if (pr->pr_slowtimo) + (*pr->pr_slowtimo)(); + timeout(pfslowtimo, (void *)0, hz/2); +} + +void +pffasttimo(arg) + void *arg; +{ + register struct domain *dp; + register struct protosw *pr; + + for (dp = domains; dp; dp = dp->dom_next) + for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) + if (pr->pr_fasttimo) + (*pr->pr_fasttimo)(); + timeout(pffasttimo, (void *)0, hz/5); +} diff --git a/reactos/lib/oskittcp/oskittcp/uipc_mbuf.c b/reactos/lib/oskittcp/oskittcp/uipc_mbuf.c new file mode 100644 index 00000000000..222efa3739f --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/uipc_mbuf.c @@ -0,0 +1,769 @@ +/* + * Copyright (c) 1997-1998 University of Utah and the Flux Group. + * All rights reserved. + * + * This file is part of the Flux OSKit. The OSKit is free software, also known + * as "open source;" you can redistribute it and/or modify it under the terms + * of the GNU General Public License (GPL), version 2, as published by the Free + * Software Foundation (FSF). To explore alternate licensing terms, contact + * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. + * + * The OSKit 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 GPL for more details. You should have + * received a copy of the GPL along with the OSKit; see the file COPYING. If + * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. + */ +/* + * Copyright (c) 1982, 1986, 1988, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)uipc_mbuf.c 8.2 (Berkeley) 1/4/94 + */ + +#include +#include +#include +#include +#define MBTYPES +#include +#include +#include +#include +#include + +#include +#include + +#ifndef OSKIT +extern vm_map_t mb_map; +struct mbuf *mbutl; +char *mclrefcnt; +int mb_map_full; + +void +mbinit() +{ + int s; + +#if CLBYTES < 4096 +#define NCL_INIT (4096/CLBYTES) +#else +#define NCL_INIT 1 +#endif + s = splimp(); + if (m_clalloc(NCL_INIT, M_DONTWAIT) == 0) + goto bad; + splx(s); + return; +bad: + panic("mbinit"); +} + +/* + * Allocate some number of mbuf clusters + * and place on cluster free list. + * Must be called at splimp. + */ +/* ARGSUSED */ +int +m_clalloc(ncl, nowait) + register int ncl; + int nowait; +{ + static int logged; + register caddr_t p; + register int i; + int npg; + + /* + * Once we run out of map space, it will be impossible + * to get any more (nothing is ever freed back to the + * map). + */ + if (mb_map_full) + return (0); + + npg = ncl * CLSIZE; + p = (caddr_t)kmem_malloc(mb_map, ctob(npg), + nowait ? M_NOWAIT : M_WAITOK); + /* + * Either the map is now full, or this is nowait and there + * are no pages left. + */ + if (p == NULL) + return (0); + + ncl = ncl * CLBYTES / MCLBYTES; + for (i = 0; i < ncl; i++) { + ((union mcluster *)p)->mcl_next = mclfree; + mclfree = (union mcluster *)p; + p += MCLBYTES; + mbstat.m_clfree++; + } + mbstat.m_clusters += ncl; + return (1); +} +#endif /* !OSKIT */ + +/* + * When MGET failes, ask protocols to free space when short of memory, + * then re-attempt to allocate an mbuf. + */ +struct mbuf * +m_retry(i, t) + int i, t; +{ + register struct mbuf *m; + + m_reclaim(); +/* + * I'm getting rid of the utterly ugly redefinition of m_retry + * - same for m_retryhdr below + */ + MGET_DONT_RECURSE(m, i, t); + if (m != NULL) + mbstat.m_wait++; + else + mbstat.m_drops++; + return (m); +} + +/* + * As above; retry an MGETHDR. + */ +struct mbuf * +m_retryhdr(i, t) + int i, t; +{ + register struct mbuf *m; + + m_reclaim(); + MGETHDR_DONT_RECURSE(m, i, t); + if (m != NULL) + mbstat.m_wait++; + else + mbstat.m_drops++; + return (m); +} + +void +m_reclaim() +{ + register struct domain *dp; + register struct protosw *pr; + int s = splimp(); + + for (dp = domains; dp; dp = dp->dom_next) { + for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) { + if (pr->pr_drain) + (*pr->pr_drain)(); + } + } + + splx(s); + mbstat.m_drain++; +} + +/* + * Space allocation routines. + * These are also available as macros + * for critical paths. + */ +struct mbuf * +m_get(nowait, type) + int nowait, type; +{ + register struct mbuf *m; + + MGET(m, nowait, type); + return (m); +} + +struct mbuf * +m_gethdr(nowait, type) + int nowait, type; +{ + register struct mbuf *m; + + MGETHDR(m, nowait, type); + return (m); +} + +struct mbuf * +m_getclr(nowait, type) + int nowait, type; +{ + register struct mbuf *m; + + MGET(m, nowait, type); + if (m == 0) + return (0); + bzero(mtod(m, caddr_t), MLEN); + return (m); +} + +struct mbuf * +m_free(m) + struct mbuf *m; +{ + register struct mbuf *n; + + MFREE(m, n); + return (n); +} + +void +m_freem(m) + register struct mbuf *m; +{ + register struct mbuf *n; + + if (m == NULL) + return; + do { + MFREE(m, n); + m = n; + } while (m); +} + +/* + * Mbuffer utility routines. + */ + +/* + * Lesser-used path for M_PREPEND: + * allocate new mbuf to prepend to chain, + * copy junk along. + */ +struct mbuf * +m_prepend(m, len, how) + register struct mbuf *m; + int len, how; +{ + struct mbuf *mn; + + MGET(mn, how, m->m_type); + if (mn == (struct mbuf *)NULL) { + m_freem(m); + return ((struct mbuf *)NULL); + } + if (m->m_flags & M_PKTHDR) { + M_COPY_PKTHDR(mn, m); + m->m_flags &= ~M_PKTHDR; + } + mn->m_next = m; + m = mn; + if (len < MHLEN) + MH_ALIGN(m, len); + m->m_len = len; + return (m); +} + +/* + * Make a copy of an mbuf chain starting "off0" bytes from the beginning, + * continuing for "len" bytes. If len is M_COPYALL, copy to end of mbuf. + * The wait parameter is a choice of M_WAIT/M_DONTWAIT from caller. + */ +int MCFail; + +struct mbuf * +m_copym(m, off0, len, wait) + register struct mbuf *m; + int off0, wait; + register int len; +{ + register struct mbuf *n, **np; + register int off = off0; + struct mbuf *top; + int copyhdr = 0; + + if (off < 0 || len < 0) + panic("m_copym"); + if (off == 0 && m->m_flags & M_PKTHDR) + copyhdr = 1; + while (off > 0) { + if (m == 0) + panic("m_copym"); + if (off < m->m_len) + break; + off -= m->m_len; + m = m->m_next; + } + np = ⊤ + top = 0; + while (len > 0) { + if (m == 0) { + if (len != M_COPYALL) + panic("m_copym"); + break; + } + MGET(n, wait, m->m_type); + *np = n; + if (n == 0) + goto nospace; + if (copyhdr) { + M_COPY_PKTHDR(n, m); + if (len == M_COPYALL) + n->m_pkthdr.len -= off0; + else + n->m_pkthdr.len = len; + copyhdr = 0; + } + n->m_len = min(len, m->m_len - off); + + if (m->m_flags & M_EXT) { + n->m_data = m->m_data + off; +#ifdef OSKIT + oskit_bufio_addref(m->m_ext.ext_bufio); +#else + mclrefcnt[mtocl(m->m_ext.ext_buf)]++; +#endif /* OSKIT */ + n->m_ext = m->m_ext; + n->m_flags |= M_EXT; + } else + bcopy(mtod(m, caddr_t)+off, mtod(n, caddr_t), + (unsigned)n->m_len); + if (len != M_COPYALL) + len -= n->m_len; + off = 0; + m = m->m_next; + np = &n->m_next; + } + if (top == 0) + MCFail++; + return (top); +nospace: + m_freem(top); + MCFail++; + return (0); +} + +/* + * Copy data from an mbuf chain starting "off" bytes from the beginning, + * continuing for "len" bytes, into the indicated buffer. + */ +void +m_copydata(m, off, len, cp) + register struct mbuf *m; + register int off; + register int len; + caddr_t cp; +{ + register unsigned count; + + if (off < 0 || len < 0) + panic("m_copydata"); + while (off > 0) { + if (m == 0) + panic("m_copydata"); + if (off < m->m_len) + break; + off -= m->m_len; + m = m->m_next; + } + while (len > 0) { + if (m == 0) + panic("m_copydata"); + count = min(m->m_len - off, len); + bcopy(mtod(m, caddr_t) + off, cp, count); + len -= count; + cp += count; + off = 0; + m = m->m_next; + } +} + +/* + * Concatenate mbuf chain n to m. + * Both chains must be of the same type (e.g. MT_DATA). + * Any m_pkthdr is not updated. + */ +void +m_cat(m, n) + register struct mbuf *m, *n; +{ + while (m->m_next) + m = m->m_next; + while (n) { + if (m->m_flags & M_EXT || + m->m_data + m->m_len + n->m_len >= &m->m_dat[MLEN]) { + /* just join the two chains */ + m->m_next = n; + return; + } + /* splat the data from one into the other */ + bcopy(mtod(n, caddr_t), mtod(m, caddr_t) + m->m_len, + (u_int)n->m_len); + m->m_len += n->m_len; + n = m_free(n); + } +} + +void +m_adj(mp, req_len) + struct mbuf *mp; + int req_len; +{ + register int len = req_len; + register struct mbuf *m; + register count; + + if ((m = mp) == NULL) + return; + if (len >= 0) { + /* + * Trim from head. + */ + while (m != NULL && len > 0) { + if (m->m_len <= len) { + len -= m->m_len; + m->m_len = 0; + m = m->m_next; + } else { + m->m_len -= len; + m->m_data += len; + len = 0; + } + } + m = mp; + if (mp->m_flags & M_PKTHDR) + m->m_pkthdr.len -= (req_len - len); + } else { + /* + * Trim from tail. Scan the mbuf chain, + * calculating its length and finding the last mbuf. + * If the adjustment only affects this mbuf, then just + * adjust and return. Otherwise, rescan and truncate + * after the remaining size. + */ + len = -len; + count = 0; + for (;;) { + count += m->m_len; + if (m->m_next == (struct mbuf *)0) + break; + m = m->m_next; + } + if (m->m_len >= len) { + m->m_len -= len; + if (mp->m_flags & M_PKTHDR) + mp->m_pkthdr.len -= len; + return; + } + count -= len; + if (count < 0) + count = 0; + /* + * Correct length for chain is "count". + * Find the mbuf with last data, adjust its length, + * and toss data from remaining mbufs on chain. + */ + m = mp; + if (m->m_flags & M_PKTHDR) + m->m_pkthdr.len = count; + for (; m; m = m->m_next) { + if (m->m_len >= count) { + m->m_len = count; + break; + } + count -= m->m_len; + } + while (m->m_next) + (m = m->m_next) ->m_len = 0; + } +} + +/* + * Rearange an mbuf chain so that len bytes are contiguous + * and in the data area of an mbuf (so that mtod and dtom + * will work for a structure of size len). Returns the resulting + * mbuf chain on success, frees it and returns null on failure. + * If there is room, it will add up to max_protohdr-len extra bytes to the + * contiguous region in an attempt to avoid being called next time. + */ +int MPFail; + +struct mbuf * +m_pullup(n, len) + register struct mbuf *n; + int len; +{ + register struct mbuf *m; + register int count; + int space; + + /* + * If first mbuf has no cluster, and has room for len bytes + * without shifting current data, pullup into it, + * otherwise allocate a new mbuf to prepend to the chain. + */ + if ((n->m_flags & M_EXT) == 0 && + n->m_data + len < &n->m_dat[MLEN] && n->m_next) { + if (n->m_len >= len) + return (n); + m = n; + n = n->m_next; + len -= m->m_len; + } else { + if (len > MHLEN) + goto bad; + MGET(m, M_DONTWAIT, n->m_type); + if (m == 0) + goto bad; + m->m_len = 0; + if (n->m_flags & M_PKTHDR) { + M_COPY_PKTHDR(m, n); + n->m_flags &= ~M_PKTHDR; + } + } + space = &m->m_dat[MLEN] - (m->m_data + m->m_len); + do { + count = min(min(max(len, max_protohdr), space), n->m_len); + bcopy(mtod(n, caddr_t), mtod(m, caddr_t) + m->m_len, + (unsigned)count); + len -= count; + m->m_len += count; + n->m_len -= count; + space -= count; + if (n->m_len) + n->m_data += count; + else + n = m_free(n); + } while (len > 0 && n); + if (len > 0) { + (void) m_free(m); + goto bad; + } + m->m_next = n; + return (m); +bad: + m_freem(n); + MPFail++; + return (0); +} + +/* + * Partition an mbuf chain in two pieces, returning the tail -- + * all but the first len0 bytes. In case of failure, it returns NULL and + * attempts to restore the chain to its original state. + */ +struct mbuf * +m_split(m0, len0, wait) + register struct mbuf *m0; + int len0, wait; +{ + register struct mbuf *m, *n; + unsigned len = len0, remain; + + for (m = m0; m && len > m->m_len; m = m->m_next) + len -= m->m_len; + if (m == 0) + return (0); + remain = m->m_len - len; + if (m0->m_flags & M_PKTHDR) { + MGETHDR(n, wait, m0->m_type); + if (n == 0) + return (0); + n->m_pkthdr.rcvif = m0->m_pkthdr.rcvif; + n->m_pkthdr.len = m0->m_pkthdr.len - len0; + m0->m_pkthdr.len = len0; + if (m->m_flags & M_EXT) + goto extpacket; + if (remain > MHLEN) { + /* m can't be the lead packet */ + MH_ALIGN(n, 0); + n->m_next = m_split(m, len, wait); + if (n->m_next == 0) { + (void) m_free(n); + return (0); + } else + return (n); + } else + MH_ALIGN(n, remain); + } else if (remain == 0) { + n = m->m_next; + m->m_next = 0; + return (n); + } else { + MGET(n, wait, m->m_type); + if (n == 0) + return (0); + M_ALIGN(n, remain); + } +extpacket: + if (m->m_flags & M_EXT) { + n->m_flags |= M_EXT; + n->m_ext = m->m_ext; +#ifdef OSKIT + oskit_bufio_addref(m->m_ext.ext_bufio); +#else + mclrefcnt[mtocl(m->m_ext.ext_buf)]++; +#endif /* OSKIT */ + m->m_ext.ext_size = 0; /* For Accounting XXXXXX danger */ + n->m_data = m->m_data + len; + } else { + bcopy(mtod(m, caddr_t) + len, mtod(n, caddr_t), remain); + } + n->m_len = remain; + m->m_len = len; + n->m_next = m->m_next; + m->m_next = 0; + return (n); +} + +#ifndef OSKIT +/* currently not OS Kit approved, and shouldn't be needed in the first place */ + +/* + * Routine to copy from device local memory into mbufs. + */ +struct mbuf * +m_devget(buf, totlen, off0, ifp, copy) + char *buf; + int totlen, off0; + struct ifnet *ifp; + void (*copy)(); +{ + register struct mbuf *m; + struct mbuf *top = 0, **mp = ⊤ + register int off = off0, len; + register char *cp; + char *epkt; + + cp = buf; + epkt = cp + totlen; + if (off) { + cp += off + 2 * sizeof(u_short); + totlen -= 2 * sizeof(u_short); + } + MGETHDR(m, M_DONTWAIT, MT_DATA); + if (m == 0) + return (0); + m->m_pkthdr.rcvif = ifp; + m->m_pkthdr.len = totlen; + m->m_len = MHLEN; + + while (totlen > 0) { + if (top) { + MGET(m, M_DONTWAIT, MT_DATA); + if (m == 0) { + m_freem(top); + return (0); + } + m->m_len = MLEN; + } + len = min(totlen, epkt - cp); + if (len >= MINCLSIZE) { + MCLGET(m, M_DONTWAIT); + if (m->m_flags & M_EXT) + m->m_len = len = min(len, MCLBYTES); + else + len = m->m_len; + } else { + /* + * Place initial small packet/header at end of mbuf. + */ + if (len < m->m_len) { + if (top == 0 && len + max_linkhdr <= m->m_len) + m->m_data += max_linkhdr; + m->m_len = len; + } else + len = m->m_len; + } + if (copy) + copy(cp, mtod(m, caddr_t), (unsigned)len); + else + bcopy(cp, mtod(m, caddr_t), (unsigned)len); + cp += len; + *mp = m; + mp = &m->m_next; + totlen -= len; + if (cp == epkt) + cp = buf; + } + return (top); +} + +#endif /* !OSKIT */ + +/* + * Copy data from a buffer back into the indicated mbuf chain, + * starting "off" bytes from the beginning, extending the mbuf + * chain if necessary. + */ +void +m_copyback(m0, off, len, cp) + struct mbuf *m0; + register int off; + register int len; + caddr_t cp; +{ + register int mlen; + register struct mbuf *m = m0, *n; + int totlen = 0; + + if (m0 == 0) + return; + while (off > (mlen = m->m_len)) { + off -= mlen; + totlen += mlen; + if (m->m_next == 0) { + n = m_getclr(M_DONTWAIT, m->m_type); + if (n == 0) + goto out; + n->m_len = min(MLEN, len + off); + m->m_next = n; + } + m = m->m_next; + } + while (len > 0) { + mlen = min (m->m_len - off, len); + bcopy(cp, off + mtod(m, caddr_t), (unsigned)mlen); + cp += mlen; + len -= mlen; + mlen += off; + off = 0; + totlen += mlen; + if (len == 0) + break; + if (m->m_next == 0) { + n = m_get(M_DONTWAIT, m->m_type); + if (n == 0) + break; + n->m_len = min(MLEN, len); + m->m_next = n; + } + m = m->m_next; + } +out: if (((m = m0)->m_flags & M_PKTHDR) && (m->m_pkthdr.len < totlen)) + m->m_pkthdr.len = totlen; +} diff --git a/reactos/lib/oskittcp/oskittcp/uipc_socket.c b/reactos/lib/oskittcp/oskittcp/uipc_socket.c new file mode 100644 index 00000000000..8d46e40c533 --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/uipc_socket.c @@ -0,0 +1,1061 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)uipc_socket.c 8.3 (Berkeley) 4/15/94 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Exported to userland via sysctl + */ +int somaxconn = SOMAXCONN; + +/* + * Socket operation routines. + * These routines are called by the routines in + * sys_socket.c or from a system process, and + * implement the semantics of socket operations by + * switching out to the protocol specific routines. + */ +/*ARGSUSED*/ +int +socreate(dom, aso, type, proto) + int dom; + struct socket **aso; + register int type; + int proto; +{ + struct proc *p = curproc; /* XXX */ + register struct protosw *prp; + register struct socket *so; + register int error; + + if (proto) + prp = pffindproto(dom, proto, type); + else + prp = pffindtype(dom, type); + if (prp == 0 || prp->pr_usrreq == 0) + return (EPROTONOSUPPORT); + if (prp->pr_type != type) + return (EPROTOTYPE); + MALLOC(so, struct socket *, sizeof(*so), M_SOCKET, M_WAIT); + bzero((caddr_t)so, sizeof(*so)); + so->so_type = type; + so->so_proto = prp; + error = + (*prp->pr_usrreq)(so, PRU_ATTACH, + (struct mbuf *)0, (struct mbuf *)proto, (struct mbuf *)0); + if (error) { + so->so_state |= SS_NOFDREF; + sofree(so); + return (error); + } + *aso = so; + return (0); +} + +int +sobind(so, nam) + struct socket *so; + struct mbuf *nam; +{ + int s = splnet(); + int error; + + error = + (*so->so_proto->pr_usrreq)(so, PRU_BIND, + (struct mbuf *)0, nam, (struct mbuf *)0); + splx(s); + return (error); +} + +int +solisten(so, backlog) + register struct socket *so; + int backlog; +{ + int s = splnet(), error; + + error = + (*so->so_proto->pr_usrreq)(so, PRU_LISTEN, + (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0); + if (error) { + splx(s); + return (error); + } + if (so->so_q == 0) + so->so_options |= SO_ACCEPTCONN; + if (backlog < 0 || backlog > somaxconn) + backlog = somaxconn; + so->so_qlimit = backlog; + splx(s); + return (0); +} + +void +sofree(so) + register struct socket *so; +{ + + if (so->so_pcb || (so->so_state & SS_NOFDREF) == 0) + return; + if (so->so_head) { + if (!soqremque(so, 0) && !soqremque(so, 1)) + panic("sofree dq"); + so->so_head = 0; + } + sbrelease(&so->so_snd); + sorflush(so); + FREE(so, M_SOCKET); +} + +/* + * Close a socket on last file table reference removal. + * Initiate disconnect if connected. + * Free socket when disconnect complete. + */ +int +soclose(so) + register struct socket *so; +{ + int s = splnet(); /* conservative */ + int error = 0; + + if (so->so_options & SO_ACCEPTCONN) { + while (so->so_q0) + (void) soabort(so->so_q0); + while (so->so_q) + (void) soabort(so->so_q); + } + if (so->so_pcb == 0) + goto discard; + if (so->so_state & SS_ISCONNECTED) { + if ((so->so_state & SS_ISDISCONNECTING) == 0) { + error = sodisconnect(so); + if (error) + goto drop; + } + if (so->so_options & SO_LINGER) { + if ((so->so_state & SS_ISDISCONNECTING) && + (so->so_state & SS_NBIO)) + goto drop; + while (so->so_state & SS_ISCONNECTED) { + error = tsleep((caddr_t)&so->so_timeo, + PSOCK | PCATCH, netcls, so->so_linger); + if (error) + break; + } + } + } +drop: + if (so->so_pcb) { + int error2 = + (*so->so_proto->pr_usrreq)(so, PRU_DETACH, + (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0); + if (error == 0) + error = error2; + } +discard: + if (so->so_state & SS_NOFDREF) + panic("soclose: NOFDREF"); + so->so_state |= SS_NOFDREF; + sofree(so); + splx(s); + return (error); +} + +/* + * Must be called at splnet... + */ +int +soabort(so) + struct socket *so; +{ + + return ( + (*so->so_proto->pr_usrreq)(so, PRU_ABORT, + (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0)); +} + +int +soaccept(so, nam) + register struct socket *so; + struct mbuf *nam; +{ + int s = splnet(); + int error; + + if ((so->so_state & SS_NOFDREF) == 0) + panic("soaccept: !NOFDREF"); + so->so_state &= ~SS_NOFDREF; + error = (*so->so_proto->pr_usrreq)(so, PRU_ACCEPT, + (struct mbuf *)0, nam, (struct mbuf *)0); + splx(s); + return (error); +} + +int +soconnect(so, nam) + register struct socket *so; + struct mbuf *nam; +{ + int s; + int error; + + if (so->so_options & SO_ACCEPTCONN) + return (EOPNOTSUPP); + s = splnet(); + /* + * If protocol is connection-based, can only connect once. + * Otherwise, if connected, try to disconnect first. + * This allows user to disconnect by connecting to, e.g., + * a null address. + */ + if (so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING) && + ((so->so_proto->pr_flags & PR_CONNREQUIRED) || + (error = sodisconnect(so)))) + error = EISCONN; + else + error = (*so->so_proto->pr_usrreq)(so, PRU_CONNECT, + (struct mbuf *)0, nam, (struct mbuf *)0); + splx(s); + return (error); +} + +int +soconnect2(so1, so2) + register struct socket *so1; + struct socket *so2; +{ + int s = splnet(); + int error; + + error = (*so1->so_proto->pr_usrreq)(so1, PRU_CONNECT2, + (struct mbuf *)0, (struct mbuf *)so2, (struct mbuf *)0); + splx(s); + return (error); +} + +int +sodisconnect(so) + register struct socket *so; +{ + int s = splnet(); + int error; + + if ((so->so_state & SS_ISCONNECTED) == 0) { + error = ENOTCONN; + goto bad; + } + if (so->so_state & SS_ISDISCONNECTING) { + error = EALREADY; + goto bad; + } + error = (*so->so_proto->pr_usrreq)(so, PRU_DISCONNECT, + (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0); +bad: + splx(s); + return (error); +} + +#define SBLOCKWAIT(f) (((f) & MSG_DONTWAIT) ? M_NOWAIT : M_WAITOK) +/* + * Send on a socket. + * If send must go all at once and message is larger than + * send buffering, then hard error. + * Lock against other senders. + * If must go all at once and not enough room now, then + * inform user that this would block and do nothing. + * Otherwise, if nonblocking, send as much as possible. + * The data to be sent is described by "uio" if nonzero, + * otherwise by the mbuf chain "top" (which must be null + * if uio is not). Data provided in mbuf chain must be small + * enough to send all at once. + * + * Returns nonzero on error, timeout or signal; callers + * must check for short counts if EINTR/ERESTART are returned. + * Data and control buffers are freed on return. + */ +int +sosend(so, addr, uio, top, control, flags) + register struct socket *so; + struct mbuf *addr; + struct uio *uio; + struct mbuf *top; + struct mbuf *control; + int flags; +{ + struct proc *p = curproc; /* XXX */ + struct mbuf **mp; + register struct mbuf *m; + register long space, len, resid; + int clen = 0, error, s, dontroute, mlen; + int atomic = sosendallatonce(so) || top; + + if (uio) + resid = uio->uio_resid; + else + resid = top->m_pkthdr.len; + /* + * In theory resid should be unsigned. + * However, space must be signed, as it might be less than 0 + * if we over-committed, and we must use a signed comparison + * of space and resid. On the other hand, a negative resid + * causes us to loop sending 0-length segments to the protocol. + */ + if (resid < 0) + return (EINVAL); + dontroute = + (flags & MSG_DONTROUTE) && (so->so_options & SO_DONTROUTE) == 0 && + (so->so_proto->pr_flags & PR_ATOMIC); + p->p_stats->p_ru.ru_msgsnd++; + if (control) + clen = control->m_len; +#define snderr(errno) { error = errno; splx(s); goto release; } + +restart: + error = sblock(&so->so_snd, SBLOCKWAIT(flags)); + if (error) + goto out; + do { + s = splnet(); + if (so->so_state & SS_CANTSENDMORE) + snderr(EPIPE); + if (so->so_error) + snderr(so->so_error); + if ((so->so_state & SS_ISCONNECTED) == 0) { + /* + * `sendto' and `sendmsg' is allowed on a connection- + * based socket if it supports implied connect. + * Return ENOTCONN if not connected and no address is + * supplied. + */ + if ((so->so_proto->pr_flags & PR_CONNREQUIRED) && + (so->so_proto->pr_flags & PR_IMPLOPCL) == 0) { + if ((so->so_state & SS_ISCONFIRMING) == 0 && + !(resid == 0 && clen != 0)) + snderr(ENOTCONN); + } else if (addr == 0) + snderr(so->so_proto->pr_flags & PR_CONNREQUIRED ? + ENOTCONN : EDESTADDRREQ); + } + space = sbspace(&so->so_snd); + if (flags & MSG_OOB) + space += 1024; + if ((atomic && resid > so->so_snd.sb_hiwat) || + clen > so->so_snd.sb_hiwat) + snderr(EMSGSIZE); + if (space < resid + clen && uio && + (atomic || space < so->so_snd.sb_lowat || space < clen)) { + if (so->so_state & SS_NBIO) + snderr(EWOULDBLOCK); + sbunlock(&so->so_snd); + error = sbwait(&so->so_snd); + splx(s); + if (error) + goto out; + goto restart; + } + splx(s); + mp = ⊤ + space -= clen; + do { + if (uio == NULL) { + /* + * Data is prepackaged in "top". + */ + resid = 0; + if (flags & MSG_EOR) + top->m_flags |= M_EOR; + } else do { + if (top == 0) { + MGETHDR(m, M_WAIT, MT_DATA); + mlen = MHLEN; + m->m_pkthdr.len = 0; + m->m_pkthdr.rcvif = (struct ifnet *)0; + } else { + MGET(m, M_WAIT, MT_DATA); + mlen = MLEN; + } + if (resid >= MINCLSIZE) { + MCLGET(m, M_WAIT); + if ((m->m_flags & M_EXT) == 0) + goto nopages; + mlen = MCLBYTES; + len = min(min(mlen, resid), space); + } else { +nopages: + len = min(min(mlen, resid), space); + /* + * For datagram protocols, leave room + * for protocol headers in first mbuf. + */ + if (atomic && top == 0 && len < mlen) + MH_ALIGN(m, len); + } + space -= len; + error = uiomove(mtod(m, caddr_t), (int)len, uio); + resid = uio->uio_resid; + m->m_len = len; + *mp = m; + top->m_pkthdr.len += len; + if (error) + goto release; + mp = &m->m_next; + if (resid <= 0) { + if (flags & MSG_EOR) + top->m_flags |= M_EOR; + break; + } + } while (space > 0 && atomic); + if (dontroute) + so->so_options |= SO_DONTROUTE; + s = splnet(); /* XXX */ + error = (*so->so_proto->pr_usrreq)(so, + (flags & MSG_OOB) ? PRU_SENDOOB : + /* + * If the user set MSG_EOF, the protocol + * understands this flag and nothing left to + * send then use PRU_SEND_EOF instead of PRU_SEND. + */ + ((flags & MSG_EOF) && + (so->so_proto->pr_flags & PR_IMPLOPCL) && + (resid <= 0)) ? + PRU_SEND_EOF : PRU_SEND, + top, addr, control); + splx(s); + if (dontroute) + so->so_options &= ~SO_DONTROUTE; + clen = 0; + control = 0; + top = 0; + mp = ⊤ + if (error) + goto release; + } while (resid && space > 0); + } while (resid); + +release: + sbunlock(&so->so_snd); +out: + if (top) + m_freem(top); + if (control) + m_freem(control); + return (error); +} + +/* + * Implement receive operations on a socket. + * We depend on the way that records are added to the sockbuf + * by sbappend*. In particular, each record (mbufs linked through m_next) + * must begin with an address if the protocol so specifies, + * followed by an optional mbuf or mbufs containing ancillary data, + * and then zero or more mbufs of data. + * In order to avoid blocking network interrupts for the entire time here, + * we splx() while doing the actual copy to user space. + * Although the sockbuf is locked, new data may still be appended, + * and thus we must maintain consistency of the sockbuf during that time. + * + * The caller may receive the data as a single mbuf chain by supplying + * an mbuf **mp0 for use in returning the chain. The uio is then used + * only for the count in uio_resid. + */ +int +soreceive(so, paddr, uio, mp0, controlp, flagsp) + register struct socket *so; + struct mbuf **paddr; + struct uio *uio; + struct mbuf **mp0; + struct mbuf **controlp; + int *flagsp; +{ + register struct mbuf *m, **mp; + register int flags, len, error, s, offset; + struct protosw *pr = so->so_proto; + struct mbuf *nextrecord; + int moff, type = 0; + int orig_resid = uio->uio_resid; + + mp = mp0; + if (paddr) + *paddr = 0; + if (controlp) + *controlp = 0; + if (flagsp) + flags = *flagsp &~ MSG_EOR; + else + flags = 0; + if (flags & MSG_OOB) { + m = m_get(M_WAIT, MT_DATA); + error = (*pr->pr_usrreq)(so, PRU_RCVOOB, + m, (struct mbuf *)(flags & MSG_PEEK), (struct mbuf *)0); + if (error) + goto bad; + do { + error = uiomove(mtod(m, caddr_t), + (int) min(uio->uio_resid, m->m_len), uio); + /*m = m_free(m);*/ + } while (uio->uio_resid && error == 0 && m); +bad: + if (m) + /*m_freem(m);*/ + return (error); + } + if (mp) + *mp = (struct mbuf *)0; + if (so->so_state & SS_ISCONFIRMING && uio->uio_resid) + (*pr->pr_usrreq)(so, PRU_RCVD, (struct mbuf *)0, + (struct mbuf *)0, (struct mbuf *)0); + +restart: + error = sblock(&so->so_rcv, SBLOCKWAIT(flags)); + if (error) + return (error); + s = splnet(); + + m = so->so_rcv.sb_mb; + /* + * If we have less data than requested, block awaiting more + * (subject to any timeout) if: + * 1. the current count is less than the low water mark, or + * 2. MSG_WAITALL is set, and it is possible to do the entire + * receive operation at once if we block (resid <= hiwat). + * 3. MSG_DONTWAIT is not set + * If MSG_WAITALL is set but resid is larger than the receive buffer, + * we have to do the receive in sections, and thus risk returning + * a short count if a timeout or signal occurs after we start. + */ + if (m == 0 || (((flags & MSG_DONTWAIT) == 0 && + so->so_rcv.sb_cc < uio->uio_resid) && + (so->so_rcv.sb_cc < so->so_rcv.sb_lowat || + ((flags & MSG_WAITALL) && uio->uio_resid <= so->so_rcv.sb_hiwat)) && + m->m_nextpkt == 0 && (pr->pr_flags & PR_ATOMIC) == 0)) { +#ifdef DIAGNOSTIC + if (m == 0 && so->so_rcv.sb_cc) + panic("receive 1"); +#endif + if (so->so_error) { + if (m) + goto dontblock; + error = so->so_error; + if ((flags & MSG_PEEK) == 0) + so->so_error = 0; + goto release; + } + if (so->so_state & SS_CANTRCVMORE) { + if (m) + goto dontblock; + else + goto release; + } + for (; m; m = m->m_next) + if (m->m_type == MT_OOBDATA || (m->m_flags & M_EOR)) { + m = so->so_rcv.sb_mb; + goto dontblock; + } + if ((so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING)) == 0 && + (so->so_proto->pr_flags & PR_CONNREQUIRED)) { + error = ENOTCONN; + goto release; + } + if (uio->uio_resid == 0) + goto release; + if ((so->so_state & SS_NBIO) || (flags & MSG_DONTWAIT)) { + error = EWOULDBLOCK; + goto release; + } + sbunlock(&so->so_rcv); + error = sbwait(&so->so_rcv); + splx(s); + if (error) + return (error); + goto restart; + } +dontblock: + if (uio->uio_procp) + uio->uio_procp->p_stats->p_ru.ru_msgrcv++; + nextrecord = m->m_nextpkt; + if (pr->pr_flags & PR_ADDR) { +#ifdef DIAGNOSTIC + if (m->m_type != MT_SONAME) + panic("receive 1a"); +#endif + orig_resid = 0; + if (flags & MSG_PEEK) { + if (paddr) + *paddr = m_copy(m, 0, m->m_len); + m = m->m_next; + } else { + sbfree(&so->so_rcv, m); + if (paddr) { + *paddr = m; + so->so_rcv.sb_mb = m->m_next; + m->m_next = 0; + m = so->so_rcv.sb_mb; + } else { + MFREE(m, so->so_rcv.sb_mb); + m = so->so_rcv.sb_mb; + } + } + } + while (m && m->m_type == MT_CONTROL && error == 0) { + if (flags & MSG_PEEK) { + if (controlp) + *controlp = m_copy(m, 0, m->m_len); + m = m->m_next; + } else { + sbfree(&so->so_rcv, m); + if (controlp) { +#ifndef __REACTOS__ + if (pr->pr_domain->dom_externalize && + mtod(m, struct cmsghdr *)->cmsg_type == + SCM_RIGHTS) + error = (*pr->pr_domain->dom_externalize)(m); + *controlp = m; + so->so_rcv.sb_mb = m->m_next; + m->m_next = 0; + m = so->so_rcv.sb_mb; +#endif + } else { + /*MFREE(m, so->so_rcv.sb_mb);*/ + m = so->so_rcv.sb_mb; + } + } + if (controlp) { + orig_resid = 0; + controlp = &(*controlp)->m_next; + } + } + if (m) { + if ((flags & MSG_PEEK) == 0) + m->m_nextpkt = nextrecord; + type = m->m_type; + if (type == MT_OOBDATA) + flags |= MSG_OOB; + } + moff = 0; + offset = 0; + while (m && uio->uio_resid > 0 && error == 0) { + if (m->m_type == MT_OOBDATA) { + if (type != MT_OOBDATA) + break; + } else if (type == MT_OOBDATA) + break; +#ifdef DIAGNOSTIC + else if (m->m_type != MT_DATA && m->m_type != MT_HEADER) + panic("receive 3"); +#endif + so->so_state &= ~SS_RCVATMARK; + len = uio->uio_resid; + if (so->so_oobmark && len > so->so_oobmark - offset) + len = so->so_oobmark - offset; + if (len > m->m_len - moff) + len = m->m_len - moff; + /* + * If mp is set, just pass back the mbufs. + * Otherwise copy them out via the uio, then free. + * Sockbuf must be consistent here (points to current mbuf, + * it points to next record) when we drop priority; + * we must note any additions to the sockbuf when we + * block interrupts again. + */ + if (mp == 0) { + splx(s); + error = uiomove(mtod(m, caddr_t) + moff, (int)len, uio); + s = splnet(); + } else + uio->uio_resid -= len; + if (len == m->m_len - moff) { + if (m->m_flags & M_EOR) + flags |= MSG_EOR; + if (flags & MSG_PEEK) { + m = m->m_next; + moff = 0; + } else { + nextrecord = m->m_nextpkt; + sbfree(&so->so_rcv, m); + if (mp) { + *mp = m; + mp = &m->m_next; + so->so_rcv.sb_mb = m = m->m_next; + *mp = (struct mbuf *)0; + } else { + /*MFREE(m, so->so_rcv.sb_mb);*/ + m = so->so_rcv.sb_mb; + } + if (m) + m->m_nextpkt = nextrecord; + } + } else { + if (flags & MSG_PEEK) + moff += len; + else { + if (mp) + *mp = m_copym(m, 0, len, M_WAIT); + m->m_data += len; + m->m_len -= len; + so->so_rcv.sb_cc -= len; + } + } + if (so->so_oobmark) { + if ((flags & MSG_PEEK) == 0) { + so->so_oobmark -= len; + if (so->so_oobmark == 0) { + so->so_state |= SS_RCVATMARK; + break; + } + } else { + offset += len; + if (offset == so->so_oobmark) + break; + } + } + if (flags & MSG_EOR) + break; + /* + * If the MSG_WAITALL flag is set (for non-atomic socket), + * we must not quit until "uio->uio_resid == 0" or an error + * termination. If a signal/timeout occurs, return + * with a short count but without error. + * Keep sockbuf locked against other readers. + */ + while (flags & MSG_WAITALL && m == 0 && uio->uio_resid > 0 && + !sosendallatonce(so) && !nextrecord) { + if (so->so_error || so->so_state & SS_CANTRCVMORE) + break; + error = sbwait(&so->so_rcv); + if (error) { + sbunlock(&so->so_rcv); + splx(s); + return (0); + } + m = so->so_rcv.sb_mb; + if (m) + nextrecord = m->m_nextpkt; + } + } + + if (m && pr->pr_flags & PR_ATOMIC) { + flags |= MSG_TRUNC; + if ((flags & MSG_PEEK) == 0) + (void) sbdroprecord(&so->so_rcv); + } + if ((flags & MSG_PEEK) == 0) { + if (m == 0) + so->so_rcv.sb_mb = nextrecord; + if (pr->pr_flags & PR_WANTRCVD && so->so_pcb) + (*pr->pr_usrreq)(so, PRU_RCVD, (struct mbuf *)0, + (struct mbuf *)flags, (struct mbuf *)0); + } + if (orig_resid == uio->uio_resid && orig_resid && + (flags & MSG_EOR) == 0 && (so->so_state & SS_CANTRCVMORE) == 0) { + sbunlock(&so->so_rcv); + splx(s); + goto restart; + } + + if (flagsp) + *flagsp |= flags; +release: + sbunlock(&so->so_rcv); + splx(s); + return (error); +} + +int +soshutdown(so, how) + register struct socket *so; + register int how; +{ + register struct protosw *pr = so->so_proto; + + how++; + if (how & FREAD) + sorflush(so); + if (how & FWRITE) + return ((*pr->pr_usrreq)(so, PRU_SHUTDOWN, + (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0)); + return (0); +} + +void +sorflush(so) + register struct socket *so; +{ + register struct sockbuf *sb = &so->so_rcv; + register struct protosw *pr = so->so_proto; + register int s; + struct sockbuf asb; + + sb->sb_flags |= SB_NOINTR; + (void) sblock(sb, M_WAITOK); + s = splimp(); + socantrcvmore(so); + sbunlock(sb); + asb = *sb; + bzero((caddr_t)sb, sizeof (*sb)); + splx(s); + if (pr->pr_flags & PR_RIGHTS && pr->pr_domain->dom_dispose) + (*pr->pr_domain->dom_dispose)(asb.sb_mb); + sbrelease(&asb); +} + +int +sosetopt(so, level, optname, m0) + register struct socket *so; + int level, optname; + struct mbuf *m0; +{ + int error = 0; + register struct mbuf *m = m0; + + if (level != SOL_SOCKET) { + if (so->so_proto && so->so_proto->pr_ctloutput) + return ((*so->so_proto->pr_ctloutput) + (PRCO_SETOPT, so, level, optname, &m0)); + error = ENOPROTOOPT; + } else { + switch (optname) { + + case SO_LINGER: + if (m == NULL || m->m_len != sizeof (struct linger)) { + error = EINVAL; + goto bad; + } + so->so_linger = mtod(m, struct linger *)->l_linger; + /* fall thru... */ + + case SO_DEBUG: + case SO_KEEPALIVE: + case SO_DONTROUTE: + case SO_USELOOPBACK: + case SO_BROADCAST: + case SO_REUSEADDR: + /*case SO_REUSEPORT:*/ + case SO_OOBINLINE: + if (m == NULL || m->m_len < sizeof (int)) { + error = EINVAL; + goto bad; + } + if (*mtod(m, int *)) + so->so_options |= optname; + else + so->so_options &= ~optname; + break; + + case SO_SNDBUF: + case SO_RCVBUF: + case SO_SNDLOWAT: + case SO_RCVLOWAT: + if (m == NULL || m->m_len < sizeof (int)) { + error = EINVAL; + goto bad; + } + switch (optname) { + + case SO_SNDBUF: + case SO_RCVBUF: + if (sbreserve(optname == SO_SNDBUF ? + &so->so_snd : &so->so_rcv, + (u_long) *mtod(m, int *)) == 0) { + error = ENOBUFS; + goto bad; + } + break; + + case SO_SNDLOWAT: + so->so_snd.sb_lowat = *mtod(m, int *); + break; + case SO_RCVLOWAT: + so->so_rcv.sb_lowat = *mtod(m, int *); + break; + } + break; + + case SO_SNDTIMEO: + case SO_RCVTIMEO: + { + struct timeval *tv; + short val; + + if (m == NULL || m->m_len < sizeof (*tv)) { + error = EINVAL; + goto bad; + } + tv = mtod(m, struct timeval *); + if (tv->tv_sec > SHRT_MAX / hz - hz) { + error = EDOM; + goto bad; + } + val = tv->tv_sec * hz + tv->tv_usec / tick; + + switch (optname) { + + case SO_SNDTIMEO: + so->so_snd.sb_timeo = val; + break; + case SO_RCVTIMEO: + so->so_rcv.sb_timeo = val; + break; + } + break; + } + + default: + error = ENOPROTOOPT; + break; + } + if (error == 0 && so->so_proto && so->so_proto->pr_ctloutput) { + (void) ((*so->so_proto->pr_ctloutput) + (PRCO_SETOPT, so, level, optname, &m0)); + m = NULL; /* freed by protocol */ + } + } +bad: + if (m) + /*(void) m_free(m);*/ + return (error); +} + +int +sogetopt(so, level, optname, mp) + register struct socket *so; + int level, optname; + struct mbuf **mp; +{ + register struct mbuf *m; + + if (level != SOL_SOCKET) { + if (so->so_proto && so->so_proto->pr_ctloutput) { + return ((*so->so_proto->pr_ctloutput) + (PRCO_GETOPT, so, level, optname, mp)); + } else + return (ENOPROTOOPT); + } else { + m = m_get(M_WAIT, MT_SOOPTS); + m->m_len = sizeof (int); + + switch (optname) { + + case SO_LINGER: + m->m_len = sizeof (struct linger); + mtod(m, struct linger *)->l_onoff = + so->so_options & SO_LINGER; + mtod(m, struct linger *)->l_linger = so->so_linger; + break; + + case SO_USELOOPBACK: + case SO_DONTROUTE: + case SO_DEBUG: + case SO_KEEPALIVE: + case SO_REUSEADDR: + /*case SO_REUSEPORT: */ + case SO_BROADCAST: + case SO_OOBINLINE: + *mtod(m, int *) = so->so_options & optname; + break; + + case SO_TYPE: + *mtod(m, int *) = so->so_type; + break; + + case SO_ERROR: + *mtod(m, int *) = so->so_error; + so->so_error = 0; + break; + + case SO_SNDBUF: + *mtod(m, int *) = so->so_snd.sb_hiwat; + break; + + case SO_RCVBUF: + *mtod(m, int *) = so->so_rcv.sb_hiwat; + break; + + case SO_SNDLOWAT: + *mtod(m, int *) = so->so_snd.sb_lowat; + break; + + case SO_RCVLOWAT: + *mtod(m, int *) = so->so_rcv.sb_lowat; + break; + + case SO_SNDTIMEO: + case SO_RCVTIMEO: + { + int val = (optname == SO_SNDTIMEO ? + so->so_snd.sb_timeo : so->so_rcv.sb_timeo); + + m->m_len = sizeof(struct timeval); + mtod(m, struct timeval *)->tv_sec = val / hz; + mtod(m, struct timeval *)->tv_usec = + (val % hz) * tick; + break; + } + + default: + (void)m_free(m); + return (ENOPROTOOPT); + } + *mp = m; + return (0); + } +} + +void +sohasoutofband(so) + register struct socket *so; +{ + struct proc *p; + + if (so->so_pgid < 0) + gsignal(-so->so_pgid, SIGURG); + else if (so->so_pgid > 0 && (p = pfind(so->so_pgid)) != 0) + psignal(p, SIGURG); + selwakeup(&so->so_rcv.sb_sel); +} diff --git a/reactos/lib/oskittcp/oskittcp/uipc_socket2.c b/reactos/lib/oskittcp/oskittcp/uipc_socket2.c new file mode 100644 index 00000000000..f1f7d74c819 --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/uipc_socket2.c @@ -0,0 +1,812 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)uipc_socket2.c 8.1 (Berkeley) 6/10/93 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Primitive routines for operating on sockets and socket buffers + */ + +/* strings for sleep message: */ +char netio[] = "netio"; +char netcon[] = "netcon"; +char netcls[] = "netcls"; + +/* these two are sysctl visible */ +u_long sb_max = SB_MAX; /* patchable */ + +u_long sb_efficiency = 8; /* parameter for sbreserve() */ + +int sominqueue = 0; /* minimum queue override */ + +/* + * Procedures to manipulate state flags of socket + * and do appropriate wakeups. Normal sequence from the + * active (originating) side is that soisconnecting() is + * called during processing of connect() call, + * resulting in an eventual call to soisconnected() if/when the + * connection is established. When the connection is torn down + * soisdisconnecting() is called during processing of disconnect() call, + * and soisdisconnected() is called when the connection to the peer + * is totally severed. The semantics of these routines are such that + * connectionless protocols can call soisconnected() and soisdisconnected() + * only, bypassing the in-progress calls when setting up a ``connection'' + * takes no time. + * + * From the passive side, a socket is created with + * two queues of sockets: so_q0 for connections in progress + * and so_q for connections already made and awaiting user acceptance. + * As a protocol is preparing incoming connections, it creates a socket + * structure queued on so_q0 by calling sonewconn(). When the connection + * is established, soisconnected() is called, and transfers the + * socket structure to so_q, making it available to accept(). + * + * If a socket is closed with sockets on either + * so_q0 or so_q, these sockets are dropped. + * + * If higher level protocols are implemented in + * the kernel, the wakeups done here will sometimes + * cause software-interrupt process scheduling. + */ + +void +soisconnecting(so) + register struct socket *so; +{ + + so->so_state &= ~(SS_ISCONNECTED|SS_ISDISCONNECTING); + so->so_state |= SS_ISCONNECTING; +} + +void +soisconnected(so) + register struct socket *so; +{ + register struct socket *head = so->so_head; + + so->so_state &= ~(SS_ISCONNECTING|SS_ISDISCONNECTING|SS_ISCONFIRMING); + so->so_state |= SS_ISCONNECTED; + if (head && soqremque(so, 0)) { + soqinsque(head, so, 1); + sorwakeup(head); + wakeup((caddr_t)&head->so_timeo); + } else { + wakeup((caddr_t)&so->so_timeo); + sorwakeup(so); + sowwakeup(so); + } + + if( OtcpEvent.SocketConnectIndication ) + OtcpEvent.SocketConnectIndication + ( OtcpEvent.ClientData, + so, + so->so_connection ); +} + +void +soisdisconnecting(so) + register struct socket *so; +{ + + so->so_state &= ~SS_ISCONNECTING; + so->so_state |= (SS_ISDISCONNECTING|SS_CANTRCVMORE|SS_CANTSENDMORE); + wakeup((caddr_t)&so->so_timeo); + sowwakeup(so); + sorwakeup(so); +} + +void +soisdisconnected(so) + register struct socket *so; +{ + + so->so_state &= ~(SS_ISCONNECTING|SS_ISCONNECTED|SS_ISDISCONNECTING); + so->so_state |= (SS_CANTRCVMORE|SS_CANTSENDMORE); + wakeup((caddr_t)&so->so_timeo); + sowwakeup(so); + sorwakeup(so); +} + +/* + * When an attempt at a new connection is noted on a socket + * which accepts connections, sonewconn is called. If the + * connection is possible (subject to space constraints, etc.) + * then we allocate a new structure, propoerly linked into the + * data structure of the original socket, and return this. + * Connstatus may be 0, or SO_ISCONFIRMING, or SO_ISCONNECTED. + * + * Currently, sonewconn() is defined as sonewconn1() in socketvar.h + * to catch calls that are missing the (new) second parameter. + */ +struct socket * +sonewconn1(head, connstatus) + register struct socket *head; + int connstatus; +{ + register struct socket *so; + int soqueue = connstatus ? 1 : 0; + + if ((head->so_qlen + head->so_q0len > 3 * head->so_qlimit / 2) && + (head->so_qlen + head->so_q0len > sominqueue)) + return ((struct socket *)0); + MALLOC(so, struct socket *, sizeof(*so), M_SOCKET, M_DONTWAIT); + if (so == NULL) + return ((struct socket *)0); + bzero((caddr_t)so, sizeof(*so)); + so->so_type = head->so_type; + so->so_options = head->so_options &~ SO_ACCEPTCONN; + so->so_linger = head->so_linger; + so->so_state = head->so_state | SS_NOFDREF; + so->so_proto = head->so_proto; + so->so_timeo = head->so_timeo; + so->so_pgid = head->so_pgid; + (void) soreserve(so, head->so_snd.sb_hiwat, head->so_rcv.sb_hiwat); + soqinsque(head, so, soqueue); + if ((*so->so_proto->pr_usrreq)(so, PRU_ATTACH, + (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0)) { + (void) soqremque(so, soqueue); + (void) free((caddr_t)so, M_SOCKET); + return ((struct socket *)0); + } + if (connstatus) { + sorwakeup(head); + wakeup((caddr_t)&head->so_timeo); + so->so_state |= connstatus; + } + return (so); +} + +void +soqinsque(head, so, q) + register struct socket *head, *so; + int q; +{ + + register struct socket **prev; + so->so_head = head; + if (q == 0) { + head->so_q0len++; + so->so_q0 = 0; + for (prev = &(head->so_q0); *prev; ) + prev = &((*prev)->so_q0); + } else { + head->so_qlen++; + so->so_q = 0; + for (prev = &(head->so_q); *prev; ) + prev = &((*prev)->so_q); + } + *prev = so; +} + +int +soqremque(so, q) + register struct socket *so; + int q; +{ + register struct socket *head, *prev, *next; + + head = so->so_head; + prev = head; + for (;;) { + next = q ? prev->so_q : prev->so_q0; + if (next == so) + break; + if (next == 0) + return (0); + prev = next; + } + if (q == 0) { + prev->so_q0 = next->so_q0; + head->so_q0len--; + } else { + prev->so_q = next->so_q; + head->so_qlen--; + } + next->so_q0 = next->so_q = 0; + next->so_head = 0; + return (1); +} + +/* + * Socantsendmore indicates that no more data will be sent on the + * socket; it would normally be applied to a socket when the user + * informs the system that no more data is to be sent, by the protocol + * code (in case PRU_SHUTDOWN). Socantrcvmore indicates that no more data + * will be received, and will normally be applied to the socket by a + * protocol when it detects that the peer will send no more data. + * Data queued for reading in the socket may yet be read. + */ + +void +socantsendmore(so) + struct socket *so; +{ + + so->so_state |= SS_CANTSENDMORE; + sowwakeup(so); +} + +void +socantrcvmore(so) + struct socket *so; +{ + + so->so_state |= SS_CANTRCVMORE; + sorwakeup(so); +} + +/* + * Wait for data to arrive at/drain from a socket buffer. + */ +int +sbwait(sb) + struct sockbuf *sb; +{ + + sb->sb_flags |= SB_WAIT; + return (tsleep((caddr_t)&sb->sb_cc, + (sb->sb_flags & SB_NOINTR) ? PSOCK : PSOCK | PCATCH, netio, + sb->sb_timeo)); +} + +/* + * Lock a sockbuf already known to be locked; + * return any error returned from sleep (EINTR). + */ +int +sb_lock(sb) + register struct sockbuf *sb; +{ + int error; + + while (sb->sb_flags & SB_LOCK) { + sb->sb_flags |= SB_WANT; + error = tsleep((caddr_t)&sb->sb_flags, + (sb->sb_flags & SB_NOINTR) ? PSOCK : PSOCK|PCATCH, + netio, 0); + if (error) + return (error); + } + sb->sb_flags |= SB_LOCK; + return (0); +} + +/* + * Wakeup processes waiting on a socket buffer. + * Do asynchronous notification via SIGIO + * if the socket has the SS_ASYNC flag set. + */ +void +sowakeup(so, sb) + register struct socket *so; + register struct sockbuf *sb; +{ + struct proc *p; + + selwakeup(&sb->sb_sel); +#ifndef OSKIT + /* + * in the OS Kit, we do not want notifications to stop + */ + sb->sb_flags &= ~SB_SEL; +#endif + if (sb->sb_flags & SB_WAIT) { + sb->sb_flags &= ~SB_WAIT; + wakeup((caddr_t)&sb->sb_cc); + } + if (so->so_state & SS_ASYNC) { + if (so->so_pgid < 0) + gsignal(-so->so_pgid, SIGIO); + else if (so->so_pgid > 0 && (p = pfind(so->so_pgid)) != 0) + psignal(p, SIGIO); + } +} + +/* + * Socket buffer (struct sockbuf) utility routines. + * + * Each socket contains two socket buffers: one for sending data and + * one for receiving data. Each buffer contains a queue of mbufs, + * information about the number of mbufs and amount of data in the + * queue, and other fields allowing select() statements and notification + * on data availability to be implemented. + * + * Data stored in a socket buffer is maintained as a list of records. + * Each record is a list of mbufs chained together with the m_next + * field. Records are chained together with the m_nextpkt field. The upper + * level routine soreceive() expects the following conventions to be + * observed when placing information in the receive buffer: + * + * 1. If the protocol requires each message be preceded by the sender's + * name, then a record containing that name must be present before + * any associated data (mbuf's must be of type MT_SONAME). + * 2. If the protocol supports the exchange of ``access rights'' (really + * just additional data associated with the message), and there are + * ``rights'' to be received, then a record containing this data + * should be present (mbuf's must be of type MT_RIGHTS). + * 3. If a name or rights record exists, then it must be followed by + * a data record, perhaps of zero length. + * + * Before using a new socket structure it is first necessary to reserve + * buffer space to the socket, by calling sbreserve(). This should commit + * some of the available buffer space in the system buffer pool for the + * socket (currently, it does nothing but enforce limits). The space + * should be released by calling sbrelease() when the socket is destroyed. + */ + +int +soreserve(so, sndcc, rcvcc) + register struct socket *so; + u_long sndcc, rcvcc; +{ + + if (sbreserve(&so->so_snd, sndcc) == 0) + goto bad; + if (sbreserve(&so->so_rcv, rcvcc) == 0) + goto bad2; + if (so->so_rcv.sb_lowat == 0) + so->so_rcv.sb_lowat = 1; + if (so->so_snd.sb_lowat == 0) + so->so_snd.sb_lowat = MCLBYTES; + if (so->so_snd.sb_lowat > so->so_snd.sb_hiwat) + so->so_snd.sb_lowat = so->so_snd.sb_hiwat; + return (0); +bad2: + sbrelease(&so->so_snd); +bad: + return (ENOBUFS); +} + +/* + * Allot mbufs to a sockbuf. + * Attempt to scale mbmax so that mbcnt doesn't become limiting + * if buffering efficiency is near the normal case. + */ +int +sbreserve(sb, cc) + struct sockbuf *sb; + u_long cc; +{ + + if (cc > sb_max * MCLBYTES / (MSIZE + MCLBYTES)) + return (0); + sb->sb_hiwat = cc; + sb->sb_mbmax = min(cc * sb_efficiency, sb_max); + if (sb->sb_lowat > sb->sb_hiwat) + sb->sb_lowat = sb->sb_hiwat; + return (1); +} + +/* + * Free mbufs held by a socket, and reserved mbuf space. + */ +void +sbrelease(sb) + struct sockbuf *sb; +{ + + sbflush(sb); + sb->sb_hiwat = sb->sb_mbmax = 0; +} + +/* + * Routines to add and remove + * data from an mbuf queue. + * + * The routines sbappend() or sbappendrecord() are normally called to + * append new mbufs to a socket buffer, after checking that adequate + * space is available, comparing the function sbspace() with the amount + * of data to be added. sbappendrecord() differs from sbappend() in + * that data supplied is treated as the beginning of a new record. + * To place a sender's address, optional access rights, and data in a + * socket receive buffer, sbappendaddr() should be used. To place + * access rights and data in a socket receive buffer, sbappendrights() + * should be used. In either case, the new data begins a new record. + * Note that unlike sbappend() and sbappendrecord(), these routines check + * for the caller that there will be enough space to store the data. + * Each fails if there is not enough space, or if it cannot find mbufs + * to store additional information in. + * + * Reliable protocols may use the socket send buffer to hold data + * awaiting acknowledgement. Data is normally copied from a socket + * send buffer in a protocol with m_copy for output to a peer, + * and then removing the data from the socket buffer with sbdrop() + * or sbdroprecord() when the data is acknowledged by the peer. + */ + +/* + * Append mbuf chain m to the last record in the + * socket buffer sb. The additional space associated + * the mbuf chain is recorded in sb. Empty mbufs are + * discarded and mbufs are compacted where possible. + */ +void +sbappend(so, sb, m) + struct socket *so; + struct sockbuf *sb; + struct mbuf *m; +{ + register struct mbuf *n; + + if (m == 0) + return; + n = sb->sb_mb; + if (n) { + while (n->m_nextpkt) + n = n->m_nextpkt; + do { + if (n->m_flags & M_EOR) { + sbappendrecord(sb, m); /* XXXXXX!!!! */ + return; + } + } while (n->m_next && (n = n->m_next)); + } + OskitDumpBuffer( m->m_data, m->m_len ); + if( OtcpEvent.SocketDataAvailable ) + OtcpEvent.SocketDataAvailable + ( OtcpEvent.ClientData, + so, + so->so_connection, + m->m_data, m->m_len ); +} + +#ifdef SOCKBUF_DEBUG +void +sbcheck(sb) + register struct sockbuf *sb; +{ + register struct mbuf *m; + register int len = 0, mbcnt = 0; + + for (m = sb->sb_mb; m; m = m->m_next) { + len += m->m_len; + mbcnt += MSIZE; + if (m->m_flags & M_EXT) + mbcnt += m->m_ext.ext_size; + if (m->m_nextpkt) + panic("sbcheck nextpkt"); + } + if (len != sb->sb_cc || mbcnt != sb->sb_mbcnt) { + printf("cc %d != %d || mbcnt %d != %d\n", len, sb->sb_cc, + mbcnt, sb->sb_mbcnt); + panic("sbcheck"); + } +} +#endif + +/* + * As above, except the mbuf chain + * begins a new record. + */ +void +sbappendrecord(sb, m0) + register struct sockbuf *sb; + register struct mbuf *m0; +{ + register struct mbuf *m; + + if (m0 == 0) + return; + m = sb->sb_mb; + if (m) + while (m->m_nextpkt) + m = m->m_nextpkt; + /* + * Put the first mbuf on the queue. + * Note this permits zero length records. + */ + sballoc(sb, m0); + if (m) + m->m_nextpkt = m0; + else + sb->sb_mb = m0; + m = m0->m_next; + m0->m_next = 0; + if (m && (m0->m_flags & M_EOR)) { + m0->m_flags &= ~M_EOR; + m->m_flags |= M_EOR; + } + sbcompress(sb, m, m0); +} + +/* + * As above except that OOB data + * is inserted at the beginning of the sockbuf, + * but after any other OOB data. + */ +void +sbinsertoob(sb, m0) + register struct sockbuf *sb; + register struct mbuf *m0; +{ + register struct mbuf *m; + register struct mbuf **mp; + + if (m0 == 0) + return; + for (mp = &sb->sb_mb; *mp ; mp = &((*mp)->m_nextpkt)) { + m = *mp; + again: + switch (m->m_type) { + + case MT_OOBDATA: + continue; /* WANT next train */ + + case MT_CONTROL: + m = m->m_next; + if (m) + goto again; /* inspect THIS train further */ + } + break; + } + /* + * Put the first mbuf on the queue. + * Note this permits zero length records. + */ + sballoc(sb, m0); + m0->m_nextpkt = *mp; + *mp = m0; + m = m0->m_next; + m0->m_next = 0; + if (m && (m0->m_flags & M_EOR)) { + m0->m_flags &= ~M_EOR; + m->m_flags |= M_EOR; + } + sbcompress(sb, m, m0); +} + +/* + * Append address and data, and optionally, control (ancillary) data + * to the receive queue of a socket. If present, + * m0 must include a packet header with total length. + * Returns 0 if no space in sockbuf or insufficient mbufs. + */ +int +sbappendaddr(sb, asa, m0, control) + register struct sockbuf *sb; + struct sockaddr *asa; + struct mbuf *m0, *control; +{ + register struct mbuf *m, *n; + int space = /*asa->sa_len;*/ sizeof(struct sockaddr); + +if (m0 && (m0->m_flags & M_PKTHDR) == 0) +panic("sbappendaddr"); + if (m0) + space += m0->m_pkthdr.len; + for (n = control; n; n = n->m_next) { + space += n->m_len; + if (n->m_next == 0) /* keep pointer to last control buf */ + break; + } + if (space > sbspace(sb)) + return (0); + MGET(m, M_DONTWAIT, MT_SONAME); + if (m == 0) + return (0); + m->m_len = sizeof(struct sockaddr); + bcopy((caddr_t)asa, mtod(m, caddr_t), sizeof(struct sockaddr)); + if (n) + n->m_next = m0; /* concatenate data to control */ + else + control = m0; + m->m_next = control; + for (n = m; n; n = n->m_next) + sballoc(sb, n); + n = sb->sb_mb; + if (n) { + while (n->m_nextpkt) + n = n->m_nextpkt; + n->m_nextpkt = m; + } else + sb->sb_mb = m; + return (1); +} + +int +sbappendcontrol(sb, m0, control) + struct sockbuf *sb; + struct mbuf *control, *m0; +{ + register struct mbuf *m, *n; + int space = 0; + + if (control == 0) + panic("sbappendcontrol"); + for (m = control; ; m = m->m_next) { + space += m->m_len; + if (m->m_next == 0) + break; + } + n = m; /* save pointer to last control buffer */ + for (m = m0; m; m = m->m_next) + space += m->m_len; + if (space > sbspace(sb)) + return (0); + n->m_next = m0; /* concatenate data to control */ + for (m = control; m; m = m->m_next) + sballoc(sb, m); + n = sb->sb_mb; + if (n) { + while (n->m_nextpkt) + n = n->m_nextpkt; + n->m_nextpkt = control; + } else + sb->sb_mb = control; + return (1); +} + +/* + * Compress mbuf chain m into the socket + * buffer sb following mbuf n. If n + * is null, the buffer is presumed empty. + */ +void +sbcompress(sb, m, n) + register struct sockbuf *sb; + register struct mbuf *m, *n; +{ + register int eor = 0; + register struct mbuf *o; + + while (m) { + eor |= m->m_flags & M_EOR; + if (m->m_len == 0 && + (eor == 0 || + (((o = m->m_next) || (o = n)) && + o->m_type == m->m_type))) { + m = m_free(m); + continue; + } + if (n && (n->m_flags & (M_EXT | M_EOR)) == 0 && + (n->m_data + n->m_len + m->m_len) < &n->m_dat[MLEN] && + n->m_type == m->m_type) { + bcopy(mtod(m, caddr_t), mtod(n, caddr_t) + n->m_len, + (unsigned)m->m_len); + n->m_len += m->m_len; + sb->sb_cc += m->m_len; + m = m_free(m); + continue; + } + if (n) + n->m_next = m; + else + sb->sb_mb = m; + sballoc(sb, m); + n = m; + m->m_flags &= ~M_EOR; + m = m->m_next; + n->m_next = 0; + } + if (eor) { + if (n) + n->m_flags |= eor; + else + printf("semi-panic: sbcompress\n"); + } +} + +/* + * Free all mbufs in a sockbuf. + * Check that all resources are reclaimed. + */ +void +sbflush(sb) + register struct sockbuf *sb; +{ + + if (sb->sb_flags & SB_LOCK) + panic("sbflush"); + while (sb->sb_mbcnt) + sbdrop(sb, (int)sb->sb_cc); + if (sb->sb_cc || sb->sb_mb) + panic("sbflush 2"); +} + +/* + * Drop data from (the front of) a sockbuf. + */ +void +sbdrop(sb, len) + register struct sockbuf *sb; + register int len; +{ + register struct mbuf *m, *mn; + struct mbuf *next; + + next = (m = sb->sb_mb) ? m->m_nextpkt : 0; + while (len > 0) { + if (m == 0) { + if (next == 0) + panic("sbdrop"); + m = next; + next = m->m_nextpkt; + continue; + } + if (m->m_len > len) { + m->m_len -= len; + m->m_data += len; + sb->sb_cc -= len; + break; + } + len -= m->m_len; + sbfree(sb, m); + MFREE(m, mn); + m = mn; + } + while (m && m->m_len == 0) { + sbfree(sb, m); + MFREE(m, mn); + m = mn; + } + if (m) { + sb->sb_mb = m; + m->m_nextpkt = next; + } else + sb->sb_mb = next; +} + +/* + * Drop a record off the front of a sockbuf + * and move the next record to the front. + */ +void +sbdroprecord(sb) + register struct sockbuf *sb; +{ + register struct mbuf *m, *mn; + + m = sb->sb_mb; + if (m) { + sb->sb_mb = m->m_nextpkt; + do { + sbfree(sb, m); + MFREE(m, mn); + m = mn; + } while (m); + } +} From 6ec9cfe422bc11f2ea70b6488e9bc24e11a421f5 Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Sun, 2 May 2004 07:36:36 +0000 Subject: [PATCH 1012/1463] Explanation of the files here. svn path=/trunk/; revision=9278 --- reactos/lib/oskittcp/README | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 reactos/lib/oskittcp/README diff --git a/reactos/lib/oskittcp/README b/reactos/lib/oskittcp/README new file mode 100644 index 00000000000..a78d4e5bbf0 --- /dev/null +++ b/reactos/lib/oskittcp/README @@ -0,0 +1,5 @@ +These files are originally from the freebsd TCP stack contained on oskit. +Only files relevent to TCP are here, along with assorted interfaces that +are needed to make them useful. Overall, I intend this to implement a +generic, standalone TCP library that can be used with any IP machinery +required. From 3cc6704954c34f4341454307a2f4c1c3bb047f34 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sun, 2 May 2004 14:47:05 +0000 Subject: [PATCH 1013/1463] ported GetBinaryType() from wine svn path=/trunk/; revision=9279 --- reactos/include/defines.h | 1 + reactos/lib/kernel32/file/bintype.c | 337 ++++++++++++++++++++++++ reactos/lib/kernel32/include/kernel32.h | 10 + reactos/lib/kernel32/makefile | 4 +- reactos/lib/kernel32/misc/stubs.c | 31 +-- 5 files changed, 351 insertions(+), 32 deletions(-) create mode 100644 reactos/lib/kernel32/file/bintype.c diff --git a/reactos/include/defines.h b/reactos/include/defines.h index 3c6b00db51a..ffd0b5fc647 100644 --- a/reactos/include/defines.h +++ b/reactos/include/defines.h @@ -1314,6 +1314,7 @@ extern "C" { #define SCS_PIF_BINARY (3) #define SCS_POSIX_BINARY (4) #define SCS_WOW_BINARY (2) +#define SCS_64BIT_BINARY (6) /* GetBoundsRect, SetBoundsRect */ #define DCB_DISABLE (8) diff --git a/reactos/lib/kernel32/file/bintype.c b/reactos/lib/kernel32/file/bintype.c new file mode 100644 index 00000000000..fa8e6cec88e --- /dev/null +++ b/reactos/lib/kernel32/file/bintype.c @@ -0,0 +1,337 @@ +/* $Id: bintype.c,v 1.1 2004/05/02 14:47:05 weiden Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * FILE: lib/kernel32/file/bintype.c + * PURPOSE: Binary detection functions + * PROGRAMMER: Alexandre Julliard (WINE) + * Thomas Weidenmueller (w3seek@users.sourceforge.net) + * UPDATE HISTORY: + * 02/05/2004 - Ported/Adapted from WINE + */ + +/* INCLUDES *****************************************************************/ + +#include +#include + +#define NDEBUG +#include "../include/debug.h" + + +/* FUNCTIONS ****************************************************************/ + +/* Check whether a file is an OS/2 or a very old Windows executable + * by testing on import of KERNEL. + * + * FIXME: is reading the module imports the only way of discerning + * old Windows binaries from OS/2 ones ? At least it seems so... + */ +STATIC DWORD STDCALL +InternalIsOS2OrOldWin(HANDLE hFile, IMAGE_DOS_HEADER *mz, IMAGE_OS2_HEADER *ne) +{ + DWORD CurPos; + LPWORD modtab = NULL; + LPSTR nametab = NULL; + DWORD Read, Ret; + int i; + + Ret = BINARY_OS216; + CurPos = SetFilePointer(hFile, 0, NULL, FILE_CURRENT); + + /* read modref table */ + if((SetFilePointer(hFile, mz->e_lfanew + ne->ne_modtab, NULL, FILE_BEGIN) == -1) || + (!(modtab = HeapAlloc(GetProcessHeap(), 0, ne->ne_cmod * sizeof(WORD)))) || + (!(ReadFile(hFile, modtab, ne->ne_cmod * sizeof(WORD), &Read, NULL))) || + (Read != ne->ne_cmod * sizeof(WORD))) + { + goto broken; + } + + /* read imported names table */ + if((SetFilePointer(hFile, mz->e_lfanew + ne->ne_imptab, NULL, FILE_BEGIN) == -1) || + (!(nametab = HeapAlloc(GetProcessHeap(), 0, ne->ne_enttab - ne->ne_imptab))) || + (!(ReadFile(hFile, nametab, ne->ne_enttab - ne->ne_imptab, &Read, NULL))) || + (Read != ne->ne_enttab - ne->ne_imptab)) + { + goto broken; + } + + for(i = 0; i < ne->ne_cmod; i++) + { + LPSTR module; + module = &nametab[modtab[i]]; + if(!strncmp(&module[1], "KERNEL", module[0])) + { + /* very old windows file */ + Ret = BINARY_WIN16; + goto done; + } + } + + broken: + DPRINT("InternalIsOS2OrOldWin(): Binary file seems to be broken\n"); + + done: + HeapFree(GetProcessHeap(), 0, modtab); + HeapFree(GetProcessHeap(), 0, nametab); + SetFilePointer(hFile, CurPos, NULL, FILE_BEGIN); + return Ret; +} + +STATIC DWORD STDCALL +InternalGetBinaryType(HANDLE hFile) +{ + union + { + struct + { + unsigned char magic[4]; + unsigned char ignored[12]; + unsigned short type; + } elf; + struct + { + unsigned long magic; + unsigned long cputype; + unsigned long cpusubtype; + unsigned long filetype; + } macho; + IMAGE_DOS_HEADER mz; + } Header; + char magic[4]; + DWORD Read; + + if((SetFilePointer(hFile, 0, NULL, FILE_BEGIN) == -1) || + (!ReadFile(hFile, &Header, sizeof(Header), &Read, NULL) || + (Read != sizeof(Header)))) + { + return BINARY_UNKNOWN; + } + + if(!memcmp(Header.elf.magic, "\177ELF", sizeof(Header.elf.magic))) + { + /* FIXME: we don't bother to check byte order, architecture, etc. */ + switch(Header.elf.type) + { + case 2: + return BINARY_UNIX_EXE; + case 3: + return BINARY_UNIX_LIB; + } + return BINARY_UNKNOWN; + } + + /* Mach-o File with Endian set to Big Endian or Little Endian*/ + if(Header.macho.magic == 0xFEEDFACE || + Header.macho.magic == 0xECAFDEEF) + { + switch(Header.macho.filetype) + { + case 0x8: + /* MH_BUNDLE */ + return BINARY_UNIX_LIB; + } + return BINARY_UNKNOWN; + } + + /* Not ELF, try DOS */ + if(Header.mz.e_magic == IMAGE_DOS_SIGNATURE) + { + /* We do have a DOS image so we will now try to seek into + * the file by the amount indicated by the field + * "Offset to extended header" and read in the + * "magic" field information at that location. + * This will tell us if there is more header information + * to read or not. + */ + if((SetFilePointer(hFile, Header.mz.e_lfanew, NULL, FILE_BEGIN) == -1) || + (!ReadFile(hFile, magic, sizeof(magic), &Read, NULL) || + (Read != sizeof(magic)))) + { + return BINARY_DOS; + } + + /* Reading the magic field succeeded so + * we will try to determine what type it is. + */ + if(!memcmp(magic, "PE\0\0", sizeof(magic))) + { + IMAGE_FILE_HEADER FileHeader; + if(!ReadFile(hFile, &FileHeader, sizeof(IMAGE_FILE_HEADER), &Read, NULL) || + (Read == sizeof(IMAGE_FILE_HEADER))) + { + return BINARY_DOS; + } + + /* FIXME - detect 32/64 bit */ + + if(FileHeader.Characteristics & IMAGE_FILE_DLL) + return BINARY_PE_DLL32; + return BINARY_PE_EXE32; + } + + if(!memcmp(magic, "NE", 1)) + { + /* This is a Windows executable (NE) header. This can + * mean either a 16-bit OS/2 or a 16-bit Windows or even a + * DOS program (running under a DOS extender). To decide + * which, we'll have to read the NE header. + */ + IMAGE_OS2_HEADER ne; + if((SetFilePointer(hFile, Header.mz.e_lfanew, NULL, FILE_BEGIN) == 1) || + !ReadFile(hFile, &ne, sizeof(IMAGE_OS2_HEADER), &Read, NULL) || + (Read == sizeof(IMAGE_OS2_HEADER))) + { + /* Couldn't read header, so abort. */ + return BINARY_DOS; + } + + switch(ne.ne_exetyp) + { + case 2: + return BINARY_WIN16; + case 5: + return BINARY_DOS; + default: + return InternalIsOS2OrOldWin(hFile, &Header.mz, &ne); + } + } + return BINARY_DOS; + } + return BINARY_UNKNOWN; +} + +/* + * @implemented + */ +BOOL +STDCALL +GetBinaryTypeW ( + LPCWSTR lpApplicationName, + LPDWORD lpBinaryType + ) +{ + HANDLE hFile; + DWORD BinType; + + if(!lpApplicationName || !lpBinaryType) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + hFile = CreateFileW(lpApplicationName, GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_EXISTING, 0, 0); + if(hFile == INVALID_HANDLE_VALUE) + { + return FALSE; + } + + BinType = InternalGetBinaryType(hFile); + CloseHandle(hFile); + + switch(BinType) + { + case BINARY_UNKNOWN: + { + WCHAR *dot; + + /* + * guess from filename + */ + if(!(dot = wcsrchr(lpApplicationName, L'.'))) + { + return FALSE; + } + if(!lstrcmpiW(dot, L".COM")) + { + *lpBinaryType = SCS_DOS_BINARY; + return TRUE; + } + if(!lstrcmpiW(dot, L".PIF")) + { + *lpBinaryType = SCS_PIF_BINARY; + return TRUE; + } + return FALSE; + } + case BINARY_PE_EXE32: + case BINARY_PE_DLL32: + { + *lpBinaryType = SCS_32BIT_BINARY; + return TRUE; + } + case BINARY_PE_EXE64: + case BINARY_PE_DLL64: + { + *lpBinaryType = SCS_64BIT_BINARY; + return TRUE; + } + case BINARY_WIN16: + { + *lpBinaryType = SCS_WOW_BINARY; + return TRUE; + } + case BINARY_OS216: + { + *lpBinaryType = SCS_OS216_BINARY; + return TRUE; + } + case BINARY_DOS: + { + *lpBinaryType = SCS_DOS_BINARY; + return TRUE; + } + case BINARY_UNIX_EXE: + case BINARY_UNIX_LIB: + { + return FALSE; + } + } + + DPRINT1("Invalid binary type returned!\n", BinType); + return FALSE; +} + + +/* + * @implemented + */ +BOOL +STDCALL +GetBinaryTypeA ( + LPCSTR lpApplicationName, + LPDWORD lpBinaryType + ) +{ + ANSI_STRING FileNameA; + UNICODE_STRING FileName; + NTSTATUS Status; + BOOL Ret; + + if(!lpApplicationName || !lpBinaryType) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + RtlInitAnsiString(&FileNameA, (LPSTR)lpApplicationName); + + if(bIsFileApiAnsi) + Status = RtlAnsiStringToUnicodeString(&FileName, &FileNameA, TRUE); + else + Status = RtlOemStringToUnicodeString(&FileName, &FileNameA, TRUE); + if(!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return FALSE; + } + + Ret = GetBinaryTypeW(FileName.Buffer, lpBinaryType); + + RtlFreeUnicodeString(&FileName); + return Ret; +} + +/* EOF */ diff --git a/reactos/lib/kernel32/include/kernel32.h b/reactos/lib/kernel32/include/kernel32.h index 66ec9d1faf9..41ecdfcb3ce 100755 --- a/reactos/lib/kernel32/include/kernel32.h +++ b/reactos/lib/kernel32/include/kernel32.h @@ -1,6 +1,16 @@ #ifndef _KERNEL32_INCLUDE_KERNEL32_H #define _KERNEL32_INCLUDE_KERNEL32_H +#define BINARY_UNKNOWN (0) +#define BINARY_PE_EXE32 (1) +#define BINARY_PE_DLL32 (2) +#define BINARY_PE_EXE64 (3) +#define BINARY_PE_DLL64 (4) +#define BINARY_WIN16 (5) +#define BINARY_OS216 (6) +#define BINARY_DOS (7) +#define BINARY_UNIX_EXE (8) +#define BINARY_UNIX_LIB (9) #define MAGIC(c1,c2,c3,c4) ((c1) + ((c2)<<8) + ((c3)<<16) + ((c4)<<24)) diff --git a/reactos/lib/kernel32/makefile b/reactos/lib/kernel32/makefile index 30af6359d4d..ba3a3f9ee0a 100644 --- a/reactos/lib/kernel32/makefile +++ b/reactos/lib/kernel32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.78 2004/03/14 09:21:41 weiden Exp $ +# $Id: makefile,v 1.79 2004/05/02 14:47:05 weiden Exp $ PATH_TO_TOP = ../.. @@ -41,7 +41,7 @@ FILE_OBJECTS = file/file.o file/curdir.o file/lfile.o file/dir.o \ file/create.o file/find.o file/copy.o file/pipe.o \ file/move.o file/lock.o file/rw.o file/delete.o \ file/npipe.o file/tape.o file/mailslot.o file/backup.o \ - file/cnotify.o file/hardlink.o + file/cnotify.o file/hardlink.o file/bintype.o MEM_OBJECTS = mem/global.o mem/heap.o mem/isbad.o mem/local.o \ mem/procmem.o mem/section.o mem/virtual.o diff --git a/reactos/lib/kernel32/misc/stubs.c b/reactos/lib/kernel32/misc/stubs.c index 6bb2e5d607b..974b5d46cc5 100644 --- a/reactos/lib/kernel32/misc/stubs.c +++ b/reactos/lib/kernel32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.73 2004/04/22 02:20:52 jimtabor Exp $ +/* $Id: stubs.c,v 1.74 2004/05/02 14:47:05 weiden Exp $ * * KERNEL32.DLL stubs (unimplemented functions) * Remove from this file, if you implement them. @@ -171,35 +171,6 @@ FreeVirtualBuffer ( return FALSE; } -/* - * @unimplemented - */ -BOOL -STDCALL -GetBinaryTypeW ( - LPCWSTR lpApplicationName, - LPDWORD lpBinaryType - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - -/* - * @unimplemented - */ -BOOL -STDCALL -GetBinaryTypeA ( - LPCSTR lpApplicationName, - LPDWORD lpBinaryType - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - #ifndef _OLE2NLS_IN_BUILD_ From b2aa3941767c575c5f0332cc9f2e843f6263a2b1 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sun, 2 May 2004 15:47:34 +0000 Subject: [PATCH 1014/1463] implemented GetThreadLocale() and partly implemented SetThreadLocale() svn path=/trunk/; revision=9280 --- reactos/include/napi/teb.h | 2 +- reactos/lib/kernel32/misc/lang.c | 19 ++++++++----------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/reactos/include/napi/teb.h b/reactos/include/napi/teb.h index 657ddf39a2a..c6f1ea00346 100644 --- a/reactos/include/napi/teb.h +++ b/reactos/include/napi/teb.h @@ -183,7 +183,7 @@ typedef struct _TEB struct _W32THREAD* Win32ThreadInfo; /* 40h */ ULONG Win32ClientInfo[0x1F]; /* 44h */ PVOID WOW32Reserved; /* C0h */ - ULONG CurrentLocale; /* C4h */ + LCID CurrentLocale; /* C4h */ ULONG FpSoftwareStatusRegister; /* C8h */ PVOID SystemReserved1[0x36]; /* CCh */ PVOID Spare1; /* 1A4h */ diff --git a/reactos/lib/kernel32/misc/lang.c b/reactos/lib/kernel32/misc/lang.c index 9378669deba..613b4e839de 100644 --- a/reactos/lib/kernel32/misc/lang.c +++ b/reactos/lib/kernel32/misc/lang.c @@ -1,4 +1,4 @@ -/* $Id: lang.c,v 1.15 2004/04/12 15:08:14 mf Exp $ +/* $Id: lang.c,v 1.16 2004/05/02 15:47:34 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT : ReactOS user mode libraries @@ -1068,18 +1068,13 @@ GetSystemDefaultUILanguage(VOID) #ifndef _OLE2NLS_IN_BUILD_ /* - * @unimplemented + * @implemented */ LCID STDCALL GetThreadLocale (VOID) { - /* FIXME: ??? */ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return MAKELCID( - LANG_ENGLISH, - SORT_DEFAULT - ); + return NtCurrentTeb()->CurrentLocale; } #endif @@ -1563,7 +1558,7 @@ SetLocaleInfoW ( /* - * @unimplemented + * @implemented */ BOOL STDCALL @@ -1571,8 +1566,10 @@ SetThreadLocale ( LCID Locale ) { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; + /* FIXME - Check if locale is valid */ + + NtCurrentTeb()->CurrentLocale = Locale; + return TRUE; } #endif From 9ea61adcf933ba9256f9e553c4f87e2da44520ff Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sun, 2 May 2004 17:25:21 +0000 Subject: [PATCH 1015/1463] implemented IsWindowInDestroy() svn path=/trunk/; revision=9281 --- reactos/include/win32k/ntuser.h | 1 + reactos/lib/user32/include/user32.h | 3 ++ reactos/lib/user32/misc/stubs.c | 11 +---- reactos/lib/user32/windows/window.c | 12 +++++- reactos/subsys/win32k/include/window.h | 3 ++ reactos/subsys/win32k/ntuser/misc.c | 59 ++++++++++++++++++++++---- reactos/subsys/win32k/ntuser/window.c | 8 +++- 7 files changed, 76 insertions(+), 21 deletions(-) diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index b5ecb94beba..e8a09ae4ea3 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -179,6 +179,7 @@ NtUserCallNoParam( #define ONEPARAM_ROUTINE_GETWINDOWINSTANCE 0x10 #define ONEPARAM_ROUTINE_SETMESSAGEEXTRAINFO 0x0a #define ONEPARAM_ROUTINE_GETCURSORPOSITION 0x0b +#define ONEPARAM_ROUTINE_ISWINDOWINDESTROY 0x0c DWORD STDCALL NtUserCallOneParam( diff --git a/reactos/lib/user32/include/user32.h b/reactos/lib/user32/include/user32.h index 58c8f371286..f948aec80ac 100644 --- a/reactos/lib/user32/include/user32.h +++ b/reactos/lib/user32/include/user32.h @@ -90,6 +90,9 @@ void DrawCaret(HWND hWnd, PTHRDCARETINFO CaretInfo); #define NtUserGetCursorPos(lpPoint) \ (BOOL)NtUserCallOneParam((DWORD)lpPoint, ONEPARAM_ROUTINE_GETCURSORPOSITION) +#define NtUserIsWindowInDestroy(hWnd) \ + (BOOL)NtUserCallOneParam((DWORD)hWnd, ONEPARAM_ROUTINE_ISWINDOWINDESTROY) + LONG WINAPI RegCloseKey(HKEY); LONG WINAPI RegOpenKeyExW(HKEY,LPCWSTR,DWORD,REGSAM,PHKEY); LONG WINAPI RegQueryValueExW(HKEY,LPCWSTR,LPDWORD,LPDWORD,LPBYTE,LPDWORD); diff --git a/reactos/lib/user32/misc/stubs.c b/reactos/lib/user32/misc/stubs.c index 40bc361982e..b8e64d5d590 100644 --- a/reactos/lib/user32/misc/stubs.c +++ b/reactos/lib/user32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.61 2004/05/01 18:06:59 weiden Exp $ +/* $Id: stubs.c,v 1.62 2004/05/02 17:25:20 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -993,15 +993,6 @@ BOOL STDCALL UnregisterUserApiHook(VOID) return FALSE; } -/* - * @unimplemented - */ -BOOL STDCALL IsWindowInDestroy(HWND wnd) -{ - UNIMPLEMENTED; - return FALSE; -} - /* * @unimplemented */ diff --git a/reactos/lib/user32/windows/window.c b/reactos/lib/user32/windows/window.c index 2e9f12185e9..2e655fc407b 100644 --- a/reactos/lib/user32/windows/window.c +++ b/reactos/lib/user32/windows/window.c @@ -1,4 +1,4 @@ -/* $Id: window.c,v 1.114 2004/05/01 18:06:59 weiden Exp $ +/* $Id: window.c,v 1.115 2004/05/02 17:25:21 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -1655,5 +1655,15 @@ AnyPopup(VOID) return NtUserAnyPopup(); } +/* + * @implemented + */ +BOOL +STDCALL +IsWindowInDestroy(HWND hWnd) +{ + return NtUserIsWindowInDestroy(hWnd); +} + /* EOF */ diff --git a/reactos/subsys/win32k/include/window.h b/reactos/subsys/win32k/include/window.h index 65a2e06653b..bf218effd2c 100644 --- a/reactos/subsys/win32k/include/window.h +++ b/reactos/subsys/win32k/include/window.h @@ -213,6 +213,9 @@ IntGetWindowBorderMeasures(PWINDOW_OBJECT WindowObject, INT *cx, INT *cy); BOOL FASTCALL IntAnyPopup(VOID); +BOOL FASTCALL +IntIsWindowInDestroy(PWINDOW_OBJECT Window); + DWORD IntRemoveWndProcHandle(WNDPROC Handle); DWORD IntRemoveProcessWndProcHandles(HANDLE ProcessID); DWORD IntAddWndProcHandle(WNDPROC WindowProc, BOOL IsUnicode); diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index 9bb70ae002f..c2195ccd5b4 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.68 2004/05/01 18:06:59 weiden Exp $ +/* $Id: misc.c,v 1.69 2004/05/02 17:25:21 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -154,18 +154,17 @@ NtUserCallOneParam( DWORD Param, DWORD Routine) { - NTSTATUS Status; - DWORD Result = 0; - PWINSTATION_OBJECT WinStaObject; - PWINDOW_OBJECT WindowObject; - switch(Routine) { case ONEPARAM_ROUTINE_GETMENU: + { + PWINDOW_OBJECT WindowObject; + DWORD Result; + WindowObject = IntGetWindowObject((HWND)Param); if(!WindowObject) { - SetLastWin32Error(ERROR_INVALID_HANDLE); + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return FALSE; } @@ -173,26 +172,36 @@ NtUserCallOneParam( IntReleaseWindowObject(WindowObject); return Result; + } case ONEPARAM_ROUTINE_ISWINDOWUNICODE: + { + PWINDOW_OBJECT WindowObject; + DWORD Result; + WindowObject = IntGetWindowObject((HWND)Param); if(!WindowObject) { - SetLastWin32Error(ERROR_INVALID_HANDLE); + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return FALSE; } Result = WindowObject->Unicode; IntReleaseWindowObject(WindowObject); return Result; + } case ONEPARAM_ROUTINE_WINDOWFROMDC: return (DWORD)IntWindowFromDC((HDC)Param); case ONEPARAM_ROUTINE_GETWNDCONTEXTHLPID: + { + PWINDOW_OBJECT WindowObject; + DWORD Result; + WindowObject = IntGetWindowObject((HWND)Param); if(!WindowObject) { - SetLastWin32Error(ERROR_INVALID_HANDLE); + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return FALSE; } @@ -200,8 +209,14 @@ NtUserCallOneParam( IntReleaseWindowObject(WindowObject); return Result; + } case ONEPARAM_ROUTINE_SWAPMOUSEBUTTON: + { + PWINSTATION_OBJECT WinStaObject; + NTSTATUS Status; + DWORD Result; + Status = IntValidateWindowStationHandle(PROCESS_WINDOW_STATION(), KernelMode, 0, @@ -213,6 +228,7 @@ NtUserCallOneParam( ObDereferenceObject(WinStaObject); return Result; + } case ONEPARAM_ROUTINE_SWITCHCARETSHOWING: return (DWORD)IntSwitchCaretShowing((PVOID)Param); @@ -224,6 +240,10 @@ NtUserCallOneParam( return (DWORD)IntEnumClipboardFormats((UINT)Param); case ONEPARAM_ROUTINE_GETWINDOWINSTANCE: + { + PWINDOW_OBJECT WindowObject; + DWORD Result; + if(!(WindowObject = IntGetWindowObject((HWND)Param))) { SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); @@ -233,12 +253,15 @@ NtUserCallOneParam( Result = (DWORD)WindowObject->Instance; IntReleaseWindowObject(WindowObject); return Result; + } case ONEPARAM_ROUTINE_SETMESSAGEEXTRAINFO: return (DWORD)MsqSetMessageExtraInfo((LPARAM)Param); case ONEPARAM_ROUTINE_GETCURSORPOSITION: { + PWINSTATION_OBJECT WinStaObject; + NTSTATUS Status; POINT Pos; if(!Param) @@ -266,6 +289,24 @@ NtUserCallOneParam( return (DWORD)TRUE; } + + case ONEPARAM_ROUTINE_ISWINDOWINDESTROY: + { + PWINDOW_OBJECT WindowObject; + DWORD Result; + + WindowObject = IntGetWindowObject((HWND)Param); + if(!WindowObject) + { + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + return FALSE; + } + + Result = (DWORD)IntIsWindowInDestroy(WindowObject); + + IntReleaseWindowObject(WindowObject); + return Result; + } } DPRINT1("Calling invalid routine number 0x%x in NtUserCallOneParam(), Param=0x%x\n", Routine, Param); diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 60656074bbd..ae80a000632 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.222 2004/05/01 18:06:59 weiden Exp $ +/* $Id: window.c,v 1.223 2004/05/02 17:25:21 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1100,6 +1100,12 @@ IntAnyPopup(VOID) return FALSE; } +BOOL FASTCALL +IntIsWindowInDestroy(PWINDOW_OBJECT Window) +{ + return ((Window->Status & WINDOWSTATUS_DESTROYING) == WINDOWSTATUS_DESTROYING); +} + /* FUNCTIONS *****************************************************************/ /* From 00010bb088e062c15861c7e1b4a378c60dd177c8 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 2 May 2004 19:34:21 +0000 Subject: [PATCH 1016/1463] Add missing io performance counters. SystemPerformanceInformation reads io counters. svn path=/trunk/; revision=9282 --- reactos/ntoskrnl/ex/sysinfo.c | 17 +++++++++-------- reactos/ntoskrnl/include/internal/io.h | 4 +++- reactos/ntoskrnl/io/iomgr.c | 4 +++- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/reactos/ntoskrnl/ex/sysinfo.c b/reactos/ntoskrnl/ex/sysinfo.c index 0b4ee629b1e..0ed3180ee36 100644 --- a/reactos/ntoskrnl/ex/sysinfo.c +++ b/reactos/ntoskrnl/ex/sysinfo.c @@ -1,4 +1,4 @@ -/* $Id: sysinfo.c,v 1.33 2004/05/02 04:40:24 jimtabor Exp $ +/* $Id: sysinfo.c,v 1.34 2004/05/02 19:34:21 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -361,14 +362,14 @@ QSI_DEF(SystemPerformanceInformation) Spi->IdleTime.QuadPart = TheIdleProcess->Pcb.KernelTime * 100000; - Spi->ReadTransferCount.QuadPart = 0; /* FIXME */ - Spi->WriteTransferCount.QuadPart = 0; /* FIXME */ - Spi->OtherTransferCount.QuadPart = 0; /* FIXME */ - Spi->ReadOperationCount = 0; /* FIXME */ - Spi->WriteOperationCount = 0; /* FIXME */ - Spi->OtherOperationCount = 0; /* FIXME */ + Spi->ReadTransferCount.QuadPart = IoReadTransferCount; + Spi->WriteTransferCount.QuadPart = IoWriteTransferCount; + Spi->OtherTransferCount.QuadPart = IoOtherTransferCount; + Spi->ReadOperationCount = IoReadOperationCount; + Spi->WriteOperationCount = IoWriteOperationCount; + Spi->OtherOperationCount = IoOtherOperationCount; - Spi->AvailablePages = MiNrAvailablePages; + Spi->AvailablePages = MiNrAvailablePages; Spi->TotalCommittedPages = MiUsedSwapPages; Spi->TotalCommitLimit = MiFreeSwapPages + MiUsedSwapPages; /* FIXME */ diff --git a/reactos/ntoskrnl/include/internal/io.h b/reactos/ntoskrnl/include/internal/io.h index 968b700d2ef..2dde365097f 100644 --- a/reactos/ntoskrnl/include/internal/io.h +++ b/reactos/ntoskrnl/include/internal/io.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: io.h,v 1.42 2004/03/28 09:48:13 navaraf Exp $ +/* $Id: io.h,v 1.43 2004/05/02 19:33:29 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -256,6 +256,8 @@ typedef struct _DEVICETREE_TRAVERSE_CONTEXT extern PDEVICE_NODE IopRootDeviceNode; +extern ULONG IoOtherOperationCount; +extern ULONGLONG IoOtherTransferCount; VOID PnpInit(VOID); diff --git a/reactos/ntoskrnl/io/iomgr.c b/reactos/ntoskrnl/io/iomgr.c index 061ba346157..4a09a3e839a 100644 --- a/reactos/ntoskrnl/io/iomgr.c +++ b/reactos/ntoskrnl/io/iomgr.c @@ -1,4 +1,4 @@ -/* $Id: iomgr.c,v 1.46 2004/03/27 19:41:32 navaraf Exp $ +/* $Id: iomgr.c,v 1.47 2004/05/02 19:33:50 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -36,6 +36,8 @@ ULONG EXPORTED IoReadOperationCount = 0; ULONGLONG EXPORTED IoReadTransferCount = 0; ULONG EXPORTED IoWriteOperationCount = 0; ULONGLONG EXPORTED IoWriteTransferCount = 0; +ULONG IoOtherOperationCount = 0; +ULONGLONG IoOtherTransferCount = 0; KSPIN_LOCK EXPORTED IoStatisticsLock = 0; static GENERIC_MAPPING IopFileMapping = {FILE_GENERIC_READ, From a4b7d6a7a5265cc5acbcc6b75264acd56a2fdc70 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sun, 2 May 2004 20:08:29 +0000 Subject: [PATCH 1017/1463] - Removed old debug code which may crash a user mode application. svn path=/trunk/; revision=9283 --- reactos/lib/msvcrt/io/write.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/reactos/lib/msvcrt/io/write.c b/reactos/lib/msvcrt/io/write.c index f4ca807ba4c..a92a615f66e 100644 --- a/reactos/lib/msvcrt/io/write.c +++ b/reactos/lib/msvcrt/io/write.c @@ -62,7 +62,8 @@ size_t _write(int _fd, const void* _buf, size_t _nbyte) if (count == 0) { if (!WriteFile(_get_osfhandle(_fd), tmp, BUFSIZE, &wbyte, NULL)) { //ReportLastError(); - result = -1; + _dosmaperr(GetLastError()); + result = -1; break; } if (wbyte < BUFSIZE) { @@ -76,11 +77,9 @@ size_t _write(int _fd, const void* _buf, size_t _nbyte) *out++ = *in++; count--; if (count == 0 || _nbyte == 0) { - int tmp_len_debug = strlen(tmp); if (!WriteFile(_get_osfhandle(_fd), tmp, BUFSIZE - count, &wbyte, NULL)) { _dosmaperr(GetLastError()); result = -1; - tmp_len_debug = 0; break; } if (wbyte < (BUFSIZE - count)) { From 38ed29a671151d7798f1292ec94b256c70aa992e Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sun, 2 May 2004 20:12:38 +0000 Subject: [PATCH 1018/1463] - Check more exactly for a FAT file system. svn path=/trunk/; revision=9284 --- reactos/drivers/fs/fs_rec/fat.c | 178 +++++++++++++++++++++-------- reactos/drivers/fs/fs_rec/fs_rec.h | 20 +++- 2 files changed, 151 insertions(+), 47 deletions(-) diff --git a/reactos/drivers/fs/fs_rec/fat.c b/reactos/drivers/fs/fs_rec/fat.c index 419e380e7a4..1a0f44d3c93 100644 --- a/reactos/drivers/fs/fs_rec/fat.c +++ b/reactos/drivers/fs/fs_rec/fat.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: fat.c,v 1.8 2003/11/17 02:12:49 hyperion Exp $ +/* $Id: fat.c,v 1.9 2004/05/02 20:12:38 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -41,57 +41,143 @@ static NTSTATUS FsRecIsFatVolume(IN PDEVICE_OBJECT DeviceObject) { - DISK_GEOMETRY DiskGeometry; - PUCHAR Buffer; - ULONG Size; - NTSTATUS Status; + NTSTATUS Status; + PARTITION_INFORMATION PartitionInfo; + DISK_GEOMETRY DiskGeometry; + ULONG Size; + struct _BootSector* Boot; + BOOL RecognizedFS = FALSE; + Size = sizeof(DISK_GEOMETRY); - Size = sizeof(DISK_GEOMETRY); - Status = FsRecDeviceIoControl(DeviceObject, - IOCTL_DISK_GET_DRIVE_GEOMETRY, - NULL, - 0, - &DiskGeometry, - &Size); - DPRINT("FsRecDeviceIoControl() Status %lx\n", Status); - if (!NT_SUCCESS(Status)) - { - return(Status); - } + Status = FsRecDeviceIoControl(DeviceObject, + IOCTL_DISK_GET_DRIVE_GEOMETRY, + NULL, + 0, + &DiskGeometry, + &Size); + if (!NT_SUCCESS(Status)) + { + DPRINT("FsRecDeviceIoControl faild (%x)\n", Status); + return Status; + } + if (DiskGeometry.MediaType == FixedMedia || DiskGeometry.MediaType == RemovableMedia) + { + // We have found a hard disk + Size = sizeof(PARTITION_INFORMATION); + Status = FsRecDeviceIoControl(DeviceObject, + IOCTL_DISK_GET_PARTITION_INFO, + NULL, + 0, + &PartitionInfo, + &Size); + if (!NT_SUCCESS(Status)) + { + DPRINT("FsRecDeviceIoControl faild (%x)\n", Status); + return Status; + } + + if (PartitionInfo.PartitionType) + { + if (PartitionInfo.PartitionType == PARTITION_FAT_12 || + PartitionInfo.PartitionType == PARTITION_FAT_16 || + PartitionInfo.PartitionType == PARTITION_HUGE || + PartitionInfo.PartitionType == PARTITION_FAT32 || + PartitionInfo.PartitionType == PARTITION_FAT32_XINT13 || + PartitionInfo.PartitionType == PARTITION_XINT13) + { + RecognizedFS = TRUE; + } + } + else if (DiskGeometry.MediaType == RemovableMedia && + PartitionInfo.PartitionNumber > 0 && + PartitionInfo.StartingOffset.QuadPart == 0LL && + PartitionInfo.PartitionLength.QuadPart > 0LL) + { + /* This is possible a removable media formated as super floppy */ + RecognizedFS = TRUE; + } + } + if (DiskGeometry.MediaType > Unknown && DiskGeometry.MediaType < RemovableMedia ) + { + RecognizedFS = TRUE; + } + if (RecognizedFS == FALSE) + { + return STATUS_UNRECOGNIZED_VOLUME; + } - DPRINT("BytesPerSector: %lu\n", DiskGeometry.BytesPerSector); - Buffer = ExAllocatePool(NonPagedPool, - DiskGeometry.BytesPerSector); - if (Buffer == NULL) - { - return(STATUS_INSUFFICIENT_RESOURCES); - } + Boot = ExAllocatePool(NonPagedPool, DiskGeometry.BytesPerSector); + if (Boot == NULL) + { + return STATUS_INSUFFICIENT_RESOURCES; + } - Status = FsRecReadSectors(DeviceObject, - 0, /* Partition boot sector */ - 1, - DiskGeometry.BytesPerSector, - Buffer); - if (!NT_SUCCESS(Status)) - { - ExFreePool(Buffer); - return(Status); - } + Status = FsRecReadSectors(DeviceObject, + 0, + 1, + DiskGeometry.BytesPerSector, + (PUCHAR) Boot); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + if (Boot->Signatur1 != 0xaa55) + { + RecognizedFS=FALSE; + } + if (RecognizedFS && + Boot->BytesPerSector != 512 && + Boot->BytesPerSector != 1024 && + Boot->BytesPerSector != 2048 && + Boot->BytesPerSector == 4096) + { + RecognizedFS=FALSE; + } - if ((strncmp(&Buffer[0x36], "FAT12", 5) == 0) || - (strncmp(&Buffer[0x36], "FAT16", 5) == 0) || - (strncmp(&Buffer[0x52], "FAT32", 5) == 0)) - { - Status = STATUS_SUCCESS; - } - else - { - Status = STATUS_UNRECOGNIZED_VOLUME; - } + if (RecognizedFS && + Boot->FATCount != 1 && + Boot->FATCount != 2) + { + RecognizedFS=FALSE; + } - ExFreePool(Buffer); + if (RecognizedFS && + Boot->Media != 0xf0 && + Boot->Media != 0xf8 && + Boot->Media != 0xf9 && + Boot->Media != 0xfa && + Boot->Media != 0xfb && + Boot->Media != 0xfc && + Boot->Media != 0xfd && + Boot->Media != 0xfe && + Boot->Media != 0xff) + { + RecognizedFS=FALSE; + } - return(Status); + if (RecognizedFS && + Boot->SectorsPerCluster != 1 && + Boot->SectorsPerCluster != 2 && + Boot->SectorsPerCluster != 4 && + Boot->SectorsPerCluster != 8 && + Boot->SectorsPerCluster != 16 && + Boot->SectorsPerCluster != 32 && + Boot->SectorsPerCluster != 64 && + Boot->SectorsPerCluster != 128) + { + RecognizedFS=FALSE; + } + + if (RecognizedFS && + Boot->BytesPerSector * Boot->SectorsPerCluster > 32 * 1024) + { + RecognizedFS=FALSE; + } + + + ExFreePool(Boot); + return RecognizedFS ? STATUS_SUCCESS : STATUS_UNRECOGNIZED_VOLUME; } diff --git a/reactos/drivers/fs/fs_rec/fs_rec.h b/reactos/drivers/fs/fs_rec/fs_rec.h index b4929a68405..c269fa77cac 100644 --- a/reactos/drivers/fs/fs_rec/fs_rec.h +++ b/reactos/drivers/fs/fs_rec/fs_rec.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: fs_rec.h,v 1.3 2003/01/16 11:58:15 ekohl Exp $ +/* $Id: fs_rec.h,v 1.4 2004/05/02 20:12:38 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -40,6 +40,24 @@ typedef struct _DEVICE_EXTENSION ULONG FsType; } DEVICE_EXTENSION, *PDEVICE_EXTENSION; +struct _BootSector +{ + unsigned char magic0, res0, magic1; + unsigned char OEMName[8]; + unsigned short BytesPerSector; + unsigned char SectorsPerCluster; + unsigned short ReservedSectors; + unsigned char FATCount; + unsigned short RootEntries, Sectors; + unsigned char Media; + unsigned short FATSectors, SectorsPerTrack, Heads; + unsigned long HiddenSectors, SectorsHuge; + unsigned char Drive, Res1, Sig; + unsigned long VolumeID; + unsigned char VolumeLabel[11], SysType[8]; + unsigned char Res2[448]; + unsigned short Signatur1; +} __attribute__((packed)); /* blockdev.c */ From 7450b416e4149d5ad289dda0ced5a801a5addf0f Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sun, 2 May 2004 20:16:46 +0000 Subject: [PATCH 1019/1463] - Fixed checking for a FAT file system on a removable media. - Check more exactly for a FAT file system. svn path=/trunk/; revision=9285 --- reactos/drivers/fs/vfat/fsctl.c | 133 ++++++++++++++++++++++---------- reactos/drivers/fs/vfat/vfat.h | 10 +-- 2 files changed, 99 insertions(+), 44 deletions(-) diff --git a/reactos/drivers/fs/vfat/fsctl.c b/reactos/drivers/fs/vfat/fsctl.c index 773f2c336e5..dee33ff9bde 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.29 2004/03/31 03:30:36 jimtabor Exp $ +/* $Id: fsctl.c,v 1.30 2004/05/02 20:16:45 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -55,6 +55,9 @@ VfatHasFileSystem(PDEVICE_OBJECT DeviceToMount, ULONG Sectors; LARGE_INTEGER Offset; struct _BootSector* Boot; + BOOL PartitionInfoIsValid = FALSE; + + DPRINT("VfatHasFileSystem\n"); *RecognizedFS = FALSE; @@ -66,15 +69,12 @@ VfatHasFileSystem(PDEVICE_OBJECT DeviceToMount, &DiskGeometry, &Size, FALSE); - DPRINT("VfatHasFileSystem start\n"); - - if (!NT_SUCCESS(Status)) { DPRINT("VfatBlockDeviceIoControl faild (%x)\n", Status); return Status; } - if (DiskGeometry.MediaType == FixedMedia || RemovableMedia) + if (DiskGeometry.MediaType == FixedMedia || DiskGeometry.MediaType == RemovableMedia) { // We have found a hard disk Size = sizeof(PARTITION_INFORMATION); @@ -90,7 +90,8 @@ VfatHasFileSystem(PDEVICE_OBJECT DeviceToMount, DPRINT("VfatBlockDeviceIoControl faild (%x)\n", Status); return Status; } -/*#ifndef NDEBUG*/ + PartitionInfoIsValid = TRUE; +#if defined(DBG) && !defined(NDEBUG) DbgPrint("Partition Information:\n"); DbgPrint("StartingOffset %u\n", PartitionInfo.StartingOffset.QuadPart / 512); DbgPrint("PartitionLength %u\n", PartitionInfo.PartitionLength.QuadPart / 512); @@ -100,18 +101,29 @@ VfatHasFileSystem(PDEVICE_OBJECT DeviceToMount, DbgPrint("BootIndicator %u\n", PartitionInfo.BootIndicator); DbgPrint("RecognizedPartition %u\n", PartitionInfo.RecognizedPartition); DbgPrint("RewritePartition %u\n", PartitionInfo.RewritePartition); -/*#endif*/ - if (PartitionInfo.PartitionType == PARTITION_FAT_12 || - PartitionInfo.PartitionType == PARTITION_FAT_16 || - PartitionInfo.PartitionType == PARTITION_HUGE || - PartitionInfo.PartitionType == PARTITION_FAT32 || - PartitionInfo.PartitionType == PARTITION_FAT32_XINT13 || - PartitionInfo.PartitionType == PARTITION_XINT13) +#endif + if (PartitionInfo.PartitionType) { + if (PartitionInfo.PartitionType == PARTITION_FAT_12 || + PartitionInfo.PartitionType == PARTITION_FAT_16 || + PartitionInfo.PartitionType == PARTITION_HUGE || + PartitionInfo.PartitionType == PARTITION_FAT32 || + PartitionInfo.PartitionType == PARTITION_FAT32_XINT13 || + PartitionInfo.PartitionType == PARTITION_XINT13) + { + *RecognizedFS = TRUE; + } + } + else if (DiskGeometry.MediaType == RemovableMedia && + PartitionInfo.PartitionNumber > 0 && + PartitionInfo.StartingOffset.QuadPart == 0LL && + PartitionInfo.PartitionLength.QuadPart > 0LL) + { + /* This is possible a removable media formated as super floppy */ *RecognizedFS = TRUE; } } - else if (DiskGeometry.MediaType > Unknown && DiskGeometry.MediaType <= RemovableMedia ) + if (DiskGeometry.MediaType > Unknown && DiskGeometry.MediaType < RemovableMedia ) { *RecognizedFS = TRUE; } @@ -123,8 +135,6 @@ VfatHasFileSystem(PDEVICE_OBJECT DeviceToMount, Boot = ExAllocatePool(NonPagedPool, DiskGeometry.BytesPerSector); if (Boot == NULL) { - DPRINT("VfatHasFileSystem 1\n"); - *RecognizedFS=FALSE; return STATUS_INSUFFICIENT_RESOURCES; } @@ -134,9 +144,66 @@ VfatHasFileSystem(PDEVICE_OBJECT DeviceToMount, Status = VfatReadDisk(DeviceToMount, &Offset, DiskGeometry.BytesPerSector, (PUCHAR) Boot, FALSE); if (NT_SUCCESS(Status)) { - DPRINT("VfatHasFileSystem 2\n"); + if (Boot->Signatur1 != 0xaa55) + { + DPRINT1("Signature %04x\n", Boot->Signatur1); + *RecognizedFS=FALSE; + } + if (*RecognizedFS && + Boot->BytesPerSector != 512 && + Boot->BytesPerSector != 1024 && + Boot->BytesPerSector != 2048 && + Boot->BytesPerSector == 4096) + { + DPRINT1("BytesPerSector %d\n", Boot->BytesPerSector); + *RecognizedFS=FALSE; + } - if (Boot->BytesPerSector != 0) + if (*RecognizedFS && + Boot->FATCount != 1 && + Boot->FATCount != 2) + { + DPRINT1("FATCount %d\n", Boot->FATCount); + *RecognizedFS=FALSE; + } + + if (*RecognizedFS && + Boot->Media != 0xf0 && + Boot->Media != 0xf8 && + Boot->Media != 0xf9 && + Boot->Media != 0xfa && + Boot->Media != 0xfb && + Boot->Media != 0xfc && + Boot->Media != 0xfd && + Boot->Media != 0xfe && + Boot->Media != 0xff) + { + DPRINT1("Media %02x\n", Boot->Media); + *RecognizedFS=FALSE; + } + + if (*RecognizedFS && + Boot->SectorsPerCluster != 1 && + Boot->SectorsPerCluster != 2 && + Boot->SectorsPerCluster != 4 && + Boot->SectorsPerCluster != 8 && + Boot->SectorsPerCluster != 16 && + Boot->SectorsPerCluster != 32 && + Boot->SectorsPerCluster != 64 && + Boot->SectorsPerCluster != 128) + { + DPRINT1("SectorsPerCluster %02x\n", Boot->SectorsPerCluster); + *RecognizedFS=FALSE; + } + + if (*RecognizedFS && + Boot->BytesPerSector * Boot->SectorsPerCluster > 32 * 1024) + { + DPRINT1("ClusterSize %dx\n", Boot->BytesPerSector * Boot->SectorsPerCluster); + *RecognizedFS=FALSE; + } + + if (*RecognizedFS) { FatInfo.VolumeID = Boot->VolumeID; FatInfo.FATStart = Boot->ReservedSectors; @@ -169,21 +236,22 @@ VfatHasFileSystem(PDEVICE_OBJECT DeviceToMount, DPRINT("FAT16\n"); FatInfo.FatType = FAT16; } - if (pFatInfo) + if (PartitionInfoIsValid && + FatInfo.Sectors > PartitionInfo.PartitionLength.QuadPart / FatInfo.BytesPerSector) + { + CHECKPOINT1; + *RecognizedFS = FALSE; + } + + if (pFatInfo && *RecognizedFS) { *pFatInfo = FatInfo; } } - else - { - DPRINT("VfatHasFileSystem 3\n"); - - Status = STATUS_INSUFFICIENT_RESOURCES; - } } - DPRINT("VfatHasFileSystem end\n"); ExFreePool(Boot); + DPRINT("VfatHasFileSystem done\n"); return Status; } @@ -206,19 +274,6 @@ VfatMountDevice(PDEVICE_EXTENSION DeviceExt, } DPRINT("MountVfatdev %d, PAGE_SIZE = %d\n", DeviceExt->FatInfo.BytesPerCluster, PAGE_SIZE); - if (DeviceExt->FatInfo.BytesPerCluster >= PAGE_SIZE && - (DeviceExt->FatInfo.BytesPerCluster % PAGE_SIZE) != 0) - { - DbgPrint("(%s:%d) Invalid cluster size\n", __FILE__, __LINE__); - KEBUGCHECK(0); - } - else if (DeviceExt->FatInfo.BytesPerCluster < PAGE_SIZE && - (PAGE_SIZE % DeviceExt->FatInfo.BytesPerCluster) != 0) - { - DbgPrint("(%s:%d) Invalid cluster size2\n", __FILE__, __LINE__); - KEBUGCHECK(0); - } - return(STATUS_SUCCESS); } diff --git a/reactos/drivers/fs/vfat/vfat.h b/reactos/drivers/fs/vfat/vfat.h index 7db0b7cf17f..9d0606c8f86 100644 --- a/reactos/drivers/fs/vfat/vfat.h +++ b/reactos/drivers/fs/vfat/vfat.h @@ -1,4 +1,4 @@ -/* $Id: vfat.h,v 1.61 2003/11/12 15:26:44 ekohl Exp $ */ +/* $Id: vfat.h,v 1.62 2004/05/02 20:16:46 hbirr Exp $ */ #include @@ -20,8 +20,8 @@ struct _BootSector unsigned char Drive, Res1, Sig; unsigned long VolumeID; unsigned char VolumeLabel[11], SysType[8]; - unsigned char Res2[446]; - unsigned long Signatur1; + unsigned char Res2[448]; + unsigned short Signatur1; } __attribute__((packed)); struct _BootSector32 @@ -48,8 +48,8 @@ struct _BootSector32 unsigned char ExtBootSignature; // 66 unsigned long VolumeID; // 67 unsigned char VolumeLabel[11], SysType[8]; // 71 - unsigned char Res2[418]; // 90 - unsigned long Signature1; // 508 + unsigned char Res2[420]; // 90 + unsigned short Signature1; // 510 } __attribute__((packed)); struct _FsInfoSector From 01e86752a11903bf66a5138c9d52ea9555db602a Mon Sep 17 00:00:00 2001 From: Mike Nordell Date: Sun, 2 May 2004 20:53:50 +0000 Subject: [PATCH 1020/1463] Make loader tell what module it is relocating (debug) svn path=/trunk/; revision=9286 --- reactos/lib/ntdll/ldr/utils.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/lib/ntdll/ldr/utils.c b/reactos/lib/ntdll/ldr/utils.c index 73f77a9dfed..90f843c407c 100644 --- a/reactos/lib/ntdll/ldr/utils.c +++ b/reactos/lib/ntdll/ldr/utils.c @@ -1,4 +1,4 @@ -/* $Id: utils.c,v 1.84 2004/03/13 18:14:04 hbirr Exp $ +/* $Id: utils.c,v 1.85 2004/05/02 20:53:50 tamlin Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -2104,8 +2104,8 @@ LdrpLoadModule(IN PWSTR SearchPath OPTIONAL, * relocation. */ if (ImageBase != (PVOID) NtHeaders->OptionalHeader.ImageBase) { - DPRINT1("Performing relocations (%x -> %x)\n", - NtHeaders->OptionalHeader.ImageBase, ImageBase); + DPRINT1("Relocating (%x -> %x) %wZ\n", + NtHeaders->OptionalHeader.ImageBase, ImageBase, &FullDosName); Status = LdrPerformRelocations(NtHeaders, ImageBase); if (!NT_SUCCESS(Status)) { From 8220b586b42522d8cdd83a11c1294084ab4e86d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sun, 2 May 2004 21:41:18 +0000 Subject: [PATCH 1021/1463] Handle MENUITEMINFOW compiled with _WIN32_WINNT < 0x0500 (MENUITEMINFOW misses the HBITMAP hbmpItem at the end in that case). svn path=/trunk/; revision=9287 --- reactos/subsys/win32k/ntuser/menu.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/menu.c b/reactos/subsys/win32k/ntuser/menu.c index 1a3dc6d679e..d0c4c2a7512 100644 --- a/reactos/subsys/win32k/ntuser/menu.c +++ b/reactos/subsys/win32k/ntuser/menu.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: menu.c,v 1.52 2004/03/25 12:32:13 gvg Exp $ +/* $Id: menu.c,v 1.53 2004/05/02 21:41:18 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1750,8 +1750,11 @@ NtUserMenuItemInfo( SetLastNtError(Status); return FALSE; } - if(sizeof(MENUITEMINFOW) != Size && sizeof(ROSMENUITEMINFO) != Size) + if (sizeof(MENUITEMINFOW) != Size + && sizeof(MENUITEMINFOW) - sizeof(HBITMAP) != Size + && sizeof(ROSMENUITEMINFO) != Size) { + IntReleaseMenuObject(MenuObject); SetLastWin32Error(ERROR_INVALID_PARAMETER); return FALSE; } @@ -1762,6 +1765,15 @@ NtUserMenuItemInfo( SetLastNtError(Status); return FALSE; } + /* If this is a pre-0x0500 _WIN32_WINNT MENUITEMINFOW, you can't + set/get hbmpItem */ + if (sizeof(MENUITEMINFOW) - sizeof(HBITMAP) == Size + && 0 != (ItemInfo.fMask & MIIM_BITMAP)) + { + IntReleaseMenuObject(MenuObject); + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return FALSE; + } if (IntGetMenuItemByFlag(MenuObject, Item, (ByPosition ? MF_BYPOSITION : MF_BYCOMMAND), From 2440a90d732ec96426dcdb6caff8ac672026bc24 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sun, 2 May 2004 22:49:24 +0000 Subject: [PATCH 1022/1463] - Don't assign arc names to removable media drives like zip drives. svn path=/trunk/; revision=9288 --- reactos/ntoskrnl/io/arcname.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/reactos/ntoskrnl/io/arcname.c b/reactos/ntoskrnl/io/arcname.c index a0dc38fd866..19e8afee493 100644 --- a/reactos/ntoskrnl/io/arcname.c +++ b/reactos/ntoskrnl/io/arcname.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: arcname.c,v 1.16 2003/11/17 02:12:51 hyperion Exp $ +/* $Id: arcname.c,v 1.17 2004/05/02 22:49:24 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -52,8 +52,11 @@ IoCreateArcNames(VOID) WCHAR ArcNameBuffer[80]; UNICODE_STRING DeviceName; UNICODE_STRING ArcName; - ULONG i, j; + ULONG i, j, k; NTSTATUS Status; + PFILE_OBJECT FileObject; + PDEVICE_OBJECT DeviceObject; + BOOL IsRemovableMedia; DPRINT("IoCreateArcNames() called\n"); @@ -86,7 +89,7 @@ IoCreateArcNames(VOID) /* create ARC names for hard disk drives */ DPRINT("Disk drives: %lu\n", ConfigInfo->DiskCount); - for (i = 0; i < ConfigInfo->DiskCount; i++) + for (i = 0, k = 0; i < ConfigInfo->DiskCount; i++) { swprintf(DeviceNameBuffer, L"\\Device\\Harddisk%lu\\Partition0", @@ -94,9 +97,25 @@ IoCreateArcNames(VOID) RtlInitUnicodeString(&DeviceName, DeviceNameBuffer); + + Status = IoGetDeviceObjectPointer(&DeviceName, + FILE_READ_DATA, + &FileObject, + &DeviceObject); + if (!NT_SUCCESS(Status)) + { + continue; + } + IsRemovableMedia = DeviceObject->Characteristics & FILE_REMOVABLE_MEDIA ? TRUE : FALSE; + ObDereferenceObject(FileObject); + if (IsRemovableMedia) + { + continue; + } + swprintf(ArcNameBuffer, L"\\ArcName\\multi(0)disk(0)rdisk(%lu)partition(0)", - i); + k); RtlInitUnicodeString(&ArcName, ArcNameBuffer); DPRINT("%wZ ==> %wZ\n", @@ -126,7 +145,7 @@ IoCreateArcNames(VOID) swprintf(ArcNameBuffer, L"\\ArcName\\multi(0)disk(0)rdisk(%lu)partition(%lu)", - i, + k, j + 1); RtlInitUnicodeString(&ArcName, ArcNameBuffer); @@ -142,6 +161,7 @@ IoCreateArcNames(VOID) ExFreePool(LayoutInfo); LayoutInfo = NULL; + k++; } /* create ARC names for cdrom drives */ From 560afee25cfd5a350f0cf4423baf66dbe13acf75 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sun, 2 May 2004 22:54:45 +0000 Subject: [PATCH 1023/1463] - Don't read the disk informations at boot time from removable medias like zip drives. This prevents from merging removable disks into the order of partitions from hard disks. svn path=/trunk/; revision=9289 --- reactos/ntoskrnl/io/xhaldrv.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/reactos/ntoskrnl/io/xhaldrv.c b/reactos/ntoskrnl/io/xhaldrv.c index 3d097eeab65..2c5291f68a1 100644 --- a/reactos/ntoskrnl/io/xhaldrv.c +++ b/reactos/ntoskrnl/io/xhaldrv.c @@ -1,4 +1,4 @@ -/* $Id: xhaldrv.c,v 1.43 2004/01/05 14:28:20 weiden Exp $ +/* $Id: xhaldrv.c,v 1.44 2004/05/02 22:54:45 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -138,22 +138,10 @@ xHalQueryDriveLayout(IN PUNICODE_STRING DeviceName, DPRINT("DiskGeometry.BytesPerSector: %d\n", DiskGeometry.BytesPerSector); - /* Read the partition table */ - Status = IoReadPartitionTable(DeviceObject, - DiskGeometry.BytesPerSector, - FALSE, - LayoutInfo); - - if ((!NT_SUCCESS(Status) || (*LayoutInfo)->PartitionCount == 0) && - DeviceObject->Characteristics & FILE_REMOVABLE_MEDIA) + if (DeviceObject->Characteristics & FILE_REMOVABLE_MEDIA) { PDRIVE_LAYOUT_INFORMATION Buffer; - if (NT_SUCCESS(Status)) - { - ExFreePool(*LayoutInfo); - } - /* Allocate a partition list for a single entry. */ Buffer = ExAllocatePool(NonPagedPool, sizeof(DRIVE_LAYOUT_INFORMATION)); @@ -166,6 +154,18 @@ xHalQueryDriveLayout(IN PUNICODE_STRING DeviceName, Status = STATUS_SUCCESS; } + else + { + Status = STATUS_UNSUCCESSFUL; + } + } + else + { + /* Read the partition table */ + Status = IoReadPartitionTable(DeviceObject, + DiskGeometry.BytesPerSector, + FALSE, + LayoutInfo); } ObDereferenceObject(FileObject); From 03cfc7943a4fbbcffb9c768ed3d10a7ea6ab6a39 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 3 May 2004 12:05:44 +0000 Subject: [PATCH 1024/1463] - Implement DeleteGroup(). - Implement ANSI profile directory functions. svn path=/trunk/; revision=9291 --- reactos/lib/userenv/desktop.c | 47 ++++++++++- reactos/lib/userenv/profile.c | 132 ++++++++++++++++++++++++++++++- reactos/lib/userenv/userenv.def | 6 ++ reactos/lib/userenv/userenv.edf | 6 ++ reactos/w32api/include/userenv.h | 4 + 5 files changed, 192 insertions(+), 3 deletions(-) diff --git a/reactos/lib/userenv/desktop.c b/reactos/lib/userenv/desktop.c index 0655be3c881..e6b260d11ac 100644 --- a/reactos/lib/userenv/desktop.c +++ b/reactos/lib/userenv/desktop.c @@ -1,4 +1,4 @@ -/* $Id: desktop.c,v 1.2 2004/05/01 11:55:01 ekohl Exp $ +/* $Id: desktop.c,v 1.3 2004/05/03 12:05:44 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -330,7 +330,7 @@ CreateGroupW (LPCWSTR lpGroupName, DPRINT ("Group path: '%S'\n", szGroupPath); /* FIXME: Create nested directories */ - if (!CreateDirectory (szGroupPath, NULL)) + if (!CreateDirectoryW (szGroupPath, NULL)) return FALSE; /* FIXME: Notify the shell */ @@ -340,4 +340,47 @@ CreateGroupW (LPCWSTR lpGroupName, return TRUE; } + +BOOL WINAPI +DeleteGroupA (LPCSTR lpGroupName, + BOOL bCommonGroup) +{ + DPRINT1 ("DeleteGroupA() not implemented!\n"); + return FALSE; +} + + +BOOL WINAPI +DeleteGroupW (LPCWSTR lpGroupName, + BOOL bCommonGroup) +{ + WCHAR szGroupPath[MAX_PATH]; + + DPRINT ("DeleteGroupW() called\n"); + + if (lpGroupName == NULL || *lpGroupName == 0) + return TRUE; + + if (!GetProgramsPath (bCommonGroup, szGroupPath)) + { + DPRINT1 ("GetProgramsPath() failed\n"); + return FALSE; + } + DPRINT ("Programs path: '%S'\n", szGroupPath); + + wcscat (szGroupPath, L"\\"); + wcscat (szGroupPath, lpGroupName); + DPRINT ("Group path: '%S'\n", szGroupPath); + + /* FIXME: Remove nested directories */ + if (!RemoveDirectoryW (szGroupPath)) + return FALSE; + + /* FIXME: Notify the shell */ + + DPRINT ("DeleteGroupW() done\n"); + + return TRUE; +} + /* EOF */ diff --git a/reactos/lib/userenv/profile.c b/reactos/lib/userenv/profile.c index d52872ecac8..6fd87d9c7d7 100644 --- a/reactos/lib/userenv/profile.c +++ b/reactos/lib/userenv/profile.c @@ -1,4 +1,4 @@ -/* $Id: profile.c,v 1.10 2004/04/29 14:41:26 ekohl Exp $ +/* $Id: profile.c,v 1.11 2004/05/03 12:05:44 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -301,6 +301,38 @@ CreateUserProfileW (PSID Sid, } +BOOL WINAPI +GetAllUsersProfileDirectoryA (LPSTR lpProfileDir, + LPDWORD lpcchSize) +{ + LPWSTR lpBuffer; + BOOL bResult; + + lpBuffer = GlobalAlloc (GMEM_FIXED, + *lpcchSize * sizeof(WCHAR)); + if (lpBuffer == NULL) + return FALSE; + + bResult = GetAllUsersProfileDirectoryW (lpBuffer, + lpcchSize); + if (bResult) + { + WideCharToMultiByte (CP_ACP, + 0, + lpBuffer, + -1, + lpProfileDir, + *lpcchSize, + NULL, + NULL); + } + + GlobalFree (lpBuffer); + + return bResult; +} + + BOOL WINAPI GetAllUsersProfileDirectoryW (LPWSTR lpProfileDir, LPDWORD lpcchSize) @@ -382,6 +414,38 @@ GetAllUsersProfileDirectoryW (LPWSTR lpProfileDir, } +BOOL WINAPI +GetDefaultUserProfileDirectoryA (LPSTR lpProfileDir, + LPDWORD lpcchSize) +{ + LPWSTR lpBuffer; + BOOL bResult; + + lpBuffer = GlobalAlloc (GMEM_FIXED, + *lpcchSize * sizeof(WCHAR)); + if (lpBuffer == NULL) + return FALSE; + + bResult = GetDefaultUserProfileDirectoryW (lpBuffer, + lpcchSize); + if (bResult) + { + WideCharToMultiByte (CP_ACP, + 0, + lpBuffer, + -1, + lpProfileDir, + *lpcchSize, + NULL, + NULL); + } + + GlobalFree (lpBuffer); + + return bResult; +} + + BOOL WINAPI GetDefaultUserProfileDirectoryW (LPWSTR lpProfileDir, LPDWORD lpcchSize) @@ -463,6 +527,38 @@ GetDefaultUserProfileDirectoryW (LPWSTR lpProfileDir, } +BOOL WINAPI +GetProfilesDirectoryA (LPSTR lpProfileDir, + LPDWORD lpcchSize) +{ + LPWSTR lpBuffer; + BOOL bResult; + + lpBuffer = GlobalAlloc (GMEM_FIXED, + *lpcchSize * sizeof(WCHAR)); + if (lpBuffer == NULL) + return FALSE; + + bResult = GetProfilesDirectoryW (lpBuffer, + lpcchSize); + if (bResult) + { + WideCharToMultiByte (CP_ACP, + 0, + lpBuffer, + -1, + lpProfileDir, + *lpcchSize, + NULL, + NULL); + } + + GlobalFree (lpBuffer); + + return bResult; +} + + BOOL WINAPI GetProfilesDirectoryW (LPWSTR lpProfilesDir, LPDWORD lpcchSize) @@ -526,6 +622,40 @@ GetProfilesDirectoryW (LPWSTR lpProfilesDir, } +BOOL WINAPI +GetUserProfileDirectoryA (HANDLE hToken, + LPSTR lpProfileDir, + LPDWORD lpcchSize) +{ + LPWSTR lpBuffer; + BOOL bResult; + + lpBuffer = GlobalAlloc (GMEM_FIXED, + *lpcchSize * sizeof(WCHAR)); + if (lpBuffer == NULL) + return FALSE; + + bResult = GetUserProfileDirectoryW (hToken, + lpBuffer, + lpcchSize); + if (bResult) + { + WideCharToMultiByte (CP_ACP, + 0, + lpBuffer, + -1, + lpProfileDir, + *lpcchSize, + NULL, + NULL); + } + + GlobalFree (lpBuffer); + + return bResult; +} + + BOOL WINAPI GetUserProfileDirectoryW (HANDLE hToken, LPWSTR lpProfileDir, diff --git a/reactos/lib/userenv/userenv.def b/reactos/lib/userenv/userenv.def index 544305f2aa2..0ae996935c2 100644 --- a/reactos/lib/userenv/userenv.def +++ b/reactos/lib/userenv/userenv.def @@ -3,6 +3,8 @@ EXPORTS InitializeProfiles@0 @100 NONAME CreateGroupA@8 @101 NONAME CreateGroupW@8 @102 NONAME +DeleteGroupA@8 @103 NONAME +DeleteGroupW@8 @104 NONAME CreateUserProfileA@8 @109 NONAME CreateUserProfileW@8 @110 NONAME AddDesktopItemA@32 @113 NONAME @@ -11,9 +13,13 @@ DeleteDesktopItemA@8 @115 NONAME DeleteDesktopItemW@8 @116 NONAME CreateEnvironmentBlock@12 DestroyEnvironmentBlock@4 +GetAllUsersProfileDirectoryA@8 GetAllUsersProfileDirectoryW@8 +GetDefaultUserProfileDirectoryA@8 GetDefaultUserProfileDirectoryW@8 +GetProfilesDirectoryA@8 GetProfilesDirectoryW@8 +GetUserProfileDirectoryA@12 GetUserProfileDirectoryW@12 LoadUserProfileA@8 LoadUserProfileW@8 diff --git a/reactos/lib/userenv/userenv.edf b/reactos/lib/userenv/userenv.edf index df109f85fe7..d812d7a8633 100644 --- a/reactos/lib/userenv/userenv.edf +++ b/reactos/lib/userenv/userenv.edf @@ -3,6 +3,8 @@ EXPORTS InitializeProfiles=InitializeProfiles@0 @100 NONAME CreateGroupA=CreateGroupA@8 @101 NONAME CreateGroupW=CreateGroupW@8 @102 NONAME +DeleteGroupA=DeleteGroupA@8 @103 NONAME +DeleteGroupW=DeleteGroupW@8 @104 NONAME CreateUserProfileA=CreateUserProfileA@8 @109 NONAME CreateUserProfileW=CreateUserProfileW@8 @110 NONAME AddDesktopItemA=AddDesktopItemA@32 @113 NONAME @@ -11,9 +13,13 @@ DeleteDesktopItemA=DeleteDesktopItemA@8 @115 NONAME DeleteDesktopItemW=DeleteDesktopItemW@8 @116 NONAME CreateEnvironmentBlock=CreateEnvironmentBlock@12 DestroyEnvironmentBlock=DestroyEnvironmentBlock@4 +GetAllUsersProfileDirectoryA=GetAllUsersProfileDirectoryA@8 GetAllUsersProfileDirectoryW=GetAllUsersProfileDirectoryW@8 +GetDefaultUserProfileDirectoryA=GetDefaultUserProfileDirectoryA@8 GetDefaultUserProfileDirectoryW=GetDefaultUserProfileDirectoryW@8 +GetProfilesDirectoryA=GetProfilesDirectoryA@8 GetProfilesDirectoryW=GetProfilesDirectoryW@8 +GetUserProfileDirectoryA=GetUserProfileDirectoryA@12 GetUserProfileDirectoryW=GetUserProfileDirectoryW@12 LoadUserProfileA=LoadUserProfileA@8 LoadUserProfileW=LoadUserProfileW@8 diff --git a/reactos/w32api/include/userenv.h b/reactos/w32api/include/userenv.h index d228d679d9a..7de9a8bcd36 100644 --- a/reactos/w32api/include/userenv.h +++ b/reactos/w32api/include/userenv.h @@ -46,6 +46,8 @@ BOOL WINAPI DeleteDesktopItemA (BOOL, LPCSTR); BOOL WINAPI DeleteDesktopItemW (BOOL, LPCWSTR); BOOL WINAPI CreateGroupA (LPCSTR, BOOL); BOOL WINAPI CreateGroupW (LPCWSTR, BOOL); +BOOL WINAPI DeleteGroupA (LPCSTR, BOOL); +BOOL WINAPI DeleteGroupW (LPCWSTR, BOOL); /* end private */ BOOL WINAPI LoadUserProfileA (HANDLE, LPPROFILEINFOA); BOOL WINAPI LoadUserProfileW (HANDLE, LPPROFILEINFOW); @@ -71,6 +73,7 @@ typedef LPPROFILEINFOW LPPROFILEINFO; #define AddDesktopItem AddDesktopItemW #define DeleteDesktopItem DeleteDesktopItemW #define CreateGroup CreateGroupW +#define DeleteGroup DeleteGroupW /* end private */ #define LoadUserProfile LoadUserProfileW #define GetAllUsersProfileDirectory GetAllUsersProfileDirectoryW @@ -85,6 +88,7 @@ typedef LPPROFILEINFOA LPPROFILEINFO; #define AddDesktopItem AddDesktopItemA #define DeleteDesktopItem DeleteDesktopItemA #define CreateGroup CreateGroupA +#define DeleteGroup DeleteGroupA /* end private */ #define LoadUserProfile LoadUserProfileA #define GetAllUsersProfileDirectory GetAllUsersProfileDirectoryA From eae24c409361cea6b8b65ce711692a751a295640 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 3 May 2004 14:34:44 +0000 Subject: [PATCH 1025/1463] implemented LoadModule() svn path=/trunk/; revision=9292 --- reactos/include/structs.h | 8 +++ reactos/lib/kernel32/misc/ldr.c | 88 ++++++++++++++++++++++++++++++- reactos/lib/kernel32/misc/stubs.c | 16 +----- 3 files changed, 96 insertions(+), 16 deletions(-) diff --git a/reactos/include/structs.h b/reactos/include/structs.h index 0282c164796..16d9bb3d8a1 100644 --- a/reactos/include/structs.h +++ b/reactos/include/structs.h @@ -2991,6 +2991,14 @@ typedef struct _LANA_ENUM { } LANA_ENUM; +typedef struct tagLOADPARMS32 { + LPSTR lpEnvAddress; + LPSTR lpCmdLine; + LPSTR lpCmdShow; + DWORD dwReserved; +} LOADPARMS32; + + typedef struct tagLOCALESIGNATURE { DWORD lsUsb[4]; DWORD lsCsbDefault[2]; diff --git a/reactos/lib/kernel32/misc/ldr.c b/reactos/lib/kernel32/misc/ldr.c index 3ca1635ccae..0e78b060823 100644 --- a/reactos/lib/kernel32/misc/ldr.c +++ b/reactos/lib/kernel32/misc/ldr.c @@ -1,4 +1,4 @@ -/* $Id: ldr.c,v 1.19 2004/01/23 21:16:03 ekohl Exp $ +/* $Id: ldr.c,v 1.20 2004/05/03 14:34:44 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT : ReactOS user mode libraries @@ -409,4 +409,90 @@ GetModuleHandleW (LPCWSTR lpModuleName) return ((HMODULE)BaseAddress); } + +/* + * @implemented + */ +DWORD +STDCALL +LoadModule ( + LPCSTR lpModuleName, + LPVOID lpParameterBlock + ) +{ + STARTUPINFOA StartupInfo; + PROCESS_INFORMATION ProcessInformation; + LOADPARMS32 *LoadParams; + char FileName[MAX_PATH]; + char *CommandLine, *t; + BYTE Length; + + LoadParams = (LOADPARMS32*)lpParameterBlock; + if(!lpModuleName || !LoadParams || (((WORD*)LoadParams->lpCmdShow)[0] != 2)) + { + /* windows doesn't check parameters, we do */ + SetLastError(ERROR_INVALID_PARAMETER); + return 0; + } + + if(!SearchPathA(NULL, lpModuleName, ".exe", MAX_PATH, FileName, NULL) && + !SearchPathA(NULL, lpModuleName, NULL, MAX_PATH, FileName, NULL)) + { + return ERROR_FILE_NOT_FOUND; + } + + Length = (BYTE)LoadParams->lpCmdLine[0]; + if(!(CommandLine = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, + strlen(lpModuleName) + Length + 2))) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return 0; + } + + /* Create command line string */ + strcpy(CommandLine, lpModuleName); + t = CommandLine + strlen(CommandLine); + *(t++) = ' '; + memcpy(t, LoadParams->lpCmdLine + 1, Length); + + /* Build StartupInfo */ + RtlZeroMemory(&StartupInfo, sizeof(STARTUPINFOA)); + StartupInfo.cb = sizeof(STARTUPINFOA); + StartupInfo.dwFlags = STARTF_USESHOWWINDOW; + StartupInfo.wShowWindow = ((WORD*)LoadParams->lpCmdShow)[1]; + + if(!CreateProcessA(FileName, CommandLine, NULL, NULL, FALSE, 0, LoadParams->lpEnvAddress, + NULL, &StartupInfo, &ProcessInformation)) + { + DWORD Error; + + HeapFree(GetProcessHeap(), 0, CommandLine); + /* return the right value */ + Error = GetLastError(); + switch(Error) + { + case ERROR_BAD_EXE_FORMAT: + { + return ERROR_BAD_FORMAT; + } + case ERROR_FILE_NOT_FOUND: + case ERROR_PATH_NOT_FOUND: + { + return Error; + } + } + return 0; + } + + HeapFree(GetProcessHeap(), 0, CommandLine); + + /* Wait up to 15 seconds for the process to become idle */ + WaitForInputIdle(ProcessInformation.hProcess, 15000); + + CloseHandle(ProcessInformation.hThread); + CloseHandle(ProcessInformation.hProcess); + + return 33; +} + /* EOF */ diff --git a/reactos/lib/kernel32/misc/stubs.c b/reactos/lib/kernel32/misc/stubs.c index 974b5d46cc5..a6eadb3ef9a 100644 --- a/reactos/lib/kernel32/misc/stubs.c +++ b/reactos/lib/kernel32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.74 2004/05/02 14:47:05 weiden Exp $ +/* $Id: stubs.c,v 1.75 2004/05/03 14:34:44 weiden Exp $ * * KERNEL32.DLL stubs (unimplemented functions) * Remove from this file, if you implement them. @@ -324,20 +324,6 @@ IsDBCSLeadByteEx ( #endif -/* - * @unimplemented - */ -DWORD -STDCALL -LoadModule ( - LPCSTR lpModuleName, - LPVOID lpParameterBlock - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented From 2bde1ad87b0adbce7a06437c0f2d3994eb8c02d8 Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Mon, 3 May 2004 15:29:01 +0000 Subject: [PATCH 1026/1463] removed WINE from list of EXTERNALS, disabled building psx and os2 subsystem from externals for the time being. svn path=/trunk/; revision=9293 --- reactos/Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/Makefile b/reactos/Makefile index 98da587b825..3a58a69a1fb 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.220 2004/05/01 19:05:29 weiden Exp $ +# $Id: Makefile,v 1.221 2004/05/03 15:29:01 sedwards Exp $ # # Global makefile # @@ -101,9 +101,9 @@ SYS_SVC = rpcss eventlog APPS = tests testsets utils -# External (sub)systems for ReactOS -# rosapps wine posix os2 (requires c++) java (non-existant) -EXTERNALS = rosapps wine posix os2 +# External modules and (sub)systems for ReactOS +# rosapps posix os2 (requires c++) java (non-existant) +EXTERNALS = rosapps ifeq ($(ROS_BUILD_EXT),yes) EXT_MODULES = $(EXTERNALS) From 69e19de4073e5e7f8a0026002ef1456996040d59 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 3 May 2004 16:59:59 +0000 Subject: [PATCH 1027/1463] cleanup of the unicode mess (im)ported from wine svn path=/trunk/; revision=9294 --- reactos/lib/kernel32/misc/lang.c | 167 +++++++++++-------------------- 1 file changed, 61 insertions(+), 106 deletions(-) diff --git a/reactos/lib/kernel32/misc/lang.c b/reactos/lib/kernel32/misc/lang.c index 613b4e839de..96bc7af050c 100644 --- a/reactos/lib/kernel32/misc/lang.c +++ b/reactos/lib/kernel32/misc/lang.c @@ -1,4 +1,4 @@ -/* $Id: lang.c,v 1.16 2004/05/02 15:47:34 weiden Exp $ +/* $Id: lang.c,v 1.17 2004/05/03 16:59:59 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT : ReactOS user mode libraries @@ -463,11 +463,11 @@ GetCPInfo ( CodePageInfo->DefaultChar[0] = '?'; for (i = 1; i < MAX_DEFAULTCHAR; i++) { - CodePageInfo->DefaultChar[i] = '\0'; + CodePageInfo->DefaultChar[i] = 0; } for (i = 0; i < MAX_LEADBYTES; i++) { - CodePageInfo->LeadByte[i] = '\0'; + CodePageInfo->LeadByte[i] = 0; } return TRUE; @@ -621,96 +621,57 @@ GetGeoInfoA( const WCHAR *RosGetLocaleValueName( DWORD lctype ) { - static const WCHAR iCalendarTypeW[] = {'i','C','a','l','e','n','d','a','r','T','y','p','e',0}; - static const WCHAR iCountryW[] = {'i','C','o','u','n','t','r','y',0}; - static const WCHAR iCurrDigitsW[] = {'i','C','u','r','r','D','i','g','i','t','s',0}; - static const WCHAR iCurrencyW[] = {'i','C','u','r','r','e','n','c','y',0}; - static const WCHAR iDateW[] = {'i','D','a','t','e',0}; - static const WCHAR iDigitsW[] = {'i','D','i','g','i','t','s',0}; - static const WCHAR iFirstDayOfWeekW[] = {'i','F','i','r','s','t','D','a','y','O','f','W','e','e','k',0}; - static const WCHAR iFirstWeekOfYearW[] = {'i','F','i','r','s','t','W','e','e','k','O','f','Y','e','a','r',0}; - static const WCHAR iLDateW[] = {'i','L','D','a','t','e',0}; - static const WCHAR iLZeroW[] = {'i','L','Z','e','r','o',0}; - static const WCHAR iMeasureW[] = {'i','M','e','a','s','u','r','e',0}; - static const WCHAR iNegCurrW[] = {'i','N','e','g','C','u','r','r',0}; - static const WCHAR iNegNumberW[] = {'i','N','e','g','N','u','m','b','e','r',0}; - static const WCHAR iPaperSizeW[] = {'i','P','a','p','e','r','S','i','z','e',0}; - static const WCHAR iTLZeroW[] = {'i','T','L','Z','e','r','o',0}; - static const WCHAR iTimeW[] = {'i','T','i','m','e',0}; - static const WCHAR s1159W[] = {'s','1','1','5','9',0}; - static const WCHAR s2359W[] = {'s','2','3','5','9',0}; - static const WCHAR sCountryW[] = {'s','C','o','u','n','t','r','y',0}; - static const WCHAR sCurrencyW[] = {'s','C','u','r','r','e','n','c','y',0}; - static const WCHAR sDateW[] = {'s','D','a','t','e',0}; - static const WCHAR sDecimalW[] = {'s','D','e','c','i','m','a','l',0}; - static const WCHAR sGroupingW[] = {'s','G','r','o','u','p','i','n','g',0}; - static const WCHAR sLanguageW[] = {'s','L','a','n','g','u','a','g','e',0}; - static const WCHAR sListW[] = {'s','L','i','s','t',0}; - static const WCHAR sLongDateW[] = {'s','L','o','n','g','D','a','t','e',0}; - static const WCHAR sMonDecimalSepW[] = {'s','M','o','n','D','e','c','i','m','a','l','S','e','p',0}; - static const WCHAR sMonGroupingW[] = {'s','M','o','n','G','r','o','u','p','i','n','g',0}; - static const WCHAR sMonThousandSepW[] = {'s','M','o','n','T','h','o','u','s','a','n','d','S','e','p',0}; - static const WCHAR sNegativeSignW[] = {'s','N','e','g','a','t','i','v','e','S','i','g','n',0}; - static const WCHAR sPositiveSignW[] = {'s','P','o','s','i','t','i','v','e','S','i','g','n',0}; - static const WCHAR sShortDateW[] = {'s','S','h','o','r','t','D','a','t','e',0}; - static const WCHAR sThousandW[] = {'s','T','h','o','u','s','a','n','d',0}; - static const WCHAR sTimeFormatW[] = {'s','T','i','m','e','F','o','r','m','a','t',0}; - static const WCHAR sTimeW[] = {'s','T','i','m','e',0}; - static const WCHAR sYearMonthW[] = {'s','Y','e','a','r','M','o','n','t','h',0}; - switch (lctype & ~LOCALE_LOCALEINFOFLAGSMASK) { /* These values are used by SetLocaleInfo and GetLocaleInfo, and * the values are stored in the registry, confirmed under Windows. */ - case LOCALE_ICALENDARTYPE: return iCalendarTypeW; - case LOCALE_ICURRDIGITS: return iCurrDigitsW; - case LOCALE_ICURRENCY: return iCurrencyW; - case LOCALE_IDIGITS: return iDigitsW; - case LOCALE_IFIRSTDAYOFWEEK: return iFirstDayOfWeekW; - case LOCALE_IFIRSTWEEKOFYEAR: return iFirstWeekOfYearW; - case LOCALE_ILZERO: return iLZeroW; - case LOCALE_IMEASURE: return iMeasureW; - case LOCALE_INEGCURR: return iNegCurrW; - case LOCALE_INEGNUMBER: return iNegNumberW; - case LOCALE_IPAPERSIZE: return iPaperSizeW; - case LOCALE_ITIME: return iTimeW; - case LOCALE_S1159: return s1159W; - case LOCALE_S2359: return s2359W; - case LOCALE_SCURRENCY: return sCurrencyW; - case LOCALE_SDATE: return sDateW; - case LOCALE_SDECIMAL: return sDecimalW; - case LOCALE_SGROUPING: return sGroupingW; - case LOCALE_SLIST: return sListW; - case LOCALE_SLONGDATE: return sLongDateW; - case LOCALE_SMONDECIMALSEP: return sMonDecimalSepW; - case LOCALE_SMONGROUPING: return sMonGroupingW; - case LOCALE_SMONTHOUSANDSEP: return sMonThousandSepW; - case LOCALE_SNEGATIVESIGN: return sNegativeSignW; - case LOCALE_SPOSITIVESIGN: return sPositiveSignW; - case LOCALE_SSHORTDATE: return sShortDateW; - case LOCALE_STHOUSAND: return sThousandW; - case LOCALE_STIME: return sTimeW; - case LOCALE_STIMEFORMAT: return sTimeFormatW; - case LOCALE_SYEARMONTH: return sYearMonthW; + case LOCALE_ICALENDARTYPE: return L"iCalendarType"; + case LOCALE_ICURRDIGITS: return L"iCurrDigits"; + case LOCALE_ICURRENCY: return L"iCurrency"; + case LOCALE_IDIGITS: return L"iDigits"; + case LOCALE_IFIRSTDAYOFWEEK: return L"iFirstDayOfWeek"; + case LOCALE_IFIRSTWEEKOFYEAR: return L"iFirstWeekOfYear"; + case LOCALE_ILZERO: return L"iLZero"; + case LOCALE_IMEASURE: return L"iMeasure"; + case LOCALE_INEGCURR: return L"iNegCurr"; + case LOCALE_INEGNUMBER: return L"iNegNumber"; + case LOCALE_IPAPERSIZE: return L"iPaperSize"; + case LOCALE_ITIME: return L"iTime"; + case LOCALE_S1159: return L"s1159"; + case LOCALE_S2359: return L"s2359"; + case LOCALE_SCURRENCY: return L"sCurrency"; + case LOCALE_SDATE: return L"sDate"; + case LOCALE_SDECIMAL: return L"sDecimal"; + case LOCALE_SGROUPING: return L"sGrouping"; + case LOCALE_SLIST: return L"sList"; + case LOCALE_SLONGDATE: return L"sLongDate"; + case LOCALE_SMONDECIMALSEP: return L"sMonDecimalSep"; + case LOCALE_SMONGROUPING: return L"sMonGrouping"; + case LOCALE_SMONTHOUSANDSEP: return L"sMonThousandSep"; + case LOCALE_SNEGATIVESIGN: return L"sNegativeSign"; + case LOCALE_SPOSITIVESIGN: return L"sPositiveSign"; + case LOCALE_SSHORTDATE: return L"sShortDate"; + case LOCALE_STHOUSAND: return L"sThousand"; + case LOCALE_STIME: return L"sTime"; + case LOCALE_STIMEFORMAT: return L"sTimeFormat"; + case LOCALE_SYEARMONTH: return L"sYearMonth"; /* The following are not listed under MSDN as supported, * but seem to be used and also stored in the registry. */ - case LOCALE_ICOUNTRY: return iCountryW; - case LOCALE_IDATE: return iDateW; - case LOCALE_ILDATE: return iLDateW; - case LOCALE_ITLZERO: return iTLZeroW; - case LOCALE_SCOUNTRY: return sCountryW; - case LOCALE_SLANGUAGE: return sLanguageW; + case LOCALE_ICOUNTRY: return L"iCountry"; + case LOCALE_IDATE: return L"iDate"; + case LOCALE_ILDATE: return L"iLDate"; + case LOCALE_ITLZERO: return L"iTLZero"; + case LOCALE_SCOUNTRY: return L"sCountry"; + case LOCALE_SLANGUAGE: return L"sLanguage"; } return NULL; } HKEY RosCreateRegistryKey(void) { - static const WCHAR intlW[] = {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\', - 'I','n','t','e','r','n','a','t','i','o','n','a','l',0}; OBJECT_ATTRIBUTES objAttr; UNICODE_STRING nameW; HKEY hKey; @@ -723,7 +684,7 @@ HKEY RosCreateRegistryKey(void) objAttr.Attributes = 0; objAttr.SecurityDescriptor = NULL; objAttr.SecurityQualityOfService = NULL; - RtlInitUnicodeString( &nameW, intlW ); + RtlInitUnicodeString( &nameW, L"Control Panel\\International"); if (NtCreateKey( &hKey, KEY_ALL_ACCESS, &objAttr, 0, NULL, 0, NULL ) != STATUS_SUCCESS) hKey = 0; NtClose( objAttr.RootDirectory ); @@ -834,7 +795,7 @@ GetLocaleInfoW ( if (SUBLANGID(liLangID) == SUBLANG_NEUTRAL) liLangID = MAKELANGID(PRIMARYLANGID(liLangID), SUBLANG_DEFAULT); - hModule = GetModuleHandleA( "kernel32.dll" ); + hModule = GetModuleHandleW( L"kernel32.dll" ); if (!(hRsrc = FindResourceExW( hModule, RT_STRINGW, (LPCWSTR)((LCType >> 4) + 1), liLangID ))) { SetLastError( ERROR_INVALID_FLAGS ); @@ -866,7 +827,7 @@ GetLocaleInfoW ( return 0; memcpy( chTmp, ch + 1, *ch * sizeof(WCHAR) ); - chTmp[*ch] = 0; + chTmp[*ch] = L'\0'; uiNum = wcstol( chTmp, &chEnd, 10 ); if (!*chEnd) @@ -1086,16 +1047,16 @@ INT RosGetTimeFormat(LCID Locale, DWORD dwFlags, CONST SYSTEMTIME *lpTime, LPCWS while( *lpFormat ) { - if (*lpFormat == (WCHAR) '\'') + if (*lpFormat == L'\'') { lpFormat++; while(*lpFormat) { - if (*lpFormat == (WCHAR) '\'') + if (*lpFormat == L'\'') { lpFormat++; - if(*lpFormat != (WCHAR) '\'') + if(*lpFormat != L'\'') break; } if (!cchTime) @@ -1116,12 +1077,11 @@ INT RosGetTimeFormat(LCID Locale, DWORD dwFlags, CONST SYSTEMTIME *lpTime, LPCWS *lpFormat++; } } - else if(*lpFormat=='H' || *lpFormat=='h' || *lpFormat=='m' || *lpFormat=='s' || *lpFormat=='t' ) + else if(*lpFormat==L'H' || *lpFormat==L'h' || *lpFormat==L'm' || *lpFormat==L's' || *lpFormat==L't' ) { int nCount, nBufLen; - int nType = *lpFormat; + WCHAR nType = *lpFormat; WCHAR Buffer[40]; - char ch[16]; bDrop = FALSE; @@ -1132,50 +1092,43 @@ INT RosGetTimeFormat(LCID Locale, DWORD dwFlags, CONST SYSTEMTIME *lpTime, LPCWS switch(nType) { - case 'h': + case L'h': { if(!(dwFlags & TIME_FORCE24HOURFORMAT)) { - sprintf( ch, "%.*d", nCount > 2 ? 2 : nCount, + swprintf( Buffer, L"%.*d", nCount > 2 ? 2 : nCount, lpTime->wHour == 0 ? 12 : (lpTime->wHour - 1) % 12 + 1); - - MultiByteToWideChar( CP_ACP, 0, ch, -1, Buffer, sizeof(Buffer) / sizeof(WCHAR) ); - break; } } - case 'H': + case L'H': { - sprintf( ch, "%.*d", nCount > 2 ? 2 : nCount, lpTime->wHour ); - MultiByteToWideChar( CP_ACP, 0, ch, -1, Buffer, sizeof(Buffer)/sizeof(WCHAR) ); - + swprintf( Buffer, L"%.*d", nCount > 2 ? 2 : nCount, lpTime->wHour ); break; } - case 'm': + case L'm': { if(!(dwFlags & TIME_NOMINUTESORSECONDS)) { - sprintf( ch, "%.*d", nCount > 2 ? 2 : nCount, lpTime->wMinute ); - MultiByteToWideChar( CP_ACP, 0, ch, -1, Buffer, sizeof(Buffer) / sizeof(WCHAR) ); + swprintf( Buffer, L"%.*d", nCount > 2 ? 2 : nCount, lpTime->wMinute ); } else nPos = nLastFormatPos; break; } - case 's': + case L's': { if(!(dwFlags & (TIME_NOSECONDS|TIME_NOMINUTESORSECONDS))) { - sprintf( ch, "%.*d", nCount > 2 ? 2 : nCount, lpTime->wSecond ); - MultiByteToWideChar( CP_ACP, 0, ch, -1, Buffer, sizeof(Buffer) / sizeof(WCHAR) ); + swprintf( Buffer, L"%.*d", nCount > 2 ? 2 : nCount, lpTime->wSecond ); } else nPos = nLastFormatPos; break; } - case 't': + case L't': { if(!(dwFlags & TIME_NOTIMEMARKER)) { @@ -1239,7 +1192,7 @@ INT RosGetTimeFormat(LCID Locale, DWORD dwFlags, CONST SYSTEMTIME *lpTime, LPCWS return 0; } else - lpTimeStr[nPos] = '\0'; + lpTimeStr[nPos] = L'\0'; } nPos++; @@ -1293,8 +1246,10 @@ GetTimeFormatW ( SetLastError(ERROR_INVALID_PARAMETER); return 0; } - - return RosGetTimeFormat(Locale, dwFlags, lpTime, lpFormat, lpTimeStr, cchTime); + INT x; + x = RosGetTimeFormat(Locale, dwFlags, lpTime, lpFormat, lpTimeStr, cchTime); + DbgPrint("lpTimeStr: %ws ; format: %ws\n", lpTimeStr, lpFormat); + return x; } From 99282d8160648084649feefe7fbbbbf54d5867a3 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 3 May 2004 17:12:27 +0000 Subject: [PATCH 1028/1463] forgot to remove some temporary debug output svn path=/trunk/; revision=9295 --- reactos/lib/kernel32/misc/lang.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/reactos/lib/kernel32/misc/lang.c b/reactos/lib/kernel32/misc/lang.c index 96bc7af050c..56f82c64a7b 100644 --- a/reactos/lib/kernel32/misc/lang.c +++ b/reactos/lib/kernel32/misc/lang.c @@ -1,4 +1,4 @@ -/* $Id: lang.c,v 1.17 2004/05/03 16:59:59 weiden Exp $ +/* $Id: lang.c,v 1.18 2004/05/03 17:12:27 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT : ReactOS user mode libraries @@ -1246,10 +1246,7 @@ GetTimeFormatW ( SetLastError(ERROR_INVALID_PARAMETER); return 0; } - INT x; - x = RosGetTimeFormat(Locale, dwFlags, lpTime, lpFormat, lpTimeStr, cchTime); - DbgPrint("lpTimeStr: %ws ; format: %ws\n", lpTimeStr, lpFormat); - return x; + return RosGetTimeFormat(Locale, dwFlags, lpTime, lpFormat, lpTimeStr, cchTime); } From 73812409b45ba2afb4d1e3f93f08030b1c5a1a37 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Mon, 3 May 2004 17:15:14 +0000 Subject: [PATCH 1029/1463] =?UTF-8?q?-=20Implementation=20of=20IOCTL=5FVID?= =?UTF-8?q?EO=5FQUERY=5FCURRENT=5FMODE.=20Based=20on=20patch=20by=20Herv?= =?UTF-8?q?=EF=BF=BD=20Poussineau.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit svn path=/trunk/; revision=9296 --- reactos/drivers/video/miniport/vbe/vbemp.c | 148 ++++++++++++++------- reactos/drivers/video/miniport/vbe/vbemp.h | 6 + 2 files changed, 105 insertions(+), 49 deletions(-) diff --git a/reactos/drivers/video/miniport/vbe/vbemp.c b/reactos/drivers/video/miniport/vbe/vbemp.c index 1d40c57643d..44ab1191fc6 100644 --- a/reactos/drivers/video/miniport/vbe/vbemp.c +++ b/reactos/drivers/video/miniport/vbe/vbemp.c @@ -442,7 +442,8 @@ VBEStartIO( break; case IOCTL_VIDEO_UNMAP_VIDEO_MEMORY: - Result = VBEUnmapVideoMemory((PVBE_DEVICE_EXTENSION)HwDeviceExtension, + Result = VBEUnmapVideoMemory( + (PVBE_DEVICE_EXTENSION)HwDeviceExtension, RequestPacket->StatusBlock); break; @@ -482,6 +483,17 @@ VBEStartIO( break; case IOCTL_VIDEO_QUERY_CURRENT_MODE: + if (RequestPacket->OutputBufferLength < sizeof(VIDEO_MODE_INFORMATION)) + { + RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER; + return TRUE; + } + Result = VBEQueryCurrentMode( + (PVBE_DEVICE_EXTENSION)HwDeviceExtension, + (PVIDEO_MODE_INFORMATION)RequestPacket->OutputBuffer, + RequestPacket->StatusBlock); + break; + default: RequestPacket->StatusBlock->Status = STATUS_NOT_IMPLEMENTED; return FALSE; @@ -651,6 +663,69 @@ VBEQueryNumAvailModes( return TRUE; } +/* + * VBEQueryMode + * + * Returns information about one particular video mode. + */ + +VOID FASTCALL +VBEQueryMode( + PVBE_DEVICE_EXTENSION DeviceExtension, + PVIDEO_MODE_INFORMATION VideoMode, + ULONG VideoModeId) +{ + PVBE_MODEINFO VBEMode = &DeviceExtension->ModeInfo[VideoModeId]; + + VideoMode->Length = sizeof(VIDEO_MODE_INFORMATION); + VideoMode->ModeIndex = VideoModeId; + VideoMode->VisScreenWidth = VBEMode->XResolution; + VideoMode->VisScreenHeight = VBEMode->YResolution; + VideoMode->ScreenStride = VBEMode->BytesPerScanLine; + VideoMode->NumberOfPlanes = VBEMode->NumberOfPlanes; + VideoMode->BitsPerPlane = VBEMode->BitsPerPixel / VBEMode->NumberOfPlanes; + VideoMode->Frequency = 0; /* FIXME */ + VideoMode->XMillimeter = 0; /* FIXME */ + VideoMode->YMillimeter = 0; /* FIXME */ + if (VBEMode->BitsPerPixel > 8) + { + if (DeviceExtension->VBEVersion < 0x300) + { + VideoMode->NumberRedBits = VBEMode->RedMaskSize; + VideoMode->NumberGreenBits = VBEMode->GreenMaskSize; + VideoMode->NumberBlueBits = VBEMode->BlueMaskSize; + VideoMode->RedMask = ((1 << VBEMode->RedMaskSize) - 1) << VBEMode->RedFieldPosition; + VideoMode->GreenMask = ((1 << VBEMode->GreenMaskSize) - 1) << VBEMode->GreenFieldPosition; + VideoMode->BlueMask = ((1 << VBEMode->BlueMaskSize) - 1) << VBEMode->BlueFieldPosition; + } + else + { + VideoMode->NumberRedBits = VBEMode->LinRedMaskSize; + VideoMode->NumberGreenBits = VBEMode->LinGreenMaskSize; + VideoMode->NumberBlueBits = VBEMode->LinBlueMaskSize; + VideoMode->RedMask = ((1 << VBEMode->LinRedMaskSize) - 1) << VBEMode->LinRedFieldPosition; + VideoMode->GreenMask = ((1 << VBEMode->LinGreenMaskSize) - 1) << VBEMode->LinGreenFieldPosition; + VideoMode->BlueMask = ((1 << VBEMode->LinBlueMaskSize) - 1) << VBEMode->LinBlueFieldPosition; + } + } + else + { + VideoMode->NumberRedBits = + VideoMode->NumberGreenBits = + VideoMode->NumberBlueBits = 6; + VideoMode->RedMask = + VideoMode->GreenMask = + VideoMode->BlueMask = 0; + } + VideoMode->VideoMemoryBitmapWidth = VBEMode->XResolution; + VideoMode->VideoMemoryBitmapHeight = VBEMode->YResolution; + VideoMode->AttributeFlags = VIDEO_MODE_GRAPHICS | VIDEO_MODE_COLOR | + VIDEO_MODE_NO_OFF_SCREEN; + if (VideoMode->BitsPerPlane <= 8) + VideoMode->AttributeFlags |= VIDEO_MODE_PALETTE_DRIVEN; + VideoMode->DriverSpecificAttributeFlags = 0; +} + /* * VBEQueryAvailModes * @@ -672,54 +747,7 @@ VBEQueryAvailModes( CurrentModeId < DeviceExtension->ModeCount; CurrentModeId++, CurrentMode++, CurrentVBEMode++) { - CurrentMode->Length = sizeof(VIDEO_MODE_INFORMATION); - CurrentMode->ModeIndex = CurrentModeId; - CurrentMode->VisScreenWidth = CurrentVBEMode->XResolution; - CurrentMode->VisScreenHeight = CurrentVBEMode->YResolution; - CurrentMode->ScreenStride = CurrentVBEMode->BytesPerScanLine; - CurrentMode->NumberOfPlanes = CurrentVBEMode->NumberOfPlanes; - CurrentMode->BitsPerPlane = CurrentVBEMode->BitsPerPixel / - CurrentVBEMode->NumberOfPlanes; - CurrentMode->Frequency = 0; /* FIXME */ - CurrentMode->XMillimeter = 0; /* FIXME */ - CurrentMode->YMillimeter = 0; /* FIXME */ - if (CurrentVBEMode->BitsPerPixel > 8) - { - if (DeviceExtension->VBEVersion < 0x300) - { - CurrentMode->NumberRedBits = CurrentVBEMode->RedMaskSize; - CurrentMode->NumberGreenBits = CurrentVBEMode->GreenMaskSize; - CurrentMode->NumberBlueBits = CurrentVBEMode->BlueMaskSize; - CurrentMode->RedMask = ((1 << CurrentVBEMode->RedMaskSize) - 1) << CurrentVBEMode->RedFieldPosition; - CurrentMode->GreenMask = ((1 << CurrentVBEMode->GreenMaskSize) - 1) << CurrentVBEMode->GreenFieldPosition; - CurrentMode->BlueMask = ((1 << CurrentVBEMode->BlueMaskSize) - 1) << CurrentVBEMode->BlueFieldPosition; - } - else - { - CurrentMode->NumberRedBits = CurrentVBEMode->LinRedMaskSize; - CurrentMode->NumberGreenBits = CurrentVBEMode->LinGreenMaskSize; - CurrentMode->NumberBlueBits = CurrentVBEMode->LinBlueMaskSize; - CurrentMode->RedMask = ((1 << CurrentVBEMode->LinRedMaskSize) - 1) << CurrentVBEMode->LinRedFieldPosition; - CurrentMode->GreenMask = ((1 << CurrentVBEMode->LinGreenMaskSize) - 1) << CurrentVBEMode->LinGreenFieldPosition; - CurrentMode->BlueMask = ((1 << CurrentVBEMode->LinBlueMaskSize) - 1) << CurrentVBEMode->LinBlueFieldPosition; - } - } - else - { - CurrentMode->NumberRedBits = - CurrentMode->NumberGreenBits = - CurrentMode->NumberBlueBits = 6; - CurrentMode->RedMask = - CurrentMode->GreenMask = - CurrentMode->BlueMask = 0; - } - CurrentMode->VideoMemoryBitmapWidth = CurrentVBEMode->XResolution; - CurrentMode->VideoMemoryBitmapHeight = CurrentVBEMode->YResolution; - CurrentMode->AttributeFlags = VIDEO_MODE_GRAPHICS | VIDEO_MODE_COLOR | - VIDEO_MODE_NO_OFF_SCREEN; - if (CurrentMode->BitsPerPlane <= 8) - CurrentMode->AttributeFlags |= VIDEO_MODE_PALETTE_DRIVEN; - CurrentMode->DriverSpecificAttributeFlags = 0; + VBEQueryMode(DeviceExtension, CurrentMode, CurrentModeId); } StatusBlock->Information = @@ -728,6 +756,28 @@ VBEQueryAvailModes( return TRUE; } +/* + * VBEQueryCurrentMode + * + * Returns information about current video mode. + */ + +BOOL FASTCALL +VBEQueryCurrentMode( + PVBE_DEVICE_EXTENSION DeviceExtension, + PVIDEO_MODE_INFORMATION VideoModeInfo, + PSTATUS_BLOCK StatusBlock) +{ + StatusBlock->Information = sizeof(VIDEO_MODE_INFORMATION); + + VBEQueryMode( + DeviceExtension, + VideoModeInfo, + DeviceExtension->CurrentMode); + + return TRUE; +} + /* * VBESetColorRegisters * diff --git a/reactos/drivers/video/miniport/vbe/vbemp.h b/reactos/drivers/video/miniport/vbe/vbemp.h index 36842a7e291..6753733cb9a 100644 --- a/reactos/drivers/video/miniport/vbe/vbemp.h +++ b/reactos/drivers/video/miniport/vbe/vbemp.h @@ -215,6 +215,12 @@ VBEQueryAvailModes( PVIDEO_MODE_INFORMATION ReturnedModes, PSTATUS_BLOCK StatusBlock); +BOOL FASTCALL +VBEQueryCurrentMode( + PVBE_DEVICE_EXTENSION DeviceExtension, + PVIDEO_MODE_INFORMATION VideoModeInfo, + PSTATUS_BLOCK StatusBlock); + BOOL FASTCALL VBESetColorRegisters( PVBE_DEVICE_EXTENSION DeviceExtension, From a02cf9bbfbe93c7ebd35f385442c9cbe1623d838 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Mon, 3 May 2004 22:16:09 +0000 Subject: [PATCH 1030/1463] Implement GetMenuItemInfoA/W svn path=/trunk/; revision=9297 --- reactos/lib/user32/windows/menu.c | 60 +++++++++++++++++++++++-------- 1 file changed, 45 insertions(+), 15 deletions(-) diff --git a/reactos/lib/user32/windows/menu.c b/reactos/lib/user32/windows/menu.c index ba427631cfd..4e4a4e73cdf 100644 --- a/reactos/lib/user32/windows/menu.c +++ b/reactos/lib/user32/windows/menu.c @@ -21,7 +21,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: menu.c,v 1.64 2004/04/15 23:36:02 weiden Exp $ +/* $Id: menu.c,v 1.65 2004/05/03 22:16:09 gvg Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/menu.c @@ -3726,33 +3726,63 @@ GetMenuItemID(HMENU hMenu, /* - * @unimplemented + * @implemented */ BOOL STDCALL GetMenuItemInfoA( - HMENU hMenu, - UINT uItem, - BOOL fByPosition, - LPMENUITEMINFOA lpmii) + HMENU Menu, + UINT Item, + BOOL ByPosition, + LPMENUITEMINFOA mii) { - UNIMPLEMENTED; - return FALSE; + LPSTR AString; + UINT ACch; + + if (0 == (mii->fMask & (MIIM_STRING | MIIM_TYPE))) + { + /* No text requested, just pass on */ + return NtUserMenuItemInfo(Menu, Item, ByPosition, (PROSMENUITEMINFO) mii, FALSE); + } + + AString = mii->dwTypeData; + ACch = mii->cch; + mii->dwTypeData = HeapAlloc(GetProcessHeap(), 0, mii->cch * sizeof(WCHAR)); + if (NULL == mii->dwTypeData) + { + mii->dwTypeData = AString; + return FALSE; + } + if (! NtUserMenuItemInfo(Menu, Item, ByPosition, (PROSMENUITEMINFO) mii, FALSE)) + { + HeapFree(GetProcessHeap(), 0, mii->dwTypeData); + mii->dwTypeData = AString; + return FALSE; + } + + if (IS_STRING_ITEM(mii->fType)) + { + WideCharToMultiByte(CP_ACP, 0, (LPWSTR) mii->dwTypeData, mii->cch, AString, ACch, + NULL, NULL); + } + HeapFree(GetProcessHeap(), 0, mii->dwTypeData); + mii->dwTypeData = AString; + + return TRUE; } /* - * @unimplemented + * @implemented */ BOOL STDCALL GetMenuItemInfoW( - HMENU hMenu, - UINT uItem, - BOOL fByPosition, - LPMENUITEMINFOW lpmii) + HMENU Menu, + UINT Item, + BOOL ByPosition, + LPMENUITEMINFOW mii) { - UNIMPLEMENTED; - return FALSE; + return NtUserMenuItemInfo(Menu, Item, ByPosition, (PROSMENUITEMINFO) mii, FALSE); } From 57aa128d43c58cd7597bab007b9121bb5e817cf5 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Tue, 4 May 2004 13:11:22 +0000 Subject: [PATCH 1031/1463] Implement DeleteItemW(). svn path=/trunk/; revision=9298 --- reactos/lib/userenv/desktop.c | 70 ++++++++++++++++++++++++++++++-- reactos/lib/userenv/userenv.def | 2 + reactos/lib/userenv/userenv.edf | 2 + reactos/w32api/include/userenv.h | 4 ++ 4 files changed, 75 insertions(+), 3 deletions(-) diff --git a/reactos/lib/userenv/desktop.c b/reactos/lib/userenv/desktop.c index e6b260d11ac..f842e2a504a 100644 --- a/reactos/lib/userenv/desktop.c +++ b/reactos/lib/userenv/desktop.c @@ -1,4 +1,4 @@ -/* $Id: desktop.c,v 1.3 2004/05/03 12:05:44 ekohl Exp $ +/* $Id: desktop.c,v 1.4 2004/05/04 13:11:22 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -141,7 +141,7 @@ AddDesktopItemA (BOOL bCommonItem, BOOL WINAPI -AddDesktopItemW (BOOL bCommonItem, +AddDesktopItemW (BOOL bCommonDesktop, LPCWSTR lpItemName, LPCWSTR lpArguments, LPCWSTR lpIconLocation, @@ -164,7 +164,7 @@ AddDesktopItemW (BOOL bCommonItem, bResult = FALSE; - if (!GetDesktopPath (bCommonItem, szLinkPath)) + if (!GetDesktopPath (bCommonDesktop, szLinkPath)) { DPRINT1 ("GetDesktopPath() failed\n"); return FALSE; @@ -383,4 +383,68 @@ DeleteGroupW (LPCWSTR lpGroupName, return TRUE; } + +BOOL WINAPI +DeleteItemA (LPCSTR lpGroupName, + BOOL bCommonGroup, + LPCSTR lpItemName, + BOOL bDeleteGroup) +{ + DPRINT1 ("DeleteItemA() not implemented!\n"); + return FALSE; +} + + +BOOL WINAPI +DeleteItemW (LPCWSTR lpGroupName, + BOOL bCommonGroup, + LPCWSTR lpItemName, + BOOL bDeleteGroup) +{ + WCHAR szItemPath[MAX_PATH]; + LPWSTR Ptr; + + DPRINT ("DeleteItemW() called\n"); + + if (!GetProgramsPath (bCommonGroup, szItemPath)) + { + DPRINT1 ("GetProgramsPath() failed\n"); + return FALSE; + } + DPRINT ("Programs path: '%S'\n", szItemPath); + + if (lpGroupName != NULL && *lpGroupName != 0) + { + wcscat (szItemPath, L"\\"); + wcscat (szItemPath, lpGroupName); + } + + wcscat (szItemPath, L"\\"); + wcscat (szItemPath, lpItemName); + wcscat (szItemPath, L".lnk"); + DPRINT ("Item path: '%S'\n", szItemPath); + + if (!DeleteFileW (szItemPath)) + return FALSE; + + /* FIXME: Notify the shell */ + + if (bDeleteGroup) + { + Ptr = wcsrchr (szItemPath, L'\\'); + if (Ptr == NULL) + return TRUE; + + *Ptr = 0; + if (RemoveDirectoryW (szItemPath)) + { + /* FIXME: Notify the shell */ + } + } + + DPRINT ("DeleteItemW() done\n"); + + return TRUE; +} + /* EOF */ diff --git a/reactos/lib/userenv/userenv.def b/reactos/lib/userenv/userenv.def index 0ae996935c2..9e76dec868f 100644 --- a/reactos/lib/userenv/userenv.def +++ b/reactos/lib/userenv/userenv.def @@ -5,6 +5,8 @@ CreateGroupA@8 @101 NONAME CreateGroupW@8 @102 NONAME DeleteGroupA@8 @103 NONAME DeleteGroupW@8 @104 NONAME +DeleteItemA@16 @107 NONAME +DeleteItemW@16 @108 NONAME CreateUserProfileA@8 @109 NONAME CreateUserProfileW@8 @110 NONAME AddDesktopItemA@32 @113 NONAME diff --git a/reactos/lib/userenv/userenv.edf b/reactos/lib/userenv/userenv.edf index d812d7a8633..05b97575bcb 100644 --- a/reactos/lib/userenv/userenv.edf +++ b/reactos/lib/userenv/userenv.edf @@ -5,6 +5,8 @@ CreateGroupA=CreateGroupA@8 @101 NONAME CreateGroupW=CreateGroupW@8 @102 NONAME DeleteGroupA=DeleteGroupA@8 @103 NONAME DeleteGroupW=DeleteGroupW@8 @104 NONAME +DeleteItemA=DeleteItemA@16 @107 NONAME +DeleteItemW=DeleteItemW@16 @108 NONAME CreateUserProfileA=CreateUserProfileA@8 @109 NONAME CreateUserProfileW=CreateUserProfileW@8 @110 NONAME AddDesktopItemA=AddDesktopItemA@32 @113 NONAME diff --git a/reactos/w32api/include/userenv.h b/reactos/w32api/include/userenv.h index 7de9a8bcd36..bd836e92d30 100644 --- a/reactos/w32api/include/userenv.h +++ b/reactos/w32api/include/userenv.h @@ -48,6 +48,8 @@ BOOL WINAPI CreateGroupA (LPCSTR, BOOL); BOOL WINAPI CreateGroupW (LPCWSTR, BOOL); BOOL WINAPI DeleteGroupA (LPCSTR, BOOL); BOOL WINAPI DeleteGroupW (LPCWSTR, BOOL); +BOOL WINAPI DeleteItemA (LPCSTR, BOOL, LPCSTR, BOOL); +BOOL WINAPI DeleteItemW (LPCWSTR, BOOL, LPCWSTR, BOOL); /* end private */ BOOL WINAPI LoadUserProfileA (HANDLE, LPPROFILEINFOA); BOOL WINAPI LoadUserProfileW (HANDLE, LPPROFILEINFOW); @@ -74,6 +76,7 @@ typedef LPPROFILEINFOW LPPROFILEINFO; #define DeleteDesktopItem DeleteDesktopItemW #define CreateGroup CreateGroupW #define DeleteGroup DeleteGroupW +#define DeleteItem DeleteItemW /* end private */ #define LoadUserProfile LoadUserProfileW #define GetAllUsersProfileDirectory GetAllUsersProfileDirectoryW @@ -89,6 +92,7 @@ typedef LPPROFILEINFOA LPPROFILEINFO; #define DeleteDesktopItem DeleteDesktopItemA #define CreateGroup CreateGroupA #define DeleteGroup DeleteGroupA +#define DeleteItem DeleteItemA /* end private */ #define LoadUserProfile LoadUserProfileA #define GetAllUsersProfileDirectory GetAllUsersProfileDirectoryA From c789493a5920a1b5ca7511441c706d39c3d46114 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Tue, 4 May 2004 17:25:19 +0000 Subject: [PATCH 1032/1463] - Updated kernel32 test to Wine-20040504. svn path=/trunk/; revision=9299 --- reactos/apps/tests/kernel32/Makefile | 4 +- reactos/apps/tests/kernel32/console.c | 41 +- reactos/apps/tests/kernel32/directory.c | 97 ++-- reactos/apps/tests/kernel32/file.c | 311 +++++++++--- reactos/apps/tests/kernel32/format_msg.c | 2 +- reactos/apps/tests/kernel32/generated.c | 610 +++++++++++++++-------- reactos/apps/tests/kernel32/locale.c | 18 +- reactos/apps/tests/kernel32/mailslot.c | 4 +- reactos/apps/tests/kernel32/path.c | 42 +- reactos/apps/tests/kernel32/pipe.c | 224 +++++++-- 10 files changed, 914 insertions(+), 439 deletions(-) diff --git a/reactos/apps/tests/kernel32/Makefile b/reactos/apps/tests/kernel32/Makefile index 44f6f6e75de..37b0c465549 100644 --- a/reactos/apps/tests/kernel32/Makefile +++ b/reactos/apps/tests/kernel32/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.1 2004/02/14 20:11:42 sedwards Exp $ +# $Id: Makefile,v 1.2 2004/05/04 17:25:18 navaraf Exp $ PATH_TO_TOP = ../../.. @@ -9,7 +9,7 @@ TARGET_TYPE = program TARGET_APPTYPE = console # require os code to explicitly request A/W version of structs/functions -TARGET_CFLAGS += -D_DISABLE_TIDENTS -D__USE_W32API +TARGET_CFLAGS += -D_DISABLE_TIDENTS -D__USE_W32API -DWINVER=0x0500 TARGET_NAME = kernel32_test diff --git a/reactos/apps/tests/kernel32/console.c b/reactos/apps/tests/kernel32/console.c index 48ab3c110e0..67e7e428618 100644 --- a/reactos/apps/tests/kernel32/console.c +++ b/reactos/apps/tests/kernel32/console.c @@ -137,8 +137,9 @@ static void testWriteNotWrappedNotProcessed(HANDLE hCon, COORD sbSize) { COORD c; DWORD len, mode; - const char* mytest = "abcd\nf\tg"; - const int mylen = strlen(mytest); + char* mytest; + int mylen; + int ret; int p; ok(GetConsoleMode(hCon, &mode) && SetConsoleMode(hCon, mode & ~(ENABLE_PROCESSED_OUTPUT|ENABLE_WRAP_AT_EOL_OUTPUT)), @@ -148,7 +149,12 @@ static void testWriteNotWrappedNotProcessed(HANDLE hCon, COORD sbSize) c.X = sbSize.X - 3; c.Y = 0; ok(SetConsoleCursorPosition(hCon, c) != 0, "Cursor in upper-left-3\n"); - ok(WriteConsole(hCon, mytest, mylen, &len, NULL) != 0 && len == mylen, "WriteConsole\n"); + mytest = "123"; + + mylen = strlen(mytest); + + ret = WriteConsole(hCon, mytest, mylen, &len, NULL); + ok(ret != 0 && len == mylen, "Couldn't write, ret = %d, len = %ld\n", ret, len); c.Y = 0; for (p = mylen - 3; p < mylen; p++) { @@ -161,26 +167,12 @@ static void testWriteNotWrappedNotProcessed(HANDLE hCon, COORD sbSize) p = sbSize.X - 3 + mylen % 3; c.X = p; c.Y = 0; - okCURSOR(hCon, c); /* write line, wrapping disabled, strings end on end of line */ c.X = sbSize.X - mylen; c.Y = 0; ok(SetConsoleCursorPosition(hCon, c) != 0, "Cursor in upper-left-3\n"); ok(WriteConsole(hCon, mytest, mylen, &len, NULL) != 0 && len == mylen, "WriteConsole\n"); - c.Y = 0; - for (p = 0; p < mylen; p++) - { - c.X = sbSize.X - mylen + p; - okCHAR(hCon, c, mytest[p], TEST_ATTRIB); - } - - c.X = 0; c.Y = 1; - okCHAR(hCon, c, ' ', DEFAULT_ATTRIB); - - p = sbSize.X - mylen; - c.X = p; c.Y = 0; - okCURSOR(hCon, c); } static void testWriteNotWrappedProcessed(HANDLE hCon, COORD sbSize) @@ -290,24 +282,9 @@ static void testWriteWrappedNotProcessed(HANDLE hCon, COORD sbSize) c.X = sbSize.X - 3; c.Y = 0; ok(SetConsoleCursorPosition(hCon, c) != 0, "Cursor in upper-left-3\n"); - ok(WriteConsole(hCon, mytest, mylen, &len, NULL) != 0 && len == mylen, "WriteConsole\n"); - c.Y = 0; - for (p = 0; p < 3; p++) - { - c.X = sbSize.X - 3 + p; - okCHAR(hCon, c, mytest[p], TEST_ATTRIB); - } - c.Y = 1; - for (p = 0; p < mylen - 3; p++) - { - c.X = p; - okCHAR(hCon, c, mytest[p + 3], TEST_ATTRIB); - } c.X = mylen - 3; okCHAR(hCon, c, ' ', DEFAULT_ATTRIB); - - okCURSOR(hCon, c); } static void testWriteWrappedProcessed(HANDLE hCon, COORD sbSize) diff --git a/reactos/apps/tests/kernel32/directory.c b/reactos/apps/tests/kernel32/directory.c index a5b81eb938b..5374ce05796 100644 --- a/reactos/apps/tests/kernel32/directory.c +++ b/reactos/apps/tests/kernel32/directory.c @@ -193,21 +193,19 @@ static void test_CreateDirectoryA(void) ret = RemoveDirectoryA(tmpdir); ok(ret == TRUE, "RemoveDirectoryA should always succeed\n"); - todo_wine { - lstrcatA(tmpdir, "?"); - ret = CreateDirectoryA(tmpdir, NULL); - ok(ret == FALSE && GetLastError() == ERROR_INVALID_NAME, - "CreateDirectoryA with ? wildcard name should fail, ret=%s error=%ld\n", - ret ? " True" : "False", GetLastError()); - ret = RemoveDirectoryA(tmpdir); + lstrcatA(tmpdir, "?"); + ret = CreateDirectoryA(tmpdir, NULL); + ok(ret == FALSE && GetLastError() == ERROR_INVALID_NAME, + "CreateDirectoryA with ? wildcard name should fail, ret=%s error=%ld\n", + ret ? " True" : "False", GetLastError()); + ret = RemoveDirectoryA(tmpdir); - tmpdir[lstrlenA(tmpdir) - 1] = '*'; - ret = CreateDirectoryA(tmpdir, NULL); - ok(ret == FALSE && GetLastError() == ERROR_INVALID_NAME, - "CreateDirectoryA with * wildcard name should fail, ret=%s error=%ld\n", - ret ? " True" : "False", GetLastError()); - ret = RemoveDirectoryA(tmpdir); - } + tmpdir[lstrlenA(tmpdir) - 1] = '*'; + ret = CreateDirectoryA(tmpdir, NULL); + ok(ret == FALSE && GetLastError() == ERROR_INVALID_NAME, + "CreateDirectoryA with * wildcard name should fail, ret=%s error=%ld\n", + ret ? " True" : "False", GetLastError()); + ret = RemoveDirectoryA(tmpdir); } static void test_CreateDirectoryW(void) @@ -256,21 +254,19 @@ static void test_CreateDirectoryW(void) ret = RemoveDirectoryW(tmpdir); ok(ret == TRUE, "RemoveDirectoryW should always succeed\n"); - todo_wine { - lstrcatW(tmpdir, questionW); - ret = CreateDirectoryW(tmpdir, NULL); - ok(ret == FALSE && GetLastError() == ERROR_INVALID_NAME, - "CreateDirectoryW with ? wildcard name should fail with error 183, ret=%s error=%ld\n", - ret ? " True" : "False", GetLastError()); - ret = RemoveDirectoryW(tmpdir); + lstrcatW(tmpdir, questionW); + ret = CreateDirectoryW(tmpdir, NULL); + ok(ret == FALSE && GetLastError() == ERROR_INVALID_NAME, + "CreateDirectoryW with ? wildcard name should fail with error 183, ret=%s error=%ld\n", + ret ? " True" : "False", GetLastError()); + ret = RemoveDirectoryW(tmpdir); - tmpdir[lstrlenW(tmpdir) - 1] = '*'; - ret = CreateDirectoryW(tmpdir, NULL); - ok(ret == FALSE && GetLastError() == ERROR_INVALID_NAME, - "CreateDirectoryW with * wildcard name should fail with error 183, ret=%s error=%ld\n", - ret ? " True" : "False", GetLastError()); - ret = RemoveDirectoryW(tmpdir); - } + tmpdir[lstrlenW(tmpdir) - 1] = '*'; + ret = CreateDirectoryW(tmpdir, NULL); + ok(ret == FALSE && GetLastError() == ERROR_INVALID_NAME, + "CreateDirectoryW with * wildcard name should fail with error 183, ret=%s error=%ld\n", + ret ? " True" : "False", GetLastError()); + ret = RemoveDirectoryW(tmpdir); } static void test_RemoveDirectoryA(void) @@ -286,19 +282,17 @@ static void test_RemoveDirectoryA(void) ret = RemoveDirectoryA(tmpdir); ok(ret == TRUE, "RemoveDirectoryA should always succeed\n"); - todo_wine { - lstrcatA(tmpdir, "?"); - ret = RemoveDirectoryA(tmpdir); - ok(ret == FALSE && GetLastError() == ERROR_INVALID_NAME, - "RemoveDirectoryA with ? wildcard name should fail with error 183, ret=%s error=%ld\n", - ret ? " True" : "False", GetLastError()); + lstrcatA(tmpdir, "?"); + ret = RemoveDirectoryA(tmpdir); + ok(ret == FALSE && GetLastError() == ERROR_INVALID_NAME, + "RemoveDirectoryA with ? wildcard name should fail with error 183, ret=%s error=%ld\n", + ret ? " True" : "False", GetLastError()); - tmpdir[lstrlenA(tmpdir) - 1] = '*'; - ret = RemoveDirectoryA(tmpdir); - ok(ret == FALSE && GetLastError() == ERROR_INVALID_NAME, - "RemoveDirectoryA with * wildcard name should fail with error 183, ret=%s error=%ld\n", - ret ? " True" : "False", GetLastError()); - } + tmpdir[lstrlenA(tmpdir) - 1] = '*'; + ret = RemoveDirectoryA(tmpdir); + ok(ret == FALSE && GetLastError() == ERROR_INVALID_NAME, + "RemoveDirectoryA with * wildcard name should fail with error 183, ret=%s error=%ld\n", + ret ? " True" : "False", GetLastError()); } static void test_RemoveDirectoryW(void) @@ -319,20 +313,17 @@ static void test_RemoveDirectoryW(void) ret = RemoveDirectoryW(tmpdir); ok(ret == TRUE, "RemoveDirectoryW should always succeed\n"); - todo_wine { - lstrcatW(tmpdir, questionW); - ret = RemoveDirectoryW(tmpdir); - ok(ret == FALSE && GetLastError() == ERROR_INVALID_NAME, - "RemoveDirectoryW with wildcard should fail with error 183, ret=%s error=%ld\n", - ret ? " True" : "False", GetLastError()); - - tmpdir[lstrlenW(tmpdir) - 1] = '*'; - ret = RemoveDirectoryW(tmpdir); - ok(ret == FALSE && GetLastError() == ERROR_INVALID_NAME, - "RemoveDirectoryW with * wildcard name should fail with error 183, ret=%s error=%ld\n", - ret ? " True" : "False", GetLastError()); - } + lstrcatW(tmpdir, questionW); + ret = RemoveDirectoryW(tmpdir); + ok(ret == FALSE && GetLastError() == ERROR_INVALID_NAME, + "RemoveDirectoryW with wildcard should fail with error 183, ret=%s error=%ld\n", + ret ? " True" : "False", GetLastError()); + tmpdir[lstrlenW(tmpdir) - 1] = '*'; + ret = RemoveDirectoryW(tmpdir); + ok(ret == FALSE && GetLastError() == ERROR_INVALID_NAME, + "RemoveDirectoryW with * wildcard name should fail with error 183, ret=%s error=%ld\n", + ret ? " True" : "False", GetLastError()); } START_TEST(directory) diff --git a/reactos/apps/tests/kernel32/file.c b/reactos/apps/tests/kernel32/file.c index 1e754d66a1f..651763e8cbe 100644 --- a/reactos/apps/tests/kernel32/file.c +++ b/reactos/apps/tests/kernel32/file.c @@ -1,7 +1,7 @@ /* * Unit tests for file functions in Wine * - * Copyright (c) 2002 Jakob Eriksson + * Copyright (c) 2002, 2004 Jakob Eriksson * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -28,6 +28,15 @@ #include "winbase.h" #include "winerror.h" +static int dll_capable(const char *dll, const char *function) +{ + HMODULE module = GetModuleHandleA(dll); + if (!module) return 0; + + return (GetProcAddress(module, function) != NULL); +} + + LPCSTR filename = "testfile.xxx"; LPCSTR sillytext = "en larvig liten text dx \033 gx hej 84 hej 4484 ! \001\033 bla bl\na.. bla bla." @@ -270,9 +279,8 @@ static void test__lcreat( void ) } else { /* only NT succeeds */ _lclose(filehandle); find=FindFirstFileA (slashname, &search_results); - if (INVALID_HANDLE_VALUE==find) - ok (0, "file \"%s\" not found\n", slashname); - else { + if (INVALID_HANDLE_VALUE!=find) + { ok (0!=FindClose (find), "FindClose complains (%ld)\n", GetLastError ()); slashname[strlen(slashname)-1]=0; ok (!strcmp (slashname, search_results.cFileName), @@ -597,6 +605,7 @@ static void test_CreateFileW(void) HANDLE hFile; WCHAR temp_path[MAX_PATH]; WCHAR filename[MAX_PATH]; + static const WCHAR emptyW[]={'\0'}; static const WCHAR prefix[] = {'p','f','x',0}; DWORD ret; @@ -616,25 +625,55 @@ static void test_CreateFileW(void) ret = DeleteFileW(filename); ok(ret, "DeleteFileW: error %ld\n", GetLastError()); + + hFile = CreateFileW(NULL, GENERIC_READ, 0, NULL, + CREATE_NEW, FILE_FLAG_RANDOM_ACCESS, 0); + ok(hFile == INVALID_HANDLE_VALUE && GetLastError() == ERROR_PATH_NOT_FOUND, + "CreateFileW(NULL) returned ret=%p error=%ld\n",hFile,GetLastError()); + + hFile = CreateFileW(emptyW, GENERIC_READ, 0, NULL, + CREATE_NEW, FILE_FLAG_RANDOM_ACCESS, 0); + ok(hFile == INVALID_HANDLE_VALUE && GetLastError() == ERROR_PATH_NOT_FOUND, + "CreateFileW(\"\") returned ret=%p error=%ld\n",hFile,GetLastError()); } - -static void test_GetTempFileNameA() { +static void test_GetTempFileNameA() +{ UINT result; char out[MAX_PATH]; - char *expected = "c:\\windows\\abc2.tmp"; + char expected[MAX_PATH + 10]; + char windowsdir[MAX_PATH + 10]; + char windowsdrive[3]; - /* this test may depend on the config file settings */ - result = GetTempFileNameA("C:", "abc", 1, out); - ok( result != 0, "GetTempFileNameA: error %ld\n", GetLastError() ); - ok( ((out[0] == 'C') && (out[1] == ':')) && (out[2] == '\\'), "GetTempFileNameA: first three characters should be C:\\, string was actually %s\n", out ); + result = GetWindowsDirectory(windowsdir, sizeof(windowsdir)); + ok(result < sizeof(windowsdir), "windowsdir is abnormally long!\n"); + ok(result != 0, "GetWindowsDirectory: error %ld\n", GetLastError()); - result = GetTempFileNameA("c:\\windows\\", "abc", 2, out); - ok( result != 0, "GetTempFileNameA: error %ld\n", GetLastError() ); - ok( lstrcmpiA( out, expected ) == 0, "GetTempFileNameA: Unexpected output \"%s\" vs \"%s\"\n", out, expected ); + /* If the Windows directory is the root directory, it ends in backslash, not else. */ + if (strlen(windowsdir) != 3) /* As in "C:\" or "F:\" */ + { + strcat(windowsdir, "\\"); + } + + windowsdrive[0] = windowsdir[0]; + windowsdrive[1] = windowsdir[1]; + windowsdrive[2] = '\0'; + + result = GetTempFileNameA(windowsdrive, "abc", 1, out); + ok(result != 0, "GetTempFileNameA: error %ld\n", GetLastError()); + ok(((out[0] == windowsdrive[0]) && (out[1] == ':')) && (out[2] == '\\'), + "GetTempFileNameA: first three characters should be %c:\\, string was actually %s\n", + windowsdrive[0], out); + + result = GetTempFileNameA(windowsdir, "abc", 2, out); + ok(result != 0, "GetTempFileNameA: error %ld\n", GetLastError()); + expected[0] = '\0'; + strcat(expected, windowsdir); + strcat(expected, "abc2.tmp"); + ok(lstrcmpiA(out, expected) == 0, "GetTempFileNameA: Unexpected output \"%s\" vs \"%s\"\n", + out, expected); } - static void test_DeleteFileA( void ) { BOOL ret; @@ -648,12 +687,18 @@ static void test_DeleteFileA( void ) ok(!ret && (GetLastError() == ERROR_PATH_NOT_FOUND || GetLastError() == ERROR_BAD_PATHNAME), "DeleteFileA(\"\") returned ret=%d error=%ld\n",ret,GetLastError()); + + ret = DeleteFileA("nul"); + ok(!ret && (GetLastError() == ERROR_FILE_NOT_FOUND || + GetLastError() == ERROR_INVALID_PARAMETER || + GetLastError() == ERROR_ACCESS_DENIED), + "DeleteFileA(\"nul\") returned ret=%d error=%ld\n",ret,GetLastError()); } static void test_DeleteFileW( void ) { BOOL ret; - WCHAR emptyW[]={'\0'}; + static const WCHAR emptyW[]={'\0'}; ret = DeleteFileW(NULL); if (ret==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) @@ -702,14 +747,13 @@ static void test_MoveFileA(void) lstrcpyA(source, dest); lstrcpyA(dest, tempdir); lstrcatA(dest, "\\wild?.*"); + /* FIXME: if we create a file with wildcards we can't delete it now that DeleteFile works correctly */ ret = MoveFileA(source, dest); - todo_wine { - ok(!ret, "MoveFileA: shouldn't move to wildcard file\n"); - ok(GetLastError() == ERROR_INVALID_NAME, - "MoveFileA: with wildcards, unexpected error %ld\n", GetLastError()); -#if 0 - if (ret || (GetLastError() != ERROR_INVALID_NAME)) - { + ok(!ret, "MoveFileA: shouldn't move to wildcard file\n"); + ok(GetLastError() == ERROR_INVALID_NAME, + "MoveFileA: with wildcards, unexpected error %ld\n", GetLastError()); + if (ret || (GetLastError() != ERROR_INVALID_NAME)) + { WIN32_FIND_DATAA fd; char temppath[MAX_PATH]; HANDLE hFind; @@ -730,14 +774,11 @@ static void test_MoveFileA(void) while (FindNextFileA(hFind, &fd)); FindClose(hFind); } - } -#endif - ret = DeleteFileA(source); - ok(ret, "DeleteFileA: error %ld\n", GetLastError()); - ret = DeleteFileA(dest); - ok(!ret, "DeleteFileA: error %ld\n", GetLastError()); } - + ret = DeleteFileA(source); + ok(ret, "DeleteFileA: error %ld\n", GetLastError()); + ret = DeleteFileA(dest); + ok(!ret, "DeleteFileA: error %ld\n", GetLastError()); ret = RemoveDirectoryA(tempdir); ok(ret, "DeleteDirectoryA: error %ld\n", GetLastError()); } @@ -803,7 +844,7 @@ static void test_offset_in_overlapped_structure(void) if (rc || GetLastError()!=ERROR_INVALID_PARAMETER) { ok(rc, "WriteFile error %ld\n", GetLastError()); ok(done == sizeof(pattern), "expected number of bytes written %lu\n", done); - trace("Current offset = %04lx\n", SetFilePointer(hFile, 0, NULL, FILE_CURRENT)); + /*trace("Current offset = %04lx\n", SetFilePointer(hFile, 0, NULL, FILE_CURRENT));*/ ok(SetFilePointer(hFile, 0, NULL, FILE_CURRENT) == (PATTERN_OFFSET + sizeof(pattern)), "expected file offset %d\n", PATTERN_OFFSET + sizeof(pattern)); @@ -832,7 +873,7 @@ static void test_offset_in_overlapped_structure(void) if (rc || GetLastError()!=ERROR_INVALID_PARAMETER) { ok(rc, "ReadFile error %ld\n", GetLastError()); ok(done == sizeof(pattern), "expected number of bytes read %lu\n", done); - trace("Current offset = %04lx\n", SetFilePointer(hFile, 0, NULL, FILE_CURRENT)); + /*trace("Current offset = %04lx\n", SetFilePointer(hFile, 0, NULL, FILE_CURRENT));*/ ok(SetFilePointer(hFile, 0, NULL, FILE_CURRENT) == (PATTERN_OFFSET + sizeof(pattern)), "expected file offset %d\n", PATTERN_OFFSET + sizeof(pattern)); ok(!memcmp(buf, pattern, sizeof(pattern)), "pattern match failed\n"); @@ -848,6 +889,9 @@ static void test_LockFile(void) HANDLE handle; DWORD written; OVERLAPPED overlapped; + int limited_LockFile; + int limited_UnLockFile; + int lockfileex_capable; handle = CreateFileA( filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, @@ -861,7 +905,12 @@ static void test_LockFile(void) ok( LockFile( handle, 0, 0, 0, 0 ), "LockFile failed\n" ); ok( UnlockFile( handle, 0, 0, 0, 0 ), "UnlockFile failed\n" ); - ok( !UnlockFile( handle, 0, 0, 0, 0 ), "UnlockFile succeeded\n" ); + + limited_UnLockFile = 0; + if (UnlockFile( handle, 0, 0, 0, 0 )) + { + limited_UnLockFile = 1; + } ok( LockFile( handle, 10, 0, 20, 0 ), "LockFile 10,20 failed\n" ); /* overlapping locks must fail */ @@ -878,18 +927,39 @@ static void test_LockFile(void) overlapped.Offset = 100; overlapped.OffsetHigh = 0; overlapped.hEvent = 0; - ok( LockFileEx( handle, 0, 0, 100, 0, &overlapped ), "LockFileEx 100,100 failed\n" ); + + lockfileex_capable = dll_capable("kernel32", "LockFileEx"); + if (lockfileex_capable) + { + /* Test for broken LockFileEx a la Windows 95 OSR2. */ + if (LockFileEx( handle, 0, 0, 100, 0, &overlapped )) + { + /* LockFileEx is probably OK, test it more. */ + ok( LockFileEx( handle, 0, 0, 100, 0, &overlapped ), + "LockFileEx 100,100 failed\n" ); + } + } + /* overlapping shared locks are OK */ overlapped.Offset = 150; - ok( LockFileEx( handle, 0, 0, 100, 0, &overlapped ), "LockFileEx 150,100 failed\n" ); + limited_UnLockFile || ok( LockFileEx( handle, 0, 0, 100, 0, &overlapped ), "LockFileEx 150,100 failed\n" ); + /* but exclusive is not */ - ok( !LockFileEx( handle, LOCKFILE_EXCLUSIVE_LOCK|LOCKFILE_FAIL_IMMEDIATELY, 0, 50, 0, &overlapped ), - "LockFileEx exclusive 150,50 succeeded\n" ); - ok( UnlockFileEx( handle, 0, 100, 0, &overlapped ), "UnlockFileEx 150,100 failed\n" ); - ok( !UnlockFileEx( handle, 0, 100, 0, &overlapped ), "UnlockFileEx 150,100 again succeeded\n" ); - overlapped.Offset = 100; - ok( UnlockFileEx( handle, 0, 100, 0, &overlapped ), "UnlockFileEx 100,100 failed\n" ); - ok( !UnlockFileEx( handle, 0, 100, 0, &overlapped ), "UnlockFileEx 100,100 again succeeded\n" ); + if (lockfileex_capable) + { + ok( !LockFileEx( handle, LOCKFILE_EXCLUSIVE_LOCK|LOCKFILE_FAIL_IMMEDIATELY, + 0, 50, 0, &overlapped ), + "LockFileEx exclusive 150,50 succeeded\n" ); + if (dll_capable("kernel32.dll", "UnlockFileEx")) + { + if (!UnlockFileEx( handle, 0, 100, 0, &overlapped )) + { /* UnLockFile is capable. */ + overlapped.Offset = 100; + ok( !UnlockFileEx( handle, 0, 100, 0, &overlapped ), + "UnlockFileEx 150,100 again succeeded\n" ); + } + } + } ok( LockFile( handle, 0, 0x10000000, 0, 0xf0000000 ), "LockFile failed\n" ); ok( !LockFile( handle, ~0, ~0, 1, 0 ), "LockFile ~0,1 succeeded\n" ); @@ -899,22 +969,102 @@ static void test_LockFile(void) /* wrap-around lock should not do anything */ /* (but still succeeds on NT4 so we don't check result) */ LockFile( handle, 0, 0x10000000, 0, 0xf0000001 ); - ok( LockFile( handle, ~0, ~0, 1, 0 ), "LockFile ~0,1 failed\n" ); - ok( UnlockFile( handle, ~0, ~0, 1, 0 ), "Unlockfile ~0,1 failed\n" ); + + limited_LockFile = 0; + if (!LockFile( handle, ~0, ~0, 1, 0 )) + { + limited_LockFile = 1; + } + + limited_UnLockFile || ok( UnlockFile( handle, ~0, ~0, 1, 0 ), "Unlockfile ~0,1 failed\n" ); /* zero-byte lock */ ok( LockFile( handle, 100, 0, 0, 0 ), "LockFile 100,0 failed\n" ); - ok( !LockFile( handle, 98, 0, 4, 0 ), "LockFile 98,4 succeeded\n" ); + limited_LockFile || ok( !LockFile( handle, 98, 0, 4, 0 ), "LockFile 98,4 succeeded\n" ); ok( LockFile( handle, 90, 0, 10, 0 ), "LockFile 90,10 failed\n" ); - ok( LockFile( handle, 100, 0, 10, 0 ), "LockFile 100,10 failed\n" ); + limited_LockFile || ok( !LockFile( handle, 100, 0, 10, 0 ), "LockFile 100,10 failed\n" ); + ok( UnlockFile( handle, 90, 0, 10, 0 ), "UnlockFile 90,10 failed\n" ); - ok( UnlockFile( handle, 100, 0, 10, 0 ), "UnlockFile 100,10 failed\n" ); + !ok( UnlockFile( handle, 100, 0, 10, 0 ), "UnlockFile 100,10 failed\n" ); + ok( UnlockFile( handle, 100, 0, 0, 0 ), "UnlockFile 100,0 failed\n" ); CloseHandle( handle ); DeleteFileA( filename ); } +static inline int is_sharing_compatible( DWORD access1, DWORD sharing1, DWORD access2, DWORD sharing2 ) +{ + if (!access1 || !access2) return 1; + if ((access1 & GENERIC_READ) && !(sharing2 & FILE_SHARE_READ)) return 0; + if ((access1 & GENERIC_WRITE) && !(sharing2 & FILE_SHARE_WRITE)) return 0; + if ((access2 & GENERIC_READ) && !(sharing1 & FILE_SHARE_READ)) return 0; + if ((access2 & GENERIC_WRITE) && !(sharing1 & FILE_SHARE_WRITE)) return 0; + return 1; +} + +static void test_file_sharing(void) +{ + static const DWORD access_modes[4] = { 0, GENERIC_READ, GENERIC_WRITE, GENERIC_READ|GENERIC_WRITE }; + static const DWORD sharing_modes[4] = { 0, FILE_SHARE_READ, FILE_SHARE_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE }; + int a1, s1, a2, s2; + int ret; + + /* make sure the file exists */ + HANDLE h = CreateFileA( filename, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + CloseHandle( h ); + + for (a1 = 0; a1 < 4; a1++) + { + for (s1 = 0; s1 < 4; s1++) + { + HANDLE h = CreateFileA( filename, access_modes[a1], sharing_modes[s1], + NULL, OPEN_EXISTING, 0, 0 ); + if (h == INVALID_HANDLE_VALUE) + { + ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError()); + return; + } + for (a2 = 0; a2 < 4; a2++) + { + for (s2 = 0; s2 < 4; s2++) + { + HANDLE h2 = CreateFileA( filename, access_modes[a2], sharing_modes[s2], + NULL, OPEN_EXISTING, 0, 0 ); + if (is_sharing_compatible( access_modes[a1], sharing_modes[s1], + access_modes[a2], sharing_modes[s2] )) + { + ret = GetLastError(); + ok( ERROR_SHARING_VIOLATION == ret || 0 == ret, + "Windows 95 sets GetLastError() = ERROR_SHARING_VIOLATION and\n" + " Windows XP GetLastError() = 0, but now it is %d.\n" + " indexes = %d, %d, %d, %d\n" + " modes =\n %lx/%lx/%lx/%lx\n", + ret, + a1, s1, a2, s2, + access_modes[a1], sharing_modes[s1], + access_modes[a2], sharing_modes[s2] + ); + } + else + { + ok( h2 == INVALID_HANDLE_VALUE, + "open succeeded for modes %lx/%lx/%lx/%lx\n", + access_modes[a1], sharing_modes[s1], + access_modes[a2], sharing_modes[s2] ); + if (h2 == INVALID_HANDLE_VALUE) + ok( GetLastError() == ERROR_SHARING_VIOLATION, + "wrong error code %ld\n", GetLastError() ); + } + if (h2 != INVALID_HANDLE_VALUE) CloseHandle( h2 ); + } + } + CloseHandle( h ); + } + } + DeleteFileA( filename ); +} + static void test_FindFirstFileA() { HANDLE handle; @@ -948,37 +1098,78 @@ static void test_FindNextFileA() ok ( err == ERROR_NO_MORE_FILES, "GetLastError should return ERROR_NO_MORE_FILES\n"); } -static void test_MapFile() +static int test_Mapfile_createtemp(HANDLE *handle) { - HANDLE handle, hmap; - - /* be sure to remove stale files */ SetFileAttributesA(filename,FILE_ATTRIBUTE_NORMAL); DeleteFile(filename); - handle = CreateFile( filename, GENERIC_READ|GENERIC_WRITE, 0, 0, - CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); - ok( handle != INVALID_HANDLE_VALUE, "couldn't create test file\n"); + *handle = CreateFile(filename, GENERIC_READ|GENERIC_WRITE, 0, 0, + CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + if (*handle != INVALID_HANDLE_VALUE) { + + return 1; + } + + return 0; +} + +static void test_MapFile() +{ + HANDLE handle; + HANDLE hmap; + + ok(test_Mapfile_createtemp(&handle), "Couldn't create test file.\n"); + + hmap = CreateFileMapping( handle, NULL, PAGE_READWRITE, 0, 0x1000, "named_file_map" ); + ok( hmap != NULL, "mapping should work, I named it!\n" ); + + ok( CloseHandle( hmap ), "can't close mapping handle\n"); + + /* We have to close file before we try new stuff with mapping again. + Else we would always succeed on XP or block descriptors on 95. */ + hmap = CreateFileMapping( handle, NULL, PAGE_READWRITE, 0, 0, NULL ); + ok( hmap != NULL, "We should still be able to map!\n" ); + ok( CloseHandle( hmap ), "can't close mapping handle\n"); + ok( CloseHandle( handle ), "can't close file handle\n"); + handle = NULL; + + ok(test_Mapfile_createtemp(&handle), "Couldn't create test file.\n"); hmap = CreateFileMapping( handle, NULL, PAGE_READWRITE, 0, 0, NULL ); + ok( hmap == NULL, "Mapping should not work, no name provided.\n" ); + ok( hmap == NULL, "mapped zero size file\n"); ok( GetLastError() == ERROR_FILE_INVALID, "not ERROR_FILE_INVALID\n"); hmap = CreateFileMapping( handle, NULL, PAGE_READWRITE, 0x1000, 0, NULL ); ok( hmap == NULL, "mapping should fail\n"); - /* GetLastError() varies between win9x and WinNT */ + /* GetLastError() varies between win9x and WinNT and also depends on the filesystem */ hmap = CreateFileMapping( handle, NULL, PAGE_READWRITE, 0x1000, 0x10000, NULL ); ok( hmap == NULL, "mapping should fail\n"); - /* GetLastError() varies between win9x and WinNT */ + /* GetLastError() varies between win9x and WinNT and also depends on the filesystem */ - hmap = CreateFileMapping( handle, NULL, PAGE_READWRITE, 0, 0x1000, NULL ); - ok( hmap != NULL, "mapping should succeed\n"); + /* On XP you can now map again, on Win 95 you can not. */ - ok( CloseHandle( hmap ), "can't close mapping handle\n"); ok( CloseHandle( handle ), "can't close file handle\n"); ok( DeleteFileA( filename ), "DeleteFile failed after map\n" ); } +static void test_GetFileType(void) +{ + DWORD type; + HANDLE h = CreateFileA( filename, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( h != INVALID_HANDLE_VALUE, "open %s failed\n", filename ); + type = GetFileType(h); + ok( type == FILE_TYPE_DISK, "expected type disk got %ld\n", type ); + CloseHandle( h ); + h = CreateFileA( "nul", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0 ); + ok( h != INVALID_HANDLE_VALUE, "open nul failed\n" ); + type = GetFileType(h); + ok( type == FILE_TYPE_CHAR, "expected type char for nul got %ld\n", type ); + CloseHandle( h ); + DeleteFileA( filename ); +} + START_TEST(file) { test__hread( ); @@ -1001,6 +1192,8 @@ START_TEST(file) test_FindFirstFileA(); test_FindNextFileA(); test_LockFile(); + test_file_sharing(); test_offset_in_overlapped_structure(); test_MapFile(); + test_GetFileType(); } diff --git a/reactos/apps/tests/kernel32/format_msg.c b/reactos/apps/tests/kernel32/format_msg.c index d19e3f4a032..e6f317c7db2 100644 --- a/reactos/apps/tests/kernel32/format_msg.c +++ b/reactos/apps/tests/kernel32/format_msg.c @@ -42,7 +42,7 @@ void test_message_from_string(void) { CHAR out[0x100] = {0}; DWORD r; - WCHAR szwTest[] = { 't','e','s','t',0}; + static const WCHAR szwTest[] = { 't','e','s','t',0}; /* the basics */ r = FormatMessageA(FORMAT_MESSAGE_FROM_STRING, "test", 0, diff --git a/reactos/apps/tests/kernel32/generated.c b/reactos/apps/tests/kernel32/generated.c index 886ff5ff6c2..d1ceedf21ba 100644 --- a/reactos/apps/tests/kernel32/generated.c +++ b/reactos/apps/tests/kernel32/generated.c @@ -109,6 +109,221 @@ #define TEST_TYPE_UNSIGNED(type) \ ok((type) -1 > 0, "(" #type ") -1 > 0\n"); +static void test_pack_LPOSVERSIONINFOA(void) +{ + /* LPOSVERSIONINFOA */ + TEST_TYPE(LPOSVERSIONINFOA, 4, 4); + TEST_TYPE_POINTER(LPOSVERSIONINFOA, 148, 4); +} + +static void test_pack_LPOSVERSIONINFOEXA(void) +{ + /* LPOSVERSIONINFOEXA */ + TEST_TYPE(LPOSVERSIONINFOEXA, 4, 4); + TEST_TYPE_POINTER(LPOSVERSIONINFOEXA, 156, 4); +} + +static void test_pack_LPOSVERSIONINFOEXW(void) +{ + /* LPOSVERSIONINFOEXW */ + TEST_TYPE(LPOSVERSIONINFOEXW, 4, 4); + TEST_TYPE_POINTER(LPOSVERSIONINFOEXW, 284, 4); +} + +static void test_pack_LPOSVERSIONINFOW(void) +{ + /* LPOSVERSIONINFOW */ + TEST_TYPE(LPOSVERSIONINFOW, 4, 4); + TEST_TYPE_POINTER(LPOSVERSIONINFOW, 276, 4); +} + +static void test_pack_OSVERSIONINFOA(void) +{ + /* OSVERSIONINFOA (pack 4) */ + TEST_TYPE(OSVERSIONINFOA, 148, 4); + TEST_FIELD(OSVERSIONINFOA, DWORD, dwOSVersionInfoSize, 0, 4, 4); + TEST_FIELD(OSVERSIONINFOA, DWORD, dwMajorVersion, 4, 4, 4); + TEST_FIELD(OSVERSIONINFOA, DWORD, dwMinorVersion, 8, 4, 4); + TEST_FIELD(OSVERSIONINFOA, DWORD, dwBuildNumber, 12, 4, 4); + TEST_FIELD(OSVERSIONINFOA, DWORD, dwPlatformId, 16, 4, 4); + TEST_FIELD(OSVERSIONINFOA, CHAR[128], szCSDVersion, 20, 128, 1); +} + +static void test_pack_OSVERSIONINFOEXA(void) +{ + /* OSVERSIONINFOEXA (pack 4) */ + TEST_TYPE(OSVERSIONINFOEXA, 156, 4); + TEST_FIELD(OSVERSIONINFOEXA, DWORD, dwOSVersionInfoSize, 0, 4, 4); + TEST_FIELD(OSVERSIONINFOEXA, DWORD, dwMajorVersion, 4, 4, 4); + TEST_FIELD(OSVERSIONINFOEXA, DWORD, dwMinorVersion, 8, 4, 4); + TEST_FIELD(OSVERSIONINFOEXA, DWORD, dwBuildNumber, 12, 4, 4); + TEST_FIELD(OSVERSIONINFOEXA, DWORD, dwPlatformId, 16, 4, 4); + TEST_FIELD(OSVERSIONINFOEXA, CHAR[128], szCSDVersion, 20, 128, 1); + TEST_FIELD(OSVERSIONINFOEXA, WORD, wServicePackMajor, 148, 2, 2); + TEST_FIELD(OSVERSIONINFOEXA, WORD, wServicePackMinor, 150, 2, 2); + TEST_FIELD(OSVERSIONINFOEXA, WORD, wSuiteMask, 152, 2, 2); + TEST_FIELD(OSVERSIONINFOEXA, BYTE, wProductType, 154, 1, 1); + TEST_FIELD(OSVERSIONINFOEXA, BYTE, wReserved, 155, 1, 1); +} + +static void test_pack_OSVERSIONINFOEXW(void) +{ + /* OSVERSIONINFOEXW (pack 4) */ + TEST_TYPE(OSVERSIONINFOEXW, 284, 4); + TEST_FIELD(OSVERSIONINFOEXW, DWORD, dwOSVersionInfoSize, 0, 4, 4); + TEST_FIELD(OSVERSIONINFOEXW, DWORD, dwMajorVersion, 4, 4, 4); + TEST_FIELD(OSVERSIONINFOEXW, DWORD, dwMinorVersion, 8, 4, 4); + TEST_FIELD(OSVERSIONINFOEXW, DWORD, dwBuildNumber, 12, 4, 4); + TEST_FIELD(OSVERSIONINFOEXW, DWORD, dwPlatformId, 16, 4, 4); + TEST_FIELD(OSVERSIONINFOEXW, WCHAR[128], szCSDVersion, 20, 256, 2); + TEST_FIELD(OSVERSIONINFOEXW, WORD, wServicePackMajor, 276, 2, 2); + TEST_FIELD(OSVERSIONINFOEXW, WORD, wServicePackMinor, 278, 2, 2); + TEST_FIELD(OSVERSIONINFOEXW, WORD, wSuiteMask, 280, 2, 2); + TEST_FIELD(OSVERSIONINFOEXW, BYTE, wProductType, 282, 1, 1); + TEST_FIELD(OSVERSIONINFOEXW, BYTE, wReserved, 283, 1, 1); +} + +static void test_pack_OSVERSIONINFOW(void) +{ + /* OSVERSIONINFOW (pack 4) */ + TEST_TYPE(OSVERSIONINFOW, 276, 4); + TEST_FIELD(OSVERSIONINFOW, DWORD, dwOSVersionInfoSize, 0, 4, 4); + TEST_FIELD(OSVERSIONINFOW, DWORD, dwMajorVersion, 4, 4, 4); + TEST_FIELD(OSVERSIONINFOW, DWORD, dwMinorVersion, 8, 4, 4); + TEST_FIELD(OSVERSIONINFOW, DWORD, dwBuildNumber, 12, 4, 4); + TEST_FIELD(OSVERSIONINFOW, DWORD, dwPlatformId, 16, 4, 4); + TEST_FIELD(OSVERSIONINFOW, WCHAR[128], szCSDVersion, 20, 256, 2); +} + +static void test_pack_POSVERSIONINFOA(void) +{ + /* POSVERSIONINFOA */ + TEST_TYPE(POSVERSIONINFOA, 4, 4); + TEST_TYPE_POINTER(POSVERSIONINFOA, 148, 4); +} + +static void test_pack_POSVERSIONINFOEXA(void) +{ + /* POSVERSIONINFOEXA */ + TEST_TYPE(POSVERSIONINFOEXA, 4, 4); + TEST_TYPE_POINTER(POSVERSIONINFOEXA, 156, 4); +} + +static void test_pack_POSVERSIONINFOEXW(void) +{ + /* POSVERSIONINFOEXW */ + TEST_TYPE(POSVERSIONINFOEXW, 4, 4); + TEST_TYPE_POINTER(POSVERSIONINFOEXW, 284, 4); +} + +static void test_pack_POSVERSIONINFOW(void) +{ + /* POSVERSIONINFOW */ + TEST_TYPE(POSVERSIONINFOW, 4, 4); + TEST_TYPE_POINTER(POSVERSIONINFOW, 276, 4); +} + +static void test_pack_LPLONG(void) +{ + /* LPLONG */ + TEST_TYPE(LPLONG, 4, 4); +} + +static void test_pack_LPVOID(void) +{ + /* LPVOID */ + TEST_TYPE(LPVOID, 4, 4); +} + +static void test_pack_PHKEY(void) +{ + /* PHKEY */ + TEST_TYPE(PHKEY, 4, 4); +} + +static void test_pack_ACTCTXA(void) +{ + /* ACTCTXA (pack 4) */ + TEST_TYPE(ACTCTXA, 32, 4); + TEST_FIELD(ACTCTXA, ULONG, cbSize, 0, 4, 4); + TEST_FIELD(ACTCTXA, DWORD, dwFlags, 4, 4, 4); + TEST_FIELD(ACTCTXA, LPCSTR, lpSource, 8, 4, 4); + TEST_FIELD(ACTCTXA, USHORT, wProcessorArchitecture, 12, 2, 2); + TEST_FIELD(ACTCTXA, LANGID, wLangId, 14, 2, 2); + TEST_FIELD(ACTCTXA, LPCSTR, lpAssemblyDirectory, 16, 4, 4); + TEST_FIELD(ACTCTXA, LPCSTR, lpResourceName, 20, 4, 4); + TEST_FIELD(ACTCTXA, LPCSTR, lpApplicationName, 24, 4, 4); + TEST_FIELD(ACTCTXA, HMODULE, hModule, 28, 4, 4); +} + +static void test_pack_ACTCTXW(void) +{ + /* ACTCTXW (pack 4) */ + TEST_TYPE(ACTCTXW, 32, 4); + TEST_FIELD(ACTCTXW, ULONG, cbSize, 0, 4, 4); + TEST_FIELD(ACTCTXW, DWORD, dwFlags, 4, 4, 4); + TEST_FIELD(ACTCTXW, LPCWSTR, lpSource, 8, 4, 4); + TEST_FIELD(ACTCTXW, USHORT, wProcessorArchitecture, 12, 2, 2); + TEST_FIELD(ACTCTXW, LANGID, wLangId, 14, 2, 2); + TEST_FIELD(ACTCTXW, LPCWSTR, lpAssemblyDirectory, 16, 4, 4); + TEST_FIELD(ACTCTXW, LPCWSTR, lpResourceName, 20, 4, 4); + TEST_FIELD(ACTCTXW, LPCWSTR, lpApplicationName, 24, 4, 4); + TEST_FIELD(ACTCTXW, HMODULE, hModule, 28, 4, 4); +} + +static void test_pack_ACTCTX_SECTION_KEYED_DATA(void) +{ + /* ACTCTX_SECTION_KEYED_DATA (pack 4) */ + TEST_TYPE(ACTCTX_SECTION_KEYED_DATA, 64, 4); + TEST_FIELD(ACTCTX_SECTION_KEYED_DATA, ULONG, cbSize, 0, 4, 4); + TEST_FIELD(ACTCTX_SECTION_KEYED_DATA, ULONG, ulDataFormatVersion, 4, 4, 4); + TEST_FIELD(ACTCTX_SECTION_KEYED_DATA, PVOID, lpData, 8, 4, 4); + TEST_FIELD(ACTCTX_SECTION_KEYED_DATA, ULONG, ulLength, 12, 4, 4); + TEST_FIELD(ACTCTX_SECTION_KEYED_DATA, PVOID, lpSectionGlobalData, 16, 4, 4); + TEST_FIELD(ACTCTX_SECTION_KEYED_DATA, ULONG, ulSectionGlobalDataLength, 20, 4, 4); + TEST_FIELD(ACTCTX_SECTION_KEYED_DATA, PVOID, lpSectionBase, 24, 4, 4); + TEST_FIELD(ACTCTX_SECTION_KEYED_DATA, ULONG, ulSectionTotalLength, 28, 4, 4); + TEST_FIELD(ACTCTX_SECTION_KEYED_DATA, HANDLE, hActCtx, 32, 4, 4); + TEST_FIELD(ACTCTX_SECTION_KEYED_DATA, ULONG, ulAssemblyRosterIndex, 36, 4, 4); + TEST_FIELD(ACTCTX_SECTION_KEYED_DATA, ULONG, ulFlags, 40, 4, 4); + TEST_FIELD(ACTCTX_SECTION_KEYED_DATA, ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, AssemblyMetadata, 44, 20, 4); +} + +static void test_pack_ACTCTX_SECTION_KEYED_DATA_2600(void) +{ + /* ACTCTX_SECTION_KEYED_DATA_2600 (pack 4) */ + TEST_TYPE(ACTCTX_SECTION_KEYED_DATA_2600, 40, 4); + TEST_FIELD(ACTCTX_SECTION_KEYED_DATA_2600, ULONG, cbSize, 0, 4, 4); + TEST_FIELD(ACTCTX_SECTION_KEYED_DATA_2600, ULONG, ulDataFormatVersion, 4, 4, 4); + TEST_FIELD(ACTCTX_SECTION_KEYED_DATA_2600, PVOID, lpData, 8, 4, 4); + TEST_FIELD(ACTCTX_SECTION_KEYED_DATA_2600, ULONG, ulLength, 12, 4, 4); + TEST_FIELD(ACTCTX_SECTION_KEYED_DATA_2600, PVOID, lpSectionGlobalData, 16, 4, 4); + TEST_FIELD(ACTCTX_SECTION_KEYED_DATA_2600, ULONG, ulSectionGlobalDataLength, 20, 4, 4); + TEST_FIELD(ACTCTX_SECTION_KEYED_DATA_2600, PVOID, lpSectionBase, 24, 4, 4); + TEST_FIELD(ACTCTX_SECTION_KEYED_DATA_2600, ULONG, ulSectionTotalLength, 28, 4, 4); + TEST_FIELD(ACTCTX_SECTION_KEYED_DATA_2600, HANDLE, hActCtx, 32, 4, 4); + TEST_FIELD(ACTCTX_SECTION_KEYED_DATA_2600, ULONG, ulAssemblyRosterIndex, 36, 4, 4); +} + +static void test_pack_ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA(void) +{ + /* ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA (pack 4) */ + TEST_TYPE(ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 20, 4); + TEST_FIELD(ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, PVOID, lpInformation, 0, 4, 4); + TEST_FIELD(ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, PVOID, lpSectionBase, 4, 4, 4); + TEST_FIELD(ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, ULONG, ulSectionLength, 8, 4, 4); + TEST_FIELD(ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, PVOID, lpSectionGlobalDataBase, 12, 4, 4); + TEST_FIELD(ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, ULONG, ulSectionGlobalDataLength, 16, 4, 4); +} + +static void test_pack_ACTIVATION_CONTEXT_BASIC_INFORMATION(void) +{ + /* ACTIVATION_CONTEXT_BASIC_INFORMATION (pack 4) */ + TEST_TYPE(ACTIVATION_CONTEXT_BASIC_INFORMATION, 8, 4); + TEST_FIELD(ACTIVATION_CONTEXT_BASIC_INFORMATION, HANDLE, hActCtx, 0, 4, 4); + TEST_FIELD(ACTIVATION_CONTEXT_BASIC_INFORMATION, DWORD, dwFlags, 4, 4, 4); +} + static void test_pack_BY_HANDLE_FILE_INFORMATION(void) { /* BY_HANDLE_FILE_INFORMATION (pack 4) */ @@ -125,14 +340,6 @@ static void test_pack_BY_HANDLE_FILE_INFORMATION(void) TEST_FIELD(BY_HANDLE_FILE_INFORMATION, DWORD, nFileIndexLow, 48, 4, 4); } -static void test_pack_COMMCONFIG(void) -{ - /* COMMCONFIG (pack 4) */ - TEST_FIELD(COMMCONFIG, DWORD, dwSize, 0, 4, 4); - TEST_FIELD(COMMCONFIG, WORD, wVersion, 4, 2, 2); - TEST_FIELD(COMMCONFIG, WORD, wReserved, 6, 2, 2); -} - static void test_pack_COMMPROP(void) { /* COMMPROP (pack 4) */ @@ -168,14 +375,6 @@ static void test_pack_COMMTIMEOUTS(void) TEST_FIELD(COMMTIMEOUTS, DWORD, WriteTotalTimeoutConstant, 16, 4, 4); } -static void test_pack_COMSTAT(void) -{ - /* COMSTAT (pack 4) */ - TEST_TYPE(COMSTAT, 12, 4); - TEST_FIELD(COMSTAT, DWORD, cbInQue, 4, 4, 4); - TEST_FIELD(COMSTAT, DWORD, cbOutQue, 8, 4, 4); -} - static void test_pack_CREATE_PROCESS_DEBUG_INFO(void) { /* CREATE_PROCESS_DEBUG_INFO (pack 4) */ @@ -213,19 +412,40 @@ static void test_pack_CRITICAL_SECTION_DEBUG(void) TEST_TYPE(CRITICAL_SECTION_DEBUG, 32, 4); } -static void test_pack_DCB(void) +static void test_pack_ENUMRESLANGPROCA(void) { - /* DCB (pack 4) */ - TEST_FIELD(DCB, DWORD, DCBlength, 0, 4, 4); - TEST_FIELD(DCB, DWORD, BaudRate, 4, 4, 4); + /* ENUMRESLANGPROCA */ + TEST_TYPE(ENUMRESLANGPROCA, 4, 4); } -static void test_pack_DEBUG_EVENT(void) +static void test_pack_ENUMRESLANGPROCW(void) { - /* DEBUG_EVENT (pack 4) */ - TEST_FIELD(DEBUG_EVENT, DWORD, dwDebugEventCode, 0, 4, 4); - TEST_FIELD(DEBUG_EVENT, DWORD, dwProcessId, 4, 4, 4); - TEST_FIELD(DEBUG_EVENT, DWORD, dwThreadId, 8, 4, 4); + /* ENUMRESLANGPROCW */ + TEST_TYPE(ENUMRESLANGPROCW, 4, 4); +} + +static void test_pack_ENUMRESNAMEPROCA(void) +{ + /* ENUMRESNAMEPROCA */ + TEST_TYPE(ENUMRESNAMEPROCA, 4, 4); +} + +static void test_pack_ENUMRESNAMEPROCW(void) +{ + /* ENUMRESNAMEPROCW */ + TEST_TYPE(ENUMRESNAMEPROCW, 4, 4); +} + +static void test_pack_ENUMRESTYPEPROCA(void) +{ + /* ENUMRESTYPEPROCA */ + TEST_TYPE(ENUMRESTYPEPROCA, 4, 4); +} + +static void test_pack_ENUMRESTYPEPROCW(void) +{ + /* ENUMRESTYPEPROCW */ + TEST_TYPE(ENUMRESTYPEPROCW, 4, 4); } static void test_pack_EXCEPTION_DEBUG_INFO(void) @@ -268,13 +488,6 @@ static void test_pack_HW_PROFILE_INFOW(void) TEST_FIELD(HW_PROFILE_INFOW, WCHAR[MAX_PROFILE_LEN], szHwProfileName, 82, 160, 2); } -static void test_pack_LDT_ENTRY(void) -{ - /* LDT_ENTRY (pack 4) */ - TEST_FIELD(LDT_ENTRY, WORD, LimitLow, 0, 2, 2); - TEST_FIELD(LDT_ENTRY, WORD, BaseLow, 2, 2, 2); -} - static void test_pack_LOAD_DLL_DEBUG_INFO(void) { /* LOAD_DLL_DEBUG_INFO (pack 4) */ @@ -294,12 +507,6 @@ static void test_pack_LPBY_HANDLE_FILE_INFORMATION(void) TEST_TYPE_POINTER(LPBY_HANDLE_FILE_INFORMATION, 52, 4); } -static void test_pack_LPCOMMCONFIG(void) -{ - /* LPCOMMCONFIG */ - TEST_TYPE(LPCOMMCONFIG, 4, 4); -} - static void test_pack_LPCOMMPROP(void) { /* LPCOMMPROP */ @@ -314,19 +521,6 @@ static void test_pack_LPCOMMTIMEOUTS(void) TEST_TYPE_POINTER(LPCOMMTIMEOUTS, 20, 4); } -static void test_pack_LPCOMSTAT(void) -{ - /* LPCOMSTAT */ - TEST_TYPE(LPCOMSTAT, 4, 4); - TEST_TYPE_POINTER(LPCOMSTAT, 12, 4); -} - -static void test_pack_LPCONTEXT(void) -{ - /* LPCONTEXT */ - TEST_TYPE(LPCONTEXT, 4, 4); -} - static void test_pack_LPCRITICAL_SECTION(void) { /* LPCRITICAL_SECTION */ @@ -339,18 +533,6 @@ static void test_pack_LPCRITICAL_SECTION_DEBUG(void) TEST_TYPE(LPCRITICAL_SECTION_DEBUG, 4, 4); } -static void test_pack_LPDCB(void) -{ - /* LPDCB */ - TEST_TYPE(LPDCB, 4, 4); -} - -static void test_pack_LPDEBUG_EVENT(void) -{ - /* LPDEBUG_EVENT */ - TEST_TYPE(LPDEBUG_EVENT, 4, 4); -} - static void test_pack_LPEXCEPTION_POINTERS(void) { /* LPEXCEPTION_POINTERS */ @@ -383,12 +565,6 @@ static void test_pack_LPHW_PROFILE_INFOW(void) TEST_TYPE_POINTER(LPHW_PROFILE_INFOW, 244, 4); } -static void test_pack_LPLDT_ENTRY(void) -{ - /* LPLDT_ENTRY */ - TEST_TYPE(LPLDT_ENTRY, 4, 4); -} - static void test_pack_LPMEMORYSTATUS(void) { /* LPMEMORYSTATUS */ @@ -403,32 +579,6 @@ static void test_pack_LPOFSTRUCT(void) TEST_TYPE_POINTER(LPOFSTRUCT, 136, 2); } -static void test_pack_LPOSVERSIONINFOA(void) -{ - /* LPOSVERSIONINFOA */ - TEST_TYPE(LPOSVERSIONINFOA, 4, 4); - TEST_TYPE_POINTER(LPOSVERSIONINFOA, 148, 4); -} - -static void test_pack_LPOSVERSIONINFOEXA(void) -{ - /* LPOSVERSIONINFOEXA */ - TEST_TYPE(LPOSVERSIONINFOEXA, 4, 4); -} - -static void test_pack_LPOSVERSIONINFOEXW(void) -{ - /* LPOSVERSIONINFOEXW */ - TEST_TYPE(LPOSVERSIONINFOEXW, 4, 4); -} - -static void test_pack_LPOSVERSIONINFOW(void) -{ - /* LPOSVERSIONINFOW */ - TEST_TYPE(LPOSVERSIONINFOW, 4, 4); - TEST_TYPE_POINTER(LPOSVERSIONINFOW, 276, 4); -} - static void test_pack_LPOVERLAPPED(void) { /* LPOVERLAPPED */ @@ -442,12 +592,6 @@ static void test_pack_LPOVERLAPPED_COMPLETION_ROUTINE(void) TEST_TYPE(LPOVERLAPPED_COMPLETION_ROUTINE, 4, 4); } -static void test_pack_LPPROCESS_HEAP_ENTRY(void) -{ - /* LPPROCESS_HEAP_ENTRY */ - TEST_TYPE(LPPROCESS_HEAP_ENTRY, 4, 4); -} - static void test_pack_LPPROCESS_INFORMATION(void) { /* LPPROCESS_INFORMATION */ @@ -472,6 +616,7 @@ static void test_pack_LPSTARTUPINFOA(void) { /* LPSTARTUPINFOA */ TEST_TYPE(LPSTARTUPINFOA, 4, 4); + TEST_TYPE_POINTER(LPSTARTUPINFOA, 68, 4); } static void test_pack_LPSTARTUPINFOW(void) @@ -488,12 +633,6 @@ static void test_pack_LPSYSTEMTIME(void) TEST_TYPE_POINTER(LPSYSTEMTIME, 16, 2); } -static void test_pack_LPSYSTEM_INFO(void) -{ - /* LPSYSTEM_INFO */ - TEST_TYPE(LPSYSTEM_INFO, 4, 4); -} - static void test_pack_LPSYSTEM_POWER_STATUS(void) { /* LPSYSTEM_POWER_STATUS */ @@ -535,13 +674,6 @@ static void test_pack_LPWIN32_FIND_DATAW(void) TEST_TYPE_POINTER(LPWIN32_FIND_DATAW, 592, 4); } -static void test_pack_LPWIN32_STREAM_ID(void) -{ - /* LPWIN32_STREAM_ID */ - TEST_TYPE(LPWIN32_STREAM_ID, 4, 4); - TEST_TYPE_POINTER(LPWIN32_STREAM_ID, 24, 4); -} - static void test_pack_MEMORYSTATUS(void) { /* MEMORYSTATUS (pack 4) */ @@ -568,59 +700,13 @@ static void test_pack_OFSTRUCT(void) TEST_FIELD(OFSTRUCT, BYTE[OFS_MAXPATHNAME], szPathName, 8, 128, 1); } -static void test_pack_OSVERSIONINFOA(void) -{ - /* OSVERSIONINFOA (pack 4) */ - TEST_TYPE(OSVERSIONINFOA, 148, 4); - TEST_FIELD(OSVERSIONINFOA, DWORD, dwOSVersionInfoSize, 0, 4, 4); - TEST_FIELD(OSVERSIONINFOA, DWORD, dwMajorVersion, 4, 4, 4); - TEST_FIELD(OSVERSIONINFOA, DWORD, dwMinorVersion, 8, 4, 4); - TEST_FIELD(OSVERSIONINFOA, DWORD, dwBuildNumber, 12, 4, 4); - TEST_FIELD(OSVERSIONINFOA, DWORD, dwPlatformId, 16, 4, 4); - TEST_FIELD(OSVERSIONINFOA, CHAR[128], szCSDVersion, 20, 128, 1); -} - -static void test_pack_OSVERSIONINFOEXA(void) -{ - /* OSVERSIONINFOEXA (pack 4) */ - TEST_FIELD(OSVERSIONINFOEXA, DWORD, dwOSVersionInfoSize, 0, 4, 4); - TEST_FIELD(OSVERSIONINFOEXA, DWORD, dwMajorVersion, 4, 4, 4); - TEST_FIELD(OSVERSIONINFOEXA, DWORD, dwMinorVersion, 8, 4, 4); - TEST_FIELD(OSVERSIONINFOEXA, DWORD, dwBuildNumber, 12, 4, 4); - TEST_FIELD(OSVERSIONINFOEXA, DWORD, dwPlatformId, 16, 4, 4); - TEST_FIELD(OSVERSIONINFOEXA, CHAR[128], szCSDVersion, 20, 128, 1); - TEST_FIELD(OSVERSIONINFOEXA, WORD, wServicePackMajor, 148, 2, 2); - TEST_FIELD(OSVERSIONINFOEXA, WORD, wServicePackMinor, 150, 2, 2); -} - -static void test_pack_OSVERSIONINFOEXW(void) -{ - /* OSVERSIONINFOEXW (pack 4) */ - TEST_FIELD(OSVERSIONINFOEXW, DWORD, dwOSVersionInfoSize, 0, 4, 4); - TEST_FIELD(OSVERSIONINFOEXW, DWORD, dwMajorVersion, 4, 4, 4); - TEST_FIELD(OSVERSIONINFOEXW, DWORD, dwMinorVersion, 8, 4, 4); - TEST_FIELD(OSVERSIONINFOEXW, DWORD, dwBuildNumber, 12, 4, 4); - TEST_FIELD(OSVERSIONINFOEXW, DWORD, dwPlatformId, 16, 4, 4); - TEST_FIELD(OSVERSIONINFOEXW, WCHAR[128], szCSDVersion, 20, 256, 2); - TEST_FIELD(OSVERSIONINFOEXW, WORD, wServicePackMajor, 276, 2, 2); - TEST_FIELD(OSVERSIONINFOEXW, WORD, wServicePackMinor, 278, 2, 2); -} - -static void test_pack_OSVERSIONINFOW(void) -{ - /* OSVERSIONINFOW (pack 4) */ - TEST_TYPE(OSVERSIONINFOW, 276, 4); - TEST_FIELD(OSVERSIONINFOW, DWORD, dwOSVersionInfoSize, 0, 4, 4); - TEST_FIELD(OSVERSIONINFOW, DWORD, dwMajorVersion, 4, 4, 4); - TEST_FIELD(OSVERSIONINFOW, DWORD, dwMinorVersion, 8, 4, 4); - TEST_FIELD(OSVERSIONINFOW, DWORD, dwBuildNumber, 12, 4, 4); - TEST_FIELD(OSVERSIONINFOW, DWORD, dwPlatformId, 16, 4, 4); - TEST_FIELD(OSVERSIONINFOW, WCHAR[128], szCSDVersion, 20, 256, 2); -} - static void test_pack_OUTPUT_DEBUG_STRING_INFO(void) { /* OUTPUT_DEBUG_STRING_INFO (pack 4) */ + TEST_TYPE(OUTPUT_DEBUG_STRING_INFO, 8, 4); + TEST_FIELD(OUTPUT_DEBUG_STRING_INFO, LPSTR, lpDebugStringData, 0, 4, 4); + TEST_FIELD(OUTPUT_DEBUG_STRING_INFO, WORD, fUnicode, 4, 2, 2); + TEST_FIELD(OUTPUT_DEBUG_STRING_INFO, WORD, nDebugStringLength, 6, 2, 2); } static void test_pack_OVERLAPPED(void) @@ -634,6 +720,48 @@ static void test_pack_OVERLAPPED(void) TEST_FIELD(OVERLAPPED, HANDLE, hEvent, 16, 4, 4); } +static void test_pack_PACTCTXA(void) +{ + /* PACTCTXA */ + TEST_TYPE(PACTCTXA, 4, 4); + TEST_TYPE_POINTER(PACTCTXA, 32, 4); +} + +static void test_pack_PACTCTXW(void) +{ + /* PACTCTXW */ + TEST_TYPE(PACTCTXW, 4, 4); + TEST_TYPE_POINTER(PACTCTXW, 32, 4); +} + +static void test_pack_PACTCTX_SECTION_KEYED_DATA(void) +{ + /* PACTCTX_SECTION_KEYED_DATA */ + TEST_TYPE(PACTCTX_SECTION_KEYED_DATA, 4, 4); + TEST_TYPE_POINTER(PACTCTX_SECTION_KEYED_DATA, 64, 4); +} + +static void test_pack_PACTCTX_SECTION_KEYED_DATA_2600(void) +{ + /* PACTCTX_SECTION_KEYED_DATA_2600 */ + TEST_TYPE(PACTCTX_SECTION_KEYED_DATA_2600, 4, 4); + TEST_TYPE_POINTER(PACTCTX_SECTION_KEYED_DATA_2600, 40, 4); +} + +static void test_pack_PACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA(void) +{ + /* PACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA */ + TEST_TYPE(PACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 4, 4); + TEST_TYPE_POINTER(PACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 20, 4); +} + +static void test_pack_PACTIVATION_CONTEXT_BASIC_INFORMATION(void) +{ + /* PACTIVATION_CONTEXT_BASIC_INFORMATION */ + TEST_TYPE(PACTIVATION_CONTEXT_BASIC_INFORMATION, 4, 4); + TEST_TYPE_POINTER(PACTIVATION_CONTEXT_BASIC_INFORMATION, 8, 4); +} + static void test_pack_PAPCFUNC(void) { /* PAPCFUNC */ @@ -647,6 +775,41 @@ static void test_pack_PBY_HANDLE_FILE_INFORMATION(void) TEST_TYPE_POINTER(PBY_HANDLE_FILE_INFORMATION, 52, 4); } +static void test_pack_PCACTCTXA(void) +{ + /* PCACTCTXA */ + TEST_TYPE(PCACTCTXA, 4, 4); + TEST_TYPE_POINTER(PCACTCTXA, 32, 4); +} + +static void test_pack_PCACTCTXW(void) +{ + /* PCACTCTXW */ + TEST_TYPE(PCACTCTXW, 4, 4); + TEST_TYPE_POINTER(PCACTCTXW, 32, 4); +} + +static void test_pack_PCACTCTX_SECTION_KEYED_DATA(void) +{ + /* PCACTCTX_SECTION_KEYED_DATA */ + TEST_TYPE(PCACTCTX_SECTION_KEYED_DATA, 4, 4); + TEST_TYPE_POINTER(PCACTCTX_SECTION_KEYED_DATA, 64, 4); +} + +static void test_pack_PCACTCTX_SECTION_KEYED_DATA_2600(void) +{ + /* PCACTCTX_SECTION_KEYED_DATA_2600 */ + TEST_TYPE(PCACTCTX_SECTION_KEYED_DATA_2600, 4, 4); + TEST_TYPE_POINTER(PCACTCTX_SECTION_KEYED_DATA_2600, 40, 4); +} + +static void test_pack_PCACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA(void) +{ + /* PCACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA */ + TEST_TYPE(PCACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 4, 4); + TEST_TYPE_POINTER(PCACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 20, 4); +} + static void test_pack_PCRITICAL_SECTION(void) { /* PCRITICAL_SECTION */ @@ -672,38 +835,6 @@ static void test_pack_POFSTRUCT(void) TEST_TYPE_POINTER(POFSTRUCT, 136, 2); } -static void test_pack_POSVERSIONINFOA(void) -{ - /* POSVERSIONINFOA */ - TEST_TYPE(POSVERSIONINFOA, 4, 4); - TEST_TYPE_POINTER(POSVERSIONINFOA, 148, 4); -} - -static void test_pack_POSVERSIONINFOEXA(void) -{ - /* POSVERSIONINFOEXA */ - TEST_TYPE(POSVERSIONINFOEXA, 4, 4); -} - -static void test_pack_POSVERSIONINFOEXW(void) -{ - /* POSVERSIONINFOEXW */ - TEST_TYPE(POSVERSIONINFOEXW, 4, 4); -} - -static void test_pack_POSVERSIONINFOW(void) -{ - /* POSVERSIONINFOW */ - TEST_TYPE(POSVERSIONINFOW, 4, 4); - TEST_TYPE_POINTER(POSVERSIONINFOW, 276, 4); -} - -static void test_pack_PPROCESS_HEAP_ENTRY(void) -{ - /* PPROCESS_HEAP_ENTRY */ - TEST_TYPE(PPROCESS_HEAP_ENTRY, 4, 4); -} - static void test_pack_PPROCESS_INFORMATION(void) { /* PPROCESS_INFORMATION */ @@ -711,14 +842,10 @@ static void test_pack_PPROCESS_INFORMATION(void) TEST_TYPE_POINTER(PPROCESS_INFORMATION, 16, 4); } -static void test_pack_PROCESS_HEAP_ENTRY(void) +static void test_pack_PQUERYACTCTXW_FUNC(void) { - /* PROCESS_HEAP_ENTRY (pack 4) */ - TEST_FIELD(PROCESS_HEAP_ENTRY, LPVOID, lpData, 0, 4, 4); - TEST_FIELD(PROCESS_HEAP_ENTRY, DWORD, cbData, 4, 4, 4); - TEST_FIELD(PROCESS_HEAP_ENTRY, BYTE, cbOverhead, 8, 1, 1); - TEST_FIELD(PROCESS_HEAP_ENTRY, BYTE, iRegionIndex, 9, 1, 1); - TEST_FIELD(PROCESS_HEAP_ENTRY, WORD, wFlags, 10, 2, 2); + /* PQUERYACTCTXW_FUNC */ + TEST_TYPE(PQUERYACTCTXW_FUNC, 4, 4); } static void test_pack_PROCESS_INFORMATION(void) @@ -792,7 +919,25 @@ static void test_pack_SECURITY_ATTRIBUTES(void) static void test_pack_STARTUPINFOA(void) { /* STARTUPINFOA (pack 4) */ + TEST_TYPE(STARTUPINFOA, 68, 4); TEST_FIELD(STARTUPINFOA, DWORD, cb, 0, 4, 4); + TEST_FIELD(STARTUPINFOA, LPSTR, lpReserved, 4, 4, 4); + TEST_FIELD(STARTUPINFOA, LPSTR, lpDesktop, 8, 4, 4); + TEST_FIELD(STARTUPINFOA, LPSTR, lpTitle, 12, 4, 4); + TEST_FIELD(STARTUPINFOA, DWORD, dwX, 16, 4, 4); + TEST_FIELD(STARTUPINFOA, DWORD, dwY, 20, 4, 4); + TEST_FIELD(STARTUPINFOA, DWORD, dwXSize, 24, 4, 4); + TEST_FIELD(STARTUPINFOA, DWORD, dwYSize, 28, 4, 4); + TEST_FIELD(STARTUPINFOA, DWORD, dwXCountChars, 32, 4, 4); + TEST_FIELD(STARTUPINFOA, DWORD, dwYCountChars, 36, 4, 4); + TEST_FIELD(STARTUPINFOA, DWORD, dwFillAttribute, 40, 4, 4); + TEST_FIELD(STARTUPINFOA, DWORD, dwFlags, 44, 4, 4); + TEST_FIELD(STARTUPINFOA, WORD, wShowWindow, 48, 2, 2); + TEST_FIELD(STARTUPINFOA, WORD, cbReserved2, 50, 2, 2); + TEST_FIELD(STARTUPINFOA, BYTE *, lpReserved2, 52, 4, 4); + TEST_FIELD(STARTUPINFOA, HANDLE, hStdInput, 56, 4, 4); + TEST_FIELD(STARTUPINFOA, HANDLE, hStdOutput, 60, 4, 4); + TEST_FIELD(STARTUPINFOA, HANDLE, hStdError, 64, 4, 4); } static void test_pack_STARTUPINFOW(void) @@ -819,6 +964,14 @@ static void test_pack_STARTUPINFOW(void) TEST_FIELD(STARTUPINFOW, HANDLE, hStdError, 64, 4, 4); } +static void test_pack_SYSLEVEL(void) +{ + /* SYSLEVEL (pack 4) */ + TEST_TYPE(SYSLEVEL, 28, 4); + TEST_FIELD(SYSLEVEL, CRITICAL_SECTION, crst, 0, 24, 4); + TEST_FIELD(SYSLEVEL, INT, level, 24, 4, 4); +} + static void test_pack_SYSTEMTIME(void) { /* SYSTEMTIME (pack 4) */ @@ -865,6 +1018,12 @@ static void test_pack_UNLOAD_DLL_DEBUG_INFO(void) TEST_FIELD(UNLOAD_DLL_DEBUG_INFO, LPVOID, lpBaseOfDll, 0, 4, 4); } +static void test_pack_WAITORTIMERCALLBACK(void) +{ + /* WAITORTIMERCALLBACK */ + TEST_TYPE(WAITORTIMERCALLBACK, 4, 4); +} + static void test_pack_WIN32_FILE_ATTRIBUTE_DATA(void) { /* WIN32_FILE_ATTRIBUTE_DATA (pack 4) */ @@ -911,40 +1070,42 @@ static void test_pack_WIN32_FIND_DATAW(void) static void test_pack(void) { + test_pack_ACTCTXA(); + test_pack_ACTCTXW(); + test_pack_ACTCTX_SECTION_KEYED_DATA(); + test_pack_ACTCTX_SECTION_KEYED_DATA_2600(); + test_pack_ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA(); + test_pack_ACTIVATION_CONTEXT_BASIC_INFORMATION(); test_pack_BY_HANDLE_FILE_INFORMATION(); - test_pack_COMMCONFIG(); test_pack_COMMPROP(); test_pack_COMMTIMEOUTS(); - test_pack_COMSTAT(); test_pack_CREATE_PROCESS_DEBUG_INFO(); test_pack_CREATE_THREAD_DEBUG_INFO(); test_pack_CRITICAL_SECTION(); test_pack_CRITICAL_SECTION_DEBUG(); - test_pack_DCB(); - test_pack_DEBUG_EVENT(); + test_pack_ENUMRESLANGPROCA(); + test_pack_ENUMRESLANGPROCW(); + test_pack_ENUMRESNAMEPROCA(); + test_pack_ENUMRESNAMEPROCW(); + test_pack_ENUMRESTYPEPROCA(); + test_pack_ENUMRESTYPEPROCW(); test_pack_EXCEPTION_DEBUG_INFO(); test_pack_EXIT_PROCESS_DEBUG_INFO(); test_pack_EXIT_THREAD_DEBUG_INFO(); test_pack_HW_PROFILE_INFOA(); test_pack_HW_PROFILE_INFOW(); - test_pack_LDT_ENTRY(); test_pack_LOAD_DLL_DEBUG_INFO(); test_pack_LPBY_HANDLE_FILE_INFORMATION(); - test_pack_LPCOMMCONFIG(); test_pack_LPCOMMPROP(); test_pack_LPCOMMTIMEOUTS(); - test_pack_LPCOMSTAT(); - test_pack_LPCONTEXT(); test_pack_LPCRITICAL_SECTION(); test_pack_LPCRITICAL_SECTION_DEBUG(); - test_pack_LPDCB(); - test_pack_LPDEBUG_EVENT(); test_pack_LPEXCEPTION_POINTERS(); test_pack_LPEXCEPTION_RECORD(); test_pack_LPFIBER_START_ROUTINE(); test_pack_LPHW_PROFILE_INFOA(); test_pack_LPHW_PROFILE_INFOW(); - test_pack_LPLDT_ENTRY(); + test_pack_LPLONG(); test_pack_LPMEMORYSTATUS(); test_pack_LPOFSTRUCT(); test_pack_LPOSVERSIONINFOA(); @@ -953,21 +1114,19 @@ static void test_pack(void) test_pack_LPOSVERSIONINFOW(); test_pack_LPOVERLAPPED(); test_pack_LPOVERLAPPED_COMPLETION_ROUTINE(); - test_pack_LPPROCESS_HEAP_ENTRY(); test_pack_LPPROCESS_INFORMATION(); test_pack_LPPROGRESS_ROUTINE(); test_pack_LPSECURITY_ATTRIBUTES(); test_pack_LPSTARTUPINFOA(); test_pack_LPSTARTUPINFOW(); test_pack_LPSYSTEMTIME(); - test_pack_LPSYSTEM_INFO(); test_pack_LPSYSTEM_POWER_STATUS(); test_pack_LPTHREAD_START_ROUTINE(); test_pack_LPTIME_ZONE_INFORMATION(); + test_pack_LPVOID(); test_pack_LPWIN32_FILE_ATTRIBUTE_DATA(); test_pack_LPWIN32_FIND_DATAA(); test_pack_LPWIN32_FIND_DATAW(); - test_pack_LPWIN32_STREAM_ID(); test_pack_MEMORYSTATUS(); test_pack_OFSTRUCT(); test_pack_OSVERSIONINFOA(); @@ -976,19 +1135,30 @@ static void test_pack(void) test_pack_OSVERSIONINFOW(); test_pack_OUTPUT_DEBUG_STRING_INFO(); test_pack_OVERLAPPED(); + test_pack_PACTCTXA(); + test_pack_PACTCTXW(); + test_pack_PACTCTX_SECTION_KEYED_DATA(); + test_pack_PACTCTX_SECTION_KEYED_DATA_2600(); + test_pack_PACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA(); + test_pack_PACTIVATION_CONTEXT_BASIC_INFORMATION(); test_pack_PAPCFUNC(); test_pack_PBY_HANDLE_FILE_INFORMATION(); + test_pack_PCACTCTXA(); + test_pack_PCACTCTXW(); + test_pack_PCACTCTX_SECTION_KEYED_DATA(); + test_pack_PCACTCTX_SECTION_KEYED_DATA_2600(); + test_pack_PCACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA(); test_pack_PCRITICAL_SECTION(); test_pack_PCRITICAL_SECTION_DEBUG(); test_pack_PFIBER_START_ROUTINE(); + test_pack_PHKEY(); test_pack_POFSTRUCT(); test_pack_POSVERSIONINFOA(); test_pack_POSVERSIONINFOEXA(); test_pack_POSVERSIONINFOEXW(); test_pack_POSVERSIONINFOW(); - test_pack_PPROCESS_HEAP_ENTRY(); test_pack_PPROCESS_INFORMATION(); - test_pack_PROCESS_HEAP_ENTRY(); + test_pack_PQUERYACTCTXW_FUNC(); test_pack_PROCESS_INFORMATION(); test_pack_PSECURITY_ATTRIBUTES(); test_pack_PSYSTEMTIME(); @@ -1000,10 +1170,12 @@ static void test_pack(void) test_pack_SECURITY_ATTRIBUTES(); test_pack_STARTUPINFOA(); test_pack_STARTUPINFOW(); + test_pack_SYSLEVEL(); test_pack_SYSTEMTIME(); test_pack_SYSTEM_POWER_STATUS(); test_pack_TIME_ZONE_INFORMATION(); test_pack_UNLOAD_DLL_DEBUG_INFO(); + test_pack_WAITORTIMERCALLBACK(); test_pack_WIN32_FILE_ATTRIBUTE_DATA(); test_pack_WIN32_FIND_DATAA(); test_pack_WIN32_FIND_DATAW(); diff --git a/reactos/apps/tests/kernel32/locale.c b/reactos/apps/tests/kernel32/locale.c index 0c97b6ca6ae..5c044a968b7 100644 --- a/reactos/apps/tests/kernel32/locale.c +++ b/reactos/apps/tests/kernel32/locale.c @@ -35,13 +35,6 @@ #include "winerror.h" #include "winnls.h" -#ifndef DATE_YEARMONTH -#define DATE_YEARMONTH 8 -#endif -#ifndef MAP_EXPAND_LIGATURES -#define MAP_EXPAND_LIGATURES 0x2000 -#endif - static inline unsigned int strlenW( const WCHAR *str ) { const WCHAR *s = str; @@ -802,8 +795,17 @@ static void test_CompareStringA() ok(!ret, "CompareStringA must fail with invalid flag\n"); ret = lstrcmpA("", ""); - ok (!ret, "lstrcmpA(\"\", \"\") should return 0, got %d\n", ret); + ok (ret == 0, "lstrcmpA(\"\", \"\") should return 0, got %d\n", ret); + ret = lstrcmpA(NULL, NULL); + ok (ret == 0, "lstrcmpA(NULL, NULL) should return 0, got %d\n", ret); + + ret = lstrcmpA("", NULL); + ok (ret == 1, "lstrcmpA(\"\", NULL) should return 1, got %d\n", ret); + + ret = lstrcmpA(NULL, ""); + ok (ret == -1, "lstrcmpA(NULL, \"\") should return -1, got %d\n", ret); + ret = CompareStringA(LOCALE_SYSTEM_DEFAULT,0,"EndDialog",-1,"_Property",-1); ok( ret == 3, "EndDialog vs _Property ... expected 3, got %d\n", ret); diff --git a/reactos/apps/tests/kernel32/mailslot.c b/reactos/apps/tests/kernel32/mailslot.c index 10b9ae5dc26..27f1d61b405 100644 --- a/reactos/apps/tests/kernel32/mailslot.c +++ b/reactos/apps/tests/kernel32/mailslot.c @@ -35,9 +35,9 @@ #endif -const char szmspath[] = "\\\\.\\mailslot\\wine_mailslot_test"; +static const char szmspath[] = "\\\\.\\mailslot\\wine_mailslot_test"; -int mailslot_test() +static int mailslot_test() { HANDLE hSlot, hSlot2, hWriter, hWriter2; unsigned char buffer[16]; diff --git a/reactos/apps/tests/kernel32/path.c b/reactos/apps/tests/kernel32/path.c index b5f5b536c79..0f68989a63e 100644 --- a/reactos/apps/tests/kernel32/path.c +++ b/reactos/apps/tests/kernel32/path.c @@ -48,7 +48,6 @@ */ static const CHAR funny_chars[]="!@#$%^&*()=+{}[],?'`"; static const CHAR is_char_ok[] ="11111110111111111011"; -static const CHAR wine_todo[] ="00000000000000000000"; static DWORD (WINAPI *pGetLongPathNameA)(LPCSTR,LPSTR,DWORD); @@ -228,44 +227,24 @@ static void test_LongtoShortA(CHAR *teststr,CHAR *goodstr, Get(Short|Long)PathNameA should never pass, but GetFullPathNameA should. */ -static void test_FunnyChars(CHAR *curdir,CHAR *filename, - INT valid,INT todo,CHAR *errstr) { +static void test_FunnyChars(CHAR *curdir,CHAR *filename, INT valid,CHAR *errstr) +{ CHAR tmpstr[MAX_PATH],tmpstr1[MAX_PATH]; SLpassfail passfail; test_ValidPathA(curdir,"",filename,tmpstr,&passfail,errstr); if(valid) { sprintf(tmpstr1,"%s\\%s",curdir,filename); - if(todo) { - todo_wine { - ok((passfail.shortlen==0 && - (passfail.shorterror==ERROR_FILE_NOT_FOUND || passfail.shorterror==ERROR_PATH_NOT_FOUND || !passfail.shorterror)) || - (passfail.shortlen==strlen(tmpstr1) && lstrcmpiA(tmpstr,tmpstr1)==0), - "%s: GetShortPathNameA error: len=%ld error=%ld tmpstr=[%s]\n", - errstr,passfail.shortlen,passfail.shorterror,tmpstr); - } - } else { ok((passfail.shortlen==0 && (passfail.shorterror==ERROR_FILE_NOT_FOUND || passfail.shorterror==ERROR_PATH_NOT_FOUND || !passfail.shorterror)) || (passfail.shortlen==strlen(tmpstr1) && lstrcmpiA(tmpstr,tmpstr1)==0), "%s: GetShortPathNameA error: len=%ld error=%ld tmpstr=[%s]\n", errstr,passfail.shortlen,passfail.shorterror,tmpstr); - } } else { - if(todo) { - todo_wine { -/* Win2k returns ERROR_INVALID_NAME, Win98, wine return ERROR_FILE_NOT_FOUND, NT4 doesn't set last error */ - ok(passfail.shortlen==0 && - (passfail.shorterror==ERROR_INVALID_NAME || passfail.shorterror==ERROR_FILE_NOT_FOUND || !passfail.shorterror), - "%s: GetShortPathA should have failed len=%ld, error=%ld\n", - errstr,passfail.shortlen,passfail.shorterror); - } - } else { ok(passfail.shortlen==0 && (passfail.shorterror==ERROR_INVALID_NAME || passfail.shorterror==ERROR_FILE_NOT_FOUND || !passfail.shorterror), "%s: GetShortPathA should have failed len=%ld, error=%ld\n", errstr,passfail.shortlen,passfail.shorterror); - } } if(pGetLongPathNameA) { ok(passfail.longlen==0,"GetLongPathNameA passed when it shouldn't have\n"); @@ -782,30 +761,29 @@ static void test_PathNameA(CHAR *curdir, CHAR curDrive, CHAR otherDrive) } /* Check out Get*PathNameA on some funny characters */ for(i=0;i 0) { + ok(ReadFile(hnp, ibuf, sizeof(ibuf), &readden, NULL), "ReadFile\n"); + ok(readden == sizeof(obuf2), "read 6a got %ld bytes\n", readden); + pbuf = ibuf; + ok(memcmp(obuf2, pbuf, sizeof(obuf2)) == 0, "content 6a check\n"); + } + memset(ibuf, 0, sizeof(ibuf)); + ok(WriteFile(hFile, obuf, sizeof(obuf), &written, NULL), "WriteFile6a\n"); + ok(written == sizeof(obuf), "write file len 6a\n"); + ok(WriteFile(hFile, obuf2, sizeof(obuf2), &written, NULL), " WriteFile6b\n"); + ok(written == sizeof(obuf2), "write file len 6b\n"); + ok(PeekNamedPipe(hnp, ibuf, sizeof(ibuf), &readden, &avail, NULL), "Peek6\n"); + ok(readden == sizeof(obuf), "peek6 got %ld bytes\n", readden); + todo_wine { + ok(avail == sizeof(obuf) + sizeof(obuf2), "peek6b got %ld bytes available\n", avail); + } + pbuf = ibuf; + ok(memcmp(obuf, pbuf, sizeof(obuf)) == 0, "content 6a check\n"); + ok(ReadFile(hnp, ibuf, sizeof(ibuf), &readden, NULL), "ReadFile\n"); + todo_wine { + ok(readden == sizeof(obuf), "read 6b got %ld bytes\n", readden); + } + pbuf = ibuf; + ok(memcmp(obuf, pbuf, sizeof(obuf)) == 0, "content 6a check\n"); + } /* Picky conformance tests */ @@ -235,9 +388,11 @@ static DWORD CALLBACK alarmThreadMain(LPVOID arg) { DWORD timeout = (DWORD) arg; trace("alarmThreadMain\n"); - Sleep(timeout); - ok(FALSE, "alarm\n"); - ExitProcess(1); + if (WaitForSingleObject( alarm_event, timeout ) == WAIT_TIMEOUT) + { + ok(FALSE, "alarm\n"); + ExitProcess(1); + } return 1; } @@ -259,7 +414,7 @@ static DWORD CALLBACK serverThreadMain1(LPVOID arg) /* lpSecurityAttrib */ NULL); ok(hnp != INVALID_HANDLE_VALUE, "CreateNamedPipe failed\n"); - for (i = 0; ; i++) { + for (i = 0; i < NB_SERVER_LOOPS; i++) { char buf[512]; DWORD written; DWORD readden; @@ -291,6 +446,7 @@ static DWORD CALLBACK serverThreadMain1(LPVOID arg) ok(DisconnectNamedPipe(hnp), "DisconnectNamedPipe\n"); trace("Server done disconnecting.\n"); } + return 0; } /** Trivial byte echo server - closes after each connection */ @@ -310,7 +466,7 @@ static DWORD CALLBACK serverThreadMain2(LPVOID arg) /* lpSecurityAttrib */ NULL); ok(hnp != INVALID_HANDLE_VALUE, "CreateNamedPipe failed\n"); - for (i = 0; ; i++) { + for (i = 0; i < NB_SERVER_LOOPS; i++) { char buf[512]; DWORD written; DWORD readden; @@ -354,6 +510,7 @@ static DWORD CALLBACK serverThreadMain2(LPVOID arg) ok(CloseHandle(hnp), "CloseHandle\n"); hnp = hnpNext; } + return 0; } /** Trivial byte echo server - uses overlapped named pipe calls */ @@ -379,7 +536,7 @@ static DWORD CALLBACK serverThreadMain3(LPVOID arg) NULL); /* name */ ok(hEvent != NULL, "CreateEvent\n"); - for (i = 0; ; i++) { + for (i = 0; i < NB_SERVER_LOOPS; i++) { char buf[512]; DWORD written; DWORD readden; @@ -450,6 +607,7 @@ static DWORD CALLBACK serverThreadMain3(LPVOID arg) ok(FlushFileBuffers(hnp), "FlushFileBuffers\n"); ok(DisconnectNamedPipe(hnp), "DisconnectNamedPipe\n"); } + return 0; } static void exercizeServer(const char *pipename, HANDLE serverThread) @@ -457,9 +615,9 @@ static void exercizeServer(const char *pipename, HANDLE serverThread) int i; trace("exercizeServer starting\n"); - for (i = 0; i < 8; i++) { + for (i = 0; i < NB_SERVER_LOOPS; i++) { HANDLE hFile=INVALID_HANDLE_VALUE; - const char obuf[] = "Bit Bucket"; + static const char obuf[] = "Bit Bucket"; char ibuf[32]; DWORD written; DWORD readden; @@ -497,12 +655,12 @@ static void exercizeServer(const char *pipename, HANDLE serverThread) ok(CloseHandle(hFile), "CloseHandle\n"); } - ok(TerminateThread(serverThread, 0), "TerminateThread\n"); + ok(WaitForSingleObject(serverThread,INFINITE) == WAIT_OBJECT_0, "WaitForSingleObject\n"); CloseHandle(hnp); trace("exercizeServer returning\n"); } -void test_NamedPipe_2(void) +static void test_NamedPipe_2(void) { HANDLE serverThread; DWORD serverThreadId; @@ -511,6 +669,7 @@ void test_NamedPipe_2(void) trace("test_NamedPipe_2 starting\n"); /* Set up a ten second timeout */ + alarm_event = CreateEvent( NULL, TRUE, FALSE, NULL ); alarmThread = CreateThread(NULL, 0, alarmThreadMain, (void *) 10000, 0, &alarmThreadId); /* The servers we're about to exercize do try to clean up carefully, @@ -519,7 +678,7 @@ void test_NamedPipe_2(void) */ /* Try server #1 */ - serverThread = CreateThread(NULL, 0, serverThreadMain1, 0, 0, &serverThreadId); + serverThread = CreateThread(NULL, 0, serverThreadMain1, (void *)8, 0, &serverThreadId); ok(serverThread != INVALID_HANDLE_VALUE, "CreateThread\n"); exercizeServer(PIPENAME "serverThreadMain1", serverThread); @@ -536,15 +695,16 @@ void test_NamedPipe_2(void) exercizeServer(PIPENAME "serverThreadMain3", serverThread); } - ok(TerminateThread(alarmThread, 0), "TerminateThread\n"); + ok(SetEvent( alarm_event ), "SetEvent\n"); + CloseHandle( alarm_event ); trace("test_NamedPipe_2 returning\n"); } -void test_DisconnectNamedPipe(void) +static void test_DisconnectNamedPipe(void) { HANDLE hnp; HANDLE hFile; - const char obuf[] = "Bit Bucket"; + static const char obuf[] = "Bit Bucket"; char ibuf[32]; DWORD written; DWORD readden; @@ -596,6 +756,8 @@ START_TEST(pipe) trace("test 3 of 4:\n"); test_NamedPipe_2(); trace("test 4 of 4:\n"); - test_CreateNamedPipe(); + test_CreateNamedPipe(PIPE_TYPE_BYTE); + trace("all tests done\n"); + test_CreateNamedPipe(PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE); trace("all tests done\n"); } From ae6296eb104c0a8a6e402f6be7c43f4d9fb774ce Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Tue, 4 May 2004 19:53:14 +0000 Subject: [PATCH 1033/1463] - Remove IPHLPAPI headers copied from Wine. - Add the necessary structures to W32API headers. svn path=/trunk/; revision=9300 --- reactos/include/iphlpapi.h | 178 ----------------------- reactos/include/iptypes.h | 229 ------------------------------ reactos/w32api/include/iphlpapi.h | 1 + reactos/w32api/include/iptypes.h | 130 +++++++++++++++++ 4 files changed, 131 insertions(+), 407 deletions(-) delete mode 100644 reactos/include/iphlpapi.h delete mode 100644 reactos/include/iptypes.h diff --git a/reactos/include/iphlpapi.h b/reactos/include/iphlpapi.h deleted file mode 100644 index eb8d3860b38..00000000000 --- a/reactos/include/iphlpapi.h +++ /dev/null @@ -1,178 +0,0 @@ -/* WINE iphlpapi.h - * Copyright (C) 2003 Juan Lang - * - * 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_IPHLPAPI_H__ -#define WINE_IPHLPAPI_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include -#include - -DWORD -STDCALL -NhpAllocateAndGetInterfaceInfoFromStack( - OUT IP_INTERFACE_NAME_INFO **ppTable, - OUT PDWORD pdwCount, - IN BOOL bOrder, - IN HANDLE hHeap, - IN DWORD dwFlags - ); -DWORD STDCALL AllocateAndGetIfTableFromStack(PMIB_IFTABLE *ppIfTable, - BOOL bOrder, HANDLE heap, DWORD flags); -DWORD STDCALL AllocateAndGetIpAddrTableFromStack(PMIB_IPADDRTABLE *ppIpAddrTable, - BOOL bOrder, HANDLE heap, DWORD flags); -DWORD STDCALL AllocateAndGetIpForwardTableFromStack(PMIB_IPFORWARDTABLE * - ppIpForwardTable, BOOL bOrder, HANDLE heap, DWORD flags); -DWORD STDCALL AllocateAndGetIpNetTableFromStack(PMIB_IPNETTABLE *ppIpNetTable, - BOOL bOrder, HANDLE heap, DWORD flags); -DWORD STDCALL AllocateAndGetTcpTableFromStack(PMIB_TCPTABLE *ppTcpTable, - BOOL bOrder, HANDLE heap, DWORD flags); -DWORD STDCALL AllocateAndGetUdpTableFromStack(PMIB_UDPTABLE *ppUdpTable, - BOOL bOrder, HANDLE heap, DWORD flags); - -DWORD STDCALL GetNumberOfInterfaces(PDWORD pdwNumIf); - -DWORD STDCALL GetIfEntry(PMIB_IFROW pIfRow); - -DWORD STDCALL GetIfTable(PMIB_IFTABLE pIfTable, PULONG pdwSize, BOOL bOrder); - -DWORD STDCALL GetIpAddrTable(PMIB_IPADDRTABLE pIpAddrTable, PULONG pdwSize, - BOOL bOrder); - -DWORD STDCALL GetIpNetTable(PMIB_IPNETTABLE pIpNetTable, PULONG pdwSize, - BOOL bOrder); - -DWORD STDCALL GetIpForwardTable(PMIB_IPFORWARDTABLE pIpForwardTable, - PULONG pdwSize, BOOL bOrder); - -DWORD STDCALL GetTcpTable(PMIB_TCPTABLE pTcpTable, PDWORD pdwSize, BOOL bOrder); - -DWORD STDCALL GetUdpTable(PMIB_UDPTABLE pUdpTable, PDWORD pdwSize, BOOL bOrder); - -DWORD STDCALL GetIpStatistics(PMIB_IPSTATS pStats); - -DWORD STDCALL GetIpStatisticsEx(PMIB_IPSTATS pStats, DWORD dwFamily); - -DWORD STDCALL GetIcmpStatistics(PMIB_ICMP pStats); - -DWORD STDCALL GetTcpStatistics(PMIB_TCPSTATS pStats); - -DWORD STDCALL GetTcpStatisticsEx(PMIB_TCPSTATS pStats, DWORD dwFamily); - -DWORD STDCALL GetUdpStatistics(PMIB_UDPSTATS pStats); - -DWORD STDCALL GetUdpStatisticsEx(PMIB_UDPSTATS pStats, DWORD dwFamily); - -DWORD STDCALL SetIfEntry(PMIB_IFROW pIfRow); - -DWORD STDCALL CreateIpForwardEntry(PMIB_IPFORWARDROW pRoute); - -DWORD STDCALL SetIpForwardEntry(PMIB_IPFORWARDROW pRoute); - -DWORD STDCALL DeleteIpForwardEntry(PMIB_IPFORWARDROW pRoute); - -DWORD STDCALL SetIpStatistics(PMIB_IPSTATS pIpStats); - -DWORD STDCALL SetIpTTL(UINT nTTL); - -DWORD STDCALL CreateIpNetEntry(PMIB_IPNETROW pArpEntry); - -DWORD STDCALL SetIpNetEntry(PMIB_IPNETROW pArpEntry); - -DWORD STDCALL DeleteIpNetEntry(PMIB_IPNETROW pArpEntry); - -DWORD STDCALL FlushIpNetTable(DWORD dwIfIndex); - -DWORD STDCALL CreateProxyArpEntry(DWORD dwAddress, DWORD dwMask, - DWORD dwIfIndex); - -DWORD STDCALL DeleteProxyArpEntry(DWORD dwAddress, DWORD dwMask, - DWORD dwIfIndex); - -DWORD STDCALL SetTcpEntry(PMIB_TCPROW pTcpRow); - -DWORD STDCALL GetInterfaceInfo(PIP_INTERFACE_INFO pIfTable, PULONG dwOutBufLen); - -DWORD STDCALL GetUniDirectionalAdapterInfo( - PIP_UNIDIRECTIONAL_ADAPTER_ADDRESS pIPIfInfo, PULONG dwOutBufLen); - -DWORD STDCALL GetBestInterface(IPAddr dwDestAddr, PDWORD pdwBestIfIndex); - -DWORD STDCALL GetBestRoute(DWORD dwDestAddr, DWORD dwSourceAddr, - PMIB_IPFORWARDROW pBestRoute); - -DWORD STDCALL NotifyAddrChange(PHANDLE Handle, LPOVERLAPPED overlapped); - -DWORD STDCALL NotifyRouteChange(PHANDLE Handle, LPOVERLAPPED overlapped); - -DWORD STDCALL GetAdapterIndex(LPWSTR AdapterName,PULONG IfIndex); - -DWORD STDCALL AddIPAddress(IPAddr Address, IPMask IpMask, DWORD IfIndex, - PULONG NTEContext, PULONG NTEInstance); - -DWORD STDCALL DeleteIPAddress(ULONG NTEContext); - -DWORD STDCALL GetNetworkParams(PFIXED_INFO pFixedInfo, PULONG pOutBufLen); - -DWORD STDCALL GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen); - -DWORD STDCALL GetPerAdapterInfo(ULONG IfIndex, - PIP_PER_ADAPTER_INFO pPerAdapterInfo, PULONG pOutBufLen); - -DWORD STDCALL IpReleaseAddress(PIP_ADAPTER_INDEX_MAP AdapterInfo); - -DWORD STDCALL IpRenewAddress(PIP_ADAPTER_INDEX_MAP AdapterInfo); - -DWORD STDCALL SendARP(IPAddr DestIP, IPAddr SrcIP, PULONG pMacAddr, - PULONG PhyAddrLen); - -BOOL STDCALL GetRTTAndHopCount(IPAddr DestIpAddress, PULONG HopCount, - ULONG MaxHops, PULONG RTT); - -DWORD STDCALL GetFriendlyIfIndex(DWORD IfIndex); - -DWORD STDCALL EnableRouter(HANDLE* pHandle, OVERLAPPED* pOverlapped); - -DWORD STDCALL UnenableRouter(OVERLAPPED* pOverlapped, LPDWORD lpdwEnableCount); - -DWORD STDCALL GetIcmpStatisticsEx(PMIB_ICMP_EX pStats,DWORD dwFamily); - -DWORD STDCALL NhpAllocateAndGetInterfaceInfoFromStack(IP_INTERFACE_NAME_INFO **ppTable,PDWORD pdwCount,BOOL bOrder,HANDLE hHeap,DWORD dwFlags); - -DWORD STDCALL GetBestInterfaceEx(struct sockaddr *pDestAddr,PDWORD pdwBestIfIndex); - -BOOL STDCALL CancelIPChangeNotify(LPOVERLAPPED notifyOverlapped); - -PIP_ADAPTER_ORDER_MAP STDCALL GetAdapterOrderMap(VOID); - -DWORD STDCALL GetAdaptersAddresses(ULONG Family,DWORD Flags,PVOID Reserved,PIP_ADAPTER_ADDRESSES pAdapterAddresses,PULONG pOutBufLen); - -DWORD STDCALL DisableMediaSense(HANDLE *pHandle,OVERLAPPED *pOverLapped); - -DWORD STDCALL RestoreMediaSense(OVERLAPPED* pOverlapped,LPDWORD lpdwEnableCount); - -DWORD STDCALL GetIpErrorString(IP_STATUS ErrorCode,PWCHAR Buffer,PDWORD Size); - -#ifdef __cplusplus -} -#endif - -#endif /* WINE_IPHLPAPI_H__ */ diff --git a/reactos/include/iptypes.h b/reactos/include/iptypes.h deleted file mode 100644 index 61ec1bee469..00000000000 --- a/reactos/include/iptypes.h +++ /dev/null @@ -1,229 +0,0 @@ -/* WINE iptypes.h - * Copyright (C) 2003 Juan Lang - * - * 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_IPTYPES_H_ -#define WINE_IPTYPES_H_ - -#include -#include - -#define MAX_ADAPTER_DESCRIPTION_LENGTH 128 -#define MAX_ADAPTER_NAME_LENGTH 256 -#define MAX_ADAPTER_ADDRESS_LENGTH 8 -#define MAX_HOSTNAME_LEN 128 -#define MAX_DOMAIN_NAME_LEN 128 -#define MAX_SCOPE_ID_LEN 256 - -#define BROADCAST_NODETYPE 1 -#define PEER_TO_PEER_NODETYPE 2 -#define MIXED_NODETYPE 4 -#define HYBRID_NODETYPE 8 - -typedef struct { - char String[4 * 4]; -} IP_ADDRESS_STRING, *PIP_ADDRESS_STRING, IP_MASK_STRING, *PIP_MASK_STRING; - -typedef struct _IP_ADDR_STRING { - struct _IP_ADDR_STRING* Next; - IP_ADDRESS_STRING IpAddress; - IP_MASK_STRING IpMask; - DWORD Context; -} IP_ADDR_STRING, *PIP_ADDR_STRING; - -typedef struct _IP_ADAPTER_INFO { - struct _IP_ADAPTER_INFO* Next; - DWORD ComboIndex; - char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4]; - char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4]; - UINT AddressLength; - BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH]; - DWORD Index; - UINT Type; - UINT DhcpEnabled; - PIP_ADDR_STRING CurrentIpAddress; - IP_ADDR_STRING IpAddressList; - IP_ADDR_STRING GatewayList; - IP_ADDR_STRING DhcpServer; - BOOL HaveWins; - IP_ADDR_STRING PrimaryWinsServer; - IP_ADDR_STRING SecondaryWinsServer; - time_t LeaseObtained; - time_t LeaseExpires; -} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO; - -typedef struct _IP_PER_ADAPTER_INFO { - UINT AutoconfigEnabled; - UINT AutoconfigActive; - PIP_ADDR_STRING CurrentDnsServer; - IP_ADDR_STRING DnsServerList; -} IP_PER_ADAPTER_INFO, *PIP_PER_ADAPTER_INFO; - -typedef struct { - char HostName[MAX_HOSTNAME_LEN + 4] ; - char DomainName[MAX_DOMAIN_NAME_LEN + 4]; - PIP_ADDR_STRING CurrentDnsServer; - IP_ADDR_STRING DnsServerList; - UINT NodeType; - char ScopeId[MAX_SCOPE_ID_LEN + 4]; - UINT EnableRouting; - UINT EnableProxy; - UINT EnableDns; -} FIXED_INFO, *PFIXED_INFO; - -typedef struct ip_interface_name_info { - ULONG Index; - ULONG MediaType; - UCHAR ConnectionType; - UCHAR AccessType; - GUID DeviceGuid; - GUID InterfaceGuid; -} IP_INTERFACE_NAME_INFO, *PIP_INTERFACE_NAME_INFO; - -typedef enum { - IpPrefixOriginOther = 0, - IpPrefixOriginManual, - IpPrefixOriginWellKnown, - IpPrefixOriginDhcp, - IpPrefixOriginRouterAdvertisement, -} IP_PREFIX_ORIGIN; - -typedef enum { - IpSuffixOriginOther = 0, - IpSuffixOriginManual, - IpSuffixOriginWellKnown, - IpSuffixOriginDhcp, - IpSuffixOriginLinkLayerAddress, - IpSuffixOriginRandom, -} IP_SUFFIX_ORIGIN; - -typedef enum { - IpDadStateInvalid = 0, - IpDadStateTentative, - IpDadStateDuplicate, - IpDadStateDeprecated, - IpDadStatePreferred, -} IP_DAD_STATE; - -typedef struct _IP_ADAPTER_ANYCAST_ADDRESS { - union { - ULONGLONG Alignment; - struct { - ULONG Length; - DWORD Flags; - }; - }; - struct _IP_ADAPTER_ANYCAST_ADDRESS *Next; - SOCKET_ADDRESS Address; -} IP_ADAPTER_ANYCAST_ADDRESS, *PIP_ADAPTER_ANYCAST_ADDRESS; - -typedef struct _IP_ADAPTER_MULTICAST_ADDRESS { - union { - ULONGLONG Alignment; - struct { - ULONG Length; - DWORD Flags; - }; - }; - struct _IP_ADAPTER_MULTICAST_ADDRESS *Next; - SOCKET_ADDRESS Address; -} IP_ADAPTER_MULTICAST_ADDRESS, *PIP_ADAPTER_MULTICAST_ADDRESS; - -typedef struct _IP_ADAPTER_DNS_SERVER_ADDRESS { - union { - ULONGLONG Alignment; - struct { - ULONG Length; - DWORD Reserved; - }; - }; - struct _IP_ADAPTER_DNS_SERVER_ADDRESS *Next; - SOCKET_ADDRESS Address; -} IP_ADAPTER_DNS_SERVER_ADDRESS, *PIP_ADAPTER_DNS_SERVER_ADDRESS; - -typedef struct _IP_ADAPTER_UNICAST_ADDRESS { - union { - ULONGLONG Alignment; - struct { - ULONG Length; - DWORD Flags; - }; - }; - struct _IP_ADAPTER_UNICAST_ADDRESS *Next; - SOCKET_ADDRESS Address; - - IP_PREFIX_ORIGIN PrefixOrigin; - IP_SUFFIX_ORIGIN SuffixOrigin; - IP_DAD_STATE DadState; - - ULONG ValidLifetime; - ULONG PreferredLifetime; - ULONG LeaseLifetime; -} IP_ADAPTER_UNICAST_ADDRESS, *PIP_ADAPTER_UNICAST_ADDRESS; - -typedef enum { - IfOperStatusUp = 1, - IfOperStatusDown, - IfOperStatusTesting, - IfOperStatusUnknown, - IfOperStatusDormant, - IfOperStatusNotPresent, - IfOperStatusLowerLayerDown -} IF_OPER_STATUS; - -typedef struct _IP_ADAPTER_PREFIX { - union { - ULONGLONG Alignment; - struct { - ULONG Length; - DWORD Flags; - }; - }; - struct _IP_ADAPTER_PREFIX *Next; - SOCKET_ADDRESS Address; - ULONG PrefixLength; -} IP_ADAPTER_PREFIX, *PIP_ADAPTER_PREFIX; - -typedef struct _IP_ADAPTER_ADDRESSES { - union { - ULONGLONG Alignment; - struct { - ULONG Length; - DWORD IfIndex; - }; - }; - struct _IP_ADAPTER_ADDRESSES *Next; - PCHAR AdapterName; - PIP_ADAPTER_UNICAST_ADDRESS FirstUnicastAddress; - PIP_ADAPTER_ANYCAST_ADDRESS FirstAnycastAddress; - PIP_ADAPTER_MULTICAST_ADDRESS FirstMulticastAddress; - PIP_ADAPTER_DNS_SERVER_ADDRESS FirstDnsServerAddress; - PWCHAR DnsSuffix; - PWCHAR Description; - PWCHAR FriendlyName; - BYTE PhysicalAddress[MAX_ADAPTER_ADDRESS_LENGTH]; - DWORD PhysicalAddressLength; - DWORD Flags; - DWORD Mtu; - DWORD IfType; - IF_OPER_STATUS OperStatus; - DWORD Ipv6IfIndex; - DWORD ZoneIndices[16]; - PIP_ADAPTER_PREFIX FirstPrefix; -} IP_ADAPTER_ADDRESSES, *PIP_ADAPTER_ADDRESSES; - -#endif /* WINE_IPTYPES_H_*/ diff --git a/reactos/w32api/include/iphlpapi.h b/reactos/w32api/include/iphlpapi.h index 214c53ef718..d1395fd4b62 100644 --- a/reactos/w32api/include/iphlpapi.h +++ b/reactos/w32api/include/iphlpapi.h @@ -33,6 +33,7 @@ DWORD WINAPI GetIpAddrTable(PMIB_IPADDRTABLE,PULONG,BOOL); DWORD WINAPI GetIpForwardTable(PMIB_IPFORWARDTABLE,PULONG,BOOL); DWORD WINAPI GetIpNetTable(PMIB_IPNETTABLE,PULONG,BOOL); DWORD WINAPI GetIpStatistics(PMIB_IPSTATS); +DWORD WINAPI GetIpStatisticsEx(PMIB_IPSTATS,DWORD); DWORD WINAPI GetNetworkParams(PFIXED_INFO,PULONG); DWORD WINAPI GetNumberOfInterfaces(PDWORD); DWORD WINAPI GetPerAdapterInfo(ULONG,PIP_PER_ADAPTER_INFO, PULONG); diff --git a/reactos/w32api/include/iptypes.h b/reactos/w32api/include/iptypes.h index 6ddded00a8f..c2c361c8e97 100644 --- a/reactos/w32api/include/iptypes.h +++ b/reactos/w32api/include/iptypes.h @@ -60,6 +60,14 @@ typedef struct _IP_PER_ADAPTER_INFO { PIP_ADDR_STRING CurrentDnsServer; IP_ADDR_STRING DnsServerList; } IP_PER_ADAPTER_INFO, *PIP_PER_ADAPTER_INFO; +typedef struct { + ULONG Index; + ULONG MediaType; + UCHAR ConnectionType; + UCHAR AccessType; + GUID DeviceGuid; + GUID InterfaceGuid; +} IP_INTERFACE_NAME_INFO, *PIP_INTERFACE_NAME_INFO; typedef struct _FIXED_INFO { char HostName[MAX_HOSTNAME_LEN+4] ; char DomainName[MAX_DOMAIN_NAME_LEN+4]; @@ -71,6 +79,128 @@ typedef struct _FIXED_INFO { UINT EnableProxy; UINT EnableDns; } FIXED_INFO, *PFIXED_INFO; +#ifdef _WINSOCK2_H +typedef enum { + IpPrefixOriginOther = 0, + IpPrefixOriginManual, + IpPrefixOriginWellKnown, + IpPrefixOriginDhcp, + IpPrefixOriginRouterAdvertisement, +} IP_PREFIX_ORIGIN; +typedef enum { + IpSuffixOriginOther = 0, + IpSuffixOriginManual, + IpSuffixOriginWellKnown, + IpSuffixOriginDhcp, + IpSuffixOriginLinkLayerAddress, + IpSuffixOriginRandom, +} IP_SUFFIX_ORIGIN; +typedef enum { + IpDadStateInvalid = 0, + IpDadStateTentative, + IpDadStateDuplicate, + IpDadStateDeprecated, + IpDadStatePreferred, +} IP_DAD_STATE; +typedef enum { + IfOperStatusUp = 1, + IfOperStatusDown, + IfOperStatusTesting, + IfOperStatusUnknown, + IfOperStatusDormant, + IfOperStatusNotPresent, + IfOperStatusLowerLayerDown +} IF_OPER_STATUS; +typedef struct _IP_ADAPTER_UNICAST_ADDRESS { + union { + ULONGLONG Alignment; + struct { + ULONG Length; + DWORD Flags; + }; + }; + struct _IP_ADAPTER_UNICAST_ADDRESS *Next; + SOCKET_ADDRESS Address; + IP_PREFIX_ORIGIN PrefixOrigin; + IP_SUFFIX_ORIGIN SuffixOrigin; + IP_DAD_STATE DadState; + ULONG ValidLifetime; + ULONG PreferredLifetime; + ULONG LeaseLifetime; +} IP_ADAPTER_UNICAST_ADDRESS, *PIP_ADAPTER_UNICAST_ADDRESS; +typedef struct _IP_ADAPTER_ANYCAST_ADDRESS { + union { + ULONGLONG Alignment; + struct { + ULONG Length; + DWORD Flags; + }; + }; + struct _IP_ADAPTER_ANYCAST_ADDRESS *Next; + SOCKET_ADDRESS Address; +} IP_ADAPTER_ANYCAST_ADDRESS, *PIP_ADAPTER_ANYCAST_ADDRESS; +typedef struct _IP_ADAPTER_MULTICAST_ADDRESS { + union { + ULONGLONG Alignment; + struct { + ULONG Length; + DWORD Flags; + }; + }; + struct _IP_ADAPTER_MULTICAST_ADDRESS *Next; + SOCKET_ADDRESS Address; +} IP_ADAPTER_MULTICAST_ADDRESS, *PIP_ADAPTER_MULTICAST_ADDRESS; +typedef struct _IP_ADAPTER_DNS_SERVER_ADDRESS { + union { + ULONGLONG Alignment; + struct { + ULONG Length; + DWORD Reserved; + }; + }; + struct _IP_ADAPTER_DNS_SERVER_ADDRESS *Next; + SOCKET_ADDRESS Address; +} IP_ADAPTER_DNS_SERVER_ADDRESS, *PIP_ADAPTER_DNS_SERVER_ADDRESS; +typedef struct _IP_ADAPTER_PREFIX { + union { + ULONGLONG Alignment; + struct { + ULONG Length; + DWORD Flags; + }; + }; + struct _IP_ADAPTER_PREFIX *Next; + SOCKET_ADDRESS Address; + ULONG PrefixLength; +} IP_ADAPTER_PREFIX, *PIP_ADAPTER_PREFIX; +typedef struct _IP_ADAPTER_ADDRESSES { + union { + ULONGLONG Alignment; + struct { + ULONG Length; + DWORD IfIndex; + }; + }; + struct _IP_ADAPTER_ADDRESSES *Next; + PCHAR AdapterName; + PIP_ADAPTER_UNICAST_ADDRESS FirstUnicastAddress; + PIP_ADAPTER_ANYCAST_ADDRESS FirstAnycastAddress; + PIP_ADAPTER_MULTICAST_ADDRESS FirstMulticastAddress; + PIP_ADAPTER_DNS_SERVER_ADDRESS FirstDnsServerAddress; + PWCHAR DnsSuffix; + PWCHAR Description; + PWCHAR FriendlyName; + BYTE PhysicalAddress[MAX_ADAPTER_ADDRESS_LENGTH]; + DWORD PhysicalAddressLength; + DWORD Flags; + DWORD Mtu; + DWORD IfType; + IF_OPER_STATUS OperStatus; + DWORD Ipv6IfIndex; + DWORD ZoneIndices[16]; + PIP_ADAPTER_PREFIX FirstPrefix; +} IP_ADAPTER_ADDRESSES, *PIP_ADAPTER_ADDRESSES; +#endif #ifdef __cplusplus } From cf6647ab2ed5d04268a58c1c6f62432c79a2b29b Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Tue, 4 May 2004 19:55:10 +0000 Subject: [PATCH 1034/1463] - Forgot to commit this file when syncing the kernel32 test. svn path=/trunk/; revision=9301 --- reactos/apps/tests/kernel32/time.c | 123 +++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 reactos/apps/tests/kernel32/time.c diff --git a/reactos/apps/tests/kernel32/time.c b/reactos/apps/tests/kernel32/time.c new file mode 100644 index 00000000000..5592fafef48 --- /dev/null +++ b/reactos/apps/tests/kernel32/time.c @@ -0,0 +1,123 @@ +/* + * Unit test suite for time functions + * + * Copyright 2004 Uwe Bonnes + * + * 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 "wine/test.h" +#include "winbase.h" + +#define SECSPERMIN 60 +#define SECSPERDAY 86400 +/* 1601 to 1970 is 369 years plus 89 leap days */ +#define SECS_1601_TO_1970 ((369 * 365 + 89) * (ULONGLONG)SECSPERDAY) +#define TICKSPERSEC 10000000 +#define TICKSPERMSEC 10000 +#define TICKS_1601_TO_1970 (SECS_1601_TO_1970 * TICKSPERSEC) + + +void test_GetTimeZoneInformation() +{ + TIME_ZONE_INFORMATION tzinfo, tzinfo1; + DWORD res = GetTimeZoneInformation(&tzinfo); + ok(res != 0, "GetTimeZoneInformation failed\n"); + ok(SetEnvironmentVariableA("TZ","GMT0") != 0, + "SetEnvironmentVariableA failed\n"); + res = GetTimeZoneInformation(&tzinfo1); + ok(res != 0, "GetTimeZoneInformation failed\n"); + + ok(((tzinfo.Bias == tzinfo1.Bias) && + (tzinfo.StandardBias == tzinfo1.StandardBias) && + (tzinfo.DaylightBias == tzinfo1.DaylightBias)), + "Bias influenced by TZ variable\n"); + ok(SetEnvironmentVariableA("TZ",NULL) != 0, + "SetEnvironmentVariableA failed\n"); + +} + +void test_FileTimeToSystemTime() +{ + FILETIME ft; + SYSTEMTIME st; + ULONGLONG time = (ULONGLONG)TICKSPERSEC + TICKS_1601_TO_1970; + + ft.dwHighDateTime = 0; + ft.dwLowDateTime = 0; + ok(FileTimeToSystemTime(&ft, &st), + "FileTimeToSystemTime() failed with Error 0x%08lx\n",GetLastError()); + ok(((st.wYear == 1601) && (st.wMonth == 1) && (st.wDay == 1) && + (st.wHour == 0) && (st.wMinute == 0) && (st.wSecond == 0) && + (st.wMilliseconds == 0)), + "Got Year %4d Month %2d Day %2d\n", st.wYear, st.wMonth, st.wDay); + + ft.dwHighDateTime = (UINT)(time >> 32); + ft.dwLowDateTime = (UINT)time; + ok(FileTimeToSystemTime(&ft, &st), + "FileTimeToSystemTime() failed with Error 0x%08lx\n",GetLastError()); + ok(((st.wYear == 1970) && (st.wMonth == 1) && (st.wDay == 1) && + (st.wHour == 0) && (st.wMinute == 0) && (st.wSecond == 1) && + (st.wMilliseconds == 0)), + "Got Year %4d Month %2d Day %2d Hour %2d Min %2d Sec %2d mSec %3d\n", + st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, + st.wMilliseconds); +} + +void test_FileTimeToLocalFileTime() +{ + FILETIME ft, lft; + SYSTEMTIME st; + TIME_ZONE_INFORMATION tzinfo; + DWORD res = GetTimeZoneInformation(&tzinfo); + ULONGLONG time = (ULONGLONG)TICKSPERSEC + TICKS_1601_TO_1970 + + (ULONGLONG)tzinfo.Bias*SECSPERMIN *TICKSPERSEC; + + ok( res != 0, "GetTimeZoneInformation failed\n"); + ft.dwHighDateTime = (UINT)(time >> 32); + ft.dwLowDateTime = (UINT)time; + ok(FileTimeToLocalFileTime(&ft, &lft) !=0 , + "FileTimeToLocalFileTime() failed with Error 0x%08lx\n",GetLastError()); + FileTimeToSystemTime(&lft, &st); + ok(((st.wYear == 1970) && (st.wMonth == 1) && (st.wDay == 1) && + (st.wHour == 0) && (st.wMinute == 0) && (st.wSecond == 1) && + (st.wMilliseconds == 0)), + "Got Year %4d Month %2d Day %2d Hour %2d Min %2d Sec %2d mSec %3d\n", + st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, + st.wMilliseconds); + + ok(SetEnvironmentVariableA("TZ","GMT") != 0, + "SetEnvironmentVariableA failed\n"); + ok(res != 0, "GetTimeZoneInformation failed\n"); + ok(FileTimeToLocalFileTime(&ft, &lft) !=0 , + "FileTimeToLocalFileTime() failed with Error 0x%08lx\n",GetLastError()); + FileTimeToSystemTime(&lft, &st); + ok(((st.wYear == 1970) && (st.wMonth == 1) && (st.wDay == 1) && + (st.wHour == 0) && (st.wMinute == 0) && (st.wSecond == 1) && + (st.wMilliseconds == 0)), + "Got Year %4d Month %2d Day %2d Hour %2d Min %2d Sec %2d mSec %3d\n", + st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, + st.wMilliseconds); + ok(SetEnvironmentVariableA("TZ",NULL) != 0, + "SetEnvironmentVariableA failed\n"); +} + +START_TEST(time) +{ + test_GetTimeZoneInformation(); + test_FileTimeToSystemTime(); + test_FileTimeToLocalFileTime(); + +} From 3eb8552cf1871b82776b781f2a04031405ce9628 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Tue, 4 May 2004 20:03:37 +0000 Subject: [PATCH 1035/1463] - Remove old RPCRT4. svn path=/trunk/; revision=9302 --- reactos/lib/rpcrt4/.cvsignore | 6 - reactos/lib/rpcrt4/Makefile | 47 -- reactos/lib/rpcrt4/Makefile.old | 140 ------ reactos/lib/rpcrt4/rpcrt4.def | 16 - reactos/lib/rpcrt4/rpcrt4.edf | 16 - reactos/lib/rpcrt4/rpcrt4.rc | 38 -- reactos/lib/rpcrt4/rpcrt4_main.c | 729 ------------------------------- 7 files changed, 992 deletions(-) delete mode 100644 reactos/lib/rpcrt4/.cvsignore delete mode 100644 reactos/lib/rpcrt4/Makefile delete mode 100644 reactos/lib/rpcrt4/Makefile.old delete mode 100644 reactos/lib/rpcrt4/rpcrt4.def delete mode 100644 reactos/lib/rpcrt4/rpcrt4.edf delete mode 100644 reactos/lib/rpcrt4/rpcrt4.rc delete mode 100644 reactos/lib/rpcrt4/rpcrt4_main.c diff --git a/reactos/lib/rpcrt4/.cvsignore b/reactos/lib/rpcrt4/.cvsignore deleted file mode 100644 index a2a90a48943..00000000000 --- a/reactos/lib/rpcrt4/.cvsignore +++ /dev/null @@ -1,6 +0,0 @@ -*.coff -*.dll -*.o -*.d -*.sym -*.map diff --git a/reactos/lib/rpcrt4/Makefile b/reactos/lib/rpcrt4/Makefile deleted file mode 100644 index 21bd5a1e2f0..00000000000 --- a/reactos/lib/rpcrt4/Makefile +++ /dev/null @@ -1,47 +0,0 @@ - -PATH_TO_TOP = ../.. - -TARGET_TYPE = dynlink - -TARGET_NAME = rpcrt4 - -TARGET_BASE=0x76000000 - -TARGET_CFLAGS = \ - -Wall \ - -fno-builtin - -# Compile definitions usage: -# __USE_W32API - Compilation with w32api headers -# __REACTOS__ - Compilation of Wine sources for ReactOS -# _WIN32_IE=0x600 - Internet Explorer 6 compatible defintions -# WINVER=0x501 - Windows XP definitions -# __need_offsetof - Force definition of macro offsetof in stddef.h -# -DEFINES = \ - -D_DISABLE_TIDENTS \ - -D__USE_W32API \ - -D__REACTOS__ \ - -D_WIN32_IE=0x600 \ - -D_WIN32_WINNT=0x501 \ - -DWINVER=0x501 \ - -DCOBJMACROS \ - -D__need_offsetof - -TARGET_CFLAGS += \ - $(DEFINES) \ - -DDCX_USESTYLE=0x10000L \ - -I$(PATH_TO_TOP)/include/wine - -TARGET_RCFLAGS += -D__REACTOS__ -D_WIN32_IE=0x600 -D_WIN32_WINNT=0x501 - -TARGET_SDKLIBS = libwine.a ntdll.a - -TARGET_OBJECTS = \ -rpcrt4_main.o - -include $(PATH_TO_TOP)/rules.mak - -include $(TOOLS_PATH)/helper.mk - -include $(TOOLS_PATH)/config.mk diff --git a/reactos/lib/rpcrt4/Makefile.old b/reactos/lib/rpcrt4/Makefile.old deleted file mode 100644 index e84f63d2e1e..00000000000 --- a/reactos/lib/rpcrt4/Makefile.old +++ /dev/null @@ -1,140 +0,0 @@ -# $Id: Makefile.old,v 1.1 2003/08/27 05:07:19 sedwards Exp $ -# -# ReactOS Operating System -# -PATH_TO_TOP = ../.. - -TARGET = midl rpcrt4 rpcss - -BASE_CFLAGS = -I../../include - -CFLAGS = $(CFLAGS) - -# require os code to explicitly request A/W version of structs/functions -CFLAGS += -D_DISABLE_TIDENTS - -midl: - -DLLTARGET=$(TARGET).dll - - -all: $(DLLTARGET) - -SYNCH_OBJECTS = synch/critical.o synch/event.o synch/wait.o synch/intrlck.o synch/timer.o - -MISC_OBJECTS = misc/error.o misc/atom.o misc/handle.o misc/env.o misc/dllmain.o \ - misc/console.o misc/time.o misc/stubs.o misc/rtl.o misc/ldr.o misc/res.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 \ - file/create.o file/find.o file/copy.o file/pipe.o \ - file/move.o file/lock.o file/rw.o file/delete.o - -MEM_OBJECTS = mem/virtual.o mem/heap.o mem/utils.o mem/section.o mem/isbad.o mem/procmem.o - -NLS_OBJECTS = nls/codepage.o nls/cpmisc.o nls/cptable.o\ - nls/cp37.o nls/cp437.o nls/cp500.o nls/cp737.o nls/cp775.o nls/cp850.o nls/cp852.o nls/cp855.o nls/cp857.o\ - nls/cp860.o nls/cp861.o nls/cp863.o nls/cp865.o nls/cp866.o nls/cp869.o nls/cp875.o nls/cp1026.o\ - nls/cp1250.o nls/cp1251.o nls/cp1252.o nls/cp1253.o nls/cp1254.o nls/cp1255.o nls/cp1256.o nls/cp1257.o\ - nls/cp10000.o nls/cp10006.o nls/cp10007.o nls/cp10029.o nls/cp10079.o nls/cp10081.o\ - nls/lctable.o\ - nls/lcAFK.o nls/lcBEL.o nls/lcBGR.o nls/lcCAT.o nls/lcCSY.o nls/lcDAN.o\ - nls/lcDEA.o nls/lcDEC.o nls/lcDEL.o nls/lcDES.o nls/lcDEU.o\ - nls/lcELL.o\ - nls/lcENA.o nls/lcENB.o nls/lcENC.o nls/lcENG.o nls/lcENI.o nls/lcENJ.o nls/lcENL.o nls/lcENS.o nls/lcENT.o\ - nls/lcENU.o nls/lcENZ.o\ - nls/lcESA.o nls/lcESB.o nls/lcESC.o nls/lcESD.o nls/lcESE.o nls/lcESF.o nls/lcESG.o nls/lcESH.o nls/lcESI.o\ - nls/lcESL.o nls/lcESM.o nls/lcESN.o nls/lcESO.o nls/lcESP.o nls/lcESR.o nls/lcESS.o nls/lcESU.o nls/lcESV.o\ - nls/lcESY.o nls/lcESZ.o\ - nls/lcETI.o nls/lcEUQ.o nls/lcFIN.o nls/lcFOS.o\ - nls/lcFRA.o nls/lcFRB.o nls/lcFRC.o nls/lcFRL.o nls/lcFRS.o\ - nls/lcHRV.o nls/lcHUN.o nls/lcIND.o nls/lcISL.o nls/lcITA.o nls/lcITS.o nls/lcLTH.o nls/lcLVI.o nls/lcNLB.o\ - nls/lcNLD.o nls/lcNON.o nls/lcNOR.o nls/lcPLK.o nls/lcPTB.o nls/lcPTG.o nls/lcROM.o nls/lcRUS.o nls/lcSKY.o\ - nls/lcSLV.o nls/lcSQI.o nls/lcSRB.o nls/lcSRL.o nls/lcSVE.o nls/lcSVF.o nls/lcTRK.o nls/lcUKR.o\ - nls/locale.o nls/mbtowc.o nls/wctomb.o nls/ole2nls.o - -THREAD_OBJECTS = thread/thread.o thread/tls.o - -PROCESS_OBJECTS = process/proc.o process/cmdline.o process/create.o \ - process/lib.o - -STRING_OBJECTS = string/lstring.o - -INTERNAL_OBJECTS = internal/dprintf.o - -EXCEPT_OBJECTS = except/except.o - -RESOURCE_OBJECT = $(TARGET).coff - - -OBJECTS = $(MISC_OBJECTS) $(FILE_OBJECTS) $(THREAD_OBJECTS) \ - $(PROCESS_OBJECTS) $(STRING_OBJECTS) $(MEM_OBJECTS) \ - $(INTERNAL_OBJECTS) $(SYNCH_OBJECTS) $(EXCEPT_OBJECTS) \ - $(RESOURCE_OBJECT) - -CLEAN_FILES = except/*.o file/*.o internal/*.o mem/*.o misc/*.o nls/*.o \ - process/*.o string/*.o synch/*.o thread/*.o \ - $(TARGET).o $(TARGET).a junk.tmp base.tmp temp.exp \ - $(TARGET).dll $(TARGET).sym $(TARGET).coff - -nls/ole2nls.o: nls/ole2nls.c - $(CC) $(CFLAGS) -I. nls/ole2nls.c - -$(TARGET).coff: $(TARGET).rc ../../include/reactos/resource.h - -$(TARGET).a: $(OBJECTS) - $(AR) csr $(TARGET).a $(OBJECTS) - -$(TARGET).dll: $(DLLMAIN) $(OBJECTS) $(TARGET).def - $(LD) \ - -r $(OBJECTS) \ - -o $(TARGET).o - $(DLLTOOL) \ - --dllname $(TARGET).dll \ - --def $(TARGET).def \ - --kill-at \ - --output-lib $(TARGET).a - $(CC) \ - -specs=k32_specs \ - -mdll \ - -o junk.tmp \ - -Wl,--base-file,base.tmp \ - $(TARGET).o \ - ../ntdll/ntdll.a - - $(RM) junk.tmp - $(DLLTOOL) \ - --dllname $(TARGET).dll \ - --base-file base.tmp \ - --output-exp temp.exp \ - --def $(TARGET).edf - - $(RM) base.tmp - $(CC) \ - -specs=k32_specs \ - -mdll \ - -o $(TARGET).dll \ - $(TARGET).o \ - ../ntdll/ntdll.a \ - -Wl,--image-base,$(KERNEL32_BASE) \ - -Wl,--file-alignment,0x1000 \ - -Wl,--section-alignment,0x1000 \ - -Wl,temp.exp - - $(RM) temp.exp - $(NM) --numeric-sort $(TARGET).dll > $(TARGET).sym - -clean: - - $(RM) $(CLEAN_FILES) - -.PHONY: clean - -install: $(FLOPPY_DIR)/dlls/$(TARGET).dll - -$(FLOPPY_DIR)/dlls/$(TARGET).dll: $(TARGET).dll - $(CP) $(TARGET).dll $(FLOPPY_DIR)/dlls/$(TARGET).dll - -dist: $(DIST_DIR)/dlls/$(TARGET).dll - -$(DIST_DIR)/dlls/$(TARGET).dll: $(TARGET).dll - $(CP) $(TARGET).dll ../../$(DIST_DIR)/dlls/$(TARGET).dll - -WARNINGS_ARE_ERRORS = yes -include ../../rules.mak diff --git a/reactos/lib/rpcrt4/rpcrt4.def b/reactos/lib/rpcrt4/rpcrt4.def deleted file mode 100644 index b832bb486a3..00000000000 --- a/reactos/lib/rpcrt4/rpcrt4.def +++ /dev/null @@ -1,16 +0,0 @@ -LIBRARY rpcrt4.dll - -EXPORTS -UuidFromStringA@8 -UuidFromStringW@8 -UuidHash@8 -UuidToStringA@8 -UuidToStringW@8 -UuidCreateSequential@4 -UuidCreate@4 -UuidCreateNil@4 -UuidIsNil@8 -UuidEqual@12 -UuidCompare@12 -RpcStringFreeA@4 -RpcStringFreeW@4 \ No newline at end of file diff --git a/reactos/lib/rpcrt4/rpcrt4.edf b/reactos/lib/rpcrt4/rpcrt4.edf deleted file mode 100644 index 3f034fa0124..00000000000 --- a/reactos/lib/rpcrt4/rpcrt4.edf +++ /dev/null @@ -1,16 +0,0 @@ -LIBRARY rpcrt4.dll - -EXPORTS -UuidFromStringA=UuidFromStringA@8 -UuidFromStringW=UuidFromStringW@8 -UuidHash=UuidHash@8 -UuidToStringA=UuidToStringA@8 -UuidToStringW=UuidToStringW@8 -UuidCreateSequential=UuidCreateSequential@4 -UuidCreate=UuidCreate@4 -UuidCreateNil=UuidCreateNil@4 -UuidIsNil=UuidIsNil@8 -UuidEqual=UuidEqual@12 -UuidCompare=UuidCompare@12 -RpcStringFreeA=RpcStringFreeA@4 -RpcStringFreeW=RpcStringFreeW@4 \ No newline at end of file diff --git a/reactos/lib/rpcrt4/rpcrt4.rc b/reactos/lib/rpcrt4/rpcrt4.rc deleted file mode 100644 index 79a60408118..00000000000 --- a/reactos/lib/rpcrt4/rpcrt4.rc +++ /dev/null @@ -1,38 +0,0 @@ -#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", "Lempel-Ziv Expander\0" - VALUE "FileVersion", RES_STR_FILE_VERSION - VALUE "InternalName", "lz32\0" - VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT - VALUE "OriginalFilename", "lz32.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/rpcrt4/rpcrt4_main.c b/reactos/lib/rpcrt4/rpcrt4_main.c deleted file mode 100644 index 6b2ef9f153a..00000000000 --- a/reactos/lib/rpcrt4/rpcrt4_main.c +++ /dev/null @@ -1,729 +0,0 @@ -/* - * ReactOS - RPCRT4 - * Copyright 2000 Huw D M Davies for Codeweavers - * - * Gettimeofday - Copyright Wu Yongwei - * - * 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 - * - * NOTES: (sedwards) - * Dont use this for anything major in ReactOS. Its only here - * to make dll dependancys happy and for the UUIDCreate Function. - * - * If you wish to work on rpcrt4 in ReactOS please look at the current winehq - * sources and figure out a way to implement a IPC/LPC bridge so we dont have - * for this code from WINE. - * - * throw the code out and start over. =) - */ - -#include -#include -#include -#include -#include -#ifdef HAVE_SYS_TIME_H -# include -#endif -#ifdef HAVE_UNISTD_H -# include -#endif - -#include "windef.h" -#include "winerror.h" -#include "winbase.h" -#include "wine/unicode.h" -#include "rpc.h" - -#include "ole2.h" -#include "rpcndr.h" -#include "rpcproxy.h" - -#ifdef HAVE_SYS_FILE_H -# include -#endif -#ifdef HAVE_SYS_IOCTL_H -# include -#endif -#ifdef HAVE_SYS_SOCKET_H -# include -#endif -#ifdef HAVE_SYS_SOCKIO_H -# include -#endif -#ifdef HAVE_NET_IF_H -# include -#endif -#ifdef HAVE_NETINET_IN_H -# include -#endif - -#include "wine/config.h" -#include "wine/port.h" -#include "wine/debug.h" - -WINE_DEFAULT_DEBUG_CHANNEL(ole); - -static UUID uuid_nil; -static HANDLE master_mutex; - -HANDLE RPCRT4_GetMasterMutex(void) -{ - return master_mutex; -} - -/*********************************************************************** - * DllMain - * - * PARAMS - * hinstDLL [I] handle to the DLL's instance - * fdwReason [I] - * lpvReserved [I] reserved, must be NULL - * - * RETURNS - * Success: TRUE - * Failure: FALSE - */ - -BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) -{ - switch (fdwReason) { - case DLL_PROCESS_ATTACH: - break; - - case DLL_PROCESS_DETACH: - break; - } - - return TRUE; -} - -/* From WINE RPC_Binding.c */ -LPWSTR RPCRT4_strdupAtoW(LPSTR src) -{ - DWORD len; - LPWSTR s; - if (!src) return NULL; - len = MultiByteToWideChar(CP_ACP, 0, src, -1, NULL, 0); - s = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR)); - MultiByteToWideChar(CP_ACP, 0, src, -1, s, len); - return s; -} - -/************************************************************************* - * RpcStringFreeA [RPCRT4.@] - * - * Frees a character string allocated by the RPC run-time library. - * - * RETURNS - * - * S_OK if successful. - */ -RPC_STATUS WINAPI RpcStringFreeA(unsigned char** String) -{ - HeapFree( GetProcessHeap(), 0, *String); - - return RPC_S_OK; -} - -/************************************************************************* - * RpcStringFreeW [RPCRT4.@] - * - * Frees a character string allocated by the RPC run-time library. - * - * RETURNS - * - * S_OK if successful. - */ -RPC_STATUS WINAPI RpcStringFreeW(unsigned short** String) -{ - HeapFree( GetProcessHeap(), 0, *String); - - return RPC_S_OK; -} - -/************************************************************************* - * RpcRaiseException [RPCRT4.@] - * - * Raises an exception. - */ -void WINAPI RpcRaiseException(RPC_STATUS exception) -{ - /* FIXME: translate exception? */ - RaiseException(exception, 0, 0, NULL); -} - -/************************************************************************* - * UuidCompare [RPCRT4.@] - * - * (an educated-guess implementation) - * - * PARAMS - * UUID *Uuid1 [I] Uuid to compare - * UUID *Uuid2 [I] Uuid to compare - * RPC_STATUS *Status [O] returns RPC_S_OK - * - * RETURNS - * -1 if Uuid1 is less than Uuid2 - * 0 if Uuid1 and Uuid2 are equal - * 1 if Uuid1 is greater than Uuid2 - */ -int WINAPI UuidCompare(UUID *Uuid1, UUID *Uuid2, RPC_STATUS *Status) -{ - TRACE("(%s,%s)\n", debugstr_guid(Uuid1), debugstr_guid(Uuid2)); - *Status = RPC_S_OK; - if (!Uuid1) Uuid1 = &uuid_nil; - if (!Uuid2) Uuid2 = &uuid_nil; - if (Uuid1 == Uuid2) return 0; - return memcmp(Uuid1, Uuid2, sizeof(UUID)); -} - -/************************************************************************* - * UuidEqual [RPCRT4.@] - * - * PARAMS - * UUID *Uuid1 [I] Uuid to compare - * UUID *Uuid2 [I] Uuid to compare - * RPC_STATUS *Status [O] returns RPC_S_OK - * - * RETURNS - * TRUE/FALSE - */ -int WINAPI UuidEqual(UUID *Uuid1, UUID *Uuid2, RPC_STATUS *Status) -{ - TRACE("(%s,%s)\n", debugstr_guid(Uuid1), debugstr_guid(Uuid2)); - return !UuidCompare(Uuid1, Uuid2, Status); -} - -/************************************************************************* - * UuidIsNil [RPCRT4.@] - * - * PARAMS - * UUID *Uuid [I] Uuid to compare - * RPC_STATUS *Status [O] retuns RPC_S_OK - * - * RETURNS - * TRUE/FALSE - */ -int WINAPI UuidIsNil(UUID *uuid, RPC_STATUS *Status) -{ - TRACE("(%s)\n", debugstr_guid(uuid)); - *Status = RPC_S_OK; - if (!uuid) return TRUE; - return !memcmp(uuid, &uuid_nil, sizeof(UUID)); -} - - /************************************************************************* - * UuidCreateNil [RPCRT4.@] - * - * PARAMS - * UUID *Uuid [O] returns a nil UUID - * - * RETURNS - * RPC_S_OK - */ -RPC_STATUS WINAPI UuidCreateNil(UUID *Uuid) -{ - *Uuid = uuid_nil; - return RPC_S_OK; -} - - /************************************************************************* - * gettimeofday for systems that lack it - */ - -#ifndef __GNUC__ -#define EPOCHFILETIME (116444736000000000i64) -#else -#define EPOCHFILETIME (116444736000000000LL) -#endif - -struct timezone { - int tz_minuteswest; /* minutes W of Greenwich */ - int tz_dsttime; /* type of dst correction */ -}; - -int gettimeofday(struct timeval *tv, struct timezone *tz) -{ - FILETIME ft; - LARGE_INTEGER li; - __int64 t; - static int tzflag; - - if (tv) - { - GetSystemTimeAsFileTime(&ft); - li.LowPart = ft.dwLowDateTime; - li.HighPart = ft.dwHighDateTime; - t = li.QuadPart; /* In 100-nanosecond intervals */ - t -= EPOCHFILETIME; /* Offset to the Epoch time */ - t /= 10; /* In microseconds */ - tv->tv_sec = (long)(t / 1000000); - tv->tv_usec = (long)(t % 1000000); - } - - if (tz) - { - if (!tzflag) - { - _tzset(); - tzflag++; - } - tz->tz_minuteswest = _timezone / 60; - tz->tz_dsttime = _daylight; - } - - return 0; -} - -/************************************************************************* - * UuidCreate [RPCRT4.@] - * - * Creates a 128bit UUID. - * Implemented according the DCE specification for UUID generation. - * Code is based upon uuid library in e2fsprogs by Theodore Ts'o. - * Copyright (C) 1996, 1997 Theodore Ts'o. - * - * RETURNS - * - * S_OK if successful. - */ -RPC_STATUS WINAPI UuidCreate(UUID *Uuid) -{ - static char has_init = 0; - static unsigned char a[6]; - static int adjustment = 0; - static struct timeval last = {0, 0}; - static WORD clock_seq; - struct timeval tv; - unsigned long long clock_reg; - DWORD clock_high, clock_low; - WORD temp_clock_seq, temp_clock_mid, temp_clock_hi_and_version; -#ifdef HAVE_NET_IF_H - int sd; - struct ifreq ifr, *ifrp; - struct ifconf ifc; - char buf[1024]; - int n, i; -#endif - - /* Have we already tried to get the MAC address? */ - if (!has_init) { -#ifdef HAVE_NET_IF_H - /* BSD 4.4 defines the size of an ifreq to be - * max(sizeof(ifreq), sizeof(ifreq.ifr_name)+ifreq.ifr_addr.sa_len - * However, under earlier systems, sa_len isn't present, so - * the size is just sizeof(struct ifreq) - */ -#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN -# ifndef max -# define max(a,b) ((a) > (b) ? (a) : (b)) -# endif -# define ifreq_size(i) max(sizeof(struct ifreq),\ -sizeof((i).ifr_name)+(i).ifr_addr.sa_len) -# else -# define ifreq_size(i) sizeof(struct ifreq) -# endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */ - - sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); - if (sd < 0) { - /* if we can't open a socket, just use random numbers */ - /* set the multicast bit to prevent conflicts with real cards */ - a[0] = (rand() & 0xff) | 0x80; - a[1] = rand() & 0xff; - a[2] = rand() & 0xff; - a[3] = rand() & 0xff; - a[4] = rand() & 0xff; - a[5] = rand() & 0xff; - } else { - memset(buf, 0, sizeof(buf)); - ifc.ifc_len = sizeof(buf); - ifc.ifc_buf = buf; - /* get the ifconf interface */ - if (ioctl (sd, SIOCGIFCONF, (char *)&ifc) < 0) { - close(sd); - /* no ifconf, so just use random numbers */ - /* set the multicast bit to prevent conflicts with real cards */ - a[0] = (rand() & 0xff) | 0x80; - a[1] = rand() & 0xff; - a[2] = rand() & 0xff; - a[3] = rand() & 0xff; - a[4] = rand() & 0xff; - a[5] = rand() & 0xff; - } else { - /* loop through the interfaces, looking for a valid one */ - n = ifc.ifc_len; - for (i = 0; i < n; i+= ifreq_size(ifr) ) { - ifrp = (struct ifreq *)((char *) ifc.ifc_buf+i); - strncpy(ifr.ifr_name, ifrp->ifr_name, IFNAMSIZ); - /* try to get the address for this interface */ -# ifdef SIOCGIFHWADDR - if (ioctl(sd, SIOCGIFHWADDR, &ifr) < 0) - continue; - memcpy(a, (unsigned char *)&ifr.ifr_hwaddr.sa_data, 6); -# else -# ifdef SIOCGENADDR - if (ioctl(sd, SIOCGENADDR, &ifr) < 0) - continue; - memcpy(a, (unsigned char *) ifr.ifr_enaddr, 6); -# else - /* XXX we don't have a way of getting the hardware address */ - close(sd); - a[0] = 0; - break; -# endif /* SIOCGENADDR */ -# endif /* SIOCGIFHWADDR */ - /* make sure it's not blank */ - if (!a[0] && !a[1] && !a[2] && !a[3] && !a[4] && !a[5]) - continue; - - goto valid_address; - } - /* if we didn't find a valid address, make a random one */ - /* once again, set multicast bit to avoid conflicts */ - a[0] = (rand() & 0xff) | 0x80; - a[1] = rand() & 0xff; - a[2] = rand() & 0xff; - a[3] = rand() & 0xff; - a[4] = rand() & 0xff; - a[5] = rand() & 0xff; - - valid_address: - close(sd); - } - } -#else - /* no networking info, so generate a random address */ - a[0] = (rand() & 0xff) | 0x80; - a[1] = rand() & 0xff; - a[2] = rand() & 0xff; - a[3] = rand() & 0xff; - a[4] = rand() & 0xff; - a[5] = rand() & 0xff; -#endif /* HAVE_NET_IF_H */ - has_init = 1; - } - - /* generate time element of GUID */ - - /* Assume that the gettimeofday() has microsecond granularity */ -#define MAX_ADJUSTMENT 10 - - try_again: - gettimeofday(&tv, 0); - if ((last.tv_sec == 0) && (last.tv_usec == 0)) { - clock_seq = ((rand() & 0xff) << 8) + (rand() & 0xff); - clock_seq &= 0x1FFF; - last = tv; - last.tv_sec--; - } - if ((tv.tv_sec < last.tv_sec) || - ((tv.tv_sec == last.tv_sec) && - (tv.tv_usec < last.tv_usec))) { - clock_seq = (clock_seq+1) & 0x1FFF; - adjustment = 0; - } else if ((tv.tv_sec == last.tv_sec) && - (tv.tv_usec == last.tv_usec)) { - if (adjustment >= MAX_ADJUSTMENT) - goto try_again; - adjustment++; - } else - adjustment = 0; - - clock_reg = tv.tv_usec*10 + adjustment; - clock_reg += ((unsigned long long) tv.tv_sec)*10000000; - clock_reg += (((unsigned long long) 0x01B21DD2) << 32) + 0x13814000; - - clock_high = clock_reg >> 32; - clock_low = clock_reg; - temp_clock_seq = clock_seq | 0x8000; - temp_clock_mid = (WORD)clock_high; - temp_clock_hi_and_version = (clock_high >> 16) | 0x1000; - - /* pack the information into the GUID structure */ - - ((unsigned char*)&Uuid->Data1)[3] = (unsigned char)clock_low; - clock_low >>= 8; - ((unsigned char*)&Uuid->Data1)[2] = (unsigned char)clock_low; - clock_low >>= 8; - ((unsigned char*)&Uuid->Data1)[1] = (unsigned char)clock_low; - clock_low >>= 8; - ((unsigned char*)&Uuid->Data1)[0] = (unsigned char)clock_low; - - ((unsigned char*)&Uuid->Data2)[1] = (unsigned char)temp_clock_mid; - temp_clock_mid >>= 8; - ((unsigned char*)&Uuid->Data2)[0] = (unsigned char)temp_clock_mid; - - ((unsigned char*)&Uuid->Data3)[1] = (unsigned char)temp_clock_hi_and_version; - temp_clock_hi_and_version >>= 8; - ((unsigned char*)&Uuid->Data3)[0] = (unsigned char)temp_clock_hi_and_version; - - ((unsigned char*)Uuid->Data4)[1] = (unsigned char)temp_clock_seq; - temp_clock_seq >>= 8; - ((unsigned char*)Uuid->Data4)[0] = (unsigned char)temp_clock_seq; - - ((unsigned char*)Uuid->Data4)[2] = a[0]; - ((unsigned char*)Uuid->Data4)[3] = a[1]; - ((unsigned char*)Uuid->Data4)[4] = a[2]; - ((unsigned char*)Uuid->Data4)[5] = a[3]; - ((unsigned char*)Uuid->Data4)[6] = a[4]; - ((unsigned char*)Uuid->Data4)[7] = a[5]; - - TRACE("%s\n", debugstr_guid(Uuid)); - - return RPC_S_OK; -} - - -/************************************************************************* - * UuidCreateSequential [RPCRT4.@] - * - * Creates a 128bit UUID by calling UuidCreate. - * New API in Win 2000 - */ -RPC_STATUS WINAPI UuidCreateSequential(UUID *Uuid) -{ - return UuidCreate (Uuid); -} - - -/************************************************************************* - * UuidHash [RPCRT4.@] - * - * Generates a hash value for a given UUID - * - * Code based on FreeDCE implementation - * - */ -unsigned short WINAPI UuidHash(UUID *uuid, RPC_STATUS *Status) -{ - BYTE *data = (BYTE*)uuid; - short c0 = 0, c1 = 0, x, y; - int i; - - if (!uuid) data = (BYTE*)(uuid = &uuid_nil); - - TRACE("(%s)\n", debugstr_guid(uuid)); - - for (i=0; iData1, Uuid->Data2, Uuid->Data3, - Uuid->Data4[0], Uuid->Data4[1], Uuid->Data4[2], - Uuid->Data4[3], Uuid->Data4[4], Uuid->Data4[5], - Uuid->Data4[6], Uuid->Data4[7] ); - - return RPC_S_OK; -} - -/************************************************************************* - * UuidToStringW [RPCRT4.@] - * - * Converts a UUID to a string. - * - * S_OK if successful. - * S_OUT_OF_MEMORY if unsucessful. - */ -RPC_STATUS WINAPI UuidToStringW(UUID *Uuid, unsigned short** StringUuid) -{ - char buf[37]; - - if (!Uuid) Uuid = &uuid_nil; - - sprintf(buf, "%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", - Uuid->Data1, Uuid->Data2, Uuid->Data3, - Uuid->Data4[0], Uuid->Data4[1], Uuid->Data4[2], - Uuid->Data4[3], Uuid->Data4[4], Uuid->Data4[5], - Uuid->Data4[6], Uuid->Data4[7] ); - - *StringUuid = RPCRT4_strdupAtoW(buf); - - if(!(*StringUuid)) - return RPC_S_OUT_OF_MEMORY; - - return RPC_S_OK; -} - -static const BYTE hex2bin[] = -{ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x00 */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x10 */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x20 */ - 0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0, /* 0x30 */ - 0,10,11,12,13,14,15,0,0,0,0,0,0,0,0,0, /* 0x40 */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x50 */ - 0,10,11,12,13,14,15 /* 0x60 */ -}; - -/*********************************************************************** - * UuidFromStringA (RPCRT4.@) - */ -RPC_STATUS WINAPI UuidFromStringA(unsigned char* str, UUID *uuid) -{ - BYTE *s = (BYTE *)str; - int i; - - if (!s) return UuidCreateNil( uuid ); - - if (strlen(s) != 36) return RPC_S_INVALID_STRING_UUID; - - if ((s[8]!='-') || (s[13]!='-') || (s[18]!='-') || (s[23]!='-')) - return RPC_S_INVALID_STRING_UUID; - - for (i=0; i<36; i++) - { - if ((i == 8)||(i == 13)||(i == 18)||(i == 23)) continue; - if (s[i] > 'f' || (!hex2bin[s[i]] && s[i] != '0')) return RPC_S_INVALID_STRING_UUID; - } - - /* in form XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX */ - - uuid->Data1 = (hex2bin[s[0]] << 28 | hex2bin[s[1]] << 24 | hex2bin[s[2]] << 20 | hex2bin[s[3]] << 16 | - hex2bin[s[4]] << 12 | hex2bin[s[5]] << 8 | hex2bin[s[6]] << 4 | hex2bin[s[7]]); - uuid->Data2 = hex2bin[s[9]] << 12 | hex2bin[s[10]] << 8 | hex2bin[s[11]] << 4 | hex2bin[s[12]]; - uuid->Data3 = hex2bin[s[14]] << 12 | hex2bin[s[15]] << 8 | hex2bin[s[16]] << 4 | hex2bin[s[17]]; - - /* these are just sequential bytes */ - uuid->Data4[0] = hex2bin[s[19]] << 4 | hex2bin[s[20]]; - uuid->Data4[1] = hex2bin[s[21]] << 4 | hex2bin[s[22]]; - uuid->Data4[2] = hex2bin[s[24]] << 4 | hex2bin[s[25]]; - uuid->Data4[3] = hex2bin[s[26]] << 4 | hex2bin[s[27]]; - uuid->Data4[4] = hex2bin[s[28]] << 4 | hex2bin[s[29]]; - uuid->Data4[5] = hex2bin[s[30]] << 4 | hex2bin[s[31]]; - uuid->Data4[6] = hex2bin[s[32]] << 4 | hex2bin[s[33]]; - uuid->Data4[7] = hex2bin[s[34]] << 4 | hex2bin[s[35]]; - return RPC_S_OK; -} - - -/*********************************************************************** - * UuidFromStringW (RPCRT4.@) - */ -RPC_STATUS WINAPI UuidFromStringW(unsigned short* s, UUID *uuid) -{ - int i; - - if (!s) return UuidCreateNil( uuid ); - - if (strlenW(s) != 36) return RPC_S_INVALID_STRING_UUID; - - if ((s[8]!='-') || (s[13]!='-') || (s[18]!='-') || (s[23]!='-')) - return RPC_S_INVALID_STRING_UUID; - - for (i=0; i<36; i++) - { - if ((i == 8)||(i == 13)||(i == 18)||(i == 23)) continue; - if (s[i] > 'f' || (!hex2bin[s[i]] && s[i] != '0')) return RPC_S_INVALID_STRING_UUID; - } - - /* in form XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX */ - - uuid->Data1 = (hex2bin[s[0]] << 28 | hex2bin[s[1]] << 24 | hex2bin[s[2]] << 20 | hex2bin[s[3]] << 16 | - hex2bin[s[4]] << 12 | hex2bin[s[5]] << 8 | hex2bin[s[6]] << 4 | hex2bin[s[7]]); - uuid->Data2 = hex2bin[s[9]] << 12 | hex2bin[s[10]] << 8 | hex2bin[s[11]] << 4 | hex2bin[s[12]]; - uuid->Data3 = hex2bin[s[14]] << 12 | hex2bin[s[15]] << 8 | hex2bin[s[16]] << 4 | hex2bin[s[17]]; - - /* these are just sequential bytes */ - uuid->Data4[0] = hex2bin[s[19]] << 4 | hex2bin[s[20]]; - uuid->Data4[1] = hex2bin[s[21]] << 4 | hex2bin[s[22]]; - uuid->Data4[2] = hex2bin[s[24]] << 4 | hex2bin[s[25]]; - uuid->Data4[3] = hex2bin[s[26]] << 4 | hex2bin[s[27]]; - uuid->Data4[4] = hex2bin[s[28]] << 4 | hex2bin[s[29]]; - uuid->Data4[5] = hex2bin[s[30]] << 4 | hex2bin[s[31]]; - uuid->Data4[6] = hex2bin[s[32]] << 4 | hex2bin[s[33]]; - uuid->Data4[7] = hex2bin[s[34]] << 4 | hex2bin[s[35]]; - return RPC_S_OK; -} - -/*********************************************************************** - * DllRegisterServer (RPCRT4.@) - */ - -HRESULT WINAPI RPCRT4_DllRegisterServer( void ) -{ - FIXME( "(): stub\n" ); - return S_OK; -} - -BOOL RPCRT4_StartRPCSS(void) -{ - PROCESS_INFORMATION pi; - STARTUPINFOA si; - static char cmd[6]; - BOOL rslt; - - ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); - ZeroMemory(&si, sizeof(STARTUPINFOA)); - si.cb = sizeof(STARTUPINFOA); - - /* apparently it's not OK to use a constant string below */ - CopyMemory(cmd, "rpcss", 6); - - /* FIXME: will this do the right thing when run as a test? */ - rslt = CreateProcessA( - NULL, /* executable */ - cmd, /* command line */ - NULL, /* process security attributes */ - NULL, /* primary thread security attributes */ - FALSE, /* inherit handles */ - 0, /* creation flags */ - NULL, /* use parent's environment */ - NULL, /* use parent's current directory */ - &si, /* STARTUPINFO pointer */ - &pi /* PROCESS_INFORMATION */ - ); - - if (rslt) { - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - } - - return rslt; -} From 1021b58459c8a64ad0b780345fcf060b782cc511 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Tue, 4 May 2004 20:10:07 +0000 Subject: [PATCH 1036/1463] - Merge RPC runtime from Wine. svn path=/trunk/; revision=9303 --- reactos/doc/README.WINE | 3 +- reactos/include/wine/rpcfc.h | 186 ++ reactos/include/wine/rpcss_shared.h | 146 ++ reactos/lib/rpcrt4/.cvsignore | 10 + reactos/lib/rpcrt4/Makefile | 9 + reactos/lib/rpcrt4/Makefile.in | 29 + reactos/lib/rpcrt4/Makefile.ros-template | 22 + reactos/lib/rpcrt4/cproxy.c | 325 ++++ reactos/lib/rpcrt4/cpsf.c | 256 +++ reactos/lib/rpcrt4/cpsf.h | 44 + reactos/lib/rpcrt4/cstub.c | 167 ++ reactos/lib/rpcrt4/ndr_marshall.c | 2118 ++++++++++++++++++++++ reactos/lib/rpcrt4/ndr_midl.c | 280 +++ reactos/lib/rpcrt4/ndr_misc.h | 53 + reactos/lib/rpcrt4/ndr_ole.c | 349 ++++ reactos/lib/rpcrt4/ndr_stubless.c | 99 + reactos/lib/rpcrt4/rpc_binding.c | 1162 ++++++++++++ reactos/lib/rpcrt4/rpc_binding.h | 86 + reactos/lib/rpcrt4/rpc_defs.h | 183 ++ reactos/lib/rpcrt4/rpc_epmap.c | 247 +++ reactos/lib/rpcrt4/rpc_message.c | 612 +++++++ reactos/lib/rpcrt4/rpc_message.h | 38 + reactos/lib/rpcrt4/rpc_misc.h | 28 + reactos/lib/rpcrt4/rpc_server.c | 1030 +++++++++++ reactos/lib/rpcrt4/rpc_server.h | 47 + reactos/lib/rpcrt4/rpcrt4.spec | 581 ++++++ reactos/lib/rpcrt4/rpcrt4_main.c | 750 ++++++++ reactos/lib/rpcrt4/rpcss_np_client.c | 154 ++ reactos/lib/rpcrt4/rpcss_np_client.h | 26 + reactos/lib/rpcrt4/winehq2ros.patch | 62 + 30 files changed, 9101 insertions(+), 1 deletion(-) create mode 100644 reactos/include/wine/rpcfc.h create mode 100644 reactos/include/wine/rpcss_shared.h create mode 100644 reactos/lib/rpcrt4/.cvsignore create mode 100644 reactos/lib/rpcrt4/Makefile create mode 100644 reactos/lib/rpcrt4/Makefile.in create mode 100644 reactos/lib/rpcrt4/Makefile.ros-template create mode 100644 reactos/lib/rpcrt4/cproxy.c create mode 100644 reactos/lib/rpcrt4/cpsf.c create mode 100644 reactos/lib/rpcrt4/cpsf.h create mode 100644 reactos/lib/rpcrt4/cstub.c create mode 100644 reactos/lib/rpcrt4/ndr_marshall.c create mode 100644 reactos/lib/rpcrt4/ndr_midl.c create mode 100644 reactos/lib/rpcrt4/ndr_misc.h create mode 100644 reactos/lib/rpcrt4/ndr_ole.c create mode 100644 reactos/lib/rpcrt4/ndr_stubless.c create mode 100644 reactos/lib/rpcrt4/rpc_binding.c create mode 100644 reactos/lib/rpcrt4/rpc_binding.h create mode 100644 reactos/lib/rpcrt4/rpc_defs.h create mode 100644 reactos/lib/rpcrt4/rpc_epmap.c create mode 100644 reactos/lib/rpcrt4/rpc_message.c create mode 100644 reactos/lib/rpcrt4/rpc_message.h create mode 100644 reactos/lib/rpcrt4/rpc_misc.h create mode 100644 reactos/lib/rpcrt4/rpc_server.c create mode 100644 reactos/lib/rpcrt4/rpc_server.h create mode 100644 reactos/lib/rpcrt4/rpcrt4.spec create mode 100644 reactos/lib/rpcrt4/rpcrt4_main.c create mode 100644 reactos/lib/rpcrt4/rpcss_np_client.c create mode 100644 reactos/lib/rpcrt4/rpcss_np_client.h create mode 100644 reactos/lib/rpcrt4/winehq2ros.patch diff --git a/reactos/doc/README.WINE b/reactos/doc/README.WINE index d94a529d819..2cff3219531 100644 --- a/reactos/doc/README.WINE +++ b/reactos/doc/README.WINE @@ -42,7 +42,7 @@ reactos/lib/mpr # Synced to Wine-20040408 reactos/lib/ole32 # Synced to Wine-20040408 reactos/lib/oledlg # Synced to Wine-20040408 reactos/lib/richedit # Synced to Wine-20040408 -reactos/lib/rpcrt4 # Out of date+Hack. In need of new merge +reactos/lib/rpcrt4 # Synced to Wine-20040504 reactos/lib/shell32 # 2004/04/16: Heavy syncing in progress reactos/lib/shlwapi # Synced to Wine-20040408 reactos/lib/twain # Out of sync @@ -67,3 +67,4 @@ reactos/lib/user32/windows/mdi.c reactos/lib/gdi32/objects/linedda.c reactos/lib/kernel32/misc/errormsg.c reactos/lib/msvcrt/wine/* - C++ exception handing + ` \ No newline at end of file diff --git a/reactos/include/wine/rpcfc.h b/reactos/include/wine/rpcfc.h new file mode 100644 index 00000000000..7c1a06ea0e3 --- /dev/null +++ b/reactos/include/wine/rpcfc.h @@ -0,0 +1,186 @@ +/* + * RPC format chars, as found by studying MIDL output. + * Some, but not all, usage of these are explained on MSDN. + */ + +#ifndef __WINE_RPCFC_H +#define __WINE_RPCFC_H + +/* base types */ +#define RPC_FC_BYTE 0x01 +#define RPC_FC_CHAR 0x02 +#define RPC_FC_SMALL 0x03 +#define RPC_FC_USMALL 0x04 +#define RPC_FC_WCHAR 0x05 +#define RPC_FC_SHORT 0x06 +#define RPC_FC_USHORT 0x07 +#define RPC_FC_LONG 0x08 +#define RPC_FC_ULONG 0x09 +#define RPC_FC_FLOAT 0x0a +#define RPC_FC_HYPER 0x0b +#define RPC_FC_DOUBLE 0x0c +#define RPC_FC_ENUM16 0x0d +#define RPC_FC_ENUM32 0x0e + +#define RPC_FC_ERROR_STATUS_T 0x10 + +/* other stuff */ +#define RPC_FC_RP 0x11 /* reference pointer */ +#define RPC_FC_UP 0x12 /* unique pointer */ +#define RPC_FC_OP 0x13 /* unique pointer in object ? */ +#define RPC_FC_FP 0x14 /* full pointer */ +/* FC_RP/UP/OP/FP: flags, NdrFcShort(typeofs)/basetype */ +#define RPC_FC_P_ALLOCALLNODES 0x01 +#define RPC_FC_P_DONTFREE 0x02 +#define RPC_FC_P_ONSTACK 0x04 /* [alloced_on_stack] */ +#define RPC_FC_P_SIMPLEPOINTER 0x08 /* [simple_pointer] */ +#define RPC_FC_P_DEREF 0x10 + +#define RPC_FC_STRUCT 0x15 /* simple structure */ +/* FC_STRUCT: align-1, NdrFcShort(size), fields */ + +#define RPC_FC_PSTRUCT 0x16 /* simple structure w/ pointers */ +/* FC_PTRUCT: align-1, NdrFcShort(size), ptrs, fields */ + +#define RPC_FC_CSTRUCT 0x17 /* conformant structure */ + +#define RPC_FC_CPSTRUCT 0x18 /* conformant structure w/ pointers */ + +#define RPC_FC_BOGUS_STRUCT 0x1a /* complex structure */ + +#define RPC_FC_CARRAY 0x1b /* conformant array */ +/* FC_CARRAY: align-1, NdrFcShort(size), conformance, ptrs, fields */ +#define RPC_FC_CVARRAY 0x1c /* conformant varying array */ +/* FC_CARRAY: align-1, NdrFcShort(size), conformance, variance, ptrs, fields */ +#define RPC_FC_SMFARRAY 0x1d /* small (<64K) fixed array */ +/* FC_SMFARRAY: align-1, NdrFcShort(size), ptrs, fields */ + +#define RPC_FC_LGFARRAY 0x1e /* large (>= 64k) fixed array */ + +#define RPC_FC_SMVARRAY 0x1f /* small (<64k) varying array */ + +#define RPC_FC_LGVARRAY 0x20 /* large (>= 64k) varying array */ + +#define RPC_FC_BOGUS_ARRAY 0x21 /* complex array */ + +#define RPC_FC_C_CSTRING 0x22 +#define RPC_FC_C_WSTRING 0x25 + +#define RPC_FC_ENCAPSULATED_UNION 0x2a +#define RPC_FC_NON_ENCAPSULATED_UNION 0x2b + +#define RPC_FC_BYTE_COUNT_POINTER 0x2c /* [byte_count] ACF attribute */ + +#define RPC_FC_TRANSMIT_AS 0x2d +#define RPC_FC_REPRESENT_AS 0x2e + +#define RPC_FC_IP 0x2f /* interface pointer */ +/* FC_IP: FC_CONSTANT_IID iid */ +/* FC_IP: FC_PAD correlation */ + +#define RPC_FC_BIND_EXPLICIT 0x00 +#define RPC_FC_BIND_CONTEXT 0x30 + +#define RPC_FC_BIND_GENERIC 0x31 +#define RPC_FC_BIND_PRIMITIVE 0x32 +#define RPC_FC_AUTO_HANDLE 0x33 +#define RPC_FC_CALLBACK_HANDLE 0x34 +/* proc header: oiflags, NdrFcLong(rpcflags), NdrFcShort(procnum), NdrFcShort(stacksiz), + * oi2 header: NdrFcShort(clientbuf), NdrFcShort(servbuf), oi2flags, parmcount + * oi2 parameters: NdrFcShort(flags), NdrFcShort(stackofs), NdrFcShort(typeofs)/basetype */ + #define RPC_FC_PROC_OIF_FULLPTR 0x01 + #define RPC_FC_PROC_OIF_RPCSSALLOC 0x02 + #define RPC_FC_PROC_OIF_OBJECT 0x04 + #define RPC_FC_PROC_OIF_RPCFLAGS 0x08 + #define RPC_FC_PROC_OIF_OBJ_V2 0x20 + #define RPC_FC_PROC_OIF_NEWINIT 0x40 + + #define RPC_FC_PROC_OI2F_SRVMUSTSIZE 0x01 + #define RPC_FC_PROC_OI2F_CLTMUSTSIZE 0x02 + #define RPC_FC_PROC_OI2F_HASRETURN 0x04 + #define RPC_FC_PROC_OI2F_HASPIPES 0x08 + #define RPC_FC_PROC_OI2F_HASASYNCUUID 0x20 + #define RPC_FC_PROC_OI2F_HASEXTS 0x40 + #define RPC_FC_PROC_OI2F_HASASYNCHND 0x80 + #define RPC_FC_PROC_PF_MUSTSIZE 0x0001 + #define RPC_FC_PROC_PF_MUSTFREE 0x0002 + #define RPC_FC_PROC_PF_PIPE 0x0004 + #define RPC_FC_PROC_PF_IN 0x0008 + #define RPC_FC_PROC_PF_OUT 0x0010 + #define RPC_FC_PROC_PF_RETURN 0x0020 + #define RPC_FC_PROC_PF_BASETYPE 0x0040 + #define RPC_FC_PROC_PF_BYVAL 0x0080 + #define RPC_FC_PROC_PF_SIMPLEREF 0x0100 + #define RPC_FC_PROC_PF_DONTFREEINST 0x0200 + #define RPC_FC_PROC_PF_SAVEASYNC 0x0400 + #define RPC_FC_PROC_PF_SRVALLOCSIZE 0xe000 /* in 8 byte units */ +#define RPC_FC_PROC_EXT_NEWCORRDESC 0x01 +#define RPC_FC_PROC_EXT_CLIENTCORRCHECK 0x02 +#define RPC_FC_PROC_EXT_SERVERCORRCHECK 0x04 +#define RPC_FC_PROC_EXT_HASNOTIFY 0x08 +#define RPC_FC_PROC_EXT_HASNOTIFY2 0x10 + +#define RPC_FC_POINTER 0x36 + +#define RPC_FC_ALIGNM4 0x38 +#define RPC_FC_ALIGNM8 0x39 + +#define RPC_FC_STRUCTPAD2 0x3e + +#define RPC_FC_NO_REPEAT 0x46 +#define RPC_FC_FIXED_REPEAT 0x47 +#define RPC_FC_VARIABLE_REPEAT 0x48 +#define RPC_FC_FIXED_OFFSET 0x49 +#define RPC_FC_VARIABLE_OFFSET 0x4a + +#define RPC_FC_PP 0x4b /* pointer layout */ +/* FC_PP: FC_PAD layouts */ +/* layouts: FC_NO_REPEAT FC_PAD instance */ +/* instance: NdrFcShort(memofs), NdrFcShort(bufofs), desc */ + +#define RPC_FC_EMBEDDED_COMPLEX 0x4c +/* FC_EMBEDDED_COMPLEX: padding, NdrFcShort(typeofs) */ + +#define RPC_FC_IN_PARAM 0x4d +/* FC_IN_PARAM: stacksiz, NdrFcShort(typeofs) */ +#define RPC_FC_IN_PARAM_BASETYPE 0x4e +/* FC_IN_PARAM_BASETYPE: basetype */ +#define RPC_FC_IN_PARAM_NO_FREE_INST 0x4f +#define RPC_FC_IN_OUT_PARAM 0x50 +/* FC_IN_OUT_PARAM: stacksiz, NdrFcShort(typeofs) */ +#define RPC_FC_OUT_PARAM 0x51 +/* FC_OUT_PARAM: stacksiz, NdrFcShort(typeofs) */ +#define RPC_FC_RETURN_PARAM 0x52 +/* FC_RETURN_PARAM: stacksiz, NdrFcShort(typeofs) */ +#define RPC_FC_RETURN_PARAM_BASETYPE 0x53 +/* FC_RETURN_PARAM_BASETYPE: basetype */ + +#define RPC_FC_DEREFERENCE 0x54 + +#define RPC_FC_CALLBACK 0x59 + +#define RPC_FC_CONSTANT_IID 0x5a +/* FC_CONSTANT_IID: NdrFcLong(), NdrFcShort(), NdrFcShort(), 8x () */ + +#define RPC_FC_END 0x5b +#define RPC_FC_PAD 0x5c + +#define RPC_FC_USER_MARSHAL 0xb4 + +#define RPC_FC_INT3264 0xb8 +#define RPC_FC_UINT3264 0xb9 + +/* correlation types */ +#define RPC_FC_NORMAL_CONFORMANCE 0x00 +#define RPC_FC_POINTER_CONFORMANCE 0x10 +#define RPC_FC_TOP_LEVEL_CONFORMANCE 0x20 +#define RPC_FC_CONSTANT_CONFORMANCE 0x40 +#define RPC_FC_TOP_LEVEL_MULTID_CONFORMANCE 0x80 + +/* user marshal flags */ +#define USER_MARSHAL_UNIQUE 0x80 +#define USER_MARSHAL_REF 0x40 +#define USER_MARSHAL_POINTER 0xc0 +#define USER_MARSHAL_IID 0x20 + +#endif /* __WINE_RPCFC_H */ diff --git a/reactos/include/wine/rpcss_shared.h b/reactos/include/wine/rpcss_shared.h new file mode 100644 index 00000000000..6992f04a959 --- /dev/null +++ b/reactos/include/wine/rpcss_shared.h @@ -0,0 +1,146 @@ +/* + * RPCSS shared definitions + * + * Copyright (C) 2002 Greg Turner + * + * 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_RPCSS_SHARED_H +#define __WINE_RPCSS_SHARED_H + +#include +#include +#include +#include +#include + +#define RPCSS_NP_PROTOCOL_VERSION 0x0000 + +#define RPCSS_STRINGIFY_MACRO(x) RPCSS_STRINGIFY_MACRO2(x) +#define RPCSS_STRINGIFY_MACRO2(x) #x + +#define STRINGIFIED_RPCSS_NP_PROTOCOL_VERSION \ + RPCSS_STRINGIFY_MACRO(RPCSS_NP_PROTOCOL_VERSION) + +/* only local communications are supported so far on this pipe. + until this changes, we can just use a constant pipe-name */ +#define NAME_RPCSS_NAMED_PIPE \ + ("\\\\.\\pipe\\RpcssNP" STRINGIFIED_RPCSS_NP_PROTOCOL_VERSION) + +/* mutex is local only... perhaps this ought to be part of the pipe + protocol for remote wine<->wine connections? */ +#define RPCSS_MASTER_MUTEX_NAME \ + ("RPCSSMasterMutex" STRINGIFIED_RPCSS_NP_PROTOCOL_VERSION) + +/* payloads above 1K are fragmented into multiple messages */ +#define VARDATA_PAYLOAD_BYTES 1024 + +/* ick -- maybe we should pass a handle to a mailslot or something? */ +#define MAX_RPCSS_NP_REPLY_STRING_LEN 512 + +/* number of microseconds/10 to wait for master mutex before giving up */ +#define MASTER_MUTEX_TIMEOUT 6000000 + +/* number of miliseconds to wait on the master mutex after it returns BUSY */ +#define MASTER_MUTEX_WAITNAMEDPIPE_TIMEOUT 5000 + +/* a data payload; not a normal message */ +#define RPCSS_NP_MESSAGE_TYPEID_VARDATAPAYLOADMSG 1 +typedef struct _RPCSS_NP_MESSAGE_UNION_VARDATAPAYLOADMSG { + char payload[VARDATA_PAYLOAD_BYTES]; +} RPCSS_NP_MESSAGE_UNION_VARDATAPAYLOADMSG; + +/* RANMSG: + * Simply tells the server that another rpcss instance ran. + * The server should respond by resetting its timeout to the + * full lazy timeout. + */ +#define RPCSS_NP_MESSAGE_TYPEID_RANMSG 2 +typedef struct _RPCSS_NP_MESSAGE_UNION_RANMSG { + long timeout; +} RPCSS_NP_MESSAGE_UNION_RANMSG; + +/* REGISTEREPMSG: + * Registers endpoints with the endpoint server. + * object_count and binding_count contain the number + * of object uuids and endpoints in the vardata payload, + * respectively. + */ +#define RPCSS_NP_MESSAGE_TYPEID_REGISTEREPMSG 3 +typedef struct _RPCSS_NP_MESSAGE_UNION_REGISTEREPMSG { + RPC_SYNTAX_IDENTIFIER iface; + int object_count; + int binding_count; + int no_replace; +} RPCSS_NP_MESSAGE_UNION_REGISTEREPMSG; + +/* UNREGISTEREPMSG: + * Unregisters endpoints with the endpoint server. + * object_count and binding_count contain the number + * of object uuids and endpoints in the vardata payload, + * respectively. + */ +#define RPCSS_NP_MESSAGE_TYPEID_UNREGISTEREPMSG 4 +typedef struct _RPCSS_NP_MESSAGE_UNION_UNREGISTEREPMSG { + RPC_SYNTAX_IDENTIFIER iface; + int object_count; + int binding_count; +} RPCSS_NP_MESSAGE_UNION_UNREGISTEREPMSG; + +/* RESOLVEEPMSG: + * Locates an endpoint registered with the endpoint server. + * Vardata contains a single protseq string. This is a bit + * silly: the protseq string is probably shorter than the + * reply (an endpoint string), which is truncated at + * MAX_RPCSS_NP_REPLY_STRING_LEN, at least for the moment. + * returns the empty string if the requested endpoint isn't + * registered. + */ +#define RPCSS_NP_MESSAGE_TYPEID_RESOLVEEPMSG 5 +typedef struct _RPCSS_NP_MESSAGE_UNION_RESOLVEEPMSG { + RPC_SYNTAX_IDENTIFIER iface; + UUID object; +} RPCSS_NP_MESSAGE_UNION_RESOLVEEPMSG; + +typedef union { + RPCSS_NP_MESSAGE_UNION_RANMSG ranmsg; + RPCSS_NP_MESSAGE_UNION_VARDATAPAYLOADMSG vardatapayloadmsg; + RPCSS_NP_MESSAGE_UNION_REGISTEREPMSG registerepmsg; + RPCSS_NP_MESSAGE_UNION_UNREGISTEREPMSG unregisterepmsg; + RPCSS_NP_MESSAGE_UNION_RESOLVEEPMSG resolveepmsg; +} RPCSS_NP_MESSAGE_UNION; + +/* vardata_payload_size specifies the number of bytes + * to be transferred over the pipe in VARDATAPAYLOAD + * messages (divide by VARDATA_PAYLOAD_BYTES to + * get the # of payloads) + */ +typedef struct _RPCSS_NP_MESSAGE { + UINT32 message_type; + RPCSS_NP_MESSAGE_UNION message; + UINT32 vardata_payload_size; +} RPCSS_NP_MESSAGE, *PRPCSS_NP_MESSAGE; + +typedef union { + /* some of these aren't used, but I guess we don't care */ + UINT as_uint; + INT as_int; + void *as_pvoid; + HANDLE as_handle; + char as_string[MAX_RPCSS_NP_REPLY_STRING_LEN]; /* FIXME: yucky */ +} RPCSS_NP_REPLY, *PRPCSS_NP_REPLY; + +#endif /* __WINE_RPCSS_SHARED_H */ diff --git a/reactos/lib/rpcrt4/.cvsignore b/reactos/lib/rpcrt4/.cvsignore new file mode 100644 index 00000000000..e5b0d54498f --- /dev/null +++ b/reactos/lib/rpcrt4/.cvsignore @@ -0,0 +1,10 @@ +*.coff +*.dll +*.d +*.a +*.o +*.sym +*.map +*.tmp +Makefile.ros +rpcrt4.spec.def diff --git a/reactos/lib/rpcrt4/Makefile b/reactos/lib/rpcrt4/Makefile new file mode 100644 index 00000000000..597cf0ddf0c --- /dev/null +++ b/reactos/lib/rpcrt4/Makefile @@ -0,0 +1,9 @@ +# $Id: Makefile,v 1.13 2004/05/04 20:10:07 navaraf Exp $ + +PATH_TO_TOP = ../.. + +TARGET_TYPE = winedll + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk diff --git a/reactos/lib/rpcrt4/Makefile.in b/reactos/lib/rpcrt4/Makefile.in new file mode 100644 index 00000000000..b5fca242efe --- /dev/null +++ b/reactos/lib/rpcrt4/Makefile.in @@ -0,0 +1,29 @@ +EXTRADEFS = -D_RPCRT4_ -DCOM_NO_WINDOWS_H +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = rpcrt4.dll +IMPORTS = iphlpapi advapi32 kernel32 ntdll +EXTRALIBS = -luuid + +C_SRCS = \ + cproxy.c \ + cpsf.c \ + cstub.c \ + ndr_marshall.c \ + ndr_midl.c \ + ndr_ole.c \ + ndr_stubless.c \ + rpc_binding.c \ + rpc_epmap.c \ + rpc_message.c \ + rpc_server.c \ + rpcrt4_main.c \ + rpcss_np_client.c + +SUBDIRS = tests + +@MAKE_DLL_RULES@ + +### Dependencies: diff --git a/reactos/lib/rpcrt4/Makefile.ros-template b/reactos/lib/rpcrt4/Makefile.ros-template new file mode 100644 index 00000000000..4bc0f162c7f --- /dev/null +++ b/reactos/lib/rpcrt4/Makefile.ros-template @@ -0,0 +1,22 @@ +# $Id: Makefile.ros-template,v 1.1 2004/05/04 20:06:26 navaraf Exp $ + +TARGET_NAME = rpcrt4 + +TARGET_OBJECTS = @C_SRCS@ + +TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ -Wall -DDBG -DYDEBUG + +TARGET_SDKLIBS = @IMPORTS@ winmm.a libwine.a wine_uuid.a ntdll.a + +TARGET_BASE = 0x76000000 + +TARGET_RC_BINSRC = @RC_BINSRC@ +TARGET_RC_BINARIES = @RC_BINARIES@ + +TARGET_NORC = yes + +default: all + +DEP_OBJECTS = $(TARGET_OBJECTS) + +include $(TOOLS_PATH)/depend.mk diff --git a/reactos/lib/rpcrt4/cproxy.c b/reactos/lib/rpcrt4/cproxy.c new file mode 100644 index 00000000000..e9b5cea7bd3 --- /dev/null +++ b/reactos/lib/rpcrt4/cproxy.c @@ -0,0 +1,325 @@ +/* + * COM proxy implementation + * + * Copyright 2001 Ove K鍁en, TransGaming Technologies + * + * 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: Handle non-i386 architectures + * Get rid of #if 0'ed code. + */ + +#include + +#include "windef.h" +#include "winbase.h" +#include "winerror.h" + +#include "objbase.h" +#include "rpcproxy.h" + +#include "cpsf.h" +#include "ndr_misc.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(ole); + +struct StublessThunk; + +/* I don't know what MS's std proxy structure looks like, + so this probably doesn't match, but that shouldn't matter */ +typedef struct { + ICOM_VTABLE(IRpcProxyBuffer) *lpVtbl; + LPVOID *PVtbl; + DWORD RefCount; + const MIDL_STUBLESS_PROXY_INFO *stubless; + const IID* piid; + LPUNKNOWN pUnkOuter; + PCInterfaceName name; + LPPSFACTORYBUFFER pPSFactory; + LPRPCCHANNELBUFFER pChannel; + struct StublessThunk *thunks; +} StdProxyImpl; + +static ICOM_VTABLE(IRpcProxyBuffer) StdProxy_Vtbl; + +/* How the Windows stubless proxy thunks work is explained at + * http://msdn.microsoft.com/library/en-us/dnmsj99/html/com0199.asp, + * but I'll use a slightly different method, to make life easier */ + +#if defined(__i386__) + +#include "pshpack1.h" + +struct StublessThunk { + BYTE push; + DWORD index; + BYTE call; + LONG handler; + BYTE ret; + WORD bytes; + BYTE pad[3]; +}; + +#include "poppack.h" + +/* adjust the stack size since we don't use Windows's method */ +#define STACK_ADJUST sizeof(DWORD) + +#define FILL_STUBLESS(x,idx,stk) \ + x->push = 0x68; /* pushl [immediate] */ \ + x->index = (idx); \ + x->call = 0xe8; /* call [near] */ \ + x->handler = (char*)ObjectStubless - (char*)&x->ret; \ + x->ret = 0xc2; /* ret [immediate] */ \ + x->bytes = stk; \ + x->pad[0] = 0x8d; /* leal (%esi),%esi */ \ + x->pad[1] = 0x76; \ + x->pad[2] = 0x00; + +static HRESULT WINAPI ObjectStubless(DWORD index) +{ + char *args = (char*)(&index + 2); + LPVOID iface = *(LPVOID*)args; + + ICOM_THIS_MULTI(StdProxyImpl,PVtbl,iface); + + PFORMAT_STRING fs = This->stubless->ProcFormatString + This->stubless->FormatStringOffset[index]; + unsigned bytes = *(WORD*)(fs+8) - STACK_ADJUST; + TRACE("(%p)->(%ld)([%d bytes]) ret=%08lx\n", iface, index, bytes, *(DWORD*)(args+bytes)); + + return RPCRT4_NdrClientCall2(This->stubless->pStubDesc, fs, args); +} + +#else /* __i386__ */ + +/* can't do that on this arch */ +struct StublessThunk { int dummy; }; +#define FILL_STUBLESS(x,idx,stk) \ + ERR("stubless proxies are not supported on this architecture\n"); +#define STACK_ADJUST 0 + +#endif /* __i386__ */ + +HRESULT WINAPI StdProxy_Construct(REFIID riid, + LPUNKNOWN pUnkOuter, + PCInterfaceName name, + CInterfaceProxyVtbl *vtbl, + CInterfaceStubVtbl *svtbl, + LPPSFACTORYBUFFER pPSFactory, + LPRPCPROXYBUFFER *ppProxy, + LPVOID *ppvObj) +{ + StdProxyImpl *This; + const MIDL_STUBLESS_PROXY_INFO *stubless = NULL; + + TRACE("(%p,%p,%p,%p,%p) %s\n", pUnkOuter, vtbl, pPSFactory, ppProxy, ppvObj, name); + + /* I can't find any other way to detect stubless proxies than this hack */ + if (!IsEqualGUID(vtbl->header.piid, riid)) { + stubless = *(const void **)vtbl; + vtbl = (CInterfaceProxyVtbl *)((const void **)vtbl + 1); + TRACE("stubless=%p\n", stubless); + } + + TRACE("iid=%s\n", debugstr_guid(vtbl->header.piid)); + TRACE("vtbl=%p\n", vtbl->Vtbl); + + if (!IsEqualGUID(vtbl->header.piid, riid)) { + ERR("IID mismatch during proxy creation\n"); + return RPC_E_UNEXPECTED; + } + + This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(StdProxyImpl)); + if (!This) return E_OUTOFMEMORY; + + if (stubless) { + unsigned i, count = svtbl->header.DispatchTableCount; + /* Maybe the original vtbl is just modified directly to point at + * ObjectStublessClientXXX thunks in real Windows, but I don't like it + */ + TRACE("stubless thunks: count=%d\n", count); + This->thunks = HeapAlloc(GetProcessHeap(),0,sizeof(struct StublessThunk)*count); + This->PVtbl = HeapAlloc(GetProcessHeap(),0,sizeof(LPVOID)*count); + for (i=0; ithunks[i]; + if (vtbl->Vtbl[i] == (LPVOID)-1) { + PFORMAT_STRING fs = stubless->ProcFormatString + stubless->FormatStringOffset[i]; + unsigned bytes = *(WORD*)(fs+8) - STACK_ADJUST; + TRACE("method %d: stacksize=%d\n", i, bytes); + FILL_STUBLESS(thunk, i, bytes) + This->PVtbl[i] = thunk; + } + else { + memset(thunk, 0, sizeof(struct StublessThunk)); + This->PVtbl[i] = vtbl->Vtbl[i]; + } + } + } + else + This->PVtbl = vtbl->Vtbl; + + This->lpVtbl = &StdProxy_Vtbl; + This->RefCount = 1; + This->stubless = stubless; + This->piid = vtbl->header.piid; + This->pUnkOuter = pUnkOuter; + This->name = name; + This->pPSFactory = pPSFactory; + This->pChannel = NULL; + *ppProxy = (LPRPCPROXYBUFFER)&This->lpVtbl; + *ppvObj = &This->PVtbl; + IPSFactoryBuffer_AddRef(pPSFactory); + + return S_OK; +} + +static void WINAPI StdProxy_Destruct(LPRPCPROXYBUFFER iface) +{ + ICOM_THIS_MULTI(StdProxyImpl,lpVtbl,iface); + + IPSFactoryBuffer_Release(This->pPSFactory); + if (This->thunks) { + HeapFree(GetProcessHeap(),0,This->PVtbl); + HeapFree(GetProcessHeap(),0,This->thunks); + } + HeapFree(GetProcessHeap(),0,This); +} + +static HRESULT WINAPI StdProxy_QueryInterface(LPRPCPROXYBUFFER iface, + REFIID riid, + LPVOID *obj) +{ + ICOM_THIS_MULTI(StdProxyImpl,lpVtbl,iface); + TRACE("(%p)->QueryInterface(%s,%p)\n",This,debugstr_guid(riid),obj); + + if (IsEqualGUID(&IID_IUnknown,riid) || + IsEqualGUID(This->piid,riid)) { + *obj = &This->PVtbl; + This->RefCount++; + return S_OK; + } + + if (IsEqualGUID(&IID_IRpcProxyBuffer,riid)) { + *obj = &This->lpVtbl; + This->RefCount++; + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI StdProxy_AddRef(LPRPCPROXYBUFFER iface) +{ + ICOM_THIS_MULTI(StdProxyImpl,lpVtbl,iface); + TRACE("(%p)->AddRef()\n",This); + + return ++(This->RefCount); +} + +static ULONG WINAPI StdProxy_Release(LPRPCPROXYBUFFER iface) +{ + ICOM_THIS_MULTI(StdProxyImpl,lpVtbl,iface); + TRACE("(%p)->Release()\n",This); + + if (!--(This->RefCount)) { + StdProxy_Destruct((LPRPCPROXYBUFFER)&This->lpVtbl); + return 0; + } + return This->RefCount; +} + +static HRESULT WINAPI StdProxy_Connect(LPRPCPROXYBUFFER iface, + LPRPCCHANNELBUFFER pChannel) +{ + ICOM_THIS_MULTI(StdProxyImpl,lpVtbl,iface); + TRACE("(%p)->Connect(%p)\n",This,pChannel); + + This->pChannel = pChannel; + return S_OK; +} + +static VOID WINAPI StdProxy_Disconnect(LPRPCPROXYBUFFER iface) +{ + ICOM_THIS_MULTI(StdProxyImpl,lpVtbl,iface); + TRACE("(%p)->Disconnect()\n",This); + + This->pChannel = NULL; +} + +static ICOM_VTABLE(IRpcProxyBuffer) StdProxy_Vtbl = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + StdProxy_QueryInterface, + StdProxy_AddRef, + StdProxy_Release, + StdProxy_Connect, + StdProxy_Disconnect +}; + +HRESULT WINAPI StdProxy_GetChannel(LPVOID iface, + LPRPCCHANNELBUFFER *ppChannel) +{ + ICOM_THIS_MULTI(StdProxyImpl,PVtbl,iface); + TRACE("(%p)->GetChannel(%p) %s\n",This,ppChannel,This->name); + + *ppChannel = This->pChannel; + return S_OK; +} + +HRESULT WINAPI StdProxy_GetIID(LPVOID iface, + const IID **ppiid) +{ + ICOM_THIS_MULTI(StdProxyImpl,PVtbl,iface); + TRACE("(%p)->GetIID(%p) %s\n",This,ppiid,This->name); + + *ppiid = This->piid; + return S_OK; +} + +HRESULT WINAPI IUnknown_QueryInterface_Proxy(LPUNKNOWN iface, + REFIID riid, + LPVOID *ppvObj) +{ + ICOM_THIS_MULTI(StdProxyImpl,PVtbl,iface); + TRACE("(%p)->QueryInterface(%s,%p) %s\n",This,debugstr_guid(riid),ppvObj,This->name); + return IUnknown_QueryInterface(This->pUnkOuter,riid,ppvObj); +} + +ULONG WINAPI IUnknown_AddRef_Proxy(LPUNKNOWN iface) +{ + ICOM_THIS_MULTI(StdProxyImpl,PVtbl,iface); + TRACE("(%p)->AddRef() %s\n",This,This->name); +#if 0 /* interface refcounting */ + return ++(This->RefCount); +#else /* object refcounting */ + return IUnknown_AddRef(This->pUnkOuter); +#endif +} + +ULONG WINAPI IUnknown_Release_Proxy(LPUNKNOWN iface) +{ + ICOM_THIS_MULTI(StdProxyImpl,PVtbl,iface); + TRACE("(%p)->Release() %s\n",This,This->name); +#if 0 /* interface refcounting */ + if (!--(This->RefCount)) { + StdProxy_Destruct((LPRPCPROXYBUFFER)&This->lpVtbl); + return 0; + } + return This->RefCount; +#else /* object refcounting */ + return IUnknown_Release(This->pUnkOuter); +#endif +} diff --git a/reactos/lib/rpcrt4/cpsf.c b/reactos/lib/rpcrt4/cpsf.c new file mode 100644 index 00000000000..8df39577783 --- /dev/null +++ b/reactos/lib/rpcrt4/cpsf.c @@ -0,0 +1,256 @@ +/* + * COM proxy/stub factory (CStdPSFactory) implementation + * + * Copyright 2001 Ove K鍁en, TransGaming Technologies + * + * 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 "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "winreg.h" + +#include "objbase.h" + +#include "rpcproxy.h" + +#include "wine/debug.h" + +#include "cpsf.h" + +WINE_DEFAULT_DEBUG_CHANNEL(ole); + +static BOOL FindProxyInfo(const ProxyFileInfo **pProxyFileList, REFIID riid, const ProxyFileInfo **pProxyInfo, int *pIndex) +{ + while (*pProxyFileList) { + if ((*pProxyFileList)->pIIDLookupRtn(riid, pIndex)) { + *pProxyInfo = *pProxyFileList; + TRACE("found: ProxyInfo %p Index %d\n", *pProxyInfo, *pIndex); + return TRUE; + } + pProxyFileList++; + } + TRACE("not found\n"); + return FALSE; +} + +static HRESULT WINAPI CStdPSFactory_QueryInterface(LPPSFACTORYBUFFER iface, + REFIID riid, + LPVOID *obj) +{ + ICOM_THIS(CStdPSFactoryBuffer,iface); + TRACE("(%p)->QueryInterface(%s,%p)\n",iface,debugstr_guid(riid),obj); + if (IsEqualGUID(&IID_IUnknown,riid) || + IsEqualGUID(&IID_IPSFactoryBuffer,riid)) { + *obj = This; + This->RefCount++; + return S_OK; + } + return E_NOINTERFACE; +} + +static ULONG WINAPI CStdPSFactory_AddRef(LPPSFACTORYBUFFER iface) +{ + ICOM_THIS(CStdPSFactoryBuffer,iface); + TRACE("(%p)->AddRef()\n",iface); + return ++(This->RefCount); +} + +static ULONG WINAPI CStdPSFactory_Release(LPPSFACTORYBUFFER iface) +{ + ICOM_THIS(CStdPSFactoryBuffer,iface); + TRACE("(%p)->Release()\n",iface); + return --(This->RefCount); +} + +static HRESULT WINAPI CStdPSFactory_CreateProxy(LPPSFACTORYBUFFER iface, + LPUNKNOWN pUnkOuter, + REFIID riid, + LPRPCPROXYBUFFER *ppProxy, + LPVOID *ppv) +{ + ICOM_THIS(CStdPSFactoryBuffer,iface); + const ProxyFileInfo *ProxyInfo; + int Index; + TRACE("(%p)->CreateProxy(%p,%s,%p,%p)\n",iface,pUnkOuter, + debugstr_guid(riid),ppProxy,ppv); + if (!FindProxyInfo(This->pProxyFileList,riid,&ProxyInfo,&Index)) + return E_NOINTERFACE; + return StdProxy_Construct(riid, pUnkOuter, ProxyInfo->pNamesArray[Index], + ProxyInfo->pProxyVtblList[Index], + ProxyInfo->pStubVtblList[Index], iface, ppProxy, ppv); +} + +static HRESULT WINAPI CStdPSFactory_CreateStub(LPPSFACTORYBUFFER iface, + REFIID riid, + LPUNKNOWN pUnkServer, + LPRPCSTUBBUFFER *ppStub) +{ + ICOM_THIS(CStdPSFactoryBuffer,iface); + const ProxyFileInfo *ProxyInfo; + int Index; + TRACE("(%p)->CreateStub(%s,%p,%p)\n",iface,debugstr_guid(riid), + pUnkServer,ppStub); + if (!FindProxyInfo(This->pProxyFileList,riid,&ProxyInfo,&Index)) + return E_NOINTERFACE; + return CStdStubBuffer_Construct(riid, pUnkServer, ProxyInfo->pNamesArray[Index], + ProxyInfo->pStubVtblList[Index], iface, ppStub); +} + +static ICOM_VTABLE(IPSFactoryBuffer) CStdPSFactory_Vtbl = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + CStdPSFactory_QueryInterface, + CStdPSFactory_AddRef, + CStdPSFactory_Release, + CStdPSFactory_CreateProxy, + CStdPSFactory_CreateStub +}; + +/*********************************************************************** + * NdrDllGetClassObject [RPCRT4.@] + */ +HRESULT WINAPI NdrDllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv, + const ProxyFileInfo **pProxyFileList, + const CLSID *pclsid, + CStdPSFactoryBuffer *pPSFactoryBuffer) +{ + *ppv = NULL; + if (!pPSFactoryBuffer->lpVtbl) { + pPSFactoryBuffer->lpVtbl = &CStdPSFactory_Vtbl; + pPSFactoryBuffer->RefCount = 0; + pPSFactoryBuffer->pProxyFileList = pProxyFileList; + } + if (IsEqualGUID(rclsid, pclsid)) + return IPSFactoryBuffer_QueryInterface((LPPSFACTORYBUFFER)pPSFactoryBuffer, iid, ppv); + return CLASS_E_CLASSNOTAVAILABLE; +} + +/*********************************************************************** + * NdrDllCanUnloadNow [RPCRT4.@] + */ +HRESULT WINAPI NdrDllCanUnloadNow(CStdPSFactoryBuffer *pPSFactoryBuffer) +{ + return !(pPSFactoryBuffer->RefCount); +} + +/*********************************************************************** + * NdrDllRegisterProxy [RPCRT4.@] + */ +HRESULT WINAPI NdrDllRegisterProxy(HMODULE hDll, + const ProxyFileInfo **pProxyFileList, + const CLSID *pclsid) +{ + LPSTR clsid; + char keyname[120], module[120]; + HKEY key, subkey; + + TRACE("(%p,%p,%s)\n", hDll, pProxyFileList, debugstr_guid(pclsid)); + UuidToStringA((UUID*)pclsid, (unsigned char**)&clsid); + + /* register interfaces to point to clsid */ + while (*pProxyFileList) { + unsigned u; + for (u=0; u<(*pProxyFileList)->TableSize; u++) { + CInterfaceStubVtbl *proxy = (*pProxyFileList)->pStubVtblList[u]; + PCInterfaceName name = (*pProxyFileList)->pNamesArray[u]; + LPSTR iid; + + TRACE("registering %s %s => %s\n", name, debugstr_guid(proxy->header.piid), clsid); + + UuidToStringA((UUID*)proxy->header.piid, (unsigned char**)&iid); + snprintf(keyname, sizeof(keyname), "Interface\\{%s}", iid); + RpcStringFreeA((unsigned char**)&iid); + if (RegCreateKeyExA(HKEY_CLASSES_ROOT, keyname, 0, NULL, 0, + KEY_WRITE, NULL, &key, NULL) == ERROR_SUCCESS) { + if (name) + RegSetValueExA(key, NULL, 0, REG_SZ, name, strlen(name)); + if (RegCreateKeyExA(key, "ProxyStubClsid32", 0, NULL, 0, + KEY_WRITE, NULL, &subkey, NULL) == ERROR_SUCCESS) { + snprintf(module, sizeof(module), "{%s}", clsid); + RegSetValueExA(subkey, NULL, 0, REG_SZ, module, strlen(module)); + RegCloseKey(subkey); + } + RegCloseKey(key); + } + } + pProxyFileList++; + } + + /* register clsid to point to module */ + snprintf(keyname, sizeof(keyname), "CLSID\\{%s}", clsid); + GetModuleFileNameA(hDll, module, sizeof(module)); + TRACE("registering CLSID %s => %s\n", clsid, module); + if (RegCreateKeyExA(HKEY_CLASSES_ROOT, keyname, 0, NULL, 0, + KEY_WRITE, NULL, &key, NULL) == ERROR_SUCCESS) { + if (RegCreateKeyExA(key, "InProcServer32", 0, NULL, 0, + KEY_WRITE, NULL, &subkey, NULL) == ERROR_SUCCESS) { + RegSetValueExA(subkey, NULL, 0, REG_SZ, module, strlen(module)); + RegCloseKey(subkey); + } + RegCloseKey(key); + } + + /* done */ + RpcStringFreeA((unsigned char**)&clsid); + return S_OK; +} + +/*********************************************************************** + * NdrDllUnregisterProxy [RPCRT4.@] + */ +HRESULT WINAPI NdrDllUnregisterProxy(HMODULE hDll, + const ProxyFileInfo **pProxyFileList, + const CLSID *pclsid) +{ + LPSTR clsid; + char keyname[120], module[120]; + + TRACE("(%p,%p,%s)\n", hDll, pProxyFileList, debugstr_guid(pclsid)); + UuidToStringA((UUID*)pclsid, (unsigned char**)&clsid); + + /* unregister interfaces */ + while (*pProxyFileList) { + unsigned u; + for (u=0; u<(*pProxyFileList)->TableSize; u++) { + CInterfaceStubVtbl *proxy = (*pProxyFileList)->pStubVtblList[u]; + PCInterfaceName name = (*pProxyFileList)->pNamesArray[u]; + LPSTR iid; + + TRACE("unregistering %s %s <= %s\n", name, debugstr_guid(proxy->header.piid), clsid); + + UuidToStringA((UUID*)proxy->header.piid, (unsigned char**)&iid); + snprintf(keyname, sizeof(keyname), "Interface\\{%s}", iid); + RpcStringFreeA((unsigned char**)&iid); + RegDeleteKeyA(HKEY_CLASSES_ROOT, keyname); + } + pProxyFileList++; + } + + /* unregister clsid */ + snprintf(keyname, sizeof(keyname), "CLSID\\{%s}", clsid); + GetModuleFileNameA(hDll, module, sizeof(module)); + TRACE("unregistering CLSID %s <= %s\n", clsid, module); + RegDeleteKeyA(HKEY_CLASSES_ROOT, keyname); + + /* done */ + RpcStringFreeA((unsigned char**)&clsid); + return S_OK; +} diff --git a/reactos/lib/rpcrt4/cpsf.h b/reactos/lib/rpcrt4/cpsf.h new file mode 100644 index 00000000000..bdb6503ea63 --- /dev/null +++ b/reactos/lib/rpcrt4/cpsf.h @@ -0,0 +1,44 @@ +/* + * COM proxy definitions + * + * Copyright 2001 Ove K鍁en, TransGaming Technologies + * + * 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_CPSF_H +#define __WINE_CPSF_H + +HRESULT WINAPI StdProxy_Construct(REFIID riid, + LPUNKNOWN pUnkOuter, + PCInterfaceName name, + CInterfaceProxyVtbl *vtbl, + CInterfaceStubVtbl *svtbl, + LPPSFACTORYBUFFER pPSFactory, + LPRPCPROXYBUFFER *ppProxy, + LPVOID *ppvObj); +HRESULT WINAPI StdProxy_GetChannel(LPVOID iface, + LPRPCCHANNELBUFFER *ppChannel); +HRESULT WINAPI StdProxy_GetIID(LPVOID iface, + const IID **piid); + +HRESULT WINAPI CStdStubBuffer_Construct(REFIID riid, + LPUNKNOWN pUnkServer, + PCInterfaceName name, + CInterfaceStubVtbl *vtbl, + LPPSFACTORYBUFFER pPSFactory, + LPRPCSTUBBUFFER *ppStub); + +#endif /* __WINE_CPSF_H */ diff --git a/reactos/lib/rpcrt4/cstub.c b/reactos/lib/rpcrt4/cstub.c new file mode 100644 index 00000000000..bc215dad403 --- /dev/null +++ b/reactos/lib/rpcrt4/cstub.c @@ -0,0 +1,167 @@ +/* + * COM stub (CStdStubBuffer) implementation + * + * Copyright 2001 Ove K鍁en, TransGaming Technologies + * + * 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 "windef.h" +#include "winbase.h" +#include "winerror.h" + +#include "objbase.h" + +#include "rpcproxy.h" + +#include "wine/debug.h" + +#include "cpsf.h" + +WINE_DEFAULT_DEBUG_CHANNEL(ole); + +#define STUB_HEADER(This) (((CInterfaceStubHeader*)((This)->lpVtbl))[-1]) + +HRESULT WINAPI CStdStubBuffer_Construct(REFIID riid, + LPUNKNOWN pUnkServer, + PCInterfaceName name, + CInterfaceStubVtbl *vtbl, + LPPSFACTORYBUFFER pPSFactory, + LPRPCSTUBBUFFER *ppStub) +{ + CStdStubBuffer *This; + + TRACE("(%p,%p,%p,%p) %s\n", pUnkServer, vtbl, pPSFactory, ppStub, name); + TRACE("iid=%s\n", debugstr_guid(vtbl->header.piid)); + TRACE("vtbl=%p\n", &vtbl->Vtbl); + + if (!IsEqualGUID(vtbl->header.piid, riid)) { + ERR("IID mismatch during stub creation\n"); + return RPC_E_UNEXPECTED; + } + + This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(CStdStubBuffer)); + if (!This) return E_OUTOFMEMORY; + + This->lpVtbl = &vtbl->Vtbl; + This->RefCount = 1; + This->pvServerObject = pUnkServer; + This->pPSFactory = pPSFactory; + *ppStub = (LPRPCSTUBBUFFER)This; + + IUnknown_AddRef(This->pvServerObject); + IPSFactoryBuffer_AddRef(pPSFactory); + return S_OK; +} + +HRESULT WINAPI CStdStubBuffer_QueryInterface(LPRPCSTUBBUFFER iface, + REFIID riid, + LPVOID *obj) +{ + ICOM_THIS(CStdStubBuffer,iface); + TRACE("(%p)->QueryInterface(%s,%p)\n",This,debugstr_guid(riid),obj); + + if (IsEqualGUID(&IID_IUnknown,riid) || + IsEqualGUID(&IID_IRpcStubBuffer,riid)) { + *obj = This; + This->RefCount++; + return S_OK; + } + return E_NOINTERFACE; +} + +ULONG WINAPI CStdStubBuffer_AddRef(LPRPCSTUBBUFFER iface) +{ + ICOM_THIS(CStdStubBuffer,iface); + TRACE("(%p)->AddRef()\n",This); + return ++(This->RefCount); +} + +ULONG WINAPI NdrCStdStubBuffer_Release(LPRPCSTUBBUFFER iface, + LPPSFACTORYBUFFER pPSF) +{ + ICOM_THIS(CStdStubBuffer,iface); + TRACE("(%p)->Release()\n",This); + + if (!--(This->RefCount)) { + if(This->pvServerObject) + IUnknown_Release(This->pvServerObject); + if(This->pPSFactory) + IPSFactoryBuffer_Release(This->pPSFactory); + HeapFree(GetProcessHeap(),0,This); + return 0; + } + return This->RefCount; +} + +HRESULT WINAPI CStdStubBuffer_Connect(LPRPCSTUBBUFFER iface, + LPUNKNOWN lpUnkServer) +{ + ICOM_THIS(CStdStubBuffer,iface); + TRACE("(%p)->Connect(%p)\n",This,lpUnkServer); + This->pvServerObject = lpUnkServer; + return S_OK; +} + +void WINAPI CStdStubBuffer_Disconnect(LPRPCSTUBBUFFER iface) +{ + ICOM_THIS(CStdStubBuffer,iface); + TRACE("(%p)->Disconnect()\n",This); + This->pvServerObject = NULL; +} + +HRESULT WINAPI CStdStubBuffer_Invoke(LPRPCSTUBBUFFER iface, + PRPCOLEMESSAGE pMsg, + LPRPCCHANNELBUFFER pChannel) +{ + ICOM_THIS(CStdStubBuffer,iface); + DWORD dwPhase = STUB_UNMARSHAL; + TRACE("(%p)->Invoke(%p,%p)\n",This,pMsg,pChannel); + + STUB_HEADER(This).pDispatchTable[pMsg->iMethod](iface, pChannel, (PRPC_MESSAGE)pMsg, &dwPhase); + return S_OK; +} + +LPRPCSTUBBUFFER WINAPI CStdStubBuffer_IsIIDSupported(LPRPCSTUBBUFFER iface, + REFIID riid) +{ + ICOM_THIS(CStdStubBuffer,iface); + TRACE("(%p)->IsIIDSupported(%s)\n",This,debugstr_guid(riid)); + return IsEqualGUID(STUB_HEADER(This).piid, riid) ? iface : NULL; +} + +ULONG WINAPI CStdStubBuffer_CountRefs(LPRPCSTUBBUFFER iface) +{ + ICOM_THIS(CStdStubBuffer,iface); + TRACE("(%p)->CountRefs()\n",This); + return This->RefCount; +} + +HRESULT WINAPI CStdStubBuffer_DebugServerQueryInterface(LPRPCSTUBBUFFER iface, + LPVOID *ppv) +{ + ICOM_THIS(CStdStubBuffer,iface); + TRACE("(%p)->DebugServerQueryInterface(%p)\n",This,ppv); + return S_OK; +} + +void WINAPI CStdStubBuffer_DebugServerRelease(LPRPCSTUBBUFFER iface, + LPVOID pv) +{ + ICOM_THIS(CStdStubBuffer,iface); + TRACE("(%p)->DebugServerRelease(%p)\n",This,pv); +} diff --git a/reactos/lib/rpcrt4/ndr_marshall.c b/reactos/lib/rpcrt4/ndr_marshall.c new file mode 100644 index 00000000000..d6b0ca2048a --- /dev/null +++ b/reactos/lib/rpcrt4/ndr_marshall.c @@ -0,0 +1,2118 @@ +/* + * NDR data marshalling + * + * Copyright 2002 Greg Turner + * + * 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: + * - figure out whether we *really* got this right + * - check for errors and throw exceptions + */ + +#include +#include +#include +#include + +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "winreg.h" + +#include "ndr_misc.h" +#include "rpcndr.h" + +#include "wine/unicode.h" +#include "wine/rpcfc.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(ole); + +#define BUFFER_PARANOIA 20 + +#if defined(__i386__) + #define LITTLE_ENDIAN_UINT32_WRITE(pchar, uint32) \ + (*((UINT32 *)(pchar)) = (uint32)) + + #define LITTLE_ENDIAN_UINT32_READ(pchar) \ + (*((UINT32 *)(pchar))) +#else + /* these would work for i386 too, but less efficient */ + #define LITTLE_ENDIAN_UINT32_WRITE(pchar, uint32) \ + (*(pchar) = LOBYTE(LOWORD(uint32)), \ + *((pchar)+1) = HIBYTE(LOWORD(uint32)), \ + *((pchar)+2) = LOBYTE(HIWORD(uint32)), \ + *((pchar)+3) = HIBYTE(HIWORD(uint32)), \ + (uint32)) /* allow as r-value */ + + #define LITTLE_ENDIAN_UINT32_READ(pchar) \ + (MAKELONG( \ + MAKEWORD(*(pchar), *((pchar)+1)), \ + MAKEWORD(*((pchar)+2), *((pchar)+3)))) +#endif + +#define BIG_ENDIAN_UINT32_WRITE(pchar, uint32) \ + (*((pchar)+3) = LOBYTE(LOWORD(uint32)), \ + *((pchar)+2) = HIBYTE(LOWORD(uint32)), \ + *((pchar)+1) = LOBYTE(HIWORD(uint32)), \ + *(pchar) = HIBYTE(HIWORD(uint32)), \ + (uint32)) /* allow as r-value */ + +#define BIG_ENDIAN_UINT32_READ(pchar) \ + (MAKELONG( \ + MAKEWORD(*((pchar)+3), *((pchar)+2)), \ + MAKEWORD(*((pchar)+1), *(pchar)))) + +#ifdef NDR_LOCAL_IS_BIG_ENDIAN + #define NDR_LOCAL_UINT32_WRITE(pchar, uint32) \ + BIG_ENDIAN_UINT32_WRITE(pchar, uint32) + #define NDR_LOCAL_UINT32_READ(pchar) \ + BIG_ENDIAN_UINT32_READ(pchar) +#else + #define NDR_LOCAL_UINT32_WRITE(pchar, uint32) \ + LITTLE_ENDIAN_UINT32_WRITE(pchar, uint32) + #define NDR_LOCAL_UINT32_READ(pchar) \ + LITTLE_ENDIAN_UINT32_READ(pchar) +#endif + +/* _Align must be the desired alignment minus 1, + * e.g. ALIGN_LENGTH(len, 3) to align on a dword boundary. */ +#define ALIGNED_LENGTH(_Len, _Align) (((_Len)+(_Align))&~(_Align)) +#define ALIGNED_POINTER(_Ptr, _Align) ((LPVOID)ALIGNED_LENGTH((ULONG_PTR)(_Ptr), _Align)) +#define ALIGN_LENGTH(_Len, _Align) _Len = ALIGNED_LENGTH(_Len, _Align) +#define ALIGN_POINTER(_Ptr, _Align) _Ptr = ALIGNED_POINTER(_Ptr, _Align) + +#define STD_OVERFLOW_CHECK(_Msg) do { \ + TRACE("buffer=%d/%ld\n", _Msg->Buffer - _Msg->BufferStart, _Msg->BufferLength); \ + if (_Msg->Buffer > _Msg->BufferEnd) ERR("buffer overflow %d bytes\n", _Msg->Buffer - _Msg->BufferEnd); \ + } while (0) + +#define NDR_TABLE_SIZE 128 +#define NDR_TABLE_MASK 127 + +NDR_MARSHALL NdrMarshaller[NDR_TABLE_SIZE] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + /* 0x10 */ + 0, + /* 0x11 */ + NdrPointerMarshall, NdrPointerMarshall, + NdrPointerMarshall, NdrPointerMarshall, + /* 0x15 */ + NdrSimpleStructMarshall, NdrSimpleStructMarshall, + 0, 0, 0, + NdrComplexStructMarshall, + /* 0x1b */ + NdrConformantArrayMarshall, 0, 0, 0, 0, 0, + NdrComplexArrayMarshall, + /* 0x22 */ + NdrConformantStringMarshall, 0, 0, + NdrConformantStringMarshall, 0, 0, 0, 0, + /* 0x2a */ + 0, 0, 0, 0, 0, + /* 0x2f */ + NdrInterfacePointerMarshall, + /* 0xb0 */ + 0, 0, 0, 0, + NdrUserMarshalMarshall +}; +NDR_UNMARSHALL NdrUnmarshaller[NDR_TABLE_SIZE] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + /* 0x10 */ + 0, + /* 0x11 */ + NdrPointerUnmarshall, NdrPointerUnmarshall, + NdrPointerUnmarshall, NdrPointerUnmarshall, + /* 0x15 */ + NdrSimpleStructUnmarshall, NdrSimpleStructUnmarshall, + 0, 0, 0, + NdrComplexStructUnmarshall, + /* 0x1b */ + NdrConformantArrayUnmarshall, 0, 0, 0, 0, 0, + NdrComplexArrayUnmarshall, + /* 0x22 */ + NdrConformantStringUnmarshall, 0, 0, + NdrConformantStringUnmarshall, 0, 0, 0, 0, + /* 0x2a */ + 0, 0, 0, 0, 0, + /* 0x2f */ + NdrInterfacePointerUnmarshall, + /* 0xb0 */ + 0, 0, 0, 0, + NdrUserMarshalUnmarshall +}; +NDR_BUFFERSIZE NdrBufferSizer[NDR_TABLE_SIZE] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + /* 0x10 */ + 0, + /* 0x11 */ + NdrPointerBufferSize, NdrPointerBufferSize, + NdrPointerBufferSize, NdrPointerBufferSize, + /* 0x15 */ + NdrSimpleStructBufferSize, NdrSimpleStructBufferSize, + 0, 0, 0, + NdrComplexStructBufferSize, + /* 0x1b */ + NdrConformantArrayBufferSize, 0, 0, 0, 0, 0, + NdrComplexArrayBufferSize, + /* 0x22 */ + NdrConformantStringBufferSize, 0, 0, + NdrConformantStringBufferSize, 0, 0, 0, 0, + /* 0x2a */ + 0, 0, 0, 0, 0, + /* 0x2f */ + NdrInterfacePointerBufferSize, + /* 0xb0 */ + 0, 0, 0, 0, + NdrUserMarshalBufferSize +}; +NDR_MEMORYSIZE NdrMemorySizer[NDR_TABLE_SIZE] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + /* 0x10 */ + 0, + /* 0x11 */ + NdrPointerMemorySize, NdrPointerMemorySize, + NdrPointerMemorySize, NdrPointerMemorySize, + /* 0x15 */ + NdrSimpleStructMemorySize, NdrSimpleStructMemorySize, + 0, 0, 0, + NdrComplexStructMemorySize, + /* 0x1b */ + NdrConformantArrayMemorySize, 0, 0, 0, 0, 0, + NdrComplexArrayMemorySize, + /* 0x22 */ + NdrConformantStringMemorySize, 0, 0, + NdrConformantStringMemorySize, 0, 0, 0, 0, + /* 0x2a */ + 0, 0, 0, 0, 0, + /* 0x2f */ + NdrInterfacePointerMemorySize, + /* 0xb0 */ + 0, 0, 0, 0, + NdrUserMarshalMemorySize +}; +NDR_FREE NdrFreer[NDR_TABLE_SIZE] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + /* 0x10 */ + 0, + /* 0x11 */ + NdrPointerFree, NdrPointerFree, + NdrPointerFree, NdrPointerFree, + /* 0x15 */ + NdrSimpleStructFree, NdrSimpleStructFree, + 0, 0, 0, + NdrComplexStructFree, + /* 0x1b */ + NdrConformantArrayFree, 0, 0, 0, 0, 0, + NdrComplexArrayFree, + /* 0x22 */ + 0, 0, 0, 0, 0, 0, 0, 0, + /* 0x2a */ + 0, 0, 0, 0, 0, + /* 0x2f */ + NdrInterfacePointerFree, + /* 0xb0 */ + 0, 0, 0, 0, + NdrUserMarshalFree +}; + +void * WINAPI NdrAllocate(MIDL_STUB_MESSAGE *pStubMsg, size_t len) +{ + /* hmm, this is probably supposed to do more? */ + return pStubMsg->pfnAllocate(len); +} + +static void WINAPI NdrFree(MIDL_STUB_MESSAGE *pStubMsg, unsigned char *Pointer) +{ + pStubMsg->pfnFree(Pointer); +} + +PFORMAT_STRING ReadConformance(MIDL_STUB_MESSAGE *pStubMsg, PFORMAT_STRING pFormat) +{ + pStubMsg->MaxCount = NDR_LOCAL_UINT32_READ(pStubMsg->Buffer); + pStubMsg->Buffer += 4; + TRACE("unmarshalled conformance is %ld\n", pStubMsg->MaxCount); + return pFormat+4; +} + +PFORMAT_STRING ComputeConformance(MIDL_STUB_MESSAGE *pStubMsg, unsigned char *pMemory, + PFORMAT_STRING pFormat, ULONG_PTR def) +{ + BYTE dtype = pFormat[0] & 0xf; + DWORD ofs = (DWORD)pFormat[2] | ((DWORD)pFormat[3] << 8); + LPVOID ptr = NULL; + DWORD data = 0; + + if (pFormat[0] == 0xff) { + /* null descriptor */ + pStubMsg->MaxCount = def; + goto finish_conf; + } + + switch (pFormat[0] & 0xf0) { + case RPC_FC_NORMAL_CONFORMANCE: + TRACE("normal conformance, ofs=%ld\n", ofs); + ptr = pMemory + ofs; + break; + case RPC_FC_POINTER_CONFORMANCE: + TRACE("pointer conformance, ofs=%ld\n", ofs); + ptr = pStubMsg->Memory + ofs; + break; + case RPC_FC_TOP_LEVEL_CONFORMANCE: + TRACE("toplevel conformance, ofs=%ld\n", ofs); + if (pStubMsg->StackTop) { + ptr = pStubMsg->StackTop + ofs; + } + else { + /* -Os mode, MaxCount is already set */ + goto finish_conf; + } + break; + case RPC_FC_CONSTANT_CONFORMANCE: + data = ofs | ((DWORD)pFormat[1] << 16); + TRACE("constant conformance, val=%ld\n", data); + pStubMsg->MaxCount = data; + goto finish_conf; + case RPC_FC_TOP_LEVEL_MULTID_CONFORMANCE: + FIXME("toplevel multidimensional conformance, ofs=%ld\n", ofs); + if (pStubMsg->StackTop) { + ptr = pStubMsg->StackTop + ofs; + } + else { + /* ? */ + goto done_conf_grab; + } + break; + default: + FIXME("unknown conformance type %x\n", pFormat[0] & 0xf0); + } + + switch (pFormat[1]) { + case RPC_FC_DEREFERENCE: + ptr = *(LPVOID*)ptr; + break; + case RPC_FC_CALLBACK: + /* ofs is index into StubDesc->apfnExprEval */ + FIXME("handle callback\n"); + goto finish_conf; + default: + break; + } + + switch (dtype) { + case RPC_FC_LONG: + case RPC_FC_ULONG: + data = *(DWORD*)ptr; + break; + case RPC_FC_SHORT: + data = *(SHORT*)ptr; + break; + case RPC_FC_USHORT: + data = *(USHORT*)ptr; + break; + case RPC_FC_SMALL: + data = *(CHAR*)ptr; + break; + case RPC_FC_USMALL: + data = *(UCHAR*)ptr; + break; + default: + FIXME("unknown conformance data type %x\n", dtype); + goto done_conf_grab; + } + TRACE("dereferenced data type %x at %p, got %ld\n", dtype, ptr, data); + +done_conf_grab: + switch (pFormat[1]) { + case 0: /* no op */ + pStubMsg->MaxCount = data; + break; + case RPC_FC_DEREFERENCE: + /* already handled */ + break; + default: + FIXME("unknown conformance op %d\n", pFormat[1]); + goto finish_conf; + } + +finish_conf: + TRACE("resulting conformance is %ld\n", pStubMsg->MaxCount); + return pFormat+4; +} + + +/* + * NdrConformantString: + * + * What MS calls a ConformantString is, in DCE terminology, + * a Varying-Conformant String. + * [ + * maxlen: DWORD (max # of CHARTYPE characters, inclusive of '\0') + * offset: DWORD (actual string data begins at (offset) CHARTYPE's + * into unmarshalled string) + * length: DWORD (# of CHARTYPE characters, inclusive of '\0') + * [ + * data: CHARTYPE[maxlen] + * ] + * ], where CHARTYPE is the appropriate character type (specified externally) + * + */ + +/*********************************************************************** + * NdrConformantStringMarshall [RPCRT4.@] + */ +unsigned char *WINAPI NdrConformantStringMarshall(MIDL_STUB_MESSAGE *pStubMsg, + unsigned char *pszMessage, PFORMAT_STRING pFormat) +{ + unsigned long len, esize; + unsigned char *c; + + TRACE("(pStubMsg == ^%p, pszMessage == ^%p, pFormat == ^%p)\n", pStubMsg, pszMessage, pFormat); + + assert(pFormat); + if (*pFormat == RPC_FC_C_CSTRING) { + TRACE("string=%s\n", debugstr_a(pszMessage)); + len = strlen(pszMessage)+1; + esize = 1; + } + else if (*pFormat == RPC_FC_C_WSTRING) { + TRACE("string=%s\n", debugstr_w((LPWSTR)pszMessage)); + len = strlenW((LPWSTR)pszMessage)+1; + esize = 2; + } + else { + ERR("Unhandled string type: %#x\n", *pFormat); + /* FIXME: raise an exception. */ + return NULL; + } + + if (pFormat[1] != RPC_FC_PAD) { + FIXME("sized string format=%d\n", pFormat[1]); + } + + assert( (pStubMsg->BufferLength >= (len*esize + 13)) && (pStubMsg->Buffer != NULL) ); + + c = pStubMsg->Buffer; + memset(c, 0, 12); + NDR_LOCAL_UINT32_WRITE(c, len); /* max length: strlen + 1 (for '\0') */ + c += 8; /* offset: 0 */ + NDR_LOCAL_UINT32_WRITE(c, len); /* actual length: (same) */ + c += 4; + memcpy(c, pszMessage, len*esize); /* the string itself */ + c += len*esize; + pStubMsg->Buffer = c; + + STD_OVERFLOW_CHECK(pStubMsg); + + /* success */ + return NULL; /* is this always right? */ +} + +/*********************************************************************** + * NdrConformantStringBufferSize [RPCRT4.@] + */ +void WINAPI NdrConformantStringBufferSize(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char* pMemory, PFORMAT_STRING pFormat) +{ + TRACE("(pStubMsg == ^%p, pMemory == ^%p, pFormat == ^%p)\n", pStubMsg, pMemory, pFormat); + + assert(pFormat); + if (*pFormat == RPC_FC_C_CSTRING) { + /* we need 12 octets for the [maxlen, offset, len] DWORDS, + 1 octet for '\0' */ + TRACE("string=%s\n", debugstr_a(pMemory)); + pStubMsg->BufferLength += strlen(pMemory) + 13 + BUFFER_PARANOIA; + } + else if (*pFormat == RPC_FC_C_WSTRING) { + /* we need 12 octets for the [maxlen, offset, len] DWORDS, + 2 octets for L'\0' */ + TRACE("string=%s\n", debugstr_w((LPWSTR)pMemory)); + pStubMsg->BufferLength += strlenW((LPWSTR)pMemory)*2 + 14 + BUFFER_PARANOIA; + } + else { + ERR("Unhandled string type: %#x\n", *pFormat); + /* FIXME: raise an exception */ + } + + if (pFormat[1] != RPC_FC_PAD) { + FIXME("sized string format=%d\n", pFormat[1]); + } +} + +/************************************************************************ + * NdrConformantStringMemorySize [RPCRT4.@] + */ +unsigned long WINAPI NdrConformantStringMemorySize( PMIDL_STUB_MESSAGE pStubMsg, + PFORMAT_STRING pFormat ) +{ + unsigned long rslt = 0; + + TRACE("(pStubMsg == ^%p, pFormat == ^%p)\n", pStubMsg, pFormat); + + assert(pStubMsg && pFormat); + + if (*pFormat == RPC_FC_C_CSTRING) { + rslt = NDR_LOCAL_UINT32_READ(pStubMsg->Buffer); /* maxlen */ + } + else if (*pFormat == RPC_FC_C_WSTRING) { + rslt = NDR_LOCAL_UINT32_READ(pStubMsg->Buffer)*2; /* maxlen */ + } + else { + ERR("Unhandled string type: %#x\n", *pFormat); + /* FIXME: raise an exception */ + } + + if (pFormat[1] != RPC_FC_PAD) { + FIXME("sized string format=%d\n", pFormat[1]); + } + + TRACE(" --> %lu\n", rslt); + return rslt; +} + +/************************************************************************ + * NdrConformantStringUnmarshall [RPCRT4.@] + */ +unsigned char *WINAPI NdrConformantStringUnmarshall( PMIDL_STUB_MESSAGE pStubMsg, + unsigned char** ppMemory, PFORMAT_STRING pFormat, unsigned char fMustAlloc ) +{ + unsigned long len, esize, ofs; + unsigned char *pMem; + + TRACE("(pStubMsg == ^%p, *pMemory == ^%p, pFormat == ^%p, fMustAlloc == %u)\n", + pStubMsg, *ppMemory, pFormat, fMustAlloc); + + assert(pFormat && ppMemory && pStubMsg); + + pStubMsg->Buffer += 4; + ofs = NDR_LOCAL_UINT32_READ(pStubMsg->Buffer); + pStubMsg->Buffer += 4; + len = NDR_LOCAL_UINT32_READ(pStubMsg->Buffer); + pStubMsg->Buffer += 4; + + if (*pFormat == RPC_FC_C_CSTRING) esize = 1; + else if (*pFormat == RPC_FC_C_WSTRING) esize = 2; + else { + ERR("Unhandled string type: %#x\n", *pFormat); + /* FIXME: raise an exception */ + esize = 0; + } + + if (pFormat[1] != RPC_FC_PAD) { + FIXME("sized string format=%d\n", pFormat[1]); + } + + if (fMustAlloc) { + *ppMemory = NdrAllocate(pStubMsg, len*esize + BUFFER_PARANOIA); + } else { + if (pStubMsg->ReuseBuffer && !*ppMemory) + /* for servers, we may just point straight into the RPC buffer, I think + * (I guess that's what MS does since MIDL code doesn't try to free) */ + *ppMemory = pStubMsg->Buffer - ofs*esize; + /* for clients, memory should be provided by caller */ + } + + pMem = *ppMemory + ofs*esize; + + if (pMem != pStubMsg->Buffer) + memcpy(pMem, pStubMsg->Buffer, len*esize); + + pStubMsg->Buffer += len*esize; + + if (*pFormat == RPC_FC_C_CSTRING) { + TRACE("string=%s\n", debugstr_a(pMem)); + } + else if (*pFormat == RPC_FC_C_WSTRING) { + TRACE("string=%s\n", debugstr_w((LPWSTR)pMem)); + } + + return NULL; /* FIXME: is this always right? */ +} + +/*********************************************************************** + * PointerMarshall + */ +void WINAPI PointerMarshall(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *Buffer, + unsigned char *Pointer, + PFORMAT_STRING pFormat) +{ + unsigned type = pFormat[0], attr = pFormat[1]; + PFORMAT_STRING desc; + NDR_MARSHALL m; + + TRACE("(%p,%p,%p,%p)\n", pStubMsg, Buffer, Pointer, pFormat); + TRACE("type=%d, attr=%d\n", type, attr); + pFormat += 2; + if (attr & RPC_FC_P_SIMPLEPOINTER) desc = pFormat; + else desc = pFormat + *(SHORT*)pFormat; + if (attr & RPC_FC_P_DEREF) { + Pointer = *(unsigned char**)Pointer; + TRACE("deref => %p\n", Pointer); + } + + *(LPVOID*)Buffer = 0; + + switch (type) { + case RPC_FC_RP: /* ref pointer (always non-null) */ + break; + default: + FIXME("unhandled ptr type=%02x\n", type); + } + + m = NdrMarshaller[*desc & NDR_TABLE_MASK]; + if (m) m(pStubMsg, Pointer, desc); + else FIXME("no marshaller for data type=%02x\n", *desc); + + STD_OVERFLOW_CHECK(pStubMsg); +} + +/*********************************************************************** + * PointerUnmarshall + */ +void WINAPI PointerUnmarshall(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *Buffer, + unsigned char **pPointer, + PFORMAT_STRING pFormat, + unsigned char fMustAlloc) +{ + unsigned type = pFormat[0], attr = pFormat[1]; + PFORMAT_STRING desc; + NDR_UNMARSHALL m; + + TRACE("(%p,%p,%p,%p,%d)\n", pStubMsg, Buffer, pPointer, pFormat, fMustAlloc); + TRACE("type=%d, attr=%d\n", type, attr); + pFormat += 2; + if (attr & RPC_FC_P_SIMPLEPOINTER) desc = pFormat; + else desc = pFormat + *(SHORT*)pFormat; + if (attr & RPC_FC_P_DEREF) { + pPointer = *(unsigned char***)pPointer; + TRACE("deref => %p\n", pPointer); + } + + switch (type) { + case RPC_FC_RP: /* ref pointer (always non-null) */ + break; + default: + FIXME("unhandled ptr type=%02x\n", type); + } + + *pPointer = NULL; + + m = NdrUnmarshaller[*desc & NDR_TABLE_MASK]; + if (m) m(pStubMsg, pPointer, desc, fMustAlloc); + else FIXME("no unmarshaller for data type=%02x\n", *desc); + TRACE("pointer=%p\n", *pPointer); +} + +/*********************************************************************** + * PointerBufferSize + */ +void WINAPI PointerBufferSize(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *Pointer, + PFORMAT_STRING pFormat) +{ + unsigned type = pFormat[0], attr = pFormat[1]; + PFORMAT_STRING desc; + NDR_BUFFERSIZE m; + + TRACE("(%p,%p,%p)\n", pStubMsg, Pointer, pFormat); + TRACE("type=%d, attr=%d\n", type, attr); + pFormat += 2; + if (attr & RPC_FC_P_SIMPLEPOINTER) desc = pFormat; + else desc = pFormat + *(SHORT*)pFormat; + if (attr & RPC_FC_P_DEREF) { + Pointer = *(unsigned char**)Pointer; + TRACE("deref => %p\n", Pointer); + } + + switch (type) { + case RPC_FC_RP: /* ref pointer (always non-null) */ + break; + default: + FIXME("unhandled ptr type=%02x\n", type); + } + + m = NdrBufferSizer[*desc & NDR_TABLE_MASK]; + if (m) m(pStubMsg, Pointer, desc); + else FIXME("no buffersizer for data type=%02x\n", *desc); +} + +/*********************************************************************** + * PointerMemorySize [RPCRT4.@] + */ +unsigned long WINAPI PointerMemorySize(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *Buffer, + PFORMAT_STRING pFormat) +{ + unsigned type = pFormat[0], attr = pFormat[1]; + PFORMAT_STRING desc; + NDR_MEMORYSIZE m; + + FIXME("(%p,%p,%p): stub\n", pStubMsg, Buffer, pFormat); + TRACE("type=%d, attr=%d\n", type, attr); + pFormat += 2; + if (attr & RPC_FC_P_SIMPLEPOINTER) desc = pFormat; + else desc = pFormat + *(SHORT*)pFormat; + if (attr & RPC_FC_P_DEREF) { + TRACE("deref\n"); + } + + switch (type) { + case RPC_FC_RP: /* ref pointer (always non-null) */ + break; + default: + FIXME("unhandled ptr type=%02x\n", type); + } + + m = NdrMemorySizer[*desc & NDR_TABLE_MASK]; + if (m) m(pStubMsg, desc); + else FIXME("no memorysizer for data type=%02x\n", *desc); + + return 0; +} + +/*********************************************************************** + * PointerFree [RPCRT4.@] + */ +void WINAPI PointerFree(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *Pointer, + PFORMAT_STRING pFormat) +{ + unsigned type = pFormat[0], attr = pFormat[1]; + PFORMAT_STRING desc; + NDR_FREE m; + + TRACE("(%p,%p,%p)\n", pStubMsg, Pointer, pFormat); + TRACE("type=%d, attr=%d\n", type, attr); + if (attr & RPC_FC_P_DONTFREE) return; + pFormat += 2; + if (attr & RPC_FC_P_SIMPLEPOINTER) desc = pFormat; + else desc = pFormat + *(SHORT*)pFormat; + if (attr & RPC_FC_P_DEREF) { + Pointer = *(unsigned char**)Pointer; + TRACE("deref => %p\n", Pointer); + } + + if (!Pointer) return; + + m = NdrFreer[*desc & NDR_TABLE_MASK]; + if (m) m(pStubMsg, Pointer, desc); + + /* hmm... is this sensible? + * perhaps we should check if the memory comes from NdrAllocate, + * and deallocate only if so - checking if the pointer is between + * BufferStart and BufferEnd is probably no good since the buffer + * may be reallocated when the server wants to marshal the reply */ + switch (*desc) { + case RPC_FC_BOGUS_STRUCT: + case RPC_FC_BOGUS_ARRAY: + case RPC_FC_USER_MARSHAL: + break; + default: + FIXME("unhandled data type=%02x\n", *desc); + case RPC_FC_CARRAY: + case RPC_FC_C_CSTRING: + case RPC_FC_C_WSTRING: + if (pStubMsg->ReuseBuffer) goto notfree; + break; + case RPC_FC_IP: + goto notfree; + } + + if (attr & RPC_FC_P_ONSTACK) { + TRACE("not freeing stack ptr %p\n", Pointer); + return; + } + TRACE("freeing %p\n", Pointer); + NdrFree(pStubMsg, Pointer); + return; +notfree: + TRACE("not freeing %p\n", Pointer); +} + +/*********************************************************************** + * EmbeddedPointerMarshall + */ +unsigned char * WINAPI EmbeddedPointerMarshall(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *pMemory, + PFORMAT_STRING pFormat) +{ + unsigned char *Mark = pStubMsg->BufferMark; + unsigned long Offset = pStubMsg->Offset; + unsigned ofs, rep, count, stride, xofs; + + TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat); + + if (*pFormat != RPC_FC_PP) return NULL; + pFormat += 2; + + while (pFormat[0] != RPC_FC_END) { + switch (pFormat[0]) { + default: + FIXME("unknown repeat type %d\n", pFormat[0]); + case RPC_FC_NO_REPEAT: + rep = 1; + stride = 0; + ofs = 0; + count = 1; + xofs = 0; + pFormat += 2; + break; + case RPC_FC_FIXED_REPEAT: + rep = *(WORD*)&pFormat[2]; + stride = *(WORD*)&pFormat[4]; + ofs = *(WORD*)&pFormat[6]; + count = *(WORD*)&pFormat[8]; + xofs = 0; + pFormat += 10; + break; + case RPC_FC_VARIABLE_REPEAT: + rep = pStubMsg->MaxCount; + stride = *(WORD*)&pFormat[2]; + ofs = *(WORD*)&pFormat[4]; + count = *(WORD*)&pFormat[6]; + xofs = (pFormat[1] == RPC_FC_VARIABLE_OFFSET) ? Offset * stride : 0; + pFormat += 8; + break; + } + /* ofs doesn't seem to matter in this context */ + while (rep) { + PFORMAT_STRING info = pFormat; + unsigned char *membase = pMemory + xofs; + unsigned u; + for (u=0; uBufferMark; + unsigned long Offset = pStubMsg->Offset; + unsigned ofs, rep, count, stride, xofs; + + TRACE("(%p,%p,%p,%d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc); + + if (*pFormat != RPC_FC_PP) return NULL; + pFormat += 2; + + while (pFormat[0] != RPC_FC_END) { + switch (pFormat[0]) { + default: + FIXME("unknown repeat type %d\n", pFormat[0]); + case RPC_FC_NO_REPEAT: + rep = 1; + stride = 0; + ofs = 0; + count = 1; + xofs = 0; + pFormat += 2; + break; + case RPC_FC_FIXED_REPEAT: + rep = *(WORD*)&pFormat[2]; + stride = *(WORD*)&pFormat[4]; + ofs = *(WORD*)&pFormat[6]; + count = *(WORD*)&pFormat[8]; + xofs = 0; + pFormat += 10; + break; + case RPC_FC_VARIABLE_REPEAT: + rep = pStubMsg->MaxCount; + stride = *(WORD*)&pFormat[2]; + ofs = *(WORD*)&pFormat[4]; + count = *(WORD*)&pFormat[6]; + xofs = (pFormat[1] == RPC_FC_VARIABLE_OFFSET) ? Offset * stride : 0; + pFormat += 8; + break; + } + /* ofs doesn't seem to matter in this context */ + while (rep) { + PFORMAT_STRING info = pFormat; + unsigned char *membase = *ppMemory + xofs; + unsigned u; + for (u=0; uOffset; + unsigned ofs, rep, count, stride, xofs; + + TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat); + if (*pFormat != RPC_FC_PP) return; + pFormat += 2; + + while (pFormat[0] != RPC_FC_END) { + switch (pFormat[0]) { + default: + FIXME("unknown repeat type %d\n", pFormat[0]); + case RPC_FC_NO_REPEAT: + rep = 1; + stride = 0; + ofs = 0; + count = 1; + xofs = 0; + pFormat += 2; + break; + case RPC_FC_FIXED_REPEAT: + rep = *(WORD*)&pFormat[2]; + stride = *(WORD*)&pFormat[4]; + ofs = *(WORD*)&pFormat[6]; + count = *(WORD*)&pFormat[8]; + xofs = 0; + pFormat += 10; + break; + case RPC_FC_VARIABLE_REPEAT: + rep = pStubMsg->MaxCount; + stride = *(WORD*)&pFormat[2]; + ofs = *(WORD*)&pFormat[4]; + count = *(WORD*)&pFormat[6]; + xofs = (pFormat[1] == RPC_FC_VARIABLE_OFFSET) ? Offset * stride : 0; + pFormat += 8; + break; + } + /* ofs doesn't seem to matter in this context */ + while (rep) { + PFORMAT_STRING info = pFormat; + unsigned char *membase = pMemory + xofs; + unsigned u; + for (u=0; uOffset; + unsigned char *Mark = pStubMsg->BufferMark; + unsigned ofs, rep, count, stride, xofs; + + FIXME("(%p,%p): stub\n", pStubMsg, pFormat); + if (*pFormat != RPC_FC_PP) return 0; + pFormat += 2; + + while (pFormat[0] != RPC_FC_END) { + switch (pFormat[0]) { + default: + FIXME("unknown repeat type %d\n", pFormat[0]); + case RPC_FC_NO_REPEAT: + rep = 1; + stride = 0; + ofs = 0; + count = 1; + xofs = 0; + pFormat += 2; + break; + case RPC_FC_FIXED_REPEAT: + rep = *(WORD*)&pFormat[2]; + stride = *(WORD*)&pFormat[4]; + ofs = *(WORD*)&pFormat[6]; + count = *(WORD*)&pFormat[8]; + xofs = 0; + pFormat += 10; + break; + case RPC_FC_VARIABLE_REPEAT: + rep = pStubMsg->MaxCount; + stride = *(WORD*)&pFormat[2]; + ofs = *(WORD*)&pFormat[4]; + count = *(WORD*)&pFormat[6]; + xofs = (pFormat[1] == RPC_FC_VARIABLE_OFFSET) ? Offset * stride : 0; + pFormat += 8; + break; + } + /* ofs doesn't seem to matter in this context */ + while (rep) { + PFORMAT_STRING info = pFormat; + unsigned u; + for (u=0; uOffset; + unsigned ofs, rep, count, stride, xofs; + + TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat); + if (*pFormat != RPC_FC_PP) return; + pFormat += 2; + + while (pFormat[0] != RPC_FC_END) { + switch (pFormat[0]) { + default: + FIXME("unknown repeat type %d\n", pFormat[0]); + case RPC_FC_NO_REPEAT: + rep = 1; + stride = 0; + ofs = 0; + count = 1; + xofs = 0; + pFormat += 2; + break; + case RPC_FC_FIXED_REPEAT: + rep = *(WORD*)&pFormat[2]; + stride = *(WORD*)&pFormat[4]; + ofs = *(WORD*)&pFormat[6]; + count = *(WORD*)&pFormat[8]; + xofs = 0; + pFormat += 10; + break; + case RPC_FC_VARIABLE_REPEAT: + rep = pStubMsg->MaxCount; + stride = *(WORD*)&pFormat[2]; + ofs = *(WORD*)&pFormat[4]; + count = *(WORD*)&pFormat[6]; + xofs = (pFormat[1] == RPC_FC_VARIABLE_OFFSET) ? Offset * stride : 0; + pFormat += 8; + break; + } + /* ofs doesn't seem to matter in this context */ + while (rep) { + PFORMAT_STRING info = pFormat; + unsigned char *membase = pMemory + xofs; + unsigned u; + for (u=0; uBufferMark = pStubMsg->Buffer; + PointerMarshall(pStubMsg, pStubMsg->Buffer, pMemory, pFormat); + pStubMsg->Buffer += 4; + + STD_OVERFLOW_CHECK(pStubMsg); + + return NULL; +} + +/*********************************************************************** + * NdrPointerUnmarshall [RPCRT4.@] + */ +unsigned char * WINAPI NdrPointerUnmarshall(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char **ppMemory, + PFORMAT_STRING pFormat, + unsigned char fMustAlloc) +{ + TRACE("(%p,%p,%p,%d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc); + + pStubMsg->BufferMark = pStubMsg->Buffer; + PointerUnmarshall(pStubMsg, pStubMsg->Buffer, ppMemory, pFormat, fMustAlloc); + pStubMsg->Buffer += 4; + + return NULL; +} + +/*********************************************************************** + * NdrPointerBufferSize [RPCRT4.@] + */ +void WINAPI NdrPointerBufferSize(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *pMemory, + PFORMAT_STRING pFormat) +{ + TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat); + pStubMsg->BufferLength += 4; + PointerBufferSize(pStubMsg, pMemory, pFormat); +} + +/*********************************************************************** + * NdrPointerMemorySize [RPCRT4.@] + */ +unsigned long WINAPI NdrPointerMemorySize(PMIDL_STUB_MESSAGE pStubMsg, + PFORMAT_STRING pFormat) +{ + /* unsigned size = *(LPWORD)(pFormat+2); */ + FIXME("(%p,%p): stub\n", pStubMsg, pFormat); + PointerMemorySize(pStubMsg, pStubMsg->Buffer, pFormat); + return 0; +} + +/*********************************************************************** + * NdrPointerFree [RPCRT4.@] + */ +void WINAPI NdrPointerFree(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *pMemory, + PFORMAT_STRING pFormat) +{ + TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat); + PointerFree(pStubMsg, pMemory, pFormat); +} + +/*********************************************************************** + * NdrSimpleStructMarshall [RPCRT4.@] + */ +unsigned char * WINAPI NdrSimpleStructMarshall(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *pMemory, + PFORMAT_STRING pFormat) +{ + unsigned size = *(LPWORD)(pFormat+2); + TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat); + + memcpy(pStubMsg->Buffer, pMemory, size); + pStubMsg->BufferMark = pStubMsg->Buffer; + pStubMsg->Buffer += size; + + if (pFormat[0] != RPC_FC_STRUCT) + EmbeddedPointerMarshall(pStubMsg, pMemory, pFormat+4); + + STD_OVERFLOW_CHECK(pStubMsg); + + return NULL; +} + +/*********************************************************************** + * NdrSimpleStructUnmarshall [RPCRT4.@] + */ +unsigned char * WINAPI NdrSimpleStructUnmarshall(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char **ppMemory, + PFORMAT_STRING pFormat, + unsigned char fMustAlloc) +{ + unsigned size = *(LPWORD)(pFormat+2); + TRACE("(%p,%p,%p,%d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc); + + if (fMustAlloc) { + *ppMemory = NdrAllocate(pStubMsg, size); + memcpy(*ppMemory, pStubMsg->Buffer, size); + } else { + if (pStubMsg->ReuseBuffer && !*ppMemory) + /* for servers, we may just point straight into the RPC buffer, I think + * (I guess that's what MS does since MIDL code doesn't try to free) */ + *ppMemory = pStubMsg->Buffer; + else + /* for clients, memory should be provided by caller */ + memcpy(*ppMemory, pStubMsg->Buffer, size); + } + + pStubMsg->BufferMark = pStubMsg->Buffer; + pStubMsg->Buffer += size; + + if (pFormat[0] != RPC_FC_STRUCT) + EmbeddedPointerUnmarshall(pStubMsg, ppMemory, pFormat+4, fMustAlloc); + + return NULL; +} + + +/*********************************************************************** + * NdrSimpleStructUnmarshall [RPCRT4.@] + */ +void WINAPI NdrSimpleTypeMarshall( PMIDL_STUB_MESSAGE pStubMsg, unsigned char* pMemory, + unsigned char FormatChar ) +{ + FIXME("stub\n"); +} + + +/*********************************************************************** + * NdrSimpleStructUnmarshall [RPCRT4.@] + */ +void WINAPI NdrSimpleTypeUnmarshall( PMIDL_STUB_MESSAGE pStubMsg, unsigned char* pMemory, + unsigned char FormatChar ) +{ + FIXME("stub\n"); +} + + +/*********************************************************************** + * NdrSimpleStructBufferSize [RPCRT4.@] + */ +void WINAPI NdrSimpleStructBufferSize(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *pMemory, + PFORMAT_STRING pFormat) +{ + unsigned size = *(LPWORD)(pFormat+2); + TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat); + pStubMsg->BufferLength += size; + if (pFormat[0] != RPC_FC_STRUCT) + EmbeddedPointerBufferSize(pStubMsg, pMemory, pFormat+4); +} + +/*********************************************************************** + * NdrSimpleStructMemorySize [RPCRT4.@] + */ +unsigned long WINAPI NdrSimpleStructMemorySize(PMIDL_STUB_MESSAGE pStubMsg, + PFORMAT_STRING pFormat) +{ + /* unsigned size = *(LPWORD)(pFormat+2); */ + FIXME("(%p,%p): stub\n", pStubMsg, pFormat); + if (pFormat[0] != RPC_FC_STRUCT) + EmbeddedPointerMemorySize(pStubMsg, pFormat+4); + return 0; +} + +/*********************************************************************** + * NdrSimpleStructFree [RPCRT4.@] + */ +void WINAPI NdrSimpleStructFree(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *pMemory, + PFORMAT_STRING pFormat) +{ + TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat); + if (pFormat[0] != RPC_FC_STRUCT) + EmbeddedPointerFree(pStubMsg, pMemory, pFormat+4); +} + + +unsigned long WINAPI EmbeddedComplexSize(PMIDL_STUB_MESSAGE pStubMsg, + PFORMAT_STRING pFormat) +{ + switch (*pFormat) { + case RPC_FC_STRUCT: + case RPC_FC_PSTRUCT: + case RPC_FC_CSTRUCT: + case RPC_FC_BOGUS_STRUCT: + return *(WORD*)&pFormat[2]; + case RPC_FC_USER_MARSHAL: + return *(WORD*)&pFormat[4]; + default: + FIXME("unhandled embedded type %02x\n", *pFormat); + } + return 0; +} + + +unsigned char * WINAPI ComplexMarshall(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *pMemory, + PFORMAT_STRING pFormat, + PFORMAT_STRING pPointer) +{ + PFORMAT_STRING desc; + NDR_MARSHALL m; + unsigned long size; + + while (*pFormat != RPC_FC_END) { + switch (*pFormat) { + case RPC_FC_SHORT: + case RPC_FC_USHORT: + TRACE("short=%d <= %p\n", *(WORD*)pMemory, pMemory); + memcpy(pStubMsg->Buffer, pMemory, 2); + pStubMsg->Buffer += 2; + pMemory += 2; + break; + case RPC_FC_LONG: + case RPC_FC_ULONG: + TRACE("long=%ld <= %p\n", *(DWORD*)pMemory, pMemory); + memcpy(pStubMsg->Buffer, pMemory, 4); + pStubMsg->Buffer += 4; + pMemory += 4; + break; + case RPC_FC_POINTER: + TRACE("pointer=%p <= %p\n", *(unsigned char**)pMemory, pMemory); + NdrPointerMarshall(pStubMsg, *(unsigned char**)pMemory, pPointer); + pPointer += 4; + pMemory += 4; + break; + case RPC_FC_ALIGNM4: + ALIGN_POINTER(pMemory, 3); + break; + case RPC_FC_ALIGNM8: + ALIGN_POINTER(pMemory, 7); + break; + case RPC_FC_EMBEDDED_COMPLEX: + pMemory += pFormat[1]; + pFormat += 2; + desc = pFormat + *(SHORT*)pFormat; + size = EmbeddedComplexSize(pStubMsg, desc); + TRACE("embedded complex (size=%ld) <= %p\n", size, pMemory); + m = NdrMarshaller[*desc & NDR_TABLE_MASK]; + if (m) m(pStubMsg, pMemory, desc); + else FIXME("no marshaller for embedded type %02x\n", *desc); + pMemory += size; + pFormat += 2; + continue; + case RPC_FC_PAD: + break; + default: + FIXME("unhandled format %02x\n", *pFormat); + } + pFormat++; + } + + return pMemory; +} + +unsigned char * WINAPI ComplexUnmarshall(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *pMemory, + PFORMAT_STRING pFormat, + PFORMAT_STRING pPointer, + unsigned char fMustAlloc) +{ + PFORMAT_STRING desc; + NDR_UNMARSHALL m; + unsigned long size; + + while (*pFormat != RPC_FC_END) { + switch (*pFormat) { + case RPC_FC_SHORT: + case RPC_FC_USHORT: + memcpy(pMemory, pStubMsg->Buffer, 2); + TRACE("short=%d => %p\n", *(WORD*)pMemory, pMemory); + pStubMsg->Buffer += 2; + pMemory += 2; + break; + case RPC_FC_LONG: + case RPC_FC_ULONG: + memcpy(pMemory, pStubMsg->Buffer, 4); + TRACE("long=%ld => %p\n", *(DWORD*)pMemory, pMemory); + pStubMsg->Buffer += 4; + pMemory += 4; + break; + case RPC_FC_POINTER: + *(unsigned char**)pMemory = NULL; + TRACE("pointer => %p\n", pMemory); + NdrPointerUnmarshall(pStubMsg, (unsigned char**)pMemory, pPointer, fMustAlloc); + pPointer += 4; + pMemory += 4; + break; + case RPC_FC_ALIGNM4: + ALIGN_POINTER(pMemory, 3); + break; + case RPC_FC_ALIGNM8: + ALIGN_POINTER(pMemory, 7); + break; + case RPC_FC_EMBEDDED_COMPLEX: + pMemory += pFormat[1]; + pFormat += 2; + desc = pFormat + *(SHORT*)pFormat; + size = EmbeddedComplexSize(pStubMsg, desc); + TRACE("embedded complex (size=%ld) => %p\n", size, pMemory); + m = NdrUnmarshaller[*desc & NDR_TABLE_MASK]; + memset(pMemory, 0, size); /* just in case */ + if (m) m(pStubMsg, &pMemory, desc, fMustAlloc); + else FIXME("no unmarshaller for embedded type %02x\n", *desc); + pMemory += size; + pFormat += 2; + continue; + case RPC_FC_PAD: + break; + default: + FIXME("unhandled format %d\n", *pFormat); + } + pFormat++; + } + + return pMemory; +} + +unsigned char * WINAPI ComplexBufferSize(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *pMemory, + PFORMAT_STRING pFormat, + PFORMAT_STRING pPointer) +{ + PFORMAT_STRING desc; + NDR_BUFFERSIZE m; + unsigned long size; + + while (*pFormat != RPC_FC_END) { + switch (*pFormat) { + case RPC_FC_SHORT: + case RPC_FC_USHORT: + pStubMsg->BufferLength += 2; + pMemory += 2; + break; + case RPC_FC_LONG: + case RPC_FC_ULONG: + pStubMsg->BufferLength += 4; + pMemory += 4; + break; + case RPC_FC_POINTER: + NdrPointerBufferSize(pStubMsg, *(unsigned char**)pMemory, pPointer); + pPointer += 4; + pMemory += 4; + break; + case RPC_FC_ALIGNM4: + ALIGN_POINTER(pMemory, 3); + break; + case RPC_FC_ALIGNM8: + ALIGN_POINTER(pMemory, 7); + break; + case RPC_FC_EMBEDDED_COMPLEX: + pMemory += pFormat[1]; + pFormat += 2; + desc = pFormat + *(SHORT*)pFormat; + size = EmbeddedComplexSize(pStubMsg, desc); + m = NdrBufferSizer[*desc & NDR_TABLE_MASK]; + if (m) m(pStubMsg, pMemory, desc); + else FIXME("no buffersizer for embedded type %02x\n", *desc); + pMemory += size; + pFormat += 2; + continue; + case RPC_FC_PAD: + break; + default: + FIXME("unhandled format %d\n", *pFormat); + } + pFormat++; + } + + return pMemory; +} + +unsigned char * WINAPI ComplexFree(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *pMemory, + PFORMAT_STRING pFormat, + PFORMAT_STRING pPointer) +{ + PFORMAT_STRING desc; + NDR_FREE m; + unsigned long size; + + while (*pFormat != RPC_FC_END) { + switch (*pFormat) { + case RPC_FC_SHORT: + case RPC_FC_USHORT: + pMemory += 2; + break; + case RPC_FC_LONG: + case RPC_FC_ULONG: + pMemory += 4; + break; + case RPC_FC_POINTER: + NdrPointerFree(pStubMsg, *(unsigned char**)pMemory, pPointer); + pPointer += 4; + pMemory += 4; + break; + case RPC_FC_ALIGNM4: + ALIGN_POINTER(pMemory, 3); + break; + case RPC_FC_ALIGNM8: + ALIGN_POINTER(pMemory, 7); + break; + case RPC_FC_EMBEDDED_COMPLEX: + pMemory += pFormat[1]; + pFormat += 2; + desc = pFormat + *(SHORT*)pFormat; + size = EmbeddedComplexSize(pStubMsg, desc); + m = NdrFreer[*desc & NDR_TABLE_MASK]; + if (m) m(pStubMsg, pMemory, desc); + else FIXME("no freer for embedded type %02x\n", *desc); + pMemory += size; + pFormat += 2; + continue; + case RPC_FC_PAD: + break; + default: + FIXME("unhandled format %d\n", *pFormat); + } + pFormat++; + } + + return pMemory; +} + +unsigned long WINAPI ComplexStructSize(PMIDL_STUB_MESSAGE pStubMsg, + PFORMAT_STRING pFormat) +{ + PFORMAT_STRING desc; + unsigned long size = 0; + + while (*pFormat != RPC_FC_END) { + switch (*pFormat) { + case RPC_FC_SHORT: + case RPC_FC_USHORT: + size += 2; + break; + case RPC_FC_LONG: + case RPC_FC_ULONG: + size += 4; + break; + case RPC_FC_POINTER: + size += 4; + break; + case RPC_FC_ALIGNM4: + ALIGN_LENGTH(size, 3); + break; + case RPC_FC_ALIGNM8: + ALIGN_LENGTH(size, 7); + break; + case RPC_FC_EMBEDDED_COMPLEX: + size += pFormat[1]; + pFormat += 2; + desc = pFormat + *(SHORT*)pFormat; + size += EmbeddedComplexSize(pStubMsg, desc); + pFormat += 2; + continue; + case RPC_FC_PAD: + break; + default: + FIXME("unhandled format %d\n", *pFormat); + } + pFormat++; + } + + return size; +} + +/*********************************************************************** + * NdrComplexStructMarshall [RPCRT4.@] + */ +unsigned char * WINAPI NdrComplexStructMarshall(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *pMemory, + PFORMAT_STRING pFormat) +{ + PFORMAT_STRING conf_array = NULL; + PFORMAT_STRING pointer_desc = NULL; + unsigned char *OldMemory = pStubMsg->Memory; + + TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat); + + pFormat += 4; + if (*(WORD*)pFormat) conf_array = pFormat + *(WORD*)pFormat; + pFormat += 2; + if (*(WORD*)pFormat) pointer_desc = pFormat + *(WORD*)pFormat; + pFormat += 2; + + pStubMsg->Memory = pMemory; + + ComplexMarshall(pStubMsg, pMemory, pFormat, pointer_desc); + + if (conf_array) + NdrConformantArrayMarshall(pStubMsg, pMemory, conf_array); + + pStubMsg->Memory = OldMemory; + + STD_OVERFLOW_CHECK(pStubMsg); + + return NULL; +} + +/*********************************************************************** + * NdrComplexStructUnmarshall [RPCRT4.@] + */ +unsigned char * WINAPI NdrComplexStructUnmarshall(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char **ppMemory, + PFORMAT_STRING pFormat, + unsigned char fMustAlloc) +{ + unsigned size = *(LPWORD)(pFormat+2); + PFORMAT_STRING conf_array = NULL; + PFORMAT_STRING pointer_desc = NULL; + unsigned char *pMemory; + + TRACE("(%p,%p,%p,%d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc); + + if (fMustAlloc || !*ppMemory) + *ppMemory = NdrAllocate(pStubMsg, size); + + pFormat += 4; + if (*(WORD*)pFormat) conf_array = pFormat + *(WORD*)pFormat; + pFormat += 2; + if (*(WORD*)pFormat) pointer_desc = pFormat + *(WORD*)pFormat; + pFormat += 2; + + pMemory = ComplexUnmarshall(pStubMsg, *ppMemory, pFormat, pointer_desc, fMustAlloc); + + if (conf_array) + NdrConformantArrayUnmarshall(pStubMsg, &pMemory, conf_array, fMustAlloc); + + return NULL; +} + +/*********************************************************************** + * NdrComplexStructBufferSize [RPCRT4.@] + */ +void WINAPI NdrComplexStructBufferSize(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *pMemory, + PFORMAT_STRING pFormat) +{ + PFORMAT_STRING conf_array = NULL; + PFORMAT_STRING pointer_desc = NULL; + unsigned char *OldMemory = pStubMsg->Memory; + + TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat); + + pFormat += 4; + if (*(WORD*)pFormat) conf_array = pFormat + *(WORD*)pFormat; + pFormat += 2; + if (*(WORD*)pFormat) pointer_desc = pFormat + *(WORD*)pFormat; + pFormat += 2; + + pStubMsg->Memory = pMemory; + + pMemory = ComplexBufferSize(pStubMsg, pMemory, pFormat, pointer_desc); + + if (conf_array) + NdrConformantArrayBufferSize(pStubMsg, pMemory, conf_array); + + pStubMsg->Memory = OldMemory; +} + +/*********************************************************************** + * NdrComplexStructMemorySize [RPCRT4.@] + */ +unsigned long WINAPI NdrComplexStructMemorySize(PMIDL_STUB_MESSAGE pStubMsg, + PFORMAT_STRING pFormat) +{ + /* unsigned size = *(LPWORD)(pFormat+2); */ + PFORMAT_STRING conf_array = NULL; + PFORMAT_STRING pointer_desc = NULL; + + FIXME("(%p,%p): stub\n", pStubMsg, pFormat); + + pFormat += 4; + if (*(WORD*)pFormat) conf_array = pFormat + *(WORD*)pFormat; + pFormat += 2; + if (*(WORD*)pFormat) pointer_desc = pFormat + *(WORD*)pFormat; + pFormat += 2; + + return 0; +} + +/*********************************************************************** + * NdrComplexStructFree [RPCRT4.@] + */ +void WINAPI NdrComplexStructFree(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *pMemory, + PFORMAT_STRING pFormat) +{ + PFORMAT_STRING conf_array = NULL; + PFORMAT_STRING pointer_desc = NULL; + unsigned char *OldMemory = pStubMsg->Memory; + + TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat); + + pFormat += 4; + if (*(WORD*)pFormat) conf_array = pFormat + *(WORD*)pFormat; + pFormat += 2; + if (*(WORD*)pFormat) pointer_desc = pFormat + *(WORD*)pFormat; + pFormat += 2; + + pStubMsg->Memory = pMemory; + + pMemory = ComplexFree(pStubMsg, pMemory, pFormat, pointer_desc); + + if (conf_array) + NdrConformantArrayFree(pStubMsg, pMemory, conf_array); + + pStubMsg->Memory = OldMemory; +} + +/*********************************************************************** + * NdrConformantArrayMarshall [RPCRT4.@] + */ +unsigned char * WINAPI NdrConformantArrayMarshall(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *pMemory, + PFORMAT_STRING pFormat) +{ + DWORD size = 0, esize = *(LPWORD)(pFormat+2); + TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat); + if (pFormat[0] != RPC_FC_CARRAY) FIXME("format=%d\n", pFormat[0]); + + pFormat = ComputeConformance(pStubMsg, pMemory, pFormat+4, 0); + size = pStubMsg->MaxCount; + + NDR_LOCAL_UINT32_WRITE(pStubMsg->Buffer, size); + pStubMsg->Buffer += 4; + + memcpy(pStubMsg->Buffer, pMemory, size*esize); + pStubMsg->BufferMark = pStubMsg->Buffer; + pStubMsg->Buffer += size*esize; + + EmbeddedPointerMarshall(pStubMsg, pMemory, pFormat); + + STD_OVERFLOW_CHECK(pStubMsg); + + return NULL; +} + +/*********************************************************************** + * NdrConformantArrayUnmarshall [RPCRT4.@] + */ +unsigned char * WINAPI NdrConformantArrayUnmarshall(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char **ppMemory, + PFORMAT_STRING pFormat, + unsigned char fMustAlloc) +{ + DWORD size = 0, esize = *(LPWORD)(pFormat+2); + TRACE("(%p,%p,%p,%d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc); + if (pFormat[0] != RPC_FC_CARRAY) FIXME("format=%d\n", pFormat[0]); + + pFormat = ReadConformance(pStubMsg, pFormat+4); + size = pStubMsg->MaxCount; + + if (fMustAlloc) { + *ppMemory = NdrAllocate(pStubMsg, size*esize); + memcpy(*ppMemory, pStubMsg->Buffer, size*esize); + } else { + if (pStubMsg->ReuseBuffer && !*ppMemory) + /* for servers, we may just point straight into the RPC buffer, I think + * (I guess that's what MS does since MIDL code doesn't try to free) */ + *ppMemory = pStubMsg->Buffer; + else + /* for clients, memory should be provided by caller */ + memcpy(*ppMemory, pStubMsg->Buffer, size*esize); + } + + pStubMsg->BufferMark = pStubMsg->Buffer; + pStubMsg->Buffer += size*esize; + + EmbeddedPointerUnmarshall(pStubMsg, ppMemory, pFormat, fMustAlloc); + + return NULL; +} + +/*********************************************************************** + * NdrConformantArrayBufferSize [RPCRT4.@] + */ +void WINAPI NdrConformantArrayBufferSize(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *pMemory, + PFORMAT_STRING pFormat) +{ + DWORD size = 0, esize = *(LPWORD)(pFormat+2); + TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat); + if (pFormat[0] != RPC_FC_CARRAY) FIXME("format=%d\n", pFormat[0]); + + pFormat = ComputeConformance(pStubMsg, pMemory, pFormat+4, 0); + size = pStubMsg->MaxCount; + + pStubMsg->BufferLength += size*esize; + + EmbeddedPointerBufferSize(pStubMsg, pMemory, pFormat); +} + +/*********************************************************************** + * NdrConformantArrayMemorySize [RPCRT4.@] + */ +unsigned long WINAPI NdrConformantArrayMemorySize(PMIDL_STUB_MESSAGE pStubMsg, + PFORMAT_STRING pFormat) +{ + DWORD size = 0; + FIXME("(%p,%p): stub\n", pStubMsg, pFormat); + if (pFormat[0] != RPC_FC_CARRAY) FIXME("format=%d\n", pFormat[0]); + + pFormat = ReadConformance(pStubMsg, pFormat+4); + size = pStubMsg->MaxCount; + + EmbeddedPointerMemorySize(pStubMsg, pFormat); + + return 0; +} + +/*********************************************************************** + * NdrConformantArrayFree [RPCRT4.@] + */ +void WINAPI NdrConformantArrayFree(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *pMemory, + PFORMAT_STRING pFormat) +{ + TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat); + if (pFormat[0] != RPC_FC_CARRAY) FIXME("format=%d\n", pFormat[0]); + + EmbeddedPointerFree(pStubMsg, pMemory, pFormat); +} + + +/*********************************************************************** + * NdrConformantVaryingArrayMarshall [RPCRT4.@] + */ +unsigned char* WINAPI NdrConformantVaryingArrayMarshall( PMIDL_STUB_MESSAGE pStubMsg, + unsigned char* pMemory, + PFORMAT_STRING pFormat ) +{ + FIXME( "stub\n" ); + return NULL; +} + + +/*********************************************************************** + * NdrConformantVaryingArrayUnmarshall [RPCRT4.@] + */ +unsigned char* WINAPI NdrConformantVaryingArrayUnmarshall( PMIDL_STUB_MESSAGE pStubMsg, + unsigned char** ppMemory, + PFORMAT_STRING pFormat, + unsigned char fMustAlloc ) +{ + FIXME( "stub\n" ); + return NULL; +} + + +/*********************************************************************** + * NdrConformantVaryingArrayFree [RPCRT4.@] + */ +void WINAPI NdrConformantVaryingArrayFree( PMIDL_STUB_MESSAGE pStubMsg, + unsigned char* pMemory, + PFORMAT_STRING pFormat ) +{ + FIXME( "stub\n" ); +} + + +/*********************************************************************** + * NdrConformantVaryingArrayBufferSize [RPCRT4.@] + */ +void WINAPI NdrConformantVaryingArrayBufferSize( PMIDL_STUB_MESSAGE pStubMsg, + unsigned char* pMemory, PFORMAT_STRING pFormat ) +{ + FIXME( "stub\n" ); +} + + +/*********************************************************************** + * NdrConformantVaryingArrayMemorySize [RPCRT4.@] + */ +unsigned long WINAPI NdrConformantVaryingArrayMemorySize( PMIDL_STUB_MESSAGE pStubMsg, + PFORMAT_STRING pFormat ) +{ + FIXME( "stub\n" ); + return 0; +} + + +/*********************************************************************** + * NdrComplexArrayMarshall [RPCRT4.@] + */ +unsigned char * WINAPI NdrComplexArrayMarshall(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *pMemory, + PFORMAT_STRING pFormat) +{ + DWORD size = 0, count, def; + TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat); + + def = *(WORD*)&pFormat[2]; + pFormat += 4; + + pFormat = ComputeConformance(pStubMsg, pMemory, pFormat, def); + size = pStubMsg->MaxCount; + TRACE("conformance=%ld\n", size); + + if (*(DWORD*)pFormat != 0xffffffff) + FIXME("compute variance\n"); + pFormat += 4; + + NDR_LOCAL_UINT32_WRITE(pStubMsg->Buffer, size); + pStubMsg->Buffer += 4; + + for (count=0; countMaxCount; + TRACE("conformance=%ld\n", size); + + pFormat += 4; + + esize = ComplexStructSize(pStubMsg, pFormat); + + if (fMustAlloc || !*ppMemory) + *ppMemory = NdrAllocate(pStubMsg, size*esize); + + pMemory = *ppMemory; + for (count=0; countMaxCount; + TRACE("conformance=%ld\n", size); + + if (*(DWORD*)pFormat != 0xffffffff) + FIXME("compute variance\n"); + pFormat += 4; + + for (count=0; countMaxCount; + TRACE("conformance=%ld\n", size); + + pFormat += 4; + + return 0; +} + +/*********************************************************************** + * NdrComplexArrayFree [RPCRT4.@] + */ +void WINAPI NdrComplexArrayFree(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *pMemory, + PFORMAT_STRING pFormat) +{ + DWORD size = 0, count, def; + TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat); + + def = *(WORD*)&pFormat[2]; + pFormat += 4; + + pFormat = ComputeConformance(pStubMsg, pMemory, pFormat, def); + size = pStubMsg->MaxCount; + TRACE("conformance=%ld\n", size); + + if (*(DWORD*)pFormat != 0xffffffff) + FIXME("compute variance\n"); + pFormat += 4; + + for (count=0; countdwDestContext, + pStubMsg->RpcMsg->DataRepresentation); +} + +/*********************************************************************** + * NdrUserMarshalMarshall [RPCRT4.@] + */ +unsigned char * WINAPI NdrUserMarshalMarshall(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *pMemory, + PFORMAT_STRING pFormat) +{ +/* unsigned flags = pFormat[1]; */ + unsigned index = *(WORD*)&pFormat[2]; + unsigned long uflag = UserMarshalFlags(pStubMsg); + TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat); + TRACE("index=%d\n", index); + + pStubMsg->Buffer = + pStubMsg->StubDesc->aUserMarshalQuadruple[index].pfnMarshall( + &uflag, pStubMsg->Buffer, pMemory); + + STD_OVERFLOW_CHECK(pStubMsg); + + return NULL; +} + +/*********************************************************************** + * NdrUserMarshalUnmarshall [RPCRT4.@] + */ +unsigned char * WINAPI NdrUserMarshalUnmarshall(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char **ppMemory, + PFORMAT_STRING pFormat, + unsigned char fMustAlloc) +{ +/* unsigned flags = pFormat[1];*/ + unsigned index = *(WORD*)&pFormat[2]; + DWORD memsize = *(WORD*)&pFormat[4]; + unsigned long uflag = UserMarshalFlags(pStubMsg); + TRACE("(%p,%p,%p,%d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc); + TRACE("index=%d\n", index); + + if (fMustAlloc || !*ppMemory) + *ppMemory = NdrAllocate(pStubMsg, memsize); + + pStubMsg->Buffer = + pStubMsg->StubDesc->aUserMarshalQuadruple[index].pfnUnmarshall( + &uflag, pStubMsg->Buffer, *ppMemory); + + return NULL; +} + +/*********************************************************************** + * NdrUserMarshalBufferSize [RPCRT4.@] + */ +void WINAPI NdrUserMarshalBufferSize(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *pMemory, + PFORMAT_STRING pFormat) +{ +/* unsigned flags = pFormat[1];*/ + unsigned index = *(WORD*)&pFormat[2]; + DWORD bufsize = *(WORD*)&pFormat[6]; + unsigned long uflag = UserMarshalFlags(pStubMsg); + TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat); + TRACE("index=%d\n", index); + + if (bufsize) { + TRACE("size=%ld\n", bufsize); + pStubMsg->BufferLength += bufsize; + return; + } + + pStubMsg->BufferLength = + pStubMsg->StubDesc->aUserMarshalQuadruple[index].pfnBufferSize( + &uflag, pStubMsg->BufferLength, pMemory); +} + +/*********************************************************************** + * NdrUserMarshalMemorySize [RPCRT4.@] + */ +unsigned long WINAPI NdrUserMarshalMemorySize(PMIDL_STUB_MESSAGE pStubMsg, + PFORMAT_STRING pFormat) +{ + unsigned index = *(WORD*)&pFormat[2]; +/* DWORD memsize = *(WORD*)&pFormat[4]; */ + FIXME("(%p,%p): stub\n", pStubMsg, pFormat); + TRACE("index=%d\n", index); + + return 0; +} + +/*********************************************************************** + * NdrUserMarshalFree [RPCRT4.@] + */ +void WINAPI NdrUserMarshalFree(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *pMemory, + PFORMAT_STRING pFormat) +{ +/* unsigned flags = pFormat[1]; */ + unsigned index = *(WORD*)&pFormat[2]; + unsigned long uflag = UserMarshalFlags(pStubMsg); + TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat); + TRACE("index=%d\n", index); + + pStubMsg->StubDesc->aUserMarshalQuadruple[index].pfnFree( + &uflag, pMemory); +} + +/*********************************************************************** + * NdrClearOutParameters [RPCRT4.@] + */ +void WINAPI NdrClearOutParameters(PMIDL_STUB_MESSAGE pStubMsg, + PFORMAT_STRING pFormat, + void *ArgAddr) +{ + FIXME("(%p,%p,%p): stub\n", pStubMsg, pFormat, ArgAddr); +} + +/*********************************************************************** + * NdrConvert [RPCRT4.@] + */ +void WINAPI NdrConvert( PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat ) +{ + FIXME("(pStubMsg == ^%p, pFormat == ^%p): stub.\n", pStubMsg, pFormat); + /* FIXME: since this stub doesn't do any converting, the proper behavior + is to raise an exception */ +} + +/*********************************************************************** + * NdrConvert2 [RPCRT4.@] + */ +void WINAPI NdrConvert2( PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat, long NumberParams ) +{ + FIXME("(pStubMsg == ^%p, pFormat == ^%p, NumberParams == %ld): stub.\n", + pStubMsg, pFormat, NumberParams); + /* FIXME: since this stub doesn't do any converting, the proper behavior + is to raise an exception */ +} diff --git a/reactos/lib/rpcrt4/ndr_midl.c b/reactos/lib/rpcrt4/ndr_midl.c new file mode 100644 index 00000000000..a22aa4829e4 --- /dev/null +++ b/reactos/lib/rpcrt4/ndr_midl.c @@ -0,0 +1,280 @@ +/* + * MIDL proxy/stub stuff + * + * Copyright 2002 Ove K鍁en, TransGaming Technologies + * + * 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: + * - figure out whether we *really* got this right + * - check for errors and throw exceptions + */ + +#include +#include +#include +#include + +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "winreg.h" + +#include "objbase.h" + +#include "rpcproxy.h" + +#include "wine/debug.h" + +#include "cpsf.h" +#include "ndr_misc.h" +#include "rpcndr.h" + +WINE_DEFAULT_DEBUG_CHANNEL(ole); + +/*********************************************************************** + * NdrProxyInitialize [RPCRT4.@] + */ +void WINAPI NdrProxyInitialize(void *This, + PRPC_MESSAGE pRpcMsg, + PMIDL_STUB_MESSAGE pStubMsg, + PMIDL_STUB_DESC pStubDescriptor, + unsigned int ProcNum) +{ + HRESULT hr; + + TRACE("(%p,%p,%p,%p,%d)\n", This, pRpcMsg, pStubMsg, pStubDescriptor, ProcNum); + NdrClientInitializeNew(pRpcMsg, pStubMsg, pStubDescriptor, ProcNum); + if (This) StdProxy_GetChannel(This, &pStubMsg->pRpcChannelBuffer); + if (pStubMsg->pRpcChannelBuffer) { + hr = IRpcChannelBuffer_GetDestCtx(pStubMsg->pRpcChannelBuffer, + &pStubMsg->dwDestContext, + &pStubMsg->pvDestContext); + } + TRACE("channel=%p\n", pStubMsg->pRpcChannelBuffer); +} + +/*********************************************************************** + * NdrProxyGetBuffer [RPCRT4.@] + */ +void WINAPI NdrProxyGetBuffer(void *This, + PMIDL_STUB_MESSAGE pStubMsg) +{ + HRESULT hr; + const IID *riid = NULL; + + TRACE("(%p,%p)\n", This, pStubMsg); + pStubMsg->RpcMsg->BufferLength = pStubMsg->BufferLength; + pStubMsg->dwStubPhase = PROXY_GETBUFFER; + hr = StdProxy_GetIID(This, &riid); + hr = IRpcChannelBuffer_GetBuffer(pStubMsg->pRpcChannelBuffer, + (RPCOLEMESSAGE*)pStubMsg->RpcMsg, + riid); + pStubMsg->BufferStart = pStubMsg->RpcMsg->Buffer; + pStubMsg->BufferEnd = pStubMsg->BufferStart + pStubMsg->BufferLength; + pStubMsg->Buffer = pStubMsg->BufferStart; + pStubMsg->dwStubPhase = PROXY_MARSHAL; +} + +/*********************************************************************** + * NdrProxySendReceive [RPCRT4.@] + */ +void WINAPI NdrProxySendReceive(void *This, + PMIDL_STUB_MESSAGE pStubMsg) +{ + ULONG Status = 0; + HRESULT hr; + + TRACE("(%p,%p)\n", This, pStubMsg); + pStubMsg->dwStubPhase = PROXY_SENDRECEIVE; + hr = IRpcChannelBuffer_SendReceive(pStubMsg->pRpcChannelBuffer, + (RPCOLEMESSAGE*)pStubMsg->RpcMsg, + &Status); + pStubMsg->dwStubPhase = PROXY_UNMARSHAL; + pStubMsg->BufferLength = pStubMsg->RpcMsg->BufferLength; + pStubMsg->BufferStart = pStubMsg->RpcMsg->Buffer; + pStubMsg->BufferEnd = pStubMsg->BufferStart + pStubMsg->BufferLength; + pStubMsg->Buffer = pStubMsg->BufferStart; + + /* raise exception if call failed */ + if (hr == RPC_S_CALL_FAILED) RpcRaiseException(*(DWORD*)pStubMsg->Buffer); + else if (FAILED(hr)) RpcRaiseException(hr); +} + +/*********************************************************************** + * NdrProxyFreeBuffer [RPCRT4.@] + */ +void WINAPI NdrProxyFreeBuffer(void *This, + PMIDL_STUB_MESSAGE pStubMsg) +{ + HRESULT hr; + + TRACE("(%p,%p)\n", This, pStubMsg); + hr = IRpcChannelBuffer_FreeBuffer(pStubMsg->pRpcChannelBuffer, + (RPCOLEMESSAGE*)pStubMsg->RpcMsg); +} + +/*********************************************************************** + * NdrProxyErrorHandler [RPCRT4.@] + */ +HRESULT WINAPI NdrProxyErrorHandler(DWORD dwExceptionCode) +{ + FIXME("(0x%08lx): semi-stub\n", dwExceptionCode); + return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_RPC, RPC_S_CALL_FAILED); +} + +/*********************************************************************** + * NdrStubInitialize [RPCRT4.@] + */ +void WINAPI NdrStubInitialize(PRPC_MESSAGE pRpcMsg, + PMIDL_STUB_MESSAGE pStubMsg, + PMIDL_STUB_DESC pStubDescriptor, + LPRPCCHANNELBUFFER pRpcChannelBuffer) +{ + TRACE("(%p,%p,%p,%p)\n", pRpcMsg, pStubMsg, pStubDescriptor, pRpcChannelBuffer); + NdrServerInitializeNew(pRpcMsg, pStubMsg, pStubDescriptor); + pStubMsg->pRpcChannelBuffer = pRpcChannelBuffer; +} + +/*********************************************************************** + * NdrStubGetBuffer [RPCRT4.@] + */ +void WINAPI NdrStubGetBuffer(LPRPCSTUBBUFFER This, + LPRPCCHANNELBUFFER pRpcChannelBuffer, + PMIDL_STUB_MESSAGE pStubMsg) +{ + TRACE("(%p,%p)\n", This, pStubMsg); + pStubMsg->pRpcChannelBuffer = pRpcChannelBuffer; + pStubMsg->RpcMsg->BufferLength = pStubMsg->BufferLength; + I_RpcGetBuffer(pStubMsg->RpcMsg); /* ? */ + pStubMsg->BufferStart = pStubMsg->RpcMsg->Buffer; + pStubMsg->BufferEnd = pStubMsg->BufferStart + pStubMsg->BufferLength; + pStubMsg->Buffer = pStubMsg->BufferStart; +} + +/************************************************************************ + * NdrClientInitializeNew [RPCRT4.@] + */ +void WINAPI NdrClientInitializeNew( PRPC_MESSAGE pRpcMessage, PMIDL_STUB_MESSAGE pStubMsg, + PMIDL_STUB_DESC pStubDesc, unsigned int ProcNum ) +{ + TRACE("(pRpcMessage == ^%p, pStubMsg == ^%p, pStubDesc == ^%p, ProcNum == %d)\n", + pRpcMessage, pStubMsg, pStubDesc, ProcNum); + + assert( pRpcMessage && pStubMsg && pStubDesc ); + + memset(pRpcMessage, 0, sizeof(RPC_MESSAGE)); + + /* not everyone allocates stack space for w2kReserved */ + memset(pStubMsg, 0, sizeof(*pStubMsg) - sizeof(pStubMsg->w2kReserved)); + + pStubMsg->ReuseBuffer = FALSE; + pStubMsg->IsClient = TRUE; + pStubMsg->StubDesc = pStubDesc; + pStubMsg->pfnAllocate = pStubDesc->pfnAllocate; + pStubMsg->pfnFree = pStubDesc->pfnFree; + pStubMsg->RpcMsg = pRpcMessage; + + pRpcMessage->ProcNum = ProcNum; + pRpcMessage->RpcInterfaceInformation = pStubDesc->RpcInterfaceInformation; +} + +/*********************************************************************** + * NdrServerInitializeNew [RPCRT4.@] + */ +unsigned char* WINAPI NdrServerInitializeNew( PRPC_MESSAGE pRpcMsg, PMIDL_STUB_MESSAGE pStubMsg, + PMIDL_STUB_DESC pStubDesc ) +{ + TRACE("(pRpcMsg == ^%p, pStubMsg == ^%p, pStubDesc == ^%p)\n", pRpcMsg, pStubMsg, pStubDesc); + + assert( pRpcMsg && pStubMsg && pStubDesc ); + + /* not everyone allocates stack space for w2kReserved */ + memset(pStubMsg, 0, sizeof(*pStubMsg) - sizeof(pStubMsg->w2kReserved)); + + pStubMsg->ReuseBuffer = TRUE; + pStubMsg->IsClient = FALSE; + pStubMsg->StubDesc = pStubDesc; + pStubMsg->pfnAllocate = pStubDesc->pfnAllocate; + pStubMsg->pfnFree = pStubDesc->pfnFree; + pStubMsg->RpcMsg = pRpcMsg; + pStubMsg->Buffer = pStubMsg->BufferStart = pRpcMsg->Buffer; + pStubMsg->BufferLength = pRpcMsg->BufferLength; + pStubMsg->BufferEnd = pStubMsg->Buffer + pStubMsg->BufferLength; + + /* FIXME: determine the proper return value */ + return NULL; +} + +/*********************************************************************** + * NdrGetBuffer [RPCRT4.@] + */ +unsigned char *WINAPI NdrGetBuffer(MIDL_STUB_MESSAGE *stubmsg, unsigned long buflen, RPC_BINDING_HANDLE handle) +{ + TRACE("(stubmsg == ^%p, buflen == %lu, handle == %p): wild guess.\n", stubmsg, buflen, handle); + + assert( stubmsg && stubmsg->RpcMsg ); + + /* I guess this is our chance to put the binding handle into the RPC_MESSAGE */ + stubmsg->RpcMsg->Handle = handle; + + stubmsg->RpcMsg->BufferLength = buflen; + if (I_RpcGetBuffer(stubmsg->RpcMsg) != S_OK) + return NULL; + + stubmsg->Buffer = stubmsg->BufferStart = stubmsg->RpcMsg->Buffer; + stubmsg->BufferLength = stubmsg->RpcMsg->BufferLength; + stubmsg->BufferEnd = stubmsg->Buffer + stubmsg->BufferLength; + return (stubmsg->Buffer = (unsigned char *)stubmsg->RpcMsg->Buffer); +} +/*********************************************************************** + * NdrFreeBuffer [RPCRT4.@] + */ +void WINAPI NdrFreeBuffer(MIDL_STUB_MESSAGE *pStubMsg) +{ + TRACE("(pStubMsg == ^%p): wild guess.\n", pStubMsg); + I_RpcFreeBuffer(pStubMsg->RpcMsg); + pStubMsg->BufferLength = 0; + pStubMsg->Buffer = pStubMsg->BufferEnd = (unsigned char *)(pStubMsg->RpcMsg->Buffer = NULL); +} + +/************************************************************************ + * NdrSendReceive [RPCRT4.@] + */ +unsigned char *WINAPI NdrSendReceive( MIDL_STUB_MESSAGE *stubmsg, unsigned char *buffer ) +{ + TRACE("(stubmsg == ^%p, buffer == ^%p)\n", stubmsg, buffer); + + /* FIXME: how to handle errors? (raise exception?) */ + if (!stubmsg) { + ERR("NULL stub message. No action taken.\n"); + return NULL; + } + if (!stubmsg->RpcMsg) { + ERR("RPC Message not present in stub message. No action taken.\n"); + return NULL; + } + + /* FIXME: Seems wrong. Where should this really come from, and when? */ + stubmsg->RpcMsg->DataRepresentation = NDR_LOCAL_DATA_REPRESENTATION; + + if (I_RpcSendReceive(stubmsg->RpcMsg) != RPC_S_OK) { + WARN("I_RpcSendReceive did not return success.\n"); + /* FIXME: raise exception? */ + } + + /* FIXME: is this the right return value? */ + return NULL; +} diff --git a/reactos/lib/rpcrt4/ndr_misc.h b/reactos/lib/rpcrt4/ndr_misc.h new file mode 100644 index 00000000000..b246b44d991 --- /dev/null +++ b/reactos/lib/rpcrt4/ndr_misc.h @@ -0,0 +1,53 @@ +/* + * NDR definitions + * + * Copyright 2001 Ove K鍁en, TransGaming Technologies + * + * 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_NDR_MISC_H +#define __WINE_NDR_MISC_H + +#include + +#include "windef.h" +#include "winbase.h" +#include "rpc.h" +#include "rpcndr.h" + +struct IPSFactoryBuffer; + +LONG_PTR RPCRT4_NdrClientCall2(PMIDL_STUB_DESC pStubDesc, + PFORMAT_STRING pFormat, va_list args ); + +HRESULT RPCRT4_GetPSFactory(REFIID riid, struct IPSFactoryBuffer **ppPS); + +PFORMAT_STRING ComputeConformance(MIDL_STUB_MESSAGE *pStubMsg, unsigned char *pMemory, + PFORMAT_STRING pFormat, ULONG_PTR def); + +typedef unsigned char* (WINAPI *NDR_MARSHALL) (PMIDL_STUB_MESSAGE, unsigned char*, PFORMAT_STRING); +typedef unsigned char* (WINAPI *NDR_UNMARSHALL)(PMIDL_STUB_MESSAGE, unsigned char**,PFORMAT_STRING, unsigned char); +typedef void (WINAPI *NDR_BUFFERSIZE)(PMIDL_STUB_MESSAGE, unsigned char*, PFORMAT_STRING); +typedef unsigned long (WINAPI *NDR_MEMORYSIZE)(PMIDL_STUB_MESSAGE, PFORMAT_STRING); +typedef void (WINAPI *NDR_FREE) (PMIDL_STUB_MESSAGE, unsigned char*, PFORMAT_STRING); + +extern NDR_MARSHALL NdrMarshaller[]; +extern NDR_UNMARSHALL NdrUnmarshaller[]; +extern NDR_BUFFERSIZE NdrBufferSizer[]; +extern NDR_MEMORYSIZE NdrMemorySizer[]; +extern NDR_FREE NdrFreer[]; + +#endif /* __WINE_NDR_MISC_H */ diff --git a/reactos/lib/rpcrt4/ndr_ole.c b/reactos/lib/rpcrt4/ndr_ole.c new file mode 100644 index 00000000000..26ddb25c56e --- /dev/null +++ b/reactos/lib/rpcrt4/ndr_ole.c @@ -0,0 +1,349 @@ +/* + * OLE32 callouts, COM interface marshalling + * + * Copyright 2001 Ove K鍁en, TransGaming Technologies + * + * 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: + * - figure out whether we *really* got this right + * - check for errors and throw exceptions + * - what are the marshalling functions supposed to return? + * - finish RpcStream_Vtbl + */ + +#include +#include +#include + +#define NONAMELESSUNION +#define NONAMELESSSTRUCT +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "winreg.h" + +#include "objbase.h" + +#include "ndr_misc.h" +#include "rpcndr.h" +#include "wine/rpcfc.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(ole); + +static HMODULE hOLE; + +static HRESULT (WINAPI *COM_GetMarshalSizeMax)(ULONG *,REFIID,LPUNKNOWN,DWORD,LPVOID,DWORD); +static HRESULT (WINAPI *COM_MarshalInterface)(LPSTREAM,REFIID,LPUNKNOWN,DWORD,LPVOID,DWORD); +static HRESULT (WINAPI *COM_UnmarshalInterface)(LPSTREAM,REFIID,LPVOID*); +static HRESULT (WINAPI *COM_ReleaseMarshalData)(LPSTREAM); +static HRESULT (WINAPI *COM_GetClassObject)(REFCLSID,DWORD,COSERVERINFO *,REFIID,LPVOID *); +static HRESULT (WINAPI *COM_GetPSClsid)(REFIID,CLSID *); +static LPVOID (WINAPI *COM_MemAlloc)(ULONG); +static void (WINAPI *COM_MemFree)(LPVOID); + +static HMODULE LoadCOM(void) +{ + if (hOLE) return hOLE; + hOLE = LoadLibraryA("OLE32.DLL"); + if (!hOLE) return 0; + COM_GetMarshalSizeMax = (LPVOID)GetProcAddress(hOLE, "CoGetMarshalSizeMax"); + COM_MarshalInterface = (LPVOID)GetProcAddress(hOLE, "CoMarshalInterface"); + COM_UnmarshalInterface = (LPVOID)GetProcAddress(hOLE, "CoUnmarshalInterface"); + COM_ReleaseMarshalData = (LPVOID)GetProcAddress(hOLE, "CoReleaseMarshalData"); + COM_GetClassObject = (LPVOID)GetProcAddress(hOLE, "CoGetClassObject"); + COM_GetPSClsid = (LPVOID)GetProcAddress(hOLE, "CoGetPSClsid"); + COM_MemAlloc = (LPVOID)GetProcAddress(hOLE, "CoTaskMemAlloc"); + COM_MemFree = (LPVOID)GetProcAddress(hOLE, "CoTaskMemFree"); + return hOLE; +} + +/* CoMarshalInterface/CoUnmarshalInterface works on streams, + * so implement a simple stream on top of the RPC buffer + * (which also implements the MInterfacePointer structure) */ +typedef struct RpcStreamImpl +{ + ICOM_VFIELD(IStream); + DWORD RefCount; + PMIDL_STUB_MESSAGE pMsg; + LPDWORD size; + char *data; + DWORD pos; +} RpcStreamImpl; + +static HRESULT WINAPI RpcStream_QueryInterface(LPSTREAM iface, + REFIID riid, + LPVOID *obj) +{ + ICOM_THIS(RpcStreamImpl, iface); + if (IsEqualGUID(&IID_IUnknown, riid) || + IsEqualGUID(&IID_ISequentialStream, riid) || + IsEqualGUID(&IID_IStream, riid)) { + *obj = This; + This->RefCount++; + return S_OK; + } + return E_NOINTERFACE; +} + +static ULONG WINAPI RpcStream_AddRef(LPSTREAM iface) +{ + ICOM_THIS(RpcStreamImpl, iface); + return ++(This->RefCount); +} + +static ULONG WINAPI RpcStream_Release(LPSTREAM iface) +{ + ICOM_THIS(RpcStreamImpl, iface); + if (!--(This->RefCount)) { + TRACE("size=%ld\n", *This->size); + This->pMsg->Buffer = This->data + *This->size; + HeapFree(GetProcessHeap(),0,This); + return 0; + } + return This->RefCount; +} + +static HRESULT WINAPI RpcStream_Read(LPSTREAM iface, + void *pv, + ULONG cb, + ULONG *pcbRead) +{ + ICOM_THIS(RpcStreamImpl, iface); + if (This->pos + cb > *This->size) cb = *This->size - This->pos; + if (cb) { + memcpy(pv, This->data + This->pos, cb); + This->pos += cb; + } + if (pcbRead) *pcbRead = cb; + return S_OK; +} + +static HRESULT WINAPI RpcStream_Write(LPSTREAM iface, + const void *pv, + ULONG cb, + ULONG *pcbWritten) +{ + ICOM_THIS(RpcStreamImpl, iface); + memcpy(This->data + This->pos, pv, cb); + This->pos += cb; + if (This->pos > *This->size) *This->size = This->pos; + if (pcbWritten) *pcbWritten = cb; + return S_OK; +} + +static HRESULT WINAPI RpcStream_Seek(LPSTREAM iface, + LARGE_INTEGER move, + DWORD origin, + ULARGE_INTEGER *newPos) +{ + ICOM_THIS(RpcStreamImpl, iface); + switch (origin) { + case STREAM_SEEK_SET: + This->pos = move.u.LowPart; + break; + case STREAM_SEEK_CUR: + This->pos = This->pos + move.u.LowPart; + break; + case STREAM_SEEK_END: + This->pos = *This->size + move.u.LowPart; + break; + default: + return STG_E_INVALIDFUNCTION; + } + if (newPos) { + newPos->u.LowPart = This->pos; + newPos->u.HighPart = 0; + } + return S_OK; +} + +static HRESULT WINAPI RpcStream_SetSize(LPSTREAM iface, + ULARGE_INTEGER newSize) +{ + ICOM_THIS(RpcStreamImpl, iface); + *This->size = newSize.u.LowPart; + return S_OK; +} + +static ICOM_VTABLE(IStream) RpcStream_Vtbl = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + RpcStream_QueryInterface, + RpcStream_AddRef, + RpcStream_Release, + RpcStream_Read, + RpcStream_Write, + RpcStream_Seek, + RpcStream_SetSize, + NULL, /* CopyTo */ + NULL, /* Commit */ + NULL, /* Revert */ + NULL, /* LockRegion */ + NULL, /* UnlockRegion */ + NULL, /* Stat */ + NULL /* Clone */ +}; + +static LPSTREAM RpcStream_Create(PMIDL_STUB_MESSAGE pStubMsg, BOOL init) +{ + RpcStreamImpl *This; + This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(RpcStreamImpl)); + if (!This) return NULL; + This->lpVtbl = &RpcStream_Vtbl; + This->RefCount = 1; + This->pMsg = pStubMsg; + This->size = (LPDWORD)pStubMsg->Buffer; + This->data = (char*)(This->size + 1); + This->pos = 0; + if (init) *This->size = 0; + TRACE("init size=%ld\n", *This->size); + return (LPSTREAM)This; +} + +const IID* get_ip_iid(PMIDL_STUB_MESSAGE pStubMsg, unsigned char *pMemory, PFORMAT_STRING pFormat) +{ + const IID *riid; + if (!pFormat) return &IID_IUnknown; + TRACE("format=%02x %02x\n", pFormat[0], pFormat[1]); + if (pFormat[0] != RPC_FC_IP) FIXME("format=%d\n", pFormat[0]); + if (pFormat[1] == RPC_FC_CONSTANT_IID) { + riid = (const IID *)&pFormat[2]; + } else { + ComputeConformance(pStubMsg, pMemory, pFormat+2, 0); + riid = (const IID *)pStubMsg->MaxCount; + } + if (!riid) riid = &IID_IUnknown; + TRACE("got %s\n", debugstr_guid(riid)); + return riid; +} + +/*********************************************************************** + * NdrInterfacePointerMarshall [RPCRT4.@] + */ +unsigned char * WINAPI NdrInterfacePointerMarshall(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *pMemory, + PFORMAT_STRING pFormat) +{ + const IID *riid = get_ip_iid(pStubMsg, pMemory, pFormat); + LPSTREAM stream; + HRESULT hr; + + TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat); + pStubMsg->MaxCount = 0; + if (!LoadCOM()) return NULL; + stream = RpcStream_Create(pStubMsg, TRUE); + hr = COM_MarshalInterface(stream, riid, (LPUNKNOWN)pMemory, + pStubMsg->dwDestContext, pStubMsg->pvDestContext, + MSHLFLAGS_NORMAL); + IStream_Release(stream); + return NULL; +} + +/*********************************************************************** + * NdrInterfacePointerUnmarshall [RPCRT4.@] + */ +unsigned char * WINAPI NdrInterfacePointerUnmarshall(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char **ppMemory, + PFORMAT_STRING pFormat, + unsigned char fMustAlloc) +{ + LPSTREAM stream; + HRESULT hr; + + TRACE("(%p,%p,%p,%d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc); + if (!LoadCOM()) return NULL; + *(LPVOID*)ppMemory = NULL; + stream = RpcStream_Create(pStubMsg, FALSE); + hr = COM_UnmarshalInterface(stream, &IID_NULL, (LPVOID*)ppMemory); + IStream_Release(stream); + return NULL; +} + +/*********************************************************************** + * NdrInterfacePointerBufferSize [RPCRT4.@] + */ +void WINAPI NdrInterfacePointerBufferSize(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *pMemory, + PFORMAT_STRING pFormat) +{ + const IID *riid = get_ip_iid(pStubMsg, pMemory, pFormat); + ULONG size = 0; + HRESULT hr; + + TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat); + if (!LoadCOM()) return; + hr = COM_GetMarshalSizeMax(&size, riid, (LPUNKNOWN)pMemory, + pStubMsg->dwDestContext, pStubMsg->pvDestContext, + MSHLFLAGS_NORMAL); + TRACE("size=%ld\n", size); + pStubMsg->BufferLength += sizeof(DWORD) + size; +} + +/*********************************************************************** + * NdrInterfacePointerMemorySize [RPCRT4.@] + */ +unsigned long WINAPI NdrInterfacePointerMemorySize(PMIDL_STUB_MESSAGE pStubMsg, + PFORMAT_STRING pFormat) +{ + FIXME("(%p,%p): stub\n", pStubMsg, pFormat); + return 0; +} + +/*********************************************************************** + * NdrInterfacePointerFree [RPCRT4.@] + */ +void WINAPI NdrInterfacePointerFree(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *pMemory, + PFORMAT_STRING pFormat) +{ + LPUNKNOWN pUnk = (LPUNKNOWN)pMemory; + TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat); + if (pUnk) IUnknown_Release(pUnk); +} + +/*********************************************************************** + * NdrOleAllocate [RPCRT4.@] + */ +void * WINAPI NdrOleAllocate(size_t Size) +{ + if (!LoadCOM()) return NULL; + return COM_MemAlloc(Size); +} + +/*********************************************************************** + * NdrOleFree [RPCRT4.@] + */ +void WINAPI NdrOleFree(void *NodeToFree) +{ + if (!LoadCOM()) return; + COM_MemFree(NodeToFree); +} + +/* internal */ +HRESULT RPCRT4_GetPSFactory(REFIID riid, LPPSFACTORYBUFFER *pPS) +{ + HRESULT hr; + CLSID clsid; + + if (!LoadCOM()) return RPC_E_UNEXPECTED; + hr = COM_GetPSClsid(riid, &clsid); + if (FAILED(hr)) return hr; + hr = COM_GetClassObject(&clsid, CLSCTX_INPROC_SERVER, NULL, + &IID_IPSFactoryBuffer, (LPVOID *)pPS); + return hr; +} diff --git a/reactos/lib/rpcrt4/ndr_stubless.c b/reactos/lib/rpcrt4/ndr_stubless.c new file mode 100644 index 00000000000..a2d4a518b45 --- /dev/null +++ b/reactos/lib/rpcrt4/ndr_stubless.c @@ -0,0 +1,99 @@ +/* + * NDR client stuff + * + * Copyright 2001 Ove K鍁en, TransGaming Technologies + * + * 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: + * - Exception handling + * - Context stuff + * - Who knows + */ + +#include +#include +#include + +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "winreg.h" + +#include "rpc.h" +#include "rpcndr.h" + +#include "wine/debug.h" + +#include "ndr_misc.h" + +WINE_DEFAULT_DEBUG_CHANNEL(ole); + +LONG_PTR /* CLIENT_CALL_RETURN */ RPCRT4_NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pFormat, va_list args) +{ + + RPC_CLIENT_INTERFACE *rpc_cli_if = (RPC_CLIENT_INTERFACE *)(pStubDesc->RpcInterfaceInformation); + LONG_PTR ret = 0; +/* + RPC_BINDING_HANDLE handle = 0; + RPC_MESSAGE rpcmsg; + MIDL_STUB_MESSAGE stubmsg; +*/ + + FIXME("(pStubDec == ^%p,pFormat = ^%p,...): stub\n", pStubDesc, pFormat); + if (rpc_cli_if) /* NULL for objects */ { + TRACE(" *rpc_cli_if (== ^%p) == (RPC_CLIENT_INTERFACE):\n", pStubDesc); + TRACE(" Length == %d\n", rpc_cli_if->Length); + TRACE(" InterfaceID == %s (%d.%d)\n", debugstr_guid(&rpc_cli_if->InterfaceId.SyntaxGUID), + rpc_cli_if->InterfaceId.SyntaxVersion.MajorVersion, rpc_cli_if->InterfaceId.SyntaxVersion.MinorVersion); + TRACE(" TransferSyntax == %s (%d.%d)\n", debugstr_guid(&rpc_cli_if->TransferSyntax.SyntaxGUID), + rpc_cli_if->TransferSyntax.SyntaxVersion.MajorVersion, rpc_cli_if->TransferSyntax.SyntaxVersion.MinorVersion); + TRACE(" DispatchTable == ^%p\n", rpc_cli_if->DispatchTable); + TRACE(" RpcProtseqEndpointCount == ^%d\n", rpc_cli_if->RpcProtseqEndpointCount); + TRACE(" RpcProtseqEndpoint == ^%p\n", rpc_cli_if->RpcProtseqEndpoint); + TRACE(" Flags == ^%d\n", rpc_cli_if->Flags); + } + + /* for now, while these functons are under development, this is too sketchy. commented out. */ + /* + NdrClientInitializeNew( &rpcmsg, &stubmsg, pStubDesc, 0 ); + + handle = (RPC_BINDING_HANDLE)0xdeadbeef; */ /* FIXME */ + + /* stubmsg.BufferLength = 0;*/ /* FIXME */ + /* + NdrGetBuffer( &stubmsg, stubmsg.BufferLength, handle ); + NdrSendReceive( &stubmsg, stubmsg.Buffer ); + NdrFreeBuffer( &stubmsg ); + */ + return ret; +} + +/*********************************************************************** + * NdrClientCall2 [RPCRT4.@] + */ +LONG_PTR /* CLIENT_CALL_RETURN */ WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc, + PFORMAT_STRING pFormat, ...) +{ + LONG_PTR ret; + va_list args; + + TRACE("(%p,%p,...)\n", pStubDesc, pFormat); + + va_start(args, pFormat); + ret = RPCRT4_NdrClientCall2(pStubDesc, pFormat, args); + va_end(args); + return ret; +} diff --git a/reactos/lib/rpcrt4/rpc_binding.c b/reactos/lib/rpcrt4/rpc_binding.c new file mode 100644 index 00000000000..9764f204c4c --- /dev/null +++ b/reactos/lib/rpcrt4/rpc_binding.c @@ -0,0 +1,1162 @@ +/* + * RPC binding API + * + * Copyright 2001 Ove K鍁en, TransGaming Technologies + * Copyright 2003 Mike Hearn + * Copyright 2004 Filip Navara + * + * 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: + * - a whole lot + */ + +#include +#include +#include +#include + +#include "windef.h" +#include "winbase.h" +#include "winnls.h" +#include "winerror.h" +#include "winreg.h" +#include "winternl.h" +#include "wine/unicode.h" + +#include "rpc.h" +#include "rpcndr.h" + +#include "wine/debug.h" + +#include "rpc_binding.h" +#include "rpc_message.h" + +WINE_DEFAULT_DEBUG_CHANNEL(ole); + +static RpcConnection* conn_cache; + +static CRITICAL_SECTION conn_cache_cs; +static CRITICAL_SECTION_DEBUG critsect_debug = +{ + 0, 0, &conn_cache_cs, + { &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList }, + 0, 0, { 0, (DWORD)(__FILE__ ": conn_cache_cs") } +}; +static CRITICAL_SECTION conn_cache_cs = { &critsect_debug, -1, 0, 0, 0, 0 }; + +LPSTR RPCRT4_strndupA(LPCSTR src, INT slen) +{ + DWORD len; + LPSTR s; + if (!src) return NULL; + if (slen == -1) slen = strlen(src); + len = slen; + s = HeapAlloc(GetProcessHeap(), 0, len+1); + memcpy(s, src, len); + s[len] = 0; + return s; +} + +LPSTR RPCRT4_strdupWtoA(LPWSTR src) +{ + DWORD len; + LPSTR s; + if (!src) return NULL; + len = WideCharToMultiByte(CP_ACP, 0, src, -1, NULL, 0, NULL, NULL); + s = HeapAlloc(GetProcessHeap(), 0, len); + WideCharToMultiByte(CP_ACP, 0, src, -1, s, len, NULL, NULL); + return s; +} + +LPWSTR RPCRT4_strdupAtoW(LPSTR src) +{ + DWORD len; + LPWSTR s; + if (!src) return NULL; + len = MultiByteToWideChar(CP_ACP, 0, src, -1, NULL, 0); + s = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, src, -1, s, len); + return s; +} + +LPWSTR RPCRT4_strndupW(LPWSTR src, INT slen) +{ + DWORD len; + LPWSTR s; + if (!src) return NULL; + if (slen == -1) slen = strlenW(src); + len = slen; + s = HeapAlloc(GetProcessHeap(), 0, (len+1)*sizeof(WCHAR)); + memcpy(s, src, len*sizeof(WCHAR)); + s[len] = 0; + return s; +} + +void RPCRT4_strfree(LPSTR src) +{ + if (src) HeapFree(GetProcessHeap(), 0, src); +} + +RPC_STATUS RPCRT4_CreateConnection(RpcConnection** Connection, BOOL server, LPSTR Protseq, LPSTR NetworkAddr, LPSTR Endpoint, LPSTR NetworkOptions, RpcBinding* Binding) +{ + RpcConnection* NewConnection; + + NewConnection = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(RpcConnection)); + NewConnection->server = server; + NewConnection->Protseq = RPCRT4_strdupA(Protseq); + NewConnection->NetworkAddr = RPCRT4_strdupA(NetworkAddr); + NewConnection->Endpoint = RPCRT4_strdupA(Endpoint); + NewConnection->Used = Binding; + NewConnection->MaxTransmissionSize = RPC_MAX_PACKET_SIZE; + + EnterCriticalSection(&conn_cache_cs); + NewConnection->Next = conn_cache; + conn_cache = NewConnection; + LeaveCriticalSection(&conn_cache_cs); + + TRACE("connection: %p\n", NewConnection); + *Connection = NewConnection; + + return RPC_S_OK; +} + +RPC_STATUS RPCRT4_DestroyConnection(RpcConnection* Connection) +{ + RpcConnection* PrevConnection; + + TRACE("connection: %p\n", Connection); + if (Connection->Used) ERR("connection is still in use\n"); + + EnterCriticalSection(&conn_cache_cs); + PrevConnection = conn_cache; + if (PrevConnection == Connection) { + conn_cache = Connection->Next; + } else { + while (PrevConnection && PrevConnection->Next != Connection) + PrevConnection = PrevConnection->Next; + if (PrevConnection) PrevConnection->Next = Connection->Next; + } + LeaveCriticalSection(&conn_cache_cs); + + RPCRT4_CloseConnection(Connection); + RPCRT4_strfree(Connection->Endpoint); + RPCRT4_strfree(Connection->NetworkAddr); + RPCRT4_strfree(Connection->Protseq); + HeapFree(GetProcessHeap(), 0, Connection); + return RPC_S_OK; +} + +RPC_STATUS RPCRT4_GetConnection(RpcConnection** Connection, BOOL server, LPSTR Protseq, LPSTR NetworkAddr, LPSTR Endpoint, LPSTR NetworkOptions, RpcBinding* Binding) +{ + RpcConnection* NewConnection; + + if (!server) { + EnterCriticalSection(&conn_cache_cs); + for (NewConnection = conn_cache; NewConnection; NewConnection = NewConnection->Next) { + if (NewConnection->Used) continue; + if (NewConnection->server != server) continue; + if (Protseq && strcmp(NewConnection->Protseq, Protseq)) continue; + if (NetworkAddr && strcmp(NewConnection->NetworkAddr, NetworkAddr)) continue; + if (Endpoint && strcmp(NewConnection->Endpoint, Endpoint)) continue; + /* this connection fits the bill */ + NewConnection->Used = Binding; + break; + } + LeaveCriticalSection(&conn_cache_cs); + if (NewConnection) { + TRACE("cached connection: %p\n", NewConnection); + *Connection = NewConnection; + return RPC_S_OK; + } + } + return RPCRT4_CreateConnection(Connection, server, Protseq, NetworkAddr, Endpoint, NetworkOptions, Binding); +} + +RPC_STATUS RPCRT4_ReleaseConnection(RpcConnection* Connection) +{ + TRACE("connection: %p\n", Connection); + Connection->Used = NULL; + if (!Connection->server) { + /* cache the open connection for reuse later */ + /* FIXME: we should probably clean the cache someday */ + return RPC_S_OK; + } + return RPCRT4_DestroyConnection(Connection); +} + +RPC_STATUS RPCRT4_OpenConnection(RpcConnection* Connection) +{ + TRACE("(Connection == ^%p)\n", Connection); + if (!Connection->conn) { + if (Connection->server) { /* server */ + /* protseq=ncalrpc: supposed to use NT LPC ports, + * but we'll implement it with named pipes for now */ + if (strcmp(Connection->Protseq, "ncalrpc") == 0) { + static LPCSTR prefix = "\\\\.\\pipe\\lrpc\\"; + LPSTR pname; + pname = HeapAlloc(GetProcessHeap(), 0, strlen(prefix) + strlen(Connection->Endpoint) + 1); + strcat(strcpy(pname, prefix), Connection->Endpoint); + TRACE("listening on %s\n", pname); + Connection->conn = CreateNamedPipeA(pname, PROFILE_SERVER | PIPE_ACCESS_DUPLEX, + PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE, PIPE_UNLIMITED_INSTANCES, + RPC_MAX_PACKET_SIZE, RPC_MAX_PACKET_SIZE, 5000, NULL); + HeapFree(GetProcessHeap(), 0, pname); + memset(&Connection->ovl, 0, sizeof(Connection->ovl)); + Connection->ovl.hEvent = CreateEventA(NULL, TRUE, FALSE, NULL); + if (!ConnectNamedPipe(Connection->conn, &Connection->ovl)) { + WARN("Couldn't ConnectNamedPipe (error was %ld)\n", GetLastError()); + if (GetLastError() == ERROR_PIPE_CONNECTED) { + SetEvent(Connection->ovl.hEvent); + return RPC_S_OK; + } else if (GetLastError() == ERROR_IO_PENDING) { + return RPC_S_OK; + } + return RPC_S_SERVER_UNAVAILABLE; + } + } + /* protseq=ncacn_np: named pipes */ + else if (strcmp(Connection->Protseq, "ncacn_np") == 0) { + static LPCSTR prefix = "\\\\."; + LPSTR pname; + pname = HeapAlloc(GetProcessHeap(), 0, strlen(prefix) + strlen(Connection->Endpoint) + 1); + strcat(strcpy(pname, prefix), Connection->Endpoint); + TRACE("listening on %s\n", pname); + Connection->conn = CreateNamedPipeA(pname, PROFILE_SERVER | PIPE_ACCESS_DUPLEX, + PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, + RPC_MAX_PACKET_SIZE, RPC_MAX_PACKET_SIZE, 5000, NULL); + HeapFree(GetProcessHeap(), 0, pname); + memset(&Connection->ovl, 0, sizeof(Connection->ovl)); + Connection->ovl.hEvent = CreateEventA(NULL, TRUE, FALSE, NULL); + if (!ConnectNamedPipe(Connection->conn, &Connection->ovl)) { + WARN("Couldn't ConnectNamedPipe (error was %ld)\n", GetLastError()); + if (GetLastError() == ERROR_PIPE_CONNECTED) { + SetEvent(Connection->ovl.hEvent); + return RPC_S_OK; + } + return RPC_S_SERVER_UNAVAILABLE; + } + } + else { + ERR("protseq %s not supported\n", Connection->Protseq); + return RPC_S_PROTSEQ_NOT_SUPPORTED; + } + } + else { /* client */ + /* protseq=ncalrpc: supposed to use NT LPC ports, + * but we'll implement it with named pipes for now */ + if (strcmp(Connection->Protseq, "ncalrpc") == 0) { + static LPCSTR prefix = "\\\\.\\pipe\\lrpc\\"; + LPSTR pname; + HANDLE conn; + DWORD err; + DWORD dwMode; + + pname = HeapAlloc(GetProcessHeap(), 0, strlen(prefix) + strlen(Connection->Endpoint) + 1); + strcat(strcpy(pname, prefix), Connection->Endpoint); + TRACE("connecting to %s\n", pname); + while (TRUE) { + if (WaitNamedPipeA(pname, NMPWAIT_WAIT_FOREVER)) { + conn = CreateFileA(pname, GENERIC_READ|GENERIC_WRITE, 0, NULL, + OPEN_EXISTING, 0, 0); + if (conn != INVALID_HANDLE_VALUE) break; + err = GetLastError(); + if (err == ERROR_PIPE_BUSY) continue; + TRACE("connection failed, error=%lx\n", err); + HeapFree(GetProcessHeap(), 0, pname); + return RPC_S_SERVER_TOO_BUSY; + } else { + err = GetLastError(); + TRACE("connection failed, error=%lx\n", err); + HeapFree(GetProcessHeap(), 0, pname); + return RPC_S_SERVER_UNAVAILABLE; + } + } + + /* success */ + HeapFree(GetProcessHeap(), 0, pname); + memset(&Connection->ovl, 0, sizeof(Connection->ovl)); + /* pipe is connected; change to message-read mode. */ + dwMode = PIPE_READMODE_MESSAGE; + SetNamedPipeHandleState(conn, &dwMode, NULL, NULL); + Connection->ovl.hEvent = CreateEventA(NULL, TRUE, FALSE, NULL); + Connection->conn = conn; + } + /* protseq=ncacn_np: named pipes */ + else if (strcmp(Connection->Protseq, "ncacn_np") == 0) { + static LPCSTR prefix = "\\\\."; + LPSTR pname; + HANDLE conn; + DWORD err; + DWORD dwMode; + + pname = HeapAlloc(GetProcessHeap(), 0, strlen(prefix) + strlen(Connection->Endpoint) + 1); + strcat(strcpy(pname, prefix), Connection->Endpoint); + TRACE("connecting to %s\n", pname); + conn = CreateFileA(pname, GENERIC_READ|GENERIC_WRITE, 0, NULL, + OPEN_EXISTING, 0, 0); + if (conn == INVALID_HANDLE_VALUE) { + err = GetLastError(); + /* we don't need to handle ERROR_PIPE_BUSY here, + * the doc says that it is returned to the app */ + TRACE("connection failed, error=%lx\n", err); + HeapFree(GetProcessHeap(), 0, pname); + if (err == ERROR_PIPE_BUSY) + return RPC_S_SERVER_TOO_BUSY; + else + return RPC_S_SERVER_UNAVAILABLE; + } + + /* success */ + HeapFree(GetProcessHeap(), 0, pname); + memset(&Connection->ovl, 0, sizeof(Connection->ovl)); + /* pipe is connected; change to message-read mode. */ + dwMode = PIPE_READMODE_MESSAGE; + SetNamedPipeHandleState(conn, &dwMode, NULL, NULL); + Connection->ovl.hEvent = CreateEventA(NULL, TRUE, FALSE, NULL); + Connection->conn = conn; + } else { + ERR("protseq %s not supported\n", Connection->Protseq); + return RPC_S_PROTSEQ_NOT_SUPPORTED; + } + } + } + return RPC_S_OK; +} + +RPC_STATUS RPCRT4_CloseConnection(RpcConnection* Connection) +{ + TRACE("(Connection == ^%p)\n", Connection); + if (Connection->conn) { + CancelIo(Connection->conn); + CloseHandle(Connection->conn); + Connection->conn = 0; + } + if (Connection->ovl.hEvent) { + CloseHandle(Connection->ovl.hEvent); + Connection->ovl.hEvent = 0; + } + return RPC_S_OK; +} + +RPC_STATUS RPCRT4_SpawnConnection(RpcConnection** Connection, RpcConnection* OldConnection) +{ + RpcConnection* NewConnection; + RPC_STATUS err = RPCRT4_CreateConnection(&NewConnection, OldConnection->server, OldConnection->Protseq, + OldConnection->NetworkAddr, OldConnection->Endpoint, NULL, NULL); + if (err == RPC_S_OK) { + /* because of the way named pipes work, we'll transfer the connected pipe + * to the child, then reopen the server binding to continue listening */ + NewConnection->conn = OldConnection->conn; + NewConnection->ovl = OldConnection->ovl; + OldConnection->conn = 0; + memset(&OldConnection->ovl, 0, sizeof(OldConnection->ovl)); + *Connection = NewConnection; + RPCRT4_OpenConnection(OldConnection); + } + return err; +} + +RPC_STATUS RPCRT4_AllocBinding(RpcBinding** Binding, BOOL server) +{ + RpcBinding* NewBinding; + + NewBinding = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(RpcBinding)); + NewBinding->refs = 1; + NewBinding->server = server; + + *Binding = NewBinding; + + return RPC_S_OK; +} + +RPC_STATUS RPCRT4_CreateBindingA(RpcBinding** Binding, BOOL server, LPSTR Protseq) +{ + RpcBinding* NewBinding; + + RPCRT4_AllocBinding(&NewBinding, server); + NewBinding->Protseq = RPCRT4_strdupA(Protseq); + + TRACE("binding: %p\n", NewBinding); + *Binding = NewBinding; + + return RPC_S_OK; +} + +RPC_STATUS RPCRT4_CreateBindingW(RpcBinding** Binding, BOOL server, LPWSTR Protseq) +{ + RpcBinding* NewBinding; + + RPCRT4_AllocBinding(&NewBinding, server); + NewBinding->Protseq = RPCRT4_strdupWtoA(Protseq); + + TRACE("binding: %p\n", NewBinding); + *Binding = NewBinding; + + return RPC_S_OK; +} + +RPC_STATUS RPCRT4_CompleteBindingA(RpcBinding* Binding, LPSTR NetworkAddr, LPSTR Endpoint, LPSTR NetworkOptions) +{ + TRACE("(RpcBinding == ^%p, NetworkAddr == \"%s\", EndPoint == \"%s\", NetworkOptions == \"%s\")\n", Binding, + debugstr_a(NetworkAddr), debugstr_a(Endpoint), debugstr_a(NetworkOptions)); + + RPCRT4_strfree(Binding->NetworkAddr); + Binding->NetworkAddr = RPCRT4_strdupA(NetworkAddr); + RPCRT4_strfree(Binding->Endpoint); + if (Endpoint) { + Binding->Endpoint = RPCRT4_strdupA(Endpoint); + } else { + Binding->Endpoint = RPCRT4_strdupA(""); + } + if (!Binding->Endpoint) ERR("out of memory?\n"); + + return RPC_S_OK; +} + +RPC_STATUS RPCRT4_CompleteBindingW(RpcBinding* Binding, LPWSTR NetworkAddr, LPWSTR Endpoint, LPWSTR NetworkOptions) +{ + TRACE("(RpcBinding == ^%p, NetworkAddr == \"%s\", EndPoint == \"%s\", NetworkOptions == \"%s\")\n", Binding, + debugstr_w(NetworkAddr), debugstr_w(Endpoint), debugstr_w(NetworkOptions)); + + RPCRT4_strfree(Binding->NetworkAddr); + Binding->NetworkAddr = RPCRT4_strdupWtoA(NetworkAddr); + RPCRT4_strfree(Binding->Endpoint); + if (Endpoint) { + Binding->Endpoint = RPCRT4_strdupWtoA(Endpoint); + } else { + Binding->Endpoint = RPCRT4_strdupA(""); + } + if (!Binding->Endpoint) ERR("out of memory?\n"); + + return RPC_S_OK; +} + +RPC_STATUS RPCRT4_ResolveBinding(RpcBinding* Binding, LPSTR Endpoint) +{ + TRACE("(RpcBinding == ^%p, EndPoint == \"%s\"\n", Binding, Endpoint); + + RPCRT4_strfree(Binding->Endpoint); + Binding->Endpoint = RPCRT4_strdupA(Endpoint); + + return RPC_S_OK; +} + +RPC_STATUS RPCRT4_SetBindingObject(RpcBinding* Binding, UUID* ObjectUuid) +{ + TRACE("(*RpcBinding == ^%p, UUID == %s)\n", Binding, debugstr_guid(ObjectUuid)); + if (ObjectUuid) memcpy(&Binding->ObjectUuid, ObjectUuid, sizeof(UUID)); + else UuidCreateNil(&Binding->ObjectUuid); + return RPC_S_OK; +} + +RPC_STATUS RPCRT4_MakeBinding(RpcBinding** Binding, RpcConnection* Connection) +{ + RpcBinding* NewBinding; + TRACE("(*RpcBinding == ^%p, Connection == ^%p)\n", *Binding, Connection); + + RPCRT4_AllocBinding(&NewBinding, Connection->server); + NewBinding->Protseq = RPCRT4_strdupA(Connection->Protseq); + NewBinding->NetworkAddr = RPCRT4_strdupA(Connection->NetworkAddr); + NewBinding->Endpoint = RPCRT4_strdupA(Connection->Endpoint); + NewBinding->FromConn = Connection; + + TRACE("binding: %p\n", NewBinding); + *Binding = NewBinding; + + return RPC_S_OK; +} + +RPC_STATUS RPCRT4_ExportBinding(RpcBinding** Binding, RpcBinding* OldBinding) +{ + InterlockedIncrement(&OldBinding->refs); + *Binding = OldBinding; + return RPC_S_OK; +} + +RPC_STATUS RPCRT4_DestroyBinding(RpcBinding* Binding) +{ + if (InterlockedDecrement(&Binding->refs)) + return RPC_S_OK; + + TRACE("binding: %p\n", Binding); + /* FIXME: release connections */ + RPCRT4_strfree(Binding->Endpoint); + RPCRT4_strfree(Binding->NetworkAddr); + RPCRT4_strfree(Binding->Protseq); + HeapFree(GetProcessHeap(), 0, Binding); + return RPC_S_OK; +} + +RPC_STATUS RPCRT4_OpenBinding(RpcBinding* Binding, RpcConnection** Connection, + PRPC_SYNTAX_IDENTIFIER TransferSyntax, + PRPC_SYNTAX_IDENTIFIER InterfaceId) +{ + RpcConnection* NewConnection; + RPC_STATUS status; + + TRACE("(Binding == ^%p)\n", Binding); + + /* if we try to bind a new interface and the connection is already opened, + * close the current connection and create a new with the new binding. */ + if (!Binding->server && Binding->FromConn && + memcmp(&Binding->FromConn->ActiveInterface, InterfaceId, + sizeof(RPC_SYNTAX_IDENTIFIER))) { + RPCRT4_ReleaseConnection(Binding->FromConn); + Binding->FromConn = NULL; + } else { + /* we already have an connection with acceptable binding, so use it */ + if (Binding->FromConn) { + *Connection = Binding->FromConn; + return RPC_S_OK; + } + } + + /* create a new connection */ + RPCRT4_GetConnection(&NewConnection, Binding->server, Binding->Protseq, Binding->NetworkAddr, Binding->Endpoint, NULL, Binding); + *Connection = NewConnection; + status = RPCRT4_OpenConnection(NewConnection); + if (status != RPC_S_OK) { + return status; + } + + /* we need to send a binding packet if we are client. */ + if (!(*Connection)->server) { + RpcPktHdr *hdr; + DWORD count; + BYTE *response; + RpcPktHdr *response_hdr; + + TRACE("sending bind request to server\n"); + + hdr = RPCRT4_BuildBindHeader(NDR_LOCAL_DATA_REPRESENTATION, + RPC_MAX_PACKET_SIZE, RPC_MAX_PACKET_SIZE, + InterfaceId, TransferSyntax); + + status = RPCRT4_Send(*Connection, hdr, NULL, 0); + if (status != RPC_S_OK) { + RPCRT4_ReleaseConnection(*Connection); + return status; + } + + response = HeapAlloc(GetProcessHeap(), 0, RPC_MAX_PACKET_SIZE); + if (response == NULL) { + WARN("Can't allocate memory for binding response\n"); + RPCRT4_ReleaseConnection(*Connection); + return E_OUTOFMEMORY; + } + + /* get a reply */ + if (!ReadFile(NewConnection->conn, response, RPC_MAX_PACKET_SIZE, &count, NULL)) { + WARN("ReadFile failed with error %ld\n", GetLastError()); + RPCRT4_ReleaseConnection(*Connection); + return RPC_S_PROTOCOL_ERROR; + } + + if (count < sizeof(response_hdr->common)) { + WARN("received invalid header\n"); + RPCRT4_ReleaseConnection(*Connection); + return RPC_S_PROTOCOL_ERROR; + } + + response_hdr = (RpcPktHdr*)response; + + if (response_hdr->common.rpc_ver != RPC_VER_MAJOR || + response_hdr->common.rpc_ver_minor != RPC_VER_MINOR || + response_hdr->common.ptype != PKT_BIND_ACK) { + WARN("invalid protocol version or rejection packet\n"); + RPCRT4_ReleaseConnection(Binding->FromConn); + return RPC_S_PROTOCOL_ERROR; + } + + if (response_hdr->bind_ack.max_tsize < RPC_MIN_PACKET_SIZE) { + WARN("server doesn't allow large enough packets\n"); + RPCRT4_ReleaseConnection(Binding->FromConn); + return RPC_S_PROTOCOL_ERROR; + } + + /* FIXME: do more checks? */ + + (*Connection)->MaxTransmissionSize = response_hdr->bind_ack.max_tsize; + (*Connection)->ActiveInterface = *InterfaceId; + } + + return RPC_S_OK; +} + +RPC_STATUS RPCRT4_CloseBinding(RpcBinding* Binding, RpcConnection* Connection) +{ + TRACE("(Binding == ^%p)\n", Binding); + if (!Connection) return RPC_S_OK; + if (Binding->FromConn == Connection) return RPC_S_OK; + return RPCRT4_ReleaseConnection(Connection); +} + +/* utility functions for string composing and parsing */ +static unsigned RPCRT4_strcopyA(LPSTR data, LPCSTR src) +{ + unsigned len = strlen(src); + memcpy(data, src, len*sizeof(CHAR)); + return len; +} + +static unsigned RPCRT4_strcopyW(LPWSTR data, LPCWSTR src) +{ + unsigned len = strlenW(src); + memcpy(data, src, len*sizeof(WCHAR)); + return len; +} + +static LPSTR RPCRT4_strconcatA(LPSTR dst, LPCSTR src) +{ + DWORD len = strlen(dst), slen = strlen(src); + LPSTR ndst = HeapReAlloc(GetProcessHeap(), 0, dst, (len+slen+2)*sizeof(CHAR)); + if (!ndst) + { + HeapFree(GetProcessHeap(), 0, dst); + return NULL; + } + ndst[len] = ','; + memcpy(ndst+len+1, src, slen+1); + return ndst; +} + +static LPWSTR RPCRT4_strconcatW(LPWSTR dst, LPCWSTR src) +{ + DWORD len = strlenW(dst), slen = strlenW(src); + LPWSTR ndst = HeapReAlloc(GetProcessHeap(), 0, dst, (len+slen+2)*sizeof(WCHAR)); + if (!ndst) + { + HeapFree(GetProcessHeap(), 0, dst); + return NULL; + } + ndst[len] = ','; + memcpy(ndst+len+1, src, (slen+1)*sizeof(WCHAR)); + return ndst; +} + + +/*********************************************************************** + * RpcStringBindingComposeA (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcStringBindingComposeA(unsigned char *ObjUuid, unsigned char *Protseq, + unsigned char *NetworkAddr, unsigned char *Endpoint, + unsigned char *Options, unsigned char** StringBinding ) +{ + DWORD len = 1; + LPSTR data; + + TRACE( "(%s,%s,%s,%s,%s,%p)\n", + debugstr_a( ObjUuid ), debugstr_a( Protseq ), + debugstr_a( NetworkAddr ), debugstr_a( Endpoint ), + debugstr_a( Options ), StringBinding ); + + if (ObjUuid && *ObjUuid) len += strlen(ObjUuid) + 1; + if (Protseq && *Protseq) len += strlen(Protseq) + 1; + if (NetworkAddr && *NetworkAddr) len += strlen(NetworkAddr); + if (Endpoint && *Endpoint) len += strlen(Endpoint) + 2; + if (Options && *Options) len += strlen(Options) + 2; + + data = HeapAlloc(GetProcessHeap(), 0, len); + *StringBinding = data; + + if (ObjUuid && *ObjUuid) { + data += RPCRT4_strcopyA(data, ObjUuid); + *data++ = '@'; + } + if (Protseq && *Protseq) { + data += RPCRT4_strcopyA(data, Protseq); + *data++ = ':'; + } + if (NetworkAddr && *NetworkAddr) + data += RPCRT4_strcopyA(data, NetworkAddr); + + if ((Endpoint && *Endpoint) || + (Options && *Options)) { + *data++ = '['; + if (Endpoint && *Endpoint) { + data += RPCRT4_strcopyA(data, Endpoint); + if (Options && *Options) *data++ = ','; + } + if (Options && *Options) { + data += RPCRT4_strcopyA(data, Options); + } + *data++ = ']'; + } + *data = 0; + + return RPC_S_OK; +} + +/*********************************************************************** + * RpcStringBindingComposeW (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcStringBindingComposeW( LPWSTR ObjUuid, LPWSTR Protseq, + LPWSTR NetworkAddr, LPWSTR Endpoint, + LPWSTR Options, LPWSTR* StringBinding ) +{ + DWORD len = 1; + LPWSTR data; + + TRACE("(%s,%s,%s,%s,%s,%p)\n", + debugstr_w( ObjUuid ), debugstr_w( Protseq ), + debugstr_w( NetworkAddr ), debugstr_w( Endpoint ), + debugstr_w( Options ), StringBinding); + + if (ObjUuid && *ObjUuid) len += strlenW(ObjUuid) + 1; + if (Protseq && *Protseq) len += strlenW(Protseq) + 1; + if (NetworkAddr && *NetworkAddr) len += strlenW(NetworkAddr); + if (Endpoint && *Endpoint) len += strlenW(Endpoint) + 2; + if (Options && *Options) len += strlenW(Options) + 2; + + data = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR)); + *StringBinding = data; + + if (ObjUuid && *ObjUuid) { + data += RPCRT4_strcopyW(data, ObjUuid); + *data++ = '@'; + } + if (Protseq && *Protseq) { + data += RPCRT4_strcopyW(data, Protseq); + *data++ = ':'; + } + if (NetworkAddr && *NetworkAddr) { + data += RPCRT4_strcopyW(data, NetworkAddr); + } + if ((Endpoint && *Endpoint) || + (Options && *Options)) { + *data++ = '['; + if (Endpoint && *Endpoint) { + data += RPCRT4_strcopyW(data, Endpoint); + if (Options && *Options) *data++ = ','; + } + if (Options && *Options) { + data += RPCRT4_strcopyW(data, Options); + } + *data++ = ']'; + } + *data = 0; + + return RPC_S_OK; +} + + +/*********************************************************************** + * RpcStringBindingParseA (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcStringBindingParseA( unsigned char *StringBinding, unsigned char **ObjUuid, + unsigned char **Protseq, unsigned char **NetworkAddr, + unsigned char **Endpoint, unsigned char **Options) +{ + CHAR *data, *next; + static const char ep_opt[] = "endpoint="; + + TRACE("(%s,%p,%p,%p,%p,%p)\n", debugstr_a(StringBinding), + ObjUuid, Protseq, NetworkAddr, Endpoint, Options); + + if (ObjUuid) *ObjUuid = NULL; + if (Protseq) *Protseq = NULL; + if (NetworkAddr) *NetworkAddr = NULL; + if (Endpoint) *Endpoint = NULL; + if (Options) *Options = NULL; + + data = StringBinding; + + next = strchr(data, '@'); + if (next) { + if (ObjUuid) *ObjUuid = RPCRT4_strndupA(data, next - data); + data = next+1; + } + + next = strchr(data, ':'); + if (next) { + if (Protseq) *Protseq = RPCRT4_strndupA(data, next - data); + data = next+1; + } + + next = strchr(data, '['); + if (next) { + CHAR *close, *opt; + + if (NetworkAddr) *NetworkAddr = RPCRT4_strndupA(data, next - data); + data = next+1; + close = strchr(data, ']'); + if (!close) goto fail; + + /* tokenize options */ + while (data < close) { + next = strchr(data, ','); + if (!next || next > close) next = close; + /* FIXME: this is kind of inefficient */ + opt = RPCRT4_strndupA(data, next - data); + data = next+1; + + /* parse option */ + next = strchr(opt, '='); + if (!next) { + /* not an option, must be an endpoint */ + if (*Endpoint) goto fail; + *Endpoint = opt; + } else { + if (strncmp(opt, ep_opt, strlen(ep_opt)) == 0) { + /* endpoint option */ + if (*Endpoint) goto fail; + *Endpoint = RPCRT4_strdupA(next+1); + HeapFree(GetProcessHeap(), 0, opt); + } else { + /* network option */ + if (*Options) { + /* FIXME: this is kind of inefficient */ + *Options = RPCRT4_strconcatA(*Options, opt); + HeapFree(GetProcessHeap(), 0, opt); + } else + *Options = opt; + } + } + } + + data = close+1; + if (*data) goto fail; + } + else if (NetworkAddr) + *NetworkAddr = RPCRT4_strdupA(data); + + return RPC_S_OK; + +fail: + if (ObjUuid) RpcStringFreeA((unsigned char**)ObjUuid); + if (Protseq) RpcStringFreeA((unsigned char**)Protseq); + if (NetworkAddr) RpcStringFreeA((unsigned char**)NetworkAddr); + if (Endpoint) RpcStringFreeA((unsigned char**)Endpoint); + if (Options) RpcStringFreeA((unsigned char**)Options); + return RPC_S_INVALID_STRING_BINDING; +} + +/*********************************************************************** + * RpcStringBindingParseW (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcStringBindingParseW( LPWSTR StringBinding, LPWSTR *ObjUuid, + LPWSTR *Protseq, LPWSTR *NetworkAddr, + LPWSTR *Endpoint, LPWSTR *Options) +{ + WCHAR *data, *next; + static const WCHAR ep_opt[] = {'e','n','d','p','o','i','n','t','=',0}; + + TRACE("(%s,%p,%p,%p,%p,%p)\n", debugstr_w(StringBinding), + ObjUuid, Protseq, NetworkAddr, Endpoint, Options); + + if (ObjUuid) *ObjUuid = NULL; + if (Protseq) *Protseq = NULL; + if (NetworkAddr) *NetworkAddr = NULL; + if (Endpoint) *Endpoint = NULL; + if (Options) *Options = NULL; + + data = StringBinding; + + next = strchrW(data, '@'); + if (next) { + if (ObjUuid) *ObjUuid = RPCRT4_strndupW(data, next - data); + data = next+1; + } + + next = strchrW(data, ':'); + if (next) { + if (Protseq) *Protseq = RPCRT4_strndupW(data, next - data); + data = next+1; + } + + next = strchrW(data, '['); + if (next) { + WCHAR *close, *opt; + + if (NetworkAddr) *NetworkAddr = RPCRT4_strndupW(data, next - data); + data = next+1; + close = strchrW(data, ']'); + if (!close) goto fail; + + /* tokenize options */ + while (data < close) { + next = strchrW(data, ','); + if (!next || next > close) next = close; + /* FIXME: this is kind of inefficient */ + opt = RPCRT4_strndupW(data, next - data); + data = next+1; + + /* parse option */ + next = strchrW(opt, '='); + if (!next) { + /* not an option, must be an endpoint */ + if (*Endpoint) goto fail; + *Endpoint = opt; + } else { + if (strncmpW(opt, ep_opt, strlenW(ep_opt)) == 0) { + /* endpoint option */ + if (*Endpoint) goto fail; + *Endpoint = RPCRT4_strdupW(next+1); + HeapFree(GetProcessHeap(), 0, opt); + } else { + /* network option */ + if (*Options) { + /* FIXME: this is kind of inefficient */ + *Options = RPCRT4_strconcatW(*Options, opt); + HeapFree(GetProcessHeap(), 0, opt); + } else + *Options = opt; + } + } + } + + data = close+1; + if (*data) goto fail; + } else if (NetworkAddr) + *NetworkAddr = RPCRT4_strdupW(data); + + return RPC_S_OK; + +fail: + if (ObjUuid) RpcStringFreeW(ObjUuid); + if (Protseq) RpcStringFreeW(Protseq); + if (NetworkAddr) RpcStringFreeW(NetworkAddr); + if (Endpoint) RpcStringFreeW(Endpoint); + if (Options) RpcStringFreeW(Options); + return RPC_S_INVALID_STRING_BINDING; +} + +/*********************************************************************** + * RpcBindingFree (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcBindingFree( RPC_BINDING_HANDLE* Binding ) +{ + RPC_STATUS status; + TRACE("(%p) = %p\n", Binding, *Binding); + status = RPCRT4_DestroyBinding(*Binding); + if (status == RPC_S_OK) *Binding = 0; + return status; +} + +/*********************************************************************** + * RpcBindingVectorFree (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcBindingVectorFree( RPC_BINDING_VECTOR** BindingVector ) +{ + RPC_STATUS status; + unsigned long c; + + TRACE("(%p)\n", BindingVector); + for (c=0; c<(*BindingVector)->Count; c++) { + status = RpcBindingFree(&(*BindingVector)->BindingH[c]); + } + HeapFree(GetProcessHeap(), 0, *BindingVector); + *BindingVector = NULL; + return RPC_S_OK; +} + +/*********************************************************************** + * RpcBindingInqObject (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcBindingInqObject( RPC_BINDING_HANDLE Binding, UUID* ObjectUuid ) +{ + RpcBinding* bind = (RpcBinding*)Binding; + + TRACE("(%p,%p) = %s\n", Binding, ObjectUuid, debugstr_guid(&bind->ObjectUuid)); + memcpy(ObjectUuid, &bind->ObjectUuid, sizeof(UUID)); + return RPC_S_OK; +} + +/*********************************************************************** + * RpcBindingSetObject (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcBindingSetObject( RPC_BINDING_HANDLE Binding, UUID* ObjectUuid ) +{ + RpcBinding* bind = (RpcBinding*)Binding; + + TRACE("(%p,%s)\n", Binding, debugstr_guid(ObjectUuid)); + if (bind->server) return RPC_S_WRONG_KIND_OF_BINDING; + return RPCRT4_SetBindingObject(Binding, ObjectUuid); +} + +/*********************************************************************** + * RpcBindingFromStringBindingA (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcBindingFromStringBindingA( unsigned char *StringBinding, RPC_BINDING_HANDLE* Binding ) +{ + RPC_STATUS ret; + RpcBinding* bind = NULL; + unsigned char *ObjectUuid, *Protseq, *NetworkAddr, *Endpoint, *Options; + UUID Uuid; + + TRACE("(%s,%p)\n", debugstr_a(StringBinding), Binding); + + ret = RpcStringBindingParseA(StringBinding, &ObjectUuid, &Protseq, + &NetworkAddr, &Endpoint, &Options); + if (ret != RPC_S_OK) return ret; + + ret = UuidFromStringA(ObjectUuid, &Uuid); + + if (ret == RPC_S_OK) + ret = RPCRT4_CreateBindingA(&bind, FALSE, Protseq); + if (ret == RPC_S_OK) + ret = RPCRT4_SetBindingObject(bind, &Uuid); + if (ret == RPC_S_OK) + ret = RPCRT4_CompleteBindingA(bind, NetworkAddr, Endpoint, Options); + + RpcStringFreeA((unsigned char**)&Options); + RpcStringFreeA((unsigned char**)&Endpoint); + RpcStringFreeA((unsigned char**)&NetworkAddr); + RpcStringFreeA((unsigned char**)&Protseq); + RpcStringFreeA((unsigned char**)&ObjectUuid); + + if (ret == RPC_S_OK) + *Binding = (RPC_BINDING_HANDLE)bind; + else + RPCRT4_DestroyBinding(bind); + + return ret; +} + +/*********************************************************************** + * RpcBindingFromStringBindingW (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcBindingFromStringBindingW( LPWSTR StringBinding, RPC_BINDING_HANDLE* Binding ) +{ + RPC_STATUS ret; + RpcBinding* bind = NULL; + LPWSTR ObjectUuid, Protseq, NetworkAddr, Endpoint, Options; + UUID Uuid; + + TRACE("(%s,%p)\n", debugstr_w(StringBinding), Binding); + + ret = RpcStringBindingParseW(StringBinding, &ObjectUuid, &Protseq, + &NetworkAddr, &Endpoint, &Options); + if (ret != RPC_S_OK) return ret; + + ret = UuidFromStringW(ObjectUuid, &Uuid); + + if (ret == RPC_S_OK) + ret = RPCRT4_CreateBindingW(&bind, FALSE, Protseq); + if (ret == RPC_S_OK) + ret = RPCRT4_SetBindingObject(bind, &Uuid); + if (ret == RPC_S_OK) + ret = RPCRT4_CompleteBindingW(bind, NetworkAddr, Endpoint, Options); + + RpcStringFreeW(&Options); + RpcStringFreeW(&Endpoint); + RpcStringFreeW(&NetworkAddr); + RpcStringFreeW(&Protseq); + RpcStringFreeW(&ObjectUuid); + + if (ret == RPC_S_OK) + *Binding = (RPC_BINDING_HANDLE)bind; + else + RPCRT4_DestroyBinding(bind); + + return ret; +} + +/*********************************************************************** + * RpcBindingToStringBindingA (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcBindingToStringBindingA( RPC_BINDING_HANDLE Binding, unsigned char** StringBinding ) +{ + RPC_STATUS ret; + RpcBinding* bind = (RpcBinding*)Binding; + LPSTR ObjectUuid; + + TRACE("(%p,%p)\n", Binding, StringBinding); + + ret = UuidToStringA(&bind->ObjectUuid, (unsigned char**)&ObjectUuid); + if (ret != RPC_S_OK) return ret; + + ret = RpcStringBindingComposeA(ObjectUuid, bind->Protseq, bind->NetworkAddr, + bind->Endpoint, NULL, StringBinding); + + RpcStringFreeA((unsigned char**)&ObjectUuid); + + return ret; +} + +/*********************************************************************** + * RpcBindingToStringBindingW (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcBindingToStringBindingW( RPC_BINDING_HANDLE Binding, LPWSTR* StringBinding ) +{ + RPC_STATUS ret; + unsigned char *str = NULL; + TRACE("(%p,%p)\n", Binding, StringBinding); + ret = RpcBindingToStringBindingA(Binding, &str); + *StringBinding = RPCRT4_strdupAtoW(str); + RpcStringFreeA((unsigned char**)&str); + return ret; +} + +/*********************************************************************** + * I_RpcBindingSetAsync (RPCRT4.@) + * NOTES + * Exists in win9x and winNT, but with different number of arguments + * (9x version has 3 arguments, NT has 2). + */ +RPC_STATUS WINAPI I_RpcBindingSetAsync( RPC_BINDING_HANDLE Binding, RPC_BLOCKING_FN BlockingFn) +{ + RpcBinding* bind = (RpcBinding*)Binding; + + TRACE( "(%p,%p): stub\n", Binding, BlockingFn ); + + bind->BlockingFn = BlockingFn; + + return RPC_S_OK; +} + +/*********************************************************************** + * RpcNetworkIsProtseqValidA (RPCRT4.@) + */ +RPC_STATUS RPC_ENTRY RpcNetworkIsProtseqValidA(unsigned char *protseq) { + UNICODE_STRING protseqW; + + if (!protseq) return RPC_S_INVALID_RPC_PROTSEQ; /* ? */ + + if (RtlCreateUnicodeStringFromAsciiz(&protseqW, protseq)) { + RPC_STATUS ret = RpcNetworkIsProtseqValidW(protseqW.Buffer); + RtlFreeUnicodeString(&protseqW); + return ret; + } else return RPC_S_OUT_OF_MEMORY; +} + +/*********************************************************************** + * RpcNetworkIsProtseqValidW (RPCRT4.@) + * + * Checks if the given protocol sequence is known by the RPC system. + * If it is, returns RPC_S_OK, otherwise RPC_S_PROTSEQ_NOT_SUPPORTED. + * + * We currently support: + * ncalrpc local-only rpc over LPC (LPC is not really used) + * ncacn_np rpc over named pipes + */ +RPC_STATUS RPC_ENTRY RpcNetworkIsProtseqValidW(LPWSTR protseq) { + static const WCHAR protseqsW[][15] = { + {'n','c','a','l','r','p','c',0}, + {'n','c','a','c','n','_','n','p',0} + }; + static const int count = sizeof(protseqsW) / sizeof(protseqsW[0]); + int i; + + if (!protseq) return RPC_S_INVALID_RPC_PROTSEQ; /* ? */ + + for (i = 0; i < count; i++) { + if (!strcmpW(protseq, protseqsW[i])) return RPC_S_OK; + } + + FIXME("Unknown protseq %s - we probably need to implement it one day\n", debugstr_w(protseq)); + return RPC_S_PROTSEQ_NOT_SUPPORTED; +} diff --git a/reactos/lib/rpcrt4/rpc_binding.h b/reactos/lib/rpcrt4/rpc_binding.h new file mode 100644 index 00000000000..c358356dd5f --- /dev/null +++ b/reactos/lib/rpcrt4/rpc_binding.h @@ -0,0 +1,86 @@ +/* + * RPC binding API + * + * Copyright 2001 Ove K鍁en, TransGaming Technologies + * + * 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_RPC_BINDING_H +#define __WINE_RPC_BINDING_H + +#include "wine/rpcss_shared.h" + +typedef struct _RpcConnection +{ + struct _RpcConnection* Next; + struct _RpcBinding* Used; + BOOL server; + LPSTR Protseq; + LPSTR NetworkAddr; + LPSTR Endpoint; + HANDLE conn, thread; + OVERLAPPED ovl; + USHORT MaxTransmissionSize; + /* The active interface bound to server. */ + RPC_SYNTAX_IDENTIFIER ActiveInterface; +} RpcConnection; + +/* don't know what MS's structure looks like */ +typedef struct _RpcBinding +{ + DWORD refs; + struct _RpcBinding* Next; + BOOL server; + UUID ObjectUuid; + LPSTR Protseq; + LPSTR NetworkAddr; + LPSTR Endpoint; + RPC_BLOCKING_FN BlockingFn; + ULONG ServerTid; + RpcConnection* FromConn; +} RpcBinding; + +LPSTR RPCRT4_strndupA(LPCSTR src, INT len); +LPWSTR RPCRT4_strndupW(LPWSTR src, INT len); +LPSTR RPCRT4_strdupWtoA(LPWSTR src); +LPWSTR RPCRT4_strdupAtoW(LPSTR src); +void RPCRT4_strfree(LPSTR src); + +#define RPCRT4_strdupA(x) RPCRT4_strndupA((x),-1) +#define RPCRT4_strdupW(x) RPCRT4_strndupW((x),-1) + +RPC_STATUS RPCRT4_CreateConnection(RpcConnection** Connection, BOOL server, LPSTR Protseq, LPSTR NetworkAddr, LPSTR Endpoint, LPSTR NetworkOptions, RpcBinding* Binding); +RPC_STATUS RPCRT4_DestroyConnection(RpcConnection* Connection); +RPC_STATUS RPCRT4_OpenConnection(RpcConnection* Connection); +RPC_STATUS RPCRT4_CloseConnection(RpcConnection* Connection); +RPC_STATUS RPCRT4_SpawnConnection(RpcConnection** Connection, RpcConnection* OldConnection); + +RPC_STATUS RPCRT4_CreateBindingA(RpcBinding** Binding, BOOL server, LPSTR Protseq); +RPC_STATUS RPCRT4_CreateBindingW(RpcBinding** Binding, BOOL server, LPWSTR Protseq); +RPC_STATUS RPCRT4_CompleteBindingA(RpcBinding* Binding, LPSTR NetworkAddr, LPSTR Endpoint, LPSTR NetworkOptions); +RPC_STATUS RPCRT4_CompleteBindingW(RpcBinding* Binding, LPWSTR NetworkAddr, LPWSTR Endpoint, LPWSTR NetworkOptions); +RPC_STATUS RPCRT4_ResolveBinding(RpcBinding* Binding, LPSTR Endpoint); +RPC_STATUS RPCRT4_SetBindingObject(RpcBinding* Binding, UUID* ObjectUuid); +RPC_STATUS RPCRT4_MakeBinding(RpcBinding** Binding, RpcConnection* Connection); +RPC_STATUS RPCRT4_ExportBinding(RpcBinding** Binding, RpcBinding* OldBinding); +RPC_STATUS RPCRT4_DestroyBinding(RpcBinding* Binding); +RPC_STATUS RPCRT4_OpenBinding(RpcBinding* Binding, RpcConnection** Connection, PRPC_SYNTAX_IDENTIFIER TransferSyntax, PRPC_SYNTAX_IDENTIFIER InterfaceId); +RPC_STATUS RPCRT4_CloseBinding(RpcBinding* Binding, RpcConnection* Connection); +BOOL RPCRT4_RPCSSOnDemandCall(PRPCSS_NP_MESSAGE msg, char *vardata_payload, PRPCSS_NP_REPLY reply); +HANDLE RPCRT4_GetMasterMutex(void); +HANDLE RPCRT4_RpcssNPConnect(void); + +#endif diff --git a/reactos/lib/rpcrt4/rpc_defs.h b/reactos/lib/rpcrt4/rpc_defs.h new file mode 100644 index 00000000000..9e9a7359b10 --- /dev/null +++ b/reactos/lib/rpcrt4/rpc_defs.h @@ -0,0 +1,183 @@ +/* + * RPC definitions + * + * Copyright 2001-2002 Ove K鍁en, TransGaming Technologies + * Copyright 2004 Filip Navara + * + * 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_RPC_DEFS_H +#define __WINE_RPC_DEFS_H + +/* info from http://www.microsoft.com/msj/0398/dcomtextfigs.htm */ + +typedef struct +{ + unsigned char rpc_ver; /* RPC major version (5) */ + unsigned char rpc_ver_minor; /* RPC minor version (0) */ + unsigned char ptype; /* Packet type (PKT_*) */ + unsigned char flags; + unsigned char drep[4]; /* Data representation */ + unsigned short frag_len; /* Data size in bytes including header and tail. */ + unsigned short auth_len; /* Authentication length */ + unsigned long call_id; /* Call identifier. */ +} RpcPktCommonHdr; + +typedef struct +{ + RpcPktCommonHdr common; + unsigned long alloc_hint; /* Data size in bytes excluding header and tail. */ + unsigned short context_id; /* Presentation context identifier */ + unsigned short opnum; +} RpcPktRequestHdr; + +typedef struct +{ + RpcPktCommonHdr common; + unsigned long alloc_hint; /* Data size in bytes excluding header and tail. */ + unsigned short context_id; /* Presentation context identifier */ + unsigned char cancel_count; + unsigned char reserved; +} RpcPktResponseHdr; + +typedef struct +{ + RpcPktCommonHdr common; + unsigned long alloc_hint; /* Data size in bytes excluding header and tail. */ + unsigned short context_id; /* Presentation context identifier */ + unsigned char alert_count; /* Pending alert count */ + unsigned char padding[3]; /* Force alignment! */ + unsigned long status; /* Runtime fault code (RPC_STATUS) */ + unsigned long reserved; +} RpcPktFaultHdr; + +typedef struct +{ + RpcPktCommonHdr common; + unsigned short max_tsize; /* Maximum transmission fragment size */ + unsigned short max_rsize; /* Maximum receive fragment size */ + unsigned long assoc_gid; /* Associated group id */ + unsigned char num_elements; /* Number of elements */ + unsigned char padding[3]; /* Force alignment! */ + unsigned short context_id; /* Presentation context identifier */ + unsigned char num_syntaxes; /* Number of syntaxes */ + RPC_SYNTAX_IDENTIFIER abstract; + RPC_SYNTAX_IDENTIFIER transfer; +} RpcPktBindHdr; + +#include "pshpack1.h" +typedef struct +{ + unsigned short length; /* Length of the string including null terminator */ + char string[1]; /* String data in single byte, null terminated form */ +} RpcAddressString; +#include "poppack.h" + +typedef struct +{ + unsigned char padding1[2]; /* Force alignment! */ + unsigned char num_results; /* Number of results */ + unsigned char padding2[3]; /* Force alignment! */ + struct { + unsigned short result; + unsigned short reason; + } results[1]; +} RpcResults; + +typedef struct +{ + RpcPktCommonHdr common; + unsigned short max_tsize; /* Maximum transmission fragment size */ + unsigned short max_rsize; /* Maximum receive fragment size */ + unsigned long assoc_gid; /* Associated group id */ + /* + * Following this header are these fields: + * RpcAddressString server_address; + * RpcResults results; + * RPC_SYNTAX_IDENTIFIER transfer; + */ +} RpcPktBindAckHdr; + +typedef struct +{ + RpcPktCommonHdr common; + unsigned short reject_reason; + unsigned char protocols_count; + struct { + unsigned char rpc_ver; + unsigned char rpc_ver_minor; + } protocols[1]; +} RpcPktBindNAckHdr; + +/* Union representing all possible packet headers */ +typedef union +{ + RpcPktCommonHdr common; + RpcPktRequestHdr request; + RpcPktResponseHdr response; + RpcPktFaultHdr fault; + RpcPktBindHdr bind; + RpcPktBindAckHdr bind_ack; + RpcPktBindNAckHdr bind_nack; +} RpcPktHdr; + +#define RPC_VER_MAJOR 5 +#define RPC_VER_MINOR 0 + +#define RPC_FLG_FIRST 1 +#define RPC_FLG_LAST 2 +#define RPC_FLG_OBJECT_UUID 0x80 + +#define RPC_MIN_PACKET_SIZE 0x1000 +#define RPC_MAX_PACKET_SIZE 0x16D0 + +#define PKT_REQUEST 0 +#define PKT_PING 1 +#define PKT_RESPONSE 2 +#define PKT_FAULT 3 +#define PKT_WORKING 4 +#define PKT_NOCALL 5 +#define PKT_REJECT 6 +#define PKT_ACK 7 +#define PKT_CL_CANCEL 8 +#define PKT_FACK 9 +#define PKT_CANCEL_ACK 10 +#define PKT_BIND 11 +#define PKT_BIND_ACK 12 +#define PKT_BIND_NACK 13 +#define PKT_ALTER_CONTEXT 14 +#define PKT_ALTER_CONTEXT_RESP 15 +#define PKT_SHUTDOWN 17 +#define PKT_CO_CANCEL 18 +#define PKT_ORPHANED 19 + +#define RESULT_ACCEPT 0 + +#define NO_REASON 0 + +#define NCADG_IP_UDP 0x08 +#define NCACN_IP_TCP 0x07 +#define NCADG_IPX 0x0E +#define NCACN_SPX 0x0C +#define NCACN_NB_NB 0x12 +#define NCACN_NB_IPX 0x0D +#define NCACN_DNET_NSP 0x04 +#define NCACN_HTTP 0x1F + +/* FreeDCE: TWR_C_FLR_PROT_ID_IP */ +#define TWR_IP 0x09 + +#endif /* __WINE_RPC_DEFS_H */ diff --git a/reactos/lib/rpcrt4/rpc_epmap.c b/reactos/lib/rpcrt4/rpc_epmap.c new file mode 100644 index 00000000000..1d8eeb2b00a --- /dev/null +++ b/reactos/lib/rpcrt4/rpc_epmap.c @@ -0,0 +1,247 @@ +/* + * RPC endpoint mapper + * + * Copyright 2002 Greg Turner + * Copyright 2001 Ove K鍁en, TransGaming Technologies + * + * 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: + * - actually do things right + */ + +#include +#include +#include + +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "winreg.h" + +#include "rpc.h" + +#include "wine/debug.h" + +#include "rpc_binding.h" + +WINE_DEFAULT_DEBUG_CHANNEL(ole); + +/* The "real" RPC portmapper endpoints that I know of are: + * + * ncadg_ip_udp: 135 + * ncacn_ip_tcp: 135 + * ncacn_np: \\pipe\epmapper (?) + * ncalrpc: epmapper + * + * If the user's machine ran a DCE RPC daemon, it would + * probably be possible to connect to it, but there are many + * reasons not to, like: + * - the user probably does *not* run one, and probably + * shouldn't be forced to run one just for local COM + * - very few Unix systems use DCE RPC... if they run a RPC + * daemon at all, it's usually Sun RPC + * - DCE RPC registrations are persistent and saved on disk, + * while MS-RPC registrations are documented as non-persistent + * and stored only in RAM, and auto-destroyed when the process + * dies (something DCE RPC can't do) + * + * Of course, if the user *did* want to run a DCE RPC daemon anyway, + * there would be interoperability advantages, like the possibility + * of running a fully functional DCOM server using Wine... + */ + +/*********************************************************************** + * RpcEpRegisterA (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcEpRegisterA( RPC_IF_HANDLE IfSpec, RPC_BINDING_VECTOR *BindingVector, + UUID_VECTOR *UuidVector, unsigned char *Annotation ) +{ + RPCSS_NP_MESSAGE msg; + RPCSS_NP_REPLY reply; + char *vardata_payload, *vp; + PRPC_SERVER_INTERFACE If = (PRPC_SERVER_INTERFACE)IfSpec; + unsigned long c; + RPC_STATUS rslt = RPC_S_OK; + + TRACE("(%p,%p,%p,%s)\n", IfSpec, BindingVector, UuidVector, debugstr_a(Annotation)); + TRACE(" ifid=%s\n", debugstr_guid(&If->InterfaceId.SyntaxGUID)); + for (c=0; cCount; c++) { + RpcBinding* bind = (RpcBinding*)(BindingVector->BindingH[c]); + TRACE(" protseq[%ld]=%s\n", c, debugstr_a(bind->Protseq)); + TRACE(" endpoint[%ld]=%s\n", c, debugstr_a(bind->Endpoint)); + } + if (UuidVector) { + for (c=0; cCount; c++) + TRACE(" obj[%ld]=%s\n", c, debugstr_guid(UuidVector->Uuid[c])); + } + + /* FIXME: Do something with annotation. */ + + /* construct the message to rpcss */ + msg.message_type = RPCSS_NP_MESSAGE_TYPEID_REGISTEREPMSG; + msg.message.registerepmsg.iface = If->InterfaceId; + msg.message.registerepmsg.no_replace = 0; + + msg.message.registerepmsg.object_count = (UuidVector) ? UuidVector->Count : 0; + msg.message.registerepmsg.binding_count = BindingVector->Count; + + /* calculate vardata payload size */ + msg.vardata_payload_size = msg.message.registerepmsg.object_count * sizeof(UUID); + for (c=0; c < msg.message.registerepmsg.binding_count; c++) { + RpcBinding *bind = (RpcBinding *)(BindingVector->BindingH[c]); + msg.vardata_payload_size += strlen(bind->Protseq) + 1; + msg.vardata_payload_size += strlen(bind->Endpoint) + 1; + } + + /* allocate the payload buffer */ + vp = vardata_payload = LocalAlloc(LPTR, msg.vardata_payload_size); + if (!vardata_payload) + return RPC_S_OUT_OF_MEMORY; + + /* populate the payload data */ + for (c=0; c < msg.message.registerepmsg.object_count; c++) { + CopyMemory(vp, UuidVector->Uuid[c], sizeof(UUID)); + vp += sizeof(UUID); + } + + for (c=0; c < msg.message.registerepmsg.binding_count; c++) { + RpcBinding *bind = (RpcBinding*)(BindingVector->BindingH[c]); + unsigned long pslen = strlen(bind->Protseq) + 1, eplen = strlen(bind->Endpoint) + 1; + CopyMemory(vp, bind->Protseq, pslen); + vp += pslen; + CopyMemory(vp, bind->Endpoint, eplen); + vp += eplen; + } + + /* send our request */ + if (!RPCRT4_RPCSSOnDemandCall(&msg, vardata_payload, &reply)) + rslt = RPC_S_OUT_OF_MEMORY; + + /* free the payload buffer */ + LocalFree(vardata_payload); + + return rslt; +} + +/*********************************************************************** + * RpcEpUnregister (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcEpUnregister( RPC_IF_HANDLE IfSpec, RPC_BINDING_VECTOR *BindingVector, + UUID_VECTOR *UuidVector ) +{ + RPCSS_NP_MESSAGE msg; + RPCSS_NP_REPLY reply; + char *vardata_payload, *vp; + PRPC_SERVER_INTERFACE If = (PRPC_SERVER_INTERFACE)IfSpec; + unsigned long c; + RPC_STATUS rslt = RPC_S_OK; + + TRACE("(%p,%p,%p)\n", IfSpec, BindingVector, UuidVector); + TRACE(" ifid=%s\n", debugstr_guid(&If->InterfaceId.SyntaxGUID)); + for (c=0; cCount; c++) { + RpcBinding* bind = (RpcBinding*)(BindingVector->BindingH[c]); + TRACE(" protseq[%ld]=%s\n", c, debugstr_a(bind->Protseq)); + TRACE(" endpoint[%ld]=%s\n", c, debugstr_a(bind->Endpoint)); + } + if (UuidVector) { + for (c=0; cCount; c++) + TRACE(" obj[%ld]=%s\n", c, debugstr_guid(UuidVector->Uuid[c])); + } + + /* construct the message to rpcss */ + msg.message_type = RPCSS_NP_MESSAGE_TYPEID_UNREGISTEREPMSG; + msg.message.unregisterepmsg.iface = If->InterfaceId; + + msg.message.unregisterepmsg.object_count = (UuidVector) ? UuidVector->Count : 0; + msg.message.unregisterepmsg.binding_count = BindingVector->Count; + + /* calculate vardata payload size */ + msg.vardata_payload_size = msg.message.unregisterepmsg.object_count * sizeof(UUID); + for (c=0; c < msg.message.unregisterepmsg.binding_count; c++) { + RpcBinding *bind = (RpcBinding *)(BindingVector->BindingH[c]); + msg.vardata_payload_size += strlen(bind->Protseq) + 1; + msg.vardata_payload_size += strlen(bind->Endpoint) + 1; + } + + /* allocate the payload buffer */ + vp = vardata_payload = LocalAlloc(LPTR, msg.vardata_payload_size); + if (!vardata_payload) + return RPC_S_OUT_OF_MEMORY; + + /* populate the payload data */ + for (c=0; c < msg.message.unregisterepmsg.object_count; c++) { + CopyMemory(vp, UuidVector->Uuid[c], sizeof(UUID)); + vp += sizeof(UUID); + } + + for (c=0; c < msg.message.unregisterepmsg.binding_count; c++) { + RpcBinding *bind = (RpcBinding*)(BindingVector->BindingH[c]); + unsigned long pslen = strlen(bind->Protseq) + 1, eplen = strlen(bind->Endpoint) + 1; + CopyMemory(vp, bind->Protseq, pslen); + vp += pslen; + CopyMemory(vp, bind->Endpoint, eplen); + vp += eplen; + } + + /* send our request */ + if (!RPCRT4_RPCSSOnDemandCall(&msg, vardata_payload, &reply)) + rslt = RPC_S_OUT_OF_MEMORY; + + /* free the payload buffer */ + LocalFree(vardata_payload); + + return rslt; +} + +/*********************************************************************** + * RpcEpResolveBinding (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcEpResolveBinding( RPC_BINDING_HANDLE Binding, RPC_IF_HANDLE IfSpec ) +{ + RPCSS_NP_MESSAGE msg; + RPCSS_NP_REPLY reply; + PRPC_CLIENT_INTERFACE If = (PRPC_CLIENT_INTERFACE)IfSpec; + RpcBinding* bind = (RpcBinding*)Binding; + + TRACE("(%p,%p)\n", Binding, IfSpec); + TRACE(" protseq=%s\n", debugstr_a(bind->Protseq)); + TRACE(" obj=%s\n", debugstr_guid(&bind->ObjectUuid)); + TRACE(" ifid=%s\n", debugstr_guid(&If->InterfaceId.SyntaxGUID)); + + /* FIXME: totally untested */ + + /* just return for fully bound handles */ + if (bind->Endpoint && (bind->Endpoint[0] != '\0')) + return RPC_S_OK; + + /* construct the message to rpcss */ + msg.message_type = RPCSS_NP_MESSAGE_TYPEID_RESOLVEEPMSG; + msg.message.resolveepmsg.iface = If->InterfaceId; + msg.message.resolveepmsg.object = bind->ObjectUuid; + + msg.vardata_payload_size = strlen(bind->Protseq) + 1; + + /* send the message */ + if (!RPCRT4_RPCSSOnDemandCall(&msg, bind->Protseq, &reply)) + return RPC_S_OUT_OF_MEMORY; + + /* empty-string result means not registered */ + if (reply.as_string[0] == '\0') + return EPT_S_NOT_REGISTERED; + + /* otherwise we fully bind the handle & return RPC_S_OK */ + return RPCRT4_ResolveBinding(Binding, reply.as_string); +} diff --git a/reactos/lib/rpcrt4/rpc_message.c b/reactos/lib/rpcrt4/rpc_message.c new file mode 100644 index 00000000000..3a87fcd4e38 --- /dev/null +++ b/reactos/lib/rpcrt4/rpc_message.c @@ -0,0 +1,612 @@ +/* + * RPC messages + * + * Copyright 2001-2002 Ove K鍁en, TransGaming Technologies + * Copyright 2004 Filip Navara + * + * 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: + * - figure out whether we *really* got this right + * - check for errors and throw exceptions + */ + +#include +#include +#include + +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "winreg.h" + +#include "rpc.h" +#include "rpcndr.h" +#include "rpcdcep.h" + +#include "wine/debug.h" + +#include "rpc_binding.h" +#include "rpc_misc.h" +#include "rpc_defs.h" + +WINE_DEFAULT_DEBUG_CHANNEL(ole); + +DWORD RPCRT4_GetHeaderSize(RpcPktHdr *Header) +{ + static const DWORD header_sizes[] = { + sizeof(Header->request), 0, sizeof(Header->response), + sizeof(Header->fault), 0, 0, 0, 0, 0, 0, 0, sizeof(Header->bind), + sizeof(Header->bind_ack), sizeof(Header->bind_nack), + 0, 0, 0, 0, 0 + }; + ULONG ret = 0; + + if (Header->common.ptype < sizeof(header_sizes) / sizeof(header_sizes[0])) { + ret = header_sizes[Header->common.ptype]; + if (ret == 0) + FIXME("unhandled packet type\n"); + if (Header->common.flags & RPC_FLG_OBJECT_UUID) + ret += sizeof(UUID); + } else { + TRACE("invalid packet type\n"); + } + + return ret; +} + +VOID RPCRT4_BuildCommonHeader(RpcPktHdr *Header, unsigned char PacketType, + unsigned long DataRepresentation) +{ + Header->common.rpc_ver = RPC_VER_MAJOR; + Header->common.rpc_ver_minor = RPC_VER_MINOR; + Header->common.ptype = PacketType; + Header->common.drep[0] = LOBYTE(LOWORD(DataRepresentation)); + Header->common.drep[1] = HIBYTE(LOWORD(DataRepresentation)); + Header->common.drep[2] = LOBYTE(HIWORD(DataRepresentation)); + Header->common.drep[3] = HIBYTE(HIWORD(DataRepresentation)); + Header->common.auth_len = 0; + Header->common.call_id = 1; + Header->common.flags = 0; + /* Flags and fragment length are computed in RPCRT4_Send. */ +} + +RpcPktHdr *RPCRT4_BuildRequestHeader(unsigned long DataRepresentation, + unsigned long BufferLength, + unsigned short ProcNum, + UUID *ObjectUuid) +{ + RpcPktHdr *header; + BOOL has_object; + RPC_STATUS status; + + has_object = (ObjectUuid != NULL && !UuidIsNil(ObjectUuid, &status)); + header = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, + sizeof(header->request) + (has_object ? sizeof(UUID) : 0)); + if (header == NULL) { + return NULL; + } + + RPCRT4_BuildCommonHeader(header, PKT_REQUEST, DataRepresentation); + header->common.frag_len = sizeof(header->request); + header->request.alloc_hint = BufferLength; + header->request.context_id = 0; + header->request.opnum = ProcNum; + if (has_object) { + header->common.flags |= RPC_FLG_OBJECT_UUID; + header->common.frag_len += sizeof(UUID); + memcpy(&header->request + 1, ObjectUuid, sizeof(UUID)); + } + + return header; +} + +RpcPktHdr *RPCRT4_BuildResponseHeader(unsigned long DataRepresentation, + unsigned long BufferLength) +{ + RpcPktHdr *header; + + header = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(header->response)); + if (header == NULL) { + return NULL; + } + + RPCRT4_BuildCommonHeader(header, PKT_RESPONSE, DataRepresentation); + header->common.frag_len = sizeof(header->response); + header->response.alloc_hint = BufferLength; + + return header; +} + +RpcPktHdr *RPCRT4_BuildFaultHeader(unsigned long DataRepresentation, + RPC_STATUS Status) +{ + RpcPktHdr *header; + + header = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(header->fault)); + if (header == NULL) { + return NULL; + } + + RPCRT4_BuildCommonHeader(header, PKT_FAULT, DataRepresentation); + header->common.frag_len = sizeof(header->fault); + header->fault.status = Status; + + return header; +} + +RpcPktHdr *RPCRT4_BuildBindHeader(unsigned long DataRepresentation, + unsigned short MaxTransmissionSize, + unsigned short MaxReceiveSize, + RPC_SYNTAX_IDENTIFIER *AbstractId, + RPC_SYNTAX_IDENTIFIER *TransferId) +{ + RpcPktHdr *header; + + header = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(header->bind)); + if (header == NULL) { + return NULL; + } + + RPCRT4_BuildCommonHeader(header, PKT_BIND, DataRepresentation); + header->common.frag_len = sizeof(header->bind); + header->bind.max_tsize = MaxTransmissionSize; + header->bind.max_rsize = MaxReceiveSize; + header->bind.num_elements = 1; + header->bind.num_syntaxes = 1; + memcpy(&header->bind.abstract, AbstractId, sizeof(RPC_SYNTAX_IDENTIFIER)); + memcpy(&header->bind.transfer, TransferId, sizeof(RPC_SYNTAX_IDENTIFIER)); + + return header; +} + +RpcPktHdr *RPCRT4_BuildBindNackHeader(unsigned long DataRepresentation, + unsigned char RpcVersion, + unsigned char RpcVersionMinor) +{ + RpcPktHdr *header; + + header = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(header->bind_nack)); + if (header == NULL) { + return NULL; + } + + RPCRT4_BuildCommonHeader(header, PKT_BIND_NACK, DataRepresentation); + header->common.frag_len = sizeof(header->bind_nack); + header->bind_nack.protocols_count = 1; + header->bind_nack.protocols[0].rpc_ver = RpcVersion; + header->bind_nack.protocols[0].rpc_ver_minor = RpcVersionMinor; + + return header; +} + +RpcPktHdr *RPCRT4_BuildBindAckHeader(unsigned long DataRepresentation, + unsigned short MaxTransmissionSize, + unsigned short MaxReceiveSize, + LPSTR ServerAddress, + unsigned long Result, + unsigned long Reason, + RPC_SYNTAX_IDENTIFIER *TransferId) +{ + RpcPktHdr *header; + unsigned long header_size; + RpcAddressString *server_address; + RpcResults *results; + RPC_SYNTAX_IDENTIFIER *transfer_id; + + header_size = sizeof(header->bind_ack) + sizeof(RpcResults) + + sizeof(RPC_SYNTAX_IDENTIFIER) + sizeof(RpcAddressString) + + strlen(ServerAddress); + + header = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, header_size); + if (header == NULL) { + return NULL; + } + + RPCRT4_BuildCommonHeader(header, PKT_BIND_ACK, DataRepresentation); + header->common.frag_len = header_size; + header->bind_ack.max_tsize = MaxTransmissionSize; + header->bind_ack.max_rsize = MaxReceiveSize; + server_address = (RpcAddressString*)(&header->bind_ack + 1); + server_address->length = strlen(ServerAddress) + 1; + strcpy(server_address->string, ServerAddress); + results = (RpcResults*)((ULONG_PTR)server_address + sizeof(RpcAddressString) + server_address->length - 1); + results->num_results = 1; + results->results[0].result = Result; + results->results[0].reason = Reason; + transfer_id = (RPC_SYNTAX_IDENTIFIER*)(results + 1); + memcpy(transfer_id, TransferId, sizeof(RPC_SYNTAX_IDENTIFIER)); + + return header; +} + +VOID RPCRT4_FreeHeader(RpcPktHdr *Header) +{ + HeapFree(GetProcessHeap(), 0, Header); +} + +/*********************************************************************** + * RPCRT4_Send (internal) + * + * Transmit a packet over connection in acceptable fragments. + */ +RPC_STATUS RPCRT4_Send(RpcConnection *Connection, RpcPktHdr *Header, + void *Buffer, unsigned int BufferLength) +{ + PUCHAR buffer_pos; + DWORD hdr_size, count; + + buffer_pos = Buffer; + /* The packet building functions save the packet header size, so we can use it. */ + hdr_size = Header->common.frag_len; + Header->common.flags |= RPC_FLG_FIRST; + Header->common.flags &= ~RPC_FLG_LAST; + while (!(Header->common.flags & RPC_FLG_LAST)) { + /* decide if we need to split the packet into fragments */ + if ((BufferLength + hdr_size) <= Connection->MaxTransmissionSize) { + Header->common.flags |= RPC_FLG_LAST; + Header->common.frag_len = BufferLength + hdr_size; + } else { + Header->common.frag_len = Connection->MaxTransmissionSize; + buffer_pos += Header->common.frag_len - hdr_size; + BufferLength -= Header->common.frag_len - hdr_size; + } + + /* transmit packet header */ + if (!WriteFile(Connection->conn, Header, hdr_size, &count, NULL)) { + WARN("WriteFile failed with error %ld\n", GetLastError()); + return GetLastError(); + } + + /* fragment consisted of header only and is the last one */ + if (hdr_size == Header->common.frag_len && + Header->common.flags & RPC_FLG_LAST) { + return RPC_S_OK; + } + + /* send the fragment data */ + if (!WriteFile(Connection->conn, buffer_pos, Header->common.frag_len - hdr_size, &count, NULL)) { + WARN("WriteFile failed with error %ld\n", GetLastError()); + return GetLastError(); + } + + Header->common.flags &= ~RPC_FLG_FIRST; + } + + return RPC_S_OK; +} + +/*********************************************************************** + * RPCRT4_Receive (internal) + * + * Receive a packet from connection and merge the fragments. + */ +RPC_STATUS RPCRT4_Receive(RpcConnection *Connection, RpcPktHdr **Header, + PRPC_MESSAGE pMsg) +{ + RPC_STATUS status; + DWORD dwRead, hdr_length; + unsigned short first_flag; + unsigned long data_length; + unsigned long buffer_length; + unsigned char *buffer_ptr; + RpcPktCommonHdr common_hdr; + + *Header = NULL; + + TRACE("(%p, %p, %p)\n", Connection, Header, pMsg); + + /* read packet common header */ + if (!ReadFile(Connection->conn, &common_hdr, sizeof(common_hdr), &dwRead, NULL)) { + if (GetLastError() != ERROR_MORE_DATA) { + WARN("ReadFile failed with error %ld\n", GetLastError()); + status = RPC_S_PROTOCOL_ERROR; + goto fail; + } + } + if (dwRead != sizeof(common_hdr)) { + status = RPC_S_PROTOCOL_ERROR; + goto fail; + } + + /* verify if the header really makes sense */ + if (common_hdr.rpc_ver != RPC_VER_MAJOR || + common_hdr.rpc_ver_minor != RPC_VER_MINOR) { + WARN("unhandled packet version\n"); + status = RPC_S_PROTOCOL_ERROR; + goto fail; + } + + hdr_length = RPCRT4_GetHeaderSize((RpcPktHdr*)&common_hdr); + if (hdr_length == 0) { + status = RPC_S_PROTOCOL_ERROR; + goto fail; + } + + *Header = HeapAlloc(GetProcessHeap(), 0, hdr_length); + memcpy(*Header, &common_hdr, sizeof(common_hdr)); + + /* read the rest of packet header */ + if (!ReadFile(Connection->conn, &(*Header)->common + 1, + hdr_length - sizeof(common_hdr), &dwRead, NULL)) { + if (GetLastError() != ERROR_MORE_DATA) { + WARN("ReadFile failed with error %ld\n", GetLastError()); + status = RPC_S_PROTOCOL_ERROR; + goto fail; + } + } + if (dwRead != hdr_length - sizeof(common_hdr)) { + status = RPC_S_PROTOCOL_ERROR; + goto fail; + } + + /* read packet body */ + switch (common_hdr.ptype) { + case PKT_RESPONSE: + pMsg->BufferLength = (*Header)->response.alloc_hint; + break; + case PKT_REQUEST: + pMsg->BufferLength = (*Header)->request.alloc_hint; + break; + default: + pMsg->BufferLength = common_hdr.frag_len - hdr_length; + } + status = I_RpcGetBuffer(pMsg); + if (status != RPC_S_OK) goto fail; + + first_flag = RPC_FLG_FIRST; + buffer_length = 0; + buffer_ptr = pMsg->Buffer; + while (buffer_length < pMsg->BufferLength) + { + data_length = (*Header)->common.frag_len - hdr_length; + if (((*Header)->common.flags & RPC_FLG_FIRST) != first_flag || + data_length + buffer_length > pMsg->BufferLength) { + TRACE("invalid packet flags or buffer length\n"); + status = RPC_S_PROTOCOL_ERROR; + goto fail; + } + + if (data_length == 0) dwRead = 0; else + if (!ReadFile(Connection->conn, buffer_ptr, data_length, &dwRead, NULL)) { + if (GetLastError() != ERROR_MORE_DATA) { + WARN("ReadFile failed with error %ld\n", GetLastError()); + status = RPC_S_PROTOCOL_ERROR; + goto fail; + } + } + if (dwRead != data_length) { + status = RPC_S_PROTOCOL_ERROR; + goto fail; + } + + if (buffer_length == pMsg->BufferLength && + ((*Header)->common.flags & RPC_FLG_LAST) == 0) { + status = RPC_S_PROTOCOL_ERROR; + goto fail; + } + + buffer_length += data_length; + if (buffer_length < pMsg->BufferLength) { + TRACE("next header\n"); + + /* read the header of next packet */ + if (!ReadFile(Connection->conn, *Header, hdr_length, &dwRead, NULL)) { + if (GetLastError() != ERROR_MORE_DATA) { + WARN("ReadFile failed with error %ld\n", GetLastError()); + status = GetLastError(); + goto fail; + } + } + if (dwRead != hdr_length) { + WARN("invalid packet header size (%ld)\n", dwRead); + status = RPC_S_PROTOCOL_ERROR; + goto fail; + } + + buffer_ptr += data_length; + first_flag = 0; + } + } + + /* success */ + status = RPC_S_OK; + +fail: + if (status != RPC_S_OK && *Header) { + RPCRT4_FreeHeader(*Header); + *Header = NULL; + } + return status; +} + +/*********************************************************************** + * I_RpcGetBuffer [RPCRT4.@] + */ +RPC_STATUS WINAPI I_RpcGetBuffer(PRPC_MESSAGE pMsg) +{ + RpcBinding* bind = (RpcBinding*)pMsg->Handle; + + TRACE("(%p): BufferLength=%d\n", pMsg, pMsg->BufferLength); + /* FIXME: pfnAllocate? */ + if (bind->server) { + /* it turns out that the original buffer data must still be available + * while the RPC server is marshalling a reply, so we should not deallocate + * it, we'll leave deallocating the original buffer to the RPC server */ + pMsg->Buffer = HeapAlloc(GetProcessHeap(), 0, pMsg->BufferLength); + } else { + if (pMsg->Buffer) + HeapFree(GetProcessHeap(), 0, pMsg->Buffer); + pMsg->Buffer = HeapAlloc(GetProcessHeap(), 0, pMsg->BufferLength); + } + TRACE("Buffer=%p\n", pMsg->Buffer); + /* FIXME: which errors to return? */ + return pMsg->Buffer ? S_OK : E_OUTOFMEMORY; +} + +/*********************************************************************** + * I_RpcFreeBuffer [RPCRT4.@] + */ +RPC_STATUS WINAPI I_RpcFreeBuffer(PRPC_MESSAGE pMsg) +{ + TRACE("(%p) Buffer=%p\n", pMsg, pMsg->Buffer); + /* FIXME: pfnFree? */ + if (pMsg->Buffer != NULL) { + HeapFree(GetProcessHeap(), 0, pMsg->Buffer); + } + pMsg->Buffer = NULL; + return S_OK; +} + +/*********************************************************************** + * I_RpcSend [RPCRT4.@] + */ +RPC_STATUS WINAPI I_RpcSend(PRPC_MESSAGE pMsg) +{ + RpcBinding* bind = (RpcBinding*)pMsg->Handle; + RpcConnection* conn; + RPC_CLIENT_INTERFACE* cif = NULL; + RPC_SERVER_INTERFACE* sif = NULL; + RPC_STATUS status; + RpcPktHdr *hdr; + + TRACE("(%p)\n", pMsg); + if (!bind) return RPC_S_INVALID_BINDING; + + if (bind->server) { + sif = pMsg->RpcInterfaceInformation; + if (!sif) return RPC_S_INTERFACE_NOT_FOUND; /* ? */ + status = RPCRT4_OpenBinding(bind, &conn, &sif->TransferSyntax, + &sif->InterfaceId); + } else { + cif = pMsg->RpcInterfaceInformation; + if (!cif) return RPC_S_INTERFACE_NOT_FOUND; /* ? */ + status = RPCRT4_OpenBinding(bind, &conn, &cif->TransferSyntax, + &cif->InterfaceId); + } + + if (status != RPC_S_OK) return status; + + if (bind->server) { + if (pMsg->RpcFlags & WINE_RPCFLAG_EXCEPTION) { + hdr = RPCRT4_BuildFaultHeader(pMsg->DataRepresentation, + RPC_S_CALL_FAILED); + } else { + hdr = RPCRT4_BuildResponseHeader(pMsg->DataRepresentation, + pMsg->BufferLength); + } + } else { + hdr = RPCRT4_BuildRequestHeader(pMsg->DataRepresentation, + pMsg->BufferLength, pMsg->ProcNum, + &bind->ObjectUuid); + } + + status = RPCRT4_Send(conn, hdr, pMsg->Buffer, pMsg->BufferLength); + + RPCRT4_FreeHeader(hdr); + + /* success */ + if (!bind->server) { + /* save the connection, so the response can be read from it */ + pMsg->ReservedForRuntime = conn; + return RPC_S_OK; + } + RPCRT4_CloseBinding(bind, conn); + status = RPC_S_OK; + + return status; +} + +/*********************************************************************** + * I_RpcReceive [RPCRT4.@] + */ +RPC_STATUS WINAPI I_RpcReceive(PRPC_MESSAGE pMsg) +{ + RpcBinding* bind = (RpcBinding*)pMsg->Handle; + RpcConnection* conn; + RPC_CLIENT_INTERFACE* cif = NULL; + RPC_SERVER_INTERFACE* sif = NULL; + RPC_STATUS status; + RpcPktHdr *hdr = NULL; + + TRACE("(%p)\n", pMsg); + if (!bind) return RPC_S_INVALID_BINDING; + + if (pMsg->ReservedForRuntime) { + conn = pMsg->ReservedForRuntime; + pMsg->ReservedForRuntime = NULL; + } else { + if (bind->server) { + sif = pMsg->RpcInterfaceInformation; + if (!sif) return RPC_S_INTERFACE_NOT_FOUND; /* ? */ + status = RPCRT4_OpenBinding(bind, &conn, &sif->TransferSyntax, + &sif->InterfaceId); + } else { + cif = pMsg->RpcInterfaceInformation; + if (!cif) return RPC_S_INTERFACE_NOT_FOUND; /* ? */ + status = RPCRT4_OpenBinding(bind, &conn, &cif->TransferSyntax, + &cif->InterfaceId); + } + if (status != RPC_S_OK) return status; + } + + status = RPCRT4_Receive(conn, &hdr, pMsg); + if (status != RPC_S_OK) { + WARN("receive failed with error %lx\n", status); + goto fail; + } + + status = RPC_S_PROTOCOL_ERROR; + + switch (hdr->common.ptype) { + case PKT_RESPONSE: + if (bind->server) goto fail; + break; + case PKT_REQUEST: + if (!bind->server) goto fail; + break; + case PKT_FAULT: + pMsg->RpcFlags |= WINE_RPCFLAG_EXCEPTION; + ERR ("we got fault packet with status %lx\n", hdr->fault.status); + status = RPC_S_CALL_FAILED; /* ? */ + goto fail; + default: + goto fail; + } + + /* success */ + status = RPC_S_OK; + +fail: + if (hdr) { + RPCRT4_FreeHeader(hdr); + } + RPCRT4_CloseBinding(bind, conn); + return status; +} + +/*********************************************************************** + * I_RpcSendReceive [RPCRT4.@] + */ +RPC_STATUS WINAPI I_RpcSendReceive(PRPC_MESSAGE pMsg) +{ + RPC_STATUS status; + + TRACE("(%p)\n", pMsg); + status = I_RpcSend(pMsg); + if (status == RPC_S_OK) + status = I_RpcReceive(pMsg); + return status; +} diff --git a/reactos/lib/rpcrt4/rpc_message.h b/reactos/lib/rpcrt4/rpc_message.h new file mode 100644 index 00000000000..18a73a9fb0a --- /dev/null +++ b/reactos/lib/rpcrt4/rpc_message.h @@ -0,0 +1,38 @@ +/* + * RPC message API + * + * Copyright 2004 Filip Navara + * + * 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_RPC_MESSAGE_H +#define __WINE_RPC_MESSAGE_H + +#include "wine/rpcss_shared.h" +#include "rpc_defs.h" + +VOID RPCRT4_BuildCommonHeader(RpcPktHdr *Header, unsigned char PacketType, unsigned long DataRepresentation); +RpcPktHdr *RPCRT4_BuildRequestHeader(unsigned long DataRepresentation, unsigned long BufferLength, unsigned short ProcNum, UUID *ObjectUuid); +RpcPktHdr *RPCRT4_BuildResponseHeader(unsigned long DataRepresentation, unsigned long BufferLength); +RpcPktHdr *RPCRT4_BuildFaultHeader(unsigned long DataRepresentation, RPC_STATUS Status); +RpcPktHdr *RPCRT4_BuildBindHeader(unsigned long DataRepresentation, unsigned short MaxTransmissionSize, unsigned short MaxReceiveSize, RPC_SYNTAX_IDENTIFIER *AbstractId, RPC_SYNTAX_IDENTIFIER *TransferId); +RpcPktHdr *RPCRT4_BuildBindNackHeader(unsigned long DataRepresentation, unsigned char RpcVersion, unsigned char RpcVersionMinor); +RpcPktHdr *RPCRT4_BuildBindAckHeader(unsigned long DataRepresentation, unsigned short MaxTransmissionSize, unsigned short MaxReceiveSize, LPSTR ServerAddress, unsigned long Result, unsigned long Reason, RPC_SYNTAX_IDENTIFIER *TransferId); +VOID RPCRT4_FreeHeader(RpcPktHdr *Header); +RPC_STATUS RPCRT4_Send(RpcConnection *Connection, RpcPktHdr *Header, void *Buffer, unsigned int BufferLength); +RPC_STATUS RPCRT4_Receive(RpcConnection *Connection, RpcPktHdr **Header, PRPC_MESSAGE pMsg); + +#endif diff --git a/reactos/lib/rpcrt4/rpc_misc.h b/reactos/lib/rpcrt4/rpc_misc.h new file mode 100644 index 00000000000..49c483e5c4b --- /dev/null +++ b/reactos/lib/rpcrt4/rpc_misc.h @@ -0,0 +1,28 @@ +/* + * RPC definitions + * + * Copyright 2003 Ove K鍁en, TransGaming Technologies + * + * 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_RPC_MISC_H +#define __WINE_RPC_MISC_H + +/* flags for RPC_MESSAGE.RpcFlags */ +#define WINE_RPCFLAG_EXCEPTION 0x0001 + +#endif /* __WINE_RPC_MISC_H */ diff --git a/reactos/lib/rpcrt4/rpc_server.c b/reactos/lib/rpcrt4/rpc_server.c new file mode 100644 index 00000000000..9da860061ec --- /dev/null +++ b/reactos/lib/rpcrt4/rpc_server.c @@ -0,0 +1,1030 @@ +/* + * RPC server API + * + * Copyright 2001 Ove K鍁en, TransGaming Technologies + * Copyright 2004 Filip Navara + * + * 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: + * - a whole lot + */ + +#include "config.h" +#include "wine/port.h" + +#include +#include +#include +#include + +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "winreg.h" +#include "ntstatus.h" + +#include "rpc.h" +#include "rpcndr.h" +#include "excpt.h" + +#include "wine/debug.h" +#include "wine/exception.h" + +#include "rpc_server.h" +#include "rpc_misc.h" +#include "rpc_message.h" +#include "rpc_defs.h" + +#define MAX_THREADS 128 + +WINE_DEFAULT_DEBUG_CHANNEL(ole); + +typedef struct _RpcPacket +{ + struct _RpcPacket* next; + struct _RpcConnection* conn; + RpcPktHdr* hdr; + RPC_MESSAGE* msg; +} RpcPacket; + +typedef struct _RpcObjTypeMap +{ + /* FIXME: a hash table would be better. */ + struct _RpcObjTypeMap *next; + UUID Object; + UUID Type; +} RpcObjTypeMap; + +static RpcObjTypeMap *RpcObjTypeMaps; + +static RpcServerProtseq* protseqs; +static RpcServerInterface* ifs; + +static CRITICAL_SECTION server_cs; +static CRITICAL_SECTION_DEBUG server_cs_debug = +{ + 0, 0, &server_cs, + { &server_cs_debug.ProcessLocksList, &server_cs_debug.ProcessLocksList }, + 0, 0, { 0, (DWORD)(__FILE__ ": server_cs") } +}; +static CRITICAL_SECTION server_cs = { &server_cs_debug, -1, 0, 0, 0, 0 }; + +static CRITICAL_SECTION listen_cs; +static CRITICAL_SECTION_DEBUG listen_cs_debug = +{ + 0, 0, &listen_cs, + { &listen_cs_debug.ProcessLocksList, &listen_cs_debug.ProcessLocksList }, + 0, 0, { 0, (DWORD)(__FILE__ ": listen_cs") } +}; +static CRITICAL_SECTION listen_cs = { &listen_cs_debug, -1, 0, 0, 0, 0 }; + +static BOOL std_listen; +static LONG listen_count = -1; +static HANDLE mgr_event, server_thread; + +static CRITICAL_SECTION spacket_cs; +static CRITICAL_SECTION_DEBUG spacket_cs_debug = +{ + 0, 0, &spacket_cs, + { &spacket_cs_debug.ProcessLocksList, &spacket_cs_debug.ProcessLocksList }, + 0, 0, { 0, (DWORD)(__FILE__ ": spacket_cs") } +}; +static CRITICAL_SECTION spacket_cs = { &spacket_cs_debug, -1, 0, 0, 0, 0 }; + +static RpcPacket* spacket_head; +static RpcPacket* spacket_tail; +static HANDLE server_sem; + +static DWORD worker_count, worker_free, worker_tls; + +static UUID uuid_nil; + +inline static RpcObjTypeMap *LookupObjTypeMap(UUID *ObjUuid) +{ + RpcObjTypeMap *rslt = RpcObjTypeMaps; + RPC_STATUS dummy; + + while (rslt) { + if (! UuidCompare(ObjUuid, &rslt->Object, &dummy)) break; + rslt = rslt->next; + } + + return rslt; +} + +inline static UUID *LookupObjType(UUID *ObjUuid) +{ + RpcObjTypeMap *map = LookupObjTypeMap(ObjUuid); + if (map) + return &map->Type; + else + return &uuid_nil; +} + +static RpcServerInterface* RPCRT4_find_interface(UUID* object, + RPC_SYNTAX_IDENTIFIER* if_id, + BOOL check_object) +{ + UUID* MgrType = NULL; + RpcServerInterface* cif = NULL; + RPC_STATUS status; + + if (check_object) + MgrType = LookupObjType(object); + EnterCriticalSection(&server_cs); + cif = ifs; + while (cif) { + if (!memcmp(if_id, &cif->If->InterfaceId, sizeof(RPC_SYNTAX_IDENTIFIER)) && + (check_object == FALSE || UuidEqual(MgrType, &cif->MgrTypeUuid, &status)) && + (std_listen || (cif->Flags & RPC_IF_AUTOLISTEN))) break; + cif = cif->Next; + } + LeaveCriticalSection(&server_cs); + return cif; +} + +static void RPCRT4_push_packet(RpcPacket* packet) +{ + packet->next = NULL; + EnterCriticalSection(&spacket_cs); + if (spacket_tail) { + spacket_tail->next = packet; + spacket_tail = packet; + } else { + spacket_head = packet; + spacket_tail = packet; + } + LeaveCriticalSection(&spacket_cs); +} + +static RpcPacket* RPCRT4_pop_packet(void) +{ + RpcPacket* packet; + EnterCriticalSection(&spacket_cs); + packet = spacket_head; + if (packet) { + spacket_head = packet->next; + if (!spacket_head) spacket_tail = NULL; + } + LeaveCriticalSection(&spacket_cs); + if (packet) packet->next = NULL; + return packet; +} + +#ifndef __REACTOS__ +typedef struct { + PRPC_MESSAGE msg; + void* buf; +} packet_state; + +static WINE_EXCEPTION_FILTER(rpc_filter) +{ + packet_state* state; + PRPC_MESSAGE msg; + state = TlsGetValue(worker_tls); + msg = state->msg; + if (msg->Buffer != state->buf) I_RpcFreeBuffer(msg); + msg->RpcFlags |= WINE_RPCFLAG_EXCEPTION; + msg->BufferLength = sizeof(DWORD); + I_RpcGetBuffer(msg); + *(DWORD*)msg->Buffer = GetExceptionCode(); + WARN("exception caught with code 0x%08lx = %ld\n", *(DWORD*)msg->Buffer, *(DWORD*)msg->Buffer); + TRACE("returning failure packet\n"); + return EXCEPTION_EXECUTE_HANDLER; +} +#endif + +static void RPCRT4_process_packet(RpcConnection* conn, RpcPktHdr* hdr, RPC_MESSAGE* msg) +{ + RpcServerInterface* sif; + RPC_DISPATCH_FUNCTION func; +#ifndef __REACTOS__ + packet_state state; +#endif + UUID *object_uuid; + RpcPktHdr *response; + void *buf = msg->Buffer; + RPC_STATUS status; + +#ifndef __REACTOS__ + state.msg = msg; + state.buf = buf; + TlsSetValue(worker_tls, &state); +#endif + + switch (hdr->common.ptype) { + case PKT_BIND: + TRACE("got bind packet\n"); + + /* FIXME: do more checks! */ + if (hdr->bind.max_tsize < RPC_MIN_PACKET_SIZE || + !UuidIsNil(&conn->ActiveInterface.SyntaxGUID, &status)) { + sif = NULL; + } else { + sif = RPCRT4_find_interface(NULL, &hdr->bind.abstract, FALSE); + } + if (sif == NULL) { + TRACE("rejecting bind request\n"); + /* Report failure to client. */ + response = RPCRT4_BuildBindNackHeader(NDR_LOCAL_DATA_REPRESENTATION, + RPC_VER_MAJOR, RPC_VER_MINOR); + } else { + TRACE("accepting bind request\n"); + + /* accept. */ + response = RPCRT4_BuildBindAckHeader(NDR_LOCAL_DATA_REPRESENTATION, + RPC_MAX_PACKET_SIZE, + RPC_MAX_PACKET_SIZE, + conn->Endpoint, + RESULT_ACCEPT, NO_REASON, + &sif->If->TransferSyntax); + + /* save the interface for later use */ + conn->ActiveInterface = hdr->bind.abstract; + conn->MaxTransmissionSize = hdr->bind.max_tsize; + } + + if (RPCRT4_Send(conn, response, NULL, 0) != RPC_S_OK) + goto fail; + + break; + + case PKT_REQUEST: + TRACE("got request packet\n"); + + /* fail if the connection isn't bound with an interface */ + if (UuidIsNil(&conn->ActiveInterface.SyntaxGUID, &status)) { + response = RPCRT4_BuildFaultHeader(NDR_LOCAL_DATA_REPRESENTATION, + status); + + RPCRT4_Send(conn, response, NULL, 0); + break; + } + + if (hdr->common.flags & RPC_FLG_OBJECT_UUID) { + object_uuid = (UUID*)(&hdr->request + 1); + } else { + object_uuid = NULL; + } + + sif = RPCRT4_find_interface(object_uuid, &conn->ActiveInterface, TRUE); + msg->RpcInterfaceInformation = sif->If; + /* copy the endpoint vector from sif to msg so that midl-generated code will use it */ + msg->ManagerEpv = sif->MgrEpv; + if (object_uuid != NULL) { + RPCRT4_SetBindingObject(msg->Handle, object_uuid); + } + + /* find dispatch function */ + msg->ProcNum = hdr->request.opnum; + if (sif->Flags & RPC_IF_OLE) { + /* native ole32 always gives us a dispatch table with a single entry + * (I assume that's a wrapper for IRpcStubBuffer::Invoke) */ + func = *sif->If->DispatchTable->DispatchTable; + } else { + if (msg->ProcNum >= sif->If->DispatchTable->DispatchTableCount) { + ERR("invalid procnum\n"); + func = NULL; + } + func = sif->If->DispatchTable->DispatchTable[msg->ProcNum]; + } + + /* put in the drep. FIXME: is this more universally applicable? + perhaps we should move this outward... */ + msg->DataRepresentation = + MAKELONG( MAKEWORD(hdr->common.drep[0], hdr->common.drep[1]), + MAKEWORD(hdr->common.drep[2], hdr->common.drep[3])); + + /* dispatch */ +#ifndef __REACTOS__ + __TRY { + if (func) func(msg); + } __EXCEPT(rpc_filter) { + /* failure packet was created in rpc_filter */ + } __ENDTRY +#else + if (func) func(msg); +#endif + + /* send response packet */ + I_RpcSend(msg); + + msg->RpcInterfaceInformation = NULL; + + break; + + default: + FIXME("unhandled packet type\n"); + break; + } + +fail: + /* clean up */ + if (msg->Buffer == buf) msg->Buffer = NULL; + TRACE("freeing Buffer=%p\n", buf); + HeapFree(GetProcessHeap(), 0, buf); + RPCRT4_DestroyBinding(msg->Handle); + msg->Handle = 0; + I_RpcFreeBuffer(msg); + msg->Buffer = NULL; + RPCRT4_FreeHeader(hdr); +#ifndef __REACTOS__ + TlsSetValue(worker_tls, NULL); +#endif +} + +static DWORD CALLBACK RPCRT4_worker_thread(LPVOID the_arg) +{ + DWORD obj; + RpcPacket* pkt; + + for (;;) { + /* idle timeout after 5s */ + obj = WaitForSingleObject(server_sem, 5000); + if (obj == WAIT_TIMEOUT) { + /* if another idle thread exist, self-destruct */ + if (worker_free > 1) break; + continue; + } + pkt = RPCRT4_pop_packet(); + if (!pkt) continue; + InterlockedDecrement(&worker_free); + for (;;) { + RPCRT4_process_packet(pkt->conn, pkt->hdr, pkt->msg); + HeapFree(GetProcessHeap(), 0, pkt); + /* try to grab another packet here without waiting + * on the semaphore, in case it hits max */ + pkt = RPCRT4_pop_packet(); + if (!pkt) break; + /* decrement semaphore */ + WaitForSingleObject(server_sem, 0); + } + InterlockedIncrement(&worker_free); + } + InterlockedDecrement(&worker_free); + InterlockedDecrement(&worker_count); + return 0; +} + +static void RPCRT4_create_worker_if_needed(void) +{ + if (!worker_free && worker_count < MAX_THREADS) { + HANDLE thread; + InterlockedIncrement(&worker_count); + InterlockedIncrement(&worker_free); + thread = CreateThread(NULL, 0, RPCRT4_worker_thread, NULL, 0, NULL); + if (thread) CloseHandle(thread); + else { + InterlockedDecrement(&worker_free); + InterlockedDecrement(&worker_count); + } + } +} + +static DWORD CALLBACK RPCRT4_io_thread(LPVOID the_arg) +{ + RpcConnection* conn = (RpcConnection*)the_arg; + RpcPktHdr *hdr; + RpcBinding *pbind; + RPC_MESSAGE *msg; + RPC_STATUS status; + RpcPacket *packet; + + TRACE("(%p)\n", conn); + + for (;;) { + msg = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(RPC_MESSAGE)); + + /* create temporary binding for dispatch, it will be freed in + * RPCRT4_process_packet */ + RPCRT4_MakeBinding(&pbind, conn); + msg->Handle = (RPC_BINDING_HANDLE)pbind; + + status = RPCRT4_Receive(conn, &hdr, msg); + if (status != RPC_S_OK) { + WARN("receive failed with error %lx\n", status); + break; + } + +#if 0 + RPCRT4_process_packet(conn, hdr, msg); +#else + packet = HeapAlloc(GetProcessHeap(), 0, sizeof(RpcPacket)); + packet->conn = conn; + packet->hdr = hdr; + packet->msg = msg; + RPCRT4_create_worker_if_needed(); + RPCRT4_push_packet(packet); + ReleaseSemaphore(server_sem, 1, NULL); +#endif + msg = NULL; + } + if (msg) HeapFree(GetProcessHeap(), 0, msg); + RPCRT4_DestroyConnection(conn); + return 0; +} + +static void RPCRT4_new_client(RpcConnection* conn) +{ + HANDLE thread = CreateThread(NULL, 0, RPCRT4_io_thread, conn, 0, NULL); + if (!thread) { + DWORD err = GetLastError(); + ERR("failed to create thread, error=%08lx\n", err); + RPCRT4_DestroyConnection(conn); + } + /* we could set conn->thread, but then we'd have to make the io_thread wait + * for that, otherwise the thread might finish, destroy the connection, and + * free the memory we'd write to before we did, causing crashes and stuff - + * so let's implement that later, when we really need conn->thread */ + + CloseHandle( thread ); +} + +static DWORD CALLBACK RPCRT4_server_thread(LPVOID the_arg) +{ + HANDLE m_event = mgr_event, b_handle; + HANDLE *objs = NULL; + DWORD count, res; + RpcServerProtseq* cps; + RpcConnection* conn; + RpcConnection* cconn; + + TRACE("(the_arg == ^%p)\n", the_arg); + + for (;;) { + EnterCriticalSection(&server_cs); + /* open and count connections */ + count = 1; + cps = protseqs; + while (cps) { + conn = cps->conn; + while (conn) { + RPCRT4_OpenConnection(conn); + if (conn->ovl.hEvent) count++; + conn = conn->Next; + } + cps = cps->Next; + } + /* make array of connections */ + if (objs) + objs = HeapReAlloc(GetProcessHeap(), 0, objs, count*sizeof(HANDLE)); + else + objs = HeapAlloc(GetProcessHeap(), 0, count*sizeof(HANDLE)); + + objs[0] = m_event; + count = 1; + cps = protseqs; + while (cps) { + conn = cps->conn; + while (conn) { + if (conn->ovl.hEvent) objs[count++] = conn->ovl.hEvent; + conn = conn->Next; + } + cps = cps->Next; + } + LeaveCriticalSection(&server_cs); + + /* start waiting */ + res = WaitForMultipleObjects(count, objs, FALSE, INFINITE); + if (res == WAIT_OBJECT_0) { + ResetEvent(m_event); + if (!std_listen) break; + } + else if (res == WAIT_FAILED) { + ERR("wait failed\n"); + } + else { + b_handle = objs[res - WAIT_OBJECT_0]; + /* find which connection got a RPC */ + EnterCriticalSection(&server_cs); + conn = NULL; + cps = protseqs; + while (cps) { + conn = cps->conn; + while (conn) { + if (conn->ovl.hEvent == b_handle) break; + conn = conn->Next; + } + if (conn) break; + cps = cps->Next; + } + cconn = NULL; + if (conn) RPCRT4_SpawnConnection(&cconn, conn); + LeaveCriticalSection(&server_cs); + if (!conn) { + ERR("failed to locate connection for handle %p\n", b_handle); + } + if (cconn) RPCRT4_new_client(cconn); + } + } + HeapFree(GetProcessHeap(), 0, objs); + EnterCriticalSection(&server_cs); + /* close connections */ + cps = protseqs; + while (cps) { + conn = cps->conn; + while (conn) { + RPCRT4_CloseConnection(conn); + conn = conn->Next; + } + cps = cps->Next; + } + LeaveCriticalSection(&server_cs); + return 0; +} + +static void RPCRT4_start_listen(void) +{ + TRACE("\n"); + + EnterCriticalSection(&listen_cs); + if (! ++listen_count) { + if (!mgr_event) mgr_event = CreateEventA(NULL, TRUE, FALSE, NULL); + if (!server_sem) server_sem = CreateSemaphoreA(NULL, 0, MAX_THREADS, NULL); + if (!worker_tls) worker_tls = TlsAlloc(); + std_listen = TRUE; + server_thread = CreateThread(NULL, 0, RPCRT4_server_thread, NULL, 0, NULL); + LeaveCriticalSection(&listen_cs); + } else { + LeaveCriticalSection(&listen_cs); + SetEvent(mgr_event); + } +} + +static void RPCRT4_stop_listen(void) +{ + EnterCriticalSection(&listen_cs); + if (listen_count == -1) + LeaveCriticalSection(&listen_cs); + else if (--listen_count == -1) { + std_listen = FALSE; + LeaveCriticalSection(&listen_cs); + SetEvent(mgr_event); + } else + LeaveCriticalSection(&listen_cs); + assert(listen_count > -2); +} + +static RPC_STATUS RPCRT4_use_protseq(RpcServerProtseq* ps) +{ + RPCRT4_CreateConnection(&ps->conn, TRUE, ps->Protseq, NULL, ps->Endpoint, NULL, NULL); + + EnterCriticalSection(&server_cs); + ps->Next = protseqs; + protseqs = ps; + LeaveCriticalSection(&server_cs); + + if (std_listen) SetEvent(mgr_event); + + return RPC_S_OK; +} + +/*********************************************************************** + * RpcServerInqBindings (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcServerInqBindings( RPC_BINDING_VECTOR** BindingVector ) +{ + RPC_STATUS status; + DWORD count; + RpcServerProtseq* ps; + RpcConnection* conn; + + if (BindingVector) + TRACE("(*BindingVector == ^%p)\n", *BindingVector); + else + ERR("(BindingVector == NULL!!?)\n"); + + EnterCriticalSection(&server_cs); + /* count connections */ + count = 0; + ps = protseqs; + while (ps) { + conn = ps->conn; + while (conn) { + count++; + conn = conn->Next; + } + ps = ps->Next; + } + if (count) { + /* export bindings */ + *BindingVector = HeapAlloc(GetProcessHeap(), 0, + sizeof(RPC_BINDING_VECTOR) + + sizeof(RPC_BINDING_HANDLE)*(count-1)); + (*BindingVector)->Count = count; + count = 0; + ps = protseqs; + while (ps) { + conn = ps->conn; + while (conn) { + RPCRT4_MakeBinding((RpcBinding**)&(*BindingVector)->BindingH[count], + conn); + count++; + conn = conn->Next; + } + ps = ps->Next; + } + status = RPC_S_OK; + } else { + *BindingVector = NULL; + status = RPC_S_NO_BINDINGS; + } + LeaveCriticalSection(&server_cs); + return status; +} + +/*********************************************************************** + * RpcServerUseProtseqEpA (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcServerUseProtseqEpA( unsigned char *Protseq, UINT MaxCalls, unsigned char *Endpoint, LPVOID SecurityDescriptor ) +{ + RPC_POLICY policy; + + TRACE( "(%s,%u,%s,%p)\n", Protseq, MaxCalls, Endpoint, SecurityDescriptor ); + + /* This should provide the default behaviour */ + policy.Length = sizeof( policy ); + policy.EndpointFlags = 0; + policy.NICFlags = 0; + + return RpcServerUseProtseqEpExA( Protseq, MaxCalls, Endpoint, SecurityDescriptor, &policy ); +} + +/*********************************************************************** + * RpcServerUseProtseqEpW (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcServerUseProtseqEpW( LPWSTR Protseq, UINT MaxCalls, LPWSTR Endpoint, LPVOID SecurityDescriptor ) +{ + RPC_POLICY policy; + + TRACE( "(%s,%u,%s,%p)\n", debugstr_w( Protseq ), MaxCalls, debugstr_w( Endpoint ), SecurityDescriptor ); + + /* This should provide the default behaviour */ + policy.Length = sizeof( policy ); + policy.EndpointFlags = 0; + policy.NICFlags = 0; + + return RpcServerUseProtseqEpExW( Protseq, MaxCalls, Endpoint, SecurityDescriptor, &policy ); +} + +/*********************************************************************** + * RpcServerUseProtseqEpExA (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcServerUseProtseqEpExA( unsigned char *Protseq, UINT MaxCalls, unsigned char *Endpoint, LPVOID SecurityDescriptor, + PRPC_POLICY lpPolicy ) +{ + RpcServerProtseq* ps; + + TRACE("(%s,%u,%s,%p,{%u,%lu,%lu})\n", debugstr_a( Protseq ), MaxCalls, + debugstr_a( Endpoint ), SecurityDescriptor, + lpPolicy->Length, lpPolicy->EndpointFlags, lpPolicy->NICFlags ); + + ps = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(RpcServerProtseq)); + ps->MaxCalls = MaxCalls; + ps->Protseq = RPCRT4_strdupA(Protseq); + ps->Endpoint = RPCRT4_strdupA(Endpoint); + + return RPCRT4_use_protseq(ps); +} + +/*********************************************************************** + * RpcServerUseProtseqEpExW (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcServerUseProtseqEpExW( LPWSTR Protseq, UINT MaxCalls, LPWSTR Endpoint, LPVOID SecurityDescriptor, + PRPC_POLICY lpPolicy ) +{ + RpcServerProtseq* ps; + + TRACE("(%s,%u,%s,%p,{%u,%lu,%lu})\n", debugstr_w( Protseq ), MaxCalls, + debugstr_w( Endpoint ), SecurityDescriptor, + lpPolicy->Length, lpPolicy->EndpointFlags, lpPolicy->NICFlags ); + + ps = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(RpcServerProtseq)); + ps->MaxCalls = MaxCalls; + ps->Protseq = RPCRT4_strdupWtoA(Protseq); + ps->Endpoint = RPCRT4_strdupWtoA(Endpoint); + + return RPCRT4_use_protseq(ps); +} + +/*********************************************************************** + * RpcServerUseProtseqA (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcServerUseProtseqA(unsigned char *Protseq, unsigned int MaxCalls, void *SecurityDescriptor) +{ + TRACE("(Protseq == %s, MaxCalls == %d, SecurityDescriptor == ^%p)\n", debugstr_a(Protseq), MaxCalls, SecurityDescriptor); + return RpcServerUseProtseqEpA(Protseq, MaxCalls, NULL, SecurityDescriptor); +} + +/*********************************************************************** + * RpcServerUseProtseqW (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcServerUseProtseqW(LPWSTR Protseq, unsigned int MaxCalls, void *SecurityDescriptor) +{ + TRACE("Protseq == %s, MaxCalls == %d, SecurityDescriptor == ^%p)\n", debugstr_w(Protseq), MaxCalls, SecurityDescriptor); + return RpcServerUseProtseqEpW(Protseq, MaxCalls, NULL, SecurityDescriptor); +} + +/*********************************************************************** + * RpcServerRegisterIf (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcServerRegisterIf( RPC_IF_HANDLE IfSpec, UUID* MgrTypeUuid, RPC_MGR_EPV* MgrEpv ) +{ + TRACE("(%p,%s,%p)\n", IfSpec, debugstr_guid(MgrTypeUuid), MgrEpv); + return RpcServerRegisterIf2( IfSpec, MgrTypeUuid, MgrEpv, 0, RPC_C_LISTEN_MAX_CALLS_DEFAULT, (UINT)-1, NULL ); +} + +/*********************************************************************** + * RpcServerRegisterIfEx (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcServerRegisterIfEx( RPC_IF_HANDLE IfSpec, UUID* MgrTypeUuid, RPC_MGR_EPV* MgrEpv, + UINT Flags, UINT MaxCalls, RPC_IF_CALLBACK_FN* IfCallbackFn ) +{ + TRACE("(%p,%s,%p,%u,%u,%p)\n", IfSpec, debugstr_guid(MgrTypeUuid), MgrEpv, Flags, MaxCalls, IfCallbackFn); + return RpcServerRegisterIf2( IfSpec, MgrTypeUuid, MgrEpv, Flags, MaxCalls, (UINT)-1, IfCallbackFn ); +} + +/*********************************************************************** + * RpcServerRegisterIf2 (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcServerRegisterIf2( RPC_IF_HANDLE IfSpec, UUID* MgrTypeUuid, RPC_MGR_EPV* MgrEpv, + UINT Flags, UINT MaxCalls, UINT MaxRpcSize, RPC_IF_CALLBACK_FN* IfCallbackFn ) +{ + PRPC_SERVER_INTERFACE If = (PRPC_SERVER_INTERFACE)IfSpec; + RpcServerInterface* sif; + int i; + + TRACE("(%p,%s,%p,%u,%u,%u,%p)\n", IfSpec, debugstr_guid(MgrTypeUuid), MgrEpv, Flags, MaxCalls, + MaxRpcSize, IfCallbackFn); + TRACE(" interface id: %s %d.%d\n", debugstr_guid(&If->InterfaceId.SyntaxGUID), + If->InterfaceId.SyntaxVersion.MajorVersion, + If->InterfaceId.SyntaxVersion.MinorVersion); + TRACE(" transfer syntax: %s %d.%d\n", debugstr_guid(&If->TransferSyntax.SyntaxGUID), + If->TransferSyntax.SyntaxVersion.MajorVersion, + If->TransferSyntax.SyntaxVersion.MinorVersion); + TRACE(" dispatch table: %p\n", If->DispatchTable); + if (If->DispatchTable) { + TRACE(" dispatch table count: %d\n", If->DispatchTable->DispatchTableCount); + for (i=0; iDispatchTable->DispatchTableCount; i++) { + TRACE(" entry %d: %p\n", i, If->DispatchTable->DispatchTable[i]); + } + TRACE(" reserved: %ld\n", If->DispatchTable->Reserved); + } + TRACE(" protseq endpoint count: %d\n", If->RpcProtseqEndpointCount); + TRACE(" default manager epv: %p\n", If->DefaultManagerEpv); + TRACE(" interpreter info: %p\n", If->InterpreterInfo); + + sif = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(RpcServerInterface)); + sif->If = If; + if (MgrTypeUuid) { + memcpy(&sif->MgrTypeUuid, MgrTypeUuid, sizeof(UUID)); + sif->MgrEpv = MgrEpv; + } else { + memset(&sif->MgrTypeUuid, 0, sizeof(UUID)); + sif->MgrEpv = If->DefaultManagerEpv; + } + sif->Flags = Flags; + sif->MaxCalls = MaxCalls; + sif->MaxRpcSize = MaxRpcSize; + sif->IfCallbackFn = IfCallbackFn; + + EnterCriticalSection(&server_cs); + sif->Next = ifs; + ifs = sif; + LeaveCriticalSection(&server_cs); + + if (sif->Flags & RPC_IF_AUTOLISTEN) { + /* well, start listening, I think... */ + RPCRT4_start_listen(); + } + + return RPC_S_OK; +} + +/*********************************************************************** + * RpcServerUnregisterIf (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcServerUnregisterIf( RPC_IF_HANDLE IfSpec, UUID* MgrTypeUuid, UINT WaitForCallsToComplete ) +{ + FIXME("(IfSpec == (RPC_IF_HANDLE)^%p, MgrTypeUuid == %s, WaitForCallsToComplete == %u): stub\n", + IfSpec, debugstr_guid(MgrTypeUuid), WaitForCallsToComplete); + + return RPC_S_OK; +} + +/*********************************************************************** + * RpcServerUnregisterIfEx (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcServerUnregisterIfEx( RPC_IF_HANDLE IfSpec, UUID* MgrTypeUuid, int RundownContextHandles ) +{ + FIXME("(IfSpec == (RPC_IF_HANDLE)^%p, MgrTypeUuid == %s, RundownContextHandles == %d): stub\n", + IfSpec, debugstr_guid(MgrTypeUuid), RundownContextHandles); + + return RPC_S_OK; +} + +/*********************************************************************** + * RpcObjectSetType (RPCRT4.@) + * + * PARAMS + * ObjUuid [I] "Object" UUID + * TypeUuid [I] "Type" UUID + * + * RETURNS + * RPC_S_OK The call succeeded + * RPC_S_INVALID_OBJECT The provided object (nil) is not valid + * RPC_S_ALREADY_REGISTERED The provided object is already registered + * + * Maps "Object" UUIDs to "Type" UUID's. Passing the nil UUID as the type + * resets the mapping for the specified object UUID to nil (the default). + * The nil object is always associated with the nil type and cannot be + * reassigned. Servers can support multiple implementations on the same + * interface by registering different end-point vectors for the different + * types. There's no need to call this if a server only supports the nil + * type, as is typical. + */ +RPC_STATUS WINAPI RpcObjectSetType( UUID* ObjUuid, UUID* TypeUuid ) +{ + RpcObjTypeMap *map = RpcObjTypeMaps, *prev = NULL; + RPC_STATUS dummy; + + TRACE("(ObjUUID == %s, TypeUuid == %s).\n", debugstr_guid(ObjUuid), debugstr_guid(TypeUuid)); + if ((! ObjUuid) || UuidIsNil(ObjUuid, &dummy)) { + /* nil uuid cannot be remapped */ + return RPC_S_INVALID_OBJECT; + } + + /* find the mapping for this object if there is one ... */ + while (map) { + if (! UuidCompare(ObjUuid, &map->Object, &dummy)) break; + prev = map; + map = map->next; + } + if ((! TypeUuid) || UuidIsNil(TypeUuid, &dummy)) { + /* ... and drop it from the list */ + if (map) { + if (prev) + prev->next = map->next; + else + RpcObjTypeMaps = map->next; + HeapFree(GetProcessHeap(), 0, map); + } + } else { + /* ... , fail if we found it ... */ + if (map) + return RPC_S_ALREADY_REGISTERED; + /* ... otherwise create a new one and add it in. */ + map = HeapAlloc(GetProcessHeap(), 0, sizeof(RpcObjTypeMap)); + memcpy(&map->Object, ObjUuid, sizeof(UUID)); + memcpy(&map->Type, TypeUuid, sizeof(UUID)); + map->next = NULL; + if (prev) + prev->next = map; /* prev is the last map in the linklist */ + else + RpcObjTypeMaps = map; + } + + return RPC_S_OK; +} + +/*********************************************************************** + * RpcServerRegisterAuthInfoA (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcServerRegisterAuthInfoA( unsigned char *ServerPrincName, ULONG AuthnSvc, RPC_AUTH_KEY_RETRIEVAL_FN GetKeyFn, + LPVOID Arg ) +{ + FIXME( "(%s,%lu,%p,%p): stub\n", ServerPrincName, AuthnSvc, GetKeyFn, Arg ); + + return RPC_S_UNKNOWN_AUTHN_SERVICE; /* We don't know any authentication services */ +} + +/*********************************************************************** + * RpcServerRegisterAuthInfoW (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcServerRegisterAuthInfoW( LPWSTR ServerPrincName, ULONG AuthnSvc, RPC_AUTH_KEY_RETRIEVAL_FN GetKeyFn, + LPVOID Arg ) +{ + FIXME( "(%s,%lu,%p,%p): stub\n", debugstr_w( ServerPrincName ), AuthnSvc, GetKeyFn, Arg ); + + return RPC_S_UNKNOWN_AUTHN_SERVICE; /* We don't know any authentication services */ +} + +/*********************************************************************** + * RpcServerListen (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcServerListen( UINT MinimumCallThreads, UINT MaxCalls, UINT DontWait ) +{ + TRACE("(%u,%u,%u)\n", MinimumCallThreads, MaxCalls, DontWait); + + if (!protseqs) + return RPC_S_NO_PROTSEQS_REGISTERED; + + EnterCriticalSection(&listen_cs); + + if (std_listen) { + LeaveCriticalSection(&listen_cs); + return RPC_S_ALREADY_LISTENING; + } + + RPCRT4_start_listen(); + + LeaveCriticalSection(&listen_cs); + + if (DontWait) return RPC_S_OK; + + return RpcMgmtWaitServerListen(); +} + +/*********************************************************************** + * RpcMgmtServerWaitListen (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcMgmtWaitServerListen( void ) +{ + RPC_STATUS rslt = RPC_S_OK; + + TRACE("\n"); + + EnterCriticalSection(&listen_cs); + + if (!std_listen) + if ( (rslt = RpcServerListen(1, 0, TRUE)) != RPC_S_OK ) { + LeaveCriticalSection(&listen_cs); + return rslt; + } + + LeaveCriticalSection(&listen_cs); + + while (std_listen) { + WaitForSingleObject(mgr_event, INFINITE); + if (!std_listen) { + Sleep(100); /* don't spin violently */ + TRACE("spinning.\n"); + } + } + + return rslt; +} + +/*********************************************************************** + * RpcMgmtStopServerListening (RPCRT4.@) + */ +RPC_STATUS WINAPI RpcMgmtStopServerListening ( RPC_BINDING_HANDLE Binding ) +{ + TRACE("(Binding == (RPC_BINDING_HANDLE)^%p)\n", Binding); + + if (Binding) { + FIXME("client-side invocation not implemented.\n"); + return RPC_S_WRONG_KIND_OF_BINDING; + } + + /* hmm... */ + EnterCriticalSection(&listen_cs); + while (std_listen) + RPCRT4_stop_listen(); + LeaveCriticalSection(&listen_cs); + + return RPC_S_OK; +} + +/*********************************************************************** + * I_RpcServerStartListening (RPCRT4.@) + */ +RPC_STATUS WINAPI I_RpcServerStartListening( void* hWnd ) +{ + FIXME( "(%p): stub\n", hWnd ); + + return RPC_S_OK; +} + +/*********************************************************************** + * I_RpcServerStopListening (RPCRT4.@) + */ +RPC_STATUS WINAPI I_RpcServerStopListening( void ) +{ + FIXME( "(): stub\n" ); + + return RPC_S_OK; +} + +/*********************************************************************** + * I_RpcWindowProc (RPCRT4.@) + */ +UINT WINAPI I_RpcWindowProc( void *hWnd, UINT Message, UINT wParam, ULONG lParam ) +{ + FIXME( "(%p,%08x,%08x,%08lx): stub\n", hWnd, Message, wParam, lParam ); + + return 0; +} diff --git a/reactos/lib/rpcrt4/rpc_server.h b/reactos/lib/rpcrt4/rpc_server.h new file mode 100644 index 00000000000..1f43de8d024 --- /dev/null +++ b/reactos/lib/rpcrt4/rpc_server.h @@ -0,0 +1,47 @@ +/* + * RPC server API + * + * Copyright 2001 Ove K鍁en, TransGaming Technologies + * + * 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_RPC_SERVER_H +#define __WINE_RPC_SERVER_H + +#include "rpc_binding.h" + +typedef struct _RpcServerProtseq +{ + struct _RpcServerProtseq* Next; + LPSTR Protseq; + LPSTR Endpoint; + UINT MaxCalls; + RpcConnection* conn; +} RpcServerProtseq; + +typedef struct _RpcServerInterface +{ + struct _RpcServerInterface* Next; + RPC_SERVER_INTERFACE* If; + UUID MgrTypeUuid; + RPC_MGR_EPV* MgrEpv; + UINT Flags; + UINT MaxCalls; + UINT MaxRpcSize; + RPC_IF_CALLBACK_FN* IfCallbackFn; +} RpcServerInterface; + +#endif /* __WINE_RPC_SERVER_H */ diff --git a/reactos/lib/rpcrt4/rpcrt4.spec b/reactos/lib/rpcrt4/rpcrt4.spec new file mode 100644 index 00000000000..f22e49b5dd9 --- /dev/null +++ b/reactos/lib/rpcrt4/rpcrt4.spec @@ -0,0 +1,581 @@ +@ stub DceErrorInqTextA +@ stub DceErrorInqTextW +@ stdcall -private DllRegisterServer() RPCRT4_DllRegisterServer + +@ stub MesBufferHandleReset +@ stub MesDecodeBufferHandleCreate +@ stub MesDecodeIncrementalHandleCreate +@ stub MesEncodeDynBufferHandleCreate +@ stub MesEncodeFixedBufferHandleCreate +@ stub MesEncodeIncrementalHandleCreate +@ stub MesHandleFree +@ stub MesIncrementalHandleReset +@ stub MesInqProcEncodingId + +@ stub MqGetContext # win9x +@ stub MqRegisterQueue # win9x + +@ stub RpcAbortAsyncCall +@ stub RpcAsyncAbortCall +@ stub RpcAsyncCancelCall +@ stub RpcAsyncCompleteCall +@ stub RpcAsyncGetCallStatus +@ stub RpcAsyncInitializeHandle +@ stub RpcAsyncRegisterInfo +@ stub RpcBindingCopy +@ stdcall RpcBindingFree(ptr) +@ stdcall RpcBindingFromStringBindingA(str ptr) +@ stdcall RpcBindingFromStringBindingW(wstr ptr) +@ stub RpcBindingInqAuthClientA +@ stub RpcBindingInqAuthClientW +@ stub RpcBindingInqAuthClientExA +@ stub RpcBindingInqAuthClientExW +@ stub RpcBindingInqAuthInfoA +@ stub RpcBindingInqAuthInfoW +@ stub RpcBindingInqAuthInfoExA +@ stub RpcBindingInqAuthInfoExW +@ stdcall RpcBindingInqObject(ptr ptr) +@ stub RpcBindingInqOption +@ stub RpcBindingReset +@ stub RpcBindingServerFromClient +@ stub RpcBindingSetAuthInfoA +@ stub RpcBindingSetAuthInfoW +@ stub RpcBindingSetAuthInfoExA +@ stub RpcBindingSetAuthInfoExW +@ stdcall RpcBindingSetObject(ptr ptr) +@ stub RpcBindingSetOption +@ stdcall RpcBindingToStringBindingA(ptr ptr) +@ stdcall RpcBindingToStringBindingW(ptr ptr) +@ stdcall RpcBindingVectorFree(ptr) +@ stub RpcCancelAsyncCall +@ stub RpcCancelThread +@ stub RpcCancelThreadEx +@ stub RpcCertGeneratePrincipalNameA +@ stub RpcCertGeneratePrincipalNameW +@ stub RpcCompleteAsyncCall +@ stdcall RpcEpRegisterA(ptr ptr ptr str) +@ stub RpcEpRegisterW +@ stub RpcEpRegisterNoReplaceA +@ stub RpcEpRegisterNoReplaceW +@ stdcall RpcEpResolveBinding(ptr ptr) +@ stdcall RpcEpUnregister(ptr ptr ptr) +@ stub RpcErrorAddRecord # wxp +@ stub RpcErrorClearInformation # wxp +@ stub RpcErrorEndEnumeration # wxp +@ stub RpcErrorGetNextRecord # wxp +@ stub RpcErrorNumberOfRecords # wxp +@ stub RpcErrorLoadErrorInfo # wxp +@ stub RpcErrorResetEnumeration # wxp +@ stub RpcErrorSaveErrorInfo # wxp +@ stub RpcErrorStartEnumeration # wxp +@ stub RpcFreeAuthorizationContext # wxp +@ stub RpcGetAsyncCallStatus +@ stub RpcIfIdVectorFree +@ stub RpcIfInqId +@ stub RpcImpersonateClient +@ stub RpcInitializeAsyncHandle +@ stub RpcMgmtBindingInqParameter # win9x +@ stub RpcMgmtBindingSetParameter # win9x +@ stub RpcMgmtEnableIdleCleanup +@ stub RpcMgmtEpEltInqBegin +@ stub RpcMgmtEpEltInqDone +@ stub RpcMgmtEpEltInqNextA +@ stub RpcMgmtEpEltInqNextW +@ stub RpcMgmtEpUnregister +@ stub RpcMgmtInqComTimeout +@ stub RpcMgmtInqDefaultProtectLevel +@ stub RpcMgmtInqIfIds +@ stub RpcMgmtInqParameter # win9x +@ stub RpcMgmtInqServerPrincNameA +@ stub RpcMgmtInqServerPrincNameW +@ stub RpcMgmtInqStats +@ stub RpcMgmtIsServerListening +@ stub RpcMgmtSetAuthorizationFn +@ stub RpcMgmtSetCancelTimeout +@ stub RpcMgmtSetComTimeout +@ stub RpcMgmtSetParameter # win9x +@ stub RpcMgmtSetServerStackSize +@ stub RpcMgmtStatsVectorFree +@ stdcall RpcMgmtStopServerListening(ptr) +@ stdcall RpcMgmtWaitServerListen() +@ stub RpcNetworkInqProtseqsA +@ stub RpcNetworkInqProtseqsW +@ stdcall RpcNetworkIsProtseqValidA(ptr) +@ stdcall RpcNetworkIsProtseqValidW(ptr) +@ stub RpcNsBindingInqEntryNameA +@ stub RpcNsBindingInqEntryNameW +@ stub RpcObjectInqType +@ stub RpcObjectSetInqFn +@ stdcall RpcObjectSetType(ptr ptr) +@ stub RpcProtseqVectorFreeA +@ stub RpcProtseqVectorFreeW +@ stdcall RpcRaiseException(long) +@ stub RpcRegisterAsyncInfo +@ stub RpcRevertToSelf +@ stub RpcRevertToSelfEx +@ stdcall RpcServerInqBindings(ptr) +@ stub RpcServerInqCallAttributesA # wxp +@ stub RpcServerInqCallAttributesW # wxp +@ stub RpcServerInqDefaultPrincNameA +@ stub RpcServerInqDefaultPrincNameW +@ stub RpcServerInqIf +@ stdcall RpcServerListen(long long long) +@ stdcall RpcServerRegisterAuthInfoA(str long ptr ptr) +@ stdcall RpcServerRegisterAuthInfoW(wstr long ptr ptr) +@ stdcall RpcServerRegisterIf(ptr ptr ptr) +@ stdcall RpcServerRegisterIfEx(ptr ptr ptr long long ptr) +@ stdcall RpcServerRegisterIf2(ptr ptr ptr long long long ptr) +@ stub RpcServerTestCancel +@ stdcall RpcServerUnregisterIf(ptr ptr long) +@ stdcall RpcServerUnregisterIfEx(ptr ptr long) +@ stub RpcServerUseAllProtseqs +@ stub RpcServerUseAllProtseqsEx +@ stub RpcServerUseAllProtseqsIf +@ stub RpcServerUseAllProtseqsIfEx +@ stdcall RpcServerUseProtseqA(str long ptr) +@ stdcall RpcServerUseProtseqW(wstr long ptr) +@ stub RpcServerUseProtseqExA +@ stub RpcServerUseProtseqExW +@ stdcall RpcServerUseProtseqEpA(str long str ptr) +@ stdcall RpcServerUseProtseqEpW(wstr long wstr ptr) +@ stdcall RpcServerUseProtseqEpExA(str long str ptr ptr) +@ stdcall RpcServerUseProtseqEpExW(wstr long wstr ptr ptr) +@ stub RpcServerUseProtseqIfA +@ stub RpcServerUseProtseqIfW +@ stub RpcServerUseProtseqIfExA +@ stub RpcServerUseProtseqIfExW +@ stub RpcServerYield +@ stub RpcSmAllocate +@ stub RpcSmClientFree +@ stub RpcSmDestroyClientContext +@ stub RpcSmDisableAllocate +@ stub RpcSmEnableAllocate +@ stub RpcSmFree +@ stub RpcSmGetThreadHandle +@ stub RpcSmSetClientAllocFree +@ stub RpcSmSetThreadHandle +@ stub RpcSmSwapClientAllocFree +@ stub RpcSsAllocate +@ stub RpcSsContextLockExclusive # wxp +@ stub RpcSsContextLockShared # wxp +@ stub RpcSsDestroyClientContext +@ stub RpcSsDisableAllocate +@ stub RpcSsDontSerializeContext +@ stub RpcSsEnableAllocate +@ stub RpcSsFree +@ stub RpcSsGetContextBinding +@ stub RpcSsGetThreadHandle +@ stub RpcSsSetClientAllocFree +@ stub RpcSsSetThreadHandle +@ stub RpcSsSwapClientAllocFree +@ stdcall RpcStringBindingComposeA(str str str str str ptr) +@ stdcall RpcStringBindingComposeW(wstr wstr wstr wstr wstr ptr) +@ stdcall RpcStringBindingParseA(str ptr ptr ptr ptr ptr) +@ stdcall RpcStringBindingParseW(wstr ptr ptr ptr ptr ptr) +@ stdcall RpcStringFreeA(ptr) +@ stdcall RpcStringFreeW(ptr) +@ stub RpcTestCancel +@ stub RpcUserFree # wxp + +@ stub TowerConstruct +@ stub TowerExplode + +@ stub SimpleTypeAlignment # wxp +@ stub SimpleTypeBufferSize # wxp +@ stub SimpleTypeMemorySize # wxp + +@ stub pfnFreeRoutines # wxp +@ stub pfnMarshallRouteines # wxp +@ stub pfnSizeRoutines # wxp +@ stub pfnUnmarshallRouteines # wxp + +@ stdcall UuidCompare(ptr ptr ptr) +@ stdcall UuidCreate(ptr) +@ stdcall UuidCreateSequential(ptr) # win 2000 +@ stdcall UuidCreateNil(ptr) +@ stdcall UuidEqual(ptr ptr ptr) +@ stdcall UuidFromStringA(str ptr) +@ stdcall UuidFromStringW(wstr ptr) +@ stdcall UuidHash(ptr ptr) +@ stdcall UuidIsNil(ptr ptr) +@ stdcall UuidToStringA(ptr ptr) +@ stdcall UuidToStringW(ptr ptr) + +@ stdcall CStdStubBuffer_QueryInterface(ptr ptr ptr) +@ stdcall CStdStubBuffer_AddRef(ptr) +@ stdcall CStdStubBuffer_Connect(ptr ptr) +@ stdcall CStdStubBuffer_Disconnect(ptr) +@ stdcall CStdStubBuffer_Invoke(ptr ptr ptr) +@ stdcall CStdStubBuffer_IsIIDSupported(ptr ptr) +@ stdcall CStdStubBuffer_CountRefs(ptr) +@ stdcall CStdStubBuffer_DebugServerQueryInterface(ptr ptr) +@ stdcall CStdStubBuffer_DebugServerRelease(ptr ptr) +@ stdcall NdrCStdStubBuffer_Release(ptr ptr) +@ stub NdrCStdStubBuffer2_Release + +@ stdcall IUnknown_QueryInterface_Proxy(ptr ptr ptr) +@ stdcall IUnknown_AddRef_Proxy(ptr) +@ stdcall IUnknown_Release_Proxy(ptr) + +@ stdcall NdrDllCanUnloadNow(ptr) +@ stdcall NdrDllGetClassObject(ptr ptr ptr ptr ptr ptr) +@ stdcall NdrDllRegisterProxy(long ptr ptr) +@ stdcall NdrDllUnregisterProxy(long ptr ptr) + +@ stdcall NdrAllocate(ptr long) +@ stub NdrAsyncClientCall +@ stub NdrAsyncServerCall +@ stdcall NdrClearOutParameters(ptr ptr ptr) +@ stub NdrClientCall +@ varargs NdrClientCall2(ptr ptr) +@ stub NdrClientInitialize +@ stdcall NdrClientInitializeNew(ptr ptr ptr long) +@ stub NdrContextHandleInitialize +@ stub NdrContextHandleSize +@ stdcall NdrConvert(ptr ptr) +@ stdcall NdrConvert2(ptr ptr long) +@ stub NdrCorrelationFree +@ stub NdrCorrelationInitialize +@ stub NdrCorrelationPass +@ stub CreateServerInterfaceFromStub # wxp +@ stub NdrDcomAsyncClientCall +@ stub NdrDcomAsyncStubCall +@ stdcall NdrFreeBuffer(ptr) +@ stub NdrFullPointerFree +@ stub NdrFullPointerInsertRefId +@ stub NdrFullPointerQueryPointer +@ stub NdrFullPointerQueryRefId +@ stub NdrFullPointerXlatFree +@ stub NdrFullPointerXlatInit +@ stdcall NdrGetBuffer(ptr long ptr) +@ stub NdrGetDcomProtocolVersion +@ stub NdrGetSimpleTypeBufferAlignment # wxp +@ stub NdrGetSimpleTypeBufferSize # wxp +@ stub NdrGetSimpleTypeMemorySize # wxp +@ stub NdrGetTypeFlags # wxp +@ stub NdrGetPartialBuffer +@ stub NdrGetPipeBuffer +@ stub NdrGetUserMarshallInfo +@ stub NdrIsAppDoneWithPipes +@ stub NdrMapCommAndFaultStatus +@ stub NdrMarkNextActivePipe +@ stub NdrMesProcEncodeDecode +@ stub NdrMesProcEncodeDecode2 +@ stub NdrMesSimpleTypeAlignSize +@ stub NdrMesSimpleTypeDecode +@ stub NdrMesSimpleTypeEncode +@ stub NdrMesTypeAlignSize +@ stub NdrMesTypeAlignSize2 +@ stub NdrMesTypeDecode +@ stub NdrMesTypeDecode2 +@ stub NdrMesTypeEncode +@ stub NdrMesTypeEncode2 +@ stub NdrMesTypeFree2 +@ stub NdrNsGetBuffer +@ stub NdrNsSendReceive +@ stdcall NdrOleAllocate(long) +@ stdcall NdrOleFree(ptr) +@ stub NdrOutInit # wxp +@ stub NdrPartialIgnoreClientBufferSize # wxp +@ stub NdrPartialIgnoreClientMarshall # wxp +@ stub NdrPartialIgnoreServerInitialize # wxp +@ stub NdrPartialIgnoreServerUnmarshall # wxp +@ stub NdrPipePull +@ stub NdrPipePush +@ stub NdrPipeSendReceive +@ stub NdrPipesDone +@ stub NdrPipesInitialize +@ stdcall NdrProxyErrorHandler(long) +@ stdcall NdrProxyFreeBuffer(ptr ptr) +@ stdcall NdrProxyGetBuffer(ptr ptr) +@ stdcall NdrProxyInitialize(ptr ptr ptr ptr long) +@ stdcall NdrProxySendReceive(ptr ptr) +@ stub NdrRangeUnmarshall +@ stub NdrRpcSmClientAllocate +@ stub NdrRpcSmClientFree +@ stub NdrRpcSmSetClientToOsf +@ stub NdrRpcSsDefaultAllocate +@ stub NdrRpcSsDefaultFree +@ stub NdrRpcSsDisableAllocate +@ stub NdrRpcSsEnableAllocate +@ stdcall NdrSendReceive(ptr ptr) +@ stub NdrServerCall +@ stub NdrServerCall2 +@ stub NdrStubCall +@ stub NdrStubCall2 +@ stub NdrStubForwardingFunction +@ stdcall NdrStubGetBuffer(ptr ptr ptr) +@ stdcall NdrStubInitialize(ptr ptr ptr ptr) +@ stub NdrStubInitializeMarshall +@ stub NdrpCreateProxy # wxp +@ stub NdrpCreateStub # wxp +@ stub NdrpGetProcFormatString # wxp +@ stub NdrpGetTypeFormatString # wxp +@ stub NdrpGetTypeGenCookie # wxp +@ stub NdrpMemoryIncrement # wxp +@ stub NdrpReleaseTypeFormatString # wxp +@ stub NdrpReleaseTypeGenCookie # wxp +@ stub NdrpSetRpcSsDefaults +@ stub NdrpVarVtOfTypeDesc # wxp +@ stub NdrTypeFlags # wxp +@ stub NdrTypeFree # wxp +@ stub NdrTypeMarshall # wxp +@ stub NdrTypeSize # wxp +@ stub NdrTypeUnmarshall # wxp +@ stub NdrUnmarshallBasetypeInline # wxp + +@ stub NdrByteCountPointerBufferSize +@ stub NdrByteCountPointerFree +@ stub NdrByteCountPointerMarshall +@ stub NdrByteCountPointerUnmarshall +@ stub NdrClientContextMarshall +@ stub NdrClientContextUnmarshall +@ stdcall NdrComplexArrayBufferSize(ptr ptr ptr) +@ stdcall NdrComplexArrayFree(ptr ptr ptr) +@ stdcall NdrComplexArrayMarshall(ptr ptr ptr) +@ stdcall NdrComplexArrayMemorySize(ptr ptr) +@ stdcall NdrComplexArrayUnmarshall(ptr ptr ptr long) +@ stdcall NdrComplexStructBufferSize(ptr ptr ptr) +@ stdcall NdrComplexStructFree(ptr ptr ptr) +@ stdcall NdrComplexStructMarshall(ptr ptr ptr) +@ stdcall NdrComplexStructMemorySize(ptr ptr) +@ stdcall NdrComplexStructUnmarshall(ptr ptr ptr long) +@ stdcall NdrConformantArrayBufferSize(ptr ptr ptr) +@ stdcall NdrConformantArrayFree(ptr ptr ptr) +@ stdcall NdrConformantArrayMarshall(ptr ptr ptr) +@ stdcall NdrConformantArrayMemorySize(ptr ptr) +@ stdcall NdrConformantArrayUnmarshall(ptr ptr ptr long) +@ stdcall NdrConformantStringBufferSize(ptr ptr ptr) +@ stdcall NdrConformantStringMarshall(ptr ptr ptr) +@ stdcall NdrConformantStringMemorySize(ptr ptr) +@ stdcall NdrConformantStringUnmarshall(ptr ptr ptr long) +@ stub NdrConformantStructBufferSize +@ stub NdrConformantStructFree +@ stub NdrConformantStructMarshall +@ stub NdrConformantStructMemorySize +@ stub NdrConformantStructUnmarshall +@ stdcall NdrConformantVaryingArrayBufferSize(ptr ptr ptr) +@ stdcall NdrConformantVaryingArrayFree(ptr ptr ptr) +@ stdcall NdrConformantVaryingArrayMarshall(ptr ptr ptr) +@ stdcall NdrConformantVaryingArrayMemorySize(ptr ptr) +@ stdcall NdrConformantVaryingArrayUnmarshall(ptr ptr ptr long) +@ stub NdrConformantVaryingStructBufferSize +@ stub NdrConformantVaryingStructFree +@ stub NdrConformantVaryingStructMarshall +@ stub NdrConformantVaryingStructMemorySize +@ stub NdrConformantVaryingStructUnmarshall +@ stub NdrEncapsulatedUnionBufferSize +@ stub NdrEncapsulatedUnionFree +@ stub NdrEncapsulatedUnionMarshall +@ stub NdrEncapsulatedUnionMemorySize +@ stub NdrEncapsulatedUnionUnmarshall +@ stub NdrFixedArrayBufferSize +@ stub NdrFixedArrayFree +@ stub NdrFixedArrayMarshall +@ stub NdrFixedArrayMemorySize +@ stub NdrFixedArrayUnmarshall +@ stub NdrHardStructBufferSize +@ stub NdrHardStructFree +@ stub NdrHardStructMarshall +@ stub NdrHardStructMemorySize +@ stub NdrHardStructUnmarshall +@ stdcall NdrInterfacePointerBufferSize(ptr ptr ptr) +@ stdcall NdrInterfacePointerFree(ptr ptr ptr) +@ stdcall NdrInterfacePointerMarshall(ptr ptr ptr) +@ stdcall NdrInterfacePointerMemorySize(ptr ptr) +@ stdcall NdrInterfacePointerUnmarshall(ptr ptr ptr long) +@ stub NdrNonConformantStringBufferSize +@ stub NdrNonConformantStringMarshall +@ stub NdrNonConformantStringMemorySize +@ stub NdrNonConformantStringUnmarshall +@ stub NdrNonEncapsulatedUnionBufferSize +@ stub NdrNonEncapsulatedUnionFree +@ stub NdrNonEncapsulatedUnionMarshall +@ stub NdrNonEncapsulatedUnionMemorySize +@ stub NdrNonEncapsulatedUnionUnmarshall +@ stdcall NdrPointerBufferSize(ptr ptr ptr) +@ stdcall NdrPointerFree(ptr ptr ptr) +@ stdcall NdrPointerMarshall(ptr ptr ptr) +@ stdcall NdrPointerMemorySize(ptr ptr) +@ stdcall NdrPointerUnmarshall(ptr ptr ptr long) +@ stub NdrServerContextMarshall +@ stub NdrServerContextUnmarshall +@ stub NdrServerContextNewMarshall # wxp +@ stub NdrServerContextNewUnmarshall # wxp +@ stub NdrServerInitialize +@ stub NdrServerInitializeMarshall +@ stdcall NdrServerInitializeNew(ptr ptr ptr) +@ stub NdrServerInitializePartial # wxp +@ stub NdrServerInitializeUnmarshall +@ stub NdrServerMarshall +@ stub NdrServerUnmarshall +@ stdcall NdrSimpleStructBufferSize(ptr ptr ptr) +@ stdcall NdrSimpleStructFree(ptr ptr ptr) +@ stdcall NdrSimpleStructMarshall(ptr ptr ptr) +@ stdcall NdrSimpleStructMemorySize(ptr ptr) +@ stdcall NdrSimpleStructUnmarshall(ptr ptr ptr long) +@ stdcall NdrSimpleTypeMarshall(ptr ptr long) +@ stdcall NdrSimpleTypeUnmarshall(ptr ptr long) +@ stdcall NdrUserMarshalBufferSize(ptr ptr ptr) +@ stdcall NdrUserMarshalFree(ptr ptr ptr) +@ stdcall NdrUserMarshalMarshall(ptr ptr ptr) +@ stdcall NdrUserMarshalMemorySize(ptr ptr) +@ stub NdrUserMarshalSimpleTypeConvert +@ stdcall NdrUserMarshalUnmarshall(ptr ptr ptr long) +@ stub NdrVaryingArrayBufferSize +@ stub NdrVaryingArrayFree +@ stub NdrVaryingArrayMarshall +@ stub NdrVaryingArrayMemorySize +@ stub NdrVaryingArrayUnmarshall +@ stub NdrXmitOrRepAsBufferSize +@ stub NdrXmitOrRepAsFree +@ stub NdrXmitOrRepAsMarshall +@ stub NdrXmitOrRepAsMemorySize +@ stub NdrXmitOrRepAsUnmarshall + +@ stub NDRCContextBinding +@ stub NDRCContextMarshall +@ stub NDRCContextUnmarshall +@ stub NDRSContextMarshall +@ stub NDRSContextUnmarshall +@ stub NDRSContextMarshallEx +@ stub NDRSContextUnmarshallEx +@ stub NDRSContextMarshall2 +@ stub NDRSContextUnmarshall2 +@ stub NDRcopy + +@ stub MIDL_wchar_strcpy +@ stub MIDL_wchar_strlen +@ stub char_array_from_ndr +@ stub char_from_ndr +@ stub data_from_ndr +@ stub data_into_ndr +@ stub data_size_ndr +@ stub double_array_from_ndr +@ stub double_from_ndr +@ stub enum_from_ndr +@ stub float_array_from_ndr +@ stub float_from_ndr +@ stub long_array_from_ndr +@ stub long_from_ndr +@ stub long_from_ndr_temp +@ stub short_array_from_ndr +@ stub short_from_ndr +@ stub short_from_ndr_temp +@ stub tree_into_ndr +@ stub tree_peek_ndr +@ stub tree_size_ndr + +@ stub I_RpcAbortAsyncCall +@ stub I_RpcAllocate +@ stub I_RpcAsyncAbortCall +@ stub I_RpcAsyncSendReceive # NT4 +@ stub I_RpcAsyncSetHandle +@ stub I_RpcBCacheAllocate +@ stub I_RpcBCacheFree +@ stub I_RpcBindingCopy +@ stub I_RpcBindingInqConnId +@ stub I_RpcBindingInqDynamicEndPoint +@ stub I_RpcBindingInqDynamicEndPointA +@ stub I_RpcBindingInqDynamicEndPointW +@ stub I_RpcBindingInqLocalClientPID # wxp +@ stub I_RpcBindingInqSecurityContext +@ stub I_RpcBindingInqTransportType +@ stub I_RpcBindingInqWireIdForSnego +@ stub I_RpcBindingIsClientLocal +@ stub I_RpcBindingToStaticStringBindingW +@ stdcall I_RpcBindingSetAsync(ptr ptr) +# 9x version of I_RpcBindingSetAsync has 3 arguments, not 2 +@ stub I_RpcClearMutex +@ stub I_RpcConnectionInqSockBuffSize +@ stub I_RpcConnectionInqSockBuffSize2 +@ stub I_RpcConnectionSetSockBuffSize +@ stub I_RpcDeleteMutex +@ stub I_RpcEnableWmiTrace # wxp +@ stub I_RpcExceptionFilter # wxp +@ stub I_RpcFree +@ stdcall I_RpcFreeBuffer(ptr) +@ stub I_RpcFreePipeBuffer +@ stub I_RpcGetAssociationContext +@ stdcall I_RpcGetBuffer(ptr) +@ stub I_RpcGetBufferWithObject +@ stub I_RpcGetCurrentCallHandle +@ stub I_RpcGetExtendedError +@ stub I_RpcGetServerContextList +@ stub I_RpcGetThreadEvent # win9x +@ stub I_RpcGetThreadWindowHandle # win9x +@ stub I_RpcIfInqTransferSyntaxes +@ stub I_RpcLaunchDatagramReceiveThread # win9x +@ stub I_RpcLogEvent +@ stub I_RpcMapWin32Status +@ stub I_RpcMonitorAssociation +@ stub I_RpcNegotiateTransferSyntax # wxp +@ stub I_RpcNsBindingSetEntryName +@ stub I_RpcNsBindingSetEntryNameA +@ stub I_RpcNsBindingSetEntryNameW +@ stub I_RpcNsInterfaceExported +@ stub I_RpcNsInterfaceUnexported +@ stub I_RpcParseSecurity +@ stub I_RpcPauseExecution +@ stub I_RpcProxyNewConnection # wxp +@ stub I_RpcReallocPipeBuffer +@ stdcall I_RpcReceive(ptr) +@ stub I_RpcRequestMutex +@ stdcall I_RpcSend(ptr) +@ stdcall I_RpcSendReceive(ptr) +@ stub I_RpcServerAllocateIpPort +@ stub I_RpcServerInqAddressChangeFn +@ stub I_RpcServerInqLocalConnAddress # wxp +@ stub I_RpcServerInqTransportType +@ stub I_RpcServerRegisterForwardFunction +@ stub I_RpcServerSetAddressChangeFn +@ stdcall I_RpcServerStartListening(ptr) # win9x +@ stdcall I_RpcServerStopListening() # win9x +@ stub I_RpcServerUnregisterEndpointA # win9x +@ stub I_RpcServerUnregisterEndpointW # win9x +@ stub I_RpcServerUseProtseq2A +@ stub I_RpcServerUseProtseq2W +@ stub I_RpcServerUseProtseqEp2A +@ stub I_RpcServerUseProtseqEp2W +@ stub I_RpcSetAsyncHandle +@ stub I_RpcSetAssociationContext # win9x +@ stub I_RpcSetServerContextList +@ stub I_RpcSetThreadParams # win9x +@ stub I_RpcSetWMsgEndpoint # NT4 +@ stub I_RpcSsDontSerializeContext +@ stub I_RpcSystemFunction001 # wxp (oh, brother!) +@ stub I_RpcStopMonitorAssociation +@ stub I_RpcTransCancelMigration # win9x +@ stub I_RpcTransClientMaxFrag # win9x +@ stub I_RpcTransClientReallocBuffer # win9x +@ stub I_RpcTransConnectionAllocatePacket +@ stub I_RpcTransConnectionFreePacket +@ stub I_RpcTransConnectionReallocPacket +@ stub I_RpcTransDatagramAllocate +@ stub I_RpcTransDatagramAllocate2 +@ stub I_RpcTransDatagramFree +@ stub I_RpcTransGetAddressList +@ stub I_RpcTransGetThreadEvent +@ stub I_RpcTransIoCancelled +@ stub I_RpcTransMaybeMakeReceiveAny # win9x +@ stub I_RpcTransMaybeMakeReceiveDirect # win9x +@ stub I_RpcTransPingServer # win9x +@ stub I_RpcTransServerFindConnection # win9x +@ stub I_RpcTransServerFreeBuffer # win9x +@ stub I_RpcTransServerMaxFrag # win9x +@ stub I_RpcTransServerNewConnection +@ stub I_RpcTransServerProtectThread # win9x +@ stub I_RpcTransServerReallocBuffer # win9x +@ stub I_RpcTransServerReceiveDirectReady # win9x +@ stub I_RpcTransServerUnprotectThread # win9x +@ stub I_RpcTurnOnEEInfoPropagation # wxp +@ stdcall I_RpcWindowProc(ptr long long long) # win9x +@ stub I_RpcltDebugSetPDUFilter +@ stub I_UuidCreate + +@ stub CreateProxyFromTypeInfo +@ stub CreateStubFromTypeInfo +@ stub PerformRpcInitialization +@ stub StartServiceIfNecessary # win9x +@ stub GlobalMutexClearExternal +@ stub GlobalMutexRequestExternal diff --git a/reactos/lib/rpcrt4/rpcrt4_main.c b/reactos/lib/rpcrt4/rpcrt4_main.c new file mode 100644 index 00000000000..15cbabc3b1a --- /dev/null +++ b/reactos/lib/rpcrt4/rpcrt4_main.c @@ -0,0 +1,750 @@ +/* + * RPCRT4 + * + * Copyright 2000 Huw D M Davies for CodeWeavers + * + * 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 + * + * WINE RPC TODO's (and a few TODONT's) + * + * - Ove's decreasingly incomplete widl is an IDL compiler for wine. For widl + * to be wine's only IDL compiler, a fair bit of work remains to be done. + * until then we have used some midl-generated stuff. (What?) + * widl currently doesn't generate stub/proxy files required by wine's (O)RPC + * capabilities -- nor does it make those lovely format strings :( + * The MS MIDL compiler does some really esoteric stuff. Of course Ove has + * started with the less esoteric stuff. There are also lots of nice + * comments in there if you want to flex your bison and help build this monster. + * + * - RPC has a quite featureful error handling mechanism; basically none of this is + * implemented right now. We also have deficiencies on the compiler side, where + * wine's __TRY / __EXCEPT / __FINALLY macros are not even used for RpcTryExcept & co, + * due to syntactic differences! (we can fix it with widl by using __TRY) + * + * - There are several different memory allocation schemes for MSRPC. + * I don't even understand what they all are yet, much less have them + * properly implemented. Surely we are supposed to be doing something with + * the user-provided allocation/deallocation functions, but so far, + * I don't think we are doing this... + * + * - MSRPC provides impersonation capabilities which currently are not possible + * to implement in wine. At the very least we should implement the authorization + * API's & gracefully ignore the irrelevant stuff (to an extent we already do). + * + * - Some transports are not yet implemented. The existing transport implementations + * are incomplete and may be bug-infested. + * + * - The various transports that we do support ought to be supported in a more + * object-oriented manner, as in DCE's RPC implementation, instead of cluttering + * up the code with conditionals like we do now. + * + * - Data marshalling: So far, only the beginnings of a full implementation + * exist in wine. NDR protocol itself is documented, but the MS API's to + * convert data-types in memory into NDR are not. This is challenging work, + * and has supposedly been "at the top of Greg's queue" for several months now. + * + * - ORPC is RPC for OLE; once we have a working RPC framework, we can + * use it to implement out-of-process OLE client/server communications. + * ATM there is maybe a disconnect between the marshalling in the OLE DLL's + * and the marshalling going on here [TODO: well, is there or not?] + * + * - In-source API Documentation, at least for those functions which we have + * implemented, but preferably for everything we can document, would be nice, + * since some of this stuff is quite obscure. + * + * - Name services... [TODO: what about them] + * + * - Protocol Towers: Totally unimplemented.... I think. + * + * - Context Handle Rundown: whatever that is. + * + * - Nested RPC's: Totally unimplemented. + * + * - Statistics: we are supposed to be keeping various counters. we aren't. + * + * - Async RPC: Unimplemented. + * + * - XML/http RPC: Somewhere there's an XML fiend that wants to do this! Betcha + * we could use these as a transport for RPC's across computers without a + * permissions and/or licensing crisis. + * + * - The NT "ports" API, aka LPC. Greg claims this is on his radar. Might (or + * might not) enable users to get some kind of meaningful result out of + * NT-based native rpcrt4's. Commonly-used transport for self-to-self RPC's. + * + * - ...? More stuff I haven't thought of. If you think of more RPC todo's + * drop me an e-mail or send a patch to the + * wine-patches mailing list. + */ + +#include "config.h" + +#include +#include +#include +#include + +#include "windef.h" +#include "winerror.h" +#include "winbase.h" +#include "winuser.h" +#include "iptypes.h" +#include "iphlpapi.h" +#include "wine/unicode.h" +#include "rpc.h" + +#include "ole2.h" +#include "rpcndr.h" +#include "rpcproxy.h" + +#include "rpc_binding.h" +#include "rpcss_np_client.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(ole); + +static UUID uuid_nil; +static HANDLE master_mutex; + +HANDLE RPCRT4_GetMasterMutex(void) +{ + return master_mutex; +} + +static CRITICAL_SECTION uuid_cs; +static CRITICAL_SECTION_DEBUG critsect_debug = +{ + 0, 0, &uuid_cs, + { &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList }, + 0, 0, { 0, (DWORD)(__FILE__ ": uuid_cs") } +}; +static CRITICAL_SECTION uuid_cs = { &critsect_debug, -1, 0, 0, 0, 0 }; + +/*********************************************************************** + * DllMain + * + * PARAMS + * hinstDLL [I] handle to the DLL's instance + * fdwReason [I] + * lpvReserved [I] reserved, must be NULL + * + * RETURNS + * Success: TRUE + * Failure: FALSE + */ + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + switch (fdwReason) { + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinstDLL); + master_mutex = CreateMutexA( NULL, FALSE, RPCSS_MASTER_MUTEX_NAME); + if (!master_mutex) + ERR("Failed to create master mutex\n"); + break; + + case DLL_PROCESS_DETACH: + CloseHandle(master_mutex); + master_mutex = NULL; + break; + } + + return TRUE; +} + +/************************************************************************* + * RpcStringFreeA [RPCRT4.@] + * + * Frees a character string allocated by the RPC run-time library. + * + * RETURNS + * + * S_OK if successful. + */ +RPC_STATUS WINAPI RpcStringFreeA(unsigned char** String) +{ + HeapFree( GetProcessHeap(), 0, *String); + + return RPC_S_OK; +} + +/************************************************************************* + * RpcStringFreeW [RPCRT4.@] + * + * Frees a character string allocated by the RPC run-time library. + * + * RETURNS + * + * S_OK if successful. + */ +RPC_STATUS WINAPI RpcStringFreeW(unsigned short** String) +{ + HeapFree( GetProcessHeap(), 0, *String); + + return RPC_S_OK; +} + +/************************************************************************* + * RpcRaiseException [RPCRT4.@] + * + * Raises an exception. + */ +void WINAPI RpcRaiseException(RPC_STATUS exception) +{ + /* FIXME: translate exception? */ + RaiseException(exception, 0, 0, NULL); +} + +/************************************************************************* + * UuidCompare [RPCRT4.@] + * + * PARAMS + * UUID *Uuid1 [I] Uuid to compare + * UUID *Uuid2 [I] Uuid to compare + * RPC_STATUS *Status [O] returns RPC_S_OK + * + * RETURNS + * -1 if Uuid1 is less than Uuid2 + * 0 if Uuid1 and Uuid2 are equal + * 1 if Uuid1 is greater than Uuid2 + */ +int WINAPI UuidCompare(UUID *Uuid1, UUID *Uuid2, RPC_STATUS *Status) +{ + int i; + + TRACE("(%s,%s)\n", debugstr_guid(Uuid1), debugstr_guid(Uuid2)); + + *Status = RPC_S_OK; + + if (!Uuid1) Uuid1 = &uuid_nil; + if (!Uuid2) Uuid2 = &uuid_nil; + + if (Uuid1 == Uuid2) return 0; + + if (Uuid1->Data1 != Uuid2->Data1) + return Uuid1->Data1 < Uuid2->Data1 ? -1 : 1; + + if (Uuid1->Data2 != Uuid2->Data2) + return Uuid1->Data2 < Uuid2->Data2 ? -1 : 1; + + if (Uuid1->Data3 != Uuid2->Data3) + return Uuid1->Data3 < Uuid2->Data3 ? -1 : 1; + + for (i = 0; i < 8; i++) { + if (Uuid1->Data4[i] < Uuid2->Data4[i]) + return -1; + if (Uuid1->Data4[i] > Uuid2->Data4[i]) + return 1; + } + + return 0; +} + +/************************************************************************* + * UuidEqual [RPCRT4.@] + * + * PARAMS + * UUID *Uuid1 [I] Uuid to compare + * UUID *Uuid2 [I] Uuid to compare + * RPC_STATUS *Status [O] returns RPC_S_OK + * + * RETURNS + * TRUE/FALSE + */ +int WINAPI UuidEqual(UUID *Uuid1, UUID *Uuid2, RPC_STATUS *Status) +{ + TRACE("(%s,%s)\n", debugstr_guid(Uuid1), debugstr_guid(Uuid2)); + return !UuidCompare(Uuid1, Uuid2, Status); +} + +/************************************************************************* + * UuidIsNil [RPCRT4.@] + * + * PARAMS + * UUID *Uuid [I] Uuid to compare + * RPC_STATUS *Status [O] retuns RPC_S_OK + * + * RETURNS + * TRUE/FALSE + */ +int WINAPI UuidIsNil(UUID *Uuid, RPC_STATUS *Status) +{ + TRACE("(%s)\n", debugstr_guid(Uuid)); + if (!Uuid) return TRUE; + return !UuidCompare(Uuid, &uuid_nil, Status); +} + + /************************************************************************* + * UuidCreateNil [RPCRT4.@] + * + * PARAMS + * UUID *Uuid [O] returns a nil UUID + * + * RETURNS + * RPC_S_OK + */ +RPC_STATUS WINAPI UuidCreateNil(UUID *Uuid) +{ + *Uuid = uuid_nil; + return RPC_S_OK; +} + +/* Number of 100ns ticks per clock tick. To be safe, assume that the clock + resolution is at least 1000 * 100 * (1/1000000) = 1/10 of a second */ +#define TICKS_PER_CLOCK_TICK 1000 +#define SECSPERDAY 86400 +#define TICKSPERSEC 10000000 +/* UUID system time starts at October 15, 1582 */ +#define SECS_15_OCT_1582_TO_1601 ((17 + 30 + 31 + 365 * 18 + 5) * SECSPERDAY) +#define TICKS_15_OCT_1582_TO_1601 ((ULONGLONG)SECS_15_OCT_1582_TO_1601 * TICKSPERSEC) + +static void RPC_UuidGetSystemTime(ULONGLONG *time) +{ + FILETIME ft; + + GetSystemTimeAsFileTime(&ft); + + *time = ((ULONGLONG)ft.dwHighDateTime << 32) | ft.dwLowDateTime; + *time += TICKS_15_OCT_1582_TO_1601; +} + +/* Assume that a hardware address is at least 6 bytes long */ +#define ADDRESS_BYTES_NEEDED 6 + +static RPC_STATUS RPC_UuidGetNodeAddress(BYTE *address) +{ + int i; + DWORD status = RPC_S_OK; + + ULONG buflen = sizeof(IP_ADAPTER_INFO); + PIP_ADAPTER_INFO adapter = (PIP_ADAPTER_INFO)HeapAlloc(GetProcessHeap(), 0, buflen); + + if (GetAdaptersInfo(adapter, &buflen) == ERROR_BUFFER_OVERFLOW) { + HeapFree(GetProcessHeap(), 0, adapter); + adapter = (IP_ADAPTER_INFO *)HeapAlloc(GetProcessHeap(), 0, buflen); + } + + if (GetAdaptersInfo(adapter, &buflen) == NO_ERROR) { + for (i = 0; i < ADDRESS_BYTES_NEEDED; i++) { + address[i] = adapter->Address[i]; + } + } + /* We can't get a hardware address, just use random numbers. + Set the multicast bit to prevent conflicts with real cards. */ + else { + for (i = 0; i < ADDRESS_BYTES_NEEDED; i++) { + address[i] = rand() & 0xff; + } + + address[0] |= 0x80; + status = RPC_S_UUID_LOCAL_ONLY; + } + + HeapFree(GetProcessHeap(), 0, adapter); + return status; +} + +/************************************************************************* + * UuidCreate [RPCRT4.@] + * + * Creates a 128bit UUID. + * + * RETURNS + * + * RPC_S_OK if successful. + * RPC_S_UUID_LOCAL_ONLY if UUID is only locally unique. + * + * FIXME: No compensation for changes across reloading + * this dll or across reboots (e.g. clock going + * backwards and swapped network cards). The RFC + * suggests using NVRAM for storing persistent + * values. + */ +RPC_STATUS WINAPI UuidCreate(UUID *Uuid) +{ + static int initialised, count; + + ULONGLONG time; + static ULONGLONG timelast; + static WORD sequence; + + static DWORD status; + static BYTE address[MAX_ADAPTER_ADDRESS_LENGTH]; + + EnterCriticalSection(&uuid_cs); + + if (!initialised) { + RPC_UuidGetSystemTime(&timelast); + count = TICKS_PER_CLOCK_TICK; + + sequence = ((rand() & 0xff) << 8) + (rand() & 0xff); + sequence &= 0x1fff; + + status = RPC_UuidGetNodeAddress(address); + initialised = 1; + } + + /* Generate time element of the UUID. Account for going faster + than our clock as well as the clock going backwards. */ + while (1) { + RPC_UuidGetSystemTime(&time); + if (time > timelast) { + count = 0; + break; + } + if (time < timelast) { + sequence = (sequence + 1) & 0x1fff; + count = 0; + break; + } + if (count < TICKS_PER_CLOCK_TICK) { + count++; + break; + } + } + + timelast = time; + time += count; + + /* Pack the information into the UUID structure. */ + + Uuid->Data1 = (unsigned long)(time & 0xffffffff); + Uuid->Data2 = (unsigned short)((time >> 32) & 0xffff); + Uuid->Data3 = (unsigned short)((time >> 48) & 0x0fff); + + /* This is a version 1 UUID */ + Uuid->Data3 |= (1 << 12); + + Uuid->Data4[0] = sequence & 0xff; + Uuid->Data4[1] = (sequence & 0x3f00) >> 8; + Uuid->Data4[1] |= 0x80; + + Uuid->Data4[2] = address[0]; + Uuid->Data4[3] = address[1]; + Uuid->Data4[4] = address[2]; + Uuid->Data4[5] = address[3]; + Uuid->Data4[6] = address[4]; + Uuid->Data4[7] = address[5]; + + LeaveCriticalSection(&uuid_cs); + + TRACE("%s\n", debugstr_guid(Uuid)); + + return status; +} + +/************************************************************************* + * UuidCreateSequential [RPCRT4.@] + * + * Creates a 128bit UUID. + * + * RETURNS + * + * RPC_S_OK if successful. + * RPC_S_UUID_LOCAL_ONLY if UUID is only locally unique. + * + */ +RPC_STATUS WINAPI UuidCreateSequential(UUID *Uuid) +{ + return UuidCreate(Uuid); +} + + +/************************************************************************* + * UuidHash [RPCRT4.@] + * + * Generates a hash value for a given UUID + * + * Code based on FreeDCE implementation + * + */ +unsigned short WINAPI UuidHash(UUID *uuid, RPC_STATUS *Status) +{ + BYTE *data = (BYTE*)uuid; + short c0 = 0, c1 = 0, x, y; + int i; + + if (!uuid) data = (BYTE*)(uuid = &uuid_nil); + + TRACE("(%s)\n", debugstr_guid(uuid)); + + for (i=0; iData1, Uuid->Data2, Uuid->Data3, + Uuid->Data4[0], Uuid->Data4[1], Uuid->Data4[2], + Uuid->Data4[3], Uuid->Data4[4], Uuid->Data4[5], + Uuid->Data4[6], Uuid->Data4[7] ); + + return RPC_S_OK; +} + +/************************************************************************* + * UuidToStringW [RPCRT4.@] + * + * Converts a UUID to a string. + * + * S_OK if successful. + * S_OUT_OF_MEMORY if unsucessful. + */ +RPC_STATUS WINAPI UuidToStringW(UUID *Uuid, unsigned short** StringUuid) +{ + char buf[37]; + + if (!Uuid) Uuid = &uuid_nil; + + sprintf(buf, "%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", + Uuid->Data1, Uuid->Data2, Uuid->Data3, + Uuid->Data4[0], Uuid->Data4[1], Uuid->Data4[2], + Uuid->Data4[3], Uuid->Data4[4], Uuid->Data4[5], + Uuid->Data4[6], Uuid->Data4[7] ); + + *StringUuid = RPCRT4_strdupAtoW(buf); + + if(!(*StringUuid)) + return RPC_S_OUT_OF_MEMORY; + + return RPC_S_OK; +} + +static const BYTE hex2bin[] = +{ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x00 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x10 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x20 */ + 0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0, /* 0x30 */ + 0,10,11,12,13,14,15,0,0,0,0,0,0,0,0,0, /* 0x40 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x50 */ + 0,10,11,12,13,14,15 /* 0x60 */ +}; + +/*********************************************************************** + * UuidFromStringA (RPCRT4.@) + */ +RPC_STATUS WINAPI UuidFromStringA(unsigned char* str, UUID *uuid) +{ + BYTE *s = (BYTE *)str; + int i; + + if (!s) return UuidCreateNil( uuid ); + + if (strlen(s) != 36) return RPC_S_INVALID_STRING_UUID; + + if ((s[8]!='-') || (s[13]!='-') || (s[18]!='-') || (s[23]!='-')) + return RPC_S_INVALID_STRING_UUID; + + for (i=0; i<36; i++) + { + if ((i == 8)||(i == 13)||(i == 18)||(i == 23)) continue; + if (s[i] > 'f' || (!hex2bin[s[i]] && s[i] != '0')) return RPC_S_INVALID_STRING_UUID; + } + + /* in form XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX */ + + uuid->Data1 = (hex2bin[s[0]] << 28 | hex2bin[s[1]] << 24 | hex2bin[s[2]] << 20 | hex2bin[s[3]] << 16 | + hex2bin[s[4]] << 12 | hex2bin[s[5]] << 8 | hex2bin[s[6]] << 4 | hex2bin[s[7]]); + uuid->Data2 = hex2bin[s[9]] << 12 | hex2bin[s[10]] << 8 | hex2bin[s[11]] << 4 | hex2bin[s[12]]; + uuid->Data3 = hex2bin[s[14]] << 12 | hex2bin[s[15]] << 8 | hex2bin[s[16]] << 4 | hex2bin[s[17]]; + + /* these are just sequential bytes */ + uuid->Data4[0] = hex2bin[s[19]] << 4 | hex2bin[s[20]]; + uuid->Data4[1] = hex2bin[s[21]] << 4 | hex2bin[s[22]]; + uuid->Data4[2] = hex2bin[s[24]] << 4 | hex2bin[s[25]]; + uuid->Data4[3] = hex2bin[s[26]] << 4 | hex2bin[s[27]]; + uuid->Data4[4] = hex2bin[s[28]] << 4 | hex2bin[s[29]]; + uuid->Data4[5] = hex2bin[s[30]] << 4 | hex2bin[s[31]]; + uuid->Data4[6] = hex2bin[s[32]] << 4 | hex2bin[s[33]]; + uuid->Data4[7] = hex2bin[s[34]] << 4 | hex2bin[s[35]]; + return RPC_S_OK; +} + + +/*********************************************************************** + * UuidFromStringW (RPCRT4.@) + */ +RPC_STATUS WINAPI UuidFromStringW(unsigned short* s, UUID *uuid) +{ + int i; + + if (!s) return UuidCreateNil( uuid ); + + if (strlenW(s) != 36) return RPC_S_INVALID_STRING_UUID; + + if ((s[8]!='-') || (s[13]!='-') || (s[18]!='-') || (s[23]!='-')) + return RPC_S_INVALID_STRING_UUID; + + for (i=0; i<36; i++) + { + if ((i == 8)||(i == 13)||(i == 18)||(i == 23)) continue; + if (s[i] > 'f' || (!hex2bin[s[i]] && s[i] != '0')) return RPC_S_INVALID_STRING_UUID; + } + + /* in form XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX */ + + uuid->Data1 = (hex2bin[s[0]] << 28 | hex2bin[s[1]] << 24 | hex2bin[s[2]] << 20 | hex2bin[s[3]] << 16 | + hex2bin[s[4]] << 12 | hex2bin[s[5]] << 8 | hex2bin[s[6]] << 4 | hex2bin[s[7]]); + uuid->Data2 = hex2bin[s[9]] << 12 | hex2bin[s[10]] << 8 | hex2bin[s[11]] << 4 | hex2bin[s[12]]; + uuid->Data3 = hex2bin[s[14]] << 12 | hex2bin[s[15]] << 8 | hex2bin[s[16]] << 4 | hex2bin[s[17]]; + + /* these are just sequential bytes */ + uuid->Data4[0] = hex2bin[s[19]] << 4 | hex2bin[s[20]]; + uuid->Data4[1] = hex2bin[s[21]] << 4 | hex2bin[s[22]]; + uuid->Data4[2] = hex2bin[s[24]] << 4 | hex2bin[s[25]]; + uuid->Data4[3] = hex2bin[s[26]] << 4 | hex2bin[s[27]]; + uuid->Data4[4] = hex2bin[s[28]] << 4 | hex2bin[s[29]]; + uuid->Data4[5] = hex2bin[s[30]] << 4 | hex2bin[s[31]]; + uuid->Data4[6] = hex2bin[s[32]] << 4 | hex2bin[s[33]]; + uuid->Data4[7] = hex2bin[s[34]] << 4 | hex2bin[s[35]]; + return RPC_S_OK; +} + +/*********************************************************************** + * DllRegisterServer (RPCRT4.@) + */ + +HRESULT WINAPI RPCRT4_DllRegisterServer( void ) +{ + FIXME( "(): stub\n" ); + return S_OK; +} + +BOOL RPCRT4_StartRPCSS(void) +{ + PROCESS_INFORMATION pi; + STARTUPINFOA si; + static char cmd[6]; + BOOL rslt; + + ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); + ZeroMemory(&si, sizeof(STARTUPINFOA)); + si.cb = sizeof(STARTUPINFOA); + + /* apparently it's not OK to use a constant string below */ + CopyMemory(cmd, "rpcss", 6); + + /* FIXME: will this do the right thing when run as a test? */ + rslt = CreateProcessA( + NULL, /* executable */ + cmd, /* command line */ + NULL, /* process security attributes */ + NULL, /* primary thread security attributes */ + FALSE, /* inherit handles */ + 0, /* creation flags */ + NULL, /* use parent's environment */ + NULL, /* use parent's current directory */ + &si, /* STARTUPINFO pointer */ + &pi /* PROCESS_INFORMATION */ + ); + + if (rslt) { + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + } + + return rslt; +} + +/*********************************************************************** + * RPCRT4_RPCSSOnDemandCall (internal) + * + * Attempts to send a message to the RPCSS process + * on the local machine, invoking it if necessary. + * For remote RPCSS calls, use.... your imagination. + * + * PARAMS + * msg [I] pointer to the RPCSS message + * vardata_payload [I] pointer vardata portion of the RPCSS message + * reply [O] pointer to reply structure + * + * RETURNS + * TRUE if successful + * FALSE otherwise + */ +BOOL RPCRT4_RPCSSOnDemandCall(PRPCSS_NP_MESSAGE msg, char *vardata_payload, PRPCSS_NP_REPLY reply) +{ + HANDLE client_handle; + int i, j = 0; + + TRACE("(msg == %p, vardata_payload == %p, reply == %p)\n", msg, vardata_payload, reply); + + client_handle = RPCRT4_RpcssNPConnect(); + + while (!client_handle) { + /* start the RPCSS process */ + if (!RPCRT4_StartRPCSS()) { + ERR("Unable to start RPCSS process.\n"); + return FALSE; + } + /* wait for a connection (w/ periodic polling) */ + for (i = 0; i < 60; i++) { + Sleep(200); + client_handle = RPCRT4_RpcssNPConnect(); + if (client_handle) break; + } + /* we are only willing to try twice */ + if (j++ >= 1) break; + } + + if (!client_handle) { + /* no dice! */ + ERR("Unable to connect to RPCSS process!\n"); + SetLastError(RPC_E_SERVER_DIED_DNE); + return FALSE; + } + + /* great, we're connected. now send the message */ + if (!RPCRT4_SendReceiveNPMsg(client_handle, msg, vardata_payload, reply)) { + ERR("Something is amiss: RPC_SendReceive failed.\n"); + return FALSE; + } + + return TRUE; +} diff --git a/reactos/lib/rpcrt4/rpcss_np_client.c b/reactos/lib/rpcrt4/rpcss_np_client.c new file mode 100644 index 00000000000..567277ee868 --- /dev/null +++ b/reactos/lib/rpcrt4/rpcss_np_client.c @@ -0,0 +1,154 @@ +/* + * RPCSS named pipe client implementation + * + * Copyright (C) 2002 Greg Turner + * + * 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 "windef.h" +#include "winbase.h" +#include "ntstatus.h" +#include "wine/rpcss_shared.h" +#include "wine/debug.h" + +#include "rpc_binding.h" + +WINE_DEFAULT_DEBUG_CHANNEL(ole); + +HANDLE RPCRT4_RpcssNPConnect(void) +{ + HANDLE the_pipe = NULL; + DWORD dwmode, wait_result; + HANDLE master_mutex = RPCRT4_GetMasterMutex(); + + TRACE("\n"); + + while (TRUE) { + + wait_result = WaitForSingleObject(master_mutex, MASTER_MUTEX_TIMEOUT); + switch (wait_result) { + case WAIT_ABANDONED: + case WAIT_OBJECT_0: + break; + case WAIT_FAILED: + case WAIT_TIMEOUT: + default: + ERR("This should never happen: couldn't enter mutex.\n"); + return NULL; + } + + /* try to open the client side of the named pipe. */ + the_pipe = CreateFileA( + NAME_RPCSS_NAMED_PIPE, /* pipe name */ + GENERIC_READ | GENERIC_WRITE, /* r/w access */ + 0, /* no sharing */ + NULL, /* no security attributes */ + OPEN_EXISTING, /* open an existing pipe */ + 0, /* default attributes */ + NULL /* no template file */ + ); + + if (the_pipe != INVALID_HANDLE_VALUE) + break; + + if (GetLastError() != ERROR_PIPE_BUSY) { + WARN("Unable to open named pipe %s (assuming unavailable).\n", + debugstr_a(NAME_RPCSS_NAMED_PIPE)); + the_pipe = NULL; + break; + } + + WARN("Named pipe busy (will wait)\n"); + + if (!ReleaseMutex(master_mutex)) + ERR("Failed to release master mutex. Expect deadlock.\n"); + + /* wait for the named pipe. We are only + willing to wait only 5 seconds. It should be available /very/ soon. */ + if (! WaitNamedPipeA(NAME_RPCSS_NAMED_PIPE, MASTER_MUTEX_WAITNAMEDPIPE_TIMEOUT)) + { + ERR("Named pipe unavailable after waiting. Something is probably wrong.\n"); + return NULL; + } + + } + + if (the_pipe) { + dwmode = PIPE_READMODE_MESSAGE; + /* SetNamedPipeHandleState not implemented ATM, but still seems to work somehow. */ + if (! SetNamedPipeHandleState(the_pipe, &dwmode, NULL, NULL)) + WARN("Failed to set pipe handle state\n"); + } + + if (!ReleaseMutex(master_mutex)) + ERR("Uh oh, failed to leave the RPC Master Mutex!\n"); + + return the_pipe; +} + +BOOL RPCRT4_SendReceiveNPMsg(HANDLE np, PRPCSS_NP_MESSAGE msg, char *vardata, PRPCSS_NP_REPLY reply) +{ + DWORD count; + UINT32 payload_offset; + RPCSS_NP_MESSAGE vardata_payload_msg; + + TRACE("(np == %p, msg == %p, vardata == %p, reply == %p)\n", + np, msg, vardata, reply); + + if (! WriteFile(np, msg, sizeof(RPCSS_NP_MESSAGE), &count, NULL)) { + ERR("write failed.\n"); + return FALSE; + } + + if (count != sizeof(RPCSS_NP_MESSAGE)) { + ERR("write count mismatch.\n"); + return FALSE; + } + + /* process the vardata payload if necessary */ + vardata_payload_msg.message_type = RPCSS_NP_MESSAGE_TYPEID_VARDATAPAYLOADMSG; + vardata_payload_msg.vardata_payload_size = 0; /* meaningless */ + for ( payload_offset = 0; payload_offset < msg->vardata_payload_size; + payload_offset += VARDATA_PAYLOAD_BYTES ) { + TRACE("sending vardata payload. vd=%p, po=%d, ps=%d\n", vardata, + payload_offset, msg->vardata_payload_size); + ZeroMemory(vardata_payload_msg.message.vardatapayloadmsg.payload, VARDATA_PAYLOAD_BYTES); + CopyMemory(vardata_payload_msg.message.vardatapayloadmsg.payload, + vardata, + min( VARDATA_PAYLOAD_BYTES, msg->vardata_payload_size - payload_offset )); + vardata += VARDATA_PAYLOAD_BYTES; + if (! WriteFile(np, &vardata_payload_msg, sizeof(RPCSS_NP_MESSAGE), &count, NULL)) { + ERR("vardata write failed at %u bytes.\n", payload_offset); + return FALSE; + } + } + + if (! ReadFile(np, reply, sizeof(RPCSS_NP_REPLY), &count, NULL)) { + ERR("read failed.\n"); + return FALSE; + } + + if (count != sizeof(RPCSS_NP_REPLY)) { + ERR("read count mismatch. got %ld, expected %u.\n", count, sizeof(RPCSS_NP_REPLY)); + return FALSE; + } + + /* message execution was successful */ + return TRUE; +} diff --git a/reactos/lib/rpcrt4/rpcss_np_client.h b/reactos/lib/rpcrt4/rpcss_np_client.h new file mode 100644 index 00000000000..c50e8ada80f --- /dev/null +++ b/reactos/lib/rpcrt4/rpcss_np_client.h @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2002 Greg Turner + * + * 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_RPCSS_NP_CLIENT_H +#define __WINE_RPCSS_NP_CLIENT_H + +/* rpcss_np_client.c */ +HANDLE RPC_RpcssNPConnect(void); +BOOL RPCRT4_SendReceiveNPMsg(HANDLE, PRPCSS_NP_MESSAGE, char *, PRPCSS_NP_REPLY); + +#endif /* __RPCSS_NP_CLINET_H */ diff --git a/reactos/lib/rpcrt4/winehq2ros.patch b/reactos/lib/rpcrt4/winehq2ros.patch new file mode 100644 index 00000000000..f346a055af4 --- /dev/null +++ b/reactos/lib/rpcrt4/winehq2ros.patch @@ -0,0 +1,62 @@ +--- rpc_server.c Tue May 4 17:37:56 2004 ++++ rpc_server.c Tue May 4 19:54:24 2004 +@@ -184,6 +184,7 @@ + return packet; + } + ++#ifndef __REACTOS__ + typedef struct { + PRPC_MESSAGE msg; + void* buf; +@@ -204,20 +205,25 @@ + TRACE("returning failure packet\n"); + return EXCEPTION_EXECUTE_HANDLER; + } ++#endif + + static void RPCRT4_process_packet(RpcConnection* conn, RpcPktHdr* hdr, RPC_MESSAGE* msg) + { + RpcServerInterface* sif; + RPC_DISPATCH_FUNCTION func; ++#ifndef __REACTOS__ + packet_state state; ++#endif + UUID *object_uuid; + RpcPktHdr *response; + void *buf = msg->Buffer; + RPC_STATUS status; + ++#ifndef __REACTOS__ + state.msg = msg; + state.buf = buf; + TlsSetValue(worker_tls, &state); ++#endif + + switch (hdr->common.ptype) { + case PKT_BIND: +@@ -303,11 +309,15 @@ + MAKEWORD(hdr->common.drep[2], hdr->common.drep[3])); + + /* dispatch */ ++#ifndef __REACTOS__ + __TRY { + if (func) func(msg); + } __EXCEPT(rpc_filter) { + /* failure packet was created in rpc_filter */ + } __ENDTRY ++#else ++ if (func) func(msg); ++#endif + + /* send response packet */ + I_RpcSend(msg); +@@ -331,7 +341,9 @@ + I_RpcFreeBuffer(msg); + msg->Buffer = NULL; + RPCRT4_FreeHeader(hdr); ++#ifndef __REACTOS__ + TlsSetValue(worker_tls, NULL); ++#endif + } + + static DWORD CALLBACK RPCRT4_worker_thread(LPVOID the_arg) From 97a1bb9c2e6d98d4778a14cc949fba53eca56eb5 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Tue, 4 May 2004 20:10:18 +0000 Subject: [PATCH 1037/1463] added option -s to silence status output while processing svn path=/trunk/; revision=9304 --- reactos/apps/utils/stats/stats.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/reactos/apps/utils/stats/stats.c b/reactos/apps/utils/stats/stats.c index 21f78084ba1..33ab84f4ee3 100644 --- a/reactos/apps/utils/stats/stats.c +++ b/reactos/apps/utils/stats/stats.c @@ -9,7 +9,7 @@ */ #include #include -#include +#include typedef struct _EXTENSION_INFO { @@ -38,9 +38,9 @@ typedef struct _FILE_INFO HANDLE FileHandle; PEXTENSION_INFO ExtInfoList; PFILE_INFO StatInfoList; -BOOLEAN SkipEmptyLines; +BOOLEAN SkipEmptyLines, BeSilent; -#define MAX_OPTIONS 1 +#define MAX_OPTIONS 2 TCHAR *Options[MAX_OPTIONS]; @@ -362,7 +362,10 @@ ProcessDirectories(LPTSTR Path) HANDLE SearchHandle; BOOL More; - _tprintf (_T("Processing %s ...\n"), Path); + if(!BeSilent) + { + _tprintf (_T("Processing %s ...\n"), Path); + } _tcscpy (SearchPath, Path); _tcscat (SearchPath, _T("\\*.*")); @@ -447,12 +450,14 @@ main (int argc, char * argv []) TCHAR Path[MAX_PATH + 1]; #endif - _tprintf (_T("\nReactOS project statistics generator.\n\n")); + _tprintf (_T("ReactOS Project Statistics\n")); + _tprintf (_T("==========================\n\n")); if (argc < 2 || argc > 2 + MAX_OPTIONS) { - _tprintf(_T("Usage: stats [-e] directory\n")); - _tprintf(_T(" -e: don't count empty lines")); + _tprintf(_T("Usage: stats [-e] [-s] directory\n")); + _tprintf(_T(" -e: don't count empty lines\n")); + _tprintf(_T(" -s: be silent, don't print directories while processing\n")); return 1; } @@ -476,6 +481,7 @@ main (int argc, char * argv []) } SkipEmptyLines = IsOptionSet(_T("-e")); + BeSilent = IsOptionSet(_T("-s")); #if UNICODE ZeroMemory(Path, sizeof(Path)); From 4aeca8b2b19c552e65c07f03c24d5a7d9bbbffe6 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Tue, 4 May 2004 20:12:04 +0000 Subject: [PATCH 1038/1463] - Remove old RPCRT4. svn path=/trunk/; revision=9305 --- reactos/lib/rpcrt4/include/rpc.h | 117 -------------- reactos/lib/rpcrt4/include/rpcrt4/rpc.h | 43 ----- reactos/lib/rpcrt4/midl/Makefile | 54 ------- reactos/lib/rpcrt4/midl/hello.idl | 34 ---- reactos/lib/rpcrt4/midl/idl.l | 114 -------------- reactos/lib/rpcrt4/midl/idl.y | 201 ------------------------ reactos/lib/rpcrt4/midl/interface.c | 74 --------- reactos/lib/rpcrt4/midl/midl.c | 79 ---------- reactos/lib/rpcrt4/midl/midl.h | 37 ----- reactos/lib/rpcrt4/midl/option.c | 16 -- reactos/lib/rpcrt4/midl/types.c | 190 ---------------------- reactos/lib/rpcrt4/midl/types.h | 42 ----- 12 files changed, 1001 deletions(-) delete mode 100644 reactos/lib/rpcrt4/include/rpc.h delete mode 100644 reactos/lib/rpcrt4/include/rpcrt4/rpc.h delete mode 100644 reactos/lib/rpcrt4/midl/Makefile delete mode 100644 reactos/lib/rpcrt4/midl/hello.idl delete mode 100644 reactos/lib/rpcrt4/midl/idl.l delete mode 100644 reactos/lib/rpcrt4/midl/idl.y delete mode 100644 reactos/lib/rpcrt4/midl/interface.c delete mode 100644 reactos/lib/rpcrt4/midl/midl.c delete mode 100644 reactos/lib/rpcrt4/midl/midl.h delete mode 100644 reactos/lib/rpcrt4/midl/option.c delete mode 100644 reactos/lib/rpcrt4/midl/types.c delete mode 100644 reactos/lib/rpcrt4/midl/types.h diff --git a/reactos/lib/rpcrt4/include/rpc.h b/reactos/lib/rpcrt4/include/rpc.h deleted file mode 100644 index 7a59927af3c..00000000000 --- a/reactos/lib/rpcrt4/include/rpc.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - * - */ - -#ifndef __LIB_RPCRT4_INCLUDE_RPC_H -#define __LIB_RPCRT4_INCLUDE_RPC_H - -#define RPC_MGR_EPV VOID -typedef RPC_BINDING_HANDLE handle_t - -/* - * RPC packet types - */ -#define RPC_REQUEST (0x0) -#define RPC_PING (0x1) -#define RPC_RESPONSE (0x2) -#define RPC_FAULT (0x3) -#define RPC_WORKING (0x4) -#define RPC_NOCALL (0x5) -#define RPC_REJECT (0x6) -#define RPC_ACK (0x7) -#define RPC_CL_CANCEL (0x8) -#define RPC_FACK (0x9) -#define RPC_CANCEL_ACK (0xa) -#define RPC_BIND (0xb) -#define RPC_BINDACK (0xc) -#define RPC_BINDNACK (0xd) -#define RPC_ALTCONT (0xe) -#define RPC_AUTH3 (0xf) -#define RPC_BINDCONT (0x10) -#define RPC_SHUTDOWN (0x10) -#define RPC_CO_CANCEL (0x11) -#define RPC_ORPHANED (0x12) - -/* - * Common RPC packet header - */ -typedef struct _RPC_HEADER_PACKET -{ - UCHAR MajorVersion; - UCHAR MinorVersion; - UCHAR PacketType; - UCHAR Flags; - ULONG DataRep; - USHORT FragLen; - USHORT AuthLen; - ULONG CallId; -} RPC_HEADER_PACKET, *PRPC_HEADER_PACKET; - -/* - * Additional header for a RPC request packet - */ -typedef struct _RPC_REQUEST_PACKET -{ - ULONG AllocHint; - USHORT ContextId; - USHORT Opcode; -} RPC_REQUEST_PACKET, *PRPC_REQUEST_PACKET; - -typedef struct _RPC_RESPONSE_PACKET -{ - ULONG AllocHint; - USHORT ContextId; - UCHAR CancelCount; - UCHAR Reserved; -} RPC_RESPONSE_PACKET, *PRPC_RESPONSE_PACKET; - -typedef struct _RPC_VERSION -{ - USHORT MajorVersion; - USHORT MinorVersion; -} RPC_VERSION, *PRPC_VERSION; - -typedef struct _RPC_SYNTAX_IDENTIFIER -{ - GUID SyntaxGuid; - RPC_VERSION SyntaxVersion; -} RPC_SYNTAX_IDENTIFIER, *PRPC_SYNTAX_IDENTIFIER; - -typedef struct _RPC_MESSAGE -{ - RPC_BINDING_HANDLE Handle; - ULONG DataRepresentation; - VOID* Buffer; - USHORT BufferLength; - USHORT ProcNum; - PRPC_SYNTAX_IDENTIFIER TransferSyntax; - VOID* RpcInterfaceInformation; - VOID* ReservedForRuntime; - RPC_MGR_EPV* ManagerEpv; - VOID* ImportContext; - ULONG RpcFlags; -} RPC_MESSAGE, *PRPC_MESSAGE; - -typedef VOID (*RPC_DISPATCH_FUNCTION)(PRPC_MESSAGE Message); - -typedef struct _RPC_DISPATCH_TABLE -{ - ULONG DispatchTableCount; - RPC_DISPATCH_FUNCTION* DispatchTable; - LONG Reserved; -} RPC_DISPATCH_TABLE, *PRPC_DISPATCH_TABLE; - -typedef struct _RPC_SERVER_INTERFACE -{ - ULONG Length; - RPC_SYNTAX_IDENTIFIER InterfaceId; - RPC_SYNTAX_IDENTIFIER TransferSyntax; - PRPC_DISPATCH_TABLE DispatchTable; - ULONG RpcProtseqEndpointCount; - PRPC_PROTSEQ_ENDPOINT RpcProtseqEndpoint; - RPC_MGR_EPV* DefaultManagerEpv; - VOID CONST* InterpreterInfo; - ULONG Flags; -} RPC_SERVER_INTERFACE, *PRPC_SERVER_INTERFACE; - -#endif /* __LIB_RPCRT4_INCLUDE_RPC_H */ diff --git a/reactos/lib/rpcrt4/include/rpcrt4/rpc.h b/reactos/lib/rpcrt4/include/rpcrt4/rpc.h deleted file mode 100644 index a7ce55e85be..00000000000 --- a/reactos/lib/rpcrt4/include/rpcrt4/rpc.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef __INCLUDE_RPCRT4_RPC_H -#define __INCLUDE_RPCRT4_RPC_H - -typedef void* RPC_BINDING_HANDLE; -typedef long RPC_STATUS; - -typedef ULONG RPC_PROTOCOL_ID; -typedef ULONG RPC_PROTSEQ_ID; - -typedef struct -{ - RPC_PROTSEQ_ID ProtseqId; - ULONG Len; - sockaddr_t sa; -} *PRPC_ADDR; - -typedef struct _RPC_PROTOCOL_VERSION -{ - ULONG MajorVersion; - ULONG MinorVersion; -} RPC_PROTOCOL_VERSION, *PRPC_PROTOCOL_VERSION; - -typedef struct _RPC_BINDING_REP -{ - LIST_ENTRY ListEntry; - RPC_PROTOCOL_ID ProtocolId; - LONG ReferenceCount; - UUID ObjectId; - PRPC_ADDR RpcAddr; - BOOLEAN IsServer; - BOOLEAN AddrIsDynamic; - PVOID AuthInfo; - ULONG ExtendedBindFlag; - ULONG BoundServerInstance; - ULONG AddrHasEndpoint; - LONG CallsInProgress; - PVOID NsSpecific; - PRPC_PROTOCOL_VERSION ProtocolVersion; -} RPC_BINDING_REP, *PRPC_BINDING_REP; - - - -#endif /* __INCLUDE_RPCRT4_RPC_H */ diff --git a/reactos/lib/rpcrt4/midl/Makefile b/reactos/lib/rpcrt4/midl/Makefile deleted file mode 100644 index 081075d0db7..00000000000 --- a/reactos/lib/rpcrt4/midl/Makefile +++ /dev/null @@ -1,54 +0,0 @@ -# $Id: Makefile,v 1.3 2003/08/07 04:03:23 royce Exp $ -# -# ReactOS Operating System -# -TARGET=midl - -CFLAGS = - -# require os code to explicitly request A/W version of structs/functions -CFLAGS += -D_DISABLE_TIDENTS - -all: midl$(EXE_POSTFIX) - -idl.tab.o: idl.y - bison -t -v -d idl.y - $(NATIVE_CC) -c idl.tab.c -o idl.tab.o - -lex.yy.o: idl.l idl.tab.h - flex idl.l - $(NATIVE_CC) -c lex.yy.c -o lex.yy.o - -midl.o: midl.c midl.h idl.tab.h - $(NATIVE_CC) -c midl.c -o midl.o - -option.o: option.c midl.h idl.tab.h - $(NATIVE_CC) -c option.c -o option.o - -interface.o: interface.c midl.h idl.tab.h - $(NATIVE_CC) -c interface.c -o interface.o - -types.o: types.c midl.h idl.tab.h types.h - $(NATIVE_CC) -c types.c -o types.o - -midl$(EXE_POSTFIX): idl.tab.o lex.yy.o midl.o option.o interface.o types.o - $(NATIVE_CC) midl.o idl.tab.o lex.yy.o option.o interface.o -lfl \ - types.o -o midl$(EXE_POSTFIX) - -include ../../../rules.mak - - - - - - - - - - - - - - - - diff --git a/reactos/lib/rpcrt4/midl/hello.idl b/reactos/lib/rpcrt4/midl/hello.idl deleted file mode 100644 index cffab05a5a6..00000000000 --- a/reactos/lib/rpcrt4/midl/hello.idl +++ /dev/null @@ -1,34 +0,0 @@ -[ -uuid(b574a080-aceb-11d3-95f9-aa43ded19f71), -version(1.0), -pointer_default(unique) -] -interface hello -{ - struct _hello_struct - { - int hello_member; - int hello1_member; - float hello3_member; - }; - - typedef struct _hello2_struct - { - int hello2_member; - } __hello2_struct; - - typedef struct - { - int hello3_member; - } hello3_typedef; - - typedef int hello_t; - - void Hello4Proc([in] hello3_typedef ii); - void Hello3Proc([in] __hello2_struct h); - void Hello2Proc([in] struct _hello_struct h); - void HelloProc([in] hello_t pszString); - void Shutdown(void); - void RpcBenchmark(handle_t Server, - [out, size_is(32768)] unsigned char* pcOutBuffer); -} diff --git a/reactos/lib/rpcrt4/midl/idl.l b/reactos/lib/rpcrt4/midl/idl.l deleted file mode 100644 index 8e1e3cd4a3f..00000000000 --- a/reactos/lib/rpcrt4/midl/idl.l +++ /dev/null @@ -1,114 +0,0 @@ -%{ -#include "midl.h" -#include "idl.tab.h" -#include - -int lineno = 1; -void yyerror(char* s); -char* current_file; -int nr_errors = 0; - -#define TOK(n) { yylval.token = n; return n; } - -%} - -DIGIT [0-9] -ID [a-zA-Z_][a-zA-Z0-9_]* -UUID [a-z0-9]* - -%% - -uuid { TOK(UUID_KEYWORD); } -version { TOK(VERSION_KEYWORD); } -pointer_default { TOK(POINTER_DEFAULT_KEYWORD); } -unique { TOK(UNIQUE_KEYWORD); } -interface { TOK(INTERFACE_KEYWORD); } -aggregatable { TOK(AGGREGATABLE_KEYWORD); } -allocate { TOK(ALLOCATE_KEYWORD); } -appobject { TOK(APPOBJECT_KEYWORD); } - - -all_nodes { TOK(ALL_NODES_KEYWORD); } -single_node { TOK(SINGLE_NODE_KEYWORD); } -free { TOK(FREE_KEYWORD); } -dont_free { TOK(DONT_FREE_KEYWORD); } - -typedef { TOK(TYPEDEF_KEYWORD); } -struct { TOK(STRUCT_KEYWORD); } -const { TOK(CONST_KEYWORD); } - -signed { TOK(SIGNED_KEYWORD); } -unsigned { TOK(UNSIGNED_KEYWORD); } - -in { TOK(IN_KEYWORD); } -out { TOK(OUT_KEYWORD); } -string { TOK(STRING_KEYWORD); } -implicit_handle { TOK(IMPLICIT_HANDLE_KEYWORD); } -auto_handle { TOK(AUTO_HANDLE_KEYWORD); } -size_is { TOK(SIZE_IS_KEYWORD); } -length_is { TOK(LENGTH_IS_KEYWORD); } - -{ID} { int n; - if ((n = token_to_type(yytext)) != 0) - { - yylval.tval = n; - return(TYPE_KEYWORD); - } - else - { - yylval.id = strdup(yytext); - return(ID_TOKEN); - } - } - -{DIGIT}+ { yylval.number = atoi(yytext); - return(NUMBER_TOKEN); } - -{DIGIT}+"."{DIGIT}+ { char* ebuf; - yylval.version.major = strtoul(yytext, &ebuf, 0); - yylval.version.minor = strtoul(ebuf + 1, NULL, 0); - return(VERSION_TOKEN); } - -{UUID}+"-"{UUID}+"-"{UUID}+"-"{UUID}+"-"{UUID}+ { yylval.uuid = strdup(yytext); - return(UUID_TOKEN); } - -";" { TOK(LINE_TERMINATOR); } - -"(" { TOK(LEFT_BRACKET); } - -")" { TOK(RIGHT_BRACKET); } - -"," { TOK(COMMA); } - -"{" { TOK(LCURLY_BRACKET); } - -"}" { TOK(RCURLY_BRACKET); } - -"[" { TOK(LSQBRACKET); } - -"]" { TOK(RSQBRACKET); } - -"*" { TOK(STAR); } - -"=" { TOK(ASSIGNMENT); } - -\n lineno++; - -[ \t\r]+ ; - -. yyerror("invalid character"); - -%% - -void yyerror(char* s) -{ - nr_errors++; - printf("%s:%d: %s at %s\n", current_file, lineno, s, yytext); -} - -void yyerror1(char* s) -{ - nr_errors++; - printf("%s:%d: %s\n", current_file, lineno, s); -} - diff --git a/reactos/lib/rpcrt4/midl/idl.y b/reactos/lib/rpcrt4/midl/idl.y deleted file mode 100644 index e6b929ee781..00000000000 --- a/reactos/lib/rpcrt4/midl/idl.y +++ /dev/null @@ -1,201 +0,0 @@ -%{ -#include "midl.h" -%} - -%union { -int tval; -int token; -char* id; -int number; -char* uuid; -char operator; -char* string; -struct -{ -int minor; -int major; -} version; -} - -%token ID_LITERAL -%token UUID_LITERAL -%token NUMBER_LITERAL -%token VERSION_LITERAL -%token STRING_LITERAL - -%token ENDPOINT_KEYWORD -%token EXCEPTIONS_KEYWORD -%token LOCAL_KEYWORD -%token IMPORT_KEYWORD - -%token UUID_KEYWORD -%token VERSION_KEYWORD -%token POINTER_DEFAULT_KEYWORD -%token UNIQUE_KEYWORD -%token INTERFACE_KEYWORD -%token IMPLICIT_HANDLE_KEYWORD -%token AUTO_HANDLE_KEYWORD -%token AGGREGATABLE_KEYWORD -%token ALLOCATE_KEYWORD -%token APPOBJECT_KEYWORD - -%token ALL_NODES_KEYWORD -%token SINGLE_NODE_KEYWORD -%token FREE_KEYWORD -%token DONT_FREE_KEYWORD - -%token TYPEDEF_KEYWORD -%token STRUCT_KEYWORD -%token CONST_KEYWORD - -%token IN_KEYWORD -%token OUT_KEYWORD -%token STRING_KEYWORD -%token SIZE_IS_KEYWORD -%token LENGTH_IS_KEYWORD - -%token UNSIGNED_KEYWORD -%token SIGNED_KEYWORD - -%token LSQBRACKET, RSQBRACKET, LBRACKET, RBRACKET -%token LCURLY_BRACKET, RCURLY_BRACKET, LINE_TERMINATOR, COMMA -%token LEFT_BRACKET, RIGHT_BRACKET -%token STAR -%token ASSIGNMENT - -%token TYPE_KEYWORD - -%type type -%type sign -%type struct_def - -%% - -idl_file: - LSQBRACKET options RSQBRACKET interface - ; - -options: - option - | option COMMA options - ; - -option: - UUID_KEYWORD LEFT_BRACKET UUID_TOKEN RIGHT_BRACKET - { set_uuid($3); } - | VERSION_KEYWORD LEFT_BRACKET VERSION_TOKEN RIGHT_BRACKET - { set_version($3.major, $3.minor); } - | ENDPOINT_KEYWORD LEFT_BRACKET port_specs RIGHT_BRACKET - | EXCEPTIONS_KEYWORD LEFT_BRACKET excep_names RIGHT_BRACKET - | LOCAL_KEYWORD - | POINTER_DEFAULT_KEYWORD LEFT_BRACKET UNIQUE_KEYWORD RIGHT_BRACKET - { set_pointer_default($3); } - ; - -port_specs: - | STRING_TOKEN COMMA port_specs - ; - -excep_names: ID_TOKEN { } - | ID_TOKEN COMMA excep_names { } - ; - -interface: { start_interface(); } - INTERFACE_KEYWORD ID_TOKEN LCURLY_BRACKET interface_components - RCURLY_BRACKET - { end_interface($3); } - -interface_components: - | interface_component LINE_TERMINATOR interface_components - -interface_component: - | IMPORT_KEYWORD import_list - | function - | TYPEDEF_KEYWORD typedef - | CONST_KEYWORD type ID_TOKEN ASSIGNMENT const_expr - | STRUCT_KEYWORD struct_def RCURLY_BRACKET - ; - -import_list: STRING_TOKEN - | STRING_TOKEN COMMA import_list - ; - -const_expr: NUMBER_TOKEN - | STRING_TOKEN - ; - - - -typedef: type ID_TOKEN { add_typedef($2, $1); }; - -function: { start_function(); } - type ID_TOKEN LEFT_BRACKET argument_list RIGHT_BRACKET - { end_function($2, $3); } - ; - -argument_list: - | TYPE_KEYWORD { if ($1 != VOID_TYPE) - { - yyerror("parameter name ommitted"); - } - } - | argument - | argument COMMA argument_list - ; - -argument: arg_attrs type ID_TOKEN { add_argument($2, $3); } - | type ID_TOKEN { add_argument($1, $2); } - ; - -type: sign TYPE_KEYWORD STAR { $$ = $2 | POINTER_TYPE_OPTION | $1; } - | sign TYPE_KEYWORD { $$ = $2 | $1; } - | TYPE_KEYWORD { $$ = $1; } - | TYPE_KEYWORD STAR { $$ = $1 | POINTER_TYPE_OPTION; } - | STRUCT_KEYWORD struct_def RCURLY_BRACKET { $$ = $2; } - | STRUCT_KEYWORD ID_TOKEN { $$ = struct_to_type($2); } - ; - -struct_def: ID_TOKEN { start_struct($1); } LCURLY_BRACKET - struct_members { $$ = end_struct(); } - | { start_struct(NULL); } LCURLY_BRACKET - struct_members { $$ = end_struct(); } - ; - -struct_members: - | type ID_TOKEN LINE_TERMINATOR struct_members - { add_struct_member($2, $1); } - ; - -/* - * Rules for the optional sign for an integer type - */ -sign: UNSIGNED_KEYWORD { $$ = UNSIGNED_TYPE_OPTION; } - | SIGNED_KEYWORD { $$ = SIGNED_TYPE_OPTION; } - ; - -arg_attrs: LSQBRACKET arg_attr_list RSQBRACKET - ; - -/* - * Rules for the list of attributes for arguments - */ -arg_attr_list: arg_attr - | arg_attr COMMA arg_attr_list - ; - -/* - * Rules for the various attributes for arguments - */ -arg_attr: IN_KEYWORD - | OUT_KEYWORD - | STRING_KEYWORD - | LENGTH_IS_KEYWORD BRACKETED_QUANTITY - | SIZE_IS_KEYWORD BRACKETED_QUANTITY - ; - -/* - * - */ -BRACKETED_QUANTITY: LEFT_BRACKET NUMBER_TOKEN RIGHT_BRACKET - | LEFT_BRACKET ID_TOKEN RIGHT_BRACKET - ; diff --git a/reactos/lib/rpcrt4/midl/interface.c b/reactos/lib/rpcrt4/midl/interface.c deleted file mode 100644 index 21eee4500ea..00000000000 --- a/reactos/lib/rpcrt4/midl/interface.c +++ /dev/null @@ -1,74 +0,0 @@ -#include -#include -#include - -#include "midl.h" -#include "idl.tab.h" - -static interface* current_interface; -static function* current_function; - -void add_argument(int type, char* name) -{ - argument* arg; - - arg = malloc(sizeof(argument)); - - arg->type = type; - arg->name = strdup(name); - - arg->next = current_function->arguments; - current_function->arguments = arg; -} - -void start_interface(void) -{ - current_interface = (interface *)malloc(sizeof(interface)); -} - -void start_function(void) -{ - function* f; - - f = (function *)malloc(sizeof(function)); - - f->arguments = NULL; - - f->next = current_interface->function_list; - current_interface->function_list = f; - current_function = f; -} - -void end_function(int rtype, char* name) -{ - current_function->return_type = rtype; - current_function->name = strdup(name); -} - -void end_interface(char* name) -{ - function* cur; - argument* a; - - printf("interface_name: %s\n", name); - - current_interface->name = strdup(name); - cur = current_interface->function_list; - while (cur != NULL) - { - print_type(cur->return_type); - printf(" function_name: %s (\n", cur->name, cur); - - a = cur->arguments; - while (a != NULL) - { - printf("\t"); - print_type(a->type); - printf(" %s\n", a->name); - a = a->next; - } - printf(")\n"); - - cur = cur->next; - } -} diff --git a/reactos/lib/rpcrt4/midl/midl.c b/reactos/lib/rpcrt4/midl/midl.c deleted file mode 100644 index d105bc4d90c..00000000000 --- a/reactos/lib/rpcrt4/midl/midl.c +++ /dev/null @@ -1,79 +0,0 @@ -#include -#include -#include -#include -#include - -extern FILE* yyin; -extern int yyparse(void); -extern int yydebug; -extern int nr_errors; -extern char* current_file; - -int main(int argc, char* argv[]) -{ - int fd; - char* tempname; - int n, p, status; - char* args[9]; - - if (argc == 1) - { - printf("Not enough arguments\n"); - exit(1); - } - - tempname = tempnam(NULL, "midl"); - - args[0] = strdup("/usr/bin/gcc"); - args[1] = strdup("-x"); - args[2] = strdup("c"); - args[3] = strdup("-P"); - args[4] = strdup("-E"); - args[5] = strdup(argv[1]); - args[6] = strdup("-o"); - args[7] = strdup(tempname); - args[8] = NULL; - - if ((n = fork()) == 0) - { - execv("/usr/bin/gcc", args); - perror("gcc"); - exit(1); - } - else if (n == -1) - { - perror("midl"); - exit(1); - } - - p = waitpid(n, &status, WUNTRACED); - if (p == -1 || p == 0 || !WIFEXITED(status)) - { - perror("midl"); - exit(1); - } - if (WEXITSTATUS(status) != 0) - { - printf("midl: the preprocessor %s failed\n"); - exit(1); - } - -// yydebug = 1; - - yyin = fopen(tempname, "r+b"); - if (yyin == NULL) - { - perror(argv[1]); - exit(1); - } - - current_file = strdup(argv[1]); - - if (yyparse() != 0 || nr_errors > 0) - { - exit(1); - } - - unlink(tempname); -} diff --git a/reactos/lib/rpcrt4/midl/midl.h b/reactos/lib/rpcrt4/midl/midl.h deleted file mode 100644 index 582a771d2c2..00000000000 --- a/reactos/lib/rpcrt4/midl/midl.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef __MIDL_H -#define __MIDL_H - -#include "types.h" - -typedef struct _argument -{ - int type; - char* name; - struct _argument* next; -} argument; - -typedef struct _function -{ - int return_type; - char* name; - argument* arguments; - struct _function* next; -} function; - -typedef struct -{ - char* name; - function* function_list; -} interface; - -void set_uuid(char* uuid); -void set_version(int major, int minor); -void set_pointer_default(int option); - -void start_interface(void); -void end_interface(char* name); -void start_function(void); -void end_function(int rtype, char* name); -void add_argument(int type, char* name); - -#endif __MIDL_H diff --git a/reactos/lib/rpcrt4/midl/option.c b/reactos/lib/rpcrt4/midl/option.c deleted file mode 100644 index a2427cbf067..00000000000 --- a/reactos/lib/rpcrt4/midl/option.c +++ /dev/null @@ -1,16 +0,0 @@ -#include - -#include "midl.h" -#include "idl.tab.h" - -void set_uuid(char* uuid) -{ -} - -void set_version(int major, int minor) -{ -} - -void set_pointer_default(int option) -{ -} diff --git a/reactos/lib/rpcrt4/midl/types.c b/reactos/lib/rpcrt4/midl/types.c deleted file mode 100644 index f45e328505e..00000000000 --- a/reactos/lib/rpcrt4/midl/types.c +++ /dev/null @@ -1,190 +0,0 @@ -#include -#include -#include - -#include "midl.h" - -struct _type; - -typedef struct _struct_member -{ - char* name; - unsigned int value; - struct _struct_member* next; -} struct_member; - -typedef struct -{ - struct_member* member_list; - char* tag; - struct _type* type_value; -} struct_type; - -typedef struct _type -{ - char* name; - unsigned int value; - unsigned int default_sign; - struct_type* struct_desc; -} type; - -static struct_type struct_types[255]; - -static int next_struct_slot_free = 0; -static struct_type* current_struct; - -static type types[255] = { - {NULL, 0, 0}, - {"boolean", BOOLEAN_TYPE, UNSIGNED_TYPE_OPTION}, - {"byte", BYTE_TYPE, 0}, - {"char", CHAR_TYPE, UNSIGNED_TYPE_OPTION}, - {"double", DOUBLE_TYPE, 0}, - {"enum", ENUM_TYPE, 0}, - {"error_status_t", ERROR_STATUS_TYPE, UNSIGNED_TYPE_OPTION}, - {"float", FLOAT_TYPE, 0}, - {"handle_t", HANDLE_TYPE, 0}, - {"hyper", HYPER_TYPE, SIGNED_TYPE_OPTION}, - {"int", INT_TYPE, SIGNED_TYPE_OPTION}, - {"__int32", INT32_TYPE, SIGNED_TYPE_OPTION}, - {"__int3264", INT32OR64_TYPE, SIGNED_TYPE_OPTION}, - {"__int64", INT64_TYPE, SIGNED_TYPE_OPTION}, - {"long", LONG_TYPE, SIGNED_TYPE_OPTION}, - {"short", SHORT_TYPE, SIGNED_TYPE_OPTION}, - {"small", SMALL_TYPE, SIGNED_TYPE_OPTION}, - {"void", VOID_TYPE, 0}, - {"wchar_t", WCHAR_TYPE, UNSIGNED_TYPE_OPTION}, - {NULL, 0, 0} - }; - -static int next_free_slot = 18; - -unsigned int struct_to_type(char* tag) -{ - int i; - - for (i = 0; i < next_struct_slot_free; i++) - { - if (strcmp(tag, struct_types[i].tag) == 0) - { - return(struct_types[i].type_value->value); - } - } - return(0); -} - -void start_struct(char* tag) -{ - char* name; - - if (tag == NULL) - { - tag = malloc(255); - sprintf(tag, "__unnamed_struct%d", next_struct_slot_free); - } - - name = malloc(strlen("struct ") + strlen(tag) + 1); - strcpy(name, "struct "); - strcat(name, tag); - - struct_types[next_struct_slot_free].tag = strdup(tag); - struct_types[next_struct_slot_free].member_list = NULL; - current_struct = &struct_types[next_struct_slot_free]; - - types[next_free_slot].name = name; - types[next_free_slot].value = next_free_slot << 8; - types[next_free_slot].default_sign = 0; - types[next_free_slot].struct_desc = - &struct_types[next_struct_slot_free]; - - struct_types[next_struct_slot_free].type_value = &types[next_free_slot]; - - next_struct_slot_free++; - next_free_slot++; -} - -void add_struct_member(char* name, unsigned int type) -{ - struct_member* member; - - member = malloc(sizeof(struct_member)); - - member->name = strdup(name); - member->value = type; - member->next = current_struct->member_list; - current_struct->member_list = member; -} - -unsigned int end_struct(void) -{ - int n; - struct_member* cur; - - printf("Defining struct %s {\n", current_struct->tag); - - cur = current_struct->member_list; - while (cur != NULL) - { - print_type(cur->value); - printf(" %s\n", cur->name); - - cur = cur->next; - } - printf("}\n"); - - n = current_struct->type_value->value; - current_struct = NULL; - return(n); -} - -void add_typedef(char* name, int type) -{ - printf("Adding typedef %s to ", name); - print_type(type); - printf("\n"); - - types[next_free_slot].name = strdup(name); - types[next_free_slot].value = type; - types[next_free_slot].default_sign = 0; - next_free_slot++; -} - -void print_type(int tval) -{ - int i; - - for (i = 1; i < next_free_slot; i++) - { - if ((tval & BASE_TYPE_MASK) == types[i].value) - { - if (tval & UNSIGNED_TYPE_OPTION) - { - printf("unsigned "); - } - if (tval & SIGNED_TYPE_OPTION) - { - printf("signed "); - } - printf("%s", types[i].name); - if (tval & POINTER_TYPE_OPTION) - { - printf("*"); - } - return; - } - } - printf("unknown type"); -} - -int token_to_type(char* token) -{ - int i; - - for (i = 1; i < next_free_slot; i++) - { - if (strcmp(types[i].name, token) == 0) - { - return(types[i].value); - } - } - return(0); -} diff --git a/reactos/lib/rpcrt4/midl/types.h b/reactos/lib/rpcrt4/midl/types.h deleted file mode 100644 index b55635878bc..00000000000 --- a/reactos/lib/rpcrt4/midl/types.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef __TYPES_H -#define __TYPES_H - -#define BASE_TYPE_MASK (~0xff) - -#define BOOLEAN_TYPE (0x100) -#define BYTE_TYPE (0x200) -#define CHAR_TYPE (0x300) -#define DOUBLE_TYPE (0x400) -#define ERROR_STATUS_TYPE (0x500) -#define FLOAT_TYPE (0x600) -#define HANDLE_TYPE (0x700) -#define HYPER_TYPE (0x800) -#define INT_TYPE (0x900) -#define INT32_TYPE (0xA00) -#define INT32OR64_TYPE (0xB00) -#define INT64_TYPE (0xC00) -#define LONG_TYPE (0xD00) -#define SHORT_TYPE (0xE00) -#define SMALL_TYPE (0xF00) -#define VOID_TYPE (0x1000) -#define WCHAR_TYPE (0x1100) - -#define UNSIGNED_TYPE_OPTION (0x1) -#define SIGNED_TYPE_OPTION (0x2) -#define POINTER_TYPE_OPTION (0x4) - -#define IN_TYPE_OPTION (0x8) -#define OUT_TYPE_OPTION (0x10) -#define STRING_TYPE_OPTION (0x20) - -int token_to_type(char* token); -void print_type(int tval); -void add_typedef(char* name, int type); - -void start_struct(char* tag); -void add_struct_member(char* name, unsigned int type); -unsigned int end_struct(void); - -unsigned int struct_to_type(char* tag); - -#endif From 311d1ab004cb20331cca75fd9396d23838530631 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Tue, 4 May 2004 20:18:52 +0000 Subject: [PATCH 1039/1463] Added Spinlock in ObpGetHandleCountbyHandleTable. svn path=/trunk/; revision=9306 --- reactos/ntoskrnl/ob/handle.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/ob/handle.c b/reactos/ntoskrnl/ob/handle.c index 68f51ee56df..edd5a8a64a8 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.55 2004/05/02 04:40:25 jimtabor Exp $ +/* $Id: handle.c,v 1.56 2004/05/04 20:18:52 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -957,8 +957,12 @@ unsigned int i, Count=0; PHANDLE_BLOCK blk; POBJECT_HEADER Header; PVOID ObjectBody; +KIRQL oldIrql; + PLIST_ENTRY current = HandleTable->ListHead.Flink; + KeAcquireSpinLock(&HandleTable->ListLock, &oldIrql); + while (current != &HandleTable->ListHead) { blk = CONTAINING_RECORD(current, HANDLE_BLOCK, entry); @@ -977,6 +981,7 @@ PLIST_ENTRY current = HandleTable->ListHead.Flink; } current = current->Flink; } + KeReleaseSpinLock(&HandleTable->ListLock, oldIrql); return (Count); } From 857e0edb824dc28c6b1d5b66b6187b15927b8f79 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Tue, 4 May 2004 21:16:51 +0000 Subject: [PATCH 1040/1463] - Fix recognition of CALL instruction. Spotted by Anich Gregor. svn path=/trunk/; revision=9307 --- reactos/ntoskrnl/dbg/kdb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/dbg/kdb.c b/reactos/ntoskrnl/dbg/kdb.c index a34af18ee19..39e7187fbf5 100644 --- a/reactos/ntoskrnl/dbg/kdb.c +++ b/reactos/ntoskrnl/dbg/kdb.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: kdb.c,v 1.21 2004/03/15 17:32:47 hbirr Exp $ +/* $Id: kdb.c,v 1.22 2004/05/04 21:16:51 navaraf Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/dbg/kdb.c @@ -674,7 +674,7 @@ DbgStepOver(ULONG Argc, PCH Argv[], PKTRAP_FRAME Tf) Eip++; } if (Eip[0] == 0xE8 || Eip[0] == 0x9A || Eip[0] == 0xF2 || Eip[0] == 0xF3 || - (Eip[0] == 0xFF && (Eip[1] & 0x3C) == 0x10)) + (Eip[0] == 0xFF && (Eip[1] & 0x38) == 0x10)) { ULONG NextInst = Tf->Eip + KdbGetInstLength(Tf->Eip); KdbLastSingleStepFrom = Tf->Eip; From 2ff07f4497c9090fdac917b13a6dec63fed47551 Mon Sep 17 00:00:00 2001 From: Mike Nordell Date: Wed, 5 May 2004 02:00:01 +0000 Subject: [PATCH 1041/1463] Return reasonably correct result querying a null memory area. Still a TODO left. svn path=/trunk/; revision=9308 --- reactos/ntoskrnl/mm/virtual.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/virtual.c b/reactos/ntoskrnl/mm/virtual.c index b6c586d4b8e..6b7af5c5831 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.72 2004/04/10 22:35:26 gdalsnes Exp $ +/* $Id: virtual.c,v 1.73 2004/05/05 02:00:01 tamlin Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/virtual.c @@ -157,6 +157,15 @@ NtQueryVirtualMemory (IN HANDLE ProcessHandle, { Info->State = MEM_FREE; 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)0x70000000) ? 0 : 0x10000; + Info->Protect = PAGE_NOACCESS; + Info->Type = 0; Status = STATUS_SUCCESS; ResultLength = sizeof(MEMORY_BASIC_INFORMATION); } From 34d4fe2efd4c1ca77fdfc9e2a0188257fe13c887 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 5 May 2004 13:58:59 +0000 Subject: [PATCH 1042/1463] support the WS_EX_LEFTSCROLLBAR svn path=/trunk/; revision=9309 --- reactos/subsys/win32k/ntuser/scrollbar.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/scrollbar.c b/reactos/subsys/win32k/ntuser/scrollbar.c index bc66df80b60..5df20efdf12 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.30 2004/04/17 11:00:14 weiden Exp $ +/* $Id: scrollbar.c,v 1.31 2004/05/05 13:58:59 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -89,9 +89,17 @@ IntGetScrollBarRect (PWINDOW_OBJECT Window, INT nBar, PRECT lprect) break; case SB_VERT: - lprect->left = ClientRect.right - WindowRect.left; + if(Window->ExStyle & WS_EX_LEFTSCROLLBAR) + { + lprect->right = ClientRect.left - WindowRect.left; + lprect->left = lprect->right - NtUserGetSystemMetrics(SM_CXVSCROLL); + } + else + { + lprect->left = ClientRect.right - WindowRect.left; + lprect->right = lprect->left + NtUserGetSystemMetrics(SM_CXVSCROLL); + } lprect->top = ClientRect.top - WindowRect.top; - lprect->right = lprect->left + NtUserGetSystemMetrics(SM_CXVSCROLL); lprect->bottom = ClientRect.bottom - WindowRect.top; vertical = TRUE; break; From 233a41e6969c171aeccdd4e2f6dec417ba753d49 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Wed, 5 May 2004 15:29:15 +0000 Subject: [PATCH 1043/1463] Implement AddItemW(). svn path=/trunk/; revision=9310 --- reactos/lib/userenv/desktop.c | 193 ++++++++++++++++++++++++++++++- reactos/lib/userenv/userenv.def | 2 + reactos/lib/userenv/userenv.edf | 2 + reactos/w32api/include/userenv.h | 4 + 4 files changed, 196 insertions(+), 5 deletions(-) diff --git a/reactos/lib/userenv/desktop.c b/reactos/lib/userenv/desktop.c index f842e2a504a..04fd343216a 100644 --- a/reactos/lib/userenv/desktop.c +++ b/reactos/lib/userenv/desktop.c @@ -1,4 +1,4 @@ -/* $Id: desktop.c,v 1.4 2004/05/04 13:11:22 ekohl Exp $ +/* $Id: desktop.c,v 1.5 2004/05/05 15:29:15 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -153,6 +153,8 @@ AddDesktopItemW (BOOL bCommonDesktop, WCHAR szLinkPath[MAX_PATH]; WCHAR szArguments[MAX_PATH]; WCHAR szCommand[MAX_PATH]; + WIN32_FIND_DATA FindData; + HANDLE hFind; LPWSTR Ptr; DWORD dwLength; IShellLinkW* psl; @@ -169,11 +171,26 @@ AddDesktopItemW (BOOL bCommonDesktop, DPRINT1 ("GetDesktopPath() failed\n"); return FALSE; } - DPRINT ("Desktop path: '%S'\n", szLinkPath); - /* FIXME: Make sure the path exists */ + /* Make sure the path exists */ + hFind = FindFirstFileW (szLinkPath, + &FindData); + if (hFind == INVALID_HANDLE_VALUE) + { + DPRINT1 ("'%S' does not exist\n", szLinkPath); + /* FIXME: create directory path */ + if (!CreateDirectoryW (szLinkPath, NULL)) + return FALSE; + } + else + { + DPRINT1 ("'%S' exists\n", szLinkPath); + FindClose (hFind); + } + + /* Append backslash, item name and ".lnk" extension */ wcscat (szLinkPath, L"\\"); wcscat (szLinkPath, lpItemName); wcscat (szLinkPath, L".lnk"); @@ -329,7 +346,7 @@ CreateGroupW (LPCWSTR lpGroupName, wcscat (szGroupPath, lpGroupName); DPRINT ("Group path: '%S'\n", szGroupPath); - /* FIXME: Create nested directories */ + /* FIXME: Create directory path */ if (!CreateDirectoryW (szGroupPath, NULL)) return FALSE; @@ -372,7 +389,7 @@ DeleteGroupW (LPCWSTR lpGroupName, wcscat (szGroupPath, lpGroupName); DPRINT ("Group path: '%S'\n", szGroupPath); - /* FIXME: Remove nested directories */ + /* FIXME: Remove directory path */ if (!RemoveDirectoryW (szGroupPath)) return FALSE; @@ -384,6 +401,171 @@ DeleteGroupW (LPCWSTR lpGroupName, } +BOOL WINAPI +AddItemA (LPCSTR lpGroupName, + BOOL bCommonGroup, + LPCSTR lpItemName, + LPCSTR lpArguments, + LPCSTR lpIconLocation, + INT iIcon, + LPCSTR lpWorkingDirectory, + WORD wHotKey, + INT iShowCmd) +{ + DPRINT1 ("AddItemA() not implemented!\n"); + return FALSE; +} + + +BOOL WINAPI +AddItemW (LPCWSTR lpGroupName, + BOOL bCommonGroup, + LPCWSTR lpItemName, + LPCWSTR lpArguments, + LPCWSTR lpIconLocation, + INT iIcon, + LPCWSTR lpWorkingDirectory, + WORD wHotKey, + INT iShowCmd) +{ + WCHAR szLinkPath[MAX_PATH]; + WCHAR szArguments[MAX_PATH]; + WCHAR szCommand[MAX_PATH]; + WIN32_FIND_DATA FindData; + HANDLE hFind; + LPWSTR Ptr; + DWORD dwLength; + IShellLinkW* psl; + IPersistFile* ppf; + HRESULT hr; + BOOL bResult; + + DPRINT ("AddDesktopItemW() called\n"); + + bResult = FALSE; + + if (!GetProgramsPath (bCommonGroup, szLinkPath)) + { + DPRINT1 ("GetProgramsPath() failed\n"); + return FALSE; + } + + DPRINT ("Programs path: '%S'\n", szLinkPath); + + if (lpGroupName != NULL && *lpGroupName != 0) + { + wcscat (szLinkPath, L"\\"); + wcscat (szLinkPath, lpGroupName); + + /* Make sure the path exists */ + hFind = FindFirstFileW (szLinkPath, + &FindData); + if (hFind == INVALID_HANDLE_VALUE) + { + DPRINT ("'%S' does not exist\n", szLinkPath); + if (!CreateGroupW (lpGroupName, + bCommonGroup)) + return FALSE; + } + else + { + DPRINT ("'%S' exists\n", szLinkPath); + FindClose (hFind); + } + } + + wcscat (szLinkPath, L"\\"); + wcscat (szLinkPath, lpItemName); + wcscat (szLinkPath, L".lnk"); + DPRINT ("Link path: '%S'\n", szLinkPath); + + /* Split 'lpArguments' string into command and arguments */ + Ptr = wcschr (lpArguments, L' '); + DPRINT ("Ptr %p lpArguments %p\n", Ptr, lpArguments); + if (Ptr != NULL) + { + dwLength = (DWORD)(Ptr - lpArguments); + DPRINT ("dwLength %lu\n", dwLength); + memcpy (szCommand, lpArguments, dwLength * sizeof(WCHAR)); + szCommand[dwLength] = 0; + Ptr++; + wcscpy (szArguments, Ptr); + } + else + { + wcscpy (szCommand, lpArguments); + szArguments[0] = 0; + } + DPRINT ("szCommand: '%S'\n", szCommand); + DPRINT ("szArguments: '%S'\n", szArguments); + + CoInitialize(NULL); + + hr = CoCreateInstance(&CLSID_ShellLink, + NULL, + CLSCTX_INPROC_SERVER, + &IID_IShellLinkW, + (LPVOID*)&psl); + if (!SUCCEEDED(hr)) + { + CoUninitialize(); + return FALSE; + } + + hr = psl->lpVtbl->QueryInterface(psl, + &IID_IPersistFile, + (LPVOID*)&ppf); + if (SUCCEEDED(hr)) + { + psl->lpVtbl->SetDescription(psl, + lpItemName); + + psl->lpVtbl->SetPath(psl, + szCommand); + + psl->lpVtbl->SetArguments(psl, + szArguments); + + psl->lpVtbl->SetIconLocation(psl, + lpIconLocation, + iIcon); + + if (lpWorkingDirectory != NULL) + { + psl->lpVtbl->SetWorkingDirectory(psl, + lpWorkingDirectory); + } + else + { + psl->lpVtbl->SetWorkingDirectory(psl, + L"%HOMEDRIVE%%HOMEPATH%"); + } + + psl->lpVtbl->SetHotkey(psl, + wHotKey); + + psl->lpVtbl->SetShowCmd(psl, + iShowCmd); + + hr = ppf->lpVtbl->Save(ppf, + szLinkPath, + TRUE); + if (SUCCEEDED(hr)) + bResult = TRUE; + + ppf->lpVtbl->Release(ppf); + } + + psl->lpVtbl->Release(psl); + + CoUninitialize(); + + DPRINT ("AddDesktopItemW() done\n"); + + return bResult; +} + + BOOL WINAPI DeleteItemA (LPCSTR lpGroupName, BOOL bCommonGroup, @@ -436,6 +618,7 @@ DeleteItemW (LPCWSTR lpGroupName, return TRUE; *Ptr = 0; + DPRINT ("Item path: '%S'\n", szItemPath); if (RemoveDirectoryW (szItemPath)) { /* FIXME: Notify the shell */ diff --git a/reactos/lib/userenv/userenv.def b/reactos/lib/userenv/userenv.def index 9e76dec868f..5536bf26be0 100644 --- a/reactos/lib/userenv/userenv.def +++ b/reactos/lib/userenv/userenv.def @@ -5,6 +5,8 @@ CreateGroupA@8 @101 NONAME CreateGroupW@8 @102 NONAME DeleteGroupA@8 @103 NONAME DeleteGroupW@8 @104 NONAME +AddItemA@36 @105 NONAME +AddItemW@36 @106 NONAME DeleteItemA@16 @107 NONAME DeleteItemW@16 @108 NONAME CreateUserProfileA@8 @109 NONAME diff --git a/reactos/lib/userenv/userenv.edf b/reactos/lib/userenv/userenv.edf index 05b97575bcb..7644d15cbe0 100644 --- a/reactos/lib/userenv/userenv.edf +++ b/reactos/lib/userenv/userenv.edf @@ -5,6 +5,8 @@ CreateGroupA=CreateGroupA@8 @101 NONAME CreateGroupW=CreateGroupW@8 @102 NONAME DeleteGroupA=DeleteGroupA@8 @103 NONAME DeleteGroupW=DeleteGroupW@8 @104 NONAME +AddItemA=AddItemA@36 @105 NONAME +AddItemW=AddItemW@36 @106 NONAME DeleteItemA=DeleteItemA@16 @107 NONAME DeleteItemW=DeleteItemW@16 @108 NONAME CreateUserProfileA=CreateUserProfileA@8 @109 NONAME diff --git a/reactos/w32api/include/userenv.h b/reactos/w32api/include/userenv.h index bd836e92d30..003ff700059 100644 --- a/reactos/w32api/include/userenv.h +++ b/reactos/w32api/include/userenv.h @@ -48,6 +48,8 @@ BOOL WINAPI CreateGroupA (LPCSTR, BOOL); BOOL WINAPI CreateGroupW (LPCWSTR, BOOL); BOOL WINAPI DeleteGroupA (LPCSTR, BOOL); BOOL WINAPI DeleteGroupW (LPCWSTR, BOOL); +BOOL WINAPI AddItemA (LPCSTR, BOOL, LPCSTR, LPCSTR, LPCSTR, INT, LPCSTR, WORD, INT); +BOOL WINAPI AddItemW (LPCWSTR, BOOL, LPCWSTR, LPCWSTR, LPCWSTR, INT, LPCWSTR, WORD, INT); BOOL WINAPI DeleteItemA (LPCSTR, BOOL, LPCSTR, BOOL); BOOL WINAPI DeleteItemW (LPCWSTR, BOOL, LPCWSTR, BOOL); /* end private */ @@ -76,6 +78,7 @@ typedef LPPROFILEINFOW LPPROFILEINFO; #define DeleteDesktopItem DeleteDesktopItemW #define CreateGroup CreateGroupW #define DeleteGroup DeleteGroupW +#define AddItem AddItemW #define DeleteItem DeleteItemW /* end private */ #define LoadUserProfile LoadUserProfileW @@ -92,6 +95,7 @@ typedef LPPROFILEINFOA LPPROFILEINFO; #define DeleteDesktopItem DeleteDesktopItemA #define CreateGroup CreateGroupA #define DeleteGroup DeleteGroupA +#define AddItem AddItemA #define DeleteItem DeleteItemA /* end private */ #define LoadUserProfile LoadUserProfileA From 65093d7a1e1e4c9267253b4630e888cd780b04a3 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Wed, 5 May 2004 18:30:13 +0000 Subject: [PATCH 1044/1463] - Compile RPCRT4 without debug messages. svn path=/trunk/; revision=9311 --- reactos/lib/rpcrt4/Makefile.ros-template | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/rpcrt4/Makefile.ros-template b/reactos/lib/rpcrt4/Makefile.ros-template index 4bc0f162c7f..c42d3e65d3e 100644 --- a/reactos/lib/rpcrt4/Makefile.ros-template +++ b/reactos/lib/rpcrt4/Makefile.ros-template @@ -1,10 +1,10 @@ -# $Id: Makefile.ros-template,v 1.1 2004/05/04 20:06:26 navaraf Exp $ +# $Id: Makefile.ros-template,v 1.2 2004/05/05 18:30:13 navaraf Exp $ TARGET_NAME = rpcrt4 TARGET_OBJECTS = @C_SRCS@ -TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ -Wall -DDBG -DYDEBUG +TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ -Wall TARGET_SDKLIBS = @IMPORTS@ winmm.a libwine.a wine_uuid.a ntdll.a From 333e6a58cb5f693998a27c9c74ad988e3f8e2c99 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Wed, 5 May 2004 18:30:16 +0000 Subject: [PATCH 1045/1463] - Fixed various problems (hangs/crashes) with connecting, disconnecting and closing named pipes. svn path=/trunk/; revision=9312 --- reactos/drivers/fs/np/create.c | 423 +++++++++++++++------------------ reactos/drivers/fs/np/fsctrl.c | 25 +- reactos/drivers/fs/np/npfs.h | 5 +- reactos/drivers/fs/np/rw.c | 4 +- 4 files changed, 215 insertions(+), 242 deletions(-) diff --git a/reactos/drivers/fs/np/create.c b/reactos/drivers/fs/np/create.c index eb41a770268..5232a9b8d35 100644 --- a/reactos/drivers/fs/np/create.c +++ b/reactos/drivers/fs/np/create.c @@ -1,4 +1,4 @@ -/* $Id: create.c,v 1.18 2004/04/12 14:46:02 navaraf Exp $ +/* $Id: create.c,v 1.19 2004/05/05 18:30:16 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -19,18 +19,18 @@ /* FUNCTIONS *****************************************************************/ NTSTATUS STDCALL -NpfsCreate(PDEVICE_OBJECT DeviceObject, - PIRP Irp) +NpfsCreate( + PDEVICE_OBJECT DeviceObject, + PIRP Irp) { + PLIST_ENTRY CurrentEntry; + PNPFS_PIPE Current; PIO_STACK_LOCATION IoStack; PFILE_OBJECT FileObject; PNPFS_PIPE Pipe; PNPFS_FCB ClientFcb; PNPFS_FCB ServerFcb; - PNPFS_PIPE current; - PLIST_ENTRY current_entry; PNPFS_DEVICE_EXTENSION DeviceExt; - KIRQL oldIrql; ULONG Disposition; DPRINT("NpfsCreate(DeviceObject %p Irp %p)\n", DeviceObject, Irp); @@ -42,156 +42,154 @@ NpfsCreate(PDEVICE_OBJECT DeviceObject, DPRINT("FileObject %p\n", FileObject); DPRINT("FileName %wZ\n", &FileObject->FileName); + Irp->IoStatus.Information = 0; + + /* + * Step 1. Find the pipe we're trying to open. + */ + + KeLockMutex(&DeviceExt->PipeListLock); + CurrentEntry = DeviceExt->PipeListHead.Flink; + while (CurrentEntry != &DeviceExt->PipeListHead) + { + Current = CONTAINING_RECORD(CurrentEntry, NPFS_PIPE, PipeListEntry); + if (RtlCompareUnicodeString( + &FileObject->FileName, + &Current->PipeName, + TRUE) == 0) + { + break; + } + CurrentEntry = CurrentEntry->Flink; + } + + /* Not found, bail out with error. */ + if (CurrentEntry == &DeviceExt->PipeListHead) + { + DPRINT("No pipe found!\n"); + KeUnlockMutex(&DeviceExt->PipeListLock); + Irp->IoStatus.Status = STATUS_OBJECT_NAME_NOT_FOUND; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_OBJECT_NAME_NOT_FOUND; + } + + KeUnlockMutex(&DeviceExt->PipeListLock); + + /* Save the pipe we found for later use. */ + Pipe = Current; + + /* + * Step 2. Search for listening server FCB. + */ + + /* + * Acquire the lock for FCB lists. From now on no modifications to the + * FCB lists are allowed, because it can cause various misconsistencies. + */ + KeLockMutex(&Pipe->FcbListLock); + + CurrentEntry = Pipe->ServerFcbListHead.Flink; + while (CurrentEntry != &Pipe->ServerFcbListHead) + { + ServerFcb = CONTAINING_RECORD(CurrentEntry, NPFS_FCB, FcbListEntry); + if (ServerFcb->PipeState == FILE_PIPE_LISTENING_STATE) + { + DPRINT("Server found! Fcb %p\n", ServerFcb); + break; + } + CurrentEntry = CurrentEntry->Flink; + } + + /* Not found, bail out with error for FILE_OPEN requests. */ + if (CurrentEntry == &Pipe->ServerFcbListHead) + { + DPRINT("No server fcb found!\n"); + if (Disposition == FILE_OPEN) + { + KeUnlockMutex(&Pipe->FcbListLock); + Irp->IoStatus.Status = STATUS_PIPE_BUSY; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_PIPE_BUSY; + } + ServerFcb = NULL; + } + + /* + * Step 3. Create the client FCB. + */ + ClientFcb = ExAllocatePool(NonPagedPool, sizeof(NPFS_FCB)); if (ClientFcb == NULL) - { - Irp->IoStatus.Status = STATUS_NO_MEMORY; - Irp->IoStatus.Information = 0; - - IoCompleteRequest(Irp, IO_NO_INCREMENT); - DPRINT("No memory!\n"); - - return(STATUS_NO_MEMORY); - } - - KeLockMutex(&DeviceExt->PipeListLock); - current_entry = DeviceExt->PipeListHead.Flink; - while (current_entry != &DeviceExt->PipeListHead) - { - current = CONTAINING_RECORD(current_entry, - NPFS_PIPE, - PipeListEntry); - - if (RtlCompareUnicodeString(&FileObject->FileName, - ¤t->PipeName, - TRUE) == 0) - { - break; - } - - current_entry = current_entry->Flink; - } - - if (current_entry == &DeviceExt->PipeListHead) - { - ExFreePool(ClientFcb); - KeUnlockMutex(&DeviceExt->PipeListLock); - - Irp->IoStatus.Status = STATUS_OBJECT_NAME_NOT_FOUND; - Irp->IoStatus.Information = 0; - - IoCompleteRequest(Irp, IO_NO_INCREMENT); - DPRINT("No pipe found!\n"); - - return(STATUS_OBJECT_NAME_NOT_FOUND); - } - - Pipe = current; + { + DPRINT("No memory!\n"); + KeUnlockMutex(&Pipe->FcbListLock); + Irp->IoStatus.Status = STATUS_NO_MEMORY; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_NO_MEMORY; + } ClientFcb->Pipe = Pipe; ClientFcb->PipeEnd = FILE_PIPE_CLIENT_END; ClientFcb->OtherSide = NULL; ClientFcb->PipeState = FILE_PIPE_DISCONNECTED_STATE; - /* initialize data list */ + /* Initialize data list. */ if (Pipe->InboundQuota) - { - ClientFcb->Data = ExAllocatePool(NonPagedPool, Pipe->InboundQuota); - if (ClientFcb->Data == NULL) - { - ExFreePool(ClientFcb); - KeUnlockMutex(&DeviceExt->PipeListLock); - - Irp->IoStatus.Status = STATUS_NO_MEMORY; - Irp->IoStatus.Information = 0; - - IoCompleteRequest(Irp, IO_NO_INCREMENT); - DPRINT("No memory!\n"); - - return(STATUS_NO_MEMORY); - } - } + { + ClientFcb->Data = ExAllocatePool(NonPagedPool, Pipe->InboundQuota); + if (ClientFcb->Data == NULL) + { + DPRINT("No memory!\n"); + ExFreePool(ClientFcb); + KeUnlockMutex(&Pipe->FcbListLock); + Irp->IoStatus.Status = STATUS_NO_MEMORY; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_NO_MEMORY; + } + } else - { - ClientFcb->Data = NULL; - } + { + ClientFcb->Data = NULL; + } + ClientFcb->ReadPtr = ClientFcb->Data; ClientFcb->WritePtr = ClientFcb->Data; ClientFcb->ReadDataAvailable = 0; ClientFcb->WriteQuotaAvailable = Pipe->InboundQuota; ClientFcb->MaxDataLength = Pipe->InboundQuota; KeInitializeSpinLock(&ClientFcb->DataListLock); - - KeInitializeEvent(&ClientFcb->ConnectEvent, - SynchronizationEvent, - FALSE); - - KeInitializeEvent(&ClientFcb->Event, - SynchronizationEvent, - FALSE); - - KeAcquireSpinLock(&Pipe->FcbListLock, &oldIrql); + KeInitializeEvent(&ClientFcb->ConnectEvent, SynchronizationEvent, FALSE); + KeInitializeEvent(&ClientFcb->Event, SynchronizationEvent, FALSE); + + /* + * Step 4. Add the client FCB to a list and connect it if necessary. + */ + + /* Add the client FCB to the pipe FCB list. */ InsertTailList(&Pipe->ClientFcbListHead, &ClientFcb->FcbListEntry); - KeReleaseSpinLock(&Pipe->FcbListLock, oldIrql); - - Pipe->ReferenceCount++; - - KeUnlockMutex(&DeviceExt->PipeListLock); - /* search for listening server fcb */ - current_entry = Pipe->ServerFcbListHead.Flink; - while (current_entry != &Pipe->ServerFcbListHead) - { - ServerFcb = CONTAINING_RECORD(current_entry, - NPFS_FCB, - FcbListEntry); - if (ServerFcb->PipeState == FILE_PIPE_LISTENING_STATE) - { - DPRINT("Server found! Fcb %p\n", ServerFcb); - break; - } - current_entry = current_entry->Flink; - } - - if (current_entry == &Pipe->ServerFcbListHead) - { - DPRINT("No server fcb found!\n"); + if (ServerFcb) + { + ClientFcb->OtherSide = ServerFcb; + ServerFcb->OtherSide = ClientFcb; + ClientFcb->PipeState = FILE_PIPE_CONNECTED_STATE; + ServerFcb->PipeState = FILE_PIPE_CONNECTED_STATE; - FileObject->FsContext = ClientFcb; + /* Wake server thread */ + DPRINT("Setting the ConnectEvent for %x\n", ServerFcb); + KeSetEvent(&ServerFcb->ConnectEvent, 0, FALSE); + } + + KeUnlockMutex(&Pipe->FcbListLock); - if (Disposition == FILE_OPEN) - { - Irp->IoStatus.Status = STATUS_PIPE_BUSY; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return STATUS_PIPE_BUSY; - } - else - { - Irp->IoStatus.Status = STATUS_SUCCESS; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return STATUS_SUCCESS; - } - } - - ClientFcb->OtherSide = ServerFcb; - ServerFcb->OtherSide = ClientFcb; - ClientFcb->PipeState = FILE_PIPE_CONNECTED_STATE; - ServerFcb->PipeState = FILE_PIPE_CONNECTED_STATE; - - /* FIXME: create data queue(s) */ - - /* wake server thread */ - KeSetEvent(&ServerFcb->ConnectEvent, 0, FALSE); - FileObject->FsContext = ClientFcb; - + Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = 0; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + DPRINT("Success!\n"); - return(STATUS_SUCCESS); + return STATUS_SUCCESS; } @@ -204,7 +202,6 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject, PNPFS_DEVICE_EXTENSION DeviceExt; PNPFS_PIPE Pipe; PNPFS_FCB Fcb; - KIRQL oldIrql; PLIST_ENTRY current_entry; PNPFS_PIPE current; PIO_PIPE_CREATE_BUFFER Buffer; @@ -262,6 +259,7 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject, if (Pipe->CurrentInstances >= Pipe->MaximumInstances) { + DPRINT("Out of instances.\n"); ExFreePool(Fcb); Irp->IoStatus.Status = STATUS_PIPE_BUSY; IoCompleteRequest(Irp, IO_NO_INCREMENT); @@ -272,6 +270,7 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject, if (Pipe->MaximumInstances != Buffer->MaxInstances || Pipe->TimeOut.QuadPart != Buffer->TimeOut.QuadPart) { + DPRINT("Asked for invalid pipe mode.\n"); ExFreePool(Fcb); Irp->IoStatus.Status = STATUS_ACCESS_DENIED; IoCompleteRequest(Irp, IO_NO_INCREMENT); @@ -301,10 +300,9 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject, return(STATUS_NO_MEMORY); } - Pipe->ReferenceCount = 0; InitializeListHead(&Pipe->ServerFcbListHead); InitializeListHead(&Pipe->ClientFcbListHead); - KeInitializeSpinLock(&Pipe->FcbListLock); + KeInitializeMutex(&Pipe->FcbListLock, 0); Pipe->PipeType = Buffer->WriteModeMessage ? FILE_PIPE_MESSAGE_TYPE : FILE_PIPE_BYTE_STREAM_TYPE; Pipe->PipeWriteMode = Buffer->WriteModeMessage ? FILE_PIPE_MESSAGE_MODE : FILE_PIPE_BYTE_STREAM_MODE; @@ -396,12 +394,11 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject, Fcb->MaxDataLength = Pipe->OutboundQuota; KeInitializeSpinLock(&Fcb->DataListLock); - Pipe->ReferenceCount++; Pipe->CurrentInstances++; - KeAcquireSpinLock(&Pipe->FcbListLock, &oldIrql); + KeLockMutex(&Pipe->FcbListLock); InsertTailList(&Pipe->ServerFcbListHead, &Fcb->FcbListEntry); - KeReleaseSpinLock(&Pipe->FcbListLock, oldIrql); + KeUnlockMutex(&Pipe->FcbListLock); Fcb->Pipe = Pipe; Fcb->PipeEnd = FILE_PIPE_SERVER_END; @@ -426,122 +423,88 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject, NTSTATUS STDCALL -NpfsClose(PDEVICE_OBJECT DeviceObject, - PIRP Irp) +NpfsClose( + PDEVICE_OBJECT DeviceObject, + PIRP Irp) { - PNPFS_DEVICE_EXTENSION DeviceExt; - PIO_STACK_LOCATION IoStack; - PFILE_OBJECT FileObject; - PNPFS_FCB Fcb; - PNPFS_PIPE Pipe; - KIRQL oldIrql; + PNPFS_DEVICE_EXTENSION DeviceExt; + PIO_STACK_LOCATION IoStack; + PFILE_OBJECT FileObject; + PNPFS_FCB Fcb; + PNPFS_PIPE Pipe; + BOOL Server; - DPRINT("NpfsClose(DeviceObject %p Irp %p)\n", DeviceObject, Irp); + DPRINT("NpfsClose(DeviceObject %p Irp %p)\n", DeviceObject, Irp); - IoStack = IoGetCurrentIrpStackLocation(Irp); - DeviceExt = (PNPFS_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - FileObject = IoStack->FileObject; - Fcb = FileObject->FsContext; + IoStack = IoGetCurrentIrpStackLocation(Irp); + DeviceExt = (PNPFS_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + FileObject = IoStack->FileObject; + Fcb = FileObject->FsContext; - if (Fcb == NULL) - { + if (Fcb == NULL) + { Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_SUCCESS; + } - return(STATUS_SUCCESS); - } + DPRINT("Fcb %x\n", Fcb); + Pipe = Fcb->Pipe; - DPRINT("Fcb %x\n", Fcb); - Pipe = Fcb->Pipe; + DPRINT("Closing pipe %wZ\n", &Pipe->PipeName); - DPRINT("Closing pipe %wZ\n", &Pipe->PipeName); + KeLockMutex(&Pipe->FcbListLock); - KeLockMutex(&DeviceExt->PipeListLock); + Server = (Fcb->PipeEnd == FILE_PIPE_SERVER_END); - if (Fcb->PipeEnd == FILE_PIPE_SERVER_END) - { + if (Server) + { /* FIXME: Clean up existing connections here ?? */ DPRINT("Server\n"); Pipe->CurrentInstances--; - if (Fcb->PipeState == FILE_PIPE_CONNECTED_STATE) - { - if (Fcb->OtherSide) - { - Fcb->OtherSide->PipeState = FILE_PIPE_CLOSING_STATE; - /* Signaling the write event. If is possible that an other - * thread waits of an empty buffer. - */ - KeSetEvent(&Fcb->OtherSide->Event, IO_NO_INCREMENT, FALSE); - } - Fcb->PipeState = 0; - } - } - - Pipe->ReferenceCount--; - - if (Fcb->PipeEnd == FILE_PIPE_CLIENT_END) - { + } else + { DPRINT("Client\n"); - if (Fcb->PipeState == FILE_PIPE_CONNECTED_STATE) - { - if (Fcb->OtherSide) - { - Fcb->OtherSide->PipeState = FILE_PIPE_CLOSING_STATE; - - /* Signaling the read event. If is possible that an other - * thread waits of read data. - */ - KeSetEvent(&Fcb->OtherSide->Event, IO_NO_INCREMENT, FALSE); - } - Fcb->PipeState = 0; - } - } + } - FileObject->FsContext = NULL; + if (Fcb->PipeState == FILE_PIPE_CONNECTED_STATE) + { + if (Fcb->OtherSide) + { + Fcb->OtherSide->PipeState = FILE_PIPE_CLOSING_STATE; + /* + * Signaling the write event. If is possible that an other + * thread waits of an empty buffer. + */ + KeSetEvent(&Fcb->OtherSide->Event, IO_NO_INCREMENT, FALSE); + } + Fcb->PipeState = 0; + } -#if 0 - DPRINT("%x\n", Pipe->ReferenceCount); - if (Pipe->ReferenceCount == 0) -#else - if (Fcb->PipeEnd == FILE_PIPE_SERVER_END && - Fcb->Pipe->CurrentInstances == 0) -#endif - { - KeAcquireSpinLock(&Pipe->FcbListLock, &oldIrql); - if (Fcb->OtherSide) - { - RemoveEntryList(&Fcb->OtherSide->FcbListEntry); - } - RemoveEntryList(&Fcb->FcbListEntry); - KeReleaseSpinLock(&Pipe->FcbListLock, oldIrql); - if (Fcb->OtherSide) - { - if (Fcb->OtherSide->Data) - { - ExFreePool(Fcb->OtherSide->Data); - } - ExFreePool(Fcb->OtherSide); - } - if (Fcb->Data) - { - ExFreePool(Fcb->Data); - } - ExFreePool(Fcb); + FileObject->FsContext = NULL; + + RemoveEntryList(&Fcb->FcbListEntry); + if (Fcb->Data) + ExFreePool(Fcb->Data); + ExFreePool(Fcb); + + KeUnlockMutex(&Pipe->FcbListLock); + + if (Server && Pipe->CurrentInstances == 0) + { RtlFreeUnicodeString(&Pipe->PipeName); + KeLockMutex(&DeviceExt->PipeListLock); RemoveEntryList(&Pipe->PipeListEntry); + KeUnlockMutex(&DeviceExt->PipeListLock); ExFreePool(Pipe); - } + } - KeUnlockMutex(&DeviceExt->PipeListLock); + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, IO_NO_INCREMENT); - Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = 0; - - IoCompleteRequest(Irp, IO_NO_INCREMENT); - - return(STATUS_SUCCESS); + return STATUS_SUCCESS; } /* EOF */ diff --git a/reactos/drivers/fs/np/fsctrl.c b/reactos/drivers/fs/np/fsctrl.c index 537ea4403f3..fcffbd9c73d 100644 --- a/reactos/drivers/fs/np/fsctrl.c +++ b/reactos/drivers/fs/np/fsctrl.c @@ -1,4 +1,4 @@ -/* $Id: fsctrl.c,v 1.14 2004/04/12 13:03:29 navaraf Exp $ +/* $Id: fsctrl.c,v 1.15 2004/05/05 18:30:16 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -25,12 +25,14 @@ NpfsConnectPipe(PNPFS_FCB Fcb) PLIST_ENTRY current_entry; PNPFS_FCB ClientFcb; NTSTATUS Status; - KIRQL oldIrql; DPRINT("NpfsConnectPipe()\n"); if (Fcb->PipeState == FILE_PIPE_CONNECTED_STATE) + { + KeResetEvent(&Fcb->ConnectEvent); return STATUS_PIPE_CONNECTED; + } if (Fcb->PipeState == FILE_PIPE_CLOSING_STATE) return STATUS_PIPE_CLOSING; @@ -41,7 +43,7 @@ NpfsConnectPipe(PNPFS_FCB Fcb) /* search for a listening client fcb */ - KeAcquireSpinLock(&Pipe->FcbListLock, &oldIrql); + KeLockMutex(&Pipe->FcbListLock); current_entry = Pipe->ClientFcbListHead.Flink; while (current_entry != &Pipe->ClientFcbListHead) { @@ -70,20 +72,22 @@ NpfsConnectPipe(PNPFS_FCB Fcb) Fcb->PipeState = FILE_PIPE_CONNECTED_STATE; ClientFcb->PipeState = FILE_PIPE_CONNECTED_STATE; - KeReleaseSpinLock(&Pipe->FcbListLock, oldIrql); + KeUnlockMutex(&Pipe->FcbListLock); /* FIXME: create and initialize data queues */ /* signal client's connect event */ + DPRINT("Setting the ConnectEvent for %x\n", ClientFcb); KeSetEvent(&ClientFcb->ConnectEvent, IO_NO_INCREMENT, FALSE); + Status = STATUS_PIPE_CONNECTED; } else { /* no listening client fcb found */ DPRINT("No listening client fcb found -- waiting for client\n"); - KeReleaseSpinLock(&Pipe->FcbListLock, oldIrql); + KeUnlockMutex(&Pipe->FcbListLock); Fcb->PipeState = FILE_PIPE_LISTENING_STATE; @@ -93,13 +97,18 @@ NpfsConnectPipe(PNPFS_FCB Fcb) FALSE, NULL); + if (NT_SUCCESS(Status)) + { + Status = STATUS_PIPE_CONNECTED; + Fcb->PipeState = FILE_PIPE_CONNECTED_STATE; + } + DPRINT("Finished waiting! Status: %x\n", Status); } - DPRINT("Client Fcb: %p\n", Fcb->OtherSide); - return STATUS_PIPE_CONNECTED; + return Status; } @@ -114,6 +123,7 @@ NpfsDisconnectPipe(PNPFS_FCB Fcb) if (Fcb->PipeState == FILE_PIPE_CONNECTED_STATE) { Fcb->PipeState = FILE_PIPE_DISCONNECTED_STATE; + /* FIXME: Shouldn't this be FILE_PIPE_CLOSING_STATE? */ Fcb->OtherSide->PipeState = FILE_PIPE_DISCONNECTED_STATE; /* FIXME: remove data queue(s) */ @@ -128,6 +138,7 @@ NpfsDisconnectPipe(PNPFS_FCB Fcb) if (Fcb->PipeState == FILE_PIPE_CLOSING_STATE) { Fcb->PipeState = FILE_PIPE_DISCONNECTED_STATE; + Fcb->OtherSide = NULL; /* FIXME: remove data queue(s) */ diff --git a/reactos/drivers/fs/np/npfs.h b/reactos/drivers/fs/np/npfs.h index 2608ef0d511..ad9efb63dd3 100644 --- a/reactos/drivers/fs/np/npfs.h +++ b/reactos/drivers/fs/np/npfs.h @@ -1,4 +1,4 @@ -/* $Id: npfs.h,v 1.15 2004/04/12 13:03:29 navaraf Exp $ */ +/* $Id: npfs.h,v 1.16 2004/05/05 18:30:16 navaraf Exp $ */ #ifndef __SERVICES_FS_NP_NPFS_H #define __SERVICES_FS_NP_NPFS_H @@ -17,10 +17,9 @@ typedef struct { UNICODE_STRING PipeName; LIST_ENTRY PipeListEntry; - KSPIN_LOCK FcbListLock; + KMUTEX FcbListLock; LIST_ENTRY ServerFcbListHead; LIST_ENTRY ClientFcbListHead; - ULONG ReferenceCount; ULONG PipeType; ULONG PipeReadMode; ULONG PipeWriteMode; diff --git a/reactos/drivers/fs/np/rw.c b/reactos/drivers/fs/np/rw.c index df5d5948a5a..c454ad4a23c 100644 --- a/reactos/drivers/fs/np/rw.c +++ b/reactos/drivers/fs/np/rw.c @@ -1,4 +1,4 @@ -/* $Id: rw.c,v 1.12 2004/04/12 13:03:29 navaraf Exp $ +/* $Id: rw.c,v 1.13 2004/05/05 18:30:16 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -290,7 +290,7 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject, DPRINT("Finished waiting (%S)! Status: %x\n", Pipe->PipeName.Buffer, Status); KeAcquireSpinLock(&Fcb->DataListLock, &OldIrql); } - if (Pipe->PipeReadMode == FILE_PIPE_BYTE_STREAM_MODE) + if (Pipe->PipeWriteMode == FILE_PIPE_BYTE_STREAM_MODE) { DPRINT("Byte stream mode\n"); while (Length > 0 && Fcb->WriteQuotaAvailable > 0) From e8953aae82e2bf9294ba6ae231749ce5caa38832 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 5 May 2004 22:13:17 +0000 Subject: [PATCH 1046/1463] properly handle HTTRANSPARENT hittest with mouse messages svn path=/trunk/; revision=9313 --- reactos/subsys/win32k/ntuser/message.c | 39 ++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/message.c b/reactos/subsys/win32k/ntuser/message.c index 1ba5935b310..b8531b716bc 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.60 2004/04/29 21:13:16 gvg Exp $ +/* $Id: message.c,v 1.61 2004/05/05 22:13:17 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -435,6 +435,38 @@ IntTranslateMouseMessage(PUSER_MESSAGE_QUEUE ThreadQueue, LPMSG Msg, USHORT *Hit /* only send WM_NCHITTEST messages if we're not capturing the window! */ *HitTest = IntSendMessage(Window->Self, WM_NCHITTEST, 0, MAKELONG(Msg->pt.x, Msg->pt.y)); + + if(*HitTest == (USHORT)HTTRANSPARENT) + { + PWINDOW_OBJECT DesktopWindow; + HWND hDesktop = IntGetDesktopWindow(); + + if((DesktopWindow = IntGetWindowObject(hDesktop))) + { + PWINDOW_OBJECT Wnd; + + WinPosWindowFromPoint(DesktopWindow, Window->MessageQueue, &Msg->pt, &Wnd); + if(Wnd) + { + if(Wnd != Window) + { + MSG NewMsg = *Msg; + /* post the message to the other window */ + NewMsg.hwnd = Wnd->Self; + MsqPostMessage(Wnd->MessageQueue, &NewMsg, FALSE); + + /* eat the message */ + IntReleaseWindowObject(Wnd); + IntReleaseWindowObject(Window); + IntReleaseWindowObject(DesktopWindow); + return TRUE; + } + IntReleaseWindowObject(Wnd); + } + + IntReleaseWindowObject(DesktopWindow); + } + } } else { @@ -468,12 +500,13 @@ IntTranslateMouseMessage(PUSER_MESSAGE_QUEUE ThreadQueue, LPMSG Msg, USHORT *Hit { Msg->wParam = *HitTest; } + Msg->lParam = MAKELONG(Msg->pt.x, Msg->pt.y); } else if(ThreadQueue->MoveSize == NULL && ThreadQueue->MenuOwner == NULL) { - Msg->pt.x -= Window->ClientRect.left; - Msg->pt.y -= Window->ClientRect.top; + Msg->pt.x -= (WORD)Window->ClientRect.left; + Msg->pt.y -= (WORD)Window->ClientRect.top; Msg->lParam = MAKELONG(Msg->pt.x, Msg->pt.y); } } From 879f672ffea5d41b6e6fa5d7f3271b9b60e8e969 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 5 May 2004 22:26:04 +0000 Subject: [PATCH 1047/1463] rewrote NtUserBuildHwndList() svn path=/trunk/; revision=9314 --- reactos/subsys/win32k/ntuser/message.c | 7 +- reactos/subsys/win32k/ntuser/window.c | 228 +++++++++++++------------ 2 files changed, 125 insertions(+), 110 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/message.c b/reactos/subsys/win32k/ntuser/message.c index b8531b716bc..ce89598f2b2 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.61 2004/05/05 22:13:17 weiden Exp $ +/* $Id: message.c,v 1.62 2004/05/05 22:26:03 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -450,10 +450,9 @@ IntTranslateMouseMessage(PUSER_MESSAGE_QUEUE ThreadQueue, LPMSG Msg, USHORT *Hit { if(Wnd != Window) { - MSG NewMsg = *Msg; /* post the message to the other window */ - NewMsg.hwnd = Wnd->Self; - MsqPostMessage(Wnd->MessageQueue, &NewMsg, FALSE); + Msg->hwnd = Wnd->Self; + MsqPostMessage(Wnd->MessageQueue, Msg, FALSE); /* eat the message */ IntReleaseWindowObject(Wnd); diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index ae80a000632..5d4b289cec9 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.223 2004/05/02 17:25:21 weiden Exp $ +/* $Id: window.c,v 1.224 2004/05/05 22:26:04 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1144,121 +1144,137 @@ NtUserBuildHwndList( HWND* pWnd, ULONG nBufSize) { + NTSTATUS Status; ULONG dwCount = 0; /* FIXME handle bChildren */ - if ( hwndParent ) + + if(hwndParent) + { + PWINDOW_OBJECT Window, Child; + if(!(Window = IntGetWindowObject(hwndParent))) { - PWINDOW_OBJECT WindowObject = NULL; - PWINDOW_OBJECT Child; - - WindowObject = IntGetWindowObject ( hwndParent ); - if ( !WindowObject ) - { - DPRINT("Bad window handle 0x%x\n", hwndParent); - SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); - return 0; - } - - IntLockRelatives(WindowObject ); - Child = WindowObject->FirstChild; - while (Child) - { - if ( pWnd && dwCount < nBufSize ) - pWnd[dwCount] = Child->Self; - dwCount++; - Child = Child->NextSibling; - } - IntUnLockRelatives(WindowObject); - IntReleaseWindowObject ( WindowObject ); + SetLastWin32Error(ERROR_INVALID_HANDLE); + return 0; } - else if ( dwThreadId ) + + IntLockRelatives(Window); + for(Child = Window->FirstChild; Child != NULL; Child = Child->NextSibling) + { + if(dwCount++ < nBufSize && pWnd) + { + Status = MmCopyToCaller(pWnd++, &Child->Self, sizeof(HWND)); + if(!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + break; + } + } + } + IntUnLockRelatives(Window); + + IntReleaseWindowObject(Window); + } + else if(dwThreadId) + { + PETHREAD Thread; + PW32THREAD W32Thread; + PLIST_ENTRY Current; + PWINDOW_OBJECT *Window; + + Status = PsLookupThreadByThreadId((PVOID)dwThreadId, &Thread); + if(!NT_SUCCESS(Status)) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return 0; + } + if(!(W32Thread = Thread->Win32Thread)) { - NTSTATUS Status; - struct _ETHREAD* Thread; - struct _EPROCESS* ThreadsProcess; - struct _W32PROCESS* Win32Process; - struct _WINSTATION_OBJECT* WindowStation; - PUSER_HANDLE_TABLE HandleTable; - PLIST_ENTRY Current; - PUSER_HANDLE_BLOCK Block = NULL; - ULONG i; - - Status = PsLookupThreadByThreadId ( (PVOID)dwThreadId, &Thread ); - if ( !NT_SUCCESS(Status) || !Thread ) - { - DPRINT("Bad ThreadId 0x%x\n", dwThreadId ); - SetLastWin32Error(ERROR_INVALID_HANDLE); - return 0; - } - ThreadsProcess = Thread->ThreadsProcess; - ASSERT(ThreadsProcess); - Win32Process = ThreadsProcess->Win32Process; - ASSERT(Win32Process); - WindowStation = Win32Process->WindowStation; - ASSERT(WindowStation); - HandleTable = (PUSER_HANDLE_TABLE)(WindowStation->HandleTable); - ASSERT(HandleTable); - ObDereferenceObject(Thread); - - ObmpLockHandleTable(HandleTable); - - Current = HandleTable->ListHead.Flink; - while ( Current != &HandleTable->ListHead ) - { - Block = CONTAINING_RECORD(Current, USER_HANDLE_BLOCK, ListEntry); - for ( i = 0; i < HANDLE_BLOCK_ENTRIES; i++ ) - { - PVOID ObjectBody = Block->Handles[i].ObjectBody; - if ( ObjectBody ) - { - if ( pWnd && dwCount < nBufSize ) - { - pWnd[dwCount] = - (HWND)IntReferenceWindowObject(ObjectBody); - } - dwCount++; - } - } - Current = Current->Flink; - } - - ObmpUnlockHandleTable(HandleTable); + DPRINT1("Thread is not a GUI Thread!\n"); + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return 0; } - else + + IntLockThreadWindows(W32Thread); + Current = W32Thread->WindowListHead.Flink; + while(Current != &(W32Thread->WindowListHead)) { - PDESKTOP_OBJECT DesktopObject = NULL; - KIRQL OldIrql; - PWINDOW_OBJECT Child, WndDesktop; - -#if 0 - if ( hDesktop ) - DesktopObject = IntGetDesktopObject ( hDesktop ); - else -#endif - DesktopObject = IntGetActiveDesktop(); - if (!DesktopObject) - { - DPRINT("Bad desktop handle 0x%x\n", hDesktop ); - SetLastWin32Error(ERROR_INVALID_HANDLE); - return 0; - } - - KeAcquireSpinLock ( &DesktopObject->Lock, &OldIrql ); - - WndDesktop = IntGetWindowObject(DesktopObject->DesktopWindow); - Child = (WndDesktop ? WndDesktop->FirstChild : NULL); - while (Child) - { - if ( pWnd && dwCount < nBufSize ) - pWnd[dwCount] = Child->Self; - dwCount++; - Child = Child->NextSibling; - } - KeReleaseSpinLock ( &DesktopObject->Lock, OldIrql ); + *Window = CONTAINING_RECORD(Current, WINDOW_OBJECT, ThreadListEntry); + ASSERT(*Window); + + if(dwCount < nBufSize && pWnd && ((*Window)->Style & WS_CHILD)) + { + Status = MmCopyToCaller(pWnd++, &(*Window)->Self, sizeof(HWND)); + if(!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + break; + } + } + + if(!((*Window)->Style & WS_CHILD)) + { + dwCount++; + } + + Current = Current->Flink; } - + IntUnLockThreadWindows(W32Thread); + + ObDereferenceObject(Thread); + } + else + { + PDESKTOP_OBJECT Desktop; + PWINDOW_OBJECT Window, Child; + + if(hDesktop == NULL && !(Desktop = IntGetActiveDesktop())) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return 0; + } + + if(hDesktop) + { + Status = IntValidateDesktopHandle(hDesktop, + UserMode, + 0, + &Desktop); + if(!NT_SUCCESS(Status)) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return 0; + } + } + if(!(Window = IntGetWindowObject(Desktop->DesktopWindow))) + { + if(hDesktop) + ObDereferenceObject(Desktop); + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + return 0; + } + + IntLockRelatives(Window); + for(Child = Window->FirstChild; Child != NULL; Child = Child->NextSibling) + { + if(dwCount++ < nBufSize && pWnd) + { + Status = MmCopyToCaller(pWnd++, &Child->Self, sizeof(HWND)); + if(!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + break; + } + } + } + IntUnLockRelatives(Window); + + IntReleaseWindowObject(Window); + if(hDesktop) + ObDereferenceObject(Desktop); + } + return dwCount; } From bcde8100ea2ff7942e5b3222ddb5b5b5559d34b0 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 5 May 2004 22:47:06 +0000 Subject: [PATCH 1048/1463] fixed GetThreadDesktop() (not fully working yet because it requires a ObFindHandleForObject() implementation in case the requested thread doesn't belong to the calling process) svn path=/trunk/; revision=9315 --- reactos/include/napi/win32.h | 2 + reactos/ntoskrnl/include/internal/ex.h | 4 - reactos/subsys/win32k/include/desktop.h | 10 ++ reactos/subsys/win32k/main/dllmain.c | 5 +- reactos/subsys/win32k/ntuser/desktop.c | 132 +++++++++++++++++++----- 5 files changed, 121 insertions(+), 32 deletions(-) diff --git a/reactos/include/napi/win32.h b/reactos/include/napi/win32.h index 1e7568f2f35..f9f63962b2d 100644 --- a/reactos/include/napi/win32.h +++ b/reactos/include/napi/win32.h @@ -10,6 +10,7 @@ typedef struct _W32THREAD LIST_ENTRY WindowListHead; struct _KBDTABLES* KeyboardLayout; struct _DESKTOP_OBJECT* Desktop; + HANDLE hDesktop; DWORD MessagePumpHookValue; BOOLEAN IsExiting; } W32THREAD, *PW32THREAD; @@ -29,6 +30,7 @@ typedef struct _W32PROCESS LIST_ENTRY CursorIconListHead; struct _KBDTABLES* KeyboardLayout; struct _WINSTATION_OBJECT* WindowStation; + HANDLE hWindowStation; WORD GDIObjects; WORD UserObjects; BOOLEAN CreatedWindowOrDC; diff --git a/reactos/ntoskrnl/include/internal/ex.h b/reactos/ntoskrnl/include/internal/ex.h index 091ae13c79c..70e3ed05d15 100644 --- a/reactos/ntoskrnl/include/internal/ex.h +++ b/reactos/ntoskrnl/include/internal/ex.h @@ -45,8 +45,6 @@ typedef struct _SYSTEM_CURSORINFO typedef struct _WINSTATION_OBJECT { - HANDLE Self; - CSHORT Type; CSHORT Size; KSPIN_LOCK Lock; @@ -68,8 +66,6 @@ typedef struct _WINSTATION_OBJECT typedef struct _DESKTOP_OBJECT { - HANDLE Self; - CSHORT Type; CSHORT Size; LIST_ENTRY ListEntry; diff --git a/reactos/subsys/win32k/include/desktop.h b/reactos/subsys/win32k/include/desktop.h index 565c673bdf0..40cf4d86ca0 100644 --- a/reactos/subsys/win32k/include/desktop.h +++ b/reactos/subsys/win32k/include/desktop.h @@ -46,6 +46,16 @@ IntShowDesktop(PDESKTOP_OBJECT Desktop, ULONG Width, ULONG Height); NTSTATUS FASTCALL IntHideDesktop(PDESKTOP_OBJECT Desktop); +HDESK FASTCALL +IntGetDesktopObjectHandle(PDESKTOP_OBJECT DesktopObject); + +NTSTATUS FASTCALL +IntValidateDesktopHandle( + HDESK Desktop, + KPROCESSOR_MODE AccessMode, + ACCESS_MASK DesiredAccess, + PDESKTOP_OBJECT *Object); + #define IntIsActiveDesktop(Desktop) \ ((Desktop)->WindowStation->ActiveDesktop == (Desktop)) diff --git a/reactos/subsys/win32k/main/dllmain.c b/reactos/subsys/win32k/main/dllmain.c index 275e7930b2f..dded4602425 100644 --- a/reactos/subsys/win32k/main/dllmain.c +++ b/reactos/subsys/win32k/main/dllmain.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: dllmain.c,v 1.70 2004/05/01 16:43:14 weiden Exp $ +/* $Id: dllmain.c,v 1.71 2004/05/05 22:47:06 weiden Exp $ * * Entry Point for win32k.sys */ @@ -182,6 +182,7 @@ Win32kThreadCallback (struct _ETHREAD *Thread, /* By default threads get assigned their process's desktop. */ Win32Thread->Desktop = NULL; + Win32Thread->hDesktop = NULL; if (Process->Win32Desktop != NULL) { Status = ObReferenceObjectByHandle(Process->Win32Desktop, @@ -194,6 +195,8 @@ Win32kThreadCallback (struct _ETHREAD *Thread, { DbgPrint("Win32K: Failed to reference a desktop for thread.\n"); } + + Win32Thread->hDesktop = Process->Win32Desktop; } } else diff --git a/reactos/subsys/win32k/ntuser/desktop.c b/reactos/subsys/win32k/ntuser/desktop.c index 5d8132d6b94..75f124315a0 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.11 2004/05/01 16:43:15 weiden Exp $ + * $Id: desktop.c,v 1.12 2004/05/05 22:47:06 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -49,6 +49,19 @@ #define NDEBUG #include +#if 0 +/* not yet defined in w32api... */ +NTSTATUS STDCALL +ObFindHandleForObject(IN PEPROCESS Process, + IN PVOID Object, + IN POBJECT_TYPE ObjectType, + IN POBJECT_HANDLE_INFORMATION HandleInformation, + OUT PHANDLE Handle); +#else +#define ObFindHandleForObject(Process, Object, ObjectType, HandleInformation, Handle) \ + (STATUS_UNSUCCESSFUL) +#endif + /* GLOBALS *******************************************************************/ /* Currently active desktop */ @@ -131,7 +144,44 @@ IntGetDesktopWorkArea(PDESKTOP_OBJECT Desktop) PDESKTOP_OBJECT FASTCALL IntGetActiveDesktop(VOID) { - return InputDesktop; + return InputDesktop; +} + +/* + * returns or creates a handle to the desktop object + */ +HDESK FASTCALL +IntGetDesktopObjectHandle(PDESKTOP_OBJECT DesktopObject) +{ + NTSTATUS Status; + HDESK Ret; + + ASSERT(DesktopObject); + + Status = ObFindHandleForObject(PsGetCurrentProcess(), + DesktopObject, + ExDesktopObjectType, + NULL, + (PHANDLE)&Ret); + + if(!NT_SUCCESS(Status)) + { + Status = ObOpenObjectByPointer(DesktopObject, + 0, + NULL, + 0, + ExDesktopObjectType, + UserMode, + (PHANDLE)&Ret); + if(!NT_SUCCESS(Status)) + { + /* unable to create a handle */ + DPRINT1("Unable to create a desktop handle\n"); + return NULL; + } + } + + return Ret; } PUSER_MESSAGE_QUEUE FASTCALL @@ -394,8 +444,6 @@ NtUserCreateDesktop( 0, NULL, (HANDLE*)&Desktop); - - DesktopObject->Self = (HANDLE)Desktop; ObDereferenceObject(DesktopObject); ExFreePool(DesktopName.Buffer); @@ -774,10 +822,11 @@ NtUserResolveDesktopForWOW(DWORD Unknown0) HDESK STDCALL NtUserGetThreadDesktop(DWORD dwThreadId, DWORD Unknown1) { - PDESKTOP_OBJECT Desktop; NTSTATUS Status; PETHREAD Thread; - HDESK Ret; + PDESKTOP_OBJECT DesktopObject; + HDESK Ret, hThreadDesktop; + OBJECT_HANDLE_INFORMATION HandleInformation; if(!dwThreadId) { @@ -792,27 +841,52 @@ NtUserGetThreadDesktop(DWORD dwThreadId, DWORD Unknown1) return 0; } - Desktop = Thread->Win32Thread->Desktop; - - if(Desktop) + if(Thread->ThreadsProcess == PsGetCurrentProcess()) { - Status = ObReferenceObjectByPointer(Desktop, - 0, - ExDesktopObjectType, - UserMode); - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return 0; - } - - Ret = (HDESK)Desktop->Self; - - ObDereferenceObject(Desktop); + /* just return the handle, we queried the desktop handle of a thread running + in the same context */ + Ret = Thread->Win32Thread->hDesktop; + ObDereferenceObject(Thread); return Ret; } - return 0; + /* get the desktop handle and the desktop of the thread */ + if(!(hThreadDesktop = Thread->Win32Thread->hDesktop) || + !(DesktopObject = Thread->Win32Thread->Desktop)) + { + ObDereferenceObject(Thread); + DPRINT1("Desktop information of thread 0x%x broken!?\n", dwThreadId); + return NULL; + } + + /* we could just use DesktopObject instead of looking up the handle, but latter + may be a bit safer (e.g. when the desktop is being destroyed */ + /* switch into the context of the thread we're trying to get the desktop from, + so we can use the handle */ + KeAttachProcess(Thread->ThreadsProcess); + Status = ObReferenceObjectByHandle(hThreadDesktop, + GENERIC_ALL, + ExDesktopObjectType, + UserMode, + (PVOID*)&DesktopObject, + &HandleInformation); + KeDetachProcess(); + + /* the handle couldn't be found, there's nothing to get... */ + if(!NT_SUCCESS(Status)) + { + ObDereferenceObject(Thread); + return NULL; + } + + /* lookup our handle table if we can find a handle to the desktop object, + if not, create one */ + Ret = IntGetDesktopObjectHandle(DesktopObject); + + /* all done, we got a valid handle to the desktop */ + ObDereferenceObject(DesktopObject); + ObDereferenceObject(Thread); + return Ret; } /* @@ -825,6 +899,7 @@ NtUserGetThreadDesktop(DWORD dwThreadId, DWORD Unknown1) BOOL STDCALL NtUserSetThreadDesktop(HDESK hDesktop) { + PW32THREAD W32Thread; PDESKTOP_OBJECT DesktopObject; NTSTATUS Status; @@ -841,21 +916,24 @@ NtUserSetThreadDesktop(HDESK hDesktop) return FALSE; } + W32Thread = PsGetWin32Thread(); /* Check for setting the same desktop as before. */ - if (DesktopObject == PsGetWin32Thread()->Desktop) + if (DesktopObject == W32Thread->Desktop) { + W32Thread->hDesktop = hDesktop; ObDereferenceObject(DesktopObject); return TRUE; } /* FIXME: Should check here to see if the thread has any windows. */ - if (PsGetWin32Thread()->Desktop != NULL) + if (W32Thread->Desktop != NULL) { - ObDereferenceObject(PsGetWin32Thread()->Desktop); + ObDereferenceObject(W32Thread->Desktop); } - PsGetWin32Thread()->Desktop = DesktopObject; + W32Thread->Desktop = DesktopObject; + W32Thread->hDesktop = hDesktop; return TRUE; } From 85f77bb3064bf2b57123ddae1b07cec5cb2a00f2 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III Date: Fri, 7 May 2004 04:04:10 +0000 Subject: [PATCH 1049/1463] fixed output from test svn path=/trunk/; revision=9316 --- reactos/regtests/kmregtests/tests/mm-1.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reactos/regtests/kmregtests/tests/mm-1.c b/reactos/regtests/kmregtests/tests/mm-1.c index c69a77f92ae..eee602264dd 100644 --- a/reactos/regtests/kmregtests/tests/mm-1.c +++ b/reactos/regtests/kmregtests/tests/mm-1.c @@ -74,19 +74,19 @@ static int RunTest(char *Buffer) FAIL_IF_FALSE(BoolVal, "MmIsAddressValid() failed for pmem5"); BoolVal = MmIsNonPagedSystemAddressValid(pmem1); - FAIL_IF_FALSE(BoolVal, "MmIsAddressValid() failed for pmem1"); + FAIL_IF_FALSE(BoolVal, "MmIsNonPagedSystemAddressValid() failed for pmem1"); BoolVal = MmIsNonPagedSystemAddressValid(pmem2); - FAIL_IF_FALSE(BoolVal, "MmIsAddressValid() failed for pmem2"); + FAIL_IF_FALSE(BoolVal, "MmIsNonPagedSystemAddressValid() failed for pmem2"); BoolVal = MmIsNonPagedSystemAddressValid(pmem3); - FAIL_IF_FALSE(BoolVal, "MmIsAddressValid() failed for pmem3"); + FAIL_IF_FALSE(BoolVal, "MmIsNonPagedSystemAddressValid() failed for pmem3"); BoolVal = MmIsNonPagedSystemAddressValid(pmem4); - FAIL_IF_FALSE(BoolVal, "MmIsAddressValid() failed for pmem4"); + FAIL_IF_FALSE(BoolVal, "MmIsNonPagedSystemAddressValid() failed for pmem4"); BoolVal = MmIsNonPagedSystemAddressValid(pmem5); - FAIL_IF_FALSE(BoolVal, "MmIsAddressValid() failed for pmem5"); + FAIL_IF_FALSE(BoolVal, "MmIsNonPagedSystemAddressValid() failed for pmem5"); /* Misc functions */ Server = MmIsThisAnNtAsSystem(); From 60676825a86edceb6bbf5d51909092385193f968 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III Date: Fri, 7 May 2004 05:12:10 +0000 Subject: [PATCH 1050/1463] use bugcheck macros where appropriate so users have a better idea of why they crashed. svn path=/trunk/; revision=9317 --- reactos/drivers/dd/ide/ide.c | 4 ++-- reactos/lib/kjs/ksrc/compat.c | 2 +- reactos/lib/kjs/ksrc/js.c | 10 +++++----- reactos/ntoskrnl/inbv/inbv.c | 6 +++--- reactos/ntoskrnl/ke/catch.c | 4 ++-- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/reactos/drivers/dd/ide/ide.c b/reactos/drivers/dd/ide/ide.c index 69945a163c1..f02e57f216e 100644 --- a/reactos/drivers/dd/ide/ide.c +++ b/reactos/drivers/dd/ide/ide.c @@ -1,4 +1,4 @@ -/* $Id: ide.c,v 1.60 2004/02/10 16:22:55 navaraf Exp $ +/* $Id: ide.c,v 1.61 2004/05/07 05:12:10 royce Exp $ * * IDE.C - IDE Disk driver * written by Rex Jolliff @@ -1576,7 +1576,7 @@ STDCALL IDEStartIo(IN PDEVICE_OBJECT DeviceObject, default: Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; Irp->IoStatus.Information = 0; - KeBugCheck((ULONG)Irp); + KEBUGCHECK((ULONG)Irp); IoCompleteRequest(Irp, IO_NO_INCREMENT); IoStartNextPacket(DeviceObject, FALSE); break; diff --git a/reactos/lib/kjs/ksrc/compat.c b/reactos/lib/kjs/ksrc/compat.c index 5245fbd80d9..52b71d76aa0 100644 --- a/reactos/lib/kjs/ksrc/compat.c +++ b/reactos/lib/kjs/ksrc/compat.c @@ -4,7 +4,7 @@ #include "jsconfig.h" void __kernel_abort() { - KeBugCheck(0); + KEBUGCHECK(0); } void _assert( const char *expr, const char *file, int line ) { diff --git a/reactos/lib/kjs/ksrc/js.c b/reactos/lib/kjs/ksrc/js.c index 4fc2e5603b3..38a802f3fb4 100644 --- a/reactos/lib/kjs/ksrc/js.c +++ b/reactos/lib/kjs/ksrc/js.c @@ -24,7 +24,7 @@ /* * $Source: /cygdrive/c/RCVS/CVS/ReactOS/reactos/lib/kjs/ksrc/js.c,v $ - * $Id: js.c,v 1.1 2004/01/10 20:38:17 arty Exp $ + * $Id: js.c,v 1.2 2004/05/07 05:12:10 royce Exp $ */ #include "js.h" @@ -226,7 +226,7 @@ js_create_interp (JSInterpOptions *options, PKJS kjs) options->stacktrace_on_error, s_stdin, s_stdout, s_stderr); if (interp->vm == NULL) - KeBugCheck(0); + KEBUGCHECK(0); /* Set some options. */ interp->vm->warn_undef = options->warn_undef; @@ -253,17 +253,17 @@ js_create_interp (JSInterpOptions *options, PKJS kjs) /* Define compiler to the virtual machine. */ bc = js_bc_read_data (js_compiler_bytecode, js_compiler_bytecode_len); if (bc == NULL) - KeBugCheck(0); + KEBUGCHECK(0); result = js_vm_execute (interp->vm, bc); js_bc_free (bc); if (!result) - KeBugCheck(0); + KEBUGCHECK(0); } /* Initialize our extensions. */ if (!js_define_module (interp, js_core_globals)) - KeBugCheck(0); + KEBUGCHECK(0); /* Ok, we'r done. */ return interp; diff --git a/reactos/ntoskrnl/inbv/inbv.c b/reactos/ntoskrnl/inbv/inbv.c index f3ef7983de6..0333d5d4fbd 100755 --- a/reactos/ntoskrnl/inbv/inbv.c +++ b/reactos/ntoskrnl/inbv/inbv.c @@ -1,4 +1,4 @@ -/* $Id: inbv.c,v 1.6 2004/01/20 21:08:40 navaraf Exp $ +/* $Id: inbv.c,v 1.7 2004/05/07 05:12:10 royce Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -121,7 +121,7 @@ InbvEnableBootDriver(IN BOOLEAN Enable) sizeof(BootVidFunctionTable)); if (!NT_SUCCESS(Status)) { - KeBugCheck(0); + KEBUGCHECK(0); } BootVidDriverInstalled = TRUE; CHECKPOINT; @@ -140,7 +140,7 @@ InbvEnableBootDriver(IN BOOLEAN Enable) 0); if (!NT_SUCCESS(Status)) { - KeBugCheck(0); + KEBUGCHECK(0); } BootVidDriverInstalled = FALSE; /* Notify the hal we have released the display. */ diff --git a/reactos/ntoskrnl/ke/catch.c b/reactos/ntoskrnl/ke/catch.c index 2007b72f59b..f0c274790f7 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.41 2004/03/13 18:21:57 dwelch Exp $ +/* $Id: catch.c,v 1.42 2004/05/07 05:12:10 royce Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/catch.c @@ -169,7 +169,7 @@ KiDispatchException(PEXCEPTION_RECORD ExceptionRecord, { DPRINT("ExceptionRecord->ExceptionAddress = 0x%x\n", ExceptionRecord->ExceptionAddress ); - KeBugCheckWithTf(KMODE_EXCEPTION_NOT_HANDLED, 0, 0, 0, 0, Tf); + KEBUGCHECKWITHTF(KMODE_EXCEPTION_NOT_HANDLED, 0, 0, 0, 0, Tf); } } } From 83d8ef34bbb3283f7bf706fc422895a80e6f93fd Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Fri, 7 May 2004 11:18:53 +0000 Subject: [PATCH 1051/1463] Enable the creation of nested desktop and start menu groups. svn path=/trunk/; revision=9318 --- reactos/lib/userenv/desktop.c | 30 +++++++------- reactos/lib/userenv/directory.c | 69 ++++++++++++++++++++++++++++++++- reactos/lib/userenv/internal.h | 9 ++++- 3 files changed, 91 insertions(+), 17 deletions(-) diff --git a/reactos/lib/userenv/desktop.c b/reactos/lib/userenv/desktop.c index 04fd343216a..6163db7411e 100644 --- a/reactos/lib/userenv/desktop.c +++ b/reactos/lib/userenv/desktop.c @@ -1,4 +1,4 @@ -/* $Id: desktop.c,v 1.5 2004/05/05 15:29:15 ekohl Exp $ +/* $Id: desktop.c,v 1.6 2004/05/07 11:18:53 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -178,15 +178,15 @@ AddDesktopItemW (BOOL bCommonDesktop, &FindData); if (hFind == INVALID_HANDLE_VALUE) { - DPRINT1 ("'%S' does not exist\n", szLinkPath); + DPRINT ("'%S' does not exist\n", szLinkPath); - /* FIXME: create directory path */ - if (!CreateDirectoryW (szLinkPath, NULL)) + /* Create directory path */ + if (!CreateDirectoryPath (szLinkPath, NULL)) return FALSE; } else { - DPRINT1 ("'%S' exists\n", szLinkPath); + DPRINT ("'%S' exists\n", szLinkPath); FindClose (hFind); } @@ -330,7 +330,7 @@ CreateGroupW (LPCWSTR lpGroupName, { WCHAR szGroupPath[MAX_PATH]; - DPRINT ("CreateGroupW() called\n"); + DPRINT1 ("CreateGroupW() called\n"); if (lpGroupName == NULL || *lpGroupName == 0) return TRUE; @@ -340,19 +340,19 @@ CreateGroupW (LPCWSTR lpGroupName, DPRINT1 ("GetProgramsPath() failed\n"); return FALSE; } - DPRINT ("Programs path: '%S'\n", szGroupPath); + DPRINT1 ("Programs path: '%S'\n", szGroupPath); wcscat (szGroupPath, L"\\"); wcscat (szGroupPath, lpGroupName); - DPRINT ("Group path: '%S'\n", szGroupPath); + DPRINT1 ("Group path: '%S'\n", szGroupPath); - /* FIXME: Create directory path */ - if (!CreateDirectoryW (szGroupPath, NULL)) + /* Create directory path */ + if (!CreateDirectoryPath (szGroupPath, NULL)) return FALSE; /* FIXME: Notify the shell */ - DPRINT ("CreateGroupW() done\n"); + DPRINT1 ("CreateGroupW() done\n"); return TRUE; } @@ -389,8 +389,8 @@ DeleteGroupW (LPCWSTR lpGroupName, wcscat (szGroupPath, lpGroupName); DPRINT ("Group path: '%S'\n", szGroupPath); - /* FIXME: Remove directory path */ - if (!RemoveDirectoryW (szGroupPath)) + /* Remove directory path */ + if (!RemoveDirectoryPath (szGroupPath)) return FALSE; /* FIXME: Notify the shell */ @@ -440,7 +440,7 @@ AddItemW (LPCWSTR lpGroupName, HRESULT hr; BOOL bResult; - DPRINT ("AddDesktopItemW() called\n"); + DPRINT ("AddItemW() called\n"); bResult = FALSE; @@ -560,7 +560,7 @@ AddItemW (LPCWSTR lpGroupName, CoUninitialize(); - DPRINT ("AddDesktopItemW() done\n"); + DPRINT ("AddItemW() done\n"); return bResult; } diff --git a/reactos/lib/userenv/directory.c b/reactos/lib/userenv/directory.c index 26d981b7cd0..9bc5e62df9f 100644 --- a/reactos/lib/userenv/directory.c +++ b/reactos/lib/userenv/directory.c @@ -1,4 +1,4 @@ -/* $Id: directory.c,v 1.2 2004/01/16 15:31:53 ekohl Exp $ +/* $Id: directory.c,v 1.3 2004/05/07 11:18:53 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -116,4 +116,71 @@ CopyDirectory (LPCWSTR lpDestinationPath, return TRUE; } + +BOOL +CreateDirectoryPath (LPCWSTR lpPathName, + LPSECURITY_ATTRIBUTES lpSecurityAttributes) +{ + WCHAR szPath[MAX_PATH]; + LPWSTR Ptr; + DWORD dwError; + + DPRINT ("CreateDirectoryPath() called\n"); + + if (lpPathName == NULL || *lpPathName == 0) + return TRUE; + + if (CreateDirectoryW (lpPathName, + lpSecurityAttributes)) + return TRUE; + + dwError = GetLastError (); + if (dwError == ERROR_ALREADY_EXISTS) + return TRUE; + + wcscpy (szPath, lpPathName); + + if (wcslen(szPath) > 3 && szPath[1] == ':' && szPath[2] == '\\') + { + Ptr = &szPath[3]; + } + else + { + Ptr = szPath; + } + + while (Ptr != NULL) + { + Ptr = wcschr (Ptr, L'\\'); + if (Ptr != NULL) + *Ptr = 0; + + DPRINT ("CreateDirectory(%S)\n", szPath); + if (!CreateDirectoryW (szPath, + lpSecurityAttributes)) + { + dwError = GetLastError (); + if (dwError != ERROR_ALREADY_EXISTS) + return FALSE; + } + + if (Ptr != NULL) + { + *Ptr = L'\\'; + Ptr++; + } + } + + DPRINT ("CreateDirectoryPath() done\n"); + + return TRUE; +} + + +BOOL +RemoveDirectoryPath (LPCWSTR lpPathName) +{ + return RemoveDirectoryW (lpPathName); +} + /* EOF */ diff --git a/reactos/lib/userenv/internal.h b/reactos/lib/userenv/internal.h index 4458b5fb8b6..8343e2d4354 100644 --- a/reactos/lib/userenv/internal.h +++ b/reactos/lib/userenv/internal.h @@ -1,4 +1,4 @@ -/* $Id: internal.h,v 1.5 2004/03/13 20:49:07 ekohl Exp $ +/* $Id: internal.h,v 1.6 2004/05/07 11:18:53 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -29,6 +29,13 @@ BOOL CopyDirectory (LPCWSTR lpDestinationPath, LPCWSTR lpSourcePath); +BOOL +CreateDirectoryPath (LPCWSTR lpPathName, + LPSECURITY_ATTRIBUTES lpSecurityAttributes); + +BOOL +RemoveDirectoryPath (LPCWSTR lpPathName); + /* misc.c */ LPWSTR AppendBackslash (LPWSTR String); From eb065653f621bf6f2b9ccc4ae707dfa227e36cea Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 7 May 2004 12:13:13 +0000 Subject: [PATCH 1052/1463] - Protect against reads from (and writes to) closed named pipes. svn path=/trunk/; revision=9319 --- reactos/drivers/fs/np/create.c | 3 ++- reactos/drivers/fs/np/rw.c | 42 +++++++++++++++++++++++++--------- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/reactos/drivers/fs/np/create.c b/reactos/drivers/fs/np/create.c index 5232a9b8d35..88e3766c73a 100644 --- a/reactos/drivers/fs/np/create.c +++ b/reactos/drivers/fs/np/create.c @@ -1,4 +1,4 @@ -/* $Id: create.c,v 1.19 2004/05/05 18:30:16 navaraf Exp $ +/* $Id: create.c,v 1.20 2004/05/07 12:13:13 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -473,6 +473,7 @@ NpfsClose( if (Fcb->OtherSide) { Fcb->OtherSide->PipeState = FILE_PIPE_CLOSING_STATE; + Fcb->OtherSide->OtherSide = NULL; /* * Signaling the write event. If is possible that an other * thread waits of an empty buffer. diff --git a/reactos/drivers/fs/np/rw.c b/reactos/drivers/fs/np/rw.c index c454ad4a23c..a693b5465a3 100644 --- a/reactos/drivers/fs/np/rw.c +++ b/reactos/drivers/fs/np/rw.c @@ -1,4 +1,4 @@ -/* $Id: rw.c,v 1.13 2004/05/05 18:30:16 navaraf Exp $ +/* $Id: rw.c,v 1.14 2004/05/07 12:13:13 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -13,7 +13,7 @@ #include #include "npfs.h" -#define NDEBUG +//#define NDEBUG #include /* FUNCTIONS *****************************************************************/ @@ -99,15 +99,25 @@ NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp) Status = STATUS_PIPE_BROKEN; goto done; } - /* Wait for ReadEvent to become signaled */ - DPRINT("Waiting for readable data (%S)\n", Pipe->PipeName.Buffer); - Status = KeWaitForSingleObject(&Fcb->Event, - UserRequest, - KernelMode, - FALSE, - NULL); - DPRINT("Finished waiting (%S)! Status: %x\n", Pipe->PipeName.Buffer, Status); - KeAcquireSpinLock(&ReadFcb->DataListLock, &OldIrql); + /* Wait for ReadEvent to become signaled */ + DPRINT("Waiting for readable data (%S)\n", Pipe->PipeName.Buffer); + Status = KeWaitForSingleObject(&Fcb->Event, + UserRequest, + KernelMode, + FALSE, + NULL); + DPRINT("Finished waiting (%S)! Status: %x\n", Pipe->PipeName.Buffer, Status); + /* + * It's possible that the event was signaled because the + * other side of pipe was closed. + */ + if (Fcb->PipeState != FILE_PIPE_CONNECTED_STATE) + { + DPRINT("PipeState: %x\n", Fcb->PipeState); + Status = STATUS_PIPE_BROKEN; + goto done; + } + KeAcquireSpinLock(&ReadFcb->DataListLock, &OldIrql); } if (Pipe->PipeReadMode == FILE_PIPE_BYTE_STREAM_MODE) @@ -288,6 +298,16 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject, FALSE, NULL); DPRINT("Finished waiting (%S)! Status: %x\n", Pipe->PipeName.Buffer, Status); + /* + * It's possible that the event was signaled because the + * other side of pipe was closed. + */ + if (Fcb->PipeState != FILE_PIPE_CONNECTED_STATE) + { + DPRINT("PipeState: %x\n", Fcb->PipeState); + Status = STATUS_PIPE_BROKEN; + goto done; + } KeAcquireSpinLock(&Fcb->DataListLock, &OldIrql); } if (Pipe->PipeWriteMode == FILE_PIPE_BYTE_STREAM_MODE) From 739592deab4cfec72c834d6038aa3de2f7e13ce8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sat, 8 May 2004 09:19:53 +0000 Subject: [PATCH 1053/1463] Patch by tonik GuiConsoleUpdateBitmap ignores the color attribute of the first character in line, instead it takes the attribute of the last character of the previous line. svn path=/trunk/; revision=9320 --- reactos/subsys/csrss/win32csr/guiconsole.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/csrss/win32csr/guiconsole.c b/reactos/subsys/csrss/win32csr/guiconsole.c index 4a437f1381c..8b3af6eed8d 100644 --- a/reactos/subsys/csrss/win32csr/guiconsole.c +++ b/reactos/subsys/csrss/win32csr/guiconsole.c @@ -1,4 +1,4 @@ -/* $Id: guiconsole.c,v 1.13 2004/04/09 20:03:16 navaraf Exp $ +/* $Id: guiconsole.c,v 1.14 2004/05/08 09:19:53 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -229,12 +229,11 @@ GuiConsoleUpdateBitmap(HWND hWnd, RECT rc) From = Buff->Buffer + ((Line - (Buff->MaxY - Buff->ShowY)) * Buff->MaxX + LeftChar) * 2; } - Attribute = *(From + 1); Start = LeftChar; To = GuiData->LineBuffer; for (Char = LeftChar; Char <= RightChar; Char++) { - if (*(From + 1) != Attribute) + if (*(From + 1) != LastAttribute) { TextOutW(GuiData->MemoryDC, Start * GuiData->CharWidth, Line * GuiData->CharHeight, GuiData->LineBuffer, Char - Start); From 2f07e000b4a7d9093349530fb18989f72aa7ffb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sat, 8 May 2004 11:41:05 +0000 Subject: [PATCH 1054/1463] Sync to Wine-20040505: Ilya Korniyko - Added Ukrainian translations. Francois Gouget - Make Unicode strings static const. - Make our ascii strings static const. - Remove a couple string variables that were used only once and use the string literal directly. Krzysztof Foltman - make monthcal a child of datetime (it was a sibling before, causing completely incorrect message flow) - update monthcal after date change in datetime - choose different coordinates when DTS_SHOWNONE is not used - embedded monthcal is now 200 pixels wide - selecting a day in embedded monthcal updates the datetime and hides the monthcal - changing months/years by clicking month name/year in title bar works - embedded month calendar is correctly destroyed (it used to stick on the screen long after the datetime's container was closed) - next/prev month don't stick anymore - min/max ranges initialized to some reasonable values - fixed some bugs caused by reversed order of arguments of MONTHCAL_CopyTime - update current month/year after setting current date - changing months etc doesn't send MCN_SELECT (which could be sent only after a particular day was clicked) - changed (hit && MCHT_CALENDARDATE) to (hit == MCHT_CALENDARDATE) Huw Davies - Deleting column zero should only delete the column and not the item data. - Implemented TVS_NOSCROLL. Maxime Bellenge - Add NM_RCLICK notification support for toolbars. - Fix the size of the listview items in the customize dialog. - Fix TB_GETSTYLE message to return the style of the toolbar and not the style of a button. Robert Shearman - Optimise accessing toolbar style by storing it in the TOOLBAR_INFO structure. - Replace {Get,Set}WindowLong by {Get,Set}WindowLongPtr where appropriate. svn path=/trunk/; revision=9321 --- reactos/lib/comctl32/comboex.c | 8 +- reactos/lib/comctl32/comctl32undoc.c | 4 +- reactos/lib/comctl32/comctl_Uk.rc | 88 ++++++++++++++++++ reactos/lib/comctl32/datetime.c | 44 +++++++-- reactos/lib/comctl32/header.c | 3 +- reactos/lib/comctl32/ipaddress.c | 8 +- reactos/lib/comctl32/listview.c | 22 ++--- reactos/lib/comctl32/monthcal.c | 54 ++++++----- reactos/lib/comctl32/propsheet.c | 2 +- reactos/lib/comctl32/rsrc.rc | 1 + reactos/lib/comctl32/toolbar.c | 127 +++++++++++++++----------- reactos/lib/comctl32/trackbar.c | 3 +- reactos/lib/comctl32/treeview.c | 10 +- reactos/lib/comctl32/winehq2ros.patch | 101 +++++++++++++++----- 14 files changed, 336 insertions(+), 139 deletions(-) create mode 100644 reactos/lib/comctl32/comctl_Uk.rc diff --git a/reactos/lib/comctl32/comboex.c b/reactos/lib/comctl32/comboex.c index 3b1a0b548a7..7f55192c646 100644 --- a/reactos/lib/comctl32/comboex.c +++ b/reactos/lib/comctl32/comboex.c @@ -915,9 +915,9 @@ static INT COMBOEX_SetItemHeight (COMBOEX_INFO *infoPtr, INT index, UINT height) static LRESULT COMBOEX_Create (HWND hwnd, LPCREATESTRUCTA cs) { - WCHAR COMBOBOX[] = { 'C', 'o', 'm', 'b', 'o', 'B', 'o', 'x', 0 }; - WCHAR EDIT[] = { 'E', 'D', 'I', 'T', 0 }; - WCHAR NIL[] = { 0 }; + static const WCHAR COMBOBOX[] = { 'C', 'o', 'm', 'b', 'o', 'B', 'o', 'x', 0 }; + static const WCHAR EDIT[] = { 'E', 'D', 'I', 'T', 0 }; + static const WCHAR NIL[] = { 0 }; COMBOEX_INFO *infoPtr; LOGFONTW mylogfont; RECT wnrc1, clrc1, cmbwrc; @@ -1281,7 +1281,7 @@ static BOOL COMBOEX_WM_DeleteItem (COMBOEX_INFO *infoPtr, DELETEITEMSTRUCT *dis) static LRESULT COMBOEX_DrawItem (COMBOEX_INFO *infoPtr, DRAWITEMSTRUCT *dis) { - WCHAR nil[] = { 0 }; + static const WCHAR nil[] = { 0 }; CBE_ITEMDATA *item = 0; SIZE txtsize; RECT rect; diff --git a/reactos/lib/comctl32/comctl32undoc.c b/reactos/lib/comctl32/comctl32undoc.c index fabc4d59032..8944c197257 100644 --- a/reactos/lib/comctl32/comctl32undoc.c +++ b/reactos/lib/comctl32/comctl32undoc.c @@ -523,7 +523,7 @@ VOID MRU_SaveChanged( LPWINEMRULIST mp ) HKEY newkey; WCHAR realname[2]; LPWINEMRUITEM witem; - WCHAR emptyW[] = {'\0'}; + static const WCHAR emptyW[] = {'\0'}; /* or should we do the following instead of RegOpenKeyEx: */ @@ -859,7 +859,7 @@ HANDLE CreateMRUListLazy_common(LPWINEMRULIST mp) WCHAR realname[2]; LPWINEMRUITEM witem; DWORD type; - WCHAR emptyW[] = {'\0'}; + static const WCHAR emptyW[] = {'\0'}; /* get space to save indices that will turn into names * but in order of most to least recently used diff --git a/reactos/lib/comctl32/comctl_Uk.rc b/reactos/lib/comctl32/comctl_Uk.rc new file mode 100644 index 00000000000..fecaddd80bc --- /dev/null +++ b/reactos/lib/comctl32/comctl_Uk.rc @@ -0,0 +1,88 @@ +/* + * comctl (Ukrainian resources) + * + * 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 + +IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE +CAPTION "魈劣陨紫釉і 奶 " +FONT 8, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "OK", IDOK,4,122,50,14, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&і耐і瘟", IDCANCEL,58,122,50,14 + PUSHBUTTON "&釉嫌兆猎", IDC_APPLY_BUTTON,112,122,50,14,WS_DISABLED + PUSHBUTTON "&湎і乃", IDHELP,166,122,50,14,WS_TABSTOP|WS_GROUP + CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS|WS_GROUP|WS_TABSTOP|TCS_MULTILINE,4,4,212,114 +END + + +IDD_WIZARD DIALOG DISCARDABLE 0, 0, 290, 159 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE +CAPTION "砹釉乓" +FONT 8, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "&着役稍", IDC_FINISH_BUTTON,121,138,50,14 + DEFPUSHBUTTON "&淞і >", IDC_NEXT_BUTTON,121,138,50,14 + PUSHBUTTON "< &盍诹", IDC_BACK_BUTTON,71,138,50,14 + PUSHBUTTON "&і耐і瘟", IDCANCEL,178,138,50,14 + PUSHBUTTON "&湎і乃", IDHELP,235,138,50,14,WS_GROUP + LTEXT "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN + CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5 +END + + +IDD_TBCUSTOMIZE DIALOG DISCARDABLE 10, 20, 357, 125 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "盍釉蚁仕 辛闻і і斡砸胀盼і" +FONT 8, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "&艘稍", IDCANCEL,308,6,44,14 + PUSHBUTTON "&笏晌赵", IDC_RESET_BTN,308,23,44,14 + PUSHBUTTON "&湎і乃", IDC_HELP_BTN,308,40,44,14 + PUSHBUTTON "鹋遗诱握陨 &窍艺", IDC_MOVEUP_BTN,308,74,44,14 + PUSHBUTTON "鹋遗诱握陨 南&紊谡", IDC_MOVEDN_BTN,308,91,44,14 + LTEXT "盍&炎і 宋闲松:", -1,4,5,84,10 + LISTBOX IDC_AVAILBTN_LBOX,4,17,120,100, LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP + PUSHBUTTON "&湎牧陨 ->", IDOK, 131, 42, 44, 14 + PUSHBUTTON "<- &鹨陕伊陨", IDC_REMOVE_BTN,131,62,44,14 + LTEXT "&胛闲松 辛闻і і斡砸胀盼і:", -1,182,5,78,10 + LISTBOX IDC_TOOLBARBTN_LBOX, 182,17,120,100,LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP +END + +STRINGTABLE DISCARDABLE +{ + IDS_CLOSE "艘稍" +} + +STRINGTABLE DISCARDABLE +{ + IDM_TODAY "筘锨夏і:" + IDM_GOTODAY "鹣韵尬 牧粤" +} + +STRINGTABLE DISCARDABLE +{ + IDS_SEPARATOR "蛳谀і特紊" +} + +STRINGTABLE DISCARDABLE +{ + HKY_NONE "钆土" +} diff --git a/reactos/lib/comctl32/datetime.c b/reactos/lib/comctl32/datetime.c index 9741560bff0..aab70245caa 100644 --- a/reactos/lib/comctl32/datetime.c +++ b/reactos/lib/comctl32/datetime.c @@ -148,13 +148,14 @@ DATETIME_SetSystemTime (HWND hwnd, WPARAM wParam, LPARAM lParam ) TRACE("%p %04x %08lx\n",hwnd, wParam, lParam); if (!lParam) return 0; - TRACE("%04d/%02d/%02d %02d:%02d:%02d)\n", + TRACE("%04d/%02d/%02d %02d:%02d:%02d\n", lprgSysTimeArray->wYear, lprgSysTimeArray->wMonth, lprgSysTimeArray->wDay, lprgSysTimeArray->wHour, lprgSysTimeArray->wMinute, lprgSysTimeArray->wSecond); if (wParam==GDT_VALID) { infoPtr->dateValid = TRUE; MONTHCAL_CopyTime (lprgSysTimeArray, &infoPtr->date); + SendMessageA(infoPtr->hMonthCal, MCM_SETCURSEL, 0, (LPARAM)(&infoPtr->date)); SendMessageA (infoPtr->hwndCheckbut, BM_SETCHECK, BST_CHECKED, 0); } else if (wParam==GDT_NONE) { infoPtr->dateValid = FALSE; @@ -784,8 +785,10 @@ static void DATETIME_Refresh (HWND hwnd, HDC hdc) GetTextExtentPoint32A (hdc, txt, strlen (txt), &size); rcDraw->bottom = size.cy+2; - if (dwStyle & DTS_SHOWNONE) checkbox->right = 18; - + if (dwStyle & DTS_SHOWNONE) + checkbox->right = 18; + else + checkbox->right = 2; prevright = checkbox->right; for (i=0; inrFields; i++) { @@ -882,19 +885,25 @@ DATETIME_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam) /* recalculate the position of the monthcal popup */ if(dwStyle & DTS_RIGHTALIGN) infoPtr->monthcal_pos.x = infoPtr->rcClient.right - ((infoPtr->calbutton.right - - infoPtr->calbutton.left) + 145); + infoPtr->calbutton.left) + 200); else infoPtr->monthcal_pos.x = 8; infoPtr->monthcal_pos.y = infoPtr->rcClient.bottom; ClientToScreen (hwnd, &(infoPtr->monthcal_pos)); + /* FIXME My Windoze has cx=about 200, but it probably depends on font size etc */ SetWindowPos(infoPtr->hMonthCal, 0, infoPtr->monthcal_pos.x, - infoPtr->monthcal_pos.y, 145, 150, 0); + infoPtr->monthcal_pos.y, 200, 150, 0); if(IsWindowVisible(infoPtr->hMonthCal)) ShowWindow(infoPtr->hMonthCal, SW_HIDE); - else - ShowWindow(infoPtr->hMonthCal, SW_SHOW); + else { + SYSTEMTIME *lprgSysTimeArray = &infoPtr->date; + TRACE("update calendar %04d/%02d/%02d\n", + lprgSysTimeArray->wYear, lprgSysTimeArray->wMonth, lprgSysTimeArray->wDay); + SendMessageA(infoPtr->hMonthCal, MCM_SETCURSEL, 0, (LPARAM)(&infoPtr->date)); + ShowWindow(infoPtr->hMonthCal, SW_SHOW); + } TRACE ("dt:%p mc:%p mc parent:%p, desktop:%p\n", hwnd, infoPtr->hMonthCal, infoPtr->hwndNotify, GetDesktopWindow ()); @@ -995,6 +1004,17 @@ DATETIME_Notify (HWND hwnd, WPARAM wParam, LPARAM lParam) TRACE ("%x,%lx\n",wParam, lParam); TRACE ("Got notification %x from %p\n", lpnmh->code, lpnmh->hwndFrom); TRACE ("info: %p %p %p\n",hwnd,infoPtr->hMonthCal,infoPtr->hUpdown); + + if (lpnmh->code==MCN_SELECT) { + ShowWindow(infoPtr->hMonthCal, SW_HIDE); + infoPtr->dateValid = TRUE; + SendMessageA (infoPtr->hMonthCal, MCM_GETCURSEL, 0, (LPARAM)&infoPtr->date); + TRACE("got from calendar %04d/%02d/%02d\n", + infoPtr->date.wYear, infoPtr->date.wMonth, infoPtr->date.wDay); + SendMessageA (infoPtr->hwndCheckbut, BM_SETCHECK, BST_CHECKED, 0); + InvalidateRect(hwnd, NULL, TRUE); + DATETIME_SendDateTimeChangeNotify (hwnd); + } return 0; } @@ -1232,7 +1252,7 @@ DATETIME_Create (HWND hwnd, WPARAM wParam, LPARAM lParam) infoPtr->hMonthCal = CreateWindowExA (0,"SysMonthCal32", 0, WS_BORDER | WS_POPUP | WS_CLIPSIBLINGS, 0, 0, 0, 0, - infoPtr->hwndNotify, + hwnd, 0, 0, 0); /* initialize info structure */ @@ -1249,8 +1269,14 @@ DATETIME_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam) DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd); TRACE("\n"); + if (infoPtr->hMonthCal) { + /* FIXME I don't completely understand why doesn't it + * happen automatically, WS_POPUP maybe? */ + DestroyWindow(infoPtr->hMonthCal); + infoPtr->hMonthCal = NULL; + } Free (infoPtr); - SetWindowLongA( hwnd, 0, 0 ); + SetWindowLongA( hwnd, 0, 0 ); /* clear infoPtr */ return 0; } diff --git a/reactos/lib/comctl32/header.c b/reactos/lib/comctl32/header.c index 7c1e8a69706..0d592791075 100644 --- a/reactos/lib/comctl32/header.c +++ b/reactos/lib/comctl32/header.c @@ -924,9 +924,8 @@ HEADER_InsertItemA (HWND hwnd, WPARAM wParam, LPARAM lParam) lpItem->cxy = phdi->cxy; if (phdi->mask & HDI_TEXT) { - static char empty[] = ""; if (!phdi->pszText) /* null pointer check */ - phdi->pszText = empty; + phdi->pszText = ""; if (phdi->pszText != LPSTR_TEXTCALLBACKA) { len = MultiByteToWideChar(CP_ACP, 0, phdi->pszText, -1, NULL, 0); lpItem->pszText = Alloc( len*sizeof(WCHAR) ); diff --git a/reactos/lib/comctl32/ipaddress.c b/reactos/lib/comctl32/ipaddress.c index 61b463dd8ad..d1d52ce064e 100644 --- a/reactos/lib/comctl32/ipaddress.c +++ b/reactos/lib/comctl32/ipaddress.c @@ -155,7 +155,7 @@ static LRESULT IPADDRESS_Create (HWND hwnd, LPCREATESTRUCTA lpCreate) IPADDRESS_INFO *infoPtr; RECT rcClient, edit; int i, fieldsize; - WCHAR EDIT[] = { 'E', 'd', 'i', 't', 0 }; + static const WCHAR EDIT[] = { 'E', 'd', 'i', 't', 0 }; TRACE("\n"); @@ -291,7 +291,8 @@ static void IPADDRESS_ClearAddress (IPADDRESS_INFO *infoPtr) static LRESULT IPADDRESS_SetAddress (IPADDRESS_INFO *infoPtr, DWORD ip_address) { - WCHAR buf[20], fmt[] = { '%', 'd', 0 }; + WCHAR buf[20]; + static const WCHAR fmt[] = { '%', 'd', 0 }; int i; TRACE("\n"); @@ -328,7 +329,8 @@ static void IPADDRESS_SetFocusToField (IPADDRESS_INFO *infoPtr, INT index) static BOOL IPADDRESS_ConstrainField (IPADDRESS_INFO *infoPtr, int currentfield) { IPPART_INFO *part = &infoPtr->Part[currentfield]; - WCHAR field[10], fmt[] = { '%', 'd', 0 }; + WCHAR field[10]; + static const WCHAR fmt[] = { '%', 'd', 0 }; int curValue, newValue; TRACE("(currentfield=%d)\n", currentfield); diff --git a/reactos/lib/comctl32/listview.c b/reactos/lib/comctl32/listview.c index 249cb98cccd..8a6e8ad0fbe 100644 --- a/reactos/lib/comctl32/listview.c +++ b/reactos/lib/comctl32/listview.c @@ -3553,7 +3553,7 @@ static BOOL LISTVIEW_DrawItem(LISTVIEW_INFO *infoPtr, HDC hdc, INT nItem, INT nS { UINT uFormat, uView = infoPtr->dwStyle & LVS_TYPEMASK; WCHAR szDispText[DISP_TEXT_SIZE] = { '\0' }; - WCHAR szCallback[] = { '(', 'c', 'a', 'l', 'l', 'b', 'a', 'c', 'k', ')', 0 }; + static const WCHAR szCallback[] = { '(', 'c', 'a', 'l', 'l', 'b', 'a', 'c', 'k', ')', 0 }; DWORD cdsubitemmode = CDRF_DODEFAULT; RECT* lprcFocus, rcSelect, rcBox, rcState, rcIcon, rcLabel; NMLVCUSTOMDRAW nmlvcd; @@ -3576,7 +3576,7 @@ static BOOL LISTVIEW_DrawItem(LISTVIEW_INFO *infoPtr, HDC hdc, INT nItem, INT nS if (!LISTVIEW_GetItemW(infoPtr, &lvItem)) return FALSE; if (nSubItem > 0 && (infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT)) lvItem.state = LISTVIEW_GetItemState(infoPtr, nItem, LVIS_SELECTED); - if (lvItem.pszText == LPSTR_TEXTCALLBACKW) lvItem.pszText = szCallback; + if (lvItem.pszText == LPSTR_TEXTCALLBACKW) lvItem.pszText = (LPWSTR)szCallback; TRACE(" lvItem=%s\n", debuglvitem_t(&lvItem, TRUE)); /* now check if we need to update the focus rectangle */ @@ -4230,13 +4230,9 @@ static BOOL LISTVIEW_DeleteColumn(LISTVIEW_INFO *infoPtr, INT nColumn) || nColumn >= DPA_GetPtrCount(infoPtr->hdpaColumns)) return FALSE; /* While the MSDN specifically says that column zero should not be deleted, - it does in fact work on WinNT, and at least one app depends on it. On - WinNT, deleting column zero deletes the last column of items but the - first header. Since no app will ever depend on that bizarre behavior, - we just delete the last column including the header. + what actually happens is that the column itself is deleted but no items or subitems + are removed. */ - if (nColumn == 0) - nColumn = DPA_GetPtrCount(infoPtr->hdpaColumns) - 1; LISTVIEW_GetHeaderRect(infoPtr, nColumn, &rcCol); @@ -4246,15 +4242,12 @@ static BOOL LISTVIEW_DeleteColumn(LISTVIEW_INFO *infoPtr, INT nColumn) Free(DPA_GetPtr(infoPtr->hdpaColumns, nColumn)); DPA_DeletePtr(infoPtr->hdpaColumns, nColumn); - if (!(infoPtr->dwStyle & LVS_OWNERDATA)) + if (!(infoPtr->dwStyle & LVS_OWNERDATA) && nColumn) { SUBITEM_INFO *lpSubItem, *lpDelItem; HDPA hdpaSubItems; INT nItem, nSubItem, i; - if (nColumn == 0) - return LISTVIEW_DeleteAllItems(infoPtr); - for (nItem = 0; nItem < infoPtr->nItemCount; nItem++) { hdpaSubItems = (HDPA)DPA_GetPtr(infoPtr->hdpaItems, nItem); @@ -4291,7 +4284,10 @@ static BOOL LISTVIEW_DeleteColumn(LISTVIEW_INFO *infoPtr, INT nColumn) } /* update the other column info */ - LISTVIEW_ScrollColumns(infoPtr, nColumn, -(rcCol.right - rcCol.left)); + if(DPA_GetPtrCount(infoPtr->hdpaColumns) == 0) + LISTVIEW_InvalidateList(infoPtr); + else + LISTVIEW_ScrollColumns(infoPtr, nColumn, -(rcCol.right - rcCol.left)); return TRUE; } diff --git a/reactos/lib/comctl32/monthcal.c b/reactos/lib/comctl32/monthcal.c index 5514da25378..a7be319a7ba 100644 --- a/reactos/lib/comctl32/monthcal.c +++ b/reactos/lib/comctl32/monthcal.c @@ -948,7 +948,7 @@ static LRESULT MONTHCAL_SetRange(HWND hwnd, WPARAM wParam, LPARAM lParam) { MONTHCAL_INFO *infoPtr = MONTHCAL_GetInfoPtr(hwnd); - SYSTEMTIME lprgSysTimeArray[1]; + SYSTEMTIME *lprgSysTimeArray=(SYSTEMTIME *)lParam; int prev; TRACE("%x %lx\n", wParam, lParam); @@ -1033,6 +1033,7 @@ MONTHCAL_GetCurSel(HWND hwnd, WPARAM wParam, LPARAM lParam) if(GetWindowLongA(hwnd, GWL_STYLE) & MCS_MULTISELECT) return FALSE; MONTHCAL_CopyTime(&infoPtr->minSel, lpSel); + TRACE("%d/%d/%d\n", lpSel->wYear, lpSel->wMonth, lpSel->wDay); return TRUE; } @@ -1048,7 +1049,8 @@ MONTHCAL_SetCurSel(HWND hwnd, WPARAM wParam, LPARAM lParam) if((infoPtr==NULL) ||(lpSel==NULL)) return FALSE; if(GetWindowLongA(hwnd, GWL_STYLE) & MCS_MULTISELECT) return FALSE; - TRACE("%d %d\n", lpSel->wMonth, lpSel->wDay); + infoPtr->currentMonth=lpSel->wMonth; + infoPtr->currentYear=lpSel->wYear; MONTHCAL_CopyTime(lpSel, &infoPtr->minSel); MONTHCAL_CopyTime(lpSel, &infoPtr->maxSel); @@ -1479,23 +1481,24 @@ MONTHCAL_LButtonDown(HWND hwnd, WPARAM wParam, LPARAM lParam) InvalidateRect(hwnd, NULL, FALSE); return TRUE; } - if(hit && MCHT_CALENDARDATE) { + if(hit == MCHT_CALENDARDATE) { SYSTEMTIME selArray[2]; NMSELCHANGE nmsc; - TRACE("MCHT_CALENDARDATE\n"); - nmsc.nmhdr.hwndFrom = hwnd; - nmsc.nmhdr.idFrom = GetWindowLongA(hwnd, GWL_ID); - nmsc.nmhdr.code = MCN_SELCHANGE; - MONTHCAL_CopyTime(&nmsc.stSelStart, &infoPtr->minSel); - MONTHCAL_CopyTime(&nmsc.stSelEnd, &infoPtr->maxSel); - - SendMessageA(infoPtr->hwndNotify, WM_NOTIFY, - (WPARAM)nmsc.nmhdr.idFrom,(LPARAM)&nmsc); - MONTHCAL_CopyTime(&ht.st, &selArray[0]); MONTHCAL_CopyTime(&ht.st, &selArray[1]); MONTHCAL_SetSelRange(hwnd,0,(LPARAM) &selArray); + MONTHCAL_SetCurSel(hwnd,0,(LPARAM) &selArray); + TRACE("MCHT_CALENDARDATE\n"); + nmsc.nmhdr.hwndFrom = hwnd; + nmsc.nmhdr.idFrom = GetWindowLongA(hwnd, GWL_ID); + nmsc.nmhdr.code = MCN_SELCHANGE; + MONTHCAL_CopyTime(&infoPtr->minSel,&nmsc.stSelStart); + MONTHCAL_CopyTime(&infoPtr->maxSel,&nmsc.stSelEnd); + + SendMessageA(infoPtr->hwndNotify, WM_NOTIFY, + (WPARAM)nmsc.nmhdr.idFrom,(LPARAM)&nmsc); + /* redraw both old and new days if the selected day changed */ if(infoPtr->curSelDay != ht.st.wDay) { @@ -1530,10 +1533,12 @@ MONTHCAL_LButtonUp(HWND hwnd, WPARAM wParam, LPARAM lParam) if(infoPtr->status & MC_NEXTPRESSED) { KillTimer(hwnd, MC_NEXTMONTHTIMER); + infoPtr->status &= ~MC_NEXTPRESSED; redraw = TRUE; } if(infoPtr->status & MC_PREVPRESSED) { KillTimer(hwnd, MC_PREVMONTHTIMER); + infoPtr->status &= ~MC_PREVPRESSED; redraw = TRUE; } @@ -1560,20 +1565,21 @@ MONTHCAL_LButtonUp(HWND hwnd, WPARAM wParam, LPARAM lParam) SendMessageA(infoPtr->hwndNotify, WM_NOTIFY, (WPARAM)nmhdr.idFrom, (LPARAM)&nmhdr); - - nmsc.nmhdr.hwndFrom = hwnd; - nmsc.nmhdr.idFrom = GetWindowLongA(hwnd, GWL_ID); - nmsc.nmhdr.code = MCN_SELECT; - MONTHCAL_CopyTime(&nmsc.stSelStart, &infoPtr->minSel); - MONTHCAL_CopyTime(&nmsc.stSelEnd, &infoPtr->maxSel); - - SendMessageA(infoPtr->hwndNotify, WM_NOTIFY, - (WPARAM)nmsc.nmhdr.idFrom, (LPARAM)&nmsc); - /* redraw if necessary */ if(redraw) InvalidateRect(hwnd, NULL, FALSE); + /* only send MCN_SELECT if currently displayed month's day was selected */ + if(hit == MCHT_CALENDARDATE) { + nmsc.nmhdr.hwndFrom = hwnd; + nmsc.nmhdr.idFrom = GetWindowLongA(hwnd, GWL_ID); + nmsc.nmhdr.code = MCN_SELECT; + MONTHCAL_CopyTime(&infoPtr->minSel, &nmsc.stSelStart); + MONTHCAL_CopyTime(&infoPtr->maxSel, &nmsc.stSelEnd); + SendMessageA(infoPtr->hwndNotify, WM_NOTIFY, + (WPARAM)nmsc.nmhdr.idFrom, (LPARAM)&nmsc); + + } return 0; } @@ -1898,6 +1904,8 @@ MONTHCAL_Create(HWND hwnd, WPARAM wParam, LPARAM lParam) infoPtr->currentYear = infoPtr->todaysDate.wYear; MONTHCAL_CopyTime(&infoPtr->todaysDate, &infoPtr->minDate); MONTHCAL_CopyTime(&infoPtr->todaysDate, &infoPtr->maxDate); + infoPtr->maxDate.wYear=2050; + infoPtr->minDate.wYear=1950; infoPtr->maxSelCount = 7; infoPtr->monthRange = 3; infoPtr->monthdayState = Alloc diff --git a/reactos/lib/comctl32/propsheet.c b/reactos/lib/comctl32/propsheet.c index 3ee7de384c5..20b4a910ce9 100644 --- a/reactos/lib/comctl32/propsheet.c +++ b/reactos/lib/comctl32/propsheet.c @@ -524,7 +524,7 @@ BOOL PROPSHEET_CollectPageInfo(LPCPROPSHEETPAGEW lppsp, { WCHAR szTitle[256]; const WCHAR *pTitle; - static WCHAR pszNull[] = { '(','n','u','l','l',')',0 }; + static const WCHAR pszNull[] = { '(','n','u','l','l',')',0 }; int len; if ( !HIWORD( lppsp->pszTitle ) ) diff --git a/reactos/lib/comctl32/rsrc.rc b/reactos/lib/comctl32/rsrc.rc index ea280e1be19..5903d7560dc 100644 --- a/reactos/lib/comctl32/rsrc.rc +++ b/reactos/lib/comctl32/rsrc.rc @@ -1128,3 +1128,4 @@ IDI_DRAGARROW ICON LOADONCALL DISCARDABLE idi_dragarrow.ico #include "comctl_Ru.rc" #include "comctl_Si.rc" #include "comctl_Th.rc" +#include "comctl_Uk.rc" diff --git a/reactos/lib/comctl32/toolbar.c b/reactos/lib/comctl32/toolbar.c index 5362291e53b..1b145c8daef 100644 --- a/reactos/lib/comctl32/toolbar.c +++ b/reactos/lib/comctl32/toolbar.c @@ -52,7 +52,6 @@ * - Notifications: * - NM_CHAR * - NM_KEYDOWN - * - NM_RCLICK * - NM_RDBLCLICK * - TBN_DRAGOUT * - TBN_GETOBJECT @@ -170,6 +169,7 @@ typedef struct BOOL bAnchor; /* anchor highlight enabled */ BOOL bNtfUnicode; /* TRUE if NOTIFYs use {W} */ BOOL bDoRedraw; /* Redraw status */ + DWORD dwStyle; /* regular toolbar style */ DWORD dwExStyle; /* extended toolbar style */ DWORD dwDTFlags; /* DrawText flags */ @@ -220,7 +220,7 @@ typedef enum /* how wide to treat the bitmap if it isn't present */ #define LIST_IMAGE_ABSENT_WIDTH 2 -#define TOOLBAR_GetInfoPtr(hwnd) ((TOOLBAR_INFO *)GetWindowLongA(hwnd,0)) +#define TOOLBAR_GetInfoPtr(hwnd) ((TOOLBAR_INFO *)GetWindowLongPtrW(hwnd,0)) #define TOOLBAR_HasText(x, y) (TOOLBAR_GetText(x, y) ? TRUE : FALSE) #define TOOLBAR_HasDropDownArrows(exStyle) ((exStyle & TBSTYLE_EX_DRAWDDARROWS) ? TRUE : FALSE) @@ -290,13 +290,11 @@ TOOLBAR_DumpToolbar(TOOLBAR_INFO *iP, INT line) { if (TRACE_ON(toolbar)) { INT i; - DWORD dwStyle; - dwStyle = GetWindowLongA (iP->hwndSelf, GWL_STYLE); TRACE("toolbar %p at line %d, exStyle=%08lx, buttons=%d, bitmaps=%d, strings=%d, style=%08lx\n", iP->hwndSelf, line, iP->dwExStyle, iP->nNumButtons, iP->nNumBitmaps, - iP->nNumStrings, dwStyle); + iP->nNumStrings, iP->dwStyle); TRACE("toolbar %p at line %d, himlInt=%p, himlDef=%p, himlHot=%p, himlDis=%p, redrawable=%s\n", iP->hwndSelf, line, iP->himlInt, iP->himlDef, iP->himlHot, iP->himlDis, @@ -726,7 +724,7 @@ TOOLBAR_DrawImage(TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, INT left, INT top if (!himl) draw_masked = TRUE; } - else if ((tbcd->nmcd.uItemState & CDIS_HOT) && (GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & TBSTYLE_FLAT)) + else if ((tbcd->nmcd.uItemState & CDIS_HOT) && (infoPtr->dwStyle & TBSTYLE_FLAT)) { /* if hot, attempt to draw with hot image list, if fails, use default image list */ @@ -830,7 +828,7 @@ static void TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) { TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); - DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); + DWORD dwStyle = infoPtr->dwStyle; BOOL hasDropDownArrow = (TOOLBAR_HasDropDownArrows(infoPtr->dwExStyle) && (btnPtr->fsStyle & BTNS_DROPDOWN)) || (btnPtr->fsStyle & BTNS_WHOLEDROPDOWN); @@ -1396,7 +1394,7 @@ static void TOOLBAR_CalcToolbar (HWND hwnd) { TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(hwnd); - DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); + DWORD dwStyle = infoPtr->dwStyle; TBUTTON_INFO *btnPtr; INT i, nRows, nSepRows; INT x, y, cx, cy; @@ -1760,7 +1758,7 @@ TOOLBAR_RelayEvent (HWND hwndTip, HWND hwndMsg, UINT uMsg, static INT_PTR CALLBACK TOOLBAR_CustomizeDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { - PCUSTDLG_INFO custInfo = (PCUSTDLG_INFO)GetWindowLongA (hwnd, DWL_USER); + PCUSTDLG_INFO custInfo = (PCUSTDLG_INFO)GetWindowLongPtrW (hwnd, DWLP_USER); PCUSTOMBUTTON btnInfo; NMTOOLBARA nmtb; TOOLBAR_INFO *infoPtr = custInfo ? custInfo->tbInfo : NULL; @@ -1769,7 +1767,7 @@ TOOLBAR_CustomizeDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { case WM_INITDIALOG: custInfo = (PCUSTDLG_INFO)lParam; - SetWindowLongA (hwnd, DWL_USER, (DWORD)custInfo); + SetWindowLongPtrW (hwnd, DWLP_USER, (LONG_PTR)custInfo); if (custInfo) { @@ -1811,6 +1809,8 @@ TOOLBAR_CustomizeDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_SETITEMDATA, index, (LPARAM)btnInfo); } + SendDlgItemMessageA (hwnd, IDC_TOOLBARBTN_LBOX, LB_SETITEMHEIGHT, 0, infoPtr->nBitmapHeight + 8); + /* insert separator button into 'available buttons' list */ btnInfo = (PCUSTOMBUTTON)Alloc(sizeof(CUSTOMBUTTON)); memset (&btnInfo->btn, 0, sizeof(TBBUTTON)); @@ -1875,6 +1875,8 @@ TOOLBAR_CustomizeDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) } } + SendDlgItemMessageA (hwnd, IDC_AVAILBTN_LBOX, LB_SETITEMHEIGHT, 0, infoPtr->nBitmapHeight + 8); + /* select first item in the 'available' list */ SendDlgItemMessageA (hwnd, IDC_AVAILBTN_LBOX, LB_SETCURSEL, 0, 0); @@ -2167,7 +2169,6 @@ TOOLBAR_CustomizeDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) if (wParam == IDC_AVAILBTN_LBOX || wParam == IDC_TOOLBARBTN_LBOX) { LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)lParam; - DWORD dwStyle = GetWindowLongA (infoPtr->hwndSelf, GWL_STYLE); RECT rcButton; RECT rcText; HPEN hPen, hOldPen; @@ -2210,7 +2211,7 @@ TOOLBAR_CustomizeDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) DrawFocusRect (lpdis->hDC, &lpdis->rcItem); /* draw button */ - if (!(dwStyle & TBSTYLE_FLAT)) + if (!(infoPtr->dwStyle & TBSTYLE_FLAT)) DrawEdge (lpdis->hDC, &rcButton, EDGE_RAISED, BF_RECT|BF_MIDDLE|BF_SOFT); /* draw image and text */ @@ -2238,10 +2239,7 @@ TOOLBAR_CustomizeDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { MEASUREITEMSTRUCT *lpmis = (MEASUREITEMSTRUCT*)lParam; - if (custInfo && custInfo->tbInfo) - lpmis->itemHeight = custInfo->tbInfo->nBitmapHeight + 8; - else - lpmis->itemHeight = 15 + 8; /* default height */ + lpmis->itemHeight = 15 + 8; /* default height */ return TRUE; } @@ -2794,7 +2792,6 @@ static LRESULT TOOLBAR_AutoSize (HWND hwnd) { TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); - DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); RECT parent_rect; RECT window_rect; HWND parent; @@ -2802,7 +2799,7 @@ TOOLBAR_AutoSize (HWND hwnd) INT cx, cy; UINT uPosFlags = SWP_NOZORDER; - TRACE("resize forced, style=%lx!\n", dwStyle); + TRACE("resize forced, style=%lx!\n", infoPtr->dwStyle); parent = GetParent (hwnd); GetClientRect(parent, &parent_rect); @@ -2813,7 +2810,7 @@ TOOLBAR_AutoSize (HWND hwnd) /* FIXME: we should be able to early out if nothing */ /* has changed with nWidth != parent_rect width */ - if (dwStyle & CCS_NORESIZE) { + if (infoPtr->dwStyle & CCS_NORESIZE) { uPosFlags |= (SWP_NOSIZE | SWP_NOMOVE); cx = 0; cy = 0; @@ -2826,24 +2823,24 @@ TOOLBAR_AutoSize (HWND hwnd) cy = infoPtr->nHeight; cx = infoPtr->nWidth; - if ((dwStyle & CCS_BOTTOM) == CCS_NOMOVEY) { + if ((infoPtr->dwStyle & CCS_BOTTOM) == CCS_NOMOVEY) { GetWindowRect(hwnd, &window_rect); ScreenToClient(parent, (LPPOINT)&window_rect.left); y = window_rect.top; } - if ((dwStyle & CCS_BOTTOM) == CCS_BOTTOM) { + if ((infoPtr->dwStyle & CCS_BOTTOM) == CCS_BOTTOM) { GetWindowRect(hwnd, &window_rect); y = parent_rect.bottom - ( window_rect.bottom - window_rect.top); } } - if (dwStyle & CCS_NOPARENTALIGN) + if (infoPtr->dwStyle & CCS_NOPARENTALIGN) uPosFlags |= SWP_NOMOVE; - if (!(dwStyle & CCS_NODIVIDER)) + if (!(infoPtr->dwStyle & CCS_NODIVIDER)) cy += GetSystemMetrics(SM_CYEDGE); - if (dwStyle & WS_BORDER) + if (infoPtr->dwStyle & WS_BORDER) { x = y = 1; cy += GetSystemMetrics(SM_CYEDGE); @@ -2991,7 +2988,7 @@ TOOLBAR_Customize (HWND hwnd) if(!(template = (LPVOID)LoadResource (COMCTL32_hModule, hRes))) return FALSE; - ret = DialogBoxIndirectParamA ((HINSTANCE)GetWindowLongA(hwnd, GWL_HINSTANCE), + ret = DialogBoxIndirectParamA ((HINSTANCE)GetWindowLongPtrW(hwnd, GWLP_HINSTANCE), (LPDLGTEMPLATEA)template, hwnd, TOOLBAR_CustomizeDialogProc, @@ -3349,7 +3346,7 @@ TOOLBAR_GetHotItem (HWND hwnd) { TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); - if (!(GetWindowLongA (hwnd, GWL_STYLE) & TBSTYLE_FLAT)) + if (!(infoPtr->dwStyle & TBSTYLE_FLAT)) return -1; if (infoPtr->nHotItem < 0) @@ -3467,7 +3464,7 @@ TOOLBAR_GetRows (HWND hwnd, WPARAM wParam, LPARAM lParam) { TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); - if (GetWindowLongA (hwnd, GWL_STYLE) & TBSTYLE_WRAPABLE) + if (infoPtr->dwStyle & TBSTYLE_WRAPABLE) return infoPtr->nRows; else return 1; @@ -3491,16 +3488,7 @@ TOOLBAR_GetState (HWND hwnd, WPARAM wParam, LPARAM lParam) static LRESULT TOOLBAR_GetStyle (HWND hwnd, WPARAM wParam, LPARAM lParam) { - TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); - INT nIndex; - - if (wParam == 0) return GetWindowLongW(hwnd, GWL_STYLE); - - nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE); - if (nIndex == -1) - return -1; - - return infoPtr->buttons[nIndex].fsStyle; + return GetWindowLongW(hwnd, GWL_STYLE); } @@ -4627,7 +4615,7 @@ TOOLBAR_SetHotItem (HWND hwnd, WPARAM wParam) if ((INT) wParam < 0 || (INT)wParam > infoPtr->nNumButtons) wParam = -2; - if (GetWindowLongW(hwnd, GWL_STYLE) & TBSTYLE_FLAT) + if (infoPtr->dwStyle & TBSTYLE_FLAT) TOOLBAR_SetHotItemEx(infoPtr, wParam, HICF_OTHER); if (nOldHotItem < 0) @@ -5093,7 +5081,7 @@ static LRESULT TOOLBAR_Create (HWND hwnd, WPARAM wParam, LPARAM lParam) { TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); - DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); + DWORD dwStyle = GetWindowLongW (hwnd, GWL_STYLE); LOGFONTA logFont; TRACE("hwnd = %p\n", hwnd); @@ -5132,6 +5120,7 @@ TOOLBAR_Create (HWND hwnd, WPARAM wParam, LPARAM lParam) infoPtr->szPadding.cx = 2*(GetSystemMetrics(SM_CXEDGE)+OFFSET_X) + 1; infoPtr->szPadding.cy = 2*(GetSystemMetrics(SM_CYEDGE)+OFFSET_Y); infoPtr->iListGap = infoPtr->szPadding.cx / 2; + infoPtr->dwStyle = dwStyle; GetClientRect(hwnd, &infoPtr->client_rect); TOOLBAR_NotifyFormat(infoPtr, (WPARAM)hwnd, (LPARAM)NF_REQUERY); @@ -5206,7 +5195,7 @@ TOOLBAR_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam) /* free toolbar info data */ Free (infoPtr); - SetWindowLongA (hwnd, 0, 0); + SetWindowLongPtrW (hwnd, 0, 0); return 0; } @@ -5216,12 +5205,11 @@ static LRESULT TOOLBAR_EraseBackground (HWND hwnd, WPARAM wParam, LPARAM lParam) { TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); - DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); NMTBCUSTOMDRAW tbcd; INT ret = FALSE; DWORD ntfret; - if (dwStyle & TBSTYLE_CUSTOMERASE) { + if (infoPtr->dwStyle & TBSTYLE_CUSTOMERASE) { ZeroMemory (&tbcd, sizeof(NMTBCUSTOMDRAW)); tbcd.nmcd.dwDrawStage = CDDS_PREERASE; tbcd.nmcd.hdc = (HDC)wParam; @@ -5260,7 +5248,7 @@ TOOLBAR_EraseBackground (HWND hwnd, WPARAM wParam, LPARAM lParam) if (!ret) ret = DefWindowProcA (hwnd, WM_ERASEBKGND, wParam, lParam); - if ((dwStyle & TBSTYLE_CUSTOMERASE) && + if ((infoPtr->dwStyle & TBSTYLE_CUSTOMERASE) && (infoPtr->dwBaseCustDraw & CDRF_NOTIFYPOSTERASE)) { ZeroMemory (&tbcd, sizeof(NMTBCUSTOMDRAW)); tbcd.nmcd.dwDrawStage = CDDS_POSTERASE; @@ -5320,7 +5308,7 @@ TOOLBAR_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam) NMTOOLBARA nmtb; BOOL bDragKeyPressed; - if (GetWindowLongW(hwnd, GWL_STYLE) & TBSTYLE_ALTDRAG) + if (infoPtr->dwStyle & TBSTYLE_ALTDRAG) bDragKeyPressed = (GetKeyState(VK_MENU) < 0); else bDragKeyPressed = (wParam & MK_SHIFT); @@ -5335,7 +5323,7 @@ TOOLBAR_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam) btnPtr = &infoPtr->buttons[nHit]; - if ((nHit >= 0) && bDragKeyPressed && (GetWindowLongW(hwnd, GWL_STYLE) & CCS_ADJUSTABLE)) + if ((nHit >= 0) && bDragKeyPressed && (infoPtr->dwStyle & CCS_ADJUSTABLE)) { infoPtr->nButtonDrag = nHit; SetCapture (hwnd); @@ -5588,6 +5576,34 @@ TOOLBAR_LButtonUp (HWND hwnd, WPARAM wParam, LPARAM lParam) return 0; } +static LRESULT +TOOLBAR_RButtonUp( HWND hwnd, WPARAM wParam, LPARAM lParam) +{ + TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); + + NMMOUSE nmmouse; + POINT pt; + + pt.x = LOWORD(lParam); + pt.y = HIWORD(lParam); + + nmmouse.dwHitInfo = TOOLBAR_InternalHitTest(hwnd, &pt); + + if (nmmouse.dwHitInfo < 0) { + nmmouse.dwItemSpec = -1; + } else { + nmmouse.dwItemSpec = infoPtr->buttons[nmmouse.dwHitInfo].idCommand; + nmmouse.dwItemData = infoPtr->buttons[nmmouse.dwHitInfo].dwData; + } + + ClientToScreen(hwnd, &pt); + memcpy(&nmmouse.pt, &pt, sizeof(POINT)); + + TOOLBAR_SendNotify((LPNMHDR)&nmmouse, infoPtr, NM_RCLICK); + + return 0; +} + static LRESULT TOOLBAR_CaptureChanged(HWND hwnd) { @@ -5713,7 +5729,7 @@ TOOLBAR_NCActivate (HWND hwnd, WPARAM wParam, LPARAM lParam) inline static LRESULT TOOLBAR_NCCalcSize (HWND hwnd, WPARAM wParam, LPARAM lParam) { - if (!(GetWindowLongA (hwnd, GWL_STYLE) & CCS_NODIVIDER)) + if (!(GetWindowLongW(hwnd, GWL_STYLE) & CCS_NODIVIDER)) ((LPRECT)lParam)->top += GetSystemMetrics(SM_CYEDGE); return DefWindowProcA (hwnd, WM_NCCALCSIZE, wParam, lParam); @@ -5729,16 +5745,16 @@ TOOLBAR_NCCreate (HWND hwnd, WPARAM wParam, LPARAM lParam) /* allocate memory for info structure */ infoPtr = (TOOLBAR_INFO *)Alloc (sizeof(TOOLBAR_INFO)); - SetWindowLongA (hwnd, 0, (DWORD)infoPtr); + SetWindowLongPtrW (hwnd, 0, (LONG_PTR)infoPtr); /* paranoid!! */ infoPtr->dwStructSize = sizeof(TBBUTTON); infoPtr->nRows = 1; /* fix instance handle, if the toolbar was created by CreateToolbarEx() */ - if (!GetWindowLongA (hwnd, GWL_HINSTANCE)) { - HINSTANCE hInst = (HINSTANCE)GetWindowLongA (GetParent (hwnd), GWL_HINSTANCE); - SetWindowLongA (hwnd, GWL_HINSTANCE, (DWORD)hInst); + if (!GetWindowLongPtrW (hwnd, GWLP_HINSTANCE)) { + HINSTANCE hInst = (HINSTANCE)GetWindowLongPtrW (GetParent (hwnd), GWLP_HINSTANCE); + SetWindowLongPtrW (hwnd, GWLP_HINSTANCE, (LONG_PTR)hInst); } /* native control does: @@ -5790,7 +5806,7 @@ TOOLBAR_NCCreate (HWND hwnd, WPARAM wParam, LPARAM lParam) styleadd |= TBSTYLE_TRANSPARENT; if (!(cs->style & (CCS_TOP | CCS_NOMOVEY))) { styleadd |= CCS_TOP; /* default to top */ - SetWindowLongA (hwnd, GWL_STYLE, cs->style | styleadd); + SetWindowLongW (hwnd, GWL_STYLE, cs->style | styleadd); } return DefWindowProcA (hwnd, WM_NCCREATE, wParam, lParam); @@ -5800,7 +5816,7 @@ TOOLBAR_NCCreate (HWND hwnd, WPARAM wParam, LPARAM lParam) static LRESULT TOOLBAR_NCPaint (HWND hwnd, WPARAM wParam, LPARAM lParam) { - DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); + DWORD dwStyle = GetWindowLongW(hwnd, GWL_STYLE); RECT rcWindow; HDC hdc; @@ -6099,7 +6115,7 @@ static LRESULT TOOLBAR_Size (HWND hwnd, WPARAM wParam, LPARAM lParam) { TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); - DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); + DWORD dwStyle = infoPtr->dwStyle; RECT parent_rect; RECT window_rect; HWND parent; @@ -6246,6 +6262,8 @@ TOOLBAR_StyleChanged (HWND hwnd, INT nType, LPSTYLESTRUCT lpStyle) TOOLBAR_CheckStyle (hwnd, lpStyle->styleNew); TRACE("new style 0x%08lx\n", lpStyle->styleNew); + + infoPtr->dwStyle = lpStyle->styleNew; } TOOLBAR_CalcToolbar(hwnd); @@ -6598,6 +6616,9 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_LBUTTONUP: return TOOLBAR_LButtonUp (hwnd, wParam, lParam); + case WM_RBUTTONUP: + return TOOLBAR_RButtonUp (hwnd, wParam, lParam); + case WM_MOUSEMOVE: return TOOLBAR_MouseMove (hwnd, wParam, lParam); diff --git a/reactos/lib/comctl32/trackbar.c b/reactos/lib/comctl32/trackbar.c index 79c5c3709e3..01924648d15 100644 --- a/reactos/lib/comctl32/trackbar.c +++ b/reactos/lib/comctl32/trackbar.c @@ -728,7 +728,8 @@ static void TRACKBAR_UpdateToolTip (TRACKBAR_INFO *infoPtr) { DWORD dwStyle = GetWindowLongW (infoPtr->hwndSelf, GWL_STYLE); - WCHAR buf[80], fmt[] = { '%', 'l', 'd', 0 }; + WCHAR buf[80]; + static const WCHAR fmt[] = { '%', 'l', 'd', 0 }; TTTOOLINFOW ti; POINT pt; RECT rcClient; diff --git a/reactos/lib/comctl32/treeview.c b/reactos/lib/comctl32/treeview.c index f62c26dd983..da9001d1b68 100644 --- a/reactos/lib/comctl32/treeview.c +++ b/reactos/lib/comctl32/treeview.c @@ -30,8 +30,8 @@ * missing notifications: NM_SETCURSOR, TVN_GETINFOTIP, TVN_KEYDOWN, * TVN_SETDISPINFO, TVN_SINGLEEXPAND * - * missing styles: TVS_FULLROWSELECT, TVS_INFOTIP, TVS_NOSCROLL, - * TVS_RTLREADING, TVS_TRACKSELECT + * missing styles: TVS_FULLROWSELECT, TVS_INFOTIP, TVS_RTLREADING, + * TVS_TRACKSELECT * * missing item styles: TVIS_CUT, TVIS_EXPANDPARTIAL * @@ -3093,7 +3093,7 @@ TREEVIEW_Expand(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *wineItem, TRACE("\n"); if (wineItem->state & TVIS_EXPANDED) - return TRUE; + return TRUE; TRACE("TVE_EXPAND %p %s\n", wineItem, TREEVIEW_ItemName(wineItem)); @@ -3467,7 +3467,7 @@ TREEVIEW_EditLabel(TREEVIEW_INFO *infoPtr, HTREEITEM hItem) HDC hdc; HFONT hOldFont=0; TEXTMETRICW textMetric; - WCHAR EditW[] = {'E','d','i','t',0}; + static const WCHAR EditW[] = {'E','d','i','t',0}; TRACE("%x %p\n", (unsigned)hwnd, hItem); if (!TREEVIEW_ValidItem(infoPtr, editItem)) @@ -4333,7 +4333,7 @@ TREEVIEW_EnsureVisible(TREEVIEW_INFO *infoPtr, HTREEITEM item, BOOL bHScroll) else if (visible_pos >= viscount /* Sometimes, before we are displayed, GVC is 0, causing us to * spuriously scroll up. */ - && visible_pos > 0) + && visible_pos > 0 && !(infoPtr->dwStyle & TVS_NOSCROLL) ) { /* item is past the end of the list. */ int scroll = visible_pos - viscount; diff --git a/reactos/lib/comctl32/winehq2ros.patch b/reactos/lib/comctl32/winehq2ros.patch index e3d42825ab3..a617c115e24 100644 --- a/reactos/lib/comctl32/winehq2ros.patch +++ b/reactos/lib/comctl32/winehq2ros.patch @@ -4,7 +4,7 @@ RCS file: /home/wine/wine/dlls/comctl32/comctl32.spec,v retrieving revision 1.43 diff -u -r1.43 comctl32.spec --- comctl32.spec 20 Feb 2004 05:16:37 -0000 1.43 -+++ comctl32.spec 15 Apr 2004 08:36:51 -0000 ++++ comctl32.spec 8 May 2004 11:49:39 -0000 @@ -106,13 +106,13 @@ 412 stdcall RemoveWindowSubclass(long ptr long) 413 stdcall DefSubclassProc(long long long long) @@ -26,13 +26,84 @@ diff -u -r1.43 comctl32.spec # Functions imported by name +Index: commctrl.c +=================================================================== +RCS file: /home/wine/wine/dlls/comctl32/commctrl.c,v +retrieving revision 1.76 +diff -u -r1.76 commctrl.c +--- commctrl.c 11 Mar 2004 22:38:22 -0000 1.76 ++++ commctrl.c 8 May 2004 11:49:41 -0000 +@@ -114,7 +114,6 @@ + extern void UPDOWN_Register(void); + extern void UPDOWN_Unregister(void); + +-static LRESULT WINAPI SubclassWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + + LPSTR COMCTL32_aSubclass = NULL; + HMODULE COMCTL32_hModule = 0; +@@ -1109,10 +1108,10 @@ + /* set window procedure to our own and save the current one */ + if (IsWindowUnicode (hWnd)) + stack->origproc = (WNDPROC)SetWindowLongW (hWnd, GWL_WNDPROC, +- (LONG)SubclassWndProc); ++ (LONG)DefSubclassProc); + else + stack->origproc = (WNDPROC)SetWindowLongA (hWnd, GWL_WNDPROC, +- (LONG)SubclassWndProc); ++ (LONG)DefSubclassProc); + } else { + WNDPROC current; + if (IsWindowUnicode (hWnd)) +@@ -1120,7 +1119,7 @@ + else + current = (WNDPROC)GetWindowLongA (hWnd, GWL_WNDPROC); + +- if (current != SubclassWndProc) { ++ if (current != DefSubclassProc) { + ERR ("Application has subclassed with our procedure, then manually, then with us again. The current implementation can't handle this.\n"); + return FALSE; + } +@@ -1260,33 +1259,6 @@ + } + + return FALSE; +-} +- +- +-/*********************************************************************** +- * SubclassWndProc (internal) +- * +- * Window procedure for all subclassed windows. +- * Saves the current subclassing stack position to support nested messages +- */ +- +-static LRESULT WINAPI SubclassWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +-{ +- LPSUBCLASS_INFO stack; +- int stackpos; +- LRESULT ret; +- +- /* retrieve our little stack from the Properties */ +- stack = (LPSUBCLASS_INFO)GetPropA (hWnd, COMCTL32_aSubclass); +- if (!stack) { +- ERR ("Our sub classing stack got erased for %p!! Nothing we can do\n", hWnd); +- return 0; +- } +- stackpos = stack->stackpos; +- stack->stackpos = stack->stacknum; +- ret = DefSubclassProc(hWnd,uMsg,wParam,lParam); +- stack->stackpos = stackpos; +- return ret; + } + + Index: imagelist.c =================================================================== RCS file: /home/wine/wine/dlls/comctl32/imagelist.c,v retrieving revision 1.85 diff -u -r1.85 imagelist.c --- imagelist.c 27 Feb 2004 04:40:08 -0000 1.85 -+++ imagelist.c 15 Apr 2004 08:36:52 -0000 ++++ imagelist.c 8 May 2004 11:49:43 -0000 @@ -1146,11 +1146,13 @@ PatBlt(hBlendMaskDC, 0, 0, cx, cy, PATCOPY); SelectObject(hBlendMaskDC, hOldBrush); @@ -50,10 +121,10 @@ diff -u -r1.85 imagelist.c Index: listview.c =================================================================== RCS file: /home/wine/wine/dlls/comctl32/listview.c,v -retrieving revision 1.385 -diff -u -r1.385 listview.c ---- listview.c 11 Mar 2004 00:39:53 -0000 1.385 -+++ listview.c 15 Apr 2004 08:36:56 -0000 +retrieving revision 1.387 +diff -u -r1.387 listview.c +--- listview.c 21 Apr 2004 22:25:04 -0000 1.387 ++++ listview.c 8 May 2004 11:49:47 -0000 @@ -147,6 +147,7 @@ #include #include @@ -68,7 +139,7 @@ RCS file: /home/wine/wine/dlls/comctl32/string.c,v retrieving revision 1.3 diff -u -r1.3 string.c --- string.c 20 Feb 2004 19:58:39 -0000 1.3 -+++ string.c 15 Apr 2004 08:36:56 -0000 ++++ string.c 8 May 2004 11:49:52 -0000 @@ -254,7 +254,7 @@ { TRACE("(%s,%s)\n", debugstr_w(lpszStr), debugstr_w(lpszSearch)); @@ -87,19 +158,3 @@ diff -u -r1.3 string.c } /************************************************************************* -Index: treeview.c -=================================================================== -RCS file: /home/wine/wine/dlls/comctl32/treeview.c,v -retrieving revision 1.145 -diff -u -r1.145 treeview.c ---- treeview.c 1 Mar 2004 23:10:52 -0000 1.145 -+++ treeview.c 15 Apr 2004 08:36:58 -0000 -@@ -3093,7 +3093,7 @@ - TRACE("\n"); - - if (wineItem->state & TVIS_EXPANDED) -- return FALSE; -+ return TRUE; - - TRACE("TVE_EXPAND %p %s\n", wineItem, TREEVIEW_ItemName(wineItem)); - From c862df0add8d4e5ab4770574b45e13016cba6422 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 8 May 2004 12:42:46 +0000 Subject: [PATCH 1055/1463] fixed handling of CW_USEDEFAULT with CreateWindow(Ex)() svn path=/trunk/; revision=9322 --- reactos/lib/user32/windows/window.c | 108 +------------ reactos/subsys/win32k/include/desktop.h | 4 +- reactos/subsys/win32k/include/window.h | 2 + reactos/subsys/win32k/ntuser/desktop.c | 15 +- reactos/subsys/win32k/ntuser/misc.c | 4 +- reactos/subsys/win32k/ntuser/window.c | 195 +++++++++++++++++++++--- reactos/subsys/win32k/ntuser/winpos.c | 8 +- 7 files changed, 194 insertions(+), 142 deletions(-) diff --git a/reactos/lib/user32/windows/window.c b/reactos/lib/user32/windows/window.c index 2e655fc407b..c70a186e369 100644 --- a/reactos/lib/user32/windows/window.c +++ b/reactos/lib/user32/windows/window.c @@ -1,4 +1,4 @@ -/* $Id: window.c,v 1.115 2004/05/02 17:25:21 weiden Exp $ +/* $Id: window.c,v 1.116 2004/05/08 12:42:45 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -168,7 +168,6 @@ CreateWindowExA(DWORD dwExStyle, UNICODE_STRING ClassName; WNDCLASSEXA wce; HWND Handle; - INT sw; #if 0 DbgPrint("[window] CreateWindowExA style %d, exstyle %d, parent %d\n", dwStyle, dwExStyle, hWndParent); @@ -211,56 +210,6 @@ CreateWindowExA(DWORD dwExStyle, SetLastError(ERROR_OUTOFMEMORY); return (HWND)0; } - - /* Fixup default coordinates. */ - sw = SW_SHOW; - if (x == (LONG) CW_USEDEFAULT || nWidth == (LONG) CW_USEDEFAULT) - { - if (dwStyle & (WS_CHILD | WS_POPUP)) - { - if (x == (LONG) CW_USEDEFAULT) - { - x = y = 0; - } - if (nWidth == (LONG) CW_USEDEFAULT) - { - nWidth = nHeight = 0; - } - } - else - { - STARTUPINFOA info; - - GetStartupInfoA(&info); - - if (x == (LONG) CW_USEDEFAULT) - { - if (y != (LONG) CW_USEDEFAULT) - { - sw = y; - } - x = (info.dwFlags & STARTF_USEPOSITION) ? info.dwX : 0; - y = (info.dwFlags & STARTF_USEPOSITION) ? info.dwY : 0; - } - - if (nWidth == (LONG) CW_USEDEFAULT) - { - if (info.dwFlags & STARTF_USESIZE) - { - nWidth = info.dwXSize; - nHeight = info.dwYSize; - } - else - { - RECT r; - - SystemParametersInfoA(SPI_GETWORKAREA, 0, &r, 0); - nWidth = (((r.right - r.left) * 3) / 4) - x; - nHeight = (((r.bottom - r.top) * 3) / 4) - y; - } - } - } - } if(!hMenu && (dwStyle & (WS_OVERLAPPEDWINDOW | WS_POPUP))) { @@ -283,7 +232,7 @@ CreateWindowExA(DWORD dwExStyle, hMenu, hInstance, lpParam, - sw, + SW_SHOW, FALSE); #if 0 @@ -322,7 +271,6 @@ CreateWindowExW(DWORD dwExStyle, UNICODE_STRING ClassName; WNDCLASSEXW wce; HANDLE Handle; - UINT sw; /* Register built-in controls if not already done */ if (! ControlsInitialized) @@ -346,56 +294,6 @@ CreateWindowExW(DWORD dwExStyle, RtlInitUnicodeString(&WindowName, lpWindowName); - /* Fixup default coordinates. */ - sw = SW_SHOW; - if (x == (LONG) CW_USEDEFAULT || nWidth == (LONG) CW_USEDEFAULT) - { - if (dwStyle & (WS_CHILD | WS_POPUP)) - { - if (x == (LONG) CW_USEDEFAULT) - { - x = y = 0; - } - if (nWidth == (LONG) CW_USEDEFAULT) - { - nWidth = nHeight = 0; - } - } - else - { - STARTUPINFOW info; - - GetStartupInfoW(&info); - - if (x == (LONG) CW_USEDEFAULT) - { - if (y != (LONG) CW_USEDEFAULT) - { - sw = y; - } - x = (info.dwFlags & STARTF_USEPOSITION) ? info.dwX : 0; - y = (info.dwFlags & STARTF_USEPOSITION) ? info.dwY : 0; - } - - if (nWidth == (LONG) CW_USEDEFAULT) - { - if (info.dwFlags & STARTF_USESIZE) - { - nWidth = info.dwXSize; - nHeight = info.dwYSize; - } - else - { - RECT r; - - SystemParametersInfoW(SPI_GETWORKAREA, 0, &r, 0); - nWidth = (((r.right - r.left) * 3) / 4) - x; - nHeight = (((r.bottom - r.top) * 3) / 4) - y; - } - } - } - } - if(!hMenu && (dwStyle & (WS_OVERLAPPEDWINDOW | WS_POPUP))) { wce.cbSize = sizeof(WNDCLASSEXW); @@ -417,7 +315,7 @@ CreateWindowExW(DWORD dwExStyle, hMenu, hInstance, lpParam, - sw, + SW_SHOW, TRUE); return (HWND)Handle; diff --git a/reactos/subsys/win32k/include/desktop.h b/reactos/subsys/win32k/include/desktop.h index 40cf4d86ca0..2c49a77caba 100644 --- a/reactos/subsys/win32k/include/desktop.h +++ b/reactos/subsys/win32k/include/desktop.h @@ -19,8 +19,8 @@ InitDesktopImpl(VOID); NTSTATUS FASTCALL CleanupDesktopImpl(VOID); -PRECT FASTCALL -IntGetDesktopWorkArea(PDESKTOP_OBJECT Desktop); +VOID FASTCALL +IntGetDesktopWorkArea(PDESKTOP_OBJECT Desktop, PRECT Rect); LRESULT CALLBACK IntDesktopWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); diff --git a/reactos/subsys/win32k/include/window.h b/reactos/subsys/win32k/include/window.h index bf218effd2c..77a280a0b63 100644 --- a/reactos/subsys/win32k/include/window.h +++ b/reactos/subsys/win32k/include/window.h @@ -95,6 +95,8 @@ typedef struct _WINDOW_OBJECT HWND hWndLastPopup; /* handle to last active popup window (wine doesn't use pointer, for unk. reason)*/ PINTERNALPOS InternalPos; ULONG Status; + /* counter for tiled child windows */ + ULONG TiledCounter; } WINDOW_OBJECT; /* PWINDOW_OBJECT already declared at top of file */ /* Window flags. */ diff --git a/reactos/subsys/win32k/ntuser/desktop.c b/reactos/subsys/win32k/ntuser/desktop.c index 75f124315a0..a59d3836ffb 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.12 2004/05/05 22:47:06 weiden Exp $ + * $Id: desktop.c,v 1.13 2004/05/08 12:42:46 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -118,11 +118,13 @@ IntValidateDesktopHandle( return Status; } -PRECT FASTCALL -IntGetDesktopWorkArea(PDESKTOP_OBJECT Desktop) +VOID FASTCALL +IntGetDesktopWorkArea(PDESKTOP_OBJECT Desktop, PRECT Rect) { PRECT Ret; + ASSERT(Desktop); + Ret = &Desktop->WorkArea; if((Ret->right == -1) && ScreenDeviceContext) { @@ -138,7 +140,10 @@ IntGetDesktopWorkArea(PDESKTOP_OBJECT Desktop) DC_UnlockDc(ScreenDeviceContext); } - return Ret; + if(Rect) + { + *Rect = *Ret; + } } PDESKTOP_OBJECT FASTCALL @@ -432,7 +437,7 @@ NtUserCreateDesktop( DesktopObject->WorkArea.top = 0; DesktopObject->WorkArea.right = -1; DesktopObject->WorkArea.bottom = -1; - IntGetDesktopWorkArea(DesktopObject); + IntGetDesktopWorkArea(DesktopObject, NULL); /* Initialize some local (to win32k) desktop state. */ DesktopObject->ActiveMessageQueue = NULL; diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index c2195ccd5b4..cf64bbda9d7 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.69 2004/05/02 17:25:21 weiden Exp $ +/* $Id: misc.c,v 1.70 2004/05/08 12:42:46 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -711,7 +711,7 @@ IntSystemParametersInfo( } ASSERT(pvParam); - *((PRECT)pvParam) = *(IntGetDesktopWorkArea(Desktop)); + IntGetDesktopWorkArea(Desktop, (PRECT)pvParam); return TRUE; } diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 5d4b289cec9..963e2ee9da7 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.224 2004/05/05 22:26:04 weiden Exp $ +/* $Id: window.c,v 1.225 2004/05/08 12:42:46 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -64,6 +64,9 @@ static WndProcHandle *WndProcHandlesArray = 0; static WORD WndProcHandlesArraySize = 0; #define WPH_SIZE 0x40 /* the size to add to the WndProcHandle array each time */ +/* dialog resources appear to pass this in 16 bits, handle them properly */ +#define CW_USEDEFAULT16 (0x8000) + #define POINT_IN_RECT(p, r) (((r.bottom >= p.y) && (r.top <= p.y))&&((r.left <= p.x )&&( r.right >= p.x ))) /* PRIVATE FUNCTIONS **********************************************************/ @@ -1354,6 +1357,57 @@ NtUserChildWindowFromPointEx(HWND hwndParent, } +/* + * calculates the default position of a window + */ +BOOL FASTCALL +IntCalcDefPosSize(PWINDOW_OBJECT Parent, PWINDOW_OBJECT WindowObject, RECT *rc, BOOL IncPos) +{ + PDESKTOP_OBJECT Desktop; + SIZE Sz; + POINT Pos; + DbgPrint("IntCalcDefPosSize: Parent: 0x%x, Window: 0x%x, IncPos: 0x%x\n", Parent, WindowObject, IncPos); + Desktop = WindowObject->OwnerThread->Win32Thread->Desktop; + IntGetDesktopWorkArea(Desktop, rc); + + if(Parent != NULL) + { + NtGdiIntersectRect(rc, rc, &Parent->ClientRect); + + if(IncPos) + { + Pos.x = Parent->TiledCounter * (NtUserGetSystemMetrics(SM_CXSIZE) + NtUserGetSystemMetrics(SM_CXFRAME)); + Pos.y = Parent->TiledCounter * (NtUserGetSystemMetrics(SM_CYSIZE) + NtUserGetSystemMetrics(SM_CYFRAME)); + if(Pos.x > ((rc->right - rc->left) / 4) || + Pos.y > ((rc->bottom - rc->top) / 4)) + { + /* reset counter and position */ + Pos.x = 0; + Pos.y = 0; + Parent->TiledCounter = 0; + } + Parent->TiledCounter++; + } + Pos.x += rc->left; + Pos.y += rc->top; + } + else + { + Pos.x = rc->left; + Pos.y = rc->top; + } + + Sz.cx = EngMulDiv(rc->right - rc->left, 3, 4); + Sz.cy = EngMulDiv(rc->bottom - rc->top, 3, 4); + + rc->left = Pos.x; + rc->top = Pos.y; + rc->right = rc->left + Sz.cx; + rc->bottom = rc->top + Sz.cy; + return TRUE; +} + + /* * @implemented */ @@ -1383,6 +1437,8 @@ NtUserCreateWindowEx(DWORD dwExStyle, UNICODE_STRING WindowName; NTSTATUS Status; HANDLE Handle; + POINT Pos; + SIZE Size; #if 0 POINT MaxSize, MaxPos, MinTrack, MaxTrack; #else @@ -1607,6 +1663,13 @@ NtUserCreateWindowEx(DWORD dwExStyle, } } + if(!(WindowObject->Style & (WS_POPUP | WS_CHILD))) + { + /* Automatically assign the caption and border style. Also always + clip siblings for overlapped windows. */ + WindowObject->Style |= (WS_CAPTION | WS_BORDER | WS_CLIPSIBLINGS); + } + /* create system menu */ if((WindowObject->Style & WS_SYSMENU) && (WindowObject->Style & WS_CAPTION)) { @@ -1631,26 +1694,20 @@ NtUserCreateWindowEx(DWORD dwExStyle, } /* FIXME: Handle "CS_CLASSDC" */ - /* Initialize the window dimensions. */ - WindowObject->WindowRect.left = x; - WindowObject->WindowRect.top = y; - WindowObject->WindowRect.right = x + nWidth; - WindowObject->WindowRect.bottom = y + nHeight; - if (0 != (WindowObject->Style & WS_CHILD) && ParentWindow) - { - NtGdiOffsetRect(&(WindowObject->WindowRect), ParentWindow->ClientRect.left, - ParentWindow->ClientRect.top); - } - WindowObject->ClientRect = WindowObject->WindowRect; + Pos.x = x; + Pos.y = y; + Size.cx = nWidth; + Size.cy = nHeight; + /* call hook */ Cs.lpCreateParams = lpParam; Cs.hInstance = hInstance; Cs.hMenu = hMenu; Cs.hwndParent = ParentWindowHandle; - Cs.cx = nWidth; - Cs.cy = nHeight; - Cs.x = x; - Cs.y = y; + Cs.cx = Size.cx; + Cs.cy = Size.cy; + Cs.x = Pos.x; + Cs.y = Pos.y; Cs.style = dwStyle; Cs.lpszName = OrigWindowName; /* pass the original pointer to usermode! */ Cs.lpszClass = lpClassName->Buffer; @@ -1667,6 +1724,96 @@ NtUserCreateWindowEx(DWORD dwExStyle, return (HWND) NULL; } + x = Cs.x; + y = Cs.y; + nWidth = Cs.cx; + nHeight = Cs.cy; + + /* default positioning for overlapped windows */ + if(!(WindowObject->Style & (WS_POPUP | WS_CHILD))) + { + RECT rc; + PRTL_USER_PROCESS_PARAMETERS ProcessParams; + BOOL CalculatedDefPosSize = FALSE; + + ProcessParams = PsGetCurrentProcess()->Peb->ProcessParameters; + + DbgPrint("Creating WS_OVERLAPPED window (0x%x, 0x%x, 0x%x, 0x%x)\n", x, y, nWidth, nHeight); + if(x == CW_USEDEFAULT || x == CW_USEDEFAULT16) + { + CalculatedDefPosSize = IntCalcDefPosSize(ParentWindow, WindowObject, &rc, TRUE); + + if(ProcessParams->dwFlags & STARTF_USEPOSITION) + { + ProcessParams->dwFlags &= ~STARTF_USEPOSITION; + Pos.x = ProcessParams->dwX; + Pos.y = ProcessParams->dwY; + } + else + { + Pos.x = rc.left; + Pos.y = rc.top; + } + + /* According to wine, the ShowMode is set to y if x == CW_USEDEFAULT(16) and + y is something else */ + if(y != CW_USEDEFAULT && y != CW_USEDEFAULT16) + { + dwShowMode = y; + } + } + if(nWidth == CW_USEDEFAULT || nWidth == CW_USEDEFAULT16) + { + if(!CalculatedDefPosSize) + { + IntCalcDefPosSize(ParentWindow, WindowObject, &rc, FALSE); + } + if(ProcessParams->dwFlags & STARTF_USESIZE) + { + ProcessParams->dwFlags &= ~STARTF_USESIZE; + Size.cx = ProcessParams->dwXSize; + Size.cy = ProcessParams->dwYSize; + } + else + { + Size.cx = rc.right - rc.left; + Size.cy = rc.bottom - rc.top; + } + + /* move the window if necessary */ + if(Pos.x > rc.left) + Pos.x = max(rc.left, 0); + if(Pos.y > rc.top) + Pos.y = max(rc.top, 0); + } + } + else + { + /* if CW_USEDEFAULT(16) is set for non-overlapped windows, both values are set to zero) */ + if(x == CW_USEDEFAULT || x == CW_USEDEFAULT16) + { + Pos.x = 0; + Pos.y = 0; + } + if(nWidth == CW_USEDEFAULT || nWidth == CW_USEDEFAULT16) + { + Size.cx = 0; + Size.cy = 0; + } + } + + /* Initialize the window dimensions. */ + WindowObject->WindowRect.left = Pos.x; + WindowObject->WindowRect.top = Pos.y; + WindowObject->WindowRect.right = Pos.x + Size.cx; + WindowObject->WindowRect.bottom = Pos.y + Size.cy; + if (0 != (WindowObject->Style & WS_CHILD) && ParentWindow) + { + NtGdiOffsetRect(&(WindowObject->WindowRect), ParentWindow->ClientRect.left, + ParentWindow->ClientRect.top); + } + WindowObject->ClientRect = WindowObject->WindowRect; + /* * Get the size and position of the window. */ @@ -1685,10 +1832,10 @@ NtUserCreateWindowEx(DWORD dwExStyle, if (nHeight < 0) nHeight = 0; } - WindowObject->WindowRect.left = x; - WindowObject->WindowRect.top = y; - WindowObject->WindowRect.right = x + nWidth; - WindowObject->WindowRect.bottom = y + nHeight; + WindowObject->WindowRect.left = Pos.x; + WindowObject->WindowRect.top = Pos.y; + WindowObject->WindowRect.right = Pos.x + Size.cx; + WindowObject->WindowRect.bottom = Pos.y + Size.cy; if (0 != (WindowObject->Style & WS_CHILD) && ParentWindow) { NtGdiOffsetRect(&(WindowObject->WindowRect), ParentWindow->ClientRect.left, @@ -1699,10 +1846,10 @@ NtUserCreateWindowEx(DWORD dwExStyle, /* FIXME: Initialize the window menu. */ /* Send a NCCREATE message. */ - Cs.cx = nWidth; - Cs.cy = nHeight; - Cs.x = x; - Cs.y = y; + Cs.cx = Size.cx; + Cs.cy = Size.cy; + Cs.x = Pos.x; + Cs.y = Pos.y; DPRINT("[win32k.window] NtUserCreateWindowEx style %d, exstyle %d, parent %d\n", Cs.style, Cs.dwExStyle, Cs.hwndParent); DPRINT("NtUserCreateWindowEx(): (%d,%d-%d,%d)\n", x, y, nWidth, nHeight); diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index 02289d787bb..71aa78ab9d1 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.112 2004/04/24 14:21:36 weiden Exp $ +/* $Id: winpos.c,v 1.113 2004/05/08 12:42:46 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -198,13 +198,13 @@ WinPosInitInternalPos(PWINDOW_OBJECT WindowObject, POINT *pt, PRECT RestoreRect) if(Parent) { if(IntIsDesktopWindow(Parent)) - WorkArea = *IntGetDesktopWorkArea(Desktop); + IntGetDesktopWorkArea(Desktop, &WorkArea); else WorkArea = Parent->ClientRect; IntReleaseWindowObject(Parent); } else - WorkArea = *IntGetDesktopWorkArea(Desktop); + IntGetDesktopWorkArea(Desktop, &WorkArea); WindowObject->InternalPos = ExAllocatePoolWithTag(NonPagedPool, sizeof(INTERNALPOS), TAG_WININTLIST); if(!WindowObject->InternalPos) @@ -347,7 +347,7 @@ WinPosFillMinMaxInfoStruct(PWINDOW_OBJECT Window, MINMAXINFO *Info) RECT WorkArea; PDESKTOP_OBJECT Desktop = PsGetWin32Thread()->Desktop; /* Or rather get it from the window? */ - WorkArea = *IntGetDesktopWorkArea(Desktop); + IntGetDesktopWorkArea(Desktop, &WorkArea); /* Get default values. */ Info->ptMaxSize.x = WorkArea.right - WorkArea.left; From 9c710c79db295b748fbf61f5ae277ea4d4550802 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 8 May 2004 12:49:34 +0000 Subject: [PATCH 1056/1463] silence debug messages svn path=/trunk/; revision=9323 --- reactos/subsys/win32k/ntuser/window.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 963e2ee9da7..2d20acc02cc 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.225 2004/05/08 12:42:46 weiden Exp $ +/* $Id: window.c,v 1.226 2004/05/08 12:49:34 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1366,7 +1366,7 @@ IntCalcDefPosSize(PWINDOW_OBJECT Parent, PWINDOW_OBJECT WindowObject, RECT *rc, PDESKTOP_OBJECT Desktop; SIZE Sz; POINT Pos; - DbgPrint("IntCalcDefPosSize: Parent: 0x%x, Window: 0x%x, IncPos: 0x%x\n", Parent, WindowObject, IncPos); + Desktop = WindowObject->OwnerThread->Win32Thread->Desktop; IntGetDesktopWorkArea(Desktop, rc); @@ -1738,7 +1738,6 @@ NtUserCreateWindowEx(DWORD dwExStyle, ProcessParams = PsGetCurrentProcess()->Peb->ProcessParameters; - DbgPrint("Creating WS_OVERLAPPED window (0x%x, 0x%x, 0x%x, 0x%x)\n", x, y, nWidth, nHeight); if(x == CW_USEDEFAULT || x == CW_USEDEFAULT16) { CalculatedDefPosSize = IntCalcDefPosSize(ParentWindow, WindowObject, &rc, TRUE); From 4e0fa347fa3d585ce9cb0e0dfdef22f65dfcaf63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sat, 8 May 2004 12:53:14 +0000 Subject: [PATCH 1057/1463] Sync to Wine-20040505: Pavel Roskin - Make the file type combobox non-editable. Ilya Korniyko - Added Ukrainian translations. Wolfgang Schwotzer - Update OFN_READONLY flag when closing file dialog. - Make file dialog support FNERR_BUFFERTOSMALL if buffer too small. Francois Gouget - Make Unicode strings static const. - If lpstrTitle is NULL, set it to either 'Open File' or 'Save as'. - Constify the string constants. - Make Unicode const strings static so they are not copied to the stack each time we enter the function. svn path=/trunk/; revision=9324 --- reactos/lib/comdlg32/cdlg_Cn.rc | 2 +- reactos/lib/comdlg32/cdlg_De.rc | 2 +- reactos/lib/comdlg32/cdlg_En.rc | 2 +- reactos/lib/comdlg32/cdlg_Es.rc | 2 +- reactos/lib/comdlg32/cdlg_Fr.rc | 2 +- reactos/lib/comdlg32/cdlg_It.rc | 2 +- reactos/lib/comdlg32/cdlg_Ja.rc | 2 +- reactos/lib/comdlg32/cdlg_Ko.rc | 2 +- reactos/lib/comdlg32/cdlg_Pt.rc | 2 +- reactos/lib/comdlg32/cdlg_Ru.rc | 2 +- reactos/lib/comdlg32/cdlg_Si.rc | 2 +- reactos/lib/comdlg32/cdlg_Sk.rc | 2 +- reactos/lib/comdlg32/cdlg_Sv.rc | 2 +- reactos/lib/comdlg32/cdlg_Th.rc | 2 +- reactos/lib/comdlg32/cdlg_Uk.rc | 430 ++++++++++++++++++++++++++ reactos/lib/comdlg32/cdlg_Zh.rc | 2 +- reactos/lib/comdlg32/filedlg.c | 79 ++++- reactos/lib/comdlg32/filedlg16.c | 250 ++++++++++++++- reactos/lib/comdlg32/printdlg.c | 6 +- reactos/lib/comdlg32/rsrc.rc | 1 + reactos/lib/comdlg32/winehq2ros.patch | 101 +++++- 21 files changed, 859 insertions(+), 38 deletions(-) create mode 100644 reactos/lib/comdlg32/cdlg_Uk.rc diff --git a/reactos/lib/comdlg32/cdlg_Cn.rc b/reactos/lib/comdlg32/cdlg_Cn.rc index fc0b7833650..401b071a83c 100644 --- a/reactos/lib/comdlg32/cdlg_Cn.rc +++ b/reactos/lib/comdlg32/cdlg_Cn.rc @@ -340,7 +340,7 @@ FONT 8, "Helv" EDITTEXT IDC_FILENAME,54,110,155,12,ES_AUTOHSCROLL LTEXT "文件类型(&t)",IDC_FILETYPESTATIC,5,128,42,8, SS_NOTIFY - COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "只读(&r)",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,145,100,10 diff --git a/reactos/lib/comdlg32/cdlg_De.rc b/reactos/lib/comdlg32/cdlg_De.rc index de455662c11..91c5c6840a2 100644 --- a/reactos/lib/comdlg32/cdlg_De.rc +++ b/reactos/lib/comdlg32/cdlg_De.rc @@ -262,7 +262,7 @@ FONT 8, "Helv" EDITTEXT IDC_FILENAME,54,110,155,12,ES_AUTOHSCROLL LTEXT "Datei&typen",IDC_FILETYPESTATIC,5,128,42,8, SS_NOTIFY - COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "&Schreibgesch黷zt",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,145,100,10 diff --git a/reactos/lib/comdlg32/cdlg_En.rc b/reactos/lib/comdlg32/cdlg_En.rc index 6e4b04a989f..6b59ec631cc 100644 --- a/reactos/lib/comdlg32/cdlg_En.rc +++ b/reactos/lib/comdlg32/cdlg_En.rc @@ -340,7 +340,7 @@ FONT 8, "Helv" EDITTEXT IDC_FILENAME,54,110,155,12,ES_AUTOHSCROLL LTEXT "Files of &type:",IDC_FILETYPESTATIC,5,128,42,8, SS_NOTIFY - COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "Open as &read-only",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,145,100,10 diff --git a/reactos/lib/comdlg32/cdlg_Es.rc b/reactos/lib/comdlg32/cdlg_Es.rc index 26a33226f27..cd6611357a2 100644 --- a/reactos/lib/comdlg32/cdlg_Es.rc +++ b/reactos/lib/comdlg32/cdlg_Es.rc @@ -339,7 +339,7 @@ FONT 8, "Helv" EDITTEXT IDC_FILENAME,54,110,155,12,ES_AUTOHSCROLL LTEXT "Archivos de &tipo:",IDC_FILETYPESTATIC,5,128,42,8, SS_NOTIFY - COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "Abrir como &s髄o-lectura",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,145,100,10 diff --git a/reactos/lib/comdlg32/cdlg_Fr.rc b/reactos/lib/comdlg32/cdlg_Fr.rc index f87413820a9..38fce69e6dd 100644 --- a/reactos/lib/comdlg32/cdlg_Fr.rc +++ b/reactos/lib/comdlg32/cdlg_Fr.rc @@ -343,7 +343,7 @@ FONT 8, "Helv" EDITTEXT IDC_FILENAME,54,110,155,12,ES_AUTOHSCROLL LTEXT "&Type du fichier",IDC_FILETYPESTATIC,5,128,42,8, SS_NOTIFY - COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "&Protection 閏riture",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,145,100,10 diff --git a/reactos/lib/comdlg32/cdlg_It.rc b/reactos/lib/comdlg32/cdlg_It.rc index b678f3ee5fb..c98322f5bbd 100644 --- a/reactos/lib/comdlg32/cdlg_It.rc +++ b/reactos/lib/comdlg32/cdlg_It.rc @@ -340,7 +340,7 @@ FONT 8, "Helv" EDITTEXT IDC_FILENAME,54,110,155,12,ES_AUTOHSCROLL LTEXT "File del &tipo:",IDC_FILETYPESTATIC,5,128,42,8, SS_NOTIFY - COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "Apri in &sola lettura",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,145,100,10 diff --git a/reactos/lib/comdlg32/cdlg_Ja.rc b/reactos/lib/comdlg32/cdlg_Ja.rc index f41e2bf9b5b..4e1451d919f 100644 --- a/reactos/lib/comdlg32/cdlg_Ja.rc +++ b/reactos/lib/comdlg32/cdlg_Ja.rc @@ -310,7 +310,7 @@ FONT 9, "MS UI Gothic" EDITTEXT IDC_FILENAME,56,110,153,12,ES_AUTOHSCROLL LTEXT "抬操偺庬椶(&T):",IDC_FILETYPESTATIC,5,128,52,8, SS_NOTIFY - COMBOBOX IDC_FILETYPE,56,126,153,53,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FILETYPE,56,126,153,53,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "撉傒庢傝愱梡抬操偲偟偰奐偔(&R)",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,145,100,10 diff --git a/reactos/lib/comdlg32/cdlg_Ko.rc b/reactos/lib/comdlg32/cdlg_Ko.rc index f795b1754cc..e75d89fee8d 100644 --- a/reactos/lib/comdlg32/cdlg_Ko.rc +++ b/reactos/lib/comdlg32/cdlg_Ko.rc @@ -287,7 +287,7 @@ FONT 9, "Helv" EDITTEXT IDC_FILENAME,54,110,155,12,ES_AUTOHSCROLL LTEXT "颇老 屈侥(&T):",IDC_FILETYPESTATIC,5,128,42,8, SS_NOTIFY - COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "佬扁 傈侩(&R)",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,145,100,10 diff --git a/reactos/lib/comdlg32/cdlg_Pt.rc b/reactos/lib/comdlg32/cdlg_Pt.rc index 661c6132cb8..9ff9dfd8c1d 100644 --- a/reactos/lib/comdlg32/cdlg_Pt.rc +++ b/reactos/lib/comdlg32/cdlg_Pt.rc @@ -341,7 +341,7 @@ FONT 8, "Helv" EDITTEXT IDC_FILENAME,54,111,155,12,ES_AUTOHSCROLL LTEXT "Arquivos do &tipo:",IDC_FILETYPESTATIC,5,131,48,16, SS_NOTIFY - COMBOBOX IDC_FILETYPE,54,129,155,100,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FILETYPE,54,129,155,100,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "Abrir como &somente-leitura",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,148,74,10 diff --git a/reactos/lib/comdlg32/cdlg_Ru.rc b/reactos/lib/comdlg32/cdlg_Ru.rc index a2ce032724e..3a76440baee 100644 --- a/reactos/lib/comdlg32/cdlg_Ru.rc +++ b/reactos/lib/comdlg32/cdlg_Ru.rc @@ -309,7 +309,7 @@ FONT 8, "MS Sans Serif" EDITTEXT IDC_FILENAME,54,110,155,12,ES_AUTOHSCROLL LTEXT "脏殡 &蜩镟",IDC_FILETYPESTATIC,5,128,42,8, SS_NOTIFY - COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "翌朦觐 潆 &黩屙",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,145,100,10 diff --git a/reactos/lib/comdlg32/cdlg_Si.rc b/reactos/lib/comdlg32/cdlg_Si.rc index 2a8eca03a5a..84bb5a8ad7b 100644 --- a/reactos/lib/comdlg32/cdlg_Si.rc +++ b/reactos/lib/comdlg32/cdlg_Si.rc @@ -340,7 +340,7 @@ FONT 8, "MS Sans Serif" EDITTEXT IDC_FILENAME,54,110,155,12,ES_AUTOHSCROLL LTEXT "Vrsta da&totek:",IDC_FILETYPESTATIC,5,128,49,8, SS_NOTIFY - COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "&Samo za branje",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,145,100,10 diff --git a/reactos/lib/comdlg32/cdlg_Sk.rc b/reactos/lib/comdlg32/cdlg_Sk.rc index 3d03e225309..5bacfbed498 100644 --- a/reactos/lib/comdlg32/cdlg_Sk.rc +++ b/reactos/lib/comdlg32/cdlg_Sk.rc @@ -311,7 +311,7 @@ FONT 8, "Helv" EDITTEXT IDC_FILENAME,54,110,155,12,ES_AUTOHSCROLL LTEXT "&Typ s鷅orov",IDC_FILETYPESTATIC,5,128,42,8, SS_NOTIFY - COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "Otvo&ri iba na 桧tanie",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,145,100,10 diff --git a/reactos/lib/comdlg32/cdlg_Sv.rc b/reactos/lib/comdlg32/cdlg_Sv.rc index 9db8e9950c6..a8fb70ecd62 100644 --- a/reactos/lib/comdlg32/cdlg_Sv.rc +++ b/reactos/lib/comdlg32/cdlg_Sv.rc @@ -333,7 +333,7 @@ FONT 8, "Helv" EDITTEXT IDC_FILENAME,54,110,155,12,ES_AUTOHSCROLL LTEXT "&Filformat",IDC_FILETYPESTATIC,5,128,42,8, SS_NOTIFY - COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "謕pna som &skrivskyddad",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,145,100,10 diff --git a/reactos/lib/comdlg32/cdlg_Th.rc b/reactos/lib/comdlg32/cdlg_Th.rc index 72dc74ed97a..664f6153f8f 100644 --- a/reactos/lib/comdlg32/cdlg_Th.rc +++ b/reactos/lib/comdlg32/cdlg_Th.rc @@ -337,7 +337,7 @@ FONT 8, "Helv" EDITTEXT IDC_FILENAME,54,110,155,12,ES_AUTOHSCROLL LTEXT "笛恰猛:",IDC_FILETYPESTATIC,5,128,42,8, SS_NOTIFY - COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "丸夜吐枰о凑虑",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,145,100,10 diff --git a/reactos/lib/comdlg32/cdlg_Uk.rc b/reactos/lib/comdlg32/cdlg_Uk.rc new file mode 100644 index 00000000000..146a7272ff6 --- /dev/null +++ b/reactos/lib/comdlg32/cdlg_Uk.rc @@ -0,0 +1,430 @@ +/* + * 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 + */ + +/* + * WARNING: DO NOT CHANGE THE SIZE OF THE STANDARD DIALOG TEMPLATES. + */ + +LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT + +OPEN_FILE DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 275, 134 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "і乃疑陨" +FONT 8, "Ms Sans Serif" +{ + LTEXT "&І' 屏侍:", 1090, 6, 6, 76, 9 + EDITTEXT 1152, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP + LISTBOX 1120, 6, 32, 90, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP + LTEXT "&襞松:", -1, 110, 6, 92, 9 + LTEXT "", 1088, 110, 18, 92, 9, SS_NOPREFIX | WS_GROUP + LISTBOX 1121, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP + LTEXT "鹣肆谡琢陨 屏侍 &陨姓:", 1089, 6, 104, 90, 9 + COMBOBOX 1136, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP + LTEXT "&渖铀:", 1091, 110, 104, 92, 9 + COMBOBOX 1137, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "і乃疑陨", IDOK, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "і耐і瘟", IDCANCEL, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&湎і乃", 1038, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP + CHECKBOX "&焐叟 奶 奚粤挝", 1040, 208, 68, 54, 24, BS_AUTOCHECKBOX | BS_MULTILINE | WS_GROUP | WS_TABSTOP +} + + +SAVE_FILE DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 275, 134 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "乓徘陨 阉 ..." +FONT 8, "Ms Sans Serif" +{ + LTEXT "&&І' 屏侍:", 1090, 6, 6, 76, 9 + EDITTEXT 1152, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP + LISTBOX 1120, 6, 32, 90, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP + LTEXT "&襞松:", -1, 110, 6, 92, 9 + LTEXT "", 1088, 110, 18, 92, 9, SS_NOPREFIX | WS_GROUP + LISTBOX 1121, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP + LTEXT "鹣肆谡琢陨 屏侍 &陨姓:", 1089, 6, 104, 90, 9 + COMBOBOX 1136, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP + LTEXT "&渖铀:", 1091, 110, 104, 92, 9 + COMBOBOX 1137, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "乓徘陨 阉", IDOK, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "і耐і瘟", IDCANCEL, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&湎і乃", 1038, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP + CHECKBOX "&焐叟 奶 奚粤挝", 1040, 208, 68, 54, 24, BS_AUTOCHECKBOX | BS_MULTILINE | WS_GROUP | WS_TABSTOP +} + + +PRINT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "湟账" +FONT 8, "Ms Sans Serif" +{ + LTEXT "鹨晌耘:", 1088, 6, 6, 40, 9 + LTEXT "", 1089, 60, 6, 150, 9 + GROUPBOX "湟账兆猎", 1072, 6, 30, 160, 65, BS_GROUPBOX + RADIOBUTTON "&饔", 1056, 16, 45, 60, 12 + RADIOBUTTON "&赡і膛挝墒 埔燎团卧", 1057, 16, 60, 60, 12 + RADIOBUTTON "&笤弦і嗡", 1058, 16, 75, 60, 12 + DEFPUSHBUTTON "湟账", IDOK, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "і耐і瘟", IDCANCEL, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "魈劣陨紫釉і", 1024, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP + LTEXT "&:", 1090, 60, 80, 30, 9 + LTEXT "&南:", 1091, 120, 80, 30, 9 + LTEXT "&袼і釉 囊账:", 1092, 6, 100, 76, 9 + COMBOBOX 1136, 80, 100, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + CHECKBOX "湟账 南 屏侍", 1040, 20, 100, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "笤捎滔", 1041, 160, 100, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP +} + + +PRINT_SETUP DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "盍釉蚁仕 幸晌耘伊" +FONT 8, "Ms Sans Serif" +{ + GROUPBOX "鹨晌耘", 1072, 6, 10, 180, 65, BS_GROUPBOX + RADIOBUTTON "鹨晌耘 诹 &下胀献膛挝淹", 1056, 16, 20, 80, 12 + LTEXT "[钆土]", 1088, 35, 35, 120, 9 + RADIOBUTTON "&І污墒 幸晌耘", 1057, 16, 50, 80, 12 + COMBOBOX 1136, 35, 65, 149, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "OK", IDOK, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "і耐і瘟", IDCANCEL, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&盍釉蚁仕", 1024, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP + GROUPBOX "镆іє卧撩і", 1073, 6, 85, 100, 50, BS_GROUPBOX + RADIOBUTTON "&胛芍瘟", 1058, 50, 100, 40, 12 + RADIOBUTTON "&崽芈贤瘟", 1059, 50, 115, 40, 12 + ICON "LANDSCAP", 1097, 10, 95, 32, 32 + ICON "PORTRAIT", 1098, 10, 95, 32, 32 + GROUPBOX "鹆і", 1074, 120, 85, 180, 50, BS_GROUPBOX + LTEXT "蛳&谕і", 1089, 130, 95, 30, 9 + LTEXT "&渲乓盘", 1090, 130, 110, 30, 9 + COMBOBOX 1137, 155, 95, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + COMBOBOX 1138, 155, 110, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP +} + + +CHOOSE_FONT DIALOG DISCARDABLE 13, 54, 264, 147 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "善" +FONT 8, "Ms Sans Serif" +{ + LTEXT "&善:",1088 ,6,3,40,9 + COMBOBOX 1136 ,6,13,94,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | + CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE + LTEXT "&笤商:",1089 ,108,3,44,9 + COMBOBOX 1137,108,13,64,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | + WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE + LTEXT "&蛳谕і:",1090,179,3,30,9 + COMBOBOX 1138,179,13,32,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | + WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE | CBS_SORT + DEFPUSHBUTTON "OK",IDOK,218,6,40,14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON + PUSHBUTTON "і耐і瘟",IDCANCEL,218,23,40,14,WS_GROUP | WS_TABSTOP + PUSHBUTTON "&釉嫌兆猎", 1026,218,40,40,14,WS_GROUP | WS_TABSTOP + PUSHBUTTON "&湎і乃" , 1038,218,57,40,14,WS_GROUP | WS_TABSTOP + GROUPBOX "嵩疑抡陨",1072,6,72,84,34,WS_GROUP + CHECKBOX "&艘庞膛紊", 1040, 10,82,75,10, BS_AUTOCHECKBOX | WS_TABSTOP + CHECKBOX "&і乃遗犹盼墒", 1041, 10,94,75,10, BS_AUTOCHECKBOX + LTEXT "&胂і:", 1091 ,6,110,30,9 + COMBOBOX 1139,6,120,84,100,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | + CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP + GROUPBOX "&邻纤",grp2,98,72,120,36,WS_GROUP + CTEXT "崃饴AaBb",stc5,103,80,109,24,SS_NOPREFIX | NOT WS_VISIBLE + LTEXT "笏疑性:",stc7 ,98,114,80,9 + COMBOBOX cmb5,98,124,120,10,CBS_DROPDOWNLIST |CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | + CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP +} + + +CHOOSE_COLOR DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 310, 185 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "і瘟 辛і砸" +FONT 8, "Ms Sans Serif" +{ + LTEXT "&饬谙琢 辛і砸:", 1088, 4, 4, 140, 10 + LTEXT "&夏猎讼і 讼特弦:", 1089, 4, 106, 140, 10 + LTEXT "胂і襹&躺姿", 1090, 150, 151, 48, 10 + LTEXT "&易衔墒:", 726 /*1094*/,254,126,32,10 + EDITTEXT 706, 288,124,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "&膛紊:",727/*1095*/,254,140,32,10 + EDITTEXT 707, 288,138,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "&晌і:",728 /*1096*/,264,154,24,10 + EDITTEXT 708, 288,152,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "і&і蜗:" ,723 /*1091*/,202,126,30,10 + EDITTEXT 703, 234,124,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "&胂卧伊釉:" ,724 /*1092*/,199,140,34,10 + EDITTEXT 704, 234,138,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "&裼艘磷і釉:" ,725 /*1093*/,202,154,30,10 + EDITTEXT 705, 234,152,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP + CONTROL "" ,720,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP,4,14,140,86 + CONTROL "" ,721,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP,4,116,140,28 + CONTROL "" ,710,"STATIC",WS_BORDER|SS_SIMPLE|WS_TABSTOP|WS_GROUP, 152,4,118,116 + CONTROL "" ,702,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP, 278,4,8,116 + CONTROL "" ,709,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP, 152,124,40,26 + DEFPUSHBUTTON "OK", IDOK, 4, 166, 44, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "і耐і瘟", IDCANCEL, 52, 166, 44, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "湎і乃", 1038,100,166, 44, 14 + PUSHBUTTON "&湎牧陨 南 瘟孪艺", 712/*1024*/, 152, 166, 142, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&魃谖赁稍 讼і >>", 719/*1025*/, 4, 150, 142, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&i",713,300,200,4,14 /* just a dummy: 'i' is like &i in "sol&id" */ +} + + +FINDDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 245, 62 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "鹣壅" +FONT 8, "Ms Sans Serif" +{ + LTEXT "&邻纤:", -1, 4, 8, 42, 8 + EDITTEXT 1152, 47, 7, 138, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + CHECKBOX "&焐叟 犹献 і趟贤", 1040, 4, 26, 100, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "і &遗ґі釉艺", 1041, 4, 42, 100, 12, BS_AUTOCHECKBOX | WS_TABSTOP + GROUPBOX "盍幸淹", 1072, 107, 26, 78, 28 + CONTROL "&髑弦", 1056, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 111, 38, 40, 12 + CONTROL "&紊", 1057, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 152, 38, 30, 12 + + DEFPUSHBUTTON "&瘟试 牧і", IDOK, 190, 5, 50, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON + PUSHBUTTON "і耐і瘟", IDCANCEL , 190, 23, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&湎і乃", pshHelp , 190, 45, 50, 14, WS_GROUP | WS_TABSTOP +} + + +REPLACEDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 230, 94 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "і瘟" +FONT 8, "Ms Sans Serif" +{ + LTEXT "&邻纤:", -1, 4, 9, 48, 8 + EDITTEXT 1152, 54, 7, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "&镣і紊陨 瘟:", -1, 4, 26, 48, 8 + EDITTEXT 1153, 54, 24, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + CHECKBOX "&焐叟 犹献 і趟贤", 1040, 5, 46, 104, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "і &遗ґі釉艺", 1041, 5, 62, 104, 12, BS_AUTOCHECKBOX | WS_TABSTOP + + DEFPUSHBUTTON "&瘟试 牧і", IDOK, 174, 4, 50, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON + PUSHBUTTON "&і紊陨", psh1 , 174, 21, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "і紊陨 &子", psh2 , 174, 38, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "і耐і瘟", IDCANCEL , 174, 55, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&湎і乃", pshHelp , 174, 75, 50, 14, WS_GROUP | WS_TABSTOP +} + +PRINT32 DIALOG LOADONCALL MOVEABLE DISCARDABLE 32, 32, 288, 186 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | + DS_CONTEXTHELP | DS_3DLOOK +CAPTION "湟账" +FONT 8, "Ms Sans Serif" +{ + DEFPUSHBUTTON "OK", IDOK, 180,164, 48,14, WS_GROUP | BS_DEFPUSHBUTTON + PUSHBUTTON "і耐і瘟", IDCANCEL, 232,164, 48,14, WS_GROUP + PUSHBUTTON "&湎і乃", pshHelp, 50, 161, 48,14, WS_GROUP + + GROUPBOX "鹨晌耘", grp4, 8, 4, 272,84, WS_GROUP + CONTROL "湟账 屏&", chx1, "Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,212,70,64,12 + PUSHBUTTON "&魈劣陨紫釉і", psh2, 212, 17, 60,14, WS_GROUP + LTEXT "&І':", stc6, 16, 20, 36,8 + COMBOBOX cmb4, 52, 18, 152,152,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP + LTEXT "笤猎沼:", stc8, 16, 36, 36,10, SS_NOPREFIX + LTEXT "逋仗叵琢蜗", stc12, 60, 36, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "羯:", stc7, 16, 48, 36,10, SS_NOPREFIX + LTEXT "逋仗叵琢蜗", stc11, 60, 48, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "і用:", stc10, 16, 60, 36,10, SS_NOPREFIX + LTEXT "逋仗叵琢蜗", stc14, 60, 60, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "鹨赏і运:", stc13, 16, 72, 36,10, SS_NOPREFIX + LTEXT "逋仗叵琢蜗", stc13, 60, 72, 152,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + + GROUPBOX "胂ії", grp2, 160, 92, 120,64, WS_GROUP + LTEXT "犹 &讼і:",stc5,168,108,68,8 + ICON "", ico3, 162,124, 76,24, WS_GROUP | SS_CENTERIMAGE + CONTROL "&蛳诼稍", chx2,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,230,130,40,12 + EDITTEXT edt3, 240,106, 32,12, WS_GROUP | ES_NUMBER + + GROUPBOX "湟账兆猎", grp1, 8,92, 144,64, WS_GROUP + CONTROL "&饔", rad1,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,16,106,64,12 + CONTROL "&笤弦і嗡", rad3,"Button",BS_AUTORADIOBUTTON,16,122,50,12 + CONTROL "&魃і膛挝", rad2,"Button",BS_AUTORADIOBUTTON,16,138,64,12 + EDITTEXT edt1, 85,122, 20,12, WS_GROUP | ES_NUMBER + EDITTEXT edt2, 120,122, 20,12, WS_GROUP | ES_NUMBER + RTEXT "&і:", stc2, 70,124, 10,8 + RTEXT "&南:", stc3, 106,124, 10,8 +} + +PRINT32_SETUP DIALOG LOADONCALL MOVEABLE DISCARDABLE 32, 32, 288, 178 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | + DS_CONTEXTHELP | DS_3DLOOK +CAPTION "跤粤蜗姿 幸晌耘伊" +FONT 8, "Ms Sans Serif" +BEGIN + DEFPUSHBUTTON "OK",IDOK,180,156,48,14,WS_GROUP + PUSHBUTTON "і耐і瘟",IDCANCEL,232,156,48,14 +/* PUSHBUTTON "і运...", psh5, 284,156,48,14 */ + + GROUPBOX "鹨晌耘", grp4, 8, 4, 272,84, WS_GROUP + PUSHBUTTON "&魈劣陨紫釉і", psh2, 212, 17, 60,14, WS_GROUP + LTEXT "&І':", stc6, 16, 20, 36,8 + COMBOBOX cmb1, 52, 18, 152,152,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP + LTEXT "笤猎沼:", stc8, 16, 36, 36,10, SS_NOPREFIX + LTEXT "逋仗叵琢蜗", stc12, 52, 36, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "羯:", stc7, 16, 48, 36,10, SS_NOPREFIX + LTEXT "逋仗叵琢蜗", stc11, 52, 48, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "і用:", stc10, 16, 60, 36,10, SS_NOPREFIX + LTEXT "逋仗叵琢蜗", stc14, 52, 60, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "鹨赏і运:", stc9, 16, 72, 36,10, SS_NOPREFIX + LTEXT "逋仗叵琢і", stc13, 52, 72, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + + GROUPBOX "鹆і", grp2, 8, 92, 164,56, WS_GROUP + LTEXT "蛳&і:", stc2, 16,108, 36, 8 + COMBOBOX cmb2, 52,106, 112,112,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP + LTEXT "&渲乓盘:", stc3, 16,128, 36, 8 + COMBOBOX cmb3, 52,126, 112,112,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP + + GROUPBOX "镆іє卧撩і", grp1, 180, 92, 100,56, WS_GROUP + ICON "", ico1, 195,112, 18,20, WS_GROUP + CONTROL "&鹣以遗", rad1,"Button",BS_AUTORADIOBUTTON | WS_GROUP |WS_TABSTOP,224,106,52,12 + CONTROL "&廖嫩疗", rad2,"Button",BS_AUTORADIOBUTTON,224,126,52,12 +END + +NEWFILEOPENORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 280, 164 +STYLE DS_MODALFRAME | DS_CONTEXTHELP | WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_CLIPCHILDREN +CAPTION "і乃疑陨" +FONT 8, "MS Sans Serif" +{ + LTEXT "肆陨 &",IDC_LOOKINSTATIC,4,6,43,8, SS_NOTIFY + COMBOBOX IDC_LOOKIN,49,3,132,100,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + + LTEXT "" , IDC_TOOLBARSTATIC, 181, 2, 102, 17, NOT WS_GROUP | NOT WS_VISIBLE + LISTBOX IDC_SHELLSTATIC,4,20,272,85, LBS_SORT | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | WS_HSCROLL | NOT WS_VISIBLE + + LTEXT "І' &屏侍:",IDC_FILENAMESTATIC,5,112,46,8, SS_NOTIFY + EDITTEXT IDC_FILENAME,54,110,155,12,ES_AUTOHSCROLL + + LTEXT "媪侍 &陨姓",IDC_FILETYPESTATIC,5,128,42,8, SS_NOTIFY + COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + + CONTROL "焐叟 奶 &奚粤挝",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,145,100,10 + + DEFPUSHBUTTON "&і乃疑陨", IDOK,222,110,50,14 + PUSHBUTTON "і耐і瘟", IDCANCEL,222,128,50,14 + PUSHBUTTON "&湎і乃", pshHelp,222,145,50,14 +} + +STRINGTABLE DISCARDABLE +{ + IDS_ABOUTBOX "&鹨 耘釉 魃і音潘" + IDS_DOCUMENTFOLDERS "襞松 南苏团卧і" + IDS_PERSONAL "硐ї 南苏团卧" + IDS_FAVORITES "颂聊松" + IDS_PATH "笊釉磐紊 厶讶" + IDS_DESKTOP "笤і特紊醚" + IDS_FONTS "善陨" + IDS_MYCOMPUTER "і 讼托'涝乓" +} + +STRINGTABLE DISCARDABLE +{ + IDS_SYSTEMFOLDERS "笊釉磐і 耘松" + IDS_LOCALHARDRIVES "煜肆特і 窒矣运і 纳铀" + IDS_FILENOTFOUND "媪侍 闻 谖潦呐蜗" + IDS_VERIFYFILE "鹋遗і以, 奚 幸磷商匚 姿邻廖 і' 屏侍" + IDS_CREATEFILE "媪侍 闻 і游є\n 认夼耘 魃 氏窍 釉紫疑陨?" + IDS_OVERWRITEFILE "媪侍 罩 і游є.\nі紊陨 氏窍?" + IDS_INVALID_FILENAME_TITLE "钆і椅墒 由妥咸 诹猩诱 厶讶" + IDS_INVALID_FILENAME "І' 屏侍 闻 拖峙 і釉稍 瘟釉招і 由妥咸: \n / : < > |" + IDS_PATHNOTEXISTING "讶 闻 і游є" + IDS_FILENOTEXISTING "媪侍 闻 і游є" +} + +STRINGTABLE DISCARDABLE +{ + IDS_UPFOLDER "髑弦 瘟 夏晌 і着呜" + IDS_NEWFOLDER "笤紫疑陨 蜗渍 耘苏" + IDS_LISTVIEW "笮捎纤" + IDS_REPORTVIEW "鹣囊下擅і" + IDS_TODESKTOP "鹋遗і 瘟 釉і特紊美" +} + +STRINGTABLE DISCARDABLE +{ + PD32_PRINT_TITLE "湟账" + + PD32_VALUE_UREADABLE "钆奚粤є蜕 盘磐盼" + PD32_INVALID_PAGE_RANGE "闩 谖赁盼窝 闻 膛稚载 і列邻衔і 釉弦і蜗薥n\ +髯拍і载 谖赁盼闻 і %d 粤 %d" + PD32_FROM_NOT_ABOVE_TO "赁盼窝 І 闻 邢咨挝 信遗咨菡琢陨 滹:" + PD32_MARGINS_OVERLAP "砼і 信遗艘勺晾载 奚 信遗咨菡涝 \ +蚁谕і疑 辛信艺.\n髯拍і载 ї 瘟蜗紫" + PD32_NR_OF_COPIES_EMPTY "赁盼窝 犹 胂і 闻 拖峙 抡陨 \ +姓釉赏" + PD32_TOO_LARGE_COPIES "袅肆 着躺肆 і特і釉 讼і 闻 \ +拖峙 抡陨 瘟囊账献廖 髁凵 幸晌耘蚁.\n髯拍і载 谖赁盼窝 і 1 粤 %d" + PD32_PRINT_ERROR "魃紊颂 邢蜕趟 幸晌耘伊" + PD32_NO_DEFAULT_PRINTER "钆土є 幸晌耘伊, 邢釉磷膛蜗窍 诹 下胀献膛挝淹" + PD32_CANT_FIND_PRINTER "钆 啄撂嫌 谖潦陨 幸晌耘" + PD32_OUT_OF_MEMORY "砹滔 辛'言і" + PD32_GENERIC_ERROR "魃紊颂() 邢蜕趟()" + PD32_DRIVER_UNKNOWN "钆і南蜕 囊潦着 幸晌耘伊" + + PD32_DEFAULT_PRINTER "鹨晌耘 诹 下胀献膛挝淹; " + PD32_NR_OF_DOCUMENTS_IN_QUEUE "%d 南苏团卧і 夼亿і" + PD32_PRINT_ALL_X_PAGES "&饔і %d 釉弦і蜗" + PD32_MARGINS_IN_INCHES "砼і [睦释蒥" + PD32_MARGINS_IN_MILIMETERS "砼і [屯]" + PD32_MILIMETERS "屯" + + PD32_PRINTER_STATUS_READY "缦韵紫" + PD32_PRINTER_STATUS_PAUSED "鹨哨招晌盼; " + PD32_PRINTER_STATUS_ERROR "鹣蜕趟; " + PD32_PRINTER_STATUS_PENDING_DELETION "肆挝 咨牧膛挝; " + PD32_PRINTER_STATUS_PAPER_JAM "鹆і 诹釉已; " + PD32_PRINTER_STATUS_PAPER_OUT "钆 咨釉赁є 辛信艺; " + PD32_PRINTER_STATUS_MANUAL_FEED "鹣釉磷耘 辛і 滓辙握; " + PD32_PRINTER_STATUS_PAPER_PROBLEM "鹨下膛土 辛信蚁; " + PD32_PRINTER_STATUS_OFFLINE "鹨晌耘 遗稚і offline; " + PD32_PRINTER_STATUS_IO_ACTIVE "髯і/魃і 了陨孜墒; " + PD32_PRINTER_STATUS_BUSY "饰言墒; " + PD32_PRINTER_STATUS_PRINTING "昴 囊账; " + PD32_PRINTER_STATUS_OUTPUT_BIN_FULL "煜韵 信遗邢孜盼墒 辛信蚁; " + PD32_PRINTER_STATUS_NOT_AVAILABLE "钆 南釉招紊; " + PD32_PRINTER_STATUS_WAITING "肆挝; " + PD32_PRINTER_STATUS_PROCESSING "锫蚁滤; " + PD32_PRINTER_STATUS_INITIALIZING "缦哉琢挝; " + PD32_PRINTER_STATUS_WARMING_UP "鹨锨і; " + PD32_PRINTER_STATUS_TONER_LOW "粝闻 幸 і蚊і; " + PD32_PRINTER_STATUS_NO_TONER "钆土 韵闻伊; " + PD32_PRINTER_STATUS_PAGE_PUNT "Page punt; " + PD32_PRINTER_STATUS_USER_INTERVENTION "鹋遗易廖 讼疑釉兆赁磐; " + PD32_PRINTER_STATUS_OUT_OF_MEMORY "砹滔 辛'言і; " + PD32_PRINTER_STATUS_DOOR_OPEN "胍邵肆 幸晌耘伊 і乃疑粤; " + PD32_PRINTER_STATUS_SERVER_UNKNOWN "钆і南蜕 优易乓 幸晌耘伊; " + PD32_PRINTER_STATUS_POWER_SAVE "錾滋盼窝 屡谛呸蜗驼 遗稚і; " +} + +STRINGTABLE DISCARDABLE /* Color names */ +{ + IDS_COLOR_BLACK "椅墒" + IDS_COLOR_MAROON "庖瘴猎紊" + IDS_COLOR_GREEN "膛紊" + IDS_COLOR_OLIVE "锾勺讼咨" + IDS_COLOR_NAVY "笊і" + IDS_COLOR_PURPLE "鹫倚找紊" + IDS_COLOR_TEAL "膛蜗-由і" + IDS_COLOR_GRAY "і疑" + IDS_COLOR_SILVER "笠і挛墒" + IDS_COLOR_RED "易衔墒" + IDS_COLOR_LIME "罅塘韵咨" + IDS_COLOR_YELLOW "鱿自墒" + IDS_COLOR_BLUE "缦陶律" + IDS_COLOR_FUCHSIA "і咸旁献墒" + IDS_COLOR_AQUA "崴琢土疑" + IDS_COLOR_WHITE "і躺" +} diff --git a/reactos/lib/comdlg32/cdlg_Zh.rc b/reactos/lib/comdlg32/cdlg_Zh.rc index aba38527000..cf92b12436d 100644 --- a/reactos/lib/comdlg32/cdlg_Zh.rc +++ b/reactos/lib/comdlg32/cdlg_Zh.rc @@ -185,7 +185,7 @@ FONT 8, "Helv" EDITTEXT IDC_FILENAME,59,110,155,12,ES_AUTOHSCROLL LTEXT "檔案類型(&T):",IDC_FILETYPESTATIC,5,128,42,8, SS_NOTIFY - COMBOBOX IDC_FILETYPE,59,126,155,53,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FILETYPE,59,126,155,53,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "開啟成唯讀(&R)",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,145,100,10 diff --git a/reactos/lib/comdlg32/filedlg.c b/reactos/lib/comdlg32/filedlg.c index b4d33ad4afe..c03dc80f4c8 100644 --- a/reactos/lib/comdlg32/filedlg.c +++ b/reactos/lib/comdlg32/filedlg.c @@ -34,9 +34,6 @@ * * FIXME: lpstrCustomFilter not handled * - * FIXME: if the size of lpstrFile (nMaxFile) is too small the first - * two bytes of lpstrFile should contain the needed size - * * FIXME: algorithm for selecting the initial directory is too simple * * FIXME: add to recent docs @@ -228,6 +225,10 @@ 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 * @@ -1012,8 +1013,8 @@ static LRESULT FILEDLG95_InitControls(HWND hwnd) int win98plus = 0; int handledPath = FALSE; OSVERSIONINFOA osVi; - const WCHAR szwSlash[] = { '\\', 0 }; - const WCHAR szwStar[] = { '*',0 }; + static const WCHAR szwSlash[] = { '\\', 0 }; + static const WCHAR szwStar[] = { '*',0 }; TBBUTTON tbb[] = { @@ -1535,7 +1536,7 @@ BOOL FILEDLG95_OnOpenMultipleFiles(HWND hwnd, LPWSTR lpstrFileList, UINT nFileCo WCHAR lpstrNotFound[100]; WCHAR lpstrMsg[100]; WCHAR tmp[400]; - WCHAR nl[] = {'\n',0}; + static const WCHAR nl[] = {'\n',0}; LoadStringW(COMDLG32_hInstance, IDS_FILENOTFOUND, lpstrNotFound, 100); LoadStringW(COMDLG32_hInstance, IDS_VERIFYFILE, lpstrMsg, 100); @@ -1713,7 +1714,7 @@ BOOL FILEDLG95_OnOpen(HWND hwnd) { LPWSTR lpszTemp, lpszTemp1; LPITEMIDLIST pidl = NULL; - WCHAR szwInvalid[] = { '/',':','<','>','|', 0}; + static const WCHAR szwInvalid[] = { '/',':','<','>','|', 0}; /* check for invalid chars */ if((strpbrkW(lpstrPathAndFile+3, szwInvalid) != NULL) && !(fodInfos->ofnInfos->Flags & OFN_NOVALIDATE)) @@ -1743,7 +1744,7 @@ BOOL FILEDLG95_OnOpen(HWND hwnd) if(*lpszTemp==0) { - WCHAR wszWild[] = { '*', '?', 0 }; + static const WCHAR wszWild[] = { '*', '?', 0 }; /* if the last element is a wildcard do a search */ if(strpbrkW(lpszTemp1, wszWild) != NULL) { @@ -1872,6 +1873,12 @@ BOOL FILEDLG95_OnOpen(HWND hwnd) case ONOPEN_OPEN: /* fill in the return struct and close the dialog */ TRACE("ONOPEN_OPEN %s\n", debugstr_w(lpstrPathAndFile)); { + /* update READONLY check box flag */ + if ((SendMessageA(GetDlgItem(hwnd,IDC_OPENREADONLY),BM_GETCHECK,0,0) & 0x03) == BST_CHECKED) + fodInfos->ofnInfos->Flags |= OFN_READONLY; + else + fodInfos->ofnInfos->Flags &= ~OFN_READONLY; + /* add default extension */ if (fodInfos->defext) { @@ -1882,7 +1889,7 @@ BOOL FILEDLG95_OnOpen(HWND hwnd) /* only add "." in case a default extension does exist */ if (*fodInfos->defext != '\0') { - const WCHAR szwDot[] = {'.',0}; + static const WCHAR szwDot[] = {'.',0}; int PathLength = strlenW(lpstrPathAndFile); strcatW(lpstrPathAndFile, szwDot); @@ -1985,9 +1992,16 @@ BOOL FILEDLG95_OnOpen(HWND hwnd) } else { - /* FIXME set error FNERR_BUFFERTOSMALL */ + WORD size; + + size = strlenW(lpstrPathAndFile) + 1; + if (fodInfos->ofnInfos->Flags & OFN_ALLOWMULTISELECT) + size += 1; + /* return needed size in first two bytes of lpstrFile */ + *(WORD *)fodInfos->ofnInfos->lpstrFile = size; FILEDLG95_Clean(hwnd); ret = EndDialog(hwnd, FALSE); + COMDLG32_SetCommDlgExtendedError(FNERR_BUFFERTOOSMALL); } goto ret; } @@ -3184,7 +3198,7 @@ static BOOL BrowseSelectedFolder(HWND hwnd) if ( FAILED( IShellBrowser_BrowseObject( fodInfos->Shell.FOIShellBrowser, pidlSelection, SBSP_RELATIVE ) ) ) { - WCHAR notexist[] = {'P','a','t','h',' ','d','o','e','s', + static const WCHAR notexist[] = {'P','a','t','h',' ','d','o','e','s', ' ','n','o','t',' ','e','x','i','s','t',0}; MessageBoxW( hwnd, notexist, fodInfos->title, MB_OK | MB_ICONEXCLAMATION ); } @@ -3227,6 +3241,16 @@ 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)) + win16look = (ofn->Flags & OFN_EXPLORER) ? FALSE : TRUE; + + if (win16look) + return GetFileName31A(ofn, OPEN_DIALOG); + else +#endif return GetFileDialog95A(ofn, OPEN_DIALOG); } @@ -3243,9 +3267,20 @@ 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)) + win16look = (ofn->Flags & OFN_EXPLORER) ? FALSE : TRUE; + + if (win16look) + return GetFileName31W(ofn, OPEN_DIALOG); + else +#endif return GetFileDialog95W(ofn, OPEN_DIALOG); } + /*********************************************************************** * GetSaveFileNameA (COMDLG32.@) * @@ -3259,6 +3294,16 @@ 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)) + win16look = (ofn->Flags & OFN_EXPLORER) ? FALSE : TRUE; + + if (win16look) + return GetFileName31A(ofn, SAVE_DIALOG); + else +#endif return GetFileDialog95A(ofn, SAVE_DIALOG); } @@ -3275,5 +3320,15 @@ BOOL WINAPI GetSaveFileNameA( BOOL WINAPI GetSaveFileNameW( LPOPENFILENAMEW ofn) /* [in/out] address of init structure */ { - return GetFileDialog95W(ofn, SAVE_DIALOG); +#if 0 /* FIXME GetFileName31W uses 16 bit stuff */ + BOOL win16look = FALSE; + + if (ofn->Flags & (OFN_ALLOWMULTISELECT|OFN_ENABLEHOOK|OFN_ENABLETEMPLATE)) + win16look = (ofn->Flags & OFN_EXPLORER) ? FALSE : TRUE; + + 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 dac494f2f1e..4c3bbdd979a 100644 --- a/reactos/lib/comdlg32/filedlg16.c +++ b/reactos/lib/comdlg32/filedlg16.c @@ -84,8 +84,6 @@ static HICON hFloppy = 0; static HICON hHDisk = 0; static HICON hCDRom = 0; static HICON hNet = 0; -static char defaultopen[]="Open File"; -static char defaultsave[]="Save as"; /*********************************************************************** * FileDlg_Init [internal] @@ -971,8 +969,8 @@ void FILEDLG_MapOfnStructA(LPOPENFILENAMEA ofnA, LPOPENFILENAMEW ofnW, BOOL open str = ofnA->lpstrTitle; else /* Allocates default title (FIXME : get it from resource) */ - str = open ? defaultopen:defaultsave; - RtlCreateUnicodeStringFromAsciiz (&usBuffer,ofnA->lpstrTitle); + str = open ? "Open File" : "Save as"; + RtlCreateUnicodeStringFromAsciiz (&usBuffer,str); ofnW->lpstrTitle = usBuffer.Buffer; ofnW->Flags = ofnA->Flags; ofnW->nFileOffset = ofnA->nFileOffset; @@ -1148,6 +1146,122 @@ static BOOL FILEDLG_CallWindowProc16(LFSPRIVATE lfs, UINT wMsg, WPARAM wParam, 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 @@ -1264,6 +1378,19 @@ static LONG FILEDLG_WMInitDialog16(HWND hWnd, WPARAM wParam, LPARAM 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] */ @@ -1278,6 +1405,54 @@ static LONG FILEDLG_WMMeasureItem16(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam) /* ------------------ Dialog procedures ---------------------- */ +/*********************************************************************** + * FileOpenDlgProc [internal] + * Used for open and save, in fact. + */ +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) */ @@ -1378,6 +1553,73 @@ 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 ---------------------- */ /*********************************************************************** diff --git a/reactos/lib/comdlg32/printdlg.c b/reactos/lib/comdlg32/printdlg.c index 917f2334cc4..edc555ad615 100644 --- a/reactos/lib/comdlg32/printdlg.c +++ b/reactos/lib/comdlg32/printdlg.c @@ -1866,8 +1866,8 @@ static HGLOBAL PRINTDLG_GetDlgTemplateW(PRINTDLGW *lppd) { HRSRC hResInfo; HGLOBAL hDlgTmpl; - const WCHAR xpsetup[] = { 'P','R','I','N','T','3','2','_','S','E','T','U','P',0}; - const WCHAR xprint[] = { 'P','R','I','N','T','3','2',0}; + static const WCHAR xpsetup[] = { 'P','R','I','N','T','3','2','_','S','E','T','U','P',0}; + static const WCHAR xprint[] = { 'P','R','I','N','T','3','2',0}; if (lppd->Flags & PD_PRINTSETUP) { if(lppd->Flags & PD_ENABLESETUPTEMPLATEHANDLE) { @@ -2875,7 +2875,7 @@ BOOL WINAPI PageSetupDlgW(LPPAGESETUPDLGW setupdlg) { /* short cut exit, just return default values */ if (setupdlg->Flags & PSD_RETURNDEFAULT) { - const WCHAR a4[] = {'A','4',0}; + static const WCHAR a4[] = {'A','4',0}; setupdlg->hDevMode = pdlg.hDevMode; setupdlg->hDevNames = pdlg.hDevNames; /* FIXME: Just return "A4" for now. */ diff --git a/reactos/lib/comdlg32/rsrc.rc b/reactos/lib/comdlg32/rsrc.rc index c5fbf3bb71d..28c87577e1b 100644 --- a/reactos/lib/comdlg32/rsrc.rc +++ b/reactos/lib/comdlg32/rsrc.rc @@ -63,6 +63,7 @@ #include "cdlg_Sk.rc" #include "cdlg_Sv.rc" #include "cdlg_Th.rc" +#include "cdlg_Uk.rc" #include "cdlg_Wa.rc" #include "cdlg_Ja.rc" #include "cdlg_Zh.rc" diff --git a/reactos/lib/comdlg32/winehq2ros.patch b/reactos/lib/comdlg32/winehq2ros.patch index d05ddbbfd30..04afdf2914c 100644 --- a/reactos/lib/comdlg32/winehq2ros.patch +++ b/reactos/lib/comdlg32/winehq2ros.patch @@ -1,10 +1,103 @@ +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 8 May 2004 13:01:07 -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.79 +diff -u -r1.79 filedlg.c +--- filedlg.c 5 May 2004 23:49:39 -0000 1.79 ++++ filedlg.c 8 May 2004 13:01:08 -0000 +@@ -3241,6 +3241,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)) +@@ -3249,6 +3250,7 @@ + if (win16look) + return GetFileName31A(ofn, OPEN_DIALOG); + else ++#endif + return GetFileDialog95A(ofn, OPEN_DIALOG); + } + +@@ -3265,6 +3267,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)) +@@ -3273,6 +3276,7 @@ + if (win16look) + return GetFileName31W(ofn, OPEN_DIALOG); + else ++#endif + return GetFileDialog95W(ofn, OPEN_DIALOG); + } + +@@ -3290,6 +3294,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)) +@@ -3298,6 +3303,7 @@ + if (win16look) + return GetFileName31A(ofn, SAVE_DIALOG); + else ++#endif + return GetFileDialog95A(ofn, SAVE_DIALOG); + } + +@@ -3314,6 +3320,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)) +@@ -3322,5 +3329,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 -retrieving revision 1.74 -diff -u -r1.74 printdlg.c ---- printdlg.c 9 Jan 2004 05:10:35 -0000 1.74 -+++ printdlg.c 15 Apr 2004 08:51:04 -0000 +retrieving revision 1.75 +diff -u -r1.75 printdlg.c +--- printdlg.c 19 Apr 2004 20:12:15 -0000 1.75 ++++ printdlg.c 8 May 2004 13:01:09 -0000 @@ -341,7 +341,7 @@ lpdm->dmCollate = (IsDlgButtonChecked(hDlg, chx2) == BST_CHECKED); From af54a2903034dd0fefd1d802b3c3a4655fd97491 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sat, 8 May 2004 12:58:08 +0000 Subject: [PATCH 1058/1463] Sync to Wine-20040505: Mike McCormack - Implemented WNetEnumCachedPasswords. svn path=/trunk/; revision=9325 --- reactos/lib/mpr/pwcache.c | 148 +++++++++++++++++++++++++++++++------- 1 file changed, 122 insertions(+), 26 deletions(-) diff --git a/reactos/lib/mpr/pwcache.c b/reactos/lib/mpr/pwcache.c index 056e8d452fd..50e624a6c45 100644 --- a/reactos/lib/mpr/pwcache.c +++ b/reactos/lib/mpr/pwcache.c @@ -2,7 +2,7 @@ * MPR Password Cache functions * * Copyright 1999 Ulrich Weigand - * Copyright 2003 Mike McCormack for CodeWeavers + * Copyright 2003,2004 Mike McCormack for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -32,22 +32,43 @@ WINE_DEFAULT_DEBUG_CHANNEL(mpr); static const char mpr_key[] = "Software\\Wine\\Wine\\Mpr\\"; +static inline BYTE hex( BYTE x ) +{ + if( x <= 9 ) + return x + '0'; + return x + 'A' - 10; +} + +static inline CHAR ctox( CHAR x ) +{ + if( ( x >= '0' ) && ( x <= '9' ) ) + return x - '0'; + if( ( x >= 'A' ) && ( x <= 'F' ) ) + return x - 'A' + 10; + if( ( x >= 'a' ) && ( x <= 'a' ) ) + return x - 'a' + 10; + return -1; +} + static LPSTR MPR_GetValueName( LPSTR pbResource, WORD cbResource, BYTE nType ) { LPSTR name; - DWORD i, x = 0; + DWORD i; - /* just a hash so the value name doesn't get too large */ - for( i=0; i> 25)) ^ toupper(pbResource[i]); - - name = HeapAlloc( GetProcessHeap(), 0, 0x10 ); + name = HeapAlloc( GetProcessHeap(), 0, 6+cbResource*2 ); if( name ) - sprintf( name, "I-%08lX-%02X", x, nType ); + sprintf( name, "X-%02X-", nType ); + for(i=0; i>4); + name[6+i*2]=hex(pbResource[i]&0x0f); + } + name[5+i*2]=0; TRACE( "Value is %s\n", name ); return name; } + /************************************************************************** * WNetCachePassword [MPR.@] Saves password in cache * @@ -88,7 +109,7 @@ DWORD WINAPI WNetCachePassword( r = RegSetValueExA( hkey, valname, 0, REG_BINARY, pbPassword, cbPassword ); if( r ) - r = WN_ACCESS_DENIED; + r = WN_CANCEL; else r = WN_SUCCESS; HeapFree( GetProcessHeap(), 0, valname ); @@ -104,8 +125,10 @@ DWORD WINAPI WNetCachePassword( /***************************************************************** * WNetRemoveCachedPassword [MPR.@] */ -UINT WINAPI WNetRemoveCachedPassword( LPSTR pbResource, WORD cbResource, - BYTE nType ) +UINT WINAPI WNetRemoveCachedPassword( + LPSTR pbResource, /* [in] resource ID to delete */ + WORD cbResource, /* [in] number of bytes in the resource ID */ + BYTE nType ) /* [in] Type of the resource to delete */ { HKEY hkey; DWORD r; @@ -162,10 +185,12 @@ DWORD WINAPI WNetGetCachedPassword( DWORD r, type = 0, sz; LPSTR valname; - WARN( "(%p(%s), %d, %p, %p, %d): stub\n", + WARN( "(%p(%s), %d, %p, %p, %d): totally insecure\n", pbResource, debugstr_a(pbResource), cbResource, pbPassword, pcbPassword, nType ); + memset( pbPassword, 0, *pcbPassword); + r = RegCreateKeyA( HKEY_CURRENT_USER, mpr_key, &hkey ); if( r ) return WN_ACCESS_DENIED; @@ -177,7 +202,7 @@ DWORD WINAPI WNetGetCachedPassword( r = RegQueryValueExA( hkey, valname, 0, &type, pbPassword, &sz ); *pcbPassword = sz; if( r ) - r = WN_ACCESS_DENIED; + r = WN_CANCEL; else r = WN_SUCCESS; HeapFree( GetProcessHeap(), 0, valname ); @@ -198,22 +223,93 @@ DWORD WINAPI WNetGetCachedPassword( * it to grab all the passwords in the cache. It's bad enough to * store the passwords (insecurely). * - * observed values: - * arg1 ptr 0x40xxxxxx -> (no string) - * arg2 int 32 - * arg3 type? 4 - * arg4 enumPasswordProc (verifyed) - * arg5 ptr 0x40xxxxxx -> 0x0 + * bpPrefix and cbPrefix are used to filter the returned passwords + * the first cbPrefix bytes of the password resource identifier + * should match the same number of bytes in bpPrefix * - * ---- everything below this line might be wrong (js) ----- + * RETURNS + * Success: WN_SUCCESS (even if no entries were enumerated) + * Failure: WN_ACCESS_DENIED, WN_BAD_PASSWORD, WN_BAD_VALUE, + * WN_NET_ERROR, WN_NOT_SUPPORTED, WN_OUT_OF_MEMORY */ -UINT WINAPI WNetEnumCachedPasswords( LPSTR pbPrefix, WORD cbPrefix, - BYTE nType, ENUMPASSWORDPROC enumPasswordProc, DWORD x) +UINT WINAPI WNetEnumCachedPasswords( + LPSTR pbPrefix, /* [in] prefix to filter cache entries */ + WORD cbPrefix, /* [in] number of bytes in Prefix substring */ + BYTE nType, /* [in] match the Type ID of the entry */ + ENUMPASSWORDPROC enumPasswordProc, /* [in] callback function */ + DWORD param) /* [in] parameter passed to enum function */ { - WARN( "(%p(%s), %d, %d, %p, 0x%08lx): don't implement this\n", - pbPrefix, debugstr_a(pbPrefix), cbPrefix, - nType, enumPasswordProc, x ); + HKEY hkey; + DWORD r, type, val_sz, data_sz, i, j, size; + PASSWORD_CACHE_ENTRY *entry; + CHAR val[256], prefix[6]; - return WN_NOT_SUPPORTED; + WARN( "(%s, %d, %d, %p, 0x%08lx) totally insecure\n", + debugstr_an(pbPrefix,cbPrefix), cbPrefix, + nType, enumPasswordProc, param ); + + r = RegCreateKeyA( HKEY_CURRENT_USER, mpr_key, &hkey ); + if( r ) + return WN_ACCESS_DENIED; + + sprintf(prefix, "X-%02X-", nType ); + + i = 0; + for( i=0; ; i++ ) + { + val_sz = sizeof val; + data_sz = 0; + type = 0; + val[0] = 0; + r = RegEnumValueA( hkey, i, val, &val_sz, NULL, &type, NULL, &data_sz ); + if( r != ERROR_SUCCESS ) + break; + if( type != REG_BINARY ) + continue; + + /* check the value is in the format we expect */ + if( val_sz < sizeof prefix ) + continue; + if( memcmp( prefix, val, 5 ) ) + continue; + + /* decode the value */ + for(j=5; jabResource[0] + val_sz + data_sz; + entry = HeapAlloc( GetProcessHeap(), 0, sizeof *entry + val_sz + data_sz ); + memcpy( entry->abResource, val, val_sz ); + entry->cbEntry = size; + entry->cbResource = val_sz; + entry->cbPassword = data_sz; + entry->iEntry = i; + entry->nType = nType; + r = RegEnumValueA( hkey, i, NULL, &val_sz, NULL, &type, + &entry->abResource[val_sz], &data_sz ); + if( r == ERROR_SUCCESS ) + enumPasswordProc( entry, param ); + HeapFree( GetProcessHeap(), 0, entry ); + } + + RegCloseKey( hkey ); + + return WN_SUCCESS; } From b1e6d9458c771b9f07e49e3c5b5934d82515d5e7 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 8 May 2004 13:06:12 +0000 Subject: [PATCH 1059/1463] minor fixes svn path=/trunk/; revision=9326 --- reactos/subsys/win32k/ntuser/window.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 2d20acc02cc..9221b56d89e 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.226 2004/05/08 12:49:34 weiden Exp $ +/* $Id: window.c,v 1.227 2004/05/08 13:06:12 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1363,13 +1363,9 @@ NtUserChildWindowFromPointEx(HWND hwndParent, BOOL FASTCALL IntCalcDefPosSize(PWINDOW_OBJECT Parent, PWINDOW_OBJECT WindowObject, RECT *rc, BOOL IncPos) { - PDESKTOP_OBJECT Desktop; SIZE Sz; POINT Pos; - Desktop = WindowObject->OwnerThread->Win32Thread->Desktop; - IntGetDesktopWorkArea(Desktop, rc); - if(Parent != NULL) { NtGdiIntersectRect(rc, rc, &Parent->ClientRect); @@ -1732,10 +1728,13 @@ NtUserCreateWindowEx(DWORD dwExStyle, /* default positioning for overlapped windows */ if(!(WindowObject->Style & (WS_POPUP | WS_CHILD))) { - RECT rc; + RECT rc, WorkArea; PRTL_USER_PROCESS_PARAMETERS ProcessParams; BOOL CalculatedDefPosSize = FALSE; + IntGetDesktopWorkArea(WindowObject->OwnerThread->Win32Thread->Desktop, &WorkArea); + + rc = WorkArea; ProcessParams = PsGetCurrentProcess()->Peb->ProcessParameters; if(x == CW_USEDEFAULT || x == CW_USEDEFAULT16) @@ -1745,8 +1744,8 @@ NtUserCreateWindowEx(DWORD dwExStyle, if(ProcessParams->dwFlags & STARTF_USEPOSITION) { ProcessParams->dwFlags &= ~STARTF_USEPOSITION; - Pos.x = ProcessParams->dwX; - Pos.y = ProcessParams->dwY; + Pos.x = WorkArea.left + ProcessParams->dwX; + Pos.y = WorkArea.top + ProcessParams->dwY; } else { From 4c54d1cace1611aa25ece07a3899f9a12f5ca20d Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 8 May 2004 13:11:07 +0000 Subject: [PATCH 1060/1463] Implement recursive deletion of start menu groups and desktop items. svn path=/trunk/; revision=9327 --- reactos/lib/userenv/directory.c | 93 ++++++++++++++++++++++++++++++++- 1 file changed, 92 insertions(+), 1 deletion(-) diff --git a/reactos/lib/userenv/directory.c b/reactos/lib/userenv/directory.c index 9bc5e62df9f..d677d5ea3b9 100644 --- a/reactos/lib/userenv/directory.c +++ b/reactos/lib/userenv/directory.c @@ -1,4 +1,4 @@ -/* $Id: directory.c,v 1.3 2004/05/07 11:18:53 ekohl Exp $ +/* $Id: directory.c,v 1.4 2004/05/08 13:11:07 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -177,9 +177,100 @@ CreateDirectoryPath (LPCWSTR lpPathName, } +static BOOL +RecursiveRemoveDir (LPCWSTR lpPath) +{ + WCHAR szPath[MAX_PATH]; + WIN32_FIND_DATAW FindData; + HANDLE hFind; + BOOL bResult; + + wcscpy (szPath, lpPath); + wcscat (szPath, L"\\*.*"); + DPRINT ("Search path: '%S'\n", szPath); + + hFind = FindFirstFileW (szPath, + &FindData); + if (hFind == INVALID_HANDLE_VALUE) + return FALSE; + + bResult = TRUE; + while (TRUE) + { + if (wcscmp (FindData.cFileName, L".") && + wcscmp (FindData.cFileName, L"..")) + { + wcscpy (szPath, lpPath); + wcscat (szPath, L"\\"); + wcscat (szPath, FindData.cFileName); + DPRINT ("File name: '%S'\n", szPath); + + if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + DPRINT ("Delete directory: '%S'\n", szPath); + + if (!RecursiveRemoveDir (szPath)) + { + bResult = FALSE; + break; + } + + if (FindData.dwFileAttributes & FILE_ATTRIBUTE_READONLY) + { + SetFileAttributesW (szPath, + FindData.dwFileAttributes & ~FILE_ATTRIBUTE_READONLY); + } + + if (!RemoveDirectoryW (szPath)) + { + bResult = FALSE; + break; + } + } + else + { + DPRINT ("Delete file: '%S'\n", szPath); + + if (FindData.dwFileAttributes & (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM)) + { + SetFileAttributesW (szPath, + FILE_ATTRIBUTE_NORMAL); + } + + if (!DeleteFileW (szPath)) + { + bResult = FALSE; + break; + } + } + } + + if (!FindNextFileW (hFind, &FindData)) + { + if (GetLastError () != ERROR_NO_MORE_FILES) + { + DPRINT1 ("Error: %lu\n", GetLastError()); + bResult = FALSE; + break; + } + + break; + } + } + + FindClose (hFind); + + return bResult; +} + + BOOL RemoveDirectoryPath (LPCWSTR lpPathName) { + if (!RecursiveRemoveDir (lpPathName)) + return FALSE; + + DPRINT1 ("Delete directory: '%S'\n", lpPathName); return RemoveDirectoryW (lpPathName); } From f7a4bc8f45ffc20099b1cfaa1186f58dea51d11b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sat, 8 May 2004 13:32:51 +0000 Subject: [PATCH 1061/1463] Sync to Wine-20040505: Francois Gouget - Make Unicode strings static const. - Add a stub for StgCreateStorageEx(). Returns STG_E_UNIMPLEMENTEDFUNCTION as per MSDN. Fixes an error saving files in Word XP. - Make our ascii strings static const. Remove a couple string variables that were used only once and use the string literal directly. Marcus Meissner - Fixed strict aliasing issues in dlls/ole32. - Implemented CoReleaseMarshalData. - Fixed lvalue casts. - Fixed strict aliasing issues in dlls/ole32. Filip Navara - Get rid of E_UNSPEC non-standard error value. svn path=/trunk/; revision=9328 --- reactos/lib/ole32/antimoniker.c | 2 +- reactos/lib/ole32/compobj.c | 4 +- reactos/lib/ole32/datacache.c | 4 +- reactos/lib/ole32/defaulthandler.c | 10 ++--- reactos/lib/ole32/filemoniker.c | 22 +++++------ reactos/lib/ole32/ifs.c | 18 ++++----- reactos/lib/ole32/itemmoniker.c | 10 ++--- reactos/lib/ole32/marshal.c | 61 +++++++++++++++++++++++++++--- reactos/lib/ole32/moniker.c | 2 +- reactos/lib/ole32/ole2.c | 18 ++++----- reactos/lib/ole32/ole2impl.c | 4 +- reactos/lib/ole32/ole32.spec | 4 +- reactos/lib/ole32/oleproxy.c | 4 +- reactos/lib/ole32/storage.c | 18 +++++---- reactos/lib/ole32/storage32.c | 39 +++++++++++-------- reactos/w32api/include/objbase.h | 9 +++++ 16 files changed, 148 insertions(+), 81 deletions(-) diff --git a/reactos/lib/ole32/antimoniker.c b/reactos/lib/ole32/antimoniker.c index fd039dd98fb..f323ef49aa5 100644 --- a/reactos/lib/ole32/antimoniker.c +++ b/reactos/lib/ole32/antimoniker.c @@ -539,7 +539,7 @@ HRESULT WINAPI AntiMonikerImpl_GetDisplayName(IMoniker* iface, IMoniker* pmkToLeft, LPOLESTR *ppszDisplayName) { - WCHAR back[]={'\\','.','.',0}; + static const WCHAR back[]={'\\','.','.',0}; TRACE("(%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,ppszDisplayName); diff --git a/reactos/lib/ole32/compobj.c b/reactos/lib/ole32/compobj.c index f66e03824d0..e4b955dd578 100644 --- a/reactos/lib/ole32/compobj.c +++ b/reactos/lib/ole32/compobj.c @@ -1015,7 +1015,7 @@ _LocalServerThread(LPVOID param) { strcpy(pipefn,PIPEPREF); WINE_StringFromCLSID(&newClass->classIdentifier,pipefn+strlen(PIPEPREF)); - hres = IUnknown_QueryInterface(newClass->classObject,&IID_IClassFactory,(LPVOID*)&classfac); + hres = IUnknown_QueryInterface(newClass->classObject,&IID_IClassFactory,(LPVOID*)(char*)&classfac); if (hres) return hres; hres = CreateStreamOnHGlobal(0,TRUE,&pStm); @@ -1543,7 +1543,7 @@ HRESULT WINAPI CoCreateInstanceEx( pUnkOuter, dwClsContext, &IID_IUnknown, - (VOID**)&pUnk); + (VOID**)(char*)&pUnk); if (hr) return hr; diff --git a/reactos/lib/ole32/datacache.c b/reactos/lib/ole32/datacache.c index c7cdec28038..efc97920981 100644 --- a/reactos/lib/ole32/datacache.c +++ b/reactos/lib/ole32/datacache.c @@ -1085,7 +1085,7 @@ static HRESULT WINAPI DataCache_GetData( { /* Get the Persist Storage */ - hr = IDataObject_QueryInterface(iface, &IID_IPersistStorage, (void**)&pPersistStorage); + hr = IDataObject_QueryInterface(iface, &IID_IPersistStorage, (void**)(char*)&pPersistStorage); if (hr != S_OK) goto cleanup; @@ -1214,7 +1214,7 @@ static HRESULT WINAPI DataCache_IDataObject_SetData( TRACE("(%p, %p, %p, %d)\n", iface, pformatetc, pmedium, fRelease); - hres = IDataObject_QueryInterface(iface, &IID_IOleCache2, (void**)&oleCache); + hres = IDataObject_QueryInterface(iface, &IID_IOleCache2, (void**)(char*)&oleCache); if (FAILED(hres)) return E_UNEXPECTED; diff --git a/reactos/lib/ole32/defaulthandler.c b/reactos/lib/ole32/defaulthandler.c index 9ae207bc563..639e84ec020 100644 --- a/reactos/lib/ole32/defaulthandler.c +++ b/reactos/lib/ole32/defaulthandler.c @@ -925,7 +925,7 @@ static HRESULT WINAPI DefaultHandler_GetMoniker( } - return E_UNSPEC; + return E_FAIL; } /************************************************************************ @@ -1103,7 +1103,7 @@ static HRESULT WINAPI DefaultHandler_GetExtent( TRACE("(%p, %lx, %p)\n", iface, dwDrawAspect, psizel); - hres = IUnknown_QueryInterface(this->dataCache, &IID_IViewObject2, (void**)&cacheView); + hres = IUnknown_QueryInterface(this->dataCache, &IID_IViewObject2, (void**)(char*)&cacheView); if (FAILED(hres)) return E_UNEXPECTED; @@ -1337,7 +1337,7 @@ static HRESULT WINAPI DefaultHandler_GetData( hres = IUnknown_QueryInterface(this->dataCache, &IID_IDataObject, - (void**)&cacheDataObject); + (void**)(char*)&cacheDataObject); if (FAILED(hres)) return E_UNEXPECTED; @@ -1381,7 +1381,7 @@ static HRESULT WINAPI DefaultHandler_QueryGetData( hres = IUnknown_QueryInterface(this->dataCache, &IID_IDataObject, - (void**)&cacheDataObject); + (void**)(char*)&cacheDataObject); if (FAILED(hres)) return E_UNEXPECTED; @@ -1434,7 +1434,7 @@ static HRESULT WINAPI DefaultHandler_SetData( hres = IUnknown_QueryInterface(this->dataCache, &IID_IDataObject, - (void**)&cacheDataObject); + (void**)(char*)&cacheDataObject); if (FAILED(hres)) return E_UNEXPECTED; diff --git a/reactos/lib/ole32/filemoniker.c b/reactos/lib/ole32/filemoniker.c index 52d9a996972..1345cd8e7c7 100644 --- a/reactos/lib/ole32/filemoniker.c +++ b/reactos/lib/ole32/filemoniker.c @@ -473,8 +473,8 @@ HRESULT WINAPI FileMonikerImpl_Construct(FileMonikerImpl* This, LPCOLESTR lpszPa int nb=0,i; int sizeStr=lstrlenW(lpszPathName); LPOLESTR *tabStr=0; - WCHAR twoPoint[]={'.','.',0}; - WCHAR bkSlash[]={'\\',0}; + static const WCHAR twoPoint[]={'.','.',0}; + static const WCHAR bkSlash[]={'\\',0}; BYTE addBkSlash; TRACE("(%p,%p)\n",This,lpszPathName); @@ -587,7 +587,7 @@ HRESULT WINAPI FileMonikerImpl_BindToObject(IMoniker* iface, res=GetClassFile(This->filePathName,&clsID); if (SUCCEEDED(res)){ - res=CoCreateInstance(&clsID,NULL,CLSCTX_ALL,&IID_IPersistFile,(void**)&ppf); + res=CoCreateInstance(&clsID,NULL,CLSCTX_ALL,&IID_IPersistFile,(void**)(char*)&ppf); if (SUCCEEDED(res)){ res=IPersistFile_Load(ppf,This->filePathName,STGM_READ); @@ -602,11 +602,11 @@ HRESULT WINAPI FileMonikerImpl_BindToObject(IMoniker* iface, } } else{ - res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IClassFactory,(void**)&pcf); + res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IClassFactory,(void**)(char*)&pcf); if (res==E_NOINTERFACE){ - res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IClassActivator,(void**)&pca); + res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IClassActivator,(void**)(char*)&pca); if (res==E_NOINTERFACE) return MK_E_INTERMEDIATEINTERFACENOTSUPPORTED; @@ -708,10 +708,8 @@ HRESULT WINAPI FileMonikerImpl_BindToStorage(IMoniker* iface, } else if ( (IsEqualIID(&IID_IStream, riid)) || (IsEqualIID(&IID_ILockBytes, riid)) ) - - return E_UNSPEC; + return E_FAIL; else - return E_NOINTERFACE; } else { @@ -753,8 +751,8 @@ HRESULT WINAPI FileMonikerImpl_ComposeWith(IMoniker* iface, { HRESULT res; LPOLESTR str1=0,str2=0,*strDec1=0,*strDec2=0,newStr=0; - WCHAR twoPoint[]={'.','.',0}; - WCHAR bkSlash[]={'\\',0}; + static const WCHAR twoPoint[]={'.','.',0}; + static const WCHAR bkSlash[]={'\\',0}; IBindCtx *bind=0; int i=0,j=0,lastIdx1=0,lastIdx2=0; DWORD mkSys; @@ -1100,7 +1098,7 @@ HRESULT WINAPI FileMonikerImpl_CommonPrefixWith(IMoniker* iface,IMoniker* pmkOth ******************************************************************************/ int WINAPI FileMonikerImpl_DecomposePath(LPCOLESTR str, LPOLESTR** stringTable) { - WCHAR bSlash[] = {'\\',0}; + static const WCHAR bSlash[] = {'\\',0}; WCHAR word[MAX_PATH]; int i=0,j,tabIndex=0; LPOLESTR *strgtable ; @@ -1159,7 +1157,7 @@ HRESULT WINAPI FileMonikerImpl_RelativePathTo(IMoniker* iface,IMoniker* pmOther, HRESULT res; LPOLESTR str1=0,str2=0,*tabStr1=0,*tabStr2=0,relPath=0; DWORD len1=0,len2=0,sameIdx=0,j=0; - WCHAR back[] ={'.','.','\\',0}; + static const WCHAR back[] ={'.','.','\\',0}; TRACE("(%p,%p,%p)\n",iface,pmOther,ppmkRelPath); diff --git a/reactos/lib/ole32/ifs.c b/reactos/lib/ole32/ifs.c index 90ad2a8ce8b..d84793435ed 100644 --- a/reactos/lib/ole32/ifs.c +++ b/reactos/lib/ole32/ifs.c @@ -144,7 +144,7 @@ static HRESULT WINAPI IMalloc_fnQueryInterface(LPMALLOC iface,REFIID refiid,LPVO TRACE("(%s,%p)\n",debugstr_guid(refiid),obj); if (IsEqualIID(&IID_IUnknown,refiid) || IsEqualIID(&IID_IMalloc,refiid)) { - *obj = (LPMALLOC)&Malloc32; + *obj = (LPMALLOC)(char*)&Malloc32; return S_OK; } return E_NOINTERFACE; @@ -380,7 +380,7 @@ static HRESULT WINAPI IMallocSpy_fnQueryInterface(LPMALLOCSPY iface,REFIID refii TRACE("(%s,%p)\n",debugstr_guid(refiid),obj); if (IsEqualIID(&IID_IUnknown,refiid) || IsEqualIID(&IID_IMallocSpy,refiid)) { - *obj = (LPMALLOC)&MallocSpy; + *obj = (LPMALLOC)(char*)&MallocSpy; return S_OK; } return E_NOINTERFACE; @@ -530,7 +530,7 @@ static ICOM_VTABLE(IMallocSpy) VT_IMallocSpy = */ HRESULT WINAPI CoGetMalloc(DWORD dwMemContext, LPMALLOC *lpMalloc) { - *lpMalloc = (LPMALLOC)&Malloc32; + *lpMalloc = (LPMALLOC)(char*)&Malloc32; return S_OK; } @@ -541,14 +541,14 @@ HRESULT WINAPI CoGetMalloc(DWORD dwMemContext, LPMALLOC *lpMalloc) */ LPVOID WINAPI CoTaskMemAlloc(ULONG size) { - return IMalloc_Alloc((LPMALLOC)&Malloc32,size); + return IMalloc_Alloc((LPMALLOC)(char*)&Malloc32,size); } /*********************************************************************** * CoTaskMemFree [OLE32.@] */ VOID WINAPI CoTaskMemFree(LPVOID ptr) { - IMalloc_Free((LPMALLOC)&Malloc32, ptr); + IMalloc_Free((LPMALLOC)(char*)&Malloc32, ptr); } /*********************************************************************** @@ -558,7 +558,7 @@ VOID WINAPI CoTaskMemFree(LPVOID ptr) */ LPVOID WINAPI CoTaskMemRealloc(LPVOID pvOld, ULONG size) { - return IMalloc_Realloc((LPMALLOC)&Malloc32, pvOld, size); + return IMalloc_Realloc((LPMALLOC)(char*)&Malloc32, pvOld, size); } /*********************************************************************** @@ -576,13 +576,13 @@ HRESULT WINAPI CoRegisterMallocSpy(LPMALLOCSPY pMallocSpy) TRACE("\n"); /* HACK TO ACTIVATE OUT SPY */ - if (pMallocSpy == (LPVOID)-1) pMallocSpy =(IMallocSpy*)&MallocSpy; + if (pMallocSpy == (LPVOID)-1) pMallocSpy =(IMallocSpy*)(char*)&MallocSpy; if(Malloc32.pSpy) return CO_E_OBJISREG; EnterCriticalSection(&IMalloc32_SpyCS); - if (SUCCEEDED(IUnknown_QueryInterface(pMallocSpy, &IID_IMallocSpy, (LPVOID*)&pSpy))) { + if (SUCCEEDED(IUnknown_QueryInterface(pMallocSpy, &IID_IMallocSpy, (LPVOID*)(char*)&pSpy))) { Malloc32.pSpy = pSpy; hres = S_OK; } @@ -607,7 +607,7 @@ HRESULT WINAPI CoRevokeMallocSpy(void) EnterCriticalSection(&IMalloc32_SpyCS); /* if it's our spy it's time to dump the leaks */ - if (Malloc32.pSpy == (IMallocSpy*)&MallocSpy) { + if (Malloc32.pSpy == (IMallocSpy*)(char*)&MallocSpy) { MallocSpyDumpLeaks(); } diff --git a/reactos/lib/ole32/itemmoniker.c b/reactos/lib/ole32/itemmoniker.c index b426f712f13..6c1d71ff775 100644 --- a/reactos/lib/ole32/itemmoniker.c +++ b/reactos/lib/ole32/itemmoniker.c @@ -454,7 +454,7 @@ HRESULT WINAPI ItemMonikerImpl_BindToObject(IMoniker* iface, *ppvResult=0; - res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&refid,(void**)&poic); + res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&refid,(void**)(char*)&poic); if (SUCCEEDED(res)){ @@ -487,7 +487,7 @@ HRESULT WINAPI ItemMonikerImpl_BindToStorage(IMoniker* iface, if(pmkToLeft==NULL) return E_INVALIDARG; - res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IOleItemContainer,(void**)&poic); + res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IOleItemContainer,(void**)(char*)&poic); if (SUCCEEDED(res)){ @@ -715,7 +715,7 @@ HRESULT WINAPI ItemMonikerImpl_IsRunning(IMoniker* iface, /* requesting an IOleItemContainer interface pointer. The method then calls IOleItemContainer::IsRunning,*/ /* passing the string contained within this moniker. */ - res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IOleItemContainer,(void**)&poic); + res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IOleItemContainer,(void**)(char*)&poic); if (SUCCEEDED(res)){ @@ -876,11 +876,11 @@ HRESULT WINAPI ItemMonikerImpl_ParseDisplayName(IMoniker* iface, /* Otherwise, the method calls IMoniker::BindToObject on the pmkToLeft parameter, requesting an */ /* IParseDisplayName interface pointer to the object identified by the moniker, and passes the display */ /* name to IParseDisplayName::ParseDisplayName */ - res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IOleItemContainer,(void**)&poic); + res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IOleItemContainer,(void**)(char*)&poic); if (SUCCEEDED(res)){ - res=IOleItemContainer_GetObject(poic,This->itemName,BINDSPEED_MODERATE,pbc,&IID_IParseDisplayName,(void**)&ppdn); + res=IOleItemContainer_GetObject(poic,This->itemName,BINDSPEED_MODERATE,pbc,&IID_IParseDisplayName,(void**)(char*)&ppdn); res=IMoniker_GetDisplayName(iface,pbc,NULL,&displayName); diff --git a/reactos/lib/ole32/marshal.c b/reactos/lib/ole32/marshal.c index c0631b81a6c..e49aae716aa 100644 --- a/reactos/lib/ole32/marshal.c +++ b/reactos/lib/ole32/marshal.c @@ -256,7 +256,7 @@ StdMarshalImpl_MarshalInterface( IPSFactoryBuffer *psfacbuf; TRACE("(...,%s,...)\n",debugstr_guid(riid)); - IUnknown_QueryInterface((LPUNKNOWN)pv,&IID_IUnknown,(LPVOID*)&pUnk); + IUnknown_QueryInterface((LPUNKNOWN)pv,&IID_IUnknown,(LPVOID*)(char*)&pUnk); mid.processid = GetCurrentProcessId(); mid.objectid = (DWORD)pUnk; /* FIXME */ IUnknown_Release(pUnk); @@ -280,7 +280,7 @@ StdMarshalImpl_MarshalInterface( FIXME("Failed to create a stub for %s\n",debugstr_guid(riid)); return hres; } - IUnknown_QueryInterface((LPUNKNOWN)pv,riid,(LPVOID*)&pUnk); + IUnknown_QueryInterface((LPUNKNOWN)pv,riid,(LPVOID*)(char*)&pUnk); MARSHAL_Register_Stub(&mid,pUnk,stub); IUnknown_Release(pUnk); return S_OK; @@ -379,7 +379,8 @@ CoGetStandardMarshal( TRACE("(%s,%p,%lx,%p,%lx,%p)\n", debugstr_guid(riid),pUnk,dwDestContext,pvDestContext,mshlflags,pMarshal ); - dm = (StdMarshalImpl*) *pMarshal = HeapAlloc(GetProcessHeap(),0,sizeof(StdMarshalImpl)); + *pMarshal = HeapAlloc(GetProcessHeap(),0,sizeof(StdMarshalImpl)); + dm = (StdMarshalImpl*) *pMarshal; if (!dm) return E_FAIL; dm->lpvtbl = &stdmvtbl; dm->ref = 1; @@ -447,7 +448,7 @@ CoMarshalInterface( IStream *pStm, REFIID riid, IUnknown *pUnk, ); STUBMGR_Start(); /* Just to be sure we have one running. */ mid.processid = GetCurrentProcessId(); - IUnknown_QueryInterface(pUnk,&IID_IUnknown,(LPVOID*)&pUnknown); + IUnknown_QueryInterface(pUnk,&IID_IUnknown,(LPVOID*)(char*)&pUnknown); mid.objectid = (DWORD)pUnknown; IUnknown_Release(pUnknown); memcpy(&mid.iid,riid,sizeof(mid.iid)); @@ -522,7 +523,7 @@ CoUnmarshalInterface(IStream *pStm, REFIID riid, LPVOID *ppv) { FIXME("Stream read 3 failed, %lx, (%ld of %d)\n",hres,res,sizeof(xclsid)); return hres; } - hres=CoCreateInstance(&xclsid,NULL,CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER,&IID_IMarshal,(void**)&pUnk); + hres=CoCreateInstance(&xclsid,NULL,CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER,&IID_IMarshal,(void**)(char*)&pUnk); if (hres) { FIXME("Failed to create instance of unmarshaller %s.\n",debugstr_guid(&xclsid)); return hres; @@ -542,6 +543,56 @@ release_marshal: return hres; } +/*********************************************************************** + * CoReleaseMarshalData [OLE32.@] + */ +HRESULT WINAPI +CoReleaseMarshalData(IStream *pStm) { + HRESULT hres; + wine_marshal_id mid; + wine_marshal_data md; + ULONG res; + LPMARSHAL pMarshal; + LPUNKNOWN pUnk; + CLSID xclsid; + + TRACE("(%p)\n",pStm); + + hres = IStream_Read(pStm,&mid,sizeof(mid),&res); + if (hres) { + FIXME("Stream read 1 failed, %lx, (%ld of %d)\n",hres,res,sizeof(mid)); + return hres; + } + hres = IStream_Read(pStm,&md,sizeof(md),&res); + if (hres) { + FIXME("Stream read 2 failed, %lx, (%ld of %d)\n",hres,res,sizeof(md)); + return hres; + } + hres = IStream_Read(pStm,&xclsid,sizeof(xclsid),&res); + if (hres) { + FIXME("Stream read 3 failed, %lx, (%ld of %d)\n",hres,res,sizeof(xclsid)); + return hres; + } + hres=CoCreateInstance(&xclsid,NULL,CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER,&IID_IMarshal,(void**)(char*)&pUnk); + if (hres) { + FIXME("Failed to create instance of unmarshaller %s.\n",debugstr_guid(&xclsid)); + return hres; + } + hres = IUnknown_QueryInterface(pUnk,&IID_IMarshal,(LPVOID*)(char*)&pMarshal); + if (hres) { + FIXME("Failed to get IMarshal iface, %lx?\n",hres); + return hres; + } + hres = IMarshal_ReleaseMarshalData(pMarshal,pStm); + if (hres) { + FIXME("Failed to releasemarshaldata the interface, %lx?\n",hres); + } + IMarshal_Release(pMarshal); + IUnknown_Release(pUnk); + return hres; +} + + /*********************************************************************** * CoMarshalInterThreadInterfaceInStream [OLE32.@] * diff --git a/reactos/lib/ole32/moniker.c b/reactos/lib/ole32/moniker.c index f5cbcaffe92..ff619292df1 100644 --- a/reactos/lib/ole32/moniker.c +++ b/reactos/lib/ole32/moniker.c @@ -505,7 +505,7 @@ HRESULT WINAPI OleRun(LPUNKNOWN pUnknown) ICOM_THIS(IRunnableObject,pUnknown); LRESULT ret; - ret = IRunnableObject_QueryInterface(This,&IID_IRunnableObject,(LPVOID*)&runable); + ret = IRunnableObject_QueryInterface(This,&IID_IRunnableObject,(LPVOID*)(char*)&runable); if (ret) return 0; /* Appears to return no error. */ ret = IRunnableObject_Run(runable,NULL); diff --git a/reactos/lib/ole32/ole2.c b/reactos/lib/ole32/ole2.c index efeb81e597c..b690ccf907f 100644 --- a/reactos/lib/ole32/ole2.c +++ b/reactos/lib/ole32/ole2.c @@ -710,7 +710,7 @@ HRESULT WINAPI OleSetContainedObject( hres = IUnknown_QueryInterface(pUnknown, &IID_IRunnableObject, - (void**)&runnable); + (void**)(char*)&runnable); if (SUCCEEDED(hres)) { @@ -756,7 +756,7 @@ HRESULT WINAPI OleLoad( NULL, CLSCTX_INPROC_HANDLER, &IID_IOleObject, - (void**)&oleObject); + (void**)(char*)&oleObject); /* * If that fails, as it will most times, load the default @@ -767,7 +767,7 @@ HRESULT WINAPI OleLoad( hres = OleCreateDefaultHandler(&storageInfo.clsid, NULL, &IID_IOleObject, - (void**)&oleObject); + (void**)(char*)&oleObject); } /* @@ -786,7 +786,7 @@ HRESULT WINAPI OleLoad( */ hres = IOleObject_QueryInterface(oleObject, &IID_IPersistStorage, - (void**)&persistStorage); + (void**)(char*)&persistStorage); if (SUCCEEDED(hres)) { @@ -860,7 +860,7 @@ HRESULT WINAPI OleLockRunning(LPUNKNOWN pUnknown, BOOL fLock, BOOL fLastUnlockCl hres = IUnknown_QueryInterface(pUnknown, &IID_IRunnableObject, - (void**)&runnable); + (void**)(char*)&runnable); if (SUCCEEDED(hres)) { @@ -2229,7 +2229,7 @@ HRESULT WINAPI OleDraw( hres = IUnknown_QueryInterface(pUnk, &IID_IViewObject, - (void**)&viewobject); + (void**)(char*)&viewobject); if (SUCCEEDED(hres)) { @@ -2284,20 +2284,20 @@ HRESULT WINAPI OleCreate( FIXME("\n\t%s\n\t%s semi-stub!\n", debugstr_guid(rclsid), debugstr_guid(riid)); - if (SUCCEEDED((hres = CoCreateInstance(rclsid, 0, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER|CLSCTX_LOCAL_SERVER , riid, (LPVOID*)&pUnk)))) + if (SUCCEEDED((hres = CoCreateInstance(rclsid, 0, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER|CLSCTX_LOCAL_SERVER , riid, (LPVOID*)(char*)&pUnk)))) { if (pClientSite) { IOleObject * pOE; IPersistStorage * pPS; - if (SUCCEEDED((hres = IUnknown_QueryInterface( pUnk, &IID_IOleObject, (LPVOID*)&pOE)))) + if (SUCCEEDED((hres = IUnknown_QueryInterface( pUnk, &IID_IOleObject, (LPVOID*)(char*)&pOE)))) { TRACE("trying to set clientsite %p\n", pClientSite); hres1 = IOleObject_SetClientSite(pOE, pClientSite); TRACE("-- result 0x%08lx\n", hres1); IOleObject_Release(pOE); } - if (SUCCEEDED((hres = IUnknown_QueryInterface( pUnk, &IID_IPersistStorage, (LPVOID*)&pPS)))) + if (SUCCEEDED((hres = IUnknown_QueryInterface( pUnk, &IID_IPersistStorage, (LPVOID*)(char*)&pPS)))) { TRACE("trying to set stg %p\n", pStg); hres1 = IPersistStorage_InitNew(pPS, pStg); diff --git a/reactos/lib/ole32/ole2impl.c b/reactos/lib/ole32/ole2impl.c index 903c5e7416d..6dc79d010e8 100644 --- a/reactos/lib/ole32/ole2impl.c +++ b/reactos/lib/ole32/ole2impl.c @@ -151,7 +151,7 @@ HRESULT WINAPI OleCreateFromData(LPDATAOBJECT pSrcDataObject, REFIID riid, /* Create default handler for Persist storage */ if (hr1 == S_OK) - hr1 = OleCreateDefaultHandler(&clsID, NULL, &IID_IPersistStorage, (LPVOID*)&pPersistStorage); + hr1 = OleCreateDefaultHandler(&clsID, NULL, &IID_IPersistStorage, (LPVOID*)(char*)&pPersistStorage); /* Load the storage to Persist storage */ @@ -161,7 +161,7 @@ HRESULT WINAPI OleCreateFromData(LPDATAOBJECT pSrcDataObject, REFIID riid, /* Query for IOleObject */ if (hr1 == S_OK) - hr1 = IPersistStorage_QueryInterface(pPersistStorage, &IID_IOleObject, (LPVOID*)&pOleObject); + hr1 = IPersistStorage_QueryInterface(pPersistStorage, &IID_IOleObject, (LPVOID*)(char*)&pOleObject); /* Set client site with the IOleObject */ diff --git a/reactos/lib/ole32/ole32.spec b/reactos/lib/ole32/ole32.spec index fbd8aba2450..7f9d6b5fd5b 100644 --- a/reactos/lib/ole32/ole32.spec +++ b/reactos/lib/ole32/ole32.spec @@ -57,7 +57,7 @@ @ stdcall CoRegisterMessageFilter(ptr ptr) @ stub CoRegisterPSClsid #@ stdcall (ptr ptr) return 0,ERR_NOTIMPLEMENTED @ stub CoRegisterSurrogate -@ stub CoReleaseMarshalData #@ stdcall (ptr) return 0,ERR_NOTIMPLEMENTED +@ stdcall CoReleaseMarshalData(ptr) @ stub CoReleaseServerProcess #@ stdcall () return 0,ERR_NOTIMPLEMENTED @ stdcall CoResumeClassObjects() @ stub CoRevertToSelf #@ stdcall () return 0,ERR_NOTIMPLEMENTED @@ -233,7 +233,7 @@ @ stub SNB_UserUnmarshal @ stdcall StgCreateDocfile(wstr long long ptr) @ stdcall StgCreateDocfileOnILockBytes(ptr long long ptr) -@ stub StgCreateStorageEx +@ stdcall StgCreateStorageEx(wstr long long long ptr ptr ptr ptr) @ stub StgGetIFillLockBytesOnFile @ stub StgGetIFillLockBytesOnILockBytes @ stdcall StgIsStorageFile(wstr) diff --git a/reactos/lib/ole32/oleproxy.c b/reactos/lib/ole32/oleproxy.c index e381cde6574..6c117d2718c 100644 --- a/reactos/lib/ole32/oleproxy.c +++ b/reactos/lib/ole32/oleproxy.c @@ -156,12 +156,12 @@ CFStub_Invoke( } memcpy(&iid,msg->Buffer,sizeof(iid)); TRACE("->CreateInstance(%s)\n",debugstr_guid(&iid)); - hres = IUnknown_QueryInterface(This->pUnkServer,&IID_IClassFactory,(LPVOID*)&classfac); + hres = IUnknown_QueryInterface(This->pUnkServer,&IID_IClassFactory,(LPVOID*)(char*)&classfac); if (hres) { FIXME("Ole server does not provide a IClassFactory?\n"); return hres; } - hres = IClassFactory_CreateInstance(classfac,NULL,&iid,(LPVOID*)&ppv); + hres = IClassFactory_CreateInstance(classfac,NULL,&iid,(LPVOID*)(char*)&ppv); IClassFactory_Release(classfac); if (hres) { msg->cbBuffer = 0; diff --git a/reactos/lib/ole32/storage.c b/reactos/lib/ole32/storage.c index 2f753ad6712..664d661cec3 100644 --- a/reactos/lib/ole32/storage.c +++ b/reactos/lib/ole32/storage.c @@ -1061,6 +1061,7 @@ HRESULT WINAPI IStream16_fnRead( BYTE block[BIGSIZE]; ULONG *bytesread=pcbRead,xxread; int blocknr; + LPBYTE pbv = pv; TRACE_(relay)("(%p)->(%p,%ld,%p)\n",This,pv,cb,pcbRead); if (!pcbRead) bytesread=&xxread; @@ -1081,9 +1082,9 @@ HRESULT WINAPI IStream16_fnRead( cc = cb; if (cc>SMALLSIZE-(This->offset.u.LowPart&(SMALLSIZE-1))) cc=SMALLSIZE-(This->offset.u.LowPart&(SMALLSIZE-1)); - memcpy((LPBYTE)pv,block+(This->offset.u.LowPart&(SMALLSIZE-1)),cc); + memcpy(pbv,block+(This->offset.u.LowPart&(SMALLSIZE-1)),cc); This->offset.u.LowPart+=cc; - (LPBYTE)pv+=cc; + pbv+=cc; *bytesread+=cc; cb-=cc; blocknr = STORAGE_get_next_small_blocknr(This->hf,blocknr); @@ -1101,9 +1102,9 @@ HRESULT WINAPI IStream16_fnRead( cc = cb; if (cc>BIGSIZE-(This->offset.u.LowPart&(BIGSIZE-1))) cc=BIGSIZE-(This->offset.u.LowPart&(BIGSIZE-1)); - memcpy((LPBYTE)pv,block+(This->offset.u.LowPart&(BIGSIZE-1)),cc); + memcpy(pbv,block+(This->offset.u.LowPart&(BIGSIZE-1)),cc); This->offset.u.LowPart+=cc; - (LPBYTE)pv+=cc; + pbv+=cc; *bytesread+=cc; cb-=cc; blocknr=STORAGE_get_next_big_blocknr(This->hf,blocknr); @@ -1123,6 +1124,7 @@ HRESULT WINAPI IStream16_fnWrite( ULONG *byteswritten=pcbWrite,xxwritten; int oldsize,newsize,i,curoffset=0,lastblocknr,blocknr,cc; HANDLE hf = This->hf; + LPBYTE pbv = (LPBYTE)pv; if (!pcbWrite) byteswritten=&xxwritten; *byteswritten = 0; @@ -1340,14 +1342,14 @@ HRESULT WINAPI IStream16_fnWrite( if (cc>cb) cc=cb; memcpy( ((LPBYTE)block)+(This->offset.u.LowPart&(SMALLSIZE-1)), - (LPBYTE)((char *) pv+curoffset), + pbv+curoffset, cc ); if (!STORAGE_put_small_block(hf,blocknr,block)) return E_FAIL; cb -= cc; curoffset += cc; - (LPBYTE)pv += cc; + pbv += cc; This->offset.u.LowPart += cc; *byteswritten += cc; blocknr = STORAGE_get_next_small_blocknr(hf,blocknr); @@ -1368,14 +1370,14 @@ HRESULT WINAPI IStream16_fnWrite( if (cc>cb) cc=cb; memcpy( ((LPBYTE)block)+(This->offset.u.LowPart&(BIGSIZE-1)), - (LPBYTE)((char *) pv+curoffset), + pbv+curoffset, cc ); if (!STORAGE_put_big_block(hf,blocknr,block)) return E_FAIL; cb -= cc; curoffset += cc; - (LPBYTE)pv += cc; + pbv += cc; This->offset.u.LowPart += cc; *byteswritten += cc; blocknr = STORAGE_get_next_big_blocknr(hf,blocknr); diff --git a/reactos/lib/ole32/storage32.c b/reactos/lib/ole32/storage32.c index 4347e9632c4..7c7ff8e5ee7 100644 --- a/reactos/lib/ole32/storage32.c +++ b/reactos/lib/ole32/storage32.c @@ -5445,7 +5445,7 @@ HRESULT WINAPI StgCreateDocfile( if (pwcsName == 0) { WCHAR tempPath[MAX_PATH]; - WCHAR prefix[] = { 'S', 'T', 'O', 0 }; + static const WCHAR prefix[] = { 'S', 'T', 'O', 0 }; if (!(grfMode & STGM_SHARE_EXCLUSIVE)) return STG_E_INVALIDFLAG; @@ -5536,6 +5536,13 @@ HRESULT WINAPI StgCreateDocfile( return hr; } +HRESULT WINAPI StgCreateStorageEx(const WCHAR* pwcsName, DWORD grfMode, DWORD stgfmt, DWORD grfAttrs, STGOPTIONS* pStgOptions, void* reserved, REFIID riid, void** ppObjectOpen) +{ + TRACE("(%s, %lx, %lx, %lx, %p, %p, %p, %p)\n", debugstr_w(pwcsName), + grfMode, stgfmt, grfAttrs, pStgOptions, reserved, riid, ppObjectOpen); + return STG_E_UNIMPLEMENTEDFUNCTION; +} + /****************************************************************************** * StgOpenStorage [OLE32.@] */ @@ -5891,7 +5898,7 @@ HRESULT WINAPI OleLoadFromStream(IStream *pStm,REFIID iidInterface,void** ppvOb res=CoCreateInstance(&clsid,NULL,CLSCTX_INPROC_SERVER,iidInterface,ppvObj); if (!SUCCEEDED(res)) return res; - res=IUnknown_QueryInterface((IUnknown*)*ppvObj,&IID_IPersistStream,(LPVOID*)&xstm); + res=IUnknown_QueryInterface((IUnknown*)*ppvObj,&IID_IPersistStream,(LPVOID*)(char*)&xstm); if (!SUCCEEDED(res)) { IUnknown_Release((IUnknown*)*ppvObj); return res; @@ -6424,7 +6431,7 @@ void OLECONVERT_GetOLE20FromOLE10(LPSTORAGE pDestStorage, BYTE *pBuffer, DWORD n IStorage *pTempStorage; DWORD dwNumOfBytesWritten; WCHAR wstrTempDir[MAX_PATH], wstrTempFile[MAX_PATH]; - WCHAR wstrPrefix[] = {'s', 'i', 's', 0}; + static const WCHAR wstrPrefix[] = {'s', 'i', 's', 0}; /* Create a temp File */ GetTempPathW(MAX_PATH, wstrTempDir); @@ -6474,7 +6481,7 @@ DWORD OLECONVERT_WriteOLE20ToBuffer(LPSTORAGE pStorage, BYTE **pData) DWORD nDataLength = 0; IStorage *pTempStorage; WCHAR wstrTempDir[MAX_PATH], wstrTempFile[MAX_PATH]; - WCHAR wstrPrefix[] = {'s', 'i', 's', 0}; + static const WCHAR wstrPrefix[] = {'s', 'i', 's', 0}; *pData = NULL; @@ -6527,7 +6534,7 @@ void OLECONVERT_CreateOleStream(LPSTORAGE pStorage) { HRESULT hRes; IStream *pStream; - WCHAR wstrStreamName[] = {1,'O', 'l', 'e', 0}; + static const WCHAR wstrStreamName[] = {1,'O', 'l', 'e', 0}; BYTE pOleStreamHeader [] = { 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, @@ -6616,7 +6623,7 @@ static HRESULT STORAGE_WriteCompObj( LPSTORAGE pstg, CLSID *clsid, { IStream *pstm; HRESULT r = S_OK; - WCHAR szwStreamName[] = {1, 'C', 'o', 'm', 'p', 'O', 'b', 'j', 0}; + static const WCHAR szwStreamName[] = {1, 'C', 'o', 'm', 'p', 'O', 'b', 'j', 0}; static const BYTE unknown1[12] = { 0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00, @@ -6663,7 +6670,7 @@ static HRESULT CLSIDFromUserType(LPCWSTR lpszUserType, CLSID *clsid) HKEY hkey, hkeyclsid; LPWSTR buffer = NULL; BOOL found = FALSE; - const WCHAR szclsid[] = { 'C','L','S','I','D',0 }; + static const WCHAR szclsid[] = { 'C','L','S','I','D',0 }; TRACE("Finding CLSID for %s\n", debugstr_w(lpszUserType)); @@ -6770,7 +6777,7 @@ HRESULT WINAPI ReadFmtUserTypeStg (LPSTORAGE pstg, CLIPFORMAT* pcf, LPOLESTR* lp { HRESULT r; IStream *stm = 0; - const WCHAR szCompObj[] = { 1, 'C','o','m','p','O','b','j', 0 }; + static const WCHAR szCompObj[] = { 1, 'C','o','m','p','O','b','j', 0 }; unsigned char unknown1[12]; unsigned char unknown2[16]; DWORD count; @@ -6855,7 +6862,7 @@ HRESULT OLECONVERT_CreateCompObjStream(LPSTORAGE pStorage, LPCSTR strOleTypeName IStream *pStream; HRESULT hStorageRes, hRes = S_OK; OLECONVERT_ISTORAGE_COMPOBJ IStorageCompObj; - WCHAR wstrStreamName[] = {1,'C', 'o', 'm', 'p', 'O', 'b', 'j', 0}; + static const WCHAR wstrStreamName[] = {1,'C', 'o', 'm', 'p', 'O', 'b', 'j', 0}; WCHAR bufferW[OLESTREAM_MAX_STR_LEN]; BYTE pCompObjUnknown1[] = {0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF}; @@ -6956,7 +6963,7 @@ void OLECONVERT_CreateOlePresStream(LPSTORAGE pStorage, DWORD dwExtentX, DWORD d { HRESULT hRes; IStream *pStream; - WCHAR wstrStreamName[] = {2, 'O', 'l', 'e', 'P', 'r', 'e', 's', '0', '0', '0', 0}; + static const WCHAR wstrStreamName[] = {2, 'O', 'l', 'e', 'P', 'r', 'e', 's', '0', '0', '0', 0}; BYTE pOlePresStreamHeader [] = { 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, @@ -7040,7 +7047,7 @@ void OLECONVERT_CreateOle10NativeStream(LPSTORAGE pStorage, BYTE *pData, DWORD d { HRESULT hRes; IStream *pStream; - WCHAR wstrStreamName[] = {1, 'O', 'l', 'e', '1', '0', 'N', 'a', 't', 'i', 'v', 'e', 0}; + static const WCHAR wstrStreamName[] = {1, 'O', 'l', 'e', '1', '0', 'N', 'a', 't', 'i', 'v', 'e', 0}; /* Create the Ole10Native Stream */ hRes = IStorage_CreateStream(pStorage, wstrStreamName, @@ -7081,7 +7088,7 @@ HRESULT OLECONVERT_GetOLE10ProgID(LPSTORAGE pStorage, char *strProgID, DWORD *dw IStream *pStream; LARGE_INTEGER iSeekPos; OLECONVERT_ISTORAGE_COMPOBJ CompObj; - WCHAR wstrStreamName[] = {1,'C', 'o', 'm', 'p', 'O', 'b', 'j', 0}; + static const WCHAR wstrStreamName[] = {1,'C', 'o', 'm', 'p', 'O', 'b', 'j', 0}; /* Open the CompObj Stream */ hRes = IStorage_OpenStream(pStorage, wstrStreamName, NULL, @@ -7150,7 +7157,7 @@ void OLECONVERT_GetOle10PresData(LPSTORAGE pStorage, OLECONVERT_OLESTREAM_DATA * HRESULT hRes; IStream *pStream; - WCHAR wstrStreamName[] = {1, 'O', 'l', 'e', '1', '0', 'N', 'a', 't', 'i', 'v', 'e', 0}; + static const WCHAR wstrStreamName[] = {1, 'O', 'l', 'e', '1', '0', 'N', 'a', 't', 'i', 'v', 'e', 0}; /* Initialize Default data for OLESTREAM */ pOleStreamData[0].dwOleID = OLESTREAM_ID; @@ -7203,7 +7210,7 @@ void OLECONVERT_GetOle20PresData(LPSTORAGE pStorage, OLECONVERT_OLESTREAM_DATA * HRESULT hRes; IStream *pStream; OLECONVERT_ISTORAGE_OLEPRES olePress; - WCHAR wstrStreamName[] = {2, 'O', 'l', 'e', 'P', 'r', 'e', 's', '0', '0', '0', 0}; + static const WCHAR wstrStreamName[] = {2, 'O', 'l', 'e', 'P', 'r', 'e', 's', '0', '0', '0', 0}; /* Initialize Default data for OLESTREAM */ pOleStreamData[0].dwOleID = OLESTREAM_ID; @@ -7228,7 +7235,7 @@ void OLECONVERT_GetOle20PresData(LPSTORAGE pStorage, OLECONVERT_OLESTREAM_DATA * { LARGE_INTEGER iSeekPos; METAFILEPICT16 MetaFilePict; - char strMetafilePictName[] = "METAFILEPICT"; + static const char strMetafilePictName[] = "METAFILEPICT"; /* Set the TypeID for a Metafile */ pOleStreamData[1].dwTypeID = 5; @@ -7384,7 +7391,7 @@ HRESULT WINAPI OleConvertIStorageToOLESTREAM ( HRESULT hRes = S_OK; IStream *pStream; OLECONVERT_OLESTREAM_DATA pOleStreamData[2]; - WCHAR wstrStreamName[] = {1, 'O', 'l', 'e', '1', '0', 'N', 'a', 't', 'i', 'v', 'e', 0}; + static const WCHAR wstrStreamName[] = {1, 'O', 'l', 'e', '1', '0', 'N', 'a', 't', 'i', 'v', 'e', 0}; memset(pOleStreamData, 0, sizeof(pOleStreamData)); diff --git a/reactos/w32api/include/objbase.h b/reactos/w32api/include/objbase.h index 144d52dae2b..3fd3a4b190a 100644 --- a/reactos/w32api/include/objbase.h +++ b/reactos/w32api/include/objbase.h @@ -84,6 +84,14 @@ typedef enum tagSTDMSHLFLAGS { SMEXF_HANDLER = 0x02 } STDMSHLFLAGS; +typedef struct tagSTGOPTIONS +{ + USHORT usVersion; + USHORT reserved; + ULONG ulSectorSize; + const WCHAR* pwcsTemplateFile; +} STGOPTIONS; + WINOLEAPI_(DWORD) CoBuildVersion(void); WINOLEAPI CoInitialize(PVOID); WINOLEAPI CoInitializeEx(LPVOID,DWORD); @@ -147,6 +155,7 @@ WINOLEAPI CreateDataAdviseHolder(LPDATAADVISEHOLDER*); WINOLEAPI CreateDataCache(LPUNKNOWN,REFCLSID,REFIID,PVOID*); WINOLEAPI StgCreateDocfile(const OLECHAR*,DWORD,DWORD,IStorage**); WINOLEAPI StgCreateDocfileOnILockBytes(ILockBytes*,DWORD,DWORD,IStorage**); +WINOLEAPI StgCreateStorageEx(const WCHAR*,DWORD,DWORD,DWORD,STGOPTIONS*,void*,REFIID,void**); WINOLEAPI StgOpenStorage(const OLECHAR*,IStorage*,DWORD,SNB,DWORD,IStorage**); WINOLEAPI StgOpenStorageOnILockBytes(ILockBytes*,IStorage*,DWORD,SNB,DWORD,IStorage**); WINOLEAPI StgIsStorageFile(const OLECHAR*); From 1b91a499fe3aa0a2618de53bfc027d92ca45dc34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sat, 8 May 2004 13:41:00 +0000 Subject: [PATCH 1062/1463] Ulrich Czekalla - Delegates messages directly to the edit control window proc instead of containing an edit control. Fixes problems with subclassing the richedit control. Francois Gouget - Make Unicode const strings static so they are not copied to the stack each time we enter the function. svn path=/trunk/; revision=9329 --- reactos/lib/richedit/richedit.c | 234 ++++++++++++-------------- reactos/lib/richedit/winehq2ros.patch | 27 --- 2 files changed, 112 insertions(+), 149 deletions(-) diff --git a/reactos/lib/richedit/richedit.c b/reactos/lib/richedit/richedit.c index d35d5e9c982..c4f85a5dc92 100644 --- a/reactos/lib/richedit/richedit.c +++ b/reactos/lib/richedit/richedit.c @@ -45,6 +45,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(richedit); HANDLE RICHED32_hHeap = NULL; /* LPSTR RICHED32_aSubclass = NULL; */ +static WNDPROC lpfnEditWndProc = NULL; +static INT RTFInfoOffset = 0; #define TRACE_EDIT_MSG32(str) \ TRACE(\ @@ -53,6 +55,7 @@ HANDLE RICHED32_hHeap = NULL; hwnd, (UINT)wParam, (UINT)lParam) LPVOID* WINAPI CreateIRichEditOle(); +VOID RICHEDIT_InitEditControlInfo(void); /*********************************************************************** * DllMain [Internal] Initializes the internal 'RICHED32.DLL'. @@ -76,6 +79,8 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) DisableThreadLibraryCalls(hinstDLL); /* create private heap */ RICHED32_hHeap = HeapCreate (0, 0x10000, 0); + /* Retrieve edit control class info */ + RICHEDIT_InitEditControlInfo(); /* register the Rich Edit class */ RICHED32_Register (); break; @@ -94,12 +99,8 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) INT RICHEDIT_GetTextRange(HWND hwnd,TEXTRANGEA *tr); INT RICHEDIT_GetSelText(HWND hwnd,LPSTR lpstrBuffer); - -const WCHAR RichEditInfoStr[] = { '_','R','T','F','_','I','n','f','o', 0 }; - typedef struct _RTFControl_info { - HWND hwndEdit; HWND hwndParent; char* rtfBuffer; RTF_Info *parser; @@ -121,7 +122,8 @@ static LRESULT WINAPI RICHED32_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, int rtfBufferSize; CHARRANGE *cr; - info = GetPropW( hwnd, RichEditInfoStr ); + info = (RTFControl_Info *) GetWindowLongW( hwnd, RTFInfoOffset ); + TRACE("uMsg: 0x%x hwnd: %p\n",uMsg,hwnd); switch (uMsg) @@ -129,8 +131,7 @@ static LRESULT WINAPI RICHED32_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, case WM_CREATE: TRACE_EDIT_MSG32("WM_CREATE Passed to default"); - DefWindowProcA( hwnd,uMsg,wParam,lParam); - return 0 ; + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_NCCREATE : TRACE_EDIT_MSG32("WM_NCCREATE"); @@ -139,7 +140,7 @@ static LRESULT WINAPI RICHED32_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, sizeof (RTFControl_Info)); info->parser = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof (RTF_Info)); - SetPropW(hwnd, RichEditInfoStr, (HANDLE)info); + SetWindowLongW( hwnd, RTFInfoOffset, (LONG)info ); /* remove SCROLLBARS from the current window style */ info->hwndParent = ((LPCREATESTRUCTA) lParam)->hwndParent; @@ -151,27 +152,15 @@ static LRESULT WINAPI RICHED32_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, newstyle &= ~ES_AUTOVSCROLL; SetWindowLongA(hwnd,GWL_STYLE, newstyle); - TRACE("previous hwndEdit: %p\n",info->hwndEdit); - info->hwndEdit = CreateWindowA ("edit", ((LPCREATESTRUCTA) lParam)->lpszName, - style, 0, 0, 0, 0, - hwnd, (HMENU) ID_EDIT, - ((LPCREATESTRUCTA) lParam)->hInstance, NULL) ; - TRACE("hwndEdit: %p hwnd: %p\n",info->hwndEdit,hwnd); - - if (info->hwndEdit) - return TRUE ; - else - return FALSE ; + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_SETFOCUS : TRACE_EDIT_MSG32("WM_SETFOCUS"); - SetFocus (info->hwndEdit) ; - return 0 ; + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_SIZE : TRACE_EDIT_MSG32("WM_SIZE"); - MoveWindow (info->hwndEdit, 0, 0, LOWORD (lParam), HIWORD (lParam), TRUE) ; - return 0 ; + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_COMMAND : TRACE_EDIT_MSG32("WM_COMMAND"); @@ -210,7 +199,7 @@ static LRESULT WINAPI RICHED32_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, if(info->rtfBuffer) { RTFToBuffer(info->parser,info->rtfBuffer, rtfBufferSize); - SetWindowTextA(info->hwndEdit,info->rtfBuffer); + CallWindowProcA(lpfnEditWndProc, hwnd, WM_SETTEXT, 0, (LPARAM)info->rtfBuffer); HeapFree(RICHED32_hHeap, 0,info->rtfBuffer); } else @@ -239,7 +228,7 @@ static LRESULT WINAPI RICHED32_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, case EM_EXGETSEL: TRACE_EDIT_MSG32("EM_EXGETSEL -> EM_GETSEL"); cr = (VOID *) lParam; - if (info->hwndEdit) SendMessageA( info->hwndEdit, EM_GETSEL, (INT)&cr->cpMin, (INT)&cr->cpMax); + CallWindowProcA(lpfnEditWndProc, hwnd, EM_GETSEL, (INT)&cr->cpMin, (INT)&cr->cpMax); TRACE("cpMin: 0x%x cpMax: 0x%x\n",(INT)cr->cpMin,(INT)cr->cpMax); return 0; @@ -251,19 +240,17 @@ static LRESULT WINAPI RICHED32_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, { limit = 0xFFFFFFFF; } - return SendMessageA(info->hwndEdit,EM_SETLIMITTEXT,limit,0); + return CallWindowProcA(lpfnEditWndProc, hwnd, EM_SETLIMITTEXT, limit, 0); } case EM_EXLINEFROMCHAR: TRACE_EDIT_MSG32("EM_EXLINEFROMCHAR -> LINEFROMCHAR"); - if (info->hwndEdit) return SendMessageA( info->hwndEdit, EM_LINEFROMCHAR, lParam, wParam); - return 0; + return CallWindowProcA(lpfnEditWndProc, hwnd, EM_LINEFROMCHAR, lParam, wParam); case EM_EXSETSEL: TRACE_EDIT_MSG32("EM_EXSETSEL -> EM_SETSEL"); cr = (VOID *) lParam; - if (info->hwndEdit) SendMessageA( info->hwndEdit, EM_SETSEL, cr->cpMin, cr->cpMax); - return 0; + return CallWindowProcA(lpfnEditWndProc, hwnd, EM_SETSEL, cr->cpMin, cr->cpMax); case EM_FINDTEXT: TRACE_EDIT_MSG32("EM_FINDTEXT Ignored"); @@ -351,7 +338,7 @@ static LRESULT WINAPI RICHED32_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, case EM_GETSELTEXT: TRACE_EDIT_MSG32("EM_GETSELTEXT"); - return RICHEDIT_GetSelText(info->hwndEdit,(void *)lParam); + return RICHEDIT_GetSelText(hwnd,(void *)lParam); case EM_GETTEXTEX: TRACE_EDIT_MSG32("EM_GETTEXTEX Ignored"); @@ -367,7 +354,7 @@ static LRESULT WINAPI RICHED32_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, case EM_GETTEXTRANGE: TRACE_EDIT_MSG32("EM_GETTEXTRANGE"); - return RICHEDIT_GetTextRange(info->hwndEdit,(TEXTRANGEA *)lParam); + return RICHEDIT_GetTextRange(hwnd,(TEXTRANGEA *)lParam); case EM_GETTYPOGRAPHYOPTIONS: TRACE_EDIT_MSG32("EM_GETTYPOGRAPHYOPTIONS Ignored"); @@ -520,238 +507,222 @@ static LRESULT WINAPI RICHED32_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, /* Messages dispatched to the edit control */ case EM_CANUNDO: TRACE_EDIT_MSG32("EM_CANUNDO Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_CHARFROMPOS: TRACE_EDIT_MSG32("EM_CHARFROMPOS Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_EMPTYUNDOBUFFER: TRACE_EDIT_MSG32("EM_EMPTYUNDOBUFFER Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_FMTLINES: TRACE_EDIT_MSG32("EM_FMTLINES Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_GETFIRSTVISIBLELINE: TRACE_EDIT_MSG32("EM_GETFIRSTVISIBLELINE Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_GETHANDLE: TRACE_EDIT_MSG32("EM_GETHANDLE Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); /* case EM_GETIMESTATUS:*/ case EM_GETLIMITTEXT: TRACE_EDIT_MSG32("EM_GETLIMITTEXT Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_GETLINE: TRACE_EDIT_MSG32("EM_GETLINE Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_GETLINECOUNT: TRACE_EDIT_MSG32("EM_GETLINECOUNT Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_GETMARGINS: TRACE_EDIT_MSG32("EM_GETMARGINS Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_GETMODIFY: TRACE_EDIT_MSG32("EM_GETMODIFY Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_GETPASSWORDCHAR: TRACE_EDIT_MSG32("EM_GETPASSWORDCHAR Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_GETRECT: TRACE_EDIT_MSG32("EM_GETRECT Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_GETSEL: TRACE_EDIT_MSG32("EM_GETSEL Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_GETTHUMB: TRACE_EDIT_MSG32("EM_GETTHUMB Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_GETWORDBREAKPROC: TRACE_EDIT_MSG32("EM_GETWORDBREAKPROC Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_LINEFROMCHAR: TRACE_EDIT_MSG32("EM_LINEFROMCHAR Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_LINEINDEX: TRACE_EDIT_MSG32("EM_LINEINDEX Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_LINELENGTH: TRACE_EDIT_MSG32("EM_LINELENGTH Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_LINESCROLL: TRACE_EDIT_MSG32("EM_LINESCROLL Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_POSFROMCHAR: TRACE_EDIT_MSG32("EM_POSFROMCHAR Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_REPLACESEL: TRACE_EDIT_MSG32("case EM_REPLACESEL Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_SCROLL: TRACE_EDIT_MSG32("case EM_SCROLL Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_SCROLLCARET: TRACE_EDIT_MSG32("EM_SCROLLCARET Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_SETHANDLE: TRACE_EDIT_MSG32("EM_SETHANDLE Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); /* case EM_SETIMESTATUS:*/ case EM_SETLIMITTEXT: TRACE_EDIT_MSG32("EM_SETLIMITTEXT Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_SETMARGINS: TRACE_EDIT_MSG32("case EM_SETMARGINS Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_SETMODIFY: TRACE_EDIT_MSG32("EM_SETMODIFY Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_SETPASSWORDCHAR: TRACE_EDIT_MSG32("EM_SETPASSWORDCHAR Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_SETREADONLY: TRACE_EDIT_MSG32("EM_SETREADONLY Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_SETRECT: TRACE_EDIT_MSG32("EM_SETRECT Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_SETRECTNP: TRACE_EDIT_MSG32("EM_SETRECTNP Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_SETSEL: TRACE_EDIT_MSG32("EM_SETSEL Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_SETTABSTOPS: TRACE_EDIT_MSG32("EM_SETTABSTOPS Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_SETWORDBREAKPROC: TRACE_EDIT_MSG32("EM_SETWORDBREAKPROC Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case EM_UNDO: TRACE_EDIT_MSG32("EM_UNDO Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_STYLECHANGING: TRACE_EDIT_MSG32("WM_STYLECHANGING Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_STYLECHANGED: TRACE_EDIT_MSG32("WM_STYLECHANGED Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_GETTEXT: TRACE_EDIT_MSG32("WM_GETTEXT Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_GETTEXTLENGTH: TRACE_EDIT_MSG32("WM_GETTEXTLENGTH Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_SETTEXT: TRACE_EDIT_MSG32("WM_SETTEXT Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_CUT: TRACE_EDIT_MSG32("WM_CUT Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_COPY: TRACE_EDIT_MSG32("WM_COPY Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_PASTE: TRACE_EDIT_MSG32("WM_PASTE Passed to edit control"); - return SendMessageA( info->hwndEdit, uMsg, wParam, lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); /* Messages passed to default handler. */ case WM_NCCALCSIZE: - /* A fundamental problem with embedding an edit control within another - window to emulate the richedit control, is that normally, the - WM_NCCALCSIZE message window would return the client area of the - edit control. - - While we could send a message to the edit control here to get that size - and return that value, this causes problems with the WM_SIZE message. - That is because the WM_SIZE message uses the returned value of - WM_NCCALCSIZE (via X11DRV_SetWindowSize) to determine the size to make - the edit control. If we return the size of the edit control client area - here, the result is the symptom of the edit control being inset on the - right and bottom by the width of any existing scrollbars. - - The easy fix is to have WM_NCCALCSIZE return the true size of this - enclosing window, which is what we have done here. The more difficult - fix is to create a custom Richedit MoveWindow procedure for use in the - WM_SIZE message above. Since it is very unlikely that an app would call - and use the WM_NCCALCSIZE message, we stick with the easy fix for now. - */ TRACE_EDIT_MSG32("WM_NCCALCSIZE Passed to default"); - return DefWindowProcA( hwnd,uMsg,wParam,lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_NCPAINT: TRACE_EDIT_MSG32("WM_NCPAINT Passed to default"); - return DefWindowProcA( hwnd,uMsg,wParam,lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_PAINT: TRACE_EDIT_MSG32("WM_PAINT Passed to default"); - return DefWindowProcA( hwnd,uMsg,wParam,lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_ERASEBKGND: TRACE_EDIT_MSG32("WM_ERASEBKGND Passed to default"); - return DefWindowProcA( hwnd,uMsg,wParam,lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_KILLFOCUS: TRACE_EDIT_MSG32("WM_KILLFOCUS Passed to default"); - return DefWindowProcA( hwnd,uMsg,wParam,lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_DESTROY: TRACE_EDIT_MSG32("WM_DESTROY Passed to default"); - HeapFree( GetProcessHeap(), 0, info->parser ); - HeapFree( GetProcessHeap(), 0, info ); - return DefWindowProcA( hwnd,uMsg,wParam,lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_CHILDACTIVATE: TRACE_EDIT_MSG32("WM_CHILDACTIVATE Passed to default"); - return DefWindowProcA( hwnd,uMsg,wParam,lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_WINDOWPOSCHANGING: TRACE_EDIT_MSG32("WM_WINDOWPOSCHANGING Passed to default"); - return DefWindowProcA( hwnd,uMsg,wParam,lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_WINDOWPOSCHANGED: TRACE_EDIT_MSG32("WM_WINDOWPOSCHANGED Passed to default"); - return DefWindowProcA( hwnd,uMsg,wParam,lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); /* case WM_INITIALUPDATE: TRACE_EDIT_MSG32("WM_INITIALUPDATE Passed to default"); return DefWindowProcA( hwnd,uMsg,wParam,lParam); */ case WM_CTLCOLOREDIT: TRACE_EDIT_MSG32("WM_CTLCOLOREDIT Passed to default"); - return DefWindowProcA( hwnd,uMsg,wParam,lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_SETCURSOR: TRACE_EDIT_MSG32("WM_SETCURSOR Passed to default"); - return DefWindowProcA( hwnd,uMsg,wParam,lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_MOVE: TRACE_EDIT_MSG32("WM_MOVE Passed to default"); - return DefWindowProcA( hwnd,uMsg,wParam,lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_SHOWWINDOW: TRACE_EDIT_MSG32("WM_SHOWWINDOW Passed to default"); - return DefWindowProcA( hwnd,uMsg,wParam,lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_PARENTNOTIFY: TRACE_EDIT_MSG32("WM_PARENTNOTIFY Passed to default"); - return DefWindowProcA( hwnd,uMsg,wParam,lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_SETREDRAW: TRACE_EDIT_MSG32("WM_SETREDRAW Passed to default"); - return DefWindowProcA( hwnd,uMsg,wParam,lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_NCDESTROY: + { TRACE_EDIT_MSG32("WM_NCDESTROY Passed to default"); - return DefWindowProcA( hwnd,uMsg,wParam,lParam); + HeapFree( GetProcessHeap(), 0, info->parser ); + HeapFree( GetProcessHeap(), 0, info ); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); + } + case WM_NCHITTEST: TRACE_EDIT_MSG32("WM_NCHITTEST Passed to default"); - return DefWindowProcA( hwnd,uMsg,wParam,lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_CTLCOLORSTATIC: TRACE_EDIT_MSG32("WM_CTLCOLORSTATIC Passed to default"); - return DefWindowProcA( hwnd,uMsg,wParam,lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_NCMOUSEMOVE: TRACE_EDIT_MSG32("WM_NCMOUSEMOVE Passed to default"); - return DefWindowProcA( hwnd,uMsg,wParam,lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_CLEAR: TRACE_EDIT_MSG32("WM_CLEAR Passed to default"); - return DefWindowProcA( hwnd,uMsg,wParam,lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); /* * used by IE in the EULA box */ case WM_ALTTABACTIVE: TRACE_EDIT_MSG32("WM_ALTTABACTIVE"); - return DefWindowProcA( hwnd,uMsg,wParam,lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_GETDLGCODE: TRACE_EDIT_MSG32("WM_GETDLGCODE"); - return DefWindowProcA( hwnd,uMsg,wParam,lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); case WM_SETFONT: TRACE_EDIT_MSG32("WM_SETFONT"); - return DefWindowProcA( hwnd,uMsg,wParam,lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); } @@ -760,7 +731,7 @@ static LRESULT WINAPI RICHED32_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, uMsg, hwnd, (UINT)wParam, (UINT)lParam); } - return DefWindowProcA( hwnd,uMsg,wParam,lParam); + return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); } /*********************************************************************** @@ -817,7 +788,7 @@ VOID RICHED32_Register(void) wndClass.style = CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS; wndClass.lpfnWndProc = (WNDPROC)RICHED32_WindowProc; wndClass.cbClsExtra = 0; - wndClass.cbWndExtra = 0; /*(sizeof(RICHED32_INFO *);*/ + wndClass.cbWndExtra = RTFInfoOffset + sizeof(RTFControl_Info*); wndClass.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wndClass.lpszClassName = RICHEDIT_CLASS10A; /* WC_RICHED32A; */ @@ -842,6 +813,25 @@ VOID RICHED32_Unregister(void) UnregisterClassA(RICHEDIT_CLASS10A, NULL); } + +/*** + * DESCRIPTION: + * Initialize edit control class info + */ +VOID RICHEDIT_InitEditControlInfo(void) +{ + WNDCLASSA wcEdit; + + if (GetClassInfoA(0, "edit", &wcEdit)) + { + lpfnEditWndProc = wcEdit.lpfnWndProc; + RTFInfoOffset = wcEdit.cbWndExtra; + } + else + ERR("Failed to retrieve edit control class info\n"); +} + + INT RICHEDIT_GetTextRange(HWND hwnd,TEXTRANGEA *tr) { UINT alloc_size, text_size, range_size; diff --git a/reactos/lib/richedit/winehq2ros.patch b/reactos/lib/richedit/winehq2ros.patch index 4d5c3f3dc7e..e69de29bb2d 100644 --- a/reactos/lib/richedit/winehq2ros.patch +++ b/reactos/lib/richedit/winehq2ros.patch @@ -1,27 +0,0 @@ -Index: reader.c -=================================================================== -RCS file: /home/wine/wine/dlls/richedit/reader.c,v -retrieving revision 1.13 -diff -u -r1.13 reader.c ---- reader.c 30 Jan 2004 22:56:33 -0000 1.13 -+++ reader.c 17 Feb 2004 23:16:04 -0000 -@@ -126,11 +126,17 @@ - { - char buff[10]; - long pcb; -- info->editstream.pfnCallback(info->editstream.dwCookie, buff, 1, &pcb); -+ info->editstream.pfnCallback(info->editstream.dwCookie, buff, sizeof(buff), &pcb); - if(pcb == 0) - return EOF; - else -- CHARLIST_Enqueue(&info->inputCharList, buff[0]); -+ { -+ int i; -+ for (i = 0; i < pcb; i++) -+ { -+ CHARLIST_Enqueue(&info->inputCharList, buff[i]); -+ } -+ } - } - myChar = CHARLIST_Dequeue(&info->inputCharList); - return (int) myChar; From f19704b04fc7004c8b827941933ac44c019802d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sat, 8 May 2004 13:49:05 +0000 Subject: [PATCH 1063/1463] Sync to Wine-20040505: Francois Gouget - Make Unicode strings 'static const'. - Assorted spelling fixes. - Make our ascii strings static const. - Remove a couple string variables that were used only once and use the string literal directly. - Use named constants instead of magic numbers. - Remove wszRegSeparator from devenum_private.h since it's neither exported by createdevenum.c nor used by anyone else. Kevin Koltzau - Allow UrlCombine to calculate size of required buffer. svn path=/trunk/; revision=9330 --- reactos/lib/shlwapi/ordinal.c | 10 ++--- reactos/lib/shlwapi/path.c | 4 +- reactos/lib/shlwapi/reg.c | 4 +- reactos/lib/shlwapi/string.c | 2 +- reactos/lib/shlwapi/thread.c | 2 +- reactos/lib/shlwapi/url.c | 66 ++++++---------------------- reactos/lib/shlwapi/winehq2ros.patch | 34 +++++++------- 7 files changed, 41 insertions(+), 81 deletions(-) diff --git a/reactos/lib/shlwapi/ordinal.c b/reactos/lib/shlwapi/ordinal.c index 4c0766e6260..de308a722fb 100644 --- a/reactos/lib/shlwapi/ordinal.c +++ b/reactos/lib/shlwapi/ordinal.c @@ -2437,7 +2437,7 @@ typedef struct tagPOLICYDATA #define SHELL_NO_POLICY 0xffffffff /* default shell policy registry key */ -static WCHAR strRegistryPolicyW[] = {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o', +static const WCHAR strRegistryPolicyW[] = {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o', 's','o','f','t','\\','W','i','n','d','o','w','s','\\', 'C','u','r','r','e','n','t','V','e','r','s','i','o','n', '\\','P','o','l','i','c','i','e','s',0}; @@ -2461,7 +2461,7 @@ DWORD WINAPI SHGetRestriction(LPCWSTR lpSubKey, LPCWSTR lpSubName, LPCWSTR lpVal HKEY hKey; if (!lpSubKey) - lpSubKey = (LPCWSTR)strRegistryPolicyW; + lpSubKey = strRegistryPolicyW; retval = RegOpenKeyW(HKEY_LOCAL_MACHINE, lpSubKey, &hKey); if (retval != ERROR_SUCCESS) @@ -2641,7 +2641,7 @@ DWORD WINAPI WhichPlatform() GET_FUNC(pDllGetVersion, shell32, "DllGetVersion", 1); dwState = pDllGetVersion ? 2 : 1; - /* Set or delete the key accordinly */ + /* Set or delete the key accordingly */ dwRet = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Internet Explorer", 0, KEY_ALL_ACCESS, &hKey); @@ -3887,7 +3887,7 @@ HRESULT WINAPI SHCoCreateInstanceAC(REFCLSID rclsid, LPUNKNOWN pUnkOuter, */ BOOL WINAPI SHSkipJunction(IBindCtx *pbc, const CLSID *pclsid) { - static WCHAR szSkipBinding[] = { 'S','k','i','p',' ', + static const WCHAR szSkipBinding[] = { 'S','k','i','p',' ', 'B','i','n','d','i','n','g',' ','C','L','S','I','D','\0' }; BOOL bRet = FALSE; @@ -3895,7 +3895,7 @@ BOOL WINAPI SHSkipJunction(IBindCtx *pbc, const CLSID *pclsid) { IUnknown* lpUnk; - if (SUCCEEDED(IBindCtx_GetObjectParam(pbc, szSkipBinding, &lpUnk))) + if (SUCCEEDED(IBindCtx_GetObjectParam(pbc, (LPOLESTR)szSkipBinding, &lpUnk))) { CLSID clsid; diff --git a/reactos/lib/shlwapi/path.c b/reactos/lib/shlwapi/path.c index 4a5bdfbcb37..8e8a6cb1d47 100644 --- a/reactos/lib/shlwapi/path.c +++ b/reactos/lib/shlwapi/path.c @@ -1141,8 +1141,8 @@ BOOL WINAPI PathFileExistsDefExtA(LPSTR lpszPath,DWORD dwWhich) */ static BOOL WINAPI SHLWAPI_PathFindInOtherDirs(LPWSTR lpszFile, DWORD dwWhich) { - static WCHAR szSystem[] = { 'S','y','s','t','e','m','\0'}; - static WCHAR szPath[] = { 'P','A','T','H','\0'}; + static const WCHAR szSystem[] = { 'S','y','s','t','e','m','\0'}; + static const WCHAR szPath[] = { 'P','A','T','H','\0'}; DWORD dwLenPATH; LPCWSTR lpszCurr; WCHAR *lpszPATH; diff --git a/reactos/lib/shlwapi/reg.c b/reactos/lib/shlwapi/reg.c index f18409bba74..440991f90ec 100644 --- a/reactos/lib/shlwapi/reg.c +++ b/reactos/lib/shlwapi/reg.c @@ -1047,7 +1047,7 @@ DWORD WINAPI SHSetValueA(HKEY hKey, LPCSTR lpszSubKey, LPCSTR lpszValue, { DWORD dwRet = ERROR_SUCCESS, dwDummy; HKEY hSubKey; - char szEmpty[] = ""; + static const char szEmpty[] = { '\0' }; TRACE("(hkey=%p,%s,%s,%ld,%p,%ld)\n", hKey, debugstr_a(lpszSubKey), debugstr_a(lpszValue), dwType, pvData, cbData); @@ -1076,7 +1076,7 @@ DWORD WINAPI SHSetValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue, { DWORD dwRet = ERROR_SUCCESS, dwDummy; HKEY hSubKey; - WCHAR szEmpty[] = { '\0' }; + static const WCHAR szEmpty[] = { '\0' }; TRACE("(hkey=%p,%s,%s,%ld,%p,%ld)\n", hKey, debugstr_w(lpszSubKey), debugstr_w(lpszValue), dwType, pvData, cbData); diff --git a/reactos/lib/shlwapi/string.c b/reactos/lib/shlwapi/string.c index b7cbda009dc..4cd4e3941e1 100644 --- a/reactos/lib/shlwapi/string.c +++ b/reactos/lib/shlwapi/string.c @@ -2530,7 +2530,7 @@ DWORD WINAPI SHAnsiToUnicode(LPCSTR lpSrcStr, LPWSTR lpDstStr, int iLen) INT WINAPI SHUnicodeToAnsiCP(UINT CodePage, LPCWSTR lpSrcStr, LPSTR lpDstStr, LPINT lpiLen) { - WCHAR emptyW[] = { '\0' }; + static const WCHAR emptyW[] = { '\0' }; int len , reqLen; LPSTR mem; diff --git a/reactos/lib/shlwapi/thread.c b/reactos/lib/shlwapi/thread.c index daf3f22168a..95c5448d6a5 100644 --- a/reactos/lib/shlwapi/thread.c +++ b/reactos/lib/shlwapi/thread.c @@ -310,7 +310,7 @@ BOOL WINAPI SHCreateThread(LPTHREAD_START_ROUTINE pfnThreadProc, VOID *pData, if(hThread) { /* Wait for the thread to signal us to continue */ - WaitForSingleObject(ti.hEvent, -1); + WaitForSingleObject(ti.hEvent, INFINITE); CloseHandle(hThread); bCalled = TRUE; } diff --git a/reactos/lib/shlwapi/url.c b/reactos/lib/shlwapi/url.c index 4e4f7664dc4..e9e3941ac4c 100644 --- a/reactos/lib/shlwapi/url.c +++ b/reactos/lib/shlwapi/url.c @@ -643,7 +643,7 @@ HRESULT WINAPI UrlCombineA(LPCSTR pszBase, LPCSTR pszRelative, debugstr_a(pszBase),debugstr_a(pszRelative), pcchCombined?*pcchCombined:0,dwFlags); - if(!pszBase || !pszRelative || !pszCombined || !pcchCombined) + if(!pszBase || !pszRelative || !pcchCombined) return E_INVALIDARG; base = (LPWSTR) HeapAlloc(GetProcessHeap(), 0, @@ -653,10 +653,11 @@ HRESULT WINAPI UrlCombineA(LPCSTR pszBase, LPCSTR pszRelative, MultiByteToWideChar(0, 0, pszBase, -1, base, INTERNET_MAX_URL_LENGTH); MultiByteToWideChar(0, 0, pszRelative, -1, relative, INTERNET_MAX_URL_LENGTH); - len = INTERNET_MAX_URL_LENGTH; + len = *pcchCombined; - ret = UrlCombineW(base, relative, combined, &len, dwFlags); + ret = UrlCombineW(base, relative, pszCombined?combined:NULL, &len, dwFlags); if (ret != S_OK) { + *pcchCombined = len; HeapFree(GetProcessHeap(), 0, base); return ret; } @@ -667,7 +668,7 @@ HRESULT WINAPI UrlCombineA(LPCSTR pszBase, LPCSTR pszRelative, HeapFree(GetProcessHeap(), 0, base); return E_POINTER; } - WideCharToMultiByte(0, 0, combined, len+1, pszCombined, *pcchCombined, + WideCharToMultiByte(0, 0, combined, len+1, pszCombined, (*pcchCombined)+1, 0, 0); *pcchCombined = len2; HeapFree(GetProcessHeap(), 0, base); @@ -687,15 +688,15 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative, DWORD myflags, sizeloc = 0; DWORD len, res1, res2, process_case = 0; LPWSTR work, preliminary, mbase, mrelative; - WCHAR myfilestr[] = {'f','i','l','e',':','/','/','/','\0'}; - WCHAR single_slash[] = {'/','\0'}; + static const WCHAR myfilestr[] = {'f','i','l','e',':','/','/','/','\0'}; + static const WCHAR single_slash[] = {'/','\0'}; HRESULT ret; TRACE("(base %s, Relative %s, Combine size %ld, flags %08lx)\n", debugstr_w(pszBase),debugstr_w(pszRelative), pcchCombined?*pcchCombined:0,dwFlags); - if(!pszBase || !pszRelative || !pszCombined || !pcchCombined) + if(!pszBase || !pszRelative || !pcchCombined) return E_INVALIDARG; base.size = 24; @@ -829,12 +830,6 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative, * Return pszRelative appended to what ever is in pszCombined, * (which may the string "file:///" */ - len = strlenW(mrelative) + strlenW(preliminary); - if (len+1 > *pcchCombined) { - *pcchCombined = len; - ret = E_POINTER; - break; - } strcatW(preliminary, mrelative); break; @@ -842,12 +837,6 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative, * Same as case 1, but if URL_PLUGGABLE_PROTOCOL was specified * and pszRelative starts with "//", then append a "/" */ - len = strlenW(mrelative) + 1; - if (len+1 > *pcchCombined) { - *pcchCombined = len; - ret = E_POINTER; - break; - } strcpyW(preliminary, mrelative); if (!(dwFlags & URL_PLUGGABLE_PROTOCOL) && URL_JustLocation(relative.ap2)) @@ -855,15 +844,9 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative, break; case 3: /* - * Return the pszBase scheme with pszRelative. Basicly + * Return the pszBase scheme with pszRelative. Basically * keeps the scheme and replaces the domain and following. */ - len = base.sizep1 + 1 + relative.sizep2 + 1; - if (len+1 > *pcchCombined) { - *pcchCombined = len; - ret = E_POINTER; - break; - } strncpyW(preliminary, base.ap1, base.sizep1 + 1); work = preliminary + base.sizep1 + 1; strcpyW(work, relative.ap2); @@ -877,12 +860,6 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative, * after the location is pszRelative. (Replace document * from root on.) */ - len = base.sizep1 + 1 + sizeloc + relative.sizep2 + 1; - if (len+1 > *pcchCombined) { - *pcchCombined = len; - ret = E_POINTER; - break; - } strncpyW(preliminary, base.ap1, base.sizep1+1+sizeloc); work = preliminary + base.sizep1 + 1 + sizeloc; if (dwFlags & URL_PLUGGABLE_PROTOCOL) @@ -894,12 +871,6 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative, * Return the pszBase without its document (if any) and * append pszRelative after its scheme. */ - len = base.sizep1 + 1 + base.sizep2 + relative.sizep2; - if (len+1 > *pcchCombined) { - *pcchCombined = len; - ret = E_POINTER; - break; - } strncpyW(preliminary, base.ap1, base.sizep1+1+base.sizep2); work = preliminary + base.sizep1+1+base.sizep2 - 1; if (*work++ != L'/') @@ -913,21 +884,10 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative, } if (ret == S_OK) { - /* - * Now that the combining is done, process the escape options if - * necessary, otherwise just copy the string. - */ - myflags = dwFlags & (URL_ESCAPE_PERCENT | - URL_ESCAPE_SPACES_ONLY | - URL_DONT_ESCAPE_EXTRA_INFO | - URL_ESCAPE_SEGMENT_ONLY); - if (myflags) - ret = UrlEscapeW(preliminary, pszCombined, - pcchCombined, myflags); - else { - len = (strlenW(preliminary) + 1) * sizeof(WCHAR); - memcpy(pszCombined, preliminary, len); - *pcchCombined = strlenW(preliminary); + /* Reuse mrelative as temp storage as its already allocated and not needed anymore */ + ret = UrlCanonicalizeW(preliminary, mrelative, pcchCombined, dwFlags); + if(SUCCEEDED(ret) && pszCombined) { + lstrcpyW(pszCombined, mrelative); } TRACE("return-%ld len=%ld, %s\n", process_case, *pcchCombined, debugstr_w(pszCombined)); diff --git a/reactos/lib/shlwapi/winehq2ros.patch b/reactos/lib/shlwapi/winehq2ros.patch index 53deb08748d..080527f6719 100644 --- a/reactos/lib/shlwapi/winehq2ros.patch +++ b/reactos/lib/shlwapi/winehq2ros.patch @@ -1,10 +1,10 @@ Index: path.c =================================================================== RCS file: /home/wine/wine/dlls/shlwapi/path.c,v -retrieving revision 1.41 -diff -u -r1.41 path.c ---- path.c 23 Jan 2004 22:45:25 -0000 1.41 -+++ path.c 11 Mar 2004 22:38:00 -0000 +retrieving revision 1.42 +diff -u -r1.42 path.c +--- path.c 20 Apr 2004 00:34:52 -0000 1.42 ++++ path.c 8 May 2004 13:58:39 -0000 @@ -32,6 +32,7 @@ #include "wingdi.h" #include "winuser.h" @@ -16,10 +16,10 @@ diff -u -r1.41 path.c Index: shlwapi.spec =================================================================== RCS file: /home/wine/wine/dlls/shlwapi/shlwapi.spec,v -retrieving revision 1.88 -diff -u -r1.88 shlwapi.spec ---- shlwapi.spec 28 Feb 2004 01:46:56 -0000 1.88 -+++ shlwapi.spec 11 Mar 2004 22:38:00 -0000 +retrieving revision 1.90 +diff -u -r1.90 shlwapi.spec +--- shlwapi.spec 27 Mar 2004 01:38:26 -0000 1.90 ++++ shlwapi.spec 8 May 2004 13:58:39 -0000 @@ -368,9 +368,9 @@ 368 stdcall @(wstr wstr ptr long wstr) kernel32.GetPrivateProfileStructW 369 stdcall @(wstr wstr ptr ptr long long ptr wstr ptr ptr) kernel32.CreateProcessW @@ -45,10 +45,10 @@ diff -u -r1.88 shlwapi.spec Index: string.c =================================================================== RCS file: /home/wine/wine/dlls/shlwapi/string.c,v -retrieving revision 1.44 -diff -u -r1.44 string.c ---- string.c 20 Feb 2004 05:16:37 -0000 1.44 -+++ string.c 11 Mar 2004 22:38:01 -0000 +retrieving revision 1.46 +diff -u -r1.46 string.c +--- string.c 20 Apr 2004 01:12:17 -0000 1.46 ++++ string.c 8 May 2004 13:58:40 -0000 @@ -528,7 +528,7 @@ { TRACE("(%s,%s)\n", debugstr_w(lpszStr), debugstr_w(lpszSearch)); @@ -70,11 +70,11 @@ diff -u -r1.44 string.c Index: url.c =================================================================== RCS file: /home/wine/wine/dlls/shlwapi/url.c,v -retrieving revision 1.29 -diff -u -r1.29 url.c ---- url.c 3 Mar 2004 20:11:46 -0000 1.29 -+++ url.c 11 Mar 2004 22:38:02 -0000 -@@ -1423,8 +1423,8 @@ +retrieving revision 1.33 +diff -u -r1.33 url.c +--- url.c 27 Apr 2004 23:29:02 -0000 1.33 ++++ url.c 8 May 2004 13:58:41 -0000 +@@ -1386,8 +1386,8 @@ * Success: TRUE. lpDest is filled with the computed hash value. * Failure: FALSE, if any argument is invalid. */ From dd3c643b4ddbaff54a590b0431181df8c274b3a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sat, 8 May 2004 14:07:55 +0000 Subject: [PATCH 1064/1463] Sync to Wine-20040505: Francois Gouget - Taking into account wavemap and midimap there can be up to 8 output drivers. So increase the size of the MMDrvs array accordingly. - Skip already loaded drivers before complaining (asserting) that they don't fit in the MMDrvs array. - Make static Unicode strings const. svn path=/trunk/; revision=9331 --- reactos/lib/winmm/lolvldrv.c | 14 ++++++++------ reactos/lib/winmm/playsound.c | 12 ++++++------ reactos/lib/winmm/winehq2ros.patch | 14 +++++++------- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/reactos/lib/winmm/lolvldrv.c b/reactos/lib/winmm/lolvldrv.c index 979820feaba..07a9cb6b22e 100644 --- a/reactos/lib/winmm/lolvldrv.c +++ b/reactos/lib/winmm/lolvldrv.c @@ -53,7 +53,7 @@ typedef struct tagWINE_LLTYPE { } WINE_LLTYPE; static int MMDrvsHi /* = 0 */; -static WINE_MM_DRIVER MMDrvs[3]; +static WINE_MM_DRIVER MMDrvs[8]; static LPWINE_MLD MM_MLDrvs[40]; #define MAX_MM_MLDRVS (sizeof(MM_MLDrvs) / sizeof(MM_MLDrvs[0])) @@ -612,14 +612,16 @@ static BOOL MMDRV_Install(LPCSTR drvRegName, LPCSTR drvFileName, BOOL bIsMapper) TRACE("('%s', '%s', mapper=%c);\n", drvRegName, drvFileName, bIsMapper ? 'Y' : 'N'); - /* be sure that size of MMDrvs matches the max number of loadable drivers !! - * if not just increase size of MMDrvs */ - assert(MMDrvsHi <= sizeof(MMDrvs)/sizeof(MMDrvs[0])); - for (i = 0; i < MMDrvsHi; i++) { - if (!strcmp(drvRegName, MMDrvs[i].drvname)) return FALSE; + if (!strcmp(drvRegName, MMDrvs[i].drvname)) return FALSE; } + /* Be sure that size of MMDrvs matches the max number of loadable + * drivers !! + * If not just increase size of MMDrvs + */ + assert(MMDrvsHi <= sizeof(MMDrvs)/sizeof(MMDrvs[0])); + memset(lpDrv, 0, sizeof(*lpDrv)); if (!(lpDrv->hDriver = OpenDriverA(drvFileName, 0, 0))) { diff --git a/reactos/lib/winmm/playsound.c b/reactos/lib/winmm/playsound.c index e2e928b8dc8..39f5d4e006e 100644 --- a/reactos/lib/winmm/playsound.c +++ b/reactos/lib/winmm/playsound.c @@ -62,13 +62,13 @@ static HMMIO get_mmioFromProfile(UINT uFlags, LPCWSTR lpszName) HKEY hRegSnd, hRegApp, hScheme, hSnd; DWORD err, type, count; - static WCHAR wszSounds[] = {'S','o','u','n','d','s',0}; - static WCHAR wszDefault[] = {'D','e','f','a','u','l','t',0}; - static WCHAR wszKey[] = {'A','p','p','E','v','e','n','t','s','\\', + static const WCHAR wszSounds[] = {'S','o','u','n','d','s',0}; + static const WCHAR wszDefault[] = {'D','e','f','a','u','l','t',0}; + static const WCHAR wszKey[] = {'A','p','p','E','v','e','n','t','s','\\', 'S','c','h','e','m','e','s','\\', 'A','p','p','s',0}; - static WCHAR wszDotDefault[] = {'.','D','e','f','a','u','l','t',0}; - static WCHAR wszNull[] = {0}; + static const WCHAR wszDotDefault[] = {'.','D','e','f','a','u','l','t',0}; + static const WCHAR wszNull[] = {0}; TRACE("searching in SystemSound list for %s\n", debugstr_w(lpszName)); GetProfileStringW(wszSounds, (LPWSTR)lpszName, wszNull, str, sizeof(str)/sizeof(str[0])); @@ -257,7 +257,7 @@ static DWORD WINAPI proc_PlaySound(LPVOID arg) /* if resource, grab it */ if ((wps->fdwSound & SND_RESOURCE) == SND_RESOURCE) { - static WCHAR wszWave[] = {'W','A','V','E',0}; + static const WCHAR wszWave[] = {'W','A','V','E',0}; HRSRC hRes; HGLOBAL hGlob; diff --git a/reactos/lib/winmm/winehq2ros.patch b/reactos/lib/winmm/winehq2ros.patch index 937c04a2ee7..b957070dde4 100644 --- a/reactos/lib/winmm/winehq2ros.patch +++ b/reactos/lib/winmm/winehq2ros.patch @@ -1,10 +1,10 @@ Index: lolvldrv.c =================================================================== RCS file: /home/wine/wine/dlls/winmm/lolvldrv.c,v -retrieving revision 1.55 -diff -u -r1.55 lolvldrv.c ---- lolvldrv.c 31 Dec 2003 23:49:45 -0000 1.55 -+++ lolvldrv.c 12 Mar 2004 21:27:34 -0000 +retrieving revision 1.56 +diff -u -r1.56 lolvldrv.c +--- lolvldrv.c 5 May 2004 01:00:54 -0000 1.56 ++++ lolvldrv.c 8 May 2004 14:17:20 -0000 @@ -497,10 +497,12 @@ case DRV_QUERYDEVICEINTERFACESIZE: return MMDRV_Message(mld, uMsg, dwParam1, dwParam2, TRUE); @@ -18,7 +18,7 @@ diff -u -r1.55 lolvldrv.c default: WARN("Unknown call %04x\n", uMsg); -@@ -741,11 +743,18 @@ +@@ -743,11 +745,18 @@ static BOOL MMDRV_InitHardcoded(void) { /* first load hardware drivers */ @@ -45,7 +45,7 @@ RCS file: /home/wine/wine/dlls/winmm/time.c,v retrieving revision 1.26 diff -u -r1.26 time.c --- time.c 12 Jan 2004 21:03:10 -0000 1.26 -+++ time.c 12 Mar 2004 21:27:34 -0000 ++++ time.c 8 May 2004 14:17:20 -0000 @@ -175,14 +175,19 @@ volatile HANDLE *pActive = (volatile HANDLE *)&TIME_hMMTimer; DWORD last_time, cur_time; @@ -72,7 +72,7 @@ RCS file: /home/wine/wine/dlls/winmm/winmm.c,v retrieving revision 1.33 diff -u -r1.33 winmm.c --- winmm.c 27 Feb 2004 21:29:32 -0000 1.33 -+++ winmm.c 12 Mar 2004 21:27:36 -0000 ++++ winmm.c 8 May 2004 14:17:21 -0000 @@ -125,10 +125,12 @@ loaded = -1; if (h) From 066123fa609aad2f6980d368defd51488b0ef086 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sat, 8 May 2004 14:16:09 +0000 Subject: [PATCH 1065/1463] Update porting status svn path=/trunk/; revision=9333 --- reactos/doc/README.WINE | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/reactos/doc/README.WINE b/reactos/doc/README.WINE index 2cff3219531..8e420163c86 100644 --- a/reactos/doc/README.WINE +++ b/reactos/doc/README.WINE @@ -32,24 +32,24 @@ reactos/tools/bin2res # Resource to binary converter The following shared libraries are a 100% port from Winehq sourcs. -reactos/lib/cabinet # Synced to Wine-20040408 -reactos/lib/comctl32 # Synced to Wine-20040408 -reactos/lib/comdlg32 # Synced to Wine-20040408 +reactos/lib/cabinet # Synced to Wine-20040505 +reactos/lib/comctl32 # Synced to Wine-20040505 +reactos/lib/comdlg32 # Synced to Wine-20040505 reactos/lib/imagehlp # Out of sync reactos/lib/imm32 reactos/lib/msvcrt20 -reactos/lib/mpr # Synced to Wine-20040408 -reactos/lib/ole32 # Synced to Wine-20040408 -reactos/lib/oledlg # Synced to Wine-20040408 -reactos/lib/richedit # Synced to Wine-20040408 -reactos/lib/rpcrt4 # Synced to Wine-20040504 +reactos/lib/mpr # Synced to Wine-20040505 +reactos/lib/ole32 # Synced to Wine-20040505 +reactos/lib/oledlg # Synced to Wine-20040505 +reactos/lib/richedit # Synced to Wine-20040505 +reactos/lib/rpcrt4 # Synced to Wine-20040505 reactos/lib/shell32 # 2004/04/16: Heavy syncing in progress -reactos/lib/shlwapi # Synced to Wine-20040408 +reactos/lib/shlwapi # Synced to Wine-20040505 reactos/lib/twain # Out of sync -reactos/lib/unicode # make this go away. Synced to Wine-20040408 -reactos/lib/winmm # Synced to Wine-20040408 -reactos/lib/winmm/midimap # Synced to Wine-20040408 -reactos/lib/winmm/wavemap # Synced to Wine-20040408 +reactos/lib/unicode # make this go away. Synced to Wine-20040505 +reactos/lib/winmm # Synced to Wine-20040505 +reactos/lib/winmm/midimap # Synced to Wine-20040505 +reactos/lib/winmm/wavemap # Synced to Wine-20040505 ReactOS shares the following programs with Winehq. reactos/subsys/system/regedit #Out of sync From c12dfa13b6edb55161b30351064dfd7158cc97b0 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 8 May 2004 16:06:54 +0000 Subject: [PATCH 1066/1463] assign even more styles for overlapped windows svn path=/trunk/; revision=9334 --- reactos/subsys/win32k/ntuser/window.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 9221b56d89e..c4c3f9688f2 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.227 2004/05/08 13:06:12 weiden Exp $ +/* $Id: window.c,v 1.228 2004/05/08 16:06:54 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1661,9 +1661,9 @@ NtUserCreateWindowEx(DWORD dwExStyle, if(!(WindowObject->Style & (WS_POPUP | WS_CHILD))) { - /* Automatically assign the caption and border style. Also always + /* Automatically assign the overlapped window style. Also always clip siblings for overlapped windows. */ - WindowObject->Style |= (WS_CAPTION | WS_BORDER | WS_CLIPSIBLINGS); + WindowObject->Style |= (WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS); } /* create system menu */ @@ -1716,6 +1716,10 @@ NtUserCreateWindowEx(DWORD dwExStyle, { IntReleaseWindowObject(ParentWindow); } + + /* FIXME - Delete window object and remove it from the thread windows list */ + /* FIXME - delete allocated DCE */ + DPRINT1("CBT-hook returned !0\n"); return (HWND) NULL; } From cc056e8bb5381c80a90a5e4bd56c5b3749ff870d Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 8 May 2004 19:35:32 +0000 Subject: [PATCH 1067/1463] handle WM_SETCUROR messages for the desktop window svn path=/trunk/; revision=9335 --- reactos/subsys/csrss/win32csr/desktopbg.c | 25 +++++++++++++---------- reactos/subsys/win32k/ntuser/msgqueue.c | 7 ++++++- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/reactos/subsys/csrss/win32csr/desktopbg.c b/reactos/subsys/csrss/win32csr/desktopbg.c index a23cb8b59ed..4ab43e5db55 100644 --- a/reactos/subsys/csrss/win32csr/desktopbg.c +++ b/reactos/subsys/csrss/win32csr/desktopbg.c @@ -1,4 +1,4 @@ -/* $Id: desktopbg.c,v 1.7 2004/04/09 20:03:16 navaraf Exp $ +/* $Id: desktopbg.c,v 1.8 2004/05/08 19:35:32 weiden Exp $ * * reactos/subsys/csrss/win32csr/desktopbg.c * @@ -53,11 +53,11 @@ DtbgWindowProc(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) switch(Msg) { - case WM_NCCREATE: - Result = (LRESULT) TRUE; - break; - case WM_CREATE: - Result = 0; + case WM_ERASEBKGND: + { + PaintDesktop((HDC)wParam); + Result = 1; + } break; case WM_PAINT: { @@ -68,11 +68,14 @@ DtbgWindowProc(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) Result = 0; } break; - case WM_ERASEBKGND: - { - PaintDesktop((HDC)wParam); - Result = 1; - } + case WM_SETCURSOR: + Result = (LRESULT) SetCursor(LoadCursorW(0, (LPCWSTR)IDC_ARROW)); + break; + case WM_NCCREATE: + Result = (LRESULT) TRUE; + break; + case WM_CREATE: + Result = 0; break; case PM_SHOW_DESKTOP: Result = ! SetWindowPos(Wnd, diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index eb2ba883787..b45018e66ec 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.92 2004/04/29 22:42:51 weiden Exp $ +/* $Id: msgqueue.c,v 1.93 2004/05/08 19:35:32 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -257,6 +257,11 @@ MsqTranslateMouseMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, UINT Filte else { WinPosWindowFromPoint(ScopeWin, NULL, &Message->Msg.pt, &Window); + if(Window == NULL) + { + Window = ScopeWin; + IntReferenceWindowObject(Window); + } } } else From f760135f5de14d61c5eb0663157fdaf526dedaf5 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 9 May 2004 12:23:35 +0000 Subject: [PATCH 1068/1463] - Implement multi-block bins. This removes all existing size limits within the registry. - Janitorial work. svn path=/trunk/; revision=9336 --- reactos/ntoskrnl/cm/cm.h | 125 +++++++------- reactos/ntoskrnl/cm/import.c | 8 +- reactos/ntoskrnl/cm/regfile.c | 298 ++++++++++++++++------------------ 3 files changed, 214 insertions(+), 217 deletions(-) diff --git a/reactos/ntoskrnl/cm/cm.h b/reactos/ntoskrnl/cm/cm.h index ba22b8e4832..2b9ef9c63d3 100644 --- a/reactos/ntoskrnl/cm/cm.h +++ b/reactos/ntoskrnl/cm/cm.h @@ -101,16 +101,16 @@ typedef struct _HIVE_HEADER ULONG Checksum; } HIVE_HEADER, *PHIVE_HEADER; -typedef struct _HBIN +typedef struct _BIN_HEADER { /* Bin identifier "hbin" (0x6E696268) */ - ULONG BlockId; + ULONG HeaderId; /* Block offset of this bin */ - BLOCK_OFFSET BlockOffset; + BLOCK_OFFSET BinOffset; /* Size in bytes, multiple of the block size (4KB) */ - ULONG BlockSize; + ULONG BinSize; /* ? */ ULONG Unused1; @@ -248,6 +248,13 @@ typedef struct _DATA_CELL #include +typedef struct _BLOCK_LIST_ENTRY +{ + PHBIN Bin; + PVOID Block; +} BLOCK_LIST_ENTRY, *PBLOCK_LIST_ENTRY; + + typedef struct _REGISTRY_HIVE { LIST_ENTRY HiveList; @@ -258,7 +265,7 @@ typedef struct _REGISTRY_HIVE PHIVE_HEADER HiveHeader; ULONG UpdateCounter; ULONG BlockListSize; - PHBIN *BlockList; + PBLOCK_LIST_ENTRY BlockList; ULONG FreeListSize; ULONG FreeListMax; PCELL_HEADER *FreeList; @@ -351,7 +358,7 @@ extern ERESOURCE CmiHiveListLock; VOID -CmiVerifyBinCell(PHBIN BinCell); +CmiVerifyBinHeader(PHBIN BinHeader); VOID CmiVerifyKeyCell(PKEY_CELL KeyCell); VOID @@ -362,7 +369,7 @@ VOID CmiVerifyRegistryHive(PREGISTRY_HIVE RegistryHive); #ifdef DBG -#define VERIFY_BIN_CELL CmiVerifyBinCell +#define VERIFY_BIN_HEADER CmiVerifyBinHeader #define VERIFY_KEY_CELL CmiVerifyKeyCell #define VERIFY_ROOT_KEY_CELL CmiVerifyRootKeyCell #define VERIFY_VALUE_CELL CmiVerifyValueCell @@ -370,7 +377,7 @@ CmiVerifyRegistryHive(PREGISTRY_HIVE RegistryHive); #define VERIFY_KEY_OBJECT CmiVerifyKeyObject #define VERIFY_REGISTRY_HIVE CmiVerifyRegistryHive #else -#define VERIFY_BIN_CELL(x) +#define VERIFY_BIN_HEADER(x) #define VERIFY_KEY_CELL(x) #define VERIFY_ROOT_KEY_CELL(x) #define VERIFY_VALUE_CELL(x) @@ -380,11 +387,11 @@ CmiVerifyRegistryHive(PREGISTRY_HIVE RegistryHive); #endif NTSTATUS STDCALL -CmiObjectParse(IN PVOID ParsedObject, - OUT PVOID *NextObject, - IN PUNICODE_STRING FullPath, - IN OUT PWSTR *Path, - IN ULONG Attribute); +CmiObjectParse(IN PVOID ParsedObject, + OUT PVOID *NextObject, + IN PUNICODE_STRING FullPath, + IN OUT PWSTR *Path, + IN ULONG Attribute); NTSTATUS STDCALL CmiObjectCreate(PVOID ObjectBody, @@ -461,30 +468,30 @@ ULONG CmiGetMaxClassLength(IN PKEY_OBJECT KeyObject); ULONG -CmiGetMaxValueNameLength(IN PREGISTRY_HIVE RegistryHive, - IN PKEY_CELL KeyCell); +CmiGetMaxValueNameLength(IN PREGISTRY_HIVE RegistryHive, + IN PKEY_CELL KeyCell); ULONG -CmiGetMaxValueDataLength(IN PREGISTRY_HIVE RegistryHive, - IN PKEY_CELL KeyCell); +CmiGetMaxValueDataLength(IN PREGISTRY_HIVE RegistryHive, + IN PKEY_CELL KeyCell); NTSTATUS -CmiScanForSubKey(IN PREGISTRY_HIVE RegistryHive, - IN PKEY_CELL KeyCell, - OUT PKEY_CELL *SubKeyCell, +CmiScanForSubKey(IN PREGISTRY_HIVE RegistryHive, + IN PKEY_CELL KeyCell, + OUT PKEY_CELL *SubKeyCell, OUT BLOCK_OFFSET *BlockOffset, IN PUNICODE_STRING KeyName, - IN ACCESS_MASK DesiredAccess, + IN ACCESS_MASK DesiredAccess, IN ULONG Attributes); NTSTATUS -CmiAddSubKey(IN PREGISTRY_HIVE RegistryHive, +CmiAddSubKey(IN PREGISTRY_HIVE RegistryHive, IN PKEY_OBJECT ParentKey, OUT PKEY_OBJECT SubKey, IN PUNICODE_STRING SubKeyName, - IN ULONG TitleIndex, - IN PUNICODE_STRING Class, - IN ULONG CreateOptions); + IN ULONG TitleIndex, + IN PUNICODE_STRING Class, + IN ULONG CreateOptions); NTSTATUS CmiRemoveSubKey(IN PREGISTRY_HIVE RegistryHive, @@ -492,17 +499,17 @@ CmiRemoveSubKey(IN PREGISTRY_HIVE RegistryHive, IN PKEY_OBJECT SubKey); NTSTATUS -CmiScanKeyForValue(IN PREGISTRY_HIVE RegistryHive, - IN PKEY_CELL KeyCell, - IN PUNICODE_STRING ValueName, - OUT PVALUE_CELL *ValueCell, - OUT BLOCK_OFFSET *VBOffset); +CmiScanKeyForValue(IN PREGISTRY_HIVE RegistryHive, + IN PKEY_CELL KeyCell, + IN PUNICODE_STRING ValueName, + OUT PVALUE_CELL *ValueCell, + OUT BLOCK_OFFSET *VBOffset); NTSTATUS -CmiGetValueFromKeyByIndex(IN PREGISTRY_HIVE RegistryHive, - IN PKEY_CELL KeyCell, - IN ULONG Index, - OUT PVALUE_CELL *ValueCell); +CmiGetValueFromKeyByIndex(IN PREGISTRY_HIVE RegistryHive, + IN PKEY_CELL KeyCell, + IN ULONG Index, + OUT PVALUE_CELL *ValueCell); NTSTATUS CmiAddValueToKey(IN PREGISTRY_HIVE RegistryHive, @@ -519,22 +526,22 @@ CmiDeleteValueFromKey(IN PREGISTRY_HIVE RegistryHive, IN PUNICODE_STRING ValueName); NTSTATUS -CmiAllocateHashTableCell(IN PREGISTRY_HIVE RegistryHive, - OUT PHASH_TABLE_CELL *HashBlock, - OUT BLOCK_OFFSET *HBOffset, - IN ULONG HashTableSize); +CmiAllocateHashTableCell(IN PREGISTRY_HIVE RegistryHive, + OUT PHASH_TABLE_CELL *HashBlock, + OUT BLOCK_OFFSET *HBOffset, + IN ULONG HashTableSize); PKEY_CELL CmiGetKeyFromHashByIndex(PREGISTRY_HIVE RegistryHive, -PHASH_TABLE_CELL HashBlock, -ULONG Index); + PHASH_TABLE_CELL HashBlock, + ULONG Index); NTSTATUS CmiAddKeyToHashTable(PREGISTRY_HIVE RegistryHive, PHASH_TABLE_CELL HashCell, BLOCK_OFFSET HashCellOffset, - PKEY_CELL NewKeyCell, - BLOCK_OFFSET NKBOffset); + PKEY_CELL NewKeyCell, + BLOCK_OFFSET NKBOffset); NTSTATUS CmiRemoveKeyFromHashTable(PREGISTRY_HIVE RegistryHive, @@ -542,31 +549,31 @@ CmiRemoveKeyFromHashTable(PREGISTRY_HIVE RegistryHive, BLOCK_OFFSET NKBOffset); NTSTATUS -CmiAllocateValueCell(IN PREGISTRY_HIVE RegistryHive, - OUT PVALUE_CELL *ValueCell, - OUT BLOCK_OFFSET *VBOffset, - IN PUNICODE_STRING ValueName); +CmiAllocateValueCell(IN PREGISTRY_HIVE RegistryHive, + OUT PVALUE_CELL *ValueCell, + OUT BLOCK_OFFSET *VBOffset, + IN PUNICODE_STRING ValueName); NTSTATUS -CmiDestroyValueCell(PREGISTRY_HIVE RegistryHive, - PVALUE_CELL ValueCell, - BLOCK_OFFSET VBOffset); +CmiDestroyValueCell(PREGISTRY_HIVE RegistryHive, + PVALUE_CELL ValueCell, + BLOCK_OFFSET VBOffset); NTSTATUS -CmiAllocateCell(PREGISTRY_HIVE RegistryHive, - LONG CellSize, - PVOID *Cell, +CmiAllocateCell(PREGISTRY_HIVE RegistryHive, + LONG CellSize, + PVOID *Cell, BLOCK_OFFSET *CellOffset); NTSTATUS -CmiDestroyCell(PREGISTRY_HIVE RegistryHive, - PVOID Cell, - BLOCK_OFFSET CellOffset); +CmiDestroyCell(PREGISTRY_HIVE RegistryHive, + PVOID Cell, + BLOCK_OFFSET CellOffset); PVOID -CmiGetCell (PREGISTRY_HIVE RegistryHive, - BLOCK_OFFSET CellOffset, - OUT PHBIN * ppBin); +CmiGetCell (PREGISTRY_HIVE RegistryHive, + BLOCK_OFFSET CellOffset, + OUT PHBIN *Bin); VOID CmiMarkBlockDirty(PREGISTRY_HIVE RegistryHive, @@ -577,7 +584,7 @@ CmiMarkBinDirty(PREGISTRY_HIVE RegistryHive, BLOCK_OFFSET BinOffset); NTSTATUS -CmiAddFree(PREGISTRY_HIVE RegistryHive, +CmiAddFree(PREGISTRY_HIVE RegistryHive, PCELL_HEADER FreeBlock, BLOCK_OFFSET FreeOffset, BOOLEAN MergeFreeBlocks); diff --git a/reactos/ntoskrnl/cm/import.c b/reactos/ntoskrnl/cm/import.c index 080ef62713f..9346e5261d2 100644 --- a/reactos/ntoskrnl/cm/import.c +++ b/reactos/ntoskrnl/cm/import.c @@ -1,4 +1,4 @@ -/* $Id: import.c,v 1.28 2004/01/31 14:33:01 ekohl Exp $ +/* $Id: import.c,v 1.29 2004/05/09 12:23:35 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -82,9 +82,9 @@ CmImportBinaryHive (PCHAR ChunkBase, /* Allocate block list */ DPRINT("Space needed for block list describing hive: 0x%x\n", - Hive->BlockListSize * sizeof(PHBIN *)); + Hive->BlockListSize * sizeof(BLOCK_LIST_ENTRY)); Hive->BlockList = ExAllocatePool (NonPagedPool, - Hive->BlockListSize * sizeof(PHBIN *)); + Hive->BlockListSize * sizeof(BLOCK_LIST_ENTRY)); if (Hive->BlockList == NULL) { DPRINT1 ("Allocating block list failed\n"); @@ -93,7 +93,7 @@ CmImportBinaryHive (PCHAR ChunkBase, return FALSE; } RtlZeroMemory (Hive->BlockList, - Hive->BlockListSize * sizeof(PHBIN *)); + Hive->BlockListSize * sizeof(BLOCK_LIST_ENTRY)); /* Import the bins */ Status = CmiImportHiveBins(Hive, diff --git a/reactos/ntoskrnl/cm/regfile.c b/reactos/ntoskrnl/cm/regfile.c index 4a7657f2168..e6ad6b196b6 100644 --- a/reactos/ntoskrnl/cm/regfile.c +++ b/reactos/ntoskrnl/cm/regfile.c @@ -58,14 +58,14 @@ CmiCreateDefaultHiveHeader(PHIVE_HEADER Header) VOID -CmiCreateDefaultBinCell(PHBIN BinCell) +CmiCreateDefaultBinHeader(PHBIN BinHeader) { - assert(BinCell); - RtlZeroMemory(BinCell, sizeof(HBIN)); - BinCell->BlockId = REG_BIN_ID; - BinCell->DateModified.u.LowPart = 0; - BinCell->DateModified.u.HighPart = 0; - BinCell->BlockSize = REG_BLOCK_SIZE; + assert(BinHeader); + RtlZeroMemory(BinHeader, sizeof(HBIN)); + BinHeader->HeaderId = REG_BIN_ID; + BinHeader->DateModified.u.LowPart = 0; + BinHeader->DateModified.u.HighPart = 0; + BinHeader->BinSize = REG_BLOCK_SIZE; } @@ -91,30 +91,30 @@ CmiCreateDefaultRootKeyCell(PKEY_CELL RootKeyCell) VOID -CmiVerifyBinCell(PHBIN BinCell) +CmiVerifyBinHeader(PHBIN BinHeader) { if (CmiDoVerify) { - assert(BinCell); + assert(BinHeader); - if (BinCell->BlockId != REG_BIN_ID) + if (BinHeader->HeaderId != REG_BIN_ID) { - DbgPrint("BlockId is %.08x (should be %.08x)\n", - BinCell->BlockId, REG_BIN_ID); - assert(BinCell->BlockId == REG_BIN_ID); + DbgPrint("Bin header ID is %.08x (should be %.08x)\n", + BinHeader->HeaderId, REG_BIN_ID); + assert(BinHeader->HeaderId == REG_BIN_ID); } - //BinCell->DateModified.dwLowDateTime + //BinHeader->DateModified.dwLowDateTime - //BinCell->DateModified.dwHighDateTime + //BinHeader->DateModified.dwHighDateTime - if (BinCell->BlockSize != REG_BLOCK_SIZE) + if (BinHeader->BinSize != REG_BLOCK_SIZE) { - DbgPrint("BlockSize is %.08x (should be %.08x)\n", - BinCell->BlockSize, REG_BLOCK_SIZE); - assert(BinCell->BlockSize == REG_BLOCK_SIZE); + DbgPrint("BinSize is %.08x (should be a multiple of %.08x)\n", + BinHeader->BinSize, REG_BLOCK_SIZE); + assert(BinHeader->BinSize % REG_BLOCK_SIZE == 0); } } @@ -362,7 +362,7 @@ CmiCreateNewRegFile(HANDLE FileHandle) PHIVE_HEADER HiveHeader; PKEY_CELL RootKeyCell; NTSTATUS Status; - PHBIN BinCell; + PHBIN BinHeader; PCHAR Buffer; Buffer = (PCHAR) ExAllocatePool(NonPagedPool, 2 * REG_BLOCK_SIZE); @@ -373,16 +373,16 @@ CmiCreateNewRegFile(HANDLE FileHandle) 2 * REG_BLOCK_SIZE); HiveHeader = (PHIVE_HEADER)Buffer; - BinCell = (PHBIN)((ULONG_PTR)Buffer + REG_BLOCK_SIZE); + BinHeader = (PHBIN)((ULONG_PTR)Buffer + REG_BLOCK_SIZE); RootKeyCell = (PKEY_CELL)((ULONG_PTR)Buffer + REG_BLOCK_SIZE + REG_HBIN_DATA_OFFSET); FreeCell = (PCELL_HEADER)((ULONG_PTR)Buffer + REG_BLOCK_SIZE + REG_HBIN_DATA_OFFSET + sizeof(KEY_CELL)); CmiCreateDefaultHiveHeader(HiveHeader); - CmiCreateDefaultBinCell(BinCell); + CmiCreateDefaultBinHeader(BinHeader); CmiCreateDefaultRootKeyCell(RootKeyCell); /* First block */ - BinCell->BlockOffset = 0; + BinHeader->BinOffset = 0; /* Offset to root key block */ HiveHeader->RootKeyOffset = REG_HBIN_DATA_OFFSET; @@ -604,11 +604,11 @@ CmiCheckAndFixHive(PREGISTRY_HIVE RegistryHive) FileSize = fsi.EndOfFile.u.LowPart; /* Calculate bitmap and block size */ - BitmapSize = ROUND_UP((FileSize / 4096) - 1, sizeof(ULONG) * 8) / 8; + BitmapSize = ROUND_UP((FileSize / REG_BLOCK_SIZE) - 1, sizeof(ULONG) * 8) / 8; BufferSize = sizeof(HIVE_HEADER) + sizeof(ULONG) + BitmapSize; - BufferSize = ROUND_UP(BufferSize, 4096); + BufferSize = ROUND_UP(BufferSize, REG_BLOCK_SIZE); /* Reallocate log header block */ ExFreePool(LogHeader); @@ -640,7 +640,7 @@ CmiCheckAndFixHive(PREGISTRY_HIVE RegistryHive) /* Initialize bitmap */ RtlInitializeBitMap(&BlockBitMap, - (PVOID)((ULONG)LogHeader + 4096 + sizeof(ULONG)), + (PVOID)((ULONG)LogHeader + REG_BLOCK_SIZE + sizeof(ULONG)), BitmapSize * 8); /* FIXME: Update dirty blocks */ @@ -686,40 +686,43 @@ CmiImportHiveBins(PREGISTRY_HIVE Hive, { Bin = (PHBIN)((ULONG_PTR)ChunkPtr + BlockOffset); - if (Bin->BlockId != REG_BIN_ID) + if (Bin->HeaderId != REG_BIN_ID) { - DPRINT1 ("Bad BlockId %x, offset %x\n", Bin->BlockId, BlockOffset); + DPRINT1 ("Bad bin header id %x, offset %x\n", Bin->HeaderId, BlockOffset); return STATUS_REGISTRY_CORRUPT; } - assertmsg((Bin->BlockSize % 4096) == 0, - ("BlockSize (0x%.08x) must be multiple of 4K\n", - Bin->BlockSize)); + assertmsg((Bin->BinSize % REG_BLOCK_SIZE) == 0, + ("Bin size (0x%.08x) must be multiple of 4K\n", + Bin->BinSize)); /* Allocate the hive block */ - Hive->BlockList[BlockIndex] = ExAllocatePool (PagedPool, - Bin->BlockSize); - if (Hive->BlockList[BlockIndex] == NULL) + Hive->BlockList[BlockIndex].Bin = ExAllocatePool (PagedPool, + Bin->BinSize); + if (Hive->BlockList[BlockIndex].Bin == NULL) { DPRINT1 ("ExAllocatePool() failed\n"); return STATUS_INSUFFICIENT_RESOURCES; } + Hive->BlockList[BlockIndex].Block = (PVOID)Hive->BlockList[BlockIndex].Bin; /* Import the Bin */ - RtlCopyMemory (Hive->BlockList[BlockIndex], + RtlCopyMemory (Hive->BlockList[BlockIndex].Bin, Bin, - Bin->BlockSize); + Bin->BinSize); - if (Bin->BlockSize > 4096) + if (Bin->BinSize > REG_BLOCK_SIZE) { - for (j = 1; j < Bin->BlockSize / 4096; j++) + for (j = 1; j < Bin->BinSize / REG_BLOCK_SIZE; j++) { - Hive->BlockList[BlockIndex + j] = Hive->BlockList[BlockIndex]; + Hive->BlockList[BlockIndex + j].Bin = Hive->BlockList[BlockIndex].Bin; + Hive->BlockList[BlockIndex + j].Block = + (PVOID)((ULONG_PTR)Hive->BlockList[BlockIndex].Bin + (j * REG_BLOCK_SIZE)); } } - BlockIndex += Bin->BlockSize / 4096; - BlockOffset += Bin->BlockSize; + BlockIndex += Bin->BinSize / REG_BLOCK_SIZE; + BlockOffset += Bin->BinSize; } return STATUS_SUCCESS; @@ -735,15 +738,16 @@ CmiFreeHiveBins (PREGISTRY_HIVE Hive) Bin = NULL; for (i = 0; i < Hive->BlockListSize; i++) { - if (Hive->BlockList[i] == NULL) + if (Hive->BlockList[i].Bin == NULL) continue; - if (Hive->BlockList[i] != Bin) + if (Hive->BlockList[i].Bin != Bin) { - Bin = Hive->BlockList[i]; - ExFreePool (Hive->BlockList[i]); + Bin = Hive->BlockList[i].Bin; + ExFreePool (Hive->BlockList[i].Bin); } - Hive->BlockList[i] = NULL; + Hive->BlockList[i].Bin = NULL; + Hive->BlockList[i].Block = NULL; } } @@ -768,18 +772,18 @@ CmiCreateHiveFreeCellList(PREGISTRY_HIVE Hive) BlockIndex = 0; while (BlockIndex < Hive->BlockListSize) { - Bin = Hive->BlockList[BlockIndex]; + Bin = Hive->BlockList[BlockIndex].Bin; /* Search free blocks and add to list */ FreeOffset = REG_HBIN_DATA_OFFSET; - while (FreeOffset < Bin->BlockSize) + while (FreeOffset < Bin->BinSize) { FreeBlock = (PCELL_HEADER) ((ULONG_PTR) Bin + FreeOffset); if (FreeBlock->CellSize > 0) { Status = CmiAddFree(Hive, FreeBlock, - Bin->BlockOffset + FreeOffset, + Bin->BinOffset + FreeOffset, FALSE); if (!NT_SUCCESS(Status)) @@ -795,8 +799,8 @@ CmiCreateHiveFreeCellList(PREGISTRY_HIVE Hive) } } - BlockIndex += Bin->BlockSize / 4096; - BlockOffset += Bin->BlockSize; + BlockIndex += Bin->BinSize / REG_BLOCK_SIZE; + BlockOffset += Bin->BinSize; } return STATUS_SUCCESS; @@ -983,12 +987,12 @@ CmiInitNonVolatileRegistryHive (PREGISTRY_HIVE RegistryHive, ViewBase, sizeof(HIVE_HEADER)); RegistryHive->FileSize = ViewSize; - RegistryHive->BlockListSize = (RegistryHive->FileSize / 4096) - 1; + RegistryHive->BlockListSize = (RegistryHive->FileSize / REG_BLOCK_SIZE) - 1; RegistryHive->UpdateCounter = RegistryHive->HiveHeader->UpdateCounter1; /* Allocate hive block list */ RegistryHive->BlockList = ExAllocatePool(NonPagedPool, - sizeof(PHBIN *) * RegistryHive->BlockListSize); + RegistryHive->BlockListSize * sizeof(BLOCK_LIST_ENTRY)); if (RegistryHive->BlockList == NULL) { DPRINT1("Failed to allocate the hive block list\n"); @@ -1000,11 +1004,11 @@ CmiInitNonVolatileRegistryHive (PREGISTRY_HIVE RegistryHive, return STATUS_INSUFFICIENT_RESOURCES; } RtlZeroMemory (RegistryHive->BlockList, - RegistryHive->BlockListSize * sizeof(PHBIN *)); + RegistryHive->BlockListSize * sizeof(BLOCK_LIST_ENTRY)); /* Import the hive bins */ Status = CmiImportHiveBins (RegistryHive, - ViewBase + 4096); + ViewBase + REG_BLOCK_SIZE); if (!NT_SUCCESS(Status)) { ExFreePool(RegistryHive->BlockList); @@ -1121,7 +1125,7 @@ CmiCreateVolatileHive(PREGISTRY_HIVE *RegistryHive) NTSTATUS CmiCreateTempHive(PREGISTRY_HIVE *RegistryHive) { - PHBIN BinCell; + PHBIN BinHeader; PCELL_HEADER FreeCell; PREGISTRY_HIVE Hive; NTSTATUS Status; @@ -1166,7 +1170,7 @@ CmiCreateTempHive(PREGISTRY_HIVE *RegistryHive) /* Allocate hive block list */ Hive->BlockList = ExAllocatePool (NonPagedPool, - sizeof(PHBIN *)); + sizeof(PBLOCK_LIST_ENTRY)); if (Hive->BlockList == NULL) { DPRINT1 ("Failed to allocate hive block list\n"); @@ -1176,9 +1180,9 @@ CmiCreateTempHive(PREGISTRY_HIVE *RegistryHive) } /* Allocate first Bin */ - Hive->BlockList[0] = ExAllocatePool (NonPagedPool, - REG_BLOCK_SIZE); - if (Hive->BlockList[0] == NULL) + Hive->BlockList[0].Bin = ExAllocatePool (NonPagedPool, + REG_BLOCK_SIZE); + if (Hive->BlockList[0].Bin == NULL) { DPRINT1 ("Failed to allocate first bin\n"); ExFreePool(Hive->BlockList); @@ -1186,19 +1190,20 @@ CmiCreateTempHive(PREGISTRY_HIVE *RegistryHive) ExFreePool(Hive); return STATUS_INSUFFICIENT_RESOURCES; } + Hive->BlockList[0].Block = (PVOID)Hive->BlockList[0].Bin; Hive->FileSize = 2* REG_BLOCK_SIZE; Hive->BlockListSize = 1; Hive->UpdateCounter = Hive->HiveHeader->UpdateCounter1; - BinCell = (PHBIN)Hive->BlockList[0]; - FreeCell = (PCELL_HEADER)((ULONG_PTR)BinCell + REG_HBIN_DATA_OFFSET); + BinHeader = Hive->BlockList[0].Bin; + FreeCell = (PCELL_HEADER)((ULONG_PTR)BinHeader + REG_HBIN_DATA_OFFSET); - CmiCreateDefaultBinCell (BinCell); + CmiCreateDefaultBinHeader (BinHeader); /* First block */ - BinCell->BlockOffset = 0; + BinHeader->BinOffset = 0; /* Offset to root key block */ Hive->HiveHeader->RootKeyOffset = (BLOCK_OFFSET)-1; @@ -1208,10 +1213,10 @@ CmiCreateTempHive(PREGISTRY_HIVE *RegistryHive) /* Create the free cell list */ Status = CmiCreateHiveFreeCellList (Hive); - if (Hive->BlockList[0] == NULL) + if (Hive->BlockList[0].Bin == NULL) { DPRINT1 ("CmiCreateHiveFreeCellList() failed (Status %lx)\n", Status); - ExFreePool(Hive->BlockList[0]); + ExFreePool(Hive->BlockList[0].Bin); ExFreePool(Hive->BlockList); ExFreePool(Hive->HiveHeader); ExFreePool(Hive); @@ -1401,7 +1406,7 @@ CmiStartLogUpdate(PREGISTRY_HIVE RegistryHive) BufferSize = sizeof(HIVE_HEADER) + sizeof(ULONG) + BitmapSize; - BufferSize = ROUND_UP(BufferSize, 4096); + BufferSize = ROUND_UP(BufferSize, REG_BLOCK_SIZE); DPRINT("Bitmap size %lu buffer size: %lu\n", BitmapSize, BufferSize); @@ -1459,11 +1464,7 @@ CmiStartLogUpdate(PREGISTRY_HIVE RegistryHive) BitmapSize); /* Write hive block and block bitmap */ -#if defined(__GNUC__) - FileOffset.QuadPart = 0ULL; -#else - FileOffset.QuadPart = 0; -#endif + FileOffset.QuadPart = (ULONGLONG)0; Status = NtWriteFile(FileHandle, NULL, NULL, @@ -1500,7 +1501,7 @@ CmiStartLogUpdate(PREGISTRY_HIVE RegistryHive) DPRINT("Block %lu is dirty\n", BlockIndex); - BlockPtr = RegistryHive->BlockList[BlockIndex]; + BlockPtr = RegistryHive->BlockList[BlockIndex].Block; DPRINT("BlockPtr %p\n", BlockPtr); DPRINT("File offset %I64x\n", FileOffset.QuadPart); @@ -1522,11 +1523,7 @@ CmiStartLogUpdate(PREGISTRY_HIVE RegistryHive) } BlockIndex++; -#if defined(__GNUC__) - FileOffset.QuadPart += 4096ULL; -#else - FileOffset.QuadPart += 4096; -#endif + FileOffset.QuadPart += (ULONGLONG)REG_BLOCK_SIZE; } /* Truncate log file */ @@ -1589,7 +1586,7 @@ CmiFinishLogUpdate(PREGISTRY_HIVE RegistryHive) BufferSize = sizeof(HIVE_HEADER) + sizeof(ULONG) + BitmapSize; - BufferSize = ROUND_UP(BufferSize, 4096); + BufferSize = ROUND_UP(BufferSize, REG_BLOCK_SIZE); DPRINT("Bitmap size %lu buffer size: %lu\n", BitmapSize, BufferSize); @@ -1645,11 +1642,7 @@ CmiFinishLogUpdate(PREGISTRY_HIVE RegistryHive) BitmapSize); /* Write hive block and block bitmap */ -#if defined(__GNUC__) - FileOffset.QuadPart = 0ULL; -#else - FileOffset.QuadPart = 0; -#endif + FileOffset.QuadPart = (ULONGLONG)0; Status = NtWriteFile(FileHandle, NULL, NULL, @@ -1701,7 +1694,7 @@ CmiCleanupLogUpdate(PREGISTRY_HIVE RegistryHive) BufferSize = sizeof(HIVE_HEADER) + sizeof(ULONG) + BitmapSize; - BufferSize = ROUND_UP(BufferSize, 4096); + BufferSize = ROUND_UP(BufferSize, REG_BLOCK_SIZE); DPRINT("Bitmap size %lu buffer size: %lu\n", BitmapSize, BufferSize); @@ -1812,11 +1805,7 @@ CmiStartHiveUpdate(PREGISTRY_HIVE RegistryHive) RegistryHive->HiveHeader->Checksum = CmiCalcChecksum((PULONG)RegistryHive->HiveHeader); /* Write hive block */ -#if defined(__GNUC__) - FileOffset.QuadPart = 0ULL; -#else - FileOffset.QuadPart = 0; -#endif + FileOffset.QuadPart = (ULONGLONG)0; Status = NtWriteFile(FileHandle, NULL, NULL, @@ -1849,15 +1838,11 @@ CmiStartHiveUpdate(PREGISTRY_HIVE RegistryHive) DPRINT("Block %lu is dirty\n", BlockIndex); - BlockPtr = RegistryHive->BlockList[BlockIndex]; - DPRINT("BlockPtr %p\n", BlockPtr); + BlockPtr = RegistryHive->BlockList[BlockIndex].Block; + DPRINT(" BlockPtr %p\n", BlockPtr); -#if defined(__GNUC__) - FileOffset.QuadPart = (ULONGLONG)(BlockIndex + 1) * 4096ULL; -#else - FileOffset.QuadPart = (ULONGLONG)(BlockIndex + 1) * 4096; -#endif - DPRINT("File offset %I64x\n", FileOffset.QuadPart); + FileOffset.QuadPart = (ULONGLONG)(BlockIndex + 1) * (ULONGLONG)REG_BLOCK_SIZE; + DPRINT(" File offset %I64x\n", FileOffset.QuadPart); /* Write hive block */ Status = NtWriteFile(FileHandle, @@ -1932,11 +1917,7 @@ CmiFinishHiveUpdate(PREGISTRY_HIVE RegistryHive) RegistryHive->HiveHeader->Checksum = CmiCalcChecksum((PULONG)RegistryHive->HiveHeader); /* Write hive block */ -#if defined(__GNUC__) - FileOffset.QuadPart = 0ULL; -#else - FileOffset.QuadPart = 0; -#endif + FileOffset.QuadPart = (ULONGLONG)0; Status = NtWriteFile(FileHandle, NULL, NULL, @@ -3062,7 +3043,7 @@ CmiAllocateHashTableCell (IN PREGISTRY_HIVE RegistryHive, } else { - assert(SubKeyCount <= 0xffff); /* should really be USHORT_MAX or similar */ + assert(SubKeyCount <= 0xffff); /* should really be USHORT_MAX or similar */ NewHashBlock->Id = REG_HASH_TABLE_CELL_ID; NewHashBlock->HashTableSize = (USHORT)SubKeyCount; *HashBlock = NewHashBlock; @@ -3177,7 +3158,7 @@ CmiAllocateValueCell(PREGISTRY_HIVE RegistryHive, } else { - assert(NameSize <= 0xffff); /* should really be USHORT_MAX or similar */ + assert(NameSize <= 0xffff); /* should really be USHORT_MAX or similar */ NewValueCell->Id = REG_VALUE_CELL_ID; NewValueCell->NameSize = (USHORT)NameSize; if (Packable) @@ -3254,33 +3235,41 @@ CmiDestroyValueCell(PREGISTRY_HIVE RegistryHive, NTSTATUS CmiAddBin(PREGISTRY_HIVE RegistryHive, + ULONG BlockCount, PVOID *NewBlock, BLOCK_OFFSET *NewBlockOffset) { + PBLOCK_LIST_ENTRY BlockList; PCELL_HEADER tmpBlock; - PHBIN * tmpBlockList; PHBIN tmpBin; + ULONG BinSize; + ULONG i; - tmpBin = ExAllocatePool(PagedPool, REG_BLOCK_SIZE); + DPRINT ("CmiAddBin (BlockCount %lu)\n", BlockCount); + + BinSize = BlockCount * REG_BLOCK_SIZE; + tmpBin = ExAllocatePool(PagedPool, BinSize); if (tmpBin == NULL) { return STATUS_INSUFFICIENT_RESOURCES; } RtlZeroMemory (tmpBin, - REG_BLOCK_SIZE); + BinSize); - tmpBin->BlockId = REG_BIN_ID; - tmpBin->BlockOffset = RegistryHive->FileSize - REG_BLOCK_SIZE; - RegistryHive->FileSize += REG_BLOCK_SIZE; - tmpBin->BlockSize = REG_BLOCK_SIZE; + tmpBin->HeaderId = REG_BIN_ID; + tmpBin->BinOffset = RegistryHive->FileSize - REG_BLOCK_SIZE; + RegistryHive->FileSize += BinSize; + tmpBin->BinSize = BinSize; tmpBin->Unused1 = 0; NtQuerySystemTime(&tmpBin->DateModified); tmpBin->Unused2 = 0; - /* Increase size of list of blocks */ - tmpBlockList = ExAllocatePool(NonPagedPool, - sizeof(PHBIN *) * (RegistryHive->BlockListSize + 1)); - if (tmpBlockList == NULL) + DPRINT (" BinOffset %lx BinSize %lx\n", tmpBin->BinOffset,tmpBin->BinSize); + + /* Allocate new block list */ + BlockList = ExAllocatePool(NonPagedPool, + sizeof(BLOCK_LIST_ENTRY) * (RegistryHive->BlockListSize + BlockCount)); + if (BlockList == NULL) { ExFreePool(tmpBin); return STATUS_INSUFFICIENT_RESOURCES; @@ -3288,19 +3277,24 @@ CmiAddBin(PREGISTRY_HIVE RegistryHive, if (RegistryHive->BlockListSize > 0) { - RtlCopyMemory (tmpBlockList, + RtlCopyMemory (BlockList, RegistryHive->BlockList, - sizeof(PHBIN *)*(RegistryHive->BlockListSize)); + sizeof(BLOCK_LIST_ENTRY) * RegistryHive->BlockListSize); ExFreePool(RegistryHive->BlockList); } - RegistryHive->BlockList = tmpBlockList; - RegistryHive->BlockList[RegistryHive->BlockListSize] = tmpBin; - RegistryHive->BlockListSize++; + RegistryHive->BlockList = BlockList; + for (i = 0; i < BlockCount; i++) + { + RegistryHive->BlockList[RegistryHive->BlockListSize + i].Block = + (PVOID)((ULONG_PTR)tmpBin + (i * REG_BLOCK_SIZE)); + RegistryHive->BlockList[RegistryHive->BlockListSize + i].Bin = tmpBin; + } + RegistryHive->BlockListSize += BlockCount; /* Initialize a free block in this heap : */ tmpBlock = (PCELL_HEADER)((ULONG_PTR) tmpBin + REG_HBIN_DATA_OFFSET); - tmpBlock->CellSize = (REG_BLOCK_SIZE - REG_HBIN_DATA_OFFSET); + tmpBlock->CellSize = (BinSize - REG_HBIN_DATA_OFFSET); /* Grow bitmap if necessary */ if (IsNoFileHive(RegistryHive) && @@ -3331,11 +3325,11 @@ CmiAddBin(PREGISTRY_HIVE RegistryHive, *NewBlock = (PVOID) tmpBlock; if (NewBlockOffset) - *NewBlockOffset = tmpBin->BlockOffset + REG_HBIN_DATA_OFFSET; + *NewBlockOffset = tmpBin->BinOffset + REG_HBIN_DATA_OFFSET; /* Mark new bin dirty */ CmiMarkBinDirty(RegistryHive, - tmpBin->BlockOffset); + tmpBin->BinOffset); return STATUS_SUCCESS; } @@ -3418,7 +3412,10 @@ CmiAllocateCell (PREGISTRY_HIVE RegistryHive, if (NewCell == NULL) { /* Add a new bin */ - Status = CmiAddBin(RegistryHive, (PVOID *) &NewCell , CellOffset); + Status = CmiAddBin(RegistryHive, + ((CellSize + sizeof(HBIN) - 1) / REG_BLOCK_SIZE) + 1, + (PVOID *)&NewCell, + CellOffset); if (!NT_SUCCESS(Status)) return Status; } @@ -3493,13 +3490,13 @@ CmiDestroyCell (PREGISTRY_HIVE RegistryHive, PVOID CmiGetCell (PREGISTRY_HIVE RegistryHive, BLOCK_OFFSET CellOffset, - PHBIN * ppBin) + PHBIN *Bin) { PHBIN pBin; - if (ppBin) + if (Bin != NULL) { - *ppBin = NULL; + *Bin = NULL; } if (CellOffset == (BLOCK_OFFSET)-1) @@ -3512,25 +3509,25 @@ CmiGetCell (PREGISTRY_HIVE RegistryHive, return (PVOID)CellOffset; } - if (CellOffset > RegistryHive->BlockListSize * 4096) + if (CellOffset > RegistryHive->BlockListSize * REG_BLOCK_SIZE) { DPRINT1("CellOffset exceeds valid range (%lu > %lu)\n", - CellOffset, RegistryHive->BlockListSize * 4096); + CellOffset, RegistryHive->BlockListSize * REG_BLOCK_SIZE); return NULL; } - pBin = RegistryHive->BlockList[CellOffset / 4096]; + pBin = RegistryHive->BlockList[CellOffset / REG_BLOCK_SIZE].Bin; if (pBin == NULL) { return NULL; } - if (ppBin) + if (Bin != NULL) { - *ppBin = pBin; + *Bin = pBin; } - return((PVOID)((ULONG_PTR)pBin + (CellOffset - pBin->BlockOffset))); + return((PVOID)((ULONG_PTR)pBin + (CellOffset - pBin->BinOffset))); } @@ -3556,8 +3553,8 @@ CmiMergeFree(PREGISTRY_HIVE RegistryHive, if (Bin == NULL) return(FALSE); - BinOffset = Bin->BlockOffset; - BinSize = Bin->BlockSize; + BinOffset = Bin->BinOffset; + BinSize = Bin->BinSize; DPRINT("Bin %p Offset %lx Size %lx\n", Bin, BinOffset, BinSize); for (i = 0; i < RegistryHive->FreeListSize; i++) @@ -3753,7 +3750,7 @@ CmiMarkBlockDirty(PREGISTRY_HIVE RegistryHive, DPRINT("CmiMarkBlockDirty(Offset 0x%lx)\n", (ULONG)BlockOffset); - BlockNumber = (ULONG)BlockOffset / 4096; + BlockNumber = (ULONG)BlockOffset / REG_BLOCK_SIZE; Cell = CmiGetCell (RegistryHive, BlockOffset, @@ -3763,7 +3760,8 @@ CmiMarkBlockDirty(PREGISTRY_HIVE RegistryHive, if (CellSize < 0) CellSize = -CellSize; - BlockCount = (ROUND_UP(BlockOffset + CellSize, 4096) - ROUND_DOWN(BlockOffset, 4096)) / 4096; + BlockCount = (ROUND_UP(BlockOffset + CellSize, REG_BLOCK_SIZE) - + ROUND_DOWN(BlockOffset, REG_BLOCK_SIZE)) / REG_BLOCK_SIZE; DPRINT(" BlockNumber %lu Size %lu (%s) BlockCount %lu\n", BlockNumber, @@ -3791,15 +3789,15 @@ CmiMarkBinDirty(PREGISTRY_HIVE RegistryHive, DPRINT("CmiMarkBinDirty(Offset 0x%lx)\n", (ULONG)BinOffset); - BlockNumber = (ULONG)BinOffset / 4096; + BlockNumber = (ULONG)BinOffset / REG_BLOCK_SIZE; - Bin = RegistryHive->BlockList[BlockNumber]; + Bin = RegistryHive->BlockList[BlockNumber].Bin; - BlockCount = Bin->BlockSize / 4096; + BlockCount = Bin->BinSize / REG_BLOCK_SIZE; - DPRINT(" BlockNumber %lu Size %lu BlockCount %lu\n", + DPRINT(" BlockNumber %lu BinSize %lu BlockCount %lu\n", BlockNumber, - Bin->BlockSize, + Bin->BinSize, BlockCount); RegistryHive->HiveDirty = TRUE; @@ -4255,11 +4253,7 @@ CmiSaveTempHive (PREGISTRY_HIVE Hive, Hive->HiveHeader->Checksum = CmiCalcChecksum ((PULONG)Hive->HiveHeader); /* Write hive block */ -#if defined(__GNUC__) - FileOffset.QuadPart = 0ULL; -#else - FileOffset.QuadPart = 0; -#endif + FileOffset.QuadPart = (ULONGLONG)0; Status = NtWriteFile (FileHandle, NULL, NULL, @@ -4278,14 +4272,10 @@ CmiSaveTempHive (PREGISTRY_HIVE Hive, DPRINT ("Saving %lu blocks\n", Hive->BlockListSize); for (BlockIndex = 0; BlockIndex < Hive->BlockListSize; BlockIndex++) { - BlockPtr = Hive->BlockList[BlockIndex]; + BlockPtr = Hive->BlockList[BlockIndex].Block; DPRINT ("BlockPtr %p\n", BlockPtr); -#if defined(__GNUC__) - FileOffset.QuadPart = (ULONGLONG)(BlockIndex + 1) * 4096ULL; -#else - FileOffset.QuadPart = (ULONGLONG)(BlockIndex + 1) * 4096; -#endif + FileOffset.QuadPart = (ULONGLONG)(BlockIndex + 1) * (ULONGLONG)REG_BLOCK_SIZE; DPRINT ("File offset %I64x\n", FileOffset.QuadPart); /* Write hive block */ From c2f0a2f385cd7a17545ce96030a98fc8e5837c5e Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 9 May 2004 14:50:09 +0000 Subject: [PATCH 1069/1463] Support multi-block bins. svn path=/trunk/; revision=9337 --- freeldr/freeldr/reactos/binhive.c | 84 +++++++++++++++++-------------- reactos/tools/mkhive/binhive.c | 73 +++++++++++++++------------ 2 files changed, 88 insertions(+), 69 deletions(-) diff --git a/freeldr/freeldr/reactos/binhive.c b/freeldr/freeldr/reactos/binhive.c index 23f8b43d836..20171d3d47b 100644 --- a/freeldr/freeldr/reactos/binhive.c +++ b/freeldr/freeldr/reactos/binhive.c @@ -94,16 +94,17 @@ typedef struct _HIVE_HEADER U32 Checksum; } __attribute__((packed)) HIVE_HEADER, *PHIVE_HEADER; -typedef struct _HBIN + +typedef struct _BIN_HEADER { /* Bin identifier "hbin" (0x6E696268) */ - U32 BlockId; + U32 HeaderId; - /* Block offset of this bin */ - BLOCK_OFFSET BlockOffset; + /* Bin offset */ + BLOCK_OFFSET BinOffset; /* Size in bytes, multiple of the block size (4KB) */ - U32 BlockSize; + U32 BinSize; /* ? */ U32 Unused1; @@ -318,9 +319,9 @@ CmiCreateDefaultBinCell (PHBIN BinCell) { assert(BinCell); memset (BinCell, 0, REG_BLOCK_SIZE); - BinCell->BlockId = REG_BIN_ID; + BinCell->HeaderId = REG_BIN_ID; BinCell->DateModified = 0ULL; - BinCell->BlockSize = REG_BLOCK_SIZE; + BinCell->BinSize = REG_BLOCK_SIZE; } @@ -424,7 +425,7 @@ CmiCreateHive (PCHAR KeyName) /* Init first bin */ BinCell = (PHBIN)Hive->BlockList[0]; CmiCreateDefaultBinCell(BinCell); - BinCell->BlockOffset = 0; + BinCell->BinOffset = 0; /* Init root key cell */ RootKeyCell = (PKEY_CELL)((U32)BinCell + REG_HBIN_DATA_OFFSET); @@ -496,8 +497,8 @@ CmiMergeFree(PREGISTRY_HIVE RegistryHive, DbgPrint((DPRINT_REGISTRY, "Bin %p\n", Bin)); - BinOffset = Bin->BlockOffset; - BinSize = Bin->BlockSize; + BinOffset = Bin->BinOffset; + BinSize = Bin->BinSize; DbgPrint((DPRINT_REGISTRY, "Bin %p Offset %lx Size %lx\n", Bin, BinOffset, BinSize)); for (i = 0; i < RegistryHive->FreeListSize; i++) @@ -674,45 +675,51 @@ CmiAddFree(PREGISTRY_HIVE RegistryHive, static BOOL CmiAddBin(PREGISTRY_HIVE RegistryHive, + U32 BlockCount, PVOID *NewBlock, PBLOCK_OFFSET NewBlockOffset) { PCELL_HEADER tmpBlock; - PHBIN * tmpBlockList; + PHBIN *BlockList; PHBIN tmpBin; + U32 BinSize; + U32 i; - tmpBin = AllocateMbMemory (REG_BLOCK_SIZE); + BinSize = BlockCount * REG_BLOCK_SIZE; + tmpBin = AllocateMbMemory (BinSize); if (tmpBin == NULL) { return FALSE; } - memset (tmpBin, 0, REG_BLOCK_SIZE); + memset (tmpBin, 0, BinSize); - tmpBin->BlockId = REG_BIN_ID; - tmpBin->BlockOffset = RegistryHive->FileSize - REG_BLOCK_SIZE; - RegistryHive->FileSize += REG_BLOCK_SIZE; - tmpBin->BlockSize = REG_BLOCK_SIZE; + tmpBin->HeaderId = REG_BIN_ID; + tmpBin->BinOffset = RegistryHive->FileSize - REG_BLOCK_SIZE; + RegistryHive->FileSize += BinSize; + tmpBin->BinSize = BinSize; tmpBin->Unused1 = 0; tmpBin->DateModified = 0ULL; tmpBin->Unused2 = 0; /* Increase size of list of blocks */ - tmpBlockList = MmAllocateMemory (sizeof(PHBIN) * (RegistryHive->BlockListSize + 1)); - if (tmpBlockList == NULL) + BlockList = MmAllocateMemory (sizeof(PHBIN) * (RegistryHive->BlockListSize + BlockCount)); + if (BlockList == NULL) { return FALSE; } if (RegistryHive->BlockListSize > 0) { - memcpy (tmpBlockList, + memcpy (BlockList, RegistryHive->BlockList, sizeof(PHBIN) * RegistryHive->BlockListSize); MmFreeMemory (RegistryHive->BlockList); } - RegistryHive->BlockList = tmpBlockList; - RegistryHive->BlockList[RegistryHive->BlockListSize++] = tmpBin; + RegistryHive->BlockList = BlockList; + for (i = 0; i < BlockCount; i++) + RegistryHive->BlockList[RegistryHive->BlockListSize + i] = tmpBin; + RegistryHive->BlockListSize += BlockCount; /* Initialize a free block in this heap : */ tmpBlock = (PCELL_HEADER)((U32) tmpBin + REG_HBIN_DATA_OFFSET); @@ -721,7 +728,7 @@ CmiAddBin(PREGISTRY_HIVE RegistryHive, *NewBlock = (PVOID) tmpBlock; if (NewBlockOffset) - *NewBlockOffset = tmpBin->BlockOffset + REG_HBIN_DATA_OFFSET; + *NewBlockOffset = tmpBin->BinOffset + REG_HBIN_DATA_OFFSET; return TRUE; } @@ -729,7 +736,7 @@ CmiAddBin(PREGISTRY_HIVE RegistryHive, static BOOL CmiAllocateCell (PREGISTRY_HIVE RegistryHive, - S32 BlockSize, + S32 CellSize, PVOID *Block, PBLOCK_OFFSET pBlockOffset) { @@ -739,13 +746,13 @@ CmiAllocateCell (PREGISTRY_HIVE RegistryHive, *Block = NULL; /* Round to 16 bytes multiple */ - BlockSize = ROUND_UP(BlockSize, 16); + CellSize = ROUND_UP(CellSize, 16); /* first search in free blocks */ NewBlock = NULL; for (i = 0; i < RegistryHive->FreeListSize; i++) { - if (RegistryHive->FreeList[i]->CellSize >= BlockSize) + if (RegistryHive->FreeList[i]->CellSize >= CellSize) { NewBlock = RegistryHive->FreeList[i]; if (pBlockOffset) @@ -767,33 +774,36 @@ CmiAllocateCell (PREGISTRY_HIVE RegistryHive, } } - /* Need to extend hive file : */ + /* Need to extend hive file */ if (NewBlock == NULL) { /* Add a new block */ - if (!CmiAddBin(RegistryHive, (PVOID *)&NewBlock , pBlockOffset)) + if (!CmiAddBin(RegistryHive, + ((sizeof(HBIN) + CellSize - 1) / REG_BLOCK_SIZE) + 1, + (PVOID *)&NewBlock, + pBlockOffset)) return FALSE; } *Block = NewBlock; /* Split the block in two parts */ - if (NewBlock->CellSize > BlockSize) + if (NewBlock->CellSize > CellSize) { - NewBlock = (PCELL_HEADER) ((U32) NewBlock+BlockSize); - NewBlock->CellSize = ((PCELL_HEADER) (*Block))->CellSize - BlockSize; + NewBlock = (PCELL_HEADER) ((U32)NewBlock + CellSize); + NewBlock->CellSize = ((PCELL_HEADER) (*Block))->CellSize - CellSize; CmiAddFree (RegistryHive, NewBlock, - *pBlockOffset + BlockSize, + *pBlockOffset + CellSize, TRUE); } - else if (NewBlock->CellSize < BlockSize) + else if (NewBlock->CellSize < CellSize) { return FALSE; } - memset(*Block, 0, BlockSize); - ((PCELL_HEADER)(*Block))->CellSize = -BlockSize; + memset(*Block, 0, CellSize); + ((PCELL_HEADER)(*Block))->CellSize = -CellSize; return TRUE; } @@ -817,7 +827,7 @@ CmiGetCell (PREGISTRY_HIVE Hive, if (Bin == NULL) return NULL; - return (PVOID)((U32)Bin + (BlockOffset - Bin->BlockOffset)); + return (PVOID)((U32)Bin + (BlockOffset - Bin->BinOffset)); } @@ -1561,7 +1571,7 @@ RegImportBinaryHive(PCHAR ChunkBase, RootBin = (PHBIN)((U32)HiveHeader + REG_BLOCK_SIZE); DbgPrint((DPRINT_REGISTRY, "RootBin: %x\n", RootBin)); - if (RootBin->BlockId != REG_BIN_ID || RootBin->BlockSize == 0) + if (RootBin->HeaderId != REG_BIN_ID || RootBin->BinSize == 0) { DbgPrint((DPRINT_REGISTRY, "Invalid bin id!\n")); return FALSE; diff --git a/reactos/tools/mkhive/binhive.c b/reactos/tools/mkhive/binhive.c index bf0413361d2..fd6fd63c232 100644 --- a/reactos/tools/mkhive/binhive.c +++ b/reactos/tools/mkhive/binhive.c @@ -1,6 +1,6 @@ /* * ReactOS kernel - * Copyright (C) 2003 ReactOS Team + * Copyright (C) 2003, 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 @@ -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: binhive.c,v 1.9 2004/01/08 14:57:17 ekohl Exp $ +/* $Id: binhive.c,v 1.10 2004/05/09 14:50:09 ekohl Exp $ * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS hive maker * FILE: tools/mkhive/binhive.c @@ -110,13 +110,13 @@ typedef struct _HIVE_HEADER typedef struct _HBIN { /* Bin identifier "hbin" (0x6E696268) */ - ULONG BlockId; + ULONG HeaderId; /* Block offset of this bin */ - BLOCK_OFFSET BlockOffset; + BLOCK_OFFSET BinOffset; /* Size in bytes, multiple of the block size (4KB) */ - ULONG BlockSize; + ULONG BinSize; /* ? */ ULONG Unused1; @@ -297,9 +297,9 @@ CmiCreateDefaultBinCell(PHBIN BinCell) { assert (BinCell); memset (BinCell, 0, REG_BLOCK_SIZE); - BinCell->BlockId = REG_BIN_ID; + BinCell->HeaderId = REG_BIN_ID; BinCell->DateModified = 0ULL; - BinCell->BlockSize = REG_BLOCK_SIZE; + BinCell->BinSize = REG_BLOCK_SIZE; } @@ -409,7 +409,7 @@ CmiCreateRegistryHive (PCHAR KeyName) /* Init first bin */ BinCell = (PHBIN)Hive->BlockList[0]; CmiCreateDefaultBinCell (BinCell); - BinCell->BlockOffset = 0; + BinCell->BinOffset = 0; /* Init root key cell */ RootKeyCell = (PKEY_CELL)((ULONG_PTR)BinCell + REG_HBIN_DATA_OFFSET); @@ -498,7 +498,7 @@ CmiGetCell (PREGISTRY_HIVE Hive, if (ppBin) *ppBin = pBin; - return (PVOID)((ULONG_PTR)pBin + (BlockOffset - pBin->BlockOffset)); + return (PVOID)((ULONG_PTR)pBin + (BlockOffset - pBin->BinOffset)); } @@ -524,8 +524,8 @@ CmiMergeFree(PREGISTRY_HIVE RegistryHive, if (Bin == NULL) return FALSE; - BinOffset = Bin->BlockOffset; - BinSize = Bin->BlockSize; + BinOffset = Bin->BinOffset; + BinSize = Bin->BinSize; DPRINT("Bin %p Offset %lx Size %lx\n", Bin, BinOffset, BinSize); for (i = 0; i < RegistryHive->FreeListSize; i++) @@ -702,30 +702,34 @@ CmiAddFree(PREGISTRY_HIVE RegistryHive, static BOOL CmiAddBin(PREGISTRY_HIVE RegistryHive, + ULONG BlockCount, PVOID *NewBlock, PBLOCK_OFFSET NewBlockOffset) { PCELL_HEADER tmpBlock; PHBIN * tmpBlockList; PHBIN tmpBin; + ULONG BinSize; + ULONG i; - tmpBin = malloc (REG_BLOCK_SIZE); + BinSize = BlockCount *REG_BLOCK_SIZE; + tmpBin = malloc (BinSize); if (tmpBin == NULL) { return FALSE; } - memset (tmpBin, 0, REG_BLOCK_SIZE); + memset (tmpBin, 0, BinSize); - tmpBin->BlockId = REG_BIN_ID; - tmpBin->BlockOffset = RegistryHive->FileSize - REG_BLOCK_SIZE; - RegistryHive->FileSize += REG_BLOCK_SIZE; - tmpBin->BlockSize = REG_BLOCK_SIZE; + tmpBin->HeaderId = REG_BIN_ID; + tmpBin->BinOffset = RegistryHive->FileSize - REG_BLOCK_SIZE; + RegistryHive->FileSize += BinSize; + tmpBin->BinSize = BinSize; tmpBin->Unused1 = 0; tmpBin->DateModified = 0ULL; tmpBin->Unused2 = 0; /* Increase size of list of blocks */ - tmpBlockList = malloc (sizeof(PHBIN) * (RegistryHive->BlockListSize + 1)); + tmpBlockList = malloc (sizeof(PHBIN) * (RegistryHive->BlockListSize + BlockCount)); if (tmpBlockList == NULL) { free (tmpBin); @@ -741,7 +745,9 @@ CmiAddBin(PREGISTRY_HIVE RegistryHive, } RegistryHive->BlockList = tmpBlockList; - RegistryHive->BlockList[RegistryHive->BlockListSize++] = tmpBin; + for (i = 0; i < BlockCount; i++) + RegistryHive->BlockList[RegistryHive->BlockListSize + i] = tmpBin; + RegistryHive->BlockListSize += BlockCount; /* Initialize a free block in this heap : */ tmpBlock = (PCELL_HEADER)((ULONG_PTR) tmpBin + REG_HBIN_DATA_OFFSET); @@ -750,7 +756,7 @@ CmiAddBin(PREGISTRY_HIVE RegistryHive, *NewBlock = (PVOID) tmpBlock; if (NewBlockOffset) - *NewBlockOffset = tmpBin->BlockOffset + REG_HBIN_DATA_OFFSET; + *NewBlockOffset = tmpBin->BinOffset + REG_HBIN_DATA_OFFSET; return TRUE; } @@ -758,7 +764,7 @@ CmiAddBin(PREGISTRY_HIVE RegistryHive, static BOOL CmiAllocateCell (PREGISTRY_HIVE RegistryHive, - LONG BlockSize, + LONG CellSize, PVOID *Block, PBLOCK_OFFSET pBlockOffset) { @@ -768,13 +774,13 @@ CmiAllocateCell (PREGISTRY_HIVE RegistryHive, *Block = NULL; /* Round to 16 bytes multiple */ - BlockSize = ROUND_UP(BlockSize, 16); + CellSize = ROUND_UP(CellSize, 16); /* first search in free blocks */ NewBlock = NULL; for (i = 0; i < RegistryHive->FreeListSize; i++) { - if (RegistryHive->FreeList[i]->CellSize >= BlockSize) + if (RegistryHive->FreeList[i]->CellSize >= CellSize) { NewBlock = RegistryHive->FreeList[i]; if (pBlockOffset) @@ -800,29 +806,32 @@ CmiAllocateCell (PREGISTRY_HIVE RegistryHive, if (NewBlock == NULL) { /* Add a new block */ - if (!CmiAddBin(RegistryHive, (PVOID *)&NewBlock , pBlockOffset)) + if (!CmiAddBin(RegistryHive, + ((sizeof(HBIN) + CellSize - 1) / REG_BLOCK_SIZE) + 1, + (PVOID *)&NewBlock, + pBlockOffset)) return FALSE; } *Block = NewBlock; /* Split the block in two parts */ - if (NewBlock->CellSize > BlockSize) + if (NewBlock->CellSize > CellSize) { - NewBlock = (PCELL_HEADER) ((ULONG_PTR) NewBlock+BlockSize); - NewBlock->CellSize = ((PCELL_HEADER) (*Block))->CellSize - BlockSize; + NewBlock = (PCELL_HEADER) ((ULONG_PTR) NewBlock + CellSize); + NewBlock->CellSize = ((PCELL_HEADER) (*Block))->CellSize - CellSize; CmiAddFree (RegistryHive, NewBlock, - *pBlockOffset + BlockSize, + *pBlockOffset + CellSize, TRUE); } - else if (NewBlock->CellSize < BlockSize) + else if (NewBlock->CellSize < CellSize) { return FALSE; } - memset(*Block, 0, BlockSize); - ((PCELL_HEADER)(*Block))->CellSize = -BlockSize; + memset(*Block, 0, CellSize); + ((PCELL_HEADER)(*Block))->CellSize = -CellSize; return TRUE; } @@ -1369,7 +1378,7 @@ CmiWriteHive(PREGISTRY_HIVE Hive, DPRINT ("Bin[%lu]: Offset 0x%lx Size 0x%lx\n", i, Bin->BlockOffset, Bin->BlockSize); - fwrite (Bin, Bin->BlockSize, 1, File); + fwrite (Bin, Bin->BinSize, 1, File); } } From ad4971034864d732c6484c855200901a81d8c20e Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sun, 9 May 2004 14:50:50 +0000 Subject: [PATCH 1070/1463] - Set the correct cdb length for the mode sens command in CdromClassCreateDeviceObject. svn path=/trunk/; revision=9338 --- reactos/drivers/storage/cdrom/cdrom.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/storage/cdrom/cdrom.c b/reactos/drivers/storage/cdrom/cdrom.c index 12a08e44348..2ff4c6a88c1 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.27 2004/02/29 12:26:09 hbirr Exp $ +/* $Id: cdrom.c,v 1.28 2004/05/09 14:50:50 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -675,7 +675,6 @@ CdromClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, if (!(CdromData->XaFlags & XA_NOT_SUPPORTED)) { RtlZeroMemory (&Srb, sizeof(SCSI_REQUEST_BLOCK)); - Srb.CdbLength = 10; Srb.TimeOutValue = DiskDeviceExtension->TimeOutValue; Cdb = (PCDB)Srb.Cdb; @@ -684,6 +683,7 @@ CdromClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, /* Try the 10 byte version */ Length = sizeof(MODE_CAPABILITIES_PAGE2) + MODE_HEADER_LENGTH10; + Srb.CdbLength = 10; Cdb->MODE_SENSE10.OperationCode = SCSIOP_MODE_SENSE10; Cdb->MODE_SENSE10.PageCode = 0x2a; Cdb->MODE_SENSE10.AllocationLength[0] = (UCHAR)(Length >> 8); @@ -693,6 +693,7 @@ CdromClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, { Length = sizeof(MODE_CAPABILITIES_PAGE2) + MODE_HEADER_LENGTH; + Srb.CdbLength = 6; Cdb->MODE_SENSE.OperationCode = SCSIOP_MODE_SENSE; Cdb->MODE_SENSE.PageCode = 0x2a; Cdb->MODE_SENSE.AllocationLength = (UCHAR)Length; From c1574ff8d10b30efdeb2124888bd9399c0d7b8e0 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sun, 9 May 2004 15:02:07 +0000 Subject: [PATCH 1071/1463] - Put the event from file object as user event into the irp in IopCloseFile and IopDeleteFile. This is necessary because the event from fileobject isn't set automatically after a close/cleanup call. svn path=/trunk/; revision=9339 --- reactos/ntoskrnl/io/iomgr.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/io/iomgr.c b/reactos/ntoskrnl/io/iomgr.c index 4a09a3e839a..38e50eed502 100644 --- a/reactos/ntoskrnl/io/iomgr.c +++ b/reactos/ntoskrnl/io/iomgr.c @@ -1,4 +1,4 @@ -/* $Id: iomgr.c,v 1.47 2004/05/02 19:33:50 ekohl Exp $ +/* $Id: iomgr.c,v 1.48 2004/05/09 15:02:07 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -78,7 +78,7 @@ IopCloseFile(PVOID ObjectBody, NULL, 0, NULL, - NULL, + &FileObject->Event, NULL); StackPtr = IoGetNextIrpStackLocation(Irp); StackPtr->FileObject = FileObject; @@ -117,7 +117,7 @@ IopDeleteFile(PVOID ObjectBody) NULL, 0, NULL, - NULL, + &FileObject->Event, NULL); Irp->Flags |= IRP_CLOSE_OPERATION; StackPtr = IoGetNextIrpStackLocation(Irp); From 37af37614a3fd567ff94492b03f631c181d15614 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 10 May 2004 07:44:43 +0000 Subject: [PATCH 1072/1463] Royce3: fixed compiling issues with g++ svn path=/trunk/; revision=9340 --- reactos/tools/cabman/cabinet.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/tools/cabman/cabinet.cxx b/reactos/tools/cabman/cabinet.cxx index b45186bd95c..71878057e32 100755 --- a/reactos/tools/cabman/cabinet.cxx +++ b/reactos/tools/cabman/cabinet.cxx @@ -1471,7 +1471,7 @@ unsigned long CCabinet::WriteFileToScratchStorage(PCFFILE_NODE FileNode) return CAB_STATUS_INVALID_CAB; } - (unsigned char*)CurrentIBuffer += BytesRead; + *(unsigned char**)&CurrentIBuffer += BytesRead; CurrentIBufferSize += (unsigned short)BytesRead; @@ -3031,7 +3031,7 @@ unsigned long CCabinet::WriteDataBlock() CurrentFolderNode->TotalFolderSize += (BytesWritten + sizeof(CFDATA)); CurrentFolderNode->Folder.DataBlockCount++; - (unsigned char*)CurrentOBuffer += DataNode->Data.CompSize; + *(unsigned char**)&CurrentOBuffer += DataNode->Data.CompSize; CurrentOBufferSize -= DataNode->Data.CompSize; LastBlockStart += DataNode->Data.UncompSize; From 7177d62015ad64efc493a5840d329379d4f2d745 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Mon, 10 May 2004 10:51:36 +0000 Subject: [PATCH 1073/1463] Skip leading comment lines svn path=/trunk/; revision=9341 --- reactos/tools/depends.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/reactos/tools/depends.c b/reactos/tools/depends.c index b157a5ee5ac..ed73b03d58a 100644 --- a/reactos/tools/depends.c +++ b/reactos/tools/depends.c @@ -27,6 +27,18 @@ int main(int argc, char* argv[]) } i = 0; + while ((ch = fgetc(stdin)) == '#') + { + while ((ch = fgetc(stdin)) != '\n' && ch != EOF) + { + } + } + if (ch != EOF) + { + buf[i] = ch; + i++; + } + while ((ch = fgetc(stdin)) != ':' && ch != EOF) { buf[i] = ch; From a2c82e32833840e169e5505b144caf91393f3e31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Mon, 10 May 2004 11:13:15 +0000 Subject: [PATCH 1074/1463] Avoid collision with compiler generated label svn path=/trunk/; revision=9342 --- reactos/hal/halx86/timer.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reactos/hal/halx86/timer.c b/reactos/hal/halx86/timer.c index 3bb7c436e8e..05255bebaca 100644 --- a/reactos/hal/halx86/timer.c +++ b/reactos/hal/halx86/timer.c @@ -20,7 +20,7 @@ * MA 02139, USA. * */ -/* $Id: timer.c,v 1.3 2004/01/12 22:36:04 gvg Exp $ +/* $Id: timer.c,v 1.4 2004/05/10 11:13:15 gvg Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/hal/x86/udelay.c @@ -109,14 +109,14 @@ __KeStallExecutionProcessor(ULONG Loops) #if defined(__GNUC__) __asm__ __volatile__ ( "mov %0, %%eax\n" - "L1: dec %%eax\n" - "jnz L1" : : "d" (Loops)); + "ROSL1: dec %%eax\n" + "jnz ROSL1" : : "d" (Loops)); #elif defined(_MSC_VER) __asm mov eax, Loops -L1: +ROSL1: __asm dec eax - __asm jnz L1 + __asm jnz ROSL1 #else volatile unsigned int target = Loops; unsigned int i; From cf6301c2d62f8547487c6d594f4ca86afe79259a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Mon, 10 May 2004 11:56:07 +0000 Subject: [PATCH 1075/1463] Avoid warnings when using gcc 3.4 svn path=/trunk/; revision=9343 --- reactos/lib/crtdll/stdio/fflush.c | 2 +- reactos/lib/crtdll/stdio/getc.c | 9 +++++---- reactos/lib/crtdll/stdio/putc.c | 3 ++- reactos/lib/msafd/misc/helpers.c | 32 +++++++++++++++---------------- 4 files changed, 24 insertions(+), 22 deletions(-) diff --git a/reactos/lib/crtdll/stdio/fflush.c b/reactos/lib/crtdll/stdio/fflush.c index 4253114d422..83852e65747 100644 --- a/reactos/lib/crtdll/stdio/fflush.c +++ b/reactos/lib/crtdll/stdio/fflush.c @@ -36,7 +36,7 @@ int fflush(FILE *f) __set_errno(0); _fwalk((void (*)(FILE *))fflush); - if (_errno) + if (*_errno()) return EOF; __set_errno(e); return 0; diff --git a/reactos/lib/crtdll/stdio/getc.c b/reactos/lib/crtdll/stdio/getc.c index 4f7a4087a65..48161072e9c 100644 --- a/reactos/lib/crtdll/stdio/getc.c +++ b/reactos/lib/crtdll/stdio/getc.c @@ -40,19 +40,20 @@ int getc(FILE *fp) wint_t getwc(FILE *fp) { + wint_t c; // might check on multi bytes if text mode if(fp->_cnt > 0) { fp->_cnt -= sizeof(wchar_t); - return (wint_t )*((wchar_t *)(fp->_ptr))++; + c = *((wchar_t *)(fp->_ptr)); + fp->_ptr += sizeof(wchar_t); } else { - return _filwbuf(fp); + c = _filwbuf(fp); } - // never reached - return -1; + return c; } diff --git a/reactos/lib/crtdll/stdio/putc.c b/reactos/lib/crtdll/stdio/putc.c index e8b40cbc6df..f471f3afb7f 100644 --- a/reactos/lib/crtdll/stdio/putc.c +++ b/reactos/lib/crtdll/stdio/putc.c @@ -46,7 +46,8 @@ int putwc(wint_t c, FILE* fp) if (fp->_cnt > 0 ) { fp->_cnt-= sizeof(wchar_t); - *((wchar_t *)(fp->_ptr))++ = c; + *((wchar_t *)(fp->_ptr)) = c; + fp->_ptr += sizeof(wchar_t); return (wint_t)c; } else diff --git a/reactos/lib/msafd/misc/helpers.c b/reactos/lib/msafd/misc/helpers.c index 93b5bf72e46..3760e87712c 100644 --- a/reactos/lib/msafd/misc/helpers.c +++ b/reactos/lib/msafd/misc/helpers.c @@ -108,35 +108,35 @@ INT GetHelperDLLEntries( /* The following functions MUST be supported */ e = GetProcAddress(HelperDLL->hModule, "WSHEnumProtocols"); if (!e) return ERROR_BAD_PROVIDER; - ((PVOID) HelperDLL->EntryTable.lpWSHEnumProtocols) = e; + HelperDLL->EntryTable.lpWSHEnumProtocols = e; e = GetProcAddress(HelperDLL->hModule, "WSHGetSockaddrType"); if (!e) return ERROR_BAD_PROVIDER; - ((PVOID) HelperDLL->EntryTable.lpWSHGetSockaddrType) = e; + HelperDLL->EntryTable.lpWSHGetSockaddrType = e; e = GetProcAddress(HelperDLL->hModule, "WSHGetSocketInformation"); if (!e) return ERROR_BAD_PROVIDER; - ((PVOID) HelperDLL->EntryTable.lpWSHGetSocketInformation) = e; + HelperDLL->EntryTable.lpWSHGetSocketInformation = e; e = GetProcAddress(HelperDLL->hModule, "WSHGetWildcardSockaddr"); if (!e) return ERROR_BAD_PROVIDER; - ((PVOID) HelperDLL->EntryTable.lpWSHGetWildcardSockaddr) = e; + HelperDLL->EntryTable.lpWSHGetWildcardSockaddr = e; e = GetProcAddress(HelperDLL->hModule, "WSHGetWinsockMapping"); if (!e) return ERROR_BAD_PROVIDER; - ((PVOID) HelperDLL->EntryTable.lpWSHGetWinsockMapping) = e; + HelperDLL->EntryTable.lpWSHGetWinsockMapping = e; e = GetProcAddress(HelperDLL->hModule, "WSHNotify"); if (!e) return ERROR_BAD_PROVIDER; - ((PVOID) HelperDLL->EntryTable.lpWSHNotify) = e; + HelperDLL->EntryTable.lpWSHNotify = e; e = GetProcAddress(HelperDLL->hModule, "WSHOpenSocket"); if (!e) return ERROR_BAD_PROVIDER; - ((PVOID) HelperDLL->EntryTable.lpWSHOpenSocket) = e; + HelperDLL->EntryTable.lpWSHOpenSocket = e; e = GetProcAddress(HelperDLL->hModule, "WSHSetSocketInformation"); if (!e) return ERROR_BAD_PROVIDER; - ((PVOID) HelperDLL->EntryTable.lpWSHSetSocketInformation) = e; + HelperDLL->EntryTable.lpWSHSetSocketInformation = e; /* @@ -144,28 +144,28 @@ INT GetHelperDLLEntries( Whoever wants to call them, must check that the pointer is not NULL. */ e = GetProcAddress(HelperDLL->hModule, "WSHAddressToString"); - ((PVOID) HelperDLL->EntryTable.lpWSHAddressToString) = e; + HelperDLL->EntryTable.lpWSHAddressToString = e; e = GetProcAddress(HelperDLL->hModule, "WSHGetBroadcastSockaddr"); - ((PVOID) HelperDLL->EntryTable.lpWSHGetBroadcastSockaddr) = e; + HelperDLL->EntryTable.lpWSHGetBroadcastSockaddr = e; e = GetProcAddress(HelperDLL->hModule, "WSHGetProviderGuid"); - ((PVOID) HelperDLL->EntryTable.lpWSHGetProviderGuid) = e; + HelperDLL->EntryTable.lpWSHGetProviderGuid = e; e = GetProcAddress(HelperDLL->hModule, "WSHGetWSAProtocolInfo"); - ((PVOID) HelperDLL->EntryTable.lpWSHGetWSAProtocolInfo) = e; + HelperDLL->EntryTable.lpWSHGetWSAProtocolInfo = e; e = GetProcAddress(HelperDLL->hModule, "WSHIoctl"); - ((PVOID) HelperDLL->EntryTable.lpWSHIoctl) = e; + HelperDLL->EntryTable.lpWSHIoctl = e; e = GetProcAddress(HelperDLL->hModule, "WSHJoinLeaf"); - ((PVOID) HelperDLL->EntryTable.lpWSHJoinLeaf) = e; + HelperDLL->EntryTable.lpWSHJoinLeaf = e; e = GetProcAddress(HelperDLL->hModule, "WSHOpenSocket2"); - ((PVOID) HelperDLL->EntryTable.lpWSHOpenSocket2) = e; + HelperDLL->EntryTable.lpWSHOpenSocket2 = e; e = GetProcAddress(HelperDLL->hModule, "WSHStringToAddress"); - ((PVOID) HelperDLL->EntryTable.lpWSHStringToAddress) = e; + HelperDLL->EntryTable.lpWSHStringToAddress = e; return NO_ERROR; } From eca151dba345858ab90a95cd57773dbe5a2460b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Mon, 10 May 2004 12:21:22 +0000 Subject: [PATCH 1076/1463] Avoid warnings when using gcc 3.4 svn path=/trunk/; revision=9344 --- reactos/lib/user32/windows/class.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/lib/user32/windows/class.c b/reactos/lib/user32/windows/class.c index c220b4a5500..2625d70d974 100644 --- a/reactos/lib/user32/windows/class.c +++ b/reactos/lib/user32/windows/class.c @@ -1,4 +1,4 @@ -/* $Id: class.c,v 1.46 2004/04/09 20:03:14 navaraf Exp $ +/* $Id: class.c,v 1.47 2004/05/10 12:21:22 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -107,7 +107,7 @@ static BOOL GetClassInfoExCommon( if (unicode) lpwcx->lpszMenuName = heap_string_poolW ( str2.Buffer, str2.Length ); else - (LPWNDCLASSEXA) lpwcx->lpszMenuName = heap_string_poolA ( str2.Buffer, str2.Length ); + ((LPWNDCLASSEXA) lpwcx)->lpszMenuName = heap_string_poolA ( str2.Buffer, str2.Length ); } if ( !IS_ATOM(w.lpszClassName) && w.lpszClassName ) @@ -115,7 +115,7 @@ static BOOL GetClassInfoExCommon( if (unicode) lpwcx->lpszClassName = heap_string_poolW ( str3.Buffer, str3.Length ); else - (LPWNDCLASSEXA) lpwcx->lpszClassName = heap_string_poolA ( str3.Buffer, str3.Length ); + ((LPWNDCLASSEXA) lpwcx)->lpszClassName = heap_string_poolA ( str3.Buffer, str3.Length ); } HEAP_free ( str2.Buffer ); From dc5862b16e227972dfb57faadaef4b39e777a027 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 10 May 2004 12:34:44 +0000 Subject: [PATCH 1077/1463] Enable missing EnumDisplayMonitors. svn path=/trunk/; revision=9345 --- reactos/lib/user32/user32.edf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/user32/user32.edf b/reactos/lib/user32/user32.edf index 55f8ac223b0..fd639d04a55 100644 --- a/reactos/lib/user32/user32.edf +++ b/reactos/lib/user32/user32.edf @@ -212,7 +212,7 @@ EnumDesktopsA=EnumDesktopsA@12 EnumDesktopsW=EnumDesktopsW@12 EnumDisplayDevicesA=EnumDisplayDevicesA@16 EnumDisplayDevicesW=EnumDisplayDevicesW@16 -;EnumDisplayMonitors=EnumDisplayMonitors@16 +EnumDisplayMonitors=EnumDisplayMonitors@16 EnumDisplaySettingsA=EnumDisplaySettingsA@12 EnumDisplaySettingsExA=EnumDisplaySettingsExA@16 EnumDisplaySettingsExW=EnumDisplaySettingsExW@16 From 32478ebba8e8ed98430eabd9aa0500d33c44b416 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 10 May 2004 13:29:59 +0000 Subject: [PATCH 1078/1463] fixed compiling issues with gcc 3.4 svn path=/trunk/; revision=9346 --- reactos/lib/kbdfr/kbdfr.c | 70 +++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/reactos/lib/kbdfr/kbdfr.c b/reactos/lib/kbdfr/kbdfr.c index dc32fbd4572..dbc287acd54 100644 --- a/reactos/lib/kbdfr/kbdfr.c +++ b/reactos/lib/kbdfr/kbdfr.c @@ -241,12 +241,12 @@ ROSDATA VK_TO_WCHARS2 key_to_chars_2mod[] = { /* Specials */ /* Ctrl-_ generates US */ //{ VK_OEM_1 ,NOCAPS, '$', '' }, - { VK_OEM_5 ,NOCAPS, '*',L''}, - { VK_OEM_3 ,NOCAPS, L'', '%' }, + { VK_OEM_5 ,NOCAPS, '*',''}, + { VK_OEM_3 ,NOCAPS, '', '%' }, { VK_OEM_COMMA ,NOCAPS, ',', '?' }, { VK_OEM_PERIOD ,NOCAPS, ';', '.' }, { VK_OEM_2 ,NOCAPS, ':', '/' }, - { VK_OEM_8 ,NOCAPS, '!', L'' }, + { VK_OEM_8 ,NOCAPS, '!', '' }, /* Keys that do not have shift states */ { VK_TAB ,NOCAPS, '\t','\t'}, { VK_ADD ,NOCAPS, '+', '+' }, @@ -263,25 +263,25 @@ ROSDATA VK_TO_WCHARS3 key_to_chars_3mod[] = { /* Legacy (telnet-style) ascii escapes */ { VK_OEM_102, 0, '<', '>', 0x1c /* FS */ }, { VK_OEM_6, 0, WCH_DEAD, WCH_DEAD, WCH_NONE }, - { VK_EMPTY, 0, L'^', L'', WCH_NONE }, //OEM 6 DEAD - { VK_OEM_7, 0, L'','|', 0x1c /* FS */ }, + { VK_EMPTY, 0, '^', '', WCH_NONE }, //OEM 6 DEAD + { VK_OEM_7, 0, '','|', 0x1c /* FS */ }, { VK_RETURN,0, '\r', '\r', '\n' }, { 0,0 } }; ROSDATA VK_TO_WCHARS4 key_to_chars_4mod[] = { /* Normal, shifted, control, Alt+Gr */ - { '2' , 1, L'', '2', WCH_NONE, WCH_DEAD }, - { VK_EMPTY, 0, WCH_NONE, WCH_NONE, WCH_NONE, L'~' }, + { '2' , 1, '', '2', WCH_NONE, WCH_DEAD }, + { VK_EMPTY, 0, WCH_NONE, WCH_NONE, WCH_NONE, '~' }, { '3' , 0, '"', '3', WCH_NONE, '#' }, { '4' , 0, '\'', '4', WCH_NONE, '{' }, - { '7' , 1, L'', '7', WCH_NONE, WCH_DEAD }, - { VK_EMPTY, 0, WCH_NONE, WCH_NONE, WCH_NONE, L'`' }, - { '9' , 1, L'', '9', WCH_NONE, L'^' }, - { '0' , 1, L'', '0', WCH_NONE, '@' }, + { '7' , 1, '', '7', WCH_NONE, WCH_DEAD }, + { VK_EMPTY, 0, WCH_NONE, WCH_NONE, WCH_NONE, '`' }, + { '9' , 1, '', '9', WCH_NONE, '^' }, + { '0' , 1, '', '0', WCH_NONE, '@' }, { VK_OEM_PLUS,0, '=', '+', WCH_NONE, '}' }, - { 'E' , 1, 'e', 'E', WCH_NONE, L'' /* euro */ }, - { VK_OEM_1, 0, '$', L'', WCH_NONE, L'' }, + { 'E' , 1, 'e', 'E', WCH_NONE, '' /* euro */ }, + { VK_OEM_1, 0, '$', '', WCH_NONE, '' }, { VK_OEM_4, 0, ')', '', WCH_NONE, ']' }, { 0, 0 } }; @@ -326,30 +326,30 @@ ROSDATA VK_TO_WCHAR_TABLE vk_to_wchar_master_table[] = { { 0,0,0 } }; -#define DK(l,a) (l | a <<16) +#define DEADTRANS(ch, accent, comp, flags) MAKELONG(ch, accent), comp, flags ROSDATA DEADKEY deadkey[] = { - { DK('a',L''), L'' , 0 }, - { DK('e',L''), L'' , 0 }, - { DK('i',L''), L'' , 0 }, - { DK('o',L''), L'' , 0 }, - { DK('u',L''), L'' , 0 }, - { DK(' ',L''), L'' , 0 }, - { DK('a',L'^'), L'' , 0 }, - { DK(L'^',L'e'), L'' , 0 }, - { DK('i',L'^'), L'' , 0 }, - { DK('o',L'^'), L'' , 0 }, - { DK('u',L'^'), L'' , 0 }, - { DK(' ',L'^'), L'^' , 0 }, - { DK('a',L'`'), L'' , 0 }, - { DK('e',L'`'), L'' , 0 }, - { DK('i',L'`'), L'' , 0 }, - { DK('o',L'`'), L'' , 0 }, - { DK('u',L'`'), L'' , 0 }, - { DK(' ',L'`'), L'`' , 0 }, - { DK('n',L'~'), L'' , 0 }, - { DK(' ',L'~'), L'~' , 0 }, - { 0,0 ,0,} + { DEADTRANS(0x0061, 0x00A8, 0x00E4, 0x0000) }, + { DEADTRANS(0x0065, 0x00A8, 0x00EB, 0x0000) }, + { DEADTRANS(0x0069, 0x00A8, 0x00EF, 0x0000) }, + { DEADTRANS(0x006F, 0x00A8, 0x00F6, 0x0000) }, + { DEADTRANS(0x0075, 0x00A8, 0x00FC, 0x0000) }, + { DEADTRANS(0x0020, 0x00A8, 0x00A8, 0x0000) }, + { DEADTRANS(0x0061, 0x005E, 0x00E2, 0x0000) }, + { DEADTRANS(0x005E, 0x0065, 0x00EA, 0x0000) }, + { DEADTRANS(0x0069, 0x005E, 0x00EE, 0x0000) }, + { DEADTRANS(0x006F, 0x005E, 0x00F4, 0x0000) }, + { DEADTRANS(0x0075, 0x005E, 0x00FB, 0x0000) }, + { DEADTRANS(0x0020, 0x005E, 0x005E, 0x0000) }, + { DEADTRANS(0x0061, 0x0060, 0x00E0, 0x0000) }, + { DEADTRANS(0x0065, 0x0060, 0x00E8, 0x0000) }, + { DEADTRANS(0x0069, 0x0060, 0x00EC, 0x0000) }, + { DEADTRANS(0x006F, 0x0060, 0x00F2, 0x0000) }, + { DEADTRANS(0x0075, 0x0060, 0x00F9, 0x0000) }, + { DEADTRANS(0x0020, 0x0060, 0x0060, 0x0000) }, + { DEADTRANS(0x006E, 0x007E, 0x00F1, 0x0000) }, + { DEADTRANS(0x0020, 0x007E, 0x007E, 0x0000) }, + { 0, 0, 0} }; From 23dcd0a6f2399e39b549a5875ab379cb1c692f8a Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 10 May 2004 13:35:28 +0000 Subject: [PATCH 1079/1463] fixed compiling issues with gcc 3.4 svn path=/trunk/; revision=9347 --- reactos/subsys/win32k/objects/bezier.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/reactos/subsys/win32k/objects/bezier.c b/reactos/subsys/win32k/objects/bezier.c index 896bd785efb..415b7a2779d 100644 --- a/reactos/subsys/win32k/objects/bezier.c +++ b/reactos/subsys/win32k/objects/bezier.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: bezier.c,v 1.6 2004/03/27 00:35:02 weiden Exp $ */ +/* $Id: bezier.c,v 1.7 2004/05/10 13:35:28 weiden Exp $ */ #include #include #include @@ -65,14 +65,6 @@ (Mid).x=((P1).x+(P2).x + 1) >> 1;\ (Mid).y=((P1).y+(P2).y + 1) >> 1; -static int abs ( int __x ) -{ - if ( __x < 0 ) - return -__x; - else - return __x; -} - /********************************************************** * BezierCheck helper function to check * that recursion can be terminated From 418b7e53a64b99c7c293ff906fca2f9277dbdc24 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 10 May 2004 17:07:20 +0000 Subject: [PATCH 1080/1463] use a common header for most files in win32k to make use of precompiled headers svn path=/trunk/; revision=9348 --- reactos/include/win32k/kapi.h | 1 - reactos/subsys/win32k/dib/dib.c | 10 +-- reactos/subsys/win32k/dib/dib.h | 5 ++ reactos/subsys/win32k/dib/dib16bpp.c | 15 +--- reactos/subsys/win32k/dib/dib1bpp.c | 15 +--- reactos/subsys/win32k/dib/dib24bpp.c | 14 +--- reactos/subsys/win32k/dib/dib32bpp.c | 14 +--- reactos/subsys/win32k/dib/dib4bpp.c | 14 +--- reactos/subsys/win32k/dib/dib8bpp.c | 14 +--- reactos/subsys/win32k/eng/bitblt.c | 22 +----- reactos/subsys/win32k/eng/brush.c | 5 +- reactos/subsys/win32k/eng/clip.c | 12 +--- reactos/subsys/win32k/eng/copybits.c | 12 +--- reactos/subsys/win32k/eng/debug.c | 5 +- reactos/subsys/win32k/eng/device.c | 10 +-- reactos/subsys/win32k/eng/error.c | 3 +- reactos/subsys/win32k/eng/event.c | 15 +--- reactos/subsys/win32k/eng/float.c | 16 +---- reactos/subsys/win32k/eng/gradient.c | 22 +----- reactos/subsys/win32k/eng/handle.c | 9 +-- reactos/subsys/win32k/eng/lineto.c | 17 +---- reactos/subsys/win32k/eng/mem.c | 13 +--- reactos/subsys/win32k/eng/misc.c | 9 +-- reactos/subsys/win32k/eng/mouse.c | 26 +------ reactos/subsys/win32k/eng/nls.c | 7 +- reactos/subsys/win32k/eng/paint.c | 19 +---- reactos/subsys/win32k/eng/palette.c | 11 +-- reactos/subsys/win32k/eng/perfcnt.c | 9 +-- reactos/subsys/win32k/eng/semaphor.c | 12 +--- reactos/subsys/win32k/eng/sort.c | 6 +- reactos/subsys/win32k/eng/surface.c | 15 +--- reactos/subsys/win32k/eng/transblt.c | 21 +----- reactos/subsys/win32k/eng/xlate.c | 15 +--- reactos/subsys/win32k/include/intgdi.h | 15 ++-- reactos/subsys/win32k/include/path.h | 11 --- reactos/subsys/win32k/main/dllmain.c | 35 +--------- reactos/subsys/win32k/main/svctabm.c | 3 +- reactos/subsys/win32k/makefile | 7 +- reactos/subsys/win32k/ntddraw/ddraw.c | 1 + reactos/subsys/win32k/ntddraw/stubs.c | 1 + reactos/subsys/win32k/ntuser/accelerator.c | 16 +---- reactos/subsys/win32k/ntuser/callback.c | 13 +--- reactos/subsys/win32k/ntuser/caret.c | 13 +--- reactos/subsys/win32k/ntuser/class.c | 15 +--- reactos/subsys/win32k/ntuser/clipboard.c | 9 +-- reactos/subsys/win32k/ntuser/desktop.c | 23 +----- reactos/subsys/win32k/ntuser/focus.c | 12 +--- reactos/subsys/win32k/ntuser/guicheck.c | 11 +-- reactos/subsys/win32k/ntuser/hook.c | 14 +--- reactos/subsys/win32k/ntuser/hotkey.c | 11 +-- reactos/subsys/win32k/ntuser/input.c | 17 +---- reactos/subsys/win32k/ntuser/keyboard.c | 16 +---- reactos/subsys/win32k/ntuser/menu.c | 15 +--- reactos/subsys/win32k/ntuser/message.c | 19 +---- reactos/subsys/win32k/ntuser/metric.c | 11 +-- reactos/subsys/win32k/ntuser/misc.c | 28 +------- reactos/subsys/win32k/ntuser/msgqueue.c | 18 +---- reactos/subsys/win32k/ntuser/painting.c | 23 +----- reactos/subsys/win32k/ntuser/prop.c | 17 +---- reactos/subsys/win32k/ntuser/scrollbar.c | 17 +---- reactos/subsys/win32k/ntuser/timer.c | 15 +--- reactos/subsys/win32k/ntuser/useratom.c | 5 +- reactos/subsys/win32k/ntuser/vis.c | 8 +-- reactos/subsys/win32k/ntuser/windc.c | 17 +---- reactos/subsys/win32k/ntuser/window.c | 31 +-------- reactos/subsys/win32k/ntuser/winpos.c | 22 +----- reactos/subsys/win32k/ntuser/winsta.c | 23 +----- reactos/subsys/win32k/objects/bezier.c | 8 +-- reactos/subsys/win32k/objects/bitmaps.c | 30 +++----- reactos/subsys/win32k/objects/brush.c | 16 +---- reactos/subsys/win32k/objects/cliprgn.c | 18 +---- reactos/subsys/win32k/objects/color.c | 23 +----- reactos/subsys/win32k/objects/coord.c | 13 +--- reactos/subsys/win32k/objects/cursoricon.c | 31 +-------- reactos/subsys/win32k/objects/dc.c | 38 +--------- reactos/subsys/win32k/objects/dib.c | 23 +----- reactos/subsys/win32k/objects/fillshap.c | 26 +------ reactos/subsys/win32k/objects/gdiobj.c | 23 +----- reactos/subsys/win32k/objects/icm.c | 11 +-- reactos/subsys/win32k/objects/line.c | 22 +----- reactos/subsys/win32k/objects/metafile.c | 11 +-- reactos/subsys/win32k/objects/objconv.c | 23 +----- reactos/subsys/win32k/objects/paint.c | 12 +--- reactos/subsys/win32k/objects/palette.c | 16 +---- reactos/subsys/win32k/objects/path.c | 33 ++++----- reactos/subsys/win32k/objects/pen.c | 14 +--- reactos/subsys/win32k/objects/polyfill.c | 16 +---- reactos/subsys/win32k/objects/print.c | 16 +---- reactos/subsys/win32k/objects/rect.c | 11 +-- reactos/subsys/win32k/objects/region.c | 21 +----- reactos/subsys/win32k/objects/text.c | 27 +------- reactos/subsys/win32k/objects/wingl.c | 11 +-- reactos/subsys/win32k/w32k.h | 81 ++++++++++++++++++++++ 93 files changed, 290 insertions(+), 1209 deletions(-) create mode 100644 reactos/subsys/win32k/w32k.h diff --git a/reactos/include/win32k/kapi.h b/reactos/include/win32k/kapi.h index 8078b8b26e3..7e6c30f2cb3 100644 --- a/reactos/include/win32k/kapi.h +++ b/reactos/include/win32k/kapi.h @@ -1,6 +1,5 @@ #ifndef _WIN32K_KAPI_H #define _WIN32K_KAPI_H -#include #include #include #include diff --git a/reactos/subsys/win32k/dib/dib.c b/reactos/subsys/win32k/dib/dib.c index 5023165be5a..e7a62938f18 100644 --- a/reactos/subsys/win32k/dib/dib.c +++ b/reactos/subsys/win32k/dib/dib.c @@ -16,14 +16,8 @@ * 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.9 2004/04/06 21:53:48 weiden Exp $ */ - -#include -#include -#include -#include -#include "../eng/objects.h" -#include "dib.h" +/* $Id: dib.c,v 1.10 2004/05/10 17:07:16 weiden Exp $ */ +#include /* Static data */ diff --git a/reactos/subsys/win32k/dib/dib.h b/reactos/subsys/win32k/dib/dib.h index 55ab9d52ed3..dad5d27f9c6 100644 --- a/reactos/subsys/win32k/dib/dib.h +++ b/reactos/subsys/win32k/dib/dib.h @@ -1,3 +1,6 @@ +#ifndef _W32K_DIB_DIB_H +#define _W32K_DIB_DIB_H + extern unsigned char notmask[2]; extern unsigned char altnotmask[2]; #define MASK1BPP(x) (1<<(7-((x)&7))) @@ -119,3 +122,5 @@ BOOLEAN DIB_32BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, RECTL* DestRect, POINTL *SourcePoint, XLATEOBJ *ColorTranslation, ULONG iTransColor); +#endif /* _W32K_DIB_DIB_H */ + diff --git a/reactos/subsys/win32k/dib/dib16bpp.c b/reactos/subsys/win32k/dib/dib16bpp.c index 83b7498b45c..abeafbd808d 100644 --- a/reactos/subsys/win32k/dib/dib16bpp.c +++ b/reactos/subsys/win32k/dib/dib16bpp.c @@ -16,19 +16,8 @@ * 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.30 2004/04/25 11:34:12 weiden Exp $ */ -#undef WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "../eng/objects.h" -#include "dib.h" +/* $Id: dib16bpp.c,v 1.31 2004/05/10 17:07:17 weiden Exp $ */ +#include VOID DIB_16BPP_PutPixel(SURFOBJ *SurfObj, LONG x, LONG y, ULONG c) diff --git a/reactos/subsys/win32k/dib/dib1bpp.c b/reactos/subsys/win32k/dib/dib1bpp.c index 6aab975bccb..795f2241df0 100644 --- a/reactos/subsys/win32k/dib/dib1bpp.c +++ b/reactos/subsys/win32k/dib/dib1bpp.c @@ -16,19 +16,8 @@ * 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.26 2004/05/01 09:04:37 gvg Exp $ */ - -#undef WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#include -#include -#include "../eng/objects.h" -#include "dib.h" +/* $Id: dib1bpp.c,v 1.27 2004/05/10 17:07:17 weiden Exp $ */ +#include VOID DIB_1BPP_PutPixel(SURFOBJ *SurfObj, LONG x, LONG y, ULONG c) diff --git a/reactos/subsys/win32k/dib/dib24bpp.c b/reactos/subsys/win32k/dib/dib24bpp.c index 2051be0d5ab..2e0cdb31754 100644 --- a/reactos/subsys/win32k/dib/dib24bpp.c +++ b/reactos/subsys/win32k/dib/dib24bpp.c @@ -16,18 +16,8 @@ * 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.25 2004/04/25 11:34:12 weiden Exp $ */ -#undef WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#include -#include -#include "../eng/objects.h" -#include "dib.h" +/* $Id: dib24bpp.c,v 1.26 2004/05/10 17:07:17 weiden Exp $ */ +#include VOID DIB_24BPP_PutPixel(SURFOBJ *SurfObj, LONG x, LONG y, ULONG c) diff --git a/reactos/subsys/win32k/dib/dib32bpp.c b/reactos/subsys/win32k/dib/dib32bpp.c index 5a886e8c523..577d3dc30b4 100644 --- a/reactos/subsys/win32k/dib/dib32bpp.c +++ b/reactos/subsys/win32k/dib/dib32bpp.c @@ -16,18 +16,8 @@ * 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.25 2004/04/25 11:34:12 weiden Exp $ */ -#undef WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#include -#include -#include "../eng/objects.h" -#include "dib.h" +/* $Id: dib32bpp.c,v 1.26 2004/05/10 17:07:17 weiden Exp $ */ +#include VOID DIB_32BPP_PutPixel(SURFOBJ *SurfObj, LONG x, LONG y, ULONG c) diff --git a/reactos/subsys/win32k/dib/dib4bpp.c b/reactos/subsys/win32k/dib/dib4bpp.c index a2762a45387..7fc52aa891e 100644 --- a/reactos/subsys/win32k/dib/dib4bpp.c +++ b/reactos/subsys/win32k/dib/dib4bpp.c @@ -16,18 +16,8 @@ * 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.33 2004/04/09 22:00:38 navaraf Exp $ */ -#undef WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#include -#include -#include "../eng/objects.h" -#include "dib.h" +/* $Id: dib4bpp.c,v 1.34 2004/05/10 17:07:17 weiden Exp $ */ +#include VOID DIB_4BPP_PutPixel(SURFOBJ *SurfObj, LONG x, LONG y, ULONG c) diff --git a/reactos/subsys/win32k/dib/dib8bpp.c b/reactos/subsys/win32k/dib/dib8bpp.c index c83aff8701b..ce217be3ec9 100644 --- a/reactos/subsys/win32k/dib/dib8bpp.c +++ b/reactos/subsys/win32k/dib/dib8bpp.c @@ -16,18 +16,8 @@ * 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.24 2004/04/30 23:42:20 navaraf Exp $ */ -#undef WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#include -#include -#include "../eng/objects.h" -#include "dib.h" +/* $Id: dib8bpp.c,v 1.25 2004/05/10 17:07:17 weiden Exp $ */ +#include VOID DIB_8BPP_PutPixel(SURFOBJ *SurfObj, LONG x, LONG y, ULONG c) diff --git a/reactos/subsys/win32k/eng/bitblt.c b/reactos/subsys/win32k/eng/bitblt.c index 76968a1e8ee..5db8f9de343 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.53 2004/04/30 14:22:44 weiden Exp $ +/* $Id: bitblt.c,v 1.54 2004/05/10 17:07:17 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -26,25 +26,7 @@ * REVISION HISTORY: * 2/10/1999: Created */ - -#include -#include -#include -#include -#include "brush.h" -#include "clip.h" -#include "objects.h" -#include "../dib/dib.h" -#include "misc.h" -#include -#include -#include -#include -#include -#include - -#define NDEBUG -#include +#include typedef BOOLEAN STDCALL (*PBLTRECTFUNC)(SURFOBJ* OutputObj, SURFGDI* OutputGDI, diff --git a/reactos/subsys/win32k/eng/brush.c b/reactos/subsys/win32k/eng/brush.c index 2093f1546b8..b18133409fc 100644 --- a/reactos/subsys/win32k/eng/brush.c +++ b/reactos/subsys/win32k/eng/brush.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: brush.c,v 1.10 2004/01/30 16:36:16 navaraf Exp $ +/* $Id: brush.c,v 1.11 2004/05/10 17:07:17 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -26,8 +26,7 @@ * REVISION HISTORY: * 3/7/1999: Created */ - -#include +#include /* * @implemented diff --git a/reactos/subsys/win32k/eng/clip.c b/reactos/subsys/win32k/eng/clip.c index 0eac12bb529..7aa2d0a9138 100644 --- a/reactos/subsys/win32k/eng/clip.c +++ b/reactos/subsys/win32k/eng/clip.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: clip.c,v 1.19 2004/04/09 20:03:16 navaraf Exp $ +/* $Id: clip.c,v 1.20 2004/05/10 17:07:17 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -26,15 +26,7 @@ * REVISION HISTORY: * 21/8/1999: Created */ - -#include -#include -#include "objects.h" -#include "clip.h" -#include - -#define NDEBUG -#include +#include VOID STDCALL IntEngDeleteClipRegion(CLIPOBJ *ClipObj) { diff --git a/reactos/subsys/win32k/eng/copybits.c b/reactos/subsys/win32k/eng/copybits.c index 7c5eb8885ca..445ce052dc1 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.23 2004/04/09 20:03:16 navaraf Exp $ +/* $Id: copybits.c,v 1.24 2004/05/10 17:07:17 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -26,15 +26,7 @@ * REVISION HISTORY: * 8/18/1999: Created */ - -#include -#include -#include "objects.h" -#include "clip.h" -#include "../dib/dib.h" -#include -#include -#include +#include /* * @implemented diff --git a/reactos/subsys/win32k/eng/debug.c b/reactos/subsys/win32k/eng/debug.c index cacc954f161..e6dae144b3e 100644 --- a/reactos/subsys/win32k/eng/debug.c +++ b/reactos/subsys/win32k/eng/debug.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: debug.c,v 1.7 2004/01/07 19:24:37 navaraf Exp $ +/* $Id: debug.c,v 1.8 2004/05/10 17:07:17 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -26,8 +26,7 @@ * REVISION HISTORY: * 11/7/1999: Created */ - -#include +#include /* * @implemented diff --git a/reactos/subsys/win32k/eng/device.c b/reactos/subsys/win32k/eng/device.c index cb2dafab17f..dc5d88e347e 100644 --- a/reactos/subsys/win32k/eng/device.c +++ b/reactos/subsys/win32k/eng/device.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: device.c,v 1.14 2004/03/14 18:36:14 dwelch Exp $ +/* $Id: device.c,v 1.15 2004/05/10 17:07:17 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -26,13 +26,7 @@ * REVISION HISTORY: * 3/7/1999: Created */ - -#include -#include -#include - -#define NDEBUG -#include +#include /* * @implemented diff --git a/reactos/subsys/win32k/eng/error.c b/reactos/subsys/win32k/eng/error.c index e2a9061bc77..7de6d966b0e 100644 --- a/reactos/subsys/win32k/eng/error.c +++ b/reactos/subsys/win32k/eng/error.c @@ -1,5 +1,4 @@ -#include -#include +#include /* * @implemented diff --git a/reactos/subsys/win32k/eng/event.c b/reactos/subsys/win32k/eng/event.c index 736c064a80e..d6fea78c2f4 100644 --- a/reactos/subsys/win32k/eng/event.c +++ b/reactos/subsys/win32k/eng/event.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: event.c,v 1.2 2004/04/09 20:03:16 navaraf Exp $ +/* $Id: event.c,v 1.3 2004/05/10 17:07:17 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -26,18 +26,7 @@ * REVISION HISTORY: * 2/10/1999: Created */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#define NDEBUG -#include +#include BOOL STDCALL diff --git a/reactos/subsys/win32k/eng/float.c b/reactos/subsys/win32k/eng/float.c index 69c4e2d36a5..f0a0583923c 100644 --- a/reactos/subsys/win32k/eng/float.c +++ b/reactos/subsys/win32k/eng/float.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: float.c,v 1.2 2004/04/09 20:03:16 navaraf Exp $ +/* $Id: float.c,v 1.3 2004/05/10 17:07:17 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -25,19 +25,7 @@ * PROGRAMER: Jason Filby * REVISION HISTORY: */ - -#include -#include -#include -#include -#include -#include -#include -#include "handle.h" -#include "../dib/dib.h" - -#define NDEBUG -#include +#include BOOL STDCALL diff --git a/reactos/subsys/win32k/eng/gradient.c b/reactos/subsys/win32k/eng/gradient.c index f649aab8967..99f9c150d0f 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.8 2004/04/09 20:03:16 navaraf Exp $ +/* $Id: gradient.c,v 1.9 2004/05/10 17:07:17 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -26,25 +26,7 @@ * REVISION HISTORY: * 3/7/1999: Created */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "objects.h" -#include -#include "../dib/dib.h" - -#include "brush.h" -#include "clip.h" - -//#define NDEBUG -#include +#include /* MACROS *********************************************************************/ diff --git a/reactos/subsys/win32k/eng/handle.c b/reactos/subsys/win32k/eng/handle.c index 94df1fe6f61..a61557330c2 100644 --- a/reactos/subsys/win32k/eng/handle.c +++ b/reactos/subsys/win32k/eng/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.14 2003/11/24 21:20:34 gvg Exp $ +/* $Id: handle.c,v 1.15 2004/05/10 17:07:17 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -26,12 +26,7 @@ * REVISION HISTORY: * 29/8/1999: Created */ - -#include -#include "handle.h" - -#define NDEBUG -#include +#include static int LastHandle = MAX_GDI_HANDLES; diff --git a/reactos/subsys/win32k/eng/lineto.c b/reactos/subsys/win32k/eng/lineto.c index e56130fb60b..20752865cc1 100644 --- a/reactos/subsys/win32k/eng/lineto.c +++ b/reactos/subsys/win32k/eng/lineto.c @@ -16,22 +16,9 @@ * 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.32 2004/04/09 20:03:16 navaraf Exp $ + * $Id: lineto.c,v 1.33 2004/05/10 17:07:17 weiden Exp $ */ - -#include -#include -#include -#include -#include -#include "clip.h" -#include "objects.h" -#include "../dib/dib.h" -#include "misc.h" - -#include -#include -#include +#include static void FASTCALL TranslateRects(RECT_ENUM *RectEnum, POINTL* Translate) diff --git a/reactos/subsys/win32k/eng/mem.c b/reactos/subsys/win32k/eng/mem.c index 551d5491c31..61524e3a4ee 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.15 2004/03/15 22:01:17 gvg Exp $ +/* $Id: mem.c,v 1.16 2004/05/10 17:07:17 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -27,16 +27,7 @@ * 3/7/1999: Created */ -#ifdef __USE_W32API -#include -#include -#endif -#include -#include - -#define NDEBUG -#include -#include +#include typedef struct _USERMEMHEADER { diff --git a/reactos/subsys/win32k/eng/misc.c b/reactos/subsys/win32k/eng/misc.c index a86549b7339..497dad6e487 100644 --- a/reactos/subsys/win32k/eng/misc.c +++ b/reactos/subsys/win32k/eng/misc.c @@ -16,13 +16,8 @@ * 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/04/09 20:03:16 navaraf Exp $ */ -#include -#include -#include -#include -#include "misc.h" -#include "objects.h" +/* $Id: misc.c,v 1.6 2004/05/10 17:07:17 weiden Exp $ */ +#include BOOL STDCALL IntEngEnter(PINTENG_ENTER_LEAVE EnterLeave, diff --git a/reactos/subsys/win32k/eng/mouse.c b/reactos/subsys/win32k/eng/mouse.c index ed9b2a23e84..94377ed8003 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.68 2004/05/01 08:55:04 weiden Exp $ +/* $Id: mouse.c,v 1.69 2004/05/10 17:07:17 weiden Exp $ * * PROJECT: ReactOS kernel * PURPOSE: Mouse @@ -26,29 +26,7 @@ * 06-06-2001 CSH Created */ /* INCLUDES ******************************************************************/ - -#include -#include -#include -#include -#include -#include "objects.h" -#include "include/msgqueue.h" -#include "include/object.h" -#include "include/winsta.h" -#include "include/desktop.h" -#include "include/window.h" -#include "include/cursoricon.h" -#include "include/callback.h" -#include "include/palette.h" -#include "include/inteng.h" -#include "include/eng.h" -#include "include/tags.h" -#include -#include - -#define NDEBUG -#include +#include /* FUNCTIONS *****************************************************************/ diff --git a/reactos/subsys/win32k/eng/nls.c b/reactos/subsys/win32k/eng/nls.c index bbd357d3c20..59b195dce1a 100644 --- a/reactos/subsys/win32k/eng/nls.c +++ b/reactos/subsys/win32k/eng/nls.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: nls.c,v 1.3 2004/04/09 20:03:16 navaraf Exp $ +/* $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 @@ -28,10 +28,7 @@ */ /* INCLUDES *****************************************************************/ - -#include -#include -#include +#include /* FUNCTIONS ****************************************************************/ diff --git a/reactos/subsys/win32k/eng/paint.c b/reactos/subsys/win32k/eng/paint.c index fcf7b45c5f5..83bade0c08d 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.18 2004/02/24 13:27:02 weiden Exp $ +/* $Id: paint.c,v 1.19 2004/05/10 17:07:17 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -27,22 +27,7 @@ * 3/7/1999: Created */ -#include -#include -#include -#include -#include -#include - -#include "objects.h" -#include -#include "../dib/dib.h" - -#include "brush.h" -#include "clip.h" - -//#define NDEBUG -#include +#include BOOL STDCALL FillSolid(SURFOBJ *Surface, PRECTL pRect, ULONG iColor) { diff --git a/reactos/subsys/win32k/eng/palette.c b/reactos/subsys/win32k/eng/palette.c index 5440d0f8ef1..e3330a4f486 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.20 2003/12/20 10:31:32 navaraf Exp $ +/* $Id: palette.c,v 1.21 2004/05/10 17:07:17 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -26,14 +26,7 @@ * REVISION HISTORY: * 11/7/1999: Created */ - -#include -#include -#include -#include "handle.h" - -#define NDEBUG -#include +#include /* * @implemented diff --git a/reactos/subsys/win32k/eng/perfcnt.c b/reactos/subsys/win32k/eng/perfcnt.c index d93a25060e8..80cd7733c68 100644 --- a/reactos/subsys/win32k/eng/perfcnt.c +++ b/reactos/subsys/win32k/eng/perfcnt.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: perfcnt.c,v 1.3 2003/07/11 15:59:37 royce Exp $ +/* $Id: perfcnt.c,v 1.4 2004/05/10 17:07:17 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -24,12 +24,7 @@ * FILE: subsys/win32k/eng/perfcnt.c * PROGRAMER: Ge van Geldorp */ - -#include - -#define NDEBUG -#include -#include +#include /* * @implemented diff --git a/reactos/subsys/win32k/eng/semaphor.c b/reactos/subsys/win32k/eng/semaphor.c index d01e5d6963d..3f93da7148c 100644 --- a/reactos/subsys/win32k/eng/semaphor.c +++ b/reactos/subsys/win32k/eng/semaphor.c @@ -1,14 +1,4 @@ - -#undef WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#include -#include "../eng/objects.h" -#include +#include /* * @implemented diff --git a/reactos/subsys/win32k/eng/sort.c b/reactos/subsys/win32k/eng/sort.c index e7ebe17da1f..90dcc2a0ab2 100644 --- a/reactos/subsys/win32k/eng/sort.c +++ b/reactos/subsys/win32k/eng/sort.c @@ -16,10 +16,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: sort.c,v 1.2 2003/07/12 14:00:05 gvg Exp $ */ - -#include -#include +/* $Id: sort.c,v 1.3 2004/05/10 17:07:17 weiden Exp $ */ +#include /* * @implemented diff --git a/reactos/subsys/win32k/eng/surface.c b/reactos/subsys/win32k/eng/surface.c index 1519fee2a04..acaa4dbfa8d 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.37 2004/04/09 20:03:16 navaraf Exp $ +/* $Id: surface.c,v 1.38 2004/05/10 17:07:17 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -30,18 +30,7 @@ * - Create a GDI bitmap with all formats, perform all drawing operations on them, render to VGA surface * refer to \test\microwin\src\engine\devdraw.c for info on correct pixel plotting for various formats */ - -#include -#include -#include -#include -#include -#include -#include "handle.h" -#include "../dib/dib.h" - -#define NDEBUG -#include +#include enum Rle_EscapeCodes { diff --git a/reactos/subsys/win32k/eng/transblt.c b/reactos/subsys/win32k/eng/transblt.c index 100c968b645..8ba54fe267f 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.17 2004/04/09 20:03:18 navaraf Exp $ +/* $Id: transblt.c,v 1.18 2004/05/10 17:07:17 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -26,24 +26,7 @@ * REVISION HISTORY: * 4/6/2004: Created */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "brush.h" -#include "clip.h" -#include "objects.h" - -#define NDEBUG -#include +#include BOOL STDCALL diff --git a/reactos/subsys/win32k/eng/xlate.c b/reactos/subsys/win32k/eng/xlate.c index c139b944273..794275192bf 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.33 2004/04/28 18:38:07 navaraf Exp $ +/* $Id: xlate.c,v 1.34 2004/05/10 17:07:17 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -26,21 +26,10 @@ * 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 -#include -#include - -#include -#include -#include "handle.h" -#include - -#define NDEBUG -#include - ULONG CCMLastSourceColor = 0, CCMLastColorMatch = 0; static ULONG FASTCALL ShiftAndMask(XLATEGDI *XlateGDI, ULONG Color) diff --git a/reactos/subsys/win32k/include/intgdi.h b/reactos/subsys/win32k/include/intgdi.h index 131d3457553..3e1ca399b4c 100644 --- a/reactos/subsys/win32k/include/intgdi.h +++ b/reactos/subsys/win32k/include/intgdi.h @@ -15,13 +15,14 @@ IntGdiCreateDIBPatternBrushPt(CONST VOID *PackedDIB, UINT Usage); BOOL FASTCALL -IntPatBlt(DC *dc, - INT XLeft, - INT YLeft, - INT Width, - INT Height, - DWORD ROP, - BRUSHOBJ *BrushObj); +IntPatBlt( + PDC dc, + INT XLeft, + INT YLeft, + INT Width, + INT Height, + DWORD ROP, + PGDIBRUSHOBJ BrushObj); /* Pen functions */ diff --git a/reactos/subsys/win32k/include/path.h b/reactos/subsys/win32k/include/path.h index 609b6c41435..2a77fef5d3f 100644 --- a/reactos/subsys/win32k/include/path.h +++ b/reactos/subsys/win32k/include/path.h @@ -19,16 +19,5 @@ BOOL FASTCALL PATH_PolyPolyline( PDC dc, const POINT* pts, const DWORD* counts, BOOL FASTCALL PATH_Rectangle (PDC dc, INT x1, INT y1, INT x2, INT y2); BOOL FASTCALL PATH_RoundRect (PDC dc, INT x1, INT y1, INT x2, INT y2, INT xradius, INT yradius); BOOL FASTCALL PATH_PathToRegion (const GdiPath *pPath, INT nPolyFillMode, HRGN *pHrgn); -#ifdef _WIN32K_PATH_INTERNAL -BOOL FASTCALL PATH_AddEntry (GdiPath *pPath, const POINT *pPoint, BYTE flags); -BOOL FASTCALL PATH_AddFlatBezier (GdiPath *pPath, POINT *pt, BOOL closed); -BOOL FASTCALL PATH_DoArcPart (GdiPath *pPath, FLOAT_POINT corners[], double angleStart, double angleEnd, BOOL addMoveTo); -BOOL FASTCALL PATH_FlattenPath (GdiPath *pPath); -VOID FASTCALL PATH_GetPathFromDC (PDC dc, GdiPath **ppPath); -VOID FASTCALL PATH_NormalizePoint (FLOAT_POINT corners[], const FLOAT_POINT *pPoint, double *pX, double *pY); -BOOL FASTCALL PATH_PathToRegion(const GdiPath *pPath, INT nPolyFillMode, HRGN *pHrgn); -BOOL FASTCALL PATH_ReserveEntries (GdiPath *pPath, INT numEntries); -VOID FASTCALL PATH_ScaleNormalizedPoint (FLOAT_POINT corners[], double x, double y, POINT *pPoint); -#endif #endif /* _WIN32K_PATH_H */ diff --git a/reactos/subsys/win32k/main/dllmain.c b/reactos/subsys/win32k/main/dllmain.c index dded4602425..eecbeb9a26e 100644 --- a/reactos/subsys/win32k/main/dllmain.c +++ b/reactos/subsys/win32k/main/dllmain.c @@ -16,42 +16,11 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dllmain.c,v 1.71 2004/05/05 22:47:06 weiden Exp $ +/* $Id: dllmain.c,v 1.72 2004/05/10 17:07:17 weiden Exp $ * * Entry Point for win32k.sys */ - -#undef WIN32_LEAN_AND_MEAN -#define WIN32_NO_STATUS -#include -#define NTOS_MODE_KERNEL -#include - -#ifdef __USE_W32API -#include -#endif -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define NDEBUG -#include +#include #ifdef __USE_W32API typedef NTSTATUS (STDCALL *PW32_PROCESS_CALLBACK)( diff --git a/reactos/subsys/win32k/main/svctabm.c b/reactos/subsys/win32k/main/svctabm.c index b99f0a1ea34..3cfa9e76224 100644 --- a/reactos/subsys/win32k/main/svctabm.c +++ b/reactos/subsys/win32k/main/svctabm.c @@ -34,7 +34,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: svctabm.c,v 1.5 2003/06/07 10:14:40 chorns Exp $ +/* $Id: svctabm.c,v 1.6 2004/05/10 17:07:18 weiden Exp $ * * Entry Point for win32k.sys */ @@ -44,6 +44,7 @@ #include #define NTOS_MODE_KERNEL #include +#include #include /* diff --git a/reactos/subsys/win32k/makefile b/reactos/subsys/win32k/makefile index 103533b52fa..6a236aa70ad 100644 --- a/reactos/subsys/win32k/makefile +++ b/reactos/subsys/win32k/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.97 2004/04/09 20:03:18 navaraf Exp $ +# $Id: makefile,v 1.98 2004/05/10 17:07:18 weiden Exp $ PATH_TO_TOP = ../.. @@ -10,6 +10,8 @@ TARGET_BASE = 0x0 TARGET_ENTRY = _DllMain@8 +TARGET_PCH = w32k.h + TARGET_DDKLIBS = freetype.a FREETYPE_DIR = $(PATH_TO_TOP)/lib/freetype @@ -24,11 +26,12 @@ endif TARGET_CFLAGS =\ $(CFLAGS_DBG) \ + -I. \ -I$(PATH_TO_TOP)/ntoskrnl/include \ -I$(FREETYPE_DIR)/include \ -DUNICODE \ -Wall -Werror \ - -D__USE_W32API -D_WIN32_WINNT=0x0500 \ + -D__USE_W32API -D_WIN32_WINNT=0x0501 \ -DWINVER=0x600 -D_WIN32K_ TARGET_LFLAGS =\ diff --git a/reactos/subsys/win32k/ntddraw/ddraw.c b/reactos/subsys/win32k/ntddraw/ddraw.c index bda71258571..6447a029e2a 100644 --- a/reactos/subsys/win32k/ntddraw/ddraw.c +++ b/reactos/subsys/win32k/ntddraw/ddraw.c @@ -9,6 +9,7 @@ * 25-10-2003 PB Created */ #include +#include #include #include diff --git a/reactos/subsys/win32k/ntddraw/stubs.c b/reactos/subsys/win32k/ntddraw/stubs.c index a8fbe30aef1..104492244b9 100644 --- a/reactos/subsys/win32k/ntddraw/stubs.c +++ b/reactos/subsys/win32k/ntddraw/stubs.c @@ -9,6 +9,7 @@ * 25-10-2003 PB Created */ #include +#include #include #define NDEBUG diff --git a/reactos/subsys/win32k/ntuser/accelerator.c b/reactos/subsys/win32k/ntuser/accelerator.c index 405e21c4792..cc2405305f5 100644 --- a/reactos/subsys/win32k/ntuser/accelerator.c +++ b/reactos/subsys/win32k/ntuser/accelerator.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: accelerator.c,v 1.9 2004/02/19 21:12:09 weiden Exp $ +/* $Id: accelerator.c,v 1.10 2004/05/10 17:07:18 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -48,19 +48,7 @@ */ /* INCLUDES ******************************************************************/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include #define NDEBUG #include diff --git a/reactos/subsys/win32k/ntuser/callback.c b/reactos/subsys/win32k/ntuser/callback.c index bfea10e9657..a3f3cd5ac4a 100644 --- a/reactos/subsys/win32k/ntuser/callback.c +++ b/reactos/subsys/win32k/ntuser/callback.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: callback.c,v 1.21 2003/12/26 22:52:11 gvg Exp $ +/* $Id: callback.c,v 1.22 2004/05/10 17:07:18 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -29,16 +29,7 @@ /* INCLUDES ******************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include #define NDEBUG #include diff --git a/reactos/subsys/win32k/ntuser/caret.c b/reactos/subsys/win32k/ntuser/caret.c index 40b8c46c70a..3cd581098ba 100644 --- a/reactos/subsys/win32k/ntuser/caret.c +++ b/reactos/subsys/win32k/ntuser/caret.c @@ -1,4 +1,4 @@ -/* $Id: caret.c,v 1.11 2004/02/19 21:12:09 weiden Exp $ +/* $Id: caret.c,v 1.12 2004/05/10 17:07:18 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -9,16 +9,7 @@ * 10/15/2003 Created */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include #define NDEBUG #include diff --git a/reactos/subsys/win32k/ntuser/class.c b/reactos/subsys/win32k/ntuser/class.c index 84bdaee775a..620db8c02e8 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.51 2004/04/09 20:03:19 navaraf Exp $ +/* $Id: class.c,v 1.52 2004/05/10 17:07:18 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -28,18 +28,7 @@ */ /* INCLUDES ******************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include #define NDEBUG #include diff --git a/reactos/subsys/win32k/ntuser/clipboard.c b/reactos/subsys/win32k/ntuser/clipboard.c index f89c580f7d1..e7103758840 100644 --- a/reactos/subsys/win32k/ntuser/clipboard.c +++ b/reactos/subsys/win32k/ntuser/clipboard.c @@ -24,14 +24,7 @@ * PROGRAMER: Filip Navara */ -#include -#include -#include -#include -#include -#include -#include -#include +#include #define NDEBUG #include diff --git a/reactos/subsys/win32k/ntuser/desktop.c b/reactos/subsys/win32k/ntuser/desktop.c index a59d3836ffb..60d22f8c91d 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.13 2004/05/08 12:42:46 weiden Exp $ + * $Id: desktop.c,v 1.14 2004/05/10 17:07:18 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -28,26 +28,7 @@ */ /* INCLUDES ******************************************************************/ - -#define __WIN32K__ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define NDEBUG -#include +#include #if 0 /* not yet defined in w32api... */ diff --git a/reactos/subsys/win32k/ntuser/focus.c b/reactos/subsys/win32k/ntuser/focus.c index abc5c1c6f60..7e561a6b038 100644 --- a/reactos/subsys/win32k/ntuser/focus.c +++ b/reactos/subsys/win32k/ntuser/focus.c @@ -16,17 +16,11 @@ * 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.21 2004/04/15 23:36:03 weiden Exp $ + * $Id: focus.c,v 1.22 2004/05/10 17:07:18 weiden Exp $ */ -#include -#include -#include -#include -#include -#include -#include -#include +#include + #define NDEBUG #include #include diff --git a/reactos/subsys/win32k/ntuser/guicheck.c b/reactos/subsys/win32k/ntuser/guicheck.c index 3eec497c9b6..71859c1b655 100644 --- a/reactos/subsys/win32k/ntuser/guicheck.c +++ b/reactos/subsys/win32k/ntuser/guicheck.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: guicheck.c,v 1.17 2003/12/07 23:02:57 gvg Exp $ +/* $Id: guicheck.c,v 1.18 2004/05/10 17:07:18 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -33,14 +33,7 @@ /* INCLUDES ******************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include +#include #define NDEBUG #include diff --git a/reactos/subsys/win32k/ntuser/hook.c b/reactos/subsys/win32k/ntuser/hook.c index 222b1a56448..6b4a61f548a 100644 --- a/reactos/subsys/win32k/ntuser/hook.c +++ b/reactos/subsys/win32k/ntuser/hook.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: hook.c,v 1.7 2004/04/07 00:58:05 weiden Exp $ +/* $Id: hook.c,v 1.8 2004/05/10 17:07:18 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -29,17 +29,7 @@ * Copyright (C) 2002 Alexandre Julliard */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include #define NDEBUG #include diff --git a/reactos/subsys/win32k/ntuser/hotkey.c b/reactos/subsys/win32k/ntuser/hotkey.c index 3fa628f68f2..44db4b110e7 100644 --- a/reactos/subsys/win32k/ntuser/hotkey.c +++ b/reactos/subsys/win32k/ntuser/hotkey.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: hotkey.c,v 1.8 2004/02/24 13:27:03 weiden Exp $ +/* $Id: hotkey.c,v 1.9 2004/05/10 17:07:18 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -29,14 +29,7 @@ /* INCLUDES ******************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include +#include #define NDEBUG #include diff --git a/reactos/subsys/win32k/ntuser/input.c b/reactos/subsys/win32k/ntuser/input.c index 439bc215b23..aad68601537 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.31 2004/05/01 08:47:14 weiden Exp $ +/* $Id: input.c,v 1.32 2004/05/10 17:07:18 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -29,19 +29,8 @@ /* INCLUDES ******************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include + #include #define NDEBUG diff --git a/reactos/subsys/win32k/ntuser/keyboard.c b/reactos/subsys/win32k/ntuser/keyboard.c index 8c2fa92b50a..d94bdcb9428 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.28 2004/04/29 21:13:16 gvg Exp $ +/* $Id: keyboard.c,v 1.29 2004/05/10 17:07:18 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -29,19 +29,7 @@ /* INCLUDES ******************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include #define NDEBUG #include diff --git a/reactos/subsys/win32k/ntuser/menu.c b/reactos/subsys/win32k/ntuser/menu.c index d0c4c2a7512..2137202afd8 100644 --- a/reactos/subsys/win32k/ntuser/menu.c +++ b/reactos/subsys/win32k/ntuser/menu.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: menu.c,v 1.53 2004/05/02 21:41:18 gvg Exp $ +/* $Id: menu.c,v 1.54 2004/05/10 17:07:18 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -28,18 +28,7 @@ */ /* INCLUDES ******************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include #define NDEBUG #include diff --git a/reactos/subsys/win32k/ntuser/message.c b/reactos/subsys/win32k/ntuser/message.c index ce89598f2b2..07595caa06a 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.62 2004/05/05 22:26:03 weiden Exp $ +/* $Id: message.c,v 1.63 2004/05/10 17:07:18 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -29,22 +29,7 @@ /* INCLUDES ******************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include #define NDEBUG #include diff --git a/reactos/subsys/win32k/ntuser/metric.c b/reactos/subsys/win32k/ntuser/metric.c index fb900857336..ba332f54e77 100644 --- a/reactos/subsys/win32k/ntuser/metric.c +++ b/reactos/subsys/win32k/ntuser/metric.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: metric.c,v 1.19 2004/04/15 11:44:03 weiden Exp $ +/* $Id: metric.c,v 1.20 2004/05/10 17:07:18 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -29,14 +29,7 @@ /* INCLUDES ******************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include +#include #define NDEBUG #include diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index cf64bbda9d7..002efecf054 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.70 2004/05/08 12:42:46 weiden Exp $ +/* $Id: misc.c,v 1.71 2004/05/10 17:07:18 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -8,30 +8,8 @@ * REVISION HISTORY: * 2003/05/22 Created */ -#define __WIN32K__ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include + +#include #define NDEBUG #include diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index b45018e66ec..34479839c8c 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.93 2004/05/08 19:35:32 weiden Exp $ +/* $Id: msgqueue.c,v 1.94 2004/05/10 17:07:18 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -29,21 +29,7 @@ /* INCLUDES ******************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include #define NDEBUG #include diff --git a/reactos/subsys/win32k/ntuser/painting.c b/reactos/subsys/win32k/ntuser/painting.c index 13ce85c3180..ef23170da14 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.81 2004/04/29 21:13:16 gvg Exp $ + * $Id: painting.c,v 1.82 2004/05/10 17:07:18 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -30,26 +30,7 @@ /* INCLUDES ******************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include #define NDEBUG #include diff --git a/reactos/subsys/win32k/ntuser/prop.c b/reactos/subsys/win32k/ntuser/prop.c index 0d76d267571..da9de9058bf 100644 --- a/reactos/subsys/win32k/ntuser/prop.c +++ b/reactos/subsys/win32k/ntuser/prop.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: prop.c,v 1.10 2004/04/16 21:50:26 weiden Exp $ +/* $Id: prop.c,v 1.11 2004/05/10 17:07:18 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -28,20 +28,7 @@ */ /* INCLUDES ******************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include //#define NDEBUG #include diff --git a/reactos/subsys/win32k/ntuser/scrollbar.c b/reactos/subsys/win32k/ntuser/scrollbar.c index 5df20efdf12..1a0e336fa8e 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.31 2004/05/05 13:58:59 weiden Exp $ +/* $Id: scrollbar.c,v 1.32 2004/05/10 17:07:18 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -29,19 +29,8 @@ */ /* INCLUDES ******************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include + #ifdef __USE_W32API #include #endif diff --git a/reactos/subsys/win32k/ntuser/timer.c b/reactos/subsys/win32k/ntuser/timer.c index 8dcd7b88f48..26c783427d9 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.31 2004/04/29 21:13:16 gvg Exp $ +/* $Id: timer.c,v 1.32 2004/05/10 17:07:18 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -30,18 +30,7 @@ /* INCLUDES ******************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include #define NDEBUG #include diff --git a/reactos/subsys/win32k/ntuser/useratom.c b/reactos/subsys/win32k/ntuser/useratom.c index ef19d388f1c..d595e10f119 100644 --- a/reactos/subsys/win32k/ntuser/useratom.c +++ b/reactos/subsys/win32k/ntuser/useratom.c @@ -24,9 +24,8 @@ * PROGRAMER: Filip Navara */ -#include -#include -#include +#include + #define NDEBUG #include diff --git a/reactos/subsys/win32k/ntuser/vis.c b/reactos/subsys/win32k/ntuser/vis.c index d9514b623a8..720d570469a 100644 --- a/reactos/subsys/win32k/ntuser/vis.c +++ b/reactos/subsys/win32k/ntuser/vis.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: vis.c,v 1.27 2004/04/24 14:21:36 weiden Exp $ + * $Id: vis.c,v 1.28 2004/05/10 17:07:18 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -25,11 +25,7 @@ * PROGRAMMER: Ge van Geldorp (ge@gse.nl) */ -#include -#include -#include -#include -#include +#include #define NDEBUG #include diff --git a/reactos/subsys/win32k/ntuser/windc.c b/reactos/subsys/win32k/ntuser/windc.c index 57fddd9a80d..1d19421a186 100644 --- a/reactos/subsys/win32k/ntuser/windc.c +++ b/reactos/subsys/win32k/ntuser/windc.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: windc.c,v 1.65 2004/04/09 20:03:19 navaraf Exp $ +/* $Id: windc.c,v 1.66 2004/05/10 17:07:18 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -29,20 +29,7 @@ /* INCLUDES ******************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include #define NDEBUG #include diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index c4c3f9688f2..ac3cfff8f6c 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.228 2004/05/08 16:06:54 weiden Exp $ +/* $Id: window.c,v 1.229 2004/05/10 17:07:18 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -27,34 +27,7 @@ * 06-06-2001 CSH Created */ /* INCLUDES ******************************************************************/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include #define NDEBUG #include diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index 71aa78ab9d1..ecd50c1655a 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.113 2004/05/08 12:42:46 weiden Exp $ +/* $Id: winpos.c,v 1.114 2004/05/10 17:07:18 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -28,25 +28,7 @@ */ /* INCLUDES ******************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include #define NDEBUG #include diff --git a/reactos/subsys/win32k/ntuser/winsta.c b/reactos/subsys/win32k/ntuser/winsta.c index 856beaf0c0f..7fc4a3c8b63 100644 --- a/reactos/subsys/win32k/ntuser/winsta.c +++ b/reactos/subsys/win32k/ntuser/winsta.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: winsta.c,v 1.58 2004/05/01 17:06:55 weiden Exp $ + * $Id: winsta.c,v 1.59 2004/05/10 17:07:18 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -35,26 +35,7 @@ /* INCLUDES ******************************************************************/ -#define __WIN32K__ -#define NTOS_MODE_KERNEL -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -/* Needed for DIRECTORY_OBJECT */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsys/win32k/objects/bezier.c b/reactos/subsys/win32k/objects/bezier.c index 415b7a2779d..6eecf949498 100644 --- a/reactos/subsys/win32k/objects/bezier.c +++ b/reactos/subsys/win32k/objects/bezier.c @@ -16,11 +16,9 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: bezier.c,v 1.7 2004/05/10 13:35:28 weiden Exp $ */ -#include -#include -#include -#include +/* $Id: bezier.c,v 1.8 2004/05/10 17:07:20 weiden Exp $ */ + +#include /****************************************************************** * diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index 71fb76aa4ea..16e85a93420 100644 --- a/reactos/subsys/win32k/objects/bitmaps.c +++ b/reactos/subsys/win32k/objects/bitmaps.c @@ -16,28 +16,16 @@ * 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.71 2004/04/28 18:38:07 navaraf Exp $ */ -#undef WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#include -//#include -#include "../eng/handle.h" -#include -#include -#include -#include -#include -#include -#include -#include +/* $Id: bitmaps.c,v 1.72 2004/05/10 17:07:20 weiden Exp $ */ +#include -#define NDEBUG -#include +#define IN_RECT(r,x,y) \ +( \ + (x) >= (r).left && \ + (y) >= (r).top && \ + (x) < (r).right && \ + (y) < (r).bottom \ +) BOOL STDCALL NtGdiBitBlt( diff --git a/reactos/subsys/win32k/objects/brush.c b/reactos/subsys/win32k/objects/brush.c index 32934a77929..4e0e911592b 100644 --- a/reactos/subsys/win32k/objects/brush.c +++ b/reactos/subsys/win32k/objects/brush.c @@ -17,21 +17,9 @@ * 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.36 2004/04/25 14:46:54 weiden Exp $ + * $Id: brush.c,v 1.37 2004/05/10 17:07:20 weiden Exp $ */ - -#undef WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#include -#include -#include -#define NDEBUG -#include +#include static const USHORT HatchBrushes[NB_HATCH_STYLES][8] = { diff --git a/reactos/subsys/win32k/objects/cliprgn.c b/reactos/subsys/win32k/objects/cliprgn.c index 79d2c4f305a..649c9f2f3a8 100644 --- a/reactos/subsys/win32k/objects/cliprgn.c +++ b/reactos/subsys/win32k/objects/cliprgn.c @@ -16,22 +16,8 @@ * 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.36 2004/04/26 19:58:45 weiden Exp $ */ - -#undef WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "../eng/clip.h" - -#define NDEBUG -#include +/* $Id: cliprgn.c,v 1.37 2004/05/10 17:07:20 weiden Exp $ */ +#include VOID FASTCALL CLIPPING_UpdateGCRegion(DC* Dc) diff --git a/reactos/subsys/win32k/objects/color.c b/reactos/subsys/win32k/objects/color.c index 00104c76b0d..333de9fbce3 100644 --- a/reactos/subsys/win32k/objects/color.c +++ b/reactos/subsys/win32k/objects/color.c @@ -16,30 +16,11 @@ * 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.38 2004/05/01 00:51:51 navaraf Exp $ */ +/* $Id: color.c,v 1.39 2004/05/10 17:07:20 weiden Exp $ */ +#include // FIXME: Use PXLATEOBJ logicalToSystem instead of int *mapping -#undef WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#include -#include -#include "../eng/handle.h" -#include -#include -#include -#include -#include -#include - -#define NDEBUG -#include - int COLOR_gapStart = 256; int COLOR_gapEnd = -1; int COLOR_gapFilled = 0; diff --git a/reactos/subsys/win32k/objects/coord.c b/reactos/subsys/win32k/objects/coord.c index ab723defed1..36e03b2ba9e 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.22 2004/02/19 21:12:10 weiden Exp $ +/* $Id: coord.c,v 1.23 2004/05/10 17:07:20 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -26,16 +26,7 @@ */ /* INCLUDES ******************************************************************/ - -#include -#include -#include -#include -#include -#include -#include -#define NDEBUG -#include +#include /* FUNCTIONS *****************************************************************/ diff --git a/reactos/subsys/win32k/objects/cursoricon.c b/reactos/subsys/win32k/objects/cursoricon.c index 9893b52ac26..cbc773df92a 100644 --- a/reactos/subsys/win32k/objects/cursoricon.c +++ b/reactos/subsys/win32k/objects/cursoricon.c @@ -16,35 +16,8 @@ * 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.54 2004/04/30 22:18:00 weiden Exp $ */ - -#undef WIN32_LEAN_AND_MEAN - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "include/object.h" -#include - -#define NDEBUG -#include +/* $Id: cursoricon.c,v 1.55 2004/05/10 17:07:20 weiden Exp $ */ +#include PCURICON_OBJECT FASTCALL IntGetCurIconObject(PWINSTATION_OBJECT WinStaObject, HANDLE Handle) diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index 9dd8b4bc800..d715b43594d 100644 --- a/reactos/subsys/win32k/objects/dc.c +++ b/reactos/subsys/win32k/objects/dc.c @@ -16,46 +16,12 @@ * 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.133 2004/04/28 18:38:07 navaraf Exp $ +/* $Id: dc.c,v 1.134 2004/05/10 17:07:20 weiden Exp $ * * DC.C - Device context functions * */ - -#undef WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "../eng/clip.h" -#include "../eng/handle.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define NDEBUG -#include +#include #ifndef OBJ_COLORSPACE #define OBJ_COLORSPACE (14) diff --git a/reactos/subsys/win32k/objects/dib.c b/reactos/subsys/win32k/objects/dib.c index e986c39db8a..cee18a7d035 100644 --- a/reactos/subsys/win32k/objects/dib.c +++ b/reactos/subsys/win32k/objects/dib.c @@ -1,5 +1,5 @@ /* - * $Id: dib.c,v 1.45 2004/04/09 20:03:20 navaraf Exp $ + * $Id: dib.c,v 1.46 2004/05/10 17:07:20 weiden Exp $ * * ReactOS W32 Subsystem * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team @@ -18,26 +18,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#undef WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include "../eng/handle.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define NDEBUG -#include +#include UINT STDCALL NtGdiSetDIBColorTable(HDC hDC, UINT StartIndex, diff --git a/reactos/subsys/win32k/objects/fillshap.c b/reactos/subsys/win32k/objects/fillshap.c index 9102fac49de..c515088721c 100644 --- a/reactos/subsys/win32k/objects/fillshap.c +++ b/reactos/subsys/win32k/objects/fillshap.c @@ -16,30 +16,8 @@ * 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.47 2004/04/09 20:03:20 navaraf Exp $ */ - -#undef WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define NDEBUG -#include +/* $Id: fillshap.c,v 1.48 2004/05/10 17:07:20 weiden Exp $ */ +#include /* * a couple macros to fill a single pixel or a line diff --git a/reactos/subsys/win32k/objects/gdiobj.c b/reactos/subsys/win32k/objects/gdiobj.c index e3ad32e02f9..71e08095b86 100644 --- a/reactos/subsys/win32k/objects/gdiobj.c +++ b/reactos/subsys/win32k/objects/gdiobj.c @@ -19,29 +19,10 @@ /* * GDIOBJ.C - GDI object manipulation routines * - * $Id: gdiobj.c,v 1.66 2004/04/09 20:03:20 navaraf Exp $ + * $Id: gdiobj.c,v 1.67 2004/05/10 17:07:20 weiden Exp $ * */ - -#undef WIN32_LEAN_AND_MEAN -#define WIN32_NO_STATUS -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#define NDEBUG -#include +#include /* count all gdi objects */ #define GDI_COUNT_OBJECTS 1 diff --git a/reactos/subsys/win32k/objects/icm.c b/reactos/subsys/win32k/objects/icm.c index 95ed273d283..3eb9470ac24 100644 --- a/reactos/subsys/win32k/objects/icm.c +++ b/reactos/subsys/win32k/objects/icm.c @@ -16,15 +16,8 @@ * 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.9 2003/08/19 11:48:50 weiden Exp $ */ - -#undef WIN32_LEAN_AND_MEAN -#include -#include -#include - -#define NDEBUG -#include +/* $Id: icm.c,v 1.10 2004/05/10 17:07:20 weiden Exp $ */ +#include BOOL STDCALL diff --git a/reactos/subsys/win32k/objects/line.c b/reactos/subsys/win32k/objects/line.c index 30c360292cf..16a2140ae53 100644 --- a/reactos/subsys/win32k/objects/line.c +++ b/reactos/subsys/win32k/objects/line.c @@ -16,29 +16,11 @@ * 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.29 2004/04/09 20:03:20 navaraf Exp $ */ +/* $Id: line.c,v 1.30 2004/05/10 17:07:20 weiden Exp $ */ +#include // Some code from the WINE project source (www.winehq.com) -#undef WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define NDEBUG -#include - BOOL FASTCALL IntGdiMoveToEx(DC *dc, diff --git a/reactos/subsys/win32k/objects/metafile.c b/reactos/subsys/win32k/objects/metafile.c index 723e45e808f..97a48ee395d 100644 --- a/reactos/subsys/win32k/objects/metafile.c +++ b/reactos/subsys/win32k/objects/metafile.c @@ -16,15 +16,8 @@ * 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.9 2003/08/19 11:48:50 weiden Exp $ */ - -#undef WIN32_LEAN_AND_MEAN -#include -#include -#include - -#define NDEBUG -#include +/* $Id: metafile.c,v 1.10 2004/05/10 17:07:20 weiden Exp $ */ +#include HENHMETAFILE STDCALL diff --git a/reactos/subsys/win32k/objects/objconv.c b/reactos/subsys/win32k/objects/objconv.c index da60f52ecfd..e9f74bde459 100644 --- a/reactos/subsys/win32k/objects/objconv.c +++ b/reactos/subsys/win32k/objects/objconv.c @@ -16,27 +16,8 @@ * 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.17 2004/04/09 20:03:20 navaraf Exp $ */ - -#undef WIN32_LEAN_AND_MEAN -#include -#include - -/* FIXME: Surely we should just have one include file that includes all of these.. */ -#include -#include -#include -#include -#include -#include -#include -#include -#include "../eng/objects.h" -#include -#include - -//#define NDEBUG -#include +/* $Id: objconv.c,v 1.18 2004/05/10 17:07:20 weiden Exp $ */ +#include HBITMAP FASTCALL BitmapToSurf(PBITMAPOBJ BitmapObj, HDEV GDIDevice) { diff --git a/reactos/subsys/win32k/objects/paint.c b/reactos/subsys/win32k/objects/paint.c index de37cc35c3d..8cb6d9b9842 100644 --- a/reactos/subsys/win32k/objects/paint.c +++ b/reactos/subsys/win32k/objects/paint.c @@ -16,16 +16,8 @@ * 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.10 2003/08/19 11:48:50 weiden Exp $ */ - -#undef WIN32_LEAN_AND_MEAN -#include -#include -//#include -#include - -#define NDEBUG -#include +/* $Id: paint.c,v 1.11 2004/05/10 17:07:20 weiden Exp $ */ +#include BOOL STDCALL diff --git a/reactos/subsys/win32k/objects/palette.c b/reactos/subsys/win32k/objects/palette.c index ee2239c6d0f..adb5410c284 100644 --- a/reactos/subsys/win32k/objects/palette.c +++ b/reactos/subsys/win32k/objects/palette.c @@ -16,20 +16,8 @@ * 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.17 2004/04/09 20:03:20 navaraf Exp $ */ - -#undef WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +/* $Id: palette.c,v 1.18 2004/05/10 17:07:20 weiden Exp $ */ +#include #ifndef NO_MAPPING static int PALETTE_firstFree = 0; diff --git a/reactos/subsys/win32k/objects/path.c b/reactos/subsys/win32k/objects/path.c index 1aded6a887d..b9a261ccb1a 100644 --- a/reactos/subsys/win32k/objects/path.c +++ b/reactos/subsys/win32k/objects/path.c @@ -16,33 +16,24 @@ * 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.20 2004/04/24 14:21:37 weiden Exp $ */ -#undef WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#include +/* $Id: path.c,v 1.21 2004/05/10 17:07:20 weiden Exp $ */ +#include #include -#include -#include -#define _WIN32K_PATH_INTERNAL -#include -#include -#include - -#include -#include - -#define NDEBUG -#include #define NUM_ENTRIES_INITIAL 16 /* Initial size of points / flags arrays */ #define GROW_FACTOR_NUMER 2 /* Numerator of grow factor for the array */ #define GROW_FACTOR_DENOM 1 /* Denominator of grow factor */ +BOOL FASTCALL PATH_AddEntry (GdiPath *pPath, const POINT *pPoint, BYTE flags); +BOOL FASTCALL PATH_AddFlatBezier (GdiPath *pPath, POINT *pt, BOOL closed); +BOOL FASTCALL PATH_DoArcPart (GdiPath *pPath, FLOAT_POINT corners[], double angleStart, double angleEnd, BOOL addMoveTo); +BOOL FASTCALL PATH_FlattenPath (GdiPath *pPath); +VOID FASTCALL PATH_GetPathFromDC (PDC dc, GdiPath **ppPath); +VOID FASTCALL PATH_NormalizePoint (FLOAT_POINT corners[], const FLOAT_POINT *pPoint, double *pX, double *pY); +BOOL FASTCALL PATH_PathToRegion(const GdiPath *pPath, INT nPolyFillMode, HRGN *pHrgn); +BOOL FASTCALL PATH_ReserveEntries (GdiPath *pPath, INT numEntries); +VOID FASTCALL PATH_ScaleNormalizedPoint (FLOAT_POINT corners[], double x, double y, POINT *pPoint); + INT FASTCALL IntGdiGetArcDirection(DC *dc); diff --git a/reactos/subsys/win32k/objects/pen.c b/reactos/subsys/win32k/objects/pen.c index 72801cf1b03..f1ee19efa56 100644 --- a/reactos/subsys/win32k/objects/pen.c +++ b/reactos/subsys/win32k/objects/pen.c @@ -17,19 +17,9 @@ * 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.14 2004/04/05 21:26:25 navaraf Exp $ + * $Id: pen.c,v 1.15 2004/05/10 17:07:20 weiden Exp $ */ - -#undef WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#include -#define NDEBUG -#include +#include /* PRIVATE FUNCTIONS **********************************************************/ diff --git a/reactos/subsys/win32k/objects/polyfill.c b/reactos/subsys/win32k/objects/polyfill.c index 61216e5fe75..dffd73f1c5e 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.13 2004/04/09 20:03:20 navaraf Exp $ +/* $Id: polyfill.c,v 1.14 2004/05/10 17:07:20 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -26,19 +26,7 @@ * REVISION HISTORY: * 21/2/2003: Created */ - -#undef WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#include -#include - -#undef NDEBUG -#include +#include INT abs(INT nm); diff --git a/reactos/subsys/win32k/objects/print.c b/reactos/subsys/win32k/objects/print.c index 6c9260f918f..65b565a4fff 100644 --- a/reactos/subsys/win32k/objects/print.c +++ b/reactos/subsys/win32k/objects/print.c @@ -16,20 +16,8 @@ * 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.16 2004/04/09 20:03:20 navaraf Exp $ */ - -#undef WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#include -#include - -#define NDEBUG -#include +/* $Id: print.c,v 1.17 2004/05/10 17:07:20 weiden Exp $ */ +#include INT STDCALL diff --git a/reactos/subsys/win32k/objects/rect.c b/reactos/subsys/win32k/objects/rect.c index d098ff427f8..1fd5b4c12e8 100644 --- a/reactos/subsys/win32k/objects/rect.c +++ b/reactos/subsys/win32k/objects/rect.c @@ -16,15 +16,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: rect.c,v 1.6 2003/08/19 11:48:50 weiden Exp $ */ -#include -#include -#include -#include -#include - -#define NDEBUG -#include +/* $Id: rect.c,v 1.7 2004/05/10 17:07:20 weiden Exp $ */ +#include /* FUNCTIONS *****************************************************************/ diff --git a/reactos/subsys/win32k/objects/region.c b/reactos/subsys/win32k/objects/region.c index 4d0f93cd86b..cc5985609e0 100644 --- a/reactos/subsys/win32k/objects/region.c +++ b/reactos/subsys/win32k/objects/region.c @@ -16,26 +16,9 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: region.c,v 1.50 2004/04/24 14:21:37 weiden Exp $ */ -#undef WIN32_LEAN_AND_MEAN -#include -#include -#include +/* $Id: region.c,v 1.51 2004/05/10 17:07:20 weiden Exp $ */ +#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define NDEBUG -#include BOOL STDCALL IntEngPaint(IN SURFOBJ *Surface,IN CLIPOBJ *ClipRegion,IN BRUSHOBJ *Brush,IN POINTL *BrushOrigin, diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index b9b383f5979..4e64e7edec5 100644 --- a/reactos/subsys/win32k/objects/text.c +++ b/reactos/subsys/win32k/objects/text.c @@ -22,36 +22,13 @@ * 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.90 2004/04/23 21:35:59 weiden Exp $ */ +/* $Id: text.c,v 1.91 2004/05/10 17:07:20 weiden Exp $ */ +#include - -#undef WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include #include FT_FREETYPE_H #include -#include "../eng/handle.h" - -#include -#include -#include -#include -#include - -#define NDEBUG -#include - FT_Library library; typedef struct _FONT_ENTRY { diff --git a/reactos/subsys/win32k/objects/wingl.c b/reactos/subsys/win32k/objects/wingl.c index adc00f06328..f58f7369b2d 100644 --- a/reactos/subsys/win32k/objects/wingl.c +++ b/reactos/subsys/win32k/objects/wingl.c @@ -16,15 +16,8 @@ * 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.7 2003/08/19 11:48:50 weiden Exp $ */ - -#undef WIN32_LEAN_AND_MEAN -#include -#include -#include - -#define NDEBUG -#include +/* $Id: wingl.c,v 1.8 2004/05/10 17:07:20 weiden Exp $ */ +#include INT STDCALL diff --git a/reactos/subsys/win32k/w32k.h b/reactos/subsys/win32k/w32k.h new file mode 100644 index 00000000000..ceb5e53a0a3 --- /dev/null +++ b/reactos/subsys/win32k/w32k.h @@ -0,0 +1,81 @@ +/* + * Precompiled headers for win32k.sys + */ + +#define __WIN32K__ +#define NTOS_MODE_KERNEL + +#include + +#include +#include +#include + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#define NDEBUG +#include + From 2fbb38750c1219d119f29e3642f794cc783de9fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Mon, 10 May 2004 17:48:36 +0000 Subject: [PATCH 1081/1463] Update to FreeType 2.1.8 svn path=/trunk/; revision=9349 --- reactos/lib/freetype/ChangeLog | 2372 +- reactos/lib/freetype/Jamfile | 8 +- reactos/lib/freetype/Jamfile.in | 135 - reactos/lib/freetype/README | 8 +- reactos/lib/freetype/README.ROS | 4 +- reactos/lib/freetype/builds/atari/ATARI.H | 16 + reactos/lib/freetype/builds/atari/FNames.SIC | 37 + .../lib/freetype/builds/atari/FREETYPE.PRJ | 33 + reactos/lib/freetype/builds/atari/README.TXT | 51 + reactos/lib/freetype/builds/freetype.mk | 8 +- reactos/lib/freetype/builds/toplevel.mk | 1 + reactos/lib/freetype/builds/unix/.cvsignore | 1 + reactos/lib/freetype/builds/unix/aclocal.m4 | 7309 +++--- reactos/lib/freetype/builds/unix/config.guess | 184 +- reactos/lib/freetype/builds/unix/config.sub | 128 +- reactos/lib/freetype/builds/unix/configure | 18397 +++++++++++++--- reactos/lib/freetype/builds/unix/configure.ac | 176 +- reactos/lib/freetype/builds/unix/detect.mk | 8 +- .../freetype/builds/unix/freetype-config.in | 86 +- reactos/lib/freetype/builds/unix/freetype2.m4 | 263 +- reactos/lib/freetype/builds/unix/ft-munmap.m4 | 42 +- reactos/lib/freetype/builds/unix/ft2unix.h | 23 +- reactos/lib/freetype/builds/unix/ftconfig.in | 113 +- reactos/lib/freetype/builds/unix/ftsystem.c | 79 +- reactos/lib/freetype/builds/unix/install-sh | 311 +- reactos/lib/freetype/builds/unix/install.mk | 2 + reactos/lib/freetype/builds/unix/ltmain.sh | 3127 ++- .../lib/freetype/builds/unix/mkinstalldirs | 69 +- reactos/lib/freetype/builds/unix/unix-cc.in | 5 +- reactos/lib/freetype/builds/unix/unix-def.in | 4 +- reactos/lib/freetype/builds/unix/unix.mk | 12 +- reactos/lib/freetype/builds/vms/ftconfig.h | 155 +- .../builds/win32/visualc/freetype.dsp | 16 +- .../builds/win32/visualc/freetype.sln | 33 + .../builds/win32/visualc/freetype.vcproj | 1717 ++ .../freetype/builds/win32/visualc/index.html | 37 +- reactos/lib/freetype/configure | 12 +- reactos/lib/freetype/devel/ft2build.h | 6 +- reactos/lib/freetype/devel/ftoption.h | 51 +- reactos/lib/freetype/docs/CHANGES | 1413 +- reactos/lib/freetype/docs/CUSTOMIZE | 10 +- reactos/lib/freetype/docs/INSTALL | 3 +- reactos/lib/freetype/docs/INSTALL.GNU | 3 +- reactos/lib/freetype/docs/INSTALL.UNX | 3 +- reactos/lib/freetype/docs/VERSION.DLL | 27 +- reactos/lib/freetype/docs/license.txt | 27 +- reactos/lib/freetype/docs/raster.txt | 624 + reactos/lib/freetype/docs/release | 18 +- reactos/lib/freetype/freetype.def | 108 +- .../include/freetype/cache/ftccache.h | 334 +- .../include/freetype/cache/ftcglyph.h | 298 +- .../include/freetype/cache/ftcimage.h | 307 +- .../include/freetype/cache/ftcmanag.h | 135 +- .../freetype/include/freetype/cache/ftcmru.h | 246 + .../include/freetype/cache/ftcsbits.h | 277 +- .../freetype/include/freetype/cache/ftlru.h | 202 - .../include/freetype/config/ftconfig.h | 64 +- .../include/freetype/config/ftheader.h | 61 +- .../include/freetype/config/ftoption.h | 54 +- .../include/freetype/config/ftstdlib.h | 27 +- .../lib/freetype/include/freetype/freetype.h | 130 +- .../lib/freetype/include/freetype/ftbbox.h | 8 +- reactos/lib/freetype/include/freetype/ftbdf.h | 6 + .../lib/freetype/include/freetype/ftcache.h | 506 +- .../lib/freetype/include/freetype/fterrdef.h | 4 +- .../lib/freetype/include/freetype/ftglyph.h | 12 +- .../lib/freetype/include/freetype/ftgzip.h | 7 + .../lib/freetype/include/freetype/ftimage.h | 8 +- .../lib/freetype/include/freetype/ftincrem.h | 6 + .../lib/freetype/include/freetype/ftlist.h | 8 +- reactos/lib/freetype/include/freetype/ftlzw.h | 99 + reactos/lib/freetype/include/freetype/ftmac.h | 44 +- reactos/lib/freetype/include/freetype/ftmm.h | 15 - .../freetype/{ftmodule.h => ftmodapi.h} | 19 +- .../lib/freetype/include/freetype/ftmoderr.h | 31 +- .../lib/freetype/include/freetype/ftoutln.h | 74 +- reactos/lib/freetype/include/freetype/ftpfr.h | 6 + .../lib/freetype/include/freetype/ftsizes.h | 12 +- .../lib/freetype/include/freetype/ftsnames.h | 8 +- .../lib/freetype/include/freetype/ftstroke.h | 634 +- .../lib/freetype/include/freetype/ftsynth.h | 8 +- .../lib/freetype/include/freetype/fttrigon.h | 6 + .../lib/freetype/include/freetype/ftwinfnt.h | 130 +- .../lib/freetype/include/freetype/ftxf86.h | 11 +- .../include/freetype/internal/bdftypes.h | 58 - .../include/freetype/internal/fnttypes.h | 104 - .../include/freetype/internal/ftcalc.h | 38 +- .../include/freetype/internal/ftcore.h | 185 - .../include/freetype/internal/ftdebug.h | 50 +- .../include/freetype/internal/ftdriver.h | 14 +- .../include/freetype/internal/ftexcept.h | 82 - .../include/freetype/internal/ftgloadr.h | 8 +- .../include/freetype/internal/fthash.h | 502 - .../include/freetype/internal/ftmemory.h | 8 +- .../include/freetype/internal/ftobject.h | 533 - .../include/freetype/internal/ftobjs.h | 105 +- .../include/freetype/internal/ftrfork.h | 184 + .../include/freetype/internal/ftserv.h | 260 + .../include/freetype/internal/ftstream.h | 13 +- .../include/freetype/internal/fttrace.h | 17 +- .../include/freetype/internal/internal.h | 14 +- .../include/freetype/internal/psaux.h | 15 +- .../include/freetype/internal/psnames.h | 241 - .../freetype/internal/services/svbdf.h | 57 + .../freetype/internal/services/svgldict.h | 60 + .../include/freetype/internal/services/svmm.h | 68 + .../internal/{pfr.h => services/svpfr.h} | 55 +- .../freetype/internal/services/svpostnm.h | 58 + .../freetype/internal/services/svpscmap.h | 113 + .../freetype/internal/services/svpsinfo.h | 55 + .../freetype/internal/services/svsfnt.h | 69 + .../freetype/internal/services/svttcmap.h | 77 + .../freetype/internal/services/svwinfnt.h} | 37 +- .../freetype/internal/services/svxf86nm.h | 55 + .../freetype/include/freetype/internal/sfnt.h | 177 +- .../include/freetype/internal/t1types.h | 30 +- .../include/freetype/internal/tttypes.h | 330 +- .../lib/freetype/include/freetype/t1tables.h | 12 +- .../lib/freetype/include/freetype/ttnameid.h | 1 + .../lib/freetype/include/freetype/tttables.h | 32 +- .../lib/freetype/include/freetype/tttags.h | 6 + .../lib/freetype/include/freetype/ttunpat.h | 6 + reactos/lib/freetype/install | 2 - reactos/lib/freetype/src/autofit/Jamfile | 18 + reactos/lib/freetype/src/autofit/afangles.c | 214 + reactos/lib/freetype/src/autofit/afdummy.c | 35 + reactos/lib/freetype/src/autofit/afdummy.h | 18 + reactos/lib/freetype/src/autofit/afglobal.c | 236 + reactos/lib/freetype/src/autofit/afglobal.h | 41 + reactos/lib/freetype/src/autofit/afhints.c | 986 + reactos/lib/freetype/src/autofit/afhints.h | 246 + reactos/lib/freetype/src/autofit/aflatin.c | 1789 ++ reactos/lib/freetype/src/autofit/aflatin.h | 168 + reactos/lib/freetype/src/autofit/afloader.c | 441 + reactos/lib/freetype/src/autofit/afloader.h | 50 + reactos/lib/freetype/src/autofit/afmodule.c | 70 + reactos/lib/freetype/src/autofit/afmodule.h | 16 + reactos/lib/freetype/src/autofit/aftypes.h | 268 + reactos/lib/freetype/src/autofit/autofit.c | 9 + reactos/lib/freetype/src/autohint/ahglobal.c | 6 +- reactos/lib/freetype/src/autohint/ahglyph.c | 18 +- reactos/lib/freetype/src/autohint/ahhint.c | 110 +- reactos/lib/freetype/src/autohint/ahtypes.h | 5 +- reactos/lib/freetype/src/base/Jamfile | 7 +- reactos/lib/freetype/src/base/descrip.mms | 4 +- reactos/lib/freetype/src/base/ftbase.c | 3 +- reactos/lib/freetype/src/base/ftbdf.c | 50 +- reactos/lib/freetype/src/base/ftcalc.c | 103 +- reactos/lib/freetype/src/base/ftdbgmem.c | 6 +- reactos/lib/freetype/src/base/ftdebug.c | 67 +- reactos/lib/freetype/src/base/ftgloadr.c | 25 +- reactos/lib/freetype/src/base/ftglyph.c | 25 +- reactos/lib/freetype/src/base/ftmac.c | 469 +- reactos/lib/freetype/src/base/ftmm.c | 89 +- reactos/lib/freetype/src/base/ftobjs.c | 677 +- reactos/lib/freetype/src/base/ftoutln.c | 151 +- reactos/lib/freetype/src/base/ftpfr.c | 83 +- reactos/lib/freetype/src/base/ftrfork.c | 717 + reactos/lib/freetype/src/base/ftstream.c | 8 +- reactos/lib/freetype/src/base/ftstroke.c | 283 +- reactos/lib/freetype/src/base/ftsynth.c | 5 +- reactos/lib/freetype/src/base/fttrigon.c | 5 +- reactos/lib/freetype/src/base/fttype1.c | 53 +- reactos/lib/freetype/src/base/ftwinfnt.c | 24 +- reactos/lib/freetype/src/base/ftxf86.c | 51 +- reactos/lib/freetype/src/base/rules.mk | 29 +- reactos/lib/freetype/src/bdf/bdfdrivr.c | 279 +- reactos/lib/freetype/src/bdf/bdfdrivr.h | 2 +- reactos/lib/freetype/src/bdf/bdflib.c | 20 +- reactos/lib/freetype/src/cache/Jamfile | 12 +- reactos/lib/freetype/src/cache/descrip.mms | 5 +- reactos/lib/freetype/src/cache/ftcache.c | 8 +- reactos/lib/freetype/src/cache/ftcbasic.c | 425 + reactos/lib/freetype/src/cache/ftccache.c | 915 +- reactos/lib/freetype/src/cache/ftccache.i | 157 - reactos/lib/freetype/src/cache/ftccback.h | 82 + reactos/lib/freetype/src/cache/ftccmap.c | 409 +- reactos/lib/freetype/src/cache/ftcglyph.c | 151 +- reactos/lib/freetype/src/cache/ftcimage.c | 356 +- reactos/lib/freetype/src/cache/ftcmanag.c | 730 +- reactos/lib/freetype/src/cache/ftcmru.c | 355 + reactos/lib/freetype/src/cache/ftcsbits.c | 575 +- reactos/lib/freetype/src/cache/ftlru.c | 390 - reactos/lib/freetype/src/cache/rules.mk | 11 +- reactos/lib/freetype/src/cff/Jamfile | 2 +- reactos/lib/freetype/src/cff/cff.c | 2 +- reactos/lib/freetype/src/cff/cffcmap.c | 48 +- reactos/lib/freetype/src/cff/cffdrivr.c | 184 +- reactos/lib/freetype/src/cff/cffgload.c | 256 +- reactos/lib/freetype/src/cff/cffload.c | 160 +- reactos/lib/freetype/src/cff/cffload.h | 14 +- reactos/lib/freetype/src/cff/cffobjs.c | 305 +- reactos/lib/freetype/src/cff/cffobjs.h | 28 +- reactos/lib/freetype/src/cff/cffparse.c | 4 +- reactos/lib/freetype/src/cff/cffparse.h | 4 +- reactos/lib/freetype/src/cff/cfftoken.h | 4 +- .../freetype/internal => src/cff}/cfftypes.h | 9 +- reactos/lib/freetype/src/cff/rules.mk | 1 + reactos/lib/freetype/src/cid/cidgload.c | 22 +- reactos/lib/freetype/src/cid/cidload.c | 215 +- reactos/lib/freetype/src/cid/cidload.h | 5 +- reactos/lib/freetype/src/cid/cidobjs.c | 35 +- reactos/lib/freetype/src/cid/cidparse.c | 61 +- reactos/lib/freetype/src/cid/cidparse.h | 13 +- reactos/lib/freetype/src/cid/cidriver.c | 55 +- reactos/lib/freetype/src/gzip/adler32.c | 2 +- reactos/lib/freetype/src/gzip/ftgzip.c | 32 +- reactos/lib/freetype/src/gzip/infblock.c | 3 +- reactos/lib/freetype/src/gzip/inffixed.h | 8 +- reactos/lib/freetype/src/gzip/inftrees.c | 10 +- reactos/lib/freetype/src/gzip/inftrees.h | 4 +- reactos/lib/freetype/src/gzip/infutil.c | 2 +- reactos/lib/freetype/src/gzip/zconf.h | 2 +- reactos/lib/freetype/src/gzip/zutil.c | 2 +- reactos/lib/freetype/src/gzip/zutil.h | 2 +- reactos/lib/freetype/src/lzw/Jamfile | 9 + reactos/lib/freetype/src/lzw/ftlzw.c | 463 + reactos/lib/freetype/src/lzw/rules.mk | 70 + reactos/lib/freetype/src/lzw/zopen.c | 396 + reactos/lib/freetype/src/lzw/zopen.h | 114 + reactos/lib/freetype/src/pcf/pcfdrivr.c | 95 +- reactos/lib/freetype/src/pcf/pcfread.c | 224 +- reactos/lib/freetype/src/pcf/pcfutil.c | 93 +- reactos/lib/freetype/src/pcf/pcfutil.h | 15 +- reactos/lib/freetype/src/pfr/pfrdrivr.c | 91 +- reactos/lib/freetype/src/pfr/pfrgload.c | 6 +- reactos/lib/freetype/src/pfr/pfrload.c | 238 +- reactos/lib/freetype/src/pfr/pfrobjs.c | 77 +- reactos/lib/freetype/src/pfr/pfrsbit.c | 13 +- reactos/lib/freetype/src/pfr/pfrtypes.h | 12 +- reactos/lib/freetype/src/psaux/psauxmod.c | 2 +- reactos/lib/freetype/src/psaux/psobjs.c | 818 +- reactos/lib/freetype/src/psaux/psobjs.h | 10 +- reactos/lib/freetype/src/psaux/t1cmap.c | 26 +- reactos/lib/freetype/src/psaux/t1cmap.h | 19 +- reactos/lib/freetype/src/psaux/t1decode.c | 34 +- reactos/lib/freetype/src/psaux/t1decode.h | 3 +- reactos/lib/freetype/src/pshinter/Jamfile | 2 +- reactos/lib/freetype/src/pshinter/pshalgo.c | 517 +- reactos/lib/freetype/src/pshinter/pshglob.c | 45 +- reactos/lib/freetype/src/pshinter/pshrec.c | 19 +- reactos/lib/freetype/src/pshinter/pshrec.h | 2 +- reactos/lib/freetype/src/psnames/psmodule.c | 68 +- reactos/lib/freetype/src/raster/ftrend1.c | 14 +- reactos/lib/freetype/src/sfnt/Jamfile | 4 +- reactos/lib/freetype/src/sfnt/rules.mk | 1 - reactos/lib/freetype/src/sfnt/sfdriver.c | 103 +- reactos/lib/freetype/src/sfnt/sfnt.c | 3 +- reactos/lib/freetype/src/sfnt/sfobjs.c | 27 +- reactos/lib/freetype/src/sfnt/ttcmap.c | 1110 - reactos/lib/freetype/src/sfnt/ttcmap0.c | 141 +- reactos/lib/freetype/src/sfnt/ttcmap0.h | 10 +- reactos/lib/freetype/src/sfnt/ttload.c | 40 +- reactos/lib/freetype/src/sfnt/ttpost.c | 10 +- reactos/lib/freetype/src/sfnt/ttsbit.c | 46 +- reactos/lib/freetype/src/sfnt/ttsbit.h | 19 +- reactos/lib/freetype/src/smooth/ftsmooth.c | 15 +- .../freetype/src/tools/docmaker/content.py | 50 +- .../freetype/src/tools/docmaker/docbeauty.py | 109 + .../freetype/src/tools/docmaker/docmaker.py | 52 +- .../freetype/src/tools/docmaker/formatter.py | 9 + .../freetype/src/tools/docmaker/sources.py | 6 +- .../lib/freetype/src/tools/docmaker/utils.py | 43 +- reactos/lib/freetype/src/truetype/ttdriver.c | 49 +- reactos/lib/freetype/src/truetype/ttgload.c | 211 +- reactos/lib/freetype/src/truetype/ttgload.h | 4 +- reactos/lib/freetype/src/truetype/ttinterp.c | 191 +- reactos/lib/freetype/src/truetype/ttinterp.h | 3 +- reactos/lib/freetype/src/truetype/ttobjs.c | 23 +- reactos/lib/freetype/src/truetype/ttobjs.h | 5 +- reactos/lib/freetype/src/type1/t1driver.c | 158 +- reactos/lib/freetype/src/type1/t1gload.c | 31 +- reactos/lib/freetype/src/type1/t1load.c | 928 +- reactos/lib/freetype/src/type1/t1objs.c | 35 +- reactos/lib/freetype/src/type1/t1parse.c | 205 +- reactos/lib/freetype/src/type1/t1parse.h | 12 +- reactos/lib/freetype/src/type1/t1tokens.h | 4 +- reactos/lib/freetype/src/type42/t42drivr.c | 112 +- reactos/lib/freetype/src/type42/t42objs.c | 46 +- reactos/lib/freetype/src/type42/t42objs.h | 8 +- reactos/lib/freetype/src/type42/t42parse.c | 827 +- reactos/lib/freetype/src/type42/t42parse.h | 7 +- .../internal => src/type42}/t42types.h | 3 +- reactos/lib/freetype/src/winfonts/winfnt.c | 141 +- reactos/lib/freetype/src/winfonts/winfnt.h | 70 +- reactos/lib/freetype/tests/gview.c | 4 +- 286 files changed, 48303 insertions(+), 18924 deletions(-) delete mode 100644 reactos/lib/freetype/Jamfile.in create mode 100644 reactos/lib/freetype/builds/atari/ATARI.H create mode 100644 reactos/lib/freetype/builds/atari/FNames.SIC create mode 100644 reactos/lib/freetype/builds/atari/FREETYPE.PRJ create mode 100644 reactos/lib/freetype/builds/atari/README.TXT create mode 100644 reactos/lib/freetype/builds/win32/visualc/freetype.sln create mode 100644 reactos/lib/freetype/builds/win32/visualc/freetype.vcproj create mode 100644 reactos/lib/freetype/docs/raster.txt create mode 100644 reactos/lib/freetype/include/freetype/cache/ftcmru.h delete mode 100644 reactos/lib/freetype/include/freetype/cache/ftlru.h create mode 100644 reactos/lib/freetype/include/freetype/ftlzw.h rename reactos/lib/freetype/include/freetype/{ftmodule.h => ftmodapi.h} (97%) delete mode 100644 reactos/lib/freetype/include/freetype/internal/bdftypes.h delete mode 100644 reactos/lib/freetype/include/freetype/internal/fnttypes.h delete mode 100644 reactos/lib/freetype/include/freetype/internal/ftcore.h delete mode 100644 reactos/lib/freetype/include/freetype/internal/ftexcept.h delete mode 100644 reactos/lib/freetype/include/freetype/internal/fthash.h delete mode 100644 reactos/lib/freetype/include/freetype/internal/ftobject.h create mode 100644 reactos/lib/freetype/include/freetype/internal/ftrfork.h create mode 100644 reactos/lib/freetype/include/freetype/internal/ftserv.h delete mode 100644 reactos/lib/freetype/include/freetype/internal/psnames.h create mode 100644 reactos/lib/freetype/include/freetype/internal/services/svbdf.h create mode 100644 reactos/lib/freetype/include/freetype/internal/services/svgldict.h create mode 100644 reactos/lib/freetype/include/freetype/internal/services/svmm.h rename reactos/lib/freetype/include/freetype/internal/{pfr.h => services/svpfr.h} (50%) create mode 100644 reactos/lib/freetype/include/freetype/internal/services/svpostnm.h create mode 100644 reactos/lib/freetype/include/freetype/internal/services/svpscmap.h create mode 100644 reactos/lib/freetype/include/freetype/internal/services/svpsinfo.h create mode 100644 reactos/lib/freetype/include/freetype/internal/services/svsfnt.h create mode 100644 reactos/lib/freetype/include/freetype/internal/services/svttcmap.h rename reactos/lib/freetype/{src/sfnt/ttcmap.h => include/freetype/internal/services/svwinfnt.h} (64%) create mode 100644 reactos/lib/freetype/include/freetype/internal/services/svxf86nm.h delete mode 100644 reactos/lib/freetype/install create mode 100644 reactos/lib/freetype/src/autofit/Jamfile create mode 100644 reactos/lib/freetype/src/autofit/afangles.c create mode 100644 reactos/lib/freetype/src/autofit/afdummy.c create mode 100644 reactos/lib/freetype/src/autofit/afdummy.h create mode 100644 reactos/lib/freetype/src/autofit/afglobal.c create mode 100644 reactos/lib/freetype/src/autofit/afglobal.h create mode 100644 reactos/lib/freetype/src/autofit/afhints.c create mode 100644 reactos/lib/freetype/src/autofit/afhints.h create mode 100644 reactos/lib/freetype/src/autofit/aflatin.c create mode 100644 reactos/lib/freetype/src/autofit/aflatin.h create mode 100644 reactos/lib/freetype/src/autofit/afloader.c create mode 100644 reactos/lib/freetype/src/autofit/afloader.h create mode 100644 reactos/lib/freetype/src/autofit/afmodule.c create mode 100644 reactos/lib/freetype/src/autofit/afmodule.h create mode 100644 reactos/lib/freetype/src/autofit/aftypes.h create mode 100644 reactos/lib/freetype/src/autofit/autofit.c create mode 100644 reactos/lib/freetype/src/base/ftrfork.c create mode 100644 reactos/lib/freetype/src/cache/ftcbasic.c delete mode 100644 reactos/lib/freetype/src/cache/ftccache.i create mode 100644 reactos/lib/freetype/src/cache/ftccback.h create mode 100644 reactos/lib/freetype/src/cache/ftcmru.c delete mode 100644 reactos/lib/freetype/src/cache/ftlru.c rename reactos/lib/freetype/{include/freetype/internal => src/cff}/cfftypes.h (97%) create mode 100644 reactos/lib/freetype/src/lzw/Jamfile create mode 100644 reactos/lib/freetype/src/lzw/ftlzw.c create mode 100644 reactos/lib/freetype/src/lzw/rules.mk create mode 100644 reactos/lib/freetype/src/lzw/zopen.c create mode 100644 reactos/lib/freetype/src/lzw/zopen.h delete mode 100644 reactos/lib/freetype/src/sfnt/ttcmap.c create mode 100644 reactos/lib/freetype/src/tools/docmaker/docbeauty.py rename reactos/lib/freetype/{include/freetype/internal => src/type42}/t42types.h (94%) diff --git a/reactos/lib/freetype/ChangeLog b/reactos/lib/freetype/ChangeLog index 86c6fac670b..587f83ef15c 100644 --- a/reactos/lib/freetype/ChangeLog +++ b/reactos/lib/freetype/ChangeLog @@ -1,13 +1,2119 @@ +2004-04-21 David Turner + + * src/cff/cffobjs.c (cff_face_init): fixed a small memory leak + + * src/autofit/afloader.c, src/autofit/afmodule.c, src/base/ftdebug.c: + removed compiler warnings + + * src/autofit/aftypes.h, src/lzw/zopen.c, src/pcf/pcfdrivr.c, + src/pcf/pcfread.c, src/psaux/psobjs.c, src/type42/t42drivr.c: + changed data arrays to "const" to avoid populating the ".data" + segment + +2004-04-20 Werner Lemberg + + * src/psaux/psobjs.c (T1Radix): Renamed to... + (ps_radix): This. + Update current cursor position. + + * docs/CHANGES: Updated. + +2004-04-18 Werner Lemberg + + * src/truetype/ttgload.c, src/truetype/ttgload.h (TT_Load_Glyph), + src/ttdriver.c (Load_Glyph): Change type of `glyph_index' to + FT_UInt. From Lex Warners. + +2004-04-17 Chisato Yamauchi + + * src/sfnt/ttload.c (tt_face_load_sfnt_header): Really fix change + from 2004-03-19. + + * src/bdf/bdfdrivr.c (BDF_Face_Init): Use `ft_strlen'. + + * src/pcf/pcfutil.c, src/pcf/pcfutil.h: Decorate functions with + `static.'. + Remove unused function `RepadBitmap'. + * src/pcf/pcfdrivr.c: Don't include pcfutil.h. + +2004-04-16 Werner Lemberg + + * builds/unix/freetype-config.in (usage): Fix and improve usage + information. + +2004-04-15 Werner Lemberg + + * builds/unix/ftconfig.in, builds/vms/ftconfig.h: Define + FT_CHAR_BIT. + + * src/base/ftobjs.c (FT_Load_Glyph): Don't apply autohinting if + glyph is vertically distorted or mirrored. + + * src/cff/cffgload.c (cff_slot_load): Handle zero `size' properly + for embedded bitmaps. + + * docs/CHANGES: Updated. + +2004-04-15 bytesoftware + + * include/freetype/config/ftconfig.h, src/base/ftstream.c + (FT_Stream_ReadFields): More fixes using FT_CHAR_BIT. + +2004-04-14 Werner Lemberg + + * include/freetype/config/ftconfig.h (FT_CHAR_BIT): New macro. + +2004-04-14 Alex Strelnikov + + * src/cache/ftcsbits.c (ftc_snode_load): Initialize `*asize' in case + of error. + +2004-04-14 Werner Lemberg + + * src/base/ftmac.c [__GNUC__]: Define OS_INLINE. + * builds/unix/configure.ac: Don't try to remove `-ansi' compilation + switch on the Mac. + + * builds/unix/ltmain.sh: Regenerated with `libtoolize --force + --copy' from libtool 1.5.6. + * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from + automake 1.8a. + * builds/unix/configure: Regenerated with autoconf 2.59a. + +2004-04-13 Werner Lemberg + + * include/freetype/config/ftconfig.h: Use CHAR_BIT to define + size of FT_SIZEOF_xxx. + +2004-04-12 Chisato Yamauchi + + * include/freetype/internal/sfnt.h (TT_Find_SBit_Image_Func, + TT_Load_SBit_Metrics_Func): New typedefs. + (SFNT_Interface): Add find_sbit_image and load_sbit_metrics. + + * src/sfnt/sfdriver.c (sfnt_interface): Updated. + * src/sfnt/ttsbit.h (tt_find_sbit_image, tt_load_sbit_metrics): New + declarations. + * src/sfnt/ttsbit.c (find_sbit_image): Renamed to... + (tt_find_sbit_image): This. + Updated all callers. + (load_sbit_metrics): Renamed to... + (tt_load_sbit_metrics): This. + Updated all callers. + +2004-04-12 Werner Lemberg + + * configure: Accept makepp also. + + * builds/unix/detect.mk: Use proper path to unix-def.mk. + * builds/unix/unix-def.in (BUILD_DIR, PLATFORM): Remove. + * builds/unix/unix.mk (BUILD_DIR, PLATFORM): Define. + Use BUILD_DIR. + + * docs/INSTALL, docs/INSTALL.GNU, docs/INSTALL.UNX: Update + documentation on makepp. + +2004-04-11 Werner Lemberg + + * src/lzw/zopen.c: Don't include sys/param.h and sys/stat.h. + +2004-04-10 Werner Lemberg + + * src/lzw/ftlzw.c: Include zopen.h dependent on + FT_CONFIG_OPTION_USE_LZW. + + * src/base/ftdebug.c: s/index/idx/ to avoid compiler warnings. + +2004-04-02 Werner Lemberg + + * builds/unix/ltmain.sh: Regenerated with `libtoolize --force + --copy' from libtool 1.5.2. + * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from + automake 1.8a. + * builds/unix/configure: Regenerated with autoconf 2.59a. + +2004-04-01 Werner Lemberg + + * builds/unix/ft-munmap.m4 (FT_MUNMAP_PARAM): Fix arguments of + AC_COMPILE_IFELSE. + * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from + automake 1.8a. + * builds/unix/configure: Regenerated with autoconf 2.59a. + * builds/unix/config.guess, builds/unix/config.sub: Updated from + `config' CVS module at subversions.gnu.org + * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from + `texinfo' CVS module at subversions.gnu.org. + * builds/freetype.mk (refdoc): Updated. + +2004-03-31 Werner Lemberg + + Handle broken FNT files which don't have a trailing NULL byte + in the face name string. + + * src/winfnt/winfnt.h (FNT_FontRec): New member `family_name'. + * src/winfnt/winfnt.c (fnt_font_done): Free font->family_name. + (FNT_Face_Init): Append a final zero byte to the font face name. + +2004-03-30 Werner Lemberg + + * src/sfnt/ttload.c (tt_face_load_sfnt_header): Fix change from + 2004-03-19. + +2004-03-27 Werner Lemberg + + * src/base/descrip.mms (OBJS): Add ftbbox.obj. + +2004-03-26 George Williams + + Add vertical phantom points. + + * include/freetype/internal/tttypes.h (TT_LoaderRec): Add + `top_bearing', `vadvance', `pp3, and `pp4'. + + * src/autofit/afloader.c (af_loader_load_g): Handle two more points. + + * src/autohint/ahhint.c (ah_hinter_load): Handle two more points. + * src/truetype/ttgload.c (Get_VMetrics): New function. + (TT_Load_Simple_Glyph, TT_Process_Simple_Glyph): Handle two more + points. + (load_truetype_glyph): Use Get_VMetrics. + Handle two more points. + (compute_glyph_metrics): Thanks to vertical phantom points we now + can always compute `advance_height' and `top_bearing'. + * src/truetype/ttobjs.h (TT_SubglyphRec): Add vertical phantom + points. + + + * src/autohint/ahglyph.c (ah_outline_load): Fix allocation of + `news'. + +2004-03-21 Werner Lemberg + + * src/bdf/bdfdrivr.c (BDF_Glyph_Load): Fix left side bearing. + +2004-03-20 Steve Hartwell + + * src/cache/ftcmru.c (FTC_MruList_RemoveSelection): Handle a NULL + value for `selection' as `select all'. + +2004-03-19 Steve Hartwell + + * src/sfnt/ttload.c (tt_face_load_sfnt_header): Reject face_index + values > 0 if loading non-TTC fonts. + + * src/base/ftmac.c (open_face_from_buffer): Set positive face_index + to zero before calling FT_Open_Face. + + * docs/CHANGES: Updated. + +2004-03-04 Werner Lemberg + + * Jamfile, vms_make.com, builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype/vcproj, include/freetype/ftmoderr.h: + Add LZW module. + + * Jamfile.in: Removed. + + * docs/CHANGES: Updated. + + * include/freetype/internal/ftobjs.h: s/MIN/FT_MIN/, s/MAX/FT_MAX/, + s/ABS/FT_ABS/. Updated all callers. + + * src/type1/t1load.c (parse_dict), src/pcf/pcfdrivr.c + (PCF_Face_Init): Use FT_ERROR_BASE. + +2004-03-04 Albert Chin + + Add support for PCF fonts compressed with LZW (extension .pcf.Z, + created with `compress'). + + * include/freetype/config/ftoption.h, devel/ftoption.h + (FT_CONFIG_OPTION_USE_LZW): New macro. + + * include/freetype/ftlzw.h: New file. + * include/freetype/config/ftheader.h (FT_LZW_H): New macro for + ftlzw.h. + + * src/lzw/*: New files. + + * src/pcf/pcfdrivr.c: Include FT_LZW_H. + (PCF_Face_Init): Try LZW also. + + * src/gzip/ftgzip.c: s/0/Gzip_Err_Ok/ where appropriate. + Beautify. + +2004-03-03 Werner Lemberg + + * src/pshinter/pshalgo.c (psh_hint_table_init): Simplify code. + +2004-03-02 Werner Lemberg + + Add embedded bitmap support to CFF driver. + + * src/cff/cffobjs.h (CFF_SizeRec): New structure. + + * src/cff/cffgload.c (cff_builder_init): Updated. + (cff_slot_load): Updated. + [TT_CONFIG_OPTION_EMBEDDED_BITMAPS]: Load sbit. + + * src/cff/cffobjs.c (sbit_size_reset) + [TT_CONFIG_OPTION_EMBEDDED_BITMAPS]: New function. + (cff_size_get_globals_funcs, cff_size_done, cff_size_init): Updated. + (cff_size_reset): Updated. + [TT_CONFIG_OPTION_EMBEDDED_BITMAPS]: Call sbit_size_reset. + + * src/cff/cffdrivr.c (Load_Glyph): Updated. + (cff_driver_class): Use CFF_SizeRec. + + * docs/CHANGES: Updated. + +2004-03-01 Werner Lemberg + + * src/pshinter/pshglob.c (psh_globals_scale_widths): Don't use + FT_RoundFix but FT_PIX_ROUND. + (psh_blues_snap_stem): Don't use blue_shift but blue_threshold. + + * src/pshinter/pshalgo.c (PSH_STRONG_THRESHOLD_MAXIMUM): New macro. + (psh_glyph_find_string_points): Use PSH_STRONG_THRESHOLD_MAXIMUM. + (psh_glyph_find_blue_points): New function. Needed for fonts like + p052003l.pfb (URW Palladio L Roman) which have flex curves at the + base line within blue zones, but the flex curves aren't covered by + hints. + (ps_hints_apply): Use psh_glyph_find_blue_points. + +2004-02-27 Garrick Meeker + + * builds/unix/configure.ac: Fix compiler flags for + `--with-old-mac-fonts'. + * builds/unix/configure: Regenerated. + + * src/base/ftmac.c: s/TARGET_API_MAC_CARBON/!TARGET_API_MAC_OS8/. + (FT_New_Face_From_Resource): New function. + (FT_New_Face): Use FT_New_Face_From_Resource. + (FT_New_Face_From_FSSpec): Use FT_New_Face_From_Resource. + [__MWERKS__]: Don't include FSp_fopen.h. + +2004-02-26 Werner Lemberg + + * src/pshinter/pshglob.c (psh_globals_new): Fix value of + `dim->stdw.count'. + Don't assign default values to blue scale and blue shift. + +2004-02-25 Werner Lemberg + + * docs/CHANGES: Updated. + +2004-02-25 Garrick Meeker + Steve Hartwell + + Improve MacOS fond support. Provide a new API + `FT_New_Face_From_FSSpec' similar to `FT_New_Face'. + + * src/base/ftmac.c [__MWERKS__]: Include FSp_fpopen.h. + STREAM_FILE [__MWERKS__]: New macro. + (ft_FSp_stream_close, ft_FSp_stream_io) [__MWERKS__]: New functions. + (file_spec_from_path) [__MWERKS__]: Updated #if statement. + (get_file_type, make_lwfn_spec): Use `const' for argument. + (is_dfont) [TARGET_API_MAC_CARBON]: Removed. + (count_face_sfnt, count_faces): New functions. + (parse_fond): Do some range checking. + (read_lwfn): Change type of second argument. + No longer call FSpOpenResFile. + (OpenFileAsResource): New function. + (FT_New_Face_From_LWFN): Use `const' for second argument. + Use OpenFileAsResource. + (FT_New_Face_From_Suitcase): Change type of second argument. + No longer call FSpOpenResFile. + Loop over all resource indices. + (FT_New_Face_From_dfont) [TARGET_API_MAC_CARBON]: Removed. + (FT_GetFile_From_Mac_Name): Use `const' for first argument. + (ResourceForkSize): Removed. + (FT_New_Face): Updated to use new functions. + (FT_New_Face_From_FSSpec): New function. + + * include/freetype/ftmac.h: Updated. + +2004-02-24 Malcolm Taylor + + * src/autohint/ahhint.c (ah_hinter_load) : + Handle case where outline->num_vedges is zero while computing hinted + metrics. + +2004-02-24 Gordon Childs + + * src/cff/cffcmap.c (cff_cmap_unicode_init): Provide correct value + for `count'. + +2004-02-24 Werner Lemberg + + * include/freetype/t1tables.h (PS_PrivateRec): Add + `expansion_factor'. + + * src/pshinter/pshglob (psh_blues_scale_zones): Fix computation + of blues->no_overshoots -- `blues_scale' is stored with a + magnification of 1000, and `scale' returns fractional pixels. + + * src/type1/t1load.c (T1_Open_Face): Initialize `blue_shift', + `blue_fuzz', `expansion_factor', and `blue_scale' according to the + Type 1 specification. + + * src/type1/t1tokens.h: Handle `ExpansionFactor'. + + * docs/CHANGES: Updated. + +2004-02-24 Masatake YAMATO + + Provide generic access to MacOS resource forks. + + * src/base/ftrfork.c, include/freetype/internal/ftrfork.h: New + files. + + * src/base/ftobjs.c: Include FT_INTERNAL_RFORK_H. + (Mac_Read_POST_Resource, Mac_Read_sfnt_Resource): Remove arguments + `resource_listoffset' and `resource_data' and adapt code + accordingly. These values are calculated outside of the function + now. + Add new argument `offsets'. + (IsMacResource): Use `FT_Raccess_Get_HeaderInfo' and + `FT_Raccess_Get_DataOffsets'. + (load_face_in_embedded_rfork): New function. + (load_mac_face): Use load_face_in_embedded_rfork. + (ft_input_stream_new): Renamed to... + (FT_Stream_New): This. Use FT_BASE_DEF. Updated all callers. + (ft_input_stream_free): Renamed to... + (FT_Stream_Free): This. Use FT_BASE_DEF. Updated all callers. + + * src/base/ftbase.c: Include ftrfork.c. + + * src/base/rules.mk (BASE_SRC), src/base/Jamfile: Updated. + + * include/freetype/internal/internal.h (FT_INTERNAL_RFORK_H): + New macro. + + * include/freetype/internal/fttrace.h: Added `rfork' as a new + trace definition. + + * include/freetype/internal/ftstream.h: Declare FT_Stream_New and + FT_Stream_Free. + + * include/freetype/config/ftoption.h, devel/ftoption.h + (FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK): New option. + + * include/freetype/config/ftstdlib.h (ft_strrchr): New macro. + +2004-02-23 Werner Lemberg + + * docs/CHANGES: Updated. + + * include/freetype/internal/ftdebug.h: Include FT_FREETYPE_H. + +2004-02-23 Masatake YAMATO + + Provide a simple API to control FreeType's tracing levels. + + * include/freetype/internal/ftdebug.h (FT_Trace_Get_Count, + FT_Trace_Get_Name): New declarations. + + * src/base/ftdebug.c (FT_Trace_Get_Count, FT_Trace_Get_Name): New + functions. + +2004-02-23 David Turner + + * src/autofit/afhints.c, src/autofit/afhints.h, + src/autofit/aflatin.c, src/autofit/afloader.c, src/types.h: Grave + bugs have been fixed. The auto-fitter works, doesn't crash, but + still produces unexpected results... + +2004-02-21 Werner Lemberg + + * src/pshinter/pshalgo.c (PSH_STRONG_THRESHOLD): Changed to hold + the accepted shift for strong points in fractional pixels (which + is a heuristic value). + (psh_glyph_find_strong_points): Compute threshold for + psh_hint_table_find_strong_points. + (psh_hint_table_find_strong_point): Add parameter to pass threshold. + +2004-02-20 Werner Lemberg + + * src/pshinter/pshrec.c (ps_mask_table_set_bits): Don't call + ps_mask_table_alloc but ps_mask_table_last. + (ps_hints_t2mask): Use correct position and number for vertical + and horizontal hinter mask bits. + + * docs/CHANGES: Updated. + +2004-02-19 Werner Lemberg + + * src/base/ftstroke.c (FT_Glyph_StrokeBorder): Fix enum handling. + * src/cff/cffdrivr.c (cff_get_cmap_info): Remove compiler warning. + +2004-02-18 Werner Lemberg + + * include/freetype/freetype.h: Document FT_LOAD_TARGET_XXX properly. + + * src/base/ftglyph.c (ft_bitmap_glyph_class, + ft_outline_glyph_class): Tag with FT_CALLBACK_TABLE_DEF. + + * src/smooth/ftsmooth.c (ft_smooth_render): Handle + FT_RENDER_MODE_LIGHT. + +2004-02-17 Werner Lemberg + + Fix callback functions in cache module. + + * src/cache/ftccback.h: New file for callback declarations. + + * src/cache/ftcbasic.c (ftc_basic_family_compare, + ftc_basic_family_init, ftc_basic_family_get_count, + ftc_basic_family_load_bitmap, ftc_basic_family_load_glyph, + ftc_basic_gnode_compare_faceid): Use FT_CALLBACK_DEF. + (ftc_basic_image_family_class, ftc_basic_image_cache_class, + ftc_basic_sbit_family_class, ftc_basic_sbit_cache_class): + Use FT_CALLBACK_TABLE_DEF and local wrapper functions. + + * src/cache/ftccache.c: Include ftccback.h. + (ftc_cache_init, ftc_cache_done): New wrapper functions which use + FT_LOCAL_DEF. + + * src/cache/ftccmap.c: Include ftccback.h. + (ftc_cmap_cache_class): Use local wrapper functions. + + * src/cache/ftcglyph.c: Include ftccback.h. + (ftc_gnode_compare, ftc_gcache_init, ftc_gcache_done): New wrapper + functions which use FT_LOCAL_DEF. + + * src/cache/ftcimage.c: Include ftccback.h. + (ftc_inode_free, ftc_inode_new, ftc_inode_weight): New wrapper + functions which use FT_LOCAL_DEF. + + * src/cache/ftcmanag.c (ftc_size_list_class, ftc_face_list_class): + Use FT_CALLBACK_TABLE_DEF. + + * src/cache;/ftcsbits.c: Include ftccback.h. + (ftc_snode_free, ftc_snode_new, ftc_snode_weight, + ftc_snode_compare): New wrapper functions which use FT_LOCAL_DEF. + + * src/cache/rules.mk (CACHE_DRV_H): Add ftccback.h. + +2004-02-17 Masatake YAMATO + + * include/freetype/ftmac.h (FT_GetFile_From_Mac_Name): Fix a typo + (FT_EXPORT_DEF -> FT_EXPORT). + + * include/freetype/ftxf86.h (FT_Get_X11_Font_Format): Ditto. + +2004-02-15 Werner Lemberg + + * src/base/ftobjs.c (FT_Set_Char_Size): Fix typo. + +2004-02-14 Masatake YAMATO + + * builds/unix/ftsystem.c: Include errno.h. + (ft_close_stream): Renamed to... + (ft_close_stream_by_munmap): This. + (ft_close_stream_by_free): New function. + (FT_Stream_Open): Use fallback method if mmap fails. + Use proper function for closing the stream. + +2004-02-14 Werner Lemberg + + * src/type1/t1load.c (parse_dict): Initialize `start_binary'. + +2004-02-13 Robert Etheridge + + * src/type42/t42objs.c (T42_Face_Init), src/type1/t1objs.c + (T1_Face_Init), src/cid/cidobjs.c (cid_face_init): Fix computation + of underline_position and underline_thickness. + +2004-02-12 Werner Lemberg + + * src/base/ftobjs.c (FT_Set_Char_Size): Return immediately if + ppem values don't change. Suggested by Graham Asher. + +2004-02-11 Werner Lemberg + + * src/cid/cidload.c (cid_face_open): Always allocate + face->cid_stream so that we can deallocate it safely. + +2004-02-10 Werner Lemberg + + Make the PS parser more tolerant w.r.t. non-standard font data. In + general, an error is only reported in case of a syntax error; a + wrong type is now simply ignored (if possible). To be independent + of the order of various MM-specific keywords, the parse_shared_dict + routine has been removed -- the PS parser is now capable to skip + this data. It no longer fails on parsing e.g. + + dup /WeightVector exch def + + Since the token following /WeightVector isn't `[' (starting an + array) it is simply ignored. + + * include/freetype/fterrdef.h: Define `FT_Err_Ignore' (0xA2) as a + new internal error value. + + * src/type1/t1load.c (parse_blend_axis_types, + parse_blend_design_positions, parse_blend_design_map): Return + T1_Err_Ignore if no proper array is following the keyword. + (parse_weight_vector): Use T1_ToTokenArray, initializing `blend' + structure, if necessary. + Return T1_Err_Ignore if no proper array is following the keyword. + (parse_shared_dict): Removed. + (parse_encoding): Set parser->root.error to return T1_Err_Ignore + if no result can be obtained. + Check for errors before accessing `elements' array. + (t1_keywords): Remove /shareddict. + (parse_dict): Reset error if t1_load_keyword returns T1_Err_Ignore. + Set keyword_flag only in case of success. + Check error code if skipping an unrecognized token. + (T1_Open_Face) [!T1_CONFIG_OPTION_NO_MM_SUPPORT]: Call T1_Done_Blend + if blend commands haven't set up a proper MM font. + + * src/psaux/psobjs.c (ps_parser_load_field_table): Remove special + code for synthetic fonts. + Return PSaux_Err_Ignore if no proper value has been found. + +2004-02-09 Werner Lemberg + + * src/cff/cffgload.c (cff_decoder_parse_charstrings) + : Preserve glyph width before calling + cff_operator_seac. + +2004-02-09 Martin Muskens + + * src/cff/cffgload.c (cff_decoder_parse_charstrings): Handle special + first argument for `hintmask' and `cntrmask' operators also. + +2004-02-08 Werner Lemberg + + * builds/unix/configure.in: Call AC_SUBST for `enable_shared', + `hardcode_libdir_flag_spec', and `wl'. + * builds/unix/configure: Regenerated. + + * builds/unix/freetype-config.in: Make --prefix and --exec-prefix + actually work. + Report a proper --rpath (or -R) value for --libs argument if a + shared library has been built. + + * docs/CHANGES: Updated. + +2004-02-07 Keith Packard + + * src/bdf/bdfdrivr.c (BDF_Face_Init, BDF_Set_Pixel_Size): Fix + computation of various vertical and horizontal metric values. + + * src/pcfdrivr.c (PCF_Set_Pixel_Size), src/pcfread (pcf_load_font): + Ditto. + +2004-02-07 Werner Lemberg + + * builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.dsw, docs/CHANGES: Updated. + +2004-02-07 Vitaliy Pasternak + + * builds/win32/visualc/freetype.sln, + builds/win32/visualc/freetype.vcproj: New files for VS.NET 2003. + +2004-02-03 Werner Lemberg + + * include/freetype/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP): + Initialize `node'. + * src/type1/t1load.c (parse_dict): Initialize `have_integer'. + +2004-02-02 Werner Lemberg + + * src/type1/t1load.c (parse_dict): Handle `RD' and `-|' commands + outside of /Subrs or /CharStrings. This can happen if there is + additional code manipulating those two arrays so that FreeType + doesn't recognize them properly. + (T1_Open_Face): Improve an error message. + +2004-02-01 Werner Lemberg + + * src/type1/t1load.c (parse_charstrings): Exit immediately if + there are no elements in /CharStrings. This is needed for fonts + like Optima-Oblique which not only define /CharStrings but access it + also. + +2004-02-01 David Turner + + * src/sfnt/Jamfile: Removing `ttcmap' from the list of sources. + + * include/freetype/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP) + : Provide macro version which doesn't use inline code. + * include/freetype/cache/ftcglyph.h (FTC_GCACHE_LOOKUP_CMP) + : Ditto. + Use FTC_MRULIST_LOOKUP_CMP. + * include/freetype/cache/ftcmru.h (FTC_MRULIST_LOOKUP_CMP): New + macro. + (FTC_MRULIST_LOOKUP): Use it. + + * src/cache/Jamfile (_sources), src/cache/descrip.mms: Updated. + * src/cache/ftcbasic.c: Fix compiler warnings. + * src/cache/ftcmanag.c (FTC_Manager_LookupSize, + FTC_Manager_LookupFace) : Use FTC_MRULIST_LOOKUP_CMP. + * src/cache/ftcmru.c (FTC_MruList_Find): Fix a bug (found after + heavy testing). + + * Jamfile: Updating `refdoc' target, and adding `autohint' to the + list of modules to build. Both the autohinter and autofitter will + be built by default. But which one will be used is determined by + the content of `ftmodule.h'. + + * src/autofit/*: Many updates, but the code is still buggy... + +2004-01-31 Werner Lemberg + + * src/cff/cffgload.c (cff_operator_seac): Fix magnitude of + accent offset. + Update code similarly to the seac support for Type 1 fonts. + (cff_decoder_parse_charstrings) : Fix magnitude + of accent offset. + Don't hint glyphs twice if seac is emulated. + : Assign correct point tags. + * docs/CHANGES: Updated. + +2004-01-30 Werner Lemberg + + * src/type1/t1parse.c (T1_Get_Private_Dict): Use FT_MEM_MOVE, not + FT_MEM_COPY, for copying the private dict. + + * src/type1/t1load.c (parse_subrs): Assign number of subrs only + in first run. + (parse_charstrings): Parse /CharStrings in second run without + assigning values. + (parse_dict): Skip all /CharStrings arrays but the first. We need + this for non-standard fonts like `Optima' which have different + outlines depending on the resolution. Note that there is no + guarantee that we get fitting /Subrs and /CharStrings arrays; this + can only be done by a real PS interpreter. + +2004-01-29 Antoine Leca + + * builds/win32/visualc/index.html: New file, giving detailed + explanations about forcing CR+LF line endings for the VC++ project + files. + +2004-01-22 Garrick Meeker + + * src/cff/cffload.c (cff_subfont_load): Initialize `dict'. + +2004-01-22 Werner Lemberg + + Add support for the hexadicimal representation of binary data + started with `StartData' in CID-keyed Type 1 fonts. + + * include/freetype/internal/t1types.h (CID_FaceRec): Add new + members `binary_data' and `cid_stream'. + + * src/cid/cidload.c (cid_read_subrs): Use `face->cid_stream'. + (cid_hex_to_binary): New auxiliary function. + (cid_face_open): Add new argument `face_index' to return quickly + if less than zero. Updated all callers. + Call `cid_hex_to_binary', then open and assign memory stream to + `face->cid_stream' if `parser->binary_length' is non-zero. + * src/cid/cidload.h: Updated. + + * src/cid/cidobjs.c (cid_face_done): Free `binary_data' and + `cid_stream'. + + * src/cid/cidparse.c (cid_parser_new): Check arguments to + `StartData' and set parser->binary_length accordingly. + * src/cid/cidparse.h (CID_Parser): New member `binary_length'. + + * src/cid/cidgload.c (cid_load_glyph): Use `face->cid_stream'. + + * docs/CHANGES: Updated. + +2004-01-21 Werner Lemberg + + include/freetype/config/ftstdlib.h (ft_atoi): Replaced with... + (ft_atol): This. + * src/base/ftdbgmem.c: s/atol/ft_atol/. + * src/type42/t42drivr.c: s/ft_atoi/ft_atol/. + +2004-01-20 Masatake YAMATO + + * include/freetype/ftcache.h: Delete duplicated definition of + FTC_FaceID. + + * src/cff/cffdrivr.c (cff_get_cmap_info): Call sfnt module's TT CMap + Info service function if the cmap comes from sfnt. Return 0 if the + cmap is sythesized in cff module. + +2004-01-20 David Turner + + * src/cache/ftcmanag.c (ftc_size_node_compare): Call + FT_Activate_Size. + +2004-01-20 Werner Lemberg + + * src/type1/t1parse.c (T1_Get_Private_Dict): Skip exactly one + CR, LF, or CR/LF after `eexec'. + +2004-01-18 David Turner + + * src/sfnt/ttsbit.c (tt_face_set_sbit_strike): Remove compiler + warning. + + * src/tools/docmaker/*: Updating beautifier tool. + +2004-01-15 David Turner + + * src/base/ftoutln.c (ft_orientation_extremum_compute): Fix + infinite loop bug. + + * include/freetype/ftstroke.h: Include FT_GLYPH_H. + (FT_Stroker_Rewind, FT_Glyph_Stroke, FT_Glyph_StrokeBorder): New + declarations. + + * src/base/ftstroke.c: Include FT_INTERNAL_OBJECTS_H. + (FT_Outline_GetOutsideBorder): Inverse result. + (FT_Stroker_Rewind, FT_Glyph_Stroke, FT_GlyphStrokeBorder): New + functions. + (FT_Stroker_EndSubPath): Close path if needed. + (FT_Stroker_Set, FT_Stroker_ParseOutline): Use FT_Stroker_Rewind. + + * include/freetype/cache/ftcmanag.h (FTC_ScalerRec, + FTC_Manager_LookupSize): Moved to... + * include/freetype/ftcache.h (FTC_ScalerRec, + FTC_Manager_LookupSize): Here. + + * src/tools/docmaker/docbeauty.py: New file to beautify the + documentation comments (e.g., to convert them to single block border + mode). + * src/tools/docmaker/docmaker.py (file_exists, make_file_list): + Moved to... + * src/tools/docmaker/utils.py (file_exists, make_file_list): Here. + +2004-01-14 David Turner + + * include/freetype/internal/ftmemory.h (FT_ARRAY_COPY, + FT_ARRAY_MOVE): New macros to make copying arrays easier. + Updated all relevant code to use them. + +2004-01-14 Werner Lemberg + + * src/cff/cffload.c (cff_font_load): Load charstrings_index earlier. + Use number of charstrings as argument to CFF_Load_FD_Select (as + documented in the CFF specs). + +2004-01-13 Graham Asher + + * src/pshinter/pshalgo.c (psh_glyph_init): Move assignment of + `glyph->memory' up to free arrays properly in case of failure. + +2004-01-10 Masatake YAMATO + + Make `FT_Get_CMap_Language_ID' work with CFF. Bug reported by + Steve Hartwell . + + * src/cff/cffdrivr.c: Include FT_SERVICE_TT_CMAP_H. + (cff_services): Added an entry for FT_SERVICE_ID_TT_CMAP. + (cff_get_cmap_info): New function. + (cff_service_get_cmap_info) New entry for cff_services. + + * src/sfnt/ttcmap0.c: Exit loop after a format match has been found. + Suggested by Steve Hartwell . + +2004-01-03 Masatake YAMATO + + * src/base/ftobjs.c (destroy_charmaps): New function. + (destroy_face, open_face): Use `destroy_charmaps'. + +2004-01-01 Werner Lemberg + + * docs/CHANGES: Updated. + +2004-01-01 Michael Jansson + + * src/winfonts/winfnt.c (FNT_Size_Set_Pixels): Fix sign of + size->metrics.descender. + +2003-12-31 Wolfgang Domr鰏e + + * src/cff/cffgload.c (cff_decoder_parse_charstrings) + [FT_DEBUG_LEVEL_TRACE]: Use `%ld' in FT_TRACE4. + : Change type of dx and dy to FT_Pos and remove + cast for accessing arguments. + +2003-12-31 Werner Lemberg + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Revert previous + change. It's not necessary. + +2003-12-29 Smith Charles + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Handle `repeated + flags set' correctly. + +2003-12-29 Werner Lemberg + + * src/cff/cffobjs.c (cff_face_init): Fix memory leak by deallocating + `full' and `weight' properly. + * src/cff/cffgload.c (cff_decoder_parse_charstrings) + [FT_DEBUG_LEVEL_TRACE]: Use `0x' as prefix for + tracing output. + +2003-12-26 Werner Lemberg + + * include/freetype/internal/sfnt.h (TT_Set_SBit_Strike_Func): + Use FT_UInt for ppem values. + * src/sfnt/ttsbit.c (tt_face_set_sbit_strike): Use FT_UInt for + ppem values. + * src/sfnt/ttsbit.h: Updated. + + * src/base/ftobjs.c (FT_Set_Pixel_Sizes): Don't allow ppem values + larger than -0FFFF. + +2003-12-25 Werner Lemberg + + * src/base/fttrigon.c, src/base/ftgloadr.c: Inlude + FT_INTERNAL_OBJECTS_H. + + * src/base/ftstroke.c (FT_Outline_GetInsideBorder, + FT_Outline_GetOutsideBorder): s/or/o/ to make it compile with + C++ compilers. + + * src/cache/ftcmru.c, include/freetype/cache/ftcmru.h: + s/select/selection/ to avoid compiler warning. + * src/cff/cffload.h: s/select/ftselect/ to avoid potential + compiler warning. + +2003-12-24 Werner Lemberg + + * src/cache/ftcsbits.c (FTC_SNode_Weight): + s/FTC_SBIT_ITEM_PER_NODE/FTC_SBIT_ITEMS_PER_NODE/. + +2003-12-24 David Turner + + * Fixed compilation problems in the cache sub-system. + + * Partial updates to src/autofit. + + * Jamfile (FT2_COMPONENTS): Add autofit module. + +2003-12-23 Werner Lemberg + + * src/cff/cffgload.c (cff_lookup_glyph_by_stdcharcode): Handle + CID-keyed fonts. + +2003-12-23 David Turner + + * include/freetype/internal/ftobjs.h (FT_PAD_FLOOR, FT_PAD_ROUND, + FT_PAD_CEIL, FT_PIX_FLOOR, FT_PIX_ROUND, FT_CEIL): New macros. They + are used to avoid compiler warnings with very pedantic compilers. + Note that `(x) & -64' causes a warning if (x) is not signed. Use + `(x) & ~63' instead! + Updated all related code. + + Add support for extraction of `inside' and `outside' borders. + + * src/base/ftstroke.c (FT_StrokerBorder): New enumeration. + (FT_Outline_GetInsideBorder, FT_Outline_GetOutsideBorder, + FT_Stroker_GetBorderCounts, FT_Stroker_ExportBorder): New functions. + (FT_StrokeBorderRec): New boolean member `valid'. + (ft_stroke_border_get_counts): Updated. + * include/freetype/ftstroke.h: Updated. + +2003-12-22 Werner Lemberg + + * include/freetype/ftwinfnt.h (FT_WinFNT_ID_*): New definitions + to describe the `charset' field in FT_WinFNT_HeaderRec. + * src/winfonts/winfnt.c (FNT_Face_Init): Set encoding to + FT_ENCODING_NONE except for FT_WinFNT_ID_MAC. + + * include/freetype/freetype.h (FT_Encoding): Improve comment, + based on work by Detlef W黵kner . + + * docs/CHANGES: Updated. + +2003-12-22 David Turner + + * include/freetype/ftcache.h, + include/freetype/cache/ftcmanag.h, + include/freetype/cache/ftccache.h, + include/freetype/cache/ftcmanag.h, + include/freetype/cache/ftcmru.h (added), + include/freetype/cache/ftlru.h (removed), + include/freetype/cache/ftcsbits.h, + include/freetype/cache/ftcimage.h, + include/freetype/cache/ftcglyph.h, + src/cache/ftcmru.c, + src/cache/ftcmanag.c, + src/cache/ftccache.c, + src/cache/ftcglyph.c, + src/cache/ftcimage.c, + src/cache/ftcsbits.c, + src/cache/ftccmap.c, + src/cache/ftcbasic.c (added), + src/cache/ftclru.c (removed): + + *Complete* rewrite of the cache sub-system to `solve' the + following points: + + - all public APIs have been moved to FT_CACHE_H, everything + under `include/freetype/cache' is only needed by client + applications that want to implement their own caches + + - a new function named FTC_Manager_RemoveFaceID to deal + with the uninstallation of FaceIDs + + - the image and sbit cache are now abstract classes, that + can be extended much more easily by client applications + + - better performance in certain areas. Further optimizations + to come shortly anyway... + + - the FTC_CMapCache_Lookup function has changed its signature, + charmaps can now only be retrieved by index + + - FTC_Manager_Lookup_Face => FTC_Manager_LookupFace + FTC_Manager_Lookup_Size => FTC_Manager_LookupSize (still in + private header for the moment) + +2003-12-21 Werner Lemberg + + * src/type1/t1load.c (parse_dict): Stop parsing if `eexec' keyword + is encountered. + +2003-12-19 Werner Lemberg + + * src/cff/cfftypes.h (CFF_MAX_CID_FONTS): Increase to 32. For + example, the Japanese Hiragino font already contains 15 subfonts. + + * src/cff/cffload.c (cff_font_load): Deallocate `sids' array for + CID-keyed fonts. + + * devel/ftoption.h: Define FT_DEBUG_MEMORY. + +2003-12-18 Werner Lemberg + + * include/freetype/ttnameid.h (TT_ADOBE_ID_LATIN_1): New macro. + * src/type1/t1objs.c (T1_Face_Init): Use TT_ADOBE_ID* values. + +2003-12-18 Werner Lemberg + + * src/cff/cfftypes.h (CFF_FontRecDictRec): Change type of + `cid_count' to `FT_ULong'. + + * src/cff/cffgload.c (cff_slot_load): Take care of empty `cids' + array. + + * src/cff/cffload.c (cff_charset_done): Free `cids' array. + (cff_font_load): Create cids array only for CID-keyed fonts which + are subsetted. + + * src/cff/cffobjs.c (cff_face_init): Check the availability of + the PSNames modules for non-pure CFFs also. + Set FT_FACE_FLAG_GLYPH_NAMES for a non-pure CFF also if it isn't + CID-keyed. + + * src/cff/rules.mk (CFF_DRV_H): Add cfftypes.h. + +2003-12-17 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_init_face): Don't set + FT_FACE_FLAG_GLYPH_NAMES if the font contains a version 3.0 `post' + table. + + * docs/CHANGES: Updated. + +2003-12-17 Masatake YAMATO + + Add new function FT_Get_CMap_Language_ID to extract the language ID + for TrueType/sfnt fonts. + + * include/freetype/internal/services/svttcmap.h: New file. + * include/freetype/internal/ftserv.h (FT_SERVICE_TT_CMAP_H): Add + svttcmap.h. + + * src/sfnt/sfdriver.c: Include ttcmap0.h. + (tt_service_get_cmap_info): New service. + (sfnt_services): Updated. + + * src/sfnt/ttcmap0.c (tt_cmap*_get_info): New functions. + (tt_cmap*_class_rec): Add tt_cmap*_get_info members. + (tt_get_cmap_info): New function. + * src/sfnt/ttcmap0.h: Include FT_SERVICE_TT_CMAP_H. + (TT_CMap_ClassRec): New field `get_cmap_info'. + (tt_get_cmap_info): New declaration. + + * src/base/ftobjs.c: Include FT_SERVICE_TT_CMAP_H. + (FT_Get_CMap_Language_ID): New function implementation. + * include/freetype/tttables.h (FT_Get_CMap_Language_ID): New + function declaration. + +2003-12-16 Werner Lemberg + + * src/sfnt/ttcmap.c, src/sfnt/ttcmap.h: Removed. Obsolete. + + * include/freetype/internal/sfnt.h (SFNT_Interface): Remove + obsolete fields `load_charmap' and `free_charmap'. + (TT_CharMap_Load_Func, TT_CharMap_Free_Func): Removed. + * src/sfnt/sfnt.c: Don't include ttcmap.c. + * src/sfnt/rules.mk (SFNT_DRV_SRC): Don't include ttcmap.c. + * src/sfnt/ttload.c: Don't include ttcmap.h. + * src/sfnt/sfdriver.c: Don't include ttcmap.h. + (sfnt_interface): Updated. + + * include/freetype/internal/tttypes.h (TT_TableDirRec, + TT_CMapDirRec, TT_CMapDirEntryRec, TT_CMap0, TT_CMap2SubHeaderRec, + TT_CMap2Rec, TT_CMap4Segment, TT_CMap4Rec, TT_CMap6, + TT_CMapGroupRec, TT_CMap8_12Rec, TT_CMap10Rec, TT_CharMap_Func, + TT_CharNext_Func, TT_CMapTableRec, TT_CharMapRec): Removed. + Obsolete. + * src/cff/cffobjs.h (CFF_CharMapRec): Removed. Obsolete. + +2003-12-15 Werner Lemberg + + * docs/CHANGES: Updated. + +2003-12-15 Wolfgang Domr鰏e + + * builds/atari/*: New directory for building FreeType 2 on Atari + with the PureC compiler. + +2003-12-12 Wolfgang Domr鰏e + + * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String): Add + cast. + * src/cff/cffdrivr.c (cff_ps_has_glyph_names): Assure that return + value is either 0 or 1. + +2003-12-12 Werner Lemberg + + * src/cff/cffdrivr.c (cff_get_glyph_name): Improve error message. + (cff_get_name_index): Return if no PSNames service is available. + (cff_ps_has_glyph_names): Handle CID-keyed fonts correctly. + * src/cff/cfftypes.h (CFF_CharsetRec): New field `cids', used for + CID-keyed fonts. This is the inverse mapping of `sids'. + * src/cff/cffload.c (cff_charset_load): New argument `invert'. + Initialize charset->cids if `invert' is set. + (cff_font_load): In call to cff_charset_load, set `invert' to true + for CID-keyed fonts. + * src/cff/cffgload.c (cff_slot_load): Handle glyph index as CID + and map it to the real glyph index. + + * docs/CHANGES: Updated. + +2003-12-11 Werner Lemberg + + * src/cff/cffobjs.c (cff_face_init): Don't set + FT_FACE_FLAG_GLYPH_NAMES for CID-keyed fonts. + Don't construct a cmap for CID-keyed fonts. + +2003-12-10 Werner Lemberg + + Use implementation specific SID value 0xFFFF to indicate that + a dictionary element is missing. + + * src/cff/cffload.c (cff_subfont_load): Initialize all fields + which hold SIDs to 0xFFFF. + (cff_index_get_sid_string): Handle SID value 0xFFFF. + Handle case where `psnames' is zero. + (cff_font_load): Updated. + Don't load encoding for CID-keyed CFFs. + + * src/cff/cffobjs.c (cff_face_init): Updated. + Don't check for PSNames module if font is CID-keyed. + Compute style name properly (using the same algorithm as in the + CID driver). + Fix computation of style flags. + + * src/cff/cfftoken.h: Comment out handling of base_font_name. + Rename `postscript' field to `embedded_postscript' + * src/cff/cfftypes.h (CFF_FontRecDictRec): Remove `base_font_name' + and `postscript'. + +2003-12-10 Detlef W黵kner + + * src/pcf/pcfdrivr.c (pcf_get_charset_id): New function (a clone + of the similar BDF function). + (pcf_service_bdf): Use it. + +2003-12-09 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_load_face): Set FT_FACE_FLAG_GLYPH_NAMES + only if a `post' table is present. + +2003-12-09 George Williams + + * src/base/ftobjs.c (load_mac_face): Recent versions of Linux + support Mac's HFS+ file system, thus enable code to read /rsrc on + non-Macintosh platforms also. + +2003-12-08 Werner Lemberg + + * include/freetype/internal/psaux.h (PS_TableRec): Change type + of `lengths' to FT_PtrDist. + (T1_DecoderRec): Change type of `subrs_len' to FT_PtrDist. + * include/freetype/internal/t1types.h (T1_FontRec): Change type + of `subrs_len' and `charstrings_len' to FT_PtrDist. + + * src/base/ftobjs.c (Mac_Read_POST_Resource): Replace `junk' + variable with better solution. + (IsMacResource): Remove unused variable `map_len'. + Replace `junk' variable with better solution. + (FT_Open_Face) [!FT_MACINTOSH]: Add conditional + FT_CONFIG_OPTION_MAC_FONTS. + +2003-12-08 Wolfgang Domr鰏e + + * src/autohint/ahhint.c (ah_hinter_hint_edges, + ah_hinter_align_strong_points): Add some casts. + + * src/base/ftoutln.c (FT_OrientationExtremumRec): Change type + of `pos' to FT_Long. + + * src/base/ftobjs.c (Mac_Read_POST_Resource, + Mac_Read_sfnt_Resource): Change type of `len' to FT_Long. + + * src/type42/t42parse.c (t42_parse_dict): Add cast for `n_keywords'. + +2003-12-07 Werner Lemberg + + * docs/raster.txt: New file, taken from FreeType 1 and completely + revised. + +2003-12-04 Masatake YAMATO + + * src/type1/t1driver.c (Get_Interface): Remove FT_UNUSED for + t1_interface. t1_interface is used. + +2003-11-27 David Turner + + * src/pfr/pfrdrivr.c (pfr_get_metrics): Revert incorrect change of + 2003-11-23: For PFR fonts, metrics->x_scale and metrics->y_scale are + the scaling values for outline units, not for metric units. + +2003-11-25 Werner Lemberg + + * src/base/ftcalc.c, include/freetype/internal/ftcalc.h + (FT_MulDiv_No_Round): Surround code with `#ifdef + TT_CONFIG_OPTION_BYTECODE_INTERPRETER ... #endif'. + +2003-11-23 Werner Lemberg + + * src/base/ftcalc.c (FT_MulDiv_No_Round): New function (32 and + 64 bit version). + * include/freetype/internal/ftcalc.h: Updated. + + * src/truetype/ttinterp.c (TT_MULDIV_NO_ROUND): New macro. + (TT_INT64): Removed. + (DO_DIV): Use TT_MULDIV_NO_ROUND. + + * src/pfr/pfrdrivr.c (pfr_get_metrics): Directly use + metrics->x_scale and metrics->y_scale. + +2003-11-22 Rogier van Dalen + + * src/truetype/ttinterp.c (CUR_Func_move_orig): New macro. + (Direct_Move_Orig, Direct_Move_Orig_X, Direct_Move_Orig_Y): New + functions. Similar to Direct_Move, Direct_Move_X, and + Direct_Move_Y but without touching. + (Compute_Funcs): Use new functions. + + (Round_None, Round_To_Grid, Round_To_Half_Grid, Round_Down_To_Grid, + Round_Up_To_Grid, Round_To_Double_Grid, Round_Super, + Round_Super_45): Fix rounding of value zero. + + (DO_DIV): Don't use TT_MULDIV. + + (Ins_SHC): This instruction actually touches the points. + (Ins_MSIRP): Fix undocumented behaviour. + + * src/truetype/ttinterp.h (TT_ExecContextRec): Updated. + +2003-11-22 Werner Lemberg + + * docs/VERSION.DLL, docs/CHANGES: Updated. + + * src/base/ftobjs.c (FT_Set_Char_Size): Make metrics->x_scale and + metrics->y_scale really precise. + + (FT_Load_Glyph): Update computation of linearHoriAdvance and + linearVertAdvance. + + * src/true/type/ttinterp.c (Update_Max): Use FT_REALLOC. + +2003-11-22 David Turner + + * src/autofit/*: More updates. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 8. + * builds/unix/configure.ac (version_info): Set to 9:6:3. + * README: Updated. + +2003-11-13 John A. Boyd Jr. + + * src/bdf/bdfdrivr.c (bdf_interpret_style), src/pcf/pcfread.c + (pcf_interpret_style): Replace spaces with dashes in properties + SETWIDTH_NAME and ADD_STYLE_NAME to simplify parsing. + +2003-11-11 Werner Lemberg + + * docs/CHANGES: Updated. + +2003-11-11 John A. Boyd Jr. + + Handle SETWIDTH_NAME and ADD_STYLE_NAME properties for BDF and PCF + fonts. + + * src/bdf/bdfdrivr.c (bdf_interpret_style): New auxiliary function. + (BDF_Face_Init): Don't handle style properties but call + bdf_interpret_style. + + * src/pcf/pcfread.c (pcf_interpret_style): New auxiliary function. + (pcf_load_font): Don't handle style properties but call + pcf_interpret_style. + +2003-11-07 Werner Lemberg + + + * Version 2.1.7 released. + ========================= + + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 7. + + * builds/unix/ft2unix.h: Fix comments. + + * builds/unix/ftconfig.in: Synchronized with ANSI version. + Use `#undef' in templates as recommended in the autoconf + documentation. + Since real `#undef' lines don't survive during configuration, use + `/undef' instead; the postprocessing facility of the + AC_CONFIG_HEADERS autoconf macro converts them to `#undef'. + + * builds/unix/install.mk (install): Install Unix version of + `ftconfig.h'. + + * builds/unix/unix-cc.in (CFLAGS): Set FT_CONFIG_CONFIG_H macro + to include the correct `ftconfig.h' file. + + * builds/unix/ft-munmap.m4 (FT_MUNMAP_DECL): Removed. + (FT_MUNMAP_PARAM): Updated syntax to autoconf 2.59. + + * builds/unix/freetype2.m4: Updated syntax to autoconf 2.59. + + * builds/unix/configure.ac: Use AC_CONFIG_HEADERS instead of + AC_CONFIG_HEADER to create ftconfig.h, and use second argument + to replace `/undef' with `#undef'. + Don't use FT_MUNMAP_DECL but AC_CHECK_DECLS to check for munmap. + Use AS_HELP_STRING in AC_ARG_WITH. + Update syntax to autoconf 2.59. + + * builds/unix/ltmain.sh: Regenerated with `libtoolize --force + --copy' from libtool 1.5. + * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from + automake 1.7.8. + * builds/unix/configure: Regenerated with autoconf 2.59. + * builds/unix/config.guess, builds/unix/config.sub: Updated from + `config' CVS module at subversions.gnu.org + * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from + `texinfo' CVS module at subversions.gnu.org. + + * builds/vms/ftconfig.h: Synchronized with ANSI version. + + * docs/CUSTOMIZE: Fix documentation error. + * docs/CHANGES, docs/VERSION.DLL, docs/release: Updated. + + * builds/freetype.mk (refdoc): Updated --title. + +2003-11-07 David Turner + + + * Version 2.1.6 released. + ========================= + + + * install: Removed. Obsolete. + +2003-11-04 Werner Lemberg + + * src/sfnt/sfdriver.c: Include FT_SERVICE_SFNT_H. + (sfnt_service_sfnt_table): New service. + (sfnt_services): Updated. + + * docs/license.txt: Reworded. + +2003-11-03 Werner Lemberg + + * include/freetype/*: Add a guard to all public header files which + load FT_FREETYPE_H to reject freetype.h from FreeType 1. + +2003-11-02 Patrick Welche + + * builds/unix/freetype2.m4, builds/unix/ft-munmap.m4: Protect + first argument of AC_DEFUN with brackets to avoid possible + expansion. + +2003-11-02 Werner Lemberg + + * include/freetype/cache/ftcglyph.h: Don't include stddef.h. + + * include/freetype/freetype.h: Fix check for ft2build.h. + +2003-11-01 Werner Lemberg + + * include/freetype/freetype.h: Check that ft2build.h has been + loaded first. + + * src/base/fttype1.c (FT_Get_PS_Font_Info): Fix incorrectly applied + patch. + +2003-10-31 Detlef W黵kner + + * src/base/fttype1.c (FT_Get_PS_Font_Info, FT_Has_PS_Glyph_Names): + Fix parameter order in calls to FT_FACE_FIND_SERVICE. + +2003-10-31 Werner Lemberg + + * include/freetype/internal/ftserv.h + (FT_SERVICE_POSTSCRIPT_NAMES_H): Removed. Unused. + + * src/type42/t42drivr.c (t42_services): Updated. + +2003-10-29 David Turner + + * include/freetype/internal/bdftypes.h: Removed. Obsolete. + * src/base/ftbdf.c: Updated. + + * include/freetype/internal/cfftypes.h: Moved to... + * src/cff/cfftypes.h: This place since no other module needs to + know about those types. + + * include/freetype/internal/t42types.h: Moved to... + * src/type42/t42types.h: This place since no other module needs to + know about those types. + + * include/freetype/internal/services/svbdf.h: Include FT_BDF_H. + + * include/freetype/internal/services/svpsname.h: Renamed to... + * include/freetype/internal/services/svpscmap.h: This. + Updated `FT_Service_PsNames' -> `FT_Service_PsCMaps' and + `POSTSCRIPT_NAMES' -> `POSTSCRIPT_CMAPS' everywhere. + + * include/freetype/internal/services/svpsinfo.h: New file, providing + PostScript info service. + + * include/freetype/internal/ftserv.h (FT_SERVICE_POSTSCRIPT_CMAPS_H, + FT_SERVICE_POSTSCRIPT_INFO_H): New macros for svpscmap.h and + svpsinfo.h. + * include/freetype/internal/internal.h (FT_INTERNAL_TYPE42_TYPES_H, + FT_INTERNAL_CFF_TYPES_H, FT_INTERNAL_BDF_TYPES_H): Removed. + + * src/base/fttype1.c: Don't include FT_INTERNAL_TYPE1_TYPES_H and + FT_INTERNAL_TYPE42_TYPES_H but FT_INTERNAL_SERVICE_H and + FT_SERVICE_POSTSCRIPT_INFO_H. + (FT_Get_PS_Font_Info, FT_Has_PS_Glyph_Names): Use new + POSTSCRIPT_INFO service. + + * src/cff/cffdrivr.c: Include FT_SERVICE_POSTSCRIPT_INFO_H. + (cff_ps_has_glyph_names): New function. + (cff_service_ps_info): New service. + (cff_services): Updated. + + * src/cff/cffload.h, src/cff/cffobjs.h, src/cff/cffparse.h: Don't + include FT_INTERNAL_CFF_TYPES_H but cfftypes.h directly. + + * src/cif/cidriver.c: Include FT_SERVICE_POSTSCRIPT_INFO_H. + (cid_ps_get_font_info): New function. + (cid_service_ps_info): New service. + (cid_services): Updated. + + * src/type1/t1driver.c: Include FT_SERVICE_POSTSCRIPT_INFO_H. + (t1_ps_get_font_info, t1_ps_has_glyph_names): New functions. + (t1_service_ps_info): New service. + (t1_services): Updated. + + * src/type42/t42drivr.c: Include FT_SERVICE_POSTSCRIPT_INFO_H. + (t42_ps_get_font_info, t42_ps_has_glyph_names): New functions. + (t42_service_ps_info): New service. + + * src/type42/t42objs.h: Don't include FT_INTERNAL_TYPE42_TYPES_H + but t42types.h directly. + + * src/psnames/psmodule.c (psnames_interface, psnames_services): + Renamed to... + (pscmaps_interface, pscmaps_services): This. + Updated all users. + + + * src/gzip/infblock.c (inflate_blocks): Remove compiler warning. + +2003-10-22 Werner Lemberg + + * src/type1/t1load.c (parse_encoding): Handle `/Encoding [ ... ]'. + + * src/type1/t1parse.c (T1_Get_Private_Dict): Test whether `eexec' + is real. + + * src/type42/t42parse.c (t42_parse_encoding): Improve boundary + checking while parsing. + + * docs/CHANGES: Updated. + +2003-10-21 Josselin Mouette + + * include/freetype/internal/t1types.h (T1_FontRec): `paint_type' + and `stroke_width' aren't pointers. + + * src/type42/t42objs.c (T42_Face_Done), src/type1/t1objs.c + (T1_Face_Done): Don't free `paint_type' and `stroke_width'. + +2003-10-20 Graham Asher + + * src/winfonts/winfnt.c (fnt_cmap_class): Fix position of `const'. + +2003-10-19 Werner Lemberg + + * src/autohint/ahhint.c (ah_hinter_load_glyph): Patch from + 2003-08-18 introduced a severe bug (FT_Render_Glyph was called + twice under some circumstances, causing strange results). This + is fixed now by clearing the FT_LOAD_RENDER bit of `load_flags'. + + * src/base/ftpfr.c (FT_Get_PFR_Metrics): Initialize `error'. + * src/psaux/psobjs.c (ps_tobytes): Initialize `n'. + * src/type42/t42parse.c (t42_parse_sfnts): Initialize `string_size'. + +2003-10-16 Werner Lemberg + + Completely revised Type 42 parser. It now handles both fonts + produced with ttftot42 (tested version 0.3.1) and + TrueTypeToType42.ps (tested version May 2001; it is necessary to + fix the broken header comment to be `%!PS-TrueTypeFont...'). + + * src/type42/t42objs.c (T42_GlyphSlot_Load): Change fourth + parameter to `FT_UInt'. + * src/type42/t42objs.h: Updated. + + * src/type42/t42parse.h (T42_ParserRec): Change type of `in_memory' + to FT_Bool. + (T42_Loader): Change type of `num_chars' and `num_glyphs' to + FT_UInt. + Add `swap_table' element. + * src/type42/t42parse.c (T42_KEYWORD_COUNT, T1_ToFixed, + T1_ToCoordArray, T1_ToTokenArray): Removed. + (T1_ToBytes): New macro. + (t42_is_alpha, t42_hexval): Removed. + (t42_is_space): Handle `\0'. + (t42_parse_encoding): Updated to use new PostScript parser routines + from psaux. + Handle `/Encoding [ ... ]' also. + (T42_Load_Status): New enumeration. + (t42_parse_sfnts): Updated to use new PostScript parser routines + from psaux. + (t42_parse_charstrings): Updated to use new PostScript parser + routines from psaux. + Handle `/CharStrings << ... >>' also. + Don't expect that /.notdef is the first element in dictionary. Copy + code from type1 module to handle this. + (t42_parse_dict): Updated to use new PostScript parser routines + from psaux. + Remove code for synthetic fonts (which can't occur in Type 42 + fonts). + (t42_loader_done): Release `swap_table'. + + * src/psaux/psobjs.c (skip_string): Increase `cur' properly. + + * src/type1/t1load.c (parse_charstrings): Make test for `.notdef' + faster. + +2003-10-15 Graham Asher + + * src/autohint/ahglobal.c (blue_chars), src/winfonts/winfnt.c + (fnt_cmap_class_rec, fnt_cmap_class), src/bdf/bdflib.c (empty, + _num_bdf_properties), src/gzip/infutil.c (inflate_mask), + src/gzip/inffixed.h (fixed_bl, fixed_bd, fixed_tl, fixed_td), + src/gzip/inftrees.h (inflate_trees_fixed), srf/gzip/inftrees.c + (inflate_trees_fixed): Decorate with more `const' to avoid + writable global variables which are disallowed on ARM. + +2003-10-08 Werner Lemberg + + * src/type1/t1load.c (parse_font_matrix, parse_charstrings): Remove + code specially for synthetic fonts; this is handled elsewhere. + (parse_encoding): Remove code specially for synthetic fonts; this is + handled elsewhere. + Improve boundary checking while parsing. + (parse_dict): Improve boundary checking while parsing. + Use ft_memcmp to simplify code. + +2003-10-07 Werner Lemberg + + * src/type1/t1load.c (parse_subrs, parse_dict): Handle synthetic + fonts properly. + (parse_charstrings): Copy correct number of characters into + `name_table'. + +2003-10-06 Werner Lemberg + + Heavy modification of the PS parser to handle comments and strings + correctly. This doesn't slow down the loading of PS fonts + significantly since charstrings aren't affected. + + * include/freetype/config/ftstdlib.h (ft_xdigit): Renamed to... + (ft_isxdigit): This. Updated all callers. + (ft_isdigit): New alias to `isdigit'. + + * include/freetype/internal/psaux.h (PS_Parser_FuncsRec): Renamed + `skip_alpha' to `skip_PS_token'. + Add parameter to `to_bytes' and change some argument types. + + * src/psaux/psauxmod.c (ps_parser_funcs): Updated. + * src/psaux/psobjs.c (ft_char_table): New array to map character + codes (ASCII and EBCDIC) of digits to numbers. + (OP): New auxiliary macro holding either `>=' or `<' depending on + the character encoding. + (skip_comment): New function. + (skip_spaces): Use it. + (skip_alpha): Removed. + (skip_literal_string, skip_string): New functions. + (ps_parser_skip_PS_token): New function. This is a better + replacement of... + (ps_parser_skip_alpha): Removed. + (ps_parser_to_token, ps_parser_to_token_array): Updated. + (T1Radix): Rewritten, using `ft_char_table'. + (t1_toint): Renamed to... + (ps_toint): This. Update all callers. + Use `ft_char_table'. + (ps_tobytes): Add parameter to handle delimiters and change some + argument types. + Use `ft_char_table'. + (t1_tofixed): Renamed to... + (ps_tofixed): This. Update all callers. + Use `ft_char_table'. + (t1_tocoordarray): Renamed and updated to... + (ps_tocoordarray): This. Update all callers. + (t1_tofixedarray): Renamed and updated to... + (ps_tofixedarray): This. Update all callers. + (t1_tobool): Renamed to... + (ps_tobool): This. Update all callers. + (ps_parser_load_field): Updated. + (ps_parser_load_field_table): Use `T1_MAX_TABLE_ELEMENTS' + everywhere. + (ps_parser_to_int, ps_parser_to_fixed, ps_parser_to_coord_array, + ps_parser_to_fixed_array): Skip spaces. Updated. + (ps_parser_to_bytes): Add parameter to handle delimiters and change + some argument types. Updated. + * src/psaux/psobjs.h: Updated. + + * src/cid/cidload.c (cid_parse_dict): Updated. + * src/cid/cidparse.c (cid_parser_new): Check whether the `StartData' + token was really found. + * src/cid/cidparse.h (cid_parser_skip_alpha): Updated and renamed + to... + (cid_parser_skip_PS_token): This. + + * src/type1/t1parse.h (T1_ParserRec): Use `FT_Bool' for boolean + fields. + (T1_Skip_Alpha): Replaced with... + (T1_Skip_PS_Token): This new macro. + * src/type1/t1parse.c (hexa_value): Removed. + (T1_Get_Private_Dict): Use `ft_isxdigit' and + `psaux->ps_parser_funcs_to_bytes' for handling ASCII hexadecimal + encoding. + After decrypting, replace the four random bytes at the beginning + with whitespace. + * src/type1/t1load.c (t1_allocate_blend): Use proper error values. + (parser_blend_design_positions, parse_blend_design_map, + parse_weight_vector): Updated. + (is_space): Handle `\f' also. + (is_name_char): Removed. + (read_binary_data): Updated. + (parse_encoding): Use `ft_isdigit'. + Updated. + (parse_subrs): Updated. + (TABLE_EXTEND): New macro. + (parse_charstrings): Updated. + Provide a workaround for buggy fonts which have more entries in the + /CharStrings dictionary then expected; the function now adds some + slots and skips entries which still exceed the new limit. + (parse_dict): Updated. + Terminate on the token `closefile'. + + * src/type42/t42parse.c (T1_Skip_Alpha): Replaced with... + (T1_Skip_PS_Token): This new macro. Updated all callers. + (t42_parse_encoding): Use `ft_isdigit'. + + + * src/base/ftmm.c (ft_face_get_mm_service): Return FT_Err_OK if + success. + +2003-10-05 Werner Lemberg + + * include/freetype/ftmodule.h: Renamed to... + * include/freetype/ftmodapi.h: This to avoid duplicate file names. + * include/freetype/config/ftheader.h (FT_MODULE_H): Updated. + +2003-10-04 Werner Lemberg + + * src/base/ftoutln.c (FT_OrientationExtremumRec, + FT_Outline_Get_Orientation): Trivial typo fixes to make it compile. + +2003-10-02 Markus F.X.J. Oberhumer + + * src/winfonts/winfnt.c (FT_WinFNT_HeaderRec): `color_table_offset' + has four bytes, not two. + Fix all users. + (fnt_font_load, FNT_Load_Glyph): Add more font validity tests. + +2003-10-01 David Turner + + * src/autofit/*: Adding first source files of the new multi-script + `auto-fitter'. + + * include/freetype/ftoutln.h (FT_Orientation): New enumeration. + (FT_Outline_Get_Orientation): New declaration. + + * src/base/ftoutln.c (FT_OrientationExtremumRec): New structure. + (ft_orientation_extremum_compute): New auxiliary function. + (FT_Outline_Get_Orientation): New function to compute the fill + orientation of a given glyph outline. + + * include/freetype/internal/ftserv.h (FT_FACE_LOOKUP_SERVICE): Fixed + trivial bug which could crash the font engine when a cached service + pointer was retrieved. + +2003-09-30 Werner Lemberg + + * src/cid/cidload.c (cid_parse_dict): Skip token if no keyword is + found. + + * src/type1/t1parse.c (IS_T1_WHITESPACE, IS_T1_LINESPACE, + IS_T1_SPACE): Removed. + (PFB_Tag): Removed. + (read_pfb_tag): Don't use PFB_Tag. + + * src/type42/t42parse.c (t42_is_space): Handle `\f' also. + (t42_parse_encoding): Handle synthetic fonts. + +2003-09-29 Werner Lemberg + + * include/freetype/internal/t1types.h: Don't include + FT_INTERNAL_OBJECTS_H but FT_INTERNAL_SERVICE_H. + * src/truetype/ttobjs.c: Don't include + FT_SERVICE_POSTSCRIPT_NAMES_H. + +2003-09-29 David Turner + + Added new service to handle glyph name dictionaries, replacing the + old internal header named `psnames.h' by `services/svpsname.h'. + Note that this is different from `services/svpostnm.h' which only + handles the retrieval of PostScript font names for a given face. + (Should we merge these two services into a single header?) + + * include/freetype/internal/psnames.h: Removed. Most of its + contents is moved to... + * include/freetype/internal/services/svpsname.h: New file. + + * include/freetype/internal/services/svpostnm.h + (FT_SERVICE_ID_POSTSCRIPT_NAME): Replaced with... + (FT_SERVICE_ID_POSTSCRIPT_FONT_NAME): New macro. + (PsName): Service named changed to... + (PsFontName): This. + Updated `FT_Service_PsName' -> `FT_Service_PsFontName' and + `POSTSCRIPT_NAME' -> `POSTSCRIPT_FONT_NAME' everywhere. + + * include/freetype/internal/internal.h + (FT_INTERNAL_POSTSCRIPT_NAMES_H): Removed. + * include/freetype/internal/psaux.h: Include + FT_SERVICE_POSTSCRIPT_NAMES_H. + (T1_DecoderRec): Updated type of `psnames'. + * include/freetype/internal/t1types.h: Don't include + FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. + Include FT_INTERNAL_OBJECTS_H. + * include/freetype/internal/t42types.h: Don't include + FT_INTERNAL_POSTSCRIPT_NAMES_H. + * include/freetype/internal/tttypes.h (TT_FaceRec): Updated. + + * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE): Changed + order of parameters. All callers updated. + (FT_FACE_FIND_GLOBAL_SERVICE): New macro to look up a service + globally, checking all modules. + (FT_ServiceCacheRec): Updated. + (FT_SERVICE_POSTSCRIPT_NAMES_H): New macro for accessing + `svpsname.h'. + + * include/freetype/internal/ftobjs.h, src/base/ftobjs.c + (ft_module_get_service): New function. + + * src/cff/cffdrivr.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H + but FT_SERVICE_POSTSCRIPT_NAMES_H. + (cff_get_glyph_name, cff_get_name_index): Use new POSTSCRIPT_NAMES + service. + * src/cff/cffcmap.c (cff_cmap_unicode_init): Updated. + * src/cff/cffload.c, src/cff/cffload.h: Don't include + FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. + (cff_index_get_sid_string): Updated. + * src/cff/cffobjs.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H + but FT_SERVICE_POSTSCRIPT_NAMES_H. + (cff_face_init): Use new POSTSCRIPT_NAMES service. + * src/cff/cffobjs.h: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H + but FT_SERVICE_POSTSCRIPT_NAMES_H. + + * src/cid/cidobjs.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H + but FT_SERVICE_POSTSCRIPT_NAMES_H. + (cid_face_init): Use new POSTSCRIPT_NAMES service. + * src/cid/cidriver.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H. + + * src/psaux/t1cmap.c (t1_cmap_std_init, t1_cmap_unicode_init): Use + new POSTSCRIPT_NAMES service. + * src/psaux/t1decode.h (t1_lookup_glyph_by_stdcharcode, + t1_decode_init): Use new POSTSCRIPT_NAMES service. + * src/psaux/t1cmap.h, src/psaux/t1decode.h: Dont' include + FT_INTERNAL_POSTSCRIPT_NAMES_H. + + * src/psnames/psmodule.c: Don't include + FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. + (ps_build_unicode_table): Renamed to... + (ps_unicodes_init): This. + (ps_lookup_unicode): Renamed to... + (ps_unicodes_char_index): This. + (ps_next_unicode): Renamed to... + (ps_unicodes_char_next): This. + (psnames_interface): Updated. + (psnames_services): New services list. + (psnames_get_service): New function. + (psnames_module_class): Updated. + + * src/sfnt/sfobjs.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H + but FT_SERVICE_POSTSCRIPT_NAMES_H. + (sfnt_init_face): Use new POSTSCRIPT_NAMES service. + * src/sfnt/ttpost.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H + but FT_SERVICE_POSTSCRIPT_NAMES_H. + (tt_face_get_ps_name): Updated. + + * src/truetype/ttobjs.c: Don't include + FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. + + * src/type1/t1driver.c: Don't include + FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. + * src/type1/t1objs.c: Don't include + FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. + (T1_Face_Init): Use new POSTSCRIPT_NAMES service. + + * src/type42/t42drivr.c (t42_get_ps_name): Renamed to... + (t42_get_ps_font_name): This. + (t42_service_ps_name): Renamed to... + (t42_service_ps_font_name): This. + (t42_services): Updated. + * src/type42/t42objs.c (T42_Face_Init): Use new POSTSCRIPT_NAMES + service. + * src/type42/t42objs.h: Don't include + FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. + + + * src/base/ftglyph.c (FT_Get_Glyph): Don't access `slot' before + testing its validity. Reported by Henry Maddocks + . + +2003-09-21 Werner Lemberg + + * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE): + Fix compilation warning (s/pptr/Pptr/). + + * include/freetype/internal/internal.h (FT_INTERNAL_PFR_H, + FT_INTERNAL_FNT_TYPES_H): Removed. + +2003-09-21 David Turner + + Migrating the PFR and WINFNT drivers to the new service-based + internal API. + + * include/freetype/internal/fnttypes.h: Removed. Most of its data + are moved to winfnt.h and... + * include/freetype/internal/services/svwinfnt.h: New file. + + * include/freetype/internal/pfr.h: Removed. Most of its data are + moved to... + * include/freetype/internal/services/svpfr.h: New file. + + * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE, + FT_FACE_LOOKUP_SERVICE): Simplify fix of 2003-09-16 by removing + pointer type argument. + Updated all callers. + Update macro names of services header files. + + * src/base/ftobjs.c (FT_Get_Name_Index): Simplified code. + + * src/base/ftpfr.c: Include FT_SERVICE_PFR_H instead of + FT_INTERNAL_PFR_H. + (ft_pfr_check, FT_Get_PFR_Metrics, FT_Get_PFR_Kerning, + FT_Get_PFR_Advance): Use services provided in `PFR_METRICS'. + + * src/base/ftwinfnt.c: Include FT_SERVICE_WINFNT_H instead of + FT_INTERNAL_FNT_TYPES_H. + (FT_Get_WinFNT_Header): Use service provided in `WINFNT'. + + * src/pfr/pfrdrivr.c: Include FT_SERVICE_PFR_H and + FT_SERVICE_XFREE86_NAME_H instead of FT_INTERNAL_PFR_H. + (pfr_service_bdf): Updated. + (pfr_services): New services list. + (pfr_get_service): New function. + (pfr_driver_class): Updated. + + * src/winfonts/winfnt.c: Include FT_SERVICE_WINFNT_H and + FT_SERVICE_XFREE86_NAME_H instead of FT_INTERNAL_FNT_TYPES_H. + (winfnt_get_header, winfnt_get_service): New functions. + (winfnt_service_rec): New structure providing WINFNT services. + (winfnt_services): New services list. + (winfnt_driver_class): Updated. + * src/winfonts/winfnt.h: Add most of the removed fnttypes.h data. + + * src/sfnt/sfdriver.c (sfnt_service_ps_name): Fix typo. + + * src/type1/t1driver.c (t1_service_ps_name): Fix typo. + + * src/cff/cffobjs.c, src/cid/cidobjs.c, src/pfr/pfrsbit.c, + src/psaux/psobjs.c, src/sfnt/sfobjs.c, src/truetype/ttobjs.c, + src/type1/t1objs.c, src/type42/t42objs.c: Removing various compiler + warnings. + +2003-09-19 David Bevan + + * src/type1/t1parse.c (pfb_tag_fields): Removed. + (read_pfb_tag): Fix code so that it doesn't fail on end-of-file + indicator (0x8003). + * docs/CHANGES: Updated. + +2003-09-16 Werner Lemberg + + * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE, + FT_FACE_LOOKUP_SERVICE): Add parameter to pass pointer type. + Ugly, I know, but this is needed for compilation with C++ -- + maybe someone knows a better solution? + Updated all callers. + + * src/base/ftobjs.c (FT_Get_Name_Index, FT_Get_Glyph_Name): Remove + C++ compiler warnings. + + * src/base/ftbdf.c (FT_Get_BDF_Charset_ID, FT_Get_BDF_Property): + Fix order of arguments passed to FT_FACE_FIND_SERVICE. + +2003-09-15 Werner Lemberg + + Avoid header files with identical names. + + * include/freetype/internal/services/bdf.h: Renamed to... + * include/freetype/internal/services/svbdf.h: This. + Add copyright notice. + * include/freetype/internal/services/glyfdict.h: Renamed to... + * include/freetype/internal/services/svgldict.h: This. + Add copyright notice. + * include/freetype/internal/services/multmast.h: Renamed to... + * include/freetype/internal/services/svmm.h: This. + Add copyright notice. + Add FT_BEGIN_HEADER and FT_END_HEADER. + * include/freetype/internal/services/sfnt.h: Renamed to... + * include/freetype/internal/services/svsfnt.h: This. + Add copyright notice. + * include/freetype/internal/services/postname.h: Renamed to... + * include/freetype/internal/services/svpostnm.h: This. + Add copyright notice. + * include/freetype/internal/services/xf86name.h: Renamed to... + * include/freetype/internal/services/svxf86nm.h: This. + Add copyright notice. + + * include/freetype/internal/ftserv.h: Add FT_BEGIN_HEADER and + FT_END_HEADER. + Add copyright notice. + Update macro names of services header files. + + * builds/freetype.mk (SERVICES_DIR): New variable. + (BASE_H): Add services header files. + +2003-09-11 Werner Lemberg + + * builds/toplevel.mk (distclean): Remove `builds/unix/freetype2.pc'. + + * src/cff/cffdrivr.c: Don't load headers twice. + + * include/freetype/internal/ftserv.h (FT_SERVICE_SFNT_H): New macro. + * src/base/ftobjs.c: Include FT_SERVICE_SFNT_H. + + * src/cff/cffcmap.c: Include `cfferrs.h'. + * src/pfr/pfrdrivr.c: Include `pfrerror.h'. + * src/sfnt/sfdriver.c: Include `sferrors.h'. + * src/psaux/psobjs.h: Add declaration for `ps_parser_to_bytes'. + +2003-09-11 David Turner + + Introducing the concept of `module services'. This is the first + step towards a massive simplification of the engine's internals, in + order to get rid of various numbers of hacks. + + Note that these changes will break source & binary compatibility for + authors of external font drivers. + + * include/freetype/config/ftconfig.h (FT_BEGIN_STMNT, FT_END_STMNT, + FT_DUMMY_STMNT): New macros. + + * include/freetype/internal/ftserv.h: New file, containing the new + structures and macros to provide `services'. + + * include/freetype/internal/internal.h (FT_INTERNAL_EXTENSION_H, + FT_INTERNAL_EXTEND_H, FT_INTERNAL_HASH_H, FT_INTERNAL_OBJECT_H): + Removed, obsolete. + (FT_INTERNAL_SERVICE_H): New macro for `ftserv.h'. + + * include/freetype/internal/services/bdf.h, + include/freetype/internal/services/glyfdict.h, + include/freetype/internal/services/postname.h, + include/freetype/internal/services/xf86name.h: New files. + + * include/freetype/ftmm.h (FT_Get_MM_Func, FT_Set_MM_Design_Func, + FT_Set_MM_Blend_Func): Function pointers moved (in modified form) + to... + * include/freetype/internal/services/multmast.h: New file. + + * include/freetype/internal/sfnt.h (SFNT_Interface): `get_interface' + is now of type `FT_Module_Requester'. + (SFNT_Get_Interface_Func, SFNT_Load_Table_Func): Function pointers + moved (in modified form) to... + * include/freetype/internal/servies/sfnt.h: New file. + + * include/freetype/tttables.h (FT_Get_Sfnt_Table_Func): Function + pointer moved (in modified form) to `services/sfnt.h'. + + * include/freetype/ftmodule.h (FT_Module_Interface): Make it a + a typedef to `FT_Pointer'. + + * include/freetype/internal/tttypes.h (TT_FaceRec): Add + `postscript_name'. + * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Remove + `postscript_name'. + Add `services' element. + (FT_LibraryRec): Remove `meta_class'. + + * src/base/ftbdf.c: Include FT_SERVICE_BDF_H. + (test_font_type): Removed. + (FT_Get_BDF_Charset_ID, FT_Get_BDF_Property): Use services + provided in `FT_SERVICE_ID_BDF'. + + * src/base/ftmm.c: Include FT_SERVICE_MULTIPLE_MASTERS_H. + (ft_face_get_mm_service): New auxiliary function to get services + from `FT_SERVICE_ID_MULTI_MASTERS'. + (FT_Get_Multi_Master, FT_Set_MM_Design_Coordinates, + FT_Set_MM_Blend_Coordinates): Use `ft_face_get_mm_service'. + + * src/base/ftobjs.c: Include FT_SERVICE_POSTSCRIPT_NAME_H and + FT_SERVICE_GLYPH_DICT_H. + (ft_service_list_lookup): New function to get a specific service. + (destroy_face): Updated. + (Mac_Read_POST_Resource): Simplify some code. + (IsMacResource): Fix warnings. + (FT_Get_Name_Index, FT_Get_Glyph_Name): Use services provided in + `FT_SERVICE_ID_GLYPH_DICT'. + (FT_Get_Postscript_Name): Use service provided in + `FT_SERVICE_ID_POSTSCRIPT_NAME'. + (FT_Get_Sfnt_Table, FT_Load_Sfnt_Table): Use services provided in + `FT_SERVICE_ID_SFNT_TABLE'. + + * src/base/ftxf86.c: Include FT_SERVICE_XFREE86_NAME_H. + (FT_Get_X11_Font_Format): Use service provided in + `FT_SERVICE_ID_XF86_NAME'. + + * src/bdf/bdfdrivr.c: Include FT_SERVICE_BDF_H and + FT_SERVICE_XFREE86_NAME_H. + (bdf_get_charset_id): New function. + (bdf_service_bdf): New structure providing BDF services. + (bdf_services): New services list. + (bdf_driver_requester): Use `ft_service_list_lookup'. + + * src/cff/cffdrivr.c: Include FT_SERVICE_XFREE86_NAME_H and + FT_SERVICE_GLYPH_DICT_H. + (cff_service_glyph_dict): New structure providing CFF services. + (cff_services): New services list. + (cff_get_interface): Use `ft_service_list_lookup'. + + * src/cid/cidriver.c: Include FT_SERVICE_POSTSCRIPT_NAME_H and + FT_SERVICE_XFREE86_NAME_H. + (cid_service_ps_name): New structure providing CID services. + (cid_services): New services list. + (cid_get_interface): Use `ft_service_list_lookup'. + + * src/pcf/pcfdrivr.c: Include FT_SERVICE_BDF_H and + FT_SERVICE_XFREE86_NAME_H. + (pcf_service_bdf): New structure providing PCF services. + (pcf_services): New services list. + (pcf_driver_requester): Use `ft_service_list_lookup'. + + * src/sfnt/sfdriver.c: Include FT_SERVICE_GLYPH_DICT_H and + FT_SERVICE_POSTSCRIPT_NAME_H. + (get_sfnt_glyph_name): Renamed to... + (sfnt_get_glyph_name): This. + (get_sfnt_postscript_name): Renamed to... + (sfnt_get_ps_name): This. + Updated. + (sfnt_service_glyph_dict, sfnt_service_ps_name): New structures + providing services. + (sfnt_services): New services list. + (sfnt_get_interface): Use `ft_service_list_lookup'. + + * src/truetype/ttdriver.c: Include FT_SERVICE_XFREE86_NAME_H. + (tt_services): New services list. + (tt_get_interface): Use `ft_service_list_lookup'. + + * src/type1/t1driver.c: Include FT_SERVICE_MULTIPLE_MASTERS_H, + FT_SERVICE_GLYPH_DICT_H, FT_SERVICE_XFREE86_NAME_H, and + FT_SERVICE_POSTSCRIPT_NAME_H. + (t1_service_glyph_dict, t1_service_ps_name, + t1_service_multi_masters): New structures providing Type 1 services. + (t1_services): New services list. + (Get_Interface): Use `ft_service_list_lookup'. + + * src/type42/t42drivr.c: Include FT_SERVICE_XFREE86_NAME_H, + FT_SERVICE_GLYPH_DICT_H, and FT_SERVICE_POSTSCRIPT_NAME_H. + (t42_service_glyph_dict, t42_service_ps_name): New strucures + providing Type 42 services. + (t42_services): New services list. + (T42_Get_Interface): Use `ft_service_list_lookup'. + + + * README, docs/CHANGES: Updating version numbers for 2.1.6, and + removing obsolete warnings in the documentation. + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 6. + * builds/unix/configure.ac (version_info): Set to 9:5:3. + * builds/unix/configure: Regenerated. + + * include/freetype/internal/ftcore.h, + include/freetype/internal/ftexcept.h, + include/freetype/internal/fthash.h, + include/freetype/internal/ftobject.h: Removed. Obsolete. + +2003-09-09 David Turner + + Fixing PFR kerning support. The tables within the font file contain + (charcode,charcode) kerning pairs, we need to convert them to + (gindex,gindex). + + * src/base/ftpfr.c (ft_pfr_check): Fix serious typo. + * src/pfr/prfload.c: Remove dead code. + (pfr_get_gindex, pfr_compare_kern_pairs, pfr_sort_kerning_pairs): + New functions. + (pfr_phy_font_done): Free `kern_pairs'. + (pfr_phy_font_load): Call `pfr_sort_kerning_pairs'. + * src/pfr/pfrobjs.c (pfr_face_get_kerning): Fix kerning extraction. + * src/pfr/pfrtypes.h (PFR_KERN_PAIR_INDEX): New macro. + (PFR_KernPairRec): Make `kerning' an FT_Int. + (PFR_PhyFontRec): New element `kern_pairs'. + (PFR_KernFlags): Values of PFR_KERN_2BYTE_CHAR and + PFR_KERN_2BYTE_ADJ were erroneously reversed. + + * include/freetype/ftoption.h: Commenting out the macro + TT_CONFIG_OPTION_BYTECODE_INTERPRETER. + 2003-09-02 David Turner - * include/freetype/config/ftoption.h: commenting out the - macro TT_CONFIG_OPTION_BYTECODE_INTERPRETER so that package - managers that define it with additionnal compilation command line - options (e.g. with -DTT_CONFIG_OPTION_BYTECODE_INTERPRETER) still - work correctly. - Also added a note to indicate that TT_CONFIG_OPTION_UNPATENTED_HINTING - doesn't work as advertised yet. + * Version 2.1.5 released. + ========================= + 2003-08-31 Manish Singh @@ -1076,8 +3182,8 @@ (not defined, but in comments) for the unpatented hinting system. * include/freetype/internal/tttypes.h (TT_FaceRec) - [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: New element "FT_Bool - unpatented_hinting". + [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: New element `FT_Bool + unpatented_hinting'. * src/truetype/ttinterp.c (NO_APPLE_PATENT, APPLE_THRESHOLD): Removed. @@ -1143,8 +3249,8 @@ * src/pcf/pcfread.c (pcf_load_font): Fixed the computation of face->num_glyphs. We must increase the value by 1 to respect the - convention that glyph index 0 always corresponds to the "missing - glyph". + convention that glyph index 0 always corresponds to the `missing + glyph'. 2003-04-24 Werner Lemberg @@ -1240,7 +3346,7 @@ 2003-04-09 Torrey Lyons * src/base/ftmac.c (open_face_from_buffer): Removed a double-free - bug that had nasty consequences when trying to open an "invalid" + bug that had nasty consequences when trying to open an `invalid' font on a Mac. 2003-04-09 Mike Fabian @@ -1252,14 +3358,14 @@ 2003-04-08 David Turner - * Version 2.1.4 is released. - ============================ + * Version 2.1.4 released. + ========================= 2003-04-03 Martin Muskens * src/type1/t1load.c (T1_Open_Face): Fixed the code to make it - handle special cases where a font only contains a ".notdef" glyph + handle special cases where a font only contains a `.notdef' glyph (happens in PDF-embedded fonts). Otherwise, FT_Panic was called. 2003-03-27 David Turner @@ -1368,8 +3474,8 @@ 2003-03-13 David Turner Added new environment variables to control memory debugging with - FreeType. See the description of "FT2_DEBUG_MEMORY", - "FT2_ALLOC_TOTAL_MAX" and "FT2_ALLOC_COUNT_MAX" in DEBUG.TXT. + FreeType. See the description of `FT2_DEBUG_MEMORY', + `FT2_ALLOC_TOTAL_MAX' and `FT2_ALLOC_COUNT_MAX' in DEBUG.TXT. * src/base/ftdbgmem.c (FT_MemTableRec): Add `alloc_count', `bound_total', `alloc_total_max', `bound_count', `alloc_count_max'. @@ -1414,7 +3520,7 @@ (ftc_cmap_family_init): The cmap cache now supports UCS-4 charmaps when available in Asian fonts. - * src/sfnt/ttload.c, src/base/ftobjs.c: Changed "asian" to "Asian" + * src/sfnt/ttload.c, src/base/ftobjs.c: Changed `asian' to `Asian' in comments. 2003-02-25 David Turner @@ -1435,7 +3541,7 @@ - The table loaded now scans for *undocumented* elements of a physical font's auxiliary data record. This is necessary to - retrieve the "real" family and style names. + retrieve the `real' family and style names. NOTE THAT THESE CHANGES THE FAMILY NAME OF MANY PFR FONTS! @@ -1481,7 +3587,7 @@ `exec->metrics'. * src/autohint/ahhint.c (ah_hinter_load): Disabled the advance width - "correction" which seemed to provide more trouble than benefits. + `correction' which seemed to provide more trouble than benefits. 2003-02-13 Graham Asher @@ -1522,7 +3628,7 @@ * src/pfr/pfrsbit.c: Removed compiler warnings. * src/cache/ftccmap.c (ftc_cmap_family_init): Changed an FT_ERROR - into an FT_TRACE1 since it caused "ftview" and others to dump too + into an FT_TRACE1 since it caused `ftview' and others to dump too much junk when trying to display a waterfall with a font without a Unicode charmap (e.g. SYMBOL.TTF). @@ -1586,9 +3692,9 @@ (pcf_find_property): Decorate it with FT_LOCAL_DEF. * src/pcf/pcfread.h: New file, providing `pcf_find_property'. - * src/sfnt/ttload.c (sfnt_dir_check): Relaxed the "head" table size + * src/sfnt/ttload.c (sfnt_dir_check): Relaxed the `head' table size verification to accept a few broken fonts who pad the size - incorrectly (the table should be padded, but its "size" field + incorrectly (the table should be padded, but its `size' field shouldn't according to the specification). 2003-01-18 Werner Lemberg @@ -1654,9 +3760,9 @@ Patches to the auto-hinter in order to slightly improve the output. Note that everything is controlled through the new - FT_CONFIG_OPTION_CHESTER_HINTS defined in "ftoption.h". There are + FT_CONFIG_OPTION_CHESTER_HINTS defined in `ftoption.h'. There are also individual FT_CONFIG_CHESTER_XXX macros to control individual - "features". + `features'. Note that all improvements are enabled by default, but can be tweaked for optimization and testing purposes. The configuration @@ -1698,11 +3804,11 @@ 2003-01-08 Huw Dawies * src/winfonts/winfnt.c (winfnt_header_fields): Read 16 bytes into - "reserved2", not "reserved". + `reserved2', not `reserved'. * src/base/ftobjs.c (find_unicode_charmap): Fixed the error code returned when the font doesn't contain a Unicode charmap. This - allows FT2 to load "symbol.ttf" and a few others correctly since the + allows FT2 to load `symbol.ttf' and a few others correctly since the last release. (open_face): Fix return value. @@ -1755,7 +3861,7 @@ assertion, and changing code to avoid hash table size contraction. * src/base/Jamfile, src/base/rules.mk, src/base/descrip.mms: Adding - "ftstroker" to default build, as optional component. + `ftstroker' to default build, as optional component. 2002-12-26 David Turner @@ -1845,8 +3951,8 @@ 2002-11-18 David Turner - * Version 2.1.3 is released. - ============================ + * Version 2.1.3 released. + ========================= 2002-11-07 David Turner @@ -1886,7 +3992,7 @@ configuration (typically by adding -D flags at compile time). * src/sfnt/ttcmap0.c (tt_face_build_cmaps): Removed compiler - warnings in optimized mode relative to the "volatile" local + warnings in optimized mode relative to the `volatile' local variables. This was not a compiler bug after all, but the fact that a pointer to a volatile variable is not the same as a volatile pointer to a variable :-) @@ -1912,9 +4018,9 @@ 2002-11-01 David Turner - Added PFR-specific public API. Fixed the kerning retrievel routine - (it returned invalid values when the outline and metrics resolution - differ). + Added PFR-specific public API. Fixed the kerning retrievel routine + (it returned invalid values when the outline and metrics resolution + differ). * include/freetype/ftpfr.h, include/freetype/internal/pfr.h: New files. @@ -2018,8 +4124,8 @@ src/tools/docmaker/tohtml.py: Fixing a few nasty bugs. * src/sfnt/ttcmap0.c (tt_cmap4_validate): The validator for format 4 - sub-tables is now capable of dealing with invalid "length" fields at - the start of the sub-table. This allows fonts like "mg______.ttf" + sub-tables is now capable of dealing with invalid `length' fields at + the start of the sub-table. This allows fonts like `mg______.ttf' (i.e. Marriage) to return accurate charmaps. * docs/CHANGES: Updated. @@ -2283,7 +4389,7 @@ Removed conditional code. This fixes a bug that prevented compilation in debug mode of template instantiation. - * include/freetype/ftimage.h: Removed incorrect "zft_" definitions + * include/freetype/ftimage.h: Removed incorrect `zft_' definitions and updated constants documentation comments. * src/cff/cffparse.c (cff_parser_run): Fixed the CFF table loader. @@ -2291,7 +4397,7 @@ certain fonts. * include/freetype/freetype.h (FT_FaceRec): Updating documentation - comment. The "descender" value is always *negative*, not positive. + comment. The `descender' value is always *negative*, not positive. 2002-09-09 Owen Taylor @@ -2595,7 +4701,7 @@ The automatic and Postscript hinter now automatically detect inflection points in glyph outlines and treats them specially. This is very useful to prevent nasty effect like the disappearing - diagonals of "S" and "s" in many, many fonts. + diagonals of `S' and `s' in many, many fonts. * src/autohint/ahtypes.h (ah_flag_inflection): New macro. * src/autohint/ahangles.c (ah_angle_diff): New function. @@ -2609,8 +4715,8 @@ * src/tools/docmaker/docmaker.py, src/tools/docmaker/utils.py, src/tools/docmaker/tohtml.py: Updating the DocMaker tool. - * include/freetype/freetype.h: Changing the type of the "load_flags" - parameter from "FT_Int" to "FT_Int32", this in order to support more + * include/freetype/freetype.h: Changing the type of the `load_flags' + parameter from `FT_Int' to `FT_Int32', this in order to support more options. This should only break binary and/or source compatibility on 16-bit platforms (Atari?). (FT_LOAD_NO_AUTOHINT): New macro. @@ -2779,7 +4885,7 @@ 2002-07-30 David Turner * include/freetype/ftincrem.h: Adding new experimental header file - to demonstrate a "cleaner" API to support incremental font loading. + to demonstrate a `cleaner' API to support incremental font loading. * include/freetype/config/ftheader.h (FT_INCREMENTAL_H): New macro. @@ -2815,10 +4921,10 @@ 2002-07-24 Graham Asher * src/truetype/ttobjs.c: Fix for bug reported by Sven Neumann - [sven@gimp.org] on the FreeType development forum: "If + [sven@gimp.org] on the FreeType development forum: `If FT_CONFIG_OPTION_INCREMENTAL is undefined (this is the default), the TrueType loader crashes in line 852 of src/truetype/ttgload.c when - it tries to access face->glyph_locations." + it tries to access face->glyph_locations.' 2002-07-18 Graham Asher @@ -2921,8 +5027,8 @@ 2002-07-11 David Turner Changing the SFNT loader to check for SFNT-based font files - differently. We now ignore the range "helper" fields and check the - "head" table's magic number instead. + differently. We now ignore the range `helper' fields and check the + `head' table's magic number instead. * include/freetype/internal/tttypes.h (SFNT_HeaderRec): Add `offset' field. @@ -3224,7 +5330,7 @@ (FT_Get_PS_Font_Info): Make it work with CID and Type 42 drivers also. -2002-06-19 Sebastien BARRE +2002-06-19 Sebastien BARRE * src/type42/t42parse.c (t42_parse_sfnts): Fix compiler warning. @@ -3439,7 +5545,7 @@ 2002-06-07 David Turner Fixed the bug that prevented the correct display of fonts with - "ftview". + `ftview'. * src/type42/t42drivr.c: Split into... * src/type42/t42drivr.h, src/type42/t42parse.c, @@ -3545,8 +5651,8 @@ * include/freetype/t1tables.h: Updated. * src/base/Jamfile, src/base/rules.mk, src/base/descrip.mms: - Updating build control files for the new files "ftxf86.c" and - "fttype1.c" in src/base. + Updating build control files for the new files `ftxf86.c' and + `fttype1.c' in src/base. * src/pshinter/pshglob.c (psh_blues_scale_zones): Fixed a bug that prevented family blue zones substitution from hapenning correctly. @@ -3568,7 +5674,7 @@ Fixing the SFNT name table loader to support various buggy fonts. It now ignores empty name entries, entries with invalid pointer Offsets and certain fonts containing tables with broken - "storageOffset" fields. + `storageOffset' fields. Name strings are now loaded on demand, which reduces the memory requirements for a given FT_Face tremendously (for example, the name @@ -3622,7 +5728,7 @@ 2002-05-21 David Turner * src/bdf/bdflib.c: Removed compiler warning, and changed all tables - to the "static const" storage specifier (instead of simply + to the `static const' storage specifier (instead of simply `static'). * src/type42/t42drivr.c (hexval): Use more efficient code. @@ -3633,7 +5739,7 @@ src/base/descrip.mms, src/base/Jamfile, src/base/rules.mk (FT_Get_BDF_Charset_ID): New API to retrieve BDF-specific strings from a face. This is much cleaner than accessing the internal types - "BDF_Public_Face" defined in FT_INTERNAL_BDF_TYPES_H. + `BDF_Public_Face' defined in FT_INTERNAL_BDF_TYPES_H. 2002-05-21 Werner Lemberg @@ -3787,11 +5893,11 @@ 2002-05-01 David Turner * src/sfnt/sfobjs.c (tt_face_get_name): Fixing a bug that caused - FreeType to crash when certain broken fonts (e.g. "hya6gb.ttf") + FreeType to crash when certain broken fonts (e.g. `hya6gb.ttf') were opened. * src/sfnt/ttload.c (TT_Load_Names): Applied a small work-around to - manage fonts containing a broken name table (e.g. "hya6gb.ttf"). + manage fonts containing a broken name table (e.g. `hya6gb.ttf'). * src/sfnt/ttcmap0.c (tt_cmap4_validate): Fixed over-restrictive validation test. The charmap validator now accepts overlapping @@ -3958,8 +6064,8 @@ * src/base/ftobjs.c, builds/win32/ftdebug.c, builds/amiga/src/base/ftdebug.c: Version 2.1.0 couldn't be linked against applications in Win32 and Amiga builds due to changes to - "src/base/ftdebug.c" that were not properly propagated to - "builds/win32" and "builds/amiga". This has been fixed. + `src/base/ftdebug.c' that were not properly propagated to + `builds/win32' and `builds/amiga'. This has been fixed. * include/freetype/internal/ftobject.h, include/freetype/internal/ftexcept.h, include/freetype/ftsysmem.h, @@ -4046,7 +6152,7 @@ builds/amiga/src/base/ftdebug.c: - Added the new configuration file "ftstdlib.h" used to define + Added the new configuration file `ftstdlib.h' used to define aliases for all ISO C library functions used by the engine (e.g. strlen, qsort, setjmp, etc.). @@ -4287,7 +6393,7 @@ * src/psaux/t1cmap.h, src/psaux/t1cmap.c, src/type1/t1cmap.h, src/type1/t1cmap.c: Updating and moving the Type 1 FT_CMap support - from "src/type1" to "src/psaux" since it is going to be shared by + from `src/type1' to `src/psaux' since it is going to be shared by the Type 1 and CID font drivers. * src/psaux/Jamfile, src/psaux/psaux.c, src/psaux/psauxmod.c, @@ -4497,11 +6603,11 @@ * src/cid/cidriver.c (cid_get_postscript_name): Fixed a bug that caused the CID driver to return Postscript font names with a leading - slash ("/") as in "/MOEKai-Regular". + slash (`/') as in `/MOEKai-Regular'. * src/sfnt/ttload.c (TT_Load_Names), src/sfnt/sfobjs.c (Get_Name), src/sfnt/sfdriver.c (get_sfnt_postscript_name): Fixed the loader so - that it accepts broken fonts like "foxjump.ttf", which made FreeType + that it accepts broken fonts like `foxjump.ttf', which made FreeType crash when trying to load them. Also improved the name table parser to be able to load @@ -4561,7 +6667,7 @@ * src/sfnt/ttload.c (TT_Load_Names): Simplifying and securing the names table loader. Invalid individual name entries are now handled correctly. This allows the loading of very buggy fonts like - "foxjump.ttf" without allocating tons of memory and causing crashes. + `foxjump.ttf' without allocating tons of memory and causing crashes. * src/otlayout/otlcommon.h, src/otlayout/otlcommon.c: Adding (still experimental) code for OpenType Layout tables validation and @@ -4608,14 +6714,14 @@ ft_io_stream => ft_ansi_stream_io (in base/ftsystem.c only) * src/base/ftutil.c: New file. Contains all memory and list - management code (previously in "ftobjs.c" and "ftlist.c", + management code (previously in `ftobjs.c' and `ftlist.c', respectively). * include/freetype/internal/ftobjs.h: Moving all code related to glyph loaders to ... - * include/freetype/"internal/ftgloadr.h: This new file. - "FT_GlyphLoader" is now a pointer to the structure - "FT_GlyphLoaderRec". + * include/freetype/internal/ftgloadr.h: This new file. + `FT_GlyphLoader' is now a pointer to the structure + `FT_GlyphLoaderRec'. (ft_glyph_own_bitmap): Renamed to ... (FT_GLYPH_OWN_BITMAP): This. * src/base/ftobjs.c: Moving all code related to glyph loaders @@ -4630,8 +6736,8 @@ 2002-02-21 David Turner Modified the debug sub-system initialization. Trace levels can now - be specified within the "FT2_DEBUG" environment variable. See the - comments within "ftdebug.c" for more details. + be specified within the `FT2_DEBUG' environment variable. See the + comments within `ftdebug.c' for more details. * src/base/ftdebug.c: (FT_SetTraceLevel): Removed. (ft_debug_init): New function. @@ -4656,8 +6762,8 @@ Removed. Both files are now completely obsolete. * src/base/Jamfile, src/base/rules.mk: Updated. - * include/freetype/fterrors.h: Adding "#undef FT_ERR_CAT" and - `#undef FT_ERR_XCAT" to avoid warnings with certain compilers (like + * include/freetype/fterrors.h: Adding `#undef FT_ERR_CAT' and + `#undef FT_ERR_XCAT' to avoid warnings with certain compilers (like LCC). * src/pshinter/pshalgo2.c (print_zone): Renamed to ... @@ -4669,7 +6775,7 @@ 2002-02-20 David Turner - * README: Adding "devel@freetype.org" address for bug reports. + * README: Adding `devel@freetype.org' address for bug reports. 2002-02-20 Werner Lemberg @@ -4797,7 +6903,7 @@ * src/pcf/pcfdriver.c (FT_Done_Face): Fixed small memory leak. - * src/pcf/pcfread.c (pcf_load_font): Now handles the "AVERAGE_WIDTH" + * src/pcf/pcfread.c (pcf_load_font): Now handles the `AVERAGE_WIDTH' property to return correct character pixel (width/height) pairs for embedded bitmaps. @@ -4863,7 +6969,7 @@ 2002-01-30 David Turner * INSTALL: Moved to ... - * docs/INSTALL: Here to avoid conflicts with the "install" script on + * docs/INSTALL: Here to avoid conflicts with the `install' script on Windows, where the filesystem doesn't preserve case. 2002-01-29 David Turner @@ -4873,7 +6979,7 @@ ./configure --disable-shared --disable-nls - the "--disable-nls" was incorrectly sent to the "make" program. + the `--disable-nls' was incorrectly sent to the `make' program. 2002-01-29 Werner Lemberg @@ -4920,7 +7026,7 @@ 2002-01-21 Antoine Leca - * docs/PATENTS: Typo fixed (thanks to Detlef "Hawkeye" W黵kner) in + * docs/PATENTS: Typo fixed (thanks to Detlef `Hawkeye' W黵kner) in the URL for the online resource. 2002-01-18 Ian Brown @@ -4980,7 +7086,7 @@ (html_format): Replaced with ... (html_quote): New function. (html_quote0): New function. - (DocCode::dump_html: Small improvement. + (DocCode::dump_html): Small improvement. (DocParagraph::dump, DocBlock::html): Use html_quote0 and html_quote. * include/freetype/config/ftoption.h: Setting default options for @@ -4995,7 +7101,7 @@ * src/autohint/ahhint.c (ah_align_linked_edge): Modified computation of auto-hinted stem widths; this avoids color fringes in - "ClearType-like" rendering. + `ClearType-like' rendering. * src/truetype/ttgload.c (TT_Load_Glyph_Header, TT_Load_Simple_Glyph, TT_Load_Composite_Glyph, load_truetype_glyph): @@ -5022,22 +7128,22 @@ 2002-01-03 Keith Packard * builds/unix/ftsystem.c (FT_New_Stream): Added a fix to ensure that - all FreeType input streams are closed in child processes of a "fork" + all FreeType input streams are closed in child processes of a `fork' on Unix systems. This is important to avoid (potential) access control issues. 2002-01-03 David Turner * src/type1/t1objs.c (T1_Face_Init): Fixed a bug that crashed the - library when dealing with certain weird fonts like "Stalingrad", in - "sadn.pfb" (this font has no full font name entry). + library when dealing with certain weird fonts like `Stalingrad', in + `sadn.pfb' (this font has no full font name entry). * src/base/ftoutln.c, include/freetype/ftoutln.h (FT_Outline_Check): New function to check the consistency of outline data. * src/base/ftobjs.c (FT_Load_Glyph): Use `FT_Outline_Check' to ensure that loaded glyphs are valid. This allows certain fonts like - "tt1095m_.ttf" to be loaded even though it appears they contain + `tt1095m_.ttf' to be loaded even though it appears they contain really funky glyphs. There still is a bug there, though. @@ -5088,8 +7194,8 @@ 2001-12-21 David Turner * src/pshinter/pshrec.c (ps_hints_t2mask, ps_hints_t2counter): - Ignore invalid "hintmask" and "cntrmask" operators (instead of - returning an error). Glyph 2028 of the CFF font "MSung-Light-Acro" + Ignore invalid `hintmask' and `cntrmask' operators (instead of + returning an error). Glyph 2028 of the CFF font `MSung-Light-Acro' couldn't be rendered otherwise (it seems its charstring is buggy, though this requires more analysis). (FT_COMPONENT): Define. @@ -5185,12 +7291,12 @@ routines were never released when CID faces were destroyed. * src/cff/cffload.h, src/cff/cffload.c, src/cff/cffgload.c: Updated - to move the definition of encoding tables back within "cffload.c" + to move the definition of encoding tables back within `cffload.c' instead of making them part of a shared header (causing problems in - "multi" builds). This reverts change 2001-08-08. + `multi' builds). This reverts change 2001-08-08. * docs/CHANGES: Updated for 2.0.6 release. - * docs/TODO: Added "stem3 and counter hints support" to the TODO + * docs/TODO: Added `stem3 and counter hints support' to the TODO list for the Postscript hinter. * docs/BUGS: Closed the AUTOHINT-NO-SBITS bug. @@ -5204,12 +7310,12 @@ that prevented composites from loading correctly, due to missing parentheses around macro parameters. - * src/sfnt/sfobjs.c (SFNT_Load_Face): Make the "post" and "name" + * src/sfnt/sfobjs.c (SFNT_Load_Face): Make the `post' and `name' tables optional to load PCL fonts properly. * src/truetype/ttgload.c (TT_Load_Glyph), src/base/ftobjs.c (FT_Load_Glyph), include/freetype/freetype.h (FT_LOAD_SBITS_ONLY): - "Fixed" the bug that prevented embedded bitmaps to be loaded when + `Fixed' the bug that prevented embedded bitmaps to be loaded when the auto-hinter is used. This actually is a hack but will be enough until the internal re-design scheduled for FreeType 2.1. @@ -5298,9 +7404,9 @@ 2001-12-11 David Turner * builds/unix/freetype-config.in: Modified the script to prevent - passing "-L/usr/lib" to gcc. + passing `-L/usr/lib' to gcc. - * docs/FTL.TXT: Simple fix (change "LICENSE.TXT" to "FTL.TXT"). + * docs/FTL.TXT: Simple fix (change `LICENSE.TXT' to `FTL.TXT'). * builds/unix/freetype2.m4: New file for checking configure paths. We need to install it in $(prefix)/share/aclocal/freetype2.m4 but I @@ -5321,7 +7427,7 @@ 2001-12-10 Francesco Zappa Nardelli * src/pcf/pcfdriver.c (PCF_Init_Face): Allow Xft to use PCF fonts - by setting the "face->metrics.max_advance" correctly. + by setting the `face->metrics.max_advance' correctly. 2001-12-07 David Turner @@ -5420,8 +7526,8 @@ * include/freetype/ttnameid.h: Added some new Microsoft language codes and LCIDs as found in MSDN (Passport SDK). Also added comments about the meaning of bit 57 of the `OS/2' table - (TT_UCR_SURROGATES) which (with OpenType v.1.3) now means "there is - a character beyond 0xFFFF in this font". Thanks to Detlef W黵kner + (TT_UCR_SURROGATES) which (with OpenType v.1.3) now means `there is + a character beyond 0xFFFF in this font'. Thanks to Detlef W黵kner for noticing this. 2001-11-20 David Turner @@ -5468,7 +7574,7 @@ Fix typos. * tests/gview.c: Updated the debugging glyph viewer to show the - hints generated by the "autohint" module. + hints generated by the `autohint' module. 2001-10-27 David Turner @@ -5479,7 +7585,7 @@ * include/freetype/ftcache.h, include/freetype/cache/*.h, src/cache/*.c: Major re-design of the cache sub-system to provide - better performance as well as an "Acquire"/"Release" API. Seems to + better performance as well as an `Acquire'/`Release' API. Seems to work well here, but probably needs a bit more testing. 2001-10-26 Leonard Rosenthol @@ -5547,7 +7653,7 @@ the source file. * src/base/ftdbgmem.c: New debugging memory manager. You must - define the FT_DEBUG_MEMORY macro in "ftoption.h" to enable it. It + define the FT_DEBUG_MEMORY macro in `ftoption.h' to enable it. It will record every memory block allocated and report simple errors like memory leaks and double deletes. @@ -5601,7 +7707,7 @@ compiler warnings. * src/pshinter/module.mk, src/pshinter/rules.mk: Adding control - files to build the PostScript hinter with the "old" build system. + files to build the PostScript hinter with the `old' build system. 2001-10-19 Jacob Jansen @@ -5611,7 +7717,7 @@ 2001-10-18 David Turner * src/psnames/pstables.h, src/tools/glnames.py: Rewrote the - "glnames.py" script used to generate the "pstables.h" header file. + `glnames.py' script used to generate the `pstables.h' header file. The old one contained a serious bug that made FreeType return incorrect glyph names for certain glyphs. @@ -5653,7 +7759,7 @@ * tests/Jamfile, tests/gview.c: Adding a new glyph hinting viewer/debugger to the source tree. Note that you will _not_ be able to compile it since it depends on an unavailable graphics - library named "Nirvana" to render vector images. + library named `Nirvana' to render vector images. 2001-10-17 David Turner @@ -5775,7 +7881,7 @@ in PDF documents that were automatically generated from TrueType ones). - * src/type1/t1load.c (is_alpha): Now supports "+" in font names; + * src/type1/t1load.c (is_alpha): Now supports `+' in font names; this is used in embedded fonts. * src/psaux/psobjs.c (PS_Table_Add): Fixed a reallocation bug that @@ -5857,7 +7963,7 @@ (cff_get_glyph_index): Minor documentation change. * src/type1/t1driver.c (t1_get_name_index): New function used in - Get_Interface as the function returned when the "name_index" + Get_Interface as the function returned when the `name_index' function is requested. (get_t1_glyph_name): Renamed to t1_get_glyph_name for consistency. @@ -5874,10 +7980,10 @@ * src/cff/cffdrivr.c (cff_get_name_index): New function, returned when `cff_get_interface' is called with a request for the - "name_index" function. + `name_index' function. (cff_get_interface): Modified so that it returns the function - `cff_get_name_index' when the "name_index" function is requested. + `cff_get_name_index' when the `name_index' function is requested. * src/base/ftobjs.c (FT_Get_Name_Index): New function, used to return a glyph index for a given glyph name only if the driver @@ -6023,7 +8129,7 @@ Removing _lots_ of compiler warnings when the most pedantic warning levels of Visual C++ and Borland C++ are used. Too many files to be listed here, but FT2 now compiles without warnings with VC++ and the - "/W4" warning level (lint-style). + `/W4' warning level (lint-style). * include/freetype/freetype.h (FT_New_Memory_Face): Updated documentation. @@ -6097,9 +8203,9 @@ 2001-06-14 David Turner Modified the TrueType interpreter to let it use the new - trigonometric functions provided in "fttrigon.h". This gets rid of + trigonometric functions provided in `fttrigon.h'. This gets rid of some old 64-bit computation routines, as well as many warnings when - compiling the library with the "long long" 64-bit integer type. + compiling the library with the `long long' 64-bit integer type. * include/freetype/config/ftoption.h: Undefine FT_CONFIG_OPTION_OLD_CALCS. @@ -6221,7 +8327,7 @@ 2001-05-25 David Turner - Moved several documents from the top-level to the "docs" directory. + Moved several documents from the top-level to the `docs' directory. * src/base/ftcalc.c (FT_DivFix): Small fix to return value. @@ -6275,9 +8381,9 @@ * builds/newline: New file. * builds/top_level.mk, builds/detect.mk: Use it. This fixes - problems with Make on Windows 2000, as well as problems when "make - distclean" is invoked on a non-Unix platform when there is no - "config.mk" in the current directory. + problems with Make on Windows 2000, as well as problems when `make + distclean' is invoked on a non-Unix platform when there is no + `config.mk' in the current directory. * builds/freetype.mk: Fixed a problem with object deletions under Dos/Windows/OS/2 systems. @@ -6329,7 +8435,7 @@ * src/base/ftcalc.c (FT_MulDiv, FT_MulFix, FT_DivFix): Various tiny fixes related to rounding in 64-bits routines and - pseudo-"optimizations". + pseudo-`optimizations'. 2001-04-27 David Turner @@ -6356,7 +8462,7 @@ fixed-point square root computation. It is now used even with 64-bits integers, as it is _much_ faster than calling FT_Sqrt64 :-) - * src/base/ftbbox.c: Removed invalid "#include FT_BEZIER_H" line. + * src/base/ftbbox.c: Removed invalid `#include FT_BEZIER_H' line. 2001-04-25 David Turner @@ -6374,7 +8480,7 @@ 2001-04-20 David Turner - * ftconfig.h, ftoption.h: Updated "ftconfig.h" to detect 64-bit int + * ftconfig.h, ftoption.h: Updated `ftconfig.h' to detect 64-bit int types on platforms where Autoconf is not available). Also removed FTCALC_USE_LONG_LONG and replaced it with FT_CONFIG_OPTION_FORCE_INT64. @@ -6491,7 +8597,7 @@ 2001-03-20 David Turner * include/freetype/config/ftheader.h, include/freetype/ftsnames.h: - Renamed "ftnames.h" to "ftsnames.h", and FT_NAMES_H to + Renamed `ftnames.h' to `ftsnames.h', and FT_NAMES_H to FT_SFNT_NAMES_H. * docs/docmaker.py: Added generation of INDEX link in table of @@ -6501,8 +8607,8 @@ compilation process has changed slightly (no more `src' required in the include path). - * builds/*/*-def.mk: Changed the objects directory from "obj" to - "objs". + * builds/*/*-def.mk: Changed the objects directory from `obj' to + `objs'. * include/freetype/config/ftheader.h: Removed obsolete macros like FT_SOURCE_FILE, etc. and added cache-specific macro definitions that @@ -6511,7 +8617,7 @@ * src/*/*: Removed the use of FT_SOURCE_FILE, etc. Now, each component needs to add its own directory to the include path at - compile time. Modified all "rules.mk" and "descrip.mms" + compile time. Modified all `rules.mk' and `descrip.mms' accordingly. 2001-03-20 Werner Lemberg @@ -6537,7 +8643,7 @@ compiler warnings in pedantic modes. * include/config/ft2build.h, include/config/ftheader.h: The file - "ft2build.h" was renamed to "ftheader.h" to avoid conflicts with the + `ft2build.h' was renamed to `ftheader.h' to avoid conflicts with the top-level . * include/config/ftheader.h: Added new section describing the #include @@ -6559,7 +8665,7 @@ via FT_Get_Glyph_Name(). (cff_get_interface): Added support for getting a glyph name via the - "glyph_name" module interface. Uses the new function + `glyph_name' module interface. Uses the new function get_cff_glyph_name(). Submitted by Sander van der Wal . @@ -6570,7 +8676,7 @@ Submitted by Sander van der Wal . * src/cff/cffgload.c (CFF_Parse_CharStrings): Added support for - deprecated operator "dotsection". + deprecated operator `dotsection'. Submitted by Sander van der Wal . 2001-03-12 Werner Lemberg @@ -6727,7 +8833,7 @@ * src/cff/cffparse.c (cff_parse_font_matrix): Added logic to get the units_per_EM from the FontMatrix. - (cff_parse_fixed_thousand): New function. Gets a real number from + (cff_parse_fixed_thousand): New function. Gets a real number from the CFF font, but multiplies by 1000 (this is to avoid rounding errors when placing this real number into a 16.16 fixed number). @@ -6756,7 +8862,7 @@ 2001-02-01 David Turner * docs/docmaker.py: Improved the index sorting routine to place - capital letters before small ones. Added the "" marker to + capital letters before small ones. Added the `' marker to section blocks in order to give the order of blocks. 2001-01-30 Antoine Leca @@ -6963,7 +9069,7 @@ * src/smooth/ftgrays.c (grays_convert_glyph): Implement it. * INSTALL: Updated installation instructions on Win32, listing the - new "make setup list" target used to list supported + new `make setup list' target used to list supported compilers/targets. * src/raster/ftraster.c (ft_black_render): Test for unsupported @@ -6981,7 +9087,7 @@ * builds/win32/detect.mk: Added support for the Intel C/C++ compiler, as well as _preliminary_ (read: doesn't work!) support for - Watcom. Also added a new setup target. Type "make setup list" for + Watcom. Also added a new setup target. Type `make setup list' for a list of supported command-line compilers on Win32. * src/base/ftdebug.c: Added dummy symbol to avoid empty file if @@ -7082,16 +9188,16 @@ pointer). * src/base/ftsystem.c (FT_Done_Memory): Fixed an obvious bug: - The ANSI "free()" function was called instead of "memory->free()". + The ANSI `free()' function was called instead of `memory->free()'. * docs/docmaker.py: Added section filtering, multi-page generation (index page generation is still missing though). 2000-12-04 David Turner - * builds/unix/install.mk, builds/unix/ft2unix.h: The file "ft2unix.h" + * builds/unix/install.mk, builds/unix/ft2unix.h: The file `ft2unix.h' is now installed as for Unix systems. Note that we - still use the "freetype2/freetype" installation path for now. + still use the `freetype2/freetype' installation path for now. * */*.[ch]: Now using as the default build and setup configuration file in all public headers. Internal source files @@ -7103,7 +9209,7 @@ * builds/win32/detect.mk, builds/win32/w32-bccd.mk, builds/win32/w32-dev.mk: Changed the developer build targets to - "devel-gcc" and "devel-bcc" in order to be able to develop with the + `devel-gcc' and `devel-bcc' in order to be able to develop with the Borland C++ compiler. 2000-12-01 David Turner @@ -7115,7 +9221,7 @@ * builds/unix/configure.in, builds/unix/configure, builds/cygwin/configure.in, builds/cygwin/configure: Setting - "version_info" to 6:1:0 for the 2.0.1 release. + `version_info' to 6:1:0 for the 2.0.1 release. * CHANGES: Added a summary of changes between 2.0.1 and 2.0. @@ -7142,13 +9248,13 @@ 2000-11-30 David Turner * INSTALL: Slightly updated the quick starter documentation to - include IDE compilation, prevent against BSD Make, and specify "make - setup" instead of a single "make" for build configuration. + include IDE compilation, prevent against BSD Make, and specify `make + setup' instead of a single `make' for build configuration. * include/config/ftbuild.h, include/internal/internal.h: Added new configuration files used to determine the location of all public, configuration, and internal header files for FreeType 2. Modified - all headers under "include/freetype" to reflect this change. Note + all headers under `include/freetype' to reflect this change. Note that we still need to change the library source files themselves though. @@ -7156,7 +9262,7 @@ builds/win32/w32-bcc.mk, builds/win32/w32-bccd.mk, builds/win32/detect.mk: Added new files to support compilation with the free Borland C++ command-line compiler. Modified the detection - rules to recognize the new "bcc32" target in "make setup bcc32". + rules to recognize the new `bcc32' target in `make setup bcc32'. * src/sfnt/ttcmap.c, src/sfnt/ttpost.c, src/sfnt/ttsbit.c, src/truetype/ttobjs.c, src/truetype/ttgload.c, diff --git a/reactos/lib/freetype/Jamfile b/reactos/lib/freetype/Jamfile index 6d944669fc3..c4e98a9098a 100644 --- a/reactos/lib/freetype/Jamfile +++ b/reactos/lib/freetype/Jamfile @@ -1,4 +1,4 @@ -# FreeType 2 top Jamfile (c) 2001, 2002, 2003 David Turner +# FreeType 2 top Jamfile (c) 2001, 2002, 2003, 2004 David Turner # # The HDRMACRO is already defined in FTJam and is used to add @@ -61,13 +61,15 @@ FT2_BUILD_INCLUDE ?= ; # IMPORTANT: You'll need to change the content of "ftmodule.h" as well # if you modify this list or provide your own. # -FT2_COMPONENTS ?= gzip # support for gzip-compressed files +FT2_COMPONENTS ?= autofit # auto-fitter autohint # auto-hinter base # base component (public APIs) bdf # BDF font driver cache # cache sub-system cff # CFF/CEF font driver cid # PostScript CID-keyed font driver + gzip # support for gzip-compressed files + lzw # support for LZW-compressed files pcf # PCF font driver pfr # PFR/TrueDoc font driver psaux # common PostScript routines module @@ -146,7 +148,7 @@ if $(DEBUG_HINTER) actions RefDoc { - python $(FT2_SRC)/tools/docmaker/docmaker.py --prefix=ft2 --title=FreeType-2.1.5 --output=$(DOC_DIR) $(FT2_INCLUDE)/freetype/*.h $(FT2_INCLUDE)/freetype/config/*.h $(FT2_INCLUDE)/freetype/cache/*.h + python $(FT2_SRC)/tools/docmaker/docmaker.py --prefix=ft2 --title=FreeType-2.1.8 --output=$(DOC_DIR) $(FT2_INCLUDE)/freetype/*.h $(FT2_INCLUDE)/freetype/config/*.h $(FT2_INCLUDE)/freetype/cache/*.h } RefDoc refdoc ; diff --git a/reactos/lib/freetype/Jamfile.in b/reactos/lib/freetype/Jamfile.in deleted file mode 100644 index c933cd92de6..00000000000 --- a/reactos/lib/freetype/Jamfile.in +++ /dev/null @@ -1,135 +0,0 @@ -# FreeType 2 top Jamfile (c) 2001, 2002, 2003 David Turner -# - -# The HDRMACRO is already defined in FTJam and is used to add -# the content of certain macros to the list of included header -# files. -# -# We can compile FreeType 2 with classic Jam however thanks to -# the following code -# -if ! $(JAM_TOOLSET) -{ - rule HDRMACRO - { - # nothing - } -} - - -# We need to invoke a SubDir rule if the FT2 source directory top is not the -# current directory. This allows us to build FreeType 2 as part of a larger -# project easily. -# -if $(FT2_TOP) != $(DOT) -{ - SubDir FT2_TOP ; -} - - -# The following macros define the include directory, the source directory, -# and the final library name (without library extensions). They can be -# replaced by other definitions when the library is compiled as part of -# a larger project. -# - -# Name of FreeType include directory during compilation. -# This is relative to FT2_TOP. -# -FT2_INCLUDE_DIR ?= include ; - -# Name of FreeType source directory during compilation. -# This is relative to FT2_TOP. -# -FT2_SRC_DIR ?= src ; - -# Name of final library, without extension. -# -FT2_LIB ?= $(LIBPREFIX)freetype ; - - -# Define FT2_BUILD_INCLUDE to point to your build-specific directory. -# This is prepended to FT2_INCLUDE_DIR. It can be used to specify -# the location of a custom which will point to custom -# versions of "ftmodule.h" and "ftoption.h", for example. -# -FT2_BUILD_INCLUDE ?= ; - -# The list of modules to compile on any given build of the library. -# By default, this will contain _all_ modules defined in FT2_SRC_DIR. -# -# IMPORTANT: You'll need to change the content of "ftmodule.h" as well -# if you modify this list or provide your own. -# -FT2_COMPONENTS ?= gzip # support for gzip-compressed files - autohint # auto-hinter - base # base component (public APIs) - bdf # BDF font driver - cache # cache sub-system - cff # CFF/CEF font driver - cid # PostScript CID-keyed font driver - pcf # PCF font driver - pfr # PFR/TrueDoc font driver - psaux # common PostScript routines module - pshinter # PostScript hinter module - psnames # PostScript names handling - raster # monochrome rasterizer - smooth # anti-aliased rasterizer - sfnt # SFNT-based format support routines - truetype # TrueType font driver - type1 # PostScript Type 1 font driver - type42 # PostScript Type 42 (embedded TrueType) driver - winfonts # Windows FON/FNT font driver - ; - - -# Don't touch. -# -FT2_INCLUDE = $(FT2_BUILD_INCLUDE) - [ FT2_SubDir $(FT2_INCLUDE_DIR) ] ; - -FT2_SRC = [ FT2_SubDir $(FT2_SRC_DIR) ] ; - -# Only used by FreeType developers. -# -if $(DEBUG_HINTER) -{ - CCFLAGS += -DDEBUG_HINTER ; -} - - -# We need "freetype2/include" in the current include path in order to -# compile any part of FreeType 2. -# -HDRS += $(FT2_INCLUDE) ; - - -# Uncomment the following line if you want to build individual source files -# for each FreeType 2 module. This is only useful during development, and -# is better defined as an environment variable anyway! -# -# FT2_MULTI = true ; - - -# The file is used to define macros that are -# later used in #include statements. It needs to be parsed in order to -# record these definitions. -# -HDRMACRO [ FT2_SubDir include freetype config ftheader.h ] ; -HDRMACRO [ FT2_SubDir include freetype internal internal.h ] ; - - -# Now include the Jamfile in "freetype2/src", used to drive the compilation -# of each FreeType 2 component and/or module. -# -SubInclude FT2_TOP $(FT2_SRC_DIR) ; - - -# Test files (hinter debugging). Only used by FreeType developers. -# -if $(DEBUG_HINTER) -{ - SubInclude FT2_TOP tests ; -} - -# end of top Jamfile diff --git a/reactos/lib/freetype/README b/reactos/lib/freetype/README index b50dd0c5769..72baf3d6a2f 100644 --- a/reactos/lib/freetype/README +++ b/reactos/lib/freetype/README @@ -9,7 +9,7 @@ is called `libttf'. They are *not* compatible! - FreeType 2.1.5 + FreeType 2.1.8 ============== Please read the docs/CHANGES file, it contains IMPORTANT INFORMATION. @@ -19,9 +19,9 @@ Note that the FreeType 2 documentation is now available as a separate package from our sites. See: - ftp://ftp.freetype.org/pub/freetype2/ftdocs-2.1.5.tar.bz2 - ftp://ftp.freetype.org/pub/freetype2/ftdocs-2.1.5.tar.gz - ftp://ftp.freetype.org/pub/freetype2/ftdoc215.zip + ftp://ftp.freetype.org/pub/freetype2/ftdocs-2.1.8.tar.bz2 + ftp://ftp.freetype.org/pub/freetype2/ftdocs-2.1.8.tar.gz + ftp://ftp.freetype.org/pub/freetype2/ftdoc218.zip Bugs diff --git a/reactos/lib/freetype/README.ROS b/reactos/lib/freetype/README.ROS index 5c330a932e2..6ee5f6f0b4d 100644 --- a/reactos/lib/freetype/README.ROS +++ b/reactos/lib/freetype/README.ROS @@ -1,7 +1,7 @@ CREDITS The code in this tree is based (it is actually an exact copy with some -ReactOS specific extra files) on the FreeType library, version 2.1.5. +ReactOS specific extra files) on the FreeType library, version 2.1.8. It was written and is being maintained by the FreeType team. The projects website is http://www.freetype.org. @@ -66,4 +66,4 @@ file, so it is obvious to everyone which FreeType version we're using. After testing, you can commit the new/changed files to CVS. ALthough files config.mk and freetype.def are generated, they should be included in CVS. -$Id: README.ROS,v 1.4 2004/01/21 19:23:45 gvg Exp $ +$Id: README.ROS,v 1.5 2004/05/10 17:48:22 gvg Exp $ diff --git a/reactos/lib/freetype/builds/atari/ATARI.H b/reactos/lib/freetype/builds/atari/ATARI.H new file mode 100644 index 00000000000..4e99965061b --- /dev/null +++ b/reactos/lib/freetype/builds/atari/ATARI.H @@ -0,0 +1,16 @@ +#ifndef ATARI_H +#define ATARI_H + +#pragma warn -stu + +/* PureC doesn't like 32bit enumerations */ + +#ifndef FT_IMAGE_TAG +#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) value +#endif /* FT_IMAGE_TAG */ + +#ifndef FT_ENC_TAG +#define FT_ENC_TAG( value, a, b, c, d ) value +#endif /* FT_ENC_TAG */ + +#endif /* ATARI_H */ diff --git a/reactos/lib/freetype/builds/atari/FNames.SIC b/reactos/lib/freetype/builds/atari/FNames.SIC new file mode 100644 index 00000000000..f3657179d91 --- /dev/null +++ b/reactos/lib/freetype/builds/atari/FNames.SIC @@ -0,0 +1,37 @@ +/* the following changes file names for PureC projects */ + +if (argc > 0) +{ + ordner = argv[0]; + if (basename(ordner) == "") /* ist Ordner */ + { + ChangeFilenames(ordner); + } +} + +proc ChangeFilenames(folder) +local i,entries,directory,file; +{ + entries = filelist(directory,folder); + for (i = 0; i < entries; ++i) + { + file = directory[i,0]; + if ((directory[i,3]&16) > 0) /* subdirectory */ + { + ChangeFilenames(folder+file+"\\"); + } + else + { + if ((stricmp(suffix(file),".h")==0)|(stricmp(suffix(file),".c")==0)) + ChangeFilename(folder,file); + } + } +} + +proc ChangeFilename(path,datei) +local newfile,err; +{ + newfile=datei; + newfile[0]=(newfile[0] | 32) ^ 32; + err=files.rename("-q",path+datei,newfile); +} diff --git a/reactos/lib/freetype/builds/atari/FREETYPE.PRJ b/reactos/lib/freetype/builds/atari/FREETYPE.PRJ new file mode 100644 index 00000000000..4e3e6895967 --- /dev/null +++ b/reactos/lib/freetype/builds/atari/FREETYPE.PRJ @@ -0,0 +1,33 @@ +;FreeType project file + +FREETYPE.LIB + +.C [-K -P -R -A] +.L [-J -V] +.S + += + +..\..\src\base\ftsystem.c +..\..\src\base\ftdebug.c + +..\..\src\base\ftinit.c +..\..\src\base\ftglyph.c +..\..\src\base\ftmm +..\..\src\base\ftbbox + +..\..\src\base\ftbase.c +..\..\src\autohint\autohint.c +;..\..\src\cache\ftcache.c +..\..\src\cff\cff.c +..\..\src\cid\type1cid.c +..\..\src\psaux\psaux.c +..\..\src\pshinter\pshinter.c +..\..\src\psnames\psnames.c +..\..\src\raster\raster.c +..\..\src\sfnt\sfnt.c +..\..\src\smooth\smooth.c +..\..\src\truetype\truetype.c +..\..\src\type1\type1.c +..\..\src\type42\type42.c + diff --git a/reactos/lib/freetype/builds/atari/README.TXT b/reactos/lib/freetype/builds/atari/README.TXT new file mode 100644 index 00000000000..04eec63519b --- /dev/null +++ b/reactos/lib/freetype/builds/atari/README.TXT @@ -0,0 +1,51 @@ +Compiling FreeType 2 with PureC compiler +======================================== + +[See below for a German version.] + +To compile FreeType 2 as a library the following changes must be applied: + +- All *.c files must start with an uppercase letter. + (In case GEMSCRIPT is available: + Simply drag the whole FreeType 2 directory to the file `FNames.SIC'.) + +- You have to change the INCLUDE directory in PureC's compiler options + to contain both the `INCLUDE' and `freetype2\include' directory. + Example: + + INCLUDE;E:\freetype2\include + +- The file `freetype2/include/Ft2build.h' must be patched as follows to + include ATARI.H: + + #ifndef __FT2_BUILD_GENERIC_H__ + #define __FT2_BUILD_GENERIC_H__ + + #include "ATARI.H" + + + +Compilieren von FreeType 2 mit PureC +==================================== + +Um FreeType 2 als eine Bibliothek (library) zu compilieren, muss folgendes +ge刵dert werden: + +- Alle *.c-files m乻sen mit einem GROSSBUCHSTABEN beginnen. + (Falls GEMSCRIPT zur Verf乬ung steht: + Den kompletten Ordner freetype2 auf die Datei `FNames.SIC' draggen.) + +- In den Compiler-Optionen von PureC muss das INCLUDE directory auf INCLUDE + und freetype2\include verweisen. Z.B.: + + INCLUDE;E:\freetype2\include + +- In der Datei freetype2/include/Ft2build.h muss zu Beginn + ein #include "ATARI.H" wie folgt eingef乬t werden: + + #ifndef __FT2_BUILD_GENERIC_H__ + #define __FT2_BUILD_GENERIC_H__ + + #include "ATARI.H" + +--- end of README.TXT --- diff --git a/reactos/lib/freetype/builds/freetype.mk b/reactos/lib/freetype/builds/freetype.mk index b9e553ba46f..29fa344d59b 100644 --- a/reactos/lib/freetype/builds/freetype.mk +++ b/reactos/lib/freetype/builds/freetype.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2000, 2001, 2002, 2003 by +# Copyright 1996-2000, 2001, 2002, 2003, 2004 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, @@ -97,6 +97,7 @@ BASE_DIR := $(SRC_DIR)/base # PUBLIC_DIR := $(TOP_DIR)/include/freetype INTERNAL_DIR := $(PUBLIC_DIR)/internal +SERVICES_DIR := $(INTERNAL_DIR)/services CONFIG_DIR := $(PUBLIC_DIR)/config CACHE_DIR := $(PUBLIC_DIR)/cache @@ -155,7 +156,8 @@ OBJECTS_LIST := # changes, the whole library is recompiled. # PUBLIC_H := $(wildcard $(PUBLIC_DIR)/*.h) -BASE_H := $(wildcard $(INTERNAL_DIR)/*.h) +BASE_H := $(wildcard $(INTERNAL_DIR)/*.h) \ + $(wildcard $(SERVICES_DIR)/*.h) CONFIG_H := $(wildcard $(CONFIG_DIR)/*.h) \ $(wildcard $(BUILD_DIR)/freetype/config/*.h) CACHE_H := $(wildcard $(CACHE_DIR)/*.h) @@ -252,7 +254,7 @@ library: $(PROJECT_LIBRARY) refdoc: python $(SRC_DIR)/tools/docmaker/docmaker.py \ --prefix=ft2 \ - --title=FreeType-2.1.5 \ + --title=FreeType-2.1.8 \ --output=$(DOC_DIR) \ $(PUBLIC_DIR)/*.h \ $(PUBLIC_DIR)/config/*.h \ diff --git a/reactos/lib/freetype/builds/toplevel.mk b/reactos/lib/freetype/builds/toplevel.mk index 08f50b42e08..6ee3818dff5 100644 --- a/reactos/lib/freetype/builds/toplevel.mk +++ b/reactos/lib/freetype/builds/toplevel.mk @@ -110,6 +110,7 @@ ifdef check_platform $(RM) builds/unix/config.status $(RM) builds/unix/unix-def.mk $(RM) builds/unix/unix-cc.mk + $(RM) builds/unix/freetype2.pc $(RM) nul endif # test is_unix diff --git a/reactos/lib/freetype/builds/unix/.cvsignore b/reactos/lib/freetype/builds/unix/.cvsignore index cc8ec6a8dad..808b600590d 100644 --- a/reactos/lib/freetype/builds/unix/.cvsignore +++ b/reactos/lib/freetype/builds/unix/.cvsignore @@ -6,3 +6,4 @@ config.log libtool ftconfig.h freetype-config +freetype2.pc diff --git a/reactos/lib/freetype/builds/unix/aclocal.m4 b/reactos/lib/freetype/builds/unix/aclocal.m4 index e63092a429f..ceda545e2e0 100644 --- a/reactos/lib/freetype/builds/unix/aclocal.m4 +++ b/reactos/lib/freetype/builds/unix/aclocal.m4 @@ -1,6 +1,6 @@ -# generated automatically by aclocal 1.7.1 -*- Autoconf -*- +# generated automatically by aclocal 1.8a -*- Autoconf -*- -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 # Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -11,43 +11,63 @@ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- -# serial 1 FT_MUNMAP_DECL +# serial 47 AC_PROG_LIBTOOL -AC_DEFUN(FT_MUNMAP_DECL, -[AC_MSG_CHECKING([whether munmap must be declared]) -AC_CACHE_VAL(ft_cv_munmap_decl, -[AC_TRY_COMPILE([ -#ifdef HAVE_UNISTD_H -#include -#endif -#include ], -[char *(*pfn) = (char *(*))munmap], -ft_cv_munmap_decl=no, -ft_cv_munmap_decl=yes)]) -AC_MSG_RESULT($ft_cv_munmap_decl) -if test $ft_cv_munmap_decl = yes; then - AC_DEFINE(NEED_MUNMAP_DECL,, - [Define to 1 if munmap() is not defined in ]) -fi]) -AC_DEFUN(FT_MUNMAP_PARAM, -[AC_MSG_CHECKING([for munmap's first parameter type]) -AC_TRY_COMPILE([ -#include -#include -int munmap(void *, size_t);],, - AC_MSG_RESULT([void *]);AC_DEFINE(MUNMAP_USES_VOIDP,, - [Define to 1 if the first argument of munmap is of type void *]), - AC_MSG_RESULT([char *])) -]) +# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) +# ----------------------------------------------------------- +# If this macro is not defined by Autoconf, define it here. +m4_ifdef([AC_PROVIDE_IFELSE], + [], + [m4_define([AC_PROVIDE_IFELSE], + [m4_ifdef([AC_PROVIDE_$1], + [$2], [$3])])]) -# libtool.m4 - Configure libtool for the host system. -*-Shell-script-*- - -# serial 46 AC_PROG_LIBTOOL +# AC_PROG_LIBTOOL +# --------------- AC_DEFUN([AC_PROG_LIBTOOL], +[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl +dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX +dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. + AC_PROVIDE_IFELSE([AC_PROG_CXX], + [AC_LIBTOOL_CXX], + [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX + ])]) +dnl And a similar setup for Fortran 77 support + AC_PROVIDE_IFELSE([AC_PROG_F77], + [AC_LIBTOOL_F77], + [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 +])]) + +dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. +dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run +dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. + AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [ifdef([AC_PROG_GCJ], + [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([A][M_PROG_GCJ], + [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([LT_AC_PROG_GCJ], + [define([LT_AC_PROG_GCJ], + defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) +])])# AC_PROG_LIBTOOL + + +# _AC_PROG_LIBTOOL +# ---------------- +AC_DEFUN([_AC_PROG_LIBTOOL], [AC_REQUIRE([AC_LIBTOOL_SETUP])dnl +AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl +AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl +AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" @@ -58,10 +78,13 @@ AC_SUBST(LIBTOOL)dnl # Prevent multiple expansion define([AC_PROG_LIBTOOL], []) -]) +])# _AC_PROG_LIBTOOL + +# AC_LIBTOOL_SETUP +# ---------------- AC_DEFUN([AC_LIBTOOL_SETUP], -[AC_PREREQ(2.13)dnl +[AC_PREREQ(2.50)dnl AC_REQUIRE([AC_ENABLE_SHARED])dnl AC_REQUIRE([AC_ENABLE_STATIC])dnl AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl @@ -71,15 +94,103 @@ AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_LD])dnl AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl AC_REQUIRE([AC_PROG_NM])dnl -AC_REQUIRE([LT_AC_PROG_SED])dnl AC_REQUIRE([AC_PROG_LN_S])dnl AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! AC_REQUIRE([AC_OBJEXT])dnl AC_REQUIRE([AC_EXEEXT])dnl dnl +AC_LIBTOOL_SYS_MAX_CMD_LEN +AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +AC_LIBTOOL_OBJDIR + +AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl _LT_AC_PROG_ECHO_BACKSLASH + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] + +# Same as above, but do not quote variable references. +[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +AC_CHECK_TOOL(AR, ar, false) +AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_CHECK_TOOL(STRIP, strip, :) + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + ;; + *) + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + # Only perform the check for file, if the check method requires it case $deplibs_check_method in file_magic*) @@ -89,327 +200,78 @@ file_magic*) ;; esac -AC_CHECK_TOOL(RANLIB, ranlib, :) -AC_CHECK_TOOL(STRIP, strip, :) - -ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) -ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], +AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], enable_win32_dll=yes, enable_win32_dll=no) -AC_ARG_ENABLE(libtool-lock, - [ --disable-libtool-lock avoid locking (might break parallel builds)]) +AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -*-*-irix6*) - # Find out which ABI we are using. - echo '[#]line __oline__ "configure"' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - rm -rf conftest* - ;; +AC_ARG_WITH([pic], + [AC_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) +test -z "$pic_mode" && pic_mode=default -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, - [AC_LANG_SAVE - AC_LANG_C - AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) - AC_LANG_RESTORE]) - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; +# Use C for the default configuration in the libtool script +tagname= +AC_LIBTOOL_LANG_C_CONFIG +_LT_AC_TAGCONFIG +])# AC_LIBTOOL_SETUP -ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], -[*-*-cygwin* | *-*-mingw* | *-*-pw32*) - AC_CHECK_TOOL(DLLTOOL, dlltool, false) - AC_CHECK_TOOL(AS, as, false) - AC_CHECK_TOOL(OBJDUMP, objdump, false) - # recent cygwin and mingw systems supply a stub DllMain which the user - # can override, but on older systems we have to supply one - AC_CACHE_CHECK([if libtool should supply DllMain function], lt_cv_need_dllmain, - [AC_TRY_LINK([], - [extern int __attribute__((__stdcall__)) DllMain(void*, int, void*); - DllMain (0, 0, 0);], - [lt_cv_need_dllmain=no],[lt_cv_need_dllmain=yes])]) +# _LT_AC_SYS_COMPILER +# ------------------- +AC_DEFUN([_LT_AC_SYS_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl - case $host/$CC in - *-*-cygwin*/gcc*-mno-cygwin*|*-*-mingw*) - # old mingw systems require "-dll" to link a DLL, while more recent ones - # require "-mdll" - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -mdll" - AC_CACHE_CHECK([how to link DLLs], lt_cv_cc_dll_switch, - [AC_TRY_LINK([], [], [lt_cv_cc_dll_switch=-mdll],[lt_cv_cc_dll_switch=-dll])]) - CFLAGS="$SAVE_CFLAGS" ;; - *-*-cygwin* | *-*-pw32*) - # cygwin systems need to pass --dll to the linker, and not link - # crt.o which will require a WinMain@16 definition. - lt_cv_cc_dll_switch="-Wl,--dll -nostartfiles" ;; - esac - ;; - ]) -esac +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} -_LT_AC_LTCONFIG_HACK +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_AC_SYS_COMPILER -]) -# AC_LIBTOOL_HEADER_ASSERT -# ------------------------ -AC_DEFUN([AC_LIBTOOL_HEADER_ASSERT], -[AC_CACHE_CHECK([whether $CC supports assert without backlinking], - [lt_cv_func_assert_works], - [case $host in - *-*-solaris*) - if test "$GCC" = yes && test "$with_gnu_ld" != yes; then - case `$CC --version 2>/dev/null` in - [[12]].*) lt_cv_func_assert_works=no ;; - *) lt_cv_func_assert_works=yes ;; - esac - fi - ;; - esac]) +# _LT_AC_SYS_LIBPATH_AIX +# ---------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], +[AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_AC_SYS_LIBPATH_AIX -if test "x$lt_cv_func_assert_works" = xyes; then - AC_CHECK_HEADERS(assert.h) -fi -])# AC_LIBTOOL_HEADER_ASSERT -# _LT_AC_CHECK_DLFCN -# -------------------- -AC_DEFUN([_LT_AC_CHECK_DLFCN], -[AC_CHECK_HEADERS(dlfcn.h) -])# _LT_AC_CHECK_DLFCN +# _LT_AC_SHELL_INIT(ARG) +# ---------------------- +AC_DEFUN([_LT_AC_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_AC_SHELL_INIT -# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE -# --------------------------------- -AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], -[AC_REQUIRE([AC_CANONICAL_HOST]) -AC_REQUIRE([AC_PROG_NM]) -AC_REQUIRE([AC_OBJEXT]) -# Check for command to grab the raw symbol name followed by C symbol from nm. -AC_MSG_CHECKING([command to parse $NM output]) -AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [dnl - -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] - -# Character class describing NM global symbol codes. -symcode='[[BCDEGRST]]' - -# Regexp to match symbols that can be accessed directly from C. -sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' - -# Transform the above into a raw symbol and a C symbol. -symxfrm='\1 \2\3 \3' - -# Transform an extracted symbol line into a proper C declaration -lt_cv_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'" - -# Transform an extracted symbol line into symbol name and symbol address -lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[[BCDT]]' - ;; -cygwin* | mingw* | pw32*) - symcode='[[ABCDGISTW]]' - ;; -hpux*) # Its linker distinguishes data from code symbols - lt_cv_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" - lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" - ;; -irix* | nonstopux*) - symcode='[[BCDEGRST]]' - ;; -osf*) - symcode='[[BCDEGQRST]]' - ;; -solaris* | sysv5*) - symcode='[[BDT]]' - ;; -sysv4) - symcode='[[DFNSTU]]' - ;; -esac - -# Handle CRLF in mingw tool chain -opt_cr= -case $host_os in -mingw*) - opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; -esac - -# If we're using GNU nm, then use its standard symbol codes. -if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then - symcode='[[ABCDGISTW]]' -fi - -# Try without a prefix undercore, then with it. -for ac_symprfx in "" "_"; do - - # Write the raw and C identifiers. -lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" - - # Check to see that the pipe works correctly. - pipe_works=no - rm -f conftest* - cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - - # Make sure that we snagged all the symbols we need. - if egrep ' nm_test_var$' "$nlist" >/dev/null; then - if egrep ' nm_test_func$' "$nlist" >/dev/null; then - cat < conftest.$ac_ext -#ifdef __cplusplus -extern "C" { -#endif - -EOF - # Now generate the symbol file. - eval "$lt_cv_global_symbol_to_cdecl"' < "$nlist" >> conftest.$ac_ext' - - cat <> conftest.$ac_ext -#if defined (__STDC__) && __STDC__ -# define lt_ptr void * -#else -# define lt_ptr char * -# define const -#endif - -/* The mapping between symbol names and symbols. */ -const struct { - const char *name; - lt_ptr address; -} -lt_preloaded_symbols[[]] = -{ -EOF - sed "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr) \&\2},/" < "$nlist" >> conftest.$ac_ext - cat <<\EOF >> conftest.$ac_ext - {0, (lt_ptr) 0} -}; - -#ifdef __cplusplus -} -#endif -EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - save_LIBS="$LIBS" - save_CFLAGS="$CFLAGS" - LIBS="conftstm.$ac_objext" - CFLAGS="$CFLAGS$no_builtin_flag" - if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then - pipe_works=yes - fi - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" - else - echo "cannot find nm_test_func in $nlist" >&AC_FD_CC - fi - else - echo "cannot find nm_test_var in $nlist" >&AC_FD_CC - fi - else - echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AC_FD_CC - fi - else - echo "$progname: failed program was:" >&AC_FD_CC - cat conftest.$ac_ext >&5 - fi - rm -f conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then - break - else - lt_cv_sys_global_symbol_pipe= - fi -done -]) -global_symbol_pipe="$lt_cv_sys_global_symbol_pipe" -if test -z "$lt_cv_sys_global_symbol_pipe"; then - global_symbol_to_cdecl= - global_symbol_to_c_name_address= -else - global_symbol_to_cdecl="$lt_cv_global_symbol_to_cdecl" - global_symbol_to_c_name_address="$lt_cv_global_symbol_to_c_name_address" -fi -if test -z "$global_symbol_pipe$global_symbol_to_cdec$global_symbol_to_c_name_address"; -then - AC_MSG_RESULT(failed) -else - AC_MSG_RESULT(ok) -fi -]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE - -# _LT_AC_LIBTOOL_SYS_PATH_SEPARATOR -# --------------------------------- -AC_DEFUN([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR], -[# Find the correct PATH separator. Usually this is `:', but -# DJGPP uses `;' like DOS. -if test "X${PATH_SEPARATOR+set}" != Xset; then - UNAME=${UNAME-`uname 2>/dev/null`} - case X$UNAME in - *-DOS) lt_cv_sys_path_separator=';' ;; - *) lt_cv_sys_path_separator=':' ;; - esac - PATH_SEPARATOR=$lt_cv_sys_path_separator -fi -])# _LT_AC_LIBTOOL_SYS_PATH_SEPARATOR # _LT_AC_PROG_ECHO_BACKSLASH # -------------------------- # Add some code to the start of the generated configure script which # will find an echo command which doesn't interpret backslashes. AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], -[ifdef([AC_DIVERSION_NOTICE], [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], - [AC_DIVERT_PUSH(NOTICE)]) -_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR - +[_LT_AC_SHELL_INIT([ # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} @@ -427,7 +289,7 @@ if test "X[$]1" = X--no-reexec; then elif test "X[$]1" = X--fallback-echo; then # Avoid inline document here, it may be left over : -elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then # Yippee, $echo works! : else @@ -439,7 +301,7 @@ if test "X[$]1" = X--fallback-echo; then # used as fallback echo shift cat </dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && @@ -483,7 +346,7 @@ else break fi done - IFS="$save_ifs" + IFS="$lt_save_ifs" if test "X$echo" = Xecho; then # We didn't find a better echo, so look for alternatives. @@ -556,17 +419,298 @@ if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then fi AC_SUBST(ECHO) -AC_DIVERT_POP -])# _LT_AC_PROG_ECHO_BACKSLASH +])])# _LT_AC_PROG_ECHO_BACKSLASH + + +# _LT_AC_LOCK +# ----------- +AC_DEFUN([_LT_AC_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case "`/usr/bin/file conftest.o`" in + *32-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw* | *-*-pw32*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; + ]) +esac + +need_locks="$enable_libtool_lock" + +])# _LT_AC_LOCK + + +# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], +[AC_REQUIRE([LT_AC_PROG_SED]) +AC_CACHE_CHECK([$1], [$2], + [$2=no + ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + $2=yes + fi + fi + $rm conftest* +]) + +if test x"[$]$2" = xyes; then + ifelse([$5], , :, [$5]) +else + ifelse([$6], , :, [$6]) +fi +])# AC_LIBTOOL_COMPILER_OPTION + + +# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ------------------------------------------------------------ +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], +[AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + else + $2=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + ifelse([$4], , :, [$4]) +else + ifelse([$5], , :, [$5]) +fi +])# AC_LIBTOOL_LINKER_OPTION + + +# AC_LIBTOOL_SYS_MAX_CMD_LEN +# -------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], +[# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + *) + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while (test "X"`$CONFIG_SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + teststring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +])# AC_LIBTOOL_SYS_MAX_CMD_LEN + + +# _LT_AC_CHECK_DLFCN +# -------------------- +AC_DEFUN([_LT_AC_CHECK_DLFCN], +[AC_CHECK_HEADERS(dlfcn.h)dnl +])# _LT_AC_CHECK_DLFCN + # _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ------------------------------------------------------------------ AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], -[if test "$cross_compiling" = yes; then : +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "$cross_compiling" = yes; then : [$4] else - AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext </dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Constants: -rm="rm -f" - -# Global variables: -default_ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except M$VC, -# which needs '.lib'). -libext=a -ltmain="$ac_aux_dir/ltmain.sh" -ofile="$default_ofile" -with_gnu_ld="$lt_cv_prog_gnu_ld" -need_locks="$enable_libtool_lock" - -old_CC="$CC" -old_CFLAGS="$CFLAGS" - -# Set sane defaults for various variables -test -z "$AR" && AR=ar -test -z "$AR_FLAGS" && AR_FLAGS=cru -test -z "$AS" && AS=as -test -z "$CC" && CC=cc -test -z "$DLLTOOL" && DLLTOOL=dlltool -test -z "$LD" && LD=ld -test -z "$LN_S" && LN_S="ln -s" -test -z "$MAGIC_CMD" && MAGIC_CMD=file -test -z "$NM" && NM=nm -test -z "$OBJDUMP" && OBJDUMP=objdump -test -z "$RANLIB" && RANLIB=: -test -z "$STRIP" && STRIP=: -test -z "$ac_objext" && ac_objext=o - -if test x"$host" != x"$build"; then - ac_tool_prefix=${host_alias}- -else - ac_tool_prefix= -fi - -# Transform linux* to *-*-linux-gnu*, to support old configure scripts. -case $host_os in -linux-gnu*) ;; -linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` -esac - -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - openbsd*) - old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" - ;; - *) - old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" -fi - -# Allow CC to be a program name with arguments. -set dummy $CC -compiler="[$]2" - -AC_MSG_CHECKING([for objdir]) -rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - objdir=.libs -else - # MS-DOS does not allow filenames that begin with a dot. - objdir=_libs -fi -rmdir .libs 2>/dev/null -AC_MSG_RESULT($objdir) - - -AC_ARG_WITH(pic, -[ --with-pic try to use only PIC/non-PIC objects [default=use both]], -pic_mode="$withval", pic_mode=default) -test -z "$pic_mode" && pic_mode=default - -# We assume here that the value for lt_cv_prog_cc_pic will not be cached -# in isolation, and that seeing it set (from the cache) indicates that -# the associated values are set (in the cache) correctly too. -AC_MSG_CHECKING([for $compiler option to produce PIC]) -AC_CACHE_VAL(lt_cv_prog_cc_pic, -[ lt_cv_prog_cc_pic= - lt_cv_prog_cc_shlib= - lt_cv_prog_cc_wl= - lt_cv_prog_cc_static= - lt_cv_prog_cc_no_builtin= - lt_cv_prog_cc_can_build_shared=$can_build_shared - - if test "$GCC" = yes; then - lt_cv_prog_cc_wl='-Wl,' - lt_cv_prog_cc_static='-static' - - case $host_os in - aix*) - # Below there is a dirty hack to force normal static linking with -ldl - # The problem is because libdl dynamically linked with both libc and - # libC (AIX C++ library), which obviously doesn't included in libraries - # list by gcc. This cause undefined symbols with -static flags. - # This hack allows C programs to be linked with "-static -ldl", but - # not sure about C++ programs. - lt_cv_prog_cc_static="$lt_cv_prog_cc_static ${lt_cv_prog_cc_wl}-lC" - ;; - amigaos*) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_cv_prog_cc_pic='-m68020 -resident32 -malways-restore-a4' - ;; - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_cv_prog_cc_pic='-fno-common' - ;; - cygwin* | mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_cv_prog_cc_pic='-DDLL_EXPORT' - ;; - sysv4*MP*) - if test -d /usr/nec; then - lt_cv_prog_cc_pic=-Kconform_pic - fi - ;; - *) - lt_cv_prog_cc_pic='-fPIC' - ;; - esac - else - # PORTME Check for PIC flags for the system compiler. - case $host_os in - aix3* | aix4* | aix5*) - lt_cv_prog_cc_wl='-Wl,' - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_cv_prog_cc_static='-Bstatic' - else - lt_cv_prog_cc_static='-bnso -bI:/lib/syscalls.exp' - fi - ;; - - hpux9* | hpux10* | hpux11*) - # Is there a better lt_cv_prog_cc_static that works with the bundled CC? - lt_cv_prog_cc_wl='-Wl,' - lt_cv_prog_cc_static="${lt_cv_prog_cc_wl}-a ${lt_cv_prog_cc_wl}archive" - lt_cv_prog_cc_pic='+Z' - ;; - - irix5* | irix6* | nonstopux*) - lt_cv_prog_cc_wl='-Wl,' - lt_cv_prog_cc_static='-non_shared' - # PIC (with -KPIC) is the default. - ;; - - cygwin* | mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_cv_prog_cc_pic='-DDLL_EXPORT' - ;; - - newsos6) - lt_cv_prog_cc_pic='-KPIC' - lt_cv_prog_cc_static='-Bstatic' - ;; - - osf3* | osf4* | osf5*) - # All OSF/1 code is PIC. - lt_cv_prog_cc_wl='-Wl,' - lt_cv_prog_cc_static='-non_shared' - ;; - - sco3.2v5*) - lt_cv_prog_cc_pic='-Kpic' - lt_cv_prog_cc_static='-dn' - lt_cv_prog_cc_shlib='-belf' - ;; - - solaris*) - lt_cv_prog_cc_pic='-KPIC' - lt_cv_prog_cc_static='-Bstatic' - lt_cv_prog_cc_wl='-Wl,' - ;; - - sunos4*) - lt_cv_prog_cc_pic='-PIC' - lt_cv_prog_cc_static='-Bstatic' - lt_cv_prog_cc_wl='-Qoption ld ' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - lt_cv_prog_cc_pic='-KPIC' - lt_cv_prog_cc_static='-Bstatic' - lt_cv_prog_cc_wl='-Wl,' - ;; - - uts4*) - lt_cv_prog_cc_pic='-pic' - lt_cv_prog_cc_static='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - lt_cv_prog_cc_pic='-Kconform_pic' - lt_cv_prog_cc_static='-Bstatic' - fi - ;; - - *) - lt_cv_prog_cc_can_build_shared=no - ;; - esac - fi + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* ]) -if test -z "$lt_cv_prog_cc_pic"; then - AC_MSG_RESULT([none]) -else - AC_MSG_RESULT([$lt_cv_prog_cc_pic]) - - # Check to make sure the pic_flag actually works. - AC_MSG_CHECKING([if $compiler PIC flag $lt_cv_prog_cc_pic works]) - AC_CACHE_VAL(lt_cv_prog_cc_pic_works, [dnl - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $lt_cv_prog_cc_pic -DPIC" - AC_TRY_COMPILE([], [], [dnl - case $host_os in - hpux9* | hpux10* | hpux11*) - # On HP-UX, both CC and GCC only warn that PIC is supported... then - # they create non-PIC objects. So, if there were any warnings, we - # assume that PIC is not supported. - if test -s conftest.err; then - lt_cv_prog_cc_pic_works=no - else - lt_cv_prog_cc_pic_works=yes - fi - ;; - *) - lt_cv_prog_cc_pic_works=yes - ;; - esac - ], [dnl - lt_cv_prog_cc_pic_works=no - ]) - CFLAGS="$save_CFLAGS" - ]) - - if test "X$lt_cv_prog_cc_pic_works" = Xno; then - lt_cv_prog_cc_pic= - lt_cv_prog_cc_can_build_shared=no - else - lt_cv_prog_cc_pic=" $lt_cv_prog_cc_pic" - fi - - AC_MSG_RESULT([$lt_cv_prog_cc_pic_works]) -fi - -# Check for any special shared library compilation flags. -if test -n "$lt_cv_prog_cc_shlib"; then - AC_MSG_WARN([\`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries]) - if echo "$old_CC $old_CFLAGS " | egrep -e "[[ ]]$lt_cv_prog_cc_shlib[[ ]]" >/dev/null; then : - else - AC_MSG_WARN([add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure]) - lt_cv_prog_cc_can_build_shared=no - fi -fi - -AC_MSG_CHECKING([if $compiler static flag $lt_cv_prog_cc_static works]) -AC_CACHE_VAL([lt_cv_prog_cc_static_works], [dnl - lt_cv_prog_cc_static_works=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_cv_prog_cc_static" - AC_TRY_LINK([], [], [lt_cv_prog_cc_static_works=yes]) - LDFLAGS="$save_LDFLAGS" -]) - -# Belt *and* braces to stop my trousers falling down: -test "X$lt_cv_prog_cc_static_works" = Xno && lt_cv_prog_cc_static= -AC_MSG_RESULT([$lt_cv_prog_cc_static_works]) - -pic_flag="$lt_cv_prog_cc_pic" -special_shlib_compile_flags="$lt_cv_prog_cc_shlib" -wl="$lt_cv_prog_cc_wl" -link_static_flag="$lt_cv_prog_cc_static" -no_builtin_flag="$lt_cv_prog_cc_no_builtin" -can_build_shared="$lt_cv_prog_cc_can_build_shared" +])# AC_LIBTOOL_PROG_CC_C_O -# Check to see if options -o and -c are simultaneously supported by compiler -AC_MSG_CHECKING([if $compiler supports -c -o file.$ac_objext]) -AC_CACHE_VAL([lt_cv_compiler_c_o], [ -$rm -r conftest 2>/dev/null -mkdir conftest -cd conftest -echo "int some_variable = 0;" > conftest.$ac_ext -mkdir out -# According to Tom Tromey, Ian Lance Taylor reported there are C compilers -# that will create temporary files in the current directory regardless of -# the output directory. Thus, making CWD read-only will cause this test -# to fail, enabling locking or at least warning the user not to do parallel -# builds. -chmod -w . -save_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS -o out/conftest2.$ac_objext" -compiler_c_o=no -if { (eval echo configure:__oline__: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s out/conftest.err; then - lt_cv_compiler_c_o=no - else - lt_cv_compiler_c_o=yes - fi -else - # Append any errors to the config.log. - cat out/conftest.err 1>&AC_FD_CC - lt_cv_compiler_c_o=no -fi -CFLAGS="$save_CFLAGS" -chmod u+w . -$rm conftest* out/* -rmdir out -cd .. -rmdir conftest -$rm -r conftest 2>/dev/null -]) -compiler_c_o=$lt_cv_compiler_c_o -AC_MSG_RESULT([$compiler_c_o]) - -if test x"$compiler_c_o" = x"yes"; then - # Check to see if we can write to a .lo - AC_MSG_CHECKING([if $compiler supports -c -o file.lo]) - AC_CACHE_VAL([lt_cv_compiler_o_lo], [ - lt_cv_compiler_o_lo=no - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -c -o conftest.lo" - save_objext="$ac_objext" - ac_objext=lo - AC_TRY_COMPILE([], [int some_variable = 0;], [dnl - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - lt_cv_compiler_o_lo=no - else - lt_cv_compiler_o_lo=yes - fi - ]) - ac_objext="$save_objext" - CFLAGS="$save_CFLAGS" - ]) - compiler_o_lo=$lt_cv_compiler_o_lo - AC_MSG_RESULT([$compiler_o_lo]) -else - compiler_o_lo=no -fi - +# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) +# ----------------------------------------- # Check to see if we can do hard links to lock some files if needed +AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], +[AC_REQUIRE([_LT_AC_LOCK])dnl + hard_links="nottested" -if test "$compiler_c_o" = no && test "$need_locks" != no; then +if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes @@ -1148,764 +972,77 @@ if test "$compiler_c_o" = no && test "$need_locks" != no; then ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then - AC_MSG_WARN([\`$CC' does not support \`-c -o', so \`make -j' may be unsafe]) + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi +])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS -if test "$GCC" = yes; then - # Check to see if options -fno-rtti -fno-exceptions are supported by compiler - AC_MSG_CHECKING([if $compiler supports -fno-rtti -fno-exceptions]) - echo "int some_variable = 0;" > conftest.$ac_ext - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.$ac_ext" - compiler_rtti_exceptions=no - AC_TRY_COMPILE([], [int some_variable = 0;], [dnl - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - compiler_rtti_exceptions=no - else - compiler_rtti_exceptions=yes - fi - ]) - CFLAGS="$save_CFLAGS" - AC_MSG_RESULT([$compiler_rtti_exceptions]) - if test "$compiler_rtti_exceptions" = "yes"; then - no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions' - else - no_builtin_flag=' -fno-builtin' - fi -fi - -# See if the linker supports building shared libraries. -AC_MSG_CHECKING([whether the linker ($LD) supports shared libraries]) - -allow_undefined_flag= -no_undefined_flag= -need_lib_prefix=unknown -need_version=unknown -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -archive_cmds= -archive_expsym_cmds= -old_archive_from_new_cmds= -old_archive_from_expsyms_cmds= -export_dynamic_flag_spec= -whole_archive_flag_spec= -thread_safe_flag_spec= -hardcode_into_libs=no -hardcode_libdir_flag_spec= -hardcode_libdir_separator= -hardcode_direct=no -hardcode_minus_L=no -hardcode_shlibpath_var=unsupported -runpath_var= -link_all_deplibs=unknown -always_export_symbols=no -export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols' -# include_expsyms should be a list of space-separated symbols to be *always* -# included in the symbol list -include_expsyms= -# exclude_expsyms can be an egrep regular expression of symbols to exclude -# it will be wrapped by ` (' and `)$', so one must not match beginning or -# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', -# as well as any symbol that contains `d'. -exclude_expsyms="_GLOBAL_OFFSET_TABLE_" -# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out -# platforms (ab)use it in PIC code, but their linkers get confused if -# the symbol is explicitly referenced. Since portable code cannot -# rely on this symbol name, it's probably fine to never include it in -# preloaded symbol tables. -extract_expsyms_cmds= - -case $host_os in -cygwin* | mingw* | pw32*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; -openbsd*) - with_gnu_ld=no - ;; -esac - -ld_shlibs=yes -if test "$with_gnu_ld" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # See if GNU ld supports shared libraries. - case $host_os in - aix3* | aix4* | aix5*) - # On AIX, the GNU linker is very broken - # Note:Check GNU linker on AIX 5-IA64 when/if it becomes available. - ld_shlibs=no - cat <&2 - -*** Warning: the GNU linker, at least up to release 2.9.1, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to modify your PATH -*** so that a non-GNU linker is found, and then restart. - -EOF - ;; - - amigaos*) - archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - - # Samuel A. Falvo II reports - # that the semantics of dynamic libraries on AmigaOS, at least up - # to version 4, is to share data among multiple programs linked - # with the same dynamic library. Since this doesn't match the - # behavior of shared libraries on other platforms, we can use - # them. - ld_shlibs=no - ;; - - beos*) - if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs=no - fi - ;; - - cygwin* | mingw* | pw32*) - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec='-L$libdir' - allow_undefined_flag=unsupported - always_export_symbols=yes - - extract_expsyms_cmds='test -f $output_objdir/impgen.c || \ - sed -e "/^# \/\* impgen\.c starts here \*\//,/^# \/\* impgen.c ends here \*\// { s/^# //;s/^# *$//; p; }" -e d < $''0 > $output_objdir/impgen.c~ - test -f $output_objdir/impgen.exe || (cd $output_objdir && \ - if test "x$HOST_CC" != "x" ; then $HOST_CC -o impgen impgen.c ; \ - else $CC -o impgen impgen.c ; fi)~ - $output_objdir/impgen $dir/$soroot > $output_objdir/$soname-def' - - old_archive_from_expsyms_cmds='$DLLTOOL --as=$AS --dllname $soname --def $output_objdir/$soname-def --output-lib $output_objdir/$newlib' - - # cygwin and mingw dlls have different entry points and sets of symbols - # to exclude. - # FIXME: what about values for MSVC? - dll_entry=__cygwin_dll_entry@12 - dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12~ - case $host_os in - mingw*) - # mingw values - dll_entry=_DllMainCRTStartup@12 - dll_exclude_symbols=DllMain@12,DllMainCRTStartup@12,DllEntryPoint@12~ - ;; - esac - - # mingw and cygwin differ, and it's simplest to just exclude the union - # of the two symbol sets. - dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12,DllMainCRTStartup@12,DllEntryPoint@12 - - # recent cygwin and mingw systems supply a stub DllMain which the user - # can override, but on older systems we have to supply one (in ltdll.c) - if test "x$lt_cv_need_dllmain" = "xyes"; then - ltdll_obj='$output_objdir/$soname-ltdll.'"$ac_objext " - ltdll_cmds='test -f $output_objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $''0 > $output_objdir/$soname-ltdll.c~ - test -f $output_objdir/$soname-ltdll.$ac_objext || (cd $output_objdir && $CC -c $soname-ltdll.c)~' - else - ltdll_obj= - ltdll_cmds= - fi - - # Extract the symbol export list from an `--export-all' def file, - # then regenerate the def file from the symbol export list, so that - # the compiled dll only exports the symbol export list. - # Be careful not to strip the DATA tag left be newer dlltools. - export_symbols_cmds="$ltdll_cmds"' - $DLLTOOL --export-all --exclude-symbols '$dll_exclude_symbols' --output-def $output_objdir/$soname-def '$ltdll_obj'$libobjs $convenience~ - sed -e "1,/EXPORTS/d" -e "s/ @ [[0-9]]*//" -e "s/ *;.*$//" < $output_objdir/$soname-def > $export_symbols' - - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is. - # If DATA tags from a recent dlltool are present, honour them! - archive_expsym_cmds='if test "x`sed 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname-def; - else - echo EXPORTS > $output_objdir/$soname-def; - _lt_hint=1; - cat $export_symbols | while read symbol; do - set dummy \$symbol; - case \[$]# in - 2) echo " \[$]2 @ \$_lt_hint ; " >> $output_objdir/$soname-def;; - 4) echo " \[$]2 \[$]3 \[$]4 ; " >> $output_objdir/$soname-def; _lt_hint=`expr \$_lt_hint - 1`;; - *) echo " \[$]2 @ \$_lt_hint \[$]3 ; " >> $output_objdir/$soname-def;; - esac; - _lt_hint=`expr 1 + \$_lt_hint`; - done; - fi~ - '"$ltdll_cmds"' - $CC -Wl,--base-file,$output_objdir/$soname-base '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ - $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~ - $CC -Wl,--base-file,$output_objdir/$soname-base $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ - $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp --output-lib $output_objdir/$libname.dll.a~ - $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags' - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - archive_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris* | sysv5*) - if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then - ld_shlibs=no - cat <&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -EOF - elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - - sunos4*) - archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - *) - if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - - if test "$ld_shlibs" = yes; then - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec='${wl}--export-dynamic' - case $host_os in - cygwin* | mingw* | pw32*) - # dlltool doesn't understand --whole-archive et. al. - whole_archive_flag_spec= - ;; - *) - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec= - fi - ;; - esac - fi +# AC_LIBTOOL_OBJDIR +# ----------------- +AC_DEFUN([AC_LIBTOOL_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - allow_undefined_flag=unsupported - always_export_symbols=yes - archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L=yes - if test "$GCC" = yes && test -z "$link_static_flag"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct=unsupported - fi - ;; - - aix4* | aix5*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) - for ld_flag in $LDFLAGS; do - case $ld_flag in - *-brtl*) - aix_use_runtimelinking=yes - break - ;; - esac - done - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - hardcode_direct=yes - archive_cmds='' - hardcode_libdir_separator=':' - if test "$GCC" = yes; then - case $host_os in aix4.[[012]]|aix4.[[012]].*) - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && \ - strings "$collect2name" | grep resolve_lib_name >/dev/null - then - # We have reworked collect2 - hardcode_direct=yes - else - # We have old collect2 - hardcode_direct=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L=yes - hardcode_libdir_flag_spec='-L$libdir' - hardcode_libdir_separator= - fi - esac - - shared_flag='-shared' - else - # not using gcc - if test "$host_cpu" = ia64; then - shared_flag='${wl}-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - # It seems that -bexpall can do strange things, so it is better to - # generate a list of symbols to export. - always_export_symbols=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag='-berok' - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib' - archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag="-z nodefs" - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname ${wl}-h$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" - else - hardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib' - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - allow_undefined_flag='${wl}-berok' - # This is a bit strange, but is similar to how AIX traditionally builds - # it's shared libraries. - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"' ~$AR -crlo $objdir/$libname$release.a $objdir/$soname' - fi - fi - ;; - - amigaos*) - archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - # see comment about different semantics on the GNU ld section - ld_shlibs=no - ;; - - cygwin* | mingw* | pw32*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_from_new_cmds='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' - fix_srcfile_path='`cygpath -w "$srcfile"`' - ;; - - darwin* | rhapsody*) - case "$host_os" in - rhapsody* | darwin1.[[012]]) - allow_undefined_flag='-undefined suppress' - ;; - *) # Darwin 1.3 on -# allow_undefined_flag='-undefined suppress' - ;; - esac - # FIXME: Relying on posixy $() will cause problems for - # cross-compilation, but unfortunately the echo tests do not - # yet detect zsh echo's removal of \ escapes. Also zsh mangles - # `"' quotes if we put them in here... so don't! - archive_cmds='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs && $CC $(test .$module = .yes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib ${lib}-master.o $deplibs$linker_flags $(test .$module != .yes && echo -install_name $rpath/$soname $verstring)' - # We need to add '_' to the symbols in $export_symbols first - #archive_expsym_cmds="$archive_cmds"' && strip -s $export_symbols' - hardcode_direct=yes - hardcode_shlibpath_var=no - whole_archive_flag_spec='-all_load $convenience' - ;; - - freebsd1*) - ld_shlibs=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd*) - archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - hpux9* | hpux10* | hpux11*) - case $host_os in - hpux9*) archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ;; - *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; - esac - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - hardcode_minus_L=yes # Not in the search PATH, but as the default - # location of the library. - export_dynamic_flag_spec='${wl}-E' - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - else - archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec='-rpath $libdir' - fi - hardcode_libdir_separator=: - link_all_deplibs=yes - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - newsos6) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_shlibpath_var=no - ;; - - openbsd*) - hardcode_direct=yes - hardcode_shlibpath_var=no - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - else - case "$host_os" in - openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-R$libdir' - ;; - *) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - ;; - esac - fi - ;; - - os2*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - allow_undefined_flag=unsupported - archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - fi - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='for i in `cat $export_symbols`; do printf "-exported_symbol " >> $lib.exp; echo "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ - $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' - - #Both c and cxx compiler support -rpath directly - hardcode_libdir_flag_spec='-rpath $libdir' - fi - hardcode_libdir_separator=: - ;; - - sco3.2v5*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - export_dynamic_flag_spec='${wl}-Bexport' - ;; - - solaris*) - # gcc --version < 3.0 without binutils cannot create self contained - # shared libraries reliably, requiring libgcc.a to resolve some of - # the object symbols generated in some cases. Libraries that use - # assert need libgcc.a to resolve __eprintf, for example. Linking - # a copy of libgcc.a into every shared library to guarantee resolving - # such symbols causes other problems: According to Tim Van Holder - # , C++ libraries end up with a separate - # (to the application) exception stack for one thing. - no_undefined_flag=' -z defs' - if test "$GCC" = yes; then - case `$CC --version 2>/dev/null` in - [[12]].*) - cat <&2 - -*** Warning: Releases of GCC earlier than version 3.0 cannot reliably -*** create self contained shared libraries on Solaris systems, without -*** introducing a dependency on libgcc.a. Therefore, libtool is disabling -*** -no-undefined support, which will at least allow you to build shared -*** libraries. However, you may find that when you link such libraries -*** into an application without using GCC, you have to manually add -*** \`gcc --print-libgcc-file-name\` to the link command. We urge you to -*** upgrade to a newer version of GCC. Another option is to rebuild your -*** current GCC to use the GNU linker from GNU binutils 2.9.1 or newer. - -EOF - no_undefined_flag= - ;; - esac - fi - # $CC -shared without GNU ld will not create a library from C++ - # object files and a static libstdc++, better avoid it by now - archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_shlibpath_var=no - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; - esac - link_all_deplibs=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - hardcode_libdir_flag_spec='-L$libdir' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - sysv4) - case $host_vendor in - sni) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' - reload_cmds='$CC -r -o $output$reload_objs' - hardcode_direct=no - ;; - motorola) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no - ;; - - sysv4.3*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - export_dynamic_flag_spec='-Bexport' - ;; - - sysv5*) - no_undefined_flag=' -z text' - # $CC -shared without GNU ld will not create a library from C++ - # object files and a static libstdc++, better avoid it by now - archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - hardcode_libdir_flag_spec= - hardcode_shlibpath_var=no - runpath_var='LD_RUN_PATH' - ;; - - uts4*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - dgux*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - sysv4*MP*) - if test -d /usr/nec; then - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ld_shlibs=yes - fi - ;; - - sysv4.2uw2*) - archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_minus_L=no - hardcode_shlibpath_var=no - hardcode_runpath_var=yes - runpath_var=LD_RUN_PATH - ;; - - sysv5uw7* | unixware7*) - no_undefined_flag='${wl}-z ${wl}text' - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no - ;; - - *) - ld_shlibs=no - ;; - esac + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs fi -AC_MSG_RESULT([$ld_shlibs]) -test "$ld_shlibs" = no && can_build_shared=no +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +])# AC_LIBTOOL_OBJDIR + +# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) +# ---------------------------------------------- # Check hardcoding attributes. -AC_MSG_CHECKING([how to hardcode library paths into programs]) -hardcode_action= -if test -n "$hardcode_libdir_flag_spec" || \ - test -n "$runpath_var"; then +AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_AC_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ + test -n "$_LT_AC_TAGVAR(runpath_var $1)" || \ + test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)"="Xyes" ; then # We can hardcode non-existant directories. - if test "$hardcode_direct" != no && + if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one - ## test "$hardcode_shlibpath_var" != no && - test "$hardcode_minus_L" != no; then + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. - hardcode_action=relink + _LT_AC_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action=immediate + _LT_AC_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. - hardcode_action=unsupported + _LT_AC_TAGVAR(hardcode_action, $1)=unsupported fi -AC_MSG_RESULT([$hardcode_action]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) -striplib= +if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH + + +# AC_LIBTOOL_SYS_LIB_STRIP +# ------------------------ +AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], +[striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then @@ -1913,17 +1050,33 @@ if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + AC_MSG_RESULT([yes]) + else AC_MSG_RESULT([no]) fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +])# AC_LIBTOOL_SYS_LIB_STRIP -reload_cmds='$LD$reload_flag -o $output$reload_objs' -test -z "$deplibs_check_method" && deplibs_check_method=unknown +# AC_LIBTOOL_SYS_DYNAMIC_LINKER +# ----------------------------- # PORTME Fill in your ld.so characteristics -AC_MSG_CHECKING([dynamic linker characteristics]) +AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], +[AC_MSG_CHECKING([dynamic linker characteristics]) library_names_spec= libname_spec='lib$name' soname_spec= +shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= @@ -1933,16 +1086,35 @@ shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" -sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown case $host_os in aix3*) version_type=linux - library_names_spec='${libname}${release}.so$versuffix $libname.a' + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH - # AIX has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}.so$major' + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) @@ -1952,7 +1124,7 @@ aix4* | aix5*) hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 - library_names_spec='${libname}${release}.so$major ${libname}${release}.so$versuffix $libname.so' + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file @@ -1962,43 +1134,41 @@ aix4* | aix5*) # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; esac - # AIX (on Power*) has no versioning support, so currently we can - # not hardcode correct soname into executable. Probably we can - # add versioning support to collect2, so additional links can - # be useful in future. + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}.so$major' + soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi - hardcode_into_libs=yes ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done' + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) - library_names_spec='${libname}.so' + library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; @@ -2006,13 +1176,12 @@ beos*) bsdi4*) version_type=linux need_version=no - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - export_dynamic_flag_spec=-rdynamic # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs @@ -2020,29 +1189,55 @@ bsdi4*) cygwin* | mingw* | pw32*) version_type=windows + shrext_cmds=".dll" need_version=no need_lib_prefix=no + case $GCC,$host_os in - yes,cygwin*) + yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll' - postinstall_cmds='dlpath=`bash 2>&1 -c '\''. $dir/${file}i;echo \$dlname'\''`~ + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ - $install_prog .libs/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`bash 2>&1 -c '\''. $file; echo \$dlname'\''`~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac ;; - yes,mingw*) - library_names_spec='${libname}`echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll' - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g" -e "s,=/,/,g"` - ;; - yes,pw32*) - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll' - ;; + *) - library_names_spec='${libname}`echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll $libname.lib' + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' @@ -2055,30 +1250,56 @@ darwin* | rhapsody*) version_type=darwin need_lib_prefix=no need_version=no - # FIXME: Relying on posixy $() will cause problems for - # cross-compilation, but unfortunately the echo tests do not - # yet detect zsh echo's removal of \ escapes. - library_names_spec='${libname}${release}${versuffix}.$(test .$module = .yes && echo so || echo dylib) ${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib) ${libname}.$(test .$module = .yes && echo so || echo dylib)' - soname_spec='${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib)' + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + freebsd*) objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` version_type=freebsd-$objformat case $version_type in freebsd-elf*) - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) - library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix' + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac @@ -2087,7 +1308,11 @@ freebsd*) freebsd2*) shlibpath_overrides_runpath=yes ;; - *) + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; @@ -2098,8 +1323,8 @@ gnu*) version_type=linux need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so' - soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; @@ -2107,14 +1332,45 @@ gnu*) hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. - dynamic_linker="$host_os dld.sl" version_type=sunos need_lib_prefix=no need_version=no - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl' - soname_spec='${libname}${release}.sl$major' + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; @@ -2122,21 +1378,29 @@ hpux9* | hpux10* | hpux11*) irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; - *) version_type=irix ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; esac need_lib_prefix=no need_version=no - soname_spec='${libname}${release}.so$major' - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so' + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;; + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; @@ -2145,20 +1409,21 @@ irix5* | irix6* | nonstopux*) shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. -linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*) +linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. -linux-gnu*) +linux*) version_type=linux need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no @@ -2167,6 +1432,12 @@ linux-gnu*) # before this can be enabled. hardcode_into_libs=yes + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, @@ -2176,17 +1447,29 @@ linux-gnu*) dynamic_linker='GNU/Linux ld.so' ;; +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so' - soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH @@ -2196,7 +1479,17 @@ netbsd*) newsos6) version_type=linux - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; @@ -2204,47 +1497,48 @@ newsos6) openbsd*) version_type=sunos need_lib_prefix=no - need_version=no + need_version=yes + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case "$host_os" in - openbsd2.[[89]] | openbsd2.[[89]].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac else shlibpath_overrides_runpath=yes fi - library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH ;; os2*) libname_spec='$name' + shrext_cmds=".dll" need_lib_prefix=no - library_names_spec='$libname.dll $libname.a' + library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf + need_lib_prefix=no need_version=no - soname_spec='${libname}${release}.so$major' - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - hardcode_into_libs=yes ;; sco3.2v5*) version_type=osf - soname_spec='${libname}${release}.so$major' - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH ;; @@ -2252,8 +1546,8 @@ solaris*) version_type=linux need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes @@ -2263,7 +1557,7 @@ solaris*) sunos4*) version_type=sunos - library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes @@ -2275,8 +1569,8 @@ sunos4*) sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) version_type=linux - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) @@ -2297,39 +1591,933 @@ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) esac ;; -uts4*) - version_type=linux - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -dgux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - sysv4*MP*) if test -d /usr/nec ;then version_type=linux - library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so' - soname_spec='$libname.so.$major' + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no +])# AC_LIBTOOL_SYS_DYNAMIC_LINKER -# Report the final consequences. + +# _LT_AC_TAGCONFIG +# ---------------- +AC_DEFUN([_LT_AC_TAGCONFIG], +[AC_ARG_WITH([tags], + [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], + [include additional configurations @<:@automatic@:>@])], + [tagnames="$withval"]) + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + AC_MSG_WARN([output file `$ofile' does not exist]) + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) + else + AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) + fi + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in + "") ;; + *) AC_MSG_ERROR([invalid tag name: $tagname]) + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + AC_MSG_ERROR([tag name \"$tagname\" already exists]) + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && test "X$CXX" != "Xno"; then + AC_LIBTOOL_LANG_CXX_CONFIG + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + AC_LIBTOOL_LANG_F77_CONFIG + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + AC_LIBTOOL_LANG_GCJ_CONFIG + else + tagname="" + fi + ;; + + RC) + AC_LIBTOOL_LANG_RC_CONFIG + ;; + + *) + AC_MSG_ERROR([Unsupported tag name: $tagname]) + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + AC_MSG_ERROR([unable to update list of available tagged configurations.]) + fi +fi +])# _LT_AC_TAGCONFIG + + +# AC_LIBTOOL_DLOPEN +# ----------------- +# enable checks for dlopen support +AC_DEFUN([AC_LIBTOOL_DLOPEN], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_DLOPEN + + +# AC_LIBTOOL_WIN32_DLL +# -------------------- +# declare package support for building win32 dll's +AC_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_WIN32_DLL + + +# AC_ENABLE_SHARED([DEFAULT]) +# --------------------------- +# implement the --enable-shared flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_SHARED], +[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([shared], + [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]AC_ENABLE_SHARED_DEFAULT) +])# AC_ENABLE_SHARED + + +# AC_DISABLE_SHARED +# ----------------- +#- set the default shared flag to --disable-shared +AC_DEFUN([AC_DISABLE_SHARED], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no) +])# AC_DISABLE_SHARED + + +# AC_ENABLE_STATIC([DEFAULT]) +# --------------------------- +# implement the --enable-static flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_STATIC], +[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([static], + [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]AC_ENABLE_STATIC_DEFAULT) +])# AC_ENABLE_STATIC + + +# AC_DISABLE_STATIC +# ----------------- +# set the default static flag to --disable-static +AC_DEFUN([AC_DISABLE_STATIC], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no) +])# AC_DISABLE_STATIC + + +# AC_ENABLE_FAST_INSTALL([DEFAULT]) +# --------------------------------- +# implement the --enable-fast-install flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_FAST_INSTALL], +[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([fast-install], + [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) +])# AC_ENABLE_FAST_INSTALL + + +# AC_DISABLE_FAST_INSTALL +# ----------------------- +# set the default to --disable-fast-install +AC_DEFUN([AC_DISABLE_FAST_INSTALL], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no) +])# AC_DISABLE_FAST_INSTALL + + +# AC_LIBTOOL_PICMODE([MODE]) +# -------------------------- +# implement the --with-pic flag +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +AC_DEFUN([AC_LIBTOOL_PICMODE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +pic_mode=ifelse($#,1,$1,default) +])# AC_LIBTOOL_PICMODE + + +# AC_PROG_EGREP +# ------------- +# This is predefined starting with Autoconf 2.54, so this conditional +# definition can be removed once we require Autoconf 2.54 or later. +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], +[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], + [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi]) + EGREP=$ac_cv_prog_egrep + AC_SUBST([EGREP]) +])]) + + +# AC_PATH_TOOL_PREFIX +# ------------------- +# find a file program which can recognise shared library +AC_DEFUN([AC_PATH_TOOL_PREFIX], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="ifelse([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +])# AC_PATH_TOOL_PREFIX + + +# AC_PATH_MAGIC +# ------------- +# find a file program which can recognise a shared library +AC_DEFUN([AC_PATH_MAGIC], +[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# AC_PATH_MAGIC + + +# AC_PROG_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([AC_PROG_LD], +[AC_ARG_WITH([gnu-ld], + [AC_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no]) +AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case "$host_cpu" in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux*) + case $host_cpu in + alpha*|hppa*|i*86|ia64*|m68*|mips*|powerpc*|sparc*|s390*|sh*) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; + esac + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx*) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object' + else + lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +sco3.2v5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown +])# AC_DEPLIBS_CHECK_METHOD + + +# AC_PROG_NM +# ---------- +# find the pathname to a BSD-compatible name lister +AC_DEFUN([AC_PROG_NM], +[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/${ac_tool_prefix}nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + esac + fi + done + IFS="$lt_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi]) +NM="$lt_cv_path_NM" +])# AC_PROG_NM + + +# AC_CHECK_LIBM +# ------------- +# check for math library +AC_DEFUN([AC_CHECK_LIBM], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +])# AC_CHECK_LIBM + + +# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl convenience library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL +# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +# DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will +# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and +# top_srcdir appropriately in the Makefiles. +AC_DEFUN([AC_LIBLTDL_CONVENIENCE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_CONVENIENCE + + +# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl installable library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-install to the configure arguments. Note that LIBLTDL +# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +# DIRECTORY is not provided and an installed libltdl is not found, it is +# assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/' +# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single +# quotes!). If your package is not flat and you're not using automake, +# define top_builddir and top_srcdir appropriately in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN([AC_LIBLTDL_INSTALLABLE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, lt_dlinit, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + LTDLINCL= + fi + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_INSTALLABLE + + +# AC_LIBTOOL_CXX +# -------------- +# enable support for C++ libraries +AC_DEFUN([AC_LIBTOOL_CXX], +[AC_REQUIRE([_LT_AC_LANG_CXX]) +])# AC_LIBTOOL_CXX + + +# _LT_AC_LANG_CXX +# --------------- +AC_DEFUN([_LT_AC_LANG_CXX], +[AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([AC_PROG_CXXCPP]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) +])# _LT_AC_LANG_CXX + + +# AC_LIBTOOL_F77 +# -------------- +# enable support for Fortran 77 libraries +AC_DEFUN([AC_LIBTOOL_F77], +[AC_REQUIRE([_LT_AC_LANG_F77]) +])# AC_LIBTOOL_F77 + + +# _LT_AC_LANG_F77 +# --------------- +AC_DEFUN([_LT_AC_LANG_F77], +[AC_REQUIRE([AC_PROG_F77]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) +])# _LT_AC_LANG_F77 + + +# AC_LIBTOOL_GCJ +# -------------- +# enable support for GCJ libraries +AC_DEFUN([AC_LIBTOOL_GCJ], +[AC_REQUIRE([_LT_AC_LANG_GCJ]) +])# AC_LIBTOOL_GCJ + + +# _LT_AC_LANG_GCJ +# --------------- +AC_DEFUN([_LT_AC_LANG_GCJ], +[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], + [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], + [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], + [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) +])# _LT_AC_LANG_GCJ + + +# AC_LIBTOOL_RC +# -------------- +# enable support for Windows resource files +AC_DEFUN([AC_LIBTOOL_RC], +[AC_REQUIRE([LT_AC_PROG_RC]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) +])# AC_LIBTOOL_RC + + +# AC_LIBTOOL_LANG_C_CONFIG +# ------------------------ +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) +AC_DEFUN([_LT_AC_LANG_C_CONFIG], +[lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}\n' + +_LT_AC_SYS_COMPILER + +# +# Check for any special shared library compilation flags. +# +_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)= +if test "$GCC" = no; then + case $host_os in + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf' + ;; + esac +fi +if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then + AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries]) + if echo "$old_CC $old_CFLAGS " | grep "[[ ]]$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[ ]]" >/dev/null; then : + else + AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure]) + _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no + fi +fi + + +# +# Check to make sure the static flag actually works. +# +AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), + $_LT_AC_TAGVAR(lt_prog_compiler_static, $1), + [], + [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) + + +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF($1) + +# Report which librarie types wil actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) @@ -2347,11 +2535,1160 @@ aix3*) fi ;; -aix4*) +aix4* | aix5*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; + darwin* | rhapsody*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; +esac +AC_MSG_RESULT([$enable_shared]) + +AC_MSG_CHECKING([whether to build static libraries]) +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +AC_MSG_RESULT([$enable_static]) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_C_CONFIG + + +# AC_LIBTOOL_LANG_CXX_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) +AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], +[AC_LANG_PUSH(C++) +AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([AC_PROG_CXXCPP]) + +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(allow_undefined_flag, $1)= +_LT_AC_TAGVAR(always_export_symbols, $1)=no +_LT_AC_TAGVAR(archive_expsym_cmds, $1)= +_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_direct, $1)=no +_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= +_LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(hardcode_automatic, $1)=no +_LT_AC_TAGVAR(module_cmds, $1)= +_LT_AC_TAGVAR(module_expsym_cmds, $1)= +_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_AC_TAGVAR(no_undefined_flag, $1)= +_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= +_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Dependencies to place before and after the object being linked: +_LT_AC_TAGVAR(predep_objects, $1)= +_LT_AC_TAGVAR(postdep_objects, $1)= +_LT_AC_TAGVAR(predeps, $1)= +_LT_AC_TAGVAR(postdeps, $1)= +_LT_AC_TAGVAR(compiler_lib_search_path, $1)= + +# Source file extension for C++ test sources. +ac_ext=cc + +# Object file extension for compiled C++ test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' +else + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + AC_PROG_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +_LT_AC_TAGVAR(ld_shlibs, $1)=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + dgux*) + case $cc_basename in + ec++) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + freebsd[12]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + freebsd-elf*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + ;; + gnu*) + ;; + hpux9*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + *) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC) + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case "$host_cpu" in + ia64*|hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + irix5* | irix6*) + case $cc_basename in + CC) + # SGI C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + linux*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc) + # Intel C++ + with_gnu_ld=yes + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + cxx) + # Compaq C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + m88k*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + mvs*) + case $cc_basename in + cxx) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + osf3*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ + $rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + sco*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + lcc) + # Lucid + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The C++ compiler is used as linker so we must use $wl + # flag to pass the commands to the underlying system + # linker. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[[LR]]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + fi + ;; + esac + ;; + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +esac +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_AC_TAGVAR(GCC, $1)="$GXX" +_LT_AC_TAGVAR(LD, $1)="$LD" + +AC_LIBTOOL_POSTDEP_PREDEP($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +])# AC_LIBTOOL_LANG_CXX_CONFIG + +# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) +# ------------------------ +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[ +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_cv_prog_cc_wl - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - save_allow_undefined_flag=$allow_undefined_flag - allow_undefined_flag= - if AC_TRY_EVAL(archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) - then - lt_cv_archive_cmds_need_lc=no - else - lt_cv_archive_cmds_need_lc=yes - fi - allow_undefined_flag=$save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi]) - AC_MSG_RESULT([$lt_cv_archive_cmds_need_lc]) - ;; - esac -fi -need_lc=${lt_cv_archive_cmds_need_lc-yes} +AC_LIBTOOL_CONFIG($1) -# The second clause should only fire when bootstrapping the +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_F77_CONFIG + + +# AC_LIBTOOL_LANG_GCJ_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG], [_LT_AC_LANG_GCJ_CONFIG(GCJ)]) +AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG], +[AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${GCJ-"gcj"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_RESTORE +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_GCJ_CONFIG + + +# AC_LIBTOOL_LANG_RC_CONFIG +# -------------------------- +# Ensure that the configuration vars for the Windows resource compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG], [_LT_AC_LANG_RC_CONFIG(RC)]) +AC_DEFUN([_LT_AC_LANG_RC_CONFIG], +[AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${RC-"windres"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_RESTORE +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_RC_CONFIG + + +# AC_LIBTOOL_CONFIG([TAGNAME]) +# ---------------------------- +# If TAGNAME is not passed, then create an initial libtool script +# with a default configuration from the untagged config vars. Otherwise +# add code to config.status for appending the configuration named by +# TAGNAME from the matching tagged config vars. +AC_DEFUN([AC_LIBTOOL_CONFIG], +[# The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then - : -else - # If there is no Makefile yet, we rely on a make rule to execute - # `config.status --recheck' to rerun these tests and create the - # libtool script then. - test -f Makefile && make "$ltmain" -fi - -if test -f "$ltmain"; then - trap "$rm \"${ofile}T\"; exit 1" 1 2 15 - $rm -f "${ofile}T" - - echo creating $ofile - + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. - for var in echo old_CC old_CFLAGS SED \ - AR AR_FLAGS CC LD LN_S NM SHELL \ - reload_flag reload_cmds wl \ - pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \ - thread_safe_flag_spec whole_archive_flag_spec libname_spec \ - library_names_spec soname_spec \ - RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \ - old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds \ - postuninstall_cmds extract_expsyms_cmds old_archive_from_expsyms_cmds \ - old_striplib striplib file_magic_cmd export_symbols_cmds \ - deplibs_check_method allow_undefined_flag no_undefined_flag \ - finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \ - global_symbol_to_c_name_address \ - hardcode_libdir_flag_spec hardcode_libdir_separator \ + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ - compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do + old_postinstall_cmds old_postuninstall_cmds \ + _LT_AC_TAGVAR(compiler, $1) \ + _LT_AC_TAGVAR(CC, $1) \ + _LT_AC_TAGVAR(LD, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_static, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) \ + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1) \ + _LT_AC_TAGVAR(thread_safe_flag_spec, $1) \ + _LT_AC_TAGVAR(whole_archive_flag_spec, $1) \ + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) \ + _LT_AC_TAGVAR(old_archive_cmds, $1) \ + _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) \ + _LT_AC_TAGVAR(predep_objects, $1) \ + _LT_AC_TAGVAR(postdep_objects, $1) \ + _LT_AC_TAGVAR(predeps, $1) \ + _LT_AC_TAGVAR(postdeps, $1) \ + _LT_AC_TAGVAR(compiler_lib_search_path, $1) \ + _LT_AC_TAGVAR(archive_cmds, $1) \ + _LT_AC_TAGVAR(archive_expsym_cmds, $1) \ + _LT_AC_TAGVAR(postinstall_cmds, $1) \ + _LT_AC_TAGVAR(postuninstall_cmds, $1) \ + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) \ + _LT_AC_TAGVAR(allow_undefined_flag, $1) \ + _LT_AC_TAGVAR(no_undefined_flag, $1) \ + _LT_AC_TAGVAR(export_symbols_cmds, $1) \ + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) \ + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) \ + _LT_AC_TAGVAR(hardcode_libdir_separator, $1) \ + _LT_AC_TAGVAR(hardcode_automatic, $1) \ + _LT_AC_TAGVAR(module_cmds, $1) \ + _LT_AC_TAGVAR(module_expsym_cmds, $1) \ + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) \ + _LT_AC_TAGVAR(exclude_expsyms, $1) \ + _LT_AC_TAGVAR(include_expsyms, $1); do case $var in - reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \ - old_postinstall_cmds | old_postuninstall_cmds | \ - export_symbols_cmds | archive_cmds | archive_expsym_cmds | \ - extract_expsyms_cmds | old_archive_from_expsyms_cmds | \ + _LT_AC_TAGVAR(old_archive_cmds, $1) | \ + _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) | \ + _LT_AC_TAGVAR(archive_cmds, $1) | \ + _LT_AC_TAGVAR(archive_expsym_cmds, $1) | \ + _LT_AC_TAGVAR(module_cmds, $1) | \ + _LT_AC_TAGVAR(module_expsym_cmds, $1) | \ + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) | \ + _LT_AC_TAGVAR(export_symbols_cmds, $1) | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ - finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; @@ -2474,14 +3895,31 @@ if test -f "$ltmain"; then esac done - cat <<__EOF__ > "${ofile}T" -#! $SHELL + case $lt_echo in + *'\[$]0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\[$]0 --fallback-echo"[$]/[$]0 --fallback-echo"/'` + ;; + esac -# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +ifelse([$1], [], + [cfgfile="${ofile}T" + trap "$rm \"$cfgfile\"; exit 1" 1 2 15 + $rm -f "$cfgfile" + AC_MSG_NOTICE([creating $ofile])], + [cfgfile="$ofile"]) + + cat <<__EOF__ >> "$cfgfile" +ifelse([$1], [], +[#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) # NOTE: Changes made to this file will be lost: look at ltmain.sh. # -# Copyright (C) 1996-2000 Free Software Foundation, Inc. +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: # Originally by Gordon Matzigkeit , 1996 # # This program is free software; you can redistribute it and/or modify @@ -2503,17 +3941,21 @@ if test -f "$ltmain"; then # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. -# A sed that does not truncate output. +# A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="${SED} -e s/^X//" +Xsed="$SED -e s/^X//" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi -# ### BEGIN LIBTOOL CONFIG +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG], +[# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: @@ -2527,7 +3969,10 @@ build_libtool_libs=$enable_shared build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$need_lc +build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) # Whether or not to optimize for fast installation. fast_install=$enable_fast_install @@ -2543,14 +3988,20 @@ echo=$lt_echo AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS -# The default C compiler. -CC=$lt_CC +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) # Is the compiler the GNU C compiler? -with_gcc=$GCC +with_gcc=$_LT_AC_TAGVAR(GCC, $1) + +# An ERE matcher. +EGREP=$lt_EGREP # The linker used to build libraries. -LD=$lt_LD +LD=$lt_[]_LT_AC_TAGVAR(LD, $1) # Whether we need hard or soft links. LN_S=$lt_LN_S @@ -2559,7 +4010,7 @@ LN_S=$lt_LN_S NM=$lt_NM # A symbol stripping program -STRIP=$STRIP +STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD @@ -2581,7 +4032,7 @@ reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. -wl=$lt_wl +wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) # Object file suffix (normally "o"). objext="$ac_objext" @@ -2589,18 +4040,21 @@ objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. -pic_flag=$lt_pic_flag +pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) pic_mode=$pic_mode -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_compiler_c_o +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len -# Can we write directly to a .lo ? -compiler_o_lo=$lt_compiler_o_lo +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) # Must we lock files when doing compilation ? need_locks=$lt_need_locks @@ -2621,19 +4075,19 @@ dlopen_self=$enable_dlopen_self dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. -link_static_flag=$lt_link_static_flag +link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) # Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_no_builtin_flag +no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) # Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec +export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) # Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec +whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) # Compiler flag to generate thread-safe objects. -thread_safe_flag_spec=$lt_thread_safe_flag_spec +thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) # Library versioning type. version_type=$version_type @@ -2650,26 +4104,50 @@ soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB -old_archive_cmds=$lt_old_archive_cmds +old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds +old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) # Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds +old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) # Commands used to build and install a shared archive. -archive_cmds=$lt_archive_cmds -archive_expsym_cmds=$lt_archive_expsym_cmds +archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) +archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) +module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) + # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) + # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method @@ -2677,10 +4155,10 @@ deplibs_check_method=$lt_deplibs_check_method file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag +allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) # Flag that forces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag +no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds @@ -2689,13 +4167,13 @@ finish_cmds=$lt_finish_cmds finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_global_symbol_pipe +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration -global_symbol_to_cdecl=$lt_global_symbol_to_cdecl +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair -global_symbol_to_c_name_address=$lt_global_symbol_to_c_name_address +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var @@ -2707,36 +4185,45 @@ shlibpath_var=$shlibpath_var shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action +hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec +hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) # Whether we need a single -rpath flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator +hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) -# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. -hardcode_direct=$hardcode_direct +hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. -hardcode_minus_L=$hardcode_minus_L +hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var +hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs +link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec @@ -2745,30 +4232,33 @@ sys_lib_search_path_spec=$lt_sys_lib_search_path_spec sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. -fix_srcfile_path="$fix_srcfile_path" +fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" # Set to yes if exported symbols are required. -always_export_symbols=$always_export_symbols +always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) # The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds +export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms +exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) # Symbols that must always be exported. -include_expsyms=$lt_include_expsyms +include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) -# ### END LIBTOOL CONFIG +ifelse([$1],[], +[# ### END LIBTOOL CONFIG], +[# ### END LIBTOOL TAG CONFIG: $tagname]) __EOF__ +ifelse([$1],[], [ case $host_os in aix3*) - cat <<\EOF >> "${ofile}T" + cat <<\EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems @@ -2781,11 +4271,1530 @@ EOF ;; esac + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +]) +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi +])# AC_LIBTOOL_CONFIG + + +# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl + +_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI + + +# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +# --------------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], +[AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_NM]) +AC_REQUIRE([AC_OBJEXT]) +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris* | sysv5*) + symcode='[[BDRT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[[]] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi +]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + + +# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) +# --------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], +[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_static, $1)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) + ifelse([$1],[CXX],[ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix4* | aix5*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux*) + case $cc_basename in + KCC) + # KAI C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + icpc) + # Intel C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + cxx) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC) + # Rational C++ 2.4.1 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx) + # Digital/Compaq C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + sco*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + *) + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc) + # Lucid + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + unixware*) + ;; + vxworks*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + newsos6) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + ccc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn' + ;; + + solaris*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sunos4*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + uts4*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then + AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), + [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" + ;; +esac +]) + + +# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) +# ------------------------------------ +# See if the linker supports building shared libraries. +AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], +[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +ifelse([$1],[CXX],[ + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in - cygwin* | mingw* | pw32* | os2*) - cat <<'EOF' >> "${ofile}T" - # This is a source program that is used to create dlls on Windows - # Don't remove nor modify the starting and closing comments + aix4* | aix5*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +],[ + runpath_var= + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)= + _LT_AC_TAGVAR(archive_expsym_cmds, $1)= + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown + _LT_AC_TAGVAR(hardcode_automatic, $1)=no + _LT_AC_TAGVAR(module_cmds, $1)= + _LT_AC_TAGVAR(module_expsym_cmds, $1)= + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_AC_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sunos4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_cmds, $1)="$tmp_archive_cmds" + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [01].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="$tmp_archive_cmds" + fi + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + # see comment about different semantics on the GNU ld section + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + bsdi4*) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes ; then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + dgux*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + *) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + openbsd*) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + sco3.2v5*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4.2uw2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text' + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv5*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_AC_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) + then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac + fi + ;; +esac +])# AC_LIBTOOL_PROG_LD_SHLIBS + + +# _LT_AC_FILE_LTDLL_C +# ------------------- +# Be careful that the start marker always follows a newline. +AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ # /* ltdll.c starts here */ # #define WIN32_LEAN_AND_MEAN # #include @@ -2819,748 +5828,13 @@ EOF # return TRUE; # } # /* ltdll.c ends here */ - # This is a source program that is used to create import libraries - # on Windows for dlls which lack them. Don't remove nor modify the - # starting and closing comments -# /* impgen.c starts here */ -# /* Copyright (C) 1999-2000 Free Software Foundation, Inc. -# -# This file is part of GNU libtool. -# -# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# */ -# -# #include /* for printf() */ -# #include /* for open(), lseek(), read() */ -# #include /* for O_RDONLY, O_BINARY */ -# #include /* for strdup() */ -# -# /* O_BINARY isn't required (or even defined sometimes) under Unix */ -# #ifndef O_BINARY -# #define O_BINARY 0 -# #endif -# -# static unsigned int -# pe_get16 (fd, offset) -# int fd; -# int offset; -# { -# unsigned char b[2]; -# lseek (fd, offset, SEEK_SET); -# read (fd, b, 2); -# return b[0] + (b[1]<<8); -# } -# -# static unsigned int -# pe_get32 (fd, offset) -# int fd; -# int offset; -# { -# unsigned char b[4]; -# lseek (fd, offset, SEEK_SET); -# read (fd, b, 4); -# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); -# } -# -# static unsigned int -# pe_as32 (ptr) -# void *ptr; -# { -# unsigned char *b = ptr; -# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); -# } -# -# int -# main (argc, argv) -# int argc; -# char *argv[]; -# { -# int dll; -# unsigned long pe_header_offset, opthdr_ofs, num_entries, i; -# unsigned long export_rva, export_size, nsections, secptr, expptr; -# unsigned long name_rvas, nexp; -# unsigned char *expdata, *erva; -# char *filename, *dll_name; -# -# filename = argv[1]; -# -# dll = open(filename, O_RDONLY|O_BINARY); -# if (dll < 1) -# return 1; -# -# dll_name = filename; -# -# for (i=0; filename[i]; i++) -# if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':') -# dll_name = filename + i +1; -# -# pe_header_offset = pe_get32 (dll, 0x3c); -# opthdr_ofs = pe_header_offset + 4 + 20; -# num_entries = pe_get32 (dll, opthdr_ofs + 92); -# -# if (num_entries < 1) /* no exports */ -# return 1; -# -# export_rva = pe_get32 (dll, opthdr_ofs + 96); -# export_size = pe_get32 (dll, opthdr_ofs + 100); -# nsections = pe_get16 (dll, pe_header_offset + 4 +2); -# secptr = (pe_header_offset + 4 + 20 + -# pe_get16 (dll, pe_header_offset + 4 + 16)); -# -# expptr = 0; -# for (i = 0; i < nsections; i++) -# { -# char sname[8]; -# unsigned long secptr1 = secptr + 40 * i; -# unsigned long vaddr = pe_get32 (dll, secptr1 + 12); -# unsigned long vsize = pe_get32 (dll, secptr1 + 16); -# unsigned long fptr = pe_get32 (dll, secptr1 + 20); -# lseek(dll, secptr1, SEEK_SET); -# read(dll, sname, 8); -# if (vaddr <= export_rva && vaddr+vsize > export_rva) -# { -# expptr = fptr + (export_rva - vaddr); -# if (export_rva + export_size > vaddr + vsize) -# export_size = vsize - (export_rva - vaddr); -# break; -# } -# } -# -# expdata = (unsigned char*)malloc(export_size); -# lseek (dll, expptr, SEEK_SET); -# read (dll, expdata, export_size); -# erva = expdata - export_rva; -# -# nexp = pe_as32 (expdata+24); -# name_rvas = pe_as32 (expdata+32); -# -# printf ("EXPORTS\n"); -# for (i = 0; i> "${ofile}T" || (rm -f "${ofile}T"; exit 1) - - mv -f "${ofile}T" "$ofile" || \ - (rm -f "$ofile" && cp "${ofile}T" "$ofile" && rm -f "${ofile}T") - chmod +x "$ofile" -fi - -])# _LT_AC_LTCONFIG_HACK - -# AC_LIBTOOL_DLOPEN - enable checks for dlopen support -AC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])]) - -# AC_LIBTOOL_WIN32_DLL - declare package support for building win32 dll's -AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])]) - -# AC_ENABLE_SHARED - implement the --enable-shared flag -# Usage: AC_ENABLE_SHARED[(DEFAULT)] -# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to -# `yes'. -AC_DEFUN([AC_ENABLE_SHARED], -[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE(shared, -changequote(<<, >>)dnl -<< --enable-shared[=PKGS] build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT], -changequote([, ])dnl -[p=${PACKAGE-default} -case $enableval in -yes) enable_shared=yes ;; -no) enable_shared=no ;; -*) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac], -enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl -]) - -# AC_DISABLE_SHARED - set the default shared flag to --disable-shared -AC_DEFUN([AC_DISABLE_SHARED], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -AC_ENABLE_SHARED(no)]) - -# AC_ENABLE_STATIC - implement the --enable-static flag -# Usage: AC_ENABLE_STATIC[(DEFAULT)] -# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to -# `yes'. -AC_DEFUN([AC_ENABLE_STATIC], -[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE(static, -changequote(<<, >>)dnl -<< --enable-static[=PKGS] build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT], -changequote([, ])dnl -[p=${PACKAGE-default} -case $enableval in -yes) enable_static=yes ;; -no) enable_static=no ;; -*) - enable_static=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac], -enable_static=AC_ENABLE_STATIC_DEFAULT)dnl -]) - -# AC_DISABLE_STATIC - set the default static flag to --disable-static -AC_DEFUN([AC_DISABLE_STATIC], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -AC_ENABLE_STATIC(no)]) +])# _LT_AC_FILE_LTDLL_C -# AC_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag -# Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)] -# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to -# `yes'. -AC_DEFUN([AC_ENABLE_FAST_INSTALL], -[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE(fast-install, -changequote(<<, >>)dnl -<< --enable-fast-install[=PKGS] optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT], -changequote([, ])dnl -[p=${PACKAGE-default} -case $enableval in -yes) enable_fast_install=yes ;; -no) enable_fast_install=no ;; -*) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac], -enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl -]) +# _LT_AC_TAGVAR(VARNAME, [TAGNAME]) +# --------------------------------- +AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) -# AC_DISABLE_FAST_INSTALL - set the default to --disable-fast-install -AC_DEFUN([AC_DISABLE_FAST_INSTALL], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -AC_ENABLE_FAST_INSTALL(no)]) - -# AC_LIBTOOL_PICMODE - implement the --with-pic flag -# Usage: AC_LIBTOOL_PICMODE[(MODE)] -# Where MODE is either `yes' or `no'. If omitted, it defaults to -# `both'. -AC_DEFUN([AC_LIBTOOL_PICMODE], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -pic_mode=ifelse($#,1,$1,default)]) - - -# AC_PATH_TOOL_PREFIX - find a file program which can recognise shared library -AC_DEFUN([AC_PATH_TOOL_PREFIX], -[AC_MSG_CHECKING([for $1]) -AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, -[case $MAGIC_CMD in - /*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; - ?:/*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path. - ;; - *) - ac_save_MAGIC_CMD="$MAGIC_CMD" - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" -dnl $ac_dummy forces splitting on constant user-supplied paths. -dnl POSIX.2 word splitting is done only on the output of word expansions, -dnl not every word. This closes a longstanding sh security hole. - ac_dummy="ifelse([$2], , $PATH, [$2])" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$1; then - lt_cv_path_MAGIC_CMD="$ac_dir/$1" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - egrep "$file_magic_regex" > /dev/null; then - : - else - cat <&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -EOF - fi ;; - esac - fi - break - fi - done - IFS="$ac_save_ifs" - MAGIC_CMD="$ac_save_MAGIC_CMD" - ;; -esac]) -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - AC_MSG_RESULT($MAGIC_CMD) -else - AC_MSG_RESULT(no) -fi -]) - - -# AC_PATH_MAGIC - find a file program which can recognise a shared library -AC_DEFUN([AC_PATH_MAGIC], -[AC_REQUIRE([AC_CHECK_TOOL_PREFIX])dnl -AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin:$PATH) -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - AC_PATH_TOOL_PREFIX(file, /usr/bin:$PATH) - else - MAGIC_CMD=: - fi -fi -]) - - -# AC_PROG_LD - find the path to the GNU or non-GNU linker -AC_DEFUN([AC_PROG_LD], -[AC_ARG_WITH(gnu-ld, -[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], -test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -AC_REQUIRE([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR])dnl -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - AC_MSG_CHECKING([for ld used by GCC]) - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [[\\/]]* | [[A-Za-z]]:[[\\/]]*) - re_direlt='/[[^/]][[^/]]*/\.\./' - # Canonicalize the path of ld - ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` - while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do - ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - AC_MSG_CHECKING([for GNU ld]) -else - AC_MSG_CHECKING([for non-GNU ld]) -fi -AC_CACHE_VAL(lt_cv_path_LD, -[if test -z "$LD"; then - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some GNU ld's only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - if "$lt_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then - test "$with_gnu_ld" != no && break - else - test "$with_gnu_ld" != yes && break - fi - fi - done - IFS="$ac_save_ifs" -else - lt_cv_path_LD="$LD" # Let the user override the test with a path. -fi]) -LD="$lt_cv_path_LD" -if test -n "$LD"; then - AC_MSG_RESULT($LD) -else - AC_MSG_RESULT(no) -fi -test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) -AC_PROG_LD_GNU -]) - -# AC_PROG_LD_GNU - -AC_DEFUN([AC_PROG_LD_GNU], -[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld, -[# I'd rather use --version here, but apparently some GNU ld's only accept -v. -if $LD -v 2>&1 &5; then - lt_cv_prog_gnu_ld=yes -else - lt_cv_prog_gnu_ld=no -fi]) -with_gnu_ld=$lt_cv_prog_gnu_ld -]) - -# AC_PROG_LD_RELOAD_FLAG - find reload flag for linker -# -- PORTME Some linkers may need a different reload flag. -AC_DEFUN([AC_PROG_LD_RELOAD_FLAG], -[AC_CACHE_CHECK([for $LD option to reload object files], lt_cv_ld_reload_flag, -[lt_cv_ld_reload_flag='-r']) -reload_flag=$lt_cv_ld_reload_flag -test -n "$reload_flag" && reload_flag=" $reload_flag" -]) - -# AC_DEPLIBS_CHECK_METHOD - how to check for library dependencies -# -- PORTME fill in with the dynamic library characteristics -AC_DEFUN([AC_DEPLIBS_CHECK_METHOD], -[AC_CACHE_CHECK([how to recognise dependent libraries], -lt_cv_deplibs_check_method, -[lt_cv_file_magic_cmd='$MAGIC_CMD' -lt_cv_file_magic_test_file= -lt_cv_deplibs_check_method='unknown' -# Need to set the preceding variable on all platforms that support -# interlibrary dependencies. -# 'none' -- dependencies not supported. -# `unknown' -- same as none, but documents that we really don't know. -# 'pass_all' -- all dependencies passed with no checks. -# 'test_compile' -- check by making test program. -# 'file_magic [[regex]]' -- check by looking for files in library path -# which responds to the $file_magic_cmd with a given egrep regex. -# If you have `file' or equivalent on your system and you're not sure -# whether `pass_all' will *always* work, you probably want this one. - -case $host_os in -aix4* | aix5*) - lt_cv_deplibs_check_method=pass_all - ;; - -beos*) - lt_cv_deplibs_check_method=pass_all - ;; - -bsdi4*) - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' - lt_cv_file_magic_cmd='/usr/bin/file -L' - lt_cv_file_magic_test_file=/shlib/libc.so - ;; - -cygwin* | mingw* | pw32*) - lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - ;; - -darwin* | rhapsody*) - lt_cv_deplibs_check_method='file_magic Mach-O dynamically linked shared library' - lt_cv_file_magic_cmd='/usr/bin/file -L' - case "$host_os" in - rhapsody* | darwin1.[[012]]) - lt_cv_file_magic_test_file=`echo /System/Library/Frameworks/System.framework/Versions/*/System | head -1` - ;; - *) # Darwin 1.3 on - lt_cv_file_magic_test_file='/usr/lib/libSystem.dylib' - ;; - esac - ;; - -freebsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then - case $host_cpu in - i*86 ) - # Not sure whether the presence of OpenBSD here was a mistake. - # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - ;; - esac - else - lt_cv_deplibs_check_method=pass_all - fi - ;; - -gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - -hpux10.20*|hpux11*) - lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=/usr/lib/libc.sl - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - irix5* | nonstopux*) - # this will be overridden with pass_all, but let us keep it just in case - lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" - ;; - *) - case $LD in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - # this will be overridden with pass_all, but let us keep it just in case - lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[[1234]] dynamic lib MIPS - version 1" - ;; - esac - lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*` - lt_cv_deplibs_check_method=pass_all - ;; - -# This must be Linux ELF. -linux-gnu*) - case $host_cpu in - alpha* | hppa* | i*86 | mips | mipsel | powerpc* | sparc* | ia64*) - lt_cv_deplibs_check_method=pass_all ;; - *) - # glibc up to 2.1.1 does not perform some relocations on ARM - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; - esac - lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` - ;; - -netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[[^/\.]]+\.so\.[[0-9]]+\.[[0-9]]+$' - else - lt_cv_deplibs_check_method='match_pattern /lib[[^/\.]]+\.so$' - fi - ;; - -newos6*) - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=/usr/lib/libnls.so - ;; - -openbsd*) - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object' - else - lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' - fi - ;; - -osf3* | osf4* | osf5*) - # this will be overridden with pass_all, but let us keep it just in case - lt_cv_deplibs_check_method='file_magic COFF format alpha shared library' - lt_cv_file_magic_test_file=/shlib/libc.so - lt_cv_deplibs_check_method=pass_all - ;; - -sco3.2v5*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - lt_cv_file_magic_test_file=/lib/libc.so - ;; - -sysv5uw[[78]]* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - case $host_vendor in - motorola) - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - sequent) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' - ;; - sni) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" - lt_cv_file_magic_test_file=/lib/libc.so - ;; - siemens) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; -esac -]) -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -]) - - -# AC_PROG_NM - find the path to a BSD-compatible name lister -AC_DEFUN([AC_PROG_NM], -[AC_REQUIRE([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR])dnl -AC_MSG_CHECKING([for BSD-compatible nm]) -AC_CACHE_VAL(lt_cv_path_NM, -[if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM="$NM" -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do - test -z "$ac_dir" && ac_dir=. - tmp_nm=$ac_dir/${ac_tool_prefix}nm - if test -f $tmp_nm || test -f $tmp_nm$ac_exeext ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - if ($tmp_nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep '(/dev/null|Invalid file or object type)' >/dev/null; then - lt_cv_path_NM="$tmp_nm -B" - break - elif ($tmp_nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then - lt_cv_path_NM="$tmp_nm -p" - break - else - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - fi - fi - done - IFS="$ac_save_ifs" - test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm -fi]) -NM="$lt_cv_path_NM" -AC_MSG_RESULT([$NM]) -]) - -# AC_CHECK_LIBM - check for math library -AC_DEFUN([AC_CHECK_LIBM], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -LIBM= -case $host in -*-*-beos* | *-*-cygwin* | *-*-pw32*) - # These system don't have libm - ;; -*-ncr-sysv4.3*) - AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") - AC_CHECK_LIB(m, main, LIBM="$LIBM -lm") - ;; -*) - AC_CHECK_LIB(m, main, LIBM="-lm") - ;; -esac -]) - -# AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for -# the libltdl convenience library and LTDLINCL to the include flags for -# the libltdl header and adds --enable-ltdl-convenience to the -# configure arguments. Note that LIBLTDL and LTDLINCL are not -# AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If DIR is not -# provided, it is assumed to be `libltdl'. LIBLTDL will be prefixed -# with '${top_builddir}/' and LTDLINCL will be prefixed with -# '${top_srcdir}/' (note the single quotes!). If your package is not -# flat and you're not using automake, define top_builddir and -# top_srcdir appropriately in the Makefiles. -AC_DEFUN([AC_LIBLTDL_CONVENIENCE], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl - case $enable_ltdl_convenience in - no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; - "") enable_ltdl_convenience=yes - ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; - esac - LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la - LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) - # For backwards non-gettext consistent compatibility... - INCLTDL="$LTDLINCL" -]) - -# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for -# the libltdl installable library and LTDLINCL to the include flags for -# the libltdl header and adds --enable-ltdl-install to the configure -# arguments. Note that LIBLTDL and LTDLINCL are not AC_SUBSTed, nor is -# AC_CONFIG_SUBDIRS called. If DIR is not provided and an installed -# libltdl is not found, it is assumed to be `libltdl'. LIBLTDL will -# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed -# with '${top_srcdir}/' (note the single quotes!). If your package is -# not flat and you're not using automake, define top_builddir and -# top_srcdir appropriately in the Makefiles. -# In the future, this macro may have to be called after AC_PROG_LIBTOOL. -AC_DEFUN([AC_LIBLTDL_INSTALLABLE], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl - AC_CHECK_LIB(ltdl, main, - [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], - [if test x"$enable_ltdl_install" = xno; then - AC_MSG_WARN([libltdl not installed, but installation disabled]) - else - enable_ltdl_install=yes - fi - ]) - if test x"$enable_ltdl_install" = x"yes"; then - ac_configure_args="$ac_configure_args --enable-ltdl-install" - LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la - LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) - else - ac_configure_args="$ac_configure_args --enable-ltdl-install=no" - LIBLTDL="-lltdl" - LTDLINCL= - fi - # For backwards non-gettext consistent compatibility... - INCLTDL="$LTDLINCL" -]) # old names AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) @@ -3574,6 +5848,16 @@ AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) # This is just to silence aclocal about the macro not being used ifelse([AC_DISABLE_FAST_INSTALL]) +AC_DEFUN([LT_AC_PROG_GCJ], +[AC_CHECK_TOOL(GCJ, gcj, no) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS) +]) + +AC_DEFUN([LT_AC_PROG_RC], +[AC_CHECK_TOOL(RC, windres, no) +]) + # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # @@ -3587,79 +5871,52 @@ AC_DEFUN([LT_AC_PROG_SED], AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. -as_executable_p="test -f" as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do + for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then - _sed_list="$_sed_list $as_dir/$ac_prog$ac_exec_ext" + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done - - # Create a temporary directory, and hook for its removal unless debugging. -$debug || -{ - trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 - trap '{ (exit 1); exit 1; }' 1 2 13 15 -} - -# Create a (secure) tmp directory for tmp files. -: ${TMPDIR=/tmp} -{ - tmp=`(umask 077 && mktemp -d -q "$TMPDIR/sedXXXXXX") 2>/dev/null` && - test -n "$tmp" && test -d "$tmp" -} || -{ - tmp=$TMPDIR/sed$$-$RANDOM - (umask 077 && mkdir $tmp) -} || -{ - echo "$me: cannot create a temporary directory in $TMPDIR" >&2 - { (exit 1); exit 1; } -} - _max=0 - _count=0 - # Add /usr/xpg4/bin/sed as it is typically found on Solaris - # along with /bin/sed that truncates output. - for _sed in $_sed_list /usr/xpg4/bin/sed; do - test ! -f ${_sed} && break - cat /dev/null > "$tmp/sed.in" - _count=0 - echo ${ECHO_N-$ac_n} "0123456789${ECHO_C-$ac_c}" >"$tmp/sed.in" - # Check for GNU sed and select it if it is found. - if "${_sed}" --version 2>&1 < /dev/null | egrep '(GNU)' > /dev/null; then - lt_cv_path_SED=${_sed} - break +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && break + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed fi - while true; do - cat "$tmp/sed.in" "$tmp/sed.in" >"$tmp/sed.tmp" - mv "$tmp/sed.tmp" "$tmp/sed.in" - cp "$tmp/sed.in" "$tmp/sed.nl" - echo >>"$tmp/sed.nl" - ${_sed} -e 's/a$//' < "$tmp/sed.nl" >"$tmp/sed.out" || break - cmp -s "$tmp/sed.out" "$tmp/sed.nl" || break - # 40000 chars as input seems more than enough - test $_count -gt 10 && break - _count=`expr $_count + 1` - if test $_count -gt $_max; then - _max=$_count - lt_cv_path_SED=$_sed - fi - done done - rm -rf "$tmp" +done +SED=$lt_cv_path_SED ]) -if test "X$SED" != "X"; then - lt_cv_path_SED=$SED -else - SED=$lt_cv_path_SED -fi AC_MSG_RESULT([$SED]) ]) +m4_include([./ft-munmap.m4]) diff --git a/reactos/lib/freetype/builds/unix/config.guess b/reactos/lib/freetype/builds/unix/config.guess index 78f6b92cd30..51fab477097 100644 --- a/reactos/lib/freetype/builds/unix/config.guess +++ b/reactos/lib/freetype/builds/unix/config.guess @@ -3,7 +3,7 @@ # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003 Free Software Foundation, Inc. -timestamp='2003-01-10' +timestamp='2004-03-12' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -106,6 +106,7 @@ trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; @@ -196,12 +197,18 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit 0 ;; + amd64:OpenBSD:*:*) + echo x86_64-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; amiga:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; arc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; + cats:OpenBSD:*:*) + echo arm-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; hp300:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; @@ -220,6 +227,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in mvmeppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; + pegasos:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; pmax:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; @@ -235,73 +245,70 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:OpenBSD:*:*) echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} exit 0 ;; - *:MicroBSD:*:*) - echo ${UNAME_MACHINE}-unknown-microbsd${UNAME_RELEASE} + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit 0 ;; + macppc:MirBSD:*:*) + echo powerppc-unknown-mirbsd${UNAME_RELEASE} + exit 0 ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit 0 ;; alpha:OSF1:*:*) - if test $UNAME_RELEASE = "V4.0"; then + case $UNAME_RELEASE in + *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` - fi + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. - eval $set_cc_for_build - cat <$dummy.s - .data -\$Lformat: - .byte 37,100,45,37,120,10,0 # "%d-%x\n" - - .text - .globl main - .align 4 - .ent main -main: - .frame \$30,16,\$26,0 - ldgp \$29,0(\$27) - .prologue 1 - .long 0x47e03d80 # implver \$0 - lda \$2,-1 - .long 0x47e20c21 # amask \$2,\$1 - lda \$16,\$Lformat - mov \$0,\$17 - not \$1,\$18 - jsr \$26,printf - ldgp \$29,0(\$26) - mov 0,\$16 - jsr \$26,exit - .end main -EOF - $CC_FOR_BUILD -o $dummy $dummy.s 2>/dev/null - if test "$?" = 0 ; then - case `$dummy` in - 0-0) - UNAME_MACHINE="alpha" - ;; - 1-0) - UNAME_MACHINE="alphaev5" - ;; - 1-1) - UNAME_MACHINE="alphaev56" - ;; - 1-101) - UNAME_MACHINE="alphapca56" - ;; - 2-303) - UNAME_MACHINE="alphaev6" - ;; - 2-307) - UNAME_MACHINE="alphaev67" - ;; - 2-1307) - UNAME_MACHINE="alphaev68" - ;; - 3-1307) - UNAME_MACHINE="alphaev7" - ;; - esac - fi - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit 0 ;; + Alpha*:OpenVMS:*:*) + echo alpha-hp-vms exit 0 ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? @@ -324,6 +331,9 @@ EOF *:OS/390:*:*) echo i370-ibm-openedition exit 0 ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit 0 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit 0;; @@ -341,6 +351,9 @@ EOF NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit 0 ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit 0 ;; DRS?6000:UNIX_SV:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7 && exit 0 ;; @@ -413,6 +426,9 @@ EOF *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit 0 ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit 0 ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit 0 ;; @@ -748,7 +764,7 @@ EOF echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; *:UNICOS/mp:*:*) - echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` @@ -756,6 +772,11 @@ EOF FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit 0 ;; @@ -777,7 +798,10 @@ EOF #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` - echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} + # GNU/KFreeBSD systems have a "k" prefix to indicate we are using + # FreeBSD's kernel, but not the complete OS. + case ${LIBC} in gnu) kernel_only='k' ;; esac + echo ${UNAME_MACHINE}-unknown-${kernel_only}freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} exit 0 ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin @@ -788,8 +812,8 @@ EOF i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit 0 ;; - x86:Interix*:3*) - echo i586-pc-interix3 + x86:Interix*:[34]*) + echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' exit 0 ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks @@ -810,17 +834,28 @@ EOF echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; *:GNU:*:*) + # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit 0 ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit 0 ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit 0 ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit 0 ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; @@ -896,6 +931,9 @@ EOF s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit 0 ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; @@ -953,6 +991,9 @@ EOF LIBC=gnuaout #endif #endif + #ifdef __dietlibc__ + LIBC=dietlibc + #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 @@ -983,6 +1024,9 @@ EOF i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit 0 ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit 0 ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit 0 ;; @@ -1054,7 +1098,7 @@ EOF exit 0 ;; M68*:*:R3V[567]*:*) test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; - 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0) + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` @@ -1169,7 +1213,7 @@ EOF *:QNX:*:4*) echo i386-pc-qnx exit 0 ;; - NSR-[DGKLNPTVW]:NONSTOP_KERNEL:*:*) + NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit 0 ;; *:NonStop-UX:*:*) @@ -1210,6 +1254,12 @@ EOF *:ITS:*:*) echo pdp10-unknown-its exit 0 ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit 0 ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 diff --git a/reactos/lib/freetype/builds/unix/config.sub b/reactos/lib/freetype/builds/unix/config.sub index 04baf3d80d1..ba331039bb8 100644 --- a/reactos/lib/freetype/builds/unix/config.sub +++ b/reactos/lib/freetype/builds/unix/config.sub @@ -3,7 +3,7 @@ # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003 Free Software Foundation, Inc. -timestamp='2003-01-03' +timestamp='2004-03-12' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software @@ -118,7 +118,8 @@ esac # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in - nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ + kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; @@ -228,14 +229,15 @@ case $basic_machine in | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ - | clipper \ + | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ - | ip2k \ - | m32r | m68000 | m68k | m88k | mcore \ + | ip2k | iq2000 \ + | m32r | m32rle | m68000 | m68k | m88k | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ @@ -247,6 +249,7 @@ case $basic_machine in | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ @@ -257,11 +260,11 @@ case $basic_machine in | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ - | sh | sh[1234] | sh3e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ + | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ - | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ + | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv8 | sparcv9 | sparcv9b \ | strongarm \ - | tahoe | thumb | tic80 | tron \ + | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xscale | xstormy16 | xtensa \ @@ -296,7 +299,7 @@ case $basic_machine in | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* \ | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ @@ -304,8 +307,8 @@ case $basic_machine in | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ - | ip2k-* \ - | m32r-* \ + | ip2k-* | iq2000-* \ + | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ @@ -319,6 +322,7 @@ case $basic_machine in | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ @@ -329,11 +333,13 @@ case $basic_machine in | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ - | sh-* | sh[1234]-* | sh3e-* | sh[34]eb-* | shbe-* \ + | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ - | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ - | tahoe-* | thumb-* | tic30-* | tic4x-* | tic54x-* | tic80-* | tron-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ @@ -357,6 +363,9 @@ case $basic_machine in basic_machine=a29k-amd os=-udi ;; + abacus) + basic_machine=abacus-unknown + ;; adobe68k) basic_machine=m68010-adobe os=-scout @@ -371,6 +380,12 @@ case $basic_machine in basic_machine=a29k-none os=-bsd ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; amdahl) basic_machine=580-amdahl os=-sysv @@ -430,12 +445,20 @@ case $basic_machine in basic_machine=j90-cray os=-unicos ;; + cr16c) + basic_machine=cr16c-unknown + os=-elf + ;; crds | unos) basic_machine=m68k-crds ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; da30 | da30-*) basic_machine=m68k-da30 ;; @@ -735,6 +758,10 @@ case $basic_machine in basic_machine=or32-unknown os=-coff ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose @@ -766,18 +793,24 @@ case $basic_machine in pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; - pentiumii | pentium2) + pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; + pentium4) + basic_machine=i786-pc + ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; - pentiumii-* | pentium2-*) + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; pn) basic_machine=pn-gould ;; @@ -836,6 +869,10 @@ case $basic_machine in sb1el) basic_machine=mipsisa64sb1el-unknown ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; sequent) basic_machine=i386-sequent ;; @@ -843,6 +880,9 @@ case $basic_machine in basic_machine=sh-hitachi os=-hms ;; + sh64) + basic_machine=sh64-unknown + ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks @@ -917,14 +957,18 @@ case $basic_machine in basic_machine=t90-cray os=-unicos ;; - tic4x | c4x*) - basic_machine=tic4x-unknown - os=-coff - ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; tx39) basic_machine=mipstx39-unknown ;; @@ -938,6 +982,10 @@ case $basic_machine in tower | tower-32) basic_machine=m68k-ncr ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; udi29k) basic_machine=a29k-amd os=-udi @@ -1027,13 +1075,13 @@ case $basic_machine in we32k) basic_machine=we32k-att ;; - sh3 | sh4 | sh3eb | sh4eb | sh[1234]le | sh3ele) + sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sh64) basic_machine=sh64-unknown ;; - sparc | sparcv9 | sparcv9b) + sparc | sparcv8 | sparcv9 | sparcv9b) basic_machine=sparc-sun ;; cydra) @@ -1106,19 +1154,20 @@ case $os in | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ - | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ - | -powermax* | -dnix* | -microbsd*) + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) @@ -1142,6 +1191,9 @@ case $os in -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; @@ -1154,6 +1206,9 @@ case $os in -opened*) os=-openedition ;; + -os400*) + os=-os400 + ;; -wince*) os=-wince ;; @@ -1175,6 +1230,9 @@ case $os in -atheos*) os=-atheos ;; + -syllable*) + os=-syllable + ;; -386bsd) os=-bsd ;; @@ -1197,6 +1255,9 @@ case $os in -sinix*) os=-sysv4 ;; + -tpf*) + os=-tpf + ;; -triton*) os=-sysv3 ;; @@ -1227,6 +1288,12 @@ case $os in -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; -none) ;; *) @@ -1258,6 +1325,9 @@ case $basic_machine in arm*-semi) os=-aout ;; + c4x-* | tic4x-*) + os=-coff + ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 @@ -1436,9 +1506,15 @@ case $basic_machine in -mvs* | -opened*) vendor=ibm ;; + -os400*) + vendor=ibm + ;; -ptx*) vendor=sequent ;; + -tpf*) + vendor=ibm + ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; diff --git a/reactos/lib/freetype/builds/unix/configure b/reactos/lib/freetype/builds/unix/configure index cfcf8bdcf1d..35bd6d20d38 100644 --- a/reactos/lib/freetype/builds/unix/configure +++ b/reactos/lib/freetype/builds/unix/configure @@ -1,9 +1,9 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.54. +# Generated by GNU Autoconf 2.59a. # -# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 -# Free Software Foundation, Inc. +# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## @@ -20,15 +20,62 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi +DUALCASE=1; export DUALCASE # for MKS sh + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi # Support unset when possible. -if (FOO=FOO; unset FOO) >/dev/null 2>&1; then +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi +# Find who we are. Look in the path if we contain no path at all +# relative or not. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 + { (exit 1); exit 1; }; } +fi + # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' @@ -36,9 +83,12 @@ PS2='> ' PS4='+ ' # NLS nuisances. -for as_var in LANG LANGUAGE LC_ALL LC_COLLATE LC_CTYPE LC_NUMERIC LC_MESSAGES LC_TIME +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME do - if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var @@ -72,101 +122,277 @@ echo X/"$0" | s/.*/./; q'` -# PATH needs CR, and LINENO needs CR and PATH. -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conftest.sh - echo "exit 0" >>conftest.sh - chmod +x conftest.sh - if (PATH="/nonexistent;."; conftest.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conftest.sh +if test "x$CONFIG_SHELL" = x; then + if (eval ":") 2>/dev/null; then + as_have_required=yes +else + as_have_required=no fi + if test $as_have_required = yes && (eval ": +(func_return () { + (exit \$1) +} +func_success () { + func_return 0 +} +func_failure () { + func_return 1 +} +func_ret_success () { + return 0 +} +func_ret_failure () { + return 1 +} - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" || { - # Find who we are. Look in the path if we contain no path at all - # relative or not. - case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done +exitcode=0 +if func_success; then + : +else + exitcode=1 + echo func_failure succeeded. +fi - ;; - esac - # We did not find ourselves, most probably we were run as `sh COMMAND' - # in which case we are not to be found in the path. - if test "x$as_myself" = x; then - as_myself=$0 - fi - if test ! -f "$as_myself"; then - { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 - { (exit 1); exit 1; }; } - fi - case $CONFIG_SHELL in - '') +if func_failure; then + exitcode=1 + echo func_success failed. +fi + +if func_ret_success; then + : +else + exitcode=1 + echo func_ret_success failed. +fi + +if func_ret_failure; then + exitcode=1 + echo func_ret_failure succeeded. +fi + +test \$exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=\$LINENO + as_lineno_2=\$LINENO + as_lineno_3=\`(expr \$as_lineno_1 + 1) 2>/dev/null\` + test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && + test \"x\$as_lineno_3\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } +") 2> /dev/null; then + : +else + as_candidate_shells="$SHELL" as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for as_base in sh bash ksh sh5; do - case $as_dir in + case $as_dir in /*) - if ("$as_dir/$as_base" -c ' + for as_base in sh bash ksh sh5; do + as_candidate_shells="$as_candidate_shells $as_dir/$as_base" + done + esac +done + + + for as_shell in $as_candidate_shells; do + if { $as_shell 2> /dev/null <<\_ASEOF +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +DUALCASE=1; export DUALCASE # for MKS sh + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { $as_shell 2> /dev/null <<\_ASEOF +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +DUALCASE=1; export DUALCASE # for MKS sh + +: +(func_return () { + (exit $1) +} +func_success () { + func_return 0 +} +func_failure () { + func_return 1 +} +func_ret_success () { + return 0 +} +func_ret_failure () { + return 1 +} + +exitcode=0 +if func_success; then + : +else + exitcode=1 + echo func_failure succeeded. +fi + +if func_failure; then + exitcode=1 + echo func_success failed. +fi + +if func_ret_success; then + : +else + exitcode=1 + echo func_ret_success failed. +fi + +if func_ret_failure; then + exitcode=1 + echo func_ret_failure succeeded. +fi + +test $exitcode = 0) || { (exit 1); exit 1; } + +( as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then - $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } - $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } - CONFIG_SHELL=$as_dir/$as_base - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$0" ${1+"$@"} - fi;; - esac - done -done -;; - esac + test "x$as_lineno_3" = "x$as_lineno_2") || { (exit 1); exit 1; } + +_ASEOF +}; then + break +fi + +fi + + done + + if test "x$CONFIG_SHELL" != x; then + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + + if test $as_have_required = no; then + echo This script requires a shell more modern than all the + echo shells that I found on your system. Please install a + echo modern shell, or manually run the script under such a + echo shell if you do have one. + { (exit 1); exit 1; } +fi + + +fi + +fi + + + +(eval "func_return () { + (exit \$1) +} +func_success () { + func_return 0 +} +func_failure () { + func_return 1 +} +func_ret_success () { + return 0 +} +func_ret_failure () { + return 1 +} + +exitcode=0 +if func_success; then + : +else + exitcode=1 + echo func_failure succeeded. +fi + +if func_failure; then + exitcode=1 + echo func_success failed. +fi + +if func_ret_success; then + : +else + exitcode=1 + echo func_ret_success failed. +fi + +if func_ret_failure; then + exitcode=1 + echo func_ret_failure succeeded. +fi + +test \$exitcode = 0") || { + echo No shell found that supports shell functions. + echo Please tell autoconf@gnu.org about your system, + echo including any error possibly output before this + echo message +} + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line before each line; the second 'sed' does the real - # work. The second script uses 'N' to pair each line-number line - # with the numbered line, and appends trailing '-' during - # substitution so that $LINENO is not a special case at line end. + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) - sed '=' <$as_myself | + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | sed ' + s,[$]LINENO.*,&-, + t lineno + b + : lineno N - s,$,-, : loop - s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + s,[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\),\2\1\2, t loop - s,-$,, - s,^['$as_cr_digits']*\n,, + s,-\n.*,, ' >$as_me.lineno && chmod +x $as_me.lineno || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 @@ -215,16 +441,17 @@ rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else + test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. -as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. -as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS @@ -237,17 +464,6 @@ IFS=" $as_nl" $as_unset CDPATH -# Find the correct PATH separator. Usually this is `:', but -# DJGPP uses `;' like DOS. -if test "X${PATH_SEPARATOR+set}" != Xset; then - UNAME=${UNAME-`uname 2>/dev/null`} - case X$UNAME in - *-DOS) lt_cv_sys_path_separator=';' ;; - *) lt_cv_sys_path_separator=':' ;; - esac - PATH_SEPARATOR=$lt_cv_sys_path_separator -fi - # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} @@ -266,7 +482,7 @@ if test "X$1" = X--no-reexec; then elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : -elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then # Yippee, $echo works! : else @@ -278,7 +494,7 @@ if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat </dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && @@ -322,7 +539,7 @@ else break fi done - IFS="$save_ifs" + IFS="$lt_save_ifs" if test "X$echo" = Xecho; then # We didn't find a better echo, so look for alternatives. @@ -396,6 +613,11 @@ fi + +tagnames=${tagnames+${tagnames},}CXX + +tagnames=${tagnames+${tagnames},}F77 + # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. @@ -455,16 +677,15 @@ ac_includes_default="\ #endif #if HAVE_INTTYPES_H # include -#else -# if HAVE_STDINT_H -# include -# endif +#endif +#if HAVE_STDINT_H +# include #endif #if HAVE_UNISTD_H # include #endif" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS version_info ft_version build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP XX_CFLAGS XX_ANSIFLAGS RMF RMDIR INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA EGREP FTSYS_SRC LIBZ SYSTEM_ZLIB LN_S ECHO RANLIB ac_ct_RANLIB STRIP ac_ct_STRIP LIBTOOL LIBOBJS LTLIBOBJS' +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS version_info ft_version build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP XX_CFLAGS XX_ANSIFLAGS RMF RMDIR INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA GREP EGREP FTSYS_SRC LIBZ SYSTEM_ZLIB LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB STRIP ac_ct_STRIP CXX CXXFLAGS ac_ct_CXX CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL enable_shared hardcode_libdir_flag_spec wl LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. @@ -823,7 +1044,7 @@ done # Be sure to have absolute paths. for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ - localstatedir libdir includedir oldincludedir infodir mandir + localstatedir libdir includedir oldincludedir infodir mandir do eval ac_val=$`echo $ac_var` case $ac_val in @@ -863,10 +1084,10 @@ if test -z "$srcdir"; then # Try the directory containing this script, then its parent. ac_confdir=`(dirname "$0") 2>/dev/null || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$0" : 'X\(//\)[^/]' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } @@ -925,6 +1146,26 @@ ac_env_CPP_set=${CPP+set} ac_env_CPP_value=$CPP ac_cv_env_CPP_set=${CPP+set} ac_cv_env_CPP_value=$CPP +ac_env_CXX_set=${CXX+set} +ac_env_CXX_value=$CXX +ac_cv_env_CXX_set=${CXX+set} +ac_cv_env_CXX_value=$CXX +ac_env_CXXFLAGS_set=${CXXFLAGS+set} +ac_env_CXXFLAGS_value=$CXXFLAGS +ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} +ac_cv_env_CXXFLAGS_value=$CXXFLAGS +ac_env_CXXCPP_set=${CXXCPP+set} +ac_env_CXXCPP_value=$CXXCPP +ac_cv_env_CXXCPP_set=${CXXCPP+set} +ac_cv_env_CXXCPP_value=$CXXCPP +ac_env_F77_set=${F77+set} +ac_env_F77_value=$F77 +ac_cv_env_F77_set=${F77+set} +ac_cv_env_F77_value=$F77 +ac_env_FFLAGS_set=${FFLAGS+set} +ac_env_FFLAGS_value=$FFLAGS +ac_cv_env_FFLAGS_set=${FFLAGS+set} +ac_cv_env_FFLAGS_value=$FFLAGS # # Report the --help message. @@ -958,9 +1199,9 @@ _ACEOF cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] + [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] + [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify @@ -1000,18 +1241,24 @@ if test -n "$ac_init_help"; then Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --enable-shared=PKGS build shared libraries default=yes - --enable-static=PKGS build static libraries default=yes - --enable-fast-install=PKGS optimize for fast installation default=yes + --enable-shared[=PKGS] + build shared libraries [default=yes] + --enable-static[=PKGS] + build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --without-zlib use internal zlib instead of system-wide - --with-old-mac-fonts allow Mac resource-based fonts to be used - --with-gnu-ld assume the C compiler uses GNU ld default=no - --with-pic try to use only PIC/non-PIC objects default=use both + --without-zlib use internal zlib instead of system-wide + --with-old-mac-fonts allow Mac resource-based fonts to be used + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-pic try to use only PIC/non-PIC objects [default=use + both] + --with-tags[=TAGS] + include additional configurations [automatic] Some influential environment variables: CC C compiler command @@ -1021,6 +1268,11 @@ Some influential environment variables: CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CXXCPP C++ preprocessor + F77 Fortran 77 compiler command + FFLAGS Fortran 77 compiler flags Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. @@ -1058,12 +1310,45 @@ case $srcdir in ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac -# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be -# absolute. -ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` -ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` -ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` -ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac cd $ac_dir # Check for guested configure; otherwise get Cygnus style configure. @@ -1074,7 +1359,7 @@ ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` echo $SHELL $ac_srcdir/configure --help=recursive elif test -f $ac_srcdir/configure.ac || - test -f $ac_srcdir/configure.in; then + test -f $ac_srcdir/configure.in; then echo $ac_configure --help else @@ -1088,8 +1373,8 @@ test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF -Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 -Free Software Foundation, Inc. +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, +2003, 2004 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF @@ -1101,7 +1386,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was -generated by GNU Autoconf 2.54. Invocation command line was +generated by GNU Autoconf 2.59a. Invocation command line was $ $0 $@ @@ -1153,24 +1438,54 @@ _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= +ac_configure_args0= +ac_configure_args1= ac_sep= -for ac_arg +ac_must_keep_next=false +for ac_pass in 1 2 do - case $ac_arg in - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n ) continue ;; - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - continue ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) - ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" - # Get rid of the leading space. - ac_sep=" " + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$ac_configure_args1 '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + # Get rid of the leading space. + ac_sep=" " + ;; + esac + done done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there @@ -1194,12 +1509,12 @@ _ASBOX case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in *ac_space=\ *) sed -n \ - "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" ;; *) sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } @@ -1228,7 +1543,7 @@ _ASBOX for ac_var in $ac_subst_files do eval ac_val=$`echo $ac_var` - echo "$ac_var='"'"'$ac_val'"'"'" + echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo fi @@ -1247,8 +1562,8 @@ _ASBOX echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 - rm -f core core.* *.core && - rm -rf conftest* confdefs* conf$$* $ac_clean_files && + rm -f core *.core && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do @@ -1257,9 +1572,11 @@ done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h +rm -f -r conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo >confdefs.h +# NextStep 3.3 (patch 3) loses unless the first echo outputs at least 14 bytes. +ac_space=' ' +echo "$ac_space$ac_space$ac_space$ac_space$ac_space$ac_space$ac_space$ac_space$ac_space$ac_space$ac_space$ac_space$ac_space" >confdefs.h # Predefined preprocessor variables. @@ -1327,7 +1644,7 @@ fi # value. ac_cache_corrupted=false for ac_var in `(set) 2>&1 | - sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val="\$ac_cv_env_${ac_var}_value" @@ -1344,13 +1661,13 @@ echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then - { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} - { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} - ac_cache_corrupted=: + ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. @@ -1400,14 +1717,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu - ac_config_headers="$ac_config_headers ftconfig.h:ftconfig.in" +# Don't forget to update docs/VERSION.DLL! -version_info='9:4:3' +version_info='9:6:3' ft_version=`echo $version_info | tr : .` + +# checks for system type + ac_aux_dir= for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do if test -f $ac_dir/install-sh; then @@ -1516,6 +1836,9 @@ test -n "$target_alias" && NONENONEs,x,x, && program_prefix=${target_alias}- + +# checks for programs + ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -1595,7 +1918,19 @@ else echo "${ECHO_T}no" >&6 fi - CC=$ac_ct_CC + if test "x$ac_ct_CC" = x; then + CC="" + else + if test "$build" != "$host"; then + { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} + fi + CC=$ac_ct_CC + fi else CC="$ac_cv_prog_CC" fi @@ -1675,7 +2010,19 @@ else echo "${ECHO_T}no" >&6 fi - CC=$ac_ct_CC + if test "x$ac_ct_CC" = x; then + CC="" + else + if test "$build" != "$host"; then + { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} + fi + CC=$ac_ct_CC + fi else CC="$ac_cv_prog_CC" fi @@ -1819,14 +2166,28 @@ fi test -n "$ac_ct_CC" && break done - CC=$ac_ct_CC + if test "x$ac_ct_CC" = x; then + CC="" + else + if test "$build" != "$host"; then + { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} + fi + CC=$ac_ct_CC + fi fi fi -test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH" >&5 -echo "$as_me: error: no acceptable C compiler found in \$PATH" >&2;} +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. @@ -1850,8 +2211,11 @@ ac_compiler=`set X $ac_compile; echo $2` (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ int main () @@ -1862,12 +2226,12 @@ main () } _ACEOF ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.exe" +ac_clean_files="$ac_clean_files a.out a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. -echo "$as_me:$LINENO: checking for C compiler default output" >&5 -echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6 +echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 (eval $ac_link_default) 2>&5 @@ -1881,27 +2245,39 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 # Be careful to initialize this variable, since it used to be cached. # Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. ac_cv_exeext= -for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.*; do +# b.out is created by i960 compilers. +for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out +do test -f "$ac_file" || continue case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; - a.out ) # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - # FIXME: I believe we export ac_cv_exeext for Libtool --akim. - export ac_cv_exeext - break;; - * ) break;; + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) + ;; + conftest.$ac_ext ) + # This is the source file. + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool, + # but it would be cool to find out if it's true. Does anybody + # maintain Libtool? --akim. + export ac_cv_exeext + break;; + * ) + break;; esac done else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + { { echo "$as_me:$LINENO: error: C compiler cannot create executables -check \`config.log' for details." >&5 +See \`config.log' for more details." >&5 echo "$as_me: error: C compiler cannot create executables -check \`config.log' for details." >&2;} +See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi @@ -1928,9 +2304,11 @@ if test "$cross_compiling" != yes; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. -If you meant to cross compile, use \`--host'." >&5 +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C compiled programs. -If you meant to cross compile, use \`--host'." >&2;} +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi @@ -1938,7 +2316,7 @@ fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 -rm -f a.out a.exe conftest$ac_cv_exeext +rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. @@ -1963,14 +2341,16 @@ for ac_file in conftest.exe conftest conftest.*; do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - export ac_cv_exeext - break;; + export ac_cv_exeext + break;; * ) break;; esac done else - { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link" >&5 -echo "$as_me: error: cannot compute suffix of executables: cannot compile and link" >&2;} + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi @@ -1987,8 +2367,11 @@ if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ int main () @@ -2013,9 +2396,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 done else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 -{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile" >&5 -echo "$as_me: error: cannot compute suffix of object files: cannot compile" >&2;} +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi @@ -2031,8 +2417,11 @@ if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ int main () @@ -2047,11 +2436,21 @@ main () _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2060,10 +2459,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_compiler_gnu=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi @@ -2079,8 +2479,11 @@ if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ int main () @@ -2092,11 +2495,21 @@ main () _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2105,10 +2518,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_prog_cc_g=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 @@ -2135,8 +2549,11 @@ else ac_cv_prog_cc_stdc=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include #include #include @@ -2159,6 +2576,16 @@ static char *f (char * (*g) (char **, int), char **p, ...) va_end (v); return s; } + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; @@ -2176,20 +2603,30 @@ _ACEOF # Don't try gcc -ansi; that turns off useful extensions and # breaks some systems' header files. # AIX -qlanglvl=ansi -# Ultrix and OSF/1 -std1 +# Ultrix, OSF/1, Tru64 -std # HP-UX 10.20 and later -Ae # HP-UX older versions -Aa -D_HPUX_SOURCE # SVR4 -Xc -D__EXTENSIONS__ -for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +for ac_arg in "" -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2199,9 +2636,10 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 break else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.$ac_objext +rm -f conftest.err conftest.$ac_objext done rm -f conftest.$ac_ext conftest.$ac_objext CC=$ac_save_CC @@ -2229,19 +2667,28 @@ cat >conftest.$ac_ext <<_ACEOF _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then for ac_declaration in \ - ''\ - '#include ' \ + '' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ @@ -2249,10 +2696,13 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" -#include +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_declaration +#include int main () { @@ -2263,11 +2713,21 @@ exit (42); _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2276,13 +2736,17 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 : else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + continue fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_declaration int main () @@ -2294,11 +2758,21 @@ exit (42); _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2307,9 +2781,10 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 break else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then @@ -2320,9 +2795,10 @@ fi else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -2352,13 +2828,22 @@ for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" -#include - Syntax error +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 @@ -2370,6 +2855,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -2380,7 +2866,8 @@ if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Broken: fails on valid input. continue fi @@ -2389,8 +2876,11 @@ rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 @@ -2403,6 +2893,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -2414,7 +2905,8 @@ if test -z "$ac_cpp_err"; then continue else echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Passes both tests. ac_preproc_ok=: break @@ -2443,13 +2935,22 @@ for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" -#include - Syntax error +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 @@ -2461,6 +2962,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -2471,7 +2973,8 @@ if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Broken: fails on valid input. continue fi @@ -2480,8 +2983,11 @@ rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 @@ -2494,6 +3000,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -2505,7 +3012,8 @@ if test -z "$ac_cpp_err"; then continue else echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Passes both tests. ac_preproc_ok=: break @@ -2518,8 +3026,10 @@ rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else - { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check" >&5 -echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check" >&2;} + { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi @@ -2530,25 +3040,31 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu + +# get compiler flags right + if test "x$CC" = xgcc; then XX_CFLAGS="-Wall" XX_ANSIFLAGS="-pedantic -ansi" else case "$host" in - *-dec-osf*) - CFLAGS= - XX_CFLAGS="-std1 -g3" - XX_ANSIFLAGS= - ;; - *) - XX_CFLAGS= - XX_ANSIFLAGS= - ;; + *-dec-osf*) + CFLAGS= + XX_CFLAGS="-std1 -g3" + XX_ANSIFLAGS= + ;; + *) + XX_CFLAGS= + XX_ANSIFLAGS= + ;; esac fi + +# auxiliary programs + # Extract the first word of "rm", so it can be a program name with args. set dummy rm; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 @@ -2620,6 +3136,11 @@ echo "${ECHO_T}no" >&6 fi + +# Since this file will be finally moved to another directory we make +# the path of the install script absolute. This small code snippet has +# been taken from automake's `ylwrap' script. + # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: @@ -2631,6 +3152,7 @@ fi # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 @@ -2647,6 +3169,7 @@ do case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. @@ -2654,20 +3177,20 @@ case $as_dir/ in # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi + if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi done done ;; @@ -2698,27 +3221,213 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' case "$INSTALL" in - /*) - ;; - */*) - INSTALL="`pwd`/$INSTALL" ;; +/*) + ;; +*/*) + INSTALL="`pwd`/$INSTALL" ;; esac +# checks for header files + + + +echo "$as_me:$LINENO: checking for grep that handles long lines" >&5 +echo $ECHO_N "checking for grep that handles long lines... $ECHO_C" >&6 +if test "${oc_cv_path_GREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Extract the first word of "grep ggrep" to use in msg output +if test -z "$GREP"; then +set dummy grep ggrep; ac_prog_name=$2 +if test "${ac_cv_path_GREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -f -r $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. +: ${TMPDIR=/tmp} +{ + tmp=`(umask 077 && mktemp -d -q "$TMPDIR/GREPXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=$TMPDIR/GREP$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in $TMPDIR" >&2 + { (exit 1); exit 1; } +} +# Loop through the user's path and test for each of PROGNAME-LIST +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + test -f "$ac_path_GREP" || continue + if $as_executable_p "$ac_path_GREP"; then + # Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +if "$ac_path_GREP" --version 2>&1 < /dev/null | grep 'GNU' >/dev/null; then + ac_cv_path_GREP="$ac_path_GREP" + break 2 + +fi + + + ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >"$tmp/conftest.in" + while : + do + cat "$tmp/conftest.in" "$tmp/conftest.in" >"$tmp/conftest.tmp" + mv "$tmp/conftest.tmp" "$tmp/conftest.in" + cp "$tmp/conftest.in" "$tmp/conftest.nl" + echo 'GREP' >> "$tmp/conftest.nl" + "$ac_path_GREP" 'GREP$' < "$tmp/conftest.nl" >"$tmp/conftest.out" || break + diff "$tmp/conftest.out" "$tmp/conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done +fi + + done +done +done + +rm -rf "$tmp" + +fi + +GREP="$ac_cv_path_GREP" +if test -z "$GREP"; then + { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in \$PATH" >&5 +echo "$as_me: error: no acceptable $ac_prog_name could be found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +fi + +fi + + +fi +echo "$as_me:$LINENO: result: $oc_cv_path_GREP" >&5 +echo "${ECHO_T}$oc_cv_path_GREP" >&6 + GREP="$ac_cv_path_GREP" + echo "$as_me:$LINENO: checking for egrep" >&5 echo $ECHO_N "checking for egrep... $ECHO_C" >&6 -if test "${ac_cv_prog_egrep+set}" = set; then +if test "${ac_cv_path_EGREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - if echo a | (grep -E '(a|b)') >/dev/null 2>&1 - then ac_cv_prog_egrep='grep -E' - else ac_cv_prog_egrep='egrep' - fi + if echo a | ($GREP -E '(a|b)') >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + # Extract the first word of "egrep" to use in msg output +if test -z "$EGREP"; then +set dummy egrep; ac_prog_name=$2 +if test "${ac_cv_path_EGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -f -r $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. +: ${TMPDIR=/tmp} +{ + tmp=`(umask 077 && mktemp -d -q "$TMPDIR/EGREPXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=$TMPDIR/EGREP$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in $TMPDIR" >&2 + { (exit 1); exit 1; } +} +# Loop through the user's path and test for each of PROGNAME-LIST +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + test -f "$ac_path_EGREP" || continue + if $as_executable_p "$ac_path_EGREP"; then + # Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +if "$ac_path_EGREP" --version 2>&1 < /dev/null | grep 'GNU' >/dev/null; then + ac_cv_path_EGREP="$ac_path_EGREP" + break 2 + fi -echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 -echo "${ECHO_T}$ac_cv_prog_egrep" >&6 - EGREP=$ac_cv_prog_egrep + + + ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >"$tmp/conftest.in" + while : + do + cat "$tmp/conftest.in" "$tmp/conftest.in" >"$tmp/conftest.tmp" + mv "$tmp/conftest.tmp" "$tmp/conftest.in" + cp "$tmp/conftest.in" "$tmp/conftest.nl" + echo 'EGREP' >> "$tmp/conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "$tmp/conftest.nl" >"$tmp/conftest.out" || break + diff "$tmp/conftest.out" "$tmp/conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done +fi + + done +done +done + +rm -rf "$tmp" + +fi + +EGREP="$ac_cv_path_EGREP" +if test -z "$EGREP"; then + { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in \$PATH" >&5 +echo "$as_me: error: no acceptable $ac_prog_name could be found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +fi + +fi + + + fi +fi +echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +echo "${ECHO_T}$ac_cv_path_EGREP" >&6 + EGREP="$ac_cv_path_EGREP" echo "$as_me:$LINENO: checking for ANSI C header files" >&5 @@ -2727,44 +3436,63 @@ if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include #include #include #include +int +main () +{ + + ; + return 0; +} _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 - ac_cv_header_stdc=no +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_stdc=no fi -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include _ACEOF @@ -2781,8 +3509,11 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include _ACEOF @@ -2802,16 +3533,20 @@ if test $ac_cv_header_stdc = yes; then : else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else -# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif @@ -2822,7 +3557,7 @@ main () int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) + || toupper (i) != TOUPPER (i)) exit(2); exit (0); } @@ -2842,11 +3577,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ( exit $ac_status ) ac_cv_header_stdc=no fi -rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi @@ -2871,7 +3607,7 @@ fi for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h + inttypes.h stdint.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_header" >&5 @@ -2880,19 +3616,32 @@ if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2901,10 +3650,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + eval "$as_ac_Header=no" fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 @@ -2936,18 +3686,31 @@ else echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2956,10 +3719,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_compiler=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 @@ -2967,8 +3731,11 @@ echo "${ECHO_T}$ac_header_compiler" >&6 echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 @@ -2981,6 +3748,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -2991,7 +3759,8 @@ if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext @@ -2999,26 +3768,43 @@ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? -case $ac_header_compiler:$ac_header_preproc in - yes:no ) +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; - no:yes ) + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - eval "$as_ac_Header=$ac_header_preproc" + eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 @@ -3034,14 +3820,20 @@ fi done + +# checks for typedefs, structures, and compiler characteristics + echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6 if test "${ac_cv_c_const+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ int main () @@ -3099,11 +3891,21 @@ main () _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3112,10 +3914,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_cv_c_const=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_c_const=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 echo "${ECHO_T}$ac_cv_c_const" >&6 @@ -3133,8 +3936,11 @@ if test "${ac_cv_type_int+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default int main () @@ -3149,11 +3955,21 @@ if (sizeof (int)) _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3162,10 +3978,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_cv_type_int=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_type_int=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5 echo "${ECHO_T}$ac_cv_type_int" >&6 @@ -3176,20 +3993,23 @@ if test "${ac_cv_sizeof_int+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_int" = yes; then - # The cast to unsigned long works around a bug in the HP C Compiler + # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default int main () { -static int test_array [1 - 2 * !(((long) (sizeof (int))) >= 0)]; +static int test_array [1 - 2 * !(((long int) (sizeof (int))) >= 0)]; test_array [0] = 0 ; @@ -3198,11 +4018,21 @@ test_array [0] = 0 _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3211,13 +4041,16 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_lo=0 ac_mid=0 while :; do cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default int main () { -static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)]; +static int test_array [1 - 2 * !(((long int) (sizeof (int))) <= $ac_mid)]; test_array [0] = 0 ; @@ -3226,11 +4059,21 @@ test_array [0] = 0 _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3239,27 +4082,32 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default int main () { -static int test_array [1 - 2 * !(((long) (sizeof (int))) < 0)]; +static int test_array [1 - 2 * !(((long int) (sizeof (int))) < 0)]; test_array [0] = 0 ; @@ -3268,11 +4116,21 @@ test_array [0] = 0 _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3281,13 +4139,16 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_hi=-1 ac_mid=-1 while :; do cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default int main () { -static int test_array [1 - 2 * !(((long) (sizeof (int))) >= $ac_mid)]; +static int test_array [1 - 2 * !(((long int) (sizeof (int))) >= $ac_mid)]; test_array [0] = 0 ; @@ -3296,11 +4157,21 @@ test_array [0] = 0 _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3309,35 +4180,40 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_lo= ac_hi= fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default int main () { -static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)]; +static int test_array [1 - 2 * !(((long int) (sizeof (int))) <= $ac_mid)]; test_array [0] = 0 ; @@ -3346,11 +4222,21 @@ test_array [0] = 0 _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3359,29 +4245,30 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_lo=`expr '(' $ac_mid ')' + 1` fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_int=$ac_lo;; -'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77" >&5 -echo "$as_me: error: cannot compute sizeof (int), 77" >&2;} +'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77 +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute sizeof (int), 77 +See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } ;; esac -else - if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling" >&5 -echo "$as_me: error: cannot run test program while cross compiling" >&2;} - { (exit 1); exit 1; }; } else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default -long longval () { return (long) (sizeof (int)); } -unsigned long ulongval () { return (long) (sizeof (int)); } +long longval () { return (long int) (sizeof (int)); } +unsigned long ulongval () { return (long int) (sizeof (int)); } #include #include int @@ -3391,17 +4278,17 @@ main () FILE *f = fopen ("conftest.val", "w"); if (! f) exit (1); - if (((long) (sizeof (int))) < 0) + if (((long int) (sizeof (int))) < 0) { long i = longval (); - if (i != ((long) (sizeof (int)))) + if (i != ((long int) (sizeof (int)))) exit (1); fprintf (f, "%ld\n", i); } else { unsigned long i = ulongval (); - if (i != ((long) (sizeof (int)))) + if (i != ((long int) (sizeof (int)))) exit (1); fprintf (f, "%lu\n", i); } @@ -3426,14 +4313,16 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ( exit $ac_status ) -{ { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77" >&5 -echo "$as_me: error: cannot compute sizeof (int), 77" >&2;} +{ { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77 +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute sizeof (int), 77 +See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi -rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.val else @@ -3453,8 +4342,11 @@ if test "${ac_cv_type_long+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default int main () @@ -3469,11 +4361,21 @@ if (sizeof (long)) _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3482,10 +4384,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_cv_type_long=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_type_long=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5 echo "${ECHO_T}$ac_cv_type_long" >&6 @@ -3496,20 +4399,23 @@ if test "${ac_cv_sizeof_long+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_long" = yes; then - # The cast to unsigned long works around a bug in the HP C Compiler + # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default int main () { -static int test_array [1 - 2 * !(((long) (sizeof (long))) >= 0)]; +static int test_array [1 - 2 * !(((long int) (sizeof (long))) >= 0)]; test_array [0] = 0 ; @@ -3518,11 +4424,21 @@ test_array [0] = 0 _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3531,13 +4447,16 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_lo=0 ac_mid=0 while :; do cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default int main () { -static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)]; +static int test_array [1 - 2 * !(((long int) (sizeof (long))) <= $ac_mid)]; test_array [0] = 0 ; @@ -3546,11 +4465,21 @@ test_array [0] = 0 _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3559,27 +4488,32 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default int main () { -static int test_array [1 - 2 * !(((long) (sizeof (long))) < 0)]; +static int test_array [1 - 2 * !(((long int) (sizeof (long))) < 0)]; test_array [0] = 0 ; @@ -3588,11 +4522,21 @@ test_array [0] = 0 _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3601,13 +4545,16 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_hi=-1 ac_mid=-1 while :; do cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default int main () { -static int test_array [1 - 2 * !(((long) (sizeof (long))) >= $ac_mid)]; +static int test_array [1 - 2 * !(((long int) (sizeof (long))) >= $ac_mid)]; test_array [0] = 0 ; @@ -3616,11 +4563,21 @@ test_array [0] = 0 _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3629,35 +4586,40 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_lo= ac_hi= fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default int main () { -static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)]; +static int test_array [1 - 2 * !(((long int) (sizeof (long))) <= $ac_mid)]; test_array [0] = 0 ; @@ -3666,11 +4628,21 @@ test_array [0] = 0 _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3679,29 +4651,30 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_lo=`expr '(' $ac_mid ')' + 1` fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_long=$ac_lo;; -'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77" >&5 -echo "$as_me: error: cannot compute sizeof (long), 77" >&2;} +'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77 +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute sizeof (long), 77 +See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } ;; esac -else - if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling" >&5 -echo "$as_me: error: cannot run test program while cross compiling" >&2;} - { (exit 1); exit 1; }; } else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default -long longval () { return (long) (sizeof (long)); } -unsigned long ulongval () { return (long) (sizeof (long)); } +long longval () { return (long int) (sizeof (long)); } +unsigned long ulongval () { return (long int) (sizeof (long)); } #include #include int @@ -3711,17 +4684,17 @@ main () FILE *f = fopen ("conftest.val", "w"); if (! f) exit (1); - if (((long) (sizeof (long))) < 0) + if (((long int) (sizeof (long))) < 0) { long i = longval (); - if (i != ((long) (sizeof (long)))) + if (i != ((long int) (sizeof (long)))) exit (1); fprintf (f, "%ld\n", i); } else { unsigned long i = ulongval (); - if (i != ((long) (sizeof (long)))) + if (i != ((long int) (sizeof (long)))) exit (1); fprintf (f, "%lu\n", i); } @@ -3746,14 +4719,16 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ( exit $ac_status ) -{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77" >&5 -echo "$as_me: error: cannot compute sizeof (long), 77" >&2;} +{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77 +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute sizeof (long), 77 +See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi -rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.val else @@ -3769,6 +4744,10 @@ _ACEOF +# checks for library functions + +# Here we check whether we can use our mmap file component. + for ac_header in stdlib.h unistd.h @@ -3787,18 +4766,31 @@ else echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3807,10 +4799,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_compiler=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 @@ -3818,8 +4811,11 @@ echo "${ECHO_T}$ac_header_compiler" >&6 echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 @@ -3832,6 +4828,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -3842,7 +4839,8 @@ if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext @@ -3850,26 +4848,43 @@ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? -case $ac_header_compiler:$ac_header_preproc in - yes:no ) +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; - no:yes ) + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - eval "$as_ac_Header=$ac_header_preproc" + eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 @@ -3894,43 +4909,73 @@ if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + /* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. */ -#include + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" +{ #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); -char (*f) (); - -int -main () -{ /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else -f = $ac_func; +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} #endif +int +main () +{ +return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3939,10 +4984,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + eval "$as_ac_var=no" fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 @@ -3963,8 +5010,11 @@ else ac_cv_func_mmap_fixed_mapped=no else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default /* malloc might have been renamed as rpl_malloc. */ #undef malloc @@ -4067,9 +5117,9 @@ main () data2 = (char *) malloc (2 * pagesize); if (!data2) exit (1); - data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1); + data2 += (pagesize - ((long) data2 & (pagesize - 1))) & (pagesize - 1); if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_FIXED, fd, 0L)) + MAP_PRIVATE | MAP_FIXED, fd, 0L)) exit (1); for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data2 + i)) @@ -4107,11 +5157,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ( exit $ac_status ) ac_cv_func_mmap_fixed_mapped=no fi -rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi echo "$as_me:$LINENO: result: $ac_cv_func_mmap_fixed_mapped" >&5 @@ -4130,99 +5181,142 @@ if test "$ac_cv_func_mmap_fixed_mapped" != yes; then else FTSYS_SRC='$(BUILD_DIR)/ftsystem.c' - echo "$as_me:$LINENO: checking whether munmap must be declared" >&5 -echo $ECHO_N "checking whether munmap must be declared... $ECHO_C" >&6 -if test "${ft_cv_munmap_decl+set}" = set; then + echo "$as_me:$LINENO: checking whether munmap is declared" >&5 +echo $ECHO_N "checking whether munmap is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_munmap+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + #ifdef HAVE_UNISTD_H #include #endif #include + + + int main () { -char *(*pfn) = (char *(*))munmap +#ifndef munmap + char *p = (char *) munmap; +#endif + ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then - ft_cv_munmap_decl=no + ac_cv_have_decl_munmap=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 -ft_cv_munmap_decl=yes -fi -rm -f conftest.$ac_objext conftest.$ac_ext -fi +sed 's/^/| /' conftest.$ac_ext >&5 -echo "$as_me:$LINENO: result: $ft_cv_munmap_decl" >&5 -echo "${ECHO_T}$ft_cv_munmap_decl" >&6 -if test $ft_cv_munmap_decl = yes; then +ac_cv_have_decl_munmap=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_munmap" >&5 +echo "${ECHO_T}$ac_cv_have_decl_munmap" >&6 +if test $ac_cv_have_decl_munmap = yes; then -cat >>confdefs.h <<\_ACEOF -#define NEED_MUNMAP_DECL +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_MUNMAP 1 _ACEOF + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_MUNMAP 0 +_ACEOF + + fi + + + echo "$as_me:$LINENO: checking for munmap's first parameter type" >&5 echo $ECHO_N "checking for munmap's first parameter type... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + #include #include int munmap(void *, size_t); -int -main () -{ - ; - return 0; -} + + _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then echo "$as_me:$LINENO: result: void *" >&5 -echo "${ECHO_T}void *" >&6; +echo "${ECHO_T}void *" >&6 + cat >>confdefs.h <<\_ACEOF #define MUNMAP_USES_VOIDP _ACEOF else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + echo "$as_me:$LINENO: result: char *" >&5 echo "${ECHO_T}char *" >&6 fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi @@ -4238,43 +5332,73 @@ if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + /* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. */ -#include + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" +{ #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); -char (*f) (); - -int -main () -{ /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else -f = $ac_func; +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} #endif +int +main () +{ +return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -4283,10 +5407,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + eval "$as_ac_var=no" fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 @@ -4300,6 +5426,9 @@ done +# Check for system zlib + + # Check whether --with-zlib or --without-zlib was given. if test "${with_zlib+set}" = set; then withval="$with_zlib" @@ -4314,8 +5443,11 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -4334,11 +5466,21 @@ gzsetparams (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -4347,10 +5489,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_z_gzsetparams=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_lib_z_gzsetparams=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_z_gzsetparams" >&5 @@ -4369,18 +5513,31 @@ else echo "$as_me:$LINENO: checking zlib.h usability" >&5 echo $ECHO_N "checking zlib.h usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default #include _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -4389,10 +5546,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_compiler=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 @@ -4400,8 +5558,11 @@ echo "${ECHO_T}$ac_header_compiler" >&6 echo "$as_me:$LINENO: checking zlib.h presence" >&5 echo $ECHO_N "checking zlib.h presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 @@ -4414,6 +5575,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -4424,7 +5586,8 @@ if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext @@ -4432,19 +5595,36 @@ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? -case $ac_header_compiler:$ac_header_preproc in - yes:no ) +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) { echo "$as_me:$LINENO: WARNING: zlib.h: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: zlib.h: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: zlib.h: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: zlib.h: proceeding with the preprocessor's result" >&2;};; - no:yes ) + { echo "$as_me:$LINENO: WARNING: zlib.h: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: zlib.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) { echo "$as_me:$LINENO: WARNING: zlib.h: present but cannot be compiled" >&5 echo "$as_me: WARNING: zlib.h: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: zlib.h: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: zlib.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: zlib.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: zlib.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: zlib.h: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: zlib.h: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: zlib.h: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: zlib.h: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: zlib.h: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: zlib.h: proceeding with the preprocessor's result" >&2;};; +echo "$as_me: WARNING: zlib.h: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: zlib.h: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: zlib.h: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; esac echo "$as_me:$LINENO: checking for zlib.h" >&5 echo $ECHO_N "checking for zlib.h... $ECHO_C" >&6 @@ -4472,13 +5652,15 @@ if test x$with_zlib != xno && test -n "$LIBZ"; then fi +# Whether to use Mac OS resource-based fonts or not + + # Check whether --with-old-mac-fonts or --without-old-mac-fonts was given. if test "${with_old_mac_fonts+set}" = set; then withval="$with_old_mac_fonts" fi; if test x$with_old_mac_fonts = xyes; then - CFLAGS="$CFLAGS -DTARGET_API_MAC_CARBON" LDFLAGS="$LDFLAGS -Xlinker -framework -Xlinker CoreServices \ -Xlinker -framework -Xlinker ApplicationServices" else @@ -4490,83 +5672,137 @@ fi + + # Check whether --enable-shared or --disable-shared was given. if test "${enable_shared+set}" = set; then enableval="$enable_shared" p=${PACKAGE-default} -case $enableval in -yes) enable_shared=yes ;; -no) enable_shared=no ;; -*) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac else enable_shared=yes fi; + # Check whether --enable-static or --disable-static was given. if test "${enable_static+set}" = set; then enableval="$enable_static" p=${PACKAGE-default} -case $enableval in -yes) enable_static=yes ;; -no) enable_static=no ;; -*) - enable_static=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac else enable_static=yes fi; + # Check whether --enable-fast-install or --disable-fast-install was given. if test "${enable_fast_install+set}" = set; then enableval="$enable_fast_install" p=${PACKAGE-default} -case $enableval in -yes) enable_fast_install=yes ;; -no) enable_fast_install=no ;; -*) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac else enable_fast_install=yes fi; -# Find the correct PATH separator. Usually this is `:', but -# DJGPP uses `;' like DOS. -if test "X${PATH_SEPARATOR+set}" != Xset; then - UNAME=${UNAME-`uname 2>/dev/null`} - case X$UNAME in - *-DOS) lt_cv_sys_path_separator=';' ;; - *) lt_cv_sys_path_separator=':' ;; - esac - PATH_SEPARATOR=$lt_cv_sys_path_separator + +echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 +echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6 +if test "${lt_cv_path_SED+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && break + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +SED=$lt_cv_path_SED + fi +echo "$as_me:$LINENO: result: $SED" >&5 +echo "${ECHO_T}$SED" >&6 + # Check whether --with-gnu-ld or --without-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then @@ -4578,8 +5814,8 @@ fi; ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. - echo "$as_me:$LINENO: checking for ld used by GCC" >&5 -echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6 + echo "$as_me:$LINENO: checking for ld used by $CC" >&5 +echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw @@ -4589,12 +5825,12 @@ echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6 esac case $ac_prog in # Accept absolute paths. - [\\/]* | [A-Za-z]:[\\/]*) + [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the path of ld - ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do - ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; @@ -4618,22 +5854,26 @@ if test "${lt_cv_path_LD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$LD"; then - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do + IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. - if "$lt_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + case `"$lt_cv_path_LD" -v 2>&1 &6 else # I'd rather use --version here, but apparently some GNU ld's only accept -v. -if $LD -v 2>&1 &5; then +case `$LD -v 2>&1 &5 echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 @@ -4677,7 +5920,11 @@ fi echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6 reload_flag=$lt_cv_ld_reload_flag -test -n "$reload_flag" && reload_flag=" $reload_flag" +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6 @@ -4688,120 +5935,42 @@ else # Let the user override the test. lt_cv_path_NM="$NM" else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. - tmp_nm=$ac_dir/${ac_tool_prefix}nm - if test -f $tmp_nm || test -f $tmp_nm$ac_exeext ; then + tmp_nm="$ac_dir/${ac_tool_prefix}nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file - if ($tmp_nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep '(/dev/null|Invalid file or object type)' >/dev/null; then + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break - elif ($tmp_nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then - lt_cv_path_NM="$tmp_nm -p" - break - else - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - fi + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + esac fi done - IFS="$ac_save_ifs" + IFS="$lt_save_ifs" test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi fi - +echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 +echo "${ECHO_T}$lt_cv_path_NM" >&6 NM="$lt_cv_path_NM" -echo "$as_me:$LINENO: result: $NM" >&5 -echo "${ECHO_T}$NM" >&6 - -echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 -echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6 -if test "${lt_cv_path_SED+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Loop through the user's path and test for sed and gsed. -# Then use that list of sed's as ones to test for truncation. -as_executable_p="test -f" -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then - _sed_list="$_sed_list $as_dir/$ac_prog$ac_exec_ext" - fi - done - done -done - - # Create a temporary directory, and hook for its removal unless debugging. -$debug || -{ - trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 - trap '{ (exit 1); exit 1; }' 1 2 13 15 -} - -# Create a (secure) tmp directory for tmp files. -: ${TMPDIR=/tmp} -{ - tmp=`(umask 077 && mktemp -d -q "$TMPDIR/sedXXXXXX") 2>/dev/null` && - test -n "$tmp" && test -d "$tmp" -} || -{ - tmp=$TMPDIR/sed$$-$RANDOM - (umask 077 && mkdir $tmp) -} || -{ - echo "$me: cannot create a temporary directory in $TMPDIR" >&2 - { (exit 1); exit 1; } -} - _max=0 - _count=0 - # Add /usr/xpg4/bin/sed as it is typically found on Solaris - # along with /bin/sed that truncates output. - for _sed in $_sed_list /usr/xpg4/bin/sed; do - test ! -f ${_sed} && break - cat /dev/null > "$tmp/sed.in" - _count=0 - echo ${ECHO_N-$ac_n} "0123456789${ECHO_C-$ac_c}" >"$tmp/sed.in" - # Check for GNU sed and select it if it is found. - if "${_sed}" --version 2>&1 < /dev/null | egrep '(GNU)' > /dev/null; then - lt_cv_path_SED=${_sed} - break - fi - while true; do - cat "$tmp/sed.in" "$tmp/sed.in" >"$tmp/sed.tmp" - mv "$tmp/sed.tmp" "$tmp/sed.in" - cp "$tmp/sed.in" "$tmp/sed.nl" - echo >>"$tmp/sed.nl" - ${_sed} -e 's/a$//' < "$tmp/sed.nl" >"$tmp/sed.out" || break - cmp -s "$tmp/sed.out" "$tmp/sed.nl" || break - # 40000 chars as input seems more than enough - test $_count -gt 10 && break - _count=`expr $_count + 1` - if test $_count -gt $_max; then - _max=$_count - lt_cv_path_SED=$_sed - fi - done - done - rm -rf "$tmp" - -fi - -if test "X$SED" != "X"; then - lt_cv_path_SED=$SED -else - SED=$lt_cv_path_SED -fi -echo "$as_me:$LINENO: result: $SED" >&5 -echo "${ECHO_T}$SED" >&6 echo "$as_me:$LINENO: checking whether ln -s works" >&5 echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 @@ -4829,7 +5998,7 @@ lt_cv_deplibs_check_method='unknown' # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path -# which responds to the $file_magic_cmd with a given egrep regex. +# which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. @@ -4848,25 +6017,24 @@ bsdi4*) lt_cv_file_magic_test_file=/shlib/libc.so ;; -cygwin* | mingw* | pw32*) +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump'. lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) - lt_cv_deplibs_check_method='file_magic Mach-O dynamically linked shared library' - lt_cv_file_magic_cmd='/usr/bin/file -L' - case "$host_os" in - rhapsody* | darwin1.[012]) - lt_cv_file_magic_test_file=`echo /System/Library/Frameworks/System.framework/Versions/*/System | head -1` - ;; - *) # Darwin 1.3 on - lt_cv_file_magic_test_file='/usr/lib/libSystem.dylib' - ;; - esac + lt_cv_deplibs_check_method=pass_all ;; -freebsd*) +freebsd* | kfreebsd*-gnu) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then case $host_cpu in i*86 ) @@ -4886,50 +6054,53 @@ gnu*) lt_cv_deplibs_check_method=pass_all ;; -hpux10.20*|hpux11*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' +hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=/usr/lib/libc.sl + case "$host_cpu" in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac ;; irix5* | irix6* | nonstopux*) - case $host_os in - irix5* | nonstopux*) - # this will be overridden with pass_all, but let us keep it just in case - lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" - ;; - *) - case $LD in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - # this will be overridden with pass_all, but let us keep it just in case - lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[1234] dynamic lib MIPS - version 1" - ;; + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; esac - lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*` lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. -linux-gnu*) +linux*) case $host_cpu in - alpha* | hppa* | i*86 | mips | mipsel | powerpc* | sparc* | ia64*) + alpha*|hppa*|i*86|ia64*|m68*|mips*|powerpc*|sparc*|s390*|sh*) lt_cv_deplibs_check_method=pass_all ;; *) # glibc up to 2.1.1 does not perform some relocations on ARM + # this will be overridden with pass_all, but let us keep it just in case lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; esac lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else - lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so$' + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; @@ -4939,6 +6110,10 @@ newos6*) lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; +nto-qnx*) + lt_cv_deplibs_check_method=unknown + ;; + openbsd*) lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` @@ -4950,9 +6125,6 @@ openbsd*) ;; osf3* | osf4* | osf5*) - # this will be overridden with pass_all, but let us keep it just in case - lt_cv_deplibs_check_method='file_magic COFF format alpha shared library' - lt_cv_file_magic_test_file=/shlib/libc.so lt_cv_deplibs_check_method=pass_all ;; @@ -4961,11 +6133,6 @@ sco3.2v5*) ;; solaris*) - lt_cv_deplibs_check_method=pass_all - lt_cv_file_magic_test_file=/lib/libc.so - ;; - -sysv5uw[78]* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; @@ -4992,6 +6159,10 @@ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) ;; esac ;; + +sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; esac fi @@ -4999,16 +6170,1288 @@ echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6 file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Check whether --enable-libtool-lock or --disable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then + enableval="$enable_libtool_lock" + +fi; +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line 6215 "configure"' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case "`/usr/bin/file conftest.o`" in + *32-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 +echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6 +if test "${lt_cv_cc_needs_belf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + lt_cv_cc_needs_belf=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +lt_cv_cc_needs_belf=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 +echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6 + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; + +esac + +need_locks="$enable_libtool_lock" + + + +for ac_header in dlfcn.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + echo "$as_me:$LINENO: result: $CXX" >&5 +echo "${ECHO_T}$CXX" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 +echo "${ECHO_T}$ac_ct_CXX" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + if test "$build" != "$host"; then + { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} + fi + CXX=$ac_ct_CXX + fi +fi + + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C++ compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 +if test "${ac_cv_cxx_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 +GXX=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +CXXFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 +echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cxx_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cxx_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cxx_g=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +for ac_declaration in \ + '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +#include +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 +echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6 +if test -z "$CXXCPP"; then + if test "${ac_cv_prog_CXXCPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +echo "$as_me:$LINENO: result: $CXXCPP" >&5 +echo "${ECHO_T}$CXXCPP" >&6 +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$F77"; then + ac_cv_prog_F77="$F77" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_F77="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +F77=$ac_cv_prog_F77 +if test -n "$F77"; then + echo "$as_me:$LINENO: result: $F77" >&5 +echo "${ECHO_T}$F77" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$F77" && break + done +fi +if test -z "$F77"; then + ac_ct_F77=$F77 + for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_F77"; then + ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_F77="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_F77=$ac_cv_prog_ac_ct_F77 +if test -n "$ac_ct_F77"; then + echo "$as_me:$LINENO: result: $ac_ct_F77" >&5 +echo "${ECHO_T}$ac_ct_F77" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_F77" && break +done + + if test "x$ac_ct_F77" = x; then + F77="" + else + if test "$build" != "$host"; then + { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} + fi + F77=$ac_ct_F77 + fi +fi + + +# Provide some information about the compiler. +echo "$as_me:7228:" \ + "checking for Fortran 77 compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +rm -f a.out + +# If we don't use `.F' as extension, the preprocessor is not run on the +# input file. (Note that this only needs to work for GNU compilers.) +ac_save_ext=$ac_ext +ac_ext=F +echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6 +if test "${ac_cv_f77_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF + program main +#ifndef __GNUC__ + choke me +#endif + + end +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_f77_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_f77_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6 +ac_ext=$ac_save_ext +ac_test_FFLAGS=${FFLAGS+set} +ac_save_FFLAGS=$FFLAGS +FFLAGS= +echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5 +echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_f77_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + FFLAGS=-g +cat >conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_f77_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_f77_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_f77_g=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5 +echo "${ECHO_T}$ac_cv_prog_f77_g" >&6 +if test "$ac_test_FFLAGS" = set; then + FFLAGS=$ac_save_FFLAGS +elif test $ac_cv_prog_f77_g = yes; then + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-g -O2" + else + FFLAGS="-g" + fi +else + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-O2" + else + FFLAGS= + fi +fi + +G77=`test $ac_compiler_gnu = yes && echo yes` +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! + +# find the maximum length of command line arguments +echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 +echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6 +if test "${lt_cv_sys_max_cmd_len+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + *) + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while (test "X"`$CONFIG_SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + teststring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + ;; + esac + +fi + +if test -n $lt_cv_sys_max_cmd_len ; then + echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 +echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6 +else + echo "$as_me:$LINENO: result: none" >&5 +echo "${ECHO_T}none" >&6 +fi + # Check for command to grab the raw symbol name followed by C symbol from nm. -echo "$as_me:$LINENO: checking command to parse $NM output" >&5 -echo $ECHO_N "checking command to parse $NM output... $ECHO_C" >&6 +echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 +echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6 if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -5026,10 +7469,10 @@ sympat='\([_A-Za-z][_A-Za-z0-9]*\)' symxfrm='\1 \2\3 \3' # Transform an extracted symbol line into a proper C declaration -lt_cv_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'" +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" # Transform an extracted symbol line into symbol name and symbol address -lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" # Define system-specific variables. case $host_os in @@ -5040,8 +7483,11 @@ cygwin* | mingw* | pw32*) symcode='[ABCDGISTW]' ;; hpux*) # Its linker distinguishes data from code symbols - lt_cv_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" - lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ;; irix* | nonstopux*) symcode='[BCDEGRST]' @@ -5050,7 +7496,7 @@ osf*) symcode='[BCDEGQRST]' ;; solaris* | sysv5*) - symcode='[BDT]' + symcode='[BDRT]' ;; sysv4) symcode='[DFNSTU]' @@ -5059,25 +7505,27 @@ esac # Handle CRLF in mingw tool chain opt_cr= -case $host_os in +case $build_os in mingw*) opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # If we're using GNU nm, then use its standard symbol codes. -if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then - symcode='[ABCDGISTW]' -fi +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac # Try without a prefix undercore, then with it. for ac_symprfx in "" "_"; do # Write the raw and C identifiers. -lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" # Check to see that the pipe works correctly. pipe_works=no + rm -f conftest* cat > conftest.$ac_ext </dev/null; then - if egrep ' nm_test_func$' "$nlist" >/dev/null; then + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then cat < conftest.$ac_ext #ifdef __cplusplus extern "C" { @@ -5120,27 +7568,27 @@ extern "C" { EOF # Now generate the symbol file. - eval "$lt_cv_global_symbol_to_cdecl"' < "$nlist" >> conftest.$ac_ext' + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' cat <> conftest.$ac_ext #if defined (__STDC__) && __STDC__ -# define lt_ptr void * +# define lt_ptr_t void * #else -# define lt_ptr char * +# define lt_ptr_t char * # define const #endif /* The mapping between symbol names and symbols. */ const struct { const char *name; - lt_ptr address; + lt_ptr_t address; } lt_preloaded_symbols[] = { EOF - sed "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr) \&\2},/" < "$nlist" >> conftest.$ac_ext + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext cat <<\EOF >> conftest.$ac_ext - {0, (lt_ptr) 0} + {0, (lt_ptr_t) 0} }; #ifdef __cplusplus @@ -5149,19 +7597,19 @@ EOF EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext - save_LIBS="$LIBS" - save_CFLAGS="$CFLAGS" + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" - CFLAGS="$CFLAGS$no_builtin_flag" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest$ac_exeext; then + (exit $ac_status); } && test -s conftest${ac_exeext}; then pipe_works=yes fi - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" else echo "cannot find nm_test_func in $nlist" >&5 fi @@ -5187,16 +7635,10 @@ done fi -global_symbol_pipe="$lt_cv_sys_global_symbol_pipe" if test -z "$lt_cv_sys_global_symbol_pipe"; then - global_symbol_to_cdecl= - global_symbol_to_c_name_address= -else - global_symbol_to_cdecl="$lt_cv_global_symbol_to_cdecl" - global_symbol_to_c_name_address="$lt_cv_global_symbol_to_c_name_address" + lt_cv_sys_global_symbol_to_cdecl= fi -if test -z "$global_symbol_pipe$global_symbol_to_cdec$global_symbol_to_c_name_address"; -then +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then echo "$as_me:$LINENO: result: failed" >&5 echo "${ECHO_T}failed" >&6 else @@ -5204,264 +7646,161 @@ else echo "${ECHO_T}ok" >&6 fi - -for ac_header in dlfcn.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +echo "$as_me:$LINENO: checking for objdir" >&5 +echo $ECHO_N "checking for objdir... $ECHO_C" >&6 +if test "${lt_cv_objdir+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs else - echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 -ac_header_compiler=no + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs fi -rm -f conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 +rmdir .libs 2>/dev/null +fi +echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 +echo "${ECHO_T}$lt_cv_objdir" >&6 +objdir=$lt_cv_objdir -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - else - ac_cpp_err= + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc in - yes:no ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; - no:yes ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_AR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - eval "$as_ac_Header=$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done done - - - - - -# Only perform the check for file, if the check method requires it -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 -echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6 -if test "${lt_cv_path_MAGIC_CMD+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - case $MAGIC_CMD in - /*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; - ?:/*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path. - ;; - *) - ac_save_MAGIC_CMD="$MAGIC_CMD" - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="/usr/bin:$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/${ac_tool_prefix}file; then - lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - egrep "$file_magic_regex" > /dev/null; then - : - else - cat <&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -EOF - fi ;; - esac - fi - break - fi - done - IFS="$ac_save_ifs" - MAGIC_CMD="$ac_save_MAGIC_CMD" - ;; -esac fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 -echo "${ECHO_T}$MAGIC_CMD" >&6 +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + echo "$as_me:$LINENO: result: $AR" >&5 +echo "${ECHO_T}$AR" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - echo "$as_me:$LINENO: checking for file" >&5 -echo $ECHO_N "checking for file... $ECHO_C" >&6 -if test "${lt_cv_path_MAGIC_CMD+set}" = set; then +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_AR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - case $MAGIC_CMD in - /*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; - ?:/*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path. - ;; - *) - ac_save_MAGIC_CMD="$MAGIC_CMD" - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="/usr/bin:$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/file; then - lt_cv_path_MAGIC_CMD="$ac_dir/file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - egrep "$file_magic_regex" > /dev/null; then - : - else - cat <&2 + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="ar" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -EOF - fi ;; - esac - fi - break - fi - done - IFS="$ac_save_ifs" - MAGIC_CMD="$ac_save_MAGIC_CMD" - ;; -esac fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 -echo "${ECHO_T}$MAGIC_CMD" >&6 +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 +echo "${ECHO_T}$ac_ct_AR" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi + if test "x$ac_ct_AR" = x; then + AR="false" else - MAGIC_CMD=: + if test "$build" != "$host"; then + { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} + fi + AR=$ac_ct_AR fi +else + AR="$ac_cv_prog_AR" fi - fi - ;; -esac - if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 @@ -5525,7 +7864,6 @@ do done done - test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB @@ -5537,7 +7875,19 @@ else echo "${ECHO_T}no" >&6 fi - RANLIB=$ac_ct_RANLIB + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + if test "$build" != "$host"; then + { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} + fi + RANLIB=$ac_ct_RANLIB + fi else RANLIB="$ac_cv_prog_RANLIB" fi @@ -5605,7 +7955,6 @@ do done done - test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP @@ -5617,141 +7966,24 @@ else echo "${ECHO_T}no" >&6 fi - STRIP=$ac_ct_STRIP + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + if test "$build" != "$host"; then + { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} + fi + STRIP=$ac_ct_STRIP + fi else STRIP="$ac_cv_prog_STRIP" fi -enable_dlopen=no -enable_win32_dll=no - -# Check whether --enable-libtool-lock or --disable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then - enableval="$enable_libtool_lock" - -fi; -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -*-*-irix6*) - # Find out which ABI we are using. - echo '#line 5641 "configure"' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 -echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6 -if test "${lt_cv_cc_needs_belf+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - - - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - lt_cv_cc_needs_belf=yes -else - echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 -lt_cv_cc_needs_belf=no -fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -fi -echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 -echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6 - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; - - -esac - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -Xsed='sed -e s/^X//' -sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Constants: -rm="rm -f" - -# Global variables: -default_ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except M$VC, -# which needs '.lib'). -libext=a -ltmain="$ac_aux_dir/ltmain.sh" -ofile="$default_ofile" -with_gnu_ld="$lt_cv_prog_gnu_ld" -need_locks="$enable_libtool_lock" - old_CC="$CC" old_CFLAGS="$CFLAGS" @@ -5760,40 +7992,18 @@ test -z "$AR" && AR=ar test -z "$AR_FLAGS" && AR_FLAGS=cru test -z "$AS" && AS=as test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$LD" && LD=ld test -z "$LN_S" && LN_S="ln -s" test -z "$MAGIC_CMD" && MAGIC_CMD=file test -z "$NM" && NM=nm +test -z "$SED" && SED=sed test -z "$OBJDUMP" && OBJDUMP=objdump test -z "$RANLIB" && RANLIB=: test -z "$STRIP" && STRIP=: test -z "$ac_objext" && ac_objext=o -if test x"$host" != x"$build"; then - ac_tool_prefix=${host_alias}- -else - ac_tool_prefix= -fi - -# Transform linux* to *-*-linux-gnu*, to support old configure scripts. -case $host_os in -linux-gnu*) ;; -linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` -esac - -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' old_postinstall_cmds='chmod 644 $oldlib' @@ -5811,24 +8021,150 @@ if test -n "$RANLIB"; then old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi -# Allow CC to be a program name with arguments. -set dummy $CC -compiler="$2" - -echo "$as_me:$LINENO: checking for objdir" >&5 -echo $ECHO_N "checking for objdir... $ECHO_C" >&6 -rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - objdir=.libs +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 +echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6 +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 else - # MS-DOS does not allow filenames that begin with a dot. - objdir=_libs -fi -rmdir .libs 2>/dev/null -echo "$as_me:$LINENO: result: $objdir" >&5 -echo "${ECHO_T}$objdir" >&6 + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +echo "${ECHO_T}$MAGIC_CMD" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + echo "$as_me:$LINENO: checking for file" >&5 +echo $ECHO_N "checking for file... $ECHO_C" >&6 +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +echo "${ECHO_T}$MAGIC_CMD" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +enable_dlopen=no +enable_win32_dll=no + +# Check whether --enable-libtool-lock or --disable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then + enableval="$enable_libtool_lock" + +fi; +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Check whether --with-pic or --without-pic was given. @@ -5840,410 +8176,445 @@ else fi; test -z "$pic_mode" && pic_mode=default -# We assume here that the value for lt_cv_prog_cc_pic will not be cached -# in isolation, and that seeing it set (from the cache) indicates that -# the associated values are set (in the cache) correctly too. -echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 -if test "${lt_cv_prog_cc_pic+set}" = set; then +# Use C for the default configuration in the libtool script +tagname= +lt_save_CC="$CC" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}\n' + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# +# Check for any special shared library compilation flags. +# +lt_prog_cc_shlib= +if test "$GCC" = no; then + case $host_os in + sco3.2v5*) + lt_prog_cc_shlib='-belf' + ;; + esac +fi +if test -n "$lt_prog_cc_shlib"; then + { echo "$as_me:$LINENO: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&5 +echo "$as_me: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&2;} + if echo "$old_CC $old_CFLAGS " | grep "[ ]$lt_prog_cc_shlib[ ]" >/dev/null; then : + else + { echo "$as_me:$LINENO: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5 +echo "$as_me: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;} + lt_cv_prog_cc_can_build_shared=no + fi +fi + + +# +# Check to make sure the static flag actually works. +# +echo "$as_me:$LINENO: checking if $compiler static flag $lt_prog_compiler_static works" >&5 +echo $ECHO_N "checking if $compiler static flag $lt_prog_compiler_static works... $ECHO_C" >&6 +if test "${lt_prog_compiler_static_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - lt_cv_prog_cc_pic= - lt_cv_prog_cc_shlib= - lt_cv_prog_cc_wl= - lt_cv_prog_cc_static= - lt_cv_prog_cc_no_builtin= - lt_cv_prog_cc_can_build_shared=$can_build_shared + lt_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_prog_compiler_static" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + else + lt_prog_compiler_static_works=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" + +fi +echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 +echo "${ECHO_T}$lt_prog_compiler_static_works" >&6 + +if test x"$lt_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + + + +lt_prog_compiler_no_builtin_flag= + +if test "$GCC" = yes; then + lt_prog_compiler_no_builtin_flag=' -fno-builtin' + + +echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 +if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:8295: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:8299: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + +lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + +echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 if test "$GCC" = yes; then - lt_cv_prog_cc_wl='-Wl,' - lt_cv_prog_cc_static='-static' + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' case $host_os in - aix*) - # Below there is a dirty hack to force normal static linking with -ldl - # The problem is because libdl dynamically linked with both libc and - # libC (AIX C++ library), which obviously doesn't included in libraries - # list by gcc. This cause undefined symbols with -static flags. - # This hack allows C programs to be linked with "-static -ldl", but - # not sure about C++ programs. - lt_cv_prog_cc_static="$lt_cv_prog_cc_static ${lt_cv_prog_cc_wl}-lC" + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi ;; + amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. - lt_cv_prog_cc_pic='-m68020 -resident32 -malways-restore-a4' + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files - lt_cv_prog_cc_pic='-fno-common' + lt_prog_compiler_pic='-fno-common' ;; - cygwin* | mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_cv_prog_cc_pic='-DDLL_EXPORT' + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no ;; + sysv4*MP*) if test -d /usr/nec; then - lt_cv_prog_cc_pic=-Kconform_pic + lt_prog_compiler_pic=-Kconform_pic fi ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + *) - lt_cv_prog_cc_pic='-fPIC' + lt_prog_compiler_pic='-fPIC' ;; esac else - # PORTME Check for PIC flags for the system compiler. + # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in - aix3* | aix4* | aix5*) - lt_cv_prog_cc_wl='-Wl,' - # All AIX code is PIC. + aix*) + lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor - lt_cv_prog_cc_static='-Bstatic' + lt_prog_compiler_static='-Bstatic' else - lt_cv_prog_cc_static='-bnso -bI:/lib/syscalls.exp' + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + hpux9* | hpux10* | hpux11*) - # Is there a better lt_cv_prog_cc_static that works with the bundled CC? - lt_cv_prog_cc_wl='-Wl,' - lt_cv_prog_cc_static="${lt_cv_prog_cc_wl}-a ${lt_cv_prog_cc_wl}archive" - lt_cv_prog_cc_pic='+Z' + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) - lt_cv_prog_cc_wl='-Wl,' - lt_cv_prog_cc_static='-non_shared' + lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. - ;; - - cygwin* | mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_cv_prog_cc_pic='-DDLL_EXPORT' + lt_prog_compiler_static='-non_shared' ;; newsos6) - lt_cv_prog_cc_pic='-KPIC' - lt_cv_prog_cc_static='-Bstatic' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + esac ;; osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. - lt_cv_prog_cc_wl='-Wl,' - lt_cv_prog_cc_static='-non_shared' + lt_prog_compiler_static='-non_shared' ;; sco3.2v5*) - lt_cv_prog_cc_pic='-Kpic' - lt_cv_prog_cc_static='-dn' - lt_cv_prog_cc_shlib='-belf' + lt_prog_compiler_pic='-Kpic' + lt_prog_compiler_static='-dn' ;; solaris*) - lt_cv_prog_cc_pic='-KPIC' - lt_cv_prog_cc_static='-Bstatic' - lt_cv_prog_cc_wl='-Wl,' + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' ;; sunos4*) - lt_cv_prog_cc_pic='-PIC' - lt_cv_prog_cc_static='-Bstatic' - lt_cv_prog_cc_wl='-Qoption ld ' + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - lt_cv_prog_cc_pic='-KPIC' - lt_cv_prog_cc_static='-Bstatic' - lt_cv_prog_cc_wl='-Wl,' - ;; - - uts4*) - lt_cv_prog_cc_pic='-pic' - lt_cv_prog_cc_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then - lt_cv_prog_cc_pic='-Kconform_pic' - lt_cv_prog_cc_static='-Bstatic' + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' fi ;; + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + *) - lt_cv_prog_cc_can_build_shared=no + lt_prog_compiler_can_build_shared=no ;; esac fi -fi +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic" >&6 -if test -z "$lt_cv_prog_cc_pic"; then - echo "$as_me:$LINENO: result: none" >&5 -echo "${ECHO_T}none" >&6 -else - echo "$as_me:$LINENO: result: $lt_cv_prog_cc_pic" >&5 -echo "${ECHO_T}$lt_cv_prog_cc_pic" >&6 +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then - # Check to make sure the pic_flag actually works. - echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_cv_prog_cc_pic works" >&5 -echo $ECHO_N "checking if $compiler PIC flag $lt_cv_prog_cc_pic works... $ECHO_C" >&6 - if test "${lt_cv_prog_cc_pic_works+set}" = set; then +echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6 +if test "${lt_prog_compiler_pic_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $lt_cv_prog_cc_pic -DPIC" - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" + lt_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:8528: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:8532: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_prog_compiler_pic_works=yes + fi + fi + $rm conftest* -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - case $host_os in - hpux9* | hpux10* | hpux11*) - # On HP-UX, both CC and GCC only warn that PIC is supported... then - # they create non-PIC objects. So, if there were any warnings, we - # assume that PIC is not supported. - if test -s conftest.err; then - lt_cv_prog_cc_pic_works=no - else - lt_cv_prog_cc_pic_works=yes - fi - ;; - *) - lt_cv_prog_cc_pic_works=yes - ;; - esac +fi +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6 +if test x"$lt_prog_compiler_pic_works" = xyes; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac else - echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 - lt_cv_prog_cc_pic_works=no - -fi -rm -f conftest.$ac_objext conftest.$ac_ext - CFLAGS="$save_CFLAGS" - + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no fi - - if test "X$lt_cv_prog_cc_pic_works" = Xno; then - lt_cv_prog_cc_pic= - lt_cv_prog_cc_can_build_shared=no - else - lt_cv_prog_cc_pic=" $lt_cv_prog_cc_pic" - fi - - echo "$as_me:$LINENO: result: $lt_cv_prog_cc_pic_works" >&5 -echo "${ECHO_T}$lt_cv_prog_cc_pic_works" >&6 fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac -# Check for any special shared library compilation flags. -if test -n "$lt_cv_prog_cc_shlib"; then - { echo "$as_me:$LINENO: WARNING: \`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries" >&5 -echo "$as_me: WARNING: \`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries" >&2;} - if echo "$old_CC $old_CFLAGS " | egrep -e "[ ]$lt_cv_prog_cc_shlib[ ]" >/dev/null; then : - else - { echo "$as_me:$LINENO: WARNING: add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5 -echo "$as_me: WARNING: add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;} - lt_cv_prog_cc_can_build_shared=no - fi -fi - -echo "$as_me:$LINENO: checking if $compiler static flag $lt_cv_prog_cc_static works" >&5 -echo $ECHO_N "checking if $compiler static flag $lt_cv_prog_cc_static works... $ECHO_C" >&6 -if test "${lt_cv_prog_cc_static_works+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_cv_prog_cc_static_works=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_cv_prog_cc_static" - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - lt_cv_prog_cc_static_works=yes -else - echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 -fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" - -fi - - -# Belt *and* braces to stop my trousers falling down: -test "X$lt_cv_prog_cc_static_works" = Xno && lt_cv_prog_cc_static= -echo "$as_me:$LINENO: result: $lt_cv_prog_cc_static_works" >&5 -echo "${ECHO_T}$lt_cv_prog_cc_static_works" >&6 - -pic_flag="$lt_cv_prog_cc_pic" -special_shlib_compile_flags="$lt_cv_prog_cc_shlib" -wl="$lt_cv_prog_cc_wl" -link_static_flag="$lt_cv_prog_cc_static" -no_builtin_flag="$lt_cv_prog_cc_no_builtin" -can_build_shared="$lt_cv_prog_cc_can_build_shared" - - -# Check to see if options -o and -c are simultaneously supported by compiler echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 -if test "${lt_cv_compiler_c_o+set}" = set; then +if test "${lt_cv_prog_compiler_c_o+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else + lt_cv_prog_compiler_c_o=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext -$rm -r conftest 2>/dev/null -mkdir conftest -cd conftest -echo "int some_variable = 0;" > conftest.$ac_ext -mkdir out -# According to Tom Tromey, Ian Lance Taylor reported there are C compilers -# that will create temporary files in the current directory regardless of -# the output directory. Thus, making CWD read-only will cause this test -# to fail, enabling locking or at least warning the user not to do parallel -# builds. -chmod -w . -save_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS -o out/conftest2.$ac_objext" -compiler_c_o=no -if { (eval echo configure:6155: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s out/conftest.err; then - lt_cv_compiler_c_o=no - else - lt_cv_compiler_c_o=yes - fi -else - # Append any errors to the config.log. - cat out/conftest.err 1>&5 - lt_cv_compiler_c_o=no -fi -CFLAGS="$save_CFLAGS" -chmod u+w . -$rm conftest* out/* -rmdir out -cd .. -rmdir conftest -$rm -r conftest 2>/dev/null + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:8588: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:8592: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* fi +echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6 -compiler_c_o=$lt_cv_compiler_c_o -echo "$as_me:$LINENO: result: $compiler_c_o" >&5 -echo "${ECHO_T}$compiler_c_o" >&6 -if test x"$compiler_c_o" = x"yes"; then - # Check to see if we can write to a .lo - echo "$as_me:$LINENO: checking if $compiler supports -c -o file.lo" >&5 -echo $ECHO_N "checking if $compiler supports -c -o file.lo... $ECHO_C" >&6 - if test "${lt_cv_compiler_o_lo+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - - lt_cv_compiler_o_lo=no - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -c -o conftest.lo" - save_objext="$ac_objext" - ac_objext=lo - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" - -int -main () -{ -int some_variable = 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - lt_cv_compiler_o_lo=no - else - lt_cv_compiler_o_lo=yes - fi - -else - echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 -fi -rm -f conftest.$ac_objext conftest.$ac_ext - ac_objext="$save_objext" - CFLAGS="$save_CFLAGS" - -fi - - compiler_o_lo=$lt_cv_compiler_o_lo - echo "$as_me:$LINENO: result: $compiler_o_lo" >&5 -echo "${ECHO_T}$compiler_o_lo" >&6 -else - compiler_o_lo=no -fi - -# Check to see if we can do hard links to lock some files if needed hard_links="nottested" -if test "$compiler_c_o" = no && test "$need_locks" != no; then +if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 @@ -6264,130 +8635,72 @@ else need_locks=no fi -if test "$GCC" = yes; then - # Check to see if options -fno-rtti -fno-exceptions are supported by compiler - echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 - echo "int some_variable = 0;" > conftest.$ac_ext - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.$ac_ext" - compiler_rtti_exceptions=no - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 -int -main () -{ -int some_variable = 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - compiler_rtti_exceptions=no - else - compiler_rtti_exceptions=yes - fi + runpath_var= + allow_undefined_flag= + enable_shared_with_static_runtimes=no + archive_cmds= + archive_expsym_cmds= + old_archive_From_new_cmds= + old_archive_from_expsyms_cmds= + export_dynamic_flag_spec= + whole_archive_flag_spec= + thread_safe_flag_spec= + hardcode_libdir_flag_spec= + hardcode_libdir_flag_spec_ld= + hardcode_libdir_separator= + hardcode_direct=no + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + link_all_deplibs=unknown + hardcode_automatic=no + module_cmds= + module_expsym_cmds= + always_export_symbols=no + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= -else - echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 -fi -rm -f conftest.$ac_objext conftest.$ac_ext - CFLAGS="$save_CFLAGS" - echo "$as_me:$LINENO: result: $compiler_rtti_exceptions" >&5 -echo "${ECHO_T}$compiler_rtti_exceptions" >&6 - - if test "$compiler_rtti_exceptions" = "yes"; then - no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions' - else - no_builtin_flag=' -fno-builtin' - fi -fi - -# See if the linker supports building shared libraries. -echo "$as_me:$LINENO: checking whether the linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the linker ($LD) supports shared libraries... $ECHO_C" >&6 - -allow_undefined_flag= -no_undefined_flag= -need_lib_prefix=unknown -need_version=unknown -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -archive_cmds= -archive_expsym_cmds= -old_archive_from_new_cmds= -old_archive_from_expsyms_cmds= -export_dynamic_flag_spec= -whole_archive_flag_spec= -thread_safe_flag_spec= -hardcode_into_libs=no -hardcode_libdir_flag_spec= -hardcode_libdir_separator= -hardcode_direct=no -hardcode_minus_L=no -hardcode_shlibpath_var=unsupported -runpath_var= -link_all_deplibs=unknown -always_export_symbols=no -export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols' -# include_expsyms should be a list of space-separated symbols to be *always* -# included in the symbol list -include_expsyms= -# exclude_expsyms can be an egrep regular expression of symbols to exclude -# it will be wrapped by ` (' and `)$', so one must not match beginning or -# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', -# as well as any symbol that contains `d'. -exclude_expsyms="_GLOBAL_OFFSET_TABLE_" -# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out -# platforms (ab)use it in PIC code, but their linkers get confused if -# the symbol is explicitly referenced. Since portable code cannot -# rely on this symbol name, it's probably fine to never include it in -# preloaded symbol tables. -extract_expsyms_cmds= - -case $host_os in -cygwin* | mingw* | pw32*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; -openbsd*) - with_gnu_ld=no - ;; -esac - -ld_shlibs=yes -if test "$with_gnu_ld" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # See if GNU ld supports shared libraries. case $host_os in - aix3* | aix4* | aix5*) - # On AIX, the GNU linker is very broken - # Note:Check GNU linker on AIX 5-IA64 when/if it becomes available. - ld_shlibs=no - cat <&2 + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. @@ -6396,125 +8709,73 @@ if test "$with_gnu_ld" = yes; then *** so that a non-GNU linker is found, and then restart. EOF - ;; - - amigaos*) - archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - - # Samuel A. Falvo II reports - # that the semantics of dynamic libraries on AmigaOS, at least up - # to version 4, is to share data among multiple programs linked - # with the same dynamic library. Since this doesn't match the - # behavior of shared libraries on other platforms, we can use - # them. - ld_shlibs=no - ;; - - beos*) - if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs=no - fi - ;; - - cygwin* | mingw* | pw32*) - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec='-L$libdir' - allow_undefined_flag=unsupported - always_export_symbols=yes - - extract_expsyms_cmds='test -f $output_objdir/impgen.c || \ - sed -e "/^# \/\* impgen\.c starts here \*\//,/^# \/\* impgen.c ends here \*\// { s/^# //;s/^# *$//; p; }" -e d < $''0 > $output_objdir/impgen.c~ - test -f $output_objdir/impgen.exe || (cd $output_objdir && \ - if test "x$HOST_CC" != "x" ; then $HOST_CC -o impgen impgen.c ; \ - else $CC -o impgen impgen.c ; fi)~ - $output_objdir/impgen $dir/$soroot > $output_objdir/$soname-def' - - old_archive_from_expsyms_cmds='$DLLTOOL --as=$AS --dllname $soname --def $output_objdir/$soname-def --output-lib $output_objdir/$newlib' - - # cygwin and mingw dlls have different entry points and sets of symbols - # to exclude. - # FIXME: what about values for MSVC? - dll_entry=__cygwin_dll_entry@12 - dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12~ - case $host_os in - mingw*) - # mingw values - dll_entry=_DllMainCRTStartup@12 - dll_exclude_symbols=DllMain@12,DllMainCRTStartup@12,DllEntryPoint@12~ + fi ;; - esac - # mingw and cygwin differ, and it's simplest to just exclude the union - # of the two symbol sets. - dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12,DllMainCRTStartup@12,DllEntryPoint@12 + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes - # recent cygwin and mingw systems supply a stub DllMain which the user - # can override, but on older systems we have to supply one (in ltdll.c) - if test "x$lt_cv_need_dllmain" = "xyes"; then - ltdll_obj='$output_objdir/$soname-ltdll.'"$ac_objext " - ltdll_cmds='test -f $output_objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $''0 > $output_objdir/$soname-ltdll.c~ - test -f $output_objdir/$soname-ltdll.$ac_objext || (cd $output_objdir && $CC -c $soname-ltdll.c)~' - else - ltdll_obj= - ltdll_cmds= - fi - - # Extract the symbol export list from an `--export-all' def file, - # then regenerate the def file from the symbol export list, so that - # the compiled dll only exports the symbol export list. - # Be careful not to strip the DATA tag left be newer dlltools. - export_symbols_cmds="$ltdll_cmds"' - $DLLTOOL --export-all --exclude-symbols '$dll_exclude_symbols' --output-def $output_objdir/$soname-def '$ltdll_obj'$libobjs $convenience~ - sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]*//" -e "s/ *;.*$//" < $output_objdir/$soname-def > $export_symbols' - - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is. - # If DATA tags from a recent dlltool are present, honour them! - archive_expsym_cmds='if test "x`sed 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname-def; - else - echo EXPORTS > $output_objdir/$soname-def; - _lt_hint=1; - cat $export_symbols | while read symbol; do - set dummy \$symbol; - case \$# in - 2) echo " \$2 @ \$_lt_hint ; " >> $output_objdir/$soname-def;; - 4) echo " \$2 \$3 \$4 ; " >> $output_objdir/$soname-def; _lt_hint=`expr \$_lt_hint - 1`;; - *) echo " \$2 @ \$_lt_hint \$3 ; " >> $output_objdir/$soname-def;; - esac; - _lt_hint=`expr 1 + \$_lt_hint`; - done; - fi~ - '"$ltdll_cmds"' - $CC -Wl,--base-file,$output_objdir/$soname-base '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ - $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~ - $CC -Wl,--base-file,$output_objdir/$soname-base $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ - $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp --output-lib $output_objdir/$libname.dll.a~ - $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags' - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - archive_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris* | sysv5*) - if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. ld_shlibs=no - cat <&2 + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool @@ -6524,553 +8785,781 @@ EOF *** used, and then restart. EOF - elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - - sunos4*) - archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - *) - if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - - if test "$ld_shlibs" = yes; then - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec='${wl}--export-dynamic' - case $host_os in - cygwin* | mingw* | pw32*) - # dlltool doesn't understand --whole-archive et. al. - whole_archive_flag_spec= - ;; - *) - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else - whole_archive_flag_spec= + ld_shlibs=no fi ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_cmds="$tmp_archive_cmds" + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + archive_expsym_cmds="$tmp_archive_cmds" + fi + else + ld_shlibs=no + fi + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + + if test "$GCC" = yes; then + case $host_os in aix4.012|aix4.012.*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + always_export_symbols=yes + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec=' ' + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds it's shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + + bsdi4*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes=yes + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes ; then + archive_cmds_need_lc=no + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag='-flat_namespace -undefined suppress' + ;; + 10.*) + allow_undefined_flag='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_cmds='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + archive_cmds='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + module_cmds='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + whole_archive_flag_spec='-all_load $convenience' + link_all_deplibs=yes + else + ld_shlibs=no + fi + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld='+b $libdir' + hardcode_libdir_separator=: + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + ia64*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=no + hardcode_shlibpath_var=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + *) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld='-rpath $libdir' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + link_all_deplibs=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + openbsd*) + hardcode_direct=yes + hardcode_shlibpath_var=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + + sco3.2v5*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + no_undefined_flag=' -z text' + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=no + hardcode_shlibpath_var=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + no_undefined_flag='${wl}-z ${wl}text' + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv5*) + no_undefined_flag=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec= + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; esac fi -else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - allow_undefined_flag=unsupported - always_export_symbols=yes - archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L=yes - if test "$GCC" = yes && test -z "$link_static_flag"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct=unsupported - fi - ;; - aix4* | aix5*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix5*) - for ld_flag in $LDFLAGS; do - case $ld_flag in - *-brtl*) - aix_use_runtimelinking=yes - break - ;; - esac - done - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - hardcode_direct=yes - archive_cmds='' - hardcode_libdir_separator=':' - if test "$GCC" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && \ - strings "$collect2name" | grep resolve_lib_name >/dev/null - then - # We have reworked collect2 - hardcode_direct=yes - else - # We have old collect2 - hardcode_direct=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L=yes - hardcode_libdir_flag_spec='-L$libdir' - hardcode_libdir_separator= - fi - esac - - shared_flag='-shared' - else - # not using gcc - if test "$host_cpu" = ia64; then - shared_flag='${wl}-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - # It seems that -bexpall can do strange things, so it is better to - # generate a list of symbols to export. - always_export_symbols=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag='-berok' - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib' - archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag="-z nodefs" - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname ${wl}-h$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" - else - hardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib' - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - allow_undefined_flag='${wl}-berok' - # This is a bit strange, but is similar to how AIX traditionally builds - # it's shared libraries. - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"' ~$AR -crlo $objdir/$libname$release.a $objdir/$soname' - fi - fi - ;; - - amigaos*) - archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - # see comment about different semantics on the GNU ld section - ld_shlibs=no - ;; - - cygwin* | mingw* | pw32*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_from_new_cmds='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' - fix_srcfile_path='`cygpath -w "$srcfile"`' - ;; - - darwin* | rhapsody*) - case "$host_os" in - rhapsody* | darwin1.[012]) - allow_undefined_flag='-undefined suppress' - ;; - *) # Darwin 1.3 on -# allow_undefined_flag='-undefined suppress' - ;; - esac - # FIXME: Relying on posixy $() will cause problems for - # cross-compilation, but unfortunately the echo tests do not - # yet detect zsh echo's removal of \ escapes. Also zsh mangles - # `"' quotes if we put them in here... so don't! - archive_cmds='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs && $CC $(test .$module = .yes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib ${lib}-master.o $deplibs$linker_flags $(test .$module != .yes && echo -install_name $rpath/$soname $verstring)' - # We need to add '_' to the symbols in $export_symbols first - #archive_expsym_cmds="$archive_cmds"' && strip -s $export_symbols' - hardcode_direct=yes - hardcode_shlibpath_var=no - whole_archive_flag_spec='-all_load $convenience' - ;; - - freebsd1*) - ld_shlibs=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd*) - archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - hpux9* | hpux10* | hpux11*) - case $host_os in - hpux9*) archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ;; - *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; - esac - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - hardcode_minus_L=yes # Not in the search PATH, but as the default - # location of the library. - export_dynamic_flag_spec='${wl}-E' - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - else - archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec='-rpath $libdir' - fi - hardcode_libdir_separator=: - link_all_deplibs=yes - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - newsos6) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_shlibpath_var=no - ;; - - openbsd*) - hardcode_direct=yes - hardcode_shlibpath_var=no - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - else - case "$host_os" in - openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-R$libdir' - ;; - *) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - ;; - esac - fi - ;; - - os2*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - allow_undefined_flag=unsupported - archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - fi - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='for i in `cat $export_symbols`; do printf "-exported_symbol " >> $lib.exp; echo "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ - $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' - - #Both c and cxx compiler support -rpath directly - hardcode_libdir_flag_spec='-rpath $libdir' - fi - hardcode_libdir_separator=: - ;; - - sco3.2v5*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - export_dynamic_flag_spec='${wl}-Bexport' - ;; - - solaris*) - # gcc --version < 3.0 without binutils cannot create self contained - # shared libraries reliably, requiring libgcc.a to resolve some of - # the object symbols generated in some cases. Libraries that use - # assert need libgcc.a to resolve __eprintf, for example. Linking - # a copy of libgcc.a into every shared library to guarantee resolving - # such symbols causes other problems: According to Tim Van Holder - # , C++ libraries end up with a separate - # (to the application) exception stack for one thing. - no_undefined_flag=' -z defs' - if test "$GCC" = yes; then - case `$CC --version 2>/dev/null` in - [12].*) - cat <&2 - -*** Warning: Releases of GCC earlier than version 3.0 cannot reliably -*** create self contained shared libraries on Solaris systems, without -*** introducing a dependency on libgcc.a. Therefore, libtool is disabling -*** -no-undefined support, which will at least allow you to build shared -*** libraries. However, you may find that when you link such libraries -*** into an application without using GCC, you have to manually add -*** \`gcc --print-libgcc-file-name\` to the link command. We urge you to -*** upgrade to a newer version of GCC. Another option is to rebuild your -*** current GCC to use the GNU linker from GNU binutils 2.9.1 or newer. - -EOF - no_undefined_flag= - ;; - esac - fi - # $CC -shared without GNU ld will not create a library from C++ - # object files and a static libstdc++, better avoid it by now - archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_shlibpath_var=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; - esac - link_all_deplibs=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - hardcode_libdir_flag_spec='-L$libdir' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - sysv4) - case $host_vendor in - sni) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' - reload_cmds='$CC -r -o $output$reload_objs' - hardcode_direct=no - ;; - motorola) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no - ;; - - sysv4.3*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - export_dynamic_flag_spec='-Bexport' - ;; - - sysv5*) - no_undefined_flag=' -z text' - # $CC -shared without GNU ld will not create a library from C++ - # object files and a static libstdc++, better avoid it by now - archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - hardcode_libdir_flag_spec= - hardcode_shlibpath_var=no - runpath_var='LD_RUN_PATH' - ;; - - uts4*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - dgux*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - sysv4*MP*) - if test -d /usr/nec; then - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ld_shlibs=yes - fi - ;; - - sysv4.2uw2*) - archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_minus_L=no - hardcode_shlibpath_var=no - hardcode_runpath_var=yes - runpath_var=LD_RUN_PATH - ;; - - sysv5uw7* | unixware7*) - no_undefined_flag='${wl}-z ${wl}text' - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no - ;; - - *) - ld_shlibs=no - ;; - esac -fi echo "$as_me:$LINENO: result: $ld_shlibs" >&5 echo "${ECHO_T}$ld_shlibs" >&6 test "$ld_shlibs" = no && can_build_shared=no -# Check hardcoding attributes. -echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 -hardcode_action= -if test -n "$hardcode_libdir_flag_spec" || \ - test -n "$runpath_var"; then +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi - # We can hardcode non-existant directories. - if test "$hardcode_direct" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$hardcode_shlibpath_var" != no && - test "$hardcode_minus_L" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action=immediate +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc=no + else + archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 +echo "${ECHO_T}$archive_cmds_need_lc" >&6 + ;; + esac fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action=unsupported -fi -echo "$as_me:$LINENO: result: $hardcode_action" >&5 -echo "${ECHO_T}$hardcode_action" >&6 + ;; +esac -striplib= -old_striplib= -echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 -echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 -if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -reload_cmds='$LD$reload_flag -o $output$reload_objs' -test -z "$deplibs_check_method" && deplibs_check_method=unknown - -# PORTME Fill in your ld.so characteristics echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 library_names_spec= libname_spec='lib$name' soname_spec= +shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= @@ -7080,16 +9569,35 @@ shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" -sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown case $host_os in aix3*) version_type=linux - library_names_spec='${libname}${release}.so$versuffix $libname.a' + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH - # AIX has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}.so$major' + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) @@ -7099,7 +9607,7 @@ aix4* | aix5*) hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 - library_names_spec='${libname}${release}.so$major ${libname}${release}.so$versuffix $libname.so' + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file @@ -7109,43 +9617,41 @@ aix4* | aix5*) # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; esac - # AIX (on Power*) has no versioning support, so currently we can - # not hardcode correct soname into executable. Probably we can - # add versioning support to collect2, so additional links can - # be useful in future. + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}.so$major' + soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi - hardcode_into_libs=yes ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done' + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) - library_names_spec='${libname}.so' + library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; @@ -7153,13 +9659,12 @@ beos*) bsdi4*) version_type=linux need_version=no - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - export_dynamic_flag_spec=-rdynamic # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs @@ -7167,29 +9672,55 @@ bsdi4*) cygwin* | mingw* | pw32*) version_type=windows + shrext_cmds=".dll" need_version=no need_lib_prefix=no + case $GCC,$host_os in - yes,cygwin*) + yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll' - postinstall_cmds='dlpath=`bash 2>&1 -c '\''. $dir/${file}i;echo \$dlname'\''`~ + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ - $install_prog .libs/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`bash 2>&1 -c '\''. $file; echo \$dlname'\''`~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' + ;; + esac ;; - yes,mingw*) - library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll' - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g" -e "s,=/,/,g"` - ;; - yes,pw32*) - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/./-/g'`${versuffix}.dll' - ;; + *) - library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib' + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' @@ -7202,30 +9733,56 @@ darwin* | rhapsody*) version_type=darwin need_lib_prefix=no need_version=no - # FIXME: Relying on posixy $() will cause problems for - # cross-compilation, but unfortunately the echo tests do not - # yet detect zsh echo's removal of \ escapes. - library_names_spec='${libname}${release}${versuffix}.$(test .$module = .yes && echo so || echo dylib) ${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib) ${libname}.$(test .$module = .yes && echo so || echo dylib)' - soname_spec='${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib)' + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + freebsd*) objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` version_type=freebsd-$objformat case $version_type in freebsd-elf*) - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) - library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix' + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac @@ -7234,7 +9791,11 @@ freebsd*) freebsd2*) shlibpath_overrides_runpath=yes ;; - *) + freebsd3.01* | freebsdelf3.01*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; @@ -7245,8 +9806,8 @@ gnu*) version_type=linux need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so' - soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; @@ -7254,14 +9815,45 @@ gnu*) hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. - dynamic_linker="$host_os dld.sl" version_type=sunos need_lib_prefix=no need_version=no - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl' - soname_spec='${libname}${release}.sl$major' + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; @@ -7269,21 +9861,29 @@ hpux9* | hpux10* | hpux11*) irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; - *) version_type=irix ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; esac need_lib_prefix=no need_version=no - soname_spec='${libname}${release}.so$major' - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so' + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;; + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; @@ -7292,20 +9892,21 @@ irix5* | irix6* | nonstopux*) shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. -linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*) +linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. -linux-gnu*) +linux*) version_type=linux need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no @@ -7314,6 +9915,12 @@ linux-gnu*) # before this can be enabled. hardcode_into_libs=yes + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, @@ -7323,17 +9930,29 @@ linux-gnu*) dynamic_linker='GNU/Linux ld.so' ;; +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so' - soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH @@ -7343,7 +9962,17 @@ netbsd*) newsos6) version_type=linux - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; @@ -7351,47 +9980,48 @@ newsos6) openbsd*) version_type=sunos need_lib_prefix=no - need_version=no + need_version=yes + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case "$host_os" in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac else shlibpath_overrides_runpath=yes fi - library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH ;; os2*) libname_spec='$name' + shrext_cmds=".dll" need_lib_prefix=no - library_names_spec='$libname.dll $libname.a' + library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf + need_lib_prefix=no need_version=no - soname_spec='${libname}${release}.so$major' - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - hardcode_into_libs=yes ;; sco3.2v5*) version_type=osf - soname_spec='${libname}${release}.so$major' - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH ;; @@ -7399,8 +10029,8 @@ solaris*) version_type=linux need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes @@ -7410,7 +10040,7 @@ solaris*) sunos4*) version_type=sunos - library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes @@ -7422,8 +10052,8 @@ sunos4*) sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) version_type=linux - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) @@ -7444,31 +10074,22 @@ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) esac ;; -uts4*) - version_type=linux - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -dgux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - sysv4*MP*) if test -d /usr/nec ;then version_type=linux - library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so' - soname_spec='$libname.so.$major' + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + *) dynamic_linker=no ;; @@ -7477,42 +10098,33 @@ echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6 test "$dynamic_linker" = no && can_build_shared=no -# Report the final consequences. -echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 -echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 -echo "$as_me:$LINENO: result: $can_build_shared" >&5 -echo "${ECHO_T}$can_build_shared" >&6 +echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || \ + test -n "$runpath_var " || \ + test "X$hardcode_automatic"="Xyes" ; then -echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 -echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 -test "$can_build_shared" = "no" && enable_shared=no - -# On AIX, shared libraries and static libraries use the same namespace, and -# are all built from PIC. -case "$host_os" in -aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' + # We can hardcode non-existant directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate fi - ;; - -aix4*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; -esac -echo "$as_me:$LINENO: result: $enable_shared" >&5 -echo "${ECHO_T}$enable_shared" >&6 - -echo "$as_me:$LINENO: checking whether to build static libraries" >&5 -echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 -# Make sure either enable_shared or enable_static is yes. -test "$enable_shared" = yes || enable_static=yes -echo "$as_me:$LINENO: result: $enable_static" >&5 -echo "${ECHO_T}$enable_static" >&6 +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +echo "$as_me:$LINENO: result: $hardcode_action" >&5 +echo "${ECHO_T}$hardcode_action" >&6 if test "$hardcode_action" = relink; then # Fast installation is not supported @@ -7523,9 +10135,33 @@ elif test "$shlibpath_overrides_runpath" = yes || enable_fast_install=needless fi -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +striplib= +old_striplib= +echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + ;; + *) + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + ;; + esac fi if test "x$enable_dlopen" != xyes; then @@ -7543,11 +10179,94 @@ else lt_cv_dlopen_self=yes ;; - cygwin* | mingw* | pw32*) + mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dl_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + *) echo "$as_me:$LINENO: checking for shl_load" >&5 echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 @@ -7555,43 +10274,73 @@ if test "${ac_cv_func_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define shl_load to an innocuous variant, in case declares shl_load. + For example, HP-UX 11i declares gettimeofday. */ +#define shl_load innocuous_shl_load + /* System header to define __stub macros and hopefully few prototypes, - which can conflict with char shl_load (); below. */ -#include + which can conflict with char shl_load (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef shl_load + /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" +{ #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); -char (*f) (); - -int -main () -{ /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_shl_load) || defined (__stub___shl_load) choke me #else -f = shl_load; +char (*f) () = shl_load; +#endif +#ifdef __cplusplus +} #endif +int +main () +{ +return f != shl_load; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -7600,10 +10349,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_func_shl_load=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_func_shl_load=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 echo "${ECHO_T}$ac_cv_func_shl_load" >&6 @@ -7618,8 +10369,11 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -7638,11 +10392,21 @@ shl_load (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -7651,10 +10415,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_dld_shl_load=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_lib_dld_shl_load=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 @@ -7668,43 +10434,73 @@ if test "${ac_cv_func_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define dlopen to an innocuous variant, in case declares dlopen. + For example, HP-UX 11i declares gettimeofday. */ +#define dlopen innocuous_dlopen + /* System header to define __stub macros and hopefully few prototypes, - which can conflict with char dlopen (); below. */ -#include + which can conflict with char dlopen (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef dlopen + /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" +{ #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); -char (*f) (); - -int -main () -{ /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_dlopen) || defined (__stub___dlopen) choke me #else -f = dlopen; +char (*f) () = dlopen; +#endif +#ifdef __cplusplus +} #endif +int +main () +{ +return f != dlopen; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -7713,10 +10509,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_func_dlopen=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_func_dlopen=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 echo "${ECHO_T}$ac_cv_func_dlopen" >&6 @@ -7731,8 +10529,11 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -7751,11 +10552,21 @@ dlopen (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -7764,10 +10575,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_lib_dl_dlopen=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 @@ -7783,8 +10596,11 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -7803,11 +10619,21 @@ dlopen (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -7816,10 +10642,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_svld_dlopen=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_lib_svld_dlopen=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 @@ -7835,8 +10663,11 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -7855,11 +10686,21 @@ dld_link (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -7868,10 +10709,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_dld_dld_link=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_lib_dld_dld_link=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 @@ -7907,7 +10750,7 @@ fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" @@ -7923,10 +10766,10 @@ else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext <&6 fi -if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 - if test "${lt_cv_archive_cmds_need_lc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - $rm conftest* - echo 'static int dummy;' > conftest.$ac_ext +# Report which librarie types wil actually be built +echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $can_build_shared" >&5 +echo "${ECHO_T}$can_build_shared" >&6 - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_cv_prog_cc_wl - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - save_allow_undefined_flag=$allow_undefined_flag - allow_undefined_flag= - if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 - (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - then - lt_cv_archive_cmds_need_lc=no +echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 +echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4* | aix5*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + darwin* | rhapsody*) + if test "$GCC" = yes; then + archive_cmds_need_lc=no + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag='-flat_namespace -undefined suppress' else - lt_cv_archive_cmds_need_lc=yes + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag='-flat_namespace -undefined suppress' + ;; + 10.*) + allow_undefined_flag='-undefined dynamic_lookup' + ;; + esac fi - allow_undefined_flag=$save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi -fi - - echo "$as_me:$LINENO: result: $lt_cv_archive_cmds_need_lc" >&5 -echo "${ECHO_T}$lt_cv_archive_cmds_need_lc" >&6 + ;; + esac + output_verbose_link_cmd='echo' + archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring' + module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + whole_archive_flag_spec='-all_load $convenience' + link_all_deplibs=yes + else + ld_shlibs=no + fi ;; - esac -fi -need_lc=${lt_cv_archive_cmds_need_lc-yes} +esac +echo "$as_me:$LINENO: result: $enable_shared" >&5 +echo "${ECHO_T}$enable_shared" >&6 -# The second clause should only fire when bootstrapping the +echo "$as_me:$LINENO: checking whether to build static libraries" >&5 +echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +echo "$as_me:$LINENO: result: $enable_static" >&5 +echo "${ECHO_T}$enable_static" >&6 + +# The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then - : -else - # If there is no Makefile yet, we rely on a make rule to execute - # `config.status --recheck' to rerun these tests and create the - # libtool script then. - test -f Makefile && make "$ltmain" -fi - -if test -f "$ltmain"; then - trap "$rm \"${ofile}T\"; exit 1" 1 2 15 - $rm -f "${ofile}T" - - echo creating $ofile - + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. - for var in echo old_CC old_CFLAGS SED \ - AR AR_FLAGS CC LD LN_S NM SHELL \ - reload_flag reload_cmds wl \ - pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \ - thread_safe_flag_spec whole_archive_flag_spec libname_spec \ - library_names_spec soname_spec \ - RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \ - old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds \ - postuninstall_cmds extract_expsyms_cmds old_archive_from_expsyms_cmds \ - old_striplib striplib file_magic_cmd export_symbols_cmds \ - deplibs_check_method allow_undefined_flag no_undefined_flag \ - finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \ - global_symbol_to_c_name_address \ - hardcode_libdir_flag_spec hardcode_libdir_separator \ + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ - compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do + old_postinstall_cmds old_postuninstall_cmds \ + compiler \ + CC \ + LD \ + lt_prog_compiler_wl \ + lt_prog_compiler_pic \ + lt_prog_compiler_static \ + lt_prog_compiler_no_builtin_flag \ + export_dynamic_flag_spec \ + thread_safe_flag_spec \ + whole_archive_flag_spec \ + enable_shared_with_static_runtimes \ + old_archive_cmds \ + old_archive_from_new_cmds \ + predep_objects \ + postdep_objects \ + predeps \ + postdeps \ + compiler_lib_search_path \ + archive_cmds \ + archive_expsym_cmds \ + postinstall_cmds \ + postuninstall_cmds \ + old_archive_from_expsyms_cmds \ + allow_undefined_flag \ + no_undefined_flag \ + export_symbols_cmds \ + hardcode_libdir_flag_spec \ + hardcode_libdir_flag_spec_ld \ + hardcode_libdir_separator \ + hardcode_automatic \ + module_cmds \ + module_expsym_cmds \ + lt_cv_prog_compiler_c_o \ + exclude_expsyms \ + include_expsyms; do case $var in - reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \ - old_postinstall_cmds | old_postuninstall_cmds | \ - export_symbols_cmds | archive_cmds | archive_expsym_cmds | \ - extract_expsyms_cmds | old_archive_from_expsyms_cmds | \ + old_archive_cmds | \ + old_archive_from_new_cmds | \ + archive_cmds | \ + archive_expsym_cmds | \ + module_cmds | \ + module_expsym_cmds | \ + old_archive_from_expsyms_cmds | \ + export_symbols_cmds | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ - finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; @@ -8240,14 +11125,29 @@ if test -f "$ltmain"; then esac done - cat <<__EOF__ > "${ofile}T" + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="${ofile}T" + trap "$rm \"$cfgfile\"; exit 1" 1 2 15 + $rm -f "$cfgfile" + { echo "$as_me:$LINENO: creating $ofile" >&5 +echo "$as_me: creating $ofile" >&6;} + + cat <<__EOF__ >> "$cfgfile" #! $SHELL -# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) # NOTE: Changes made to this file will be lost: look at ltmain.sh. # -# Copyright (C) 1996-2000 Free Software Foundation, Inc. +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: # Originally by Gordon Matzigkeit , 1996 # # This program is free software; you can redistribute it and/or modify @@ -8269,16 +11169,19 @@ if test -f "$ltmain"; then # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. -# A sed that does not truncate output. +# A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="${SED} -e s/^X//" +Xsed="$SED -e s/^X//" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi +# The names of the tagged configurations supported by this script. +available_tags= + # ### BEGIN LIBTOOL CONFIG # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: @@ -8293,7 +11196,10 @@ build_libtool_libs=$enable_shared build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$need_lc +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Whether or not to optimize for fast installation. fast_install=$enable_fast_install @@ -8309,12 +11215,18 @@ echo=$lt_echo AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS -# The default C compiler. -CC=$lt_CC +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler # Is the compiler the GNU C compiler? with_gcc=$GCC +# An ERE matcher. +EGREP=$lt_EGREP + # The linker used to build libraries. LD=$lt_LD @@ -8325,7 +11237,7 @@ LN_S=$lt_LN_S NM=$lt_NM # A symbol stripping program -STRIP=$STRIP +STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD @@ -8347,7 +11259,7 @@ reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. -wl=$lt_wl +wl=$lt_lt_prog_compiler_wl # Object file suffix (normally "o"). objext="$ac_objext" @@ -8355,18 +11267,21 @@ objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. -pic_flag=$lt_pic_flag +pic_flag=$lt_lt_prog_compiler_pic pic_mode=$pic_mode -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_compiler_c_o +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len -# Can we write directly to a .lo ? -compiler_o_lo=$lt_compiler_o_lo +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Must we lock files when doing compilation ? need_locks=$lt_need_locks @@ -8387,10 +11302,10 @@ dlopen_self=$enable_dlopen_self dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. -link_static_flag=$lt_link_static_flag +link_static_flag=$lt_lt_prog_compiler_static # Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_no_builtin_flag +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec @@ -8432,10 +11347,34 @@ archive_expsym_cmds=$lt_archive_expsym_cmds postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method @@ -8455,13 +11394,13 @@ finish_cmds=$lt_finish_cmds finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_global_symbol_pipe +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration -global_symbol_to_cdecl=$lt_global_symbol_to_cdecl +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair -global_symbol_to_c_name_address=$lt_global_symbol_to_c_name_address +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var @@ -8482,10 +11421,15 @@ hardcode_into_libs=$hardcode_into_libs # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld + # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator -# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct @@ -8497,6 +11441,10 @@ hardcode_minus_L=$hardcode_minus_L # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic + # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" @@ -8532,9 +11480,10 @@ include_expsyms=$lt_include_expsyms __EOF__ + case $host_os in aix3*) - cat <<\EOF >> "${ofile}T" + cat <<\EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems @@ -8543,186 +11492,6 @@ if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi -EOF - ;; - esac - - case $host_os in - cygwin* | mingw* | pw32* | os2*) - cat <<'EOF' >> "${ofile}T" - # This is a source program that is used to create dlls on Windows - # Don't remove nor modify the starting and closing comments -# /* ltdll.c starts here */ -# #define WIN32_LEAN_AND_MEAN -# #include -# #undef WIN32_LEAN_AND_MEAN -# #include -# -# #ifndef __CYGWIN__ -# # ifdef __CYGWIN32__ -# # define __CYGWIN__ __CYGWIN32__ -# # endif -# #endif -# -# #ifdef __cplusplus -# extern "C" { -# #endif -# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); -# #ifdef __cplusplus -# } -# #endif -# -# #ifdef __CYGWIN__ -# #include -# DECLARE_CYGWIN_DLL( DllMain ); -# #endif -# HINSTANCE __hDllInstance_base; -# -# BOOL APIENTRY -# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) -# { -# __hDllInstance_base = hInst; -# return TRUE; -# } -# /* ltdll.c ends here */ - # This is a source program that is used to create import libraries - # on Windows for dlls which lack them. Don't remove nor modify the - # starting and closing comments -# /* impgen.c starts here */ -# /* Copyright (C) 1999-2000 Free Software Foundation, Inc. -# -# This file is part of GNU libtool. -# -# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# */ -# -# #include /* for printf() */ -# #include /* for open(), lseek(), read() */ -# #include /* for O_RDONLY, O_BINARY */ -# #include /* for strdup() */ -# -# /* O_BINARY isn't required (or even defined sometimes) under Unix */ -# #ifndef O_BINARY -# #define O_BINARY 0 -# #endif -# -# static unsigned int -# pe_get16 (fd, offset) -# int fd; -# int offset; -# { -# unsigned char b[2]; -# lseek (fd, offset, SEEK_SET); -# read (fd, b, 2); -# return b[0] + (b[1]<<8); -# } -# -# static unsigned int -# pe_get32 (fd, offset) -# int fd; -# int offset; -# { -# unsigned char b[4]; -# lseek (fd, offset, SEEK_SET); -# read (fd, b, 4); -# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); -# } -# -# static unsigned int -# pe_as32 (ptr) -# void *ptr; -# { -# unsigned char *b = ptr; -# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); -# } -# -# int -# main (argc, argv) -# int argc; -# char *argv[]; -# { -# int dll; -# unsigned long pe_header_offset, opthdr_ofs, num_entries, i; -# unsigned long export_rva, export_size, nsections, secptr, expptr; -# unsigned long name_rvas, nexp; -# unsigned char *expdata, *erva; -# char *filename, *dll_name; -# -# filename = argv[1]; -# -# dll = open(filename, O_RDONLY|O_BINARY); -# if (dll < 1) -# return 1; -# -# dll_name = filename; -# -# for (i=0; filename[i]; i++) -# if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':') -# dll_name = filename + i +1; -# -# pe_header_offset = pe_get32 (dll, 0x3c); -# opthdr_ofs = pe_header_offset + 4 + 20; -# num_entries = pe_get32 (dll, opthdr_ofs + 92); -# -# if (num_entries < 1) /* no exports */ -# return 1; -# -# export_rva = pe_get32 (dll, opthdr_ofs + 96); -# export_size = pe_get32 (dll, opthdr_ofs + 100); -# nsections = pe_get16 (dll, pe_header_offset + 4 +2); -# secptr = (pe_header_offset + 4 + 20 + -# pe_get16 (dll, pe_header_offset + 4 + 16)); -# -# expptr = 0; -# for (i = 0; i < nsections; i++) -# { -# char sname[8]; -# unsigned long secptr1 = secptr + 40 * i; -# unsigned long vaddr = pe_get32 (dll, secptr1 + 12); -# unsigned long vsize = pe_get32 (dll, secptr1 + 16); -# unsigned long fptr = pe_get32 (dll, secptr1 + 20); -# lseek(dll, secptr1, SEEK_SET); -# read(dll, sname, 8); -# if (vaddr <= export_rva && vaddr+vsize > export_rva) -# { -# expptr = fptr + (export_rva - vaddr); -# if (export_rva + export_size > vaddr + vsize) -# export_size = vsize - (export_rva - vaddr); -# break; -# } -# } -# -# expdata = (unsigned char*)malloc(export_size); -# lseek (dll, expptr, SEEK_SET); -# read (dll, expdata, export_size); -# erva = expdata - export_rva; -# -# nexp = pe_as32 (expdata+24); -# name_rvas = pe_as32 (expdata+32); -# -# printf ("EXPORTS\n"); -# for (i = 0; i> "${ofile}T" || (rm -f "${ofile}T"; exit 1) + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) - mv -f "${ofile}T" "$ofile" || \ - (rm -f "$ofile" && cp "${ofile}T" "$ofile" && rm -f "${ofile}T") + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + +# Check whether --with-tags or --without-tags was given. +if test "${with_tags+set}" = set; then + withval="$with_tags" + tagnames="$withval" +fi; + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5 +echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5 +echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} + else + { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 +echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} + fi + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in + "") ;; + *) { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5 +echo "$as_me: error: invalid tag name: $tagname" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5 +echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} + { (exit 1); exit 1; }; } + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && test "X$CXX" != "Xno"; then + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_flag_spec_ld_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_automatic_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +# Source file extension for C++ test sources. +ac_ext=cc + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *) { return(0); }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +compiler_CXX=$CC +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' +else + lt_prog_compiler_no_builtin_flag_CXX= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + +# Check whether --with-gnu-ld or --without-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval="$with_gnu_ld" + test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi; +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + echo "$as_me:$LINENO: checking for ld used by $CC" >&5 +echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + echo "$as_me:$LINENO: checking for GNU ld" >&5 +echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 +else + echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 +fi +if test "${lt_cv_path_LD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +echo "${ECHO_T}$LD" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 +if test "${lt_cv_prog_gnu_ld+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 &5 +echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 +ld_shlibs_CXX=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + + if test "$GXX" = yes; then + case $host_os in aix4.012|aix4.012.*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct_CXX=yes + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_CXX=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_CXX='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + always_export_symbols_CXX=yes + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX=' ' + archive_cmds_need_lc_CXX=yes + # This is similar to how AIX traditionally builds it's shared libraries. + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs_CXX=no + fi + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes; then + archive_cmds_need_lc_CXX=no + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag_CXX='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_CXX='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_CXX='-flat_namespace -undefined suppress' + ;; + 10.*) + allow_undefined_flag_CXX='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + archive_cmds_CXX='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + module_cmds_CXX='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + whole_archive_flag_spec_CXX='-all_load $convenience' + link_all_deplibs_CXX=yes + else + ld_shlibs_CXX=no + fi + ;; + + dgux*) + case $cc_basename in + ec++) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + freebsd12*) + # C++ shared libraries reported to be fairly broken before switch to ELF + ld_shlibs_CXX=no + ;; + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + gnu*) + ;; + hpux9*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC) + archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld_CXX='+b $libdir' + hardcode_libdir_separator_CXX=: + ;; + ia64*) + hardcode_libdir_flag_spec_CXX='-L$libdir' + ;; + *) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + ;; + esac + fi + case "$host_cpu" in + hppa*64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + *) + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC) + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case "$host_cpu" in + ia64*|hppa*64*) + archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + irix5* | irix6*) + case $cc_basename in + CC) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + ;; + linux*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc) + # Intel C++ + with_gnu_ld=yes + archive_cmds_need_lc_CXX=no + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + cxx) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + mvs*) + case $cc_basename in + cxx) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + osf3*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx) + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ + $rm $lib.exp' + + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + sco*) + archive_cmds_need_lc_CXX=no + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.0-5 | solaris2.0-5.*) ;; + *) + # The C++ compiler is used as linker so we must use $wl + # flag to pass the commands to the underlying system + # linker. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[LR]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + no_undefined_flag_CXX=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + fi + ;; + esac + ;; + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + archive_cmds_need_lc_CXX=no + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; +esac +echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 +echo "${ECHO_T}$ld_shlibs_CXX" >&6 +test "$ld_shlibs_CXX" = no && can_build_shared=no + +GCC_CXX="$GXX" +LD_CXX="$LD" + + +cat > conftest.$ac_ext <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + # The `*' in the case matches for architectures that use `case' in + # $output_verbose_cmd can trigger glob expansion during the loop + # eval without this substitution. + output_verbose_link_cmd="`$echo \"X$output_verbose_link_cmd\" | $Xsed -e \"$no_glob_subst\"`" + + for p in `eval $output_verbose_link_cmd`; do + case $p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" \ + || test $p = "-R"; then + prev=$p + continue + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p in + -L* | -R*) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX="${prev}${p}" + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX="${prev}${p}" + else + postdeps_CXX="${postdeps_CXX} ${prev}${p}" + fi + fi + ;; + + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX="$p" + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX="$p" + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$rm -f confest.$objext + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + +lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + +echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 + + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix4* | aix5*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + if test "$host_cpu" != ia64; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux*) + case $cc_basename in + KCC) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + icpc) + # Intel C++ + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + cxx) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + sco*) + case $cc_basename in + CC) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + *) + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + unixware*) + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6 + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + +echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6 +if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:13049: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:13053: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_prog_compiler_pic_works_CXX=yes + fi + fi + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6 + +if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac + +echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 +if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:13109: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:13113: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6 + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6 + if test "$hard_links" = no; then + { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix4* | aix5*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw*) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 +echo "${ECHO_T}$ld_shlibs_CXX" >&6 +test "$ld_shlibs_CXX" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_CXX=no + else + archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 +echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6 + ;; + esac + fi + ;; +esac + +echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.01* | freebsdelf3.01*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=yes + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6 +test "$dynamic_linker" = no && can_build_shared=no + +echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || \ + test -n "$runpath_var CXX" || \ + test "X$hardcode_automatic_CXX"="Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_CXX" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no && + test "$hardcode_minus_L_CXX" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 +echo "${ECHO_T}$hardcode_action_CXX" >&6 + +if test "$hardcode_action_CXX" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +striplib= +old_striplib= +echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + ;; + *) + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + ;; + esac +fi + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dl_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + echo "$as_me:$LINENO: checking for shl_load" >&5 +echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 +if test "${ac_cv_func_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define shl_load to an innocuous variant, in case declares shl_load. + For example, HP-UX 11i declares gettimeofday. */ +#define shl_load innocuous_shl_load + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shl_load (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef shl_load + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shl_load (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_shl_load) || defined (__stub___shl_load) +choke me +#else +char (*f) () = shl_load; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != shl_load; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_shl_load=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 +echo "${ECHO_T}$ac_cv_func_shl_load" >&6 +if test $ac_cv_func_shl_load = yes; then + lt_cv_dlopen="shl_load" +else + echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 +if test "${ac_cv_lib_dld_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shl_load (); +int +main () +{ +shl_load (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dld_shl_load=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 +if test $ac_cv_lib_dld_shl_load = yes; then + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" +else + echo "$as_me:$LINENO: checking for dlopen" >&5 +echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 +if test "${ac_cv_func_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define dlopen to an innocuous variant, in case declares dlopen. + For example, HP-UX 11i declares gettimeofday. */ +#define dlopen innocuous_dlopen + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char dlopen (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef dlopen + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_dlopen) || defined (__stub___dlopen) +choke me +#else +char (*f) () = dlopen; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != dlopen; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 +echo "${ECHO_T}$ac_cv_func_dlopen" >&6 +if test $ac_cv_func_dlopen = yes; then + lt_cv_dlopen="dlopen" +else + echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dl_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 +echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 +if test "${ac_cv_lib_svld_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_svld_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_svld_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 +if test $ac_cv_lib_svld_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 +echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 +if test "${ac_cv_lib_dld_dld_link+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dld_link (); +int +main () +{ +dld_link (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_dld_link=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dld_dld_link=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 +if test $ac_cv_lib_dld_dld_link = yes; then + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 +echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 +if test "${lt_cv_dlopen_self+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self" >&6 + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 +echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 +if test "${lt_cv_dlopen_self_static+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_CXX \ + CC_CXX \ + LD_CXX \ + lt_prog_compiler_wl_CXX \ + lt_prog_compiler_pic_CXX \ + lt_prog_compiler_static_CXX \ + lt_prog_compiler_no_builtin_flag_CXX \ + export_dynamic_flag_spec_CXX \ + thread_safe_flag_spec_CXX \ + whole_archive_flag_spec_CXX \ + enable_shared_with_static_runtimes_CXX \ + old_archive_cmds_CXX \ + old_archive_from_new_cmds_CXX \ + predep_objects_CXX \ + postdep_objects_CXX \ + predeps_CXX \ + postdeps_CXX \ + compiler_lib_search_path_CXX \ + archive_cmds_CXX \ + archive_expsym_cmds_CXX \ + postinstall_cmds_CXX \ + postuninstall_cmds_CXX \ + old_archive_from_expsyms_cmds_CXX \ + allow_undefined_flag_CXX \ + no_undefined_flag_CXX \ + export_symbols_cmds_CXX \ + hardcode_libdir_flag_spec_CXX \ + hardcode_libdir_flag_spec_ld_CXX \ + hardcode_libdir_separator_CXX \ + hardcode_automatic_CXX \ + module_cmds_CXX \ + module_expsym_cmds_CXX \ + lt_cv_prog_compiler_c_o_CXX \ + exclude_expsyms_CXX \ + include_expsyms_CXX; do + + case $var in + old_archive_cmds_CXX | \ + old_archive_from_new_cmds_CXX | \ + archive_cmds_CXX | \ + archive_expsym_cmds_CXX | \ + module_cmds_CXX | \ + module_expsym_cmds_CXX | \ + old_archive_from_expsyms_cmds_CXX | \ + export_symbols_cmds_CXX | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_CXX + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_CXX +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_CXX + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_CXX + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_CXX + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_CXX" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld + + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu + + +archive_cmds_need_lc_F77=no +allow_undefined_flag_F77= +always_export_symbols_F77=no +archive_expsym_cmds_F77= +export_dynamic_flag_spec_F77= +hardcode_direct_F77=no +hardcode_libdir_flag_spec_F77= +hardcode_libdir_flag_spec_ld_F77= +hardcode_libdir_separator_F77= +hardcode_minus_L_F77=no +hardcode_automatic_F77=no +module_cmds_F77= +module_expsym_cmds_F77= +link_all_deplibs_F77=unknown +old_archive_cmds_F77=$old_archive_cmds +no_undefined_flag_F77= +whole_archive_flag_spec_F77= +enable_shared_with_static_runtimes_F77=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +objext_F77=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code=" subroutine t\n return\n end\n" + +# Code to be used in simple link tests +lt_simple_link_test_code=" program t\n end\n" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${F77-"f77"} +compiler=$CC +compiler_F77=$CC +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $can_build_shared" >&5 +echo "${ECHO_T}$can_build_shared" >&6 + +echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 +echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; +aix4* | aix5*) + test "$enable_shared" = yes && enable_static=no + ;; +esac +echo "$as_me:$LINENO: result: $enable_shared" >&5 +echo "${ECHO_T}$enable_shared" >&6 + +echo "$as_me:$LINENO: checking whether to build static libraries" >&5 +echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +echo "$as_me:$LINENO: result: $enable_static" >&5 +echo "${ECHO_T}$enable_static" >&6 + +test "$ld_shlibs_F77" = no && can_build_shared=no + +GCC_F77="$G77" +LD_F77="$LD" + +lt_prog_compiler_wl_F77= +lt_prog_compiler_pic_F77= +lt_prog_compiler_static_F77= + +echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 + + if test "$GCC" = yes; then + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_static_F77='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_F77='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared_F77=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_F77=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl_F77='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + else + lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static_F77='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static_F77='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-static' + ;; + ccc*) + lt_prog_compiler_wl_F77='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl_F77='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + + sco3.2v5*) + lt_prog_compiler_pic_F77='-Kpic' + lt_prog_compiler_static_F77='-dn' + ;; + + solaris*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sunos4*) + lt_prog_compiler_wl_F77='-Qoption ld ' + lt_prog_compiler_pic_F77='-PIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic_F77='-Kconform_pic' + lt_prog_compiler_static_F77='-Bstatic' + fi + ;; + + uts4*) + lt_prog_compiler_pic_F77='-pic' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared_F77=no + ;; + esac + fi + +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6 + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_F77"; then + +echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6 +if test "${lt_prog_compiler_pic_works_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_pic_works_F77=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_F77" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:15395: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:15399: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_prog_compiler_pic_works_F77=yes + fi + fi + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6 + +if test x"$lt_prog_compiler_pic_works_F77" = xyes; then + case $lt_prog_compiler_pic_F77 in + "" | " "*) ;; + *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; + esac +else + lt_prog_compiler_pic_F77= + lt_prog_compiler_can_build_shared_F77=no +fi + +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_F77= + ;; + *) + lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" + ;; +esac + +echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 +if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_c_o_F77=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:15455: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:15459: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + lt_cv_prog_compiler_c_o_F77=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6 + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6 + if test "$hard_links" = no; then + { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 + + runpath_var= + allow_undefined_flag_F77= + enable_shared_with_static_runtimes_F77=no + archive_cmds_F77= + archive_expsym_cmds_F77= + old_archive_From_new_cmds_F77= + old_archive_from_expsyms_cmds_F77= + export_dynamic_flag_spec_F77= + whole_archive_flag_spec_F77= + thread_safe_flag_spec_F77= + hardcode_libdir_flag_spec_F77= + hardcode_libdir_flag_spec_ld_F77= + hardcode_libdir_separator_F77= + hardcode_direct_F77=no + hardcode_minus_L_F77=no + hardcode_shlibpath_var_F77=unsupported + link_all_deplibs_F77=unknown + hardcode_automatic_F77=no + module_cmds_F77= + module_expsym_cmds_F77= + always_export_symbols_F77=no + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms_F77= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms_F77="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs_F77=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs_F77=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs_F77=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_F77=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_F77='-L$libdir' + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=no + enable_shared_with_static_runtimes_F77=yes + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs_F77=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + sunos4*) + archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_cmds_F77="$tmp_archive_cmds" + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + archive_expsym_cmds_F77="$tmp_archive_cmds" + fi + else + ld_shlibs_F77=no + fi + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + esac + + if test "$ld_shlibs_F77" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_F77='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_F77= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=yes + archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_F77=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_F77=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_F77='' + hardcode_direct_F77=yes + hardcode_libdir_separator_F77=':' + link_all_deplibs_F77=yes + + if test "$GCC" = yes; then + case $host_os in aix4.012|aix4.012.*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct_F77=yes + else + # We have old collect2 + hardcode_direct_F77=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_F77=yes + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_libdir_separator_F77= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_F77=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_F77='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_f77_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_F77="-z nodefs" + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_f77_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_F77=' ${wl}-bernotok' + allow_undefined_flag_F77=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + always_export_symbols_F77=yes + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_F77=' ' + archive_cmds_need_lc_F77=yes + # This is similar to how AIX traditionally builds it's shared libraries. + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + # see comment about different semantics on the GNU ld section + ld_shlibs_F77=no + ;; + + bsdi4*) + export_dynamic_flag_spec_F77=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_F77=' ' + allow_undefined_flag_F77=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds_F77='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes_F77=yes + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes ; then + archive_cmds_need_lc_F77=no + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag_F77='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_F77='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_F77='-flat_namespace -undefined suppress' + ;; + 10.*) + allow_undefined_flag_F77='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_cmds_F77='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + archive_cmds_F77='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + module_cmds_F77='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + hardcode_direct_F77=no + hardcode_automatic_F77=yes + hardcode_shlibpath_var_F77=unsupported + whole_archive_flag_spec_F77='-all_load $convenience' + link_all_deplibs_F77=yes + else + ld_shlibs_F77=no + fi + ;; + + dgux*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + freebsd1*) + ld_shlibs_F77=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_F77='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld_F77='+b $libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + ;; + ia64*) + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + ;; + *) + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld_F77='-rpath $libdir' + fi + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + link_all_deplibs_F77=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + newsos6) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_shlibpath_var_F77=no + ;; + + openbsd*) + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + export_dynamic_flag_spec_F77='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-R$libdir' + ;; + *) + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + allow_undefined_flag_F77=unsupported + archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_F77='-rpath $libdir' + fi + hardcode_libdir_separator_F77=: + ;; + + sco3.2v5*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + export_dynamic_flag_spec_F77='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + no_undefined_flag_F77=' -z text' + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_shlibpath_var_F77=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;; + esac + link_all_deplibs_F77=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds_F77='$CC -r -o $output$reload_objs' + hardcode_direct_F77=no + ;; + motorola) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_F77=no + ;; + + sysv4.3*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + export_dynamic_flag_spec_F77='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs_F77=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_minus_L_F77=no + hardcode_shlibpath_var_F77=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + no_undefined_flag_F77='${wl}-z ${wl}text' + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_F77=no + ;; + + sysv5*) + no_undefined_flag_F77=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec_F77= + hardcode_shlibpath_var_F77=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + *) + ld_shlibs_F77=no + ;; + esac + fi + +echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5 +echo "${ECHO_T}$ld_shlibs_F77" >&6 +test "$ld_shlibs_F77" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_F77" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_F77=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_F77 in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_F77 + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_F77 + allow_undefined_flag_F77= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_F77=no + else + archive_cmds_need_lc_F77=yes + fi + allow_undefined_flag_F77=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5 +echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6 + ;; + esac + fi + ;; +esac + +echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.01* | freebsdelf3.01*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=yes + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6 +test "$dynamic_linker" = no && can_build_shared=no + +echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +hardcode_action_F77= +if test -n "$hardcode_libdir_flag_spec_F77" || \ + test -n "$runpath_var F77" || \ + test "X$hardcode_automatic_F77"="Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_F77" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no && + test "$hardcode_minus_L_F77" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_F77=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_F77=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_F77=unsupported +fi +echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5 +echo "${ECHO_T}$hardcode_action_F77" >&6 + +if test "$hardcode_action_F77" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +striplib= +old_striplib= +echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + ;; + *) + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + ;; + esac +fi + + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_F77 \ + CC_F77 \ + LD_F77 \ + lt_prog_compiler_wl_F77 \ + lt_prog_compiler_pic_F77 \ + lt_prog_compiler_static_F77 \ + lt_prog_compiler_no_builtin_flag_F77 \ + export_dynamic_flag_spec_F77 \ + thread_safe_flag_spec_F77 \ + whole_archive_flag_spec_F77 \ + enable_shared_with_static_runtimes_F77 \ + old_archive_cmds_F77 \ + old_archive_from_new_cmds_F77 \ + predep_objects_F77 \ + postdep_objects_F77 \ + predeps_F77 \ + postdeps_F77 \ + compiler_lib_search_path_F77 \ + archive_cmds_F77 \ + archive_expsym_cmds_F77 \ + postinstall_cmds_F77 \ + postuninstall_cmds_F77 \ + old_archive_from_expsyms_cmds_F77 \ + allow_undefined_flag_F77 \ + no_undefined_flag_F77 \ + export_symbols_cmds_F77 \ + hardcode_libdir_flag_spec_F77 \ + hardcode_libdir_flag_spec_ld_F77 \ + hardcode_libdir_separator_F77 \ + hardcode_automatic_F77 \ + module_cmds_F77 \ + module_expsym_cmds_F77 \ + lt_cv_prog_compiler_c_o_F77 \ + exclude_expsyms_F77 \ + include_expsyms_F77; do + + case $var in + old_archive_cmds_F77 | \ + old_archive_from_new_cmds_F77 | \ + archive_cmds_F77 | \ + archive_expsym_cmds_F77 | \ + module_cmds_F77 | \ + module_expsym_cmds_F77 | \ + old_archive_from_expsyms_cmds_F77 | \ + export_symbols_cmds_F77 | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_F77 + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler_F77 + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_F77 + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_F77 + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_F77 + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_F77 +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_F77 + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77 + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_F77 +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_F77 +archive_expsym_cmds=$lt_archive_expsym_cmds_F77 +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_F77 +module_expsym_cmds=$lt_module_expsym_cmds_F77 + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_F77 + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_F77 + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_F77 + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_F77 + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_F77 + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_F77 + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_F77 + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_F77 + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77 + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_F77 + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_F77 + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_F77 + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_F77 + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_F77" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_F77 + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_F77 + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_F77 + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_F77 + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +objext_GCJ=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String argv) {}; }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${GCJ-"gcj"} +compiler=$CC +compiler_GCJ=$CC + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +archive_cmds_need_lc_GCJ=no + + +lt_prog_compiler_no_builtin_flag_GCJ= + +if test "$GCC" = yes; then + lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' + + +echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 +if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:17488: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:17492: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" +else + : +fi + +fi + +lt_prog_compiler_wl_GCJ= +lt_prog_compiler_pic_GCJ= +lt_prog_compiler_static_GCJ= + +echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 + + if test "$GCC" = yes; then + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_static_GCJ='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_GCJ='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_GCJ='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared_GCJ=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_GCJ=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_GCJ='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic_GCJ='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl_GCJ='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_GCJ='-Bstatic' + else + lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl_GCJ='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_GCJ='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl_GCJ='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-static' + ;; + ccc*) + lt_prog_compiler_wl_GCJ='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl_GCJ='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + + sco3.2v5*) + lt_prog_compiler_pic_GCJ='-Kpic' + lt_prog_compiler_static_GCJ='-dn' + ;; + + solaris*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sunos4*) + lt_prog_compiler_wl_GCJ='-Qoption ld ' + lt_prog_compiler_pic_GCJ='-PIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic_GCJ='-Kconform_pic' + lt_prog_compiler_static_GCJ='-Bstatic' + fi + ;; + + uts4*) + lt_prog_compiler_pic_GCJ='-pic' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared_GCJ=no + ;; + esac + fi + +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6 + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_GCJ"; then + +echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6 +if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_pic_works_GCJ=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_GCJ" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:17721: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:17725: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_prog_compiler_pic_works_GCJ=yes + fi + fi + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6 + +if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then + case $lt_prog_compiler_pic_GCJ in + "" | " "*) ;; + *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;; + esac +else + lt_prog_compiler_pic_GCJ= + lt_prog_compiler_can_build_shared_GCJ=no +fi + +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_GCJ= + ;; + *) + lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ" + ;; +esac + +echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 +if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_c_o_GCJ=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:17781: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:17785: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + lt_cv_prog_compiler_c_o_GCJ=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6 + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6 + if test "$hard_links" = no; then + { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 + + runpath_var= + allow_undefined_flag_GCJ= + enable_shared_with_static_runtimes_GCJ=no + archive_cmds_GCJ= + archive_expsym_cmds_GCJ= + old_archive_From_new_cmds_GCJ= + old_archive_from_expsyms_cmds_GCJ= + export_dynamic_flag_spec_GCJ= + whole_archive_flag_spec_GCJ= + thread_safe_flag_spec_GCJ= + hardcode_libdir_flag_spec_GCJ= + hardcode_libdir_flag_spec_ld_GCJ= + hardcode_libdir_separator_GCJ= + hardcode_direct_GCJ=no + hardcode_minus_L_GCJ=no + hardcode_shlibpath_var_GCJ=unsupported + link_all_deplibs_GCJ=unknown + hardcode_automatic_GCJ=no + module_cmds_GCJ= + module_expsym_cmds_GCJ= + always_export_symbols_GCJ=no + export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms_GCJ= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms_GCJ="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs_GCJ=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs_GCJ=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs_GCJ=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_GCJ=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_GCJ='-L$libdir' + allow_undefined_flag_GCJ=unsupported + always_export_symbols_GCJ=no + enable_shared_with_static_runtimes_GCJ=yes + export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs_GCJ=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + + sunos4*) + archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_cmds_GCJ="$tmp_archive_cmds" + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + archive_expsym_cmds_GCJ="$tmp_archive_cmds" + fi + else + ld_shlibs_GCJ=no + fi + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + esac + + if test "$ld_shlibs_GCJ" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_GCJ='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_GCJ= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag_GCJ=unsupported + always_export_symbols_GCJ=yes + archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_GCJ=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_GCJ=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_GCJ='' + hardcode_direct_GCJ=yes + hardcode_libdir_separator_GCJ=':' + link_all_deplibs_GCJ=yes + + if test "$GCC" = yes; then + case $host_os in aix4.012|aix4.012.*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct_GCJ=yes + else + # We have old collect2 + hardcode_direct_GCJ=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_GCJ=yes + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_libdir_separator_GCJ= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_GCJ=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_GCJ='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_GCJ="-z nodefs" + archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_GCJ=' ${wl}-bernotok' + allow_undefined_flag_GCJ=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + always_export_symbols_GCJ=yes + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_GCJ=' ' + archive_cmds_need_lc_GCJ=yes + # This is similar to how AIX traditionally builds it's shared libraries. + archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + # see comment about different semantics on the GNU ld section + ld_shlibs_GCJ=no + ;; + + bsdi4*) + export_dynamic_flag_spec_GCJ=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_GCJ=' ' + allow_undefined_flag_GCJ=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds_GCJ='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes_GCJ=yes + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes ; then + archive_cmds_need_lc_GCJ=no + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag_GCJ='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_GCJ='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_GCJ='-flat_namespace -undefined suppress' + ;; + 10.*) + allow_undefined_flag_GCJ='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_cmds_GCJ='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + archive_cmds_GCJ='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + module_cmds_GCJ='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + hardcode_direct_GCJ=no + hardcode_automatic_GCJ=yes + hardcode_shlibpath_var_GCJ=unsupported + whole_archive_flag_spec_GCJ='-all_load $convenience' + link_all_deplibs_GCJ=yes + else + ld_shlibs_GCJ=no + fi + ;; + + dgux*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_shlibpath_var_GCJ=no + ;; + + freebsd1*) + ld_shlibs_GCJ=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_direct_GCJ=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_GCJ='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld_GCJ='+b $libdir' + hardcode_libdir_separator_GCJ=: + hardcode_direct_GCJ=no + hardcode_shlibpath_var_GCJ=no + ;; + ia64*) + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_direct_GCJ=no + hardcode_shlibpath_var_GCJ=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + ;; + *) + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_direct_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir' + fi + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + link_all_deplibs_GCJ=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + newsos6) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_shlibpath_var_GCJ=no + ;; + + openbsd*) + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + export_dynamic_flag_spec_GCJ='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + ;; + *) + archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + allow_undefined_flag_GCJ=unsupported + archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag_GCJ=' -expect_unresolved \*' + archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag_GCJ=' -expect_unresolved \*' + archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_GCJ='-rpath $libdir' + fi + hardcode_libdir_separator_GCJ=: + ;; + + sco3.2v5*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + export_dynamic_flag_spec_GCJ='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + no_undefined_flag_GCJ=' -z text' + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_shlibpath_var_GCJ=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;; + esac + link_all_deplibs_GCJ=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds_GCJ='$CC -r -o $output$reload_objs' + hardcode_direct_GCJ=no + ;; + motorola) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_GCJ=no + ;; + + sysv4.3*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + export_dynamic_flag_spec_GCJ='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs_GCJ=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=no + hardcode_shlibpath_var_GCJ=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + no_undefined_flag_GCJ='${wl}-z ${wl}text' + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_GCJ=no + ;; + + sysv5*) + no_undefined_flag_GCJ=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec_GCJ= + hardcode_shlibpath_var_GCJ=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_shlibpath_var_GCJ=no + ;; + + *) + ld_shlibs_GCJ=no + ;; + esac + fi + +echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5 +echo "${ECHO_T}$ld_shlibs_GCJ" >&6 +test "$ld_shlibs_GCJ" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_GCJ" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_GCJ=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_GCJ in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_GCJ + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ + allow_undefined_flag_GCJ= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_GCJ=no + else + archive_cmds_need_lc_GCJ=yes + fi + allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5 +echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6 + ;; + esac + fi + ;; +esac + +echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.01* | freebsdelf3.01*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=yes + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6 +test "$dynamic_linker" = no && can_build_shared=no + +echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +hardcode_action_GCJ= +if test -n "$hardcode_libdir_flag_spec_GCJ" || \ + test -n "$runpath_var GCJ" || \ + test "X$hardcode_automatic_GCJ"="Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_GCJ" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && + test "$hardcode_minus_L_GCJ" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_GCJ=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_GCJ=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_GCJ=unsupported +fi +echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 +echo "${ECHO_T}$hardcode_action_GCJ" >&6 + +if test "$hardcode_action_GCJ" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +striplib= +old_striplib= +echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + ;; + *) + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + ;; + esac +fi + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dl_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + echo "$as_me:$LINENO: checking for shl_load" >&5 +echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 +if test "${ac_cv_func_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define shl_load to an innocuous variant, in case declares shl_load. + For example, HP-UX 11i declares gettimeofday. */ +#define shl_load innocuous_shl_load + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shl_load (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef shl_load + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shl_load (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_shl_load) || defined (__stub___shl_load) +choke me +#else +char (*f) () = shl_load; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != shl_load; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_shl_load=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 +echo "${ECHO_T}$ac_cv_func_shl_load" >&6 +if test $ac_cv_func_shl_load = yes; then + lt_cv_dlopen="shl_load" +else + echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 +if test "${ac_cv_lib_dld_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shl_load (); +int +main () +{ +shl_load (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dld_shl_load=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 +if test $ac_cv_lib_dld_shl_load = yes; then + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" +else + echo "$as_me:$LINENO: checking for dlopen" >&5 +echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 +if test "${ac_cv_func_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define dlopen to an innocuous variant, in case declares dlopen. + For example, HP-UX 11i declares gettimeofday. */ +#define dlopen innocuous_dlopen + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char dlopen (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef dlopen + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_dlopen) || defined (__stub___dlopen) +choke me +#else +char (*f) () = dlopen; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != dlopen; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 +echo "${ECHO_T}$ac_cv_func_dlopen" >&6 +if test $ac_cv_func_dlopen = yes; then + lt_cv_dlopen="dlopen" +else + echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dl_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 +echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 +if test "${ac_cv_lib_svld_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_svld_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_svld_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 +if test $ac_cv_lib_svld_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 +echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 +if test "${ac_cv_lib_dld_dld_link+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dld_link (); +int +main () +{ +dld_link (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_dld_link=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dld_dld_link=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 +if test $ac_cv_lib_dld_dld_link = yes; then + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 +echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 +if test "${lt_cv_dlopen_self+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self" >&6 + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 +echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 +if test "${lt_cv_dlopen_self_static+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_GCJ \ + CC_GCJ \ + LD_GCJ \ + lt_prog_compiler_wl_GCJ \ + lt_prog_compiler_pic_GCJ \ + lt_prog_compiler_static_GCJ \ + lt_prog_compiler_no_builtin_flag_GCJ \ + export_dynamic_flag_spec_GCJ \ + thread_safe_flag_spec_GCJ \ + whole_archive_flag_spec_GCJ \ + enable_shared_with_static_runtimes_GCJ \ + old_archive_cmds_GCJ \ + old_archive_from_new_cmds_GCJ \ + predep_objects_GCJ \ + postdep_objects_GCJ \ + predeps_GCJ \ + postdeps_GCJ \ + compiler_lib_search_path_GCJ \ + archive_cmds_GCJ \ + archive_expsym_cmds_GCJ \ + postinstall_cmds_GCJ \ + postuninstall_cmds_GCJ \ + old_archive_from_expsyms_cmds_GCJ \ + allow_undefined_flag_GCJ \ + no_undefined_flag_GCJ \ + export_symbols_cmds_GCJ \ + hardcode_libdir_flag_spec_GCJ \ + hardcode_libdir_flag_spec_ld_GCJ \ + hardcode_libdir_separator_GCJ \ + hardcode_automatic_GCJ \ + module_cmds_GCJ \ + module_expsym_cmds_GCJ \ + lt_cv_prog_compiler_c_o_GCJ \ + exclude_expsyms_GCJ \ + include_expsyms_GCJ; do + + case $var in + old_archive_cmds_GCJ | \ + old_archive_from_new_cmds_GCJ | \ + archive_cmds_GCJ | \ + archive_expsym_cmds_GCJ | \ + module_cmds_GCJ | \ + module_expsym_cmds_GCJ | \ + old_archive_from_expsyms_cmds_GCJ | \ + export_symbols_cmds_GCJ | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_GCJ + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler_GCJ + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_GCJ + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_GCJ + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_GCJ + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_GCJ +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_GCJ + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_GCJ +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_GCJ +archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_GCJ +module_expsym_cmds=$lt_module_expsym_cmds_GCJ + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_GCJ + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_GCJ + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_GCJ + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_GCJ + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_GCJ + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_GCJ + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_GCJ + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_GCJ + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_GCJ + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_GCJ + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_GCJ + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_GCJ" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_GCJ + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_GCJ + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_GCJ + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_GCJ + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + else + tagname="" + fi + ;; + + RC) + + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +objext_RC=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${RC-"windres"} +compiler=$CC +compiler_RC=$CC +lt_cv_prog_compiler_c_o_RC=yes + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_RC \ + CC_RC \ + LD_RC \ + lt_prog_compiler_wl_RC \ + lt_prog_compiler_pic_RC \ + lt_prog_compiler_static_RC \ + lt_prog_compiler_no_builtin_flag_RC \ + export_dynamic_flag_spec_RC \ + thread_safe_flag_spec_RC \ + whole_archive_flag_spec_RC \ + enable_shared_with_static_runtimes_RC \ + old_archive_cmds_RC \ + old_archive_from_new_cmds_RC \ + predep_objects_RC \ + postdep_objects_RC \ + predeps_RC \ + postdeps_RC \ + compiler_lib_search_path_RC \ + archive_cmds_RC \ + archive_expsym_cmds_RC \ + postinstall_cmds_RC \ + postuninstall_cmds_RC \ + old_archive_from_expsyms_cmds_RC \ + allow_undefined_flag_RC \ + no_undefined_flag_RC \ + export_symbols_cmds_RC \ + hardcode_libdir_flag_spec_RC \ + hardcode_libdir_flag_spec_ld_RC \ + hardcode_libdir_separator_RC \ + hardcode_automatic_RC \ + module_cmds_RC \ + module_expsym_cmds_RC \ + lt_cv_prog_compiler_c_o_RC \ + exclude_expsyms_RC \ + include_expsyms_RC; do + + case $var in + old_archive_cmds_RC | \ + old_archive_from_new_cmds_RC | \ + archive_cmds_RC | \ + archive_expsym_cmds_RC | \ + module_cmds_RC | \ + module_expsym_cmds_RC | \ + old_archive_from_expsyms_cmds_RC | \ + export_symbols_cmds_RC | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_RC + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler_RC + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_RC + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_RC + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_RC + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_RC +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_RC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_RC +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_RC +archive_expsym_cmds=$lt_archive_expsym_cmds_RC +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_RC +module_expsym_cmds=$lt_module_expsym_cmds_RC + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_RC + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_RC + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_RC + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_RC + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_RC + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_RC + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_RC + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_RC + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_RC + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_RC + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_RC + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_RC + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_RC + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_RC" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_RC + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_RC + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_RC + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_RC + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + ;; + + *) + { { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5 +echo "$as_me: error: Unsupported tag name: $tagname" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5 +echo "$as_me: error: unable to update list of available tagged configurations." >&2;} + { (exit 1); exit 1; }; } + fi +fi @@ -8752,9 +21056,46 @@ LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + +# urgh -- these are internal libtool variables... + + + + + +# configuration file -- stay in 8.3 limit +# +# since #undef doesn't survive in configuration header files we replace +# `/undef' with `#undef' after creating the output file + + ac_config_headers="$ac_config_headers ftconfig.h:ftconfig.in" + + +# create the Unix-specific sub-Makefiles `builds/unix/unix-def.mk' +# and 'builds/unix/unix-cc.mk' that will be used by the build system +# ac_config_files="$ac_config_files unix-cc.mk:unix-cc.in unix-def.mk:unix-def.in freetype-config freetype2.pc:freetype2.in" +# re-generate the Jamfile to use libtool now +# +# AC_CONFIG_FILES([../../Jamfile:../../Jamfile.in]) cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -8784,13 +21125,13 @@ _ACEOF # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } | @@ -8801,7 +21142,7 @@ _ACEOF t end /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ : end' >>confcache -if cmp -s $cache_file confcache; then :; else +if diff $cache_file confcache >/dev/null 2>&1; then :; else if test -w $cache_file; then test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" cat confcache >$cache_file @@ -8820,13 +21161,13 @@ test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ + ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; -s/^\([^=]*=[ ]*\):*/\1/; +s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; -s/^[^=]*=[ ]*$//; +s/^[^=]*=[ ]*$//; }' fi @@ -8836,8 +21177,8 @@ ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. - ac_i=`echo "$ac_i" | - sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`echo "$ac_i" | sed "$ac_script"` # 2. Add them. ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' @@ -8861,6 +21202,8 @@ cat >$CONFIG_STATUS <<_ACEOF # configure, is in config.log if it exists. debug=false +ac_cs_recheck=false +ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF @@ -8879,15 +21222,63 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi +DUALCASE=1; export DUALCASE # for MKS sh + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi # Support unset when possible. -if (FOO=FOO; unset FOO) >/dev/null 2>&1; then +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi +# Find who we are. Look in the path if we contain no path at all +# relative or not. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } +fi + # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' @@ -8895,9 +21286,12 @@ PS2='> ' PS4='+ ' # NLS nuisances. -for as_var in LANG LANGUAGE LC_ALL LC_COLLATE LC_CTYPE LC_NUMERIC LC_MESSAGES LC_TIME +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME do - if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var @@ -8931,102 +21325,38 @@ echo X/"$0" | s/.*/./; q'` -# PATH needs CR, and LINENO needs CR and PATH. -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conftest.sh - echo "exit 0" >>conftest.sh - chmod +x conftest.sh - if (PATH="/nonexistent;."; conftest.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conftest.sh -fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" || { - # Find who we are. Look in the path if we contain no path at all - # relative or not. - case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done - - ;; - esac - # We did not find ourselves, most probably we were run as `sh COMMAND' - # in which case we are not to be found in the path. - if test "x$as_myself" = x; then - as_myself=$0 - fi - if test ! -f "$as_myself"; then - { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 -echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} - { (exit 1); exit 1; }; } - fi - case $CONFIG_SHELL in - '') - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for as_base in sh bash ksh sh5; do - case $as_dir in - /*) - if ("$as_dir/$as_base" -c ' - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then - $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } - $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } - CONFIG_SHELL=$as_dir/$as_base - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$0" ${1+"$@"} - fi;; - esac - done -done -;; - esac + test "x$as_lineno_3" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line before each line; the second 'sed' does the real - # work. The second script uses 'N' to pair each line-number line - # with the numbered line, and appends trailing '-' during - # substitution so that $LINENO is not a special case at line end. + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) - sed '=' <$as_myself | + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | sed ' + s,[$]LINENO.*,&-, + t lineno + b + : lineno N - s,$,-, : loop - s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + s,[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\),\2\1\2, t loop - s,-$,, - s,^['$as_cr_digits']*\n,, + s,-\n.*,, ' >$as_me.lineno && chmod +x $as_me.lineno || { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 @@ -9076,16 +21406,17 @@ rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else + test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. -as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. -as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS @@ -9112,7 +21443,7 @@ _ASBOX cat >&5 <<_CSEOF This file was extended by $as_me, which was -generated by GNU Autoconf 2.54. Invocation command line was +generated by GNU Autoconf 2.59a. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -9152,12 +21483,13 @@ Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number, then exit + -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] - instantiate the configuration file FILE + instantiate the configuration file FILE --header=FILE[:TEMPLATE] - instantiate the configuration header FILE + instantiate the configuration header FILE Configuration files: $config_files @@ -9171,11 +21503,10 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ config.status -configured by $0, generated by GNU Autoconf 2.54, +configured by $0, generated by GNU Autoconf 2.59a, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" -Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 -Free Software Foundation, Inc. +Copyright (C) 2004 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." srcdir=$srcdir @@ -9208,12 +21539,9 @@ do case $ac_option in # Handling of the options. _ACEOF -cat >>$CONFIG_STATUS <<_ACEOF - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - echo "running $SHELL $0 " $ac_configure_args " --no-create --no-recursion" - exec $SHELL $0 $ac_configure_args --no-create --no-recursion ;; -_ACEOF cat >>$CONFIG_STATUS <<\_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; --version | --vers* | -V ) echo "$ac_cs_version"; exit 0 ;; --he | --h) @@ -9235,6 +21563,9 @@ Try \`$0 --help' for more information." >&2;} $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; # This is an error. -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 @@ -9249,6 +21580,20 @@ Try \`$0 --help' for more information." >&2;} shift done +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +if \$ac_cs_recheck; then + echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + _ACEOF @@ -9280,25 +21625,28 @@ if $ac_need_defaults; then test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason to put it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. # Create a temporary directory, and hook for its removal unless debugging. $debug || { - trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap 'exit_status=$?; rm -f -r $tmp && exit $exit_status' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. -: ${TMPDIR=/tmp} + { - tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` && + tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { - tmp=$TMPDIR/cs$$-$RANDOM + tmp=./confstat$$-$RANDOM (umask 077 && mkdir $tmp) } || { - echo "$me: cannot create a temporary directory in $TMPDIR" >&2 + echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } @@ -9375,17 +21723,30 @@ s,@RMDIR@,$RMDIR,;t t s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@GREP@,$GREP,;t t s,@EGREP@,$EGREP,;t t s,@FTSYS_SRC@,$FTSYS_SRC,;t t s,@LIBZ@,$LIBZ,;t t s,@SYSTEM_ZLIB@,$SYSTEM_ZLIB,;t t s,@LN_S@,$LN_S,;t t s,@ECHO@,$ECHO,;t t +s,@AR@,$AR,;t t +s,@ac_ct_AR@,$ac_ct_AR,;t t s,@RANLIB@,$RANLIB,;t t s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t s,@STRIP@,$STRIP,;t t s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t +s,@CXX@,$CXX,;t t +s,@CXXFLAGS@,$CXXFLAGS,;t t +s,@ac_ct_CXX@,$ac_ct_CXX,;t t +s,@CXXCPP@,$CXXCPP,;t t +s,@F77@,$F77,;t t +s,@FFLAGS@,$FFLAGS,;t t +s,@ac_ct_F77@,$ac_ct_F77,;t t s,@LIBTOOL@,$LIBTOOL,;t t +s,@enable_shared@,$enable_shared,;t t +s,@hardcode_libdir_flag_spec@,$hardcode_libdir_flag_spec,;t t +s,@wl@,$wl,;t t s,@LIBOBJS@,$LIBOBJS,;t t s,@LTLIBOBJS@,$LTLIBOBJS,;t t CEOF @@ -9417,9 +21778,9 @@ _ACEOF (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" else - ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr $ac_sed_frag + 1` ac_beg=$ac_end @@ -9437,21 +21798,21 @@ for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin - cat >$tmp/stdin - ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } @@ -9459,7 +21820,7 @@ echo X"$ac_file" | /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then - mkdir -p "$ac_dir" + test -d "$ac_dir" || mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= @@ -9467,10 +21828,10 @@ echo X"$ac_file" | as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } @@ -9508,12 +21869,45 @@ case $srcdir in ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac -# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be -# absolute. -ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` -ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` -ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` -ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac case $INSTALL in @@ -9535,7 +21929,7 @@ echo "$as_me: creating $ac_file" >&6;} configure_input="$ac_file. " fi configure_input=$configure_input"Generated from `echo $ac_file_in | - sed 's,.*/,,'` by configure." + sed 's,.*/,,'` by configure." # First look for the input files in the build tree, otherwise in the # src tree. @@ -9544,24 +21938,24 @@ echo "$as_me: creating $ac_file" >&6;} case $f in -) echo $tmp/stdin ;; [\\/$]*) - # Absolute (can't be DOS-style, as IFS=:) - test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } - echo $f;; + echo "$f";; *) # Relative - if test -f "$f"; then - # Build tree - echo $f - elif test -f "$srcdir/$f"; then - # Source tree - echo $srcdir/$f - else - # /dev/null tree - { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } - fi;; + fi;; esac done` || { (exit 1); exit 1; } _ACEOF @@ -9603,12 +21997,12 @@ cat >>$CONFIG_STATUS <<\_ACEOF # NAME is the cpp macro being defined and VALUE is the value it is being given. # # ac_d sets the value in "#define NAME VALUE" lines. -ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' -ac_dB='[ ].*$,\1#\2' +ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='[ ].*$,\1#\2' ac_dC=' ' ac_dD=',;t' # ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". -ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ac_uB='$,\1#\2define\3' ac_uC=' ' ac_uD=',;t' @@ -9617,11 +22011,11 @@ for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin - cat >$tmp/stdin - ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac @@ -9635,28 +22029,29 @@ echo "$as_me: creating $ac_file" >&6;} case $f in -) echo $tmp/stdin ;; [\\/$]*) - # Absolute (can't be DOS-style, as IFS=:) - test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } - echo $f;; + # Do quote $f, to prevent DOS paths from being IFS'd. + echo "$f";; *) # Relative - if test -f "$f"; then - # Build tree - echo $f - elif test -f "$srcdir/$f"; then - # Source tree - echo $srcdir/$f - else - # /dev/null tree - { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } - fi;; + fi;; esac done` || { (exit 1); exit 1; } # Remove the trailing spaces. - sed 's/[ ]*$//' $ac_file_inputs >$tmp/in + sed 's/[ ]*$//' $ac_file_inputs >$tmp/in _ACEOF @@ -9679,9 +22074,9 @@ s/[\\&,]/\\&/g s,[\\$`],\\&,g t clear : clear -s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp t end -s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp : end _ACEOF # If some macros were called several times there might be several times @@ -9695,13 +22090,13 @@ rm -f confdef2sed.sed # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. cat >>conftest.undefs <<\_ACEOF -s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, +s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, _ACEOF # Break up conftest.defines because some shells have a limit on the size # of here documents, and old seds have small limits too (100 cmds). echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS -echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS +echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS echo ' :' >>$CONFIG_STATUS rm -f conftest.tail @@ -9710,7 +22105,7 @@ do # Write a limited-size here document to $tmp/defines.sed. echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS # Speed up: don't consider the non `#define' lines. - echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS + echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS # Work around the forget-to-reset-the-flag bug. echo 't clr' >>$CONFIG_STATUS echo ': clr' >>$CONFIG_STATUS @@ -9737,7 +22132,7 @@ do # Write a limited-size here document to $tmp/undefs.sed. echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS # Speed up: don't consider the non `#undef' - echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS + echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS # Work around the forget-to-reset-the-flag bug. echo 't clr' >>$CONFIG_STATUS echo ': clr' >>$CONFIG_STATUS @@ -9765,16 +22160,16 @@ cat >>$CONFIG_STATUS <<\_ACEOF cat $tmp/in >>$tmp/config.h rm -f $tmp/in if test x"$ac_file" != x-; then - if cmp -s $ac_file $tmp/config.h 2>/dev/null; then + if diff $ac_file $tmp/config.h >/dev/null 2>&1; then { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 echo "$as_me: $ac_file is unchanged" >&6;} else ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } @@ -9782,7 +22177,7 @@ echo X"$ac_file" | /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then - mkdir -p "$ac_dir" + test -d "$ac_dir" || mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= @@ -9790,10 +22185,10 @@ echo X"$ac_file" | as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } @@ -9813,6 +22208,12 @@ echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} cat $tmp/config.h rm -f $tmp/config.h fi + # Run the commands associated with the file. + case $ac_file in + ftconfig.h ) mv ftconfig.h ftconfig.tmp + sed 's|/undef|#undef|' < ftconfig.tmp > ftconfig.h + rm ftconfig.tmp ;; + esac done _ACEOF @@ -9834,8 +22235,11 @@ ac_clean_files=$ac_clean_files_save # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null - $SHELL $CONFIG_STATUS || ac_cs_success=false + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. @@ -9843,3 +22247,4 @@ if test "$no_create" != yes; then fi +# end of configure.ac diff --git a/reactos/lib/freetype/builds/unix/configure.ac b/reactos/lib/freetype/builds/unix/configure.ac index 5f4d7ef82ab..1cddcaccdc1 100644 --- a/reactos/lib/freetype/builds/unix/configure.ac +++ b/reactos/lib/freetype/builds/unix/configure.ac @@ -1,91 +1,121 @@ -dnl This file is part of the FreeType project. -dnl -dnl Process this file with autoconf to produce a configure script. -dnl +# This file is part of the FreeType project. +# +# Process this file with autoconf to produce a configure script. AC_INIT AC_CONFIG_SRCDIR([ftconfig.in]) -dnl configuration file -- stay in 8.3 limit -AC_CONFIG_HEADER(ftconfig.h:ftconfig.in) -dnl Don't forget to update VERSION.DLL! -version_info='9:4:3' -AC_SUBST(version_info) +# Don't forget to update docs/VERSION.DLL! + +version_info='9:6:3' +AC_SUBST([version_info]) ft_version=`echo $version_info | tr : .` -AC_SUBST(ft_version) +AC_SUBST([ft_version]) -dnl checks for system type -AC_CANONICAL_TARGET([]) -dnl checks for programs +# checks for system type + +AC_CANONICAL_TARGET + + +# checks for programs + AC_PROG_CC AC_PROG_CPP -dnl get Compiler flags right. + +# get compiler flags right + if test "x$CC" = xgcc; then XX_CFLAGS="-Wall" XX_ANSIFLAGS="-pedantic -ansi" else case "$host" in - *-dec-osf*) - CFLAGS= - XX_CFLAGS="-std1 -g3" - XX_ANSIFLAGS= - ;; - *) - XX_CFLAGS= - XX_ANSIFLAGS= - ;; + *-dec-osf*) + CFLAGS= + XX_CFLAGS="-std1 -g3" + XX_ANSIFLAGS= + ;; + *) + XX_CFLAGS= + XX_ANSIFLAGS= + ;; esac fi -AC_SUBST(XX_CFLAGS) -AC_SUBST(XX_ANSIFLAGS) +AC_SUBST([XX_CFLAGS]) +AC_SUBST([XX_ANSIFLAGS]) -AC_CHECK_PROG(RMF, rm, rm -f) -AC_CHECK_PROG(RMDIR, rmdir, rmdir) -dnl Since this file will be finally moved to another directory we make -dnl the path of the install script absolute. This small code snippet has -dnl been taken from automake's `ylwrap' script. +# auxiliary programs + +AC_CHECK_PROG([RMF], [rm], [rm -f]) +AC_CHECK_PROG([RMDIR], [rmdir], [rmdir]) + + +# Since this file will be finally moved to another directory we make +# the path of the install script absolute. This small code snippet has +# been taken from automake's `ylwrap' script. + AC_PROG_INSTALL case "$INSTALL" in - /*) - ;; - */*) - INSTALL="`pwd`/$INSTALL" ;; +/*) + ;; +*/*) + INSTALL="`pwd`/$INSTALL" ;; esac -dnl checks for header files + +# checks for header files + AC_HEADER_STDC -AC_CHECK_HEADERS(fcntl.h unistd.h) +AC_CHECK_HEADERS([fcntl.h unistd.h]) + + +# checks for typedefs, structures, and compiler characteristics -dnl checks for typedefs, structures, and compiler characteristics AC_C_CONST -AC_CHECK_SIZEOF(int) -AC_CHECK_SIZEOF(long) +AC_CHECK_SIZEOF([int]) +AC_CHECK_SIZEOF([long]) -dnl checks for library functions -dnl Here we check whether we can use our mmap file component. +# checks for library functions + +# Here we check whether we can use our mmap file component. + AC_FUNC_MMAP if test "$ac_cv_func_mmap_fixed_mapped" != yes; then FTSYS_SRC='$(BASE_DIR)/ftsystem.c' else FTSYS_SRC='$(BUILD_DIR)/ftsystem.c' - FT_MUNMAP_DECL + AC_CHECK_DECLS([munmap], + [], + [], + [ + +#ifdef HAVE_UNISTD_H +#include +#endif +#include + + ]) + FT_MUNMAP_PARAM fi -AC_SUBST(FTSYS_SRC) +AC_SUBST([FTSYS_SRC]) -AC_CHECK_FUNCS(memcpy memmove) +AC_CHECK_FUNCS([memcpy memmove]) -dnl Check for system zlib -AC_ARG_WITH(zlib, - [ --without-zlib use internal zlib instead of system-wide]) + +# Check for system zlib + +AC_ARG_WITH([zlib], + dnl don't quote AS_HELP_STRING! + AS_HELP_STRING([--without-zlib], + [use internal zlib instead of system-wide])) if test x$with_zlib != xno && test -z "$LIBZ"; then - AC_CHECK_LIB(z, gzsetparams, [AC_CHECK_HEADER(zlib.h, LIBZ='-lz')]) + AC_CHECK_LIB([z], [gzsetparams], [AC_CHECK_HEADER([zlib.h], [LIBZ='-lz'])]) fi if test x$with_zlib != xno && test -n "$LIBZ"; then CFLAGS="$CFLAGS -DFT_CONFIG_OPTION_SYSTEM_ZLIB" @@ -93,36 +123,56 @@ if test x$with_zlib != xno && test -n "$LIBZ"; then SYSTEM_ZLIB=yes fi -dnl Whether to use Mac OS resource-based fonts or not -AC_ARG_WITH(old-mac-fonts, - [ --with-old-mac-fonts allow Mac resource-based fonts to be used]) + +# Whether to use Mac OS resource-based fonts or not + +AC_ARG_WITH([old-mac-fonts], + dnl don't quote AS_HELP_STRING! + AS_HELP_STRING([--with-old-mac-fonts], + [allow Mac resource-based fonts to be used])) if test x$with_old_mac_fonts = xyes; then - CFLAGS="$CFLAGS -DTARGET_API_MAC_CARBON" LDFLAGS="$LDFLAGS -Xlinker -framework -Xlinker CoreServices \ -Xlinker -framework -Xlinker ApplicationServices" else CFLAGS="$CFLAGS -DDARWIN_NO_CARBON" fi -AC_SUBST(LIBZ) -AC_SUBST(CFLAGS) -AC_SUBST(LDFLAGS) -AC_SUBST(SYSTEM_ZLIB) + +AC_SUBST([LIBZ]) +AC_SUBST([CFLAGS]) +AC_SUBST([LDFLAGS]) +AC_SUBST([SYSTEM_ZLIB]) + AC_PROG_LIBTOOL +# urgh -- these are internal libtool variables... +AC_SUBST([enable_shared]) +AC_SUBST([hardcode_libdir_flag_spec]) +AC_SUBST([wl]) -dnl create the Unix-specific sub-Makefiles `builds/unix/unix-def.mk' -dnl and 'builds/unix/unix-cc.mk' that will be used by the build system -dnl + +# configuration file -- stay in 8.3 limit +# +# since #undef doesn't survive in configuration header files we replace +# `/undef' with `#undef' after creating the output file + +AC_CONFIG_HEADERS([ftconfig.h:ftconfig.in], + [mv ftconfig.h ftconfig.tmp + sed 's|/undef|#undef|' < ftconfig.tmp > ftconfig.h + rm ftconfig.tmp]) + +# create the Unix-specific sub-Makefiles `builds/unix/unix-def.mk' +# and 'builds/unix/unix-cc.mk' that will be used by the build system +# AC_CONFIG_FILES([unix-cc.mk:unix-cc.in unix-def.mk:unix-def.in freetype-config freetype2.pc:freetype2.in]) -dnl re-generate the Jamfile to use libtool now -dnl -dnl AC_CONFIG_FILES([../../Jamfile:../../Jamfile.in]) +# re-generate the Jamfile to use libtool now +# +# AC_CONFIG_FILES([../../Jamfile:../../Jamfile.in]) AC_OUTPUT -dnl end of configure.ac +# end of configure.ac diff --git a/reactos/lib/freetype/builds/unix/detect.mk b/reactos/lib/freetype/builds/unix/detect.mk index 9fc9d601d17..a0419dce7f5 100644 --- a/reactos/lib/freetype/builds/unix/detect.mk +++ b/reactos/lib/freetype/builds/unix/detect.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2000, 2002, 2003 by +# Copyright 1996-2000, 2002, 2003, 2004 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, @@ -66,7 +66,7 @@ ifeq ($(PLATFORM),unix) # platform). # CONFIG_FILE := unix.mk - setup: unix-def.mk + setup: $(BUILD_DIR)/unix-def.mk unix: setup .PHONY: unix endif @@ -77,10 +77,10 @@ ifeq ($(PLATFORM),unix) have_mk := $(strip $(wildcard $(OBJ_DIR)/Makefile)) ifneq ($(have_mk),) # we are building FT2 not in the src tree - unix-def.mk: $(TOP_DIR)/builds/unix/unix-def.in + $(BUILD_DIR)/unix-def.mk: $(TOP_DIR)/builds/unix/unix-def.in $(TOP_DIR)/builds/unix/configure $(CFG) else - unix-def.mk: $(TOP_DIR)/builds/unix/unix-def.in + $(BUILD_DIR)/unix-def.mk: $(TOP_DIR)/builds/unix/unix-def.in cd builds/unix; ./configure $(CFG) endif diff --git a/reactos/lib/freetype/builds/unix/freetype-config.in b/reactos/lib/freetype/builds/unix/freetype-config.in index 5091723a579..9a6ae100d69 100644 --- a/reactos/lib/freetype/builds/unix/freetype-config.in +++ b/reactos/lib/freetype/builds/unix/freetype-config.in @@ -2,18 +2,31 @@ prefix=@prefix@ exec_prefix=@exec_prefix@ +exec_prefix_set=no +includedir=@includedir@ +libdir=@libdir@ +enable_shared=@enable_shared@ +wl=@wl@ +hardcode_libdir_flag_spec='@hardcode_libdir_flag_spec@' usage() { cat <= $min_ft_version]) + no_ft="" + if test "$FT2_CONFIG" = "no" ; then + no_ft=yes + else + FT2_CFLAGS=`$FT2_CONFIG $ft_config_args --cflags` + FT2_LIBS=`$FT2_CONFIG $ft_config_args --libs` + ft_config_major_version=`$FT2_CONFIG $ft_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + ft_config_minor_version=`$FT2_CONFIG $ft_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + ft_config_micro_version=`$FT2_CONFIG $ft_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + ft_min_major_version=`echo $min_ft_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + ft_min_minor_version=`echo $min_ft_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + ft_min_micro_version=`echo $min_ft_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test x$enable_fttest = xyes ; then + ft_config_is_lt="" + if test $ft_config_major_version -lt $ft_min_major_version ; then + ft_config_is_lt=yes + else + if test $ft_config_major_version -eq $ft_min_major_version ; then + if test $ft_config_minor_version -lt $ft_min_minor_version ; then + ft_config_is_lt=yes + else + if test $ft_config_minor_version -eq $ft_min_minor_version ; then + if test $ft_config_micro_version -lt $ft_min_micro_version ; then + ft_config_is_lt=yes + fi + fi + fi + fi + fi + if test x$ft_config_is_lt = xyes ; then + no_ft=yes + else + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $FT2_CFLAGS" + LIBS="$FT2_LIBS $LIBS" + + # + # Sanity checks for the results of freetype-config to some extent. + # + AC_RUN_IFELSE([ + AC_LANG_SOURCE([[ -min_ft_version=ifelse([$1], ,6.1.0,$1) -AC_MSG_CHECKING(for FreeType - version >= $min_ft_version) -no_ft="" -if test "$FT2_CONFIG" = "no" ; then - no_ft=yes -else - FT2_CFLAGS=`$FT2_CONFIG $ft_config_args --cflags` - FT2_LIBS=`$FT2_CONFIG $ft_config_args --libs` - ft_config_major_version=`$FT2_CONFIG $ft_config_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` - ft_config_minor_version=`$FT2_CONFIG $ft_config_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` - ft_config_micro_version=`$FT2_CONFIG $ft_config_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` - ft_min_major_version=`echo $min_ft_version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` - ft_min_minor_version=`echo $min_ft_version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` - ft_min_micro_version=`echo $min_ft_version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` - if test x$enable_fttest = xyes ; then - ft_config_is_lt="" - if test $ft_config_major_version -lt $ft_min_major_version ; then - ft_config_is_lt=yes - else - if test $ft_config_major_version -eq $ft_min_major_version ; then - if test $ft_config_minor_version -lt $ft_min_minor_version ; then - ft_config_is_lt=yes - else - if test $ft_config_minor_version -eq $ft_min_minor_version ; then - if test $ft_config_micro_version -lt $ft_min_micro_version ; then - ft_config_is_lt=yes - fi - fi - fi - fi - fi - if test x$ft_config_is_lt = xyes ; then - no_ft=yes - else - ac_save_CFLAGS="$CFLAGS" - ac_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $FT2_CFLAGS" - LIBS="$FT2_LIBS $LIBS" -dnl -dnl Sanity checks for the results of freetype-config to some extent -dnl - AC_TRY_RUN([ #include #include FT_FREETYPE_H #include @@ -92,7 +108,7 @@ int main() { FT_Library library; - FT_Error error; + FT_Error error; error = FT_Init_FreeType(&library); @@ -104,40 +120,59 @@ main() return 0; } } -],, no_ft=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi # test $ft_config_version -lt $ft_min_version - fi # test x$enable_fttest = xyes -fi # test "$FT2_CONFIG" = "no" -if test x$no_ft = x ; then - AC_MSG_RESULT(yes) - ifelse([$2], , :, [$2]) -else - AC_MSG_RESULT(no) - if test "$FT2_CONFIG" = "no" ; then - echo "*** The freetype-config script installed by FreeType 2 could not be found." - echo "*** If FreeType 2 was installed in PREFIX, make sure PREFIX/bin is in" - echo "*** your path, or set the FT2_CONFIG environment variable to the" - echo "*** full path to freetype-config." + + ]]) + ], + [], + [no_ft=yes], + [echo $ECHO_N "cross compiling; assuming OK... $ECHO_C"]) + + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi # test $ft_config_version -lt $ft_min_version + fi # test x$enable_fttest = xyes + fi # test "$FT2_CONFIG" = "no" + + if test x$no_ft = x ; then + AC_MSG_RESULT([yes]) + m4_if([$2], [], [:], [$2]) else - if test x$ft_config_is_lt = xyes ; then - echo "*** Your installed version of the FreeType 2 library is too old." - echo "*** If you have different versions of FreeType 2, make sure that" - echo "*** correct values for --with-ft-prefix or --with-ft-exec-prefix" - echo "*** are used, or set the FT2_CONFIG environment variable to the" - echo "*** full path to freetype-config." + AC_MSG_RESULT([no]) + if test "$FT2_CONFIG" = "no" ; then + AC_MSG_WARN([ + + The freetype-config script installed by FreeType 2 could not be found. + If FreeType 2 was installed in PREFIX, make sure PREFIX/bin is in + your path, or set the FT2_CONFIG environment variable to the + full path to freetype-config. + ]) else - echo "*** The FreeType test program failed to run. If your system uses" - echo "*** shared libraries and they are installed outside the normal" - echo "*** system library path, make sure the variable LD_LIBRARY_PATH" - echo "*** (or whatever is appropiate for your system) is correctly set." + if test x$ft_config_is_lt = xyes ; then + AC_MSG_WARN([ + + Your installed version of the FreeType 2 library is too old. + If you have different versions of FreeType 2, make sure that + correct values for --with-ft-prefix or --with-ft-exec-prefix + are used, or set the FT2_CONFIG environment variable to the + full path to freetype-config. + ]) + else + AC_MSG_WARN([ + + The FreeType test program failed to run. If your system uses + shared libraries and they are installed outside the normal + system library path, make sure the variable LD_LIBRARY_PATH + (or whatever is appropiate for your system) is correctly set. + ]) + fi fi + + FT2_CFLAGS="" + FT2_LIBS="" + m4_if([$3], [], [:], [$3]) fi - FT2_CFLAGS="" - FT2_LIBS="" - ifelse([$3], , :, [$3]) -fi -AC_SUBST(FT2_CFLAGS) -AC_SUBST(FT2_LIBS) -]) + + AC_SUBST([FT2_CFLAGS]) + AC_SUBST([FT2_LIBS])]) + +# end of freetype2.m4 diff --git a/reactos/lib/freetype/builds/unix/ft-munmap.m4 b/reactos/lib/freetype/builds/unix/ft-munmap.m4 index 37ebbd92d9d..0036ffb611c 100644 --- a/reactos/lib/freetype/builds/unix/ft-munmap.m4 +++ b/reactos/lib/freetype/builds/unix/ft-munmap.m4 @@ -1,31 +1,23 @@ ## FreeType specific autoconf tests -# serial 1 FT_MUNMAP_DECL +# serial 2 -AC_DEFUN(FT_MUNMAP_DECL, -[AC_MSG_CHECKING([whether munmap must be declared]) -AC_CACHE_VAL(ft_cv_munmap_decl, -[AC_TRY_COMPILE([ -#ifdef HAVE_UNISTD_H -#include -#endif -#include ], -[char *(*pfn) = (char *(*))munmap], -ft_cv_munmap_decl=no, -ft_cv_munmap_decl=yes)]) -AC_MSG_RESULT($ft_cv_munmap_decl) -if test $ft_cv_munmap_decl = yes; then - AC_DEFINE(NEED_MUNMAP_DECL,, - [Define to 1 if munmap() is not defined in ]) -fi]) +AC_DEFUN([FT_MUNMAP_PARAM], + [AC_MSG_CHECKING([for munmap's first parameter type]) + AC_COMPILE_IFELSE([ + AC_LANG_SOURCE([[ -AC_DEFUN(FT_MUNMAP_PARAM, -[AC_MSG_CHECKING([for munmap's first parameter type]) -AC_TRY_COMPILE([ #include #include -int munmap(void *, size_t);],, - AC_MSG_RESULT([void *]);AC_DEFINE(MUNMAP_USES_VOIDP,, - [Define to 1 if the first argument of munmap is of type void *]), - AC_MSG_RESULT([char *])) -]) +int munmap(void *, size_t); + + ]]) + ], + [AC_MSG_RESULT([void *]) + AC_DEFINE([MUNMAP_USES_VOIDP], + [], + [Define to 1 if the first argument of munmap is of type void *])], + [AC_MSG_RESULT([char *])]) + ]) + +# end of ft-munmap.m4 diff --git a/reactos/lib/freetype/builds/unix/ft2unix.h b/reactos/lib/freetype/builds/unix/ft2unix.h index c4299c3abf6..7390dc49401 100644 --- a/reactos/lib/freetype/builds/unix/ft2unix.h +++ b/reactos/lib/freetype/builds/unix/ft2unix.h @@ -4,7 +4,7 @@ /* */ /* Build macros of the FreeType 2 library. */ /* */ -/* Copyright 1996-2001 by */ +/* Copyright 1996-2001, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -21,14 +21,15 @@ /* This is a Unix-specific version of that should be used */ /* exclusively *after* installation of the library. */ /* */ - /* It assumes that "/usr/local/include/freetype2" (or wathever is */ - /* returned by the "freetype-config --cflags" command) is in your */ - /* compilation include path. */ + /* It assumes that "/usr/local/include/freetype2" (or whatever is */ + /* returned by the "freetype-config --cflags" or "pkg-config --cflags" */ + /* command) is in your compilation include path. */ /* */ /* We don't need to do anything special in this release. However, for */ - /* FreeType 2.1, the following installation changes will be performed: */ + /* a future FreeType 2 release, the following installation changes will */ + /* be performed: */ /* */ - /* - The contents of "freetype-2.1/include/freetype" will be installed */ + /* - The contents of "freetype-2.x/include/freetype" will be installed */ /* to "/usr/local/include/freetype2" instead of */ /* "/usr/local/include/freetype2/freetype". */ /* */ @@ -39,11 +40,11 @@ /* replace all "" with "". */ /* */ /* - Adding "/usr/local/include/freetype2" to your compilation include */ - /* path will not be necessary anymore. The command */ - /* "freetype-config --cflags" will return an empty string. */ + /* path will not be necessary anymore. */ /* */ - /* - Client applications which adhere to the new inclusion scheme */ - /* WILL NOT NEED TO BE MODIFIED to compile with FT 2.1! */ + /* These changes will be transparent to client applications which use */ + /* freetype-config (or pkg-config). No modifications will be necessary */ + /* to compile with the new scheme. */ /* */ /*************************************************************************/ @@ -51,7 +52,7 @@ #ifndef __FT2_BUILD_UNIX_H__ #define __FT2_BUILD_UNIX_H__ - /* "/usr/local/include/freetype2" must be in your current inclusion path */ + /* "/include/freetype2" must be in your current inclusion path */ #include #endif /* __FT2_BUILD_UNIX_H__ */ diff --git a/reactos/lib/freetype/builds/unix/ftconfig.in b/reactos/lib/freetype/builds/unix/ftconfig.in index c7511039f52..6d8f1e856f3 100644 --- a/reactos/lib/freetype/builds/unix/ftconfig.in +++ b/reactos/lib/freetype/builds/unix/ftconfig.in @@ -4,7 +4,7 @@ /* */ /* UNIX-specific configuration file (specification only). */ /* */ -/* Copyright 1996-2000, 2002 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -57,15 +57,17 @@ FT_BEGIN_HEADER /*************************************************************************/ -#define HAVE_UNISTD_H 0 -#define HAVE_FCNTL_H 0 +#undef HAVE_UNISTD_H +#undef HAVE_FCNTL_H + +#undef SIZEOF_INT +#undef SIZEOF_LONG -#define SIZEOF_INT 2 -#define SIZEOF_LONG 2 #define FT_SIZEOF_INT SIZEOF_INT #define FT_SIZEOF_LONG SIZEOF_LONG +#define FT_CHAR_BIT CHAR_BIT /* Preferred alignment of data */ #define FT_ALIGNMENT 8 @@ -89,6 +91,19 @@ FT_BEGIN_HEADER /*************************************************************************/ + /*************************************************************************/ + /* */ + /* Mac support */ + /* */ + /* This is the only necessary change, so it is defined here instead */ + /* providing a new configuration file. */ + /* */ +#if ( defined( __APPLE__ ) && !defined( DARWIN_NO_CARBON ) ) || \ + ( defined( __MWERKS__ ) && defined( macintosh ) ) +#define FT_MACINTOSH 1 +#endif + + /*************************************************************************/ /* */ /* IntN types */ @@ -112,31 +127,88 @@ FT_BEGIN_HEADER #error "no 32bit type found -- please check your configuration files" #endif + + /* look up an integer type that is at least 32 bits */ +#if FT_SIZEOF_INT >= 4 + + typedef int FT_Fast; + typedef unsigned int FT_UFast; + +#elif FT_SIZEOF_LONG >= 4 + + typedef long FT_Fast; + typedef unsigned long FT_UFast; + +#endif + + + /* determine whether we have a 64-bit int type for platforms without */ + /* Autoconf */ #if FT_SIZEOF_LONG == 8 /* FT_LONG64 must be defined if a 64-bit type is available */ #define FT_LONG64 -#define FT_INT64 long +#define FT_INT64 long + +#elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ + + /* this compiler provides the __int64 type */ +#define FT_LONG64 +#define FT_INT64 __int64 + +#elif defined( __BORLANDC__ ) /* Borland C++ */ + + /* XXXX: We should probably check the value of __BORLANDC__ in order */ + /* to test the compiler version. */ + + /* this compiler provides the __int64 type */ +#define FT_LONG64 +#define FT_INT64 __int64 + +#elif defined( __WATCOMC__ ) /* Watcom C++ */ + + /* Watcom doesn't provide 64-bit data types */ + +#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */ + +#define FT_LONG64 +#define FT_INT64 long long int + +#elif defined( __GNUC__ ) + + /* GCC provides the "long long" type */ +#define FT_LONG64 +#define FT_INT64 long long int + +#endif /* FT_SIZEOF_LONG == 8 */ + + +#define FT_BEGIN_STMNT do { +#define FT_END_STMNT } while ( 0 ) +#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT -#else /*************************************************************************/ /* */ - /* Many compilers provide the non-ANSI `long long' 64-bit type. You can */ - /* activate it by defining the FTCALC_USE_LONG_LONG macro in */ - /* `ftoption.h'. */ + /* A 64-bit data type will create compilation problems if you compile */ + /* in strict ANSI mode. To avoid them, we disable their use if */ + /* __STDC__ is defined. You can however ignore this rule by */ + /* defining the FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */ /* */ - /* Note that this will produce many -ansi warnings during library */ - /* compilation, and that in many cases, the generated code will be */ - /* neither smaller nor faster! */ - /* */ -#ifdef FTCALC_USE_LONG_LONG +#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 ) -#define FT_LONG64 -#define FT_INT64 long long +#ifdef __STDC__ -#endif /* FTCALC_USE_LONG_LONG */ -#endif /* FT_SIZEOF_LONG == 8 */ + /* Undefine the 64-bit macros in strict ANSI compilation mode. */ + /* Since `#undef' doesn't survive in configuration header files */ + /* we use the postprocessing facility of AC_CONFIG_HEADERS to */ + /* replace the leading `/' with `#'. */ +/undef FT_LONG64 +/undef FT_INT64 + +#endif /* __STDC__ */ + +#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */ #ifdef FT_MAKE_OPTION_SINGLE_OBJECT @@ -151,7 +223,7 @@ FT_BEGIN_HEADER #define FT_LOCAL_DEF( x ) extern "C" x #else #define FT_LOCAL( x ) extern x -#define FT_LOCAL_DEF( x ) extern x +#define FT_LOCAL_DEF( x ) x #endif #endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ @@ -255,6 +327,7 @@ FT_BEGIN_HEADER FT_END_HEADER + #endif /* __FTCONFIG_H__ */ diff --git a/reactos/lib/freetype/builds/unix/ftsystem.c b/reactos/lib/freetype/builds/unix/ftsystem.c index 4ae260cd3c7..c7a34ad584f 100644 --- a/reactos/lib/freetype/builds/unix/ftsystem.c +++ b/reactos/lib/freetype/builds/unix/ftsystem.c @@ -4,7 +4,7 @@ /* */ /* Unix-specific FreeType low-level system interface (body). */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 1996-2001, 2002, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -67,6 +67,7 @@ #include #include #include +#include /*************************************************************************/ @@ -182,16 +183,16 @@ /*************************************************************************/ /* */ /* */ - /* ft_close_stream */ + /* ft_close_stream_by_munmap */ /* */ /* */ - /* The function to close a stream. */ + /* The function to close a stream which is opened by mmap. */ /* */ /* */ /* stream :: A pointer to the stream object. */ /* */ FT_CALLBACK_DEF( void ) - ft_close_stream( FT_Stream stream ) + ft_close_stream_by_munmap( FT_Stream stream ) { munmap( (MUNMAP_ARG_CAST)stream->descriptor.pointer, stream->size ); @@ -201,6 +202,28 @@ } + /*************************************************************************/ + /* */ + /* */ + /* ft_close_stream_by_free */ + /* */ + /* */ + /* The function to close a stream which is created by ft_alloc. */ + /* */ + /* */ + /* stream :: A pointer to the stream object. */ + /* */ + FT_CALLBACK_DEF( void ) + ft_close_stream_by_free( FT_Stream stream ) + { + ft_free( NULL, stream->descriptor.pointer ); + + stream->descriptor.pointer = NULL; + stream->size = 0; + stream->base = 0; + } + + /* documentation is in ftobjs.h */ FT_EXPORT_DEF( FT_Error ) @@ -252,11 +275,49 @@ file, 0 ); - if ( (long)stream->base == -1 ) + if ( (long)stream->base != -1 ) + stream->close = ft_close_stream_by_munmap; + else { + ssize_t total_read_count; + + FT_ERROR(( "FT_Stream_Open:" )); FT_ERROR(( " could not `mmap' file `%s'\n", filepathname )); - goto Fail_Map; + + stream->base = ft_alloc( NULL, stream->size ); + + if ( !stream->base ) + { + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not `alloc' memory\n" )); + goto Fail_Map; + } + + total_read_count = 0; + do { + ssize_t read_count; + + + read_count = read( file, + stream->base + total_read_count, + stream->size - total_read_count ); + + if ( ( read_count == -1 ) ) + { + if ( errno == EINTR ) + continue; + + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " error while `read'ing file `%s'\n", filepathname )); + goto Fail_Read; + } + + total_read_count += read_count; + + } while ( total_read_count != stream->size ); + + stream->close = ft_close_stream_by_free; } close( file ); @@ -264,8 +325,7 @@ stream->descriptor.pointer = stream->base; stream->pathname.pointer = (char*)filepathname; - stream->close = ft_close_stream; - stream->read = 0; + stream->read = 0; FT_TRACE1(( "FT_Stream_Open:" )); FT_TRACE1(( " opened `%s' (%d bytes) successfully\n", @@ -273,6 +333,9 @@ return FT_Err_Ok; + Fail_Read: + ft_free( NULL, stream->base ); + Fail_Map: close( file ); diff --git a/reactos/lib/freetype/builds/unix/install-sh b/reactos/lib/freetype/builds/unix/install-sh index 57a2fbd1861..77bc38144f2 100644 --- a/reactos/lib/freetype/builds/unix/install-sh +++ b/reactos/lib/freetype/builds/unix/install-sh @@ -1,21 +1,38 @@ #!/bin/sh # install - install a program, script, or datafile -# This originally came from X11R5 (mit/util/scripts/install.sh). -scriptversion=2003-01-17.15 +scriptversion=2004-02-15.20 -# Copyright 1991 by the Massachusetts Institute of Technology -# (FSF changes in the public domain.) +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. # -# Permission to use, copy, modify, distribute, and sell this software and its -# documentation for any purpose is hereby granted without fee, provided that -# the above copyright notice appear in all copies and that both that -# copyright notice and this permission notice appear in supporting -# documentation, and that the name of M.I.T. not be used in advertising or -# publicity pertaining to distribution of the software without specific, -# written prior permission. M.I.T. makes no representations about the -# suitability of this software for any purpose. It is provided "as is" -# without express or implied warranty. +# Copyright (C) 1994 X Consortium +# +# 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 +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it @@ -55,7 +72,8 @@ dst= dir_arg= usage="Usage: $0 [OPTION]... SRCFILE DSTFILE - or: $0 -d DIR1 DIR2... + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 -d DIRECTORIES... In the first form, install SRCFILE to DSTFILE, removing SRCFILE by default. In the second, create the directory path DIR. @@ -117,144 +135,173 @@ while test -n "$1"; do --version) echo "$0 $scriptversion"; exit 0;; - *) if test -z "$src"; then - src=$1 - else - # this colon is to work around a 386BSD /bin/sh bug - : - dst=$1 - fi - shift - continue;; + *) # When -d is used, all remaining arguments are directories to create. + test -n "$dir_arg" && break + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dstarg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dstarg" + shift # fnord + fi + shift # arg + dstarg=$arg + done + break;; esac done -if test -z "$src"; then - echo "$0: no input file specified." >&2 - exit 1 -fi - -if test -n "$dir_arg"; then - dst=$src - src= - - if test -d "$dst"; then - instcmd=: - chmodcmd= - else - instcmd=$mkdirprog - fi -else - # Waiting for this to be detected by the "$instcmd $src $dsttmp" command - # might cause directories to be created, which would be especially bad - # if $src (and thus $dsttmp) contains '*'. - if test ! -f "$src" && test ! -d "$src"; then - echo "$0: $src does not exist." >&2 +if test -z "$1"; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 exit 1 fi - - if test -z "$dst"; then - echo "$0: no destination specified." >&2 - exit 1 - fi - - # If destination is a directory, append the input filename; won't work - # if double slashes aren't ignored. - if test -d "$dst"; then - dst=$dst/`basename "$src"` - fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 fi -## this sed command emulates the dirname command -dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` +for src +do + # Protect names starting with `-'. + case $src in + -*) src=./$src ;; + esac -# Make sure that the destination directory exists. -# (this part is taken from Noah Friedman's mkinstalldirs script.) + if test -n "$dir_arg"; then + dst=$src + src= -# Skip lots of stat calls in the usual case. -if test ! -d "$dstdir"; then - defaultIFS=' - ' - IFS="${IFS-$defaultIFS}" - - oIFS=$IFS - # Some sh's can't handle IFS=/ for some reason. - IFS='%' - set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` - IFS=$oIFS - - pathcomp= - - while test $# -ne 0 ; do - pathcomp=$pathcomp$1 - shift - test -d "$pathcomp" || $mkdirprog "$pathcomp" - pathcomp=$pathcomp/ - done -fi - -if test -n "$dir_arg"; then - $doit $instcmd "$dst" \ - && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ - && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ - && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ - && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } - -else - # If we're going to rename the final executable, determine the name now. - if test -z "$transformarg"; then - dstfile=`basename "$dst"` + if test -d "$dst"; then + instcmd=: + chmodcmd= + else + instcmd=$mkdirprog + fi else - dstfile=`basename "$dst" $transformbasename \ - | sed $transformarg`$transformbasename + # Waiting for this to be detected by the "$instcmd $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dstarg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=$dstarg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst ;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + dst=$dst/`basename "$src"` + fi fi - # don't allow the sed command to completely eliminate the filename. - test -z "$dstfile" && dstfile=`basename "$dst"` + # This sed command emulates the dirname command. + dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` - # Make a couple of temp file names in the proper directory. - dsttmp=$dstdir/#inst.$$# - rmtmp=$dstdir/#rm.$$# + # Make sure that the destination directory exists. - # Trap to clean up those temp files at exit. - trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0 - trap '(exit $?); exit' 1 2 13 15 + # Skip lots of stat calls in the usual case. + if test ! -d "$dstdir"; then + defaultIFS=' + ' + IFS="${IFS-$defaultIFS}" - # Move or copy the file name to the temp name - $doit $instcmd "$src" "$dsttmp" && + oIFS=$IFS + # Some sh's can't handle IFS=/ for some reason. + IFS='%' + set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` + IFS=$oIFS - # and set any options; do chmod last to preserve setuid bits. - # - # If any of these fail, we abort the whole thing. If we want to - # ignore errors from any of these, just make sure not to ignore - # errors from the above "$doit $instcmd $src $dsttmp" command. - # - { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ - && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ - && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ - && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && + pathcomp= - # Now remove or move aside any old file at destination location. We - # try this two ways since rm can't unlink itself on some systems and - # the destination file might be busy for other reasons. In this case, - # the final cleanup might fail but the new file should still install - # successfully. - { - if test -f "$dstdir/$dstfile"; then - $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ - || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ - || { + while test $# -ne 0 ; do + pathcomp=$pathcomp$1 + shift + if test ! -d "$pathcomp"; then + $mkdirprog "$pathcomp" || lasterr=$? + # mkdir can fail with a `File exist' error in case several + # install-sh are creating the directory concurrently. This + # is OK. + test ! -d "$pathcomp" && { (exit ${lasterr-1}); exit; } + fi + pathcomp=$pathcomp/ + done + fi + + if test -n "$dir_arg"; then + $doit $instcmd "$dst" \ + && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ + && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ + && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ + && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } + + else + # If we're going to rename the final executable, determine the name now. + if test -z "$transformarg"; then + dstfile=`basename "$dst"` + else + dstfile=`basename "$dst" $transformbasename \ + | sed $transformarg`$transformbasename + fi + + # don't allow the sed command to completely eliminate the filename. + test -z "$dstfile" && dstfile=`basename "$dst"` + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0 + trap '(exit $?); exit' 1 2 13 15 + + # Move or copy the file name to the temp name + $doit $instcmd "$src" "$dsttmp" && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $instcmd $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ + && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ + && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ + && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && + + # Now remove or move aside any old file at destination location. We + # try this two ways since rm can't unlink itself on some systems and + # the destination file might be busy for other reasons. In this case, + # the final cleanup might fail but the new file should still install + # successfully. + { + if test -f "$dstdir/$dstfile"; then + $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ + || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ + || { echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 (exit 1); exit - } - else - : - fi - } && + } + else + : + fi + } && - # Now rename the file to the real destination. - $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" -fi && + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" + fi || { (exit 1); exit; } +done # The final little trick to "correctly" pass the exit status to the exit trap. { diff --git a/reactos/lib/freetype/builds/unix/install.mk b/reactos/lib/freetype/builds/unix/install.mk index 935005edb49..1930d371601 100644 --- a/reactos/lib/freetype/builds/unix/install.mk +++ b/reactos/lib/freetype/builds/unix/install.mk @@ -51,6 +51,8 @@ install: $(PROJECT_LIBRARY) done $(INSTALL_DATA) $(BUILD_DIR)/ft2unix.h \ $(DESTDIR)$(includedir)/ft2build.h + $(INSTALL_DATA) $(BUILD_DIR)/ftconfig.h \ + $(DESTDIR)$(includedir)/freetype2/freetype/config/ftconfig.h $(INSTALL_SCRIPT) -m 755 $(OBJ_BUILD)/freetype-config \ $(DESTDIR)$(bindir)/freetype-config $(INSTALL_SCRIPT) -m 644 $(BUILD_DIR)/freetype2.m4 \ diff --git a/reactos/lib/freetype/builds/unix/ltmain.sh b/reactos/lib/freetype/builds/unix/ltmain.sh index 8b50e531910..70f0b2d031f 100644 --- a/reactos/lib/freetype/builds/unix/ltmain.sh +++ b/reactos/lib/freetype/builds/unix/ltmain.sh @@ -1,7 +1,7 @@ # ltmain.sh - Provide generalized library-building support services. # NOTE: Changing this file will not affect anything until you rerun configure. # -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004 # Free Software Foundation, Inc. # Originally by Gordon Matzigkeit , 1996 # @@ -24,6 +24,29 @@ # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. +basename="s,^.*/,,g" + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + +# The name of this program: +progname=`echo "$progpath" | $SED $basename` +modename="$progname" + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 + +PROGRAM=ltmain.sh +PACKAGE=libtool +VERSION=1.5.6 +TIMESTAMP=" (1.1220.2.94 2004/04/10 16:27:27)" + + # Check that we have a working $echo. if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. @@ -36,7 +59,7 @@ elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then : else # Restart under the correct shell, and then maybe $echo will work. - exec $SHELL "$0" --no-reexec ${1+"$@"} + exec $SHELL "$progpath" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then @@ -45,19 +68,9 @@ if test "X$1" = X--fallback-echo; then cat <&2 - echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 - exit 1 + $echo "$modename: not configured to build any kind of library" 1>&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE fi # Global variables. @@ -114,8 +128,121 @@ execute_dlfiles= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" +##################################### +# Shell function definitions: +# This seems to be the best place for them + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +func_win32_libid () { + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ + $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | \ + sed -n -e '1,100{/ I /{x;/import/!{s/^/import/;h;p;};x;};}'` + if test "X$win32_nmres" = "Ximport" ; then + win32_libid_type="x86 archive import" + else + win32_libid_type="x86 archive static" + fi + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $echo $win32_libid_type +} + + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () { + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + case "$@ " in + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + $echo "$modename: unable to infer tagged configuration" + $echo "$modename: specify a tag with \`--tag'" 1>&2 + exit $EXIT_FAILURE +# else +# $echo "$modename: using $tagname tagged configuration" + fi + ;; + esac + fi +} +# End of Shell function definitions +##################################### + +# Darwin sucks +eval std_shrext=\"$shrext_cmds\" + # Parse our command line options once, thoroughly. -while test $# -gt 0 +while test "$#" -gt 0 do arg="$1" shift @@ -131,6 +258,34 @@ do execute_dlfiles) execute_dlfiles="$execute_dlfiles $arg" ;; + tag) + tagname="$arg" + preserve_args="${preserve_args}=$arg" + + # Check whether tagname contains only valid characters + case $tagname in + *[!-_A-Za-z0-9,/]*) + $echo "$progname: invalid tag name: $tagname" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $tagname in + CC) + # Don't test for the "default" C tag, as we know, it's there, but + # not specially marked. + ;; + *) + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then + taglist="$taglist $tagname" + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" + else + $echo "$progname: ignoring unknown tag $tagname" 1>&2 + fi + ;; + esac + ;; *) eval "$prev=\$arg" ;; @@ -148,18 +303,27 @@ do ;; --version) - echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" - exit 0 + $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" + $echo + $echo "Copyright (C) 2003 Free Software Foundation, Inc." + $echo "This is free software; see the source for copying conditions. There is NO" + $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + exit $EXIT_SUCCESS ;; --config) - ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $0 - exit 0 + ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath + # Now print the configurations for the tags. + for tagname in $taglist; do + ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" + done + exit $EXIT_SUCCESS ;; --debug) - echo "$progname: enabling shell trace mode" + $echo "$progname: enabling shell trace mode" set -x + preserve_args="$preserve_args $arg" ;; --dry-run | -n) @@ -167,18 +331,18 @@ do ;; --features) - echo "host: $host" + $echo "host: $host" if test "$build_libtool_libs" = yes; then - echo "enable shared libraries" + $echo "enable shared libraries" else - echo "disable shared libraries" + $echo "disable shared libraries" fi if test "$build_old_libs" = yes; then - echo "enable static libraries" + $echo "enable static libraries" else - echo "disable static libraries" + $echo "disable static libraries" fi - exit 0 + exit $EXIT_SUCCESS ;; --finish) mode="finish" ;; @@ -190,6 +354,15 @@ do --quiet | --silent) show=: + preserve_args="$preserve_args $arg" + ;; + + --tag) prevopt="--tag" prev=tag ;; + --tag=*) + set tag "$optarg" ${1+"$@"} + shift + prev=tag + preserve_args="$preserve_args --tag" ;; -dlopen) @@ -200,7 +373,7 @@ do -*) $echo "$modename: unrecognized option \`$arg'" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE ;; *) @@ -213,7 +386,7 @@ done if test -n "$prevopt"; then $echo "$modename: option \`$prevopt' requires an argument" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi # If this variable is set in any of the actions, the command in it @@ -225,8 +398,10 @@ if test -z "$show_help"; then # Infer the operation mode. if test -z "$mode"; then + $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 + $echo "*** Future versions of Libtool will require -mode=MODE be specified." 1>&2 case $nonopt in - *cc | *++ | gcc* | *-gcc* | xlc*) + *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) mode=link for arg do @@ -267,7 +442,7 @@ if test -z "$show_help"; then if test -n "$execute_dlfiles" && test "$mode" != execute; then $echo "$modename: unrecognized option \`-dlopen'" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. @@ -281,50 +456,154 @@ if test -z "$show_help"; then modename="$modename: compile" # Get the compilation command and the source file. base_compile= - prev= - lastarg= - srcfile="$nonopt" + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes suppress_output= + arg_mode=normal + libobj= + later= - user_target=no for arg do - case $prev in - "") ;; - xcompiler) - # Aesthetically quote the previous argument. - prev= - lastarg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case "$arg_mode" in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" + arg_mode=normal + ;; - case $arg in - # Double-quote args containing other shell metacharacters. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - - # Add the previous argument to base_compile. - if test -z "$base_compile"; then - base_compile="$lastarg" - else - base_compile="$base_compile $lastarg" - fi + target ) + libobj="$arg" + arg_mode=normal continue ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + if test -n "$libobj" ; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit $EXIT_FAILURE + fi + arg_mode=target + continue + ;; + + -static | -prefer-pic | -prefer-non-pic) + later="$later $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + lastarg="$lastarg $arg" + done + IFS="$save_ifs" + lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` + + # Add the arguments to base_compile. + base_compile="$base_compile $lastarg" + continue + ;; + + * ) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + + case $lastarg in + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + lastarg="\"$lastarg\"" + ;; esac - # Accept any command-line options. - case $arg in - -o) - if test "$user_target" != "no"; then - $echo "$modename: you cannot specify \`-o' more than once" 1>&2 - exit 1 - fi - user_target=next - ;; + base_compile="$base_compile $lastarg" + done # for arg + case $arg_mode in + arg) + $echo "$modename: you must specify an argument for -Xcompile" + exit $EXIT_FAILURE + ;; + target) + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit $EXIT_FAILURE + ;; + *) + # Get the name of the library object. + [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + xform='[cCFSifmso]' + case $libobj in + *.ada) xform=ada ;; + *.adb) xform=adb ;; + *.ads) xform=ads ;; + *.asm) xform=asm ;; + *.c++) xform=c++ ;; + *.cc) xform=cc ;; + *.ii) xform=ii ;; + *.class) xform=class ;; + *.cpp) xform=cpp ;; + *.cxx) xform=cxx ;; + *.f90) xform=f90 ;; + *.for) xform=for ;; + *.java) xform=java ;; + esac + + libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` + + case $libobj in + *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; + *) + $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in -static) build_old_libs=yes continue @@ -339,138 +618,33 @@ if test -z "$show_help"; then pic_mode=no continue ;; - - -Xcompiler) - prev=xcompiler - continue - ;; - - -Wc,*) - args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` - lastarg= - save_ifs="$IFS"; IFS=',' - for arg in $args; do - IFS="$save_ifs" - - # Double-quote args containing other shell metacharacters. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - lastarg="$lastarg $arg" - done - IFS="$save_ifs" - lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` - - # Add the arguments to base_compile. - if test -z "$base_compile"; then - base_compile="$lastarg" - else - base_compile="$base_compile $lastarg" - fi - continue - ;; esac - - case $user_target in - next) - # The next one is the -o target name - user_target=yes - continue - ;; - yes) - # We got the output file - user_target=set - libobj="$arg" - continue - ;; - esac - - # Accept the current argument as the source file. - lastarg="$srcfile" - srcfile="$arg" - - # Aesthetically quote the previous argument. - - # Backslashify any backslashes, double quotes, and dollar signs. - # These are the only characters that are still specially - # interpreted inside of double-quoted scrings. - lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` - - # Double-quote args containing other shell metacharacters. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - case $lastarg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - lastarg="\"$lastarg\"" - ;; - esac - - # Add the previous argument to base_compile. - if test -z "$base_compile"; then - base_compile="$lastarg" - else - base_compile="$base_compile $lastarg" - fi done - case $user_target in - set) - ;; - no) - # Get the name of the library object. - libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` - ;; - *) - $echo "$modename: you must specify a target with \`-o'" 1>&2 - exit 1 - ;; - esac - - # Recognize several different file suffixes. - # If the user specifies -o file.o, it is replaced with file.lo - xform='[cCFSfmso]' - case $libobj in - *.ada) xform=ada ;; - *.adb) xform=adb ;; - *.ads) xform=ads ;; - *.asm) xform=asm ;; - *.c++) xform=c++ ;; - *.cc) xform=cc ;; - *.cpp) xform=cpp ;; - *.cxx) xform=cxx ;; - *.f90) xform=f90 ;; - *.for) xform=for ;; - esac - - libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` - - case $libobj in - *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; - *) - $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 - exit 1 - ;; - esac + objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir= + else + xdir=$xdir/ + fi + lobj=${xdir}$objdir/$objname if test -z "$base_compile"; then $echo "$modename: you must specify a compilation command" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi # Delete any leftover library objects. if test "$build_old_libs" = yes; then - removelist="$obj $libobj" + removelist="$obj $lobj $libobj ${libobj}T" else - removelist="$libobj" + removelist="$lobj $libobj ${libobj}T" fi $run $rm $removelist - trap "$run $rm $removelist; exit 1" 1 2 15 + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in @@ -489,8 +663,9 @@ if test -z "$show_help"; then output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" removelist="$removelist $output_obj $lockfile" - trap "$run $rm $removelist; exit 1" 1 2 15 + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 else + output_obj= need_locks=no lockfile= fi @@ -498,13 +673,13 @@ if test -z "$show_help"; then # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then - until $run ln "$0" "$lockfile" 2>/dev/null; do + until $run ln "$progpath" "$lockfile" 2>/dev/null; do $show "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then - echo "\ + $echo "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` @@ -516,68 +691,67 @@ avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist - exit 1 + exit $EXIT_FAILURE fi - echo $srcfile > "$lockfile" + $echo $srcfile > "$lockfile" fi if test -n "$fix_srcfile_path"; then eval srcfile=\"$fix_srcfile_path\" fi + $run $rm "$libobj" "${libobj}T" + + # Create a libtool object file (analogous to a ".la" file), + # but don't create it if we're doing a dry run. + test -z "$run" && cat > ${libobj}T </dev/null`" != x"$srcfile"; then - echo "\ + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $echo "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` @@ -592,13 +766,13 @@ avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist - exit 1 + exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one - if test x"$output_obj" != x"$libobj"; then - $show "$mv $output_obj $libobj" - if $run $mv $output_obj $libobj; then : + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + $show "$mv $output_obj $lobj" + if $run $mv $output_obj $lobj; then : else error=$? $run $rm $removelist @@ -606,48 +780,23 @@ compiler." fi fi - # If we have no pic_flag, then copy the object into place and finish. - if (test -z "$pic_flag" || test "$pic_mode" != default) && - test "$build_old_libs" = yes; then - # Rename the .lo from within objdir to obj - if test -f $obj; then - $show $rm $obj - $run $rm $obj - fi + # Append the name of the PIC object to the libtool object file. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != x"$srcfile"; then - echo "\ + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $echo "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` @@ -691,11 +838,11 @@ avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist - exit 1 + exit $EXIT_FAILURE fi # Just move the object if needed - if test x"$output_obj" != x"$obj"; then + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then $show "$mv $output_obj $obj" if $run $mv $output_obj $obj; then : else @@ -705,29 +852,31 @@ compiler." fi fi - # Create an invalid libtool object if no PIC, so that we do not - # accidentally link it into a program. - if test "$build_libtool_libs" != yes; then - $show "echo timestamp > $libobj" - $run eval "echo timestamp > \$libobj" || exit $? - else - # Move the .lo from within objdir - $show "$mv $libobj $lo_libobj" - if $run $mv $libobj $lo_libobj; then : - else - error=$? - $run $rm $removelist - exit $error - fi - fi + # Append the name of the non-PIC object the libtool object file. + # Only append if the libtool object file exists. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + done + else + $echo "$modename: link input file \`$save_arg' does not exist" + exit $EXIT_FAILURE + fi + arg=$save_arg + prev= + continue + ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) $echo "$modename: only absolute run-paths are allowed" 1>&2 - exit 1 + exit $EXIT_FAILURE ;; esac if test "$prev" = rpath; then @@ -941,13 +1214,26 @@ compiler." finalize_command="$finalize_command $wl$qarg" continue ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac - fi # test -n $prev + fi # test -n "$prev" prevarg="$arg" @@ -989,7 +1275,7 @@ compiler." -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then $echo "$modename: more than one -exported-symbols argument is not allowed" - exit 1 + exit $EXIT_FAILURE fi if test "X$arg" = "X-export-symbols"; then prev=expsyms @@ -999,11 +1285,16 @@ compiler." continue ;; + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in - no/*-*-irix* | no/*-*-nonstopux*) + no/*-*-irix* | /*-*-irix*) compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" ;; @@ -1020,7 +1311,7 @@ compiler." absdir=`cd "$dir" && pwd` if test -z "$absdir"; then $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 - exit 1 + exit $EXIT_FAILURE fi dir="$absdir" ;; @@ -1058,24 +1349,61 @@ compiler." # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; - esac - elif test "X$arg" = "X-lc_r"; then - case $host in - *-*-openbsd* | *-*-freebsd*) - # Do not include libc_r directly, use -pthread flag. + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs="$deplibs -framework System" continue - ;; esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac fi deplibs="$deplibs $arg" continue ;; + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) + deplibs="$deplibs $arg" + continue + ;; + -module) module=yes continue ;; + # gcc -m* arguments should be passed to the linker via $compiler_flags + # in order to pass architecture information to the linker + # (e.g. 32 vs 64-bit). This may also be accomplished via -Wl,-mfoo + # but this is not reliable with gcc because gcc may use -mfoo to + # select a different linker, different libraries, etc, while + # -Wl,-mfoo simply passes -mfoo to the linker. + -m*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + if test "$with_gcc" = "yes" ; then + compiler_flags="$compiler_flags $arg" + fi + continue + ;; + + -shrext) + prev=shrext + continue + ;; + -no-fast-install) fast_install=no continue @@ -1100,8 +1428,18 @@ compiler." continue ;; + -objectlist) + prev=objectlist + continue + ;; + -o) prev=output ;; + -precious-files-regex) + prev=precious_regex + continue + ;; + -release) prev=release continue @@ -1124,7 +1462,7 @@ compiler." [\\/]* | [A-Za-z]:[\\/]*) ;; *) $echo "$modename: only absolute run-paths are allowed" 1>&2 - exit 1 + exit $EXIT_FAILURE ;; esac case "$xrpath " in @@ -1152,6 +1490,11 @@ compiler." prev=vinfo continue ;; + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; -Wc,*) args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` @@ -1200,6 +1543,11 @@ compiler." continue ;; + -XCClinker) + prev=xcclinker + continue + ;; + # Some other compiler flag. -* | +*) # Unknown arguments in both finalize_command and compile_command need @@ -1212,29 +1560,101 @@ compiler." esac ;; - *.lo | *.$objext) - # A library or standard object. - if test "$prev" = dlfiles; then - # This file was specified with -dlopen. - if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then - dlfiles="$dlfiles $arg" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi + *.$objext) + # A standard object. + objs="$objs $arg" + ;; - if test "$prev" = dlprefiles; then - # Preload the old-style object. - dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"` - prev= - else + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. case $arg in - *.lo) libobjs="$libobjs $arg" ;; - *) objs="$objs $arg" ;; + */* | *\\*) . $arg ;; + *) . ./$arg ;; esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi fi ;; @@ -1285,7 +1705,7 @@ compiler." if test -n "$prev"; then $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then @@ -1294,6 +1714,7 @@ compiler." finalize_command="$finalize_command $arg" fi + oldlibs= # calculate the name of the file, without its directory outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` libobjs_save="$libobjs" @@ -1314,11 +1735,11 @@ compiler." output_objdir="$output_objdir/$objdir" fi # Create the object directory. - if test ! -d $output_objdir; then + if test ! -d "$output_objdir"; then $show "$mkdir $output_objdir" $run $mkdir $output_objdir status=$? - if test $status -ne 0 && test ! -d $output_objdir; then + if test "$status" -ne 0 && test ! -d "$output_objdir"; then exit $status fi fi @@ -1328,7 +1749,7 @@ compiler." "") $echo "$modename: you must specify an output file" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; @@ -1336,7 +1757,17 @@ compiler." *) linkmode=prog ;; # Anything else should be a program. esac + case $host in + *cygwin* | *mingw* | *pw32*) + # don't eliminate duplications in $postdeps and $predeps + duplicate_compiler_generated_deps=yes + ;; + *) + duplicate_compiler_generated_deps=$duplicate_deps + ;; + esac specialdeplibs= + libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) @@ -1348,6 +1779,25 @@ compiler." fi libs="$libs $deplib" done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$pre_post_deps $pre_post_dep" + done + fi + pre_post_deps= + fi + deplibs= newdependency_libs= newlib_search_path= @@ -1362,7 +1812,7 @@ compiler." *.la) ;; *) $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 - exit 1 + exit $EXIT_FAILURE ;; esac done @@ -1379,39 +1829,59 @@ compiler." ;; esac for pass in $passes; do - if test $linkmode = prog; then - # Determine which files to process + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then case $pass in - dlopen) - libs="$dlfiles" - save_deplibs="$deplibs" # Collect dlpreopened libraries - deplibs= - ;; + dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi for deplib in $libs; do lib= found=no case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + fi + continue + ;; -l*) - if test $linkmode = oldlib && test $linkmode = obj; then - $echo "$modename: warning: \`-l' is ignored for archives/objects: $deplib" 1>&2 + if test "$linkmode" != lib && test "$linkmode" != prog; then + $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 continue fi - if test $pass = conv; then + if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do - # Search the libtool library - lib="$searchdir/lib${name}.la" - if test -f "$lib"; then - found=yes - break - fi + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library @@ -1420,40 +1890,76 @@ compiler." finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" - test $linkmode = lib && newdependency_libs="$deplib $newdependency_libs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if (${SED} -e '2q' $lib | + grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + library_names= + old_library= + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi fi ;; # -l -L*) case $linkmode in lib) deplibs="$deplib $deplibs" - test $pass = conv && continue + test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` ;; prog) - if test $pass = conv; then + if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi - if test $pass = scan; then + if test "$pass" = scan; then deplibs="$deplib $deplibs" - newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` ;; *) - $echo "$modename: warning: \`-L' is ignored for archives/objects: $deplib" 1>&2 + $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 ;; esac # linkmode continue ;; # -L -R*) - if test $pass = link; then + if test "$pass" = link; then dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` # Make sure the xrpath contains only unique directories. case "$xrpath " in @@ -1466,30 +1972,30 @@ compiler." ;; *.la) lib="$deplib" ;; *.$libext) - if test $pass = conv; then + if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) if test "$deplibs_check_method" != pass_all; then - echo - echo "*** Warning: Trying to link with static lib archive $deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because the file extensions .$libext of this argument makes me believe" - echo "*** that it is just a static archive that I should not used here." + $echo + $echo "*** Warning: Trying to link with static lib archive $deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because the file extensions .$libext of this argument makes me believe" + $echo "*** that it is just a static archive that I should not used here." else - echo - echo "*** Warning: Linking the shared library $output against the" - echo "*** static library $deplib is not portable!" + $echo + $echo "*** Warning: Linking the shared library $output against the" + $echo "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi continue ;; prog) - if test $pass != link; then + if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" @@ -1500,14 +2006,18 @@ compiler." esac # linkmode ;; # *.$libext *.lo | *.$objext) - if test $pass = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then - # If there is no dlopen support or we're linking statically, - # we need to preload. - newdlprefiles="$newdlprefiles $deplib" - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - newdlfiles="$newdlfiles $deplib" + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" + fi fi continue ;; @@ -1516,17 +2026,17 @@ compiler." continue ;; esac # case $deplib - if test $found = yes || test -f "$lib"; then : + if test "$found" = yes || test -f "$lib"; then : else $echo "$modename: cannot find the library \`$lib'" 1>&2 - exit 1 + exit $EXIT_FAILURE fi # Check to see that this really is a libtool archive. - if (${SED} -e '2q' $lib | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 - exit 1 + exit $EXIT_FAILURE fi ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` @@ -1539,8 +2049,9 @@ compiler." library_names= old_library= # If the library was installed with an old release of libtool, - # it will not redefine variable installed. + # it will not redefine variables installed, or shouldnotlink installed=yes + shouldnotlink=no # Read the .la file case $lib in @@ -1550,19 +2061,18 @@ compiler." if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || - { test $linkmode = oldlib && test $linkmode = obj; }; then - # Add dl[pre]opened files of deplib + { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && dlfiles="$dlfiles $dlopen" test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" fi - if test $pass = conv; then + if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 - exit 1 + exit $EXIT_FAILURE fi # It is a libtool convenience library, so add in its objects. convenience="$convenience $ladir/$objdir/$old_library" @@ -1577,13 +2087,14 @@ compiler." fi tmp_libs="$tmp_libs $deplib" done - elif test $linkmode != prog && test $linkmode != lib; then + elif test "$linkmode" != prog && test "$linkmode" != lib; then $echo "$modename: \`$lib' is not a convenience library" 1>&2 - exit 1 + exit $EXIT_FAILURE fi continue fi # $pass = conv + # Get the name of the library we link against. linklib= for l in $old_library $library_names; do @@ -1591,19 +2102,23 @@ compiler." done if test -z "$linklib"; then $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 - exit 1 + exit $EXIT_FAILURE fi # This library was specified with -dlopen. - if test $pass = dlopen; then + if test "$pass" = dlopen; then if test -z "$libdir"; then $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 - exit 1 + exit $EXIT_FAILURE fi - if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking - # statically, we need to preload. - dlprefiles="$dlprefiles $lib" + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + dlprefiles="$dlprefiles $lib $dependency_libs" else newdlfiles="$newdlfiles $lib" fi @@ -1644,10 +2159,10 @@ compiler." name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` # This library was specified with -dlpreopen. - if test $pass = dlpreopen; then + if test "$pass" = dlpreopen; then if test -z "$libdir"; then $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 - exit 1 + exit $EXIT_FAILURE fi # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). @@ -1663,18 +2178,19 @@ compiler." if test -z "$libdir"; then # Link the convenience library - if test $linkmode = lib; then + if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else - deplibs="$lib $deplibs" + deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi - if test $linkmode = prog && test $pass != link; then + + if test "$linkmode" = prog && test "$pass" != link; then newlib_search_path="$newlib_search_path $ladir" deplibs="$lib $deplibs" @@ -1690,7 +2206,7 @@ compiler." -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test esac # Need to link against all dependency_libs? - if test $linkalldeplibs = yes; then + if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths @@ -1707,13 +2223,19 @@ compiler." continue fi # $linkmode = prog... - link_static=no # Whether the deplib will be linked statically - if test -n "$library_names" && - { test "$prefer_static_libs" = no || test -z "$old_library"; }; then - # Link against this shared library + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var"; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath " in + *" $dir "*) ;; + *" $absdir "*) ;; + *) temp_rpath="$temp_rpath $dir" ;; + esac + fi - if test "$linkmode,$pass" = "prog,link" || - { test $linkmode = lib && test $hardcode_into_libs = yes; }; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. @@ -1735,17 +2257,6 @@ compiler." esac ;; esac - if test $linkmode = prog; then - # We need to hardcode the library path - if test -n "$shlibpath_var"; then - # Make sure the rpath contains only unique directories. - case "$temp_rpath " in - *" $dir "*) ;; - *" $absdir "*) ;; - *) temp_rpath="$temp_rpath $dir" ;; - esac - fi - fi fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && @@ -1755,11 +2266,52 @@ compiler." # We only need to search for static libraries continue fi + fi + link_static=no # Whether the deplib will be linked statically + if test -n "$library_names" && + { test "$prefer_static_libs" = no || test -z "$old_library"; }; then if test "$installed" = no; then notinst_deplibs="$notinst_deplibs $lib" need_relink=yes fi + # This is a shared library + + # Warn about portability, can't link against -module's on + # some systems (darwin) + if test "$shouldnotlink" = yes && test "$pass" = link ; then + $echo + if test "$linkmode" = prog; then + $echo "*** Warning: Linking the executable $output against the loadable module" + else + $echo "*** Warning: Linking the shared library $output against the loadable module" + fi + $echo "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname @@ -1773,7 +2325,7 @@ compiler." elif test -n "$soname_spec"; then # bleh windows case $host in - *cygwin*) + *cygwin* | mingw*) major=`expr $current - $age` versuffix="-$major" ;; @@ -1785,17 +2337,18 @@ compiler." # Make a new name for the extract_expsyms_cmds to use soroot="$soname" - soname=`echo $soroot | ${SED} -e 's/^.*\///'` - newlib="libimp-`echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" + soname=`$echo $soroot | ${SED} -e 's/^.*\///'` + newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else $show "extracting exported symbol list from \`$soname'" save_ifs="$IFS"; IFS='~' - eval cmds=\"$extract_expsyms_cmds\" + cmds=$extract_expsyms_cmds for cmd in $cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done @@ -1806,9 +2359,10 @@ compiler." if test -f "$output_objdir/$newlib"; then :; else $show "generating import library for \`$soname'" save_ifs="$IFS"; IFS='~' - eval cmds=\"$old_archive_from_expsyms_cmds\" + cmds=$old_archive_from_expsyms_cmds for cmd in $cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done @@ -1817,9 +2371,9 @@ compiler." # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib - fi # test -n $old_archive_from_expsyms_cmds + fi # test -n "$old_archive_from_expsyms_cmds" - if test $linkmode = prog || test "$mode" != relink; then + if test "$linkmode" = prog || test "$mode" != relink; then add_shlibpath= add_dir= add= @@ -1828,6 +2382,22 @@ compiler." immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" + case $host in + *-*-sco3.2v5* ) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a module then we can not link against + # it, someone is ignoring the new warnings I added + if /usr/bin/file -L $add 2> /dev/null | $EGREP "bundle" >/dev/null ; then + $echo "** Warning, lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + $echo + $echo "** And there doesn't seem to be a static archive available" + $echo "** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + fi + esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; @@ -1846,6 +2416,14 @@ compiler." add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case "$libdir" in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" @@ -1859,7 +2437,7 @@ compiler." if test "$lib_linked" != yes; then $echo "$modename: configuration error: unsupported hardcode properties" - exit 1 + exit $EXIT_FAILURE fi if test -n "$add_shlibpath"; then @@ -1868,7 +2446,7 @@ compiler." *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; esac fi - if test $linkmode = prog; then + if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else @@ -1885,7 +2463,7 @@ compiler." fi fi - if test $linkmode = prog || test "$mode" = relink; then + if test "$linkmode" = prog || test "$mode" = relink; then add_shlibpath= add_dir= add= @@ -1901,13 +2479,28 @@ compiler." *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case "$libdir" in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi add="-l$name" fi - if test $linkmode = prog; then + if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else @@ -1915,16 +2508,7 @@ compiler." test -n "$add" && deplibs="$add $deplibs" fi fi - elif test $linkmode = prog; then - if test "$alldeplibs" = yes && - { test "$deplibs_check_method" = pass_all || - { test "$build_libtool_libs" = yes && - test -n "$library_names"; }; }; then - # We only need to search for static libraries - continue - fi - - # Try to link the static library + elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. @@ -1944,21 +2528,21 @@ compiler." # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. - echo - echo "*** Warning: This system can not link to static lib archive $lib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have." + $echo + $echo "*** Warning: This system can not link to static lib archive $lib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then - echo "*** But as you try to build a module library, libtool will still create " - echo "*** a static module, that should work as long as the dlopening application" - echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + $echo "*** But as you try to build a module library, libtool will still create " + $echo "*** a static module, that should work as long as the dlopening application" + $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then - echo - echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using \`nm' or equivalent, but libtool could" - echo "*** not find such a program. So, this module is probably useless." - echo "*** \`nm' from GNU binutils and a full rebuild may help." + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module @@ -1975,10 +2559,11 @@ compiler." fi fi # link shared/static library? - if test $linkmode = lib; then + if test "$linkmode" = lib; then if test -n "$dependency_libs" && - { test $hardcode_into_libs != yes || test $build_old_libs = yes || - test $link_static = yes; }; then + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do @@ -2009,7 +2594,7 @@ compiler." tmp_libs="$tmp_libs $deplib" done - if test $link_all_deplibs != no; then + if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do case $deplib in @@ -2029,22 +2614,67 @@ compiler." ;; esac if grep "^installed=no" $deplib > /dev/null; then - path="-L$absdir/$objdir" + path="$absdir/$objdir" else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` if test -z "$libdir"; then $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 - exit 1 + exit $EXIT_FAILURE fi if test "$absdir" != "$libdir"; then $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 fi - path="-L$absdir" + path="$absdir" fi + depdepl= + case $host in + *-*-darwin*) + # we do not want to link against static libs, + # but need to link against shared + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$path/$depdepl" ; then + depdepl="$path/$depdepl" + fi + # do not add paths which are already there + case " $newlib_search_path " in + *" $path "*) ;; + *) newlib_search_path="$newlib_search_path $path";; + esac + fi + path="" + ;; + *) + path="-L$path" + ;; + esac + ;; + -l*) + case $host in + *-*-darwin*) + # Again, we only want to link against shared libraries + eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` + for tmp in $newlib_search_path ; do + if test -f "$tmp/lib$tmp_libs.dylib" ; then + eval depdepl="$tmp/lib$tmp_libs.dylib" + break + fi + done + path="" + ;; + *) continue ;; + esac ;; *) continue ;; esac case " $deplibs " in + *" $depdepl "*) ;; + *) deplibs="$depdepl $deplibs" ;; + esac + case " $deplibs " in *" $path "*) ;; *) deplibs="$deplibs $path" ;; esac @@ -2052,15 +2682,15 @@ compiler." fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs - if test $pass = dlpreopen; then + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi - if test $pass != dlopen; then - test $pass != scan && dependency_libs="$newdependency_libs" - if test $pass != conv; then + if test "$pass" != dlopen; then + if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do @@ -2082,9 +2712,30 @@ compiler." eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) @@ -2112,19 +2763,32 @@ compiler." eval $var=\"$tmp_libs\" done # for var fi - if test "$pass" = "conv" && - { test "$linkmode" = "lib" || test "$linkmode" = "prog"; }; then - libs="$deplibs" # reset libs - deplibs= - fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + tmp_libs="$tmp_libs $i" + fi + done + dependency_libs=$tmp_libs done # for pass - if test $linkmode = prog; then + if test "$linkmode" = prog; then dlfiles="$newdlfiles" dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 + fi + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 fi @@ -2138,7 +2802,7 @@ compiler." fi if test -n "$vinfo"; then - $echo "$modename: warning: \`-version-info' is ignored for archives" 1>&2 + $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 fi if test -n "$release"; then @@ -2160,17 +2824,19 @@ compiler." case $outputname in lib*) name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) if test "$module" = no; then $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` @@ -2181,11 +2847,11 @@ compiler." if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 - exit 1 + exit $EXIT_FAILURE else - echo - echo "*** Warning: Linking the shared library $output against the non-libtool" - echo "*** objects $objs is not portable!" + $echo + $echo "*** Warning: Linking the shared library $output against the non-libtool" + $echo "*** objects $objs is not portable!" libobjs="$libobjs $objs" fi fi @@ -2195,7 +2861,7 @@ compiler." fi set dummy $rpath - if test $# -gt 2; then + if test "$#" -gt 2; then $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 fi install_libdir="$2" @@ -2204,14 +2870,16 @@ compiler." if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. - libext=al + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi if test -n "$vinfo"; then - $echo "$modename: warning: \`-version-info' is ignored for convenience libraries" 1>&2 + $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 fi if test -n "$release"; then @@ -2227,12 +2895,49 @@ compiler." if test -n "$8"; then $echo "$modename: too many parameters to \`-version-info'" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi - current="$2" - revision="$3" - age="$4" + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$2" + number_minor="$3" + number_revision="$4" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows) + current=`expr $number_major + $number_minor` + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + current=`expr $number_major + $number_minor - 1` + age="$number_minor" + revision="$number_minor" + ;; + esac + ;; + no) + current="$2" + revision="$3" + age="$4" + ;; + esac # Check that each of the things are valid numbers. case $current in @@ -2240,7 +2945,7 @@ compiler." *) $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit 1 + exit $EXIT_FAILURE ;; esac @@ -2249,7 +2954,7 @@ compiler." *) $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit 1 + exit $EXIT_FAILURE ;; esac @@ -2258,14 +2963,14 @@ compiler." *) $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit 1 + exit $EXIT_FAILURE ;; esac - if test $age -gt $current; then + if test "$age" -gt "$current"; then $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit 1 + exit $EXIT_FAILURE fi # Calculate the version variables. @@ -2275,28 +2980,15 @@ compiler." case $version_type in none) ;; - darwin* | rhapsody*) - case "$host_os" in - darwin1.[012]) - # Like Linux, but with the current version available in - # verstring for coding it into the library header - major=.`expr $current - $age` - versuffix="$major.$age.$revision" - # Darwin ld doesn't like 0 for these options... - minor_current=`expr $current + 1` - verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" - ;; - *) - # Like Linux, but with the current version available in - # verstring for coding it into the library header - major=`expr $current - $age` - versuffix="$major.$age.$revision" - compatage=`expr $age - 1` - compatver="$major.$compatage.0" - verstring="-compatibility_version $compatver -current_version $versuffix" - ;; - esac - ;; + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + minor_current=`expr $current + 1` + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; freebsd-aout) major=".$current" @@ -2319,7 +3011,7 @@ compiler." # Add in all the interfaces that we are compatible with. loop=$revision - while test $loop != 0; do + while test "$loop" -ne 0; do iface=`expr $revision - $loop` loop=`expr $loop - 1` verstring="$verstring_prefix$major.$iface:$verstring" @@ -2342,7 +3034,7 @@ compiler." # Add in all the interfaces that we are compatible with. loop=$age - while test $loop != 0; do + while test "$loop" -ne 0; do iface=`expr $current - $loop` loop=`expr $loop - 1` verstring="$verstring:${iface}.0" @@ -2366,20 +3058,19 @@ compiler." *) $echo "$modename: unknown library version type \`$version_type'" 1>&2 - echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 - exit 1 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= - verstring="0.0" case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely - verstring="" + verstring= ;; *) verstring="0.0" @@ -2413,9 +3104,30 @@ compiler." fi if test "$mode" != relink; then - # Remove our outputs. - $show "${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*" - $run ${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.* + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$echo "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + removelist="$removelist $p" + ;; + *) ;; + esac + done + if test -n "$removelist"; then + $show "${rm}r $removelist" + $run ${rm}r $removelist + fi fi # Now set the variables for building old libraries. @@ -2428,9 +3140,9 @@ compiler." # Eliminate all temporary directories. for path in $notinst_path; do - lib_search_path=`echo "$lib_search_path " | ${SED} -e 's% $path % %g'` - deplibs=`echo "$deplibs " | ${SED} -e 's% -L$path % %g'` - dependency_libs=`echo "$dependency_libs " | ${SED} -e 's% -L$path % %g'` + lib_search_path=`$echo "$lib_search_path " | ${SED} -e 's% $path % %g'` + deplibs=`$echo "$deplibs " | ${SED} -e 's% -L$path % %g'` + dependency_libs=`$echo "$dependency_libs " | ${SED} -e 's% -L$path % %g'` done if test -n "$xrpath"; then @@ -2443,7 +3155,7 @@ compiler." *) finalize_rpath="$finalize_rpath $libdir" ;; esac done - if test $hardcode_into_libs != yes || test $build_old_libs = yes; then + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi @@ -2483,10 +3195,11 @@ compiler." ;; *-*-openbsd* | *-*-freebsd*) # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue ;; - *) + *) # Add libc to deplibs on all other systems if necessary. - if test $build_libtool_need_lc = "yes"; then + if test "$build_libtool_need_lc" = "yes"; then deplibs="$deplibs -lc" fi ;; @@ -2513,7 +3226,7 @@ compiler." # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just - # implementing what was already the behaviour. + # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) @@ -2526,45 +3239,22 @@ compiler." int main() { return 0; } EOF $rm conftest - $CC -o conftest conftest.c $deplibs - if test $? -eq 0 ; then + $LTCC -o conftest conftest.c $deplibs + if test "$?" -eq 0 ; then ldd_output=`ldd conftest` for i in $deplibs; do name="`expr $i : '-l\(.*\)'`" # If $name is empty we are operating on a -L argument. - if test -n "$name" && test "$name" != "0"; then - libname=`eval \\$echo \"$libname_spec\"` - deplib_matches=`eval \\$echo \"$library_names_spec\"` - set dummy $deplib_matches - deplib_match=$2 - if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then - newdeplibs="$newdeplibs $i" - else - droppeddeps=yes - echo - echo "*** Warning: dynamic linker does not accept needed library $i." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which I believe you do not have" - echo "*** because a test_compile did reveal that the linker did not use it for" - echo "*** its dynamic dependency list that programs get resolved with at runtime." - fi - else - newdeplibs="$newdeplibs $i" - fi - done - else - # Error occured in the first compile. Let's try to salvage - # the situation: Compile a separate program for each library. - for i in $deplibs; do - name="`expr $i : '-l\(.*\)'`" - # If $name is empty we are operating on a -L argument. - if test -n "$name" && test "$name" != "0"; then - $rm conftest - $CC -o conftest conftest.c $i - # Did it work? - if test $? -eq 0 ; then - ldd_output=`ldd conftest` + if test "$name" != "" && test "$name" -ne "0"; then + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $i "*) + newdeplibs="$newdeplibs $i" + i="" + ;; + esac + fi + if test -n "$i" ; then libname=`eval \\$echo \"$libname_spec\"` deplib_matches=`eval \\$echo \"$library_names_spec\"` set dummy $deplib_matches @@ -2573,21 +3263,64 @@ EOF newdeplibs="$newdeplibs $i" else droppeddeps=yes - echo - echo "*** Warning: dynamic linker does not accept needed library $i." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because a test_compile did reveal that the linker did not use this one" - echo "*** as a dynamic dependency that programs can get resolved with at runtime." + $echo + $echo "*** Warning: dynamic linker does not accept needed library $i." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which I believe you do not have" + $echo "*** because a test_compile did reveal that the linker did not use it for" + $echo "*** its dynamic dependency list that programs get resolved with at runtime." + fi + fi + else + newdeplibs="$newdeplibs $i" + fi + done + else + # Error occurred in the first compile. Let's try to salvage + # the situation: Compile a separate program for each library. + for i in $deplibs; do + name="`expr $i : '-l\(.*\)'`" + # If $name is empty we are operating on a -L argument. + if test "$name" != "" && test "$name" != "0"; then + $rm conftest + $LTCC -o conftest conftest.c $i + # Did it work? + if test "$?" -eq 0 ; then + ldd_output=`ldd conftest` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $i "*) + newdeplibs="$newdeplibs $i" + i="" + ;; + esac + fi + if test -n "$i" ; then + libname=`eval \\$echo \"$libname_spec\"` + deplib_matches=`eval \\$echo \"$library_names_spec\"` + set dummy $deplib_matches + deplib_match=$2 + if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then + newdeplibs="$newdeplibs $i" + else + droppeddeps=yes + $echo + $echo "*** Warning: dynamic linker does not accept needed library $i." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because a test_compile did reveal that the linker did not use this one" + $echo "*** as a dynamic dependency that programs can get resolved with at runtime." + fi fi else droppeddeps=yes - echo - echo "*** Warning! Library $i is needed by this library but I was not able to" - echo "*** make it link in! You will probably need to install it or some" - echo "*** library that it depends on before this library will be fully" - echo "*** functional. Installing it before continuing would be even better." + $echo + $echo "*** Warning! Library $i is needed by this library but I was not able to" + $echo "*** make it link in! You will probably need to install it or some" + $echo "*** library that it depends on before this library will be fully" + $echo "*** functional. Installing it before continuing would be even better." fi else newdeplibs="$newdeplibs $i" @@ -2601,11 +3334,20 @@ EOF for a_deplib in $deplibs; do name="`expr $a_deplib : '-l\(.*\)'`" # If $name is empty we are operating on a -L argument. - if test -n "$name" && test "$name" != "0"; then - libname=`eval \\$echo \"$libname_spec\"` - for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do - potential_libs=`ls $i/$libname[.-]* 2>/dev/null` - for potent_lib in $potential_libs; do + if test "$name" != "" && test "$name" != "0"; then + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval \\$echo \"$libname_spec\"` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null \ | grep " -> " >/dev/null; then @@ -2626,26 +3368,27 @@ EOF done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ | ${SED} 10q \ - | egrep "$file_magic_regex" > /dev/null; then + | $EGREP "$file_magic_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi - done - done + done + done + fi if test -n "$a_deplib" ; then droppeddeps=yes - echo - echo "*** Warning: linker path does not have real file for library $a_deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because I did check the linker path looking for a file starting" + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then - echo "*** with $libname but no candidates were found. (...for file magic test)" + $echo "*** with $libname but no candidates were found. (...for file magic test)" else - echo "*** with $libname and none of the candidates passed a file format test" - echo "*** using a file magic. Last file checked: $potlib" + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a file magic. Last file checked: $potlib" fi fi else @@ -2661,33 +3404,43 @@ EOF name="`expr $a_deplib : '-l\(.*\)'`" # If $name is empty we are operating on a -L argument. if test -n "$name" && test "$name" != "0"; then - libname=`eval \\$echo \"$libname_spec\"` - for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do - potential_libs=`ls $i/$libname[.-]* 2>/dev/null` - for potent_lib in $potential_libs; do - potlib="$potent_lib" # see symlink-check below in file_magic test - if eval echo \"$potent_lib\" 2>/dev/null \ - | ${SED} 10q \ - | egrep "$match_pattern_regex" > /dev/null; then - newdeplibs="$newdeplibs $a_deplib" - a_deplib="" - break 2 - fi + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval \\$echo \"$libname_spec\"` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval $echo \"$potent_lib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done done - done + fi if test -n "$a_deplib" ; then droppeddeps=yes - echo - echo "*** Warning: linker path does not have real file for library $a_deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because I did check the linker path looking for a file starting" + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then - echo "*** with $libname but no candidates were found. (...for regex pattern test)" + $echo "*** with $libname but no candidates were found. (...for regex pattern test)" else - echo "*** with $libname and none of the candidates passed a file format test" - echo "*** using a regex pattern. Last file checked: $potlib" + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a regex pattern. Last file checked: $potlib" fi fi else @@ -2698,16 +3451,23 @@ EOF ;; none | unknown | *) newdeplibs="" - if $echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ - -e 's/ -[LR][^ ]*//g' -e 's/[ ]//g' | - grep . >/dev/null; then - echo + tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` + done + fi + if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ + | grep . >/dev/null; then + $echo if test "X$deplibs_check_method" = "Xnone"; then - echo "*** Warning: inter-library dependencies are not supported in this platform." + $echo "*** Warning: inter-library dependencies are not supported in this platform." else - echo "*** Warning: inter-library dependencies are not known to be supported." + $echo "*** Warning: inter-library dependencies are not known to be supported." fi - echo "*** All declared inter-library dependencies are being dropped." + $echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes fi ;; @@ -2727,17 +3487,17 @@ EOF if test "$droppeddeps" = yes; then if test "$module" = yes; then - echo - echo "*** Warning: libtool could not satisfy all declared inter-library" - echo "*** dependencies of module $libname. Therefore, libtool will create" - echo "*** a static module, that should work as long as the dlopening" - echo "*** application is linked with the -dlopen flag." + $echo + $echo "*** Warning: libtool could not satisfy all declared inter-library" + $echo "*** dependencies of module $libname. Therefore, libtool will create" + $echo "*** a static module, that should work as long as the dlopening" + $echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then - echo - echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using \`nm' or equivalent, but libtool could" - echo "*** not find such a program. So, this module is probably useless." - echo "*** \`nm' from GNU binutils and a full rebuild may help." + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" @@ -2747,16 +3507,16 @@ EOF build_libtool_libs=no fi else - echo "*** The inter-library dependencies that have been dropped here will be" - echo "*** automatically added whenever a program is linked with this library" - echo "*** or is declared to -dlopen it." + $echo "*** The inter-library dependencies that have been dropped here will be" + $echo "*** automatically added whenever a program is linked with this library" + $echo "*** or is declared to -dlopen it." - if test $allow_undefined = no; then - echo - echo "*** Since this library must not contain undefined symbols," - echo "*** because either the platform does not support them or" - echo "*** it was explicitly requested with -no-undefined," - echo "*** libtool will only create a static version of it." + if test "$allow_undefined" = no; then + $echo + $echo "*** Since this library must not contain undefined symbols," + $echo "*** because either the platform does not support them or" + $echo "*** it was explicitly requested with -no-undefined," + $echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module @@ -2778,7 +3538,7 @@ EOF # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then - if test $hardcode_into_libs = yes; then + if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= @@ -2814,7 +3574,11 @@ EOF if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" - eval dep_rpath=\"$hardcode_libdir_flag_spec\" + if test -n "$hardcode_libdir_flag_spec_ld"; then + eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. @@ -2834,6 +3598,7 @@ EOF fi # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names realname="$2" @@ -2844,7 +3609,9 @@ EOF else soname="$realname" fi - test -z "$dlname" && dlname=$soname + if test -z "$dlname"; then + dlname=$soname + fi lib="$output_objdir/$realname" for link @@ -2852,23 +3619,6 @@ EOF linknames="$linknames $link" done - # Ensure that we have .o objects for linkers which dislike .lo - # (e.g. aix) in case we are running --disable-static - for obj in $libobjs; do - xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$obj"; then - xdir="." - else - xdir="$xdir" - fi - baseobj=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` - oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"` - if test ! -f $xdir/$oldobj; then - $show "(cd $xdir && ${LN_S} $baseobj $oldobj)" - $run eval '(cd $xdir && ${LN_S} $baseobj $oldobj)' || exit $? - fi - done - # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` @@ -2878,17 +3628,26 @@ EOF $show "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $run $rm $export_symbols - eval cmds=\"$export_symbols_cmds\" + cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? + eval cmd=\"$cmd\" + if len=`expr "X$cmd" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + $show "$cmd" + $run eval "$cmd" || exit $? + skipped_export=false + else + # The command line is too long to execute in one step. + $show "using reloadable object file for export list..." + skipped_export=: + fi done IFS="$save_ifs" if test -n "$export_symbols_regex"; then - $show "egrep -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" - $run eval 'egrep -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" + $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' $show "$mv \"${export_symbols}T\" \"$export_symbols\"" $run eval '$mv "${export_symbols}T" "$export_symbols"' fi @@ -2899,17 +3658,29 @@ EOF $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' fi + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + tmp_deplibs="$tmp_deplibs $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" else gentop="$output_objdir/${outputname}x" $show "${rm}r $gentop" $run ${rm}r "$gentop" - $show "mkdir $gentop" - $run mkdir "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" status=$? - if test $status -ne 0 && test ! -d "$gentop"; then + if test "$status" -ne 0 && test ! -d "$gentop"; then exit $status fi generated="$generated $gentop" @@ -2925,16 +3696,42 @@ EOF $show "${rm}r $xdir" $run ${rm}r "$xdir" - $show "mkdir $xdir" - $run mkdir "$xdir" + $show "$mkdir $xdir" + $run $mkdir "$xdir" status=$? - if test $status -ne 0 && test ! -d "$xdir"; then + if test "$status" -ne 0 && test ! -d "$xdir"; then exit $status fi + # We will extract separately just the conflicting names and we will no + # longer touch any unique names. It is faster to leave these extract + # automatically by $AR in one run. $show "(cd $xdir && $AR x $xabs)" $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 + $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 + $AR t "$xabs" | sort | uniq -cd | while read -r count name + do + i=1 + while test "$i" -le "$count" + do + # Put our $i before any first dot (extension) + # Never overwrite any file + name_to="$name" + while test "X$name_to" = "X$name" || test -f "$xdir/$name_to" + do + name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` + done + $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')" + $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $? + i=`expr $i + 1` + done + done + fi - libobjs="$libobjs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` + libobjs="$libobjs "`find $xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` done fi fi @@ -2950,25 +3747,147 @@ EOF fi # Do each of the archive commands. - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - eval cmds=\"$archive_expsym_cmds\" + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi else - save_deplibs="$deplibs" - for conv in $convenience; do - tmp_deplibs= - for test_deplib in $deplibs; do - if test "$test_deplib" != "$conv"; then - tmp_deplibs="$tmp_deplibs $test_deplib" + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && len=`expr "X$test_cmds" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise. + $echo "creating reloadable object files..." + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + delfiles= + last_robj= + k=1 + output=$output_objdir/$save_output-${k}.$objext + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + eval test_cmds=\"$reload_cmds $objlist $last_robj\" + if test "X$objlist" = X || + { len=`expr "X$test_cmds" : ".*"` && + test "$len" -le "$max_cmd_len"; }; then + objlist="$objlist $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" fi - done - deplibs="$tmp_deplibs" + last_robj=$output_objdir/$save_output-${k}.$objext + k=`expr $k + 1` + output=$output_objdir/$save_output-${k}.$objext + objlist=$obj + len=1 + fi done - eval cmds=\"$archive_cmds\" - deplibs="$save_deplibs" + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + + if ${skipped_export-false}; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + libobjs=$output + # Append the command to create the export file. + eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" + fi + + # Set up a command to remove the reloadale object files + # after they are used. + i=0 + while test "$i" -lt "$k" + do + i=`expr $i + 1` + delfiles="$delfiles $output_objdir/$save_output-${i}.$objext" + done + + $echo "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + + # Append the command to remove the reloadable object files + # to the just-reset $cmds. + eval cmds=\"\$cmds~\$rm $delfiles\" fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done @@ -2977,7 +3896,7 @@ EOF # Restore the uninstalled library and exit if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? - exit 0 + exit $EXIT_SUCCESS fi # Create links to the real library. @@ -3025,7 +3944,7 @@ EOF *.lo) if test -n "$objs$old_deplibs"; then $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 - exit 1 + exit $EXIT_FAILURE fi libobj="$output" obj=`$echo "X$output" | $Xsed -e "$lo2o"` @@ -3056,10 +3975,10 @@ EOF gentop="$output_objdir/${obj}x" $show "${rm}r $gentop" $run ${rm}r "$gentop" - $show "mkdir $gentop" - $run mkdir "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" status=$? - if test $status -ne 0 && test ! -d "$gentop"; then + if test "$status" -ne 0 && test ! -d "$gentop"; then exit $status fi generated="$generated $gentop" @@ -3075,16 +3994,42 @@ EOF $show "${rm}r $xdir" $run ${rm}r "$xdir" - $show "mkdir $xdir" - $run mkdir "$xdir" + $show "$mkdir $xdir" + $run $mkdir "$xdir" status=$? - if test $status -ne 0 && test ! -d "$xdir"; then + if test "$status" -ne 0 && test ! -d "$xdir"; then exit $status fi + # We will extract separately just the conflicting names and we will no + # longer touch any unique names. It is faster to leave these extract + # automatically by $AR in one run. $show "(cd $xdir && $AR x $xabs)" $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 + $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 + $AR t "$xabs" | sort | uniq -cd | while read -r count name + do + i=1 + while test "$i" -le "$count" + do + # Put our $i before any first dot (extension) + # Never overwrite any file + name_to="$name" + while test "X$name_to" = "X$name" || test -f "$xdir/$name_to" + do + name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` + done + $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')" + $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $? + i=`expr $i + 1` + done + done + fi - reload_conv_objs="$reload_objs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` + reload_conv_objs="$reload_objs "`find $xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` done fi fi @@ -3093,10 +4038,11 @@ EOF reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" - eval cmds=\"$reload_cmds\" + cmds=$reload_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done @@ -3109,7 +4055,7 @@ EOF $run ${rm}r $gentop fi - exit 0 + exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then @@ -3120,37 +4066,24 @@ EOF # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. - $show "echo timestamp > $libobj" - $run eval "echo timestamp > $libobj" || exit $? - exit 0 + # $show "echo timestamp > $libobj" + # $run eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" - eval cmds=\"$reload_cmds\" + cmds=$reload_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" - else - # Just create a symlink. - $show $rm $libobj - $run $rm $libobj - xdir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$libobj"; then - xdir="." - else - xdir="$xdir" - fi - baseobj=`$echo "X$libobj" | $Xsed -e 's%^.*/%%'` - oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"` - $show "(cd $xdir && $LN_S $oldobj $baseobj)" - $run eval '(cd $xdir && $LN_S $oldobj $baseobj)' || exit $? fi if test -n "$gentop"; then @@ -3158,12 +4091,12 @@ EOF $run ${rm}r $gentop fi - exit 0 + exit $EXIT_SUCCESS ;; prog) case $host in - *cygwin*) output=`echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; + *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; esac if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 @@ -3185,16 +4118,19 @@ EOF # On Rhapsody replace the C library is the System framework compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` - case $host in - *darwin*) - # Don't allow lazy linking, it breaks C++ global constructors - compile_command="$compile_command ${wl}-bind_at_load" - finalize_command="$finalize_command ${wl}-bind_at_load" - ;; - esac ;; esac + case $host in + *darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + if test "$tagname" = CXX ; then + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + fi + ;; + esac + compile_command="$compile_command $compile_deplibs" finalize_command="$finalize_command $finalize_deplibs" @@ -3345,12 +4281,12 @@ extern \"C\" { done if test -n "$exclude_expsyms"; then - $run eval 'egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' $run eval '$mv "$nlist"T "$nlist"' fi if test -n "$export_symbols_regex"; then - $run eval 'egrep -e "$export_symbols_regex" "$nlist" > "$nlist"T' + $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' $run eval '$mv "$nlist"T "$nlist"' fi @@ -3368,8 +4304,8 @@ extern \"C\" { for arg in $dlprefiles; do $show "extracting global C symbols from \`$arg'" - name=`echo "$arg" | ${SED} -e 's%^.*/%%'` - $run eval 'echo ": $name " >> "$nlist"' + name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` + $run eval '$echo ": $name " >> "$nlist"' $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" done @@ -3378,7 +4314,7 @@ extern \"C\" { test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then - egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $mv "$nlist"T "$nlist" fi @@ -3398,7 +4334,7 @@ extern \"C\" { if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' else - echo '/* NONE */' >> "$output_objdir/$dlsyms" + $echo '/* NONE */' >> "$output_objdir/$dlsyms" fi $echo >> "$output_objdir/$dlsyms" "\ @@ -3450,18 +4386,18 @@ static const void *lt_preloaded_setup() { *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) case "$compile_command " in *" -static "*) ;; - *) pic_flag_for_symtable=" $pic_flag -DPIC -DFREEBSD_WORKAROUND";; + *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; esac;; *-*-hpux*) case "$compile_command " in *" -static "*) ;; - *) pic_flag_for_symtable=" $pic_flag -DPIC";; + *) pic_flag_for_symtable=" $pic_flag";; esac esac # Now compile the dynamic symbol file. - $show "(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" - $run eval '(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + $show "(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? # Clean up the generated files. $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" @@ -3473,7 +4409,7 @@ static const void *lt_preloaded_setup() { ;; *) $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 - exit 1 + exit $EXIT_FAILURE ;; esac else @@ -3486,7 +4422,7 @@ static const void *lt_preloaded_setup() { finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` fi - if test $need_relink = no || test "$build_libtool_libs" != yes; then + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then # Replace the output file specification. compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" @@ -3561,7 +4497,7 @@ static const void *lt_preloaded_setup() { # Link the executable and exit $show "$link_command" $run eval "$link_command" || exit $? - exit 0 + exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then @@ -3616,10 +4552,10 @@ static const void *lt_preloaded_setup() { fi # Quote $echo for shipping. - if test "X$echo" = "X$SHELL $0 --fallback-echo"; then - case $0 in - [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $0 --fallback-echo";; - *) qecho="$SHELL `pwd`/$0 --fallback-echo";; + if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then + case $progpath in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; + *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; esac qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` else @@ -3631,15 +4567,230 @@ static const void *lt_preloaded_setup() { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in - *.exe) output=`echo $output|${SED} 's,.exe$,,'` ;; + *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in - *cygwin*) exeext=.exe ;; + *cygwin*) + exeext=.exe + outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; *) exeext= ;; esac + case $host in + *cygwin* | *mingw* ) + cwrappersource=`$echo ${objdir}/lt-${output}.c` + cwrapper=`$echo ${output}.exe` + $rm $cwrappersource $cwrapper + trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + cat > $cwrappersource <> $cwrappersource<<"EOF" +#include +#include +#include +#include +#include +#include + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef DIR_SEPARATOR +#define DIR_SEPARATOR '/' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +#define HAVE_DOS_BASED_FILE_SYSTEM +#ifndef DIR_SEPARATOR_2 +#define DIR_SEPARATOR_2 '\\' +#endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +const char *program_name = NULL; + +void * xmalloc (size_t num); +char * xstrdup (const char *string); +char * basename (const char *name); +char * fnqualify(const char *path); +char * strendzap(char *str, const char *pat); +void lt_fatal (const char *message, ...); + +int +main (int argc, char *argv[]) +{ + char **newargz; + int i; + + program_name = (char *) xstrdup ((char *) basename (argv[0])); + newargz = XMALLOC(char *, argc+2); +EOF + + cat >> $cwrappersource <> $cwrappersource <<"EOF" + newargz[1] = fnqualify(argv[0]); + /* we know the script has the same name, without the .exe */ + /* so make sure newargz[1] doesn't end in .exe */ + strendzap(newargz[1],".exe"); + for (i = 1; i < argc; i++) + newargz[i+1] = xstrdup(argv[i]); + newargz[argc+1] = NULL; +EOF + + cat >> $cwrappersource <> $cwrappersource <<"EOF" +} + +void * +xmalloc (size_t num) +{ + void * p = (void *) malloc (num); + if (!p) + lt_fatal ("Memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL +; +} + +char * +basename (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha (name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return (char *) base; +} + +char * +fnqualify(const char *path) +{ + size_t size; + char *p; + char tmp[LT_PATHMAX + 1]; + + assert(path != NULL); + + /* Is it qualified already? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha (path[0]) && path[1] == ':') + return xstrdup (path); +#endif + if (IS_DIR_SEPARATOR (path[0])) + return xstrdup (path); + + /* prepend the current directory */ + /* doesn't handle '~' */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + size = strlen(tmp) + 1 + strlen(path) + 1; /* +2 for '/' and '\0' */ + p = XMALLOC(char, size); + sprintf(p, "%s%c%s", tmp, DIR_SEPARATOR, path); + return p; +} + +char * +strendzap(char *str, const char *pat) +{ + size_t len, patlen; + + assert(str != NULL); + assert(pat != NULL); + + len = strlen(str); + patlen = strlen(pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp(str, pat) == 0) + *str = '\0'; + } + return str; +} + +static void +lt_error_core (int exit_status, const char * mode, + const char * message, va_list ap) +{ + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); +} +EOF + # we should really use a build-platform specific compiler + # here, but OTOH, the wrappers (shell script and this C one) + # are only useful if you want to execute the "real" binary. + # Since the "real" binary is built for $host, then this + # wrapper might as well be built for $host, too. + $run $LTCC -s -o $cwrapper $cwrappersource + ;; + esac $rm $output - trap "$rm $output; exit 1" 1 2 15 + trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 $echo > $output "\ #! $SHELL @@ -3655,7 +4806,7 @@ static const void *lt_preloaded_setup() { # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. -Xsed="${SED}"' -e 1s/^X//' +Xsed='${SED} -e 1s/^X//' sed_quote_subst='$sed_quote_subst' # The HP-UX ksh and POSIX shell print the target directory to stdout @@ -3715,7 +4866,7 @@ else " if test "$fast_install" = yes; then - echo >> $output "\ + $echo >> $output "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" @@ -3731,7 +4882,7 @@ else $rm \"\$progdir/\$file\" fi" - echo >> $output "\ + $echo >> $output "\ # relink executable if necessary if test -n \"\$relink_command\"; then @@ -3739,7 +4890,7 @@ else else $echo \"\$relink_command_output\" >&2 $rm \"\$progdir/\$file\" - exit 1 + exit $EXIT_FAILURE fi fi @@ -3749,13 +4900,13 @@ else $rm \"\$progdir/\$file\" fi" else - echo >> $output "\ + $echo >> $output "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi - echo >> $output "\ + $echo >> $output "\ if test -f \"\$progdir/\$program\"; then" @@ -3766,7 +4917,7 @@ else $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var - # The second colon is a workaround for a bug in BeOS R4 ${SED} + # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` export $shlibpath_var @@ -3786,14 +4937,6 @@ else # Run the actual program with our arguments. " case $host in - # win32 systems need to use the prog path for dll - # lookup to work - *-*-cygwin* | *-*-pw32*) - $echo >> $output "\ - exec \$progdir/\$program \${1+\"\$@\"} -" - ;; - # Backslashes separate directories on plain windows *-*-mingw | *-*-os2*) $echo >> $output "\ @@ -3803,30 +4946,26 @@ else *) $echo >> $output "\ - # Export the path to the program. - PATH=\"\$progdir:\$PATH\" - export PATH - - exec \$program \${1+\"\$@\"} + exec \$progdir/\$program \${1+\"\$@\"} " ;; esac $echo >> $output "\ \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" - exit 1 + exit $EXIT_FAILURE fi else # The program doesn't exist. \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2 \$echo \"This script is just a wrapper for \$program.\" 1>&2 - echo \"See the $PACKAGE documentation for more information.\" 1>&2 - exit 1 + $echo \"See the $PACKAGE documentation for more information.\" 1>&2 + exit $EXIT_FAILURE fi fi\ " chmod +x $output fi - exit 0 + exit $EXIT_SUCCESS ;; esac @@ -3842,7 +4981,7 @@ fi\ oldobjs="$libobjs_save" build_libtool_libs=no else - oldobjs="$objs$old_deplibs "`$echo "X$libobjs_save" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP` + oldobjs="$old_deplibs $non_pic_objects" fi addlibs="$old_convenience" fi @@ -3851,10 +4990,10 @@ fi\ gentop="$output_objdir/${outputname}x" $show "${rm}r $gentop" $run ${rm}r "$gentop" - $show "mkdir $gentop" - $run mkdir "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" status=$? - if test $status -ne 0 && test ! -d "$gentop"; then + if test "$status" -ne 0 && test ! -d "$gentop"; then exit $status fi generated="$generated $gentop" @@ -3871,14 +5010,40 @@ fi\ $show "${rm}r $xdir" $run ${rm}r "$xdir" - $show "mkdir $xdir" - $run mkdir "$xdir" + $show "$mkdir $xdir" + $run $mkdir "$xdir" status=$? - if test $status -ne 0 && test ! -d "$xdir"; then + if test "$status" -ne 0 && test ! -d "$xdir"; then exit $status fi + # We will extract separately just the conflicting names and we will no + # longer touch any unique names. It is faster to leave these extract + # automatically by $AR in one run. $show "(cd $xdir && $AR x $xabs)" $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 + $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 + $AR t "$xabs" | sort | uniq -cd | while read -r count name + do + i=1 + while test "$i" -le "$count" + do + # Put our $i before any first dot (extension) + # Never overwrite any file + name_to="$name" + while test "X$name_to" = "X$name" || test -f "$xdir/$name_to" + do + name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` + done + $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')" + $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $? + i=`expr $i + 1` + done + done + fi oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP` done @@ -3886,30 +5051,71 @@ fi\ # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then - eval cmds=\"$old_archive_from_new_cmds\" + cmds=$old_archive_from_new_cmds else - # Ensure that we have .o objects in place in case we decided - # not to build a shared library, and have fallen back to building - # static libs even though --disable-static was passed! - for oldobj in $oldobjs; do - if test ! -f $oldobj; then - xdir=`$echo "X$oldobj" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$oldobj"; then - xdir="." - else - xdir="$xdir" - fi - baseobj=`$echo "X$oldobj" | $Xsed -e 's%^.*/%%'` - obj=`$echo "X$baseobj" | $Xsed -e "$o2lo"` - $show "(cd $xdir && ${LN_S} $obj $baseobj)" - $run eval '(cd $xdir && ${LN_S} $obj $baseobj)' || exit $? - fi - done - eval cmds=\"$old_archive_cmds\" + + if len=`expr "X$cmds" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + $echo "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + # GNU ar 2.10+ was changed to match POSIX; thus no paths are + # encoded into archives. This makes 'ar r' malfunction in + # this piecewise linking case whenever conflicting object + # names appear in distinct ar calls; check, warn and compensate. + if (for obj in $save_oldobjs + do + $echo "X$obj" | $Xsed -e 's%^.*/%%' + done | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: warning: object name conflicts; overriding AR_FLAGS to 'cq'" 1>&2 + $echo "$modename: warning: to ensure that POSIX-compatible ar will work" 1>&2 + AR_FLAGS=cq + fi + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + for obj in $save_oldobjs + do + oldobjs="$objlist $obj" + objlist="$objlist $obj" + eval test_cmds=\"$old_archive_cmds\" + if len=`expr "X$test_cmds" : ".*"` && + test "$len" -le "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do + eval cmd=\"$cmd\" IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? @@ -3941,8 +5147,12 @@ fi\ fi done # Quote the link command for shipping. - relink_command="(cd `pwd`; $SHELL $0 --mode=relink $libtool_args)" + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + # Only create the output if not a dry run. if test -z "$run"; then @@ -3961,7 +5171,7 @@ fi\ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` if test -z "$libdir"; then $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 - exit 1 + exit $EXIT_FAILURE fi newdependency_libs="$newdependency_libs $libdir/$name" ;; @@ -3975,7 +5185,7 @@ fi\ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` if test -z "$libdir"; then $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 - exit 1 + exit $EXIT_FAILURE fi newdlfiles="$newdlfiles $libdir/$name" done @@ -3986,17 +5196,36 @@ fi\ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` if test -z "$libdir"; then $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 - exit 1 + exit $EXIT_FAILURE fi newdlprefiles="$newdlprefiles $libdir/$name" done dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlfiles="$newdlfiles $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles="$newdlprefiles $abs" + done + dlprefiles="$newdlprefiles" fi $rm $output # place dlname in correct position for cygwin tdlname=$dlname case $host,$output,$installed,$module,$dlname in - *cygwin*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; esac $echo > $output "\ # $outputname - a libtool library file @@ -4025,13 +5254,16 @@ revision=$revision # Is this an already installed library? installed=$installed +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" - if test "$installed" = no && test $need_relink = yes; then + if test "$installed" = no && test "$need_relink" = yes; then $echo >> $output "\ relink_command=\"$relink_command\"" fi @@ -4044,7 +5276,7 @@ relink_command=\"$relink_command\"" $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? ;; esac - exit 0 + exit $EXIT_SUCCESS ;; # libtool install mode @@ -4133,13 +5365,13 @@ relink_command=\"$relink_command\"" if test -z "$install_prog"; then $echo "$modename: you must specify an install program" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi if test -n "$prev"; then $echo "$modename: the \`$prev' option requires an argument" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi if test -z "$files"; then @@ -4149,7 +5381,7 @@ relink_command=\"$relink_command\"" $echo "$modename: you must specify a destination" 1>&2 fi $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi # Strip any trailing slash from the destination. @@ -4167,10 +5399,10 @@ relink_command=\"$relink_command\"" # Not a directory, so check to see that there is only one file specified. set dummy $files - if test $# -gt 2; then + if test "$#" -gt 2; then $echo "$modename: \`$dest' is not a directory" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi fi case $destdir in @@ -4182,7 +5414,7 @@ relink_command=\"$relink_command\"" *) $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE ;; esac done @@ -4207,11 +5439,11 @@ relink_command=\"$relink_command\"" *.la) # Check to see that this really is a libtool archive. - if (${SED} -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi library_names= @@ -4242,12 +5474,33 @@ relink_command=\"$relink_command\"" dir="$dir$objdir" if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + if test "$inst_prefix_dir" = "$destdir"; then + $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + $echo "$modename: warning: relinking \`$file'" 1>&2 $show "$relink_command" if $run eval "$relink_command"; then : else $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 - continue + exit $EXIT_FAILURE fi fi @@ -4269,7 +5522,7 @@ relink_command=\"$relink_command\"" $run eval "$striplib $destdir/$realname" || exit $? fi - if test $# -gt 0; then + if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. for linkname do @@ -4282,10 +5535,11 @@ relink_command=\"$relink_command\"" # Do each command in the postinstall commands. lib="$destdir/$realname" - eval cmds=\"$postinstall_cmds\" + cmds=$postinstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done @@ -4325,7 +5579,7 @@ relink_command=\"$relink_command\"" *) $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE ;; esac @@ -4343,7 +5597,7 @@ relink_command=\"$relink_command\"" $show "$install_prog $staticobj $staticdest" $run eval "$install_prog \$staticobj \$staticdest" || exit $? fi - exit 0 + exit $EXIT_SUCCESS ;; *) @@ -4355,29 +5609,49 @@ relink_command=\"$relink_command\"" destfile="$destdir/$destfile" fi + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + file=`$echo $file|${SED} 's,.exe$,,'` + stripped_ext=".exe" + fi + ;; + esac + # Do a test to see if this is really a libtool program. case $host in *cygwin*|*mingw*) - wrapper=`echo $file | ${SED} -e 's,.exe$,,'` + wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` ;; *) wrapper=$file ;; esac - if (${SED} -e '4q' $wrapper | egrep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then + if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then notinst_deplibs= relink_command= + # To insure that "foo" is sourced, and not "foo.exe", + # finese the cygwin/MSYS system by explicitly sourcing "foo." + # which disallows the automatic-append-.exe behavior. + case $build in + *cygwin* | *mingw*) wrapperdot=${wrapper}. ;; + *) wrapperdot=${wrapper} ;; + esac # If there is no directory component, then add one. case $file in - */* | *\\*) . $wrapper ;; - *) . ./$wrapper ;; + */* | *\\*) . ${wrapperdot} ;; + *) . ./${wrapperdot} ;; esac # Check the variables that should have been set. if test -z "$notinst_deplibs"; then $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 - exit 1 + exit $EXIT_FAILURE fi finalize=yes @@ -4399,10 +5673,17 @@ relink_command=\"$relink_command\"" done relink_command= + # To insure that "foo" is sourced, and not "foo.exe", + # finese the cygwin/MSYS system by explicitly sourcing "foo." + # which disallows the automatic-append-.exe behavior. + case $build in + *cygwin* | *mingw*) wrapperdot=${wrapper}. ;; + *) wrapperdot=${wrapper} ;; + esac # If there is no directory component, then add one. case $file in - */* | *\\*) . $wrapper ;; - *) . ./$wrapper ;; + */* | *\\*) . ${wrapperdot} ;; + *) . ./${wrapperdot} ;; esac outputname= @@ -4411,12 +5692,16 @@ relink_command=\"$relink_command\"" tmpdir="/tmp" test -n "$TMPDIR" && tmpdir="$TMPDIR" tmpdir="$tmpdir/libtool-$$" - if $mkdir -p "$tmpdir" && chmod 700 "$tmpdir"; then : + save_umask=`umask` + umask 0077 + if $mkdir "$tmpdir"; then + umask $save_umask else + umask $save_umask $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2 continue fi - file=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` @@ -4434,14 +5719,14 @@ relink_command=\"$relink_command\"" fi else # Install the binary that we compiled earlier. - file=`$echo "X$file" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyways case $install_prog,$host in - /usr/bin/install*,*cygwin*) + */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok @@ -4450,7 +5735,7 @@ relink_command=\"$relink_command\"" destfile=$destfile.exe ;; *:*.exe) - destfile=`echo $destfile | ${SED} -e 's,.exe$,,'` + destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` ;; esac ;; @@ -4471,16 +5756,17 @@ relink_command=\"$relink_command\"" $show "$install_prog $file $oldlib" $run eval "$install_prog \$file \$oldlib" || exit $? - if test -n "$stripme" && test -n "$striplib"; then + if test -n "$stripme" && test -n "$old_striplib"; then $show "$old_striplib $oldlib" $run eval "$old_striplib $oldlib" || exit $? fi # Do each command in the postinstall commands. - eval cmds=\"$old_postinstall_cmds\" + cmds=$old_postinstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done @@ -4494,9 +5780,9 @@ relink_command=\"$relink_command\"" if test -n "$current_libdirs"; then # Maybe just do a dry run. test -n "$run" && current_libdirs=" -n$current_libdirs" - exec_cmd='$SHELL $0 --finish$current_libdirs' + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else - exit 0 + exit $EXIT_SUCCESS fi ;; @@ -4515,10 +5801,11 @@ relink_command=\"$relink_command\"" for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. - eval cmds=\"$finish_cmds\" + cmds=$finish_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || admincmds="$admincmds $cmd" @@ -4535,43 +5822,43 @@ relink_command=\"$relink_command\"" fi # Exit here if they wanted silent mode. - test "$show" = ":" && exit 0 + test "$show" = : && exit $EXIT_SUCCESS - echo "----------------------------------------------------------------------" - echo "Libraries have been installed in:" + $echo "----------------------------------------------------------------------" + $echo "Libraries have been installed in:" for libdir in $libdirs; do - echo " $libdir" + $echo " $libdir" done - echo - echo "If you ever happen to want to link against installed libraries" - echo "in a given directory, LIBDIR, you must either use libtool, and" - echo "specify the full pathname of the library, or use the \`-LLIBDIR'" - echo "flag during linking and do at least one of the following:" + $echo + $echo "If you ever happen to want to link against installed libraries" + $echo "in a given directory, LIBDIR, you must either use libtool, and" + $echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + $echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then - echo " - add LIBDIR to the \`$shlibpath_var' environment variable" - echo " during execution" + $echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + $echo " during execution" fi if test -n "$runpath_var"; then - echo " - add LIBDIR to the \`$runpath_var' environment variable" - echo " during linking" + $echo " - add LIBDIR to the \`$runpath_var' environment variable" + $echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" - echo " - use the \`$flag' linker flag" + $echo " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then - echo " - have your system administrator run these commands:$admincmds" + $echo " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then - echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + $echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi - echo - echo "See any operating system documentation about shared libraries for" - echo "more information, such as the ld(1) and ld.so(8) manual pages." - echo "----------------------------------------------------------------------" - exit 0 + $echo + $echo "See any operating system documentation about shared libraries for" + $echo "more information, such as the ld(1) and ld.so(8) manual pages." + $echo "----------------------------------------------------------------------" + exit $EXIT_SUCCESS ;; # libtool execute mode @@ -4583,7 +5870,7 @@ relink_command=\"$relink_command\"" if test -z "$cmd"; then $echo "$modename: you must specify a COMMAND" 1>&2 $echo "$help" - exit 1 + exit $EXIT_FAILURE fi # Handle -dlopen flags immediately. @@ -4591,18 +5878,18 @@ relink_command=\"$relink_command\"" if test ! -f "$file"; then $echo "$modename: \`$file' is not a file" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi dir= case $file in *.la) # Check to see that this really is a libtool archive. - if (${SED} -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi # Read the libtool library. @@ -4629,7 +5916,7 @@ relink_command=\"$relink_command\"" dir="$dir/$objdir" else $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 - exit 1 + exit $EXIT_FAILURE fi ;; @@ -4669,7 +5956,7 @@ relink_command=\"$relink_command\"" -*) ;; *) # Do a test to see if this is really a libtool program. - if (${SED} -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; @@ -4692,7 +5979,7 @@ relink_command=\"$relink_command\"" eval "export $shlibpath_var" fi - # Restore saved enviroment variables + # Restore saved environment variables if test "${save_LC_ALL+set}" = set; then LC_ALL="$save_LC_ALL"; export LC_ALL fi @@ -4709,7 +5996,7 @@ relink_command=\"$relink_command\"" $echo "export $shlibpath_var" fi $echo "$cmd$args" - exit 0 + exit $EXIT_SUCCESS fi ;; @@ -4737,24 +6024,25 @@ relink_command=\"$relink_command\"" if test -z "$rm"; then $echo "$modename: you must specify an RM program" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi rmdirs= + origobjdir="$objdir" for file in $files; do dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` if test "X$dir" = "X$file"; then dir=. - objdir="$objdir" + objdir="$origobjdir" else - objdir="$dir/$objdir" + objdir="$dir/$origobjdir" fi name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - test $mode = uninstall && objdir="$dir" + test "$mode" = uninstall && objdir="$dir" # Remember objdir for removal later, being careful to avoid duplicates - if test $mode = clean; then + if test "$mode" = clean; then case " $rmdirs " in *" $objdir "*) ;; *) rmdirs="$rmdirs $objdir" ;; @@ -4778,7 +6066,7 @@ relink_command=\"$relink_command\"" case $name in *.la) # Possibly a libtool archive, so verify it. - if (${SED} -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then . $dir/$name # Delete the libtool libraries and symlinks. @@ -4786,18 +6074,19 @@ relink_command=\"$relink_command\"" rmfiles="$rmfiles $objdir/$n" done test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" - test $mode = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + test "$mode" = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" - if test $mode = uninstall; then + if test "$mode" = uninstall; then if test -n "$library_names"; then # Do each command in the postuninstall commands. - eval cmds=\"$postuninstall_cmds\" + cmds=$postuninstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" - if test $? != 0 && test "$rmforce" != yes; then + if test "$?" -ne 0 && test "$rmforce" != yes; then exit_status=1 fi done @@ -4806,13 +6095,14 @@ relink_command=\"$relink_command\"" if test -n "$old_library"; then # Do each command in the old_postuninstall commands. - eval cmds=\"$old_postuninstall_cmds\" + cmds=$old_postuninstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" - if test $? != 0 && test "$rmforce" != yes; then + if test "$?" -ne 0 && test "$rmforce" != yes; then exit_status=1 fi done @@ -4824,22 +6114,52 @@ relink_command=\"$relink_command\"" ;; *.lo) - if test "$build_old_libs" = yes; then - oldobj=`$echo "X$name" | $Xsed -e "$lo2o"` - rmfiles="$rmfiles $dir/$oldobj" + # Possibly a libtool object, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + + # Read the .lo file + . $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" \ + && test "$pic_object" != none; then + rmfiles="$rmfiles $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" \ + && test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" + fi fi ;; *) - # Do a test to see if this is a libtool program. - if test $mode = clean && - (${SED} -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - relink_command= - . $dir/$file + if test "$mode" = clean ; then + noexename=$name + case $file in + *.exe) + file=`$echo $file|${SED} 's,.exe$,,'` + noexename=`$echo $name|${SED} 's,.exe$,,'` + # $file with .exe has already been added to rmfiles, + # add $file without .exe + rmfiles="$rmfiles $file" + ;; + esac + # Do a test to see if this is a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + relink_command= + . $dir/$noexename - rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" - if test "$fast_install" = yes && test -n "$relink_command"; then - rmfiles="$rmfiles $objdir/lt-$name" + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles="$rmfiles $objdir/lt-${noexename}.c" + fi fi fi ;; @@ -4847,6 +6167,7 @@ relink_command=\"$relink_command\"" $show "$rm $rmfiles" $run $rm $rmfiles || exit_status=1 done + objdir="$origobjdir" # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do @@ -4862,20 +6183,20 @@ relink_command=\"$relink_command\"" "") $echo "$modename: you must specify a MODE" 1>&2 $echo "$generic_help" 1>&2 - exit 1 + exit $EXIT_FAILURE ;; esac if test -z "$exec_cmd"; then $echo "$modename: invalid operation mode \`$mode'" 1>&2 $echo "$generic_help" 1>&2 - exit 1 + exit $EXIT_FAILURE fi fi # test -z "$show_help" if test -n "$exec_cmd"; then eval exec $exec_cmd - exit 1 + exit $EXIT_FAILURE fi # We need to display help for each of the modes. @@ -4894,6 +6215,7 @@ Provide generalized library-building support services. --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] --quiet same as \`--silent' --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG --version print version information MODE must be one of the following: @@ -4907,8 +6229,10 @@ MODE must be one of the following: uninstall remove libraries from an installed directory MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for -a more detailed description of MODE." - exit 0 +a more detailed description of MODE. + +Report bugs to ." + exit $EXIT_SUCCESS ;; clean) @@ -5019,6 +6343,9 @@ The following components of LINK-COMMAND are treated specially: -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries @@ -5060,14 +6387,34 @@ Otherwise, only FILE itself is deleted using RM." *) $echo "$modename: invalid operation mode \`$mode'" 1>&2 $echo "$help" 1>&2 - exit 1 + exit $EXIT_FAILURE ;; esac -echo +$echo $echo "Try \`$modename --help' for more information about other modes." -exit 0 +exit $EXIT_SUCCESS + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) $echo no;; *) $echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script diff --git a/reactos/lib/freetype/builds/unix/mkinstalldirs b/reactos/lib/freetype/builds/unix/mkinstalldirs index d2d5f21b611..6fbe5e11762 100644 --- a/reactos/lib/freetype/builds/unix/mkinstalldirs +++ b/reactos/lib/freetype/builds/unix/mkinstalldirs @@ -1,20 +1,32 @@ #! /bin/sh # mkinstalldirs --- make directory hierarchy -# Author: Noah Friedman + +scriptversion=2004-02-15.20 + +# Original author: Noah Friedman # Created: 1993-05-16 -# Public domain +# Public domain. +# +# This file is maintained in Automake, please report +# bugs to or send patches to +# . errstatus=0 dirmode="" usage="\ -Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." +Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... + +Create each directory DIR (with mode MODE, if specified), including all +leading file name components. + +Report bugs to ." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help - echo "$usage" 1>&2 + echo "$usage" exit 0 ;; -m) # -m PERM arg @@ -23,6 +35,10 @@ while test $# -gt 0 ; do dirmode=$1 shift ;; + --version) + echo "$0 $scriptversion" + exit 0 + ;; --) # stop option processing shift break @@ -50,17 +66,37 @@ case $# in 0) exit 0 ;; esac +# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and +# mkdir -p a/c at the same time, both will detect that a is missing, +# one will create a, then the other will try to create a and die with +# a "File exists" error. This is a problem when calling mkinstalldirs +# from a parallel make. We use --version in the probe to restrict +# ourselves to GNU mkdir, which is thread-safe. case $dirmode in '') - if mkdir -p -- . 2>/dev/null; then + if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" + else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + test -d ./-p && rmdir ./-p + test -d ./--version && rmdir ./--version fi ;; *) - if mkdir -m "$dirmode" -p -- . 2>/dev/null; then + if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && + test ! -d ./--version; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" + else + # Clean up after NextStep and OpenStep mkdir. + for d in ./-m ./-p ./--version "./$dirmode"; + do + test -d $d && rmdir $d + done fi ;; esac @@ -84,17 +120,17 @@ do mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then - errstatus=$lasterr + errstatus=$lasterr else - if test ! -z "$dirmode"; then + if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" - lasterr="" - chmod "$dirmode" "$pathcomp" || lasterr=$? + lasterr="" + chmod "$dirmode" "$pathcomp" || lasterr=$? - if test ! -z "$lasterr"; then - errstatus=$lasterr - fi - fi + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi fi fi @@ -107,5 +143,8 @@ exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" # End: -# mkinstalldirs ends here diff --git a/reactos/lib/freetype/builds/unix/unix-cc.in b/reactos/lib/freetype/builds/unix/unix-cc.in index 50df267842b..2d1f17e5f5f 100644 --- a/reactos/lib/freetype/builds/unix/unix-cc.in +++ b/reactos/lib/freetype/builds/unix/unix-cc.in @@ -70,7 +70,10 @@ T := -o$(space) # Use the ANSIFLAGS variable to define the compiler flags used to enfore # ANSI compliance. # -CFLAGS := -c @XX_CFLAGS@ @CPPFLAGS@ @CFLAGS@ +# We use our own FreeType configuration file. +# +CFLAGS := -c @XX_CFLAGS@ @CPPFLAGS@ @CFLAGS@ \ + -DFT_CONFIG_CONFIG_H="" # ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. # diff --git a/reactos/lib/freetype/builds/unix/unix-def.in b/reactos/lib/freetype/builds/unix/unix-def.in index a9c1160c186..c263e0e2607 100644 --- a/reactos/lib/freetype/builds/unix/unix-def.in +++ b/reactos/lib/freetype/builds/unix/unix-def.in @@ -3,7 +3,7 @@ # -# Copyright 1996-2000, 2002 by +# Copyright 1996-2000, 2002, 2004 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, @@ -21,8 +21,6 @@ TOP_DIR := $(shell cd $(TOP_DIR); pwd) DELETE := @RMF@ DELDIR := @RMDIR@ SEP := / -BUILD_DIR := $(TOP_DIR)/builds/unix -PLATFORM := unix # this is used for `make distclean' and `make install' ifndef OBJ_BUILD diff --git a/reactos/lib/freetype/builds/unix/unix.mk b/reactos/lib/freetype/builds/unix/unix.mk index fae08b396bb..c1555acf67b 100644 --- a/reactos/lib/freetype/builds/unix/unix.mk +++ b/reactos/lib/freetype/builds/unix/unix.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2000, 2002 by +# Copyright 1996-2000, 2002, 2004 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, @@ -12,10 +12,14 @@ # indicate that you have read the license and understand and accept it # fully. -have_mk := $(strip $(wildcard $(TOP_DIR)/builds/unix/unix-def.mk)) +# We need these declarations here since unix-def.mk is a generated file. +BUILD_DIR := $(TOP_DIR)/builds/unix +PLATFORM := unix + +have_mk := $(strip $(wildcard $(BUILD_DIR)/unix-def.mk)) ifneq ($(have_mk),) - include $(TOP_DIR)/builds/unix/unix-def.mk - include $(TOP_DIR)/builds/unix/unix-cc.mk + include $(BUILD_DIR)/unix-def.mk + include $(BUILD_DIR)/unix-cc.mk else # we are building FT2 not in the src tree include $(OBJ_DIR)/unix-def.mk diff --git a/reactos/lib/freetype/builds/vms/ftconfig.h b/reactos/lib/freetype/builds/vms/ftconfig.h index 3174ffeab95..dcce1e090df 100644 --- a/reactos/lib/freetype/builds/vms/ftconfig.h +++ b/reactos/lib/freetype/builds/vms/ftconfig.h @@ -4,7 +4,7 @@ /* */ /* VMS-specific configuration file (specification only). */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -34,8 +34,8 @@ /*************************************************************************/ -#ifndef FTCONFIG_H -#define FTCONFIG_H +#ifndef __FTCONFIG_H__ +#define __FTCONFIG_H__ /* Include the header file containing all developer build options */ @@ -43,6 +43,7 @@ #include FT_CONFIG_OPTIONS_H #include FT_CONFIG_STANDARD_LIBRARY_H + FT_BEGIN_HEADER /*************************************************************************/ @@ -66,6 +67,8 @@ FT_BEGIN_HEADER #define FT_SIZEOF_INT 4 #define FT_SIZEOF_LONG 4 +#define FT_CHAR_BIT 8 + /* Preferred alignment of data */ #define FT_ALIGNMENT 8 @@ -89,6 +92,19 @@ FT_BEGIN_HEADER /*************************************************************************/ + /*************************************************************************/ + /* */ + /* Mac support */ + /* */ + /* This is the only necessary change, so it is defined here instead */ + /* providing a new configuration file. */ + /* */ +#if ( defined( __APPLE__ ) && !defined( DARWIN_NO_CARBON ) ) || \ + ( defined( __MWERKS__ ) && defined( macintosh ) ) +#define FT_MACINTOSH 1 +#endif + + /*************************************************************************/ /* */ /* IntN types */ @@ -112,32 +128,84 @@ FT_BEGIN_HEADER #error "no 32bit type found -- please check your configuration files" #endif + /* look up an integer type that is at least 32 bits */ +#if FT_SIZEOF_INT >= 4 + + typedef int FT_Fast; + typedef unsigned int FT_UFast; + +#elif FT_SIZEOF_LONG >= 4 + + typedef long FT_Fast; + typedef unsigned long FT_UFast; + +#endif + + + /* determine whether we have a 64-bit int type for platforms without */ + /* Autoconf */ #if FT_SIZEOF_LONG == 8 /* FT_LONG64 must be defined if a 64-bit type is available */ #define FT_LONG64 -#define FT_INT64 long +#define FT_INT64 long + +#elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ + + /* this compiler provides the __int64 type */ +#define FT_LONG64 +#define FT_INT64 __int64 + +#elif defined( __BORLANDC__ ) /* Borland C++ */ + + /* XXXX: We should probably check the value of __BORLANDC__ in order */ + /* to test the compiler version. */ + + /* this compiler provides the __int64 type */ +#define FT_LONG64 +#define FT_INT64 __int64 + +#elif defined( __WATCOMC__ ) /* Watcom C++ */ + + /* Watcom doesn't provide 64-bit data types */ + +#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */ + +#define FT_LONG64 +#define FT_INT64 long long int + +#elif defined( __GNUC__ ) + + /* GCC provides the "long long" type */ +#define FT_LONG64 +#define FT_INT64 long long int + +#endif /* FT_SIZEOF_LONG == 8 */ + + +#define FT_BEGIN_STMNT do { +#define FT_END_STMNT } while ( 0 ) +#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT -#else /*************************************************************************/ /* */ - /* Many compilers provide the non-ANSI `long long' 64-bit type. You can */ - /* activate it by defining the FTCALC_USE_LONG_LONG macro in */ - /* `ftoption.h'. */ + /* A 64-bit data type will create compilation problems if you compile */ + /* in strict ANSI mode. To avoid them, we disable their use if */ + /* __STDC__ is defined. You can however ignore this rule by */ + /* defining the FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */ /* */ - /* Note that this will produce many -ansi warnings during library */ - /* compilation, and that in many cases, the generated code will be */ - /* neither smaller nor faster! */ - /* */ -#ifdef FTCALC_USE_LONG_LONG +#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 ) -#define FT_LONG64 -#define FT_INT64 long long +#ifdef __STDC__ -#endif /* FTCALC_USE_LONG_LONG */ + /* undefine the 64-bit macros in strict ANSI compilation mode */ +#undef FT_LONG64 +#undef FT_INT64 -#endif /* FT_SIZEOF_LONG == 8 */ +#endif /* __STDC__ */ + +#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */ #ifdef FT_MAKE_OPTION_SINGLE_OBJECT @@ -157,6 +225,7 @@ FT_BEGIN_HEADER #endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ + #ifndef FT_BASE #ifdef __cplusplus @@ -167,15 +236,16 @@ FT_BEGIN_HEADER #endif /* !FT_BASE */ -#ifndef BASE_DEF + +#ifndef FT_BASE_DEF #ifdef __cplusplus -#define BASE_DEF( x ) extern "C" x +#define FT_BASE_DEF( x ) extern "C" x #else -#define BASE_DEF( x ) extern x +#define FT_BASE_DEF( x ) extern x #endif -#endif /* !BASE_DEF */ +#endif /* !FT_BASE_DEF */ #ifndef FT_EXPORT @@ -188,6 +258,7 @@ FT_BEGIN_HEADER #endif /* !FT_EXPORT */ + #ifndef FT_EXPORT_DEF #ifdef __cplusplus @@ -209,6 +280,9 @@ FT_BEGIN_HEADER #endif /* !FT_EXPORT_VAR */ + /* The following macros are needed to compile the library with a */ + /* C++ compiler and with 16bit compilers. */ + /* */ /* This is special. Within C++, you must specify `extern "C"' for */ /* functions which are used via function pointers, and you also */ @@ -216,23 +290,42 @@ FT_BEGIN_HEADER /* assure C linkage -- it's not possible to have (local) anonymous */ /* functions which are accessed by (global) function pointers. */ /* */ + /* */ + /* FT_CALLBACK_DEF is used to _define_ a callback function. */ + /* */ + /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */ + /* contains pointers to callback functions. */ + /* */ + /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */ + /* that contains pointers to callback functions. */ + /* */ + /* */ + /* Some 16bit compilers have to redefine these macros to insert */ + /* the infamous `_cdecl' or `__fastcall' declarations. */ + /* */ +#ifndef FT_CALLBACK_DEF #ifdef __cplusplus - -#define FT_CALLBACK_DEF( x ) extern "C" x -#define FT_CALLBACK_TABLE extern "C" -#define FT_CALLBACK_TABLE_DEF extern "C" - +#define FT_CALLBACK_DEF( x ) extern "C" x #else +#define FT_CALLBACK_DEF( x ) static x +#endif +#endif /* FT_CALLBACK_DEF */ -#define FT_CALLBACK_DEF( x ) static x -#define FT_CALLBACK_TABLE extern -#define FT_CALLBACK_TABLE_DEF +#ifndef FT_CALLBACK_TABLE +#ifdef __cplusplus +#define FT_CALLBACK_TABLE extern "C" +#define FT_CALLBACK_TABLE_DEF extern "C" +#else +#define FT_CALLBACK_TABLE extern +#define FT_CALLBACK_TABLE_DEF /* nothing */ +#endif +#endif /* FT_CALLBACK_TABLE */ -#endif /* __cplusplus */ FT_END_HEADER -#endif /* FTCONFIG_H */ + +#endif /* __FTCONFIG_H__ */ /* END */ diff --git a/reactos/lib/freetype/builds/win32/visualc/freetype.dsp b/reactos/lib/freetype/builds/win32/visualc/freetype.dsp index 1512059fd07..bb353dec0e7 100644 --- a/reactos/lib/freetype/builds/win32/visualc/freetype.dsp +++ b/reactos/lib/freetype/builds/win32/visualc/freetype.dsp @@ -54,7 +54,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"..\..\..\objs\freetype214.lib" +# ADD LIB32 /nologo /out:"..\..\..\objs\freetype218.lib" !ELSEIF "$(CFG)" == "freetype - Win32 Debug" @@ -78,7 +78,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"..\..\..\objs\freetype214_D.lib" +# ADD LIB32 /nologo /out:"..\..\..\objs\freetype218_D.lib" !ELSEIF "$(CFG)" == "freetype - Win32 Debug Multithreaded" @@ -103,7 +103,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo /out:"lib\freetype200b8_D.lib" -# ADD LIB32 /nologo /out:"..\..\..\objs\freetype214MT_D.lib" +# ADD LIB32 /nologo /out:"..\..\..\objs\freetype218MT_D.lib" !ELSEIF "$(CFG)" == "freetype - Win32 Release Multithreaded" @@ -127,7 +127,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo /out:"lib\freetype200b8.lib" -# ADD LIB32 /nologo /out:"..\..\..\objs\freetype214MT.lib" +# ADD LIB32 /nologo /out:"..\..\..\objs\freetype218MT.lib" !ELSEIF "$(CFG)" == "freetype - Win32 Release Singlethreaded" @@ -152,7 +152,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype206.lib" -# ADD LIB32 /out:"..\..\..\objs\freetype214ST.lib" +# ADD LIB32 /out:"..\..\..\objs\freetype218ST.lib" # SUBTRACT LIB32 /nologo !ELSEIF "$(CFG)" == "freetype - Win32 Debug Singlethreaded" @@ -178,7 +178,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype206_D.lib" -# ADD LIB32 /nologo /out:"..\..\..\objs\freetype214ST_D.lib" +# ADD LIB32 /nologo /out:"..\..\..\objs\freetype218ST_D.lib" !ENDIF @@ -235,6 +235,10 @@ SOURCE=..\..\..\src\gzip\ftgzip.c # End Source File # Begin Source File +SOURCE=..\..\..\src\lzw\ftlzw.c +# End Source File +# Begin Source File + SOURCE=..\..\..\src\base\ftinit.c # SUBTRACT CPP /Fr # End Source File diff --git a/reactos/lib/freetype/builds/win32/visualc/freetype.sln b/reactos/lib/freetype/builds/win32/visualc/freetype.sln new file mode 100644 index 00000000000..0afd3a3b6df --- /dev/null +++ b/reactos/lib/freetype/builds/win32/visualc/freetype.sln @@ -0,0 +1,33 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "freetype.vcproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Debug Multithreaded = Debug Multithreaded + Debug Singlethreaded = Debug Singlethreaded + Release = Release + Release Multithreaded = Release Multithreaded + Release Singlethreaded = Release Singlethreaded + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug.ActiveCfg = Debug|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug.Build.0 = Debug|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Multithreaded.ActiveCfg = Debug Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Multithreaded.Build.0 = Debug Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Singlethreaded.ActiveCfg = Debug Singlethreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Singlethreaded.Build.0 = Debug Singlethreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release.ActiveCfg = Release|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release.Build.0 = Release|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Multithreaded.ActiveCfg = Release Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Multithreaded.Build.0 = Release Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Singlethreaded.ActiveCfg = Release Singlethreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Singlethreaded.Build.0 = Release Singlethreaded|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/reactos/lib/freetype/builds/win32/visualc/freetype.vcproj b/reactos/lib/freetype/builds/win32/visualc/freetype.vcproj new file mode 100644 index 00000000000..fefe7c7d08a --- /dev/null +++ b/reactos/lib/freetype/builds/win32/visualc/freetype.vcproj @@ -0,0 +1,1717 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/reactos/lib/freetype/builds/win32/visualc/index.html b/reactos/lib/freetype/builds/win32/visualc/index.html index d491c5a5d50..657460ac0ae 100644 --- a/reactos/lib/freetype/builds/win32/visualc/index.html +++ b/reactos/lib/freetype/builds/win32/visualc/index.html @@ -1,27 +1,38 @@
-FreeType 2 Project Files for Visual C++ + + FreeType 2 Project Files for Visual C++ and VS.NET 2003 +
-

FreeType 2 Project Files for Visual C++

+

+ FreeType 2 Project Files for Visual C++ and VS.NET 2003 +

-

This directory contains a project file for Visual C++, named - freetype.dsp. It will compile the following libraries - from the FreeType 2.1.4 sources:

+

This directory contains a project files for Visual C++, named +freetype.dsp, and Visual Studio, called freetype.sln. It +will compile the following libraries from the FreeType 2.1.8 sources:

    -    freetype214.lib     - release build; single threaded
    -    freetype214_D.lib   - debug build;   single threaded
    -    freetype214MT.lib   - release build; multi-threaded
    -    freetype214MT_D.lib - debug build;   multi-threaded
    -  
    + freetype218.lib - release build; single threaded + freetype218_D.lib - debug build; single threaded + freetype218MT.lib - release build; multi-threaded + freetype218MT_D.lib - debug build; multi-threaded
-

Build directories are placed in the top-level "objs" directory

+

Be sure to extract the files with the Windows (CR+LF) line endings. ZIP +archives are already stored this way, so no further step is required. If +you use some .tar.*z archives, be sure to configure your extracting +tool to convert the line endings. For example, with WinZip, you should activate the TAR +file smart CR/LF Conversion option. Alternatively, you may consider +using the unix2dos or u2d utilities that are floating +around, which specifically deal with this particular problem. -

Enjoy :-)

+

Build directories are placed in the top-level objs +directory.

- \ No newline at end of file + diff --git a/reactos/lib/freetype/configure b/reactos/lib/freetype/configure index c8a56577d6a..8621c0e5a37 100644 --- a/reactos/lib/freetype/configure +++ b/reactos/lib/freetype/configure @@ -5,7 +5,6 @@ # This should re-generate the following files: # # config.mk -# Jamfile # install # @@ -14,9 +13,14 @@ if test "x$GNUMAKE" = x; then fi if test -z "`$GNUMAKE -v 2>/dev/null | grep GNU`"; then - echo "Sorry, GNU make is required to build FreeType2." >&2 - echo "Please try \`GNUMAKE= $0'." >&2 - exit 1 + if test -z "`$GNUMAKE -v 2>/dev/null | grep makepp`"; then + echo "GNU make (>= 3.79.1) or makepp (>= 1.19) is required to build FreeType2." >&2 + echo "Please try" >&2 + echo " \`GNUMAKE= $0'." >&2 + echo "or >&2" + echo " \`GNUMAKE=\"makepp --norc-substitution\" $0'." >&2 + exit 1 + fi fi # Uh, oh. This is taken from autoconf. They know what they are doing... diff --git a/reactos/lib/freetype/devel/ft2build.h b/reactos/lib/freetype/devel/ft2build.h index ff0e0031aae..242ac1e85e5 100644 --- a/reactos/lib/freetype/devel/ft2build.h +++ b/reactos/lib/freetype/devel/ft2build.h @@ -28,14 +28,14 @@ * "ftoption.h"), then invoke Jam as usual. */ -#ifndef __FT2_BUILD_GENERIC_H__ -#define __FT2_BUILD_GENERIC_H__ +#ifndef __FT2_BUILD_DEVEL_H__ +#define __FT2_BUILD_DEVEL_H__ #define FT_CONFIG_OPTIONS_H #include -#endif /* __FT2_BUILD_GENERIC_H__ */ +#endif /* __FT2_BUILD_DEVEL_H__ */ /* END */ diff --git a/reactos/lib/freetype/devel/ftoption.h b/reactos/lib/freetype/devel/ftoption.h index 3d806c9926b..d8f699f277a 100644 --- a/reactos/lib/freetype/devel/ftoption.h +++ b/reactos/lib/freetype/devel/ftoption.h @@ -4,7 +4,7 @@ /* */ /* User-selectable configuration macros (specification only). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -95,6 +95,21 @@ FT_BEGIN_HEADER #undef FT_CONFIG_OPTION_FORCE_INT64 + /*************************************************************************/ + /* */ + /* LZW-compressed file support. */ + /* */ + /* FreeType now handles font files that have been compressed with the */ + /* 'compress' program. This is mostly used to parse many of the PCF */ + /* files that come with various X11 distributions. The implementation */ + /* uses NetBSD's `zopen' to partially uncompress the file on the fly */ + /* (see src/lzw/ftgzip.c). */ + /* */ + /* Define this macro if you want to enable this `feature'. */ + /* */ +#define FT_CONFIG_OPTION_USE_LZW + + /*************************************************************************/ /* */ /* Gzip-compressed file support. */ @@ -102,11 +117,10 @@ FT_BEGIN_HEADER /* FreeType now handles font files that have been compressed with the */ /* 'gzip' program. This is mostly used to parse many of the PCF files */ /* that come with XFree86. The implementation uses `zlib' to */ - /* partially uncompress the file on the fly (see src/base/ftgzip.c). */ + /* partially uncompress the file on the fly (see src/gzip/ftgzip.c). */ /* */ - /* Define this macro if you want to enable this "feature". Note that */ - /* this will however force you to link the zlib to any program that */ - /* also uses FreeType. */ + /* Define this macro if you want to enable this `feature'. See also */ + /* the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below. */ /* */ #define FT_CONFIG_OPTION_USE_ZLIB @@ -116,7 +130,7 @@ FT_BEGIN_HEADER /* ZLib library selection */ /* */ /* This macro is only used when FT_CONFIG_OPTION_USE_ZLIB is defined. */ - /* It allows FreeType's "ftgzip" component to link to the system's */ + /* It allows FreeType's `ftgzip' component to link to the system's */ /* installation of the ZLib library. This is useful on systems like */ /* Unix or VMS where it generally is already available. */ /* */ @@ -230,6 +244,29 @@ FT_BEGIN_HEADER #define FT_CONFIG_OPTION_MAC_FONTS + /*************************************************************************/ + /* */ + /* Guessing methods to access embedded resource forks */ + /* */ + /* Enable extra Mac fonts support on non-Mac platforms (e.g. */ + /* GNU/Linux). */ + /* */ + /* Resource forks which include fonts data are stored sometimes in */ + /* locations which users or developers don't expected. In some cases, */ + /* resource forks start with some offset from the head of a file. In */ + /* other cases, the actual resource fork is stored in file different */ + /* from what the user specifies. If this option is activated, */ + /* FreeType tries to guess whether such offsets or different file */ + /* names must be used. */ + /* */ + /* Note that normal, direct access of resource forks is controlled via */ + /* the FT_CONFIG_OPTION_MAC_FONTS option. */ + /* */ +#ifdef FT_CONFIG_OPTION_MAC_FONTS +#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK +#endif + + /*************************************************************************/ /* */ /* Allow the use of FT_Incremental_Interface to load typefaces that */ @@ -296,7 +333,7 @@ FT_BEGIN_HEADER /* Do not #undef this macro here since the build system might define */ /* it for certain configurations only. */ /* */ -/* #define FT_DEBUG_MEMORY */ +#define FT_DEBUG_MEMORY /*************************************************************************/ diff --git a/reactos/lib/freetype/docs/CHANGES b/reactos/lib/freetype/docs/CHANGES index 42afa8b0071..2bb57b5598e 100644 --- a/reactos/lib/freetype/docs/CHANGES +++ b/reactos/lib/freetype/docs/CHANGES @@ -1,316 +1,568 @@ -LATEST CHANGES BETWEEN 2.1.5 and 2.1.4 - +LATEST CHANGES BETWEEN 2.1.8 and 2.1.7 I. IMPORTANT BUG FIXES - - Parsing the /CIDFontName field now removes the leading slash to + - The native TrueType hinter contained some bugs which prevented + some fonts to be rendered correctly, most notably Legendum.otf. + + - The PostScript hinter now produces improved results. + + - The linear advance width and height values were incorrectly + rounded, making them virtually unusable if not loaded with + FT_LOAD_LINEAR_DESIGN. + + - Indexing CID-keyed CFF fonts is now working: The glyph index is + correctly treated as a CID, similar to FreeType's CID driver + module. Note that CID CMap support is still missing. + + - The FT_FACE_FLAGS_GLYPH_NAMES flag is now set correctly for all + font formats. + + - Some subsetted Type 1 fonts weren't parsed correctly. This bug + has been introduced in 2.1.7. In summary, the Type 1 parser has + become more robust. + + - Non-decimal numbers weren't parsed correctly in PS fonts. + + - The WinFNT driver now correctly reports FT_ENCODING_NONE for all + but one encoding. Use the new FT_WinFNT_ID_XXX values together + with FT_Get_WinFNT_Header() to get the WinFNT charset ID. + + - The descender metrics (face->size->metrics.descender) for WinFNT + bitmap fonts had the wrong sign. + + - The (emulated) `seac' support for CFF fonts was broken. + + - The `flex' operator didn't work for CFF fonts. + + - PS glyphs which use the `hintmask' operator haven't been + rendered correctly in some cases. + + - Metrics for BDF and PCF bitmap font formats have been fixed. + + - Autohinting is now disabled for glyphs which are vertically + distorted or mirrored (using a transformation matrix). This + fixes a bug which produced zero-height glyphs. + + - The `freetype-config' script now handles --prefix and + --exec-prefix correctly; it also returns the proper --rpath (or + -R) value if FreeType has been built as a shared library. + + + II. IMPORTANT CHANGES + + - Both PCF and BDF drivers now handle the SETWIDTH_NAME and + ADD_STYLE_NAME properties. Values are appended to + face->style_name; example: `Bold SemiCondensed'. + + - The PCF driver now handles bitmap fonts compressed with the LZW + algorithm (extension .pcf.Z, compressed with `compress'). + + - A new API function `FT_Get_CMap_Language_ID' (declared in + `tttables.h') is available to get the language ID of a + TrueType/SFNT cmap. + + - The hexadecimal format of data after the `StartData' command in + CID-keyed Type 1 fonts is now supported. While this can't occur + in file-based fonts, it can happen in document-embedded + resources of PostScript documents. + + - Embedded bitmaps in SFNT-based CFF fonts are now supported. + + - A simple API is now available to control FreeType's tracing + mechanism if compiled with FT_DEBUG_LEVEL_TRACE. See the file + `ftdebug.h' for more details. + + - YAMATO Masatake contributed improved handling of MacOS resource + forks on non-MacOS platforms (for example, Linux can mount MacOS + file systems). + + - Support for MacOS has been improved; there is now a new function + `FT_New_Face_From_FSSpec' similar to `FT_New_Face' except that + it accepts an FSSpec instead of a path. + + - The cache sub-system has been rewritten. + + - There is now support for deinstallation of faces. + + - A new API function `FTC_Manager_RemoveFaceID' has been added + to delete all `idle' nodes that correspond to a given + FTC_FaceID. All `locked' nodes (i.e., those with a reference + count > 0), will be modified to prevent them from appearing in + further lookups (they will be cleaned normally when their + reference count reaches 0). + + - There is now support for point scaling (i.e., providing + character sizes in points + dpis, instead of pixels). + + - Three abstract cache classes are now available: + + FTC_GCache: Used to store one glyph item per cache node, + with the ability to group common attributes into + `families'. This replaces the old + FTC_GlyphCache class. + + FTC_ICache: Used to store one FT_Glyph per cache node. This + extends FTC_GCache. Family definition, family + comparison, and glyph loading are however left + to sub-classes. + + FTC_SCache: Used to store up to 16 small bitmaps per cache + node. This extends FTC_GCache. Family + definition, family comparison and glyph loading + are however left to sub-classes. + + - The file `src/cache/ftcbasic.c' implements: + + FTC_ImageCache: Extends FTC_ICache; implements family + definitions and glyph loading similar to the + old API. + + FTC_SBitCache: Extends FTC_SCache, implements family + definitions and glyph loading similar to the + old API + + Client applications should be able to extend FTC_GCache, + FTC_ICache, or FTC_SCache much more easily (i.e., less code to + write, and less callbacks). For example, one could envision + caches that are capable of storing transformed (obliqued), + stroked, emboldened, or colored glyph images. Use + `ftcbasic.c' as an example. + + - All public APIs are now in `include/freetype/ftcache.h', (to + be accessed as `FT_CACHE_H'). The contents of + `include/freetype/cache/' is only needed by applications that + wish to implement their own caches. + + - There were some major performance improvements through the use + of various programming tricks. Cache hits are up to 70% + faster than in the old code. + + - The FTC_CMapCache has been simplied. Charmaps can only be + accessed by index right now. There is also a new API named + `FT_Charmap_GetIndex' for this purpose. + + - The demo programs have been updated to the new code. The + previous versions will not work with the current one. + + - Using an invalid face index in FT_Open_Face and friends now + causes an error even if the font contains a single face only. + + + III. MISCELLANEOUS + + - Wolfgang Domr鰏e contributed support files for building FreeType + on the Atari using the PureC compiler. Note that the Atari is a + 16bit platform. + + - Vitaliy Pasternak contributed project files for VS.NET 2003. + + +====================================================================== + +LATEST CHANGES BETWEEN 2.1.7 and 2.1.6 + + I. IMPORTANT BUG FIXES + + - Updated to newest libtool version, fixing build problems on + various platforms. + + - On Unix platforms, `make install' didn't copy the correct + `ftconfig.h' file. + + Note that version 2.1.7 contains the same library C source code as + version 2.1.6. + + +====================================================================== + +LATEST CHANGES BETWEEN 2.1.6 and 2.1.5 + + I. IMPORTANT BUG FIXES + + - The PFR font driver didn't load kerning tables correctly, and + the functions in FT_PFR_H didn't work at all. + + - Type 1 font files in binary format (PFB) with an end-of-file + indicator weren't accepted by the FreeType engine. + + - Fonts which contain /PaintType and /StrokeWidth no longer cause + a segfault. This bug has been introduced in version 2.1.5. + + - Fonts loaded with FT_LOAD_RENDER no longer cause strange + results. This bug has been introduced in version 2.1.5. + + - Some Windows (bitmap) FNT/FON files couldn't be handled + correctly. + + + II. IMPORTANT CHANGES + + - The internal module API has been heavily changed in favor of + massive simplifications within the font engine. This also means + that authors of third-party modules must adapt their code to the + new scheme. + + NOTE: THE NEW SCHEME IS NOT COMPLETED YET. PLEASE WAIT UNTIL A + FINAL ANNOUNCEMENT! + + - The PostScript parser has been enhanced to handle comments and + strings correctly. Additionally, more syntax forms are + recognized. + + - Added the optional unpatented hinting system for TrueType. It + allows typefaces which need hinting to produce correct glyph + forms (e.g., Chinese typefaces from Dynalab) to work acceptably + without infringing Apple patents. This system is compiled only + if TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING is defined in + ftoption.h (activated by default). + + + III. MISCELLANEOUS + + - There is now a guard in the public header files to protect + against inclusion of freetype.h from FreeType 1. + + - Direct inclusion of freetype.h and other public header files no + longer works. You have to use the documented scheme + + #include + #include FT_FREETYPE_H + + to load freetype.h with a symbolic name. This protects against + renaming of public header files (which shouldn't happen but + actually has, avoiding two public header files with the same + name). + + +====================================================================== + +LATEST CHANGES BETWEEN 2.1.5 and 2.1.4 + + I. IMPORTANT BUG FIXES + + - Parsing the /CIDFontName field now removes the leading slash to be in sync with other font drivers. - - gzip support was buggy. Some fonts could not be read. + - gzip support was buggy. Some fonts could not be read. - - Fonts which have nested subglyphs more than one level deep no + - Fonts which have nested subglyphs more than one level deep no longer cause a segfault. - - Creation of synthetic cmaps for fonts in CFF format was broken + - Creation of synthetic cmaps for fonts in CFF format was broken partially. - - Numeric font dictionary entries for synthetic fonts are no longer - overwritten. + - Numeric font dictionary entries for synthetic fonts are no + longer overwritten. - - The font matrix wasn't applied to the advance width for Type1, CID, - and CFF fonts. This caused problem when loading certain synthetic - Type 1 fonts like "Helvetica Narrow" + - The font matrix wasn't applied to the advance width for Type1, + CID, and CFF fonts. This caused problems when loading certain + synthetic Type 1 fonts like `Helvetica Narrow'. - - The test for the charset registry in BDF and PCF fonts is now + - The test for the charset registry in BDF and PCF fonts is now case-insensitive. - - FT_Vector_Rotate rotating sometimes returned strange values due to + - FT_Vector_Rotate sometimes returned strange values due to rounding errors. - - The PCF driver now returns the correct number of glyphs (including - an artificial `notdef' glyph at index 0). + - The PCF driver now returns the correct number of glyphs + (including an artificial `notdef' glyph at index 0). - - FreeType now supports buggy CMaps which are contained in many CJK - fonts from Dynalab. + - FreeType now supports buggy CMaps which are contained in many + CJK fonts from Dynalab. - - Opening an invalid font on a Mac caused a segfault due to + - Opening an invalid font on a Mac caused a segfault due to double-freeing memory. - - BDF fonts with more than 32768 glyphs weren't supported properly. + - BDF fonts with more than 32768 glyphs weren't supported + properly. II. IMPORTANT CHANGES - Accessing bitmap font formats has been synchronized. To do that - the FT_Bitmap_Size structure has been extended to contain new + the FT_Bitmap_Size structure has been extended to contain new fields `size', `x_ppem', and `y_ppem'. - The FNT driver now returns multiple faces, not multiple strikes. - - The `psnames' module has been updated to the Adobe Glyph List + - The `psnames' module has been updated to the Adobe Glyph List version 2.0. - The `psnames' module now understands `uXXXX[X[X]]' glyph names. - The algorithm for guessing the font style has been improved. - - For fonts in sfnt format, root->height is no longer increased if - the line gap is zero. There exist fonts (containing e.g. form - drawing characters) which intentionally have a zero line gap value. + - For fonts in SFNT format, root->height is no longer increased if + the line gap is zero. There exist fonts (containing e.g. form + drawing characters) which intentionally have a zero line gap + value. - - ft_glyph_bbox_xxx flags are now deprecated in favour of + - ft_glyph_bbox_xxx flags are now deprecated in favour of FT_GLYPH_BBOX_XXX. - - ft_module_xxx flags are now deprecated in favour of FT_MODULE_XXX. + - ft_module_xxx flags are now deprecated in favour of + FT_MODULE_XXX. - - FT_ENCODING_MS_{SJIS,GB2312,BIG5,WANSUNG,JOHAB} are now deprecated - in favour of FT_ENCODING_{SJIS,GB2312,GIB5,WANSONG,JOHAB} -- those - encodings are not specific to Microsoft. + - FT_ENCODING_MS_{SJIS,GB2312,BIG5,WANSUNG,JOHAB} are now + deprecated in favour of + FT_ENCODING_{SJIS,GB2312,GIB5,WANSONG,JOHAB} -- those encodings + are not specific to Microsoft. III. MISCELLANEOUS - - The autohinter has been further improved; for example, `m' glyphs - now retain its vertical symmetry. + - The autohinter has been further improved; for example, `m' + glyphs now retain its vertical symmetry. - Partial support of Mac fonts on non-Mac platforms. - - `make refdoc' (after first `make') builds the HTML documentation. - You need Python for this. + - `make refdoc' (after first `make') builds the HTML + documentation. You need Python for this. - - The make build system should now work more reliably on DOS-like + - The make build system should now work more reliably on DOS-like platforms. - - Support for EMX gcc and Watson C/C++ compilers on MS-DOS has been - added. + - Support for EMX gcc and Watson C/C++ compilers on MS-DOS has + been added. - Better VMS build support. - - Support for the pkg-config package by providing a `freetype.pc' + - Support for the pkg-config package by providing a `freetype.pc' file. - New configure option --with-old-mac-fonts for Darwin. - - Some source files have been renamed (mainly to fit into the 8.3 + - Some source files have been renamed (mainly to fit into the 8.3 naming scheme). -============================================================================== +====================================================================== LATEST CHANGES BETWEEN 2.1.4 and 2.1.3 I. IMPORTANT BUG FIXES - - Updated to newest libtool version, fixing build problems on various - platforms. + - Updated to newest libtool version, fixing build problems on + various platforms. - - A fix in the Gzip stream reader: It couldn't read certain .gz files - properly due to a small typo. In certain cases, FreeType could also - loop endlessly when trying to load tiny gzipped files. + - A fix in the Gzip stream reader: It couldn't read certain .gz + files properly due to a small typo. In certain cases, FreeType + could also loop endlessly when trying to load tiny gzipped + files. - - The configure script now tries to use the system-wide zlib when - it finds one (instead of the copy found in src/gzip). And - "freetype-config" has been updated to return relevant flags in this - case when invoked with "--libs" (e.g. "-lzlib"). + - The configure script now tries to use the system-wide zlib when + it finds one (instead of the copy found in src/gzip). And + "freetype-config" has been updated to return relevant flags in + this case when invoked with "--libs" (e.g. "-lzlib"). - - Certain fonts couldn't be loaded by 2.1.3 because they lacked a - Unicode charmap (e.g. SYMBOL.TTF). FreeType erroneously rejected - them. + - Certain fonts couldn't be loaded by 2.1.3 because they lacked a + Unicode charmap (e.g. SYMBOL.TTF). FreeType erroneously + rejected them. - The CFF loader was modified to accept fonts which only contain a - subset of their reference charset. This prevented the correct use - of PDF-embedded fonts. + subset of their reference charset. This prevented the correct + use of PDF-embedded fonts. - The logic to detect Unicode charmaps has been modified. This is - required to support fonts which include both 16-bit and 32-bit - charmaps (like very recent asian ones) using the new 10 and 12 SFNT - formats. + required to support fonts which include both 16-bit and 32-bit + charmaps (like very recent asian ones) using the new 10 and 12 + SFNT formats. - - The TrueType loader now limits the depth of composite glyphs. This is - necessary to prevent broken fonts to break the engine by blowing the - stack with recursive glyph definitions. + - The TrueType loader now limits the depth of composite glyphs. + This is necessary to prevent broken fonts to break the engine by + blowing the stack with recursive glyph definitions. - - The CMap cache is now capable of managing UCS-4 character codes that - are mapped through extended charmaps in recent TrueType/OpenType - fonts. + - The CMap cache is now capable of managing UCS-4 character codes + that are mapped through extended charmaps in recent + TrueType/OpenType fonts. - - The cache sub-system now properly manages out-of-memory conditions - instead of blindly reporting them to the caller. This means that it - will try to empty the cache before restarting its allocations to see - if that can help. + - The cache sub-system now properly manages out-of-memory + conditions instead of blindly reporting them to the caller. + This means that it will try to empty the cache before restarting + its allocations to see if that can help. - - The PFR driver didn't return the list of available embedded bitmaps - properly. + - The PFR driver didn't return the list of available embedded + bitmaps properly. - - There was a nasty memory leak when using embedded bitmaps in certain - font formats. + - There was a nasty memory leak when using embedded bitmaps in + certain font formats. II. IMPORTANT CHANGES - - David Chester contributed some enhancements to the auto-hinter that - significantly increase the quality of its output. The Postscript - hinter was also improved in several ways. + - David Chester contributed some enhancements to the auto-hinter + that significantly increase the quality of its output. The + Postscript hinter was also improved in several ways. - The FT_RENDER_MODE_LIGHT render mode was implemented. - - A new API function called `FT_Get_BDF_Property' has been added to - FT_BDF_H to retrieve BDF properties from BDF _and_ PCF font files. - THIS IS STILL EXPERIMENTAL, since it hasn't been properly tested yet. + - A new API function called `FT_Get_BDF_Property' has been added + to FT_BDF_H to retrieve BDF properties from BDF _and_ PCF font + files. THIS IS STILL EXPERIMENTAL, since it hasn't been + properly tested yet. - A Windows FNT specific API has been added, mostly to access font headers. This is used by Wine. - - TrueType tables without an "hmtx" table are now tolerated when an - incremental interface is used. This happens for certain Type42 fonts - passed from Ghostscript to FreeType. + - TrueType tables without an "hmtx" table are now tolerated when + an incremental interface is used. This happens for certain + Type42 fonts passed from Ghostscript to FreeType. - - The PFR font driver is now capable of returning the font family and - style names when they are available (instead of the sole "FontID"). - This is performed by parsing an *undocumented* portion of the font - file! + - The PFR font driver is now capable of returning the font family + and style names when they are available (instead of the sole + "FontID"). This is performed by parsing an *undocumented* + portion of the font file! III. MISCELLANEOUS - - The path stroker in FT_STROKER_H has entered beta stage. It now works - very well, but its interface might change a bit in the future. More - on this in later releases. + - The path stroker in FT_STROKER_H has entered beta stage. It now + works very well, but its interface might change a bit in the + future. More on this in later releases. - - The documentation for FT_Size_Metrics didn't appear properly in the - API reference. + - The documentation for FT_Size_Metrics didn't appear properly in + the API reference. - The file docs/VERSION.DLL has been updated to explain versioning - with FreeType (i.e., comparing release/libtool/so numbers, and how to - use them in autoconf scripts). + with FreeType (i.e., comparing release/libtool/so numbers, and + how to use them in autoconf scripts). - - The installation documentation has been seriously revamped. + - The installation documentation has been seriously revamped. Everything is now in the "docs" directory. -============================================================================== +====================================================================== LATEST CHANGES BETWEEN 2.1.3 and 2.1.2 I. IMPORTANT BUG FIXES - - FT_Vector_Transform had been incorrectly modified in 2.1.2, resulting - in incorrect transformations being applied (for example, rotations - were processed in opposite angles). + - FT_Vector_Transform had been incorrectly modified in 2.1.2, + resulting in incorrect transformations being applied (for + example, rotations were processed in opposite angles). - - The format 8 and 12 TrueType charmap enumeration routines have been - fixed (FT_Get_Next_Char returned invalid values). + - The format 8 and 12 TrueType charmap enumeration routines have + been fixed (FT_Get_Next_Char returned invalid values). - - The PFR font driver returned incorrect advance widths if the outline - and metrics resolution defined in the font file were different. + - The PFR font driver returned incorrect advance widths if the + outline and metrics resolution defined in the font file were + different. - - FT_Glyph_To_Bitmap now returns successfully when called with an + - FT_Glyph_To_Bitmap now returns successfully when called with an FT_BitmapGlyph argument (it previously returned an error). - - A bug in the Type 1 loader that prevented valid font bounding boxes to - be loaded from multiple master fonts. + - A bug in the Type 1 loader that prevented valid font bounding + boxes to be loaded from multiple master fonts. - - The SFNT validation code has been rewritten. FreeType can now load - "broken" fonts that were usable on Windows, but not with previous - versions of the library. + - The SFNT validation code has been rewritten. FreeType can now + load "broken" fonts that were usable on Windows, but not with + previous versions of the library. - The computation of bearings in the BDF driver has been fixed. - - The Postscript hinter crashed when trying to hint certain glyphs (more - precisely, when trying to apply hints to an empty glyph outline). + - The Postscript hinter crashed when trying to hint certain glyphs + (more precisely, when trying to apply hints to an empty glyph + outline). - - The TrueType glyph loader now supports composites in "Apple format" - (they differ slightly from Microsoft/OpenType ones in the way - transformation offsets are computed). + - The TrueType glyph loader now supports composites in "Apple + format" (they differ slightly from Microsoft/OpenType ones in + the way transformation offsets are computed). - - FreeType was very slow at opening certain asian CID/CFF fonts, due - to fixed increment in dynamic array re-allocations. This has been - changed to exponential behaviour to get acceptable performance. + - FreeType was very slow at opening certain asian CID/CFF fonts, + due to fixed increment in dynamic array re-allocations. This + has been changed to exponential behaviour to get acceptable + performance. II. IMPORTANT CHANGES - - The PCF driver now supports gzip-compressed font files natively. This - means that you will be able to use all these bitmap fonts that come - with XFree86 with FreeType (and libXft/libXft2, by extension). + - The PCF driver now supports gzip-compressed font files natively. + This means that you will be able to use all these bitmap fonts + that come with XFree86 with FreeType (and libXft/libXft2, by + extension). - - The automatic and postscript hinters have both been updated. This - results in a relatively important increase of rendering quality since - many nasty defaults have been supressed. Please visit the web page: + - The automatic and postscript hinters have both been updated. + This results in a relatively important increase of rendering + quality since many nasty defaults have been supressed. Please + visit the web page: http://www.freetype.org/hinting/smooth-hinting.html for additional details on this topic. - - The "load_flags" parameter of FT_Load_Glyph is now an FT_Int32 - (instead of just being an FT_Int). This breaks source and binary - compatibility for 16bit systems only, while retaining both of them for - 32 and 64 bit ones. + - The "load_flags" parameter of FT_Load_Glyph is now an FT_Int32 + (instead of just being an FT_Int). This breaks source and + binary compatibility for 16bit systems only, while retaining + both of them for 32 and 64 bit ones. Some new flags have been added consequently: FT_LOAD_NO_AUTOHINT :: Disable the use of the auto-hinter (but not native format hinters). - FT_LOAD_TARGET_NORMAL :: Hint and render for normal anti-aliased - displays. + FT_LOAD_TARGET_NORMAL :: Hint and render for normal + anti-aliased displays. FT_LOAD_TARGET_MONO :: Hint and render for 1-bit displays. - FT_LOAD_TARGET_LCD :: Hint and render for horizontal RGB or BGR - sub-pixel displays (like LCD screens). - THIS IS STILL EXPERIMENTAL! + FT_LOAD_TARGET_LCD :: Hint and render for horizontal RGB or + BGR sub-pixel displays (like LCD + screens). THIS IS STILL + EXPERIMENTAL! - FT_LOAD_TARGET_LCD_V :: Same as FT_LOAD_TARGET_LCD, for vertical - sub-pixel displays (like rotated LCD - screens). THIS IS STILL EXPERIMENTAL! + FT_LOAD_TARGET_LCD_V :: Same as FT_LOAD_TARGET_LCD, for + vertical sub-pixel displays (like + rotated LCD screens). THIS IS STILL + EXPERIMENTAL! - FT_LOAD_MONOCHROME is still supported, but only affects rendering, not - the hinting. + FT_LOAD_MONOCHROME is still supported, but only affects + rendering, not the hinting. - Note that the 'ftview' demo program available in the 'ft2demos' package - has been updated to support LCD-optimized display on non-paletted - displays (under Win32 and X11). + Note that the `ftview' demo program available in the `ft2demos' + package has been updated to support LCD-optimized display on + non-paletted displays (under Win32 and X11). - - The PFR driver now supports embedded bitmaps (all formats supported), - and returns correct kerning metrics for all glyphs. + - The PFR driver now supports embedded bitmaps (all formats + supported), and returns correct kerning metrics for all glyphs. - - The TrueType charmap loader now supports certain "broken" fonts that - load under Windows without problems. + - The TrueType charmap loader now supports certain `broken' fonts + that load under Windows without problems. - The cache API has been slightly modified (it's still a beta!): - - The type FTC_ImageDesc has been removed; it is now replaced by - FTC_ImageTypeRec. Note that one of its fields is a `load_flag' - parameter for FT_Load_Glyph. + - The type FTC_ImageDesc has been removed; it is now replaced + by FTC_ImageTypeRec. Note that one of its fields is a + `load_flag' parameter for FT_Load_Glyph. - - The field "num_grays" of FT_SBitRec has been changed to "max_grays" - in order to fit within a single byte. Its maximum value is thus 255 - (instead of 256 as previously). + - The field "num_grays" of FT_SBitRec has been changed to + "max_grays" in order to fit within a single byte. Its + maximum value is thus 255 (instead of 256 as previously). III. MISCELLANEOUS - - Added support for the DESTDIR variable during "make install". This - simplifies packaging of FreeType. + - Added support for the DESTDIR variable during "make install". + This simplifies packaging of FreeType. - - Included modified copies of the ZLib sources in 'src/gzip' in order to - support gzip-compressed PCF fonts. We do not use the system-provided - zlib for now, though this is a probable enhancement for future - releases. + - Included modified copies of the ZLib sources in `src/gzip' in + order to support gzip-compressed PCF fonts. We do not use the + system-provided zlib for now, though this is a probable + enhancement for future releases. - - The DocMaker tool used to generate the on-line API reference has been - completely rewritten. It is now located in + - The DocMaker tool used to generate the on-line API reference has + been completely rewritten. It is now located in "src/tools/docmaker/docmaker.py". Features: - better cross-referenced output - more polished output - - uses Python regular expressions (though it didn't speed the + - uses Python regular expressions (though it didn't speed the program) - - much more modular structure, which allows for different "backends" - in order to generate HTML, XML, or whatever format. + - much more modular structure, which allows for different + "backends" in order to generate HTML, XML, or whatever + format. One can regenerate the API reference by calling: @@ -323,86 +575,92 @@ LATEST CHANGES BETWEEN 2.1.3 and 2.1.2 include/freetype/cache/*.h - A new, experimental, support for incremental font loading (i.e., - loading of fonts where the glyphs are not in the font file itself, but - provided by an external component, like a Postscript interpreter) has - been added by Graham Asher. This is still work in progress, however. + loading of fonts where the glyphs are not in the font file + itself, but provided by an external component, like a Postscript + interpreter) has been added by Graham Asher. This is still work + in progress, however. - - A new, EXPERIMENTAL, path stroker has been added. It doesn't suffer - from severe rounding errors and treat bezier arcs directly. Still - work in progress (i.e. not part of the official API). See the file - for some of the details. + - A new, EXPERIMENTAL, path stroker has been added. It doesn't + suffer from severe rounding errors and treat bezier arcs + directly. Still work in progress (i.e. not part of the official + API). See the file for some of the + details. - - The massive re-formatting of sources and internal re-design is still - under-way. Many internal functions, constants, and types have been - renamed. + - The massive re-formatting of sources and internal re-design is + still under-way. Many internal functions, constants, and types + have been renamed. -======================================================================== +====================================================================== LATEST CHANGES BETWEEN 2.1.2 and 2.1.1 I. IMPORTANT BUG FIXES - - Many font drivers didn't select a Unicode charmap by default when - a new face was opened (with the FT_CONFIG_OPTION_USE_CMAPS options - enabled), causing many applications to not be able to display text - correctly with the 2.1.x releases. + - Many font drivers didn't select a Unicode charmap by default + when a new face was opened (with the FT_CONFIG_OPTION_USE_CMAPS + options enabled), causing many applications to not be able to + display text correctly with the 2.1.x releases. - - The PFR driver had a bug in its composite loading code that produces - incorrectly placed accents with many fonts. + - The PFR driver had a bug in its composite loading code that + produces incorrectly placed accents with many fonts. - The Type42 driver crashed sometimes due to a nasty bug. - - The Type 1 custom encoding charmap didn't handle the case where the - first glyph index wasn't 0. + - The Type 1 custom encoding charmap didn't handle the case where + the first glyph index wasn't 0. - - A serious typo in the TrueType composite loader produced incorrectly - placed glyphs in fonts like "Wingdings" and a few others. + - A serious typo in the TrueType composite loader produced + incorrectly placed glyphs in fonts like "Wingdings" and a few + others. II. MISCELLANEOUS - - The Win32 Visual C++ project file has been updated to include the - PFR driver as well. + - The Win32 Visual C++ project file has been updated to include + the PFR driver as well. - - "freetype.m4" is now installed by default by "make install" on Unix - systems. + - "freetype.m4" is now installed by default by "make install" on + Unix systems. - - The function FT_Get_PS_Font_Info now works with CID and Type42 fonts - as well. + - The function FT_Get_PS_Font_Info now works with CID and Type42 + fonts as well. -======================================================================== +====================================================================== LATEST CHANGES BETWEEN 2.1.1 and 2.1.0 I. IMPORTANT BUG FIXES - - The `version_info' returned by `freetype-config' in 2.1.0 returned an - invalid value. It now returns 9:1:3 (2.0.9 returned 9:0:3). + - The `version_info' returned by `freetype-config' in 2.1.0 + returned an invalid value. It now returns 9:1:3 (2.0.9 returned + 9:0:3). - - Version 2.1.0 couldn't be linked against applications on Win32 and - Amiga systems due to a new debug function that wasn't properly - propagated to the system-specific directory in `builds'. + - Version 2.1.0 couldn't be linked against applications on Win32 + and Amiga systems due to a new debug function that wasn't + properly propagated to the system-specific directory in + `builds'. - Various MacOS and Mac OS X specific fixes. - - Fixed a bug in the TrueType charmap validation routines that made - version 2.1.0 too restrictive -- many popular fonts have been - rejected. + - Fixed a bug in the TrueType charmap validation routines that + made version 2.1.0 too restrictive -- many popular fonts have + been rejected. - - There was still a very small difference between the monochrome glyph - bitmaps produced by FreeType 1.x and FreeType 2.x with the bytecode - interpreter enabled. This was caused by an invalid flag setting in - the TrueType glyph loader, making the rasterizer change its drop-out - control mode. Now theresults should _really_ be completely identical. + - There was still a very small difference between the monochrome + glyph bitmaps produced by FreeType 1.x and FreeType 2.x with the + bytecode interpreter enabled. This was caused by an invalid + flag setting in the TrueType glyph loader, making the rasterizer + change its drop-out control mode. Now theresults should + _really_ be completely identical. - The TrueType name table loader has been improved to support many - popular though buggy Asian fonts. It now ignores empty name entries, - invalid pointer offsets and a few other incorrect subtleties. - Moreover, name strings are now loaded on demand, which reduces the - memory load of many faces (e.g. the ARIAL.TTF font file contains a - 10kByte name table with 70 names). + popular though buggy Asian fonts. It now ignores empty name + entries, invalid pointer offsets and a few other incorrect + subtleties. Moreover, name strings are now loaded on demand, + which reduces the memory load of many faces (e.g. the ARIAL.TTF + font file contains a 10kByte name table with 70 names). - Fixed a bug in the Postscript hinter that prevented family blues substitution to happen correctly. @@ -412,116 +670,119 @@ LATEST CHANGES BETWEEN 2.1.1 and 2.1.0 - Three new font drivers in this release: - * A BDF font driver, contributed by Franco Zappa Nardelli, heavily - modified by Werner Lemberg. It also supports anti-aliased bitmaps - (using a slightly extended BDF format). + * A BDF font driver, contributed by Franco Zappa Nardelli, + heavily modified by Werner Lemberg. It also supports + anti-aliased bitmaps (using a slightly extended BDF format). - * A Type42 font driver, contributed by Roberto Alameda. It is + * A Type42 font driver, contributed by Roberto Alameda. It is still experimental but seems to work relatively well. - * A PFR font driver, contributed by David Turner himself. It doesn't - support PFR hinting -- note that BitStream has at least two patents - on this format! + * A PFR font driver, contributed by David Turner himself. It + doesn't support PFR hinting -- note that BitStream has at + least two patents on this format! III. MISCELLANEOUS - - The cache sub-system has been optimized in important ways. Cache hits - are now significantly faster. For example, using the CMap cache is - about twice faster than calling FT_Get_Char_Index on most platforms. - Similarly, using an SBit cache is about five times faster than loading - the bitmaps from a bitmap file, and 300 to 500 times faster than - generating them from a scalable format. + - The cache sub-system has been optimized in important ways. + Cache hits are now significantly faster. For example, using the + CMap cache is about twice faster than calling FT_Get_Char_Index + on most platforms. Similarly, using an SBit cache is about five + times faster than loading the bitmaps from a bitmap file, and + 300 to 500 times faster than generating them from a scalable + format. - Note that you should recompile your sources if you designed a custom - cache class for the FT2 Cache subsystem, since the changes performed - are source, but not binary, compatible. + Note that you should recompile your sources if you designed a + custom cache class for the FT2 Cache subsystem, since the + changes performed are source, but not binary, compatible. -======================================================================== +====================================================================== LATEST CHANGES BETWEEN 2.1.0 and 2.0.9 I. IMPORTANT BUG FIXES - - The TrueType bytecode interpreter has been fixed to produce + - The TrueType bytecode interpreter has been fixed to produce _exactly_ the same output as FreeType 1.x. Previous differences - were due to slightly distinct fixed-point computation routines + were due to slightly distinct fixed-point computation routines used to perform dot products and vector length measurements. - It seems that native TrueType hinting is _extremely_ sensitive - to rounding errors. The required vector computation routines have - been optimized and placed within the "ttinterp.c" file. + It seems that native TrueType hinting is _extremely_ sensitive + to rounding errors. The required vector computation routines + have been optimized and placed within the "ttinterp.c" file. - Fixed the parsing of accelerator tables in the PCF font driver. - - Fixed the Type1 glyph loader routine used to compute the font's + - Fixed the Type1 glyph loader routine used to compute the font's maximum advance width. + II. NEW FEATURES - The `configure' script used on Unix systems has been modified to - check that GNU Make is being used to build the library. Otherwise, - it will display a message proposing to use the GNUMAKE environment - variable to name it. + check that GNU Make is being used to build the library. + Otherwise, it will display a message proposing to use the + GNUMAKE environment variable to name it. The Unix-specific file README.UNX has been modified accordingly. III. MISCELLANEOUS - - The FreeType License in `docs/FTL.txt' has been updated to include - a proposed preferred disclaimer. If you are using FreeType in your - products, you are encouraged (but not mandated) to use the following - text in your documentation: + - The FreeType License in `docs/FTL.txt' has been updated to + include a proposed preferred disclaimer. If you are using + FreeType in your products, you are encouraged (but not mandated) + to use the following text in your documentation: """ - Portions of this software are copyright 1996-2002 The FreeType - Project (www.freetype.org). All rights reserved. + Portions of this software are copyright 1996-2002 The + FreeType Project (www.freetype.org). All rights reserved. """ - The default size of the render pool has been reduced to 16kByte. - This shouldn't result in any noticeable performance penalty, unless - you are using the engine as-is to render very large and complex - glyphs. + This shouldn't result in any noticeable performance penalty, + unless you are using the engine as-is to render very large and + complex glyphs. - - The FreeType 2 redesign has begun. More information can be found - at this URL: + - The FreeType 2 redesign has begun. More information can be + found at this URL: http://www.freetype.org/freetype2/redesign.html - The following internal changes have been performed within the sources - of this release: + The following internal changes have been performed within the + sources of this release: - - Many internal types have been renamed to increase consistency. - The following should be true, except for public types: + - Many internal types have been renamed to increase + consistency. The following should be true, except for + public types: - * All structure types have a name ending in "Rec" (short for - `record'). + * All structure types have a name ending in "Rec" (short + for `record'). - * A pointer-to-structure type has the same name as the + * A pointer-to-structure type has the same name as the structure, _without_ the "Rec" suffix. - Example: + Example: - typedef struct FooRec_ - { - ... + typedef struct FooRec_ + { + ... - } FooRec, *Foo; + } FooRec, *Foo; - - Many internal macros have been renamed to increase consistency. - The following should be true: + - Many internal macros have been renamed to increase + consistency. The following should be true: - * All macros have a name beginning with "FT_". This required - a few changes like + * All macros have a name beginning with "FT_". This + required a few changes like ALLOC => FT_ALLOC FREE => FT_FREE REALLOC => FT_REALLOC - * All macros are completely UPPERCASE. This required a few - changes like: + * All macros are completely UPPERCASE. This required a + few changes like: READ_Short => FT_READ_SHORT NEXT_Short => FT_NEXT_SHORT @@ -530,7 +791,7 @@ LATEST CHANGES BETWEEN 2.1.0 and 2.0.9 MEM_Copy => FT_MEM_COPY etc. - * Whenever possible, all macro names follow the + * Whenever possible, all macro names follow the FT__ pattern. For example ACCESS_Frame => FT_FRAME_ENTER @@ -544,7 +805,7 @@ LATEST CHANGES BETWEEN 2.1.0 and 2.0.9 FILE_ReadAt => FT_STREAM_READ_AT READ_Fields => FT_STREAM_READ_FIELDS - - Many internal functions have been renamed to follow the + - Many internal functions have been renamed to follow the FT__ pattern. For example: FT_Seek_Stream => FT_Stream_Seek @@ -556,288 +817,299 @@ LATEST CHANGES BETWEEN 2.1.0 and 2.0.9 Note that method names do not contain "_". - - The FT_ALLOC_ARRAY and FT_REALLOC_ARRAY have been replaced - with FT_NEW_ARRAY and FT_RENEW_ARRAY which do not take a type - as the fourth argument. Instead, the array element type size - is computed automatically from the type of the target pointer - used. + - The FT_ALLOC_ARRAY and FT_REALLOC_ARRAY have been replaced + with FT_NEW_ARRAY and FT_RENEW_ARRAY which do not take a + type as the fourth argument. Instead, the array element + type size is computed automatically from the type of the + target pointer used. - - A new object class, FT_CMap, has been introduced. These - internal objects are used to model character maps. This eases - the support of additional charmap types within the engine. + - A new object class, FT_CMap, has been introduced. These + internal objects are used to model character maps. This + eases the support of additional charmap types within the + engine. - - A new configuration file named "ftstdlib.h" has been added - to `include/freetype/config'. It is used to define aliases - for _every_ routine of the ISO C library that the font engine - uses. Each aliases has a "ft_" prefix (e.g. "ft_strlen" is an - alias for "strlen"). + - A new configuration file named "ftstdlib.h" has been added + to `include/freetype/config'. It is used to define aliases + for _every_ routine of the ISO C library that the font + engine uses. Each aliases has a "ft_" prefix + (e.g. "ft_strlen" is an alias for "strlen"). - This is used to ease the porting of FreeType 2 to exotic runtime - environments where the ISO C Library isn't available (e.g. - XFree86 extension modules). + This is used to ease the porting of FreeType 2 to exotic + runtime environments where the ISO C Library isn't available + (e.g. XFree86 extension modules). More details are available in the "ChangeLog" file. -============================================================================ +====================================================================== LATEST CHANGES BETWEEN 2.0.9 and 2.0.8 I. IMPORTANT BUG FIXES - Certain fonts like "foxjump.ttf" contain broken name tables with - invalid entries and wild offsets. This caused FreeType to crash when - trying to load them. + invalid entries and wild offsets. This caused FreeType to crash + when trying to load them. - The SFNT `name' table loader has been fixed to be able to support - these strange fonts. + The SFNT `name' table loader has been fixed to be able to + support these strange fonts. - Moreover, the code in charge of processing this table has been changed - to always favour Windows-formatted entries over other ones. Hence, a - font that works on Windows but not on the Mac will load cleanly in - FreeType and report accurate values for Family & PostScript names. + Moreover, the code in charge of processing this table has been + changed to always favour Windows-formatted entries over other + ones. Hence, a font that works on Windows but not on the Mac + will load cleanly in FreeType and report accurate values for + Family & PostScript names. - The CID font driver has been fixed. It unfortunately returned a - Postscript Font name with a leading slash, as in + Postscript Font name with a leading slash, as in "/MunhwaGothic-Regular". - - FreeType 2 should now compile fine on AIX 4.3.3 as a shared library. + - FreeType 2 should now compile fine on AIX 4.3.3 as a shared + library. - - A bug in the Postscript hinter has been found and fixed, removing - un-even stem widths at small pixel sizes (like 14-17). + - A bug in the Postscript hinter has been found and fixed, + removing un-even stem widths at small pixel sizes (like 14-17). - This improves the quality of a certain number of Postscript fonts. + This improves the quality of a certain number of Postscript + fonts. II. NEW FEATURES - - A new function named `FT_Library_Version' has been added to return - the current library's major, minor, and patch version numbers. This - is important since the macros FREETYPE_MAJOR, FREETYPE_MINOR, and - FREETYPE_PATCH cannot be used when the library is dynamically linked - by a program. + - A new function named `FT_Library_Version' has been added to + return the current library's major, minor, and patch version + numbers. This is important since the macros FREETYPE_MAJOR, + FREETYPE_MINOR, and FREETYPE_PATCH cannot be used when the + library is dynamically linked by a program. - - Two new APIs have been added: `FT_Get_First_Char' and + - Two new APIs have been added: `FT_Get_First_Char' and `FT_Get_Next_Char'. - Together, these can be used to iterate efficiently over the currently - selected charmap of a given face. Read the API reference for more - details. + Together, these can be used to iterate efficiently over the + currently selected charmap of a given face. Read the API + reference for more details. III. MISCELLANEOUS - - The FreeType sources are under heavy internal re-factoring. As a - consequence, we have created a branch named "STABLE" on the CVS to - hold all future releases/fixes in the 2.0.x family. + - The FreeType sources are under heavy internal re-factoring. As + a consequence, we have created a branch named "STABLE" on the + CVS to hold all future releases/fixes in the 2.0.x family. - The HEAD branch now contains the re-factored sources and shouldn't be - used for testing or packaging new releases. In case you would like - to access the 2.0.9 sources from our CVS repository, use the tag - `VER-2-0-9'. + The HEAD branch now contains the re-factored sources and + shouldn't be used for testing or packaging new releases. In + case you would like to access the 2.0.9 sources from our CVS + repository, use the tag `VER-2-0-9'. -============================================================================ +====================================================================== LATEST CHANGES BETWEEN 2.0.8 and 2.0.7 I. IMPORTANT BUG FIXES - - There was a small but nasty bug in "freetype-config.in" which + - There was a small but nasty bug in "freetype-config.in" which caused the "freetype-config" script to fail on Unix. - This didn't prevent the installation of the library or even - its execution, but caused problems when trying to compile many - Unix packages that depend on it. + This didn't prevent the installation of the library or even its + execution, but caused problems when trying to compile many Unix + packages that depend on it. - - Some TrueType or OpenType fonts embedded in PDF documents do - not have a 'cmap', 'post' and 'name' as is required by the + - Some TrueType or OpenType fonts embedded in PDF documents do not + have a 'cmap', 'post' and 'name' as is required by the specification. FreeType no longer refuses to load such fonts. - - various fixes to the PCF font driver + - Various fixes to the PCF font driver. -============================================================================ +====================================================================== LATEST CHANGES BETWEEN 2.0.7 and 2.0.6 I. IMPORTANT BUG FIXES - - Fixed two bugs in the Type 1 font driver. The first one resulted in a - memory leak in subtle cases. The other one caused FreeType to crash - when trying to load ".gsf" files (Ghostscript so-called Postscript - fonts). + - Fixed two bugs in the Type 1 font driver. The first one + resulted in a memory leak in subtle cases. The other one caused + FreeType to crash when trying to load ".gsf" files (Ghostscript + so-called Postscript fonts). - (This made _many_ KDE applications crash on certain systems. FreeType - _is_ becoming a critical system component on Linux :-) + (This made _many_ KDE applications crash on certain systems. + FreeType _is_ becoming a critical system component on Linux :-) - Fixed a memory leak in the CFF font driver. - Fixed a memory leak in the PCF font driver. - - Fixed the Visual C++ project file "builds/win32/visualc/freetype.dsp" - since it didn't include the Postscript hinter component, causing - errors at build time. + - Fixed the Visual C++ project file + "builds/win32/visualc/freetype.dsp" since it didn't include the + Postscript hinter component, causing errors at build time. - - Fixed a small rendering bug in the anti-aliased renderer that only - occurred when trying to draw thin (less than 1 pixel) strokes. + - Fixed a small rendering bug in the anti-aliased renderer that + only occurred when trying to draw thin (less than 1 pixel) + strokes. - - Fixed "builds/unix/freetype2.a4" which is used to generate a valid - "freetype2.m4" for use with autoconf. + - Fixed "builds/unix/freetype2.a4" which is used to generate a + valid "freetype2.m4" for use with autoconf. - Fixed the OpenVMS Makefiles. II. MISCELLANEOUS - - Added "configure" and "install" scripts to the top-level directory. - A GNU-style installation is thus now easily possible with + - Added "configure" and "install" scripts to the top-level + directory. A GNU-style installation is thus now easily possible + with - ./configure - make - make install + ./configure + make + make install -============================================================================ +====================================================================== LATEST CHANGES BETWEEN 2.0.6 and 2.0.5 I. IMPORTANT BUG FIXES - - It wasn't possible to load embedded bitmaps when the auto-hinter was - used. This is now fixed. + - It wasn't possible to load embedded bitmaps when the auto-hinter + was used. This is now fixed. - - The TrueType font driver didn't load some composites properly (the - sub-glyphs were slightly shifted, and this was only noticeable when - using monochrome rendering). + - The TrueType font driver didn't load some composites properly + (the sub-glyphs were slightly shifted, and this was only + noticeable when using monochrome rendering). - - Various fixes to the auto-hinter. They merely improve the output of - sans-serif fonts. Note that there are still problems with serifed - fonts and composites (accented characters). + - Various fixes to the auto-hinter. They merely improve the + output of sans-serif fonts. Note that there are still problems + with serifed fonts and composites (accented characters). - - All scalable font drivers erroneously returned un-fitted glyph - advances when hinting was requested. This created problems for a - number of layout applications. This is a very old bug that got - undetected mainly because most test/demo program perform rounding - explicitly or implicitly (through the cache). + - All scalable font drivers erroneously returned un-fitted glyph + advances when hinting was requested. This created problems for + a number of layout applications. This is a very old bug that + got undetected mainly because most test/demo program perform + rounding explicitly or implicitly (through the cache). - - FT_Glyph_To_Bitmap() did erroneously modify the source glyph in + - FT_Glyph_To_Bitmap() did erroneously modify the source glyph in certain cases. - - "glnames.py" still contained a bug that made FreeType return invalid - names for certain glyphs. + - "glnames.py" still contained a bug that made FreeType return + invalid names for certain glyphs. - - The library crashed when loading certain Type 1 fonts like "sadn.pfb" - ("Stalingrad Normal"), which appear to contain pathetic font info - dictionaries. + - The library crashed when loading certain Type 1 fonts like + "sadn.pfb" ("Stalingrad Normal"), which appear to contain + pathetic font info dictionaries. - - The TrueType glyph loader is now much more paranoid and checks everything - when loading a given glyph image. This was necessary to avoid - problems (crashes and/or memory overwrites) with broken fonts that - came from a really buggy automatic font converter. + - The TrueType glyph loader is now much more paranoid and checks + everything when loading a given glyph image. This was necessary + to avoid problems (crashes and/or memory overwrites) with broken + fonts that came from a really buggy automatic font converter. II. IMPORTANT UPDATES AND NEW FEATURES - Important updates to the Mac-specific parts of the library. - - The caching sub-system has been completely re-designed, and its API - has evolved (the old one is still supported for backwards + - The caching sub-system has been completely re-designed, and its + API has evolved (the old one is still supported for backwards compatibility). - The documentation for it is not yet completed, sorry. For now, you - are encouraged to continue using the old API. However, the ftview - demo program in the ft2demos package has already been updated to use - the new caching functions. + The documentation for it is not yet completed, sorry. For now, + you are encouraged to continue using the old API. However, the + ftview demo program in the ft2demos package has already been + updated to use the new caching functions. - - A new charmap cache is provided too. See FTC_CMapCache(). This is - useful to perform character code -> glyph index translations quickly, - without the need for an opened FT_Face. + - A new charmap cache is provided too. See FTC_CMapCache(). This + is useful to perform character code -> glyph index translations + quickly, without the need for an opened FT_Face. - - A NEW POSTSCRIPT HINTER module has been added to support native hints - in the following formats: PostScript Type 1, PostScript CID, and - CFF/CEF. + - A NEW POSTSCRIPT HINTER module has been added to support native + hints in the following formats: PostScript Type 1, PostScript + CID, and CFF/CEF. - Please test! Note that the auto-hinter produces better results for a - number of badly-hinted fonts (mostly auto-generated ones) though. + Please test! Note that the auto-hinter produces better results + for a number of badly-hinted fonts (mostly auto-generated ones) + though. - - A memory debugger is now part of the standard FreeType sources. To - enable it, define FT_DEBUG_MEMORY in , and - recompile the library. + - A memory debugger is now part of the standard FreeType sources. + To enable it, define FT_DEBUG_MEMORY in + , and recompile the library. - Additionally, define the _environment_ variable FT_DEBUG_MEMORY and - run any program using FreeType. When the library is exited, a summary - of memory footprints and possible leaks will be displayed. + Additionally, define the _environment_ variable FT_DEBUG_MEMORY + and run any program using FreeType. When the library is exited, + a summary of memory footprints and possible leaks will be + displayed. - This works transparently with _any_ program that uses FreeType. - However, you will need a lot of memory to use this (allocated blocks - are never released to the heap to detect double deletes easily). + This works transparently with _any_ program that uses FreeType. + However, you will need a lot of memory to use this (allocated + blocks are never released to the heap to detect double deletes + easily). III. MISCELLANEOUS - - We are aware of subtle differences between the output of FreeType - versions 1 and 2 when it comes to monochrome TrueType-hinted glyphs. - These are most probably due to small differences in the monochrome - rasterizers and will be worked out in an upcoming release. + - We are aware of subtle differences between the output of + FreeType versions 1 and 2 when it comes to monochrome + TrueType-hinted glyphs. These are most probably due to small + differences in the monochrome rasterizers and will be worked out + in an upcoming release. - We have decided to fork the sources in a "stable" branch, and an - "unstable" one, since FreeType is becoming a critical component of - many Unix systems. + "unstable" one, since FreeType is becoming a critical component + of many Unix systems. - The next bug-fix releases of the library will be named 2.0.7, 2.0.8, - etc., while the "2.1" branch will contain a version of the sources - where we will start major reworking of the library's internals, in - order to produce FreeType 2.2.0 (or even 3.0) in a more distant - future. + The next bug-fix releases of the library will be named 2.0.7, + 2.0.8, etc., while the "2.1" branch will contain a version of + the sources where we will start major reworking of the library's + internals, in order to produce FreeType 2.2.0 (or even 3.0) in a + more distant future. - We also hope that this scheme will allow much more frequent releases - than in the past. + We also hope that this scheme will allow much more frequent + releases than in the past. -============================================================================ +====================================================================== LATEST CHANGES BETWEEN 2.0.5 and 2.0.4 - NOTE THAT 2.0.5 DOES NOT CONTAIN THE POSTSCRIPT HINTER. THIS MODULE WILL - BE PART OF THE NEXT RELEASE (EITHER 2.0.6 or 2.1) + NOTE THAT 2.0.5 DOES NOT CONTAIN THE POSTSCRIPT HINTER. THIS MODULE + WILL BE PART OF THE NEXT RELEASE (EITHER 2.0.6 or 2.1) - - Fixed a bug that made certain glyphs, like "Cacute", "cacute" and - "lslash" unavailable from Unicode charmaps of Postscript fonts. This - prevented the correct display of Polish text, for example. + - Fixed a bug that made certain glyphs, like "Cacute", "cacute" and + "lslash" unavailable from Unicode charmaps of Postscript fonts. + This prevented the correct display of Polish text, for example. - - The kerning table of Type 1 fonts was loaded by FreeType, when its AFM - file was attached to its face, but the FT_FACE_FLAG_HAS_KERNING bit - flags was not set correctly, preventing FT_Get_Kerning to return - meaningful values. + - The kerning table of Type 1 fonts was loaded by FreeType, when its + AFM file was attached to its face, but the + FT_FACE_FLAG_HAS_KERNING bit flags was not set correctly, + preventing FT_Get_Kerning to return meaningful values. - - Improved SFNT (TrueType & OpenType) charmap support. Slightly better - performance, as well as support for the new formats defined by the - OpenType 1.3 specification (8, 10, and 12) + - Improved SFNT (TrueType & OpenType) charmap support. Slightly + better performance, as well as support for the new formats defined + by the OpenType 1.3 specification (8, 10, and 12) - - Fixed a serious typo in "src/base/ftcalc.c" which caused invalid + - Fixed a serious typo in "src/base/ftcalc.c" which caused invalid computations in certain rare cases, producing ugly artefacts. - - The size of the EM square is computed with a more accurate algorithm - for Postscript fonts. The old one caused slight errors with embedded - fonts found in PDF documents. + - The size of the EM square is computed with a more accurate + algorithm for Postscript fonts. The old one caused slight errors + with embedded fonts found in PDF documents. - - Fixed a bug in the cache manager that prevented normal LRU behaviour - within the cache manager, causing unnecessary reloads (for FT_Face and - FT_Size objects only). + - Fixed a bug in the cache manager that prevented normal LRU + behaviour within the cache manager, causing unnecessary reloads + (for FT_Face and FT_Size objects only). - - Added a new function named "FT_Get_Name_Index" to retrieve the glyph - index of a given glyph name, when found in a face. + - Added a new function named "FT_Get_Name_Index" to retrieve the + glyph index of a given glyph name, when found in a face. - - Added a new function named "FT_Get_Postscript_Name" to retrieve the - "unique" Postscript font name of a given face. + - Added a new function named "FT_Get_Postscript_Name" to retrieve + the "unique" Postscript font name of a given face. - - Added a new public header size named FT_SIZES_H (or - ) providing new FT_Size-management functions: + - Added a new public header size named FT_SIZES_H (or + ) providing new FT_Size-management functions: FT_New_Size, FT_Activate_Size, FT_Done_Size. - - Fixed a reallocation bug that generated a dangling pointer (and possibly - memory leaks) with Postscript fonts (in src/psaux/psobjs.c). + - Fixed a reallocation bug that generated a dangling pointer (and + possibly memory leaks) with Postscript fonts (in + src/psaux/psobjs.c). - Many fixes for 16-bit correctness. @@ -845,149 +1117,156 @@ LATEST CHANGES BETWEEN 2.0.5 and 2.0.4 - Added an Amiga build directory in "builds/amiga". -============================================================================ + +====================================================================== LATEST CHANGES BETWEEN 2.0.4 and 2.0.3 - - Fixed a rather annoying bug that was introduced in 2.0.3. Namely, the - font transformation set through FT_Set_Transform was applied twice to - auto-hinted glyphs, resulting in incorrectly rotated text output. + - Fixed a rather annoying bug that was introduced in 2.0.3. Namely, + the font transformation set through FT_Set_Transform was applied + twice to auto-hinted glyphs, resulting in incorrectly rotated text + output. - - Fixed _many_ compiler warnings. FT2 should now compile cleanly with - Visual C++'s most pedantic warning level (/W4). It already compiled - fine with GCC and a few other compilers. + - Fixed _many_ compiler warnings. FT2 should now compile cleanly + with Visual C++'s most pedantic warning level (/W4). It already + compiled fine with GCC and a few other compilers. - - Fixed a bug that prevented the linear advance width of composite + - Fixed a bug that prevented the linear advance width of composite TrueType glyphs to be correctly returned. - - Fixed the Visual C++ project files located in "builds/win32/visualc" - (previous versions used older names of the library). + - Fixed the Visual C++ project files located in + "builds/win32/visualc" (previous versions used older names of the + library). - - Many 32-bit constants have an "L" appended to their value, in order - to improve the 16-bitness of the code. Someone is actually trying to - use FT2 on an Atari ST machine! + - Many 32-bit constants have an "L" appended to their value, in + order to improve the 16-bitness of the code. Someone is actually + trying to use FT2 on an Atari ST machine! - - Updated the "builds/detect.mk" file in order to automatically build - FT2 on AIX systems. AIX uses "/usr/sbin/init" instead of "/sbin/init" - and wasn't previously detected as a Unix platform by the FreeType build - system. + - Updated the "builds/detect.mk" file in order to automatically + build FT2 on AIX systems. AIX uses "/usr/sbin/init" instead of + "/sbin/init" and wasn't previously detected as a Unix platform by + the FreeType build system. - - Updated the Unix-specific portions of the build system (new libtool - version, etc.). + - Updated the Unix-specific portions of the build system (new + libtool version, etc.). - - The SFNT kerning lodaer now ensures that the table is sorted (since some - problem fonts do not meet this requirement). + - The SFNT kerning lodaer now ensures that the table is sorted + (since some problem fonts do not meet this requirement). -============================================================================ + +======================================================================= LATEST CHANGES BETWEEN 2.0.3 and 2.0.2 I. CHANGES TO THE MODULES / FONT DRIVERS - - THE AUTO-HINTER HAS BEEN SLIGHTLY IMPROVED, in order to fix several - annoying artefacts, mainly: + - THE AUTO-HINTER HAS BEEN SLIGHTLY IMPROVED, in order to fix + several annoying artefacts, mainly: - - Blue zone alignement of horizontal stems wasn't performed - correctly, resulting in artefacts like the "d" being placed one - pixel below the "b" in some fonts like Time New Roman. + - Blue zone alignement of horizontal stems wasn't performed + correctly, resulting in artefacts like the "d" being placed + one pixel below the "b" in some fonts like Time New Roman. - - Overshoot thresholding wasn't performed correctly, creating + - Overshoot thresholding wasn't performed correctly, creating unpleasant artefacts at large character pixel sizes. - - Composite glyph loading has been simplified. This gets rid - of various artefacts where the components of a composite glyphs - were not correctly spaced. + - Composite glyph loading has been simplified. This gets rid + of various artefacts where the components of a composite + glyphs were not correctly spaced. - These are the last changes to the current auto-hinting module. A new - hinting sub-system is currently in the work in order to support native - hints in Type 1 / CFF / OpenType fonts, as well as globally improve - rendering. + These are the last changes to the current auto-hinting module. + A new hinting sub-system is currently in the work in order to + support native hints in Type 1 / CFF / OpenType fonts, as well + as globally improve rendering. - - The PCF driver has been fixed. It reported invalid glyph dimensions - for the fonts available on Solaris. + - The PCF driver has been fixed. It reported invalid glyph + dimensions for the fonts available on Solaris. - - The Type 1, CID and CFF drivers have been modified to fix the + - The Type 1, CID and CFF drivers have been modified to fix the computation of the EM size. - - The Type 1 driver has been fixed to avoid a dangerous bug that - crashed the library with non-conforming fonts (i.e. ones that do not - place the .notdef glyph at position 0). + - The Type 1 driver has been fixed to avoid a dangerous bug that + crashed the library with non-conforming fonts (i.e. ones that do + not place the .notdef glyph at position 0). - - The TrueType driver had a rather subtle bug (dangling pointer when - loading composite glyphs) that could crash the library in rare - occasions! + - The TrueType driver had a rather subtle bug (dangling pointer + when loading composite glyphs) that could crash the library in + rare occasions! II. HIGH-LEVEL API CHANGES - - The error code enumeration values have been changed. An error value - is decomposed in a generic error code, and a module number. see - for details. + - The error code enumeration values have been changed. An error + value is decomposed in a generic error code, and a module + number. see for details. - - A new public header file has been introduced, named FT_TRIGONOMETRY_H - (include/freetype/fttrig.h), providing trigonometric functions to - compute sines, cosines, arctangents, etc. with 16.16 fixed precision. - The implementation is based on the CORDIC algorithm and is very fast - while being sufficiently accurate. + - A new public header file has been introduced, named + FT_TRIGONOMETRY_H (include/freetype/fttrig.h), providing + trigonometric functions to compute sines, cosines, arctangents, + etc. with 16.16 fixed precision. The implementation is based on + the CORDIC algorithm and is very fast while being sufficiently + accurate. III. INTERNALS - - Added BeOS-specific files in the old build sub-system. Note that - no changes were required to compile the library with Jam. + - Added BeOS-specific files in the old build sub-system. Note + that no changes were required to compile the library with Jam. - - The configuration is now capable of automatically detecting 64-bit - integers on a set of predefined compilers (GCC, Visual C++, Borland - C++) and will use them by default. This provides a small performance - boost. + - The configuration is now capable of automatically detecting + 64-bit integers on a set of predefined compilers (GCC, Visual + C++, Borland C++) and will use them by default. This provides a + small performance boost. - - A small memory leak that happened when opening 0-sized files (duh!) - have been fixed. + - A small memory leak that happened when opening 0-sized files + (duh!) have been fixed. - - Fixed bezier stack depth bug in the routines provided by the - FT_BBOX_H header file. Also fixed similar bugs in the rasterizers. + - Fixed bezier stack depth bug in the routines provided by the + FT_BBOX_H header file. Also fixed similar bugs in the + rasterizers. - - The outline bounding box code has been rewritten to use direct - computations, instead of bezier sub-division, to compute the exact - bounding box of glyphs. This is slightly slower but more accurate. + - The outline bounding box code has been rewritten to use direct + computations, instead of bezier sub-division, to compute the + exact bounding box of glyphs. This is slightly slower but more + accurate. - - The build system has been improved and fixed, mainly to support "make" - on Windows 2000 correctly, avoid problems with "make distclean" on non - Unix systems, etc. + - The build system has been improved and fixed, mainly to support + "make" on Windows 2000 correctly, avoid problems with "make + distclean" on non Unix systems, etc. - - Hexadecimal constants have been suffixed with "U" to avoid problems - with certain compilers on 64-bit platforms. + - Hexadecimal constants have been suffixed with "U" to avoid + problems with certain compilers on 64-bit platforms. - A new directory named "src/tools" has been created. It contains Python scripts and simple unit test programs used to develop the library. - - The DocMaker tool has been moved from "docs" to "src/tools" and + - The DocMaker tool has been moved from "docs" to "src/tools" and has been updated with the following: - Now accepts the "--title=XXXX" or "-t XXXX" option from the command line to set the project's name in the generated API reference. - - Now accepts the "--output=DIR" or "-o DIR" option from the - command line to set the output directory for all generated HTML - files. + - Now accepts the "--output=DIR" or "-o DIR" option from the + command line to set the output directory for all generated + HTML files. - Now accepts the "--prefix=XXXX" or "-p XXX" option from the - command line to set the file prefix to use for all generated HTML - files. + command line to set the file prefix to use for all + generated HTML files. - - Now generates the current time/data on each generated page + - Now generates the current time/data on each generated page in order to distinguish between versions. - DocMaker can be used with other projects now, not only FT2 (e.g. MLib, - FTLayout, etc.). + DocMaker can be used with other projects now, not only FT2 + (e.g. MLib, FTLayout, etc.). -=========================================================================== + +====================================================================== LATEST CHANGES BETWEEN 2.0.2 and 2.0.1 - I. CHANGES TO THE MODULES / FONT DRIVERS - THE TRUETYPE BYTECODE INTERPRETER IS NOW TURNED OFF, in order to @@ -1428,7 +1707,7 @@ BETA-8 (RELEASE CANDIDATE) CHANGES * Support for transforms and direct rendering in FT_Load_Glyph: Most of the functionality found in has been - moved to the core library. Hence, the following: + moved to the core library. Hence, the following: - A transform can be specified for a face through FT_Set_Transform. this transform is applied by FT_Load_Glyph @@ -1459,7 +1738,7 @@ BETA-8 (RELEASE CANDIDATE) CHANGES OLD CHANGES FOR BETA 7 - - bug-fixed the OpenType/CFF parser. It now loads and displays my + - bug-fixed the OpenType/CFF parser. It now loads and displays my two fonts nicely, but I'm pretty certain that more testing is needed :-) @@ -1467,20 +1746,20 @@ OLD CHANGES FOR BETA 7 correctly (well, the accent is not always well placed, but that's another problem..) - - added the CID-keyed Type 1 driver in "src/cid". Works pretty well + - added the CID-keyed Type 1 driver in "src/cid". Works pretty well for only 13 Kb of code ;-) Doesn't read AFM files though, nor the really useful CMAP files.. - - fixed two bugs in the smooth renderer (src/base/ftgrays.c). Thanks - to Boris Letocha for spotting them and providing a fix.. + - fixed two bugs in the smooth renderer (src/base/ftgrays.c). + Thanks to Boris Letocha for spotting them and providing a fix. - - fixed potential "divide by zero" bugs in ftcalc.c.. my god.. + - fixed potential "divide by zero" bugs in ftcalc.c. - added source code for the OpenType/CFF driver (still incomplete though..) - modified the SFNT driver slightly to perform more robust header - checks in TT_Load_SFNT_Header. This prevents certain font files + checks in TT_Load_SFNT_Header. This prevents certain font files (e.g. some Type 1 Multiple Masters) from being incorrectly "recognized" as TrueType font files.. @@ -1491,8 +1770,8 @@ OLD CHANGES FOR BETA 7 - added a tiny segment cache to the SFNT Charmap 4 decoder, in order to minimally speed it up.. - - added support for Multiple Master fonts in "type1z". There is also - a new file named which defines functions to + - added support for Multiple Master fonts in "type1z". There is + also a new file named which defines functions to manage them from client applications. The new file "src/base/ftmm.c" is also optional to the engine.. @@ -1504,7 +1783,7 @@ OLD CHANGES FOR BETA 7 correctly (used for many oblique fonts..) - some fixes for 64-bit systems (mainly changing some FT_TRACE calls - to use %p instead of %lx).. Thanks to Karl Robillard + to use %p instead of %lx). Thanks to Karl Robillard. - fixed some bugs in the sbit loader (src/base/sfnt/ttsbit.c) + added a new flag, FT_LOAD_CROP_BITMAP to query that bitmaps be @@ -1523,7 +1802,7 @@ OLD CHANGES FOR BETA 7 OLD CHANGES 16 May 2000 - - tagged "BETA-6" in the CVS tree. This one is a serious release + - tagged "BETA-6" in the CVS tree. This one is a serious release candidate even though it doesn't incorporate the auto-hinter yet.. - various obsolete files were removed, and copyright header updated @@ -1553,8 +1832,8 @@ OLD CHANGES 16 May 2000 | | It seems the C pre-processor that comes with LCC is broken, it | doesn't recognize the ANSI standard directives # and ## - | correctly when one of the argument is a macro. Also, something - | like: + | correctly when one of the argument is a macro. Also, + | something like: | | #define F(x) print##x | @@ -1564,12 +1843,12 @@ OLD CHANGES 16 May 2000 | | print "hello") | - | by its pre-processor. For this reason, you simply cannot build + | by its pre-processor. For this reason, you simply cannot build | FreeType 2 in debug mode with this compiler.. - - yet another massive grunt work. I've changed the definition of the - EXPORT_DEF, EXPORT_FUNC, BASE_DEF & BASE_FUNC macros. These now - take an argument, which is the function's return value type. + - yet another massive grunt work. I've changed the definition of + the EXPORT_DEF, EXPORT_FUNC, BASE_DEF & BASE_FUNC macros. These + now take an argument, which is the function's return value type. This is necessary to compile FreeType as a DLL on Windows and OS/2. Depending on the compiler used, a compiler-specific keyword @@ -1577,7 +1856,7 @@ OLD CHANGES 16 May 2000 after (BorlandC++) the type.. Of course, this needed a lot of changes throughout the source code - to make it compile again... All cleaned up now, apparently.. + to make it compile again... All cleaned up now, apparently.. Note also that there is a new EXPORT_VAR macro defined to allow the _declaration_ of an exportable public (constant) @@ -1606,17 +1885,17 @@ OLD CHANGES 16 May 2000 (the implementation was already in "ftobjs.c"). - the file has been seriously updated in order - to allow the automatic generation of error message tables. See the - comments within it for more information. + to allow the automatic generation of error message tables. See + the comments within it for more information. - - major directory hierarchy re-organisation. This was done for two + - major directory hierarchy re-organisation. This was done for two things: * first, to ease the "manual" compilation of the library by requiring at lot less include paths :-) * second, to allow external programs to effectively access - internal data fields. For example, this can be extremely + internal data fields. For example, this can be extremely useful if someone wants to write a font producer or a font manager on top of FreeType. @@ -1629,14 +1908,15 @@ OLD CHANGES 16 May 2000 Some new include sub-directories are available: a. the "freetype/config" directory, contains two files used to - configure the build of the library. Client applications should - not need to look at these normally, but they can if they want. + configure the build of the library. Client applications + should not need to look at these normally, but they can if + they want. #include #include b. the "freetype/internal" directory, contains header files that - describes library internals. These are the header files that + describes library internals. These are the header files that were previously found in the "src/base" and "src/shared" directories. @@ -1719,9 +1999,9 @@ OLD CHANGES - 14-apr-2000 to handle the new XFree86 4.0 fonts (and a few other ones..) - the smooth renderer is now complete and supports sub-banding to - render large glyphs at high speed. However, it is still located in - "demos/src/ftgrays.c" and should move to the library itself in the - next beta.. NOTE: The smooth renderer doesn't compile in + render large glyphs at high speed. However, it is still located + in "demos/src/ftgrays.c" and should move to the library itself in + the next beta. NOTE: The smooth renderer doesn't compile in stand-alone mode anymore, but this should be fixed RSN.. - introduced convenience functions to more easily deal with glyph @@ -1734,14 +2014,14 @@ OLD CHANGES - 14-apr-2000 results). - changed the raster interface, in order to allow client - applications to provide their own span-drawing callbacks. However, - only the smooth renderer supports this. See "FT_Raster_Params" in - the file "include/ftimage.h" + applications to provide their own span-drawing callbacks. + However, only the smooth renderer supports this. See + "FT_Raster_Params" in the file "include/ftimage.h". - fixed a small bug in FT_MulFix that caused incorrect transform computation! - - Note: The tutorial is out-of-date, grumpf.. :-( + - Note: The tutorial is out-of-date. ====================================================================== @@ -1783,7 +2063,7 @@ OLD CHANGES - 12-mar-2000 OLD CHANGES - 22-feb-2000 - - introduced the "psnames" module. It is used to: + - introduced the "psnames" module. It is used to: o convert a Postscript glyph name into the equivalent Unicode character code (used by the Type 1 driver(s) to synthetize on @@ -1795,16 +2075,16 @@ OLD CHANGES - 22-feb-2000 names support routines, while the other two tables are used by the Type 1 driver(s)). - - introduced the "type1z" alternate Type 1 driver. This is a (still + - introduced the "type1z" alternate Type 1 driver. This is a (still experimental) driver for the Type 1 format that will ultimately - replace the one in "src/type1". It uses pattern matching to load - data from the font, instead of a finite state analyzer. It works - much better than the "old" driver with "broken" fonts. It is also + replace the one in "src/type1". It uses pattern matching to load + data from the font, instead of a finite state analyzer. It works + much better than the "old" driver with "broken" fonts. It is also much smaller (under 15 Kb). - the Type 1 drivers (both in "src/type1" and "src/type1z") are nearly complete. They both provide automatic Unicode charmap - synthesis through the "psnames" module. No re-encoding vector is + synthesis through the "psnames" module. No re-encoding vector is needed. (note that they still leak memory due to some code missing, and I'm getting lazy). @@ -1812,7 +2092,7 @@ OLD CHANGES - 22-feb-2000 wasn't exactly tested as it should ;-) - The TrueType glyph loader has been seriously rewritten (see the - file "src/truetype/ttgload.c". It is now much, much simpler as + file "src/truetype/ttgload.c". It is now much, much simpler as well as easier to read, maintain and understand :-) Preliminary versions introduced a memory leak that has been reported by Jack Davis, and is now fixed.. @@ -1863,7 +2143,7 @@ OLDER CHANGES - 27-jan-2000 drivers to co-exist peacefully - updated the "T1_Face" type to better separate Postscript font - content from the rest of the FT_Face structure. Might be used + content from the rest of the FT_Face structure. Might be used later by the CFF/Type2 driver.. - added an experimental replacement Type 1 driver featuring advanced @@ -1915,9 +2195,9 @@ High-Level Interface: field "face->glyph.format" - the list of available charmaps is directly accessible through - "face->charmaps", counting "face->num_charmaps" elements. Each + "face->charmaps", counting "face->num_charmaps" elements. Each charmap has an 'encoding' field which specifies which known - encoding it deals with. Valid values are, for example : + encoding it deals with. Valid values are, for example: ft_encoding_unicode (for ASCII, Latin-1 and Unicode) ft_encoding_apple_roman @@ -1925,7 +2205,7 @@ High-Level Interface: ft_encoding_adobe_standard ft_encoding_adobe_expert - other values may be added in the future. Each charmap still + other values may be added in the future. Each charmap still holds its "platform_id" and "encoding_id" values in case the encoding is too exotic for the current library @@ -1975,12 +2255,12 @@ Glyph Image Formats: should encompass all known bitmap types. Each new image format must provide at least one "raster", i.e. a - module capable of transforming the glyph image into a bitmap. It's + module capable of transforming the glyph image into a bitmap. It's also possible to change the default raster used for a given glyph image format. The default outline scan-converter now uses 128 levels of grays by - default, which tends to smooth many things. Note that the demo + default, which tends to smooth many things. Note that the demo programs have been updated significantly in order to display these.. @@ -1995,7 +2275,7 @@ Build system: it is not detected, with pseudo-standard compilation flags) - the ability to compile from the Makefiles with very different and - exotic compilers. Note that linking the library can be difficult + exotic compilers. Note that linking the library can be difficult for some platforms. For example, the file `config/win32/lcclib.bat' is invoked by the @@ -2006,9 +2286,9 @@ Build system: Here's how it works: - the first time you type `make', the build system runs a series of - sub-makefiles in order to detect your host platform. It then dumps - what it found, and creates a file called `config.mk' in the - current directory. This is a sub-Makefile used to define many + sub-makefiles in order to detect your host platform. It then + dumps what it found, and creates a file called `config.mk' in the + current directory. This is a sub-Makefile used to define many important Make variables used to build the library. - the second time, the build system detects the `config.mk' then use @@ -2022,7 +2302,7 @@ Build system: re-run make. Finally, the default compiler for all platforms is gcc (for now, - this will hopefully changed in the future). You can however specify + this will hopefully changed in the future). You can however specify a different compiler by specifying it after the 'setup' target as in: @@ -2046,7 +2326,7 @@ Portability: In the previous beta, a single FT_System object was used to encompass all low-level operations like thread synchronisation, - memory management and i/o access. This has been greatly simplified: + memory management and i/o access. This has been greatly simplified: - thread synchronisation has been dropped, for the simple reason that the library is already re-entrant, and that if you really @@ -2060,12 +2340,12 @@ Portability: - resources have disappeared (they created more problems than they solved), and i/o management have been simplified greatly as a - result. Streams are defined through FT_Stream objects, which can - be either memory-based or disk-based. + result. Streams are defined through FT_Stream objects, which + can be either memory-based or disk-based. Note that each face has its own stream, which is closed only when the face object is destroyed. Hence, a function like - TT_Flush_Face in 1.x cannot be directly supported. However, if + TT_Flush_Face in 1.x cannot be directly supported. However, if you really need something like this, you can easily tailor your own streams to achieve the same feature at a lower level (and use FT_Open_Face instead of FT_New_Face to create the face). @@ -2086,18 +2366,19 @@ Font Drivers: library at compile time is managed through a new configuration file called `config//ftmodule.h'. - This file is autogenerated when invoking `make modules'. This target - will parse all sub-directories of 'src', looking for a "module.mk" - rules file, used to describe the driver to the build system. + This file is autogenerated when invoking `make modules'. This + target will parse all sub-directories of 'src', looking for a + "module.mk" rules file, used to describe the driver to the build + system. Hence, one should call `make modules' each time a font driver is added or removed from the `src' directory. - Finally, this version provides a "pseudo-driver" in `src/sfnt'. This - driver doesn't support font files directly, but provides services - used by all TrueType-like font drivers. Hence, its code is shared - between the TrueType & OpenType font formats, and possibly more - formats to come if we're lucky.. + Finally, this version provides a "pseudo-driver" in `src/sfnt'. + This driver doesn't support font files directly, but provides + services used by all TrueType-like font drivers. Hence, its code is + shared between the TrueType & OpenType font formats, and possibly + more formats to come if we're lucky.. ---------------------------------------------------------------------- @@ -2111,14 +2392,14 @@ Extensions support: driver. Extension ids are now strings, rather than 4-byte tags, as this is - usually more readable.. + usually more readable. Each extension has: - some data, associated to each face object - an interface (table of function pointers) An extension that is format-specific should simply register itself - to the correct font driver. Here is some example code: + to the correct font driver. Here is some example code: // Registering an extensions // diff --git a/reactos/lib/freetype/docs/CUSTOMIZE b/reactos/lib/freetype/docs/CUSTOMIZE index 2961d174e63..8709b3decb6 100644 --- a/reactos/lib/freetype/docs/CUSTOMIZE +++ b/reactos/lib/freetype/docs/CUSTOMIZE @@ -101,15 +101,15 @@ IV. Overriding default configuration and module headers name the configuration headers. To do so, you need a custom "ft2build.h" whose content can be as simple as: - #ifndef __FT2_BUILD_GENERIC_H__ - #define __FT2_BUILD_GENERIC_H__ + #ifndef __FT2_BUILD_MY_PLATFORM_H__ + #define __FT2_BUILD_MY_PLATFORM_H__ - #define FT_CONFIG_OPTIONS_H - #define FT_CONFIG_MACROS_H + #define FT_CONFIG_OPTIONS_H + #define FT_CONFIG_MODULES_H #include - #endif /* __FT2_BUILD_GENERIC_H__ */ + #endif /* __FT2_BUILD_MY_PLATFORM_H__ */ Place those files in a separate directory, e.g.: diff --git a/reactos/lib/freetype/docs/INSTALL b/reactos/lib/freetype/docs/INSTALL index 93c8bd36d46..8fb665759f5 100644 --- a/reactos/lib/freetype/docs/INSTALL +++ b/reactos/lib/freetype/docs/INSTALL @@ -61,6 +61,7 @@ II. Custom builds of the library [2] make++, a make tool written in Perl, has sufficient support of GNU make extensions to build FreeType. See - http://makepp.sourceforge.net for more information. + http://makepp.sourceforge.net for more information; you need version + 1.19 or newer, and you must pass option `--norc-substitution'. --- end of INSTALL --- diff --git a/reactos/lib/freetype/docs/INSTALL.GNU b/reactos/lib/freetype/docs/INSTALL.GNU index d984789e54c..4a56d6d6d66 100644 --- a/reactos/lib/freetype/docs/INSTALL.GNU +++ b/reactos/lib/freetype/docs/INSTALL.GNU @@ -23,7 +23,8 @@ the file INSTALL.UNX instead. Note that make++, a make tool written in Perl, supports enough features of GNU make to compile FreeType. See - http://makepp.sourceforge.net for more information. + http://makepp.sourceforge.net for more information; you need version + 1.19 or newer, and you must pass option `--norc-substitution'. Make sure that you are invoking GNU Make from the command line, by typing something like: diff --git a/reactos/lib/freetype/docs/INSTALL.UNX b/reactos/lib/freetype/docs/INSTALL.UNX index 148338098f5..d5a45c04240 100644 --- a/reactos/lib/freetype/docs/INSTALL.UNX +++ b/reactos/lib/freetype/docs/INSTALL.UNX @@ -13,7 +13,8 @@ Win32: [Well, this is not really correct. Recently, a perl implementation of make called `makepp' has appeared which can also build FreeType 2 successfully on Unix platforms. See http://makepp.sourceforge.net - for more details.] + for more details; you need version 1.19 or newer, and you must pass + option `--norc-substitution'.] Trying to compile the library with a different Make tool will print a message like: diff --git a/reactos/lib/freetype/docs/VERSION.DLL b/reactos/lib/freetype/docs/VERSION.DLL index 2e1f1af45d6..5b178bdc4ba 100644 --- a/reactos/lib/freetype/docs/VERSION.DLL +++ b/reactos/lib/freetype/docs/VERSION.DLL @@ -51,7 +51,10 @@ libtool number, as well as the shared object number found on _most_ systems, but not all of them: release libtool so - -------------------------------------------------------------------- + ------------------------------- + 2.1.8 9.6.3 6.3.6 + 2.1.7 9.5.3 6.3.5 + 2.1.6 9.5.3 6.3.5 2.1.5 9.4.3 6.3.4 2.1.4 9.3.3 6.3.3 2.1.3 9.2.3 6.3.2 @@ -60,6 +63,8 @@ systems, but not all of them: 2.1.0 8.0.2 ? 2.0.9 9.0.3 ? 2.0.8 8.0.2 ? + 2.0.4 7.0.1 ? + 2.0.1 6.1.0 ? The libtool numbers are a bit inconsistent due to the library's history: @@ -86,19 +91,19 @@ other release numbers. old_CPPFLAGS="$CPPFLAGS" CPPFLAGS=`freetype-config --cflags` AC_TRY_CPP([ -#include + +#include +#include FT_FREETYPE_H #if (FREETYPE_MAJOR*1000 + FREETYPE_MINOR)*1000 + FREETYPE_PATCH < 2000009 #error Freetype version too low. #endif - ],[ - AC_MSG_RESULT(yes) - FREETYPE_LIBS=`freetype-config --libs` - AC_SUBST(FREETYPE_LIBS) - AC_DEFINE(HAVE_FREETYPE,1,[Define if you have the FreeType2 library]) - CPPFLAGS="$old_CPPFLAGS" - ],[ - AC_MSG_ERROR([Need FreeType library version 2.0.9 or higher]) - ]) + ], + [AC_MSG_RESULT(yes) + FREETYPE_LIBS=`freetype-config --libs` + AC_SUBST(FREETYPE_LIBS) + AC_DEFINE(HAVE_FREETYPE,1,[Define if you have the FreeType2 library]) + CPPFLAGS="$old_CPPFLAGS"], + [AC_MSG_ERROR([Need FreeType library version 2.0.9 or higher])]) --- end of VERSION.DLL --- diff --git a/reactos/lib/freetype/docs/license.txt b/reactos/lib/freetype/docs/license.txt index dc011d1d560..876cc4b93a5 100644 --- a/reactos/lib/freetype/docs/license.txt +++ b/reactos/lib/freetype/docs/license.txt @@ -2,24 +2,27 @@ The FreeType 2 font engine is copyrighted work and cannot be used legally without a software license. In order to make this project usable to a vast majority of developers, we distribute it under two -mutually exclusive licenses. +mutually exclusive open-source licenses. -This means that *you* must choose *one* license of the two described +This means that *you* must choose *one* of the two licenses described below, then obey all its terms and conditions when using FreeType 2 in any of your projects or products. - - The FreeType License, found in the file "FTL.TXT", which is an - BSD-style open-source license *with* an advertising clause that - forces you to explicitely cite the FreeType project in your - product's documentation. All details are in the license file. + - The FreeType License, found in the file `FTL.TXT', which is similar + to the original BSD license *with* an advertising clause that forces + you to explicitly cite the FreeType project in your product's + documentation. All details are in the license file. This license + is suited to products which don't use the GNU General Public + License. - - The GNU General Public License, found in "GPL.TXT", which is the - traditionnal and "viral" GPL license that forces you to redistribute - the _complete_ sources of all your products that use FreeType 2. + - The GNU General Public License version 2, found in `GPL.TXT' (any + later version can be used also), for programs which already use the + GPL. Note that the FTL is incompatible with the GPL due to its + advertisement clause. -Note that the contributed PCF driver comes with a license similar to -that of X Window System which is compatible to the above two licenses -(see file src/pcf/readme). +The contributed PCF driver comes with a license similar to that of the X +Window System. It is compatible to the above two licenses (see file +src/pcf/readme). --- end of licence.txt --- diff --git a/reactos/lib/freetype/docs/raster.txt b/reactos/lib/freetype/docs/raster.txt new file mode 100644 index 00000000000..078c51aa19b --- /dev/null +++ b/reactos/lib/freetype/docs/raster.txt @@ -0,0 +1,624 @@ + + How FreeType's rasterizer work + + by David Turner + + Revised 2003-Dec-08 + + +This file is an attempt to explain the internals of the FreeType +rasterizer. The rasterizer is of quite general purpose and could +easily be integrated into other programs. + + + I. Introduction + + II. Rendering Technology + 1. Requirements + 2. Profiles and Spans + a. Sweeping the Shape + b. Decomposing Outlines into Profiles + c. The Render Pool + d. Computing Profiles Extents + e. Computing Profiles Coordinates + f. Sweeping and Sorting the Spans + + +I. Introduction +=============== + + A rasterizer is a library in charge of converting a vectorial + representation of a shape into a bitmap. The FreeType rasterizer + has been originally developed to render the glyphs found in + TrueType files, made up of segments and second-order B閦iers. + Meanwhile it has been extended to render third-order B閦ier curves + also. This document is an explanation of its design and + implementation. + + While these explanations start from the basics, a knowledge of + common rasterization techniques is assumed. + + +II. Rendering Technology +======================== + +1. Requirements +--------------- + + We assume that all scaling, rotating, hinting, etc., has been + already done. The glyph is thus described by a list of points in + the device space. + + - All point coordinates are in the 26.6 fixed float format. The + used orientation is: + + + ^ y + | reference orientation + | + *----> x + 0 + + + `26.6' means that 26 bits are used for the integer part of a + value and 6 bits are used for the fractional part. + Consequently, the `distance' between two neighbouring pixels is + 64 `units' (1 unit = 1/64th of a pixel). + + Note that, for the rasterizer, pixel centers are located at + integer coordinates. The TrueType bytecode interpreter, + however, assumes that the lower left edge of a pixel (which is + taken to be a square with a length of 1 unit) has integer + coordinates. + + + ^ y ^ y + | | + | (1,1) | (0.5,0.5) + +-----------+ +-----+-----+ + | | | | | + | | | | | + | | | o-----+-----> x + | | | (0,0) | + | | | | + o-----------+-----> x +-----------+ + (0,0) (-0.5,-0.5) + + TrueType bytecode interpreter FreeType rasterizer + + + A pixel line in the target bitmap is called a `scanline'. + + - A glyph is usually made of several contours, also called + `outlines'. A contour is simply a closed curve that delimits an + outer or inner region of the glyph. It is described by a series + of successive points of the points table. + + Each point of the glyph has an associated flag that indicates + whether it is `on' or `off' the curve. Two successive `on' + points indicate a line segment joining the two points. + + One `off' point amidst two `on' points indicates a second-degree + (conic) B閦ier parametric arc, defined by these three points + (the `off' point being the control point, and the `on' ones the + start and end points). Similarly, a third-degree (cubic) B閦ier + curve is described by four points (two `off' control points + between two `on' points). + + Finally, for second-order curves only, two successive `off' + points forces the rasterizer to create, during rendering, an + `on' point amidst them, at their exact middle. This greatly + facilitates the definition of successive B閦ier arcs. + + The parametric form of a second-order B閦ier curve is: + + P(t) = (1-t)^2*P1 + 2*t*(1-t)*P2 + t^2*P3 + + (P1 and P3 are the end points, P2 the control point.) + + The parametric form of a third-order B閦ier curve is: + + P(t) = (1-t)^3*P1 + 3*t*(1-t)^2*P2 + 3*t^2*(1-t)*P3 + t^3*P4 + + (P1 and P4 are the end points, P2 and P3 the control points.) + + For both formulae, t is a real number in the range [0..1]. + + Note that the rasterizer does not use these formulae directly. + They exhibit, however, one very useful property of B閦ier arcs: + Each point of the curve is a weighted average of the control + points. + + As all weights are positive and always sum up to 1, whatever the + value of t, each arc point lies within the triangle (polygon) + defined by the arc's three (four) control points. + + In the following, only second-order curves are discussed since + rasterization of third-order curves is completely identical. + + Here some samples for second-order curves. + + + * # on curve + * off curve + __---__ + #-__ _-- -_ + --__ _- - + --__ # \ + --__ # + -# + Two `on' points + Two `on' points and one `off' point + between them + + * + # __ Two `on' points with two `off' + \ - - points between them. The point + \ / \ marked `0' is the middle of the + - 0 \ `off' points, and is a `virtual + -_ _- # on' point where the curve passes. + -- It does not appear in the point + * list. + + +2. Profiles and Spans +--------------------- + + The following is a basic explanation of the _kind_ of computations + made by the rasterizer to build a bitmap from a vector + representation. Note that the actual implementation is slightly + different, due to performance tuning and other factors. + + However, the following ideas remain in the same category, and are + more convenient to understand. + + + a. Sweeping the Shape + + The best way to fill a shape is to decompose it into a number of + simple horizontal segments, then turn them on in the target + bitmap. These segments are called `spans'. + + __---__ + _-- -_ + _- - + - \ + / \ + / \ + | \ + + __---__ Example: filling a shape + _----------_ with spans. + _-------------- + ----------------\ + /-----------------\ This is typically done from the top + / \ to the bottom of the shape, in a + | | \ movement called a `sweep'. + V + + __---__ + _----------_ + _-------------- + ----------------\ + /-----------------\ + /-------------------\ + |---------------------\ + + + In order to draw a span, the rasterizer must compute its + coordinates, which are simply the x coordinates of the shape's + contours, taken on the y scanlines. + + + /---/ |---| Note that there are usually + /---/ |---| several spans per scanline. + | /---/ |---| + | /---/_______|---| When rendering this shape to the + V /----------------| current scanline y, we must + /-----------------| compute the x values of the + a /----| |---| points a, b, c, and d. + - - - * * - - - - * * - - y - + / / b c| |d + + + /---/ |---| + /---/ |---| And then turn on the spans a-b + /---/ |---| and c-d. + /---/_______|---| + /----------------| + /-----------------| + a /----| |---| + - - - ####### - - - - ##### - - y - + / / b c| |d + + + b. Decomposing Outlines into Profiles + + For each scanline during the sweep, we need the following + information: + + o The number of spans on the current scanline, given by the + number of shape points intersecting the scanline (these are + the points a, b, c, and d in the above example). + + o The x coordinates of these points. + + x coordinates are computed before the sweep, in a phase called + `decomposition' which converts the glyph into *profiles*. + + Put it simply, a `profile' is a contour's portion that can only + be either ascending or descending, i.e., it is monotonic in the + vertical direction (we also say y-monotonic). There is no such + thing as a horizontal profile, as we shall see. + + Here are a few examples: + + + this square + 1 2 + ---->---- is made of two + | | | | + | | profiles | | + ^ v ^ + v + | | | | + | | | | + ----<---- + + up down + + + this triangle + + P2 1 2 + + |\ is made of two | \ + ^ | \ \ | \ + | | \ \ profiles | \ | + | | \ v ^ | \ | + | \ | | + \ v + | \ | | \ + P1 ---___ \ ---___ \ + ---_\ ---_ \ + <--__ P3 up down + + + + A more general contour can be made of more than two profiles: + + __ ^ + / | / ___ / | + / | / | / | / | + | | / / => | v / / + | | | | | | ^ | + ^ | |___| | | ^ + | + | + v + | | | v | | + | | | up | + |___________| | down | + + <-- up down + + + Successive profiles are always joined by horizontal segments + that are not part of the profiles themselves. + + For the rasterizer, a profile is simply an *array* that + associates one horizontal *pixel* coordinate to each bitmap + *scanline* crossed by the contour's section containing the + profile. Note that profiles are *oriented* up or down along the + glyph's original flow orientation. + + In other graphics libraries, profiles are also called `edges' or + `edgelists'. + + + c. The Render Pool + + FreeType has been designed to be able to run well on _very_ + light systems, including embedded systems with very few memory. + + A render pool will be allocated once; the rasterizer uses this + pool for all its needs by managing this memory directly in it. + The algorithms that are used for profile computation make it + possible to use the pool as a simple growing heap. This means + that this memory management is actually quite easy and faster + than any kind of malloc()/free() combination. + + Moreover, we'll see later that the rasterizer is able, when + dealing with profiles too large and numerous to lie all at once + in the render pool, to immediately decompose recursively the + rendering process into independent sub-tasks, each taking less + memory to be performed (see `sub-banding' below). + + The render pool doesn't need to be large. A 4KByte pool is + enough for nearly all renditions, though nearly 100% slower than + a more confortable 16KByte or 32KByte pool (that was tested with + complex glyphs at sizes over 500 pixels). + + + d. Computing Profiles Extents + + Remember that a profile is an array, associating a _scanline_ to + the x pixel coordinate of its intersection with a contour. + + Though it's not exactly how the FreeType rasterizer works, it is + convenient to think that we need a profile's height before + allocating it in the pool and computing its coordinates. + + The profile's height is the number of scanlines crossed by the + y-monotonic section of a contour. We thus need to compute these + sections from the vectorial description. In order to do that, + we are obliged to compute all (local and global) y extrema of + the glyph (minima and maxima). + + + P2 For instance, this triangle has only + two y-extrema, which are simply + |\ + | \ P2.y as a vertical maximum + | \ P3.y as a vertical minimum + | \ + | \ P1.y is not a vertical extremum (though + | \ it is a horizontal minimum, which we + P1 ---___ \ don't need). + ---_\ + P3 + + + Note that the extrema are expressed in pixel units, not in + scanlines. The triangle's height is certainly (P3.y-P2.y+1) + pixel units, but its profiles' heights are computed in + scanlines. The exact conversion is simple: + + - min scanline = FLOOR ( min y ) + - max scanline = CEILING( max y ) + + A problem arises with B閦ier Arcs. While a segment is always + necessarily y-monotonic (i.e., flat, ascending, or descending), + which makes extrema computations easy, the ascent of an arc can + vary between its control points. + + + P2 + * + # on curve + * off curve + __-x--_ + _-- -_ + P1 _- - A non y-monotonic B閦ier arc. + # \ + - The arc goes from P1 to P3. + \ + \ P3 + # + + + We first need to be able to easily detect non-monotonic arcs, + according to their control points. I will state here, without + proof, that the monotony condition can be expressed as: + + P1.y <= P2.y <= P3.y for an ever-ascending arc + + P1.y >= P2.y >= P3.y for an ever-descending arc + + with the special case of + + P1.y = P2.y = P3.y where the arc is said to be `flat'. + + As you can see, these conditions can be very easily tested. + They are, however, extremely important, as any arc that does not + satisfy them necessarily contains an extremum. + + Note also that a monotonic arc can contain an extremum too, + which is then one of its `on' points: + + + P1 P2 + #---__ * P1P2P3 is ever-descending, but P1 + -_ is an y-extremum. + - + ---_ \ + -> \ + \ P3 + # + + + Let's go back to our previous example: + + + P2 + * + # on curve + * off curve + __-x--_ + _-- -_ + P1 _- - A non-y-monotonic B閦ier arc. + # \ + - Here we have + \ P2.y >= P1.y && + \ P3 P2.y >= P3.y (!) + # + + + We need to compute the vertical maximum of this arc to be able + to compute a profile's height (the point marked by an `x'). The + arc's equation indicates that a direct computation is possible, + but we rely on a different technique, which use will become + apparent soon. + + B閦ier arcs have the special property of being very easily + decomposed into two sub-arcs, which are themselves B閦ier arcs. + Moreover, it is easy to prove that there is at most one vertical + extremum on each B閦ier arc (for second-degree curves; similar + conditions can be found for third-order arcs). + + For instance, the following arc P1P2P3 can be decomposed into + two sub-arcs Q1Q2Q3 and R1R2R3: + + + P2 + * + # on curve + * off curve + + + original B閦ier arc P1P2P3. + __---__ + _-- --_ + _- -_ + - - + / \ + / \ + # # + P1 P3 + + + + P2 + * + + + + Q3 Decomposed into two subarcs + Q2 R2 Q1Q2Q3 and R1R2R3 + * __-#-__ * + _-- --_ + _- R1 -_ Q1 = P1 R3 = P3 + - - Q2 = (P1+P2)/2 R2 = (P2+P3)/2 + / \ + / \ Q3 = R1 = (Q2+R2)/2 + # # + Q1 R3 Note that Q2, R2, and Q3=R1 + are on a single line which is + tangent to the curve. + + + We have then decomposed a non-y-monotonic B閦ier curve into two + smaller sub-arcs. Note that in the above drawing, both sub-arcs + are monotonic, and that the extremum is then Q3=R1. However, in + a more general case, only one sub-arc is guaranteed to be + monotonic. Getting back to our former example: + + + Q2 + * + + __-x--_ R1 + _-- #_ + Q1 _- Q3 - R2 + # \ * + - + \ + \ R3 + # + + + Here, we see that, though Q1Q2Q3 is still non-monotonic, R1R2R3 + is ever descending: We thus know that it doesn't contain the + extremum. We can then re-subdivide Q1Q2Q3 into two sub-arcs and + go on recursively, stopping when we encounter two monotonic + subarcs, or when the subarcs become simply too small. + + We will finally find the vertical extremum. Note that the + iterative process of finding an extremum is called `flattening'. + + + e. Computing Profiles Coordinates + + Once we have the height of each profile, we are able to allocate + it in the render pool. The next task is to compute coordinates + for each scanline. + + In the case of segments, the computation is straightforward, + using the Euclidian algorithm (also known as Bresenham). + However, for B閦ier arcs, the job is a little more complicated. + + We assume that all B閦iers that are part of a profile are the + result of flattening the curve, which means that they are all + y-monotonic (ascending or descending, and never flat). We now + have to compute the intersections of arcs with the profile's + scanlines. One way is to use a similar scheme to flattening + called `stepping'. + + + Consider this arc, going from P1 to + --------------------- P3. Suppose that we need to + compute its intersections with the + drawn scanlines. As already + --------------------- mentioned this can be done + directly, but the involed algorithm + * P2 _---# P3 is far too slow. + ------------- _-- -- + _- + _/ Instead, it is still possible to + ---------/----------- use the decomposition property in + / the same recursive way, i.e., + | subdivide the arc into subarcs + ------|-------------- until these get too small to cross + | more than one scanline! + | + -----|--------------- This is very easily done using a + | rasterizer-managed stack of + | subarcs. + # P1 + + + f. Sweeping and Sorting the Spans + + Once all our profiles have been computed, we begin the sweep to + build (and fill) the spans. + + As both the TrueType and Type 1 specifications use the winding + fill rule (but with opposite directions), we place, on each + scanline, the present profiles in two separate lists. + + One list, called the `left' one, only contains ascending + profiles, while the other `right' list contains the descending + profiles. + + As each glyph is made of closed curves, a simple geometric + property ensures that the two lists contain the same number of + elements. + + Creating spans is thus straightforward: + + 1. We sort each list in increasing horizontal order. + + 2. We pair each value of the left list with its corresponding + value in the right list. + + + / / | | For example, we have here + / / | | four profiles. Two of + >/ / | | | them are ascending (1 & + 1// / ^ | | | 2 3), while the two others + // // 3| | | v are descending (2 & 4). + / //4 | | | On the given scanline, + a / /< | | the left list is (1,3), + - - - *-----* - - - - *---* - - y - and the right one is + / / b c| |d (4,2) (sorted). + + There are then two spans, joining + 1 to 4 (i.e. a-b) and 3 to 2 + (i.e. c-d)! + + + Sorting doesn't necessarily take much time, as in 99 cases out + of 100, the lists' order is kept from one scanline to the next. + We can thus implement it with two simple singly-linked lists, + sorted by a classic bubble-sort, which takes a minimum amount of + time when the lists are already sorted. + + A previous version of the rasterizer used more elaborate + structures, like arrays to perform `faster' sorting. It turned + out that this old scheme is not faster than the one described + above. + + Once the spans have been `created', we can simply draw them in + the target bitmap. + + +--- end of raster.txt --- + +Local Variables: +coding: latin-1 +End: diff --git a/reactos/lib/freetype/docs/release b/reactos/lib/freetype/docs/release index df3ef5485c6..7cf37b84968 100644 --- a/reactos/lib/freetype/docs/release +++ b/reactos/lib/freetype/docs/release @@ -7,12 +7,26 @@ How to prepare a new release . builds/unix/configure.ac (version_info): Update according to the libtool rules, then regenerate the configure script. -. builds/freetype.mk (refdoc): Update the --title option. +. builds/freetype.mk (refdoc): Update the `--title' option. . docs/CHANGES: Document differences to last release. . README: Update. -. docs/VERSION.DLL: Document changed version_info. +. docs/VERSION.DLL: Document changed `version_info'. . ChangeLog: Announce new release. + +. Call `make refdoc' to update HTML reference. Copy it to + freetype2/docs/reference in the `www' CVS module and update the CVS. + Then call `update-www' in ~/cvs/scripts on www.freetype.org to + update and distribute everything to sourceforge. + +. Tag the CVS (freetype, ft2demos, www/freetype2/docs). + +. Update `make-release' and `make-current' in ~/cvs/scripts/ on + www.freetype.org, then call them. + +. Create an md5 checksum file (with md5sum). + +. Announce new release on announce@freetype.org and to relevant newsgroups. diff --git a/reactos/lib/freetype/freetype.def b/reactos/lib/freetype/freetype.def index 6f1689ce818..88113017ff2 100644 --- a/reactos/lib/freetype/freetype.def +++ b/reactos/lib/freetype/freetype.def @@ -4,6 +4,8 @@ FT_Done_Memory FT_New_Memory FT_Stream_Open ft_debug_init +FT_Trace_Get_Count +FT_Trace_Get_Name FT_Add_Default_Modules FT_Done_FreeType FT_Init_FreeType @@ -29,6 +31,7 @@ FT_Done_Size FT_FloorFix FT_Free FT_Get_Char_Index +FT_Get_CMap_Language_ID FT_Get_First_Char FT_Get_Glyph_Name FT_Get_Kerning @@ -66,6 +69,7 @@ FT_Load_Char FT_Load_Glyph FT_Load_Sfnt_Table FT_Lookup_Renderer +ft_module_get_service FT_MulDiv FT_MulFix FT_MulTo64 @@ -82,18 +86,23 @@ FT_Outline_Done FT_Outline_Done_Internal FT_Outline_Get_Bitmap FT_Outline_Get_CBox +FT_Outline_Get_Orientation FT_Outline_New FT_Outline_New_Internal FT_Outline_Render FT_Outline_Reverse FT_Outline_Transform FT_Outline_Translate +FT_Raccess_Get_DataOffsets +FT_Raccess_Get_HeaderInfo +FT_Raccess_Guess FT_Realloc FT_Remove_Module FT_Render_Glyph FT_Render_Glyph_Internal FT_RoundFix FT_Select_Charmap +ft_service_list_lookup FT_Set_Char_Size FT_Set_Charmap FT_Set_Debug_Hook @@ -107,12 +116,14 @@ FT_Stream_Close FT_Stream_EnterFrame FT_Stream_ExitFrame FT_Stream_ExtractFrame +FT_Stream_Free FT_Stream_GetChar FT_Stream_GetLong FT_Stream_GetLongLE FT_Stream_GetOffset FT_Stream_GetShort FT_Stream_GetShortLE +FT_Stream_New FT_Stream_OpenMemory FT_Stream_Pos FT_Stream_Read @@ -137,6 +148,9 @@ FT_Vector_Polarize FT_Vector_Rotate FT_Vector_Transform FT_Vector_Unit +FT_Outline_Get_BBox +FT_Get_BDF_Charset_ID +FT_Get_BDF_Property ft_bitmap_glyph_class FT_Done_Glyph FT_Get_Glyph @@ -150,90 +164,104 @@ ft_outline_glyph_class FT_Get_Multi_Master FT_Set_MM_Blend_Coordinates FT_Set_MM_Design_Coordinates -FT_Get_BDF_Charset_ID -FT_Get_BDF_Property -FT_Get_PS_Font_Info -FT_Has_PS_Glyph_Names -FT_Get_X11_Font_Format FT_Get_PFR_Advance FT_Get_PFR_Kerning FT_Get_PFR_Metrics +FT_Glyph_Stroke +FT_Glyph_StrokeBorder +FT_Outline_GetInsideBorder +FT_Outline_GetOutsideBorder FT_Stroker_BeginSubPath FT_Stroker_ConicTo FT_Stroker_CubicTo FT_Stroker_Done FT_Stroker_EndSubPath FT_Stroker_Export +FT_Stroker_ExportBorder +FT_Stroker_GetBorderCounts FT_Stroker_GetCounts FT_Stroker_LineTo FT_Stroker_New FT_Stroker_ParseOutline +FT_Stroker_Rewind FT_Stroker_Set +FT_Get_PS_Font_Info +FT_Has_PS_Glyph_Names FT_Get_WinFNT_Header -FT_Outline_Get_BBox +FT_Get_X11_Font_Format ah_arctan autohint_module_class ft_autohinter_service bdf_cmap_class bdf_driver_class -FT_LruList_Destroy -FT_LruList_Lookup -FT_LruList_New -FT_LruList_Remove -FT_LruList_Remove_Selection -FT_LruList_Reset -ftc_cache_clear -ftc_cache_done -ftc_cache_init -ftc_cache_lookup +ftc_basic_image_cache_class +ftc_basic_image_family_class +ftc_basic_sbit_cache_class +ftc_basic_sbit_family_class +FTC_Cache_Clear +FTC_Cache_Done +FTC_Cache_Init +FTC_Cache_Lookup +FTC_Cache_NewNode +FTC_Cache_RemoveFaceID ftc_cmap_cache_class FTC_CMapCache_Lookup FTC_CMapCache_New ftc_face_list_class -ftc_family_done -ftc_family_init -ftc_family_table_alloc -ftc_family_table_free -ftc_glyph_family_done -ftc_glyph_family_init -ftc_glyph_node_compare -ftc_glyph_node_done -ftc_glyph_node_init -ftc_image_cache_class -FTC_Image_Cache_Lookup -FTC_Image_Cache_New +FTC_Family_Init +FTC_GCache_Done +FTC_GCache_Init +FTC_GCache_Lookup +FTC_GCache_New +FTC_GNode_Compare +FTC_GNode_Done +FTC_GNode_Init +FTC_GNode_UnselectFamily FTC_ImageCache_Lookup FTC_ImageCache_New +FTC_INode_Free +FTC_INode_New +FTC_INode_Weight FTC_Manager_Compress FTC_Manager_Done -FTC_Manager_Lookup_Face -FTC_Manager_Lookup_Size +FTC_Manager_FlushN +FTC_Manager_LookupFace +FTC_Manager_LookupSize FTC_Manager_New -FTC_Manager_Register_Cache +FTC_Manager_RegisterCache +FTC_Manager_RemoveFaceID FTC_Manager_Reset +FTC_MruList_Done +FTC_MruList_Find +FTC_MruList_Init +FTC_MruList_Lookup +FTC_MruList_New +FTC_MruList_Remove +FTC_MruList_RemoveSelection +FTC_MruList_Reset +FTC_MruNode_Prepend +FTC_MruNode_Remove +FTC_MruNode_Up ftc_node_destroy -ftc_node_done FTC_Node_Unref -ftc_sbit_cache_class -FTC_SBit_Cache_Lookup -FTC_SBit_Cache_New FTC_SBitCache_Lookup FTC_SBitCache_New ftc_size_list_class +FTC_SNode_Compare +FTC_SNode_Free +FTC_SNode_New +FTC_SNode_Weight cff_cmap_encoding_class_rec cff_cmap_unicode_class_rec cff_driver_class t1cid_driver_class FT_Stream_OpenGzip -BitOrderInvert -FourByteSwap +FT_Stream_OpenLZW pcf_cmap_class pcf_driver_class -RepadBitmap -TwoByteSwap pfr_cmap_class_rec pfr_driver_class -pfr_service_rec +pfr_metrics_service_rec ps_parser_funcs ps_table_funcs psaux_module_class diff --git a/reactos/lib/freetype/include/freetype/cache/ftccache.h b/reactos/lib/freetype/include/freetype/cache/ftccache.h index 701b13eb0ee..7c7688dba26 100644 --- a/reactos/lib/freetype/include/freetype/cache/ftccache.h +++ b/reactos/lib/freetype/include/freetype/cache/ftccache.h @@ -4,7 +4,7 @@ /* */ /* FreeType internal cache interface (specification). */ /* */ -/* Copyright 2000-2001, 2002 by */ +/* Copyright 2000-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -20,9 +20,7 @@ #define __FTCCACHE_H__ -/* define to allow cache lookup inlining */ -#define FTC_CACHE_USE_INLINE - +#include FT_CACHE_INTERNAL_MRU_H FT_BEGIN_HEADER @@ -30,13 +28,7 @@ FT_BEGIN_HEADER typedef struct FTC_CacheRec_* FTC_Cache; /* handle to cache class */ - typedef const struct FTC_Cache_ClassRec_* FTC_Cache_Class; - - /* handle to cache node family */ - typedef struct FTC_FamilyRec_* FTC_Family; - - /* handle to cache root query */ - typedef struct FTC_QueryRec_* FTC_Query; + typedef const struct FTC_CacheClassRec_* FTC_CacheClass; /*************************************************************************/ @@ -62,12 +54,11 @@ FT_BEGIN_HEADER /* structure size should be 20 bytes on 32-bits machines */ typedef struct FTC_NodeRec_ { - FTC_Node mru_next; /* circular mru list pointer */ - FTC_Node mru_prev; /* circular mru list pointer */ - FTC_Node link; /* used for hashing */ - FT_UInt32 hash; /* used for hashing too */ - FT_UShort fam_index; /* index of family the node belongs to */ - FT_Short ref_count; /* reference count for this node */ + FTC_MruNodeRec mru; /* circular mru list pointer */ + FTC_Node link; /* used for hashing */ + FT_UInt32 hash; /* used for hashing too */ + FT_UShort cache_index; /* index of cache the node belongs to */ + FT_Short ref_count; /* reference count for this node */ } FTC_NodeRec; @@ -75,6 +66,9 @@ FT_BEGIN_HEADER #define FTC_NODE( x ) ( (FTC_Node)(x) ) #define FTC_NODE_P( x ) ( (FTC_Node*)(x) ) +#define FTC_NODE__NEXT(x) FTC_NODE( (x)->mru.next ) +#define FTC_NODE__PREV(x) FTC_NODE( (x)->mru.prev ) + /*************************************************************************/ /* */ @@ -83,83 +77,12 @@ FT_BEGIN_HEADER /* cache sub-system internals. */ /* */ - /* can be used as a FTC_Node_DoneFunc */ - FT_EXPORT( void ) - ftc_node_done( FTC_Node node, - FTC_Cache cache ); - /* reserved for manager's use */ FT_EXPORT( void ) ftc_node_destroy( FTC_Node node, FTC_Manager manager ); - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** CACHE QUERY DEFINITIONS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* A structure modelling a cache node query. The following fields must */ - /* all be set by the @FTC_Family_CompareFunc method of a cache's family */ - /* list. */ - /* */ - typedef struct FTC_QueryRec_ - { - FTC_Family family; - FT_UFast hash; - - } FTC_QueryRec; - - -#define FTC_QUERY( x ) ( (FTC_Query)(x) ) -#define FTC_QUERY_P( x ) ( (FTC_Query*)(x) ) - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** CACHE FAMILY DEFINITIONS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct FTC_FamilyRec_ - { - FT_LruNodeRec lru; - FTC_Cache cache; - FT_UInt num_nodes; - FT_UInt fam_index; - - } FTC_FamilyRec; - - -#define FTC_FAMILY( x ) ( (FTC_Family)(x) ) -#define FTC_FAMILY_P( x ) ( (FTC_Family*)(x) ) - - - /*************************************************************************/ - /* */ - /* These functions are exported so that they can be called from */ - /* user-provided cache classes; otherwise, they are really part of the */ - /* cache sub-system internals. */ - /* */ - - /* must be called by any FTC_Node_InitFunc routine */ - FT_EXPORT( FT_Error ) - ftc_family_init( FTC_Family family, - FTC_Query query, - FTC_Cache cache ); - - - /* can be used as a FTC_Family_DoneFunc; otherwise, must be called */ - /* by any family finalizer function */ - FT_EXPORT( void ) - ftc_family_done( FTC_Family family ); - - /*************************************************************************/ /*************************************************************************/ /***** *****/ @@ -168,64 +91,12 @@ FT_BEGIN_HEADER /*************************************************************************/ /*************************************************************************/ - /* each cache really implements a dynamic hash table to manage its nodes */ - typedef struct FTC_CacheRec_ - { - FTC_Manager manager; - FT_Memory memory; - FTC_Cache_Class clazz; - - FT_UInt cache_index; /* in manager's table */ - FT_Pointer cache_data; /* used by cache node methods */ - - FT_UFast p; - FT_UFast mask; - FT_Long slack; - FTC_Node* buckets; - - FT_LruList_ClassRec family_class; - FT_LruList families; - - } FTC_CacheRec; - - -#define FTC_CACHE( x ) ( (FTC_Cache)(x) ) -#define FTC_CACHE_P( x ) ( (FTC_Cache*)(x) ) - - - /* initialize a given cache */ - typedef FT_Error - (*FTC_Cache_InitFunc)( FTC_Cache cache ); - - /* clear a cache */ - typedef void - (*FTC_Cache_ClearFunc)( FTC_Cache cache ); - - /* finalize a given cache */ - typedef void - (*FTC_Cache_DoneFunc)( FTC_Cache cache ); - - - typedef FT_Error - (*FTC_Family_InitFunc)( FTC_Family family, - FTC_Query query, - FTC_Cache cache ); - - typedef FT_Int - (*FTC_Family_CompareFunc)( FTC_Family family, - FTC_Query query ); - - typedef void - (*FTC_Family_DoneFunc)( FTC_Family family, - FTC_Cache cache ); - /* initialize a new cache node */ typedef FT_Error - (*FTC_Node_InitFunc)( FTC_Node node, - FT_Pointer type, - FTC_Cache cache ); + (*FTC_Node_NewFunc)( FTC_Node *pnode, + FT_Pointer query, + FTC_Cache cache ); - /* compute the weight of a given cache node */ typedef FT_ULong (*FTC_Node_WeightFunc)( FTC_Node node, FTC_Cache cache ); @@ -236,62 +107,159 @@ FT_BEGIN_HEADER FT_Pointer key, FTC_Cache cache ); - /* finalize a given cache node */ + typedef void - (*FTC_Node_DoneFunc)( FTC_Node node, + (*FTC_Node_FreeFunc)( FTC_Node node, FTC_Cache cache ); + typedef FT_Error + (*FTC_Cache_InitFunc)( FTC_Cache cache ); - typedef struct FTC_Cache_ClassRec_ + typedef void + (*FTC_Cache_DoneFunc)( FTC_Cache cache ); + + + typedef struct FTC_CacheClassRec_ { - FT_UInt cache_size; - FTC_Cache_InitFunc cache_init; - FTC_Cache_ClearFunc cache_clear; - FTC_Cache_DoneFunc cache_done; + FTC_Node_NewFunc node_new; + FTC_Node_WeightFunc node_weight; + FTC_Node_CompareFunc node_compare; + FTC_Node_CompareFunc node_remove_faceid; + FTC_Node_FreeFunc node_free; - FT_UInt family_size; - FTC_Family_InitFunc family_init; - FTC_Family_CompareFunc family_compare; - FTC_Family_DoneFunc family_done; + FT_UInt cache_size; + FTC_Cache_InitFunc cache_init; + FTC_Cache_DoneFunc cache_done; - FT_UInt node_size; - FTC_Node_InitFunc node_init; - FTC_Node_WeightFunc node_weight; - FTC_Node_CompareFunc node_compare; - FTC_Node_DoneFunc node_done; - - } FTC_Cache_ClassRec; + } FTC_CacheClassRec; - /* */ + /* each cache really implements a dynamic hash table to manage its nodes */ + typedef struct FTC_CacheRec_ + { + FT_UFast p; + FT_UFast mask; + FT_Long slack; + FTC_Node* buckets; + + FTC_CacheClassRec clazz; /* local copy, for speed */ + + FTC_Manager manager; + FT_Memory memory; + FT_UInt index; /* in manager's table */ + + FTC_CacheClass org_class; /* original class pointer */ + + } FTC_CacheRec; - /*************************************************************************/ - /* */ - /* These functions are exported so that they can be called from */ - /* user-provided cache classes; otherwise, they are really part of the */ - /* cache sub-system internals. */ - /* */ +#define FTC_CACHE( x ) ( (FTC_Cache)(x) ) +#define FTC_CACHE_P( x ) ( (FTC_Cache*)(x) ) - /* can be used directly as FTC_Cache_DoneFunc(), or called by custom */ - /* cache finalizers */ - FT_EXPORT( void ) - ftc_cache_done( FTC_Cache cache ); - /* can be used directly as FTC_Cache_ClearFunc(), or called by custom */ - /* cache clear routines */ - FT_EXPORT( void ) - ftc_cache_clear( FTC_Cache cache ); - - /* initalize the hash table within the cache */ + /* default cache initialize */ FT_EXPORT( FT_Error ) - ftc_cache_init( FTC_Cache cache ); + FTC_Cache_Init( FTC_Cache cache ); - /* can be called when the key's hash value has been computed */ + /* default cache finalizer */ + FT_EXPORT( void ) + FTC_Cache_Done( FTC_Cache cache ); + + /* Call this function to lookup the cache. If no corresponding + * node is found, a new one is automatically created. This function + * is capable of flushing the cache adequately to make room for the + * new cache object. + */ FT_EXPORT( FT_Error ) - ftc_cache_lookup( FTC_Cache cache, - FTC_Query query, - FTC_Node *anode ); + FTC_Cache_Lookup( FTC_Cache cache, + FT_UInt32 hash, + FT_Pointer query, + FTC_Node *anode ); + + FT_EXPORT( FT_Error ) + FTC_Cache_NewNode( FTC_Cache cache, + FT_UInt32 hash, + FT_Pointer query, + FTC_Node *anode ); + + /* Remove all nodes that relate to a given face_id. This is useful + * when un-installing fonts. Note that if a cache node relates to + * the face_id, but is locked (i.e., has 'ref_count > 0'), the node + * will _not_ be destroyed, but its internal face_id reference will + * be modified. + * + * The final result will be that the node will never come back + * in further lookup requests, and will be flushed on demand from + * the cache normally when its reference count reaches 0. + */ + FT_EXPORT( void ) + FTC_Cache_RemoveFaceID( FTC_Cache cache, + FTC_FaceID face_id ); + + +#ifdef FTC_INLINE + +#define FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ) \ + FT_BEGIN_STMNT \ + FTC_Node *_bucket, *_pnode, _node; \ + FTC_Cache _cache = FTC_CACHE(cache); \ + FT_UInt32 _hash = (FT_UInt32)(hash); \ + FTC_Node_CompareFunc _nodcomp = (FTC_Node_CompareFunc)(nodecmp); \ + FT_UInt _idx; \ + \ + \ + error = 0; \ + node = NULL; \ + _idx = _hash & _cache->mask; \ + if ( _idx < _cache->p ) \ + _idx = _hash & ( _cache->mask*2 + 1 ); \ + \ + _bucket = _pnode = _cache->buckets + _idx; \ + for (;;) \ + { \ + _node = *_pnode; \ + if ( _node == NULL ) \ + goto _NewNode; \ + \ + if ( _node->hash == _hash && _nodcomp( _node, query, _cache ) ) \ + break; \ + \ + _pnode = &_node->link; \ + } \ + \ + if ( _node != *_bucket ) \ + { \ + *_pnode = _node->link; \ + _node->link = *_bucket; \ + *_bucket = _node; \ + } \ + \ + { \ + FTC_Manager _manager = _cache->manager; \ + \ + \ + if ( _node != _manager->nodes_list ) \ + FTC_MruNode_Up( (FTC_MruNode*)&_manager->nodes_list, \ + (FTC_MruNode)_node ); \ + } \ + goto _Ok; \ + \ + _NewNode: \ + error = FTC_Cache_NewNode( _cache, _hash, query, &_node ); \ + \ + _Ok: \ + *(FTC_Node*)&(node) = _node; \ + FT_END_STMNT + +#else /* !FTC_INLINE */ + +#define FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ) \ + FT_BEGIN_STMNT \ + error = FTC_Cache_Lookup( FTC_CACHE( cache ), hash, query, \ + (FTC_Node*)&(node) ); \ + FT_END_STMNT + +#endif /* !FTC_INLINE */ /* */ diff --git a/reactos/lib/freetype/include/freetype/cache/ftcglyph.h b/reactos/lib/freetype/include/freetype/cache/ftcglyph.h index 8a2f0f3a7e2..be237f934ad 100644 --- a/reactos/lib/freetype/include/freetype/cache/ftcglyph.h +++ b/reactos/lib/freetype/include/freetype/cache/ftcglyph.h @@ -4,7 +4,7 @@ /* */ /* FreeType abstract glyph cache (specification). */ /* */ -/* Copyright 2000-2001, 2003 by */ +/* Copyright 2000-2001, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -16,13 +16,84 @@ /***************************************************************************/ + /* + * + * FTC_GCache is an _abstract_ cache object optimized to store glyph + * data. It works as follows: + * + * - It manages FTC_GNode objects. Each one of them can hold one or more + * glyph `items'. Item types are not specified in the FTC_GCache but + * in classes that extend it. + * + * - Glyph attributes, like face ID, character size, render mode, etc., + * can be grouped into abstract `glyph families'. This avoids storing + * the attributes within the FTC_GCache, since it is likely that many + * FTC_GNodes will belong to the same family in typical uses. + * + * - Each FTC_GNode is thus an FTC_Node with two additional fields: + * + * * gindex: A glyph index, or the first index in a glyph range. + * * family: A pointer to a glyph `family'. + * + * - Family types are not fully specific in the FTC_Family type, but + * by classes that extend it. + * + * Note that both FTC_ImageCache and FTC_SBitCache extend FTC_GCache. + * They share an FTC_Family sub-class called FTC_BasicFamily which is + * used to store the following data: face ID, pixel/point sizes, load + * flags. For more details see the file `src/cache/ftcbasic.c'. + * + * Client applications can extend FTC_GNode with their own FTC_GNode + * and FTC_Family sub-classes to implement more complex caches (e.g., + * handling automatic synthesis, like obliquing & emboldening, colored + * glyphs, etc.). + * + * See also the FTC_ICache & FTC_SCache classes in `ftcimage.h' and + * `ftcsbits.h', which both extend FTC_GCache with additional + * optimizations. + * + * A typical FTC_GCache implementation must provide at least the + * following: + * + * - FTC_GNode sub-class, e.g. MyNode, with relevant methods: + * my_node_new (must call FTC_GNode_Init) + * my_node_free (must call FTC_GNode_Done) + * my_node_compare (must call FTC_GNode_Compare) + * my_node_remove_faceid (must call ftc_gnode_unselect in case + * of match) + * + * - FTC_Family sub-class, e.g. MyFamily, with relevant methods: + * my_family_compare + * my_family_init + * my_family_reset (optional) + * my_family_done + * + * - FTC_GQuery sub-class, e.g. MyQuery, to hold cache-specific query + * data. + * + * - Constant structures for a FTC_GNodeClass. + * + * - MyCacheNew() can be implemented easily as a call to the convenience + * function FTC_GCache_New. + * + * - MyCacheLookup with a call to FTC_GCache_Lookup. This function will + * automatically: + * + * - Search for the corresponding family in the cache, or create + * a new one if necessary. Put it in FTC_GQUERY(myquery).family + * + * - Call FTC_Cache_Lookup. + * + * If it returns NULL, you should create a new node, then call + * ftc_cache_add as usual. + */ + + /*************************************************************************/ /* */ /* Important: The functions defined in this file are only used to */ /* implement an abstract glyph cache class. You need to */ /* provide additional logic to implement a complete cache. */ - /* For example, see `ftcimage.h' and `ftcimage.c' which */ - /* implement a FT_Glyph cache based on this code. */ /* */ /*************************************************************************/ @@ -47,99 +118,53 @@ #include -#include FT_CACHE_H -#include FT_CACHE_MANAGER_H - -#include +#include FT_CACHE_INTERNAL_MANAGER_H FT_BEGIN_HEADER - /* each glyph set is characterized by a "glyph set type" which must be */ - /* defined by sub-classes */ - typedef struct FTC_GlyphFamilyRec_* FTC_GlyphFamily; + /* + * We can group glyphs into `families'. Each family correspond to a + * given face ID, character size, transform, etc. + * + * Families are implemented as MRU list nodes. They are + * reference-counted. + */ - /* handle to a glyph cache node */ - typedef struct FTC_GlyphNodeRec_* FTC_GlyphNode; - - - /* size should be 24 + chunk size on 32-bit machines; */ - /* note that the node's hash is ((gfam->hash << 16) | glyph_index) -- */ - /* this _must_ be set properly by the glyph node initializer */ - /* */ - typedef struct FTC_GlyphNodeRec_ + typedef struct FTC_FamilyRec_ { - FTC_NodeRec node; - FT_UShort item_count; - FT_UShort item_start; + FTC_MruNodeRec mrunode; + FT_UInt num_nodes; /* current number of nodes in this family */ + FTC_Cache cache; + FTC_MruListClass clazz; - } FTC_GlyphNodeRec; + } FTC_FamilyRec, *FTC_Family; + +#define FTC_FAMILY(x) ( (FTC_Family)(x) ) +#define FTC_FAMILY_P(x) ( (FTC_Family*)(x) ) -#define FTC_GLYPH_NODE( x ) ( (FTC_GlyphNode)(x) ) -#define FTC_GLYPH_NODE_P( x ) ( (FTC_GlyphNode*)(x) ) - - - typedef struct FTC_GlyphQueryRec_ + typedef struct FTC_GNodeRec_ { - FTC_QueryRec query; - FT_UInt gindex; + FTC_NodeRec node; + FTC_Family family; + FT_UInt gindex; - } FTC_GlyphQueryRec, *FTC_GlyphQuery; + } FTC_GNodeRec, *FTC_GNode; + +#define FTC_GNODE( x ) ( (FTC_GNode)(x) ) +#define FTC_GNODE_P( x ) ( (FTC_GNode*)(x) ) -#define FTC_GLYPH_QUERY( x ) ( (FTC_GlyphQuery)(x) ) - - - /* a glyph set is used to categorize glyphs of a given type */ - typedef struct FTC_GlyphFamilyRec_ + typedef struct FTC_GQueryRec_ { - FTC_FamilyRec family; - FT_UInt32 hash; - FT_UInt item_total; /* total number of glyphs in family */ - FT_UInt item_count; /* number of glyph items per node */ + FT_UInt gindex; + FTC_Family family; - } FTC_GlyphFamilyRec; + } FTC_GQueryRec, *FTC_GQuery; - -#define FTC_GLYPH_FAMILY( x ) ( (FTC_GlyphFamily)(x) ) -#define FTC_GLYPH_FAMILY_P( x ) ( (FTC_GlyphFamily*)(x) ) - -#define FTC_GLYPH_FAMILY_MEMORY( x ) FTC_FAMILY(x)->cache->memory - - - /* each glyph node contains a 'chunk' of glyph items; */ - /* translate a glyph index into a chunk index */ -#define FTC_GLYPH_FAMILY_CHUNK( gfam, gindex ) \ - ( ( gindex ) / FTC_GLYPH_FAMILY( gfam )->item_count ) - - /* find a glyph index's chunk, and return its start index */ -#define FTC_GLYPH_FAMILY_START( gfam, gindex ) \ - ( FTC_GLYPH_FAMILY_CHUNK( gfam, gindex ) * \ - FTC_GLYPH_FAMILY( gfam )->item_count ) - - /* compute a glyph request's hash value */ -#define FTC_GLYPH_FAMILY_HASH( gfam, gindex ) \ - ( (FT_UFast)( \ - ( FTC_GLYPH_FAMILY( gfam )->hash << 16 ) | \ - ( FTC_GLYPH_FAMILY_CHUNK( gfam, gindex ) & 0xFFFFU ) ) ) - - /* must be called in an FTC_Family_CompareFunc to update the query */ - /* whenever a glyph set is matched in the lookup, or when it */ - /* is created */ -#define FTC_GLYPH_FAMILY_FOUND( gfam, gquery ) \ - do \ - { \ - FTC_QUERY( gquery )->family = FTC_FAMILY( gfam ); \ - FTC_QUERY( gquery )->hash = \ - FTC_GLYPH_FAMILY_HASH( gfam, \ - FTC_GLYPH_QUERY( gquery )->gindex ); \ - } while ( 0 ) - - /* retrieve glyph index of glyph node */ -#define FTC_GLYPH_NODE_GINDEX( x ) \ - ( (FT_UInt)( FTC_GLYPH_NODE( x )->node.hash & 0xFFFFU ) ) +#define FTC_GQUERY( x ) ( (FTC_GQuery)(x) ) /*************************************************************************/ @@ -151,39 +176,116 @@ FT_BEGIN_HEADER /* must be called by derived FTC_Node_InitFunc routines */ FT_EXPORT( void ) - ftc_glyph_node_init( FTC_GlyphNode node, - FT_UInt gindex, /* glyph index for node */ - FTC_GlyphFamily gfam ); + FTC_GNode_Init( FTC_GNode node, + FT_UInt gindex, /* glyph index for node */ + FTC_Family family ); /* returns TRUE iff the query's glyph index correspond to the node; */ /* this assumes that the "family" and "hash" fields of the query are */ /* already correctly set */ FT_EXPORT( FT_Bool ) - ftc_glyph_node_compare( FTC_GlyphNode gnode, - FTC_GlyphQuery gquery ); + FTC_GNode_Compare( FTC_GNode gnode, + FTC_GQuery gquery ); + + /* call this function to clear a node's family -- this is necessary */ + /* to implement the `node_remove_faceid' cache method correctly */ + FT_EXPORT( void ) + FTC_GNode_UnselectFamily( FTC_GNode gnode, + FTC_Cache cache ); /* must be called by derived FTC_Node_DoneFunc routines */ FT_EXPORT( void ) - ftc_glyph_node_done( FTC_GlyphNode node, - FTC_Cache cache ); + FTC_GNode_Done( FTC_GNode node, + FTC_Cache cache ); - /* must be called by derived FTC_Family_InitFunc; */ - /* calls "ftc_family_init" */ - FT_EXPORT( FT_Error ) - ftc_glyph_family_init( FTC_GlyphFamily gfam, - FT_UInt32 hash, - FT_UInt item_count, - FT_UInt item_total, - FTC_GlyphQuery gquery, - FTC_Cache cache ); - FT_EXPORT( void ) - ftc_glyph_family_done( FTC_GlyphFamily gfam ); + FTC_Family_Init( FTC_Family family, + FTC_Cache cache ); + + typedef struct FTC_GCacheRec_ + { + FTC_CacheRec cache; + FTC_MruListRec families; + + } FTC_GCacheRec, *FTC_GCache; + +#define FTC_GCACHE( x ) ((FTC_GCache)(x)) + /* can be used as @FTC_Cache_InitFunc */ + FT_EXPORT( FT_Error ) + FTC_GCache_Init( FTC_GCache cache ); + + + /* can be used as @FTC_Cache_DoneFunc */ + FT_EXPORT( void ) + FTC_GCache_Done( FTC_GCache cache ); + + + /* the glyph cache class adds fields for the family implementation */ + typedef struct FTC_GCacheClassRec_ + { + FTC_CacheClassRec clazz; + FTC_MruListClass family_class; + + } FTC_GCacheClassRec; + + typedef const FTC_GCacheClassRec* FTC_GCacheClass; + +#define FTC_GCACHE_CLASS( x ) ((FTC_GCacheClass)(x)) + +#define FTC_CACHE__GCACHE_CLASS( x ) \ + FTC_GCACHE_CLASS( FTC_CACHE(x)->org_class ) +#define FTC_CACHE__FAMILY_CLASS( x ) \ + ((FTC_MruListClass) FTC_CACHE__GCACHE_CLASS(x)->family_class) + + + /* convenience function; use it instead of FTC_Manager_Register_Cache */ + FT_EXPORT( FT_Error ) + FTC_GCache_New( FTC_Manager manager, + FTC_GCacheClass clazz, + FTC_GCache *acache ); + + FT_EXPORT( FT_Error ) + FTC_GCache_Lookup( FTC_GCache cache, + FT_UInt32 hash, + FT_UInt gindex, + FTC_GQuery query, + FTC_Node *anode ); + + +#ifdef FTC_INLINE + +#define FTC_GCACHE_LOOKUP_CMP( cache, famcmp, nodecmp, hash, \ + gindex, query, node, error ) \ + FT_BEGIN_STMNT \ + FTC_GCache _gcache = FTC_GCACHE( cache ); \ + FTC_GQuery _gquery = (FTC_GQuery)( query ); \ + FTC_MruNode_CompareFunc _fcompare = (FTC_MruNode_CompareFunc)(famcmp); \ + \ + \ + _gquery->gindex = (gindex); \ + \ + FTC_MRULIST_LOOKUP_CMP( &_gcache->families, _gquery, _fcompare, \ + _gquery->family, error ); \ + if ( !error ) \ + FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ); \ + FT_END_STMNT /* */ - + +#else /* !FTC_INLINE */ + +#define FTC_GCACHE_LOOKUP_CMP( cache, famcmp, nodecmp, hash, \ + gindex, query, node, error ) \ + FT_BEGIN_STMNT \ + error = FTC_GCache_Lookup( FTC_GCACHE( cache ), hash, gindex, \ + FTC_GQUERY( query ), (FTC_Node*)&(node) ); \ + FT_END_STMNT + +#endif /* !FTC_INLINE */ + + FT_END_HEADER diff --git a/reactos/lib/freetype/include/freetype/cache/ftcimage.h b/reactos/lib/freetype/include/freetype/cache/ftcimage.h index 2d0b780e173..1bf12db13db 100644 --- a/reactos/lib/freetype/include/freetype/cache/ftcimage.h +++ b/reactos/lib/freetype/include/freetype/cache/ftcimage.h @@ -2,7 +2,7 @@ /* */ /* ftcimage.h */ /* */ -/* FreeType Image cache (specification). */ +/* FreeType Generic Image cache (specification) */ /* */ /* Copyright 2000-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ @@ -16,6 +16,15 @@ /***************************************************************************/ + /* + * FTC_ICache is an _abstract_ cache used to store a single FT_Glyph + * image per cache node. + * + * FTC_ICache extends FTC_GCache. For an implementation example, + * see FTC_ImageCache in `src/cache/ftbasic.c'. + */ + + /*************************************************************************/ /* */ /* Each image cache really manages FT_Glyph objects. */ @@ -29,284 +38,66 @@ #include #include FT_CACHE_H - +#include FT_CACHE_INTERNAL_GLYPH_H FT_BEGIN_HEADER - /*************************************************************************/ - /* */ - /*
*/ - /* cache_subsystem */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** IMAGE CACHE OBJECT *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /************************************************************************** - * - * @struct: - * FTC_ImageTypeRec - * - * @description: - * A simple structure used to describe the type of glyph image to be - * loaded into the cache. - * - * @fields: - * font :: An @FTC_FontRec used to describe the glyph's face and size. - * - * flags :: The load flags to be applied when loading the glyph; see - * the @FT_LOAD_XXX constants for details. - * - * @note: - * This type completely replaces the @FTC_Image_Desc structure which is - * now obsolete. - */ - typedef struct FTC_ImageTypeRec_ + /* the FT_Glyph image node type - we store only 1 glyph per node */ + typedef struct FTC_INodeRec_ { - FTC_FontRec font; - FT_Int32 flags; + FTC_GNodeRec gnode; + FT_Glyph glyph; - } FTC_ImageTypeRec; + } FTC_INodeRec, *FTC_INode; - typedef struct FTC_ImageTypeRec_* FTC_ImageType; +#define FTC_INODE( x ) ( (FTC_INode)( x ) ) +#define FTC_INODE_GINDEX( x ) FTC_GNODE(x)->gindex +#define FTC_INODE_FAMILY( x ) FTC_GNODE(x)->family - /* */ + typedef FT_Error + (*FTC_IFamily_LoadGlyphFunc)( FTC_Family family, + FT_UInt gindex, + FTC_Cache cache, + FT_Glyph *aglyph ); -#define FTC_IMAGE_TYPE_COMPARE( d1, d2 ) \ - ( FTC_FONT_COMPARE( &(d1)->font, &(d2)->font ) && \ - (d1)->flags == (d2)->flags ) - -#define FTC_IMAGE_TYPE_HASH( d ) \ - (FT_UFast)( FTC_FONT_HASH( &(d)->font ) ^ \ - ( (d)->flags << 4 ) ) - - - /*************************************************************************/ - /* */ - /* */ - /* FTC_ImageCache */ - /* */ - /* */ - /* A handle to an glyph image cache object. They are designed to */ - /* hold many distinct glyph images while not exceeding a certain */ - /* memory threshold. */ - /* */ - typedef struct FTC_ImageCacheRec_* FTC_ImageCache; - - - /*************************************************************************/ - /* */ - /* */ - /* FTC_ImageCache_New */ - /* */ - /* */ - /* Creates a new glyph image cache. */ - /* */ - /* */ - /* manager :: The parent manager for the image cache. */ - /* */ - /* */ - /* acache :: A handle to the new glyph image cache object. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - FT_EXPORT( FT_Error ) - FTC_ImageCache_New( FTC_Manager manager, - FTC_ImageCache *acache ); - - - /*************************************************************************/ - /* */ - /* */ - /* FTC_ImageCache_Lookup */ - /* */ - /* */ - /* Retrieves a given glyph image from a glyph image cache. */ - /* */ - /* */ - /* cache :: A handle to the source glyph image cache. */ - /* */ - /* type :: A pointer to a glyph image type descriptor. */ - /* */ - /* gindex :: The glyph index to retrieve. */ - /* */ - /* */ - /* aglyph :: The corresponding @FT_Glyph object. 0 in case of */ - /* failure. */ - /* */ - /* anode :: Used to return the address of of the corresponding cache */ - /* node after incrementing its reference count (see note */ - /* below). */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - /* */ - /* The returned glyph is owned and managed by the glyph image cache. */ - /* Never try to transform or discard it manually! You can however */ - /* create a copy with @FT_Glyph_Copy and modify the new one. */ - /* */ - /* If "anode" is _not_ NULL, it receives the address of the cache */ - /* node containing the glyph image, after increasing its reference */ - /* count. This ensures that the node (as well as the FT_Glyph) will */ - /* always be kept in the cache until you call @FTC_Node_Unref to */ - /* "release" it. */ - /* */ - /* If "anode" is NULL, the cache node is left unchanged, which means */ - /* that the FT_Glyph could be flushed out of the cache on the next */ - /* call to one of the caching sub-system APIs. Don't assume that it */ - /* is persistent! */ - /* */ - FT_EXPORT( FT_Error ) - FTC_ImageCache_Lookup( FTC_ImageCache cache, - FTC_ImageType type, - FT_UInt gindex, - FT_Glyph *aglyph, - FTC_Node *anode ); - - /* */ - -#define ftc_image_format( x ) ( (x) & 7 ) - - -#define ftc_image_format_bitmap 0x0000 -#define ftc_image_format_outline 0x0001 - -#define ftc_image_format_mask 0x000F - -#define ftc_image_flag_monochrome 0x0010 -#define ftc_image_flag_unhinted 0x0020 -#define ftc_image_flag_autohinted 0x0040 -#define ftc_image_flag_unscaled 0x0080 -#define ftc_image_flag_no_sbits 0x0100 - - /* monochrome bitmap */ -#define ftc_image_mono ftc_image_format_bitmap | \ - ftc_image_flag_monochrome - - /* anti-aliased bitmap */ -#define ftc_image_grays ftc_image_format_bitmap - - /* scaled outline */ -#define ftc_image_outline ftc_image_format_outline - - - /*************************************************************************/ - /* */ - /* */ - /* FTC_Image_Desc */ - /* */ - /* */ - /* THIS TYPE IS DEPRECATED. Use @FTC_ImageTypeRec instead. */ - /* */ - /* A simple structure used to describe a given glyph image category. */ - /* */ - /* */ - /* font :: An @FTC_FontRec used to describe the glyph's face */ - /* and size. */ - /* */ - /* image_type :: The glyph image's type. */ - /* */ - typedef struct FTC_Image_Desc_ + typedef struct FTC_IFamilyClassRec_ { - FTC_FontRec font; - FT_UInt image_type; + FTC_MruListClassRec clazz; + FTC_IFamily_LoadGlyphFunc family_load_glyph; - } FTC_Image_Desc; + } FTC_IFamilyClassRec; + + typedef const FTC_IFamilyClassRec* FTC_IFamilyClass; + +#define FTC_IFAMILY_CLASS( x ) ((FTC_IFamilyClass)(x)) + +#define FTC_CACHE__IFAMILY_CLASS( x ) \ + FTC_IFAMILY_CLASS( FTC_CACHE__GCACHE_CLASS(x)->family_class ) - /*************************************************************************/ - /* */ - /* */ - /* FTC_Image_Cache */ - /* */ - /* */ - /* THIS TYPE IS DEPRECATED. Use @FTC_ImageCache instead. */ - /* */ - typedef FTC_ImageCache FTC_Image_Cache; + /* can be used as a @FTC_Node_FreeFunc */ + FT_EXPORT( void ) + FTC_INode_Free( FTC_INode inode, + FTC_Cache cache ); - - /*************************************************************************/ - /* */ - /* */ - /* FTC_Image_Cache_New */ - /* */ - /* */ - /* THIS FUNCTION IS DEPRECATED. Use @FTC_ImageCache_New instead. */ - /* */ - /* Creates a new glyph image cache. */ - /* */ - /* */ - /* manager :: The parent manager for the image cache. */ - /* */ - /* */ - /* acache :: A handle to the new glyph image cache object. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ + /* Can be used as @FTC_Node_NewFunc. `gquery.index' and `gquery.family' + * must be set correctly. This function will call the `family_load_glyph' + * method to load the FT_Glyph into the cache node. + */ FT_EXPORT( FT_Error ) - FTC_Image_Cache_New( FTC_Manager manager, - FTC_Image_Cache *acache ); + FTC_INode_New( FTC_INode *pinode, + FTC_GQuery gquery, + FTC_Cache cache ); - - /*************************************************************************/ - /* */ - /* */ - /* FTC_Image_Cache_Lookup */ - /* */ - /* */ - /* THIS FUNCTION IS DEPRECATED. Use @FTC_ImageCache_Lookup instead. */ - /* */ - /* */ - /* cache :: A handle to the source glyph image cache. */ - /* */ - /* desc :: A pointer to a glyph image descriptor. */ - /* */ - /* gindex :: The glyph index to retrieve. */ - /* */ - /* */ - /* aglyph :: The corresponding @FT_Glyph object. 0 in case of */ - /* failure. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - /* */ - /* The returned glyph is owned and managed by the glyph image cache. */ - /* Never try to transform or discard it manually! You can however */ - /* create a copy with @FT_Glyph_Copy and modify the new one. */ - /* */ - /* Because the glyph image cache limits the total amount of memory */ - /* taken by the glyphs it holds, the returned glyph might disappear */ - /* on a later invocation of this function! It is a cache after */ - /* all... */ - /* */ - /* Use this function to "lock" the glyph as long as it is needed. */ - /* */ - FT_EXPORT( FT_Error ) - FTC_Image_Cache_Lookup( FTC_Image_Cache cache, - FTC_Image_Desc* desc, - FT_UInt gindex, - FT_Glyph *aglyph ); + /* can be used as @FTC_Node_WeightFunc */ + FT_EXPORT( FT_ULong ) + FTC_INode_Weight( FTC_INode inode ); /* */ FT_END_HEADER - #endif /* __FTCIMAGE_H__ */ diff --git a/reactos/lib/freetype/include/freetype/cache/ftcmanag.h b/reactos/lib/freetype/include/freetype/cache/ftcmanag.h index 97c77591b8d..52658482286 100644 --- a/reactos/lib/freetype/include/freetype/cache/ftcmanag.h +++ b/reactos/lib/freetype/include/freetype/cache/ftcmanag.h @@ -4,7 +4,7 @@ /* */ /* FreeType Cache Manager (specification). */ /* */ -/* Copyright 2000-2001 by */ +/* Copyright 2000-2001, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -65,7 +65,7 @@ #include #include FT_CACHE_H -#include FT_CACHE_INTERNAL_LRU_H +#include FT_CACHE_INTERNAL_MRU_H #include FT_CACHE_INTERNAL_CACHE_H @@ -88,91 +88,25 @@ FT_BEGIN_HEADER #define FTC_MAX_CACHES 16 - typedef struct FTC_FamilyEntryRec_ - { - FTC_Family family; - FTC_Cache cache; - FT_UInt index; - FT_UInt link; - - } FTC_FamilyEntryRec, *FTC_FamilyEntry; - - -#define FTC_FAMILY_ENTRY_NONE ( (FT_UInt)-1 ) - - - typedef struct FTC_FamilyTableRec_ - { - FT_UInt count; - FT_UInt size; - FTC_FamilyEntry entries; - FT_UInt free; - - } FTC_FamilyTableRec, *FTC_FamilyTable; - - - FT_EXPORT( FT_Error ) - ftc_family_table_alloc( FTC_FamilyTable table, - FT_Memory memory, - FTC_FamilyEntry *aentry ); - - FT_EXPORT( void ) - ftc_family_table_free( FTC_FamilyTable table, - FT_UInt idx ); - - - /*************************************************************************/ - /* */ - /* */ - /* FTC_ManagerRec */ - /* */ - /* */ - /* The cache manager structure. */ - /* */ - /* */ - /* library :: A handle to a FreeType library instance. */ - /* */ - /* faces_list :: The lru list of @FT_Face objects in the cache. */ - /* */ - /* sizes_list :: The lru list of @FT_Size objects in the cache. */ - /* */ - /* max_weight :: The maximum cache pool weight. */ - /* */ - /* cur_weight :: The current cache pool weight. */ - /* */ - /* num_nodes :: The current number of nodes in the manager. */ - /* */ - /* nodes_list :: The global lru list of all cache nodes. */ - /* */ - /* caches :: A table of installed/registered cache objects. */ - /* */ - /* request_data :: User-provided data passed to the requester. */ - /* */ - /* request_face :: User-provided function used to implement a mapping */ - /* between abstract @FTC_FaceID values and real */ - /* @FT_Face objects. */ - /* */ - /* families :: Global table of families. */ - /* */ typedef struct FTC_ManagerRec_ { FT_Library library; - FT_LruList faces_list; - FT_LruList sizes_list; + FT_Memory memory; + FTC_Node nodes_list; FT_ULong max_weight; FT_ULong cur_weight; - FT_UInt num_nodes; - FTC_Node nodes_list; - + FTC_Cache caches[FTC_MAX_CACHES]; + FT_UInt num_caches; + + FTC_MruListRec faces; + FTC_MruListRec sizes; FT_Pointer request_data; FTC_Face_Requester request_face; - FTC_FamilyTableRec families; - } FTC_ManagerRec; @@ -201,43 +135,40 @@ FT_BEGIN_HEADER FTC_Manager_Compress( FTC_Manager manager ); + /* try to flush `count' old nodes from the cache; return the number + * of really flushed nodes + */ + FT_EXPORT( FT_UInt ) + FTC_Manager_FlushN( FTC_Manager manager, + FT_UInt count ); + + /* this must be used internally for the moment */ FT_EXPORT( FT_Error ) - FTC_Manager_Register_Cache( FTC_Manager manager, - FTC_Cache_Class clazz, - FTC_Cache *acache ); + FTC_Manager_RegisterCache( FTC_Manager manager, + FTC_CacheClass clazz, + FTC_Cache *acache ); + /* */ - /* can be called to increment a node's reference count */ - FT_EXPORT( void ) - FTC_Node_Ref( FTC_Node node, - FTC_Manager manager ); +#define FTC_SCALER_COMPARE( a, b ) \ + ( (a)->face_id == (b)->face_id && \ + (a)->width == (b)->width && \ + (a)->height == (b)->height && \ + ((a)->pixel != 0) == ((b)->pixel != 0) && \ + ( (a)->pixel || \ + ( (a)->x_res == (b)->x_res && \ + (a)->y_res == (b)->y_res ) ) ) - - /*************************************************************************/ - /* */ - /* */ - /* FTC_Node_Unref */ - /* */ - /* */ - /* Decrement a cache node's internal reference count. When the count */ - /* reaches 0, it is not destroyed but becomes eligible for subsequent */ - /* cache flushes. */ - /* */ - /* */ - /* node :: The cache node handle. */ - /* */ - /* manager :: The cache manager handle. */ - /* */ - FT_EXPORT( void ) - FTC_Node_Unref( FTC_Node node, - FTC_Manager manager ); +#define FTC_SCALER_HASH( q ) \ + ( FTC_FACE_ID_HASH( (q)->face_id ) + \ + (q)->width + (q)->height*7 + \ + ( (q)->pixel ? 0 : ( (q)->x_res*33 ^ (q)->y_res*61 ) ) ) /* */ FT_END_HEADER - #endif /* __FTCMANAG_H__ */ diff --git a/reactos/lib/freetype/include/freetype/cache/ftcmru.h b/reactos/lib/freetype/include/freetype/cache/ftcmru.h new file mode 100644 index 00000000000..9556f58e75e --- /dev/null +++ b/reactos/lib/freetype/include/freetype/cache/ftcmru.h @@ -0,0 +1,246 @@ +/***************************************************************************/ +/* */ +/* ftcmru.h */ +/* */ +/* Simple MRU list-cache (specification). */ +/* */ +/* Copyright 2000-2001, 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* An MRU is a list that cannot hold more than a certain number of */ + /* elements (`max_elements'). All elements in the list are sorted in */ + /* least-recently-used order, i.e., the `oldest' element is at the tail */ + /* of the list. */ + /* */ + /* When doing a lookup (either through `Lookup()' or `Lookup_Node()'), */ + /* the list is searched for an element with the corresponding key. If */ + /* it is found, the element is moved to the head of the list and is */ + /* returned. */ + /* */ + /* If no corresponding element is found, the lookup routine will try to */ + /* obtain a new element with the relevant key. If the list is already */ + /* full, the oldest element from the list is discarded and replaced by a */ + /* new one; a new element is added to the list otherwise. */ + /* */ + /* Note that it is possible to pre-allocate the element list nodes. */ + /* This is handy if `max_elements' is sufficiently small, as it saves */ + /* allocations/releases during the lookup process. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTCMRU_H__ +#define __FTCMRU_H__ + + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + +#define xxFT_DEBUG_ERROR +#define FTC_INLINE + +FT_BEGIN_HEADER + + typedef struct FTC_MruNodeRec_* FTC_MruNode; + + typedef struct FTC_MruNodeRec_ + { + FTC_MruNode next; + FTC_MruNode prev; + + } FTC_MruNodeRec; + + + FT_EXPORT( void ) + FTC_MruNode_Prepend( FTC_MruNode *plist, + FTC_MruNode node ); + + FT_EXPORT( void ) + FTC_MruNode_Up( FTC_MruNode *plist, + FTC_MruNode node ); + + FT_EXPORT( void ) + FTC_MruNode_Remove( FTC_MruNode *plist, + FTC_MruNode node ); + + + typedef struct FTC_MruListRec_* FTC_MruList; + + typedef struct FTC_MruListClassRec_ const * FTC_MruListClass; + + + typedef FT_Int + (*FTC_MruNode_CompareFunc)( FTC_MruNode node, + FT_Pointer key ); + + typedef FT_Error + (*FTC_MruNode_InitFunc)( FTC_MruNode node, + FT_Pointer key, + FT_Pointer data ); + + typedef FT_Error + (*FTC_MruNode_ResetFunc)( FTC_MruNode node, + FT_Pointer key, + FT_Pointer data ); + + typedef void + (*FTC_MruNode_DoneFunc)( FTC_MruNode node, + FT_Pointer data ); + + + typedef struct FTC_MruListClassRec_ + { + FT_UInt node_size; + FTC_MruNode_CompareFunc node_compare; + FTC_MruNode_InitFunc node_init; + FTC_MruNode_ResetFunc node_reset; + FTC_MruNode_DoneFunc node_done; + + } FTC_MruListClassRec; + + typedef struct FTC_MruListRec_ + { + FT_UInt num_nodes; + FT_UInt max_nodes; + FTC_MruNode nodes; + FT_Pointer data; + FTC_MruListClassRec clazz; + FT_Memory memory; + + } FTC_MruListRec; + + + FT_EXPORT( void ) + FTC_MruList_Init( FTC_MruList list, + FTC_MruListClass clazz, + FT_UInt max_nodes, + FT_Pointer data, + FT_Memory memory ); + + FT_EXPORT( void ) + FTC_MruList_Reset( FTC_MruList list ); + + + FT_EXPORT( void ) + FTC_MruList_Done( FTC_MruList list ); + + FT_EXPORT( FTC_MruNode ) + FTC_MruList_Find( FTC_MruList list, + FT_Pointer key ); + + FT_EXPORT( FT_Error ) + FTC_MruList_New( FTC_MruList list, + FT_Pointer key, + FTC_MruNode *anode ); + + FT_EXPORT( FT_Error ) + FTC_MruList_Lookup( FTC_MruList list, + FT_Pointer key, + FTC_MruNode *pnode ); + + + FT_EXPORT( void ) + FTC_MruList_Remove( FTC_MruList list, + FTC_MruNode node ); + + FT_EXPORT( void ) + FTC_MruList_RemoveSelection( FTC_MruList list, + FTC_MruNode_CompareFunc selection, + FT_Pointer key ); + + +#ifdef FTC_INLINE + +#define FTC_MRULIST_LOOKUP_CMP( list, key, compare, node, error ) \ + FT_BEGIN_STMNT \ + FTC_MruNode* _pfirst = &(list)->nodes; \ + FTC_MruNode_CompareFunc _compare = (FTC_MruNode_CompareFunc)(compare); \ + FTC_MruNode _first, _node; \ + \ + \ + error = 0; \ + _first = *(_pfirst); \ + _node = NULL; \ + \ + if ( _first ) \ + { \ + _node = _first; \ + do \ + { \ + if ( _compare( _node, (key) ) ) \ + { \ + if ( _node != _first ) \ + FTC_MruNode_Up( _pfirst, _node ); \ + \ + *(FTC_MruNode*)&(node) = _node; \ + goto _MruOk; \ + } \ + _node = _node->next; \ + \ + } while ( _node != _first) ; \ + } \ + \ + error = FTC_MruList_New( (list), (key), (FTC_MruNode*)&(node) ); \ + _MruOk: \ + ; \ + FT_END_STMNT + +#define FTC_MRULIST_LOOKUP( list, key, node, error ) \ + FTC_MRULIST_LOOKUP_CMP( list, key, (list)->clazz.node_compare, node, error ) + +#else /* !FTC_INLINE */ + +#define FTC_MRULIST_LOOKUP( list, key, node, error ) \ + error = FTC_MruList_Lookup( (list), (key), (FTC_MruNode*)&(node) ) + +#endif /* !FTC_INLINE */ + + +#define FTC_MRULIST_LOOP( list, node ) \ + FT_BEGIN_STMNT \ + FTC_MruNode _first = (list)->nodes; \ + \ + \ + if ( _first ) \ + { \ + FTC_MruNode _node = _first; \ + \ + \ + do \ + { \ + *(FTC_MruNode*)&(node) = _node; + + +#define FTC_MRULIST_LOOP_END() \ + _node = _node->next; \ + \ + } while ( _node != _first ); \ + } \ + FT_END_STMNT + + /* */ + +FT_END_HEADER + + +#endif /* __FTCMRU_H__ */ + + +/* END */ diff --git a/reactos/lib/freetype/include/freetype/cache/ftcsbits.h b/reactos/lib/freetype/include/freetype/cache/ftcsbits.h index 6f8ef99cf78..b2ef0f1818d 100644 --- a/reactos/lib/freetype/include/freetype/cache/ftcsbits.h +++ b/reactos/lib/freetype/include/freetype/cache/ftcsbits.h @@ -4,7 +4,7 @@ /* */ /* A small-bitmap cache (specification). */ /* */ -/* Copyright 2000-2001, 2002 by */ +/* Copyright 2000-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -22,251 +22,72 @@ #include #include FT_CACHE_H -#include FT_CACHE_IMAGE_H +#include FT_CACHE_INTERNAL_GLYPH_H FT_BEGIN_HEADER +#define FTC_SBIT_ITEMS_PER_NODE 16 - /*************************************************************************/ - /* */ - /*
*/ - /* cache_subsystem */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /* */ - /* */ - /* FTC_SBit */ - /* */ - /* */ - /* A handle to a small bitmap descriptor. See the @FTC_SBitRec */ - /* structure for details. */ - /* */ - typedef struct FTC_SBitRec_* FTC_SBit; - - - /*************************************************************************/ - /* */ - /* */ - /* FTC_SBitRec */ - /* */ - /* */ - /* A very compact structure used to describe a small glyph bitmap. */ - /* */ - /* */ - /* width :: The bitmap width in pixels. */ - /* */ - /* height :: The bitmap height in pixels. */ - /* */ - /* left :: The horizontal distance from the pen position to the */ - /* left bitmap border (a.k.a. `left side bearing', or */ - /* `lsb'). */ - /* */ - /* top :: The vertical distance from the pen position (on the */ - /* baseline) to the upper bitmap border (a.k.a. `top */ - /* side bearing'). The distance is positive for upwards */ - /* Y coordinates. */ - /* */ - /* format :: The format of the glyph bitmap (monochrome or gray). */ - /* */ - /* max_grays :: Maximum gray level value (in the range 1 to 255). */ - /* */ - /* pitch :: The number of bytes per bitmap line. May be positive */ - /* or negative. */ - /* */ - /* xadvance :: The horizontal advance width in pixels. */ - /* */ - /* yadvance :: The vertical advance height in pixels. */ - /* */ - /* buffer :: A pointer to the bitmap pixels. */ - /* */ - typedef struct FTC_SBitRec_ + typedef struct FTC_SNodeRec_ { - FT_Byte width; - FT_Byte height; - FT_Char left; - FT_Char top; + FTC_GNodeRec gnode; + FT_UInt count; + FTC_SBitRec sbits[FTC_SBIT_ITEMS_PER_NODE]; - FT_Byte format; - FT_Byte max_grays; - FT_Short pitch; - FT_Char xadvance; - FT_Char yadvance; - - FT_Byte* buffer; - - } FTC_SBitRec; + } FTC_SNodeRec, *FTC_SNode; - /*************************************************************************/ - /* */ - /* */ - /* FTC_SBitCache */ - /* */ - /* */ - /* A handle to a small bitmap cache. These are special cache objects */ - /* used to store small glyph bitmaps (and anti-aliased pixmaps) in a */ - /* much more efficient way than the traditional glyph image cache */ - /* implemented by @FTC_ImageCache. */ - /* */ - typedef struct FTC_SBitCacheRec_* FTC_SBitCache; +#define FTC_SNODE( x ) ( (FTC_SNode)( x ) ) +#define FTC_SNODE_GINDEX( x ) FTC_GNODE( x )->gindex +#define FTC_SNODE_FAMILY( x ) FTC_GNODE( x )->family + + typedef FT_UInt + (*FTC_SFamily_GetCountFunc)( FTC_Family family, + FTC_Manager manager ); + + typedef FT_Error + (*FTC_SFamily_LoadGlyphFunc)( FTC_Family family, + FT_UInt gindex, + FTC_Manager manager, + FT_Face *aface ); + + typedef struct FTC_SFamilyClassRec_ + { + FTC_MruListClassRec clazz; + FTC_SFamily_GetCountFunc family_get_count; + FTC_SFamily_LoadGlyphFunc family_load_glyph; + + } FTC_SFamilyClassRec; + + typedef const FTC_SFamilyClassRec* FTC_SFamilyClass; + +#define FTC_SFAMILY_CLASS( x ) ((FTC_SFamilyClass)(x)) + +#define FTC_CACHE__SFAMILY_CLASS( x ) \ + FTC_SFAMILY_CLASS( FTC_CACHE__GCACHE_CLASS( x )->family_class ) - /*************************************************************************/ - /* */ - /* */ - /* FTC_SBit_Cache */ - /* */ - /* */ - /* DEPRECATED. Use @FTC_SBitCache instead. */ - /* */ - typedef FTC_SBitCache FTC_SBit_Cache; + FT_EXPORT( void ) + FTC_SNode_Free( FTC_SNode snode, + FTC_Cache cache ); - - /*************************************************************************/ - /* */ - /* */ - /* FTC_SBitCache_New */ - /* */ - /* */ - /* Creates a new cache to store small glyph bitmaps. */ - /* */ - /* */ - /* manager :: A handle to the source cache manager. */ - /* */ - /* */ - /* acache :: A handle to the new sbit cache. NULL in case of error. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ FT_EXPORT( FT_Error ) - FTC_SBitCache_New( FTC_Manager manager, - FTC_SBitCache *acache ); + FTC_SNode_New( FTC_SNode *psnode, + FTC_GQuery gquery, + FTC_Cache cache ); + + FT_EXPORT( FT_ULong ) + FTC_SNode_Weight( FTC_SNode inode ); - /*************************************************************************/ - /* */ - /* */ - /* FTC_SBitCache_Lookup */ - /* */ - /* */ - /* Looks up a given small glyph bitmap in a given sbit cache and */ - /* "lock" it to prevent its flushing from the cache until needed */ - /* */ - /* */ - /* cache :: A handle to the source sbit cache. */ - /* */ - /* type :: A pointer to the glyph image type descriptor. */ - /* */ - /* gindex :: The glyph index. */ - /* */ - /* */ - /* sbit :: A handle to a small bitmap descriptor. */ - /* */ - /* anode :: Used to return the address of of the corresponding cache */ - /* node after incrementing its reference count (see note */ - /* below). */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - /* */ - /* The small bitmap descriptor and its bit buffer are owned by the */ - /* cache and should never be freed by the application. They might */ - /* as well disappear from memory on the next cache lookup, so don't */ - /* treat them as persistent data. */ - /* */ - /* The descriptor's `buffer' field is set to 0 to indicate a missing */ - /* glyph bitmap. */ - /* */ - /* If "anode" is _not_ NULL, it receives the address of the cache */ - /* node containing the bitmap, after increasing its reference count. */ - /* This ensures that the node (as well as the image) will always be */ - /* kept in the cache until you call @FTC_Node_Unref to "release" it. */ - /* */ - /* If "anode" is NULL, the cache node is left unchanged, which means */ - /* that the bitmap could be flushed out of the cache on the next */ - /* call to one of the caching sub-system APIs. Don't assume that it */ - /* is persistent! */ - /* */ - FT_EXPORT( FT_Error ) - FTC_SBitCache_Lookup( FTC_SBitCache cache, - FTC_ImageType type, - FT_UInt gindex, - FTC_SBit *sbit, - FTC_Node *anode ); - + FT_EXPORT( FT_Bool ) + FTC_SNode_Compare( FTC_SNode snode, + FTC_GQuery gquery, + FTC_Cache cache ); /* */ - - /*************************************************************************/ - /* */ - /* */ - /* FTC_SBit_Cache_New */ - /* */ - /* */ - /* DEPRECATED. Use @FTC_SBitCache_New instead. */ - /* */ - /* Creates a new cache to store small glyph bitmaps. */ - /* */ - /* */ - /* manager :: A handle to the source cache manager. */ - /* */ - /* */ - /* acache :: A handle to the new sbit cache. NULL in case of error. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - FT_EXPORT( FT_Error ) - FTC_SBit_Cache_New( FTC_Manager manager, - FTC_SBit_Cache *acache ); - - - /*************************************************************************/ - /* */ - /* */ - /* FTC_SBit_Cache_Lookup */ - /* */ - /* */ - /* DEPRECATED. Use @FTC_SBitCache_Lookup instead. */ - /* */ - /* Looks up a given small glyph bitmap in a given sbit cache. */ - /* */ - /* */ - /* cache :: A handle to the source sbit cache. */ - /* */ - /* desc :: A pointer to the glyph image descriptor. */ - /* */ - /* gindex :: The glyph index. */ - /* */ - /* */ - /* sbit :: A handle to a small bitmap descriptor. */ - /* */ - /* */ - /* FreeType error code. 0 means success. */ - /* */ - /* */ - /* The small bitmap descriptor and its bit buffer are owned by the */ - /* cache and should never be freed by the application. They might */ - /* as well disappear from memory on the next cache lookup, so don't */ - /* treat them as persistent data. */ - /* */ - /* The descriptor's `buffer' field is set to 0 to indicate a missing */ - /* glyph bitmap. */ - /* */ - FT_EXPORT( FT_Error ) - FTC_SBit_Cache_Lookup( FTC_SBit_Cache cache, - FTC_Image_Desc* desc, - FT_UInt gindex, - FTC_SBit *sbit ); - - FT_END_HEADER #endif /* __FTCSBITS_H__ */ diff --git a/reactos/lib/freetype/include/freetype/cache/ftlru.h b/reactos/lib/freetype/include/freetype/cache/ftlru.h deleted file mode 100644 index 9e4507efa2f..00000000000 --- a/reactos/lib/freetype/include/freetype/cache/ftlru.h +++ /dev/null @@ -1,202 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftlru.h */ -/* */ -/* Simple LRU list-cache (specification). */ -/* */ -/* Copyright 2000-2001 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - - /*************************************************************************/ - /* */ - /* An LRU is a list that cannot hold more than a certain number of */ - /* elements (`max_elements'). All elements in the list are sorted in */ - /* least-recently-used order, i.e., the `oldest' element is at the tail */ - /* of the list. */ - /* */ - /* When doing a lookup (either through `Lookup()' or `Lookup_Node()'), */ - /* the list is searched for an element with the corresponding key. If */ - /* it is found, the element is moved to the head of the list and is */ - /* returned. */ - /* */ - /* If no corresponding element is found, the lookup routine will try to */ - /* obtain a new element with the relevant key. If the list is already */ - /* full, the oldest element from the list is discarded and replaced by a */ - /* new one; a new element is added to the list otherwise. */ - /* */ - /* Note that it is possible to pre-allocate the element list nodes. */ - /* This is handy if `max_elements' is sufficiently small, as it saves */ - /* allocations/releases during the lookup process. */ - /* */ - /*************************************************************************/ - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /********* *********/ - /********* WARNING, THIS IS BETA CODE. *********/ - /********* *********/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - -#ifndef __FTLRU_H__ -#define __FTLRU_H__ - - -#include -#include FT_FREETYPE_H - - -FT_BEGIN_HEADER - - - /* generic list key type */ - typedef FT_Pointer FT_LruKey; - - /* a list list handle */ - typedef struct FT_LruListRec_* FT_LruList; - - /* a list class handle */ - typedef const struct FT_LruList_ClassRec_* FT_LruList_Class; - - /* a list node handle */ - typedef struct FT_LruNodeRec_* FT_LruNode; - - /* the list node structure */ - typedef struct FT_LruNodeRec_ - { - FT_LruNode next; - FT_LruKey key; - - } FT_LruNodeRec; - - - /* the list structure */ - typedef struct FT_LruListRec_ - { - FT_Memory memory; - FT_LruList_Class clazz; - FT_LruNode nodes; - FT_UInt max_nodes; - FT_UInt num_nodes; - FT_Pointer data; - - } FT_LruListRec; - - - /* initialize a list list */ - typedef FT_Error - (*FT_LruList_InitFunc)( FT_LruList list ); - - /* finalize a list list */ - typedef void - (*FT_LruList_DoneFunc)( FT_LruList list ); - - /* this method is used to initialize a new list element node */ - typedef FT_Error - (*FT_LruNode_InitFunc)( FT_LruNode node, - FT_LruKey key, - FT_Pointer data ); - - /* this method is used to finalize a given list element node */ - typedef void - (*FT_LruNode_DoneFunc)( FT_LruNode node, - FT_Pointer data ); - - /* If defined, this method is called when the list if full */ - /* during the lookup process -- it is used to change the contents */ - /* of a list element node instead of calling `done_element()', */ - /* then `init_element()'. Set it to 0 for default behaviour. */ - typedef FT_Error - (*FT_LruNode_FlushFunc)( FT_LruNode node, - FT_LruKey new_key, - FT_Pointer data ); - - /* If defined, this method is used to compare a list element node */ - /* with a given key during a lookup. If set to 0, the `key' */ - /* fields will be directly compared instead. */ - typedef FT_Bool - (*FT_LruNode_CompareFunc)( FT_LruNode node, - FT_LruKey key, - FT_Pointer data ); - - /* A selector is used to indicate whether a given list element node */ - /* is part of a selection for FT_LruList_Remove_Selection(). The */ - /* functrion must return true (i.e., non-null) to indicate that the */ - /* node is part of it. */ - typedef FT_Bool - (*FT_LruNode_SelectFunc)( FT_LruNode node, - FT_Pointer data, - FT_Pointer list_data ); - - /* LRU class */ - typedef struct FT_LruList_ClassRec_ - { - FT_UInt list_size; - FT_LruList_InitFunc list_init; /* optional */ - FT_LruList_DoneFunc list_done; /* optional */ - - FT_UInt node_size; - FT_LruNode_InitFunc node_init; /* MANDATORY */ - FT_LruNode_DoneFunc node_done; /* optional */ - FT_LruNode_FlushFunc node_flush; /* optional */ - FT_LruNode_CompareFunc node_compare; /* optional */ - - } FT_LruList_ClassRec; - - - /* The following functions must be exported in the case where */ - /* applications would want to write their own cache classes. */ - - FT_EXPORT( FT_Error ) - FT_LruList_New( FT_LruList_Class clazz, - FT_UInt max_elements, - FT_Pointer user_data, - FT_Memory memory, - FT_LruList *alist ); - - FT_EXPORT( void ) - FT_LruList_Reset( FT_LruList list ); - - FT_EXPORT( void ) - FT_LruList_Destroy ( FT_LruList list ); - - FT_EXPORT( FT_Error ) - FT_LruList_Lookup( FT_LruList list, - FT_LruKey key, - FT_LruNode *anode ); - - FT_EXPORT( void ) - FT_LruList_Remove( FT_LruList list, - FT_LruNode node ); - - FT_EXPORT( void ) - FT_LruList_Remove_Selection( FT_LruList list, - FT_LruNode_SelectFunc select_func, - FT_Pointer select_data ); - - /* */ - -FT_END_HEADER - - -#endif /* __FTLRU_H__ */ - - -/* END */ diff --git a/reactos/lib/freetype/include/freetype/config/ftconfig.h b/reactos/lib/freetype/include/freetype/config/ftconfig.h index 4f5d7fe8e23..4bd8cf6174c 100644 --- a/reactos/lib/freetype/include/freetype/config/ftconfig.h +++ b/reactos/lib/freetype/include/freetype/config/ftconfig.h @@ -4,7 +4,7 @@ /* */ /* ANSI-specific configuration file (specification only). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -58,24 +58,37 @@ FT_BEGIN_HEADER /*************************************************************************/ - /* The number of bytes in an `int' type. */ -#if FT_UINT_MAX == 0xFFFFFFFFUL -#define FT_SIZEOF_INT 4 -#elif FT_UINT_MAX == 0xFFFFU -#define FT_SIZEOF_INT 2 -#elif FT_UINT_MAX > 0xFFFFFFFFU && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFU -#define FT_SIZEOF_INT 8 -#else -#error "Unsupported number of bytes in `int' type!" + /* There are systems (like the Texas Instruments 'C54x) where a `char' */ + /* has 16 bits. ANSI C says that sizeof(char) is always 1. Since an */ + /* `int' has 16 bits also for this system, sizeof(int) gives 1 which */ + /* is probably unexpected. */ + /* */ + /* `CHAR_BIT' (defined in limits.h) gives the number of bits in a */ + /* `char' type. */ + +#ifndef FT_CHAR_BIT +#define FT_CHAR_BIT CHAR_BIT #endif - /* The number of bytes in a `long' type. */ -#if FT_ULONG_MAX == 0xFFFFFFFFUL -#define FT_SIZEOF_LONG 4 -#elif FT_ULONG_MAX > 0xFFFFFFFFU && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFU -#define FT_SIZEOF_LONG 8 + + /* The size of an `int' type. */ +#if FT_UINT_MAX == 0xFFFFFFFFUL +#define FT_SIZEOF_INT (32 / FT_CHAR_BIT) +#elif FT_UINT_MAX == 0xFFFFU +#define FT_SIZEOF_INT (16 / FT_CHAR_BIT) +#elif FT_UINT_MAX > 0xFFFFFFFFU && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFU +#define FT_SIZEOF_INT (64 / FT_CHAR_BIT) #else -#error "Unsupported number of bytes in `long' type!" +#error "Unsupported size of `int' type!" +#endif + + /* The size of a `long' type. */ +#if FT_ULONG_MAX == 0xFFFFFFFFUL +#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT) +#elif FT_ULONG_MAX > 0xFFFFFFFFU && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFU +#define FT_SIZEOF_LONG (64 / FT_CHAR_BIT) +#else +#error "Unsupported size of `long' type!" #endif @@ -123,12 +136,12 @@ FT_BEGIN_HEADER typedef signed short FT_Int16; typedef unsigned short FT_UInt16; -#if FT_SIZEOF_INT == 4 +#if FT_SIZEOF_INT == (32 / FT_CHAR_BIT) typedef signed int FT_Int32; typedef unsigned int FT_UInt32; -#elif FT_SIZEOF_LONG == 4 +#elif FT_SIZEOF_LONG == (32 / FT_CHAR_BIT) typedef signed long FT_Int32; typedef unsigned long FT_UInt32; @@ -137,13 +150,13 @@ FT_BEGIN_HEADER #error "no 32bit type found -- please check your configuration files" #endif - /* now, lookup for an integer type that is at least 32 bits */ -#if FT_SIZEOF_INT >= 4 + /* look up an integer type that is at least 32 bits */ +#if FT_SIZEOF_INT >= (32 / FT_CHAR_BIT) typedef int FT_Fast; typedef unsigned int FT_UFast; -#elif FT_SIZEOF_LONG >= 4 +#elif FT_SIZEOF_LONG >= (32 / FT_CHAR_BIT) typedef long FT_Fast; typedef unsigned long FT_UFast; @@ -153,7 +166,7 @@ FT_BEGIN_HEADER /* determine whether we have a 64-bit int type for platforms without */ /* Autoconf */ -#if FT_SIZEOF_LONG == 8 +#if FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) /* FT_LONG64 must be defined if a 64-bit type is available */ #define FT_LONG64 @@ -189,7 +202,12 @@ FT_BEGIN_HEADER #define FT_LONG64 #define FT_INT64 long long int -#endif /* FT_SIZEOF_LONG == 8 */ +#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */ + + +#define FT_BEGIN_STMNT do { +#define FT_END_STMNT } while ( 0 ) +#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT /*************************************************************************/ diff --git a/reactos/lib/freetype/include/freetype/config/ftheader.h b/reactos/lib/freetype/include/freetype/config/ftheader.h index 2bd5bd61c27..b996a7a6fba 100644 --- a/reactos/lib/freetype/include/freetype/config/ftheader.h +++ b/reactos/lib/freetype/include/freetype/config/ftheader.h @@ -4,7 +4,7 @@ /* */ /* Build macros of the FreeType 2 library. */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -150,6 +150,7 @@ #define FT_CONFIG_MODULES_H #endif + /* public headers */ /*************************************************************************/ @@ -281,7 +282,7 @@ /* A macro used in #include statements to name the file containing */ /* the module management API of FreeType 2. */ /* */ -#define FT_MODULE_H +#define FT_MODULE_H /*************************************************************************/ @@ -373,6 +374,18 @@ #define FT_GZIP_H + /*************************************************************************/ + /* */ + /* @macro: */ + /* FT_LZW_H */ + /* */ + /* @description: */ + /* A macro used in #include statements to name the file containing */ + /* the definitions of an API to support for LZW-compressed files. */ + /* */ +#define FT_LZW_H + + /*************************************************************************/ /* */ /* @macro: */ @@ -384,6 +397,7 @@ /* */ #define FT_WINFONTS_H + /*************************************************************************/ /* */ /* @macro: */ @@ -433,7 +447,10 @@ /* see the API defined in @FT_CACHE_SMALL_BITMAPS_H if you only need */ /* to store small glyph bitmaps, as it will use less memory. */ /* */ -#define FT_CACHE_IMAGE_H + /* This macro is deprecated. Simply include @FT_CACHE_H to have all */ + /* glyph image-related cache declarations. */ + /* */ +#define FT_CACHE_IMAGE_H FT_CACHE_H /*************************************************************************/ @@ -450,7 +467,10 @@ /* in @FT_CACHE_IMAGE_H if you want to cache arbitrary glyph images, */ /* including scalable outlines. */ /* */ -#define FT_CACHE_SMALL_BITMAPS_H + /* This macro is deprecated. Simply include @FT_CACHE_H to have all */ + /* small bitmaps-related cache declarations. */ + /* */ +#define FT_CACHE_SMALL_BITMAPS_H FT_CACHE_H /*************************************************************************/ @@ -462,7 +482,10 @@ /* A macro used in #include statements to name the file containing */ /* the `charmap' API of the FreeType 2 cache sub-system. */ /* */ -#define FT_CACHE_CHARMAP_H + /* This macro is deprecated. Simply include @FT_CACHE_H to have all */ + /* charmap-based cache declarations. */ + /* */ +#define FT_CACHE_CHARMAP_H FT_CACHE_H /*************************************************************************/ @@ -508,26 +531,30 @@ /* */ -#define FT_TRIGONOMETRY_H -#define FT_STROKER_H -#define FT_SYNTHESIS_H -#define FT_ERROR_DEFINITIONS_H +#define FT_TRIGONOMETRY_H +#define FT_STROKER_H +#define FT_SYNTHESIS_H +#define FT_ERROR_DEFINITIONS_H -#define FT_CACHE_MANAGER_H +#define FT_CACHE_MANAGER_H -#define FT_CACHE_INTERNAL_LRU_H -#define FT_CACHE_INTERNAL_GLYPH_H -#define FT_CACHE_INTERNAL_CACHE_H +#define FT_CACHE_INTERNAL_MRU_H +#define FT_CACHE_INTERNAL_MANAGER_H +#define FT_CACHE_INTERNAL_CACHE_H +#define FT_CACHE_INTERNAL_GLYPH_H +#define FT_CACHE_INTERNAL_IMAGE_H +#define FT_CACHE_INTERNAL_SBITS_H -#define FT_XFREE86_H -#define FT_INCREMENTAL_H +#define FT_XFREE86_H -#define FT_TRUETYPE_UNPATENTED_H +#define FT_INCREMENTAL_H + +#define FT_TRUETYPE_UNPATENTED_H /* now include internal headers definitions from */ -#define FT_INTERNAL_INTERNAL_H +#define FT_INTERNAL_INTERNAL_H #include FT_INTERNAL_INTERNAL_H diff --git a/reactos/lib/freetype/include/freetype/config/ftoption.h b/reactos/lib/freetype/include/freetype/config/ftoption.h index 0e02192c405..a527ec12d14 100644 --- a/reactos/lib/freetype/include/freetype/config/ftoption.h +++ b/reactos/lib/freetype/include/freetype/config/ftoption.h @@ -4,7 +4,7 @@ /* */ /* User-selectable configuration macros (specification only). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -95,6 +95,21 @@ FT_BEGIN_HEADER #undef FT_CONFIG_OPTION_FORCE_INT64 + /*************************************************************************/ + /* */ + /* LZW-compressed file support. */ + /* */ + /* FreeType now handles font files that have been compressed with the */ + /* 'compress' program. This is mostly used to parse many of the PCF */ + /* files that come with various X11 distributions. The implementation */ + /* uses NetBSD's `zopen' to partially uncompress the file on the fly */ + /* (see src/lzw/ftgzip.c). */ + /* */ + /* Define this macro if you want to enable this `feature'. */ + /* */ +#define FT_CONFIG_OPTION_USE_LZW + + /*************************************************************************/ /* */ /* Gzip-compressed file support. */ @@ -102,11 +117,10 @@ FT_BEGIN_HEADER /* FreeType now handles font files that have been compressed with the */ /* 'gzip' program. This is mostly used to parse many of the PCF files */ /* that come with XFree86. The implementation uses `zlib' to */ - /* partially uncompress the file on the fly (see src/base/ftgzip.c). */ + /* partially uncompress the file on the fly (see src/gzip/ftgzip.c). */ /* */ - /* Define this macro if you want to enable this "feature". Note that */ - /* this will however force you to link the zlib to any program that */ - /* also uses FreeType. */ + /* Define this macro if you want to enable this `feature'. See also */ + /* the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below. */ /* */ #define FT_CONFIG_OPTION_USE_ZLIB @@ -116,7 +130,7 @@ FT_BEGIN_HEADER /* ZLib library selection */ /* */ /* This macro is only used when FT_CONFIG_OPTION_USE_ZLIB is defined. */ - /* It allows FreeType's "ftgzip" component to link to the system's */ + /* It allows FreeType's `ftgzip' component to link to the system's */ /* installation of the ZLib library. This is useful on systems like */ /* Unix or VMS where it generally is already available. */ /* */ @@ -230,6 +244,29 @@ FT_BEGIN_HEADER #define FT_CONFIG_OPTION_MAC_FONTS + /*************************************************************************/ + /* */ + /* Guessing methods to access embedded resource forks */ + /* */ + /* Enable extra Mac fonts support on non-Mac platforms (e.g. */ + /* GNU/Linux). */ + /* */ + /* Resource forks which include fonts data are stored sometimes in */ + /* locations which users or developers don't expected. In some cases, */ + /* resource forks start with some offset from the head of a file. In */ + /* other cases, the actual resource fork is stored in file different */ + /* from what the user specifies. If this option is activated, */ + /* FreeType tries to guess whether such offsets or different file */ + /* names must be used. */ + /* */ + /* Note that normal, direct access of resource forks is controlled via */ + /* the FT_CONFIG_OPTION_MAC_FONTS option. */ + /* */ +#ifdef FT_CONFIG_OPTION_MAC_FONTS +#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK +#endif + + /*************************************************************************/ /* */ /* Allow the use of FT_Incremental_Interface to load typefaces that */ @@ -411,10 +448,7 @@ FT_BEGIN_HEADER /* FT_PARAM_TAG_UNPATENTED_HINTING; or when the debug hook */ /* FT_DEBUG_HOOK_UNPATENTED_HINTING is globally actived */ /* */ - /* XXX: WARNING: THIS DOESN'T WORK AS ADVERTISED YET. PLEASE DO NOT */ - /* DEFINE FOR THE MOMENT.. */ - /* */ -/* #define TT_CONFIG_OPTION_UNPATENTED_HINTING */ +#define TT_CONFIG_OPTION_UNPATENTED_HINTING /*************************************************************************/ diff --git a/reactos/lib/freetype/include/freetype/config/ftstdlib.h b/reactos/lib/freetype/include/freetype/config/ftstdlib.h index 7868fd402a1..297d6f01751 100644 --- a/reactos/lib/freetype/include/freetype/config/ftstdlib.h +++ b/reactos/lib/freetype/include/freetype/config/ftstdlib.h @@ -5,7 +5,7 @@ /* ANSI-specific library and header configuration file (specification */ /* only). */ /* */ -/* Copyright 2002 by */ +/* Copyright 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -73,24 +73,27 @@ #include -#define ft_isalnum isalnum -#define ft_isupper isupper -#define ft_islower islower -#define ft_xdigit isxdigit +#define ft_isalnum isalnum +#define ft_isupper isupper +#define ft_islower islower +#define ft_isdigit isdigit +#define ft_isxdigit isxdigit #include -#define ft_strlen strlen +#define ft_memcmp memcmp +#define ft_memcpy memcpy +#define ft_memmove memmove +#define ft_memset memset #define ft_strcat strcat #define ft_strcmp strcmp -#define ft_strncmp strncmp -#define ft_memcpy memcpy #define ft_strcpy strcpy +#define ft_strlen strlen +#define ft_strncmp strncmp #define ft_strncpy strncpy -#define ft_memset memset -#define ft_memmove memmove -#define ft_memcmp memcmp +#define ft_strrchr strrchr + #include @@ -109,7 +112,7 @@ #define ft_qsort qsort #define ft_exit exit /* only used to exit from unhandled exceptions */ -#define ft_atoi atoi +#define ft_atol atol /**********************************************************************/ diff --git a/reactos/lib/freetype/include/freetype/freetype.h b/reactos/lib/freetype/include/freetype/freetype.h index 413e6c6b270..6acf1661196 100644 --- a/reactos/lib/freetype/include/freetype/freetype.h +++ b/reactos/lib/freetype/include/freetype/freetype.h @@ -4,7 +4,7 @@ /* */ /* FreeType high-level API and common types (specification only). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -16,6 +16,15 @@ /***************************************************************************/ +#ifndef FT_FREETYPE_H +#error "`ft2build.h' hasn't been included yet!" +#error "Please always use macros to include FreeType header files." +#error "Example:" +#error " #include " +#error " #include FT_FREETYPE_H" +#endif + + #ifndef __FREETYPE_H__ #define __FREETYPE_H__ @@ -35,7 +44,7 @@ /* */ #define FREETYPE_MAJOR 2 #define FREETYPE_MINOR 1 -#define FREETYPE_PATCH 5 +#define FREETYPE_PATCH 8 #include @@ -460,7 +469,7 @@ FT_BEGIN_HEADER /* should redefine this macro in case of problems to something like */ /* this: */ /* */ - /* #define FT_ENC_TAG( value, a, b, c, d ) (value) */ + /* #define FT_ENC_TAG( value, a, b, c, d ) value */ /* */ /* to get a simple enumeration without assigning special numbers. */ /* */ @@ -581,6 +590,37 @@ FT_BEGIN_HEADER /* the font file, for the cases when they are needed, with the Adobe */ /* values as well. */ /* */ + /* FT_ENCODING_NONE is set by the BDF and PCF drivers if the charmap */ + /* is neither Unicode nor ISO-8859-1 (otherwise it is set to */ + /* FT_ENCODING_UNICODE). Use `FT_Get_BDF_Charset_ID' to find out */ + /* which encoding is really present. If, for example, the */ + /* `cs_registry' field is `KOI8' and the `cs_encoding' field is `R', */ + /* the font is encoded in KOI8-R. */ + /* */ + /* FT_ENCODING_NONE is always set (with a single exception) by the */ + /* winfonts driver. Use `FT_Get_WinFNT_Header' and examine the */ + /* `charset' field of the `FT_WinFNT_HeaderRec' structure to find out */ + /* which encoding is really present. For example, FT_WinFNT_ID_CP1251 */ + /* (204) means Windows code page 1251 (for Russian). */ + /* */ + /* FT_ENCODING_NONE is set if `platform_id' is `TT_PLATFORM_MACINTOSH' */ + /* and `encoding_id' is not `TT_MAC_ID_ROMAN' (otherwise it is set to */ + /* FT_ENCODING_APPLE_ROMAN). */ + /* */ + /* If `platform_id' is `TT_PLATFORM_MACINTOSH', use the function */ + /* `FT_Get_CMap_Language_ID' to query the Mac language ID which may be */ + /* needed to be able to distinguish Apple encoding variants. See */ + /* */ + /* http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/README.TXT */ + /* */ + /* to get an idea how to do that. Basically, if the language ID is 0, */ + /* dont use it, otherwise subtract 1 from the language ID. Then */ + /* examine `encoding_id'. If, for example, `encoding_id' is */ + /* `TT_MAC_ID_ROMAN' and the language ID (minus 1) is */ + /* `TT_MAC_LANGID_GREEK', it is the Greek encoding, not Roman. */ + /* `TT_MAC_ID_ARABIC' with `TT_MAC_LANGID_FARSI' means the Farsi */ + /* variant the Arabic encoding. */ + /* */ typedef enum FT_Encoding_ { FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ), @@ -728,10 +768,12 @@ FT_BEGIN_HEADER /* collection (i.e., a file which embeds */ /* several faces), this is the total number of */ /* faces found in the resource. 1 by default. */ + /* Accessing non-existent face indices causes */ + /* an error. */ /* */ /* face_index :: The index of the face in its font file. */ /* Usually, this is 0 for all normal font */ - /* formats. It can be more in the case of */ + /* formats. It can be > 0 in the case of */ /* collections (which embed several fonts in a */ /* single resource/file). */ /* */ @@ -932,7 +974,7 @@ FT_BEGIN_HEADER /* FT_FACE_FLAG_XXX */ /* */ /* */ - /* A list of bit flags used in the 'face_flags' field of the */ + /* A list of bit flags used in the `face_flags' field of the */ /* @FT_FaceRec structure. They inform client applications of */ /* properties of the corresponding face. */ /* */ @@ -1709,6 +1751,7 @@ FT_BEGIN_HEADER /* */ /* face_index :: The index of the face within the resource. The */ /* first face has index 0. */ + /* */ /* */ /* aface :: A handle to a new face object. */ /* */ @@ -1722,9 +1765,9 @@ FT_BEGIN_HEADER /* */ /* @FT_New_Face can be used to determine and/or check the font format */ /* of a given font resource. If the `face_index' field is negative, */ - /* the function will _not_ return any face handle in `aface'. Its */ - /* return value should be 0 if the font format is recognized, or */ - /* non-zero otherwise. */ + /* the function will _not_ return any face handle in `aface'; the */ + /* return value is 0 if the font format is recognized, or non-zero */ + /* otherwise. */ /* */ /* Each new face object created with this function also owns a */ /* default @FT_Size object, accessible as `face->size'. */ @@ -1755,6 +1798,7 @@ FT_BEGIN_HEADER /* */ /* face_index :: The index of the face within the resource. The */ /* first face has index 0. */ + /* */ /* */ /* aface :: A handle to a new face object. */ /* */ @@ -1774,8 +1818,8 @@ FT_BEGIN_HEADER /* @FT_New_Memory_Face can be used to determine and/or check the font */ /* format of a given font resource. If the `face_index' field is */ /* negative, the function will _not_ return any face handle in */ - /* `aface'. Its return value should be 0 if the font format is */ - /* recognized, or non-zero otherwise. */ + /* `aface'; the return value is 0 if the font format is recognized, */ + /* or non-zero otherwise. */ /* */ FT_EXPORT( FT_Error ) FT_New_Memory_Face( FT_Library library, @@ -1804,6 +1848,7 @@ FT_BEGIN_HEADER /* */ /* face_index :: The index of the face within the resource. The */ /* first face has index 0. */ + /* */ /* */ /* aface :: A handle to a new face object. */ /* */ @@ -1815,11 +1860,11 @@ FT_BEGIN_HEADER /* slot for the face object which can be accessed directly through */ /* `face->glyph'. */ /* */ - /* @FT_Open_Face can be used to determine and/or check the font */ + /* @FT_Open_Face can be used to determine and/or check the font */ /* format of a given font resource. If the `face_index' field is */ /* negative, the function will _not_ return any face handle in */ - /* `*face'. Its return value should be 0 if the font format is */ - /* recognized, or non-zero otherwise. */ + /* `*face'; the return value is 0 if the font format is recognized, */ + /* or non-zero otherwise. */ /* */ FT_EXPORT( FT_Error ) FT_Open_Face( FT_Library library, @@ -2021,7 +2066,9 @@ FT_BEGIN_HEADER /* will be loaded. */ /* */ /* */ - /* glyph_index :: The index of the glyph in the font file. */ + /* glyph_index :: The index of the glyph in the font file. For */ + /* CID-keyed fonts (either in PS or in CFF format) */ + /* this argument specifies the CID value. */ /* */ /* load_flags :: A flag indicating what to load for this glyph. The */ /* @FT_LOAD_XXX constants can be used to control the */ @@ -2212,6 +2259,21 @@ FT_BEGIN_HEADER * outlines. This doesn't prevent native format-specific hinters from * being used. This can be important for certain fonts where unhinted * output is better than auto-hinted one. + * + * FT_LOAD_TARGET_NORMAL :: + * Use hinting for @FT_RENDER_MODE_NORMAL. + * + * FT_LOAD_TARGET_LIGHT :: + * Use hinting for @FT_RENDER_MODE_LIGHT. + * + * FT_LOAD_TARGET_MONO :: + * Use hinting for @FT_RENDER_MODE_MONO. + * + * FT_LOAD_TARGET_LCD :: + * Use hinting for @FT_RENDER_MODE_LCD. + * + * FT_LOAD_TARGET_LCD_V :: + * Use hinting for @FT_RENDER_MODE_LCD_V. */ #define FT_LOAD_DEFAULT 0x0 #define FT_LOAD_NO_SCALE 0x1 @@ -2234,36 +2296,9 @@ FT_BEGIN_HEADER /* */ - #define FT_LOAD_TARGET_( x ) ( (FT_Int32)( (x) & 15 ) << 16 ) #define FT_LOAD_TARGET_MODE( x ) ( (FT_Render_Mode)( ( (x) >> 16 ) & 15 ) ) - - /*************************************************************************** - * - * @enum: - * FT_LOAD_TARGET_XXX - * - * @description: - * A list of load targets. XXX - * - * @values: - * FT_LOAD_TARGET_NORMAL :: - * XXX - * - * FT_LOAD_TARGET_LIGHT :: - * XXX - * - * FT_LOAD_TARGET_MONO :: - * XXX - * - * FT_LOAD_TARGET_LCD :: - * XXX - * - * FT_LOAD_TARGET_LCD_V :: - * XXX - */ - #define FT_LOAD_TARGET_NORMAL FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL ) #define FT_LOAD_TARGET_LIGHT FT_LOAD_TARGET_( FT_RENDER_MODE_LIGHT ) #define FT_LOAD_TARGET_MONO FT_LOAD_TARGET_( FT_RENDER_MODE_MONO ) @@ -2325,11 +2360,14 @@ FT_BEGIN_HEADER /* anti-aliased bitmaps, using 256 levels of opacity. */ /* */ /* FT_RENDER_MODE_LIGHT :: */ - /* This is similar to @FT_RENDER_MODE_NORMAL, except that this */ - /* changes the hinting to prevent stem width quantization. This */ - /* results in glyph shapes that are more similar to the original, */ - /* while being a bit more fuzzy ("better shapes", instead of */ - /* "better contrast" if you want :-). */ + /* This is similar to @FT_RENDER_MODE_NORMAL -- you have to use */ + /* @FT_LOAD_TARGET_LIGHT in calls to @FT_Load_Glyph to get any */ + /* effect since the rendering process no longer influences the */ + /* positioning of glyph outlines. */ + /* */ + /* The resulting glyph shapes are more similar to the original, */ + /* while being a bit more fuzzy (`better shapes' instead of `better */ + /* contrast', so to say. */ /* */ /* FT_RENDER_MODE_MONO :: */ /* This mode corresponds to 1-bit bitmaps. */ diff --git a/reactos/lib/freetype/include/freetype/ftbbox.h b/reactos/lib/freetype/include/freetype/ftbbox.h index e6616135a2d..f98c89eb2d6 100644 --- a/reactos/lib/freetype/include/freetype/ftbbox.h +++ b/reactos/lib/freetype/include/freetype/ftbbox.h @@ -4,7 +4,7 @@ /* */ /* FreeType exact bbox computation (specification). */ /* */ -/* Copyright 1996-2001 by */ +/* Copyright 1996-2001, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -34,6 +34,12 @@ #include #include FT_FREETYPE_H +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + FT_BEGIN_HEADER diff --git a/reactos/lib/freetype/include/freetype/ftbdf.h b/reactos/lib/freetype/include/freetype/ftbdf.h index 3d2d04b3dc1..aa411440d96 100644 --- a/reactos/lib/freetype/include/freetype/ftbdf.h +++ b/reactos/lib/freetype/include/freetype/ftbdf.h @@ -22,6 +22,12 @@ #include #include FT_FREETYPE_H +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + FT_BEGIN_HEADER diff --git a/reactos/lib/freetype/include/freetype/ftcache.h b/reactos/lib/freetype/include/freetype/ftcache.h index fd13f5d0902..c6dc14aeca2 100644 --- a/reactos/lib/freetype/include/freetype/ftcache.h +++ b/reactos/lib/freetype/include/freetype/ftcache.h @@ -4,7 +4,7 @@ /* */ /* FreeType Cache subsystem (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -63,8 +63,8 @@ FT_BEGIN_HEADER /* FTC_Face_Requester */ /* */ /* FTC_Manager_New */ - /* FTC_Manager_Lookup_Face */ - /* FTC_Manager_Lookup_Size */ + /* FTC_Manager_LookupFace */ + /* FTC_Manager_LookupSize */ /* */ /* FTC_Node */ /* FTC_Node_Ref */ @@ -108,10 +108,10 @@ FT_BEGIN_HEADER /* FTC_FaceID */ /* */ /* */ - /* A generic pointer type that is used to identity face objects. The */ + /* An opaque pointer type that is used to identity face objects. The */ /* contents of such objects is application-dependent. */ /* */ - typedef FT_Pointer FTC_FaceID; + typedef struct FTC_FaceIDRec_* FTC_FaceID; /*************************************************************************/ @@ -257,22 +257,16 @@ FT_BEGIN_HEADER /* Creates a new cache manager. */ /* */ /* */ - /* library :: The parent FreeType library handle to use. */ + /* library :: The parent FreeType library handle to use. */ /* */ - /* max_faces :: Maximum number of faces to keep alive in manager. */ - /* Use 0 for defaults. */ + /* max_bytes :: Maximum number of bytes to use for cached data. */ + /* Use 0 for defaults. */ /* */ - /* max_sizes :: Maximum number of sizes to keep alive in manager. */ - /* Use 0 for defaults. */ + /* requester :: An application-provided callback used to translate */ + /* face IDs into real @FT_Face objects. */ /* */ - /* max_bytes :: Maximum number of bytes to use for cached data. */ - /* Use 0 for defaults. */ - /* */ - /* requester :: An application-provided callback used to translate */ - /* face IDs into real @FT_Face objects. */ - /* */ - /* req_data :: A generic pointer that is passed to the requester */ - /* each time it is called (see @FTC_Face_Requester). */ + /* req_data :: A generic pointer that is passed to the requester */ + /* each time it is called (see @FTC_Face_Requester). */ /* */ /* */ /* amanager :: A handle to a new manager object. 0 in case of */ @@ -325,7 +319,7 @@ FT_BEGIN_HEADER /*************************************************************************/ /* */ /* */ - /* FTC_Manager_Lookup_Face */ + /* FTC_Manager_LookupFace */ /* */ /* */ /* Retrieves the @FT_Face object that corresponds to a given face ID */ @@ -348,64 +342,480 @@ FT_BEGIN_HEADER /* */ /* The @FT_Face object doesn't necessarily have a current size object */ /* (i.e., face->size can be 0). If you need a specific `font size', */ - /* use @FTC_Manager_Lookup_Size instead. */ + /* use @FTC_Manager_LookupSize instead. */ /* */ /* Never change the face's transformation matrix (i.e., never call */ /* the @FT_Set_Transform function) on a returned face! If you need */ /* to transform glyphs, do it yourself after glyph loading. */ /* */ FT_EXPORT( FT_Error ) - FTC_Manager_Lookup_Face( FTC_Manager manager, - FTC_FaceID face_id, - FT_Face *aface ); + FTC_Manager_LookupFace( FTC_Manager manager, + FTC_FaceID face_id, + FT_Face *aface ); + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_ScalerRec */ + /* */ + /* */ + /* A structure used to describe a given character size in either */ + /* pixels or points to the cache manager. See */ + /* @FTC_Manager_LookupSize. */ + /* */ + /* */ + /* face_id :: The source face ID. */ + /* */ + /* width :: The character width. */ + /* */ + /* height :: The character height. */ + /* */ + /* pixel :: A Boolean. If TRUE, the `width' and `height' fields */ + /* are interpreted as integer pixel character sizes. */ + /* Otherwise, they are expressed as 1/64th of points. */ + /* */ + /* x_res :: Only used when `pixel' is FALSE to indicate the */ + /* horizontal resolution in dpi. */ + /* */ + /* y_res :: Only used when `pixel' is FALSE to indicate the */ + /* vertical resolution in dpi. */ + /* */ + /* */ + /* This type is mainly used to retrieve @FT_Size objects through the */ + /* cache manager. */ + /* */ + typedef struct FTC_ScalerRec_ + { + FTC_FaceID face_id; + FT_UInt width; + FT_UInt height; + FT_Int pixel; + FT_UInt x_res; + FT_UInt y_res; + + } FTC_ScalerRec, *FTC_Scaler; /*************************************************************************/ /* */ /* */ - /* FTC_Manager_Lookup_Size */ + /* FTC_Manager_LookupSize */ /* */ /* */ - /* Retrieves the @FT_Face and @FT_Size objects that correspond to a */ - /* given font. */ + /* Retrieve the @FT_Size object that corresponds to a given */ + /* @FTC_Scaler through a cache manager. */ /* */ /* */ /* manager :: A handle to the cache manager. */ /* */ - /* font :: The font to use. */ + /* scaler :: A scaler handle. */ /* */ /* */ - /* aface :: A pointer to the handle of the face object. Set it to */ - /* zero if you don't need it. */ - /* */ - /* asize :: A pointer to the handle of the size object. Set it to */ - /* zero if you don't need it. */ + /* asize :: A handle to the size object. */ /* */ /* */ /* FreeType error code. 0 means success. */ /* */ /* */ - /* The returned @FT_Face object is always owned by the manager. You */ - /* should never try to discard it yourself. */ + /* The returned @FT_Size object is always owned by the manager. You */ + /* should never try to discard it by yourself. */ /* */ - /* Never change the face's transformation matrix (i.e., never call */ - /* the @FT_Set_Transform function) on a returned face! If you need */ - /* to transform glyphs, do it yourself after glyph loading. */ - /* */ - /* Similarly, the returned @FT_Size object is always owned by the */ - /* manager. You should never try to discard it, and never change its */ - /* settings with @FT_Set_Pixel_Sizes or @FT_Set_Char_Size! */ - /* */ - /* The returned size object is the face's current size, which means */ - /* that you can call @FT_Load_Glyph with the face if you need to. */ + /* You can access the parent @FT_Face object simply as `size->face' */ + /* if you need it. Note that this object is also owned by the */ + /* manager. */ /* */ FT_EXPORT( FT_Error ) - FTC_Manager_Lookup_Size( FTC_Manager manager, - FTC_Font font, - FT_Face *aface, - FT_Size *asize ); + FTC_Manager_LookupSize( FTC_Manager manager, + FTC_Scaler scaler, + FT_Size *asize ); + /*************************************************************************/ + /* */ + /* */ + /* FTC_Node_Unref */ + /* */ + /* */ + /* Decrement a cache node's internal reference count. When the count */ + /* reaches 0, it is not destroyed but becomes eligible for subsequent */ + /* cache flushes. */ + /* */ + /* */ + /* node :: The cache node handle. */ + /* */ + /* manager :: The cache manager handle. */ + /* */ + FT_EXPORT( void ) + FTC_Node_Unref( FTC_Node node, + FTC_Manager manager ); + + + /* remove all nodes belonging to a given face_id */ + FT_EXPORT( void ) + FTC_Manager_RemoveFaceID( FTC_Manager manager, + FTC_FaceID face_id ); + + + /*************************************************************************/ + /* */ + /*
*/ + /* cache_subsystem */ + /* */ + /*************************************************************************/ + + /************************************************************************ + * + * @type: + * FTC_CMapCache + * + * @description: + * An opaque handle used to manager a charmap cache. This cache is + * to hold character codes -> glyph indices mappings. + */ + typedef struct FTC_CMapCacheRec_* FTC_CMapCache; + + + /*************************************************************************/ + /* */ + /* @function: */ + /* FTC_CMapCache_New */ + /* */ + /* @description: */ + /* Create a new charmap cache. */ + /* */ + /* @input: */ + /* manager :: A handle to the cache manager. */ + /* */ + /* @output: */ + /* acache :: A new cache handle. NULL in case of error. */ + /* */ + /* @return: */ + /* FreeType error code. 0 means success. */ + /* */ + /* @note: */ + /* Like all other caches, this one will be destroyed with the cache */ + /* manager. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_CMapCache_New( FTC_Manager manager, + FTC_CMapCache *acache ); + + + /* retrieve the index of a given charmap */ + FT_EXPORT( FT_Int ) + FT_Get_CharMap_Index( FT_CharMap charmap ); + + + /*************************************************************************/ + /* */ + /* @function: */ + /* FTC_CMapCache_Lookup */ + /* */ + /* @description: */ + /* Translate a character code into a glyph index, using the charmap */ + /* cache. */ + /* */ + /* @input: */ + /* cache :: A charmap cache handle. */ + /* */ + /* face_id :: source face id */ + /* */ + /* cmap_index :: index of charmap in source face */ + /* */ + /* char_code :: The character code (in the corresponding charmap). */ + /* */ + /* @return: */ + /* Glyph index. 0 means `no glyph'. */ + /* */ + FT_EXPORT( FT_UInt ) + FTC_CMapCache_Lookup( FTC_CMapCache cache, + FTC_FaceID face_id, + FT_Int cmap_index, + FT_UInt32 char_code ); + + + /*************************************************************************/ + /* */ + /*
*/ + /* cache_subsystem */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** IMAGE CACHE OBJECT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct FTC_ImageTypeRec_ + { + FTC_FaceID face_id; + FT_Int width; + FT_Int height; + FT_Int32 flags; + + } FTC_ImageTypeRec; + + typedef struct FTC_ImageTypeRec_* FTC_ImageType; + + /* */ + +#define FTC_IMAGE_TYPE_COMPARE( d1, d2 ) \ + ( FTC_FONT_COMPARE( &(d1)->font, &(d2)->font ) && \ + (d1)->flags == (d2)->flags ) + +#define FTC_IMAGE_TYPE_HASH( d ) \ + (FT_UFast)( FTC_FONT_HASH( &(d)->font ) ^ \ + ( (d)->flags << 4 ) ) + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_ImageCache */ + /* */ + /* */ + /* A handle to an glyph image cache object. They are designed to */ + /* hold many distinct glyph images while not exceeding a certain */ + /* memory threshold. */ + /* */ + typedef struct FTC_ImageCacheRec_* FTC_ImageCache; + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_ImageCache_New */ + /* */ + /* */ + /* Creates a new glyph image cache. */ + /* */ + /* */ + /* manager :: The parent manager for the image cache. */ + /* */ + /* */ + /* acache :: A handle to the new glyph image cache object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_New( FTC_Manager manager, + FTC_ImageCache *acache ); + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_ImageCache_Lookup */ + /* */ + /* */ + /* Retrieves a given glyph image from a glyph image cache. */ + /* */ + /* */ + /* cache :: A handle to the source glyph image cache. */ + /* */ + /* type :: A pointer to a glyph image type descriptor. */ + /* */ + /* gindex :: The glyph index to retrieve. */ + /* */ + /* */ + /* aglyph :: The corresponding @FT_Glyph object. 0 in case of */ + /* failure. */ + /* */ + /* anode :: Used to return the address of of the corresponding cache */ + /* node after incrementing its reference count (see note */ + /* below). */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* The returned glyph is owned and managed by the glyph image cache. */ + /* Never try to transform or discard it manually! You can however */ + /* create a copy with @FT_Glyph_Copy and modify the new one. */ + /* */ + /* If `anode' is _not_ NULL, it receives the address of the cache */ + /* node containing the glyph image, after increasing its reference */ + /* count. This ensures that the node (as well as the FT_Glyph) will */ + /* always be kept in the cache until you call @FTC_Node_Unref to */ + /* `release' it. */ + /* */ + /* If `anode' is NULL, the cache node is left unchanged, which means */ + /* that the FT_Glyph could be flushed out of the cache on the next */ + /* call to one of the caching sub-system APIs. Don't assume that it */ + /* is persistent! */ + /* */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_Lookup( FTC_ImageCache cache, + FTC_ImageType type, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ); + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_SBit */ + /* */ + /* */ + /* A handle to a small bitmap descriptor. See the @FTC_SBitRec */ + /* structure for details. */ + /* */ + typedef struct FTC_SBitRec_* FTC_SBit; + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_SBitRec */ + /* */ + /* */ + /* A very compact structure used to describe a small glyph bitmap. */ + /* */ + /* */ + /* width :: The bitmap width in pixels. */ + /* */ + /* height :: The bitmap height in pixels. */ + /* */ + /* left :: The horizontal distance from the pen position to the */ + /* left bitmap border (a.k.a. `left side bearing', or */ + /* `lsb'). */ + /* */ + /* top :: The vertical distance from the pen position (on the */ + /* baseline) to the upper bitmap border (a.k.a. `top */ + /* side bearing'). The distance is positive for upwards */ + /* Y coordinates. */ + /* */ + /* format :: The format of the glyph bitmap (monochrome or gray). */ + /* */ + /* max_grays :: Maximum gray level value (in the range 1 to 255). */ + /* */ + /* pitch :: The number of bytes per bitmap line. May be positive */ + /* or negative. */ + /* */ + /* xadvance :: The horizontal advance width in pixels. */ + /* */ + /* yadvance :: The vertical advance height in pixels. */ + /* */ + /* buffer :: A pointer to the bitmap pixels. */ + /* */ + typedef struct FTC_SBitRec_ + { + FT_Byte width; + FT_Byte height; + FT_Char left; + FT_Char top; + + FT_Byte format; + FT_Byte max_grays; + FT_Short pitch; + FT_Char xadvance; + FT_Char yadvance; + + FT_Byte* buffer; + + } FTC_SBitRec; + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_SBitCache */ + /* */ + /* */ + /* A handle to a small bitmap cache. These are special cache objects */ + /* used to store small glyph bitmaps (and anti-aliased pixmaps) in a */ + /* much more efficient way than the traditional glyph image cache */ + /* implemented by @FTC_ImageCache. */ + /* */ + typedef struct FTC_SBitCacheRec_* FTC_SBitCache; + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_SBitCache_New */ + /* */ + /* */ + /* Creates a new cache to store small glyph bitmaps. */ + /* */ + /* */ + /* manager :: A handle to the source cache manager. */ + /* */ + /* */ + /* acache :: A handle to the new sbit cache. NULL in case of error. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_New( FTC_Manager manager, + FTC_SBitCache *acache ); + + + /*************************************************************************/ + /* */ + /* */ + /* FTC_SBitCache_Lookup */ + /* */ + /* */ + /* Looks up a given small glyph bitmap in a given sbit cache and */ + /* `lock' it to prevent its flushing from the cache until needed. */ + /* */ + /* */ + /* cache :: A handle to the source sbit cache. */ + /* */ + /* type :: A pointer to the glyph image type descriptor. */ + /* */ + /* gindex :: The glyph index. */ + /* */ + /* */ + /* sbit :: A handle to a small bitmap descriptor. */ + /* */ + /* anode :: Used to return the address of of the corresponding cache */ + /* node after incrementing its reference count (see note */ + /* below). */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* The small bitmap descriptor and its bit buffer are owned by the */ + /* cache and should never be freed by the application. They might */ + /* as well disappear from memory on the next cache lookup, so don't */ + /* treat them as persistent data. */ + /* */ + /* The descriptor's `buffer' field is set to 0 to indicate a missing */ + /* glyph bitmap. */ + /* */ + /* If `anode' is _not_ NULL, it receives the address of the cache */ + /* node containing the bitmap, after increasing its reference count. */ + /* This ensures that the node (as well as the image) will always be */ + /* kept in the cache until you call @FTC_Node_Unref to `release' it. */ + /* */ + /* If `anode' is NULL, the cache node is left unchanged, which means */ + /* that the bitmap could be flushed out of the cache on the next */ + /* call to one of the caching sub-system APIs. Don't assume that it */ + /* is persistent! */ + /* */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_Lookup( FTC_SBitCache cache, + FTC_ImageType type, + FT_UInt gindex, + FTC_SBit *sbit, + FTC_Node *anode ); + + + /* */ + FT_END_HEADER #endif /* __FTCACHE_H__ */ diff --git a/reactos/lib/freetype/include/freetype/fterrdef.h b/reactos/lib/freetype/include/freetype/fterrdef.h index 4ef606de850..2f73c085894 100644 --- a/reactos/lib/freetype/include/freetype/fterrdef.h +++ b/reactos/lib/freetype/include/freetype/fterrdef.h @@ -4,7 +4,7 @@ /* */ /* FreeType error codes (specification). */ /* */ -/* Copyright 2002 by */ +/* Copyright 2002, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -207,6 +207,8 @@ "opcode syntax error" ) FT_ERRORDEF_( Stack_Underflow, 0xA1, \ "argument stack underflow" ) + FT_ERRORDEF_( Ignore, 0xA2, \ + "ignore" ) /* BDF errors */ diff --git a/reactos/lib/freetype/include/freetype/ftglyph.h b/reactos/lib/freetype/include/freetype/ftglyph.h index 9c2a999b964..14050a21d90 100644 --- a/reactos/lib/freetype/include/freetype/ftglyph.h +++ b/reactos/lib/freetype/include/freetype/ftglyph.h @@ -36,6 +36,12 @@ #include #include FT_FREETYPE_H +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + FT_BEGIN_HEADER @@ -235,7 +241,8 @@ FT_BEGIN_HEADER /* FT_Glyph_Copy */ /* */ /* */ - /* A function used to copy a glyph image. */ + /* A function used to copy a glyph image. Note that the created */ + /* @FT_Glyph object must be released with @FT_Done_Glyph. */ /* */ /* */ /* source :: A handle to the source glyph object. */ @@ -472,8 +479,7 @@ FT_BEGIN_HEADER /* } */ /* */ /* */ - /* This function will always fail if the glyph's format isn't */ - /* scalable. */ + /* This function does nothing if the glyph format isn't scalable. */ /* */ FT_EXPORT( FT_Error ) FT_Glyph_To_Bitmap( FT_Glyph* the_glyph, diff --git a/reactos/lib/freetype/include/freetype/ftgzip.h b/reactos/lib/freetype/include/freetype/ftgzip.h index 673b4885bc1..5d7228bb493 100644 --- a/reactos/lib/freetype/include/freetype/ftgzip.h +++ b/reactos/lib/freetype/include/freetype/ftgzip.h @@ -22,6 +22,13 @@ #include #include FT_FREETYPE_H +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + FT_BEGIN_HEADER /*************************************************************************/ diff --git a/reactos/lib/freetype/include/freetype/ftimage.h b/reactos/lib/freetype/include/freetype/ftimage.h index d54ef2dec01..4682a4cadaa 100644 --- a/reactos/lib/freetype/include/freetype/ftimage.h +++ b/reactos/lib/freetype/include/freetype/ftimage.h @@ -5,7 +5,7 @@ /* FreeType glyph image formats and default raster interface */ /* (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -53,8 +53,8 @@ FT_BEGIN_HEADER /* */ /* The type FT_Pos is a 32-bit integer used to store vectorial */ /* coordinates. Depending on the context, these can represent */ - /* distances in integer font units, or 26.6 fixed float pixel */ - /* coordinates. */ + /* distances in integer font units, or 16,16, or 26.6 fixed float */ + /* pixel coordinates. */ /* */ typedef signed long FT_Pos; @@ -657,7 +657,7 @@ FT_BEGIN_HEADER /* should redefine this macro in case of problems to something like */ /* this: */ /* */ - /* #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) (value) */ + /* #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) value */ /* */ /* to get a simple enumeration without assigning special numbers. */ /* */ diff --git a/reactos/lib/freetype/include/freetype/ftincrem.h b/reactos/lib/freetype/include/freetype/ftincrem.h index e3477120e59..6a1aa1fc31a 100644 --- a/reactos/lib/freetype/include/freetype/ftincrem.h +++ b/reactos/lib/freetype/include/freetype/ftincrem.h @@ -22,6 +22,12 @@ #include #include FT_FREETYPE_H +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + FT_BEGIN_HEADER diff --git a/reactos/lib/freetype/include/freetype/ftlist.h b/reactos/lib/freetype/include/freetype/ftlist.h index 1c5101700bb..ae9801b9d8f 100644 --- a/reactos/lib/freetype/include/freetype/ftlist.h +++ b/reactos/lib/freetype/include/freetype/ftlist.h @@ -4,7 +4,7 @@ /* */ /* Generic list support for FreeType (specification). */ /* */ -/* Copyright 1996-2001 by */ +/* Copyright 1996-2001, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -31,6 +31,12 @@ #include #include FT_FREETYPE_H +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + FT_BEGIN_HEADER diff --git a/reactos/lib/freetype/include/freetype/ftlzw.h b/reactos/lib/freetype/include/freetype/ftlzw.h new file mode 100644 index 00000000000..a0a042ea07e --- /dev/null +++ b/reactos/lib/freetype/include/freetype/ftlzw.h @@ -0,0 +1,99 @@ +/***************************************************************************/ +/* */ +/* ftlzw.h */ +/* */ +/* LZW-compressed stream support. */ +/* */ +/* Copyright 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTLZW_H__ +#define __FTLZW_H__ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /*
*/ + /* lzw */ + /* */ + /* */ + /* LZW Streams */ + /* */ + /* <Abstract> */ + /* Using LZW-compressed font files */ + /* */ + /* <Description> */ + /* This section contains the declaration of LZW-specific functions. */ + /* */ + /*************************************************************************/ + + /************************************************************************ + * + * @function: + * FT_Stream_OpenLZW + * + * @description: + * Open a new stream to parse LZW-compressed font files. This is + * mainly used to support the compressed *.pcf.Z fonts that come + * with XFree86. + * + * @input: + * stream :: The target embedding stream. + * + * source :: The source stream. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The source stream must be opened _before_ calling this function. + * + * Calling the internal function FT_Stream_Close on the new stream will + * *not* call FT_Stream_Close on the source stream. None of the stream + * objects will be released to the heap. + * + * The stream implementation is very basic and resets the decompression + * process each time seeking backwards is needed within the stream + * + * In certain builds of the library, LZW compression recognition is + * automatically handled when calling @FT_New_Face or @FT_Open_Face. + * This means that if no font driver is capable of handling the raw + * compressed file, the library will try to open a LZW stream from it + * and re-open the face with it. + * + * This function may return "FT_Err_Unimplemented" if your build of + * FreeType was not compiled with LZW support. + */ + FT_EXPORT( FT_Error ) + FT_Stream_OpenLZW( FT_Stream stream, + FT_Stream source ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTLZW_H__ */ + + +/* END */ diff --git a/reactos/lib/freetype/include/freetype/ftmac.h b/reactos/lib/freetype/include/freetype/ftmac.h index b9f89bab4c4..78ed7794788 100644 --- a/reactos/lib/freetype/include/freetype/ftmac.h +++ b/reactos/lib/freetype/include/freetype/ftmac.h @@ -4,7 +4,7 @@ /* */ /* Additional Mac-specific API. */ /* */ -/* Copyright 1996-2001 by */ +/* Copyright 1996-2001, 2004 by */ /* Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -111,10 +111,44 @@ FT_BEGIN_HEADER /* <Return> */ /* FreeType error code. 0 means success. */ /* */ - FT_EXPORT_DEF( FT_Error ) - FT_GetFile_From_Mac_Name( char* fontName, - FSSpec* pathSpec, - FT_Long* face_index ); + FT_EXPORT( FT_Error ) + FT_GetFile_From_Mac_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face_From_FSSpec */ + /* */ + /* <Description> */ + /* Creates a new face object from a given resource and typeface index */ + /* using an FSSpec to the font file. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* spec :: FSSpec to the font file. */ + /* */ + /* face_index :: The index of the face within the resource. The */ + /* first face has index 0. */ + /* <Output> */ + /* aface :: A handle to a new face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* @FT_New_Face_From_FSSpec is identical to @FT_New_Face except */ + /* it accepts an FSSpec instead of a path. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FSSpec( FT_Library library, + const FSSpec *spec, + FT_Long face_index, + FT_Face *aface ); /* */ diff --git a/reactos/lib/freetype/include/freetype/ftmm.h b/reactos/lib/freetype/include/freetype/ftmm.h index 5e681b2c4fc..7f565bef947 100644 --- a/reactos/lib/freetype/include/freetype/ftmm.h +++ b/reactos/lib/freetype/include/freetype/ftmm.h @@ -100,21 +100,6 @@ FT_BEGIN_HEADER /* */ - typedef FT_Error - (*FT_Get_MM_Func)( FT_Face face, - FT_Multi_Master* master ); - - typedef FT_Error - (*FT_Set_MM_Design_Func)( FT_Face face, - FT_UInt num_coords, - FT_Long* coords ); - - typedef FT_Error - (*FT_Set_MM_Blend_Func)( FT_Face face, - FT_UInt num_coords, - FT_Long* coords ); - - /*************************************************************************/ /* */ /* <Function> */ diff --git a/reactos/lib/freetype/include/freetype/ftmodule.h b/reactos/lib/freetype/include/freetype/ftmodapi.h similarity index 97% rename from reactos/lib/freetype/include/freetype/ftmodule.h rename to reactos/lib/freetype/include/freetype/ftmodapi.h index caf081d6d09..1929ca025dc 100644 --- a/reactos/lib/freetype/include/freetype/ftmodule.h +++ b/reactos/lib/freetype/include/freetype/ftmodapi.h @@ -1,6 +1,6 @@ /***************************************************************************/ /* */ -/* ftmodule.h */ +/* ftmodapi.h */ /* */ /* FreeType modules public interface (specification). */ /* */ @@ -16,13 +16,19 @@ /***************************************************************************/ -#ifndef __FTMODULE_H__ -#define __FTMODULE_H__ +#ifndef __FTMODAPI_H__ +#define __FTMODAPI_H__ #include <ft2build.h> #include FT_FREETYPE_H +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + FT_BEGIN_HEADER @@ -70,8 +76,7 @@ FT_BEGIN_HEADER #define ft_module_driver_has_hinter FT_MODULE_DRIVER_HAS_HINTER - typedef void - (*FT_Module_Interface)( void ); + typedef FT_Pointer FT_Module_Interface; typedef FT_Error (*FT_Module_Constructor)( FT_Module module ); @@ -79,7 +84,7 @@ FT_BEGIN_HEADER typedef void (*FT_Module_Destructor)( FT_Module module ); - typedef FT_Module_Interface + typedef FT_Module_Interface (*FT_Module_Requester)( FT_Module module, const char* name ); @@ -308,7 +313,7 @@ FT_BEGIN_HEADER FT_END_HEADER -#endif /* __FTMODULE_H__ */ +#endif /* __FTMODAPI_H__ */ /* END */ diff --git a/reactos/lib/freetype/include/freetype/ftmoderr.h b/reactos/lib/freetype/include/freetype/ftmoderr.h index c9b812179fc..d190167fa75 100644 --- a/reactos/lib/freetype/include/freetype/ftmoderr.h +++ b/reactos/lib/freetype/include/freetype/ftmoderr.h @@ -4,7 +4,7 @@ /* */ /* FreeType module error offsets (specification). */ /* */ -/* Copyright 2001, 2002, 2003 by */ +/* Copyright 2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -23,8 +23,8 @@ /* The lower byte gives the error code, the higher byte gives the */ /* module. The base module has error offset 0. For example, the error */ /* `FT_Err_Invalid_File_Format' has value 0x003, the error */ - /* `TT_Err_Invalid_File_Format' has value 0xF03, the error */ - /* `T1_Err_Invalid_File_Format' has value 0x1003, etc. */ + /* `TT_Err_Invalid_File_Format' has value 0x1003, the error */ + /* `T1_Err_Invalid_File_Format' has value 0x1103, etc. */ /* */ /* Undefine the macro FT_CONFIG_OPTION_USE_MODULE_ERRORS in ftoption.h */ /* to make the higher byte always zero (disabling the module error */ @@ -109,18 +109,19 @@ FT_MODERRDEF( CFF, 0x400, "CFF module" ) FT_MODERRDEF( CID, 0x500, "CID module" ) FT_MODERRDEF( Gzip, 0x600, "Gzip module" ) - FT_MODERRDEF( PCF, 0x700, "PCF module" ) - FT_MODERRDEF( PFR, 0x800, "PFR module" ) - FT_MODERRDEF( PSaux, 0x900, "PS auxiliary module" ) - FT_MODERRDEF( PShinter, 0xA00, "PS hinter module" ) - FT_MODERRDEF( PSnames, 0xB00, "PS names module" ) - FT_MODERRDEF( Raster, 0xC00, "raster module" ) - FT_MODERRDEF( SFNT, 0xD00, "SFNT module" ) - FT_MODERRDEF( Smooth, 0xE00, "smooth raster module" ) - FT_MODERRDEF( TrueType, 0xF00, "TrueType module" ) - FT_MODERRDEF( Type1, 0x1000, "Type 1 module" ) - FT_MODERRDEF( Type42, 0x1100, "Type 42 module" ) - FT_MODERRDEF( Winfonts, 0x1200, "Windows FON/FNT module" ) + FT_MODERRDEF( LZW, 0x700, "LZW module" ) + FT_MODERRDEF( PCF, 0x800, "PCF module" ) + FT_MODERRDEF( PFR, 0x900, "PFR module" ) + FT_MODERRDEF( PSaux, 0xA00, "PS auxiliary module" ) + FT_MODERRDEF( PShinter, 0xB00, "PS hinter module" ) + FT_MODERRDEF( PSnames, 0xC00, "PS names module" ) + FT_MODERRDEF( Raster, 0xD00, "raster module" ) + FT_MODERRDEF( SFNT, 0xE00, "SFNT module" ) + FT_MODERRDEF( Smooth, 0xF00, "smooth raster module" ) + FT_MODERRDEF( TrueType, 0x1000, "TrueType module" ) + FT_MODERRDEF( Type1, 0x1100, "Type 1 module" ) + FT_MODERRDEF( Type42, 0x1200, "Type 42 module" ) + FT_MODERRDEF( Winfonts, 0x1300, "Windows FON/FNT module" ) #ifdef FT_MODERR_END_LIST diff --git a/reactos/lib/freetype/include/freetype/ftoutln.h b/reactos/lib/freetype/include/freetype/ftoutln.h index 19b5724a5c8..79ed35b5970 100644 --- a/reactos/lib/freetype/include/freetype/ftoutln.h +++ b/reactos/lib/freetype/include/freetype/ftoutln.h @@ -5,7 +5,7 @@ /* Support for the FT_Outline type used to store glyph shapes of */ /* most scalable font formats (specification). */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 1996-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -24,6 +24,12 @@ #include <ft2build.h> #include FT_FREETYPE_H +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + FT_BEGIN_HEADER @@ -389,6 +395,72 @@ FT_BEGIN_HEADER FT_Raster_Params* params ); + /************************************************************************** + * + * @enum: + * FT_Orientation + * + * @description: + * A list of values used to describe an outline's contour orientation. + * + * The TrueType and Postscript specifications use different conventions + * to determine whether outline contours should be filled or unfilled. + * + * @values: + * FT_ORIENTATION_TRUETYPE :: + * According to the TrueType specification, clockwise contours must + * be filled, and counter-clockwise ones must be unfilled. + * + * FT_ORIENTATION_POSTSCRIPT :: + * According to the Postscript specification, counter-clockwise contours + * must be filled, and clockwise ones must be unfilled. + * + * FT_ORIENTATION_FILL_RIGHT :: + * This is identical to @FT_ORIENTATION_TRUETYPE, but is used to + * remember that in TrueType, everything that is to the right of + * the drawing direction of a contour must be filled. + * + * FT_ORIENTATION_FILL_LEFT :: + * This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to + * remember that in Postscript, everything that is to the left of + * the drawing direction of a contour must be filled. + */ + typedef enum + { + FT_ORIENTATION_TRUETYPE = 0, + FT_ORIENTATION_POSTSCRIPT = 1, + FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE, + FT_ORIENTATION_FILL_LEFT = FT_ORIENTATION_POSTSCRIPT + + } FT_Orientation; + + + /************************************************************************** + * + * @function: + * FT_Outline_Get_Orientation + * + * @description: + * This function analyzes a glyph outline and tries to compute its + * fill orientation (see @FT_Orientation). This is done by computing + * the direction of each global horizontal and/or vertical extrema + * within the outline. + * + * Note that this will return @FT_ORIENTATION_TRUETYPE for empty + * outlines. + * + * @input: + * outline :: + * A handle to the source outline. + * + * @return: + * The orientation. + * + */ + FT_EXPORT( FT_Orientation ) + FT_Outline_Get_Orientation( FT_Outline* outline ); + + /* */ diff --git a/reactos/lib/freetype/include/freetype/ftpfr.h b/reactos/lib/freetype/include/freetype/ftpfr.h index 7b687dacc2e..c9a5675445a 100644 --- a/reactos/lib/freetype/include/freetype/ftpfr.h +++ b/reactos/lib/freetype/include/freetype/ftpfr.h @@ -22,6 +22,12 @@ #include <ft2build.h> #include FT_FREETYPE_H +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + FT_BEGIN_HEADER diff --git a/reactos/lib/freetype/include/freetype/ftsizes.h b/reactos/lib/freetype/include/freetype/ftsizes.h index 0fd6f0ffbaf..f0ec9159977 100644 --- a/reactos/lib/freetype/include/freetype/ftsizes.h +++ b/reactos/lib/freetype/include/freetype/ftsizes.h @@ -4,7 +4,7 @@ /* */ /* FreeType size objects management (specification). */ /* */ -/* Copyright 1996-2001 by */ +/* Copyright 1996-2001, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -32,6 +32,12 @@ #include <ft2build.h> #include FT_FREETYPE_H +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + FT_BEGIN_HEADER @@ -101,7 +107,9 @@ FT_BEGIN_HEADER /* FT_Done_Size */ /* */ /* <Description> */ - /* Discards a given size object. */ + /* Discards a given size object. Note that @FT_Done_Face */ + /* automatically discards all size objects allocated with */ + /* @FT_New_Size. */ /* */ /* <Input> */ /* size :: A handle to a target size object. */ diff --git a/reactos/lib/freetype/include/freetype/ftsnames.h b/reactos/lib/freetype/include/freetype/ftsnames.h index 356f9834904..0e2d9a4adcc 100644 --- a/reactos/lib/freetype/include/freetype/ftsnames.h +++ b/reactos/lib/freetype/include/freetype/ftsnames.h @@ -7,7 +7,7 @@ /* */ /* This is _not_ used to retrieve glyph names! */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 1996-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -26,6 +26,12 @@ #include <ft2build.h> #include FT_FREETYPE_H +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + FT_BEGIN_HEADER diff --git a/reactos/lib/freetype/include/freetype/ftstroke.h b/reactos/lib/freetype/include/freetype/ftstroke.h index a92c68d622a..a3052e858e0 100644 --- a/reactos/lib/freetype/include/freetype/ftstroke.h +++ b/reactos/lib/freetype/include/freetype/ftstroke.h @@ -4,7 +4,7 @@ /* */ /* FreeType path stroker (specification). */ /* */ -/* Copyright 2002, 2003 by */ +/* Copyright 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -21,42 +21,45 @@ #include <ft2build.h> #include FT_OUTLINE_H +#include FT_GLYPH_H FT_BEGIN_HEADER -/*@************************************************************* - * - * @type: FT_Stroker - * - * @description: - * opaque handler to a path stroker object - */ - typedef struct FT_StrokerRec_* FT_Stroker; + /*@************************************************************* + * + * @type: + * FT_Stroker + * + * @description: + * Opaque handler to a path stroker object. + */ + typedef struct FT_StrokerRec_* FT_Stroker; -/*@************************************************************* - * - * @enum: FT_Stroker_LineJoin - * - * @description: - * these values determine how two joining lines are rendered - * in a stroker. - * - * @values: - * FT_STROKER_LINEJOIN_ROUND :: - * used to render rounded line joins. circular arcs are used - * to join two lines smoothly - * - * FT_STROKER_LINEJOIN_BEVEL :: - * used to render beveled line joins; i.e. the two joining lines - * are extended until they intersect - * - * FT_STROKER_LINEJOIN_MITER :: - * same as beveled rendering, except that an additional line - * break is added if the angle between the two joining lines - * is too closed (this is useful to avoid unpleasant spikes - * in beveled rendering). - */ + /*@************************************************************* + * + * @enum: + * FT_Stroker_LineJoin + * + * @description: + * These values determine how two joining lines are rendered + * in a stroker. + * + * @values: + * FT_STROKER_LINEJOIN_ROUND :: + * Used to render rounded line joins. Circular arcs are used + * to join two lines smoothly. + * + * FT_STROKER_LINEJOIN_BEVEL :: + * Used to render beveled line joins; i.e., the two joining lines + * are extended until they intersect. + * + * FT_STROKER_LINEJOIN_MITER :: + * Same as beveled rendering, except that an additional line + * break is added if the angle between the two joining lines + * is too closed (this is useful to avoid unpleasant spikes + * in beveled rendering). + */ typedef enum { FT_STROKER_LINEJOIN_ROUND = 0, @@ -66,27 +69,28 @@ FT_BEGIN_HEADER } FT_Stroker_LineJoin; -/*@************************************************************* - * - * @enum: FT_Stroker_LineCap - * - * @description: - * these values determine how the end of opened sub-paths are - * rendered in a stroke - * - * @values: - * FT_STROKER_LINECAP_BUTT :: - * the end of lines is rendered as a full stop on the last - * point itself - * - * FT_STROKER_LINECAP_ROUND :: - * the end of lines is rendered as a half-circle around the - * last point - * - * FT_STROKER_LINECAP_SQUARE :: - * the end of lines is rendered as a square around the - * last point - */ + /*@************************************************************* + * + * @enum: + * FT_Stroker_LineCap + * + * @description: + * These values determine how the end of opened sub-paths are + * rendered in a stroke. + * + * @values: + * FT_STROKER_LINECAP_BUTT :: + * The end of lines is rendered as a full stop on the last + * point itself. + * + * FT_STROKER_LINECAP_ROUND :: + * The end of lines is rendered as a half-circle around the + * last point. + * + * FT_STROKER_LINECAP_SQUARE :: + * The end of lines is rendered as a square around the + * last point. + */ typedef enum { FT_STROKER_LINECAP_BUTT = 0, @@ -95,12 +99,134 @@ FT_BEGIN_HEADER } FT_Stroker_LineCap; - /* */ + /************************************************************** + * + * @enum: + * FT_StrokerBorder + * + * @description: + * These values are used to select a given stroke border + * in @FT_Stroker_GetBorderCounts and @FT_Stroker_ExportBorder. + * + * @values: + * FT_STROKER_BORDER_LEFT :: + * Select the left border, relative to the drawing direction. + * + * FT_STROKER_BORDER_RIGHT :: + * Select the right border, relative to the drawing direction. + * + * @note: + * Applications are generally interested in the `inside' and `outside' + * borders. However, there is no direct mapping between these and + * the `left' / `right' ones, since this really depends on the glyph's + * drawing orientation, which varies between font formats. + * + * You can however use @FT_Outline_GetInsideBorder and + * @FT_Outline_GetOutsideBorder to get these. + */ + typedef enum + { + FT_STROKER_BORDER_LEFT = 0, + FT_STROKER_BORDER_RIGHT + + } FT_StrokerBorder; + + + /************************************************************** + * + * @function: + * FT_Outline_GetInsideBorder + * + * @description: + * Retrieve the @FT_StrokerBorder value corresponding to the + * `inside' borders of a given outline. + * + * @input: + * outline :: + * The source outline handle. + * + * @return: + * The border index. @FT_STROKER_BORDER_LEFT for empty or invalid + * outlines. + */ + FT_EXPORT( FT_StrokerBorder ) + FT_Outline_GetInsideBorder( FT_Outline* outline ); + + + /************************************************************** + * + * @function: + * FT_Outline_GetOutsideBorder + * + * @description: + * Retrieve the @FT_StrokerBorder value corresponding to the + * `outside' borders of a given outline. + * + * @input: + * outline :: + * The source outline handle. + * + * @return: + * The border index. @FT_STROKER_BORDER_LEFT for empty or invalid + * outlines. + */ + FT_EXPORT( FT_StrokerBorder ) + FT_Outline_GetOutsideBorder( FT_Outline* outline ); + + + /************************************************************** + * + * @function: + * FT_Stroker_New + * + * @description: + * Create a new stroker object. + * + * @input: + * memory :: + * The memory manager handle. + * + * @output: + * A new stroker object handle. NULL in case of error. + * + * @return: + * FreeType error code. 0 means success. + */ FT_EXPORT( FT_Error ) FT_Stroker_New( FT_Memory memory, FT_Stroker *astroker ); + + /************************************************************** + * + * @function: + * FT_Stroker_Set + * + * @description: + * Reset a stroker object's attributes. + * + * @input: + * stroker :: + * The target stroker handle. + * + * radius :: + * The border radius. + * + * line_cap :: + * The line cap style. + * + * line_join :: + * The line join style. + * + * miter_limit :: + * The miter limit for the FT_STROKER_LINEJOIN_MITER style, + * expressed as 16.16 fixed point value. + * + * @note: + * The radius is expressed in the same units that the outline + * coordinates. + */ FT_EXPORT( void ) FT_Stroker_Set( FT_Stroker stroker, FT_Fixed radius, @@ -109,29 +235,208 @@ FT_BEGIN_HEADER FT_Fixed miter_limit ); + /************************************************************** + * + * @function: + * FT_Stroker_Rewind + * + * @description: + * Reset a stroker object without changing its attributes. + * You should call this function before beginning a new + * series of calls to @FT_Stroker_BeginSubPath or + * @FT_Stroker_EndSubPath. + * + * @input: + * stroker :: + * The target stroker handle. + */ + FT_EXPORT( void ) + FT_Stroker_Rewind( FT_Stroker stroker ); + + + /************************************************************** + * + * @function: + * FT_Stroker_ParseOutline + * + * @description: + * A convenience function used to parse a whole outline with + * the stroker. The resulting outline(s) can be retrieved + * later by functions like @FT_Stroker_GetCounts and @FT_Stroker_Export. + * + * @input: + * stroker :: + * The target stroker handle. + * + * outline :: + * The source outline. + * + * opened :: + * A boolean. If TRUE, the outline is treated as an open path + * instead of a closed one. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * If `opened' is 0 (the default), the outline is treated as a closed + * path, and the stroker will generate two distinct `border' outlines. + * + * If `opened' is 1, the outline is processed as an open path, and the + * stroker will generate a single `stroke' outline. + * + * This function calls @FT_Stroker_Rewind automatically. + */ FT_EXPORT( FT_Error ) FT_Stroker_ParseOutline( FT_Stroker stroker, FT_Outline* outline, FT_Bool opened ); + + /************************************************************** + * + * @function: + * FT_Stroker_BeginSubPath + * + * @description: + * Start a new sub-path in the stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * to :: + * A pointer to the start vector. + * + * open :: + * A boolean. If TRUE, the sub-path is treated as an open one. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * This function is useful when you need to stroke a path that is + * not stored as a @FT_Outline object. + */ FT_EXPORT( FT_Error ) FT_Stroker_BeginSubPath( FT_Stroker stroker, FT_Vector* to, FT_Bool open ); + + /************************************************************** + * + * @function: + * FT_Stroker_EndSubPath + * + * @description: + * Close the current sub-path in the stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * You should call this function after @FT_Stroker_BeginSubPath. + * If the subpath was not `opened', this function will `draw' a + * single line segment to the start position when needed. + */ FT_EXPORT( FT_Error ) FT_Stroker_EndSubPath( FT_Stroker stroker ); + /************************************************************** + * + * @function: + * FT_Stroker_LineTo + * + * @description: + * `Draw' a single line segment in the stroker's current sub-path, + * from the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ FT_EXPORT( FT_Error ) FT_Stroker_LineTo( FT_Stroker stroker, FT_Vector* to ); + + /************************************************************** + * + * @function: + * FT_Stroker_ConicTo + * + * @description: + * `Draw; a single quadratic bezier in the stroker's current sub-path, + * from the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * control :: + * A pointer to a B閦ier control point. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ FT_EXPORT( FT_Error ) FT_Stroker_ConicTo( FT_Stroker stroker, FT_Vector* control, FT_Vector* to ); + + /************************************************************** + * + * @function: + * FT_Stroker_CubicTo + * + * @description: + * `Draw' a single cubic B閦ier in the stroker's current sub-path, + * from the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * control1 :: + * A pointer to the first B閦ier control point. + * + * control2 :: + * A pointer to second B閦ier control point. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ FT_EXPORT( FT_Error ) FT_Stroker_CubicTo( FT_Stroker stroker, FT_Vector* control1, @@ -139,19 +444,240 @@ FT_BEGIN_HEADER FT_Vector* to ); + /************************************************************** + * + * @function: + * FT_Stroker_GetBorderCounts + * + * @description: + * Vall this function once you have finished parsing your paths + * with the stroker. It will return the number of points and + * contours necessary to export one of the `border' or `stroke' + * outlines generated by the stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * border :: + * The border index. + * + * @output: + * anum_points :: + * The number of points. + * + * anum_contours :: + * The number of contours. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * When an outline, or a sub-path, is `closed', the stroker generates + * two independent `border' outlines, named `left' and `right'. + * + * When the outline, or a sub-path, is `opened', the stroker merges + * the `border' outlines with caps. The `left' border receives all + * points, while the `right' border becomes empty. + * + * Use the function @FT_Stroker_GetCounts instead if you want to + * retrieve the counts associated to both borders. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_GetBorderCounts( FT_Stroker stroker, + FT_StrokerBorder border, + FT_UInt *anum_points, + FT_UInt *anum_contours ); + + + /************************************************************** + * + * @function: + * FT_Stroker_ExportBorder + * + * @description: + * Call this function after @FT_Stroker_GetBorderCounts to + * export the corresponding border to your own @FT_Outline + * structure. + * + * Note that this function will append the border points and + * contours to your outline, but will not try to resize its + * arrays. + * + * @input: + * stroker :: + * The target stroker handle. + * + * border :: + * The border index. + * + * outline :: + * The target outline handle. + * + * @note: + * Always call this function after @FT_Stroker_GetBorderCounts to + * get sure that there is enough room in your @FT_Outline object to + * receive all new data. + * + * When an outline, or a sub-path, is `closed', the stroker generates + * two independent `border' outlines, named `left' and `right' + * + * When the outline, or a sub-path, is `opened', the stroker merges + * the `border' outlines with caps. The `left' border receives all + * points, while the `right' border becomes empty. + * + * Use the function @FT_Stroker_Export instead if you want to + * retrieve all borders at once. + */ + FT_EXPORT( void ) + FT_Stroker_ExportBorder( FT_Stroker stroker, + FT_StrokerBorder border, + FT_Outline* outline ); + + + /************************************************************** + * + * @function: + * FT_Stroker_GetCounts + * + * @description: + * Call this function once you have finished parsing your paths + * with the stroker. It returns the number of points and + * contours necessary to export all points/borders from the stroked + * outline/path. + * + * @input: + * stroker :: + * The target stroker handle. + * + * @output: + * anum_points :: + * The number of points. + * + * anum_contours :: + * The number of contours. + * + * @return: + * FreeType error code. 0 means success. + */ FT_EXPORT( FT_Error ) FT_Stroker_GetCounts( FT_Stroker stroker, FT_UInt *anum_points, FT_UInt *anum_contours ); + + /************************************************************** + * + * @function: + * FT_Stroker_Export + * + * @description: + * Call this function after @FT_Stroker_GetBorderCounts to + * export the all borders to your own @FT_Outline structure. + * + * Note that this function will append the border points and + * contours to your outline, but will not try to resize its + * arrays. + * + * @input: + * stroker :: + * The target stroker handle. + * + * outline :: + * The target outline handle. + */ FT_EXPORT( void ) FT_Stroker_Export( FT_Stroker stroker, FT_Outline* outline ); + + /************************************************************** + * + * @function: + * FT_Stroker_Done + * + * @description: + * Destroy a stroker object. + * + * @input: + * stroker :: + * A stroker handle. Can be NULL. + */ FT_EXPORT( void ) FT_Stroker_Done( FT_Stroker stroker ); + /************************************************************** + * + * @function: + * FT_Glyph_Stroke + * + * @description: + * Stroke a given outline glyph object with a given stroker. + * + * @inout: + * pglyph :: Source glyph handle on input, new glyph handle + * on output. + * + * @input: + * stroker :: + * A stroker handle. + * + * destroy :: + * A Boolean. If TRUE, the source glyph object is destroyed + * on success. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The source glyph is untouched in case of error. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_Stroke( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool destroy ); + + + /************************************************************** + * + * @function: + * FT_Glyph_StrokeBorder + * + * @description: + * Stroke a given outline glyph object with a given stroker, but + * only return either its inside or outside border. + * + * @inout: + * pglyph :: + * Source glyph handle on input, new glyph handle on output. + * + * @input: + * stroker :: + * A stroker handle. + * + * inside :: + * A Boolean. If TRUE, return the inside border, otherwise + * the outside border. + * + * destroy :: + * A Boolean. If TRUE, the source glyph object is destroyed + * on success. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The source glyph is untouched in case of error. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_StrokeBorder( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool inside, + FT_Bool destroy ); + + /* */ + FT_END_HEADER #endif /* __FT_STROKE_H__ */ diff --git a/reactos/lib/freetype/include/freetype/ftsynth.h b/reactos/lib/freetype/include/freetype/ftsynth.h index 2424ff6273c..f0c738532f3 100644 --- a/reactos/lib/freetype/include/freetype/ftsynth.h +++ b/reactos/lib/freetype/include/freetype/ftsynth.h @@ -5,7 +5,7 @@ /* FreeType synthesizing code for emboldening and slanting */ /* (specification). */ /* */ -/* Copyright 2000-2001 by */ +/* Copyright 2000-2001, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -41,6 +41,12 @@ #include <ft2build.h> #include FT_FREETYPE_H +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + FT_BEGIN_HEADER diff --git a/reactos/lib/freetype/include/freetype/fttrigon.h b/reactos/lib/freetype/include/freetype/fttrigon.h index cf0650e2f5d..0462265e3c7 100644 --- a/reactos/lib/freetype/include/freetype/fttrigon.h +++ b/reactos/lib/freetype/include/freetype/fttrigon.h @@ -21,6 +21,12 @@ #include FT_FREETYPE_H +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + FT_BEGIN_HEADER diff --git a/reactos/lib/freetype/include/freetype/ftwinfnt.h b/reactos/lib/freetype/include/freetype/ftwinfnt.h index 9b308af27d1..a19a12d9720 100644 --- a/reactos/lib/freetype/include/freetype/ftwinfnt.h +++ b/reactos/lib/freetype/include/freetype/ftwinfnt.h @@ -22,6 +22,12 @@ #include <ft2build.h> #include FT_FREETYPE_H +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + FT_BEGIN_HEADER @@ -43,10 +49,132 @@ FT_BEGIN_HEADER /* */ /*************************************************************************/ + + /************************************************************************* + * + * @enum: + * FT_WinFNT_ID_XXX + * + * @description: + * A list of valid values for the `charset' byte in + * @FT_WinFNT_HeaderRec. Exact mapping tables for the various cpXXXX + * encodings (except for cp1361) can be found at ftp://ftp.unicode.org + * in the MAPPINGS/VENDORS/MICSFT/WINDOWS subdirectory. cp1361 is + * roughly a superset of MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT. + * + * @values: + * FT_WinFNT_ID_DEFAULT :: + * This is used for font enumeration and font creation as a + * `don't care' value. Valid font files don't contain this value. + * When querying for information about the character set of the font + * that is currently selected into a specified device context, this + * return value (of the related Windows API) simply denotes failure. + * + * FT_WinFNT_ID_SYMBOL :: + * There is no known mapping table available. + * + * FT_WinFNT_ID_MAC :: + * Mac Roman encoding. + * + * FT_WinFNT_ID_OEM :: + * From Michael P鰐tgen <michael@poettgen.de>: + * The `Windows Font Mapping' article says that FT_WinFNT_ID_OEM + * is used for the charset of vector fonts, like `modern.fon', + * `roman.fon', and `script.fon' on Windows. + * + * The `CreateFont' documentation says: The FT_WinFNT_ID_OEM value + * specifies a character set that is operating-system dependent. + * + * The `IFIMETRICS' documentation from the `Windows Driver + * Development Kit' says: This font supports an OEM-specific + * character set. The OEM character set is system dependent. + * + * In general OEM, as opposed to ANSI (i.e., cp1252), denotes the + * second default codepage that most international versions of + * Windows have. It is one of the OEM codepages from + * + * http://www.microsoft.com/globaldev/reference/cphome.mspx, + * + * and is used for the `DOS boxes', to support legacy applications. + * A German Windows version for example usually uses ANSI codepage + * 1252 and OEM codepage 850. + * + * FT_WinFNT_ID_CP874 :: + * A superset of Thai TIS 620 and ISO 8859-11. + * + * FT_WinFNT_ID_CP932 :: + * A superset of Japanese Shift-JIS (with minor deviations). + * + * FT_WinFNT_ID_CP936 :: + * A superset of simplified Chinese GB 2312-1980 (with different + * ordering and minor deviations). + * + * FT_WinFNT_ID_CP949 :: + * A superset of Korean Hangul KS C 5601-1987 (with different + * ordering and minor deviations). + * + * FT_WinFNT_ID_CP950 :: + * A superset of traditional Chinese Big 5 ETen (with different + * ordering and minor deviations). + * + * FT_WinFNT_ID_CP1250 :: + * A superset of East European ISO 8859-2 (with slightly different + * ordering). + * + * FT_WinFNT_ID_CP1251 :: + * A superset of Russian ISO 8859-5 (with different ordering). + * + * FT_WinFNT_ID_CP1252 :: + * ANSI encoding. A superset of ISO 8859-1. + * + * FT_WinFNT_ID_CP1253 :: + * A superset of Greek ISO 8859-7 (with minor modifications). + * + * FT_WinFNT_ID_CP1254 :: + * A superset of Turkish ISO 8859-9. + * + * FT_WinFNT_ID_CP1255 :: + * A superset of Hebrew ISO 8859-8 (with some modifications). + * + * FT_WinFNT_ID_CP1256 :: + * A superset of Arabic ISO 8859-6 (with different ordering). + * + * FT_WinFNT_ID_CP1257 :: + * A superset of Baltic ISO 8859-13 (with some deviations). + * + * FT_WinFNT_ID_CP1258 :: + * For Vietnamese. This encoding doesn't cover all necessary + * characters. + * + * FT_WinFNT_ID_CP1361 :: + * Korean (Johab). + */ + +#define FT_WinFNT_ID_CP1252 0 +#define FT_WinFNT_ID_DEFAULT 1 +#define FT_WinFNT_ID_SYMBOL 2 +#define FT_WinFNT_ID_MAC 77 +#define FT_WinFNT_ID_CP932 128 +#define FT_WinFNT_ID_CP949 129 +#define FT_WinFNT_ID_CP1361 130 +#define FT_WinFNT_ID_CP936 134 +#define FT_WinFNT_ID_CP950 136 +#define FT_WinFNT_ID_CP1253 161 +#define FT_WinFNT_ID_CP1254 162 +#define FT_WinFNT_ID_CP1258 163 +#define FT_WinFNT_ID_CP1255 177 +#define FT_WinFNT_ID_CP1256 178 +#define FT_WinFNT_ID_CP1257 186 +#define FT_WinFNT_ID_CP1251 204 +#define FT_WinFNT_ID_CP874 222 +#define FT_WinFNT_ID_CP1250 238 +#define FT_WinFNT_ID_OEM 255 + + /*************************************************************************/ /* */ /* <Struct> */ - /* FT_WinFNT_HeaderRec_ */ + /* FT_WinFNT_HeaderRec */ /* */ /* <Description> */ /* Windows FNT Header info. */ diff --git a/reactos/lib/freetype/include/freetype/ftxf86.h b/reactos/lib/freetype/include/freetype/ftxf86.h index 5a7582f9172..3362883cbcc 100644 --- a/reactos/lib/freetype/include/freetype/ftxf86.h +++ b/reactos/lib/freetype/include/freetype/ftxf86.h @@ -4,7 +4,7 @@ /* */ /* Support functions for X11. */ /* */ -/* Copyright 2002 by */ +/* Copyright 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -22,6 +22,13 @@ #include <ft2build.h> #include FT_FREETYPE_H +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + FT_BEGIN_HEADER /* this comment is intentionally disabled for now, to prevent this */ @@ -43,7 +50,7 @@ FT_BEGIN_HEADER /* <Return> */ /* Font format string. NULL in case of error. */ /* */ - FT_EXPORT_DEF( const char* ) + FT_EXPORT( const char* ) FT_Get_X11_Font_Format( FT_Face face ); /* */ diff --git a/reactos/lib/freetype/include/freetype/internal/bdftypes.h b/reactos/lib/freetype/include/freetype/internal/bdftypes.h deleted file mode 100644 index 3a1ec64351a..00000000000 --- a/reactos/lib/freetype/include/freetype/internal/bdftypes.h +++ /dev/null @@ -1,58 +0,0 @@ -/* bdftypes.h - - FreeType font driver for bdf fonts - - Copyright (C) 2001, 2002 by - Francesco Zappa Nardelli - -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 __BDFTYPES_H__ -#define __BDFTYPES_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_BDF_H - - -FT_BEGIN_HEADER - - - typedef struct BDF_Public_FaceRec_ - { - FT_FaceRec root; - - char* charset_encoding; - char* charset_registry; - - } BDF_Public_FaceRec, *BDF_Public_Face; - - - typedef FT_Error (*BDF_GetPropertyFunc)( FT_Face face, - const char* prop_name, - BDF_PropertyRec *aproperty ); - -FT_END_HEADER - - -#endif /* __BDFTYPES_H__ */ - - -/* END */ diff --git a/reactos/lib/freetype/include/freetype/internal/fnttypes.h b/reactos/lib/freetype/include/freetype/internal/fnttypes.h deleted file mode 100644 index 3efa86092da..00000000000 --- a/reactos/lib/freetype/include/freetype/internal/fnttypes.h +++ /dev/null @@ -1,104 +0,0 @@ -/***************************************************************************/ -/* */ -/* fnttypes.h */ -/* */ -/* Basic Windows FNT/FON type definitions and interface (specification */ -/* only). */ -/* */ -/* Copyright 1996-2001, 2002, 2003 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __FNTTYPES_H__ -#define __FNTTYPES_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_WINFONTS_H - - -FT_BEGIN_HEADER - - - typedef struct WinMZ_HeaderRec_ - { - FT_UShort magic; - /* skipped content */ - FT_UShort lfanew; - - } WinMZ_HeaderRec; - - - typedef struct WinNE_HeaderRec_ - { - FT_UShort magic; - /* skipped content */ - FT_UShort resource_tab_offset; - FT_UShort rname_tab_offset; - - } WinNE_HeaderRec; - - - typedef struct WinNameInfoRec_ - { - FT_UShort offset; - FT_UShort length; - FT_UShort flags; - FT_UShort id; - FT_UShort handle; - FT_UShort usage; - - } WinNameInfoRec; - - - typedef struct WinResourceInfoRec_ - { - FT_UShort type_id; - FT_UShort count; - - } WinResourceInfoRec; - - -#define WINFNT_MZ_MAGIC 0x5A4D -#define WINFNT_NE_MAGIC 0x454E - - - typedef struct FNT_FontRec_ - { - FT_ULong offset; - FT_Int size_shift; - - FT_WinFNT_HeaderRec header; - - FT_Byte* fnt_frame; - FT_ULong fnt_size; - - } FNT_FontRec, *FNT_Font; - - - typedef struct FNT_FaceRec_ - { - FT_FaceRec root; - FNT_Font font; - - FT_CharMap charmap_handle; - FT_CharMapRec charmap; /* a single charmap per face */ - - } FNT_FaceRec, *FNT_Face; - - -FT_END_HEADER - -#endif /* __FNTTYPES_H__ */ - - -/* END */ diff --git a/reactos/lib/freetype/include/freetype/internal/ftcalc.h b/reactos/lib/freetype/include/freetype/internal/ftcalc.h index af1f6407202..7866c46273a 100644 --- a/reactos/lib/freetype/include/freetype/internal/ftcalc.h +++ b/reactos/lib/freetype/include/freetype/internal/ftcalc.h @@ -4,7 +4,7 @@ /* */ /* Arithmetic computations (specification). */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 1996-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -27,7 +27,8 @@ FT_BEGIN_HEADER - FT_EXPORT( FT_Int32 ) FT_SqrtFixed( FT_Int32 x ); + FT_EXPORT( FT_Int32 ) + FT_SqrtFixed( FT_Int32 x ); #define SQRT_32( x ) FT_Sqrt32( x ) @@ -59,6 +60,39 @@ FT_BEGIN_HEADER /*************************************************************************/ +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_MulDiv_No_Round */ + /* */ + /* <Description> */ + /* A very simple function used to perform the computation `(a*b)/c' */ + /* (without rounding) with maximal accuracy (it uses a 64-bit */ + /* intermediate integer whenever necessary). */ + /* */ + /* This function isn't necessarily as fast as some processor specific */ + /* operations, but is at least completely portable. */ + /* */ + /* <Input> */ + /* a :: The first multiplier. */ + /* b :: The second multiplier. */ + /* c :: The divisor. */ + /* */ + /* <Return> */ + /* The result of `(a*b)/c'. This function never traps when trying to */ + /* divide by zero; it simply returns `MaxInt' or `MinInt' depending */ + /* on the signs of `a' and `b'. */ + /* */ + FT_BASE( FT_Long ) + FT_MulDiv_No_Round( FT_Long a, + FT_Long b, + FT_Long c ); + +#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ + + #define INT_TO_F26DOT6( x ) ( (FT_Long)(x) << 6 ) #define INT_TO_F2DOT14( x ) ( (FT_Long)(x) << 14 ) #define INT_TO_FIXED( x ) ( (FT_Long)(x) << 16 ) diff --git a/reactos/lib/freetype/include/freetype/internal/ftcore.h b/reactos/lib/freetype/include/freetype/internal/ftcore.h deleted file mode 100644 index 3c3c94ff3ab..00000000000 --- a/reactos/lib/freetype/include/freetype/internal/ftcore.h +++ /dev/null @@ -1,185 +0,0 @@ -#ifndef __FT_CORE_H__ -#define __FT_CORE_H__ - -#include <ft2build.h> -#include FT_TYPES_H -#include FT_SYSTEM_MEMORY_H - -FT_BEGIN_HEADER - - /**************************************************************************/ - /**************************************************************************/ - /***** *****/ - /***** C L E A N U P S T A C K *****/ - /***** *****/ - /**************************************************************************/ - /**************************************************************************/ - - - /************************************************************************ - * - * @functype: FT_CleanupFunc - * - * @description: - * a function used to cleanup a given item on the cleanup stack - * - * @input: - * item :: target item pointer - * item_data :: optional argument to cleanup routine - */ - typedef void (*FT_CleanupFunc)( FT_Pointer item, - FT_Pointer item_data ); - - - - /************************************************************************ - * - * @type: FT_XHandler - * - * @description: - * handle to an exception-handler structure for the FreeType - * exception sub-system - * - * @note: - * exception handlers are allocated on the stack within a - * @FT_XTRY macro. Do not try to access them directly. - */ - typedef struct FT_XHandlerRec_* FT_XHandler; - - -/* the size of a cleanup chunk in bytes is FT_CLEANUP_CHUNK_SIZE*12 + 4 */ -/* this must be a small power of 2 whenever possible.. */ -/* */ -/* with a value of 5, we have a byte size of 64 bytes per chunk.. */ -/* */ -#define FT_CLEANUP_CHUNK_SIZE 5 - - - - typedef struct FT_CleanupItemRec_ - { - FT_Pointer item; - FT_CleanupFunc item_func; - FT_Pointer item_data; - - } FT_CleanupItemRec; - - - typedef struct FT_CleanupChunkRec_* FT_CleanupChunk; - - typedef struct FT_CleanupChunkRec_ - { - FT_CleanupChunk link; - FT_CleanupItemRec items[ FT_CLEANUP_CHUNK_SIZE ]; - - } FT_CleanupChunkRec; - - - typedef struct FT_CleanupStackRec_ - { - FT_CleanupItem top; - FT_CleanupItem limit; - FT_CleanupChunk chunk; - FT_CleanupChunkRec chunk_0; /* avoids stupid dynamic allocation */ - FT_Memory memory; - - } FT_CleanupStackRec, *FT_CleanupStack; - - - FT_BASE( void ) - ft_cleanup_stack_push( FT_CleanupStack stack, - FT_Pointer item, - FT_CleanupFunc item_func, - FT_Pointer item_data ); - - FT_BASE( void ) - ft_cleanup_stack_pop( FT_CleanupStack stack, - FT_Int destroy ); - - FT_BASE( FT_CleanupItem ) - ft_cleanup_stack_peek( FT_CleanupStack stack ); - - FT_BASE( void ) - ft_cleanup_throw( FT_CleanupStack stack, - FT_Error error ); - - - - /**************************************************************************/ - /**************************************************************************/ - /***** *****/ - /***** M E M O R Y M A N A G E R *****/ - /***** *****/ - /**************************************************************************/ - /**************************************************************************/ - - typedef struct FT_MemoryRec_ - { - FT_Memory_AllocFunc mem_alloc; /* shortcut to funcs->mem_alloc */ - FT_Memory_FreeFunc mem_free; /* shortcut to funcs->mem_free */ - FT_Pointer mem_data; - const FT_Memory_Funcs mem_funcs; - - FT_CleanupStackRec cleanup_stack; - FT_Pointer meta_class; - - } FT_MemoryRec; - - -#define FT_MEMORY(x) ((FT_Memory)(x)) -#define FT_MEMORY__ALLOC(x) FT_MEMORY(x)->mem_alloc -#define FT_MEMORY__FREE(x) FT_MEMORY(x)->mem_free -#define FT_MEMORY__REALLOC(x) FT_MEMORY(x)->mem_funcs->mem_realloc -#define FT_MEMORY__CLEANUP(x) (&FT_MEMORY(x)->cleanup_stack) -#define FT_MEMORY__META_CLASS(x) ((FT_MetaClass)(FT_MEMORY(x)->meta_class)) - - - /**************************************************************************/ - /**************************************************************************/ - /***** *****/ - /***** E X C E P T I O N H A N D L I N G *****/ - /***** *****/ - /**************************************************************************/ - /**************************************************************************/ - - - /************************************************************************ - * - * @struct: FT_XHandlerRec - * - * @description: - * exception handler structure - * - * @fields: - * previous :: previous handler in chain. - * jum_buffer :: processor state used by setjmp/longjmp to implement - * exception control transfer - * error :: exception error code - * mark :: top of cleanup stack when @FT_XTRY is used - */ - typedef struct FT_XHandlerRec_ - { - FT_XHandler previous; - ft_jmp_buf jump_buffer; - volatile FT_Error error; - FT_Pointer mark; - - } FT_XHandlerRec; - - FT_BASE( void ) - ft_xhandler_enter( FT_XHandler xhandler, - FT_Memory memory ); - - FT_BASE( void ) - ft_xhandler_exit( FT_XHandler xhandler ); - - - - - - - - -FT_END_HEADER - -#endif /* __FT_CORE_H__ */ diff --git a/reactos/lib/freetype/include/freetype/internal/ftdebug.h b/reactos/lib/freetype/include/freetype/internal/ftdebug.h index 129c91f6ade..ce142c54c9e 100644 --- a/reactos/lib/freetype/include/freetype/internal/ftdebug.h +++ b/reactos/lib/freetype/include/freetype/internal/ftdebug.h @@ -4,7 +4,7 @@ /* */ /* Debugging and logging component (specification). */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 1996-2001, 2002, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -27,6 +27,7 @@ #include <ft2build.h> #include FT_CONFIG_CONFIG_H +#include FT_FREETYPE_H FT_BEGIN_HEADER @@ -96,6 +97,53 @@ FT_BEGIN_HEADER #endif /* !FT_DEBUG_LEVEL_TRACE */ + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Trace_Get_Count */ + /* */ + /* <Description> */ + /* Return the number of available trace components. */ + /* */ + /* <Return> */ + /* The number of trace components. 0 if FreeType 2 is not built with */ + /* FT_DEBUG_LEVEL_TRACE definition. */ + /* */ + /* <Note> */ + /* This function may be useful if you want to access elements of */ + /* the internal `ft_trace_levels' array by an index. */ + /* */ + FT_EXPORT( FT_Int ) + FT_Trace_Get_Count( void ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Trace_Get_Name */ + /* */ + /* <Description> */ + /* Return the name of a trace component. */ + /* */ + /* <Input> */ + /* The index of the trace component. */ + /* */ + /* <Return> */ + /* The name of the trace component. This is a statically allocated */ + /* C string, so do not free it after use. NULL if FreeType 2 is not */ + /* built with FT_DEBUG_LEVEL_TRACE definition. */ + /* */ + /* <Note> */ + /* Use @FT_Trace_Get_Count to get the number of available trace */ + /* components. */ + /* */ + /* This function may be useful if you want to control FreeType 2's */ + /* debug level in your appliaciton. */ + /* */ + FT_EXPORT( const char * ) + FT_Trace_Get_Name( FT_Int idx ); + + /*************************************************************************/ /* */ /* You need two opening resp. closing parentheses! */ diff --git a/reactos/lib/freetype/include/freetype/internal/ftdriver.h b/reactos/lib/freetype/include/freetype/internal/ftdriver.h index 1f1c55aaa53..02f585d6b08 100644 --- a/reactos/lib/freetype/include/freetype/internal/ftdriver.h +++ b/reactos/lib/freetype/include/freetype/internal/ftdriver.h @@ -155,11 +155,15 @@ FT_BEGIN_HEADER /* add data from AFM or PFM files on a Type 1 */ /* face, or a CIDMap on a CID-keyed face. */ /* */ - /* get_advances :: A function handle used to return the advances */ - /* of 'count' glyphs, starting at `index'. the */ - /* `vertical' flags must be set when vertical */ - /* advances are queried. The advances buffer is */ - /* caller-allocated. */ + /* get_advances :: A function handle used to return advance */ + /* widths of 'count' glyphs (in font units), */ + /* starting at `first'. The `vertical' flag must */ + /* be set to get vertical advance heights. The */ + /* `advances' buffer is caller-allocated. */ + /* Currently not implemented. The idea of this */ + /* function is to be able to perform */ + /* device-independent text layout without loading */ + /* a single glyph image. */ /* */ /* <Note> */ /* Most function pointers, with the exception of `load_glyph' and */ diff --git a/reactos/lib/freetype/include/freetype/internal/ftexcept.h b/reactos/lib/freetype/include/freetype/internal/ftexcept.h deleted file mode 100644 index f5495e56c85..00000000000 --- a/reactos/lib/freetype/include/freetype/internal/ftexcept.h +++ /dev/null @@ -1,82 +0,0 @@ -#ifndef __FT_EXCEPT_H__ -#define __FT_EXCEPT_H__ - -#include <ft2build.h> -#include FT_INTERNAL_OBJECTS_H - -FT_BEGIN_HEADER - - - - /* I can't find a better place for this for now */ - -<<<<<<< ftexcept.h -======= - -/* the size of a cleanup chunk in bytes is FT_CLEANUP_CHUNK_SIZE*12 + 4 */ -/* this must be a small power of 2 whenever possible.. */ -/* */ -/* with a value of 5, we have a byte size of 64 bytes per chunk.. */ -/* */ -#define FT_CLEANUP_CHUNK_SIZE 5 - - - - typedef struct FT_CleanupItemRec_ - { - FT_Pointer item; - FT_CleanupFunc item_func; - FT_Pointer item_data; - - } FT_CleanupItemRec; - - typedef struct FT_CleanupChunkRec_* FT_CleanupChunk; - - typedef struct FT_CleanupChunkRec_ - { - FT_CleanupChunk link; - FT_CleanupItemRec items[ FT_CLEANUP_CHUNK_SIZE ]; - - } FT_CleanupChunkRec; - - - typedef struct FT_CleanupStackRec_ - { - FT_CleanupItem top; - FT_CleanupItem limit; - FT_CleanupChunk chunk; - FT_CleanupChunkRec chunk_0; /* avoids stupid dynamic allocation */ - FT_Memory memory; - - } FT_CleanupStackRec, *FT_CleanupStack; - - - FT_BASE( void ) - ft_cleanup_stack_push( FT_CleanupStack stack, - FT_Pointer item, - FT_CleanupFunc item_func, - FT_Pointer item_data ); - - FT_BASE( void ) - ft_cleanup_stack_pop( FT_CleanupStack stack, - FT_Int destroy ); - - FT_BASE( FT_CleanupItem ) - ft_cleanup_stack_peek( FT_CleanupStack stack ); - - FT_BASE( void ) - ft_xhandler_enter( FT_XHandler xhandler, - FT_Memory memory ); - - FT_BASE( void ) - ft_xhandler_exit( FT_XHandler xhandler ); - - - FT_BASE( void ) - ft_cleanup_throw( FT_CleanupStack stack, - FT_Error error ); - ->>>>>>> 1.2 -FT_END_HEADER - -#endif /* __FT_EXCEPT_H__ */ diff --git a/reactos/lib/freetype/include/freetype/internal/ftgloadr.h b/reactos/lib/freetype/include/freetype/internal/ftgloadr.h index 284f4e3b6ac..abc56e25664 100644 --- a/reactos/lib/freetype/include/freetype/internal/ftgloadr.h +++ b/reactos/lib/freetype/include/freetype/internal/ftgloadr.h @@ -110,15 +110,15 @@ FT_BEGIN_HEADER FT_BASE( void ) FT_GlyphLoader_Rewind( FT_GlyphLoader loader ); - /* check that there is enough room to add 'n_points' and 'n_contours' */ - /* to the glyph loader */ + /* check that there is enough space to add `n_points' and `n_contours' */ + /* to the glyph loader */ FT_BASE( FT_Error ) FT_GlyphLoader_CheckPoints( FT_GlyphLoader loader, FT_UInt n_points, FT_UInt n_contours ); - /* check that there is enough room to add 'n_subs' sub-glyphs to */ - /* a glyph loader */ + /* check that there is enough space to add `n_subs' sub-glyphs to */ + /* a glyph loader */ FT_BASE( FT_Error ) FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader loader, FT_UInt n_subs ); diff --git a/reactos/lib/freetype/include/freetype/internal/fthash.h b/reactos/lib/freetype/include/freetype/internal/fthash.h deleted file mode 100644 index b95b6c92504..00000000000 --- a/reactos/lib/freetype/include/freetype/internal/fthash.h +++ /dev/null @@ -1,502 +0,0 @@ -/****************************************************************** - * - * fthash.h - fast dynamic hash tables - * - * Copyright 2002 by - * David Turner, Robert Wilhelm, and Werner Lemberg - * - * This file is part of the FreeType project, and may only be used, - * modified, and distributed under the terms of the FreeType project - * license, LICENSE.TXT. By continuing to use, modify, or distribute - * this file you indicate that you have read the license and - * understand and accept it fully. - * - * - * This header is used to define dynamic hash tables as described - * by the article "Main-Memory Linear Hashing - Some Enhancements - * of Larson's Algorithm" by Mikael Petterson. - * - * Basically, linear hashing prevents big "stalls" during - * resizes of the buckets array by only splitting one bucket - * at a time. This ensures excellent response time even when - * the table is frequently resized.. - * - * - * Note that the use of the FT_Hash type is rather unusual in order - * to be as generic and efficient as possible. See the comments in the - * following definitions for more details. - */ - -#ifndef __FT_HASH_H__ -#define __FT_HASH_H__ - -#include <ft2build.h> -#include FT_TYPES_H - -FT_BEGIN_HEADER - - /*********************************************************** - * - * @type: FT_Hash - * - * @description: - * handle to a @FT_HashRec structure used to model a - * dynamic hash table - */ - typedef struct FT_HashRec_* FT_Hash; - - - /*********************************************************** - * - * @type: FT_HashNode - * - * @description: - * handle to a @FT_HashNodeRec structure used to model a - * single node of a hash table - */ - typedef struct FT_HashNodeRec_* FT_HashNode; - - - /*********************************************************** - * - * @type: FT_HashLookup - * - * @description: - * handle to a @FT_HashNode pointer. This is returned by - * the @ft_hash_lookup function and can later be used by - * @ft_hash_add or @ft_hash_remove - */ - typedef FT_HashNode* FT_HashLookup; - - - /*********************************************************** - * - * @type: FT_Hash_EqualFunc - * - * @description: - * a function used to compare two nodes of the hash table - * - * @input: - * node1 :: handle to first node - * node2 :: handle to second node - * - * @return: - * 1 iff the 'keys' in 'node1' and 'node2' are identical. - * 0 otherwise. - */ - typedef FT_Int (*FT_Hash_EqualFunc)( FT_HashNode node1, - FT_HashNode node2 ); - - - /*********************************************************** - * - * @struct: FT_HashRec - * - * @description: - * a structure used to model a dynamic hash table. - * - * @fields: - * memory :: memory manager used to allocate - * the buckets array and the hash nodes - * - * buckets :: array of hash buckets - * - * node_size :: size of node in bytes - * node_compare :: a function used to compare two nodes - * node_hash :: a function used to compute the hash - * value of a given node - * p :: - * mask :: - * slack :: - * - * @note: - * 'p', 'mask' and 'slack' are control values managed by - * the hash table. Do not try to interpret them directly. - * - * You can grab the hash table size by calling - * '@ft_hash_get_size'. - */ - typedef struct FT_HashRec_ - { - FT_HashNode* buckets; - FT_UInt p; - FT_UInt mask; /* really maxp-1 */ - FT_Long slack; - FT_Hash_EqualFunc node_equal; - FT_Memory memory; - - } FT_HashRec; - - - /*********************************************************** - * - * @struct: FT_HashNodeRec - * - * @description: - * a structure used to model the root fields of a dynamic - * hash table node. - * - * it's up to client applications to "sub-class" this - * structure to add relevant (key,value) definitions - * - * @fields: - * link :: pointer to next node in bucket's collision list - * hash :: 32-bit hash value for this node - * - * @note: - * it's up to client applications to "sub-class" this structure - * to add relevant (key,value) type definitions. For example, - * if we want to build a "string -> int" mapping, we could use - * something like: - * - * { - * typedef struct MyNodeRec_ - * { - * FT_HashNodeRec hnode; - * const char* key; - * int value; - * - * } MyNodeRec, *MyNode; - * } - * - */ - typedef struct FT_HashNodeRec_ - { - FT_HashNode link; - FT_UInt32 hash; - - } FT_HashNodeRec; - - - /**************************************************************** - * - * @function: ft_hash_init - * - * @description: - * initialize a dynamic hash table - * - * @input: - * table :: handle to target hash table structure - * node_equal :: node comparison function - * memory :: memory manager handle used to allocate the - * buckets array within the hash table - * - * @return: - * error code. 0 means success - * - * @note: - * the node comparison function should only compare node _keys_ - * and ignore values !! with good hashing computation (which the - * user must perform itself), the comparison function should be - * pretty seldom called. - * - * here is a simple example: - * - * { - * static int my_equal( MyNode node1, - * MyNode node2 ) - * { - * // compare keys of 'node1' and 'node2' - * return (strcmp( node1->key, node2->key ) == 0); - * } - * - * .... - * - * ft_hash_init( &hash, (FT_Hash_EqualFunc) my_compare, memory ); - * .... - * } - */ - FT_BASE( FT_Error ) - ft_hash_init( FT_Hash table, - FT_Hash_EqualFunc compare, - FT_Memory memory ); - - - /**************************************************************** - * - * @function: ft_hash_lookup - * - * @description: - * search a hash table to find a node corresponding to a given - * key. - * - * @input: - * table :: handle to target hash table structure - * keynode :: handle to a reference hash node that will be - * only used for key comparisons with the table's - * elements - * - * @return: - * a pointer-to-hash-node value, which must be used as followed: - * - * - if '*result' is NULL, the key wasn't found in the hash - * table. The value of 'result' can be used to add new elements - * through @ft_hash_add however.. - * - * - if '*result' is not NULL, it's a handle to the first table - * node that corresponds to the search key. The value of 'result' - * can be used to remove this element through @ft_hash_remove - * - * @note: - * here is an example: - * - * { - * // maps a string to an integer with a hash table - * // returns -1 in case of failure - * // - * int my_lookup( FT_Hash table, - * const char* key ) - * { - * MyNode* pnode; - * MyNodeRec noderec; - * - * // set-up key node. It's 'hash' and 'key' fields must - * // be set correctly.. we ignore 'link' and 'value' - * // - * noderec.hnode.hash = strhash( key ); - * noderec.key = key; - * - * // perform search - return value - * // - * pnode = (MyNode) ft_hash_lookup( table, &noderec ); - * if ( *pnode ) - * { - * // we found it - * return (*pnode)->value; - * } - * return -1; - * } - * } - */ - FT_BASE_DEF( FT_HashLookup ) - ft_hash_lookup( FT_Hash table, - FT_HashNode keynode ); - - - /**************************************************************** - * - * @function: ft_hash_add - * - * @description: - * add a new node to a dynamic hash table. the user must - * call @ft_hash_lookup and allocate a new node before calling - * this function. - * - * @input: - * table :: hash table handle - * lookup :: pointer-to-hash-node value returned by @ft_hash_lookup - * new_node :: handle to new hash node. All its fields must be correctly - * set, including 'hash'. - * - * @return: - * error code. 0 means success - * - * @note: - * this function should always be used _after_ a call to @ft_hash_lookup - * that returns a pointer to a NULL handle. Here's an example: - * - * { - * // sets the value corresponding to a given string key - * // - * void my_set( FT_Hash table, - * const char* key, - * int value ) - * { - * MyNode* pnode; - * MyNodeRec noderec; - * MyNode node; - * - * // set-up key node. It's 'hash' and 'key' fields must - * // be set correctly.. - * noderec.hnode.hash = strhash( key ); - * noderec.key = key; - * - * // perform search - return value - * pnode = (MyNode) ft_hash_lookup( table, &noderec ); - * if ( *pnode ) - * { - * // we found it, simply replace the value in the node - * (*pnode)->value = value; - * return; - * } - * - * // allocate a new node - and set it up - * node = (MyNode) malloc( sizeof(*node) ); - * if ( node == NULL ) ..... - * - * node->hnode.hash = noderec.hnode.hash; - * node->key = key; - * node->value = value; - * - * // add it to the hash table - * error = ft_hash_add( table, pnode, node ); - * if (error) .... - * } - */ - FT_BASE( FT_Error ) - ft_hash_add( FT_Hash table, - FT_HashLookup lookup, - FT_HashNode new_node ); - - - /**************************************************************** - * - * @function: ft_hash_remove - * - * @description: - * try to remove the node corresponding to a given key from - * a hash table. This must be called after @ft_hash_lookup - * - * @input: - * table :: hash table handle - * lookup :: pointer-to-hash-node value returned by @ft_hash_lookup - * - * @note: - * this function doesn't free the node itself !! Here's an example: - * - * { - * // sets the value corresponding to a given string key - * // - * void my_remove( FT_Hash table, - * const char* key ) - * { - * MyNodeRec noderec; - * MyNode node; - * - * noderec.hnode.hash = strhash(key); - * noderec.key = key; - * node = &noderec; - * - * pnode = ft_hash_lookup( table, &noderec ); - * node = *pnode; - * if ( node != NULL ) - * { - * error = ft_hash_remove( table, pnode ); - * if ( !error ) - * free( node ); - * } - * } - * } - */ - FT_BASE( FT_Error ) - ft_hash_remove( FT_Hash table, - FT_HashLookup lookup ); - - - - /**************************************************************** - * - * @function: ft_hash_get_size - * - * @description: - * return the number of elements in a given hash table - * - * @input: - * table :: handle to target hash table structure - * - * @return: - * number of elements. 0 if empty - */ - FT_BASE( FT_UInt ) - ft_hash_get_size( FT_Hash table ); - - - - /**************************************************************** - * - * @functype: FT_Hash_ForeachFunc - * - * @description: - * a function used to iterate over all elements of a given - * hash table - * - * @input: - * node :: handle to target @FT_HashNodeRec node structure - * data :: optional argument to iteration routine - * - * @also: @ft_hash_foreach - */ - typedef void (*FT_Hash_ForeachFunc)( const FT_HashNode node, - const FT_Pointer data ); - - - /**************************************************************** - * - * @function: ft_hash_foreach - * - * @description: - * parse over all elements in a hash table - * - * @input: - * table :: handle to target hash table structure - * foreach_func :: iteration routine called for each element - * foreach_data :: optional argument to the iteration routine - * - * @note: - * this function is often used to release all elements from a - * hash table. See the example given for @ft_hash_done - */ - FT_BASE( void ) - ft_hash_foreach( FT_Hash table, - FT_Hash_ForeachFunc foreach_func, - const FT_Pointer foreach_data ); - - - - /**************************************************************** - * - * @function: ft_hash_done - * - * @description: - * finalize a given hash table - * - * @input: - * table :: handle to target hash table structure - * node_func :: optional iteration function pointer. this - * can be used to destroy all nodes explicitely - * node_data :: optional argument to the node iterator - * - * @note: - * this function simply frees the hash table's buckets. - * you probably will need to call @ft_hash_foreach to - * destroy all its elements before @ft_hash_done, as in - * the following example: - * - * { - * static void my_node_clear( const MyNode node ) - * { - * free( node ); - * } - * - * static void my_done( FT_Hash table ) - * { - * ft_hash_done( table, (FT_Hash_ForeachFunc) my_node_clear, NULL ); - * } - * } - */ - FT_BASE( void ) - ft_hash_done( FT_Hash table, - FT_Hash_ForeachFunc item_func, - const FT_Pointer item_data ); - - /* */ - - /* compute bucket index from hash value in a dynamic hash table */ - /* this is only used to break encapsulation to speed lookups in */ - /* the FreeType cache manager !! */ - /* */ - -#define FT_HASH_COMPUTE_INDEX(_table,_hash,_index) \ - { \ - FT_UInt _mask = (_table)->mask; \ - FT_UInt _hash0 = (_hash); \ - \ - (_index) = (FT_UInt)( (_hash0) & _mask ) ); \ - if ( (_index) < (_table)->p ) \ - (_index) = (FT_uInt)( (_hash0) & ( 2*_mask+1 ) ); \ - } - - -FT_END_HEADER - -#endif /* __FT_HASH_H__ */ diff --git a/reactos/lib/freetype/include/freetype/internal/ftmemory.h b/reactos/lib/freetype/include/freetype/internal/ftmemory.h index 8da5fadc3c6..63f37aff7ce 100644 --- a/reactos/lib/freetype/include/freetype/internal/ftmemory.h +++ b/reactos/lib/freetype/include/freetype/internal/ftmemory.h @@ -4,7 +4,7 @@ /* */ /* The FreeType memory management macros (specification). */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 1996-2001, 2002, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -180,6 +180,12 @@ FT_BEGIN_HEADER #define FT_ZERO( p ) FT_MEM_ZERO( p, sizeof ( *(p) ) ) +#define FT_ARRAY_COPY( dest, source, count ) \ + FT_MEM_COPY( dest, source, (count) * sizeof( *(dest) ) ) + +#define FT_ARRAY_MOVE( dest, source, count ) \ + FT_MEM_MOVE( dest, source, (count) * sizeof( *(dest) ) ) + /*************************************************************************/ /* */ diff --git a/reactos/lib/freetype/include/freetype/internal/ftobject.h b/reactos/lib/freetype/include/freetype/internal/ftobject.h deleted file mode 100644 index f285d9e207b..00000000000 --- a/reactos/lib/freetype/include/freetype/internal/ftobject.h +++ /dev/null @@ -1,533 +0,0 @@ -#ifndef __FT_OBJECT_H__ -#define __FT_OBJECT_H__ - -#include <ft2build.h> -#include FT_FREETYPE_H - -FT_BEGIN_HEADER - - /************************************************************** - * - * @type: FT_Object - * - * @description: - * handle to a FreeType Object. See @FT_ObjectRec - */ - typedef struct FT_ObjectRec_* FT_Object; - - - /************************************************************** - * - * @type: FT_Class - * - * @description: - * handle to a constant class handle to a FreeType Object. - * - * Note that a class is itself a @FT_Object and are dynamically - * allocated on the heap. - * - * @also: - * @FT_ClassRec, @FT_Object, @FT_ObjectRec, @FT_Type, @FT_TypeRec - */ - typedef const struct FT_ClassRec_* FT_Class; - - - /************************************************************** - * - * @type: FT_Type - * - * @description: - * handle to a constant structure (of type @FT_TypeRec) used - * to describe a given @FT_Class type to the FreeType object - * sub-system. - */ - typedef const struct FT_TypeRec_* FT_Type; - - - - /************************************************************** - * - * @struct: FT_ObjectRec - * - * @description: - * a structure describing the root fields of all @FT_Object - * class instances in FreeType - * - * @fields: - * clazz :: handle to the object's class - * ref_count :: object's reference count. Starts at 1 - */ - typedef struct FT_ObjectRec_ - { - FT_Class clazz; - FT_Int ref_count; - - } FT_ObjectRec; - - - /************************************************************** - * - * @macro: FT_OBJECT (x) - * - * @description: - * a useful macro to type-cast anything to a @FT_Object - * handle. No check performed.. - */ -#define FT_OBJECT(x) ((FT_Object)(x)) - - - /************************************************************** - * - * @macro: FT_OBJECT_P (x) - * - * @description: - * a useful macro to type-cast anything to a pointer to - * @FT_Object handle. - */ -#define FT_OBJECT_P(x) ((FT_Object*)(x)) - - - /************************************************************** - * - * @macro: FT_OBJECT__CLASS (obj) - * - * @description: - * a useful macro to return the class of any object - */ -#define FT_OBJECT__CLASS(x) FT_OBJECT(x)->clazz - - - /************************************************************** - * - * @macro: FT_OBJECT__REF_COUNT (obj) - * - * @description: - * a useful macro to return the reference count of any object - */ -#define FT_OBJECT__REF_COUNT(x) FT_OBJECT(x)->ref_count - - - /************************************************************** - * - * @macro: FT_OBJECT__MEMORY (obj) - * - * @description: - * a useful macro to return a handle to the memory manager - * used to allocate a given object - */ -#define FT_OBJECT__MEMORY(x) FT_CLASS__MEMORY(FT_OBJECT(x)->clazz) - - - /************************************************************** - * - * @macro: FT_OBJECT__LIBRARY (obj) - * - * @description: - * a useful macro to return a handle to the library handle - * that owns the object - */ -#define FT_OBJECT__LIBRARY(x) FT_CLASS__LIBRARY(FT_OBJECT(x)->clazz) - - - /************************************************************** - * - * @functype: FT_Object_InitFunc - * - * @description: - * a function used to initialize a new object - * - * @input: - * object :: target object handle - * init_data :: optional pointer to initialization data - * - * @return: - * error code. 0 means success - */ - typedef FT_Error (*FT_Object_InitFunc)( FT_Object object, - FT_Pointer init_data ); - - /************************************************************** - * - * @functype: FT_Object_DoneFunc - * - * @description: - * a function used to finalize a given object - * - * @input: - * object :: handle to target object - */ - typedef void (*FT_Object_DoneFunc)( FT_Object object ); - - - /************************************************************** - * - * @struct: FT_ClassRec - * - * @description: - * a structure used to describe a given object class within - * FreeType - * - * @fields: - * object :: root @FT_ObjectRec fields, since each class is - * itself an object. (it's an instance of the - * "metaclass", a special object of the FreeType - * object sub-system.) - * - * magic :: a 32-bit magic number used for decoding - * super :: pointer to super class - * type :: the @FT_Type descriptor of this class - * memory :: the current memory manager handle - * library :: the current library handle - * info :: an opaque pointer to class-specific information - * managed by the FreeType object sub-system - * - * class_done :: the class destructor function - * - * obj_size :: size of class instances in bytes - * obj_init :: class instance constructor - * obj_done :: class instance destructor - */ - typedef struct FT_ClassRec_ - { - FT_ObjectRec object; - FT_UInt32 magic; - FT_Class super; - FT_Type type; - FT_Memory memory; - FT_Library library; - FT_Pointer info; - - FT_Object_DoneFunc class_done; - - FT_UInt obj_size; - FT_Object_InitFunc obj_init; - FT_Object_DoneFunc obj_done; - - } FT_ClassRec; - - - /************************************************************** - * - * @macro: FT_CLASS (x) - * - * @description: - * a useful macro to convert anything to a class handle - * without checks - */ -#define FT_CLASS(x) ((FT_Class)(x)) - - - /************************************************************** - * - * @macro: FT_CLASS_P (x) - * - * @description: - * a useful macro to convert anything to a pointer to a class - * handle without checks - */ -#define FT_CLASS_P(x) ((FT_Class*)(x)) - - - /************************************************************** - * - * @macro: FT_CLASS__MEMORY (clazz) - * - * @description: - * a useful macro to return the memory manager handle of a - * given class - */ -#define FT_CLASS__MEMORY(x) FT_CLASS(x)->memory - - - /************************************************************** - * - * @macro: FT_CLASS__LIBRARY (clazz) - * - * @description: - * a useful macro to return the library handle of a - * given class - */ -#define FT_CLASS__LIBRARY(x) FT_CLASS(x)->library - - - - /************************************************************** - * - * @macro: FT_CLASS__TYPE (clazz) - * - * @description: - * a useful macro to return the type of a given class - * given class - */ -#define FT_CLASS__TYPE(x) FT_CLASS(x)->type - - /* */ -#define FT_CLASS__INFO(x) FT_CLASS(x)->info -#define FT_CLASS__MAGIC(x) FT_CLASS(x)->magic - - - /************************************************************** - * - * @struct: FT_TypeRec - * - * @description: - * a structure used to describe a given class to the FreeType - * object sub-system. - * - * @fields: - * name :: class name. only used for debugging - * super :: type of super-class. NULL if none - * - * class_size :: size of class structure in bytes - * class_init :: class constructor - * class_done :: class finalizer - * - * obj_size :: instance size in bytes - * obj_init :: instance constructor. can be NULL - * obj_done :: instance destructor. can be NULL - * - * @note: - * if 'obj_init' is NULL, the class will use it's parent - * constructor, if any - * - * if 'obj_done' is NULL, the class will use it's parent - * finalizer, if any - * - * the object sub-system allocates a new class, copies - * the content of its super-class into the new structure, - * _then_ calls 'clazz_init'. - * - * 'class_init' and 'class_done' can be NULL, in which case - * the parent's class constructor and destructor wil be used - */ - typedef struct FT_TypeRec_ - { - const char* name; - FT_Type super; - - FT_UInt class_size; - FT_Object_InitFunc class_init; - FT_Object_DoneFunc class_done; - - FT_UInt obj_size; - FT_Object_InitFunc obj_init; - FT_Object_DoneFunc obj_done; - - } FT_TypeRec; - - - /************************************************************** - * - * @macro: FT_TYPE (x) - * - * @description: - * a useful macro to convert anything to a class type handle - * without checks - */ -#define FT_TYPE(x) ((FT_Type)(x)) - - - /************************************************************** - * - * @function: ft_object_check - * - * @description: - * checks that a handle points to a valid @FT_Object - * - * @input: - * obj :: handle/pointer - * - * @return: - * 1 iff the handle points to a valid object. 0 otherwise - */ - FT_BASE( FT_Int ) - ft_object_check( FT_Pointer obj ); - - - /************************************************************** - * - * @function: ft_object_is_a - * - * @description: - * checks that a handle points to a valid @FT_Object that - * is an instance of a given class (or of any of its sub-classes) - * - * @input: - * obj :: handle/pointer - * clazz :: class handle to check - * - * @return: - * 1 iff the handle points to a valid 'clazz' instance. 0 - * otherwise. - */ - FT_BASE( FT_Int ) - ft_object_is_a( FT_Pointer obj, - FT_Class clazz ); - - - /************************************************************** - * - * @function: ft_object_create - * - * @description: - * create a new object (class instance) - * - * @output: - * aobject :: new object handle. NULL in case of error - * - * @input: - * clazz :: object's class pointer - * init_data :: optional pointer to initialization data - * - * @return: - * error code. 0 means success - */ - FT_BASE( FT_Error ) - ft_object_create( FT_Object *aobject, - FT_Class clazz, - FT_Pointer init_data ); - - - /************************************************************** - * - * @function: ft_object_create_from_type - * - * @description: - * create a new object (class instance) from a @FT_Type - * - * @output: - * aobject :: new object handle. NULL in case of error - * - * @input: - * type :: object's type descriptor - * init_data :: optional pointer to initialization data - * - * @return: - * error code. 0 means success - * - * @note: - * this function is slower than @ft_object_create - * - * this is equivalent to calling @ft_class_from_type followed by - * @ft_object_create - */ - FT_BASE( FT_Error ) - ft_object_create_from_type( FT_Object *aobject, - FT_Type type, - FT_Pointer init_data, - FT_Library library ); - - - - /************************************************************** - * - * @macro FT_OBJ_CREATE (object,class,init) - * - * @description: - * a convenient macro used to create new objects. see - * @ft_object_create for details - */ -#define FT_OBJ_CREATE( _obj, _clazz, _init ) \ - ft_object_create( FT_OBJECT_P(&(_obj)), _clazz, _init ) - - - /************************************************************** - * - * @macro FT_CREATE (object,class,init) - * - * @description: - * a convenient macro used to create new objects. It also - * sets an _implicit_ local variable named "error" to the error - * code returned by the object constructor. - */ -#define FT_CREATE( _obj, _clazz, _init ) \ - FT_SET_ERROR( FT_OBJ_CREATE( _obj, _clazz, _init ) ) - - /************************************************************** - * - * @macro FT_OBJ_CREATE_FROM_TYPE (object,type,init) - * - * @description: - * a convenient macro used to create new objects. see - * @ft_object_create_from_type for details - */ -#define FT_OBJ_CREATE_FROM_TYPE( _obj, _type, _init, _lib ) \ - ft_object_create_from_type( FT_OBJECT_P(&(_obj)), _type, _init, _lib ) - - - /************************************************************** - * - * @macro FT_CREATE_FROM_TYPE (object,type,init) - * - * @description: - * a convenient macro used to create new objects. It also - * sets an _implicit_ local variable named "error" to the error - * code returned by the object constructor. - */ -#define FT_CREATE_FROM_TYPE( _obj, _type, _init, _lib ) \ - FT_SET_ERROR( FT_OBJ_CREATE_FROM_TYPE( _obj, _type, _init, _lib ) ) - - - /* */ - - /************************************************************** - * - * @function: ft_class_from_type - * - * @description: - * retrieves the class object corresponding to a given type - * descriptor. The class is created when needed - * - * @output: - * aclass :: handle to corresponding class object. NULL in - * case of error - * - * @input: - * type :: type descriptor handle - * library :: library handle - * - * @return: - * error code. 0 means success - */ - FT_BASE( FT_Error ) - ft_class_from_type( FT_Class *aclass, - FT_Type type, - FT_Library library ); - - - /* */ - -#include FT_INTERNAL_HASH_H - - typedef struct FT_ClassHNodeRec_* FT_ClassHNode; - - typedef struct FT_ClassHNodeRec_ - { - FT_HashNodeRec hnode; - FT_Type type; - FT_Class clazz; - - } FT_ClassHNodeRec; - - typedef struct FT_MetaClassRec_ - { - FT_ClassRec clazz; /* the meta-class is a class itself */ - FT_HashRec type_to_class; /* the type => class hash table */ - - } FT_MetaClassRec, *FT_MetaClass; - - - /* initialize meta class */ - FT_BASE( FT_Error ) - ft_metaclass_init( FT_MetaClass meta, - FT_Library library ); - - /* finalize meta class - destroy all registered class objects */ - FT_BASE( void ) - ft_metaclass_done( FT_MetaClass meta ); - - /* */ - -FT_END_HEADER - -#endif /* __FT_OBJECT_H__ */ diff --git a/reactos/lib/freetype/include/freetype/internal/ftobjs.h b/reactos/lib/freetype/include/freetype/internal/ftobjs.h index 79319e8742b..3a28119af19 100644 --- a/reactos/lib/freetype/include/freetype/internal/ftobjs.h +++ b/reactos/lib/freetype/include/freetype/internal/ftobjs.h @@ -4,7 +4,7 @@ /* */ /* The FreeType private base classes (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -34,7 +34,7 @@ #include FT_INTERNAL_GLYPH_LOADER_H #include FT_INTERNAL_DRIVER_H #include FT_INTERNAL_AUTOHINT_H -#include FT_INTERNAL_OBJECT_H +#include FT_INTERNAL_SERVICE_H #ifdef FT_CONFIG_OPTION_INCREMENTAL #include FT_INCREMENTAL_H @@ -64,19 +64,21 @@ FT_BEGIN_HEADER /*************************************************************************/ /* */ /* The min and max functions missing in C. As usual, be careful not to */ - /* write things like MIN( a++, b++ ) to avoid side effects. */ + /* write things like FT_MIN( a++, b++ ) to avoid side effects. */ /* */ -#ifndef MIN -#define MIN( a, b ) ( (a) < (b) ? (a) : (b) ) -#endif +#define FT_MIN( a, b ) ( (a) < (b) ? (a) : (b) ) +#define FT_MAX( a, b ) ( (a) > (b) ? (a) : (b) ) -#ifndef MAX -#define MAX( a, b ) ( (a) > (b) ? (a) : (b) ) -#endif +#define FT_ABS( a ) ( (a) < 0 ? -(a) : (a) ) -#ifndef ABS -#define ABS( a ) ( (a) < 0 ? -(a) : (a) ) -#endif + +#define FT_PAD_FLOOR( x, n ) ( (x) & ~((n)-1) ) +#define FT_PAD_ROUND( x, n ) FT_PAD_FLOOR( (x) + ((n)/2), n ) +#define FT_PAD_CEIL( x, n ) FT_PAD_FLOOR( (x) + ((n)-1), n ) + +#define FT_PIX_FLOOR( x ) ( (x) & ~63 ) +#define FT_PIX_ROUND( x ) FT_PIX_FLOOR( (x) + 32 ) +#define FT_PIX_CEIL( x ) FT_PIX_FLOOR( (x) + 63 ) /*************************************************************************/ @@ -271,51 +273,52 @@ FT_BEGIN_HEADER /* FreeType. */ /* */ /* <Fields> */ - /* max_points :: The maximal number of points used to store the */ - /* vectorial outline of any glyph in this face. */ - /* If this value cannot be known in advance, or */ - /* if the face isn't scalable, this should be set */ - /* to 0. Only relevant for scalable formats. */ + /* max_points :: */ + /* The maximal number of points used to store the vectorial outline */ + /* of any glyph in this face. If this value cannot be known in */ + /* advance, or if the face isn't scalable, this should be set to 0. */ + /* Only relevant for scalable formats. */ /* */ - /* max_contours :: The maximal number of contours used to store */ - /* the vectorial outline of any glyph in this */ - /* face. If this value cannot be known in */ - /* advance, or if the face isn't scalable, this */ - /* should be set to 0. Only relevant for */ - /* scalable formats. */ + /* max_contours :: */ + /* The maximal number of contours used to store the vectorial */ + /* outline of any glyph in this face. If this value cannot be */ + /* known in advance, or if the face isn't scalable, this should be */ + /* set to 0. Only relevant for scalable formats. */ /* */ - /* transform_matrix :: A 2x2 matrix of 16.16 coefficients used to */ - /* transform glyph outlines after they are loaded */ - /* from the font. Only used by the convenience */ - /* functions. */ + /* transform_matrix :: */ + /* A 2x2 matrix of 16.16 coefficients used to transform glyph */ + /* outlines after they are loaded from the font. Only used by the */ + /* convenience functions. */ /* */ - /* transform_delta :: A translation vector used to transform glyph */ - /* outlines after they are loaded from the font. */ - /* Only used by the convenience functions. */ + /* transform_delta :: */ + /* A translation vector used to transform glyph outlines after they */ + /* are loaded from the font. Only used by the convenience */ + /* functions. */ /* */ - /* transform_flags :: Some flags used to classify the transform. */ - /* Only used by the convenience functions. */ + /* transform_flags :: */ + /* Some flags used to classify the transform. Only used by the */ + /* convenience functions. */ /* */ - /* postscript_name :: Postscript font name for this face. */ + /* services :: */ + /* A cache for frequently used services. It should be only */ + /* accessed with the macro `FT_FACE_LOOKUP_SERVICE'. */ /* */ /* incremental_interface :: */ - /* If non-null, the interface through */ - /* which glyph data and metrics are loaded */ - /* incrementally for faces that do not provide */ - /* all of this data when first opened. */ - /* This field exists only if */ - /* @FT_CONFIG_OPTION_INCREMENTAL is defined. */ + /* If non-null, the interface through which glyph data and metrics */ + /* are loaded incrementally for faces that do not provide all of */ + /* this data when first opened. This field exists only if */ + /* @FT_CONFIG_OPTION_INCREMENTAL is defined. */ /* */ typedef struct FT_Face_InternalRec_ { - FT_UShort max_points; - FT_Short max_contours; + FT_UShort max_points; + FT_Short max_contours; - FT_Matrix transform_matrix; - FT_Vector transform_delta; - FT_Int transform_flags; + FT_Matrix transform_matrix; + FT_Vector transform_delta; + FT_Int transform_flags; - const char* postscript_name; + FT_ServiceCacheRec services; #ifdef FT_CONFIG_OPTION_INCREMENTAL FT_Incremental_InterfaceRec* incremental_interface; @@ -466,6 +469,10 @@ FT_BEGIN_HEADER FT_Get_Module_Interface( FT_Library library, const char* mod_name ); + FT_BASE( FT_Pointer ) + ft_module_get_service( FT_Module module, + const char* service_id ); + /* */ @@ -704,6 +711,12 @@ FT_BEGIN_HEADER /* generic :: Client data variable. Used to extend the */ /* Library class by higher levels and clients. */ /* */ + /* version_major :: The major version number of the library. */ + /* */ + /* version_minor :: The minor version number of the library. */ + /* */ + /* version_patch :: The current patch level of the library. */ + /* */ /* num_modules :: The number of modules currently registered */ /* within this library. This is set to 0 for new */ /* libraries. New modules are added through the */ @@ -754,8 +767,6 @@ FT_BEGIN_HEADER FT_DebugHook_Func debug_hooks[4]; - FT_MetaClassRec meta_class; - } FT_LibraryRec; diff --git a/reactos/lib/freetype/include/freetype/internal/ftrfork.h b/reactos/lib/freetype/include/freetype/internal/ftrfork.h new file mode 100644 index 00000000000..e7b10024adf --- /dev/null +++ b/reactos/lib/freetype/include/freetype/internal/ftrfork.h @@ -0,0 +1,184 @@ +/***************************************************************************/ +/* */ +/* ftrfork.h */ +/* */ +/* Embedded resource forks accessor (specification). */ +/* */ +/* Copyright 2004 by */ +/* Masatake YAMATO and Redhat K.K. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* Development of the code in this file is support of */ +/* Information-technology Promotion Agency, Japan. */ +/***************************************************************************/ + + +#ifndef __FTRFORK_H__ +#define __FTRFORK_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + + /* Number of guessing rules supported in `FT_Raccess_Guess'. */ + /* Don't forget to increment the number if you add a new guessing rule. */ +#define FT_RACCESS_N_RULES 8 + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Raccess_Guess */ + /* */ + /* <Description> */ + /* Guess a file name and offset where the actual resource fork is */ + /* stored. The macro FT_RACCESS_N_RULES holds the number of */ + /* guessing rules; the guessed result for the Nth rule is */ + /* represented as a triplet: a new file name (new_names[N]), a file */ + /* offset (offsets[N]), and an error code (errors[N]). */ + /* */ + /* <Input> */ + /* library :: */ + /* A FreeType library instance. */ + /* */ + /* stream :: */ + /* A file stream containing the resource fork. */ + /* */ + /* base_name :: */ + /* The (base) file name of the resource fork used for some */ + /* guessing rules. */ + /* */ + /* <Output> */ + /* new_names :: */ + /* An array of guessed file names in which the resource forks may */ + /* exist. If `new_names[N]' is NULL, the guessed file name is */ + /* equal to `base_name'. */ + /* */ + /* offsets :: */ + /* An array of guessed file offsets. `offsets[N]' holds the file */ + /* offset of the possible start of the resource fork in file */ + /* `new_names[N]'. */ + /* */ + /* errors :: */ + /* An array of FreeType error codes. `errors[N]' is the error */ + /* code of Nth guessing rule function. If `errors[N]' is not */ + /* FT_Err_Ok, `new_names[N]' and `offsets[N]' are meaningless. */ + /* */ + FT_BASE( void ) + FT_Raccess_Guess( FT_Library library, + FT_Stream stream, + char* base_name, + char** new_names, + FT_Long* offsets, + FT_Error* errors ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Raccess_Get_HeaderInfo */ + /* */ + /* <Description> */ + /* Get the information from the header of resource fork. The */ + /* information includes the file offset where the resource map */ + /* starts, and the file offset where the resource data starts. */ + /* `FT_Raccess_Get_DataOffsets' requires these two data. */ + /* */ + /* <Input> */ + /* library :: */ + /* A FreeType library instance. */ + /* */ + /* stream :: */ + /* A file stream containing the resource fork. */ + /* */ + /* rfork_offset :: */ + /* The file offset where the resource fork starts. */ + /* */ + /* <Output> */ + /* map_offset :: */ + /* The file offset where the resource map starts. */ + /* */ + /* rdata_pos :: */ + /* The file offset where the resource data starts. */ + /* */ + /* <Return> */ + /* FreeType error code. FT_Err_Ok means success. */ + /* */ + FT_BASE( FT_Error ) + FT_Raccess_Get_HeaderInfo( FT_Library library, + FT_Stream stream, + FT_Long rfork_offset, + FT_Long *map_offset, + FT_Long *rdata_pos ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Raccess_Get_DataOffsets */ + /* */ + /* <Description> */ + /* Get the data offsets for a tag in a resource fork. Offsets are */ + /* stored in an array because, in some cases, resources in a resource */ + /* fork have the same tag. */ + /* */ + /* <Input> */ + /* library :: */ + /* A FreeType library instance. */ + /* */ + /* stream :: */ + /* A file stream containing the resource fork. */ + /* */ + /* map_offset :: */ + /* The file offset where the resource map starts. */ + /* */ + /* rdata_pos :: */ + /* The file offset where the resource data starts. */ + /* */ + /* tag :: */ + /* The resource tag. */ + /* */ + /* <Output> */ + /* offsets :: */ + /* The stream offsets for the resource data specified by `tag'. */ + /* This array is allocated by the function, so you have to call */ + /* @FT_Free after use. */ + /* */ + /* count :: */ + /* The length of offsets array. */ + /* */ + /* <Return> */ + /* FreeType error code. FT_Err_Ok means success. */ + /* */ + /* <Note> */ + /* Normally you should use `FT_Raccess_Get_HeaderInfo' to get the */ + /* value for `map_offset' and `rdata_pos'. */ + /* */ + FT_BASE( FT_Error ) + FT_Raccess_Get_DataOffsets( FT_Library library, + FT_Stream stream, + FT_Long map_offset, + FT_Long rdata_pos, + FT_Long tag, + FT_Long **offsets, + FT_Long *count ); + + +FT_END_HEADER + +#endif /* __FTRFORK_H__ */ + + +/* END */ diff --git a/reactos/lib/freetype/include/freetype/internal/ftserv.h b/reactos/lib/freetype/include/freetype/internal/ftserv.h new file mode 100644 index 00000000000..e5ed8895b36 --- /dev/null +++ b/reactos/lib/freetype/include/freetype/internal/ftserv.h @@ -0,0 +1,260 @@ +/***************************************************************************/ +/* */ +/* ftserv.h */ +/* */ +/* The FreeType services (specification only). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* Each module can export one or more `services'. Each service is */ + /* identified by a constant string and modeled by a pointer; the latter */ + /* generally corresponds to a structure containing function pointers. */ + /* */ + /* Note that a service's data cannot be a mere function pointer because */ + /* in C it is possible that function pointers might be implemented */ + /* differently than data pointers (e.g. 48 bits instead of 32). */ + /* */ + /*************************************************************************/ + + +#ifndef __FTSERV_H__ +#define __FTSERV_H__ + + +FT_BEGIN_HEADER + + + /* + * @macro: + * FT_FACE_FIND_SERVICE + * + * @description: + * This macro is used to look up a service from a face's driver module. + * + * @input: + * face :: + * The source face handle. + * + * id :: + * A string describing the service as defined in the service's + * header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to + * `multi-masters'). It is automatically prefixed with + * `FT_SERVICE_ID_'. + * + * @output: + * ptr :: + * A variable that receives the service pointer. Will be NULL + * if not found. + */ +#define FT_FACE_FIND_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE(face)->driver ); \ + /* the strange cast is to allow C++ compilation */ \ + FT_Pointer* Pptr = (FT_Pointer*) &(ptr); \ + \ + \ + *Pptr = NULL; \ + if ( module->clazz->get_interface ) \ + *Pptr = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \ + FT_END_STMNT + + + /* + * @macro: + * FT_FACE_FIND_GLOBAL_SERVICE + * + * @description: + * This macro is used to look up a service from all modules. + * + * @input: + * face :: + * The source face handle. + * + * id :: + * A string describing the service as defined in the service's + * header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to + * `multi-masters'). It is automatically prefixed with + * `FT_SERVICE_ID_'. + * + * @output: + * ptr :: + * A variable that receives the service pointer. Will be NULL + * if not found. + */ +#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE(face)->driver ); \ + /* the strange cast is to allow C++ compilation */ \ + FT_Pointer* Pptr = (FT_Pointer*) &(ptr); \ + \ + \ + *Pptr = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \ + FT_END_STMNT + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S E R V I C E D E S C R I P T O R S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * The following structure is used to _describe_ a given service + * to the library. This is useful to build simple static service lists. + */ + typedef struct FT_ServiceDescRec_ + { + const char* serv_id; /* service name */ + const void* serv_data; /* service pointer/data */ + + } FT_ServiceDescRec; + + typedef const FT_ServiceDescRec* FT_ServiceDesc; + + + /* + * Parse a list of FT_ServiceDescRec descriptors and look for + * a specific service by ID. Note that the last element in the + * array must be { NULL, NULL }, and that the function should + * return NULL if the service isn't available. + * + * This function can be used by modules to implement their + * `get_service' method. + */ + FT_BASE( FT_Pointer ) + ft_service_list_lookup( FT_ServiceDesc service_descriptors, + const char* service_id ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S E R V I C E S C A C H E *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * This structure is used to store a cache for several frequently used + * services. It is the type of `face->internal->services'. You + * should only use FT_FACE_LOOKUP_SERVICE to access it. + * + * All fields should have the type FT_Pointer to relax compilation + * dependencies. We assume the developer isn't completely stupid. + * + * Each field must be named `service_XXXX' where `XXX' corresponds to + * the correct FT_SERVICE_ID_XXXX macro. See the definition of + * FT_FACE_LOOKUP_SERVICE below how this is implemented. + * + */ + typedef struct FT_ServiceCacheRec_ + { + FT_Pointer service_POSTSCRIPT_FONT_NAME; + FT_Pointer service_MULTI_MASTERS; + FT_Pointer service_GLYPH_DICT; + FT_Pointer service_PFR_METRICS; + FT_Pointer service_WINFNT; + + } FT_ServiceCacheRec, *FT_ServiceCache; + + + /* + * A magic number used within the services cache. + */ +#define FT_SERVICE_UNAVAILABLE ((FT_Pointer)-2) /* magic number */ + + + /* + * @macro: + * FT_FACE_LOOKUP_SERVICE + * + * @description: + * This macro is used to lookup a service from a face's driver module + * using its cache. + * + * @input: + * face:: + * The source face handle containing the cache. + * + * field :: + * The field name in the cache. + * + * id :: + * The service ID. + * + * @output: + * ptr :: + * A variable receiving the service data. NULL if not available. + */ +#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + /* the strange cast is to allow C++ compilation */ \ + FT_Pointer* pptr = (FT_Pointer*)&(ptr); \ + FT_Pointer svc; \ + \ + \ + svc = FT_FACE(face)->internal->services. service_ ## id ; \ + if ( svc == FT_SERVICE_UNAVAILABLE ) \ + svc = NULL; \ + else if ( svc == NULL ) \ + { \ + FT_FACE_FIND_SERVICE( face, svc, id ); \ + \ + FT_FACE(face)->internal->services. service_ ## id = \ + (FT_Pointer)( svc != NULL ? svc \ + : FT_SERVICE_UNAVAILABLE ); \ + } \ + *pptr = svc; \ + FT_END_STMNT + + + /* + * A macro used to define new service structure types. + */ + +#define FT_DEFINE_SERVICE( name ) \ + typedef struct FT_Service_ ## name ## Rec_ \ + FT_Service_ ## name ## Rec ; \ + typedef struct FT_Service_ ## name ## Rec_ \ + const * FT_Service_ ## name ; \ + struct FT_Service_ ## name ## Rec_ + + /* */ + + /* + * The header files containing the services. + */ + +#define FT_SERVICE_MULTIPLE_MASTERS_H <freetype/internal/services/svmm.h> +#define FT_SERVICE_POSTSCRIPT_NAME_H <freetype/internal/services/svpostnm.h> +#define FT_SERVICE_POSTSCRIPT_CMAPS_H <freetype/internal/services/svpscmap.h> +#define FT_SERVICE_POSTSCRIPT_INFO_H <freetype/internal/services/svpsinfo.h> +#define FT_SERVICE_GLYPH_DICT_H <freetype/internal/services/svgldict.h> +#define FT_SERVICE_BDF_H <freetype/internal/services/svbdf.h> +#define FT_SERVICE_XFREE86_NAME_H <freetype/internal/services/svxf86nm.h> +#define FT_SERVICE_SFNT_H <freetype/internal/services/svsfnt.h> +#define FT_SERVICE_PFR_H <freetype/internal/services/svpfr.h> +#define FT_SERVICE_WINFNT_H <freetype/internal/services/svwinfnt.h> +#define FT_SERVICE_TT_CMAP_H <freetype/internal/services/svttcmap.h> + + /* */ + +FT_END_HEADER + +#endif /* __FTSERV_H__ */ + + +/* END */ diff --git a/reactos/lib/freetype/include/freetype/internal/ftstream.h b/reactos/lib/freetype/include/freetype/internal/ftstream.h index 618f64aacd9..87576fd0e92 100644 --- a/reactos/lib/freetype/include/freetype/internal/ftstream.h +++ b/reactos/lib/freetype/include/freetype/internal/ftstream.h @@ -4,7 +4,7 @@ /* */ /* Stream handling (specification). */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 1996-2001, 2002, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -315,6 +315,17 @@ FT_BEGIN_HEADER #endif /* FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */ + /* create a new (input) stream from an FT_Open_Args structure */ + FT_BASE( FT_Error ) + FT_Stream_New( FT_Library library, + const FT_Open_Args* args, + FT_Stream *astream ); + + /* free a stream */ + FT_BASE( void ) + FT_Stream_Free( FT_Stream stream, + FT_Int external ); + /* initialize a stream for reading in-memory data */ FT_BASE( void ) FT_Stream_OpenMemory( FT_Stream stream, diff --git a/reactos/lib/freetype/include/freetype/internal/fttrace.h b/reactos/lib/freetype/include/freetype/internal/fttrace.h index ffc0b141753..dffe9cfee92 100644 --- a/reactos/lib/freetype/include/freetype/internal/fttrace.h +++ b/reactos/lib/freetype/include/freetype/internal/fttrace.h @@ -4,7 +4,7 @@ /* */ /* Tracing handling (specification only). */ /* */ -/* Copyright 2002 by */ +/* Copyright 2002, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -16,12 +16,12 @@ /***************************************************************************/ -/* definitions of trace levels for FreeType 2 */ + /* definitions of trace levels for FreeType 2 */ -/* the first level must always be `trace_any' */ + /* the first level must always be `trace_any' */ FT_TRACE_DEF( any ) -/* base components */ + /* base components */ FT_TRACE_DEF( calc ) /* calculations (ftcalc.c) */ FT_TRACE_DEF( memory ) /* memory manager (ftobjs.c) */ FT_TRACE_DEF( stream ) /* stream manager (ftstream.c) */ @@ -35,14 +35,15 @@ FT_TRACE_DEF( glyph ) /* glyph management (ftglyph.c) */ FT_TRACE_DEF( raster ) /* monochrome rasterizer (ftraster.c) */ FT_TRACE_DEF( smooth ) /* anti-aliasing raster (ftgrays.c) */ FT_TRACE_DEF( mm ) /* MM interface (ftmm.c) */ +FT_TRACE_DEF( raccess ) /* resource fork accessor (ftrfork.c) */ /* Cache sub-system */ -FT_TRACE_DEF( cache ) /* cache sub-system (ftcache.c, etc..) */ +FT_TRACE_DEF( cache ) /* cache sub-system (ftcache.c, etc.) */ /* SFNT driver components */ -FT_TRACE_DEF( sfobjs ) /* SFNT object handler (sfobjs.c) */ -FT_TRACE_DEF( ttcmap ) /* charmap handler (ttcmap.c) */ -FT_TRACE_DEF( ttload ) /* basic TrueType tables (ttload.c) */ +FT_TRACE_DEF( sfobjs ) /* SFNT object handler (sfobjs.c) */ +FT_TRACE_DEF( ttcmap ) /* charmap handler (ttcmap.c) */ +FT_TRACE_DEF( ttload ) /* basic TrueType tables (ttload.c) */ FT_TRACE_DEF( ttpost ) /* PS table processing (ttpost.c) */ FT_TRACE_DEF( ttsbit ) /* TrueType sbit handling (ttsbit.c) */ diff --git a/reactos/lib/freetype/include/freetype/internal/internal.h b/reactos/lib/freetype/include/freetype/internal/internal.h index 872f6ac7977..1e5ac44d545 100644 --- a/reactos/lib/freetype/include/freetype/internal/internal.h +++ b/reactos/lib/freetype/include/freetype/internal/internal.h @@ -4,7 +4,7 @@ /* */ /* Internal header files (specification only). */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -27,26 +27,18 @@ #define FT_INTERNAL_OBJECTS_H <freetype/internal/ftobjs.h> #define FT_INTERNAL_STREAM_H <freetype/internal/ftstream.h> #define FT_INTERNAL_MEMORY_H <freetype/internal/ftmemory.h> -#define FT_INTERNAL_EXTENSION_H <freetype/internal/ftextend.h> #define FT_INTERNAL_DEBUG_H <freetype/internal/ftdebug.h> #define FT_INTERNAL_CALC_H <freetype/internal/ftcalc.h> #define FT_INTERNAL_DRIVER_H <freetype/internal/ftdriver.h> -#define FT_INTERNAL_EXTEND_H <freetype/internal/ftextend.h> #define FT_INTERNAL_TRACE_H <freetype/internal/fttrace.h> #define FT_INTERNAL_GLYPH_LOADER_H <freetype/internal/ftgloadr.h> #define FT_INTERNAL_SFNT_H <freetype/internal/sfnt.h> -#define FT_INTERNAL_HASH_H <freetype/internal/fthash.h> -#define FT_INTERNAL_OBJECT_H <freetype/internal/ftobject.h> +#define FT_INTERNAL_SERVICE_H <freetype/internal/ftserv.h> +#define FT_INTERNAL_RFORK_H <freetype/internal/ftrfork.h> #define FT_INTERNAL_TRUETYPE_TYPES_H <freetype/internal/tttypes.h> #define FT_INTERNAL_TYPE1_TYPES_H <freetype/internal/t1types.h> -#define FT_INTERNAL_TYPE42_TYPES_H <freetype/internal/t42types.h> -#define FT_INTERNAL_CFF_TYPES_H <freetype/internal/cfftypes.h> -#define FT_INTERNAL_FNT_TYPES_H <freetype/internal/fnttypes.h> -#define FT_INTERNAL_BDF_TYPES_H <freetype/internal/bdftypes.h> -#define FT_INTERNAL_PFR_H <freetype/internal/pfr.h> -#define FT_INTERNAL_POSTSCRIPT_NAMES_H <freetype/internal/psnames.h> #define FT_INTERNAL_POSTSCRIPT_AUX_H <freetype/internal/psaux.h> #define FT_INTERNAL_POSTSCRIPT_HINTS_H <freetype/internal/pshints.h> #define FT_INTERNAL_POSTSCRIPT_GLOBALS_H <freetype/internal/psglobal.h> diff --git a/reactos/lib/freetype/include/freetype/internal/psaux.h b/reactos/lib/freetype/include/freetype/internal/psaux.h index c7093fe5470..8d419be087f 100644 --- a/reactos/lib/freetype/include/freetype/internal/psaux.h +++ b/reactos/lib/freetype/include/freetype/internal/psaux.h @@ -24,6 +24,7 @@ #include <ft2build.h> #include FT_INTERNAL_OBJECTS_H #include FT_INTERNAL_TYPE1_TYPES_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H FT_BEGIN_HEADER @@ -123,7 +124,7 @@ FT_BEGIN_HEADER FT_Int max_elems; FT_Int num_elems; FT_Byte** elements; /* addresses of table elements */ - FT_Int* lengths; /* lengths of table elements */ + FT_PtrDist* lengths; /* lengths of table elements */ FT_Memory memory; PS_Table_FuncsRec funcs; @@ -329,18 +330,20 @@ FT_BEGIN_HEADER void (*skip_spaces)( PS_Parser parser ); void - (*skip_alpha)( PS_Parser parser ); + (*skip_PS_token)( PS_Parser parser ); FT_Long (*to_int)( PS_Parser parser ); FT_Fixed (*to_fixed)( PS_Parser parser, FT_Int power_ten ); + FT_Error (*to_bytes)( PS_Parser parser, FT_Byte* bytes, - FT_Int max_bytes, - FT_Int* pnum_bytes ); + FT_Long max_bytes, + FT_Long* pnum_bytes, + FT_Bool delimiters ); FT_Int (*to_coord_array)( PS_Parser parser, @@ -648,14 +651,14 @@ FT_BEGIN_HEADER T1_Decoder_ZoneRec zones[T1_MAX_SUBRS_CALLS + 1]; T1_Decoder_Zone zone; - PSNames_Service psnames; /* for seac */ + FT_Service_PsCMaps psnames; /* for seac */ FT_UInt num_glyphs; FT_Byte** glyph_names; FT_Int lenIV; /* internal for sub routine calls */ FT_UInt num_subrs; FT_Byte** subrs; - FT_Int* subrs_len; /* array of subrs length (optional) */ + FT_PtrDist* subrs_len; /* array of subrs length (optional) */ FT_Matrix font_matrix; FT_Vector font_offset; diff --git a/reactos/lib/freetype/include/freetype/internal/psnames.h b/reactos/lib/freetype/include/freetype/internal/psnames.h deleted file mode 100644 index 0f4ec86a839..00000000000 --- a/reactos/lib/freetype/include/freetype/internal/psnames.h +++ /dev/null @@ -1,241 +0,0 @@ -/***************************************************************************/ -/* */ -/* psnames.h */ -/* */ -/* High-level interface for the `PSNames' module (in charge of */ -/* various functions related to Postscript glyph names conversion). */ -/* */ -/* Copyright 1996-2001, 2002 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef __PSNAMES_H__ -#define __PSNAMES_H__ - - -#include <ft2build.h> -#include FT_FREETYPE_H - - -FT_BEGIN_HEADER - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* PS_Unicode_Value_Func */ - /* */ - /* <Description> */ - /* A function used to return the Unicode index corresponding to a */ - /* given glyph name. */ - /* */ - /* <Input> */ - /* glyph_name :: The glyph name. */ - /* */ - /* <Return> */ - /* The Unicode character index resp. the non-Unicode value 0xFFFF if */ - /* the glyph name has no known Unicode meaning. */ - /* */ - /* <Note> */ - /* This function is able to map several different glyph names to the */ - /* same Unicode value, according to the rules defined in the Adobe */ - /* Glyph List table. */ - /* */ - /* This function will not be compiled if the configuration macro */ - /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST is undefined. */ - /* */ - typedef FT_UInt32 - (*PS_Unicode_Value_Func)( const char* glyph_name ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* PS_Unicode_Index_Func */ - /* */ - /* <Description> */ - /* A function used to return the glyph index corresponding to a given */ - /* Unicode value. */ - /* */ - /* <Input> */ - /* num_glyphs :: The number of glyphs in the face. */ - /* */ - /* glyph_names :: An array of glyph name pointers. */ - /* */ - /* unicode :: The Unicode value. */ - /* */ - /* <Return> */ - /* The glyph index resp. 0xFFFF if no glyph corresponds to this */ - /* Unicode value. */ - /* */ - /* <Note> */ - /* This function is able to recognize several glyph names per Unicode */ - /* value, according to the Adobe Glyph List. */ - /* */ - /* This function will not be compiled if the configuration macro */ - /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST is undefined. */ - /* */ - typedef FT_UInt - (*PS_Unicode_Index_Func)( FT_UInt num_glyphs, - const char** glyph_names, - FT_ULong unicode ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* PS_Macintosh_Name_Func */ - /* */ - /* <Description> */ - /* A function used to return the glyph name corresponding to an Apple */ - /* glyph name index. */ - /* */ - /* <Input> */ - /* name_index :: The index of the Mac name. */ - /* */ - /* <Return> */ - /* The glyph name, or 0 if the index is invalid. */ - /* */ - /* <Note> */ - /* This function will not be compiled if the configuration macro */ - /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES is undefined. */ - /* */ - typedef const char* - (*PS_Macintosh_Name_Func)( FT_UInt name_index ); - - - typedef const char* - (*PS_Adobe_Std_Strings_Func)( FT_UInt string_index ); - - - typedef struct PS_UniMap_ - { - FT_UInt unicode; - FT_UInt glyph_index; - - } PS_UniMap; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* PS_Unicodes */ - /* */ - /* <Description> */ - /* A simple table used to map Unicode values to glyph indices. It is */ - /* built by the PS_Build_Unicodes table according to the glyphs */ - /* present in a font file. */ - /* */ - /* <Fields> */ - /* num_codes :: The number of glyphs in the font that match a given */ - /* Unicode value. */ - /* */ - /* unicodes :: An array of unicode values, sorted in increasing */ - /* order. */ - /* */ - /* gindex :: An array of glyph indices, corresponding to each */ - /* Unicode value. */ - /* */ - /* <Note> */ - /* Use the function PS_Lookup_Unicode() to retrieve the glyph index */ - /* corresponding to a given Unicode character code. */ - /* */ - typedef struct PS_Unicodes_ - { - FT_UInt num_maps; - PS_UniMap* maps; - - } PS_Unicodes; - - - typedef FT_Error - (*PS_Build_Unicodes_Func)( FT_Memory memory, - FT_UInt num_glyphs, - const char** glyph_names, - PS_Unicodes* unicodes ); - - typedef FT_UInt - (*PS_Lookup_Unicode_Func)( PS_Unicodes* unicodes, - FT_UInt unicode ); - - typedef FT_ULong - (*PS_Next_Unicode_Func)( PS_Unicodes* unicodes, - FT_ULong unicode ); - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* PSNames_Interface */ - /* */ - /* <Description> */ - /* This structure defines the PSNames interface. */ - /* */ - /* <Fields> */ - /* unicode_value :: A function used to convert a glyph name */ - /* into a Unicode character code. */ - /* */ - /* build_unicodes :: A function which builds up the Unicode */ - /* mapping table. */ - /* */ - /* lookup_unicode :: A function used to return the glyph index */ - /* corresponding to a given Unicode */ - /* character. */ - /* */ - /* macintosh_name :: A function used to return the standard */ - /* Apple glyph Postscript name corresponding */ - /* to a given string index (used by the */ - /* TrueType `post' table). */ - /* */ - /* adobe_std_strings :: A function that returns a pointer to a */ - /* Adobe Standard String for a given SID. */ - /* */ - /* adobe_std_encoding :: A table of 256 unsigned shorts that maps */ - /* character codes in the Adobe Standard */ - /* Encoding to SIDs. */ - /* */ - /* adobe_expert_encoding :: A table of 256 unsigned shorts that maps */ - /* character codes in the Adobe Expert */ - /* Encoding to SIDs. */ - /* */ - /* <Note> */ - /* `unicode_value' and `unicode_index' will be set to 0 if the */ - /* configuration macro FT_CONFIG_OPTION_ADOBE_GLYPH_LIST is */ - /* undefined. */ - /* */ - /* `macintosh_name' will be set to 0 if the configuration macro */ - /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES is undefined. */ - /* */ - typedef struct PSNames_Interface_ - { - PS_Unicode_Value_Func unicode_value; - PS_Build_Unicodes_Func build_unicodes; - PS_Lookup_Unicode_Func lookup_unicode; - PS_Macintosh_Name_Func macintosh_name; - - PS_Adobe_Std_Strings_Func adobe_std_strings; - const unsigned short* adobe_std_encoding; - const unsigned short* adobe_expert_encoding; - - PS_Next_Unicode_Func next_unicode; - - } PSNames_Interface; - - - typedef PSNames_Interface* PSNames_Service; - - -FT_END_HEADER - -#endif /* __PSNAMES_H__ */ - - -/* END */ diff --git a/reactos/lib/freetype/include/freetype/internal/services/svbdf.h b/reactos/lib/freetype/include/freetype/internal/services/svbdf.h new file mode 100644 index 00000000000..0f7fc6115d6 --- /dev/null +++ b/reactos/lib/freetype/include/freetype/internal/services/svbdf.h @@ -0,0 +1,57 @@ +/***************************************************************************/ +/* */ +/* svbdf.h */ +/* */ +/* The FreeType BDF services (specification). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVBDF_H__ +#define __SVBDF_H__ + +#include FT_BDF_H +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_BDF "bdf" + + typedef FT_Error + (*FT_BDF_GetCharsetIdFunc)( FT_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ); + + typedef FT_Error + (*FT_BDF_GetPropertyFunc)( FT_Face face, + const char* prop_name, + BDF_PropertyRec *aproperty ); + + + FT_DEFINE_SERVICE( BDF ) + { + FT_BDF_GetCharsetIdFunc get_charset_id; + FT_BDF_GetPropertyFunc get_property; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVBDF_H__ */ + + +/* END */ diff --git a/reactos/lib/freetype/include/freetype/internal/services/svgldict.h b/reactos/lib/freetype/include/freetype/internal/services/svgldict.h new file mode 100644 index 00000000000..e5e56b253c1 --- /dev/null +++ b/reactos/lib/freetype/include/freetype/internal/services/svgldict.h @@ -0,0 +1,60 @@ +/***************************************************************************/ +/* */ +/* svgldict.h */ +/* */ +/* The FreeType glyph dictionary services (specification). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVGLDICT_H__ +#define __SVGLDICT_H__ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + + /* + * A service used to retrieve glyph names, as well as to find the + * index of a given glyph name in a font. + * + */ + +#define FT_SERVICE_ID_GLYPH_DICT "glyph-dict" + + + typedef FT_Error + (*FT_GlyphDict_GetNameFunc)( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ); + + typedef FT_UInt + (*FT_GlyphDict_NameIndexFunc)( FT_Face face, + FT_String* glyph_name ); + + + FT_DEFINE_SERVICE( GlyphDict ) + { + FT_GlyphDict_GetNameFunc get_name; + FT_GlyphDict_NameIndexFunc name_index; /* optional */ + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVGLDICT_H__ */ diff --git a/reactos/lib/freetype/include/freetype/internal/services/svmm.h b/reactos/lib/freetype/include/freetype/internal/services/svmm.h new file mode 100644 index 00000000000..926975ce88b --- /dev/null +++ b/reactos/lib/freetype/include/freetype/internal/services/svmm.h @@ -0,0 +1,68 @@ +/***************************************************************************/ +/* */ +/* svmm.h */ +/* */ +/* The FreeType Multiple Masters services (specification). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVMM_H__ +#define __SVMM_H__ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + + /* + * A service used to manage multiple-masters data in a given face. + * + * See the related APIs in `ftmm.h' (FT_MULTIPLE_MASTERS_H). + * + */ + +#define FT_SERVICE_ID_MULTI_MASTERS "multi-masters" + + + typedef FT_Error + (*FT_Get_MM_Func)( FT_Face face, + FT_Multi_Master* master ); + + typedef FT_Error + (*FT_Set_MM_Design_Func)( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + typedef FT_Error + (*FT_Set_MM_Blend_Func)( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + + FT_DEFINE_SERVICE( MultiMasters ) + { + FT_Get_MM_Func get_mm; + FT_Set_MM_Design_Func set_mm_design; + FT_Set_MM_Blend_Func set_mm_blend; + }; + + /* */ + + +FT_END_HEADER + +#endif /* __SVMM_H__ */ + + +/* END */ diff --git a/reactos/lib/freetype/include/freetype/internal/pfr.h b/reactos/lib/freetype/include/freetype/internal/services/svpfr.h similarity index 50% rename from reactos/lib/freetype/include/freetype/internal/pfr.h rename to reactos/lib/freetype/include/freetype/internal/services/svpfr.h index 51be6202c0f..b61050543e8 100644 --- a/reactos/lib/freetype/include/freetype/internal/pfr.h +++ b/reactos/lib/freetype/include/freetype/internal/services/svpfr.h @@ -1,10 +1,10 @@ /***************************************************************************/ /* */ -/* pfr.h */ +/* svpfr.h */ /* */ -/* Internal PFR service functions (specification only). */ +/* Internal PFR service functions (specification). */ /* */ -/* Copyright 2002, 2003 by */ +/* Copyright 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -16,45 +16,50 @@ /***************************************************************************/ -#ifndef __PFR_H__ -#define __PFR_H__ +#ifndef __SVPFR_H__ +#define __SVPFR_H__ -#include <ft2build.h> -#include FT_FREETYPE_H +#include FT_INTERNAL_SERVICE_H FT_BEGIN_HEADER - typedef FT_Error (*FT_PFR_GetMetricsFunc)( FT_Face face, - FT_UInt *aoutline, - FT_UInt *ametrics, - FT_Fixed *ax_scale, - FT_Fixed *ay_scale ); - typedef FT_Error (*FT_PFR_GetKerningFunc)( FT_Face face, - FT_UInt left, - FT_UInt right, - FT_Vector *avector ); - - typedef FT_Error (*FT_PFR_GetAdvanceFunc)( FT_Face face, - FT_UInt gindex, - FT_Pos *aadvance ); +#define FT_SERVICE_ID_PFR_METRICS "pfr-metrics" - typedef struct FT_PFR_ServiceRec_ + typedef FT_Error + (*FT_PFR_GetMetricsFunc)( FT_Face face, + FT_UInt *aoutline, + FT_UInt *ametrics, + FT_Fixed *ax_scale, + FT_Fixed *ay_scale ); + + typedef FT_Error + (*FT_PFR_GetKerningFunc)( FT_Face face, + FT_UInt left, + FT_UInt right, + FT_Vector *avector ); + + typedef FT_Error + (*FT_PFR_GetAdvanceFunc)( FT_Face face, + FT_UInt gindex, + FT_Pos *aadvance ); + + + FT_DEFINE_SERVICE( PfrMetrics ) { FT_PFR_GetMetricsFunc get_metrics; FT_PFR_GetKerningFunc get_kerning; FT_PFR_GetAdvanceFunc get_advance; - } FT_PFR_ServiceRec, *FT_PFR_Service; - -#define FT_PFR_SERVICE_NAME "pfr" + }; + /* */ FT_END_HEADER -#endif /* __PFR_H__ */ +#endif /* __SVPFR_H__ */ /* END */ diff --git a/reactos/lib/freetype/include/freetype/internal/services/svpostnm.h b/reactos/lib/freetype/include/freetype/internal/services/svpostnm.h new file mode 100644 index 00000000000..7f1700adb39 --- /dev/null +++ b/reactos/lib/freetype/include/freetype/internal/services/svpostnm.h @@ -0,0 +1,58 @@ +/***************************************************************************/ +/* */ +/* svpostnm.h */ +/* */ +/* The FreeType PostScript name services (specification). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVPOSTNM_H__ +#define __SVPOSTNM_H__ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + /* + * A trivial service used to retrieve the PostScript name of a given + * font when available. The `get_name' field should never be NULL. + * + * The correponding function can return NULL to indicate that the + * PostScript name is not available. + * + * The name is owned by the face and will be destroyed with it. + */ + +#define FT_SERVICE_ID_POSTSCRIPT_FONT_NAME "postscript-font-name" + + + typedef const char* + (*FT_PsName_GetFunc)( FT_Face face ); + + + FT_DEFINE_SERVICE( PsFontName ) + { + FT_PsName_GetFunc get_ps_font_name; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVPOSTNM_H__ */ + + +/* END */ diff --git a/reactos/lib/freetype/include/freetype/internal/services/svpscmap.h b/reactos/lib/freetype/include/freetype/internal/services/svpscmap.h new file mode 100644 index 00000000000..ade96ef8f16 --- /dev/null +++ b/reactos/lib/freetype/include/freetype/internal/services/svpscmap.h @@ -0,0 +1,113 @@ +/***************************************************************************/ +/* */ +/* svpscmap.h */ +/* */ +/* The FreeType PostScript charmap service (specification). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVPSCMAP_H__ +#define __SVPSCMAP_H__ + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_POSTSCRIPT_CMAPS "postscript-cmaps" + + + /* + * Adobe glyph name to unicode value + */ + typedef FT_UInt32 + (*PS_Unicode_ValueFunc)( const char* glyph_name ); + + /* + * Unicode value to Adobe glyph name index. 0xFFFF if not found. + */ + typedef FT_UInt + (*PS_Unicode_Index_Func)( FT_UInt num_glyphs, + const char** glyph_names, + FT_ULong unicode ); + + /* + * Macintosh name id to glyph name. NULL if invalid index. + */ + typedef const char* + (*PS_Macintosh_Name_Func)( FT_UInt name_index ); + + /* + * Adobe standard string ID to glyph name. NULL if invalid index. + */ + typedef const char* + (*PS_Adobe_Std_Strings_Func)( FT_UInt string_index ); + + /* + * Simple unicode -> glyph index charmap built from font glyph names + * table. + */ + typedef struct PS_UniMap_ + { + FT_UInt unicode; + FT_UInt glyph_index; + + } PS_UniMap; + + + typedef struct PS_Unicodes_ + { + FT_UInt num_maps; + PS_UniMap* maps; + + } PS_Unicodes; + + + typedef FT_Error + (*PS_Unicodes_InitFunc)( FT_Memory memory, + FT_UInt num_glyphs, + const char** glyph_names, + PS_Unicodes* unicodes ); + + typedef FT_UInt + (*PS_Unicodes_CharIndexFunc)( PS_Unicodes* unicodes, + FT_UInt unicode ); + + typedef FT_ULong + (*PS_Unicodes_CharNextFunc)( PS_Unicodes* unicodes, + FT_ULong unicode ); + + + FT_DEFINE_SERVICE( PsCMaps ) + { + PS_Unicode_ValueFunc unicode_value; + + PS_Unicodes_InitFunc unicodes_init; + PS_Unicodes_CharIndexFunc unicodes_char_index; + PS_Unicodes_CharNextFunc unicodes_char_next; + + PS_Macintosh_Name_Func macintosh_name; + PS_Adobe_Std_Strings_Func adobe_std_strings; + const unsigned short* adobe_std_encoding; + const unsigned short* adobe_expert_encoding; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVPSCMAP_H__ */ + + +/* END */ diff --git a/reactos/lib/freetype/include/freetype/internal/services/svpsinfo.h b/reactos/lib/freetype/include/freetype/internal/services/svpsinfo.h new file mode 100644 index 00000000000..73c02cdb738 --- /dev/null +++ b/reactos/lib/freetype/include/freetype/internal/services/svpsinfo.h @@ -0,0 +1,55 @@ +/***************************************************************************/ +/* */ +/* svpsinfo.h */ +/* */ +/* The FreeType PostScript info service (specification). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVPSINFO_H__ +#define __SVPSINFO_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_INTERNAL_TYPE1_TYPES_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_POSTSCRIPT_INFO "postscript-info" + + + typedef FT_Error + (*PS_GetFontInfoFunc)( FT_Face face, + PS_FontInfoRec* afont_info ); + + typedef FT_Int + (*PS_HasGlyphNamesFunc)( FT_Face face ); + + + FT_DEFINE_SERVICE( PsInfo ) + { + PS_GetFontInfoFunc ps_get_font_info; + PS_HasGlyphNamesFunc ps_has_glyph_names; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVPSINFO_H__ */ + + +/* END */ diff --git a/reactos/lib/freetype/include/freetype/internal/services/svsfnt.h b/reactos/lib/freetype/include/freetype/internal/services/svsfnt.h new file mode 100644 index 00000000000..06a5b1c23d3 --- /dev/null +++ b/reactos/lib/freetype/include/freetype/internal/services/svsfnt.h @@ -0,0 +1,69 @@ +/***************************************************************************/ +/* */ +/* svsfnt.h */ +/* */ +/* The FreeType PostScript name services (specification). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVSFNT_H__ +#define __SVSFNT_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_TRUETYPE_TABLES_H + + +FT_BEGIN_HEADER + + + /* + * SFNT table loading service. + */ + +#define FT_SERVICE_ID_SFNT_TABLE "sfnt-table" + + + /* + * Used to implement FT_Load_Sfnt_Table(). + */ + typedef FT_Error + (*FT_SFNT_TableLoadFunc)( FT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ); + + /* + * Used to implement FT_Get_Sfnt_Table(). + */ + typedef void* + (*FT_SFNT_TableGetFunc)( FT_Face face, + FT_Sfnt_Tag tag ); + + + FT_DEFINE_SERVICE( SFNT_Table ) + { + FT_SFNT_TableLoadFunc load_table; + FT_SFNT_TableGetFunc get_table; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVSFNT_H__ */ + + +/* END */ diff --git a/reactos/lib/freetype/include/freetype/internal/services/svttcmap.h b/reactos/lib/freetype/include/freetype/internal/services/svttcmap.h new file mode 100644 index 00000000000..f92fcd0e2c4 --- /dev/null +++ b/reactos/lib/freetype/include/freetype/internal/services/svttcmap.h @@ -0,0 +1,77 @@ +/***************************************************************************/ +/* */ +/* svsttcmap.h */ +/* */ +/* The FreeType TrueType/sfnt cmap extra information service. */ +/* */ +/* Copyright 2003 by */ +/* Masatake YAMATO, Redhat K.K. */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/* Development of this service is support of + Information-technology Promotion Agency, Japan. */ + +#ifndef __SVTTCMAP_H__ +#define __SVTTCMAP_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_TRUETYPE_TABLES_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_TT_CMAP "tt-cmaps" + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_CMapInfo */ + /* */ + /* <Description> */ + /* A structure used to store TrueType/sfnt specific cmap information */ + /* which is not covered by the generic @FT_CharMap structure. This */ + /* structure can be accessed with the @FT_Get_TT_CMap_Info function. */ + /* */ + /* <Fields> */ + /* language :: */ + /* The language ID used in Mac fonts. Definitions of values are in */ + /* freetype/ttnameid.h. */ + /* */ + typedef struct TT_CMapInfo_ + { + FT_ULong language; + + } TT_CMapInfo; + + + typedef FT_Error + (*TT_CMap_Info_GetFunc)( FT_CharMap charmap, + TT_CMapInfo *cmap_info ); + + + FT_DEFINE_SERVICE( TTCMaps ) + { + TT_CMap_Info_GetFunc get_cmap_info; + }; + + /* */ + + +FT_END_HEADER + +#endif /* __SVTTCMAP_H__ */ + + +/* END */ diff --git a/reactos/lib/freetype/src/sfnt/ttcmap.h b/reactos/lib/freetype/include/freetype/internal/services/svwinfnt.h similarity index 64% rename from reactos/lib/freetype/src/sfnt/ttcmap.h rename to reactos/lib/freetype/include/freetype/internal/services/svwinfnt.h index cd19a6b7344..57f7765d92f 100644 --- a/reactos/lib/freetype/src/sfnt/ttcmap.h +++ b/reactos/lib/freetype/include/freetype/internal/services/svwinfnt.h @@ -1,10 +1,10 @@ /***************************************************************************/ /* */ -/* ttcmap.h */ +/* svwinfnt.h */ /* */ -/* TrueType character mapping table (cmap) support (specification). */ +/* The FreeType Windows FNT/FONT service (specification). */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -16,30 +16,35 @@ /***************************************************************************/ -#ifndef __TTCMAP_H__ -#define __TTCMAP_H__ +#ifndef __SVWINFNT_H__ +#define __SVWINFNT_H__ - -#include <ft2build.h> -#include FT_INTERNAL_TRUETYPE_TYPES_H +#include FT_INTERNAL_SERVICE_H +#include FT_WINFONTS_H FT_BEGIN_HEADER - FT_LOCAL( FT_Error ) - tt_face_load_charmap( TT_Face face, - TT_CMapTable cmap, - FT_Stream input ); +#define FT_SERVICE_ID_WINFNT "winfonts" - FT_LOCAL( FT_Error ) - tt_face_free_charmap( TT_Face face, - TT_CMapTable cmap ); + typedef FT_Error + (*FT_WinFnt_GetHeaderFunc)( FT_Face face, + FT_WinFNT_HeaderRec *aheader ); + + + FT_DEFINE_SERVICE( WinFnt ) + { + FT_WinFnt_GetHeaderFunc get_header; + }; + + /* */ FT_END_HEADER -#endif /* __TTCMAP_H__ */ + +#endif /* __SVWINFNT_H__ */ /* END */ diff --git a/reactos/lib/freetype/include/freetype/internal/services/svxf86nm.h b/reactos/lib/freetype/include/freetype/internal/services/svxf86nm.h new file mode 100644 index 00000000000..3a33abcd8de --- /dev/null +++ b/reactos/lib/freetype/include/freetype/internal/services/svxf86nm.h @@ -0,0 +1,55 @@ +/***************************************************************************/ +/* */ +/* svxf86nm.h */ +/* */ +/* The FreeType XFree86 services (specification only). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVXF86NM_H__ +#define __SVXF86NM_H__ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + + /* + * A trivial service used to return the name of a face's font driver, + * according to the XFree86 nomenclature. Note that the service data + * is a simple constant string pointer. + */ + +#define FT_SERVICE_ID_XF86_NAME "xf86-driver-name" + +#define FT_XF86_FORMAT_TRUETYPE "TrueType" +#define FT_XF86_FORMAT_TYPE_1 "Type 1" +#define FT_XF86_FORMAT_BDF "BDF" +#define FT_XF86_FORMAT_PCF "PCF" +#define FT_XF86_FORMAT_TYPE_42 "Type 42" +#define FT_XF86_FORMAT_CID "CID Type 1" +#define FT_XF86_FORMAT_CFF "CFF" +#define FT_XF86_FORMAT_PFR "PFR" +#define FT_XF86_FORMAT_WINFNT "Windows FNT" + + /* */ + + +FT_END_HEADER + + +#endif /* __SVXF86NM_H__ */ + + +/* END */ diff --git a/reactos/lib/freetype/include/freetype/internal/sfnt.h b/reactos/lib/freetype/include/freetype/internal/sfnt.h index 10b2275531a..9a23b1f829a 100644 --- a/reactos/lib/freetype/include/freetype/internal/sfnt.h +++ b/reactos/lib/freetype/include/freetype/internal/sfnt.h @@ -4,7 +4,7 @@ /* */ /* High-level `sfnt' driver interface (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -125,11 +125,6 @@ FT_BEGIN_HEADER (*TT_Done_Face_Func)( TT_Face face ); - typedef FT_Module_Interface - (*SFNT_Get_Interface_Func)( FT_Module module, - const char* func_interface ); - - /*************************************************************************/ /* */ /* <FuncType> */ @@ -245,6 +240,76 @@ FT_BEGIN_HEADER FT_ULong* length ); + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Find_SBit_Image_Func */ + /* */ + /* <Description> */ + /* Checks whether an embedded bitmap (an `sbit') exists for a given */ + /* glyph, at a given strike. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + /* glyph_index :: The glyph index. */ + /* */ + /* strike_index :: The current strike index. */ + /* */ + /* <Output> */ + /* arange :: The SBit range containing the glyph index. */ + /* */ + /* astrike :: The SBit strike containing the glyph index. */ + /* */ + /* aglyph_offset :: The offset of the glyph data in `EBDT' table. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. Returns */ + /* SFNT_Err_Invalid_Argument if no sbit exists for the requested */ + /* glyph. */ + /* */ + typedef FT_Error + (*TT_Find_SBit_Image_Func)( TT_Face face, + FT_UInt glyph_index, + FT_ULong strike_index, + TT_SBit_Range *arange, + TT_SBit_Strike *astrike, + FT_ULong *aglyph_offset ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_SBit_Metrics_Func */ + /* */ + /* <Description> */ + /* Gets the big metrics for a given embedded bitmap. */ + /* */ + /* <Input> */ + /* stream :: The input stream. */ + /* */ + /* range :: The SBit range containing the glyph. */ + /* */ + /* <Output> */ + /* big_metrics :: A big SBit metrics structure for the glyph. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The stream cursor must be positioned at the glyph's offset within */ + /* the `EBDT' table before the call. */ + /* */ + /* If the image format uses variable metrics, the stream cursor is */ + /* positioned just after the metrics header in the `EBDT' table on */ + /* function exit. */ + /* */ + typedef FT_Error + (*TT_Load_SBit_Metrics_Func)( FT_Stream stream, + TT_SBit_Range range, + TT_SBit_Metrics metrics ); + + /*************************************************************************/ /* */ /* <FuncType> */ @@ -255,20 +320,27 @@ FT_BEGIN_HEADER /* returns its metrics. */ /* */ /* <Input> */ - /* face :: The target face object. */ + /* face :: */ + /* The target face object. */ /* */ - /* x_ppem :: The horizontal resolution in points per EM. */ + /* strike_index :: */ + /* The strike index. */ /* */ - /* y_ppem :: The vertical resolution in points per EM. */ + /* glyph_index :: */ + /* The current glyph index. */ /* */ - /* glyph_index :: The current glyph index. */ + /* load_flags :: */ + /* The current load flags. */ /* */ - /* stream :: The input stream. */ + /* stream :: */ + /* The input stream. */ /* */ /* <Output> */ - /* amap :: The target pixmap. */ + /* amap :: */ + /* The target pixmap. */ /* */ - /* ametrics :: A big sbit metrics structure for the glyph image. */ + /* ametrics :: */ + /* A big sbit metrics structure for the glyph image. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. Returns an error if no */ @@ -312,8 +384,8 @@ FT_BEGIN_HEADER /* */ typedef FT_Error (*TT_Set_SBit_Strike_Func)( TT_Face face, - FT_Int x_ppem, - FT_Int y_ppem, + FT_UInt x_ppem, + FT_UInt y_ppem, FT_ULong *astrike_index ); @@ -366,57 +438,6 @@ FT_BEGIN_HEADER FT_Bool vertical ); - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_CharMap_Load_Func */ - /* */ - /* <Description> */ - /* Loads a given TrueType character map into memory. */ - /* */ - /* <Input> */ - /* face :: A handle to the parent face object. */ - /* */ - /* stream :: A handle to the current stream object. */ - /* */ - /* <InOut> */ - /* cmap :: A pointer to a cmap object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* The function assumes that the stream is already in use (i.e., */ - /* opened). In case of error, all partially allocated tables are */ - /* released. */ - /* */ - typedef FT_Error - (*TT_CharMap_Load_Func)( TT_Face face, - TT_CMapTable cmap, - FT_Stream input ); - - - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* TT_CharMap_Free_Func */ - /* */ - /* <Description> */ - /* Destroys a character mapping table. */ - /* */ - /* <Input> */ - /* face :: A handle to the parent face object. */ - /* */ - /* cmap :: A handle to a cmap object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - typedef FT_Error - (*TT_CharMap_Free_Func)( TT_Face face, - TT_CMapTable cmap ); - - /*************************************************************************/ /* */ /* <FuncType> */ @@ -457,22 +478,6 @@ FT_BEGIN_HEADER (*TT_Free_Table_Func)( TT_Face face ); - /*************************************************************************/ - /* */ - /* <FuncType> */ - /* SFNT_Load_Table_Func */ - /* */ - /* <Description> */ - /* Loads a given SFNT table into memory. */ - /* */ - typedef FT_Error - (*SFNT_Load_Table_Func)( FT_Face face, - FT_ULong tag, - FT_Long offset, - FT_Byte* buffer, - FT_ULong* length ); - - /*************************************************************************/ /* */ /* <Struct> */ @@ -492,7 +497,7 @@ FT_BEGIN_HEADER TT_Init_Face_Func init_face; TT_Load_Face_Func load_face; TT_Done_Face_Func done_face; - SFNT_Get_Interface_Func get_interface; + FT_Module_Requester get_interface; TT_Load_Any_Func load_any; TT_Load_SFNT_HeaderRec_Func load_sfnt_header; @@ -524,6 +529,8 @@ FT_BEGIN_HEADER /* see `ttsbit.h' */ TT_Set_SBit_Strike_Func set_sbit_strike; TT_Load_Table_Func load_sbits; + TT_Find_SBit_Image_Func find_sbit_image; + TT_Load_SBit_Metrics_Func load_sbit_metrics; TT_Load_SBit_Image_Func load_sbit_image; TT_Free_Table_Func free_sbits; @@ -531,10 +538,6 @@ FT_BEGIN_HEADER TT_Get_PS_Name_Func get_psname; TT_Free_Table_Func free_psnames; - /* see `ttcmap.h' */ - TT_CharMap_Load_Func load_charmap; - TT_CharMap_Free_Func free_charmap; - } SFNT_Interface; diff --git a/reactos/lib/freetype/include/freetype/internal/t1types.h b/reactos/lib/freetype/include/freetype/internal/t1types.h index f6f68f4a58e..702bb1e4c68 100644 --- a/reactos/lib/freetype/include/freetype/internal/t1types.h +++ b/reactos/lib/freetype/include/freetype/internal/t1types.h @@ -5,7 +5,7 @@ /* Basic Type1/Type2 type definitions and interface (specification */ /* only). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -23,8 +23,9 @@ #include <ft2build.h> #include FT_TYPE1_TABLES_H -#include FT_INTERNAL_POSTSCRIPT_NAMES_H #include FT_INTERNAL_POSTSCRIPT_HINTS_H +#include FT_INTERNAL_SERVICE_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H FT_BEGIN_HEADER @@ -101,21 +102,21 @@ FT_BEGIN_HEADER FT_Int num_subrs; FT_Byte** subrs; - FT_Int* subrs_len; + FT_PtrDist* subrs_len; FT_Int num_glyphs; FT_String** glyph_names; /* array of glyph names */ FT_Byte** charstrings; /* array of glyph charstrings */ - FT_Int* charstrings_len; + FT_PtrDist* charstrings_len; - FT_Byte* paint_type; + FT_Byte paint_type; FT_Byte font_type; FT_Matrix font_matrix; FT_Vector font_offset; FT_BBox font_bbox; FT_Long font_id; - FT_Fixed* stroke_width; + FT_Fixed stroke_width; } T1_FontRec, *T1_Font; @@ -141,17 +142,6 @@ FT_BEGIN_HEADER /*************************************************************************/ - /*************************************************************************/ - /* */ - /* This structure/class is defined here because it is common to the */ - /* following formats: TTF, OpenType-TT, and OpenType-CFF. */ - /* */ - /* Note, however, that the classes TT_Size, TT_GlyphSlot, and TT_CharMap */ - /* are not shared between font drivers, and are thus defined normally in */ - /* `ttobjs.h'. */ - /* */ - /*************************************************************************/ - typedef struct T1_FaceRec_* T1_Face; typedef struct CID_FaceRec_* CID_Face; @@ -169,7 +159,7 @@ FT_BEGIN_HEADER /* support for Multiple Masters fonts */ PS_Blend blend; - + /* since FT 2.1 - interface to PostScript hinter */ const void* pshinter; @@ -183,8 +173,10 @@ FT_BEGIN_HEADER void* psaux; CID_FaceInfoRec cid; void* afm_data; + FT_Byte* binary_data; /* used if hex data has been converted */ + FT_Stream cid_stream; CID_Subrs subrs; - + /* since FT 2.1 - interface to PostScript hinter */ void* pshinter; diff --git a/reactos/lib/freetype/include/freetype/internal/tttypes.h b/reactos/lib/freetype/include/freetype/internal/tttypes.h index 736d9075157..02db8b4fc8c 100644 --- a/reactos/lib/freetype/include/freetype/internal/tttypes.h +++ b/reactos/lib/freetype/include/freetype/internal/tttypes.h @@ -105,41 +105,6 @@ FT_BEGIN_HEADER } SFNT_HeaderRec, *SFNT_Header; - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_TableDirRec */ - /* */ - /* <Description> */ - /* This structure models a TrueType table directory. It is used to */ - /* access the various tables of the font face. */ - /* */ - /* <Fields> */ - /* version :: The version number; starts with 0x00010000. */ - /* */ - /* numTables :: The number of tables. */ - /* */ - /* searchRange :: Unused. */ - /* */ - /* entrySelector :: Unused. */ - /* */ - /* rangeShift :: Unused. */ - /* */ - /* <Note> */ - /* This structure is only used during font opening. */ - /* */ - typedef struct TT_TableDirRec_ - { - FT_Fixed version; /* should be 0x10000 */ - FT_UShort numTables; /* number of tables */ - - FT_UShort searchRange; /* These parameters are only used */ - FT_UShort entrySelector; /* for a dichotomy search in the */ - FT_UShort rangeShift; /* directory. We ignore them. */ - - } TT_TableDirRec; - - /*************************************************************************/ /* */ /* <Struct> */ @@ -168,61 +133,6 @@ FT_BEGIN_HEADER } TT_TableRec, *TT_Table; - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_CMapDirRec */ - /* */ - /* <Description> */ - /* This structure describes the directory of the `cmap' table, */ - /* containing the font's character mappings table. */ - /* */ - /* <Fields> */ - /* tableVersionNumber :: The version number. */ - /* */ - /* numCMaps :: The number of charmaps in the font. */ - /* */ - /* <Note> */ - /* This structure is only used during font loading. */ - /* */ - typedef struct TT_CMapDirRec_ - { - FT_UShort tableVersionNumber; - FT_UShort numCMaps; - - } TT_CMapDirRec, *TT_CMapDir; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_CMapDirEntryRec */ - /* */ - /* <Description> */ - /* This structure describes a charmap in a TrueType font. */ - /* */ - /* <Fields> */ - /* platformID :: An ID used to specify for which platform this */ - /* charmap is defined (FreeType manages all platforms). */ - /* */ - /* encodingID :: A platform-specific ID used to indicate which source */ - /* encoding is used in this charmap. */ - /* */ - /* offset :: The offset of the charmap relative to the start of */ - /* the `cmap' table. */ - /* */ - /* <Note> */ - /* This structure is only used during font loading. */ - /* */ - typedef struct TT_CMapDirEntryRec_ - { - FT_UShort platformID; - FT_UShort platformEncodingID; - FT_Long offset; - - } TT_CMapDirEntryRec, *TT_CMapDirEntry; - - /*************************************************************************/ /* */ /* <Struct> */ @@ -908,201 +818,6 @@ FT_BEGIN_HEADER } TT_Post_NamesRec, *TT_Post_Names; - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /*** ***/ - /*** ***/ - /*** TRUETYPE CHARMAPS SUPPORT ***/ - /*** ***/ - /*** ***/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /* format 0 */ - - typedef struct TT_CMap0_ - { - FT_ULong language; /* for Mac fonts (originally ushort) */ - - FT_Byte* glyphIdArray; - - } TT_CMap0Rec, *TT_CMap0; - - - /* format 2 */ - - typedef struct TT_CMap2SubHeaderRec_ - { - FT_UShort firstCode; /* first valid low byte */ - FT_UShort entryCount; /* number of valid low bytes */ - FT_Short idDelta; /* delta value to glyphIndex */ - FT_UShort idRangeOffset; /* offset from here to 1st code */ - - } TT_CMap2SubHeaderRec, *TT_CMap2SubHeader; - - - typedef struct TT_CMap2Rec_ - { - FT_ULong language; /* for Mac fonts (originally ushort) */ - - FT_UShort* subHeaderKeys; /* high byte mapping table */ - /* value = subHeader index * 8 */ - TT_CMap2SubHeader subHeaders; - FT_UShort* glyphIdArray; - FT_UShort numGlyphId; /* control value */ - - } TT_CMap2Rec, *TT_CMap2; - - - /* format 4 */ - - typedef struct TT_CMap4Segment_ - { - FT_UShort endCount; - FT_UShort startCount; - FT_Short idDelta; - FT_UShort idRangeOffset; - - } TT_CMap4SegmentRec, *TT_CMap4Segment; - - - typedef struct TT_CMap4Rec_ - { - FT_ULong language; /* for Mac fonts (originally ushort) */ - - FT_UShort segCountX2; /* number of segments * 2 */ - FT_UShort searchRange; /* these parameters can be used */ - FT_UShort entrySelector; /* for a binary search */ - FT_UShort rangeShift; - - TT_CMap4Segment segments; - FT_UShort* glyphIdArray; - FT_UShort numGlyphId; /* control value */ - - TT_CMap4Segment last_segment; /* last used segment; this is a small */ - /* cache to potentially increase speed */ - } TT_CMap4Rec, *TT_CMap4; - - - /* format 6 */ - - typedef struct TT_CMap6_ - { - FT_ULong language; /* for Mac fonts (originally ushort) */ - - FT_UShort firstCode; /* first character code of subrange */ - FT_UShort entryCount; /* number of character codes in subrange */ - - FT_UShort* glyphIdArray; - - } TT_CMap6Rec, *TT_CMap6; - - - /* auxiliary table for format 8 and 12 */ - - typedef struct TT_CMapGroupRec_ - { - FT_ULong startCharCode; - FT_ULong endCharCode; - FT_ULong startGlyphID; - - } TT_CMapGroupRec, *TT_CMapGroup; - - - /* FreeType handles format 8 and 12 identically. It is not necessary to - cover mixed 16bit and 32bit codes since FreeType always uses FT_ULong - for input character codes -- converting Unicode surrogates to 32bit - character codes must be done by the application. */ - - typedef struct TT_CMap8_12Rec_ - { - FT_ULong language; /* for Mac fonts */ - - FT_ULong nGroups; - TT_CMapGroup groups; - - TT_CMapGroup last_group; /* last used group; this is a small */ - /* cache to potentially increase speed */ - } TT_CMap8_12Rec, *TT_CMap8_12; - - - /* format 10 */ - - typedef struct TT_CMap10Rec_ - { - FT_ULong language; /* for Mac fonts */ - - FT_ULong startCharCode; /* first character covered */ - FT_ULong numChars; /* number of characters covered */ - - FT_UShort* glyphs; - - } TT_CMap10Rec, *TT_CMap10; - - - typedef struct TT_CMapTableRec_* TT_CMapTable; - - - typedef FT_UInt - (*TT_CharMap_Func)( TT_CMapTable charmap, - FT_ULong char_code ); - - typedef FT_ULong - (*TT_CharNext_Func)( TT_CMapTable charmap, - FT_ULong char_code ); - - - /* charmap table */ - typedef struct TT_CMapTableRec_ - { - FT_UShort platformID; - FT_UShort platformEncodingID; - FT_UShort format; - FT_ULong length; /* must be ulong for formats 8, 10, and 12 */ - - FT_Bool loaded; - FT_ULong offset; - - union - { - TT_CMap0Rec cmap0; - TT_CMap2Rec cmap2; - TT_CMap4Rec cmap4; - TT_CMap6Rec cmap6; - TT_CMap8_12Rec cmap8_12; - TT_CMap10Rec cmap10; - } c; - - TT_CharMap_Func get_index; - TT_CharNext_Func get_next_char; - - } TT_CMapTableRec; - - - /*************************************************************************/ - /* */ - /* <Struct> */ - /* TT_CharMapRec */ - /* */ - /* <Description> */ - /* The TrueType character map object type. */ - /* */ - /* <Fields> */ - /* root :: The parent character map structure. */ - /* */ - /* cmap :: The used character map. */ - /* */ - typedef struct TT_CharMapRec_ - { - FT_CharMapRec root; - TT_CMapTableRec cmap; - - } TT_CharMapRec; - - /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ @@ -1121,9 +836,8 @@ FT_BEGIN_HEADER /* This structure/class is defined here because it is common to the */ /* following formats: TTF, OpenType-TT, and OpenType-CFF. */ /* */ - /* Note, however, that the classes TT_Size, TT_GlyphSlot, and TT_CharMap */ - /* are not shared between font drivers, and are thus defined in */ - /* `ttobjs.h'. */ + /* Note, however, that the classes TT_Size and TT_GlyphSlot are not */ + /* shared between font drivers, and are thus defined in `ttobjs.h'. */ /* */ /*************************************************************************/ @@ -1145,17 +859,6 @@ FT_BEGIN_HEADER typedef struct TT_FaceRec_* TT_Face; - /*************************************************************************/ - /* */ - /* <Type> */ - /* TT_CharMap */ - /* */ - /* <Description> */ - /* A handle to a TrueType character mapping object. */ - /* */ - typedef struct TT_CharMapRec_* TT_CharMap; - - /* a function type used for the truetype bytecode interpreter hooks */ typedef FT_Error (*TT_Interpreter)( void* exec_context ); @@ -1341,15 +1044,6 @@ FT_BEGIN_HEADER /* cmap_size :: The size in bytes of the `cmap_table' */ /* described above. */ /* */ - /* num_charmaps :: The number of character mappings in the */ - /* font. */ - /* */ - /* charmaps :: The array of charmap objects for this font */ - /* file. Note that this field is a typeless */ - /* pointer. The Reason is that the format of */ - /* charmaps varies with the underlying font */ - /* format and cannot be determined here. */ - /* */ /* goto_table :: A function called by each TrueType table */ /* loader to position a stream's cursor to */ /* the start of a given table according to */ @@ -1375,10 +1069,9 @@ FT_BEGIN_HEADER /* It must be called after the header was */ /* read, and before the `forget'. */ /* */ - /* sfnt :: A pointer to the SFNT `driver' interface. */ + /* sfnt :: A pointer to the SFNT service. */ /* */ - /* psnames :: A pointer to the `PSNames' module */ - /* interface. */ + /* psnames :: A pointer to the PostScript names service. */ /* */ /* hdmx :: The face's horizontal device metrics */ /* (`hdmx' table). This table is optional in */ @@ -1497,14 +1190,15 @@ FT_BEGIN_HEADER TT_Loader_ReadGlyphFunc read_simple_glyph; TT_Loader_ReadGlyphFunc read_composite_glyph; - /* a typeless pointer to the SFNT_Interface table used to load */ - /* the basic TrueType tables in the face object */ + /* a typeless pointer to the SFNT_Interface table used to load */ + /* the basic TrueType tables in the face object */ void* sfnt; - /* a typeless pointer to the PSNames_Interface table used to */ - /* handle glyph names <-> unicode & Mac values */ + /* a typeless pointer to the FT_Service_PsCMapsRec table used to */ + /* handle glyph names <-> unicode & Mac values */ void* psnames; + /***********************************************************************/ /* */ /* Optional TrueType/OpenType tables */ @@ -1576,6 +1270,8 @@ FT_BEGIN_HEADER FT_Generic extra; + const char* postscript_name; + } TT_FaceRec; @@ -1646,11 +1342,15 @@ FT_BEGIN_HEADER FT_BBox bbox; FT_Int left_bearing; FT_Int advance; + FT_Int top_bearing; + FT_Int vadvance; FT_Int linear; FT_Bool linear_def; FT_Bool preserve_pps; FT_Vector pp1; FT_Vector pp2; + FT_Vector pp3; + FT_Vector pp4; FT_ULong glyf_offset; diff --git a/reactos/lib/freetype/include/freetype/t1tables.h b/reactos/lib/freetype/include/freetype/t1tables.h index 70ea43897fe..1b89c5f5111 100644 --- a/reactos/lib/freetype/include/freetype/t1tables.h +++ b/reactos/lib/freetype/include/freetype/t1tables.h @@ -5,7 +5,7 @@ /* Basic Type 1/Type 2 tables definitions and interface (specification */ /* only). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -24,6 +24,12 @@ #include <ft2build.h> #include FT_FREETYPE_H +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + FT_BEGIN_HEADER @@ -129,6 +135,8 @@ FT_BEGIN_HEADER FT_Short snap_widths [13]; /* including std width */ FT_Short snap_heights[13]; /* including std height */ + FT_Fixed expansion_factor; + FT_Long language_group; FT_Long password; @@ -157,7 +165,7 @@ FT_BEGIN_HEADER /* */ /* <Description> */ /* A set of flags used to indicate which fields are present in a */ - /* given blen dictionary (font info or private). Used to support */ + /* given blend dictionary (font info or private). Used to support */ /* Multiple Masters fonts. */ /* */ typedef enum diff --git a/reactos/lib/freetype/include/freetype/ttnameid.h b/reactos/lib/freetype/include/freetype/ttnameid.h index 8b56686bb44..848374fe227 100644 --- a/reactos/lib/freetype/include/freetype/ttnameid.h +++ b/reactos/lib/freetype/include/freetype/ttnameid.h @@ -291,6 +291,7 @@ FT_BEGIN_HEADER #define TT_ADOBE_ID_STANDARD 0 #define TT_ADOBE_ID_EXPERT 1 #define TT_ADOBE_ID_CUSTOM 2 +#define TT_ADOBE_ID_LATIN_1 3 /*************************************************************************/ diff --git a/reactos/lib/freetype/include/freetype/tttables.h b/reactos/lib/freetype/include/freetype/tttables.h index 2d2e63c9080..22247913efb 100644 --- a/reactos/lib/freetype/include/freetype/tttables.h +++ b/reactos/lib/freetype/include/freetype/tttables.h @@ -24,6 +24,12 @@ #include <ft2build.h> #include FT_FREETYPE_H +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + FT_BEGIN_HEADER @@ -566,11 +572,6 @@ FT_BEGIN_HEADER /* */ - /* internal use only */ - typedef void* - (*FT_Get_Sfnt_Table_Func)( FT_Face face, - FT_Sfnt_Tag tag ); - /*************************************************************************/ /* */ @@ -662,6 +663,27 @@ FT_BEGIN_HEADER FT_Byte* buffer, FT_ULong* length ); + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_CMap_Language_ID */ + /* */ + /* <Description> */ + /* Return TrueType/sfnt specific cmap language ID. Definitions of */ + /* language ID values are in freetype/ttnameid.h. */ + /* */ + /* <Input> */ + /* charmap :: */ + /* The target charmap. */ + /* */ + /* <Return> */ + /* The language ID of `charmap'. If `charmap' doesn't belong to a */ + /* TrueType/sfnt face, just return 0 as the default value. */ + /* */ + FT_EXPORT( FT_ULong ) + FT_Get_CMap_Language_ID( FT_CharMap charmap ); + /* */ diff --git a/reactos/lib/freetype/include/freetype/tttags.h b/reactos/lib/freetype/include/freetype/tttags.h index df09f2a69c4..ac64758b103 100644 --- a/reactos/lib/freetype/include/freetype/tttags.h +++ b/reactos/lib/freetype/include/freetype/tttags.h @@ -23,6 +23,12 @@ #include <ft2build.h> #include FT_FREETYPE_H +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + FT_BEGIN_HEADER diff --git a/reactos/lib/freetype/include/freetype/ttunpat.h b/reactos/lib/freetype/include/freetype/ttunpat.h index e4885aaa32d..0bc0a6fe092 100644 --- a/reactos/lib/freetype/include/freetype/ttunpat.h +++ b/reactos/lib/freetype/include/freetype/ttunpat.h @@ -25,6 +25,12 @@ #include <ft2build.h> #include FT_FREETYPE_H +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + FT_BEGIN_HEADER diff --git a/reactos/lib/freetype/install b/reactos/lib/freetype/install deleted file mode 100644 index 25e8cdfcbfb..00000000000 --- a/reactos/lib/freetype/install +++ /dev/null @@ -1,2 +0,0 @@ -#! /bin/sh -make install diff --git a/reactos/lib/freetype/src/autofit/Jamfile b/reactos/lib/freetype/src/autofit/Jamfile new file mode 100644 index 00000000000..3063f23710a --- /dev/null +++ b/reactos/lib/freetype/src/autofit/Jamfile @@ -0,0 +1,18 @@ +SubDir FT2_TOP src autofit ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = afangles afglobal afhints aflatin afloader afmodule afdummy ; + } + else + { + _sources = autofit ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/autofir Jamfile diff --git a/reactos/lib/freetype/src/autofit/afangles.c b/reactos/lib/freetype/src/autofit/afangles.c new file mode 100644 index 00000000000..10a8cff2576 --- /dev/null +++ b/reactos/lib/freetype/src/autofit/afangles.c @@ -0,0 +1,214 @@ +#include "aftypes.h" + + /* this table was generated for AF_ANGLE_PI = 256 */ +#define AF_ANGLE_MAX_ITERS 8 +#define AF_TRIG_MAX_ITERS 9 + + static const FT_Fixed + af_angle_arctan_table[9] = + { + 90, 64, 38, 20, 10, 5, 3, 1, 1 + }; + + + static FT_Int + af_angle_prenorm( FT_Vector* vec ) + { + FT_Fixed x, y, z; + FT_Int shift; + + + x = vec->x; + y = vec->y; + + z = ( ( x >= 0 ) ? x : - x ) | ( (y >= 0) ? y : -y ); + shift = 0; + + if ( z < ( 1L << 27 ) ) + { + do + { + shift++; + z <<= 1; + } while ( z < ( 1L << 27 ) ); + + vec->x = x << shift; + vec->y = y << shift; + } + else if ( z > ( 1L << 28 ) ) + { + do + { + shift++; + z >>= 1; + } while ( z > ( 1L << 28 ) ); + + vec->x = x >> shift; + vec->y = y >> shift; + shift = -shift; + } + return shift; + } + + + static void + af_angle_pseudo_polarize( FT_Vector* vec ) + { + FT_Fixed theta; + FT_Fixed yi, i; + FT_Fixed x, y; + const FT_Fixed *arctanptr; + + + x = vec->x; + y = vec->y; + + /* Get the vector into the right half plane */ + theta = 0; + if ( x < 0 ) + { + x = -x; + y = -y; + theta = 2 * AF_ANGLE_PI2; + } + + if ( y > 0 ) + theta = - theta; + + arctanptr = af_angle_arctan_table; + + if ( y < 0 ) + { + /* Rotate positive */ + yi = y + ( x << 1 ); + x = x - ( y << 1 ); + y = yi; + theta -= *arctanptr++; /* Subtract angle */ + } + else + { + /* Rotate negative */ + yi = y - ( x << 1 ); + x = x + ( y << 1 ); + y = yi; + theta += *arctanptr++; /* Add angle */ + } + + i = 0; + do + { + if ( y < 0 ) + { + /* Rotate positive */ + yi = y + ( x >> i ); + x = x - ( y >> i ); + y = yi; + theta -= *arctanptr++; + } + else + { + /* Rotate negative */ + yi = y - ( x >> i ); + x = x + ( y >> i ); + y = yi; + theta += *arctanptr++; + } + } while ( ++i < AF_TRIG_MAX_ITERS ); + + /* round theta */ + if ( theta >= 0 ) + theta = FT_PAD_ROUND( theta, 4 ); + else + theta = - FT_PAD_ROUND( theta, 4 ); + + vec->x = x; + vec->y = theta; + } + + + /* documentation is in fttrigon.h */ + + FT_LOCAL_DEF( AF_Angle ) + af_angle_atan( FT_Fixed dx, + FT_Fixed dy ) + { + FT_Vector v; + + + if ( dx == 0 && dy == 0 ) + return 0; + + v.x = dx; + v.y = dy; + af_angle_prenorm( &v ); + af_angle_pseudo_polarize( &v ); + + return v.y; + } + + + + FT_LOCAL_DEF( AF_Angle ) + af_angle_diff( AF_Angle angle1, + AF_Angle angle2 ) + { + AF_Angle delta = angle2 - angle1; + + delta %= AF_ANGLE_2PI; + if ( delta < 0 ) + delta += AF_ANGLE_2PI; + + if ( delta > AF_ANGLE_PI ) + delta -= AF_ANGLE_2PI; + + return delta; + } + + + /* well, this needs to be somewhere, right :-) + */ + + FT_LOCAL_DEF( void ) + af_sort_pos( FT_UInt count, + FT_Pos* table ) + { + FT_UInt i, j; + FT_Pos swap; + + + for ( i = 1; i < count; i++ ) + { + for ( j = i; j > 0; j-- ) + { + if ( table[j] > table[j - 1] ) + break; + + swap = table[j]; + table[j] = table[j - 1]; + table[j - 1] = swap; + } + } + } + + + FT_LOCAL_DEF( void ) + af_sort_widths( FT_UInt count, + AF_Width table ) + { + FT_UInt i, j; + AF_WidthRec swap; + + + for ( i = 1; i < count; i++ ) + { + for ( j = i; j > 0; j-- ) + { + if ( table[j].org > table[j - 1].org ) + break; + + swap = table[j]; + table[j] = table[j - 1]; + table[j - 1] = swap; + } + } + } diff --git a/reactos/lib/freetype/src/autofit/afdummy.c b/reactos/lib/freetype/src/autofit/afdummy.c new file mode 100644 index 00000000000..bae5f70a324 --- /dev/null +++ b/reactos/lib/freetype/src/autofit/afdummy.c @@ -0,0 +1,35 @@ +#include "afdummy.h" + + + static FT_Error + af_dummy_hints_init( AF_GlyphHints hints, + FT_Outline* outline, + AF_ScriptMetrics metrics ) + { + return af_glyph_hints_reset( hints, + &metrics->scaler, + metrics, + outline ); + } + + static FT_Error + af_dummy_hints_apply( AF_GlyphHints hints, + FT_Outline* outline ) + { + af_glyph_hints_save( hints, outline ); + } + + + FT_LOCAL_DEF( const AF_ScriptClassRec ) af_dummy_script_class = + { + AF_SCRIPT_NONE, + NULL, + + sizeof( AF_ScriptMetricsRec ), + (AF_Script_InitMetricsFunc) NULL, + (AF_Script_ScaleMetricsFunc) NULL, + (AF_Script_DoneMetricsFunc) NULL, + + (AF_Script_InitHintsFunc) af_dummy_hints_init, + (AF_Script_ApplyHintsFunc) af_dummy_hints_apply + }; diff --git a/reactos/lib/freetype/src/autofit/afdummy.h b/reactos/lib/freetype/src/autofit/afdummy.h new file mode 100644 index 00000000000..f4594c0f9f9 --- /dev/null +++ b/reactos/lib/freetype/src/autofit/afdummy.h @@ -0,0 +1,18 @@ +#ifndef __AFDUMMY_H__ +#define __AFDUMMY_H__ + +#include "aftypes.h" + +FT_BEGIN_HEADER + + /* a dummy script metrics class used when no hinting should + * be performed. This is the default for non-latin glyphs ! + */ + + FT_LOCAL( const AF_ScriptClassRec ) af_dummy_script_class; + +/* */ + +FT_END_HEADER + +#endif /* __AFDUMMY_H__ */ diff --git a/reactos/lib/freetype/src/autofit/afglobal.c b/reactos/lib/freetype/src/autofit/afglobal.c new file mode 100644 index 00000000000..cadc803473f --- /dev/null +++ b/reactos/lib/freetype/src/autofit/afglobal.c @@ -0,0 +1,236 @@ +#include "afglobal.h" +#include "afdummy.h" +#include "aflatin.h" + + /* populate this list when you add new scripts + */ + static AF_ScriptClass const af_script_classes[] = + { + & af_dummy_script_class, + & af_latin_script_class, + + NULL /* do not remove */ + }; + +#define AF_SCRIPT_LIST_DEFAULT 0 /* index of default script in 'af_script_classes' */ +#define AF_SCRIPT_LIST_NONE 255 /* indicates an uncovered glyph */ + + /* + * note that glyph_scripts[] is used to map each glyph into + * an index into the 'af_script_classes' array. + * + */ + typedef struct AF_FaceGlobalsRec_ + { + FT_Face face; + FT_UInt glyph_count; /* same as face->num_glyphs */ + FT_Byte* glyph_scripts; + + AF_ScriptMetrics metrics[ AF_SCRIPT_MAX ]; + + } AF_FaceGlobalsRec; + + + + + /* this function is used to compute the script index of each glyph + * within a given face + */ + static FT_Error + af_face_globals_compute_script_coverage( AF_FaceGlobals globals ) + { + FT_Error error = 0; + FT_Face face = globals->face; + FT_CharMap old_charmap = face->charmap; + FT_Byte* gscripts = globals->glyph_scripts; + FT_UInt ss; + + /* the value 255 means "uncovered glyph" + */ + FT_MEM_SET( globals->glyph_scripts, + AF_SCRIPT_LIST_NONE, + globals->glyph_count ); + + error = FT_Select_Charmap( face, FT_ENCODING_UNICODE ); + if ( error ) + { + /* ignore this error, we'll simply use Latin as the standard + * script. XXX: Shouldn't we rather disable hinting ?? + */ + error = 0; + goto Exit; + } + + /* scan each script in a Unicode charmap + */ + for ( ss = 0; af_script_classes[ss]; ss++ ) + { + AF_ScriptClass clazz = af_script_classes[ss]; + AF_Script_UniRange range; + + if ( clazz->script_uni_ranges == NULL ) + continue; + + /* scan all unicode points in the range, and set the corresponding + * glyph script index + */ + for ( range = clazz->script_uni_ranges; range->first != 0; range++ ) + { + FT_ULong charcode = range->first; + FT_UInt gindex; + + gindex = FT_Get_Char_Index( face, charcode ); + + if ( gindex != 0 && + gindex < globals->glyph_count && + gscripts[ gindex ] == AF_SCRIPT_LIST_NONE ) + { + gscripts[ gindex ] = (FT_Byte) ss; + } + for (;;) + { + charcode = FT_Get_Next_Char( face, charcode, &gindex ); + + if ( gindex == 0 || charcode > range->last ) + break; + + if ( gindex < globals->glyph_count && + gscripts[ gindex ] == AF_SCRIPT_LIST_NONE ) + { + gscripts[ gindex ] = (FT_Byte) ss; + } + } + } + } + + Exit: + /* by default, all uncovered glyphs are set to the latin script + * XXX: shouldnt' we disable hinting or do something similar ? + */ + { + FT_UInt nn; + + for ( nn = 0; nn < globals->glyph_count; nn++ ) + { + if ( gscripts[ nn ] == AF_SCRIPT_LIST_NONE ) + gscripts[ nn ] = AF_SCRIPT_LIST_DEFAULT; + } + } + + FT_Set_Charmap( face, old_charmap ); + return error; + } + + + + FT_LOCAL_DEF( FT_Error ) + af_face_globals_new( FT_Face face, + AF_FaceGlobals *aglobals ) + { + FT_Error error; + FT_Memory memory; + AF_FaceGlobals globals; + + memory = face->memory; + + if ( !FT_ALLOC( globals, sizeof(*globals) + + face->num_glyphs*sizeof(FT_Byte) ) ) + { + globals->face = face; + globals->glyph_count = face->num_glyphs; + globals->glyph_scripts = (FT_Byte*)( globals+1 ); + + error = af_face_globals_compute_script_coverage( globals ); + if ( error ) + { + af_face_globals_free( globals ); + globals = NULL; + } + } + + *aglobals = globals; + return error; + } + + + FT_LOCAL_DEF( void ) + af_face_globals_free( AF_FaceGlobals globals ) + { + if ( globals ) + { + FT_Memory memory = globals->face->memory; + FT_UInt nn; + + for ( nn = 0; nn < AF_SCRIPT_MAX; nn++ ) + { + if ( globals->metrics[nn] ) + { + AF_ScriptClass clazz = af_script_classes[nn]; + + FT_ASSERT( globals->metrics[nn]->clazz == clazz ); + + if ( clazz->script_metrics_done ) + clazz->script_metrics_done( globals->metrics[nn] ); + + FT_FREE( globals->metrics[nn] ); + } + } + + globals->glyph_count = 0; + globals->glyph_scripts = NULL; /* no need to free this one !! */ + globals->face = NULL; + FT_FREE( globals ); + } + } + + + FT_LOCAL_DEF( FT_Error ) + af_face_globals_get_metrics( AF_FaceGlobals globals, + FT_UInt gindex, + AF_ScriptMetrics *ametrics ) + { + AF_ScriptMetrics metrics = NULL; + FT_UInt index; + AF_ScriptClass clazz; + FT_Error error = 0; + + if ( gindex >= globals->glyph_count ) + { + error = FT_Err_Invalid_Argument; + goto Exit; + } + + index = globals->glyph_scripts[ gindex ]; + clazz = af_script_classes[ index ]; + metrics = globals->metrics[ clazz->script ]; + if ( metrics == NULL ) + { + /* create the global metrics object when needed + */ + FT_Memory memory = globals->face->memory; + + if ( FT_ALLOC( metrics, clazz->script_metrics_size ) ) + goto Exit; + + metrics->clazz = clazz; + + if ( clazz->script_metrics_init ) + { + error = clazz->script_metrics_init( metrics, globals->face ); + if ( error ) + { + if ( clazz->script_metrics_done ) + clazz->script_metrics_done( metrics ); + + FT_FREE( metrics ); + goto Exit; + } + } + + globals->metrics[ clazz->script ] = metrics; + } + + Exit: + *ametrics = metrics; + return error; + } diff --git a/reactos/lib/freetype/src/autofit/afglobal.h b/reactos/lib/freetype/src/autofit/afglobal.h new file mode 100644 index 00000000000..64f35c3fff9 --- /dev/null +++ b/reactos/lib/freetype/src/autofit/afglobal.h @@ -0,0 +1,41 @@ +#ifndef __AF_GLOBAL_H__ +#define __AF_GLOBAL_H__ + +#include "aftypes.h" + +FT_BEGIN_HEADER + + /**************************************************************************/ + /**************************************************************************/ + /***** *****/ + /***** F A C E G L O B A L S *****/ + /***** *****/ + /**************************************************************************/ + /**************************************************************************/ + + + /* + * models the global hints data for a given face, decomposed into + * script-specific items.. + * + */ + typedef struct AF_FaceGlobalsRec_* AF_FaceGlobals; + + + FT_LOCAL( FT_Error ) + af_face_globals_new( FT_Face face, + AF_FaceGlobals *aglobals ); + + FT_LOCAL( FT_Error ) + af_face_globals_get_metrics( AF_FaceGlobals globals, + FT_UInt gindex, + AF_ScriptMetrics *ametrics ); + + FT_LOCAL( void ) + af_face_globals_free( AF_FaceGlobals globals ); + + /* */ + +FT_END_HEADER + +#endif /* __AF_GLOBALS_H__ */ diff --git a/reactos/lib/freetype/src/autofit/afhints.c b/reactos/lib/freetype/src/autofit/afhints.c new file mode 100644 index 00000000000..d0dca1526f3 --- /dev/null +++ b/reactos/lib/freetype/src/autofit/afhints.c @@ -0,0 +1,986 @@ +#include "afhints.h" + +#ifdef AF_DEBUG + +#include <stdio.h> + + static const char* af_dir_str( AF_Direction dir ) + { + const char* result; + + switch (dir) + { + case AF_DIR_UP: result = "up"; break; + case AF_DIR_DOWN: result = "down"; break; + case AF_DIR_LEFT: result = "left"; break; + case AF_DIR_RIGHT: result = "right"; break; + default: result = "none"; + } + return result; + } + +#define AF_INDEX_NUM(ptr,base) ( (ptr) ? ((ptr)-(base)) : -1 ) + + void + af_glyph_hints_dump_points( AF_GlyphHints hints ) + { + AF_Point points = hints->points; + AF_Point limit = points + hints->num_points; + AF_Point point; + + printf( "Table of points:\n" ); + printf( " [ index | xorg | yorg | xscale | yscale | xfit | yfit | flags ]\n" ); + for ( point = points; point < limit; point++ ) + { + printf( " [ %5d | %5d | %5d | %-5.2f | %-5.2f | %-5.2f | %-5.2f | %c%c%c%c%c%c ]\n", + point - points, + point->fx, + point->fy, + point->ox/64.0, + point->oy/64.0, + point->x/64.0, + point->y/64.0, + (point->flags & AF_FLAG_WEAK_INTERPOLATION) ? 'w' : ' ', + (point->flags & AF_FLAG_INFLECTION) ? 'i' : ' ', + (point->flags & AF_FLAG_EXTREMA_X) ? '<' : ' ', + (point->flags & AF_FLAG_EXTREMA_Y) ? 'v' : ' ', + (point->flags & AF_FLAG_ROUND_X) ? '(' : ' ', + (point->flags & AF_FLAG_ROUND_Y) ? 'u' : ' ' + ); + } + printf( "\n" ); + } + + + /* A function used to dump the array of linked segments */ + void + af_glyph_hints_dump_segments( AF_GlyphHints hints ) + { + AF_Point points = hints->points; + FT_Int dimension; + + for ( dimension = 1; dimension >= 0; dimension-- ) + { + AF_AxisHints axis = &hints->axis[dimension]; + AF_Segment segments = axis->segments; + AF_Segment limit = segments + axis->num_segments; + AF_Segment seg; + + + printf ( "Table of %s segments:\n", + dimension == AF_DIMENSION_HORZ ? "vertical" : "horizontal" ); + printf ( " [ index | pos | dir | link | serif |" + " numl | first | start ]\n" ); + + for ( seg = segments; seg < limit; seg++ ) + { + printf ( " [ %5d | %4d | %5s | %4d | %5d | %4d | %5d | %5d ]\n", + seg - segments, + (int)seg->pos, + af_dir_str( seg->dir ), + AF_INDEX_NUM( seg->link, segments ), + AF_INDEX_NUM( seg->serif, segments ), + (int)seg->num_linked, + seg->first - points, + seg->last - points ); + } + printf( "\n" ); + } + } + + + void + af_glyph_hints_dump_edges( AF_GlyphHints hints ) + { + FT_Int dimension; + + for ( dimension = 1; dimension >= 0; dimension-- ) + { + AF_AxisHints axis = &hints->axis[ dimension ]; + AF_Edge edges = axis->edges; + AF_Edge limit = edges + axis->num_edges; + AF_Edge edge; + + /* note: AF_DIMENSION_HORZ corresponds to _vertical_ edges + * since they have constant X coordinate + */ + printf ( "Table of %s edges:\n", + dimension == AF_DIMENSION_HORZ ? "vertical" : "horizontal" ); + printf ( " [ index | pos | dir | link |" + " serif | blue | opos | pos ]\n" ); + + for ( edge = edges; edge < limit; edge++ ) + { + printf ( " [ %5d | %4d | %5s | %4d | %5d | %c | %5.2f | %5.2f ]\n", + edge - edges, + (int)edge->fpos, + af_dir_str( edge->dir ), + AF_INDEX_NUM( edge->link, edges ), + AF_INDEX_NUM( edge->serif, edges ), + edge->blue_edge ? 'y' : 'n', + edge->opos / 64.0, + edge->pos / 64.0 ); + } + + printf( "\n" ); + } + } + + + +#endif /* AF_DEBUG */ + + + /* compute the direction value of a given vector */ + FT_LOCAL_DEF( AF_Direction ) + af_direction_compute( FT_Pos dx, + FT_Pos dy ) + { + AF_Direction dir; + FT_Pos ax = FT_ABS( dx ); + FT_Pos ay = FT_ABS( dy ); + + + dir = AF_DIR_NONE; + + /* atan(1/12) == 4.7 degrees */ + + /* test for vertical direction */ + if ( ax * 12 < ay ) + { + dir = dy > 0 ? AF_DIR_UP : AF_DIR_DOWN; + } + /* test for horizontal direction */ + else if ( ay * 12 < ax ) + { + dir = dx > 0 ? AF_DIR_RIGHT : AF_DIR_LEFT; + } + + return dir; + } + + + /* compute all inflex points in a given glyph */ + static void + af_glyph_hints_compute_inflections( AF_GlyphHints hints ) + { + AF_Point* contour = hints->contours; + AF_Point* contour_limit = contour + hints->num_contours; + + + /* do each contour separately */ + for ( ; contour < contour_limit; contour++ ) + { + AF_Point point = contour[0]; + AF_Point first = point; + AF_Point start = point; + AF_Point end = point; + AF_Point before; + AF_Point after; + AF_Angle angle_in, angle_seg, angle_out; + AF_Angle diff_in, diff_out; + FT_Int finished = 0; + + + /* compute first segment in contour */ + first = point; + + start = end = first; + do + { + end = end->next; + if ( end == first ) + goto Skip; + + } while ( end->fx == first->fx && end->fy == first->fy ); + + angle_seg = af_angle_atan( end->fx - start->fx, + end->fy - start->fy ); + + /* extend the segment start whenever possible */ + before = start; + do + { + do + { + start = before; + before = before->prev; + if ( before == first ) + goto Skip; + + } while ( before->fx == start->fx && before->fy == start->fy ); + + angle_in = af_angle_atan( start->fx - before->fx, + start->fy - before->fy ); + + } while ( angle_in == angle_seg ); + + first = start; + diff_in = af_angle_diff( angle_in, angle_seg ); + + /* now, process all segments in the contour */ + do + { + /* first, extend current segment's end whenever possible */ + after = end; + do + { + do + { + end = after; + after = after->next; + if ( after == first ) + finished = 1; + + } while ( end->fx == after->fx && end->fy == after->fy ); + + angle_out = af_angle_atan( after->fx - end->fx, + after->fy - end->fy ); + + } while ( angle_out == angle_seg ); + + diff_out = af_angle_diff( angle_seg, angle_out ); + + if ( ( diff_in ^ diff_out ) < 0 ) + { + /* diff_in and diff_out have different signs, we have */ + /* inflection points here... */ + do + { + start->flags |= AF_FLAG_INFLECTION; + start = start->next; + + } while ( start != end ); + + start->flags |= AF_FLAG_INFLECTION; + } + + start = end; + end = after; + angle_seg = angle_out; + diff_in = diff_out; + + } while ( !finished ); + + Skip: + ; + } + } + + + + FT_LOCAL_DEF( void ) + af_glyph_hints_init( AF_GlyphHints hints, + FT_Memory memory ) + { + FT_ZERO( hints ); + hints->memory = memory; + } + + + + FT_LOCAL_DEF( void ) + af_glyph_hints_done( AF_GlyphHints hints ) + { + if ( hints && hints->memory ) + { + FT_Memory memory = hints->memory; + AF_Dimension dim; + + /* note that we don't need to free the segment and edge + * buffers, since they're really within the hints->points array + */ + for ( dim = 0; dim < 2; dim++ ) + { + AF_AxisHints axis = &hints->axis[ dim ]; + + axis->num_segments = 0; + axis->num_edges = 0; + axis->segments = NULL; + axis->edges = NULL; + } + + FT_FREE( hints->contours ); + hints->max_contours = 0; + hints->num_contours = 0; + + FT_FREE( hints->points ); + hints->num_points = 0; + hints->max_points = 0; + + hints->memory = NULL; + } + } + + + + FT_LOCAL_DEF( FT_Error ) + af_glyph_hints_reset( AF_GlyphHints hints, + AF_Scaler scaler, + AF_ScriptMetrics metrics, + FT_Outline* outline ) + { + FT_Error error = FT_Err_Ok; + AF_Point points; + FT_UInt old_max, new_max; + FT_Fixed x_scale = scaler->x_scale; + FT_Fixed y_scale = scaler->y_scale; + FT_Pos x_delta = scaler->x_delta; + FT_Pos y_delta = scaler->y_delta; + FT_Memory memory = hints->memory; + + hints->metrics = metrics; + + hints->scaler_flags = scaler->flags; + hints->other_flags = 0; + + hints->num_points = 0; + hints->num_contours = 0; + + hints->axis[0].num_segments = 0; + hints->axis[0].num_edges = 0; + hints->axis[1].num_segments = 0; + hints->axis[1].num_edges = 0; + + /* first of all, reallocate the contours array when necessary + */ + new_max = (FT_UInt) outline->n_contours; + old_max = hints->max_contours; + if ( new_max > old_max ) + { + new_max = (new_max + 3) & ~3; + + if ( FT_RENEW_ARRAY( hints->contours, old_max, new_max ) ) + goto Exit; + + hints->max_contours = new_max; + } + + /* then, reallocate the points, segments & edges arrays if needed -- + * note that we reserved two additional point positions, used to + * hint metrics appropriately + */ + new_max = (FT_UInt)( outline->n_points + 2 ); + old_max = hints->max_points; + if ( new_max > old_max ) + { + FT_Byte* items; + FT_ULong off1, off2, off3; + + /* we store in a single buffer the following arrays: + * + * - an array of N AF_PointRec items + * - an array of 2*N AF_SegmentRec items + * - an array of 2*N AF_EdgeRec items + * + */ + + new_max = ( new_max + 2 + 7 ) & ~7; + +#define OFF_PAD2(x,y) (((x)+(y)-1) & ~((y)-1)) +#define OFF_PADX(x,y) ((((x)+(y)-1)/(y))*(y)) +#define OFF_PAD(x,y) ( ((y) & ((y)-1)) ? OFF_PADX(x,y) : OFF_PAD2(x,y) ) + +#undef OFF_INCREMENT +#define OFF_INCREMENT( _off, _type, _count ) \ + ( OFF_PAD( _off, sizeof(_type) ) + (_count)*sizeof(_type)) + + off1 = OFF_INCREMENT( 0, AF_PointRec, new_max ); + off2 = OFF_INCREMENT( off1, AF_SegmentRec, new_max*2 ); + off3 = OFF_INCREMENT( off2, AF_EdgeRec, new_max*2 ); + + FT_FREE( hints->points ); + + if ( FT_ALLOC( items, off3 ) ) + { + hints->max_points = 0; + hints->axis[0].segments = NULL; + hints->axis[0].edges = NULL; + hints->axis[1].segments = NULL; + hints->axis[1].edges = NULL; + goto Exit; + } + + /* readjust some pointers + */ + hints->max_points = new_max; + hints->points = (AF_Point) items; + + hints->axis[0].segments = (AF_Segment)( items + off1 ); + hints->axis[1].segments = hints->axis[0].segments + new_max; + + hints->axis[0].edges = (AF_Edge) ( items + off2 ); + hints->axis[1].edges = hints->axis[0].edges + new_max; + } + + hints->num_points = outline->n_points; + hints->num_contours = outline->n_contours; + + + /* We can't rely on the value of `FT_Outline.flags' to know the fill */ + /* direction used for a glyph, given that some fonts are broken (e.g. */ + /* the Arphic ones). We thus recompute it each time we need to. */ + /* */ + hints->axis[ AF_DIMENSION_HORZ ].major_dir = AF_DIR_UP; + hints->axis[ AF_DIMENSION_VERT ].major_dir = AF_DIR_LEFT; + + if ( FT_Outline_Get_Orientation( outline ) == FT_ORIENTATION_POSTSCRIPT ) + { + hints->axis[ AF_DIMENSION_HORZ ].major_dir = AF_DIR_DOWN; + hints->axis[ AF_DIMENSION_VERT ].major_dir = AF_DIR_RIGHT; + } + + hints->x_scale = x_scale; + hints->y_scale = y_scale; + hints->x_delta = x_delta; + hints->y_delta = y_delta; + + points = hints->points; + if ( hints->num_points == 0 ) + goto Exit; + + { + AF_Point point; + AF_Point point_limit = points + hints->num_points; + + + /* compute coordinates & bezier flags */ + { + FT_Vector* vec = outline->points; + char* tag = outline->tags; + + + for ( point = points; point < point_limit; point++, vec++, tag++ ) + { + point->fx = vec->x; + point->fy = vec->y; + point->ox = point->x = FT_MulFix( vec->x, x_scale ) + x_delta; + point->oy = point->y = FT_MulFix( vec->y, y_scale ) + y_delta; + + switch ( FT_CURVE_TAG( *tag ) ) + { + case FT_CURVE_TAG_CONIC: + point->flags = AF_FLAG_CONIC; + break; + case FT_CURVE_TAG_CUBIC: + point->flags = AF_FLAG_CUBIC; + break; + default: + point->flags = 0; + ; + } + } + } + + /* compute `next' and `prev' */ + { + FT_Int contour_index; + AF_Point prev; + AF_Point first; + AF_Point end; + + + contour_index = 0; + + first = points; + end = points + outline->contours[0]; + prev = end; + + for ( point = points; point < point_limit; point++ ) + { + point->prev = prev; + if ( point < end ) + { + point->next = point + 1; + prev = point; + } + else + { + point->next = first; + contour_index++; + if ( point + 1 < point_limit ) + { + end = points + outline->contours[contour_index]; + first = point + 1; + prev = end; + } + } + } + } + + /* set-up the contours array */ + { + AF_Point* contour = hints->contours; + AF_Point* contour_limit = contour + hints->num_contours; + short* end = outline->contours; + short idx = 0; + + + for ( ; contour < contour_limit; contour++, end++ ) + { + contour[0] = points + idx; + idx = (short)( end[0] + 1 ); + } + } + + /* compute directions of in & out vectors */ + { + for ( point = points; point < point_limit; point++ ) + { + AF_Point prev; + AF_Point next; + FT_Pos in_x, in_y, out_x, out_y; + + + prev = point->prev; + in_x = point->fx - prev->fx; + in_y = point->fy - prev->fy; + + point->in_dir = af_direction_compute( in_x, in_y ); + + next = point->next; + out_x = next->fx - point->fx; + out_y = next->fy - point->fy; + + point->out_dir = af_direction_compute( out_x, out_y ); + + if ( point->flags & ( AF_FLAG_CONIC | AF_FLAG_CUBIC ) ) + { + Is_Weak_Point: + point->flags |= AF_FLAG_WEAK_INTERPOLATION; + } + else if ( point->out_dir == point->in_dir ) + { + AF_Angle angle_in, angle_out, delta; + + + if ( point->out_dir != AF_DIR_NONE ) + goto Is_Weak_Point; + + angle_in = af_angle_atan( in_x, in_y ); + angle_out = af_angle_atan( out_x, out_y ); + delta = af_angle_diff( angle_in, angle_out ); + + if ( delta < 2 && delta > -2 ) + goto Is_Weak_Point; + } + else if ( point->in_dir == -point->out_dir ) + goto Is_Weak_Point; + } + } + } + + /* compute inflection points + */ + af_glyph_hints_compute_inflections( hints ); + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + af_glyph_hints_save( AF_GlyphHints hints, + FT_Outline* outline ) + { + AF_Point point = hints->points; + AF_Point limit = point + hints->num_points; + FT_Vector* vec = outline->points; + char* tag = outline->tags; + + for ( ; point < limit; point++, vec++, tag++ ) + { + vec->x = (FT_Pos) point->x; + vec->y = (FT_Pos) point->y; + + if ( point->flags & AF_FLAG_CONIC ) + tag[0] = FT_CURVE_TAG_CONIC; + else if ( point->flags & AF_FLAG_CUBIC ) + tag[0] = FT_CURVE_TAG_CUBIC; + else + tag[0] = FT_CURVE_TAG_ON; + } + } + + + /* + * + * E D G E P O I N T G R I D - F I T T I N G + * + */ + + + FT_LOCAL_DEF( void ) + af_glyph_hints_align_edge_points( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = & hints->axis[ dim ]; + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + AF_Edge edge; + + for ( edge = edges; edge < edge_limit; edge++ ) + { + /* move the points of each segment */ + /* in each edge to the edge's position */ + AF_Segment seg = edge->first; + + + do + { + AF_Point point = seg->first; + + + for (;;) + { + if ( dim == AF_DIMENSION_HORZ ) + { + point->x = edge->pos; + point->flags |= AF_FLAG_TOUCH_X; + } + else + { + point->y = edge->pos; + point->flags |= AF_FLAG_TOUCH_Y; + } + + if ( point == seg->last ) + break; + + point = point->next; + } + + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + } + + + /* + * + * S T R O N G P O I N T I N T E R P O L A T I O N + * + */ + + + /* hint the strong points -- this is equivalent to the TrueType `IP' */ + /* hinting instruction */ + FT_LOCAL_DEF( void ) + af_glyph_hints_align_strong_points( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_Point points = hints->points; + AF_Point point_limit = points + hints->num_points; + AF_AxisHints axis = &hints->axis[dim]; + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + AF_Flags touch_flag; + + + if ( dim == AF_DIMENSION_HORZ ) + touch_flag = AF_FLAG_TOUCH_X; + else + touch_flag = AF_FLAG_TOUCH_Y; + + if ( edges < edge_limit ) + { + AF_Point point; + AF_Edge edge; + + for ( point = points; point < point_limit; point++ ) + { + FT_Pos u, ou, fu; /* point position */ + FT_Pos delta; + + + if ( point->flags & touch_flag ) + continue; + + /* if this point is candidate to weak interpolation, we will */ + /* interpolate it after all strong points have been processed */ + if ( ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) && + !( point->flags & AF_FLAG_INFLECTION ) ) + continue; + + if ( dim == AF_DIMENSION_VERT ) + { + u = point->fy; + ou = point->oy; + } + else + { + u = point->fx; + ou = point->ox; + } + + fu = u; + + /* is the point before the first edge? */ + edge = edges; + delta = edge->fpos - u; + if ( delta >= 0 ) + { + u = edge->pos - ( edge->opos - ou ); + goto Store_Point; + } + + /* is the point after the last edge? */ + edge = edge_limit - 1; + delta = u - edge->fpos; + if ( delta >= 0 ) + { + u = edge->pos + ( ou - edge->opos ); + goto Store_Point; + } + + { + FT_UInt min, max, mid; + FT_Pos fpos; + + + /* find enclosing edges */ + min = 0; + max = edge_limit - edges; + + while ( min < max ) + { + mid = ( max + min ) >> 1; + edge = edges + mid; + fpos = edge->fpos; + + if ( u < fpos ) + max = mid; + else if ( u > fpos ) + min = mid + 1; + else + { + /* we are on the edge */ + u = edge->pos; + goto Store_Point; + } + } + + { + AF_Edge before = edges + min - 1; + AF_Edge after = edges + min + 0; + + + /* assert( before && after && before != after ) */ + if ( before->scale == 0 ) + before->scale = FT_DivFix( after->pos - before->pos, + after->fpos - before->fpos ); + + u = before->pos + FT_MulFix( fu - before->fpos, + before->scale ); + } + } + + + Store_Point: + + /* save the point position */ + if ( dim == AF_DIMENSION_HORZ ) + point->x = u; + else + point->y = u; + + point->flags |= touch_flag; + } + } + } + + + /* + * + * W E A K P O I N T I N T E R P O L A T I O N + * + */ + + static void + af_iup_shift( AF_Point p1, + AF_Point p2, + AF_Point ref ) + { + AF_Point p; + FT_Pos delta = ref->u - ref->v; + + + for ( p = p1; p < ref; p++ ) + p->u = p->v + delta; + + for ( p = ref + 1; p <= p2; p++ ) + p->u = p->v + delta; + } + + + static void + af_iup_interp( AF_Point p1, + AF_Point p2, + AF_Point ref1, + AF_Point ref2 ) + { + AF_Point p; + FT_Pos u; + FT_Pos v1 = ref1->v; + FT_Pos v2 = ref2->v; + FT_Pos d1 = ref1->u - v1; + FT_Pos d2 = ref2->u - v2; + + + if ( p1 > p2 ) + return; + + if ( v1 == v2 ) + { + for ( p = p1; p <= p2; p++ ) + { + u = p->v; + + if ( u <= v1 ) + u += d1; + else + u += d2; + + p->u = u; + } + return; + } + + if ( v1 < v2 ) + { + for ( p = p1; p <= p2; p++ ) + { + u = p->v; + + if ( u <= v1 ) + u += d1; + else if ( u >= v2 ) + u += d2; + else + u = ref1->u + FT_MulDiv( u - v1, ref2->u - ref1->u, v2 - v1 ); + + p->u = u; + } + } + else + { + for ( p = p1; p <= p2; p++ ) + { + u = p->v; + + if ( u <= v2 ) + u += d2; + else if ( u >= v1 ) + u += d1; + else + u = ref1->u + FT_MulDiv( u - v1, ref2->u - ref1->u, v2 - v1 ); + + p->u = u; + } + } + } + + + FT_LOCAL_DEF( void ) + af_glyph_hints_align_weak_points( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_Point points = hints->points; + AF_Point point_limit = points + hints->num_points; + AF_Point* contour = hints->contours; + AF_Point* contour_limit = contour + hints->num_contours; + AF_Flags touch_flag; + AF_Point point; + AF_Point end_point; + AF_Point first_point; + + + /* PASS 1: Move segment points to edge positions */ + + if ( dim == AF_DIMENSION_HORZ ) + { + touch_flag = AF_FLAG_TOUCH_X; + + for ( point = points; point < point_limit; point++ ) + { + point->u = point->x; + point->v = point->ox; + } + } + else + { + touch_flag = AF_FLAG_TOUCH_Y; + + for ( point = points; point < point_limit; point++ ) + { + point->u = point->y; + point->v = point->oy; + } + } + + point = points; + + for ( ; contour < contour_limit; contour++ ) + { + point = *contour; + end_point = point->prev; + first_point = point; + + while ( point <= end_point && !( point->flags & touch_flag ) ) + point++; + + if ( point <= end_point ) + { + AF_Point first_touched = point; + AF_Point cur_touched = point; + + + point++; + while ( point <= end_point ) + { + if ( point->flags & touch_flag ) + { + /* we found two successive touched points; we interpolate */ + /* all contour points between them */ + af_iup_interp( cur_touched + 1, point - 1, + cur_touched, point ); + cur_touched = point; + } + point++; + } + + if ( cur_touched == first_touched ) + { + /* this is a special case: only one point was touched in the */ + /* contour; we thus simply shift the whole contour */ + af_iup_shift( first_point, end_point, cur_touched ); + } + else + { + /* now interpolate after the last touched point to the end */ + /* of the contour */ + af_iup_interp( cur_touched + 1, end_point, + cur_touched, first_touched ); + + /* if the first contour point isn't touched, interpolate */ + /* from the contour start to the first touched point */ + if ( first_touched > points ) + af_iup_interp( first_point, first_touched - 1, + cur_touched, first_touched ); + } + } + } + + /* now save the interpolated values back to x/y */ + if ( dim == AF_DIMENSION_HORZ ) + { + for ( point = points; point < point_limit; point++ ) + point->x = point->u; + } + else + { + for ( point = points; point < point_limit; point++ ) + point->y = point->u; + } + } diff --git a/reactos/lib/freetype/src/autofit/afhints.h b/reactos/lib/freetype/src/autofit/afhints.h new file mode 100644 index 00000000000..c69cdc66c6d --- /dev/null +++ b/reactos/lib/freetype/src/autofit/afhints.h @@ -0,0 +1,246 @@ +#ifndef __AFHINTS_H__ +#define __AFHINTS_H__ + +#include "aftypes.h" + +FT_BEGIN_HEADER + + /* + * The definition of outline glyph hints. These are shared by all + * script analysis routines (until now) + * + */ + + typedef enum + { + AF_DIMENSION_HORZ = 0, /* x coordinates, i.e. vertical segments & edges */ + AF_DIMENSION_VERT = 1, /* y coordinates, i.e. horizontal segments & edges */ + + AF_DIMENSION_MAX /* do not remove */ + + } AF_Dimension; + + + /* hint directions -- the values are computed so that two vectors are */ + /* in opposite directions iff `dir1+dir2 == 0' */ + typedef enum + { + AF_DIR_NONE = 4, + AF_DIR_RIGHT = 1, + AF_DIR_LEFT = -1, + AF_DIR_UP = 2, + AF_DIR_DOWN = -2 + + } AF_Direction; + + + /* point hint flags */ + typedef enum + { + AF_FLAG_NONE = 0, + + /* point type flags */ + AF_FLAG_CONIC = (1 << 0), + AF_FLAG_CUBIC = (1 << 1), + AF_FLAG_CONTROL = AF_FLAG_CONIC | AF_FLAG_CUBIC, + + /* point extremum flags */ + AF_FLAG_EXTREMA_X = (1 << 2), + AF_FLAG_EXTREMA_Y = (1 << 3), + + /* point roundness flags */ + AF_FLAG_ROUND_X = (1 << 4), + AF_FLAG_ROUND_Y = (1 << 5), + + /* point touch flags */ + AF_FLAG_TOUCH_X = (1 << 6), + AF_FLAG_TOUCH_Y = (1 << 7), + + /* candidates for weak interpolation have this flag set */ + AF_FLAG_WEAK_INTERPOLATION = (1 << 8), + + /* all inflection points in the outline have this flag set */ + AF_FLAG_INFLECTION = (1 << 9) + + } AF_Flags; + + + /* edge hint flags */ + typedef enum + { + AF_EDGE_NORMAL = 0, + AF_EDGE_ROUND = (1 << 0), + AF_EDGE_SERIF = (1 << 1), + AF_EDGE_DONE = (1 << 2) + + } AF_Edge_Flags; + + + + typedef struct AF_PointRec_* AF_Point; + typedef struct AF_SegmentRec_* AF_Segment; + typedef struct AF_EdgeRec_* AF_Edge; + + + typedef struct AF_PointRec_ + { + AF_Flags flags; /* point flags used by hinter */ + FT_Pos ox, oy; /* original, scaled position */ + FT_Pos fx, fy; /* original, unscaled position (font units) */ + FT_Pos x, y; /* current position */ + FT_Pos u, v; /* current (x,y) or (y,x) depending on context */ + + AF_Direction in_dir; /* direction of inwards vector */ + AF_Direction out_dir; /* direction of outwards vector */ + + AF_Point next; /* next point in contour */ + AF_Point prev; /* previous point in contour */ + + } AF_PointRec; + + + typedef struct AF_SegmentRec_ + { + AF_Edge_Flags flags; /* edge/segment flags for this segment */ + AF_Direction dir; /* segment direction */ + FT_Pos pos; /* position of segment */ + FT_Pos min_coord; /* minimum coordinate of segment */ + FT_Pos max_coord; /* maximum coordinate of segment */ + + AF_Edge edge; /* the segment's parent edge */ + AF_Segment edge_next; /* link to next segment in parent edge */ + + AF_Segment link; /* (stem) link segment */ + AF_Segment serif; /* primary segment for serifs */ + FT_Pos num_linked; /* number of linked segments */ + FT_Pos score; /* used during stem matching */ + + AF_Point first; /* first point in edge segment */ + AF_Point last; /* last point in edge segment */ + AF_Point* contour; /* ptr to first point of segment's contour */ + + } AF_SegmentRec; + + + typedef struct AF_EdgeRec_ + { + FT_Pos fpos; /* original, unscaled position (font units) */ + FT_Pos opos; /* original, scaled position */ + FT_Pos pos; /* current position */ + + AF_Edge_Flags flags; /* edge flags */ + AF_Direction dir; /* edge direction */ + FT_Fixed scale; /* used to speed up interpolation between edges */ + AF_Width blue_edge; /* non-NULL if this is a blue edge */ + + AF_Edge link; + AF_Edge serif; + FT_Int num_linked; + + FT_Int score; + + AF_Segment first; + AF_Segment last; + + } AF_EdgeRec; + + + typedef struct AF_AxisHintsRec_ + { + FT_Int num_segments; + AF_Segment segments; + + FT_Int num_edges; + AF_Edge edges; + + AF_Direction major_dir; + + } AF_AxisHintsRec, *AF_AxisHints; + + + typedef struct AF_GlyphHintsRec_ + { + FT_Memory memory; + + FT_Fixed x_scale; + FT_Pos x_delta; + + FT_Fixed y_scale; + FT_Pos y_delta; + + FT_Pos edge_distance_threshold; + + FT_Int max_points; + FT_Int num_points; + AF_Point points; + + FT_Int max_contours; + FT_Int num_contours; + AF_Point* contours; + + AF_AxisHintsRec axis[ AF_DIMENSION_MAX ]; + + FT_UInt32 scaler_flags; /* copy of scaler flags */ + FT_UInt32 other_flags; /* free for script-specific implementations */ + AF_ScriptMetrics metrics; + + } AF_GlyphHintsRec; + + +#define AF_HINTS_TEST_SCALER(h,f) ( (h)->scaler_flags & (f) ) +#define AF_HINTS_TEST_OTHER(h,f) ( (h)->other_flags & (f) ) + +#define AF_HINTS_DO_HORIZONTAL(h) \ + !AF_HINTS_TEST_SCALER(h,AF_SCALER_FLAG_NO_HORIZONTAL) + +#define AF_HINTS_DO_VERTICAL(h) \ + !AF_HINTS_TEST_SCALER(h,AF_SCALER_FLAG_NO_VERTICAL) + +#define AF_HINTS_DO_ADVANCE(h) \ + !AF_HINTS_TEST_SCALER(h,AF_SCALER_FLAG_NO_ADVANCE) + + + FT_LOCAL( AF_Direction ) + af_direction_compute( FT_Pos dx, + FT_Pos dy ); + + + FT_LOCAL( void ) + af_glyph_hints_init( AF_GlyphHints hints, + FT_Memory memory ); + + + + /* recomputes all AF_Point in a AF_GlyphHints from the definitions + * in a source outline + */ + FT_LOCAL( FT_Error ) + af_glyph_hints_reset( AF_GlyphHints hints, + AF_Scaler scaler, + AF_ScriptMetrics metrics, + FT_Outline* outline ); + + FT_LOCAL( void ) + af_glyph_hints_save( AF_GlyphHints hints, + FT_Outline* outline ); + + FT_LOCAL( void ) + af_glyph_hints_align_edge_points( AF_GlyphHints hints, + AF_Dimension dim ); + + FT_LOCAL( void ) + af_glyph_hints_align_strong_points( AF_GlyphHints hints, + AF_Dimension dim ); + + FT_LOCAL( void ) + af_glyph_hints_align_weak_points( AF_GlyphHints hints, + AF_Dimension dim ); + + FT_LOCAL( void ) + af_glyph_hints_done( AF_GlyphHints hints ); + +/* */ + +FT_END_HEADER + +#endif /* __AFHINTS_H__ */ diff --git a/reactos/lib/freetype/src/autofit/aflatin.c b/reactos/lib/freetype/src/autofit/aflatin.c new file mode 100644 index 00000000000..9a20110fbb0 --- /dev/null +++ b/reactos/lib/freetype/src/autofit/aflatin.c @@ -0,0 +1,1789 @@ +#include "aflatin.h" + + /***************************************************************************/ + /***************************************************************************/ + /***** *****/ + /***** L A T I N G L O B A L M E T R I C S *****/ + /***** *****/ + /***************************************************************************/ + /***************************************************************************/ + + static void + af_latin_metrics_init_widths( AF_LatinMetrics metrics, + FT_Face face ) + { + /* scan the array of segments in each direction */ + AF_GlyphHintsRec hints[1]; + + af_glyph_hints_init( hints, face->memory ); + + metrics->axis[ AF_DIMENSION_HORZ ].width_count = 0; + metrics->axis[ AF_DIMENSION_VERT ].width_count = 0; + + /* For now, compute the standard width and height from the `o' */ + { + FT_Error error; + FT_UInt glyph_index; + AF_Dimension dim; + AF_ScalerRec scaler[1]; + + + glyph_index = FT_Get_Char_Index( face, 'o' ); + if ( glyph_index == 0 ) + goto Exit; + + error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); + if ( error || face->glyph->outline.n_points <= 0 ) + goto Exit; + + scaler->x_scale = scaler->y_scale = 0x10000L; + scaler->x_delta = scaler->y_delta = 0; + scaler->face = face; + scaler->render_mode = 0; + scaler->flags = 0; + + error = af_glyph_hints_reset( hints, scaler, + (AF_ScriptMetrics) metrics, + &face->glyph->outline ); + if ( error ) + goto Exit; + + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + AF_LatinAxis axis = & metrics->axis[ dim ]; + AF_AxisHints axhints = & hints->axis[ dim ]; + AF_Segment seg, limit, link; + FT_UInt num_widths = 0; + FT_Pos edge_distance_threshold = 32000; + + af_latin_hints_compute_segments( hints, dim ); + af_latin_hints_link_segments ( hints, dim ); + + seg = axhints->segments; + limit = seg + axhints->num_segments; + + for ( ; seg < limit; seg++ ) + { + link = seg->link; + /* we only consider stem segments there! */ + if ( link && link->link == seg && link > seg ) + { + FT_Pos dist; + + + dist = seg->pos - link->pos; + if ( dist < 0 ) + dist = -dist; + + if ( num_widths < AF_LATIN_MAX_WIDTHS ) + axis->widths[ num_widths++ ].org = dist; + } + } + + af_sort_widths( num_widths, axis->widths ); + axis->width_count = num_widths; + + /* we will now try to find the smallest width */ + if ( num_widths > 0 && axis->widths[0].org < edge_distance_threshold ) + edge_distance_threshold = axis->widths[0].org; + + /* Now, compute the edge distance threshold as a fraction of the */ + /* smallest width in the font. Set it in `hinter->glyph' too! */ + if ( edge_distance_threshold == 32000 ) + edge_distance_threshold = 50; + + /* let's try 20% */ + axis->edge_distance_threshold = edge_distance_threshold / 5; + } + } + + Exit: + af_glyph_hints_done( hints ); + } + + + +#define AF_LATIN_MAX_TEST_CHARACTERS 12 + + + static const char* const af_latin_blue_chars[ AF_LATIN_MAX_BLUES ] = + { + "THEZOCQS", + "HEZLOCUS", + "fijkdbh", + "xzroesc", + "xzroesc", + "pqgjy" + }; + + + static void + af_latin_metrics_init_blues( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_Pos flats [ AF_LATIN_MAX_TEST_CHARACTERS ]; + FT_Pos rounds[ AF_LATIN_MAX_TEST_CHARACTERS ]; + FT_Int num_flats; + FT_Int num_rounds; + FT_Int bb; + AF_LatinBlue blue; + FT_Error error; + AF_LatinAxis axis = &metrics->axis[ AF_DIMENSION_VERT ]; + FT_GlyphSlot glyph = face->glyph; + + /* we compute the blues simply by loading each character from the */ + /* 'af_latin_blue_chars[blues]' string, then compute its top-most or */ + /* bottom-most points (depending on `AF_IS_TOP_BLUE') */ + + AF_LOG(( "blue zones computation\n" )); + AF_LOG(( "------------------------------------------------\n" )); + + for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ ) + { + const char* p = af_latin_blue_chars[bb]; + const char* limit = p + AF_LATIN_MAX_TEST_CHARACTERS; + FT_Pos* blue_ref; + FT_Pos* blue_shoot; + + AF_LOG(( "blue %3d: ", bb )); + + num_flats = 0; + num_rounds = 0; + + for ( ; p < limit && *p; p++ ) + { + FT_UInt glyph_index; + FT_Vector* extremum; + FT_Vector* points; + FT_Vector* point_limit; + FT_Vector* point; + FT_Bool round; + + + AF_LOG(( "'%c'", *p )); + + /* load the character in the face -- skip unknown or empty ones */ + glyph_index = FT_Get_Char_Index( face, (FT_UInt)*p ); + if ( glyph_index == 0 ) + continue; + + error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); + if ( error || glyph->outline.n_points <= 0 ) + continue; + + /* now compute min or max point indices and coordinates */ + points = glyph->outline.points; + point_limit = points + glyph->outline.n_points; + point = points; + extremum = point; + point++; + + if ( AF_LATIN_IS_TOP_BLUE( bb ) ) + { + for ( ; point < point_limit; point++ ) + if ( point->y > extremum->y ) + extremum = point; + } + else + { + for ( ; point < point_limit; point++ ) + if ( point->y < extremum->y ) + extremum = point; + } + + AF_LOG(( "%5d", (int)extremum->y )); + + /* now, check whether the point belongs to a straight or round */ + /* segment; we first need to find in which contour the extremum */ + /* lies, then see its previous and next points */ + { + FT_Int idx = (FT_Int)( extremum - points ); + FT_Int n; + FT_Int first, last, prev, next, end; + FT_Pos dist; + + + last = -1; + first = 0; + + for ( n = 0; n < glyph->outline.n_contours; n++ ) + { + end = glyph->outline.contours[n]; + if ( end >= idx ) + { + last = end; + break; + } + first = end + 1; + } + + /* XXX: should never happen! */ + if ( last < 0 ) + continue; + + /* now look for the previous and next points that are not on the */ + /* same Y coordinate. Threshold the `closeness'... */ + + prev = idx; + next = prev; + + do + { + if ( prev > first ) + prev--; + else + prev = last; + + dist = points[prev].y - extremum->y; + if ( dist < -5 || dist > 5 ) + break; + + } while ( prev != idx ); + + do + { + if ( next < last ) + next++; + else + next = first; + + dist = points[next].y - extremum->y; + if ( dist < -5 || dist > 5 ) + break; + + } while ( next != idx ); + + /* now, set the `round' flag depending on the segment's kind */ + round = FT_BOOL( + FT_CURVE_TAG( glyph->outline.tags[prev] ) != FT_CURVE_TAG_ON || + FT_CURVE_TAG( glyph->outline.tags[next] ) != FT_CURVE_TAG_ON ); + + AF_LOG(( "%c ", round ? 'r' : 'f' )); + } + + if ( round ) + rounds[num_rounds++] = extremum->y; + else + flats[num_flats++] = extremum->y; + } + + AF_LOG(( "\n" )); + + if ( num_flats == 0 && num_rounds == 0 ) + { + /* we couldn't find a single glyph to compute this blue zone, + * we will simply ignore it then + */ + AF_LOG(( "empty !!\n" )); + continue; + } + + /* we have computed the contents of the `rounds' and `flats' tables, */ + /* now determine the reference and overshoot position of the blue -- */ + /* we simply take the median value after a simple sort */ + af_sort_pos( num_rounds, rounds ); + af_sort_pos( num_flats, flats ); + + blue = & axis->blues[ axis->blue_count ]; + blue_ref = & blue->ref.org; + blue_shoot = & blue->shoot.org; + + axis->blue_count ++; + + if ( num_flats == 0 ) + { + *blue_ref = + *blue_shoot = rounds[num_rounds / 2]; + } + else if ( num_rounds == 0 ) + { + *blue_ref = + *blue_shoot = flats[num_flats / 2]; + } + else + { + *blue_ref = flats[num_flats / 2]; + *blue_shoot = rounds[num_rounds / 2]; + } + + /* there are sometimes problems: if the overshoot position of top */ + /* zones is under its reference position, or the opposite for bottom */ + /* zones. We must thus check everything there and correct the errors */ + if ( *blue_shoot != *blue_ref ) + { + FT_Pos ref = *blue_ref; + FT_Pos shoot = *blue_shoot; + FT_Bool over_ref = FT_BOOL( shoot > ref ); + + + if ( AF_LATIN_IS_TOP_BLUE( bb ) ^ over_ref ) + *blue_shoot = *blue_ref = ( shoot + ref ) / 2; + } + + blue->flags = 0; + if ( AF_LATIN_IS_TOP_BLUE(bb) ) + blue->flags |= AF_LATIN_BLUE_TOP; + + AF_LOG(( "-- ref = %ld, shoot = %ld\n", *blue_ref, *blue_shoot )); + } + + return; + } + + + FT_LOCAL_DEF( FT_Error ) + af_latin_metrics_init( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_Error error; + FT_CharMap oldmap = face->charmap; + + /* do we have a Unicode charmap in there? */ + error = FT_Select_Charmap( face, FT_ENCODING_UNICODE ); + if ( error ) goto Exit; + + metrics->units_per_em = face->units_per_EM; + + af_latin_metrics_init_widths( metrics, face ); + af_latin_metrics_init_blues( metrics, face ); + + Exit: + FT_Set_Charmap( face, oldmap ); + return error; + } + + + static void + af_latin_metrics_scale_dim( AF_LatinMetrics metrics, + AF_Scaler scaler, + AF_Dimension dim ) + { + FT_Fixed scale; + FT_Pos delta; + AF_LatinAxis axis; + FT_UInt nn; + + if ( dim == AF_DIMENSION_HORZ ) + { + scale = scaler->x_scale; + delta = scaler->x_delta; + } + else + { + scale = scaler->y_scale; + delta = scaler->y_delta; + } + + axis = & metrics->axis[ dim ]; + + if ( axis->org_scale == scale && axis->org_delta == delta ) + return; + + axis->org_scale = scale; + axis->org_delta = delta; + + /* XXX: TODO: Correct Y and X scale according to Chester rules + */ + axis->scale = scale; + axis->delta = delta; + + if ( dim == AF_DIMENSION_HORZ ) + { + metrics->root.scaler.x_scale = scale; + metrics->root.scaler.x_delta = delta; + } + else + { + metrics->root.scaler.y_scale = scale; + metrics->root.scaler.y_delta = delta; + } + + /* scale the standard widths + */ + for ( nn = 0; nn < axis->width_count; nn++ ) + { + AF_Width width = axis->widths + nn; + + width->cur = FT_MulFix( width->org, scale ); + width->fit = width->cur; + } + + if ( dim == AF_DIMENSION_VERT ) + { + /* scale the blue zones + */ + for ( nn = 0; nn < axis->blue_count; nn++ ) + { + AF_LatinBlue blue = & axis->blues[nn]; + FT_Pos dist; + + blue->ref.cur = FT_MulFix( blue->ref.org, scale ) + delta; + blue->ref.fit = blue->ref.cur; + + blue->shoot.cur = FT_MulFix( blue->shoot.org, scale ) + delta; + blue->shoot.fit = blue->shoot.cur; + + /* a blue zone is only active when it is less than 3/4 pixels tall + */ + dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale ); + if ( dist >= 48 || dist <= -48 ) + blue->flags |= ~AF_LATIN_BLUE_ACTIVE; + } + } + } + + + FT_LOCAL_DEF( void ) + af_latin_metrics_scale( AF_LatinMetrics metrics, + AF_Scaler scaler ) + { + af_latin_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ ); + af_latin_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT ); + } + + + /***************************************************************************/ + /***************************************************************************/ + /***** *****/ + /***** L A T I N G L Y P H A N A L Y S I S *****/ + /***** *****/ + /***************************************************************************/ + /***************************************************************************/ + + FT_LOCAL_DEF( void ) + af_latin_hints_compute_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Segment segments = axis->segments; + AF_Segment segment = segments; + FT_Int num_segments = 0; + AF_Point* contour = hints->contours; + AF_Point* contour_limit = contour + hints->num_contours; + AF_Direction major_dir, segment_dir; + +#ifdef AF_HINT_METRICS + AF_Point min_point = 0; + AF_Point max_point = 0; + FT_Pos min_coord = 32000; + FT_Pos max_coord = -32000; +#endif + + major_dir = FT_ABS( axis->major_dir ); + segment_dir = major_dir; + + /* set up (u,v) in each point */ + if ( dim == AF_DIMENSION_HORZ ) + { + AF_Point point = hints->points; + AF_Point limit = point + hints->num_points; + + for ( ; point < limit; point++ ) + { + point->u = point->fx; + point->v = point->fy; + } + } + else + { + AF_Point point = hints->points; + AF_Point limit = point + hints->num_points; + + for ( ; point < limit; point++ ) + { + point->u = point->fy; + point->v = point->fx; + } + } + + + /* do each contour separately */ + for ( ; contour < contour_limit; contour++ ) + { + AF_Point point = contour[0]; + AF_Point last = point->prev; + int on_edge = 0; + FT_Pos min_pos = 32000; /* minimum segment pos != min_coord */ + FT_Pos max_pos = -32000; /* maximum segment pos != max_coord */ + FT_Bool passed; + + +#ifdef AF_HINT_METRICS + if ( point->u < min_coord ) + { + min_coord = point->u; + min_point = point; + } + if ( point->u > max_coord ) + { + max_coord = point->u; + max_point = point; + } +#endif + + if ( point == last ) /* skip singletons -- just in case */ + continue; + + if ( FT_ABS( last->out_dir ) == major_dir && + FT_ABS( point->out_dir ) == major_dir ) + { + /* we are already on an edge, try to locate its start */ + last = point; + + for (;;) + { + point = point->prev; + if ( FT_ABS( point->out_dir ) != major_dir ) + { + point = point->next; + break; + } + if ( point == last ) + break; + } + } + + last = point; + passed = 0; + + for (;;) + { + FT_Pos u, v; + + + if ( on_edge ) + { + u = point->u; + if ( u < min_pos ) + min_pos = u; + if ( u > max_pos ) + max_pos = u; + + if ( point->out_dir != segment_dir || point == last ) + { + /* we are just leaving an edge; record a new segment! */ + segment->last = point; + segment->pos = ( min_pos + max_pos ) >> 1; + + /* a segment is round if either its first or last point */ + /* is a control point */ + if ( ( segment->first->flags | point->flags ) & + AF_FLAG_CONTROL ) + segment->flags |= AF_EDGE_ROUND; + + /* compute segment size */ + min_pos = max_pos = point->v; + + v = segment->first->v; + if ( v < min_pos ) + min_pos = v; + if ( v > max_pos ) + max_pos = v; + + segment->min_coord = min_pos; + segment->max_coord = max_pos; + + on_edge = 0; + num_segments++; + segment++; + /* fallthrough */ + } + } + + /* now exit if we are at the start/end point */ + if ( point == last ) + { + if ( passed ) + break; + passed = 1; + } + + if ( !on_edge && FT_ABS( point->out_dir ) == major_dir ) + { + /* this is the start of a new segment! */ + segment_dir = point->out_dir; + + /* clear all segment fields */ + FT_ZERO( segment ); + + segment->dir = segment_dir; + segment->flags = AF_EDGE_NORMAL; + min_pos = max_pos = point->u; + segment->first = point; + segment->last = point; + segment->contour = contour; + segment->score = 32000; + segment->link = NULL; + on_edge = 1; + +#ifdef AF_HINT_METRICS + if ( point == max_point ) + max_point = 0; + + if ( point == min_point ) + min_point = 0; +#endif + } + + point = point->next; + } + + } /* contours */ + +#ifdef AF_HINT_METRICS + /* we need to ensure that there are edges on the left-most and */ + /* right-most points of the glyph in order to hint the metrics; */ + /* we do this by inserting fake segments when needed */ + if ( dim == AF_DIMENSION_HORZ ) + { + AF_Point point = hints->points; + AF_Point point_limit = point + hints->num_points; + + FT_Pos min_pos = 32000; + FT_Pos max_pos = -32000; + + + min_point = 0; + max_point = 0; + + /* compute minimum and maximum points */ + for ( ; point < point_limit; point++ ) + { + FT_Pos x = point->fx; + + + if ( x < min_pos ) + { + min_pos = x; + min_point = point; + } + if ( x > max_pos ) + { + max_pos = x; + max_point = point; + } + } + + /* insert minimum segment */ + if ( min_point ) + { + /* clear all segment fields */ + FT_ZERO( segment ); + + segment->dir = segment_dir; + segment->flags = AF_EDGE_NORMAL; + segment->first = min_point; + segment->last = min_point; + segment->pos = min_pos; + segment->score = 32000; + segment->link = NULL; + + num_segments++; + segment++; + } + + /* insert maximum segment */ + if ( max_point ) + { + /* clear all segment fields */ + FT_ZERO( segment ); + + segment->dir = segment_dir; + segment->flags = AF_EDGE_NORMAL; + segment->first = max_point; + segment->last = max_point; + segment->pos = max_pos; + segment->score = 32000; + segment->link = NULL; + + num_segments++; + segment++; + } + } +#endif /* AF_HINT_METRICS */ + + axis->num_segments = num_segments; + } + + + FT_LOCAL_DEF( void ) + af_latin_hints_link_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + AF_Direction major_dir = axis->major_dir; + AF_Segment seg1, seg2; + + /* now compare each segment to the others */ + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + /* the fake segments are introduced to hint the metrics -- */ + /* we must never link them to anything */ + if ( seg1->first == seg1->last || seg1->dir != major_dir ) + continue; + + for ( seg2 = segments; seg2 < segment_limit; seg2++ ) + if ( seg2 != seg1 && seg1->dir + seg2->dir == 0 ) + { + FT_Pos pos1 = seg1->pos; + FT_Pos pos2 = seg2->pos; + FT_Pos dist = pos2 - pos1; + + + if ( dist < 0 ) + continue; + + { + FT_Pos min = seg1->min_coord; + FT_Pos max = seg1->max_coord; + FT_Pos len, score; + + + if ( min < seg2->min_coord ) + min = seg2->min_coord; + + if ( max > seg2->max_coord ) + max = seg2->max_coord; + + len = max - min; + if ( len >= 8 ) + { + score = dist + 3000 / len; + + if ( score < seg1->score ) + { + seg1->score = score; + seg1->link = seg2; + } + + if ( score < seg2->score ) + { + seg2->score = score; + seg2->link = seg1; + } + } + } + } + } + + /* now, compute the `serif' segments */ + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + seg2 = seg1->link; + + if ( seg2 ) + { + seg2->num_linked++; + if ( seg2->link != seg1 ) + { + seg1->link = 0; + seg1->serif = seg2->link; + } + } + } + } + + + FT_LOCAL_DEF( void ) + af_latin_hints_compute_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Edge edges = axis->edges; + AF_Edge edge, edge_limit; + + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + AF_Segment seg; + + AF_Direction up_dir; + FT_Fixed scale; + FT_Pos edge_distance_threshold; + + + scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale + : hints->y_scale; + + up_dir = ( dim == AF_DIMENSION_HORZ ) ? AF_DIR_UP + : AF_DIR_RIGHT; + + /*********************************************************************/ + /* */ + /* We will begin by generating a sorted table of edges for the */ + /* current direction. To do so, we simply scan each segment and try */ + /* to find an edge in our table that corresponds to its position. */ + /* */ + /* If no edge is found, we create and insert a new edge in the */ + /* sorted table. Otherwise, we simply add the segment to the edge's */ + /* list which will be processed in the second step to compute the */ + /* edge's properties. */ + /* */ + /* Note that the edges table is sorted along the segment/edge */ + /* position. */ + /* */ + /*********************************************************************/ + + edge_distance_threshold = FT_MulFix( hints->edge_distance_threshold, + scale ); + if ( edge_distance_threshold > 64 / 4 ) + edge_distance_threshold = 64 / 4; + + edge_distance_threshold = FT_DivFix( edge_distance_threshold, + scale ); + + edge_limit = edges; + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Edge found = 0; + + + /* look for an edge corresponding to the segment */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + FT_Pos dist; + + + dist = seg->pos - edge->fpos; + if ( dist < 0 ) + dist = -dist; + + if ( dist < edge_distance_threshold ) + { + found = edge; + break; + } + } + + if ( !found ) + { + /* insert a new edge in the list and */ + /* sort according to the position */ + while ( edge > edges && edge[-1].fpos > seg->pos ) + { + edge[0] = edge[-1]; + edge--; + } + edge_limit++; + + /* clear all edge fields */ + FT_ZERO( edge ); + + /* add the segment to the new edge's list */ + edge->first = seg; + edge->last = seg; + edge->fpos = seg->pos; + edge->opos = edge->pos = FT_MulFix( seg->pos, scale ); + seg->edge_next = seg; + } + else + { + /* if an edge was found, simply add the segment to the edge's */ + /* list */ + seg->edge_next = edge->first; + edge->last->edge_next = seg; + edge->last = seg; + } + } + axis->num_edges = (FT_Int)( edge_limit - edges ); + + + /*********************************************************************/ + /* */ + /* Good, we will now compute each edge's properties according to */ + /* segments found on its position. Basically, these are: */ + /* */ + /* - edge's main direction */ + /* - stem edge, serif edge or both (which defaults to stem then) */ + /* - rounded edge, straight or both (which defaults to straight) */ + /* - link for edge */ + /* */ + /*********************************************************************/ + + /* first of all, set the `edge' field in each segment -- this is */ + /* required in order to compute edge links */ + + /* Note that I've tried to remove this loop, setting + * the "edge" field of each segment directly in the + * code above. For some reason, it slows down execution + * speed -- on a Sun. + */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + seg = edge->first; + if ( seg ) + do + { + seg->edge = edge; + seg = seg->edge_next; + } + while ( seg != edge->first ); + } + + /* now, compute each edge properties */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + FT_Int is_round = 0; /* does it contain round segments? */ + FT_Int is_straight = 0; /* does it contain straight segments? */ + FT_Pos ups = 0; /* number of upwards segments */ + FT_Pos downs = 0; /* number of downwards segments */ + + + seg = edge->first; + + do + { + FT_Bool is_serif; + + + /* check for roundness of segment */ + if ( seg->flags & AF_EDGE_ROUND ) + is_round++; + else + is_straight++; + + /* check for segment direction */ + if ( seg->dir == up_dir ) + ups += seg->max_coord-seg->min_coord; + else + downs += seg->max_coord-seg->min_coord; + + /* check for links -- if seg->serif is set, then seg->link must */ + /* be ignored */ + is_serif = (FT_Bool)( seg->serif && seg->serif->edge != edge ); + + if ( seg->link || is_serif ) + { + AF_Edge edge2; + AF_Segment seg2; + + + edge2 = edge->link; + seg2 = seg->link; + + if ( is_serif ) + { + seg2 = seg->serif; + edge2 = edge->serif; + } + + if ( edge2 ) + { + FT_Pos edge_delta; + FT_Pos seg_delta; + + + edge_delta = edge->fpos - edge2->fpos; + if ( edge_delta < 0 ) + edge_delta = -edge_delta; + + seg_delta = seg->pos - seg2->pos; + if ( seg_delta < 0 ) + seg_delta = -seg_delta; + + if ( seg_delta < edge_delta ) + edge2 = seg2->edge; + } + else + edge2 = seg2->edge; + + if ( is_serif ) + { + edge->serif = edge2; + edge2->flags |= AF_EDGE_SERIF; + } + else + edge->link = edge2; + } + + seg = seg->edge_next; + + } while ( seg != edge->first ); + + /* set the round/straight flags */ + edge->flags = AF_EDGE_NORMAL; + + if ( is_round > 0 && is_round >= is_straight ) + edge->flags |= AF_EDGE_ROUND; + + /* set the edge's main direction */ + edge->dir = AF_DIR_NONE; + + if ( ups > downs ) + edge->dir = up_dir; + + else if ( ups < downs ) + edge->dir = -up_dir; + + else if ( ups == downs ) + edge->dir = 0; /* both up and down! */ + + /* gets rid of serifs if link is set */ + /* XXX: This gets rid of many unpleasant artefacts! */ + /* Example: the `c' in cour.pfa at size 13 */ + + if ( edge->serif && edge->link ) + edge->serif = 0; + } + } + + + FT_LOCAL_DEF( void ) + af_latin_hints_detect_features( AF_GlyphHints hints, + AF_Dimension dim ) + { + af_latin_hints_compute_segments( hints, dim ); + af_latin_hints_link_segments ( hints, dim ); + af_latin_hints_compute_edges ( hints, dim ); + } + + + FT_LOCAL_DEF( void ) + af_latin_hints_compute_blue_edges( AF_GlyphHints hints, + AF_LatinMetrics metrics ) + { + AF_AxisHints axis = &hints->axis[ AF_DIMENSION_VERT ]; + AF_Edge edge = axis->edges; + AF_Edge edge_limit = edge + axis->num_edges; + AF_LatinAxis latin = &metrics->axis[ AF_DIMENSION_VERT ]; + FT_Fixed scale = latin->scale; + + + /* compute which blue zones are active, i.e. have their scaled */ + /* size < 3/4 pixels */ + + /* for each horizontal edge search the blue zone which is closest */ + for ( ; edge < edge_limit; edge++ ) + { + FT_Int bb; + AF_Width best_blue = NULL; + FT_Pos best_dist; /* initial threshold */ + + + /* compute the initial threshold as a fraction of the EM size */ + best_dist = FT_MulFix( metrics->units_per_em / 40, scale ); + + if ( best_dist > 64 / 2 ) + best_dist = 64 / 2; + + for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ ) + { + AF_LatinBlue blue = latin->blues + bb; + FT_Bool is_top_blue, is_major_dir; + + /* skip inactive blue zones (i.e. those that are too small + */ + if ( !(blue->flags & AF_LATIN_BLUE_ACTIVE) ) + continue; + + /* if it is a top zone, check for right edges -- if it is a bottom */ + /* zone, check for left edges */ + /* */ + /* of course, that's for TrueType */ + is_top_blue = (blue->flags & AF_LATIN_BLUE_TOP) != 0; + is_major_dir = FT_BOOL( edge->dir == axis->major_dir ); + + /* if it is a top zone, the edge must be against the major */ + /* direction; if it is a bottom zone, it must be in the major */ + /* direction */ + if ( is_top_blue ^ is_major_dir ) + { + FT_Pos dist; + + + /* first of all, compare it to the reference position */ + dist = edge->fpos - blue->ref.org; + if ( dist < 0 ) + dist = -dist; + + dist = FT_MulFix( dist, scale ); + if ( dist < best_dist ) + { + best_dist = dist; + best_blue = & blue->ref; + } + + /* now, compare it to the overshoot position if the edge is */ + /* rounded, and if the edge is over the reference position of a */ + /* top zone, or under the reference position of a bottom zone */ + if ( edge->flags & AF_EDGE_ROUND && dist != 0 ) + { + FT_Bool is_under_ref = FT_BOOL( edge->fpos < blue->ref.org ); + + + if ( is_top_blue ^ is_under_ref ) + { + blue = latin->blues + bb; + dist = edge->fpos - blue->shoot.org; + if ( dist < 0 ) + dist = -dist; + + dist = FT_MulFix( dist, scale ); + if ( dist < best_dist ) + { + best_dist = dist; + best_blue = & blue->shoot; + } + } + } + } + } + + if ( best_blue ) + edge->blue_edge = best_blue; + } + } + + + static FT_Error + af_latin_hints_init( AF_GlyphHints hints, + FT_Outline* outline, + AF_LatinMetrics metrics ) + { + FT_Error error; + FT_Render_Mode mode; + + error = af_glyph_hints_reset( hints, &metrics->root.scaler, + (AF_ScriptMetrics) metrics, + outline ); + if (error) + goto Exit; + + + /* compute flags depending on render mode, etc... + */ + + mode = metrics->root.scaler.render_mode; + + /* we snap the width of vertical stems for the monochrome and + * horizontal LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD ) + hints->other_flags |= AF_LATIN_HINTS_HORZ_SNAP; + + /* we snap the width of horizontal stems for the monochrome and + * vertical LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V ) + hints->other_flags |= AF_LATIN_HINTS_VERT_SNAP; + + /* XXX + */ + if ( mode != FT_RENDER_MODE_LIGHT ) + hints->other_flags |= AF_LATIN_HINTS_STEM_ADJUST; + + if ( mode == FT_RENDER_MODE_MONO ) + hints->other_flags |= AF_LATIN_HINTS_MONO; + + /* analyze glyph outline + */ + if ( AF_HINTS_DO_HORIZONTAL(hints) ) + af_latin_hints_detect_features( hints, AF_DIMENSION_HORZ ); + + if ( AF_HINTS_DO_VERTICAL(hints) ) + { + af_latin_hints_detect_features( hints, AF_DIMENSION_VERT ); + af_latin_hints_compute_blue_edges( hints, metrics ); + } + + Exit: + return error; + } + + /***************************************************************************/ + /***************************************************************************/ + /***** *****/ + /***** L A T I N G L Y P H G R I D - F I T T I N G *****/ + /***** *****/ + /***************************************************************************/ + /***************************************************************************/ + + /* snap a given width in scaled coordinates to one of the */ + /* current standard widths */ + static FT_Pos + af_latin_snap_width( AF_Width widths, + FT_Int count, + FT_Pos width ) + { + int n; + FT_Pos best = 64 + 32 + 2; + FT_Pos reference = width; + FT_Pos scaled; + + + for ( n = 0; n < count; n++ ) + { + FT_Pos w; + FT_Pos dist; + + + w = widths[n].cur; + dist = width - w; + if ( dist < 0 ) + dist = -dist; + if ( dist < best ) + { + best = dist; + reference = w; + } + } + + scaled = FT_PIX_ROUND( reference ); + + if ( width >= reference ) + { + if ( width < scaled + 48 ) + width = reference; + } + else + { + if ( width > scaled - 48 ) + width = reference; + } + + return width; + } + + + /* compute the snapped width of a given stem */ + + static FT_Pos + af_latin_compute_stem_width( AF_GlyphHints hints, + AF_Dimension dim, + FT_Pos width, + AF_Edge_Flags base_flags, + AF_Edge_Flags stem_flags ) + { + AF_LatinMetrics metrics = (AF_LatinMetrics) hints->metrics; + AF_LatinAxis axis = & metrics->axis[ dim ]; + FT_Pos dist = width; + FT_Int sign = 0; + FT_Int vertical = AF_HINTS_DO_VERTICAL( hints ); + + + if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ) + return width; + + if ( dist < 0 ) + { + dist = -width; + sign = 1; + } + + if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) || + ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) + { + /* smooth hinting process: very lightly quantize the stem width */ + /* */ + + /* leave the widths of serifs alone */ + + if ( ( stem_flags & AF_EDGE_SERIF ) && vertical && ( dist < 3 * 64 ) ) + goto Done_Width; + + else if ( ( base_flags & AF_EDGE_ROUND ) ) + { + if ( dist < 80 ) + dist = 64; + } + else if ( dist < 56 ) + dist = 56; + + if ( axis->width_count > 0 ) + { + FT_Pos delta; + + /* compare to standard width + */ + if ( axis->width_count > 0 ) + { + delta = dist - axis->widths[0].cur; + + if ( delta < 0 ) + delta = -delta; + + if ( delta < 40 ) + { + dist = axis->widths[ 0 ].cur; + if ( dist < 48 ) + dist = 48; + + goto Done_Width; + } + } + + if ( dist < 3 * 64 ) + { + delta = dist & 63; + dist &= -64; + + if ( delta < 10 ) + dist += delta; + + else if ( delta < 32 ) + dist += 10; + + else if ( delta < 54 ) + dist += 54; + + else + dist += delta; + } + else + dist = ( dist + 32 ) & ~63; + } + } + else + { + /* strong hinting process: snap the stem width to integer pixels */ + /* */ + dist = af_latin_snap_width( axis->widths, axis->width_count, dist ); + + if ( vertical ) + { + /* in the case of vertical hinting, always round */ + /* the stem heights to integer pixels */ + if ( dist >= 64 ) + dist = ( dist + 16 ) & ~63; + else + dist = 64; + } + else + { + if ( AF_LATIN_HINTS_DO_MONO( hints ) ) + { + /* monochrome horizontal hinting: snap widths to integer pixels */ + /* with a different threshold */ + if ( dist < 64 ) + dist = 64; + else + dist = ( dist + 32 ) & ~63; + } + else + { + /* for horizontal anti-aliased hinting, we adopt a more subtle */ + /* approach: we strengthen small stems, round stems whose size */ + /* is between 1 and 2 pixels to an integer, otherwise nothing */ + if ( dist < 48 ) + dist = ( dist + 64 ) >> 1; + + else if ( dist < 128 ) + dist = ( dist + 22 ) & ~63; + else + /* round otherwise to prevent color fringes in LCD mode */ + dist = ( dist + 32 ) & ~63; + } + } + } + + Done_Width: + if ( sign ) + dist = -dist; + + return dist; + } + + + + /* align one stem edge relative to the previous stem edge */ + static void + af_latin_align_linked_edge( AF_GlyphHints hints, + AF_Dimension dim, + AF_Edge base_edge, + AF_Edge stem_edge ) + { + FT_Pos dist = stem_edge->opos - base_edge->opos; + + FT_Pos fitted_width = af_latin_compute_stem_width( hints, + dim, + dist, + base_edge->flags, + stem_edge->flags ); + + stem_edge->pos = base_edge->pos + fitted_width; + } + + + static void + af_latin_align_serif_edge( AF_GlyphHints hints, + AF_Edge base, + AF_Edge serif ) + { + FT_UNUSED( hints ); + + serif->pos = base->pos + (serif->opos - base->opos); + } + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** E D G E H I N T I N G ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF( void ) + af_latin_hint_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = & hints->axis[dim]; + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + FT_Int n_edges; + AF_Edge edge; + AF_Edge anchor = 0; + FT_Int has_serifs = 0; + + + /* we begin by aligning all stems relative to the blue zone */ + /* if needed -- that's only for horizontal edges */ + if ( dim == AF_DIMENSION_VERT ) + { + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Width blue; + AF_Edge edge1, edge2; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + blue = edge->blue_edge; + edge1 = NULL; + edge2 = edge->link; + + if ( blue ) + { + edge1 = edge; + } + else if ( edge2 && edge2->blue_edge ) + { + blue = edge2->blue_edge; + edge1 = edge2; + edge2 = edge; + } + + if ( !edge1 ) + continue; + + edge1->pos = blue->fit; + edge1->flags |= AF_EDGE_DONE; + + if ( edge2 && !edge2->blue_edge ) + { + af_latin_align_linked_edge( hints, dim, edge1, edge2 ); + edge2->flags |= AF_EDGE_DONE; + } + + if ( !anchor ) + anchor = edge; + } + } + + /* now we will align all stem edges, trying to maintain the */ + /* relative order of stems in the glyph */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Edge edge2; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + /* skip all non-stem edges */ + edge2 = edge->link; + if ( !edge2 ) + { + has_serifs++; + continue; + } + + /* now align the stem */ + + /* this should not happen, but it's better to be safe */ + if ( edge2->blue_edge || edge2 < edge ) + { + af_latin_align_linked_edge( hints, dim, edge2, edge ); + edge->flags |= AF_EDGE_DONE; + continue; + } + + if ( !anchor ) + { + FT_Pos org_len, org_center, cur_len; + FT_Pos cur_pos1, error1, error2, u_off, d_off; + + + org_len = edge2->opos - edge->opos; + cur_len = af_latin_compute_stem_width( hints, dim, org_len, + edge->flags, edge2->flags ); + if ( cur_len <= 64 ) + u_off = d_off = 32; + else + { + u_off = 38; + d_off = 26; + } + + if ( cur_len < 96 ) + { + org_center = edge->opos + ( org_len >> 1 ); + + cur_pos1 = FT_PIX_ROUND( org_center ); + + error1 = org_center - ( cur_pos1 - u_off ); + if ( error1 < 0 ) + error1 = -error1; + + error2 = org_center - ( cur_pos1 + d_off ); + if ( error2 < 0 ) + error2 = -error2; + + if ( error1 < error2 ) + cur_pos1 -= u_off; + else + cur_pos1 += d_off; + + edge->pos = cur_pos1 - cur_len / 2; + edge2->pos = cur_pos1 + cur_len / 2; + + } + else + edge->pos = FT_PIX_ROUND( edge->opos ); + + anchor = edge; + + edge->flags |= AF_EDGE_DONE; + + af_latin_align_linked_edge( hints, dim, edge, edge2 ); + } + else + { + FT_Pos org_pos, org_len, org_center, cur_len; + FT_Pos cur_pos1, cur_pos2, delta1, delta2; + + + org_pos = anchor->pos + ( edge->opos - anchor->opos ); + org_len = edge2->opos - edge->opos; + org_center = org_pos + ( org_len >> 1 ); + + cur_len = af_latin_compute_stem_width( hints, dim, org_len, + edge->flags, edge2->flags ); + + if ( cur_len < 96 ) + { + FT_Pos u_off, d_off; + + + cur_pos1 = FT_PIX_ROUND( org_center ); + + if (cur_len <= 64 ) + u_off = d_off = 32; + else + { + u_off = 38; + d_off = 26; + } + + delta1 = org_center - ( cur_pos1 - u_off ); + if ( delta1 < 0 ) + delta1 = -delta1; + + delta2 = org_center - ( cur_pos1 + d_off ); + if ( delta2 < 0 ) + delta2 = -delta2; + + if ( delta1 < delta2 ) + cur_pos1 -= u_off; + else + cur_pos1 += d_off; + + edge->pos = cur_pos1 - cur_len / 2; + edge2->pos = cur_pos1 + cur_len / 2; + } + else + { + org_pos = anchor->pos + ( edge->opos - anchor->opos ); + org_len = edge2->opos - edge->opos; + org_center = org_pos + ( org_len >> 1 ); + + cur_len = af_latin_compute_stem_width( hints, dim, org_len, + edge->flags, edge2->flags ); + + cur_pos1 = FT_PIX_ROUND( org_pos ); + delta1 = ( cur_pos1 + ( cur_len >> 1 ) - org_center ); + if ( delta1 < 0 ) + delta1 = -delta1; + + cur_pos2 = FT_PIX_ROUND( org_pos + org_len ) - cur_len; + delta2 = ( cur_pos2 + ( cur_len >> 1 ) - org_center ); + if ( delta2 < 0 ) + delta2 = -delta2; + + edge->pos = ( delta1 < delta2 ) ? cur_pos1 : cur_pos2; + edge2->pos = edge->pos + cur_len; + } + + edge->flags |= AF_EDGE_DONE; + edge2->flags |= AF_EDGE_DONE; + + if ( edge > edges && edge->pos < edge[-1].pos ) + edge->pos = edge[-1].pos; + } + } + + /* make sure that lowercase m's maintain their symmetry */ + + /* In general, lowercase m's have six vertical edges if they are sans */ + /* serif, or twelve if they are avec serif. This implementation is */ + /* based on that assumption, and seems to work very well with most */ + /* faces. However, if for a certain face this assumption is not */ + /* true, the m is just rendered like before. In addition, any stem */ + /* correction will only be applied to symmetrical glyphs (even if the */ + /* glyph is not an m), so the potential for unwanted distortion is */ + /* relatively low. */ + + /* We don't handle horizontal edges since we can't easily assure that */ + /* the third (lowest) stem aligns with the base line; it might end up */ + /* one pixel higher or lower. */ + + n_edges = edge_limit - edges; + if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) ) + { + AF_Edge edge1, edge2, edge3; + FT_Pos dist1, dist2, span, delta; + + + if ( n_edges == 6 ) + { + edge1 = edges; + edge2 = edges + 2; + edge3 = edges + 4; + } + else + { + edge1 = edges + 1; + edge2 = edges + 5; + edge3 = edges + 9; + } + + dist1 = edge2->opos - edge1->opos; + dist2 = edge3->opos - edge2->opos; + + span = dist1 - dist2; + if ( span < 0 ) + span = -span; + + if ( span < 8 ) + { + delta = edge3->pos - ( 2 * edge2->pos - edge1->pos ); + edge3->pos -= delta; + if ( edge3->link ) + edge3->link->pos -= delta; + + /* move the serifs along with the stem */ + if ( n_edges == 12 ) + { + ( edges + 8 )->pos -= delta; + ( edges + 11 )->pos -= delta; + } + + edge3->flags |= AF_EDGE_DONE; + if ( edge3->link ) + edge3->link->flags |= AF_EDGE_DONE; + } + } + + if ( has_serifs || !anchor ) + { + /* now hint the remaining edges (serifs and single) in order + * to complete our processing + */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + if ( edge->flags & AF_EDGE_DONE ) + continue; + + if ( edge->serif ) + af_latin_align_serif_edge( hints, edge->serif, edge ); + else if ( !anchor ) + { + edge->pos = FT_PIX_ROUND( edge->opos ); + anchor = edge; + } + else + edge->pos = anchor->pos + + FT_PIX_ROUND( edge->opos - anchor->opos ); + + edge->flags |= AF_EDGE_DONE; + + if ( edge > edges && edge->pos < edge[-1].pos ) + edge->pos = edge[-1].pos; + + if ( edge + 1 < edge_limit && + edge[1].flags & AF_EDGE_DONE && + edge->pos > edge[1].pos ) + edge->pos = edge[1].pos; + } + } + } + + + static FT_Error + af_latin_hints_apply( AF_GlyphHints hints, + FT_Outline* outline, + AF_LatinMetrics metrics ) + { + AF_Dimension dim; + + FT_UNUSED( metrics ); + + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + if ( (dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL(hints)) || + (dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL(hints)) ) + { + af_latin_hint_edges( hints, dim ); + af_glyph_hints_align_edge_points( hints, dim ); + af_glyph_hints_align_strong_points( hints, dim ); + af_glyph_hints_align_weak_points( hints, dim ); + } + } + af_glyph_hints_save( hints, outline ); + + return 0; + } + + /***************************************************************************/ + /***************************************************************************/ + /***** *****/ + /***** L A T I N S C R I P T C L A S S *****/ + /***** *****/ + /***************************************************************************/ + /***************************************************************************/ + + static const AF_Script_UniRangeRec af_latin_uniranges[] = + { + { 32, 127 }, /* XXX: TODO: Add new Unicode ranges here !! */ + { 160, 255 }, + { 0, 0 } + }; + + FT_LOCAL_DEF( const AF_ScriptClassRec ) af_latin_script_class = + { + AF_SCRIPT_LATIN, + af_latin_uniranges, + + sizeof( AF_LatinMetricsRec ), + (AF_Script_InitMetricsFunc) af_latin_metrics_init, + (AF_Script_ScaleMetricsFunc) af_latin_metrics_scale, + (AF_Script_DoneMetricsFunc) NULL, + + (AF_Script_InitHintsFunc) af_latin_hints_init, + (AF_Script_ApplyHintsFunc) af_latin_hints_apply + }; + diff --git a/reactos/lib/freetype/src/autofit/aflatin.h b/reactos/lib/freetype/src/autofit/aflatin.h new file mode 100644 index 00000000000..a52e4210115 --- /dev/null +++ b/reactos/lib/freetype/src/autofit/aflatin.h @@ -0,0 +1,168 @@ +#ifndef __AFLATIN_H__ +#define __AFLATIN_H__ + +#include "afhints.h" + +FT_BEGIN_HEADER + + /* + * the latin-specific script class + * + */ + FT_LOCAL( const AF_ScriptClassRec ) af_latin_script_class; + + /***************************************************************************/ + /***************************************************************************/ + /***** *****/ + /***** L A T I N G L O B A L M E T R I C S *****/ + /***** *****/ + /***************************************************************************/ + /***************************************************************************/ + + /* + * the following declarations could be embedded in the file "aflatin.c" + * they've been made semi-public to allow alternate script hinters to + * re-use some of them + */ + + /* + * Latin (global) metrics management + * + */ + + enum + { + AF_LATIN_BLUE_CAPITAL_TOP, + AF_LATIN_BLUE_CAPITAL_BOTTOM, + AF_LATIN_BLUE_SMALL_F_TOP, + AF_LATIN_BLUE_SMALL_TOP, + AF_LATIN_BLUE_SMALL_BOTTOM, + AF_LATIN_BLUE_SMALL_MINOR, + + AF_LATIN_BLUE_MAX + }; + +#define AF_LATIN_IS_TOP_BLUE( b ) ( (b) == AF_LATIN_BLUE_CAPITAL_TOP || \ + (b) == AF_LATIN_BLUE_SMALL_F_TOP || \ + (b) == AF_LATIN_BLUE_SMALL_TOP ) + +#define AF_LATIN_MAX_WIDTHS 16 +#define AF_LATIN_MAX_BLUES AF_LATIN_BLUE_MAX + + enum + { + AF_LATIN_BLUE_ACTIVE = (1 << 0), + AF_LATIN_BLUE_TOP = (1 << 1), + + AF_LATIN_BLUE_FLAG_MAX + }; + + + typedef struct AF_LatinBlueRec_ + { + AF_WidthRec ref; + AF_WidthRec shoot; + FT_UInt flags; + + } AF_LatinBlueRec, *AF_LatinBlue; + + + typedef struct AF_LatinAxisRec_ + { + FT_Fixed scale; + FT_Pos delta; + + FT_UInt width_count; + AF_WidthRec widths[ AF_LATIN_MAX_WIDTHS ]; + FT_Pos edge_distance_threshold; + + /* ignored for horizontal metrics */ + FT_Bool control_overshoot; + FT_UInt blue_count; + AF_LatinBlueRec blues[ AF_LATIN_BLUE_MAX ]; + + FT_Fixed org_scale; + FT_Pos org_delta; + + } AF_LatinAxisRec, *AF_LatinAxis; + + + typedef struct AF_LatinMetricsRec_ + { + AF_ScriptMetricsRec root; + FT_UInt units_per_em; + AF_LatinAxisRec axis[ AF_DIMENSION_MAX ]; + + } AF_LatinMetricsRec, *AF_LatinMetrics; + + + + FT_LOCAL( FT_Error ) + af_latin_metrics_init( AF_LatinMetrics metrics, + FT_Face face ); + + FT_LOCAL( void ) + af_latin_metrics_scale( AF_LatinMetrics metrics, + AF_Scaler scaler ); + + + + /***************************************************************************/ + /***************************************************************************/ + /***** *****/ + /***** L A T I N G L Y P H A N A L Y S I S *****/ + /***** *****/ + /***************************************************************************/ + /***************************************************************************/ + + enum + { + AF_LATIN_HINTS_HORZ_SNAP = (1 << 0), /* enable stem width snapping */ + AF_LATIN_HINTS_VERT_SNAP = (1 << 1), /* enable stem height snapping */ + AF_LATIN_HINTS_STEM_ADJUST = (1 << 2), /* enable stem width/height adjustment */ + AF_LATIN_HINTS_MONO = (1 << 3) /* indicate monochrome rendering */ + }; + +#define AF_LATIN_HINTS_DO_HORZ_SNAP(h) \ + AF_HINTS_TEST_OTHER(h,AF_LATIN_HINTS_HORZ_SNAP) + +#define AF_LATIN_HINTS_DO_VERT_SNAP(h) \ + AF_HINTS_TEST_OTHER(h,AF_LATIN_HINTS_VERT_SNAP) + +#define AF_LATIN_HINTS_DO_STEM_ADJUST(h) \ + AF_HINTS_TEST_OTHER(h,AF_LATIN_HINTS_STEM_ADJUST) + +#define AF_LATIN_HINTS_DO_MONO(h) \ + AF_HINTS_TEST_OTHER(h,AF_LATIN_HINTS_MONO) + + + /* this shouldn't normally be exported. However, other scripts might + * like to use this function as-is + */ + FT_LOCAL( void ) + af_latin_hints_compute_segments( AF_GlyphHints hints, + AF_Dimension dim ); + + /* this shouldn't normally be exported. However, other scripts might + * want to use this function as-is + */ + FT_LOCAL( void ) + af_latin_hints_link_segments( AF_GlyphHints hints, + AF_Dimension dim ); + + /* this shouldn't normally be exported. However, other scripts might + * want to use this function as-is + */ + FT_LOCAL( void ) + af_latin_hints_compute_edges( AF_GlyphHints hints, + AF_Dimension dim ); + + FT_LOCAL( void ) + af_latin_hints_detect_features( AF_GlyphHints hints, + AF_Dimension dim ); + +/* */ + +FT_END_HEADER + +#endif /* __AFLATIN_H__ */ diff --git a/reactos/lib/freetype/src/autofit/afloader.c b/reactos/lib/freetype/src/autofit/afloader.c new file mode 100644 index 00000000000..ed422384e7c --- /dev/null +++ b/reactos/lib/freetype/src/autofit/afloader.c @@ -0,0 +1,441 @@ +#include "afloader.h" +#include "afhints.h" +#include "afglobal.h" +#include "aflatin.h" + + FT_LOCAL_DEF( FT_Error ) + af_loader_init( AF_Loader loader, + FT_Memory memory ) + { + FT_Error error; + + FT_ZERO( loader ); + + af_glyph_hints_init( &loader->hints, memory ); + + error = FT_GlyphLoader_New( memory, &loader->gloader ); + if ( !error ) + { + error = FT_GlyphLoader_CreateExtra( loader->gloader ); + if ( error ) + { + FT_GlyphLoader_Done( loader->gloader ); + loader->gloader = NULL; + } + } + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + af_loader_reset( AF_Loader loader, + FT_Face face ) + { + FT_Error error = 0; + + loader->face = face; + loader->globals = (AF_FaceGlobals) face->autohint.data; + + FT_GlyphLoader_Rewind( loader->gloader ); + + if ( loader->globals == NULL ) + { + error = af_face_globals_new( face, &loader->globals ); + if ( !error ) + { + face->autohint.data = (FT_Pointer) loader->globals; + face->autohint.finalizer = (FT_Generic_Finalizer) af_face_globals_free; + } + } + return error; + } + + + FT_LOCAL_DEF( void ) + af_loader_done( AF_Loader loader ) + { + loader->face = NULL; + loader->globals = NULL; + + FT_GlyphLoader_Done( loader->gloader ); + loader->gloader = NULL; + } + + + static FT_Error + af_loader_load_g( AF_Loader loader, + AF_Scaler scaler, + FT_UInt glyph_index, + FT_Int32 load_flags, + FT_UInt depth ) + { + FT_Error error = 0; + FT_Face face = loader->face; + FT_GlyphLoader gloader = loader->gloader; + AF_ScriptMetrics metrics = loader->metrics; + AF_GlyphHints hints = &loader->hints; + FT_GlyphSlot slot = face->glyph; + FT_Slot_Internal internal = slot->internal; + + error = FT_Load_Glyph( face, glyph_index, load_flags ); + if ( error ) + goto Exit; + + loader->transformed = internal->glyph_transformed; + if ( loader->transformed ) + { + FT_Matrix inverse; + + loader->trans_matrix = internal->glyph_matrix; + loader->trans_delta = internal->glyph_delta; + + inverse = loader->trans_matrix; + FT_Matrix_Invert( &inverse ); + FT_Vector_Transform( &loader->trans_delta, &inverse ); + } + + /* set linear metrics */ + slot->linearHoriAdvance = slot->metrics.horiAdvance; + slot->linearVertAdvance = slot->metrics.vertAdvance; + + switch ( slot->format ) + { + case FT_GLYPH_FORMAT_OUTLINE: + /* translate the loaded glyph when an internal transform + * is needed + */ + if ( loader->transformed ) + { + FT_Vector* point = slot->outline.points; + FT_Vector* limit = point + slot->outline.n_points; + + for ( ; point < limit; point++ ) + { + point->x += loader->trans_delta.x; + point->y += loader->trans_delta.y; + } + } + + /* copy the outline points in the loader's current */ + /* extra points which is used to keep original glyph coordinates */ + error = FT_GlyphLoader_CheckPoints( gloader, + slot->outline.n_points + 4, + slot->outline.n_contours ); + if ( error ) + goto Exit; + + FT_ARRAY_COPY( gloader->current.outline.points, + slot->outline.points, + slot->outline.n_points ); + + FT_ARRAY_COPY( gloader->current.extra_points, + slot->outline.points, + slot->outline.n_points ); + + FT_ARRAY_COPY( gloader->current.outline.contours, + slot->outline.contours, + slot->outline.n_contours ); + + FT_ARRAY_COPY( gloader->current.outline.tags, + slot->outline.tags, + slot->outline.n_points ); + + gloader->current.outline.n_points = slot->outline.n_points; + gloader->current.outline.n_contours = slot->outline.n_contours; + + /* compute original horizontal phantom points (and ignore */ + /* vertical ones) */ + loader->pp1.x = hints->x_delta; + loader->pp1.y = hints->y_delta; + loader->pp2.x = FT_MulFix( slot->metrics.horiAdvance, + hints->x_scale ) + hints->x_delta; + loader->pp2.y = hints->y_delta; + + /* be sure to check for spacing glyphs */ + if ( slot->outline.n_points == 0 ) + goto Hint_Metrics; + + /* now load the slot image into the auto-outline and run the */ + /* automatic hinting process */ + error = metrics->clazz->script_hints_init( hints, + &gloader->current.outline, + metrics ); + if ( error ) + goto Exit; + + /* apply the hints */ + metrics->clazz->script_hints_apply( hints, + &gloader->current.outline, + metrics ); + /* we now need to hint the metrics according to the change in */ + /* width/positioning that occured during the hinting process */ + { + FT_Pos old_advance, old_rsb, old_lsb, new_lsb; + AF_AxisHints axis = &hints->axis[ AF_DIMENSION_HORZ ]; + AF_Edge edge1 = axis->edges; /* leftmost edge */ + AF_Edge edge2 = edge1 + axis->num_edges - 1; /* rightmost edge */ + + + old_advance = loader->pp2.x; + old_rsb = old_advance - edge2->opos; + old_lsb = edge1->opos; + new_lsb = edge1->pos; + + loader->pp1.x = FT_PIX_ROUND( new_lsb - old_lsb ); + loader->pp2.x = FT_PIX_ROUND( edge2->pos + old_rsb ); + +#if 0 + /* try to fix certain bad advance computations */ + if ( loader->pp2.x + loader->pp1.x == edge2->pos && old_rsb > 4 ) + loader->pp2.x += 64; +#endif + } + + /* good, we simply add the glyph to our loader's base */ + FT_GlyphLoader_Add( gloader ); + break; + + case FT_GLYPH_FORMAT_COMPOSITE: + { + FT_UInt nn, num_subglyphs = slot->num_subglyphs; + FT_UInt num_base_subgs, start_point; + FT_SubGlyph subglyph; + + + start_point = gloader->base.outline.n_points; + + /* first of all, copy the subglyph descriptors in the glyph loader */ + error = FT_GlyphLoader_CheckSubGlyphs( gloader, num_subglyphs ); + if ( error ) + goto Exit; + + FT_ARRAY_COPY( gloader->current.subglyphs, + slot->subglyphs, + num_subglyphs ); + + gloader->current.num_subglyphs = num_subglyphs; + num_base_subgs = gloader->base.num_subglyphs; + + /* now, read each subglyph independently */ + for ( nn = 0; nn < num_subglyphs; nn++ ) + { + FT_Vector pp1, pp2; + FT_Pos x, y; + FT_UInt num_points, num_new_points, num_base_points; + + + /* gloader.current.subglyphs can change during glyph loading due */ + /* to re-allocation -- we must recompute the current subglyph on */ + /* each iteration */ + subglyph = gloader->base.subglyphs + num_base_subgs + nn; + + pp1 = loader->pp1; + pp2 = loader->pp2; + + num_base_points = gloader->base.outline.n_points; + + error = af_loader_load_g( loader, scaler, subglyph->index, + load_flags, depth + 1 ); + if ( error ) + goto Exit; + + /* recompute subglyph pointer */ + subglyph = gloader->base.subglyphs + num_base_subgs + nn; + + if ( subglyph->flags & FT_SUBGLYPH_FLAG_USE_MY_METRICS ) + { + pp1 = loader->pp1; + pp2 = loader->pp2; + } + else + { + loader->pp1 = pp1; + loader->pp2 = pp2; + } + + num_points = gloader->base.outline.n_points; + num_new_points = num_points - num_base_points; + + /* now perform the transform required for this subglyph */ + + if ( subglyph->flags & ( FT_SUBGLYPH_FLAG_SCALE | + FT_SUBGLYPH_FLAG_XY_SCALE | + FT_SUBGLYPH_FLAG_2X2 ) ) + { + FT_Vector* cur = gloader->base.outline.points + + num_base_points; + FT_Vector* org = gloader->base.extra_points + + num_base_points; + FT_Vector* limit = cur + num_new_points; + + + for ( ; cur < limit; cur++, org++ ) + { + FT_Vector_Transform( cur, &subglyph->transform ); + FT_Vector_Transform( org, &subglyph->transform ); + } + } + + /* apply offset */ + + if ( !( subglyph->flags & FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES ) ) + { + FT_Int k = subglyph->arg1; + FT_UInt l = subglyph->arg2; + FT_Vector* p1; + FT_Vector* p2; + + + if ( start_point + k >= num_base_points || + l >= (FT_UInt)num_new_points ) + { + error = FT_Err_Invalid_Composite; + goto Exit; + } + + l += num_base_points; + + /* for now, only use the current point coordinates; */ + /* we may consider another approach in the near future */ + p1 = gloader->base.outline.points + start_point + k; + p2 = gloader->base.outline.points + start_point + l; + + x = p1->x - p2->x; + y = p1->y - p2->y; + } + else + { + x = FT_MulFix( subglyph->arg1, hints->x_scale ) + hints->x_delta; + y = FT_MulFix( subglyph->arg2, hints->y_scale ) + hints->y_delta; + + x = FT_PIX_ROUND(x); + y = FT_PIX_ROUND(y); + } + + { + FT_Outline dummy = gloader->base.outline; + + + dummy.points += num_base_points; + dummy.n_points = (short)num_new_points; + + FT_Outline_Translate( &dummy, x, y ); + } + } + } + break; + + default: + /* we don't support other formats (yet?) */ + error = FT_Err_Unimplemented_Feature; + } + + Hint_Metrics: + if ( depth == 0 ) + { + FT_BBox bbox; + + + /* transform the hinted outline if needed */ + if ( loader->transformed ) + FT_Outline_Transform( &gloader->base.outline, &loader->trans_matrix ); + + /* we must translate our final outline by -pp1.x and compute */ + /* the new metrics */ + if ( loader->pp1.x ) + FT_Outline_Translate( &gloader->base.outline, -loader->pp1.x, 0 ); + + FT_Outline_Get_CBox( &gloader->base.outline, &bbox ); + + bbox.xMin = FT_PIX_FLOOR( bbox.xMin ); + bbox.yMin = FT_PIX_FLOOR( bbox.yMin ); + bbox.xMax = FT_PIX_CEIL( bbox.xMax ); + bbox.yMax = FT_PIX_CEIL( bbox.yMax ); + + slot->metrics.width = bbox.xMax - bbox.xMin; + slot->metrics.height = bbox.yMax - bbox.yMin; + slot->metrics.horiBearingX = bbox.xMin; + slot->metrics.horiBearingY = bbox.yMax; + + /* for mono-width fonts (like Andale, Courier, etc.) we need */ + /* to keep the original rounded advance width */ +#if 0 + if ( !FT_IS_FIXED_WIDTH( slot->face ) ) + slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; + else + slot->metrics.horiAdvance = FT_MulFix( slot->metrics.horiAdvance, + x_scale ); +#else + slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; +#endif + + slot->metrics.horiAdvance = FT_PIX_ROUND( slot->metrics.horiAdvance ); + + /* now copy outline into glyph slot */ + FT_GlyphLoader_Rewind( internal->loader ); + error = FT_GlyphLoader_CopyPoints( internal->loader, gloader ); + if ( error ) + goto Exit; + + slot->outline = internal->loader->base.outline; + slot->format = FT_GLYPH_FORMAT_OUTLINE; + } + +#ifdef DEBUG_HINTER + af_debug_hinter = hinter; +#endif + + Exit: + return error; + } + + + + + FT_LOCAL_DEF( FT_Error ) + af_loader_load_glyph( AF_Loader loader, + FT_Face face, + FT_UInt gindex, + FT_UInt32 load_flags ) + { + FT_Error error; + FT_Size size = face->size; + AF_ScalerRec scaler; + + if ( !size ) + return FT_Err_Invalid_Argument; + + FT_ZERO( &scaler ); + + scaler.face = face; + scaler.x_scale = size->metrics.x_scale; + scaler.x_delta = 0; /* XXX: TODO: add support for sub-pixel hinting */ + scaler.y_scale = size->metrics.y_scale; + scaler.y_delta = 0; /* XXX: TODO: add support for sub-pixel hinting */ + + scaler.render_mode = FT_LOAD_TARGET_MODE( load_flags ); + scaler.flags = 0; /* XXX: fix this */ + + error = af_loader_reset( loader, face ); + if ( !error ) + { + AF_ScriptMetrics metrics; + + error = af_face_globals_get_metrics( loader->globals, gindex, &metrics ); + if ( !error ) + { + loader->metrics = metrics; + + metrics->scaler = scaler; + + if ( metrics->clazz->script_metrics_scale ) + metrics->clazz->script_metrics_scale( metrics, &scaler ); + + load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_IGNORE_TRANSFORM; + load_flags &= ~FT_LOAD_RENDER; + + error = af_loader_load_g( loader, &scaler, gindex, load_flags, 0 ); + } + } + return error; + } diff --git a/reactos/lib/freetype/src/autofit/afloader.h b/reactos/lib/freetype/src/autofit/afloader.h new file mode 100644 index 00000000000..12361560a5a --- /dev/null +++ b/reactos/lib/freetype/src/autofit/afloader.h @@ -0,0 +1,50 @@ +#ifndef __AF_LOADER_H__ +#define __AF_LOADER_H__ + +#include "afhints.h" +#include "afglobal.h" + +FT_BEGIN_HEADER + + typedef struct AF_LoaderRec_ + { + FT_Face face; /* current face */ + AF_FaceGlobals globals; /* current face globals */ + FT_GlyphLoader gloader; /* glyph loader */ + AF_GlyphHintsRec hints; + AF_ScriptMetrics metrics; + FT_Bool transformed; + FT_Matrix trans_matrix; + FT_Vector trans_delta; + FT_Vector pp1; + FT_Vector pp2; + /* we don't handle vertical phantom points */ + + } AF_LoaderRec, *AF_Loader; + + + FT_LOCAL( FT_Error ) + af_loader_init( AF_Loader loader, + FT_Memory memory ); + + + FT_LOCAL( FT_Error ) + af_loader_reset( AF_Loader loader, + FT_Face face ); + + + FT_LOCAL( void ) + af_loader_done( AF_Loader loader ); + + + FT_LOCAL( FT_Error ) + af_loader_load_glyph( AF_Loader loader, + FT_Face face, + FT_UInt gindex, + FT_UInt32 load_flags ); + +/* */ + +FT_END_HEADER + +#endif /* __AF_LOADER_H__ */ diff --git a/reactos/lib/freetype/src/autofit/afmodule.c b/reactos/lib/freetype/src/autofit/afmodule.c new file mode 100644 index 00000000000..f266a7afe83 --- /dev/null +++ b/reactos/lib/freetype/src/autofit/afmodule.c @@ -0,0 +1,70 @@ +#include "afmodule.h" +#include "afloader.h" +#include FT_INTERNAL_OBJECTS_H + + typedef struct FT_AutofitterRec_ + { + FT_ModuleRec root; + AF_LoaderRec loader[1]; + + } FT_AutofitterRec, *FT_Autofitter; + + + FT_CALLBACK_DEF( FT_Error ) + af_autofitter_init( FT_Autofitter module ) + { + return af_loader_init( module->loader, module->root.library->memory ); + } + + + FT_CALLBACK_DEF( void ) + af_autofitter_done( FT_Autofitter module ) + { + af_loader_done( module->loader ); + } + + + FT_CALLBACK_DEF( FT_Error ) + af_autofitter_load_glyph( FT_Autofitter module, + FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_UNUSED(size); + + return af_loader_load_glyph( module->loader, slot->face, + glyph_index, load_flags ); + } + + + + FT_CALLBACK_TABLE_DEF + const FT_AutoHinter_ServiceRec af_autofitter_service = + { + NULL, + NULL, + NULL, + (FT_AutoHinter_GlyphLoadFunc) af_autofitter_load_glyph + }; + + + FT_CALLBACK_TABLE_DEF + const FT_Module_Class autofit_module_class = + { + FT_MODULE_HINTER, + sizeof ( FT_AutofitterRec ), + + "autofitter", + 0x10000L, /* version 1.0 of the autofitter */ + 0x20000L, /* requires FreeType 2.0 or above */ + + (const void*) &af_autofitter_service, + + (FT_Module_Constructor) af_autofitter_init, + (FT_Module_Destructor) af_autofitter_done, + (FT_Module_Requester) 0 + }; + + +/* END */ diff --git a/reactos/lib/freetype/src/autofit/afmodule.h b/reactos/lib/freetype/src/autofit/afmodule.h new file mode 100644 index 00000000000..b898cb375fd --- /dev/null +++ b/reactos/lib/freetype/src/autofit/afmodule.h @@ -0,0 +1,16 @@ +#ifndef __AFMODULE_H__ +#define __AFMODULE_H__ + +#include <ft2build.h> +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + FT_CALLBACK_TABLE + const FT_Module_Class autofit_module_class; + + +FT_END_HEADER + +#endif /* __AFMODULE_H__ */ diff --git a/reactos/lib/freetype/src/autofit/aftypes.h b/reactos/lib/freetype/src/autofit/aftypes.h new file mode 100644 index 00000000000..abd2ff5fa8c --- /dev/null +++ b/reactos/lib/freetype/src/autofit/aftypes.h @@ -0,0 +1,268 @@ +#ifndef __AFTYPES_H__ +#define __AFTYPES_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_OUTLINE_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H + +FT_BEGIN_HEADER + + /**************************************************************************/ + /**************************************************************************/ + /***** *****/ + /***** D E B U G G I N G *****/ + /***** *****/ + /**************************************************************************/ + /**************************************************************************/ + +#define xxAF_DEBUG + +#ifdef AF_DEBUG + +# include <stdio.h> +# define AF_LOG( x ) printf x + +#else + +# define AF_LOG( x ) do ; while ( 0 ) /* nothing */ + +#endif /* AF_DEBUG */ + + /**************************************************************************/ + /**************************************************************************/ + /***** *****/ + /***** U T I L I T Y *****/ + /***** *****/ + /**************************************************************************/ + /**************************************************************************/ + + typedef struct AF_WidthRec_ + { + FT_Pos org; /* original position/width in font units */ + FT_Pos cur; /* current/scaled position/width in device sub-pixels */ + FT_Pos fit; /* current/fitted position/width in device sub-pixels */ + + } AF_WidthRec, *AF_Width; + + + FT_LOCAL( void ) + af_sort_pos( FT_UInt count, + FT_Pos* table ); + + FT_LOCAL( void ) + af_sort_widths( FT_UInt count, + AF_Width widths ); + + + /**************************************************************************/ + /**************************************************************************/ + /***** *****/ + /***** A N G L E T Y P E S *****/ + /***** *****/ + /**************************************************************************/ + /**************************************************************************/ + + /* + * Angle type. The auto-fitter doesn't need a very high angular accuracy, + * and this allows us to speed up some computations considerably with a + * light Cordic algorithm (see afangles.c) + * + */ + + typedef FT_Int AF_Angle; + +#define AF_ANGLE_PI 128 +#define AF_ANGLE_2PI (AF_ANGLE_PI*2) +#define AF_ANGLE_PI2 (AF_ANGLE_PI/2) +#define AF_ANGLE_PI4 (AF_ANGLE_PI/4) + + /* + * compute the angle of a given 2-D vector + * + */ + FT_LOCAL( AF_Angle ) + af_angle_atan( FT_Pos dx, + FT_Pos dy ); + + + /* + * computes "angle2 - angle1", the result is always within + * the range [ -AF_ANGLE_PI .. AF_ANGLE_PI-1 ] + * + */ + FT_LOCAL( AF_Angle ) + af_angle_diff( AF_Angle angle1, + AF_Angle angle2 ); + + + /**************************************************************************/ + /**************************************************************************/ + /***** *****/ + /***** O U T L I N E S *****/ + /***** *****/ + /**************************************************************************/ + /**************************************************************************/ + + /* opaque handle to glyph-specific hints. see "afhints.h" for more + * details + */ + typedef struct AF_GlyphHintsRec_* AF_GlyphHints; + + /* this structure is used to model an input glyph outline to + * the auto-hinter. The latter will set the "hints" field + * depending on the glyph's script + */ + typedef struct AF_OutlineRec_ + { + FT_Face face; + FT_Outline outline; + FT_UInt outline_resolution; + + FT_Int advance; + FT_UInt metrics_resolution; + + AF_GlyphHints hints; + + } AF_OutlineRec; + + + /**************************************************************************/ + /**************************************************************************/ + /***** *****/ + /***** S C A L E R S *****/ + /***** *****/ + /**************************************************************************/ + /**************************************************************************/ + + /* + * A scaler models the target pixel device that will receive the + * auto-hinted glyph image + * + */ + + typedef enum + { + AF_SCALER_FLAG_NO_HORIZONTAL = 1, /* disable horizontal hinting */ + AF_SCALER_FLAG_NO_VERTICAL = 2, /* disable vertical hinting */ + AF_SCALER_FLAG_NO_ADVANCE = 4 /* disable advance hinting */ + + } AF_ScalerFlags; + + + typedef struct AF_ScalerRec_ + { + FT_Face face; /* source font face */ + FT_Fixed x_scale; /* from font units to 1/64th device pixels */ + FT_Fixed y_scale; /* from font units to 1/64th device pixels */ + FT_Pos x_delta; /* in 1/64th device pixels */ + FT_Pos y_delta; /* in 1/64th device pixels */ + FT_Render_Mode render_mode; /* monochrome, anti-aliased, LCD, etc.. */ + FT_UInt32 flags; /* additionnal control flags, see above */ + + } AF_ScalerRec, *AF_Scaler; + + + + /**************************************************************************/ + /**************************************************************************/ + /***** *****/ + /***** S C R I P T S *****/ + /***** *****/ + /**************************************************************************/ + /**************************************************************************/ + + /* + * the list of know scripts. Each different script correspond to the + * following information: + * + * - a set of Unicode ranges to test weither the face supports the + * script + * + * - a specific global analyzer that will compute global metrics + * specific to the script. + * + * - a specific glyph analyzer that will compute segments and + * edges for each glyph covered by the script + * + * - a specific grid-fitting algorithm that will distort the + * scaled glyph outline according to the results of the glyph + * analyzer + * + * note that a given analyzer and/or grid-fitting algorithm can be + * used by more than one script + */ + typedef enum + { + AF_SCRIPT_NONE = 0, + AF_SCRIPT_LATIN = 1, + /* add new scripts here. don't forget to update the list in "afglobal.c" */ + + AF_SCRIPT_MAX /* do not remove */ + + } AF_Script; + + + + typedef struct AF_ScriptClassRec_ const* AF_ScriptClass; + + typedef struct AF_ScriptMetricsRec_ + { + AF_ScriptClass clazz; + AF_ScalerRec scaler; + + } AF_ScriptMetricsRec, *AF_ScriptMetrics; + + + /* this function parses a FT_Face to compute global metrics for + * a specific script + */ + typedef FT_Error (*AF_Script_InitMetricsFunc)( AF_ScriptMetrics metrics, + FT_Face face ); + + typedef void (*AF_Script_ScaleMetricsFunc)( AF_ScriptMetrics metrics, + AF_Scaler scaler ); + + typedef void (*AF_Script_DoneMetricsFunc)( AF_ScriptMetrics metrics ); + + + typedef FT_Error (*AF_Script_InitHintsFunc)( AF_GlyphHints hints, + FT_Outline* outline, + AF_ScriptMetrics metrics ); + + typedef void (*AF_Script_ApplyHintsFunc)( AF_GlyphHints hints, + FT_Outline* outline, + AF_ScriptMetrics metrics ); + + + typedef struct AF_Script_UniRangeRec_ + { + FT_UInt32 first; + FT_UInt32 last; + + } AF_Script_UniRangeRec; + + typedef const AF_Script_UniRangeRec * AF_Script_UniRange; + + typedef struct AF_ScriptClassRec_ + { + AF_Script script; + AF_Script_UniRange script_uni_ranges; /* last must be { 0, 0 } */ + + FT_UInt script_metrics_size; + AF_Script_InitMetricsFunc script_metrics_init; + AF_Script_ScaleMetricsFunc script_metrics_scale; + AF_Script_DoneMetricsFunc script_metrics_done; + + AF_Script_InitHintsFunc script_hints_init; + AF_Script_ApplyHintsFunc script_hints_apply; + + } AF_ScriptClassRec; + + +/* */ + +FT_END_HEADER + +#endif /* __AFTYPES_H__ */ diff --git a/reactos/lib/freetype/src/autofit/autofit.c b/reactos/lib/freetype/src/autofit/autofit.c new file mode 100644 index 00000000000..c258e0d7aa3 --- /dev/null +++ b/reactos/lib/freetype/src/autofit/autofit.c @@ -0,0 +1,9 @@ +#define FT_MAKE_OPTION_SINGLE_OBJECT +#include <ft2build.h> +#include "afangles.c" +#include "afglobal.c" +#include "afhints.c" +#include "afdummy.c" +#include "aflatin.c" +#include "afloader.c" +#include "afmodule.c" diff --git a/reactos/lib/freetype/src/autohint/ahglobal.c b/reactos/lib/freetype/src/autohint/ahglobal.c index 4183b010999..e157014b570 100644 --- a/reactos/lib/freetype/src/autohint/ahglobal.c +++ b/reactos/lib/freetype/src/autohint/ahglobal.c @@ -4,7 +4,7 @@ /* */ /* Routines used to compute global metrics automatically (body). */ /* */ -/* Copyright 2000-2001, 2002, 2003 Catharon Productions Inc. */ +/* Copyright 2000-2001, 2002, 2003, 2004 Catharon Productions Inc. */ /* Author: David Turner */ /* */ /* This file is part of the Catharon Typography Project and shall only */ @@ -30,7 +30,7 @@ /* cf. AH_BLUE_XXX constants in ahtypes.h */ static - const char* blue_chars[AH_BLUE_MAX] = + const char* const blue_chars[AH_BLUE_MAX] = { "THEZOCQS", "HEZLOCUS", @@ -95,7 +95,7 @@ goto Exit; /* we compute the blues simply by loading each character from the */ - /* 'blue_chars[blues]' string, then compute its top-most or */ + /* `blue_chars[blues]' string, then compute its top-most or */ /* bottom-most points (depending on `AH_IS_TOP_BLUE') */ AH_LOG(( "blue zones computation\n" )); diff --git a/reactos/lib/freetype/src/autohint/ahglyph.c b/reactos/lib/freetype/src/autohint/ahglyph.c index 85c3b380e65..2a0390be44f 100644 --- a/reactos/lib/freetype/src/autohint/ahglyph.c +++ b/reactos/lib/freetype/src/autohint/ahglyph.c @@ -5,7 +5,7 @@ /* Routines used to load and analyze a given glyph before hinting */ /* (body). */ /* */ -/* Copyright 2000-2001, 2002, 2003 Catharon Productions Inc. */ +/* Copyright 2000-2001, 2002, 2003, 2004 Catharon Productions Inc. */ /* Author: David Turner */ /* */ /* This file is part of the Catharon Typography Project and shall only */ @@ -141,8 +141,8 @@ FT_Pos dy ) { AH_Direction dir; - FT_Pos ax = ABS( dx ); - FT_Pos ay = ABS( dy ); + FT_Pos ax = FT_ABS( dx ); + FT_Pos ay = FT_ABS( dy ); dir = AH_DIR_NONE; @@ -418,7 +418,7 @@ /* first of all, reallocate the contours array if necessary */ if ( num_contours > outline->max_contours ) { - FT_Int new_contours = ( num_contours + 3 ) & -4; + FT_Int new_contours = FT_PAD_CEIL( num_contours, 4 ); if ( FT_RENEW_ARRAY( outline->contours, @@ -435,7 +435,7 @@ /* */ if ( num_points + 2 > outline->max_points ) { - FT_Int news = ( num_points + 2 + 7 ) & -8; + FT_Int news = FT_PAD_CEIL( num_points + 2, 8 ); FT_Int max = outline->max_points; @@ -884,8 +884,8 @@ if ( point == last ) /* skip singletons -- just in case */ continue; - if ( ABS( last->out_dir ) == major_dir && - ABS( point->out_dir ) == major_dir ) + if ( FT_ABS( last->out_dir ) == major_dir && + FT_ABS( point->out_dir ) == major_dir ) { /* we are already on an edge, try to locate its start */ last = point; @@ -893,7 +893,7 @@ for (;;) { point = point->prev; - if ( ABS( point->out_dir ) != major_dir ) + if ( FT_ABS( point->out_dir ) != major_dir ) { point = point->next; break; @@ -958,7 +958,7 @@ passed = 1; } - if ( !on_edge && ABS( point->out_dir ) == major_dir ) + if ( !on_edge && FT_ABS( point->out_dir ) == major_dir ) { /* this is the start of a new segment! */ segment_dir = point->out_dir; diff --git a/reactos/lib/freetype/src/autohint/ahhint.c b/reactos/lib/freetype/src/autohint/ahhint.c index c4c8cfc50d1..69ac9547059 100644 --- a/reactos/lib/freetype/src/autohint/ahhint.c +++ b/reactos/lib/freetype/src/autohint/ahhint.c @@ -4,7 +4,7 @@ /* */ /* Glyph hinter (body). */ /* */ -/* Copyright 2000-2001, 2002, 2003 Catharon Productions Inc. */ +/* Copyright 2000-2001, 2002, 2003, 2004 Catharon Productions Inc. */ /* Author: David Turner */ /* */ /* This file is part of the Catharon Typography Project and shall only */ @@ -71,7 +71,7 @@ } } - scaled = ( reference + 32 ) & -64; + scaled = FT_PIX_ROUND( reference ); if ( width >= reference ) { @@ -167,7 +167,7 @@ dist += delta; } else - dist = ( dist + 32 ) & -64; + dist = ( dist + 32 ) & ~63; } } else @@ -181,7 +181,7 @@ /* in the case of vertical hinting, always round */ /* the stem heights to integer pixels */ if ( dist >= 64 ) - dist = ( dist + 16 ) & -64; + dist = ( dist + 16 ) & ~63; else dist = 64; } @@ -196,7 +196,7 @@ if ( dist < 64 ) dist = 64; else - dist = ( dist + 32 ) & -64; + dist = ( dist + 32 ) & ~63; } else { @@ -207,10 +207,10 @@ dist = ( dist + 64 ) >> 1; else if ( dist < 128 ) - dist = ( dist + 22 ) & -64; + dist = ( dist + 22 ) & ~63; else /* XXX: round otherwise to prevent color fringes in LCD mode */ - dist = ( dist + 32 ) & -64; + dist = ( dist + 32 ) & ~63; } } } @@ -284,7 +284,7 @@ dist += delta; } else - dist = ( dist + 32 ) & -64; + dist = ( dist + 32 ) & ~63; } } else @@ -298,7 +298,7 @@ /* in the case of vertical hinting, always round */ /* the stem heights to integer pixels */ if ( dist >= 64 ) - dist = ( dist + 16 ) & -64; + dist = ( dist + 16 ) & ~63; else dist = 64; } @@ -313,7 +313,7 @@ if ( dist < 64 ) dist = 64; else - dist = ( dist + 32 ) & -64; + dist = ( dist + 32 ) & ~63; } else { @@ -324,10 +324,10 @@ dist = ( dist + 64 ) >> 1; else if ( dist < 128 ) - dist = ( dist + 22 ) & -64; + dist = ( dist + 22 ) & ~63; else /* XXX: round otherwise to prevent color fringes in LCD mode */ - dist = ( dist + 32 ) & -64; + dist = ( dist + 32 ) & ~63; } } } @@ -396,7 +396,7 @@ if ( base->flags & AH_EDGE_DONE ) { if ( dist >= 64 ) - dist = ( dist + 8 ) & -64; + dist = ( dist + 8 ) & ~63; else if ( dist <= 32 && !vertical ) dist = ( dist + 33 ) >> 1; @@ -545,7 +545,7 @@ { org_center = edge->opos + ( org_len >> 1 ); - cur_pos1 = ( org_center + 32 ) & -64; + cur_pos1 = FT_PIX_ROUND( org_center ); error1 = org_center - ( cur_pos1 - u_off ); if ( error1 < 0 ) @@ -565,7 +565,7 @@ } else - edge->pos = ( edge->opos + 32 ) & -64; + edge->pos = FT_PIX_ROUND( edge->opos ); anchor = edge; @@ -575,7 +575,7 @@ #else /* !FT_CONFIG_CHESTER_STEM */ - edge->pos = ( edge->opos + 32 ) & -64; + edge->pos = FT_PIX_ROUND( edge->opos ); anchor = edge; edge->flags |= AH_EDGE_DONE; @@ -614,7 +614,7 @@ FT_Pos u_off, d_off; - cur_pos1 = ( org_center + 32 ) & -64; + cur_pos1 = FT_PIX_ROUND( org_center ); if (cur_len <= 64 ) u_off = d_off = 32; @@ -649,12 +649,12 @@ cur_len = ah_compute_stem_width( hinter, dimension, org_len, edge->flags, edge2->flags ); - cur_pos1 = ( org_pos + 32 ) & -64; + cur_pos1 = FT_PIX_ROUND( org_pos ); delta1 = ( cur_pos1 + ( cur_len >> 1 ) - org_center ); if ( delta1 < 0 ) delta1 = -delta1; - cur_pos2 = ( ( org_pos + org_len + 32 ) & -64 ) - cur_len; + cur_pos2 = FT_PIX_ROUND( org_pos + org_len ) - cur_len; delta2 = ( cur_pos2 + ( cur_len >> 1 ) - org_center ); if ( delta2 < 0 ) delta2 = -delta2; @@ -665,12 +665,12 @@ #else /* !FT_CONFIG_CHESTER_STEM */ - cur_pos1 = ( org_pos + 32 ) & -64; + cur_pos1 = FT_PIX_ROUND( org_pos ); delta1 = ( cur_pos1 + ( cur_len >> 1 ) - org_center ); if ( delta1 < 0 ) delta1 = -delta1; - cur_pos2 = ( ( org_pos + org_len + 32 ) & -64 ) - cur_len; + cur_pos2 = FT_PIX_ROUND( org_pos + org_len ) - cur_len; delta2 = ( cur_pos2 + ( cur_len >> 1 ) - org_center ); if ( delta2 < 0 ) delta2 = -delta2; @@ -703,7 +703,7 @@ /* the third (lowest) stem aligns with the base line; it might end up */ /* one pixel higher or lower. */ - n_edges = edge_limit - edges; + n_edges = (FT_Int)( edge_limit - edges ); if ( !dimension && ( n_edges == 6 || n_edges == 12 ) ) { AH_EdgeRec *edge1, *edge2, *edge3; @@ -764,12 +764,12 @@ ah_align_serif_edge( hinter, edge->serif, edge, dimension ); else if ( !anchor ) { - edge->pos = ( edge->opos + 32 ) & -64; + edge->pos = FT_PIX_ROUND( edge->opos ); anchor = edge; } else edge->pos = anchor->pos + - ( ( edge->opos-anchor->opos + 32 ) & -64 ); + FT_PIX_ROUND( edge->opos - anchor->opos ); edge->flags |= AH_EDGE_DONE; @@ -943,7 +943,7 @@ /* find enclosing edges */ min = 0; - max = edge_limit - edges; + max = (FT_UInt)( edge_limit - edges ); while ( min < max ) { @@ -1299,15 +1299,16 @@ if ( delta2 < 32 ) delta2 = 0; else if ( delta2 < 64 ) - delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & -32 ); + delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 ); else - delta2 = ( delta2 + 32 ) & -64; + delta2 = FT_PIX_ROUND( delta2 ); if ( delta < 0 ) delta2 = -delta2; scaled->blue_refs[n] = - ( FT_MulFix( design->blue_refs[n], y_scale ) + 32 ) & -64; + FT_PIX_ROUND( FT_MulFix( design->blue_refs[n], y_scale ) ); + scaled->blue_shoots[n] = scaled->blue_refs[n] + delta2; } @@ -1488,24 +1489,24 @@ /* copy the outline points in the loader's current */ /* extra points which is used to keep original glyph coordinates */ - error = ah_loader_check_points( gloader, slot->outline.n_points + 2, + error = ah_loader_check_points( gloader, slot->outline.n_points + 4, slot->outline.n_contours ); if ( error ) goto Exit; - FT_MEM_COPY( gloader->current.extra_points, slot->outline.points, - slot->outline.n_points * sizeof ( FT_Vector ) ); + FT_ARRAY_COPY( gloader->current.extra_points, slot->outline.points, + slot->outline.n_points ); - FT_MEM_COPY( gloader->current.outline.contours, slot->outline.contours, - slot->outline.n_contours * sizeof ( short ) ); + FT_ARRAY_COPY( gloader->current.outline.contours, slot->outline.contours, + slot->outline.n_contours ); - FT_MEM_COPY( gloader->current.outline.tags, slot->outline.tags, - slot->outline.n_points * sizeof ( char ) ); + FT_ARRAY_COPY( gloader->current.outline.tags, slot->outline.tags, + slot->outline.n_points ); gloader->current.outline.n_points = slot->outline.n_points; gloader->current.outline.n_contours = slot->outline.n_contours; - /* compute original phantom points */ + /* compute original horizontal phantom points, ignoring vertical ones */ hinter->pp1.x = 0; hinter->pp1.y = 0; hinter->pp2.x = FT_MulFix( slot->metrics.horiAdvance, x_scale ); @@ -1539,6 +1540,7 @@ /* we now need to hint the metrics according to the change in */ /* width/positioning that occured during the hinting process */ + if ( outline->num_vedges > 0 ) { FT_Pos old_advance, old_rsb, old_lsb, new_lsb; AH_Edge edge1 = outline->vert_edges; /* leftmost edge */ @@ -1551,8 +1553,8 @@ old_lsb = edge1->opos; new_lsb = edge1->pos; - hinter->pp1.x = ( ( new_lsb - old_lsb ) + 32 ) & -64; - hinter->pp2.x = ( ( edge2->pos + old_rsb ) + 32 ) & -64; + hinter->pp1.x = FT_PIX_ROUND( new_lsb - old_lsb ); + hinter->pp2.x = FT_PIX_ROUND( edge2->pos + old_rsb ); #if 0 /* try to fix certain bad advance computations */ @@ -1561,6 +1563,12 @@ #endif } + else + { + hinter->pp1.x = ( hinter->pp1.x + 32 ) & -64; + hinter->pp2.x = ( hinter->pp2.x + 32 ) & -64; + } + /* good, we simply add the glyph to our loader's base */ ah_loader_add( gloader ); break; @@ -1579,8 +1587,8 @@ if ( error ) goto Exit; - FT_MEM_COPY( gloader->current.subglyphs, slot->subglyphs, - num_subglyphs * sizeof ( FT_SubGlyph ) ); + FT_ARRAY_COPY( gloader->current.subglyphs, slot->subglyphs, + num_subglyphs ); gloader->current.num_subglyphs = num_subglyphs; num_base_subgs = gloader->base.num_subglyphs; @@ -1677,8 +1685,8 @@ x = FT_MulFix( subglyph->arg1, x_scale ); y = FT_MulFix( subglyph->arg2, y_scale ); - x = ( x + 32 ) & -64; - y = ( y + 32 ) & -64; + x = FT_PIX_ROUND(x); + y = FT_PIX_ROUND(y); } { @@ -1715,10 +1723,10 @@ FT_Outline_Translate( &gloader->base.outline, -hinter->pp1.x, 0 ); FT_Outline_Get_CBox( &gloader->base.outline, &bbox ); - bbox.xMin &= -64; - bbox.yMin &= -64; - bbox.xMax = ( bbox.xMax + 63 ) & -64; - bbox.yMax = ( bbox.yMax + 63 ) & -64; + bbox.xMin = FT_PIX_FLOOR( bbox.xMin ); + bbox.yMin = FT_PIX_FLOOR( bbox.yMin ); + bbox.xMax = FT_PIX_CEIL( bbox.xMax ); + bbox.yMax = FT_PIX_CEIL( bbox.yMax ); slot->metrics.width = bbox.xMax - bbox.xMin; slot->metrics.height = bbox.yMax - bbox.yMin; @@ -1733,7 +1741,7 @@ slot->metrics.horiAdvance = FT_MulFix( slot->metrics.horiAdvance, x_scale ); - slot->metrics.horiAdvance = ( slot->metrics.horiAdvance + 32 ) & -64; + slot->metrics.horiAdvance = FT_PIX_ROUND( slot->metrics.horiAdvance ); /* now copy outline into glyph slot */ ah_loader_rewind( slot->internal->loader ); @@ -1802,7 +1810,7 @@ if ( shoot > 0 ) { FT_Pos scaled = FT_MulFix( shoot, y_scale ); - FT_Pos fitted = ( scaled + 32 ) & -64; + FT_Pos fitted = FT_PIX_ROUND( scaled ); if ( scaled != fitted ) @@ -1850,9 +1858,9 @@ hinter->do_stem_adjust = FT_BOOL( hint_mode != FT_RENDER_MODE_LIGHT ); - - load_flags |= FT_LOAD_NO_SCALE - | FT_LOAD_IGNORE_TRANSFORM ; + load_flags |= FT_LOAD_NO_SCALE + | FT_LOAD_IGNORE_TRANSFORM; + load_flags &= ~FT_LOAD_RENDER; error = ah_hinter_load( hinter, glyph_index, load_flags, 0 ); diff --git a/reactos/lib/freetype/src/autohint/ahtypes.h b/reactos/lib/freetype/src/autohint/ahtypes.h index c748b661318..f2cedd2887e 100644 --- a/reactos/lib/freetype/src/autohint/ahtypes.h +++ b/reactos/lib/freetype/src/autohint/ahtypes.h @@ -5,7 +5,7 @@ /* General types and definitions for the auto-hint module */ /* (specification only). */ /* */ -/* Copyright 2000-2001, 2002, 2003 Catharon Productions Inc. */ +/* Copyright 2000-2001, 2002, 2003, 2004 Catharon Productions Inc. */ /* Author: David Turner */ /* */ /* This file is part of the Catharon Typography Project and shall only */ @@ -492,8 +492,9 @@ FT_BEGIN_HEADER AH_Outline glyph; AH_Loader loader; - FT_Vector pp1; + FT_Vector pp1; /* horizontal phantom points */ FT_Vector pp2; + /* we ignore vertical phantom points */ FT_Bool transformed; FT_Vector trans_delta; diff --git a/reactos/lib/freetype/src/base/Jamfile b/reactos/lib/freetype/src/base/Jamfile index fbb7b39d008..d82e65d6d86 100644 --- a/reactos/lib/freetype/src/base/Jamfile +++ b/reactos/lib/freetype/src/base/Jamfile @@ -1,4 +1,4 @@ -# FreeType 2 src/base Jamfile (c) 2001, 2002, 2003 David Turner +# FreeType 2 src/base Jamfile (c) 2001, 2002, 2003, 2004 David Turner # SubDir FT2_TOP $(FT2_SRC_DIR) base ; @@ -10,7 +10,7 @@ SubDir FT2_TOP $(FT2_SRC_DIR) base ; if $(FT2_MULTI) { _sources = ftutil ftdbgmem ftstream ftcalc fttrigon ftgloadr ftoutln - ftobjs ftnames ; + ftobjs ftnames ftrfork ; } else { @@ -24,8 +24,7 @@ SubDir FT2_TOP $(FT2_SRC_DIR) base ; # Library $(FT2_LIB) : ftsystem.c ftinit.c ftglyph.c ftmm.c ftbdf.c ftbbox.c ftdebug.c ftxf86.c fttype1.c ftpfr.c - ftstroke.c ftwinfnt.c - ; + ftstroke.c ftwinfnt.c ; # Add Macintosh-specific file to the library when necessary. # diff --git a/reactos/lib/freetype/src/base/descrip.mms b/reactos/lib/freetype/src/base/descrip.mms index cf69bdde4d8..73bad4d7384 100644 --- a/reactos/lib/freetype/src/base/descrip.mms +++ b/reactos/lib/freetype/src/base/descrip.mms @@ -3,7 +3,7 @@ # -# Copyright 2001, 2003 by +# Copyright 2001, 2003, 2004 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, @@ -15,7 +15,7 @@ CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.builds.vms],[--.include],[--.src.base]) -OBJS=ftbase.obj,ftinit.obj,ftglyph.obj,ftdebug.obj,ftbdf.obj,ftmm.obj,fttype1.obj,ftxf86.obj,ftpfr.obj,ftstroke.obj,ftwinfnt.obj +OBJS=ftbase.obj,ftinit.obj,ftglyph.obj,ftdebug.obj,ftbdf.obj,ftmm.obj,fttype1.obj,ftxf86.obj,ftpfr.obj,ftstroke.obj,ftwinfnt.obj,ftbbox.obj all : $(OBJS) library [--.lib]freetype.olb $(OBJS) diff --git a/reactos/lib/freetype/src/base/ftbase.c b/reactos/lib/freetype/src/base/ftbase.c index 18a98c3a15c..7d5a7fd8e8b 100644 --- a/reactos/lib/freetype/src/base/ftbase.c +++ b/reactos/lib/freetype/src/base/ftbase.c @@ -4,7 +4,7 @@ /* */ /* Single object library component (body only). */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -29,6 +29,7 @@ #include "ftgloadr.c" #include "ftobjs.c" #include "ftnames.c" +#include "ftrfork.c" #if defined( __APPLE__ ) && !defined ( DARWIN_NO_CARBON ) #include "ftmac.c" diff --git a/reactos/lib/freetype/src/base/ftbdf.c b/reactos/lib/freetype/src/base/ftbdf.c index 63e3071c11d..d2f133db778 100644 --- a/reactos/lib/freetype/src/base/ftbdf.c +++ b/reactos/lib/freetype/src/base/ftbdf.c @@ -17,27 +17,8 @@ #include <ft2build.h> -#include FT_INTERNAL_BDF_TYPES_H #include FT_INTERNAL_OBJECTS_H - - - static FT_Bool - test_font_type( FT_Face face, - const char* name ) - { - if ( face && face->driver ) - { - FT_Module driver = (FT_Module)face->driver; - - - if ( driver->clazz && driver->clazz->module_name ) - { - if ( ft_strcmp( driver->clazz->module_name, name ) == 0 ) - return 1; - } - } - return 0; - } +#include FT_SERVICE_BDF_H FT_EXPORT_DEF( FT_Error ) @@ -52,14 +33,15 @@ error = FT_Err_Invalid_Argument; - if ( test_font_type( face, "bdf" ) ) + if ( face ) { - BDF_Public_Face bdf_face = (BDF_Public_Face)face; + FT_Service_BDF service; - encoding = (const char*) bdf_face->charset_encoding; - registry = (const char*) bdf_face->charset_registry; - error = 0; + FT_FACE_FIND_SERVICE( face, service, BDF ); + + if ( service && service->get_charset_id ) + error = service->get_charset_id( face, &encoding, ®istry ); } if ( acharset_encoding ) @@ -84,22 +66,18 @@ aproperty->type = BDF_PROPERTY_TYPE_NONE; - if ( face != NULL && face->driver != NULL ) + if ( face ) { - FT_Driver driver = face->driver; - BDF_GetPropertyFunc func; + FT_Service_BDF service; - if ( driver->root.clazz->get_interface ) - { - func = (BDF_GetPropertyFunc)driver->root.clazz->get_interface( - FT_MODULE( driver ), "get_bdf_property" ); - if ( func ) - error = func( face, prop_name, aproperty ); - } + FT_FACE_FIND_SERVICE( face, service, BDF ); + + if ( service && service->get_property ) + error = service->get_property( face, prop_name, aproperty ); } - return error; + return error; } diff --git a/reactos/lib/freetype/src/base/ftcalc.c b/reactos/lib/freetype/src/base/ftcalc.c index 29a3a59fc04..f169642e0b4 100644 --- a/reactos/lib/freetype/src/base/ftcalc.c +++ b/reactos/lib/freetype/src/base/ftcalc.c @@ -4,7 +4,7 @@ /* */ /* Arithmetic computations (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -74,8 +74,8 @@ FT_EXPORT_DEF( FT_Fixed ) FT_RoundFix( FT_Fixed a ) { - return ( a >= 0 ) ? ( a + 0x8000L ) & -0x10000L - : -((-a + 0x8000L ) & -0x10000L ); + return ( a >= 0 ) ? ( a + 0x8000L ) & ~0xFFFFL + : -((-a + 0x8000L ) & ~0xFFFFL ); } @@ -84,8 +84,8 @@ FT_EXPORT_DEF( FT_Fixed ) FT_CeilFix( FT_Fixed a ) { - return ( a >= 0 ) ? ( a + 0xFFFFL ) & -0x10000L - : -((-a + 0xFFFFL ) & -0x10000L ); + return ( a >= 0 ) ? ( a + 0xFFFFL ) & ~0xFFFFL + : -((-a + 0xFFFFL ) & ~0xFFFFL ); } @@ -94,8 +94,8 @@ FT_EXPORT_DEF( FT_Fixed ) FT_FloorFix( FT_Fixed a ) { - return ( a >= 0 ) ? a & -0x10000L - : -((-a) & -0x10000L ); + return ( a >= 0 ) ? a & ~0xFFFFL + : -((-a) & ~0xFFFFL ); } @@ -155,6 +155,33 @@ } +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( FT_Long ) + FT_MulDiv_No_Round( FT_Long a, + FT_Long b, + FT_Long c ) + { + FT_Int s; + FT_Long d; + + + s = 1; + if ( a < 0 ) { a = -a; s = -1; } + if ( b < 0 ) { b = -b; s = -s; } + if ( c < 0 ) { c = -c; s = -s; } + + d = (FT_Long)( c > 0 ? (FT_Int64)a * b / c + : 0x7FFFFFFFL ); + + return ( s > 0 ) ? d : -d; + } + +#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ + + /* documentation is in freetype.h */ FT_EXPORT_DEF( FT_Long ) @@ -298,14 +325,13 @@ if ( a == 0 || b == c ) return a; - s = a; a = ABS( a ); - s ^= b; b = ABS( b ); - s ^= c; c = ABS( c ); + s = a; a = FT_ABS( a ); + s ^= b; b = FT_ABS( b ); + s ^= c; c = FT_ABS( c ); if ( a <= 46340L && b <= 46340L && c <= 176095L && c > 0 ) - { a = ( a * b + ( c >> 1 ) ) / c; - } + else if ( c > 0 ) { FT_Int64 temp, temp2; @@ -325,6 +351,43 @@ } +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + FT_BASE_DEF( FT_Long ) + FT_MulDiv_No_Round( FT_Long a, + FT_Long b, + FT_Long c ) + { + long s; + + + if ( a == 0 || b == c ) + return a; + + s = a; a = FT_ABS( a ); + s ^= b; b = FT_ABS( b ); + s ^= c; c = FT_ABS( c ); + + if ( a <= 46340L && b <= 46340L && c > 0 ) + a = a * b / c; + + else if ( c > 0 ) + { + FT_Int64 temp; + + + ft_multo64( a, b, &temp ); + a = ft_div64by32( temp.hi, temp.lo, c ); + } + else + a = 0x7FFFFFFFL; + + return ( s < 0 ? -a : a ); + } + +#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ + + /* documentation is in freetype.h */ FT_EXPORT_DEF( FT_Long ) @@ -338,8 +401,8 @@ if ( a == 0 || b == 0x10000L ) return a; - s = a; a = ABS(a); - s ^= b; b = ABS(b); + s = a; a = FT_ABS(a); + s ^= b; b = FT_ABS(b); ua = (FT_ULong)a; ub = (FT_ULong)b; @@ -371,8 +434,8 @@ FT_UInt32 q; - s = a; a = ABS(a); - s ^= b; b = ABS(b); + s = a; a = FT_ABS(a); + s ^= b; b = FT_ABS(b); if ( b == 0 ) { @@ -411,8 +474,8 @@ FT_Int32 s; - s = x; x = ABS( x ); - s ^= y; y = ABS( y ); + s = x; x = FT_ABS( x ); + s ^= y; y = FT_ABS( y ); ft_multo64( x, y, z ); @@ -445,7 +508,7 @@ x->lo = (FT_UInt32)-(FT_Int32)x->lo; x->hi = ~x->hi + !x->lo; } - s ^= y; y = ABS( y ); + s ^= y; y = FT_ABS( y ); /* Shortcut */ if ( x->hi == 0 ) @@ -499,7 +562,7 @@ x->lo = (FT_UInt32)-(FT_Int32)x->lo; x->hi = ~x->hi + !x->lo; } - s ^= y; y = ABS( y ); + s ^= y; y = FT_ABS( y ); /* Shortcut */ if ( x->hi == 0 ) diff --git a/reactos/lib/freetype/src/base/ftdbgmem.c b/reactos/lib/freetype/src/base/ftdbgmem.c index dc4a1bbf2b4..152220c605d 100644 --- a/reactos/lib/freetype/src/base/ftdbgmem.c +++ b/reactos/lib/freetype/src/base/ftdbgmem.c @@ -4,7 +4,7 @@ /* */ /* Memory debugger (body). */ /* */ -/* Copyright 2001, 2002, 2003 by */ +/* Copyright 2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -604,7 +604,7 @@ p = getenv( "FT2_ALLOC_TOTAL_MAX" ); if ( p != NULL ) { - FT_Long total_max = atol(p); + FT_Long total_max = ft_atol(p); if ( total_max > 0 ) { @@ -616,7 +616,7 @@ p = getenv( "FT2_ALLOC_COUNT_MAX" ); if ( p != NULL ) { - FT_Long total_count = atol(p); + FT_Long total_count = ft_atol(p); if ( total_count > 0 ) { diff --git a/reactos/lib/freetype/src/base/ftdebug.c b/reactos/lib/freetype/src/base/ftdebug.c index 48a214380f6..a6c18412b88 100644 --- a/reactos/lib/freetype/src/base/ftdebug.c +++ b/reactos/lib/freetype/src/base/ftdebug.c @@ -4,7 +4,7 @@ /* */ /* Debugging and logging component (body). */ /* */ -/* Copyright 1996-2001 by */ +/* Copyright 1996-2001, 2002, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -82,8 +82,9 @@ /* array of trace levels, initialized to 0 */ int ft_trace_levels[trace_count]; + /* define array of trace toggle names */ -#define FT_TRACE_DEF(x) #x , +#define FT_TRACE_DEF( x ) #x , static const char* ft_trace_toggles[trace_count + 1] = { @@ -94,19 +95,43 @@ #undef FT_TRACE_DEF + /* documentation is in ftdebug.h */ + + FT_EXPORT_DEF( FT_Int ) + FT_Trace_Get_Count( void ) + { + return trace_count; + } + + + /* documentation is in ftdebug.h */ + + FT_EXPORT_DEF( const char * ) + FT_Trace_Get_Name( FT_Int idx ) + { + int max = FT_Trace_Get_Count(); + + + if ( idx < max ) + return ft_trace_toggles[idx]; + else + return NULL; + } + + /*************************************************************************/ /* */ /* Initialize the tracing sub-system. This is done by retrieving the */ - /* value of the "FT2_DEBUG" environment variable. It must be a list of */ - /* toggles, separated by spaces, `;' or `,'. Example: */ + /* value of the `FT2_DEBUG' environment variable. It must be a list of */ + /* toggles, separated by spaces, `;', or `,'. Example: */ /* */ - /* "any:3 memory:6 stream:5" */ + /* export FT2_DEBUG="any:3 memory:6 stream:5" */ /* */ - /* This will request that all levels be set to 3, except the trace level */ - /* for the memory and stream components which are set to 6 and 5, */ + /* This requests that all levels be set to 3, except the trace level for */ + /* the memory and stream components which are set to 6 and 5, */ /* respectively. */ /* */ - /* See the file <freetype/internal/fttrace.h> for details of the */ + /* See the file <include/freetype/internal/fttrace.h> for details of the */ /* available toggle names. */ /* */ /* The level must be between 0 and 6; 0 means quiet (except for serious */ @@ -117,6 +142,7 @@ { const char* ft2_debug = getenv( "FT2_DEBUG" ); + if ( ft2_debug ) { const char* p = ft2_debug; @@ -133,10 +159,10 @@ q = p; while ( *p && *p != ':' ) p++; - + if ( *p == ':' && p > q ) { - FT_Int n, i, len = (FT_Int)(p - q); + FT_Int n, i, len = (FT_Int)( p - q ); FT_Int level = -1, found = -1; @@ -171,7 +197,7 @@ { if ( found == trace_any ) { - /* special case for "any" */ + /* special case for `any' */ for ( n = 0; n < trace_count; n++ ) ft_trace_levels[n] = level; } @@ -183,14 +209,33 @@ } } + #else /* !FT_DEBUG_LEVEL_TRACE */ + FT_BASE_DEF( void ) ft_debug_init( void ) { /* nothing */ } + + FT_EXPORT_DEF( FT_Int ) + FT_Trace_Get_Count( void ) + { + return 0; + } + + + FT_EXPORT_DEF( const char * ) + FT_Trace_Get_Name( FT_Int idx ) + { + FT_UNUSED( idx ); + + return NULL; + } + + #endif /* !FT_DEBUG_LEVEL_TRACE */ diff --git a/reactos/lib/freetype/src/base/ftgloadr.c b/reactos/lib/freetype/src/base/ftgloadr.c index 5a2eb51606e..0308f713c88 100644 --- a/reactos/lib/freetype/src/base/ftgloadr.c +++ b/reactos/lib/freetype/src/base/ftgloadr.c @@ -4,7 +4,7 @@ /* */ /* The FreeType glyph loader (body). */ /* */ -/* Copyright 2002 by */ +/* Copyright 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -19,6 +19,7 @@ #include <ft2build.h> #include FT_INTERNAL_GLYPH_LOADER_H #include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_OBJECTS_H #undef FT_COMPONENT #define FT_COMPONENT trace_gloader @@ -205,7 +206,7 @@ if ( new_max > old_max ) { - new_max = ( new_max + 7 ) & -8; + new_max = FT_PAD_CEIL( new_max, 8 ); if ( FT_RENEW_ARRAY( base->points, old_max, new_max ) || FT_RENEW_ARRAY( base->tags, old_max, new_max ) ) @@ -225,7 +226,7 @@ n_contours; if ( new_max > old_max ) { - new_max = ( new_max + 3 ) & -4; + new_max = FT_PAD_CEIL( new_max, 4 ); if ( FT_RENEW_ARRAY( base->contours, old_max, new_max ) ) goto Exit; @@ -261,7 +262,7 @@ old_max = loader->max_subglyphs; if ( new_max > old_max ) { - new_max = ( new_max + 1 ) & -2; + new_max = FT_PAD_CEIL( new_max, 2 ); if ( FT_RENEW_ARRAY( base->subglyphs, old_max, new_max ) ) goto Exit; @@ -336,17 +337,17 @@ FT_Outline* in = &source->base.outline; - FT_MEM_COPY( out->points, in->points, - num_points * sizeof ( FT_Vector ) ); - FT_MEM_COPY( out->tags, in->tags, - num_points * sizeof ( char ) ); - FT_MEM_COPY( out->contours, in->contours, - num_contours * sizeof ( short ) ); + FT_ARRAY_COPY( out->points, in->points, + num_points ); + FT_ARRAY_COPY( out->tags, in->tags, + num_points ); + FT_ARRAY_COPY( out->contours, in->contours, + num_contours ); /* do we need to copy the extra points? */ if ( target->use_extra && source->use_extra ) - FT_MEM_COPY( target->base.extra_points, source->base.extra_points, - num_points * sizeof ( FT_Vector ) ); + FT_ARRAY_COPY( target->base.extra_points, source->base.extra_points, + num_points ); out->n_points = (short)num_points; out->n_contours = (short)num_contours; diff --git a/reactos/lib/freetype/src/base/ftglyph.c b/reactos/lib/freetype/src/base/ftglyph.c index fad5a620daf..c6c458cc16c 100644 --- a/reactos/lib/freetype/src/base/ftglyph.c +++ b/reactos/lib/freetype/src/base/ftglyph.c @@ -4,7 +4,7 @@ /* */ /* FreeType convenience functions to handle glyphs (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -206,6 +206,7 @@ } + FT_CALLBACK_TABLE_DEF const FT_Glyph_Class ft_bitmap_glyph_class = { sizeof( FT_BitmapGlyphRec ), @@ -253,14 +254,11 @@ goto Exit; /* copy it */ - FT_MEM_COPY( target->points, source->points, - source->n_points * sizeof ( FT_Vector ) ); + FT_ARRAY_COPY( target->points, source->points, source->n_points ); - FT_MEM_COPY( target->tags, source->tags, - source->n_points * sizeof ( FT_Byte ) ); + FT_ARRAY_COPY( target->tags, source->tags, source->n_points ); - FT_MEM_COPY( target->contours, source->contours, - source->n_contours * sizeof ( FT_Short ) ); + FT_ARRAY_COPY( target->contours, source->contours, source->n_contours ); /* copy all flags, except the `FT_OUTLINE_OWNER' one */ target->flags = source->flags | FT_OUTLINE_OWNER; @@ -327,6 +325,7 @@ } + FT_CALLBACK_TABLE_DEF const FT_Glyph_Class ft_outline_glyph_class = { sizeof( FT_OutlineGlyphRec ), @@ -421,7 +420,7 @@ FT_Get_Glyph( FT_GlyphSlot slot, FT_Glyph *aglyph ) { - FT_Library library = slot->library; + FT_Library library; FT_Error error; FT_Glyph glyph; @@ -431,6 +430,8 @@ if ( !slot ) return FT_Err_Invalid_Slot_Handle; + library = slot->library; + if ( !aglyph ) return FT_Err_Invalid_Argument; @@ -544,10 +545,10 @@ if ( bbox_mode == FT_GLYPH_BBOX_GRIDFIT || bbox_mode == FT_GLYPH_BBOX_PIXELS ) { - acbox->xMin &= -64; - acbox->yMin &= -64; - acbox->xMax = ( acbox->xMax + 63 ) & -64; - acbox->yMax = ( acbox->yMax + 63 ) & -64; + acbox->xMin = FT_PIX_FLOOR( acbox->xMin ); + acbox->yMin = FT_PIX_FLOOR( acbox->yMin ); + acbox->xMax = FT_PIX_CEIL( acbox->xMax ); + acbox->yMax = FT_PIX_CEIL( acbox->yMax ); } /* convert to integer pixels if needed */ diff --git a/reactos/lib/freetype/src/base/ftmac.c b/reactos/lib/freetype/src/base/ftmac.c index 04c03d99e31..c7147538275 100644 --- a/reactos/lib/freetype/src/base/ftmac.c +++ b/reactos/lib/freetype/src/base/ftmac.c @@ -4,7 +4,7 @@ /* */ /* Mac FOND support. Written by just@letterror.com. */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -66,6 +66,10 @@ #ifdef __GNUC__ #include "../truetype/ttobjs.h" #include "../type1/t1objs.h" + /* This is for Mac OS X. Without redefinition, OS_INLINE */ + /* expands to `static inline' which doesn't survive the */ + /* -ansi compilation flag of GCC. */ +#define OS_INLINE static __inline__ #include <Carbon/Carbon.h> #else #include "truetype/ttobjs.h" @@ -77,6 +81,10 @@ #include <TextUtils.h> #endif +#if defined( __MWERKS__ ) && !TARGET_RT_MAC_MACHO +#include <FSp_fopen.h> +#endif + #include FT_MAC_H @@ -87,12 +95,50 @@ #define PREFER_LWFN 1 #endif + +#if defined( __MWERKS__ ) && !TARGET_RT_MAC_MACHO + +#define STREAM_FILE( stream ) ( (FILE*)stream->descriptor.pointer ) + + + FT_CALLBACK_DEF( void ) + ft_FSp_stream_close( FT_Stream stream ) + { + fclose( STREAM_FILE( stream ) ); + + stream->descriptor.pointer = NULL; + stream->size = 0; + stream->base = 0; + } + + + FT_CALLBACK_DEF( unsigned long ) + ft_FSp_stream_io( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ) + { + FILE* file; + + + file = STREAM_FILE( stream ); + + fseek( file, offset, SEEK_SET ); + + return (unsigned long)fread( buffer, 1, count, file ); + } + +#endif /* __MWERKS__ && !TARGET_RT_MAC_MACHO */ + + /* Given a pathname, fill in a file spec. */ static int file_spec_from_path( const char* pathname, FSSpec* spec ) { -#if defined( TARGET_API_MAC_CARBON ) && !defined( __MWERKS__ ) + +#if !TARGET_API_MAC_OS8 && \ + !( defined( __MWERKS__ ) && !TARGET_RT_MAC_MACHO ) OSErr e; FSRef ref; @@ -123,12 +169,13 @@ return 0; #endif + } /* Return the file type of the file specified by spec. */ static OSType - get_file_type( FSSpec* spec ) + get_file_type( const FSSpec* spec ) { FInfo finfo; @@ -140,22 +187,6 @@ } -#ifdef TARGET_API_MAC_CARBON - - /* is this a Mac OS X .dfont file */ - static Boolean - is_dfont( FSSpec* spec ) - { - int nameLen = spec->name[0]; - - - return nameLen >= 6 && - !ft_memcmp( spec->name + nameLen - 5, ".dfont", 6 ); - } - -#endif - - /* Given a PostScript font name, create the Macintosh LWFN file name. */ static void create_lwfn_name( char* ps_name, @@ -217,9 +248,9 @@ /* Make a file spec for an LWFN file from a FOND resource and a file name. */ static FT_Error - make_lwfn_spec( Handle fond, - unsigned char* file_name, - FSSpec* spec ) + make_lwfn_spec( Handle fond, + const unsigned char* file_name, + FSSpec* spec ) { FT_Error error; short ref_num, v_ref_num; @@ -240,12 +271,24 @@ } + static short + count_faces_sfnt( char *fond_data ) + { + /* The count is 1 greater than the value in the FOND. */ + /* Isn't that cute? :-) */ + + return 1 + *( (short *)( fond_data + sizeof ( FamRec ) ) ); + } + + /* Look inside the FOND data, answer whether there should be an SFNT resource, and answer the name of a possible LWFN Type 1 file. Thanks to Paul Miller (paulm@profoundeffects.com) for the fix to load a face OTHER than the first one in the FOND! */ + + static void parse_fond( char* fond_data, short* have_sfnt, @@ -265,19 +308,24 @@ fond = (FamRec*)fond_data; assoc = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 ); base_assoc = assoc; - assoc += face_index; /* add on the face_index! */ - /* if the face at this index is not scalable, - fall back to the first one (old behavior) */ - if ( assoc->fontSize == 0 ) + /* Let's do a little range checking before we get too excited here */ + if ( face_index < count_faces_sfnt( fond_data ) ) { - *have_sfnt = 1; - *sfnt_id = assoc->fontID; - } - else if ( base_assoc->fontSize == 0 ) - { - *have_sfnt = 1; - *sfnt_id = base_assoc->fontID; + assoc += face_index; /* add on the face_index! */ + + /* if the face at this index is not scalable, + fall back to the first one (old behavior) */ + if ( assoc->fontSize == 0 ) + { + *have_sfnt = 1; + *sfnt_id = assoc->fontID; + } + else if ( base_assoc->fontSize == 0 ) + { + *have_sfnt = 1; + *sfnt_id = base_assoc->fontID; + } } if ( fond->ffStylOff ) @@ -344,6 +392,33 @@ } + static short + count_faces( Handle fond ) + { + short sfnt_id, have_sfnt, have_lwfn = 0; + Str255 lwfn_file_name; + FSSpec lwfn_spec; + + + HLock( fond ); + parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, 0 ); + HUnlock( fond ); + + if ( lwfn_file_name[0] ) + { + if ( make_lwfn_spec( fond, lwfn_file_name, &lwfn_spec ) == FT_Err_Ok ) + have_lwfn = 1; /* yeah, we got one! */ + else + have_lwfn = 0; /* no LWFN file found */ + } + + if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) ) + return 1; + else + return count_faces_sfnt( *fond ); + } + + /* Read Type 1 data from the POST resources inside the LWFN file, return a PFB buffer. This is somewhat convoluted because the FT2 PFB parser wants the ASCII header as one chunk, and the LWFN @@ -351,12 +426,12 @@ of the same type together. */ static FT_Error read_lwfn( FT_Memory memory, - FSSpec* lwfn_spec, + short res_ref, FT_Byte** pfb_data, FT_ULong* size ) { FT_Error error = FT_Err_Ok; - short res_ref, res_id; + short res_id; unsigned char *buffer, *p, *size_p = NULL; FT_ULong total_size = 0; FT_ULong post_size, pfb_chunk_size; @@ -364,13 +439,10 @@ char code, last_code; - res_ref = FSpOpenResFile( lwfn_spec, fsRdPerm ); - if ( ResError() ) - return FT_Err_Out_Of_Memory; UseResFile( res_ref ); - /* First pass: load all POST resources, and determine the size of - the output buffer. */ + /* First pass: load all POST resources, and determine the size of */ + /* the output buffer. */ res_id = 501; last_code = -1; @@ -397,8 +469,8 @@ if ( FT_ALLOC( buffer, (FT_Long)total_size ) ) goto Error; - /* Second pass: append all POST data to the buffer, add PFB fields. - Glue all consecutive chunks of the same type together. */ + /* Second pass: append all POST data to the buffer, add PFB fields. */ + /* Glue all consecutive chunks of the same type together. */ p = buffer; res_id = 501; last_code = -1; @@ -543,6 +615,14 @@ args.driver = FT_Get_Module( library, driver_name ); } + /* At this point, face_index has served its purpose; */ + /* whoever calls this function has already used it to */ + /* locate the correct font data. We should not propagate */ + /* this index to FT_Open_Face() (unless it is negative). */ + + if ( face_index > 0 ) + face_index = 0; + error = FT_Open_Face( library, &args, face_index, aface ); if ( error == FT_Err_Ok ) (*aface)->face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM; @@ -551,19 +631,59 @@ } + static FT_Error + OpenFileAsResource( const FSSpec* spec, + short *p_res_ref ) + { + FT_Error error; + +#if !TARGET_API_MAC_OS8 + + FSRef hostContainerRef; + + + error = FSpMakeFSRef( spec, &hostContainerRef ); + if ( error == noErr ) + error = FSOpenResourceFile( &hostContainerRef, + 0, NULL, fsRdPerm, p_res_ref ); + + /* If the above fails, then it is probably not a resource file */ + /* However, it has been reported that FSOpenResourceFile() sometimes */ + /* fails on some old resource-fork files, which FSpOpenResFile() can */ + /* open. So, just try again with FSpOpenResFile() and see what */ + /* happens :-) */ + + if ( error != noErr ) + +#endif /* !TARGET_API_MAC_OS8 */ + + { + *p_res_ref = FSpOpenResFile( spec, fsRdPerm ); + error = ResError(); + } + + return error ? FT_Err_Cannot_Open_Resource : FT_Err_Ok; + } + + /* Create a new FT_Face from a file spec to an LWFN file. */ static FT_Error - FT_New_Face_From_LWFN( FT_Library library, - FSSpec* spec, - FT_Long face_index, - FT_Face *aface ) + FT_New_Face_From_LWFN( FT_Library library, + const FSSpec* lwfn_spec, + FT_Long face_index, + FT_Face *aface ) { FT_Byte* pfb_data; FT_ULong pfb_size; FT_Error error; + short res_ref; - error = read_lwfn( library->memory, spec, &pfb_data, &pfb_size ); + error = OpenFileAsResource( lwfn_spec, &res_ref ); + if ( error ) + return error; + + error = read_lwfn( library->memory, res_ref, &pfb_data, &pfb_size ); if ( error ) return error; @@ -624,34 +744,34 @@ /* Create a new FT_Face from a file spec to a suitcase file. */ static FT_Error FT_New_Face_From_Suitcase( FT_Library library, - FSSpec* spec, + short res_ref, FT_Long face_index, FT_Face *aface ) { FT_Error error = FT_Err_Ok; - short res_ref, res_index; + short res_index; Handle fond; + short num_faces; - res_ref = FSpOpenResFile( spec, fsRdPerm ); - if ( ResError() ) - return FT_Err_Cannot_Open_Resource; UseResFile( res_ref ); - /* face_index may be -1, in which case we - just need to do a sanity check */ - if ( face_index < 0 ) - res_index = 1; - else + for ( res_index = 1; ; ++res_index ) { - res_index = (short)( face_index + 1 ); - face_index = 0; - } - fond = Get1IndResource( 'FOND', res_index ); - if ( ResError() ) - { - error = FT_Err_Cannot_Open_Resource; - goto Error; + fond = Get1IndResource( 'FOND', res_index ); + if ( ResError() ) + { + error = FT_Err_Cannot_Open_Resource; + goto Error; + } + if ( face_index < 0 ) + break; + + num_faces = count_faces( fond ); + if ( face_index < num_faces ) + break; + + face_index -= num_faces; } error = FT_New_Face_From_FOND( library, fond, face_index, aface ); @@ -662,57 +782,6 @@ } -#ifdef TARGET_API_MAC_CARBON - - /* Create a new FT_Face from a file spec to a suitcase file. */ - static FT_Error - FT_New_Face_From_dfont( FT_Library library, - FSSpec* spec, - FT_Long face_index, - FT_Face* aface ) - { - FT_Error error = FT_Err_Ok; - short res_ref, res_index; - Handle fond; - FSRef hostContainerRef; - - - error = FSpMakeFSRef( spec, &hostContainerRef ); - if ( error == noErr ) - error = FSOpenResourceFile( &hostContainerRef, - 0, NULL, fsRdPerm, &res_ref ); - - if ( error != noErr ) - return FT_Err_Cannot_Open_Resource; - - UseResFile( res_ref ); - - /* face_index may be -1, in which case we - just need to do a sanity check */ - if ( face_index < 0 ) - res_index = 1; - else - { - res_index = (short)( face_index + 1 ); - face_index = 0; - } - fond = Get1IndResource( 'FOND', res_index ); - if ( ResError() ) - { - error = FT_Err_Cannot_Open_Resource; - goto Error; - } - - error = FT_New_Face_From_FOND( library, fond, face_index, aface ); - - Error: - CloseResFile( res_ref ); - return error; - } - -#endif - - /* documentation is in ftmac.h */ FT_EXPORT_DEF( FT_Error ) @@ -763,9 +832,9 @@ /* documentation is in ftmac.h */ FT_EXPORT_DEF( FT_Error ) - FT_GetFile_From_Mac_Name( char* fontName, - FSSpec* pathSpec, - FT_Long* face_index ) + FT_GetFile_From_Mac_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) { OptionBits options = kFMUseGlobalScopeOption; @@ -826,7 +895,7 @@ the_font = font; } else - ++(*face_index); + ++(*face_index); } } @@ -845,23 +914,46 @@ return FT_Err_Unknown_File_Format; } + /* Common function to load a new FT_Face from a resource file. */ - static long - ResourceForkSize(FSSpec* spec) + static FT_Error + FT_New_Face_From_Resource( FT_Library library, + const FSSpec *spec, + FT_Long face_index, + FT_Face *aface ) { - long len; - short refNum; - OSErr e; + OSType file_type; + short res_ref; + FT_Error error; - e = FSpOpenRF( spec, fsRdPerm, &refNum ); /* I.M. Files 2-155 */ - if ( e == noErr ) + if ( OpenFileAsResource( spec, &res_ref ) == FT_Err_Ok ) { - e = GetEOF( refNum, &len ); - FSClose( refNum ); + /* LWFN is a (very) specific file format, check for it explicitly */ + + file_type = get_file_type( spec ); + if ( file_type == 'LWFN' ) + return FT_New_Face_From_LWFN( library, spec, face_index, aface ); + + /* Otherwise the file type doesn't matter (there are more than */ + /* `FFIL' and `tfil'). Just try opening it as a font suitcase; */ + /* if it works, fine. */ + + error = FT_New_Face_From_Suitcase( library, res_ref, + face_index, aface ); + if ( error == 0 ) + return error; + + /* else forget about the resource fork and fall through to */ + /* data fork formats */ + + CloseResFile( res_ref ); } - return ( e == noErr ) ? len : 0; + /* let it fall through to normal loader (.ttf, .otf, etc.); */ + /* we signal this by returning no error and no FT_Face */ + *aface = NULL; + return 0; } @@ -884,7 +976,7 @@ { FT_Open_Args args; FSSpec spec; - OSType file_type; + FT_Error error; /* test for valid `library' and `aface' delayed to FT_Open_Face() */ @@ -894,26 +986,9 @@ if ( file_spec_from_path( pathname, &spec ) ) return FT_Err_Invalid_Argument; - /* Regardless of type, don't try to use the resource fork if it is */ - /* empty. Some TTF fonts have type `FFIL', for example, but they */ - /* only have data forks. */ - - if ( ResourceForkSize( &spec ) != 0 ) - { - file_type = get_file_type( &spec ); - if ( file_type == 'FFIL' || file_type == 'tfil' ) - return FT_New_Face_From_Suitcase( library, &spec, face_index, aface ); - - if ( file_type == 'LWFN' ) - return FT_New_Face_From_LWFN( library, &spec, face_index, aface ); - } - -#ifdef TARGET_API_MAC_CARBON - - if ( is_dfont( &spec ) ) - return FT_New_Face_From_dfont( library, &spec, face_index, aface ); - -#endif + error = FT_New_Face_From_Resource( library, &spec, face_index, aface ); + if ( error != 0 || *aface != NULL ) + return error; /* let it fall through to normal loader (.ttf, .otf, etc.) */ args.flags = FT_OPEN_PATHNAME; @@ -922,4 +997,96 @@ } + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face_From_FSSpec */ + /* */ + /* <Description> */ + /* FT_New_Face_From_FSSpec is identical to FT_New_Face except it */ + /* accepts an FSSpec instead of a path. */ + /* */ + FT_EXPORT_DEF( FT_Error ) + FT_New_Face_From_FSSpec( FT_Library library, + const FSSpec *spec, + FT_Long face_index, + FT_Face *aface ) + { + FT_Open_Args args; + FT_Error error; + FT_Stream stream; + FILE* file; + FT_Memory memory; + + + /* test for valid `library' and `aface' delayed to FT_Open_Face() */ + if ( !spec ) + return FT_Err_Invalid_Argument; + + error = FT_New_Face_From_Resource( library, spec, face_index, aface ); + if ( error != 0 || *aface != NULL ) + return error; + + /* let it fall through to normal loader (.ttf, .otf, etc.) */ + +#if defined( __MWERKS__ ) && !TARGET_RT_MAC_MACHO + + /* Codewarrior's C library can open a FILE from a FSSpec */ + /* but we must compile with FSp_fopen.c in addition to */ + /* runtime libraries. */ + + memory = library->memory; + + if ( FT_NEW( stream ) ) + return error; + stream->memory = memory; + + file = FSp_fopen( spec, "rb" ); + if ( !file ) + return FT_Err_Cannot_Open_Resource; + + fseek( file, 0, SEEK_END ); + stream->size = ftell( file ); + fseek( file, 0, SEEK_SET ); + + stream->descriptor.pointer = file; + stream->pathname.pointer = NULL; + stream->pos = 0; + + stream->read = ft_FSp_stream_io; + stream->close = ft_FSp_stream_close; + + args.flags = FT_OPEN_STREAM; + args.stream = stream; + + error = FT_Open_Face( library, &args, face_index, aface ); + if ( error == FT_Err_Ok ) + (*aface)->face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM; + +#else /* !(__MWERKS__ && !TARGET_RT_MAC_MACHO) */ + + { + FSRef ref; + UInt8 path[256]; + OSErr err; + + + err = FSpMakeFSRef(spec, &ref); + if ( !err ) + { + err = FSRefMakePath( &ref, path, sizeof ( path ) ); + if ( !err ) + error = FT_New_Face( library, (const char*)path, + face_index, aface ); + } + if ( err ) + error = FT_Err_Cannot_Open_Resource; + } + +#endif /* !(__MWERKS__ && !TARGET_RT_MAC_MACHO) */ + + return error; + } + + /* END */ diff --git a/reactos/lib/freetype/src/base/ftmm.c b/reactos/lib/freetype/src/base/ftmm.c index 229a0431654..0bb2813092c 100644 --- a/reactos/lib/freetype/src/base/ftmm.c +++ b/reactos/lib/freetype/src/base/ftmm.c @@ -4,7 +4,7 @@ /* */ /* Multiple Master font support (body). */ /* */ -/* Copyright 1996-2001 by */ +/* Copyright 1996-2001, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -19,6 +19,7 @@ #include <ft2build.h> #include FT_MULTIPLE_MASTERS_H #include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_MULTIPLE_MASTERS_H /*************************************************************************/ @@ -31,15 +32,15 @@ #define FT_COMPONENT trace_mm - /* documentation is in ftmm.h */ - - FT_EXPORT_DEF( FT_Error ) - FT_Get_Multi_Master( FT_Face face, - FT_Multi_Master *amaster ) + static FT_Error + ft_face_get_mm_service( FT_Face face, + FT_Service_MultiMasters *aservice ) { FT_Error error; + *aservice = NULL; + if ( !face ) return FT_Err_Invalid_Face_Handle; @@ -47,14 +48,34 @@ if ( FT_HAS_MULTIPLE_MASTERS( face ) ) { - FT_Driver driver = face->driver; - FT_Get_MM_Func func; + FT_FACE_LOOKUP_SERVICE( face, + *aservice, + MULTI_MASTERS ); + + if ( aservice ) + error = FT_Err_Ok; + } + + return error; + } - func = (FT_Get_MM_Func)driver->root.clazz->get_interface( - FT_MODULE( driver ), "get_mm" ); - if ( func ) - error = func( face, amaster ); + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Multi_Master( FT_Face face, + FT_Multi_Master *amaster ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_Err_Invalid_Argument; + if ( service->get_mm ) + error = service->get_mm( face, amaster ); } return error; @@ -68,24 +89,16 @@ FT_UInt num_coords, FT_Long* coords ) { - FT_Error error; + FT_Error error; + FT_Service_MultiMasters service; - if ( !face ) - return FT_Err_Invalid_Face_Handle; - - error = FT_Err_Invalid_Argument; - - if ( FT_HAS_MULTIPLE_MASTERS( face ) ) + error = ft_face_get_mm_service( face, &service ); + if ( !error ) { - FT_Driver driver = face->driver; - FT_Set_MM_Design_Func func; - - - func = (FT_Set_MM_Design_Func)driver->root.clazz->get_interface( - FT_MODULE( driver ), "set_mm_design" ); - if ( func ) - error = func( face, num_coords, coords ); + error = FT_Err_Invalid_Argument; + if ( service->set_mm_design ) + error = service->set_mm_design( face, num_coords, coords ); } return error; @@ -99,24 +112,16 @@ FT_UInt num_coords, FT_Fixed* coords ) { - FT_Error error; + FT_Error error; + FT_Service_MultiMasters service; - if ( !face ) - return FT_Err_Invalid_Face_Handle; - - error = FT_Err_Invalid_Argument; - - if ( FT_HAS_MULTIPLE_MASTERS( face ) ) + error = ft_face_get_mm_service( face, &service ); + if ( !error ) { - FT_Driver driver = face->driver; - FT_Set_MM_Blend_Func func; - - - func = (FT_Set_MM_Blend_Func)driver->root.clazz->get_interface( - FT_MODULE( driver ), "set_mm_blend" ); - if ( func ) - error = func( face, num_coords, coords ); + error = FT_Err_Invalid_Argument; + if ( service->set_mm_blend ) + error = service->set_mm_blend( face, num_coords, coords ); } return error; diff --git a/reactos/lib/freetype/src/base/ftobjs.c b/reactos/lib/freetype/src/base/ftobjs.c index 8fdcc883e1f..517e83e42c1 100644 --- a/reactos/lib/freetype/src/base/ftobjs.c +++ b/reactos/lib/freetype/src/base/ftobjs.c @@ -4,7 +4,7 @@ /* */ /* The FreeType private base classes (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -21,12 +21,42 @@ #include FT_OUTLINE_H #include FT_INTERNAL_OBJECTS_H #include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_RFORK_H #include FT_INTERNAL_STREAM_H #include FT_INTERNAL_SFNT_H /* for SFNT_Load_Table_Func */ #include FT_TRUETYPE_TABLES_H #include FT_TRUETYPE_IDS_H #include FT_OUTLINE_H +#include FT_SERVICE_SFNT_H +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_GLYPH_DICT_H +#include FT_SERVICE_TT_CMAP_H + + + FT_BASE_DEF( FT_Pointer ) + ft_service_list_lookup( FT_ServiceDesc service_descriptors, + const char* service_id ) + { + FT_Pointer result = NULL; + FT_ServiceDesc desc = service_descriptors; + + + if ( desc && service_id ) + { + for ( ; desc->serv_id != NULL; desc++ ) + { + if ( ft_strcmp( desc->serv_id, service_id ) == 0 ) + { + result = (FT_Pointer)desc->serv_data; + break; + } + } + } + + return result; + } + FT_BASE_DEF( void ) ft_validator_init( FT_Validator valid, @@ -74,12 +104,12 @@ /*************************************************************************/ - /* create a new input stream from a FT_Open_Args structure */ - /* */ - static FT_Error - ft_input_stream_new( FT_Library library, - const FT_Open_Args* args, - FT_Stream* astream ) + /* create a new input stream from an FT_Open_Args structure */ + /* */ + FT_BASE_DEF( FT_Error ) + FT_Stream_New( FT_Library library, + const FT_Open_Args* args, + FT_Stream *astream ) { FT_Error error; FT_Memory memory; @@ -137,9 +167,9 @@ } - static void - ft_input_stream_free( FT_Stream stream, - FT_Int external ) + FT_BASE_DEF( void ) + FT_Stream_Free( FT_Stream stream, + FT_Int external ) { if ( stream ) { @@ -487,7 +517,10 @@ autohint = 0; } - if ( autohint ) + /* don't apply autohinting if glyph is vertically distorted or */ + /* mirrored */ + if ( autohint && !( face->internal->transform_matrix.yy <= 0 || + face->internal->transform_matrix.yx != 0 ) ) { FT_AutoHinter_Service hinting; @@ -547,15 +580,14 @@ if ( ( load_flags & FT_LOAD_LINEAR_DESIGN ) == 0 && ( face->face_flags & FT_FACE_FLAG_SCALABLE ) ) { - FT_UInt EM = face->units_per_EM; FT_Size_Metrics* metrics = &face->size->metrics; slot->linearHoriAdvance = FT_MulDiv( slot->linearHoriAdvance, - (FT_Long)metrics->x_ppem << 16, EM ); + metrics->x_scale, 64 ); slot->linearVertAdvance = FT_MulDiv( slot->linearVertAdvance, - (FT_Long)metrics->y_ppem << 16, EM ); + metrics->y_scale, 64 ); } if ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM ) == 0 ) @@ -641,6 +673,28 @@ } + static void + destroy_charmaps( FT_Face face, + FT_Memory memory ) + { + FT_Int n; + + + for ( n = 0; n < face->num_charmaps; n++ ) + { + FT_CMap cmap = FT_CMAP( face->charmaps[n] ); + + + FT_CMap_Done( cmap ); + + face->charmaps[n] = NULL; + } + + FT_FREE( face->charmaps ); + face->num_charmaps = 0; + } + + /* destructor for faces list */ static void destroy_face( FT_Memory memory, @@ -661,9 +715,9 @@ /* discard all sizes for this face */ FT_List_Finalize( &face->sizes_list, - (FT_List_Destructor)destroy_size, - memory, - driver ); + (FT_List_Destructor)destroy_size, + memory, + driver ); face->size = 0; /* now discard client data */ @@ -671,31 +725,14 @@ face->generic.finalizer( face ); /* discard charmaps */ - { - FT_Int n; - - - for ( n = 0; n < face->num_charmaps; n++ ) - { - FT_CMap cmap = FT_CMAP( face->charmaps[n] ); - - - FT_CMap_Done( cmap ); - - face->charmaps[n] = NULL; - } - - FT_FREE( face->charmaps ); - face->num_charmaps = 0; - } - + destroy_charmaps( face, memory ); /* finalize format-specific stuff */ if ( clazz->done_face ) clazz->done_face( face ); /* close the stream for this face if needed */ - ft_input_stream_free( + FT_Stream_Free( face->stream, ( face->face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) != 0 ); @@ -704,7 +741,6 @@ /* get rid of it */ if ( face->internal ) { - FT_FREE( face->internal->postscript_name ); FT_FREE( face->internal ); } FT_FREE( face ); @@ -748,7 +784,7 @@ /* caller should have already checked that `face' is valid */ - FT_ASSERT ( face ); + FT_ASSERT( face ); first = face->charmaps; @@ -897,6 +933,7 @@ Fail: if ( error ) { + destroy_charmaps( face, memory ); clazz->done_face( face ); FT_FREE( internal ); FT_FREE( face ); @@ -1100,19 +1137,18 @@ static FT_Error Mac_Read_POST_Resource( FT_Library library, FT_Stream stream, - FT_Long resource_listoffset, + FT_Long *offsets, FT_Long resource_cnt, - FT_Long resource_data, FT_Long face_index, FT_Face *aface ) { FT_Error error = FT_Err_Cannot_Open_Resource; FT_Memory memory = library->memory; FT_Byte* pfb_data; - int i, type, flags, len; + int i, type, flags; + FT_Long len; FT_Long pfb_len, pfb_pos, pfb_lenpos; - FT_Long rlen, junk, temp; - FT_Long *offsets; + FT_Long rlen, temp; if ( face_index == -1 ) @@ -1120,24 +1156,6 @@ if ( face_index != 0 ) return error; - if ( FT_ALLOC( offsets, (FT_Long)resource_cnt * sizeof ( FT_Long ) ) ) - return error; - - error = FT_Stream_Seek( stream, resource_listoffset ); - if ( error ) - goto Exit; - - /* Find all the POST resource offsets */ - for ( i = 0; i < resource_cnt; ++i ) - { - (void)FT_READ_USHORT( junk ); /* resource id */ - (void)FT_READ_USHORT( junk ); /* rsource name */ - if ( FT_READ_LONG( temp ) ) - goto Exit; - offsets[i] = resource_data + ( temp & 0xFFFFFFL ); - (void)FT_READ_LONG( junk ); /* mbz */ - } - /* Find the length of all the POST resources, concatenated. Assume */ /* worst case (each resource in its own section). */ pfb_len = 0; @@ -1154,14 +1172,14 @@ if ( FT_ALLOC( pfb_data, (FT_Long)pfb_len + 2 ) ) goto Exit; - pfb_pos = 0; - pfb_data[pfb_pos++] = 0x80; - pfb_data[pfb_pos++] = 1; /* Ascii section */ - pfb_lenpos = pfb_pos; - pfb_data[pfb_pos++] = 0; /* 4-byte length, fill in later */ - pfb_data[pfb_pos++] = 0; - pfb_data[pfb_pos++] = 0; - pfb_data[pfb_pos++] = 0; + pfb_data[0] = 0x80; + pfb_data[1] = 1; /* Ascii section */ + pfb_data[2] = 0; /* 4-byte length, fill in later */ + pfb_data[3] = 0; + pfb_data[4] = 0; + pfb_data[5] = 0; + pfb_pos = 7; + pfb_lenpos = 2; len = 0; type = 1; @@ -1179,10 +1197,10 @@ len += rlen; else { - pfb_data[pfb_lenpos ] = len & 0xFF; - pfb_data[pfb_lenpos + 1] = ( len >> 8 ) & 0xFF; - pfb_data[pfb_lenpos + 2] = ( len >> 16 ) & 0xFF; - pfb_data[pfb_lenpos + 3] = ( len >> 24 ) & 0xFF; + pfb_data[pfb_lenpos ] = (FT_Byte)( len ); + pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 ); + pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 ); + pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 ); if ( ( flags >> 8 ) == 5 ) /* End of font mark */ break; @@ -1192,8 +1210,8 @@ type = flags >> 8; len = rlen; - pfb_data[pfb_pos++] = type; - pfb_lenpos = pfb_pos; + pfb_data[pfb_pos++] = (FT_Byte)type; + pfb_lenpos = (FT_Byte)pfb_pos; pfb_data[pfb_pos++] = 0; /* 4-byte length, fill in later */ pfb_data[pfb_pos++] = 0; pfb_data[pfb_pos++] = 0; @@ -1207,10 +1225,10 @@ pfb_data[pfb_pos++] = 0x80; pfb_data[pfb_pos++] = 3; - pfb_data[pfb_lenpos ] = len & 0xFF; - pfb_data[pfb_lenpos + 1] = ( len >> 8 ) & 0xFF; - pfb_data[pfb_lenpos + 2] = ( len >> 16 ) & 0xFF; - pfb_data[pfb_lenpos + 3] = ( len >> 24 ) & 0xFF; + pfb_data[pfb_lenpos ] = (FT_Byte)( len ); + pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 ); + pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 ); + pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 ); return open_face_from_buffer( library, pfb_data, @@ -1223,7 +1241,6 @@ FT_FREE( pfb_data ); Exit: - FT_FREE( offsets ); return error; } @@ -1236,18 +1253,16 @@ static FT_Error Mac_Read_sfnt_Resource( FT_Library library, FT_Stream stream, - FT_Long resource_listoffset, + FT_Long *offsets, FT_Long resource_cnt, - FT_Long resource_data, FT_Long face_index, FT_Face *aface ) { FT_Memory memory = library->memory; FT_Byte* sfnt_data; FT_Error error; - int i; - FT_Long flag_offset= 0xFFFFFFL; - FT_Long rlen, junk; + FT_Long flag_offset; + FT_Long rlen; int is_cff; @@ -1256,26 +1271,11 @@ if ( face_index >= resource_cnt ) return FT_Err_Cannot_Open_Resource; - error = FT_Stream_Seek( stream, resource_listoffset ); + flag_offset = offsets[face_index]; + error = FT_Stream_Seek( stream, flag_offset ); if ( error ) goto Exit; - for ( i = 0; i <= face_index; ++i ) - { - (void)FT_READ_USHORT( junk ); /* resource id */ - (void)FT_READ_USHORT( junk ); /* rsource name */ - if ( FT_READ_LONG( flag_offset ) ) - goto Exit; - flag_offset &= 0xFFFFFFL; - (void)FT_READ_LONG( junk ); /* mbz */ - } - - if ( flag_offset == 0xFFFFFFL ) - return FT_Err_Cannot_Open_Resource; - - error = FT_Stream_Seek( stream, flag_offset + resource_data ); - if ( error ) - goto Exit; if ( FT_READ_LONG( rlen ) ) goto Exit; if ( rlen == -1 ) @@ -1316,112 +1316,41 @@ FT_Long face_index, FT_Face *aface ) { - FT_Error error; - unsigned char head[16], head2[16]; - FT_Long rdata_pos, map_pos, rdata_len, map_len; - int allzeros, allmatch, i, cnt, subcnt; - FT_Long type_list, tag, rpos, junk; + FT_Memory memory = library->memory; + FT_Error error; + FT_Long map_offset, rdara_pos; + FT_Long *data_offsets; + FT_Long count; - error = FT_Stream_Seek( stream, resource_offset ); + error = FT_Raccess_Get_HeaderInfo( library, stream, resource_offset, + &map_offset, &rdara_pos ); if ( error ) - goto Exit; - error = FT_Stream_Read( stream, (FT_Byte *)head, 16 ); - if ( error ) - goto Exit; + return error; - rdata_pos = resource_offset + ( ( head[0] << 24 ) | - ( head[1] << 16 ) | - ( head[2] << 8 ) | - head[3] ); - map_pos = resource_offset + ( ( head[4] << 24 ) | - ( head[5] << 16 ) | - ( head[6] << 8 ) | - head[7] ); - rdata_len = ( head[ 8] << 24 ) | - ( head[ 9] << 16 ) | - ( head[10] << 8 ) | - head[11]; - map_len = ( head[12] << 24 ) | - ( head[13] << 16 ) | - ( head[14] << 8 ) | - head[15]; - - if ( rdata_pos + rdata_len != map_pos || map_pos == resource_offset ) - return FT_Err_Unknown_File_Format; - - error = FT_Stream_Seek( stream, map_pos ); - if ( error ) - goto Exit; - - head2[15] = head[15] + 1; /* make it be different */ - - error = FT_Stream_Read( stream, (FT_Byte*)head2, 16 ); - if ( error ) - goto Exit; - - allzeros = 1; - allmatch = 1; - for ( i = 0; i < 16; ++i ) + error = FT_Raccess_Get_DataOffsets( library, stream, + map_offset, rdara_pos, + FT_MAKE_TAG( 'P', 'O', 'S', 'T' ), + &data_offsets, &count ); + if ( !error ) { - if ( head2[i] != 0 ) - allzeros = 0; - if ( head2[i] != head[i] ) - allmatch = 0; - } - if ( !allzeros && !allmatch ) - return FT_Err_Unknown_File_Format; - - /* If we've gotten this far then it's probably a mac resource file. */ - /* Now, does it contain any interesting resources? */ - - (void)FT_READ_LONG( junk ); /* skip handle to next resource map */ - (void)FT_READ_USHORT( junk ); /* skip file resource number */ - (void)FT_READ_USHORT( junk ); /* skip attributes */ - - if ( FT_READ_USHORT( type_list ) ) - goto Exit; - if ( type_list == -1 ) - return FT_Err_Unknown_File_Format; - - error = FT_Stream_Seek( stream, map_pos + type_list ); - if ( error ) - goto Exit; - - if ( FT_READ_USHORT( cnt ) ) - goto Exit; - - ++cnt; - for ( i = 0; i < cnt; ++i ) - { - if ( FT_READ_LONG( tag ) || - FT_READ_USHORT( subcnt ) || - FT_READ_USHORT( rpos ) ) - goto Exit; - - ++subcnt; - rpos += map_pos + type_list; - if ( tag == FT_MAKE_TAG( 'P', 'O', 'S', 'T' ) ) - return Mac_Read_POST_Resource( library, - stream, - rpos, - subcnt, - rdata_pos, - face_index, - aface ); - else if ( tag == FT_MAKE_TAG( 's', 'f', 'n', 't' ) ) - return Mac_Read_sfnt_Resource( library, - stream, - rpos, - subcnt, - rdata_pos, - face_index, - aface ); + error = Mac_Read_POST_Resource( library, stream, data_offsets, count, + face_index, aface ); + FT_FREE( data_offsets ); + return error; + } + + error = FT_Raccess_Get_DataOffsets( library, stream, + map_offset, rdara_pos, + FT_MAKE_TAG( 's', 'f', 'n', 't' ), + &data_offsets, &count ); + if ( !error ) + { + error = Mac_Read_sfnt_Resource( library, stream, data_offsets, count, + face_index, aface ); + FT_FREE( data_offsets ); } - error = FT_Err_Cannot_Open_Resource; /* this file contains no - interesting resources */ - Exit: return error; } @@ -1476,11 +1405,87 @@ } - /* Check for some macintosh formats */ + static FT_Error + load_face_in_embedded_rfork( FT_Library library, + FT_Stream stream, + FT_Long face_index, + FT_Face *aface, + const FT_Open_Args *args ) + { + +#undef FT_COMPONENT +#define FT_COMPONENT trace_raccess + + FT_Memory memory = library->memory; + FT_Error error = FT_Err_Unknown_File_Format; + int i; + + char * file_names[FT_RACCESS_N_RULES]; + FT_Long offsets[FT_RACCESS_N_RULES]; + FT_Error errors[FT_RACCESS_N_RULES]; + + FT_Open_Args args2; + FT_Stream stream2; + + + FT_Raccess_Guess( library, stream, + args->pathname, file_names, offsets, errors ); + + for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) + { + if ( errors[i] ) + { + FT_TRACE3(( "Error[%d] has occurred in rule %d\n", errors[i], i )); + continue; + } + + args2.flags = FT_OPEN_PATHNAME; + args2.pathname = file_names[i] ? file_names[i] : args->pathname; + + FT_TRACE3(( "Try rule %d: %s (offset=%d) ...", + i, args2.pathname, offsets[i] )); + + error = FT_Stream_New( library, &args2, &stream2 ); + if ( error ) + { + FT_TRACE3(( "failed\n" )); + continue; + } + + error = IsMacResource( library, stream2, offsets[i], + face_index, aface ); + FT_Stream_Close( stream2 ); + + FT_TRACE3(( "%s\n", error ? "failed": "successful" )); + + if ( !error ) + break; + } + + for (i = 0; i < FT_RACCESS_N_RULES; i++) + { + if ( file_names[i] ) + FT_FREE( file_names[i] ); + } + + /* Caller (load_mac_face) requires FT_Err_Unknown_File_Format. */ + if ( error ) + error = FT_Err_Unknown_File_Format; + + return error; + +#undef FT_COMPONENT +#define FT_COMPONENT trace_objs + + } + + + /* Check for some macintosh formats. */ /* Is this a macbinary file? If so look at the resource fork. */ /* Is this a mac dfont file? */ /* Is this an old style resource fork? (in data) */ - /* Else if we're on Mac OS/X, open the resource fork explicitly. */ + /* Else call load_face_in_embedded_rfork to try extra rules */ + /* (defined in `ftrfork.c'). */ /* */ static FT_Error load_mac_face( FT_Library library, @@ -1495,46 +1500,27 @@ error = IsMacBinary( library, stream, face_index, aface ); if ( FT_ERROR_BASE( error ) == FT_Err_Unknown_File_Format ) + { + +#undef FT_COMPONENT +#define FT_COMPONENT trace_raccess + + FT_TRACE3(( "Try as dfont: %s ...", args->pathname )); + error = IsMacResource( library, stream, 0, face_index, aface ); -#ifdef FT_MACINTOSH - /* - I know this section is within code which is normally turned off - for the Mac. It provides an alternative approach to reading the - mac resource forks on OS/X in the event that a user does not wish - to compile ftmac.c. - */ - - if ( ( FT_ERROR_BASE( error ) == FT_Err_Unknown_File_Format || - FT_ERROR_BASE( error ) == FT_Err_Invalid_Stream_Operation ) && - ( args->flags & FT_OPEN_PATHNAME ) ) - { - FT_Open_Args args2; - char* newpath; - FT_Memory memory; - FT_Stream stream2; + FT_TRACE3(( "%s\n", error ? "failed" : "successful" )); +#undef FT_COMPONENT +#define FT_COMPONENT trace_objs - memory = library->memory; - - FT_ALLOC( newpath, - ft_strlen( args->pathname ) + ft_strlen( "/rsrc" ) + 1 ); - ft_strcpy( newpath, args->pathname ); - ft_strcat( newpath, "/rsrc" ); - - args2.flags = FT_OPEN_PATHNAME; - args2.pathname = (char*)newpath; - error = ft_input_stream_new( library, &args2, &stream2 ); - if ( !error ) - { - error = IsMacResource( library, stream2, 0, face_index, aface ); - FT_Stream_Close( stream2 ); - } - FT_FREE( newpath ); } -#endif /* FT_MACINTOSH */ - + if ( ( FT_ERROR_BASE( error ) == FT_Err_Unknown_File_Format || + FT_ERROR_BASE( error ) == FT_Err_Invalid_Stream_Operation ) && + ( args->flags & FT_OPEN_PATHNAME ) ) + error = load_face_in_embedded_rfork( library, stream, + face_index, aface, args ); return error; } @@ -1559,7 +1545,7 @@ /* test for valid `library' delayed to */ - /* ft_input_stream_new() */ + /* FT_Stream_New() */ if ( !aface || !args ) return FT_Err_Invalid_Argument; @@ -1570,7 +1556,7 @@ args->stream ); /* create input stream */ - error = ft_input_stream_new( library, args, &stream ); + error = FT_Stream_New( library, args, &stream ); if ( error ) goto Exit; @@ -1603,7 +1589,7 @@ else error = FT_Err_Invalid_Handle; - ft_input_stream_free( stream, external_stream ); + FT_Stream_Free( stream, external_stream ); goto Fail; } else @@ -1648,7 +1634,7 @@ FT_ERROR_BASE( error ) != FT_Err_Invalid_Stream_Operation ) goto Fail2; -#ifndef FT_MACINTOSH +#if !defined( FT_MACINTOSH ) && defined( FT_CONFIG_OPTION_MAC_FONTS ) error = load_mac_face( library, stream, face_index, aface, args ); if ( !error ) { @@ -1657,19 +1643,19 @@ /* stream (we opened a different stream which extracted the */ /* interesting information out of this stream here. That stream */ /* will still be open and the face will point to it). */ - ft_input_stream_free( stream, external_stream ); + FT_Stream_Free( stream, external_stream ); return error; } if ( FT_ERROR_BASE( error ) != FT_Err_Unknown_File_Format ) goto Fail2; -#endif /* !FT_MACINTOSH */ +#endif /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */ /* no driver is able to handle this format */ error = FT_Err_Unknown_File_Format; Fail2: - ft_input_stream_free( stream, external_stream ); + FT_Stream_Free( stream, external_stream ); goto Fail; } @@ -1778,7 +1764,7 @@ FT_Driver_Class clazz; - /* test for valid `parameters' delayed to ft_input_stream_new() */ + /* test for valid `parameters' delayed to FT_Stream_New() */ if ( !face ) return FT_Err_Invalid_Face_Handle; @@ -1787,7 +1773,7 @@ if ( !driver ) return FT_Err_Invalid_Driver_Handle; - error = ft_input_stream_new( driver->root.library, parameters, &stream ); + error = FT_Stream_New( driver->root.library, parameters, &stream ); if ( error ) goto Exit; @@ -1800,7 +1786,7 @@ error = clazz->attach_file( face, stream ); /* close the attached stream */ - ft_input_stream_free( stream, + FT_Stream_Free( stream, (FT_Bool)( parameters->stream && ( parameters->flags & FT_OPEN_STREAM ) ) ); @@ -1958,17 +1944,17 @@ { /* Compute root ascender, descender, test height, and max_advance */ - metrics->ascender = ( FT_MulFix( face->ascender, - metrics->y_scale ) + 63 ) & -64; + metrics->ascender = FT_PIX_CEIL( FT_MulFix( face->ascender, + metrics->y_scale ) ); - metrics->descender = ( FT_MulFix( face->descender, - metrics->y_scale ) + 0 ) & -64; + metrics->descender = FT_PIX_FLOOR( FT_MulFix( face->descender, + metrics->y_scale ) ); - metrics->height = ( FT_MulFix( face->height, - metrics->y_scale ) + 32 ) & -64; + metrics->height = FT_PIX_ROUND( FT_MulFix( face->height, + metrics->y_scale ) ); - metrics->max_advance = ( FT_MulFix( face->max_advance_width, - metrics->x_scale ) + 32 ) & -64; + metrics->max_advance = FT_PIX_ROUND( FT_MulFix( face->max_advance_width, + metrics->x_scale ) ); } @@ -2014,11 +2000,20 @@ char_height = 1 * 64; /* Compute pixel sizes in 26.6 units with rounding */ - dim_x = ( ( char_width * horz_resolution + (36+32*72) ) / 72 ) & -64; - dim_y = ( ( char_height * vert_resolution + (36+32*72) ) / 72 ) & -64; + dim_x = ( char_width * horz_resolution + 36 ) / 72; + dim_y = ( char_height * vert_resolution + 36 ) / 72; - metrics->x_ppem = (FT_UShort)( dim_x >> 6 ); - metrics->y_ppem = (FT_UShort)( dim_y >> 6 ); + { + FT_UShort x_ppem = (FT_UShort)( ( dim_x + 32 ) >> 6 ); + FT_UShort y_ppem = (FT_UShort)( ( dim_y + 32 ) >> 6 ); + + + if ( x_ppem == metrics->x_ppem && y_ppem == metrics->y_ppem ) + return FT_Err_Ok; + + metrics->x_ppem = x_ppem; + metrics->y_ppem = y_ppem; + } metrics->x_scale = 0x10000L; metrics->y_scale = 0x10000L; @@ -2061,7 +2056,6 @@ metrics = &face->size->metrics; clazz = driver->clazz; - /* default processing -- this can be overridden by the driver */ if ( pixel_width == 0 ) pixel_width = pixel_height; @@ -2073,6 +2067,12 @@ if ( pixel_height < 1 ) pixel_height = 1; + /* use `>=' to avoid potention compiler warning on 16bit platforms */ + if ( pixel_width >= 0xFFFFU ) + pixel_width = 0xFFFFU; + if ( pixel_height >= 0xFFFFU ) + pixel_height = 0xFFFFU; + metrics->x_ppem = (FT_UShort)pixel_width; metrics->y_ppem = (FT_UShort)pixel_height; @@ -2134,8 +2134,8 @@ if ( kern_mode != FT_KERNING_UNFITTED ) { - akerning->x = ( akerning->x + 32 ) & -64; - akerning->y = ( akerning->y + 32 ) & -64; + akerning->x = FT_PIX_ROUND( akerning->x ); + akerning->y = FT_PIX_ROUND( akerning->y ); } } } @@ -2368,21 +2368,15 @@ if ( face && FT_HAS_GLYPH_NAMES( face ) ) { - /* now, lookup for glyph name */ - FT_Driver driver = face->driver; - FT_Module_Class* clazz = FT_MODULE_CLASS( driver ); + FT_Service_GlyphDict service; - if ( clazz->get_interface ) - { - FT_Face_GetGlyphNameIndexFunc requester; + FT_FACE_LOOKUP_SERVICE( face, + service, + GLYPH_DICT ); - - requester = (FT_Face_GetGlyphNameIndexFunc)clazz->get_interface( - FT_MODULE( driver ), "name_index" ); - if ( requester ) - result = requester( face, glyph_name ); - } + if ( service && service->name_index ) + result = service->name_index( face, glyph_name ); } return result; @@ -2408,21 +2402,15 @@ glyph_index <= (FT_UInt)face->num_glyphs && FT_HAS_GLYPH_NAMES( face ) ) { - /* now, lookup for glyph name */ - FT_Driver driver = face->driver; - FT_Module_Class* clazz = FT_MODULE_CLASS( driver ); + FT_Service_GlyphDict service; - if ( clazz->get_interface ) - { - FT_Face_GetGlyphNameFunc requester; + FT_FACE_LOOKUP_SERVICE( face, + service, + GLYPH_DICT ); - - requester = (FT_Face_GetGlyphNameFunc)clazz->get_interface( - FT_MODULE( driver ), "glyph_name" ); - if ( requester ) - error = requester( face, glyph_index, buffer, buffer_max ); - } + if ( service && service->get_name ) + error = service->get_name( face, glyph_index, buffer, buffer_max ); } return error; @@ -2440,25 +2428,19 @@ if ( !face ) goto Exit; - result = face->internal->postscript_name; if ( !result ) { - /* now, look up glyph name */ - FT_Driver driver = face->driver; - FT_Module_Class* clazz = FT_MODULE_CLASS( driver ); + FT_Service_PsFontName service; - if ( clazz->get_interface ) - { - FT_Face_GetPostscriptNameFunc requester; + FT_FACE_LOOKUP_SERVICE( face, + service, + POSTSCRIPT_FONT_NAME ); - - requester = (FT_Face_GetPostscriptNameFunc)clazz->get_interface( - FT_MODULE( driver ), "postscript_name" ); - if ( requester ) - result = requester( face ); - } + if ( service && service->get_ps_font_name ) + result = service->get_ps_font_name( face ); } + Exit: return result; } @@ -2470,21 +2452,17 @@ FT_Get_Sfnt_Table( FT_Face face, FT_Sfnt_Tag tag ) { - void* table = 0; - FT_Get_Sfnt_Table_Func func; - FT_Driver driver; + void* table = 0; + FT_Service_SFNT_Table service; - if ( !face || !FT_IS_SFNT( face ) ) - goto Exit; + if ( face && FT_IS_SFNT( face ) ) + { + FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); + if ( service != NULL ) + table = service->get_table( face, tag ); + } - driver = face->driver; - func = (FT_Get_Sfnt_Table_Func)driver->root.clazz->get_interface( - FT_MODULE( driver ), "get_sfnt" ); - if ( func ) - table = func( face, tag ); - - Exit: return table; } @@ -2498,20 +2476,39 @@ FT_Byte* buffer, FT_ULong* length ) { - SFNT_Load_Table_Func func; - FT_Driver driver; + FT_Service_SFNT_Table service; if ( !face || !FT_IS_SFNT( face ) ) return FT_Err_Invalid_Face_Handle; - driver = face->driver; - func = (SFNT_Load_Table_Func) driver->root.clazz->get_interface( - FT_MODULE( driver ), "load_sfnt" ); - if ( !func ) + FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); + if ( service == NULL ) return FT_Err_Unimplemented_Feature; - return func( face, tag, offset, buffer, length ); + return service->load_table( face, tag, offset, buffer, length ); + } + + + FT_EXPORT_DEF( FT_ULong ) + FT_Get_CMap_Language_ID( FT_CharMap charmap ) + { + FT_Service_TTCMaps service; + FT_Face face; + TT_CMapInfo cmap_info; + + + if ( !charmap || !charmap->face ) + return 0; + + face = charmap->face; + FT_FACE_FIND_SERVICE( face, service, TT_CMAP ); + if ( service == NULL ) + return 0; + if ( service->get_cmap_info( charmap, &cmap_info )) + return 0; + + return cmap_info.language; } @@ -3061,6 +3058,50 @@ } + FT_BASE_DEF( FT_Pointer ) + ft_module_get_service( FT_Module module, + const char* service_id ) + { + FT_Pointer result = NULL; + + if ( module ) + { + FT_ASSERT( module->clazz && module->clazz->get_interface ); + + /* first, look for the service in the module + */ + if ( module->clazz->get_interface ) + result = module->clazz->get_interface( module, service_id ); + + if ( result == NULL ) + { + /* we didn't find it, look in all other modules then + */ + FT_Library library = module->library; + FT_Module* cur = library->modules; + FT_Module* limit = cur + library->num_modules; + + for ( ; cur < limit; cur++ ) + { + if ( cur[0] != module ) + { + FT_ASSERT( cur[0]->clazz ); + + if ( cur[0]->clazz->get_interface ) + { + result = cur[0]->clazz->get_interface( cur[0], service_id ); + if ( result != NULL ) + break; + } + } + } + } + } + + return result; + } + + /* documentation is in ftmodule.h */ FT_EXPORT_DEF( FT_Error ) diff --git a/reactos/lib/freetype/src/base/ftoutln.c b/reactos/lib/freetype/src/base/ftoutln.c index c59043bc049..5cae931f67e 100644 --- a/reactos/lib/freetype/src/base/ftoutln.c +++ b/reactos/lib/freetype/src/base/ftoutln.c @@ -4,7 +4,7 @@ /* */ /* FreeType outline management (body). */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -26,6 +26,7 @@ #include <ft2build.h> #include FT_OUTLINE_H #include FT_INTERNAL_OBJECTS_H +#include FT_TRIGONOMETRY_H /*************************************************************************/ @@ -357,14 +358,11 @@ source->n_contours != target->n_contours ) return FT_Err_Invalid_Argument; - FT_MEM_COPY( target->points, source->points, - source->n_points * sizeof ( FT_Vector ) ); + FT_ARRAY_COPY( target->points, source->points, source->n_points ); - FT_MEM_COPY( target->tags, source->tags, - source->n_points * sizeof ( FT_Byte ) ); + FT_ARRAY_COPY( target->tags, source->tags, source->n_points ); - FT_MEM_COPY( target->contours, source->contours, - source->n_contours * sizeof ( FT_Short ) ); + FT_ARRAY_COPY( target->contours, source->contours, source->n_contours ); /* copy all flags, except the `FT_OUTLINE_OWNER' one */ is_owner = target->flags & FT_OUTLINE_OWNER; @@ -655,4 +653,143 @@ } + typedef struct FT_OrientationExtremumRec_ + { + FT_Int index; + FT_Long pos; + FT_Int first; + FT_Int last; + + } FT_OrientationExtremumRec; + + + static FT_Orientation + ft_orientation_extremum_compute( FT_OrientationExtremumRec* extremum, + FT_Outline* outline ) + { + FT_Vector *point, *first, *last, *prev, *next; + FT_Vector* points = outline->points; + FT_Angle angle_in, angle_out; + + + /* compute the previous and next points in the same contour */ + point = points + extremum->index; + first = points + extremum->first; + last = points + extremum->last; + + prev = point; + next = point; + + do + { + prev = ( prev == first ) ? last : prev - 1; + if ( prev == point ) + return FT_ORIENTATION_TRUETYPE; /* degenerate case */ + + } while ( prev->x != point->x || prev->y != point->y ); + + do + { + next = ( next == last ) ? first : next + 1; + if ( next == point ) + return FT_ORIENTATION_TRUETYPE; /* shouldn't happen */ + + } while ( next->x != point->x || next->y != point->y ); + + /* now compute the orientation of the `out' vector relative */ + /* to the `in' vector. */ + angle_in = FT_Atan2( point->x - prev->x, point->y - prev->y ); + angle_out = FT_Atan2( next->x - point->x, next->y - point->y ); + + return ( FT_Angle_Diff( angle_in, angle_out ) >= 0 ) + ? FT_ORIENTATION_TRUETYPE + : FT_ORIENTATION_POSTSCRIPT; + } + + + FT_EXPORT_DEF( FT_Orientation ) + FT_Outline_Get_Orientation( FT_Outline* outline ) + { + FT_Orientation result = FT_ORIENTATION_TRUETYPE; + + + if ( outline && outline->n_points > 0 ) + { + FT_OrientationExtremumRec xmin, ymin, xmax, ymax; + FT_Int n; + FT_Int first, last; + FT_Vector* points = outline->points; + + + xmin.pos = ymin.pos = +32768L; + xmax.pos = ymax.pos = -32768L; + + xmin.index = ymin.index = xmax.index = ymax.index = -1; + + first = 0; + for ( n = 0; n < outline->n_contours; n++, first = last + 1 ) + { + last = outline->contours[n]; + + /* skip single-point contours; these are degenerated cases */ + if ( last > first + 1 ) + { + FT_Int i; + + + for ( i = first; i < last; i++ ) + { + FT_Pos x = points[i].x; + FT_Pos y = points[i].y; + + + if ( x < xmin.pos ) + { + xmin.pos = x; + xmin.index = i; + xmin.first = first; + xmin.last = last; + } + if ( x > xmax.pos ) + { + xmax.pos = x; + xmax.index = i; + xmax.first = first; + xmax.last = last; + } + if ( y < ymin.pos ) + { + ymin.pos = y; + ymin.index = i; + ymin.first = first; + ymin.last = last; + } + if ( y > ymax.pos ) + { + ymax.pos = y; + ymax.index = i; + ymax.first = first; + ymax.last = last; + } + } + } + + if ( xmin.index >= 0 ) + result = ft_orientation_extremum_compute( &xmin, outline ); + + else if ( xmax.index >= 0 ) + result = ft_orientation_extremum_compute( &xmax, outline ); + + else if ( ymin.index >= 0 ) + result = ft_orientation_extremum_compute( &ymin, outline ); + + else if ( ymax.index >= 0 ) + result = ft_orientation_extremum_compute( &ymax, outline ); + } + } + + return result; + } + + /* END */ diff --git a/reactos/lib/freetype/src/base/ftpfr.c b/reactos/lib/freetype/src/base/ftpfr.c index d9594cb788a..fb959e37fc9 100644 --- a/reactos/lib/freetype/src/base/ftpfr.c +++ b/reactos/lib/freetype/src/base/ftpfr.c @@ -16,34 +16,20 @@ /***************************************************************************/ #include <ft2build.h> -#include FT_INTERNAL_PFR_H #include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_PFR_H /* check the format */ - static FT_Error - ft_pfr_check( FT_Face face, - FT_PFR_Service *aservice ) + static FT_Service_PfrMetrics + ft_pfr_check( FT_Face face ) { - FT_Error error = FT_Err_Bad_Argument; + FT_Service_PfrMetrics service; - if ( face && face->driver ) - { - FT_Module module = (FT_Module) face->driver; - const char* name = module->clazz->module_name; + FT_FACE_LOOKUP_SERVICE( face, service, PFR_METRICS ); - - if ( name[0] == 'p' && - name[1] == 'f' && - name[2] == 'r' && - name[4] == 0 ) - { - *aservice = (FT_PFR_Service) module->clazz->module_interface; - error = 0; - } - } - return error; + return service; } @@ -54,12 +40,12 @@ FT_Fixed *ametrics_x_scale, FT_Fixed *ametrics_y_scale ) { - FT_Error error; - FT_PFR_Service service; + FT_Error error = FT_Err_Ok; + FT_Service_PfrMetrics service; - error = ft_pfr_check( face, &service ); - if ( !error ) + service = ft_pfr_check( face ); + if ( service ) { error = service->get_metrics( face, aoutline_resolution, @@ -67,6 +53,27 @@ ametrics_x_scale, ametrics_y_scale ); } + else if ( face ) + { + FT_Fixed x_scale, y_scale; + + + /* this is not a PFR font */ + *aoutline_resolution = face->units_per_EM; + *ametrics_resolution = face->units_per_EM; + + x_scale = y_scale = 0x10000L; + if ( face->size ) + { + x_scale = face->size->metrics.x_scale; + y_scale = face->size->metrics.y_scale; + } + *ametrics_x_scale = x_scale; + *ametrics_y_scale = y_scale; + } + else + error = FT_Err_Invalid_Argument; + return error; } @@ -77,15 +84,19 @@ FT_UInt right, FT_Vector *avector ) { - FT_Error error; - FT_PFR_Service service; + FT_Error error; + FT_Service_PfrMetrics service; - error = ft_pfr_check( face, &service ); - if ( !error ) - { + service = ft_pfr_check( face ); + if ( service ) error = service->get_kerning( face, left, right, avector ); - } + else if ( face ) + error = FT_Get_Kerning( face, left, right, + FT_KERNING_UNSCALED, avector ); + else + error = FT_Err_Invalid_Argument; + return error; } @@ -95,15 +106,19 @@ FT_UInt gindex, FT_Pos *aadvance ) { - FT_Error error; - FT_PFR_Service service; + FT_Error error; + FT_Service_PfrMetrics service; - error = ft_pfr_check( face, &service ); - if ( !error ) + service = ft_pfr_check( face ); + if ( service ) { error = service->get_advance( face, gindex, aadvance ); } + else + /* XXX: TODO: PROVIDE ADVANCE-LOADING METHOD TO ALL FONT DRIVERS */ + error = FT_Err_Invalid_Argument; + return error; } diff --git a/reactos/lib/freetype/src/base/ftrfork.c b/reactos/lib/freetype/src/base/ftrfork.c new file mode 100644 index 00000000000..cf790ccc00a --- /dev/null +++ b/reactos/lib/freetype/src/base/ftrfork.c @@ -0,0 +1,717 @@ +/***************************************************************************/ +/* */ +/* ftrfork.c */ +/* */ +/* Embedded resource forks accessor (body). */ +/* */ +/* Copyright 2004 by */ +/* Masatake YAMATO and Redhat K.K. */ +/* */ +/* FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are */ +/* derived from ftobjs.c. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* Development of the code in this file is support of */ +/* Information-technology Promotion Agency, Japan. */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_RFORK_H + + +#undef FT_COMPONENT +#define FT_COMPONENT trace_raccess + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** Resource fork directory access ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + FT_BASE_DEF( FT_Error ) + FT_Raccess_Get_HeaderInfo( FT_Library library, + FT_Stream stream, + FT_Long rfork_offset, + FT_Long *map_offset, + FT_Long *rdata_pos ) + { + FT_Error error; + unsigned char head[16], head2[16]; + FT_Long map_pos, rdata_len; + int allzeros, allmatch, i; + FT_Long type_list; + + FT_UNUSED( library ); + + + error = FT_Stream_Seek( stream, rfork_offset ); + if ( error ) + return error; + + error = FT_Stream_Read( stream, (FT_Byte *)head, 16 ); + if ( error ) + return error; + + *rdata_pos = rfork_offset + ( ( head[0] << 24 ) | + ( head[1] << 16 ) | + ( head[2] << 8 ) | + head[3] ); + map_pos = rfork_offset + ( ( head[4] << 24 ) | + ( head[5] << 16 ) | + ( head[6] << 8 ) | + head[7] ); + rdata_len = ( head[ 8] << 24 ) | + ( head[ 9] << 16 ) | + ( head[10] << 8 ) | + head[11]; + + /* map_len = head[12] .. head[15] */ + + if ( *rdata_pos + rdata_len != map_pos || map_pos == rfork_offset ) + return FT_Err_Unknown_File_Format; + + error = FT_Stream_Seek( stream, map_pos ); + if ( error ) + return error; + + head2[15] = (FT_Byte)( head[15] + 1 ); /* make it be different */ + + error = FT_Stream_Read( stream, (FT_Byte*)head2, 16 ); + if ( error ) + return error; + + allzeros = 1; + allmatch = 1; + for ( i = 0; i < 16; ++i ) + { + if ( head2[i] != 0 ) + allzeros = 0; + if ( head2[i] != head[i] ) + allmatch = 0; + } + if ( !allzeros && !allmatch ) + return FT_Err_Unknown_File_Format; + + /* If we have reached this point then it is probably a mac resource */ + /* file. Now, does it contain any interesting resources? */ + /* Skip handle to next resource map, the file resource number, and */ + /* attributes. */ + (void)FT_STREAM_SKIP( 4 /* skip handle to next resource map */ + + 2 /* skip file resource number */ + + 2 ); /* skip attributes */ + + if ( FT_READ_USHORT( type_list ) ) + return error; + if ( type_list == -1 ) + return FT_Err_Unknown_File_Format; + + error = FT_Stream_Seek( stream, map_pos + type_list ); + if ( error ) + return error; + + *map_offset = map_pos + type_list; + return FT_Err_Ok; + } + + + FT_BASE_DEF( FT_Error ) + FT_Raccess_Get_DataOffsets( FT_Library library, + FT_Stream stream, + FT_Long map_offset, + FT_Long rdata_pos, + FT_Long tag, + FT_Long **offsets, + FT_Long *count ) + { + FT_Error error; + int i, j, cnt, subcnt; + FT_Long tag_internal, rpos; + FT_Memory memory = library->memory; + FT_Long temp; + FT_Long *offsets_internal; + + + error = FT_Stream_Seek( stream, map_offset ); + if ( error ) + return error; + + if ( FT_READ_USHORT( cnt ) ) + return error; + cnt++; + + for ( i = 0; i < cnt; ++i ) + { + if ( FT_READ_LONG( tag_internal ) || + FT_READ_USHORT( subcnt ) || + FT_READ_USHORT( rpos ) ) + return error; + + FT_TRACE2(( "Resource tags: %c%c%c%c\n", + (char)( 0xff & ( tag_internal >> 24 ) ), + (char)( 0xff & ( tag_internal >> 16 ) ), + (char)( 0xff & ( tag_internal >> 8 ) ), + (char)( 0xff & ( tag_internal >> 0 ) ) )); + + if ( tag_internal == tag ) + { + *count = subcnt + 1; + rpos += map_offset; + + error = FT_Stream_Seek( stream, rpos ); + if ( error ) + return error; + + if ( FT_ALLOC( offsets_internal, *count * sizeof( FT_Long ) ) ) + return error; + + for ( j = 0; j < *count; ++j ) + { + (void)FT_STREAM_SKIP( 2 ); /* resource id */ + (void)FT_STREAM_SKIP( 2 ); /* rsource name */ + + if ( FT_READ_LONG( temp ) ) + { + FT_FREE( offsets_internal ); + return error; + } + + offsets_internal[j] = rdata_pos + ( temp & 0xFFFFFFL ); + + (void)FT_STREAM_SKIP( 4 ); /* mbz */ + } + + *offsets = offsets_internal; + + return FT_Err_Ok; + } + } + + return FT_Err_Cannot_Open_Resource; + } + + +#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** Guessing functions ****/ + /**** ****/ + /**** When you add a new guessing function, ****/ + /**** update FT_RACCESS_N_RULES in ftrfork.h. ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + typedef FT_Error + (*raccess_guess_func)( FT_Library library, + FT_Stream stream, + char * base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + + static FT_Error + raccess_guess_apple_double( FT_Library library, + FT_Stream stream, + char * base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_apple_single( FT_Library library, + FT_Stream stream, + char * base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_darwin_ufs_export( FT_Library library, + FT_Stream stream, + char * base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_darwin_hfsplus( FT_Library library, + FT_Stream stream, + char * base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_vfat( FT_Library library, + FT_Stream stream, + char * base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_linux_cap( FT_Library library, + FT_Stream stream, + char * base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_linux_double( FT_Library library, + FT_Stream stream, + char * base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_linux_netatalk( FT_Library library, + FT_Stream stream, + char * base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + + /*************************************************************************/ + /**** ****/ + /**** Helper functions ****/ + /**** ****/ + /*************************************************************************/ + + static FT_Error + raccess_guess_apple_generic( FT_Library library, + FT_Stream stream, + char * base_file_name, + FT_Int32 magic, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_linux_double_from_file_name( FT_Library library, + char * file_name, + FT_Long *result_offset ); + + static char * + raccess_make_file_name( FT_Memory memory, + const char *original_name, + const char *insertion ); + + + FT_BASE_DEF( void ) + FT_Raccess_Guess( FT_Library library, + FT_Stream stream, + char* base_name, + char **new_names, + FT_Long *offsets, + FT_Error *errors ) + { + FT_Long i; + + + raccess_guess_func funcs[FT_RACCESS_N_RULES] = + { + raccess_guess_apple_double, + raccess_guess_apple_single, + raccess_guess_darwin_ufs_export, + raccess_guess_darwin_hfsplus, + raccess_guess_vfat, + raccess_guess_linux_cap, + raccess_guess_linux_double, + raccess_guess_linux_netatalk, + }; + + for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) + { + new_names[i] = NULL; + errors[i] = FT_Stream_Seek( stream, 0 ); + if ( errors[i] ) + continue ; + + errors[i] = (funcs[i])( library, stream, base_name, + &(new_names[i]), &(offsets[i]) ); + } + + return; + } + + + static FT_Error + raccess_guess_apple_double( FT_Library library, + FT_Stream stream, + char * base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + FT_Int32 magic = ( 0x00 << 24 | 0x05 << 16 | 0x16 << 8 | 0x07 ); + + + *result_file_name = NULL; + return raccess_guess_apple_generic( library, stream, base_file_name, + magic, result_offset ); + } + + + static FT_Error + raccess_guess_apple_single( FT_Library library, + FT_Stream stream, + char * base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + FT_Int32 magic = (0x00 << 24 | 0x05 << 16 | 0x16 << 8 | 0x00); + + + *result_file_name = NULL; + return raccess_guess_apple_generic( library, stream, base_file_name, + magic, result_offset ); + } + + + static FT_Error + raccess_guess_darwin_ufs_export( FT_Library library, + FT_Stream stream, + char * base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Error error; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + newpath = raccess_make_file_name( memory, base_file_name, "._" ); + if ( !newpath ) + return FT_Err_Out_Of_Memory; + + error = raccess_guess_linux_double_from_file_name( library, newpath, + result_offset ); + if ( !error ) + *result_file_name = newpath; + else + FT_FREE( newpath ); + + return error; + } + + + static FT_Error + raccess_guess_darwin_hfsplus( FT_Library library, + FT_Stream stream, + char * base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + /* + Only meaningful on systems with hfs+ drivers (or Macs). + */ + FT_Error error; + char* newpath; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + + if ( FT_ALLOC( newpath, + ft_strlen( base_file_name ) + ft_strlen( "/rsrc" ) + 1 ) ) + return error; + + ft_strcpy( newpath, base_file_name ); + ft_strcat( newpath, "/rsrc" ); + *result_file_name = newpath; + *result_offset = 0; + return FT_Err_Ok; + } + + + static FT_Error + raccess_guess_vfat( FT_Library library, + FT_Stream stream, + char * base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + + newpath = raccess_make_file_name( memory, base_file_name, + "resource.frk/" ); + if ( !newpath ) + return FT_Err_Out_Of_Memory; + + *result_file_name = newpath; + *result_offset = 0; + + return FT_Err_Ok; + } + + + static FT_Error + raccess_guess_linux_cap( FT_Library library, + FT_Stream stream, + char * base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + + newpath = raccess_make_file_name( memory, base_file_name, ".resource/" ); + if ( !newpath ) + return FT_Err_Out_Of_Memory; + + *result_file_name = newpath; + *result_offset = 0; + + return FT_Err_Ok; + } + + + static FT_Error + raccess_guess_linux_double( FT_Library library, + FT_Stream stream, + char * base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Error error; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + + newpath = raccess_make_file_name( memory, base_file_name, "%" ); + if ( !newpath ) + return FT_Err_Out_Of_Memory; + + error = raccess_guess_linux_double_from_file_name( library, newpath, + result_offset ); + if ( !error ) + *result_file_name = newpath; + else + FT_FREE( newpath ); + + return error; + } + + + static FT_Error + raccess_guess_linux_netatalk( FT_Library library, + FT_Stream stream, + char * base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Error error; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + + newpath = raccess_make_file_name( memory, base_file_name, + ".AppleDouble/" ); + if ( !newpath ) + return FT_Err_Out_Of_Memory; + + error = raccess_guess_linux_double_from_file_name( library, newpath, + result_offset ); + if ( !error ) + *result_file_name = newpath; + else + FT_FREE( newpath ); + + return error; + } + + + static FT_Error + raccess_guess_apple_generic( FT_Library library, + FT_Stream stream, + char * base_file_name, + FT_Int32 magic, + FT_Long *result_offset ) + { + FT_Int32 magic_from_stream; + FT_Error error; + FT_Int32 version_number; + FT_UShort n_of_entries; + + int i; + FT_UInt32 entry_id, entry_offset, entry_length; + + const FT_UInt32 resource_fork_entry_id = 0x2; + + FT_UNUSED( library ); + FT_UNUSED( base_file_name ); + + + if ( FT_READ_LONG ( magic_from_stream ) ) + return error; + if ( magic_from_stream != magic ) + return FT_Err_Unknown_File_Format; + + if ( FT_READ_LONG( version_number ) ) + return error; + + /* filler */ + error = FT_Stream_Skip( stream, 16 ); + if ( error ) + return error; + + if ( FT_READ_USHORT( n_of_entries ) ) + return error; + if ( n_of_entries == 0 ) + return FT_Err_Unknown_File_Format; + + for ( i = 0; i < n_of_entries; i++ ) + { + if ( FT_READ_LONG( entry_id ) ) + return error; + if ( entry_id == resource_fork_entry_id ) + { + if ( FT_READ_LONG( entry_offset ) || + FT_READ_LONG( entry_length ) ) + continue; + *result_offset = entry_offset; + + return FT_Err_Ok; + } + else + FT_Stream_Skip( stream, 4 + 4 ); /* offset + length */ + } + + return FT_Err_Unknown_File_Format; + } + + + static FT_Error + raccess_guess_linux_double_from_file_name( FT_Library library, + char * file_name, + FT_Long *result_offset ) + { + FT_Memory memory; + FT_Open_Args args2; + FT_Stream stream2; + char * nouse = NULL; + FT_Error error; + + + memory = library->memory; + + args2.flags = FT_OPEN_PATHNAME; + args2.pathname = file_name; + error = FT_Stream_New( library, &args2, &stream2 ); + if ( error ) + return error; + + error = raccess_guess_apple_double( library, stream2, file_name, + &nouse, result_offset ); + + FT_Stream_Close( stream2 ); + + return error; + } + + + static char* + raccess_make_file_name( FT_Memory memory, + const char *original_name, + const char *insertion ) + { + char* new_name; + char* tmp; + const char* slash; + unsigned new_length; + FT_ULong error; + + new_length = ft_strlen( original_name ) + ft_strlen( insertion ); + if ( FT_ALLOC( new_name, new_length + 1 ) ) + return NULL; + + tmp = ft_strrchr( original_name, '/' ); + if ( tmp ) + { + ft_strncpy( new_name, original_name, tmp - original_name + 1 ); + new_name[tmp - original_name + 1] = '\0'; + slash = tmp + 1; + } + else + { + slash = original_name; + new_name[0] = '\0'; + } + + ft_strcat( new_name, insertion ); + ft_strcat( new_name, slash ); + + return new_name; + } + + +#else /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */ + + + /*************************************************************************/ + /* Dummy function; just sets errors */ + /*************************************************************************/ + + FT_BASE_DEF( void ) + FT_Raccess_Guess( FT_Library library, + FT_Stream stream, + char* base_name, + char **new_names, + FT_Long *offsets, + FT_Error *errors ) + { + int i; + + + for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) + { + new_names[i] = NULL; + offsets[i] = 0; + errors[i] = FT_Err_Unimplemented_Feature; + } + } + + +#endif /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */ + + +/* END */ diff --git a/reactos/lib/freetype/src/base/ftstream.c b/reactos/lib/freetype/src/base/ftstream.c index 60e7856810e..7ff1e90532b 100644 --- a/reactos/lib/freetype/src/base/ftstream.c +++ b/reactos/lib/freetype/src/base/ftstream.c @@ -4,7 +4,7 @@ /* */ /* I/O stream support (body). */ /* */ -/* Copyright 2000-2001, 2002 by */ +/* Copyright 2000-2001, 2002, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -770,15 +770,15 @@ p = (FT_Byte*)structure + fields->offset; switch ( fields->size ) { - case 1: + case (8 / FT_CHAR_BIT): *(FT_Byte*)p = (FT_Byte)value; break; - case 2: + case (16 / FT_CHAR_BIT): *(FT_UShort*)p = (FT_UShort)value; break; - case 4: + case (32 / FT_CHAR_BIT): *(FT_UInt32*)p = (FT_UInt32)value; break; diff --git a/reactos/lib/freetype/src/base/ftstroke.c b/reactos/lib/freetype/src/base/ftstroke.c index d6d5be3211e..10aad2db818 100644 --- a/reactos/lib/freetype/src/base/ftstroke.c +++ b/reactos/lib/freetype/src/base/ftstroke.c @@ -4,7 +4,7 @@ /* */ /* FreeType path stroker (body). */ /* */ -/* Copyright 2002, 2003 by */ +/* Copyright 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -19,8 +19,31 @@ #include <ft2build.h> #include FT_STROKER_H #include FT_TRIGONOMETRY_H +#include FT_OUTLINE_H #include FT_INTERNAL_MEMORY_H #include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H + + FT_EXPORT_DEF( FT_StrokerBorder ) + FT_Outline_GetInsideBorder( FT_Outline* outline ) + { + FT_Orientation o = FT_Outline_Get_Orientation( outline ); + + + return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_RIGHT + : FT_STROKER_BORDER_LEFT ; + } + + + FT_EXPORT_DEF( FT_StrokerBorder ) + FT_Outline_GetOutsideBorder( FT_Outline* outline ) + { + FT_Orientation o = FT_Outline_Get_Orientation( outline ); + + + return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_LEFT + : FT_STROKER_BORDER_RIGHT ; + } /***************************************************************************/ @@ -221,6 +244,7 @@ FT_Bool movable; FT_Int start; /* index of current sub-path start point */ FT_Memory memory; + FT_Bool valid; } FT_StrokeBorderRec, *FT_StrokeBorder; @@ -468,6 +492,7 @@ border->num_points = 0; border->max_points = 0; border->start = -1; + border->valid = 0; } @@ -476,6 +501,7 @@ { border->num_points = 0; border->start = -1; + border->valid = 0; } @@ -491,6 +517,7 @@ border->num_points = 0; border->max_points = 0; border->start = -1; + border->valid = 0; } @@ -520,7 +547,7 @@ } else if ( in_contour == 0 ) goto Fail; - + if ( tags[0] & FT_STROKE_TAG_END ) { if ( in_contour == 0 ) @@ -534,6 +561,8 @@ if ( in_contour != 0 ) goto Fail; + border->valid = 1; + Exit: *anum_points = num_points; *anum_contours = num_contours; @@ -551,9 +580,9 @@ FT_Outline* outline ) { /* copy point locations */ - FT_MEM_COPY( outline->points + outline->n_points, - border->points, - border->num_points * sizeof ( FT_Vector ) ); + FT_ARRAY_COPY( outline->points + outline->n_points, + border->points, + border->num_points ); /* copy tags */ { @@ -661,10 +690,18 @@ stroker->line_join = line_join; stroker->miter_limit = miter_limit; - stroker->valid = 0; + FT_Stroker_Rewind( stroker ); + } - ft_stroke_border_reset( &stroker->borders[0] ); - ft_stroke_border_reset( &stroker->borders[1] ); + + FT_EXPORT_DEF( void ) + FT_Stroker_Rewind( FT_Stroker stroker ) + { + if ( stroker ) + { + ft_stroke_border_reset( &stroker->borders[0] ); + ft_stroke_border_reset( &stroker->borders[1] ); + } } @@ -1347,7 +1384,6 @@ { FT_Error error = 0; - if ( stroker->subpath_open ) { FT_StrokeBorder right = stroker->borders; @@ -1380,6 +1416,14 @@ FT_Angle turn; FT_Int inside_side; + /* close the path if needed */ + if ( stroker->center.x != stroker->subpath_start.x || + stroker->center.y != stroker->subpath_start.y ) + { + error = FT_Stroker_LineTo( stroker, &stroker->subpath_start ); + if ( error ) + goto Exit; + } /* process the corner */ stroker->angle_out = stroker->subpath_angle; @@ -1408,14 +1452,9 @@ goto Exit; } - /* we will first end our two subpaths */ + /* then end our two subpaths */ ft_stroke_border_close( stroker->borders + 0 ); ft_stroke_border_close( stroker->borders + 1 ); - - /* now, add the reversed left subpath to "right" */ - error = ft_stroker_add_reverse_left( stroker, 0 ); - if ( error ) - goto Exit; } Exit: @@ -1423,6 +1462,35 @@ } + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_GetBorderCounts( FT_Stroker stroker, + FT_StrokerBorder border, + FT_UInt *anum_points, + FT_UInt *anum_contours ) + { + FT_UInt num_points = 0, num_contours = 0; + FT_Error error; + + + if ( !stroker || border > 1 ) + { + error = FT_Err_Invalid_Argument; + goto Exit; + } + + error = ft_stroke_border_get_counts( stroker->borders + border, + &num_points, &num_contours ); + Exit: + if ( anum_points ) + *anum_points = num_points; + + if ( anum_contours ) + *anum_contours = num_contours; + + return error; + } + + FT_EXPORT_DEF( FT_Error ) FT_Stroker_GetCounts( FT_Stroker stroker, FT_UInt *anum_points, @@ -1446,8 +1514,6 @@ num_points = count1 + count3; num_contours = count2 + count4; - stroker->valid = 1; - Exit: *anum_points = num_points; *anum_contours = num_contours; @@ -1455,15 +1521,29 @@ } + FT_EXPORT_DEF( void ) + FT_Stroker_ExportBorder( FT_Stroker stroker, + FT_StrokerBorder border, + FT_Outline* outline ) + { + if ( border == FT_STROKER_BORDER_LEFT || + border == FT_STROKER_BORDER_RIGHT ) + { + FT_StrokeBorder sborder = & stroker->borders[border]; + + + if ( sborder->valid ) + ft_stroke_border_export( sborder, outline ); + } + } + + FT_EXPORT_DEF( void ) FT_Stroker_Export( FT_Stroker stroker, FT_Outline* outline ) { - if ( stroker->valid ) - { - ft_stroke_border_export( stroker->borders + 0, outline ); - ft_stroke_border_export( stroker->borders + 1, outline ); - } + FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_LEFT, outline ); + FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_RIGHT, outline ); } @@ -1494,6 +1574,8 @@ if ( !outline || !stroker ) return FT_Err_Invalid_Argument; + FT_Stroker_Rewind( stroker ); + first = 0; for ( n = 0; n < outline->n_contours; n++ ) @@ -1664,4 +1746,161 @@ } + extern const FT_Glyph_Class ft_outline_glyph_class; + + + FT_EXPORT_DEF( FT_Error ) + FT_Glyph_Stroke( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool destroy ) + { + FT_Error error = FT_Err_Invalid_Argument; + FT_Glyph glyph = NULL; + + + if ( pglyph == NULL ) + goto Exit; + + glyph = *pglyph; + if ( glyph == NULL || glyph->clazz != &ft_outline_glyph_class ) + goto Exit; + + { + FT_Glyph copy; + + + error = FT_Glyph_Copy( glyph, © ); + if ( error ) + goto Exit; + + glyph = copy; + } + + { + FT_OutlineGlyph oglyph = (FT_OutlineGlyph) glyph; + FT_Outline* outline = &oglyph->outline; + FT_UInt num_points, num_contours; + + + error = FT_Stroker_ParseOutline( stroker, outline, 0 ); + if ( error ) + goto Fail; + + (void)FT_Stroker_GetCounts( stroker, &num_points, &num_contours ); + + FT_Outline_Done( glyph->library, outline ); + + error = FT_Outline_New( glyph->library, + num_points, num_contours, outline ); + if ( error ) + goto Fail; + + outline->n_points = 0; + outline->n_contours = 0; + + FT_Stroker_Export( stroker, outline ); + } + + if ( destroy ) + FT_Done_Glyph( *pglyph ); + + *pglyph = glyph; + goto Exit; + + Fail: + FT_Done_Glyph( glyph ); + glyph = NULL; + + if ( !destroy ) + *pglyph = NULL; + + Exit: + return error; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Glyph_StrokeBorder( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool inside, + FT_Bool destroy ) + { + FT_Error error = FT_Err_Invalid_Argument; + FT_Glyph glyph = NULL; + + + if ( pglyph == NULL ) + goto Exit; + + glyph = *pglyph; + if ( glyph == NULL || glyph->clazz != &ft_outline_glyph_class ) + goto Exit; + + { + FT_Glyph copy; + + + error = FT_Glyph_Copy( glyph, © ); + if ( error ) + goto Exit; + + glyph = copy; + } + + { + FT_OutlineGlyph oglyph = (FT_OutlineGlyph) glyph; + FT_StrokerBorder border; + FT_Outline* outline = &oglyph->outline; + FT_UInt num_points, num_contours; + + + border = FT_Outline_GetOutsideBorder( outline ); + if ( inside ) + { + if ( border == FT_STROKER_BORDER_LEFT ) + border = FT_STROKER_BORDER_RIGHT; + else + border = FT_STROKER_BORDER_LEFT; + } + + error = FT_Stroker_ParseOutline( stroker, outline, 0 ); + if ( error ) + goto Fail; + + (void)FT_Stroker_GetBorderCounts( stroker, border, + &num_points, &num_contours ); + + FT_Outline_Done( glyph->library, outline ); + + error = FT_Outline_New( glyph->library, + num_points, + num_contours, + outline ); + if ( error ) + goto Fail; + + outline->n_points = 0; + outline->n_contours = 0; + + FT_Stroker_ExportBorder( stroker, border, outline ); + } + + if ( destroy ) + FT_Done_Glyph( *pglyph ); + + *pglyph = glyph; + goto Exit; + + Fail: + FT_Done_Glyph( glyph ); + glyph = NULL; + + if ( !destroy ) + *pglyph = NULL; + + Exit: + return error; + } + + /* END */ diff --git a/reactos/lib/freetype/src/base/ftsynth.c b/reactos/lib/freetype/src/base/ftsynth.c index 72979faae57..cee36822fd2 100644 --- a/reactos/lib/freetype/src/base/ftsynth.c +++ b/reactos/lib/freetype/src/base/ftsynth.c @@ -4,7 +4,7 @@ /* */ /* FreeType synthesizing code for emboldening and slanting (body). */ /* */ -/* Copyright 2000-2001, 2002 by */ +/* Copyright 2000-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -279,7 +279,8 @@ first = last + 1; } - slot->metrics.horiAdvance = ( slot->metrics.horiAdvance + distance*4 ) & -64; + slot->metrics.horiAdvance = + ( slot->metrics.horiAdvance + distance*4 ) & ~63; } diff --git a/reactos/lib/freetype/src/base/fttrigon.c b/reactos/lib/freetype/src/base/fttrigon.c index 82cd3b246fb..5347dd852a3 100644 --- a/reactos/lib/freetype/src/base/fttrigon.c +++ b/reactos/lib/freetype/src/base/fttrigon.c @@ -17,6 +17,7 @@ #include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H #include FT_TRIGONOMETRY_H @@ -271,9 +272,9 @@ /* round theta */ if ( theta >= 0 ) - theta = ( theta + 16 ) & -32; + theta = FT_PAD_ROUND( theta, 32 ); else - theta = - (( -theta + 16 ) & -32); + theta = - FT_PAD_ROUND( -theta, 32 ); vec->x = x; vec->y = theta; diff --git a/reactos/lib/freetype/src/base/fttype1.c b/reactos/lib/freetype/src/base/fttype1.c index d8b188647d7..553b84f56f8 100644 --- a/reactos/lib/freetype/src/base/fttype1.c +++ b/reactos/lib/freetype/src/base/fttype1.c @@ -4,7 +4,7 @@ /* */ /* FreeType utility file for PS names support (body). */ /* */ -/* Copyright 2002 by */ +/* Copyright 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -17,9 +17,9 @@ #include <ft2build.h> -#include FT_INTERNAL_TYPE1_TYPES_H -#include FT_INTERNAL_TYPE42_TYPES_H #include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_SERVICE_H +#include FT_SERVICE_POSTSCRIPT_INFO_H /* documentation is in t1tables.h */ @@ -28,56 +28,39 @@ FT_Get_PS_Font_Info( FT_Face face, PS_FontInfoRec* afont_info ) { - PS_FontInfo font_info = NULL; - FT_Error error = FT_Err_Invalid_Argument; - const char* driver_name; + FT_Error error = FT_Err_Invalid_Argument; - if ( face && face->driver && face->driver->root.clazz ) + if ( face ) { - driver_name = face->driver->root.clazz->module_name; - if ( ft_strcmp( driver_name, "type1" ) == 0 ) - font_info = &((T1_Face)face)->type1.font_info; - else if ( ft_strcmp( driver_name, "t1cid" ) == 0 ) - font_info = &((CID_Face)face)->cid.font_info; - else if ( ft_strcmp( driver_name, "type42" ) == 0 ) - font_info = &((T42_Face)face)->type1.font_info; - } - if ( font_info != NULL ) - { - *afont_info = *font_info; - error = FT_Err_Ok; + FT_Service_PsInfo service = NULL; + + + FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); + + if ( service && service->ps_get_font_info ) + error = service->ps_get_font_info( face, afont_info ); } return error; } - /* XXX: Bad hack, but I didn't want to change several drivers here. */ - /* documentation is in t1tables.h */ FT_EXPORT_DEF( FT_Int ) FT_Has_PS_Glyph_Names( FT_Face face ) { - FT_Int result = 0; - const char* driver_name; + FT_Int result = 0; + FT_Service_PsInfo service = NULL; - if ( face && face->driver && face->driver->root.clazz ) + if ( face ) { - /* Currently, only the type1, type42, and cff drivers provide */ - /* reliable glyph names... */ + FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); - /* We could probably hack the TrueType driver to recognize */ - /* certain cases where the glyph names are most certainly */ - /* correct (e.g. using a 20 or 22 format `post' table), but */ - /* this will probably happen later... */ - - driver_name = face->driver->root.clazz->module_name; - result = ( ft_strcmp( driver_name, "type1" ) == 0 || - ft_strcmp( driver_name, "type42" ) == 0 || - ft_strcmp( driver_name, "cff" ) == 0 ); + if ( service && service->ps_has_glyph_names ) + result = service->ps_has_glyph_names( face ); } return result; diff --git a/reactos/lib/freetype/src/base/ftwinfnt.c b/reactos/lib/freetype/src/base/ftwinfnt.c index 2cbe343d1c7..46f618c5182 100644 --- a/reactos/lib/freetype/src/base/ftwinfnt.c +++ b/reactos/lib/freetype/src/base/ftwinfnt.c @@ -18,38 +18,30 @@ #include <ft2build.h> #include FT_WINFONTS_H -#include FT_INTERNAL_FNT_TYPES_H #include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_WINFNT_H FT_EXPORT_DEF( FT_Error ) FT_Get_WinFNT_Header( FT_Face face, FT_WinFNT_HeaderRec *header ) { - FT_Error error; + FT_Service_WinFnt service; + FT_Error error; error = FT_Err_Invalid_Argument; - if ( face != NULL && face->driver != NULL ) + if ( face != NULL ) { - FT_Module driver = (FT_Module) face->driver; + FT_FACE_LOOKUP_SERVICE( face, service, WINFNT ); - - if ( driver->clazz && driver->clazz->module_name && - ft_strcmp( driver->clazz->module_name, "winfonts" ) == 0 ) + if ( service != NULL ) { - FNT_Face fnt_face = (FNT_Face)face; - FNT_Font font = fnt_face->font; - - - if ( font ) - { - FT_MEM_COPY( header, &font->header, sizeof ( *header ) ); - error = FT_Err_Ok; - } + error = service->get_header( face, header ); } } + return error; } diff --git a/reactos/lib/freetype/src/base/ftxf86.c b/reactos/lib/freetype/src/base/ftxf86.c index 1f5e42ced47..04e80236e61 100644 --- a/reactos/lib/freetype/src/base/ftxf86.c +++ b/reactos/lib/freetype/src/base/ftxf86.c @@ -4,7 +4,7 @@ /* */ /* FreeType utility file for X11 support (body). */ /* */ -/* Copyright 2002 by */ +/* Copyright 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -19,59 +19,16 @@ #include <ft2build.h> #include FT_XFREE86_H #include FT_INTERNAL_OBJECTS_H - - /* XXX: This really is a sad hack, but I didn't want to change every */ - /* driver just to support this at the moment, since other important */ - /* changes are coming anyway. */ - - typedef struct FT_FontFormatRec_ - { - const char* driver_name; - const char* format_name; - - } FT_FontFormatRec; - +#include FT_SERVICE_XFREE86_NAME_H FT_EXPORT_DEF( const char* ) FT_Get_X11_Font_Format( FT_Face face ) { - static const FT_FontFormatRec font_formats[] = - { - { "type1", "Type 1" }, - { "truetype", "TrueType" }, - { "bdf", "BDF" }, - { "pcf", "PCF" }, - { "type42", "Type 42" }, - { "cidtype1", "CID Type 1" }, - { "cff", "CFF" }, - { "pfr", "PFR" }, - { "winfonts", "Windows FNT" } - }; - const char* result = NULL; - if ( face && face->driver ) - { - FT_Module driver = (FT_Module)face->driver; - - - if ( driver->clazz && driver->clazz->module_name ) - { - FT_Int n; - FT_Int count = sizeof( font_formats ) / sizeof ( font_formats[0] ); - - - result = driver->clazz->module_name; - - for ( n = 0; n < count; n++ ) - if ( ft_strcmp( result, font_formats[n].driver_name ) == 0 ) - { - result = font_formats[n].format_name; - break; - } - } - } + if ( face ) + FT_FACE_FIND_SERVICE( face, result, XF86_NAME ); return result; } diff --git a/reactos/lib/freetype/src/base/rules.mk b/reactos/lib/freetype/src/base/rules.mk index 725631b1df9..8017e8589fd 100644 --- a/reactos/lib/freetype/src/base/rules.mk +++ b/reactos/lib/freetype/src/base/rules.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2000, 2002, 2003 by +# Copyright 1996-2000, 2002, 2003, 2004 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, @@ -32,16 +32,17 @@ BASE_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(SRC_DIR)/base) # # ftsystem, ftinit, and ftdebug are handled by freetype.mk # -BASE_SRC := $(BASE_DIR)/ftcalc.c \ - $(BASE_DIR)/fttrigon.c \ - $(BASE_DIR)/ftutil.c \ - $(BASE_DIR)/ftstream.c \ +BASE_SRC := $(BASE_DIR)/ftapi.c \ + $(BASE_DIR)/ftcalc.c \ + $(BASE_DIR)/ftdbgmem.c \ $(BASE_DIR)/ftgloadr.c \ - $(BASE_DIR)/ftoutln.c \ - $(BASE_DIR)/ftobjs.c \ - $(BASE_DIR)/ftapi.c \ $(BASE_DIR)/ftnames.c \ - $(BASE_DIR)/ftdbgmem.c + $(BASE_DIR)/ftobjs.c \ + $(BASE_DIR)/ftoutln.c \ + $(BASE_DIR)/ftrfork.c \ + $(BASE_DIR)/ftstream.c \ + $(BASE_DIR)/fttrigon.c \ + $(BASE_DIR)/ftutil.c # Base layer `extensions' sources # @@ -49,15 +50,15 @@ BASE_SRC := $(BASE_DIR)/ftcalc.c \ # object. It will then be linked to the final executable only if one of its # symbols is used by the application. # -BASE_EXT_SRC := $(BASE_DIR)/ftglyph.c \ - $(BASE_DIR)/ftmm.c \ +BASE_EXT_SRC := $(BASE_DIR)/ftbbox.c \ $(BASE_DIR)/ftbdf.c \ - $(BASE_DIR)/fttype1.c \ - $(BASE_DIR)/ftxf86.c \ + $(BASE_DIR)/ftglyph.c \ + $(BASE_DIR)/ftmm.c \ $(BASE_DIR)/ftpfr.c \ $(BASE_DIR)/ftstroke.c \ + $(BASE_DIR)/fttype1.c \ $(BASE_DIR)/ftwinfnt.c \ - $(BASE_DIR)/ftbbox.c + $(BASE_DIR)/ftxf86.c # Default extensions objects # diff --git a/reactos/lib/freetype/src/bdf/bdfdrivr.c b/reactos/lib/freetype/src/bdf/bdfdrivr.c index dbd4a2f6475..2e8f93ca6bf 100644 --- a/reactos/lib/freetype/src/bdf/bdfdrivr.c +++ b/reactos/lib/freetype/src/bdf/bdfdrivr.c @@ -2,7 +2,7 @@ FreeType font driver for bdf files - Copyright (C) 2001, 2002, 2003 by + Copyright (C) 2001, 2002, 2003, 2004 by Francesco Zappa Nardelli Permission is hereby granted, free of charge, to any person obtaining a copy @@ -31,6 +31,9 @@ THE SOFTWARE. #include FT_INTERNAL_OBJECTS_H #include FT_BDF_H +#include FT_SERVICE_BDF_H +#include FT_SERVICE_XFREE86_NAME_H + #include "bdf.h" #include "bdfdrivr.h" @@ -169,6 +172,118 @@ THE SOFTWARE. }; + static FT_Error + bdf_interpret_style( BDF_Face bdf ) + { + FT_Error error = BDF_Err_Ok; + FT_Face face = FT_FACE( bdf ); + FT_Memory memory = face->memory; + bdf_font_t* font = bdf->bdffont; + bdf_property_t* prop; + + char *istr = NULL, *bstr = NULL; + char *sstr = NULL, *astr = NULL; + + int parts = 0, len = 0; + + + face->style_flags = 0; + + prop = bdf_get_font_property( font, (char *)"SLANT" ); + if ( prop && prop->format == BDF_ATOM && + prop->value.atom && + ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' || + *(prop->value.atom) == 'I' || *(prop->value.atom) == 'i' ) ) + { + face->style_flags |= FT_STYLE_FLAG_ITALIC; + istr = ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' ) + ? (char *)"Oblique" + : (char *)"Italic"; + len += ft_strlen( istr ); + parts++; + } + + prop = bdf_get_font_property( font, (char *)"WEIGHT_NAME" ); + if ( prop && prop->format == BDF_ATOM && + prop->value.atom && + ( *(prop->value.atom) == 'B' || *(prop->value.atom) == 'b' ) ) + { + face->style_flags |= FT_STYLE_FLAG_BOLD; + bstr = (char *)"Bold"; + len += ft_strlen( bstr ); + parts++; + } + + prop = bdf_get_font_property( font, (char *)"SETWIDTH_NAME" ); + if ( prop && prop->format == BDF_ATOM && + prop->value.atom && *(prop->value.atom) && + !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) + { + sstr = (char *)(prop->value.atom); + len += ft_strlen( sstr ); + parts++; + } + + prop = bdf_get_font_property( font, (char *)"ADD_STYLE_NAME" ); + if ( prop && prop->format == BDF_ATOM && + prop->value.atom && *(prop->value.atom) && + !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) + { + astr = (char *)(prop->value.atom); + len += ft_strlen( astr ); + parts++; + } + + if ( !parts || !len ) + face->style_name = (char *)"Regular"; + else + { + char *style, *s; + unsigned int i; + + + if ( FT_ALLOC( style, len + parts ) ) + return error; + + s = style; + + if ( astr ) + { + ft_strcpy( s, astr ); + for ( i = 0; i < ft_strlen( astr ); i++, s++ ) + if ( *s == ' ' ) + *s = '-'; /* replace spaces with dashes */ + *(s++) = ' '; + } + if ( bstr ) + { + ft_strcpy( s, bstr ); + s += ft_strlen( bstr ); + *(s++) = ' '; + } + if ( istr ) + { + ft_strcpy( s, istr ); + s += ft_strlen( istr ); + *(s++) = ' '; + } + if ( sstr ) + { + ft_strcpy( s, sstr ); + for ( i = 0; i < ft_strlen( sstr ); i++, s++ ) + if ( *s == ' ' ) + *s = '-'; /* replace spaces with dashes */ + *(s++) = ' '; + } + *(--s) = '\0'; /* overwrite last ' ', terminate the string */ + + face->style_name = style; /* allocated string */ + } + + return error; + } + + FT_CALLBACK_DEF( FT_Error ) BDF_Face_Done( BDF_Face face ) { @@ -249,39 +364,17 @@ THE SOFTWARE. FT_FACE_FLAG_FAST_GLYPHS; prop = bdf_get_font_property( font, "SPACING" ); - if ( prop != NULL ) - if ( prop->format == BDF_ATOM ) - if ( prop->value.atom != NULL ) - if ( ( *(prop->value.atom) == 'M' ) || - ( *(prop->value.atom) == 'm' ) || - ( *(prop->value.atom) == 'C' ) || - ( *(prop->value.atom) == 'c' ) ) - root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; + if ( prop && prop->format == BDF_ATOM && + prop->value.atom && + ( *(prop->value.atom) == 'M' || *(prop->value.atom) == 'm' || + *(prop->value.atom) == 'C' || *(prop->value.atom) == 'c' ) ) + root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; /* FZ XXX: TO DO: FT_FACE_FLAGS_VERTICAL */ /* FZ XXX: I need a font to implement this */ - root->style_flags = 0; - prop = bdf_get_font_property( font, "SLANT" ); - if ( prop != NULL ) - if ( prop->format == BDF_ATOM ) - if ( prop->value.atom != NULL ) - if ( ( *(prop->value.atom) == 'O' ) || - ( *(prop->value.atom) == 'o' ) || - ( *(prop->value.atom) == 'I' ) || - ( *(prop->value.atom) == 'i' ) ) - root->style_flags |= FT_STYLE_FLAG_ITALIC; - - prop = bdf_get_font_property( font, "WEIGHT_NAME" ); - if ( prop != NULL ) - if ( prop->format == BDF_ATOM ) - if ( prop->value.atom != NULL ) - if ( ( *(prop->value.atom) == 'B' ) || - ( *(prop->value.atom) == 'b' ) ) - root->style_flags |= FT_STYLE_FLAG_BOLD; - prop = bdf_get_font_property( font, "FAMILY_NAME" ); - if ( ( prop != NULL ) && ( prop->value.atom != NULL ) ) + if ( prop && prop->value.atom ) { int l = ft_strlen( prop->value.atom ) + 1; @@ -293,16 +386,8 @@ THE SOFTWARE. else root->family_name = 0; - root->style_name = (char *)"Regular"; - if ( root->style_flags & FT_STYLE_FLAG_BOLD ) - { - if ( root->style_flags & FT_STYLE_FLAG_ITALIC ) - root->style_name = (char *)"Bold Italic"; - else - root->style_name = (char *)"Bold"; - } - else if ( root->style_flags & FT_STYLE_FLAG_ITALIC ) - root->style_name = (char *)"Italic"; + if ( ( error = bdf_interpret_style( face ) ) != 0 ) + goto Exit; root->num_glyphs = font->glyphs_size; /* unencoded included */ @@ -312,43 +397,47 @@ THE SOFTWARE. { FT_Bitmap_Size* bsize = root->available_sizes; + FT_Short resolution_x = 0, resolution_y = 0; FT_MEM_ZERO( bsize, sizeof ( FT_Bitmap_Size ) ); - prop = bdf_get_font_property( font, "PIXEL_SIZE" ); - if ( prop != NULL ) - bsize->height = (FT_Short)prop->value.int32; + bsize->height = font->font_ascent + font->font_descent; prop = bdf_get_font_property( font, "AVERAGE_WIDTH" ); - if ( prop != NULL ) + if ( prop ) bsize->width = (FT_Short)( ( prop->value.int32 + 5 ) / 10 ); + else + bsize->width = bsize->height * 2/3; prop = bdf_get_font_property( font, "POINT_SIZE" ); - if ( prop != NULL ) + if ( prop ) /* convert from 722.7 decipoints to 72 points per inch */ bsize->size = (FT_Pos)( ( prop->value.int32 * 64 * 7200 + 36135L ) / 72270L ); + prop = bdf_get_font_property( font, "PIXEL_SIZE" ); + if ( prop ) + bsize->y_ppem = (FT_Short)prop->value.int32 << 6; + prop = bdf_get_font_property( font, "RESOLUTION_X" ); - if ( prop != NULL ) - bsize->x_ppem = - (FT_Pos)( ( prop->value.int32 * bsize->size + 36 ) / 72 ); + if ( prop ) + resolution_x = (FT_Short)prop->value.int32; prop = bdf_get_font_property( font, "RESOLUTION_Y" ); - if ( prop != NULL ) - bsize->y_ppem = - (FT_Pos)( ( prop->value.int32 * bsize->size + 36 ) / 72 ); + if ( prop ) + resolution_y = (FT_Short)prop->value.int32; - if ( bsize->height == 0 ) - bsize->height = (FT_Short)( ( bsize->y_ppem + 32 ) / 64 ); - - if ( bsize->height == 0 ) + if ( bsize->y_ppem == 0 ) { - /* some fonts have a broken SIZE declaration (jiskan24.bdf) */ - FT_ERROR(( "BDF_Face_Init: reading size\n" )); - bsize->height = (FT_Short)font->point_size; + bsize->y_ppem = bsize->size; + if ( resolution_y ) + bsize->y_ppem = bsize->y_ppem * resolution_y / 72; } + if ( resolution_x && resolution_y ) + bsize->x_ppem = bsize->y_ppem * resolution_x / resolution_y; + else + bsize->x_ppem = bsize->y_ppem; } /* encoding table */ @@ -378,21 +467,21 @@ THE SOFTWARE. bdf_get_font_property( font, "CHARSET_REGISTRY" ); charset_encoding = bdf_get_font_property( font, "CHARSET_ENCODING" ); - if ( ( charset_registry != NULL ) && ( charset_encoding != NULL ) ) + if ( charset_registry && charset_encoding ) { - if ( ( charset_registry->format == BDF_ATOM ) && - ( charset_encoding->format == BDF_ATOM ) && - ( charset_registry->value.atom != NULL ) && - ( charset_encoding->value.atom != NULL ) ) + if ( charset_registry->format == BDF_ATOM && + charset_encoding->format == BDF_ATOM && + charset_registry->value.atom && + charset_encoding->value.atom ) { const char* s; if ( FT_NEW_ARRAY( face->charset_encoding, - strlen( charset_encoding->value.atom ) + 1 ) ) + ft_strlen( charset_encoding->value.atom ) + 1 ) ) goto Exit; if ( FT_NEW_ARRAY( face->charset_registry, - strlen( charset_registry->value.atom ) + 1 ) ) + ft_strlen( charset_registry->value.atom ) + 1 ) ) goto Exit; ft_strcpy( face->charset_registry, charset_registry->value.atom ); @@ -478,13 +567,14 @@ THE SOFTWARE. FT_TRACE4(( "rec %d - pres %d\n", - size->metrics.y_ppem, root->available_sizes->height )); + size->metrics.y_ppem, root->available_sizes->y_ppem )); - if ( size->metrics.y_ppem == root->available_sizes->height ) + if ( size->metrics.y_ppem == root->available_sizes->y_ppem >> 6 ) { - size->metrics.ascender = face->bdffont->bbx.ascent << 6; - size->metrics.descender = face->bdffont->bbx.descent * ( -64 ); - size->metrics.height = face->bdffont->bbx.height << 6; + size->metrics.ascender = face->bdffont->font_ascent << 6; + size->metrics.descender = -face->bdffont->font_descent << 6; + size->metrics.height = ( face->bdffont->font_ascent + + face->bdffont->font_descent ) << 6; size->metrics.max_advance = face->bdffont->bbx.width << 6; return BDF_Err_Ok; @@ -630,14 +720,13 @@ THE SOFTWARE. } } - slot->bitmap_left = 0; + slot->bitmap_left = glyph.bbx.x_offset; slot->bitmap_top = glyph.bbx.ascent; /* FZ XXX: TODO: vertical metrics */ slot->metrics.horiAdvance = glyph.dwidth << 6; slot->metrics.horiBearingX = glyph.bbx.x_offset << 6; - slot->metrics.horiBearingY = ( glyph.bbx.y_offset + - glyph.bbx.height ) << 6; + slot->metrics.horiBearingY = glyph.bbx.ascent << 6; slot->metrics.width = bitmap->width << 6; slot->metrics.height = bitmap->rows << 6; @@ -649,6 +738,12 @@ THE SOFTWARE. } + /* + * + * BDF SERVICE + * + */ + static FT_Error bdf_get_bdf_property( BDF_Face face, const char* prop_name, @@ -660,7 +755,7 @@ THE SOFTWARE. FT_ASSERT( face && face->bdffont ); prop = bdf_get_font_property( face->bdffont, prop_name ); - if ( prop != NULL ) + if ( prop ) { switch ( prop->format ) { @@ -689,6 +784,38 @@ THE SOFTWARE. return BDF_Err_Invalid_Argument; } + static FT_Error + bdf_get_charset_id( BDF_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ) + { + *acharset_encoding = face->charset_encoding; + *acharset_registry = face->charset_registry; + + return 0; + } + + + static const FT_Service_BDFRec bdf_service_bdf = + { + (FT_BDF_GetCharsetIdFunc)bdf_get_charset_id, + (FT_BDF_GetPropertyFunc) bdf_get_bdf_property + }; + + + /* + * + * SERVICES LIST + * + */ + + static const FT_ServiceDescRec bdf_services[] = + { + { FT_SERVICE_ID_BDF, &bdf_service_bdf }, + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_BDF }, + { NULL, NULL } + }; + static FT_Module_Interface bdf_driver_requester( FT_Module module, @@ -696,13 +823,11 @@ THE SOFTWARE. { FT_UNUSED( module ); - if ( name && ft_strcmp( name, "get_bdf_property" ) == 0 ) - return (FT_Module_Interface)bdf_get_bdf_property; - - return NULL; + return ft_service_list_lookup( bdf_services, name ); } + FT_CALLBACK_TABLE_DEF const FT_Driver_ClassRec bdf_driver_class = { diff --git a/reactos/lib/freetype/src/bdf/bdfdrivr.h b/reactos/lib/freetype/src/bdf/bdfdrivr.h index 1e0224c33d2..148041ff24d 100644 --- a/reactos/lib/freetype/src/bdf/bdfdrivr.h +++ b/reactos/lib/freetype/src/bdf/bdfdrivr.h @@ -2,7 +2,7 @@ FreeType font driver for bdf fonts - Copyright (C) 2001, 2002 by + Copyright (C) 2001, 2002, 2003 by Francesco Zappa Nardelli Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/reactos/lib/freetype/src/bdf/bdflib.c b/reactos/lib/freetype/src/bdf/bdflib.c index 2d90b4c5bb1..be0e3987e4f 100644 --- a/reactos/lib/freetype/src/bdf/bdflib.c +++ b/reactos/lib/freetype/src/bdf/bdflib.c @@ -1,6 +1,6 @@ /* * Copyright 2000 Computing Research Labs, New Mexico State University - * Copyright 2001, 2002, 2003 Francesco Zappa Nardelli + * Copyright 2001, 2002, 2003, 2004 Francesco Zappa Nardelli * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -163,7 +163,7 @@ { (char *)"_MULE_RELATIVE_COMPOSE", BDF_INTEGER, 1, { 0 } }, }; - static unsigned long + static const unsigned long _num_bdf_properties = sizeof ( _bdf_properties ) / sizeof ( _bdf_properties[0] ); @@ -391,7 +391,7 @@ /* An empty string for empty fields. */ - static char empty[1] = { 0 }; /* XXX eliminate this */ + static const char empty[1] = { 0 }; /* XXX eliminate this */ /* Assume the line is NULL-terminated and that the `list' parameter */ @@ -468,7 +468,7 @@ } /* Assign the field appropriately. */ - list->field[list->used++] = ( ep > sp ) ? sp : empty; + list->field[list->used++] = ( ep > sp ) ? sp : (char*)empty; sp = ep; @@ -511,7 +511,7 @@ } if ( final_empty ) - list->field[list->used++] = empty; + list->field[list->used++] = (char*)empty; if ( list->used == list->size ) { @@ -1770,14 +1770,14 @@ /* Determine the overall font bounding box as the characters are */ /* loaded so corrections can be done later if indicated. */ - p->maxas = (short)MAX( glyph->bbx.ascent, p->maxas ); - p->maxds = (short)MAX( glyph->bbx.descent, p->maxds ); + p->maxas = (short)FT_MAX( glyph->bbx.ascent, p->maxas ); + p->maxds = (short)FT_MAX( glyph->bbx.descent, p->maxds ); p->rbearing = (short)( glyph->bbx.width + glyph->bbx.x_offset ); - p->maxrb = (short)MAX( p->rbearing, p->maxrb ); - p->minlb = (short)MIN( glyph->bbx.x_offset, p->minlb ); - p->maxlb = (short)MAX( glyph->bbx.x_offset, p->maxlb ); + p->maxrb = (short)FT_MAX( p->rbearing, p->maxrb ); + p->minlb = (short)FT_MIN( glyph->bbx.x_offset, p->minlb ); + p->maxlb = (short)FT_MAX( glyph->bbx.x_offset, p->maxlb ); if ( !( p->flags & _BDF_DWIDTH ) ) { diff --git a/reactos/lib/freetype/src/cache/Jamfile b/reactos/lib/freetype/src/cache/Jamfile index 099fd5e3653..b269c9557bb 100644 --- a/reactos/lib/freetype/src/cache/Jamfile +++ b/reactos/lib/freetype/src/cache/Jamfile @@ -1,4 +1,4 @@ -# FreeType 2 src/cache Jamfile (c) 2001 David Turner +# FreeType 2 src/cache Jamfile (c) 2001, 2003, 2004 David Turner # SubDir FT2_TOP $(FT2_SRC_DIR) cache ; @@ -14,7 +14,15 @@ HDRMACRO [ FT2_SubDir include ftcache.h ] ; if $(FT2_MULTI) { - _sources = ftlru ftcmanag ftccache ftcglyph ftcsbits ftcimage ftccmap ; + _sources = ftcmru + ftcmanag + ftccache + ftcglyph + ftcsbits + ftcimage + ftcbasic + ftccmap + ; } else { diff --git a/reactos/lib/freetype/src/cache/descrip.mms b/reactos/lib/freetype/src/cache/descrip.mms index ea12f2e3766..4d967dc1815 100644 --- a/reactos/lib/freetype/src/cache/descrip.mms +++ b/reactos/lib/freetype/src/cache/descrip.mms @@ -3,7 +3,7 @@ # -# Copyright 2001, 2002 by +# Copyright 2001, 2002, 2003, 2004 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, @@ -20,7 +20,6 @@ OBJS=ftcache.obj all : $(OBJS) library [--.lib]freetype.olb $(OBJS) -ftcache.obj : ftcache.c ftlru.c ftcmanag.c ftccache.c ftcglyph.c ftcimage.c \ - ftcsbits.c ftccmap.c +ftcache.obj : ftcache.c # EOF diff --git a/reactos/lib/freetype/src/cache/ftcache.c b/reactos/lib/freetype/src/cache/ftcache.c index 07e85e1ea47..d41e91e5ec1 100644 --- a/reactos/lib/freetype/src/cache/ftcache.c +++ b/reactos/lib/freetype/src/cache/ftcache.c @@ -4,7 +4,7 @@ /* */ /* The FreeType Caching sub-system (body only). */ /* */ -/* Copyright 2000-2001 by */ +/* Copyright 2000-2001, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -19,13 +19,13 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT #include <ft2build.h> -#include "ftlru.c" +#include "ftcmru.c" #include "ftcmanag.c" #include "ftccache.c" +#include "ftccmap.c" #include "ftcglyph.c" #include "ftcimage.c" #include "ftcsbits.c" -#include "ftccmap.c" - +#include "ftcbasic.c" /* END */ diff --git a/reactos/lib/freetype/src/cache/ftcbasic.c b/reactos/lib/freetype/src/cache/ftcbasic.c new file mode 100644 index 00000000000..5d5061cfb2d --- /dev/null +++ b/reactos/lib/freetype/src/cache/ftcbasic.c @@ -0,0 +1,425 @@ +/***************************************************************************/ +/* */ +/* ftcbasic.c */ +/* */ +/* The FreeType basic cache interface (body). */ +/* */ +/* Copyright 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_CACHE_H +#include FT_CACHE_INTERNAL_GLYPH_H +#include FT_CACHE_INTERNAL_IMAGE_H +#include FT_CACHE_INTERNAL_SBITS_H +#include FT_INTERNAL_MEMORY_H + +#include "ftccback.h" +#include "ftcerror.h" + + + /* + * Basic Families + * + */ + typedef struct FTC_BasicAttrRec_ + { + FTC_ScalerRec scaler; + FT_UInt load_flags; + + } FTC_BasicAttrRec, *FTC_BasicAttrs; + +#define FTC_BASIC_ATTR_COMPARE( a, b ) \ + ( FTC_SCALER_COMPARE( &(a)->scaler, &(b)->scaler ) && \ + (a)->load_flags == (b)->load_flags ) + +#define FTC_BASIC_ATTR_HASH( a ) \ + ( FTC_SCALER_HASH( &(a)->scaler ) + 31*(a)->load_flags ) + + + typedef struct FTC_BasicQueryRec_ + { + FTC_GQueryRec gquery; + FTC_BasicAttrRec attrs; + + } FTC_BasicQueryRec, *FTC_BasicQuery; + + + typedef struct FTC_BasicFamilyRec_ + { + FTC_FamilyRec family; + FTC_BasicAttrRec attrs; + + } FTC_BasicFamilyRec, *FTC_BasicFamily; + + + FT_CALLBACK_DEF( FT_Bool ) + ftc_basic_family_compare( FTC_BasicFamily family, + FTC_BasicQuery query ) + { + return FT_BOOL( FTC_BASIC_ATTR_COMPARE( &family->attrs, &query->attrs ) ); + } + + + FT_CALLBACK_DEF( FT_Error ) + ftc_basic_family_init( FTC_BasicFamily family, + FTC_BasicQuery query, + FTC_Cache cache ) + { + FTC_Family_Init( FTC_FAMILY( family ), cache ); + family->attrs = query->attrs; + return 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + ftc_basic_family_get_count( FTC_BasicFamily family, + FTC_Manager manager ) + { + FT_Error error; + FT_Face face; + FT_UInt result = 0; + + + error = FTC_Manager_LookupFace( manager, family->attrs.scaler.face_id, + &face ); + if ( !error ) + result = face->num_glyphs; + + return result; + } + + + FT_CALLBACK_DEF( FT_Error ) + ftc_basic_family_load_bitmap( FTC_BasicFamily family, + FT_UInt gindex, + FTC_Manager manager, + FT_Face *aface ) + { + FT_Error error; + FT_Size size; + + + error = FTC_Manager_LookupSize( manager, &family->attrs.scaler, &size ); + if ( !error ) + { + FT_Face face = size->face; + + + error = FT_Load_Glyph( face, gindex, + family->attrs.load_flags | FT_LOAD_RENDER ); + if ( !error ) + *aface = face; + } + + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + ftc_basic_family_load_glyph( FTC_BasicFamily family, + FT_UInt gindex, + FTC_Cache cache, + FT_Glyph *aglyph ) + { + FT_Error error; + FTC_Scaler scaler = &family->attrs.scaler; + FT_Face face; + FT_Size size; + + + /* we will now load the glyph image */ + error = FTC_Manager_LookupSize( cache->manager, + scaler, + &size ); + if ( !error ) + { + face = size->face; + + error = FT_Load_Glyph( face, gindex, family->attrs.load_flags ); + if ( !error ) + { + if ( face->glyph->format == FT_GLYPH_FORMAT_BITMAP || + face->glyph->format == FT_GLYPH_FORMAT_OUTLINE ) + { + /* ok, copy it */ + FT_Glyph glyph; + + + error = FT_Get_Glyph( face->glyph, &glyph ); + if ( !error ) + { + *aglyph = glyph; + goto Exit; + } + } + else + error = FTC_Err_Invalid_Argument; + } + } + + Exit: + return error; + } + + + FT_CALLBACK_DEF( FT_Bool ) + ftc_basic_gnode_compare_faceid( FTC_GNode gnode, + FTC_FaceID face_id, + FTC_Cache cache ) + { + FTC_BasicFamily family = (FTC_BasicFamily)gnode->family; + FT_Bool result; + + + result = FT_BOOL( family->attrs.scaler.face_id == face_id ); + if ( result ) + { + /* we must call this function to avoid this node from appearing + * in later lookups with the same face_id! + */ + FTC_GNode_UnselectFamily( gnode, cache ); + } + return result; + } + + + /* + * + * basic image cache + * + */ + + FT_CALLBACK_TABLE_DEF + const FTC_IFamilyClassRec ftc_basic_image_family_class = + { + { + sizeof( FTC_BasicFamilyRec ), + (FTC_MruNode_CompareFunc)ftc_basic_family_compare, + (FTC_MruNode_InitFunc) ftc_basic_family_init, + (FTC_MruNode_ResetFunc) NULL, + (FTC_MruNode_DoneFunc) NULL + }, + (FTC_IFamily_LoadGlyphFunc)ftc_basic_family_load_glyph + }; + + + FT_CALLBACK_TABLE_DEF + const FTC_GCacheClassRec ftc_basic_image_cache_class = + { + { + (FTC_Node_NewFunc) ftc_inode_new, + (FTC_Node_WeightFunc) ftc_inode_weight, + (FTC_Node_CompareFunc)ftc_gnode_compare, + (FTC_Node_CompareFunc)ftc_basic_gnode_compare_faceid, + (FTC_Node_FreeFunc) ftc_inode_free, + + sizeof( FTC_GCacheRec ), + (FTC_Cache_InitFunc) ftc_gcache_init, + (FTC_Cache_DoneFunc) ftc_gcache_done + }, + (FTC_MruListClass)&ftc_basic_image_family_class + }; + + + FT_EXPORT_DEF( FT_Error ) + FTC_ImageCache_New( FTC_Manager manager, + FTC_ImageCache *acache ) + { + return FTC_GCache_New( manager, &ftc_basic_image_cache_class, + (FTC_GCache*)acache ); + } + + + /* documentation is in ftcimage.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_ImageCache_Lookup( FTC_ImageCache cache, + FTC_ImageType type, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ) + { + FTC_BasicQueryRec query; + FTC_INode node; + FT_Error error; + FT_UInt32 hash; + + + /* some argument checks are delayed to FTC_Cache_Lookup */ + if ( !aglyph ) + { + error = FTC_Err_Invalid_Argument; + goto Exit; + } + + *aglyph = NULL; + if ( anode ) + *anode = NULL; + + query.attrs.scaler.face_id = type->face_id; + query.attrs.scaler.width = type->width; + query.attrs.scaler.height = type->height; + query.attrs.scaler.pixel = 1; + query.attrs.load_flags = type->flags; + + query.attrs.scaler.x_res = 0; /* make compilers happy */ + query.attrs.scaler.y_res = 0; + + hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + gindex; + +#if 1 /* inlining is about 50% faster! */ + FTC_GCACHE_LOOKUP_CMP( cache, + ftc_basic_family_compare, + FTC_GNode_Compare, + hash, gindex, + &query, + node, + error ); +#else + error = FTC_GCache_Lookup( FTC_GCACHE( cache ), + hash, gindex, + FTC_GQUERY( &query ), + (FTC_Node*) &node ); +#endif + if ( !error ) + { + *aglyph = FTC_INODE( node )->glyph; + + if ( anode ) + { + *anode = FTC_NODE( node ); + FTC_NODE( node )->ref_count++; + } + } + + Exit: + return error; + } + + + /* + * + * basic small bitmap cache + * + */ + + + FT_CALLBACK_TABLE_DEF + const FTC_SFamilyClassRec ftc_basic_sbit_family_class = + { + { + sizeof( FTC_BasicFamilyRec ), + (FTC_MruNode_CompareFunc)ftc_basic_family_compare, + (FTC_MruNode_InitFunc) ftc_basic_family_init, + (FTC_MruNode_ResetFunc) NULL, + (FTC_MruNode_DoneFunc) NULL + }, + (FTC_SFamily_GetCountFunc) ftc_basic_family_get_count, + (FTC_SFamily_LoadGlyphFunc)ftc_basic_family_load_bitmap + }; + + + FT_CALLBACK_TABLE_DEF + const FTC_GCacheClassRec ftc_basic_sbit_cache_class = + { + { + (FTC_Node_NewFunc) ftc_snode_new, + (FTC_Node_WeightFunc) ftc_snode_weight, + (FTC_Node_CompareFunc)ftc_snode_compare, + (FTC_Node_CompareFunc)ftc_basic_gnode_compare_faceid, + (FTC_Node_FreeFunc) ftc_snode_free, + + sizeof( FTC_GCacheRec ), + (FTC_Cache_InitFunc) ftc_gcache_init, + (FTC_Cache_DoneFunc) ftc_gcache_done + }, + (FTC_MruListClass)&ftc_basic_sbit_family_class + }; + + + FT_EXPORT_DEF( FT_Error ) + FTC_SBitCache_New( FTC_Manager manager, + FTC_SBitCache *acache ) + { + return FTC_GCache_New( manager, &ftc_basic_sbit_cache_class, + (FTC_GCache*)acache ); + } + + + FT_EXPORT_DEF( FT_Error ) + FTC_SBitCache_Lookup( FTC_SBitCache cache, + FTC_ImageType type, + FT_UInt gindex, + FTC_SBit *ansbit, + FTC_Node *anode ) + { + FT_Error error; + FTC_BasicQueryRec query; + FTC_SNode node; + FT_UInt32 hash; + + + if ( anode ) + *anode = NULL; + + /* other argument checks delayed to FTC_Cache_Lookup */ + if ( !ansbit ) + return FTC_Err_Invalid_Argument; + + *ansbit = NULL; + + query.attrs.scaler.face_id = type->face_id; + query.attrs.scaler.width = type->width; + query.attrs.scaler.height = type->height; + query.attrs.scaler.pixel = 1; + query.attrs.load_flags = type->flags; + + query.attrs.scaler.x_res = 0; /* make compilers happy */ + query.attrs.scaler.y_res = 0; + + /* beware, the hash must be the same for all glyph ranges! */ + hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + + gindex / FTC_SBIT_ITEMS_PER_NODE; + +#if 1 /* inlining is about 50% faster! */ + FTC_GCACHE_LOOKUP_CMP( cache, + ftc_basic_family_compare, + FTC_SNode_Compare, + hash, gindex, + &query, + node, + error ); +#else + error = FTC_GCache_Lookup( FTC_GCACHE( cache ), + hash, + gindex, + FTC_GQUERY( &query ), + (FTC_Node*)&node ); +#endif + if ( error ) + goto Exit; + + *ansbit = node->sbits + ( gindex - FTC_GNODE( node )->gindex ); + + if ( anode ) + { + *anode = FTC_NODE( node ); + FTC_NODE( node )->ref_count++; + } + + Exit: + return error; + } + + +/* END */ diff --git a/reactos/lib/freetype/src/cache/ftccache.c b/reactos/lib/freetype/src/cache/ftccache.c index cc01c397811..2b6bee9cfeb 100644 --- a/reactos/lib/freetype/src/cache/ftccache.c +++ b/reactos/lib/freetype/src/cache/ftccache.c @@ -4,7 +4,7 @@ /* */ /* The FreeType internal cache interface (body). */ /* */ -/* Copyright 2000-2001, 2002, 2003 by */ +/* Copyright 2000-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -17,10 +17,11 @@ #include <ft2build.h> -#include FT_CACHE_MANAGER_H +#include FT_CACHE_INTERNAL_MANAGER_H #include FT_INTERNAL_OBJECTS_H #include FT_INTERNAL_DEBUG_H +#include "ftccback.h" #include "ftcerror.h" @@ -40,53 +41,13 @@ /*************************************************************************/ /*************************************************************************/ - FT_EXPORT_DEF( void ) - ftc_node_done( FTC_Node node, - FTC_Cache cache ) - { - FTC_Family family; - FTC_FamilyEntry entry; - - - entry = cache->manager->families.entries + node->fam_index; - family = entry->family; - - /* remove from parent set table - eventually destroy the set */ - if ( --family->num_nodes == 0 ) - FT_LruList_Remove( cache->families, (FT_LruNode) family ); - } - - /* add a new node to the head of the manager's circular MRU list */ static void ftc_node_mru_link( FTC_Node node, FTC_Manager manager ) { - FTC_Node first = manager->nodes_list; - - - if ( first ) - { - FTC_Node last = first->mru_prev; - - - FT_ASSERT( last->mru_next == first ); - - node->mru_prev = last; - node->mru_next = first; - - last->mru_next = node; - first->mru_prev = node; - } - else - { - FT_ASSERT( manager->num_nodes == 0 ); - - node->mru_next = node; - node->mru_prev = node; - } - - manager->nodes_list = node; + FTC_MruNode_Prepend( (FTC_MruNode*)&manager->nodes_list, + (FTC_MruNode)node ); manager->num_nodes++; } @@ -96,29 +57,8 @@ ftc_node_mru_unlink( FTC_Node node, FTC_Manager manager ) { - FTC_Node first = manager->nodes_list; - FTC_Node prev = node->mru_prev; - FTC_Node next = node->mru_next; - - - FT_ASSERT( first != NULL && manager->num_nodes > 0 ); - FT_ASSERT( next->mru_prev == node ); - FT_ASSERT( prev->mru_next == node ); - - next->mru_prev = prev; - prev->mru_next = next; - - if ( node == first ) - { - /* this is the last node in the list; update its head pointer */ - if ( node == next ) - manager->nodes_list = NULL; - else - manager->nodes_list = next; - } - - node->mru_next = NULL; - node->mru_prev = NULL; + FTC_MruNode_Remove( (FTC_MruNode*)&manager->nodes_list, + (FTC_MruNode)node ); manager->num_nodes--; } @@ -128,120 +68,167 @@ ftc_node_mru_up( FTC_Node node, FTC_Manager manager ) { - FTC_Node first = manager->nodes_list; + FTC_MruNode_Up( (FTC_MruNode*)&manager->nodes_list, + (FTC_MruNode)node ); + } - if ( node != first ) + /* Note that this function cannot fail. If we cannot re-size the + * buckets array appropriately, we simply degrade the hash table's + * performance! + */ + static void + ftc_cache_resize( FTC_Cache cache ) + { + for (;;) { - FTC_Node prev = node->mru_prev; - FTC_Node next = node->mru_next; - FTC_Node last; + FTC_Node node, *pnode; + FT_UInt p = cache->p; + FT_UInt mask = cache->mask; + FT_UInt count = mask + p + 1; /* number of buckets */ - prev->mru_next = next; - next->mru_prev = prev; + /* do we need to shrink the buckets array? */ + if ( cache->slack < 0 ) + { + FTC_Node new_list = NULL; - last = first->mru_prev; - node->mru_next = first; - node->mru_prev = last; - first->mru_prev = node; - last->mru_next = node; - manager->nodes_list = node; + /* try to expand the buckets array _before_ splitting + * the bucket lists + */ + if ( p >= mask ) + { + FT_Memory memory = cache->memory; + + + /* if we can't expand the array, leave immediately */ + if ( FT_MEM_RENEW_ARRAY( cache->buckets, (mask+1)*2, (mask+1)*4 ) ) + break; + } + + /* split a single bucket */ + pnode = cache->buckets + p; + + for (;;) + { + node = *pnode; + if ( node == NULL ) + break; + + if ( node->hash & ( mask + 1 ) ) + { + *pnode = node->link; + node->link = new_list; + new_list = node; + } + else + pnode = &node->link; + } + + cache->buckets[p + mask + 1] = new_list; + + cache->slack += FTC_HASH_MAX_LOAD; + + if ( p >= mask ) + { + cache->mask = 2 * mask + 1; + cache->p = 0; + } + else + cache->p = p + 1; + } + + /* do we need to expand the buckets array? */ + else if ( cache->slack > (FT_Long)count * FTC_HASH_SUB_LOAD ) + { + FT_UInt old_index = p + mask; + FTC_Node* pold; + + + if ( old_index + 1 <= FTC_HASH_INITIAL_SIZE ) + break; + + if ( p == 0 ) + { + FT_Memory memory = cache->memory; + + + /* if we can't shrink the array, leave immediately */ + if ( FT_MEM_RENEW_ARRAY( cache->buckets, + ( mask + 1 ) * 2, mask + 1 ) ) + break; + + cache->mask >>= 1; + p = cache->mask; + } + else + p--; + + pnode = cache->buckets + p; + while ( *pnode ) + pnode = &(*pnode)->link; + + pold = cache->buckets + old_index; + *pnode = *pold; + *pold = NULL; + + cache->slack -= FTC_HASH_MAX_LOAD; + cache->p = p; + } + else /* the hash table is balanced */ + break; } } /* remove a node from its cache's hash table */ - static FT_Error - ftc_node_hash_unlink( FTC_Node node, + static void + ftc_node_hash_unlink( FTC_Node node0, FTC_Cache cache ) { - FT_Error error = 0; FTC_Node *pnode; - FT_UInt idx, num_buckets; + FT_UInt idx; - idx = (FT_UInt)( node->hash & cache->mask ); + idx = (FT_UInt)( node0->hash & cache->mask ); if ( idx < cache->p ) - idx = (FT_UInt)( node->hash & ( 2 * cache->mask + 1 ) ); + idx = (FT_UInt)( node0->hash & ( 2 * cache->mask + 1 ) ); pnode = cache->buckets + idx; for (;;) { - if ( *pnode == NULL ) + FTC_Node node = *pnode; + + + if ( node == NULL ) { FT_ERROR(( "ftc_node_hash_unlink: unknown node!\n" )); - return FTC_Err_Ok; + return; } - if ( *pnode == node ) - { - *pnode = node->link; - node->link = NULL; + if ( node == node0 ) break; - } pnode = &(*pnode)->link; } - num_buckets = ( cache->p + cache->mask + 1 ); + *pnode = node0->link; + node0->link = NULL; - if ( ++cache->slack > (FT_Long)num_buckets * FTC_HASH_SUB_LOAD ) - { - FT_UInt p = cache->p; - FT_UInt mask = cache->mask; - FT_UInt old_index = p + mask; - FTC_Node* pold; - - - if ( old_index + 1 <= FTC_HASH_INITIAL_SIZE ) - goto Exit; - - if ( p == 0 ) - { - FT_Memory memory = cache->memory; - - - cache->mask >>= 1; - p = cache->mask; - - if ( FT_RENEW_ARRAY( cache->buckets, ( mask + 1 ) * 2, (mask+1) ) ) - { - FT_ERROR(( "ftc_node_hash_unlink: couldn't shunk buckets!\n" )); - goto Exit; - } - } - else - p--; - - pnode = cache->buckets + p; - while ( *pnode ) - pnode = &(*pnode)->link; - - pold = cache->buckets + old_index; - *pnode = *pold; - *pold = NULL; - - cache->slack -= FTC_HASH_MAX_LOAD; - cache->p = p; - } - - Exit: - return error; + cache->slack++; + ftc_cache_resize( cache ); } - - /* add a node to the "top" of its cache's hash table */ - static FT_Error + /* add a node to the `top' of its cache's hash table */ + static void ftc_node_hash_link( FTC_Node node, FTC_Cache cache ) { FTC_Node *pnode; FT_UInt idx; - FT_Error error = 0; idx = (FT_UInt)( node->hash & cache->mask ); @@ -253,85 +240,29 @@ node->link = *pnode; *pnode = node; - if ( --cache->slack < 0 ) - { - FT_UInt p = cache->p; - FT_UInt mask = cache->mask; - FTC_Node new_list; - - - /* split a single bucket */ - new_list = NULL; - pnode = cache->buckets + p; - - for (;;) - { - node = *pnode; - if ( node == NULL ) - break; - - if ( node->hash & ( mask + 1 ) ) - { - *pnode = node->link; - node->link = new_list; - new_list = node; - } - else - pnode = &node->link; - } - - cache->buckets[p + mask + 1] = new_list; - - cache->slack += FTC_HASH_MAX_LOAD; - - if ( p >= mask ) - { - FT_Memory memory = cache->memory; - - - if ( FT_RENEW_ARRAY( cache->buckets, - ( mask + 1 ) * 2, ( mask + 1 ) * 4 ) ) - { - FT_ERROR(( "ftc_node_hash_link: couldn't expand buckets!\n" )); - goto Exit; - } - - cache->mask = 2 * mask + 1; - cache->p = 0; - } - else - cache->p = p + 1; - } - - Exit: - return error; + cache->slack--; + ftc_cache_resize( cache ); } - - /* remove a node from the cache manager */ FT_EXPORT_DEF( void ) ftc_node_destroy( FTC_Node node, FTC_Manager manager ) { - FT_Memory memory = manager->library->memory; - FTC_Cache cache; - FTC_FamilyEntry entry; - FTC_Cache_Class clazz; + FTC_Cache cache; #ifdef FT_DEBUG_ERROR /* find node's cache */ - if ( node->fam_index >= manager->families.count ) + if ( node->cache_index >= manager->num_caches ) { FT_ERROR(( "ftc_node_destroy: invalid node handle\n" )); return; } #endif - entry = manager->families.entries + node->fam_index; - cache = entry->cache; + cache = manager->caches[node->cache_index]; #ifdef FT_DEBUG_ERROR if ( cache == NULL ) @@ -341,9 +272,7 @@ } #endif - clazz = cache->clazz; - - manager->cur_weight -= clazz->node_weight( node, cache ); + manager->cur_weight -= cache->clazz.node_weight( node, cache ); /* remove node from mru list */ ftc_node_mru_unlink( node, manager ); @@ -352,10 +281,7 @@ ftc_node_hash_unlink( node, cache ); /* now finalize it */ - if ( clazz->node_done ) - clazz->node_done( node, cache ); - - FT_FREE( node ); + cache->clazz.node_free( node, cache ); #if 0 /* check, just in case of general corruption :-) */ @@ -366,58 +292,6 @@ } - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** CACHE FAMILY DEFINITIONS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - FT_EXPORT_DEF( FT_Error ) - ftc_family_init( FTC_Family family, - FTC_Query query, - FTC_Cache cache ) - { - FT_Error error; - FTC_Manager manager = cache->manager; - FT_Memory memory = manager->library->memory; - FTC_FamilyEntry entry; - - - family->cache = cache; - family->num_nodes = 0; - - /* now add to manager's family table */ - error = ftc_family_table_alloc( &manager->families, memory, &entry ); - if ( !error ) - { - entry->cache = cache; - entry->family = family; - family->fam_index = entry->index; - - query->family = family; /* save family in query */ - } - - return error; - } - - - FT_EXPORT_DEF( void ) - ftc_family_done( FTC_Family family ) - { - if ( family && family->cache ) - { - FTC_Manager manager = family->cache->manager; - - - /* remove from manager's family table */ - ftc_family_table_free( &manager->families, family->fam_index ); - } - } - - /*************************************************************************/ /*************************************************************************/ /***** *****/ @@ -427,62 +301,36 @@ /*************************************************************************/ - FT_EXPORT_DEF( FT_Error ) - ftc_cache_init( FTC_Cache cache ) + FTC_Cache_Init( FTC_Cache cache ) { - FT_Memory memory = cache->memory; - FTC_Cache_Class clazz = cache->clazz; - FT_Error error; + FT_Memory memory = cache->memory; cache->p = 0; cache->mask = FTC_HASH_INITIAL_SIZE - 1; cache->slack = FTC_HASH_INITIAL_SIZE * FTC_HASH_MAX_LOAD; - if ( FT_NEW_ARRAY( cache->buckets, FTC_HASH_INITIAL_SIZE * 2 ) ) - goto Exit; - - /* now, initialize the lru list of families for this cache */ - if ( clazz->family_size > 0 ) - { - FT_LruList_ClassRec* lru_class = &cache->family_class; + return ( FT_MEM_NEW_ARRAY( cache->buckets, FTC_HASH_INITIAL_SIZE * 2 ) ); + } - lru_class->list_size = sizeof( FT_LruListRec ); - lru_class->list_init = NULL; - lru_class->list_done = NULL; - - lru_class->node_size = clazz->family_size; - lru_class->node_init = (FT_LruNode_InitFunc) clazz->family_init; - lru_class->node_done = (FT_LruNode_DoneFunc) clazz->family_done; - lru_class->node_flush = (FT_LruNode_FlushFunc) NULL; - lru_class->node_compare = (FT_LruNode_CompareFunc)clazz->family_compare; - - error = FT_LruList_New( (FT_LruList_Class) lru_class, - 0, /* max items == 0 => unbounded list */ - cache, - memory, - &cache->families ); - if ( error ) - FT_FREE( cache->buckets ); - } - - Exit: - return error; + FT_LOCAL_DEF( FT_Error ) + ftc_cache_init( FTC_Cache cache ) + { + return FTC_Cache_Init( cache ); } FT_EXPORT_DEF( void ) - ftc_cache_clear( FTC_Cache cache ) + FTC_Cache_Clear( FTC_Cache cache ) { if ( cache ) { - FT_Memory memory = cache->memory; - FTC_Cache_Class clazz = cache->clazz; - FTC_Manager manager = cache->manager; - FT_UFast i; - FT_UInt count; + FTC_Manager manager = cache->manager; + FT_UFast i; + FT_UInt count; + count = cache->p + cache->mask + 1; @@ -500,309 +348,256 @@ ftc_node_mru_unlink( node, manager ); /* now finalize it */ - manager->cur_weight -= clazz->node_weight( node, cache ); + manager->cur_weight -= cache->clazz.node_weight( node, cache ); - if ( clazz->node_done ) - clazz->node_done( node, cache ); - - FT_FREE( node ); + cache->clazz.node_free( node, cache ); node = next; } cache->buckets[i] = NULL; } - - cache->p = 0; - - /* destroy the families */ - if ( cache->families ) - FT_LruList_Reset( cache->families ); + ftc_cache_resize( cache ); } } FT_EXPORT_DEF( void ) - ftc_cache_done( FTC_Cache cache ) + FTC_Cache_Done( FTC_Cache cache ) { - if ( cache ) + if ( cache->memory ) { FT_Memory memory = cache->memory; - ftc_cache_clear( cache ); + FTC_Cache_Clear( cache ); FT_FREE( cache->buckets ); cache->mask = 0; + cache->p = 0; cache->slack = 0; - if ( cache->families ) + cache->memory = NULL; + } + } + + + FT_LOCAL_DEF( void ) + ftc_cache_done( FTC_Cache cache ) + { + FTC_Cache_Done( cache ); + } + + + static void + ftc_cache_add( FTC_Cache cache, + FT_UInt32 hash, + FTC_Node node ) + { + node->hash = hash; + node->cache_index = (FT_UInt16) cache->index; + node->ref_count = 0; + + ftc_node_hash_link( node, cache ); + ftc_node_mru_link( node, cache->manager ); + + { + FTC_Manager manager = cache->manager; + + + manager->cur_weight += cache->clazz.node_weight( node, cache ); + + if ( manager->cur_weight >= manager->max_weight ) { - FT_LruList_Destroy( cache->families ); - cache->families = NULL; + node->ref_count++; + FTC_Manager_Compress( manager ); + node->ref_count--; } } } - /* Look up a node in "top" of its cache's hash table. */ - /* If not found, create a new node. */ - /* */ FT_EXPORT_DEF( FT_Error ) - ftc_cache_lookup( FTC_Cache cache, - FTC_Query query, + FTC_Cache_NewNode( FTC_Cache cache, + FT_UInt32 hash, + FT_Pointer query, + FTC_Node *anode ) + { + FT_Error error; + FTC_Node node; + + /* + * Try to allocate a new cache node. Note that in case of + * out-of-memory error (OOM), we'll flush the cache a bit, + * then try again. + * + * On each try, the `tries' variable gives the number + * of old nodes we want to flush from the manager's global list + * before the next allocation attempt. It barely doubles on + * each iteration. + * + */ + error = cache->clazz.node_new( &node, query, cache ); + if ( error ) + goto FlushCache; + + AddNode: + /* don't assume that the cache has the same number of buckets, since + * our allocation request might have triggered global cache flushing + */ + ftc_cache_add( cache, hash, node ); + + Exit: + *anode = node; + return error; + + FlushCache: + node = NULL; + if ( error != FT_Err_Out_Of_Memory ) + goto Exit; + + { + FTC_Manager manager = cache->manager; + FT_UInt count, tries = 1; + + + for (;;) + { + error = cache->clazz.node_new( &node, query, cache ); + if ( !error ) + break; + + node = NULL; + if ( error != FT_Err_Out_Of_Memory ) + goto Exit; + + count = FTC_Manager_FlushN( manager, tries ); + if ( count == 0 ) + goto Exit; + + if ( count == tries ) + { + count = tries * 2; + if ( count < tries || count > manager->num_nodes ) + count = manager->num_nodes; + } + tries = count; + } + } + goto AddNode; + } + + + FT_EXPORT_DEF( FT_Error ) + FTC_Cache_Lookup( FTC_Cache cache, + FT_UInt32 hash, + FT_Pointer query, FTC_Node *anode ) { - FT_Error error = FTC_Err_Ok; - FTC_Manager manager; - FT_LruNode lru; - FT_UInt free_count = 0; + FT_UFast idx; + FTC_Node* bucket; + FTC_Node* pnode; + FTC_Node node; + FT_Error error = 0; + + FTC_Node_CompareFunc compare = cache->clazz.node_compare; - if ( !cache || !query || !anode ) - return FTC_Err_Invalid_Argument; + if ( cache == NULL || anode == NULL ) + return FT_Err_Invalid_Argument; - *anode = NULL; - - query->hash = 0; - query->family = NULL; - - manager = cache->manager; - - /* here's a small note explaining what's happening in the code below. - * - * We need to deal intelligently with out-of-memory (OOM) conditions - * when trying to create a new family or cache node during the lookup. - * - * When an OOM is detected, we try to free one or more "old" nodes - * from the cache, then try again. It may be necessary to do that - * several times, so a loop is needed. - * - * The local variable "free_count" holds the number of "old" nodes to - * discard on each attempt. It starts at 1 and doubles on each - * iteration. The loop stops when: - * - * - a non-OOM error is detected - * - a succesful lookup is performed - * - there are no more unused nodes in the cache - * - * For the record, remember that all used nodes appear _before_ - * unused ones in the manager's MRU node list. - */ + idx = hash & cache->mask; + if ( idx < cache->p ) + idx = hash & ( cache->mask * 2 + 1 ); + bucket = cache->buckets + idx; + pnode = bucket; for (;;) { + node = *pnode; + if ( node == NULL ) + goto NewNode; + + if ( node->hash == hash && compare( node, query, cache ) ) + break; + + pnode = &node->link; + } + + if ( node != *bucket ) + { + *pnode = node->link; + node->link = *bucket; + *bucket = node; + } + + /* move to head of MRU list */ + { + FTC_Manager manager = cache->manager; + + + if ( node != manager->nodes_list ) + ftc_node_mru_up( node, manager ); + } + *anode = node; + return error; + + NewNode: + return FTC_Cache_NewNode( cache, hash, query, anode ); + } + + + FT_EXPORT_DEF( void ) + FTC_Cache_RemoveFaceID( FTC_Cache cache, + FTC_FaceID face_id ) + { + FT_UFast i, count; + FTC_Manager manager = cache->manager; + FTC_Node frees = NULL; + + + count = cache->p + cache->mask; + for ( i = 0; i < count; i++ ) + { + FTC_Node* bucket = cache->buckets + i; + FTC_Node* pnode = bucket; + + + for ( ;; ) { - /* first of all, find the relevant family */ - FT_LruList list = cache->families; - FT_LruNode fam, *pfam; - FT_LruNode_CompareFunc compare = list->clazz->node_compare; + FTC_Node node = *pnode; - pfam = &list->nodes; - for (;;) + + if ( node == NULL ) + break; + + if ( cache->clazz.node_remove_faceid( node, face_id, cache ) ) { - fam = *pfam; - if ( fam == NULL ) - { - error = FT_LruList_Lookup( list, query, &lru ); - if ( error ) - goto Fail; - - goto Skip; - } - - if ( compare( fam, query, list->data ) ) - break; - - pfam = &fam->next; - } - - FT_ASSERT( fam != NULL ); - - /* move to top of list when needed */ - if ( fam != list->nodes ) - { - *pfam = fam->next; - fam->next = list->nodes; - list->nodes = fam; - } - - lru = fam; - - Skip: - ; - } - - { - FTC_Family family = (FTC_Family) lru; - FT_UFast hash = query->hash; - FTC_Node* bucket; - FT_UInt idx; - - - idx = hash & cache->mask; - if ( idx < cache->p ) - idx = hash & ( cache->mask * 2 + 1 ); - - bucket = cache->buckets + idx; - - - if ( query->family != family || - family->fam_index >= manager->families.size ) - { - FT_ERROR(( - "ftc_cache_lookup: invalid query (bad 'family' field)\n" )); - error = FTC_Err_Invalid_Argument; - goto Exit; - } - - if ( *bucket ) - { - FTC_Node* pnode = bucket; - FTC_Node_CompareFunc compare = cache->clazz->node_compare; - - - for ( ;; ) - { - FTC_Node node; - - - node = *pnode; - if ( node == NULL ) - break; - - if ( node->hash == hash && - (FT_UInt)node->fam_index == family->fam_index && - compare( node, query, cache ) ) - { - /* move to head of bucket list */ - if ( pnode != bucket ) - { - *pnode = node->link; - node->link = *bucket; - *bucket = node; - } - - /* move to head of MRU list */ - if ( node != manager->nodes_list ) - ftc_node_mru_up( node, manager ); - - *anode = node; - goto Exit; - } - - pnode = &node->link; - } - } - - /* didn't find a node, create a new one */ - { - FTC_Cache_Class clazz = cache->clazz; - FT_Memory memory = cache->memory; - FTC_Node node; - - - if ( FT_ALLOC( node, clazz->node_size ) ) - goto Fail; - - node->fam_index = (FT_UShort) family->fam_index; - node->hash = query->hash; - node->ref_count = 0; - - error = clazz->node_init( node, query, cache ); - if ( error ) - { - FT_FREE( node ); - goto Fail; - } - - error = ftc_node_hash_link( node, cache ); - if ( error ) - { - clazz->node_done( node, cache ); - FT_FREE( node ); - goto Fail; - } - - ftc_node_mru_link( node, cache->manager ); - - cache->manager->cur_weight += clazz->node_weight( node, cache ); - - /* now try to compress the node pool when necessary */ - if ( manager->cur_weight >= manager->max_weight ) - { - node->ref_count++; - FTC_Manager_Compress( manager ); - node->ref_count--; - } - - *anode = node; - } - - /* all is well, exit now - */ - goto Exit; - } - - Fail: - if ( error != FTC_Err_Out_Of_Memory ) - goto Exit; - - /* There is not enough memory; try to release some unused nodes - * from the cache to make room for a new one. - */ - { - FT_UInt new_count; - - - new_count = 1 + free_count * 2; - - /* check overflow and bounds */ - if ( new_count < free_count || free_count > manager->num_nodes ) - goto Exit; - - free_count = new_count; - - /* try to remove "new_count" nodes from the list */ - { - FTC_Node first = manager->nodes_list; - FTC_Node node; - - - if ( first == NULL ) /* empty list! */ - goto Exit; - - /* go to last node - it's a circular list */ - node = first->mru_prev; - for ( ; node && new_count > 0; new_count-- ) - { - FTC_Node prev = node->mru_prev; - - - /* Used nodes always appear before unused one in the MRU - * list. If we find one here, we'd better stop right now - * our iteration. - */ - if ( node->ref_count > 0 ) - { - /* if there are no unused nodes in the list, we'd better exit */ - if ( new_count == free_count ) - goto Exit; - - break; - } - - ftc_node_destroy( node, manager ); - - if ( node == first ) - break; - - node = prev; - } + *pnode = node->link; + node->link = frees; + frees = node; } + else + pnode = &node->link; } } - Exit: - return error; + /* remove all nodes in the free list */ + while ( frees ) + { + FTC_Node node; + + + node = frees; + frees = node->link; + + manager->cur_weight -= cache->clazz.node_weight( node, cache ); + ftc_node_mru_unlink( node, manager ); + + cache->clazz.node_free( node, cache ); + + cache->slack++; + } + + ftc_cache_resize( cache ); } diff --git a/reactos/lib/freetype/src/cache/ftccache.i b/reactos/lib/freetype/src/cache/ftccache.i deleted file mode 100644 index bb6e631a25b..00000000000 --- a/reactos/lib/freetype/src/cache/ftccache.i +++ /dev/null @@ -1,157 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftccache.i */ -/* */ -/* FreeType template for generic cache. */ -/* */ -/* Copyright 2002 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#ifndef GEN_CACHE_FAMILY_COMPARE -#error "GEN_CACHE_FAMILY_COMPARE not defined in template instantiation" -#endif - -#ifndef GEN_CACHE_NODE_COMPARE -#error "GEN_CACHE_NODE_COMPARE not defined in template instantiation" -#endif - - - static FT_Error - GEN_CACHE_LOOKUP( FTC_Cache cache, - FTC_Query query, - FTC_Node *anode ) - { - FT_LruNode lru; - FTC_Family family; - FT_UFast hash; - - - query->hash = 0; - query->family = NULL; - - /* XXX: we break encapsulation for the sake of speed! */ - { - /* first of all, find the relevant family */ - FT_LruList list = cache->families; - FT_LruNode fam, *pfam; - - - pfam = &list->nodes; - for (;;) - { - fam = *pfam; - if ( fam == NULL ) - goto Normal; - - if ( GEN_CACHE_FAMILY_COMPARE( fam, query, list->data ) ) - break; - - pfam = &fam->next; - } - - FT_ASSERT( fam != NULL ); - - /* move to top of list when needed */ - if ( fam != list->nodes ) - { - *pfam = fam->next; - fam->next = list->nodes; - list->nodes = fam; - } - - lru = fam; - } - - { - FTC_Node node, *pnode, *bucket; - - - family = (FTC_Family)lru; - hash = query->hash; - - { - FT_UInt idx; - - - idx = hash & cache->mask; - if ( idx < cache->p ) - idx = hash & ( cache->mask * 2 + 1 ); - - bucket = cache->buckets + idx; - } - - pnode = bucket; - - for ( ;; ) - { - node = *pnode; - if ( node == NULL ) - goto Normal; - - if ( node->hash == hash && - (FT_UInt)node->fam_index == family->fam_index && - GEN_CACHE_NODE_COMPARE( node, query, cache ) ) - { - /* we place the following out of the loop to make it */ - /* as small as possible... */ - goto Found; - } - - pnode = &node->link; - } - - Normal: - return ftc_cache_lookup( cache, query, anode ); - - Found: - /* move to head of bucket list */ - if ( pnode != bucket ) - { - *pnode = node->link; - node->link = *bucket; - *bucket = node; - } - - /* move to head of MRU list */ - if ( node != cache->manager->nodes_list ) - { - /* XXX: again, this is an inlined version of ftc_node_mru_up */ - FTC_Manager manager = cache->manager; - FTC_Node first = manager->nodes_list; - FTC_Node prev = node->mru_prev; - FTC_Node next = node->mru_next; - FTC_Node last; - - - prev->mru_next = next; - next->mru_prev = prev; - - last = first->mru_prev; - node->mru_next = first; - node->mru_prev = last; - first->mru_prev = node; - last->mru_next = node; - - manager->nodes_list = node; - } - - *anode = node; - return 0; - } - } - -#undef GEN_CACHE_NODE_COMPARE -#undef GEN_CACHE_FAMILY_COMPARE -#undef GEN_CACHE_LOOKUP - - -/* END */ diff --git a/reactos/lib/freetype/src/cache/ftccback.h b/reactos/lib/freetype/src/cache/ftccback.h new file mode 100644 index 00000000000..68be913850c --- /dev/null +++ b/reactos/lib/freetype/src/cache/ftccback.h @@ -0,0 +1,82 @@ +/***************************************************************************/ +/* */ +/* ftccback.h */ +/* */ +/* Callback functions of the caching sub-system (specification only). */ +/* */ +/* Copyright 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#ifndef __FTCCBACK_H__ +#define __FTCCBACK_H__ + +#include <ft2build.h> +#include FT_CACHE_H +#include FT_CACHE_INTERNAL_MRU_H +#include FT_CACHE_INTERNAL_IMAGE_H +#include FT_CACHE_INTERNAL_MANAGER_H +#include FT_CACHE_INTERNAL_GLYPH_H +#include FT_CACHE_INTERNAL_SBITS_H + + + FT_LOCAL( void ) + ftc_inode_free( FTC_INode inode, + FTC_Cache cache ); + + FT_LOCAL( FT_Error ) + ftc_inode_new( FTC_INode *pinode, + FTC_GQuery gquery, + FTC_Cache cache ); + + FT_LOCAL( FT_ULong ) + ftc_inode_weight( FTC_INode inode ); + + + FT_LOCAL( void ) + ftc_snode_free( FTC_SNode snode, + FTC_Cache cache ); + + FT_LOCAL( FT_Error ) + ftc_snode_new( FTC_SNode *psnode, + FTC_GQuery gquery, + FTC_Cache cache ); + + FT_LOCAL( FT_ULong ) + ftc_snode_weight( FTC_SNode snode ); + + FT_LOCAL( FT_Bool ) + ftc_snode_compare( FTC_SNode snode, + FTC_GQuery gquery, + FTC_Cache cache ); + + + FT_LOCAL( FT_Bool ) + ftc_gnode_compare( FTC_GNode gnode, + FTC_GQuery gquery ); + + + FT_LOCAL( FT_Error ) + ftc_gcache_init( FTC_GCache cache ); + + FT_LOCAL( void ) + ftc_gcache_done( FTC_GCache cache ); + + + FT_LOCAL( FT_Error ) + ftc_cache_init( FTC_Cache cache ); + + FT_LOCAL( void ) + ftc_cache_done( FTC_Cache cache ); + + +#endif /* __FTCCBACK_H__ */ + +/* END */ diff --git a/reactos/lib/freetype/src/cache/ftccmap.c b/reactos/lib/freetype/src/cache/ftccmap.c index bdb83abb530..dfdbb488bcb 100644 --- a/reactos/lib/freetype/src/cache/ftccmap.c +++ b/reactos/lib/freetype/src/cache/ftccmap.c @@ -4,7 +4,7 @@ /* */ /* FreeType CharMap cache (body) */ /* */ -/* Copyright 2000-2001, 2002, 2003 by */ +/* Copyright 2000-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -19,17 +19,18 @@ #include <ft2build.h> #include FT_FREETYPE_H #include FT_CACHE_H -#include FT_CACHE_CHARMAP_H -#include FT_CACHE_MANAGER_H +#include FT_CACHE_INTERNAL_MANAGER_H #include FT_INTERNAL_MEMORY_H #include FT_INTERNAL_DEBUG_H #include FT_TRUETYPE_IDS_H +#include "ftccback.h" #include "ftcerror.h" #undef FT_COMPONENT #define FT_COMPONENT trace_cache + /*************************************************************************/ /* */ /* Each FTC_CMapNode contains a simple array to map a range of character */ @@ -47,56 +48,44 @@ /* number of glyph indices / character code per node */ #define FTC_CMAP_INDICES_MAX 128 + /* compute a query/node hash */ +#define FTC_CMAP_HASH( faceid, index, charcode ) \ + ( FTC_FACE_ID_HASH( faceid ) + 211 * ( index ) + \ + ( (char_code) / FTC_CMAP_INDICES_MAX ) ) + /* the charmap query */ + typedef struct FTC_CMapQueryRec_ + { + FTC_FaceID face_id; + FT_UInt cmap_index; + FT_UInt32 char_code; + + } FTC_CMapQueryRec, *FTC_CMapQuery; + +#define FTC_CMAP_QUERY( x ) ((FTC_CMapQuery)(x)) +#define FTC_CMAP_QUERY_HASH( x ) \ + FTC_CMAP_HASH( (x)->face_id, (x)->cmap_index, (x)->char_code ) + + /* the cmap cache node */ typedef struct FTC_CMapNodeRec_ { FTC_NodeRec node; + FTC_FaceID face_id; + FT_UInt cmap_index; FT_UInt32 first; /* first character in node */ FT_UInt16 indices[FTC_CMAP_INDICES_MAX]; /* array of glyph indices */ } FTC_CMapNodeRec, *FTC_CMapNode; - #define FTC_CMAP_NODE( x ) ( (FTC_CMapNode)( x ) ) - - - /* compute node hash value from cmap family and "requested" glyph index */ -#define FTC_CMAP_HASH( cfam, cquery ) \ - ( (cfam)->hash + ( (cquery)->char_code / FTC_CMAP_INDICES_MAX ) ) +#define FTC_CMAP_NODE_HASH( x ) \ + FTC_CMAP_HASH( (x)->face_id, (x)->cmap_index, (x)->first ) /* if (indices[n] == FTC_CMAP_UNKNOWN), we assume that the corresponding */ /* glyph indices haven't been queried through FT_Get_Glyph_Index() yet */ #define FTC_CMAP_UNKNOWN ( (FT_UInt16)-1 ) - /* the charmap query */ - typedef struct FTC_CMapQueryRec_ - { - FTC_QueryRec query; - FTC_CMapDesc desc; - FT_UInt32 char_code; - - } FTC_CMapQueryRec, *FTC_CMapQuery; - - -#define FTC_CMAP_QUERY( x ) ( (FTC_CMapQuery)( x ) ) - - - /* the charmap family */ - typedef struct FTC_CMapFamilyRec_ - { - FTC_FamilyRec family; - FT_UInt32 hash; - FTC_CMapDescRec desc; - FT_UInt index; - - } FTC_CMapFamilyRec, *FTC_CMapFamily; - - -#define FTC_CMAP_FAMILY( x ) ( (FTC_CMapFamily)( x ) ) -#define FTC_CMAP_FAMILY_MEMORY( x ) FTC_FAMILY( x )->memory - - /*************************************************************************/ /*************************************************************************/ /***** *****/ @@ -106,27 +95,44 @@ /*************************************************************************/ - /* no need for specific finalizer; we use "ftc_node_done" directly */ + /* no need for specific finalizer; we use `ftc_node_done' directly */ + + FT_CALLBACK_DEF( void ) + ftc_cmap_node_free( FTC_CMapNode node, + FTC_Cache cache ) + { + FT_Memory memory = cache->memory; + + + FT_FREE( node ); + } + /* initialize a new cmap node */ FT_CALLBACK_DEF( FT_Error ) - ftc_cmap_node_init( FTC_CMapNode cnode, - FTC_CMapQuery cquery, - FTC_Cache cache ) + ftc_cmap_node_new( FTC_CMapNode *anode, + FTC_CMapQuery query, + FTC_Cache cache ) { - FT_UInt32 first; - FT_UInt n; - FT_UNUSED( cache ); + FT_Error error; + FT_Memory memory = cache->memory; + FTC_CMapNode node; + FT_UInt nn; - first = ( cquery->char_code / FTC_CMAP_INDICES_MAX ) * - FTC_CMAP_INDICES_MAX; + if ( !FT_NEW( node ) ) + { + node->face_id = query->face_id; + node->cmap_index = query->cmap_index; + node->first = (query->char_code / FTC_CMAP_INDICES_MAX) * + FTC_CMAP_INDICES_MAX; - cnode->first = first; - for ( n = 0; n < FTC_CMAP_INDICES_MAX; n++ ) - cnode->indices[n] = FTC_CMAP_UNKNOWN; + for ( nn = 0; nn < FTC_CMAP_INDICES_MAX; nn++ ) + node->indices[nn] = FTC_CMAP_UNKNOWN; + } - return 0; + *anode = node; + return error; } @@ -142,185 +148,27 @@ /* compare a cmap node to a given query */ FT_CALLBACK_DEF( FT_Bool ) - ftc_cmap_node_compare( FTC_CMapNode cnode, - FTC_CMapQuery cquery ) + ftc_cmap_node_compare( FTC_CMapNode node, + FTC_CMapQuery query ) { - FT_UInt32 offset = (FT_UInt32)( cquery->char_code - cnode->first ); - - - return FT_BOOL( offset < FTC_CMAP_INDICES_MAX ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** CHARMAP FAMILY *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - FT_CALLBACK_DEF( FT_Error ) - ftc_cmap_family_init( FTC_CMapFamily cfam, - FTC_CMapQuery cquery, - FTC_Cache cache ) - { - FTC_Manager manager = cache->manager; - FTC_CMapDesc desc = cquery->desc; - FT_UInt32 hash = 0; - FT_Error error; - FT_Face face; - - - /* setup charmap descriptor */ - cfam->desc = *desc; - - /* let's see whether the rest is correct too */ - error = FTC_Manager_Lookup_Face( manager, desc->face_id, &face ); - if ( !error ) + if ( node->face_id == query->face_id && + node->cmap_index == query->cmap_index ) { - FT_UInt count = face->num_charmaps; - FT_UInt idx = count; - FT_CharMap* cur = face->charmaps; + FT_UInt32 offset = (FT_UInt32)( query->char_code - node->first ); - switch ( desc->type ) - { - case FTC_CMAP_BY_INDEX: - idx = desc->u.index; - hash = idx * 33; - break; - - case FTC_CMAP_BY_ENCODING: - if ( desc->u.encoding == FT_ENCODING_UNICODE ) - { - /* Since the `interesting' table, pid/eid (3,10), is normally the - * last one, we loop backwards. This looses with type1 fonts with - * non-BMP characters (<.0001%), this wins with .ttf with non-BMP - * chars (.01% ?), and this is the same about 99.99% of the time! - */ - - FT_UInt unicmap_idx = count; /* some UCS-2 map, if we found it */ - - - cur += count - 1; - - for ( idx = 0; idx < count; idx++, cur-- ) - { - if ( cur[0]->encoding == FT_ENCODING_UNICODE ) - { - unicmap_idx = idx; /* record we found a Unicode charmap */ - - /* XXX If some new encodings to represent UCS-4 are added, - * they should be added here. - */ - if ( ( cur[0]->platform_id == TT_PLATFORM_MICROSOFT && - cur[0]->encoding_id == TT_MS_ID_UCS_4 ) || - ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE && - cur[0]->encoding_id == TT_APPLE_ID_UNICODE_32 ) ) - - /* Hurray! We found a UCS-4 charmap. We can stop the scan! */ - { - idx = count - 1 - idx; - goto Found_idx_for_FTC_CMAP_BY_ENCODING; - } - } - } - - /* We do not have any UCS-4 charmap. Sigh. - * Let's see if we have some other kind of Unicode charmap, though. - */ - if ( unicmap_idx < count ) - idx = count - 1 - unicmap_idx; - } - else - { - for ( idx = 0; idx < count; idx++, cur++ ) - if ( cur[0]->encoding == desc->u.encoding ) - break; - } - - Found_idx_for_FTC_CMAP_BY_ENCODING: - hash = idx * 67; - break; - - case FTC_CMAP_BY_ID: - for ( idx = 0; idx < count; idx++, cur++ ) - { - if ( (FT_UInt)cur[0]->platform_id == desc->u.id.platform && - (FT_UInt)cur[0]->encoding_id == desc->u.id.encoding ) - { - hash = ( ( desc->u.id.platform << 8 ) | desc->u.id.encoding ) * 7; - break; - } - } - break; - - default: - ; - } - - if ( idx >= count ) - goto Bad_Descriptor; - - /* compute hash value, both in family and query */ - cfam->index = idx; - cfam->hash = hash ^ FTC_FACE_ID_HASH( desc->face_id ); - FTC_QUERY( cquery )->hash = FTC_CMAP_HASH( cfam, cquery ); - - error = ftc_family_init( FTC_FAMILY( cfam ), - FTC_QUERY( cquery ), cache ); + return FT_BOOL( offset < FTC_CMAP_INDICES_MAX ); } - return error; - - Bad_Descriptor: - FT_TRACE1(( "ftp_cmap_family_init: invalid charmap descriptor\n" )); - return FTC_Err_Invalid_Argument; + return 0; } FT_CALLBACK_DEF( FT_Bool ) - ftc_cmap_family_compare( FTC_CMapFamily cfam, - FTC_CMapQuery cquery ) + ftc_cmap_node_remove_faceid( FTC_CMapNode node, + FTC_FaceID face_id ) { - FT_Int result = 0; - - - /* first, compare face id and type */ - if ( cfam->desc.face_id != cquery->desc->face_id || - cfam->desc.type != cquery->desc->type ) - goto Exit; - - switch ( cfam->desc.type ) - { - case FTC_CMAP_BY_INDEX: - result = ( cfam->desc.u.index == cquery->desc->u.index ); - break; - - case FTC_CMAP_BY_ENCODING: - result = ( cfam->desc.u.encoding == cquery->desc->u.encoding ); - break; - - case FTC_CMAP_BY_ID: - result = ( cfam->desc.u.id.platform == cquery->desc->u.id.platform && - cfam->desc.u.id.encoding == cquery->desc->u.id.encoding ); - break; - - default: - ; - } - - if ( result ) - { - /* when found, update the 'family' and 'hash' field of the query */ - FTC_QUERY( cquery )->family = FTC_FAMILY( cfam ); - FTC_QUERY( cquery )->hash = FTC_CMAP_HASH( cfam, cquery ); - } - - Exit: - return FT_BOOL( result ); + return FT_BOOL( node->face_id == face_id ); } @@ -334,23 +182,17 @@ FT_CALLBACK_TABLE_DEF - const FTC_Cache_ClassRec ftc_cmap_cache_class = + const FTC_CacheClassRec ftc_cmap_cache_class = { - sizeof ( FTC_CacheRec ), - (FTC_Cache_InitFunc) ftc_cache_init, - (FTC_Cache_ClearFunc)ftc_cache_clear, - (FTC_Cache_DoneFunc) ftc_cache_done, - - sizeof ( FTC_CMapFamilyRec ), - (FTC_Family_InitFunc) ftc_cmap_family_init, - (FTC_Family_CompareFunc)ftc_cmap_family_compare, - (FTC_Family_DoneFunc) ftc_family_done, - - sizeof ( FTC_CMapNodeRec ), - (FTC_Node_InitFunc) ftc_cmap_node_init, + (FTC_Node_NewFunc) ftc_cmap_node_new, (FTC_Node_WeightFunc) ftc_cmap_node_weight, (FTC_Node_CompareFunc)ftc_cmap_node_compare, - (FTC_Node_DoneFunc) ftc_node_done + (FTC_Node_CompareFunc)ftc_cmap_node_remove_faceid, + (FTC_Node_FreeFunc) ftc_cmap_node_free, + + sizeof ( FTC_CacheRec ), + (FTC_Cache_InitFunc) ftc_cache_init, + (FTC_Cache_DoneFunc) ftc_cache_done, }; @@ -360,99 +202,84 @@ FTC_CMapCache_New( FTC_Manager manager, FTC_CMapCache *acache ) { - return FTC_Manager_Register_Cache( - manager, - (FTC_Cache_Class)&ftc_cmap_cache_class, - FTC_CACHE_P( acache ) ); + return FTC_Manager_RegisterCache( manager, + &ftc_cmap_cache_class, + FTC_CACHE_P( acache ) ); } -#ifdef FTC_CACHE_USE_INLINE - -#define GEN_CACHE_FAMILY_COMPARE( f, q, c ) \ - ftc_cmap_family_compare( (FTC_CMapFamily)(f), (FTC_CMapQuery)(q) ) - -#define GEN_CACHE_NODE_COMPARE( n, q, c ) \ - ftc_cmap_node_compare( (FTC_CMapNode)(n), (FTC_CMapQuery)(q) ) - -#define GEN_CACHE_LOOKUP ftc_cmap_cache_lookup - -#include "ftccache.i" - -#else /* !FTC_CACHE_USE_INLINE */ - -#define ftc_cmap_cache_lookup ftc_cache_lookup - -#endif /* !FTC_CACHE_USE_INLINE */ - - /* documentation is in ftccmap.h */ FT_EXPORT_DEF( FT_UInt ) - FTC_CMapCache_Lookup( FTC_CMapCache cache, - FTC_CMapDesc desc, + FTC_CMapCache_Lookup( FTC_CMapCache cmap_cache, + FTC_FaceID face_id, + FT_Int cmap_index, FT_UInt32 char_code ) { - FTC_CMapQueryRec cquery; + FTC_Cache cache = FTC_CACHE( cmap_cache ); + FTC_CMapQueryRec query; FTC_CMapNode node; FT_Error error; FT_UInt gindex = 0; + FT_UInt32 hash; - if ( !cache || !desc ) + if ( !cache ) { FT_ERROR(( "FTC_CMapCache_Lookup: bad arguments, returning 0!\n" )); return 0; } - cquery.desc = desc; - cquery.char_code = char_code; + query.face_id = face_id; + query.cmap_index = (FT_UInt)cmap_index; + query.char_code = char_code; - error = ftc_cmap_cache_lookup( FTC_CACHE( cache ), - FTC_QUERY( &cquery ), - (FTC_Node*)&node ); - if ( !error ) + hash = FTC_CMAP_HASH( face_id, cmap_index, char_code ); + +#if 1 + FTC_CACHE_LOOKUP_CMP( cache, ftc_cmap_node_compare, hash, &query, + node, error ); +#else + error = FTC_Cache_Lookup( cache, hash, &query, (FTC_Node*) &node ); +#endif + if ( error ) + goto Exit; + + FT_ASSERT( (FT_UInt)( char_code - node->first ) < FTC_CMAP_INDICES_MAX ); + + gindex = node->indices[char_code - node->first]; + if ( gindex == FTC_CMAP_UNKNOWN ) { - FT_UInt offset = (FT_UInt)( char_code - node->first ); + FT_Face face; - FT_ASSERT( offset < FTC_CMAP_INDICES_MAX ); + gindex = 0; - gindex = node->indices[offset]; - if ( gindex == FTC_CMAP_UNKNOWN ) + error = FTC_Manager_LookupFace( cache->manager, node->face_id, &face ); + if ( error ) + goto Exit; + + if ( (FT_UInt)cmap_index < (FT_UInt)face->num_charmaps ) { - FT_Face face; + FT_CharMap old, cmap = NULL; - /* we need to use FT_Get_Char_Index */ - gindex = 0; - - error = FTC_Manager_Lookup_Face( FTC_CACHE(cache)->manager, - desc->face_id, - &face ); - if ( !error ) - { - FT_CharMap old, cmap = NULL; - FT_UInt cmap_index; - - - /* save old charmap, select new one */ - old = face->charmap; - cmap_index = FTC_CMAP_FAMILY( FTC_QUERY( &cquery )->family )->index; - cmap = face->charmaps[cmap_index]; + old = face->charmap; + cmap = face->charmaps[cmap_index]; + if ( old != cmap ) FT_Set_Charmap( face, cmap ); - /* perform lookup */ - gindex = FT_Get_Char_Index( face, char_code ); - node->indices[offset] = (FT_UInt16)gindex; + gindex = FT_Get_Char_Index( face, char_code ); - /* restore old charmap */ + if ( old != cmap ) FT_Set_Charmap( face, old ); - } } + + node->indices[char_code - node->first] = gindex; } + Exit: return gindex; } diff --git a/reactos/lib/freetype/src/cache/ftcglyph.c b/reactos/lib/freetype/src/cache/ftcglyph.c index aa21228a79b..5e6c9771af5 100644 --- a/reactos/lib/freetype/src/cache/ftcglyph.c +++ b/reactos/lib/freetype/src/cache/ftcglyph.c @@ -4,7 +4,7 @@ /* */ /* FreeType Glyph Image (FT_Glyph) cache (body). */ /* */ -/* Copyright 2000-2001 by */ +/* Copyright 2000-2001, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -20,54 +20,64 @@ #include FT_CACHE_H #include FT_CACHE_INTERNAL_GLYPH_H #include FT_ERRORS_H -#include FT_LIST_H #include FT_INTERNAL_OBJECTS_H #include FT_INTERNAL_DEBUG_H +#include "ftccback.h" #include "ftcerror.h" /* create a new chunk node, setting its cache index and ref count */ FT_EXPORT_DEF( void ) - ftc_glyph_node_init( FTC_GlyphNode gnode, - FT_UInt gindex, - FTC_GlyphFamily gfam ) + FTC_GNode_Init( FTC_GNode gnode, + FT_UInt gindex, + FTC_Family family ) { - FT_UInt len; - FT_UInt start = FTC_GLYPH_FAMILY_START( gfam, gindex ); - - - gnode->item_start = (FT_UShort)start; - - len = gfam->item_total - start; - if ( len > gfam->item_count ) - len = gfam->item_count; - - gnode->item_count = (FT_UShort)len; - gfam->family.num_nodes++; + gnode->family = family; + gnode->gindex = gindex; + family->num_nodes++; } FT_EXPORT_DEF( void ) - ftc_glyph_node_done( FTC_GlyphNode gnode, - FTC_Cache cache ) + FTC_GNode_UnselectFamily( FTC_GNode gnode, + FTC_Cache cache ) + { + FTC_Family family = gnode->family; + + + gnode->family = NULL; + if ( family && --family->num_nodes <= 0 ) + FTC_MruList_Remove( &FTC_GCACHE( cache )->families, + (FTC_MruNode)family ); + } + + + FT_EXPORT_DEF( void ) + FTC_GNode_Done( FTC_GNode gnode, + FTC_Cache cache ) { /* finalize the node */ - gnode->item_count = 0; - gnode->item_start = 0; + gnode->gindex = 0; - ftc_node_done( FTC_NODE( gnode ), cache ); + FTC_GNode_UnselectFamily( gnode, cache ); } FT_EXPORT_DEF( FT_Bool ) - ftc_glyph_node_compare( FTC_GlyphNode gnode, - FTC_GlyphQuery gquery ) + FTC_GNode_Compare( FTC_GNode gnode, + FTC_GQuery gquery ) { - FT_UInt start = (FT_UInt)gnode->item_start; - FT_UInt count = (FT_UInt)gnode->item_count; + return FT_BOOL( gnode->family == gquery->family && + gnode->gindex == gquery->gindex ); + } - return FT_BOOL( (FT_UInt)( gquery->gindex - start ) < count ); + + FT_LOCAL_DEF( FT_Bool ) + ftc_gnode_compare( FTC_GNode gnode, + FTC_GQuery gquery ) + { + return FTC_GNode_Compare( gnode, gquery ); } @@ -79,36 +89,89 @@ /*************************************************************************/ /*************************************************************************/ + FT_EXPORT_DEF( void ) + FTC_Family_Init( FTC_Family family, + FTC_Cache cache ) + { + FTC_GCacheClass clazz = FTC_CACHE__GCACHE_CLASS( cache ); + + + family->clazz = clazz->family_class; + family->num_nodes = 0; + family->cache = cache; + } + FT_EXPORT_DEF( FT_Error ) - ftc_glyph_family_init( FTC_GlyphFamily gfam, - FT_UInt32 hash, - FT_UInt item_count, - FT_UInt item_total, - FTC_GlyphQuery gquery, - FTC_Cache cache ) + FTC_GCache_Init( FTC_GCache cache ) { - FT_Error error; + FT_Error error; - - error = ftc_family_init( FTC_FAMILY( gfam ), FTC_QUERY( gquery ), cache ); + error = FTC_Cache_Init( FTC_CACHE( cache ) ); if ( !error ) { - gfam->hash = hash; - gfam->item_total = item_total; - gfam->item_count = item_count; - - FTC_GLYPH_FAMILY_FOUND( gfam, gquery ); + FTC_GCacheClass clazz = (FTC_GCacheClass)FTC_CACHE( cache )->org_class; + + FTC_MruList_Init( &cache->families, + clazz->family_class, + 0, /* no maximum here! */ + cache, + FTC_CACHE( cache )->memory ); } return error; } - FT_EXPORT_DEF( void ) - ftc_glyph_family_done( FTC_GlyphFamily gfam ) + FT_LOCAL_DEF( FT_Error ) + ftc_gcache_init( FTC_GCache cache ) { - ftc_family_done( FTC_FAMILY( gfam ) ); + return FTC_GCache_Init( cache ); + } + + + FT_EXPORT_DEF( void ) + FTC_GCache_Done( FTC_GCache cache ) + { + FTC_Cache_Done( (FTC_Cache)cache ); + FTC_MruList_Done( &cache->families ); + } + + + FT_LOCAL_DEF( void ) + ftc_gcache_done( FTC_GCache cache ) + { + FTC_GCache_Done( cache ); + } + + + FT_EXPORT_DEF( FT_Error ) + FTC_GCache_New( FTC_Manager manager, + FTC_GCacheClass clazz, + FTC_GCache *acache ) + { + return FTC_Manager_RegisterCache( manager, (FTC_CacheClass)clazz, + (FTC_Cache*)acache ); + } + + + FT_EXPORT_DEF( FT_Error ) + FTC_GCache_Lookup( FTC_GCache cache, + FT_UInt32 hash, + FT_UInt gindex, + FTC_GQuery query, + FTC_Node *anode ) + { + FT_Error error; + + + query->gindex = gindex; + + FTC_MRULIST_LOOKUP( &cache->families, query, query->family, error ); + if ( !error ) + error = FTC_Cache_Lookup( FTC_CACHE( cache ), hash, query, anode ); + + return error; } diff --git a/reactos/lib/freetype/src/cache/ftcimage.c b/reactos/lib/freetype/src/cache/ftcimage.c index fa1b6ac7177..22a26ac47c3 100644 --- a/reactos/lib/freetype/src/cache/ftcimage.c +++ b/reactos/lib/freetype/src/cache/ftcimage.c @@ -4,7 +4,7 @@ /* */ /* FreeType Image cache (body). */ /* */ -/* Copyright 2000-2001 by */ +/* Copyright 2000-2001, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -18,133 +18,83 @@ #include <ft2build.h> #include FT_CACHE_H -#include FT_CACHE_IMAGE_H -#include FT_CACHE_INTERNAL_GLYPH_H +#include FT_CACHE_INTERNAL_IMAGE_H #include FT_INTERNAL_MEMORY_H +#include "ftccback.h" #include "ftcerror.h" - /* the FT_Glyph image node type */ - typedef struct FTC_ImageNodeRec_ - { - FTC_GlyphNodeRec gnode; - FT_Glyph glyph; - - } FTC_ImageNodeRec, *FTC_ImageNode; - - -#define FTC_IMAGE_NODE( x ) ( (FTC_ImageNode)( x ) ) -#define FTC_IMAGE_NODE_GINDEX( x ) FTC_GLYPH_NODE_GINDEX( x ) - - - /* the glyph image query */ - typedef struct FTC_ImageQueryRec_ - { - FTC_GlyphQueryRec gquery; - FTC_ImageTypeRec type; - - } FTC_ImageQueryRec, *FTC_ImageQuery; - - -#define FTC_IMAGE_QUERY( x ) ( (FTC_ImageQuery)( x ) ) - - - /* the glyph image set type */ - typedef struct FTC_ImageFamilyRec_ - { - FTC_GlyphFamilyRec gfam; - FTC_ImageTypeRec type; - - } FTC_ImageFamilyRec, *FTC_ImageFamily; - - -#define FTC_IMAGE_FAMILY( x ) ( (FTC_ImageFamily)( x ) ) -#define FTC_IMAGE_FAMILY_MEMORY( x ) FTC_GLYPH_FAMILY_MEMORY( &(x)->gfam ) - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GLYPH IMAGE NODES *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* finalize a given glyph image node */ - FT_CALLBACK_DEF( void ) - ftc_image_node_done( FTC_ImageNode inode, - FTC_Cache cache ) + FT_EXPORT_DEF( void ) + FTC_INode_Free( FTC_INode inode, + FTC_Cache cache ) { + FT_Memory memory = cache->memory; + + if ( inode->glyph ) { FT_Done_Glyph( inode->glyph ); inode->glyph = NULL; } - ftc_glyph_node_done( FTC_GLYPH_NODE( inode ), cache ); + FTC_GNode_Done( FTC_GNODE( inode ), cache ); + FT_FREE( inode ); + } + + + FT_LOCAL_DEF( void ) + ftc_inode_free( FTC_INode inode, + FTC_Cache cache ) + { + FTC_INode_Free( inode, cache ); } /* initialize a new glyph image node */ - FT_CALLBACK_DEF( FT_Error ) - ftc_image_node_init( FTC_ImageNode inode, - FTC_GlyphQuery gquery, - FTC_Cache cache ) + FT_EXPORT_DEF( FT_Error ) + FTC_INode_New( FTC_INode *pinode, + FTC_GQuery gquery, + FTC_Cache cache ) { - FTC_ImageFamily ifam = FTC_IMAGE_FAMILY( gquery->query.family ); - FT_Error error; - FT_Face face; - FT_Size size; + FT_Memory memory = cache->memory; + FT_Error error; + FTC_INode inode; - /* initialize its inner fields */ - ftc_glyph_node_init( FTC_GLYPH_NODE( inode ), - gquery->gindex, - FTC_GLYPH_FAMILY( ifam ) ); - - /* we will now load the glyph image */ - error = FTC_Manager_Lookup_Size( FTC_FAMILY( ifam )->cache->manager, - &ifam->type.font, - &face, &size ); - if ( !error ) + if ( !FT_NEW( inode ) ) { - FT_UInt gindex = FTC_GLYPH_NODE_GINDEX( inode ); + FTC_GNode gnode = FTC_GNODE( inode ); + FTC_Family family = gquery->family; + FT_UInt gindex = gquery->gindex; + FTC_IFamilyClass clazz = FTC_CACHE__IFAMILY_CLASS( cache ); - error = FT_Load_Glyph( face, gindex, ifam->type.flags ); - if ( !error ) - { - if ( face->glyph->format == FT_GLYPH_FORMAT_BITMAP || - face->glyph->format == FT_GLYPH_FORMAT_OUTLINE ) - { - /* ok, copy it */ - FT_Glyph glyph; + /* initialize its inner fields */ + FTC_GNode_Init( gnode, gindex, family ); - - error = FT_Get_Glyph( face->glyph, &glyph ); - if ( !error ) - { - inode->glyph = glyph; - goto Exit; - } - } - else - error = FTC_Err_Invalid_Argument; - } + /* we will now load the glyph image */ + error = clazz->family_load_glyph( family, gindex, cache, + &inode->glyph ); } - /* in case of error */ - ftc_glyph_node_done( FTC_GLYPH_NODE(inode), cache ); - - Exit: + *pinode = inode; return error; } - FT_CALLBACK_DEF( FT_ULong ) - ftc_image_node_weight( FTC_ImageNode inode ) + FT_LOCAL_DEF( FT_Error ) + ftc_inode_new( FTC_INode *pinode, + FTC_GQuery gquery, + FTC_Cache cache ) + { + return FTC_INode_New( pinode, gquery, cache ); + } + + + FT_EXPORT_DEF( FT_ULong ) + FTC_INode_Weight( FTC_INode inode ) { FT_ULong size = 0; FT_Glyph glyph = inode->glyph; @@ -185,214 +135,10 @@ } - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GLYPH IMAGE SETS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - FT_CALLBACK_DEF( FT_Error ) - ftc_image_family_init( FTC_ImageFamily ifam, - FTC_ImageQuery iquery, - FTC_Cache cache ) + FT_LOCAL_DEF( FT_ULong ) + ftc_inode_weight( FTC_INode inode ) { - FTC_Manager manager = cache->manager; - FT_Error error; - FT_Face face; - - - ifam->type = iquery->type; - - /* we need to compute "iquery.item_total" now */ - error = FTC_Manager_Lookup_Face( manager, - iquery->type.font.face_id, - &face ); - if ( !error ) - { - error = ftc_glyph_family_init( FTC_GLYPH_FAMILY( ifam ), - FTC_IMAGE_TYPE_HASH( &ifam->type ), - 1, - face->num_glyphs, - FTC_GLYPH_QUERY( iquery ), - cache ); - } - - return error; - } - - - FT_CALLBACK_DEF( FT_Bool ) - ftc_image_family_compare( FTC_ImageFamily ifam, - FTC_ImageQuery iquery ) - { - FT_Bool result; - - - result = FT_BOOL( FTC_IMAGE_TYPE_COMPARE( &ifam->type, &iquery->type ) ); - if ( result ) - FTC_GLYPH_FAMILY_FOUND( ifam, iquery ); - - return result; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** GLYPH IMAGE CACHE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - - FT_CALLBACK_TABLE_DEF - const FTC_Cache_ClassRec ftc_image_cache_class = - { - sizeof ( FTC_CacheRec ), - (FTC_Cache_InitFunc) ftc_cache_init, - (FTC_Cache_ClearFunc)ftc_cache_clear, - (FTC_Cache_DoneFunc) ftc_cache_done, - - sizeof ( FTC_ImageFamilyRec ), - (FTC_Family_InitFunc) ftc_image_family_init, - (FTC_Family_CompareFunc)ftc_image_family_compare, - (FTC_Family_DoneFunc) ftc_glyph_family_done, - - sizeof ( FTC_ImageNodeRec ), - (FTC_Node_InitFunc) ftc_image_node_init, - (FTC_Node_WeightFunc) ftc_image_node_weight, - (FTC_Node_CompareFunc)ftc_glyph_node_compare, - (FTC_Node_DoneFunc) ftc_image_node_done - }; - - - /* documentation is in ftcimage.h */ - - FT_EXPORT_DEF( FT_Error ) - FTC_ImageCache_New( FTC_Manager manager, - FTC_ImageCache *acache ) - { - return FTC_Manager_Register_Cache( - manager, - (FTC_Cache_Class)&ftc_image_cache_class, - FTC_CACHE_P( acache ) ); - } - - - /* documentation is in ftcimage.h */ - - FT_EXPORT_DEF( FT_Error ) - FTC_ImageCache_Lookup( FTC_ImageCache cache, - FTC_ImageType type, - FT_UInt gindex, - FT_Glyph *aglyph, - FTC_Node *anode ) - { - FTC_ImageQueryRec iquery; - FTC_ImageNode node; - FT_Error error; - - - /* some argument checks are delayed to ftc_cache_lookup */ - if ( !aglyph ) - return FTC_Err_Invalid_Argument; - - if ( anode ) - *anode = NULL; - - iquery.gquery.gindex = gindex; - iquery.type = *type; - - error = ftc_cache_lookup( FTC_CACHE( cache ), - FTC_QUERY( &iquery ), - (FTC_Node*)&node ); - if ( !error ) - { - *aglyph = node->glyph; - - if ( anode ) - { - *anode = (FTC_Node)node; - FTC_NODE( node )->ref_count++; - } - } - - return error; - } - - - /* backwards-compatibility functions */ - - FT_EXPORT_DEF( FT_Error ) - FTC_Image_Cache_New( FTC_Manager manager, - FTC_Image_Cache *acache ) - { - return FTC_ImageCache_New( manager, (FTC_ImageCache*)acache ); - } - - - FT_EXPORT_DEF( FT_Error ) - FTC_Image_Cache_Lookup( FTC_Image_Cache icache, - FTC_Image_Desc* desc, - FT_UInt gindex, - FT_Glyph *aglyph ) - { - FTC_ImageTypeRec type0; - - - if ( !desc ) - return FTC_Err_Invalid_Argument; - - type0.font = desc->font; - - /* convert image type flags to load flags */ - { - FT_UInt load_flags = FT_LOAD_DEFAULT; - FT_UInt type = desc->image_type; - - - /* determine load flags, depending on the font description's */ - /* image type */ - - if ( ftc_image_format( type ) == ftc_image_format_bitmap ) - { - if ( type & ftc_image_flag_monochrome ) - load_flags |= FT_LOAD_MONOCHROME; - - /* disable embedded bitmaps loading if necessary */ - if ( type & ftc_image_flag_no_sbits ) - load_flags |= FT_LOAD_NO_BITMAP; - } - else - { - /* we want an outline, don't load embedded bitmaps */ - load_flags |= FT_LOAD_NO_BITMAP; - - if ( type & ftc_image_flag_unscaled ) - load_flags |= FT_LOAD_NO_SCALE; - } - - /* always render glyphs to bitmaps */ - load_flags |= FT_LOAD_RENDER; - - if ( type & ftc_image_flag_unhinted ) - load_flags |= FT_LOAD_NO_HINTING; - - if ( type & ftc_image_flag_autohinted ) - load_flags |= FT_LOAD_FORCE_AUTOHINT; - - type0.flags = load_flags; - } - - return FTC_ImageCache_Lookup( (FTC_ImageCache)icache, - &type0, - gindex, - aglyph, - NULL ); + return FTC_INode_Weight( inode ); } diff --git a/reactos/lib/freetype/src/cache/ftcmanag.c b/reactos/lib/freetype/src/cache/ftcmanag.c index 7cdb8f9da77..9cc64891c4b 100644 --- a/reactos/lib/freetype/src/cache/ftcmanag.c +++ b/reactos/lib/freetype/src/cache/ftcmanag.c @@ -4,7 +4,7 @@ /* */ /* FreeType Cache Manager (body). */ /* */ -/* Copyright 2000-2001, 2002 by */ +/* Copyright 2000-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -18,8 +18,7 @@ #include <ft2build.h> #include FT_CACHE_H -#include FT_CACHE_MANAGER_H -#include FT_CACHE_INTERNAL_LRU_H +#include FT_CACHE_INTERNAL_MANAGER_H #include FT_INTERNAL_OBJECTS_H #include FT_INTERNAL_DEBUG_H #include FT_SIZES_H @@ -33,32 +32,171 @@ #define FTC_LRU_GET_MANAGER( lru ) ( (FTC_Manager)(lru)->user_data ) - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** FACE LRU IMPLEMENTATION *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct FTC_FaceNodeRec_* FTC_FaceNode; - typedef struct FTC_SizeNodeRec_* FTC_SizeNode; - - - typedef struct FTC_FaceNodeRec_ + static FT_Error + ftc_scaler_lookup_size( FTC_Manager manager, + FTC_Scaler scaler, + FT_Size *asize ) { - FT_LruNodeRec lru; - FT_Face face; + FT_Face face; + FT_Size size = NULL; + FT_Error error; - } FTC_FaceNodeRec; + + error = FTC_Manager_LookupFace( manager, scaler->face_id, &face ); + if ( error ) + goto Exit; + + error = FT_New_Size( face, &size ); + if ( error ) + goto Exit; + + FT_Activate_Size( size ); + + if ( scaler->pixel ) + error = FT_Set_Pixel_Sizes( face, scaler->width, scaler->height ); + else + error = FT_Set_Char_Size( face, scaler->width, scaler->height, + scaler->x_res, scaler->y_res ); + if ( error ) + { + FT_Done_Size( size ); + size = NULL; + } + + Exit: + *asize = size; + return error; + } typedef struct FTC_SizeNodeRec_ { - FT_LruNodeRec lru; - FT_Size size; + FTC_MruNodeRec node; + FT_Size size; + FTC_ScalerRec scaler; - } FTC_SizeNodeRec; + } FTC_SizeNodeRec, *FTC_SizeNode; + + + FT_CALLBACK_DEF( void ) + ftc_size_node_done( FTC_SizeNode node ) + { + FT_Size size = node->size; + + + if ( size ) + FT_Done_Size( size ); + } + + + FT_CALLBACK_DEF( FT_Bool ) + ftc_size_node_compare( FTC_SizeNode node, + FTC_Scaler scaler ) + { + FTC_Scaler scaler0 = &node->scaler; + + + if ( FTC_SCALER_COMPARE( scaler0, scaler ) ) + { + FT_Activate_Size( node->size ); + return 1; + } + return 0; + } + + + FT_CALLBACK_DEF( FT_Error ) + ftc_size_node_init( FTC_SizeNode node, + FTC_Scaler scaler, + FTC_Manager manager ) + { + node->scaler = scaler[0]; + + return ftc_scaler_lookup_size( manager, scaler, &node->size ); + } + + + FT_CALLBACK_DEF( FT_Error ) + ftc_size_node_reset( FTC_SizeNode node, + FTC_Scaler scaler, + FTC_Manager manager ) + { + FT_Done_Size( node->size ); + + node->scaler = scaler[0]; + + return ftc_scaler_lookup_size( manager, scaler, &node->size ); + } + + + FT_CALLBACK_TABLE_DEF + const FTC_MruListClassRec ftc_size_list_class = + { + sizeof( FTC_SizeNodeRec ), + (FTC_MruNode_CompareFunc)ftc_size_node_compare, + (FTC_MruNode_InitFunc) ftc_size_node_init, + (FTC_MruNode_ResetFunc) ftc_size_node_reset, + (FTC_MruNode_DoneFunc) ftc_size_node_done + }; + + + /* helper function used by ftc_face_node_done */ + static FT_Bool + ftc_size_node_compare_faceid( FTC_SizeNode node, + FTC_FaceID face_id ) + { + return FT_BOOL( node->scaler.face_id == face_id ); + } + + + FT_EXPORT_DEF( FT_Error ) + FTC_Manager_LookupSize( FTC_Manager manager, + FTC_Scaler scaler, + FT_Size *asize ) + { + FT_Error error; + FTC_SizeNode node; + + + if ( asize == NULL ) + return FTC_Err_Bad_Argument; + + *asize = NULL; + + if ( !manager ) + return FTC_Err_Invalid_Cache_Handle; + +#ifdef FTC_INLINE + + FTC_MRULIST_LOOKUP_CMP( &manager->sizes, scaler, ftc_size_node_compare, + node, error ); + +#else + error = FTC_MruList_Lookup( &manager->sizes, scaler, (FTC_MruNode*)&node ); +#endif + + if ( !error ) + *asize = node->size; + + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FACE MRU IMPLEMENTATION *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct FTC_FaceNodeRec_ + { + FTC_MruNodeRec node; + FTC_FaceID face_id; + FT_Face face; + + } FTC_FaceNodeRec, *FTC_FaceNode; FT_CALLBACK_DEF( FT_Error ) @@ -69,6 +207,8 @@ FT_Error error; + node->face_id = face_id; + error = manager->request_face( face_id, manager->library, manager->request_data, @@ -84,55 +224,50 @@ } - /* helper function for ftc_face_node_done() */ - FT_CALLBACK_DEF( FT_Bool ) - ftc_size_node_select( FTC_SizeNode node, - FT_Face face ) - { - return FT_BOOL( node->size->face == face ); - } - - FT_CALLBACK_DEF( void ) ftc_face_node_done( FTC_FaceNode node, FTC_Manager manager ) { - FT_Face face = node->face; - - - /* we must begin by removing all sizes for the target face */ - /* from the manager's list */ - FT_LruList_Remove_Selection( manager->sizes_list, - (FT_LruNode_SelectFunc)ftc_size_node_select, - face ); + /* we must begin by removing all scalers for the target face */ + /* from the manager's list */ + FTC_MruList_RemoveSelection( + & manager->sizes, + (FTC_MruNode_CompareFunc)ftc_size_node_compare_faceid, + node->face_id ); /* all right, we can discard the face now */ - FT_Done_Face( face ); - node->face = NULL; + FT_Done_Face( node->face ); + node->face = NULL; + node->face_id = NULL; + } + + + FT_CALLBACK_DEF( FT_Bool ) + ftc_face_node_compare( FTC_FaceNode node, + FTC_FaceID face_id ) + { + return FT_BOOL( node->face_id == face_id ); } FT_CALLBACK_TABLE_DEF - const FT_LruList_ClassRec ftc_face_list_class = + const FTC_MruListClassRec ftc_face_list_class = { - sizeof ( FT_LruListRec ), - (FT_LruList_InitFunc)0, - (FT_LruList_DoneFunc)0, + sizeof( FTC_FaceNodeRec), - sizeof ( FTC_FaceNodeRec ), - (FT_LruNode_InitFunc) ftc_face_node_init, - (FT_LruNode_DoneFunc) ftc_face_node_done, - (FT_LruNode_FlushFunc) 0, /* no flushing needed */ - (FT_LruNode_CompareFunc)0, /* direct comparison of FTC_FaceID handles */ + (FTC_MruNode_CompareFunc)ftc_face_node_compare, + (FTC_MruNode_InitFunc) ftc_face_node_init, + (FTC_MruNode_ResetFunc) NULL, + (FTC_MruNode_DoneFunc) ftc_face_node_done }; /* documentation is in ftcache.h */ FT_EXPORT_DEF( FT_Error ) - FTC_Manager_Lookup_Face( FTC_Manager manager, - FTC_FaceID face_id, - FT_Face *aface ) + FTC_Manager_LookupFace( FTC_Manager manager, + FTC_FaceID face_id, + FT_Face *aface ) { FT_Error error; FTC_FaceNode node; @@ -146,9 +281,16 @@ if ( !manager ) return FTC_Err_Invalid_Cache_Handle; - error = FT_LruList_Lookup( manager->faces_list, - (FT_LruKey)face_id, - (FT_LruNode*)&node ); + /* we break encapsulation for the sake of speed */ +#ifdef FTC_INLINE + + FTC_MRULIST_LOOKUP_CMP( &manager->faces, face_id, ftc_face_node_compare, + node, error ); + +#else + error = FTC_MruList_Lookup( &manager->faces, face_id, (FTC_MruNode*)&node ); +#endif + if ( !error ) *aface = node->face; @@ -156,283 +298,6 @@ } - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** SIZES LRU IMPLEMENTATION *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - typedef struct FTC_SizeQueryRec_ - { - FT_Face face; - FT_UInt width; - FT_UInt height; - - } FTC_SizeQueryRec, *FTC_SizeQuery; - - - FT_CALLBACK_DEF( FT_Error ) - ftc_size_node_init( FTC_SizeNode node, - FTC_SizeQuery query ) - { - FT_Face face = query->face; - FT_Size size; - FT_Error error; - - - node->size = NULL; - error = FT_New_Size( face, &size ); - if ( !error ) - { - FT_Activate_Size( size ); - error = FT_Set_Pixel_Sizes( query->face, - query->width, - query->height ); - if ( error ) - FT_Done_Size( size ); - else - node->size = size; - } - return error; - } - - - FT_CALLBACK_DEF( void ) - ftc_size_node_done( FTC_SizeNode node ) - { - if ( node->size ) - { - FT_Done_Size( node->size ); - node->size = NULL; - } - } - - - FT_CALLBACK_DEF( FT_Error ) - ftc_size_node_flush( FTC_SizeNode node, - FTC_SizeQuery query ) - { - FT_Size size = node->size; - FT_Error error; - - - if ( size->face == query->face ) - { - FT_Activate_Size( size ); - error = FT_Set_Pixel_Sizes( query->face, query->width, query->height ); - if ( error ) - { - FT_Done_Size( size ); - node->size = NULL; - } - } - else - { - FT_Done_Size( size ); - node->size = NULL; - - error = ftc_size_node_init( node, query ); - } - return error; - } - - - FT_CALLBACK_DEF( FT_Bool ) - ftc_size_node_compare( FTC_SizeNode node, - FTC_SizeQuery query ) - { - FT_Size size = node->size; - - - return FT_BOOL( size->face == query->face && - (FT_UInt)size->metrics.x_ppem == query->width && - (FT_UInt)size->metrics.y_ppem == query->height ); - } - - - FT_CALLBACK_TABLE_DEF - const FT_LruList_ClassRec ftc_size_list_class = - { - sizeof ( FT_LruListRec ), - (FT_LruList_InitFunc)0, - (FT_LruList_DoneFunc)0, - - sizeof ( FTC_SizeNodeRec ), - (FT_LruNode_InitFunc) ftc_size_node_init, - (FT_LruNode_DoneFunc) ftc_size_node_done, - (FT_LruNode_FlushFunc) ftc_size_node_flush, - (FT_LruNode_CompareFunc)ftc_size_node_compare - }; - - - /* documentation is in ftcache.h */ - - FT_EXPORT_DEF( FT_Error ) - FTC_Manager_Lookup_Size( FTC_Manager manager, - FTC_Font font, - FT_Face *aface, - FT_Size *asize ) - { - FT_Error error; - - - /* check for valid `manager' delayed to FTC_Manager_Lookup_Face() */ - if ( aface ) - *aface = 0; - - if ( asize ) - *asize = 0; - - error = FTC_Manager_Lookup_Face( manager, font->face_id, aface ); - if ( !error ) - { - FTC_SizeQueryRec query; - FTC_SizeNode node; - - - query.face = *aface; - query.width = font->pix_width; - query.height = font->pix_height; - - error = FT_LruList_Lookup( manager->sizes_list, - (FT_LruKey)&query, - (FT_LruNode*)&node ); - if ( !error ) - { - /* select the size as the current one for this face */ - FT_Activate_Size( node->size ); - - if ( asize ) - *asize = node->size; - } - } - - return error; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** SET TABLE MANAGEMENT *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - static void - ftc_family_table_init( FTC_FamilyTable table ) - { - table->count = 0; - table->size = 0; - table->entries = NULL; - table->free = FTC_FAMILY_ENTRY_NONE; - } - - - static void - ftc_family_table_done( FTC_FamilyTable table, - FT_Memory memory ) - { - FT_FREE( table->entries ); - table->free = 0; - table->count = 0; - table->size = 0; - } - - - FT_EXPORT_DEF( FT_Error ) - ftc_family_table_alloc( FTC_FamilyTable table, - FT_Memory memory, - FTC_FamilyEntry *aentry ) - { - FTC_FamilyEntry entry; - FT_Error error = 0; - - - /* re-allocate table size when needed */ - if ( table->free == FTC_FAMILY_ENTRY_NONE && table->count >= table->size ) - { - FT_UInt old_size = table->size; - FT_UInt new_size, idx; - - - if ( old_size == 0 ) - new_size = 8; - else - { - new_size = old_size * 2; - - /* check for (unlikely) overflow */ - if ( new_size < old_size ) - new_size = 65534; - } - - if ( FT_RENEW_ARRAY( table->entries, old_size, new_size ) ) - return error; - - table->size = new_size; - - entry = table->entries + old_size; - table->free = old_size; - - for ( idx = old_size; idx + 1 < new_size; idx++, entry++ ) - { - entry->link = idx + 1; - entry->index = idx; - } - - entry->link = FTC_FAMILY_ENTRY_NONE; - entry->index = idx; - } - - if ( table->free != FTC_FAMILY_ENTRY_NONE ) - { - entry = table->entries + table->free; - table->free = entry->link; - } - else if ( table->count < table->size ) - { - entry = table->entries + table->count++; - } - else - { - FT_ERROR(( "ftc_family_table_alloc: internal bug!" )); - return FTC_Err_Invalid_Argument; - } - - entry->link = FTC_FAMILY_ENTRY_NONE; - table->count++; - - *aentry = entry; - return error; - } - - - FT_EXPORT_DEF( void ) - ftc_family_table_free( FTC_FamilyTable table, - FT_UInt idx ) - { - /* simply add it to the linked list of free entries */ - if ( idx < table->count ) - { - FTC_FamilyEntry entry = table->entries + idx; - - - if ( entry->link != FTC_FAMILY_ENTRY_NONE ) - FT_ERROR(( "ftc_family_table_free: internal bug!\n" )); - else - { - entry->link = table->free; - table->free = entry->index; - table->count--; - } - } - } - - /*************************************************************************/ /*************************************************************************/ /***** *****/ @@ -475,41 +340,28 @@ if ( max_bytes == 0 ) max_bytes = FTC_MAX_BYTES_DEFAULT; - error = FT_LruList_New( &ftc_face_list_class, - max_faces, - manager, - memory, - &manager->faces_list ); - if ( error ) - goto Exit; - - error = FT_LruList_New( &ftc_size_list_class, - max_sizes, - manager, - memory, - &manager->sizes_list ); - if ( error ) - goto Exit; - manager->library = library; + manager->memory = memory; manager->max_weight = max_bytes; - manager->cur_weight = 0; manager->request_face = requester; manager->request_data = req_data; - ftc_family_table_init( &manager->families ); + FTC_MruList_Init( &manager->faces, + &ftc_face_list_class, + max_faces, + manager, + memory ); + + FTC_MruList_Init( &manager->sizes, + &ftc_size_list_class, + max_sizes, + manager, + memory ); *amanager = manager; Exit: - if ( error && manager ) - { - FT_LruList_Destroy( manager->faces_list ); - FT_LruList_Destroy( manager->sizes_list ); - FT_FREE( manager ); - } - return error; } @@ -526,31 +378,29 @@ if ( !manager || !manager->library ) return; - memory = manager->library->memory; + memory = manager->memory; /* now discard all caches */ - for (idx = 0; idx < FTC_MAX_CACHES; idx++ ) + for (idx = manager->num_caches; idx-- > 0; ) { FTC_Cache cache = manager->caches[idx]; if ( cache ) { - cache->clazz->cache_done( cache ); + cache->clazz.cache_done( cache ); FT_FREE( cache ); - manager->caches[idx] = 0; + manager->caches[idx] = NULL; } } - - /* discard families table */ - ftc_family_table_done( &manager->families, memory ); + manager->num_caches = 0; /* discard faces and sizes */ - FT_LruList_Destroy( manager->faces_list ); - manager->faces_list = 0; + FTC_MruList_Done( &manager->sizes ); + FTC_MruList_Done( &manager->faces ); - FT_LruList_Destroy( manager->sizes_list ); - manager->sizes_list = 0; + manager->library = NULL; + manager->memory = NULL; FT_FREE( manager ); } @@ -563,8 +413,8 @@ { if ( manager ) { - FT_LruList_Reset( manager->sizes_list ); - FT_LruList_Reset( manager->faces_list ); + FTC_MruList_Reset( &manager->sizes ); + FTC_MruList_Reset( &manager->faces ); } /* XXX: FIXME: flush the caches? */ } @@ -576,7 +426,7 @@ FTC_Manager_Check( FTC_Manager manager ) { FTC_Node node, first; - + first = manager->nodes_list; @@ -584,26 +434,22 @@ if ( first ) { FT_ULong weight = 0; - + node = first; do { - FTC_FamilyEntry entry = manager->families.entries + node->fam_index; - FTC_Cache cache; + FTC_Cache cache = manager->caches[node->cache_index]; - if ( (FT_UInt)node->fam_index >= manager->families.count || - entry->link != FTC_FAMILY_ENTRY_NONE ) - FT_ERROR(( "FTC_Manager_Check: invalid node (family index = %ld\n", - node->fam_index )); + + if ( (FT_UInt)node->cache_index >= manager->num_caches ) + FT_ERROR(( "FTC_Manager_Check: invalid node (cache index = %ld\n", + node->cache_index )); else - { - cache = entry->cache; - weight += cache->clazz->node_weight( node, cache ); - } + weight += cache->clazz.node_weight( node, cache ); - node = node->mru_next; + node = FTC_NODE__NEXT( node ); } while ( node != first ); @@ -622,7 +468,7 @@ do { count++; - node = node->mru_next; + node = FTC_NODE__NEXT( node ); } while ( node != first ); @@ -664,14 +510,14 @@ if ( manager->cur_weight < manager->max_weight || first == NULL ) return; - /* go to last node - it's a circular list */ - node = first->mru_prev; + /* go to last node -- it's a circular list */ + node = FTC_NODE__PREV( first ); do { - FTC_Node prev = node->mru_prev; + FTC_Node prev; - prev = ( node == first ) ? NULL : node->mru_prev; + prev = ( node == first ) ? NULL : FTC_NODE__PREV( node ); if ( node->ref_count <= 0 ) ftc_node_destroy( node, manager ); @@ -685,9 +531,9 @@ /* documentation is in ftcmanag.h */ FT_EXPORT_DEF( FT_Error ) - FTC_Manager_Register_Cache( FTC_Manager manager, - FTC_Cache_Class clazz, - FTC_Cache *acache ) + FTC_Manager_RegisterCache( FTC_Manager manager, + FTC_CacheClass clazz, + FTC_Cache *acache ) { FT_Error error = FTC_Err_Invalid_Argument; FTC_Cache cache = NULL; @@ -695,50 +541,37 @@ if ( manager && clazz && acache ) { - FT_Memory memory = manager->library->memory; - FT_UInt idx = 0; + FT_Memory memory = manager->memory; - /* check for an empty cache slot in the manager's table */ - for ( idx = 0; idx < FTC_MAX_CACHES; idx++ ) - { - if ( manager->caches[idx] == 0 ) - break; - } - - /* return an error if there are too many registered caches */ - if ( idx >= FTC_MAX_CACHES ) + if ( manager->num_caches >= FTC_MAX_CACHES ) { error = FTC_Err_Too_Many_Caches; - FT_ERROR(( "FTC_Manager_Register_Cache:" )); - FT_ERROR(( " too many registered caches\n" )); + FT_ERROR(( "%s: too many registered caches\n", + "FTC_Manager_Register_Cache" )); goto Exit; } if ( !FT_ALLOC( cache, clazz->cache_size ) ) { - cache->manager = manager; - cache->memory = memory; - cache->clazz = clazz; + cache->manager = manager; + cache->memory = memory; + cache->clazz = clazz[0]; + cache->org_class = clazz; /* THIS IS VERY IMPORTANT! IT WILL WRETCH THE MANAGER */ /* IF IT IS NOT SET CORRECTLY */ - cache->cache_index = idx; + cache->index = manager->num_caches; - if ( clazz->cache_init ) + error = clazz->cache_init( cache ); + if ( error ) { - error = clazz->cache_init( cache ); - if ( error ) - { - if ( clazz->cache_done ) - clazz->cache_done( cache ); - - FT_FREE( cache ); - goto Exit; - } + clazz->cache_done( cache ); + FT_FREE( cache ); + goto Exit; } - manager->caches[idx] = cache; + manager->caches[manager->num_caches++] = cache; } } @@ -748,17 +581,66 @@ } + FT_EXPORT_DEF( FT_UInt ) + FTC_Manager_FlushN( FTC_Manager manager, + FT_UInt count ) + { + FTC_Node first = manager->nodes_list; + FTC_Node node; + FT_UInt result; + + + /* try to remove `count' nodes from the list */ + if ( first == NULL ) /* empty list! */ + return 0; + + /* go to last node - it's a circular list */ + node = FTC_NODE__PREV(first); + for ( result = 0; result < count; ) + { + FTC_Node prev = FTC_NODE__PREV( node ); + + + /* don't touch locked nodes */ + if ( node->ref_count <= 0 ) + { + ftc_node_destroy( node, manager ); + result++; + } + + if ( prev == manager->nodes_list ) + break; + + node = prev; + } + return result; + } + + + FT_EXPORT_DEF( void ) + FTC_Manager_RemoveFaceID( FTC_Manager manager, + FTC_FaceID face_id ) + { + FT_UInt nn; + + /* this will remove all FTC_SizeNode that correspond to + * the face_id as well + */ + FTC_MruList_RemoveSelection( &manager->faces, NULL, face_id ); + + for ( nn = 0; nn < manager->num_caches; nn++ ) + FTC_Cache_RemoveFaceID( manager->caches[nn], face_id ); + } + + /* documentation is in ftcmanag.h */ FT_EXPORT_DEF( void ) FTC_Node_Unref( FTC_Node node, FTC_Manager manager ) { - if ( node && (FT_UInt)node->fam_index < manager->families.count && - manager->families.entries[node->fam_index].cache ) - { + if ( node && (FT_UInt)node->cache_index < manager->num_caches ) node->ref_count--; - } } diff --git a/reactos/lib/freetype/src/cache/ftcmru.c b/reactos/lib/freetype/src/cache/ftcmru.c new file mode 100644 index 00000000000..d4f733a110f --- /dev/null +++ b/reactos/lib/freetype/src/cache/ftcmru.c @@ -0,0 +1,355 @@ +/***************************************************************************/ +/* */ +/* ftcmru.c */ +/* */ +/* FreeType MRU support (body). */ +/* */ +/* Copyright 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_CACHE_H +#include FT_CACHE_INTERNAL_MRU_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H + +#include "ftcerror.h" + + + FT_EXPORT_DEF( void ) + FTC_MruNode_Prepend( FTC_MruNode *plist, + FTC_MruNode node ) + { + FTC_MruNode first = *plist; + + + if ( first ) + { + FTC_MruNode last = first->prev; + + +#ifdef FT_DEBUG_ERROR + { + FTC_MruNode cnode = first; + + + do + { + if ( cnode == node ) + { + fprintf( stderr, "FTC_MruNode_Prepend: invalid action!\n" ); + exit( 2 ); + } + cnode = cnode->next; + + } while ( cnode != first ); + } +#endif + + first->prev = node; + last->next = node; + node->next = first; + node->prev = last; + } + else + { + node->next = node; + node->prev = node; + } + *plist = node; + } + + + FT_EXPORT_DEF( void ) + FTC_MruNode_Up( FTC_MruNode *plist, + FTC_MruNode node ) + { + FTC_MruNode first = *plist; + + + FT_ASSERT( first != NULL ); + + if ( first != node ) + { + FTC_MruNode prev, next, last; + + +#ifdef FT_DEBUG_ERROR + { + FTC_MruNode cnode = first; + do + { + if ( cnode == node ) + goto Ok; + cnode = cnode->next; + + } while ( cnode != first ); + + fprintf( stderr, "FTC_MruNode_Up: invalid action!\n" ); + exit( 2 ); + Ok: + } +#endif + prev = node->prev; + next = node->next; + + prev->next = next; + next->prev = prev; + + last = first->prev; + + last->next = node; + first->prev = node; + + node->next = first; + node->prev = last; + + *plist = node; + } + } + + + FT_EXPORT_DEF( void ) + FTC_MruNode_Remove( FTC_MruNode *plist, + FTC_MruNode node ) + { + FTC_MruNode first = *plist; + FTC_MruNode prev, next; + + + FT_ASSERT( first != NULL ); + +#ifdef FT_DEBUG_ERROR + { + FTC_MruNode cnode = first; + + + do + { + if ( cnode == node ) + goto Ok; + cnode = cnode->next; + + } while ( cnode != first ); + + fprintf( stderr, "FTC_MruNode_Remove: invalid action!\n" ); + exit( 2 ); + Ok: + } +#endif + + prev = node->prev; + next = node->next; + + prev->next = next; + next->prev = prev; + + if ( node == next ) + { + FT_ASSERT( first == node ); + FT_ASSERT( prev == node ); + + *plist = NULL; + } + else if ( node == first ) + *plist = next; + } + + + FT_EXPORT_DEF( void ) + FTC_MruList_Init( FTC_MruList list, + FTC_MruListClass clazz, + FT_UInt max_nodes, + FT_Pointer data, + FT_Memory memory ) + { + list->num_nodes = 0; + list->max_nodes = max_nodes; + list->nodes = NULL; + list->clazz = *clazz; + list->data = data; + list->memory = memory; + } + + + FT_EXPORT( void ) + FTC_MruList_Reset( FTC_MruList list ) + { + while ( list->nodes ) + FTC_MruList_Remove( list, list->nodes ); + + FT_ASSERT( list->num_nodes == 0 ); + } + + + FT_EXPORT( void ) + FTC_MruList_Done( FTC_MruList list ) + { + FTC_MruList_Reset( list ); + } + + + FT_EXPORT_DEF( FTC_MruNode ) + FTC_MruList_Find( FTC_MruList list, + FT_Pointer key ) + { + FTC_MruNode_CompareFunc compare = list->clazz.node_compare; + FTC_MruNode first, node; + + + first = list->nodes; + node = NULL; + + if ( first ) + { + node = first; + do + { + if ( compare( node, key ) ) + { + if ( node != first ) + FTC_MruNode_Up( &list->nodes, node ); + + return node; + } + + node = node->next; + + } while ( node != first); + } + + return NULL; + } + + + FT_EXPORT_DEF( FT_Error ) + FTC_MruList_New( FTC_MruList list, + FT_Pointer key, + FTC_MruNode *anode ) + { + FT_Error error; + FTC_MruNode node; + FT_Memory memory = list->memory; + + + if ( list->num_nodes >= list->max_nodes && list->max_nodes > 0 ) + { + node = list->nodes->prev; + + FT_ASSERT( node ); + + if ( list->clazz.node_reset ) + { + FTC_MruNode_Up( &list->nodes, node ); + + error = list->clazz.node_reset( node, key, list->data ); + if ( !error ) + goto Exit; + } + + FTC_MruNode_Remove( &list->nodes, node ); + list->num_nodes--; + + if ( list->clazz.node_done ) + list->clazz.node_done( node, list->data ); + } + else if ( FT_ALLOC( node, list->clazz.node_size ) ) + goto Exit; + + error = list->clazz.node_init( node, key, list->data ); + if ( error ) + goto Fail; + + FTC_MruNode_Prepend( &list->nodes, node ); + list->num_nodes++; + + Exit: + *anode = node; + return error; + + Fail: + if ( list->clazz.node_done ) + list->clazz.node_done( node, list->data ); + + FT_FREE( node ); + goto Exit; + } + + + FT_EXPORT( FT_Error ) + FTC_MruList_Lookup( FTC_MruList list, + FT_Pointer key, + FTC_MruNode *anode ) + { + FTC_MruNode node; + + + node = FTC_MruList_Find( list, key ); + if ( node == NULL ) + return FTC_MruList_New( list, key, anode ); + + *anode = node; + return 0; + } + + + FT_EXPORT_DEF( void ) + FTC_MruList_Remove( FTC_MruList list, + FTC_MruNode node ) + { + FTC_MruNode_Remove( &list->nodes, node ); + list->num_nodes--; + + { + FT_Memory memory = list->memory; + + + if ( list->clazz.node_done ) + list->clazz.node_done( node, list->data ); + + FT_FREE( node ); + } + } + + + FT_EXPORT_DEF( void ) + FTC_MruList_RemoveSelection( FTC_MruList list, + FTC_MruNode_CompareFunc selection, + FT_Pointer key ) + { + FTC_MruNode first, node, next; + + + first = list->nodes; + while ( first && ( selection == NULL || selection( first, key ) ) ) + { + FTC_MruList_Remove( list, first ); + first = list->nodes; + } + + if ( first ) + { + node = first->next; + while ( node != first ) + { + next = node->next; + + if ( selection( node, key ) ) + FTC_MruList_Remove( list, node ); + + node = next; + } + } + } + + +/* END */ diff --git a/reactos/lib/freetype/src/cache/ftcsbits.c b/reactos/lib/freetype/src/cache/ftcsbits.c index 2faf80f33ed..6af5c7ee6bd 100644 --- a/reactos/lib/freetype/src/cache/ftcsbits.c +++ b/reactos/lib/freetype/src/cache/ftcsbits.c @@ -4,7 +4,7 @@ /* */ /* FreeType sbits manager (body). */ /* */ -/* Copyright 2000-2001, 2002, 2003 by */ +/* Copyright 2000-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -18,57 +18,15 @@ #include <ft2build.h> #include FT_CACHE_H -#include FT_CACHE_SMALL_BITMAPS_H -#include FT_CACHE_INTERNAL_GLYPH_H +#include FT_CACHE_INTERNAL_SBITS_H #include FT_INTERNAL_OBJECTS_H #include FT_INTERNAL_DEBUG_H #include FT_ERRORS_H +#include "ftccback.h" #include "ftcerror.h" -#define FTC_SBIT_ITEMS_PER_NODE 16 - - - typedef struct FTC_SBitNodeRec_* FTC_SBitNode; - - typedef struct FTC_SBitNodeRec_ - { - FTC_GlyphNodeRec gnode; - FTC_SBitRec sbits[FTC_SBIT_ITEMS_PER_NODE]; - - } FTC_SBitNodeRec; - - -#define FTC_SBIT_NODE( x ) ( (FTC_SBitNode)( x ) ) - - - typedef struct FTC_SBitQueryRec_ - { - FTC_GlyphQueryRec gquery; - FTC_ImageTypeRec type; - - } FTC_SBitQueryRec, *FTC_SBitQuery; - - -#define FTC_SBIT_QUERY( x ) ( (FTC_SBitQuery)( x ) ) - - - typedef struct FTC_SBitFamilyRec_* FTC_SBitFamily; - - /* sbit family structure */ - typedef struct FTC_SBitFamilyRec_ - { - FTC_GlyphFamilyRec gfam; - FTC_ImageTypeRec type; - - } FTC_SBitFamilyRec; - - -#define FTC_SBIT_FAMILY( x ) ( (FTC_SBitFamily)( x ) ) -#define FTC_SBIT_FAMILY_MEMORY( x ) FTC_GLYPH_FAMILY_MEMORY( &( x )->cset ) - - /*************************************************************************/ /*************************************************************************/ /***** *****/ @@ -100,174 +58,210 @@ } - FT_CALLBACK_DEF( void ) - ftc_sbit_node_done( FTC_SBitNode snode, - FTC_Cache cache ) + FT_EXPORT_DEF( void ) + FTC_SNode_Free( FTC_SNode snode, + FTC_Cache cache ) { FTC_SBit sbit = snode->sbits; - FT_UInt count = FTC_GLYPH_NODE( snode )->item_count; + FT_UInt count = snode->count; FT_Memory memory = cache->memory; for ( ; count > 0; sbit++, count-- ) FT_FREE( sbit->buffer ); - ftc_glyph_node_done( FTC_GLYPH_NODE( snode ), cache ); + FTC_GNode_Done( FTC_GNODE( snode ), cache ); + + FT_FREE( snode ); + } + + + FT_LOCAL_DEF( void ) + ftc_snode_free( FTC_SNode snode, + FTC_Cache cache ) + { + FTC_SNode_Free( snode, cache ); } static FT_Error - ftc_sbit_node_load( FTC_SBitNode snode, - FTC_Manager manager, - FTC_SBitFamily sfam, - FT_UInt gindex, - FT_ULong *asize ) + ftc_snode_load( FTC_SNode snode, + FTC_Manager manager, + FT_UInt gindex, + FT_ULong *asize ) { - FT_Error error; - FTC_GlyphNode gnode = FTC_GLYPH_NODE( snode ); - FT_Memory memory; - FT_Face face; - FT_Size size; - FTC_SBit sbit; + FT_Error error; + FTC_GNode gnode = FTC_GNODE( snode ); + FTC_Family family = gnode->family; + FT_Memory memory = manager->memory; + FT_Face face; + FTC_SBit sbit; + FTC_SFamilyClass clazz; - if ( gindex < (FT_UInt)gnode->item_start || - gindex >= (FT_UInt)gnode->item_start + gnode->item_count ) + if ( (FT_UInt)(gindex - gnode->gindex) >= snode->count ) { - FT_ERROR(( "ftc_sbit_node_load: invalid glyph index" )); + FT_ERROR(( "ftc_snode_load: invalid glyph index" )); return FTC_Err_Invalid_Argument; } - memory = manager->library->memory; + sbit = snode->sbits + ( gindex - gnode->gindex ); + clazz = (FTC_SFamilyClass)family->clazz; - sbit = snode->sbits + ( gindex - gnode->item_start ); + sbit->buffer = 0; + + error = clazz->family_load_glyph( family, gindex, manager, &face ); + if ( error ) + goto BadGlyph; - error = FTC_Manager_Lookup_Size( manager, &sfam->type.font, - &face, &size ); - if ( !error ) { - /* by default, indicates a `missing' glyph */ - sbit->buffer = 0; + FT_Int temp; + FT_GlyphSlot slot = face->glyph; + FT_Bitmap* bitmap = &slot->bitmap; + FT_Int xadvance, yadvance; - error = FT_Load_Glyph( face, gindex, sfam->type.flags | FT_LOAD_RENDER ); - if ( !error ) + + if ( slot->format != FT_GLYPH_FORMAT_BITMAP ) { - FT_Int temp; - FT_GlyphSlot slot = face->glyph; - FT_Bitmap* bitmap = &slot->bitmap; - FT_Int xadvance, yadvance; + FT_ERROR(( "%s: glyph loaded didn't return a bitmap!\n", + "ftc_snode_load" )); + goto BadGlyph; + } - - /* check that our values fit into 8-bit containers! */ - /* If this is not the case, our bitmap is too large */ - /* and we will leave it as `missing' with sbit.buffer = 0 */ + /* Check that our values fit into 8-bit containers! */ + /* If this is not the case, our bitmap is too large */ + /* and we will leave it as `missing' with sbit.buffer = 0 */ #define CHECK_CHAR( d ) ( temp = (FT_Char)d, temp == d ) #define CHECK_BYTE( d ) ( temp = (FT_Byte)d, temp == d ) - /* XXX: FIXME: add support for vertical layouts maybe */ + /* horizontal advance in pixels */ + xadvance = ( slot->metrics.horiAdvance + 32 ) >> 6; + yadvance = ( slot->metrics.vertAdvance + 32 ) >> 6; - /* horizontal advance in pixels */ - xadvance = ( slot->metrics.horiAdvance + 32 ) >> 6; - yadvance = ( slot->metrics.vertAdvance + 32 ) >> 6; + if ( !CHECK_BYTE( bitmap->rows ) || + !CHECK_BYTE( bitmap->width ) || + !CHECK_CHAR( bitmap->pitch ) || + !CHECK_CHAR( slot->bitmap_left ) || + !CHECK_CHAR( slot->bitmap_top ) || + !CHECK_CHAR( xadvance ) || + !CHECK_CHAR( yadvance ) ) + goto BadGlyph; - if ( CHECK_BYTE( bitmap->rows ) && - CHECK_BYTE( bitmap->width ) && - CHECK_CHAR( bitmap->pitch ) && - CHECK_CHAR( slot->bitmap_left ) && - CHECK_CHAR( slot->bitmap_top ) && - CHECK_CHAR( xadvance ) && - CHECK_CHAR( yadvance ) ) - { - sbit->width = (FT_Byte)bitmap->width; - sbit->height = (FT_Byte)bitmap->rows; - sbit->pitch = (FT_Char)bitmap->pitch; - sbit->left = (FT_Char)slot->bitmap_left; - sbit->top = (FT_Char)slot->bitmap_top; - sbit->xadvance = (FT_Char)xadvance; - sbit->yadvance = (FT_Char)yadvance; - sbit->format = (FT_Byte)bitmap->pixel_mode; - sbit->max_grays = (FT_Byte)(bitmap->num_grays - 1); + sbit->width = (FT_Byte)bitmap->width; + sbit->height = (FT_Byte)bitmap->rows; + sbit->pitch = (FT_Char)bitmap->pitch; + sbit->left = (FT_Char)slot->bitmap_left; + sbit->top = (FT_Char)slot->bitmap_top; + sbit->xadvance = (FT_Char)xadvance; + sbit->yadvance = (FT_Char)yadvance; + sbit->format = (FT_Byte)bitmap->pixel_mode; + sbit->max_grays = (FT_Byte)(bitmap->num_grays - 1); -#if 0 /* this doesn't work well with embedded bitmaps */ + /* copy the bitmap into a new buffer -- ignore error */ + error = ftc_sbit_copy_bitmap( sbit, bitmap, memory ); - /* grab the bitmap when possible - this is a hack! */ - if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) - { - slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; - sbit->buffer = bitmap->buffer; - } - else -#endif - { - /* copy the bitmap into a new buffer -- ignore error */ - error = ftc_sbit_copy_bitmap( sbit, bitmap, memory ); - } + /* now, compute size */ + if ( asize ) + *asize = FT_ABS( sbit->pitch ) * sbit->height; - /* now, compute size */ - if ( asize ) - *asize = ABS( sbit->pitch ) * sbit->height; + } /* glyph loading successful */ - } /* glyph dimensions ok */ - - } /* glyph loading successful */ - - /* ignore the errors that might have occurred -- */ - /* we mark unloaded glyphs with `sbit.buffer == 0' */ - /* and 'width == 255', 'height == 0' */ - /* */ - if ( error && error != FTC_Err_Out_Of_Memory ) - { - sbit->width = 255; - error = 0; - /* sbit->buffer == NULL too! */ - } + /* ignore the errors that might have occurred -- */ + /* we mark unloaded glyphs with `sbit.buffer == 0' */ + /* and `width == 255', `height == 0' */ + /* */ + if ( error && error != FTC_Err_Out_Of_Memory ) + { + BadGlyph: + sbit->width = 255; + sbit->height = 0; + sbit->buffer = NULL; + error = 0; + if ( asize ) + *asize = 0; } return error; } - FT_CALLBACK_DEF( FT_Error ) - ftc_sbit_node_init( FTC_SBitNode snode, - FTC_GlyphQuery gquery, - FTC_Cache cache ) + FT_EXPORT_DEF( FT_Error ) + FTC_SNode_New( FTC_SNode *psnode, + FTC_GQuery gquery, + FTC_Cache cache ) { - FT_Error error; + FT_Memory memory = cache->memory; + FT_Error error; + FTC_SNode snode = NULL; + FT_UInt gindex = gquery->gindex; + FTC_Family family = gquery->family; + + FTC_SFamilyClass clazz = FTC_CACHE__SFAMILY_CLASS( cache ); + FT_UInt total; - ftc_glyph_node_init( FTC_GLYPH_NODE( snode ), - gquery->gindex, - FTC_GLYPH_FAMILY( gquery->query.family ) ); + total = clazz->family_get_count( family, cache->manager ); + if ( total == 0 || gindex >= total ) + { + error = FT_Err_Invalid_Argument; + goto Exit; + } - error = ftc_sbit_node_load( snode, - cache->manager, - FTC_SBIT_FAMILY( FTC_QUERY( gquery )->family ), - gquery->gindex, - NULL ); - if ( error ) - ftc_glyph_node_done( FTC_GLYPH_NODE( snode ), cache ); + if ( !FT_NEW( snode ) ) + { + FT_UInt count, start; + + start = gindex - ( gindex % FTC_SBIT_ITEMS_PER_NODE ); + count = total - start; + if ( count > FTC_SBIT_ITEMS_PER_NODE ) + count = FTC_SBIT_ITEMS_PER_NODE; + + FTC_GNode_Init( FTC_GNODE( snode ), start, family ); + + snode->count = count; + + error = ftc_snode_load( snode, + cache->manager, + gindex, + NULL ); + if ( error ) + { + FTC_SNode_Free( snode, cache ); + snode = NULL; + } + } + + Exit: + *psnode = snode; return error; } - FT_CALLBACK_DEF( FT_ULong ) - ftc_sbit_node_weight( FTC_SBitNode snode ) + FT_LOCAL_DEF( FT_Error ) + ftc_snode_new( FTC_SNode *psnode, + FTC_GQuery gquery, + FTC_Cache cache ) { - FTC_GlyphNode gnode = FTC_GLYPH_NODE( snode ); - FT_UInt count = gnode->item_count; - FTC_SBit sbit = snode->sbits; - FT_Int pitch; - FT_ULong size; + return FTC_SNode_New( psnode, gquery, cache ); + } + FT_EXPORT_DEF( FT_ULong ) + FTC_SNode_Weight( FTC_SNode snode ) + { + FT_UInt count = snode->count; + FTC_SBit sbit = snode->sbits; + FT_Int pitch; + FT_ULong size; + + + FT_ASSERT( snode->count <= FTC_SBIT_ITEMS_PER_NODE ); + /* the node itself */ size = sizeof ( *snode ); - /* the sbit records */ - size += FTC_GLYPH_NODE( snode )->item_count * sizeof ( FTC_SBitRec ); - for ( ; count > 0; count--, sbit++ ) { if ( sbit->buffer ) @@ -285,22 +279,29 @@ } - FT_CALLBACK_DEF( FT_Bool ) - ftc_sbit_node_compare( FTC_SBitNode snode, - FTC_SBitQuery squery, - FTC_Cache cache ) + FT_LOCAL_DEF( FT_ULong ) + ftc_snode_weight( FTC_SNode snode ) { - FTC_GlyphQuery gquery = FTC_GLYPH_QUERY( squery ); - FTC_GlyphNode gnode = FTC_GLYPH_NODE( snode ); - FT_Bool result; + return FTC_SNode_Weight( snode ); + } - result = ftc_glyph_node_compare( gnode, gquery ); + FT_EXPORT_DEF( FT_Bool ) + FTC_SNode_Compare( FTC_SNode snode, + FTC_GQuery gquery, + FTC_Cache cache ) + { + FTC_GNode gnode = FTC_GNODE( snode ); + FT_UInt gindex = gquery->gindex; + FT_Bool result; + + + result = FT_BOOL( gnode->family == gquery->family && + (FT_UInt)( gindex - gnode->gindex ) < snode->count ); if ( result ) { /* check if we need to load the glyph bitmap now */ - FT_UInt gindex = gquery->gindex; - FTC_SBit sbit = snode->sbits + ( gindex - gnode->item_start ); + FTC_SBit sbit = snode->sbits + ( gindex - gnode->gindex ); if ( sbit->buffer == NULL && sbit->width != 255 ) @@ -308,11 +309,11 @@ FT_ULong size; - if ( !ftc_sbit_node_load( - snode, cache->manager, - FTC_SBIT_FAMILY( FTC_QUERY( squery )->family ), - gindex, &size ) ) + if ( !ftc_snode_load( snode, cache->manager, + gindex, &size ) ) + { cache->manager->cur_weight += size; + } } } @@ -320,234 +321,12 @@ } - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** SBITS FAMILIES *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - FT_CALLBACK_DEF( FT_Error ) - ftc_sbit_family_init( FTC_SBitFamily sfam, - FTC_SBitQuery squery, - FTC_Cache cache ) + FT_LOCAL_DEF( FT_Bool ) + ftc_snode_compare( FTC_SNode snode, + FTC_GQuery gquery, + FTC_Cache cache ) { - FTC_Manager manager = cache->manager; - FT_Error error; - FT_Face face; - - - sfam->type = squery->type; - - /* we need to compute "cquery.item_total" now */ - error = FTC_Manager_Lookup_Face( manager, - squery->type.font.face_id, - &face ); - if ( !error ) - { - error = ftc_glyph_family_init( FTC_GLYPH_FAMILY( sfam ), - FTC_IMAGE_TYPE_HASH( &sfam->type ), - FTC_SBIT_ITEMS_PER_NODE, - face->num_glyphs, - FTC_GLYPH_QUERY( squery ), - cache ); - } - - return error; - } - - - FT_CALLBACK_DEF( FT_Bool ) - ftc_sbit_family_compare( FTC_SBitFamily sfam, - FTC_SBitQuery squery ) - { - FT_Bool result; - - - /* we need to set the "cquery.cset" field or our query for */ - /* faster glyph comparisons in ftc_sbit_node_compare */ - /* */ - result = FT_BOOL( FTC_IMAGE_TYPE_COMPARE( &sfam->type, &squery->type ) ); - if ( result ) - FTC_GLYPH_FAMILY_FOUND( sfam, squery ); - - return result; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** SBITS CACHE *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - FT_CALLBACK_TABLE_DEF - const FTC_Cache_ClassRec ftc_sbit_cache_class = - { - sizeof ( FTC_CacheRec ), - (FTC_Cache_InitFunc) ftc_cache_init, - (FTC_Cache_ClearFunc)ftc_cache_clear, - (FTC_Cache_DoneFunc) ftc_cache_done, - - sizeof ( FTC_SBitFamilyRec ), - (FTC_Family_InitFunc) ftc_sbit_family_init, - (FTC_Family_CompareFunc)ftc_sbit_family_compare, - (FTC_Family_DoneFunc) ftc_glyph_family_done, - - sizeof ( FTC_SBitNodeRec ), - (FTC_Node_InitFunc) ftc_sbit_node_init, - (FTC_Node_WeightFunc) ftc_sbit_node_weight, - (FTC_Node_CompareFunc)ftc_sbit_node_compare, - (FTC_Node_DoneFunc) ftc_sbit_node_done - }; - - - /* documentation is in ftcsbits.h */ - - FT_EXPORT_DEF( FT_Error ) - FTC_SBitCache_New( FTC_Manager manager, - FTC_SBitCache *acache ) - { - return FTC_Manager_Register_Cache( manager, - &ftc_sbit_cache_class, - (FTC_Cache*)acache ); - } - - - /* documentation is in ftcsbits.h */ - -#ifdef FTC_CACHE_USE_INLINE - -#define GEN_CACHE_FAMILY_COMPARE( f, q, c ) \ - ftc_sbit_family_compare( (FTC_SBitFamily)(f), (FTC_SBitQuery)(q) ) - -#define GEN_CACHE_NODE_COMPARE( n, q, c ) \ - ftc_sbit_node_compare( (FTC_SBitNode)(n), (FTC_SBitQuery)(q), c ) - -#define GEN_CACHE_LOOKUP ftc_sbit_cache_lookup -#include "ftccache.i" - -#else /* !FTC_CACHE_USE_INLINE */ - -#define ftc_sbit_cache_lookup ftc_cache_lookup - -#endif /* !FTC_CACHE_USE_INLINE */ - - FT_EXPORT_DEF( FT_Error ) - FTC_SBitCache_Lookup( FTC_SBitCache cache, - FTC_ImageType type, - FT_UInt gindex, - FTC_SBit *ansbit, - FTC_Node *anode ) - { - FT_Error error; - FTC_SBitQueryRec squery; - FTC_SBitNode node; - - - /* other argument checks delayed to ftc_cache_lookup */ - if ( !ansbit ) - return FTC_Err_Invalid_Argument; - - *ansbit = NULL; - - if ( anode ) - *anode = NULL; - - squery.gquery.gindex = gindex; - squery.type = *type; - - error = ftc_sbit_cache_lookup( FTC_CACHE( cache ), - FTC_QUERY( &squery ), - (FTC_Node*)&node ); - if ( !error ) - { - *ansbit = node->sbits + ( gindex - FTC_GLYPH_NODE( node )->item_start ); - - if ( anode ) - { - *anode = FTC_NODE( node ); - FTC_NODE( node )->ref_count++; - } - } - return error; - } - - - /* backwards-compatibility functions */ - - FT_EXPORT_DEF( FT_Error ) - FTC_SBit_Cache_New( FTC_Manager manager, - FTC_SBit_Cache *acache ) - { - return FTC_SBitCache_New( manager, (FTC_SBitCache*)acache ); - } - - - FT_EXPORT_DEF( FT_Error ) - FTC_SBit_Cache_Lookup( FTC_SBit_Cache cache, - FTC_Image_Desc* desc, - FT_UInt gindex, - FTC_SBit *ansbit ) - { - FTC_ImageTypeRec type0; - - - if ( !desc ) - return FTC_Err_Invalid_Argument; - - type0.font = desc->font; - type0.flags = 0; - - /* convert image type flags to load flags */ - { - FT_UInt load_flags = FT_LOAD_DEFAULT; - FT_UInt type = desc->image_type; - - - /* determine load flags, depending on the font description's */ - /* image type */ - - if ( ftc_image_format( type ) == ftc_image_format_bitmap ) - { - if ( type & ftc_image_flag_monochrome ) - load_flags |= FT_LOAD_MONOCHROME; - - /* disable embedded bitmaps loading if necessary */ - if ( type & ftc_image_flag_no_sbits ) - load_flags |= FT_LOAD_NO_BITMAP; - } - else - { - /* we want an outline, don't load embedded bitmaps */ - load_flags |= FT_LOAD_NO_BITMAP; - - if ( type & ftc_image_flag_unscaled ) - load_flags |= FT_LOAD_NO_SCALE; - } - - /* always render glyphs to bitmaps */ - load_flags |= FT_LOAD_RENDER; - - if ( type & ftc_image_flag_unhinted ) - load_flags |= FT_LOAD_NO_HINTING; - - if ( type & ftc_image_flag_autohinted ) - load_flags |= FT_LOAD_FORCE_AUTOHINT; - - type0.flags = load_flags; - } - - return FTC_SBitCache_Lookup( (FTC_SBitCache)cache, - &type0, - gindex, - ansbit, - NULL ); + return FTC_SNode_Compare( snode, gquery, cache ); } diff --git a/reactos/lib/freetype/src/cache/ftlru.c b/reactos/lib/freetype/src/cache/ftlru.c deleted file mode 100644 index b25d7419da7..00000000000 --- a/reactos/lib/freetype/src/cache/ftlru.c +++ /dev/null @@ -1,390 +0,0 @@ -/***************************************************************************/ -/* */ -/* ftlru.c */ -/* */ -/* Simple LRU list-cache (body). */ -/* */ -/* Copyright 2000-2001, 2002, 2003 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_CACHE_H -#include FT_CACHE_INTERNAL_LRU_H -#include FT_LIST_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H - -#include "ftcerror.h" - - - FT_EXPORT_DEF( FT_Error ) - FT_LruList_New( FT_LruList_Class clazz, - FT_UInt max_nodes, - FT_Pointer user_data, - FT_Memory memory, - FT_LruList *alist ) - { - FT_Error error; - FT_LruList list; - - - if ( !alist || !clazz ) - return FTC_Err_Invalid_Argument; - - *alist = NULL; - if ( !FT_ALLOC( list, clazz->list_size ) ) - { - /* initialize common fields */ - list->clazz = clazz; - list->memory = memory; - list->max_nodes = max_nodes; - list->data = user_data; - - if ( clazz->list_init ) - { - error = clazz->list_init( list ); - if ( error ) - { - if ( clazz->list_done ) - clazz->list_done( list ); - - FT_FREE( list ); - } - } - - *alist = list; - } - - return error; - } - - - FT_EXPORT_DEF( void ) - FT_LruList_Destroy( FT_LruList list ) - { - FT_Memory memory; - FT_LruList_Class clazz; - - - if ( !list ) - return; - - memory = list->memory; - clazz = list->clazz; - - FT_LruList_Reset( list ); - - if ( clazz->list_done ) - clazz->list_done( list ); - - FT_FREE( list ); - } - - - FT_EXPORT_DEF( void ) - FT_LruList_Reset( FT_LruList list ) - { - FT_LruNode node; - FT_LruList_Class clazz; - FT_Memory memory; - - - if ( !list ) - return; - - node = list->nodes; - clazz = list->clazz; - memory = list->memory; - - while ( node ) - { - FT_LruNode next = node->next; - - - if ( clazz->node_done ) - clazz->node_done( node, list->data ); - - FT_FREE( node ); - node = next; - } - - list->nodes = NULL; - list->num_nodes = 0; - } - - - FT_EXPORT_DEF( FT_Error ) - FT_LruList_Lookup( FT_LruList list, - FT_LruKey key, - FT_LruNode *anode ) - { - FT_Error error = 0; - FT_LruNode node, *pnode; - FT_LruList_Class clazz; - FT_LruNode result = NULL; - FT_Memory memory; - - - if ( !list || !key || !anode ) - return FTC_Err_Invalid_Argument; - - pnode = &list->nodes; - node = NULL; - clazz = list->clazz; - memory = list->memory; - - if ( clazz->node_compare ) - { - for (;;) - { - node = *pnode; - if ( node == NULL ) - break; - - if ( clazz->node_compare( node, key, list->data ) ) - break; - - pnode = &(*pnode)->next; - } - } - else - { - for (;;) - { - node = *pnode; - if ( node == NULL ) - break; - - if ( node->key == key ) - break; - - pnode = &(*pnode)->next; - } - } - - if ( node ) - { - /* move element to top of list */ - if ( list->nodes != node ) - { - *pnode = node->next; - node->next = list->nodes; - list->nodes = node; - } - result = node; - goto Exit; - } - - /* Since we haven't found the relevant element in our LRU list, - * we're going to "create" a new one. - * - * The following code is a bit special, because it tries to handle - * out-of-memory conditions (OOM) in an intelligent way. - * - * More precisely, if not enough memory is available to create a - * new node or "flush" an old one, we need to remove the oldest - * elements from our list, and try again. Since several tries may - * be necessary, a loop is needed. - * - * This loop will only exit when: - * - * - a new node was successfully created, or an old node flushed - * - an error other than FTC_Err_Out_Of_Memory is detected - * - the list of nodes is empty, and it isn't possible to create - * new nodes - * - * On each unsuccessful attempt, one node will be removed from the list. - * - */ - - { - FT_Int drop_last = ( list->max_nodes > 0 && - list->num_nodes >= list->max_nodes ); - - for (;;) - { - node = NULL; - - /* If "drop_last" is true, we should free the last node in - * the list to make room for a new one. Note that we reuse - * its memory block to save allocation calls. - */ - if ( drop_last ) - { - /* find the last node in the list - */ - pnode = &list->nodes; - node = *pnode; - - if ( node == NULL ) - { - FT_ASSERT( list->num_nodes == 0 ); - error = FTC_Err_Out_Of_Memory; - goto Exit; - } - - FT_ASSERT( list->num_nodes > 0 ); - - while ( node->next ) - { - pnode = &node->next; - node = *pnode; - } - - /* Remove it from the list, and try to "flush" it. Doing this will - * save a significant number of dynamic allocations compared to - * a classic destroy/create cycle. - */ - *pnode = NULL; - list->num_nodes--; - - if ( clazz->node_flush ) - { - error = clazz->node_flush( node, key, list->data ); - if ( !error ) - goto Success; - - /* Note that if an error occured during the flush, we need to - * finalize it since it is potentially in incomplete state. - */ - } - - /* We finalize, but do not destroy the last node, we - * simply reuse its memory block! - */ - if ( clazz->node_done ) - clazz->node_done( node, list->data ); - - FT_MEM_ZERO( node, clazz->node_size ); - } - else - { - /* Try to allocate a new node when "drop_last" is not TRUE. - * This usually happens on the first pass, when the LRU list - * is not already full. - */ - if ( FT_ALLOC( node, clazz->node_size ) ) - goto Fail; - } - - FT_ASSERT( node != NULL ); - - node->key = key; - error = clazz->node_init( node, key, list->data ); - if ( error ) - { - if ( clazz->node_done ) - clazz->node_done( node, list->data ); - - FT_FREE( node ); - goto Fail; - } - - Success: - result = node; - - node->next = list->nodes; - list->nodes = node; - list->num_nodes++; - goto Exit; - - Fail: - if ( error != FTC_Err_Out_Of_Memory ) - goto Exit; - - drop_last = 1; - continue; - } - } - - Exit: - *anode = result; - return error; - } - - - FT_EXPORT_DEF( void ) - FT_LruList_Remove( FT_LruList list, - FT_LruNode node ) - { - FT_LruNode *pnode; - - - if ( !list || !node ) - return; - - pnode = &list->nodes; - for (;;) - { - if ( *pnode == node ) - { - FT_Memory memory = list->memory; - FT_LruList_Class clazz = list->clazz; - - - *pnode = node->next; - node->next = NULL; - - if ( clazz->node_done ) - clazz->node_done( node, list->data ); - - FT_FREE( node ); - list->num_nodes--; - break; - } - - pnode = &(*pnode)->next; - } - } - - - FT_EXPORT_DEF( void ) - FT_LruList_Remove_Selection( FT_LruList list, - FT_LruNode_SelectFunc select_func, - FT_Pointer select_data ) - { - FT_LruNode *pnode, node; - FT_LruList_Class clazz; - FT_Memory memory; - - - if ( !list || !select_func ) - return; - - memory = list->memory; - clazz = list->clazz; - pnode = &list->nodes; - - for (;;) - { - node = *pnode; - if ( node == NULL ) - break; - - if ( select_func( node, select_data, list->data ) ) - { - *pnode = node->next; - node->next = NULL; - - if ( clazz->node_done ) - clazz->node_done( node, list ); - - FT_FREE( node ); - list->num_nodes--; - } - else - pnode = &(*pnode)->next; - } - } - - -/* END */ diff --git a/reactos/lib/freetype/src/cache/rules.mk b/reactos/lib/freetype/src/cache/rules.mk index 617ca48dae8..381104ad654 100644 --- a/reactos/lib/freetype/src/cache/rules.mk +++ b/reactos/lib/freetype/src/cache/rules.mk @@ -3,7 +3,7 @@ # -# Copyright 2000, 2001, 2003 by +# Copyright 2000, 2001, 2003, 2004 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, @@ -25,8 +25,9 @@ CACHE_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(CACHE_DIR)) # Cache driver sources (i.e., C files) # -CACHE_DRV_SRC := $(CACHE_DIR)/ftlru.c \ +CACHE_DRV_SRC := $(CACHE_DIR)/ftcmru.c \ $(CACHE_DIR)/ftcmanag.c \ + $(CACHE_DIR)/ftcbasic.c \ $(CACHE_DIR)/ftccache.c \ $(CACHE_DIR)/ftcglyph.c \ $(CACHE_DIR)/ftcsbits.c \ @@ -35,11 +36,13 @@ CACHE_DRV_SRC := $(CACHE_DIR)/ftlru.c \ # Cache driver headers # -CACHE_DRV_H := $(CACHE_H_DIR)/ftlru.h \ +CACHE_DRV_H := $(CACHE_H_DIR)/ftcmru.h \ $(CACHE_H_DIR)/ftcmanag.h \ $(CACHE_H_DIR)/ftcglyph.h \ $(CACHE_H_DIR)/ftcimage.h \ - $(CACHE_DIR)/ftcerror.h + $(CACHE_H_DIR)/ftccmap.h \ + $(CACHE_DIR)/ftcerror.h \ + $(CACHE_DIR)/ftccback.h # Cache driver object(s) diff --git a/reactos/lib/freetype/src/cff/Jamfile b/reactos/lib/freetype/src/cff/Jamfile index cf7cf631336..dcf24c818a1 100644 --- a/reactos/lib/freetype/src/cff/Jamfile +++ b/reactos/lib/freetype/src/cff/Jamfile @@ -1,4 +1,4 @@ -# FreeType 2 src/cff Jamfile (c) 2001 David Turner +# FreeType 2 src/cff Jamfile (c) 2001, 2002 David Turner # SubDir FT2_TOP $(FT2_SRC_DIR) cff ; diff --git a/reactos/lib/freetype/src/cff/cff.c b/reactos/lib/freetype/src/cff/cff.c index 013c329cab3..e6d8954c9ab 100644 --- a/reactos/lib/freetype/src/cff/cff.c +++ b/reactos/lib/freetype/src/cff/cff.c @@ -4,7 +4,7 @@ /* */ /* FreeType OpenType driver component (body only). */ /* */ -/* Copyright 1996-2001 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/reactos/lib/freetype/src/cff/cffcmap.c b/reactos/lib/freetype/src/cff/cffcmap.c index 5ed9d5dcf9a..82e04d23668 100644 --- a/reactos/lib/freetype/src/cff/cffcmap.c +++ b/reactos/lib/freetype/src/cff/cffcmap.c @@ -4,7 +4,7 @@ /* */ /* CFF character mapping table (cmap) support (body). */ /* */ -/* Copyright 2002, 2003 by */ +/* Copyright 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -19,6 +19,8 @@ #include "cffcmap.h" #include "cffload.h" +#include "cfferrs.h" + /*************************************************************************/ /*************************************************************************/ @@ -37,7 +39,7 @@ cmap->gids = encoding->codes; - + return 0; } @@ -58,7 +60,7 @@ if ( char_code < 256 ) result = cmap->gids[char_code]; - + return result; } @@ -69,27 +71,27 @@ { FT_UInt result = 0; FT_UInt32 char_code = *pchar_code; - + *pchar_code = 0; if ( char_code < 255 ) { FT_UInt code = (FT_UInt)(char_code + 1); - + for (;;) { if ( code >= 256 ) break; - + result = cmap->gids[code]; if ( result != 0 ) { *pchar_code = code; break; } - + code++; } } @@ -123,34 +125,34 @@ { FT_UInt32 u1 = ((CFF_CMapUniPair)pair1)->unicode; FT_UInt32 u2 = ((CFF_CMapUniPair)pair2)->unicode; - + if ( u1 < u2 ) return -1; - + if ( u1 > u2 ) return +1; - + return 0; - } + } FT_CALLBACK_DEF( FT_Error ) cff_cmap_unicode_init( CFF_CMapUnicode cmap ) { - FT_Error error; - FT_UInt count; - TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); - FT_Memory memory = FT_FACE_MEMORY( face ); - CFF_Font cff = (CFF_Font)face->extra.data; - CFF_Charset charset = &cff->charset; - PSNames_Service psnames = (PSNames_Service)cff->psnames; + FT_Error error; + FT_UInt count; + TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + CFF_Font cff = (CFF_Font)face->extra.data; + CFF_Charset charset = &cff->charset; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; cmap->num_pairs = 0; cmap->pairs = NULL; - count = (FT_UInt)face->root.num_glyphs; + count = cff->num_glyphs; if ( !FT_NEW_ARRAY( cmap->pairs, count ) ) { @@ -167,7 +169,7 @@ gname = cff_index_get_sid_string( &cff->string_index, sid, psnames ); - + /* build unsorted pair table by matching glyph names */ if ( gname ) { @@ -179,7 +181,7 @@ pair->gindex = n; pair++; } - + FT_FREE( gname ); } } @@ -198,7 +200,7 @@ if ( new_count != count && new_count < count / 2 ) { (void)FT_RENEW_ARRAY( cmap->pairs, count, new_count ); - error = 0; + error = CFF_Err_Ok; } /* sort the pairs table to allow efficient binary searches */ @@ -221,7 +223,7 @@ FT_Face face = FT_CMAP_FACE( cmap ); FT_Memory memory = FT_FACE_MEMORY( face ); - + FT_FREE( cmap->pairs ); cmap->num_pairs = 0; } diff --git a/reactos/lib/freetype/src/cff/cffdrivr.c b/reactos/lib/freetype/src/cff/cffdrivr.c index 54929b7155f..60ee90ae3d8 100644 --- a/reactos/lib/freetype/src/cff/cffdrivr.c +++ b/reactos/lib/freetype/src/cff/cffdrivr.c @@ -4,7 +4,7 @@ /* */ /* OpenType font driver implementation (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -22,14 +22,19 @@ #include FT_INTERNAL_STREAM_H #include FT_INTERNAL_SFNT_H #include FT_TRUETYPE_IDS_H -#include FT_INTERNAL_POSTSCRIPT_NAMES_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_SERVICE_POSTSCRIPT_INFO_H +#include FT_SERVICE_TT_CMAP_H #include "cffdrivr.h" #include "cffgload.h" #include "cffload.h" +#include "cffcmap.h" #include "cfferrs.h" +#include FT_SERVICE_XFREE86_NAME_H +#include FT_SERVICE_GLYPH_DICT_H /*************************************************************************/ /* */ @@ -196,7 +201,7 @@ if ( size ) { /* these two object must have the same parent */ - if ( size->face != slot->root.face ) + if ( size->root.face != slot->root.face ) return CFF_Err_Invalid_Face_Handle; } @@ -210,17 +215,10 @@ } - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** ****/ - /**** C H A R A C T E R M A P P I N G S ****/ - /**** ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ + /* + * GLYPH DICT SERVICE + * + */ static FT_Error cff_get_glyph_name( CFF_Face face, @@ -228,21 +226,19 @@ FT_Pointer buffer, FT_UInt buffer_max ) { - CFF_Font font = (CFF_Font)face->extra.data; - FT_Memory memory = FT_FACE_MEMORY( face ); - FT_String* gname; - FT_UShort sid; - PSNames_Service psnames; - FT_Error error; + CFF_Font font = (CFF_Font)face->extra.data; + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_String* gname; + FT_UShort sid; + FT_Service_PsCMaps psnames; + FT_Error error; - psnames = (PSNames_Service)FT_Get_Module_Interface( - face->root.driver->root.library, "psnames" ); - + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); if ( !psnames ) { FT_ERROR(( "cff_get_glyph_name:" )); - FT_ERROR(( " cannot open CFF & CEF fonts\n" )); + FT_ERROR(( " cannot get glyph name from CFF & CEF fonts\n" )); FT_ERROR(( " " )); FT_ERROR(( " without the `PSNames' module\n" )); error = CFF_Err_Unknown_File_Format; @@ -275,42 +271,26 @@ } - /*************************************************************************/ - /* */ - /* <Function> */ - /* cff_get_name_index */ - /* */ - /* <Description> */ - /* Uses the psnames module and the CFF font's charset to to return a */ - /* a given glyph name's glyph index. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face object. */ - /* */ - /* glyph_name :: The glyph name. */ - /* */ - /* <Return> */ - /* Glyph index. 0 means `undefined character code'. */ - /* */ static FT_UInt cff_get_name_index( CFF_Face face, FT_String* glyph_name ) { - CFF_Font cff; - CFF_Charset charset; - PSNames_Service psnames; - FT_Memory memory = FT_FACE_MEMORY( face ); - FT_String* name; - FT_UShort sid; - FT_UInt i; - FT_Int result; + CFF_Font cff; + CFF_Charset charset; + FT_Service_PsCMaps psnames; + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_String* name; + FT_UShort sid; + FT_UInt i; + FT_Int result; cff = (CFF_FontRec *)face->extra.data; charset = &cff->charset; - psnames = (PSNames_Service)FT_Get_Module_Interface( - face->root.driver->root.library, "psnames" ); + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + if ( !psnames ) + return 0; for ( i = 0; i < cff->num_glyphs; i++ ) { @@ -334,6 +314,77 @@ } + static const FT_Service_GlyphDictRec cff_service_glyph_dict = + { + (FT_GlyphDict_GetNameFunc) cff_get_glyph_name, + (FT_GlyphDict_NameIndexFunc)cff_get_name_index, + }; + + + /* + * POSTSCRIPT INFO SERVICE + * + */ + + static FT_Int + cff_ps_has_glyph_names( FT_Face face ) + { + return ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) > 0; + } + + + static const FT_Service_PsInfoRec cff_service_ps_info = + { + (PS_GetFontInfoFunc) NULL, /* unsupported with CFF fonts */ + (PS_HasGlyphNamesFunc)cff_ps_has_glyph_names + }; + + + /* + * TT CMAP INFO + * + * If the charmap is a synthetic Unicode encoding cmap or + * a Type 1 standard (or expert) encoding cmap, hide TT CMAP INFO + * service defined in SFNT module. + * + * Otherwise call the service function in the sfnt module. + * + */ + static FT_Error + cff_get_cmap_info( FT_CharMap charmap, + TT_CMapInfo *cmap_info ) + { + FT_CMap cmap = FT_CMAP( charmap ); + FT_Error error = CFF_Err_Ok; + + + cmap_info->language = 0; + + if ( cmap->clazz != &cff_cmap_encoding_class_rec && + cmap->clazz != &cff_cmap_unicode_class_rec ) + { + FT_Face face = FT_CMAP_FACE( cmap ); + FT_Library library = FT_FACE_LIBRARY( face ); + FT_Module sfnt = FT_Get_Module( library, "sfnt" ); + FT_Service_TTCMaps service = + (FT_Service_TTCMaps)ft_module_get_service( sfnt, + FT_SERVICE_ID_TT_CMAP ); + + + if ( service && service->get_cmap_info ) + error = service->get_cmap_info( charmap, cmap_info ); + } + + return error; + } + + + static const FT_Service_TTCMapsRec cff_service_get_cmap_info = + { + (TT_CMap_Info_GetFunc)cff_get_cmap_info + }; + + /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ @@ -346,24 +397,31 @@ /*************************************************************************/ /*************************************************************************/ + static const FT_ServiceDescRec cff_services[] = + { + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CFF }, + { FT_SERVICE_ID_POSTSCRIPT_INFO, &cff_service_ps_info }, +#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES + { FT_SERVICE_ID_GLYPH_DICT, &cff_service_glyph_dict }, +#endif + { FT_SERVICE_ID_TT_CMAP, &cff_service_get_cmap_info }, + { NULL, NULL } + }; + + static FT_Module_Interface cff_get_interface( CFF_Driver driver, const char* module_interface ) { - FT_Module sfnt; + FT_Module sfnt; + FT_Module_Interface result; -#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES + result = ft_service_list_lookup( cff_services, module_interface ); + if ( result != NULL ) + return result; - if ( ft_strcmp( (const char*)module_interface, "glyph_name" ) == 0 ) - return (FT_Module_Interface)cff_get_glyph_name; - - if ( ft_strcmp( (const char*)module_interface, "name_index" ) == 0 ) - return (FT_Module_Interface)cff_get_name_index; - -#endif - - /* we simply pass our request to the `sfnt' module */ + /* we pass our request to the `sfnt' module */ sfnt = FT_Get_Module( driver->root.root.library, "sfnt" ); return sfnt ? sfnt->clazz->get_interface( sfnt, module_interface ) : 0; @@ -395,7 +453,7 @@ /* now the specific driver fields */ sizeof( TT_FaceRec ), - sizeof( FT_SizeRec ), + sizeof( CFF_SizeRec ), sizeof( CFF_GlyphSlotRec ), (FT_Face_InitFunc) cff_face_init, diff --git a/reactos/lib/freetype/src/cff/cffgload.c b/reactos/lib/freetype/src/cff/cffgload.c index 43d68494147..c1339d82ebb 100644 --- a/reactos/lib/freetype/src/cff/cffgload.c +++ b/reactos/lib/freetype/src/cff/cffgload.c @@ -4,7 +4,7 @@ /* */ /* OpenType Glyph Loader (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -251,15 +251,15 @@ if ( hinting && size ) { - builder->hints_globals = size->internal; + builder->hints_globals = size->root.internal; builder->hints_funcs = glyph->root.internal->glyph_hints; } } if ( size ) { - builder->scale_x = size->metrics.x_scale; - builder->scale_y = size->metrics.y_scale; + builder->scale_x = size->root.metrics.x_scale; + builder->scale_y = size->root.metrics.y_scale; } builder->pos_x = 0; @@ -366,7 +366,7 @@ decoder->num_globals = cff->num_global_subrs; decoder->globals = cff->global_subrs; decoder->globals_bias = cff_compute_bias( decoder->num_globals ); - + decoder->hint_mode = hint_mode; } @@ -398,7 +398,7 @@ } - /* check that there is enough room for `count' more points */ + /* check that there is enough space for `count' more points */ static FT_Error check_points( CFF_Builder* builder, FT_Int count ) @@ -451,7 +451,7 @@ } - /* check room for a new contour, then add it */ + /* check space for a new contour, then add it */ static FT_Error cff_builder_add_contour( CFF_Builder* builder ) { @@ -485,7 +485,7 @@ FT_Pos x, FT_Pos y ) { - FT_Error error = 0; + FT_Error error = CFF_Err_Ok; /* test whether we are building a new contour */ @@ -545,6 +545,10 @@ FT_UShort glyph_sid; + /* CID-keyed fonts don't have glyph names */ + if ( !cff->charset.sids ) + return -1; + /* check range of standard char code */ if ( charcode < 0 || charcode > 255 ) return -1; @@ -640,13 +644,13 @@ FT_Int bchar, FT_Int achar ) { - FT_Error error; - FT_Int bchar_index, achar_index, n_base_points; - FT_Outline* base = decoder->builder.base; - TT_Face face = decoder->builder.face; - FT_Vector left_bearing, advance; - FT_Byte* charstring; - FT_ULong charstring_len; + FT_Error error; + CFF_Builder* builder = &decoder->builder; + FT_Int bchar_index, achar_index; + TT_Face face = decoder->builder.face; + FT_Vector left_bearing, advance; + FT_Byte* charstring; + FT_ULong charstring_len; #ifdef FT_CONFIG_OPTION_INCREMENTAL @@ -676,9 +680,9 @@ /* If we are trying to load a composite glyph, do not load the */ /* accent character and return the array of subglyphs. */ - if ( decoder->builder.no_recurse ) + if ( builder->no_recurse ) { - FT_GlyphSlot glyph = (FT_GlyphSlot)decoder->builder.glyph; + FT_GlyphSlot glyph = (FT_GlyphSlot)builder->glyph; FT_GlyphLoader loader = glyph->internal->loader; FT_SubGlyph subg; @@ -701,8 +705,8 @@ /* subglyph 1 = accent character */ subg->index = achar_index; subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES; - subg->arg1 = (FT_Int)adx; - subg->arg2 = (FT_Int)ady; + subg->arg1 = (FT_Int)( adx >> 16 ); + subg->arg2 = (FT_Int)( ady >> 16 ); /* set up remaining glyph fields */ glyph->num_subglyphs = 2; @@ -712,6 +716,8 @@ loader->current.num_subglyphs = 2; } + FT_GlyphLoader_Prepare( builder->loader ); + /* First load `bchar' in builder */ error = cff_get_glyph_data( face, bchar_index, &charstring, &charstring_len ); @@ -726,16 +732,17 @@ cff_free_glyph_data( face, &charstring, charstring_len ); } - n_base_points = base->n_points; - /* Save the left bearing and width of the base character */ /* as they will be erased by the next load. */ - left_bearing = decoder->builder.left_bearing; - advance = decoder->builder.advance; + left_bearing = builder->left_bearing; + advance = builder->advance; - decoder->builder.left_bearing.x = 0; - decoder->builder.left_bearing.y = 0; + builder->left_bearing.x = 0; + builder->left_bearing.y = 0; + + builder->pos_x = adx; + builder->pos_y = ady; /* Now load `achar' on top of the base outline. */ error = cff_get_glyph_data( face, achar_index, @@ -753,20 +760,11 @@ /* Restore the left side bearing and advance width */ /* of the base character. */ - decoder->builder.left_bearing = left_bearing; - decoder->builder.advance = advance; + builder->left_bearing = left_bearing; + builder->advance = advance; - /* Finally, move the accent. */ - if ( decoder->builder.load_points ) - { - FT_Outline dummy; - - - dummy.n_points = (short)( base->n_points - n_base_points ); - dummy.points = base->points + n_base_points; - - FT_Outline_Translate( &dummy, adx, ady ); - } + builder->pos_x = 0; + builder->pos_y = 0; Exit: return error; @@ -903,7 +901,7 @@ #ifdef FT_DEBUG_LEVEL_TRACE if ( !( val & 0xFFFFL ) ) - FT_TRACE4(( " %d", (FT_Int32)( val >> 16 ) )); + FT_TRACE4(( " %ld", (FT_Int32)( val >> 16 ) )); else FT_TRACE4(( " %.2f", val / 65536.0 )); #endif @@ -1110,7 +1108,7 @@ /* `glyph_width' to `nominal_width' plus number on the stack */ /* -- for either case. */ - FT_Int set_width_ok; + FT_Int set_width_ok; switch ( op ) @@ -1125,6 +1123,8 @@ case cff_op_hstemhm: case cff_op_vstemhm: case cff_op_rmoveto: + case cff_op_hintmask: + case cff_op_cntrmask: set_width_ok = num_args & 1; break; @@ -1223,7 +1223,7 @@ for ( maskbyte = 0; maskbyte < (FT_UInt)(( decoder->num_hints + 7 ) >> 3); maskbyte++, ip++ ) - FT_TRACE4(( "%02X", *ip )); + FT_TRACE4(( "0x%02X", *ip )); } #else ip += ( decoder->num_hints + 7 ) >> 3; @@ -1649,11 +1649,11 @@ case cff_op_flex1: { - FT_Pos start_x, start_y; /* record start x, y values for alter */ - /* use */ - FT_Int dx = 0, dy = 0; /* used in horizontal/vertical */ - /* algorithm below */ - FT_Int horizontal, count; + FT_Pos start_x, start_y; /* record start x, y values for */ + /* alter use */ + FT_Fixed dx = 0, dy = 0; /* used in horizontal/vertical */ + /* algorithm below */ + FT_Int horizontal, count; FT_TRACE4(( " flex1" )); @@ -1675,8 +1675,8 @@ /* grab up to the last argument */ for ( count = 5; count > 0; count-- ) { - dx += (FT_Int)args[0]; - dy += (FT_Int)args[1]; + dx += args[0]; + dy += args[1]; args += 2; } @@ -1732,7 +1732,7 @@ x += args[0]; y += args[1]; cff_builder_add_point( builder, x, y, - (FT_Bool)( count == 3 || count == 0 ) ); + (FT_Bool)( count == 4 || count == 1 ) ); args += 2; } @@ -1746,35 +1746,43 @@ /* We are going to emulate the seac operator. */ if ( num_args == 4 ) { + /* Save glyph width so that the subglyphs don't overwrite it. */ + FT_Pos glyph_width = decoder->glyph_width; + + error = cff_operator_seac( decoder, - args[0] >> 16, - args[1] >> 16, + args[0], + args[1], (FT_Int)( args[2] >> 16 ), (FT_Int)( args[3] >> 16 ) ); args += 4; + + decoder->glyph_width = glyph_width; } - - if ( !error ) - error = CFF_Err_Ok; - - cff_builder_close_contour( builder ); - - /* close hints recording session */ - if ( hinter ) + else { - if (hinter->close( hinter->hints, builder->current->n_points ) ) - goto Syntax_Error; + if ( !error ) + error = CFF_Err_Ok; - /* apply hints to the loaded glyph outline now */ - hinter->apply( hinter->hints, - builder->current, - (PSH_Globals)builder->hints_globals, - decoder->hint_mode ); + cff_builder_close_contour( builder ); + + /* close hints recording session */ + if ( hinter ) + { + if (hinter->close( hinter->hints, builder->current->n_points ) ) + goto Syntax_Error; + + /* apply hints to the loaded glyph outline now */ + hinter->apply( hinter->hints, + builder->current, + (PSH_Globals)builder->hints_globals, + decoder->hint_mode ); + } + + /* add current outline to the glyph slot */ + FT_GlyphLoader_Add( builder->loader ); } - /* add current outline to the glyph slot */ - FT_GlyphLoader_Add( builder->loader ); - /* return now! */ FT_TRACE4(( "\n\n" )); return error; @@ -2211,7 +2219,7 @@ cff_compute_max_advance( TT_Face face, FT_Int* max_advance ) { - FT_Error error = 0; + FT_Error error = CFF_Err_Ok; CFF_Decoder decoder; FT_Int glyph_index; CFF_Font cff = (CFF_Font)face->other; @@ -2247,7 +2255,7 @@ } /* ignore the error if one has occurred -- skip to next glyph */ - error = 0; + error = CFF_Err_Ok; } *max_advance = decoder.builder.advance.x; @@ -2281,14 +2289,14 @@ FT_Int glyph_index, FT_Int32 load_flags ) { - FT_Error error; - CFF_Decoder decoder; - TT_Face face = (TT_Face)glyph->root.face; - FT_Bool hinting; - CFF_Font cff = (CFF_Font)face->extra.data; + FT_Error error; + CFF_Decoder decoder; + TT_Face face = (TT_Face)glyph->root.face; + FT_Bool hinting; + CFF_Font cff = (CFF_Font)face->extra.data; - FT_Matrix font_matrix; - FT_Vector font_offset; + FT_Matrix font_matrix; + FT_Vector font_offset; if ( load_flags & FT_LOAD_NO_RECURSE ) @@ -2298,10 +2306,77 @@ glyph->y_scale = 0x10000L; if ( size ) { - glyph->x_scale = size->metrics.x_scale; - glyph->y_scale = size->metrics.y_scale; + glyph->x_scale = size->root.metrics.x_scale; + glyph->y_scale = size->root.metrics.y_scale; } +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + /* try to load embedded bitmap if any */ + /* */ + /* XXX: The convention should be emphasized in */ + /* the documents because it can be confusing. */ + if ( size ) + { + CFF_Face cff_face = (CFF_Face)size->root.face; + SFNT_Service sfnt = (SFNT_Service)cff_face->sfnt; + FT_Stream stream = cff_face->root.stream; + + + if ( size->strike_index != 0xFFFFU && + sfnt->load_sbits && + ( load_flags & FT_LOAD_NO_BITMAP ) == 0 ) + { + TT_SBit_MetricsRec metrics; + + + error = sfnt->load_sbit_image( face, + (FT_ULong)size->strike_index, + (FT_UInt)glyph_index, + (FT_Int)load_flags, + stream, + &glyph->root.bitmap, + &metrics ); + + if ( !error ) + { + glyph->root.outline.n_points = 0; + glyph->root.outline.n_contours = 0; + + glyph->root.metrics.width = (FT_Pos)metrics.width << 6; + glyph->root.metrics.height = (FT_Pos)metrics.height << 6; + + glyph->root.metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6; + glyph->root.metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6; + glyph->root.metrics.horiAdvance = (FT_Pos)metrics.horiAdvance << 6; + + glyph->root.metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6; + glyph->root.metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6; + glyph->root.metrics.vertAdvance = (FT_Pos)metrics.vertAdvance << 6; + + glyph->root.format = FT_GLYPH_FORMAT_BITMAP; + + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + { + glyph->root.bitmap_left = metrics.vertBearingX; + glyph->root.bitmap_top = metrics.vertBearingY; + } + else + { + glyph->root.bitmap_left = metrics.horiBearingX; + glyph->root.bitmap_top = metrics.horiBearingY; + } + return error; + } + } + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + /* return immediately if we only want the embedded bitmaps */ + if ( load_flags & FT_LOAD_SBITS_ONLY ) + return CFF_Err_Invalid_Argument; + glyph->root.outline.n_points = 0; glyph->root.outline.n_contours = 0; @@ -2315,8 +2390,15 @@ FT_ULong charstring_len; + /* in a CID-keyed font, consider `glyph_index' as a CID and map */ + /* it immediately to the real glyph_index -- if it isn't a */ + /* subsetted font, glyph_indices and CIDs are identical, though */ + if ( cff->top_font.font_dict.cid_registry != 0xFFFFU && + cff->charset.cids ) + glyph_index = cff->charset.cids[glyph_index]; + cff_decoder_init( &decoder, face, size, glyph, hinting, - FT_LOAD_TARGET_MODE(load_flags) ); + FT_LOAD_TARGET_MODE( load_flags ) ); decoder.builder.no_recurse = (FT_Bool)( ( load_flags & FT_LOAD_NO_RECURSE ) != 0 ); @@ -2362,7 +2444,7 @@ cff_builder_done( &decoder.builder ); } - #ifdef FT_CONFIG_OPTION_INCREMENTAL +#ifdef FT_CONFIG_OPTION_INCREMENTAL /* Incremental fonts can optionally override the metrics. */ if ( !error && @@ -2429,7 +2511,7 @@ glyph->root.format = FT_GLYPH_FORMAT_OUTLINE; glyph->root.outline.flags = 0; - if ( size && size->metrics.y_ppem < 24 ) + if ( size && size->root.metrics.y_ppem < 24 ) glyph->root.outline.flags |= FT_OUTLINE_HIGH_PRECISION; glyph->root.outline.flags |= FT_OUTLINE_REVERSE_FILL; @@ -2479,11 +2561,11 @@ if ( hinting ) { - metrics->horiAdvance = ( metrics->horiAdvance + 32 ) & -64; - metrics->vertAdvance = ( metrics->vertAdvance + 32 ) & -64; + metrics->horiAdvance = FT_PIX_ROUND( metrics->horiAdvance ); + metrics->vertAdvance = FT_PIX_ROUND( metrics->vertAdvance ); - metrics->vertBearingX = ( metrics->vertBearingX + 32 ) & -64; - metrics->vertBearingY = ( metrics->vertBearingY + 32 ) & -64; + metrics->vertBearingX = FT_PIX_ROUND( metrics->vertBearingX ); + metrics->vertBearingY = FT_PIX_ROUND( metrics->vertBearingY ); } } diff --git a/reactos/lib/freetype/src/cff/cffload.c b/reactos/lib/freetype/src/cff/cffload.c index cc95e790eb5..44f3254bd8d 100644 --- a/reactos/lib/freetype/src/cff/cffload.c +++ b/reactos/lib/freetype/src/cff/cffload.c @@ -4,7 +4,7 @@ /* */ /* OpenType and CFF data/program tables loader (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -20,7 +20,7 @@ #include FT_INTERNAL_DEBUG_H #include FT_INTERNAL_OBJECTS_H #include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_POSTSCRIPT_NAMES_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H #include FT_TRUETYPE_TAGS_H #include "cffload.h" @@ -1172,12 +1172,12 @@ } - /* allocate a table containing pointers to an index's elements */ + /* allocate a table containing pointers to an index's elements */ static FT_Error cff_index_get_pointers( CFF_Index idx, FT_Byte*** table ) { - FT_Error error = 0; + FT_Error error = CFF_Err_Ok; FT_Memory memory = idx->stream->memory; FT_ULong n, offset, old_offset; FT_Byte** t; @@ -1211,7 +1211,7 @@ FT_Byte** pbytes, FT_ULong* pbyte_len ) { - FT_Error error = 0; + FT_Error error = CFF_Err_Ok; if ( idx && idx->count > element ) @@ -1312,18 +1312,26 @@ FT_LOCAL_DEF( FT_String* ) - cff_index_get_sid_string( CFF_Index idx, - FT_UInt sid, - PSNames_Service psnames_service ) + cff_index_get_sid_string( CFF_Index idx, + FT_UInt sid, + FT_Service_PsCMaps psnames ) { + /* value 0xFFFFU indicates a missing dictionary entry */ + if ( sid == 0xFFFFU ) + return 0; + /* if it is not a standard string, return it */ if ( sid > 390 ) return cff_index_get_name( idx, sid - 391 ); + /* CID-keyed CFF fonts don't have glyph names */ + if ( !psnames ) + return 0; + /* that's a standard string, fetch a copy from the PSName module */ { FT_String* name = 0; - const char* adobe_name = psnames_service->adobe_std_strings( sid ); + const char* adobe_name = psnames->adobe_std_strings( sid ); FT_UInt len; @@ -1493,6 +1501,7 @@ FT_FREE( charset->sids ); + FT_FREE( charset->cids ); charset->format = 0; charset->offset = 0; } @@ -1503,10 +1512,11 @@ FT_UInt num_glyphs, FT_Stream stream, FT_ULong base_offset, - FT_ULong offset ) + FT_ULong offset, + FT_Bool invert ) { FT_Memory memory = stream->memory; - FT_Error error = 0; + FT_Error error = CFF_Err_Ok; FT_UShort glyph_sid; @@ -1603,8 +1613,8 @@ case 0: if ( num_glyphs > 229 ) { - FT_ERROR(("cff_charset_load: implicit charset larger than\n" - "predefined charset (Adobe ISO-Latin)!\n" )); + FT_ERROR(( "cff_charset_load: implicit charset larger than\n" + "predefined charset (Adobe ISO-Latin)!\n" )); error = CFF_Err_Invalid_File_Format; goto Exit; } @@ -1614,8 +1624,7 @@ goto Exit; /* Copy the predefined charset into the allocated memory. */ - FT_MEM_COPY( charset->sids, cff_isoadobe_charset, - num_glyphs * sizeof ( FT_UShort ) ); + FT_ARRAY_COPY( charset->sids, cff_isoadobe_charset, num_glyphs ); break; @@ -1633,8 +1642,7 @@ goto Exit; /* Copy the predefined charset into the allocated memory. */ - FT_MEM_COPY( charset->sids, cff_expert_charset, - num_glyphs * sizeof ( FT_UShort ) ); + FT_ARRAY_COPY( charset->sids, cff_expert_charset, num_glyphs ); break; @@ -1652,8 +1660,7 @@ goto Exit; /* Copy the predefined charset into the allocated memory. */ - FT_MEM_COPY( charset->sids, cff_expertsubset_charset, - num_glyphs * sizeof ( FT_UShort ) ); + FT_ARRAY_COPY( charset->sids, cff_expertsubset_charset, num_glyphs ); break; @@ -1663,17 +1670,36 @@ } } - Exit: + /* we have to invert the `sids' array for subsetted CID-keyed fonts */ + if ( invert ) + { + FT_UInt i; + FT_UShort max_cid = 0; + + for ( i = 0; i < num_glyphs; i++ ) + if ( charset->sids[i] > max_cid ) + max_cid = charset->sids[i]; + max_cid++; + + if ( FT_NEW_ARRAY( charset->cids, max_cid ) ) + goto Exit; + FT_MEM_ZERO( charset->cids, sizeof ( FT_UShort ) * max_cid ); + + for ( i = 0; i < num_glyphs; i++ ) + charset->cids[charset->sids[i]] = i; + } + + Exit: /* Clean up if there was an error. */ if ( error ) - if ( charset->sids ) - { - FT_FREE( charset->sids ); - charset->format = 0; - charset->offset = 0; - charset->sids = 0; - } + { + FT_FREE( charset->sids ); + FT_FREE( charset->cids ); + charset->format = 0; + charset->offset = 0; + charset->sids = 0; + } return error; } @@ -1696,7 +1722,7 @@ FT_ULong base_offset, FT_ULong offset ) { - FT_Error error = 0; + FT_Error error = CFF_Err_Ok; FT_UInt count; FT_UInt j; FT_UShort glyph_sid; @@ -1880,15 +1906,12 @@ { case 0: /* First, copy the code to SID mapping. */ - FT_MEM_COPY( encoding->sids, cff_standard_encoding, - 256 * sizeof ( FT_UShort ) ); - + FT_ARRAY_COPY( encoding->sids, cff_standard_encoding, 256 ); goto Populate; case 1: /* First, copy the code to SID mapping. */ - FT_MEM_COPY( encoding->sids, cff_expert_encoding, - 256 * sizeof ( FT_UShort ) ); + FT_ARRAY_COPY( encoding->sids, cff_expert_encoding, 256 ); Populate: /* Construct code to GID mapping from code to SID mapping */ @@ -1949,7 +1972,7 @@ { FT_Error error; CFF_ParserRec parser; - FT_Byte* dict; + FT_Byte* dict = NULL; FT_ULong dict_len; CFF_FontRecDict top = &font->font_dict; CFF_Private priv = &font->private_dict; @@ -1967,6 +1990,20 @@ top->font_matrix.yy = 0x10000L; top->cid_count = 8720; + /* we use the implementation specific SID value 0xFFFF to indicate */ + /* missing entries */ + top->version = 0xFFFFU; + top->notice = 0xFFFFU; + top->copyright = 0xFFFFU; + top->full_name = 0xFFFFU; + top->family_name = 0xFFFFU; + top->weight = 0xFFFFU; + top->embedded_postscript = 0xFFFFU; + + top->cid_registry = 0xFFFFU; + top->cid_ordering = 0xFFFFU; + top->cid_font_name = 0xFFFFU; + error = cff_index_access_element( idx, font_index, &dict, &dict_len ) || cff_parser_run( &parser, dict, dict + dict_len ); @@ -1976,7 +2013,7 @@ goto Exit; /* if it is a CID font, we stop there */ - if ( top->cid_registry ) + if ( top->cid_registry != 0xFFFFU ) goto Exit; /* parse the private dictionary, if any */ @@ -2117,8 +2154,15 @@ if ( error ) goto Exit; + if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) ) + goto Exit; + + error = cff_new_index( &font->charstrings_index, stream, 0 ); + if ( error ) + goto Exit; + /* now, check for a CID font */ - if ( dict->cid_registry ) + if ( dict->cid_registry != 0xFFFFU ) { CFF_IndexRec fd_index; CFF_SubFont sub; @@ -2161,7 +2205,7 @@ /* now load the FD Select array */ error = CFF_Load_FD_Select( &font->fd_select, - (FT_UInt)dict->cid_count, + font->charstrings_index.count, stream, base_offset + dict->cid_fd_select_offset ); @@ -2182,13 +2226,6 @@ goto Exit; } - if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) ) - goto Exit; - - error = cff_new_index( &font->charstrings_index, stream, 0 ); - if ( error ) - goto Exit; - /* explicit the global subrs */ font->num_global_subrs = font->global_subrs_index.count; font->num_glyphs = font->charstrings_index.count; @@ -2199,25 +2236,38 @@ if ( error ) goto Exit; - /* read the Charset and Encoding tables when available */ + /* read the Charset and Encoding tables if available */ if ( font->num_glyphs > 0 ) { + FT_Bool invert; + + + invert = dict->cid_registry != 0xFFFFU && + font->charstrings_index.count != dict->cid_count; error = cff_charset_load( &font->charset, font->num_glyphs, stream, - base_offset, dict->charset_offset ); + base_offset, dict->charset_offset, invert ); if ( error ) goto Exit; - error = cff_encoding_load( &font->encoding, - &font->charset, - font->num_glyphs, - stream, - base_offset, - dict->encoding_offset ); - if ( error ) - goto Exit; + /* CID-keyed CFFs don't have an encoding */ + if ( dict->cid_registry == 0xFFFFU ) + { + error = cff_encoding_load( &font->encoding, + &font->charset, + font->num_glyphs, + stream, + base_offset, + dict->encoding_offset ); + if ( error ) + goto Exit; + } + else + /* CID-keyed fonts only need CIDs */ + FT_FREE( font->charset.sids ); } - /* get the font name */ + /* get the font name (/CIDFontName for CID-keyed fonts, */ + /* /FontName otherwise) */ font->font_name = cff_index_get_name( &font->name_index, face_index ); Exit: diff --git a/reactos/lib/freetype/src/cff/cffload.h b/reactos/lib/freetype/src/cff/cffload.h index 4cadfe6bbbf..ccf8ada1c3c 100644 --- a/reactos/lib/freetype/src/cff/cffload.h +++ b/reactos/lib/freetype/src/cff/cffload.h @@ -4,7 +4,7 @@ /* */ /* OpenType & CFF data/program tables loader (specification). */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 1996-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -21,8 +21,8 @@ #include <ft2build.h> -#include FT_INTERNAL_CFF_TYPES_H -#include FT_INTERNAL_POSTSCRIPT_NAMES_H +#include "cfftypes.h" +#include FT_SERVICE_POSTSCRIPT_CMAPS_H FT_BEGIN_HEADER @@ -36,9 +36,9 @@ FT_BEGIN_HEADER FT_UInt element ); FT_LOCAL( FT_String* ) - cff_index_get_sid_string( CFF_Index idx, - FT_UInt sid, - PSNames_Service psnames_interface ); + cff_index_get_sid_string( CFF_Index idx, + FT_UInt sid, + FT_Service_PsCMaps psnames ); FT_LOCAL( FT_Error ) @@ -62,7 +62,7 @@ FT_BEGIN_HEADER FT_LOCAL( FT_Byte ) - cff_fd_select_get( CFF_FDSelect select, + cff_fd_select_get( CFF_FDSelect fdselect, FT_UInt glyph_index ); diff --git a/reactos/lib/freetype/src/cff/cffobjs.c b/reactos/lib/freetype/src/cff/cffobjs.c index f0700d1890b..bbe1654ee7d 100644 --- a/reactos/lib/freetype/src/cff/cffobjs.c +++ b/reactos/lib/freetype/src/cff/cffobjs.c @@ -4,7 +4,7 @@ /* */ /* OpenType objects manager (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -24,7 +24,7 @@ #include FT_TRUETYPE_IDS_H #include FT_TRUETYPE_TAGS_H #include FT_INTERNAL_SFNT_H -#include FT_INTERNAL_POSTSCRIPT_NAMES_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H #include FT_INTERNAL_POSTSCRIPT_HINTS_H #include "cffobjs.h" #include "cffload.h" @@ -52,16 +52,81 @@ /*************************************************************************/ +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + static FT_Error + sbit_size_reset( CFF_Size size ) + { + CFF_Face face; + FT_Error error = CFF_Err_Ok; + + FT_ULong strike_index; + FT_Size_Metrics* metrics; + FT_Size_Metrics* sbit_metrics; + SFNT_Service sfnt; + + + metrics = &size->root.metrics; + + face = (CFF_Face)size->root.face; + sfnt = (SFNT_Service)face->sfnt; + + sbit_metrics = &size->strike_metrics; + + error = sfnt->set_sbit_strike( face, + metrics->x_ppem, metrics->y_ppem, + &strike_index ); + + if ( !error ) + { + TT_SBit_Strike strike = face->sbit_strikes + strike_index; + + + sbit_metrics->x_ppem = metrics->x_ppem; + sbit_metrics->y_ppem = metrics->y_ppem; + + sbit_metrics->ascender = strike->hori.ascender << 6; + sbit_metrics->descender = strike->hori.descender << 6; + + /* XXX: Is this correct? */ + sbit_metrics->height = sbit_metrics->ascender - + sbit_metrics->descender; + + /* XXX: Is this correct? */ + sbit_metrics->max_advance = ( strike->hori.min_origin_SB + + strike->hori.max_width + + strike->hori.min_advance_SB ) << 6; + + size->strike_index = (FT_UInt)strike_index; + } + else + { + size->strike_index = 0xFFFFU; + + sbit_metrics->x_ppem = 0; + sbit_metrics->y_ppem = 0; + sbit_metrics->ascender = 0; + sbit_metrics->descender = 0; + sbit_metrics->height = 0; + sbit_metrics->max_advance = 0; + } + + return error; + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + static PSH_Globals_Funcs cff_size_get_globals_funcs( CFF_Size size ) { - CFF_Face face = (CFF_Face)size->face; + CFF_Face face = (CFF_Face)size->root.face; CFF_Font font = (CFF_FontRec *)face->extra.data; PSHinter_Service pshinter = (PSHinter_Service)font->pshinter; FT_Module module; - module = FT_Get_Module( size->face->driver->root.library, + module = FT_Get_Module( size->root.face->driver->root.library, "pshinter" ); return ( module && pshinter && pshinter->get_globals_funcs ) ? pshinter->get_globals_funcs( module ) @@ -72,16 +137,16 @@ FT_LOCAL_DEF( void ) cff_size_done( CFF_Size size ) { - if ( size->internal ) + if ( size->root.internal ) { PSH_Globals_Funcs funcs; funcs = cff_size_get_globals_funcs( size ); if ( funcs ) - funcs->destroy( (PSH_Globals)size->internal ); + funcs->destroy( (PSH_Globals)size->root.internal ); - size->internal = 0; + size->root.internal = 0; } } @@ -89,14 +154,14 @@ FT_LOCAL_DEF( FT_Error ) cff_size_init( CFF_Size size ) { - FT_Error error = 0; + FT_Error error = CFF_Err_Ok; PSH_Globals_Funcs funcs = cff_size_get_globals_funcs( size ); if ( funcs ) { PSH_Globals globals; - CFF_Face face = (CFF_Face)size->face; + CFF_Face face = (CFF_Face)size->root.face; CFF_Font font = (CFF_FontRec *)face->extra.data; CFF_SubFont subfont = &font->top_font; @@ -150,9 +215,9 @@ priv.lenIV = cpriv->lenIV; } - error = funcs->create( size->face->memory, &priv, &globals ); + error = funcs->create( size->root.face->memory, &priv, &globals ); if ( !error ) - size->internal = (FT_Size_Internal)(void*)globals; + size->root.internal = (FT_Size_Internal)(void*)globals; } return error; @@ -163,15 +228,32 @@ cff_size_reset( CFF_Size size ) { PSH_Globals_Funcs funcs = cff_size_get_globals_funcs( size ); - FT_Error error = 0; + FT_Error error = CFF_Err_Ok; + FT_Face face = size->root.face; if ( funcs ) - error = funcs->set_scale( (PSH_Globals)size->internal, - size->metrics.x_scale, - size->metrics.y_scale, + error = funcs->set_scale( (PSH_Globals)size->root.internal, + size->root.metrics.x_scale, + size->root.metrics.y_scale, 0, 0 ); - return error; + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + if ( face->face_flags & FT_FACE_FLAG_FIXED_SIZES ) + { + error = sbit_size_reset( size ); + + if ( !error && !( face->face_flags & FT_FACE_FLAG_SCALABLE ) ) + size->root.metrics = size->strike_metrics; + } + +#endif + + if ( face->face_flags & FT_FACE_FLAG_SCALABLE ) + return CFF_Err_Ok; + else + return error; } @@ -244,8 +326,6 @@ } - - FT_LOCAL_DEF( FT_Error ) cff_face_init( FT_Stream stream, CFF_Face face, @@ -253,30 +333,37 @@ FT_Int num_params, FT_Parameter* params ) { - FT_Error error; - SFNT_Service sfnt; - PSNames_Service psnames; - PSHinter_Service pshinter; - FT_Bool pure_cff = 1; - FT_Bool sfnt_format = 0; + FT_Error error; + SFNT_Service sfnt; + FT_Service_PsCMaps psnames; + PSHinter_Service pshinter; + FT_Bool pure_cff = 1; + FT_Bool sfnt_format = 0; +#if 0 + FT_FACE_FIND_GLOBAL_SERVICE( face, sfnt, SFNT ); + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_NAMES ); + FT_FACE_FIND_GLOBAL_SERVICE( face, pshinter, POSTSCRIPT_HINTER ); + if ( !sfnt ) + goto Bad_Format; +#else sfnt = (SFNT_Service)FT_Get_Module_Interface( face->root.driver->root.library, "sfnt" ); if ( !sfnt ) goto Bad_Format; - psnames = (PSNames_Service)FT_Get_Module_Interface( - face->root.driver->root.library, "psnames" ); + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); pshinter = (PSHinter_Service)FT_Get_Module_Interface( face->root.driver->root.library, "pshinter" ); +#endif /* create input stream from resource */ if ( FT_STREAM_SEEK( 0 ) ) goto Exit; - /* check that we have a valid OpenType file */ + /* check whether we have a valid OpenType file */ error = sfnt->init_face( stream, face, face_index, num_params, params ); if ( !error ) { @@ -293,7 +380,7 @@ sfnt_format = 1; /* now, the font can be either an OpenType/CFF font, or an SVG CEF */ - /* font; in the later case it doesn't have a `head' table */ + /* font; in the latter case it doesn't have a `head' table */ error = face->goto_table( face, TTAG_head, stream, 0 ); if ( !error ) { @@ -307,7 +394,7 @@ } else { - /* load the `cmap' table by hand */ + /* load the `cmap' table explicitly */ error = sfnt->load_charmaps( face, stream ); if ( error ) goto Exit; @@ -317,7 +404,7 @@ /* FreeType 2 */ } - /* now, load the CFF part of the file */ + /* now load the CFF part of the file */ error = face->goto_table( face, TTAG_CFF, stream, 0 ); if ( error ) goto Exit; @@ -332,10 +419,11 @@ /* now load and parse the CFF table in the file */ { - CFF_Font cff; - FT_Memory memory = face->root.memory; - FT_Face root; - FT_Int32 flags; + CFF_Font cff; + CFF_FontRecDict dict; + FT_Memory memory = face->root.memory; + FT_Face root; + FT_Int32 flags; if ( FT_NEW( cff ) ) @@ -347,7 +435,7 @@ goto Exit; cff->pshinter = pshinter; - cff->psnames = psnames; + cff->psnames = (void*)psnames; /* Complement the root flags with some interesting information. */ /* Note that this is only necessary for pure CFF and CEF fonts. */ @@ -355,26 +443,29 @@ root = &face->root; root->num_glyphs = cff->num_glyphs; + dict = &cff->top_font.font_dict; + + /* we need the `PSNames' module for CFF and CEF formats */ + /* which aren't CID-keyed */ + if ( dict->cid_registry == 0xFFFFU && !psnames ) + { + FT_ERROR(( "cff_face_init:" )); + FT_ERROR(( " cannot open CFF & CEF fonts\n" )); + FT_ERROR(( " " )); + FT_ERROR(( " without the `PSNames' module\n" )); + goto Bad_Format; + } + if ( pure_cff ) { - CFF_FontRecDict dict = &cff->top_font.font_dict; + char* style_name = NULL; - /* we need the `PSNames' module for pure-CFF and CEF formats */ - if ( !psnames ) - { - FT_ERROR(( "cff_face_init:" )); - FT_ERROR(( " cannot open CFF & CEF fonts\n" )); - FT_ERROR(( " " )); - FT_ERROR(( " without the `PSNames' module\n" )); - goto Bad_Format; - } - /* Set up num_faces. */ root->num_faces = cff->num_faces; /* compute number of glyphs */ - if ( dict->cid_registry ) + if ( dict->cid_registry != 0xFFFFU ) root->num_glyphs = dict->cid_count; else root->num_glyphs = cff->charstrings_index.count; @@ -385,7 +476,6 @@ root->bbox.xMax = ( dict->font_bbox.xMax + 0xFFFFU ) >> 16; root->bbox.yMax = ( dict->font_bbox.yMax + 0xFFFFU ) >> 16; - root->ascender = (FT_Short)( root->bbox.yMax ); root->descender = (FT_Short)( root->bbox.yMin ); root->height = (FT_Short)( @@ -396,17 +486,87 @@ else root->units_per_EM = 1000; - root->underline_position = dict->underline_position >> 16; - root->underline_thickness = dict->underline_thickness >> 16; + root->underline_position = + (FT_Short)( dict->underline_position >> 16 ); + root->underline_thickness = + (FT_Short)( dict->underline_thickness >> 16 ); /* retrieve font family & style name */ - root->family_name = cff_index_get_name( &cff->name_index, face_index ); - if ( dict->cid_registry ) - root->style_name = cff_strcpy( memory, "Regular" ); /* XXXX */ + root->family_name = cff_index_get_name( &cff->name_index, + face_index ); + + if ( root->family_name ) + { + char* full = cff_index_get_sid_string( &cff->string_index, + dict->full_name, + psnames ); + char* fullp = full; + char* family = root->family_name; + + /* we're going to try to extract the style name from the + * full name. We need to ignore spaces and dashes during + * the search. + */ + if ( full ) + { + while ( *fullp ) + { + /* skip common characters at the start of both strings + */ + if ( *fullp == *family ) + { + family++; + fullp++; + continue; + } + + /* ignore spaces or dashes in full name during comparison + */ + if ( *fullp == ' ' || *fullp == '-' ) + { + fullp++; + continue; + } + /* ignore spaces and dashes in family name during comparison + */ + if ( *family == ' ' || *family == '-' ) + { + family++; + continue; + } + + if ( !*family && *fullp ) + { + /* the full name begins with the same characters than the + * family name, with spaces and dashes removed. In this + * case, the remaining string in "fullp" will be used + * as the style name + */ + style_name = cff_strcpy( memory, fullp ); + } + break; + } + FT_FREE( full ); + } + } else - root->style_name = cff_index_get_sid_string( &cff->string_index, - dict->weight, - psnames ); + { + char *cid_font_name = + cff_index_get_sid_string( &cff->string_index, + dict->cid_font_name, + psnames ); + + + /* do we have a `/FontName' for a CID-keyed font? */ + if ( cid_font_name ) + root->family_name = cid_font_name; + } + + if ( style_name ) + root->style_name = style_name; + else + /* assume "Regular" style if we don't know better */ + root->style_name = cff_strcpy( memory, (char *)"Regular" ); /*******************************************************************/ /* */ @@ -429,10 +589,6 @@ flags |= FT_FACE_FLAG_KERNING; #endif -#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES - flags |= FT_FACE_FLAG_GLYPH_NAMES; -#endif - root->face_flags = flags; /*******************************************************************/ @@ -444,13 +600,29 @@ if ( dict->italic_angle ) flags |= FT_STYLE_FLAG_ITALIC; - /* XXX: may not be correct */ - if ( cff->top_font.private_dict.force_bold ) - flags |= FT_STYLE_FLAG_BOLD; + { + char *weight = cff_index_get_sid_string( &cff->string_index, + dict->weight, + psnames ); + + + if ( weight ) + if ( !ft_strcmp( weight, "Bold" ) || + !ft_strcmp( weight, "Black" ) ) + flags |= FT_STYLE_FLAG_BOLD; + FT_FREE( weight ); + } root->style_flags = flags; } +#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES + /* CID-keyed CFF fonts don't have glyph names -- the SFNT loader */ + /* has unset this flag because of the 3.0 `post' table */ + if ( dict->cid_registry == 0xFFFFU ) + root->face_flags |= FT_FACE_FLAG_GLYPH_NAMES; +#endif + /*******************************************************************/ /* */ /* Compute char maps. */ @@ -479,7 +651,12 @@ goto Skip_Unicode; /* Standard Unicode (deprecated) */ } - /* we didn't find a Unicode charmap, synthetize one */ + /* since CID-keyed fonts don't contain glyph names, we can't */ + /* construct a cmap */ + if ( pure_cff && cff->top_font.font_dict.cid_registry != 0xFFFFU ) + goto Exit; + + /* we didn't find a Unicode charmap -- synthetize one */ cmaprec.face = root; cmaprec.platform_id = 3; cmaprec.encoding_id = 1; diff --git a/reactos/lib/freetype/src/cff/cffobjs.h b/reactos/lib/freetype/src/cff/cffobjs.h index cf60ecfb254..f02a5d74846 100644 --- a/reactos/lib/freetype/src/cff/cffobjs.h +++ b/reactos/lib/freetype/src/cff/cffobjs.h @@ -4,7 +4,7 @@ /* */ /* OpenType objects manager (specification). */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -22,9 +22,9 @@ #include <ft2build.h> #include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_CFF_TYPES_H +#include "cfftypes.h" #include FT_INTERNAL_TRUETYPE_TYPES_H -#include FT_INTERNAL_POSTSCRIPT_NAMES_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H FT_BEGIN_HEADER @@ -51,7 +51,18 @@ FT_BEGIN_HEADER /* <Description> */ /* A handle to an OpenType size object. */ /* */ - typedef FT_Size CFF_Size; + typedef struct CFF_SizeRec_ + { + FT_SizeRec root; + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + FT_UInt strike_index; /* 0xFFFF to indicate invalid */ + FT_Size_Metrics strike_metrics; /* current strike's metrics */ + +#endif + + } CFF_SizeRec, *CFF_Size; /*************************************************************************/ @@ -89,15 +100,6 @@ FT_BEGIN_HEADER } CFF_Transform; - /* this is only used in the case of a pure CFF font with no charmap */ - typedef struct CFF_CharMapRec_ - { - TT_CharMapRec root; - PS_Unicodes unicodes; - - } CFF_CharMapRec, *CFF_CharMap; - - /***********************************************************************/ /* */ /* TrueType driver class. */ diff --git a/reactos/lib/freetype/src/cff/cffparse.c b/reactos/lib/freetype/src/cff/cffparse.c index a44e43e20de..c4e5a6c5951 100644 --- a/reactos/lib/freetype/src/cff/cffparse.c +++ b/reactos/lib/freetype/src/cff/cffparse.c @@ -4,7 +4,7 @@ /* */ /* CFF token stream parser (body) */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -334,7 +334,7 @@ offset->x = cff_parse_fixed_thousand( data++ ); offset->y = cff_parse_fixed_thousand( data ); - temp = ABS( matrix->yy ); + temp = FT_ABS( matrix->yy ); *upm = (FT_UShort)FT_DivFix( 0x10000L, FT_DivFix( temp, 1000 ) ); diff --git a/reactos/lib/freetype/src/cff/cffparse.h b/reactos/lib/freetype/src/cff/cffparse.h index 2de95a2c5bb..8f3fa588592 100644 --- a/reactos/lib/freetype/src/cff/cffparse.h +++ b/reactos/lib/freetype/src/cff/cffparse.h @@ -4,7 +4,7 @@ /* */ /* CFF token stream parser (specification) */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 1996-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -21,7 +21,7 @@ #include <ft2build.h> -#include FT_INTERNAL_CFF_TYPES_H +#include "cfftypes.h" #include FT_INTERNAL_OBJECTS_H diff --git a/reactos/lib/freetype/src/cff/cfftoken.h b/reactos/lib/freetype/src/cff/cfftoken.h index 65a84683e8f..659d1576aab 100644 --- a/reactos/lib/freetype/src/cff/cfftoken.h +++ b/reactos/lib/freetype/src/cff/cfftoken.h @@ -43,10 +43,10 @@ CFF_FIELD_NUM ( 17, charstrings_offset ) CFF_FIELD_CALLBACK( 18, private_dict ) CFF_FIELD_NUM ( 0x114, synthetic_base ) - CFF_FIELD_STRING ( 0x115, postscript ) - CFF_FIELD_STRING ( 0x116, base_font_name ) + CFF_FIELD_STRING ( 0x115, embedded_postscript ) #if 0 + CFF_FIELD_STRING ( 0x116, base_font_name ) CFF_FIELD_DELTA ( 0x117, base_font_blend, 16 ) CFF_FIELD_CALLBACK( 0x118, multiple_master ) CFF_FIELD_CALLBACK( 0x119, blend_axit_types ) diff --git a/reactos/lib/freetype/include/freetype/internal/cfftypes.h b/reactos/lib/freetype/src/cff/cfftypes.h similarity index 97% rename from reactos/lib/freetype/include/freetype/internal/cfftypes.h rename to reactos/lib/freetype/src/cff/cfftypes.h index e19e593e03b..9ddc663dea6 100644 --- a/reactos/lib/freetype/include/freetype/internal/cfftypes.h +++ b/reactos/lib/freetype/src/cff/cfftypes.h @@ -82,7 +82,8 @@ FT_BEGIN_HEADER FT_ULong offset; FT_UShort* sids; - + FT_UShort* cids; /* the inverse mapping of `sids'; only needed */ + /* for CID-keyed fonts */ } CFF_CharsetRec, *CFF_Charset; @@ -113,8 +114,6 @@ FT_BEGIN_HEADER FT_ULong private_size; FT_Long synthetic_base; FT_UInt embedded_postscript; - FT_UInt base_font_name; - FT_UInt postscript; /* these should only be used for the top-level font dictionary */ FT_UInt cid_registry; @@ -124,7 +123,7 @@ FT_BEGIN_HEADER FT_Long cid_font_version; FT_Long cid_font_revision; FT_Long cid_font_type; - FT_Long cid_count; + FT_ULong cid_count; FT_ULong cid_uid_base; FT_ULong cid_fd_array_offset; FT_ULong cid_fd_select_offset; @@ -200,7 +199,7 @@ FT_BEGIN_HEADER /* maximum number of sub-fonts in a CID-keyed file */ -#define CFF_MAX_CID_FONTS 16 +#define CFF_MAX_CID_FONTS 32 typedef struct CFF_FontRec_ diff --git a/reactos/lib/freetype/src/cff/rules.mk b/reactos/lib/freetype/src/cff/rules.mk index 579f144e019..4100c806875 100644 --- a/reactos/lib/freetype/src/cff/rules.mk +++ b/reactos/lib/freetype/src/cff/rules.mk @@ -34,6 +34,7 @@ CFF_DRV_SRC := $(CFF_DIR)/cffobjs.c \ # CFF_DRV_H := $(CFF_DRV_SRC:%.c=%.h) \ $(CFF_DIR)/cfftoken.h \ + $(CFF_DIR)/cfftypes.h \ $(CFF_DIR)/cfferrs.h diff --git a/reactos/lib/freetype/src/cid/cidgload.c b/reactos/lib/freetype/src/cid/cidgload.c index e07fb717c66..3717eeb9e54 100644 --- a/reactos/lib/freetype/src/cid/cidgload.c +++ b/reactos/lib/freetype/src/cid/cidgload.c @@ -4,7 +4,7 @@ /* */ /* CID-keyed Type1 Glyph Loader (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -44,7 +44,7 @@ CID_FaceInfo cid = &face->cid; FT_Byte* p; FT_UInt fd_select; - FT_Stream stream = face->root.stream; + FT_Stream stream = face->cid_stream; FT_Error error = 0; FT_Byte* charstring = 0; FT_Memory memory = face->root.memory; @@ -306,7 +306,7 @@ 0, /* glyph names -- XXX */ 0, /* blend == 0 */ hinting, - FT_LOAD_TARGET_MODE(load_flags), + FT_LOAD_TARGET_MODE( load_flags ), cid_load_glyph ); /* set up the decoder */ @@ -412,11 +412,11 @@ if ( hinting ) { - metrics->horiAdvance = ( metrics->horiAdvance + 32 ) & -64; - metrics->vertAdvance = ( metrics->vertAdvance + 32 ) & -64; + metrics->horiAdvance = FT_PIX_ROUND( metrics->horiAdvance ); + metrics->vertAdvance = FT_PIX_ROUND( metrics->vertAdvance ); - metrics->vertBearingX = ( metrics->vertBearingX + 32 ) & -64; - metrics->vertBearingY = ( metrics->vertBearingY + 32 ) & -64; + metrics->vertBearingX = FT_PIX_ROUND( metrics->vertBearingX ); + metrics->vertBearingY = FT_PIX_ROUND( metrics->vertBearingY ); } } @@ -426,10 +426,10 @@ /* grid fit the bounding box if necessary */ if ( hinting ) { - cbox.xMin &= -64; - cbox.yMin &= -64; - cbox.xMax = ( cbox.xMax + 63 ) & -64; - cbox.yMax = ( cbox.yMax + 63 ) & -64; + cbox.xMin = FT_PIX_FLOOR( cbox.xMin ); + cbox.yMin = FT_PIX_FLOOR( cbox.yMin ); + cbox.xMax = FT_PIX_CEIL( cbox.xMax ); + cbox.yMax = FT_PIX_CEIL( cbox.yMax ); } metrics->width = cbox.xMax - cbox.xMin; diff --git a/reactos/lib/freetype/src/cid/cidload.c b/reactos/lib/freetype/src/cid/cidload.c index 7b0aba6af9f..ad29dd52d27 100644 --- a/reactos/lib/freetype/src/cid/cidload.c +++ b/reactos/lib/freetype/src/cid/cidload.c @@ -4,7 +4,7 @@ /* */ /* CID-keyed Type1 font loader (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -39,7 +39,7 @@ /* read a single offset */ FT_LOCAL_DEF( FT_Long ) - cid_get_offset( FT_Byte** start, + cid_get_offset( FT_Byte* *start, FT_Byte offsize ) { FT_Long result; @@ -162,11 +162,11 @@ (void)cid_parser_to_fixed_array( parser, 6, temp, 3 ); - temp_scale = ABS( temp[3] ); + temp_scale = FT_ABS( temp[3] ); - /* Set Units per EM based on FontMatrix values. We set the value to */ + /* Set units per EM based on FontMatrix values. We set the value to */ /* `1000/temp_scale', because temp_scale was already multiplied by */ - /* 1000 (in t1_tofixed(), from psobjs.c). */ + /* 1000 (in `t1_tofixed', from psobjs.c). */ root->units_per_EM = (FT_UShort)( FT_DivFix( 0x10000L, FT_DivFix( temp_scale, 1000 ) ) ); @@ -191,7 +191,7 @@ offset->y = temp[5] >> 16; } - return CID_Err_Ok; /* this is a callback function; */ + return CID_Err_Ok; /* this is a callback function; */ /* we must return an error code */ } @@ -258,42 +258,61 @@ parser->root.cursor = base; parser->root.limit = base + size; - parser->root.error = 0; + parser->root.error = CID_Err_Ok; { FT_Byte* cur = base; FT_Byte* limit = cur + size; - for ( ;cur < limit; cur++ ) + for (;;) { - /* look for `%ADOBeginFontDict' */ - if ( *cur == '%' && cur + 20 < limit && - ft_strncmp( (char*)cur, "%ADOBeginFontDict", 17 ) == 0 ) - { - cur += 17; + FT_Byte* newlimit; - /* if /FDArray was found, then cid->num_dicts is > 0, and */ - /* we can start increasing parser->num_dict */ - if ( face->cid.num_dicts > 0 ) - parser->num_dict++; - } - /* look for immediates */ - else if ( *cur == '/' && cur + 2 < limit ) + + parser->root.cursor = cur; + cid_parser_skip_spaces( parser ); + + if ( parser->root.cursor >= limit ) + newlimit = limit - 1 - 17; + else + newlimit = parser->root.cursor - 17; + + /* look for `%ADOBeginFontDict' */ + for ( ; cur < newlimit; cur++ ) { - FT_Int len; + if ( *cur == '%' && + ft_strncmp( (char*)cur, "%ADOBeginFontDict", 17 ) == 0 ) + { + /* if /FDArray was found, then cid->num_dicts is > 0, and */ + /* we can start increasing parser->num_dict */ + if ( face->cid.num_dicts > 0 ) + parser->num_dict++; + } + } + + cur = parser->root.cursor; + /* no error can occur in cid_parser_skip_spaces */ + if ( cur >= limit ) + break; + + cid_parser_skip_PS_token( parser ); + if ( parser->root.cursor >= limit || parser->root.error ) + break; + + /* look for immediates */ + if ( *cur == '/' && cur + 2 < limit ) + { + FT_PtrDist len; cur++; + len = parser->root.cursor - cur; - parser->root.cursor = cur; - cid_parser_skip_alpha( parser ); - - len = (FT_Int)( parser->root.cursor - cur ); if ( len > 0 && len < 22 ) { /* now compare the immediate name to the keyword table */ - T1_Field keyword = (T1_Field) cid_field_records; + T1_Field keyword = (T1_Field)cid_field_records; for (;;) @@ -305,10 +324,10 @@ if ( !name ) break; - if ( cur[0] == name[0] && - len == (FT_Int)ft_strlen( (const char*)name ) ) + if ( cur[0] == name[0] && + len == ft_strlen( (const char*)name ) ) { - FT_Int n; + FT_PtrDist n; for ( n = 1; n < len; n++ ) @@ -318,14 +337,11 @@ if ( n >= len ) { /* we found it - run the parsing callback */ - cid_parser_skip_spaces( parser ); parser->root.error = cid_load_keyword( face, loader, keyword ); if ( parser->root.error ) return parser->root.error; - - cur = parser->root.cursor; break; } } @@ -333,6 +349,8 @@ } } } + + cur = parser->root.cursor; } } return parser->root.error; @@ -345,7 +363,7 @@ { CID_FaceInfo cid = &face->cid; FT_Memory memory = face->root.memory; - FT_Stream stream = face->root.stream; + FT_Stream stream = face->cid_stream; FT_Error error; FT_Int n; CID_Subrs subr; @@ -370,7 +388,7 @@ /* reallocate offsets array if needed */ if ( num_subrs + 1 > max_offsets ) { - FT_UInt new_max = ( num_subrs + 1 + 3 ) & -4; + FT_UInt new_max = FT_PAD_CEIL( num_subrs + 1, 4 ); if ( FT_RENEW_ARRAY( offsets, max_offsets, new_max ) ) @@ -381,7 +399,7 @@ /* read the subrmap's offsets */ if ( FT_STREAM_SEEK( cid->data_offset + dict->subrmap_offset ) || - FT_FRAME_ENTER( ( num_subrs + 1 ) * dict->sd_bytes ) ) + FT_FRAME_ENTER( ( num_subrs + 1 ) * dict->sd_bytes ) ) goto Fail; p = (FT_Byte*)stream->cursor; @@ -469,11 +487,111 @@ } + static FT_Error + cid_hex_to_binary( FT_Byte* data, + FT_Long data_len, + FT_ULong offset, + CID_Face face ) + { + FT_Stream stream = face->root.stream; + FT_Error error; + + FT_Byte buffer[256]; + FT_Byte *p, *plimit; + FT_Byte *d, *dlimit; + FT_Byte val; + + FT_Bool upper_nibble, done; + + + if ( FT_STREAM_SEEK( offset ) ) + goto Exit; + + d = data; + dlimit = d + data_len; + p = buffer; + plimit = p; + + upper_nibble = 1; + done = 0; + + while ( d < dlimit ) + { + if ( p >= plimit ) + { + FT_ULong oldpos = FT_STREAM_POS(); + FT_ULong size = stream->size - oldpos; + + + if ( size == 0 ) + { + error = CID_Err_Syntax_Error; + goto Exit; + } + + if ( FT_STREAM_READ( buffer, 256 > size ? size : 256 ) ) + goto Exit; + p = buffer; + plimit = p + FT_STREAM_POS() - oldpos; + } + + if ( ft_isdigit( *p ) ) + val = *p - '0'; + else if ( *p >= 'a' && *p <= 'f' ) + val = *p - 'a'; + else if ( *p >= 'A' && *p <= 'F' ) + val = *p - 'A' + 10; + else if ( *p == ' ' || + *p == '\t' || + *p == '\r' || + *p == '\n' || + *p == '\f' || + *p == '\0' ) + { + p++; + continue; + } + else if ( *p == '>' ) + { + val = 0; + done = 1; + } + else + { + error = CID_Err_Syntax_Error; + goto Exit; + } + + if ( upper_nibble ) + *d = val << 4; + else + { + *d += val; + d++; + } + + upper_nibble = 1 - upper_nibble; + + if ( done ) + break; + + p++; + } + + error = CID_Err_Ok; + + Exit: + return error; + } + + FT_LOCAL_DEF( FT_Error ) - cid_face_open( CID_Face face ) + cid_face_open( CID_Face face, + FT_Int face_index ) { CID_Loader loader; CID_Parser* parser; + FT_Memory memory = face->root.memory; FT_Error error; @@ -491,7 +609,30 @@ if ( error ) goto Exit; - face->cid.data_offset = loader.parser.data_offset; + if ( face_index < 0 ) + goto Exit; + + if ( FT_NEW( face->cid_stream ) ) + goto Exit; + + if ( parser->binary_length ) + { + /* we must convert the data section from hexadecimal to binary */ + if ( FT_ALLOC( face->binary_data, parser->binary_length ) || + cid_hex_to_binary( face->binary_data, parser->binary_length, + parser->data_offset, face ) ) + goto Exit; + + FT_Stream_OpenMemory( face->cid_stream, + face->binary_data, parser->binary_length ); + face->cid.data_offset = 0; + } + else + { + *face->cid_stream = *face->root.stream; + face->cid.data_offset = loader.parser.data_offset; + } + error = cid_read_subrs( face ); Exit: diff --git a/reactos/lib/freetype/src/cid/cidload.h b/reactos/lib/freetype/src/cid/cidload.h index a7f4bceab37..8c172ffee2d 100644 --- a/reactos/lib/freetype/src/cid/cidload.h +++ b/reactos/lib/freetype/src/cid/cidload.h @@ -4,7 +4,7 @@ /* */ /* CID-keyed Type1 font loader (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -41,7 +41,8 @@ FT_BEGIN_HEADER FT_Byte offsize ); FT_LOCAL( FT_Error ) - cid_face_open( CID_Face face ); + cid_face_open( CID_Face face, + FT_Int face_index ); FT_END_HEADER diff --git a/reactos/lib/freetype/src/cid/cidobjs.c b/reactos/lib/freetype/src/cid/cidobjs.c index 313d315055b..356d01805ab 100644 --- a/reactos/lib/freetype/src/cid/cidobjs.c +++ b/reactos/lib/freetype/src/cid/cidobjs.c @@ -4,7 +4,7 @@ /* */ /* CID objects manager (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -23,7 +23,7 @@ #include "cidgload.h" #include "cidload.h" -#include FT_INTERNAL_POSTSCRIPT_NAMES_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H #include FT_INTERNAL_POSTSCRIPT_AUX_H #include FT_INTERNAL_POSTSCRIPT_HINTS_H @@ -199,12 +199,12 @@ if ( face->subrs ) { FT_Int n; - + for ( n = 0; n < cid->num_dicts; n++ ) { CID_Subrs subr = face->subrs + n; - + if ( subr->code ) { @@ -234,6 +234,9 @@ face->root.family_name = 0; face->root.style_name = 0; + + FT_FREE( face->binary_data ); + FT_FREE( face->cid_stream ); } } @@ -268,27 +271,19 @@ FT_Int num_params, FT_Parameter* params ) { - FT_Error error; - PSNames_Service psnames; - PSAux_Service psaux; - PSHinter_Service pshinter; + FT_Error error; + FT_Service_PsCMaps psnames; + PSAux_Service psaux; + PSHinter_Service pshinter; FT_UNUSED( num_params ); FT_UNUSED( params ); - FT_UNUSED( face_index ); FT_UNUSED( stream ); face->root.num_faces = 1; - psnames = (PSNames_Service)face->psnames; - if ( !psnames ) - { - psnames = (PSNames_Service)FT_Get_Module_Interface( - FT_FACE_LIBRARY( face ), "psnames" ); - - face->psnames = psnames; - } + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); psaux = (PSAux_Service)face->psaux; if ( !psaux ) @@ -312,7 +307,7 @@ if ( FT_STREAM_SEEK( 0 ) ) goto Exit; - error = cid_face_open( face ); + error = cid_face_open( face, face_index ); if ( error ) goto Exit; @@ -423,8 +418,8 @@ root->height = (FT_Short)( ( ( root->ascender - root->descender ) * 12 ) / 10 ); - root->underline_position = info->underline_position >> 16; - root->underline_thickness = info->underline_thickness >> 16; + root->underline_position = (FT_Short)info->underline_position; + root->underline_thickness = (FT_Short)info->underline_thickness; root->internal->max_points = 0; root->internal->max_contours = 0; diff --git a/reactos/lib/freetype/src/cid/cidparse.c b/reactos/lib/freetype/src/cid/cidparse.c index 397a66ff8f0..3f18749f607 100644 --- a/reactos/lib/freetype/src/cid/cidparse.c +++ b/reactos/lib/freetype/src/cid/cidparse.c @@ -4,7 +4,7 @@ /* */ /* CID-keyed Type1 parser (body). */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -58,6 +58,8 @@ FT_ULong base_offset, offset, ps_len; FT_Byte buffer[256 + 10]; FT_Int buff_len; + FT_Byte *cur, *limit; + FT_Byte *arg1, *arg2; FT_MEM_ZERO( parser, sizeof ( *parser ) ); @@ -67,7 +69,7 @@ base_offset = FT_STREAM_POS(); - /* first of all, check the font format in the header */ + /* first of all, check the font format in the header */ if ( FT_FRAME_ENTER( 31 ) ) goto Exit; @@ -82,15 +84,17 @@ if ( error ) goto Exit; - /* now, read the rest of the file, until we find a `StartData' */ + Again: + /* now, read the rest of the file until we find a `StartData' */ buff_len = 256; for (;;) { - FT_Byte *p, *limit = buffer + 256; + FT_Byte* p; FT_ULong top_position; /* fill input buffer */ + limit = buffer + 256; buff_len -= 256; if ( buff_len > 0 ) FT_MEM_MOVE( buffer, limit, buff_len ); @@ -101,7 +105,7 @@ goto Exit; top_position = FT_STREAM_POS() - buff_len; - buff_len = 256 + 10; + buff_len = 256 + 10; /* look for `StartData' */ for ( p = buffer; p < limit; p++ ) @@ -116,12 +120,12 @@ } Found: - /* we have found the start of the binary data. We will now */ - /* rewind and extract the frame of corresponding to the Postscript */ - /* section */ + /* we have found the start of the binary data. We will now */ + /* rewind and extract the frame corresponding to the PostScript */ + /* section */ ps_len = offset - base_offset; - if ( FT_STREAM_SEEK( base_offset ) || + if ( FT_STREAM_SEEK( base_offset ) || FT_FRAME_EXTRACT( ps_len, parser->postscript ) ) goto Exit; @@ -132,6 +136,45 @@ parser->root.limit = parser->root.cursor + ps_len; parser->num_dict = -1; + /* Finally, we check whether `StartData' was real -- it could be */ + /* in a comment or string. We also get its arguments to find out */ + /* whether the data is represented in binary or hex format. */ + + arg1 = parser->root.cursor; + cid_parser_skip_PS_token( parser ); + cid_parser_skip_spaces ( parser ); + arg2 = parser->root.cursor; + cid_parser_skip_PS_token( parser ); + cid_parser_skip_spaces ( parser ); + + limit = parser->root.limit; + cur = parser->root.cursor; + + while ( cur < limit ) + { + if ( *cur == 'S' && ft_strncmp( (char*)cur, "StartData", 9 ) == 0 ) + { + if ( ft_strncmp( (char*)arg1, "(Hex)", 5 ) == 0 ) + parser->binary_length = ft_atol( (const char *)arg2 ); + + limit = parser->root.limit; + cur = parser->root.cursor; + goto Exit; + } + + cid_parser_skip_PS_token( parser ); + cid_parser_skip_spaces ( parser ); + arg1 = arg2; + arg2 = cur; + cur = parser->root.cursor; + } + + /* we haven't found the correct `StartData'; go back and continue */ + /* searching */ + FT_FRAME_RELEASE( parser->postscript ); + if ( !FT_STREAM_SEEK( offset ) ) + goto Again; + Exit: return error; } diff --git a/reactos/lib/freetype/src/cid/cidparse.h b/reactos/lib/freetype/src/cid/cidparse.h index 1b3e0b9670a..ca37deab936 100644 --- a/reactos/lib/freetype/src/cid/cidparse.h +++ b/reactos/lib/freetype/src/cid/cidparse.h @@ -4,7 +4,7 @@ /* */ /* CID-keyed Type1 parser (specification). */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -50,6 +50,9 @@ FT_BEGIN_HEADER /* data_offset :: The start position of the binary data (i.e., the */ /* end of the data to be parsed. */ /* */ + /* binary_length :: The length of the data after the `StartData' */ + /* command if the data format is hexadecimal. */ + /* */ /* cid :: A structure which holds the information about */ /* the current font. */ /* */ @@ -65,6 +68,8 @@ FT_BEGIN_HEADER FT_ULong data_offset; + FT_Long binary_length; + CID_FaceInfo cid; FT_Int num_dict; @@ -87,8 +92,10 @@ FT_BEGIN_HEADER /* */ /*************************************************************************/ -#define cid_parser_skip_spaces( p ) (p)->root.funcs.skip_spaces( &(p)->root ) -#define cid_parser_skip_alpha( p ) (p)->root.funcs.skip_alpha ( &(p)->root ) +#define cid_parser_skip_spaces( p ) \ + (p)->root.funcs.skip_spaces( &(p)->root ) +#define cid_parser_skip_PS_token( p ) \ + (p)->root.funcs.skip_PS_token( &(p)->root ) #define cid_parser_to_int( p ) (p)->root.funcs.to_int( &(p)->root ) #define cid_parser_to_fixed( p, t ) (p)->root.funcs.to_fixed( &(p)->root, t ) diff --git a/reactos/lib/freetype/src/cid/cidriver.c b/reactos/lib/freetype/src/cid/cidriver.c index 471f196379d..f5639b9f760 100644 --- a/reactos/lib/freetype/src/cid/cidriver.c +++ b/reactos/lib/freetype/src/cid/cidriver.c @@ -21,10 +21,12 @@ #include "cidgload.h" #include FT_INTERNAL_DEBUG_H #include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_POSTSCRIPT_NAMES_H #include "ciderrs.h" +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_XFREE86_NAME_H +#include FT_SERVICE_POSTSCRIPT_INFO_H /*************************************************************************/ /* */ @@ -36,6 +38,11 @@ #define FT_COMPONENT trace_ciddriver + /* + * POSTSCRIPT NAME SERVICE + * + */ + static const char* cid_get_postscript_name( CID_Face face ) { @@ -49,6 +56,47 @@ } + static const FT_Service_PsFontNameRec cid_service_ps_name = + { + (FT_PsName_GetFunc) cid_get_postscript_name + }; + + + /* + * POSTSCRIPT INFO SERVICE + * + */ + + static FT_Error + cid_ps_get_font_info( FT_Face face, + PS_FontInfoRec* afont_info ) + { + *afont_info = ((CID_Face)face)->cid.font_info; + return 0; + } + + + static const FT_Service_PsInfoRec cid_service_ps_info = + { + (PS_GetFontInfoFunc) cid_ps_get_font_info, + (PS_HasGlyphNamesFunc)NULL /* unsupported with CID fonts */ + }; + + + /* + * SERVICE LIST + * + */ + + static const FT_ServiceDescRec cid_services[] = + { + { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &cid_service_ps_name }, + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CID }, + { FT_SERVICE_ID_POSTSCRIPT_INFO, &cid_service_ps_info }, + { NULL, NULL } + }; + + static FT_Module_Interface cid_get_interface( FT_Driver driver, const FT_String* cid_interface ) @@ -56,10 +104,7 @@ FT_UNUSED( driver ); FT_UNUSED( cid_interface ); - if ( ft_strcmp( (const char*)cid_interface, "postscript_name" ) == 0 ) - return (FT_Module_Interface)cid_get_postscript_name; - - return 0; + return ft_service_list_lookup( cid_services, cid_interface ); } diff --git a/reactos/lib/freetype/src/gzip/adler32.c b/reactos/lib/freetype/src/gzip/adler32.c index 337589818fe..95d52cec6c3 100644 --- a/reactos/lib/freetype/src/gzip/adler32.c +++ b/reactos/lib/freetype/src/gzip/adler32.c @@ -3,7 +3,7 @@ * For conditions of distribution and use, see copyright notice in zlib.h */ -/* @(#) $Id: adler32.c,v 1.5 2004/02/15 21:45:34 gvg Exp $ */ +/* @(#) $Id: adler32.c,v 1.6 2004/05/10 17:48:32 gvg Exp $ */ #include "zlib.h" diff --git a/reactos/lib/freetype/src/gzip/ftgzip.c b/reactos/lib/freetype/src/gzip/ftgzip.c index 0787d8095ac..e35c07385b7 100644 --- a/reactos/lib/freetype/src/gzip/ftgzip.c +++ b/reactos/lib/freetype/src/gzip/ftgzip.c @@ -4,11 +4,11 @@ /* */ /* FreeType support for .gz compressed files. */ /* */ -/* this optional component relies on zlib. It should mainly be used to */ +/* This optional component relies on zlib. It should mainly be used to */ /* parse compressed PCF fonts, as found with many X11 server */ /* distributions. */ /* */ -/* Copyright 2002, 2003 by */ +/* Copyright 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -144,7 +144,7 @@ /***************************************************************************/ /***************************************************************************/ -#define FT_GZIP_BUFFER_SIZE 4096 +#define FT_GZIP_BUFFER_SIZE 4096 typedef struct FT_GZipFileRec_ { @@ -154,7 +154,7 @@ z_stream zstream; /* zlib input stream */ FT_ULong start; /* starting position, after .gz header */ - FT_Byte input[FT_GZIP_BUFFER_SIZE]; /* input read buffer */ + FT_Byte input[FT_GZIP_BUFFER_SIZE]; /* input read buffer */ FT_Byte buffer[FT_GZIP_BUFFER_SIZE]; /* output buffer */ FT_ULong pos; /* position in output */ @@ -173,7 +173,7 @@ #define FT_GZIP_RESERVED 0xE0 /* bits 5..7: reserved */ - /* check and skip .gz header - we don't support "transparent" compression */ + /* check and skip .gz header - we don't support `transparent' compression */ static FT_Error ft_gzip_check_header( FT_Stream stream ) { @@ -254,7 +254,7 @@ FT_Stream source ) { z_stream* zstream = &zip->zstream; - FT_Error error = 0; + FT_Error error = Gzip_Err_Ok; zip->stream = stream; @@ -276,9 +276,9 @@ zip->start = FT_STREAM_POS(); } - /* initialize zlib - there is no zlib header in the compressed stream */ - zstream->zalloc = (alloc_func) ft_gzip_alloc; - zstream->zfree = (free_func) ft_gzip_free; + /* initialize zlib -- there is no zlib header in the compressed stream */ + zstream->zalloc = (alloc_func)ft_gzip_alloc; + zstream->zfree = (free_func) ft_gzip_free; zstream->opaque = stream->memory; zstream->avail_in = 0; @@ -286,10 +286,7 @@ if ( inflateInit2( zstream, -MAX_WBITS ) != Z_OK || zstream->next_in == NULL ) - { error = Gzip_Err_Invalid_File_Format; - goto Exit; - } Exit: return error; @@ -301,6 +298,7 @@ { z_stream* zstream = &zip->zstream; + inflateEnd( zstream ); /* clear the rest */ @@ -341,7 +339,8 @@ zip->cursor = zip->limit; zip->pos = 0; } - return error; + + return error; } @@ -376,7 +375,7 @@ zstream->next_in = zip->input; zstream->avail_in = size; - return 0; + return Gzip_Err_Ok; } @@ -418,6 +417,7 @@ break; } } + return error; } @@ -427,8 +427,8 @@ ft_gzip_file_skip_output( FT_GZipFile zip, FT_ULong count ) { - FT_Error error = 0; - FT_ULong delta; + FT_Error error = Gzip_Err_Ok; + FT_ULong delta; for (;;) diff --git a/reactos/lib/freetype/src/gzip/infblock.c b/reactos/lib/freetype/src/gzip/infblock.c index 8d3e2104296..d6e2dc297da 100644 --- a/reactos/lib/freetype/src/gzip/infblock.c +++ b/reactos/lib/freetype/src/gzip/infblock.c @@ -156,7 +156,8 @@ int r ) uInt bl, bd; inflate_huft *tl, *td; - inflate_trees_fixed(&bl, &bd, &tl, &td, z); + inflate_trees_fixed(&bl, &bd, (const inflate_huft**)&tl, + (const inflate_huft**)&td, z); s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z); if (s->sub.decode.codes == Z_NULL) { diff --git a/reactos/lib/freetype/src/gzip/inffixed.h b/reactos/lib/freetype/src/gzip/inffixed.h index 77f7e763145..4d4760ea00e 100644 --- a/reactos/lib/freetype/src/gzip/inffixed.h +++ b/reactos/lib/freetype/src/gzip/inffixed.h @@ -7,9 +7,9 @@ subject to change. Applications should only use zlib.h. */ -local uInt fixed_bl = 9; -local uInt fixed_bd = 5; -local inflate_huft fixed_tl[] = { +local const uInt fixed_bl = 9; +local const uInt fixed_bd = 5; +local const inflate_huft fixed_tl[] = { {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115}, {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},192}, {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},160}, @@ -139,7 +139,7 @@ local inflate_huft fixed_tl[] = { {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},191}, {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},255} }; -local inflate_huft fixed_td[] = { +local const inflate_huft fixed_td[] = { {{{80,5}},1}, {{{87,5}},257}, {{{83,5}},17}, {{{91,5}},4097}, {{{81,5}},5}, {{{89,5}},1025}, {{{85,5}},65}, {{{93,5}},16385}, {{{80,5}},3}, {{{88,5}},513}, {{{84,5}},33}, {{{92,5}},8193}, diff --git a/reactos/lib/freetype/src/gzip/inftrees.c b/reactos/lib/freetype/src/gzip/inftrees.c index 2bceb467413..9002bf5b899 100644 --- a/reactos/lib/freetype/src/gzip/inftrees.c +++ b/reactos/lib/freetype/src/gzip/inftrees.c @@ -401,11 +401,11 @@ local inflate_huft *fixed_td; local int inflate_trees_fixed( /* bl, bd, tl, td, z) */ -uIntf *bl, /* literal desired/actual bit depth */ -uIntf *bd, /* distance desired/actual bit depth */ -inflate_huft * FAR *tl, /* literal/length tree result */ -inflate_huft * FAR *td, /* distance tree result */ -z_streamp z /* for memory allocation */ +uIntf *bl, /* literal desired/actual bit depth */ +uIntf *bd, /* distance desired/actual bit depth */ +const inflate_huft * FAR *tl, /* literal/length tree result */ +const inflate_huft * FAR *td, /* distance tree result */ +z_streamp z /* for memory allocation */ ) { #ifdef BUILDFIXED diff --git a/reactos/lib/freetype/src/gzip/inftrees.h b/reactos/lib/freetype/src/gzip/inftrees.h index 92d2f284ef8..07bf2aa0bf8 100644 --- a/reactos/lib/freetype/src/gzip/inftrees.h +++ b/reactos/lib/freetype/src/gzip/inftrees.h @@ -56,8 +56,8 @@ local int inflate_trees_dynamic OF(( local int inflate_trees_fixed OF(( uIntf *, /* literal desired/actual bit depth */ uIntf *, /* distance desired/actual bit depth */ - inflate_huft * FAR *, /* literal/length tree result */ - inflate_huft * FAR *, /* distance tree result */ + const inflate_huft * FAR *, /* literal/length tree result */ + const inflate_huft * FAR *, /* distance tree result */ z_streamp)); /* for memory allocation */ #endif /* _INFTREES_H */ diff --git a/reactos/lib/freetype/src/gzip/infutil.c b/reactos/lib/freetype/src/gzip/infutil.c index 87358d714cd..6087b406473 100644 --- a/reactos/lib/freetype/src/gzip/infutil.c +++ b/reactos/lib/freetype/src/gzip/infutil.c @@ -11,7 +11,7 @@ /* And'ing with mask[n] masks the lower n bits */ -local uInt inflate_mask[17] = { +local const uInt inflate_mask[17] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff diff --git a/reactos/lib/freetype/src/gzip/zconf.h b/reactos/lib/freetype/src/gzip/zconf.h index 53c21455c5f..d43dee21749 100644 --- a/reactos/lib/freetype/src/gzip/zconf.h +++ b/reactos/lib/freetype/src/gzip/zconf.h @@ -3,7 +3,7 @@ * For conditions of distribution and use, see copyright notice in zlib.h */ -/* @(#) $Id: zconf.h,v 1.5 2004/02/15 21:45:34 gvg Exp $ */ +/* @(#) $Id: zconf.h,v 1.6 2004/05/10 17:48:32 gvg Exp $ */ #ifndef _ZCONF_H #define _ZCONF_H diff --git a/reactos/lib/freetype/src/gzip/zutil.c b/reactos/lib/freetype/src/gzip/zutil.c index 032eccdfde7..638669df09e 100644 --- a/reactos/lib/freetype/src/gzip/zutil.c +++ b/reactos/lib/freetype/src/gzip/zutil.c @@ -3,7 +3,7 @@ * For conditions of distribution and use, see copyright notice in zlib.h */ -/* @(#) $Id: zutil.c,v 1.5 2004/02/15 21:45:34 gvg Exp $ */ +/* @(#) $Id: zutil.c,v 1.6 2004/05/10 17:48:32 gvg Exp $ */ #include "zutil.h" diff --git a/reactos/lib/freetype/src/gzip/zutil.h b/reactos/lib/freetype/src/gzip/zutil.h index 206e9241574..b648e18d432 100644 --- a/reactos/lib/freetype/src/gzip/zutil.h +++ b/reactos/lib/freetype/src/gzip/zutil.h @@ -8,7 +8,7 @@ subject to change. Applications should only use zlib.h. */ -/* @(#) $Id: zutil.h,v 1.5 2004/02/15 21:45:34 gvg Exp $ */ +/* @(#) $Id: zutil.h,v 1.6 2004/05/10 17:48:32 gvg Exp $ */ #ifndef _Z_UTIL_H #define _Z_UTIL_H diff --git a/reactos/lib/freetype/src/lzw/Jamfile b/reactos/lib/freetype/src/lzw/Jamfile new file mode 100644 index 00000000000..995cbb98c4c --- /dev/null +++ b/reactos/lib/freetype/src/lzw/Jamfile @@ -0,0 +1,9 @@ +# FreeType 2 src/lzw Jamfile (C) 2004 David Turner +# + +SubDir FT2_TOP $(FT2_SRC_DIR) lzw ; + +Library $(FT2_LIB) : ftlzw.c ; + +# end of src/lzw Jamfile + diff --git a/reactos/lib/freetype/src/lzw/ftlzw.c b/reactos/lib/freetype/src/lzw/ftlzw.c new file mode 100644 index 00000000000..a0e4cc57629 --- /dev/null +++ b/reactos/lib/freetype/src/lzw/ftlzw.c @@ -0,0 +1,463 @@ +/***************************************************************************/ +/* */ +/* ftlzw.c */ +/* */ +/* FreeType support for .Z compressed files. */ +/* */ +/* This optional component relies on NetBSD's zopen(). It should mainly */ +/* be used to parse compressed PCF fonts, as found with many X11 server */ +/* distributions. */ +/* */ +/* Copyright 2004 by */ +/* Albert Chin-A-Young. */ +/* */ +/* Based on code in src/gzip/ftgzip.c, Copyright 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#include <ft2build.h> +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_DEBUG_H +#include <string.h> +#include <stdio.h> + + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX LZW_Err_ +#define FT_ERR_BASE FT_Mod_Err_LZW + +#include FT_ERRORS_H + + +#ifdef FT_CONFIG_OPTION_USE_LZW + +#include "zopen.h" + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** M E M O R Y M A N A G E M E N T *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** F I L E D E S C R I P T O R *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + +#define FT_LZW_BUFFER_SIZE 4096 + + typedef struct FT_LZWFileRec_ + { + FT_Stream source; /* parent/source stream */ + FT_Stream stream; /* embedding stream */ + FT_Memory memory; /* memory allocator */ + s_zstate_t zstream; /* lzw input stream */ + + FT_ULong start; /* starting position, after .Z header */ + FT_Byte input[FT_LZW_BUFFER_SIZE]; /* input buffer */ + + FT_Byte buffer[FT_LZW_BUFFER_SIZE]; /* output buffer */ + FT_ULong pos; /* position in output */ + FT_Byte* cursor; + FT_Byte* limit; + + } FT_LZWFileRec, *FT_LZWFile; + + + /* check and skip .Z header */ + static FT_Error + ft_lzw_check_header( FT_Stream stream ) + { + FT_Error error; + FT_Byte head[2]; + + + if ( FT_STREAM_SEEK( 0 ) || + FT_STREAM_READ( head, 2 ) ) + goto Exit; + + /* head[0] && head[1] are the magic numbers */ + if ( head[0] != 0x1f || + head[1] != 0x9d ) + error = LZW_Err_Invalid_File_Format; + + Exit: + return error; + } + + + static FT_Error + ft_lzw_file_init( FT_LZWFile zip, + FT_Stream stream, + FT_Stream source ) + { + s_zstate_t* zstream = &zip->zstream; + FT_Error error = LZW_Err_Ok; + + + zip->stream = stream; + zip->source = source; + zip->memory = stream->memory; + + zip->limit = zip->buffer + FT_LZW_BUFFER_SIZE; + zip->cursor = zip->limit; + zip->pos = 0; + + /* check and skip .Z header */ + { + stream = source; + + error = ft_lzw_check_header( source ); + if ( error ) + goto Exit; + + zip->start = FT_STREAM_POS(); + } + + /* initialize internal lzw variable */ + zinit( zstream ); + + zstream->avail_in = 0; + zstream->next_in = zip->buffer; + zstream->zs_in_count = source->size - 2; + + if ( zstream->next_in == NULL ) + error = LZW_Err_Invalid_File_Format; + + Exit: + return error; + } + + + static void + ft_lzw_file_done( FT_LZWFile zip ) + { + s_zstate_t* zstream = &zip->zstream; + + + /* clear the rest */ + zstream->next_in = NULL; + zstream->next_out = NULL; + zstream->avail_in = 0; + zstream->avail_out = 0; + zstream->total_in = 0; + zstream->total_out = 0; + + zip->memory = NULL; + zip->source = NULL; + zip->stream = NULL; + } + + + static FT_Error + ft_lzw_file_reset( FT_LZWFile zip ) + { + FT_Stream stream = zip->source; + FT_Error error; + + + if ( !FT_STREAM_SEEK( zip->start ) ) + { + s_zstate_t* zstream = &zip->zstream; + + + zinit( zstream ); + + zstream->avail_in = 0; + zstream->next_in = zip->input; + zstream->total_in = 0; + zstream->avail_out = 0; + zstream->next_out = zip->buffer; + zstream->total_out = 0; + zstream->zs_in_count = zip->source->size - 2; + + zip->limit = zip->buffer + FT_LZW_BUFFER_SIZE; + zip->cursor = zip->limit; + zip->pos = 0; + } + + return error; + } + + + static FT_Error + ft_lzw_file_fill_input( FT_LZWFile zip ) + { + s_zstate_t* zstream = &zip->zstream; + FT_Stream stream = zip->source; + FT_ULong size; + + + if ( stream->read ) + { + size = stream->read( stream, stream->pos, zip->input, + FT_LZW_BUFFER_SIZE ); + if ( size == 0 ) + return LZW_Err_Invalid_Stream_Operation; + } + else + { + size = stream->size - stream->pos; + if ( size > FT_LZW_BUFFER_SIZE ) + size = FT_LZW_BUFFER_SIZE; + + if ( size == 0 ) + return LZW_Err_Invalid_Stream_Operation; + + FT_MEM_COPY( zip->input, stream->base + stream->pos, size ); + } + stream->pos += size; + + zstream->next_in = zip->input; + zstream->avail_in = size; + + return LZW_Err_Ok; + } + + + + static FT_Error + ft_lzw_file_fill_output( FT_LZWFile zip ) + { + s_zstate_t* zstream = &zip->zstream; + FT_Error error = 0; + + + zip->cursor = zip->buffer; + zstream->next_out = zip->cursor; + zstream->avail_out = FT_LZW_BUFFER_SIZE; + + while ( zstream->avail_out > 0 ) + { + int num_read = 0; + + + if ( zstream->avail_in == 0 ) + { + error = ft_lzw_file_fill_input( zip ); + if ( error ) + break; + } + + num_read = zread( zstream ); + + if ( num_read == -1 && zstream->zs_in_count == 0 ) + { + zip->limit = zstream->next_out; + if ( zip->limit == zip->cursor ) + error = LZW_Err_Invalid_Stream_Operation; + break; + } + else if ( num_read == -1 ) + break; + else + zstream->avail_out -= num_read; + } + + return error; + } + + + /* fill output buffer; `count' must be <= FT_LZW_BUFFER_SIZE */ + static FT_Error + ft_lzw_file_skip_output( FT_LZWFile zip, + FT_ULong count ) + { + FT_Error error = LZW_Err_Ok; + FT_ULong delta; + + + for (;;) + { + delta = (FT_ULong)( zip->limit - zip->cursor ); + if ( delta >= count ) + delta = count; + + zip->cursor += delta; + zip->pos += delta; + + count -= delta; + if ( count == 0 ) + break; + + error = ft_lzw_file_fill_output( zip ); + if ( error ) + break; + } + + return error; + } + + + static FT_ULong + ft_lzw_file_io( FT_LZWFile zip, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ) + { + FT_ULong result = 0; + FT_Error error; + + + /* Teset inflate stream if we're seeking backwards. */ + /* Yes, that is not too efficient, but it saves memory :-) */ + if ( pos < zip->pos ) + { + error = ft_lzw_file_reset( zip ); + if ( error ) + goto Exit; + } + + /* skip unwanted bytes */ + if ( pos > zip->pos ) + { + error = ft_lzw_file_skip_output( zip, (FT_ULong)( pos - zip->pos ) ); + if ( error ) + goto Exit; + } + + if ( count == 0 ) + goto Exit; + + /* now read the data */ + for (;;) + { + FT_ULong delta; + + + delta = (FT_ULong)( zip->limit - zip->cursor ); + if ( delta >= count ) + delta = count; + + FT_MEM_COPY( buffer, zip->cursor, delta ); + buffer += delta; + result += delta; + zip->cursor += delta; + zip->pos += delta; + + count -= delta; + if ( count == 0 ) + break; + + error = ft_lzw_file_fill_output( zip ); + if ( error ) + break; + } + + Exit: + return result; + } + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** L Z W E M B E D D I N G S T R E A M *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + + static void + ft_lzw_stream_close( FT_Stream stream ) + { + FT_LZWFile zip = (FT_LZWFile)stream->descriptor.pointer; + FT_Memory memory = stream->memory; + + + if ( zip ) + { + /* finalize lzw file descriptor */ + ft_lzw_file_done( zip ); + + FT_FREE( zip ); + + stream->descriptor.pointer = NULL; + } + } + + + static FT_ULong + ft_lzw_stream_io( FT_Stream stream, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ) + { + FT_LZWFile zip = (FT_LZWFile)stream->descriptor.pointer; + + + return ft_lzw_file_io( zip, pos, buffer, count ); + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Stream_OpenLZW( FT_Stream stream, + FT_Stream source ) + { + FT_Error error; + FT_Memory memory = source->memory; + FT_LZWFile zip; + + + FT_ZERO( stream ); + stream->memory = memory; + + if ( !FT_NEW( zip ) ) + { + error = ft_lzw_file_init( zip, stream, source ); + if ( error ) + { + FT_FREE( zip ); + goto Exit; + } + + stream->descriptor.pointer = zip; + } + + stream->size = 0x7FFFFFFFL; /* don't know the real size! */ + stream->pos = 0; + stream->base = 0; + stream->read = ft_lzw_stream_io; + stream->close = ft_lzw_stream_close; + + Exit: + return error; + } + +#include "zopen.c" + + +#else /* !FT_CONFIG_OPTION_USE_LZW */ + + + FT_EXPORT_DEF( FT_Error ) + FT_Stream_OpenLZW( FT_Stream stream, + FT_Stream source ) + { + FT_UNUSED( stream ); + FT_UNUSED( source ); + + return LZW_Err_Unimplemented_Feature; + } + + +#endif /* !FT_CONFIG_OPTION_USE_LZW */ + + +/* END */ diff --git a/reactos/lib/freetype/src/lzw/rules.mk b/reactos/lib/freetype/src/lzw/rules.mk new file mode 100644 index 00000000000..73ce7180448 --- /dev/null +++ b/reactos/lib/freetype/src/lzw/rules.mk @@ -0,0 +1,70 @@ +# +# FreeType 2 LZW support configuration rules +# + + +# Copyright 2004 by +# Albert Chin-A-Young. +# +# Based on src/lzw/rules.mk, Copyright 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# LZW driver directory +# +LZW_DIR := $(SRC_DIR)/lzw + + +# compilation flags for the driver +# +LZW_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(LZW_DIR)) + + +# LZW support sources (i.e., C files) +# +LZW_DRV_SRC := $(LZW_DIR)/ftlzw.c \ + $(LZW_DIR)/zopen.c + +# LZW support headers +# +LZW_DRV_H := $(LZW_DIR)/zopen.h + + +# LZW driver object(s) +# +# LZW_DRV_OBJ_M is used during `multi' builds +# LZW_DRV_OBJ_S is used during `single' builds +# +LZW_DRV_OBJ_M := $(OBJ_DIR)/ftlzw.$O +LZW_DRV_OBJ_S := $(OBJ_DIR)/ftlzw.$O + +# LZW support source file for single build +# +LZW_DRV_SRC_S := $(LZW_DIR)/ftlzw.c + + +# LZW support - single object +# +$(LZW_DRV_OBJ_S): $(LZW_DRV_SRC_S) $(LZW_DRV_SRC) $(FREETYPE_H) $(LZW_DRV_H) + $(LZW_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(LZW_DRV_SRC_S)) + + +# LZW support - multiple objects +# +$(OBJ_DIR)/%.$O: $(LZW_DIR)/%.c $(FREETYPE_H) $(LZW_DRV_H) + $(LZW_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(LZW_DRV_OBJ_S) +DRV_OBJS_M += $(LZW_DRV_OBJ_M) + + +# EOF diff --git a/reactos/lib/freetype/src/lzw/zopen.c b/reactos/lib/freetype/src/lzw/zopen.c new file mode 100644 index 00000000000..5267f1622bd --- /dev/null +++ b/reactos/lib/freetype/src/lzw/zopen.c @@ -0,0 +1,396 @@ +/* $NetBSD: zopen.c,v 1.8 2003/08/07 11:13:29 agc Exp $ */ + +/*- + * Copyright (c) 1985, 1986, 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Diomidis Spinellis and James A. Woods, derived from original + * work by Spencer Thomas and Joseph Orost. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/*- + * + * Copyright (c) 2004 + * Albert Chin-A-Young. + * + * Modified to work with FreeType's PCF driver. + * + */ + +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)zopen.c 8.1 (Berkeley) 6/27/93"; +#else +static char rcsid[] = "$NetBSD: zopen.c,v 1.8 2003/08/07 11:13:29 agc Exp $"; +#endif +#endif /* LIBC_SCCS and not lint */ + +/*- + * fcompress.c - File compression ala IEEE Computer, June 1984. + * + * Compress authors: + * Spencer W. Thomas (decvax!utah-cs!thomas) + * Jim McKie (decvax!mcvax!jim) + * Steve Davies (decvax!vax135!petsd!peora!srd) + * Ken Turkowski (decvax!decwrl!turtlevax!ken) + * James A. Woods (decvax!ihnp4!ames!jaw) + * Joe Orost (decvax!vax135!petsd!joe) + * + * Cleaned up and converted to library returning I/O streams by + * Diomidis Spinellis <dds@doc.ic.ac.uk>. + */ + +#include <ctype.h> +#include <signal.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#if 0 +static char_type magic_header[] = + { 0x1f, 0x9d }; /* 1F 9D */ +#endif + +#define BIT_MASK 0x1f /* Defines for third byte of header. */ +#define BLOCK_MASK 0x80 + +/* + * Masks 0x40 and 0x20 are free. I think 0x20 should mean that there is + * a fourth header byte (for expansion). + */ +#define INIT_BITS 9 /* Initial number of bits/code. */ + +#define MAXCODE(n_bits) ((1 << (n_bits)) - 1) + +/* Definitions to retain old variable names */ +#define fp zs->zs_fp +#define state zs->zs_state +#define n_bits zs->zs_n_bits +#define maxbits zs->zs_maxbits +#define maxcode zs->zs_maxcode +#define maxmaxcode zs->zs_maxmaxcode +#define htab zs->zs_htab +#define codetab zs->zs_codetab +#define hsize zs->zs_hsize +#define free_ent zs->zs_free_ent +#define block_compress zs->zs_block_compress +#define clear_flg zs->zs_clear_flg +#define offset zs->zs_offset +#define in_count zs->zs_in_count +#define buf_len zs->zs_buf_len +#define buf zs->zs_buf +#define stackp zs->u.r.zs_stackp +#define finchar zs->u.r.zs_finchar +#define code zs->u.r.zs_code +#define oldcode zs->u.r.zs_oldcode +#define incode zs->u.r.zs_incode +#define roffset zs->u.r.zs_roffset +#define size zs->u.r.zs_size +#define gbuf zs->u.r.zs_gbuf + +/* + * To save much memory, we overlay the table used by compress() with those + * used by decompress(). The tab_prefix table is the same size and type as + * the codetab. The tab_suffix table needs 2**BITS characters. We get this + * from the beginning of htab. The output stack uses the rest of htab, and + * contains characters. There is plenty of room for any possible stack + * (stack used to be 8000 characters). + */ + +#define htabof(i) htab[i] +#define codetabof(i) codetab[i] + +#define tab_prefixof(i) codetabof(i) +#define tab_suffixof(i) ((char_type *)(htab))[i] +#define de_stack ((char_type *)&tab_suffixof(1 << BITS)) + +#define CHECK_GAP 10000 /* Ratio check interval. */ + +/* + * the next two codes should not be changed lightly, as they must not + * lie within the contiguous general code space. + */ +#define FIRST 257 /* First free entry. */ +#define CLEAR 256 /* Table clear output code. */ + +/*- + * Algorithm from "A Technique for High Performance Data Compression", + * Terry A. Welch, IEEE Computer Vol 17, No 6 (June 1984), pp 8-19. + * + * Algorithm: + * Modified Lempel-Ziv method (LZW). Basically finds common + * substrings and replaces them with a variable size code. This is + * deterministic, and can be done on the fly. Thus, the decompression + * procedure needs no input table, but tracks the way the table was built. + */ + +#if 0 +static int +zclose(s_zstate_t *zs) +{ + free(zs); + return (0); +} +#endif + +/*- + * Output the given code. + * Inputs: + * code: A n_bits-bit integer. If == -1, then EOF. This assumes + * that n_bits =< (long)wordsize - 1. + * Outputs: + * Outputs code to the file. + * Assumptions: + * Chars are 8 bits long. + * Algorithm: + * Maintain a BITS character long buffer (so that 8 codes will + * fit in it exactly). Use the VAX insv instruction to insert each + * code in turn. When the buffer fills up empty it and start over. + */ + +static const char_type rmask[9] = + {0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff}; + +/* + * Decompress read. This routine adapts to the codes in the file building + * the "string" table on-the-fly; requiring no table to be stored in the + * compressed file. The tables used herein are shared with those of the + * compress() routine. See the definitions above. + */ +static int +zread(s_zstate_t *zs) +{ + unsigned int count; + + if (in_count == 0) + return -1; + if (zs->avail_out == 0) + return 0; + + count = zs->avail_out; + switch (state) { + case S_START: + state = S_MIDDLE; + break; + case S_MIDDLE: + goto middle; + case S_EOF: + goto eof; + } + + maxbits = *(zs->next_in); /* Set -b from file. */ + zs->avail_in--; + zs->next_in++; + zs->total_in++; + in_count--; + block_compress = maxbits & BLOCK_MASK; + maxbits &= BIT_MASK; + maxmaxcode = 1L << maxbits; + if (maxbits > BITS) { + return -1; + } + /* As above, initialize the first 256 entries in the table. */ + maxcode = MAXCODE(n_bits = INIT_BITS); + for (code = 255; code >= 0; code--) { + tab_prefixof(code) = 0; + tab_suffixof(code) = (char_type) code; + } + free_ent = block_compress ? FIRST : 256; + + finchar = oldcode = getcode(zs); + if (oldcode == -1) /* EOF already? */ + return 0; /* Get out of here */ + + /* First code must be 8 bits = char. */ + *(zs->next_out)++ = (unsigned char)finchar; + zs->total_out++; + count--; + stackp = de_stack; + + while ((code = getcode(zs)) > -1) { + if ((code == CLEAR) && block_compress) { + for (code = 255; code >= 0; code--) + tab_prefixof(code) = 0; + clear_flg = 1; + free_ent = FIRST - 1; + if ((code = getcode(zs)) == -1) + /* O, untimely death! */ + break; + } + incode = code; + + /* Special case for KwKwK string. */ + if (code >= free_ent) { + *stackp++ = finchar; + code = oldcode; + } + + /* Generate output characters in reverse order. */ + while (code >= 256) { + *stackp++ = tab_suffixof(code); + code = tab_prefixof(code); + } + *stackp++ = finchar = tab_suffixof(code); + + /* And put them out in forward order. */ +middle: + if (stackp == de_stack) + continue; + + do { + if (count-- == 0) { + return zs->avail_out; + } + *(zs->next_out)++ = *--stackp; + zs->total_out++; + } while (stackp > de_stack); + + /* Generate the new entry. */ + if ((code = free_ent) < maxmaxcode) { + tab_prefixof(code) = (unsigned short) oldcode; + tab_suffixof(code) = finchar; + free_ent = code + 1; + } + + /* Remember previous code. */ + oldcode = incode; + } + /* state = S_EOF; */ +eof: return (zs->avail_out - count); +} + +/*- + * Read one code from the standard input. If EOF, return -1. + * Inputs: + * stdin + * Outputs: + * code or -1 is returned. + */ +static code_int +getcode(s_zstate_t *zs) +{ + code_int gcode; + int r_off, bits; + char_type *bp; + + bp = gbuf; + if (clear_flg > 0 || roffset >= size || free_ent > maxcode) { + /* + * If the next entry will be too big for the current gcode + * size, then we must increase the size. This implies reading + * a new buffer full, too. + */ + if (free_ent > maxcode) { + n_bits++; + if (n_bits == maxbits) /* Won't get any bigger now. */ + maxcode = maxmaxcode; + else + maxcode = MAXCODE(n_bits); + } + if (clear_flg > 0) { + maxcode = MAXCODE(n_bits = INIT_BITS); + clear_flg = 0; + } + if ( zs->avail_in < (unsigned int)n_bits && in_count > (long)n_bits ) { + memcpy (buf, zs->next_in, zs->avail_in); + buf_len = zs->avail_in; + zs->avail_in = 0; + return -1; + } + if (buf_len) { + memcpy (gbuf, buf, buf_len); + memcpy (gbuf + buf_len, zs->next_in, + n_bits - buf_len); + zs->next_in += n_bits - buf_len; + zs->avail_in -= n_bits - buf_len; + buf_len = 0; + zs->total_in += n_bits; + size = n_bits; + in_count -= n_bits; + } else { + if (in_count > n_bits) { + memcpy (gbuf, zs->next_in, n_bits); + zs->next_in += n_bits; + zs->avail_in -= n_bits; + zs->total_in += n_bits; + size = n_bits; + in_count -= n_bits; + } else { + memcpy (gbuf, zs->next_in, in_count); + zs->next_in += in_count; + zs->avail_in -= in_count; + zs->total_in += in_count; + size = in_count; + in_count = 0; + } + } + roffset = 0; + /* Round size down to integral number of codes. */ + size = (size << 3) - (n_bits - 1); + } + r_off = roffset; + bits = n_bits; + + /* Get to the first byte. */ + bp += (r_off >> 3); + r_off &= 7; + + /* Get first part (low order bits). */ + gcode = (*bp++ >> r_off); + bits -= (8 - r_off); + r_off = 8 - r_off; /* Now, roffset into gcode word. */ + + /* Get any 8 bit parts in the middle (<=1 for up to 16 bits). */ + if (bits >= 8) { + gcode |= *bp++ << r_off; + r_off += 8; + bits -= 8; + } + + /* High order bits. */ + gcode |= (*bp & rmask[bits]) << r_off; + roffset += n_bits; + + return (gcode); +} + +static void +zinit(s_zstate_t *zs) +{ + memset(zs, 0, sizeof (s_zstate_t)); + + maxbits = BITS; /* User settable max # bits/code. */ + maxmaxcode = 1 << maxbits; /* Should NEVER generate this code. */ + hsize = HSIZE; /* For dynamic table sizing. */ + free_ent = 0; /* First unused entry. */ + block_compress = BLOCK_MASK; + clear_flg = 0; + state = S_START; + roffset = 0; + size = 0; +} diff --git a/reactos/lib/freetype/src/lzw/zopen.h b/reactos/lib/freetype/src/lzw/zopen.h new file mode 100644 index 00000000000..483b47e5c65 --- /dev/null +++ b/reactos/lib/freetype/src/lzw/zopen.h @@ -0,0 +1,114 @@ +/* $NetBSD: zopen.c,v 1.8 2003/08/07 11:13:29 agc Exp $ */ + +/*- + * Copyright (c) 1985, 1986, 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Diomidis Spinellis and James A. Woods, derived from original + * work by Spencer Thomas and Joseph Orost. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/*- + * + * Copyright (c) 2004 + * Albert Chin-A-Young. + * + * Modified to work with FreeType's PCF driver. + * + */ + +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)zopen.c 8.1 (Berkeley) 6/27/93"; +#else +static char rcsid[] = "$NetBSD: zopen.c,v 1.8 2003/08/07 11:13:29 agc Exp $"; +#endif +#endif /* LIBC_SCCS and not lint */ + +#include <stdio.h> + +#define BITS 16 /* Default bits. */ +#define HSIZE 69001 /* 95% occupancy */ + +/* A code_int must be able to hold 2**BITS values of type int, and also -1. */ +typedef long code_int; +typedef long count_int; + +typedef unsigned char char_type; + +typedef enum { + S_START, S_MIDDLE, S_EOF +} zs_enum; + +typedef struct { + unsigned char *next_in; + unsigned int avail_in; + unsigned long total_in; + + unsigned char *next_out; + unsigned int avail_out; + unsigned long total_out; + + zs_enum zs_state; /* State of computation */ + int zs_n_bits; /* Number of bits/code. */ + int zs_maxbits; /* User settable max # bits/code. */ + code_int zs_maxcode; /* Maximum code, given n_bits. */ + code_int zs_maxmaxcode; /* Should NEVER generate this code. */ + count_int zs_htab [HSIZE]; + unsigned short zs_codetab [HSIZE]; + code_int zs_hsize; /* For dynamic table sizing. */ + code_int zs_free_ent; /* First unused entry. */ + /* + * Block compression parameters -- after all codes are used up, + * and compression rate changes, start over. + */ + int zs_block_compress; + int zs_clear_flg; + int zs_offset; + long zs_in_count; /* Remaining uncompressed bytes. */ + char_type zs_buf_len; + char_type zs_buf[BITS]; /* Temporary buffer if we need + to read more to accumulate + n_bits. */ + union { + struct { + char_type *zs_stackp; + int zs_finchar; + code_int zs_code, zs_oldcode, zs_incode; + int zs_roffset, zs_size; + char_type zs_gbuf[BITS]; + } r; /* Read parameters */ + } u; +} s_zstate_t; + +static code_int getcode(s_zstate_t *); +#if 0 +static int zclose(s_zstate_t *); +#endif +static void zinit(s_zstate_t *); +static int zread(s_zstate_t *); diff --git a/reactos/lib/freetype/src/pcf/pcfdrivr.c b/reactos/lib/freetype/src/pcf/pcfdrivr.c index 3681b1cbfc4..80f043f9ebf 100644 --- a/reactos/lib/freetype/src/pcf/pcfdrivr.c +++ b/reactos/lib/freetype/src/pcf/pcfdrivr.c @@ -2,7 +2,7 @@ FreeType font driver for pcf files - Copyright (C) 2000, 2001, 2002, 2003 by + Copyright (C) 2000, 2001, 2002, 2003, 2004 by Francesco Zappa Nardelli Permission is hereby granted, free of charge, to any person obtaining a copy @@ -31,12 +31,12 @@ THE SOFTWARE. #include FT_INTERNAL_STREAM_H #include FT_INTERNAL_OBJECTS_H #include FT_GZIP_H +#include FT_LZW_H #include FT_ERRORS_H #include FT_BDF_H #include "pcf.h" #include "pcfdrivr.h" -#include "pcfutil.h" #include "pcfread.h" #include "pcferror.h" @@ -44,6 +44,8 @@ THE SOFTWARE. #undef FT_COMPONENT #define FT_COMPONENT trace_pcfread +#include FT_SERVICE_BDF_H +#include FT_SERVICE_XFREE86_NAME_H typedef struct PCF_CMapRec_ { @@ -212,7 +214,7 @@ THE SOFTWARE. FT_TRACE4(( "PCF_Face_Done: done face\n" )); - /* close gzip stream if any */ + /* close gzip/LZW stream if any */ if ( face->root.stream == &face->gzip_stream ) { FT_Stream_Close( &face->gzip_stream ); @@ -245,21 +247,44 @@ THE SOFTWARE. /* this didn't work, try gzip support! */ error2 = FT_Stream_OpenGzip( &face->gzip_stream, stream ); - if ( error2 == PCF_Err_Unimplemented_Feature ) + if ( FT_ERROR_BASE( error2 ) == FT_Err_Unimplemented_Feature ) goto Fail; error = error2; if ( error ) - goto Fail; + { + FT_Error error3; - face->gzip_source = stream; - face->root.stream = &face->gzip_stream; - stream = face->root.stream; + /* this didn't work, try LZW support! */ + error3 = FT_Stream_OpenLZW( &face->gzip_stream, stream ); + if ( FT_ERROR_BASE( error3 ) == FT_Err_Unimplemented_Feature ) + goto Fail; - error = pcf_load_font( stream, face ); - if ( error ) - goto Fail; + error = error3; + if ( error ) + goto Fail; + + face->gzip_source = stream; + face->root.stream = &face->gzip_stream; + + stream = face->root.stream; + + error = pcf_load_font( stream, face ); + if ( error ) + goto Fail; + } + else + { + face->gzip_source = stream; + face->root.stream = &face->gzip_stream; + + stream = face->root.stream; + + error = pcf_load_font( stream, face ); + if ( error ) + goto Fail; + } } /* set-up charmap */ @@ -334,9 +359,9 @@ THE SOFTWARE. FT_TRACE4(( "rec %d - pres %d\n", size->metrics.y_ppem, - face->root.available_sizes->height )); + face->root.available_sizes->y_ppem >> 6 )); - if ( size->metrics.y_ppem == face->root.available_sizes->height ) + if ( size->metrics.y_ppem == face->root.available_sizes->y_ppem >> 6 ) { size->metrics.ascender = face->accel.fontAscent << 6; size->metrics.descender = face->accel.fontDescent * (-64); @@ -471,6 +496,12 @@ THE SOFTWARE. } + /* + * + * BDF SERVICE + * + */ + static FT_Error pcf_get_bdf_property( PCF_Face face, const char* prop_name, @@ -503,16 +534,46 @@ THE SOFTWARE. } + static FT_Error + pcf_get_charset_id( PCF_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ) + { + *acharset_encoding = face->charset_encoding; + *acharset_registry = face->charset_registry; + + return 0; + } + + + static const FT_Service_BDFRec pcf_service_bdf = + { + (FT_BDF_GetCharsetIdFunc)pcf_get_charset_id, + (FT_BDF_GetPropertyFunc) pcf_get_bdf_property + }; + + + /* + * + * SERVICE LIST + * + */ + + static const FT_ServiceDescRec pcf_services[] = + { + { FT_SERVICE_ID_BDF, &pcf_service_bdf }, + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_PCF }, + { NULL, NULL } + }; + + static FT_Module_Interface pcf_driver_requester( FT_Module module, const char* name ) { FT_UNUSED( module ); - if ( name && ft_strcmp( name, "get_bdf_property" ) == 0 ) - return (FT_Module_Interface) pcf_get_bdf_property; - - return NULL; + return ft_service_list_lookup( pcf_services, name ); } diff --git a/reactos/lib/freetype/src/pcf/pcfread.c b/reactos/lib/freetype/src/pcf/pcfread.c index 1b377b5b1e0..3beabbfb2f8 100644 --- a/reactos/lib/freetype/src/pcf/pcfread.c +++ b/reactos/lib/freetype/src/pcf/pcfread.c @@ -2,7 +2,7 @@ FreeType font driver for pcf fonts - Copyright 2000, 2001, 2002, 2003 by + Copyright 2000, 2001, 2002, 2003, 2004 by Francesco Zappa Nardelli Permission is hereby granted, free of charge, to any person obtaining a copy @@ -49,7 +49,7 @@ THE SOFTWARE. #if defined( FT_DEBUG_LEVEL_TRACE ) - static const char* tableNames[] = + static const char* const tableNames[] = { "prop", "accl", "mtrcs", "bmps", "imtrcs", "enc", "swidth", "names", "accel" @@ -862,6 +862,116 @@ THE SOFTWARE. } + static FT_Error + pcf_interpret_style( PCF_Face pcf ) + { + FT_Error error = PCF_Err_Ok; + FT_Face face = FT_FACE( pcf ); + FT_Memory memory = face->memory; + + PCF_Property prop; + + char *istr = NULL, *bstr = NULL; + char *sstr = NULL, *astr = NULL; + + int parts = 0, len = 0; + + + face->style_flags = 0; + + prop = pcf_find_property( pcf, "SLANT" ); + if ( prop && prop->isString && + ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' || + *(prop->value.atom) == 'I' || *(prop->value.atom) == 'i' ) ) + { + face->style_flags |= FT_STYLE_FLAG_ITALIC; + istr = ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' ) + ? (char *)"Oblique" + : (char *)"Italic"; + len += ft_strlen( istr ); + parts++; + } + + prop = pcf_find_property( pcf, "WEIGHT_NAME" ); + if ( prop && prop->isString && + ( *(prop->value.atom) == 'B' || *(prop->value.atom) == 'b' ) ) + { + face->style_flags |= FT_STYLE_FLAG_BOLD; + bstr = (char *)"Bold"; + len += ft_strlen( bstr ); + parts++; + } + + prop = pcf_find_property( pcf, "SETWIDTH_NAME" ); + if ( prop && prop->isString && + *(prop->value.atom) && + !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) + { + sstr = (char *)(prop->value.atom); + len += ft_strlen( sstr ); + parts++; + } + + prop = pcf_find_property( pcf, "ADD_STYLE_NAME" ); + if ( prop && prop->isString && + *(prop->value.atom) && + !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) + { + astr = (char *)(prop->value.atom); + len += ft_strlen( astr ); + parts++; + } + + if ( !parts || !len ) + face->style_name = (char *)"Regular"; + else + { + char *style, *s; + unsigned int i; + + + if ( FT_ALLOC( style, len + parts ) ) + return error; + + s = style; + + if ( astr ) + { + ft_strcpy( s, astr ); + for ( i = 0; i < ft_strlen( astr ); i++, s++ ) + if ( *s == ' ' ) + *s = '-'; /* replace spaces with dashes */ + *(s++) = ' '; + } + if ( bstr ) + { + ft_strcpy( s, bstr ); + s += ft_strlen( bstr ); + *(s++) = ' '; + } + if ( istr ) + { + ft_strcpy( s, istr ); + s += ft_strlen( istr ); + *(s++) = ' '; + } + if ( sstr ) + { + ft_strcpy( s, sstr ); + for ( i = 0; i < ft_strlen( sstr ); i++, s++ ) + if ( *s == ' ' ) + *s = '-'; /* replace spaces with dashes */ + *(s++) = ' '; + } + *(--s) = '\0'; /* overwrite last ' ', terminate the string */ + + face->style_name = style; /* allocated string */ + } + + return error; + } + + FT_LOCAL_DEF( FT_Error ) pcf_load_font( FT_Stream stream, PCF_Face face ) @@ -930,49 +1040,21 @@ THE SOFTWARE. if ( face->accel.constantWidth ) root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; - root->style_flags = 0; - prop = pcf_find_property( face, "SLANT" ); - if ( prop != NULL ) - if ( prop->isString ) - if ( ( *(prop->value.atom) == 'O' ) || - ( *(prop->value.atom) == 'o' ) || - ( *(prop->value.atom) == 'I' ) || - ( *(prop->value.atom) == 'i' ) ) - root->style_flags |= FT_STYLE_FLAG_ITALIC; - - prop = pcf_find_property( face, "WEIGHT_NAME" ); - if ( prop != NULL ) - if ( prop->isString ) - if ( ( *(prop->value.atom) == 'B' ) || - ( *(prop->value.atom) == 'b' ) ) - root->style_flags |= FT_STYLE_FLAG_BOLD; - - root->style_name = (char *)"Regular"; - - if ( root->style_flags & FT_STYLE_FLAG_BOLD ) { - if ( root->style_flags & FT_STYLE_FLAG_ITALIC ) - root->style_name = (char *)"Bold Italic"; - else - root->style_name = (char *)"Bold"; - } - else if ( root->style_flags & FT_STYLE_FLAG_ITALIC ) - root->style_name = (char *)"Italic"; + if ( ( error = pcf_interpret_style( face ) ) != 0 ) + goto Exit; prop = pcf_find_property( face, "FAMILY_NAME" ); - if ( prop != NULL ) + if ( prop && prop->isString ) { - if ( prop->isString ) - { - int l = ft_strlen( prop->value.atom ) + 1; + int l = ft_strlen( prop->value.atom ) + 1; - if ( FT_NEW_ARRAY( root->family_name, l ) ) - goto Exit; - ft_strcpy( root->family_name, prop->value.atom ); - } + if ( FT_NEW_ARRAY( root->family_name, l ) ) + goto Exit; + ft_strcpy( root->family_name, prop->value.atom ); } else - root->family_name = 0; + root->family_name = NULL; /* Note: We shift all glyph indices by +1 since we must * respect the convention that glyph 0 always corresponds @@ -988,39 +1070,47 @@ THE SOFTWARE. { FT_Bitmap_Size* bsize = root->available_sizes; + FT_Short resolution_x = 0, resolution_y = 0; FT_MEM_ZERO( bsize, sizeof ( FT_Bitmap_Size ) ); - prop = pcf_find_property( face, "PIXEL_SIZE" ); - if ( prop != NULL ) - bsize->height = (FT_Short)prop->value.integer; + bsize->height = face->accel.fontAscent + face->accel.fontDescent; prop = pcf_find_property( face, "AVERAGE_WIDTH" ); - if ( prop != NULL ) + if ( prop ) bsize->width = (FT_Short)( ( prop->value.integer + 5 ) / 10 ); + else + bsize->width = bsize->height * 2/3; prop = pcf_find_property( face, "POINT_SIZE" ); - if ( prop != NULL ) - /* convert from 722,7 decipoints to 72 points per inch */ + if ( prop ) + /* convert from 722.7 decipoints to 72 points per inch */ bsize->size = (FT_Pos)( ( prop->value.integer * 64 * 7200 + 36135L ) / 72270L ); + prop = pcf_find_property( face, "PIXEL_SIZE" ); + if ( prop ) + bsize->y_ppem = (FT_Short)prop->value.integer << 6; + prop = pcf_find_property( face, "RESOLUTION_X" ); - if ( prop != NULL ) - bsize->x_ppem = - (FT_Pos)( ( prop->value.integer * bsize->size + 36 ) / 72 ); + if ( prop ) + resolution_x = (FT_Short)prop->value.integer; prop = pcf_find_property( face, "RESOLUTION_Y" ); - if ( prop != NULL ) - bsize->y_ppem = - (FT_Pos)( ( prop->value.integer * bsize->size + 36 ) / 72 ); + if ( prop ) + resolution_y = (FT_Short)prop->value.integer; - if ( bsize->height == 0 ) - bsize->height = (FT_Short)( ( bsize->y_ppem + 32 ) / 64 ); - - if ( bsize->height == 0 ) - bsize->height = 12; + if ( bsize->y_ppem == 0 ) + { + bsize->y_ppem = bsize->size; + if ( resolution_y ) + bsize->y_ppem = bsize->y_ppem * resolution_y / 72; + } + if ( resolution_x && resolution_y ) + bsize->x_ppem = bsize->y_ppem * resolution_x / resolution_y; + else + bsize->x_ppem = bsize->y_ppem; } /* set up charset */ @@ -1031,23 +1121,19 @@ THE SOFTWARE. charset_registry = pcf_find_property( face, "CHARSET_REGISTRY" ); charset_encoding = pcf_find_property( face, "CHARSET_ENCODING" ); - if ( ( charset_registry != NULL ) && - ( charset_encoding != NULL ) ) + if ( charset_registry && charset_registry->isString && + charset_encoding && charset_encoding->isString ) { - if ( ( charset_registry->isString ) && - ( charset_encoding->isString ) ) - { - if ( FT_NEW_ARRAY( face->charset_encoding, - ft_strlen( charset_encoding->value.atom ) + 1 ) ) - goto Exit; + if ( FT_NEW_ARRAY( face->charset_encoding, + ft_strlen( charset_encoding->value.atom ) + 1 ) ) + goto Exit; - if ( FT_NEW_ARRAY( face->charset_registry, - ft_strlen( charset_registry->value.atom ) + 1 ) ) - goto Exit; + if ( FT_NEW_ARRAY( face->charset_registry, + ft_strlen( charset_registry->value.atom ) + 1 ) ) + goto Exit; - ft_strcpy( face->charset_registry, charset_registry->value.atom ); - ft_strcpy( face->charset_encoding, charset_encoding->value.atom ); - } + ft_strcpy( face->charset_registry, charset_registry->value.atom ); + ft_strcpy( face->charset_encoding, charset_encoding->value.atom ); } } } diff --git a/reactos/lib/freetype/src/pcf/pcfutil.c b/reactos/lib/freetype/src/pcf/pcfutil.c index eb911bbd29c..ddaca35fd99 100644 --- a/reactos/lib/freetype/src/pcf/pcfutil.c +++ b/reactos/lib/freetype/src/pcf/pcfutil.c @@ -25,6 +25,8 @@ in this Software without prior written authorization from The Open Group. * Author: Keith Packard, MIT X Consortium */ +/* Modified for use with FreeType */ + #include <ft2build.h> #include "pcfutil.h" @@ -72,7 +74,7 @@ in this Software without prior written authorization from The Open Group. * Invert bit order within each BYTE of an array. */ - void + static void BitOrderInvert( unsigned char* buf, int nbytes ) { @@ -88,7 +90,7 @@ in this Software without prior written authorization from The Open Group. * Invert byte order within each 16-bits of an array. */ - void + static void TwoByteSwap( unsigned char* buf, int nbytes ) { @@ -107,7 +109,7 @@ in this Software without prior written authorization from The Open Group. * Invert byte order within each 32-bits of an array. */ - void + static void FourByteSwap( unsigned char* buf, int nbytes ) { @@ -127,89 +129,4 @@ in this Software without prior written authorization from The Open Group. } - /* - * Repad a bitmap. - */ - - int - RepadBitmap( char* pSrc, - char* pDst, - unsigned int srcPad, - unsigned int dstPad, - int width, - int height ) - { - int srcWidthBytes, dstWidthBytes; - int row, col; - char *pTmpSrc, *pTmpDst; - - - switch ( srcPad ) - { - case 1: - srcWidthBytes = ( width + 7 ) >> 3; - break; - - case 2: - srcWidthBytes = ( ( width + 15 ) >> 4 ) << 1; - break; - - case 4: - srcWidthBytes = ( ( width + 31 ) >> 5 ) << 2; - break; - - case 8: - srcWidthBytes = ( ( width + 63 ) >> 6 ) << 3; - break; - - default: - return 0; - } - - switch ( dstPad ) - { - case 1: - dstWidthBytes = ( width + 7 ) >> 3; - break; - - case 2: - dstWidthBytes = ( ( width + 15 ) >> 4 ) << 1; - break; - - case 4: - dstWidthBytes = ( ( width + 31 ) >> 5 ) << 2; - break; - - case 8: - dstWidthBytes = ( ( width + 63 ) >> 6 ) << 3; - break; - - default: - return 0; - } - - width = srcWidthBytes; - if ( width > dstWidthBytes ) - width = dstWidthBytes; - - pTmpSrc= pSrc; - pTmpDst= pDst; - - for ( row = 0; row < height; row++ ) - { - for ( col = 0; col < width; col++ ) - *pTmpDst++ = *pTmpSrc++; - - while ( col < dstWidthBytes ) - { - *pTmpDst++ = '\0'; - col++; - } - pTmpSrc += srcWidthBytes - width; - } - - return dstWidthBytes * height; - } - - /* END */ diff --git a/reactos/lib/freetype/src/pcf/pcfutil.h b/reactos/lib/freetype/src/pcf/pcfutil.h index 32dd1eab76f..017c515baab 100644 --- a/reactos/lib/freetype/src/pcf/pcfutil.h +++ b/reactos/lib/freetype/src/pcf/pcfutil.h @@ -2,7 +2,7 @@ FreeType font driver for pcf fonts - Copyright 2000-2001 by + Copyright 2000, 2001, 2004 by Francesco Zappa Nardelli Permission is hereby granted, free of charge, to any person obtaining a copy @@ -32,25 +32,18 @@ THE SOFTWARE. #include <ft2build.h> - void + static void BitOrderInvert( unsigned char* buf, int nbytes); - void + static void TwoByteSwap( unsigned char* buf, int nbytes); - void + static void FourByteSwap( unsigned char* buf, int nbytes); - int - RepadBitmap( char* pSrc, - char* pDst, - unsigned int srcPad, - unsigned int dstPad, - int width, - int height); #endif /* __PCFUTIL_H__ */ diff --git a/reactos/lib/freetype/src/pfr/pfrdrivr.c b/reactos/lib/freetype/src/pfr/pfrdrivr.c index 3935e2e544d..4e0d6fdb472 100644 --- a/reactos/lib/freetype/src/pfr/pfrdrivr.c +++ b/reactos/lib/freetype/src/pfr/pfrdrivr.c @@ -19,10 +19,13 @@ #include <ft2build.h> #include FT_INTERNAL_DEBUG_H #include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_PFR_H +#include FT_SERVICE_PFR_H +#include FT_SERVICE_XFREE86_NAME_H #include "pfrdrivr.h" #include "pfrobjs.h" +#include "pfrerror.h" + static FT_Error pfr_get_kerning( PFR_Face face, @@ -51,23 +54,28 @@ } + /* + * PFR METRICS SERVICE + * + */ + static FT_Error - pfr_get_advance( PFR_Face face, - FT_UInt gindex, - FT_Pos *aadvance ) + pfr_get_advance( PFR_Face face, + FT_UInt gindex, + FT_Pos *anadvance ) { FT_Error error = PFR_Err_Bad_Argument; - *aadvance = 0; + *anadvance = 0; if ( face ) { - PFR_PhyFont phys = &face->phy_font; + PFR_PhyFont phys = &face->phy_font; if ( gindex < phys->num_chars ) { - *aadvance = phys->chars[ gindex ].advance; + *anadvance = phys->chars[gindex].advance; error = 0; } } @@ -78,18 +86,18 @@ static FT_Error pfr_get_metrics( PFR_Face face, - FT_UInt *aoutline_resolution, + FT_UInt *anoutline_resolution, FT_UInt *ametrics_resolution, FT_Fixed *ametrics_x_scale, FT_Fixed *ametrics_y_scale ) { - PFR_PhyFont phys = &face->phy_font; + PFR_PhyFont phys = &face->phy_font; FT_Fixed x_scale, y_scale; FT_Size size = face->root.size; - if ( aoutline_resolution ) - *aoutline_resolution = phys->outline_resolution; + if ( anoutline_resolution ) + *anoutline_resolution = phys->outline_resolution; if ( ametrics_resolution ) *ametrics_resolution = phys->metrics_resolution; @@ -112,19 +120,42 @@ if ( ametrics_y_scale ) *ametrics_y_scale = y_scale; - return 0; + return PFR_Err_Ok; } FT_CALLBACK_TABLE_DEF - const FT_PFR_ServiceRec pfr_service_rec = + const FT_Service_PfrMetricsRec pfr_metrics_service_rec = { - (FT_PFR_GetMetricsFunc) pfr_get_metrics, - (FT_PFR_GetKerningFunc) pfr_get_kerning, - (FT_PFR_GetAdvanceFunc) pfr_get_advance + (FT_PFR_GetMetricsFunc)pfr_get_metrics, + (FT_PFR_GetKerningFunc)pfr_face_get_kerning, + (FT_PFR_GetAdvanceFunc)pfr_get_advance }; + /* + * SERVICE LIST + * + */ + + static const FT_ServiceDescRec pfr_services[] = + { + { FT_SERVICE_ID_PFR_METRICS, &pfr_metrics_service_rec }, + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_PFR }, + { NULL, NULL } + }; + + + static FT_Module_Interface + pfr_get_service( FT_Driver driver, + const FT_String* service_id ) + { + FT_UNUSED( driver ); + + return ft_service_list_lookup( pfr_services, service_id ); + } + + FT_CALLBACK_TABLE_DEF const FT_Driver_ClassRec pfr_driver_class = { @@ -138,31 +169,31 @@ 0x10000L, 0x20000L, - (FT_PFR_Service) &pfr_service_rec, /* format interface */ + NULL, (FT_Module_Constructor)NULL, (FT_Module_Destructor) NULL, - (FT_Module_Requester) NULL + (FT_Module_Requester) pfr_get_service }, sizeof( PFR_FaceRec ), sizeof( PFR_SizeRec ), sizeof( PFR_SlotRec ), - (FT_Face_InitFunc) pfr_face_init, - (FT_Face_DoneFunc) pfr_face_done, - (FT_Size_InitFunc) NULL, - (FT_Size_DoneFunc) NULL, - (FT_Slot_InitFunc) pfr_slot_init, - (FT_Slot_DoneFunc) pfr_slot_done, + (FT_Face_InitFunc) pfr_face_init, + (FT_Face_DoneFunc) pfr_face_done, + (FT_Size_InitFunc) NULL, + (FT_Size_DoneFunc) NULL, + (FT_Slot_InitFunc) pfr_slot_init, + (FT_Slot_DoneFunc) pfr_slot_done, - (FT_Size_ResetPointsFunc) NULL, - (FT_Size_ResetPixelsFunc) NULL, - (FT_Slot_LoadFunc) pfr_slot_load, + (FT_Size_ResetPointsFunc)NULL, + (FT_Size_ResetPixelsFunc)NULL, + (FT_Slot_LoadFunc) pfr_slot_load, - (FT_Face_GetKerningFunc) pfr_get_kerning, - (FT_Face_AttachFunc) 0, - (FT_Face_GetAdvancesFunc) 0 + (FT_Face_GetKerningFunc) pfr_get_kerning, + (FT_Face_AttachFunc) 0, + (FT_Face_GetAdvancesFunc)0 }; diff --git a/reactos/lib/freetype/src/pfr/pfrgload.c b/reactos/lib/freetype/src/pfr/pfrgload.c index cb5c60b88e3..87ba6846e83 100644 --- a/reactos/lib/freetype/src/pfr/pfrgload.c +++ b/reactos/lib/freetype/src/pfr/pfrgload.c @@ -4,7 +4,7 @@ /* */ /* FreeType PFR glyph loader (body). */ /* */ -/* Copyright 2002 by */ +/* Copyright 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -198,7 +198,7 @@ /* indicate that a new contour has started */ glyph->path_begun = 1; - /* check that there is room for a new contour and a new point */ + /* check that there is space for a new contour and a new point */ error = FT_GlyphLoader_CheckPoints( loader, 1, 1 ); if ( !error ) /* add new start point */ @@ -276,7 +276,7 @@ /* re-allocate array when necessary */ if ( count > glyph->max_xy_control ) { - FT_UInt new_max = ( count + 7 ) & -8; + FT_UInt new_max = FT_PAD_CEIL( count, 8 ); if ( FT_RENEW_ARRAY( glyph->x_control, diff --git a/reactos/lib/freetype/src/pfr/pfrload.c b/reactos/lib/freetype/src/pfr/pfrload.c index e92ead95b5f..19ced45d133 100644 --- a/reactos/lib/freetype/src/pfr/pfrload.c +++ b/reactos/lib/freetype/src/pfr/pfrload.c @@ -365,7 +365,7 @@ /* re-allocate when needed */ if ( phy_font->num_strikes + count > phy_font->max_strikes ) { - FT_UInt new_max = ( phy_font->num_strikes + count + 3 ) & -4; + FT_UInt new_max = FT_PAD_CEIL( phy_font->num_strikes + count, 4 ); if ( FT_RENEW_ARRAY( phy_font->strikes, @@ -511,89 +511,6 @@ } -#if 0 - - /* load kerning pair data */ - FT_CALLBACK_DEF( FT_Error ) - pfr_extra_item_load_kerning_pairs( FT_Byte* p, - FT_Byte* limit, - PFR_PhyFont phy_font ) - { - FT_Int count; - FT_UShort base_adj; - FT_UInt flags; - FT_UInt num_pairs; - PFR_KernPair pairs; - FT_Error error = 0; - FT_Memory memory = phy_font->memory; - - - /* allocate a new kerning item */ - /* XXX: there may be multiple extra items for kerning */ - if ( phy_font->kern_pairs != NULL ) - goto Exit; - - FT_TRACE2(( "pfr_extra_item_load_kerning_pairs()\n" )); - - PFR_CHECK( 4 ); - - num_pairs = PFR_NEXT_BYTE( p ); - base_adj = PFR_NEXT_SHORT( p ); - flags = PFR_NEXT_BYTE( p ); - -#ifndef PFR_CONFIG_NO_CHECKS - count = 3; - - if ( flags & PFR_KERN_2BYTE_CHAR ) - count += 2; - - if ( flags & PFR_KERN_2BYTE_ADJ ) - count += 1; - - PFR_CHECK( num_pairs * count ); -#endif - - if ( FT_NEW_ARRAY( pairs, num_pairs ) ) - goto Exit; - - phy_font->num_kern_pairs = num_pairs; - phy_font->kern_pairs = pairs; - - for (count = num_pairs ; count > 0; count--, pairs++ ) - { - if ( flags & PFR_KERN_2BYTE_CHAR ) - { - pairs->glyph1 = PFR_NEXT_USHORT( p ); - pairs->glyph2 = PFR_NEXT_USHORT( p ); - } - else - { - pairs->glyph1 = PFR_NEXT_BYTE( p ); - pairs->glyph2 = PFR_NEXT_BYTE( p ); - } - - if ( flags & PFR_KERN_2BYTE_ADJ ) - pairs->kerning.x = base_adj + PFR_NEXT_SHORT( p ); - else - pairs->kerning.x = base_adj + PFR_NEXT_INT8( p ); - - pairs->kerning.y = 0; - - FT_TRACE2(( "kerning %d <-> %d : %ld\n", - pairs->glyph1, pairs->glyph2, pairs->kerning.x )); - } - - Exit: - return error; - - Too_Short: - error = PFR_Err_Invalid_Table; - FT_ERROR(( "pfr_extra_item_load_kerning_pairs: " - "invalid kerning pairs table\n" )); - goto Exit; - } - -#else /* 0 */ /* load kerning pair data */ FT_CALLBACK_DEF( FT_Error ) @@ -690,15 +607,154 @@ "invalid kerning pairs table\n" )); goto Exit; } -#endif /* 0 */ + + + /* + * The kerning data embedded in a PFR font are (charcode,charcode) + * pairs; we need to translate them to (gindex,gindex) and sort + * the resulting array. + */ + static FT_UInt + pfr_get_gindex( PFR_Char chars, + FT_UInt count, + FT_UInt charcode ) + { + FT_UInt min = 0; + FT_UInt max = count; + + + while ( min < max ) + { + FT_UInt mid = ( min + max ) >> 1; + PFR_Char c = chars + mid; + + + if ( c->char_code == charcode ) + return mid + 1; + + if ( c->char_code < charcode ) + min = mid + 1; + else + max = mid; + } + return 0; + } + + + FT_CALLBACK_DEF( int ) + pfr_compare_kern_pairs( const void* pair1, + const void* pair2 ) + { + FT_UInt32 p1 = PFR_KERN_PAIR_INDEX( (PFR_KernPair)pair1 ); + FT_UInt32 p2 = PFR_KERN_PAIR_INDEX( (PFR_KernPair)pair2 ); + + + if ( p1 < p2 ) + return -1; + if ( p1 > p2 ) + return 1; + return 0; + } + + + static FT_Error + pfr_sort_kerning_pairs( FT_Stream stream, + PFR_PhyFont phy_font ) + { + FT_Error error; + FT_Memory memory = stream->memory; + PFR_KernPair pairs; + PFR_KernItem item; + PFR_Char chars = phy_font->chars; + FT_UInt num_chars = phy_font->num_chars; + FT_UInt count; + + + /* create kerning pairs array + */ + if ( FT_NEW_ARRAY( phy_font->kern_pairs, phy_font->num_kern_pairs ) ) + goto Exit; + + /* load all kerning items into the array, + * converting character codes into glyph indices + */ + pairs = phy_font->kern_pairs; + item = phy_font->kern_items; + count = 0; + + for ( ; item; item = item->next ) + { + FT_UInt limit = count + item->pair_count; + FT_Byte* p; + + + if ( limit > phy_font->num_kern_pairs ) + { + error = PFR_Err_Invalid_Table; + goto Exit; + } + + if ( FT_STREAM_SEEK( item->offset ) || + FT_FRAME_ENTER( item->pair_count * item->pair_size ) ) + goto Exit; + + p = stream->cursor; + + for ( ; count < limit; count++ ) + { + PFR_KernPair pair = pairs + count; + FT_UInt char1, char2; + FT_Int kerning; + + + if ( item->flags & PFR_KERN_2BYTE_CHAR ) + { + char1 = FT_NEXT_USHORT( p ); + char2 = FT_NEXT_USHORT( p ); + } + else + { + char1 = FT_NEXT_BYTE( p ); + char2 = FT_NEXT_BYTE( p ); + } + + if ( item->flags & PFR_KERN_2BYTE_ADJ ) + kerning = item->base_adj + FT_NEXT_SHORT( p ); + else + kerning = item->base_adj + FT_NEXT_CHAR( p ); + + pair->glyph1 = pfr_get_gindex( chars, num_chars, char1 ); + pair->glyph2 = pfr_get_gindex( chars, num_chars, char2 ); + pair->kerning = kerning; + } + + FT_FRAME_EXIT(); + } + + /* sort the resulting array + */ + ft_qsort( pairs, count, + sizeof ( PFR_KernPairRec ), + pfr_compare_kern_pairs ); + + Exit: + if ( error ) + { + /* disable kerning data in case of error + */ + phy_font->num_kern_pairs = 0; + } + + return error; + } static const PFR_ExtraItemRec pfr_phy_font_extra_items[] = { - { 1, (PFR_ExtraItem_ParseFunc) pfr_extra_item_load_bitmap_info }, - { 2, (PFR_ExtraItem_ParseFunc) pfr_extra_item_load_font_id }, - { 3, (PFR_ExtraItem_ParseFunc) pfr_extra_item_load_stem_snaps }, - { 4, (PFR_ExtraItem_ParseFunc) pfr_extra_item_load_kerning_pairs }, + { 1, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_bitmap_info }, + { 2, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_font_id }, + { 3, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_stem_snaps }, + { 4, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_kerning_pairs }, { 0, NULL } }; @@ -770,6 +826,7 @@ FT_FREE( phy_font->blue_values ); phy_font->num_blue_values = 0; + FT_FREE( phy_font->kern_pairs ); { PFR_KernItem item, next; @@ -1008,6 +1065,9 @@ phy_font->bct_offset = FT_STREAM_POS(); phy_font->cursor = NULL; + /* now sort kerning pairs */ + error = pfr_sort_kerning_pairs( stream, phy_font ); + Exit: return error; diff --git a/reactos/lib/freetype/src/pfr/pfrobjs.c b/reactos/lib/freetype/src/pfr/pfrobjs.c index 402db95d3d6..4c6179aa577 100644 --- a/reactos/lib/freetype/src/pfr/pfrobjs.c +++ b/reactos/lib/freetype/src/pfr/pfrobjs.c @@ -419,8 +419,9 @@ { FT_Error error = PFR_Err_Ok; PFR_PhyFont phy_font = &face->phy_font; - PFR_KernItem item = phy_font->kern_items; + PFR_KernPair pairs = phy_font->kern_pairs; FT_UInt32 idx = PFR_KERN_INDEX( glyph1, glyph2 ); + FT_UInt min, max; FT_UNUSED( error ); /* just needed as syntactical sugar */ @@ -428,68 +429,26 @@ kerning->x = 0; kerning->y = 0; - /* find the kerning item containing our pair */ - while ( item ) + min = 0; + max = phy_font->num_kern_pairs; + + while ( min < max ) { - if ( item->pair1 <= idx && idx <= item->pair2 ) - goto Found_Item; + FT_UInt mid = ( min + max ) >> 1; + PFR_KernPair pair = pairs + mid; + FT_UInt32 pidx = PFR_KERN_PAIR_INDEX( pair ); + - item = item->next; - } - - /* not found */ - return; - - Found_Item: - { - /* perform simply binary search within the item */ - FT_UInt min, mid, max; - FT_Stream stream = face->root.stream; - FT_Byte* p; - - - if ( FT_STREAM_SEEK( item->offset ) || - FT_FRAME_ENTER( item->pair_count * item->pair_size ) ) - return; - - min = 0; - max = item->pair_count; - while ( min < max ) + if ( pidx == idx ) { - FT_UInt char1, char2, charcode; - - - mid = ( min + max ) >> 1; - p = stream->cursor + mid*item->pair_size; - - if ( item->flags & PFR_KERN_2BYTE_CHAR ) - { - char1 = FT_NEXT_USHORT( p ); - char2 = FT_NEXT_USHORT( p ); - } - else - { - char1 = FT_NEXT_USHORT( p ); - char2 = FT_NEXT_USHORT( p ); - } - charcode = PFR_KERN_INDEX( char1, char2 ); - - if ( idx == charcode ) - { - if ( item->flags & PFR_KERN_2BYTE_ADJ ) - kerning->x = item->base_adj + FT_NEXT_SHORT( p ); - else - kerning->x = item->base_adj + FT_NEXT_CHAR( p ); - - break; - } - if ( idx > charcode ) - min = mid + 1; - else - max = mid; + kerning->x = pair->kerning; + break; } - - FT_FRAME_EXIT(); + + if ( pidx < idx ) + min = mid + 1; + else + max = mid; } } diff --git a/reactos/lib/freetype/src/pfr/pfrsbit.c b/reactos/lib/freetype/src/pfr/pfrsbit.c index 84aeb7a047a..da8fdba337f 100644 --- a/reactos/lib/freetype/src/pfr/pfrsbit.c +++ b/reactos/lib/freetype/src/pfr/pfrsbit.c @@ -635,7 +635,7 @@ glyph->root.metrics.height = (FT_Long)ysize << 6; glyph->root.metrics.horiBearingX = xpos << 6; glyph->root.metrics.horiBearingY = ypos << 6; - glyph->root.metrics.horiAdvance = ( ( advance >> 2 ) + 32 ) & -64; + glyph->root.metrics.horiAdvance = FT_PIX_ROUND( ( advance >> 2 ) ); glyph->root.metrics.vertBearingX = - glyph->root.metrics.width >> 1; glyph->root.metrics.vertBearingY = 0; glyph->root.metrics.vertAdvance = size->root.metrics.height; @@ -651,11 +651,12 @@ error = ft_glyphslot_alloc_bitmap( &glyph->root, len ); if ( !error ) { - error = pfr_load_bitmap_bits( p, - stream->limit, - format, - face->header.color_flags & 2, - &glyph->root.bitmap ); + error = pfr_load_bitmap_bits( + p, + stream->limit, + format, + FT_BOOL(face->header.color_flags & 2), + &glyph->root.bitmap ); } } } diff --git a/reactos/lib/freetype/src/pfr/pfrtypes.h b/reactos/lib/freetype/src/pfr/pfrtypes.h index 21b4e3d2ea9..a10a2b26c8e 100644 --- a/reactos/lib/freetype/src/pfr/pfrtypes.h +++ b/reactos/lib/freetype/src/pfr/pfrtypes.h @@ -209,11 +209,14 @@ FT_BEGIN_HEADER #define PFR_KERN_INDEX( g1, g2 ) \ ( ( (FT_UInt32)(g1) << 16 ) | (FT_UInt16)(g2) ) +#define PFR_KERN_PAIR_INDEX( pair ) \ + PFR_KERN_INDEX( (pair)->glyph1, (pair)->glyph2 ) + typedef struct PFR_KernPairRec_ { FT_UInt glyph1; FT_UInt glyph2; - FT_Vector kerning; + FT_Int kerning; } PFR_KernPairRec, *PFR_KernPair; @@ -230,7 +233,7 @@ FT_BEGIN_HEADER FT_BBox bbox; FT_UInt flags; FT_UInt standard_advance; - + FT_Int ascent; /* optional, bbox.yMax if not present */ FT_Int descent; /* optional, bbox.yMin if not present */ FT_Int leading; /* optional, 0 if not present */ @@ -258,6 +261,7 @@ FT_BEGIN_HEADER FT_UInt num_kern_pairs; PFR_KernItem kern_items; PFR_KernItem* kern_items_tail; + PFR_KernPair kern_pairs; /* not part of the spec, but used during load */ FT_UInt32 bct_offset; @@ -281,8 +285,8 @@ FT_BEGIN_HEADER typedef enum PFR_KernFlags_ { - PFR_KERN_2BYTE_ADJ = 0x01, - PFR_KERN_2BYTE_CHAR = 0x02 + PFR_KERN_2BYTE_CHAR = 0x01, + PFR_KERN_2BYTE_ADJ = 0x02 } PFR_KernFlags; diff --git a/reactos/lib/freetype/src/psaux/psauxmod.c b/reactos/lib/freetype/src/psaux/psauxmod.c index d6024178b87..756ec1c5652 100644 --- a/reactos/lib/freetype/src/psaux/psauxmod.c +++ b/reactos/lib/freetype/src/psaux/psauxmod.c @@ -39,7 +39,7 @@ ps_parser_init, ps_parser_done, ps_parser_skip_spaces, - ps_parser_skip_alpha, + ps_parser_skip_PS_token, ps_parser_to_int, ps_parser_to_fixed, ps_parser_to_bytes, diff --git a/reactos/lib/freetype/src/psaux/psobjs.c b/reactos/lib/freetype/src/psaux/psobjs.c index fca38baf589..7087ca5aca5 100644 --- a/reactos/lib/freetype/src/psaux/psobjs.c +++ b/reactos/lib/freetype/src/psaux/psobjs.c @@ -4,7 +4,7 @@ /* */ /* Auxiliary functions for PostScript fonts (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -142,7 +142,7 @@ /* table :: The target table. */ /* */ /* <Input> */ - /* idx :: The index of the object in the table. */ + /* idx :: The index of the object in the table. */ /* */ /* object :: The address of the object to copy in memory. */ /* */ @@ -181,7 +181,7 @@ /* increase size by 25% and round up to the nearest multiple of 1024 */ new_size += ( new_size >> 2 ) + 1; - new_size = ( new_size + 1023 ) & -1024; + new_size = FT_PAD_CEIL( new_size, 1024 ); } error = reallocate_t1_table( table, new_size ); @@ -267,31 +267,76 @@ /*************************************************************************/ /* In the PostScript Language Reference Manual (PLRM) the following */ - /* characters are called `white-space characters'. */ + /* characters are called `whitespace characters'. */ #define IS_T1_WHITESPACE( c ) ( (c) == ' ' || (c) == '\t' ) #define IS_T1_LINESPACE( c ) ( (c) == '\r' || (c) == '\n' || (c) == '\f' ) #define IS_T1_NULLSPACE( c ) ( (c) == '\0' ) - /* According to the PLRM all white-space characters are equivalent, */ - /* except in comments and strings. */ + /* According to the PLRM all whitespace characters are equivalent, */ + /* except in comments and strings. */ #define IS_T1_SPACE( c ) ( IS_T1_WHITESPACE( c ) || \ IS_T1_LINESPACE( c ) || \ IS_T1_NULLSPACE( c ) ) - static void - skip_spaces( FT_Byte** acur, - FT_Byte* limit ) + /* The following array is used by various functions to quickly convert */ + /* digits (both decimal and non-decimal) into numbers. */ + +#if 'A' == 65 + /* ASCII */ + + static const char ft_char_table[128] = { - FT_Byte* cur = *acur; + /* 0x00 */ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, + }; + + /* no character >= 0x80 can represent a valid number */ +#define OP >= + +#endif /* 'A' == 65 */ + +#if 'A' == 193 + /* EBCDIC */ + + static const char ft_char_table[128] = + { + /* 0x80 */ + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1, + -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, + -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1, + -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, + -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, + } + + /* no character < 0x80 can represent a valid number */ +#define OP < + +#endif /* 'A' == 193 */ + + + /* first character must be already part of the comment */ + + static void + skip_comment( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur = *acur; while ( cur < limit ) { - FT_Byte c = *cur; - - - if ( !IS_T1_SPACE( c ) ) + if ( IS_T1_LINESPACE( *cur ) ) break; cur++; } @@ -301,19 +346,22 @@ static void - skip_alpha( FT_Byte** acur, - FT_Byte* limit ) + skip_spaces( FT_Byte* *acur, + FT_Byte* limit ) { FT_Byte* cur = *acur; while ( cur < limit ) { - FT_Byte c = *cur; - - - if ( IS_T1_SPACE( c ) ) - break; + if ( !IS_T1_SPACE( *cur ) ) + { + if ( *cur == '%' ) + /* According to the PLRM, a comment is equal to a space. */ + skip_comment( &cur, limit ); + else + break; + } cur++; } @@ -321,6 +369,165 @@ } + /* first character must be `(' */ + + static void + skip_literal_string( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur = *acur; + FT_Int embed = 0; + + + while ( cur < limit ) + { + if ( *cur == '\\' ) + cur++; + else if ( *cur == '(' ) + embed++; + else if ( *cur == ')' ) + { + embed--; + if ( embed == 0 ) + { + cur++; + break; + } + } + cur++; + } + + *acur = cur; + } + + + /* first character must be `<' */ + + static void + skip_string( PS_Parser parser ) + { + FT_Byte* cur = parser->cursor; + FT_Byte* limit = parser->limit; + + + while ( ++cur < limit ) + { + int d; + + + /* All whitespace characters are ignored. */ + skip_spaces( &cur, limit ); + if ( cur >= limit ) + break; + + if ( *cur OP 0x80 ) + break; + + d = ft_char_table[*cur & 0x7F]; + if ( d < 0 || d >= 16 ) + break; + } + + if ( cur < limit && *cur != '>' ) + parser->error = PSaux_Err_Invalid_File_Format; + else + cur++; + + parser->cursor = cur; + } + + + /***********************************************************************/ + /* */ + /* All exported parsing routines handle leading whitespace and stop at */ + /* the first character which isn't part of the just handled token. */ + /* */ + /***********************************************************************/ + + + FT_LOCAL_DEF( void ) + ps_parser_skip_PS_token( PS_Parser parser ) + { + /* Note: PostScript allows any non-delimiting, non-whitespace */ + /* character in a name (PS Ref Manual, 3rd ed, p31). */ + /* PostScript delimiters are (, ), <, >, [, ], {, }, /, and %. */ + + FT_Byte* cur = parser->cursor; + FT_Byte* limit = parser->limit; + + + skip_spaces( &cur, limit ); /* this also skips comments */ + if ( cur >= limit ) + goto Exit; + + /* self-delimiting, single-character tokens */ + if ( *cur == '[' || *cur == ']' || + *cur == '{' || *cur == '}' ) + { + cur++; + goto Exit; + } + + if ( *cur == '(' ) /* (...) */ + { + skip_literal_string( &cur, limit ); + goto Exit; + } + + if ( *cur == '<' ) /* <...> */ + { + if ( cur + 1 < limit && *(cur + 1) == '<' ) /* << */ + { + cur++; + cur++; + goto Exit; + } + parser->cursor = cur; + skip_string( parser ); + return; + } + + if ( *cur == '>' ) + { + cur++; + if ( cur >= limit || *cur != '>' ) /* >> */ + { + parser->error = PSaux_Err_Invalid_File_Format; + goto Exit; + } + cur++; + goto Exit; + } + + if ( *cur == '/' ) + cur++; + + /* anything else */ + while ( cur < limit ) + { + if ( IS_T1_SPACE( *cur ) || + *cur == '(' || + *cur == '/' || + *cur == '%' || + *cur == '[' || *cur == ']' || + *cur == '{' || *cur == '}' || + *cur == '<' || *cur == '>' ) + break; + + if ( *cur == ')' ) + { + parser->error = PSaux_Err_Invalid_File_Format; + goto Exit; + } + + cur++; + } + + Exit: + parser->cursor = cur; + } + + FT_LOCAL_DEF( void ) ps_parser_skip_spaces( PS_Parser parser ) { @@ -328,12 +535,8 @@ } - FT_LOCAL_DEF( void ) - ps_parser_skip_alpha( PS_Parser parser ) - { - skip_alpha( &parser->cursor, parser->limit ); - } - + /* `token' here means either something between balanced delimiters */ + /* or the next token; the delimiters are not removed. */ FT_LOCAL_DEF( void ) ps_parser_to_token( PS_Parser parser, @@ -349,72 +552,87 @@ token->start = 0; token->limit = 0; - /* first of all, skip space */ + /* first of all, skip leading whitespace */ ps_parser_skip_spaces( parser ); cur = parser->cursor; limit = parser->limit; - if ( cur < limit ) + if ( cur >= limit ) + return; + + switch ( *cur ) { - switch ( *cur ) - { - /************* check for strings ***********************/ - case '(': - token->type = T1_TOKEN_TYPE_STRING; - ender = ')'; - goto Lookup_Ender; - - /************* check for programs/array ****************/ - case '{': - token->type = T1_TOKEN_TYPE_ARRAY; - ender = '}'; - goto Lookup_Ender; - - /************* check for table/array ******************/ - case '[': - token->type = T1_TOKEN_TYPE_ARRAY; - ender = ']'; - - Lookup_Ender: - embed = 1; - starter = *cur++; - token->start = cur; - while ( cur < limit ) - { - if ( *cur == starter ) - embed++; - else if ( *cur == ender ) - { - embed--; - if ( embed <= 0 ) - { - token->limit = cur++; - break; - } - } - cur++; - } - break; - - /* **************** otherwise, it's any token **********/ - default: - token->start = cur++; - token->type = T1_TOKEN_TYPE_ANY; - while ( cur < limit && !IS_T1_SPACE( *cur ) ) - cur++; - + /************* check for literal string *****************/ + case '(': + token->type = T1_TOKEN_TYPE_STRING; + token->start = cur; + skip_literal_string( &cur, limit ); + if ( cur < limit ) token->limit = cur; - } + break; - if ( !token->limit ) - { - token->start = 0; - token->type = T1_TOKEN_TYPE_NONE; - } + /************* check for programs/array *****************/ + case '{': + token->type = T1_TOKEN_TYPE_ARRAY; + ender = '}'; + goto Lookup_Ender; + /************* check for table/array ********************/ + case '[': + token->type = T1_TOKEN_TYPE_ARRAY; + ender = ']'; + /* fall through */ + + Lookup_Ender: + embed = 1; + starter = *cur; + token->start = cur++; + + /* we need this to catch `[ ]' */ parser->cursor = cur; + ps_parser_skip_spaces( parser ); + cur = parser->cursor; + + while ( cur < limit && !parser->error ) + { + if ( *cur == starter ) + embed++; + else if ( *cur == ender ) + { + embed--; + if ( embed <= 0 ) + { + token->limit = ++cur; + break; + } + } + + parser->cursor = cur; + ps_parser_skip_PS_token( parser ); + /* we need this to catch `[XXX ]' */ + ps_parser_skip_spaces ( parser ); + cur = parser->cursor; + } + break; + + /* ************ otherwise, it is any token **************/ + default: + token->start = cur; + token->type = T1_TOKEN_TYPE_ANY; + ps_parser_skip_PS_token( parser ); + cur = parser->cursor; + if ( !parser->error ) + token->limit = cur; } + + if ( !token->limit ) + { + token->start = 0; + token->type = T1_TOKEN_TYPE_NONE; + } + + parser->cursor = cur; } @@ -429,7 +647,9 @@ *pnum_tokens = -1; + /* this also handles leading whitespace */ ps_parser_to_token( parser, &master ); + if ( master.type == T1_TOKEN_TYPE_ARRAY ) { FT_Byte* old_cursor = parser->cursor; @@ -438,8 +658,9 @@ T1_Token limit = cur + max_tokens; - parser->cursor = master.start; - parser->limit = master.limit; + /* don't include outermost delimiters */ + parser->cursor = master.start + 1; + parser->limit = master.limit - 1; while ( parser->cursor < parser->limit ) { @@ -464,150 +685,163 @@ } - static FT_Long - T1Radix( FT_Long radixBase, - FT_Byte** cur, - FT_Byte* limit ) - { - FT_Long result = 0; - FT_Byte radixEndChar0 = - (FT_Byte)( radixBase > 10 ? '9' + 1 : '0' + radixBase ); - FT_Byte radixEndChar1 = - (FT_Byte)( 'A' + radixBase - 10 ); - FT_Byte radixEndChar2 = - (FT_Byte)( 'a' + radixBase - 10 ); - - - while( *cur < limit ) - { - if ( (*cur)[0] >= '0' && (*cur)[0] < radixEndChar0 ) - result = result * radixBase + (*cur)[0] - '0'; - - else if ( radixBase > 10 && - (*cur)[0] >= 'A' && (*cur)[0] < radixEndChar1 ) - result = result * radixBase + ( (*cur)[0] - 'A' + 10 ); - - else if ( radixBase > 10 && - (*cur)[0] >= 'a' && (*cur)[0] < radixEndChar2 ) - result = result * radixBase + ( (*cur)[0] - 'a' + 10 ); - - else - return result; - - (*cur)++; - } - - return result; - } - + /* first character must be already part of the number */ static FT_Long - t1_toint( FT_Byte** cursor, + ps_radix( FT_Long radixBase, + FT_Byte* *acur, FT_Byte* limit ) { FT_Long result = 0; - FT_Byte* cur = *cursor; - FT_Byte c = '\0', d; + FT_Byte* cur = *acur; - for ( ; cur < limit; cur++ ) + if ( radixBase < 2 || radixBase > 36 ) + return 0; + + while ( cur < limit ) { - c = *cur; - d = (FT_Byte)( c - '0' ); - if ( d < 10 ) + int d; + + + if ( *cur OP 0x80 ) break; - if ( c == '-' ) - { - cur++; + d = ft_char_table[*cur & 0x7F]; + if ( d < 0 || d >= radixBase ) break; - } + + result = result * radixBase + d; + + cur++; } - if ( cur < limit ) - { - do - { - d = (FT_Byte)( cur[0] - '0' ); - if ( d >= 10 ) - { - if ( cur[0] == '#' ) - { - cur++; - result = T1Radix( result, &cur, limit ); - } - break; - } + *acur = cur; - result = result * 10 + d; - cur++; - - } while ( cur < limit ); - - if ( c == '-' ) - result = -result; - } - - *cursor = cur; return result; } - /* <...>: hexadecimal string */ + /* first character must be already part of the number */ + + static FT_Long + ps_toint( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Long result = 0; + FT_Byte* cur = *acur; + FT_Byte c; + + + if ( cur >= limit ) + goto Exit; + + c = *cur; + if ( c == '-' ) + cur++; + + while ( cur < limit ) + { + int d; + + + if ( *cur == '#' ) + { + cur++; + result = ps_radix( result, &cur, limit ); + break; + } + + if ( *cur OP 0x80 ) + break; + + d = ft_char_table[*cur & 0x7F]; + if ( d < 0 || d >= 10 ) + break; + result = result * 10 + d; + + cur++; + }; + + if ( c == '-' ) + result = -result; + + Exit: + *acur = cur; + return result; + } + + + /* first character must be `<' if `delimiters' is non-zero */ + static FT_Error - ps_tobytes( FT_Byte** cursor, + ps_tobytes( FT_Byte* *acur, FT_Byte* limit, - FT_Int max_bytes, + FT_Long max_bytes, FT_Byte* bytes, - FT_Int* pnum_bytes ) + FT_Long* pnum_bytes, + FT_Bool delimiters ) { FT_Error error = PSaux_Err_Ok; - FT_Byte* cur = *cursor; - FT_Int n = 0; - FT_Byte b; + FT_Byte* cur = *acur; + FT_Long n = 0; - skip_spaces( &cur, limit ); - - if ( *cur != '<' ) - { - error = PSaux_Err_Invalid_File_Format; + if ( cur >= limit ) goto Exit; + + if ( delimiters ) + { + if ( *cur != '<' ) + { + error = PSaux_Err_Invalid_File_Format; + goto Exit; + } + + cur++; } - cur++; + max_bytes = max_bytes * 2; - for ( ; cur < limit; n++ ) + for ( n = 0; cur < limit; n++, cur++ ) { - FT_Byte* cur2 = cur; + int d; - if ( n + 1 > max_bytes * 2 ) + if ( n >= max_bytes ) + /* buffer is full */ goto Exit; - /* All white-space charcters are ignored. */ + /* All whitespace characters are ignored. */ skip_spaces( &cur, limit ); + if ( cur >= limit ) + break; - b = T1Radix( 16, &cur, cur + 1 ); + if ( *cur OP 0x80 ) + break; - if ( cur == cur2 ) + d = ft_char_table[*cur & 0x7F]; + if ( d < 0 || d >= 16 ) break; /* <f> == <f0> != <0f> */ - bytes[n / 2] = ( n % 2 ) ? bytes[n / 2] + b - : b * 16; + bytes[n / 2] = (FT_Byte)( ( n % 2 ) ? bytes[n / 2] + d + : d * 16 ); } - skip_spaces( &cur, limit ); - - if ( *cur != '>' ) + if ( delimiters ) { - error = PSaux_Err_Invalid_File_Format; - goto Exit; + if ( cur < limit && *cur != '>' ) + { + error = PSaux_Err_Invalid_File_Format; + goto Exit; + } + + cur++; } - *cursor = ++cur; + *acur = cur; Exit: *pnum_bytes = ( n + 1 ) / 2; @@ -616,22 +850,23 @@ } + /* first character must be already part of the number */ + static FT_Long - t1_tofixed( FT_Byte** cursor, + ps_tofixed( FT_Byte* *acur, FT_Byte* limit, FT_Long power_ten ) { - FT_Byte* cur = *cursor; + FT_Byte* cur = *acur; FT_Long num, divider, result; FT_Int sign = 0; - FT_Byte d; if ( cur >= limit ) return 0; /* first of all, check the sign */ - if ( *cur == '-' ) + if ( *cur == '-' && cur + 1 < limit ) { sign = 1; cur++; @@ -639,7 +874,7 @@ /* then, read the integer part, if any */ if ( *cur != '.' ) - result = t1_toint( &cur, limit ) << 16; + result = ps_toint( &cur, limit ) << 16; else result = 0; @@ -656,8 +891,14 @@ for (;;) { - d = (FT_Byte)( *cur - '0' ); - if ( d >= 10 ) + int d; + + + if ( *cur OP 0x80 ) + break; + + d = ft_char_table[*cur & 0x7F]; + if ( d < 0 || d >= 10 ) break; if ( divider < 10000000L ) @@ -676,7 +917,7 @@ if ( cur + 1 < limit && ( *cur == 'e' || *cur == 'E' ) ) { cur++; - power_ten += t1_toint( &cur, limit ); + power_ten += ps_toint( &cur, limit ); } Exit: @@ -701,18 +942,20 @@ if ( sign ) result = -result; - *cursor = cur; + *acur = cur; return result; } + /* first character must be a delimiter or a part of a number */ + static FT_Int - t1_tocoordarray( FT_Byte** cursor, + ps_tocoordarray( FT_Byte* *acur, FT_Byte* limit, FT_Int max_coords, FT_Short* coords ) { - FT_Byte* cur = *cursor; + FT_Byte* cur = *acur; FT_Int count = 0; FT_Byte c, ender; @@ -720,8 +963,8 @@ if ( cur >= limit ) goto Exit; - /* check for the beginning of an array; if not, only one number will */ - /* be read */ + /* check for the beginning of an array; otherwise, only one number */ + /* will be read */ c = *cur; ender = 0; @@ -735,24 +978,23 @@ cur++; /* now, read the coordinates */ - for ( ; cur < limit; ) + while ( cur < limit ) { /* skip whitespace in front of data */ - for (;;) - { - c = *cur; - if ( c != ' ' && c != '\t' ) - break; + skip_spaces( &cur, limit ); + if ( cur >= limit ) + goto Exit; - cur++; - if ( cur >= limit ) - goto Exit; - } - - if ( count >= max_coords || c == ender ) + if ( count >= max_coords ) break; - coords[count] = (FT_Short)( t1_tofixed( &cur, limit, 0 ) >> 16 ); + if ( c == ender ) + { + cur++; + break; + } + + coords[count] = (FT_Short)( ps_tofixed( &cur, limit, 0 ) >> 16 ); count++; if ( !ender ) @@ -760,27 +1002,30 @@ } Exit: - *cursor = cur; + *acur = cur; return count; } + /* first character must be a delimiter or a part of a number */ + static FT_Int - t1_tofixedarray( FT_Byte** cursor, + ps_tofixedarray( FT_Byte* *acur, FT_Byte* limit, FT_Int max_values, FT_Fixed* values, FT_Int power_ten ) { - FT_Byte* cur = *cursor; + FT_Byte* cur = *acur; FT_Int count = 0; FT_Byte c, ender; - if ( cur >= limit ) goto Exit; + if ( cur >= limit ) + goto Exit; - /* check for the beginning of an array. If not, only one number will */ - /* be read */ + /* Check for the beginning of an array. Otherwise, only one number */ + /* will be read. */ c = *cur; ender = 0; @@ -794,24 +1039,23 @@ cur++; /* now, read the values */ - for ( ; cur < limit; ) + while ( cur < limit ) { /* skip whitespace in front of data */ - for (;;) - { - c = *cur; - if ( c != ' ' && c != '\t' ) - break; + skip_spaces( &cur, limit ); + if ( cur >= limit ) + goto Exit; - cur++; - if ( cur >= limit ) - goto Exit; - } - - if ( count >= max_values || c == ender ) + if ( count >= max_values ) break; - values[count] = t1_tofixed( &cur, limit, power_ten ); + if ( c == ender ) + { + cur++; + break; + } + + values[count] = ps_tofixed( &cur, limit, power_ten ); count++; if ( !ender ) @@ -819,7 +1063,7 @@ } Exit: - *cursor = cur; + *acur = cur; return count; } @@ -827,7 +1071,7 @@ #if 0 static FT_String* - t1_tostring( FT_Byte** cursor, + ps_tostring( FT_Byte** cursor, FT_Byte* limit, FT_Memory memory ) { @@ -887,40 +1131,41 @@ static int - t1_tobool( FT_Byte** cursor, + ps_tobool( FT_Byte* *acur, FT_Byte* limit ) { - FT_Byte* cur = *cursor; + FT_Byte* cur = *acur; FT_Bool result = 0; /* return 1 if we find `true', 0 otherwise */ if ( cur + 3 < limit && - cur[0] == 't' && - cur[1] == 'r' && - cur[2] == 'u' && - cur[3] == 'e' ) + cur[0] == 't' && + cur[1] == 'r' && + cur[2] == 'u' && + cur[3] == 'e' ) { result = 1; cur += 5; } else if ( cur + 4 < limit && - cur[0] == 'f' && - cur[1] == 'a' && - cur[2] == 'l' && - cur[3] == 's' && - cur[4] == 'e' ) + cur[0] == 'f' && + cur[1] == 'a' && + cur[2] == 'l' && + cur[3] == 's' && + cur[4] == 'e' ) { result = 0; cur += 6; } - *cursor = cur; + *acur = cur; return result; } - /* Load a simple field (i.e. non-table) into the current list of objects */ + /* load a simple field (i.e. non-table) into the current list of objects */ + FT_LOCAL_DEF( FT_Error ) ps_parser_load_field( PS_Parser parser, const T1_Field field, @@ -936,6 +1181,7 @@ FT_Error error; + /* this also skips leading whitespace */ ps_parser_to_token( parser, &token ); if ( !token.type ) goto Fail; @@ -945,7 +1191,7 @@ cur = token.start; limit = token.limit; - /* we must detect arrays */ + /* we must detect arrays in /FontBBox */ if ( field->type == T1_FIELD_TYPE_BBOX ) { T1_TokenRec token2; @@ -953,8 +1199,9 @@ FT_Byte* old_limit = parser->limit; - parser->cursor = token.start; - parser->limit = token.limit; + /* don't include delimiters */ + parser->cursor = token.start + 1; + parser->limit = token.limit - 1; ps_parser_to_token( parser, &token2 ); parser->cursor = old_cur; @@ -966,12 +1213,16 @@ else if ( token.type == T1_TOKEN_TYPE_ARRAY ) { FieldArray: - /* if this is an array, and we have no blend, an error occurs */ + /* if this is an array and we have no blend, an error occurs */ if ( max_objects == 0 ) goto Fail; count = max_objects; - idx = 1; + idx = 1; + + /* don't include delimiters */ + cur++; + limit--; } for ( ; count > 0; count--, idx++ ) @@ -981,23 +1232,25 @@ FT_String* string; + skip_spaces( &cur, limit ); + switch ( field->type ) { case T1_FIELD_TYPE_BOOL: - val = t1_tobool( &cur, limit ); + val = ps_tobool( &cur, limit ); goto Store_Integer; case T1_FIELD_TYPE_FIXED: - val = t1_tofixed( &cur, limit, 0 ); + val = ps_tofixed( &cur, limit, 0 ); goto Store_Integer; case T1_FIELD_TYPE_FIXED_1000: - val = t1_tofixed( &cur, limit, 3 ); + val = ps_tofixed( &cur, limit, 3 ); goto Store_Integer; case T1_FIELD_TYPE_INTEGER: - val = t1_toint( &cur, limit ); - goto Store_Integer; + val = ps_toint( &cur, limit ); + /* fall through */ Store_Integer: switch ( field->size ) @@ -1026,15 +1279,21 @@ FT_UInt len = (FT_UInt)( limit - cur ); - /* with synthetic fonts, it's possible to find a field twice */ - if ( *(FT_String**)q ) + if ( cur >= limit ) break; if ( field->type == T1_FIELD_TYPE_KEY ) { + /* don't include leading `/' */ len--; cur++; } + else + { + /* don't include delimiting parentheses */ + cur++; + len -= 2; + } if ( FT_ALLOC( string, len + 1 ) ) goto Exit; @@ -1052,10 +1311,7 @@ FT_BBox* bbox = (FT_BBox*)q; - /* we need the '[' and ']' delimiters */ - token.start--; - token.limit++; - (void)t1_tofixedarray( &token.start, token.limit, 4, temp, 0 ); + (void)ps_tofixedarray( &token.start, token.limit, 4, temp, 0 ); bbox->xMin = FT_RoundFix( temp[0] ); bbox->yMin = FT_RoundFix( temp[1] ); @@ -1070,7 +1326,7 @@ } } -#if 0 /* obsolete - keep for reference */ +#if 0 /* obsolete -- keep for reference */ if ( pflags ) *pflags |= 1L << field->flag_bit; #else @@ -1101,7 +1357,7 @@ T1_TokenRec elements[T1_MAX_TABLE_ELEMENTS]; T1_Token token; FT_Int num_elements; - FT_Error error = 0; + FT_Error error = PSaux_Err_Ok; FT_Byte* old_cursor; FT_Byte* old_limit; T1_FieldRec fieldrec = *(T1_Field)field; @@ -1113,10 +1369,13 @@ fieldrec.type = T1_FIELD_TYPE_FIXED; #endif - ps_parser_to_token_array( parser, elements, 32, &num_elements ); + ps_parser_to_token_array( parser, elements, + T1_MAX_TABLE_ELEMENTS, &num_elements ); if ( num_elements < 0 ) - goto Fail; - + { + error = PSaux_Err_Ignore; + goto Exit; + } if ( num_elements > T1_MAX_TABLE_ELEMENTS ) num_elements = T1_MAX_TABLE_ELEMENTS; @@ -1149,31 +1408,31 @@ Exit: return error; - - Fail: - error = PSaux_Err_Invalid_File_Format; - goto Exit; } FT_LOCAL_DEF( FT_Long ) ps_parser_to_int( PS_Parser parser ) { - return t1_toint( &parser->cursor, parser->limit ); + ps_parser_skip_spaces( parser ); + return ps_toint( &parser->cursor, parser->limit ); } FT_LOCAL_DEF( FT_Error ) ps_parser_to_bytes( PS_Parser parser, FT_Byte* bytes, - FT_Int max_bytes, - FT_Int* pnum_bytes ) + FT_Long max_bytes, + FT_Long* pnum_bytes, + FT_Bool delimiters ) { + ps_parser_skip_spaces( parser ); return ps_tobytes( &parser->cursor, parser->limit, max_bytes, bytes, - pnum_bytes ); + pnum_bytes, + delimiters ); } @@ -1181,7 +1440,8 @@ ps_parser_to_fixed( PS_Parser parser, FT_Int power_ten ) { - return t1_tofixed( &parser->cursor, parser->limit, power_ten ); + ps_parser_skip_spaces( parser ); + return ps_tofixed( &parser->cursor, parser->limit, power_ten ); } @@ -1190,7 +1450,8 @@ FT_Int max_coords, FT_Short* coords ) { - return t1_tocoordarray( &parser->cursor, parser->limit, + ps_parser_skip_spaces( parser ); + return ps_tocoordarray( &parser->cursor, parser->limit, max_coords, coords ); } @@ -1201,7 +1462,8 @@ FT_Fixed* values, FT_Int power_ten ) { - return t1_tofixedarray( &parser->cursor, parser->limit, + ps_parser_skip_spaces( parser ); + return ps_tofixedarray( &parser->cursor, parser->limit, max_values, values, power_ten ); } @@ -1211,14 +1473,14 @@ FT_LOCAL_DEF( FT_String* ) T1_ToString( PS_Parser parser ) { - return t1_tostring( &parser->cursor, parser->limit, parser->memory ); + return ps_tostring( &parser->cursor, parser->limit, parser->memory ); } FT_LOCAL_DEF( FT_Bool ) T1_ToBool( PS_Parser parser ) { - return t1_tobool( &parser->cursor, parser->limit ); + return ps_tobool( &parser->cursor, parser->limit ); } #endif /* 0 */ @@ -1230,7 +1492,7 @@ FT_Byte* limit, FT_Memory memory ) { - parser->error = 0; + parser->error = PSaux_Err_Ok; parser->base = base; parser->limit = limit; parser->cursor = base; @@ -1404,7 +1666,7 @@ } - /* check room for a new contour, then add it */ + /* check space for a new contour, then add it */ FT_LOCAL_DEF( FT_Error ) t1_builder_add_contour( T1_Builder builder ) { diff --git a/reactos/lib/freetype/src/psaux/psobjs.h b/reactos/lib/freetype/src/psaux/psobjs.h index 8b214f652ba..c2cbf2c79b3 100644 --- a/reactos/lib/freetype/src/psaux/psobjs.h +++ b/reactos/lib/freetype/src/psaux/psobjs.h @@ -78,7 +78,7 @@ FT_BEGIN_HEADER ps_parser_skip_spaces( PS_Parser parser ); FT_LOCAL( void ) - ps_parser_skip_alpha( PS_Parser parser ); + ps_parser_skip_PS_token( PS_Parser parser ); FT_LOCAL( void ) ps_parser_to_token( PS_Parser parser, @@ -108,6 +108,14 @@ FT_BEGIN_HEADER ps_parser_to_int( PS_Parser parser ); + FT_LOCAL( FT_Error ) + ps_parser_to_bytes( PS_Parser parser, + FT_Byte* bytes, + FT_Long max_bytes, + FT_Long* pnum_bytes, + FT_Bool delimiters ); + + FT_LOCAL( FT_Fixed ) ps_parser_to_fixed( PS_Parser parser, FT_Int power_ten ); diff --git a/reactos/lib/freetype/src/psaux/t1cmap.c b/reactos/lib/freetype/src/psaux/t1cmap.c index 3fdf2ee3ce3..dcd99be49fd 100644 --- a/reactos/lib/freetype/src/psaux/t1cmap.c +++ b/reactos/lib/freetype/src/psaux/t1cmap.c @@ -4,7 +4,7 @@ /* */ /* Type 1 character map support (body). */ /* */ -/* Copyright 2002 by */ +/* Copyright 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -35,8 +35,8 @@ t1_cmap_std_init( T1_CMapStd cmap, FT_Int is_expert ) { - T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); - PSNames_Service psnames = (PSNames_Service)face->psnames; + T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; cmap->num_glyphs = face->type1.num_glyphs; @@ -263,26 +263,26 @@ { FT_UInt32 u1 = ((T1_CMapUniPair)pair1)->unicode; FT_UInt32 u2 = ((T1_CMapUniPair)pair2)->unicode; - + if ( u1 < u2 ) return -1; - + if ( u1 > u2 ) return +1; - + return 0; - } + } FT_CALLBACK_DEF( FT_Error ) t1_cmap_unicode_init( T1_CMapUnicode cmap ) { - FT_Error error; - FT_UInt count; - T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); - FT_Memory memory = FT_FACE_MEMORY( face ); - PSNames_Service psnames = (PSNames_Service)face->psnames; + FT_Error error; + FT_UInt count; + T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; cmap->num_pairs = 0; @@ -316,7 +316,7 @@ } } } - + new_count = (FT_UInt)( pair - cmap->pairs ); if ( new_count == 0 ) { diff --git a/reactos/lib/freetype/src/psaux/t1cmap.h b/reactos/lib/freetype/src/psaux/t1cmap.h index 0d68c999c12..aa93d746c17 100644 --- a/reactos/lib/freetype/src/psaux/t1cmap.h +++ b/reactos/lib/freetype/src/psaux/t1cmap.h @@ -4,7 +4,7 @@ /* */ /* Type 1 character map support (specification). */ /* */ -/* Copyright 2002 by */ +/* Copyright 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -22,7 +22,6 @@ #include <ft2build.h> #include FT_INTERNAL_OBJECTS_H #include FT_INTERNAL_TYPE1_TYPES_H -#include FT_INTERNAL_POSTSCRIPT_NAMES_H FT_BEGIN_HEADER @@ -47,16 +46,16 @@ FT_BEGIN_HEADER FT_UInt num_glyphs; const char* const* glyph_names; - + } T1_CMapStdRec; FT_CALLBACK_TABLE const FT_CMap_ClassRec t1_cmap_standard_class_rec; - + FT_CALLBACK_TABLE const FT_CMap_ClassRec t1_cmap_expert_class_rec; - + /*************************************************************************/ /*************************************************************************/ @@ -67,20 +66,20 @@ FT_BEGIN_HEADER /*************************************************************************/ typedef struct T1_CMapCustomRec_* T1_CMapCustom; - + typedef struct T1_CMapCustomRec_ { FT_CMapRec cmap; FT_UInt first; FT_UInt count; FT_UShort* indices; - + } T1_CMapCustomRec; FT_CALLBACK_TABLE const FT_CMap_ClassRec t1_cmap_custom_class_rec; - + /*************************************************************************/ /*************************************************************************/ @@ -97,7 +96,7 @@ FT_BEGIN_HEADER { FT_UInt32 unicode; FT_UInt gindex; - + } T1_CMapUniPairRec, *T1_CMapUniPair; @@ -115,7 +114,7 @@ FT_BEGIN_HEADER /* */ - + FT_END_HEADER #endif /* __T1CMAP_H__ */ diff --git a/reactos/lib/freetype/src/psaux/t1decode.c b/reactos/lib/freetype/src/psaux/t1decode.c index dd8719f12af..db1911e7bd6 100644 --- a/reactos/lib/freetype/src/psaux/t1decode.c +++ b/reactos/lib/freetype/src/psaux/t1decode.c @@ -4,7 +4,7 @@ /* */ /* PostScript Type 1 decoding routines (body). */ /* */ -/* Copyright 2000-2001, 2002, 2003 by */ +/* Copyright 2000-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -125,9 +125,9 @@ t1_lookup_glyph_by_stdcharcode( T1_Decoder decoder, FT_Int charcode ) { - FT_UInt n; - const FT_String* glyph_name; - PSNames_Service psnames = decoder->psnames; + FT_UInt n; + const FT_String* glyph_name; + FT_Service_PsCMaps psnames = decoder->psnames; /* check range of standard char code */ @@ -143,7 +143,7 @@ if ( name && name[0] == glyph_name[0] && - ft_strcmp( name,glyph_name ) == 0 ) + ft_strcmp( name, glyph_name ) == 0 ) return n; } @@ -262,10 +262,6 @@ if ( error ) goto Exit; -#if 0 - n_base_points = base->n_points; -#endif - /* save the left bearing and width of the base character */ /* as they will be erased by the next load. */ @@ -290,23 +286,8 @@ decoder->builder.left_bearing = left_bearing; decoder->builder.advance = advance; - /* XXX: old code doesn't work with PostScript hinter */ -#if 0 - /* Finally, move the accent */ - if ( decoder->builder.load_points ) - { - FT_Outline dummy; - - - dummy.n_points = (short)( base->n_points - n_base_points ); - dummy.points = base->points + n_base_points; - - FT_Outline_Translate( &dummy, adx - asb, ady ); - } -#else decoder->builder.pos_x = 0; decoder->builder.pos_y = 0; -#endif Exit: return error; @@ -1129,11 +1110,10 @@ /* retrieve PSNames interface from list of current modules */ { - PSNames_Service psnames = 0; + FT_Service_PsCMaps psnames = 0; - psnames = (PSNames_Service)FT_Get_Module_Interface( - FT_FACE_LIBRARY(face), "psnames" ); + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); if ( !psnames ) { FT_ERROR(( "t1_decoder_init: " )); diff --git a/reactos/lib/freetype/src/psaux/t1decode.h b/reactos/lib/freetype/src/psaux/t1decode.h index fcb853ce804..00728db501e 100644 --- a/reactos/lib/freetype/src/psaux/t1decode.h +++ b/reactos/lib/freetype/src/psaux/t1decode.h @@ -4,7 +4,7 @@ /* */ /* PostScript Type 1 decoding routines (specification). */ /* */ -/* Copyright 2000-2001, 2002 by */ +/* Copyright 2000-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -22,7 +22,6 @@ #include <ft2build.h> #include FT_INTERNAL_POSTSCRIPT_AUX_H -#include FT_INTERNAL_POSTSCRIPT_NAMES_H #include FT_INTERNAL_TYPE1_TYPES_H diff --git a/reactos/lib/freetype/src/pshinter/Jamfile b/reactos/lib/freetype/src/pshinter/Jamfile index bdde744b0ed..ee02a144be6 100644 --- a/reactos/lib/freetype/src/pshinter/Jamfile +++ b/reactos/lib/freetype/src/pshinter/Jamfile @@ -1,4 +1,4 @@ -# FreeType 2 src/pshinter Jamfile (c) 2001 David Turner +# FreeType 2 src/pshinter Jamfile (c) 2001, 2003 David Turner # SubDir FT2_TOP $(FT2_SRC_DIR) pshinter ; diff --git a/reactos/lib/freetype/src/pshinter/pshalgo.c b/reactos/lib/freetype/src/pshinter/pshalgo.c index 3e76529ac92..5f077d54d12 100644 --- a/reactos/lib/freetype/src/pshinter/pshalgo.c +++ b/reactos/lib/freetype/src/pshinter/pshalgo.c @@ -2,9 +2,9 @@ /* */ /* pshalgo.c */ /* */ -/* PostScript hinting algorithm 3 (body). */ +/* PostScript hinting algorithm (body). */ /* */ -/* Copyright 2001, 2002, 2003 by */ +/* Copyright 2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used */ @@ -35,8 +35,11 @@ #endif -#define COMPUTE_INFLEXS /* compute inflection points to optimize "S" and others */ -#define STRONGER /* slightly increase the contrast of smooth hinting */ +#define COMPUTE_INFLEXS /* compute inflection points to optimize `S' */ + /* and similar glyphs */ +#define STRONGER /* slightly increase the contrast of smooth */ + /* hinting */ + /*************************************************************************/ /*************************************************************************/ @@ -46,13 +49,13 @@ /*************************************************************************/ /*************************************************************************/ - /* return true iff two stem hints overlap */ + /* return true if two stem hints overlap */ static FT_Int psh_hint_overlap( PSH_Hint hint1, PSH_Hint hint2 ) { - return ( hint1->org_pos + hint1->org_len >= hint2->org_pos && - hint2->org_pos + hint2->org_len >= hint1->org_pos ); + return hint1->org_pos + hint1->org_len >= hint2->org_pos && + hint2->org_pos + hint2->org_len >= hint1->org_pos; } @@ -89,7 +92,7 @@ } - /* internal function used to record a new hint */ + /* internal function to record a new hint */ static void psh_hint_table_record( PSH_Hint_Table table, FT_UInt idx ) @@ -109,8 +112,8 @@ psh_hint_activate( hint ); - /* now scan the current active hint set in order to determine */ - /* if we are overlapping with another segment */ + /* now scan the current active hint set to check */ + /* whether `hint' overlaps with another hint */ { PSH_Hint* sorted = table->sort_global; FT_UInt count = table->num_hints; @@ -172,12 +175,14 @@ PS_Mask_Table counter_masks, FT_Memory memory ) { - FT_UInt count = hints->num_hints; + FT_UInt count; FT_Error error; FT_UNUSED( counter_masks ); + count = hints->num_hints; + /* allocate our tables */ if ( FT_NEW_ARRAY( table->sort, 2 * count ) || FT_NEW_ARRAY( table->hints, count ) || @@ -190,7 +195,7 @@ table->num_zones = 0; table->zone = 0; - /* now, initialize the "hints" array */ + /* initialize the `table->hints' array */ { PSH_Hint write = table->hints; PS_Hint read = hints->hints; @@ -204,30 +209,31 @@ } } - /* we now need to determine the initial "parent" stems; first */ + /* we now need to determine the initial `parent' stems; first */ /* activate the hints that are given by the initial hint masks */ if ( hint_masks ) { - FT_UInt Count = hint_masks->num_masks; - PS_Mask Mask = hint_masks->masks; + PS_Mask mask = hint_masks->masks; + count = hint_masks->num_masks; table->hint_masks = hint_masks; - for ( ; Count > 0; Count--, Mask++ ) - psh_hint_table_record_mask( table, Mask ); + for ( ; count > 0; count--, mask++ ) + psh_hint_table_record_mask( table, mask ); } - /* now, do a linear parse in case some hints were left alone */ + /* finally, do a linear parse in case some hints were left alone */ if ( table->num_hints != table->max_hints ) { - FT_UInt Index, Count; + FT_UInt idx; FT_ERROR(( "psh_hint_table_init: missing/incorrect hint masks!\n" )); - Count = table->max_hints; - for ( Index = 0; Index < Count; Index++ ) - psh_hint_table_record( table, Index ); + + count = table->max_hints; + for ( idx = 0; idx < count; idx++ ) + psh_hint_table_record( table, idx ); } Exit: @@ -375,11 +381,11 @@ len += delta; } else - len = ( len + 32 ) & -64; + len = FT_PIX_ROUND( len ); } if ( do_snapping ) - len = ( len + 32 ) & -64; + len = FT_PIX_ROUND( len ); return len; } @@ -417,11 +423,11 @@ psh_hint_snap_stem_side_delta( FT_Fixed pos, FT_Fixed len ) { - FT_Fixed delta1 = ( ( pos + 32 ) & -64 ) - pos; - FT_Fixed delta2 = ( ( pos + len + 32 ) & -64 ) - pos - len; + FT_Fixed delta1 = FT_PIX_ROUND( pos ) - pos; + FT_Fixed delta2 = FT_PIX_ROUND( pos + len ) - pos - len; - if ( ABS( delta1 ) <= ABS( delta2 ) ) + if ( FT_ABS( delta1 ) <= FT_ABS( delta2 ) ) return delta1; else return delta2; @@ -511,6 +517,9 @@ if ( !psh_hint_is_fitted( parent ) ) psh_hint_align( parent, globals, dimension, glyph ); + /* keep original relation between hints, this is, use the */ + /* scaled distance between the centers of the hints to */ + /* compute the new position */ par_org_center = parent->org_pos + ( parent->org_len >> 1 ); par_cur_center = parent->cur_pos + ( parent->cur_len >> 1 ); cur_org_center = hint->org_pos + ( hint->org_len >> 1 ); @@ -534,10 +543,10 @@ * around the nearest pixel center */ #if 1 - pos = ( pos + ( len >> 1 ) ) & -64; + pos = FT_PIX_FLOOR( pos + ( len >> 1 ) ); #else /* this seems to be a bug! */ - pos = ( pos + ( ( len >> 1 ) & -64 ) ); + pos = pos + FT_PIX_FLOOR( len >> 1 ); #endif len = 64; } @@ -562,7 +571,7 @@ if ( len < 64 ) len = 64; else - len = ( len + 32 ) & -64; + len = FT_PIX_ROUND( len ); switch ( align.align ) { @@ -583,9 +592,9 @@ default: hint->cur_len = len; if ( len & 64 ) - pos = ( ( pos + ( len >> 1 ) ) & -64 ) + 32; + pos = FT_PIX_FLOOR( pos + ( len >> 1 ) ) + 32; else - pos = ( pos + ( len >> 1 ) + 32 ) & -64; + pos = FT_PIX_ROUND( pos + ( len >> 1 ) ); hint->cur_pos = pos - ( len >> 1 ); hint->cur_len = len; @@ -739,13 +748,13 @@ if ( ( len / 64 ) & 1 ) { - delta_a = ( center & -64 ) + 32 - center; - delta_b = ( ( center + 32 ) & - 64 ) - center; + delta_a = FT_PIX_FLOOR( center ) + 32 - center; + delta_b = FT_PIX_ROUND( center ) - center; } else { - delta_a = ( ( center + 32 ) & - 64 ) - center; - delta_b = ( center & -64 ) + 32 - center; + delta_a = FT_PIX_ROUND( center ) - center; + delta_b = FT_PIX_FLOOR( center ) + 32 - center; } /* We choose between B) and C) above based on the amount @@ -762,8 +771,7 @@ FT_Fixed side_delta = psh_hint_snap_stem_side_delta ( pos, len ); - - if ( ABS( side_delta ) < ABS( delta_b ) ) + if ( FT_ABS( side_delta ) < FT_ABS( delta_b ) ) pos += side_delta; else pos += delta_b; @@ -1111,7 +1119,7 @@ /* clear all fields */ FT_MEM_ZERO( glyph, sizeof ( *glyph ) ); - memory = globals->memory; + memory = glyph->memory = globals->memory; /* allocate and setup points + contours arrays */ if ( FT_NEW_ARRAY( glyph->points, outline->n_points ) || @@ -1218,7 +1226,6 @@ } } - glyph->memory = memory; glyph->outline = outline; glyph->globals = globals; @@ -1323,8 +1330,8 @@ ; } - /* for each extrema, determine its direction along the */ - /* orthogonal axis */ + /* for each extremum, determine its direction along the */ + /* orthogonal axis */ for ( n = 0; n < glyph->num_points; n++ ) { PSH_Point point, before, after; @@ -1370,9 +1377,6 @@ } -#define PSH_STRONG_THRESHOLD 30 - - /* major_dir is the direction for points on the bottom/left of the stem; */ /* Points on the top/right of the stem will have a direction of */ /* -major_dir. */ @@ -1380,6 +1384,7 @@ static void psh_hint_table_find_strong_point( PSH_Hint_Table table, PSH_Point point, + FT_Int threshold, FT_Int major_dir ) { PSH_Hint* sort = table->sort; @@ -1409,7 +1414,7 @@ flag = PSH_POINT_EDGE_MIN; d = point->org_u - hint->org_pos; - if ( ABS( d ) < PSH_STRONG_THRESHOLD ) + if ( FT_ABS( d ) < threshold ) { Is_Strong: psh_point_set_strong( point ); @@ -1423,7 +1428,7 @@ flag = PSH_POINT_EDGE_MAX; d = point->org_u - hint->org_pos - hint->org_len; - if ( ABS( d ) < PSH_STRONG_THRESHOLD ) + if ( FT_ABS( d ) < threshold ) goto Is_Strong; } } @@ -1459,7 +1464,7 @@ flag = PSH_POINT_EDGE_MIN; d = point->org_u - hint->org_pos; - if ( ABS( d ) < PSH_STRONG_THRESHOLD ) + if ( FT_ABS( d ) < threshold ) { Is_Strong2: point->flags2 |= flag; @@ -1473,7 +1478,7 @@ flag = PSH_POINT_EDGE_MAX; d = point->org_u - hint->org_pos - hint->org_len; - if ( ABS( d ) < PSH_STRONG_THRESHOLD ) + if ( FT_ABS( d ) < threshold ) goto Is_Strong2; } @@ -1489,74 +1494,165 @@ } + /* the accepted shift for strong points in fractional pixels */ +#define PSH_STRONG_THRESHOLD 32 + + /* the maximum shift value in font units */ +#define PSH_STRONG_THRESHOLD_MAXIMUM 30 + + /* find strong points in a glyph */ static void psh_glyph_find_strong_points( PSH_Glyph glyph, FT_Int dimension ) { - /* a point is strong if it is located on a stem */ - /* edge and has an "in" or "out" tangent to the hint's direction */ + /* a point is `strong' if it is located on a stem edge and */ + /* has an `in' or `out' tangent parallel to the hint's direction */ + + PSH_Hint_Table table = &glyph->hint_tables[dimension]; + PS_Mask mask = table->hint_masks->masks; + FT_UInt num_masks = table->hint_masks->num_masks; + FT_UInt first = 0; + FT_Int major_dir = dimension == 0 ? PSH_DIR_VERTICAL + : PSH_DIR_HORIZONTAL; + PSH_Dimension dim = &glyph->globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Int threshold; + + + threshold = (FT_Int)FT_DivFix( PSH_STRONG_THRESHOLD, scale ); + if ( threshold > PSH_STRONG_THRESHOLD_MAXIMUM ) + threshold = PSH_STRONG_THRESHOLD_MAXIMUM; + + /* process secondary hints to `selected' points */ + if ( num_masks > 1 && glyph->num_points > 0 ) { - PSH_Hint_Table table = &glyph->hint_tables[dimension]; - PS_Mask mask = table->hint_masks->masks; - FT_UInt num_masks = table->hint_masks->num_masks; - FT_UInt first = 0; - FT_Int major_dir = dimension == 0 ? PSH_DIR_VERTICAL - : PSH_DIR_HORIZONTAL; - - - /* process secondary hints to "selected" points */ - if ( num_masks > 1 && glyph->num_points > 0 ) + first = mask->end_point; + mask++; + for ( ; num_masks > 1; num_masks--, mask++ ) { - first = mask->end_point; - mask++; - for ( ; num_masks > 1; num_masks--, mask++ ) + FT_UInt next; + FT_Int count; + + + next = mask->end_point; + count = next - first; + if ( count > 0 ) { - FT_UInt next; - FT_Int count; + PSH_Point point = glyph->points + first; - next = mask->end_point; - count = next - first; - if ( count > 0 ) + psh_hint_table_activate_mask( table, mask ); + + for ( ; count > 0; count--, point++ ) + psh_hint_table_find_strong_point( table, point, + threshold, major_dir ); + } + first = next; + } + } + + /* process primary hints for all points */ + if ( num_masks == 1 ) + { + FT_UInt count = glyph->num_points; + PSH_Point point = glyph->points; + + + psh_hint_table_activate_mask( table, table->hint_masks->masks ); + for ( ; count > 0; count--, point++ ) + { + if ( !psh_point_is_strong( point ) ) + psh_hint_table_find_strong_point( table, point, + threshold, major_dir ); + } + } + + /* now, certain points may have been attached to a hint and */ + /* not marked as strong; update their flags then */ + { + FT_UInt count = glyph->num_points; + PSH_Point point = glyph->points; + + + for ( ; count > 0; count--, point++ ) + if ( point->hint && !psh_point_is_strong( point ) ) + psh_point_set_strong( point ); + } + } + + + /* find points in a glyph which are in a blue zone and have `in' or */ + /* `out' tangents parallel to the horizontal axis */ + static void + psh_glyph_find_blue_points( PSH_Blues blues, + PSH_Glyph glyph ) + { + PSH_Blue_Table table; + PSH_Blue_Zone zone; + FT_UInt glyph_count = glyph->num_points; + FT_UInt blue_count; + PSH_Point point = glyph->points; + + + for ( ; glyph_count > 0; glyph_count--, point++ ) + { + FT_Pos y; + + + /* check tangents */ + if ( !PSH_DIR_COMPARE( point->dir_in, PSH_DIR_HORIZONTAL ) && + !PSH_DIR_COMPARE( point->dir_out, PSH_DIR_HORIZONTAL ) ) + continue; + + /* skip strong points */ + if ( psh_point_is_strong( point ) ) + continue; + + y = point->org_u; + + /* look up top zones */ + table = &blues->normal_top; + blue_count = table->count; + zone = table->zones; + + for ( ; blue_count > 0; blue_count--, zone++ ) + { + FT_Pos delta = y - zone->org_bottom; + + + if ( delta < -blues->blue_fuzz ) + break; + + if ( y <= zone->org_top + blues->blue_fuzz ) + if ( blues->no_overshoots || delta <= blues->blue_threshold ) { - PSH_Point point = glyph->points + first; - - - psh_hint_table_activate_mask( table, mask ); - - for ( ; count > 0; count--, point++ ) - psh_hint_table_find_strong_point( table, point, major_dir ); - } - first = next; - } - } - - /* process primary hints for all points */ - if ( num_masks == 1 ) - { - FT_UInt count = glyph->num_points; - PSH_Point point = glyph->points; - - - psh_hint_table_activate_mask( table, table->hint_masks->masks ); - for ( ; count > 0; count--, point++ ) - { - if ( !psh_point_is_strong( point ) ) - psh_hint_table_find_strong_point( table, point, major_dir ); - } - } - - /* now, certain points may have been attached to hint and */ - /* not marked as strong; update their flags then */ - { - FT_UInt count = glyph->num_points; - PSH_Point point = glyph->points; - - - for ( ; count > 0; count--, point++ ) - if ( point->hint && !psh_point_is_strong( point ) ) + point->cur_u = zone->cur_bottom; psh_point_set_strong( point ); + psh_point_set_fitted( point ); + } + } + + /* look up bottom zones */ + table = &blues->normal_bottom; + blue_count = table->count; + zone = table->zones + blue_count - 1; + + for ( ; blue_count > 0; blue_count--, zone-- ) + { + FT_Pos delta = zone->org_top - y; + + + if ( delta < -blues->blue_fuzz ) + break; + + if ( y >= zone->org_bottom - blues->blue_fuzz ) + if ( blues->no_overshoots || delta < blues->blue_threshold ) + { + point->cur_u = zone->cur_top; + psh_point_set_strong( point ); + psh_point_set_fitted( point ); + } } } } @@ -1570,50 +1666,45 @@ PSH_Dimension dim = &glyph->globals->dimension[dimension]; FT_Fixed scale = dim->scale_mult; + FT_UInt count = glyph->num_points; + PSH_Point point = glyph->points; + + for ( ; count > 0; count--, point++ ) { - FT_UInt count = glyph->num_points; - PSH_Point point = glyph->points; + PSH_Hint hint = point->hint; - for ( ; count > 0; count--, point++ ) + if ( hint ) { - PSH_Hint hint = point->hint; + FT_Pos delta; - if ( hint ) + if ( psh_point_is_edge_min( point ) ) + point->cur_u = hint->cur_pos; + + else if ( psh_point_is_edge_max( point ) ) + point->cur_u = hint->cur_pos + hint->cur_len; + + else { - FT_Pos delta; + delta = point->org_u - hint->org_pos; + if ( delta <= 0 ) + point->cur_u = hint->cur_pos + FT_MulFix( delta, scale ); - if ( psh_point_is_edge_min( point ) ) - { - point->cur_u = hint->cur_pos; - } - else if ( psh_point_is_edge_max( point ) ) - { - point->cur_u = hint->cur_pos + hint->cur_len; - } + else if ( delta >= hint->org_len ) + point->cur_u = hint->cur_pos + hint->cur_len + + FT_MulFix( delta - hint->org_len, scale ); + + else if ( hint->org_len > 0 ) + point->cur_u = hint->cur_pos + + FT_MulDiv( delta, hint->cur_len, + hint->org_len ); else - { - delta = point->org_u - hint->org_pos; - - if ( delta <= 0 ) - point->cur_u = hint->cur_pos + FT_MulFix( delta, scale ); - - else if ( delta >= hint->org_len ) - point->cur_u = hint->cur_pos + hint->cur_len + - FT_MulFix( delta - hint->org_len, scale ); - - else if ( hint->org_len > 0 ) - point->cur_u = hint->cur_pos + - FT_MulDiv( delta, hint->cur_len, - hint->org_len ); - else - point->cur_u = hint->cur_pos; - } - psh_point_set_fitted( point ); + point->cur_u = hint->cur_pos; } + psh_point_set_fitted( point ); } } } @@ -1625,109 +1716,107 @@ { #if 1 + /* first technique: a point is strong if it is a local extremum */ PSH_Dimension dim = &glyph->globals->dimension[dimension]; FT_Fixed scale = dim->scale_mult; + FT_UInt count = glyph->num_points; + PSH_Point point = glyph->points; - /* first technique: a point is strong if it is a local extrema */ + + for ( ; count > 0; count--, point++ ) { - FT_UInt count = glyph->num_points; - PSH_Point point = glyph->points; + if ( psh_point_is_strong( point ) ) + continue; - - for ( ; count > 0; count--, point++ ) + /* sometimes, some local extrema are smooth points */ + if ( psh_point_is_smooth( point ) ) { - if ( psh_point_is_strong( point ) ) + if ( point->dir_in == PSH_DIR_NONE || + point->dir_in != point->dir_out ) continue; - /* sometimes, some local extremas are smooth points */ - if ( psh_point_is_smooth( point ) ) + if ( !psh_point_is_extremum( point ) && + !psh_point_is_inflex( point ) ) + continue; + + point->flags &= ~PSH_POINT_SMOOTH; + } + + /* find best enclosing point coordinates */ + { + PSH_Point before = 0; + PSH_Point after = 0; + + FT_Pos diff_before = -32000; + FT_Pos diff_after = 32000; + FT_Pos u = point->org_u; + + FT_Int count2 = glyph->num_points; + PSH_Point cur = glyph->points; + + + for ( ; count2 > 0; count2--, cur++ ) { - if ( point->dir_in == PSH_DIR_NONE || - point->dir_in != point->dir_out ) - continue; - - if ( !psh_point_is_extremum( point ) && - !psh_point_is_inflex( point ) ) - continue; - - point->flags &= ~PSH_POINT_SMOOTH; - } - - /* find best enclosing point coordinates */ - { - PSH_Point before = 0; - PSH_Point after = 0; - - FT_Pos diff_before = -32000; - FT_Pos diff_after = 32000; - FT_Pos u = point->org_u; - - FT_Int count2 = glyph->num_points; - PSH_Point cur = glyph->points; - - - for ( ; count2 > 0; count2--, cur++ ) + if ( psh_point_is_strong( cur ) ) { - if ( psh_point_is_strong( cur ) ) + FT_Pos diff = cur->org_u - u; + + + if ( diff <= 0 ) { - FT_Pos diff = cur->org_u - u;; - - - if ( diff <= 0 ) + if ( diff > diff_before ) { - if ( diff > diff_before ) - { - diff_before = diff; - before = cur; - } + diff_before = diff; + before = cur; } - else if ( diff >= 0 ) + } + + else if ( diff >= 0 ) + { + if ( diff < diff_after ) { - if ( diff < diff_after ) - { - diff_after = diff; - after = cur; - } + diff_after = diff; + after = cur; } } } + } - if ( !before ) - { - if ( !after ) - continue; + if ( !before ) + { + if ( !after ) + continue; - /* we are before the first strong point coordinate; */ - /* simply translate the point */ - point->cur_u = after->cur_u + + /* we are before the first strong point coordinate; */ + /* simply translate the point */ + point->cur_u = after->cur_u + FT_MulFix( point->org_u - after->org_u, scale ); - } - else if ( !after ) - { - /* we are after the last strong point coordinate; */ - /* simply translate the point */ - point->cur_u = before->cur_u + + } + else if ( !after ) + { + /* we are after the last strong point coordinate; */ + /* simply translate the point */ + point->cur_u = before->cur_u + FT_MulFix( point->org_u - before->org_u, scale ); - } + } + else + { + if ( diff_before == 0 ) + point->cur_u = before->cur_u; + + else if ( diff_after == 0 ) + point->cur_u = after->cur_u; + else - { - if ( diff_before == 0 ) - point->cur_u = before->cur_u; - - else if ( diff_after == 0 ) - point->cur_u = after->cur_u; - - else - point->cur_u = before->cur_u + + point->cur_u = before->cur_u + FT_MulDiv( u - before->org_u, after->cur_u - before->cur_u, after->org_u - before->org_u ); - } - - psh_point_set_fitted( point ); } + + psh_point_set_fitted( point ); } } @@ -1940,7 +2029,7 @@ scaled = FT_MulFix( globals->blues.normal_top.zones->org_ref, y_scale ); - fitted = ( scaled + 32 ) & -64; + fitted = FT_PIX_ROUND( scaled ); if (scaled != fitted ) { y_scale = FT_MulDiv( y_scale, fitted, scaled ); @@ -1979,6 +2068,8 @@ /* find strong points, align them, then interpolate others */ psh_glyph_find_strong_points( glyph, dimension ); + if ( dimension == 1 ) + psh_glyph_find_blue_points( &globals->blues, glyph ); psh_glyph_interpolate_strong_points( glyph, dimension ); psh_glyph_interpolate_normal_points( glyph, dimension ); psh_glyph_interpolate_other_points( glyph, dimension ); diff --git a/reactos/lib/freetype/src/pshinter/pshglob.c b/reactos/lib/freetype/src/pshinter/pshglob.c index 3ae57283cd6..21d45e92ff8 100644 --- a/reactos/lib/freetype/src/pshinter/pshglob.c +++ b/reactos/lib/freetype/src/pshinter/pshglob.c @@ -5,7 +5,7 @@ /* PostScript hinter global hinting management (body). */ /* Inspired by the new auto-hinter module. */ /* */ -/* Copyright 2001, 2002, 2003 by */ +/* Copyright 2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used */ @@ -52,7 +52,7 @@ if ( count > 0 ) { width->cur = FT_MulFix( width->org, scale ); - width->fit = FT_RoundFix( width->cur ); + width->fit = FT_PIX_ROUND( width->cur ); width++; count--; @@ -72,7 +72,7 @@ w = stand->cur; width->cur = w; - width->fit = FT_RoundFix( w ); + width->fit = FT_PIX_ROUND( w ); } } } @@ -377,7 +377,7 @@ /* parameter to the raw bluescale value. Here is why: */ /* */ /* We need to suppress overshoots for all pointsizes. */ - /* At 300dpi that satisfy: */ + /* At 300dpi that satisfies: */ /* */ /* pointsize < 240*bluescale + 0.49 */ /* */ @@ -396,7 +396,16 @@ /* */ /* "scale < bluescale" */ /* */ - blues->no_overshoots = FT_BOOL( scale < blues->blue_scale ); + /* Note that `blue_scale' is stored 1000 times its real */ + /* value, and that `scale' converts from font units to */ + /* fractional pixels. */ + /* */ + + /* 1000 / 64 = 125 / 8 */ + if ( scale >= 0x20C49BAL ) + blues->no_overshoots = FT_BOOL( scale < blues->blue_scale * 8 / 125 ); + else + blues->no_overshoots = FT_BOOL( scale * 125 < blues->blue_scale * 8 ); /* */ /* The blue threshold is the font units distance under */ @@ -412,7 +421,7 @@ while ( threshold > 0 && FT_MulFix( threshold, scale ) > 32 ) - threshold --; + threshold--; blues->blue_threshold = threshold; } @@ -448,7 +457,7 @@ zone->cur_delta = FT_MulFix( zone->org_delta, scale ); /* round scaled reference position */ - zone->cur_ref = ( zone->cur_ref + 32 ) & -64; + zone->cur_ref = FT_PIX_ROUND( zone->cur_ref ); #if 0 if ( zone->cur_ref > zone->cur_top ) @@ -530,7 +539,7 @@ no_shoots = blues->no_overshoots; - /* lookup stem top in top zones table */ + /* look up stem top in top zones table */ table = &blues->normal_top; count = table->count; zone = table->zones; @@ -565,7 +574,7 @@ if ( stem_bot >= zone->org_bottom - blues->blue_fuzz ) { - if ( no_shoots || delta < blues->blue_shift ) + if ( no_shoots || delta < blues->blue_threshold ) { alignment->align |= PSH_BLUE_ALIGN_BOT; alignment->align_bot = zone->cur_ref; @@ -644,7 +653,7 @@ read++; } - dim->stdw.count = priv->num_snap_widths; + dim->stdw.count = priv->num_snap_widths + 1; } /* copy standard heights */ @@ -654,7 +663,7 @@ write->org = priv->standard_height[0]; - write++; + write++; read = priv->snap_heights; for ( count = priv->num_snap_heights; count > 0; count-- ) { @@ -663,7 +672,7 @@ read++; } - dim->stdw.count = priv->num_snap_heights; + dim->stdw.count = priv->num_snap_heights + 1; } /* copy blue zones */ @@ -675,15 +684,9 @@ priv->family_blues, priv->num_family_other_blues, priv->family_other_blues, priv->blue_fuzz, 1 ); - globals->blues.blue_scale = priv->blue_scale - ? priv->blue_scale - : 0x27A000L; /* 0.039625 * 0x10000 * 1000 */ - - globals->blues.blue_shift = priv->blue_shift - ? priv->blue_shift - : 7; - - globals->blues.blue_fuzz = priv->blue_fuzz; + globals->blues.blue_scale = priv->blue_scale; + globals->blues.blue_shift = priv->blue_shift; + globals->blues.blue_fuzz = priv->blue_fuzz; globals->dimension[0].scale_mult = 0; globals->dimension[0].scale_delta = 0; diff --git a/reactos/lib/freetype/src/pshinter/pshrec.c b/reactos/lib/freetype/src/pshinter/pshrec.c index b0fee3d9530..648de18bc23 100644 --- a/reactos/lib/freetype/src/pshinter/pshrec.c +++ b/reactos/lib/freetype/src/pshinter/pshrec.c @@ -4,7 +4,7 @@ /* */ /* FreeType PostScript hints recorder (body). */ /* */ -/* Copyright 2001, 2002, 2003 by */ +/* Copyright 2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -68,7 +68,7 @@ if ( new_max > old_max ) { /* try to grow the table */ - new_max = ( new_max + 7 ) & -8; + new_max = FT_PAD_CEIL( new_max, 8 ); if ( !FT_RENEW_ARRAY( table->hints, old_max, new_max ) ) table->max_hints = new_max; } @@ -142,7 +142,7 @@ if ( new_max > old_max ) { - new_max = ( new_max + 7 ) & -8; + new_max = FT_PAD_CEIL( new_max, 8 ); if ( !FT_RENEW_ARRAY( mask->bytes, old_max, new_max ) ) mask->max_bits = new_max * 8; } @@ -239,7 +239,7 @@ if ( new_max > old_max ) { - new_max = ( new_max + 7 ) & -8; + new_max = FT_PAD_CEIL( new_max, 8 ); if ( !FT_RENEW_ARRAY( table->masks, old_max, new_max ) ) table->max_masks = new_max; } @@ -318,8 +318,7 @@ PS_Mask mask; - /* allocate new mask, and grow it to "bit_count" bits */ - error = ps_mask_table_alloc( table, memory, &mask ); + error = ps_mask_table_last( table, memory, &mask ); if ( error ) goto Exit; @@ -1012,18 +1011,18 @@ FT_ERROR(( "ps_hints_t2mask: " "called with invalid bitcount %d (instead of %d)\n", bit_count, count1 + count2 )); - + /* simply ignore the operator */ return; } /* set-up new horizontal and vertical hint mask now */ - error = ps_dimension_set_mask_bits( &dim[0], bytes, 0, count1, + error = ps_dimension_set_mask_bits( &dim[0], bytes, count2, count1, end_point, memory ); if ( error ) goto Fail; - error = ps_dimension_set_mask_bits( &dim[1], bytes, count1, count2, + error = ps_dimension_set_mask_bits( &dim[1], bytes, 0, count2, end_point, memory ); if ( error ) goto Fail; @@ -1057,7 +1056,7 @@ FT_ERROR(( "ps_hints_t2counter: " "called with invalid bitcount %d (instead of %d)\n", bit_count, count1 + count2 )); - + /* simply ignore the operator */ return; } diff --git a/reactos/lib/freetype/src/pshinter/pshrec.h b/reactos/lib/freetype/src/pshinter/pshrec.h index 29d3718901f..0159e9cd5d7 100644 --- a/reactos/lib/freetype/src/pshinter/pshrec.h +++ b/reactos/lib/freetype/src/pshinter/pshrec.h @@ -4,7 +4,7 @@ /* */ /* Postscript (Type1/Type2) hints recorder (specification). */ /* */ -/* Copyright 2001, 2002 by */ +/* Copyright 2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/reactos/lib/freetype/src/psnames/psmodule.c b/reactos/lib/freetype/src/psnames/psmodule.c index af364285c09..f6d6ae3285c 100644 --- a/reactos/lib/freetype/src/psnames/psmodule.c +++ b/reactos/lib/freetype/src/psnames/psmodule.c @@ -17,8 +17,8 @@ #include <ft2build.h> -#include FT_INTERNAL_POSTSCRIPT_NAMES_H #include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H #include "psmodule.h" #include "pstables.h" @@ -176,10 +176,10 @@ /* Builds a table that maps Unicode values to glyph indices */ static FT_Error - ps_build_unicode_table( FT_Memory memory, - FT_UInt num_glyphs, - const char** glyph_names, - PS_Unicodes* table ) + ps_unicodes_init( FT_Memory memory, + FT_UInt num_glyphs, + const char** glyph_names, + PS_Unicodes* table ) { FT_Error error; @@ -242,8 +242,8 @@ static FT_UInt - ps_lookup_unicode( PS_Unicodes* table, - FT_ULong unicode ) + ps_unicodes_char_index( PS_Unicodes* table, + FT_ULong unicode ) { PS_UniMap *min, *max, *mid; @@ -273,8 +273,8 @@ static FT_ULong - ps_next_unicode( PS_Unicodes* table, - FT_ULong unicode ) + ps_unicodes_char_next( PS_Unicodes* table, + FT_ULong unicode ) { PS_UniMap *min, *max, *mid; @@ -335,40 +335,52 @@ static - const PSNames_Interface psnames_interface = + const FT_Service_PsCMapsRec pscmaps_interface = { #ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST - (PS_Unicode_Value_Func) ps_unicode_value, - (PS_Build_Unicodes_Func) ps_build_unicode_table, - (PS_Lookup_Unicode_Func) ps_lookup_unicode, + (PS_Unicode_ValueFunc) ps_unicode_value, + (PS_Unicodes_InitFunc) ps_unicodes_init, + (PS_Unicodes_CharIndexFunc)ps_unicodes_char_index, + (PS_Unicodes_CharNextFunc) ps_unicodes_char_next, #else 0, 0, 0, + 0, #endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ - (PS_Macintosh_Name_Func) ps_get_macintosh_name, - (PS_Adobe_Std_Strings_Func) ps_get_standard_strings, + (PS_Macintosh_Name_Func) ps_get_macintosh_name, + (PS_Adobe_Std_Strings_Func)ps_get_standard_strings, t1_standard_encoding, - t1_expert_encoding, - -#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST - (PS_Next_Unicode_Func) ps_next_unicode -#else - 0 -#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ - + t1_expert_encoding }; + static const FT_ServiceDescRec pscmaps_services[] = + { + { FT_SERVICE_ID_POSTSCRIPT_CMAPS, &pscmaps_interface }, + { NULL, NULL } + }; + + + static FT_Pointer + psnames_get_service( FT_Module module, + const char* service_id ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( pscmaps_services, service_id ); + } + #endif /* !FT_CONFIG_OPTION_NO_POSTSCRIPT_NAMES */ + FT_CALLBACK_TABLE_DEF const FT_Module_Class psnames_module_class = { @@ -381,13 +393,15 @@ #ifdef FT_CONFIG_OPTION_NO_POSTSCRIPT_NAMES 0, -#else - (void*)&psnames_interface, /* module specific interface */ -#endif - (FT_Module_Constructor)0, (FT_Module_Destructor) 0, (FT_Module_Requester) 0 +#else + (void*)&pscmaps_interface, /* module specific interface */ + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) psnames_get_service +#endif }; diff --git a/reactos/lib/freetype/src/raster/ftrend1.c b/reactos/lib/freetype/src/raster/ftrend1.c index b6c0f028249..a17ef9b6138 100644 --- a/reactos/lib/freetype/src/raster/ftrend1.c +++ b/reactos/lib/freetype/src/raster/ftrend1.c @@ -140,10 +140,10 @@ /* compute the control box, and grid fit it */ FT_Outline_Get_CBox( outline, &cbox ); - cbox.xMin &= -64; - cbox.yMin &= -64; - cbox.xMax = ( cbox.xMax + 63 ) & -64; - cbox.yMax = ( cbox.yMax + 63 ) & -64; + cbox.xMin = FT_PIX_FLOOR( cbox.xMin ); + cbox.yMin = FT_PIX_FLOOR( cbox.yMin ); + cbox.xMax = FT_PIX_CEIL( cbox.xMax ); + cbox.yMax = FT_PIX_CEIL( cbox.yMax ); width = (FT_UInt)( ( cbox.xMax - cbox.xMin ) >> 6 ); height = (FT_UInt)( ( cbox.yMax - cbox.yMin ) >> 6 ); @@ -161,7 +161,7 @@ if ( !( mode & FT_RENDER_MODE_MONO ) ) { /* we pad to 32 bits, only for backwards compatibility with FT 1.x */ - pitch = ( width + 3 ) & -4; + pitch = FT_PAD_CEIL( width, 4 ); bitmap->pixel_mode = FT_PIXEL_MODE_GRAY; bitmap->num_grays = 256; } @@ -193,9 +193,9 @@ /* render outline into the bitmap */ error = render->raster_render( render->raster, ¶ms ); - + FT_Outline_Translate( outline, cbox.xMin, cbox.yMin ); - + if ( error ) goto Exit; diff --git a/reactos/lib/freetype/src/sfnt/Jamfile b/reactos/lib/freetype/src/sfnt/Jamfile index adddfb6fd24..257b3442cb7 100644 --- a/reactos/lib/freetype/src/sfnt/Jamfile +++ b/reactos/lib/freetype/src/sfnt/Jamfile @@ -1,4 +1,4 @@ -# FreeType 2 src/sfnt Jamfile (c) 2001, 2002 David Turner +# FreeType 2 src/sfnt Jamfile (c) 2001, 2002, 2004 David Turner # SubDir FT2_TOP $(FT2_SRC_DIR) sfnt ; @@ -8,7 +8,7 @@ SubDir FT2_TOP $(FT2_SRC_DIR) sfnt ; if $(FT2_MULTI) { - _sources = sfobjs sfdriver ttcmap ttcmap0 ttpost ttload ttsbit ; + _sources = sfobjs sfdriver ttcmap0 ttpost ttload ttsbit ; } else { diff --git a/reactos/lib/freetype/src/sfnt/rules.mk b/reactos/lib/freetype/src/sfnt/rules.mk index 14078974713..f1323854914 100644 --- a/reactos/lib/freetype/src/sfnt/rules.mk +++ b/reactos/lib/freetype/src/sfnt/rules.mk @@ -26,7 +26,6 @@ SFNT_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(SFNT_DIR)) # SFNT driver sources (i.e., C files) # SFNT_DRV_SRC := $(SFNT_DIR)/ttload.c \ - $(SFNT_DIR)/ttcmap.c \ $(SFNT_DIR)/ttcmap0.c \ $(SFNT_DIR)/ttsbit.c \ $(SFNT_DIR)/ttpost.c \ diff --git a/reactos/lib/freetype/src/sfnt/sfdriver.c b/reactos/lib/freetype/src/sfnt/sfdriver.c index ea504bdd7bd..7da53d2f153 100644 --- a/reactos/lib/freetype/src/sfnt/sfdriver.c +++ b/reactos/lib/freetype/src/sfnt/sfdriver.c @@ -4,7 +4,7 @@ /* */ /* High-level SFNT driver interface (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -22,9 +22,10 @@ #include "sfdriver.h" #include "ttload.h" -#include "ttcmap.h" #include "sfobjs.h" +#include "sferrors.h" + #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS #include "ttsbit.h" #endif @@ -33,6 +34,18 @@ #include "ttpost.h" #endif +#include "ttcmap0.h" + +#include FT_SERVICE_GLYPH_DICT_H +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_SFNT_H +#include FT_SERVICE_TT_CMAP_H + + + /* + * SFNT TABLE SERVICE + * + */ static void* get_sfnt_table( TT_Face face, @@ -79,11 +92,22 @@ } + static const FT_Service_SFNT_TableRec sfnt_service_sfnt_table = + { + (FT_SFNT_TableLoadFunc)tt_face_load_any, + (FT_SFNT_TableGetFunc) get_sfnt_table + }; + + #ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + /* + * GLYPH DICT SERVICE + * + */ static FT_Error - get_sfnt_glyph_name( TT_Face face, + sfnt_get_glyph_name( TT_Face face, FT_UInt glyph_index, FT_Pointer buffer, FT_UInt buffer_max ) @@ -109,16 +133,30 @@ } + static const FT_Service_GlyphDictRec sfnt_service_glyph_dict = + { + (FT_GlyphDict_GetNameFunc) sfnt_get_glyph_name, + (FT_GlyphDict_NameIndexFunc)NULL + }; + +#endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + + /* + * POSTSCRIPT NAME SERVICE + * + */ + static const char* - get_sfnt_postscript_name( TT_Face face ) + sfnt_get_ps_name( TT_Face face ) { FT_Int n, found_win, found_apple; const char* result = NULL; /* shouldn't happen, but just in case to avoid memory leaks */ - if ( face->root.internal->postscript_name ) - return face->root.internal->postscript_name; + if ( face->postscript_name ) + return face->postscript_name; /* scan the name table to see whether we have a Postscript name here, */ /* either in Macintosh or Windows platform encodings */ @@ -215,12 +253,42 @@ } Exit: - face->root.internal->postscript_name = result; + face->postscript_name = result; return result; } + static const FT_Service_PsFontNameRec sfnt_service_ps_name = + { + (FT_PsName_GetFunc)sfnt_get_ps_name + }; -#endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + /* + * TT CMAP INFO + * + */ + static const FT_Service_TTCMapsRec tt_service_get_cmap_info = + { + (TT_CMap_Info_GetFunc)tt_get_cmap_info + }; + + + /* + * SERVICE LIST + * + */ + + static const FT_ServiceDescRec sfnt_services[] = + { + { FT_SERVICE_ID_SFNT_TABLE, &sfnt_service_sfnt_table }, + { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &sfnt_service_ps_name }, +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + { FT_SERVICE_ID_GLYPH_DICT, &sfnt_service_glyph_dict }, +#endif + { FT_SERVICE_ID_TT_CMAP, &tt_service_get_cmap_info }, + + { NULL, NULL } + }; FT_CALLBACK_DEF( FT_Module_Interface ) @@ -235,15 +303,7 @@ if ( ft_strcmp( module_interface, "load_sfnt" ) == 0 ) return (FT_Module_Interface)tt_face_load_any; -#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES - if ( ft_strcmp( module_interface, "glyph_name" ) == 0 ) - return (FT_Module_Interface)get_sfnt_glyph_name; -#endif - - if ( ft_strcmp( module_interface, "postscript_name" ) == 0 ) - return (FT_Module_Interface)get_sfnt_postscript_name; - - return 0; + return ft_service_list_lookup( sfnt_services, module_interface ); } @@ -283,9 +343,11 @@ /* see `ttload.h' */ tt_face_load_bitmap_header, - /* see `ttsbit.h' */ + /* see `ttsbit.h' and `sfnt.h' */ tt_face_set_sbit_strike, tt_face_load_sbit_strikes, + tt_find_sbit_image, + tt_load_sbit_metrics, tt_face_load_sbit_image, tt_face_free_sbit_strikes, @@ -294,6 +356,8 @@ 0, 0, 0, + 0, + 0, 0, 0, @@ -312,9 +376,6 @@ #endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ - /* see `ttcmap.h' */ - tt_face_load_charmap, - tt_face_free_charmap, }; diff --git a/reactos/lib/freetype/src/sfnt/sfnt.c b/reactos/lib/freetype/src/sfnt/sfnt.c index 6e0757aa856..90c1bee911e 100644 --- a/reactos/lib/freetype/src/sfnt/sfnt.c +++ b/reactos/lib/freetype/src/sfnt/sfnt.c @@ -4,7 +4,7 @@ /* */ /* Single object library component. */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 1996-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -20,7 +20,6 @@ #include <ft2build.h> #include "ttload.c" -#include "ttcmap.c" #include "ttcmap0.c" #include "sfobjs.c" #include "sfdriver.c" diff --git a/reactos/lib/freetype/src/sfnt/sfobjs.c b/reactos/lib/freetype/src/sfnt/sfobjs.c index 33a71ae3f9d..cb304fdc182 100644 --- a/reactos/lib/freetype/src/sfnt/sfobjs.c +++ b/reactos/lib/freetype/src/sfnt/sfobjs.c @@ -21,10 +21,9 @@ #include "ttload.h" #include "ttcmap0.h" #include FT_INTERNAL_SFNT_H -#include FT_INTERNAL_POSTSCRIPT_NAMES_H #include FT_TRUETYPE_IDS_H #include FT_TRUETYPE_TAGS_H - +#include FT_SERVICE_POSTSCRIPT_CMAPS_H #include "sferrors.h" @@ -365,11 +364,7 @@ face->goto_table = sfnt->goto_table; } - if ( !face->psnames ) - { - face->psnames = (PSNames_Service) - FT_Get_Module_Interface( library, "psnames" ); - } + FT_FACE_FIND_GLOBAL_SERVICE( face, face->psnames, POSTSCRIPT_CMAPS ); /* check that we have a valid TrueType file */ error = sfnt->load_sfnt_header( face, stream, face_index, &sfnt_header ); @@ -405,7 +400,7 @@ FT_Int num_params, FT_Parameter* params ) { - FT_Error error; + FT_Error error, psnames_error; FT_Bool has_outline; FT_Bool is_apple_sbit; @@ -467,7 +462,7 @@ /* the following tables are optional in PCL fonts -- */ /* don't check for errors */ (void)LOAD_( names ); - (void)LOAD_( psnames ); + psnames_error = LOAD_( psnames ); /* do not load the metrics headers and tables if this is an Apple */ /* sbit font file */ @@ -534,9 +529,9 @@ FT_FACE_FLAG_HORIZONTAL; /* horizontal data */ #ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES - /* might need more polish to detect the presence of a Postscript */ - /* name table in the font */ - flags |= FT_FACE_FLAG_GLYPH_NAMES; + if ( psnames_error == SFNT_Err_Ok && + face->postscript.FormatType != 0x00030000L ) + flags |= FT_FACE_FLAG_GLYPH_NAMES; #endif /* fixed width font? */ @@ -643,14 +638,14 @@ FT_Bitmap_Size* bsize = root->available_sizes + n; TT_SBit_Strike strike = face->sbit_strikes + n; FT_UShort fupem = face->header.Units_Per_EM; - FT_Short height = face->horizontal.Ascender - - face->horizontal.Descender + - face->horizontal.Line_Gap; + FT_Short height = (FT_Short)( face->horizontal.Ascender - + face->horizontal.Descender + + face->horizontal.Line_Gap ); FT_Short avg = face->os2.xAvgCharWidth; /* assume 72dpi */ - bsize->height = + bsize->height = (FT_Short)( ( height * strike->y_ppem + fupem/2 ) / fupem ); bsize->width = (FT_Short)( ( avg * strike->y_ppem + fupem/2 ) / fupem ); diff --git a/reactos/lib/freetype/src/sfnt/ttcmap.c b/reactos/lib/freetype/src/sfnt/ttcmap.c deleted file mode 100644 index f6aabfeec23..00000000000 --- a/reactos/lib/freetype/src/sfnt/ttcmap.c +++ /dev/null @@ -1,1110 +0,0 @@ -/***************************************************************************/ -/* */ -/* ttcmap.c */ -/* */ -/* TrueType character mapping table (cmap) support (body). */ -/* */ -/* Copyright 1996-2001, 2002 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ -/* */ -/* This file is part of the FreeType project, and may only be used, */ -/* modified, and distributed under the terms of the FreeType project */ -/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ -/* this file you indicate that you have read the license and */ -/* understand and accept it fully. */ -/* */ -/***************************************************************************/ - - -#include <ft2build.h> -#include FT_INTERNAL_DEBUG_H -#include "ttload.h" -#include "ttcmap.h" - -#include "sferrors.h" - - - /*************************************************************************/ - /* */ - /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ - /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ - /* messages during execution. */ - /* */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttcmap - - - FT_CALLBACK_DEF( FT_UInt ) - code_to_index0( TT_CMapTable charmap, - FT_ULong char_code ); - - FT_CALLBACK_DEF( FT_ULong ) - code_to_next0( TT_CMapTable charmap, - FT_ULong char_code ); - - FT_CALLBACK_DEF( FT_UInt ) - code_to_index2( TT_CMapTable charmap, - FT_ULong char_code ); - - FT_CALLBACK_DEF( FT_ULong ) - code_to_next2( TT_CMapTable charmap, - FT_ULong char_code ); - - FT_CALLBACK_DEF( FT_UInt ) - code_to_index4( TT_CMapTable charmap, - FT_ULong char_code ); - - FT_CALLBACK_DEF( FT_ULong ) - code_to_next4( TT_CMapTable charmap, - FT_ULong char_code ); - - FT_CALLBACK_DEF( FT_UInt ) - code_to_index6( TT_CMapTable charmap, - FT_ULong char_code ); - - FT_CALLBACK_DEF( FT_ULong ) - code_to_next6( TT_CMapTable charmap, - FT_ULong char_code ); - - FT_CALLBACK_DEF( FT_UInt ) - code_to_index8_12( TT_CMapTable charmap, - FT_ULong char_code ); - - FT_CALLBACK_DEF( FT_ULong ) - code_to_next8_12( TT_CMapTable charmap, - FT_ULong char_code ); - - FT_CALLBACK_DEF( FT_UInt ) - code_to_index10( TT_CMapTable charmap, - FT_ULong char_code ); - - FT_CALLBACK_DEF( FT_ULong ) - code_to_next10( TT_CMapTable charmap, - FT_ULong char_code ); - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_load_charmap */ - /* */ - /* <Description> */ - /* Loads a given TrueType character map into memory. */ - /* */ - /* <Input> */ - /* face :: A handle to the parent face object. */ - /* */ - /* stream :: A handle to the current stream object. */ - /* */ - /* <InOut> */ - /* table :: A pointer to a cmap object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - /* <Note> */ - /* The function assumes that the stream is already in use (i.e., */ - /* opened). In case of error, all partially allocated tables are */ - /* released. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_load_charmap( TT_Face face, - TT_CMapTable cmap, - FT_Stream stream ) - { - FT_Error error; - FT_Memory memory; - FT_UShort num_SH, num_Seg, i; - FT_ULong j, n; - - FT_UShort u, l; - - TT_CMap0 cmap0; - TT_CMap2 cmap2; - TT_CMap4 cmap4; - TT_CMap6 cmap6; - TT_CMap8_12 cmap8_12; - TT_CMap10 cmap10; - - TT_CMap2SubHeader cmap2sub; - TT_CMap4Segment segments; - TT_CMapGroup groups; - - - if ( cmap->loaded ) - return SFNT_Err_Ok; - - memory = stream->memory; - - if ( FT_STREAM_SEEK( cmap->offset ) ) - return error; - - switch ( cmap->format ) - { - case 0: - cmap0 = &cmap->c.cmap0; - - if ( FT_READ_USHORT( cmap0->language ) || - FT_ALLOC( cmap0->glyphIdArray, 256L ) || - FT_STREAM_READ( cmap0->glyphIdArray, 256L ) ) - goto Fail; - - cmap->get_index = code_to_index0; - cmap->get_next_char = code_to_next0; - break; - - case 2: - num_SH = 0; - cmap2 = &cmap->c.cmap2; - - /* allocate subheader keys */ - - if ( FT_NEW_ARRAY( cmap2->subHeaderKeys, 256 ) || - FT_FRAME_ENTER( 2L + 512L ) ) - goto Fail; - - cmap2->language = FT_GET_USHORT(); - - for ( i = 0; i < 256; i++ ) - { - u = (FT_UShort)( FT_GET_USHORT() / 8 ); - cmap2->subHeaderKeys[i] = u; - - if ( num_SH < u ) - num_SH = u; - } - - FT_FRAME_EXIT(); - - /* load subheaders */ - - cmap2->numGlyphId = l = (FT_UShort)( - ( ( cmap->length - 2L * ( 256 + 3 ) - num_SH * 8L ) & 0xFFFFU ) / 2 ); - - if ( FT_NEW_ARRAY( cmap2->subHeaders, num_SH + 1 ) || - FT_FRAME_ENTER( ( num_SH + 1 ) * 8L ) ) - { - FT_FREE( cmap2->subHeaderKeys ); - goto Fail; - } - - cmap2sub = cmap2->subHeaders; - - for ( i = 0; i <= num_SH; i++ ) - { - cmap2sub->firstCode = FT_GET_USHORT(); - cmap2sub->entryCount = FT_GET_USHORT(); - cmap2sub->idDelta = FT_GET_SHORT(); - /* we apply the location offset immediately */ - cmap2sub->idRangeOffset = (FT_UShort)( - FT_GET_USHORT() - ( num_SH - i ) * 8 - 2 ); - - cmap2sub++; - } - - FT_FRAME_EXIT(); - - /* load glyph IDs */ - - if ( FT_NEW_ARRAY( cmap2->glyphIdArray, l ) || - FT_FRAME_ENTER( l * 2L ) ) - { - FT_FREE( cmap2->subHeaders ); - FT_FREE( cmap2->subHeaderKeys ); - goto Fail; - } - - for ( i = 0; i < l; i++ ) - cmap2->glyphIdArray[i] = FT_GET_USHORT(); - - FT_FRAME_EXIT(); - - cmap->get_index = code_to_index2; - cmap->get_next_char = code_to_next2; - break; - - case 4: - cmap4 = &cmap->c.cmap4; - - /* load header */ - - if ( FT_FRAME_ENTER( 10L ) ) - goto Fail; - - cmap4->language = FT_GET_USHORT(); - cmap4->segCountX2 = FT_GET_USHORT(); - cmap4->searchRange = FT_GET_USHORT(); - cmap4->entrySelector = FT_GET_USHORT(); - cmap4->rangeShift = FT_GET_USHORT(); - - num_Seg = (FT_UShort)( cmap4->segCountX2 / 2 ); - - FT_FRAME_EXIT(); - - /* load segments */ - - if ( FT_NEW_ARRAY( cmap4->segments, num_Seg ) || - FT_FRAME_ENTER( ( num_Seg * 4 + 1 ) * 2L ) ) - goto Fail; - - segments = cmap4->segments; - - for ( i = 0; i < num_Seg; i++ ) - segments[i].endCount = FT_GET_USHORT(); - - (void)FT_GET_USHORT(); - - for ( i = 0; i < num_Seg; i++ ) - segments[i].startCount = FT_GET_USHORT(); - - for ( i = 0; i < num_Seg; i++ ) - segments[i].idDelta = FT_GET_SHORT(); - - for ( i = 0; i < num_Seg; i++ ) - segments[i].idRangeOffset = FT_GET_USHORT(); - - FT_FRAME_EXIT(); - - cmap4->numGlyphId = l = (FT_UShort)( - ( ( cmap->length - ( 16L + 8L * num_Seg ) ) & 0xFFFFU ) / 2 ); - - /* load IDs */ - - if ( FT_NEW_ARRAY( cmap4->glyphIdArray, l ) || - FT_FRAME_ENTER( l * 2L ) ) - { - FT_FREE( cmap4->segments ); - goto Fail; - } - - for ( i = 0; i < l; i++ ) - cmap4->glyphIdArray[i] = FT_GET_USHORT(); - - FT_FRAME_EXIT(); - - cmap4->last_segment = cmap4->segments; - - cmap->get_index = code_to_index4; - cmap->get_next_char = code_to_next4; - break; - - case 6: - cmap6 = &cmap->c.cmap6; - - if ( FT_FRAME_ENTER( 6L ) ) - goto Fail; - - cmap6->language = FT_GET_USHORT(); - cmap6->firstCode = FT_GET_USHORT(); - cmap6->entryCount = FT_GET_USHORT(); - - FT_FRAME_EXIT(); - - l = cmap6->entryCount; - - if ( FT_NEW_ARRAY( cmap6->glyphIdArray, l ) || - FT_FRAME_ENTER( l * 2L ) ) - goto Fail; - - for ( i = 0; i < l; i++ ) - cmap6->glyphIdArray[i] = FT_GET_USHORT(); - - FT_FRAME_EXIT(); - cmap->get_index = code_to_index6; - cmap->get_next_char = code_to_next6; - break; - - case 8: - case 12: - cmap8_12 = &cmap->c.cmap8_12; - - if ( FT_FRAME_ENTER( 8L ) ) - goto Fail; - - cmap->length = FT_GET_ULONG(); - cmap8_12->language = FT_GET_ULONG(); - - FT_FRAME_EXIT(); - - if ( cmap->format == 8 ) - if ( FT_STREAM_SKIP( 8192L ) ) - goto Fail; - - if ( FT_READ_ULONG( cmap8_12->nGroups ) ) - goto Fail; - - n = cmap8_12->nGroups; - - if ( FT_NEW_ARRAY( cmap8_12->groups, n ) || - FT_FRAME_ENTER( n * 3 * 4L ) ) - goto Fail; - - groups = cmap8_12->groups; - - for ( j = 0; j < n; j++ ) - { - groups[j].startCharCode = FT_GET_ULONG(); - groups[j].endCharCode = FT_GET_ULONG(); - groups[j].startGlyphID = FT_GET_ULONG(); - } - - FT_FRAME_EXIT(); - - cmap8_12->last_group = cmap8_12->groups; - - cmap->get_index = code_to_index8_12; - cmap->get_next_char = code_to_next8_12; - break; - - case 10: - cmap10 = &cmap->c.cmap10; - - if ( FT_FRAME_ENTER( 16L ) ) - goto Fail; - - cmap->length = FT_GET_ULONG(); - cmap10->language = FT_GET_ULONG(); - cmap10->startCharCode = FT_GET_ULONG(); - cmap10->numChars = FT_GET_ULONG(); - - FT_FRAME_EXIT(); - - n = cmap10->numChars; - - if ( FT_NEW_ARRAY( cmap10->glyphs, n ) || - FT_FRAME_ENTER( n * 2L ) ) - goto Fail; - - for ( j = 0; j < n; j++ ) - cmap10->glyphs[j] = FT_GET_USHORT(); - - FT_FRAME_EXIT(); - cmap->get_index = code_to_index10; - cmap->get_next_char = code_to_next10; - break; - - default: /* corrupt character mapping table */ - return SFNT_Err_Invalid_CharMap_Format; - - } - - return SFNT_Err_Ok; - - Fail: - tt_face_free_charmap( face, cmap ); - return error; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* tt_face_free_charmap */ - /* */ - /* <Description> */ - /* Destroys a character mapping table. */ - /* */ - /* <Input> */ - /* face :: A handle to the parent face object. */ - /* */ - /* cmap :: A handle to a cmap object. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_face_free_charmap( TT_Face face, - TT_CMapTable cmap ) - { - FT_Memory memory; - - - if ( !cmap ) - return SFNT_Err_Ok; - - memory = face->root.driver->root.memory; - - switch ( cmap->format ) - { - case 0: - FT_FREE( cmap->c.cmap0.glyphIdArray ); - break; - - case 2: - FT_FREE( cmap->c.cmap2.subHeaderKeys ); - FT_FREE( cmap->c.cmap2.subHeaders ); - FT_FREE( cmap->c.cmap2.glyphIdArray ); - break; - - case 4: - FT_FREE( cmap->c.cmap4.segments ); - FT_FREE( cmap->c.cmap4.glyphIdArray ); - cmap->c.cmap4.segCountX2 = 0; - break; - - case 6: - FT_FREE( cmap->c.cmap6.glyphIdArray ); - cmap->c.cmap6.entryCount = 0; - break; - - case 8: - case 12: - FT_FREE( cmap->c.cmap8_12.groups ); - cmap->c.cmap8_12.nGroups = 0; - break; - - case 10: - FT_FREE( cmap->c.cmap10.glyphs ); - cmap->c.cmap10.numChars = 0; - break; - - default: - /* invalid table format, do nothing */ - ; - } - - cmap->loaded = FALSE; - return SFNT_Err_Ok; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* code_to_index0 */ - /* */ - /* <Description> */ - /* Converts the character code into a glyph index. Uses format 0. */ - /* `charCode' must be in the range 0x00-0xFF (otherwise 0 is */ - /* returned). */ - /* */ - /* <Input> */ - /* charCode :: The wanted character code. */ - /* */ - /* cmap0 :: A pointer to a cmap table in format 0. */ - /* */ - /* <Return> */ - /* Glyph index into the glyphs array. 0 if the glyph does not exist. */ - /* */ - FT_CALLBACK_DEF( FT_UInt ) - code_to_index0( TT_CMapTable cmap, - FT_ULong charCode ) - { - TT_CMap0 cmap0 = &cmap->c.cmap0; - - - return ( charCode <= 0xFF ? cmap0->glyphIdArray[charCode] : 0 ); - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* code_to_next0 */ - /* */ - /* <Description> */ - /* Finds the next encoded character after the given one. Uses */ - /* format 0. `charCode' must be in the range 0x00-0xFF (otherwise 0 */ - /* is returned). */ - /* */ - /* <Input> */ - /* charCode :: The wanted character code. */ - /* */ - /* cmap0 :: A pointer to a cmap table in format 0. */ - /* */ - /* <Return> */ - /* Next char code. 0 if no higher one is encoded. */ - /* */ - FT_CALLBACK_DEF( FT_ULong ) - code_to_next0( TT_CMapTable cmap, - FT_ULong charCode ) - { - TT_CMap0 cmap0 = &cmap->c.cmap0; - - - while ( ++charCode <= 0xFF ) - if ( cmap0->glyphIdArray[charCode] ) - return ( charCode ); - return ( 0 ); - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* code_to_index2 */ - /* */ - /* <Description> */ - /* Converts the character code into a glyph index. Uses format 2. */ - /* */ - /* <Input> */ - /* charCode :: The wanted character code. */ - /* */ - /* cmap2 :: A pointer to a cmap table in format 2. */ - /* */ - /* <Return> */ - /* Glyph index into the glyphs array. 0 if the glyph does not exist. */ - /* */ - FT_CALLBACK_DEF( FT_UInt ) - code_to_index2( TT_CMapTable cmap, - FT_ULong charCode ) - { - FT_UInt result, index1, offset; - FT_UInt char_lo; - FT_ULong char_hi; - TT_CMap2SubHeader sh2; - TT_CMap2 cmap2; - - - cmap2 = &cmap->c.cmap2; - result = 0; - char_lo = (FT_UInt)( charCode & 0xFF ); - char_hi = charCode >> 8; - - if ( char_hi == 0 ) - { - /* an 8-bit character code -- we use the subHeader 0 in this case */ - /* to test whether the character code is in the charmap */ - index1 = cmap2->subHeaderKeys[char_lo]; - if ( index1 != 0 ) - return 0; - } - else - { - /* a 16-bit character code */ - index1 = cmap2->subHeaderKeys[char_hi & 0xFF]; - if ( index1 == 0 ) - return 0; - } - - sh2 = cmap2->subHeaders + index1; - char_lo -= sh2->firstCode; - - if ( char_lo < (FT_UInt)sh2->entryCount ) - { - offset = sh2->idRangeOffset / 2 + char_lo; - if ( offset < (FT_UInt)cmap2->numGlyphId ) - { - result = cmap2->glyphIdArray[offset]; - if ( result ) - result = ( result + sh2->idDelta ) & 0xFFFFU; - } - } - - return result; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* code_to_next2 */ - /* */ - /* <Description> */ - /* Find the next encoded character. Uses format 2. */ - /* */ - /* <Input> */ - /* charCode :: The wanted character code. */ - /* */ - /* cmap2 :: A pointer to a cmap table in format 2. */ - /* */ - /* <Return> */ - /* Next encoded character. 0 if none exists. */ - /* */ - FT_CALLBACK_DEF( FT_ULong ) - code_to_next2( TT_CMapTable cmap, - FT_ULong charCode ) - { - FT_UInt index1, offset; - FT_UInt char_lo; - FT_ULong char_hi; - TT_CMap2SubHeader sh2; - TT_CMap2 cmap2; - - - cmap2 = &cmap->c.cmap2; - charCode++; - - /* - * This is relatively simplistic -- look for a subHeader containing - * glyphs and then walk to the first glyph in that subHeader. - */ - while ( charCode < 0x10000L ) - { - char_lo = (FT_UInt)( charCode & 0xFF ); - char_hi = charCode >> 8; - - if ( char_hi == 0 ) - { - /* an 8-bit character code -- we use the subHeader 0 in this case */ - /* to test whether the character code is in the charmap */ - index1 = cmap2->subHeaderKeys[char_lo]; - if ( index1 != 0 ) - { - charCode++; - continue; - } - } - else - { - /* a 16-bit character code */ - index1 = cmap2->subHeaderKeys[char_hi & 0xFF]; - if ( index1 == 0 ) - { - charCode = ( char_hi + 1 ) << 8; - continue; - } - } - - sh2 = cmap2->subHeaders + index1; - char_lo -= sh2->firstCode; - - if ( char_lo > (FT_UInt)sh2->entryCount ) - { - charCode = ( char_hi + 1 ) << 8; - continue; - } - - offset = sh2->idRangeOffset / 2 + char_lo; - if ( offset >= (FT_UInt)cmap2->numGlyphId || - cmap2->glyphIdArray[offset] == 0 ) - { - charCode++; - continue; - } - - return charCode; - } - return 0; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* code_to_index4 */ - /* */ - /* <Description> */ - /* Converts the character code into a glyph index. Uses format 4. */ - /* */ - /* <Input> */ - /* charCode :: The wanted character code. */ - /* */ - /* cmap4 :: A pointer to a cmap table in format 4. */ - /* */ - /* <Return> */ - /* Glyph index into the glyphs array. 0 if the glyph does not exist. */ - /* */ - FT_CALLBACK_DEF( FT_UInt ) - code_to_index4( TT_CMapTable cmap, - FT_ULong charCode ) - { - FT_UInt result, index1, segCount; - TT_CMap4 cmap4; - TT_CMap4SegmentRec *seg4, *limit; - - - cmap4 = &cmap->c.cmap4; - result = 0; - segCount = cmap4->segCountX2 / 2; - limit = cmap4->segments + segCount; - - /* first, check against the last used segment */ - - seg4 = cmap4->last_segment; - - /* the following is equivalent to performing two tests, as in */ - /* */ - /* if ( charCode >= seg4->startCount && charCode <= seg4->endCount ) */ - /* */ - /* This is a bit strange, but it is faster, and the idea behind the */ - /* cache is to significantly speed up charcode to glyph index */ - /* conversion. */ - - if ( (FT_ULong)( charCode - seg4->startCount ) < - (FT_ULong)( seg4->endCount - seg4->startCount ) ) - goto Found1; - - for ( seg4 = cmap4->segments; seg4 < limit; seg4++ ) - { - /* the ranges are sorted in increasing order. If we are out of */ - /* the range here, the char code isn't in the charmap, so exit. */ - - if ( charCode > (FT_UInt)seg4->endCount ) - continue; - - if ( charCode >= (FT_UInt)seg4->startCount ) - goto Found; - } - return 0; - - Found: - cmap4->last_segment = seg4; - - Found1: - /* if the idRangeOffset is 0, we can compute the glyph index */ - /* directly */ - - if ( seg4->idRangeOffset == 0 ) - result = (FT_UInt)( charCode + seg4->idDelta ) & 0xFFFFU; - else - { - /* otherwise, we must use the glyphIdArray to do it */ - index1 = (FT_UInt)( seg4->idRangeOffset / 2 - + ( charCode - seg4->startCount ) - + ( seg4 - cmap4->segments ) - - segCount ); - - if ( index1 < (FT_UInt)cmap4->numGlyphId && - cmap4->glyphIdArray[index1] != 0 ) - result = ( cmap4->glyphIdArray[index1] + seg4->idDelta ) & 0xFFFFU; - } - - return result; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* code_to_next4 */ - /* */ - /* <Description> */ - /* Find the next encoded character. Uses format 4. */ - /* */ - /* <Input> */ - /* charCode :: The wanted character code. */ - /* */ - /* cmap :: A pointer to a cmap table in format 4. */ - /* */ - /* <Return> */ - /* Next encoded character. 0 if none exists. */ - /* */ - FT_CALLBACK_DEF( FT_ULong ) - code_to_next4( TT_CMapTable cmap, - FT_ULong charCode ) - { - FT_UInt index1, segCount; - TT_CMap4 cmap4; - TT_CMap4SegmentRec *seg4, *limit; - - - cmap4 = &cmap->c.cmap4; - segCount = cmap4->segCountX2 / 2; - limit = cmap4->segments + segCount; - - charCode++; - - for ( seg4 = cmap4->segments; seg4 < limit; seg4++ ) - { - /* The ranges are sorted in increasing order. If we are out of */ - /* the range here, the char code isn't in the charmap, so exit. */ - - if ( charCode <= (FT_UInt)seg4->endCount ) - goto Found; - } - return 0; - - Found: - if ( charCode < (FT_ULong) seg4->startCount ) - charCode = seg4->startCount; - - /* if the idRangeOffset is 0, all chars in the map exist */ - - if ( seg4->idRangeOffset == 0 ) - return ( charCode ); - - while ( charCode <= (FT_UInt) seg4->endCount ) - { - /* otherwise, we must use the glyphIdArray to do it */ - index1 = (FT_UInt)( seg4->idRangeOffset / 2 - + ( charCode - seg4->startCount ) - + ( seg4 - cmap4->segments ) - - segCount ); - - if ( index1 < (FT_UInt)cmap4->numGlyphId && - cmap4->glyphIdArray[index1] != 0 ) - return ( charCode ); - charCode++; - } - - return 0; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* code_to_index6 */ - /* */ - /* <Description> */ - /* Converts the character code into a glyph index. Uses format 6. */ - /* */ - /* <Input> */ - /* charCode :: The wanted character code. */ - /* */ - /* cmap6 :: A pointer to a cmap table in format 6. */ - /* */ - /* <Return> */ - /* Glyph index into the glyphs array. 0 if the glyph does not exist. */ - /* */ - FT_CALLBACK_DEF( FT_UInt ) - code_to_index6( TT_CMapTable cmap, - FT_ULong charCode ) - { - TT_CMap6 cmap6; - FT_UInt result = 0; - - - cmap6 = &cmap->c.cmap6; - charCode -= cmap6->firstCode; - - if ( charCode < (FT_UInt)cmap6->entryCount ) - result = cmap6->glyphIdArray[charCode]; - - return result; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* code_to_next6 */ - /* */ - /* <Description> */ - /* Find the next encoded character. Uses format 6. */ - /* */ - /* <Input> */ - /* charCode :: The wanted character code. */ - /* */ - /* cmap :: A pointer to a cmap table in format 6. */ - /* */ - /* <Return> */ - /* Next encoded character. 0 if none exists. */ - /* */ - FT_CALLBACK_DEF( FT_ULong ) - code_to_next6( TT_CMapTable cmap, - FT_ULong charCode ) - { - TT_CMap6 cmap6; - - - charCode++; - - cmap6 = &cmap->c.cmap6; - - if ( charCode < (FT_ULong) cmap6->firstCode ) - charCode = cmap6->firstCode; - - charCode -= cmap6->firstCode; - - while ( charCode < (FT_UInt)cmap6->entryCount ) - { - if ( cmap6->glyphIdArray[charCode] != 0 ) - return charCode + cmap6->firstCode; - charCode++; - } - - return 0; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* code_to_index8_12 */ - /* */ - /* <Description> */ - /* Converts the (possibly 32bit) character code into a glyph index. */ - /* Uses format 8 or 12. */ - /* */ - /* <Input> */ - /* charCode :: The wanted character code. */ - /* */ - /* cmap8_12 :: A pointer to a cmap table in format 8 or 12. */ - /* */ - /* <Return> */ - /* Glyph index into the glyphs array. 0 if the glyph does not exist. */ - /* */ - FT_CALLBACK_DEF( FT_UInt ) - code_to_index8_12( TT_CMapTable cmap, - FT_ULong charCode ) - { - TT_CMap8_12 cmap8_12; - TT_CMapGroupRec *group, *limit; - - - cmap8_12 = &cmap->c.cmap8_12; - limit = cmap8_12->groups + cmap8_12->nGroups; - - /* first, check against the last used group */ - - group = cmap8_12->last_group; - - /* the following is equivalent to performing two tests, as in */ - /* */ - /* if ( charCode >= group->startCharCode && */ - /* charCode <= group->endCharCode ) */ - /* */ - /* This is a bit strange, but it is faster, and the idea behind the */ - /* cache is to significantly speed up charcode to glyph index */ - /* conversion. */ - - if ( (FT_ULong)( charCode - group->startCharCode ) < - (FT_ULong)( group->endCharCode - group->startCharCode ) ) - goto Found1; - - for ( group = cmap8_12->groups; group < limit; group++ ) - { - /* the ranges are sorted in increasing order. If we are out of */ - /* the range here, the char code isn't in the charmap, so exit. */ - - if ( charCode > group->endCharCode ) - continue; - - if ( charCode >= group->startCharCode ) - goto Found; - } - return 0; - - Found: - cmap8_12->last_group = group; - - Found1: - return (FT_UInt)( group->startGlyphID + - ( charCode - group->startCharCode ) ); - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* code_to_next8_12 */ - /* */ - /* <Description> */ - /* Find the next encoded character. Uses format 8 or 12. */ - /* */ - /* <Input> */ - /* charCode :: The wanted character code. */ - /* */ - /* cmap :: A pointer to a cmap table in format 8 or 12. */ - /* */ - /* <Return> */ - /* Next encoded character. 0 if none exists. */ - /* */ - FT_CALLBACK_DEF( FT_ULong ) - code_to_next8_12( TT_CMapTable cmap, - FT_ULong charCode ) - { - TT_CMap8_12 cmap8_12; - TT_CMapGroupRec *group, *limit; - - - charCode++; - cmap8_12 = &cmap->c.cmap8_12; - limit = cmap8_12->groups + cmap8_12->nGroups; - - for ( group = cmap8_12->groups; group < limit; group++ ) - { - /* the ranges are sorted in increasing order. If we are out of */ - /* the range here, the char code isn't in the charmap, so exit. */ - - if ( charCode <= group->endCharCode ) - goto Found; - } - return 0; - - Found: - if ( charCode < group->startCharCode ) - charCode = group->startCharCode; - - return charCode; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* code_to_index10 */ - /* */ - /* <Description> */ - /* Converts the (possibly 32bit) character code into a glyph index. */ - /* Uses format 10. */ - /* */ - /* <Input> */ - /* charCode :: The wanted character code. */ - /* */ - /* cmap10 :: A pointer to a cmap table in format 10. */ - /* */ - /* <Return> */ - /* Glyph index into the glyphs array. 0 if the glyph does not exist. */ - /* */ - FT_CALLBACK_DEF( FT_UInt ) - code_to_index10( TT_CMapTable cmap, - FT_ULong charCode ) - { - TT_CMap10 cmap10; - FT_UInt result = 0; - - - cmap10 = &cmap->c.cmap10; - charCode -= cmap10->startCharCode; - - /* the overflow trick for comparison works here also since the number */ - /* of glyphs (even if numChars is specified as ULong in the specs) in */ - /* an OpenType font is limited to 64k */ - - if ( charCode < cmap10->numChars ) - result = cmap10->glyphs[charCode]; - - return result; - } - - - /*************************************************************************/ - /* */ - /* <Function> */ - /* code_to_next10 */ - /* */ - /* <Description> */ - /* Find the next encoded character. Uses format 10. */ - /* */ - /* <Input> */ - /* charCode :: The wanted character code. */ - /* */ - /* cmap :: A pointer to a cmap table in format 10. */ - /* */ - /* <Return> */ - /* Next encoded character. 0 if none exists. */ - /* */ - FT_CALLBACK_DEF( FT_ULong ) - code_to_next10( TT_CMapTable cmap, - FT_ULong charCode ) - { - TT_CMap10 cmap10; - - - charCode++; - cmap10 = &cmap->c.cmap10; - - if ( charCode < cmap10->startCharCode ) - charCode = cmap10->startCharCode; - - charCode -= cmap10->startCharCode; - - /* the overflow trick for comparison works here also since the number */ - /* of glyphs (even if numChars is specified as ULong in the specs) in */ - /* an OpenType font is limited to 64k */ - - while ( charCode < cmap10->numChars ) - { - if ( cmap10->glyphs[charCode] ) - return ( charCode + cmap10->startCharCode ); - charCode++; - } - - return 0; - } - - -/* END */ diff --git a/reactos/lib/freetype/src/sfnt/ttcmap0.c b/reactos/lib/freetype/src/sfnt/ttcmap0.c index 4c9dadfbb42..dd1c76aaa7b 100644 --- a/reactos/lib/freetype/src/sfnt/ttcmap0.c +++ b/reactos/lib/freetype/src/sfnt/ttcmap0.c @@ -144,6 +144,19 @@ } + FT_CALLBACK_DEF( FT_Error ) + tt_cmap0_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 4; + + + cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); + + return FT_Err_Ok; + } + + FT_CALLBACK_TABLE_DEF const TT_CMap_ClassRec tt_cmap0_class_rec = { @@ -156,7 +169,8 @@ (FT_CMap_CharNextFunc) tt_cmap0_char_next }, 0, - (TT_CMap_ValidateFunc) tt_cmap0_validate + (TT_CMap_ValidateFunc) tt_cmap0_validate, + (TT_CMap_Info_GetFunc) tt_cmap0_get_info }; #endif /* TT_CONFIG_CMAP_FORMAT_0 */ @@ -378,10 +392,13 @@ else { /* a 16-bit character code */ - p += char_hi * 2; /* jump to key entry */ - sub = subs + ( TT_PEEK_USHORT( p ) & -8 ); /* jump to sub-header */ - /* check that the hi byte isn't a valid one-byte value */ + /* jump to key entry */ + p += char_hi * 2; + /* jump to sub-header */ + sub = subs + ( FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 8 ) ); + + /* check that the high byte isn't a valid one-byte value */ if ( sub == subs ) goto Exit; } @@ -467,7 +484,7 @@ pos = (FT_UInt)( char_lo - start ); p += offset + pos * 2; - charcode = ( charcode & -256 ) + char_lo; + charcode = FT_PAD_FLOOR( charcode, 256 ) + char_lo; for ( ; pos < count; pos++, charcode++ ) { @@ -487,7 +504,7 @@ /* jump to next sub-header, i.e. higher byte value */ Next_SubHeader: - charcode = ( charcode & -256 ) + 256; + charcode = FT_PAD_FLOOR( charcode, 256 ) + 256; } Exit: @@ -497,6 +514,19 @@ } + FT_CALLBACK_DEF( FT_Error ) + tt_cmap2_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 4; + + + cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); + + return FT_Err_Ok; + } + + FT_CALLBACK_TABLE_DEF const TT_CMap_ClassRec tt_cmap2_class_rec = { @@ -509,7 +539,8 @@ (FT_CMap_CharNextFunc) tt_cmap2_char_next }, 2, - (TT_CMap_ValidateFunc) tt_cmap2_validate + (TT_CMap_ValidateFunc) tt_cmap2_validate, + (TT_CMap_Info_GetFunc) tt_cmap2_get_info }; #endif /* TT_CONFIG_CMAP_FORMAT_2 */ @@ -767,7 +798,7 @@ p = table + 6; - num_segs2 = TT_PEEK_USHORT( p ) & -2; /* be paranoid! */ + num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 ); /* be paranoid! */ #if 1 /* Some fonts have more than 170 segments in their charmaps! */ @@ -890,7 +921,7 @@ code = (FT_UInt)char_code + 1; p = table + 6; - num_segs2 = TT_PEEK_USHORT(p) & -2; /* ensure even-ness */ + num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT(p), 2 ); /* ensure even-ness */ #if 1 @@ -1058,6 +1089,19 @@ } + FT_CALLBACK_DEF( FT_Error ) + tt_cmap4_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 4; + + + cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); + + return FT_Err_Ok; + } + + FT_CALLBACK_TABLE_DEF const TT_CMap_ClassRec tt_cmap4_class_rec = { @@ -1070,7 +1114,8 @@ (FT_CMap_CharNextFunc) tt_cmap4_char_next }, 4, - (TT_CMap_ValidateFunc) tt_cmap4_validate + (TT_CMap_ValidateFunc) tt_cmap4_validate, + (TT_CMap_Info_GetFunc) tt_cmap4_get_info }; #endif /* TT_CONFIG_CMAP_FORMAT_4 */ @@ -1202,6 +1247,19 @@ } + FT_CALLBACK_DEF( FT_Error ) + tt_cmap6_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 4; + + + cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); + + return FT_Err_Ok; + } + + FT_CALLBACK_TABLE_DEF const TT_CMap_ClassRec tt_cmap6_class_rec = { @@ -1214,7 +1272,8 @@ (FT_CMap_CharNextFunc) tt_cmap6_char_next }, 6, - (TT_CMap_ValidateFunc) tt_cmap6_validate + (TT_CMap_ValidateFunc) tt_cmap6_validate, + (TT_CMap_Info_GetFunc) tt_cmap6_get_info }; #endif /* TT_CONFIG_CMAP_FORMAT_6 */ @@ -1439,6 +1498,18 @@ } + FT_CALLBACK_DEF( FT_Error ) + tt_cmap8_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 8; + + + cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); + return FT_Err_Ok; + } + + FT_CALLBACK_TABLE_DEF const TT_CMap_ClassRec tt_cmap8_class_rec = { @@ -1451,7 +1522,8 @@ (FT_CMap_CharNextFunc) tt_cmap8_char_next }, 8, - (TT_CMap_ValidateFunc) tt_cmap8_validate + (TT_CMap_ValidateFunc) tt_cmap8_validate, + (TT_CMap_Info_GetFunc) tt_cmap8_get_info }; #endif /* TT_CONFIG_CMAP_FORMAT_8 */ @@ -1571,6 +1643,19 @@ } + FT_CALLBACK_DEF( FT_Error ) + tt_cmap10_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 8; + + + cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); + + return FT_Err_Ok; + } + + FT_CALLBACK_TABLE_DEF const TT_CMap_ClassRec tt_cmap10_class_rec = { @@ -1583,7 +1668,8 @@ (FT_CMap_CharNextFunc) tt_cmap10_char_next }, 10, - (TT_CMap_ValidateFunc) tt_cmap10_validate + (TT_CMap_ValidateFunc) tt_cmap10_validate, + (TT_CMap_Info_GetFunc) tt_cmap10_get_info }; #endif /* TT_CONFIG_CMAP_FORMAT_10 */ @@ -1741,6 +1827,19 @@ } + FT_CALLBACK_DEF( FT_Error ) + tt_cmap12_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 8; + + + cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); + + return FT_Err_Ok; + } + + FT_CALLBACK_TABLE_DEF const TT_CMap_ClassRec tt_cmap12_class_rec = { @@ -1753,7 +1852,8 @@ (FT_CMap_CharNextFunc) tt_cmap12_char_next }, 12, - (TT_CMap_ValidateFunc) tt_cmap12_validate + (TT_CMap_ValidateFunc) tt_cmap12_validate, + (TT_CMap_Info_GetFunc) tt_cmap12_get_info }; @@ -1866,6 +1966,7 @@ FT_ERROR(( "tt_face_build_cmaps:" )); FT_ERROR(( " broken cmap sub-table ignored!\n" )); } + break; } } } @@ -1875,4 +1976,16 @@ } + FT_LOCAL( FT_Error ) + tt_get_cmap_info( FT_CharMap charmap, + TT_CMapInfo *cmap_info ) + { + FT_CMap cmap = (FT_CMap)charmap; + TT_CMap_Class clazz = (TT_CMap_Class)cmap->clazz; + + + return clazz->get_cmap_info( charmap, cmap_info ); + } + + /* END */ diff --git a/reactos/lib/freetype/src/sfnt/ttcmap0.h b/reactos/lib/freetype/src/sfnt/ttcmap0.h index ff1276e09b0..6ca9ca11002 100644 --- a/reactos/lib/freetype/src/sfnt/ttcmap0.h +++ b/reactos/lib/freetype/src/sfnt/ttcmap0.h @@ -4,7 +4,7 @@ /* */ /* TrueType new character mapping table (cmap) support (specification). */ /* */ -/* Copyright 2002 by */ +/* Copyright 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -23,7 +23,7 @@ #include <ft2build.h> #include FT_INTERNAL_TRUETYPE_TYPES_H #include FT_INTERNAL_OBJECTS_H - +#include FT_SERVICE_TT_CMAP_H FT_BEGIN_HEADER @@ -46,6 +46,7 @@ FT_BEGIN_HEADER FT_CMap_ClassRec clazz; FT_UInt format; TT_CMap_ValidateFunc validate; + TT_CMap_Info_GetFunc get_cmap_info; } TT_CMap_ClassRec; @@ -65,6 +66,11 @@ FT_BEGIN_HEADER FT_LOCAL( FT_Error ) tt_face_build_cmaps( TT_Face face ); + /* used in tt-cmaps service */ + FT_LOCAL( FT_Error ) + tt_get_cmap_info( FT_CharMap charmap, + TT_CMapInfo *cmap_info ); + FT_END_HEADER diff --git a/reactos/lib/freetype/src/sfnt/ttload.c b/reactos/lib/freetype/src/sfnt/ttload.c index 13b7e867790..d1b0b208b1f 100644 --- a/reactos/lib/freetype/src/sfnt/ttload.c +++ b/reactos/lib/freetype/src/sfnt/ttload.c @@ -5,7 +5,7 @@ /* Load the basic TrueType tables, i.e., tables that can be either in */ /* TTF or OTF fonts (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -22,7 +22,6 @@ #include FT_INTERNAL_STREAM_H #include FT_TRUETYPE_TAGS_H #include "ttload.h" -#include "ttcmap.h" #include "sferrors.h" @@ -254,7 +253,7 @@ /* stream :: The input stream. */ /* */ /* face_index :: If the font is a collection, the number of the font */ - /* in the collection, ignored otherwise. */ + /* in the collection. Must be zero otherwise. */ /* */ /* <Output> */ /* sfnt :: The SFNT header. */ @@ -277,7 +276,7 @@ SFNT_Header sfnt ) { FT_Error error; - FT_ULong format_tag, offset; + FT_ULong font_format_tag, format_tag, offset; FT_Memory memory = stream->memory; static const FT_Frame_Field sfnt_header_fields[] = @@ -314,16 +313,17 @@ face->num_tables = 0; - /* first of all, read the first 4 bytes. If it is `ttcf', then the */ - /* file is a TrueType collection, otherwise it can be any other */ - /* kind of font. */ - /* */ + /* First of all, read the first 4 bytes. If it is `ttcf', then the */ + /* file is a TrueType collection, otherwise it is a single-face font. */ + /* */ offset = FT_STREAM_POS(); - if ( FT_READ_ULONG( format_tag ) ) + if ( FT_READ_ULONG( font_format_tag ) ) goto Exit; - if ( format_tag == TTAG_ttcf ) + format_tag = font_format_tag; + + if ( font_format_tag == TTAG_ttcf ) { FT_Int n; @@ -355,8 +355,8 @@ /* seek to the appropriate TrueType file, then read tag */ offset = face->ttc_header.offsets[face_index]; - if ( FT_STREAM_SEEK( offset ) || - FT_READ_LONG( format_tag ) ) + if ( FT_STREAM_SEEK( offset ) || + FT_READ_LONG( format_tag ) ) goto Exit; } @@ -373,8 +373,13 @@ { FT_TRACE2(( "tt_face_load_sfnt_header: file is not SFNT!\n" )); error = SFNT_Err_Unknown_File_Format; + goto Exit; } + /* disallow face index values > 0 for non-TTC files */ + if ( font_format_tag != TTAG_ttcf && face_index > 0 ) + error = SFNT_Err_Bad_Argument; + Exit: return error; } @@ -741,12 +746,12 @@ face->root.num_glyphs = maxProfile->numGlyphs; face->root.internal->max_points = - (FT_UShort)MAX( maxProfile->maxCompositePoints, - maxProfile->maxPoints ); + (FT_UShort)FT_MAX( maxProfile->maxCompositePoints, + maxProfile->maxPoints ); face->root.internal->max_contours = - (FT_Short)MAX( maxProfile->maxCompositeContours, - maxProfile->maxContours ); + (FT_Short)FT_MAX( maxProfile->maxCompositeContours, + maxProfile->maxContours ); face->max_components = (FT_ULong)maxProfile->maxComponentElements + maxProfile->maxComponentDepth; @@ -897,7 +902,8 @@ /* do we have an inconsistent number of metric values? */ { TT_ShortMetrics* cur = *shorts; - TT_ShortMetrics* limit = cur + MIN( num_shorts, num_shorts_checked ); + TT_ShortMetrics* limit = cur + + FT_MIN( num_shorts, num_shorts_checked ); for ( ; cur < limit; cur++ ) diff --git a/reactos/lib/freetype/src/sfnt/ttpost.c b/reactos/lib/freetype/src/sfnt/ttpost.c index 486ba3dd255..3d526db4cfd 100644 --- a/reactos/lib/freetype/src/sfnt/ttpost.c +++ b/reactos/lib/freetype/src/sfnt/ttpost.c @@ -5,7 +5,7 @@ /* Postcript name table processing for TrueType and OpenType fonts */ /* (body). */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 1996-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -50,7 +50,7 @@ #ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES -#include FT_INTERNAL_POSTSCRIPT_NAMES_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H #define MAC_NAME( x ) ( (FT_String*)psnames->macintosh_name( x ) ) @@ -441,7 +441,7 @@ FT_Fixed format; #ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES - PSNames_Service psnames; + FT_Service_PsCMaps psnames; #endif @@ -452,7 +452,7 @@ return SFNT_Err_Invalid_Glyph_Index; #ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES - psnames = (PSNames_Service)face->psnames; + psnames = (FT_Service_PsCMaps)face->psnames; if ( !psnames ) return SFNT_Err_Unimplemented_Feature; #endif @@ -510,7 +510,7 @@ *PSname = MAC_NAME( idx ); } } - + /* nothing to do for format == 0x00030000L */ End: diff --git a/reactos/lib/freetype/src/sfnt/ttsbit.c b/reactos/lib/freetype/src/sfnt/ttsbit.c index d4c16b15f51..444c27acc05 100644 --- a/reactos/lib/freetype/src/sfnt/ttsbit.c +++ b/reactos/lib/freetype/src/sfnt/ttsbit.c @@ -4,7 +4,7 @@ /* */ /* TrueType and OpenType embedded bitmap support (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -622,22 +622,22 @@ FT_LOCAL_DEF( FT_Error ) tt_face_set_sbit_strike( TT_Face face, - FT_Int x_ppem, - FT_Int y_ppem, + FT_UInt x_ppem, + FT_UInt y_ppem, FT_ULong *astrike_index ) { FT_ULong i; - if ( x_ppem < 0 || x_ppem > 255 || + if ( x_ppem > 255 || y_ppem < 1 || y_ppem > 255 ) return SFNT_Err_Invalid_PPem; for ( i = 0; i < face->num_sbit_strikes; i++ ) { - if ( ( face->sbit_strikes[i].y_ppem == y_ppem ) && - ( ( x_ppem == 0 ) || - ( face->sbit_strikes[i].x_ppem == x_ppem ) ) ) + if ( ( (FT_UInt)face->sbit_strikes[i].y_ppem == y_ppem ) && + ( ( x_ppem == 0 ) || + ( (FT_UInt)face->sbit_strikes[i].x_ppem == x_ppem ) ) ) { *astrike_index = i; return SFNT_Err_Ok; @@ -754,7 +754,7 @@ /*************************************************************************/ /* */ /* <Function> */ - /* find_sbit_image */ + /* tt_find_sbit_image */ /* */ /* <Description> */ /* Checks whether an embedded bitmap (an `sbit') exists for a given */ @@ -779,13 +779,13 @@ /* SFNT_Err_Invalid_Argument if no sbit exists for the requested */ /* glyph. */ /* */ - static FT_Error - find_sbit_image( TT_Face face, - FT_UInt glyph_index, - FT_ULong strike_index, - TT_SBit_Range *arange, - TT_SBit_Strike *astrike, - FT_ULong *aglyph_offset ) + FT_LOCAL( FT_Error ) + tt_find_sbit_image( TT_Face face, + FT_UInt glyph_index, + FT_ULong strike_index, + TT_SBit_Range *arange, + TT_SBit_Strike *astrike, + FT_ULong *aglyph_offset ) { FT_Error error; TT_SBit_Strike strike; @@ -819,7 +819,7 @@ /*************************************************************************/ /* */ /* <Function> */ - /* load_sbit_metrics */ + /* tt_load_sbit_metrics */ /* */ /* <Description> */ /* Gets the big metrics for a given SBit. */ @@ -843,10 +843,10 @@ /* positioned just after the metrics header in the `EBDT' table on */ /* function exit. */ /* */ - static FT_Error - load_sbit_metrics( FT_Stream stream, - TT_SBit_Range range, - TT_SBit_Metrics metrics ) + FT_LOCAL( FT_Error ) + tt_load_sbit_metrics( FT_Stream stream, + TT_SBit_Range range, + TT_SBit_Metrics metrics ) { FT_Error error = SFNT_Err_Ok; @@ -1228,7 +1228,7 @@ if ( FT_STREAM_SEEK( ebdt_pos + glyph_offset ) ) goto Exit; - error = load_sbit_metrics( stream, range, metrics ); + error = tt_load_sbit_metrics( stream, range, metrics ); if ( error ) goto Exit; @@ -1419,8 +1419,8 @@ /* Check whether there is a glyph sbit for the current index */ - error = find_sbit_image( face, glyph_index, strike_index, - &range, &strike, &glyph_offset ); + error = tt_find_sbit_image( face, glyph_index, strike_index, + &range, &strike, &glyph_offset ); if ( error ) goto Exit; diff --git a/reactos/lib/freetype/src/sfnt/ttsbit.h b/reactos/lib/freetype/src/sfnt/ttsbit.h index edc858a60c4..f1b63b7ec45 100644 --- a/reactos/lib/freetype/src/sfnt/ttsbit.h +++ b/reactos/lib/freetype/src/sfnt/ttsbit.h @@ -4,7 +4,7 @@ /* */ /* TrueType and OpenType embedded bitmap support (specification). */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -37,10 +37,23 @@ FT_BEGIN_HEADER FT_LOCAL( FT_Error ) tt_face_set_sbit_strike( TT_Face face, - FT_Int x_ppem, - FT_Int y_ppem, + FT_UInt x_ppem, + FT_UInt y_ppem, FT_ULong *astrike_index ); + FT_LOCAL( FT_Error ) + tt_find_sbit_image( TT_Face face, + FT_UInt glyph_index, + FT_ULong strike_index, + TT_SBit_Range *arange, + TT_SBit_Strike *astrike, + FT_ULong *aglyph_offset ); + + FT_LOCAL( FT_Error ) + tt_load_sbit_metrics( FT_Stream stream, + TT_SBit_Range range, + TT_SBit_Metrics metrics ); + FT_LOCAL( FT_Error ) tt_face_load_sbit_image( TT_Face face, FT_ULong strike_index, diff --git a/reactos/lib/freetype/src/smooth/ftsmooth.c b/reactos/lib/freetype/src/smooth/ftsmooth.c index cc84acd0490..af8783e296b 100644 --- a/reactos/lib/freetype/src/smooth/ftsmooth.c +++ b/reactos/lib/freetype/src/smooth/ftsmooth.c @@ -4,7 +4,7 @@ /* */ /* Anti-aliasing renderer interface (body). */ /* */ -/* Copyright 2000-2001, 2002, 2003 by */ +/* Copyright 2000-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -132,10 +132,10 @@ /* compute the control box, and grid fit it */ FT_Outline_Get_CBox( outline, &cbox ); - cbox.xMin &= -64; - cbox.yMin &= -64; - cbox.xMax = ( cbox.xMax + 63 ) & -64; - cbox.yMax = ( cbox.yMax + 63 ) & -64; + cbox.xMin = FT_PIX_FLOOR( cbox.xMin ); + cbox.yMin = FT_PIX_FLOOR( cbox.yMin ); + cbox.xMax = FT_PIX_CEIL( cbox.xMax ); + cbox.yMax = FT_PIX_CEIL( cbox.yMax ); width = (FT_UInt)( ( cbox.xMax - cbox.xMin ) >> 6 ); height = (FT_UInt)( ( cbox.yMax - cbox.yMin ) >> 6 ); @@ -154,7 +154,7 @@ if ( hmul ) { width = width * hmul; - pitch = ( width + 3 ) & -4; + pitch = FT_PAD_CEIL( width, 4 ); } if ( vmul ) @@ -236,6 +236,9 @@ FT_Render_Mode mode, FT_Vector* origin ) { + if ( mode == FT_RENDER_MODE_LIGHT ) + mode = FT_RENDER_MODE_NORMAL; + return ft_smooth_render_generic( render, slot, mode, origin, FT_RENDER_MODE_NORMAL, 0, 0 ); diff --git a/reactos/lib/freetype/src/tools/docmaker/content.py b/reactos/lib/freetype/src/tools/docmaker/content.py index 6d33b5db27e..ebfeb8bf487 100644 --- a/reactos/lib/freetype/src/tools/docmaker/content.py +++ b/reactos/lib/freetype/src/tools/docmaker/content.py @@ -56,8 +56,16 @@ class DocCode: self.lines.append( l ) def dump( self, prefix = "", width=60 ): - for l in self.lines: + lines = self.dump_lines( 0, width ) + for l in lines: print prefix + l + + def dump_lines( self, margin=0, width=60 ): + result = [] + for l in self.lines: + result.append( " "*margin + l ) + return result + ############################################################################# @@ -76,8 +84,14 @@ class DocPara: self.words.extend( string.split( l ) ) def dump( self, prefix = "", width = 60 ): - cur = "" # current line - col = 0 # current width + lines = self.dump_lines( 0, width ) + for l in lines: + print prefix + l + + def dump_lines( self, margin=0, width = 60 ): + cur = "" # current line + col = 0 # current width + result = [] for word in self.words: ln = len(word) @@ -85,7 +99,7 @@ class DocPara: ln = ln+1 if col + ln > width: - print prefix + cur + result.append( " "*margin + cur ) cur = word col = len(word) else: @@ -95,8 +109,11 @@ class DocPara: col = col + ln if col > 0: - print prefix + cur + result.append( " "*margin + cur ) + + return result + ############################################################################# @@ -187,6 +204,17 @@ class DocField: p.dump( prefix ) first = 0 + def dump_lines( self, margin=0, width=60 ): + result = [] + nl = None + for p in self.items: + if nl: + result.append( "" ) + + result.extend( p.dump_lines( margin, width ) ) + nl = 1 + + return result # this regular expression is used to detect field definitions # @@ -233,6 +261,16 @@ class DocMarkup: except: return None + + def get_start( self ): + try: + result = "" + for word in self.fields[0].items[0].words: + result = result + " " + word + return result[1:] + + except: + return "ERROR" def dump( self, margin ): print " "*margin + "<" + self.tag + ">" @@ -544,4 +582,4 @@ class DocBlock: m = self.get_markup( tag_name ) return m.fields[0].items except: - return None \ No newline at end of file + return None diff --git a/reactos/lib/freetype/src/tools/docmaker/docbeauty.py b/reactos/lib/freetype/src/tools/docmaker/docbeauty.py new file mode 100644 index 00000000000..94b266b6d10 --- /dev/null +++ b/reactos/lib/freetype/src/tools/docmaker/docbeauty.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python +# +# DocBeauty (c) 2003, 2004 David Turner <david@freetype.org> +# +# This program is used to beautify the documentation comments used +# in the FreeType 2 public headers. +# + +from sources import * +from content import * +from utils import * + +import utils + +import sys, os, time, string, getopt + +content_processor = ContentProcessor() + + +def beautify_block( block ): + if block.content: + content_processor.reset() + + markups = content_processor.process_content( block.content ) + text = [] + first = 1 + + for markup in markups: + text.extend( markup.beautify( first ) ) + first = 0 + + # now beautify the documentation "borders" themselves + lines = [ " /*************************************************************************" ] + for l in text: + lines.append( " *" + l ) + lines.append( " */" ) + + block.lines = lines + + +def usage(): + print "\nDocBeauty 0.1 Usage information\n" + print " docbeauty [options] file1 [ file2 ... ]\n" + print "using the following options:\n" + print " -h : print this page" + print " -b : backup original files with the 'orig' extension" + print "" + print " --backup : same as -b" + + +def main( argv ): + """main program loop""" + + global output_dir + + try: + opts, args = getopt.getopt( sys.argv[1:], + "hb", + [ "help", "backup" ] ) + + except getopt.GetoptError: + usage() + sys.exit( 2 ) + + if args == []: + usage() + sys.exit( 1 ) + + # process options + # + output_dir = None + do_backup = None + + for opt in opts: + if opt[0] in ( "-h", "--help" ): + usage() + sys.exit( 0 ) + + if opt[0] in ( "-b", "--backup" ): + do_backup = 1 + + # create context and processor + source_processor = SourceProcessor() + + # retrieve the list of files to process + file_list = make_file_list( args ) + for filename in file_list: + source_processor.parse_file( filename ) + for block in source_processor.blocks: + beautify_block( block ) + new_name = filename + ".new" + ok = None + try: + file = open( new_name, "wt" ) + for block in source_processor.blocks: + for line in block.lines: + file.write( line ) + file.write( "\n" ) + file.close() + except: + ok = 0 + +# if called from the command line +# +if __name__ == '__main__': + main( sys.argv ) + + +# eof diff --git a/reactos/lib/freetype/src/tools/docmaker/docmaker.py b/reactos/lib/freetype/src/tools/docmaker/docmaker.py index 285bcd6a21b..9da4bbf8ea7 100644 --- a/reactos/lib/freetype/src/tools/docmaker/docmaker.py +++ b/reactos/lib/freetype/src/tools/docmaker/docmaker.py @@ -1,16 +1,16 @@ #!/usr/bin/env python # -# DocMaker 0.2 (c) 2002 David Turner <david@freetype.org> +# DocMaker (c) 2002, 2004 David Turner <david@freetype.org> # # This program is a re-write of the original DocMaker took used # to generate the API Reference of the FreeType font engine -# by converting in-source comments into structured HTML +# by converting in-source comments into structured HTML. # # This new version is capable of outputting XML data, as well -# as accepts more liberal formatting options +# as accepts more liberal formatting options. # # It also uses regular expression matching and substitution -# to speed things significantly +# to speed things significantly. # from sources import * @@ -24,50 +24,8 @@ import utils import sys, os, time, string, glob, getopt -def file_exists( pathname ): - """checks that a given file exists""" - result = 1 - try: - file = open( pathname, "r" ) - file.close() - except: - result = None - sys.stderr.write( pathname + " couldn't be accessed\n" ) - - return result - - -def make_file_list( args = None ): - """builds a list of input files from command-line arguments""" - - file_list = [] - # sys.stderr.write( repr( sys.argv[1 :] ) + '\n' ) - - if not args: - args = sys.argv[1 :] - - for pathname in args: - if string.find( pathname, '*' ) >= 0: - newpath = glob.glob( pathname ) - newpath.sort() # sort files -- this is important because - # of the order of files - else: - newpath = [pathname] - - file_list.extend( newpath ) - - if len( file_list ) == 0: - file_list = None - else: - # now filter the file list to remove non-existing ones - file_list = filter( file_exists, file_list ) - - return file_list - - - def usage(): - print "\nDocMaker 0.2 Usage information\n" + print "\nDocMaker Usage information\n" print " docmaker [options] file1 [ file2 ... ]\n" print "using the following options:\n" print " -h : print this page" diff --git a/reactos/lib/freetype/src/tools/docmaker/formatter.py b/reactos/lib/freetype/src/tools/docmaker/formatter.py index 36d72aeca04..63ecddc973c 100644 --- a/reactos/lib/freetype/src/tools/docmaker/formatter.py +++ b/reactos/lib/freetype/src/tools/docmaker/formatter.py @@ -2,6 +2,15 @@ from sources import * from content import * from utils import * +# This is the base Formatter class. its purpose is to convert +# a content processor's data into specific documents (i.e. table of +# contents, global index, and individual API reference indices). +# +# You'll need to sub-class it to output anything sensible. For example, +# the file tohtml.py contains the definition of the HtmlFormatter sub-class +# used to output, you guessed it, HTML. +# + class Formatter: def __init__( self, processor ): diff --git a/reactos/lib/freetype/src/tools/docmaker/sources.py b/reactos/lib/freetype/src/tools/docmaker/sources.py index c270e54118e..4923005624c 100644 --- a/reactos/lib/freetype/src/tools/docmaker/sources.py +++ b/reactos/lib/freetype/src/tools/docmaker/sources.py @@ -200,7 +200,7 @@ class SourceBlock: self.processor = processor self.filename = filename self.lineno = lineno - self.lines = lines + self.lines = lines[:] self.format = processor.format self.content = [] @@ -212,7 +212,7 @@ class SourceBlock: # extract comment lines lines = [] - for line0 in self.lines[1:]: + for line0 in self.lines: m = self.format.column.match( line0 ) if m: lines.append( m.group(1) ) @@ -304,7 +304,7 @@ class SourceProcessor: if self.format.end.match( line ): # that's a normal block end, add it to lines and # create a new block - # self.lines.append( line ) + self.lines.append( line ) self.add_block_lines() elif self.format.column.match( line ): diff --git a/reactos/lib/freetype/src/tools/docmaker/utils.py b/reactos/lib/freetype/src/tools/docmaker/utils.py index 6d4653db527..c3e9e2700f5 100644 --- a/reactos/lib/freetype/src/tools/docmaker/utils.py +++ b/reactos/lib/freetype/src/tools/docmaker/utils.py @@ -1,4 +1,4 @@ -import string, sys, os +import string, sys, os, glob # current output directory # @@ -85,3 +85,44 @@ def check_output( ): sys.exit( 2 ) else: output_dir = None + +def file_exists( pathname ): + """checks that a given file exists""" + result = 1 + try: + file = open( pathname, "r" ) + file.close() + except: + result = None + sys.stderr.write( pathname + " couldn't be accessed\n" ) + + return result + + +def make_file_list( args = None ): + """builds a list of input files from command-line arguments""" + + file_list = [] + # sys.stderr.write( repr( sys.argv[1 :] ) + '\n' ) + + if not args: + args = sys.argv[1 :] + + for pathname in args: + if string.find( pathname, '*' ) >= 0: + newpath = glob.glob( pathname ) + newpath.sort() # sort files -- this is important because + # of the order of files + else: + newpath = [pathname] + + file_list.extend( newpath ) + + if len( file_list ) == 0: + file_list = None + else: + # now filter the file list to remove non-existing ones + file_list = filter( file_exists, file_list ) + + return file_list + diff --git a/reactos/lib/freetype/src/truetype/ttdriver.c b/reactos/lib/freetype/src/truetype/ttdriver.c index 193be06052f..a5b800d5380 100644 --- a/reactos/lib/freetype/src/truetype/ttdriver.c +++ b/reactos/lib/freetype/src/truetype/ttdriver.c @@ -4,7 +4,7 @@ /* */ /* TrueType font driver implementation (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -21,6 +21,7 @@ #include FT_INTERNAL_STREAM_H #include FT_INTERNAL_SFNT_H #include FT_TRUETYPE_IDS_H +#include FT_SERVICE_XFREE86_NAME_H #include "ttdriver.h" #include "ttgload.h" @@ -207,8 +208,8 @@ /* we need to use rounding in the following computations. Otherwise, * the resulting hinted outlines will be very slightly distorted */ - dim_x = ( ( char_width * horz_resolution + (36+32*72) ) / 72 ) & -64; - dim_y = ( ( char_height * vert_resolution + (36+32*72) ) / 72 ) & -64; + dim_x = ( ( char_width * horz_resolution + (36+32*72) ) / 72 ) & ~63; + dim_y = ( ( char_height * vert_resolution + (36+32*72) ) / 72 ) & ~63; } else { @@ -292,7 +293,7 @@ static FT_Error Load_Glyph( TT_GlyphSlot slot, TT_Size size, - FT_UShort glyph_index, + FT_UInt glyph_index, FT_Int32 load_flags ) { FT_Error error; @@ -344,17 +345,27 @@ /*************************************************************************/ /*************************************************************************/ + static const FT_ServiceDescRec tt_services[] = + { + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_TRUETYPE }, + { NULL, NULL } + }; static FT_Module_Interface tt_get_interface( TT_Driver driver, const char* tt_interface ) { - FT_Module sfntd = FT_Get_Module( driver->root.root.library, - "sfnt" ); - SFNT_Service sfnt; + FT_Module_Interface result; + FT_Module sfntd; + SFNT_Service sfnt; + result = ft_service_list_lookup( tt_services, tt_interface ); + if ( result != NULL ) + return result; + /* only return the default interface from the SFNT module */ + sfntd = FT_Get_Module( driver->root.root.library, "sfnt" ); if ( sfntd ) { sfnt = (SFNT_Service)( sfntd->clazz->module_interface ); @@ -398,20 +409,20 @@ sizeof ( FT_GlyphSlotRec ), - (FT_Face_InitFunc) tt_face_init, - (FT_Face_DoneFunc) tt_face_done, - (FT_Size_InitFunc) tt_size_init, - (FT_Size_DoneFunc) tt_size_done, - (FT_Slot_InitFunc) 0, - (FT_Slot_DoneFunc) 0, + (FT_Face_InitFunc) tt_face_init, + (FT_Face_DoneFunc) tt_face_done, + (FT_Size_InitFunc) tt_size_init, + (FT_Size_DoneFunc) tt_size_done, + (FT_Slot_InitFunc) 0, + (FT_Slot_DoneFunc) 0, - (FT_Size_ResetPointsFunc) Set_Char_Sizes, - (FT_Size_ResetPixelsFunc) Set_Pixel_Sizes, - (FT_Slot_LoadFunc) Load_Glyph, + (FT_Size_ResetPointsFunc)Set_Char_Sizes, + (FT_Size_ResetPixelsFunc)Set_Pixel_Sizes, + (FT_Slot_LoadFunc) Load_Glyph, - (FT_Face_GetKerningFunc) Get_Kerning, - (FT_Face_AttachFunc) 0, - (FT_Face_GetAdvancesFunc) 0 + (FT_Face_GetKerningFunc) Get_Kerning, + (FT_Face_AttachFunc) 0, + (FT_Face_GetAdvancesFunc)0 }; diff --git a/reactos/lib/freetype/src/truetype/ttgload.c b/reactos/lib/freetype/src/truetype/ttgload.c index a8b82eee834..00da0c22400 100644 --- a/reactos/lib/freetype/src/truetype/ttgload.c +++ b/reactos/lib/freetype/src/truetype/ttgload.c @@ -4,7 +4,7 @@ /* */ /* TrueType Glyph Loader (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -162,11 +162,62 @@ } + /*************************************************************************/ + /* */ + /* Returns the vertical metrics in font units for a given glyph. */ + /* Greg Hitchcock from Microsoft told us that if there were no `vmtx' */ + /* table, typoAscender/Descender from the `OS/2' table would be used */ + /* instead, and if there were no `OS/2' table, use ascender/descender */ + /* from the `hhea' table. But that is not what Microsoft's rasterizer */ + /* apparently does: It uses the ppem value as the advance height, and */ + /* sets the top side bearing to be zero. */ + /* */ + /* The monospace `check' is probably not meaningful here, but we leave */ + /* it in for a consistent interface. */ + /* */ + static void + Get_VMetrics( TT_Face face, + FT_UInt idx, + FT_Bool check, + FT_Short* tsb, + FT_UShort* ah ) + { + FT_UNUSED( check ); + + if ( face->vertical_info ) + TT_Get_Metrics( (TT_HoriHeader *)&face->vertical, idx, tsb, ah ); + +#if 1 /* Emperically determined, at variance with what MS said */ + + else + { + *tsb = 0; + *ah = face->root.units_per_EM; + } + +#else /* This is what MS said to do. It isn't what they do, however. */ + + else if ( face->os2.version != 0xFFFFU ) + { + *tsb = face->os2.sTypoAscender; + *ah = face->os2.sTypoAscender - face->os2.sTypoDescender; + } + else + { + *tsb = face->horizontal.Ascender; + *ah = face->horizontal.Ascender - face->horizontal.Descender; + } + +#endif + + } + + #define cur_to_org( n, zone ) \ - FT_MEM_COPY( (zone)->org, (zone)->cur, (n) * sizeof ( FT_Vector ) ) + FT_ARRAY_COPY( (zone)->org, (zone)->cur, (n) ) #define org_to_cur( n, zone ) \ - FT_MEM_COPY( (zone)->cur, (zone)->org, (n) * sizeof ( FT_Vector ) ) + FT_ARRAY_COPY( (zone)->cur, (zone)->org, (n) ) /*************************************************************************/ @@ -317,7 +368,7 @@ if ( n_contours > 0 ) n_points = cont[-1] + 1; - error = FT_GlyphLoader_CheckPoints( gloader, n_points + 2, 0 ); + error = FT_GlyphLoader_CheckPoints( gloader, n_points + 4, 0 ); if ( error ) goto Fail; @@ -635,12 +686,16 @@ /* add shadow points */ - /* Now add the two shadow points at n and n + 1. */ + /* Add two horizontal shadow points at n and n+1. */ /* We need the left side bearing and advance width. */ + /* Add two vertical shadow points at n+2 and n+3. */ + /* We need the top side bearing and advance height. */ { FT_Vector* pp1; FT_Vector* pp2; + FT_Vector* pp3; + FT_Vector* pp4; /* pp1 = xMin - lsb */ @@ -653,14 +708,26 @@ pp2->x = pp1->x + load->advance; pp2->y = 0; + /* pp3 = top side bearing */ + pp3 = pp1 + 2; + pp3->x = 0; + pp3->y = load->top_bearing + load->bbox.yMax; + + /* pp4 = pp3 - ah */ + pp4 = pp1 + 3; + pp4->x = 0; + pp4->y = pp3->y - load->vadvance; + outline->tags[n_points ] = 0; outline->tags[n_points + 1] = 0; + outline->tags[n_points + 2] = 0; + outline->tags[n_points + 3] = 0; } /* Note that we return two more points that are not */ /* part of the glyph outline. */ - n_points += 2; + n_points += 4; /* set up zone for hinting */ tt_prepare_zone( zone, &gloader->current, 0, 0 ); @@ -687,15 +754,18 @@ /* eventually hint the glyph */ if ( IS_HINTED( load->load_flags ) ) { - FT_Pos x = zone->org[n_points-2].x; + FT_Pos x = zone->org[n_points-4].x; + FT_Pos y = zone->org[n_points-2].y; - x = ( ( x + 32 ) & -64 ) - x; - translate_array( n_points, zone->org, x, 0 ); + x = FT_PIX_ROUND( x ) - x; + y = FT_PIX_ROUND( y ) - y; + translate_array( n_points, zone->org, x, y ); org_to_cur( n_points, zone ); - zone->cur[n_points - 1].x = ( zone->cur[n_points - 1].x + 32 ) & -64; + zone->cur[n_points - 3].x = FT_PIX_ROUND( zone->cur[n_points - 3].x ); + zone->cur[n_points - 1].y = FT_PIX_ROUND( zone->cur[n_points - 1].y ); #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER @@ -711,7 +781,7 @@ load->exec->pedantic_hinting = (FT_Bool)( load->load_flags & FT_LOAD_PEDANTIC ); load->exec->pts = *zone; - load->exec->pts.n_points += 2; + load->exec->pts.n_points += 4; error = TT_Run_Context( load->exec, debug ); if ( error && load->exec->pedantic_hinting ) @@ -727,8 +797,10 @@ /* save glyph phantom points */ if ( !load->preserve_pps ) { - load->pp1 = zone->cur[n_points - 2]; - load->pp2 = zone->cur[n_points - 1]; + load->pp1 = zone->cur[n_points - 4]; + load->pp2 = zone->cur[n_points - 3]; + load->pp3 = zone->cur[n_points - 2]; + load->pp4 = zone->cur[n_points - 1]; } #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER @@ -797,16 +869,22 @@ y_scale = loader->size->metrics.y_scale; } - /* get horizontal metrics */ + /* get metrics, horizontal and vertical */ { - FT_Short left_bearing = 0; - FT_UShort advance_width = 0; + FT_Short left_bearing = 0, top_bearing = 0; + FT_UShort advance_width = 0, advance_height = 0; + Get_HMetrics( face, glyph_index, (FT_Bool)!( loader->load_flags & FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ), &left_bearing, &advance_width ); + Get_VMetrics( face, glyph_index, + (FT_Bool)!( loader->load_flags & + FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ), + &top_bearing, + &advance_height ); #ifdef FT_CONFIG_OPTION_INCREMENTAL @@ -830,10 +908,33 @@ advance_width = (FT_UShort)metrics.advance; } +# if 0 + /* GWW: Do I do the same for vertical metrics ??? */ + if ( face->root.internal->incremental_interface && + face->root.internal->incremental_interface->funcs->get_glyph_metrics ) + { + FT_Incremental_MetricsRec metrics; + + + metrics.bearing_x = 0; + metrics.bearing_y = top_bearing; + metrics.advance = advance_height; + error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( + face->root.internal->incremental_interface->object, + glyph_index, TRUE, &metrics ); + if ( error ) + goto Exit; + top_bearing = (FT_Short)metrics.bearing_y; + advance_height = (FT_UShort)metrics.advance; + } +# endif + #endif /* FT_CONFIG_OPTION_INCREMENTAL */ loader->left_bearing = left_bearing; loader->advance = advance_width; + loader->top_bearing = top_bearing; + loader->vadvance = advance_height; if ( !loader->linear_def ) { @@ -893,9 +994,14 @@ loader->pp1.x = 0; loader->pp2.x = loader->advance; + loader->pp3.y = 0; + loader->pp4.y = loader->pp3.y-loader->vadvance; if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + { loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale ); + loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale ); + } #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER @@ -933,10 +1039,17 @@ loader->pp2.x = loader->pp1.x + loader->advance; loader->pp2.y = 0; + loader->pp3.x = 0; + loader->pp3.y = loader->top_bearing + loader->bbox.yMax; + loader->pp4.x = 0; + loader->pp4.y = loader->pp3.y - loader->vadvance; + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) { loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale ); loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale ); + loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale ); + loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale ); } /***********************************************************************/ @@ -1045,7 +1158,7 @@ for ( n = 0; n < (FT_Int)num_subglyphs; n++ ) { - FT_Vector pp1, pp2; + FT_Vector pp1, pp2, pp3, pp4; FT_Pos x, y; @@ -1057,6 +1170,8 @@ pp1 = loader->pp1; pp2 = loader->pp2; + pp3 = loader->pp3; + pp4 = loader->pp4; num_base_points = gloader->base.outline.n_points; @@ -1072,11 +1187,15 @@ { pp1 = loader->pp1; pp2 = loader->pp2; + pp3 = loader->pp3; + pp4 = loader->pp4; } else { loader->pp1 = pp1; loader->pp2 = pp2; + loader->pp3 = pp3; + loader->pp4 = pp4; } num_points = gloader->base.outline.n_points; @@ -1202,8 +1321,8 @@ if ( subglyph->flags & ROUND_XY_TO_GRID ) { - x = ( x + 32 ) & -64; - y = ( y + 32 ) & -64; + x = FT_PIX_ROUND( x ); + y = FT_PIX_ROUND( y ); } } } @@ -1273,7 +1392,7 @@ if ( error ) goto Fail; - error = FT_GlyphLoader_CheckPoints( gloader, num_points + 2, 0 ); + error = FT_GlyphLoader_CheckPoints( gloader, num_points + 4, 0 ); if ( error ) goto Fail; @@ -1282,22 +1401,28 @@ start_point, start_contour ); pts = &exec->pts; - pts->n_points = (short)(num_points + 2); + pts->n_points = (short)( num_points + 4 ); pts->n_contours = gloader->base.outline.n_contours; /* add phantom points */ pp1 = pts->cur + num_points; pp1[0] = loader->pp1; pp1[1] = loader->pp2; + pp1[2] = loader->pp3; + pp1[3] = loader->pp4; pts->tags[num_points ] = 0; pts->tags[num_points + 1] = 0; + pts->tags[num_points + 2] = 0; + pts->tags[num_points + 3] = 0; /* if hinting, round the phantom points */ if ( IS_HINTED( loader->load_flags ) ) { - pp1[0].x = ( ( loader->pp1.x + 32 ) & -64 ); - pp1[1].x = ( ( loader->pp2.x + 32 ) & -64 ); + pp1[0].x = FT_PIX_ROUND( loader->pp1.x ); + pp1[1].x = FT_PIX_ROUND( loader->pp2.x ); + pp1[2].y = FT_PIX_ROUND( loader->pp3.y ); + pp1[3].y = FT_PIX_ROUND( loader->pp4.y ); } { @@ -1308,7 +1433,7 @@ pts->tags[k] &= FT_CURVE_TAG_ON; } - cur_to_org( num_points + 2, pts ); + cur_to_org( num_points + 4, pts ); /* now consider hinting */ if ( IS_HINTED( loader->load_flags ) && n_ins > 0 ) @@ -1324,6 +1449,8 @@ /* save glyph origin and advance points */ loader->pp1 = pp1[0]; loader->pp2 = pp1[1]; + loader->pp3 = pp1[2]; + loader->pp4 = pp1[3]; } #endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ @@ -1390,10 +1517,10 @@ if ( IS_HINTED( loader->load_flags ) ) { /* grid-fit the bounding box */ - bbox.xMin &= -64; - bbox.yMin &= -64; - bbox.xMax = ( bbox.xMax + 63 ) & -64; - bbox.yMax = ( bbox.yMax + 63 ) & -64; + bbox.xMin = FT_PIX_FLOOR( bbox.xMin ); + bbox.yMin = FT_PIX_FLOOR( bbox.yMin ); + bbox.xMax = FT_PIX_CEIL( bbox.xMax ); + bbox.yMax = FT_PIX_CEIL( bbox.yMax ); } } else @@ -1425,7 +1552,7 @@ /* don't forget to hint the advance when we need to */ if ( IS_HINTED( loader->load_flags ) ) - glyph->metrics.horiAdvance = ( glyph->metrics.horiAdvance + 32 ) & -64; + glyph->metrics.horiAdvance = FT_PIX_ROUND( glyph->metrics.horiAdvance ); /* Now take care of vertical metrics. In the case where there is */ /* no vertical information within the font (relatively common), make */ @@ -1443,13 +1570,9 @@ if ( face->vertical_info && face->vertical.number_Of_VMetrics > 0 ) { - /* Don't assume that both the vertical header and vertical */ - /* metrics are present in the same font :-) */ + advance_height = loader->pp4.y - loader->pp3.y; + top_bearing = loader->pp3.y - bbox.yMax; - TT_Get_Metrics( (TT_HoriHeader*)&face->vertical, - glyph_index, - &top_bearing, - &advance_height ); } else { @@ -1465,6 +1588,12 @@ /* here with: */ /* ascender - descender + linegap */ /* */ + /* NOTE3: This is different from what MS's rasterizer */ + /* appears to do when getting default values */ + /* for the vertical phantom points. We leave */ + /* the old code untouched, but relying on */ + /* phantom points alone might be reasonable */ + /* (i.e., removing the `if' above). */ if ( face->os2.version != 0xFFFFU ) { top_bearing = (FT_Short)( face->os2.sTypoLineGap / 2 ); @@ -1507,6 +1636,8 @@ advance_height = (FT_UShort)metrics.advance; } + /* GWW: Do vertical metrics get loaded incrementally too? */ + #endif /* FT_CONFIG_OPTION_INCREMENTAL */ /* We must adjust the top_bearing value from the bounding box given */ @@ -1538,9 +1669,9 @@ /* grid-fit them if necessary */ if ( IS_HINTED( loader->load_flags ) ) { - left &= -64; - top = ( top + 63 ) & -64; - advance = ( advance + 32 ) & -64; + left = FT_PIX_FLOOR( left ); + top = FT_PIX_CEIL( top ); + advance = FT_PIX_ROUND( advance ); } glyph->metrics.vertBearingX = left; @@ -1598,7 +1729,7 @@ FT_LOCAL_DEF( FT_Error ) TT_Load_Glyph( TT_Size size, TT_GlyphSlot glyph, - FT_UShort glyph_index, + FT_UInt glyph_index, FT_Int32 load_flags ) { SFNT_Service sfnt; @@ -1641,7 +1772,7 @@ error = sfnt->load_sbit_image( face, (FT_ULong)size->strike_index, - (FT_UInt)glyph_index, + glyph_index, (FT_Int)load_flags, stream, &glyph->bitmap, diff --git a/reactos/lib/freetype/src/truetype/ttgload.h b/reactos/lib/freetype/src/truetype/ttgload.h index 36c93da844d..dfa2a60a5c8 100644 --- a/reactos/lib/freetype/src/truetype/ttgload.h +++ b/reactos/lib/freetype/src/truetype/ttgload.h @@ -4,7 +4,7 @@ /* */ /* TrueType Glyph Loader (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -43,7 +43,7 @@ FT_BEGIN_HEADER FT_LOCAL( FT_Error ) TT_Load_Glyph( TT_Size size, TT_GlyphSlot glyph, - FT_UShort glyph_index, + FT_UInt glyph_index, FT_Int32 load_flags ); diff --git a/reactos/lib/freetype/src/truetype/ttinterp.c b/reactos/lib/freetype/src/truetype/ttinterp.c index 2dca6a21293..889ebbf4f28 100644 --- a/reactos/lib/freetype/src/truetype/ttinterp.c +++ b/reactos/lib/freetype/src/truetype/ttinterp.c @@ -4,7 +4,7 @@ /* */ /* TrueType bytecode interpreter (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -30,9 +30,10 @@ #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER -#define TT_MULFIX FT_MulFix -#define TT_MULDIV FT_MulDiv -#define TT_INT64 FT_Int64 +#define TT_MULFIX FT_MulFix +#define TT_MULDIV FT_MulDiv +#define TT_MULDIV_NO_ROUND FT_MulDiv_No_Round + /*************************************************************************/ /* */ @@ -162,6 +163,9 @@ #define CUR_Func_move( z, p, d ) \ CUR.func_move( EXEC_ARG_ z, p, d ) +#define CUR_Func_move_orig( z, p, d ) \ + CUR.func_move_orig( EXEC_ARG_ z, p, d ) + #define CUR_Func_dualproj( x, y ) \ CUR.func_dualproj( EXEC_ARG_ x, y ) @@ -515,8 +519,7 @@ if ( *size < new_max ) { - FT_FREE( *buff ); - if ( FT_ALLOC( *buff, new_max * multiplier ) ) + if ( FT_REALLOC( *buff, *size, new_max * multiplier ) ) return error; *size = new_max; } @@ -1566,7 +1569,6 @@ if ( v != 0 ) { - zone->cur[point].x += TT_MULDIV( distance, v * 0x10000L, CUR.F_dot_P ); @@ -1578,7 +1580,6 @@ if ( v != 0 ) { - zone->cur[point].y += TT_MULDIV( distance, v * 0x10000L, CUR.F_dot_P ); @@ -1588,6 +1589,51 @@ } + /*************************************************************************/ + /* */ + /* <Function> */ + /* Direct_Move_Orig */ + /* */ + /* <Description> */ + /* Moves the *original* position of a point by a given distance along */ + /* the freedom vector. Obviously, the point will not be `touched'. */ + /* */ + /* <Input> */ + /* point :: The index of the point to move. */ + /* */ + /* distance :: The distance to apply. */ + /* */ + /* <InOut> */ + /* zone :: The affected glyph zone. */ + /* */ + static void + Direct_Move_Orig( EXEC_OP_ TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_F26Dot6 v; + + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + FT_ASSERT( !CUR.face->unpatented_hinting ); +#endif + + v = CUR.GS.freeVector.x; + + if ( v != 0 ) + zone->org[point].x += TT_MULDIV( distance, + v * 0x10000L, + CUR.F_dot_P ); + + v = CUR.GS.freeVector.y; + + if ( v != 0 ) + zone->org[point].y += TT_MULDIV( distance, + v * 0x10000L, + CUR.F_dot_P ); + } + + /*************************************************************************/ /* */ /* Special versions of Direct_Move() */ @@ -1622,6 +1668,38 @@ } + /*************************************************************************/ + /* */ + /* Special versions of Direct_Move_Orig() */ + /* */ + /* The following versions are used whenever both vectors are both */ + /* along one of the coordinate unit vectors, i.e. in 90% of the cases. */ + /* */ + /*************************************************************************/ + + + static void + Direct_Move_Orig_X( EXEC_OP_ TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_UNUSED_EXEC; + + zone->org[point].x += distance; + } + + + static void + Direct_Move_Orig_Y( EXEC_OP_ TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_UNUSED_EXEC; + + zone->org[point].y += distance; + } + + /*************************************************************************/ /* */ /* <Function> */ @@ -1656,7 +1734,7 @@ if ( distance >= 0 ) { val = distance + compensation; - if ( val < 0 ) + if ( distance && val < 0 ) val = 0; } else { @@ -1696,14 +1774,14 @@ if ( distance >= 0 ) { val = distance + compensation + 32; - if ( val > 0 ) + if ( distance && val > 0 ) val &= ~63; else val = 0; } else { - val = -( ( compensation - distance + 32 ) & -64 ); + val = -FT_PIX_ROUND( compensation - distance ); if ( val > 0 ) val = 0; } @@ -1739,13 +1817,13 @@ if ( distance >= 0 ) { - val = ( ( distance + compensation ) & -64 ) + 32; - if ( val < 0 ) + val = FT_PIX_FLOOR( distance + compensation ) + 32; + if ( distance && val < 0 ) val = 0; } else { - val = -( ( (compensation - distance) & -64 ) + 32 ); + val = -( FT_PIX_FLOOR( compensation - distance ) + 32 ); if ( val > 0 ) val = 0; } @@ -1782,7 +1860,7 @@ if ( distance >= 0 ) { val = distance + compensation; - if ( val > 0 ) + if ( distance && val > 0 ) val &= ~63; else val = 0; @@ -1826,14 +1904,14 @@ if ( distance >= 0 ) { val = distance + compensation + 63; - if ( val > 0 ) + if ( distance && val > 0 ) val &= ~63; else val = 0; } else { - val = -( ( compensation - distance + 63 ) & -64 ); + val = - FT_PIX_CEIL( compensation - distance ); if ( val > 0 ) val = 0; } @@ -1870,14 +1948,14 @@ if ( distance >= 0 ) { val = distance + compensation + 16; - if ( val > 0 ) + if ( distance && val > 0 ) val &= ~31; else val = 0; } else { - val = -( ( compensation - distance + 16 ) & -32 ); + val = -FT_PAD_ROUND( compensation - distance, 32 ); if ( val > 0 ) val = 0; } @@ -1919,7 +1997,7 @@ { val = ( distance - CUR.phase + CUR.threshold + compensation ) & -CUR.period; - if ( val < 0 ) + if ( distance && val < 0 ) val = 0; val += CUR.phase; } @@ -1967,7 +2045,7 @@ { val = ( ( distance - CUR.phase + CUR.threshold + compensation ) / CUR.period ) * CUR.period; - if ( val < 0 ) + if ( distance && val < 0 ) val = 0; val += CUR.phase; } @@ -2243,13 +2321,15 @@ if ( CUR.GS.both_x_axis ) { - CUR.func_project = Project_x; - CUR.func_move = Direct_Move_X; + CUR.func_project = Project_x; + CUR.func_move = Direct_Move_X; + CUR.func_move_orig = Direct_Move_Orig_X; } else { - CUR.func_project = Project_y; - CUR.func_move = Direct_Move_Y; + CUR.func_project = Project_y; + CUR.func_move = Direct_Move_Y; + CUR.func_move_orig = Direct_Move_Orig_Y; } if ( CUR.GS.dualVector.x == 0x4000 ) @@ -2300,23 +2380,30 @@ CUR.func_dualproj = (TT_Project_Func)Dual_Project; } - CUR.func_move = (TT_Move_Func)Direct_Move; + CUR.func_move = (TT_Move_Func)Direct_Move; + CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig; if ( CUR.F_dot_P == 0x40000000L ) { if ( CUR.GS.freeVector.x == 0x4000 ) - CUR.func_move = (TT_Move_Func)Direct_Move_X; + { + CUR.func_move = (TT_Move_Func)Direct_Move_X; + CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_X; + } else { if ( CUR.GS.freeVector.y == 0x4000 ) - CUR.func_move = (TT_Move_Func)Direct_Move_Y; + { + CUR.func_move = (TT_Move_Func)Direct_Move_Y; + CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_Y; + } } } /* at small sizes, F_dot_P can become too small, resulting */ /* in overflows and `spikes' in a number of glyphs like `w'. */ - if ( ABS( CUR.F_dot_P ) < 0x4000000L ) + if ( FT_ABS( CUR.F_dot_P ) < 0x4000000L ) CUR.F_dot_P = 0x40000000L; /* Disable cached aspect ratio */ @@ -2359,7 +2446,7 @@ FT_UNUSED_EXEC; - if ( ABS( Vx ) < 0x10000L && ABS( Vy ) < 0x10000L ) + if ( FT_ABS( Vx ) < 0x10000L && FT_ABS( Vy ) < 0x10000L ) { Vx *= 0x100; Vy *= 0x100; @@ -2887,19 +2974,19 @@ args[0] -= args[1]; -#define DO_DIV \ - if ( args[1] == 0 ) \ - CUR.error = TT_Err_Divide_By_Zero; \ - else \ - args[0] = TT_MULDIV( args[0], 64L, args[1] ); +#define DO_DIV \ + if ( args[1] == 0 ) \ + CUR.error = TT_Err_Divide_By_Zero; \ + else \ + args[0] = TT_MULDIV_NO_ROUND( args[0], 64L, args[1] ); #define DO_MUL \ args[0] = TT_MULDIV( args[0], args[1], 64L ); -#define DO_ABS \ - args[0] = ABS( args[0] ); +#define DO_ABS \ + args[0] = FT_ABS( args[0] ); #define DO_NEG \ @@ -2907,11 +2994,11 @@ #define DO_FLOOR \ - args[0] &= -64; + args[0] = FT_PIX_FLOOR( args[0] ); #define DO_CEILING \ - args[0] = ( args[0] + 63 ) & -64; + args[0] = FT_PIX_CEIL( args[0] ); #define DO_RS \ @@ -4019,9 +4106,9 @@ K = CUR.stack[CUR.args - L]; - FT_MEM_MOVE( &CUR.stack[CUR.args - L ], - &CUR.stack[CUR.args - L + 1], - ( L - 1 ) * sizeof ( FT_Long ) ); + FT_ARRAY_MOVE( &CUR.stack[CUR.args - L ], + &CUR.stack[CUR.args - L + 1], + ( L - 1 ) ); CUR.stack[CUR.args - 1] = K; } @@ -5201,7 +5288,7 @@ { *x = 0; *y = d; - } + } } else #endif @@ -5359,11 +5446,11 @@ last_point = 0; } - /* XXX: UNDOCUMENTED! SHC doesn't touch the points */ + /* XXX: UNDOCUMENTED! SHC does touch the points */ for ( i = first_point; i <= last_point; i++ ) { if ( zp.cur != CUR.zp2.cur || refp != i ) - MOVE_Zp2_Point( i, dx, dy, FALSE ); + MOVE_Zp2_Point( i, dx, dy, TRUE ); } } @@ -5498,9 +5585,11 @@ } /* XXX: UNDOCUMENTED! behaviour */ - if ( CUR.GS.gep0 == 0 ) /* if in twilight zone */ + if ( CUR.GS.gep1 == 0 ) /* if the point that is to be moved */ + /* is in twilight zone */ { CUR.zp1.org[point] = CUR.zp0.org[CUR.GS.rp0]; + CUR_Func_move_orig( &CUR.zp1, point, args[1] ); CUR.zp1.cur[point] = CUR.zp1.org[point]; } @@ -5619,7 +5708,7 @@ if ( ( CUR.opcode & 1 ) != 0 ) /* rounding and control cutin flag */ { - if ( ABS( distance - org_dist ) > CUR.GS.control_value_cutin ) + if ( FT_ABS( distance - org_dist ) > CUR.GS.control_value_cutin ) distance = org_dist; distance = CUR_Func_round( distance, CUR.tt_metrics.compensations[0] ); @@ -5663,7 +5752,7 @@ /* single width cutin test */ - if ( ABS( org_dist - CUR.GS.single_width_value ) < + if ( FT_ABS( org_dist - CUR.GS.single_width_value ) < CUR.GS.single_width_cutin ) { if ( org_dist >= 0 ) @@ -5753,7 +5842,7 @@ /* single width test */ - if ( ABS( cvt_dist - CUR.GS.single_width_value ) < + if ( FT_ABS( cvt_dist - CUR.GS.single_width_value ) < CUR.GS.single_width_cutin ) { if ( cvt_dist >= 0 ) @@ -5797,7 +5886,7 @@ /* refer to the same zone. */ if ( CUR.GS.gep0 == CUR.GS.gep1 ) - if ( ABS( cvt_dist - org_dist ) >= CUR.GS.control_value_cutin ) + if ( FT_ABS( cvt_dist - org_dist ) >= CUR.GS.control_value_cutin ) cvt_dist = org_dist; distance = CUR_Func_round( @@ -5947,7 +6036,7 @@ discriminant = TT_MULDIV( dax, -dby, 0x40 ) + TT_MULDIV( day, dbx, 0x40 ); - if ( ABS( discriminant ) >= 0x40 ) + if ( FT_ABS( discriminant ) >= 0x40 ) { val = TT_MULDIV( dx, -dby, 0x40 ) + TT_MULDIV( dy, dbx, 0x40 ); diff --git a/reactos/lib/freetype/src/truetype/ttinterp.h b/reactos/lib/freetype/src/truetype/ttinterp.h index e750963ff50..eb0bb0bb60e 100644 --- a/reactos/lib/freetype/src/truetype/ttinterp.h +++ b/reactos/lib/freetype/src/truetype/ttinterp.h @@ -4,7 +4,7 @@ /* */ /* TrueType bytecode interpreter (specification). */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 1996-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -210,6 +210,7 @@ FT_BEGIN_HEADER func_freeProj; /* current freedom proj. func */ TT_Move_Func func_move; /* current point move function */ + TT_Move_Func func_move_orig; /* move original position function */ TT_Get_CVT_Func func_read_cvt; /* read a cvt entry */ TT_Set_CVT_Func func_write_cvt; /* write a cvt entry (in pixels) */ diff --git a/reactos/lib/freetype/src/truetype/ttobjs.c b/reactos/lib/freetype/src/truetype/ttobjs.c index e1e69cdf875..d5210f2cd07 100644 --- a/reactos/lib/freetype/src/truetype/ttobjs.c +++ b/reactos/lib/freetype/src/truetype/ttobjs.c @@ -23,7 +23,6 @@ #include FT_TRUETYPE_IDS_H #include FT_TRUETYPE_TAGS_H #include FT_INTERNAL_SFNT_H -#include FT_INTERNAL_POSTSCRIPT_NAMES_H #include "ttgload.h" #include "ttpload.h" @@ -228,7 +227,7 @@ #ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING /* Determine whether unpatented hinting is to be used for this face. */ - face->unpatented_hinting = + face->unpatented_hinting = FT_BOOL ( library->debug_hooks[ FT_DEBUG_HOOK_UNPATENTED_HINTING ] != NULL ); { @@ -591,14 +590,15 @@ } /* Compute root ascender, descender, text height, and max_advance */ - metrics->ascender = ( FT_MulFix( face->root.ascender, - metrics->y_scale ) + 32 ) & -64; - metrics->descender = ( FT_MulFix( face->root.descender, - metrics->y_scale ) + 32 ) & -64; - metrics->height = ( FT_MulFix( face->root.height, - metrics->y_scale ) + 32 ) & -64; - metrics->max_advance = ( FT_MulFix( face->root.max_advance_width, - metrics->x_scale ) + 32 ) & -64; + metrics->ascender = + FT_PIX_ROUND( FT_MulFix( face->root.ascender, metrics->y_scale ) ); + metrics->descender = + FT_PIX_ROUND( FT_MulFix( face->root.descender, metrics->y_scale ) ); + metrics->height = + FT_PIX_ROUND( FT_MulFix( face->root.height, metrics->y_scale ) ); + metrics->max_advance = + FT_PIX_ROUND( FT_MulFix( face->root.max_advance_width, + metrics->x_scale ) ); #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS @@ -749,7 +749,8 @@ sbit_metrics->descender = strike->hori.descender << 6; /* XXX: Is this correct? */ - sbit_metrics->height = sbit_metrics->ascender - sbit_metrics->descender; + sbit_metrics->height = sbit_metrics->ascender - + sbit_metrics->descender; /* XXX: Is this correct? */ sbit_metrics->max_advance = ( strike->hori.min_origin_SB + diff --git a/reactos/lib/freetype/src/truetype/ttobjs.h b/reactos/lib/freetype/src/truetype/ttobjs.h index c7f556215fa..30cf1cb3690 100644 --- a/reactos/lib/freetype/src/truetype/ttobjs.h +++ b/reactos/lib/freetype/src/truetype/ttobjs.h @@ -4,7 +4,7 @@ /* */ /* Objects manager (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -216,7 +216,8 @@ FT_BEGIN_HEADER TT_Transform transform; /* transformation matrix */ - FT_Vector pp1, pp2; /* phantom points */ + FT_Vector pp1, pp2; /* phantom points (horizontal) */ + FT_Vector pp3, pp4; /* phantom points (vertical) */ } TT_SubGlyphRec, *TT_SubGlyph_Stack; diff --git a/reactos/lib/freetype/src/type1/t1driver.c b/reactos/lib/freetype/src/type1/t1driver.c index ebd6a65907e..fd201db8e38 100644 --- a/reactos/lib/freetype/src/type1/t1driver.c +++ b/reactos/lib/freetype/src/type1/t1driver.c @@ -4,7 +4,7 @@ /* */ /* Type 1 driver interface (body). */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 1996-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -29,8 +29,13 @@ #include FT_INTERNAL_DEBUG_H #include FT_INTERNAL_STREAM_H -#include FT_INTERNAL_POSTSCRIPT_NAMES_H +#include FT_SERVICE_MULTIPLE_MASTERS_H +#include FT_SERVICE_GLYPH_DICT_H +#include FT_SERVICE_XFREE86_NAME_H +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_SERVICE_POSTSCRIPT_INFO_H /*************************************************************************/ /* */ @@ -41,6 +46,10 @@ #undef FT_COMPONENT #define FT_COMPONENT trace_t1driver + /* + * GLYPH DICT SERVICE + * + */ static FT_Error t1_get_glyph_name( T1_Face face, @@ -69,23 +78,6 @@ } - /*************************************************************************/ - /* */ - /* <Function> */ - /* t1_get_name_index */ - /* */ - /* <Description> */ - /* Uses the Type 1 font's `glyph_names' table to find a given glyph */ - /* name's glyph index. */ - /* */ - /* <Input> */ - /* face :: A handle to the source face object. */ - /* */ - /* glyph_name :: The glyph name. */ - /* */ - /* <Return> */ - /* Glyph index. 0 means `undefined character code'. */ - /* */ static FT_UInt t1_get_name_index( T1_Face face, FT_String* glyph_name ) @@ -105,6 +97,17 @@ return 0; } + static const FT_Service_GlyphDictRec t1_service_glyph_dict = + { + (FT_GlyphDict_GetNameFunc) t1_get_glyph_name, + (FT_GlyphDict_NameIndexFunc)t1_get_name_index + }; + + + /* + * POSTSCRIPT NAME SERVICE + * + */ static const char* t1_get_ps_name( T1_Face face ) @@ -112,61 +115,82 @@ return (const char*) face->type1.font_name; } + static const FT_Service_PsFontNameRec t1_service_ps_name = + { + (FT_PsName_GetFunc)t1_get_ps_name + }; + + + /* + * MULTIPLE MASTERS SERVICE + * + */ + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + static const FT_Service_MultiMastersRec t1_service_multi_masters = + { + (FT_Get_MM_Func) T1_Get_Multi_Master, + (FT_Set_MM_Design_Func)T1_Set_MM_Design, + (FT_Set_MM_Blend_Func) T1_Set_MM_Blend + }; +#endif + + + /* + * POSTSCRIPT INFO SERVICE + * + */ + + static FT_Error + t1_ps_get_font_info( FT_Face face, + PS_FontInfoRec* afont_info ) + { + *afont_info = ((T1_Face)face)->type1.font_info; + return 0; + } + + + static FT_Int + t1_ps_has_glyph_names( FT_Face face ) + { + FT_UNUSED( face ); + return 1; + } + + + static const FT_Service_PsInfoRec t1_service_ps_info = + { + (PS_GetFontInfoFunc) t1_ps_get_font_info, + (PS_HasGlyphNamesFunc)t1_ps_has_glyph_names + }; + + + /* + * SERVICE LIST + * + */ + + static const FT_ServiceDescRec t1_services[] = + { + { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &t1_service_ps_name }, + { FT_SERVICE_ID_GLYPH_DICT, &t1_service_glyph_dict }, + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_TYPE_1 }, + { FT_SERVICE_ID_POSTSCRIPT_INFO, &t1_service_ps_info }, + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + { FT_SERVICE_ID_MULTI_MASTERS, &t1_service_multi_masters }, +#endif + { NULL, NULL } + }; + - /*************************************************************************/ - /* */ - /* <Function> */ - /* Get_Interface */ - /* */ - /* <Description> */ - /* Each driver can provide one or more extensions to the base */ - /* FreeType API. These can be used to access format specific */ - /* features (e.g., all TrueType/OpenType resources share a common */ - /* file structure and common tables which can be accessed through the */ - /* `sfnt' interface), or more simply generic ones (e.g., the */ - /* `postscript names' interface which can be used to retrieve the */ - /* PostScript name of a given glyph index). */ - /* */ - /* <InOut> */ - /* driver :: A handle to a driver object. */ - /* */ - /* <Input> */ - /* t1_interface :: A string designing the interface. Examples are */ - /* `sfnt', `post_names', `charmaps', etc. */ - /* */ - /* <Return> */ - /* A typeless pointer to the extension's interface (normally a table */ - /* of function pointers). Returns NULL if the requested extension */ - /* isn't available (i.e., wasn't compiled in the driver at build */ - /* time). */ - /* */ static FT_Module_Interface Get_Interface( FT_Driver driver, const FT_String* t1_interface ) { FT_UNUSED( driver ); - FT_UNUSED( t1_interface ); - if ( ft_strcmp( (const char*)t1_interface, "glyph_name" ) == 0 ) - return (FT_Module_Interface)t1_get_glyph_name; - - if ( ft_strcmp( (const char*)t1_interface, "name_index" ) == 0 ) - return (FT_Module_Interface)t1_get_name_index; - - if ( ft_strcmp( (const char*)t1_interface, "postscript_name" ) == 0 ) - return (FT_Module_Interface)t1_get_ps_name; - -#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT - if ( ft_strcmp( (const char*)t1_interface, "get_mm" ) == 0 ) - return (FT_Module_Interface)T1_Get_Multi_Master; - - if ( ft_strcmp( (const char*)t1_interface, "set_mm_design") == 0 ) - return (FT_Module_Interface)T1_Set_MM_Design; - - if ( ft_strcmp( (const char*)t1_interface, "set_mm_blend") == 0 ) - return (FT_Module_Interface)T1_Set_MM_Blend; -#endif - return 0; + return ft_service_list_lookup( t1_services, t1_interface ); } diff --git a/reactos/lib/freetype/src/type1/t1gload.c b/reactos/lib/freetype/src/type1/t1gload.c index b4573d60f71..98f8194b97e 100644 --- a/reactos/lib/freetype/src/type1/t1gload.c +++ b/reactos/lib/freetype/src/type1/t1gload.c @@ -4,7 +4,7 @@ /* */ /* Type 1 Glyph Loader (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -81,7 +81,7 @@ /* For ordinary fonts get the character data stored in the face record. */ { char_string->pointer = type1->charstrings[glyph_index]; - char_string->length = type1->charstrings_len[glyph_index]; + char_string->length = (FT_Int)type1->charstrings_len[glyph_index]; } if ( !error ) @@ -97,6 +97,7 @@ { FT_Incremental_MetricsRec metrics; + metrics.bearing_x = decoder->builder.left_bearing.x; metrics.bearing_y = decoder->builder.left_bearing.y; metrics.advance = decoder->builder.advance.x; @@ -111,7 +112,7 @@ #endif /* FT_CONFIG_OPTION_INCREMENTAL */ - return error; + return error; } @@ -120,11 +121,12 @@ FT_UInt glyph_index ) { FT_Data glyph_data; - FT_Error error = T1_Parse_Glyph_And_Get_Char_String( + FT_Error error = T1_Parse_Glyph_And_Get_Char_String( decoder, glyph_index, &glyph_data ); #ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( !error ) { T1_Face face = (T1_Face)decoder->builder.face; @@ -135,6 +137,7 @@ face->root.internal->incremental_interface->object, &glyph_data ); } + #endif /* FT_CONFIG_OPTION_INCREMENTAL */ return error; @@ -184,7 +187,7 @@ error = T1_Parse_Glyph( &decoder, glyph_index ); if ( glyph_index == 0 || decoder.builder.advance.x > *max_advance ) *max_advance = decoder.builder.advance.x; - + /* ignore the error if one occurred - skip to next glyph */ } @@ -252,7 +255,7 @@ (FT_Byte**)type1->glyph_names, face->blend, FT_BOOL( hinting ), - FT_LOAD_TARGET_MODE(load_flags), + FT_LOAD_TARGET_MODE( load_flags ), T1_Parse_Glyph ); if ( error ) goto Exit; @@ -371,11 +374,11 @@ if ( hinting ) { - metrics->horiAdvance = ( metrics->horiAdvance + 32 ) & -64; - metrics->vertAdvance = ( metrics->vertAdvance + 32 ) & -64; + metrics->horiAdvance = FT_PIX_ROUND( metrics->horiAdvance ); + metrics->vertAdvance = FT_PIX_ROUND( metrics->vertAdvance ); - metrics->vertBearingX = ( metrics->vertBearingX + 32 ) & -64; - metrics->vertBearingY = ( metrics->vertBearingY + 32 ) & -64; + metrics->vertBearingX = FT_PIX_ROUND( metrics->vertBearingX ); + metrics->vertBearingY = FT_PIX_ROUND( metrics->vertBearingY ); } } @@ -385,10 +388,10 @@ /* grid fit the bounding box if necessary */ if ( hinting ) { - cbox.xMin &= -64; - cbox.yMin &= -64; - cbox.xMax = ( cbox.xMax+63 ) & -64; - cbox.yMax = ( cbox.yMax+63 ) & -64; + cbox.xMin = FT_PIX_FLOOR( cbox.xMin ); + cbox.yMin = FT_PIX_FLOOR( cbox.yMin ); + cbox.xMax = FT_PIX_CEIL( cbox.xMax ); + cbox.yMax = FT_PIX_CEIL( cbox.yMax ); } metrics->width = cbox.xMax - cbox.xMin; diff --git a/reactos/lib/freetype/src/type1/t1load.c b/reactos/lib/freetype/src/type1/t1load.c index 6bc7b928583..16a03415541 100644 --- a/reactos/lib/freetype/src/type1/t1load.c +++ b/reactos/lib/freetype/src/type1/t1load.c @@ -4,7 +4,7 @@ /* */ /* Type 1 font loader (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -41,11 +41,10 @@ /* */ /* All other common cases are handled very simply. The matching rules */ /* are defined in the file `t1tokens.h' through the use of several */ - /* macros calls PARSE_XXX. */ - /* */ - /* This file is included twice here; the first time to generate parsing */ - /* callback functions, the second to generate a table of keywords (with */ - /* pointers to the associated callback). */ + /* macros calls PARSE_XXX. This file is included twice here; the first */ + /* time to generate parsing callback functions, the second time to */ + /* generate a table of keywords (with pointers to the associated */ + /* callback functions). */ /* */ /* The function `parse_dict' simply scans *linearly* a given dictionary */ /* (either the top-level or private one) and calls the appropriate */ @@ -71,7 +70,6 @@ #include "t1errors.h" - /*************************************************************************/ /* */ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ @@ -100,7 +98,7 @@ { PS_Blend blend; FT_Memory memory = face->root.memory; - FT_Error error = 0; + FT_Error error = T1_Err_Ok; blend = face->blend; @@ -174,7 +172,7 @@ return error; Fail: - error = -1; + error = T1_Err_Invalid_File_Format; goto Exit; } @@ -205,8 +203,10 @@ axis->minimum = map->design_points[0]; axis->maximum = map->design_points[map->num_points - 1]; } - error = 0; + + error = T1_Err_Ok; } + return error; } @@ -253,6 +253,7 @@ error = T1_Err_Ok; } + return error; } @@ -289,7 +290,7 @@ FT_Fixed p_design = designs[p]; - /* exact match ? */ + /* exact match? */ if ( design == p_design ) { the_blend = blends[p]; @@ -305,7 +306,7 @@ before = p; } - /* now, interpolate if needed */ + /* now interpolate if necessary */ if ( before < 0 ) the_blend = blends[0]; @@ -386,9 +387,9 @@ parse_blend_axis_types( T1_Face face, T1_Loader loader ) { - T1_TokenRec axis_tokens[ T1_MAX_MM_AXIS ]; + T1_TokenRec axis_tokens[T1_MAX_MM_AXIS]; FT_Int n, num_axis; - FT_Error error = 0; + FT_Error error = T1_Err_Ok; PS_Blend blend; FT_Memory memory; @@ -396,7 +397,12 @@ /* take an array of objects */ T1_ToTokenArray( &loader->parser, axis_tokens, T1_MAX_MM_AXIS, &num_axis ); - if ( num_axis <= 0 || num_axis > T1_MAX_MM_AXIS ) + if ( num_axis < 0 ) + { + error = T1_Err_Ignore; + goto Exit; + } + if ( num_axis == 0 || num_axis > T1_MAX_MM_AXIS ) { FT_ERROR(( "parse_blend_axis_types: incorrect number of axes: %d\n", num_axis )); @@ -448,18 +454,24 @@ parse_blend_design_positions( T1_Face face, T1_Loader loader ) { - T1_TokenRec design_tokens[ T1_MAX_MM_DESIGNS ]; + T1_TokenRec design_tokens[T1_MAX_MM_DESIGNS]; FT_Int num_designs; FT_Int num_axis; T1_Parser parser = &loader->parser; - FT_Error error = 0; + FT_Error error = T1_Err_Ok; PS_Blend blend; - /* get the array of design tokens - compute number of designs */ - T1_ToTokenArray( parser, design_tokens, T1_MAX_MM_DESIGNS, &num_designs ); - if ( num_designs <= 0 || num_designs > T1_MAX_MM_DESIGNS ) + /* get the array of design tokens -- compute number of designs */ + T1_ToTokenArray( parser, design_tokens, + T1_MAX_MM_DESIGNS, &num_designs ); + if ( num_designs < 0 ) + { + error = T1_Err_Ignore; + goto Exit; + } + if ( num_designs == 0 || num_designs > T1_MAX_MM_DESIGNS ) { FT_ERROR(( "parse_blend_design_positions:" )); FT_ERROR(( " incorrect number of designs: %d\n", @@ -471,23 +483,23 @@ { FT_Byte* old_cursor = parser->root.cursor; FT_Byte* old_limit = parser->root.limit; - FT_UInt n; + FT_Int n; blend = face->blend; num_axis = 0; /* make compiler happy */ - for ( n = 0; n < (FT_UInt)num_designs; n++ ) + for ( n = 0; n < num_designs; n++ ) { - T1_TokenRec axis_tokens[ T1_MAX_MM_DESIGNS ]; + T1_TokenRec axis_tokens[T1_MAX_MM_DESIGNS]; T1_Token token; FT_Int axis, n_axis; /* read axis/coordinates tokens */ token = design_tokens + n; - parser->root.cursor = token->start - 1; - parser->root.limit = token->limit + 1; + parser->root.cursor = token->start; + parser->root.limit = token->limit; T1_ToTokenArray( parser, axis_tokens, T1_MAX_MM_AXIS, &n_axis ); if ( n == 0 ) @@ -505,7 +517,7 @@ goto Exit; } - /* now, read each axis token into the design position */ + /* now read each axis token into the design position */ for ( axis = 0; axis < n_axis; axis++ ) { T1_Token token2 = axis_tokens + axis; @@ -530,7 +542,7 @@ parse_blend_design_map( T1_Face face, T1_Loader loader ) { - FT_Error error = 0; + FT_Error error = T1_Err_Ok; T1_Parser parser = &loader->parser; PS_Blend blend; T1_TokenRec axis_tokens[T1_MAX_MM_AXIS]; @@ -540,14 +552,21 @@ FT_Memory memory = face->root.memory; - T1_ToTokenArray( parser, axis_tokens, T1_MAX_MM_AXIS, &num_axis ); - if ( num_axis <= 0 || num_axis > T1_MAX_MM_AXIS ) + T1_ToTokenArray( parser, axis_tokens, + T1_MAX_MM_AXIS, &num_axis ); + if ( num_axis < 0 ) + { + error = T1_Err_Ignore; + goto Exit; + } + if ( num_axis == 0 || num_axis > T1_MAX_MM_AXIS ) { FT_ERROR(( "parse_blend_design_map: incorrect number of axes: %d\n", num_axis )); error = T1_Err_Invalid_File_Format; goto Exit; } + old_cursor = parser->root.cursor; old_limit = parser->root.limit; @@ -556,29 +575,22 @@ goto Exit; blend = face->blend; - /* now, read each axis design map */ + /* now read each axis design map */ for ( n = 0; n < num_axis; n++ ) { PS_DesignMap map = blend->design_map + n; - T1_Token token; + T1_Token axis_token; + T1_TokenRec point_tokens[T1_MAX_MM_MAP_POINTS]; FT_Int p, num_points; - token = axis_tokens + n; - parser->root.cursor = token->start; - parser->root.limit = token->limit; + axis_token = axis_tokens + n; - /* count the number of map points */ - { - FT_Byte* ptr = token->start; - FT_Byte* limit = token->limit; + parser->root.cursor = axis_token->start; + parser->root.limit = axis_token->limit; + T1_ToTokenArray( parser, point_tokens, + T1_MAX_MM_MAP_POINTS, &num_points ); - - num_points = 0; - for ( ; ptr < limit; ptr++ ) - if ( ptr[0] == '[' ) - num_points++; - } if ( num_points <= 0 || num_points > T1_MAX_MM_MAP_POINTS ) { FT_ERROR(( "parse_blend_design_map: incorrect table\n" )); @@ -594,6 +606,15 @@ for ( p = 0; p < num_points; p++ ) { + T1_Token point_token; + + + point_token = point_tokens + p; + + /* don't include delimiting brackets */ + parser->root.cursor = point_token->start + 1; + parser->root.limit = point_token->limit - 1; + map->design_points[p] = T1_ToInt( parser ); map->blend_points [p] = T1_ToFixed( parser, 0 ); } @@ -611,26 +632,46 @@ parse_weight_vector( T1_Face face, T1_Loader loader ) { - FT_Error error = 0; + T1_TokenRec design_tokens[T1_MAX_MM_DESIGNS]; + FT_Int num_designs; + FT_Error error = T1_Err_Ok; T1_Parser parser = &loader->parser; PS_Blend blend = face->blend; - T1_TokenRec master; - FT_UInt n; + T1_Token token; + FT_Int n; FT_Byte* old_cursor; FT_Byte* old_limit; - if ( !blend || blend->num_designs == 0 ) + T1_ToTokenArray( parser, design_tokens, + T1_MAX_MM_DESIGNS, &num_designs ); + if ( num_designs < 0 ) { - FT_ERROR(( "parse_weight_vector: too early!\n" )); + error = T1_Err_Ignore; + goto Exit; + } + if ( num_designs == 0 || num_designs > T1_MAX_MM_DESIGNS ) + { + FT_ERROR(( "parse_weight_vector:" )); + FT_ERROR(( " incorrect number of designs: %d\n", + num_designs )); error = T1_Err_Invalid_File_Format; goto Exit; } - T1_ToToken( parser, &master ); - if ( master.type != T1_TOKEN_TYPE_ARRAY ) + if ( !blend || !blend->num_designs ) { - FT_ERROR(( "parse_weight_vector: incorrect format!\n" )); + error = t1_allocate_blend( face, num_designs, 0 ); + if ( error ) + goto Exit; + blend = face->blend; + } + else if ( blend->num_designs != (FT_UInt)num_designs ) + { + FT_ERROR(( "parse_weight_vector:" + " /BlendDesignPosition and /WeightVector have\n" )); + FT_ERROR(( " " + " different number of elements!\n" )); error = T1_Err_Invalid_File_Format; goto Exit; } @@ -638,11 +679,12 @@ old_cursor = parser->root.cursor; old_limit = parser->root.limit; - parser->root.cursor = master.start; - parser->root.limit = master.limit; - - for ( n = 0; n < blend->num_designs; n++ ) + for ( n = 0; n < num_designs; n++ ) { + token = design_tokens + n; + parser->root.cursor = token->start; + parser->root.limit = token->limit; + blend->default_weight_vector[n] = blend->weight_vector[n] = T1_ToFixed( parser, 0 ); } @@ -655,26 +697,11 @@ } - /* the keyword `/shareddict' appears in some multiple master fonts */ - /* with a lot of Postscript garbage behind it (that's completely out */ - /* of spec!); we detect it and terminate the parsing */ - /* */ - static void - parse_shared_dict( T1_Face face, - T1_Loader loader ) - { - T1_Parser parser = &loader->parser; - - FT_UNUSED( face ); - - - parser->root.cursor = parser->root.limit; - parser->root.error = 0; - } - #endif /* T1_CONFIG_OPTION_NO_MM_SUPPORT */ + + /*************************************************************************/ /*************************************************************************/ /***** *****/ @@ -683,15 +710,6 @@ /*************************************************************************/ /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* First of all, define the token field static variables. This is a set */ - /* of T1_FieldRec variables used later. */ - /* */ - /*************************************************************************/ - - static FT_Error t1_load_keyword( T1_Face face, T1_Loader loader, @@ -774,32 +792,12 @@ static int is_space( FT_Byte c ) { - return ( c == ' ' || c == '\t' || c == '\r' || c == '\n' ); + return ( c == ' ' || c == '\t' || + c == '\r' || c == '\n' || c == '\f' || + c == '\0' ); } - static int - is_name_char( FT_Byte c ) - { - /* Note: PostScript allows any non-delimiting, non-whitespace */ - /* in a name (PS Ref Manual, 3rd Ed, p31) */ - /* PostScript delimiters include (,),<,>,[,],{,},/ and % */ - - return ( c != '(' && - c != ')' && - c != '<' && - c != '>' && - c != '[' && - c != ']' && - c != '{' && - c != '}' && - c != '/' && - c != '%' && - ! is_space( c ) - ); - } - - static int read_binary_data( T1_Parser parser, FT_Long* size, @@ -809,20 +807,21 @@ FT_Byte* limit = parser->root.limit; - /* the binary data has the following format */ - /* */ - /* `size' [white*] RD white ....... ND */ - /* */ + /* the binary data has one of the following formats */ + /* */ + /* `size' [white*] RD white ....... ND */ + /* `size' [white*] -| white ....... |- */ + /* */ T1_Skip_Spaces( parser ); + cur = parser->root.cursor; - if ( cur < limit && (FT_Byte)( *cur - '0' ) < 10 ) + if ( cur < limit && ft_isdigit( *cur ) ) { *size = T1_ToInt( parser ); - T1_Skip_Spaces( parser ); - T1_Skip_Alpha ( parser ); /* `RD' or `-|' or something else */ + T1_Skip_PS_Token( parser ); /* `RD' or `-|' or something else */ /* there is only one whitespace char after the */ /* `RD' or `-|' token */ @@ -838,9 +837,8 @@ } - /* we will now define the routines used to handle */ - /* the `/Encoding', `/Subrs', and `/CharStrings' */ - /* dictionaries */ + /* We now define the routines to handle the `/Encoding', `/Subrs', */ + /* and `/CharStrings' dictionaries. */ static void parse_font_matrix( T1_Face face, @@ -854,13 +852,9 @@ FT_Fixed temp_scale; - if ( matrix->xx || matrix->yx ) - /* with synthetic fonts, it's possible we get here twice */ - return; - (void)T1_ToFixedArray( parser, 6, temp, 3 ); - temp_scale = ABS( temp[3] ); + temp_scale = FT_ABS( temp[3] ); /* Set Units per EM based on FontMatrix values. We set the value to */ /* 1000 / temp_scale, because temp_scale was already multiplied by */ @@ -886,8 +880,8 @@ matrix->yy = temp[3]; /* note that the offsets must be expressed in integer font units */ - offset->x = temp[4] >> 16; - offset->y = temp[5] >> 16; + offset->x = temp[4] >> 16; + offset->y = temp[5] >> 16; } @@ -895,49 +889,52 @@ parse_encoding( T1_Face face, T1_Loader loader ) { - T1_Parser parser = &loader->parser; - FT_Byte* cur = parser->root.cursor; - FT_Byte* limit = parser->root.limit; + T1_Parser parser = &loader->parser; + FT_Byte* cur; + FT_Byte* limit = parser->root.limit; - PSAux_Service psaux = (PSAux_Service)face->psaux; + PSAux_Service psaux = (PSAux_Service)face->psaux; - /* skip whitespace */ - while ( is_space( *cur ) ) + T1_Skip_Spaces( parser ); + cur = parser->root.cursor; + if ( cur >= limit ) { - cur++; - if ( cur >= limit ) - { - FT_ERROR(( "parse_encoding: out of bounds!\n" )); - parser->root.error = T1_Err_Invalid_File_Format; - return; - } + FT_ERROR(( "parse_encoding: out of bounds!\n" )); + parser->root.error = T1_Err_Invalid_File_Format; + return; } - /* if we have a number, then the encoding is an array, */ - /* and we must load it now */ - if ( (FT_Byte)( *cur - '0' ) < 10 ) + /* if we have a number or `[', the encoding is an array, */ + /* and we must load it now */ + if ( ft_isdigit( *cur ) || *cur == '[' ) { - T1_Encoding encode = &face->type1.encoding; + T1_Encoding encode = &face->type1.encoding; FT_Int count, n; - PS_Table char_table = &loader->encoding_table; - FT_Memory memory = parser->root.memory; + PS_Table char_table = &loader->encoding_table; + FT_Memory memory = parser->root.memory; FT_Error error; + FT_Bool only_immediates = 0; - if ( encode->char_index ) - /* with synthetic fonts, it's possible we get here twice */ - return; + /* read the number of entries in the encoding; should be 256 */ + if ( *cur == '[' ) + { + count = 256; + only_immediates = 1; + parser->root.cursor++; + } + else + count = (FT_Int)T1_ToInt( parser ); - /* read the number of entries in the encoding, should be 256 */ - count = (FT_Int)T1_ToInt( parser ); - if ( parser->root.error ) + T1_Skip_Spaces( parser ); + if ( parser->root.cursor >= limit ) return; /* we use a T1_Table to store our charnames */ loader->num_chars = encode->num_chars = count; - if ( FT_NEW_ARRAY( encode->char_index, count ) || - FT_NEW_ARRAY( encode->char_name, count ) || + if ( FT_NEW_ARRAY( encode->char_index, count ) || + FT_NEW_ARRAY( encode->char_name, count ) || FT_SET_ERROR( psaux->ps_table_funcs->init( char_table, count, memory ) ) ) { @@ -954,8 +951,11 @@ T1_Add_Table( char_table, n, notdef, 8 ); } - /* Now, we will need to read a record of the form */ - /* ... charcode /charname ... for each entry in our table */ + /* Now we need to read records of the form */ + /* */ + /* ... charcode /charname ... */ + /* */ + /* for each entry in our table. */ /* */ /* We simply look for a number followed by an immediate */ /* name. Note that this ignores correctly the sequence */ @@ -965,75 +965,85 @@ /* */ /* used to clean the encoding array before anything else. */ /* */ - /* We stop when we encounter a `def'. */ + /* Alternatively, if the array is directly given as */ + /* */ + /* /Encoding [ ... ] */ + /* */ + /* we only read immediates. */ - cur = parser->root.cursor; - limit = parser->root.limit; - n = 0; + n = 0; + T1_Skip_Spaces( parser ); - for ( ; cur < limit; ) + while ( parser->root.cursor < limit ) { - FT_Byte c; + cur = parser->root.cursor; - - c = *cur; - - /* we stop when we encounter a `def' */ - if ( c == 'd' && cur + 3 < limit ) + /* we stop when we encounter a `def' or `]' */ + if ( *cur == 'd' && cur + 3 < limit ) { - if ( cur[1] == 'e' && - cur[2] == 'f' && - is_space( cur[-1] ) && - is_space( cur[3] ) ) + if ( cur[1] == 'e' && + cur[2] == 'f' && + is_space( cur[3] ) ) { FT_TRACE6(( "encoding end\n" )); + cur += 3; break; } } + if ( *cur == ']' ) + { + FT_TRACE6(( "encoding end\n" )); + cur++; + break; + } - /* otherwise, we must find a number before anything else */ - if ( (FT_Byte)( c - '0' ) < 10 ) + /* check whether we've found an entry */ + if ( ft_isdigit( *cur ) || only_immediates ) { FT_Int charcode; - parser->root.cursor = cur; - charcode = (FT_Int)T1_ToInt( parser ); - cur = parser->root.cursor; - - /* skip whitespace */ - while ( cur < limit && is_space( *cur ) ) - cur++; - - if ( cur < limit && *cur == '/' ) + if ( only_immediates ) + charcode = n; + else + { + charcode = (FT_Int)T1_ToInt( parser ); + T1_Skip_Spaces( parser ); + } + + cur = parser->root.cursor; + + if ( *cur == '/' && cur + 2 < limit && n < count ) { - /* bingo, we have an immediate name -- it must be a */ - /* character name */ - FT_Byte* cur2 = cur + 1; FT_PtrDist len; - while ( cur2 < limit && is_name_char( *cur2 ) ) - cur2++; + cur++; - len = cur2 - cur - 1; + parser->root.cursor = cur; + T1_Skip_PS_Token( parser ); + + len = parser->root.cursor - cur; parser->root.error = T1_Add_Table( char_table, charcode, - cur + 1, len + 1 ); - char_table->elements[charcode][len] = '\0'; + cur, len + 1 ); if ( parser->root.error ) return; + char_table->elements[charcode][len] = '\0'; - cur = cur2; + n++; } } else - cur++; + T1_Skip_PS_Token( parser ); + + T1_Skip_Spaces( parser ); } face->type1.encoding_type = T1_ENCODING_TYPE_ARRAY; parser->root.cursor = cur; } + /* Otherwise, we should have either `StandardEncoding', */ /* `ExpertEncoding', or `ISOLatin1Encoding' */ else @@ -1051,10 +1061,7 @@ face->type1.encoding_type = T1_ENCODING_TYPE_ISOLATIN1; else - { - FT_ERROR(( "parse_encoding: invalid token!\n" )); - parser->root.error = T1_Err_Invalid_File_Format; - } + parser->root.error = T1_Err_Ignore; } } @@ -1063,46 +1070,49 @@ parse_subrs( T1_Face face, T1_Loader loader ) { - T1_Parser parser = &loader->parser; - PS_Table table = &loader->subrs; - FT_Memory memory = parser->root.memory; - FT_Error error; - FT_Int n; + T1_Parser parser = &loader->parser; + PS_Table table = &loader->subrs; + FT_Memory memory = parser->root.memory; + FT_Error error; + FT_Int n, num_subrs; PSAux_Service psaux = (PSAux_Service)face->psaux; - if ( loader->num_subrs ) - /* with synthetic fonts, it's possible we get here twice */ - return; + T1_Skip_Spaces( parser ); - if ( parser->root.cursor + 2 > parser->root.limit && - parser->root.cursor[0] == '[' && - parser->root.cursor[1] == ']' ) + /* test for empty array */ + if ( parser->root.cursor < parser->root.limit && + *parser->root.cursor == '[' ) { - /* empty array */ + T1_Skip_PS_Token( parser ); + T1_Skip_Spaces ( parser ); + if ( parser->root.cursor >= parser->root.limit || + *parser->root.cursor != ']' ) + parser->root.error = T1_Err_Invalid_File_Format; return; } - loader->num_subrs = (FT_Int)T1_ToInt( parser ); - if ( parser->root.error ) - return; + num_subrs = (FT_Int)T1_ToInt( parser ); /* position the parser right before the `dup' of the first subr */ - T1_Skip_Spaces( parser ); - T1_Skip_Alpha( parser ); /* `array' */ - T1_Skip_Spaces( parser ); + T1_Skip_PS_Token( parser ); /* `array' */ + T1_Skip_Spaces ( parser ); - /* initialize subrs array */ - error = psaux->ps_table_funcs->init( table, loader->num_subrs, memory ); - if ( error ) - goto Fail; + /* initialize subrs array -- with synthetic fonts it is possible */ + /* we get here twice */ + if ( !loader->num_subrs ) + { + error = psaux->ps_table_funcs->init( table, num_subrs, memory ); + if ( error ) + goto Fail; + } /* the format is simple: */ /* */ /* `index' + binary data */ /* */ - for ( n = 0; n < loader->num_subrs; n++ ) + for ( n = 0; n < num_subrs; n++ ) { FT_Long idx, size; FT_Byte* base; @@ -1113,6 +1123,8 @@ if ( ft_strncmp( (char*)parser->root.cursor, "dup", 3 ) != 0 ) break; + T1_Skip_PS_Token( parser ); /* `dup' */ + idx = T1_ToInt( parser ); if ( !read_binary_data( parser, &size, &base ) ) @@ -1122,16 +1134,19 @@ /* (bound to `noaccess put') or by two separate tokens: */ /* `noaccess' & `put'. We position the parser right */ /* before the next `dup', if any. */ - T1_Skip_Spaces( parser ); - T1_Skip_Alpha( parser ); /* `NP' or `I' or `noaccess' */ - T1_Skip_Spaces( parser ); + T1_Skip_PS_Token( parser ); /* `NP' or `|' or `noaccess' */ + T1_Skip_Spaces ( parser ); if ( ft_strncmp( (char*)parser->root.cursor, "put", 3 ) == 0 ) { - T1_Skip_Alpha( parser ); /* skip `put' */ - T1_Skip_Spaces( parser ); + T1_Skip_PS_Token( parser ); /* skip `put' */ + T1_Skip_Spaces ( parser ); } + /* with synthetic fonts it is possible we get here twice */ + if ( loader->num_subrs ) + continue; + /* some fonts use a value of -1 for lenIV to indicate that */ /* the charstrings are unencoded */ /* */ @@ -1157,6 +1172,10 @@ if ( error ) goto Fail; } + + if ( !loader->num_subrs ) + loader->num_subrs = num_subrs; + return; Fail: @@ -1164,6 +1183,9 @@ } +#define TABLE_EXTEND 5 + + static void parse_charstrings( T1_Face face, T1_Loader loader ) @@ -1179,41 +1201,43 @@ FT_Byte* cur; FT_Byte* limit = parser->root.limit; - FT_Int n; + FT_Int n, num_glyphs; FT_UInt notdef_index = 0; FT_Byte notdef_found = 0; - if ( loader->num_glyphs ) - /* with synthetic fonts, it's possible we get here twice */ + num_glyphs = (FT_Int)T1_ToInt( parser ); + /* some fonts like Optima-Oblique not only define the /CharStrings */ + /* array but access it also */ + if ( num_glyphs == 0 || parser->root.error ) return; - loader->num_glyphs = (FT_Int)T1_ToInt( parser ); - if ( parser->root.error ) - return; + /* initialize tables, leaving space for addition of .notdef, */ + /* if necessary, and a few other glyphs to handle buggy */ + /* fonts which have more glyphs than specified. */ - /* initialize tables (leaving room for addition of .notdef, */ - /* if necessary). */ + /* for some non-standard fonts like `Optima' which provides */ + /* different outlines depending on the resolution it is */ + /* possible to get here twice */ + if ( !loader->num_glyphs ) + { + error = psaux->ps_table_funcs->init( + code_table, num_glyphs + 1 + TABLE_EXTEND, memory ); + if ( error ) + goto Fail; - error = psaux->ps_table_funcs->init( code_table, - loader->num_glyphs + 1, - memory ); - if ( error ) - goto Fail; + error = psaux->ps_table_funcs->init( + name_table, num_glyphs + 1 + TABLE_EXTEND, memory ); + if ( error ) + goto Fail; - error = psaux->ps_table_funcs->init( name_table, - loader->num_glyphs + 1, - memory ); - if ( error ) - goto Fail; + /* Initialize table for swapping index notdef_index and */ + /* index 0 names and codes (if necessary). */ - /* Initialize table for swapping index notdef_index and */ - /* index 0 names and codes (if necessary). */ - - error = psaux->ps_table_funcs->init( swap_table, 4, memory ); - - if ( error ) - goto Fail; + error = psaux->ps_table_funcs->init( swap_table, 4, memory ); + if ( error ) + goto Fail; + } n = 0; @@ -1223,11 +1247,9 @@ FT_Byte* base; - /* the format is simple: */ - /* `/glyphname' + binary data */ - /* */ - /* note that we stop when we find a `def' */ - /* */ + /* the format is simple: */ + /* `/glyphname' + binary data */ + T1_Skip_Spaces( parser ); cur = parser->root.cursor; @@ -1235,50 +1257,62 @@ break; /* we stop when we find a `def' or `end' keyword */ - if ( *cur == 'd' && - cur + 3 < limit && - cur[1] == 'e' && - cur[2] == 'f' ) - break; - - if ( *cur == 'e' && - cur + 3 < limit && - cur[1] == 'n' && - cur[2] == 'd' ) - break; - - if ( *cur != '/' ) - T1_Skip_Alpha( parser ); - else + if ( cur + 3 < limit && is_space( cur[3] ) ) + { + if ( cur[0] == 'd' && + cur[1] == 'e' && + cur[2] == 'f' ) + break; + + if ( cur[0] == 'e' && + cur[1] == 'n' && + cur[2] == 'd' ) + break; + } + + T1_Skip_PS_Token( parser ); + + if ( *cur == '/' ) { - FT_Byte* cur2 = cur + 1; FT_PtrDist len; - while ( cur2 < limit && is_name_char( *cur2 ) ) - cur2++; - len = cur2 - cur - 1; + if ( cur + 1 >= limit ) + { + error = T1_Err_Invalid_File_Format; + goto Fail; + } - error = T1_Add_Table( name_table, n, cur + 1, len + 1 ); + cur++; /* skip `/' */ + len = parser->root.cursor - cur; + + if ( !read_binary_data( parser, &size, &base ) ) + return; + + /* for some non-standard fonts like `Optima' which provides */ + /* different outlines depending on the resolution it is */ + /* possible to get here twice */ + if ( loader->num_glyphs ) + continue; + + error = T1_Add_Table( name_table, n, cur, len + 1 ); if ( error ) goto Fail; /* add a trailing zero to the name table */ name_table->elements[n][len] = '\0'; - /* record index of /.notdef */ - if ( ft_strcmp( (const char*)".notdef", + /* record index of /.notdef */ + if ( *cur == '.' && + ft_strcmp( ".notdef", (const char*)(name_table->elements[n]) ) == 0 ) { notdef_index = n; notdef_found = 1; } - parser->root.cursor = cur2; - if ( !read_binary_data( parser, &size, &base ) ) - return; - - if ( face->type1.private_dict.lenIV >= 0 ) + if ( face->type1.private_dict.lenIV >= 0 && + n < num_glyphs + TABLE_EXTEND ) { FT_Byte* temp; @@ -1299,23 +1333,24 @@ goto Fail; n++; - if ( n >= loader->num_glyphs ) - break; } } - loader->num_glyphs = n; + if ( loader->num_glyphs ) + return; + else + loader->num_glyphs = n; - /* if /.notdef is found but does not occupy index 0, do our magic. */ + /* if /.notdef is found but does not occupy index 0, do our magic. */ if ( ft_strcmp( (const char*)".notdef", (const char*)name_table->elements[0] ) && notdef_found ) { - /* Swap glyph in index 0 with /.notdef glyph. First, add index 0 */ - /* name and code entries to swap_table. Then place notdef_index name */ - /* and code entries into swap_table. Then swap name and code */ - /* entries at indices notdef_index and 0 using values stored in */ - /* swap_table. */ + /* Swap glyph in index 0 with /.notdef glyph. First, add index 0 */ + /* name and code entries to swap_table. Then place notdef_index */ + /* name and code entries into swap_table. Then swap name and code */ + /* entries at indices notdef_index and 0 using values stored in */ + /* swap_table. */ /* Index 0 name */ error = T1_Add_Table( swap_table, 0, @@ -1377,7 +1412,7 @@ /* We take index 0 and add it to the end of the table(s) */ /* and add our own /.notdef glyph to index 0. */ - /* 0 333 hsbw endchar */ + /* 0 333 hsbw endchar */ FT_Byte notdef_glyph[] = {0x8B, 0xF7, 0xE1, 0x0D, 0x0E}; char* notdef_name = (char *)".notdef"; @@ -1426,6 +1461,14 @@ } + /*************************************************************************/ + /* */ + /* Define the token field static variables. This is a set of */ + /* T1_FieldRec variables. */ + /* */ + /*************************************************************************/ + + static const T1_FieldRec t1_keywords[] = { @@ -1443,7 +1486,6 @@ T1_FIELD_CALLBACK( "BlendDesignMap", parse_blend_design_map ) T1_FIELD_CALLBACK( "BlendAxisTypes", parse_blend_axis_types ) T1_FIELD_CALLBACK( "WeightVector", parse_weight_vector ) - T1_FIELD_CALLBACK( "shareddict", parse_shared_dict ) #endif { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0 } @@ -1462,121 +1504,190 @@ FT_Byte* keyword_flags ) { T1_Parser parser = &loader->parser; + FT_Byte *limit, *start_binary = NULL; + FT_Bool have_integer = 0; parser->root.cursor = base; parser->root.limit = base + size; - parser->root.error = 0; + parser->root.error = T1_Err_Ok; + limit = parser->root.limit; + + T1_Skip_Spaces( parser ); + + while ( parser->root.cursor < limit ) { - FT_Byte* cur = base; - FT_Byte* limit = cur + size; + FT_Byte* cur; - for ( ; cur < limit; cur++ ) + cur = parser->root.cursor; + + /* look for `FontDirectory' which causes problems for some fonts */ + if ( *cur == 'F' && cur + 25 < limit && + ft_strncmp( (char*)cur, "FontDirectory", 13 ) == 0 ) { - /* look for `FontDirectory', which causes problems on some fonts */ - if ( *cur == 'F' && cur + 25 < limit && - ft_strncmp( (char*)cur, "FontDirectory", 13 ) == 0 ) + FT_Byte* cur2; + + + /* skip the `FontDirectory' keyword */ + T1_Skip_PS_Token( parser ); + T1_Skip_Spaces ( parser ); + cur = cur2 = parser->root.cursor; + + /* look up the `known' keyword */ + while ( cur < limit ) { - FT_Byte* cur2; + if ( *cur == 'k' && cur + 5 < limit && + ft_strncmp( (char*)cur, "known", 5 ) == 0 ) + break; - - /* skip the `FontDirectory' keyword */ - cur += 13; - cur2 = cur; - - /* lookup the `known' keyword */ - while ( cur < limit && *cur != 'k' && - ft_strncmp( (char*)cur, "known", 5 ) ) - cur++; - - if ( cur < limit ) - { - T1_TokenRec token; - - - /* skip the `known' keyword and the token following it */ - cur += 5; - loader->parser.root.cursor = cur; - T1_ToToken( &loader->parser, &token ); - - /* if the last token was an array, skip it! */ - if ( token.type == T1_TOKEN_TYPE_ARRAY ) - cur2 = parser->root.cursor; - } - cur = cur2; + T1_Skip_PS_Token( parser ); + T1_Skip_Spaces ( parser ); + cur = parser->root.cursor; } - /* look for immediates */ - else if ( *cur == '/' && cur + 2 < limit ) + + if ( cur < limit ) { - FT_Byte* cur2; - FT_PtrDist len; + T1_TokenRec token; - cur++; - cur2 = cur; - while ( cur2 < limit && is_name_char( *cur2 ) ) - cur2++; + /* skip the `known' keyword and the token following it */ + T1_Skip_PS_Token( parser ); + T1_ToToken( parser, &token ); - len = cur2 - cur; - if ( len > 0 && len < 22 ) - { - { - /* now, compare the immediate name to the keyword table */ - T1_Field keyword = (T1_Field)t1_keywords; - FT_Byte* keyword_flag = keyword_flags; - - - for (;;) - { - FT_Byte* name; - - - name = (FT_Byte*)keyword->ident; - if ( !name ) - break; - - if ( cur[0] == name[0] && - len == ft_strlen( (const char*)name ) ) - { - FT_PtrDist n; - - - for ( n = 1; n < len; n++ ) - if ( cur[n] != name[n] ) - break; - - if ( n >= len ) - { - /* we found it -- run the parsing callback! */ - parser->root.cursor = cur2; - T1_Skip_Spaces( parser ); - - /* we only record the first instance of any */ - /* field to deal adequately with synthetic fonts */ - if ( keyword_flag[0] == 0 ) - { - parser->root.error = t1_load_keyword( face, - loader, - keyword ); - if ( parser->root.error ) - return parser->root.error; - } - keyword_flag[0] = 1; - - cur = parser->root.cursor; - break; - } - } - keyword++; - keyword_flag++; - } - } - } + /* if the last token was an array, skip it! */ + if ( token.type == T1_TOKEN_TYPE_ARRAY ) + cur2 = parser->root.cursor; } + parser->root.cursor = cur2; + have_integer = 0; } + + /* look for `eexec' */ + else if ( *cur == 'e' && cur + 5 < limit && + ft_strncmp( (char*)cur, "eexec", 5 ) == 0 ) + break; + + /* look for `closefile' which ends the eexec section */ + else if ( *cur == 'c' && cur + 9 < limit && + ft_strncmp( (char*)cur, "closefile", 9 ) == 0 ) + break; + + /* check whether we have an integer */ + else if ( ft_isdigit( *cur ) ) + { + start_binary = cur; + T1_Skip_PS_Token( parser ); + have_integer = 1; + } + + /* in valid Type 1 fonts we don't see `RD' or `-|' directly */ + /* since those tokens are handled by parse_subrs and */ + /* parse_charstrings */ + else if ( *cur == 'R' && cur + 6 < limit && *(cur + 1) == 'D' && + have_integer ) + { + FT_Long s; + FT_Byte* b; + + + parser->root.cursor = start_binary; + if ( !read_binary_data( parser, &s, &b ) ) + return T1_Err_Invalid_File_Format; + have_integer = 0; + } + + else if ( *cur == '-' && cur + 6 < limit && *(cur + 1) == '|' && + have_integer ) + { + FT_Long s; + FT_Byte* b; + + + parser->root.cursor = start_binary; + if ( !read_binary_data( parser, &s, &b ) ) + return T1_Err_Invalid_File_Format; + have_integer = 0; + } + + /* look for immediates */ + else if ( *cur == '/' && cur + 2 < limit ) + { + FT_PtrDist len; + + + cur++; + + parser->root.cursor = cur; + T1_Skip_PS_Token( parser ); + + len = parser->root.cursor - cur; + + if ( len > 0 && len < 22 && parser->root.cursor < limit ) + { + /* now compare the immediate name to the keyword table */ + T1_Field keyword = (T1_Field)t1_keywords; + FT_Byte* keyword_flag = keyword_flags; + + + for (;;) + { + FT_Byte* name; + + + name = (FT_Byte*)keyword->ident; + if ( !name ) + break; + + if ( cur[0] == name[0] && + len == ft_strlen( (const char *)name ) && + ft_memcmp( cur, name, len ) == 0 ) + { + /* We found it -- run the parsing callback! */ + /* We only record the first instance of any */ + /* field to deal adequately with synthetic */ + /* fonts; /Subrs and /CharStrings are */ + /* handled specially. */ + if ( keyword_flag[0] == 0 || + ft_strcmp( (const char*)name, "Subrs" ) == 0 || + ft_strcmp( (const char*)name, "CharStrings") == 0 ) + { + parser->root.error = t1_load_keyword( face, + loader, + keyword ); + if ( parser->root.error == T1_Err_Ok ) + keyword_flag[0] = 1; + else + { + if ( FT_ERROR_BASE( parser->root.error ) == FT_Err_Ignore ) + parser->root.error = T1_Err_Ok; + else + return parser->root.error; + } + } + break; + } + + keyword++; + keyword_flag++; + } + } + + have_integer = 0; + } + else + { + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + goto Exit; + have_integer = 0; + } + + T1_Skip_Spaces( parser ); } + + Exit: return parser->root.error; } @@ -1625,6 +1736,7 @@ T1_LoaderRec loader; T1_Parser parser; T1_Font type1 = &face->type1; + PS_Private priv = &type1->private_dict; FT_Error error; FT_Byte keyword_flags[T1_FIELD_COUNT]; @@ -1633,11 +1745,12 @@ t1_init_loader( &loader, face ); - /* default lenIV */ - type1->private_dict.lenIV = 4; - - /* default blue fuzz, we put it there since 0 is a valid value */ - type1->private_dict.blue_fuzz = 1; + /* default values */ + priv->blue_shift = 7; + priv->blue_fuzz = 1; + priv->lenIV = 4; + priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L ); + priv->blue_scale = (FT_Fixed)( 0.039625 * 0x10000L * 1000 ); parser = &loader.parser; error = T1_New_Parser( parser, @@ -1670,6 +1783,30 @@ if ( error ) goto Exit; +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + + /* the following can happen for MM instances; we then treat the */ + /* font as a normal PS font */ + if ( face->blend && + ( !face->blend->num_designs || !face->blend->num_axis ) ) + T1_Done_Blend( face ); + + /* another safety check */ + if ( face->blend ) + { + FT_UInt i; + + + for ( i = 0; i < face->blend->num_axis; i++ ) + if ( !face->blend->design_map[i].num_points ) + { + T1_Done_Blend( face ); + break; + } + } + +#endif /* T1_CONFIG_OPTION_NO_MM_SUPPORT */ + /* now, propagate the subrs, charstrings, and glyphnames tables */ /* to the Type1 data */ type1->num_glyphs = loader.num_glyphs; @@ -1688,7 +1825,7 @@ #endif if ( !loader.charstrings.init ) { - FT_ERROR(( "T1_Open_Face: no charstrings array in face!\n" )); + FT_ERROR(( "T1_Open_Face: no `/CharStrings' array in face!\n" )); error = T1_Err_Invalid_File_Format; } @@ -1742,16 +1879,21 @@ if ( ft_strcmp( (const char*)".notdef", (const char*)glyph_name ) != 0 ) { - if ( charcode < min_char ) min_char = charcode; - if ( charcode > max_char ) max_char = charcode; + if ( charcode < min_char ) + min_char = charcode; + if ( charcode > max_char ) + max_char = charcode; } break; } } } - /* Yes, this happens: Certain PDF-embedded fonts have only a ".notdef" - * glyph defined! + + /* + * Yes, this happens: Certain PDF-embedded fonts have only a + * `.notdef' glyph defined! */ + if ( min_char > max_char ) { min_char = 0; diff --git a/reactos/lib/freetype/src/type1/t1objs.c b/reactos/lib/freetype/src/type1/t1objs.c index c62e72b7e12..a832ee00023 100644 --- a/reactos/lib/freetype/src/type1/t1objs.c +++ b/reactos/lib/freetype/src/type1/t1objs.c @@ -4,7 +4,7 @@ /* */ /* Type 1 objects manager (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -19,6 +19,7 @@ #include <ft2build.h> #include FT_INTERNAL_DEBUG_H #include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_IDS_H #include "t1gload.h" #include "t1load.h" @@ -29,7 +30,7 @@ #include "t1afm.h" #endif -#include FT_INTERNAL_POSTSCRIPT_NAMES_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H #include FT_INTERNAL_POSTSCRIPT_AUX_H @@ -229,9 +230,6 @@ FT_FREE( type1->encoding.char_name ); FT_FREE( type1->font_name ); - FT_FREE( type1->paint_type ); - FT_FREE( type1->stroke_width ); - #ifndef T1_CONFIG_OPTION_NO_AFM /* release afm data if present */ if ( face->afm_data ) @@ -278,11 +276,11 @@ FT_Int num_params, FT_Parameter* params ) { - FT_Error error; - PSNames_Service psnames; - PSAux_Service psaux; - T1_Font type1 = &face->type1; - PS_FontInfo info = &type1->font_info; + FT_Error error; + FT_Service_PsCMaps psnames; + PSAux_Service psaux; + T1_Font type1 = &face->type1; + PS_FontInfo info = &type1->font_info; FT_UNUSED( num_params ); FT_UNUSED( params ); @@ -292,9 +290,8 @@ face->root.num_faces = 1; - face->psnames = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), - "psnames" ); - psnames = (PSNames_Service)face->psnames; + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + face->psnames = psnames; face->psaux = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), "psaux" ); @@ -434,8 +431,8 @@ root->max_advance_height = root->height; - root->underline_position = info->underline_position >> 16; - root->underline_thickness = info->underline_thickness >> 16; + root->underline_position = (FT_Short)info->underline_position; + root->underline_thickness = (FT_Short)info->underline_thickness; root->internal->max_points = 0; root->internal->max_contours = 0; @@ -469,25 +466,25 @@ { case T1_ENCODING_TYPE_STANDARD: charmap.encoding = FT_ENCODING_ADOBE_STANDARD; - charmap.encoding_id = 0; + charmap.encoding_id = TT_ADOBE_ID_STANDARD; clazz = cmap_classes->standard; break; case T1_ENCODING_TYPE_EXPERT: charmap.encoding = FT_ENCODING_ADOBE_EXPERT; - charmap.encoding_id = 1; + charmap.encoding_id = TT_ADOBE_ID_EXPERT; clazz = cmap_classes->expert; break; case T1_ENCODING_TYPE_ARRAY: charmap.encoding = FT_ENCODING_ADOBE_CUSTOM; - charmap.encoding_id = 2; + charmap.encoding_id = TT_ADOBE_ID_CUSTOM; clazz = cmap_classes->custom; break; case T1_ENCODING_TYPE_ISOLATIN1: charmap.encoding = FT_ENCODING_ADOBE_LATIN_1; - charmap.encoding_id = 3; + charmap.encoding_id = TT_ADOBE_ID_LATIN_1; clazz = cmap_classes->unicode; break; diff --git a/reactos/lib/freetype/src/type1/t1parse.c b/reactos/lib/freetype/src/type1/t1parse.c index c1783f02936..544aa093f8d 100644 --- a/reactos/lib/freetype/src/type1/t1parse.c +++ b/reactos/lib/freetype/src/type1/t1parse.c @@ -4,7 +4,7 @@ /* */ /* Type 1 parser (body). */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -65,53 +65,30 @@ /*************************************************************************/ -#define IS_T1_WHITESPACE( c ) ( (c) == ' ' || (c) == '\t' ) -#define IS_T1_LINESPACE( c ) ( (c) == '\r' || (c) == '\n' ) - -#define IS_T1_SPACE( c ) ( IS_T1_WHITESPACE( c ) || IS_T1_LINESPACE( c ) ) - - - typedef struct PFB_Tag_ + static FT_Error + read_pfb_tag( FT_Stream stream, + FT_UShort *atag, + FT_Long *asize ) { + FT_Error error; FT_UShort tag; FT_Long size; - } PFB_Tag; + *atag = 0; + *asize = 0; -#undef FT_STRUCTURE -#define FT_STRUCTURE PFB_Tag - - - static - const FT_Frame_Field pfb_tag_fields[] = - { - FT_FRAME_START( 6 ), - FT_FRAME_USHORT ( tag ), - FT_FRAME_LONG_LE( size ), - FT_FRAME_END - }; - - - static FT_Error - read_pfb_tag( FT_Stream stream, - FT_UShort* tag, - FT_Long* size ) - { - FT_Error error; - PFB_Tag head; - - - *tag = 0; - *size = 0; - if ( !FT_STREAM_READ_FIELDS( pfb_tag_fields, &head ) ) + if ( !FT_READ_USHORT( tag ) ) { - if ( head.tag == 0x8001U || head.tag == 0x8002U ) + if ( tag == 0x8001U || tag == 0x8002U ) { - *tag = head.tag; - *size = head.size; + if ( !FT_READ_LONG_LE( size ) ) + *asize = size; } + + *atag = tag; } + return error; } @@ -127,7 +104,7 @@ FT_Long size; - psaux->ps_parser_funcs->init( &parser->root,0, 0, memory ); + psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory ); parser->stream = stream; parser->base_len = 0; @@ -242,36 +219,13 @@ } - /* return the value of an hexadecimal digit */ - static int - hexa_value( char c ) - { - unsigned int d; - - - d = (unsigned int)( c - '0' ); - if ( d <= 9 ) - return (int)d; - - d = (unsigned int)( c - 'a' ); - if ( d <= 5 ) - return (int)( d + 10 ); - - d = (unsigned int)( c - 'A' ); - if ( d <= 5 ) - return (int)( d + 10 ); - - return -1; - } - - FT_LOCAL_DEF( FT_Error ) T1_Get_Private_Dict( T1_Parser parser, PSAux_Service psaux ) { FT_Stream stream = parser->stream; FT_Memory memory = parser->root.memory; - FT_Error error = 0; + FT_Error error = T1_Err_Ok; FT_Long size; @@ -325,7 +279,8 @@ break; } - if ( FT_STREAM_READ( parser->private_dict + parser->private_len, size ) ) + if ( FT_STREAM_READ( parser->private_dict + parser->private_len, + size ) ) goto Fail; parser->private_len += size; @@ -333,9 +288,9 @@ } else { - /* we have already `loaded' the whole PFA font file into memory; */ + /* We have already `loaded' the whole PFA font file into memory; */ /* if this is a memory resource, allocate a new block to hold */ - /* the private dict. Otherwise, simply overwrite into the base */ + /* the private dict. Otherwise, simply overwrite into the base */ /* dictionary block in the heap. */ /* first of all, look at the `eexec' keyword */ @@ -344,24 +299,18 @@ FT_Byte c; + Again: for (;;) { c = cur[0]; if ( c == 'e' && cur + 9 < limit ) /* 9 = 5 letters for `eexec' + */ /* newline + 4 chars */ { - if ( cur[1] == 'e' && cur[2] == 'x' && - cur[3] == 'e' && cur[4] == 'c' ) - { - cur += 6; /* we skip the newling after the `eexec' */ - - /* XXX: Some fonts use DOS-linefeeds, i.e. \r\n; we need to */ - /* skip the extra \n if we find it */ - if ( cur[0] == '\n' ) - cur++; - + if ( cur[1] == 'e' && + cur[2] == 'x' && + cur[3] == 'e' && + cur[4] == 'c' ) break; - } } cur++; if ( cur >= limit ) @@ -373,10 +322,57 @@ } } + /* check whether `eexec' was real -- it could be in a comment */ + /* or string (as e.g. in u003043t.gsf from ghostscript) */ + + parser->root.cursor = parser->base_dict; + parser->root.limit = cur + 9; + + cur = parser->root.cursor; + limit = parser->root.limit; + + while ( cur < limit ) + { + if ( *cur == 'e' && ft_strncmp( (char*)cur, "eexec", 5 ) == 0 ) + goto Found; + + T1_Skip_PS_Token( parser ); + T1_Skip_Spaces ( parser ); + cur = parser->root.cursor; + } + + /* we haven't found the correct `eexec'; go back and continue */ + /* searching */ + + cur = limit; + limit = parser->base_dict + parser->base_len; + goto Again; + /* now determine where to write the _encrypted_ binary private */ /* dictionary. We overwrite the base dictionary for disk-based */ /* resources and allocate a new block otherwise */ + Found: + parser->root.limit = parser->base_dict + parser->base_len; + + T1_Skip_PS_Token( parser ); + cur = parser->root.cursor; + if ( *cur == '\r' ) + { + cur++; + if ( *cur == '\n' ) + cur++; + } + else if ( *cur == '\n' ) + cur++; + else + { + FT_ERROR(( "T1_Get_Private_Dict:" )); + FT_ERROR(( " `eexec' not properly terminated\n" )); + error = T1_Err_Invalid_File_Format; + goto Exit; + } + size = (FT_Long)( parser->base_len - ( cur - parser->base_dict ) ); if ( parser->in_memory ) @@ -402,51 +398,38 @@ /* the `eexec' keyword); if they all are hexadecimal digits, then */ /* we have a case of ASCII storage */ - if ( ( hexa_value( cur[0] ) | hexa_value( cur[1] ) | - hexa_value( cur[2] ) | hexa_value( cur[3] ) ) < 0 ) - - /* binary encoding -- `simply' copy the private dict */ - FT_MEM_COPY( parser->private_dict, cur, size ); - - else + if ( ft_isxdigit( cur[0] ) && ft_isxdigit( cur[1] ) && + ft_isxdigit( cur[2] ) && ft_isxdigit( cur[3] ) ) { /* ASCII hexadecimal encoding */ - - FT_Byte* write; - FT_Int count; + FT_Long len; - write = parser->private_dict; - count = 0; - - for ( ;cur < limit; cur++ ) - { - int hex1; - - - /* check for newline */ - if ( cur[0] == '\r' || cur[0] == '\n' ) - continue; - - /* exit if we have a non-hexadecimal digit that isn't a newline */ - hex1 = hexa_value( cur[0] ); - if ( hex1 < 0 || cur + 1 >= limit ) - break; - - /* otherwise, store byte */ - *write++ = (FT_Byte)( ( hex1 << 4 ) | hexa_value( cur[1] ) ); - count++; - cur++; - } + parser->root.cursor = cur; + (void)psaux->ps_parser_funcs->to_bytes( &parser->root, + parser->private_dict, + parser->private_len, + &len, + 0 ); + parser->private_len = len; /* put a safeguard */ - parser->private_len = write - parser->private_dict; - *write++ = 0; + parser->private_dict[len] = '\0'; } + else + /* binary encoding -- copy the private dict */ + FT_MEM_MOVE( parser->private_dict, cur, size ); } /* we now decrypt the encoded binary private dictionary */ psaux->t1_decrypt( parser->private_dict, parser->private_len, 55665U ); + + /* replace the four random bytes at the beginning with whitespace */ + parser->private_dict[0] = ' '; + parser->private_dict[1] = ' '; + parser->private_dict[2] = ' '; + parser->private_dict[3] = ' '; + parser->root.base = parser->private_dict; parser->root.cursor = parser->private_dict; parser->root.limit = parser->root.cursor + parser->private_len; diff --git a/reactos/lib/freetype/src/type1/t1parse.h b/reactos/lib/freetype/src/type1/t1parse.h index ecc206739ef..6fa4ca624a2 100644 --- a/reactos/lib/freetype/src/type1/t1parse.h +++ b/reactos/lib/freetype/src/type1/t1parse.h @@ -4,7 +4,7 @@ /* */ /* Type 1 parser (specification). */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 1996-2001, 2002, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -69,9 +69,9 @@ FT_BEGIN_HEADER FT_Byte* private_dict; FT_Long private_len; - FT_Byte in_pfb; - FT_Byte in_memory; - FT_Byte single_block; + FT_Bool in_pfb; + FT_Bool in_memory; + FT_Bool single_block; } T1_ParserRec, *T1_Parser; @@ -91,8 +91,8 @@ FT_BEGIN_HEADER } while ( 0 ) -#define T1_Skip_Spaces( p ) (p)->root.funcs.skip_spaces( &(p)->root ) -#define T1_Skip_Alpha( p ) (p)->root.funcs.skip_alpha ( &(p)->root ) +#define T1_Skip_Spaces( p ) (p)->root.funcs.skip_spaces( &(p)->root ) +#define T1_Skip_PS_Token( p ) (p)->root.funcs.skip_PS_token( &(p)->root ) #define T1_ToInt( p ) (p)->root.funcs.to_int( &(p)->root ) #define T1_ToFixed( p, t ) (p)->root.funcs.to_fixed( &(p)->root, t ) diff --git a/reactos/lib/freetype/src/type1/t1tokens.h b/reactos/lib/freetype/src/type1/t1tokens.h index 23e04118327..a3cc952e00b 100644 --- a/reactos/lib/freetype/src/type1/t1tokens.h +++ b/reactos/lib/freetype/src/type1/t1tokens.h @@ -4,7 +4,7 @@ /* */ /* Type 1 tokenizer (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -60,6 +60,8 @@ T1_FIELD_NUM_TABLE ( "StemSnapH", snap_widths, 12 ) T1_FIELD_NUM_TABLE ( "StemSnapV", snap_heights, 12 ) + T1_FIELD_FIXED ( "ExpansionFactor", expansion_factor ) + #undef FT_STRUCTURE #define FT_STRUCTURE T1_FontRec diff --git a/reactos/lib/freetype/src/type42/t42drivr.c b/reactos/lib/freetype/src/type42/t42drivr.c index d9668775c9c..2afe2db84be 100644 --- a/reactos/lib/freetype/src/type42/t42drivr.c +++ b/reactos/lib/freetype/src/type42/t42drivr.c @@ -4,7 +4,7 @@ /* */ /* High-level Type 42 driver interface (body). */ /* */ -/* Copyright 2002, 2003 by Roberto Alameda. */ +/* Copyright 2002, 2003, 2004 by Roberto Alameda. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ @@ -24,10 +24,9 @@ /* 2) Incremental fonts making use of the GlyphDirectory keyword */ /* will be loaded, but the rendering will be using the TrueType */ /* tables. */ - /* 3) The sfnts array is expected to be ASCII, not binary. */ - /* 4) As for Type1 fonts, CDevProc is not supported. */ - /* 5) The Metrics dictionary is not supported. */ - /* 6) AFM metrics are not supported. */ + /* 3) As for Type1 fonts, CDevProc is not supported. */ + /* 4) The Metrics dictionary is not supported. */ + /* 5) AFM metrics are not supported. */ /* */ /* In other words, this driver supports Type42 fonts derived from */ /* TrueType fonts in a non-CID manner, as done by usual conversion */ @@ -41,11 +40,21 @@ #include "t42error.h" #include FT_INTERNAL_DEBUG_H +#include FT_SERVICE_XFREE86_NAME_H +#include FT_SERVICE_GLYPH_DICT_H +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_POSTSCRIPT_INFO_H #undef FT_COMPONENT #define FT_COMPONENT trace_t42 + /* + * + * GLYPH DICT SERVICE + * + */ + static FT_Error t42_get_glyph_name( T42_Face face, FT_UInt glyph_index, @@ -73,13 +82,6 @@ } - static const char* - t42_get_ps_name( T42_Face face ) - { - return (const char*)face->type1.font_name; - } - - static FT_UInt t42_get_name_index( T42_Face face, FT_String* glyph_name ) @@ -93,30 +95,92 @@ gname = face->type1.glyph_names[i]; if ( !ft_strcmp( glyph_name, gname ) ) - return ft_atoi( (const char *)face->type1.charstrings[i] ); + return (FT_UInt)ft_atol( (const char *)face->type1.charstrings[i] ); } return 0; } + static const FT_Service_GlyphDictRec t42_service_glyph_dict = + { + (FT_GlyphDict_GetNameFunc) t42_get_glyph_name, + (FT_GlyphDict_NameIndexFunc)t42_get_name_index + }; + + + /* + * + * POSTSCRIPT NAME SERVICE + * + */ + + static const char* + t42_get_ps_font_name( T42_Face face ) + { + return (const char*)face->type1.font_name; + } + + + static const FT_Service_PsFontNameRec t42_service_ps_font_name = + { + (FT_PsName_GetFunc)t42_get_ps_font_name + }; + + + /* + * + * POSTSCRIPT INFO SERVICE + * + */ + + static FT_Error + t42_ps_get_font_info( FT_Face face, + PS_FontInfoRec* afont_info ) + { + *afont_info = ((T42_Face)face)->type1.font_info; + return 0; + } + + + static FT_Int + t42_ps_has_glyph_names( FT_Face face ) + { + FT_UNUSED( face ); + return 1; + } + + + static const FT_Service_PsInfoRec t42_service_ps_info = + { + (PS_GetFontInfoFunc) t42_ps_get_font_info, + (PS_HasGlyphNamesFunc)t42_ps_has_glyph_names + }; + + + /* + * + * SERVICE LIST + * + */ + + static const FT_ServiceDescRec t42_services[] = + { + { FT_SERVICE_ID_GLYPH_DICT, &t42_service_glyph_dict }, + { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &t42_service_ps_font_name }, + { FT_SERVICE_ID_POSTSCRIPT_INFO, &t42_service_ps_info }, + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_TYPE_42 }, + { NULL, NULL } + }; + + static FT_Module_Interface T42_Get_Interface( FT_Driver driver, const FT_String* t42_interface ) { FT_UNUSED( driver ); - /* Any additional interface are defined here */ - if (ft_strcmp( (const char*)t42_interface, "glyph_name" ) == 0 ) - return (FT_Module_Interface)t42_get_glyph_name; - - if ( ft_strcmp( (const char*)t42_interface, "name_index" ) == 0 ) - return (FT_Module_Interface)t42_get_name_index; - - if ( ft_strcmp( (const char*)t42_interface, "postscript_name" ) == 0 ) - return (FT_Module_Interface)t42_get_ps_name; - - return 0; + return ft_service_list_lookup( t42_services, t42_interface ); } diff --git a/reactos/lib/freetype/src/type42/t42objs.c b/reactos/lib/freetype/src/type42/t42objs.c index bb4120571e4..8837136ff26 100644 --- a/reactos/lib/freetype/src/type42/t42objs.c +++ b/reactos/lib/freetype/src/type42/t42objs.c @@ -4,7 +4,7 @@ /* */ /* Type 42 objects manager (body). */ /* */ -/* Copyright 2002, 2003 by Roberto Alameda. */ +/* Copyright 2002, 2003, 2004 by Roberto Alameda. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ @@ -53,7 +53,8 @@ if ( error ) goto Exit; - error = t42_parse_dict( face, &loader, parser->base_dict, parser->base_len ); + error = t42_parse_dict( face, &loader, + parser->base_dict, parser->base_len ); if ( type1->font_type != 42 ) { @@ -65,7 +66,8 @@ /* to the Type1 data */ type1->num_glyphs = loader.num_glyphs; - if ( !loader.charstrings.init ) { + if ( !loader.charstrings.init ) + { FT_ERROR(( "T42_Open_Face: no charstrings array in face!\n" )); error = T42_Err_Invalid_File_Format; } @@ -121,8 +123,10 @@ if ( ft_strcmp( (const char*)".notdef", (const char*)glyph_name ) != 0 ) { - if ( charcode < min_char ) min_char = charcode; - if ( charcode > max_char ) max_char = charcode; + if ( charcode < min_char ) + min_char = charcode; + if ( charcode > max_char ) + max_char = charcode; } break; } @@ -149,12 +153,12 @@ FT_Int num_params, FT_Parameter* params ) { - FT_Error error; - PSNames_Service psnames; - PSAux_Service psaux; - FT_Face root = (FT_Face)&face->root; - T1_Font type1 = &face->type1; - PS_FontInfo info = &type1->font_info; + FT_Error error; + FT_Service_PsCMaps psnames; + PSAux_Service psaux; + FT_Face root = (FT_Face)&face->root; + T1_Font type1 = &face->type1; + PS_FontInfo info = &type1->font_info; FT_UNUSED( num_params ); FT_UNUSED( params ); @@ -165,9 +169,8 @@ face->ttf_face = NULL; face->root.num_faces = 1; - face->psnames = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), - "psnames" ); - psnames = (PSNames_Service)face->psnames; + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + face->psnames = psnames; face->psaux = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), "psaux" ); @@ -190,7 +193,7 @@ goto Exit; } - /* Now, load the font program into the face object */ + /* Now load the font program into the face object */ /* Init the face object fields */ /* Now set up root face fields */ @@ -278,8 +281,8 @@ root->max_advance_width = face->ttf_face->max_advance_width; root->max_advance_height = face->ttf_face->max_advance_height; - root->underline_position = info->underline_position >> 16; - root->underline_thickness = info->underline_thickness >> 16; + root->underline_position = (FT_Short)info->underline_position; + root->underline_thickness = (FT_Short)info->underline_thickness; root->internal->max_points = 0; root->internal->max_contours = 0; @@ -351,7 +354,7 @@ #if 0 /* Select default charmap */ - if (root->num_charmaps) + if ( root->num_charmaps ) root->charmap = root->charmaps[0]; #endif } @@ -398,9 +401,6 @@ FT_FREE( type1->encoding.char_name ); FT_FREE( type1->font_name ); - FT_FREE( type1->paint_type ); - FT_FREE( type1->stroke_width ); - FT_FREE( face->ttf_data ); #if 0 @@ -453,8 +453,6 @@ } - - FT_LOCAL_DEF( FT_Error ) T42_Size_Init( T42_Size size ) { @@ -602,7 +600,7 @@ FT_LOCAL_DEF( FT_Error ) T42_GlyphSlot_Load( FT_GlyphSlot glyph, FT_Size size, - FT_Int glyph_index, + FT_UInt glyph_index, FT_Int32 load_flags ) { FT_Error error; diff --git a/reactos/lib/freetype/src/type42/t42objs.h b/reactos/lib/freetype/src/type42/t42objs.h index 6fb176917ee..623809573e3 100644 --- a/reactos/lib/freetype/src/type42/t42objs.h +++ b/reactos/lib/freetype/src/type42/t42objs.h @@ -4,7 +4,7 @@ /* */ /* Type 42 objects manager (specification). */ /* */ -/* Copyright 2002 by Roberto Alameda. */ +/* Copyright 2002, 2003 by Roberto Alameda. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ @@ -22,10 +22,10 @@ #include FT_FREETYPE_H #include FT_TYPE1_TABLES_H #include FT_INTERNAL_TYPE1_TYPES_H -#include FT_INTERNAL_TYPE42_TYPES_H +#include "t42types.h" #include FT_INTERNAL_OBJECTS_H #include FT_INTERNAL_DRIVER_H -#include FT_INTERNAL_POSTSCRIPT_NAMES_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H #include FT_INTERNAL_POSTSCRIPT_HINTS_H @@ -102,7 +102,7 @@ FT_BEGIN_HEADER FT_LOCAL( FT_Error ) T42_GlyphSlot_Load( FT_GlyphSlot glyph, FT_Size size, - FT_Int glyph_index, + FT_UInt glyph_index, FT_Int32 load_flags ); FT_LOCAL( void ) diff --git a/reactos/lib/freetype/src/type42/t42parse.c b/reactos/lib/freetype/src/type42/t42parse.c index ae4b7fcd57d..ff53a3eb444 100644 --- a/reactos/lib/freetype/src/type42/t42parse.c +++ b/reactos/lib/freetype/src/type42/t42parse.c @@ -4,7 +4,7 @@ /* */ /* Type 42 font parser (body). */ /* */ -/* Copyright 2002, 2003 by Roberto Alameda. */ +/* Copyright 2002, 2003, 2004 by Roberto Alameda. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ @@ -93,10 +93,6 @@ }; -#define T42_KEYWORD_COUNT \ - ( sizeof ( t42_keywords ) / sizeof ( t42_keywords[0] ) ) - - #define T1_Add_Table( p, i, o, l ) (p)->funcs.add( (p), i, o, l ) #define T1_Done_Table( p ) \ do \ @@ -111,20 +107,18 @@ (p)->funcs.release( p ); \ } while ( 0 ) -#define T1_Skip_Spaces( p ) (p)->root.funcs.skip_spaces( &(p)->root ) -#define T1_Skip_Alpha( p ) (p)->root.funcs.skip_alpha ( &(p)->root ) +#define T1_Skip_Spaces( p ) (p)->root.funcs.skip_spaces( &(p)->root ) +#define T1_Skip_PS_Token( p ) (p)->root.funcs.skip_PS_token( &(p)->root ) -#define T1_ToInt( p ) (p)->root.funcs.to_int( &(p)->root ) -#define T1_ToFixed( p, t ) (p)->root.funcs.to_fixed( &(p)->root, t ) +#define T1_ToInt( p ) \ + (p)->root.funcs.to_int( &(p)->root ) +#define T1_ToBytes( p, b, m, n, d ) \ + (p)->root.funcs.to_bytes( &(p)->root, b, m, n, d ) -#define T1_ToCoordArray( p, m, c ) \ - (p)->root.funcs.to_coord_array( &(p)->root, m, c ) #define T1_ToFixedArray( p, m, f, t ) \ (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t ) #define T1_ToToken( p, t ) \ (p)->root.funcs.to_token( &(p)->root, t ) -#define T1_ToTokenArray( p, t, m, c ) \ - (p)->root.funcs.to_token_array( &(p)->root, t, m, c ) #define T1_Load_Field( p, f, o, m, pf ) \ (p)->root.funcs.load_field( &(p)->root, f, o, m, pf ) @@ -158,8 +152,8 @@ /* When creating a new Type 42 parser, we try to locate and load */ /* the base dictionary, loading the whole font into memory. */ /* */ - /* When `loading' the base dictionary, we only setup pointers in */ - /* the case of a memory-based stream. Otherwise, we allocate */ + /* When `loading' the base dictionary, we only set up pointers */ + /* in the case of a memory-based stream. Otherwise, we allocate */ /* and load the base dictionary in it. */ /* */ /* parser->in_memory is set if we have a memory stream. */ @@ -195,9 +189,9 @@ } /* Now check font format; we must see `%!PS-TrueTypeFont' */ - if (size <= 17 || - ( ft_strncmp( (const char*)parser->base_dict, - "%!PS-TrueTypeFont", 17) ) ) + if ( size <= 17 || + ( ft_strncmp( (const char*)parser->base_dict, + "%!PS-TrueTypeFont", 17 ) ) ) error = T42_Err_Unknown_File_Format; else { @@ -228,24 +222,12 @@ } - static int - t42_is_alpha( FT_Byte c ) - { - /* Note: we must accept "+" as a valid character, as it is used in */ - /* embedded type1 fonts in PDF documents. */ - /* */ - return ( ft_isalnum( c ) || - c == '.' || - c == '_' || - c == '-' || - c == '+' ); - } - - static int t42_is_space( FT_Byte c ) { - return ( c == ' ' || c == '\t' || c == '\r' || c == '\n' ); + return ( c == ' ' || c == '\t' || + c == '\r' || c == '\n' || c == '\f' || + c == '\0' ); } @@ -263,7 +245,7 @@ (void)T1_ToFixedArray( parser, 6, temp, 3 ); - temp_scale = ABS( temp[3] ); + temp_scale = FT_ABS( temp[3] ); /* Set Units per EM based on FontMatrix values. We set the value to */ /* 1000 / temp_scale, because temp_scale was already multiplied by */ @@ -288,8 +270,8 @@ matrix->yy = temp[3]; /* note that the offsets must be expressed in integer font units */ - offset->x = temp[4] >> 16; - offset->y = temp[5] >> 16; + offset->x = temp[4] >> 16; + offset->y = temp[5] >> 16; } @@ -297,45 +279,52 @@ t42_parse_encoding( T42_Face face, T42_Loader loader ) { - T42_Parser parser = &loader->parser; - FT_Byte* cur = parser->root.cursor; - FT_Byte* limit = parser->root.limit; + T42_Parser parser = &loader->parser; + FT_Byte* cur; + FT_Byte* limit = parser->root.limit; PSAux_Service psaux = (PSAux_Service)face->psaux; - /* skip whitespace */ - while ( t42_is_space( *cur ) ) + T1_Skip_Spaces( parser ); + cur = parser->root.cursor; + if ( cur >= limit ) { - cur++; - if ( cur >= limit ) - { - FT_ERROR(( "t42_parse_encoding: out of bounds!\n" )); - parser->root.error = T42_Err_Invalid_File_Format; - return; - } + FT_ERROR(( "t42_parse_encoding: out of bounds!\n" )); + parser->root.error = T42_Err_Invalid_File_Format; + return; } - /* if we have a number, then the encoding is an array, */ - /* and we must load it now */ - if ( (FT_Byte)( *cur - '0' ) < 10 ) + /* if we have a number or `[', the encoding is an array, */ + /* and we must load it now */ + if ( ft_isdigit( *cur ) || *cur == '[' ) { - T1_Encoding encode = &face->type1.encoding; - FT_Int count, n; - PS_Table char_table = &loader->encoding_table; - FT_Memory memory = parser->root.memory; + T1_Encoding encode = &face->type1.encoding; + FT_UInt count, n; + PS_Table char_table = &loader->encoding_table; + FT_Memory memory = parser->root.memory; FT_Error error; + FT_Bool only_immediates = 0; - /* read the number of entries in the encoding, should be 256 */ - count = (FT_Int)T1_ToInt( parser ); - if ( parser->root.error ) + /* read the number of entries in the encoding; should be 256 */ + if ( *cur == '[' ) + { + count = 256; + only_immediates = 1; + parser->root.cursor++; + } + else + count = (FT_UInt)T1_ToInt( parser ); + + T1_Skip_Spaces( parser ); + if ( parser->root.cursor >= limit ) return; /* we use a T1_Table to store our charnames */ loader->num_chars = encode->num_chars = count; - if ( FT_NEW_ARRAY( encode->char_index, count ) || - FT_NEW_ARRAY( encode->char_name, count ) || + if ( FT_NEW_ARRAY( encode->char_index, count ) || + FT_NEW_ARRAY( encode->char_name, count ) || FT_SET_ERROR( psaux->ps_table_funcs->init( char_table, count, memory ) ) ) { @@ -352,86 +341,99 @@ T1_Add_Table( char_table, n, notdef, 8 ); } - /* Now, we will need to read a record of the form */ - /* ... charcode /charname ... for each entry in our table */ + /* Now we need to read records of the form */ + /* */ + /* ... charcode /charname ... */ + /* */ + /* for each entry in our table. */ /* */ /* We simply look for a number followed by an immediate */ /* name. Note that this ignores correctly the sequence */ - /* that is often seen in type1 fonts: */ + /* that is often seen in type42 fonts: */ /* */ /* 0 1 255 { 1 index exch /.notdef put } for dup */ /* */ /* used to clean the encoding array before anything else. */ /* */ - /* We stop when we encounter a `def'. */ + /* Alternatively, if the array is directly given as */ + /* */ + /* /Encoding [ ... ] */ + /* */ + /* we only read immediates. */ - cur = parser->root.cursor; - limit = parser->root.limit; - n = 0; + n = 0; + T1_Skip_Spaces( parser ); - for ( ; cur < limit; ) + while ( parser->root.cursor < limit ) { - FT_Byte c; + cur = parser->root.cursor; - - c = *cur; - - /* we stop when we encounter a `def' */ - if ( c == 'd' && cur + 3 < limit ) + /* we stop when we encounter `def' or `]' */ + if ( *cur == 'd' && cur + 3 < limit ) { - if ( cur[1] == 'e' && - cur[2] == 'f' && - t42_is_space( cur[-1] ) && - t42_is_space( cur[3] ) ) + if ( cur[1] == 'e' && + cur[2] == 'f' && + t42_is_space( cur[3] ) ) { FT_TRACE6(( "encoding end\n" )); + cur += 3; break; } } + if ( *cur == ']' ) + { + FT_TRACE6(( "encoding end\n" )); + cur++; + break; + } - /* otherwise, we must find a number before anything else */ - if ( (FT_Byte)( c - '0' ) < 10 ) + /* check whether we've found an entry */ + if ( ft_isdigit( *cur ) || only_immediates ) { FT_Int charcode; - parser->root.cursor = cur; - charcode = (FT_Int)T1_ToInt( parser ); - cur = parser->root.cursor; + if ( only_immediates ) + charcode = n; + else + { + charcode = (FT_Int)T1_ToInt( parser ); + T1_Skip_Spaces( parser ); + } + + cur = parser->root.cursor; + + if ( *cur == '/' && cur + 2 < limit && n < count ) + { + FT_PtrDist len; + - /* skip whitespace */ - while ( cur < limit && t42_is_space( *cur ) ) cur++; - if ( cur < limit && *cur == '/' ) - { - /* bingo, we have an immediate name -- it must be a */ - /* character name */ - FT_Byte* cur2 = cur + 1; - FT_Int len; + parser->root.cursor = cur; + T1_Skip_PS_Token( parser ); - - while ( cur2 < limit && t42_is_alpha( *cur2 ) ) - cur2++; - - len = (FT_Int)( cur2 - cur - 1 ); + len = parser->root.cursor - cur; parser->root.error = T1_Add_Table( char_table, charcode, - cur + 1, len + 1 ); + cur, len + 1 ); char_table->elements[charcode][len] = '\0'; if ( parser->root.error ) return; - cur = cur2; + n++; } } else - cur++; + T1_Skip_PS_Token( parser ); + + T1_Skip_Spaces( parser ); } face->type1.encoding_type = T1_ENCODING_TYPE_ARRAY; parser->root.cursor = cur; } + /* Otherwise, we should have either `StandardEncoding', */ /* `ExpertEncoding', or `ISOLatin1Encoding' */ else @@ -448,7 +450,8 @@ ft_strncmp( (const char*)cur, "ISOLatin1Encoding", 17 ) == 0 ) face->type1.encoding_type = T1_ENCODING_TYPE_ISOLATIN1; - else { + else + { FT_ERROR(( "t42_parse_encoding: invalid token!\n" )); parser->root.error = T42_Err_Invalid_File_Format; } @@ -456,34 +459,13 @@ } - static FT_UInt - t42_hexval( FT_Byte v ) + typedef enum { - FT_UInt d; + BEFORE_START, + BEFORE_TABLE_DIR, + OTHER_TABLES - d = (FT_UInt)( v - 'A' ); - if ( d < 6 ) - { - d += 10; - goto Exit; - } - - d = (FT_UInt)( v - 'a' ); - if ( d < 6 ) - { - d += 10; - goto Exit; - } - - d = (FT_UInt)( v - '0' ); - if ( d < 10 ) - goto Exit; - - d = 0; - - Exit: - return d; - } + } T42_Load_Status; static void @@ -492,154 +474,177 @@ { T42_Parser parser = &loader->parser; FT_Memory memory = parser->root.memory; - FT_Byte* cur = parser->root.cursor; + FT_Byte* cur; FT_Byte* limit = parser->root.limit; FT_Error error; - FT_Int num_tables = 0, status; - FT_ULong count, ttf_size = 0, string_size = 0; - FT_Bool in_string = 0; - FT_Byte v = 0; + FT_Int num_tables = 0; + FT_ULong count, ttf_size = 0; + + FT_Long n, string_size, old_string_size, real_size; + FT_Byte* string_buf = NULL; + FT_Bool alloc = 0; + + T42_Load_Status status; - /* The format is `/sfnts [ <...> <...> ... ] def' */ + /* The format is */ + /* */ + /* /sfnts [ <hexstring> <hexstring> ... ] def */ + /* */ + /* or */ + /* */ + /* /sfnts [ */ + /* <num_bin_bytes> RD <binary data> */ + /* <num_bin_bytes> RD <binary data> */ + /* ... */ + /* ] def */ + /* */ + /* with exactly one space after the `RD' token. */ - while ( t42_is_space( *cur ) ) - cur++; + T1_Skip_Spaces( parser ); - if (*cur++ == '[') - { - status = 0; - count = 0; - } - else + if ( parser->root.cursor >= limit || *parser->root.cursor++ != '[' ) { FT_ERROR(( "t42_parse_sfnts: can't find begin of sfnts vector!\n" )); error = T42_Err_Invalid_File_Format; goto Fail; } - while ( cur < limit - 2 ) + T1_Skip_Spaces( parser ); + status = BEFORE_START; + string_size = 0; + old_string_size = 0; + count = 0; + + while ( parser->root.cursor < limit ) { - while ( t42_is_space( *cur ) ) - cur++; + cur = parser->root.cursor; - switch ( *cur ) + if ( *cur == ']' ) { - case ']': - parser->root.cursor = cur++; - return; - - case '<': - in_string = 1; - string_size = 0; - cur++; - continue; - - case '>': - if ( !in_string ) - { - FT_ERROR(( "t42_parse_sfnts: found unpaired `>'!\n" )); - error = T42_Err_Invalid_File_Format; - goto Fail; - } - - /* A string can have, as a last byte, */ - /* a zero byte for padding. If so, ignore it */ - if ( ( v == 0 ) && ( string_size % 2 == 1 ) ) - count--; - in_string = 0; - cur++; - continue; - - case '%': - if ( !in_string ) - { - /* Comment found; skip till end of line */ - while ( *cur != '\n' ) - cur++; - continue; - } - else - { - FT_ERROR(( "t42_parse_sfnts: found `%' in string!\n" )); - error = T42_Err_Invalid_File_Format; - goto Fail; - } - - default: - if ( !ft_xdigit( *cur ) || !ft_xdigit( *(cur + 1) ) ) - { - FT_ERROR(( "t42_parse_sfnts: found non-hex characters in string" )); - error = T42_Err_Invalid_File_Format; - goto Fail; - } - - v = (FT_Byte)( 16 * t42_hexval( cur[0] ) + t42_hexval( cur[1] ) ); - cur += 2; - string_size++; + parser->root.cursor++; + goto Exit; } - switch ( status ) + else if ( *cur == '<' ) { - case 0: /* The '[' was read, so load offset table, 12 bytes */ - if ( count < 12 ) + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + goto Exit; + + /* don't include delimiters */ + string_size = (FT_Long)( ( parser->root.cursor - cur - 2 + 1 ) / 2 ); + if ( FT_REALLOC( string_buf, old_string_size, string_size ) ) + goto Fail; + + alloc = 1; + + parser->root.cursor = cur; + (void)T1_ToBytes( parser, string_buf, string_size, &real_size, 1 ); + old_string_size = string_size; + string_size = real_size; + } + + else if ( ft_isdigit( *cur ) ) + { + string_size = T1_ToInt( parser ); + + T1_Skip_PS_Token( parser ); /* `RD' */ + + string_buf = parser->root.cursor + 1; /* one space after `RD' */ + + parser->root.cursor += string_size + 1; + if ( parser->root.cursor >= limit ) { - face->ttf_data[count++] = v; - continue; + FT_ERROR(( "t42_parse_sfnts: too many binary data!\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; } - else + } + + /* A string can have a trailing zero byte for padding. Ignore it. */ + if ( string_buf[string_size - 1] == 0 && ( string_size % 2 == 1 ) ) + string_size--; + + for ( n = 0; n < string_size; n++ ) + { + switch ( status ) { - num_tables = 16 * face->ttf_data[4] + face->ttf_data[5]; - status = 1; - ttf_size = 12 + 16 * num_tables; - - if ( FT_REALLOC( face->ttf_data, 12, ttf_size ) ) - goto Fail; - } - /* No break, fall-through */ - - case 1: /* The offset table is read; read now the table directory */ - if ( count < ttf_size ) - { - face->ttf_data[count++] = v; - continue; - } - else - { - int i; - FT_ULong len; - - - for ( i = 0; i < num_tables; i++ ) + case BEFORE_START: + /* load offset table, 12 bytes */ + if ( count < 12 ) { - FT_Byte* p = face->ttf_data + 12 + 16*i + 12; - - len = FT_PEEK_ULONG( p ); - - /* Pad to a 4-byte boundary length */ - ttf_size += ( len + 3 ) & ~3; + face->ttf_data[count++] = string_buf[n]; + continue; } + else + { + num_tables = 16 * face->ttf_data[4] + face->ttf_data[5]; + status = BEFORE_TABLE_DIR; + ttf_size = 12 + 16 * num_tables; - status = 2; - face->ttf_size = ttf_size; + if ( FT_REALLOC( face->ttf_data, 12, ttf_size ) ) + goto Fail; + } + /* fall through */ - if ( FT_REALLOC( face->ttf_data, 12 + 16 * num_tables, - ttf_size + 1 ) ) + case BEFORE_TABLE_DIR: + /* the offset table is read; read the table directory */ + if ( count < ttf_size ) + { + face->ttf_data[count++] = string_buf[n]; + continue; + } + else + { + int i; + FT_ULong len; + + + for ( i = 0; i < num_tables; i++ ) + { + FT_Byte* p = face->ttf_data + 12 + 16 * i + 12; + + + len = FT_PEEK_ULONG( p ); + + /* Pad to a 4-byte boundary length */ + ttf_size += ( len + 3 ) & ~3; + } + + status = OTHER_TABLES; + face->ttf_size = ttf_size; + + if ( FT_REALLOC( face->ttf_data, 12 + 16 * num_tables, + ttf_size + 1 ) ) + goto Fail; + } + /* fall through */ + + case OTHER_TABLES: + /* all other tables are just copied */ + if ( count >= ttf_size ) + { + FT_ERROR(( "t42_parse_sfnts: too many binary data!\n" )); + error = T42_Err_Invalid_File_Format; goto Fail; + } + face->ttf_data[count++] = string_buf[n]; } - /* No break, fall-through */ - - case 2: /* We are reading normal tables; just swallow them */ - face->ttf_data[count++] = v; - } + + T1_Skip_Spaces( parser ); } - /* If control reaches this point, the format was not valid */ + /* if control reaches this point, the format was not valid */ error = T42_Err_Invalid_File_Format; Fail: parser->root.error = error; + + Exit: + if ( alloc ) + FT_FREE( string_buf ); } @@ -647,22 +652,75 @@ t42_parse_charstrings( T42_Face face, T42_Loader loader ) { - T42_Parser parser = &loader->parser; - PS_Table code_table = &loader->charstrings; - PS_Table name_table = &loader->glyph_names; - FT_Memory memory = parser->root.memory; + T42_Parser parser = &loader->parser; + PS_Table code_table = &loader->charstrings; + PS_Table name_table = &loader->glyph_names; + PS_Table swap_table = &loader->swap_table; + FT_Memory memory = parser->root.memory; FT_Error error; - PSAux_Service psaux = (PSAux_Service)face->psaux; + PSAux_Service psaux = (PSAux_Service)face->psaux; FT_Byte* cur; - FT_Byte* limit = parser->root.limit; - FT_Int n; + FT_Byte* limit = parser->root.limit; + FT_UInt n; + FT_UInt notdef_index = 0; + FT_Byte notdef_found = 0; - loader->num_glyphs = (FT_Int)T1_ToInt( parser ); - if ( parser->root.error ) - return; + T1_Skip_Spaces( parser ); + + if ( parser->root.cursor >= limit ) + { + FT_ERROR(( "t42_parse_charstrings: out of bounds!\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + + if ( ft_isdigit( *parser->root.cursor ) ) + { + loader->num_glyphs = (FT_UInt)T1_ToInt( parser ); + if ( parser->root.error ) + return; + } + else if ( *parser->root.cursor == '<' ) + { + /* We have `<< ... >>'. Count the number of `/' in the dictionary */ + /* to get its size. */ + FT_UInt count = 0; + + + T1_Skip_PS_Token( parser ); + T1_Skip_Spaces( parser ); + cur = parser->root.cursor; + + while ( parser->root.cursor < limit ) + { + if ( *parser->root.cursor == '/' ) + count++; + else if ( *parser->root.cursor == '>' ) + { + loader->num_glyphs = count; + parser->root.cursor = cur; /* rewind */ + break; + } + T1_Skip_PS_Token( parser ); + T1_Skip_Spaces( parser ); + } + } + else + { + FT_ERROR(( "t42_parse_charstrings: invalid token!\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + + if ( parser->root.cursor >= limit ) + { + FT_ERROR(( "t42_parse_charstrings: out of bounds!\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } /* initialize tables */ @@ -678,57 +736,82 @@ if ( error ) goto Fail; + /* Initialize table for swapping index notdef_index and */ + /* index 0 names and codes (if necessary). */ + + error = psaux->ps_table_funcs->init( swap_table, 4, memory ); + if ( error ) + goto Fail; + n = 0; for (;;) { - /* the format is simple: */ - /* `/glyphname' + index + def */ - /* */ - /* note that we stop when we find an `end' */ - /* */ + /* The format is simple: */ + /* `/glyphname' + index [+ def] */ + T1_Skip_Spaces( parser ); cur = parser->root.cursor; if ( cur >= limit ) break; - /* we stop when we find an `end' keyword */ - if ( *cur == 'e' && - cur + 3 < limit && - cur[1] == 'n' && - cur[2] == 'd' ) + /* We stop when we find an `end' keyword or '>' */ + if ( *cur == 'e' && + cur + 3 < limit && + cur[1] == 'n' && + cur[2] == 'd' && + t42_is_space( cur[3] ) ) + break; + if ( *cur == '>' ) break; - if ( *cur != '/' ) - T1_Skip_Alpha( parser ); - else + T1_Skip_PS_Token( parser ); + + if ( *cur == '/' ) { - FT_Byte* cur2 = cur + 1; - FT_Int len; + FT_PtrDist len; - while ( cur2 < limit && t42_is_alpha( *cur2 ) ) - cur2++; - len = (FT_Int)( cur2 - cur - 1 ); + if ( cur + 1 >= limit ) + { + FT_ERROR(( "t42_parse_charstrings: out of bounds!\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } - error = T1_Add_Table( name_table, n, cur + 1, len + 1 ); + cur++; /* skip `/' */ + len = parser->root.cursor - cur; + + error = T1_Add_Table( name_table, n, cur, len + 1 ); if ( error ) goto Fail; /* add a trailing zero to the name table */ name_table->elements[n][len] = '\0'; - parser->root.cursor = cur2; + /* record index of /.notdef */ + if ( *cur == '.' && + ft_strcmp( ".notdef", + (const char*)(name_table->elements[n]) ) == 0 ) + { + notdef_index = n; + notdef_found = 1; + } + T1_Skip_Spaces( parser ); - cur2 = cur = parser->root.cursor; - if ( cur >= limit ) - break; + cur = parser->root.cursor; - while ( cur2 < limit && t42_is_alpha( *cur2 ) ) - cur2++; - len = (FT_Int)( cur2 - cur ); + (void)T1_ToInt( parser ); + if ( parser->root.cursor >= limit ) + { + FT_ERROR(( "t42_parse_charstrings: out of bounds!\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + + len = parser->root.cursor - cur; error = T1_Add_Table( code_table, n, cur, len + 1 ); if ( error ) @@ -742,15 +825,79 @@ } } - /* Index 0 must be a .notdef element */ - if ( ft_strcmp( (char *)name_table->elements[0], ".notdef" ) ) + loader->num_glyphs = n; + + if ( !notdef_found ) { - FT_ERROR(( "t42_parse_charstrings: Index 0 is not `.notdef'!\n" )); + FT_ERROR(( "t42_parse_charstrings: no /.notdef glyph!\n" )); error = T42_Err_Invalid_File_Format; goto Fail; } - loader->num_glyphs = n; + /* if /.notdef does not occupy index 0, do our magic. */ + if ( ft_strcmp( (const char*)".notdef", + (const char*)name_table->elements[0] ) ) + { + /* Swap glyph in index 0 with /.notdef glyph. First, add index 0 */ + /* name and code entries to swap_table. Then place notdef_index */ + /* name and code entries into swap_table. Then swap name and code */ + /* entries at indices notdef_index and 0 using values stored in */ + /* swap_table. */ + + /* Index 0 name */ + error = T1_Add_Table( swap_table, 0, + name_table->elements[0], + name_table->lengths [0] ); + if ( error ) + goto Fail; + + /* Index 0 code */ + error = T1_Add_Table( swap_table, 1, + code_table->elements[0], + code_table->lengths [0] ); + if ( error ) + goto Fail; + + /* Index notdef_index name */ + error = T1_Add_Table( swap_table, 2, + name_table->elements[notdef_index], + name_table->lengths [notdef_index] ); + if ( error ) + goto Fail; + + /* Index notdef_index code */ + error = T1_Add_Table( swap_table, 3, + code_table->elements[notdef_index], + code_table->lengths [notdef_index] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( name_table, notdef_index, + swap_table->elements[0], + swap_table->lengths [0] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( code_table, notdef_index, + swap_table->elements[1], + swap_table->lengths [1] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( name_table, 0, + swap_table->elements[2], + swap_table->lengths [2] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( code_table, 0, + swap_table->elements[3], + swap_table->lengths [3] ); + if ( error ) + goto Fail; + + } + return; Fail: @@ -770,14 +917,16 @@ /* if the keyword has a dedicated callback, call it */ - if ( field->type == T1_FIELD_TYPE_CALLBACK ) { + if ( field->type == T1_FIELD_TYPE_CALLBACK ) + { field->reader( (FT_Face)face, loader ); error = loader->parser.root.error; goto Exit; } - /* now, the keyword is either a simple field, or a table of fields; */ - /* we are now going to take care of it */ + /* now the keyword is either a simple field or a table of fields; */ + /* we are now going to take care of it */ + switch ( field->location ) { case T1_FIELD_LOCATION_FONT_INFO: @@ -814,28 +963,27 @@ FT_Long size ) { T42_Parser parser = &loader->parser; - FT_Byte* cur = base; - FT_Byte* limit = cur + size; - FT_UInt n_keywords = (FT_UInt)( sizeof ( t42_keywords ) / - sizeof ( t42_keywords[0] ) ); + FT_Byte* limit; + FT_Int n_keywords = (FT_Int)( sizeof ( t42_keywords ) / + sizeof ( t42_keywords[0] ) ); - FT_Byte keyword_flags[T42_KEYWORD_COUNT]; - - { - FT_UInt n; - - - for ( n = 0; n < T42_KEYWORD_COUNT; n++ ) - keyword_flags[n] = 0; - } parser->root.cursor = base; parser->root.limit = base + size; - parser->root.error = 0; + parser->root.error = T42_Err_Ok; - for ( ; cur < limit; cur++ ) + limit = parser->root.limit; + + T1_Skip_Spaces( parser ); + + while ( parser->root.cursor < limit ) { - /* look for `FontDirectory', which causes problems on some fonts */ + FT_Byte* cur; + + + cur = parser->root.cursor; + + /* look for `FontDirectory' which causes problems for some fonts */ if ( *cur == 'F' && cur + 25 < limit && ft_strncmp( (char*)cur, "FontDirectory", 13 ) == 0 ) { @@ -843,13 +991,21 @@ /* skip the `FontDirectory' keyword */ - cur += 13; - cur2 = cur; + T1_Skip_PS_Token( parser ); + T1_Skip_Spaces ( parser ); + cur = cur2 = parser->root.cursor; - /* lookup the `known' keyword */ - while ( cur < limit && *cur != 'k' && - ft_strncmp( (char*)cur, "known", 5 ) ) - cur++; + /* look up the `known' keyword */ + while ( cur < limit ) + { + if ( *cur == 'k' && cur + 5 < limit && + ft_strncmp( (char*)cur, "known", 5 ) == 0 ) + break; + + T1_Skip_PS_Token( parser ); + T1_Skip_Spaces ( parser ); + cur = parser->root.cursor; + } if ( cur < limit ) { @@ -857,34 +1013,37 @@ /* skip the `known' keyword and the token following it */ - cur += 5; - loader->parser.root.cursor = cur; - T1_ToToken( &loader->parser, &token ); + T1_Skip_PS_Token( parser ); + T1_ToToken( parser, &token ); /* if the last token was an array, skip it! */ if ( token.type == T1_TOKEN_TYPE_ARRAY ) cur2 = parser->root.cursor; } - cur = cur2; + parser->root.cursor = cur2; } + /* look for immediates */ else if ( *cur == '/' && cur + 2 < limit ) { - FT_Byte* cur2; - FT_UInt i, len; + FT_PtrDist len; cur++; - cur2 = cur; - while ( cur2 < limit && t42_is_alpha( *cur2 ) ) - cur2++; - len = (FT_UInt)( cur2 - cur ); - if ( len > 0 && len < 22 ) /* XXX What shall it this 22? */ + parser->root.cursor = cur; + T1_Skip_PS_Token( parser ); + + len = parser->root.cursor - cur; + + if ( len > 0 && len < 22 && parser->root.cursor < limit ) { - /* now, compare the immediate name to the keyword table */ + int i; - /* Loop through all known keywords */ + + /* now compare the immediate name to the keyword table */ + + /* loop through all known keywords */ for ( i = 0; i < n_keywords; i++ ) { T1_Field keyword = (T1_Field)&t42_keywords[i]; @@ -894,32 +1053,27 @@ if ( !name ) continue; - if ( ( len == ft_strlen( (const char *)name ) ) && - ( ft_memcmp( cur, name, len ) == 0 ) ) + if ( cur[0] == name[0] && + len == ft_strlen( (const char *)name ) && + ft_memcmp( cur, name, len ) == 0 ) { /* we found it -- run the parsing callback! */ - parser->root.cursor = cur2; - T1_Skip_Spaces( parser ); - - /* only record the first instance of each field/keyword */ - /* to deal with synthetic fonts correctly */ - if ( keyword_flags[i] == 0 ) - { - parser->root.error = t42_load_keyword(face, - loader, - keyword ); - if ( parser->root.error ) - return parser->root.error; - } - keyword_flags[i] = 1; - - cur = parser->root.cursor; + parser->root.error = t42_load_keyword( face, + loader, + keyword ); + if ( parser->root.error ) + return parser->root.error; break; } } } } + else + T1_Skip_PS_Token( parser ); + + T1_Skip_Spaces( parser ); } + return parser->root.error; } @@ -951,6 +1105,7 @@ T1_Release_Table( &loader->encoding_table ); T1_Release_Table( &loader->charstrings ); T1_Release_Table( &loader->glyph_names ); + T1_Release_Table( &loader->swap_table ); /* finalize parser */ t42_parser_done( parser ); diff --git a/reactos/lib/freetype/src/type42/t42parse.h b/reactos/lib/freetype/src/type42/t42parse.h index 7339aa63b52..f77ec4af4f4 100644 --- a/reactos/lib/freetype/src/type42/t42parse.h +++ b/reactos/lib/freetype/src/type42/t42parse.h @@ -33,7 +33,7 @@ FT_BEGIN_HEADER FT_Byte* base_dict; FT_Long base_len; - FT_Byte in_memory; + FT_Bool in_memory; } T42_ParserRec, *T42_Parser; @@ -42,13 +42,14 @@ FT_BEGIN_HEADER { T42_ParserRec parser; /* parser used to read the stream */ - FT_Int num_chars; /* number of characters in encoding */ + FT_UInt num_chars; /* number of characters in encoding */ PS_TableRec encoding_table; /* PS_Table used to store the */ /* encoding character names */ - FT_Int num_glyphs; + FT_UInt num_glyphs; PS_TableRec glyph_names; PS_TableRec charstrings; + PS_TableRec swap_table; /* For moving .notdef glyph to index 0. */ } T42_LoaderRec, *T42_Loader; diff --git a/reactos/lib/freetype/include/freetype/internal/t42types.h b/reactos/lib/freetype/src/type42/t42types.h similarity index 94% rename from reactos/lib/freetype/include/freetype/internal/t42types.h rename to reactos/lib/freetype/src/type42/t42types.h index 7562252e60f..d44ac4e671f 100644 --- a/reactos/lib/freetype/include/freetype/internal/t42types.h +++ b/reactos/lib/freetype/src/type42/t42types.h @@ -4,7 +4,7 @@ /* */ /* Type 42 font data types (specification only). */ /* */ -/* Copyright 2002 by Roberto Alameda. */ +/* Copyright 2002, 2003 by Roberto Alameda. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ @@ -23,7 +23,6 @@ #include FT_FREETYPE_H #include FT_TYPE1_TABLES_H #include FT_INTERNAL_TYPE1_TYPES_H -#include FT_INTERNAL_POSTSCRIPT_NAMES_H #include FT_INTERNAL_POSTSCRIPT_HINTS_H diff --git a/reactos/lib/freetype/src/winfonts/winfnt.c b/reactos/lib/freetype/src/winfonts/winfnt.c index b2e315f63cd..26e4930654c 100644 --- a/reactos/lib/freetype/src/winfonts/winfnt.c +++ b/reactos/lib/freetype/src/winfonts/winfnt.c @@ -4,7 +4,7 @@ /* */ /* FreeType font driver for Windows FNT/FON files */ /* */ -/* Copyright 1996-2001, 2002, 2003 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -21,12 +21,11 @@ #include FT_INTERNAL_DEBUG_H #include FT_INTERNAL_STREAM_H #include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_FNT_TYPES_H #include "winfnt.h" - #include "fnterrs.h" - +#include FT_SERVICE_WINFNT_H +#include FT_SERVICE_XFREE86_NAME_H /*************************************************************************/ /* */ @@ -38,8 +37,7 @@ #define FT_COMPONENT trace_winfnt - static - const FT_Frame_Field winmz_header_fields[] = + static const FT_Frame_Field winmz_header_fields[] = { #undef FT_STRUCTURE #define FT_STRUCTURE WinMZ_HeaderRec @@ -51,8 +49,7 @@ FT_FRAME_END }; - static - const FT_Frame_Field winne_header_fields[] = + static const FT_Frame_Field winne_header_fields[] = { #undef FT_STRUCTURE #define FT_STRUCTURE WinNE_HeaderRec @@ -65,13 +62,12 @@ FT_FRAME_END }; - static - const FT_Frame_Field winfnt_header_fields[] = + static const FT_Frame_Field winfnt_header_fields[] = { #undef FT_STRUCTURE #define FT_STRUCTURE FT_WinFNT_HeaderRec - FT_FRAME_START( 146 ), + FT_FRAME_START( 148 ), FT_FRAME_USHORT_LE( version ), FT_FRAME_ULONG_LE ( file_size ), FT_FRAME_BYTES ( copyright, 60 ), @@ -106,7 +102,7 @@ FT_FRAME_USHORT_LE( A_space ), FT_FRAME_USHORT_LE( B_space ), FT_FRAME_USHORT_LE( C_space ), - FT_FRAME_USHORT_LE( color_table_offset ), + FT_FRAME_ULONG_LE ( color_table_offset ), FT_FRAME_BYTES ( reserved1, 16 ), FT_FRAME_END }; @@ -125,6 +121,7 @@ if ( font->fnt_frame ) FT_FRAME_RELEASE( font->fnt_frame ); + FT_FREE( font->family_name ); FT_FREE( font ); face->font = 0; @@ -137,6 +134,8 @@ { FT_Error error; FT_WinFNT_Header header = &font->header; + FT_Bool new_format; + FT_UInt size; /* first of all, read the FNT header */ @@ -153,6 +152,16 @@ goto Exit; } + new_format = FT_BOOL( font->header.version == 0x300 ); + size = new_format ? 148 : 118; + + if ( header->file_size < size ) + { + FT_TRACE2(( "[not a valid FNT file]\n" )); + error = FNT_Err_Unknown_File_Format; + goto Exit; + } + /* Version 2 doesn't have these fields */ if ( header->version == 0x200 ) { @@ -361,7 +370,7 @@ } - static FT_CMap_ClassRec fnt_cmap_class_rec = + static const FT_CMap_ClassRec fnt_cmap_class_rec = { sizeof ( FNT_CMapRec ), @@ -371,7 +380,7 @@ (FT_CMap_CharNextFunc) fnt_cmap_char_next }; - static FT_CMap_Class fnt_cmap_class = &fnt_cmap_class_rec; + static FT_CMap_Class const fnt_cmap_class = &fnt_cmap_class_rec; static void @@ -426,8 +435,9 @@ /* we now need to fill the root FT_Face fields */ /* with relevant information */ { - FT_Face root = FT_FACE( face ); - FNT_Font font = face->font; + FT_Face root = FT_FACE( face ); + FNT_Font font = face->font; + FT_PtrDist family_size; root->face_flags = FT_FACE_FLAG_FIXED_SIZES | @@ -453,10 +463,10 @@ bsize->width = font->header.avg_width; - bsize->height = - font->header.pixel_height + font->header.external_leading; + bsize->height = (FT_Short)( + font->header.pixel_height + font->header.external_leading ); bsize->size = font->header.nominal_point_size << 6; - bsize->x_ppem = + bsize->x_ppem = (FT_Pos)( ( font->header.horizontal_resolution * bsize->size + 36 ) / 72 ); bsize->y_ppem = @@ -468,11 +478,18 @@ FT_CharMapRec charmap; - charmap.encoding = FT_ENCODING_UNICODE; - charmap.platform_id = 3; - charmap.encoding_id = 1; + charmap.encoding = FT_ENCODING_NONE; + charmap.platform_id = 0; + charmap.encoding_id = 0; charmap.face = root; + if ( font->header.charset == FT_WinFNT_ID_MAC ) + { + charmap.encoding = FT_ENCODING_APPLE_ROMAN; + charmap.platform_id = 1; +/* charmap.encoding_id = 0; */ + } + error = FT_CMap_New( fnt_cmap_class, NULL, &charmap, @@ -491,8 +508,22 @@ root->num_glyphs = font->header.last_char - font->header.first_char + 1 + 1; - root->family_name = (FT_String*)font->fnt_frame + - font->header.face_name_offset; + /* Some broken fonts don't delimit the face name with a final */ + /* NULL byte -- the frame is erroneously one byte too small. */ + /* We thus allocate one more byte, setting it explicitly to */ + /* zero. */ + family_size = font->header.file_size - font->header.face_name_offset; + if ( FT_ALLOC( font->family_name, family_size + 1 ) ) + goto Fail; + FT_MEM_COPY( font->family_name, + font->fnt_frame + font->header.face_name_offset, + family_size ); + font->family_name[family_size] = '\0'; + if ( FT_REALLOC( font->family_name, + family_size, + ft_strlen( font->family_name ) + 1 ) ) + goto Fail; + root->family_name = font->family_name; root->style_name = (char *)"Regular"; if ( root->style_flags & FT_STYLE_FLAG_BOLD ) @@ -505,10 +536,10 @@ else if ( root->style_flags & FT_STYLE_FLAG_ITALIC ) root->style_name = (char *)"Italic"; } + goto Exit; Fail: - if ( error ) - FNT_Face_Done( face ); + FNT_Face_Done( face ); Exit: return error; @@ -528,8 +559,8 @@ size->metrics.ascender = font->header.ascent * 64; - size->metrics.descender = ( font->header.pixel_height - - font->header.ascent ) * 64; + size->metrics.descender = -( font->header.pixel_height - + font->header.ascent ) * 64; size->metrics.height = font->header.pixel_height * 64; size->metrics.max_advance = font->header.max_width * 64; @@ -573,7 +604,7 @@ len = new_format ? 6 : 4; /* jump to glyph entry */ - p = font->fnt_frame + ( new_format ? 146 : 118 ) + len * glyph_index; + p = font->fnt_frame + ( new_format ? 148 : 118 ) + len * glyph_index; bitmap->width = FT_NEXT_SHORT_LE( p ); @@ -582,6 +613,13 @@ else offset = FT_NEXT_USHORT_LE( p ); + if ( offset >= font->header.file_size ) + { + FT_TRACE2(( "invalid FNT offset!\n" )); + error = FNT_Err_Invalid_File_Format; + goto Exit; + } + /* jump to glyph data */ p = font->fnt_frame + /* font->header.bits_offset */ + offset; @@ -632,6 +670,49 @@ } + static FT_Error + winfnt_get_header( FT_Face face, + FT_WinFNT_HeaderRec *aheader ) + { + FNT_Font font = ((FNT_Face)face)->font; + + + *aheader = font->header; + + return 0; + } + + + static const FT_Service_WinFntRec winfnt_service_rec = + { + winfnt_get_header + }; + + /* + * SERVICE LIST + * + */ + + static const FT_ServiceDescRec winfnt_services[] = + { + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_WINFNT }, + { FT_SERVICE_ID_WINFNT, &winfnt_service_rec }, + { NULL, NULL } + }; + + + static FT_Module_Interface + winfnt_get_service( FT_Driver driver, + const FT_String* service_id ) + { + FT_UNUSED( driver ); + + return ft_service_list_lookup( winfnt_services, service_id ); + } + + + + FT_CALLBACK_TABLE_DEF const FT_Driver_ClassRec winfnt_driver_class = { @@ -648,7 +729,7 @@ (FT_Module_Constructor)0, (FT_Module_Destructor) 0, - (FT_Module_Requester) 0 + (FT_Module_Requester) winfnt_get_service }, sizeof( FNT_FaceRec ), diff --git a/reactos/lib/freetype/src/winfonts/winfnt.h b/reactos/lib/freetype/src/winfonts/winfnt.h index 4ba85e0b233..32ab6daf0a7 100644 --- a/reactos/lib/freetype/src/winfonts/winfnt.h +++ b/reactos/lib/freetype/src/winfonts/winfnt.h @@ -4,7 +4,7 @@ /* */ /* FreeType font driver for Windows FNT/FON files */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -21,11 +21,79 @@ #include <ft2build.h> +#include FT_WINFONTS_H #include FT_INTERNAL_DRIVER_H FT_BEGIN_HEADER + typedef struct WinMZ_HeaderRec_ + { + FT_UShort magic; + /* skipped content */ + FT_UShort lfanew; + + } WinMZ_HeaderRec; + + + typedef struct WinNE_HeaderRec_ + { + FT_UShort magic; + /* skipped content */ + FT_UShort resource_tab_offset; + FT_UShort rname_tab_offset; + + } WinNE_HeaderRec; + + + typedef struct WinNameInfoRec_ + { + FT_UShort offset; + FT_UShort length; + FT_UShort flags; + FT_UShort id; + FT_UShort handle; + FT_UShort usage; + + } WinNameInfoRec; + + + typedef struct WinResourceInfoRec_ + { + FT_UShort type_id; + FT_UShort count; + + } WinResourceInfoRec; + + +#define WINFNT_MZ_MAGIC 0x5A4D +#define WINFNT_NE_MAGIC 0x454E + + + typedef struct FNT_FontRec_ + { + FT_ULong offset; + FT_Int size_shift; + + FT_WinFNT_HeaderRec header; + + FT_Byte* fnt_frame; + FT_ULong fnt_size; + FT_String* family_name; + + } FNT_FontRec, *FNT_Font; + + + typedef struct FNT_FaceRec_ + { + FT_FaceRec root; + FNT_Font font; + + FT_CharMap charmap_handle; + FT_CharMapRec charmap; /* a single charmap per face */ + + } FNT_FaceRec, *FNT_Face; + FT_EXPORT_VAR( const FT_Driver_ClassRec ) winfnt_driver_class; diff --git a/reactos/lib/freetype/tests/gview.c b/reactos/lib/freetype/tests/gview.c index 77f15bcdf07..f6859851208 100644 --- a/reactos/lib/freetype/tests/gview.c +++ b/reactos/lib/freetype/tests/gview.c @@ -745,7 +745,7 @@ ah_draw_edges( void ) x = (NV_Pos)( v1.x + 0.5 ); nv_pixmap_fill_rect( target, x - 1, y2, 3, - ABS( y1 - y2 ) + 1, SEGMENT_COLOR ); + FT_ABS( y1 - y2 ) + 1, SEGMENT_COLOR ); } } @@ -787,7 +787,7 @@ ah_draw_edges( void ) x = (NV_Pos)( v1.y + 0.5 ); nv_pixmap_fill_rect( target, y1, x - 1, - ABS( y1 - y2 ) + 1, 3, SEGMENT_COLOR ); + FT_ABS( y1 - y2 ) + 1, 3, SEGMENT_COLOR ); } } From 1b645d26223d6ff6b0ac1eb7d7e41440836c1765 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Mon, 10 May 2004 18:02:20 +0000 Subject: [PATCH 1082/1463] Avoid warnings when using gcc 3.4 svn path=/trunk/; revision=9350 --- reactos/drivers/dd/blue/blue.c | 4 +- reactos/drivers/dd/floppy/dpc.c | 3 +- reactos/drivers/storage/class2/class2.c | 10 +-- reactos/drivers/storage/disk/disk.c | 5 +- .../subsys/system/explorer/shell/webchild.h | 4 +- .../subsys/system/explorer/utility/window.h | 8 +-- .../system/explorer/utility/xmlstorage.h | 2 +- reactos/tools/helper.mk | 64 +++++++++---------- 8 files changed, 50 insertions(+), 50 deletions(-) diff --git a/reactos/drivers/dd/blue/blue.c b/reactos/drivers/dd/blue/blue.c index 6960f51757f..b3555163150 100644 --- a/reactos/drivers/dd/blue/blue.c +++ b/reactos/drivers/dd/blue/blue.c @@ -1,4 +1,4 @@ -/* $Id: blue.c,v 1.44 2004/02/10 16:22:55 navaraf Exp $ +/* $Id: blue.c,v 1.45 2004/05/10 18:02:19 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -471,7 +471,7 @@ ScrIoControl(PDEVICE_OBJECT DeviceObject, for (dwCount = 0; dwCount < stk->Parameters.DeviceIoControl.OutputBufferLength; dwCount++, pAttr++) { - (char) *pAttr = vidmem[offset + (dwCount * 2)]; + *((char *) pAttr) = vidmem[offset + (dwCount * 2)]; } Buf->dwTransfered = dwCount; diff --git a/reactos/drivers/dd/floppy/dpc.c b/reactos/drivers/dd/floppy/dpc.c index 22d2257e9b9..e0e58ab40cc 100644 --- a/reactos/drivers/dd/floppy/dpc.c +++ b/reactos/drivers/dd/floppy/dpc.c @@ -216,7 +216,8 @@ FloppyDpcReadWrite (PKDPC Dpc, Stack->Parameters.Read.Length -= ControllerExtension->TransferLength; /* drivercontext used for current va */ - (ULONG)ControllerExtension->Irp->Tail.Overlay.DriverContext[0] += ControllerExtension->TransferLength; + ControllerExtension->Irp->Tail.Overlay.DriverContext[0] = (PVOID) ((ULONG) ControllerExtension->Irp->Tail.Overlay.DriverContext[0] + + ControllerExtension->TransferLength); DPRINT ("First ulong: %x\n", *((PULONG)ControllerExtension->MapRegisterBase)) /* If there is more IO to be done, restart execute routine to issue next read */ diff --git a/reactos/drivers/storage/class2/class2.c b/reactos/drivers/storage/class2/class2.c index 2d4f399977f..4c0644025ad 100644 --- a/reactos/drivers/storage/class2/class2.c +++ b/reactos/drivers/storage/class2/class2.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: class2.c,v 1.52 2004/04/01 17:29:53 jimtabor Exp $ +/* $Id: class2.c,v 1.53 2004/05/10 18:02:20 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1380,9 +1380,9 @@ ScsiClassIoComplete(IN PDEVICE_OBJECT DeviceObject, /* Retry the request */ if ((Retry) && - ((ULONG)IrpStack->Parameters.Others.Argument4 > 0)) + ((ULONG_PTR)IrpStack->Parameters.Others.Argument4 > 0)) { - ((ULONG)IrpStack->Parameters.Others.Argument4)--; + IrpStack->Parameters.Others.Argument4 = (PVOID) ((ULONG_PTR)IrpStack->Parameters.Others.Argument4 - 1); ScsiClassRetryRequest(DeviceObject, Irp, @@ -1502,9 +1502,9 @@ ScsiClassIoCompleteAssociated(IN PDEVICE_OBJECT DeviceObject, /* Retry the request */ if ((Retry) && - ((ULONG)IrpStack->Parameters.Others.Argument4 > 0)) + ((ULONG_PTR)IrpStack->Parameters.Others.Argument4 > 0)) { - ((ULONG)IrpStack->Parameters.Others.Argument4)--; + IrpStack->Parameters.Others.Argument4 = (PVOID) ((ULONG_PTR)IrpStack->Parameters.Others.Argument4 - 1); ScsiClassRetryRequest(DeviceObject, Irp, diff --git a/reactos/drivers/storage/disk/disk.c b/reactos/drivers/storage/disk/disk.c index 18206d34000..23de91ef1af 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.40 2004/04/01 17:24:47 jimtabor Exp $ +/* $Id: disk.c,v 1.41 2004/05/10 18:02:20 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1186,8 +1186,7 @@ DiskClassDeviceControl(IN PDEVICE_OBJECT DeviceObject, Information = 0; if (OutputLength != 0) { - ((PULONG)(Irp->AssociatedIrp.SystemBuffer)) = - DeviceExtension->MediaChangeCount; + Irp->AssociatedIrp.SystemBuffer = (PVOID) DeviceExtension->MediaChangeCount; Information = sizeof(ULONG); } diff --git a/reactos/subsys/system/explorer/shell/webchild.h b/reactos/subsys/system/explorer/shell/webchild.h index adcb0c09783..458adf544fe 100644 --- a/reactos/subsys/system/explorer/shell/webchild.h +++ b/reactos/subsys/system/explorer/shell/webchild.h @@ -117,7 +117,7 @@ template<typename BASE> struct IComSrvQI : public BASE STDMETHODIMP QueryInterface(REFIID riid, LPVOID* ppv) {*ppv=0; if (IsEqualIID(riid, _uuid_base) || - IsEqualIID(riid, IID_IUnknown)) {*ppv=static_cast<BASE*>(this); AddRef(); return S_OK;} + IsEqualIID(riid, IID_IUnknown)) {*ppv=static_cast<BASE*>(this); this->AddRef(); return S_OK;} return E_NOINTERFACE;} protected: @@ -158,7 +158,7 @@ template<typename T> struct ConnectionPoint : public SIfacePtr<T> { ConnectionPoint(IConnectionPointContainer* pCPC, REFIID riid) { - CheckError(pCPC->FindConnectionPoint(riid, &_p)); + CheckError(pCPC->FindConnectionPoint(riid, &this->_p)); } }; diff --git a/reactos/subsys/system/explorer/utility/window.h b/reactos/subsys/system/explorer/utility/window.h index 3a5e4118cc7..4f716085ca0 100644 --- a/reactos/subsys/system/explorer/utility/window.h +++ b/reactos/subsys/system/explorer/utility/window.h @@ -544,11 +544,11 @@ template<typename BASE> struct ResizeController : public BASE virtual void GetClientSpace(PRECT prect) { - if (!IsIconic(_hwnd)) { - GetClientRect(_hwnd, prect); + if (!IsIconic(this->_hwnd)) { + GetClientRect(this->_hwnd, prect); } else { WINDOWPLACEMENT wp; - GetWindowPlacement(_hwnd, &wp); + GetWindowPlacement(this->_hwnd, &wp); prect->left = prect->top = 0; prect->right = wp.rcNormalPosition.right-wp.rcNormalPosition.left- 2*(GetSystemMetrics(SM_CXSIZEFRAME)+GetSystemMetrics(SM_CXEDGE)); @@ -632,7 +632,7 @@ template<typename BASE> struct OwnerDrawParent : public BASE switch(nmsg) { case WM_DRAWITEM: if (wparam) { // should there be drawn a control? - HWND hctl = GetDlgItem(_hwnd, wparam); + HWND hctl = GetDlgItem(this->_hwnd, wparam); if (hctl) return SendMessage(hctl, PM_DISPATCH_DRAWITEM, wparam, lparam); diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.h b/reactos/subsys/system/explorer/utility/xmlstorage.h index 7ad07c24cb1..9a20ae38bf7 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.h +++ b/reactos/subsys/system/explorer/utility/xmlstorage.h @@ -295,7 +295,7 @@ struct String_from_XML_Char : public String inline bool operator==(const String& s1, const char* s2) { LPCWSTR p = s1; - const char* q = s2; + const unsigned char* q = (const unsigned char *) s2; while(*p && *q) if (*p++ != *q++) diff --git a/reactos/tools/helper.mk b/reactos/tools/helper.mk index 4bb3b39b283..d3dd6fa50d7 100644 --- a/reactos/tools/helper.mk +++ b/reactos/tools/helper.mk @@ -1,4 +1,4 @@ -# $Id: helper.mk,v 1.60 2004/03/10 15:22:44 silverblade Exp $ +# $Id: helper.mk,v 1.61 2004/05/10 18:02:19 gvg Exp $ # # Helper makefile for ReactOS modules # Variables this makefile accepts: @@ -122,8 +122,8 @@ ifeq ($(TARGET_TYPE),program) MK_DDKLIBS := MK_SDKLIBS := ifneq ($(WINE_MODE),yes) - MK_CFLAGS := -I./ - MK_CPPFLAGS := -I./ + MK_CFLAGS := -I. + MK_CPPFLAGS := -I. else MK_CFLAGS := -I$(PATH_TO_TOP)/include/wine MK_CPPFLAGS := -I$(PATH_TO_TOP)/include/wine @@ -150,8 +150,8 @@ ifeq ($(TARGET_TYPE),proglib) MK_DEFENTRY := _WinMain@16 MK_DDKLIBS := MK_SDKLIBS := - MK_CFLAGS := -I./ - MK_CPPFLAGS := -I./ + MK_CFLAGS := -I. + MK_CPPFLAGS := -I. MK_IMPLIB := yes MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := $(SDK_PATH_LIB) @@ -170,11 +170,11 @@ ifeq ($(TARGET_TYPE),dynlink) MK_DDKLIBS := MK_SDKLIBS := ifneq ($(WINE_MODE),yes) - MK_CFLAGS := -I./ - MK_CPPFLAGS := -I./ + MK_CFLAGS := -I. + MK_CPPFLAGS := -I. else - MK_CFLAGS := -I$(PATH_TO_TOP)/include/wine -I./ -I$(WINE_INCLUDE) - MK_CPPFLAGS := -I$(PATH_TO_TOP)/include/wine -I./ -I$(WINE_INCLUDE) + MK_CFLAGS := -I$(PATH_TO_TOP)/include/wine -I. -I$(WINE_INCLUDE) + MK_CPPFLAGS := -I$(PATH_TO_TOP)/include/wine -I. -I$(WINE_INCLUDE) MK_RCFLAGS := --include-dir $(PATH_TO_TOP)/include/wine --include-dir $(WINE_INCLUDE) endif MK_IMPLIB := yes @@ -199,8 +199,8 @@ ifeq ($(TARGET_TYPE),library) MK_DEFENTRY := MK_DDKLIBS := MK_SDKLIBS := - MK_CFLAGS := -I./ - MK_CPPFLAGS := -I./ + MK_CFLAGS := -I. + MK_CPPFLAGS := -I. MK_IMPLIB := no MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := @@ -215,8 +215,8 @@ ifeq ($(TARGET_TYPE),kmlibrary) TARGET_NORC := yes MK_MODE := static MK_DEFEXT := .a - MK_CFLAGS := -I./ - MK_CPPFLAGS := -I./ + MK_CFLAGS := -I. + MK_CPPFLAGS := -I. MK_IMPLIB := no MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := $(DDK_PATH_LIB) @@ -229,8 +229,8 @@ ifeq ($(TARGET_TYPE),driver_library) MK_DEFENTRY := MK_DDKLIBS := MK_SDKLIBS := - MK_CFLAGS := -I./ - MK_CPPFLAGS := -I./ + MK_CFLAGS := -I. + MK_CPPFLAGS := -I. MK_IMPLIB := no MK_IMPLIBONLY := yes MK_IMPLIBDEFPATH := $(DDK_PATH_LIB) @@ -248,8 +248,8 @@ ifeq ($(TARGET_TYPE),driver) MK_DEFENTRY := _DriverEntry@8 MK_DDKLIBS := ntoskrnl.a hal.a MK_SDKLIBS := - MK_CFLAGS := -D__NTDRIVER__ -I./ - MK_CPPFLAGS := -D__NTDRIVER__ -I./ + MK_CFLAGS := -D__NTDRIVER__ -I. + MK_CPPFLAGS := -D__NTDRIVER__ -I. MK_IMPLIB := no MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := @@ -267,8 +267,8 @@ ifeq ($(TARGET_TYPE),export_driver) MK_DEFENTRY := _DriverEntry@8 MK_DDKLIBS := ntoskrnl.a hal.a MK_SDKLIBS := - MK_CFLAGS := -D__NTDRIVER__ -I./ - MK_CPPFLAGS := -D__NTDRIVER__ -I./ + MK_CFLAGS := -D__NTDRIVER__ -I. + MK_CPPFLAGS := -D__NTDRIVER__ -I. MK_IMPLIB := yes MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := $(DDK_PATH_LIB) @@ -286,8 +286,8 @@ ifeq ($(TARGET_TYPE),hal) MK_DEFENTRY := _DriverEntry@8 MK_DDKLIBS := ntoskrnl.a MK_SDKLIBS := - MK_CFLAGS := -D__NTHAL__ -I./ - MK_CPPFLAGS := -D__NTHAL__ -I./ + MK_CFLAGS := -D__NTHAL__ -I. + MK_CPPFLAGS := -D__NTHAL__ -I. MK_IMPLIB := yes MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := @@ -305,8 +305,8 @@ ifeq ($(TARGET_TYPE),bootpgm) MK_DEFENTRY := _DriverEntry@8 MK_DDKLIBS := MK_SDKLIBS := - MK_CFLAGS := -D__NTDRIVER__ -I./ - MK_CPPFLAGS := -D__NTDRIVER__ -I./ + MK_CFLAGS := -D__NTDRIVER__ -I. + MK_CPPFLAGS := -D__NTDRIVER__ -I. MK_IMPLIB := no MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := @@ -324,8 +324,8 @@ ifeq ($(TARGET_TYPE),miniport) MK_DEFENTRY := _DriverEntry@8 MK_DDKLIBS := MK_SDKLIBS := - MK_CFLAGS := -D__NTDRIVER__ -I./ - MK_CPPFLAGS := -D__NTDRIVER__ -I./ + MK_CFLAGS := -D__NTDRIVER__ -I. + MK_CPPFLAGS := -D__NTDRIVER__ -I. MK_IMPLIB := no MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := @@ -343,8 +343,8 @@ ifeq ($(TARGET_TYPE),gdi_driver) MK_DEFENTRY := _DrvEnableDriver@12 MK_DDKLIBS := ntoskrnl.a hal.a win32k.a MK_SDKLIBS := - MK_CFLAGS := -D__NTDRIVER__ -I./ - MK_CPPFLAGS := -D__NTDRIVER__ -I./ + MK_CFLAGS := -D__NTDRIVER__ -I. + MK_CPPFLAGS := -D__NTDRIVER__ -I. MK_IMPLIB := yes MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := $(DDK_PATH_LIB) @@ -407,8 +407,8 @@ ifeq ($(TARGET_TYPE),subsystem) MK_DEFENTRY := _DriverEntry@8 MK_DDKLIBS := ntoskrnl.a hal.a MK_SDKLIBS := - MK_CFLAGS := -D__NTDRIVER__ -I./ - MK_CPPFLAGS := -D__NTDRIVER__ -I./ + MK_CFLAGS := -D__NTDRIVER__ -I. + MK_CPPFLAGS := -D__NTDRIVER__ -I. MK_IMPLIB := yes MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := $(DDK_PATH_LIB) @@ -425,8 +425,8 @@ ifeq ($(TARGET_TYPE),kmdll) MK_DEFENTRY := 0x0 MK_DDKLIBS := ntoskrnl.a hal.a MK_SDKLIBS := - MK_CFLAGS := -D__NTDRIVER__ -I./ - MK_CPPFLAGS := -D__NTDRIVER__ -I./ + MK_CFLAGS := -D__NTDRIVER__ -I. + MK_CPPFLAGS := -D__NTDRIVER__ -I. MK_IMPLIB := yes MK_IMPLIBONLY := no MK_IMPLIBDEFPATH := $(DDK_PATH_LIB) @@ -445,7 +445,7 @@ ifeq ($(TARGET_TYPE),winedll) MK_DEFENTRY := _DllMain@12 MK_DDKLIBS := MK_SDKLIBS := - MK_CFLAGS := -D__USE_W32API -D_WIN32_IE=0x600 -D_WIN32_WINNT=0x501 -DWINVER=0x501 -D__need_offsetof -DCOBJMACROS -I$(PATH_TO_TOP)/include/wine + MK_CFLAGS := -D__USE_W32API -D_WIN32_IE=0x600 -D_WIN32_WINNT=0x501 -DWINVER=0x501 -D_STDDEF_H -DCOBJMACROS -I$(PATH_TO_TOP)/include/wine MK_CPPFLAGS := -D__USE_W32API -D_WIN32_IE=0x600 -D_WIN32_WINNT=0x501 -DWINVER=0x501 -D__need_offsetof -DCOBJMACROS -I$(PATH_TO_TOP)/include -I$(PATH_TO_TOP)/include/wine MK_RCFLAGS := --define __USE_W32API --include-dir $(PATH_TO_TOP)/include/wine MK_IMPLIB := yes From 21a782acebbb15c3e05955817957cd3b52791dcc Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Mon, 10 May 2004 19:23:37 +0000 Subject: [PATCH 1083/1463] take back changes to window styles, they broke our gui consoles svn path=/trunk/; revision=9351 --- reactos/subsys/win32k/ntuser/window.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index ac3cfff8f6c..8f6f3b50dc9 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.229 2004/05/10 17:07:18 weiden Exp $ +/* $Id: window.c,v 1.230 2004/05/10 19:23:37 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1634,9 +1634,9 @@ NtUserCreateWindowEx(DWORD dwExStyle, if(!(WindowObject->Style & (WS_POPUP | WS_CHILD))) { - /* Automatically assign the overlapped window style. Also always + /* Automatically assign the caption and border style. Also always clip siblings for overlapped windows. */ - WindowObject->Style |= (WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS); + WindowObject->Style |= (WS_CAPTION | WS_BORDER | WS_CLIPSIBLINGS); } /* create system menu */ From 71f57b72d41dac31716481db8a4b3003aca1b5c6 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Mon, 10 May 2004 19:58:10 +0000 Subject: [PATCH 1084/1463] - Workaround for supporting a reads from pipe after the other end has been closed and data are still available in the buffers. svn path=/trunk/; revision=9352 --- reactos/drivers/fs/np/create.c | 26 ++++++++++- reactos/drivers/fs/np/npfs.h | 7 ++- reactos/drivers/fs/np/rw.c | 85 +++++++++++++++++++++++++--------- 3 files changed, 93 insertions(+), 25 deletions(-) diff --git a/reactos/drivers/fs/np/create.c b/reactos/drivers/fs/np/create.c index 88e3766c73a..79f8aad2ff1 100644 --- a/reactos/drivers/fs/np/create.c +++ b/reactos/drivers/fs/np/create.c @@ -1,4 +1,4 @@ -/* $Id: create.c,v 1.20 2004/05/07 12:13:13 navaraf Exp $ +/* $Id: create.c,v 1.21 2004/05/10 19:58:10 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -472,23 +472,47 @@ NpfsClose( { if (Fcb->OtherSide) { +#ifndef FIN_WORKAROUND_READCLOSE Fcb->OtherSide->PipeState = FILE_PIPE_CLOSING_STATE; Fcb->OtherSide->OtherSide = NULL; +#endif /* * Signaling the write event. If is possible that an other * thread waits of an empty buffer. */ KeSetEvent(&Fcb->OtherSide->Event, IO_NO_INCREMENT, FALSE); } +#ifndef FIN_WORKAROUND_READCLOSE Fcb->PipeState = 0; +#endif } FileObject->FsContext = NULL; +#ifndef FIN_WORKAROUND_READCLOSE RemoveEntryList(&Fcb->FcbListEntry); if (Fcb->Data) ExFreePool(Fcb->Data); ExFreePool(Fcb); +#else + Fcb->PipeState = FILE_PIPE_CLOSING_STATE; + if (Fcb->OtherSide == NULL || + Fcb->OtherSide->PipeState == FILE_PIPE_CLOSING_STATE) + { + if (Server && Fcb->OtherSide != NULL && + Fcb->OtherSide->PipeState == FILE_PIPE_CLOSING_STATE) + { + RemoveEntryList(&Fcb->OtherSide->FcbListEntry); + if (Fcb->OtherSide->Data) + ExFreePool(Fcb->OtherSide->Data); + ExFreePool(Fcb->OtherSide); + } + RemoveEntryList(&Fcb->FcbListEntry); + if (Fcb->Data) + ExFreePool(Fcb->Data); + ExFreePool(Fcb); + } +#endif KeUnlockMutex(&Pipe->FcbListLock); diff --git a/reactos/drivers/fs/np/npfs.h b/reactos/drivers/fs/np/npfs.h index ad9efb63dd3..92d59c4b1d9 100644 --- a/reactos/drivers/fs/np/npfs.h +++ b/reactos/drivers/fs/np/npfs.h @@ -1,8 +1,13 @@ -/* $Id: npfs.h,v 1.16 2004/05/05 18:30:16 navaraf Exp $ */ +/* $Id: npfs.h,v 1.17 2004/05/10 19:58:10 navaraf Exp $ */ #ifndef __SERVICES_FS_NP_NPFS_H #define __SERVICES_FS_NP_NPFS_H +/* + * Hacky support for delayed closing of pipes. We need this to support + * reading from pipe the was closed on one end. + */ +#define FIN_WORKAROUND_READCLOSE typedef struct { diff --git a/reactos/drivers/fs/np/rw.c b/reactos/drivers/fs/np/rw.c index a693b5465a3..81dd500a795 100644 --- a/reactos/drivers/fs/np/rw.c +++ b/reactos/drivers/fs/np/rw.c @@ -1,4 +1,4 @@ -/* $Id: rw.c,v 1.14 2004/05/07 12:13:13 navaraf Exp $ +/* $Id: rw.c,v 1.15 2004/05/10 19:58:10 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -13,11 +13,39 @@ #include <rosrtl/minmax.h> #include "npfs.h" -//#define NDEBUG +#define NDEBUG #include <debug.h> /* FUNCTIONS *****************************************************************/ +#ifndef NDEBUG +VOID HexDump(PUCHAR Buffer, ULONG Length) +{ + CHAR Line[65]; + UCHAR ch; + const char Hex[] = "0123456789ABCDEF"; + int i, j; + + DbgPrint("---------------\n"); + + for (i = 0; i < ROUND_UP(Length, 16); i+= 16) + { + memset(Line, ' ', 64); + Line[64] = 0; + + for (j = 0; j < 16 && j + i < Length; j++) + { + ch = Buffer[i + j]; + Line[3*j + 0] = Hex[ch >> 4]; + Line[3*j + 1] = Hex[ch & 0x0f]; + Line[48 + j] = isprint(ch) ? ch : '.'; + } + DbgPrint("%s\n", Line); + } + DbgPrint("---------------\n"); +} +#endif + NTSTATUS STDCALL NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp) { @@ -51,9 +79,10 @@ NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp) Status = STATUS_PIPE_LISTENING; else if (Fcb->PipeState == FILE_PIPE_DISCONNECTED_STATE) Status = STATUS_PIPE_DISCONNECTED; - else - Status = STATUS_UNSUCCESSFUL; + else + Status = STATUS_PIPE_BROKEN; Information = 0; + DPRINT("%x\n", Status); goto done; } @@ -73,6 +102,16 @@ NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp) goto done; } +#ifdef FIN_WORKAROUND_READCLOSE + if (ReadFcb->ReadDataAvailable == 0 && + ReadFcb->PipeState == FILE_PIPE_CLOSING_STATE) + { + DPRINT("Other end of pipe is closed!\n"); + Status = STATUS_PIPE_BROKEN; + Information = 0; + goto done; + } +#endif Status = STATUS_SUCCESS; Length = IoStack->Parameters.Read.Length; @@ -107,6 +146,7 @@ NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp) FALSE, NULL); DPRINT("Finished waiting (%S)! Status: %x\n", Pipe->PipeName.Buffer, Status); +#ifndef FIN_WORKAROUND_READCLOSE /* * It's possible that the event was signaled because the * other side of pipe was closed. @@ -117,6 +157,7 @@ NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp) Status = STATUS_PIPE_BROKEN; goto done; } +#endif KeAcquireSpinLock(&ReadFcb->DataListLock, &OldIrql); } @@ -171,14 +212,7 @@ NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp) #ifndef NDEBUG DPRINT("Length %d Buffer %x\n",CopyLength,Buffer); - { - DbgPrint("------\n"); - ULONG X; - for (X = 0; X < CopyLength; X++) - DbgPrint("%02x ", ((PUCHAR)Buffer)[X]); - DbgPrint("\n"); - DbgPrint("------\n"); - } + HexDump((PUCHAR)Buffer, CopyLength); #endif Information = CopyLength; @@ -191,6 +225,15 @@ NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp) break; } } + +#ifdef FIN_WORKAROUND_READCLOSE + if (ReadFcb->ReadDataAvailable == 0 && + ReadFcb->PipeState == FILE_PIPE_CLOSING_STATE) + { + DPRINT("Other end of pipe is closed!\n"); + break; + } +#endif } KeReleaseSpinLock(&ReadFcb->DataListLock, OldIrql); @@ -266,19 +309,13 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject, Status = STATUS_SUCCESS; Buffer = MmGetSystemAddressForMdl (Irp->MdlAddress); -#ifndef NDEBUG - DPRINT("Length %d Buffer %x Offset %x\n",Length,Buffer,Offset); - { - DbgPrint("------\n"); - ULONG X; - for (X = 0; X < Length; X++) - DbgPrint("%02x ", Buffer[X]); - DbgPrint("\n"); - DbgPrint("------\n"); - } -#endif KeAcquireSpinLock(&Fcb->DataListLock, &OldIrql); +#ifndef NDEBUG + DPRINT("Length %d Buffer %x Offset %x\n",Length,Buffer,Offset); + HexDump(Buffer, Length); +#endif + while(1) { if (Fcb->WriteQuotaAvailable == 0) @@ -298,6 +335,7 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject, FALSE, NULL); DPRINT("Finished waiting (%S)! Status: %x\n", Pipe->PipeName.Buffer, Status); +#ifndef FIN_WORKAROUND_READCLOSE /* * It's possible that the event was signaled because the * other side of pipe was closed. @@ -308,6 +346,7 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject, Status = STATUS_PIPE_BROKEN; goto done; } +#endif KeAcquireSpinLock(&Fcb->DataListLock, &OldIrql); } if (Pipe->PipeWriteMode == FILE_PIPE_BYTE_STREAM_MODE) From fc1b4d644ebb2a547dd3f59332b56247766e3541 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Mon, 10 May 2004 23:05:13 +0000 Subject: [PATCH 1085/1463] Allow caller to continue after NtUserOpenClipboard() svn path=/trunk/; revision=9353 --- reactos/subsys/win32k/ntuser/clipboard.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/ntuser/clipboard.c b/reactos/subsys/win32k/ntuser/clipboard.c index e7103758840..f6c23314c16 100644 --- a/reactos/subsys/win32k/ntuser/clipboard.c +++ b/reactos/subsys/win32k/ntuser/clipboard.c @@ -61,7 +61,7 @@ NtUserOpenClipboard(HWND hWnd, DWORD Unknown1) ClipboardThread = PsGetWin32Thread(); return TRUE; #else - UNIMPLEMENTED + DPRINT1("NtUserOpenClipboard is unimplemented\n"); return FALSE; #endif } From b8c9de400fe263c9aec91565d08f2f5c5baa280e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Tue, 11 May 2004 20:44:30 +0000 Subject: [PATCH 1086/1463] Fix command line handling (mostly double-quoting stuff) svn path=/trunk/; revision=9355 --- reactos/lib/kernel32/process/create.c | 5 +++-- reactos/lib/msvcrt/misc/dllmain.c | 10 +++++----- reactos/subsys/system/cmd/cmd.c | 25 ++++++++++++------------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/reactos/lib/kernel32/process/create.c b/reactos/lib/kernel32/process/create.c index 05ebbd9d6b7..ff8158564a5 100644 --- a/reactos/lib/kernel32/process/create.c +++ b/reactos/lib/kernel32/process/create.c @@ -1,4 +1,4 @@ -/* $Id: create.c,v 1.82 2004/05/01 18:09:53 tamlin Exp $ +/* $Id: create.c,v 1.83 2004/05/11 20:44:29 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -871,6 +871,7 @@ CreateProcessW { return FALSE; } + DPRINT("TidyCmdLine '%S'\n", TidyCmdLine); if (lpApplicationName != NULL && lpApplicationName[0] != 0) { @@ -977,7 +978,7 @@ CreateProcessW * Process the application name and command line */ RtlInitUnicodeString(&ImagePathName_U, ImagePathName); - RtlInitUnicodeString(&CommandLine_U, lpCommandLine); + RtlInitUnicodeString(&CommandLine_U, TidyCmdLine); DPRINT("ImagePathName_U %S\n", ImagePathName_U.Buffer); DPRINT("CommandLine_U %S\n", CommandLine_U.Buffer); diff --git a/reactos/lib/msvcrt/misc/dllmain.c b/reactos/lib/msvcrt/misc/dllmain.c index 630fbed904d..e9c159890f8 100644 --- a/reactos/lib/msvcrt/misc/dllmain.c +++ b/reactos/lib/msvcrt/misc/dllmain.c @@ -1,4 +1,4 @@ -/* $Id: dllmain.c,v 1.20 2004/01/31 13:29:19 navaraf Exp $ +/* $Id: dllmain.c,v 1.21 2004/05/11 20:44:30 gvg Exp $ * * dllmain.c * @@ -14,9 +14,9 @@ * DISCLAMED. This includes but is not limited to warrenties of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * - * $Revision: 1.20 $ - * $Author: navaraf $ - * $Date: 2004/01/31 13:29:19 $ + * $Revision: 1.21 $ + * $Author: gvg $ + * $Date: 2004/05/11 20:44:30 $ * */ @@ -90,7 +90,7 @@ DllMain(PVOID hinstDll, ULONG dwReason, PVOID reserved) if (!CreateThreadData()) return FALSE; - _acmdln = (char *)GetCommandLineA(); + _acmdln = strdup(GetCommandLineA()); /* FIXME: This crashes all applications */ if (BlockEnvToEnviron() < 0) diff --git a/reactos/subsys/system/cmd/cmd.c b/reactos/subsys/system/cmd/cmd.c index 2b04cef9ccc..78131f812fc 100644 --- a/reactos/subsys/system/cmd/cmd.c +++ b/reactos/subsys/system/cmd/cmd.c @@ -1,4 +1,4 @@ -/* $Id: cmd.c,v 1.12 2004/04/30 16:52:41 navaraf Exp $ +/* $Id: cmd.c,v 1.13 2004/05/11 20:44:30 gvg Exp $ * * CMD.C - command-line interface. * @@ -296,7 +296,7 @@ static BOOL IsConsoleProcess(HANDLE Process) */ static VOID -Execute (LPTSTR first, LPTSTR rest) +Execute (LPTSTR full, LPTSTR first, LPTSTR rest) { TCHAR szFullName[MAX_PATH]; #ifndef __REACTOS__ @@ -352,17 +352,13 @@ Execute (LPTSTR first, LPTSTR rest) else { /* exec the program */ - TCHAR szFullCmdLine [CMDLINE_LENGTH]; PROCESS_INFORMATION prci; STARTUPINFO stui; #ifdef _DEBUG - DebugPrintf (_T("[EXEC: %s %s]\n"), szFullName, rest); + DebugPrintf (_T("[EXEC: %s %s]\n"), full, rest); #endif /* build command line for CreateProcess() */ - _tcscpy (szFullCmdLine, first); - _tcscat (szFullCmdLine, _T(" ")); - _tcscat (szFullCmdLine, rest); /* fill startup info */ memset (&stui, 0, sizeof (STARTUPINFO)); @@ -373,9 +369,9 @@ Execute (LPTSTR first, LPTSTR rest) // return console to standard mode SetConsoleMode (GetStdHandle(STD_INPUT_HANDLE), ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_ECHO_INPUT ); - + if (CreateProcess (szFullName, - szFullCmdLine, + full, NULL, NULL, FALSE, @@ -433,7 +429,7 @@ DoCommand (LPTSTR line) TCHAR com[CMDLINE_LENGTH]; /* the first word in the command */ LPTSTR cp = com; LPTSTR cstart; - LPTSTR rest = line; /* pointer to the rest of the command line */ + LPTSTR rest; /* pointer to the rest of the command line */ INT cl; LPCOMMAND cmdptr; @@ -442,8 +438,9 @@ DoCommand (LPTSTR line) #endif /* DEBUG */ /* Skip over initial white space */ - while (_istspace (*rest)) - rest++; + while (_istspace (*line)) + line++; + rest = line; cstart = rest; @@ -458,6 +455,8 @@ DoCommand (LPTSTR line) while(*rest != _T('\0') && *rest != _T('"')) *cp++ = _totlower (*rest++); + if (*rest == _T('"')) + rest++; } else { @@ -486,7 +485,7 @@ DoCommand (LPTSTR line) /* If end of table execute ext cmd */ if (cmdptr->name == NULL) { - Execute (com, rest); + Execute (line, com, rest); break; } From 45ac874e115e097e66dcc3be1dc4193e3d1ef6aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Tue, 11 May 2004 20:52:10 +0000 Subject: [PATCH 1087/1463] Avoid warnings when using gcc 3.4 svn path=/trunk/; revision=9356 --- reactos/drivers/net/afd/afd/routines.c | 6 +- reactos/drivers/net/dd/ne2000/include/8390.h | 2 +- reactos/drivers/net/dd/ne2000/ne2000/8390.c | 10 +- reactos/drivers/net/dd/ne2000/ne2000/main.c | 30 +- reactos/drivers/net/ndis/ndis/buffer.c | 12 +- reactos/drivers/net/ndis/ndis/miniport.c | 6 +- reactos/drivers/net/ndis/ndis/protocol.c | 8 +- reactos/drivers/net/npf/openclos.c | 8 +- reactos/drivers/net/npf/packet.c | 10 +- reactos/drivers/net/npf/packet.h | 20 +- reactos/drivers/net/npf/read.c | 30 +- reactos/drivers/net/npf/win_bpf_filter.c | 4 +- reactos/drivers/net/npf/win_bpf_filter_init.c | 2 +- reactos/drivers/net/npf/write.c | 4 +- reactos/drivers/net/tcpip/datalink/arp.c | 8 +- reactos/drivers/net/tcpip/datalink/lan.c | 22 +- reactos/drivers/net/tcpip/datalink/loopback.c | 2 +- reactos/drivers/net/tcpip/network/transmit.c | 2 +- reactos/drivers/net/tcpip/tcpip/checksum.c | 2 +- reactos/drivers/net/tcpip/tcpip/fileobjs.c | 2 +- reactos/drivers/net/tcpip/tcpip/routines.c | 16 +- .../net/tcpip/transport/datagram/datagram.c | 2 +- reactos/drivers/net/tcpip/transport/udp/udp.c | 2 +- reactos/include/net/ndis.h | 329 +++++++++--------- 24 files changed, 269 insertions(+), 270 deletions(-) diff --git a/reactos/drivers/net/afd/afd/routines.c b/reactos/drivers/net/afd/afd/routines.c index 741d72bf52d..211ca5be16e 100644 --- a/reactos/drivers/net/afd/afd/routines.c +++ b/reactos/drivers/net/afd/afd/routines.c @@ -193,9 +193,9 @@ ULONG ChecksumCompute( register ULONG Sum = Seed; while (Count > 1) { - Sum += *(PUSHORT)Data; - Count -= 2; - (ULONG_PTR)Data += 2; + Sum += *(PUSHORT)Data; + Count -= 2; + Data = (PVOID) ((ULONG_PTR) Data + 2); } /* Add left-over byte, if any */ diff --git a/reactos/drivers/net/dd/ne2000/include/8390.h b/reactos/drivers/net/dd/ne2000/include/8390.h index 57b3107c03a..445cf94921f 100644 --- a/reactos/drivers/net/dd/ne2000/include/8390.h +++ b/reactos/drivers/net/dd/ne2000/include/8390.h @@ -153,7 +153,7 @@ typedef struct _PACKET_HEADER { NdisRawWritePortUchar((Adapter)->IOBase + PG0_IMR, (Adapter)->InterruptMask); \ } -VOID MiniportHandleInterrupt( +VOID STDCALL MiniportHandleInterrupt( IN NDIS_HANDLE MiniportAdapterContext); #endif /* __8390_H */ diff --git a/reactos/drivers/net/dd/ne2000/ne2000/8390.c b/reactos/drivers/net/dd/ne2000/ne2000/8390.c index 1ea6f92bc48..d99a9781dec 100644 --- a/reactos/drivers/net/dd/ne2000/ne2000/8390.c +++ b/reactos/drivers/net/dd/ne2000/ne2000/8390.c @@ -815,8 +815,8 @@ VOID NICReadData( /* Transfer as many words as we can without exceeding the buffer length */ Tmp = Length & 0xFFFE; NICReadDataAlign(Adapter, (PUSHORT)Target, Source, Tmp); - Source += Tmp; - (ULONG_PTR)Target += Tmp; + Source += Tmp; + Target = (PUCHAR)((ULONG_PTR) Target + Tmp); /* Read one word and keep the LSB */ NICReadDataAlign(Adapter, &Tmp, Source, 0x02); @@ -855,7 +855,7 @@ VOID NICWriteData( NICWriteDataAlign(Adapter, Target - 1, &Tmp, 0x02); /* Update pointers */ - (ULONG_PTR)Source += 1; + Source = (PUCHAR) ((ULONG_PTR) Source + 1); (ULONG_PTR)Target += 1; Length--; } @@ -1030,7 +1030,7 @@ VOID NICWritePacket( NICWriteData(Adapter, DstData, SrcData, BytesToCopy); - (ULONG_PTR)SrcData += BytesToCopy; + SrcData = (PUCHAR)((ULONG_PTR) SrcData + BytesToCopy); SrcSize -= BytesToCopy; DstData += BytesToCopy; DstSize -= BytesToCopy; @@ -1291,7 +1291,7 @@ VOID HandleTransmit( } -VOID MiniportHandleInterrupt( +VOID STDCALL MiniportHandleInterrupt( IN NDIS_HANDLE MiniportAdapterContext) /* * FUNCTION: Handler for deferred processing of interrupts diff --git a/reactos/drivers/net/dd/ne2000/ne2000/main.c b/reactos/drivers/net/dd/ne2000/ne2000/main.c index 6597e3ec395..fa85d5dddb6 100644 --- a/reactos/drivers/net/dd/ne2000/ne2000/main.c +++ b/reactos/drivers/net/dd/ne2000/ne2000/main.c @@ -69,7 +69,7 @@ BOOLEAN MiniportCheckForHang( } -VOID MiniportDisableInterrupt( +VOID STDCALL MiniportDisableInterrupt( IN NDIS_HANDLE MiniportAdapterContext) /* * FUNCTION: Disables interrupts from an adapter @@ -84,7 +84,7 @@ VOID MiniportDisableInterrupt( } -VOID MiniportEnableInterrupt( +VOID STDCALL MiniportEnableInterrupt( IN NDIS_HANDLE MiniportAdapterContext) /* * FUNCTION: Enables interrupts from an adapter @@ -99,7 +99,7 @@ VOID MiniportEnableInterrupt( } -VOID MiniportHalt( +VOID STDCALL MiniportHalt( IN NDIS_HANDLE MiniportAdapterContext) /* * FUNCTION: Deallocates resources for and halts an adapter @@ -139,7 +139,7 @@ VOID MiniportHalt( } -NDIS_STATUS MiniportInitialize( +NDIS_STATUS STDCALL MiniportInitialize( OUT PNDIS_STATUS OpenErrorStatus, OUT PUINT SelectedMediumIndex, IN PNDIS_MEDIUM MediumArray, @@ -347,7 +347,7 @@ NDIS_STATUS MiniportInitialize( } -VOID MiniportISR( +VOID STDCALL MiniportISR( OUT PBOOLEAN InterruptRecognized, OUT PBOOLEAN QueueMiniportHandleInterrupt, IN NDIS_HANDLE MiniportAdapterContext) @@ -372,7 +372,7 @@ VOID MiniportISR( } -NDIS_STATUS MiniportQueryInformation( +NDIS_STATUS STDCALL MiniportQueryInformation( IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_OID Oid, IN PVOID InformationBuffer, @@ -530,7 +530,7 @@ NDIS_STATUS MiniportQueryInformation( } -NDIS_STATUS MiniportReconfigure( +NDIS_STATUS STDCALL MiniportReconfigure( OUT PNDIS_STATUS OpenErrorStatus, IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_HANDLE WrapperConfigurationContext) @@ -553,7 +553,7 @@ NDIS_STATUS MiniportReconfigure( -NDIS_STATUS MiniportReset( +NDIS_STATUS STDCALL MiniportReset( OUT PBOOLEAN AddressingReset, IN NDIS_HANDLE MiniportAdapterContext) /* @@ -573,7 +573,7 @@ NDIS_STATUS MiniportReset( } -NDIS_STATUS MiniportSend( +NDIS_STATUS STDCALL MiniportSend( IN NDIS_HANDLE MiniportAdapterContext, IN PNDIS_PACKET Packet, IN UINT Flags) @@ -614,7 +614,7 @@ NDIS_STATUS MiniportSend( } -NDIS_STATUS MiniportSetInformation( +NDIS_STATUS STDCALL MiniportSetInformation( IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_OID Oid, IN PVOID InformationBuffer, @@ -720,7 +720,7 @@ NDIS_STATUS MiniportSetInformation( } -NDIS_STATUS MiniportTransferData( +NDIS_STATUS STDCALL MiniportTransferData( OUT PNDIS_PACKET Packet, OUT PUINT BytesTransferred, IN NDIS_HANDLE MiniportAdapterContext, @@ -775,10 +775,10 @@ NDIS_STATUS MiniportTransferData( NICReadData(Adapter, DstData, SrcData, BytesToCopy); - BytesCopied += BytesToCopy; - SrcData += BytesToCopy; - (ULONG_PTR)DstData += BytesToCopy; - BytesToTransfer -= BytesToCopy; + BytesCopied += BytesToCopy; + SrcData += BytesToCopy; + DstData = (PUCHAR)((ULONG_PTR) DstData + BytesToCopy); + BytesToTransfer -= BytesToCopy; if (BytesToTransfer == 0) break; diff --git a/reactos/drivers/net/ndis/ndis/buffer.c b/reactos/drivers/net/ndis/ndis/buffer.c index 37b736f4d0a..1fd334c1a39 100644 --- a/reactos/drivers/net/ndis/ndis/buffer.c +++ b/reactos/drivers/net/ndis/ndis/buffer.c @@ -39,8 +39,8 @@ __inline ULONG SkipToOffset( NdisQueryBuffer(Buffer, (PVOID)Data, Size); if (Offset < *Size) { - ((ULONG_PTR)*Data) += Offset; - *Size -= Offset; + *Data = (PUCHAR) ((ULONG_PTR) *Data + Offset); + *Size -= Offset; break; } @@ -87,8 +87,8 @@ UINT CopyBufferToBufferChain( BytesToCopy = MIN(DstSize, Length); RtlCopyMemory((PVOID)DstData, (PVOID)SrcData, BytesToCopy); - BytesCopied += BytesToCopy; - (ULONG_PTR)SrcData += BytesToCopy; + BytesCopied += BytesToCopy; + SrcData = (PUCHAR) ((ULONG_PTR) SrcData + BytesToCopy); Length -= BytesToCopy; if (Length == 0) @@ -146,8 +146,8 @@ UINT CopyBufferChainToBuffer( NDIS_DbgPrint(MAX_TRACE, ("Copying (%d) bytes from 0x%X to 0x%X\n", BytesToCopy, SrcData, DstData)); RtlCopyMemory((PVOID)DstData, (PVOID)SrcData, BytesToCopy); - BytesCopied += BytesToCopy; - (ULONG_PTR)DstData += BytesToCopy; + BytesCopied += BytesToCopy; + DstData = (PUCHAR)((ULONG_PTR) DstData + BytesToCopy); Length -= BytesToCopy; if (Length == 0) diff --git a/reactos/drivers/net/ndis/ndis/miniport.c b/reactos/drivers/net/ndis/ndis/miniport.c index d41366e37f1..575396f4c87 100644 --- a/reactos/drivers/net/ndis/ndis/miniport.c +++ b/reactos/drivers/net/ndis/ndis/miniport.c @@ -306,7 +306,7 @@ MiniIndicateReceivePacket( } -VOID +VOID STDCALL MiniEthReceiveComplete( IN PETH_FILTER Filter) /* @@ -349,7 +349,7 @@ MiniEthReceiveComplete( } -VOID +VOID STDCALL MiniEthReceiveIndication( IN PETH_FILTER Filter, /* shouldn't be NDIS_HANDLE? */ IN NDIS_HANDLE MacReceiveContext, @@ -427,7 +427,7 @@ MiniSendResourcesAvailable( } -VOID +VOID STDCALL MiniTransferDataComplete( IN NDIS_HANDLE MiniportAdapterHandle, IN PNDIS_PACKET Packet, diff --git a/reactos/drivers/net/ndis/ndis/protocol.c b/reactos/drivers/net/ndis/ndis/protocol.c index 059ac0a5a00..6cc859ab264 100644 --- a/reactos/drivers/net/ndis/ndis/protocol.c +++ b/reactos/drivers/net/ndis/ndis/protocol.c @@ -107,7 +107,7 @@ ProIndicatePacket( } -NDIS_STATUS +NDIS_STATUS STDCALL ProRequest( IN NDIS_HANDLE MacBindingHandle, IN PNDIS_REQUEST NdisRequest) @@ -179,7 +179,7 @@ ProRequest( } -NDIS_STATUS +NDIS_STATUS STDCALL ProReset( IN NDIS_HANDLE MacBindingHandle) { @@ -189,7 +189,7 @@ ProReset( } -NDIS_STATUS +NDIS_STATUS STDCALL ProSend( IN NDIS_HANDLE MacBindingHandle, IN PNDIS_PACKET Packet) @@ -383,7 +383,7 @@ ProSendPackets( } -NDIS_STATUS +NDIS_STATUS STDCALL ProTransferData( IN NDIS_HANDLE MacBindingHandle, IN NDIS_HANDLE MacReceiveContext, diff --git a/reactos/drivers/net/npf/openclos.c b/reactos/drivers/net/npf/openclos.c index fbf2edf1df6..ccb4bf4ca57 100644 --- a/reactos/drivers/net/npf/openclos.c +++ b/reactos/drivers/net/npf/openclos.c @@ -208,7 +208,7 @@ NPF_Open(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) Open->Buffer = NULL; Open->Bhead = 0; Open->Btail = 0; - (INT)Open->BLastByte = -1; + Open->BLastByte = (UINT) -1; Open->Dropped = 0; //reset the dropped packets counter Open->Received = 0; //reset the received packets counter Open->Accepted = 0; //reset the accepted packets counter @@ -277,7 +277,7 @@ NPF_Open(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) //------------------------------------------------------------------- -VOID NPF_OpenAdapterComplete( +VOID STDCALL NPF_OpenAdapterComplete( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS Status, IN NDIS_STATUS OpenErrorStatus) @@ -487,7 +487,7 @@ NPF_Close(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp) //------------------------------------------------------------------- -VOID +VOID STDCALL NPF_CloseAdapterComplete(IN NDIS_HANDLE ProtocolBindingContext,IN NDIS_STATUS Status) { POPEN_INSTANCE Open; @@ -640,7 +640,7 @@ NPF_UnbindAdapter( //------------------------------------------------------------------- -VOID +VOID STDCALL NPF_ResetComplete(IN NDIS_HANDLE ProtocolBindingContext,IN NDIS_STATUS Status) { diff --git a/reactos/drivers/net/npf/packet.c b/reactos/drivers/net/npf/packet.c index 4ccc3189f45..7e0882ca61b 100644 --- a/reactos/drivers/net/npf/packet.c +++ b/reactos/drivers/net/npf/packet.c @@ -804,7 +804,7 @@ NPF_IoControl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp) //return Open->Bhead = 0; Open->Btail = 0; - (INT)Open->BLastByte = -1; + Open->BLastByte = (UINT) -1; Open->Received = 0; Open->Dropped = 0; Open->Accepted = 0; @@ -951,7 +951,7 @@ NPF_IoControl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp) Open->Buffer = tpointer; Open->Bhead = 0; Open->Btail = 0; - (INT)Open->BLastByte = -1; + Open->BLastByte = (UINT) -1; Open->BufSize = (UINT)dim; EXIT_SUCCESS(dim); @@ -1101,7 +1101,7 @@ NPF_IoControl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp) //------------------------------------------------------------------- -VOID +VOID STDCALL NPF_RequestComplete( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_REQUEST NdisRequest, @@ -1185,7 +1185,7 @@ NPF_RequestComplete( //------------------------------------------------------------------- -VOID +VOID STDCALL NPF_Status( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS Status, @@ -1203,7 +1203,7 @@ NPF_Status( //------------------------------------------------------------------- -VOID +VOID STDCALL NPF_StatusComplete( IN NDIS_HANDLE ProtocolBindingContext ) diff --git a/reactos/drivers/net/npf/packet.h b/reactos/drivers/net/npf/packet.h index 062a790b6d5..d5f0064cd14 100644 --- a/reactos/drivers/net/npf/packet.h +++ b/reactos/drivers/net/npf/packet.h @@ -470,7 +470,7 @@ NPF_Open( Callback function associated with the NdisOpenAdapter() NDIS function. It is invoked by NDIS when the NIC driver has finished an open operation that was previously started by NPF_Open(). */ -VOID +VOID STDCALL NPF_OpenAdapterComplete( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS Status, @@ -501,7 +501,7 @@ NPF_Close( Callback function associated with the NdisCloseAdapter() NDIS function. It is invoked by NDIS when the NIC driver has finished a close operation that was previously started by NPF_Close(). */ -VOID +VOID STDCALL NPF_CloseAdapterComplete( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS Status @@ -529,7 +529,7 @@ NPF_CloseAdapterComplete( along with the filtering ones, that is executed for every incoming packet, therefore it is carefully optimized. */ -NDIS_STATUS +NDIS_STATUS STDCALL NPF_tap( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE MacReceiveContext, @@ -550,7 +550,7 @@ NPF_tap( Callback function associated with the NdisTransferData() NDIS function. It is invoked by NDIS when the NIC driver has finished the transfer of a packet from the NIC driver memory to the NPF circular buffer. */ -VOID +VOID STDCALL NPF_TransferDataComplete( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet, @@ -564,7 +564,7 @@ NPF_TransferDataComplete( does nothing in NPF */ -VOID +VOID STDCALL NPF_ReceiveComplete(IN NDIS_HANDLE ProtocolBindingContext); /*! @@ -606,7 +606,7 @@ NPF_IoControl( Callback function associated with the NdisRequest() NDIS function. It is invoked by NDIS when the NIC driver has finished an OID request operation that was previously started by NPF_IoControl(). */ -VOID +VOID STDCALL NPF_RequestComplete( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_REQUEST pRequest, @@ -664,7 +664,7 @@ INT NPF_BufferedWrite(IN PIRP Irp, Callback function associated with the NdisSend() NDIS function. It is invoked by NDIS when the NIC driver has finished an OID request operation that was previously started by NPF_Write(). */ -VOID +VOID STDCALL NPF_SendComplete( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET pPacket, @@ -680,7 +680,7 @@ NPF_SendComplete( driver has finished an OID request operation that was previously started by NPF_IoControl(), in an IOCTL_PROTOCOL_RESET command. */ -VOID +VOID STDCALL NPF_ResetComplete( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS Status @@ -689,7 +689,7 @@ NPF_ResetComplete( /*! \brief Callback for NDIS StatusHandler. Not used by NPF */ -VOID +VOID STDCALL NPF_Status( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS Status, @@ -701,7 +701,7 @@ NPF_Status( /*! \brief Callback for NDIS StatusCompleteHandler. Not used by NPF */ -VOID +VOID STDCALL NPF_StatusComplete(IN NDIS_HANDLE ProtocolBindingContext); /*! diff --git a/reactos/drivers/net/npf/read.c b/reactos/drivers/net/npf/read.c index 093146f7991..5f9508884ef 100644 --- a/reactos/drivers/net/npf/read.c +++ b/reactos/drivers/net/npf/read.c @@ -70,26 +70,32 @@ void PacketMoveMem(PVOID Destination, PVOID Source, ULONG Length, UINT *Bhead) { ULONG WordLength; UINT n,i,NBlocks; +PULONG ULSrc, ULDest; +PUCHAR UCSrc, UCDest; WordLength=Length>>2; NBlocks=WordLength>>8; - + + ULSrc = (PULONG) Source; + ULDest = (PULONG) Destination; for(n=0;n<NBlocks;n++){ for(i=0;i<256;i++){ - *((PULONG)Destination)++=*((PULONG)Source)++; + *ULDest++ = *ULSrc++; } *Bhead+=1024; } n=WordLength-(NBlocks<<8); for(i=0;i<n;i++){ - *((PULONG)Destination)++=*((PULONG)Source)++; + *ULDest++ = *ULSrc++; } *Bhead+=n<<2; - + + UCDest = (PUCHAR) ULDest; + UCSrc = (PUCHAR) ULSrc; n=Length-(WordLength<<2); for(i=0;i<n;i++){ - *((PUCHAR)Destination)++=*((PUCHAR)Source)++; + *UCDest++ = *UCSrc++; } *Bhead+=n; } @@ -299,7 +305,7 @@ NPF_Read(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp) PacketMoveMem(packp, CurrBuff+Thead, SizeToCopy, &(Open->Bhead)); // Reset the buffer NdisAcquireSpinLock( &Open->BufLock ); - (INT)Open->BLastByte = -1; + Open->BLastByte = (UINT) -1; Open->Bhead = 0; NdisReleaseSpinLock( &Open->BufLock ); @@ -325,9 +331,9 @@ NPF_Read(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp) //------------------------------------------------------------------- -NDIS_STATUS NPF_tap (IN NDIS_HANDLE ProtocolBindingContext,IN NDIS_HANDLE MacReceiveContext, - IN PVOID HeaderBuffer,IN UINT HeaderBufferSize,IN PVOID LookAheadBuffer, - IN UINT LookaheadBufferSize,IN UINT PacketSize) +NDIS_STATUS STDCALL NPF_tap (IN NDIS_HANDLE ProtocolBindingContext,IN NDIS_HANDLE MacReceiveContext, + IN PVOID HeaderBuffer,IN UINT HeaderBufferSize,IN PVOID LookAheadBuffer, + IN UINT LookaheadBufferSize,IN UINT PacketSize) { POPEN_INSTANCE Open; PNDIS_PACKET pPacketb; @@ -641,8 +647,8 @@ NDIS_STATUS NPF_tap (IN NDIS_HANDLE ProtocolBindingContext,IN NDIS_HANDLE MacRec //------------------------------------------------------------------- -VOID NPF_TransferDataComplete (IN NDIS_HANDLE ProtocolBindingContext,IN PNDIS_PACKET pPacket, - IN NDIS_STATUS Status,IN UINT BytesTransfered) +VOID STDCALL NPF_TransferDataComplete (IN NDIS_HANDLE ProtocolBindingContext,IN PNDIS_PACKET pPacket, + IN NDIS_STATUS Status,IN UINT BytesTransfered) { POPEN_INSTANCE Open; @@ -668,7 +674,7 @@ VOID NPF_TransferDataComplete (IN NDIS_HANDLE ProtocolBindingContext,IN PNDIS_PA //------------------------------------------------------------------- -VOID NPF_ReceiveComplete(IN NDIS_HANDLE ProtocolBindingContext) +VOID STDCALL NPF_ReceiveComplete(IN NDIS_HANDLE ProtocolBindingContext) { IF_VERY_LOUD(DbgPrint("NPF: NPF_ReceiveComplete\n");) return; diff --git a/reactos/drivers/net/npf/win_bpf_filter.c b/reactos/drivers/net/npf/win_bpf_filter.c index 39b108d0dd9..d24a8bf038b 100644 --- a/reactos/drivers/net/npf/win_bpf_filter.c +++ b/reactos/drivers/net/npf/win_bpf_filter.c @@ -401,7 +401,7 @@ u_int bpf_filter(pc, p, wirelen, buflen,mem_ex,tme,time_ref) continue; case BPF_ALU|BPF_NEG: - (int)A = -((int)A); + A = (u_int32)(-((int)A)); continue; case BPF_MISC|BPF_TAX: @@ -840,7 +840,7 @@ u_int bpf_filter_with_2_buffers(pc, p, pd, headersize, wirelen, buflen, mem_ex,t continue; case BPF_ALU|BPF_NEG: - (int)A = -((int)A); + A = (u_int32)(-((int)A)); continue; case BPF_MISC|BPF_TAX: diff --git a/reactos/drivers/net/npf/win_bpf_filter_init.c b/reactos/drivers/net/npf/win_bpf_filter_init.c index 51fb5d458ba..f276243e807 100644 --- a/reactos/drivers/net/npf/win_bpf_filter_init.c +++ b/reactos/drivers/net/npf/win_bpf_filter_init.c @@ -602,7 +602,7 @@ uint32 bpf_filter_init(register struct bpf_insn *pc, MEM_TYPE *mem_ex, TME_CORE continue; case BPF_ALU|BPF_NEG: - (int32)A = -((int32)A); + A = (uint32)(-((int32)A)); continue; /* ARITHMETIC INSTRUCTIONS */ diff --git a/reactos/drivers/net/npf/write.c b/reactos/drivers/net/npf/write.c index 291474d7667..857e92ab143 100644 --- a/reactos/drivers/net/npf/write.c +++ b/reactos/drivers/net/npf/write.c @@ -253,7 +253,7 @@ NPF_BufferedWrite( } // Step to the next packet in the buffer - (PCHAR)winpcap_hdr += winpcap_hdr->caplen + sizeof(struct sf_pkthdr); + winpcap_hdr = (struct sf_pkthdr *)((PCHAR)winpcap_hdr + winpcap_hdr->caplen + sizeof(struct sf_pkthdr)); // Check if the end of the user buffer has been reached if( (PCHAR)winpcap_hdr >= EndOfUserBuff ) @@ -296,7 +296,7 @@ NPF_BufferedWrite( //------------------------------------------------------------------- -VOID +VOID STDCALL NPF_SendComplete( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET pPacket, diff --git a/reactos/drivers/net/tcpip/datalink/arp.c b/reactos/drivers/net/tcpip/datalink/arp.c index 01a21b55836..80f5f2c0e35 100644 --- a/reactos/drivers/net/tcpip/datalink/arp.c +++ b/reactos/drivers/net/tcpip/datalink/arp.c @@ -90,19 +90,19 @@ PNDIS_PACKET PrepareARPPacket( /* Our hardware address */ RtlCopyMemory(DataBuffer, SenderLinkAddress, LinkAddressLength); - (ULONG_PTR)DataBuffer += LinkAddressLength; + DataBuffer = (PVOID)((ULONG_PTR)DataBuffer + LinkAddressLength); /* Our protocol address */ RtlCopyMemory(DataBuffer, SenderProtoAddress, ProtoAddressLength); if (TargetLinkAddress) { - (ULONG_PTR)DataBuffer += ProtoAddressLength; + DataBuffer = (PVOID)((ULONG_PTR)DataBuffer + ProtoAddressLength); /* Target hardware address */ RtlCopyMemory(DataBuffer, TargetLinkAddress, LinkAddressLength); - (ULONG_PTR)DataBuffer += LinkAddressLength; + DataBuffer = (PVOID)((ULONG_PTR)DataBuffer + LinkAddressLength); } else /* Don't care about target hardware address */ - (ULONG_PTR)DataBuffer += (ProtoAddressLength + LinkAddressLength); + DataBuffer = (PVOID)((ULONG_PTR)DataBuffer + ProtoAddressLength + LinkAddressLength); /* Target protocol address */ RtlCopyMemory(DataBuffer, TargetProtoAddress, ProtoAddressLength); diff --git a/reactos/drivers/net/tcpip/datalink/lan.c b/reactos/drivers/net/tcpip/datalink/lan.c index fd4aec48218..fb84e4cdc58 100644 --- a/reactos/drivers/net/tcpip/datalink/lan.c +++ b/reactos/drivers/net/tcpip/datalink/lan.c @@ -152,7 +152,7 @@ VOID FreeAdapter( } -VOID ProtocolOpenAdapterComplete( +VOID STDCALL ProtocolOpenAdapterComplete( NDIS_HANDLE BindingContext, NDIS_STATUS Status, NDIS_STATUS OpenErrorStatus) @@ -172,7 +172,7 @@ VOID ProtocolOpenAdapterComplete( } -VOID ProtocolCloseAdapterComplete( +VOID STDCALL ProtocolCloseAdapterComplete( NDIS_HANDLE BindingContext, NDIS_STATUS Status) /* @@ -192,7 +192,7 @@ VOID ProtocolCloseAdapterComplete( } -VOID ProtocolResetComplete( +VOID STDCALL ProtocolResetComplete( NDIS_HANDLE BindingContext, NDIS_STATUS Status) /* @@ -206,7 +206,7 @@ VOID ProtocolResetComplete( } -VOID ProtocolRequestComplete( +VOID STDCALL ProtocolRequestComplete( NDIS_HANDLE BindingContext, PNDIS_REQUEST NdisRequest, NDIS_STATUS Status) @@ -229,7 +229,7 @@ VOID ProtocolRequestComplete( } -VOID ProtocolSendComplete( +VOID STDCALL ProtocolSendComplete( NDIS_HANDLE BindingContext, PNDIS_PACKET Packet, NDIS_STATUS Status) @@ -251,7 +251,7 @@ VOID ProtocolSendComplete( } -VOID ProtocolTransferDataComplete( +VOID STDCALL ProtocolTransferDataComplete( NDIS_HANDLE BindingContext, PNDIS_PACKET Packet, NDIS_STATUS Status, @@ -310,7 +310,7 @@ VOID ProtocolTransferDataComplete( } -NDIS_STATUS ProtocolReceive( +NDIS_STATUS STDCALL ProtocolReceive( NDIS_HANDLE BindingContext, NDIS_HANDLE MacReceiveContext, PVOID HeaderBuffer, @@ -443,7 +443,7 @@ NDIS_STATUS ProtocolReceive( } -VOID ProtocolReceiveComplete( +VOID STDCALL ProtocolReceiveComplete( NDIS_HANDLE BindingContext) /* * FUNCTION: Called by NDIS when we're done receiving data @@ -455,7 +455,7 @@ VOID ProtocolReceiveComplete( } -VOID ProtocolStatus( +VOID STDCALL ProtocolStatus( NDIS_HANDLE BindingContext, NDIS_STATUS GenerelStatus, PVOID StatusBuffer, @@ -473,7 +473,7 @@ VOID ProtocolStatus( } -VOID ProtocolStatusComplete( +VOID STDCALL ProtocolStatusComplete( NDIS_HANDLE NdisBindingContext) /* * FUNCTION: Called by NDIS when a status-change has occurred @@ -484,7 +484,7 @@ VOID ProtocolStatusComplete( TI_DbgPrint(DEBUG_DATALINK, ("Called.\n")); } -VOID ProtocolBindAdapter( +VOID STDCALL ProtocolBindAdapter( OUT PNDIS_STATUS Status, IN NDIS_HANDLE BindContext, IN PNDIS_STRING DeviceName, diff --git a/reactos/drivers/net/tcpip/datalink/loopback.c b/reactos/drivers/net/tcpip/datalink/loopback.c index 2f03aa1815b..beaca01f08b 100644 --- a/reactos/drivers/net/tcpip/datalink/loopback.c +++ b/reactos/drivers/net/tcpip/datalink/loopback.c @@ -27,7 +27,7 @@ PNDIS_PACKET LoopQueueTail = (PNDIS_PACKET)NULL; KSPIN_LOCK LoopQueueLock; -VOID RealTransmit( +VOID STDCALL RealTransmit( PVOID Context) /* * FUNCTION: Transmits one or more packet(s) in loopback queue to ourselves diff --git a/reactos/drivers/net/tcpip/network/transmit.c b/reactos/drivers/net/tcpip/network/transmit.c index 80e561fb222..fc8168ae656 100644 --- a/reactos/drivers/net/tcpip/network/transmit.c +++ b/reactos/drivers/net/tcpip/network/transmit.c @@ -68,7 +68,7 @@ BOOLEAN PrepareNextFragment( Header->Checksum = (USHORT)IPv4Checksum(Header, IFC->HeaderSize, 0); /* Update pointers */ - (ULONG_PTR)IFC->DatagramData += DataSize; + IFC->DatagramData = (PVOID)((ULONG_PTR)IFC->DatagramData + DataSize); IFC->Position += DataSize; IFC->BytesLeft -= DataSize; diff --git a/reactos/drivers/net/tcpip/tcpip/checksum.c b/reactos/drivers/net/tcpip/tcpip/checksum.c index d39a3a8830d..2566b6b82c4 100644 --- a/reactos/drivers/net/tcpip/tcpip/checksum.c +++ b/reactos/drivers/net/tcpip/tcpip/checksum.c @@ -44,7 +44,7 @@ ULONG ChecksumCompute( { Sum += *(PUSHORT)Data; Count -= 2; - (ULONG_PTR)Data += 2; + Data = (PVOID)((ULONG_PTR) Data + 2); } /* Add left-over byte, if any */ diff --git a/reactos/drivers/net/tcpip/tcpip/fileobjs.c b/reactos/drivers/net/tcpip/tcpip/fileobjs.c index d912a56db25..dbfef4f77c4 100644 --- a/reactos/drivers/net/tcpip/tcpip/fileobjs.c +++ b/reactos/drivers/net/tcpip/tcpip/fileobjs.c @@ -173,7 +173,7 @@ VOID DeleteConnectionEndpoint( } -VOID RequestWorker( +VOID STDCALL RequestWorker( PVOID Context) /* * FUNCTION: Worker routine for processing address file object requests diff --git a/reactos/drivers/net/tcpip/tcpip/routines.c b/reactos/drivers/net/tcpip/tcpip/routines.c index 64bf343bff4..dbf303d230b 100644 --- a/reactos/drivers/net/tcpip/tcpip/routines.c +++ b/reactos/drivers/net/tcpip/tcpip/routines.c @@ -141,7 +141,7 @@ __inline INT SkipToOffset( NdisQueryBuffer(Buffer, (PVOID)Data, Size); if (Offset < *Size) { - ((ULONG_PTR)*Data) += Offset; + *Data = (PUCHAR)((ULONG_PTR) *Data + Offset); *Size -= Offset; break; } @@ -189,8 +189,8 @@ UINT CopyBufferToBufferChain( BytesToCopy = MIN(DstSize, Length); RtlCopyMemory((PVOID)DstData, (PVOID)SrcData, BytesToCopy); - BytesCopied += BytesToCopy; - (ULONG_PTR)SrcData += BytesToCopy; + BytesCopied += BytesToCopy; + SrcData = (PUCHAR)((ULONG_PTR)SrcData + BytesToCopy); Length -= BytesToCopy; if (Length == 0) @@ -248,8 +248,8 @@ UINT CopyBufferChainToBuffer( TI_DbgPrint(DEBUG_BUFFER, ("Copying (%d) bytes from 0x%X to 0x%X\n", BytesToCopy, SrcData, DstData)); RtlCopyMemory((PVOID)DstData, (PVOID)SrcData, BytesToCopy); - BytesCopied += BytesToCopy; - (ULONG_PTR)DstData += BytesToCopy; + BytesCopied += BytesToCopy; + DstData = (PUCHAR)((ULONG_PTR)DstData + BytesToCopy); Length -= BytesToCopy; if (Length == 0) @@ -444,9 +444,9 @@ PVOID AdjustPacket( /* If Adjust is zero there is no need to adjust this packet as there is no additional space at start the of first buffer */ if (Adjust != 0) { - (ULONG_PTR)(NdisBuffer->MappedSystemVa) += Adjust; - NdisBuffer->ByteOffset += Adjust; - NdisBuffer->ByteCount -= Adjust; + NdisBuffer->MappedSystemVa = (PVOID) ((ULONG_PTR)(NdisBuffer->MappedSystemVa) + Adjust); + NdisBuffer->ByteOffset += Adjust; + NdisBuffer->ByteCount -= Adjust; } return NdisBuffer->MappedSystemVa; diff --git a/reactos/drivers/net/tcpip/transport/datagram/datagram.c b/reactos/drivers/net/tcpip/transport/datagram/datagram.c index 64d95d841c9..a7beb2746c5 100644 --- a/reactos/drivers/net/tcpip/transport/datagram/datagram.c +++ b/reactos/drivers/net/tcpip/transport/datagram/datagram.c @@ -23,7 +23,7 @@ KSPIN_LOCK DGPendingListLock; WORK_QUEUE_ITEM DGWorkItem; -VOID DatagramWorker( +VOID STDCALL DatagramWorker( PVOID Context) /* * FUNCTION: Handles pending send requests diff --git a/reactos/drivers/net/tcpip/transport/udp/udp.c b/reactos/drivers/net/tcpip/transport/udp/udp.c index ed48779c35f..8fc586e217a 100644 --- a/reactos/drivers/net/tcpip/transport/udp/udp.c +++ b/reactos/drivers/net/tcpip/transport/udp/udp.c @@ -291,7 +291,7 @@ VOID UDPReceive( DataSize = i - sizeof(UDP_HEADER); /* Go to UDP data area */ - (ULONG_PTR)IPPacket->Data += sizeof(UDP_HEADER); + IPPacket->Data = (PVOID)((ULONG_PTR)IPPacket->Data + sizeof(UDP_HEADER)); /* Locate a receive request on destination address file object and deliver the packet if one is found. If there is no receive diff --git a/reactos/include/net/ndis.h b/reactos/include/net/ndis.h index 20ef8f21d16..3dd3dc4b07b 100644 --- a/reactos/include/net/ndis.h +++ b/reactos/include/net/ndis.h @@ -759,8 +759,8 @@ typedef struct _NDIS_PHYSICAL_ADDRESS_UNIT { } NDIS_PHYSICAL_ADDRESS_UNIT, *PNDIS_PHYSICAL_ADDRESS_UNIT; -typedef VOID STDCALL -(*ADAPTER_SHUTDOWN_HANDLER)( +typedef VOID +(STDCALL *ADAPTER_SHUTDOWN_HANDLER)( IN PVOID ShutdownContext); @@ -996,14 +996,12 @@ typedef NDIS_STATUS STDCALL_FUNC (*CM_OPEN_AF_HANDLER)( typedef NDIS_STATUS -STDCALL -(*CM_CLOSE_AF_HANDLER)( +(STDCALL *CM_CLOSE_AF_HANDLER)( IN NDIS_HANDLE CallMgrAfContext); typedef NDIS_STATUS -STDCALL -(*CM_REG_SAP_HANDLER)( +(STDCALL *CM_REG_SAP_HANDLER)( IN NDIS_HANDLE CallMgrAfContext, IN PCO_SAP Sap, IN NDIS_HANDLE NdisSapHandle, @@ -1011,14 +1009,12 @@ STDCALL typedef NDIS_STATUS -STDCALL -(*CM_DEREG_SAP_HANDLER)( +(STDCALL *CM_DEREG_SAP_HANDLER)( IN NDIS_HANDLE CallMgrSapContext); typedef NDIS_STATUS -STDCALL -(*CM_MAKE_CALL_HANDLER)( +(STDCALL *CM_MAKE_CALL_HANDLER)( IN NDIS_HANDLE CallMgrVcContext, IN OUT PCO_CALL_PARAMETERS CallParameters, IN NDIS_HANDLE NdisPartyHandle OPTIONAL, @@ -1026,8 +1022,7 @@ STDCALL typedef NDIS_STATUS -STDCALL -(*CM_CLOSE_CALL_HANDLER)( +(STDCALL *CM_CLOSE_CALL_HANDLER)( IN NDIS_HANDLE CallMgrVcContext, IN NDIS_HANDLE CallMgrPartyContext OPTIONAL, IN PVOID CloseData OPTIONAL, @@ -1035,8 +1030,7 @@ STDCALL typedef VOID -STDCALL -(*CM_INCOMING_CALL_COMPLETE_HANDLER)( +(STDCALL *CM_INCOMING_CALL_COMPLETE_HANDLER)( IN NDIS_STATUS Status, IN NDIS_HANDLE CallMgrVcContext, IN PCO_CALL_PARAMETERS CallParameters); @@ -1075,8 +1069,7 @@ STDCALL_FUNC (*CM_DEACTIVATE_VC_COMPLETE_HANDLER)( typedef NDIS_STATUS -STDCALL -(*CM_MODIFY_CALL_QOS_HANDLER)( +(STDCALL *CM_MODIFY_CALL_QOS_HANDLER)( IN NDIS_HANDLE CallMgrVcContext, IN PCO_CALL_PARAMETERS CallParameters); @@ -1112,81 +1105,81 @@ typedef VOID STDCALL_FUNC (*CL_OPEN_AF_COMPLETE_HANDLER)( IN NDIS_HANDLE ProtocolAfContext, IN NDIS_HANDLE NdisAfHandle); -typedef VOID STDCALL -(*CL_CLOSE_AF_COMPLETE_HANDLER)( +typedef VOID +(STDCALL *CL_CLOSE_AF_COMPLETE_HANDLER)( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolAfContext); -typedef VOID STDCALL -(*CL_REG_SAP_COMPLETE_HANDLER)( +typedef VOID +(STDCALL *CL_REG_SAP_COMPLETE_HANDLER)( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolSapContext, IN PCO_SAP Sap, IN NDIS_HANDLE NdisSapHandle); -typedef VOID STDCALL -(*CL_DEREG_SAP_COMPLETE_HANDLER)( +typedef VOID +(STDCALL *CL_DEREG_SAP_COMPLETE_HANDLER)( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolSapContext); -typedef VOID STDCALL -(*CL_MAKE_CALL_COMPLETE_HANDLER)( +typedef VOID +(STDCALL *CL_MAKE_CALL_COMPLETE_HANDLER)( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolVcContext, IN NDIS_HANDLE NdisPartyHandle OPTIONAL, IN PCO_CALL_PARAMETERS CallParameters); -typedef VOID STDCALL -(*CL_MODIFY_CALL_QOS_COMPLETE_HANDLER)( +typedef VOID +(STDCALL *CL_MODIFY_CALL_QOS_COMPLETE_HANDLER)( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolVcContext, IN PCO_CALL_PARAMETERS CallParameters); -typedef VOID STDCALL -(*CL_CLOSE_CALL_COMPLETE_HANDLER)( +typedef VOID +(STDCALL *CL_CLOSE_CALL_COMPLETE_HANDLER)( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolVcContext, IN NDIS_HANDLE ProtocolPartyContext OPTIONAL); -typedef VOID STDCALL -(*CL_ADD_PARTY_COMPLETE_HANDLER)( +typedef VOID +(STDCALL *CL_ADD_PARTY_COMPLETE_HANDLER)( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolPartyContext, IN NDIS_HANDLE NdisPartyHandle, IN PCO_CALL_PARAMETERS CallParameters); -typedef VOID STDCALL -(*CL_DROP_PARTY_COMPLETE_HANDLER)( +typedef VOID +(STDCALL *CL_DROP_PARTY_COMPLETE_HANDLER)( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolPartyContext); -typedef NDIS_STATUS STDCALL -(*CL_INCOMING_CALL_HANDLER)( +typedef NDIS_STATUS +(STDCALL *CL_INCOMING_CALL_HANDLER)( IN NDIS_HANDLE ProtocolSapContext, IN NDIS_HANDLE ProtocolVcContext, IN OUT PCO_CALL_PARAMETERS CallParameters); -typedef VOID STDCALL -(*CL_INCOMING_CALL_QOS_CHANGE_HANDLER)( +typedef VOID +(STDCALL *CL_INCOMING_CALL_QOS_CHANGE_HANDLER)( IN NDIS_HANDLE ProtocolVcContext, IN PCO_CALL_PARAMETERS CallParameters); -typedef VOID STDCALL -(*CL_INCOMING_CLOSE_CALL_HANDLER)( +typedef VOID +(STDCALL *CL_INCOMING_CLOSE_CALL_HANDLER)( IN NDIS_STATUS CloseStatus, IN NDIS_HANDLE ProtocolVcContext, IN PVOID CloseData OPTIONAL, IN UINT Size OPTIONAL); -typedef VOID STDCALL -(*CL_INCOMING_DROP_PARTY_HANDLER)( +typedef VOID +(STDCALL *CL_INCOMING_DROP_PARTY_HANDLER)( IN NDIS_STATUS DropStatus, IN NDIS_HANDLE ProtocolPartyContext, IN PVOID CloseData OPTIONAL, IN UINT Size OPTIONAL); -typedef VOID STDCALL -(*CL_CALL_CONNECTED_HANDLER)( +typedef VOID +(STDCALL *CL_CALL_CONNECTED_HANDLER)( IN NDIS_HANDLE ProtocolVcContext); @@ -1220,64 +1213,64 @@ typedef struct _NDIS_CLIENT_CHARACTERISTICS { /* Prototypes for NDIS 3.0 protocol characteristics */ -typedef VOID STDCALL -(*OPEN_ADAPTER_COMPLETE_HANDLER)( +typedef VOID +(STDCALL *OPEN_ADAPTER_COMPLETE_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS Status, IN NDIS_STATUS OpenErrorStatus); -typedef VOID STDCALL -(*CLOSE_ADAPTER_COMPLETE_HANDLER)( +typedef VOID +(STDCALL *CLOSE_ADAPTER_COMPLETE_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS Status); -typedef VOID STDCALL -(*RESET_COMPLETE_HANDLER)( +typedef VOID +(STDCALL *RESET_COMPLETE_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS Status); -typedef VOID STDCALL -(*REQUEST_COMPLETE_HANDLER)( +typedef VOID +(STDCALL *REQUEST_COMPLETE_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_REQUEST NdisRequest, IN NDIS_STATUS Status); -typedef VOID STDCALL -(*STATUS_HANDLER)( +typedef VOID +(STDCALL *STATUS_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS GeneralStatus, IN PVOID StatusBuffer, IN UINT StatusBufferSize); -typedef VOID STDCALL -(*STATUS_COMPLETE_HANDLER)( +typedef VOID +(STDCALL *STATUS_COMPLETE_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext); -typedef VOID STDCALL -(*SEND_COMPLETE_HANDLER)( +typedef VOID +(STDCALL *SEND_COMPLETE_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status); -typedef VOID STDCALL -(*WAN_SEND_COMPLETE_HANDLER)( +typedef VOID +(STDCALL *WAN_SEND_COMPLETE_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_WAN_PACKET Packet, IN NDIS_STATUS Status); -typedef VOID STDCALL -(*TRANSFER_DATA_COMPLETE_HANDLER)( +typedef VOID +(STDCALL *TRANSFER_DATA_COMPLETE_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status, IN UINT BytesTransferred); -typedef VOID STDCALL -(*WAN_TRANSFER_DATA_COMPLETE_HANDLER)( +typedef VOID +(STDCALL *WAN_TRANSFER_DATA_COMPLETE_HANDLER)( VOID); -typedef NDIS_STATUS STDCALL -(*RECEIVE_HANDLER)( +typedef NDIS_STATUS +(STDCALL *RECEIVE_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE MacReceiveContext, IN PVOID HeaderBuffer, @@ -1286,14 +1279,14 @@ typedef NDIS_STATUS STDCALL IN UINT LookaheadBufferSize, IN UINT PacketSize); -typedef NDIS_STATUS STDCALL -(*WAN_RECEIVE_HANDLER)( +typedef NDIS_STATUS +(STDCALL *WAN_RECEIVE_HANDLER)( IN NDIS_HANDLE NdisLinkHandle, IN PUCHAR Packet, IN ULONG PacketSize); -typedef VOID STDCALL -(*RECEIVE_COMPLETE_HANDLER)( +typedef VOID +(STDCALL *RECEIVE_COMPLETE_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext); @@ -1368,35 +1361,35 @@ typedef struct _NDIS30_PROTOCOL_CHARACTERISTICS_S { /* Prototypes for NDIS 4.0 protocol characteristics */ -typedef INT STDCALL -(*RECEIVE_PACKET_HANDLER)( +typedef INT +(STDCALL *RECEIVE_PACKET_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet); -typedef VOID STDCALL -(*BIND_HANDLER)( +typedef VOID +(STDCALL *BIND_HANDLER)( OUT PNDIS_STATUS Status, IN NDIS_HANDLE BindContext, IN PNDIS_STRING DeviceName, IN PVOID SystemSpecific1, IN PVOID SystemSpecific2); -typedef VOID STDCALL -(*UNBIND_HANDLER)( +typedef VOID +(STDCALL *UNBIND_HANDLER)( OUT PNDIS_STATUS Status, IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE UnbindContext); -typedef VOID STDCALL -(*TRANSLATE_HANDLER)( +typedef VOID +(STDCALL *TRANSLATE_HANDLER)( OUT PNDIS_STATUS Status, IN NDIS_HANDLE ProtocolBindingContext, OUT PNET_PNP_ID IdList, IN ULONG IdListLength, OUT PULONG BytesReturned); -typedef VOID STDCALL -(*UNLOAD_PROTOCOL_HANDLER)( +typedef VOID +(STDCALL *UNLOAD_PROTOCOL_HANDLER)( VOID); @@ -1430,28 +1423,28 @@ typedef struct _NDIS40_PROTOCOL_CHARACTERISTICS_S { #ifdef NDIS50 -typedef VOID STDCALL -(*CO_SEND_COMPLETE_HANDLER)( +typedef VOID +(STDCALL *CO_SEND_COMPLETE_HANDLER)( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolVcContext, IN PNDIS_PACKET Packet); -typedef VOID STDCALL -(*CO_STATUS_HANDLER)( +typedef VOID +(STDCALL *CO_STATUS_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE ProtocolVcContext OPTIONAL, IN NDIS_STATUS GeneralStatus, IN PVOID StatusBuffer, IN UINT StatusBufferSize); -typedef UINT STDCALL -(*CO_RECEIVE_PACKET_HANDLER)( +typedef UINT +(STDCALL *CO_RECEIVE_PACKET_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE ProtocolVcContext, IN PNDIS_PACKET Packet); -typedef VOID STDCALL -(*CO_AF_REGISTER_NOTIFY_HANDLER)( +typedef VOID +(STDCALL *CO_AF_REGISTER_NOTIFY_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN PCO_ADDRESS_FAMILY AddressFamily); @@ -3423,28 +3416,28 @@ NdisIMInitializeDeviceInstanceEx( /* Prototypes for NDIS_MINIPORT_CHARACTERISTICS */ -typedef BOOLEAN STDCALL -(*W_CHECK_FOR_HANG_HANDLER)( +typedef BOOLEAN +(STDCALL *W_CHECK_FOR_HANG_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext); -typedef VOID STDCALL -(*W_DISABLE_INTERRUPT_HANDLER)( +typedef VOID +(STDCALL *W_DISABLE_INTERRUPT_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext); -typedef VOID STDCALL -(*W_ENABLE_INTERRUPT_HANDLER)( +typedef VOID +(STDCALL *W_ENABLE_INTERRUPT_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext); -typedef VOID STDCALL -(*W_HALT_HANDLER)( +typedef VOID +(STDCALL *W_HALT_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext); -typedef VOID STDCALL -(*W_HANDLE_INTERRUPT_HANDLER)( +typedef VOID +(STDCALL *W_HANDLE_INTERRUPT_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext); -typedef NDIS_STATUS STDCALL -(*W_INITIALIZE_HANDLER)( +typedef NDIS_STATUS +(STDCALL *W_INITIALIZE_HANDLER)( OUT PNDIS_STATUS OpenErrorStatus, OUT PUINT SelectedMediumIndex, IN PNDIS_MEDIUM MediumArray, @@ -3452,14 +3445,14 @@ typedef NDIS_STATUS STDCALL IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_HANDLE WrapperConfigurationContext); -typedef VOID STDCALL STDCALL -(*W_ISR_HANDLER)( +typedef VOID +(STDCALL *W_ISR_HANDLER)( OUT PBOOLEAN InterruptRecognized, OUT PBOOLEAN QueueMiniportHandleInterrupt, IN NDIS_HANDLE MiniportAdapterContext); -typedef NDIS_STATUS STDCALL -(*W_QUERY_INFORMATION_HANDLER)( +typedef NDIS_STATUS +(STDCALL *W_QUERY_INFORMATION_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_OID Oid, IN PVOID InformationBuffer, @@ -3467,31 +3460,31 @@ typedef NDIS_STATUS STDCALL OUT PULONG BytesWritten, OUT PULONG BytesNeeded); -typedef NDIS_STATUS STDCALL -(*W_RECONFIGURE_HANDLER)( +typedef NDIS_STATUS +(STDCALL *W_RECONFIGURE_HANDLER)( OUT PNDIS_STATUS OpenErrorStatus, IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_HANDLE WrapperConfigurationContext); -typedef NDIS_STATUS STDCALL -(*W_RESET_HANDLER)( +typedef NDIS_STATUS +(STDCALL *W_RESET_HANDLER)( OUT PBOOLEAN AddressingReset, IN NDIS_HANDLE MiniportAdapterContext); -typedef NDIS_STATUS STDCALL -(*W_SEND_HANDLER)( +typedef NDIS_STATUS +(STDCALL *W_SEND_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN PNDIS_PACKET Packet, IN UINT Flags); -typedef NDIS_STATUS STDCALL -(*WM_SEND_HANDLER)( +typedef NDIS_STATUS +(STDCALL *WM_SEND_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_HANDLE NdisLinkHandle, IN PNDIS_WAN_PACKET Packet); -typedef NDIS_STATUS STDCALL -(*W_SET_INFORMATION_HANDLER)( +typedef NDIS_STATUS +(STDCALL *W_SET_INFORMATION_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_OID Oid, IN PVOID InformationBuffer, @@ -3499,8 +3492,8 @@ typedef NDIS_STATUS STDCALL OUT PULONG BytesRead, OUT PULONG BytesNeeded); -typedef NDIS_STATUS STDCALL -(*W_TRANSFER_DATA_HANDLER)( +typedef NDIS_STATUS +(STDCALL *W_TRANSFER_DATA_HANDLER)( OUT PNDIS_PACKET Packet, OUT PUINT BytesTransferred, IN NDIS_HANDLE MiniportAdapterContext, @@ -3508,8 +3501,8 @@ typedef NDIS_STATUS STDCALL IN UINT ByteOffset, IN UINT BytesToTransfer); -typedef NDIS_STATUS STDCALL -(*WM_TRANSFER_DATA_HANDLER)( +typedef NDIS_STATUS +(STDCALL *WM_TRANSFER_DATA_HANDLER)( VOID); @@ -3992,21 +3985,21 @@ typedef struct _NDIS30_MINIPORT_CHARACTERISTICS_S { /* Extensions for NDIS 4.0 miniports */ -typedef VOID STDCALL -(*W_SEND_PACKETS_HANDLER)( +typedef VOID +(STDCALL *W_SEND_PACKETS_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN PPNDIS_PACKET PacketArray, IN UINT NumberOfPackets); #ifdef NDIS40 -typedef VOID STDCALL -(*W_RETURN_PACKET_HANDLER)( +typedef VOID +(STDCALL *W_RETURN_PACKET_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN PNDIS_PACKET Packet); -typedef VOID STDCALL -(*W_ALLOCATE_COMPLETE_HANDLER)( +typedef VOID +(STDCALL *W_ALLOCATE_COMPLETE_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN PVOID VirtualAddress, IN PNDIS_PHYSICAL_ADDRESS PhysicalAddress, @@ -4041,33 +4034,33 @@ typedef struct _NDIS40_MINIPORT_CHARACTERISTICS_S #ifdef NDIS50 -typedef NDIS_STATUS STDCALL -(*W_CO_CREATE_VC_HANDLER)( +typedef NDIS_STATUS +(STDCALL *W_CO_CREATE_VC_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_HANDLE NdisVcHandle, OUT PNDIS_HANDLE MiniportVcContext); -typedef NDIS_STATUS STDCALL -(*W_CO_DELETE_VC_HANDLER)( +typedef NDIS_STATUS +(STDCALL *W_CO_DELETE_VC_HANDLER)( IN NDIS_HANDLE MiniportVcContext); -typedef NDIS_STATUS STDCALL -(*W_CO_ACTIVATE_VC_HANDLER)( +typedef NDIS_STATUS +(STDCALL *W_CO_ACTIVATE_VC_HANDLER)( IN NDIS_HANDLE MiniportVcContext, IN OUT PCO_CALL_PARAMETERS CallParameters); -typedef NDIS_STATUS STDCALL -(*W_CO_DEACTIVATE_VC_HANDLER)( +typedef NDIS_STATUS +(STDCALL *W_CO_DEACTIVATE_VC_HANDLER)( IN NDIS_HANDLE MiniportVcContext); -typedef VOID STDCALL -(*W_CO_SEND_PACKETS_HANDLER)( +typedef VOID +(STDCALL *W_CO_SEND_PACKETS_HANDLER)( IN NDIS_HANDLE MiniportVcContext, IN PPNDIS_PACKET PacketArray, IN UINT NumberOfPackets); -typedef NDIS_STATUS STDCALL -(*W_CO_REQUEST_HANDLER)( +typedef NDIS_STATUS +(STDCALL *W_CO_REQUEST_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_HANDLE MiniportVcContext OPTIONAL, IN OUT PNDIS_REQUEST NdisRequest); @@ -4124,13 +4117,13 @@ typedef NDIS_MINIPORT_CHARACTERISTICS *PNDIS_MINIPORT_CHARACTERISTICS; -typedef NDIS_STATUS STDCALL -(*SEND_HANDLER)( +typedef NDIS_STATUS +(STDCALL *SEND_HANDLER)( IN NDIS_HANDLE MacBindingHandle, IN PNDIS_PACKET Packet); -typedef NDIS_STATUS STDCALL -(*TRANSFER_DATA_HANDLER)( +typedef NDIS_STATUS +(STDCALL *TRANSFER_DATA_HANDLER)( IN NDIS_HANDLE MacBindingHandle, IN NDIS_HANDLE MacReceiveContext, IN UINT ByteOffset, @@ -4138,12 +4131,12 @@ typedef NDIS_STATUS STDCALL OUT PNDIS_PACKET Packet, OUT PUINT BytesTransferred); -typedef NDIS_STATUS STDCALL -(*RESET_HANDLER)( +typedef NDIS_STATUS +(STDCALL *RESET_HANDLER)( IN NDIS_HANDLE MacBindingHandle); -typedef NDIS_STATUS STDCALL -(*REQUEST_HANDLER)( +typedef NDIS_STATUS +(STDCALL *REQUEST_HANDLER)( IN NDIS_HANDLE MacBindingHandle, IN PNDIS_REQUEST NdisRequest); @@ -4453,12 +4446,12 @@ typedef struct _FILTERDBS { } FILTERDBS, *PFILTERDBS; -typedef VOID STDCALL -(*ETH_RCV_COMPLETE_HANDLER)( +typedef VOID +(STDCALL *ETH_RCV_COMPLETE_HANDLER)( IN PETH_FILTER Filter); -typedef VOID STDCALL -(*ETH_RCV_INDICATE_HANDLER)( +typedef VOID +(STDCALL *ETH_RCV_INDICATE_HANDLER)( IN PETH_FILTER Filter, IN NDIS_HANDLE MacReceiveContext, IN PCHAR Address, @@ -4468,12 +4461,12 @@ typedef VOID STDCALL IN UINT LookaheadBufferSize, IN UINT PacketSize); -typedef VOID STDCALL -(*FDDI_RCV_COMPLETE_HANDLER)( +typedef VOID +(STDCALL *FDDI_RCV_COMPLETE_HANDLER)( IN PFDDI_FILTER Filter); -typedef VOID STDCALL -(*FDDI_RCV_INDICATE_HANDLER)( +typedef VOID +(STDCALL *FDDI_RCV_INDICATE_HANDLER)( IN PFDDI_FILTER Filter, IN NDIS_HANDLE MacReceiveContext, IN PCHAR Address, @@ -4484,18 +4477,18 @@ typedef VOID STDCALL IN UINT LookaheadBufferSize, IN UINT PacketSize); -typedef VOID STDCALL STDCALL -(*FILTER_PACKET_INDICATION_HANDLER)( +typedef VOID +(STDCALL *FILTER_PACKET_INDICATION_HANDLER)( IN NDIS_HANDLE Miniport, IN PPNDIS_PACKET PacketArray, IN UINT NumberOfPackets); -typedef VOID STDCALL -(*TR_RCV_COMPLETE_HANDLER)( +typedef VOID +(STDCALL *TR_RCV_COMPLETE_HANDLER)( IN PTR_FILTER Filter); -typedef VOID STDCALL -(*TR_RCV_INDICATE_HANDLER)( +typedef VOID +(STDCALL *TR_RCV_INDICATE_HANDLER)( IN PTR_FILTER Filter, IN NDIS_HANDLE MacReceiveContext, IN PVOID HeaderBuffer, @@ -4504,13 +4497,13 @@ typedef VOID STDCALL IN UINT LookaheadBufferSize, IN UINT PacketSize); -typedef VOID STDCALL -(*WAN_RCV_COMPLETE_HANDLER)( +typedef VOID +(STDCALL *WAN_RCV_COMPLETE_HANDLER)( IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_HANDLE NdisLinkContext); -typedef VOID STDCALL -(*WAN_RCV_HANDLER)( +typedef VOID +(STDCALL *WAN_RCV_HANDLER)( OUT PNDIS_STATUS Status, IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_HANDLE NdisLinkContext, @@ -4555,26 +4548,26 @@ typedef VOID STDCALL_FUNC (*NDIS_M_SEND_RESOURCES_HANDLER)( typedef BOOLEAN (FASTCALL *NDIS_M_START_SENDS)( IN PNDIS_MINIPORT_BLOCK Miniport); -typedef VOID STDCALL -(*NDIS_M_STATUS_HANDLER)( +typedef VOID +(STDCALL *NDIS_M_STATUS_HANDLER)( IN NDIS_HANDLE MiniportHandle, IN NDIS_STATUS GeneralStatus, IN PVOID StatusBuffer, IN UINT StatusBufferSize); -typedef VOID STDCALL -(*NDIS_M_STS_COMPLETE_HANDLER)( +typedef VOID +(STDCALL *NDIS_M_STS_COMPLETE_HANDLER)( IN NDIS_HANDLE MiniportAdapterHandle); -typedef VOID STDCALL -(*NDIS_M_TD_COMPLETE_HANDLER)( +typedef VOID +(STDCALL *NDIS_M_TD_COMPLETE_HANDLER)( IN NDIS_HANDLE MiniportAdapterHandle, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status, IN UINT BytesTransferred); -typedef VOID STDCALL -(*NDIS_WM_SEND_COMPLETE_HANDLER)( +typedef VOID +(STDCALL *NDIS_WM_SEND_COMPLETE_HANDLER)( IN NDIS_HANDLE MiniportAdapterHandle, IN PVOID Packet, IN NDIS_STATUS Status); From a218ec6e0b71644a93f205e06e2f755091f43af0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Wed, 12 May 2004 09:47:16 +0000 Subject: [PATCH 1088/1463] Fix scrollbar controls svn path=/trunk/; revision=9357 --- reactos/lib/user32/controls/scrollbar.c | 26 ++++++++++++++---- reactos/subsys/win32k/include/scroll.h | 2 +- reactos/subsys/win32k/ntuser/scrollbar.c | 35 ++++++++---------------- 3 files changed, 32 insertions(+), 31 deletions(-) diff --git a/reactos/lib/user32/controls/scrollbar.c b/reactos/lib/user32/controls/scrollbar.c index 25f77127980..8fa443ccf80 100644 --- a/reactos/lib/user32/controls/scrollbar.c +++ b/reactos/lib/user32/controls/scrollbar.c @@ -88,7 +88,7 @@ const struct builtin_class_descr SCROLL_builtin_class = CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC, /* style */ ScrollBarWndProc, /* procW */ NULL, /* procA (winproc is Unicode only) */ - sizeof(SCROLLBARINFO) + sizeof(SCROLLINFO), /* extra */ + 0, /* extra */ IDC_ARROW, /* cursor */ 0 /* brush */ }; @@ -1422,7 +1422,7 @@ ScrollBarWndProc(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) return 0; case SBM_SETSCROLLINFO: - return SetScrollInfo(Wnd, SB_CTL, (SCROLLINFO *) lParam, wParam); + return NtUserSetScrollInfo(Wnd, SB_CTL, (SCROLLINFO *) lParam, wParam); case SBM_GETSCROLLINFO: return NtUserGetScrollInfo(Wnd, SB_CTL, (SCROLLINFO *) lParam); @@ -1475,9 +1475,16 @@ GetScrollBarInfo(HWND hWnd, LONG idObject, PSCROLLBARINFO psbi) * @implemented */ BOOL STDCALL -GetScrollInfo(HWND Wnd, INT SBType, LPSCROLLINFO lpsi) +GetScrollInfo(HWND Wnd, INT SBType, LPSCROLLINFO Info) { - return NtUserGetScrollInfo(Wnd, SBType, lpsi); + if (SB_CTL == SBType) + { + return SendMessageW(Wnd, SBM_GETSCROLLINFO, 0, (LPARAM) Info); + } + else + { + return NtUserGetScrollInfo(Wnd, SBType, Info); + } } /* @@ -1522,9 +1529,16 @@ GetScrollRange(HWND Wnd, int Bar, LPINT MinPos, LPINT MaxPos) * @implemented */ INT STDCALL -SetScrollInfo(HWND hWnd, int nBar, LPCSCROLLINFO lpsi, BOOL bRedraw) +SetScrollInfo(HWND Wnd, int SBType, LPCSCROLLINFO Info, BOOL bRedraw) { - return NtUserSetScrollInfo(hWnd, nBar, lpsi, bRedraw); + if (SB_CTL == SBType) + { + return SendMessageW(Wnd, SBM_SETSCROLLINFO, (WPARAM) bRedraw, (LPARAM) Info); + } + else + { + return NtUserSetScrollInfo(Wnd, SBType, Info, bRedraw); + } } /* diff --git a/reactos/subsys/win32k/include/scroll.h b/reactos/subsys/win32k/include/scroll.h index 19cd1cf81e7..2d437a74f58 100644 --- a/reactos/subsys/win32k/include/scroll.h +++ b/reactos/subsys/win32k/include/scroll.h @@ -14,7 +14,7 @@ typedef struct _WINDOW_SCROLLINFO ((LPSCROLLINFO)(&((Window)->Scroll + i)->ScrollInfo)) #define SBOBJ_TO_SBID(Obj) ((Obj) - OBJID_HSCROLL) -#define SBID_IS_VAILD(id) (id == SB_HORZ || id == SB_VERT) +#define SBID_IS_VALID(id) (id == SB_HORZ || id == SB_VERT || id == SB_CTL) BOOL FASTCALL IntCreateScrollBars(PWINDOW_OBJECT Window); BOOL FASTCALL IntDestroyScrollBars(PWINDOW_OBJECT Window); diff --git a/reactos/subsys/win32k/ntuser/scrollbar.c b/reactos/subsys/win32k/ntuser/scrollbar.c index 1a0e336fa8e..8b803d6b962 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.32 2004/05/10 17:07:18 weiden Exp $ +/* $Id: scrollbar.c,v 1.33 2004/05/12 09:47:16 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -203,10 +203,10 @@ IntGetScrollInfo(PWINDOW_OBJECT Window, INT nBar, LPSCROLLINFO lpsi) UINT Mask; LPSCROLLINFO psi; - if(!SBID_IS_VAILD(nBar)) + if(!SBID_IS_VALID(nBar)) { SetLastWin32Error(ERROR_INVALID_PARAMETER); - DPRINT1("Trying to get scrollinfo for unknown scrollbar type %d", nBar); + DPRINT1("Trying to get scrollinfo for unknown scrollbar type %d\n", nBar); return FALSE; } @@ -263,7 +263,7 @@ IntSetScrollInfo(PWINDOW_OBJECT Window, INT nBar, LPCSCROLLINFO lpsi, BOOL bRedr /* UINT new_flags;*/ BOOL bChangeParams = FALSE; /* don't show/hide scrollbar if params don't change */ - if(!SBID_IS_VAILD(nBar)) + if(!SBID_IS_VALID(nBar)) { SetLastWin32Error(ERROR_INVALID_PARAMETER); DPRINT1("Trying to set scrollinfo for unknown scrollbar type %d", nBar); @@ -414,10 +414,10 @@ IntGetScrollBarInfo(PWINDOW_OBJECT Window, LONG idObject, PSCROLLBARINFO psbi) Bar = SBOBJ_TO_SBID(idObject); - if(!SBID_IS_VAILD(Bar)) + if(!SBID_IS_VALID(Bar)) { SetLastWin32Error(ERROR_INVALID_PARAMETER); - DPRINT1("Trying to get scrollinfo for unknown scrollbar type %d", Bar); + DPRINT1("Trying to get scrollinfo for unknown scrollbar type %d\n", Bar); return FALSE; } @@ -453,7 +453,7 @@ IntCreateScrollBars(PWINDOW_OBJECT Window) } /* allocate memory for all scrollbars (HORZ, VERT, CONTROL) */ - Size = 2 * (sizeof(WINDOW_SCROLLINFO)); + Size = 3 * (sizeof(WINDOW_SCROLLINFO)); if(!(Window->Scroll = ExAllocatePoolWithTag(PagedPool, Size, TAG_SBARINFO))) { DPRINT1("Unable to allocate memory for scrollbar information for window 0x%x\n", Window->Self); @@ -604,14 +604,8 @@ NtUserGetScrollInfo(HWND hwnd, int fnBar, LPSCROLLINFO lpsi) SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return FALSE; } - - if(fnBar == SB_CTL) - { - IntSendMessage(Window->Self, SBM_GETSCROLLINFO, 0, (LPARAM)lpsi); - Ret = TRUE; - } - else - Ret = IntGetScrollInfo(Window, fnBar, &psi); + + Ret = IntGetScrollInfo(Window, fnBar, &psi); IntReleaseWindowObject(Window); @@ -652,7 +646,7 @@ NtUserEnableScrollBar( return FALSE; } - if(wSBflags != SB_BOTH && !SBID_IS_VAILD(wSBflags)) + if(wSBflags != SB_BOTH && !SBID_IS_VALID(wSBflags)) { IntReleaseWindowObject(Window); SetLastWin32Error(ERROR_INVALID_PARAMETER); @@ -718,7 +712,7 @@ NtUserSetScrollBarInfo( } Obj = SBOBJ_TO_SBID(idObject); - if(!SBID_IS_VAILD(Obj)) + if(!SBID_IS_VALID(Obj)) { IntReleaseWindowObject(Window); SetLastWin32Error(ERROR_INVALID_PARAMETER); @@ -772,13 +766,6 @@ NtUserSetScrollInfo( return 0; } - if(fnBar == SB_CTL) - { - Ret = IntSendMessage(hwnd, SBM_SETSCROLLINFO, (WPARAM)bRedraw, (LPARAM)lpsi); - IntReleaseWindowObject(Window); - return Ret; - } - Status = MmCopyFromCaller(&ScrollInfo, lpsi, sizeof(SCROLLINFO) - sizeof(ScrollInfo.nTrackPos)); if(!NT_SUCCESS(Status)) { From f4371386e45f69081c2afe6d381e8e155c94e372 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Wed, 12 May 2004 15:28:01 +0000 Subject: [PATCH 1089/1463] GetWindowInfo() doesn't check the cbSize parameter svn path=/trunk/; revision=9358 --- reactos/subsys/win32k/ntuser/misc.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index 002efecf054..ce205675f36 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.71 2004/05/10 17:07:18 weiden Exp $ +/* $Id: misc.c,v 1.72 2004/05/12 15:28:01 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -428,6 +428,11 @@ NtUserCallTwoParam( return FALSE; } +#if 0 + /* + * According to WINE, Windows' doesn't check the cbSize field + */ + Status = MmCopyFromCaller(&wi.cbSize, (PVOID)Param2, sizeof(wi.cbSize)); if(!NT_SUCCESS(Status)) { @@ -442,6 +447,7 @@ NtUserCallTwoParam( SetLastWin32Error(ERROR_INVALID_PARAMETER); return FALSE; } +#endif if((Ret = (DWORD)IntGetWindowInfo(WindowObject, &wi))) { From a1c9203cebc12107754918144fae44d5daab35a7 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Wed, 12 May 2004 20:34:38 +0000 Subject: [PATCH 1090/1463] - Fixed the WM_SYSCOMMAND with SC_SIZE messages to have correct codes in wParam. svn path=/trunk/; revision=9359 --- reactos/lib/user32/windows/defwnd.c | 8 ++++---- reactos/lib/user32/windows/nonclient.c | 12 +----------- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/reactos/lib/user32/windows/defwnd.c b/reactos/lib/user32/windows/defwnd.c index 9a194596c02..0a7295aee86 100644 --- a/reactos/lib/user32/windows/defwnd.c +++ b/reactos/lib/user32/windows/defwnd.c @@ -1,4 +1,4 @@ -/* $Id: defwnd.c,v 1.135 2004/05/01 11:43:52 weiden Exp $ +/* $Id: defwnd.c,v 1.136 2004/05/12 20:34:38 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -539,9 +539,9 @@ DefWndDoSizeMove(HWND hwnd, WORD wParam) { return; } - if (hittest && hittest != HTSYSMENU) + if (hittest && ((wParam & 0xfff0) != SC_MOUSEMENU)) { - hittest += 2; + hittest += (HTLEFT - WMSZ_LEFT); } else { @@ -575,7 +575,7 @@ DefWndDoSizeMove(HWND hwnd, WORD wParam) { SetRect(&mouseRect, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)); - SystemParametersInfoW(SPI_GETWORKAREA, 0, &clipRect, 0); + clipRect = mouseRect; } ClipCursor(&clipRect); diff --git a/reactos/lib/user32/windows/nonclient.c b/reactos/lib/user32/windows/nonclient.c index 060a7c7d9dc..0ae8dbeb018 100644 --- a/reactos/lib/user32/windows/nonclient.c +++ b/reactos/lib/user32/windows/nonclient.c @@ -1012,17 +1012,7 @@ DefWndNCLButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam) case HTBOTTOMLEFT: case HTBOTTOMRIGHT: { - HWND Parent; - - if(wParam == HTBOTTOMRIGHT && (Parent = GetParent(hWnd)) && - (GetWindowLongW(hWnd, GWL_STYLE) & WS_CHILD) && - !(GetWindowLongW(hWnd, GWL_EXSTYLE) & WS_EX_MDICHILD) && - !(GetWindowLongW(Parent, GWL_STYLE) & WS_MAXIMIZE)) - { - SendMessageW(Parent, WM_SYSCOMMAND, SC_SIZE + wParam - 2, lParam); - break; - } - SendMessageW(hWnd, WM_SYSCOMMAND, SC_SIZE + wParam - 2, lParam); + SendMessageW(hWnd, WM_SYSCOMMAND, SC_SIZE + wParam - (HTLEFT - WMSZ_LEFT), lParam); break; } } From 89ac0e36c9319ec0a00530a938c441f994edb337 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Wed, 12 May 2004 20:45:05 +0000 Subject: [PATCH 1091/1463] - Print class name in DPRINT1 in NtUserFindWindowEx. svn path=/trunk/; revision=9360 --- reactos/subsys/win32k/ntuser/window.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 8f6f3b50dc9..4e0c995fa76 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.230 2004/05/10 19:23:37 weiden Exp $ +/* $Id: window.c,v 1.231 2004/05/12 20:45:05 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -2380,7 +2380,10 @@ NtUserFindWindowEx(HWND hwndParent, Status = ClassReferenceClassByNameOrAtom(&ClassObject, ClassName.Buffer); if(!NT_SUCCESS(Status)) { - DPRINT1("Window class not found\n"); + if (IS_ATOM(ClassName.Buffer)) + DPRINT1("Window class not found (%lx)\n", (ULONG_PTR)ClassName.Buffer); + else + DPRINT1("Window class not found (%S)\n", ClassName.Buffer); /* windows returns ERROR_FILE_NOT_FOUND !? */ SetLastWin32Error(ERROR_FILE_NOT_FOUND); goto Cleanup; From 6dac2c7d871a47a1d98c6d473a949c3c2f2a1626 Mon Sep 17 00:00:00 2001 From: Jason Filby <jason.filby@gmail.com> Date: Thu, 13 May 2004 19:28:57 +0000 Subject: [PATCH 1092/1463] Remove unused variable; patch by Casper Hornstrup svn path=/trunk/; revision=9361 --- reactos/tools/regtests.c | 1 - 1 file changed, 1 deletion(-) diff --git a/reactos/tools/regtests.c b/reactos/tools/regtests.c index b763a822b6d..2175ebe0da4 100755 --- a/reactos/tools/regtests.c +++ b/reactos/tools/regtests.c @@ -417,7 +417,6 @@ static char KMSTUB[] = "\n" "void AddTest(TestRoutine Routine)\n" "{\n" - " PDEVICE_OBJECT DeviceObject;\n" " UNICODE_STRING DriverName;\n" " IO_STATUS_BLOCK IoStatus;\n" " NTSTATUS Status;\n" From 58f0550e7bac8207c2953e0487c3357caf875d09 Mon Sep 17 00:00:00 2001 From: Jason Filby <jason.filby@gmail.com> Date: Thu, 13 May 2004 19:31:09 +0000 Subject: [PATCH 1093/1463] Regression-test enable win32k; patch by Casper Hornstrup svn path=/trunk/; revision=9362 --- reactos/subsys/win32k/main/dllmain.c | 5 ++++- reactos/subsys/win32k/makefile | 4 +++- reactos/subsys/win32k/tests/.cvsignore | 7 +++++++ reactos/subsys/win32k/tests/makefile | 20 ++++++++++++++++++++ reactos/subsys/win32k/tests/tests/.cvsignore | 3 +++ 5 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 reactos/subsys/win32k/tests/.cvsignore create mode 100644 reactos/subsys/win32k/tests/makefile create mode 100644 reactos/subsys/win32k/tests/tests/.cvsignore diff --git a/reactos/subsys/win32k/main/dllmain.c b/reactos/subsys/win32k/main/dllmain.c index eecbeb9a26e..f00b24e5774 100644 --- a/reactos/subsys/win32k/main/dllmain.c +++ b/reactos/subsys/win32k/main/dllmain.c @@ -16,11 +16,12 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dllmain.c,v 1.72 2004/05/10 17:07:17 weiden Exp $ +/* $Id: dllmain.c,v 1.73 2004/05/13 19:29:47 jfilby Exp $ * * Entry Point for win32k.sys */ #include <w32k.h> +#include <roscfg.h> #ifdef __USE_W32API typedef NTSTATUS (STDCALL *PW32_PROCESS_CALLBACK)( @@ -305,6 +306,8 @@ DllMain ( /* Create stock objects, ie. precreated objects commonly used by win32 applications */ CreateStockObjects(); + + PREPARE_TESTS return STATUS_SUCCESS; } diff --git a/reactos/subsys/win32k/makefile b/reactos/subsys/win32k/makefile index 6a236aa70ad..de8e52d271b 100644 --- a/reactos/subsys/win32k/makefile +++ b/reactos/subsys/win32k/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.98 2004/05/10 17:07:18 weiden Exp $ +# $Id: makefile,v 1.99 2004/05/13 19:29:47 jfilby Exp $ PATH_TO_TOP = ../.. @@ -14,6 +14,8 @@ TARGET_PCH = w32k.h TARGET_DDKLIBS = freetype.a +TARGET_REGTESTS = yes + FREETYPE_DIR = $(PATH_TO_TOP)/lib/freetype include $(PATH_TO_TOP)/config diff --git a/reactos/subsys/win32k/tests/.cvsignore b/reactos/subsys/win32k/tests/.cvsignore new file mode 100644 index 00000000000..9c5dee23dd0 --- /dev/null +++ b/reactos/subsys/win32k/tests/.cvsignore @@ -0,0 +1,7 @@ +_regtests.c +_rtstub.c +Makefile.tests +*.d +*.o +*.a + diff --git a/reactos/subsys/win32k/tests/makefile b/reactos/subsys/win32k/tests/makefile new file mode 100644 index 00000000000..24b4b17984a --- /dev/null +++ b/reactos/subsys/win32k/tests/makefile @@ -0,0 +1,20 @@ +PATH_TO_TOP = ../../.. + +TARGET_TYPE = library + +TARGET_NAME = regtests + +TARGET_LIBPATH = . + +TARGET_CFLAGS = -I$(REGTESTS_PATH_INC) + +-include Makefile.tests + +TARGET_OBJECTS = \ + _regtests.o \ + $(addprefix tests/, $(TESTS)) + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + diff --git a/reactos/subsys/win32k/tests/tests/.cvsignore b/reactos/subsys/win32k/tests/tests/.cvsignore new file mode 100644 index 00000000000..b822e1cc2e6 --- /dev/null +++ b/reactos/subsys/win32k/tests/tests/.cvsignore @@ -0,0 +1,3 @@ +*.d +*.o + From 036d02e29115dc1d405896ba13b74fd68cff0653 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Thu, 13 May 2004 20:03:03 +0000 Subject: [PATCH 1094/1463] Added .cvsignore for oskittcp svn path=/trunk/; revision=9363 --- reactos/lib/oskittcp/oskittcp/.cvsignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 reactos/lib/oskittcp/oskittcp/.cvsignore diff --git a/reactos/lib/oskittcp/oskittcp/.cvsignore b/reactos/lib/oskittcp/oskittcp/.cvsignore new file mode 100644 index 00000000000..31dc3078b3a --- /dev/null +++ b/reactos/lib/oskittcp/oskittcp/.cvsignore @@ -0,0 +1,2 @@ +*.d +*.o From 08358fce513c5e0e1df53e7f5aa3a103f5917082 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Thu, 13 May 2004 20:10:15 +0000 Subject: [PATCH 1095/1463] - Don't pass garbage to RtlQueryAtomInAtomTable. It doesn't like it... svn path=/trunk/; revision=9364 --- 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 620db8c02e8..76cfeca5d87 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.52 2004/05/10 17:07:18 weiden Exp $ +/* $Id: class.c,v 1.53 2004/05/13 20:10:15 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -208,7 +208,7 @@ IntGetClassName(struct _WINDOW_OBJECT *WindowObject, LPWSTR lpClassName, } Length = 0; Status = RtlQueryAtomInAtomTable(WinStaObject->AtomTable, - WindowObject->Class->Atom, NULL, NULL, Name, &Length); + WindowObject->Class->Atom, NULL, NULL, NULL, &Length); Name = ExAllocatePoolWithTag(NonPagedPool, Length + sizeof(UNICODE_NULL), TAG_STRING); Status = RtlQueryAtomInAtomTable(WinStaObject->AtomTable, WindowObject->Class->Atom, NULL, NULL, Name, &Length); From 5c60bbb8209608abb93493071df030f1c44a30b0 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Thu, 13 May 2004 20:17:12 +0000 Subject: [PATCH 1096/1463] - Define RB_GETBANDMARGINS and RB_SETWINDOWTHEME. svn path=/trunk/; revision=9365 --- reactos/w32api/include/commctrl.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/reactos/w32api/include/commctrl.h b/reactos/w32api/include/commctrl.h index a96d2cac5dc..51334b9c5f9 100644 --- a/reactos/w32api/include/commctrl.h +++ b/reactos/w32api/include/commctrl.h @@ -1741,6 +1741,10 @@ extern "C" { #else #define RB_GETBANDINFO (WM_USER+5) #endif /* _WIN32_IE >= 0x0400 */ +#if (_WIN32_WINNT >= 0x0501) +#define RB_GETBANDMARGINS (WM_USER+40) +#define RB_SETWINDOWTHEME CCM_SETWINDOWTHEME +#endif #define CBEM_INSERTITEMA (WM_USER + 1) #define CBEM_SETIMAGELIST (WM_USER + 2) #define CBEM_GETIMAGELIST (WM_USER + 3) From 83c27bebc6c0a5853783e93a07046025b5d7f171 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Thu, 13 May 2004 20:21:27 +0000 Subject: [PATCH 1097/1463] - Force recalulation size of menu items when new item is added. - Make MDI injected icons working. - Minor corrections to menu code size handling. svn path=/trunk/; revision=9366 --- reactos/lib/user32/windows/mdi.c | 6 +++--- reactos/lib/user32/windows/menu.c | 21 +++++++++++++++++---- reactos/subsys/win32k/ntuser/menu.c | 5 ++++- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/reactos/lib/user32/windows/mdi.c b/reactos/lib/user32/windows/mdi.c index aa7b08ec27b..dea3edd2096 100644 --- a/reactos/lib/user32/windows/mdi.c +++ b/reactos/lib/user32/windows/mdi.c @@ -1091,7 +1091,7 @@ static BOOL MDI_AugmentFrameMenu( HWND frame, HWND hChild ) WND* child = WIN_FindWndPtr(hChild); #endif HMENU hSysPopup = 0; - HBITMAP hSysMenuBitmap = 0; + HBITMAP hSysMenuBitmap = 0; TRACE("frame %p,child %p\n",frame,hChild); @@ -1120,10 +1120,9 @@ static BOOL MDI_AugmentFrameMenu( HWND frame, HWND hChild ) SC_RESTORE, (LPSTR)(DWORD)HBMMENU_MBAR_RESTORE ); /* In Win 95 look, the system menu is replaced by the child icon */ - -/* FIXME */ #ifndef __REACTOS__ if(TWEAK_WineLook > WIN31_LOOK) +#endif { HICON hIcon = (HICON)GetClassLongA(hChild, GCL_HICONSM); if (!hIcon) @@ -1154,6 +1153,7 @@ static BOOL MDI_AugmentFrameMenu( HWND frame, HWND hChild ) } } } +#ifndef __REACTOS__ else hSysMenuBitmap = hBmpClose; #endif diff --git a/reactos/lib/user32/windows/menu.c b/reactos/lib/user32/windows/menu.c index 4e4a4e73cdf..54a779e0f4f 100644 --- a/reactos/lib/user32/windows/menu.c +++ b/reactos/lib/user32/windows/menu.c @@ -21,7 +21,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: menu.c,v 1.65 2004/05/03 22:16:09 gvg Exp $ +/* $Id: menu.c,v 1.66 2004/05/13 20:21:27 navaraf Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/menu.c @@ -436,8 +436,9 @@ MenuGetBitmapItemSize(UINT Id, DWORD Data, SIZE *Size) case (INT_PTR) HBMMENU_MBAR_MINIMIZE_D: case (INT_PTR) HBMMENU_MBAR_CLOSE: case (INT_PTR) HBMMENU_MBAR_CLOSE_D: - Size->cx = GetSystemMetrics(SM_CXSIZE); - Size->cy = GetSystemMetrics(SM_CYSIZE); + /* FIXME: Why we need to subtract these magic values? */ + Size->cx = GetSystemMetrics(SM_CXSIZE) - 2; + Size->cy = GetSystemMetrics(SM_CYSIZE) - 4; return; case (INT_PTR) HBMMENU_CALLBACK: case (INT_PTR) HBMMENU_POPUP_CLOSE: @@ -480,6 +481,7 @@ MenuDrawBitmapItem(HDC Dc, PROSMENUITEMINFO Item, const RECT *Rect, BOOL MenuBar UINT Flags = 0; RECT r; + r = *Rect; switch ((int) Item->hbmpItem) { case (INT_PTR) HBMMENU_SYSTEM: @@ -507,9 +509,11 @@ MenuDrawBitmapItem(HDC Dc, PROSMENUITEMINFO Item, const RECT *Rect, BOOL MenuBar Flags = DFCS_CAPTIONRESTORE; break; case (INT_PTR) HBMMENU_MBAR_MINIMIZE: + r.right += 1; Flags = DFCS_CAPTIONMIN; break; case (INT_PTR) HBMMENU_MBAR_MINIMIZE_D: + r.right += 1; Flags = DFCS_CAPTIONMIN | DFCS_INACTIVE; break; case (INT_PTR) HBMMENU_MBAR_CLOSE: @@ -527,7 +531,6 @@ MenuDrawBitmapItem(HDC Dc, PROSMENUITEMINFO Item, const RECT *Rect, BOOL MenuBar FIXME("Magic menu bitmap not implemented\n"); return; } - r = *Rect; InflateRect(&r, -1, -1); if (0 != (Item->fState & MF_HILITE)) { @@ -1238,6 +1241,11 @@ MenuCalcItemSize(HDC Dc, PROSMENUITEMINFO ItemInfo, HWND WndOwner, /* Leave space for the sunken border */ ItemInfo->Rect.right += 2; ItemInfo->Rect.bottom += 2; + + /* Special case: Minimize button doesn't have a space behind it. */ + if (ItemInfo->hbmpItem == (HBITMAP)HBMMENU_MBAR_MINIMIZE || + ItemInfo->hbmpItem == (HBITMAP)HBMMENU_MBAR_MINIMIZE_D) + ItemInfo->Rect.right -= 1; } /* it must be a text item - unless it's the system menu */ @@ -1463,6 +1471,8 @@ MenuMenuBarCalcSize(HDC Dc, LPRECT Rect, PROSMENUINFO MenuInfo, HWND WndOwner) } } +/* FIXME: Is this really needed? */ +#if 0 /* Finish the line (set all items to the largest height found) */ while (Start < i) { @@ -1473,6 +1483,9 @@ MenuMenuBarCalcSize(HDC Dc, LPRECT Rect, PROSMENUINFO MenuInfo, HWND WndOwner) } Start++; } +#else + Start = i; +#endif } Rect->bottom = MaxY; diff --git a/reactos/subsys/win32k/ntuser/menu.c b/reactos/subsys/win32k/ntuser/menu.c index 2137202afd8..156c59d9fa3 100644 --- a/reactos/subsys/win32k/ntuser/menu.c +++ b/reactos/subsys/win32k/ntuser/menu.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: menu.c,v 1.54 2004/05/10 17:07:18 weiden Exp $ +/* $Id: menu.c,v 1.55 2004/05/13 20:21:27 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -845,6 +845,9 @@ IntInsertMenuItem(PMENU_OBJECT MenuObject, UINT uItem, BOOL fByPosition, return FALSE; } + /* Force size recalculation! */ + MenuObject->MenuInfo.Height = 0; + pos = IntInsertMenuItemToList(MenuObject, MenuItem, pos); return pos >= 0; From 3da87fae97a062cafe9ca8bdafe2bc40b8c91423 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Thu, 13 May 2004 20:25:50 +0000 Subject: [PATCH 1098/1463] - Don't allow making a window with negative dimensions in WM_WINDOWPOSCHANGING. svn path=/trunk/; revision=9367 --- reactos/lib/user32/controls/combo.c | 3 +++ reactos/lib/user32/windows/defwnd.c | 7 ++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/reactos/lib/user32/controls/combo.c b/reactos/lib/user32/controls/combo.c index 6f778e42a1d..1bfa9cf32e2 100644 --- a/reactos/lib/user32/controls/combo.c +++ b/reactos/lib/user32/controls/combo.c @@ -491,6 +491,9 @@ static LRESULT COMBO_WindowPosChanging( } } + posChanging->cx = max(posChanging->cx, 0); + posChanging->cy = max(posChanging->cy, 0); + return 0; } diff --git a/reactos/lib/user32/windows/defwnd.c b/reactos/lib/user32/windows/defwnd.c index 0a7295aee86..7cbc0e9c87a 100644 --- a/reactos/lib/user32/windows/defwnd.c +++ b/reactos/lib/user32/windows/defwnd.c @@ -1,4 +1,4 @@ -/* $Id: defwnd.c,v 1.136 2004/05/12 20:34:38 navaraf Exp $ +/* $Id: defwnd.c,v 1.137 2004/05/13 20:24:26 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -898,6 +898,11 @@ DefWndHandleWindowPosChanging(HWND hWnd, WINDOWPOS* Pos) if (Pos->cy < minTrack.y) Pos->cy = minTrack.y; } } + else + { + Pos->cx = max(Pos->cx, 0); + Pos->cy = max(Pos->cy, 0); + } return 0; } From 66a1b30c14831e6a473242411a22b736de35360c Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Thu, 13 May 2004 20:27:04 +0000 Subject: [PATCH 1099/1463] - Add REST_NONLEGACYSHELLMODE policy. svn path=/trunk/; revision=9368 --- reactos/lib/shell32/shpolicy.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reactos/lib/shell32/shpolicy.c b/reactos/lib/shell32/shpolicy.c index 6a05d60728a..4ff03b008e6 100644 --- a/reactos/lib/shell32/shpolicy.c +++ b/reactos/lib/shell32/shpolicy.c @@ -754,6 +754,12 @@ POLICYDATA sh32_policy_table[] = SHELL_NO_POLICY }, /* 0x4000050 - 0x4000060 */ + { + REST_NONLEGACYSHELLMODE, + strExplorer, + "NoneLegacyShellMode", + SHELL_NO_POLICY + }, { REST_STARTRUNNOHOMEPATH, strExplorer, From c9b5101395dfee4ce393051f86887c87a47b6f4c Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Thu, 13 May 2004 20:28:58 +0000 Subject: [PATCH 1100/1463] - Handle more notification messages to prevent "-- %p WM_COMMAND %x unhandled" messages. svn path=/trunk/; revision=9369 --- reactos/lib/shell32/shlview.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/reactos/lib/shell32/shlview.c b/reactos/lib/shell32/shlview.c index 8dd25d54a88..adae9a68c6b 100644 --- a/reactos/lib/shell32/shlview.c +++ b/reactos/lib/shell32/shlview.c @@ -1239,6 +1239,22 @@ static LRESULT ShellView_OnNotify(IShellViewImpl * This, UINT CtlID, LPNMHDR lpn OnStateChange(This,CDBOSC_KILLFOCUS); break; + case NM_CUSTOMDRAW: + TRACE("-- NM_CUSTOMDRAW %p\n",This); + return CDRF_DODEFAULT; + + case NM_RELEASEDCAPTURE: + TRACE("-- NM_RELEASEDCAPTURE %p\n",This); + break; + + case NM_CLICK: + TRACE("-- NM_CLICK %p\n",This); + break; + + case NM_RCLICK: + TRACE("-- NM_RCLICK %p\n",This); + break; + case HDN_ENDTRACKA: TRACE("-- HDN_ENDTRACKA %p\n",This); /*nColumn1 = ListView_GetColumnWidth(This->hWndList, 0); @@ -1250,6 +1266,10 @@ static LRESULT ShellView_OnNotify(IShellViewImpl * This, UINT CtlID, LPNMHDR lpn SHFree((LPITEMIDLIST)lpnmlv->lParam); /*delete the pidl because we made a copy of it*/ break; + case LVN_DELETEALLITEMS: + TRACE("-- LVN_DELETEALLITEMS %p\n",This); + return FALSE; + case LVN_INSERTITEM: TRACE("-- LVN_INSERTITEM (STUB)%p\n",This); break; From 620a45896ace74b3d53bee12b60acd0166e04c16 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Thu, 13 May 2004 20:30:26 +0000 Subject: [PATCH 1101/1463] - Report failure when function imported by ordinal isn't found. svn path=/trunk/; revision=9370 --- reactos/lib/ntdll/ldr/utils.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/reactos/lib/ntdll/ldr/utils.c b/reactos/lib/ntdll/ldr/utils.c index 90f843c407c..02e2365f377 100644 --- a/reactos/lib/ntdll/ldr/utils.c +++ b/reactos/lib/ntdll/ldr/utils.c @@ -1,4 +1,4 @@ -/* $Id: utils.c,v 1.85 2004/05/02 20:53:50 tamlin Exp $ +/* $Id: utils.c,v 1.86 2004/05/13 20:30:26 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1474,6 +1474,11 @@ LdrpProcessImportDirectoryEntry( { Ordinal = (*FunctionNameList) & 0x7fffffff; *ImportAddressList = LdrGetExportByOrdinal(ImportedModule->BaseAddress, Ordinal); + if ((*ImportAddressList) == NULL) + { + DPRINT1("Failed to import #%ld from %wZ\n", Ordinal, &ImportedModule->FullDllName); + return STATUS_UNSUCCESSFUL; + } } else { @@ -1482,7 +1487,7 @@ LdrpProcessImportDirectoryEntry( *ImportAddressList = LdrGetExportByName(ImportedModule->BaseAddress, pe_name->Name, pe_name->Hint); if ((*ImportAddressList) == NULL) { - DPRINT1("Failed to import %s\n", pe_name->Name); + DPRINT1("Failed to import %s from %wZ\n", pe_name->Name, &ImportedModule->FullDllName); return STATUS_UNSUCCESSFUL; } } From 624300da515769d2f9abc23162777033ca94d6e6 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Thu, 13 May 2004 20:32:18 +0000 Subject: [PATCH 1102/1463] - Report a failure for FindNextFile(NULL) instead of crashing. svn path=/trunk/; revision=9371 --- reactos/lib/kernel32/file/find.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/reactos/lib/kernel32/file/find.c b/reactos/lib/kernel32/file/find.c index c8b1b29b675..4ebdf1d4ebd 100644 --- a/reactos/lib/kernel32/file/find.c +++ b/reactos/lib/kernel32/file/find.c @@ -1,4 +1,4 @@ -/* $Id: find.c,v 1.43 2004/01/23 21:16:03 ekohl Exp $ +/* $Id: find.c,v 1.44 2004/05/13 20:32:18 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -48,6 +48,14 @@ InternalFindNextFile ( IO_STATUS_BLOCK IoStatusBlock; NTSTATUS Status; + DPRINT("InternalFindNextFile(%lx)\n", hFindFile); + + if (hFindFile == NULL) + { + SetLastError (ERROR_INVALID_HANDLE); + return FALSE; + } + IData = (PKERNEL32_FIND_FILE_DATA)hFindFile; if (IData->pFileInfo->NextEntryOffset != 0) From 81728cf1b8721c66a8838b4d23bcd5657be156bc Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Thu, 13 May 2004 20:34:24 +0000 Subject: [PATCH 1103/1463] - Fix common controls subclassing. svn path=/trunk/; revision=9372 --- reactos/lib/comctl32/comctl32.h | 2 +- reactos/lib/comctl32/commctrl.c | 75 ++++++++++++++++----------------- 2 files changed, 37 insertions(+), 40 deletions(-) diff --git a/reactos/lib/comctl32/comctl32.h b/reactos/lib/comctl32/comctl32.h index 2c4aa65569c..143f1ac104f 100644 --- a/reactos/lib/comctl32/comctl32.h +++ b/reactos/lib/comctl32/comctl32.h @@ -153,7 +153,7 @@ typedef struct } SubclassProcs[31]; int stackpos; int stacknum; - int stacknew; + int wndprocrecursion; WNDPROC origproc; } SUBCLASS_INFO, *LPSUBCLASS_INFO; diff --git a/reactos/lib/comctl32/commctrl.c b/reactos/lib/comctl32/commctrl.c index e46729fe387..227544e28f1 100644 --- a/reactos/lib/comctl32/commctrl.c +++ b/reactos/lib/comctl32/commctrl.c @@ -1127,32 +1127,28 @@ BOOL WINAPI SetWindowSubclass (HWND hWnd, SUBCLASSPROC pfnSubclass, /* Check to see if we have called this function with the same uIDSubClass * and pfnSubclass */ - for (n = 0; n <= stack->stacknum + stack->stacknew - 1; n++) + for (n = 0; n < stack->stacknum; n++) if ((stack->SubclassProcs[n].id == uIDSubclass) && (stack->SubclassProcs[n].subproc == pfnSubclass)) { stack->SubclassProcs[n].ref = dwRef; return TRUE; } - if ((stack->stacknum + stack->stacknew) >= 32) { + if (stack->stacknum >= 32) { ERR ("We have a Subclass stack overflow, please increment size\n"); return FALSE; } - /* we can't simply increment both stackpos and stacknum because there might - * be a window procedure running lower in the stack, we can only get them - * up to date once the last window procedure has run */ - if (stack->stacknum == stack->stackpos) { - stack->stacknum++; + memmove (&stack->SubclassProcs[1], &stack->SubclassProcs[0], + sizeof(stack->SubclassProcs[0]) * stack->stacknum); + + stack->stacknum++; + if (stack->wndprocrecursion) stack->stackpos++; - } else - stack->stacknew++; - newnum = stack->stacknew + stack->stacknum - 1; - - stack->SubclassProcs[newnum].subproc = pfnSubclass; - stack->SubclassProcs[newnum].ref = dwRef; - stack->SubclassProcs[newnum].id = uIDSubclass; + stack->SubclassProcs[0].subproc = pfnSubclass; + stack->SubclassProcs[0].ref = dwRef; + stack->SubclassProcs[0].id = uIDSubclass; return TRUE; } @@ -1187,7 +1183,7 @@ BOOL WINAPI GetWindowSubclass (HWND hWnd, SUBCLASSPROC pfnSubclass, if (!stack) return FALSE; - for (n = 0; n <= stack->stacknum + stack->stacknew - 1; n++) + for (n = 0; n < stack->stacknum; n++) if ((stack->SubclassProcs[n].id == uID) && (stack->SubclassProcs[n].subproc == pfnSubclass)) { *pdwRef = stack->SubclassProcs[n].ref; @@ -1225,7 +1221,8 @@ BOOL WINAPI RemoveWindowSubclass(HWND hWnd, SUBCLASSPROC pfnSubclass, UINT_PTR u if (!stack) return FALSE; - if ((stack->stacknum == 1) && (stack->stackpos == 1) && !stack->stacknew) { + if ((stack->stacknum == 1) && (stack->stackpos == 1) && + !stack->wndprocrecursion) { TRACE("Last Subclass removed, cleaning up\n"); /* clean up our heap and reset the origional window procedure */ if (IsWindowUnicode (hWnd)) @@ -1237,24 +1234,21 @@ BOOL WINAPI RemoveWindowSubclass(HWND hWnd, SUBCLASSPROC pfnSubclass, UINT_PTR u return TRUE; } - for (n = stack->stacknum + stack->stacknew - 1; n >= 0; n--) + for (n = stack->stacknum - 1; n >= 0; n--) if ((stack->SubclassProcs[n].id == uID) && (stack->SubclassProcs[n].subproc == pfnSubclass)) { - if (n != (stack->stacknum + stack->stacknew)) + if (n != stack->stacknum) /* Fill the hole in the stack */ memmove (&stack->SubclassProcs[n], &stack->SubclassProcs[n + 1], - sizeof(stack->SubclassProcs[0]) * (stack->stacknew + stack->stacknum - n)); + sizeof(stack->SubclassProcs[0]) * (stack->stacknum - n)); stack->SubclassProcs[n].subproc = NULL; stack->SubclassProcs[n].ref = 0; stack->SubclassProcs[n].id = 0; - /* If we are currently running a window procedure we have to manipulate - * the stack position pointers so that we don't corrupt the stack */ - if ((n < stack->stackpos) || (stack->stackpos == stack->stacknum)) { - stack->stacknum--; + stack->stacknum--; + if (n < stack->stackpos && stack->wndprocrecursion) stack->stackpos--; - } else if (n >= stack->stackpos) - stack->stacknew--; + return TRUE; } @@ -1291,24 +1285,27 @@ LRESULT WINAPI DefSubclassProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar return 0; } - /* If we are at pos 0 then we have to call the origional window procedure */ - if (stack->stackpos == 0) { + stack->wndprocrecursion++; + + /* If we are at the end of stack then we have to call the original + * window procedure */ + if (stack->stackpos == stack->stacknum) { if (IsWindowUnicode (hWnd)) - return CallWindowProcW (stack->origproc, hWnd, uMsg, wParam, lParam); + ret = CallWindowProcW (stack->origproc, hWnd, uMsg, wParam, lParam); else - return CallWindowProcA (stack->origproc, hWnd, uMsg, wParam, lParam); + ret = CallWindowProcA (stack->origproc, hWnd, uMsg, wParam, lParam); + } else { + stack->stackpos++; + /* call the Subclass procedure from the stack */ + ret = stack->SubclassProcs[stack->stackpos - 1].subproc (hWnd, uMsg, wParam, lParam, + stack->SubclassProcs[stack->stackpos - 1].id, stack->SubclassProcs[stack->stackpos - 1].ref); + stack->stackpos--; } - stackpos = --stack->stackpos; - /* call the Subclass procedure from the stack */ - ret = stack->SubclassProcs[stackpos].subproc (hWnd, uMsg, wParam, lParam, - stack->SubclassProcs[stackpos].id, stack->SubclassProcs[stackpos].ref); - stack->stackpos++; - - if ((stack->stackpos == stack->stacknum) && stack->stacknew) { - stack->stacknum += stack->stacknew; - stack->stackpos += stack->stacknew; - stack->stacknew = 0; + /* We finished the recursion, so let's reinitalize the stack position to + * beginning */ + if ((--stack->wndprocrecursion) == 0) { + stack->stackpos = 0; } /* If we removed the last entry in our stack while a window procedure was From 63c655e5d160aff2ba05ac833fd9acfcd9afaffb Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Thu, 13 May 2004 20:42:28 +0000 Subject: [PATCH 1104/1463] - Add some stubs needed by native Windows DLLs. svn path=/trunk/; revision=9373 --- reactos/lib/advapi32/advapi32.def | 4 ++-- reactos/lib/advapi32/advapi32.edf | 4 ++-- reactos/lib/advapi32/sec/misc.c | 16 +++++++++++-- reactos/lib/kernel32/kernel32.def | 8 +++---- reactos/lib/kernel32/kernel32.edf | 10 ++++---- reactos/lib/kernel32/misc/stubs.c | 38 ++++++++++++++++++++++++++++++- 6 files changed, 64 insertions(+), 16 deletions(-) diff --git a/reactos/lib/advapi32/advapi32.def b/reactos/lib/advapi32/advapi32.def index 2ffc4ab06ed..15474206918 100644 --- a/reactos/lib/advapi32/advapi32.def +++ b/reactos/lib/advapi32/advapi32.def @@ -1,4 +1,4 @@ -; $Id: advapi32.def,v 1.17 2004/03/20 04:32:05 sedwards Exp $ +; $Id: advapi32.def,v 1.18 2004/05/13 20:42:27 navaraf Exp $ ; ; advapi32.def ; @@ -137,7 +137,7 @@ GetCurrentHwProfileA@4 ;GetExplicitEntriesFromAclA@12 ;GetExplicitEntriesFromAclW@12 GetFileSecurityA@20 -;GetFileSecurityW@20 +GetFileSecurityW@20 GetKernelObjectSecurity@20 GetLengthSid@4 ;GetMultipleTrusteeA@4 diff --git a/reactos/lib/advapi32/advapi32.edf b/reactos/lib/advapi32/advapi32.edf index dd17a7313e7..6634ff7f551 100644 --- a/reactos/lib/advapi32/advapi32.edf +++ b/reactos/lib/advapi32/advapi32.edf @@ -1,4 +1,4 @@ -; $Id: advapi32.edf,v 1.37 2004/03/20 04:32:06 sedwards Exp $ +; $Id: advapi32.edf,v 1.38 2004/05/13 20:42:27 navaraf Exp $ ; ; advapi32.edf ; @@ -133,7 +133,7 @@ GetCurrentHwProfileA=GetCurrentHwProfileA@4 ;GetExplicitEntriesFromAclA=GetExplicitEntriesFromAclA@12 ;GetExplicitEntriesFromAclW=GetExplicitEntriesFromAclW@12 GetFileSecurityA=GetFileSecurityA@20 -;GetFileSecurityW=GetFileSecurityW@20 +GetFileSecurityW=GetFileSecurityW@20 GetKernelObjectSecurity=GetKernelObjectSecurity@20 GetLengthSid=GetLengthSid@4 ;GetMultipleTrusteeA=GetMultipleTrusteeA@4 diff --git a/reactos/lib/advapi32/sec/misc.c b/reactos/lib/advapi32/sec/misc.c index de3f73373c3..497f248e481 100644 --- a/reactos/lib/advapi32/sec/misc.c +++ b/reactos/lib/advapi32/sec/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.14 2004/04/12 15:22:52 navaraf Exp $ +/* $Id: misc.c,v 1.15 2004/05/13 20:42:28 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -67,10 +67,22 @@ GetFileSecurityA (LPCSTR lpFileName, DWORD nLength, LPDWORD lpnLengthNeeded) { - DPRINT("GetFileSecurityW : stub\n"); + DPRINT("GetFileSecurityA: stub\n"); return TRUE; } +/* + * @unimplemented + */ +BOOL WINAPI +GetFileSecurityW (LPCWSTR lpFileName, + SECURITY_INFORMATION RequestedInformation, + PSECURITY_DESCRIPTOR pSecurityDescriptor, + DWORD nLength, LPDWORD lpnLengthNeeded) +{ + DPRINT("GetFileSecurityW: stub\n"); + return TRUE; +} /* * @implemented diff --git a/reactos/lib/kernel32/kernel32.def b/reactos/lib/kernel32/kernel32.def index dc2597d64c6..bfaf164a177 100644 --- a/reactos/lib/kernel32/kernel32.def +++ b/reactos/lib/kernel32/kernel32.def @@ -48,15 +48,15 @@ BackupRead@28 BackupSeek@24 BackupWrite@28 BaseAttachCompleteThunk@0 -;BaseCheckAppcompatCache +BaseCheckAppcompatCache@16 ;BaseCleanupAppcompatCache ;BaseCleanupAppcompatCacheSupport -;BaseDumpAppcompatCache -;BaseFlushAppcompatCache +BaseDumpAppcompatCache@0 +BaseFlushAppcompatCache@0 ;BaseInitAppcompatCache ;BaseInitAppcompatCacheSupport ;BaseProcessInitPostImport -;BaseUpdateAppcompatCache +BaseUpdateAppcompatCache@12 Beep@8 BeginUpdateResourceA@8 BeginUpdateResourceW@8 diff --git a/reactos/lib/kernel32/kernel32.edf b/reactos/lib/kernel32/kernel32.edf index 46dd483eb59..a33bd3b25a8 100644 --- a/reactos/lib/kernel32/kernel32.edf +++ b/reactos/lib/kernel32/kernel32.edf @@ -1,4 +1,4 @@ -; $Id: kernel32.edf,v 1.31 2003/12/17 01:46:08 hyperion Exp $ +; $Id: kernel32.edf,v 1.32 2004/05/13 20:42:28 navaraf Exp $ ; ; kernel32.edf ; @@ -52,15 +52,15 @@ BackupRead=BackupRead@28 BackupSeek=BackupSeek@24 BackupWrite=BackupWrite@28 BaseAttachCompleteThunk=BaseAttachCompleteThunk@0 -;BaseCheckAppcompatCache +BaseCheckAppcompatCache=BaseCheckAppcompatCache@16 ;BaseCleanupAppcompatCache ;BaseCleanupAppcompatCacheSupport -;BaseDumpAppcompatCache -;BaseFlushAppcompatCache +BaseDumpAppcompatCache=BaseDumpAppcompatCache@0 +BaseFlushAppcompatCache=BaseFlushAppcompatCache@0 ;BaseInitAppcompatCache ;BaseInitAppcompatCacheSupport ;BaseProcessInitPostImport -;BaseUpdateAppcompatCache +BaseUpdateAppcompatCache=BaseUpdateAppcompatCache@12 Beep=Beep@8 BeginUpdateResourceA=BeginUpdateResourceA@8 BeginUpdateResourceW=BeginUpdateResourceW@8 diff --git a/reactos/lib/kernel32/misc/stubs.c b/reactos/lib/kernel32/misc/stubs.c index a6eadb3ef9a..680234da5b6 100644 --- a/reactos/lib/kernel32/misc/stubs.c +++ b/reactos/lib/kernel32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.75 2004/05/03 14:34:44 weiden Exp $ +/* $Id: stubs.c,v 1.76 2004/05/13 20:42:28 navaraf Exp $ * * KERNEL32.DLL stubs (unimplemented functions) * Remove from this file, if you implement them. @@ -23,6 +23,41 @@ BaseAttachCompleteThunk (VOID) return FALSE; } +/* + * @unimplemented + */ +VOID STDCALL +BaseDumpAppcompatCache(VOID) +{ + DPRINT1("BaseDumpAppcompatCache: stub\n"); +} + +/* + * @unimplemented + */ +VOID STDCALL +BaseFlushAppcompatCache(VOID) +{ + DPRINT1("BaseFlushAppcompatCache: stub\n"); +} + +/* + * @unimplemented + */ +VOID STDCALL +BaseCheckAppcompatCache(ULONG Unknown1, ULONG Unknown2, ULONG Unknown3, ULONG Unknown4) +{ + DPRINT1("BaseCheckAppcompatCache: stub\n"); +} + +/* + * @unimplemented + */ +VOID STDCALL +BaseUpdateAppcompatCache(ULONG Unknown1, ULONG Unknown2, ULONG Unknown3) +{ + DPRINT1("BaseUpdateAppcompatCache: stub\n"); +} /* * @unimplemented @@ -707,6 +742,7 @@ DeactivateActCtx( ULONG_PTR ulCookie ) { + DbgPrint("DeactivateActCtx: stub\n"); SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } From 41df8b886e62cc9a2681ba216835b2ad6e115df8 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Thu, 13 May 2004 20:46:28 +0000 Subject: [PATCH 1105/1463] - Make WinPosSearchChildren more readable. svn path=/trunk/; revision=9374 --- reactos/subsys/win32k/ntuser/winpos.c | 115 +++++++++++++------------- 1 file changed, 57 insertions(+), 58 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index ecd50c1655a..faa97c92de4 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.114 2004/05/10 17:07:18 weiden Exp $ +/* $Id: winpos.c,v 1.115 2004/05/13 20:46:28 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1350,70 +1350,69 @@ WinPosShowWindow(HWND Wnd, INT Cmd) return(WasVisible); } -VOID STATIC FASTCALL -WinPosSearchChildren(PWINDOW_OBJECT ScopeWin, PUSER_MESSAGE_QUEUE OnlyHitTests, POINT *Point, - PWINDOW_OBJECT* Window, USHORT *HitTest) +STATIC VOID FASTCALL +WinPosSearchChildren( + PWINDOW_OBJECT ScopeWin, PUSER_MESSAGE_QUEUE OnlyHitTests, POINT *Point, + PWINDOW_OBJECT* Window, USHORT *HitTest) { - PWINDOW_OBJECT Current; - HWND *List, *phWnd; + PWINDOW_OBJECT Current; + HWND *List, *phWnd; - if((List = IntWinListChildren(ScopeWin))) - { - for(phWnd = List; *phWnd; ++phWnd) - { - if(!(Current = IntGetWindowObject(*phWnd))) + if ((List = IntWinListChildren(ScopeWin))) + { + for (phWnd = List; *phWnd; ++phWnd, IntReleaseWindowObject(Current)) { - continue; - } - - if (Current->Style & WS_VISIBLE && - (!(Current->Style & WS_DISABLED) || (Current->Style & (WS_CHILD | WS_POPUP)) != WS_CHILD) && - IntPtInWindow(Current, Point->x, Point->y)) - { - if(*Window) - { - IntReleaseWindowObject(*Window); - } - *Window = Current; - - if(Current->Style & WS_DISABLED) - { - *HitTest = HTERROR; - ExFreePool(List); - return; - } - - if(OnlyHitTests && (Current->MessageQueue == OnlyHitTests)) - { - *HitTest = IntSendMessage(Current->Self, WM_NCHITTEST, 0, - MAKELONG(Point->x, Point->y)); - if((*HitTest) == (USHORT)HTTRANSPARENT) - { + if (!(Current = IntGetWindowObject(*phWnd))) continue; - } - } - else - { - *HitTest = HTCLIENT; - } + + if (!(Current->Style & WS_VISIBLE)) + continue; + + if ((Current->Style & (WS_POPUP | WS_CHILD | WS_DISABLED)) == + (WS_CHILD | WS_DISABLED)) + continue; + + if (!IntPtInWindow(Current, Point->x, Point->y)) + continue; + + if (*Window) + IntReleaseWindowObject(*Window); + *Window = Current; + + if (Current->Style & WS_MINIMIZE) + { + *HitTest = HTCAPTION; + break; + } + + if (Current->Style & WS_DISABLED) + { + *HitTest = HTERROR; + break; + } - if(Point->x >= Current->ClientRect.left && - Point->x < Current->ClientRect.right && - Point->y >= Current->ClientRect.top && - Point->y < Current->ClientRect.bottom) - { - WinPosSearchChildren(Current, OnlyHitTests, Point, Window, HitTest); - ExFreePool(List); - return; - } + if (OnlyHitTests && (Current->MessageQueue == OnlyHitTests)) + { + *HitTest = IntSendMessage(Current->Self, WM_NCHITTEST, 0, + MAKELONG(Point->x, Point->y)); + if ((*HitTest) == (USHORT)HTTRANSPARENT) + continue; + } + else + *HitTest = HTCLIENT; - ExFreePool(List); - return; + if (Point->x >= Current->ClientRect.left && + Point->x < Current->ClientRect.right && + Point->y >= Current->ClientRect.top && + Point->y < Current->ClientRect.bottom) + { + WinPosSearchChildren(Current, OnlyHitTests, Point, Window, HitTest); + } + + break; } - IntReleaseWindowObject(Current); - } - ExFreePool(List); - } + ExFreePool(List); + } } USHORT FASTCALL From f4b54419c39ae091a62fdd7a73ed5a7f2ebbf790 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Thu, 13 May 2004 20:48:31 +0000 Subject: [PATCH 1106/1463] - Added missing unlocking of handle table in RtlLookupAtomInAtomTable. svn path=/trunk/; revision=9375 --- reactos/lib/ntdll/rtl/atom.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/lib/ntdll/rtl/atom.c b/reactos/lib/ntdll/rtl/atom.c index 587918e0c0a..dc4fab4779d 100644 --- a/reactos/lib/ntdll/rtl/atom.c +++ b/reactos/lib/ntdll/rtl/atom.c @@ -1,4 +1,4 @@ -/* $Id: atom.c,v 1.5 2003/07/11 13:50:23 royce Exp $ +/* $Id: atom.c,v 1.6 2004/05/13 20:48:31 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -434,6 +434,8 @@ RtlLookupAtomInAtomTable(IN PRTL_ATOM_TABLE AtomTable, Current = Current->Flink; } + RtlpUnlockAtomTable(AtomTable); + return STATUS_OBJECT_NAME_NOT_FOUND; } From 6ea0fbf3f31bd9a4d79dcc521db9f131f95953bc Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Thu, 13 May 2004 21:01:14 +0000 Subject: [PATCH 1107/1463] - Implementation of RtlDuplicateUnicodeString. - Copied implementation of RtlGetVersion from ntoskrnl. - Stubs for RtlNtPathNameToDosPathName and RtlpEnsureBufferSize. These functions are needed by native Windows DLLs. - Export RtlRandomEx as a wrapper for RtlRandom. svn path=/trunk/; revision=9376 --- reactos/lib/ntdll/def/ntdll.def | 6 +++- reactos/lib/ntdll/def/ntdll.edf | 7 +++- reactos/lib/ntdll/makefile | 5 +-- reactos/lib/ntdll/rtl/path.c | 16 ++++++++- reactos/lib/ntdll/rtl/unicode.c | 43 ++++++++++++++++++++++- reactos/lib/ntdll/rtl/version.c | 62 +++++++++++++++++++++++++++++++++ 6 files changed, 133 insertions(+), 6 deletions(-) create mode 100644 reactos/lib/ntdll/rtl/version.c diff --git a/reactos/lib/ntdll/def/ntdll.def b/reactos/lib/ntdll/def/ntdll.def index 4b3715dab8a..0ba838b25ac 100644 --- a/reactos/lib/ntdll/def/ntdll.def +++ b/reactos/lib/ntdll/def/ntdll.def @@ -1,4 +1,4 @@ -; $Id: ntdll.def,v 1.119 2004/05/01 19:21:44 ekohl Exp $ +; $Id: ntdll.def,v 1.120 2004/05/13 21:01:14 navaraf Exp $ ; ; ReactOS Operating System ; @@ -369,6 +369,7 @@ RtlDecompressFragment@32 RtlDeleteAce@8 RtlDeleteAtomFromAtomTable@8 RtlDeleteCriticalSection@4 +RtlDuplicateUnicodeString@12 RtlSetCriticalSectionSpinCount@8 ;RtlDeleteElementGenericTable ;RtlDeleteNoSplay @@ -461,6 +462,7 @@ RtlGetOwnerSecurityDescriptor@12 RtlGetProcessHeaps@8 RtlGetSaclSecurityDescriptor@16 ;RtlGetUserInfoHeap +RtlGetVersion@4 ;RtlGuidToPropertySetName RtlIdentifierAuthoritySid@4 RtlImageDirectoryEntryToData@16 @@ -521,6 +523,7 @@ RtlMultiByteToUnicodeSize@12 ;RtlNewSecurityGrantedAccess ;RtlNewSecurityObject RtlNormalizeProcessParams@4 +RtlNtPathNameToDosPathName@16 RtlNtStatusToDosError@4 ;RtlNumberGenericTableElements RtlNumberOfClearBits@4 @@ -634,6 +637,7 @@ RtlValidateProcessHeaps@0 RtlWriteRegistryValue@24 ;RtlZeroHeap RtlZeroMemory@8 +RtlpEnsureBufferSize@12 RtlpNtCreateKey@24 RtlpNtEnumerateSubKey@16 RtlpNtMakeTemporaryKey@4 diff --git a/reactos/lib/ntdll/def/ntdll.edf b/reactos/lib/ntdll/def/ntdll.edf index a97cacd4be9..3e02dcf925b 100644 --- a/reactos/lib/ntdll/def/ntdll.edf +++ b/reactos/lib/ntdll/def/ntdll.edf @@ -1,4 +1,4 @@ -; $Id: ntdll.edf,v 1.109 2004/05/01 19:21:44 ekohl Exp $ +; $Id: ntdll.edf,v 1.110 2004/05/13 21:01:14 navaraf Exp $ ; ; ReactOS Operating System ; @@ -369,6 +369,7 @@ RtlDecompressFragment=RtlDecompressFragment@32 RtlDeleteAce=RtlDeleteAce@8 RtlDeleteAtomFromAtomTable=RtlDeleteAtomFromAtomTable@8 RtlDeleteCriticalSection=RtlDeleteCriticalSection@4 +RtlDuplicateUnicodeString=RtlDuplicateUnicodeString@12 RtlSetCriticalSectionSpinCount=RtlSetCriticalSectionSpinCount@8 ;RtlDeleteElementGenericTable ;RtlDeleteNoSplay @@ -461,6 +462,7 @@ RtlGetOwnerSecurityDescriptor=RtlGetOwnerSecurityDescriptor@12 RtlGetProcessHeaps=RtlGetProcessHeaps@8 RtlGetSaclSecurityDescriptor=RtlGetSaclSecurityDescriptor@16 ;RtlGetUserInfoHeap +RtlGetVersion=RtlGetVersion@4 ;RtlGuidToPropertySetName RtlIdentifierAuthoritySid=RtlIdentifierAuthoritySid@4 RtlImageDirectoryEntryToData=RtlImageDirectoryEntryToData@16 @@ -523,6 +525,7 @@ RtlMultiByteToUnicodeSize=RtlMultiByteToUnicodeSize@12 ;RtlNewSecurityObject RtlNormalizeProcessParams=RtlNormalizeProcessParams@4 RtlNtStatusToDosError=RtlNtStatusToDosError@4 +RtlNtPathNameToDosPathName=RtlNtPathNameToDosPathName@16 ;RtlNumberGenericTableElements RtlNumberOfClearBits=RtlNumberOfClearBits@4 RtlNumberOfSetBits=RtlNumberOfSetBits@4 @@ -553,6 +556,7 @@ RtlQueryTimeZoneInformation=RtlQueryTimeZoneInformation@4 RtlRaiseException=RtlRaiseException@4 RtlRaiseStatus=RtlRaiseStatus@4 RtlRandom=RtlRandom@4 +RtlRandomEx=RtlRandom@4 RtlReAllocateHeap=RtlReAllocateHeap@16 ;RtlRealPredecessor ;RtlRealSuccessor @@ -635,6 +639,7 @@ RtlValidateProcessHeaps=RtlValidateProcessHeaps@0 RtlWriteRegistryValue=RtlWriteRegistryValue@24 ;RtlZeroHeap RtlZeroMemory=RtlZeroMemory@8 +RtlpEnsureBufferSize=RtlpEnsureBufferSize@12 RtlpNtCreateKey=RtlpNtCreateKey@24 RtlpNtEnumerateSubKey=RtlpNtEnumerateSubKey@16 RtlpNtMakeTemporaryKey=RtlpNtMakeTemporaryKey@4 diff --git a/reactos/lib/ntdll/makefile b/reactos/lib/ntdll/makefile index 10d50c007d8..54c06d7c280 100644 --- a/reactos/lib/ntdll/makefile +++ b/reactos/lib/ntdll/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.99 2004/02/25 19:34:32 ekohl Exp $ +# $Id: makefile,v 1.100 2004/05/13 21:01:14 navaraf Exp $ PATH_TO_TOP = ../.. @@ -104,7 +104,8 @@ RTL_OBJECTS = \ rtl/thread.o \ rtl/time.o \ rtl/timezone.o \ - rtl/unicode.o + rtl/unicode.o \ + rtl/version.o STDIO_OBJECTS = \ stdio/sprintf.o \ diff --git a/reactos/lib/ntdll/rtl/path.c b/reactos/lib/ntdll/rtl/path.c index b37dbf2d722..1cd0c8c879b 100644 --- a/reactos/lib/ntdll/rtl/path.c +++ b/reactos/lib/ntdll/rtl/path.c @@ -1,4 +1,4 @@ -/* $Id: path.c,v 1.27 2004/03/13 22:23:14 weiden Exp $ +/* $Id: path.c,v 1.28 2004/05/13 21:01:14 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -1012,4 +1012,18 @@ RtlDoesFileExists_U(IN PWSTR FileName) return FALSE; } +NTSTATUS STDCALL +RtlpEnsureBufferSize(ULONG Unknown1, ULONG Unknown2, ULONG Unknown3) +{ + DPRINT1("RtlpEnsureBufferSize: stub\n"); + return STATUS_NOT_IMPLEMENTED; +} + +NTSTATUS STDCALL +RtlNtPathNameToDosPathName(ULONG Unknown1, ULONG Unknown2, ULONG Unknown3, ULONG Unknown4) +{ + DPRINT1("RtlNtPathNameToDosPathName: stub\n"); + return STATUS_NOT_IMPLEMENTED; +} + /* EOF */ diff --git a/reactos/lib/ntdll/rtl/unicode.c b/reactos/lib/ntdll/rtl/unicode.c index f182f7f55d8..e00ab783986 100644 --- a/reactos/lib/ntdll/rtl/unicode.c +++ b/reactos/lib/ntdll/rtl/unicode.c @@ -1,4 +1,4 @@ -/* $Id: unicode.c,v 1.37 2004/02/15 07:04:45 arty Exp $ +/* $Id: unicode.c,v 1.38 2004/05/13 21:01:14 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1899,4 +1899,45 @@ RtlxUnicodeStringToOemSize (IN PUNICODE_STRING UnicodeString) return RtlUnicodeStringToAnsiSize (UnicodeString); } + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlDuplicateUnicodeString( + INT AddNull, + IN PUNICODE_STRING SourceString, + PUNICODE_STRING DestinationString) +{ + if (SourceString == NULL || DestinationString == NULL) + return STATUS_INVALID_PARAMETER; + + + if (SourceString->Length == 0 && AddNull != 3) + { + DestinationString->Length = 0; + DestinationString->MaximumLength = 0; + DestinationString->Buffer = NULL; + } else + { + unsigned int DestMaxLength = SourceString->Length; + + if (AddNull) + DestMaxLength += sizeof(UNICODE_NULL); + + DestinationString->Buffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, DestMaxLength); + if (DestinationString->Buffer == NULL) + return STATUS_NO_MEMORY; + + RtlCopyMemory(DestinationString->Buffer, SourceString->Buffer, SourceString->Length); + DestinationString->Length = SourceString->Length; + DestinationString->MaximumLength = DestMaxLength; + + if (AddNull) + DestinationString->Buffer[DestinationString->Length / sizeof(WCHAR)] = 0; + } + + return STATUS_SUCCESS; +} + /* EOF */ diff --git a/reactos/lib/ntdll/rtl/version.c b/reactos/lib/ntdll/rtl/version.c new file mode 100644 index 00000000000..778d33bdd45 --- /dev/null +++ b/reactos/lib/ntdll/rtl/version.c @@ -0,0 +1,62 @@ +/* + * 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: version.c,v 1.1 2004/05/13 21:01:14 navaraf Exp $ + * + * PROJECT: ReactOS kernel + * PURPOSE: Runtime code + * FILE: ntoskrnl/rtl/version.c + * PROGRAMER: Filip Navara + */ + +/* INCLUDES *****************************************************************/ + +#define __USE_W32API +#include <ddk/ntddk.h> + +/* FUNCTIONS ****************************************************************/ + +NTSTATUS STDCALL +RtlGetVersion(RTL_OSVERSIONINFOW *Info) +{ + WCHAR CSDString[] = L"Service Pack 6"; + + if (Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOW) || + Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW)) + { + Info->dwMajorVersion = 4; + Info->dwMinorVersion = 0; + Info->dwBuildNumber = 1381; + Info->dwPlatformId = VER_PLATFORM_WIN32_NT; + RtlCopyMemory(Info->szCSDVersion, CSDString, sizeof(CSDString)); + if (Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW)) + { + RTL_OSVERSIONINFOEXW *InfoEx = (RTL_OSVERSIONINFOEXW *)Info; + InfoEx->wServicePackMajor = 6; + InfoEx->wServicePackMinor = 0; + InfoEx->wSuiteMask = 0; + InfoEx->wProductType = VER_NT_WORKSTATION; + } + + return STATUS_SUCCESS; + } + + return STATUS_INVALID_PARAMETER; +} + +/* EOF */ From 57df925ccbd0396bc36b76624ce891e782ba0126 Mon Sep 17 00:00:00 2001 From: James Tabor <james.tabor@reactos.org> Date: Fri, 14 May 2004 09:25:41 +0000 Subject: [PATCH 1108/1463] Use updated version of SystemHandleInformation. svn path=/trunk/; revision=9377 --- reactos/include/ntos/zwtypes.h | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/reactos/include/ntos/zwtypes.h b/reactos/include/ntos/zwtypes.h index c17a4b2592a..8e240f772d6 100755 --- a/reactos/include/ntos/zwtypes.h +++ b/reactos/include/ntos/zwtypes.h @@ -369,11 +369,20 @@ struct _SYSTEM_HANDLE_ENTRY } SYSTEM_HANDLE_ENTRY, *PSYSTEM_HANDLE_ENTRY; typedef -struct _SYSTEM_HANDLE_INFORMATION +struct _SYSTEM_HANDLE_INFORMATION_NT4 { ULONG Count; SYSTEM_HANDLE_ENTRY Handle [1]; +} SYSTEM_HANDLE_INFORMATION_NT4, *PSYSTEM_HANDLE_INFORMATION_NT4; + +typedef struct _SYSTEM_HANDLE_INFORMATION { + ULONG ProcessId; + UCHAR ObjectTypeNumber; + UCHAR Flags; + USHORT Handle; + PVOID Object; + ACCESS_MASK GrantedAccess; } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION; // SystemObjectInformation (17) From 4087ebf77f44bff9da351532394c0ad268a8998b Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Fri, 14 May 2004 12:11:52 +0000 Subject: [PATCH 1109/1463] Implement basic range list functions. svn path=/trunk/; revision=9378 --- reactos/lib/ntdll/rtl/rangelist.c | 153 ++++++++++++++++++++++++++++-- 1 file changed, 145 insertions(+), 8 deletions(-) diff --git a/reactos/lib/ntdll/rtl/rangelist.c b/reactos/lib/ntdll/rtl/rangelist.c index 01d95f87787..413574e324e 100644 --- a/reactos/lib/ntdll/rtl/rangelist.c +++ b/reactos/lib/ntdll/rtl/rangelist.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: rangelist.c,v 1.1 2004/02/01 20:48:06 ekohl Exp $ +/* $Id: rangelist.c,v 1.2 2004/05/14 12:11:52 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -28,11 +28,24 @@ #include <ddk/ntddk.h> +#define NDEBUG +#include <ntdll/ntdll.h> + + +typedef struct _RTL_RANGE_ENTRY +{ + LIST_ENTRY Entry; + RTL_RANGE Range; +} RTL_RANGE_ENTRY, *PRTL_RANGE_ENTRY; + /* FUNCTIONS ***************************************************************/ /* - * @unimplemented + * TODO: + * - Check for overlapping ranges. + * + * @implemented */ NTSTATUS STDCALL RtlAddRange (IN OUT PRTL_RANGE_LIST RangeList, @@ -43,7 +56,70 @@ RtlAddRange (IN OUT PRTL_RANGE_LIST RangeList, IN PVOID UserData OPTIONAL, IN PVOID Owner OPTIONAL) { - return STATUS_NOT_IMPLEMENTED; + PRTL_RANGE_ENTRY RangeEntry; + PRTL_RANGE_ENTRY Previous; + PRTL_RANGE_ENTRY Current; + PLIST_ENTRY Entry; + + if (Start > End) + return STATUS_INVALID_PARAMETER; + + /* Create new range entry */ + RangeEntry = RtlAllocateHeap (RtlGetProcessHeap(), + 0, + sizeof(RTL_RANGE_ENTRY)); + if (RangeEntry == NULL) + return STATUS_INSUFFICIENT_RESOURCES; + + /* Initialize range entry */ + RangeEntry->Range.Start = Start; + RangeEntry->Range.End = End; + RangeEntry->Range.Attributes = Attributes; + RangeEntry->Range.Flags = Flags; + RangeEntry->Range.UserData = UserData; + RangeEntry->Range.Owner = Owner; + + /* Insert range entry */ + if (RangeList->Count == 0) + { + InsertTailList (&RangeList->ListHead, + &RangeEntry->Entry); + RangeList->Count++; + RangeList->Stamp++; + return STATUS_SUCCESS; + } + else + { + Previous = NULL; + Entry = RangeList->ListHead.Flink; + while (Entry != &RangeList->ListHead) + { + Current = CONTAINING_RECORD (Entry, RTL_RANGE_ENTRY, Entry); + if (Current->Range.Start > RangeEntry->Range.End) + { + /* Insert before current */ + DPRINT ("Insert before current\n"); + InsertTailList (&Current->Entry, + &RangeEntry->Entry); + + RangeList->Count++; + RangeList->Stamp++; + return STATUS_SUCCESS; + } + + Previous = Current; + Entry = Entry->Flink; + } + + DPRINT ("Insert tail\n"); + InsertTailList (&RangeList->ListHead, + &RangeEntry->Entry); + RangeList->Count++; + RangeList->Stamp++; + return STATUS_SUCCESS; + } + + return STATUS_UNSUCCESSFUL; } @@ -102,35 +178,92 @@ RtlFindRange (IN PRTL_RANGE_LIST RangeList, /* - * @unimplemented + * @implemented */ VOID STDCALL RtlFreeRangeList (IN PRTL_RANGE_LIST RangeList) { + PLIST_ENTRY Entry; +#ifndef NDEBUG + PRTL_RANGE_ENTRY Current; +#endif + + while (!IsListEmpty(&RangeList->ListHead)) + { + Entry = RemoveHeadList (&RangeList->ListHead); + +#ifndef NDEBUG + Current = CONTAINING_RECORD (Entry, RTL_RANGE_ENTRY, Entry); + DPRINT ("Range start: %I64u\n", Current->Range.Start); + DPRINT ("Range end: %I64u\n", Current->Range.End); +#endif + + RtlFreeHeap (RtlGetProcessHeap(), + 0, + Entry); + } + + RangeList->Count = 0; + RangeList->Stamp++; } /* - * @unimplemented + * @implemented */ NTSTATUS STDCALL RtlGetFirstRange (IN PRTL_RANGE_LIST RangeList, OUT PRTL_RANGE_LIST_ITERATOR Iterator, OUT PRTL_RANGE *Range) { - return STATUS_NOT_IMPLEMENTED; + Iterator->RangeListHead = &RangeList->ListHead; + Iterator->MergedHead = NULL; + Iterator->Stamp = RangeList->Stamp; + if (IsListEmpty(&RangeList->ListHead)) + { + Iterator->Current = NULL; + *Range = NULL; + return STATUS_NO_MORE_ENTRIES; + } + + Iterator->Current = RangeList->ListHead.Flink; + *Range = &((PRTL_RANGE_ENTRY)Iterator->Current)->Range; + + return STATUS_SUCCESS; } /* - * @unimplemented + * @implemented */ NTSTATUS STDCALL RtlGetNextRange (IN OUT PRTL_RANGE_LIST_ITERATOR Iterator, OUT PRTL_RANGE *Range, IN BOOLEAN MoveForwards) { - return STATUS_NOT_IMPLEMENTED; + PRTL_RANGE_LIST RangeList; + PLIST_ENTRY Next; + + RangeList = CONTAINING_RECORD(Iterator->RangeListHead, RTL_RANGE_LIST, ListHead); + if (Iterator->Stamp != RangeList->Stamp) + return STATUS_INVALID_PARAMETER; + + if (MoveForwards) + { + Next = ((PRTL_RANGE_ENTRY)Iterator->Current)->Entry.Flink; + } + else + { + Next = ((PRTL_RANGE_ENTRY)Iterator->Current)->Entry.Blink; + } + + if (Next == Iterator->RangeListHead) + return STATUS_NO_MORE_ENTRIES; + + Iterator->Current = Next; + *Range = &((PRTL_RANGE_ENTRY)Next)->Range; + + return STATUS_SUCCESS; } @@ -140,6 +273,10 @@ RtlGetNextRange (IN OUT PRTL_RANGE_LIST_ITERATOR Iterator, VOID STDCALL RtlInitializeRangeList (IN OUT PRTL_RANGE_LIST RangeList) { + InitializeListHead (&RangeList->ListHead); + RangeList->Flags = 0; + RangeList->Count = 0; + RangeList->Stamp = 0; } From 1f1079ac18e42e82712cd0ac6d21089bee9cca33 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 14 May 2004 16:48:04 +0000 Subject: [PATCH 1110/1463] - Don't modify Msg->pt for mouse messages. It's supposed to be always in screen coordinates, not it client coordinates. svn path=/trunk/; revision=9379 --- reactos/subsys/win32k/ntuser/message.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/message.c b/reactos/subsys/win32k/ntuser/message.c index 07595caa06a..edc4d54a341 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.63 2004/05/10 17:07:18 weiden Exp $ +/* $Id: message.c,v 1.64 2004/05/14 16:48:04 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -489,9 +489,10 @@ IntTranslateMouseMessage(PUSER_MESSAGE_QUEUE ThreadQueue, LPMSG Msg, USHORT *Hit else if(ThreadQueue->MoveSize == NULL && ThreadQueue->MenuOwner == NULL) { - Msg->pt.x -= (WORD)Window->ClientRect.left; - Msg->pt.y -= (WORD)Window->ClientRect.top; - Msg->lParam = MAKELONG(Msg->pt.x, Msg->pt.y); + /* NOTE: Msg->pt should remain in screen coordinates. -- FiN */ + Msg->lParam = MAKELONG( + Msg->pt.x - (WORD)Window->ClientRect.left, + Msg->pt.y - (WORD)Window->ClientRect.top); } } From fb5a06a8d101c5903d3b16b5b6a2f283b5c5d072 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 14 May 2004 16:48:47 +0000 Subject: [PATCH 1111/1463] - Check for the WS_CLIPSIBLINGS flag on the correct window. svn path=/trunk/; revision=9380 --- reactos/subsys/win32k/ntuser/vis.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/vis.c b/reactos/subsys/win32k/ntuser/vis.c index 720d570469a..56d3717b8a9 100644 --- a/reactos/subsys/win32k/ntuser/vis.c +++ b/reactos/subsys/win32k/ntuser/vis.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: vis.c,v 1.28 2004/05/10 17:07:18 weiden Exp $ + * $Id: vis.c,v 1.29 2004/05/14 16:48:47 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -90,7 +90,7 @@ VIS_ComputeVisibleRegion( NtGdiCombineRgn(VisRgn, VisRgn, ClipRgn, RGN_AND); NtGdiDeleteObject(ClipRgn); - if ((CurrentWindow->Style & WS_CLIPSIBLINGS) || + if ((PreviousWindow->Style & WS_CLIPSIBLINGS) || (PreviousWindow == Window && ClipSiblings)) { IntLockRelatives(CurrentWindow); From 95a2d3b54f8cb12ebe34549465858745e237facb Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 14 May 2004 16:50:16 +0000 Subject: [PATCH 1112/1463] - Modify DPRINTs to print window styles in hexadecimal notation. svn path=/trunk/; revision=9381 --- reactos/subsys/win32k/ntuser/window.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 4e0c995fa76..f0d763e549e 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.231 2004/05/12 20:45:05 navaraf Exp $ +/* $Id: window.c,v 1.232 2004/05/14 16:50:16 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -29,10 +29,6 @@ /* INCLUDES ******************************************************************/ #include <w32k.h> -#define NDEBUG -#include <win32k/debug1.h> -#include <debug.h> - static WndProcHandle *WndProcHandlesArray = 0; static WORD WndProcHandlesArraySize = 0; #define WPH_SIZE 0x40 /* the size to add to the WndProcHandle array each time */ @@ -1556,7 +1552,7 @@ NtUserCreateWindowEx(DWORD dwExStyle, WindowObject->Class = ClassObject; WindowObject->ExStyle = dwExStyle; WindowObject->Style = dwStyle & ~WS_VISIBLE; - DPRINT("1: Style is now %d\n", WindowObject->Style); + DPRINT("1: Style is now %lx\n", WindowObject->Style); WindowObject->SystemMenu = (HMENU)0; WindowObject->ContextHelpId = 0; @@ -1622,12 +1618,12 @@ NtUserCreateWindowEx(DWORD dwExStyle, if (!(dwStyle & WS_CHILD)) { WindowObject->Style |= WS_CLIPSIBLINGS; - DPRINT("3: Style is now %d\n", WindowObject->Style); + DPRINT("3: Style is now %lx\n", WindowObject->Style); if (!(dwStyle & WS_POPUP)) { WindowObject->Style |= WS_CAPTION; WindowObject->Flags |= WINDOWOBJECT_NEED_SIZE; - DPRINT("4: Style is now %d\n", WindowObject->Style); + DPRINT("4: Style is now %lx\n", WindowObject->Style); /* FIXME: Note the window needs a size. */ } } From 1e4d1cd885fcff9e50ebb8dde11ec844a11e6fbc Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 14 May 2004 16:50:44 +0000 Subject: [PATCH 1113/1463] - Fix DPRINT. svn path=/trunk/; revision=9382 --- reactos/subsys/win32k/objects/bitmaps.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index 16e85a93420..0afe6efd6af 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.72 2004/05/10 17:07:20 weiden Exp $ */ +/* $Id: bitmaps.c,v 1.73 2004/05/14 16:50:44 navaraf Exp $ */ #include <w32k.h> #define IN_RECT(r,x,y) \ @@ -518,7 +518,7 @@ NtGdiCreateCompatibleBitmap( Dc = DC_LockDc(hDC); - DPRINT("NtGdiCreateCompatibleBitmap(%04x,%d,%d, bpp:%d) = \n", hDC, Width, Height, dc->w.bitsPerPixel); + DPRINT("NtGdiCreateCompatibleBitmap(%04x,%d,%d, bpp:%d) = \n", hDC, Width, Height, Dc->w.bitsPerPixel); if (NULL == Dc) { From 3f9294eaeefdc3cc3586b95a74cbbc2f85c0d0dc Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 14 May 2004 16:55:18 +0000 Subject: [PATCH 1114/1463] - Fix ExtSelectClipRgn and some other clipping functions. svn path=/trunk/; revision=9383 --- reactos/subsys/win32k/objects/cliprgn.c | 189 ++++++++--------------- reactos/subsys/win32k/objects/dc.c | 22 +-- reactos/subsys/win32k/objects/fillshap.c | 7 +- reactos/subsys/win32k/objects/line.c | 10 +- 4 files changed, 71 insertions(+), 157 deletions(-) diff --git a/reactos/subsys/win32k/objects/cliprgn.c b/reactos/subsys/win32k/objects/cliprgn.c index 649c9f2f3a8..bab184e0dff 100644 --- a/reactos/subsys/win32k/objects/cliprgn.c +++ b/reactos/subsys/win32k/objects/cliprgn.c @@ -16,67 +16,38 @@ * 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.37 2004/05/10 17:07:20 weiden Exp $ */ +/* $Id: cliprgn.c,v 1.38 2004/05/14 16:55:18 navaraf Exp $ */ #include <w32k.h> VOID FASTCALL CLIPPING_UpdateGCRegion(DC* Dc) { - HRGN Combined; - PROSRGNDATA CombinedRegion; + PROSRGNDATA CombinedRegion; -#ifndef TODO - if (Dc->w.hGCClipRgn == NULL) - { + ASSERT(Dc->w.hGCClipRgn != NULL); + if (Dc->w.hGCClipRgn == NULL) Dc->w.hGCClipRgn = NtGdiCreateRectRgn(0, 0, 0, 0); - } - if (Dc->w.hGCClipRgn == NULL) - return; - - if (Dc->w.hClipRgn == NULL) - { + if (Dc->w.hClipRgn == NULL) NtGdiCombineRgn(Dc->w.hGCClipRgn, Dc->w.hVisRgn, 0, RGN_COPY); - } - else - { - NtGdiCombineRgn(Dc->w.hGCClipRgn, Dc->w.hClipRgn, Dc->w.hVisRgn, - RGN_AND); - } -#endif + else + NtGdiCombineRgn(Dc->w.hGCClipRgn, Dc->w.hClipRgn, Dc->w.hVisRgn, RGN_AND); + NtGdiOffsetRgn(Dc->w.hGCClipRgn, Dc->w.DCOrgX, Dc->w.DCOrgY); - Combined = NtGdiCreateRectRgn(0, 0, 0, 0); - if(!Combined) - { - return; - } + CombinedRegion = RGNDATA_LockRgn(Dc->w.hGCClipRgn); + ASSERT(CombinedRegion != NULL); - if (Dc->w.hClipRgn == NULL) - { - NtGdiCombineRgn(Combined, Dc->w.hVisRgn, 0, RGN_COPY); - } - else - { - NtGdiCombineRgn(Combined, Dc->w.hClipRgn, Dc->w.hVisRgn, - RGN_AND); - } - NtGdiOffsetRgn(Combined, Dc->w.DCOrgX, Dc->w.DCOrgY); - - CombinedRegion = RGNDATA_LockRgn(Combined); - ASSERT(NULL != CombinedRegion); - - if (NULL != Dc->CombinedClip) - { + if (Dc->CombinedClip != NULL) IntEngDeleteClipRegion(Dc->CombinedClip); - } - Dc->CombinedClip = IntEngCreateClipRegion(CombinedRegion->rdh.nCount, - (PRECTL)CombinedRegion->Buffer, - (PRECTL)&CombinedRegion->rdh.rcBound); - ASSERT(NULL != Dc->CombinedClip); + Dc->CombinedClip = IntEngCreateClipRegion( + CombinedRegion->rdh.nCount, + (PRECTL)CombinedRegion->Buffer, + (PRECTL)&CombinedRegion->rdh.rcBound); + ASSERT(Dc->CombinedClip != NULL); - RGNDATA_UnlockRgn(Combined); - NtGdiDeleteObject(Combined); + RGNDATA_UnlockRgn(Dc->w.hGCClipRgn); + NtGdiOffsetRgn(Dc->w.hGCClipRgn, -Dc->w.DCOrgX, -Dc->w.DCOrgY); } HRGN WINAPI SaveVisRgn(HDC hdc) @@ -148,14 +119,17 @@ int STDCALL NtGdiExtSelectClipRgn(HDC hDC, return ERROR; } - dc->w.flags &= ~DC_DIRTY; +// dc->w.flags &= ~DC_DIRTY; if (!hrgn) { if (fnMode == RGN_COPY) { - NtGdiDeleteObject(dc->w.hGCClipRgn); - dc->w.hGCClipRgn = NULL; + if (dc->w.hClipRgn != NULL) + { + NtGdiDeleteObject(dc->w.hClipRgn); + dc->w.hClipRgn = NULL; + } } else { @@ -166,7 +140,7 @@ int STDCALL NtGdiExtSelectClipRgn(HDC hDC, } else { - if (!dc->w.hGCClipRgn) + if (!dc->w.hClipRgn) { PROSRGNDATA Rgn; RECT rect; @@ -174,55 +148,52 @@ int STDCALL NtGdiExtSelectClipRgn(HDC hDC, { UnsafeIntGetRgnBox(Rgn, &rect); RGNDATA_UnlockRgn(dc->w.hVisRgn); - dc->w.hGCClipRgn = UnsafeIntCreateRectRgnIndirect(&rect); + dc->w.hClipRgn = UnsafeIntCreateRectRgnIndirect(&rect); } else { - dc->w.hGCClipRgn = NtGdiCreateRectRgn(0, 0, 0, 0); + dc->w.hClipRgn = NtGdiCreateRectRgn(0, 0, 0, 0); } } if(fnMode == RGN_COPY) - NtGdiCombineRgn(dc->w.hGCClipRgn, hrgn, 0, fnMode); + { + NtGdiCombineRgn(dc->w.hClipRgn, hrgn, 0, fnMode); + } else - NtGdiCombineRgn(dc->w.hGCClipRgn, dc->w.hGCClipRgn, hrgn, fnMode); + NtGdiCombineRgn(dc->w.hClipRgn, dc->w.hClipRgn, hrgn, fnMode); } - if (dc->w.hVisRgn == NULL) - { - dc->w.hVisRgn = NtGdiCreateRectRgn(0, 0, 0, 0); - GDIOBJ_CopyOwnership(hDC, dc->w.hVisRgn); - } - CLIPPING_UpdateGCRegion(dc); DC_UnlockDc( hDC ); return retval; } -int FASTCALL -IntGdiGetClipBox(HDC hDC, - LPRECT rc) +INT FASTCALL +IntGdiGetClipBox(HDC hDC, LPRECT rc) { - PROSRGNDATA Rgn; - int retval; - PDC dc; + PROSRGNDATA Rgn; + INT retval; + PDC dc; - if (!(dc = DC_LockDc(hDC))) - { - SetLastWin32Error(ERROR_INVALID_HANDLE); - return ERROR; - } - if(!(Rgn = RGNDATA_LockRgn(dc->w.hGCClipRgn))) - { - DC_UnlockDc( hDC ); - SetLastWin32Error(ERROR_INVALID_HANDLE); - return ERROR; - } - retval = UnsafeIntGetRgnBox(Rgn, rc); - RGNDATA_UnlockRgn(dc->w.hGCClipRgn); - IntDPtoLP(dc, (LPPOINT)rc, 2); - DC_UnlockDc( hDC ); - return(retval); + if (!(dc = DC_LockDc(hDC))) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return ERROR; + } + + if (!(Rgn = RGNDATA_LockRgn(dc->w.hGCClipRgn))) + { + DC_UnlockDc( hDC ); + SetLastWin32Error(ERROR_INVALID_HANDLE); + return ERROR; + } + retval = UnsafeIntGetRgnBox(Rgn, rc); + RGNDATA_UnlockRgn(dc->w.hGCClipRgn); + IntDPtoLP(dc, (LPPOINT)rc, 2); + DC_UnlockDc(hDC); + + return retval; } int STDCALL NtGdiGetClipBox(HDC hDC, @@ -309,6 +280,9 @@ int STDCALL NtGdiIntersectClipRect(HDC hDC, HRGN NewRgn; PDC dc = DC_LockDc(hDC); + DPRINT("NtGdiIntersectClipRect(%x, %d,%d-%d,%d)\n", + hDC, LeftRect, TopRect, RightRect, BottomRect); + if (!dc) { SetLastWin32Error(ERROR_INVALID_HANDLE); @@ -365,7 +339,7 @@ BOOL STDCALL NtGdiPtVisible(HDC hDC, return FALSE; } - rgn = dc->w.hClipRgn; + rgn = dc->w.hGCClipRgn; DC_UnlockDc(hDC); return (rgn ? NtGdiPtInRegion(rgn, X, Y) : FALSE); @@ -413,50 +387,10 @@ BOOL STDCALL NtGdiSelectClipPath(HDC hDC, UNIMPLEMENTED; } -int STDCALL NtGdiSelectClipRgn(HDC hDC, - HRGN hRgn) +INT STDCALL +NtGdiSelectClipRgn(HDC hDC, HRGN hRgn) { - int Type; - PDC dc; - HRGN Copy; - - dc = DC_LockDc(hDC); - if (NULL == dc) - { - SetLastWin32Error(ERROR_INVALID_HANDLE); - return ERROR; - } - - if (NULL != hRgn) - { - Copy = NtGdiCreateRectRgn(0, 0, 0, 0); - if (NULL == Copy) - { - DC_UnlockDc(hDC); - return ERROR; - } - Type = NtGdiCombineRgn(Copy, hRgn, 0, RGN_COPY); - if (ERROR == Type) - { - NtGdiDeleteObject(Copy); - DC_UnlockDc(hDC); - return ERROR; - } - } - else - { - Copy = NULL; - } - - if (NULL != dc->w.hClipRgn) - { - NtGdiDeleteObject(dc->w.hClipRgn); - } - dc->w.hClipRgn = Copy; - CLIPPING_UpdateGCRegion(dc); - DC_UnlockDc(hDC); - - return ERROR; + return NtGdiExtSelectClipRgn(hDC, hRgn, RGN_COPY); } int STDCALL NtGdiSetMetaRgn(HDC hDC) @@ -464,5 +398,4 @@ int STDCALL NtGdiSetMetaRgn(HDC hDC) UNIMPLEMENTED; } - /* EOF */ diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index d715b43594d..360f3f6d63f 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.134 2004/05/10 17:07:20 weiden Exp $ +/* $Id: dc.c,v 1.135 2004/05/14 16:55:18 navaraf Exp $ * * DC.C - Device context functions * @@ -1120,18 +1120,12 @@ NtGdiGetDCState(HDC hDC) /* Get/SetDCState() don't change hVisRgn field ("Undoc. Windows" p.559). */ -#if 0 newdc->w.hGCClipRgn = newdc->w.hVisRgn = 0; -#endif if (dc->w.hClipRgn) { newdc->w.hClipRgn = NtGdiCreateRectRgn( 0, 0, 0, 0 ); NtGdiCombineRgn( newdc->w.hClipRgn, dc->w.hClipRgn, 0, RGN_COPY ); } - else - { - newdc->w.hClipRgn = 0; - } DC_UnlockDc( hnewdc ); DC_UnlockDc( hDC ); return hnewdc; @@ -1634,25 +1628,23 @@ NtGdiResetDC(HDC hDC, CONST DEVMODEW *InitData) BOOL STDCALL NtGdiRestoreDC(HDC hDC, INT SaveLevel) { - PDC dc, dcs; - BOOL success; + PDC dc, dcs; + BOOL success; + + DPRINT("NtGdiRestoreDC(%lx, %d)\n", hDC, SaveLevel); dc = DC_LockDc(hDC); - if(!dc) + if (!dc) { SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } if (SaveLevel == -1) - { SaveLevel = dc->saveLevel; - } if ((SaveLevel < 1) || (SaveLevel > dc->saveLevel)) - { return FALSE; - } success = TRUE; while (dc->saveLevel >= SaveLevel) @@ -1701,6 +1693,8 @@ NtGdiSaveDC(HDC hDC) PDC dc, dcs; INT ret; + DPRINT("NtGdiSaveDC(%lx)\n", hDC); + if (!(hdcs = NtGdiGetDCState(hDC))) { return 0; diff --git a/reactos/subsys/win32k/objects/fillshap.c b/reactos/subsys/win32k/objects/fillshap.c index c515088721c..9185a3e479d 100644 --- a/reactos/subsys/win32k/objects/fillshap.c +++ b/reactos/subsys/win32k/objects/fillshap.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: fillshap.c,v 1.48 2004/05/10 17:07:20 weiden Exp $ */ +/* $Id: fillshap.c,v 1.49 2004/05/14 16:55:18 navaraf Exp $ */ #include <w32k.h> /* @@ -46,7 +46,6 @@ IntGdiPolygon(PDC dc, SURFOBJ *SurfObj; PGDIBRUSHOBJ PenBrushObj, FillBrushObj; BOOL ret = FALSE; // default to failure - PRECTL RectBounds; RECTL DestRect; int CurrentPoint; @@ -68,9 +67,6 @@ IntGdiPolygon(PDC dc, UnsafePoints[CurrentPoint].y += dc->w.DCOrgY; } - RectBounds = (PRECTL) RGNDATA_LockRgn(dc->w.hGCClipRgn); - //ei not yet implemented ASSERT(RectBounds); - if (PATH_IsPathOpen(dc->w.path)) ret = PATH_Polygon(dc, UnsafePoints, Count ); else @@ -140,7 +136,6 @@ IntGdiPolygon(PDC dc, } PENOBJ_UnlockPen( dc->w.hPen ); - RGNDATA_UnlockRgn(dc->w.hGCClipRgn); return ret; } diff --git a/reactos/subsys/win32k/objects/line.c b/reactos/subsys/win32k/objects/line.c index 16a2140ae53..cbd8598a69f 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.30 2004/05/10 17:07:20 weiden Exp $ */ +/* $Id: line.c,v 1.31 2004/05/14 16:55:18 navaraf Exp $ */ #include <w32k.h> // Some code from the WINE project source (www.winehq.com) @@ -196,7 +196,6 @@ IntGdiPolyline(DC *dc, SURFOBJ *SurfObj = NULL; BOOL ret = FALSE; // default to failure LONG i; - PROSRGNDATA reg; PGDIBRUSHOBJ PenBrushObj; POINT *pts; @@ -206,10 +205,6 @@ IntGdiPolyline(DC *dc, if ( PATH_IsPathOpen ( dc->w.path ) ) return PATH_Polyline ( dc, pt, Count ); - reg = RGNDATA_LockRgn(dc->w.hGCClipRgn); - - //FIXME: Do somthing with reg... - //Allocate "Count" bytes of memory to hold a safe copy of pt pts = (POINT*)ExAllocatePoolWithTag ( NonPagedPool, sizeof(POINT)*Count, TAG_SHAPE ); if ( pts ) @@ -245,9 +240,6 @@ IntGdiPolyline(DC *dc, ExFreePool ( pts ); } - //Clean up - RGNDATA_UnlockRgn(dc->w.hGCClipRgn); - return ret; } From 394e0f648e2c907848c7da321304e966f2080c58 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 14 May 2004 16:56:48 +0000 Subject: [PATCH 1115/1463] - NtGdiCreateRectRgn should accept negative width and height. It's supposed to be handled just like in NtGdiSetRectRgn. svn path=/trunk/; revision=9384 --- reactos/subsys/win32k/objects/region.c | 52 +++++++------------------- 1 file changed, 13 insertions(+), 39 deletions(-) diff --git a/reactos/subsys/win32k/objects/region.c b/reactos/subsys/win32k/objects/region.c index cc5985609e0..1a4e0703d22 100644 --- a/reactos/subsys/win32k/objects/region.c +++ b/reactos/subsys/win32k/objects/region.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: region.c,v 1.51 2004/05/10 17:07:20 weiden Exp $ */ +/* $Id: region.c,v 1.52 2004/05/14 16:56:48 navaraf Exp $ */ #include <w32k.h> #include <win32k/float.h> @@ -1711,47 +1711,21 @@ NtGdiCreatePolyPolygonRgn(CONST PPOINT pt, UNIMPLEMENTED; } -HRGN -STDCALL -NtGdiCreateRectRgn(INT LeftRect, - INT TopRect, - INT RightRect, - INT BottomRect) +HRGN STDCALL +NtGdiCreateRectRgn(INT LeftRect, INT TopRect, INT RightRect, INT BottomRect) { - HRGN hRgn; - PROSRGNDATA pRgnData; - PRECT pRect; + HRGN hRgn; - if (RightRect < LeftRect || BottomRect < TopRect) - { - DPRINT1("Invalid parameters (%d, %d) - (%d, %d)\n", LeftRect, TopRect, RightRect, BottomRect); - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return NULL; - } + /* Allocate region data structure with space for 1 RECT */ + if ((hRgn = RGNDATA_AllocRgn(1))) + { + if (NtGdiSetRectRgn(hRgn, LeftRect, TopRect, RightRect, BottomRect)) + return hRgn; + NtGdiDeleteObject(hRgn); + } - /* Allocate region data structure with space for 1 RECT */ - if ((hRgn = RGNDATA_AllocRgn(1))) - { - if ((pRgnData = RGNDATA_LockRgn(hRgn))) - { - pRect = (PRECT)pRgnData->Buffer; - ASSERT(pRect); - - /* Fill in the region data header */ - pRgnData->rdh.iType = (LeftRect == RightRect || TopRect == BottomRect) ? NULLREGION : SIMPLEREGION; - NtGdiSetRect(&(pRgnData->rdh.rcBound), LeftRect, TopRect, RightRect, BottomRect); - - /* use NtGdiCopyRect when implemented */ - NtGdiSetRect(pRect, LeftRect, TopRect, RightRect, BottomRect); - RGNDATA_UnlockRgn(hRgn); - - return hRgn; - } - NtGdiDeleteObject( hRgn ); - } - - DPRINT1("NtGdiCreateRectRgn: can't allocate region\n"); - return NULL; + SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); + return NULL; } HRGN STDCALL From 3221290df2838602857e97320d57acec7d3027b9 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 14 May 2004 17:02:40 +0000 Subject: [PATCH 1116/1463] - Minor corrections to EqualRect and SubtractRect. svn path=/trunk/; revision=9385 --- reactos/lib/user32/windows/rect.c | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/reactos/lib/user32/windows/rect.c b/reactos/lib/user32/windows/rect.c index e216b709a81..1093582a884 100644 --- a/reactos/lib/user32/windows/rect.c +++ b/reactos/lib/user32/windows/rect.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: rect.c,v 1.14 2004/01/23 23:38:26 ekohl Exp $ +/* $Id: rect.c,v 1.15 2004/05/14 17:02:40 navaraf Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/input.c @@ -51,22 +51,16 @@ CopyRect(LPRECT lprcDst, CONST RECT *lprcSrc) /* * @implemented */ -BOOL -STDCALL +BOOL STDCALL EqualRect( - CONST RECT *lprc1, - CONST RECT *lprc2) + CONST RECT *lprc1, + CONST RECT *lprc2) { - if ((lprc1->left == lprc2->left) - && (lprc1->top == lprc2->top) - && (lprc1->right == lprc2->right) - && (lprc1->bottom == lprc2->bottom)) - { - return TRUE; - } - /* TODO: return the correct error code. */ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; + if (lprc1 == NULL || lprc2 == NULL) + return FALSE; + + return (lprc1->left == lprc2->left) && (lprc1->top == lprc2->top) && + (lprc1->right == lprc2->right) && (lprc1->bottom == lprc2->bottom); } @@ -182,8 +176,13 @@ SubtractRect(LPRECT lprcDst, CONST RECT *lprcSrc1, CONST RECT *lprcSrc2) CopyRect(lprcDst, lprcSrc1); if(!IntersectRect(&tempRect, lprcSrc1, lprcSrc2)) - return(FALSE); + return(TRUE); + if (EqualRect(&tempRect, lprcDst)) + { + SetRectEmpty(lprcDst); + return FALSE; + } if(lprcDst->top == tempRect.top && lprcDst->bottom == tempRect.bottom) { if(lprcDst->left == tempRect.left) From 759afa4f194063c515efc1dc070724b699df5913 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 14 May 2004 21:25:08 +0000 Subject: [PATCH 1117/1463] - Define KEBUGCHECK macro to make compiling KJS working again. svn path=/trunk/; revision=9386 --- reactos/include/ddk/kefuncs.h | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/include/ddk/kefuncs.h b/reactos/include/ddk/kefuncs.h index 9171e14bd56..f6f7014cb03 100644 --- a/reactos/include/ddk/kefuncs.h +++ b/reactos/include/ddk/kefuncs.h @@ -1,6 +1,7 @@ #ifndef __INCLUDE_DDK_KEFUNCS_H #define __INCLUDE_DDK_KEFUNCS_H +#define KEBUGCHECK(a) DbgPrint("KeBugCheck at %s:%i\n",__FILE__,__LINE__), KeBugCheck(a) /* KERNEL FUNCTIONS ********************************************************/ From 0c9315b3dc58fa9d4ae71f6756a47f915ffa96ca Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 14 May 2004 22:20:46 +0000 Subject: [PATCH 1118/1463] - Fixed implementation of NtGdiGetNearestColor. svn path=/trunk/; revision=9387 --- reactos/subsys/win32k/objects/color.c | 62 +++++++++++++++++++-------- 1 file changed, 44 insertions(+), 18 deletions(-) diff --git a/reactos/subsys/win32k/objects/color.c b/reactos/subsys/win32k/objects/color.c index 333de9fbce3..f084a04c45d 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.39 2004/05/10 17:07:20 weiden Exp $ */ +/* $Id: color.c,v 1.40 2004/05/14 22:20:46 navaraf Exp $ */ #include <w32k.h> // FIXME: Use PXLATEOBJ logicalToSystem instead of int *mapping @@ -138,31 +138,57 @@ BOOL STDCALL NtGdiGetColorAdjustment(HDC hDC, UNIMPLEMENTED; } -COLORREF STDCALL NtGdiGetNearestColor(HDC hDC, - COLORREF Color) +unsigned short GetNumberOfBits(unsigned int dwMask) { - COLORREF nearest = CLR_INVALID; - PDC dc; - PPALGDI palGDI; + unsigned short wBits; + for (wBits = 0; dwMask; dwMask = dwMask & (dwMask - 1)) + wBits++; + return wBits; +} - dc = DC_LockDc(hDC); - if (NULL != dc) - { +COLORREF STDCALL NtGdiGetNearestColor(HDC hDC, COLORREF Color) +{ + COLORREF nearest = CLR_INVALID; + PDC dc; + PPALGDI palGDI; + LONG RBits, GBits, BBits; + + dc = DC_LockDc(hDC); + if (NULL != dc) + { HPALETTE hpal = dc->w.hPalette; palGDI = (PPALGDI) PALETTE_LockPalette(hpal); if (!palGDI) - { - DC_UnlockDc(hDC); - return nearest; - } + { + DC_UnlockDc(hDC); + return nearest; + } - nearest = COLOR_LookupNearestColor(palGDI->IndexedColors, - palGDI->NumColors, Color); + switch (palGDI->Mode) + { + case PAL_INDEXED: + nearest = COLOR_LookupNearestColor(palGDI->IndexedColors, + palGDI->NumColors, Color); + break; + case PAL_BGR: + case PAL_RGB: + nearest = Color; + break; + case PAL_BITFIELDS: + RBits = 8 - GetNumberOfBits(palGDI->RedMask); + GBits = 8 - GetNumberOfBits(palGDI->GreenMask); + BBits = 8 - GetNumberOfBits(palGDI->BlueMask); + nearest = RGB( + (GetRValue(Color) >> RBits) << RBits, + (GetGValue(Color) >> GBits) << GBits, + (GetBValue(Color) >> BBits) << BBits); + break; + } PALETTE_UnlockPalette(hpal); - DC_UnlockDc( hDC ); - } + DC_UnlockDc(hDC); + } - return nearest; + return nearest; } UINT STDCALL NtGdiGetNearestPaletteIndex(HPALETTE hpal, From 4b8fc8e4e49bd89e6248ef763a727a874334011d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Fri, 14 May 2004 22:56:18 +0000 Subject: [PATCH 1119/1463] Implement complex clipping for StretchBlt svn path=/trunk/; revision=9388 --- reactos/subsys/win32k/dib/dib.h | 18 ++- reactos/subsys/win32k/dib/dib16bpp.c | 146 ++++++++++++++----- reactos/subsys/win32k/dib/dib1bpp.c | 5 +- reactos/subsys/win32k/dib/dib24bpp.c | 5 +- reactos/subsys/win32k/dib/dib32bpp.c | 141 ++++++++++++++----- reactos/subsys/win32k/dib/dib4bpp.c | 5 +- reactos/subsys/win32k/dib/dib8bpp.c | 144 ++++++++++++++----- reactos/subsys/win32k/eng/bitblt.c | 200 +++++---------------------- reactos/subsys/win32k/eng/clip.c | 121 +++++++++++++++- reactos/subsys/win32k/eng/clip.h | 9 ++ reactos/subsys/win32k/eng/surface.c | 5 +- reactos/subsys/win32k/include/tags.h | 1 + 12 files changed, 516 insertions(+), 284 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib.h b/reactos/subsys/win32k/dib/dib.h index dad5d27f9c6..24a07cdb767 100644 --- a/reactos/subsys/win32k/dib/dib.h +++ b/reactos/subsys/win32k/dib/dib.h @@ -21,7 +21,8 @@ BOOLEAN DIB_1BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Mode); + CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, + ULONG Mode); BOOLEAN DIB_1BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PSURFGDI DestGDI, PSURFGDI SourceGDI, RECTL* DestRect, POINTL *SourcePoint, @@ -40,7 +41,8 @@ BOOLEAN DIB_4BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Mode); + CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, + ULONG Mode); BOOLEAN DIB_4BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PSURFGDI DestGDI, PSURFGDI SourceGDI, RECTL* DestRect, POINTL *SourcePoint, @@ -59,7 +61,8 @@ BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Mode); + CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, + ULONG Mode); BOOLEAN DIB_8BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PSURFGDI DestGDI, PSURFGDI SourceGDI, RECTL* DestRect, POINTL *SourcePoint, @@ -78,7 +81,8 @@ BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Mode); + CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, + ULONG Mode); BOOLEAN DIB_16BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PSURFGDI DestGDI, PSURFGDI SourceGDI, RECTL* DestRect, POINTL *SourcePoint, @@ -97,7 +101,8 @@ BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Mode); + CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, + ULONG Mode); BOOLEAN DIB_24BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PSURFGDI DestGDI, PSURFGDI SourceGDI, RECTL* DestRect, POINTL *SourcePoint, @@ -116,7 +121,8 @@ BOOLEAN DIB_32BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Mode); + CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, + ULONG Mode); BOOLEAN DIB_32BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PSURFGDI DestGDI, PSURFGDI SourceGDI, RECTL* DestRect, POINTL *SourcePoint, diff --git a/reactos/subsys/win32k/dib/dib16bpp.c b/reactos/subsys/win32k/dib/dib16bpp.c index abeafbd808d..21ff5cd0b42 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.31 2004/05/10 17:07:17 weiden Exp $ */ +/* $Id: dib16bpp.c,v 1.32 2004/05/14 22:56:17 gvg Exp $ */ #include <w32k.h> VOID @@ -256,7 +256,7 @@ DIB_16BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, break; default: - DbgPrint("DIB_16BPP_Bitblt: Unhandled Source BPP: %u\n", SourceGDI->BitsPerPixel); + DPRINT1("DIB_16BPP_Bitblt: Unhandled Source BPP: %u\n", SourceGDI->BitsPerPixel); return FALSE; } @@ -468,26 +468,84 @@ void ScaleLineAvg16(PIXEL *Target, PIXEL *Source, int SrcWidth, int TgtWidth) *Target++ = *Source; } -//NOTE: If you change something here, please do the same in other dibXXbpp.c files! -void ScaleRectAvg16(PIXEL *Target, PIXEL *Source, int SrcWidth, int SrcHeight, - int TgtWidth, int TgtHeight, int srcPitch, int dstPitch) +static BOOLEAN +FinalCopy16(PIXEL *Target, PIXEL *Source, PSPAN ClipSpans, UINT ClipSpansCount, UINT *SpanIndex, + UINT DestY, RECTL *DestRect) { - int NumPixels = TgtHeight; - int IntPart = ((SrcHeight / TgtHeight) * srcPitch) >> 1; //(SrcHeight / TgtHeight) * SrcWidth; - int FractPart = SrcHeight % TgtHeight; - int Mid = TgtHeight >> 1; + LONG Left, Right; + + while (ClipSpans[*SpanIndex].Y < DestY + || (ClipSpans[*SpanIndex].Y == DestY + && ClipSpans[*SpanIndex].X + ClipSpans[*SpanIndex].Width < DestRect->left)) + { + (*SpanIndex)++; + if (ClipSpansCount <= *SpanIndex) + { + /* No more spans, everything else is clipped away, we're done */ + return FALSE; + } + } + while (ClipSpans[*SpanIndex].Y == DestY) + { + if (ClipSpans[*SpanIndex].X < DestRect->right) + { + Left = max(ClipSpans[*SpanIndex].X, DestRect->left); + Right = min(ClipSpans[*SpanIndex].X + ClipSpans[*SpanIndex].Width, DestRect->right); + memcpy(Target + Left - DestRect->left, Source + Left - DestRect->left, + (Right - Left) * sizeof(PIXEL)); + } + (*SpanIndex)++; + if (ClipSpansCount <= *SpanIndex) + { + /* No more spans, everything else is clipped away, we're done */ + return FALSE; + } + } + + return TRUE; +} + +//NOTE: If you change something here, please do the same in other dibXXbpp.c files! +BOOLEAN ScaleRectAvg16(SURFGDI *DestGDI, SURFGDI *SourceGDI, + 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 FractPart = (SourceRect->bottom - SourceRect->top) % (DestRect->bottom - DestRect->top); + int Mid = (DestRect->bottom - DestRect->top) >> 1; int E = 0; int skip; 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); + PSPAN ClipSpans; + UINT ClipSpansCount; + UINT SpanIndex; + LONG DestY; - skip = (TgtHeight < SrcHeight) ? 0 : (TgtHeight / (2*SrcHeight) + 1); + if (! ClipobjToSpans(&ClipSpans, &ClipSpansCount, ClipRegion, DestRect)) + { + return FALSE; + } + if (0 == ClipSpansCount) + { + /* No clip spans == empty clipping region, everything clipped away */ + ASSERT(NULL == ClipSpans); + return TRUE; + } + skip = (DestRect->bottom - DestRect->top < SourceRect->bottom - SourceRect->top) ? 0 : ((DestRect->bottom - DestRect->top) / (2 * (SourceRect->bottom - SourceRect->top)) + 1); NumPixels -= skip; - ScanLine = (PIXEL*)ExAllocatePool(NonPagedPool, TgtWidth*sizeof(PIXEL)); // FIXME: Should we use PagedPool here? - ScanLineAhead = (PIXEL *)ExAllocatePool(NonPagedPool, TgtWidth*sizeof(PIXEL)); + ScanLine = (PIXEL*)ExAllocatePool(PagedPool, (DestRect->right - DestRect->left) * sizeof(PIXEL)); + ScanLineAhead = (PIXEL *)ExAllocatePool(PagedPool, (DestRect->right - DestRect->left) * sizeof(PIXEL)); + DestY = DestRect->top; + SpanIndex = 0; while (NumPixels-- > 0) { if (Source != PrevSource) { if (Source == PrevSourceAhead) { @@ -499,38 +557,57 @@ void ScaleRectAvg16(PIXEL *Target, PIXEL *Source, int SrcWidth, int SrcHeight, ScanLine = ScanLineAhead; ScanLineAhead = tmp; } else { - ScaleLineAvg16(ScanLine, Source, SrcWidth, TgtWidth); + ScaleLineAvg16(ScanLine, Source, SourceRect->right - SourceRect->left, DestRect->right - DestRect->left); } /* if */ PrevSource = Source; } /* if */ - if (E >= Mid && PrevSourceAhead != (PIXEL *)((BYTE *)Source + srcPitch)) { + if (E >= Mid && PrevSourceAhead != (PIXEL *)((BYTE *)Source + SourceGDI->SurfObj.lDelta)) { int x; - ScaleLineAvg16(ScanLineAhead, (PIXEL *)((BYTE *)Source + srcPitch), SrcWidth, TgtWidth); - for (x = 0; x < TgtWidth; x++) + ScaleLineAvg16(ScanLineAhead, (PIXEL *)((BYTE *)Source + SourceGDI->SurfObj.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 + srcPitch); + PrevSourceAhead = (PIXEL *)((BYTE *)Source + SourceGDI->SurfObj.lDelta); } /* if */ - - memcpy(Target, ScanLine, TgtWidth*sizeof(PIXEL)); - Target = (PIXEL *)((BYTE *)Target + dstPitch); + + if (! FinalCopy16(Target, ScanLine, ClipSpans, ClipSpansCount, &SpanIndex, DestY, DestRect)) + { + /* No more spans, everything else is clipped away, we're done */ + ExFreePool(ClipSpans); + ExFreePool(ScanLine); + ExFreePool(ScanLineAhead); + return TRUE; + } + DestY++; + Target = (PIXEL *)((BYTE *)Target + DestGDI->SurfObj.lDelta); Source += IntPart; E += FractPart; - if (E >= TgtHeight) { - E -= TgtHeight; - Source = (PIXEL *)((BYTE *)Source + srcPitch); + if (E >= DestRect->bottom - DestRect->top) { + E -= DestRect->bottom - DestRect->top; + Source = (PIXEL *)((BYTE *)Source + SourceGDI->SurfObj.lDelta); } /* if */ } /* while */ if (skip > 0 && Source != PrevSource) - ScaleLineAvg16(ScanLine, Source, SrcWidth, TgtWidth); + ScaleLineAvg16(ScanLine, Source, SourceRect->right - SourceRect->left, DestRect->right - DestRect->left); while (skip-- > 0) { - memcpy(Target, ScanLine, TgtWidth*sizeof(PIXEL)); - Target = (PIXEL *)((BYTE *)Target + dstPitch); + if (! FinalCopy16(Target, ScanLine, ClipSpans, ClipSpansCount, &SpanIndex, DestY, DestRect)) + { + /* No more spans, everything else is clipped away, we're done */ + ExFreePool(ClipSpans); + ExFreePool(ScanLine); + ExFreePool(ScanLineAhead); + return TRUE; + } + DestY++; + Target = (PIXEL *)((BYTE *)Target + DestGDI->SurfObj.lDelta); } /* while */ + ExFreePool(ClipSpans); ExFreePool(ScanLine); ExFreePool(ScanLineAhead); + + return TRUE; } //NOTE: If you change something here, please do the same in other dibXXbpp.c files! @@ -538,11 +615,10 @@ BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Mode) + CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, + ULONG Mode) { - BYTE *SourceLine, *DestLine; - - DbgPrint("DIB_16BPP_StretchBlt: Source BPP: %u, srcRect: (%d,%d)-(%d,%d), dstRect: (%d,%d)-(%d,%d)\n", + 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, DestRect->left, DestRect->top, DestRect->right, DestRect->bottom); @@ -561,12 +637,8 @@ BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, break; case 16: - SourceLine = SourceSurf->pvScan0 + (SourceRect->top * SourceSurf->lDelta) + 2 * SourceRect->left; - DestLine = DestSurf->pvScan0 + (DestRect->top * DestSurf->lDelta) + 2 * DestRect->left; - - ScaleRectAvg16((PIXEL *)DestLine, (PIXEL *)SourceLine, - SourceRect->right-SourceRect->left, SourceRect->bottom-SourceRect->top, - DestRect->right-DestRect->left, DestRect->bottom-DestRect->top, SourceSurf->lDelta, DestSurf->lDelta); + return ScaleRectAvg16(DestGDI, SourceGDI, DestRect, SourceRect, MaskOrigin, BrushOrigin, + ClipRegion, ColorTranslation, Mode); break; case 24: @@ -578,7 +650,7 @@ BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, break; default: - DbgPrint("DIB_16BPP_StretchBlt: Unhandled Source BPP: %u\n", SourceGDI->BitsPerPixel); + DPRINT1("DIB_16BPP_StretchBlt: Unhandled Source BPP: %u\n", SourceGDI->BitsPerPixel); return FALSE; } diff --git a/reactos/subsys/win32k/dib/dib1bpp.c b/reactos/subsys/win32k/dib/dib1bpp.c index 795f2241df0..996d31b245b 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.27 2004/05/10 17:07:17 weiden Exp $ */ +/* $Id: dib1bpp.c,v 1.28 2004/05/14 22:56:17 gvg Exp $ */ #include <w32k.h> VOID @@ -515,7 +515,8 @@ DIB_1BPP_StretchBlt ( SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Mode) + CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, + ULONG Mode) { DbgPrint("DIB_1BPP_StretchBlt: Source BPP: %u\n", SourceGDI->BitsPerPixel); return FALSE; diff --git a/reactos/subsys/win32k/dib/dib24bpp.c b/reactos/subsys/win32k/dib/dib24bpp.c index 2e0cdb31754..22336937cfe 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.26 2004/05/10 17:07:17 weiden Exp $ */ +/* $Id: dib24bpp.c,v 1.27 2004/05/14 22:56:17 gvg Exp $ */ #include <w32k.h> VOID @@ -345,7 +345,8 @@ BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Mode) + CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, + ULONG Mode) { DbgPrint("DIB_24BPP_StretchBlt: Source BPP: %u\n", SourceGDI->BitsPerPixel); return FALSE; diff --git a/reactos/subsys/win32k/dib/dib32bpp.c b/reactos/subsys/win32k/dib/dib32bpp.c index 577d3dc30b4..f33c9d5cead 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.26 2004/05/10 17:07:17 weiden Exp $ */ +/* $Id: dib32bpp.c,v 1.27 2004/05/14 22:56:17 gvg Exp $ */ #include <w32k.h> VOID @@ -278,7 +278,7 @@ DIB_32BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, break; default: - DbgPrint("DIB_32BPP_Bitblt: Unhandled Source BPP: %u\n", SourceGDI->BitsPerPixel); + DPRINT1("DIB_32BPP_Bitblt: Unhandled Source BPP: %u\n", SourceGDI->BitsPerPixel); return FALSE; } @@ -437,27 +437,85 @@ void ScaleLineAvg32(PIXEL *Target, PIXEL *Source, int SrcWidth, int TgtWidth) while (skip-- > 0) *Target++ = *Source; } + +static BOOLEAN +FinalCopy32(PIXEL *Target, PIXEL *Source, PSPAN ClipSpans, UINT ClipSpansCount, UINT *SpanIndex, + UINT DestY, RECTL *DestRect) +{ + LONG Left, Right; + + while (ClipSpans[*SpanIndex].Y < DestY + || (ClipSpans[*SpanIndex].Y == DestY + && ClipSpans[*SpanIndex].X + ClipSpans[*SpanIndex].Width < DestRect->left)) + { + (*SpanIndex)++; + if (ClipSpansCount <= *SpanIndex) + { + /* No more spans, everything else is clipped away, we're done */ + return FALSE; + } + } + while (ClipSpans[*SpanIndex].Y == DestY) + { + if (ClipSpans[*SpanIndex].X < DestRect->right) + { + Left = max(ClipSpans[*SpanIndex].X, DestRect->left); + Right = min(ClipSpans[*SpanIndex].X + ClipSpans[*SpanIndex].Width, DestRect->right); + memcpy(Target + Left - DestRect->left, Source + Left - DestRect->left, + (Right - Left) * sizeof(PIXEL)); + } + (*SpanIndex)++; + if (ClipSpansCount <= *SpanIndex) + { + /* No more spans, everything else is clipped away, we're done */ + return FALSE; + } + } + + return TRUE; +} //NOTE: If you change something here, please do the same in other dibXXbpp.c files! -void ScaleRectAvg32(PIXEL *Target, PIXEL *Source, int SrcWidth, int SrcHeight, - int TgtWidth, int TgtHeight, int srcPitch, int dstPitch) +BOOLEAN ScaleRectAvg32(SURFGDI *DestGDI, SURFGDI *SourceGDI, + RECTL* DestRect, RECTL *SourceRect, + POINTL* MaskOrigin, POINTL BrushOrigin, + CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, + ULONG Mode) { - int NumPixels = TgtHeight; - int IntPart = ((SrcHeight / TgtHeight) * srcPitch) / 4; //(SrcHeight / TgtHeight) * SrcWidth; - int FractPart = SrcHeight % TgtHeight; - int Mid = TgtHeight >> 1; + 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 FractPart = (SourceRect->bottom - SourceRect->top) % (DestRect->bottom - DestRect->top); + int Mid = (DestRect->bottom - DestRect->top) >> 1; int E = 0; int skip; 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); + PSPAN ClipSpans; + UINT ClipSpansCount; + UINT SpanIndex; + LONG DestY; - skip = (TgtHeight < SrcHeight) ? 0 : (TgtHeight / (2*SrcHeight) + 1); + if (! ClipobjToSpans(&ClipSpans, &ClipSpansCount, ClipRegion, DestRect)) + { + return FALSE; + } + if (0 == ClipSpansCount) + { + /* No clip spans == empty clipping region, everything clipped away */ + ASSERT(NULL == ClipSpans); + return TRUE; + } + skip = (DestRect->bottom - DestRect->top < SourceRect->bottom - SourceRect->top) ? 0 : ((DestRect->bottom - DestRect->top) / (2 * (SourceRect->bottom - SourceRect->top)) + 1); NumPixels -= skip; - ScanLine = (PIXEL*)ExAllocatePool(NonPagedPool, TgtWidth*sizeof(PIXEL)); // FIXME: Should we use PagedPool here? - ScanLineAhead = (PIXEL *)ExAllocatePool(NonPagedPool, TgtWidth*sizeof(PIXEL)); + ScanLine = (PIXEL*)ExAllocatePool(PagedPool, (DestRect->right - DestRect->left) * sizeof(PIXEL)); + ScanLineAhead = (PIXEL *)ExAllocatePool(PagedPool, (DestRect->right - DestRect->left) * sizeof(PIXEL)); + DestY = DestRect->top; + SpanIndex = 0; while (NumPixels-- > 0) { if (Source != PrevSource) { if (Source == PrevSourceAhead) { @@ -469,38 +527,57 @@ void ScaleRectAvg32(PIXEL *Target, PIXEL *Source, int SrcWidth, int SrcHeight, ScanLine = ScanLineAhead; ScanLineAhead = tmp; } else { - ScaleLineAvg32(ScanLine, Source, SrcWidth, TgtWidth); + ScaleLineAvg32(ScanLine, Source, SourceRect->right - SourceRect->left, DestRect->right - DestRect->left); } /* if */ PrevSource = Source; } /* if */ - if (E >= Mid && PrevSourceAhead != (PIXEL *)((BYTE *)Source + srcPitch)) { + if (E >= Mid && PrevSourceAhead != (PIXEL *)((BYTE *)Source + SourceGDI->SurfObj.lDelta)) { int x; - ScaleLineAvg32(ScanLineAhead, (PIXEL *)((BYTE *)Source + srcPitch), SrcWidth, TgtWidth); - for (x = 0; x < TgtWidth; x++) + ScaleLineAvg32(ScanLineAhead, (PIXEL *)((BYTE *)Source + SourceGDI->SurfObj.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 + srcPitch); + PrevSourceAhead = (PIXEL *)((BYTE *)Source + SourceGDI->SurfObj.lDelta); } /* if */ - memcpy(Target, ScanLine, TgtWidth*sizeof(PIXEL)); - Target = (PIXEL *)((BYTE *)Target + dstPitch); + if (! FinalCopy32(Target, ScanLine, ClipSpans, ClipSpansCount, &SpanIndex, DestY, DestRect)) + { + /* No more spans, everything else is clipped away, we're done */ + ExFreePool(ClipSpans); + ExFreePool(ScanLine); + ExFreePool(ScanLineAhead); + return TRUE; + } + DestY++; + Target = (PIXEL *)((BYTE *)Target + DestGDI->SurfObj.lDelta); Source += IntPart; E += FractPart; - if (E >= TgtHeight) { - E -= TgtHeight; - Source = (PIXEL *)((BYTE *)Source + srcPitch); + if (E >= DestRect->bottom - DestRect->top) { + E -= DestRect->bottom - DestRect->top; + Source = (PIXEL *)((BYTE *)Source + SourceGDI->SurfObj.lDelta); } /* if */ } /* while */ if (skip > 0 && Source != PrevSource) - ScaleLineAvg32(ScanLine, Source, SrcWidth, TgtWidth); + ScaleLineAvg32(ScanLine, Source, SourceRect->right - SourceRect->left, DestRect->right - DestRect->left); while (skip-- > 0) { - memcpy(Target, ScanLine, TgtWidth*sizeof(PIXEL)); - Target = (PIXEL *)((BYTE *)Target + dstPitch); + if (! FinalCopy32(Target, ScanLine, ClipSpans, ClipSpansCount, &SpanIndex, DestY, DestRect)) + { + /* No more spans, everything else is clipped away, we're done */ + ExFreePool(ClipSpans); + ExFreePool(ScanLine); + ExFreePool(ScanLineAhead); + return TRUE; + } + DestY++; + Target = (PIXEL *)((BYTE *)Target + DestGDI->SurfObj.lDelta); } /* while */ + ExFreePool(ClipSpans); ExFreePool(ScanLine); ExFreePool(ScanLineAhead); + + return TRUE; } //NOTE: If you change something here, please do the same in other dibXXbpp.c files! @@ -508,11 +585,10 @@ BOOLEAN DIB_32BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Mode) + CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, + ULONG Mode) { - BYTE *SourceLine, *DestLine; - - DbgPrint("DIB_32BPP_StretchBlt: Source BPP: %u, srcRect: (%d,%d)-(%d,%d), dstRect: (%d,%d)-(%d,%d)\n", + 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, DestRect->left, DestRect->top, DestRect->right, DestRect->bottom); @@ -539,15 +615,12 @@ BOOLEAN DIB_32BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, break; case 32: - SourceLine = SourceSurf->pvScan0 + (SourceRect->top * SourceSurf->lDelta) + 4 * SourceRect->left; - DestLine = DestSurf->pvScan0 + (DestRect->top * DestSurf->lDelta) + 4 * DestRect->left; - ScaleRectAvg32((PIXEL *)DestLine, (PIXEL *)SourceLine, - SourceRect->right-SourceRect->left, SourceRect->bottom-SourceRect->top, - DestRect->right-DestRect->left, DestRect->bottom-DestRect->top, SourceSurf->lDelta, DestSurf->lDelta); + return ScaleRectAvg32(DestGDI, SourceGDI, DestRect, SourceRect, MaskOrigin, BrushOrigin, + ClipRegion, ColorTranslation, Mode); break; default: - //DbgPrint("DIB_32BPP_StretchBlt: Unhandled Source BPP: %u\n", SourceGDI->BitsPerPixel); + //DPRINT1("DIB_32BPP_StretchBlt: Unhandled Source BPP: %u\n", SourceGDI->BitsPerPixel); return FALSE; } diff --git a/reactos/subsys/win32k/dib/dib4bpp.c b/reactos/subsys/win32k/dib/dib4bpp.c index 7fc52aa891e..37730023f61 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.34 2004/05/10 17:07:17 weiden Exp $ */ +/* $Id: dib4bpp.c,v 1.35 2004/05/14 22:56:17 gvg Exp $ */ #include <w32k.h> VOID @@ -390,7 +390,8 @@ BOOLEAN DIB_4BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Mode) + CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, + ULONG Mode) { DbgPrint("DIB_4BPP_StretchBlt: Source BPP: %u\n", SourceGDI->BitsPerPixel); return FALSE; diff --git a/reactos/subsys/win32k/dib/dib8bpp.c b/reactos/subsys/win32k/dib/dib8bpp.c index ce217be3ec9..6b7a6e5e76b 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.25 2004/05/10 17:07:17 weiden Exp $ */ +/* $Id: dib8bpp.c,v 1.26 2004/05/14 22:56:17 gvg Exp $ */ #include <w32k.h> VOID @@ -252,7 +252,7 @@ DIB_8BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, break; default: - DbgPrint("DIB_8BPP_Bitblt: Unhandled Source BPP: %u\n", SourceGDI->BitsPerPixel); + DPRINT1("DIB_8BPP_Bitblt: Unhandled Source BPP: %u\n", SourceGDI->BitsPerPixel); return FALSE; } @@ -432,26 +432,84 @@ void ScaleLineAvg8(PIXEL *Target, PIXEL *Source, int SrcWidth, int TgtWidth) *Target++ = *Source; } -//NOTE: If you change something here, please do the same in other dibXXbpp.c files! -void ScaleRectAvg8(PIXEL *Target, PIXEL *Source, int SrcWidth, int SrcHeight, - int TgtWidth, int TgtHeight, int srcPitch, int dstPitch) +static BOOLEAN +FinalCopy8(PIXEL *Target, PIXEL *Source, PSPAN ClipSpans, UINT ClipSpansCount, UINT *SpanIndex, + UINT DestY, RECTL *DestRect) { - int NumPixels = TgtHeight; - int IntPart = ((SrcHeight / TgtHeight) * srcPitch); //(SrcHeight / TgtHeight) * SrcWidth; - int FractPart = SrcHeight % TgtHeight; - int Mid = TgtHeight >> 1; + LONG Left, Right; + + while (ClipSpans[*SpanIndex].Y < DestY + || (ClipSpans[*SpanIndex].Y == DestY + && ClipSpans[*SpanIndex].X + ClipSpans[*SpanIndex].Width < DestRect->left)) + { + (*SpanIndex)++; + if (ClipSpansCount <= *SpanIndex) + { + /* No more spans, everything else is clipped away, we're done */ + return FALSE; + } + } + while (ClipSpans[*SpanIndex].Y == DestY) + { + if (ClipSpans[*SpanIndex].X < DestRect->right) + { + Left = max(ClipSpans[*SpanIndex].X, DestRect->left); + Right = min(ClipSpans[*SpanIndex].X + ClipSpans[*SpanIndex].Width, DestRect->right); + memcpy(Target + Left - DestRect->left, Source + Left - DestRect->left, + (Right - Left) * sizeof(PIXEL)); + } + (*SpanIndex)++; + if (ClipSpansCount <= *SpanIndex) + { + /* No more spans, everything else is clipped away, we're done */ + return FALSE; + } + } + + return TRUE; +} + +//NOTE: If you change something here, please do the same in other dibXXbpp.c files! +BOOLEAN ScaleRectAvg8(SURFGDI *DestGDI, SURFGDI *SourceGDI, + 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 FractPart = (SourceRect->bottom - SourceRect->top) % (DestRect->bottom - DestRect->top); + int Mid = (DestRect->bottom - DestRect->top) >> 1; int E = 0; int skip; 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); + PSPAN ClipSpans; + UINT ClipSpansCount; + UINT SpanIndex; + LONG DestY; - skip = (TgtHeight < SrcHeight) ? 0 : (TgtHeight / (2*SrcHeight) + 1); + if (! ClipobjToSpans(&ClipSpans, &ClipSpansCount, ClipRegion, DestRect)) + { + return FALSE; + } + if (0 == ClipSpansCount) + { + /* No clip spans == empty clipping region, everything clipped away */ + ASSERT(NULL == ClipSpans); + return TRUE; + } + skip = (DestRect->bottom - DestRect->top < SourceRect->bottom - SourceRect->top) ? 0 : ((DestRect->bottom - DestRect->top) / (2 * (SourceRect->bottom - SourceRect->top)) + 1); NumPixels -= skip; - ScanLine = (PIXEL*)ExAllocatePool(NonPagedPool, TgtWidth*sizeof(PIXEL)); // FIXME: Should we use PagedPool here? - ScanLineAhead = (PIXEL *)ExAllocatePool(NonPagedPool, TgtWidth*sizeof(PIXEL)); + ScanLine = (PIXEL*)ExAllocatePool(PagedPool, (DestRect->right - DestRect->left) * sizeof(PIXEL)); + ScanLineAhead = (PIXEL *)ExAllocatePool(PagedPool, (DestRect->right - DestRect->left) * sizeof(PIXEL)); + DestY = DestRect->top; + SpanIndex = 0; while (NumPixels-- > 0) { if (Source != PrevSource) { if (Source == PrevSourceAhead) { @@ -463,49 +521,67 @@ void ScaleRectAvg8(PIXEL *Target, PIXEL *Source, int SrcWidth, int SrcHeight, ScanLine = ScanLineAhead; ScanLineAhead = tmp; } else { - ScaleLineAvg8(ScanLine, Source, SrcWidth, TgtWidth); + ScaleLineAvg8(ScanLine, Source, SourceRect->right - SourceRect->left, DestRect->right - DestRect->left); } /* if */ PrevSource = Source; } /* if */ - if (E >= Mid && PrevSourceAhead != (PIXEL *)((BYTE *)Source + srcPitch)) { + if (E >= Mid && PrevSourceAhead != (PIXEL *)((BYTE *)Source + SourceGDI->SurfObj.lDelta)) { int x; - ScaleLineAvg8(ScanLineAhead, (PIXEL *)((BYTE *)Source + srcPitch), SrcWidth, TgtWidth); - for (x = 0; x < TgtWidth; x++) + ScaleLineAvg8(ScanLineAhead, (PIXEL *)((BYTE *)Source + SourceGDI->SurfObj.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 + srcPitch); + PrevSourceAhead = (PIXEL *)((BYTE *)Source + SourceGDI->SurfObj.lDelta); } /* if */ - memcpy(Target, ScanLine, TgtWidth*sizeof(PIXEL)); - Target = (PIXEL *)((BYTE *)Target + dstPitch); + if (! FinalCopy8(Target, ScanLine, ClipSpans, ClipSpansCount, &SpanIndex, DestY, DestRect)) + { + /* No more spans, everything else is clipped away, we're done */ + ExFreePool(ClipSpans); + ExFreePool(ScanLine); + ExFreePool(ScanLineAhead); + return TRUE; + } + DestY++; + Target = (PIXEL *)((BYTE *)Target + DestGDI->SurfObj.lDelta); Source += IntPart; E += FractPart; - if (E >= TgtHeight) { - E -= TgtHeight; - Source = (PIXEL *)((BYTE *)Source + srcPitch); + if (E >= DestRect->bottom - DestRect->top) { + E -= DestRect->bottom - DestRect->top; + Source = (PIXEL *)((BYTE *)Source + SourceGDI->SurfObj.lDelta); } /* if */ } /* while */ if (skip > 0 && Source != PrevSource) - ScaleLineAvg8(ScanLine, Source, SrcWidth, TgtWidth); + ScaleLineAvg8(ScanLine, Source, SourceRect->right - SourceRect->left, DestRect->right - DestRect->left); while (skip-- > 0) { - memcpy(Target, ScanLine, TgtWidth*sizeof(PIXEL)); - Target = (PIXEL *)((BYTE *)Target + dstPitch); + if (! FinalCopy8(Target, ScanLine, ClipSpans, ClipSpansCount, &SpanIndex, DestY, DestRect)) + { + /* No more spans, everything else is clipped away, we're done */ + ExFreePool(ClipSpans); + ExFreePool(ScanLine); + ExFreePool(ScanLineAhead); + return TRUE; + } + DestY++; + Target = (PIXEL *)((BYTE *)Target + DestGDI->SurfObj.lDelta); } /* while */ + ExFreePool(ClipSpans); ExFreePool(ScanLine); ExFreePool(ScanLineAhead); + + return TRUE; } BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Mode) + CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, + ULONG Mode) { - BYTE *SourceLine, *DestLine; - - DbgPrint("DIB_8BPP_StretchBlt: Source BPP: %u, srcRect: (%d,%d)-(%d,%d), dstRect: (%d,%d)-(%d,%d)\n", + 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, DestRect->left, DestRect->top, DestRect->right, DestRect->bottom); @@ -520,12 +596,8 @@ BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, break; case 8: - SourceLine = SourceSurf->pvScan0 + (SourceRect->top * SourceSurf->lDelta) + SourceRect->left; - DestLine = DestSurf->pvScan0 + (DestRect->top * DestSurf->lDelta) + DestRect->left; - - ScaleRectAvg8((PIXEL *)DestLine, (PIXEL *)SourceLine, - SourceRect->right-SourceRect->left, SourceRect->bottom-SourceRect->top, - DestRect->right-DestRect->left, DestRect->bottom-DestRect->top, SourceSurf->lDelta, DestSurf->lDelta); + return ScaleRectAvg8(DestGDI, SourceGDI, DestRect, SourceRect, MaskOrigin, BrushOrigin, + ClipRegion, ColorTranslation, Mode); break; case 16: @@ -541,7 +613,7 @@ BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, break; default: - DbgPrint("DIB_8BPP_StretchBlt: Unhandled Source BPP: %u\n", SourceGDI->BitsPerPixel); + DPRINT1("DIB_8BPP_StretchBlt: Unhandled Source BPP: %u\n", SourceGDI->BitsPerPixel); return FALSE; } diff --git a/reactos/subsys/win32k/eng/bitblt.c b/reactos/subsys/win32k/eng/bitblt.c index 5db8f9de343..9bd1592cfb5 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.54 2004/05/10 17:07:17 weiden Exp $ +/* $Id: bitblt.c,v 1.55 2004/05/14 22:56:18 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -45,6 +45,7 @@ typedef BOOLEAN STDCALL (*PSTRETCHRECTFUNC)(SURFOBJ* OutputObj, SURFOBJ* InputObj, SURFGDI* InputGDI, SURFOBJ* Mask, + CLIPOBJ* ClipRegion, XLATEOBJ* ColorTranslation, RECTL* OutputRect, RECTL* InputRect, @@ -593,6 +594,7 @@ CallDibStretchBlt(SURFOBJ* OutputObj, SURFOBJ* InputObj, SURFGDI* InputGDI, SURFOBJ* Mask, + CLIPOBJ* ClipRegion, XLATEOBJ* ColorTranslation, RECTL* OutputRect, RECTL* InputRect, @@ -609,7 +611,7 @@ CallDibStretchBlt(SURFOBJ* OutputObj, { RealBrushOrigin = *BrushOrigin; } - return OutputGDI->DIB_StretchBlt(OutputObj, InputObj, OutputGDI, InputGDI, OutputRect, InputRect, MaskOrigin, RealBrushOrigin, ColorTranslation, Mode); + return OutputGDI->DIB_StretchBlt(OutputObj, InputObj, OutputGDI, InputGDI, OutputRect, InputRect, MaskOrigin, RealBrushOrigin, ClipRegion, ColorTranslation, Mode); } @@ -631,10 +633,6 @@ EngStretchBlt( { // www.osr.com/ddk/graphics/gdifncs_0bs7.htm - BYTE clippingType; - RECTL CombinedRect; -// RECT_ENUM RectEnum; -// BOOL EnumMore; SURFGDI* OutputGDI; SURFGDI* InputGDI; POINTL InputPoint; @@ -645,30 +643,26 @@ EngStretchBlt( INTENG_ENTER_LEAVE EnterLeaveDest; SURFOBJ* InputObj; SURFOBJ* OutputObj; - PSTRETCHRECTFUNC BltRectFunc; + PSTRETCHRECTFUNC BltRectFunc; BOOLEAN Ret; - RECTL ClipRect; -// unsigned i; - POINTL Pt; -// ULONG Direction; - POINTL AdjustedBrushOrigin; + POINTL AdjustedBrushOrigin; - InputRect.left = prclSrc->left; - InputRect.right = prclSrc->right; - InputRect.top = prclSrc->top; - InputRect.bottom = prclSrc->bottom; + InputRect.left = prclSrc->left; + InputRect.right = prclSrc->right; + InputRect.top = prclSrc->top; + InputRect.bottom = prclSrc->bottom; if (! IntEngEnter(&EnterLeaveSource, SourceObj, &InputRect, TRUE, &Translate, &InputObj)) { - return FALSE; + return FALSE; } - InputPoint.x = InputRect.left + Translate.x; - InputPoint.y = InputRect.top + Translate.y; + InputPoint.x = InputRect.left + Translate.x; + InputPoint.y = InputRect.top + Translate.y; if (NULL != InputObj) { - InputGDI = (SURFGDI*) AccessInternalObjectFromUserObject(InputObj); + InputGDI = (SURFGDI*) AccessInternalObjectFromUserObject(InputObj); } else { @@ -676,44 +670,19 @@ EngStretchBlt( } OutputRect = *prclDest; - if (NULL != ClipRegion) - { - if (OutputRect.left < ClipRegion->rclBounds.left) - { - InputRect.left += ClipRegion->rclBounds.left - OutputRect.left; - InputPoint.x += ClipRegion->rclBounds.left - OutputRect.left; - OutputRect.left = ClipRegion->rclBounds.left; - } - if (ClipRegion->rclBounds.right < OutputRect.right) - { - InputRect.right -= OutputRect.right - ClipRegion->rclBounds.right; - OutputRect.right = ClipRegion->rclBounds.right; - } - if (OutputRect.top < ClipRegion->rclBounds.top) - { - InputRect.top += ClipRegion->rclBounds.top - OutputRect.top; - InputPoint.y += ClipRegion->rclBounds.top - OutputRect.top; - OutputRect.top = ClipRegion->rclBounds.top; - } - if (ClipRegion->rclBounds.bottom < OutputRect.bottom) - { - InputRect.bottom -= OutputRect.bottom - ClipRegion->rclBounds.bottom; - OutputRect.bottom = ClipRegion->rclBounds.bottom; - } - } /* Check for degenerate case: if height or width of OutputRect is 0 pixels there's nothing to do */ if (OutputRect.right <= OutputRect.left || OutputRect.bottom <= OutputRect.top) { - IntEngLeave(&EnterLeaveSource); - return TRUE; + IntEngLeave(&EnterLeaveSource); + return TRUE; } if (! IntEngEnter(&EnterLeaveDest, DestObj, &OutputRect, FALSE, &Translate, &OutputObj)) { - IntEngLeave(&EnterLeaveSource); - return FALSE; + IntEngLeave(&EnterLeaveSource); + return FALSE; } OutputRect.left = prclDest->left + Translate.x; @@ -721,28 +690,22 @@ EngStretchBlt( OutputRect.top = prclDest->top + Translate.y; OutputRect.bottom = prclDest->bottom + Translate.y; - if(BrushOrigin) - { - AdjustedBrushOrigin.x = BrushOrigin->x + Translate.x; - AdjustedBrushOrigin.y = BrushOrigin->y + Translate.y; - } + if (NULL != BrushOrigin) + { + AdjustedBrushOrigin.x = BrushOrigin->x + Translate.x; + AdjustedBrushOrigin.y = BrushOrigin->y + Translate.y; + } else - AdjustedBrushOrigin = Translate; + { + AdjustedBrushOrigin = Translate; + } if (NULL != OutputObj) { - OutputGDI = (SURFGDI*)AccessInternalObjectFromUserObject(OutputObj); + OutputGDI = (SURFGDI*)AccessInternalObjectFromUserObject(OutputObj); } - // Determine clipping type - if (ClipRegion == (CLIPOBJ *) NULL) - { - clippingType = DC_TRIVIAL; - } else { - clippingType = ClipRegion->iDComplexity; - } - - if (Mask != NULL)//(0xaacc == Rop4) + if (Mask != NULL) { //BltRectFunc = BltMask; DPRINT("EngStretchBlt isn't capable of handling mask yet.\n"); @@ -757,70 +720,9 @@ EngStretchBlt( } - switch(clippingType) - { - case DC_TRIVIAL: - Ret = (*BltRectFunc)(OutputObj, OutputGDI, InputObj, InputGDI, Mask, ColorTranslation, - &OutputRect, &InputRect, MaskOrigin, &AdjustedBrushOrigin, Mode); - break; - case DC_RECT: - // Clip the blt to the clip rectangle - ClipRect.left = ClipRegion->rclBounds.left + Translate.x; - ClipRect.right = ClipRegion->rclBounds.right + Translate.x; - ClipRect.top = ClipRegion->rclBounds.top + Translate.y; - ClipRect.bottom = ClipRegion->rclBounds.bottom + Translate.y; - 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, - &OutputRect, &InputRect, MaskOrigin, &AdjustedBrushOrigin, Mode); - //Ret = (*BltRectFunc)(OutputObj, OutputGDI, InputObj, InputGDI, Mask, ColorTranslation, - // &CombinedRect, &Pt, MaskOrigin, Brush, BrushOrigin, Rop4); - DPRINT("EngStretchBlt() doesn't support DC_RECT clipping yet, so blitting w/o clip.\n"); - break; - // TODO: Complex clipping - /* - case DC_COMPLEX: - Ret = TRUE; - if (OutputObj == InputObj) - { - if (OutputRect.top < InputPoint.y) - { - Direction = OutputRect.left < InputPoint.x ? CD_RIGHTDOWN : CD_LEFTDOWN; - } - else - { - Direction = OutputRect.left < InputPoint.x ? CD_RIGHTUP : CD_LEFTUP; - } - } - else - { - Direction = CD_ANY; - } - CLIPOBJ_cEnumStart(ClipRegion, FALSE, CT_RECTANGLES, Direction, 0); - do - { - EnumMore = CLIPOBJ_bEnum(ClipRegion,(ULONG) sizeof(RectEnum), (PVOID) &RectEnum); - - for (i = 0; i < RectEnum.c; i++) - { - ClipRect.left = RectEnum.arcl[i].left + Translate.x; - ClipRect.right = RectEnum.arcl[i].right + Translate.x; - ClipRect.top = RectEnum.arcl[i].top + Translate.y; - ClipRect.bottom = RectEnum.arcl[i].bottom + Translate.y; - 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, - &CombinedRect, &Pt, MaskOrigin, Brush, &AdjustedBrushOrigin, Rop4) && - Ret; - } - } - while(EnumMore); - break; - */ - } - + Ret = (*BltRectFunc)(OutputObj, OutputGDI, InputObj, InputGDI, Mask, ClipRegion, + ColorTranslation, &OutputRect, &InputRect, MaskOrigin, + &AdjustedBrushOrigin, Mode); IntEngLeave(&EnterLeaveDest); IntEngLeave(&EnterLeaveSource); @@ -844,8 +746,6 @@ IntEngStretchBlt(SURFOBJ *DestObj, BOOLEAN ret; SURFGDI *DestGDI; SURFGDI *SourceGDI; - RECTL OutputRect; - RECTL InputRect; COLORADJUSTMENT ca; POINT MaskOrigin; @@ -854,43 +754,19 @@ IntEngStretchBlt(SURFOBJ *DestObj, MaskOrigin.x = pMaskOrigin->x; MaskOrigin.y = pMaskOrigin->y; } - if (NULL != SourceRect) - { - InputRect = *SourceRect; - } - - // FIXME: Clipping is taken from IntEngBitBlt w/o modifications! - - /* Clip against the bounds of the clipping region so we won't try to write - * outside the surface */ - if (NULL != ClipRegion) - { - if (! EngIntersectRect(&OutputRect, DestRect, &ClipRegion->rclBounds)) - { - return TRUE; - } - DPRINT("Clipping isn't handled in IntEngStretchBlt() correctly yet\n"); - //InputPoint.x += OutputRect.left - DestRect->left; - //InputPoint.y += OutputRect.top - DestRect->top; - } - else - { - OutputRect = *DestRect; - } - if (NULL != SourceObj) { SourceGDI = (SURFGDI*) AccessInternalObjectFromUserObject(SourceObj); - MouseSafetyOnDrawStart(SourceObj, SourceGDI, InputRect.left, InputRect.top, - (InputRect.left + abs(InputRect.right - InputRect.left)), - (InputRect.top + abs(InputRect.bottom - InputRect.top))); + MouseSafetyOnDrawStart(SourceObj, SourceGDI, 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, OutputRect.left, OutputRect.top, - OutputRect.right, OutputRect.bottom); + MouseSafetyOnDrawStart(DestObj, DestGDI, DestRect->left, DestRect->top, + DestRect->right, DestRect->bottom); /* Prepare color adjustment */ @@ -902,7 +778,7 @@ IntEngStretchBlt(SURFOBJ *DestObj, // FIXME: MaskOrigin is always NULL ! IntLockGDIDriver(DestGDI); ret = DestGDI->StretchBlt(DestObj, SourceObj, Mask, ClipRegion, ColorTranslation, - &ca, BrushOrigin, &OutputRect, &InputRect, NULL, Mode); + &ca, BrushOrigin, DestRect, SourceRect, NULL, Mode); IntUnLockGDIDriver(DestGDI); } @@ -910,7 +786,7 @@ IntEngStretchBlt(SURFOBJ *DestObj, { // FIXME: see previous fixme ret = EngStretchBlt(DestObj, SourceObj, Mask, ClipRegion, ColorTranslation, - &ca, BrushOrigin, &OutputRect, &InputRect, NULL, Mode); + &ca, BrushOrigin, DestRect, SourceRect, NULL, Mode); } MouseSafetyOnDrawEnd(DestObj, DestGDI); diff --git a/reactos/subsys/win32k/eng/clip.c b/reactos/subsys/win32k/eng/clip.c index 7aa2d0a9138..cd4dd17590c 100644 --- a/reactos/subsys/win32k/eng/clip.c +++ b/reactos/subsys/win32k/eng/clip.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: clip.c,v 1.20 2004/05/10 17:07:17 weiden Exp $ +/* $Id: clip.c,v 1.21 2004/05/14 22:56:18 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -333,4 +333,123 @@ CLIPOBJ_bEnum(IN CLIPOBJ* ClipObj, return ClipGDI->EnumPos < ClipGDI->EnumRects.c; } +static int +CompareSpans(const PSPAN Span1, const PSPAN Span2) +{ + int Cmp; + + if (Span1->Y < Span2->Y) + { + Cmp = -1; + } + else if (Span2->Y < Span1->Y) + { + Cmp = +1; + } + else + { + if (Span1->X < Span2->X) + { + Cmp = -1; + } + else if (Span2->X < Span1->X) + { + Cmp = +1; + } + else + { + Cmp = 0; + } + } + + return Cmp; +} + +BOOLEAN FASTCALL +ClipobjToSpans(PSPAN *Spans, UINT *Count, CLIPOBJ *ClipRegion, PRECTL Boundary) +{ + BOOL EnumMore; + UINT i, NewCount; + RECT_ENUM RectEnum; + PSPAN NewSpans; + RECTL *Rect; + + ASSERT(Boundary->top <= Boundary->bottom && Boundary->left <= Boundary->right); + + *Spans = NULL; + if (NULL == ClipRegion || DC_TRIVIAL == ClipRegion->iDComplexity) + { + *Count = Boundary->bottom - Boundary->top; + if (0 != *Count) + { + *Spans = ExAllocatePoolWithTag(PagedPool, *Count * sizeof(SPAN), TAG_CLIP); + if (NULL == *Spans) + { + *Count = 0; + return FALSE; + } + for (i = 0; i < Boundary->bottom - Boundary->top; i++) + { + (*Spans)[i].X = Boundary->left; + (*Spans)[i].Y = Boundary->top + i; + (*Spans)[i].Width = Boundary->right - Boundary->left; + } + } + + return TRUE; + } + + *Count = 0; + CLIPOBJ_cEnumStart(ClipRegion, FALSE, CT_RECTANGLES, CD_ANY, 0); + do + { + EnumMore = CLIPOBJ_bEnum(ClipRegion, (ULONG) sizeof(RECT_ENUM), (PVOID) &RectEnum); + + NewCount = *Count; + for (i = 0; i < RectEnum.c; i++) + { + NewCount += RectEnum.arcl[i].bottom - RectEnum.arcl[i].top; + } + if (NewCount != *Count) + { + NewSpans = ExAllocatePoolWithTag(PagedPool, NewCount * sizeof(SPAN), TAG_CLIP); + if (NULL == NewSpans) + { + if (NULL != *Spans) + { + ExFreePool(*Spans); + *Spans = NULL; + } + *Count = 0; + return FALSE; + } + if (0 != *Count) + { + RtlCopyMemory(NewSpans, *Spans, *Count * sizeof(SPAN)); + ExFreePool(*Spans); + } + *Spans = NewSpans; + } + for (Rect = RectEnum.arcl; Rect < RectEnum.arcl + RectEnum.c; Rect++) + { + for (i = 0; i < Rect->bottom - Rect->top; i++) + { + (*Spans)[*Count].X = Rect->left; + (*Spans)[*Count].Y = Rect->top + i; + (*Spans)[*Count].Width = Rect->right - Rect->left; + (*Count)++; + } + } + ASSERT(*Count == NewCount); + } + while (EnumMore); + + if (0 != *Count) + { + EngSort((PBYTE) *Spans, sizeof(SPAN), *Count, (SORTCOMP) CompareSpans); + } + + return TRUE; +} + /* EOF */ diff --git a/reactos/subsys/win32k/eng/clip.h b/reactos/subsys/win32k/eng/clip.h index 8a9f19e5f04..dc0d079c9fe 100644 --- a/reactos/subsys/win32k/eng/clip.h +++ b/reactos/subsys/win32k/eng/clip.h @@ -32,4 +32,13 @@ typedef struct _RECT_ENUM RECTL arcl[ENUM_RECT_LIMIT]; } RECT_ENUM; +typedef struct tagSPAN +{ + LONG Y; + LONG X; + ULONG Width; +} SPAN, *PSPAN; + +BOOLEAN FASTCALL ClipobjToSpans(PSPAN *Spans, UINT *Count, CLIPOBJ *ClipRegion, PRECTL Boundary); + #endif diff --git a/reactos/subsys/win32k/eng/surface.c b/reactos/subsys/win32k/eng/surface.c index acaa4dbfa8d..effa51ab38e 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.38 2004/05/10 17:07:17 weiden Exp $ +/* $Id: surface.c,v 1.39 2004/05/14 22:56:18 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -110,7 +110,8 @@ static BOOLEAN Dummy_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrign, - XLATEOBJ *ColorTranslation, ULONG Mode) + CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, + ULONG Mode) { return FALSE; } diff --git a/reactos/subsys/win32k/include/tags.h b/reactos/subsys/win32k/include/tags.h index 08b29101d13..9ce0a959d69 100644 --- a/reactos/subsys/win32k/include/tags.h +++ b/reactos/subsys/win32k/include/tags.h @@ -26,6 +26,7 @@ #define TAG_BEZIER TAG('B', 'E', 'Z', 'R') /* bezier */ #define TAG_BITMAP TAG('B', 'T', 'M', 'P') /* bitmap */ #define TAG_PATBLT TAG('P', 'B', 'L', 'T') /* patblt */ +#define TAG_CLIP TAG('C', 'L', 'I', 'P') /* clipping */ #define TAG_COORD TAG('C', 'O', 'R', 'D') /* coords */ #define TAG_DC TAG('D', 'C', 'D', 'C') /* dc */ #define TAG_GDIOBJ TAG('G', 'D', 'I', 'O') /* gdi obj */ From b3b134ecfad6f6198f122734e8fd69edb93c9761 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Fri, 14 May 2004 23:57:32 +0000 Subject: [PATCH 1120/1463] changed cursors/icons to use the window station handle table svn path=/trunk/; revision=9389 --- reactos/ntoskrnl/include/internal/ex.h | 37 +-------- reactos/subsys/win32k/eng/mouse.c | 27 +++---- reactos/subsys/win32k/include/cursoricon.h | 37 +++++++++ reactos/subsys/win32k/ntuser/input.c | 14 ++-- reactos/subsys/win32k/ntuser/message.c | 12 ++- reactos/subsys/win32k/ntuser/metric.c | 14 ++-- reactos/subsys/win32k/ntuser/misc.c | 21 ++++-- reactos/subsys/win32k/ntuser/msgqueue.c | 4 +- reactos/subsys/win32k/ntuser/winsta.c | 52 +++++++++---- reactos/subsys/win32k/objects/cursoricon.c | 88 +++++++++++----------- 10 files changed, 173 insertions(+), 133 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/ex.h b/reactos/ntoskrnl/include/internal/ex.h index 70e3ed05d15..be5d814c869 100644 --- a/reactos/ntoskrnl/include/internal/ex.h +++ b/reactos/ntoskrnl/include/internal/ex.h @@ -8,41 +8,6 @@ #define NTOS_MODE_KERNEL #include <ntos.h> -typedef struct _CURSORCLIP_INFO -{ - BOOL IsClipped; - UINT Left; - UINT Top; - UINT Right; - UINT Bottom; -} CURSORCLIP_INFO, *PCURSORCLIP_INFO; - -typedef struct _SYSTEM_CURSORINFO -{ - BOOL Enabled; - BOOL SwapButtons; - UINT ButtonsDown; - LONG x, y; - BOOL SafetySwitch; - UINT SafetyRemoveCount; - LONG PointerRectLeft; - LONG PointerRectTop; - LONG PointerRectRight; - LONG PointerRectBottom; - FAST_MUTEX CursorMutex; - CURSORCLIP_INFO CursorClipInfo; - PVOID CurIconHandleTable; - PVOID CurrentCursorObject; - BYTE ShowingCursor; - UINT DblClickSpeed; - UINT DblClickWidth; - UINT DblClickHeight; - DWORD LastBtnDown; - LONG LastBtnDownX; - LONG LastBtnDownY; - HANDLE LastClkWnd; -} SYSTEM_CURSORINFO, *PSYSTEM_CURSORINFO; - typedef struct _WINSTATION_OBJECT { CSHORT Type; @@ -53,7 +18,7 @@ typedef struct _WINSTATION_OBJECT PRTL_ATOM_TABLE AtomTable; PVOID HandleTable; HANDLE SystemMenuTemplate; - SYSTEM_CURSORINFO SystemCursor; + PVOID SystemCursor; UINT CaretBlinkRate; HANDLE ShellWindow; HANDLE ShellListView; diff --git a/reactos/subsys/win32k/eng/mouse.c b/reactos/subsys/win32k/eng/mouse.c index 94377ed8003..02a19ae57e2 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.69 2004/05/10 17:07:17 weiden Exp $ +/* $Id: mouse.c,v 1.70 2004/05/14 23:57:32 weiden Exp $ * * PROJECT: ReactOS kernel * PURPOSE: Mouse @@ -39,12 +39,13 @@ EnableMouse(HDC hDisplayDC) PDC dc; SURFOBJ *SurfObj; PSURFGDI SurfGDI; + PSYSTEM_CURSORINFO CurInfo = IntGetSysCursorInfo(InputWindowStation); if( hDisplayDC && InputWindowStation) { if(!IntGetWindowStationObject(InputWindowStation)) { - InputWindowStation->SystemCursor.Enabled = FALSE; + CurInfo->Enabled = FALSE; return; } @@ -55,14 +56,14 @@ EnableMouse(HDC hDisplayDC) /* 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(&InputWindowStation->SystemCursor.CursorMutex); - InputWindowStation->SystemCursor.x = SurfObj->sizlBitmap.cx / 2; - InputWindowStation->SystemCursor.y = SurfObj->sizlBitmap.cy / 2; - ExReleaseFastMutex(&InputWindowStation->SystemCursor.CursorMutex); + ExAcquireFastMutex(&CurInfo->CursorMutex); + CurInfo->x = SurfObj->sizlBitmap.cx / 2; + CurInfo->y = SurfObj->sizlBitmap.cy / 2; + ExReleaseFastMutex(&CurInfo->CursorMutex); IntSetCursor(InputWindowStation, NULL, TRUE); - InputWindowStation->SystemCursor.Enabled = (SPS_ACCEPT_EXCLUDE == SurfGDI->PointerStatus || - SPS_ACCEPT_NOEXCLUDE == SurfGDI->PointerStatus); + CurInfo->Enabled = (SPS_ACCEPT_EXCLUDE == SurfGDI->PointerStatus || + SPS_ACCEPT_NOEXCLUDE == SurfGDI->PointerStatus); ObDereferenceObject(InputWindowStation); } @@ -71,9 +72,9 @@ EnableMouse(HDC hDisplayDC) if(IntGetWindowStationObject(InputWindowStation)) { IntSetCursor(InputWindowStation, NULL, TRUE); - InputWindowStation->SystemCursor.Enabled = FALSE; - InputWindowStation->SystemCursor.CursorClipInfo.IsClipped = FALSE; - ObDereferenceObject(InputWindowStation); + CurInfo->Enabled = FALSE; + CurInfo->CursorClipInfo.IsClipped = FALSE; + ObDereferenceObject(InputWindowStation); return; } } @@ -97,7 +98,7 @@ MouseSafetyOnDrawStart(SURFOBJ *SurfObj, PSURFGDI SurfGDI, LONG HazardX1, if(IntGetWindowStationObject(InputWindowStation)) { - CurInfo = &InputWindowStation->SystemCursor; + CurInfo = IntGetSysCursorInfo(InputWindowStation); MouseEnabled = CurInfo->Enabled && CurInfo->ShowingCursor; } @@ -183,7 +184,7 @@ MouseSafetyOnDrawEnd(SURFOBJ *SurfObj, SURFGDI *SurfGDI) if(IntGetWindowStationObject(InputWindowStation)) { - CurInfo = &InputWindowStation->SystemCursor; + CurInfo = IntGetSysCursorInfo(InputWindowStation); } else return FALSE; diff --git a/reactos/subsys/win32k/include/cursoricon.h b/reactos/subsys/win32k/include/cursoricon.h index 412b60c782a..52121543015 100644 --- a/reactos/subsys/win32k/include/cursoricon.h +++ b/reactos/subsys/win32k/include/cursoricon.h @@ -16,12 +16,49 @@ typedef struct _CURICON_OBJECT ICONINFO IconInfo; } CURICON_OBJECT, *PCURICON_OBJECT; +typedef struct _CURSORCLIP_INFO +{ + BOOL IsClipped; + UINT Left; + UINT Top; + UINT Right; + UINT Bottom; +} CURSORCLIP_INFO, *PCURSORCLIP_INFO; + +typedef struct _SYSTEM_CURSORINFO +{ + BOOL Enabled; + BOOL SwapButtons; + UINT ButtonsDown; + LONG x, y; + BOOL SafetySwitch; + UINT SafetyRemoveCount; + LONG PointerRectLeft; + LONG PointerRectTop; + LONG PointerRectRight; + LONG PointerRectBottom; + FAST_MUTEX CursorMutex; + CURSORCLIP_INFO CursorClipInfo; + PCURICON_OBJECT CurrentCursorObject; + BYTE ShowingCursor; + UINT DblClickSpeed; + UINT DblClickWidth; + UINT DblClickHeight; + DWORD LastBtnDown; + LONG LastBtnDownX; + LONG LastBtnDownY; + HANDLE LastClkWnd; +} SYSTEM_CURSORINFO, *PSYSTEM_CURSORINFO; + HCURSOR FASTCALL IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, BOOL ForceChange); BOOL FASTCALL IntSetupCurIconHandles(PWINSTATION_OBJECT WinStaObject); PCURICON_OBJECT FASTCALL IntGetCurIconObject(PWINSTATION_OBJECT WinStaObject, HANDLE Handle); PCURICON_OBJECT FASTCALL IntCreateCurIconHandle(PWINSTATION_OBJECT WinStaObject); VOID FASTCALL IntCleanupCurIcons(struct _EPROCESS *Process, PW32PROCESS Win32Process); +#define IntGetSysCursorInfo(WinStaObj) \ + (PSYSTEM_CURSORINFO)((WinStaObj)->SystemCursor) + #define IntReleaseCurIconObject(CurIconObj) \ ObmDereferenceObject(CurIconObj) diff --git a/reactos/subsys/win32k/ntuser/input.c b/reactos/subsys/win32k/ntuser/input.c index aad68601537..f2ff2a0fb25 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.32 2004/05/10 17:07:18 weiden Exp $ +/* $Id: input.c,v 1.33 2004/05/14 23:57:32 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -515,8 +515,12 @@ NtUserBlockInput( BOOL FASTCALL IntSwapMouseButton(PWINSTATION_OBJECT WinStaObject, BOOL Swap) { - BOOL res = WinStaObject->SystemCursor.SwapButtons; - WinStaObject->SystemCursor.SwapButtons = Swap; + PSYSTEM_CURSORINFO CurInfo; + BOOL res; + + CurInfo = IntGetSysCursorInfo(WinStaObject); + res = CurInfo->SwapButtons; + CurInfo->SwapButtons = Swap; return res; } @@ -557,7 +561,7 @@ IntMouseInput(MOUSEINPUT *mi) #endif ASSERT(WinSta); - CurInfo = &WinSta->SystemCursor; + CurInfo = IntGetSysCursorInfo(WinSta); dc = DC_LockDc(hDC); SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface); @@ -573,7 +577,7 @@ IntMouseInput(MOUSEINPUT *mi) mi->time = LargeTickCount.u.LowPart; } - SwapButtons = WinSta->SystemCursor.SwapButtons; + SwapButtons = CurInfo->SwapButtons; DoMove = FALSE; ExAcquireFastMutex(&CurInfo->CursorMutex); MousePos.x = CurInfo->x; diff --git a/reactos/subsys/win32k/ntuser/message.c b/reactos/subsys/win32k/ntuser/message.c index edc4d54a341..a628e4cfe9c 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.64 2004/05/14 16:48:04 navaraf Exp $ +/* $Id: message.c,v 1.65 2004/05/14 23:57:32 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -342,12 +342,14 @@ IntSendHitTestMessages(PUSER_MESSAGE_QUEUE ThreadQueue, LPMSG Msg) case WM_XBUTTONDBLCLK: { WPARAM wParam; + PSYSTEM_CURSORINFO CurInfo; if(!IntGetWindowStationObject(InputWindowStation)) { break; } - wParam = (WPARAM)InputWindowStation->SystemCursor.ButtonsDown; + CurInfo = IntGetSysCursorInfo(InputWindowStation); + wParam = (WPARAM)(CurInfo->ButtonsDown); ObDereferenceObject(InputWindowStation); IntSendMessage(Msg->hwnd, WM_MOUSEMOVE, wParam, Msg->lParam); @@ -1025,6 +1027,7 @@ NtUserPostMessage(HWND Wnd, } else { + PSYSTEM_CURSORINFO CurInfo; Window = IntGetWindowObject(Wnd); if (NULL == Window) { @@ -1043,8 +1046,9 @@ NtUserPostMessage(HWND Wnd, SetLastWin32Error(ERROR_INVALID_PARAMETER); return FALSE; } - KernelModeMsg.pt.x = PsGetWin32Process()->WindowStation->SystemCursor.x; - KernelModeMsg.pt.y = PsGetWin32Process()->WindowStation->SystemCursor.y; + CurInfo = IntGetSysCursorInfo(PsGetWin32Process()->WindowStation); + KernelModeMsg.pt.x = CurInfo->x; + KernelModeMsg.pt.y = CurInfo->y; KeQueryTickCount(&LargeTickCount); KernelModeMsg.time = LargeTickCount.u.LowPart; MsqPostMessage(Window->MessageQueue, &KernelModeMsg, diff --git a/reactos/subsys/win32k/ntuser/metric.c b/reactos/subsys/win32k/ntuser/metric.c index ba332f54e77..7522e61f8a5 100644 --- a/reactos/subsys/win32k/ntuser/metric.c +++ b/reactos/subsys/win32k/ntuser/metric.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: metric.c,v 1.20 2004/05/10 17:07:18 weiden Exp $ +/* $Id: metric.c,v 1.21 2004/05/14 23:57:32 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -66,6 +66,8 @@ NtUserGetSystemMetrics(ULONG Index) case SM_CXDOUBLECLK: case SM_CYDOUBLECLK: case SM_SWAPBUTTON: + { + PSYSTEM_CURSORINFO CurInfo; Status = IntValidateWindowStationHandle(PROCESS_WINDOW_STATION(), KernelMode, 0, @@ -73,22 +75,24 @@ NtUserGetSystemMetrics(ULONG Index) if (!NT_SUCCESS(Status)) return 0xFFFFFFFF; + CurInfo = IntGetSysCursorInfo(WinStaObject); switch(Index) { case SM_CXDOUBLECLK: - Result = WinStaObject->SystemCursor.DblClickWidth; + Result = CurInfo->DblClickWidth; break; case SM_CYDOUBLECLK: - Result = WinStaObject->SystemCursor.DblClickWidth; + Result = CurInfo->DblClickWidth; break; case SM_SWAPBUTTON: - Result = (UINT)WinStaObject->SystemCursor.SwapButtons; + Result = (UINT)CurInfo->SwapButtons; break; } ObDereferenceObject(WinStaObject); return Result; - + } + case SM_CXDRAG: case SM_CYDRAG: return(2); diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index ce205675f36..426b302528d 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.72 2004/05/12 15:28:01 weiden Exp $ +/* $Id: misc.c,v 1.73 2004/05/14 23:57:32 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -238,6 +238,7 @@ NtUserCallOneParam( case ONEPARAM_ROUTINE_GETCURSORPOSITION: { + PSYSTEM_CURSORINFO CurInfo; PWINSTATION_OBJECT WinStaObject; NTSTATUS Status; POINT Pos; @@ -251,9 +252,10 @@ NtUserCallOneParam( if (!NT_SUCCESS(Status)) return (DWORD)FALSE; + CurInfo = IntGetSysCursorInfo(WinStaObject); /* FIXME - check if process has WINSTA_READATTRIBUTES */ - Pos.x = WinStaObject->SystemCursor.x; - Pos.y = WinStaObject->SystemCursor.y; + Pos.x = CurInfo->x; + Pos.y = CurInfo->y; Status = MmCopyToCaller((PPOINT)Param, &Pos, sizeof(POINT)); if(!NT_SUCCESS(Status)) @@ -636,6 +638,8 @@ IntSystemParametersInfo( case SPI_SETDOUBLECLKHEIGHT: case SPI_SETDOUBLECLICKTIME: { + PSYSTEM_CURSORINFO CurInfo; + Status = IntValidateWindowStationHandle(PROCESS_WINDOW_STATION(), KernelMode, 0, @@ -646,19 +650,20 @@ IntSystemParametersInfo( return (DWORD)FALSE; } + CurInfo = IntGetSysCursorInfo(WinStaObject); switch(uiAction) { case SPI_SETDOUBLECLKWIDTH: /* FIXME limit the maximum value? */ - WinStaObject->SystemCursor.DblClickWidth = uiParam; + CurInfo->DblClickWidth = uiParam; break; case SPI_SETDOUBLECLKHEIGHT: /* FIXME limit the maximum value? */ - WinStaObject->SystemCursor.DblClickHeight = uiParam; + CurInfo->DblClickHeight = uiParam; break; case SPI_SETDOUBLECLICKTIME: /* FIXME limit the maximum time to 1000 ms? */ - WinStaObject->SystemCursor.DblClickSpeed = uiParam; + CurInfo->DblClickSpeed = uiParam; break; } @@ -914,6 +919,7 @@ NtUserGetDoubleClickTime(VOID) UINT Result; NTSTATUS Status; PWINSTATION_OBJECT WinStaObject; + PSYSTEM_CURSORINFO CurInfo; Status = IntValidateWindowStationHandle(PROCESS_WINDOW_STATION(), KernelMode, @@ -922,7 +928,8 @@ NtUserGetDoubleClickTime(VOID) if (!NT_SUCCESS(Status)) return (DWORD)FALSE; - Result = WinStaObject->SystemCursor.DblClickSpeed; + CurInfo = IntGetSysCursorInfo(WinStaObject); + Result = CurInfo->DblClickSpeed; ObDereferenceObject(WinStaObject); return Result; diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index 34479839c8c..5f9b8d8a065 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.94 2004/05/10 17:07:18 weiden Exp $ +/* $Id: msgqueue.c,v 1.95 2004/05/14 23:57:32 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -187,7 +187,7 @@ MsqIsDblClk(LPMSG Msg, BOOL Remove) { return FALSE; } - CurInfo = &WinStaObject->SystemCursor; + CurInfo = IntGetSysCursorInfo(WinStaObject); Res = (Msg->hwnd == (HWND)CurInfo->LastClkWnd) && ((Msg->time - CurInfo->LastBtnDown) < CurInfo->DblClickSpeed); if(Res) diff --git a/reactos/subsys/win32k/ntuser/winsta.c b/reactos/subsys/win32k/ntuser/winsta.c index 7fc4a3c8b63..ee852053093 100644 --- a/reactos/subsys/win32k/ntuser/winsta.c +++ b/reactos/subsys/win32k/ntuser/winsta.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: winsta.c,v 1.59 2004/05/10 17:07:18 weiden Exp $ + * $Id: winsta.c,v 1.60 2004/05/14 23:57:32 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -274,6 +274,7 @@ NtUserCreateWindowStation( DWORD Unknown4, DWORD Unknown5) { + PSYSTEM_CURSORINFO CurInfo; UNICODE_STRING WindowStationName; PWINSTATION_OBJECT WindowStationObject; HWINSTA WindowStation; @@ -367,11 +368,22 @@ NtUserCreateWindowStation( * Initialize the new window station object */ + if(!(CurInfo = ExAllocatePool(PagedPool, sizeof(SYSTEM_CURSORINFO)))) + { + ExFreePool(WindowStationName.Buffer); + /* FIXME - Delete window station object */ + ObDereferenceObject(WindowStationObject); + SetLastNtError(STATUS_INSUFFICIENT_RESOURCES); + return 0; + } + WindowStationObject->HandleTable = ObmCreateHandleTable(); if (!WindowStationObject->HandleTable) { DPRINT("Failed creating handle table\n"); + ExFreePool(CurInfo); ExFreePool(WindowStationName.Buffer); + /* FIXME - Delete window station object */ ObDereferenceObject(WindowStationObject); SetLastNtError(STATUS_INSUFFICIENT_RESOURCES); return 0; @@ -379,23 +391,25 @@ NtUserCreateWindowStation( InitHotKeys(WindowStationObject); - ExInitializeFastMutex(&WindowStationObject->SystemCursor.CursorMutex); - WindowStationObject->SystemCursor.Enabled = FALSE; - WindowStationObject->SystemCursor.ButtonsDown = 0; - WindowStationObject->SystemCursor.x = (LONG)0; - WindowStationObject->SystemCursor.y = (LONG)0; - WindowStationObject->SystemCursor.CursorClipInfo.IsClipped = FALSE; - WindowStationObject->SystemCursor.LastBtnDown = 0; - WindowStationObject->SystemCursor.CurrentCursorObject = NULL; - WindowStationObject->SystemCursor.ShowingCursor = 0; + ExInitializeFastMutex(&CurInfo->CursorMutex); + CurInfo->Enabled = FALSE; + CurInfo->ButtonsDown = 0; + CurInfo->x = (LONG)0; + CurInfo->y = (LONG)0; + CurInfo->CursorClipInfo.IsClipped = FALSE; + CurInfo->LastBtnDown = 0; + CurInfo->CurrentCursorObject = NULL; + CurInfo->ShowingCursor = 0; /* FIXME: Obtain the following information from the registry */ - WindowStationObject->SystemCursor.SwapButtons = FALSE; - WindowStationObject->SystemCursor.SafetySwitch = FALSE; - WindowStationObject->SystemCursor.SafetyRemoveCount = 0; - WindowStationObject->SystemCursor.DblClickSpeed = 500; - WindowStationObject->SystemCursor.DblClickWidth = 4; - WindowStationObject->SystemCursor.DblClickHeight = 4; + CurInfo->SwapButtons = FALSE; + CurInfo->SafetySwitch = FALSE; + CurInfo->SafetyRemoveCount = 0; + CurInfo->DblClickSpeed = 500; + CurInfo->DblClickWidth = 4; + CurInfo->DblClickHeight = 4; + + WindowStationObject->SystemCursor = CurInfo; if (!IntSetupCurIconHandles(WindowStationObject)) { @@ -529,6 +543,12 @@ NtUserCloseWindowStation( return FALSE; } + #if 0 + /* FIXME - free the cursor information when actually deleting the object!! */ + ASSERT(Object->SystemCursor); + ExFreePool(Object->SystemCursor); + #endif + ObDereferenceObject(Object); DPRINT("Closing window station handle (0x%X)\n", hWinSta); diff --git a/reactos/subsys/win32k/objects/cursoricon.c b/reactos/subsys/win32k/objects/cursoricon.c index cbc773df92a..55c7fb45e5d 100644 --- a/reactos/subsys/win32k/objects/cursoricon.c +++ b/reactos/subsys/win32k/objects/cursoricon.c @@ -16,23 +16,22 @@ * 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.55 2004/05/10 17:07:20 weiden Exp $ */ +/* $Id: cursoricon.c,v 1.56 2004/05/14 23:57:32 weiden Exp $ */ #include <w32k.h> PCURICON_OBJECT FASTCALL IntGetCurIconObject(PWINSTATION_OBJECT WinStaObject, HANDLE Handle) { - PCURICON_OBJECT Object; - PUSER_HANDLE_TABLE HandleTable; - - HandleTable = (PUSER_HANDLE_TABLE)WinStaObject->SystemCursor.CurIconHandleTable; - if(!NT_SUCCESS(ObmReferenceObjectByHandle(HandleTable, Handle, otCursorIcon, - (PVOID*)&Object))) - { - return FALSE; - } - - return Object; + PCURICON_OBJECT Object; + NTSTATUS Status; + + Status = ObmReferenceObjectByHandle(WinStaObject->HandleTable, + Handle, otCursorIcon, (PVOID*)&Object); + if (!NT_SUCCESS(Status)) + { + return NULL; + } + return Object; } HBITMAP FASTCALL @@ -74,7 +73,7 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, RECTL PointerRect; HDC Screen; - CurInfo = &WinStaObject->SystemCursor; + CurInfo = IntGetSysCursorInfo(WinStaObject); OldCursor = CurInfo->CurrentCursorObject; if (OldCursor) { @@ -241,11 +240,7 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, BOOL FASTCALL IntSetupCurIconHandles(PWINSTATION_OBJECT WinStaObject) { - if((WinStaObject->SystemCursor.CurIconHandleTable = (PVOID)ObmCreateHandleTable())) - { - ObmInitializeHandleTable((PUSER_HANDLE_TABLE)WinStaObject->SystemCursor.CurIconHandleTable); - } - return (WinStaObject->SystemCursor.CurIconHandleTable != NULL); + return TRUE; } PCURICON_OBJECT FASTCALL @@ -258,7 +253,7 @@ IntFindExistingCurIconObject(PWINSTATION_OBJECT WinStaObject, HMODULE hModule, PCURICON_OBJECT Object; ULONG i; - HandleTable = (PUSER_HANDLE_TABLE)WinStaObject->SystemCursor.CurIconHandleTable; + HandleTable = (PUSER_HANDLE_TABLE)WinStaObject->HandleTable; ObmpLockHandleTable(HandleTable); CurrentEntry = HandleTable->ListHead.Flink; @@ -268,15 +263,19 @@ IntFindExistingCurIconObject(PWINSTATION_OBJECT WinStaObject, HMODULE hModule, for(i = 0; i < HANDLE_BLOCK_ENTRIES; i++) { Object = (PCURICON_OBJECT)Current->Handles[i].ObjectBody; - if(Object && (Object->hModule == hModule) && (Object->hRsrc == hRsrc)) + if(Object && (ObmReferenceObjectByPointer(Object, otCursorIcon) == STATUS_SUCCESS)) { - if(cx && ((cx != Object->Size.cx) || (cy != Object->Size.cy))) + if((Object->hModule == hModule) && (Object->hRsrc == hRsrc)) { - continue; + if(cx && ((cx != Object->Size.cx) || (cy != Object->Size.cy))) + { + ObmDereferenceObject(Object); + continue; + } + ObmpUnlockHandleTable(HandleTable); + return Object; } - ObmReferenceObject(Object); - ObmpUnlockHandleTable(HandleTable); - return Object; + ObmDereferenceObject(Object); } } CurrentEntry = CurrentEntry->Flink; @@ -289,14 +288,11 @@ IntFindExistingCurIconObject(PWINSTATION_OBJECT WinStaObject, HMODULE hModule, PCURICON_OBJECT FASTCALL IntCreateCurIconHandle(PWINSTATION_OBJECT WinStaObject) { - PUSER_HANDLE_TABLE HandleTable; PCURICON_OBJECT Object; HANDLE Handle; PW32PROCESS Win32Process; - HandleTable = (PUSER_HANDLE_TABLE)WinStaObject->SystemCursor.CurIconHandleTable; - - Object = ObmCreateObject(HandleTable, &Handle, otCursorIcon, sizeof(CURICON_OBJECT)); + Object = ObmCreateObject(WinStaObject->HandleTable, &Handle, otCursorIcon, sizeof(CURICON_OBJECT)); if(!Object) { @@ -319,15 +315,13 @@ IntCreateCurIconHandle(PWINSTATION_OBJECT WinStaObject) BOOL FASTCALL IntDestroyCurIconObject(PWINSTATION_OBJECT WinStaObject, HANDLE Handle, BOOL RemoveFromProcess) { - PUSER_HANDLE_TABLE HandleTable; + PSYSTEM_CURSORINFO CurInfo; PCURICON_OBJECT Object; HBITMAP bmpMask, bmpColor; NTSTATUS Status; BOOL Ret; - HandleTable = (PUSER_HANDLE_TABLE)WinStaObject->SystemCursor.CurIconHandleTable; - - Status = ObmReferenceObjectByHandle(HandleTable, Handle, otCursorIcon, (PVOID*)&Object); + Status = ObmReferenceObjectByHandle(WinStaObject->HandleTable, Handle, otCursorIcon, (PVOID*)&Object); if(!NT_SUCCESS(Status)) { return FALSE; @@ -335,10 +329,13 @@ IntDestroyCurIconObject(PWINSTATION_OBJECT WinStaObject, HANDLE Handle, BOOL Rem if (Object->Process != PsGetWin32Process()) { + ObmDereferenceObject(Object); return FALSE; } - if (WinStaObject->SystemCursor.CurrentCursorObject == Object) + CurInfo = IntGetSysCursorInfo(WinStaObject); + + if (CurInfo->CurrentCursorObject == Object) { /* Hide the cursor if we're destroying the current cursor */ IntSetCursor(WinStaObject, NULL, TRUE); @@ -354,7 +351,7 @@ IntDestroyCurIconObject(PWINSTATION_OBJECT WinStaObject, HANDLE Handle, BOOL Rem IntUnLockProcessCursorIcons(Object->Process); } - Ret = NT_SUCCESS(ObmCloseHandle(HandleTable, Handle)); + Ret = NT_SUCCESS(ObmCloseHandle(WinStaObject->HandleTable, Handle)); /* delete bitmaps */ if(bmpMask) @@ -362,7 +359,7 @@ IntDestroyCurIconObject(PWINSTATION_OBJECT WinStaObject, HANDLE Handle, BOOL Rem if(bmpColor) NtGdiDeleteObject(bmpColor); -/* ObmDereferenceObject(Object);*/ + ObmDereferenceObject(Object); return Ret; } @@ -643,7 +640,7 @@ NtUserGetCursorInfo( return FALSE; } - CurInfo = &WinStaObject->SystemCursor; + CurInfo = IntGetSysCursorInfo(WinStaObject); CursorObject = (PCURICON_OBJECT)CurInfo->CurrentCursorObject; SafeCi.flags = ((CurInfo->ShowingCursor && CursorObject) ? CURSOR_SHOWING : 0); @@ -698,7 +695,7 @@ NtUserClipCursor( return FALSE; } - CurInfo = &WinStaObject->SystemCursor; + CurInfo = IntGetSysCursorInfo(WinStaObject); if(WinStaObject->ActiveDesktop) DesktopWindow = IntGetWindowObject(WinStaObject->ActiveDesktop->DesktopWindow); @@ -725,7 +722,7 @@ NtUserClipCursor( return TRUE; } - WinStaObject->SystemCursor.CursorClipInfo.IsClipped = FALSE; + CurInfo->CursorClipInfo.IsClipped = FALSE; ObDereferenceObject(WinStaObject); return TRUE; @@ -819,7 +816,7 @@ NtUserGetClipCursor( RECT *lpRect) { /* FIXME - check if process has WINSTA_READATTRIBUTES */ - + PSYSTEM_CURSORINFO CurInfo; PWINSTATION_OBJECT WinStaObject; RECT Rect; NTSTATUS Status; @@ -839,12 +836,13 @@ NtUserGetClipCursor( return FALSE; } - if(WinStaObject->SystemCursor.CursorClipInfo.IsClipped) + CurInfo = IntGetSysCursorInfo(WinStaObject); + if(CurInfo->CursorClipInfo.IsClipped) { - Rect.left = WinStaObject->SystemCursor.CursorClipInfo.Left; - Rect.top = WinStaObject->SystemCursor.CursorClipInfo.Top; - Rect.right = WinStaObject->SystemCursor.CursorClipInfo.Right; - Rect.bottom = WinStaObject->SystemCursor.CursorClipInfo.Bottom; + Rect.left = CurInfo->CursorClipInfo.Left; + Rect.top = CurInfo->CursorClipInfo.Top; + Rect.right = CurInfo->CursorClipInfo.Right; + Rect.bottom = CurInfo->CursorClipInfo.Bottom; } else { From 1c108dfcbda4b89c65c55708f09c1f8254d21491 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Sat, 15 May 2004 06:54:47 +0000 Subject: [PATCH 1121/1463] Implement complex clipping for StretchBlt svn path=/trunk/; revision=9390 --- reactos/subsys/win32k/eng/objects.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/eng/objects.h b/reactos/subsys/win32k/eng/objects.h index dd266fe820a..175d8a4f025 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.30 2004/04/09 20:03:16 navaraf Exp $ +/* $Id: objects.h,v 1.31 2004/05/15 06:54:47 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -162,8 +162,9 @@ typedef BOOLEAN (*PFN_DIB_BitBlt) (SURFOBJ * DestSurf, SURFOBJ * SourceS typedef BOOLEAN (*PFN_DIB_StretchBlt) (SURFOBJ * DestSurf, SURFOBJ * SourceSurf, PSURFGDI DestGDI, PSURFGDI SourceGDI, RECTL * DestRect, RECTL * SourceRect, - POINTL *MaskOrigin, POINTL BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Mode); + POINTL *MaskOrigin, POINTL BrushOrigin, + CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, + ULONG Mode); typedef BOOLEAN (*PFN_DIB_TransparentBlt) (SURFOBJ *, SURFOBJ *, PSURFGDI, PSURFGDI, RECTL* , POINTL *, XLATEOBJ *,ULONG); From 5884627fe685ac72c311ac79b5463cfb27d3e394 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Sat, 15 May 2004 07:49:05 +0000 Subject: [PATCH 1122/1463] Silence debug messages svn path=/trunk/; revision=9391 --- reactos/drivers/net/tcpip/tcpip/main.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/net/tcpip/tcpip/main.c b/reactos/drivers/net/tcpip/tcpip/main.c index c530e6e74cf..1aec90bb6b4 100644 --- a/reactos/drivers/net/tcpip/tcpip/main.c +++ b/reactos/drivers/net/tcpip/tcpip/main.c @@ -18,9 +18,13 @@ #include <tcp.h> #include <rosrtl/string.h> -#ifdef DBG +#define NDEBUG + +#ifndef NDEBUG DWORD DebugTraceLevel = 0x7fffffff; -#endif /* DBG */ +#else +DWORD DebugTraceLevel = MIN_TRACE; +#endif /* NDEBUG */ PDEVICE_OBJECT TCPDeviceObject = NULL; PDEVICE_OBJECT UDPDeviceObject = NULL; From 1825cf4a1526ac7f8acb771bf1d55a81aec25020 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Sat, 15 May 2004 08:01:56 +0000 Subject: [PATCH 1123/1463] Only split update region into client and non-client parts if there actually is something to split svn path=/trunk/; revision=9392 --- reactos/subsys/win32k/ntuser/painting.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/ntuser/painting.c b/reactos/subsys/win32k/ntuser/painting.c index ef23170da14..b72f6a2cc74 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.82 2004/05/10 17:07:18 weiden Exp $ + * $Id: painting.c,v 1.83 2004/05/15 08:01:56 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -286,6 +286,7 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags) * Split the nonclient update region. */ + if (NULL != Window->UpdateRegion) { HRGN hRgnWindow, hRgnNonClient; From 6952a5644fdd4332adfebae57a11d2f4596720d5 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 15 May 2004 08:52:25 +0000 Subject: [PATCH 1124/1463] - New implementation of GetDIBColorTable and SetDIBColorTable. svn path=/trunk/; revision=9393 --- reactos/lib/gdi32/misc/stubs.c | 18 +--- reactos/lib/gdi32/objects/dc.c | 16 ++++ reactos/subsys/win32k/objects/dib.c | 125 ++++++++++++++++++---------- 3 files changed, 96 insertions(+), 63 deletions(-) diff --git a/reactos/lib/gdi32/misc/stubs.c b/reactos/lib/gdi32/misc/stubs.c index 45b67f7c15d..36e80a40215 100644 --- a/reactos/lib/gdi32/misc/stubs.c +++ b/reactos/lib/gdi32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.60 2004/04/25 20:05:30 weiden Exp $ +/* $Id: stubs.c,v 1.61 2004/05/15 08:52:25 navaraf Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -753,22 +753,6 @@ AngleArc( } -/* - * @unimplemented - */ -UINT -STDCALL -GetDIBColorTable( - HDC hdc, - UINT a1, - UINT a2, - RGBQUAD *a3 - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented */ diff --git a/reactos/lib/gdi32/objects/dc.c b/reactos/lib/gdi32/objects/dc.c index 49c3d753705..9d5000a5292 100644 --- a/reactos/lib/gdi32/objects/dc.c +++ b/reactos/lib/gdi32/objects/dc.c @@ -807,6 +807,22 @@ CombineTransform( return NtGdiCombineTransform(lpxformResult, (CONST PXFORM)lpxform1, (CONST PXFORM)lpxform2); } +/* + * @implemented + */ +UINT +STDCALL +GetDIBColorTable( + HDC hdc, + UINT uStartIndex, + UINT cEntries, + RGBQUAD *pColors + ) +{ + DbgPrint("GetDIBColorTable\n"); + return NtGdiGetDIBColorTable(hdc, uStartIndex, cEntries, pColors); +} + /* * @implemented */ diff --git a/reactos/subsys/win32k/objects/dib.c b/reactos/subsys/win32k/objects/dib.c index cee18a7d035..7bc401baa5c 100644 --- a/reactos/subsys/win32k/objects/dib.c +++ b/reactos/subsys/win32k/objects/dib.c @@ -1,5 +1,5 @@ /* - * $Id: dib.c,v 1.46 2004/05/10 17:07:20 weiden Exp $ + * $Id: dib.c,v 1.47 2004/05/15 08:52:25 navaraf Exp $ * * ReactOS W32 Subsystem * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team @@ -20,51 +20,92 @@ */ #include <w32k.h> -UINT STDCALL NtGdiSetDIBColorTable(HDC hDC, - UINT StartIndex, - UINT Entries, - CONST RGBQUAD *Colors) +UINT STDCALL +NtGdiSetDIBColorTable(HDC hDC, UINT StartIndex, UINT Entries, CONST RGBQUAD *Colors) { - PDC dc; - PALETTEENTRY * palEntry; - PPALGDI palette; - const RGBQUAD *end; + PDC dc; + PBITMAPOBJ BitmapObj; - if (!(dc = DC_LockDc(hDC))) return 0; + if (!(dc = DC_LockDc(hDC))) return 0; - if (!(palette = PALETTE_LockPalette((ULONG)dc->DevInfo->hpalDefault))) - { - DC_UnlockDc(hDC); - return 0; - } + BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + if (BitmapObj == NULL) + { + DC_UnlockDc(hDC); + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return 0; + } - // Transfer color info + if (BitmapObj->dib == NULL) + { + BITMAPOBJ_UnlockBitmap(dc->w.hBitmap); + DC_UnlockDc(hDC); + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return 0; + } - if (dc->w.bitsPerPixel <= 8) - { - palEntry = palette->IndexedColors + StartIndex; - if (StartIndex + Entries > (UINT) (1 << dc->w.bitsPerPixel)) - Entries = (1 << dc->w.bitsPerPixel) - StartIndex; + if (BitmapObj->dib->dsBmih.biBitCount <= 8 && + StartIndex > (1 << BitmapObj->dib->dsBmih.biBitCount)) + { + if (StartIndex + Entries > (1 << BitmapObj->dib->dsBmih.biBitCount)) + Entries = (1 << BitmapObj->dib->dsBmih.biBitCount) - StartIndex; - if (StartIndex + Entries > palette->NumColors) - Entries = palette->NumColors - StartIndex; + MmCopyFromCaller(BitmapObj->ColorMap + StartIndex, Colors, Entries * sizeof(RGBQUAD)); - for (end = Colors + Entries; Colors < end; palEntry++, Colors++) - { - palEntry->peRed = Colors->rgbRed; - palEntry->peGreen = Colors->rgbGreen; - palEntry->peBlue = Colors->rgbBlue; - } - } - else - { - Entries = 0; - } + /* 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); + } + else + Entries = 0; - PALETTE_UnlockPalette(dc->DevInfo->hpalDefault); - DC_UnlockDc(hDC); + BITMAPOBJ_UnlockBitmap(dc->w.hBitmap); + DC_UnlockDc(hDC); - return Entries; + return Entries; +} + +UINT STDCALL +NtGdiGetDIBColorTable(HDC hDC, UINT StartIndex, UINT Entries, RGBQUAD *Colors) +{ + PDC dc; + PBITMAPOBJ BitmapObj; + + if (!(dc = DC_LockDc(hDC))) return 0; + + BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + if (BitmapObj == NULL) + { + DC_UnlockDc(hDC); + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return 0; + } + + if (BitmapObj->dib == NULL) + { + BITMAPOBJ_UnlockBitmap(dc->w.hBitmap); + DC_UnlockDc(hDC); + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return 0; + } + + if (BitmapObj->dib->dsBmih.biBitCount <= 8 && + StartIndex > (1 << BitmapObj->dib->dsBmih.biBitCount)) + { + if (StartIndex + Entries > (1 << BitmapObj->dib->dsBmih.biBitCount)) + Entries = (1 << BitmapObj->dib->dsBmih.biBitCount) - StartIndex; + + MmCopyToCaller(Colors, BitmapObj->ColorMap + StartIndex, Entries * sizeof(RGBQUAD)); + } + else + Entries = 0; + + BITMAPOBJ_UnlockBitmap(dc->w.hBitmap); + DC_UnlockDc(hDC); + + return Entries; } // Converts a DIB to a device-dependent bitmap @@ -250,14 +291,6 @@ NtGdiSetDIBitsToDevice( return 0; } -UINT STDCALL NtGdiGetDIBColorTable(HDC hDC, - UINT StartIndex, - UINT Entries, - RGBQUAD *Colors) -{ - UNIMPLEMENTED; -} - // Converts a device-dependent bitmap to a DIB #if 0 INT STDCALL NtGdiGetDIBits(HDC hDC, @@ -1021,7 +1054,7 @@ DIB_CreateDIBSection( UINT Entries = 0; BITMAP bm; - DPRINT("format (%ld,%ld), planes %d, bpp %d, size %ld, colors %ld (%s)\n", + DPRINT1("format (%ld,%ld), planes %d, bpp %d, size %ld, colors %ld (%s)\n", bi->biWidth, bi->biHeight, bi->biPlanes, bi->biBitCount, bi->biSizeImage, bi->biClrUsed, usage == DIB_PAL_COLORS? "PAL" : "RGB"); From bc072fb755baf09b75261f077d97e5a674dbe6bd Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 15 May 2004 08:53:06 +0000 Subject: [PATCH 1125/1463] - Recalculate the menu bar size when resizing window. svn path=/trunk/; revision=9394 --- reactos/lib/user32/windows/menu.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/reactos/lib/user32/windows/menu.c b/reactos/lib/user32/windows/menu.c index 54a779e0f4f..721ddb92d75 100644 --- a/reactos/lib/user32/windows/menu.c +++ b/reactos/lib/user32/windows/menu.c @@ -21,7 +21,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: menu.c,v 1.66 2004/05/13 20:21:27 navaraf Exp $ +/* $Id: menu.c,v 1.67 2004/05/15 08:53:06 navaraf Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/menu.c @@ -1628,10 +1628,7 @@ UINT MenuDrawMenuBar(HDC DC, LPRECT Rect, HWND Wnd, BOOL SuppressDraw) { FontOld = SelectObject(DC, hMenuFont); - if (0 == MenuInfo.Height) - { - MenuMenuBarCalcSize(DC, Rect, &MenuInfo, Wnd); - } + MenuMenuBarCalcSize(DC, Rect, &MenuInfo, Wnd); Rect->bottom = Rect->top + MenuInfo.Height; From 39fee6b8c74d2c97d814cf46751d63519137b73a Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sat, 15 May 2004 10:08:45 +0000 Subject: [PATCH 1126/1463] combobox popups should be always-on-top svn path=/trunk/; revision=9395 --- reactos/lib/user32/controls/combo.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/reactos/lib/user32/controls/combo.c b/reactos/lib/user32/controls/combo.c index 1bfa9cf32e2..d56cdbbb977 100644 --- a/reactos/lib/user32/controls/combo.c +++ b/reactos/lib/user32/controls/combo.c @@ -582,8 +582,14 @@ static LRESULT COMBO_Create( HWND hwnd, LPHEADCOMBO lphc, HWND hwndParent, LONG { lbeStyle &= ~WS_BORDER; lbeExStyle |= WS_EX_CLIENTEDGE; - } + } } + #ifdef __REACTOS__ + else + { + lbeExStyle |= (WS_EX_TOPMOST | WS_EX_TOOLWINDOW); + } + #endif /* __REACTOS__ */ if (unicode) lphc->hWndLBox = CreateWindowExW(lbeExStyle, clbName, NULL, lbeStyle, From 4e81b67c897b1959df91818d989ee4450d53285b Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 15 May 2004 11:20:38 +0000 Subject: [PATCH 1127/1463] - Use NtGdiBitBlt in NtGdiStretchDIBits if source and destination dimensions are equal. svn path=/trunk/; revision=9396 --- reactos/subsys/win32k/objects/dib.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/reactos/subsys/win32k/objects/dib.c b/reactos/subsys/win32k/objects/dib.c index 7bc401baa5c..e75047d9e0a 100644 --- a/reactos/subsys/win32k/objects/dib.c +++ b/reactos/subsys/win32k/objects/dib.c @@ -1,5 +1,5 @@ /* - * $Id: dib.c,v 1.47 2004/05/15 08:52:25 navaraf Exp $ + * $Id: dib.c,v 1.48 2004/05/15 11:20:38 navaraf Exp $ * * ReactOS W32 Subsystem * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team @@ -810,9 +810,13 @@ INT STDCALL NtGdiStretchDIBits(HDC hDC, BitsInfo->bmiHeader.biCompression == BI_RLE8) { /* copy existing bitmap from destination dc */ - NtGdiStretchBlt(hdcMem, XSrc, abs(BitsInfo->bmiHeader.biHeight) - SrcHeight - YSrc, - SrcWidth, SrcHeight, hDC, XDest, YDest, DestWidth, DestHeight, - ROP); + if (SrcWidth == DestWidth && SrcHeight == DestHeight) + NtGdiBitBlt(hdcMem, XSrc, abs(BitsInfo->bmiHeader.biHeight) - SrcHeight - YSrc, + SrcWidth, SrcHeight, hDC, XDest, YDest, ROP); + else + NtGdiStretchBlt(hdcMem, XSrc, abs(BitsInfo->bmiHeader.biHeight) - SrcHeight - YSrc, + SrcWidth, SrcHeight, hDC, XDest, YDest, DestWidth, DestHeight, + ROP); } NtGdiSetDIBits(hdcMem, hBitmap, 0, BitsInfo->bmiHeader.biHeight, Bits, @@ -820,9 +824,14 @@ INT STDCALL NtGdiStretchDIBits(HDC hDC, /* Origin for DIBitmap may be bottom left (positive biHeight) or top left (negative biHeight) */ - NtGdiStretchBlt(hDC, XDest, YDest, DestWidth, DestHeight, - hdcMem, XSrc, abs(BitsInfo->bmiHeader.biHeight) - SrcHeight - YSrc, - SrcWidth, SrcHeight, ROP); + if (SrcWidth == DestWidth && SrcHeight == DestHeight) + NtGdiBitBlt(hDC, XDest, YDest, DestWidth, DestHeight, + hdcMem, XSrc, abs(BitsInfo->bmiHeader.biHeight) - SrcHeight - YSrc, + ROP); + else + NtGdiStretchBlt(hDC, XDest, YDest, DestWidth, DestHeight, + hdcMem, XSrc, abs(BitsInfo->bmiHeader.biHeight) - SrcHeight - YSrc, + SrcWidth, SrcHeight, ROP); NtGdiSelectObject(hdcMem, hOldBitmap); NtGdiDeleteDC(hdcMem); From d1d7eaa06b054b1c4a8845599df31e37a1f80a96 Mon Sep 17 00:00:00 2001 From: Jason Filby <jason.filby@gmail.com> Date: Sat, 15 May 2004 12:56:53 +0000 Subject: [PATCH 1128/1463] Stub __badioinfo svn path=/trunk/; revision=9397 --- reactos/lib/msvcrt/Makefile | 3 ++- reactos/lib/msvcrt/io/stubs.c | 1 + reactos/lib/msvcrt/msvcrt.def | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 reactos/lib/msvcrt/io/stubs.c diff --git a/reactos/lib/msvcrt/Makefile b/reactos/lib/msvcrt/Makefile index 9cdc2cb18ca..381e1fe61d1 100644 --- a/reactos/lib/msvcrt/Makefile +++ b/reactos/lib/msvcrt/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.42 2004/01/01 17:08:38 sedwards Exp $ +# $Id: Makefile,v 1.43 2004/05/15 12:55:47 jfilby Exp $ PATH_TO_TOP = ../.. @@ -152,6 +152,7 @@ IO_OBJECTS = \ io/read.o \ io/setmode.o \ io/sopen.o \ + io/stubs.o \ io/tell.o \ io/telli64.o \ io/umask.o \ diff --git a/reactos/lib/msvcrt/io/stubs.c b/reactos/lib/msvcrt/io/stubs.c new file mode 100644 index 00000000000..aadc2411f4c --- /dev/null +++ b/reactos/lib/msvcrt/io/stubs.c @@ -0,0 +1 @@ +void *__badioinfo; diff --git a/reactos/lib/msvcrt/msvcrt.def b/reactos/lib/msvcrt/msvcrt.def index 102fa31fdeb..6bbe908bc8a 100644 --- a/reactos/lib/msvcrt/msvcrt.def +++ b/reactos/lib/msvcrt/msvcrt.def @@ -1,4 +1,4 @@ -; $Id: msvcrt.def,v 1.34 2004/04/08 17:53:30 gvg Exp $ +; $Id: msvcrt.def,v 1.35 2004/05/15 12:55:47 jfilby Exp $ ; ; ReactOS MSVCRT Compatibility Library ; @@ -107,7 +107,7 @@ __RTtypeid=MSVCRT___RTtypeid ;__STRINGTOLD __argc DATA __argv DATA -;__badioinfo +__badioinfo DATA __crtCompareStringA ;=NTDLL.RtlCompareString ;__crtGetLocaleInfoW __crtLCMapStringA From 2f7fa4426a1927dc0ce5562da9bf0de628b2e8ce Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Sat, 15 May 2004 14:26:08 +0000 Subject: [PATCH 1129/1463] Implement range list copy and delete functions. svn path=/trunk/; revision=9398 --- reactos/lib/ntdll/rtl/rangelist.c | 125 ++++++++++++++++++++++++++---- 1 file changed, 111 insertions(+), 14 deletions(-) diff --git a/reactos/lib/ntdll/rtl/rangelist.c b/reactos/lib/ntdll/rtl/rangelist.c index 413574e324e..b280bfa46cc 100644 --- a/reactos/lib/ntdll/rtl/rangelist.c +++ b/reactos/lib/ntdll/rtl/rangelist.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: rangelist.c,v 1.2 2004/05/14 12:11:52 ekohl Exp $ +/* $Id: rangelist.c,v 1.3 2004/05/15 14:26:08 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -124,29 +124,81 @@ RtlAddRange (IN OUT PRTL_RANGE_LIST RangeList, /* - * @unimplemented + * @implemented */ NTSTATUS STDCALL RtlCopyRangeList (OUT PRTL_RANGE_LIST CopyRangeList, IN PRTL_RANGE_LIST RangeList) { - return STATUS_NOT_IMPLEMENTED; + PRTL_RANGE_ENTRY Current; + PRTL_RANGE_ENTRY NewEntry; + PLIST_ENTRY Entry; + + CopyRangeList->Flags = RangeList->Flags; + + Entry = RangeList->ListHead.Flink; + while (Entry != &RangeList->ListHead) + { + Current = CONTAINING_RECORD (Entry, RTL_RANGE_ENTRY, Entry); + + NewEntry = RtlAllocateHeap (RtlGetProcessHeap(), + 0, + sizeof(RTL_RANGE_ENTRY)); + if (NewEntry == NULL) + return STATUS_INSUFFICIENT_RESOURCES; + + RtlCopyMemory (&NewEntry->Range, + &Current->Range, + sizeof(RTL_RANGE_ENTRY)); + + InsertTailList (&CopyRangeList->ListHead, + &NewEntry->Entry); + + CopyRangeList->Count++; + + Entry = Entry->Flink; + } + + CopyRangeList->Stamp++; + + return STATUS_SUCCESS; } /* - * @unimplemented + * @implemented */ NTSTATUS STDCALL RtlDeleteOwnersRanges (IN OUT PRTL_RANGE_LIST RangeList, IN PVOID Owner) { - return STATUS_NOT_IMPLEMENTED; + PRTL_RANGE_ENTRY Current; + PLIST_ENTRY Entry; + + Entry = RangeList->ListHead.Flink; + while (Entry != &RangeList->ListHead) + { + Current = CONTAINING_RECORD (Entry, RTL_RANGE_ENTRY, Entry); + if (Current->Range.Owner == Owner) + { + RemoveEntryList (Entry); + RtlFreeHeap (RtlGetProcessHeap(), + 0, + Current); + + RangeList->Count--; + RangeList->Stamp++; + } + + Entry = Entry->Flink; + } + + return STATUS_SUCCESS; } /* - * @unimplemented + * @implemented */ NTSTATUS STDCALL RtlDeleteRange (IN OUT PRTL_RANGE_LIST RangeList, @@ -154,7 +206,32 @@ RtlDeleteRange (IN OUT PRTL_RANGE_LIST RangeList, IN ULONGLONG End, IN PVOID Owner) { - return STATUS_NOT_IMPLEMENTED; + PRTL_RANGE_ENTRY Current; + PLIST_ENTRY Entry; + + Entry = RangeList->ListHead.Flink; + while (Entry != &RangeList->ListHead) + { + Current = CONTAINING_RECORD (Entry, RTL_RANGE_ENTRY, Entry); + if (Current->Range.Start == Start && + Current->Range.End == End && + Current->Range.Owner == Owner) + { + RemoveEntryList (Entry); + + RtlFreeHeap (RtlGetProcessHeap(), + 0, + Current); + + RangeList->Count--; + RangeList->Stamp++; + return STATUS_SUCCESS; + } + + Entry = Entry->Flink; + } + + return STATUS_RANGE_NOT_FOUND; } @@ -184,27 +261,23 @@ VOID STDCALL RtlFreeRangeList (IN PRTL_RANGE_LIST RangeList) { PLIST_ENTRY Entry; -#ifndef NDEBUG PRTL_RANGE_ENTRY Current; -#endif while (!IsListEmpty(&RangeList->ListHead)) { Entry = RemoveHeadList (&RangeList->ListHead); - -#ifndef NDEBUG Current = CONTAINING_RECORD (Entry, RTL_RANGE_ENTRY, Entry); + DPRINT ("Range start: %I64u\n", Current->Range.Start); DPRINT ("Range end: %I64u\n", Current->Range.End); -#endif RtlFreeHeap (RtlGetProcessHeap(), 0, - Entry); + Current); } + RangeList->Flags = 0; RangeList->Count = 0; - RangeList->Stamp++; } @@ -304,6 +377,30 @@ RtlIsRangeAvailable (IN PRTL_RANGE_LIST RangeList, IN PRTL_CONFLICT_RANGE_CALLBACK Callback OPTIONAL, OUT PBOOLEAN Available) { +#if 0 + PRTL_RANGE_ENTRY Current; + PLIST_ENTRY Entry; + + *Available = TRUE; + + Entry = RangeList->ListHead.Flink; + while (Entry != &RangeList->ListHead) + { + Current = CONTAINING_RECORD (Entry, RTL_RANGE_ENTRY, Entry); + if (!((Current->Range.Start > End && Current->Range.End > End) || + (Current->Range.Start < Start && Current->Range.End < Start))) + { + if (Callback != NULL) + Callback (Context, &Current->Range); + + *Available = FALSE; + } + + Entry = Entry->Flink; + } + + return STATUS_SUCCESS; +#endif return STATUS_NOT_IMPLEMENTED; } From 9fa3c615c741fc44a3f3c0c833182aac973bc130 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 15 May 2004 15:04:43 +0000 Subject: [PATCH 1130/1463] - Fixed cut & paste error in NtGdiGetDIBColorTable and NtGdiSetDIBColorTable. - Fixed implementation of DIB_MapPaletteColors. It shoud take palette from DC and the index array is of type PUSHORT, not PULONG. svn path=/trunk/; revision=9399 --- reactos/subsys/win32k/objects/dib.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/reactos/subsys/win32k/objects/dib.c b/reactos/subsys/win32k/objects/dib.c index e75047d9e0a..a3ff49d2a5e 100644 --- a/reactos/subsys/win32k/objects/dib.c +++ b/reactos/subsys/win32k/objects/dib.c @@ -1,5 +1,5 @@ /* - * $Id: dib.c,v 1.48 2004/05/15 11:20:38 navaraf Exp $ + * $Id: dib.c,v 1.49 2004/05/15 15:04:43 navaraf Exp $ * * ReactOS W32 Subsystem * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team @@ -45,7 +45,7 @@ NtGdiSetDIBColorTable(HDC hDC, UINT StartIndex, UINT Entries, CONST RGBQUAD *Col } if (BitmapObj->dib->dsBmih.biBitCount <= 8 && - StartIndex > (1 << BitmapObj->dib->dsBmih.biBitCount)) + StartIndex < (1 << BitmapObj->dib->dsBmih.biBitCount)) { if (StartIndex + Entries > (1 << BitmapObj->dib->dsBmih.biBitCount)) Entries = (1 << BitmapObj->dib->dsBmih.biBitCount) - StartIndex; @@ -92,7 +92,7 @@ NtGdiGetDIBColorTable(HDC hDC, UINT StartIndex, UINT Entries, RGBQUAD *Colors) } if (BitmapObj->dib->dsBmih.biBitCount <= 8 && - StartIndex > (1 << BitmapObj->dib->dsBmih.biBitCount)) + StartIndex < (1 << BitmapObj->dib->dsBmih.biBitCount)) { if (StartIndex + Entries > (1 << BitmapObj->dib->dsBmih.biBitCount)) Entries = (1 << BitmapObj->dib->dsBmih.biBitCount) - StartIndex; @@ -1063,7 +1063,7 @@ DIB_CreateDIBSection( UINT Entries = 0; BITMAP bm; - DPRINT1("format (%ld,%ld), planes %d, bpp %d, size %ld, colors %ld (%s)\n", + DPRINT("format (%ld,%ld), planes %d, bpp %d, size %ld, colors %ld (%s)\n", bi->biWidth, bi->biHeight, bi->biPlanes, bi->biBitCount, bi->biSizeImage, bi->biClrUsed, usage == DIB_PAL_COLORS? "PAL" : "RGB"); @@ -1095,7 +1095,8 @@ DIB_CreateDIBSection( /* bm.bmBits = ExAllocatePool(NonPagedPool, totalSize); */ - if(usage == DIB_PAL_COLORS) memcpy(bmi->bmiColors, (UINT *)DIB_MapPaletteColors(dc, bmi), sizeof(UINT *)); + if(usage == DIB_PAL_COLORS) + memcpy(bmi->bmiColors, (UINT *)DIB_MapPaletteColors(dc, bmi), sizeof(UINT *)); // Allocate Memory for DIB and fill structure if (bm.bmBits) @@ -1120,8 +1121,7 @@ DIB_CreateDIBSection( case 16: dib->dsBitfields[0] = (bi->biCompression == BI_BITFIELDS) ? *(DWORD *)bmi->bmiColors : 0x7c00; dib->dsBitfields[1] = (bi->biCompression == BI_BITFIELDS) ? *((DWORD *)bmi->bmiColors + 1) : 0x03e0; - dib->dsBitfields[2] = (bi->biCompression == BI_BITFIELDS) ? *((DWORD *)bmi->bmiColors + 2) : 0x001f; - break; + dib->dsBitfields[2] = (bi->biCompression == BI_BITFIELDS) ? *((DWORD *)bmi->bmiColors + 2) : 0x001f; break; case 24: dib->dsBitfields[0] = 0xff; @@ -1326,10 +1326,10 @@ DIB_MapPaletteColors(PDC dc, CONST BITMAPINFO* lpbmi) { RGBQUAD *lpRGB; ULONG nNumColors,i; - DWORD *lpIndex; + USHORT *lpIndex; PPALGDI palGDI; - palGDI = PALETTE_LockPalette(dc->DevInfo->hpalDefault); + palGDI = PALETTE_LockPalette(dc->w.hPalette); if (NULL == palGDI) { @@ -1344,7 +1344,7 @@ DIB_MapPaletteColors(PDC dc, CONST BITMAPINFO* lpbmi) } lpRGB = (RGBQUAD *)ExAllocatePoolWithTag(NonPagedPool, sizeof(RGBQUAD) * nNumColors, TAG_COLORMAP); - lpIndex = (DWORD *)&lpbmi->bmiColors[0]; + lpIndex = (USHORT *)&lpbmi->bmiColors[0]; for (i = 0; i < nNumColors; i++) { @@ -1354,7 +1354,7 @@ DIB_MapPaletteColors(PDC dc, CONST BITMAPINFO* lpbmi) lpIndex++; } // RELEASEDCINFO(hDC); - PALETTE_UnlockPalette(dc->DevInfo->hpalDefault); + PALETTE_UnlockPalette(dc->w.hPalette); return lpRGB; } From 1805ae924806e4876562becda39293d5a4eba34b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Sat, 15 May 2004 16:17:59 +0000 Subject: [PATCH 1131/1463] ASSERT() was a no-op in win32k, even for debug builds svn path=/trunk/; revision=9400 --- reactos/ntoskrnl/rtl/error.c | 24 ++++++++++++++++++------ reactos/subsys/win32k/ntuser/msgqueue.c | 4 ++-- reactos/subsys/win32k/w32k.h | 1 + 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/reactos/ntoskrnl/rtl/error.c b/reactos/ntoskrnl/rtl/error.c index dd40bf640bb..07bcef5c8f6 100644 --- a/reactos/ntoskrnl/rtl/error.c +++ b/reactos/ntoskrnl/rtl/error.c @@ -1,4 +1,4 @@ -/* $Id: error.c,v 1.11 2004/02/28 15:12:49 navaraf Exp $ +/* $Id: error.c,v 1.12 2004/05/15 16:17:59 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -840,11 +840,23 @@ RtlAssert(PVOID FailedAssertion, ULONG LineNumber, PCHAR Message) { - DbgPrint("Assertion \'%s\' failed at %s line %d: %s\n", - (PCHAR)FailedAssertion, - (PCHAR)FileName, - LineNumber, - Message); + if (NULL == Message) + { + DbgPrint("Assertion \'%s\' failed at %s line %d: %s\n", + (PCHAR)FailedAssertion, + (PCHAR)FileName, + LineNumber, + Message); + } + else + { + DbgPrint("Assertion \'%s\' failed at %s line %d\n", + (PCHAR)FailedAssertion, + (PCHAR)FileName, + LineNumber); + } + + DbgBreakPoint(); } diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index 5f9b8d8a065..6a9c218faed 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.95 2004/05/14 23:57:32 weiden Exp $ +/* $Id: msgqueue.c,v 1.96 2004/05/15 16:17:59 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -145,7 +145,7 @@ MsqInsertSystemMessage(MSG* Msg) while (mmov != SystemMessageQueueHead ) { ULONG prev = mmov ? mmov - 1 : SYSTEM_MESSAGE_QUEUE_SIZE - 1; - ASSERT(mmov >= 0); + ASSERT((LONG) mmov >= 0); ASSERT(mmov < SYSTEM_MESSAGE_QUEUE_SIZE); SystemMessageQueue[mmov] = SystemMessageQueue[prev]; mmov = prev; diff --git a/reactos/subsys/win32k/w32k.h b/reactos/subsys/win32k/w32k.h index ceb5e53a0a3..106e677cf1e 100644 --- a/reactos/subsys/win32k/w32k.h +++ b/reactos/subsys/win32k/w32k.h @@ -5,6 +5,7 @@ #define __WIN32K__ #define NTOS_MODE_KERNEL +#include <roscfg.h> #include <roskrnl.h> #include <ddk/winddi.h> From 75cf55e8b3fddf1ca7d5d7af73983e501ce7bf86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Sat, 15 May 2004 16:29:55 +0000 Subject: [PATCH 1132/1463] Test was backwards svn path=/trunk/; revision=9401 --- reactos/ntoskrnl/rtl/error.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/rtl/error.c b/reactos/ntoskrnl/rtl/error.c index 07bcef5c8f6..76393dfe531 100644 --- a/reactos/ntoskrnl/rtl/error.c +++ b/reactos/ntoskrnl/rtl/error.c @@ -1,4 +1,4 @@ -/* $Id: error.c,v 1.12 2004/05/15 16:17:59 gvg Exp $ +/* $Id: error.c,v 1.13 2004/05/15 16:29:55 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -840,7 +840,7 @@ RtlAssert(PVOID FailedAssertion, ULONG LineNumber, PCHAR Message) { - if (NULL == Message) + if (NULL != Message) { DbgPrint("Assertion \'%s\' failed at %s line %d: %s\n", (PCHAR)FailedAssertion, From 6387f49323f2864b98f7a81bf49870e5216f3823 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sat, 15 May 2004 18:20:26 +0000 Subject: [PATCH 1133/1463] removed #ifdef (due to wine sync) svn path=/trunk/; revision=9402 --- reactos/lib/user32/controls/combo.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/reactos/lib/user32/controls/combo.c b/reactos/lib/user32/controls/combo.c index d56cdbbb977..c8e5dfc2874 100644 --- a/reactos/lib/user32/controls/combo.c +++ b/reactos/lib/user32/controls/combo.c @@ -584,12 +584,10 @@ static LRESULT COMBO_Create( HWND hwnd, LPHEADCOMBO lphc, HWND hwndParent, LONG lbeExStyle |= WS_EX_CLIENTEDGE; } } - #ifdef __REACTOS__ else { lbeExStyle |= (WS_EX_TOPMOST | WS_EX_TOOLWINDOW); } - #endif /* __REACTOS__ */ if (unicode) lphc->hWndLBox = CreateWindowExW(lbeExStyle, clbName, NULL, lbeStyle, From fbef35d88454dc76557d7d34cc72536d2b39f25f Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sat, 15 May 2004 19:24:59 +0000 Subject: [PATCH 1134/1463] - Fixed the execution of batch files. svn path=/trunk/; revision=9403 --- reactos/lib/kernel32/process/create.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/reactos/lib/kernel32/process/create.c b/reactos/lib/kernel32/process/create.c index ff8158564a5..28c941c55e6 100644 --- a/reactos/lib/kernel32/process/create.c +++ b/reactos/lib/kernel32/process/create.c @@ -1,4 +1,4 @@ -/* $Id: create.c,v 1.83 2004/05/11 20:44:29 gvg Exp $ +/* $Id: create.c,v 1.84 2004/05/15 19:24:59 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -861,6 +861,7 @@ CreateProcessW BOOL InputDup, OutputDup, ErrorDup; WCHAR Name[MAX_PATH]; WCHAR *TidyCmdLine; + BOOL IsBatchFile = FALSE; DPRINT("CreateProcessW(lpApplicationName '%S', lpCommandLine '%S')\n", lpApplicationName, lpCommandLine); @@ -939,6 +940,7 @@ CreateProcessW if (e != NULL && (!_wcsicmp(e, L".bat") || !_wcsicmp(e, L".cmd"))) { // the command is a batch file + IsBatchFile = TRUE; if (lpApplicationName != NULL && lpApplicationName[0]) { // FIXME: use COMSPEC for the command interpreter @@ -978,10 +980,11 @@ CreateProcessW * Process the application name and command line */ RtlInitUnicodeString(&ImagePathName_U, ImagePathName); - RtlInitUnicodeString(&CommandLine_U, TidyCmdLine); + RtlInitUnicodeString(&CommandLine_U, IsBatchFile ? lpCommandLine : TidyCmdLine); - DPRINT("ImagePathName_U %S\n", ImagePathName_U.Buffer); - DPRINT("CommandLine_U %S\n", CommandLine_U.Buffer); + DPRINT("ImagePathName_U '%S'\n", ImagePathName_U.Buffer); + DPRINT("lpCommandLine '%S'\n", lpCommandLine); + DPRINT("TidyCmdLine '%S'\n", TidyCmdLine); /* Initialize the current directory string */ if (lpCurrentDirectory != NULL) From 9f5e3646856af01598a0e9be54b308d8406494a7 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Sat, 15 May 2004 19:39:35 +0000 Subject: [PATCH 1135/1463] Add range list status codes. svn path=/trunk/; revision=9404 --- reactos/include/ddk/status.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/reactos/include/ddk/status.h b/reactos/include/ddk/status.h index b605499b0d2..c8270a6ae4e 100644 --- a/reactos/include/ddk/status.h +++ b/reactos/include/ddk/status.h @@ -663,6 +663,9 @@ Note that !NT_SUCCESS(errCode) is NOT the same as NT_ERROR(errCode) #define STATUS_IO_REPARSE_DATA_INVALID ((NTSTATUS)0xc0000278) #define STATUS_IO_REPARSE_TAG_NOT_HANDLED ((NTSTATUS)0xc0000279) +#define STATUS_RANGE_LIST_CONFLICT ((NTSTATUS)0xC0000282) + +#define STATUS_RANGE_NOT_FOUND ((NTSTATUS)0xC000028C) #define STATUS_SAM_INIT_FAILURE ((NTSTATUS)0xC00002CB) From c0fb78df093ddef471c7309bfa9dc32187c1ee34 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Sat, 15 May 2004 19:41:10 +0000 Subject: [PATCH 1136/1463] Implement RtlIsRangeAvailable(). svn path=/trunk/; revision=9405 --- reactos/lib/ntdll/rtl/rangelist.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/reactos/lib/ntdll/rtl/rangelist.c b/reactos/lib/ntdll/rtl/rangelist.c index b280bfa46cc..dca953c8a48 100644 --- a/reactos/lib/ntdll/rtl/rangelist.c +++ b/reactos/lib/ntdll/rtl/rangelist.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: rangelist.c,v 1.3 2004/05/15 14:26:08 ekohl Exp $ +/* $Id: rangelist.c,v 1.4 2004/05/15 19:41:10 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -365,7 +365,10 @@ RtlInvertRangeList (OUT PRTL_RANGE_LIST InvertedRangeList, /* - * @unimplemented + * TODO: + * - honor Flags and AttributeAvailableMask. + * + * @implemented */ NTSTATUS STDCALL RtlIsRangeAvailable (IN PRTL_RANGE_LIST RangeList, @@ -377,7 +380,6 @@ RtlIsRangeAvailable (IN PRTL_RANGE_LIST RangeList, IN PRTL_CONFLICT_RANGE_CALLBACK Callback OPTIONAL, OUT PBOOLEAN Available) { -#if 0 PRTL_RANGE_ENTRY Current; PLIST_ENTRY Entry; @@ -391,17 +393,20 @@ RtlIsRangeAvailable (IN PRTL_RANGE_LIST RangeList, (Current->Range.Start < Start && Current->Range.End < Start))) { if (Callback != NULL) - Callback (Context, &Current->Range); - - *Available = FALSE; + { + *Available = Callback (Context, + &Current->Range); + } + else + { + *Available = FALSE; + } } Entry = Entry->Flink; } return STATUS_SUCCESS; -#endif - return STATUS_NOT_IMPLEMENTED; } From 4b6ab2d1c6c17b85e89cf18dd4a9ad5dcb6ff2fd Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sat, 15 May 2004 20:19:20 +0000 Subject: [PATCH 1137/1463] removed assertion svn path=/trunk/; revision=9406 --- reactos/subsys/win32k/objects/cliprgn.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/objects/cliprgn.c b/reactos/subsys/win32k/objects/cliprgn.c index bab184e0dff..5a565624555 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.38 2004/05/14 16:55:18 navaraf Exp $ */ +/* $Id: cliprgn.c,v 1.39 2004/05/15 20:19:20 weiden Exp $ */ #include <w32k.h> VOID FASTCALL @@ -24,7 +24,6 @@ CLIPPING_UpdateGCRegion(DC* Dc) { PROSRGNDATA CombinedRegion; - ASSERT(Dc->w.hGCClipRgn != NULL); if (Dc->w.hGCClipRgn == NULL) Dc->w.hGCClipRgn = NtGdiCreateRectRgn(0, 0, 0, 0); From aa82813f06f5a67d1acc0458d657a72d1d209c9e Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sat, 15 May 2004 20:25:09 +0000 Subject: [PATCH 1138/1463] - Simplified the converting of environment variables. svn path=/trunk/; revision=9407 --- reactos/lib/kernel32/process/create.c | 313 ++++++++++++-------------- 1 file changed, 142 insertions(+), 171 deletions(-) diff --git a/reactos/lib/kernel32/process/create.c b/reactos/lib/kernel32/process/create.c index 28c941c55e6..2daf02012a9 100644 --- a/reactos/lib/kernel32/process/create.c +++ b/reactos/lib/kernel32/process/create.c @@ -1,4 +1,4 @@ -/* $Id: create.c,v 1.84 2004/05/15 19:24:59 hbirr Exp $ +/* $Id: create.c,v 1.85 2004/05/15 20:25:09 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -100,19 +100,16 @@ VOID STDCALL RtlRosR32AttribsToNativeAttribsNamed /* * @implemented */ -BOOL STDCALL CreateProcessA -( - LPCSTR lpApplicationName, - LPSTR lpCommandLine, - LPSECURITY_ATTRIBUTES lpProcessAttributes, - LPSECURITY_ATTRIBUTES lpThreadAttributes, - BOOL bInheritHandles, - DWORD dwCreationFlags, - LPVOID lpEnvironment, - LPCSTR lpCurrentDirectory, - LPSTARTUPINFOA lpStartupInfo, - LPPROCESS_INFORMATION lpProcessInformation -) +BOOL STDCALL CreateProcessA(LPCSTR lpApplicationName, + LPSTR lpCommandLine, + LPSECURITY_ATTRIBUTES lpProcessAttributes, + LPSECURITY_ATTRIBUTES lpThreadAttributes, + BOOL bInheritHandles, + DWORD dwCreationFlags, + LPVOID lpEnvironment, + LPCSTR lpCurrentDirectory, + LPSTARTUPINFOA lpStartupInfo, + LPPROCESS_INFORMATION lpProcessInformation) /* * FUNCTION: The CreateProcess function creates a new process and its * primary thread. The new process executes the specified executable file @@ -130,185 +127,159 @@ BOOL STDCALL CreateProcessA * lpProcessInformation = Pointer to process information */ { - PWCHAR pwcEnv = NULL; - UNICODE_STRING wstrApplicationName; - UNICODE_STRING wstrCurrentDirectory; - UNICODE_STRING wstrCommandLine; - UNICODE_STRING wstrReserved; - UNICODE_STRING wstrDesktop; - UNICODE_STRING wstrTitle; - ANSI_STRING strApplicationName; - ANSI_STRING strCurrentDirectory; - ANSI_STRING strCommandLine; - ANSI_STRING strReserved; - ANSI_STRING strDesktop; - ANSI_STRING strTitle; - BOOL bRetVal; - STARTUPINFOW wsiStartupInfo; + UNICODE_STRING wstrApplicationName; + UNICODE_STRING wstrCurrentDirectory; + UNICODE_STRING wstrCommandLine; + UNICODE_STRING wstrReserved; + UNICODE_STRING wstrDesktop; + UNICODE_STRING wstrTitle; + UNICODE_STRING wstrEnvVar; + ANSI_STRING strApplicationName; + ANSI_STRING strCurrentDirectory; + ANSI_STRING strCommandLine; + ANSI_STRING strReserved; + ANSI_STRING strDesktop; + ANSI_STRING strTitle; + BOOL bRetVal; + STARTUPINFOW wsiStartupInfo; - NTSTATUS STDCALL_FUNC (*pTrue) - ( - UNICODE_STRING *, - ANSI_STRING *, - BOOLEAN - ); + NTSTATUS STDCALL_FUNC (*pTrue) + ( + UNICODE_STRING *, + ANSI_STRING *, + BOOLEAN + ); - ULONG STDCALL_FUNC (*pRtlMbStringToUnicodeSize)(ANSI_STRING *); + ULONG STDCALL_FUNC (*pRtlMbStringToUnicodeSize)(ANSI_STRING *); - DPRINT("CreateProcessA(%s)\n", lpApplicationName); + DPRINT("dwCreationFlags %x, lpEnvironment %x, lpCurrentDirectory %x, " + "lpStartupInfo %x, lpProcessInformation %x\n", + dwCreationFlags, lpEnvironment, lpCurrentDirectory, + lpStartupInfo, lpProcessInformation); - DPRINT - ( - "dwCreationFlags %x, lpEnvironment %x, lpCurrentDirectory %x, " - "lpStartupInfo %x, lpProcessInformation %x\n", - dwCreationFlags, - lpEnvironment, - lpCurrentDirectory, - lpStartupInfo, - lpProcessInformation - ); + /* multibyte strings are ANSI */ + if(bIsFileApiAnsi) + { + pTrue = RtlAnsiStringToUnicodeString; + pRtlMbStringToUnicodeSize = RtlAnsiStringToUnicodeSize; + } + /* multibyte strings are OEM */ + else + { + pTrue = RtlOemStringToUnicodeString; + pRtlMbStringToUnicodeSize = RtlOemStringToUnicodeSize; + } - /* invalid parameter */ - if(lpStartupInfo == NULL) - { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } + /* invalid parameter */ + if(lpStartupInfo == NULL) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } - /* multibyte strings are ANSI */ - if(bIsFileApiAnsi) - { - pTrue = RtlAnsiStringToUnicodeString; - pRtlMbStringToUnicodeSize = RtlAnsiStringToUnicodeSize; - } - /* multibyte strings are OEM */ - else - { - pTrue = RtlOemStringToUnicodeString; - pRtlMbStringToUnicodeSize = RtlOemStringToUnicodeSize; - } + /* convert the environment */ + if(lpEnvironment && !(dwCreationFlags & CREATE_UNICODE_ENVIRONMENT)) + { + PCHAR pcScan; + SIZE_T nEnvLen = 0; + ANSI_STRING strEnvVar; + NTSTATUS Status; - /* convert the environment */ - if(lpEnvironment && !(dwCreationFlags & CREATE_UNICODE_ENVIRONMENT)) - { - PCHAR pcScan; - SIZE_T nEnvLen = 0; - UNICODE_STRING wstrEnvVar; - ANSI_STRING strEnvVar; + /* scan the environment to calculate its Unicode size */ + pcScan = lpEnvironment; + do + { + pcScan += strlen(pcScan) + 1; + } + while (*pcScan); - /* scan the environment to calculate its Unicode size */ - for(pcScan = lpEnvironment; *pcScan; pcScan += strEnvVar.Length + sizeof(char)) - { - /* add the size of the current variable */ - RtlInitAnsiString(&strEnvVar, pcScan); - nEnvLen += pRtlMbStringToUnicodeSize(&strEnvVar) + sizeof(WCHAR); - } + nEnvLen = (ULONG_PTR)pcScan - (ULONG_PTR)lpEnvironment + 1; + + /* environment too large */ + if(nEnvLen > ~((USHORT)0)) + { + SetLastError(ERROR_OUTOFMEMORY); + return FALSE; + } - /* add the size of the final NUL character */ - nEnvLen += sizeof(WCHAR); + strEnvVar.Buffer = lpEnvironment; + strEnvVar.MaximumLength = strEnvVar.Length = nEnvLen; - /* environment too large */ - if(nEnvLen > ~((USHORT)0)) - { - SetLastError(ERROR_OUTOFMEMORY); - return FALSE; - } + Status = K32MbStrToWcStr(pTrue, &wstrEnvVar, &strEnvVar, TRUE); - /* allocate the Unicode environment */ - pwcEnv = (PWCHAR)RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, nEnvLen); + /* failure */ + if (!NT_SUCCESS(Status)) + { + SetLastError(ERROR_OUTOFMEMORY); + return FALSE; + } + } + - /* failure */ - if(pwcEnv == NULL) - { - SetLastError(ERROR_OUTOFMEMORY); - return FALSE; - } + /* convert the strings */ + RtlInitAnsiString(&strCommandLine, lpCommandLine); + RtlInitAnsiString(&strApplicationName, (LPSTR)lpApplicationName); + RtlInitAnsiString(&strCurrentDirectory, (LPSTR)lpCurrentDirectory); + RtlInitAnsiString(&strReserved, (LPSTR)lpStartupInfo->lpReserved); + RtlInitAnsiString(&strDesktop, (LPSTR)lpStartupInfo->lpDesktop); + RtlInitAnsiString(&strTitle, (LPSTR)lpStartupInfo->lpTitle); - wstrEnvVar.Buffer = pwcEnv; - wstrEnvVar.Length = 0; - wstrEnvVar.MaximumLength = nEnvLen; + K32MbStrToWcStr(pTrue, &wstrCommandLine, &strCommandLine, TRUE); + K32MbStrToWcStr(pTrue, &wstrApplicationName, &strApplicationName, TRUE); + K32MbStrToWcStr(pTrue, &wstrCurrentDirectory, &strCurrentDirectory, TRUE); + K32MbStrToWcStr(pTrue, &wstrReserved, &strReserved, TRUE); + K32MbStrToWcStr(pTrue, &wstrDesktop, &strDesktop, TRUE); + K32MbStrToWcStr(pTrue, &wstrTitle, &strTitle, TRUE); - /* scan the environment to convert it */ - for(pcScan = lpEnvironment; *pcScan; pcScan += strEnvVar.Length + sizeof(char)) - { - /* convert the current variable */ - RtlInitAnsiString(&strEnvVar, pcScan); - K32MbStrToWcStr(pTrue, &wstrEnvVar, &strEnvVar, FALSE); + /* convert the startup information */ + memcpy(&wsiStartupInfo, lpStartupInfo, sizeof(wsiStartupInfo)); - /* advance the buffer to the next variable */ - wstrEnvVar.Buffer += (wstrEnvVar.Length / sizeof(WCHAR) + 1); - wstrEnvVar.MaximumLength -= (wstrEnvVar.Length + sizeof(WCHAR)); - wstrEnvVar.Length = 0; - } + wsiStartupInfo.lpReserved = wstrReserved.Buffer; + wsiStartupInfo.lpDesktop = wstrDesktop.Buffer; + wsiStartupInfo.lpTitle = wstrTitle.Buffer; - /* final NUL character */ - wstrEnvVar.Buffer[0] = 0; - } + DPRINT("wstrApplicationName %wZ\n", &wstrApplicationName); + DPRINT("wstrCommandLine %wZ\n", &wstrCommandLine); + DPRINT("wstrCurrentDirectory %wZ\n", &wstrCurrentDirectory); + DPRINT("wstrReserved %wZ\n", &wstrReserved); + DPRINT("wstrDesktop %wZ\n", &wstrDesktop); + DPRINT("wstrTitle %wZ\n", &wstrTitle); - /* convert the strings */ - RtlInitAnsiString(&strCommandLine, lpCommandLine); - RtlInitAnsiString(&strApplicationName, (LPSTR)lpApplicationName); - RtlInitAnsiString(&strCurrentDirectory, (LPSTR)lpCurrentDirectory); - RtlInitAnsiString(&strReserved, (LPSTR)lpStartupInfo->lpReserved); - RtlInitAnsiString(&strDesktop, (LPSTR)lpStartupInfo->lpDesktop); - RtlInitAnsiString(&strTitle, (LPSTR)lpStartupInfo->lpTitle); + DPRINT("wstrApplicationName.Buffer %p\n", wstrApplicationName.Buffer); + DPRINT("wstrCommandLine.Buffer %p\n", wstrCommandLine.Buffer); + DPRINT("wstrCurrentDirectory.Buffer %p\n", wstrCurrentDirectory.Buffer); + DPRINT("wstrReserved.Buffer %p\n", wstrReserved.Buffer); + DPRINT("wstrDesktop.Buffer %p\n", wstrDesktop.Buffer); + DPRINT("wstrTitle.Buffer %p\n", wstrTitle.Buffer); - K32MbStrToWcStr(pTrue, &wstrCommandLine, &strCommandLine, TRUE); - K32MbStrToWcStr(pTrue, &wstrApplicationName, &strApplicationName, TRUE); - K32MbStrToWcStr(pTrue, &wstrCurrentDirectory, &strCurrentDirectory, TRUE); - K32MbStrToWcStr(pTrue, &wstrReserved, &strReserved, TRUE); - K32MbStrToWcStr(pTrue, &wstrDesktop, &strDesktop, TRUE); - K32MbStrToWcStr(pTrue, &wstrTitle, &strTitle, TRUE); + DPRINT("sizeof(STARTUPINFOA) %lu\n", sizeof(STARTUPINFOA)); + DPRINT("sizeof(STARTUPINFOW) %lu\n", sizeof(STARTUPINFOW)); - /* convert the startup information */ - memcpy(&wsiStartupInfo, lpStartupInfo, sizeof(wsiStartupInfo)); + /* call the Unicode function */ + bRetVal = CreateProcessW(wstrApplicationName.Buffer, + wstrCommandLine.Buffer, + lpProcessAttributes, + lpThreadAttributes, + bInheritHandles, + dwCreationFlags, + !lpEnvironment || (dwCreationFlags & CREATE_UNICODE_ENVIRONMENT) ? lpEnvironment : wstrEnvVar.Buffer, + wstrCurrentDirectory.Buffer, + &wsiStartupInfo, + lpProcessInformation); - wsiStartupInfo.lpReserved = wstrReserved.Buffer; - wsiStartupInfo.lpDesktop = wstrDesktop.Buffer; - wsiStartupInfo.lpTitle = wstrTitle.Buffer; + RtlFreeUnicodeString(&wstrApplicationName); + RtlFreeUnicodeString(&wstrCommandLine); + RtlFreeUnicodeString(&wstrCurrentDirectory); + RtlFreeUnicodeString(&wstrReserved); + RtlFreeUnicodeString(&wstrDesktop); + RtlFreeUnicodeString(&wstrTitle); - DPRINT("wstrApplicationName %wZ\n", &wstrApplicationName); - DPRINT("wstrCommandLine %wZ\n", &wstrCommandLine); - DPRINT("wstrCurrentDirectory %wZ\n", &wstrCurrentDirectory); - DPRINT("wstrReserved %wZ\n", &wstrReserved); - DPRINT("wstrDesktop %wZ\n", &wstrDesktop); - DPRINT("wstrTitle %wZ\n", &wstrTitle); + if (lpEnvironment && !(dwCreationFlags & CREATE_UNICODE_ENVIRONMENT)) + { + RtlFreeUnicodeString(&wstrEnvVar); + } - DPRINT("wstrApplicationName.Buffer %p\n", wstrApplicationName.Buffer); - DPRINT("wstrCommandLine.Buffer %p\n", wstrCommandLine.Buffer); - DPRINT("wstrCurrentDirectory.Buffer %p\n", wstrCurrentDirectory.Buffer); - DPRINT("wstrReserved.Buffer %p\n", wstrReserved.Buffer); - DPRINT("wstrDesktop.Buffer %p\n", wstrDesktop.Buffer); - DPRINT("wstrTitle.Buffer %p\n", wstrTitle.Buffer); - - DPRINT("sizeof(STARTUPINFOA) %lu\n", sizeof(STARTUPINFOA)); - DPRINT("sizeof(STARTUPINFOW) %lu\n", sizeof(STARTUPINFOW)); - - /* call the Unicode function */ - bRetVal = CreateProcessW - ( - wstrApplicationName.Buffer, - wstrCommandLine.Buffer, - lpProcessAttributes, - lpThreadAttributes, - bInheritHandles, - dwCreationFlags, - dwCreationFlags & CREATE_UNICODE_ENVIRONMENT ? lpEnvironment : pwcEnv, - wstrCurrentDirectory.Buffer, - &wsiStartupInfo, - lpProcessInformation - ); - - RtlFreeUnicodeString(&wstrApplicationName); - RtlFreeUnicodeString(&wstrCommandLine); - RtlFreeUnicodeString(&wstrCurrentDirectory); - RtlFreeUnicodeString(&wstrReserved); - RtlFreeUnicodeString(&wstrDesktop); - RtlFreeUnicodeString(&wstrTitle); - - RtlFreeHeap(GetProcessHeap(), 0, pwcEnv); - - return bRetVal; + return bRetVal; } From 0dbe70cad701e9f01ee7f34bcfe7c3c908253764 Mon Sep 17 00:00:00 2001 From: Jason Filby <jason.filby@gmail.com> Date: Sat, 15 May 2004 20:30:19 +0000 Subject: [PATCH 1139/1463] Eng memory test svn path=/trunk/; revision=9408 --- reactos/subsys/win32k/tests/makefile | 4 +- reactos/subsys/win32k/tests/tests/eng-mem-1.c | 53 +++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 reactos/subsys/win32k/tests/tests/eng-mem-1.c diff --git a/reactos/subsys/win32k/tests/makefile b/reactos/subsys/win32k/tests/makefile index 24b4b17984a..3beaf27bb8b 100644 --- a/reactos/subsys/win32k/tests/makefile +++ b/reactos/subsys/win32k/tests/makefile @@ -6,7 +6,9 @@ TARGET_NAME = regtests TARGET_LIBPATH = . -TARGET_CFLAGS = -I$(REGTESTS_PATH_INC) +TARGET_CFLAGS = -I$(REGTESTS_PATH_INC) \ + -D__USE_W32API \ + -D_WIN32K_ -include Makefile.tests diff --git a/reactos/subsys/win32k/tests/tests/eng-mem-1.c b/reactos/subsys/win32k/tests/tests/eng-mem-1.c new file mode 100644 index 00000000000..07985e141c1 --- /dev/null +++ b/reactos/subsys/win32k/tests/tests/eng-mem-1.c @@ -0,0 +1,53 @@ +#include <ddk/ntddk.h> +#include <ddk/winddi.h> + +#include "regtests.h" + +static int RunTest(char *Buffer) +{ + VOID *pmem1, *pmem2; + ULONG AllocSize1, AllocSize2; + ULONG AllocTag1, AllocTag2; + HANDLE Handle1, Handle2; + + /* Allocate memory with EngAllocMem */ + pmem1 = 0; + AllocSize1 = 1024; + AllocTag1 = "zyxD"; + pmem1 = EngAllocMem(FL_ZERO_MEMORY, AllocSize1, AllocTag1); + FAIL_IF_EQUAL(pmem1, 0, "EngAllocMem() for pmem1 failed"); + + /* Allocate memory with EngAllocMem */ + pmem2 = 0; + AllocSize2 = 1024; + AllocTag2 = "zyxD"; + pmem2 = EngAllocUserMem(AllocSize2, AllocTag2); + FAIL_IF_EQUAL(pmem1, 0, "EngAllocUserMem() for pmem2 failed"); + + /* Lock down memory with EngSecureMem + ** Dependant functions in ntoskrnl.exe are currently unimplemented + Handle1 = EngSecureMem(pmem1, AllocSize1); + FAIL_IF_NULL(pmem1, "EngSecureMem() for pmem1 failed"); + Handle2 = EngSecureMem(pmem2, AllocSize2); + FAIL_IF_NULL(pmem2, "EngSecureMem() for pmem2 failed"); */ + + /* Unlock down memory with EngSecureMem + ** Dependant functions in ntoskrnl.exe are currently unimplemented + EngUnsecureMem(Handle1); + EngUnsecureMem(Handle2); */ + + /* Free memory with EngFreeMem */ + EngFreeMem(pmem1); + + /* Free memory with EngFreeUserMem */ + EngFreeUserMem(pmem2); + + return TS_OK; +} + +int +Eng_mem_1Test(int Command, char *Buffer) +{ + DISPATCHER("Win32k Engine Memory API"); +} + From bdd1e9e8c6c098ac3eb9681abc6aeb835b493476 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sat, 15 May 2004 22:45:51 +0000 Subject: [PATCH 1140/1463] - Fixed the implementation of MmMapIoSpace. svn path=/trunk/; revision=9409 --- reactos/apps/utils/pice/module/hercules.c | 2 +- reactos/apps/utils/pice/module/vga.c | 4 +- reactos/drivers/bus/acpi/ospm/osl.c | 2 +- reactos/drivers/dd/blue/blue.c | 4 +- reactos/drivers/dd/bootvid/bootvid.c | 4 +- reactos/drivers/net/ndis/ndis/io.c | 4 +- reactos/drivers/storage/scsiport/scsiport.c | 4 +- reactos/drivers/video/videoprt/resource.c | 4 +- reactos/hal/halx86/halinit.c | 4 +- reactos/include/ddk/mmfuncs.h | 4 +- reactos/ntoskrnl/mm/iospace.c | 61 ++++++++++----------- 11 files changed, 47 insertions(+), 50 deletions(-) diff --git a/reactos/apps/utils/pice/module/hercules.c b/reactos/apps/utils/pice/module/hercules.c index b65c1ca3795..045f89eee11 100644 --- a/reactos/apps/utils/pice/module/hercules.c +++ b/reactos/apps/utils/pice/module/hercules.c @@ -441,7 +441,7 @@ BOOLEAN ConsoleInitHercules(void) attr.u.Asuchar = 0x07; FrameBuffer.u.LowPart = 0xb0000; - pScreenBufferHercules=MmMapIoSpace(FrameBuffer,FRAMEBUFFER_SIZE,FALSE); + pScreenBufferHercules=MmMapIoSpace(FrameBuffer,FRAMEBUFFER_SIZE,MmNonCached); DPRINT((0,"VGA memory phys. 0xb0000 mapped to virt. 0x%x\n",pScreenBufferHercules)); diff --git a/reactos/apps/utils/pice/module/vga.c b/reactos/apps/utils/pice/module/vga.c index 4e2e8c0c7ed..88d60f69a48 100644 --- a/reactos/apps/utils/pice/module/vga.c +++ b/reactos/apps/utils/pice/module/vga.c @@ -516,11 +516,11 @@ BOOLEAN ConsoleInitVga(void) // the real framebuffer FrameBuffer.u.LowPart = 0xB8000; - pScreenBufferHardwareVga = MmMapIoSpace(FrameBuffer,SCREEN_BUFFER_SIZE,FALSE); + pScreenBufferHardwareVga = MmMapIoSpace(FrameBuffer,SCREEN_BUFFER_SIZE,MmNonCached); //The real font buffer FontBuffer.u.LowPart = 0xA0000; - pFontBufferVga = MmMapIoSpace(FontBuffer,FONTBUFFERSIZE,FALSE); + pFontBufferVga = MmMapIoSpace(FontBuffer,FONTBUFFERSIZE,MmNonCached); // the console pScreenBufferVga = PICE_malloc(SCREEN_BUFFER_SIZE,NONPAGEDPOOL); diff --git a/reactos/drivers/bus/acpi/ospm/osl.c b/reactos/drivers/bus/acpi/ospm/osl.c index 843f819873e..ead0fc480b9 100644 --- a/reactos/drivers/bus/acpi/ospm/osl.c +++ b/reactos/drivers/bus/acpi/ospm/osl.c @@ -148,7 +148,7 @@ acpi_os_map_memory(ACPI_PHYSICAL_ADDRESS phys, u32 size, void **virt) } Address.QuadPart = (ULONG)phys; - *virt = MmMapIoSpace(Address, size, FALSE); + *virt = MmMapIoSpace(Address, size, MmNonCached); if (!*virt) return AE_ERROR; diff --git a/reactos/drivers/dd/blue/blue.c b/reactos/drivers/dd/blue/blue.c index b3555163150..0c624211945 100644 --- a/reactos/drivers/dd/blue/blue.c +++ b/reactos/drivers/dd/blue/blue.c @@ -1,4 +1,4 @@ -/* $Id: blue.c,v 1.45 2004/05/10 18:02:19 gvg Exp $ +/* $Id: blue.c,v 1.46 2004/05/15 22:45:50 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -129,7 +129,7 @@ ScrCreate(PDEVICE_OBJECT DeviceObject, /* get pointer to video memory */ BaseAddress.QuadPart = VIDMEM_BASE; DeviceExtension->VideoMemory = - (PBYTE)MmMapIoSpace (BaseAddress, DeviceExtension->Rows * DeviceExtension->Columns * 2, FALSE); + (PBYTE)MmMapIoSpace (BaseAddress, DeviceExtension->Rows * DeviceExtension->Columns * 2, MmNonCached); DeviceExtension->CursorSize = 5; /* FIXME: value correct?? */ DeviceExtension->CursorVisible = TRUE; diff --git a/reactos/drivers/dd/bootvid/bootvid.c b/reactos/drivers/dd/bootvid/bootvid.c index 43fc854ac46..9bd76b5d29c 100644 --- a/reactos/drivers/dd/bootvid/bootvid.c +++ b/reactos/drivers/dd/bootvid/bootvid.c @@ -18,7 +18,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: bootvid.c,v 1.7 2004/03/04 18:55:08 navaraf Exp $ + * $Id: bootvid.c,v 1.8 2004/05/15 22:45:50 hbirr Exp $ */ /* INCLUDES ******************************************************************/ @@ -123,7 +123,7 @@ InbvMapVideoMemory(VOID) PHYSICAL_ADDRESS PhysicalAddress; PhysicalAddress.QuadPart = 0xA0000; - VideoMemory = MmMapIoSpace(PhysicalAddress, 0x10000, FALSE); + VideoMemory = MmMapIoSpace(PhysicalAddress, 0x10000, MmNonCached); return VideoMemory != NULL; } diff --git a/reactos/drivers/net/ndis/ndis/io.c b/reactos/drivers/net/ndis/ndis/io.c index 0ec3e106a95..40adb6d172b 100644 --- a/reactos/drivers/net/ndis/ndis/io.c +++ b/reactos/drivers/net/ndis/ndis/io.c @@ -714,7 +714,7 @@ NdisMMapIoSpace( PAGED_CODE(); ASSERT(VirtualAddress && MiniportAdapterHandle); - *VirtualAddress = MmMapIoSpace(PhysicalAddress, Length, FALSE); + *VirtualAddress = MmMapIoSpace(PhysicalAddress, Length, MmNonCached); if(!*VirtualAddress) return NDIS_STATUS_RESOURCES; @@ -887,7 +887,7 @@ NdisMRegisterIoPortRange( NDIS_DbgPrint(MAX_TRACE, ("calling MmMapIoSpace\n")); *PortOffset = 0; - *PortOffset = MmMapIoSpace(TranslatedAddress, NumberOfPorts, 0); + *PortOffset = MmMapIoSpace(TranslatedAddress, NumberOfPorts, MmNonCached); NDIS_DbgPrint(MAX_TRACE, ("Returning 0x%x for port range\n", *PortOffset)); if(!*PortOffset) diff --git a/reactos/drivers/storage/scsiport/scsiport.c b/reactos/drivers/storage/scsiport/scsiport.c index d296117e133..9ba439dd777 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.55 2004/04/23 14:29:07 hbirr Exp $ +/* $Id: scsiport.c,v 1.56 2004/05/15 22:45:50 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -346,7 +346,7 @@ ScsiPortGetDeviceBase(IN PVOID HwDeviceExtension, MappedAddress = MmMapIoSpace(TranslatedAddress, NumberOfBytes, - FALSE); + MmNonCached); DeviceBase = ExAllocatePool(NonPagedPool, sizeof(SCSI_PORT_DEVICE_BASE)); diff --git a/reactos/drivers/video/videoprt/resource.c b/reactos/drivers/video/videoprt/resource.c index d37e5f82cb7..947d40cea8b 100644 --- a/reactos/drivers/video/videoprt/resource.c +++ b/reactos/drivers/video/videoprt/resource.c @@ -18,7 +18,7 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: resource.c,v 1.2 2004/03/19 20:58:32 navaraf Exp $ + * $Id: resource.c,v 1.3 2004/05/15 22:45:51 hbirr Exp $ */ #include "videoprt.h" @@ -99,7 +99,7 @@ IntVideoPortMapMemory( MappedAddress = MmMapIoSpace( TranslatedAddress, NumberOfUchars, - FALSE); + MmNonCached); if (MappedAddress) { diff --git a/reactos/hal/halx86/halinit.c b/reactos/hal/halx86/halinit.c index c1986c12948..4d5936f030e 100644 --- a/reactos/hal/halx86/halinit.c +++ b/reactos/hal/halx86/halinit.c @@ -1,4 +1,4 @@ -/* $Id: halinit.c,v 1.7 2004/03/18 19:58:35 dwelch Exp $ +/* $Id: halinit.c,v 1.8 2004/05/15 22:45:51 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -73,7 +73,7 @@ HalInitSystem (ULONG BootPhase, /* Go to blue screen */ HalClearDisplay (0x17); /* grey on blue */ - HalpZeroPageMapping = MmMapIoSpace((LARGE_INTEGER)0LL, PAGE_SIZE, FALSE); + HalpZeroPageMapping = MmMapIoSpace((LARGE_INTEGER)0LL, PAGE_SIZE, MmNonCached); } return TRUE; diff --git a/reactos/include/ddk/mmfuncs.h b/reactos/include/ddk/mmfuncs.h index 2940bdc9be8..40a5be072a4 100644 --- a/reactos/include/ddk/mmfuncs.h +++ b/reactos/include/ddk/mmfuncs.h @@ -1,6 +1,6 @@ #ifndef _INCLUDE_DDK_MMFUNCS_H #define _INCLUDE_DDK_MMFUNCS_H -/* $Id: mmfuncs.h,v 1.21 2004/04/20 19:04:11 gdalsnes Exp $ */ +/* $Id: mmfuncs.h,v 1.22 2004/05/15 22:45:51 hbirr Exp $ */ /* MEMORY MANAGMENT ******************************************************/ @@ -356,7 +356,7 @@ STDCALL MmMapIoSpace ( PHYSICAL_ADDRESS PhysicalAddress, ULONG NumberOfBytes, - BOOLEAN CacheEnable + MEMORY_CACHING_TYPE CacheEnable ); /* * FUNCTION: Maps the pages described by a given MDL diff --git a/reactos/ntoskrnl/mm/iospace.c b/reactos/ntoskrnl/mm/iospace.c index 18ab3e919ca..548f77c2fa4 100644 --- a/reactos/ntoskrnl/mm/iospace.c +++ b/reactos/ntoskrnl/mm/iospace.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: iospace.c,v 1.26 2004/04/10 22:35:25 gdalsnes Exp $ +/* $Id: iospace.c,v 1.27 2004/05/15 22:45:49 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/iospace.c @@ -52,7 +52,7 @@ * Number of bytes to map; * * CacheEnable - * TRUE if the range can be cached. + * Type of memory caching. * * RETURN VALUE * The base virtual address which maps the region. @@ -68,9 +68,10 @@ PVOID STDCALL MmMapIoSpace (IN PHYSICAL_ADDRESS PhysicalAddress, IN ULONG NumberOfBytes, - IN BOOLEAN CacheEnable) + IN MEMORY_CACHING_TYPE CacheEnable) { PVOID Result; + ULONG Offset; MEMORY_AREA* marea; NTSTATUS Status; ULONG i; @@ -79,9 +80,20 @@ MmMapIoSpace (IN PHYSICAL_ADDRESS PhysicalAddress, DPRINT("MmMapIoSpace(%lx, %d, %d)\n", PhysicalAddress, NumberOfBytes, CacheEnable); + if (CacheEnable != MmNonCached && + CacheEnable != MmCached && + CacheEnable != MmWriteCombined) + { + return NULL; + } + BoundaryAddressMultiple.QuadPart = 0; - MmLockAddressSpace(MmGetKernelAddressSpace()); Result = NULL; + Offset = PhysicalAddress.u.LowPart % PAGE_SIZE; + NumberOfBytes += Offset; + PhysicalAddress.QuadPart -= Offset; + + MmLockAddressSpace(MmGetKernelAddressSpace()); Status = MmCreateMemoryArea (NULL, MmGetKernelAddressSpace(), MEMORY_AREA_IO_MAPPING, @@ -100,43 +112,23 @@ MmMapIoSpace (IN PHYSICAL_ADDRESS PhysicalAddress, return (NULL); } Attributes = PAGE_EXECUTE_READWRITE | PAGE_SYSTEM; - if (!CacheEnable) + if (CacheEnable != MmCached) { Attributes |= (PAGE_NOCACHE | PAGE_WRITETHROUGH); } - for (i = 0; (i < (PAGE_ROUND_UP(NumberOfBytes) / PAGE_SIZE)); i++) + for (i = 0; i < PAGE_ROUND_UP(NumberOfBytes); i += PAGE_SIZE, PhysicalAddress.QuadPart += PAGE_SIZE) { -#if !defined(__GNUC__) - PHYSICAL_ADDRESS dummyJunkNeeded; - dummyJunkNeeded.QuadPart = PhysicalAddress.QuadPart + (i * PAGE_SIZE); -#endif - - Status = - MmCreateVirtualMappingForKernel((char*)Result + (i * PAGE_SIZE), - Attributes, -#if defined(__GNUC__) - (PHYSICAL_ADDRESS) - (PhysicalAddress.QuadPart + - (i * PAGE_SIZE)) -#else - dummyJunkNeeded -#endif - ); + Status = MmCreateVirtualMappingForKernel((char*)Result + i, + Attributes, + PhysicalAddress); if (!NT_SUCCESS(Status)) { DbgPrint("Unable to create virtual mapping\n"); KEBUGCHECK(0); } -#if defined(__GNUC__) - MmMarkPageMapped((PHYSICAL_ADDRESS) (PhysicalAddress.QuadPart + - (i * PAGE_SIZE))); -#else - - MmMarkPageMapped(dummyJunkNeeded); -#endif - + MmMarkPageMapped(PhysicalAddress); } - return ((PVOID)((char*)Result + PhysicalAddress.QuadPart % PAGE_SIZE)); + return ((PVOID)((char*)Result + Offset)); } @@ -168,9 +160,14 @@ VOID STDCALL MmUnmapIoSpace (IN PVOID BaseAddress, IN ULONG NumberOfBytes) { + ULONG Offset; + Offset = (ULONG_PTR)BaseAddress % PAGE_SIZE; + BaseAddress = (PVOID)((PUCHAR)BaseAddress - Offset); + NumberOfBytes += Offset; + MmLockAddressSpace(MmGetKernelAddressSpace()); MmFreeMemoryArea(MmGetKernelAddressSpace(), - (PVOID)(((ULONG)BaseAddress / PAGE_SIZE) * PAGE_SIZE), + BaseAddress, NumberOfBytes, NULL, NULL); From 43783f95c5108156d6d9a96c30f6671932143f8f Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sat, 15 May 2004 22:50:04 +0000 Subject: [PATCH 1141/1463] Anich Gregor: Basic implementation of GetUserObjectInformation() (needed by the nvidia opengl ICD) svn path=/trunk/; revision=9410 --- reactos/lib/user32/misc/object.c | 49 +++++++++-- reactos/subsys/win32k/ntuser/winsta.c | 115 +++++++++++++++++++++++++- 2 files changed, 154 insertions(+), 10 deletions(-) diff --git a/reactos/lib/user32/misc/object.c b/reactos/lib/user32/misc/object.c index e83d3286918..572afd56fc1 100644 --- a/reactos/lib/user32/misc/object.c +++ b/reactos/lib/user32/misc/object.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: object.c,v 1.6 2004/01/23 23:38:26 ekohl Exp $ +/* $Id: object.c,v 1.7 2004/05/15 22:50:04 weiden Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/misc/dde.c @@ -82,7 +82,7 @@ UserHandleGrantAccess( /* - * @unimplemented + * @implemented */ BOOL STDCALL @@ -93,13 +93,46 @@ GetUserObjectInformationA( DWORD nLength, LPDWORD lpnLengthNeeded) { - UNIMPLEMENTED; - return FALSE; + LPWSTR buffer; + BOOL ret = TRUE; + + DPRINT("GetUserObjectInformationA(%x %d %x %d %x)\n", hObj, nIndex, + pvInfo, nLength, lpnLengthNeeded); + + if (nIndex != UOI_NAME && nIndex != UOI_TYPE) + return GetUserObjectInformationW(hObj, nIndex, pvInfo, nLength, lpnLengthNeeded); + + /* allocate unicode buffer */ + buffer = HeapAlloc(GetProcessHeap(), 0, nLength*2); + if (buffer == NULL) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + + /* get unicode string */ + if (!GetUserObjectInformationW(hObj, nIndex, buffer, nLength*2, lpnLengthNeeded)) + ret = FALSE; + *lpnLengthNeeded /= 2; + + if (ret) + { + /* convert string */ + if (WideCharToMultiByte(CP_THREAD_ACP, 0, buffer, -1, + pvInfo, nLength, NULL, NULL) == 0) + { + ret = FALSE; + } + } + + /* free resources */ + HeapFree(GetProcessHeap(), 0, buffer); + return ret; } /* - * @unimplemented + * @implemented */ BOOL STDCALL @@ -110,6 +143,8 @@ GetUserObjectInformationW( DWORD nLength, LPDWORD lpnLengthNeeded) { - UNIMPLEMENTED; - return FALSE; + DPRINT("GetUserObjectInformationW(%x %d %x %d %x)\n", hObj, nIndex, + pvInfo, nLength, lpnLengthNeeded); + return NtUserGetObjectInformation(hObj, nIndex, pvInfo, nLength, lpnLengthNeeded); } + diff --git a/reactos/subsys/win32k/ntuser/winsta.c b/reactos/subsys/win32k/ntuser/winsta.c index ee852053093..383b34927c6 100644 --- a/reactos/subsys/win32k/ntuser/winsta.c +++ b/reactos/subsys/win32k/ntuser/winsta.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: winsta.c,v 1.60 2004/05/14 23:57:32 weiden Exp $ + * $Id: winsta.c,v 1.61 2004/05/15 22:50:04 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -611,8 +611,117 @@ NtUserGetObjectInformation( DWORD nLength, PDWORD nLengthNeeded) { - SetLastNtError(STATUS_UNSUCCESSFUL); - return FALSE; + PWINSTATION_OBJECT WinStaObject = NULL; + PDESKTOP_OBJECT DesktopObject = NULL; + NTSTATUS Status; + PVOID pvData = NULL; + DWORD nDataSize = 0; + + /* try windowstation */ + DPRINT("Trying to open window station 0x%x\n", hObject); + Status = IntValidateWindowStationHandle( + hObject, + UserMode,/*ExGetPreviousMode(),*/ + GENERIC_READ, /* FIXME: is this ok? */ + &WinStaObject); + + + if (!NT_SUCCESS(Status) && Status != STATUS_OBJECT_TYPE_MISMATCH) + { + DPRINT("Failed: 0x%x\n", Status); + SetLastNtError(Status); + return FALSE; + } + + if (Status == STATUS_OBJECT_TYPE_MISMATCH) + { + /* try desktop */ + DPRINT("Trying to open desktop 0x%x\n", hObject); + Status = IntValidateDesktopHandle( + hObject, + UserMode,/*ExGetPreviousMode(),*/ + GENERIC_READ, /* FIXME: is this ok? */ + &DesktopObject); + if (!NT_SUCCESS(Status)) + { + DPRINT("Failed: 0x%x\n", Status); + SetLastNtError(Status); + return FALSE; + } + } + DPRINT("WinSta or Desktop opened!!\n"); + + /* get data */ + switch (nIndex) + { + case UOI_FLAGS: + Status = STATUS_NOT_IMPLEMENTED; + DPRINT1("UOI_FLAGS unimplemented!\n"); + break; + + case UOI_NAME: + if (WinStaObject != NULL) + { + pvData = WinStaObject->Name.Buffer; + nDataSize = WinStaObject->Name.Length+2; + Status = STATUS_SUCCESS; + } + else if (DesktopObject != NULL) + { + pvData = DesktopObject->Name.Buffer; + nDataSize = DesktopObject->Name.Length+2; + Status = STATUS_SUCCESS; + } + else + Status = STATUS_INVALID_PARAMETER; + break; + + case UOI_TYPE: + if (WinStaObject != NULL) + { + pvData = L"WindowStation"; + nDataSize = (wcslen(pvData) + 1) * sizeof(WCHAR); + Status = STATUS_SUCCESS; + } + else if (DesktopObject != NULL) + { + pvData = L"Desktop"; + nDataSize = (wcslen(pvData) + 1) * sizeof(WCHAR); + Status = STATUS_SUCCESS; + } + else + Status = STATUS_INVALID_PARAMETER; + break; + + case UOI_USER_SID: + Status = STATUS_NOT_IMPLEMENTED; + DPRINT1("UOI_USER_SID unimplemented!\n"); + break; + + default: + Status = STATUS_INVALID_PARAMETER; + break; + } + + /* try to copy data to caller */ + if (Status == STATUS_SUCCESS) + { + DPRINT("Trying to copy data to caller (len = %d, len needed = %d)\n", nLength, nDataSize); + *nLengthNeeded = nDataSize; + if (nLength >= nDataSize) + Status = MmCopyToCaller(pvInformation, pvData, nDataSize); + else + Status = STATUS_BUFFER_TOO_SMALL; + } + + /* release objects */ + if (WinStaObject != NULL) + ObDereferenceObject(WinStaObject); + if (DesktopObject != NULL) + ObDereferenceObject(DesktopObject); + + SetLastNtError(Status); + return NTSUCCESS(Status); } /* From 189436c3ef490ba807289d5f312816b4f2d4c000 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sat, 15 May 2004 22:51:38 +0000 Subject: [PATCH 1142/1463] - Fixed the implementation of IoBuildPartialMdl. svn path=/trunk/; revision=9411 --- reactos/ntoskrnl/io/mdl.c | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/reactos/ntoskrnl/io/mdl.c b/reactos/ntoskrnl/io/mdl.c index 6ff5aeb1310..3e241ff3583 100644 --- a/reactos/ntoskrnl/io/mdl.c +++ b/reactos/ntoskrnl/io/mdl.c @@ -1,4 +1,4 @@ -/* $Id: mdl.c,v 1.14 2004/04/20 19:01:47 gdalsnes Exp $ +/* $Id: mdl.c,v 1.15 2004/05/15 22:51:38 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -14,6 +14,7 @@ #include <ddk/ntddk.h> #include <internal/pool.h> +#define NDEBUG #include <internal/debug.h> /* GLOBALS *******************************************************************/ @@ -92,16 +93,31 @@ IoBuildPartialMdl(PMDL SourceMdl, { PULONG TargetPages = (PULONG)(TargetMdl + 1); PULONG SourcePages = (PULONG)(SourceMdl + 1); - ULONG Va; - ULONG Delta = (PAGE_ROUND_DOWN(VirtualAddress) - (ULONG)SourceMdl->StartVa)/ - PAGE_SIZE; + ULONG Count; + ULONG Delta; - for (Va = 0; Va < (PAGE_ROUND_UP(Length)/PAGE_SIZE); Va++) - { - TargetPages[Va] = SourcePages[Va+Delta]; - } - + DPRINT("VirtualAddress %x, SourceMdl->StartVa %x, SourceMdl->MappedSystemVa %x\n", + VirtualAddress, SourceMdl->StartVa, SourceMdl->MappedSystemVa); + + TargetMdl->StartVa = (PVOID)PAGE_ROUND_DOWN(VirtualAddress); + TargetMdl->ByteOffset = (ULONG_PTR)VirtualAddress - (ULONG_PTR)TargetMdl->StartVa; + TargetMdl->ByteCount = Length; + TargetMdl->Process = SourceMdl->Process; + Delta = (ULONG_PTR)VirtualAddress - ((ULONG_PTR)SourceMdl->StartVa + SourceMdl->ByteOffset); + TargetMdl->MappedSystemVa = SourceMdl->MappedSystemVa + Delta; + + TargetMdl->MdlFlags = SourceMdl->MdlFlags & (MDL_IO_PAGE_READ|MDL_SOURCE_IS_NONPAGED_POOL|MDL_MAPPED_TO_SYSTEM_VA); TargetMdl->MdlFlags |= MDL_PARTIAL; + + Delta = ((ULONG_PTR)TargetMdl->StartVa - (ULONG_PTR)SourceMdl->StartVa) / PAGE_SIZE; + Count = ADDRESS_AND_SIZE_TO_SPAN_PAGES(VirtualAddress,Length); + + SourcePages += Delta; + + DPRINT("Delta %d, Count %d\n", Delta, Count); + + memcpy(TargetPages, SourcePages, Count * sizeof(ULONG)); + } /* From d16209b9dce16e7d3453830e1284ad4089d3bec5 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sat, 15 May 2004 23:00:02 +0000 Subject: [PATCH 1143/1463] - Improved the reading and writing of fragmented files. svn path=/trunk/; revision=9412 --- reactos/drivers/fs/vfat/blockdev.c | 189 +++++++++++++++++++----- reactos/drivers/fs/vfat/misc.c | 7 +- reactos/drivers/fs/vfat/rw.c | 222 +++++++++++++++++------------ reactos/drivers/fs/vfat/vfat.h | 22 ++- 4 files changed, 306 insertions(+), 134 deletions(-) diff --git a/reactos/drivers/fs/vfat/blockdev.c b/reactos/drivers/fs/vfat/blockdev.c index 529f85734ba..44fea0e2ec4 100644 --- a/reactos/drivers/fs/vfat/blockdev.c +++ b/reactos/drivers/fs/vfat/blockdev.c @@ -38,12 +38,53 @@ VfatReadWriteCompletion (IN PDEVICE_OBJECT DeviceObject, } *Irp->UserIosb = Irp->IoStatus; - KeSetEvent(Irp->UserEvent, IO_NO_INCREMENT, FALSE); + if (Irp->PendingReturned) + { + KeSetEvent(Irp->UserEvent, IO_NO_INCREMENT, FALSE); + } + IoFreeIrp(Irp); return STATUS_MORE_PROCESSING_REQUIRED; } +NTSTATUS STDCALL +VfatReadWritePartialCompletion (IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context) +{ + PVFAT_IRP_CONTEXT IrpContext; + PMDL Mdl; + + DPRINT("VfatReadWritePartialCompletion() called\n"); + + IrpContext = (PVFAT_IRP_CONTEXT)Context; + + while ((Mdl = Irp->MdlAddress)) + { + Irp->MdlAddress = Mdl->Next; + IoFreeMdl(Mdl); + } + if (Irp->PendingReturned) + { + IrpContext->Flags |= IRPCONTEXT_PENDINGRETURNED; + } + if (!NT_SUCCESS(Irp->IoStatus.Status)) + { + IrpContext->Irp->IoStatus.Status = Irp->IoStatus.Status; + } + if (0 == InterlockedDecrement((PLONG)&IrpContext->RefCount) && + IrpContext->Flags & IRPCONTEXT_PENDINGRETURNED) + { + KeSetEvent(&IrpContext->Event, IO_NO_INCREMENT, FALSE); + } + IoFreeIrp(Irp); + + DPRINT("VfatReadWritePartialCompletion() done\n"); + + return STATUS_MORE_PROCESSING_REQUIRED; +} + NTSTATUS VfatReadDisk (IN PDEVICE_OBJECT pDeviceObject, IN PLARGE_INTEGER ReadOffset, @@ -113,29 +154,100 @@ VfatReadDisk (IN PDEVICE_OBJECT pDeviceObject, } NTSTATUS -VfatWriteDisk (IN PDEVICE_OBJECT pDeviceObject, - IN PLARGE_INTEGER WriteOffset, - IN ULONG WriteLength, - IN PUCHAR Buffer) +VfatReadDiskPartial (IN PVFAT_IRP_CONTEXT IrpContext, + IN PLARGE_INTEGER ReadOffset, + IN ULONG ReadLength, + ULONG BufferOffset, + IN BOOLEAN Wait) { PIRP Irp; - IO_STATUS_BLOCK IoStatus; - KEVENT event; NTSTATUS Status; + PVOID Buffer; - DPRINT ("VfatWriteSectors(pDeviceObject %x, Offset %I64x, Size %d, Buffer %x)\n", - pDeviceObject, WriteOffset->QuadPart, WriteLength, Buffer); + DPRINT ("VfatReadDiskPartial(IrpContext %x, ReadOffset %I64x, ReadLength %d, BufferOffset %x, Wait %d)\n", + IrpContext, ReadOffset->QuadPart, ReadLength, BufferOffset, Wait); - KeInitializeEvent (&event, NotificationEvent, FALSE); + DPRINT ("Building synchronous FSD Request...\n"); + + Buffer = MmGetMdlVirtualAddress(IrpContext->Irp->MdlAddress) + BufferOffset; + + Irp = IoBuildSynchronousFsdRequest (IRP_MJ_READ, + IrpContext->DeviceExt->StorageDevice, + NULL, + ReadLength, + ReadOffset, + NULL, + NULL); + if (Irp == NULL) + { + DPRINT("IoBuildSynchronousFsdRequest failed\n"); + return(STATUS_UNSUCCESSFUL); + } + + if (!IoAllocateMdl(Buffer, ReadLength, FALSE, FALSE, Irp)) + { + DPRINT("IoAllocateMdl failed\n"); + IoFreeIrp(Irp); + return STATUS_UNSUCCESSFUL; + } + + IoBuildPartialMdl(IrpContext->Irp->MdlAddress, Irp->MdlAddress, Buffer, ReadLength); + + IoSetCompletionRoutine(Irp, + VfatReadWritePartialCompletion, + IrpContext, + TRUE, + TRUE, + TRUE); + + if (Wait) + { + KeInitializeEvent(&IrpContext->Event, NotificationEvent, FALSE); + IrpContext->RefCount = 1; + } + else + { + InterlockedIncrement((PLONG)&IrpContext->RefCount); + } + + DPRINT ("Calling IO Driver... with irp %x\n", Irp); + Status = IoCallDriver (IrpContext->DeviceExt->StorageDevice, Irp); + + if (Wait && Status == STATUS_PENDING) + { + KeWaitForSingleObject(&IrpContext->Event, Executive, KernelMode, FALSE, NULL); + Status = IrpContext->Irp->IoStatus.Status; + } + + DPRINT("%x\n", Status); + return Status; +} + + +NTSTATUS +VfatWriteDiskPartial (IN PVFAT_IRP_CONTEXT IrpContext, + IN PLARGE_INTEGER WriteOffset, + IN ULONG WriteLength, + IN ULONG BufferOffset, + IN BOOLEAN Wait) +{ + PIRP Irp; + NTSTATUS Status; + PVOID Buffer; + + DPRINT ("VfatWriteDiskPartial(IrpContext %x, WriteOffset %I64x, WriteLength %d, BufferOffset %x, Wait %d)\n", + IrpContext, WriteOffset->QuadPart, WriteLength, BufferOffset, Wait); + + Buffer = MmGetMdlVirtualAddress(IrpContext->Irp->MdlAddress) + BufferOffset; DPRINT ("Building synchronous FSD Request...\n"); Irp = IoBuildSynchronousFsdRequest (IRP_MJ_WRITE, - pDeviceObject, - Buffer, + IrpContext->DeviceExt->StorageDevice, + NULL, WriteLength, WriteOffset, - &event, - &IoStatus); + NULL, + NULL); if (!Irp) { @@ -143,32 +255,41 @@ VfatWriteDisk (IN PDEVICE_OBJECT pDeviceObject, return (STATUS_UNSUCCESSFUL); } + if (!IoAllocateMdl(Buffer, WriteLength, FALSE, FALSE, Irp)) + { + DPRINT("IoAllocateMdl failed\n"); + IoFreeIrp(Irp); + return STATUS_UNSUCCESSFUL; + } + IoBuildPartialMdl(IrpContext->Irp->MdlAddress, Irp->MdlAddress, Buffer, WriteLength); + IoSetCompletionRoutine(Irp, - VfatReadWriteCompletion, - NULL, + VfatReadWritePartialCompletion, + IrpContext, TRUE, TRUE, TRUE); + if (Wait) + { + KeInitializeEvent(&IrpContext->Event, NotificationEvent, FALSE); + IrpContext->RefCount = 1; + } + else + { + InterlockedIncrement((PLONG)&IrpContext->RefCount); + } + + DPRINT ("Calling IO Driver...\n"); - Status = IoCallDriver (pDeviceObject, Irp); - - DPRINT ("Waiting for IO Operation...\n"); - if (Status == STATUS_PENDING) + Status = IoCallDriver (IrpContext->DeviceExt->StorageDevice, Irp); + if (Wait && Status == STATUS_PENDING) { - KeWaitForSingleObject (&event, Suspended, KernelMode, FALSE, NULL); - DPRINT ("Getting IO Status...\n"); - Status = IoStatus.Status; + KeWaitForSingleObject(&IrpContext->Event, Executive, KernelMode, FALSE, NULL); + Status = IrpContext->Irp->IoStatus.Status; } - if (!NT_SUCCESS (Status)) - { - DPRINT ("IO failed!!! VfatWriteSectors : Error code: %x\n", Status); - return (Status); - } - - DPRINT ("Block request succeeded\n"); - return (STATUS_SUCCESS); + return Status; } NTSTATUS @@ -188,9 +309,9 @@ VfatBlockDeviceIoControl (IN PDEVICE_OBJECT DeviceObject, DPRINT("VfatBlockDeviceIoControl(DeviceObject %x, CtlCode %x, " "InputBuffer %x, InputBufferSize %x, OutputBuffer %x, " - "POutputBufferSize %x (%x)\n", DeviceObject, CtlCode, - InputBuffer, InputBufferSize, OutputBuffer, pOutputBufferSize, - pOutputBufferSize ? *pOutputBufferSize : 0); + "OutputBufferSize %x (%x)\n", DeviceObject, CtlCode, + InputBuffer, InputBufferSize, OutputBuffer, OutputBufferSize, + OutputBufferSize ? *OutputBufferSize : 0); KeInitializeEvent (&Event, NotificationEvent, FALSE); diff --git a/reactos/drivers/fs/vfat/misc.c b/reactos/drivers/fs/vfat/misc.c index 22261325a0e..fe2eb8fb853 100644 --- a/reactos/drivers/fs/vfat/misc.c +++ b/reactos/drivers/fs/vfat/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.12 2004/03/04 01:29:24 gdalsnes Exp $ +/* $Id: misc.c,v 1.13 2004/05/15 23:00:02 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -164,7 +164,7 @@ PVFAT_IRP_CONTEXT VfatAllocateIrpContext(PDEVICE_OBJECT DeviceObject, PIRP Irp) IrpContext = ExAllocateFromNPagedLookasideList(&VfatGlobalData->IrpContextLookasideList); if (IrpContext) { - RtlZeroMemory(IrpContext, sizeof(IrpContext)); + RtlZeroMemory(IrpContext, sizeof(VFAT_IRP_CONTEXT)); IrpContext->Irp = Irp; IrpContext->DeviceObject = DeviceObject; IrpContext->DeviceExt = DeviceObject->DeviceExtension; @@ -173,6 +173,7 @@ PVFAT_IRP_CONTEXT VfatAllocateIrpContext(PDEVICE_OBJECT DeviceObject, PIRP Irp) MajorFunction = IrpContext->MajorFunction = IrpContext->Stack->MajorFunction; IrpContext->MinorFunction = IrpContext->Stack->MinorFunction; IrpContext->FileObject = IrpContext->Stack->FileObject; + IrpContext->Flags = 0; if (MajorFunction == IRP_MJ_FILE_SYSTEM_CONTROL || MajorFunction == IRP_MJ_DEVICE_CONTROL || MajorFunction == IRP_MJ_SHUTDOWN) @@ -185,6 +186,8 @@ PVFAT_IRP_CONTEXT VfatAllocateIrpContext(PDEVICE_OBJECT DeviceObject, PIRP Irp) { IrpContext->Flags |= IRPCONTEXT_CANWAIT; } + KeInitializeEvent(&IrpContext->Event, NotificationEvent, FALSE); + IrpContext->RefCount = 0; } return IrpContext; } diff --git a/reactos/drivers/fs/vfat/rw.c b/reactos/drivers/fs/vfat/rw.c index 9c5f55ec34a..9facfb46857 100644 --- a/reactos/drivers/fs/vfat/rw.c +++ b/reactos/drivers/fs/vfat/rw.c @@ -1,5 +1,5 @@ -/* $Id: rw.c,v 1.65 2004/03/31 03:30:36 jimtabor Exp $ +/* $Id: rw.c,v 1.66 2004/05/15 23:00:02 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -114,8 +114,10 @@ OffsetToCluster(PDEVICE_EXTENSION DeviceExt, } NTSTATUS -VfatReadFileData (PVFAT_IRP_CONTEXT IrpContext, PVOID Buffer, - ULONG Length, LARGE_INTEGER ReadOffset, PULONG LengthRead) +VfatReadFileData (PVFAT_IRP_CONTEXT IrpContext, + ULONG Length, + LARGE_INTEGER ReadOffset, + PULONG LengthRead) /* * FUNCTION: Reads data from a file */ @@ -133,6 +135,7 @@ VfatReadFileData (PVFAT_IRP_CONTEXT IrpContext, PVOID Buffer, ULONG BytesDone; ULONG BytesPerSector; ULONG BytesPerCluster; + ULONG Count; /* PRECONDITION */ assert (IrpContext); @@ -142,9 +145,9 @@ VfatReadFileData (PVFAT_IRP_CONTEXT IrpContext, PVOID Buffer, assert (IrpContext->FileObject); assert (IrpContext->FileObject->FsContext2 != NULL); - DPRINT("VfatReadFileData(DeviceExt %x, FileObject %x, Buffer %x, " + DPRINT("VfatReadFileData(DeviceExt %x, FileObject %x, " "Length %d, ReadOffset 0x%I64x)\n", DeviceExt, - IrpContext->FileObject, Buffer, Length, ReadOffset.QuadPart); + IrpContext->FileObject, Length, ReadOffset.QuadPart); *LengthRead = 0; @@ -161,7 +164,7 @@ VfatReadFileData (PVFAT_IRP_CONTEXT IrpContext, PVOID Buffer, if (Fcb->Flags & FCB_IS_FAT) { ReadOffset.QuadPart += DeviceExt->FatInfo.FATStart * BytesPerSector; - Status = VfatReadDisk(DeviceExt->StorageDevice, &ReadOffset, Length, Buffer, FALSE); + Status = VfatReadDiskPartial(IrpContext, &ReadOffset, Length, 0, TRUE); if (NT_SUCCESS(Status)) { @@ -176,7 +179,7 @@ VfatReadFileData (PVFAT_IRP_CONTEXT IrpContext, PVOID Buffer, /* Is this a read of the Volume ? */ if (Fcb->Flags & FCB_IS_VOLUME) { - Status = VfatReadDisk(DeviceExt->StorageDevice, &ReadOffset, Length, Buffer, FALSE); + Status = VfatReadDiskPartial(IrpContext, &ReadOffset, Length, 0, TRUE); if (NT_SUCCESS(Status)) { *LengthRead = Length; @@ -206,10 +209,10 @@ VfatReadFileData (PVFAT_IRP_CONTEXT IrpContext, PVOID Buffer, // Fire up the read command - Status = VfatReadDisk (DeviceExt->StorageDevice, &ReadOffset, Length, Buffer, FALSE); + Status = VfatReadDiskPartial (IrpContext, &ReadOffset, Length, 0, TRUE); if (NT_SUCCESS(Status)) { - *LengthRead += Length; + *LengthRead = Length; } return Status; } @@ -231,7 +234,11 @@ VfatReadFileData (PVFAT_IRP_CONTEXT IrpContext, PVOID Buffer, Ccb->LastCluster = CurrentCluster; Ccb->LastOffset = ROUND_DOWN (ReadOffset.u.LowPart, BytesPerCluster); - while (Length > 0 && CurrentCluster != 0xffffffff && NT_SUCCESS(Status)) + KeInitializeEvent(&IrpContext->Event, NotificationEvent, FALSE); + IrpContext->RefCount = 1; + Count = 0; + + while (Length > 0 && CurrentCluster != 0xffffffff) { StartCluster = CurrentCluster; StartOffset.QuadPart = ClusterToSector(DeviceExt, StartCluster) * BytesPerSector; @@ -267,32 +274,40 @@ VfatReadFileData (PVFAT_IRP_CONTEXT IrpContext, PVOID Buffer, Ccb->LastCluster = StartCluster + (ClusterCount - 1); Ccb->LastOffset = ReadOffset.u.LowPart + (ClusterCount - 1) * BytesPerCluster; - // Fire up the read command - Status = VfatReadDisk (DeviceExt->StorageDevice, &StartOffset, BytesDone, Buffer, FALSE); + Count++; - if (NT_SUCCESS(Status)) - { - *LengthRead += BytesDone; -/* GCC allows arithmetics on the void type. Conforming compilers do not. */ -#ifdef __GNUC__ - Buffer += BytesDone; -#else + // Fire up the read command + Status = VfatReadDiskPartial (IrpContext, &StartOffset, BytesDone, *LengthRead, FALSE); + if (!NT_SUCCESS(Status) && Status != STATUS_PENDING) { - char* pBuf = (char*)Buffer + BytesDone; - Buffer = (PVOID)pBuf; + break; } -#endif - Length -= BytesDone; - ReadOffset.u.LowPart += BytesDone; - } + *LengthRead += BytesDone; + Length -= BytesDone; + ReadOffset.u.LowPart += BytesDone; } + if (0 != InterlockedDecrement((PLONG)&IrpContext->RefCount)) + { + KeWaitForSingleObject(&IrpContext->Event, Executive, KernelMode, FALSE, NULL); + } + if (NT_SUCCESS(Status) || Status == STATUS_PENDING) + { + if (Length > 0) + { + Status = STATUS_UNSUCCESSFUL; + } + else + { + Status = IrpContext->Irp->IoStatus.Status; + } + } return Status; } -NTSTATUS VfatWriteFileData(PVFAT_IRP_CONTEXT IrpContext, - PVOID Buffer, - ULONG Length, - LARGE_INTEGER WriteOffset) +NTSTATUS +VfatWriteFileData(PVFAT_IRP_CONTEXT IrpContext, + ULONG Length, + LARGE_INTEGER WriteOffset) { PDEVICE_EXTENSION DeviceExt; PVFATFCB Fcb; @@ -308,6 +323,7 @@ NTSTATUS VfatWriteFileData(PVFAT_IRP_CONTEXT IrpContext, ULONG BytesPerSector; ULONG BytesPerCluster; LARGE_INTEGER StartOffset; + ULONG BufferOffset; /* PRECONDITION */ assert (IrpContext); @@ -322,9 +338,9 @@ NTSTATUS VfatWriteFileData(PVFAT_IRP_CONTEXT IrpContext, BytesPerCluster = DeviceExt->FatInfo.BytesPerCluster; BytesPerSector = DeviceExt->FatInfo.BytesPerSector; - DPRINT("VfatWriteFileData(DeviceExt %x, FileObject %x, Buffer %x, " + DPRINT("VfatWriteFileData(DeviceExt %x, FileObject %x, " "Length %d, WriteOffset 0x%I64x), '%wZ'\n", DeviceExt, - IrpContext->FileObject, Buffer, Length, WriteOffset, + IrpContext->FileObject, Length, WriteOffset, &Fcb->PathNameU); assert(WriteOffset.QuadPart + Length <= Fcb->RFCB.AllocationSize.QuadPart); @@ -334,7 +350,7 @@ NTSTATUS VfatWriteFileData(PVFAT_IRP_CONTEXT IrpContext, // Is this a write of the volume ? if (Fcb->Flags & FCB_IS_VOLUME) { - Status = VfatWriteDisk(DeviceExt->StorageDevice, &WriteOffset, Length, Buffer); + Status = VfatWriteDiskPartial(IrpContext, &WriteOffset, Length, 0, TRUE); if (!NT_SUCCESS(Status)) { DPRINT1("Volume writing failed, Status %x\n", Status); @@ -346,15 +362,25 @@ NTSTATUS VfatWriteFileData(PVFAT_IRP_CONTEXT IrpContext, if (Fcb->Flags & FCB_IS_FAT) { WriteOffset.u.LowPart += DeviceExt->FatInfo.FATStart * BytesPerSector; + IrpContext->RefCount = 1; for (Count = 0; Count < DeviceExt->FatInfo.FATCount; Count++) { - Status = VfatWriteDisk(DeviceExt->StorageDevice, &WriteOffset, Length, Buffer); - if (!NT_SUCCESS(Status)) + Status = VfatWriteDiskPartial(IrpContext, &WriteOffset, Length, 0, FALSE); + if (!NT_SUCCESS(Status) && Status != STATUS_PENDING) { DPRINT1("FAT writing failed, Status %x\n", Status); + break; } WriteOffset.u.LowPart += Fcb->RFCB.FileSize.u.LowPart; } + if (0 != InterlockedDecrement((PLONG)&IrpContext->RefCount)) + { + KeWaitForSingleObject(&IrpContext->Event, Executive, KernelMode, FALSE, NULL); + } + if (NT_SUCCESS(Status) || Status == STATUS_PENDING) + { + Status = IrpContext->Irp->IoStatus.Status; + } return Status; } @@ -370,7 +396,7 @@ NTSTATUS VfatWriteFileData(PVFAT_IRP_CONTEXT IrpContext, // Directory of FAT12/16 needs a special handling WriteOffset.u.LowPart += DeviceExt->FatInfo.rootStart * BytesPerSector; // Fire up the write command - Status = VfatWriteDisk (DeviceExt->StorageDevice, &WriteOffset, Length, Buffer); + Status = VfatWriteDiskPartial (IrpContext, &WriteOffset, Length, 0, TRUE); return Status; } @@ -394,7 +420,11 @@ NTSTATUS VfatWriteFileData(PVFAT_IRP_CONTEXT IrpContext, Ccb->LastCluster = CurrentCluster; Ccb->LastOffset = ROUND_DOWN (WriteOffset.u.LowPart, BytesPerCluster); - while (Length > 0 && CurrentCluster != 0xffffffff && NT_SUCCESS(Status)) + IrpContext->RefCount = 1; + Count = 0; + BufferOffset = 0; + + while (Length > 0 && CurrentCluster != 0xffffffff) { StartCluster = CurrentCluster; StartOffset.QuadPart = ClusterToSector(DeviceExt, StartCluster) * BytesPerSector; @@ -431,22 +461,31 @@ NTSTATUS VfatWriteFileData(PVFAT_IRP_CONTEXT IrpContext, Ccb->LastOffset = WriteOffset.u.LowPart + (ClusterCount - 1) * BytesPerCluster; // Fire up the write command - Status = VfatWriteDisk (DeviceExt->StorageDevice, &StartOffset, BytesDone, Buffer); - if (NT_SUCCESS(Status)) - { -/* GCC allows arithmetics on the void type. Conforming compilers do not. */ -#ifdef __GNUC__ - Buffer += BytesDone; -#else - { - char* pBuf = (char*)Buffer + BytesDone; - Buffer = (PVOID)pBuf; - } -#endif - Length -= BytesDone; - WriteOffset.u.LowPart += BytesDone; - } + Status = VfatWriteDiskPartial (IrpContext, &StartOffset, BytesDone, BufferOffset, FALSE); + Count++; + if (!NT_SUCCESS(Status) && Status != STATUS_PENDING) + { + break; + } + BufferOffset += BytesDone; + Length -= BytesDone; + WriteOffset.u.LowPart += BytesDone; } + if (0 != InterlockedDecrement((PLONG)&IrpContext->RefCount)) + { + KeWaitForSingleObject(&IrpContext->Event, Executive, KernelMode, FALSE, NULL); + } + if (NT_SUCCESS(Status) || Status == STATUS_PENDING) + { + if (Length > 0) + { + Status = STATUS_UNSUCCESSFUL; + } + else + { + Status = IrpContext->Irp->IoStatus.Status; + } + } return Status; } @@ -486,12 +525,10 @@ VfatRead(PVFAT_IRP_CONTEXT IrpContext) if (Fcb->Flags & FCB_IS_PAGE_FILE) { - PIO_STACK_LOCATION Stack; PFATINFO FatInfo = &IrpContext->DeviceExt->FatInfo; - IoCopyCurrentIrpStackLocationToNext(IrpContext->Irp); - Stack = IoGetNextIrpStackLocation(IrpContext->Irp); - Stack->Parameters.Read.ByteOffset.QuadPart += FatInfo->dataStart * FatInfo->BytesPerSector; - DPRINT("Read from page file, disk offset %I64x\n", Stack->Parameters.Read.ByteOffset.QuadPart); + IrpContext->Stack->Parameters.Read.ByteOffset.QuadPart += FatInfo->dataStart * FatInfo->BytesPerSector; + IoSkipCurrentIrpStackLocation(IrpContext->Irp); + DPRINT("Read from page file, disk offset %I64x\n", IrpContext->Stack->Parameters.Read.ByteOffset.QuadPart); Status = IoCallDriver(IrpContext->DeviceExt->StorageDevice, IrpContext->Irp); VfatFreeIrpContext(IrpContext); return Status; @@ -527,7 +564,7 @@ VfatRead(PVFAT_IRP_CONTEXT IrpContext) if (ByteOffset.u.LowPart % BytesPerSector != 0 || Length % BytesPerSector != 0) { DPRINT("%d %d\n", ByteOffset.u.LowPart, Length); - // non chached read must be sector aligned + // non cached read must be sector aligned Status = STATUS_INVALID_PARAMETER; goto ByeBye; } @@ -569,6 +606,13 @@ VfatRead(PVFAT_IRP_CONTEXT IrpContext) } } + Buffer = VfatGetUserBuffer(IrpContext->Irp); + if (!Buffer) + { + Status = STATUS_INVALID_USER_BUFFER; + goto ByeBye; + } + if (!(IrpContext->Irp->Flags & (IRP_NOCACHE|IRP_PAGING_IO)) && !(Fcb->Flags & (FCB_IS_PAGE_FILE|FCB_IS_VOLUME))) { @@ -581,13 +625,6 @@ VfatRead(PVFAT_IRP_CONTEXT IrpContext) Status = /*STATUS_END_OF_FILE*/STATUS_SUCCESS; } - Buffer = VfatGetUserBuffer(IrpContext->Irp); - if (!Buffer) - { - Status = STATUS_INVALID_USER_BUFFER; - goto ByeBye; - } - CHECKPOINT; if (IrpContext->FileObject->PrivateCacheMap == NULL) { @@ -621,14 +658,13 @@ VfatRead(PVFAT_IRP_CONTEXT IrpContext) Length = (ULONG)(ROUND_UP(Fcb->RFCB.FileSize.QuadPart, BytesPerSector) - ByteOffset.QuadPart); } - Buffer = VfatGetUserBuffer(IrpContext->Irp); - if (!Buffer) - { - Status = STATUS_INVALID_USER_BUFFER; - goto ByeBye; - } + Status = VfatLockUserBuffer(IrpContext->Irp, Length, IoWriteAccess); + if (!NT_SUCCESS(Status)) + { + goto ByeBye; + } - Status = VfatReadFileData(IrpContext, Buffer, Length, ByteOffset, &ReturnedLength); + Status = VfatReadFileData(IrpContext, Length, ByteOffset, &ReturnedLength); /**/ if (Status == STATUS_VERIFY_REQUIRED) { @@ -639,7 +675,7 @@ VfatRead(PVFAT_IRP_CONTEXT IrpContext) if (NT_SUCCESS(Status)) { - Status = VfatReadFileData(IrpContext, Buffer, Length, + Status = VfatReadFileData(IrpContext, Length, ByteOffset, &ReturnedLength); } @@ -725,12 +761,10 @@ NTSTATUS VfatWrite (PVFAT_IRP_CONTEXT IrpContext) if (Fcb->Flags & FCB_IS_PAGE_FILE) { - PIO_STACK_LOCATION Stack; PFATINFO FatInfo = &IrpContext->DeviceExt->FatInfo; - IoCopyCurrentIrpStackLocationToNext(IrpContext->Irp); - Stack = IoGetNextIrpStackLocation(IrpContext->Irp); - Stack->Parameters.Write.ByteOffset.QuadPart += FatInfo->dataStart * FatInfo->BytesPerSector; - DPRINT("Write to page file, disk offset %I64x\n", Stack->Parameters.Write.ByteOffset.QuadPart); + IrpContext->Stack->Parameters.Write.ByteOffset.QuadPart += FatInfo->dataStart * FatInfo->BytesPerSector; + IoSkipCurrentIrpStackLocation(IrpContext->Irp); + DPRINT("Write to page file, disk offset %I64x\n", IrpContext->Stack->Parameters.Write.ByteOffset.QuadPart); Status = IoCallDriver(IrpContext->DeviceExt->StorageDevice, IrpContext->Irp); VfatFreeIrpContext(IrpContext); return Status; @@ -768,7 +802,7 @@ NTSTATUS VfatWrite (PVFAT_IRP_CONTEXT IrpContext) { if (ByteOffset.u.LowPart % BytesPerSector != 0 || Length % BytesPerSector != 0) { - // non chached write must be sector aligned + // non cached write must be sector aligned Status = STATUS_INVALID_PARAMETER; goto ByeBye; } @@ -776,6 +810,9 @@ NTSTATUS VfatWrite (PVFAT_IRP_CONTEXT IrpContext) if (Length == 0) { + /* FIXME: + * Update last write time + */ IrpContext->Irp->IoStatus.Information = 0; Status = STATUS_SUCCESS; goto ByeBye; @@ -850,6 +887,14 @@ NTSTATUS VfatWrite (PVFAT_IRP_CONTEXT IrpContext) OldFileSize = Fcb->RFCB.FileSize; OldAllocationSize = Fcb->RFCB.AllocationSize.u.LowPart; + Buffer = VfatGetUserBuffer(IrpContext->Irp); + if (!Buffer) + { + Status = STATUS_INVALID_USER_BUFFER; + goto ByeBye; + } + + if (!(Fcb->Flags & (FCB_IS_FAT|FCB_IS_VOLUME)) && !(IrpContext->Irp->Flags & IRP_PAGING_IO) && ByteOffset.u.LowPart + Length > Fcb->RFCB.FileSize.u.LowPart) @@ -872,13 +917,6 @@ NTSTATUS VfatWrite (PVFAT_IRP_CONTEXT IrpContext) // cached write CHECKPOINT; - Buffer = VfatGetUserBuffer(IrpContext->Irp); - if (!Buffer) - { - Status = STATUS_INVALID_USER_BUFFER; - goto ByeBye; - } - CHECKPOINT; if (IrpContext->FileObject->PrivateCacheMap == NULL) { ULONG CacheSize; @@ -914,14 +952,14 @@ NTSTATUS VfatWrite (PVFAT_IRP_CONTEXT IrpContext) { CcZeroData(IrpContext->FileObject, &OldFileSize, &ByteOffset, TRUE); } - Buffer = VfatGetUserBuffer(IrpContext->Irp); - if (!Buffer) - { - Status = STATUS_INVALID_USER_BUFFER; - goto ByeBye; - } - Status = VfatWriteFileData(IrpContext, Buffer, Length, ByteOffset); + Status = VfatLockUserBuffer(IrpContext->Irp, Length, IoReadAccess); + if (!NT_SUCCESS(Status)) + { + goto ByeBye; + } + + Status = VfatWriteFileData(IrpContext, Length, ByteOffset); if (NT_SUCCESS(Status)) { IrpContext->Irp->IoStatus.Information = Length; diff --git a/reactos/drivers/fs/vfat/vfat.h b/reactos/drivers/fs/vfat/vfat.h index 9d0606c8f86..63a19ef5365 100644 --- a/reactos/drivers/fs/vfat/vfat.h +++ b/reactos/drivers/fs/vfat/vfat.h @@ -1,4 +1,4 @@ -/* $Id: vfat.h,v 1.62 2004/05/02 20:16:46 hbirr Exp $ */ +/* $Id: vfat.h,v 1.63 2004/05/15 23:00:02 hbirr Exp $ */ #include <ddk/ntifs.h> @@ -288,7 +288,8 @@ typedef struct __DOSDATE } DOSDATE, *PDOSDATE; -#define IRPCONTEXT_CANWAIT 0x0001 +#define IRPCONTEXT_CANWAIT 0x0001 +#define IRPCONTEXT_PENDINGRETURNED 0x0002 typedef struct { @@ -301,6 +302,8 @@ typedef struct UCHAR MajorFunction; UCHAR MinorFunction; PFILE_OBJECT FileObject; + ULONG RefCount; + KEVENT Event; } VFAT_IRP_CONTEXT, *PVFAT_IRP_CONTEXT; typedef struct _VFAT_DIRENTRY_CONTEXT @@ -332,10 +335,17 @@ NTSTATUS VfatReadDisk(IN PDEVICE_OBJECT pDeviceObject, IN PUCHAR Buffer, IN BOOLEAN Override); -NTSTATUS VfatWriteDisk(IN PDEVICE_OBJECT pDeviceObject, - IN PLARGE_INTEGER WriteOffset, - IN ULONG WriteLength, - IN PUCHAR Buffer); +NTSTATUS VfatReadDiskPartial (IN PVFAT_IRP_CONTEXT IrpContext, + IN PLARGE_INTEGER ReadOffset, + IN ULONG ReadLength, + IN ULONG BufferOffset, + IN BOOLEAN Wait); + +NTSTATUS VfatWriteDiskPartial(IN PVFAT_IRP_CONTEXT IrpContext, + IN PLARGE_INTEGER WriteOffset, + IN ULONG WriteLength, + IN ULONG BufferOffset, + IN BOOLEAN Wait); NTSTATUS VfatBlockDeviceIoControl (IN PDEVICE_OBJECT DeviceObject, IN ULONG CtlCode, From 607ca343e7cdc954fe9779c06dfcbdebb04f9da7 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sat, 15 May 2004 23:07:11 +0000 Subject: [PATCH 1144/1463] fixed typo svn path=/trunk/; revision=9413 --- reactos/subsys/win32k/ntuser/winsta.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/winsta.c b/reactos/subsys/win32k/ntuser/winsta.c index 383b34927c6..66e21c5ae48 100644 --- a/reactos/subsys/win32k/ntuser/winsta.c +++ b/reactos/subsys/win32k/ntuser/winsta.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: winsta.c,v 1.61 2004/05/15 22:50:04 weiden Exp $ + * $Id: winsta.c,v 1.62 2004/05/15 23:07:11 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -721,7 +721,7 @@ NtUserGetObjectInformation( ObDereferenceObject(DesktopObject); SetLastNtError(Status); - return NTSUCCESS(Status); + return NT_SUCCESS(Status); } /* From 3538785e6a20dedc749d232f841959441b05ee83 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sun, 16 May 2004 09:51:27 +0000 Subject: [PATCH 1145/1463] replaced UnsafeIntCreateRectRgnIndirect() and UnsafeIntUnionRectWithRgn() with macros to directly call the appropriate function svn path=/trunk/; revision=9414 --- reactos/subsys/win32k/eng/transblt.c | 4 +++- reactos/subsys/win32k/include/intgdi.h | 10 +++++++--- reactos/subsys/win32k/objects/region.c | 16 ++-------------- 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/reactos/subsys/win32k/eng/transblt.c b/reactos/subsys/win32k/eng/transblt.c index 8ba54fe267f..8135a0c5834 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.18 2004/05/10 17:07:17 weiden Exp $ +/* $Id: transblt.c,v 1.19 2004/05/16 09:51:26 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -268,8 +268,10 @@ IntEngTransparentBlt(SURFOBJ *Dest, if(!Ret) { + IntLockGDIDriver(SurfGDIDest); Ret = EngTransparentBlt(Dest, Source, Clip, ColorTranslation, &OutputRect, SourceRect, iTransColor, Reserved); + IntUnLockGDIDriver(SurfGDIDest); } if(Ret) diff --git a/reactos/subsys/win32k/include/intgdi.h b/reactos/subsys/win32k/include/intgdi.h index 3e1ca399b4c..74ae67f91da 100644 --- a/reactos/subsys/win32k/include/intgdi.h +++ b/reactos/subsys/win32k/include/intgdi.h @@ -102,12 +102,16 @@ IntGdiGetClipBox(HDC hDC, LPRECT rc); HRGN FASTCALL REGION_CropRgn(HRGN hDst, HRGN hSrc, const PRECT lpRect, PPOINT lpPt); - -HRGN FASTCALL UnsafeIntCreateRectRgnIndirect(CONST PRECT rc); +void FASTCALL REGION_UnionRectWithRegion(const RECT *rect, ROSRGNDATA *rgn); INT FASTCALL UnsafeIntGetRgnBox(PROSRGNDATA Rgn, LPRECT pRect); -VOID FASTCALL UnsafeIntUnionRectWithRgn(PROSRGNDATA RgnDest, CONST PRECT Rect); BOOL FASTCALL UnsafeIntRectInRegion(PROSRGNDATA Rgn, CONST LPRECT rc); +#define UnsafeIntCreateRectRgnIndirect(prc) \ + NtGdiCreateRectRgn((prc)->left, (prc)->top, (prc)->right, (prc)->bottom) + +#define UnsafeIntUnionRectWithRgn(rgndest, prc) \ + REGION_UnionRectWithRegion((prc), (rgndest)) + /* DC functions */ BOOL FASTCALL diff --git a/reactos/subsys/win32k/objects/region.c b/reactos/subsys/win32k/objects/region.c index 1a4e0703d22..b095dff8fb7 100644 --- a/reactos/subsys/win32k/objects/region.c +++ b/reactos/subsys/win32k/objects/region.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: region.c,v 1.52 2004/05/14 16:56:48 navaraf Exp $ */ +/* $Id: region.c,v 1.53 2004/05/16 09:51:27 weiden Exp $ */ #include <w32k.h> #include <win32k/float.h> @@ -1387,7 +1387,7 @@ static void FASTCALL REGION_XorRegion(ROSRGNDATA *dr, ROSRGNDATA *sra, /*! * Adds a rectangle to a REGION */ -static void FASTCALL REGION_UnionRectWithRegion(const RECT *rect, ROSRGNDATA *rgn) +void FASTCALL REGION_UnionRectWithRegion(const RECT *rect, ROSRGNDATA *rgn) { ROSRGNDATA region; @@ -1742,12 +1742,6 @@ NtGdiCreateRectRgnIndirect(CONST PRECT rc) return(UnsafeIntCreateRectRgnIndirect(&SafeRc)); } -HRGN FASTCALL -UnsafeIntCreateRectRgnIndirect(CONST PRECT rc) -{ - return(NtGdiCreateRectRgn(rc->left, rc->top, rc->right, rc->bottom)); -} - HRGN STDCALL NtGdiCreateRoundRectRgn(INT left, INT top, INT right, INT bottom, @@ -2258,12 +2252,6 @@ NtGdiSetRectRgn(HRGN hRgn, return TRUE; } -VOID FASTCALL -UnsafeIntUnionRectWithRgn(PROSRGNDATA RgnDest, CONST PRECT Rect) -{ - REGION_UnionRectWithRegion(Rect, RgnDest); -} - HRGN STDCALL NtGdiUnionRectWithRgn(HRGN hDest, CONST PRECT UnsafeRect) { From 4bee3087aced373843191c601a9ae57b3d8b8130 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sun, 16 May 2004 13:57:49 +0000 Subject: [PATCH 1146/1463] fixed dereferencing bug svn path=/trunk/; revision=9415 --- reactos/subsys/win32k/ntuser/winpos.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index faa97c92de4..b17a1937626 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.115 2004/05/13 20:46:28 navaraf Exp $ +/* $Id: winpos.c,v 1.116 2004/05/16 13:57:49 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1360,20 +1360,29 @@ WinPosSearchChildren( if ((List = IntWinListChildren(ScopeWin))) { - for (phWnd = List; *phWnd; ++phWnd, IntReleaseWindowObject(Current)) + for (phWnd = List; *phWnd; ++phWnd) { if (!(Current = IntGetWindowObject(*phWnd))) continue; if (!(Current->Style & WS_VISIBLE)) - continue; + { + IntReleaseWindowObject(Current); + continue; + } if ((Current->Style & (WS_POPUP | WS_CHILD | WS_DISABLED)) == (WS_CHILD | WS_DISABLED)) + { + IntReleaseWindowObject(Current); continue; + } if (!IntPtInWindow(Current, Point->x, Point->y)) + { + IntReleaseWindowObject(Current); continue; + } if (*Window) IntReleaseWindowObject(*Window); From 192d918fb4cccdd52eace125a1ea37bd570afaea Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sun, 16 May 2004 18:33:40 +0000 Subject: [PATCH 1147/1463] fixed missing dereferencing of threads in PostThreadMessage() svn path=/trunk/; revision=9416 --- reactos/subsys/win32k/ntuser/message.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/message.c b/reactos/subsys/win32k/ntuser/message.c index a628e4cfe9c..b8e62dbf91d 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.65 2004/05/14 23:57:32 weiden Exp $ +/* $Id: message.c,v 1.66 2004/05/16 18:33:40 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1089,7 +1089,8 @@ NtUserPostThreadMessage(DWORD idThread, Status = CopyMsgToKernelMem(&KernelModeMsg, &UserModeMsg, MsgMemoryEntry); if (! NT_SUCCESS(Status)) { - SetLastWin32Error(ERROR_INVALID_PARAMETER); + ObDereferenceObject( peThread ); + SetLastWin32Error(ERROR_INVALID_PARAMETER); return FALSE; } MsqPostMessage(pThread->MessageQueue, &KernelModeMsg, From eb9fa5b0a50ae0eddde3fac16fd89c21996bf4f3 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 16 May 2004 19:31:09 +0000 Subject: [PATCH 1148/1463] Window Class handling fixes: - Corrected styles/names for builtin classes. - Make NtUserRegisterClassExWOW a bit more like in windows. - More Windows-like handling of hInstance in RegisterClassEx[AW]. - Very basic work on global vs. local window classes. svn path=/trunk/; revision=9417 --- reactos/iface/addsys/w32ksvc.db | 2 +- reactos/include/user32/regcontrol.h | 5 +- reactos/include/win32k/ntuser.h | 21 +- reactos/lib/user32/controls/button.c | 2 +- reactos/lib/user32/controls/combo.c | 2 +- reactos/lib/user32/controls/edit.c | 2 +- reactos/lib/user32/controls/icontitle.c | 13 +- reactos/lib/user32/controls/listbox.c | 6 +- reactos/lib/user32/controls/regcontrol.c | 63 +++-- reactos/lib/user32/controls/static.c | 4 +- reactos/lib/user32/include/user32.h | 2 + reactos/lib/user32/misc/dllmain.c | 2 + reactos/lib/user32/windows/class.c | 248 +++++++++-------- reactos/lib/user32/windows/dialog.c | 4 +- reactos/lib/user32/windows/mdi.c | 12 +- reactos/lib/user32/windows/menu.c | 8 +- reactos/subsys/win32k/include/class.h | 31 ++- reactos/subsys/win32k/ntuser/class.c | 331 +++++++++++++---------- reactos/subsys/win32k/ntuser/window.c | 31 ++- 19 files changed, 434 insertions(+), 355 deletions(-) diff --git a/reactos/iface/addsys/w32ksvc.db b/reactos/iface/addsys/w32ksvc.db index 7d408072e4d..4df76b7ee00 100644 --- a/reactos/iface/addsys/w32ksvc.db +++ b/reactos/iface/addsys/w32ksvc.db @@ -459,7 +459,7 @@ NtUserQueryWindow 2 NtUserReleaseDC 2 NtUserRealChildWindowFromPoint 3 NtUserRedrawWindow 4 -NtUserRegisterClassExWOW 5 +NtUserRegisterClassExWOW 7 NtUserRegisterHotKey 4 NtUserRegisterTasklist 1 NtUserRegisterWindowMessage 1 diff --git a/reactos/include/user32/regcontrol.h b/reactos/include/user32/regcontrol.h index 5261570f9ae..b4fbce79018 100644 --- a/reactos/include/user32/regcontrol.h +++ b/reactos/include/user32/regcontrol.h @@ -1,4 +1,4 @@ -/* $Id: regcontrol.h,v 1.7 2003/12/07 23:02:57 gvg Exp $ +/* $Id: regcontrol.h,v 1.8 2004/05/16 19:31:06 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS User32 @@ -14,9 +14,6 @@ #define IS_ATOM(x) \ (((ULONG_PTR)(x) > 0x0) && ((ULONG_PTR)(x) < 0x10000)) -/* Built-in class names (see _Undocumented_Windows_ p.418) */ -#define ICONTITLE_CLASS_ATOM MAKEINTATOMA(32772) /* IconTitle */ - /* Built-in class descriptor */ struct builtin_class_descr { diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index e8a09ae4ea3..1981ca06743 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -1115,13 +1115,20 @@ NtUserRedrawWindow UINT flags ); -RTL_ATOM -STDCALL -NtUserRegisterClassExWOW(CONST WNDCLASSEXW* lpwcx, - BOOL bUnicodeClass, - WNDPROC wpExtra, - DWORD Unknown4, - DWORD Unknown5); +/* FIXME: These flag constans aren't what Windows uses. */ +#define REGISTERCLASS_ANSI 2 +#define REGISTERCLASS_SYSTEM 4 +#define REGISTERCLASS_ALL (REGISTERCLASS_ANSI | REGISTERCLASS_SYSTEM) + +RTL_ATOM STDCALL +NtUserRegisterClassExWOW( + CONST WNDCLASSEXW* lpwcx, + PUNICODE_STRING ClassName, + PUNICODE_STRING ClassNameCopy, + PUNICODE_STRING MenuName, + WNDPROC wpExtra, + DWORD Flags, + DWORD Unknown7); BOOL STDCALL diff --git a/reactos/lib/user32/controls/button.c b/reactos/lib/user32/controls/button.c index 85fde97db17..9a2f9b54dfe 100644 --- a/reactos/lib/user32/controls/button.c +++ b/reactos/lib/user32/controls/button.c @@ -112,7 +112,7 @@ const struct builtin_class_descr BUTTON_builtin_class = { #ifdef __REACTOS__ L"Button", /* name */ - CS_GLOBALCLASS | CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC, /* style */ + CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC, /* style */ ButtonWndProcW, /* procW */ ButtonWndProcA, /* procA */ NB_EXTRA_BYTES, /* extra */ diff --git a/reactos/lib/user32/controls/combo.c b/reactos/lib/user32/controls/combo.c index c8e5dfc2874..304f52053d8 100644 --- a/reactos/lib/user32/controls/combo.c +++ b/reactos/lib/user32/controls/combo.c @@ -85,7 +85,7 @@ static LRESULT WINAPI ComboWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM const struct builtin_class_descr COMBO_builtin_class = { L"ComboBox", /* name */ - CS_GLOBALCLASS | CS_PARENTDC | CS_DBLCLKS, /* style */ + CS_PARENTDC | CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS, /* style */ (WNDPROC) ComboWndProcW, /* procW */ (WNDPROC) ComboWndProcA, /* procA */ sizeof(HEADCOMBO *), /* extra */ diff --git a/reactos/lib/user32/controls/edit.c b/reactos/lib/user32/controls/edit.c index 34202d66362..1dd19d31104 100644 --- a/reactos/lib/user32/controls/edit.c +++ b/reactos/lib/user32/controls/edit.c @@ -293,7 +293,7 @@ const struct builtin_class_descr EDIT_builtin_class = { #ifdef __REACTOS__ L"Edit", /* name */ - CS_GLOBALCLASS | CS_DBLCLKS | CS_PARENTDC, /* style */ + CS_DBLCLKS | CS_PARENTDC, /* style */ (WNDPROC)EditWndProcW, /* procW */ (WNDPROC)EditWndProcA, /* procA */ sizeof(EDITSTATE *), /* extra */ diff --git a/reactos/lib/user32/controls/icontitle.c b/reactos/lib/user32/controls/icontitle.c index d706c51b9d4..fe95ebea990 100644 --- a/reactos/lib/user32/controls/icontitle.c +++ b/reactos/lib/user32/controls/icontitle.c @@ -38,18 +38,21 @@ static HFONT hIconTitleFont; static LRESULT CALLBACK IconTitleWndProcW( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ); static LRESULT CALLBACK IconTitleWndProcA( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ); +#define MAKEINTATOMW(atom) ((LPCWSTR)((ULONG_PTR)((WORD)(atom)))) +#define ICONTITLE_CLASS_ATOM MAKEINTATOMW(32772) + /********************************************************************* * icon title class descriptor */ const struct builtin_class_descr ICONTITLE_builtin_class = { - L"ICONTITLE_CLASS_ATOM", /* name */ - CS_GLOBALCLASS, /* style */ + ICONTITLE_CLASS_ATOM, /* name */ + 0, /* style */ (WNDPROC) IconTitleWndProcW, /* procW */ (WNDPROC) IconTitleWndProcA, /* procA */ - 0, /* extra */ + 0, /* extra */ (LPCWSTR) IDC_ARROW, /* cursor */ /* FIXME Wine uses IDC_ARROWA */ - 0 /* brush */ + 0 /* brush */ }; @@ -57,6 +60,7 @@ const struct builtin_class_descr ICONTITLE_builtin_class = /*********************************************************************** * ICONTITLE_Create */ +#ifndef __REACTOS__ HWND ICONTITLE_Create( HWND owner ) { HWND hWnd; @@ -77,6 +81,7 @@ HWND ICONTITLE_Create( HWND owner ) GetWindowLongW( hWnd, GWL_STYLE ) & ~(WS_CAPTION | WS_BORDER) ); return hWnd; } +#endif /*********************************************************************** * ICONTITLE_SetTitlePos diff --git a/reactos/lib/user32/controls/listbox.c b/reactos/lib/user32/controls/listbox.c index 799b6234525..494f2bd1b94 100644 --- a/reactos/lib/user32/controls/listbox.c +++ b/reactos/lib/user32/controls/listbox.c @@ -1,4 +1,4 @@ -/* $Id: listbox.c,v 1.16 2004/04/09 20:03:13 navaraf Exp $ +/* $Id: listbox.c,v 1.17 2004/05/16 19:31:06 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS User32 @@ -136,7 +136,7 @@ static LRESULT LISTBOX_GetItemRect( LB_DESCR *descr, INT index, RECT *rect ); const struct builtin_class_descr LISTBOX_builtin_class = { L"ListBox", /* name */ - CS_GLOBALCLASS | CS_DBLCLKS /*| CS_PARENTDC*/, /* style */ + CS_DBLCLKS /*| CS_PARENTDC*/, /* style */ (WNDPROC)ListBoxWndProcW, /* procW */ (WNDPROC)ListBoxWndProcA, /* procA */ sizeof(LB_DESCR *), /* extra */ @@ -151,7 +151,7 @@ const struct builtin_class_descr LISTBOX_builtin_class = const struct builtin_class_descr COMBOLBOX_builtin_class = { L"ComboLBox", /* name */ - CS_GLOBALCLASS | CS_DBLCLKS | CS_SAVEBITS, /* style */ + CS_DBLCLKS | CS_SAVEBITS, /* style */ (WNDPROC)ComboLBWndProcW, /* procW */ (WNDPROC)ComboLBWndProcA, /* procA */ sizeof(LB_DESCR *), /* extra */ diff --git a/reactos/lib/user32/controls/regcontrol.c b/reactos/lib/user32/controls/regcontrol.c index 82c1ad12c80..aae954c25da 100644 --- a/reactos/lib/user32/controls/regcontrol.c +++ b/reactos/lib/user32/controls/regcontrol.c @@ -1,4 +1,4 @@ -/* $Id: regcontrol.c,v 1.18 2004/03/27 10:46:32 gvg Exp $ +/* $Id: regcontrol.c,v 1.19 2004/05/16 19:31:06 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS User32 @@ -11,38 +11,51 @@ #include <windows.h> #include <wchar.h> +#include <user32.h> #include "user32/regcontrol.h" #include "win32k/ntuser.h" static void RegisterBuiltinClass(const struct builtin_class_descr *Descr) { - WNDCLASSEXW wc; - ATOM Class; + WNDCLASSEXW wc; + UNICODE_STRING ClassName; + UNICODE_STRING MenuName; - wc.cbSize = sizeof(WNDCLASSEXW); - wc.lpszClassName = Descr->name; - wc.lpfnWndProc = Descr->procW; - wc.style = Descr->style; - wc.hInstance = NULL; - wc.hIcon = NULL; - wc.hIconSm = NULL; - wc.hCursor = LoadCursorW(NULL, Descr->cursor); - wc.hbrBackground = Descr->brush; - wc.lpszMenuName = NULL; - wc.cbClsExtra = 0; - wc.cbWndExtra = Descr->extra; + wc.cbSize = sizeof(WNDCLASSEXW); + wc.lpszClassName = Descr->name; + wc.lpfnWndProc = Descr->procW; + wc.style = Descr->style; + wc.hInstance = User32Instance; + wc.hIcon = NULL; + wc.hIconSm = NULL; + wc.hCursor = LoadCursorW(NULL, Descr->cursor); + wc.hbrBackground = Descr->brush; + wc.lpszMenuName = NULL; + wc.cbClsExtra = 0; + wc.cbWndExtra = Descr->extra; + MenuName.Length = + MenuName.MaximumLength = 0; + MenuName.Buffer = NULL; -#if 0 - if(IS_ATOM(wc.lpszClassName)) - DbgPrint("Registering built-in class atom=0x%x\n", wc.lpszClassName); - else - DbgPrint("Registering built-in class %wS\n", wc.lpszClassName); -#endif - Class = NtUserRegisterClassExWOW(&wc,TRUE,Descr->procA,0,0); -#if 0 - DbgPrint("RegisterClassW = %d\n", Class); -#endif + if (IS_ATOM(Descr->name)) + { + ClassName.Length = + ClassName.MaximumLength = 0; + ClassName.Buffer = (LPWSTR)Descr->name; + } else + { + RtlInitUnicodeString(&ClassName, Descr->name); + } + + NtUserRegisterClassExWOW( + &wc, + &ClassName, + &ClassName, + &MenuName, + Descr->procA, + REGISTERCLASS_SYSTEM, + 0); } /*********************************************************************** diff --git a/reactos/lib/user32/controls/static.c b/reactos/lib/user32/controls/static.c index c2ab665d987..03741c589d9 100644 --- a/reactos/lib/user32/controls/static.c +++ b/reactos/lib/user32/controls/static.c @@ -1,4 +1,4 @@ -/* $Id: static.c,v 1.12 2004/03/10 23:21:56 navaraf Exp $ +/* $Id: static.c,v 1.13 2004/05/16 19:31:06 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS User32 @@ -60,7 +60,7 @@ static pfPaint staticPaintFunc[SS_TYPEMASK+1] = const struct builtin_class_descr STATIC_builtin_class = { L"Static", /* name */ - CS_GLOBALCLASS | CS_DBLCLKS, /* style */ + CS_DBLCLKS | CS_PARENTDC, /* style */ (WNDPROC) StaticWndProcW, /* procW */ (WNDPROC) StaticWndProcA, /* procA */ STATIC_EXTRA_BYTES, /* extra */ diff --git a/reactos/lib/user32/include/user32.h b/reactos/lib/user32/include/user32.h index f948aec80ac..31fb0905801 100644 --- a/reactos/lib/user32/include/user32.h +++ b/reactos/lib/user32/include/user32.h @@ -7,6 +7,8 @@ #include <windows.h> #include <win32k/win32k.h> +extern HINSTANCE User32Instance; + typedef struct _USER32_THREAD_DATA { MSG LastMessage; diff --git a/reactos/lib/user32/misc/dllmain.c b/reactos/lib/user32/misc/dllmain.c index 15fbf11bc32..f6181e52521 100644 --- a/reactos/lib/user32/misc/dllmain.c +++ b/reactos/lib/user32/misc/dllmain.c @@ -21,6 +21,7 @@ DWORD DebugTraceLevel = MIN_TRACE; extern CRITICAL_SECTION gcsMPH; static ULONG User32TlsIndex; +HINSTANCE User32Instance; /* To make the linker happy */ VOID STDCALL KeBugCheck (ULONG BugCheckCode) {} @@ -108,6 +109,7 @@ DllMain( switch (dwReason) { case DLL_PROCESS_ATTACH: + User32Instance = hinstDll; hProcessHeap = RtlGetProcessHeap(); Init(); InitThread(); diff --git a/reactos/lib/user32/windows/class.c b/reactos/lib/user32/windows/class.c index 2625d70d974..cc42a2e7459 100644 --- a/reactos/lib/user32/windows/class.c +++ b/reactos/lib/user32/windows/class.c @@ -1,4 +1,4 @@ -/* $Id: class.c,v 1.47 2004/05/10 12:21:22 gvg Exp $ +/* $Id: class.c,v 1.48 2004/05/16 19:31:07 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -399,135 +399,164 @@ RealGetWindowClassA( return GetClassNameA(hwnd,pszType,cchType); } -/* - * @implemented - */ -ATOM -STDCALL -RegisterClassA(CONST WNDCLASSA *lpWndClass) -{ - WNDCLASSEXA Class; - - if ( !lpWndClass ) - return 0; - - RtlCopyMemory ( &Class.style, lpWndClass, sizeof(WNDCLASSA) ); - - Class.cbSize = sizeof(WNDCLASSEXA); - Class.hIconSm = NULL; - - return RegisterClassExA ( &Class ); -} - /* * @implemented */ ATOM STDCALL RegisterClassExA(CONST WNDCLASSEXA *lpwcx) { - RTL_ATOM Atom; - WNDCLASSEXW wndclass; - NTSTATUS Status; - LPWSTR ClassName = NULL; - LPWSTR MenuName = NULL; + RTL_ATOM Atom; + WNDCLASSEXA WndClass; + UNICODE_STRING ClassName; + UNICODE_STRING MenuName; - if ( !lpwcx || (lpwcx->cbSize != sizeof(WNDCLASSEXA)) ) - return 0; - - if ( !lpwcx->lpszClassName ) - return 0; - - RtlCopyMemory ( &wndclass, lpwcx, sizeof(WNDCLASSEXW) ); - - if ( !IS_ATOM(lpwcx->lpszClassName) ) - { - Status = HEAP_strdupAtoW ( &ClassName, (LPCSTR)lpwcx->lpszClassName, NULL ); - if ( !NT_SUCCESS (Status) ) - { - SetLastError (RtlNtStatusToDosError(Status)); + if (lpwcx == NULL || lpwcx->cbSize != sizeof(WNDCLASSEXW) || + lpwcx->cbClsExtra < 0 || lpwcx->cbWndExtra < 0 || + lpwcx->lpszClassName == NULL) + { + SetLastError(ERROR_INVALID_PARAMETER); return 0; - } - wndclass.lpszClassName = ClassName; - } + } - if ( !IS_INTRESOURCE(lpwcx->lpszMenuName) ) - { - Status = HEAP_strdupAtoW ( &MenuName, (LPCSTR)lpwcx->lpszMenuName, NULL ); - if ( !NT_SUCCESS (Status) ) - { - if ( ClassName ) - HEAP_free ( ClassName ); - SetLastError (RtlNtStatusToDosError(Status)); + /* + * On real Windows this looks more like: + * if (lpwcx->hInstance == User32Instance && + * *(PULONG)((ULONG_PTR)NtCurrentTeb() + 0x6D4) & 0x400) + * But since I have no idea what the magic field in the + * TEB structure means, I rather decided to omit that. + * -- Filip Navara + */ + if (lpwcx->hInstance == User32Instance) + { + SetLastError(ERROR_INVALID_PARAMETER); return 0; - } - wndclass.lpszMenuName = MenuName; - } + } - Atom = NtUserRegisterClassExWOW ( &wndclass, FALSE, (WNDPROC)0, 0, 0 ); + /* Yes, this is correct. We should modify the passed structure. */ + if (lpwcx->hInstance == NULL) + ((WNDCLASSEXA*)lpwcx)->hInstance = GetModuleHandleW(NULL); + + RtlCopyMemory(&WndClass, lpwcx, sizeof(WNDCLASSEXW)); - /* free strings if neccessary */ - if ( MenuName ) HEAP_free ( MenuName ); - if ( ClassName ) HEAP_free ( ClassName ); + if (IS_ATOM(lpwcx->lpszMenuName)) + { + MenuName.Length = + MenuName.MaximumLength = 0; + MenuName.Buffer = (LPWSTR)lpwcx->lpszClassName; + } else + { + RtlCreateUnicodeStringFromAsciiz(&MenuName, lpwcx->lpszMenuName); + } - return (ATOM)Atom; + if (IS_ATOM(lpwcx->lpszClassName)) + { + ClassName.Length = + ClassName.MaximumLength = 0; + ClassName.Buffer = (LPWSTR)lpwcx->lpszClassName; + } else + { + RtlCreateUnicodeStringFromAsciiz(&ClassName, lpwcx->lpszClassName); + } + + Atom = NtUserRegisterClassExWOW( + (WNDCLASSEXW*)&WndClass, + &ClassName, + &ClassName, + &MenuName, + NULL, + REGISTERCLASS_ANSI, + 0); + + RtlFreeUnicodeString(&MenuName); + RtlFreeUnicodeString(&ClassName); + + return (ATOM)Atom; } - - /* * @implemented */ ATOM STDCALL RegisterClassExW(CONST WNDCLASSEXW *lpwcx) { - RTL_ATOM Atom; - HANDLE hHeap; - WNDCLASSEXW wndclass; - LPWSTR ClassName = NULL; - LPWSTR MenuName = NULL; + WNDCLASSEXW WndClass; + UNICODE_STRING ClassName; + UNICODE_STRING MenuName; - if ( !lpwcx || (lpwcx->cbSize != sizeof(WNDCLASSEXA)) ) - return 0; - - if ( !lpwcx->lpszClassName ) - return 0; - - hHeap = GetProcessHeap(); - RtlCopyMemory ( &wndclass, lpwcx, sizeof(WNDCLASSEXW) ); - - /* copy strings if needed */ - - if ( !IS_ATOM(lpwcx->lpszClassName) ) - { - ClassName = HEAP_strdupW ( lpwcx->lpszClassName, lstrlenW(lpwcx->lpszClassName) ); - if ( !ClassName ) - { - SetLastError(RtlNtStatusToDosError(STATUS_NO_MEMORY)); + if (lpwcx == NULL || lpwcx->cbSize != sizeof(WNDCLASSEXW) || + lpwcx->cbClsExtra < 0 || lpwcx->cbWndExtra < 0 || + lpwcx->lpszClassName == NULL) + { + SetLastError(ERROR_INVALID_PARAMETER); return 0; - } - wndclass.lpszClassName = ClassName; - } + } - if ( !IS_INTRESOURCE(lpwcx->lpszMenuName) ) - { - MenuName = HEAP_strdupW ( lpwcx->lpszMenuName, lstrlenW(lpwcx->lpszMenuName) ); - if ( !MenuName ) - { - if ( ClassName ) - HEAP_free ( MenuName ); - SetLastError(RtlNtStatusToDosError(STATUS_NO_MEMORY)); + /* + * On real Windows this looks more like: + * if (lpwcx->hInstance == User32Instance && + * *(PULONG)((ULONG_PTR)NtCurrentTeb() + 0x6D4) & 0x400) + * But since I have no idea what the magic field in the + * TEB structure means, I rather decided to omit that. + * -- Filip Navara + */ + if (lpwcx->hInstance == User32Instance) + { + SetLastError(ERROR_INVALID_PARAMETER); return 0; - } - wndclass.lpszMenuName = MenuName; - } + } - Atom = NtUserRegisterClassExWOW ( &wndclass, TRUE, (WNDPROC)0, 0, 0 ); + /* Yes, this is correct. We should modify the passed structure. */ + if (lpwcx->hInstance == NULL) + ((WNDCLASSEXW*)lpwcx)->hInstance = GetModuleHandleW(NULL); - /* free strings if neccessary */ - if ( MenuName ) HEAP_free ( MenuName ); - if ( ClassName ) HEAP_free ( ClassName ); + RtlCopyMemory(&WndClass, lpwcx, sizeof(WNDCLASSEXW)); - return (ATOM)Atom; + if (IS_ATOM(lpwcx->lpszMenuName)) + { + MenuName.Length = + MenuName.MaximumLength = 0; + MenuName.Buffer = (LPWSTR)lpwcx->lpszClassName; + } else + { + RtlInitUnicodeString(&MenuName, lpwcx->lpszMenuName); + } + + if (IS_ATOM(lpwcx->lpszClassName)) + { + ClassName.Length = + ClassName.MaximumLength = 0; + ClassName.Buffer = (LPWSTR)lpwcx->lpszClassName; + } else + { + RtlInitUnicodeString(&ClassName, lpwcx->lpszClassName); + } + + return (ATOM)NtUserRegisterClassExWOW( + &WndClass, + &ClassName, + &ClassName, + &MenuName, + NULL, + 0, + 0); +} + +/* + * @implemented + */ +ATOM STDCALL +RegisterClassA(CONST WNDCLASSA *lpWndClass) +{ + WNDCLASSEXA Class; + + if (lpWndClass == NULL) + return 0; + + RtlCopyMemory(&Class.style, lpWndClass, sizeof(WNDCLASSA)); + Class.cbSize = sizeof(WNDCLASSEXA); + Class.hIconSm = NULL; + + return RegisterClassExA(&Class); } /* @@ -536,17 +565,16 @@ RegisterClassExW(CONST WNDCLASSEXW *lpwcx) ATOM STDCALL RegisterClassW(CONST WNDCLASSW *lpWndClass) { - WNDCLASSEXW Class; + WNDCLASSEXW Class; - if ( !lpWndClass ) - return 0; + if (lpWndClass == NULL) + return 0; - RtlCopyMemory ( &Class.style, lpWndClass, sizeof(WNDCLASSW) ); + RtlCopyMemory(&Class.style, lpWndClass, sizeof(WNDCLASSW)); + Class.cbSize = sizeof(WNDCLASSEXW); + Class.hIconSm = NULL; - Class.cbSize = sizeof(WNDCLASSEXW); - Class.hIconSm = NULL; - - return RegisterClassExW ( &Class ); + return RegisterClassExW(&Class); } /* diff --git a/reactos/lib/user32/windows/dialog.c b/reactos/lib/user32/windows/dialog.c index 9269b830a96..29605fe97ff 100644 --- a/reactos/lib/user32/windows/dialog.c +++ b/reactos/lib/user32/windows/dialog.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: dialog.c,v 1.25 2004/04/09 20:03:14 navaraf Exp $ +/* $Id: dialog.c,v 1.26 2004/05/16 19:31:07 navaraf Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/dialog.c @@ -134,7 +134,7 @@ typedef struct const struct builtin_class_descr DIALOG_builtin_class = { DIALOG_CLASS_ATOMW, /* name */ - CS_GLOBALCLASS | CS_SAVEBITS | CS_DBLCLKS, /* style */ + CS_SAVEBITS | CS_DBLCLKS, /* style */ (WNDPROC) DefDlgProcW, /* procW */ (WNDPROC) DefDlgProcA, /* procA */ DWL_INIT + sizeof(LONG), /* extra */ diff --git a/reactos/lib/user32/windows/mdi.c b/reactos/lib/user32/windows/mdi.c index dea3edd2096..baf4dbf369f 100644 --- a/reactos/lib/user32/windows/mdi.c +++ b/reactos/lib/user32/windows/mdi.c @@ -213,23 +213,13 @@ static void MDI_PostUpdate(HWND hwnd, MDICLIENTINFO* ci, WORD recalc) */ const struct builtin_class_descr MDICLIENT_builtin_class = { -#ifdef __REACTOS__ L"MDIClient", /* name */ - CS_GLOBALCLASS, /* style */ + 0, /* style */ MDIClientWndProcW, /* procW */ MDIClientWndProcA, /* procA */ sizeof(MDICLIENTINFO *), /* extra */ IDC_ARROW, /* cursor */ (HBRUSH)(COLOR_APPWORKSPACE+1) /* brush */ -#else - "MDIClient", /* name */ - CS_GLOBALCLASS, /* style */ - MDIClientWndProcW, /* procW */ - MDIClientWndProcA, /* procA */ - sizeof(MDICLIENTINFO), /* extra */ - IDC_ARROW, /* cursor */ - (HBRUSH)(COLOR_APPWORKSPACE+1) /* brush */ -#endif }; diff --git a/reactos/lib/user32/windows/menu.c b/reactos/lib/user32/windows/menu.c index 721ddb92d75..fdf8545d00f 100644 --- a/reactos/lib/user32/windows/menu.c +++ b/reactos/lib/user32/windows/menu.c @@ -21,7 +21,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: menu.c,v 1.67 2004/05/15 08:53:06 navaraf Exp $ +/* $Id: menu.c,v 1.68 2004/05/16 19:31:07 navaraf Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/menu.c @@ -120,12 +120,12 @@ static LRESULT WINAPI PopupMenuWndProcW(HWND hwnd, UINT message, WPARAM wParam, const struct builtin_class_descr POPUPMENU_builtin_class = { POPUPMENU_CLASS_ATOMW, /* name */ - CS_GLOBALCLASS | CS_SAVEBITS | CS_DBLCLKS, /* style */ + CS_SAVEBITS | CS_DBLCLKS, /* style */ (WNDPROC) PopupMenuWndProcW, /* FIXME - procW */ (WNDPROC) NULL, /* FIXME - procA */ sizeof(MENUINFO *), /* extra */ - (LPCWSTR) IDC_ARROW, /* cursor */ - (HBRUSH)(COLOR_MENU + 1) /* brush */ + (LPCWSTR) IDC_ARROW, /* cursor */ + (HBRUSH)(COLOR_MENU + 1) /* brush */ }; diff --git a/reactos/subsys/win32k/include/class.h b/reactos/subsys/win32k/include/class.h index 8175560ff56..0a082921fb9 100644 --- a/reactos/subsys/win32k/include/class.h +++ b/reactos/subsys/win32k/include/class.h @@ -25,6 +25,7 @@ typedef struct _WNDCLASS_OBJECT RTL_ATOM Atom; HICON hIconSm; BOOL Unicode; + BOOL Global; LIST_ENTRY ListEntry; PCHAR ExtraData; } WNDCLASS_OBJECT, *PWNDCLASS_OBJECT; @@ -41,22 +42,24 @@ CleanupClassImpl(VOID); #define IntUnLockProcessClasses(W32Process) \ ExReleaseFastMutex(&W32Process->ClassListLock) -NTSTATUS STDCALL -ClassReferenceClassByName(PWNDCLASS_OBJECT *Class, - LPCWSTR ClassName); +BOOL FASTCALL +ClassReferenceClassByAtom( + PWNDCLASS_OBJECT* Class, + RTL_ATOM Atom, + HINSTANCE hInstance); -NTSTATUS FASTCALL -ClassReferenceClassByAtom(PWNDCLASS_OBJECT *Class, - RTL_ATOM ClassAtom); +BOOL FASTCALL +ClassReferenceClassByName( + PWNDCLASS_OBJECT *Class, + LPCWSTR ClassName, + HINSTANCE hInstance); + +BOOL FASTCALL +ClassReferenceClassByNameOrAtom( + PWNDCLASS_OBJECT *Class, + LPCWSTR ClassNameOrAtom, + HINSTANCE hInstance); -NTSTATUS FASTCALL -ClassReferenceClassByNameOrAtom(PWNDCLASS_OBJECT *Class, - LPCWSTR ClassNameOrAtom); -PWNDCLASS_OBJECT FASTCALL -IntCreateClass(CONST WNDCLASSEXW *lpwcx, - BOOL bUnicodeClass, - WNDPROC wpExtra, - RTL_ATOM Atom); struct _WINDOW_OBJECT; ULONG FASTCALL IntGetClassLong(struct _WINDOW_OBJECT *WindowObject, ULONG Offset, BOOL Ansi); diff --git a/reactos/subsys/win32k/ntuser/class.c b/reactos/subsys/win32k/ntuser/class.c index 76cfeca5d87..7d1087e6278 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.53 2004/05/13 20:10:15 navaraf Exp $ +/* $Id: class.c,v 1.54 2004/05/16 19:31:09 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -47,127 +47,139 @@ CleanupClassImpl(VOID) return(STATUS_SUCCESS); } - -NTSTATUS FASTCALL -ClassReferenceClassByAtom(PWNDCLASS_OBJECT* Class, - RTL_ATOM Atom) +BOOL FASTCALL +ClassReferenceClassByAtom( + PWNDCLASS_OBJECT* Class, + RTL_ATOM Atom, + HINSTANCE hInstance) { - PWNDCLASS_OBJECT Current; - PLIST_ENTRY CurrentEntry; - PW32PROCESS Process = PsGetWin32Process(); + PWNDCLASS_OBJECT Current, BestMatch = NULL; + PLIST_ENTRY CurrentEntry; + PW32PROCESS Process = PsGetWin32Process(); - IntLockProcessClasses(Process); - CurrentEntry = Process->ClassListHead.Flink; - while (CurrentEntry != &Process->ClassListHead) - { - Current = CONTAINING_RECORD(CurrentEntry, WNDCLASS_OBJECT, ListEntry); + IntLockProcessClasses(Process); + CurrentEntry = Process->ClassListHead.Flink; + while (CurrentEntry != &Process->ClassListHead) + { + Current = CONTAINING_RECORD(CurrentEntry, WNDCLASS_OBJECT, ListEntry); - if (Current->Atom == Atom) - { - *Class = Current; - ObmReferenceObject(Current); - IntUnLockProcessClasses(Process); - return(STATUS_SUCCESS); - } + if (Current->Atom == Atom && Current->hInstance == hInstance) + { + *Class = Current; + ObmReferenceObject(Current); + IntUnLockProcessClasses(Process); + return TRUE; + } - CurrentEntry = CurrentEntry->Flink; - } - IntUnLockProcessClasses(Process); + if (Current->Atom == Atom && Current->Global) + BestMatch = Current; + + CurrentEntry = CurrentEntry->Flink; + } + IntUnLockProcessClasses(Process); + + if (BestMatch != NULL) + { + *Class = BestMatch; + ObmReferenceObject(BestMatch); + return TRUE; + } - return(STATUS_NOT_FOUND); + return FALSE; } -NTSTATUS STDCALL -ClassReferenceClassByName(PWNDCLASS_OBJECT *Class, - LPCWSTR ClassName) +BOOL FASTCALL +ClassReferenceClassByName( + PWNDCLASS_OBJECT *Class, + LPCWSTR ClassName, + HINSTANCE hInstance) { - PWINSTATION_OBJECT WinStaObject; - NTSTATUS Status; - RTL_ATOM ClassAtom; + PWINSTATION_OBJECT WinStaObject; + NTSTATUS Status; + BOOL Found; + RTL_ATOM ClassAtom; - if (!ClassName) - { - return(STATUS_INVALID_PARAMETER); - } + if (!ClassName) + return FALSE; - Status = IntValidateWindowStationHandle(PROCESS_WINDOW_STATION(), - KernelMode, - 0, - &WinStaObject); - if (!NT_SUCCESS(Status)) - { + Status = IntValidateWindowStationHandle( + PROCESS_WINDOW_STATION(), + KernelMode, + 0, + &WinStaObject); + + if (!NT_SUCCESS(Status)) + { DPRINT("Validation of window station handle (0x%X) failed\n", PROCESS_WINDOW_STATION()); - return(STATUS_UNSUCCESSFUL); - } + return FALSE; + } - Status = RtlLookupAtomInAtomTable(WinStaObject->AtomTable, - (LPWSTR)ClassName, - &ClassAtom); + Status = RtlLookupAtomInAtomTable( + WinStaObject->AtomTable, + (LPWSTR)ClassName, + &ClassAtom); - if (!NT_SUCCESS(Status)) - { + if (!NT_SUCCESS(Status)) + { ObDereferenceObject(WinStaObject); - return(Status); - } - Status = ClassReferenceClassByAtom(Class, - ClassAtom); - - ObDereferenceObject(WinStaObject); - return(Status); + return FALSE; + } + + Found = ClassReferenceClassByAtom(Class, ClassAtom, hInstance); + ObDereferenceObject(WinStaObject); + + return Found; } -NTSTATUS FASTCALL -ClassReferenceClassByNameOrAtom(PWNDCLASS_OBJECT *Class, - LPCWSTR ClassNameOrAtom) +BOOL FASTCALL +ClassReferenceClassByNameOrAtom( + PWNDCLASS_OBJECT *Class, + LPCWSTR ClassNameOrAtom, + HINSTANCE hInstance) { - NTSTATUS Status; + BOOL Found; - if (IS_ATOM(ClassNameOrAtom)) - { - Status = ClassReferenceClassByAtom(Class, - (RTL_ATOM)((ULONG_PTR)ClassNameOrAtom)); - } - else - { - Status = ClassReferenceClassByName(Class, - ClassNameOrAtom); - } + if (IS_ATOM(ClassNameOrAtom)) + Found = ClassReferenceClassByAtom(Class, (RTL_ATOM)((ULONG_PTR)ClassNameOrAtom), hInstance); + else + Found = ClassReferenceClassByName(Class, ClassNameOrAtom, hInstance); - if (!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - } - - return(Status); + return Found; } DWORD STDCALL -NtUserGetClassInfo(HINSTANCE hInstance, LPCWSTR lpClassName, - LPWNDCLASSEXW lpWndClassEx, BOOL Ansi, DWORD unknown3) +NtUserGetClassInfo( + HINSTANCE hInstance, + LPCWSTR lpClassName, + LPWNDCLASSEXW lpWndClassEx, + BOOL Ansi, + DWORD unknown3) { PWNDCLASS_OBJECT Class; - NTSTATUS Status; RTL_ATOM Atom; - DPRINT("NtUserGetClassInfo(%S)\n", lpClassName); - Status = ClassReferenceClassByNameOrAtom(&Class, lpClassName); - if (!NT_SUCCESS(Status)) + if (IS_ATOM(lpClassName)) + DPRINT("NtUserGetClassInfo - %x (%lx)\n", lpClassName, hInstance); + else + DPRINT("NtUserGetClassInfo - %S (%lx)\n", lpClassName, hInstance); + + if (!ClassReferenceClassByNameOrAtom(&Class, lpClassName, hInstance)) { - DPRINT("Error (%x)\n", Status); - SetLastNtError(Status); + SetLastWin32Error(ERROR_CLASS_DOES_NOT_EXIST); return 0; } + lpWndClassEx->cbSize = sizeof(LPWNDCLASSEXW); lpWndClassEx->style = Class->style; if (Ansi) lpWndClassEx->lpfnWndProc = Class->lpfnWndProcA; else lpWndClassEx->lpfnWndProc = Class->lpfnWndProcW; - DPRINT("%x\n", lpWndClassEx->lpfnWndProc); lpWndClassEx->cbClsExtra = Class->cbClsExtra; lpWndClassEx->cbWndExtra = Class->cbWndExtra; - lpWndClassEx->hInstance = Class->hInstance; + /* This is not typo, we're really not going to use Class->hInstance here. */ + lpWndClassEx->hInstance = hInstance; lpWndClassEx->hIcon = Class->hIcon; lpWndClassEx->hCursor = Class->hCursor; lpWndClassEx->hbrBackground = Class->hbrBackground; @@ -260,24 +272,35 @@ NtUserGetWOWClass(DWORD Unknown0, } PWNDCLASS_OBJECT FASTCALL -IntCreateClass(CONST WNDCLASSEXW *lpwcx, - BOOL bUnicodeClass, - WNDPROC wpExtra, - RTL_ATOM Atom) +IntCreateClass( + CONST WNDCLASSEXW *lpwcx, + DWORD Flags, + WNDPROC wpExtra, + PUNICODE_STRING MenuName, + RTL_ATOM Atom) { PWNDCLASS_OBJECT ClassObject; ULONG objectSize; - NTSTATUS Status; + BOOL Global; + + Global = !(Flags & REGISTERCLASS_SYSTEM) ? ClassObject->style & CS_GLOBALCLASS : TRUE; /* Check for double registration of the class. */ if (PsGetWin32Process() != NULL) { - Status = ClassReferenceClassByAtom(&ClassObject, Atom); - if (NT_SUCCESS(Status)) + if (ClassReferenceClassByAtom(&ClassObject, Atom, lpwcx->hInstance)) { - ObmDereferenceObject(ClassObject); - SetLastWin32Error(ERROR_CLASS_ALREADY_EXISTS); - return(NULL); + /* + * NOTE: We may also get a global class from + * ClassReferenceClassByAtom. This simple check + * prevents that we fail valid request. + */ + if (ClassObject->hInstance == lpwcx->hInstance) + { + SetLastWin32Error(ERROR_CLASS_ALREADY_EXISTS); + ObmDereferenceObject(ClassObject); + return(NULL); + } } } @@ -297,40 +320,41 @@ IntCreateClass(CONST WNDCLASSEXW *lpwcx, ClassObject->hIcon = lpwcx->hIcon; ClassObject->hCursor = lpwcx->hCursor; ClassObject->hbrBackground = lpwcx->hbrBackground; - ClassObject->Unicode = bUnicodeClass; + ClassObject->Unicode = !(Flags & REGISTERCLASS_ANSI); + ClassObject->Global = Global; ClassObject->hIconSm = lpwcx->hIconSm; ClassObject->Atom = Atom; - if (wpExtra == 0) { - if (bUnicodeClass) - { - ClassObject->lpfnWndProcW = lpwcx->lpfnWndProc; - ClassObject->lpfnWndProcA = (WNDPROC)IntAddWndProcHandle(lpwcx->lpfnWndProc,TRUE); - } - else - { - ClassObject->lpfnWndProcA = lpwcx->lpfnWndProc; + if (wpExtra == NULL) { + if (Flags & REGISTERCLASS_ANSI) + { + ClassObject->lpfnWndProcA = lpwcx->lpfnWndProc; ClassObject->lpfnWndProcW = (WNDPROC)IntAddWndProcHandle(lpwcx->lpfnWndProc,FALSE); } - } else { - if (bUnicodeClass) + else { ClassObject->lpfnWndProcW = lpwcx->lpfnWndProc; - ClassObject->lpfnWndProcA = wpExtra; + ClassObject->lpfnWndProcA = (WNDPROC)IntAddWndProcHandle(lpwcx->lpfnWndProc,TRUE); } - else + } else { + if (Flags & REGISTERCLASS_ANSI) { ClassObject->lpfnWndProcA = lpwcx->lpfnWndProc; ClassObject->lpfnWndProcW = wpExtra; } + else + { + ClassObject->lpfnWndProcW = lpwcx->lpfnWndProc; + ClassObject->lpfnWndProcA = wpExtra; + } } - if (IS_INTRESOURCE(lpwcx->lpszMenuName)) + if (MenuName->Length == 0) { - ClassObject->lpszMenuName = (PUNICODE_STRING)lpwcx->lpszMenuName; + ClassObject->lpszMenuName = (PUNICODE_STRING)MenuName->Buffer; } else { - ClassObject->lpszMenuName = ExAllocatePoolWithTag(NonPagedPool,sizeof(UNICODE_STRING), TAG_STRING); - RtlCreateUnicodeString(ClassObject->lpszMenuName,(LPWSTR)lpwcx->lpszMenuName); + ClassObject->lpszMenuName = ExAllocatePoolWithTag(NonPagedPool, sizeof(UNICODE_STRING), TAG_STRING); + RtlCreateUnicodeString(ClassObject->lpszMenuName, MenuName->Buffer); } /* Extra class data */ if (ClassObject->cbClsExtra != 0) @@ -348,11 +372,13 @@ IntCreateClass(CONST WNDCLASSEXW *lpwcx, RTL_ATOM STDCALL NtUserRegisterClassExWOW( - CONST WNDCLASSEXW *lpwcx, - BOOL bUnicodeClass, - WNDPROC wpExtra, - DWORD Unknown4, - DWORD Unknown5) + CONST WNDCLASSEXW* lpwcx, + PUNICODE_STRING ClassName, + PUNICODE_STRING ClassNameCopy, + PUNICODE_STRING MenuName, + WNDPROC wpExtra, /* FIXME: Windows uses this parameter for something different. */ + DWORD Flags, + DWORD Unknown7) /* * FUNCTION: @@ -366,31 +392,37 @@ NtUserRegisterClassExWOW( * Atom identifying the new class */ { - WNDCLASSEXW SafeClass; - PWINSTATION_OBJECT WinStaObject; - PWNDCLASS_OBJECT ClassObject; - NTSTATUS Status; - RTL_ATOM Atom; + WNDCLASSEXW SafeClass; + PWINSTATION_OBJECT WinStaObject; + PWNDCLASS_OBJECT ClassObject; + NTSTATUS Status; + RTL_ATOM Atom; - if(!lpwcx) - { - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return (RTL_ATOM)0; - } + if (!lpwcx) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return (RTL_ATOM)0; + } + + if (Flags & ~REGISTERCLASS_ALL) + { + SetLastWin32Error(ERROR_INVALID_FLAGS); + return (RTL_ATOM)0; + } + + Status = MmCopyFromCaller(&SafeClass, lpwcx, sizeof(WNDCLASSEXW)); + if (!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return (RTL_ATOM)0; + } - Status = MmCopyFromCaller(&SafeClass, lpwcx, sizeof(WNDCLASSEXW)); - if (!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return (RTL_ATOM)0; - } - - /* Deny negative sizes */ - if(lpwcx->cbClsExtra < 0 || lpwcx->cbWndExtra < 0) - { - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return (RTL_ATOM)0; - } + /* Deny negative sizes */ + if (lpwcx->cbClsExtra < 0 || lpwcx->cbWndExtra < 0) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return (RTL_ATOM)0; + } DPRINT("About to open window station handle (0x%X)\n", PROCESS_WINDOW_STATION()); @@ -404,30 +436,30 @@ NtUserRegisterClassExWOW( PROCESS_WINDOW_STATION()); return((RTL_ATOM)0); } - if (!IS_ATOM(SafeClass.lpszClassName)) + if (ClassName->Length) { - DPRINT("NtUserRegisterClassExWOW(%S)\n", SafeClass.lpszClassName); + DPRINT("NtUserRegisterClassExWOW(%S)\n", ClassName->Buffer); /* FIXME - Safely copy/verify the buffer first!!! */ Status = RtlAddAtomToAtomTable(WinStaObject->AtomTable, - (LPWSTR)SafeClass.lpszClassName, + ClassName->Buffer, &Atom); if (!NT_SUCCESS(Status)) { ObDereferenceObject(WinStaObject); - DPRINT("Failed adding class name (%wS) to atom table\n", - lpwcx->lpszClassName); + DPRINT("Failed adding class name (%S) to atom table\n", + ClassName->Buffer); SetLastNtError(Status); return((RTL_ATOM)0); } } else { - Atom = (RTL_ATOM)(ULONG)SafeClass.lpszClassName; + Atom = (RTL_ATOM)(ULONG)ClassName->Buffer; } - ClassObject = IntCreateClass(&SafeClass, bUnicodeClass, wpExtra, Atom); + ClassObject = IntCreateClass(&SafeClass, Flags, wpExtra, MenuName, Atom); if (ClassObject == NULL) { - if (!IS_ATOM(SafeClass.lpszClassName)) + if (ClassName->Length) { RtlDeleteAtomFromAtomTable(WinStaObject->AtomTable, Atom); } @@ -654,8 +686,7 @@ NtUserUnregisterClass( return FALSE; } - Status = ClassReferenceClassByNameOrAtom(&Class, ClassNameOrAtom); - if (!NT_SUCCESS(Status)) + if (!ClassReferenceClassByNameOrAtom(&Class, ClassNameOrAtom, hInstance)) { SetLastWin32Error(ERROR_CLASS_DOES_NOT_EXIST); return FALSE; diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index f0d763e549e..aa522f932e5 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.232 2004/05/14 16:50:16 navaraf Exp $ +/* $Id: window.c,v 1.233 2004/05/16 19:31:09 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1413,6 +1413,7 @@ NtUserCreateWindowEx(DWORD dwExStyle, CBT_CREATEWNDW CbtCreate; LRESULT Result; BOOL MenuChanged; + BOOL ClassFound; LPWSTR OrigWindowName = NULL; DPRINT("NtUserCreateWindowEx(): (%d,%d-%d,%d)\n", x, y, nWidth, nHeight); @@ -1488,16 +1489,16 @@ NtUserCreateWindowEx(DWORD dwExStyle, /* FIXME: parent must belong to the current process */ /* Check the class. */ - Status = ClassReferenceClassByNameOrAtom(&ClassObject, lpClassName->Buffer); - if (!NT_SUCCESS(Status)) - { - RtlFreeUnicodeString(&WindowName); - if (NULL != ParentWindow) - { - IntReleaseWindowObject(ParentWindow); - } - return((HWND)0); - } + ClassFound = ClassReferenceClassByNameOrAtom(&ClassObject, lpClassName->Buffer, hInstance); + if (!ClassFound) + { + RtlFreeUnicodeString(&WindowName); + if (NULL != ParentWindow) + { + IntReleaseWindowObject(ParentWindow); + } + return((HWND)0); + } /* Check the window station. */ DPRINT("IoGetCurrentProcess() %X\n", IoGetCurrentProcess()); @@ -2304,6 +2305,7 @@ NtUserFindWindowEx(HWND hwndParent, NTSTATUS Status; HWND Desktop, Ret = NULL; PWNDCLASS_OBJECT ClassObject = NULL; + BOOL ClassFound; Desktop = IntGetDesktopWindow(); @@ -2373,15 +2375,14 @@ NtUserFindWindowEx(HWND hwndParent, if(ClassName.Buffer) { /* this expects the string in ClassName to be NULL-terminated! */ - Status = ClassReferenceClassByNameOrAtom(&ClassObject, ClassName.Buffer); - if(!NT_SUCCESS(Status)) + ClassFound = ClassReferenceClassByNameOrAtom(&ClassObject, ClassName.Buffer, NULL); + if(!ClassFound) { if (IS_ATOM(ClassName.Buffer)) DPRINT1("Window class not found (%lx)\n", (ULONG_PTR)ClassName.Buffer); else DPRINT1("Window class not found (%S)\n", ClassName.Buffer); - /* windows returns ERROR_FILE_NOT_FOUND !? */ - SetLastWin32Error(ERROR_FILE_NOT_FOUND); + SetLastWin32Error(ERROR_CLASS_DOES_NOT_EXIST); goto Cleanup; } } From caa8f5caae22770272fa7497ee4700642e46787a Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 16 May 2004 19:42:32 +0000 Subject: [PATCH 1149/1463] - Don't use object that's already unlocked. svn path=/trunk/; revision=9418 --- reactos/subsys/win32k/objects/color.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/objects/color.c b/reactos/subsys/win32k/objects/color.c index f084a04c45d..0077518fd8b 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.40 2004/05/14 22:20:46 navaraf Exp $ */ +/* $Id: color.c,v 1.41 2004/05/16 19:42:32 navaraf Exp $ */ #include <w32k.h> // FIXME: Use PXLATEOBJ logicalToSystem instead of int *mapping @@ -364,7 +364,7 @@ UINT STDCALL NtGdiRealizePalette(HDC hDC) if(dc->w.flags != DC_MEMORY) { // Device managed DC - palGDI->logicalToSystem = IntEngCreateXlate(sysGDI->Mode, palGDI->Mode, systemPalette, dc->w.hPalette); + palGDI->logicalToSystem = IntEngCreateXlate(sysMode, palMode, systemPalette, dc->w.hPalette); } DC_UnlockDc(hDC); From fb5e84bd1f572b90d741dd38e942f5c3f4771d61 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 16 May 2004 22:27:57 +0000 Subject: [PATCH 1150/1463] - Set Mdl->Process in MmMapLockedPages to current process and back to NULL in MmUnmapLockedPages. svn path=/trunk/; revision=9419 --- reactos/ntoskrnl/mm/mdl.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/mdl.c b/reactos/ntoskrnl/mm/mdl.c index cb395e45d72..ff2bc4ef119 100644 --- a/reactos/ntoskrnl/mm/mdl.c +++ b/reactos/ntoskrnl/mm/mdl.c @@ -1,4 +1,4 @@ -/* $Id: mdl.c,v 1.62 2004/04/20 18:59:00 gdalsnes Exp $ +/* $Id: mdl.c,v 1.63 2004/05/16 22:27:57 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -235,6 +235,8 @@ MmMapLockedPages(PMDL Mdl, KPROCESSOR_MODE AccessMode) KEBUGCHECK(0); /* FIXME: handle this? */ } + + Mdl->Process = CurrentProcess; } else /* if (AccessMode == KernelMode) */ { @@ -408,6 +410,8 @@ MmUnmapLockedPages(PVOID BaseAddress, PMDL Mdl) } MmFreeMemoryArea( &Mdl->Process->AddressSpace, Marea->BaseAddress, 0, NULL, NULL ); + + Mdl->Process = NULL; } } From 06c03f786af8b7225626b884688bb92fa3f92cd2 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Mon, 17 May 2004 13:11:06 +0000 Subject: [PATCH 1151/1463] use precompiled headers for VC++ builds svn path=/trunk/; revision=9420 --- reactos/subsys/system/explorer/Makefile | 2 +- reactos/subsys/system/explorer/Makefile.MinGW | 2 +- .../system/explorer/desktop/desktop.cpp | 10 +------ .../system/explorer/dialogs/searchprogram.cpp | 4 +-- .../system/explorer/dialogs/settings.cpp | 8 ++--- reactos/subsys/system/explorer/explorer.cpp | 8 +---- reactos/subsys/system/explorer/explorer.dsp | 30 +++++++++++++------ reactos/subsys/system/explorer/precomp.cpp | 28 +++++++++++++++++ .../subsys/system/explorer/shell/entries.cpp | 6 ++-- .../subsys/system/explorer/shell/fatfs.cpp | 5 +--- .../system/explorer/shell/filechild.cpp | 4 +-- .../system/explorer/shell/mainframe.cpp | 6 +--- .../subsys/system/explorer/shell/ntobjfs.cpp | 6 ++-- reactos/subsys/system/explorer/shell/pane.cpp | 5 +--- .../subsys/system/explorer/shell/regfs.cpp | 4 +-- .../system/explorer/shell/shellbrowser.cpp | 5 +--- .../subsys/system/explorer/shell/shellfs.cpp | 10 ++----- .../subsys/system/explorer/shell/unixfs.cpp | 6 ++-- .../subsys/system/explorer/shell/webchild.cpp | 3 +- .../subsys/system/explorer/shell/winfs.cpp | 7 ++--- .../system/explorer/taskbar/desktopbar.cpp | 5 +--- .../system/explorer/taskbar/favorites.cpp | 5 +--- .../system/explorer/taskbar/quicklaunch.cpp | 5 +--- .../system/explorer/taskbar/startmenu.cpp | 5 +--- .../system/explorer/taskbar/taskbar.cpp | 5 +--- .../system/explorer/taskbar/traynotify.cpp | 5 +--- .../system/explorer/utility/dragdropimpl.cpp | 9 ++++-- .../explorer/utility/shellbrowserimpl.cpp | 4 +-- .../system/explorer/utility/shellclasses.cpp | 3 +- .../system/explorer/utility/utility.cpp | 5 ++-- .../subsys/system/explorer/utility/window.cpp | 5 +--- .../system/explorer/utility/xmlstorage.cpp | 4 +-- 32 files changed, 94 insertions(+), 125 deletions(-) create mode 100644 reactos/subsys/system/explorer/precomp.cpp diff --git a/reactos/subsys/system/explorer/Makefile b/reactos/subsys/system/explorer/Makefile index a1f5fe08fab..890735043cb 100644 --- a/reactos/subsys/system/explorer/Makefile +++ b/reactos/subsys/system/explorer/Makefile @@ -43,7 +43,7 @@ ifndef UNICODE UNICODE = 1 endif -CFLAGS = -DWIN32 -D_ROS_ -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -fexceptions -Wall -I$(W32API_PATH)/include +CFLAGS = -DWIN32 -D_ROS_ -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -fexceptions -Wall -I. -I$(W32API_PATH)/include RCFLAGS = -DWIN32 -D_ROS_ -D__WINDRES__ --include-dir $(W32API_PATH)/include LFLAGS = -Wl,--subsystem,windows diff --git a/reactos/subsys/system/explorer/Makefile.MinGW b/reactos/subsys/system/explorer/Makefile.MinGW index 1c5c13949cd..0acdf751c72 100644 --- a/reactos/subsys/system/explorer/Makefile.MinGW +++ b/reactos/subsys/system/explorer/Makefile.MinGW @@ -8,7 +8,7 @@ CC = gcc CXX = g++ LINK = g++ -CFLAGS = -DWIN32 -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -fexceptions -Wall +CFLAGS = -DWIN32 -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -fexceptions -Wall -I. RCFLAGS = -DWIN32 -D__WINDRES__ LFLAGS = -Wl,--subsystem,windows diff --git a/reactos/subsys/system/explorer/desktop/desktop.cpp b/reactos/subsys/system/explorer/desktop/desktop.cpp index 848b645188e..75bb0ed9213 100644 --- a/reactos/subsys/system/explorer/desktop/desktop.cpp +++ b/reactos/subsys/system/explorer/desktop/desktop.cpp @@ -26,20 +26,12 @@ // -#include "../utility/utility.h" -#include "../utility/shellclasses.h" -#include "../utility/shellbrowserimpl.h" -#include "../utility/dragdropimpl.h" -#include "../utility/window.h" +#include "precomp.h" -#include "../globals.h" -#include "../externals.h" #include "../explorer_intres.h" -#include "desktop.h" #include "../taskbar/desktopbar.h" #include "../taskbar/taskbar.h" // for PM_GET_LAST_ACTIVE -#include "../shell/mainframe.h" // for MainFrame::OpenShellFolders() static BOOL (WINAPI*SetShellWindow)(HWND); diff --git a/reactos/subsys/system/explorer/dialogs/searchprogram.cpp b/reactos/subsys/system/explorer/dialogs/searchprogram.cpp index 3929d059407..5db205ac2d0 100644 --- a/reactos/subsys/system/explorer/dialogs/searchprogram.cpp +++ b/reactos/subsys/system/explorer/dialogs/searchprogram.cpp @@ -28,10 +28,8 @@ // -#include "../utility/utility.h" +#include "precomp.h" -#include "../explorer.h" -#include "../globals.h" #include "../explorer_intres.h" #include "searchprogram.h" diff --git a/reactos/subsys/system/explorer/dialogs/settings.cpp b/reactos/subsys/system/explorer/dialogs/settings.cpp index 2260b448661..3f065d56df4 100644 --- a/reactos/subsys/system/explorer/dialogs/settings.cpp +++ b/reactos/subsys/system/explorer/dialogs/settings.cpp @@ -28,15 +28,11 @@ // -#include "../utility/utility.h" +#include "precomp.h" -#include "../explorer.h" -#include "../globals.h" -#include "../externals.h" #include "../explorer_intres.h" -#include "../desktop/desktop.h" -#include "../taskbar/traynotify.h" +#include "../taskbar/traynotify.h" #include "settings.h" diff --git a/reactos/subsys/system/explorer/explorer.cpp b/reactos/subsys/system/explorer/explorer.cpp index 2b933b9b06d..e415bb2eeb7 100644 --- a/reactos/subsys/system/explorer/explorer.cpp +++ b/reactos/subsys/system/explorer/explorer.cpp @@ -28,13 +28,7 @@ // -#include "utility/utility.h" - -#include "explorer.h" -#include "desktop/desktop.h" - -#include "globals.h" -#include "externals.h" +#include "precomp.h" #include "explorer_intres.h" diff --git a/reactos/subsys/system/explorer/explorer.dsp b/reactos/subsys/system/explorer/explorer.dsp index f240ab90e46..075c4f81b3d 100644 --- a/reactos/subsys/system/explorer/explorer.dsp +++ b/reactos/subsys/system/explorer/explorer.dsp @@ -49,7 +49,7 @@ RSC=rc.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GR /GX /O1 /D "NDEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /YX /FD /c +# ADD CPP /nologo /MD /W3 /GR /GX /O1 /D "NDEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /Yu"precomp.h" /FD /c # ADD BASE RSC /l 0x407 /d "NDEBUG" # ADD RSC /l 0x407 /d "NDEBUG" BSC32=bscmake.exe @@ -74,7 +74,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /Yu"precomp.h" /FD /GZ /c # ADD BASE RSC /l 0x407 /d "_DEBUG" # ADD RSC /l 0x407 /d "_DEBUG" BSC32=bscmake.exe @@ -100,7 +100,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_ROS_" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GR /GX /Zi /O2 /D "NDEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /YX /FD /c +# ADD CPP /nologo /MD /W3 /GR /GX /Zi /O2 /D "NDEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /Yu"precomp.h" /FD /c # ADD BASE RSC /l 0x407 /d "NDEBUG" # ADD RSC /l 0x407 /d "NDEBUG" BSC32=bscmake.exe @@ -126,7 +126,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /YX /FD /c +# ADD CPP /nologo /MD /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /Yu"precomp.h" /FD /c # ADD BASE RSC /l 0x407 /d "NDEBUG" # ADD RSC /l 0x407 /d "NDEBUG" BSC32=bscmake.exe @@ -152,7 +152,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /FR /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /Yu"precomp.h" /FD /GZ /c # ADD BASE RSC /l 0x407 /d "_DEBUG" # ADD RSC /l 0x407 /d "_DEBUG" BSC32=bscmake.exe @@ -178,7 +178,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "_NO_COMUTIL" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "_NO_COMUTIL" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /Yu"precomp.h" /FD /GZ /c # ADD BASE RSC /l 0x407 /d "_DEBUG" # ADD RSC /l 0x407 /d "_DEBUG" BSC32=bscmake.exe @@ -205,7 +205,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /Yu"precomp.h" /FD /GZ /c # ADD BASE RSC /l 0x407 /d "_DEBUG" # ADD RSC /l 0x407 /d "_DEBUG" BSC32=bscmake.exe @@ -232,7 +232,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "UNICODE" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c -# ADD CPP /nologo /MT /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FD /c +# ADD CPP /nologo /MT /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /Yu"precomp.h" /FD /c # ADD BASE RSC /l 0x407 /d "_DEBUG" # ADD RSC /l 0x407 /d "_DEBUG" BSC32=bscmake.exe @@ -259,7 +259,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FD /c -# ADD CPP /nologo /MD /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FD /c +# ADD CPP /nologo /MD /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /Yu"precomp.h" /FD /c # ADD BASE RSC /l 0x407 /d "_DEBUG" # ADD RSC /l 0x407 /d "_DEBUG" BSC32=bscmake.exe @@ -703,10 +703,12 @@ SOURCE=.\shell\shellfs.h # Begin Source File SOURCE=.\shell\startup.c +# SUBTRACT CPP /YX /Yc /Yu # End Source File # Begin Source File SOURCE=.\shell\unixfs.cpp +# PROP Exclude_From_Build 1 # End Source File # Begin Source File @@ -775,6 +777,16 @@ SOURCE=.\globals.h # Begin Source File SOURCE=".\i386-stub-win32.c" +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=.\precomp.cpp +# ADD CPP /Yc"precomp.h" +# End Source File +# Begin Source File + +SOURCE=.\precomp.h # End Source File # End Group # End Target diff --git a/reactos/subsys/system/explorer/precomp.cpp b/reactos/subsys/system/explorer/precomp.cpp new file mode 100644 index 00000000000..f8e7255fe0e --- /dev/null +++ b/reactos/subsys/system/explorer/precomp.cpp @@ -0,0 +1,28 @@ +/* + * Copyright 2004 Martin Fuchs + * + * 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 + */ + + + // + // Explorer clone - precompiled header support + // + // precomp.h + // + // Martin Fuchs, 17.05.2004 + // + +#include "precomp.h" diff --git a/reactos/subsys/system/explorer/shell/entries.cpp b/reactos/subsys/system/explorer/shell/entries.cpp index 9ffa3373e38..e81edbd337b 100644 --- a/reactos/subsys/system/explorer/shell/entries.cpp +++ b/reactos/subsys/system/explorer/shell/entries.cpp @@ -26,11 +26,9 @@ // -#include "../utility/utility.h" -#include "../utility/shellclasses.h" -#include "../globals.h" // for _prescan_nodes +#include "precomp.h" -#include "entries.h" +//#include "entries.h" // allocate and initialise a directory entry diff --git a/reactos/subsys/system/explorer/shell/fatfs.cpp b/reactos/subsys/system/explorer/shell/fatfs.cpp index 91c19b650bf..72927c7dedc 100644 --- a/reactos/subsys/system/explorer/shell/fatfs.cpp +++ b/reactos/subsys/system/explorer/shell/fatfs.cpp @@ -26,11 +26,8 @@ // -#include "../utility/utility.h" -#include "../utility/shellclasses.h" -#include "../globals.h" +#include "precomp.h" -#include "entries.h" #include "fatfs.h" diff --git a/reactos/subsys/system/explorer/shell/filechild.cpp b/reactos/subsys/system/explorer/shell/filechild.cpp index be000793fc8..bf7a8761317 100644 --- a/reactos/subsys/system/explorer/shell/filechild.cpp +++ b/reactos/subsys/system/explorer/shell/filechild.cpp @@ -26,10 +26,8 @@ // -#include "../utility/utility.h" +#include "precomp.h" -#include "../explorer.h" -#include "../globals.h" #include "ntobjfs.h" #include "regfs.h" #include "fatfs.h" diff --git a/reactos/subsys/system/explorer/shell/mainframe.cpp b/reactos/subsys/system/explorer/shell/mainframe.cpp index 704641e4885..af334eacaaf 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.cpp +++ b/reactos/subsys/system/explorer/shell/mainframe.cpp @@ -26,11 +26,7 @@ // -#include "../utility/utility.h" - -#include "../explorer.h" -#include "../globals.h" -#include "../externals.h" +#include "precomp.h" /* We can't include webchild.h here - otherwise MinGW produces errors like: "multiple definition of `QACONTAINERFLAGS'" #include "webchild.h" diff --git a/reactos/subsys/system/explorer/shell/ntobjfs.cpp b/reactos/subsys/system/explorer/shell/ntobjfs.cpp index ea912af4fa5..286a8f8963e 100644 --- a/reactos/subsys/system/explorer/shell/ntobjfs.cpp +++ b/reactos/subsys/system/explorer/shell/ntobjfs.cpp @@ -26,12 +26,10 @@ // -#include "../utility/utility.h" -#include "../utility/shellclasses.h" +#include "precomp.h" -#include "entries.h" #include "ntobjfs.h" -#include "winfs.h" +//#include "winfs.h" #include "regfs.h" diff --git a/reactos/subsys/system/explorer/shell/pane.cpp b/reactos/subsys/system/explorer/shell/pane.cpp index 15e516b53ac..e6d760c9fa4 100644 --- a/reactos/subsys/system/explorer/shell/pane.cpp +++ b/reactos/subsys/system/explorer/shell/pane.cpp @@ -26,10 +26,7 @@ // -#include "../utility/utility.h" - -#include "../explorer.h" -#include "../globals.h" +#include "precomp.h" #include "../explorer_intres.h" diff --git a/reactos/subsys/system/explorer/shell/regfs.cpp b/reactos/subsys/system/explorer/shell/regfs.cpp index f114bfc9505..a31a36007dd 100644 --- a/reactos/subsys/system/explorer/shell/regfs.cpp +++ b/reactos/subsys/system/explorer/shell/regfs.cpp @@ -26,10 +26,8 @@ // -#include "../utility/utility.h" -#include "../utility/shellclasses.h" +#include "precomp.h" -#include "entries.h" #include "regfs.h" diff --git a/reactos/subsys/system/explorer/shell/shellbrowser.cpp b/reactos/subsys/system/explorer/shell/shellbrowser.cpp index d2e966798c8..72d438fc117 100644 --- a/reactos/subsys/system/explorer/shell/shellbrowser.cpp +++ b/reactos/subsys/system/explorer/shell/shellbrowser.cpp @@ -26,10 +26,7 @@ // -#include "../utility/utility.h" - -#include "../explorer.h" -#include "../globals.h" +#include "precomp.h" #include "../explorer_intres.h" diff --git a/reactos/subsys/system/explorer/shell/shellfs.cpp b/reactos/subsys/system/explorer/shell/shellfs.cpp index 402cb0e4c50..9fb227483b3 100644 --- a/reactos/subsys/system/explorer/shell/shellfs.cpp +++ b/reactos/subsys/system/explorer/shell/shellfs.cpp @@ -26,14 +26,10 @@ // -#include "../utility/utility.h" -#include "../utility/shellclasses.h" +#include "precomp.h" -#include "../globals.h" - -#include "entries.h" -#include "shellfs.h" -#include "winfs.h" +//#include "shellfs.h" +//#include "winfs.h" #include <shlwapi.h> diff --git a/reactos/subsys/system/explorer/shell/unixfs.cpp b/reactos/subsys/system/explorer/shell/unixfs.cpp index 3c10d1d294d..7e5dd1f9a34 100644 --- a/reactos/subsys/system/explorer/shell/unixfs.cpp +++ b/reactos/subsys/system/explorer/shell/unixfs.cpp @@ -28,11 +28,9 @@ #ifdef __WINE__ -#include "../utility/utility.h" -#include "../utility/shellclasses.h" +#include "precomp.h" -#include "entries.h" -#include "unixfs.h" +//#include "unixfs.h" // for UnixDirectory::read_directory() #include <dirent.h> diff --git a/reactos/subsys/system/explorer/shell/webchild.cpp b/reactos/subsys/system/explorer/shell/webchild.cpp index ac5c84d5675..a011c29b989 100644 --- a/reactos/subsys/system/explorer/shell/webchild.cpp +++ b/reactos/subsys/system/explorer/shell/webchild.cpp @@ -26,8 +26,7 @@ // -#include "../utility/utility.h" -#include "../explorer.h" +#include "precomp.h" #include "../explorer_intres.h" diff --git a/reactos/subsys/system/explorer/shell/winfs.cpp b/reactos/subsys/system/explorer/shell/winfs.cpp index e32bc00b5ea..a05994e45ce 100644 --- a/reactos/subsys/system/explorer/shell/winfs.cpp +++ b/reactos/subsys/system/explorer/shell/winfs.cpp @@ -26,12 +26,9 @@ // -#include "../utility/utility.h" -#include "../utility/shellclasses.h" -#include "../globals.h" +#include "precomp.h" -#include "entries.h" -#include "winfs.h" +//#include "winfs.h" int ScanNTFSStreams(Entry* entry, HANDLE hFile) diff --git a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp index c5806b90646..651420d7401 100644 --- a/reactos/subsys/system/explorer/taskbar/desktopbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/desktopbar.cpp @@ -26,11 +26,8 @@ // -#include "../utility/utility.h" +#include "precomp.h" -#include "../explorer.h" -#include "../globals.h" -#include "../externals.h" #include "../explorer_intres.h" #include "desktopbar.h" diff --git a/reactos/subsys/system/explorer/taskbar/favorites.cpp b/reactos/subsys/system/explorer/taskbar/favorites.cpp index d263ae2408c..330cad2a9ad 100644 --- a/reactos/subsys/system/explorer/taskbar/favorites.cpp +++ b/reactos/subsys/system/explorer/taskbar/favorites.cpp @@ -26,10 +26,7 @@ // -#include "../utility/utility.h" - -#include "../explorer.h" -#include "../globals.h" +#include "precomp.h" #include "startmenu.h" diff --git a/reactos/subsys/system/explorer/taskbar/quicklaunch.cpp b/reactos/subsys/system/explorer/taskbar/quicklaunch.cpp index d2f863b3463..8e695728324 100644 --- a/reactos/subsys/system/explorer/taskbar/quicklaunch.cpp +++ b/reactos/subsys/system/explorer/taskbar/quicklaunch.cpp @@ -26,11 +26,8 @@ // -#include "../utility/utility.h" +#include "precomp.h" -#include "../explorer.h" -#include "../globals.h" -#include "../externals.h" #include "../explorer_intres.h" #include "quicklaunch.h" diff --git a/reactos/subsys/system/explorer/taskbar/startmenu.cpp b/reactos/subsys/system/explorer/taskbar/startmenu.cpp index 1b7818aff58..8bd3c5c4ec9 100644 --- a/reactos/subsys/system/explorer/taskbar/startmenu.cpp +++ b/reactos/subsys/system/explorer/taskbar/startmenu.cpp @@ -30,11 +30,8 @@ // -#include "../utility/utility.h" +#include "precomp.h" -#include "../explorer.h" -#include "../globals.h" -#include "../externals.h" #include "../explorer_intres.h" #include "desktopbar.h" diff --git a/reactos/subsys/system/explorer/taskbar/taskbar.cpp b/reactos/subsys/system/explorer/taskbar/taskbar.cpp index 9e567ff939b..61d8a1a032e 100644 --- a/reactos/subsys/system/explorer/taskbar/taskbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/taskbar.cpp @@ -26,10 +26,7 @@ // -#include "../utility/utility.h" - -#include "../explorer.h" -#include "../globals.h" +#include "precomp.h" #include "taskbar.h" #include "traynotify.h" // for NOTIFYAREA_WIDTH_DEF diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp index effe294b9d2..650d6796d06 100644 --- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp +++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp @@ -26,10 +26,7 @@ // -#include "../utility/utility.h" - -#include "../explorer.h" -#include "../globals.h" +#include "precomp.h" #include "../explorer_intres.h" diff --git a/reactos/subsys/system/explorer/utility/dragdropimpl.cpp b/reactos/subsys/system/explorer/utility/dragdropimpl.cpp index 69faa8870b5..e92f42cebbc 100644 --- a/reactos/subsys/system/explorer/utility/dragdropimpl.cpp +++ b/reactos/subsys/system/explorer/utility/dragdropimpl.cpp @@ -1,3 +1,5 @@ +#include "precomp.h" + /************************************************************************** THIS CODE AND INFORMATION IS PROVIDED 'AS IS' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO @@ -9,10 +11,11 @@ // dragdropimp.cpp: implementation of the IDataObjectImpl class. ////////////////////////////////////////////////////////////////////// -#include <shlobj.h> -#include <assert.h> -#include "dragdropimpl.h" +//#include <shlobj.h> +//#include <assert.h> + +//#include "dragdropimpl.h" ////////////////////////////////////////////////////////////////////// // IDataObjectImpl Class diff --git a/reactos/subsys/system/explorer/utility/shellbrowserimpl.cpp b/reactos/subsys/system/explorer/utility/shellbrowserimpl.cpp index a72cb60e845..ae523f1f5bd 100644 --- a/reactos/subsys/system/explorer/utility/shellbrowserimpl.cpp +++ b/reactos/subsys/system/explorer/utility/shellbrowserimpl.cpp @@ -28,9 +28,7 @@ // -#include "utility.h" -#include "shellclasses.h" -#include "shellbrowserimpl.h" +#include "precomp.h" HRESULT IShellBrowserImpl::QueryInterface(REFIID iid, void** ppvObject) diff --git a/reactos/subsys/system/explorer/utility/shellclasses.cpp b/reactos/subsys/system/explorer/utility/shellclasses.cpp index afd648e1f7c..eff4eb3241b 100644 --- a/reactos/subsys/system/explorer/utility/shellclasses.cpp +++ b/reactos/subsys/system/explorer/utility/shellclasses.cpp @@ -28,8 +28,7 @@ // -#include "utility.h" -#include "shellclasses.h" +#include "precomp.h" #ifdef _MS_VER diff --git a/reactos/subsys/system/explorer/utility/utility.cpp b/reactos/subsys/system/explorer/utility/utility.cpp index afc646c2d80..6e025f7a059 100644 --- a/reactos/subsys/system/explorer/utility/utility.cpp +++ b/reactos/subsys/system/explorer/utility/utility.cpp @@ -26,8 +26,9 @@ // -#include "utility.h" -#include <shellapi.h> +#include "precomp.h" + +//#include <shellapi.h> #include <time.h> #include <sstream> diff --git a/reactos/subsys/system/explorer/utility/window.cpp b/reactos/subsys/system/explorer/utility/window.cpp index bb5d7a945fe..bbeba49d988 100644 --- a/reactos/subsys/system/explorer/utility/window.cpp +++ b/reactos/subsys/system/explorer/utility/window.cpp @@ -26,11 +26,8 @@ // -#include "utility.h" -#include "shellclasses.h" -#include "window.h" +#include "precomp.h" -#include "../globals.h" #include "../explorer_intres.h" // for ID_GO_BACK, ... diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.cpp b/reactos/subsys/system/explorer/utility/xmlstorage.cpp index b4fc7d9eac6..819146c68f7 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.cpp +++ b/reactos/subsys/system/explorer/utility/xmlstorage.cpp @@ -36,9 +36,9 @@ */ -#include "utility.h" +#include "precomp.h" -#include "xmlstorage.h" +//#include "xmlstorage.h" namespace XMLStorage { From 53a3421952594406e1f30e8b76a0d8d3ca2766c7 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Mon, 17 May 2004 13:20:05 +0000 Subject: [PATCH 1152/1463] Add range list flags. svn path=/trunk/; revision=9421 --- reactos/include/ntos/rtl.h | 4 ++-- reactos/include/ntos/rtltypes.h | 10 +++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/reactos/include/ntos/rtl.h b/reactos/include/ntos/rtl.h index 7f8450c5240..825e28312ee 100755 --- a/reactos/include/ntos/rtl.h +++ b/reactos/include/ntos/rtl.h @@ -1,4 +1,4 @@ -/* $Id: rtl.h,v 1.27 2004/02/03 14:19:29 ekohl Exp $ +/* $Id: rtl.h,v 1.28 2004/05/17 13:20:05 ekohl Exp $ * */ #ifndef __DDK_RTL_H @@ -649,7 +649,7 @@ RtlAddRange (IN OUT PRTL_RANGE_LIST RangeList, IN ULONGLONG Start, IN ULONGLONG End, IN UCHAR Attributes, - IN ULONG Flags, + IN ULONG Flags, /* RTL_RANGE_LIST_ADD_... flags */ IN PVOID UserData OPTIONAL, IN PVOID Owner OPTIONAL); diff --git a/reactos/include/ntos/rtltypes.h b/reactos/include/ntos/rtltypes.h index fc9723d9934..0fc39f8d0af 100755 --- a/reactos/include/ntos/rtltypes.h +++ b/reactos/include/ntos/rtltypes.h @@ -1,4 +1,4 @@ -/* $Id: rtltypes.h,v 1.13 2004/02/10 16:22:56 navaraf Exp $ +/* $Id: rtltypes.h,v 1.14 2004/05/17 13:20:05 ekohl Exp $ * */ @@ -129,11 +129,13 @@ typedef struct _RTL_SPLAY_LINKS typedef struct _RTL_RANGE_LIST { LIST_ENTRY ListHead; - ULONG Flags; + ULONG Flags; /* RTL_RANGE_LIST_... flags */ ULONG Count; ULONG Stamp; } RTL_RANGE_LIST, *PRTL_RANGE_LIST; +#define RTL_RANGE_LIST_ADD_IF_CONFLICT 0x00000001 +#define RTL_RANGE_LIST_ADD_SHARED 0x00000002 typedef struct _RTL_RANGE { @@ -142,9 +144,11 @@ typedef struct _RTL_RANGE PVOID UserData; PVOID Owner; UCHAR Attributes; - UCHAR Flags; + UCHAR Flags; /* RTL_RANGE_... flags */ } RTL_RANGE, *PRTL_RANGE; +#define RTL_RANGE_SHARED 0x01 +#define RTL_RANGE_CONFLICT 0x02 typedef BOOLEAN (STDCALL *PRTL_CONFLICT_RANGE_CALLBACK) (PVOID Context, From 06ed586fb1e3c2fdb9362d5f9bab6538fac59177 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Mon, 17 May 2004 13:21:52 +0000 Subject: [PATCH 1153/1463] Add documentation for some range list functions. svn path=/trunk/; revision=9422 --- reactos/lib/ntdll/rtl/rangelist.c | 145 +++++++++++++++++++++++++++--- 1 file changed, 135 insertions(+), 10 deletions(-) diff --git a/reactos/lib/ntdll/rtl/rangelist.c b/reactos/lib/ntdll/rtl/rangelist.c index dca953c8a48..34ce2201049 100644 --- a/reactos/lib/ntdll/rtl/rangelist.c +++ b/reactos/lib/ntdll/rtl/rangelist.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: rangelist.c,v 1.4 2004/05/15 19:41:10 ekohl Exp $ +/* $Id: rangelist.c,v 1.5 2004/05/17 13:21:52 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -75,10 +75,13 @@ RtlAddRange (IN OUT PRTL_RANGE_LIST RangeList, RangeEntry->Range.Start = Start; RangeEntry->Range.End = End; RangeEntry->Range.Attributes = Attributes; - RangeEntry->Range.Flags = Flags; RangeEntry->Range.UserData = UserData; RangeEntry->Range.Owner = Owner; + RangeEntry->Range.Flags = 0; + if (Flags & RTL_RANGE_LIST_ADD_SHARED) + RangeEntry->Range.Flags |= RTL_RANGE_SHARED; + /* Insert range entry */ if (RangeList->Count == 0) { @@ -123,7 +126,20 @@ RtlAddRange (IN OUT PRTL_RANGE_LIST RangeList, } -/* +/********************************************************************** + * NAME EXPORTED + * RtlCopyRangeList + * + * DESCRIPTION + * Copy a range list. + * + * ARGUMENTS + * CopyRangeList Pointer to the destination range list. + * RangeList Pointer to the source range list. + * + * RETURN VALUE + * Status + * * @implemented */ NTSTATUS STDCALL @@ -165,7 +181,21 @@ RtlCopyRangeList (OUT PRTL_RANGE_LIST CopyRangeList, } -/* +/********************************************************************** + * NAME EXPORTED + * RtlDeleteOwnersRanges + * + * DESCRIPTION + * Delete all ranges that belong to the given owner. + * + * ARGUMENTS + * RangeList Pointer to the range list. + * Owner User supplied value that identifies the owner + * of the ranges to be deleted. + * + * RETURN VALUE + * Status + * * @implemented */ NTSTATUS STDCALL @@ -197,7 +227,22 @@ RtlDeleteOwnersRanges (IN OUT PRTL_RANGE_LIST RangeList, } -/* +/********************************************************************** + * NAME EXPORTED + * RtlDeleteRange + * + * DESCRIPTION + * Deletes a given range. + * + * ARGUMENTS + * RangeList Pointer to the range list. + * Start Start of the range to be deleted. + * End End of the range to be deleted. + * Owner Owner of the ranges to be deleted. + * + * RETURN VALUE + * Status + * * @implemented */ NTSTATUS STDCALL @@ -250,11 +295,50 @@ RtlFindRange (IN PRTL_RANGE_LIST RangeList, IN PRTL_CONFLICT_RANGE_CALLBACK Callback OPTIONAL, OUT PULONGLONG Start) { +#if 0 + PRTL_RANGE_ENTRY Current; + PLIST_ENTRY Entry; + + Entry = RangeList->ListHead.Flink; + while (Entry != &RangeList->ListHead) + { + Current = CONTAINING_RECORD (Entry, RTL_RANGE_ENTRY, Entry); + if (Current->Range.Start >= Minimum && + Current->Range.End <= Maximum) + { + if (Callback != NULL) + { + Callback (Context, + &Current->Range); + } + + *Start = Current->Range.Start; + + return STATUS_SUCCESS; + } + + Entry = Entry->Flink; + } + + return STATUS_RANGE_NOT_FOUND; +#endif return STATUS_NOT_IMPLEMENTED; } -/* +/********************************************************************** + * NAME EXPORTED + * RtlFreeRangeList + * + * DESCRIPTION + * Deletes all ranges of a range list. + * + * ARGUMENTS + * RangeList Pointer to the range list. + * + * RETURN VALUE + * None + * * @implemented */ VOID STDCALL @@ -281,7 +365,21 @@ RtlFreeRangeList (IN PRTL_RANGE_LIST RangeList) } -/* +/********************************************************************** + * NAME EXPORTED + * RtlGetFirstRange + * + * DESCRIPTION + * Retrieves the first range of a range list. + * + * ARGUMENTS + * RangeList Pointer to the range list. + * Iterator Pointer to a user supplied list state buffer. + * Range Pointer to the first range. + * + * RETURN VALUE + * Status + * * @implemented */ NTSTATUS STDCALL @@ -306,7 +404,22 @@ RtlGetFirstRange (IN PRTL_RANGE_LIST RangeList, } -/* +/********************************************************************** + * NAME EXPORTED + * RtlGetNextRange + * + * DESCRIPTION + * Retrieves the next (or previous) range of a range list. + * + * ARGUMENTS + * Iterator Pointer to a user supplied list state buffer. + * Range Pointer to the first range. + * MoveForwards TRUE, get next range + * FALSE, get previous range + * + * RETURN VALUE + * Status + * * @implemented */ NTSTATUS STDCALL @@ -340,8 +453,20 @@ RtlGetNextRange (IN OUT PRTL_RANGE_LIST_ITERATOR Iterator, } -/* - * @unimplemented +/********************************************************************** + * NAME EXPORTED + * RtlInitializeRangeList + * + * DESCRIPTION + * Initializes a range list. + * + * ARGUMENTS + * RangeList Pointer to a user supplied range list. + * + * RETURN VALUE + * None + * + * @implemented */ VOID STDCALL RtlInitializeRangeList (IN OUT PRTL_RANGE_LIST RangeList) From aaa859c4a6caaa11986f68e17c6e75f4490745d1 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Mon, 17 May 2004 16:38:58 +0000 Subject: [PATCH 1154/1463] - Fixed Window Class menu handling that I broke with my last patch. svn path=/trunk/; revision=9423 --- reactos/lib/user32/windows/class.c | 6 ++-- reactos/subsys/win32k/include/class.h | 2 +- reactos/subsys/win32k/ntuser/class.c | 52 ++++++++++++++------------- 3 files changed, 31 insertions(+), 29 deletions(-) diff --git a/reactos/lib/user32/windows/class.c b/reactos/lib/user32/windows/class.c index cc42a2e7459..658906fd641 100644 --- a/reactos/lib/user32/windows/class.c +++ b/reactos/lib/user32/windows/class.c @@ -1,4 +1,4 @@ -/* $Id: class.c,v 1.48 2004/05/16 19:31:07 navaraf Exp $ +/* $Id: class.c,v 1.49 2004/05/17 16:38:57 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -442,7 +442,7 @@ RegisterClassExA(CONST WNDCLASSEXA *lpwcx) { MenuName.Length = MenuName.MaximumLength = 0; - MenuName.Buffer = (LPWSTR)lpwcx->lpszClassName; + MenuName.Buffer = (LPWSTR)lpwcx->lpszMenuName; } else { RtlCreateUnicodeStringFromAsciiz(&MenuName, lpwcx->lpszMenuName); @@ -515,7 +515,7 @@ RegisterClassExW(CONST WNDCLASSEXW *lpwcx) { MenuName.Length = MenuName.MaximumLength = 0; - MenuName.Buffer = (LPWSTR)lpwcx->lpszClassName; + MenuName.Buffer = (LPWSTR)lpwcx->lpszMenuName; } else { RtlInitUnicodeString(&MenuName, lpwcx->lpszMenuName); diff --git a/reactos/subsys/win32k/include/class.h b/reactos/subsys/win32k/include/class.h index 0a082921fb9..b8a752b6005 100644 --- a/reactos/subsys/win32k/include/class.h +++ b/reactos/subsys/win32k/include/class.h @@ -21,7 +21,7 @@ typedef struct _WNDCLASS_OBJECT HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; - PUNICODE_STRING lpszMenuName; + UNICODE_STRING lpszMenuName; RTL_ATOM Atom; HICON hIconSm; BOOL Unicode; diff --git a/reactos/subsys/win32k/ntuser/class.c b/reactos/subsys/win32k/ntuser/class.c index 7d1087e6278..654d364ec40 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.54 2004/05/16 19:31:09 navaraf Exp $ +/* $Id: class.c,v 1.55 2004/05/17 16:38:58 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -183,15 +183,10 @@ NtUserGetClassInfo( lpWndClassEx->hIcon = Class->hIcon; lpWndClassEx->hCursor = Class->hCursor; lpWndClassEx->hbrBackground = Class->hbrBackground; - if (Class->lpszMenuName) - { - if (!IS_INTRESOURCE((LPCWSTR)Class->lpszMenuName)) - RtlCopyUnicodeString((PUNICODE_STRING)lpWndClassEx->lpszMenuName, Class->lpszMenuName); - else - lpWndClassEx->lpszMenuName = (LPCWSTR)Class->lpszMenuName; - } + if (Class->lpszMenuName.MaximumLength) + RtlCopyUnicodeString((PUNICODE_STRING)lpWndClassEx->lpszMenuName, &Class->lpszMenuName); else - lpWndClassEx->lpszMenuName = (LPCWSTR)NULL; + lpWndClassEx->lpszMenuName = Class->lpszMenuName.Buffer; lpWndClassEx->lpszClassName = lpClassName; lpWndClassEx->hIconSm = Class->hIconSm; Atom = Class->Atom; @@ -349,12 +344,16 @@ IntCreateClass( } if (MenuName->Length == 0) { - ClassObject->lpszMenuName = (PUNICODE_STRING)MenuName->Buffer; + ClassObject->lpszMenuName.Length = + ClassObject->lpszMenuName.MaximumLength = 0; + ClassObject->lpszMenuName.Buffer = MenuName->Buffer; } else { - ClassObject->lpszMenuName = ExAllocatePoolWithTag(NonPagedPool, sizeof(UNICODE_STRING), TAG_STRING); - RtlCreateUnicodeString(ClassObject->lpszMenuName, MenuName->Buffer); + ClassObject->lpszMenuName.Length = + ClassObject->lpszMenuName.MaximumLength = MenuName->MaximumLength; + ClassObject->lpszMenuName.Buffer = ExAllocatePoolWithTag(PagedPool, ClassObject->lpszMenuName.MaximumLength, TAG_STRING); + RtlCopyUnicodeString(&ClassObject->lpszMenuName, MenuName); } /* Extra class data */ if (ClassObject->cbClsExtra != 0) @@ -516,7 +515,7 @@ IntGetClassLong(struct _WINDOW_OBJECT *WindowObject, ULONG Offset, BOOL Ansi) Ret = (ULONG)WindowObject->Class->hInstance; break; case GCL_MENUNAME: - Ret = (ULONG)WindowObject->Class->lpszMenuName; + Ret = (ULONG)WindowObject->Class->lpszMenuName.Buffer; break; case GCL_STYLE: Ret = WindowObject->Class->style; @@ -558,8 +557,6 @@ NtUserGetClassLong(HWND hWnd, DWORD Offset, BOOL Ansi) void FASTCALL IntSetClassLong(PWINDOW_OBJECT WindowObject, ULONG Offset, LONG dwNewLong, BOOL Ansi) { - PUNICODE_STRING str; - if ((int)Offset >= 0) { DPRINT("SetClassLong(%x, %d, %x)\n", WindowObject->Self, Offset, dwNewLong); @@ -596,16 +593,21 @@ IntSetClassLong(PWINDOW_OBJECT WindowObject, ULONG Offset, LONG dwNewLong, BOOL WindowObject->Class->hInstance = (HINSTANCE)dwNewLong; break; case GCL_MENUNAME: - if (!IS_INTRESOURCE(dwNewLong)) - { - str = ExAllocatePoolWithTag(PagedPool,sizeof(UNICODE_STRING)+((PUNICODE_STRING)dwNewLong)->Length, TAG_STRING); - memcpy(str,(PUNICODE_STRING)dwNewLong,sizeof(UNICODE_STRING)+((PUNICODE_STRING)dwNewLong)->Length); - WindowObject->Class->lpszMenuName = str; - } - else - { - WindowObject->Class->lpszMenuName = (PUNICODE_STRING)dwNewLong; - } + if (WindowObject->Class->lpszMenuName.MaximumLength) + RtlFreeUnicodeString(&WindowObject->Class->lpszMenuName); + if (!IS_INTRESOURCE(dwNewLong)) + { + WindowObject->Class->lpszMenuName.Length = + WindowObject->Class->lpszMenuName.MaximumLength = ((PUNICODE_STRING)dwNewLong)->MaximumLength; + WindowObject->Class->lpszMenuName.Buffer = ExAllocatePoolWithTag(PagedPool, WindowObject->Class->lpszMenuName.MaximumLength, TAG_STRING); + RtlCopyUnicodeString(&WindowObject->Class->lpszMenuName, (PUNICODE_STRING)dwNewLong); + } + else + { + WindowObject->Class->lpszMenuName.Length = + WindowObject->Class->lpszMenuName.MaximumLength = 0; + WindowObject->Class->lpszMenuName.Buffer = (LPWSTR)dwNewLong; + } break; case GCL_STYLE: WindowObject->Class->style = dwNewLong; From 6eb086ebc98ffbf27a26b0ed5c59d5b36bc7d4ff Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Mon, 17 May 2004 17:30:24 +0000 Subject: [PATCH 1155/1463] added Transgamings Marlett font replacement licensed under the BSD license. svn path=/trunk/; revision=9424 --- reactos/media/fonts/TGMarlett.ttf | Bin 0 -> 5232 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 reactos/media/fonts/TGMarlett.ttf diff --git a/reactos/media/fonts/TGMarlett.ttf b/reactos/media/fonts/TGMarlett.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5c37644919e39943e6e8ef5c26b66d2f93cb2098 GIT binary patch literal 5232 zcmcgvdu&_P89(2>zSl_~G@(rkeR0x|q>w0d328Qz6+4NO7$vsnI4PY9#Eoxav&8mn zCv6Z^R@k6J3`J8lM2n!}A<>pjv_h3OSk+Fb8n3AuDVi92P%2<ZLlqiRX%lC^?_9g- zYh&vlyH`Hvd;GrVIrrY<Ols5;3q)4v!sYL|t-j;;Q_l)PokEDdfst@>YxKxLA&Osz zEI2Thk)q8g6=Hrr^p2r$IypNFOF?_U7Yz-M51xMSlN9v8JKv95;mBWx&%OlRJNT`S zLQtX=Ie^Dc+#DUrY^(fa=|12i;O`zz41~*L759NJ0UsC%Z%c|{;RAjxco`3mSZkM_ zI1L^?ixwvn=}djwmwyyu@lNPJ6ogSUG@RT0#mDz8YW_;-MJy1n*ED~3Zl28*2_-KQ zno`3ZyouQyk9=WNp7L6r3?-=+tGHTRY)MMy5_L*K&X4IIzzKSap0Y=K7K7UL3h{4- zz@R50TxZ0Y@e9$l?8R6@k2&5d+Je!JpHTp&Nn9t!@^TF;`ADADA?L0z#sT_;JZ*>@ z#H)FFq5d;*N>u@YxWh4)r%5;+2lKQhOvf+tv<~^vJnaDe+dOTE1&$MW+7!i(KjrC# z^rque&cIO&|D3Z;+d12`owH5bIoq_IvrXGM+q9jtjx99jlj(v_rVBoqF8E}+;FIZs zPo{03ts)_kVqBy|Obm%A@|9vQej!N0A}-RR1M>*9ap+lYi2>l^up7p22pS8hI_TVx z3}c@2l~x?<El9^OM%2#fhR+nR7UFS-x|Jp-MiGg*%e9yCeac%JkrT*6igoZ=k69qQ zjw`GK3e6RyaTjbdu$73%nbm?C0MC73dIWR?$U*Q@bs>V8C23^K)op=g29^?IRLLdK zoDKIc0gTP_%w1$ZN!X+?CR9u*w!)6B3-|(`P`=sTQV}?+1dcmsAu{_K0?mFohlt8K z2}uGSj)7;Homp7r!%;X_<}w(0{cKF3>bVt@@R|TB29#}+M9vnhQYsJL2kgmSY1_WA z1LmRsox&@6fM^$fyu(7EY(5}@ko19T6CV7e=*R6=SVmOi<{jiyx{biGFTdzjK3Kj9 zdXKnUuqO{JIEo)MN9cyM3$yKcBm4w$vsFk*dsL6S;9G&~MGU4pl(Z!u<MNp7uUq{> z@Wg(&BHkaIndiTZ%Q?0K+YO5#qIX`%ss$c7Mo3jwsJvZCd>1O@K5~t2`~nz*Dw9^^ z+@&~{_Cgu}t_M~dfGgzZR+VuVgQ{DF7_E?SXM%`jS3ienMUEbL<CXIPCxPN_vwt6E zwzxQN?xVeKygs&P_Ta@@yMgTj&DC>kpUN0tj@CqSJQW*?X5?NON`>R;j_^n<J|sid zKs25hP7KAYbe(h$4@-qg%aoP2Qe#%6PIQM;!&W9Ex~)iTbYzari~FopI+lpbb#?XV zLq`D}uu>zjw9;e}ax`t#$^qn1D@PKM*x<Mf$0ITlOJ`ECEu$GrW}>mQ98APBGLgcZ zf__{kM^pIrT5@YF6J<HiiP4N4v@8jD)Jj=f#^n&o$ykwEnM@_dVi79>XW<M6ONKL< z@IVw24sDkoPh?^P&?J*qIF**MxD2Cc=(z!RhC01Hvfb|sNz8$uzt7v|X_Ni^?j8uL ztEJo5CO3LRo&Mes=uOgdcOdBL>5=}R^mYfjyZ~=>2ZL^3$m{8;m0n+KS8tow*HJ55 zU{SE_@^*W>L++5*@2i!ePR~_rrN3QvdxEW<?5f4v<qd68!P~td9|vqlM7IpMgCTEg zZ<jkL1HHk3zsIvd`E&Oo#bA%JXhk(aFTyK9YpW*^l0Lsg+5x|>r{LS`Q}qDc>hbou zTe>{5+wJqYgZ8OI%YSLR_{)lG3BGaP#yk&)7!CJAoGZR_W*jF7q3CsI!n3opUzO;K zrWPH@+p--lGWjrJU&KU#$;+<bA$J(2v#5C9`~?dOpl_J3TU1hd{o*BMOPAen<MI_N zSFOHDmanO}xw7gT?EatX8o{><&uBz!7mtfw;w5odyd_SH94)4`)I{ynM}w51=jen+ zTD>-)?bLpweWa7VLU-xk*Q5HFKB@21-_-xc=Vg5iZ&_R#PPz`vMcm3P)l*Kti(Kli zXO3_J#g(NZ658|HgxDc|B3>j9EvG5m_0*3a<AGL4js0q07`<41r>Hwf;<n~PPKWq= z{Xx_Cu=$X#ffNUI78@)+<TPoz`4F+Zp|rfTvb?msP1`rKOItJZXQTJr{x-+E>Z~dB z&3Uh)2^byNTl9I;|GY)te2bx<n_?_>2p@qBHo)#9U<mcG4BJgZ9m33-S(Tfhycfow z7g<wK)*;SkjqJHBu&Cz`rfHPe*kW2nmE<Jj<@1jWI^xrH`Y-yY?{J)*e)&gw|KxQ0 zcKr;;&e0LacJl~_r&4lkpUIj>&I>*}6Z-mw@s{~UUZ>xsWz9G8I&$g4bQxKtD<^Up zVkWEGcI46~pyMY;P(f#CGb%?Hj>0bEOXSE;N_iP7Qr72D(o9y%X7w)typ~$7#fIxY zYfKo25M2~&rNu00(_Awz<)-wO++oc{56m1VY!E2431h-+z8dnKOOV)AS!WjiL*TO! z8>F#3>lA0R7`Us@V(;48Z#7nyHk3NE+3lJ$dlm}f^>zwpmTec?wpmkr4XLTDsYpEN z++j|$zOu0#)>H(|g9^l1!UgOv+Dq6Zusw(Ufv4ew(Q7=2by*H*SySchP3xQ1H`Fg% zx@>9L5~t}jE7nw3Rafb6H|CzNYwGmfd#|svscw#PG{$bPy2sbCzOHV4hwq*X6nsyh zJ7dPgH~T(WlbdL0_Vo=7_4%3`<|s!^UyT;q=-<%Lu))7Ec7cM&9pWidIK!Y;sJyAF zVhv|og2bDUZ)2ejB(906-0ak`o!htXJhpEC!->Sh`(Hct(QBN!cKV@*b{>5%=Xmef z&h8%{`1R?JkG%ZjWD=dh8{$>x_srV42>E_Uw4({#X{hH;HQrv$5vH!{Mn$N-YH*J5 zB0X+A>s$$H<s~(gExDqIlQs10vClp``pToJ)T6J|?A~fwTX*k&_uYM}MTZ9mA9&`# zi4zB&8NYMnr%(UtwcSq)Z{Cb2#zWFPX)d3OaPgX6TExj3Epb&hD#G$(pM84lir|Q_ zoVJ*sn?FYcd;b`PzF)q7PS(sUkBsfw`}W&=ca25nD0c5S{N!WzZ`ySKV^1EwKnb0u z_^B{&#e2ai<_l3yja1%1jm4O?q%ryR6rG*aU&yu4k(oWl6HkBrzW&_g`QOp&lQXYg z&AN2X`joMntxxNL+&0<)>$Rl8yz_IIKXM%A*Yvg_d`J4tJ?0*<2<zEUObwiCMKM*B z;U&_4oIaqx9?ezJ2S;-<R|OVyKaZ^W;5chA<nYP9w)d9n8sESF`#0iR^23*GHfP>C zx1OccK&54>PjuPx8Bd%`nzgy2$?45>B-f(#V-MgmYv-)X@o6fruy=#8`rIjopPqh& zcI38c{a3ChoAWdGpRa1DaYP`EbaIeECO(!$R7~?|J}sbybR8|C5(K^;=anT?MoaNQ zy@77TQ?P<o(kfa_H<85mZ4Fh>%~a_ejmO&8)vt3rV5JgzB5vuKtqCI&O<9&>Ffp2P z493PRJssO-q^&V4Zdm+(#SxFiEeg{X8lVVSI1dd`lwx#0{eXsPgyNK-B>j+5l*UPE Ml*VW)ZKLsj0h!P|hX4Qo literal 0 HcmV?d00001 From 997484141f31192c1babc7ef9c7eeed774c54b90 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Mon, 17 May 2004 17:32:19 +0000 Subject: [PATCH 1156/1463] Untested !!!! Added Font substition support for Marlett via TGMarlett svn path=/trunk/; revision=9425 --- reactos/bootdata/hivesft.inf | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/bootdata/hivesft.inf b/reactos/bootdata/hivesft.inf index 9f2adb591eb..5d6a985c2fa 100644 --- a/reactos/bootdata/hivesft.inf +++ b/reactos/bootdata/hivesft.inf @@ -41,6 +41,7 @@ HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","Userinit",0x00020000 ; SysFontSubstitutes are also returned by EnumFontFamilies, FontSubstitutes aren't HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SysFontSubstitutes","Arial",0x00000000,"Bitstream Vera Sans" HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SysFontSubstitutes","Courier New",0x00000000,"Bitstream Vera Sans Mono" +HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SysFontSubstitutes","Marlett",0x00000000,"TGMarlett" HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SysFontSubstitutes","Times New Roman",0x00000000,"Bitstream Vera Serif" ; EOF From 0bf4f46ded64db4dee834745793a9212aaf6cc9a Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Mon, 17 May 2004 17:40:21 +0000 Subject: [PATCH 1157/1463] trying to fix this to be binary svn path=/trunk/; revision=9426 --- reactos/media/fonts/TGMarlett.ttf | Bin 5232 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 reactos/media/fonts/TGMarlett.ttf diff --git a/reactos/media/fonts/TGMarlett.ttf b/reactos/media/fonts/TGMarlett.ttf deleted file mode 100644 index 5c37644919e39943e6e8ef5c26b66d2f93cb2098..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5232 zcmcgvdu&_P89(2>zSl_~G@(rkeR0x|q>w0d328Qz6+4NO7$vsnI4PY9#Eoxav&8mn zCv6Z^R@k6J3`J8lM2n!}A<>pjv_h3OSk+Fb8n3AuDVi92P%2<ZLlqiRX%lC^?_9g- zYh&vlyH`Hvd;GrVIrrY<Ols5;3q)4v!sYL|t-j;;Q_l)PokEDdfst@>YxKxLA&Osz zEI2Thk)q8g6=Hrr^p2r$IypNFOF?_U7Yz-M51xMSlN9v8JKv95;mBWx&%OlRJNT`S zLQtX=Ie^Dc+#DUrY^(fa=|12i;O`zz41~*L759NJ0UsC%Z%c|{;RAjxco`3mSZkM_ zI1L^?ixwvn=}djwmwyyu@lNPJ6ogSUG@RT0#mDz8YW_;-MJy1n*ED~3Zl28*2_-KQ zno`3ZyouQyk9=WNp7L6r3?-=+tGHTRY)MMy5_L*K&X4IIzzKSap0Y=K7K7UL3h{4- zz@R50TxZ0Y@e9$l?8R6@k2&5d+Je!JpHTp&Nn9t!@^TF;`ADADA?L0z#sT_;JZ*>@ z#H)FFq5d;*N>u@YxWh4)r%5;+2lKQhOvf+tv<~^vJnaDe+dOTE1&$MW+7!i(KjrC# z^rque&cIO&|D3Z;+d12`owH5bIoq_IvrXGM+q9jtjx99jlj(v_rVBoqF8E}+;FIZs zPo{03ts)_kVqBy|Obm%A@|9vQej!N0A}-RR1M>*9ap+lYi2>l^up7p22pS8hI_TVx z3}c@2l~x?<El9^OM%2#fhR+nR7UFS-x|Jp-MiGg*%e9yCeac%JkrT*6igoZ=k69qQ zjw`GK3e6RyaTjbdu$73%nbm?C0MC73dIWR?$U*Q@bs>V8C23^K)op=g29^?IRLLdK zoDKIc0gTP_%w1$ZN!X+?CR9u*w!)6B3-|(`P`=sTQV}?+1dcmsAu{_K0?mFohlt8K z2}uGSj)7;Homp7r!%;X_<}w(0{cKF3>bVt@@R|TB29#}+M9vnhQYsJL2kgmSY1_WA z1LmRsox&@6fM^$fyu(7EY(5}@ko19T6CV7e=*R6=SVmOi<{jiyx{biGFTdzjK3Kj9 zdXKnUuqO{JIEo)MN9cyM3$yKcBm4w$vsFk*dsL6S;9G&~MGU4pl(Z!u<MNp7uUq{> z@Wg(&BHkaIndiTZ%Q?0K+YO5#qIX`%ss$c7Mo3jwsJvZCd>1O@K5~t2`~nz*Dw9^^ z+@&~{_Cgu}t_M~dfGgzZR+VuVgQ{DF7_E?SXM%`jS3ienMUEbL<CXIPCxPN_vwt6E zwzxQN?xVeKygs&P_Ta@@yMgTj&DC>kpUN0tj@CqSJQW*?X5?NON`>R;j_^n<J|sid zKs25hP7KAYbe(h$4@-qg%aoP2Qe#%6PIQM;!&W9Ex~)iTbYzari~FopI+lpbb#?XV zLq`D}uu>zjw9;e}ax`t#$^qn1D@PKM*x<Mf$0ITlOJ`ECEu$GrW}>mQ98APBGLgcZ zf__{kM^pIrT5@YF6J<HiiP4N4v@8jD)Jj=f#^n&o$ykwEnM@_dVi79>XW<M6ONKL< z@IVw24sDkoPh?^P&?J*qIF**MxD2Cc=(z!RhC01Hvfb|sNz8$uzt7v|X_Ni^?j8uL ztEJo5CO3LRo&Mes=uOgdcOdBL>5=}R^mYfjyZ~=>2ZL^3$m{8;m0n+KS8tow*HJ55 zU{SE_@^*W>L++5*@2i!ePR~_rrN3QvdxEW<?5f4v<qd68!P~td9|vqlM7IpMgCTEg zZ<jkL1HHk3zsIvd`E&Oo#bA%JXhk(aFTyK9YpW*^l0Lsg+5x|>r{LS`Q}qDc>hbou zTe>{5+wJqYgZ8OI%YSLR_{)lG3BGaP#yk&)7!CJAoGZR_W*jF7q3CsI!n3opUzO;K zrWPH@+p--lGWjrJU&KU#$;+<bA$J(2v#5C9`~?dOpl_J3TU1hd{o*BMOPAen<MI_N zSFOHDmanO}xw7gT?EatX8o{><&uBz!7mtfw;w5odyd_SH94)4`)I{ynM}w51=jen+ zTD>-)?bLpweWa7VLU-xk*Q5HFKB@21-_-xc=Vg5iZ&_R#PPz`vMcm3P)l*Kti(Kli zXO3_J#g(NZ658|HgxDc|B3>j9EvG5m_0*3a<AGL4js0q07`<41r>Hwf;<n~PPKWq= z{Xx_Cu=$X#ffNUI78@)+<TPoz`4F+Zp|rfTvb?msP1`rKOItJZXQTJr{x-+E>Z~dB z&3Uh)2^byNTl9I;|GY)te2bx<n_?_>2p@qBHo)#9U<mcG4BJgZ9m33-S(Tfhycfow z7g<wK)*;SkjqJHBu&Cz`rfHPe*kW2nmE<Jj<@1jWI^xrH`Y-yY?{J)*e)&gw|KxQ0 zcKr;;&e0LacJl~_r&4lkpUIj>&I>*}6Z-mw@s{~UUZ>xsWz9G8I&$g4bQxKtD<^Up zVkWEGcI46~pyMY;P(f#CGb%?Hj>0bEOXSE;N_iP7Qr72D(o9y%X7w)typ~$7#fIxY zYfKo25M2~&rNu00(_Awz<)-wO++oc{56m1VY!E2431h-+z8dnKOOV)AS!WjiL*TO! z8>F#3>lA0R7`Us@V(;48Z#7nyHk3NE+3lJ$dlm}f^>zwpmTec?wpmkr4XLTDsYpEN z++j|$zOu0#)>H(|g9^l1!UgOv+Dq6Zusw(Ufv4ew(Q7=2by*H*SySchP3xQ1H`Fg% zx@>9L5~t}jE7nw3Rafb6H|CzNYwGmfd#|svscw#PG{$bPy2sbCzOHV4hwq*X6nsyh zJ7dPgH~T(WlbdL0_Vo=7_4%3`<|s!^UyT;q=-<%Lu))7Ec7cM&9pWidIK!Y;sJyAF zVhv|og2bDUZ)2ejB(906-0ak`o!htXJhpEC!->Sh`(Hct(QBN!cKV@*b{>5%=Xmef z&h8%{`1R?JkG%ZjWD=dh8{$>x_srV42>E_Uw4({#X{hH;HQrv$5vH!{Mn$N-YH*J5 zB0X+A>s$$H<s~(gExDqIlQs10vClp``pToJ)T6J|?A~fwTX*k&_uYM}MTZ9mA9&`# zi4zB&8NYMnr%(UtwcSq)Z{Cb2#zWFPX)d3OaPgX6TExj3Epb&hD#G$(pM84lir|Q_ zoVJ*sn?FYcd;b`PzF)q7PS(sUkBsfw`}W&=ca25nD0c5S{N!WzZ`ySKV^1EwKnb0u z_^B{&#e2ai<_l3yja1%1jm4O?q%ryR6rG*aU&yu4k(oWl6HkBrzW&_g`QOp&lQXYg z&AN2X`joMntxxNL+&0<)>$Rl8yz_IIKXM%A*Yvg_d`J4tJ?0*<2<zEUObwiCMKM*B z;U&_4oIaqx9?ezJ2S;-<R|OVyKaZ^W;5chA<nYP9w)d9n8sESF`#0iR^23*GHfP>C zx1OccK&54>PjuPx8Bd%`nzgy2$?45>B-f(#V-MgmYv-)X@o6fruy=#8`rIjopPqh& zcI38c{a3ChoAWdGpRa1DaYP`EbaIeECO(!$R7~?|J}sbybR8|C5(K^;=anT?MoaNQ zy@77TQ?P<o(kfa_H<85mZ4Fh>%~a_ejmO&8)vt3rV5JgzB5vuKtqCI&O<9&>Ffp2P z493PRJssO-q^&V4Zdm+(#SxFiEeg{X8lVVSI1dd`lwx#0{eXsPgyNK-B>j+5l*UPE Ml*VW)ZKLsj0h!P|hX4Qo From 0e7124da95423447c985ed5bdc7c12489956271a Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Mon, 17 May 2004 17:41:08 +0000 Subject: [PATCH 1158/1463] committed Marlett replacement as binary svn path=/trunk/; revision=9427 --- reactos/media/fonts/TGMarlett.ttf | Bin 0 -> 5232 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 reactos/media/fonts/TGMarlett.ttf diff --git a/reactos/media/fonts/TGMarlett.ttf b/reactos/media/fonts/TGMarlett.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5c37644919e39943e6e8ef5c26b66d2f93cb2098 GIT binary patch literal 5232 zcmcgvdu&_P89(2>zSl_~G@(rkeR0x|q>w0d328Qz6+4NO7$vsnI4PY9#Eoxav&8mn zCv6Z^R@k6J3`J8lM2n!}A<>pjv_h3OSk+Fb8n3AuDVi92P%2<ZLlqiRX%lC^?_9g- zYh&vlyH`Hvd;GrVIrrY<Ols5;3q)4v!sYL|t-j;;Q_l)PokEDdfst@>YxKxLA&Osz zEI2Thk)q8g6=Hrr^p2r$IypNFOF?_U7Yz-M51xMSlN9v8JKv95;mBWx&%OlRJNT`S zLQtX=Ie^Dc+#DUrY^(fa=|12i;O`zz41~*L759NJ0UsC%Z%c|{;RAjxco`3mSZkM_ zI1L^?ixwvn=}djwmwyyu@lNPJ6ogSUG@RT0#mDz8YW_;-MJy1n*ED~3Zl28*2_-KQ zno`3ZyouQyk9=WNp7L6r3?-=+tGHTRY)MMy5_L*K&X4IIzzKSap0Y=K7K7UL3h{4- zz@R50TxZ0Y@e9$l?8R6@k2&5d+Je!JpHTp&Nn9t!@^TF;`ADADA?L0z#sT_;JZ*>@ z#H)FFq5d;*N>u@YxWh4)r%5;+2lKQhOvf+tv<~^vJnaDe+dOTE1&$MW+7!i(KjrC# z^rque&cIO&|D3Z;+d12`owH5bIoq_IvrXGM+q9jtjx99jlj(v_rVBoqF8E}+;FIZs zPo{03ts)_kVqBy|Obm%A@|9vQej!N0A}-RR1M>*9ap+lYi2>l^up7p22pS8hI_TVx z3}c@2l~x?<El9^OM%2#fhR+nR7UFS-x|Jp-MiGg*%e9yCeac%JkrT*6igoZ=k69qQ zjw`GK3e6RyaTjbdu$73%nbm?C0MC73dIWR?$U*Q@bs>V8C23^K)op=g29^?IRLLdK zoDKIc0gTP_%w1$ZN!X+?CR9u*w!)6B3-|(`P`=sTQV}?+1dcmsAu{_K0?mFohlt8K z2}uGSj)7;Homp7r!%;X_<}w(0{cKF3>bVt@@R|TB29#}+M9vnhQYsJL2kgmSY1_WA z1LmRsox&@6fM^$fyu(7EY(5}@ko19T6CV7e=*R6=SVmOi<{jiyx{biGFTdzjK3Kj9 zdXKnUuqO{JIEo)MN9cyM3$yKcBm4w$vsFk*dsL6S;9G&~MGU4pl(Z!u<MNp7uUq{> z@Wg(&BHkaIndiTZ%Q?0K+YO5#qIX`%ss$c7Mo3jwsJvZCd>1O@K5~t2`~nz*Dw9^^ z+@&~{_Cgu}t_M~dfGgzZR+VuVgQ{DF7_E?SXM%`jS3ienMUEbL<CXIPCxPN_vwt6E zwzxQN?xVeKygs&P_Ta@@yMgTj&DC>kpUN0tj@CqSJQW*?X5?NON`>R;j_^n<J|sid zKs25hP7KAYbe(h$4@-qg%aoP2Qe#%6PIQM;!&W9Ex~)iTbYzari~FopI+lpbb#?XV zLq`D}uu>zjw9;e}ax`t#$^qn1D@PKM*x<Mf$0ITlOJ`ECEu$GrW}>mQ98APBGLgcZ zf__{kM^pIrT5@YF6J<HiiP4N4v@8jD)Jj=f#^n&o$ykwEnM@_dVi79>XW<M6ONKL< z@IVw24sDkoPh?^P&?J*qIF**MxD2Cc=(z!RhC01Hvfb|sNz8$uzt7v|X_Ni^?j8uL ztEJo5CO3LRo&Mes=uOgdcOdBL>5=}R^mYfjyZ~=>2ZL^3$m{8;m0n+KS8tow*HJ55 zU{SE_@^*W>L++5*@2i!ePR~_rrN3QvdxEW<?5f4v<qd68!P~td9|vqlM7IpMgCTEg zZ<jkL1HHk3zsIvd`E&Oo#bA%JXhk(aFTyK9YpW*^l0Lsg+5x|>r{LS`Q}qDc>hbou zTe>{5+wJqYgZ8OI%YSLR_{)lG3BGaP#yk&)7!CJAoGZR_W*jF7q3CsI!n3opUzO;K zrWPH@+p--lGWjrJU&KU#$;+<bA$J(2v#5C9`~?dOpl_J3TU1hd{o*BMOPAen<MI_N zSFOHDmanO}xw7gT?EatX8o{><&uBz!7mtfw;w5odyd_SH94)4`)I{ynM}w51=jen+ zTD>-)?bLpweWa7VLU-xk*Q5HFKB@21-_-xc=Vg5iZ&_R#PPz`vMcm3P)l*Kti(Kli zXO3_J#g(NZ658|HgxDc|B3>j9EvG5m_0*3a<AGL4js0q07`<41r>Hwf;<n~PPKWq= z{Xx_Cu=$X#ffNUI78@)+<TPoz`4F+Zp|rfTvb?msP1`rKOItJZXQTJr{x-+E>Z~dB z&3Uh)2^byNTl9I;|GY)te2bx<n_?_>2p@qBHo)#9U<mcG4BJgZ9m33-S(Tfhycfow z7g<wK)*;SkjqJHBu&Cz`rfHPe*kW2nmE<Jj<@1jWI^xrH`Y-yY?{J)*e)&gw|KxQ0 zcKr;;&e0LacJl~_r&4lkpUIj>&I>*}6Z-mw@s{~UUZ>xsWz9G8I&$g4bQxKtD<^Up zVkWEGcI46~pyMY;P(f#CGb%?Hj>0bEOXSE;N_iP7Qr72D(o9y%X7w)typ~$7#fIxY zYfKo25M2~&rNu00(_Awz<)-wO++oc{56m1VY!E2431h-+z8dnKOOV)AS!WjiL*TO! z8>F#3>lA0R7`Us@V(;48Z#7nyHk3NE+3lJ$dlm}f^>zwpmTec?wpmkr4XLTDsYpEN z++j|$zOu0#)>H(|g9^l1!UgOv+Dq6Zusw(Ufv4ew(Q7=2by*H*SySchP3xQ1H`Fg% zx@>9L5~t}jE7nw3Rafb6H|CzNYwGmfd#|svscw#PG{$bPy2sbCzOHV4hwq*X6nsyh zJ7dPgH~T(WlbdL0_Vo=7_4%3`<|s!^UyT;q=-<%Lu))7Ec7cM&9pWidIK!Y;sJyAF zVhv|og2bDUZ)2ejB(906-0ak`o!htXJhpEC!->Sh`(Hct(QBN!cKV@*b{>5%=Xmef z&h8%{`1R?JkG%ZjWD=dh8{$>x_srV42>E_Uw4({#X{hH;HQrv$5vH!{Mn$N-YH*J5 zB0X+A>s$$H<s~(gExDqIlQs10vClp``pToJ)T6J|?A~fwTX*k&_uYM}MTZ9mA9&`# zi4zB&8NYMnr%(UtwcSq)Z{Cb2#zWFPX)d3OaPgX6TExj3Epb&hD#G$(pM84lir|Q_ zoVJ*sn?FYcd;b`PzF)q7PS(sUkBsfw`}W&=ca25nD0c5S{N!WzZ`ySKV^1EwKnb0u z_^B{&#e2ai<_l3yja1%1jm4O?q%ryR6rG*aU&yu4k(oWl6HkBrzW&_g`QOp&lQXYg z&AN2X`joMntxxNL+&0<)>$Rl8yz_IIKXM%A*Yvg_d`J4tJ?0*<2<zEUObwiCMKM*B z;U&_4oIaqx9?ezJ2S;-<R|OVyKaZ^W;5chA<nYP9w)d9n8sESF`#0iR^23*GHfP>C zx1OccK&54>PjuPx8Bd%`nzgy2$?45>B-f(#V-MgmYv-)X@o6fruy=#8`rIjopPqh& zcI38c{a3ChoAWdGpRa1DaYP`EbaIeECO(!$R7~?|J}sbybR8|C5(K^;=anT?MoaNQ zy@77TQ?P<o(kfa_H<85mZ4Fh>%~a_ejmO&8)vt3rV5JgzB5vuKtqCI&O<9&>Ffp2P z493PRJssO-q^&V4Zdm+(#SxFiEeg{X8lVVSI1dd`lwx#0{eXsPgyNK-B>j+5l*UPE Ml*VW)ZKLsj0h!P|hX4Qo literal 0 HcmV?d00001 From 8f3049391300ebf2f3e503f7daa36e6500f203de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Mon, 17 May 2004 19:45:10 +0000 Subject: [PATCH 1159/1463] Prevent unnecessary relinks when TARGET_REGTESTS = yes svn path=/trunk/; revision=9428 --- reactos/tools/helper.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/tools/helper.mk b/reactos/tools/helper.mk index d3dd6fa50d7..97cee87489b 100644 --- a/reactos/tools/helper.mk +++ b/reactos/tools/helper.mk @@ -1,4 +1,4 @@ -# $Id: helper.mk,v 1.61 2004/05/10 18:02:19 gvg Exp $ +# $Id: helper.mk,v 1.62 2004/05/17 19:45:10 gvg Exp $ # # Helper makefile for ReactOS modules # Variables this makefile accepts: @@ -977,7 +977,7 @@ endif REGTEST_TESTS = $(wildcard tests/tests/*.c) -$(REGTEST_TARGETS): $(REGTEST_TESTS) $(REGTESTS) +$(REGTEST_TARGETS): $(REGTEST_TESTS) ifeq ($(MK_MODE),user) $(REGTESTS) ./tests/tests ./tests/_regtests.c ./tests/Makefile.tests -u ./tests/_rtstub.c $(MAKE) -C tests TARGET_REGTESTS=no all From 3128a0aff71e85a8e5df156cbd8ff456cac043c1 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Mon, 17 May 2004 19:56:04 +0000 Subject: [PATCH 1160/1463] add missing precomp.h header file svn path=/trunk/; revision=9429 --- reactos/subsys/system/explorer/precomp.h | 34 ++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 reactos/subsys/system/explorer/precomp.h diff --git a/reactos/subsys/system/explorer/precomp.h b/reactos/subsys/system/explorer/precomp.h new file mode 100644 index 00000000000..fae6bd3fa0f --- /dev/null +++ b/reactos/subsys/system/explorer/precomp.h @@ -0,0 +1,34 @@ +/* + * Copyright 2004 Martin Fuchs + * + * 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 + */ + + + // + // Explorer clone - precompiled header support + // + // precomp.h + // + // Martin Fuchs, 17.05.2004 + // + +#include "utility/utility.h" + +#include "explorer.h" +#include "desktop/desktop.h" + +#include "globals.h" +#include "externals.h" From d462152e6dec87d726c4217bf2a62d4e7bf0ac44 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Mon, 17 May 2004 20:20:17 +0000 Subject: [PATCH 1161/1463] - Fixed the calculation of the start for a partition within an extended partition. svn path=/trunk/; revision=9430 --- freeldr/freeldr/disk/partition.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/freeldr/freeldr/disk/partition.c b/freeldr/freeldr/disk/partition.c index 58a7c2810da..ea20c11bd9f 100644 --- a/freeldr/freeldr/disk/partition.c +++ b/freeldr/freeldr/disk/partition.c @@ -81,7 +81,7 @@ BOOL DiskGetPartitionEntry(U32 DriveNumber, U32 PartitionNumber, PPARTITION_TABL MASTER_BOOT_RECORD MasterBootRecord; PARTITION_TABLE_ENTRY ExtendedPartitionTableEntry; U32 ExtendedPartitionNumber; - U32 ExtendedPartitionRelativeOffset; + U32 ExtendedPartitionOffset; U32 Index; // Read master boot record @@ -113,7 +113,7 @@ BOOL DiskGetPartitionEntry(U32 DriveNumber, U32 PartitionNumber, PPARTITION_TABL // Set the initial relative starting sector to 0 // This is because extended partition starting // sectors a numbered relative to their parent - ExtendedPartitionRelativeOffset = 0; + ExtendedPartitionOffset = 0; for (Index=0; Index<=ExtendedPartitionNumber; Index++) { @@ -124,10 +124,14 @@ BOOL DiskGetPartitionEntry(U32 DriveNumber, U32 PartitionNumber, PPARTITION_TABL } // Adjust the relative starting sector of the partition - ExtendedPartitionRelativeOffset += ExtendedPartitionTableEntry.SectorCountBeforePartition; - + ExtendedPartitionTableEntry.SectorCountBeforePartition += ExtendedPartitionOffset; + if (ExtendedPartitionOffset == 0) + { + // Set the start of the parrent extended partition + ExtendedPartitionOffset = ExtendedPartitionTableEntry.SectorCountBeforePartition; + } // Read the partition boot record - if (!DiskReadBootRecord(DriveNumber, ExtendedPartitionRelativeOffset, &MasterBootRecord)) + if (!DiskReadBootRecord(DriveNumber, ExtendedPartitionTableEntry.SectorCountBeforePartition, &MasterBootRecord)) { return FALSE; } @@ -139,7 +143,7 @@ BOOL DiskGetPartitionEntry(U32 DriveNumber, U32 PartitionNumber, PPARTITION_TABL } // Now correct the start sector of the partition - PartitionTableEntry->SectorCountBeforePartition += ExtendedPartitionRelativeOffset; + PartitionTableEntry->SectorCountBeforePartition += ExtendedPartitionTableEntry.SectorCountBeforePartition; } // When we get here we should have the correct entry From 869728e524460d62e83cb9c27404f0b278f003c8 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Mon, 17 May 2004 20:25:01 +0000 Subject: [PATCH 1162/1463] - Implemented the printing of 64 bit numbers. svn path=/trunk/; revision=9431 --- freeldr/freeldr/debug.c | 22 +++++++++++++++++-- freeldr/freeldr/include/rtl.h | 1 + freeldr/freeldr/rtl/print.c | 40 ++++++++++++++++++++++++++++++++--- freeldr/freeldr/rtl/stdlib.c | 40 +++++++++++++++++++++++++++++++++++ 4 files changed, 98 insertions(+), 5 deletions(-) diff --git a/freeldr/freeldr/debug.c b/freeldr/freeldr/debug.c index 9ec15c42a95..8fff6fb42d8 100644 --- a/freeldr/freeldr/debug.c +++ b/freeldr/freeldr/debug.c @@ -234,6 +234,7 @@ VOID DebugPrint(U32 Mask, char *format, ...) { int *dataptr = (int *) &format; char c, *ptr, str[16]; + int ll; // Mask out unwanted debug messages if (!(Mask & DebugPrintMask)) @@ -249,7 +250,7 @@ VOID DebugPrint(U32 Mask, char *format, ...) } dataptr++; - + ll = 0; while ((c = *(format++))) { if (c != '%') @@ -258,11 +259,28 @@ VOID DebugPrint(U32 Mask, char *format, ...) } else { + if (*format == 'I' && *(format+1) == '6' && *(format+2) == '4') + { + ll = 1; + format += 3; + } + else + { + ll = 0; + } switch (c = *(format++)) { case 'd': case 'u': case 'x': - *convert_to_ascii(str, c, *((unsigned long *) dataptr++)) = 0; + if (ll) + { + *convert_i64_to_ascii(str, c, *((unsigned long long*) dataptr)) = 0; + dataptr += 2; + } + else + { + *convert_to_ascii(str, c, *((unsigned long *) dataptr++)) = 0; + } ptr = str; diff --git a/freeldr/freeldr/include/rtl.h b/freeldr/freeldr/include/rtl.h index 7b7c5ed99e5..7ba2a1b62c9 100644 --- a/freeldr/freeldr/include/rtl.h +++ b/freeldr/freeldr/include/rtl.h @@ -70,6 +70,7 @@ int isdigit(int c); int isxdigit(int c); char * convert_to_ascii(char *buf, int c, ...); +char * convert_i64_to_ascii(char *buf, int c, ...); void putchar(int ch); // Implemented in asmcode.S int kbhit(void); // Implemented in asmcode.S diff --git a/freeldr/freeldr/rtl/print.c b/freeldr/freeldr/rtl/print.c index 5ff16e91f15..62c6fcb8406 100644 --- a/freeldr/freeldr/rtl/print.c +++ b/freeldr/freeldr/rtl/print.c @@ -38,6 +38,7 @@ void printf(char *format, ... ) { int *dataptr = (int *) &format; char c, *ptr, str[16]; + int ll; dataptr++; @@ -49,10 +50,26 @@ void printf(char *format, ... ) } else { + if (*format == 'I' && *(format+1) == '6' && *(format+2) == '4') + { + ll = 1; + format += 3; + } + else + { + ll = 0; + } switch (c = *(format++)) { case 'd': case 'u': case 'x': - *convert_to_ascii(str, c, *((unsigned long *) dataptr++)) = 0; + if (ll) + { + *convert_i64_to_ascii(str, c, *((unsigned long long *) dataptr++)) = 0; + } + else + { + *convert_to_ascii(str, c, *((unsigned long *) dataptr++)) = 0; + } ptr = str; @@ -88,6 +105,7 @@ void sprintf(char *buffer, char *format, ... ) int *dataptr = (int *) &format; char c, *ptr, str[16]; char *p = buffer; + int ll; dataptr++; @@ -100,11 +118,27 @@ void sprintf(char *buffer, char *format, ... ) } else { + if (*format == 'I' && *(format+1) == '6' && *(format+2) == '4') + { + ll = 1; + format += 3; + } + else + { + ll = 0; + } switch (c = *(format++)) { case 'd': case 'u': case 'x': - *convert_to_ascii(str, c, *((unsigned long *) dataptr++)) = 0; - + if (ll) + { + *convert_i64_to_ascii(str, c, *((unsigned long long*) dataptr++)) = 0; + } + else + { + *convert_to_ascii(str, c, *((unsigned long *) dataptr++)) = 0; + } + ptr = str; while (*ptr) diff --git a/freeldr/freeldr/rtl/stdlib.c b/freeldr/freeldr/rtl/stdlib.c index 6460efbefcc..0e5551636a2 100644 --- a/freeldr/freeldr/rtl/stdlib.c +++ b/freeldr/freeldr/rtl/stdlib.c @@ -63,6 +63,46 @@ char *convert_to_ascii(char *buf, int c, ...) return ptr; } +char *convert_i64_to_ascii(char *buf, int c, ...) +{ + unsigned long long num = *(long long*)((&c) + 1); + int mult = 10; + char *ptr = buf; + + if (c == 'x') + mult = 16; + + if ((num & 0x8000000000000000uLL) && c == 'd') + { + num = (~num)+1; + *(ptr++) = '-'; + buf++; + } + + do + { + int dig = num % mult; + *(ptr++) = ( (dig > 9) ? dig + 'a' - 10 : '0' + dig ); + } + while (num /= mult); + + /* reorder to correct direction!! */ + { + char *ptr1 = ptr-1; + char *ptr2 = buf; + while (ptr1 > ptr2) + { + int c = *ptr1; + *ptr1 = *ptr2; + *ptr2 = c; + ptr1--; + ptr2++; + } + } + + return ptr; +} + char *itoa(int value, char *string, int radix) { if(radix == 16) From c49f961993bac662656b020c9277fccb78ae0fbf Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Mon, 17 May 2004 20:30:55 +0000 Subject: [PATCH 1163/1463] - Do print readable sector numbers in DiskReadLogicalSectors. svn path=/trunk/; revision=9432 --- freeldr/freeldr/arch/i386/i386disk.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/freeldr/freeldr/arch/i386/i386disk.c b/freeldr/freeldr/arch/i386/i386disk.c index b2a819ce1f2..d9ece39184c 100644 --- a/freeldr/freeldr/arch/i386/i386disk.c +++ b/freeldr/freeldr/arch/i386/i386disk.c @@ -46,7 +46,7 @@ typedef struct BOOL DiskReadLogicalSectors(U32 DriveNumber, U64 SectorNumber, U32 SectorCount, PVOID Buffer) { - DbgPrint((DPRINT_DISK, "DiskReadLogicalSectors() DriveNumber: 0x%x SectorNumber: %d%d SectorCount: %d Buffer: 0x%x\n", DriveNumber, (U32)SectorNumber, SectorCount, Buffer)); + DbgPrint((DPRINT_DISK, "DiskReadLogicalSectors() DriveNumber: 0x%x SectorNumber: %I64d SectorCount: %d Buffer: 0x%x\n", DriveNumber, SectorNumber, SectorCount, Buffer)); // // Check to see if it is a fixed disk drive @@ -79,7 +79,7 @@ BOOL DiskReadLogicalSectorsLBA(U32 DriveNumber, U64 SectorNumber, U32 SectorCoun U32 RetryCount; PI386_DISK_ADDRESS_PACKET Packet = (PI386_DISK_ADDRESS_PACKET)(BIOSCALLBUFFER); - DbgPrint((DPRINT_DISK, "DiskReadLogicalSectorsLBA()\n")); + DbgPrint((DPRINT_DISK, "DiskReadLogicalSectorsLBA() DriveNumber: 0x%x SectorNumber: %I64d SectorCount: %d Buffer: 0x%x\n", DriveNumber, SectorNumber, SectorCount, Buffer)); // BIOS int 0x13, function 42h - IBM/MS INT 13 Extensions - EXTENDED READ RegsIn.b.ah = 0x42; // Subfunction 42h From 0cc2f5d9be62a2820c8b630bb650298503a132be Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Tue, 18 May 2004 12:10:36 +0000 Subject: [PATCH 1164/1463] return more verbose XML parser error messages svn path=/trunk/; revision=9433 --- .../system/explorer/utility/xmlstorage.cpp | 56 ++++++++++++++++--- .../system/explorer/utility/xmlstorage.h | 40 +++++++------ 2 files changed, 71 insertions(+), 25 deletions(-) diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.cpp b/reactos/subsys/system/explorer/utility/xmlstorage.cpp index 819146c68f7..ee2e386b768 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.cpp +++ b/reactos/subsys/system/explorer/utility/xmlstorage.cpp @@ -36,9 +36,8 @@ */ -#include "precomp.h" - //#include "xmlstorage.h" +#include "precomp.h" namespace XMLStorage { @@ -70,11 +69,6 @@ XML_Status XMLReader::read(std::istream& in) if (status != XML_STATUS_ERROR) status = XML_ParseBuffer(_parser, 0, true); -/* - if (status == XML_STATUS_ERROR) - cerr << get_error_string(); -*/ - if (_pos->_children.empty()) _pos->_trailing.append(_content); else @@ -188,6 +182,54 @@ void XMLCALL XMLReader::XML_DefaultHandler(void* userData, const XML_Char* s, in } +std::string XMLReader::get_error_string() const +{ + XML_Error error = XML_GetErrorCode(_parser); + + switch(error) { + case XML_ERROR_NONE: return "XML_ERROR_NONE"; + case XML_ERROR_NO_MEMORY: return "XML_ERROR_NO_MEMORY"; + case XML_ERROR_SYNTAX: return "XML_ERROR_SYNTAX"; + case XML_ERROR_NO_ELEMENTS: return "XML_ERROR_NO_ELEMENTS"; + case XML_ERROR_INVALID_TOKEN: return "XML_ERROR_INVALID_TOKEN"; + case XML_ERROR_UNCLOSED_TOKEN: return "XML_ERROR_UNCLOSED_TOKEN"; + case XML_ERROR_PARTIAL_CHAR: return "XML_ERROR_PARTIAL_CHAR"; + case XML_ERROR_TAG_MISMATCH: return "XML_ERROR_TAG_MISMATCH"; + case XML_ERROR_DUPLICATE_ATTRIBUTE: return "XML_ERROR_DUPLICATE_ATTRIBUTE"; + case XML_ERROR_JUNK_AFTER_DOC_ELEMENT: return "XML_ERROR_JUNK_AFTER_DOC_ELEMENT"; + case XML_ERROR_PARAM_ENTITY_REF: return "XML_ERROR_PARAM_ENTITY_REF"; + case XML_ERROR_UNDEFINED_ENTITY: return "XML_ERROR_UNDEFINED_ENTITY"; + case XML_ERROR_RECURSIVE_ENTITY_REF: return "XML_ERROR_RECURSIVE_ENTITY_REF"; + case XML_ERROR_ASYNC_ENTITY: return "XML_ERROR_ASYNC_ENTITY"; + case XML_ERROR_BAD_CHAR_REF: return "XML_ERROR_BAD_CHAR_REF"; + case XML_ERROR_BINARY_ENTITY_REF: return "XML_ERROR_BINARY_ENTITY_REF"; + case XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF: return "XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF"; + case XML_ERROR_MISPLACED_XML_PI: return "XML_ERROR_MISPLACED_XML_PI"; + case XML_ERROR_UNKNOWN_ENCODING: return "XML_ERROR_UNKNOWN_ENCODING"; + case XML_ERROR_INCORRECT_ENCODING: return "XML_ERROR_INCORRECT_ENCODING"; + case XML_ERROR_UNCLOSED_CDATA_SECTION: return "XML_ERROR_UNCLOSED_CDATA_SECTION"; + case XML_ERROR_EXTERNAL_ENTITY_HANDLING: return "XML_ERROR_EXTERNAL_ENTITY_HANDLING"; + case XML_ERROR_NOT_STANDALONE: return "XML_ERROR_NOT_STANDALONE"; + case XML_ERROR_UNEXPECTED_STATE: return "XML_ERROR_UNEXPECTED_STATE"; + case XML_ERROR_ENTITY_DECLARED_IN_PE: return "XML_ERROR_ENTITY_DECLARED_IN_PE"; + 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"; + 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"; + } + + std::ostringstream out; + + out << "XML parser error #" << error; + + return out.str(); +} + + std::string EncodeXMLString(LPCTSTR s) { TCHAR buffer[BUFFER_LEN]; diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.h b/reactos/subsys/system/explorer/utility/xmlstorage.h index 9a20ae38bf7..7af85de3a07 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.h +++ b/reactos/subsys/system/explorer/utility/xmlstorage.h @@ -1232,15 +1232,7 @@ struct XMLReader return out.str(); } - std::string get_error_string() const - { - XML_Error error = XML_GetErrorCode(_parser); - - std::ostringstream out; - out << get_position() << " XML parser error #" << error << "\n"; - - return out.str(); - } + std::string get_error_string() const; protected: XMLPos _pos; @@ -1298,11 +1290,16 @@ struct XMLDoc : public XMLNode { XMLReader reader(this); - /*XML_Status status = */reader.read(in); -/* - if (status == XML_STATUS_ERROR) - cerr << reader.get_error_string(); -*/ + XML_Status status = reader.read(in); + + if (status == XML_STATUS_ERROR) { + std::ostringstream out; + + out << reader.get_position() << " " << reader.get_error_string(); + + _last_error = out.str(); + } + return in; } @@ -1312,10 +1309,15 @@ struct XMLDoc : public XMLNode XMLReader reader(this); XML_Status status = reader.read(in); -/* - if (status == XML_STATUS_ERROR) - cerr << path << reader.get_error_string(); -*/ + + if (status == XML_STATUS_ERROR) { + std::ostringstream out; + + out << path << reader.get_position() << " " << reader.get_error_string(); + + _last_error = out.str(); + } + return status != XML_STATUS_ERROR; } @@ -1349,6 +1351,8 @@ struct XMLDoc : public XMLNode write_formating(out); } + + std::string _last_error; }; From 9c4dd6241a232adc4f1011120711a857156b50d5 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Tue, 18 May 2004 12:24:40 +0000 Subject: [PATCH 1165/1463] Implement SeQueryAuthenticationIdToken(). Add audit function stubs. svn path=/trunk/; revision=9434 --- reactos/ntoskrnl/ntoskrnl.def | 10 ++++----- reactos/ntoskrnl/ntoskrnl.edf | 10 ++++----- reactos/ntoskrnl/se/audit.c | 40 ++++++++++++++++++++++++++++++++++- reactos/ntoskrnl/se/token.c | 22 ++++++++++++++++--- 4 files changed, 68 insertions(+), 14 deletions(-) diff --git a/reactos/ntoskrnl/ntoskrnl.def b/reactos/ntoskrnl/ntoskrnl.def index b60d0ce19db..8b924aaf69e 100644 --- a/reactos/ntoskrnl/ntoskrnl.def +++ b/reactos/ntoskrnl/ntoskrnl.def @@ -1,4 +1,4 @@ -; $Id: ntoskrnl.def,v 1.179 2004/03/12 19:40:29 navaraf Exp $ +; $Id: ntoskrnl.def,v 1.180 2004/05/18 12:24:40 ekohl Exp $ ; ; reactos/ntoskrnl/ntoskrnl.def ; @@ -892,18 +892,18 @@ SeCaptureSubjectContext@4 SeCreateClientSecurity@16 SeDeassignSecurity@4 ;SeDeleteAccessState@4 -;SeDeleteObjectAuditAlarm@8 +SeDeleteObjectAuditAlarm@8 SeExports DATA ;SeFreePrivileges@4 SeImpersonateClient@8 ;SeLockSubjectContext@4 ;SeMarkLogonSessionForTerminationNotification@4 -;SeOpenObjectAuditAlarm@36 -;SeOpenObjectForDeleteAuditAlarm@36 +SeOpenObjectAuditAlarm@36 +SeOpenObjectForDeleteAuditAlarm@36 SePrivilegeCheck@12 ;SePrivilegeObjectAuditAlarm@24 SePublicDefaultDacl DATA -;SeQueryAuthenticationIdToken@8 +SeQueryAuthenticationIdToken@8 ;SeQuerySecurityDescriptorInfo@16 ;SeRegisterLogonSessionTerminatedRoutine@4 ;SeReleaseSecurityDescriptor@12 diff --git a/reactos/ntoskrnl/ntoskrnl.edf b/reactos/ntoskrnl/ntoskrnl.edf index 9c51469ee20..172bee59e1d 100644 --- a/reactos/ntoskrnl/ntoskrnl.edf +++ b/reactos/ntoskrnl/ntoskrnl.edf @@ -1,4 +1,4 @@ -; $Id: ntoskrnl.edf,v 1.165 2004/03/12 19:40:29 navaraf Exp $ +; $Id: ntoskrnl.edf,v 1.166 2004/05/18 12:24:40 ekohl Exp $ ; ; reactos/ntoskrnl/ntoskrnl.def ; @@ -892,18 +892,18 @@ SeCaptureSubjectContext=SeCaptureSubjectContext@4 SeCreateClientSecurity=SeCreateClientSecurity@16 SeDeassignSecurity=SeDeassignSecurity@4 ;SeDeleteAccessState=SeDeleteAccessState@4 -;SeDeleteObjectAuditAlarm=SeDeleteObjectAuditAlarm@8 +SeDeleteObjectAuditAlarm=SeDeleteObjectAuditAlarm@8 SeExports DATA ;SeFreePrivileges=SeFreePrivileges@4 SeImpersonateClient=SeImpersonateClient@8 ;SeLockSubjectContext=SeLockSubjectContext@4 ;SeMarkLogonSessionForTerminationNotification=SeMarkLogonSessionForTerminationNotification@4 -;SeOpenObjectAuditAlarm=SeOpenObjectAuditAlarm@36 -;SeOpenObjectForDeleteAuditAlarm=SeOpenObjectForDeleteAuditAlarm@36 +SeOpenObjectAuditAlarm=SeOpenObjectAuditAlarm@36 +SeOpenObjectForDeleteAuditAlarm=SeOpenObjectForDeleteAuditAlarm@36 SePrivilegeCheck=SePrivilegeCheck@12 ;SePrivilegeObjectAuditAlarm=SePrivilegeObjectAuditAlarm@24 SePublicDefaultDacl DATA -;SeQueryAuthenticationIdToken=SeQueryAuthenticationIdToken@8 +SeQueryAuthenticationIdToken=SeQueryAuthenticationIdToken@8 ;SeQuerySecurityDescriptorInfo=SeQuerySecurityDescriptorInfo@16 ;SeRegisterLogonSessionTerminatedRoutine=SeRegisterLogonSessionTerminatedRoutine@4 ;SeReleaseSecurityDescriptor=SeReleaseSecurityDescriptor@12 diff --git a/reactos/ntoskrnl/se/audit.c b/reactos/ntoskrnl/se/audit.c index 1c108b0e75c..3ac4c417f13 100644 --- a/reactos/ntoskrnl/se/audit.c +++ b/reactos/ntoskrnl/se/audit.c @@ -1,4 +1,4 @@ -/* $Id: audit.c,v 1.2 2003/12/14 17:44:02 hbirr Exp $ +/* $Id: audit.c,v 1.3 2004/05/18 12:23:48 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -100,4 +100,42 @@ NtPrivilegeObjectAuditAlarm(IN PUNICODE_STRING SubsystemName, return(STATUS_NOT_IMPLEMENTED); } + +VOID STDCALL +SeDeleteObjectAuditAlarm(IN PVOID Object, + IN HANDLE Handle) +{ + UNIMPLEMENTED; +} + + +VOID STDCALL +SeOpenObjectAuditAlarm(IN PUNICODE_STRING ObjectTypeName, + IN PVOID Object OPTIONAL, + IN PUNICODE_STRING AbsoluteObjectName OPTIONAL, + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PACCESS_STATE AccessState, + IN BOOLEAN ObjectCreated, + IN BOOLEAN AccessGranted, + IN KPROCESSOR_MODE AccessMode, + OUT PBOOLEAN GenerateOnClose) +{ + UNIMPLEMENTED; +} + + +VOID STDCALL +SeOpenObjectForDeleteAuditAlarm(IN PUNICODE_STRING ObjectTypeName, + IN PVOID Object OPTIONAL, + IN PUNICODE_STRING AbsoluteObjectName OPTIONAL, + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PACCESS_STATE AccessState, + IN BOOLEAN ObjectCreated, + IN BOOLEAN AccessGranted, + IN KPROCESSOR_MODE AccessMode, + OUT PBOOLEAN GenerateOnClose) +{ + UNIMPLEMENTED; +} + /* EOF */ diff --git a/reactos/ntoskrnl/se/token.c b/reactos/ntoskrnl/se/token.c index 36a8c2d0323..84363af24d0 100644 --- a/reactos/ntoskrnl/se/token.c +++ b/reactos/ntoskrnl/se/token.c @@ -1,4 +1,4 @@ -/* $Id: token.c,v 1.34 2004/03/19 12:47:17 ekohl Exp $ +/* $Id: token.c,v 1.35 2004/05/18 12:23:48 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1504,13 +1504,27 @@ NtCreateToken(OUT PHANDLE UnsafeTokenHandle, } +/* + * @implemented + */ +NTSTATUS STDCALL +SeQueryAuthenticationIdToken(IN PACCESS_TOKEN Token, + OUT PLUID LogonId) +{ + LogonId->LowPart = Token->AuthenticationId.LowPart; + LogonId->HighPart = Token->AuthenticationId.HighPart; + + return STATUS_SUCCESS; +} + + /* * @implemented */ SECURITY_IMPERSONATION_LEVEL STDCALL SeTokenImpersonationLevel(IN PACCESS_TOKEN Token) { - return(Token->ImpersonationLevel); + return Token->ImpersonationLevel; } @@ -1520,7 +1534,9 @@ SeTokenImpersonationLevel(IN PACCESS_TOKEN Token) TOKEN_TYPE STDCALL SeTokenType(IN PACCESS_TOKEN Token) { - return(Token->TokenType); + return Token->TokenType; } + + /* EOF */ From 4b62bbcaa86a69372796559b0950816c9eec1226 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Tue, 18 May 2004 12:38:39 +0000 Subject: [PATCH 1166/1463] prompt with error messageboxes for problems when reading init files svn path=/trunk/; revision=9435 --- reactos/subsys/system/explorer/explorer.cpp | 7 ++++++- .../subsys/system/explorer/taskbar/favorites.cpp | 6 +++++- .../subsys/system/explorer/utility/xmlstorage.h | 16 +++++++++++----- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/reactos/subsys/system/explorer/explorer.cpp b/reactos/subsys/system/explorer/explorer.cpp index e415bb2eeb7..fb55a7c808c 100644 --- a/reactos/subsys/system/explorer/explorer.cpp +++ b/reactos/subsys/system/explorer/explorer.cpp @@ -82,8 +82,13 @@ void ExplorerGlobals::read_persistent() _cfg_dir.printf(TEXT("%s\\ReactOS"), (LPCTSTR)SpecialFolderFSPath(CSIDL_APPDATA,0)); _cfg_path.printf(TEXT("%s\\ros-explorer-cfg.xml"), _cfg_dir.c_str()); - if (!_cfg.read(_cfg_path)) + if (!_cfg.read(_cfg_path)) { + if (_cfg._last_error != XML_ERROR_NO_ELEMENTS) + MessageBox(g_Globals._hwndDesktop, String(_cfg._last_error_msg.c_str()), + TEXT("ROS Explorer - reading user settings"), MB_OK); + _cfg.read(TEXT("explorer-cfg-template.xml")); + } // read bookmarks _favorites_path.printf(TEXT("%s\\ros-explorer-bookmarks.xml"), _cfg_dir.c_str()); diff --git a/reactos/subsys/system/explorer/taskbar/favorites.cpp b/reactos/subsys/system/explorer/taskbar/favorites.cpp index 330cad2a9ad..c10af859cfb 100644 --- a/reactos/subsys/system/explorer/taskbar/favorites.cpp +++ b/reactos/subsys/system/explorer/taskbar/favorites.cpp @@ -427,7 +427,11 @@ bool Favorites::read(LPCTSTR path) XMLDoc xbel; if (!xbel.read(path)) - return false; + if (xbel._last_error == XML_ERROR_NO_ELEMENTS) + return false; + else + MessageBox(g_Globals._hwndDesktop, String(xbel._last_error_msg.c_str()), + TEXT("ROS Explorer - reading bookmark file"), MB_OK); const_XMLPos pos(&xbel); diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.h b/reactos/subsys/system/explorer/utility/xmlstorage.h index 7af85de3a07..910f8bb3b3e 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.h +++ b/reactos/subsys/system/explorer/utility/xmlstorage.h @@ -1232,6 +1232,7 @@ struct XMLReader return out.str(); } + XML_Error get_error_code() {return XML_GetErrorCode(_parser);} std::string get_error_string() const; protected: @@ -1276,12 +1277,14 @@ struct XMLHeader : public std::string struct XMLDoc : public XMLNode { XMLDoc() - : XMLNode("") + : XMLNode(""), + _last_error(XML_ERROR_NONE) { } XMLDoc(LPCTSTR path) - : XMLNode("") + : XMLNode(""), + _last_error(XML_ERROR_NONE) { read(path); } @@ -1297,7 +1300,8 @@ struct XMLDoc : public XMLNode out << reader.get_position() << " " << reader.get_error_string(); - _last_error = out.str(); + _last_error = reader.get_error_code(); + _last_error_msg = out.str(); } return in; @@ -1315,7 +1319,8 @@ struct XMLDoc : public XMLNode out << path << reader.get_position() << " " << reader.get_error_string(); - _last_error = out.str(); + _last_error = reader.get_error_code(); + _last_error_msg = out.str(); } return status != XML_STATUS_ERROR; @@ -1352,7 +1357,8 @@ struct XMLDoc : public XMLNode write_formating(out); } - std::string _last_error; + XML_Error _last_error; + std::string _last_error_msg; }; From 7ea71b67f4d5e2753070d8f752d3eb6de9c3f2bb Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Tue, 18 May 2004 13:57:41 +0000 Subject: [PATCH 1167/1463] safe parameter handling for PolyPolygonRgn() and PolygonRgn(). The actual region calculation for both functions is not yet implemented though! svn path=/trunk/; revision=9436 --- reactos/lib/gdi32/misc/stubs.c | 18 +-- reactos/lib/gdi32/objects/region.c | 24 +++- reactos/subsys/win32k/objects/region.c | 161 +++++++++++++++++++++++-- 3 files changed, 176 insertions(+), 27 deletions(-) diff --git a/reactos/lib/gdi32/misc/stubs.c b/reactos/lib/gdi32/misc/stubs.c index 36e80a40215..5b163624222 100644 --- a/reactos/lib/gdi32/misc/stubs.c +++ b/reactos/lib/gdi32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.61 2004/05/15 08:52:25 navaraf Exp $ +/* $Id: stubs.c,v 1.62 2004/05/18 13:57:41 weiden Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -1091,22 +1091,6 @@ GetMiterLimit( return FALSE; } - -/* - * @unimplemented - */ -HRGN -STDCALL -CreatePolygonRgn( - CONST POINT *a0, - int a1, - int a2 - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented */ diff --git a/reactos/lib/gdi32/objects/region.c b/reactos/lib/gdi32/objects/region.c index 352e43d3b47..cfcd00f5960 100644 --- a/reactos/lib/gdi32/objects/region.c +++ b/reactos/lib/gdi32/objects/region.c @@ -85,8 +85,27 @@ CreatePolyPolygonRgn( int fnPolyFillMode ) { - return NtGdiCreatePolyPolygonRgn ( (CONST PPOINT)lppt, - (CONST PINT)lpPolyCounts, nCount, fnPolyFillMode ); + return NtGdiCreatePolyPolygonRgn((CONST PPOINT)lppt, + (CONST PINT)lpPolyCounts, + nCount, + fnPolyFillMode); +} + + +/* + * @implemented + */ +HRGN +STDCALL +CreatePolygonRgn( + CONST POINT *lppt, + int cPoints, + int fnPolyFillMode + ) +{ + return NtGdiCreatePolygonRgn((CONST PPOINT)lppt, + cPoints, + fnPolyFillMode); } @@ -312,3 +331,4 @@ FrameRgn( { return NtGdiFrameRgn(hdc, hrgn, hbr, nWidth, nHeight); } + diff --git a/reactos/subsys/win32k/objects/region.c b/reactos/subsys/win32k/objects/region.c index b095dff8fb7..649ef0c052a 100644 --- a/reactos/subsys/win32k/objects/region.c +++ b/reactos/subsys/win32k/objects/region.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: region.c,v 1.53 2004/05/16 09:51:27 weiden Exp $ */ +/* $Id: region.c,v 1.54 2004/05/18 13:57:41 weiden Exp $ */ #include <w32k.h> #include <win32k/float.h> @@ -1692,23 +1692,168 @@ NtGdiCreateEllipticRgnIndirect(CONST PRECT Rect) SafeRect.right - SafeRect.left, SafeRect.bottom - SafeRect.top); } +HRGN FASTCALL +IntCreatePolyPolgonRgn(PPOINT pt, + PINT PolyCounts, + INT Count, + INT PolyFillMode) +{ + return (HRGN)0; +} + HRGN STDCALL NtGdiCreatePolygonRgn(CONST PPOINT pt, - INT Count, - INT PolyFillMode) + INT Count, + INT PolyFillMode) { - UNIMPLEMENTED; + POINT *SafePoints; + NTSTATUS Status; + HRGN hRgn; + + + if (pt == NULL || Count == 0 || + (PolyFillMode != WINDING && PolyFillMode != ALTERNATE)) + { + /* Windows doesn't set a last error here */ + return (HRGN)0; + } + + if (Count == 1) + { + /* can't create a region with only one point! */ + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return (HRGN)0; + } + + if (Count == 2) + { + /* Windows creates an empty region! */ + ROSRGNDATA *rgn; + + if(!(hRgn = RGNDATA_AllocRgn(1))) + { + return (HRGN)0; + } + if(!(rgn = RGNDATA_LockRgn(hRgn))) + { + NtGdiDeleteObject(hRgn); + return (HRGN)0; + } + + EMPTY_REGION(rgn); + + RGNDATA_UnlockRgn(hRgn); + return hRgn; + } + + if (!(SafePoints = ExAllocatePool(PagedPool, Count * sizeof(POINT)))) + { + SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); + return (HRGN)0; + } + + Status = MmCopyFromCaller(SafePoints, pt, Count * sizeof(POINT)); + if (!NT_SUCCESS(Status)) + { + ExFreePool(SafePoints); + SetLastNtError(Status); + return (HRGN)0; + } + + hRgn = IntCreatePolyPolgonRgn(SafePoints, &Count, 1, PolyFillMode); + + ExFreePool(SafePoints); + return hRgn; } HRGN STDCALL NtGdiCreatePolyPolygonRgn(CONST PPOINT pt, - CONST PINT PolyCounts, - INT Count, - INT PolyFillMode) + CONST PINT PolyCounts, + INT Count, + INT PolyFillMode) { - UNIMPLEMENTED; + POINT *Safept; + INT *SafePolyCounts; + INT nPoints, nEmpty, nInvalid, i; + HRGN hRgn; + NTSTATUS Status; + + if (pt == NULL || PolyCounts == NULL || Count == 0 || + (PolyFillMode != WINDING && PolyFillMode != ALTERNATE)) + { + /* Windows doesn't set a last error here */ + return (HRGN)0; + } + + if (!(SafePolyCounts = ExAllocatePool(PagedPool, Count * sizeof(INT)))) + { + SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); + return (HRGN)0; + } + + Status = MmCopyFromCaller(SafePolyCounts, PolyCounts, Count * sizeof(INT)); + if (!NT_SUCCESS(Status)) + { + ExFreePool(SafePolyCounts); + SetLastNtError(Status); + return (HRGN)0; + } + + /* validate poligons */ + nPoints = 0; + nEmpty = 0; + nInvalid = 0; + for (i = 0; i < Count; i++) + { + if (SafePolyCounts[i] == 0) + { + nEmpty++; + } + if (SafePolyCounts[i] == 1) + { + nInvalid++; + } + nPoints += SafePolyCounts[i]; + } + + if (nEmpty == Count) + { + /* if all polygon counts are zero, return without setting a last error code. */ + ExFreePool(SafePolyCounts); + return (HRGN)0; + } + if (nInvalid != 0) + { + /* if at least one poly count is 1, fail */ + ExFreePool(SafePolyCounts); + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return (HRGN)0; + } + + /* copy points */ + if (!(Safept = ExAllocatePool(PagedPool, nPoints * sizeof(POINT)))) + { + SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); + return (HRGN)0; + } + + Status = MmCopyFromCaller(Safept, pt, nPoints * sizeof(POINT)); + if (!NT_SUCCESS(Status)) + { + ExFreePool(Safept); + ExFreePool(SafePolyCounts); + SetLastNtError(Status); + return (HRGN)0; + } + + /* now we're ready to calculate the region safely */ + hRgn = IntCreatePolyPolgonRgn(Safept, SafePolyCounts, Count, PolyFillMode); + + ExFreePool(Safept); + ExFreePool(SafePolyCounts); + return hRgn; } HRGN STDCALL From 40c3c7cd37298e058f9bd94a08201b099503ae30 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Tue, 18 May 2004 14:06:42 +0000 Subject: [PATCH 1168/1463] fixed memory leak svn path=/trunk/; revision=9437 --- reactos/subsys/win32k/objects/region.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/objects/region.c b/reactos/subsys/win32k/objects/region.c index 649ef0c052a..dd4b5bb9ac7 100644 --- a/reactos/subsys/win32k/objects/region.c +++ b/reactos/subsys/win32k/objects/region.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: region.c,v 1.54 2004/05/18 13:57:41 weiden Exp $ */ +/* $Id: region.c,v 1.55 2004/05/18 14:06:42 weiden Exp $ */ #include <w32k.h> #include <win32k/float.h> @@ -1835,6 +1835,7 @@ NtGdiCreatePolyPolygonRgn(CONST PPOINT pt, /* copy points */ if (!(Safept = ExAllocatePool(PagedPool, nPoints * sizeof(POINT)))) { + ExFreePool(SafePolyCounts); SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); return (HRGN)0; } From e765178153e1ca5d7478bc3e5e9ad5ece990ad81 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Tue, 18 May 2004 15:25:25 +0000 Subject: [PATCH 1169/1463] ported CreatePolyPolygonRgn() and CreatePolygonRgn() from wine svn path=/trunk/; revision=9438 --- reactos/subsys/win32k/objects/region.c | 1250 ++++++++++++++++++++---- 1 file changed, 1084 insertions(+), 166 deletions(-) diff --git a/reactos/subsys/win32k/objects/region.c b/reactos/subsys/win32k/objects/region.c index dd4b5bb9ac7..303c5d77483 100644 --- a/reactos/subsys/win32k/objects/region.c +++ b/reactos/subsys/win32k/objects/region.c @@ -16,7 +16,104 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: region.c,v 1.55 2004/05/18 14:06:42 weiden Exp $ */ + +/* + * GDI region objects. Shamelessly ripped out from the X11 distribution + * Thanks for the nice licence. + * + * Copyright 1993, 1994, 1995 Alexandre Julliard + * Modifications and additions: Copyright 1998 Huw Davies + * 1999 Alex Korobka + * + * 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 + */ + +/************************************************************************ + +Copyright (c) 1987, 1988 X Consortium + +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 +X CONSORTIUM 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. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + +Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +************************************************************************/ +/* + * The functions in this file implement the Region abstraction, similar to one + * used in the X11 sample server. A Region is simply an area, as the name + * implies, and is implemented as a "y-x-banded" array of rectangles. To + * explain: Each Region is made up of a certain number of rectangles sorted + * by y coordinate first, and then by x coordinate. + * + * Furthermore, the rectangles are banded such that every rectangle with a + * given upper-left y coordinate (y1) will have the same lower-right y + * coordinate (y2) and vice versa. If a rectangle has scanlines in a band, it + * will span the entire vertical distance of the band. This means that some + * areas that could be merged into a taller rectangle will be represented as + * several shorter rectangles to account for shorter rectangles to its left + * or right but within its "vertical scope". + * + * An added constraint on the rectangles is that they must cover as much + * horizontal area as possible. E.g. no two rectangles in a band are allowed + * to touch. + * + * Whenever possible, bands will be merged together to cover a greater vertical + * distance (and thus reduce the number of rectangles). Two bands can be merged + * only if the bottom of one touches the top of the other and they have + * rectangles in the same places (of the same width, of course). This maintains + * the y-x-banding that's so nice to have... + */ + +/* $Id: region.c,v 1.56 2004/05/18 15:25:25 weiden Exp $ */ #include <w32k.h> #include <win32k/float.h> @@ -50,6 +147,247 @@ IntEngPaint(IN SURFOBJ *Surface,IN CLIPOBJ *ClipRegion,IN BRUSHOBJ *Brush,IN POI (r1)->bottom > (r2)->top && \ (r1)->top < (r2)->bottom) +/* + * In scan converting polygons, we want to choose those pixels + * which are inside the polygon. Thus, we add .5 to the starting + * x coordinate for both left and right edges. Now we choose the + * first pixel which is inside the pgon for the left edge and the + * first pixel which is outside the pgon for the right edge. + * Draw the left pixel, but not the right. + * + * How to add .5 to the starting x coordinate: + * If the edge is moving to the right, then subtract dy from the + * error term from the general form of the algorithm. + * If the edge is moving to the left, then add dy to the error term. + * + * The reason for the difference between edges moving to the left + * and edges moving to the right is simple: If an edge is moving + * to the right, then we want the algorithm to flip immediately. + * If it is moving to the left, then we don't want it to flip until + * we traverse an entire pixel. + */ +#define BRESINITPGON(dy, x1, x2, xStart, d, m, m1, incr1, incr2) { \ + int dx; /* local storage */ \ +\ + /* \ + * if the edge is horizontal, then it is ignored \ + * and assumed not to be processed. Otherwise, do this stuff. \ + */ \ + if ((dy) != 0) { \ + xStart = (x1); \ + dx = (x2) - xStart; \ + if (dx < 0) { \ + m = dx / (dy); \ + m1 = m - 1; \ + incr1 = -2 * dx + 2 * (dy) * m1; \ + incr2 = -2 * dx + 2 * (dy) * m; \ + d = 2 * m * (dy) - 2 * dx - 2 * (dy); \ + } else { \ + m = dx / (dy); \ + m1 = m + 1; \ + incr1 = 2 * dx - 2 * (dy) * m1; \ + incr2 = 2 * dx - 2 * (dy) * m; \ + d = -2 * m * (dy) + 2 * dx; \ + } \ + } \ +} + +#define BRESINCRPGON(d, minval, m, m1, incr1, incr2) { \ + if (m1 > 0) { \ + if (d > 0) { \ + minval += m1; \ + d += incr1; \ + } \ + else { \ + minval += m; \ + d += incr2; \ + } \ + } else {\ + if (d >= 0) { \ + minval += m1; \ + d += incr1; \ + } \ + else { \ + minval += m; \ + d += incr2; \ + } \ + } \ +} + +/* + * This structure contains all of the information needed + * to run the bresenham algorithm. + * The variables may be hardcoded into the declarations + * instead of using this structure to make use of + * register declarations. + */ +typedef struct { + INT minor_axis; /* minor axis */ + INT d; /* decision variable */ + INT m, m1; /* slope and slope+1 */ + INT incr1, incr2; /* error increments */ +} BRESINFO; + + +#define BRESINITPGONSTRUCT(dmaj, min1, min2, bres) \ + BRESINITPGON(dmaj, min1, min2, bres.minor_axis, bres.d, \ + bres.m, bres.m1, bres.incr1, bres.incr2) + +#define BRESINCRPGONSTRUCT(bres) \ + BRESINCRPGON(bres.d, bres.minor_axis, bres.m, bres.m1, bres.incr1, bres.incr2) + + + +/* + * These are the data structures needed to scan + * convert regions. Two different scan conversion + * methods are available -- the even-odd method, and + * the winding number method. + * The even-odd rule states that a point is inside + * the polygon if a ray drawn from that point in any + * direction will pass through an odd number of + * path segments. + * By the winding number rule, a point is decided + * to be inside the polygon if a ray drawn from that + * point in any direction passes through a different + * number of clockwise and counter-clockwise path + * segments. + * + * These data structures are adapted somewhat from + * the algorithm in (Foley/Van Dam) for scan converting + * polygons. + * The basic algorithm is to start at the top (smallest y) + * of the polygon, stepping down to the bottom of + * the polygon by incrementing the y coordinate. We + * keep a list of edges which the current scanline crosses, + * sorted by x. This list is called the Active Edge Table (AET) + * As we change the y-coordinate, we update each entry in + * in the active edge table to reflect the edges new xcoord. + * This list must be sorted at each scanline in case + * two edges intersect. + * We also keep a data structure known as the Edge Table (ET), + * which keeps track of all the edges which the current + * scanline has not yet reached. The ET is basically a + * list of ScanLineList structures containing a list of + * edges which are entered at a given scanline. There is one + * ScanLineList per scanline at which an edge is entered. + * When we enter a new edge, we move it from the ET to the AET. + * + * From the AET, we can implement the even-odd rule as in + * (Foley/Van Dam). + * The winding number rule is a little trickier. We also + * keep the EdgeTableEntries in the AET linked by the + * nextWETE (winding EdgeTableEntry) link. This allows + * the edges to be linked just as before for updating + * purposes, but only uses the edges linked by the nextWETE + * link as edges representing spans of the polygon to + * drawn (as with the even-odd rule). + */ + +/* + * for the winding number rule + */ +#define CLOCKWISE 1 +#define COUNTERCLOCKWISE -1 + +typedef struct _EdgeTableEntry { + INT ymax; /* ycoord at which we exit this edge. */ + BRESINFO bres; /* Bresenham info to run the edge */ + struct _EdgeTableEntry *next; /* next in the list */ + struct _EdgeTableEntry *back; /* for insertion sort */ + struct _EdgeTableEntry *nextWETE; /* for winding num rule */ + int ClockWise; /* flag for winding number rule */ +} EdgeTableEntry; + + +typedef struct _ScanLineList{ + INT scanline; /* the scanline represented */ + EdgeTableEntry *edgelist; /* header node */ + struct _ScanLineList *next; /* next in the list */ +} ScanLineList; + + +typedef struct { + INT ymax; /* ymax for the polygon */ + INT ymin; /* ymin for the polygon */ + ScanLineList scanlines; /* header node */ +} EdgeTable; + + +/* + * Here is a struct to help with storage allocation + * so we can allocate a big chunk at a time, and then take + * pieces from this heap when we need to. + */ +#define SLLSPERBLOCK 25 + +typedef struct _ScanLineListBlock { + ScanLineList SLLs[SLLSPERBLOCK]; + struct _ScanLineListBlock *next; +} ScanLineListBlock; + + +/* + * + * a few macros for the inner loops of the fill code where + * performance considerations don't allow a procedure call. + * + * Evaluate the given edge at the given scanline. + * If the edge has expired, then we leave it and fix up + * the active edge table; otherwise, we increment the + * x value to be ready for the next scanline. + * The winding number rule is in effect, so we must notify + * the caller when the edge has been removed so he + * can reorder the Winding Active Edge Table. + */ +#define EVALUATEEDGEWINDING(pAET, pPrevAET, y, fixWAET) { \ + if (pAET->ymax == y) { /* leaving this edge */ \ + pPrevAET->next = pAET->next; \ + pAET = pPrevAET->next; \ + fixWAET = 1; \ + if (pAET) \ + pAET->back = pPrevAET; \ + } \ + else { \ + BRESINCRPGONSTRUCT(pAET->bres); \ + pPrevAET = pAET; \ + pAET = pAET->next; \ + } \ +} + + +/* + * Evaluate the given edge at the given scanline. + * If the edge has expired, then we leave it and fix up + * the active edge table; otherwise, we increment the + * x value to be ready for the next scanline. + * The even-odd rule is in effect. + */ +#define EVALUATEEDGEEVENODD(pAET, pPrevAET, y) { \ + if (pAET->ymax == y) { /* leaving this edge */ \ + pPrevAET->next = pAET->next; \ + pAET = pPrevAET->next; \ + if (pAET) \ + pAET->back = pPrevAET; \ + } \ + else { \ + BRESINCRPGONSTRUCT(pAET->bres); \ + pPrevAET = pAET; \ + pAET = pAET->next; \ + } \ +} + +/************************************************************************** + * + * Poly Regions + * + *************************************************************************/ + +#define LARGE_COORDINATE 0x7fffffff /* FIXME */ +#define SMALL_COORDINATE 0x80000000 + + + /* * Check to see if there is enough memory in the present region. */ @@ -1692,171 +2030,6 @@ NtGdiCreateEllipticRgnIndirect(CONST PRECT Rect) SafeRect.right - SafeRect.left, SafeRect.bottom - SafeRect.top); } -HRGN FASTCALL -IntCreatePolyPolgonRgn(PPOINT pt, - PINT PolyCounts, - INT Count, - INT PolyFillMode) -{ - return (HRGN)0; -} - -HRGN -STDCALL -NtGdiCreatePolygonRgn(CONST PPOINT pt, - INT Count, - INT PolyFillMode) -{ - POINT *SafePoints; - NTSTATUS Status; - HRGN hRgn; - - - if (pt == NULL || Count == 0 || - (PolyFillMode != WINDING && PolyFillMode != ALTERNATE)) - { - /* Windows doesn't set a last error here */ - return (HRGN)0; - } - - if (Count == 1) - { - /* can't create a region with only one point! */ - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return (HRGN)0; - } - - if (Count == 2) - { - /* Windows creates an empty region! */ - ROSRGNDATA *rgn; - - if(!(hRgn = RGNDATA_AllocRgn(1))) - { - return (HRGN)0; - } - if(!(rgn = RGNDATA_LockRgn(hRgn))) - { - NtGdiDeleteObject(hRgn); - return (HRGN)0; - } - - EMPTY_REGION(rgn); - - RGNDATA_UnlockRgn(hRgn); - return hRgn; - } - - if (!(SafePoints = ExAllocatePool(PagedPool, Count * sizeof(POINT)))) - { - SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); - return (HRGN)0; - } - - Status = MmCopyFromCaller(SafePoints, pt, Count * sizeof(POINT)); - if (!NT_SUCCESS(Status)) - { - ExFreePool(SafePoints); - SetLastNtError(Status); - return (HRGN)0; - } - - hRgn = IntCreatePolyPolgonRgn(SafePoints, &Count, 1, PolyFillMode); - - ExFreePool(SafePoints); - return hRgn; -} - -HRGN -STDCALL -NtGdiCreatePolyPolygonRgn(CONST PPOINT pt, - CONST PINT PolyCounts, - INT Count, - INT PolyFillMode) -{ - POINT *Safept; - INT *SafePolyCounts; - INT nPoints, nEmpty, nInvalid, i; - HRGN hRgn; - NTSTATUS Status; - - if (pt == NULL || PolyCounts == NULL || Count == 0 || - (PolyFillMode != WINDING && PolyFillMode != ALTERNATE)) - { - /* Windows doesn't set a last error here */ - return (HRGN)0; - } - - if (!(SafePolyCounts = ExAllocatePool(PagedPool, Count * sizeof(INT)))) - { - SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); - return (HRGN)0; - } - - Status = MmCopyFromCaller(SafePolyCounts, PolyCounts, Count * sizeof(INT)); - if (!NT_SUCCESS(Status)) - { - ExFreePool(SafePolyCounts); - SetLastNtError(Status); - return (HRGN)0; - } - - /* validate poligons */ - nPoints = 0; - nEmpty = 0; - nInvalid = 0; - for (i = 0; i < Count; i++) - { - if (SafePolyCounts[i] == 0) - { - nEmpty++; - } - if (SafePolyCounts[i] == 1) - { - nInvalid++; - } - nPoints += SafePolyCounts[i]; - } - - if (nEmpty == Count) - { - /* if all polygon counts are zero, return without setting a last error code. */ - ExFreePool(SafePolyCounts); - return (HRGN)0; - } - if (nInvalid != 0) - { - /* if at least one poly count is 1, fail */ - ExFreePool(SafePolyCounts); - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return (HRGN)0; - } - - /* copy points */ - if (!(Safept = ExAllocatePool(PagedPool, nPoints * sizeof(POINT)))) - { - ExFreePool(SafePolyCounts); - SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); - return (HRGN)0; - } - - Status = MmCopyFromCaller(Safept, pt, nPoints * sizeof(POINT)); - if (!NT_SUCCESS(Status)) - { - ExFreePool(Safept); - ExFreePool(SafePolyCounts); - SetLastNtError(Status); - return (HRGN)0; - } - - /* now we're ready to calculate the region safely */ - hRgn = IntCreatePolyPolgonRgn(Safept, SafePolyCounts, Count, PolyFillMode); - - ExFreePool(Safept); - ExFreePool(SafePolyCounts); - return hRgn; -} - HRGN STDCALL NtGdiCreateRectRgn(INT LeftRect, INT TopRect, INT RightRect, INT BottomRect) { @@ -2463,4 +2636,749 @@ DWORD STDCALL NtGdiGetRegionData(HRGN hrgn, DWORD count, LPRGNDATA rgndata) RGNDATA_UnlockRgn( hrgn ); return size + sizeof(RGNDATAHEADER); } + + +/*********************************************************************** + * REGION_InsertEdgeInET + * + * Insert the given edge into the edge table. + * First we must find the correct bucket in the + * Edge table, then find the right slot in the + * bucket. Finally, we can insert it. + * + */ +static void REGION_InsertEdgeInET(EdgeTable *ET, EdgeTableEntry *ETE, + INT scanline, ScanLineListBlock **SLLBlock, INT *iSLLBlock) + +{ + EdgeTableEntry *start, *prev; + ScanLineList *pSLL, *pPrevSLL; + ScanLineListBlock *tmpSLLBlock; + + /* + * find the right bucket to put the edge into + */ + pPrevSLL = &ET->scanlines; + pSLL = pPrevSLL->next; + while (pSLL && (pSLL->scanline < scanline)) + { + pPrevSLL = pSLL; + pSLL = pSLL->next; + } + + /* + * reassign pSLL (pointer to ScanLineList) if necessary + */ + if ((!pSLL) || (pSLL->scanline > scanline)) + { + if (*iSLLBlock > SLLSPERBLOCK-1) + { + tmpSLLBlock = ExAllocatePoolWithTag( PagedPool, sizeof(ScanLineListBlock), TAG_REGION); + if(!tmpSLLBlock) + { + DPRINT1("REGION_InsertEdgeInETL(): Can't alloc SLLB\n"); + /* FIXME - free resources? */ + return; + } + (*SLLBlock)->next = tmpSLLBlock; + tmpSLLBlock->next = (ScanLineListBlock *)NULL; + *SLLBlock = tmpSLLBlock; + *iSLLBlock = 0; + } + pSLL = &((*SLLBlock)->SLLs[(*iSLLBlock)++]); + + pSLL->next = pPrevSLL->next; + pSLL->edgelist = (EdgeTableEntry *)NULL; + pPrevSLL->next = pSLL; + } + pSLL->scanline = scanline; + + /* + * now insert the edge in the right bucket + */ + prev = (EdgeTableEntry *)NULL; + start = pSLL->edgelist; + while (start && (start->bres.minor_axis < ETE->bres.minor_axis)) + { + prev = start; + start = start->next; + } + ETE->next = start; + + if (prev) + prev->next = ETE; + else + pSLL->edgelist = ETE; +} + +/*********************************************************************** + * REGION_loadAET + * + * This routine moves EdgeTableEntries from the + * EdgeTable into the Active Edge Table, + * leaving them sorted by smaller x coordinate. + * + */ +static void REGION_loadAET(EdgeTableEntry *AET, EdgeTableEntry *ETEs) +{ + EdgeTableEntry *pPrevAET; + EdgeTableEntry *tmp; + + pPrevAET = AET; + AET = AET->next; + while (ETEs) + { + while (AET && (AET->bres.minor_axis < ETEs->bres.minor_axis)) + { + pPrevAET = AET; + AET = AET->next; + } + tmp = ETEs->next; + ETEs->next = AET; + if (AET) + AET->back = ETEs; + ETEs->back = pPrevAET; + pPrevAET->next = ETEs; + pPrevAET = ETEs; + + ETEs = tmp; + } +} + +/*********************************************************************** + * REGION_computeWAET + * + * This routine links the AET by the + * nextWETE (winding EdgeTableEntry) link for + * use by the winding number rule. The final + * Active Edge Table (AET) might look something + * like: + * + * AET + * ---------- --------- --------- + * |ymax | |ymax | |ymax | + * | ... | |... | |... | + * |next |->|next |->|next |->... + * |nextWETE| |nextWETE| |nextWETE| + * --------- --------- ^-------- + * | | | + * V-------------------> V---> ... + * + */ +static void REGION_computeWAET(EdgeTableEntry *AET) +{ + register EdgeTableEntry *pWETE; + register int inside = 1; + register int isInside = 0; + + AET->nextWETE = (EdgeTableEntry *)NULL; + pWETE = AET; + AET = AET->next; + while (AET) + { + if (AET->ClockWise) + isInside++; + else + isInside--; + + if ((!inside && !isInside) || + ( inside && isInside)) + { + pWETE->nextWETE = AET; + pWETE = AET; + inside = !inside; + } + AET = AET->next; + } + pWETE->nextWETE = (EdgeTableEntry *)NULL; +} + +/*********************************************************************** + * REGION_InsertionSort + * + * Just a simple insertion sort using + * pointers and back pointers to sort the Active + * Edge Table. + * + */ +static BOOL REGION_InsertionSort(EdgeTableEntry *AET) +{ + EdgeTableEntry *pETEchase; + EdgeTableEntry *pETEinsert; + EdgeTableEntry *pETEchaseBackTMP; + BOOL changed = FALSE; + + AET = AET->next; + while (AET) + { + pETEinsert = AET; + pETEchase = AET; + while (pETEchase->back->bres.minor_axis > AET->bres.minor_axis) + pETEchase = pETEchase->back; + + AET = AET->next; + if (pETEchase != pETEinsert) + { + pETEchaseBackTMP = pETEchase->back; + pETEinsert->back->next = AET; + if (AET) + AET->back = pETEinsert->back; + pETEinsert->next = pETEchase; + pETEchase->back->next = pETEinsert; + pETEchase->back = pETEinsert; + pETEinsert->back = pETEchaseBackTMP; + changed = TRUE; + } + } + return changed; +} + +/*********************************************************************** + * REGION_FreeStorage + * + * Clean up our act. + */ +static void REGION_FreeStorage(ScanLineListBlock *pSLLBlock) +{ + ScanLineListBlock *tmpSLLBlock; + + while (pSLLBlock) + { + tmpSLLBlock = pSLLBlock->next; + ExFreePool( pSLLBlock ); + pSLLBlock = tmpSLLBlock; + } +} + + +/*********************************************************************** + * REGION_PtsToRegion + * + * Create an array of rectangles from a list of points. + */ +static int REGION_PtsToRegion(int numFullPtBlocks, int iCurPtBlock, + POINTBLOCK *FirstPtBlock, ROSRGNDATA *reg) +{ + RECT *rects; + POINT *pts; + POINTBLOCK *CurPtBlock; + int i; + RECT *extents, *temp; + INT numRects; + + extents = ®->rdh.rcBound; + + numRects = ((numFullPtBlocks * NUMPTSTOBUFFER) + iCurPtBlock) >> 1; + + if(!(temp = ExAllocatePoolWithTag(PagedPool, numRects * sizeof(RECT), TAG_REGION))) + { + return 0; + } + if(reg->Buffer != NULL) + { + RtlCopyMemory(temp, reg->Buffer, reg->rdh.nCount * sizeof(RECT)); + if(reg->Buffer != ®->BuiltInRect) + ExFreePool(reg->Buffer); + } + reg->Buffer = temp; + + reg->rdh.nCount = numRects; + CurPtBlock = FirstPtBlock; + rects = reg->Buffer - 1; + numRects = 0; + extents->left = LARGE_COORDINATE, extents->right = SMALL_COORDINATE; + + for ( ; numFullPtBlocks >= 0; numFullPtBlocks--) { + /* the loop uses 2 points per iteration */ + i = NUMPTSTOBUFFER >> 1; + if (!numFullPtBlocks) + i = iCurPtBlock >> 1; + for (pts = CurPtBlock->pts; i--; pts += 2) { + if (pts->x == pts[1].x) + continue; + if (numRects && pts->x == rects->left && pts->y == rects->bottom && + pts[1].x == rects->right && + (numRects == 1 || rects[-1].top != rects->top) && + (i && pts[2].y > pts[1].y)) { + rects->bottom = pts[1].y + 1; + continue; + } + numRects++; + rects++; + rects->left = pts->x; rects->top = pts->y; + rects->right = pts[1].x; rects->bottom = pts[1].y + 1; + if (rects->left < extents->left) + extents->left = rects->left; + if (rects->right > extents->right) + extents->right = rects->right; + } + CurPtBlock = CurPtBlock->next; + } + + if (numRects) { + extents->top = reg->Buffer->top; + extents->bottom = rects->bottom; + } else { + extents->left = 0; + extents->top = 0; + extents->right = 0; + extents->bottom = 0; + } + reg->rdh.nCount = numRects; + + return(TRUE); +} + +/*********************************************************************** + * REGION_CreateEdgeTable + * + * This routine creates the edge table for + * scan converting polygons. + * The Edge Table (ET) looks like: + * + * EdgeTable + * -------- + * | ymax | ScanLineLists + * |scanline|-->------------>-------------->... + * -------- |scanline| |scanline| + * |edgelist| |edgelist| + * --------- --------- + * | | + * | | + * V V + * list of ETEs list of ETEs + * + * where ETE is an EdgeTableEntry data structure, + * and there is one ScanLineList per scanline at + * which an edge is initially entered. + * + */ +static void REGION_CreateETandAET(const INT *Count, INT nbpolygons, + const POINT *pts, EdgeTable *ET, EdgeTableEntry *AET, + EdgeTableEntry *pETEs, ScanLineListBlock *pSLLBlock) +{ + const POINT *top, *bottom; + const POINT *PrevPt, *CurrPt, *EndPt; + INT poly, count; + int iSLLBlock = 0; + int dy; + + + /* + * initialize the Active Edge Table + */ + AET->next = (EdgeTableEntry *)NULL; + AET->back = (EdgeTableEntry *)NULL; + AET->nextWETE = (EdgeTableEntry *)NULL; + AET->bres.minor_axis = SMALL_COORDINATE; + + /* + * initialize the Edge Table. + */ + ET->scanlines.next = (ScanLineList *)NULL; + ET->ymax = SMALL_COORDINATE; + ET->ymin = LARGE_COORDINATE; + pSLLBlock->next = (ScanLineListBlock *)NULL; + + EndPt = pts - 1; + for(poly = 0; poly < nbpolygons; poly++) + { + count = Count[poly]; + EndPt += count; + if(count < 2) + continue; + + PrevPt = EndPt; + + /* + * for each vertex in the array of points. + * In this loop we are dealing with two vertices at + * a time -- these make up one edge of the polygon. + */ + while (count--) + { + CurrPt = pts++; + + /* + * find out which point is above and which is below. + */ + if (PrevPt->y > CurrPt->y) + { + bottom = PrevPt, top = CurrPt; + pETEs->ClockWise = 0; + } + else + { + bottom = CurrPt, top = PrevPt; + pETEs->ClockWise = 1; + } + + /* + * don't add horizontal edges to the Edge table. + */ + if (bottom->y != top->y) + { + pETEs->ymax = bottom->y-1; + /* -1 so we don't get last scanline */ + + /* + * initialize integer edge algorithm + */ + dy = bottom->y - top->y; + BRESINITPGONSTRUCT(dy, top->x, bottom->x, pETEs->bres); + + REGION_InsertEdgeInET(ET, pETEs, top->y, &pSLLBlock, + &iSLLBlock); + + if (PrevPt->y > ET->ymax) + ET->ymax = PrevPt->y; + if (PrevPt->y < ET->ymin) + ET->ymin = PrevPt->y; + pETEs++; + } + + PrevPt = CurrPt; + } + } +} + +HRGN FASTCALL +IntCreatePolyPolgonRgn(POINT *Pts, + INT *Count, + INT nbpolygons, + INT mode) +{ + HRGN hrgn; + ROSRGNDATA *region; + EdgeTableEntry *pAET; /* Active Edge Table */ + INT y; /* current scanline */ + int iPts = 0; /* number of pts in buffer */ + EdgeTableEntry *pWETE; /* Winding Edge Table Entry*/ + ScanLineList *pSLL; /* current scanLineList */ + POINT *pts; /* output buffer */ + EdgeTableEntry *pPrevAET; /* ptr to previous AET */ + EdgeTable ET; /* header node for ET */ + EdgeTableEntry AET; /* header node for AET */ + EdgeTableEntry *pETEs; /* EdgeTableEntries pool */ + ScanLineListBlock SLLBlock; /* header for scanlinelist */ + int fixWAET = FALSE; + POINTBLOCK FirstPtBlock, *curPtBlock; /* PtBlock buffers */ + POINTBLOCK *tmpPtBlock; + int numFullPtBlocks = 0; + INT poly, total; + + if(!(hrgn = RGNDATA_AllocRgn(nbpolygons))) + return 0; + if(!(region = RGNDATA_LockRgn(hrgn))) + { + NtGdiDeleteObject(hrgn); + return 0; + } + + /* special case a rectangle */ + + if (((nbpolygons == 1) && ((*Count == 4) || + ((*Count == 5) && (Pts[4].x == Pts[0].x) && (Pts[4].y == Pts[0].y)))) && + (((Pts[0].y == Pts[1].y) && + (Pts[1].x == Pts[2].x) && + (Pts[2].y == Pts[3].y) && + (Pts[3].x == Pts[0].x)) || + ((Pts[0].x == Pts[1].x) && + (Pts[1].y == Pts[2].y) && + (Pts[2].x == Pts[3].x) && + (Pts[3].y == Pts[0].y)))) + { + RGNDATA_UnlockRgn( hrgn ); + NtGdiSetRectRgn( hrgn, min(Pts[0].x, Pts[2].x), min(Pts[0].y, Pts[2].y), + max(Pts[0].x, Pts[2].x), max(Pts[0].y, Pts[2].y) ); + return hrgn; + } + + for(poly = total = 0; poly < nbpolygons; poly++) + total += Count[poly]; + if (! (pETEs = ExAllocatePoolWithTag( PagedPool, sizeof(EdgeTableEntry) * total, TAG_REGION ))) + { + NtGdiDeleteObject( hrgn ); + return 0; + } + pts = FirstPtBlock.pts; + REGION_CreateETandAET(Count, nbpolygons, Pts, &ET, &AET, pETEs, &SLLBlock); + pSLL = ET.scanlines.next; + curPtBlock = &FirstPtBlock; + + if (mode != WINDING) { + /* + * for each scanline + */ + for (y = ET.ymin; y < ET.ymax; y++) { + /* + * Add a new edge to the active edge table when we + * get to the next edge. + */ + if (pSLL != NULL && y == pSLL->scanline) { + REGION_loadAET(&AET, pSLL->edgelist); + pSLL = pSLL->next; + } + pPrevAET = &AET; + pAET = AET.next; + + /* + * for each active edge + */ + while (pAET) { + pts->x = pAET->bres.minor_axis, pts->y = y; + pts++, iPts++; + + /* + * send out the buffer + */ + if (iPts == NUMPTSTOBUFFER) { + tmpPtBlock = ExAllocatePoolWithTag( PagedPool, sizeof(POINTBLOCK), TAG_REGION); + if(!tmpPtBlock) { + DPRINT1("Can't alloc tPB\n"); + /* FIXME - free memory */ + return 0; + } + curPtBlock->next = tmpPtBlock; + curPtBlock = tmpPtBlock; + pts = curPtBlock->pts; + numFullPtBlocks++; + iPts = 0; + } + EVALUATEEDGEEVENODD(pAET, pPrevAET, y); + } + REGION_InsertionSort(&AET); + } + } + else { + /* + * for each scanline + */ + for (y = ET.ymin; y < ET.ymax; y++) { + /* + * Add a new edge to the active edge table when we + * get to the next edge. + */ + if (pSLL != NULL && y == pSLL->scanline) { + REGION_loadAET(&AET, pSLL->edgelist); + REGION_computeWAET(&AET); + pSLL = pSLL->next; + } + pPrevAET = &AET; + pAET = AET.next; + pWETE = pAET; + + /* + * for each active edge + */ + while (pAET) { + /* + * add to the buffer only those edges that + * are in the Winding active edge table. + */ + if (pWETE == pAET) { + pts->x = pAET->bres.minor_axis, pts->y = y; + pts++, iPts++; + + /* + * send out the buffer + */ + if (iPts == NUMPTSTOBUFFER) { + tmpPtBlock = ExAllocatePoolWithTag( PagedPool, + sizeof(POINTBLOCK), TAG_REGION ); + if(!tmpPtBlock) { + DPRINT1("Can't alloc tPB\n"); + /* FIXME - free resources */ + NtGdiDeleteObject( hrgn ); + return 0; + } + curPtBlock->next = tmpPtBlock; + curPtBlock = tmpPtBlock; + pts = curPtBlock->pts; + numFullPtBlocks++; iPts = 0; + } + pWETE = pWETE->nextWETE; + } + EVALUATEEDGEWINDING(pAET, pPrevAET, y, fixWAET); + } + + /* + * recompute the winding active edge table if + * we just resorted or have exited an edge. + */ + if (REGION_InsertionSort(&AET) || fixWAET) { + REGION_computeWAET(&AET); + fixWAET = FALSE; + } + } + } + REGION_FreeStorage(SLLBlock.next); + REGION_PtsToRegion(numFullPtBlocks, iPts, &FirstPtBlock, region); + + for (curPtBlock = FirstPtBlock.next; --numFullPtBlocks >= 0;) { + tmpPtBlock = curPtBlock->next; + ExFreePool( curPtBlock ); + curPtBlock = tmpPtBlock; + } + ExFreePool( pETEs ); + RGNDATA_UnlockRgn( hrgn ); + return hrgn; +} + +HRGN +STDCALL +NtGdiCreatePolygonRgn(CONST PPOINT pt, + INT Count, + INT PolyFillMode) +{ + POINT *SafePoints; + NTSTATUS Status; + HRGN hRgn; + + + if (pt == NULL || Count == 0 || + (PolyFillMode != WINDING && PolyFillMode != ALTERNATE)) + { + /* Windows doesn't set a last error here */ + return (HRGN)0; + } + + if (Count == 1) + { + /* can't create a region with only one point! */ + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return (HRGN)0; + } + + if (Count == 2) + { + /* Windows creates an empty region! */ + ROSRGNDATA *rgn; + + if(!(hRgn = RGNDATA_AllocRgn(1))) + { + return (HRGN)0; + } + if(!(rgn = RGNDATA_LockRgn(hRgn))) + { + NtGdiDeleteObject(hRgn); + return (HRGN)0; + } + + EMPTY_REGION(rgn); + + RGNDATA_UnlockRgn(hRgn); + return hRgn; + } + + if (!(SafePoints = ExAllocatePoolWithTag(PagedPool, Count * sizeof(POINT), TAG_REGION))) + { + SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); + return (HRGN)0; + } + + Status = MmCopyFromCaller(SafePoints, pt, Count * sizeof(POINT)); + if (!NT_SUCCESS(Status)) + { + ExFreePool(SafePoints); + SetLastNtError(Status); + return (HRGN)0; + } + + hRgn = IntCreatePolyPolgonRgn(SafePoints, &Count, 1, PolyFillMode); + + ExFreePool(SafePoints); + return hRgn; +} + +HRGN +STDCALL +NtGdiCreatePolyPolygonRgn(CONST PPOINT pt, + CONST PINT PolyCounts, + INT Count, + INT PolyFillMode) +{ + POINT *Safept; + INT *SafePolyCounts; + INT nPoints, nEmpty, nInvalid, i; + HRGN hRgn; + NTSTATUS Status; + + if (pt == NULL || PolyCounts == NULL || Count == 0 || + (PolyFillMode != WINDING && PolyFillMode != ALTERNATE)) + { + /* Windows doesn't set a last error here */ + return (HRGN)0; + } + + if (!(SafePolyCounts = ExAllocatePoolWithTag(PagedPool, Count * sizeof(INT), TAG_REGION))) + { + SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); + return (HRGN)0; + } + + Status = MmCopyFromCaller(SafePolyCounts, PolyCounts, Count * sizeof(INT)); + if (!NT_SUCCESS(Status)) + { + ExFreePool(SafePolyCounts); + SetLastNtError(Status); + return (HRGN)0; + } + + /* validate poligons */ + nPoints = 0; + nEmpty = 0; + nInvalid = 0; + for (i = 0; i < Count; i++) + { + if (SafePolyCounts[i] == 0) + { + nEmpty++; + } + if (SafePolyCounts[i] == 1) + { + nInvalid++; + } + nPoints += SafePolyCounts[i]; + } + + if (nEmpty == Count) + { + /* if all polygon counts are zero, return without setting a last error code. */ + ExFreePool(SafePolyCounts); + return (HRGN)0; + } + if (nInvalid != 0) + { + /* if at least one poly count is 1, fail */ + ExFreePool(SafePolyCounts); + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return (HRGN)0; + } + + /* copy points */ + if (!(Safept = ExAllocatePoolWithTag(PagedPool, nPoints * sizeof(POINT), TAG_REGION))) + { + ExFreePool(SafePolyCounts); + SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); + return (HRGN)0; + } + + Status = MmCopyFromCaller(Safept, pt, nPoints * sizeof(POINT)); + if (!NT_SUCCESS(Status)) + { + ExFreePool(Safept); + ExFreePool(SafePolyCounts); + SetLastNtError(Status); + return (HRGN)0; + } + + /* now we're ready to calculate the region safely */ + hRgn = IntCreatePolyPolgonRgn(Safept, SafePolyCounts, Count, PolyFillMode); + + ExFreePool(Safept); + ExFreePool(SafePolyCounts); + return hRgn; +} + /* EOF */ From 0fcdaa8c8142bd590be0c4be31aa07668bee9709 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Tue, 18 May 2004 16:22:49 +0000 Subject: [PATCH 1170/1463] Sylvain Petreolle - Hacked TGMarltt to work on Windows as well as Linux and ReactOS with FreeType. svn path=/trunk/; revision=9439 --- reactos/media/fonts/TGMarlett.ttf | Bin 5232 -> 5028 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/reactos/media/fonts/TGMarlett.ttf b/reactos/media/fonts/TGMarlett.ttf index 5c37644919e39943e6e8ef5c26b66d2f93cb2098..771fa557ade48f2bf0d62fd39768ed74b7d86401 100644 GIT binary patch delta 1372 zcmaKre`p(J7{|Zwy_ZXWH*41>re&O~OQ#tzG;89Ix>dHdnQm#f)O6L1?Q9a8nlv>_ zvv&Vv2Ba{YOm9E1l@)O^<|t091Gfnq2vU`yVyS=0Ku}PS3Mzt__+0K1LDW0$-p}(q z?>)cX=hik~=*)ousKs$`xCeswcPSq~dkkO?kTx`$R3<O>zAXXOW2D<Zn$5`AX<A1g z)RA3$CNUGUE<Y!eOm_1}V^Jk?=e=BrY&Yofj*-G5REfmD&~wjNGBdsDyVlFJ-$L?% zL~2w~?(XPl0cx}l29wJ4Bof$5!E7YU6G}1~%76Ym$)_m5>SXFjCRqLE2B3Kh*{4g% z!{h0B!S6rR*z+rR6{#uu?c(Y3`tsU#)~>qQ#+=DxdX+qF&{w{Sn9x+({`ZS%d6loh z*schA;a-z<uk;qkrZr5zY|K$cWGckafOiZ@KpmD1&T%q)V+bPgZw8xSV+{sNXky(4 z*Yj6cuoCVeWDRC8<Ceh!B&-_DN&l0<BFs!O*n~Q^87x<FE1{b0HVpM_S^S<3o{80D z(<;zeuRv$L0-f~&bk+;dSua3my#Sr{0(KyUNz6cP=1KLq`Qb2~uYxq4bChCI)V)eN z5zS~onh4^ULXw1NBtE6B|GD|!oTwl2w);ZS^pSXKLUy~lWMByW|8z3cZ^T^sk)Pq} z&*t}8&C<mx8+(+OngFyLE!v~Cgmmo?;ik2UZfyu2#LSvpEE2h)XjJ^FxY+nD*t<24 zu#N@x3Hw9XB7}t(g%5<Uh2MD-_wjxF5Kr=1{yM+O@2H1scd)*t3$^t;XQiQP@on1b z^ZLA9)>doldb4DfHg-BX9sJYo!W%B1KX4=9_qi${cE`6m4hH(YE|<4IaIFjwguIY9 zWlecX^8dW9I171CPat$V6zK8TDkM5XP9Z)#u+8JyHZc69I@I_@{G@5Y+)nQ9DkaGr zvX+~Lvh-1U-KCsmD_?Q4g<A#p%`3C%^z0Sq{LyIi==^0i_g2Z})mZG<`NhKF#q%@U zlP6!hc76V(L^w>p6YFELv?AHbzg_*Tv8}<<Nv?#Hv0uGzaU3Kkw9(F<mVS`VR_Zbt zk*Ql2EhD+qtrh2=_DFW_5<7coE*sIPFs_l7g?RPciSdz<@e}6?r^|$;-gQAiJ=1(| z0L@sB7PL~|Y*efrZFJ~6u?u}PKYr}SV|W~UXp#aLz##TvKY}z{PauS09KZ;k#8U{H LrzYZk?k@LVw$u_f delta 1632 zcmai!T})eL7{{OIeNVsm7~Oz^3|z-|Qd6-7>Id6c9KwYZB1>^*8y0%n9_$C6o*rN~ zom{wNQKNR*vat-KyKpGU77U5HnCX=ZE<qh$_z~k==JaAA#wEr?>T`NdVa^LrbKdv& zJn!@V&;LAq+w(1Jtr<m5i%<ebfkXGe(8HeIuddGlU>^Vk#^S+=$>=AS0Bn~j_sp28 zIANb@D?st{v@S$~sfk>Ub^^Xdu{9E#4&VIxmQ3qZZ}}!F217r_{(P6#zM#7^N(no& z3RF)wG)Ch}W~%9yW1cpIDDiA8ITqY0HH=Vfr+6?PoSJ|b_-R8c#m+=9F19*WZc<F5 z*7AvDO7ZOb{X2m26SV$4AdTSl{xy5&=aI6myTGkl0xr9{c5TkNbt~laR$y=3c?9dS zPOPuM(|DS6Y1C&3vu)YEMYWm1a8C%j*I;d07o(9K)zk_XQV$pfbvQ~Rb%QP?KWdDy z1yq_fX4L7I4d#^BOlx_8_`Ja;sD=*=F6D1R=7#=OlzLoH4MwmCmkefL7CtnXQ~rv< z0`cbto1jEkG1v??;Rl0D@v88PW<ju#zGhly-E^KahHHI6cdfJTT4&w0&YJ5RB!u^f zYFrT2Snq^hQ_$4%1x<~0&0@VMFPdFqY6kit2r?ZDkqm2=`-wszK^o%u=>FAz#{sIA zAw~5`NPrXCzzrUn0ro@hf3yel)p4p$8G9CMg_n5tA^t>1e^8EziUR#&NJ__HBQ(+h zQBFz8gtN`<al-yyV>x@)vV?mUhpg4Oml@x})A>UHP(iQ%C>bfD<H_h#N{8;TwP`wD zkmt6wU@n)tYv*Ox%NDe~i|^ZZVZ+<F!jO5`7(2l}V?S}^+j%#Cjz_u5U+44uD*rWG zQv4+LEDjcz@=Oh#$x2^SyRXyN>Gf1OsvMOS7PH0NP~Xzr(#)4T*57ga`uv9v`}=(E zO%gh!_U1$W-cGl>v)6xUgMhIaHe*svGvxSxv{zm0GmYLZe;^VG_`AHDB)9@DCJhhl z_Ih^@3`<h>k1bzjUNOyCYDu&<Zy1{!>NT5{6=c~*PCE*3z*k*3_v!81S1ult<zp9J zvy-AYIs4wVYx8;8rEvJjxrLRLg>%z;;;)|l=;PVfVh0Zb!ya^+SIsq>Pq?=cK1WrR z!|TzS)Y0BTk6=kdCp&C!9wBj3sKHV5Z|0L5FK#MWy1%KbuD@$S>X{46%NNe5p-s{Z z3QMPsj~_TNe*DzZ1}%PTA7b=tV)PHRBimnY%OFPqO=w07TG56@Sd1lDid(P@?YI@U zVL4V{B|5MQtMLJHwjFD+4j;rF=)|2^j}6#}O_p>*daBLSCL9svBu^$pu1qFPN>mm_ zA)HLhLReBoo|2|aDNz*@CQ*t+6(J!dydnm16vr@xB8D-7QIv2TU%(i~F@Z^(z!y=* O6e^fT6(?~Dr~d&35>L1Q From 90b8b7f3d67f65a52e92c0bf95d7062767f13c06 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Tue, 18 May 2004 22:32:48 +0000 Subject: [PATCH 1171/1463] use FASTCALL calling convention for internal routines svn path=/trunk/; revision=9440 --- reactos/subsys/win32k/objects/region.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/reactos/subsys/win32k/objects/region.c b/reactos/subsys/win32k/objects/region.c index 303c5d77483..add1ce02ed0 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.56 2004/05/18 15:25:25 weiden Exp $ */ +/* $Id: region.c,v 1.57 2004/05/18 22:32:48 weiden Exp $ */ #include <w32k.h> #include <win32k/float.h> @@ -2647,7 +2647,7 @@ DWORD STDCALL NtGdiGetRegionData(HRGN hrgn, DWORD count, LPRGNDATA rgndata) * bucket. Finally, we can insert it. * */ -static void REGION_InsertEdgeInET(EdgeTable *ET, EdgeTableEntry *ETE, +static void FASTCALL REGION_InsertEdgeInET(EdgeTable *ET, EdgeTableEntry *ETE, INT scanline, ScanLineListBlock **SLLBlock, INT *iSLLBlock) { @@ -2719,7 +2719,7 @@ static void REGION_InsertEdgeInET(EdgeTable *ET, EdgeTableEntry *ETE, * leaving them sorted by smaller x coordinate. * */ -static void REGION_loadAET(EdgeTableEntry *AET, EdgeTableEntry *ETEs) +static void FASTCALL REGION_loadAET(EdgeTableEntry *AET, EdgeTableEntry *ETEs) { EdgeTableEntry *pPrevAET; EdgeTableEntry *tmp; @@ -2765,7 +2765,7 @@ static void REGION_loadAET(EdgeTableEntry *AET, EdgeTableEntry *ETEs) * V-------------------> V---> ... * */ -static void REGION_computeWAET(EdgeTableEntry *AET) +static void FASTCALL REGION_computeWAET(EdgeTableEntry *AET) { register EdgeTableEntry *pWETE; register int inside = 1; @@ -2801,7 +2801,7 @@ static void REGION_computeWAET(EdgeTableEntry *AET) * Edge Table. * */ -static BOOL REGION_InsertionSort(EdgeTableEntry *AET) +static BOOL FASTCALL REGION_InsertionSort(EdgeTableEntry *AET) { EdgeTableEntry *pETEchase; EdgeTableEntry *pETEinsert; @@ -2838,7 +2838,7 @@ static BOOL REGION_InsertionSort(EdgeTableEntry *AET) * * Clean up our act. */ -static void REGION_FreeStorage(ScanLineListBlock *pSLLBlock) +static void FASTCALL REGION_FreeStorage(ScanLineListBlock *pSLLBlock) { ScanLineListBlock *tmpSLLBlock; @@ -2856,7 +2856,7 @@ static void REGION_FreeStorage(ScanLineListBlock *pSLLBlock) * * Create an array of rectangles from a list of points. */ -static int REGION_PtsToRegion(int numFullPtBlocks, int iCurPtBlock, +static int FASTCALL REGION_PtsToRegion(int numFullPtBlocks, int iCurPtBlock, POINTBLOCK *FirstPtBlock, ROSRGNDATA *reg) { RECT *rects; @@ -2953,7 +2953,7 @@ static int REGION_PtsToRegion(int numFullPtBlocks, int iCurPtBlock, * which an edge is initially entered. * */ -static void REGION_CreateETandAET(const INT *Count, INT nbpolygons, +static void FASTCALL REGION_CreateETandAET(const INT *Count, INT nbpolygons, const POINT *pts, EdgeTable *ET, EdgeTableEntry *AET, EdgeTableEntry *pETEs, ScanLineListBlock *pSLLBlock) { From 1f14756983c1a601a235e0c372459658e2b79631 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Wed, 19 May 2004 18:45:31 +0000 Subject: [PATCH 1172/1463] attempt to fix handling of timed out sending of messages to be thread-safe svn path=/trunk/; revision=9441 --- reactos/subsys/win32k/include/msgqueue.h | 6 +- reactos/subsys/win32k/ntuser/msgqueue.c | 150 ++++++++++++++++++++--- 2 files changed, 137 insertions(+), 19 deletions(-) diff --git a/reactos/subsys/win32k/include/msgqueue.h b/reactos/subsys/win32k/include/msgqueue.h index 7c0bbc833bb..ce25369b9da 100644 --- a/reactos/subsys/win32k/include/msgqueue.h +++ b/reactos/subsys/win32k/include/msgqueue.h @@ -23,9 +23,11 @@ typedef struct _USER_SENT_MESSAGE MSG Msg; PKEVENT CompletionEvent; LRESULT* Result; - struct _USER_MESSAGE_QUEUE* CompletionQueue; + struct _USER_MESSAGE_QUEUE* SenderQueue; SENDASYNCPROC CompletionCallback; ULONG_PTR CompletionCallbackContext; + /* entry in the dispatching list of the sender's message queue */ + LIST_ENTRY DispatchingListEntry; } USER_SENT_MESSAGE, *PUSER_SENT_MESSAGE; typedef struct _USER_SENT_MESSAGE_NOTIFY @@ -95,6 +97,8 @@ typedef struct _USER_MESSAGE_QUEUE /* extra message information */ LPARAM ExtraInfo; + /* messages that are currently dispatched by other threads */ + LIST_ENTRY DispatchingMessagesHead; } USER_MESSAGE_QUEUE, *PUSER_MESSAGE_QUEUE; BOOL FASTCALL diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index 6a9c218faed..c41edefc483 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.96 2004/05/15 16:17:59 gvg Exp $ +/* $Id: msgqueue.c,v 1.97 2004/05/19 18:45:31 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -698,9 +698,9 @@ MsqDispatchSentNotifyMessages(PUSER_MESSAGE_QUEUE MessageQueue) PLIST_ENTRY ListEntry; PUSER_SENT_MESSAGE_NOTIFY Message; + IntLockMessageQueue(MessageQueue); while (!IsListEmpty(&MessageQueue->SentMessagesListHead)) { - IntLockMessageQueue(MessageQueue); ListEntry = RemoveHeadList(&MessageQueue->SentMessagesListHead); Message = CONTAINING_RECORD(ListEntry, USER_SENT_MESSAGE_NOTIFY, ListEntry); @@ -711,7 +711,10 @@ MsqDispatchSentNotifyMessages(PUSER_MESSAGE_QUEUE MessageQueue) Message->Msg, Message->CompletionCallbackContext, Message->Result); + + IntLockMessageQueue(MessageQueue); } + IntUnLockMessageQueue(MessageQueue); } BOOLEAN FASTCALL @@ -744,6 +747,16 @@ MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) Message->Msg.wParam, Message->Msg.lParam); + /* remove the message from the dispatching list */ + IntLockMessageQueue(Message->SenderQueue); + if(Message->DispatchingListEntry.Flink != NULL) + { + /* only remove it from the dispatching list if not already removed by a timeout */ + RemoveEntryList(&Message->DispatchingListEntry); + } + /* still keep the sender's message queue locked, so the sender can't exit the + MsqSendMessage() function (if timed out) */ + /* Let the sender know the result. */ if (Message->Result != NULL) { @@ -756,11 +769,18 @@ MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) KeSetEvent(Message->CompletionEvent, IO_NO_INCREMENT, FALSE); } + /* unlock the sender's message queue, the safe operation is done */ + IntUnLockMessageQueue(Message->SenderQueue); + /* Notify the sender if they specified a callback. */ if (Message->CompletionCallback != NULL) { - NotifyMessage = ExAllocatePoolWithTag(NonPagedPool, - sizeof(USER_SENT_MESSAGE_NOTIFY), TAG_USRMSG); + if(!(NotifyMessage = ExAllocatePoolWithTag(NonPagedPool, + sizeof(USER_SENT_MESSAGE_NOTIFY), TAG_USRMSG))) + { + DPRINT1("MsqDispatchOneSentMessage(): Not enough memory to create a callback notify message\n"); + goto Notified; + } NotifyMessage->CompletionCallback = Message->CompletionCallback; NotifyMessage->CompletionCallbackContext = @@ -768,9 +788,11 @@ MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) NotifyMessage->Result = Result; NotifyMessage->hWnd = Message->Msg.hwnd; NotifyMessage->Msg = Message->Msg.message; - MsqSendNotifyMessage(Message->CompletionQueue, NotifyMessage); + MsqSendNotifyMessage(Message->SenderQueue, NotifyMessage); } +Notified: + /* FIXME - decrease reference counter of sender's message queue here */ ExFreePool(Message); return(TRUE); } @@ -799,31 +821,96 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, LARGE_INTEGER Timeout; PLIST_ENTRY Entry; + if(!(Message = ExAllocatePoolWithTag(PagedPool, sizeof(USER_SENT_MESSAGE), TAG_USRMSG))) + { + DPRINT1("MsqSendMessage(): Not enough memory to allocate a message"); + return STATUS_INSUFFICIENT_RESOURCES; + } + KeInitializeEvent(&CompletionEvent, NotificationEvent, FALSE); - - Message = ExAllocatePoolWithTag(PagedPool, sizeof(USER_SENT_MESSAGE), TAG_USRMSG); + + ThreadQueue = PsGetWin32Thread()->MessageQueue; + ASSERT(ThreadQueue != MessageQueue); + + /* FIXME - increase reference counter of sender's message queue here */ + + Result = 0; Message->Msg.hwnd = Wnd; Message->Msg.message = Msg; Message->Msg.wParam = wParam; Message->Msg.lParam = lParam; Message->CompletionEvent = &CompletionEvent; Message->Result = &Result; - Message->CompletionQueue = NULL; + Message->SenderQueue = ThreadQueue; Message->CompletionCallback = NULL; - + + /* add it to the list of pending messages */ + IntLockMessageQueue(ThreadQueue); + InsertTailList(&MessageQueue->DispatchingMessagesHead, &Message->DispatchingListEntry); + IntUnLockMessageQueue(ThreadQueue); + + /* queue it in the destination's message queue */ IntLockMessageQueue(MessageQueue); InsertTailList(&MessageQueue->SentMessagesListHead, &Message->ListEntry); IntUnLockMessageQueue(MessageQueue); + KeSetEvent(&MessageQueue->NewMessages, IO_NO_INCREMENT, FALSE); + /* we can't access the Message anymore since it could have already been deleted! */ + Timeout.QuadPart = uTimeout * -10000; - ThreadQueue = PsGetWin32Thread()->MessageQueue; if(Block) { /* don't process messages sent to the thread */ WaitStatus = KeWaitForSingleObject(&CompletionEvent, UserRequest, UserMode, FALSE, (uTimeout ? &Timeout : NULL)); + if(WaitStatus == STATUS_TIMEOUT) + { + /* look up if the message has already been dispatched, if so + make sure it can't pass a result and it must not set the completion event anymore */ + IntLockMessageQueue(MessageQueue); + Entry = MessageQueue->SentMessagesListHead.Flink; + while (Entry != &MessageQueue->SentMessagesListHead) + { + if ((PUSER_SENT_MESSAGE) CONTAINING_RECORD(Entry, USER_SENT_MESSAGE, ListEntry) + == Message) + { + /* we can access Message here, it's secure because the message queue is locked + and the message is still hasn't been dispatched */ + Message->CompletionEvent = NULL; + Message->Result = NULL; + break; + } + Entry = Entry->Flink; + } + IntUnLockMessageQueue(MessageQueue); + + /* remove from the local dispatching list so the other thread knows, + it can't pass a result and it must not set the completion event anymore */ + IntLockMessageQueue(ThreadQueue); + Entry = ThreadQueue->DispatchingMessagesHead.Flink; + while (Entry != &ThreadQueue->DispatchingMessagesHead) + { + if ((PUSER_SENT_MESSAGE) CONTAINING_RECORD(Entry, USER_SENT_MESSAGE, DispatchingListEntry) + == Message) + { + /* we can access Message here, it's secure because the sender's message is locked + and the message has definitely not yet been destroyed, otherwise it would + have been removed from this list by the dispatching routine right after + dispatching the message */ + Message->CompletionEvent = NULL; + Message->Result = NULL; + RemoveEntryList(&Message->DispatchingListEntry); + break; + } + Entry = Entry->Flink; + } + IntUnLockMessageQueue(ThreadQueue); + + DPRINT("MsqSendMessage (blocked) timed out\n"); + } + while (MsqDispatchOneSentMessage(ThreadQueue)); } else { @@ -837,26 +924,51 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, UserMode, FALSE, (uTimeout ? &Timeout : NULL), NULL); if(WaitStatus == STATUS_TIMEOUT) { - IntLockMessageQueue(MessageQueue); + /* look up if the message has already been dispatched, if so + make sure it can't pass a result and it must not set the completion event anymore */ + IntLockMessageQueue(MessageQueue); Entry = MessageQueue->SentMessagesListHead.Flink; while (Entry != &MessageQueue->SentMessagesListHead) { if ((PUSER_SENT_MESSAGE) CONTAINING_RECORD(Entry, USER_SENT_MESSAGE, ListEntry) == Message) { - Message->CompletionEvent = NULL; + /* we can access Message here, it's secure because the message queue is locked + and the message is still hasn't been dispatched */ + Message->CompletionEvent = NULL; + Message->Result = NULL; break; } Entry = Entry->Flink; } IntUnLockMessageQueue(MessageQueue); - DPRINT("MsqSendMessage timed out\n"); + + /* remove from the local dispatching list so the other thread knows, + it can't pass a result and it must not set the completion event anymore */ + IntLockMessageQueue(ThreadQueue); + Entry = ThreadQueue->DispatchingMessagesHead.Flink; + while (Entry != &ThreadQueue->DispatchingMessagesHead) + { + if ((PUSER_SENT_MESSAGE) CONTAINING_RECORD(Entry, USER_SENT_MESSAGE, DispatchingListEntry) + == Message) + { + /* we can access Message here, it's secure because the sender's message is locked + and the message has definitely not yet been destroyed, otherwise it would + have been removed from this list by the dispatching routine right after + dispatching the message */ + Message->CompletionEvent = NULL; + Message->Result = NULL; + RemoveEntryList(&Message->DispatchingListEntry); + break; + } + Entry = Entry->Flink; + } + IntUnLockMessageQueue(ThreadQueue); + + DPRINT("MsqSendMessage timed out\n"); break; } - while (MsqDispatchOneSentMessage(ThreadQueue)) - { - ; - } + while (MsqDispatchOneSentMessage(ThreadQueue)); } while (NT_SUCCESS(WaitStatus) && STATUS_WAIT_0 != WaitStatus); } @@ -972,6 +1084,7 @@ MsqInitializeMessageQueue(struct _ETHREAD *Thread, PUSER_MESSAGE_QUEUE MessageQu InitializeListHead(&MessageQueue->PostedMessagesListHead); InitializeListHead(&MessageQueue->SentMessagesListHead); InitializeListHead(&MessageQueue->HardwareMessagesListHead); + InitializeListHead(&MessageQueue->DispatchingMessagesHead); KeInitializeMutex(&MessageQueue->HardwareLock, 0); ExInitializeFastMutex(&MessageQueue->Lock); MessageQueue->QuitPosted = FALSE; @@ -1008,12 +1121,13 @@ MsqCreateMessageQueue(struct _ETHREAD *Thread) MessageQueue = (PUSER_MESSAGE_QUEUE)ExAllocatePoolWithTag(PagedPool, sizeof(USER_MESSAGE_QUEUE) + sizeof(THRDCARETINFO), TAG_MSGQ); - RtlZeroMemory(MessageQueue, sizeof(USER_MESSAGE_QUEUE) + sizeof(THRDCARETINFO)); + if (!MessageQueue) { return NULL; } + RtlZeroMemory(MessageQueue, sizeof(USER_MESSAGE_QUEUE) + sizeof(THRDCARETINFO)); MsqInitializeMessageQueue(Thread, MessageQueue); return MessageQueue; From 23c42995a1663c5f1b2de1eba5812afb6b5c354b Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Wed, 19 May 2004 19:09:20 +0000 Subject: [PATCH 1173/1463] fixed RegisterWindowMessage() svn path=/trunk/; revision=9442 --- reactos/subsys/win32k/include/cleanup.h | 4 ++ reactos/subsys/win32k/ntuser/misc.c | 50 ++++++++++++++- reactos/subsys/win32k/ntuser/window.c | 85 +++++-------------------- 3 files changed, 68 insertions(+), 71 deletions(-) diff --git a/reactos/subsys/win32k/include/cleanup.h b/reactos/subsys/win32k/include/cleanup.h index bdc5d3a078d..6ceb9166f8b 100644 --- a/reactos/subsys/win32k/include/cleanup.h +++ b/reactos/subsys/win32k/include/cleanup.h @@ -7,4 +7,8 @@ NTSTATUS FASTCALL IntSafeCopyUnicodeString(PUNICODE_STRING Dest, PUNICODE_STRING Source); +NTSTATUS FASTCALL +IntSafeCopyUnicodeStringTerminateNULL(PUNICODE_STRING Dest, + PUNICODE_STRING Source); + #endif /* ndef _SUBSYS_WIN32K_INCLUDE_CLEANUP_H */ diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index 426b302528d..ac0a1823b51 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.73 2004/05/14 23:57:32 weiden Exp $ +/* $Id: misc.c,v 1.74 2004/05/19 19:09:20 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1132,3 +1132,51 @@ IntSafeCopyUnicodeString(PUNICODE_STRING Dest, return STATUS_SUCCESS; } +NTSTATUS FASTCALL +IntSafeCopyUnicodeStringTerminateNULL(PUNICODE_STRING Dest, + PUNICODE_STRING Source) +{ + NTSTATUS Status; + PWSTR Src; + + Status = MmCopyFromCaller(Dest, Source, sizeof(UNICODE_STRING)); + if(!NT_SUCCESS(Status)) + { + return Status; + } + + if(Dest->Length > 0x4000) + { + return STATUS_UNSUCCESSFUL; + } + + Src = Dest->Buffer; + Dest->Buffer = NULL; + + if(Dest->Length > 0 && Src) + { + Dest->Buffer = ExAllocatePoolWithTag(NonPagedPool, Dest->Length + sizeof(WCHAR), TAG_STRING); + if(!Dest->Buffer) + { + return STATUS_NO_MEMORY; + } + + Status = MmCopyFromCaller(Dest->Buffer, Src, Dest->Length); + if(!NT_SUCCESS(Status)) + { + ExFreePool(Dest->Buffer); + Dest->Buffer = NULL; + return Status; + } + + /* make sure the string is null-terminated */ + Src = (PWSTR)((PBYTE)Dest->Buffer + Dest->Length); + *Src = L'\0'; + + return STATUS_SUCCESS; + } + + /* string is empty */ + return STATUS_SUCCESS; +} + diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index aa522f932e5..dccc1df6414 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.233 2004/05/16 19:31:09 navaraf Exp $ +/* $Id: window.c,v 1.234 2004/05/19 19:09:20 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -3572,76 +3572,21 @@ NtUserRealChildWindowFromPoint(DWORD Unknown0, UINT STDCALL NtUserRegisterWindowMessage(PUNICODE_STRING MessageNameUnsafe) { -#if 0 - PLIST_ENTRY Current; - PREGISTERED_MESSAGE NewMsg, RegMsg; - UINT Msg = REGISTERED_MESSAGE_MIN; - UNICODE_STRING MessageName; + UNICODE_STRING SafeMessageName; NTSTATUS Status; - - Status = MmCopyFromCaller(&MessageName, MessageNameUnsafe, sizeof(UNICODE_STRING)); - if (! NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return 0; - } - - NewMsg = ExAllocatePoolWithTag(PagedPool, - sizeof(REGISTERED_MESSAGE) + - MessageName.Length, - TAG_WNAM); - if (NULL == NewMsg) - { - SetLastNtError(STATUS_NO_MEMORY); - return 0; - } - - Status = MmCopyFromCaller(NewMsg->MessageName, MessageName.Buffer, MessageName.Length); - if (! NT_SUCCESS(Status)) - { - ExFreePool(NewMsg); - SetLastNtError(Status); - return 0; - } - NewMsg->MessageName[MessageName.Length / sizeof(WCHAR)] = L'\0'; - if (wcslen(NewMsg->MessageName) != MessageName.Length / sizeof(WCHAR)) - { - ExFreePool(NewMsg); - SetLastNtError(STATUS_INVALID_PARAMETER); - return 0; - } - - Current = RegisteredMessageListHead.Flink; - while (Current != &RegisteredMessageListHead) - { - RegMsg = CONTAINING_RECORD(Current, REGISTERED_MESSAGE, ListEntry); - if (0 == wcscmp(NewMsg->MessageName, RegMsg->MessageName)) - { - ExFreePool(NewMsg); - return Msg; - } - Msg++; - Current = Current->Flink; - } - - if (REGISTERED_MESSAGE_MAX < Msg) - { - ExFreePool(NewMsg); - SetLastNtError(STATUS_INSUFFICIENT_RESOURCES); - return 0; - } - - InsertTailList(&RegisteredMessageListHead, &(NewMsg->ListEntry)); - - return Msg; -#else - /* - * Notes: - * - There's no need to call MmSafe*, because it should be done in kernel. - * - The passed UNICODE_STRING is expected to be NULL-terminated. - */ - return (UINT)IntAddAtom(MessageNameUnsafe->Buffer); -#endif + UINT Ret; + + Status = IntSafeCopyUnicodeStringTerminateNULL(&SafeMessageName, MessageNameUnsafe); + if(!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return 0; + } + + Ret = (UINT)IntAddAtom(SafeMessageName.Buffer); + + RtlFreeUnicodeString(&SafeMessageName); + return Ret; } From 46d6fe416342fcf94dc620d1f50cfacd90a5a0ab Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Wed, 19 May 2004 19:16:47 +0000 Subject: [PATCH 1174/1463] set proper lasterror code in RegisterWindowMessage() svn path=/trunk/; revision=9443 --- reactos/subsys/win32k/ntuser/window.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index dccc1df6414..eef3351487d 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.234 2004/05/19 19:09:20 weiden Exp $ +/* $Id: window.c,v 1.235 2004/05/19 19:16:47 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -3576,6 +3576,12 @@ NtUserRegisterWindowMessage(PUNICODE_STRING MessageNameUnsafe) NTSTATUS Status; UINT Ret; + if(MessageNameUnsafe == NULL) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return 0; + } + Status = IntSafeCopyUnicodeStringTerminateNULL(&SafeMessageName, MessageNameUnsafe); if(!NT_SUCCESS(Status)) { From a7cf6b254ffc5302b56acd0801525e8cf6565977 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III <royce3@ev1.net> Date: Thu, 20 May 2004 04:10:01 +0000 Subject: [PATCH 1175/1463] get current HINSTANCE if given NULL in CreateWindowExA&W - fixes bug I found today with my little 'window stresser' app. svn path=/trunk/; revision=9444 --- reactos/lib/user32/windows/window.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/reactos/lib/user32/windows/window.c b/reactos/lib/user32/windows/window.c index c70a186e369..80b4d61c99f 100644 --- a/reactos/lib/user32/windows/window.c +++ b/reactos/lib/user32/windows/window.c @@ -1,4 +1,4 @@ -/* $Id: window.c,v 1.116 2004/05/08 12:42:45 weiden Exp $ +/* $Id: window.c,v 1.117 2004/05/20 04:10:01 royce Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -193,6 +193,9 @@ CreateWindowExA(DWORD dwExStyle, ControlsInitialized = ControlsInit(ClassName.Buffer); } + if ( hInstance == NULL ) + hInstance = GetModuleHandleW(NULL); + if (dwExStyle & WS_EX_MDICHILD) { if (!IS_ATOM(lpClassName)) @@ -278,6 +281,9 @@ CreateWindowExW(DWORD dwExStyle, ControlsInitialized = ControlsInit(lpClassName); } + if ( hInstance == NULL ) + hInstance = GetModuleHandleW(NULL); + if (dwExStyle & WS_EX_MDICHILD) return CreateMDIWindowW(lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hInstance, (LPARAM)lpParam); From 4a1429bb28d29f8b7f620c5b18f695da0b451f2a Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Thu, 20 May 2004 08:37:21 +0000 Subject: [PATCH 1176/1463] - Do not change the mapping count of a page if the physical address falls in the range of valid physical memory (in MmMapIoSpace and MmUnmapIoSpace). svn path=/trunk/; revision=9445 --- reactos/ntoskrnl/include/internal/mm.h | 4 -- reactos/ntoskrnl/mm/i386/page.c | 88 +++----------------------- reactos/ntoskrnl/mm/iospace.c | 3 +- reactos/ntoskrnl/mm/marea.c | 41 +++++++----- reactos/ntoskrnl/mm/pagefile.c | 9 +-- 5 files changed, 38 insertions(+), 107 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index c61e4c48414..9fb32f2dbf1 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -669,9 +669,5 @@ VOID MmRawDeleteVirtualMapping(PVOID Address); VOID MiStopPagerThread(VOID); -NTSTATUS -MmCreateVirtualMappingDump(PVOID Address, - ULONG flProtect, - PHYSICAL_ADDRESS PhysicalAddress); #endif diff --git a/reactos/ntoskrnl/mm/i386/page.c b/reactos/ntoskrnl/mm/i386/page.c index b71e1a4b94c..cbd39188991 100644 --- a/reactos/ntoskrnl/mm/i386/page.c +++ b/reactos/ntoskrnl/mm/i386/page.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: page.c,v 1.65 2004/04/28 20:46:03 hbirr Exp $ +/* $Id: page.c,v 1.66 2004/05/20 08:37:21 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/i386/page.c @@ -1003,9 +1003,9 @@ BOOLEAN MmIsPageSwapEntry(PEPROCESS Process, PVOID Address) } NTSTATUS -MmCreateVirtualMappingDump(PVOID Address, - ULONG flProtect, - PHYSICAL_ADDRESS PhysicalAddress) +MmCreateVirtualMappingForKernel(PVOID Address, + ULONG flProtect, + PHYSICAL_ADDRESS PhysicalAddress) { ULONG Attributes; PULONG Pte; @@ -1013,7 +1013,7 @@ MmCreateVirtualMappingDump(PVOID Address, if (Address < (PVOID)KERNEL_BASE) { - DPRINT1("No process\n"); + DPRINT1("MmCreateVirtualMappingForKernel is called for user space\n"); KEBUGCHECK(0); } @@ -1031,87 +1031,15 @@ MmCreateVirtualMappingDump(PVOID Address, { return(Status); } - if (PAGE_MASK((*Pte)) != 0 && !((*Pte) & PA_PRESENT)) - { - KEBUGCHECK(0); - } - *Pte = (ULONG)(PhysicalAddress.QuadPart | Attributes); - FLUSH_TLB; - return(STATUS_SUCCESS); -} - -NTSTATUS -MmCreateVirtualMappingForKernel(PVOID Address, - ULONG flProtect, - PHYSICAL_ADDRESS PhysicalAddress) -{ - PEPROCESS CurrentProcess; - ULONG Attributes; - PULONG Pte; - NTSTATUS Status; - PEPROCESS Process = NULL; - - if (Process != NULL) - { - CurrentProcess = PsGetCurrentProcess(); - } - else - { - CurrentProcess = NULL; - } - - if (Process == NULL && Address < (PVOID)KERNEL_BASE) - { - DPRINT1("No process\n"); - KEBUGCHECK(0); - } - if (Process != NULL && Address >= (PVOID)KERNEL_BASE) - { - DPRINT1("Setting kernel address with process context\n"); - KEBUGCHECK(0); - } - Attributes = ProtectToPTE(flProtect); - - if (Process != NULL && Process != CurrentProcess) - { - KeAttachProcess(Process); - } - - Status = MmGetPageEntry2(Address, &Pte, FALSE); - if (!NT_SUCCESS(Status)) - { - if (Process != NULL && Process != CurrentProcess) - { - KeDetachProcess(); - } - return(Status); - } - if (PAGE_MASK((*Pte)) != 0 && !((*Pte) & PA_PRESENT)) - { - KEBUGCHECK(0); - } if (PAGE_MASK((*Pte)) != 0) { - MmMarkPageUnmapped(PTE_TO_PAGE((*Pte))); + KEBUGCHECK(0); } + *Pte = (ULONG)(PhysicalAddress.QuadPart | Attributes); - if (Process != NULL && - Process->AddressSpace.PageTableRefCountTable != NULL && - Address < (PVOID)KERNEL_BASE && - Attributes & PA_PRESENT) - { - PUSHORT Ptrc; - - Ptrc = Process->AddressSpace.PageTableRefCountTable; - - Ptrc[ADDR_TO_PAGE_TABLE(Address)]++; - } FLUSH_TLB; - if (Process != NULL && Process != CurrentProcess) - { - KeDetachProcess(); - } + return(STATUS_SUCCESS); } diff --git a/reactos/ntoskrnl/mm/iospace.c b/reactos/ntoskrnl/mm/iospace.c index 548f77c2fa4..c58f8cefd3f 100644 --- a/reactos/ntoskrnl/mm/iospace.c +++ b/reactos/ntoskrnl/mm/iospace.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: iospace.c,v 1.27 2004/05/15 22:45:49 hbirr Exp $ +/* $Id: iospace.c,v 1.28 2004/05/20 08:37:20 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/iospace.c @@ -126,7 +126,6 @@ MmMapIoSpace (IN PHYSICAL_ADDRESS PhysicalAddress, DbgPrint("Unable to create virtual mapping\n"); KEBUGCHECK(0); } - MmMarkPageMapped(PhysicalAddress); } return ((PVOID)((char*)Result + Offset)); } diff --git a/reactos/ntoskrnl/mm/marea.c b/reactos/ntoskrnl/mm/marea.c index fc0475d3ab3..092cb8eb263 100644 --- a/reactos/ntoskrnl/mm/marea.c +++ b/reactos/ntoskrnl/mm/marea.c @@ -395,28 +395,35 @@ MmFreeMemoryArea(PMADDRESS_SPACE AddressSpace, PHYSICAL_ADDRESS PhysAddr = { 0 }; #endif - BOOL Dirty = FALSE; - SWAPENTRY SwapEntry = 0; - - if (MmIsPageSwapEntry(AddressSpace->Process, - (char*)MemoryArea->BaseAddress + (i * PAGE_SIZE))) + if (MemoryArea->Type == MEMORY_AREA_IO_MAPPING) { - MmDeletePageFileMapping(AddressSpace->Process, - (char*)MemoryArea->BaseAddress + (i * PAGE_SIZE), - &SwapEntry); + MmRawDeleteVirtualMapping((char*)MemoryArea->BaseAddress + (i * PAGE_SIZE)); } else { - MmDeleteVirtualMapping(AddressSpace->Process, - (char*)MemoryArea->BaseAddress + (i*PAGE_SIZE), - FALSE, &Dirty, &PhysAddr); + BOOL Dirty = FALSE; + SWAPENTRY SwapEntry = 0; - } - if (FreePage != NULL) - { - FreePage(FreePageContext, MemoryArea, - (char*)MemoryArea->BaseAddress + (i * PAGE_SIZE), PhysAddr, - SwapEntry, (BOOLEAN)Dirty); + if (MmIsPageSwapEntry(AddressSpace->Process, + (char*)MemoryArea->BaseAddress + (i * PAGE_SIZE))) + { + MmDeletePageFileMapping(AddressSpace->Process, + (char*)MemoryArea->BaseAddress + (i * PAGE_SIZE), + &SwapEntry); + } + else + { + MmDeleteVirtualMapping(AddressSpace->Process, + (char*)MemoryArea->BaseAddress + (i*PAGE_SIZE), + FALSE, &Dirty, &PhysAddr); + + } + if (FreePage != NULL) + { + FreePage(FreePageContext, MemoryArea, + (char*)MemoryArea->BaseAddress + (i * PAGE_SIZE), PhysAddr, + SwapEntry, (BOOLEAN)Dirty); + } } } if (AddressSpace->Process != NULL && diff --git a/reactos/ntoskrnl/mm/pagefile.c b/reactos/ntoskrnl/mm/pagefile.c index 9ebf161488d..b984a62e70f 100644 --- a/reactos/ntoskrnl/mm/pagefile.c +++ b/reactos/ntoskrnl/mm/pagefile.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: pagefile.c,v 1.44 2004/04/22 01:57:49 jimtabor Exp $ +/* $Id: pagefile.c,v 1.45 2004/05/20 08:37:20 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/pagefile.c @@ -587,9 +587,9 @@ MmDumpToPagingFile(ULONG BugCode, LARGE_INTEGER PhysicalAddress; PhysicalAddress.QuadPart = i * PAGE_SIZE; MdlMap[0] = i * PAGE_SIZE; - MmCreateVirtualMappingDump(MmCoreDumpPageFrame, - PAGE_READWRITE, - PhysicalAddress); + MmCreateVirtualMappingForKernel(MmCoreDumpPageFrame, + PAGE_READWRITE, + PhysicalAddress); #if defined(__GNUC__) DiskOffset = MmGetOffsetPageFile(RetrievalPointers, @@ -604,6 +604,7 @@ MmDumpToPagingFile(ULONG BugCode, #endif DiskOffset.QuadPart += MmCoreDumpLcnMapping.LcnDiskOffset.QuadPart; Status = MmCoreDumpFunctions->DumpWrite(DiskOffset, Mdl); + MmRawDeleteVirtualMapping(MmCoreDumpPageFrame); if (!NT_SUCCESS(Status)) { DPRINT1("MM: Failed to write page to core dump.\n"); From f44bcb1cdb76125137e6375fd91c2c628723f4a2 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Thu, 20 May 2004 12:42:51 +0000 Subject: [PATCH 1177/1463] Add some security function stubs. svn path=/trunk/; revision=9446 --- reactos/ntoskrnl/ntoskrnl.def | 12 ++--- reactos/ntoskrnl/ntoskrnl.edf | 12 ++--- reactos/ntoskrnl/se/audit.c | 11 +++- reactos/ntoskrnl/se/sd.c | 44 +++++++++++++++- reactos/ntoskrnl/se/semgr.c | 97 +++++++++++++++++++++-------------- 5 files changed, 123 insertions(+), 53 deletions(-) diff --git a/reactos/ntoskrnl/ntoskrnl.def b/reactos/ntoskrnl/ntoskrnl.def index 8b924aaf69e..ba6c5210657 100644 --- a/reactos/ntoskrnl/ntoskrnl.def +++ b/reactos/ntoskrnl/ntoskrnl.def @@ -1,4 +1,4 @@ -; $Id: ntoskrnl.def,v 1.180 2004/05/18 12:24:40 ekohl Exp $ +; $Id: ntoskrnl.def,v 1.181 2004/05/20 12:42:51 ekohl Exp $ ; ; reactos/ntoskrnl/ntoskrnl.def ; @@ -896,7 +896,7 @@ SeDeleteObjectAuditAlarm@8 SeExports DATA ;SeFreePrivileges@4 SeImpersonateClient@8 -;SeLockSubjectContext@4 +SeLockSubjectContext@4 ;SeMarkLogonSessionForTerminationNotification@4 SeOpenObjectAuditAlarm@36 SeOpenObjectForDeleteAuditAlarm@36 @@ -904,19 +904,19 @@ SePrivilegeCheck@12 ;SePrivilegeObjectAuditAlarm@24 SePublicDefaultDacl DATA SeQueryAuthenticationIdToken@8 -;SeQuerySecurityDescriptorInfo@16 +SeQuerySecurityDescriptorInfo@16 ;SeRegisterLogonSessionTerminatedRoutine@4 ;SeReleaseSecurityDescriptor@12 SeReleaseSubjectContext@4 ;SeSetAccessStateGenericMapping@8 -;SeSetSecurityDescriptorInfo@24 +SeSetSecurityDescriptorInfo@24 SeSinglePrivilegeCheck@12 SeSystemDefaultDacl DATA SeTokenImpersonationLevel@4 SeTokenType@4 -;SeUnlockSubjectContext@4 +SeUnlockSubjectContext@4 ;SeUnregisterLogonSessionTerminatedRoutine@4 -;SeValidSecurityDescriptor@8 +SeValidSecurityDescriptor@8 WRITE_REGISTER_UCHAR@8 WRITE_REGISTER_ULONG@8 WRITE_REGISTER_USHORT@8 diff --git a/reactos/ntoskrnl/ntoskrnl.edf b/reactos/ntoskrnl/ntoskrnl.edf index 172bee59e1d..4514a03c411 100644 --- a/reactos/ntoskrnl/ntoskrnl.edf +++ b/reactos/ntoskrnl/ntoskrnl.edf @@ -1,4 +1,4 @@ -; $Id: ntoskrnl.edf,v 1.166 2004/05/18 12:24:40 ekohl Exp $ +; $Id: ntoskrnl.edf,v 1.167 2004/05/20 12:42:51 ekohl Exp $ ; ; reactos/ntoskrnl/ntoskrnl.def ; @@ -896,7 +896,7 @@ SeDeleteObjectAuditAlarm=SeDeleteObjectAuditAlarm@8 SeExports DATA ;SeFreePrivileges=SeFreePrivileges@4 SeImpersonateClient=SeImpersonateClient@8 -;SeLockSubjectContext=SeLockSubjectContext@4 +SeLockSubjectContext=SeLockSubjectContext@4 ;SeMarkLogonSessionForTerminationNotification=SeMarkLogonSessionForTerminationNotification@4 SeOpenObjectAuditAlarm=SeOpenObjectAuditAlarm@36 SeOpenObjectForDeleteAuditAlarm=SeOpenObjectForDeleteAuditAlarm@36 @@ -904,19 +904,19 @@ SePrivilegeCheck=SePrivilegeCheck@12 ;SePrivilegeObjectAuditAlarm=SePrivilegeObjectAuditAlarm@24 SePublicDefaultDacl DATA SeQueryAuthenticationIdToken=SeQueryAuthenticationIdToken@8 -;SeQuerySecurityDescriptorInfo=SeQuerySecurityDescriptorInfo@16 +SeQuerySecurityDescriptorInfo=SeQuerySecurityDescriptorInfo@16 ;SeRegisterLogonSessionTerminatedRoutine=SeRegisterLogonSessionTerminatedRoutine@4 ;SeReleaseSecurityDescriptor=SeReleaseSecurityDescriptor@12 SeReleaseSubjectContext=SeReleaseSubjectContext@4 ;SeSetAccessStateGenericMapping=SeSetAccessStateGenericMapping@8 -;SeSetSecurityDescriptorInfo=SeSetSecurityDescriptorInfo@24 +SeSetSecurityDescriptorInfo=SeSetSecurityDescriptorInfo@24 SeSinglePrivilegeCheck=SeSinglePrivilegeCheck@12 SeSystemDefaultDacl DATA SeTokenImpersonationLevel=SeTokenImpersonationLevel@4 SeTokenType=SeTokenType@4 -;SeUnlockSubjectContext=SeUnlockSubjectContext@4 +SeUnlockSubjectContext=SeUnlockSubjectContext@4 ;SeUnregisterLogonSessionTerminatedRoutine=SeUnregisterLogonSessionTerminatedRoutine@4 -;SeValidSecurityDescriptor=SeValidSecurityDescriptor@8 +SeValidSecurityDescriptor=SeValidSecurityDescriptor@8 WRITE_REGISTER_UCHAR=WRITE_REGISTER_UCHAR@8 WRITE_REGISTER_ULONG=WRITE_REGISTER_ULONG@8 WRITE_REGISTER_USHORT=WRITE_REGISTER_USHORT@8 diff --git a/reactos/ntoskrnl/se/audit.c b/reactos/ntoskrnl/se/audit.c index 3ac4c417f13..2ee2bd6c4e5 100644 --- a/reactos/ntoskrnl/se/audit.c +++ b/reactos/ntoskrnl/se/audit.c @@ -1,4 +1,4 @@ -/* $Id: audit.c,v 1.3 2004/05/18 12:23:48 ekohl Exp $ +/* $Id: audit.c,v 1.4 2004/05/20 12:42:11 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -101,6 +101,9 @@ NtPrivilegeObjectAuditAlarm(IN PUNICODE_STRING SubsystemName, } +/* + * @unimplemented + */ VOID STDCALL SeDeleteObjectAuditAlarm(IN PVOID Object, IN HANDLE Handle) @@ -109,6 +112,9 @@ SeDeleteObjectAuditAlarm(IN PVOID Object, } +/* + * @unimplemented + */ VOID STDCALL SeOpenObjectAuditAlarm(IN PUNICODE_STRING ObjectTypeName, IN PVOID Object OPTIONAL, @@ -124,6 +130,9 @@ SeOpenObjectAuditAlarm(IN PUNICODE_STRING ObjectTypeName, } +/* + * @unimplemented + */ VOID STDCALL SeOpenObjectForDeleteAuditAlarm(IN PUNICODE_STRING ObjectTypeName, IN PVOID Object OPTIONAL, diff --git a/reactos/ntoskrnl/se/sd.c b/reactos/ntoskrnl/se/sd.c index bed3c1a855b..02c3c643a5c 100644 --- a/reactos/ntoskrnl/se/sd.c +++ b/reactos/ntoskrnl/se/sd.c @@ -1,4 +1,4 @@ -/* $Id: sd.c,v 1.13 2003/12/30 18:52:06 fireball Exp $ +/* $Id: sd.c,v 1.14 2004/05/20 12:42:11 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -781,4 +781,46 @@ RtlAbsoluteToSelfRelativeSD(PSECURITY_DESCRIPTOR AbsSD, return(STATUS_SUCCESS); } + +/* + * @unimplemented + */ +NTSTATUS STDCALL +SeQuerySecurityDescriptorInfo(IN PSECURITY_INFORMATION SecurityInformation, + OUT PSECURITY_DESCRIPTOR SecurityDescriptor, + IN OUT PULONG Length, + IN PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +NTSTATUS STDCALL +SeSetSecurityDescriptorInfo(IN PVOID Object OPTIONAL, + IN PSECURITY_INFORMATION SecurityInformation, + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor, + IN POOL_TYPE PoolType, + IN PGENERIC_MAPPING GenericMapping) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +BOOLEAN STDCALL +SeValidSecurityDescriptor(IN ULONG Length, + IN PSECURITY_DESCRIPTOR SecurityDescriptor) +{ + UNIMPLEMENTED; + return FALSE; +} + /* EOF */ diff --git a/reactos/ntoskrnl/se/semgr.c b/reactos/ntoskrnl/se/semgr.c index 908e693f579..fc08889145b 100644 --- a/reactos/ntoskrnl/se/semgr.c +++ b/reactos/ntoskrnl/se/semgr.c @@ -1,4 +1,4 @@ -/* $Id: semgr.c,v 1.29 2004/03/14 18:13:19 ekohl Exp $ +/* $Id: semgr.c,v 1.30 2004/05/20 12:42:11 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -38,20 +38,20 @@ SeInit1(VOID) SepInitLuid(); if (!SepInitSecurityIDs()) - return(FALSE); + return FALSE; if (!SepInitDACLs()) - return(FALSE); + return FALSE; if (!SepInitSDs()) - return(FALSE); + return FALSE; SepInitPrivileges(); if (!SepInitExports()) - return(FALSE); + return FALSE; - return(TRUE); + return TRUE; } @@ -60,7 +60,7 @@ SeInit2(VOID) { SepInitializeTokenImplementation(); - return(TRUE); + return TRUE; } @@ -87,7 +87,7 @@ SeInitSRM(VOID) if (!NT_SUCCESS(Status)) { DPRINT1("Failed to create 'Security' directory!\n"); - return(FALSE); + return FALSE; } /* Create 'LSA_AUTHENTICATION_INITALIZED' event */ @@ -105,9 +105,9 @@ SeInitSRM(VOID) FALSE); if (!NT_SUCCESS(Status)) { - DPRINT1("Failed to create 'Security' directory!\n"); + DPRINT1("Failed to create 'LSA_AUTHENTICATION_INITALIZED' event!\n"); NtClose(DirectoryHandle); - return(FALSE); + return FALSE; } NtClose(EventHandle); @@ -115,7 +115,7 @@ SeInitSRM(VOID) /* FIXME: Create SRM port and listener thread */ - return(TRUE); + return TRUE; } @@ -126,7 +126,7 @@ SepInitExports(VOID) sizeof(SE_EXPORTS), TAG_SXPT); if (SeExports == NULL) - return(FALSE); + return FALSE; SeExports->SeCreateTokenPrivilege = SeCreateTokenPrivilege; SeExports->SeAssignPrimaryTokenPrivilege = SeAssignPrimaryTokenPrivilege; @@ -172,7 +172,7 @@ SepInitExports(VOID) SeExports->SeAliasPrintOpsSid = SeAliasPrintOpsSid; SeExports->SeAliasBackupOpsSid = SeAliasBackupOpsSid; - return(TRUE); + return TRUE; } @@ -220,21 +220,7 @@ NtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, * @implemented */ VOID STDCALL -SeReleaseSubjectContext (PSECURITY_SUBJECT_CONTEXT SubjectContext) -{ - ObDereferenceObject (SubjectContext->PrimaryToken); - if (SubjectContext->ClientToken != NULL) - { - ObDereferenceObject (SubjectContext->ClientToken); - } -} - - -/* - * @implemented - */ -VOID STDCALL -SeCaptureSubjectContext (PSECURITY_SUBJECT_CONTEXT SubjectContext) +SeCaptureSubjectContext(OUT PSECURITY_SUBJECT_CONTEXT SubjectContext) { PEPROCESS Process; BOOLEAN CopyOnOpen; @@ -248,7 +234,41 @@ SeCaptureSubjectContext (PSECURITY_SUBJECT_CONTEXT SubjectContext) &CopyOnOpen, &EffectiveOnly, &SubjectContext->ImpersonationLevel); - SubjectContext->PrimaryToken = PsReferencePrimaryToken (Process); + SubjectContext->PrimaryToken = PsReferencePrimaryToken (Process); +} + + +/* + * @unimplemented + */ +VOID STDCALL +SeLockSubjectContext(IN PSECURITY_SUBJECT_CONTEXT SubjectContext) +{ + UNIMPLEMENTED; +} + + +/* + * @implemented + */ +VOID STDCALL +SeReleaseSubjectContext(IN PSECURITY_SUBJECT_CONTEXT SubjectContext) +{ + ObDereferenceObject (SubjectContext->PrimaryToken); + if (SubjectContext->ClientToken != NULL) + { + ObDereferenceObject (SubjectContext->ClientToken); + } +} + + +/* + * @unimplemented + */ +VOID STDCALL +SeUnlockSubjectContext(IN PSECURITY_SUBJECT_CONTEXT SubjectContext) +{ + UNIMPLEMENTED; } @@ -360,7 +380,7 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR ParentDescriptor, if (Descriptor->Control & SE_SACL_PRESENT || Descriptor->Sacl == NULL ||) { - Sacl = NULL; + Sacl = NULL; } else { @@ -379,7 +399,7 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR ParentDescriptor, GenericMapping); } #else - UNIMPLEMENTED; + UNIMPLEMENTED; return(STATUS_NOT_IMPLEMENTED); #endif } @@ -449,13 +469,13 @@ SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, PACE CurrentAce; PSID Sid; ACCESS_MASK CurrentAccess; - + CurrentAccess = PreviouslyGrantedAccess; - - /* + + /* * Ignore the SACL for now */ - + /* * Check the DACL */ @@ -467,7 +487,7 @@ SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, { return(Status); } - + CurrentAce = (PACE)(Dacl + 1); for (i = 0; i < Dacl->AceCount; i++) { @@ -493,16 +513,15 @@ SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, if (!(CurrentAccess & DesiredAccess) && !((~CurrentAccess) & DesiredAccess)) { - *AccessStatus = STATUS_ACCESS_DENIED; + *AccessStatus = STATUS_ACCESS_DENIED; } else { *AccessStatus = STATUS_SUCCESS; } *GrantedAccess = CurrentAccess; - + return(STATUS_SUCCESS); } - /* EOF */ From 0a242842b2a09b7bc237f66d77580dfcc49acb36 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Thu, 20 May 2004 14:12:21 +0000 Subject: [PATCH 1178/1463] fixed FillRect() to properly handle system color constants (thanks to Royce for spotting this bug) svn path=/trunk/; revision=9447 --- reactos/lib/user32/windows/draw.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/reactos/lib/user32/windows/draw.c b/reactos/lib/user32/windows/draw.c index e4422576db2..bfd06096ead 100644 --- a/reactos/lib/user32/windows/draw.c +++ b/reactos/lib/user32/windows/draw.c @@ -45,6 +45,8 @@ #define SPI_SETFOCUSBORDERWIDTH (8207) #define SPI_GETFOCUSBORDERHEIGHT (8208) #define SPI_SETFOCUSBORDERHEIGHT (8209) +#define COLOR_MENUHILIGHT (29) +#define COLOR_MENUBAR (30) /* GLOBALS *******************************************************************/ @@ -1823,13 +1825,18 @@ INT STDCALL FillRect(HDC hDC, CONST RECT *lprc, HBRUSH hbr) { HBRUSH prevhbr; - if ((DWORD)hbr < 0x4000) - hbr = GetSysColorBrush((DWORD)hbr); - if ((prevhbr = SelectObject(hDC, hbr)) == NULL) + + if (hbr <= (HBRUSH)(COLOR_MENUBAR + 1)) + { + hbr = GetSysColorBrush((int)hbr - 1); + } + if ((prevhbr = NtGdiSelectObject(hDC, hbr)) == NULL) + { return FALSE; - PatBlt(hDC, lprc->left, lprc->top, lprc->right - lprc->left, + } + NtGdiPatBlt(hDC, lprc->left, lprc->top, lprc->right - lprc->left, lprc->bottom - lprc->top, PATCOPY); - SelectObject(hDC, prevhbr); + NtGdiSelectObject(hDC, prevhbr); return TRUE; } From 0cc4a84668e6807d8b745368ef1e5d2871d810bc Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Thu, 20 May 2004 14:34:14 +0000 Subject: [PATCH 1179/1463] clip to the work area when dragging a window svn path=/trunk/; revision=9448 --- reactos/lib/user32/windows/defwnd.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/reactos/lib/user32/windows/defwnd.c b/reactos/lib/user32/windows/defwnd.c index 7cbc0e9c87a..7076467b231 100644 --- a/reactos/lib/user32/windows/defwnd.c +++ b/reactos/lib/user32/windows/defwnd.c @@ -1,4 +1,4 @@ -/* $Id: defwnd.c,v 1.137 2004/05/13 20:24:26 navaraf Exp $ +/* $Id: defwnd.c,v 1.138 2004/05/20 14:34:14 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -573,9 +573,8 @@ DefWndDoSizeMove(HWND hwnd, WORD wParam) } else { - SetRect(&mouseRect, 0, 0, GetSystemMetrics(SM_CXSCREEN), - GetSystemMetrics(SM_CYSCREEN)); - clipRect = mouseRect; + SystemParametersInfoW(SPI_GETWORKAREA, 0, &clipRect, 0); + mouseRect = clipRect; } ClipCursor(&clipRect); From c9bec757dfd4aac293d139daf2fd3abf4f1ce744 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Thu, 20 May 2004 14:53:14 +0000 Subject: [PATCH 1180/1463] fixed handling of caption buttons svn path=/trunk/; revision=9449 --- reactos/lib/user32/windows/nonclient.c | 1 - 1 file changed, 1 deletion(-) diff --git a/reactos/lib/user32/windows/nonclient.c b/reactos/lib/user32/windows/nonclient.c index 0ae8dbeb018..e456da3264a 100644 --- a/reactos/lib/user32/windows/nonclient.c +++ b/reactos/lib/user32/windows/nonclient.c @@ -937,7 +937,6 @@ DefWndDoButton(HWND hWnd, WPARAM wParam) case WM_MOUSEMOVE: if(HasBtn) { - ClientToScreen(hWnd, &Msg.pt); CurBtn = DefWndNCHitTest(hWnd, Msg.pt); if(InBtn != (CurBtn == OrigBtn)) { From 6851738b5af85087f1ccb24920d3a52a3f8444d5 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Thu, 20 May 2004 21:48:41 +0000 Subject: [PATCH 1181/1463] fixed message timeout crash, caused by inserting dispatching messages into the wrong dispatching list svn path=/trunk/; revision=9450 --- reactos/subsys/win32k/ntuser/msgqueue.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index c41edefc483..d143c5311e5 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.97 2004/05/19 18:45:31 weiden Exp $ +/* $Id: msgqueue.c,v 1.98 2004/05/20 21:48:41 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -747,7 +747,7 @@ MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) Message->Msg.wParam, Message->Msg.lParam); - /* remove the message from the dispatching list */ + /* remove the message from the dispatching list, so lock the sender's message queue */ IntLockMessageQueue(Message->SenderQueue); if(Message->DispatchingListEntry.Flink != NULL) { @@ -832,6 +832,8 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, ThreadQueue = PsGetWin32Thread()->MessageQueue; ASSERT(ThreadQueue != MessageQueue); + Timeout.QuadPart = uTimeout * -10000; + /* FIXME - increase reference counter of sender's message queue here */ Result = 0; @@ -846,7 +848,7 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, /* add it to the list of pending messages */ IntLockMessageQueue(ThreadQueue); - InsertTailList(&MessageQueue->DispatchingMessagesHead, &Message->DispatchingListEntry); + InsertTailList(&ThreadQueue->DispatchingMessagesHead, &Message->DispatchingListEntry); IntUnLockMessageQueue(ThreadQueue); /* queue it in the destination's message queue */ @@ -858,8 +860,6 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, /* we can't access the Message anymore since it could have already been deleted! */ - Timeout.QuadPart = uTimeout * -10000; - if(Block) { /* don't process messages sent to the thread */ @@ -867,7 +867,7 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, FALSE, (uTimeout ? &Timeout : NULL)); if(WaitStatus == STATUS_TIMEOUT) { - /* look up if the message has already been dispatched, if so + /* look up if the message has not yet dispatched, if so make sure it can't pass a result and it must not set the completion event anymore */ IntLockMessageQueue(MessageQueue); Entry = MessageQueue->SentMessagesListHead.Flink; @@ -924,7 +924,7 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, UserMode, FALSE, (uTimeout ? &Timeout : NULL), NULL); if(WaitStatus == STATUS_TIMEOUT) { - /* look up if the message has already been dispatched, if so + /* look up if the message has not yet been dispatched, if so make sure it can't pass a result and it must not set the completion event anymore */ IntLockMessageQueue(MessageQueue); Entry = MessageQueue->SentMessagesListHead.Flink; From 4349fe89901f95548fd60989aaf422cc58611ce1 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Fri, 21 May 2004 10:09:31 +0000 Subject: [PATCH 1182/1463] implemented DisableProcessWindowsGhosting() (window ghosting is not yet implemented though) svn path=/trunk/; revision=9451 --- reactos/include/napi/win32.h | 1 + reactos/include/win32k/misc.h | 5 +++++ reactos/include/win32k/ntuser.h | 1 + reactos/lib/user32/include/user32.h | 3 +++ reactos/lib/user32/misc/stubs.c | 12 +----------- reactos/lib/user32/windows/window.c | 12 +++++++++++- reactos/subsys/win32k/main/dllmain.c | 8 ++++---- reactos/subsys/win32k/ntuser/guicheck.c | 18 ++++++++--------- reactos/subsys/win32k/ntuser/misc.c | 26 ++++++++++++++++++++++++- 9 files changed, 60 insertions(+), 26 deletions(-) diff --git a/reactos/include/napi/win32.h b/reactos/include/napi/win32.h index f9f63962b2d..0dad9f6298d 100644 --- a/reactos/include/napi/win32.h +++ b/reactos/include/napi/win32.h @@ -31,6 +31,7 @@ typedef struct _W32PROCESS struct _KBDTABLES* KeyboardLayout; struct _WINSTATION_OBJECT* WindowStation; HANDLE hWindowStation; + ULONG Flags; WORD GDIObjects; WORD UserObjects; BOOLEAN CreatedWindowOrDC; diff --git a/reactos/include/win32k/misc.h b/reactos/include/win32k/misc.h index bb52220a0a7..e9660bb6dbe 100644 --- a/reactos/include/win32k/misc.h +++ b/reactos/include/win32k/misc.h @@ -1,6 +1,11 @@ #ifndef __WIN32K_MISC_H #define __WIN32K_MISC_H +/* W32PROCESS flags */ +#define W32PF_NOWINDOWGHOSTING (0x0001) +#define W32PF_MANUALGUICHECK (0x0002) +#define W32PF_CREATEDWINORDC (0x0004) + VOID FASTCALL DestroyThreadWindows(struct _ETHREAD *Thread); diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index 1981ca06743..745e27118da 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -180,6 +180,7 @@ NtUserCallNoParam( #define ONEPARAM_ROUTINE_SETMESSAGEEXTRAINFO 0x0a #define ONEPARAM_ROUTINE_GETCURSORPOSITION 0x0b #define ONEPARAM_ROUTINE_ISWINDOWINDESTROY 0x0c +#define ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING 0x0d DWORD STDCALL NtUserCallOneParam( diff --git a/reactos/lib/user32/include/user32.h b/reactos/lib/user32/include/user32.h index 31fb0905801..eea38430263 100644 --- a/reactos/lib/user32/include/user32.h +++ b/reactos/lib/user32/include/user32.h @@ -95,6 +95,9 @@ void DrawCaret(HWND hWnd, PTHRDCARETINFO CaretInfo); #define NtUserIsWindowInDestroy(hWnd) \ (BOOL)NtUserCallOneParam((DWORD)hWnd, ONEPARAM_ROUTINE_ISWINDOWINDESTROY) +#define NtUserEnableProcessWindowGhosting(bEnable) \ + NtUserCallOneParam((DWORD)bEnable, ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING) + LONG WINAPI RegCloseKey(HKEY); LONG WINAPI RegOpenKeyExW(HKEY,LPCWSTR,DWORD,REGSAM,PHKEY); LONG WINAPI RegQueryValueExW(HKEY,LPCWSTR,LPDWORD,LPDWORD,LPBYTE,LPDWORD); diff --git a/reactos/lib/user32/misc/stubs.c b/reactos/lib/user32/misc/stubs.c index b8e64d5d590..ee758dbb71e 100644 --- a/reactos/lib/user32/misc/stubs.c +++ b/reactos/lib/user32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.62 2004/05/02 17:25:20 weiden Exp $ +/* $Id: stubs.c,v 1.63 2004/05/21 10:09:31 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -648,16 +648,6 @@ DefRawInputProc( return FALSE; } -/* - * @unimplemented - */ -VOID -STDCALL -DisableProcessWindowsGhosting(VOID) -{ - UNIMPLEMENTED; -} - /* * @unimplemented */ diff --git a/reactos/lib/user32/windows/window.c b/reactos/lib/user32/windows/window.c index 80b4d61c99f..49e7404a164 100644 --- a/reactos/lib/user32/windows/window.c +++ b/reactos/lib/user32/windows/window.c @@ -1,4 +1,4 @@ -/* $Id: window.c,v 1.117 2004/05/20 04:10:01 royce Exp $ +/* $Id: window.c,v 1.118 2004/05/21 10:09:31 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -1569,5 +1569,15 @@ IsWindowInDestroy(HWND hWnd) return NtUserIsWindowInDestroy(hWnd); } +/* + * @implemented + */ +VOID +STDCALL +DisableProcessWindowsGhosting(VOID) +{ + NtUserEnableProcessWindowGhosting(FALSE); +} + /* EOF */ diff --git a/reactos/subsys/win32k/main/dllmain.c b/reactos/subsys/win32k/main/dllmain.c index f00b24e5774..17b6b41456c 100644 --- a/reactos/subsys/win32k/main/dllmain.c +++ b/reactos/subsys/win32k/main/dllmain.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: dllmain.c,v 1.73 2004/05/13 19:29:47 jfilby Exp $ +/* $Id: dllmain.c,v 1.74 2004/05/21 10:09:31 weiden Exp $ * * Entry Point for win32k.sys */ @@ -91,9 +91,9 @@ Win32kProcessCallback (struct _EPROCESS *Process, "process.\n"); } } - - Win32Process->CreatedWindowOrDC = FALSE; - Win32Process->ManualGuiCheck = FALSE; + + /* setup process flags */ + Win32Process->Flags = 0; } else { diff --git a/reactos/subsys/win32k/ntuser/guicheck.c b/reactos/subsys/win32k/ntuser/guicheck.c index 71859c1b655..62dafcd5e1a 100644 --- a/reactos/subsys/win32k/ntuser/guicheck.c +++ b/reactos/subsys/win32k/ntuser/guicheck.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: guicheck.c,v 1.18 2004/05/10 17:07:18 weiden Exp $ +/* $Id: guicheck.c,v 1.19 2004/05/21 10:09:31 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -47,12 +47,12 @@ static ULONG NrGuiApplicationsRunning = 0; static BOOL FASTCALL AddGuiApp(PW32PROCESS W32Data) { - W32Data->CreatedWindowOrDC = TRUE; + W32Data->Flags |= W32PF_CREATEDWINORDC; if (0 == NrGuiApplicationsRunning++) { if (! IntInitializeDesktopGraphics()) { - W32Data->CreatedWindowOrDC = FALSE; + W32Data->Flags &= ~W32PF_CREATEDWINORDC; NrGuiApplicationsRunning--; return FALSE; } @@ -64,7 +64,7 @@ AddGuiApp(PW32PROCESS W32Data) static void FASTCALL RemoveGuiApp(PW32PROCESS W32Data) { - W32Data->CreatedWindowOrDC = FALSE; + W32Data->Flags &= ~W32PF_CREATEDWINORDC; if (0 < NrGuiApplicationsRunning) { NrGuiApplicationsRunning--; @@ -83,14 +83,14 @@ IntGraphicsCheck(BOOL Create) W32Data = PsGetWin32Process(); if (Create) { - if (! W32Data->CreatedWindowOrDC && ! W32Data->ManualGuiCheck) + if (! (W32Data->Flags & W32PF_CREATEDWINORDC) && ! (W32Data->Flags & W32PF_MANUALGUICHECK)) { return AddGuiApp(W32Data); } } else { - if (W32Data->CreatedWindowOrDC && ! W32Data->ManualGuiCheck) + if ((W32Data->Flags & W32PF_CREATEDWINORDC) && ! (W32Data->Flags & W32PF_MANUALGUICHECK)) { RemoveGuiApp(W32Data); } @@ -107,18 +107,18 @@ NtUserManualGuiCheck(LONG Check) W32Data = PsGetWin32Process(); if (0 == Check) { - W32Data->ManualGuiCheck = TRUE; + W32Data->Flags |= W32PF_MANUALGUICHECK; } else if (0 < Check) { - if (! W32Data->CreatedWindowOrDC) + if (! (W32Data->Flags & W32PF_CREATEDWINORDC)) { AddGuiApp(W32Data); } } else { - if (W32Data->CreatedWindowOrDC) + if (W32Data->Flags & W32PF_CREATEDWINORDC) { RemoveGuiApp(W32Data); } diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index ac0a1823b51..dbdd734c5f5 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.74 2004/05/19 19:09:20 weiden Exp $ +/* $Id: misc.c,v 1.75 2004/05/21 10:09:31 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -287,6 +287,30 @@ NtUserCallOneParam( IntReleaseWindowObject(WindowObject); return Result; } + + case ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING: + { + BOOL Enable; + PW32PROCESS Process = PsGetWin32Process(); + + if(Process != NULL) + { + Enable = (BOOL)(Param != 0); + + if(Enable) + { + Process->Flags &= ~W32PF_NOWINDOWGHOSTING; + } + else + { + Process->Flags |= W32PF_NOWINDOWGHOSTING; + } + + return TRUE; + } + + return FALSE; + } } DPRINT1("Calling invalid routine number 0x%x in NtUserCallOneParam(), Param=0x%x\n", Routine, Param); From 03de8510c27bfe48c18530fc824b12a0810f3f1b Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Fri, 21 May 2004 10:31:00 +0000 Subject: [PATCH 1183/1463] removed obsolete fields from the W32PROCESS structure svn path=/trunk/; revision=9452 --- reactos/include/napi/win32.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/reactos/include/napi/win32.h b/reactos/include/napi/win32.h index 0dad9f6298d..7c323b65417 100644 --- a/reactos/include/napi/win32.h +++ b/reactos/include/napi/win32.h @@ -34,8 +34,6 @@ typedef struct _W32PROCESS ULONG Flags; WORD GDIObjects; WORD UserObjects; - BOOLEAN CreatedWindowOrDC; - BOOLEAN ManualGuiCheck; } W32PROCESS, *PW32PROCESS; PW32THREAD STDCALL From 08855e847a957f524dd92cacfceea248ae5f73de Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Fri, 21 May 2004 12:46:59 +0000 Subject: [PATCH 1184/1463] don't clip moving rectangles to the work area for topmost windows svn path=/trunk/; revision=9453 --- reactos/lib/user32/windows/defwnd.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/reactos/lib/user32/windows/defwnd.c b/reactos/lib/user32/windows/defwnd.c index 7076467b231..55e99be42e4 100644 --- a/reactos/lib/user32/windows/defwnd.c +++ b/reactos/lib/user32/windows/defwnd.c @@ -1,4 +1,4 @@ -/* $Id: defwnd.c,v 1.138 2004/05/20 14:34:14 weiden Exp $ +/* $Id: defwnd.c,v 1.139 2004/05/21 12:46:59 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -573,8 +573,16 @@ DefWndDoSizeMove(HWND hwnd, WORD wParam) } else { - SystemParametersInfoW(SPI_GETWORKAREA, 0, &clipRect, 0); - mouseRect = clipRect; + if(!(ExStyle & WS_EX_TOPMOST)) + { + SystemParametersInfoW(SPI_GETWORKAREA, 0, &clipRect, 0); + mouseRect = clipRect; + } + else + { + SetRect(&mouseRect, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)); + clipRect = mouseRect; + } } ClipCursor(&clipRect); From d76f0c8745531d2fbe4c7ef5fafcb89f6517abd2 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 21 May 2004 17:05:46 +0000 Subject: [PATCH 1185/1463] - Support for the End-Of-Line RLE mark. - Treat the bitmap header field bV5ClrUsed correctly if it's set to zero. svn path=/trunk/; revision=9454 --- reactos/drivers/dd/bootvid/bootvid.c | 37 ++++++++++++++++++---------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/reactos/drivers/dd/bootvid/bootvid.c b/reactos/drivers/dd/bootvid/bootvid.c index 9bd76b5d29c..bc7b84f2f59 100644 --- a/reactos/drivers/dd/bootvid/bootvid.c +++ b/reactos/drivers/dd/bootvid/bootvid.c @@ -18,7 +18,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: bootvid.c,v 1.8 2004/05/15 22:45:50 hbirr Exp $ + * $Id: bootvid.c,v 1.9 2004/05/21 17:05:46 navaraf Exp $ */ /* INCLUDES ******************************************************************/ @@ -41,14 +41,14 @@ * - Graphics: Data Rotate (Index 3) * Set to zero to indicate that the data written to video memory by * CPU should be processed unmodified. - * - Graphics: Mode Register (index 5) + * - Graphics: Mode Register (Index 5) * Set to Write Mode 2 and Read Mode 0. */ static VGA_REGISTERS Mode12Regs = { /* CRT Controller Registers */ - {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, + {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xDE, 0x1F, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0x8C, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xE3}, /* Attribute Controller Registers */ {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, @@ -327,6 +327,7 @@ InbvDisplayCompressedBitmap() ULONG bfOffBits; ULONG clen; PCHAR ImageData; + UCHAR ClrUsed; bminfo = (PBITMAPV5HEADER) &BootimageBitmap[0]; DPRINT("bV5Size = %d\n", bminfo->bV5Size); @@ -341,9 +342,14 @@ InbvDisplayCompressedBitmap() DPRINT("bV5ClrUsed = %d\n", bminfo->bV5ClrUsed); DPRINT("bV5ClrImportant = %d\n", bminfo->bV5ClrImportant); - bfOffBits = bminfo->bV5Size + bminfo->bV5ClrUsed * sizeof(RGBQUAD); + if (bminfo->bV5ClrUsed) + ClrUsed = bminfo->bV5ClrUsed; + else + ClrUsed = 1 << bminfo->bV5BitCount; + + bfOffBits = bminfo->bV5Size + ClrUsed * sizeof(RGBQUAD); DPRINT("bfOffBits = %d\n", bfOffBits); - DPRINT("size of color indices = %d\n", bminfo->bV5ClrUsed * sizeof(RGBQUAD)); + DPRINT("size of color indices = %d\n", ClrUsed * sizeof(RGBQUAD)); DPRINT("first byte of data = %d\n", BootimageBitmap[bfOffBits]); InbvSetBlackPalette(); @@ -396,6 +402,8 @@ InbvDisplayCompressedBitmap() if (b == 0) { /* End of line */ + cury = k / bminfo->bV5Width; + k = (cury + 1) * bminfo->bV5Width; } else if (b == 1) { @@ -465,6 +473,7 @@ InbvFadeUpPalette() LARGE_INTEGER Interval; FADER_PALETTE_ENTRY FaderPalette[16]; FADER_PALETTE_ENTRY FaderPaletteDelta[16]; + UCHAR ClrUsed; RtlZeroMemory(&FaderPalette, sizeof(FaderPalette)); RtlZeroMemory(&FaderPaletteDelta, sizeof(FaderPaletteDelta)); @@ -472,14 +481,16 @@ InbvFadeUpPalette() bminfo = (PBITMAPV5HEADER)&BootimageBitmap[0]; Palette = (PRGBQUAD)&BootimageBitmap[bminfo->bV5Size]; - for (i = 0; i < 16; i++) + if (bminfo->bV5ClrUsed) + ClrUsed = bminfo->bV5ClrUsed; + else + ClrUsed = 1 << bminfo->bV5BitCount; + + for (i = 0; i < 16 && i < ClrUsed; i++) { - if (i < bminfo->bV5ClrUsed) - { - FaderPaletteDelta[i].r = ((Palette[i].rgbRed << 8) / PALETTE_FADE_STEPS); - FaderPaletteDelta[i].g = ((Palette[i].rgbGreen << 8) / PALETTE_FADE_STEPS); - FaderPaletteDelta[i].b = ((Palette[i].rgbBlue << 8) / PALETTE_FADE_STEPS); - } + FaderPaletteDelta[i].r = ((Palette[i].rgbRed << 8) / PALETTE_FADE_STEPS); + FaderPaletteDelta[i].g = ((Palette[i].rgbGreen << 8) / PALETTE_FADE_STEPS); + FaderPaletteDelta[i].b = ((Palette[i].rgbBlue << 8) / PALETTE_FADE_STEPS); } for (i = 0; i < PALETTE_FADE_STEPS; i++) @@ -488,7 +499,7 @@ InbvFadeUpPalette() READ_PORT_UCHAR(STATUS); WRITE_PORT_UCHAR(ATTRIB, 0x00); - for (c = 0; c < bminfo->bV5ClrUsed; c++) + for (c = 0; c < ClrUsed; c++) { /* Add the delta */ FaderPalette[c].r += FaderPaletteDelta[c].r; From ce81c53f81cf266df9f6435fcf228f2099114487 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 21 May 2004 17:34:24 +0000 Subject: [PATCH 1186/1463] - End-Of-Line marker at the real end of line shouldn't advance the vertical offset. svn path=/trunk/; revision=9455 --- reactos/drivers/dd/bootvid/bootvid.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/reactos/drivers/dd/bootvid/bootvid.c b/reactos/drivers/dd/bootvid/bootvid.c index bc7b84f2f59..04593dafe60 100644 --- a/reactos/drivers/dd/bootvid/bootvid.c +++ b/reactos/drivers/dd/bootvid/bootvid.c @@ -18,7 +18,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: bootvid.c,v 1.9 2004/05/21 17:05:46 navaraf Exp $ + * $Id: bootvid.c,v 1.10 2004/05/21 17:34:24 navaraf Exp $ */ /* INCLUDES ******************************************************************/ @@ -402,8 +402,11 @@ InbvDisplayCompressedBitmap() if (b == 0) { /* End of line */ - cury = k / bminfo->bV5Width; - k = (cury + 1) * bminfo->bV5Width; + if (k % bminfo->bV5Width) + { + cury = k / bminfo->bV5Width; + k = (cury + 1) * bminfo->bV5Width; + } } else if (b == 1) { From 1c9e1c3a8b644c3e46fe285fa964e3eb4f084147 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 21 May 2004 20:06:09 +0000 Subject: [PATCH 1187/1463] - Fixed a bug in IsoSearchDirectoryBufferForFile. Compare the offset first, so we don't access invalid memory. svn path=/trunk/; revision=9456 --- freeldr/freeldr/fs/iso.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/freeldr/freeldr/fs/iso.c b/freeldr/freeldr/fs/iso.c index 635ed45058b..073ef450d3b 100644 --- a/freeldr/freeldr/fs/iso.c +++ b/freeldr/freeldr/fs/iso.c @@ -88,6 +88,9 @@ static BOOL IsoSearchDirectoryBufferForFile(PVOID DirectoryBuffer, U32 Directory Record = (PDIR_RECORD)(DirectoryBuffer + Offset); } + if (Offset >= DirectoryLength) + return FALSE; + if (Record->FileIdLength == 1 && Record->FileId[0] == 0) { DbgPrint((DPRINT_FILESYSTEM, "Name '.'\n")); @@ -115,9 +118,6 @@ static BOOL IsoSearchDirectoryBufferForFile(PVOID DirectoryBuffer, U32 Directory } - if (Offset >= DirectoryLength) - return FALSE; - RtlZeroMemory(Name, 32 * sizeof(UCHAR)); } From 17983ae6be25e32d7701f35dc6e2f20ee4b5d728 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 21 May 2004 20:29:56 +0000 Subject: [PATCH 1188/1463] - Added support for special value "LiveCD" of SystemPath option for loading ReactOS. It uses the known boot drive information as the boot path. svn path=/trunk/; revision=9457 --- freeldr/freeldr/CHANGELOG | 6 +++ freeldr/freeldr/include/version.h | 4 +- freeldr/freeldr/reactos/reactos.c | 87 ++++++++++++++++++------------- 3 files changed, 59 insertions(+), 38 deletions(-) diff --git a/freeldr/freeldr/CHANGELOG b/freeldr/freeldr/CHANGELOG index 0f3e57384c4..36b13baed63 100644 --- a/freeldr/freeldr/CHANGELOG +++ b/freeldr/freeldr/CHANGELOG @@ -1,3 +1,9 @@ +Changes in v1.8.20 (21/05/2004) (navaraf) + +- Added support for special value "LiveCD" of SystemPath option + for loading ReactOS. It uses the known boot drive information + as the boot path. + Changes in v1.8.19 (12/20/2003) (ekohl) - Detect PS/2 Port and Pointer Device (Mouse). diff --git a/freeldr/freeldr/include/version.h b/freeldr/freeldr/include/version.h index fbcc02ce68b..db7358ad37f 100644 --- a/freeldr/freeldr/include/version.h +++ b/freeldr/freeldr/include/version.h @@ -22,7 +22,7 @@ /* just some stuff */ -#define VERSION "FreeLoader v1.8.19" +#define VERSION "FreeLoader v1.8.20" #define COPYRIGHT "Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com>" #define AUTHOR_EMAIL "<brianp@sginet.com>" #define BY_AUTHOR "by Brian Palmer" @@ -36,7 +36,7 @@ // #define FREELOADER_MAJOR_VERSION 1 #define FREELOADER_MINOR_VERSION 8 -#define FREELOADER_PATCH_VERSION 19 +#define FREELOADER_PATCH_VERSION 20 #ifndef ASM diff --git a/freeldr/freeldr/reactos/reactos.c b/freeldr/freeldr/reactos/reactos.c index 1afe15d4176..5d71163923a 100644 --- a/freeldr/freeldr/reactos/reactos.c +++ b/freeldr/freeldr/reactos/reactos.c @@ -515,48 +515,63 @@ LoadAndBootReactOS(PUCHAR OperatingSystemName) } /* - * Verify system path + * Special case for Live CD. */ - if (!DissectArcPath(value, szBootPath, &BootDrive, &BootPartition)) + if (!stricmp(value, "LiveCD")) { - sprintf(MsgBuffer,"Invalid system path: '%s'", value); - UiMessageBox(MsgBuffer); - return; - } + strcpy(szBootPath, "\\reactos"); - /* set boot drive and partition */ + /* Set kernel command line */ + sprintf(multiboot_kernel_cmdline, + "multi(0)disk(0)cdrom(%u)\\reactos", + (unsigned int)BootDrive); + } + else + { + /* + * Verify system path + */ + if (!DissectArcPath(value, szBootPath, &BootDrive, &BootPartition)) + { + sprintf(MsgBuffer,"Invalid system path: '%s'", value); + UiMessageBox(MsgBuffer); + return; + } + + /* recalculate the boot partition for freeldr */ + i = 0; + rosPartition = 0; + while (1) + { + if (!DiskGetPartitionEntry(BootDrive, ++i, &PartitionTableEntry)) + { + BootPartition = 0; + break; + } + if (IsRecognizedPartition(PartitionTableEntry.SystemIndicator)) + { + if (++rosPartition == BootPartition) + { + BootPartition = i; + break; + } + } + } + if (BootPartition == 0) + { + sprintf(MsgBuffer,"Invalid system path: '%s'", value); + UiMessageBox(MsgBuffer); + return; + } + + /* copy ARC path into kernel command line */ + strcpy(multiboot_kernel_cmdline, value); + } + + /* Set boot drive and partition */ ((char *)(&mb_info.boot_device))[0] = (char)BootDrive; ((char *)(&mb_info.boot_device))[1] = (char)BootPartition; - /* recalculate the boot partition for freeldr */ - i = 0; - rosPartition = 0; - while (1) - { - if (!DiskGetPartitionEntry(BootDrive, ++i, &PartitionTableEntry)) - { - BootPartition = 0; - break; - } - if (IsRecognizedPartition(PartitionTableEntry.SystemIndicator)) - { - if (++rosPartition == BootPartition) - { - BootPartition = i; - break; - } - } - } - if (BootPartition == 0) - { - sprintf(MsgBuffer,"Invalid system path: '%s'", value); - UiMessageBox(MsgBuffer); - return; - } - - /* copy ARC path into kernel command line */ - strcpy(multiboot_kernel_cmdline, value); - /* * Read the optional kernel parameters (if any) */ From 6f17d958c6f2ceb1c40e931359b102a0cf83bf5f Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Sat, 22 May 2004 01:55:31 +0000 Subject: [PATCH 1189/1463] Blight pointed out that I was missing some regs from the end of the trap frame. These are now fixed. svn path=/trunk/; revision=9458 --- reactos/lib/kjs/kjsinit.js | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/reactos/lib/kjs/kjsinit.js b/reactos/lib/kjs/kjsinit.js index ccf2e852593..a961b4042f3 100644 --- a/reactos/lib/kjs/kjsinit.js +++ b/reactos/lib/kjs/kjsinit.js @@ -1,7 +1,7 @@ function write(x) { System.print(x); }' function regs(n) { return System.regs(n); } -function ebp() { return regs(0); } -function eip() { return regs(1); } +function debugebp() { return regs(0); } +function debugeip() { return regs(1); } function tf_argmark() { return regs(2); } function tf_pointer() { return regs(3); } function tf_tempcs() { return regs(4); } @@ -22,14 +22,19 @@ function tf_pmode() { return regs(18); } function tf_exl() { return regs(19); } function fs() { return regs(20) & 0xffff; } function edi() { return regs(21); } -function cs() { return regs(22) & 0xffff; } -function eflags() { return regs(23); } -function esp() { return regs(24); } -function ss() { return regs(25) & 0xffff; } -function v86_es() { return regs(26) & 0xffff; } -function v86_ds() { return regs(27) & 0xffff; } -function v86_fs() { return regs(28) & 0xffff; } -function v86_gs() { return regs(29) & 0xffff; } +function esi() { return regs(22); } +function ebx() { return regs(23); } +function ebp() { return regs(24); } +function error_code() { return regs(25); } +function eip() { return regs(26); } +function cs() { return regs(27) & 0xffff; } +function eflags() { return regs(28); } +function esp() { return regs(29); } +function ss() { return regs(30) & 0xffff; } +function v86_es() { return regs(31) & 0xffff; } +function v86_ds() { return regs(32) & 0xffff; } +function v86_fs() { return regs(33) & 0xffff; } +function v86_gs() { return regs(34) & 0xffff; } function peekl(a) { return System.mread(4,a); } function pokel(a,b) { return System.mwrite(4,a,b); } function peekw(a) { return System.mread(2,a); } From 7f1e933e8ead807c401ede5a665003be55d04b0d Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Sat, 22 May 2004 02:50:25 +0000 Subject: [PATCH 1190/1463] Blight pointed out that we didn't have all the registers in js. This fixes that. svn path=/trunk/; revision=9459 --- reactos/bootdata/hivesys.inf | 44 ++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/reactos/bootdata/hivesys.inf b/reactos/bootdata/hivesys.inf index 5deb2c7c880..b7073994e54 100644 --- a/reactos/bootdata/hivesys.inf +++ b/reactos/bootdata/hivesys.inf @@ -623,9 +623,9 @@ HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","1",0x00010000,\ HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","2",0x00010000,\ "function regs(n) { return System.regs(n); }" HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","3",0x00010000,\ -"function ebp() { return regs(0); }" +"function debugebp() { return regs(0); }" HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","4",0x00010000,\ -"function eip() { return regs(1); }" +"function debugeip() { return regs(1); }" HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","5",0x00010000,\ "function tf_argmark() { return regs(2); }" HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","6",0x00010000,\ @@ -667,36 +667,46 @@ HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","23",0x00010000,\ HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","24",0x00010000,\ "function edi() { return regs(21); }" HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","25",0x00010000,\ -"function cs() { return regs(22) & 0xffff; }" +"function esi() { return regs(22); }" HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","26",0x00010000,\ -"function eflags() { return regs(23); }" +"function ebx() { return regs(23); }" HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","27",0x00010000,\ -"function esp() { return regs(24); }" +"function ebp() { return regs(24); }" HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","28",0x00010000,\ -"function ss() { return regs(25) & 0xffff; }" +"function error_code() { return regs(25); }" HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","29",0x00010000,\ -"function v86_es() { return regs(26) & 0xffff; }" +"function eip() { return regs(26); }" HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","30",0x00010000,\ -"function v86_ds() { return regs(27) & 0xffff; }" +"function cs() { return regs(27) & 0xffff; }" HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","31",0x00010000,\ -"function v86_fs() { return regs(28) & 0xffff; }" +"function eflags() { return regs(28); }" HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","32",0x00010000,\ -"function v86_gs() { return regs(29) & 0xffff; }" +"function esp() { return regs(29); }" HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","33",0x00010000,\ -"function peekl(a) { return System.mread(4,a); }" +"function ss() { return regs(30) & 0xffff; }" HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","34",0x00010000,\ -"function pokel(a,b) { return System.mwrite(4,a,b); }" +"function v86_es() { return regs(31) & 0xffff; }" HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","35",0x00010000,\ -"function peekw(a) { return System.mread(2,a); }" +"function v86_ds() { return regs(32) & 0xffff; }" HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","36",0x00010000,\ -"function pokew(a,b) { return System.mwrite(2,a,b); }" +"function v86_fs() { return regs(33) & 0xffff; }" HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","37",0x00010000,\ -"function peek(a) { return System.mread(1,a); }" +"function v86_gs() { return regs(34) & 0xffff; }" HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","38",0x00010000,\ -"function poke(a,b) { return System.mwrite(1,a,b); }" +"function peekl(a) { return System.mread(4,a); }" HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","39",0x00010000,\ -"function regread(x,y) { return System.regread(x,y); }" +"function pokel(a,b) { return System.mwrite(4,a,b); }" HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","40",0x00010000,\ +"function peekw(a) { return System.mread(2,a); }" +HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","41",0x00010000,\ +"function pokew(a,b) { return System.mwrite(2,a,b); }" +HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","42",0x00010000,\ +"function peek(a) { return System.mread(1,a); }" +HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","43",0x00010000,\ +"function poke(a,b) { return System.mwrite(1,a,b); }" +HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","44",0x00010000,\ +"function regread(x,y) { return System.regread(x,y); }" +HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","45",0x00010000,\ "write('JS Registry Init Complete. Welcome to ReactOS kernel scripting');" ; EOF From a31ff7a76bdf1e6c3d3670c4ce4e88a9f2adbe16 Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Sat, 22 May 2004 02:54:32 +0000 Subject: [PATCH 1191/1463] I forgot to increase the number of strings loaded from the registry. fixed. svn path=/trunk/; revision=9460 --- reactos/bootdata/hivesys.inf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/bootdata/hivesys.inf b/reactos/bootdata/hivesys.inf index b7073994e54..a8f97669710 100644 --- a/reactos/bootdata/hivesys.inf +++ b/reactos/bootdata/hivesys.inf @@ -616,7 +616,7 @@ HKLM,"SYSTEM\Setup","SystemSetupInProgress",0x00010001,0x00000000 ; ----------------------------- KJS Init ---------------------------- HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","kjsinit",0x00010000,\ -"function init(v) { var rk = '\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Kdb'; eval(System.regread(rk,v)); } for( i = 1; i <= 40; i++ ) { init((new Number(i)).toString()); }" +"function init(v) { var rk = '\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Kdb'; eval(System.regread(rk,v)); } for( i = 1; i <= 45; i++ ) { init((new Number(i)).toString()); }" HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","1",0x00010000,\ "function write(x) { System.print(x); }" From a4931b6ee8ab6efb72b086cad1a7550756dda819 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sat, 22 May 2004 08:12:49 +0000 Subject: [PATCH 1192/1463] - removed an obsolete call to ExAllocatePool in CHECKPOINT svn path=/trunk/; revision=9461 --- reactos/ntoskrnl/include/internal/debug.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/include/internal/debug.h b/reactos/ntoskrnl/include/internal/debug.h index d73bc67948b..41df21f0b56 100644 --- a/reactos/ntoskrnl/include/internal/debug.h +++ b/reactos/ntoskrnl/include/internal/debug.h @@ -99,7 +99,7 @@ #else #define DPRINT DbgPrint("(%s:%d) ",__FILE__,__LINE__); DbgPrint #endif -#define CHECKPOINT do { DbgPrint("%s:%d\n",__FILE__,__LINE__); ExAllocatePool(NonPagedPool,0); } while(0) +#define CHECKPOINT do { DbgPrint("%s:%d\n",__FILE__,__LINE__); } while(0) #else /* NDEBUG */ #ifdef __GNUC__ /* using GNU C/C99 macro ellipsis */ #define DPRINT(args...) From 4c8d47cc6bfad27eb7e801e1628100f5f312f39b Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sat, 22 May 2004 08:27:15 +0000 Subject: [PATCH 1193/1463] fixed SendMessageTimeout() to return the correct result even when it timed out svn path=/trunk/; revision=9462 --- reactos/subsys/win32k/ntuser/message.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/message.c b/reactos/subsys/win32k/ntuser/message.c index b8e62dbf91d..5d70c50f7ba 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.66 2004/05/16 18:33:40 weiden Exp $ +/* $Id: message.c,v 1.67 2004/05/22 08:27:15 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -38,7 +38,6 @@ typedef struct { UINT uFlags; UINT uTimeout; - ULONG_PTR uResult; } DOSENDMESSAGE, *PDOSENDMESSAGE; /* FUNCTIONS *****************************************************************/ @@ -1216,6 +1215,8 @@ IntSendMessageTimeoutSingle(HWND hWnd, if(Status == STATUS_TIMEOUT) { IntReleaseWindowObject(Window); + if(uResult) + *uResult = Result; SetLastWin32Error(ERROR_TIMEOUT); return FALSE; } @@ -1406,7 +1407,7 @@ IntDoSendMessage(HWND Wnd, { Result = IntSendMessageTimeout(KernelModeMsg.hwnd, KernelModeMsg.message, KernelModeMsg.wParam, KernelModeMsg.lParam, - dsm->uFlags, dsm->uTimeout, &dsm->uResult); + dsm->uFlags, dsm->uTimeout, &Result); } Status = CopyMsgToUserMem(&UserModeMsg, &KernelModeMsg); if (! NT_SUCCESS(Status)) @@ -1446,7 +1447,7 @@ NtUserSendMessageTimeout(HWND hWnd, { NTSTATUS Status; - Status = MmCopyToCaller(uResult, &dsm.uResult, sizeof(ULONG_PTR)); + Status = MmCopyToCaller(uResult, &Result, sizeof(ULONG_PTR)); if(!NT_SUCCESS(Status)) { SetLastWin32Error(ERROR_INVALID_PARAMETER); From 1c1f4e3945c7c78ef6713e35d5d9932105f66410 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 22 May 2004 08:35:38 +0000 Subject: [PATCH 1194/1463] - Don't delete icons that we got by WM_GETICON or GetClassIcon. svn path=/trunk/; revision=9463 --- reactos/subsys/system/explorer/taskbar/taskbar.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/system/explorer/taskbar/taskbar.cpp b/reactos/subsys/system/explorer/taskbar/taskbar.cpp index 61d8a1a032e..dc0b214dfe3 100644 --- a/reactos/subsys/system/explorer/taskbar/taskbar.cpp +++ b/reactos/subsys/system/explorer/taskbar/taskbar.cpp @@ -319,13 +319,18 @@ BOOL CALLBACK TaskBar::EnumWndProc(HWND hwnd, LPARAM lparam) } else { HBITMAP hbmp; HICON hIcon = get_window_icon_small(hwnd); + BOOL delete_icon = FALSE; if (!hIcon) + { hIcon = LoadIcon(0, IDI_APPLICATION); + delete_icon = TRUE; + } if (hIcon) { hbmp = create_bitmap_from_icon(hIcon, GetSysColorBrush(COLOR_BTNFACE), WindowCanvas(pThis->_htoolbar)); - DestroyIcon(hIcon); // some icons can be freed, some not - so ignore any error return of DestroyIcon() + if (delete_icon) + DestroyIcon(hIcon); // some icons can be freed, some not - so ignore any error return of DestroyIcon() } else hbmp = 0; From ed16c950dca80074461b9f0a132a1ae4f9a1aec8 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 22 May 2004 08:53:26 +0000 Subject: [PATCH 1195/1463] - Check buffer sizes and color counts for IOCTL_VIDEO_SET_COLOR_REGISTERS request. svn path=/trunk/; revision=9464 --- reactos/drivers/video/miniport/vbe/vbemp.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/reactos/drivers/video/miniport/vbe/vbemp.c b/reactos/drivers/video/miniport/vbe/vbemp.c index 44ab1191fc6..627e5228e70 100644 --- a/reactos/drivers/video/miniport/vbe/vbemp.c +++ b/reactos/drivers/video/miniport/vbe/vbemp.c @@ -473,9 +473,14 @@ VBEStartIO( break; case IOCTL_VIDEO_SET_COLOR_REGISTERS: - /* - * FIXME: Check buffer size! - */ + if (RequestPacket->InputBufferLength < sizeof(VIDEO_CLUT) || + RequestPacket->InputBufferLength < + (((PVIDEO_CLUT)RequestPacket->InputBuffer)->NumEntries * sizeof(ULONG)) + + sizeof(VIDEO_CLUT)) + { + RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER; + return TRUE; + } Result = VBESetColorRegisters( (PVBE_DEVICE_EXTENSION)HwDeviceExtension, (PVIDEO_CLUT)RequestPacket->InputBuffer, @@ -797,6 +802,9 @@ VBESetColorRegisters( ULONG Entry; PULONG OutputEntry; + if (ColorLookUpTable->NumEntries + ColorLookUpTable->FirstEntry > 256) + return FALSE; + if (DeviceExtension->VGACompatible) { for (Entry = ColorLookUpTable->FirstEntry; From 1404258b13c64f73eb340b9cecdd92e3453519bc Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 22 May 2004 09:10:33 +0000 Subject: [PATCH 1196/1463] - Remove WinLogon icon, because it's copyrighted by Microsoft. svn path=/trunk/; revision=9465 --- .../system/winlogon/resources/winlogon.ico | Bin 10278 -> 0 bytes reactos/subsys/system/winlogon/winlogon.rc | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 reactos/subsys/system/winlogon/resources/winlogon.ico diff --git a/reactos/subsys/system/winlogon/resources/winlogon.ico b/reactos/subsys/system/winlogon/resources/winlogon.ico deleted file mode 100644 index 283fe4e087bfd21e572c8487cd2aa953c126f721..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10278 zcmeI2PiP#;6^EZJWv4?-WGmpy3|P@2v2V`y$$Rn|Uq$xfv-je@4VVzn91QA{H8%x? z82XZ3M6x15x%jNZEQB25-rQ_oVi*u)!8EK4JF8(6w(`AK-90@$J)_vk=CXP-)z$Ut z{rUB)>Z&&-i7d%Gvc7(adPQVeBodKJmwfxy5^Z=lZuoZmj>sp7t*;C6feZqXpZq}k z^Y#x#{_!K#_wD$5$Zv>T!zL<ni(-DL<$_+CC>G%>aqKIu+{$1upw<p&UvW<FD14Nq zm$|gFwH1qS&8ZK?vWt?Z9p`#|3C2O(x3Bi7Ks;WxZ$Nt-OVIbt)z}*dPJ6k{-uCHk zPlD55{B&#Ufx-yXL2#=6dMdnw{k-ilSUY#G)tG)!$((kyU7>zY8%1xwAM9v**Bir0 zZ1TI?xyfFv-Lm`3J4Qb*+7D8r|6TiUHGB1T-Jijd(!T|#-`_3pO`gXDHSk76->4YF z?Ytcn5ur^GuTr%TWY)?O_cEXiCuNEIvYc@LuSr?ve)UbuH|Q|)R$VMtannfG;POh? zJ5bF3xKUD>^zeP_`5&OGRLmcc**qWj9|SEW<|!{ytn)>K*<)Ur4)aOpYcF8lewn7d zn08rbdHc>C<1-{$n*ptL6k>75@4f3jeScHrBY654AIV_pXOu5wxFmOmOJB-xnfvAU z-W@K#zd2--hReT|6Y8;!+8omO-JpC(DdV?7qmknOE`E(Rr<gY7@KSjhi%F<;<)yUA z-0Kr&rg>ahZ*)qJS#+G+LZN(#y}VzRdi^*!9j{J4&g9*x8rqKC<TF+~HXu_9;=G|# zpjH)j{DP!_rWPce<6&#p>H1ZJwCzrN#t%+6SmBIR%tFBvW9W|s-(sOYVAma3AQtld zvrMjIZ)YafJ2_vCRjIG*D&&zF7P|!b`{0-4{1Jc?`*pPrw3n~1@V6&mh=N8<DL8%L zS5~`D@%@UY*FT^0Eg1h<9Q@8P8@D&*o682je&F=FQXQ9aF6d2Ve4F|8m$;Y@5=_Z& zmHbN9VGiN~Ms0?|XQF*0+kW|y)m*Mv7j;KdA}1>-&Tj^JJ<RKqydLK@dzuk@)uhIb zwHs>oGxOsHc^xmP!NuOk4*377f3x(~{suYDq1FR&8mQG3aT=(r7r8XkHQ4KvTNKTE zjoxDa8T@@9Cx87!R#sLd2m-ly@uFP5d|9qsxgwoTM>aM#<ofmNa`*0C+1%We+qZAa z&6_tRe(2<b51jm3o{P&;`OEV!<oV~H%dh_MC!mCsh>}oJ-wfe}@IrW@@)%JSiQq@v zMDQc{5qwok;3x1C8VURaK9!{KQ}`+T6h;c)(RQ?5YMw)`A;v=tg(!vO<K~`A2!;?0 zAs9k17$h)+U<knwf*}Nh!30AHh7b%P7(y@@bTEWq2*D77Ap}F{;DI9qN2oZ+{Xu0Y zBCZiwBCteYu}20=g!2eT5k@1hSQzMxxQW0LfyKfCjtCqPI3jRF;IL4EBLYJNh6oHA zx(FN*7$PvF_Ddx7A;gdW(6;bubU=mg1UU;ez7sGdI8AVnfGNRuLT7^S1m6k1Z8*#~ zeEcW)Pw=lpl;A%hHVGIKFeJo5hmEM%)5D?Ws>4VOQv9W0OTm%i&xTfU5Q7vPsp8<l zY`9TM!IFX{1w@KNn*v}-QA`nHjitcX>7rN|lN2ne#>24aY|v4F2L=ZQ2L=ZQ2L=ZQ zn@(Uz!QjB)z>tCgGZf^(;K1O(;J|=s3Vbj)FgP$c066@o7;`8(gd%K2v?Fjhv#m0b z{8)Z3_wL;j)?#_|=#e~r{8*koeJW3$JdqbKUdYRrFXj07SYEw)C9hw<mhpHjC;xQv zyN^E>l4hc-?|@d=vzFS`rnVN-UPJd<#+%>CtY@!*);gNAcQTdOYtPbJOL>LBs3lqb zJ5s6$v|GY=)R8t{6)pr6!yXnU0^D~bD`*}@wb05&tu-&uZXX>T8R$+Yf8sSG>*gUY zT)5yR^ucrLcDuft{)Z1Q<R%dCA<3%!vq2b*D*fEfQmeF|yP2-K-B#gW)K{GZfkGqu zN*`{DFg~%LeN_iI?VSGoDQeI3-#<7w*e^c&&HWRR#{NV4y-1_};eiR5lLr06&z^l& z2sG+H8$By6yp6v1zi*G(pntzgv;D=a@pZkw9{yUtWNn-Al}lC*z72BLo*G>m{{1Xw zz~q%EfmoNGKX9WnMYFZ3^9M~eNHdn|h1{$-gZNg@A8z3PLj_gjFW;xpNb%g?&*%Az zrd8+p%X$7nj`1DLUmBN-`OL{Cn#+`{W#dgZvs6fP0yI^HoMJw8k@mfoMW{knS<+{2 zyIHF}@>_%DQz&G4duGE>Mz^v}SbpUdG(T!CU7tvqV^#2o<_N2iDqIv)ULiGGuPco5 zgk`b9RG`)V84vA~LH0YIqDXkM(NT+hEvIroG;JmF_RywK$ny+Gn&P$dk1Do~%3hxf zRuV#e=C8jd<?|mZQz)UgI-RvH9}nN2ptP+j5Eneyr*qUHl&VmXFKidJYE%?D-J1QG z$x~x6KP&dh{m!7hDf=a`c{kmzDpY!#Qqqb`0H9EnU-aT=wy6qJ@{O;6XCiM3HThad z%BE&plVsQ{>5F!sQ;!B3&6S_Zk;}#cd7thUX|u2Q=gVvEnNyi-A1stF#C>f_XUeOO z+>a?N!c(ztDkv<rpC|dH9t!jA*M%+jULc=at*R}wf4~odn($)$DqdAEK#TAn9-2a_ zb4GmpkC;;024cbU9v<?e1`nS6xGju--9B&@$A22Xi7&uo(V4(8@kRElKba=?bK^Pp zji2-WzKJ|b`h02^+k0g};Wt^ivCQ14LRHr8Gh6s|@t-9WX5<@wvz0pxHzt36{!SRa z&2#)gZhx59cK*)UnVrAGn?rj3eu=V9DSyB6cZ+6<&wsyi)*7ClzuW2e`T09%;@`dV z_u2-~wIjUzG+LJpwx_Imp3WA)FO)rL=N~=KW>eTJKlv6k*_^zGGBa0osMyCc_8Z?` zA+6bO6+2SaUU>$i+U6wnpwhOjyVACOw`_A<@2PyiVi&`kJEnZ9Zau|R1J=o5wQw@& N|L<l}pY{JY{|34uZ#w`0 diff --git a/reactos/subsys/system/winlogon/winlogon.rc b/reactos/subsys/system/winlogon/winlogon.rc index af7428d94d0..dcbfeba0ddd 100644 --- a/reactos/subsys/system/winlogon/winlogon.rc +++ b/reactos/subsys/system/winlogon/winlogon.rc @@ -37,7 +37,7 @@ BEGIN END END -IDI_WINLOGON ICON "resources/winlogon.ico" +/* IDI_WINLOGON ICON "resources/winlogon.ico" */ IDD_SHUTDOWNCOMPUTER DIALOG 45, 22, 164, 52 STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU From dd55a5076183306c63ef45b45db59d6022da5308 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sat, 22 May 2004 09:22:41 +0000 Subject: [PATCH 1197/1463] 1. reverted my last change to SendMessageTimeout() which was wrong 2. fixed UserGetWindowIcon(), SendMessageTimeout() usually overwrites the result variable, even if it failed! svn path=/trunk/; revision=9466 --- reactos/lib/user32/windows/nonclient.c | 45 +++++++++++++++++--------- reactos/subsys/win32k/ntuser/message.c | 45 +++++++++++++------------- 2 files changed, 52 insertions(+), 38 deletions(-) diff --git a/reactos/lib/user32/windows/nonclient.c b/reactos/lib/user32/windows/nonclient.c index e456da3264a..bdd841fdf16 100644 --- a/reactos/lib/user32/windows/nonclient.c +++ b/reactos/lib/user32/windows/nonclient.c @@ -147,23 +147,38 @@ UserHasMenu(HWND hWnd, ULONG Style) HICON UserGetWindowIcon(HWND hwnd) { - HICON Ret = 0; + HICON Ret; - SendMessageTimeoutW(hwnd, WM_GETICON, ICON_SMALL2, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&Ret); - if (!Ret) - SendMessageTimeoutW(hwnd, WM_GETICON, ICON_SMALL, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&Ret); - if (!Ret) - SendMessageTimeoutW(hwnd, WM_GETICON, ICON_BIG, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&Ret); - if (!Ret) - Ret = (HICON)GetClassLongW(hwnd, GCL_HICONSM); - if (!Ret) - Ret = (HICON)GetClassLongW(hwnd, GCL_HICON); - if (!Ret) - SendMessageTimeoutW(hwnd, WM_QUERYDRAGICON, 0, 0, 0, 1000, (LPDWORD)&Ret); - if (!Ret) - Ret = LoadIconW(0, IDI_APPLICATION); + 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 Ret; + return NULL; } BOOL diff --git a/reactos/subsys/win32k/ntuser/message.c b/reactos/subsys/win32k/ntuser/message.c index 5d70c50f7ba..66fb98ad808 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.67 2004/05/22 08:27:15 weiden Exp $ +/* $Id: message.c,v 1.68 2004/05/22 09:22:41 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -38,6 +38,7 @@ typedef struct { UINT uFlags; UINT uTimeout; + ULONG_PTR Result; } DOSENDMESSAGE, *PDOSENDMESSAGE; /* FUNCTIONS *****************************************************************/ @@ -1116,10 +1117,10 @@ IntSendMessage(HWND hWnd, WPARAM wParam, LPARAM lParam) { - LRESULT Result = 0; + ULONG_PTR Result = 0; if(IntSendMessageTimeout(hWnd, Msg, wParam, lParam, SMTO_NORMAL, 0, &Result)) { - return Result; + return (LRESULT)Result; } return 0; } @@ -1133,7 +1134,7 @@ IntSendMessageTimeoutSingle(HWND hWnd, UINT uTimeout, ULONG_PTR *uResult) { - LRESULT Result; + ULONG_PTR Result; NTSTATUS Status; PWINDOW_OBJECT Window; PMSGMEMORY MsgMemoryEntry; @@ -1180,26 +1181,28 @@ IntSendMessageTimeoutSingle(HWND hWnd, } if (0xFFFF0000 != ((DWORD) Window->WndProcW & 0xFFFF0000)) { - Result = IntCallWindowProc(Window->WndProcW, FALSE, hWnd, Msg, wParam, - lParamPacked,lParamBufferSize); + Result = (ULONG_PTR)IntCallWindowProc(Window->WndProcW, FALSE, hWnd, Msg, wParam, + lParamPacked,lParamBufferSize); } else { - Result = IntCallWindowProc(Window->WndProcA, TRUE, hWnd, Msg, wParam, - lParamPacked,lParamBufferSize); + Result = (ULONG_PTR)IntCallWindowProc(Window->WndProcA, TRUE, hWnd, Msg, wParam, + lParamPacked,lParamBufferSize); } + + if(uResult) + { + *uResult = Result; + } + if (! NT_SUCCESS(UnpackParam(lParamPacked, Msg, wParam, lParam))) { IntReleaseWindowObject(Window); DPRINT1("Failed to unpack message parameters\n"); - if(uResult) - *uResult = Result; return TRUE; } IntReleaseWindowObject(Window); - if(uResult) - *uResult = Result; return TRUE; } @@ -1211,19 +1214,15 @@ IntSendMessageTimeoutSingle(HWND hWnd, } Status = MsqSendMessage(Window->MessageQueue, hWnd, Msg, wParam, lParam, - uTimeout, (uFlags & SMTO_BLOCK), &Result); + uTimeout, (uFlags & SMTO_BLOCK), uResult); if(Status == STATUS_TIMEOUT) { IntReleaseWindowObject(Window); - if(uResult) - *uResult = Result; SetLastWin32Error(ERROR_TIMEOUT); return FALSE; } IntReleaseWindowObject(Window); - if(uResult) - *uResult = Result; return TRUE; } @@ -1278,7 +1277,7 @@ IntPostOrSendMessage(HWND hWnd, WPARAM wParam, LPARAM lParam) { - LRESULT Result; + ULONG_PTR Result; PWINDOW_OBJECT Window; if(hWnd == HWND_BROADCAST) @@ -1307,7 +1306,7 @@ IntPostOrSendMessage(HWND hWnd, IntReleaseWindowObject(Window); - return Result; + return (LRESULT)Result; } LRESULT FASTCALL @@ -1407,7 +1406,7 @@ IntDoSendMessage(HWND Wnd, { Result = IntSendMessageTimeout(KernelModeMsg.hwnd, KernelModeMsg.message, KernelModeMsg.wParam, KernelModeMsg.lParam, - dsm->uFlags, dsm->uTimeout, &Result); + dsm->uFlags, dsm->uTimeout, &dsm->Result); } Status = CopyMsgToUserMem(&UserModeMsg, &KernelModeMsg); if (! NT_SUCCESS(Status)) @@ -1424,7 +1423,7 @@ IntDoSendMessage(HWND Wnd, SetLastWin32Error(ERROR_INVALID_PARAMETER); } - return Result; + return (LRESULT)Result; } LRESULT STDCALL @@ -1443,11 +1442,11 @@ NtUserSendMessageTimeout(HWND hWnd, dsm.uFlags = uFlags; dsm.uTimeout = uTimeout; Result = IntDoSendMessage(hWnd, Msg, wParam, lParam, &dsm, UnsafeInfo); - if(uResult) + if(uResult != NULL && Result != 0) { NTSTATUS Status; - Status = MmCopyToCaller(uResult, &Result, sizeof(ULONG_PTR)); + Status = MmCopyToCaller(uResult, &dsm.Result, sizeof(ULONG_PTR)); if(!NT_SUCCESS(Status)) { SetLastWin32Error(ERROR_INVALID_PARAMETER); From a197c442b7b8407cb08140a83088a8a500071594 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Sat, 22 May 2004 12:04:10 +0000 Subject: [PATCH 1198/1463] Center install wizard. Don't skip to next page as long as required data have not been entered. svn path=/trunk/; revision=9467 --- reactos/lib/syssetup/wizard.c | 82 ++++++++++++++++++++++++----------- 1 file changed, 57 insertions(+), 25 deletions(-) diff --git a/reactos/lib/syssetup/wizard.c b/reactos/lib/syssetup/wizard.c index f3b75c9778b..1cab53d1a37 100644 --- a/reactos/lib/syssetup/wizard.c +++ b/reactos/lib/syssetup/wizard.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: wizard.c,v 1.2 2004/04/19 10:54:23 ekohl Exp $ +/* $Id: wizard.c,v 1.3 2004/05/22 12:04:10 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -46,6 +46,29 @@ static SETUPDATA SetupData; /* FUNCTIONS ****************************************************************/ +static VOID +CenterWindow(HWND hWnd) +{ + HWND hWndParent; + RECT rcParent; + RECT rcWindow; + + hWndParent = GetParent(hWnd); + if (hWndParent == NULL) + hWndParent = GetDesktopWindow(); + + GetWindowRect(hWndParent, &rcParent); + GetWindowRect(hWnd, &rcWindow); + + SetWindowPos(hWnd, + HWND_TOP, + ((rcParent.right - rcParent.left) - (rcWindow.right - rcWindow.left)) / 2, + ((rcParent.bottom - rcParent.top) - (rcWindow.bottom - rcWindow.top)) / 2, + 0, + 0, + SWP_NOSIZE); +} + BOOL CALLBACK WelcomeDlgProc(HWND hwndDlg, @@ -60,8 +83,12 @@ WelcomeDlgProc(HWND hwndDlg, HWND hwndControl; DWORD dwStyle; - /* Hide the system menu */ hwndControl = GetParent(hwndDlg); + + /* Center the wizard window */ + CenterWindow (hwndControl); + + /* Hide the system menu */ dwStyle = GetWindowLong(hwndControl, GWL_STYLE); SetWindowLong(hwndControl, GWL_STYLE, dwStyle & ~WS_SYSMENU); @@ -73,7 +100,7 @@ WelcomeDlgProc(HWND hwndDlg, break; - case WM_NOTIFY: + case WM_NOTIFY: { LPNMHDR lpnm = (LPNMHDR)lParam; @@ -90,10 +117,11 @@ WelcomeDlgProc(HWND hwndDlg, } break; - default: + default: break; } - return FALSE; + + return FALSE; } @@ -122,7 +150,7 @@ OwnerPageDlgProc(HWND hwndDlg, break; - case WM_NOTIFY: + case WM_NOTIFY: { LPNMHDR lpnm = (LPNMHDR)lParam; @@ -140,7 +168,8 @@ OwnerPageDlgProc(HWND hwndDlg, _T("Setup cannot continue until you enter your name."), _T("ReactOS Setup"), MB_ICONERROR | MB_OK); - return -1; + SetWindowLong(hwndDlg, DWL_MSGRESULT, -1); + return TRUE; } GetDlgItemText(hwndDlg, IDC_OWNERORGANIZATION, SetupData->OwnerOrganization, 50); break; @@ -151,11 +180,11 @@ OwnerPageDlgProc(HWND hwndDlg, } break; - default: + default: break; } - return 0; + return FALSE; } @@ -197,7 +226,7 @@ ComputerPageDlgProc(HWND hwndDlg, break; - case WM_NOTIFY: + case WM_NOTIFY: { LPNMHDR lpnm = (LPNMHDR)lParam; @@ -215,7 +244,8 @@ ComputerPageDlgProc(HWND hwndDlg, _T("Setup cannot continue until you enter the name of your computer."), _T("ReactOS Setup"), MB_ICONERROR | MB_OK); - return -1; + SetWindowLong(hwndDlg, DWL_MSGRESULT, -1); + return TRUE; } /* FIXME: check computer name for invalid characters */ @@ -230,7 +260,8 @@ ComputerPageDlgProc(HWND hwndDlg, "the desired password again."), _T("ReactOS Setup"), MB_ICONERROR | MB_OK); - return -1; + SetWindowLong(hwndDlg, DWL_MSGRESULT, -1); + return TRUE; } /* FIXME: check password for invalid characters */ @@ -244,9 +275,10 @@ ComputerPageDlgProc(HWND hwndDlg, } break; - default: + default: break; } + return FALSE; } @@ -258,41 +290,41 @@ FinishDlgProc(HWND hwndDlg, LPARAM lParam) { - switch (uMsg) + switch (uMsg) { - case WM_INITDIALOG: + case WM_INITDIALOG: break; - case WM_NOTIFY: + case WM_NOTIFY: { LPNMHDR lpnm = (LPNMHDR)lParam; - switch (lpnm->code) + switch (lpnm->code) { - case PSN_SETACTIVE: + case PSN_SETACTIVE: /* Enable the correct buttons on for the active page */ PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_FINISH); break; - case PSN_WIZBACK: + case PSN_WIZBACK: /* Handle a Back button click, if necessary */ break; - case PSN_WIZFINISH: + case PSN_WIZFINISH: /* Handle a Finish button click, if necessary */ break; - default: + default: break; } } - break; + break; - default: + default: break; } - return 0; + return FALSE; } @@ -353,7 +385,7 @@ InstallWizard (VOID) // psh.pszbmHeader = MAKEINTRESOURCE(IDB_BANNER); /* Display the wizard */ - PropertySheet (&psh); + PropertySheet(&psh); } /* EOF */ From 86ada6ab1ccf2c076e9837f799aa65fd906a2b07 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 22 May 2004 12:23:12 +0000 Subject: [PATCH 1199/1463] - Revert change to VGA register values that I accidently commited. svn path=/trunk/; revision=9468 --- reactos/drivers/dd/bootvid/bootvid.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/dd/bootvid/bootvid.c b/reactos/drivers/dd/bootvid/bootvid.c index 04593dafe60..fe66b5e6827 100644 --- a/reactos/drivers/dd/bootvid/bootvid.c +++ b/reactos/drivers/dd/bootvid/bootvid.c @@ -18,7 +18,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: bootvid.c,v 1.10 2004/05/21 17:34:24 navaraf Exp $ + * $Id: bootvid.c,v 1.11 2004/05/22 12:23:12 navaraf Exp $ */ /* INCLUDES ******************************************************************/ @@ -48,7 +48,7 @@ static VGA_REGISTERS Mode12Regs = { /* CRT Controller Registers */ - {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xDE, 0x1F, 0x00, 0x40, 0x00, 0x00, + {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0x8C, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xE3}, /* Attribute Controller Registers */ {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, From 4307e3115e19696a31f9f006014d1a22ee4fe212 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sat, 22 May 2004 13:18:45 +0000 Subject: [PATCH 1200/1463] code comments svn path=/trunk/; revision=9469 --- reactos/subsys/system/explorer/make_explorer.dsp | 2 +- reactos/subsys/system/explorer/utility/xmlstorage.h | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/system/explorer/make_explorer.dsp b/reactos/subsys/system/explorer/make_explorer.dsp index 7500119cfab..1631b01d435 100644 --- a/reactos/subsys/system/explorer/make_explorer.dsp +++ b/reactos/subsys/system/explorer/make_explorer.dsp @@ -108,7 +108,7 @@ CFG=make_explorer - Win32 bjam # PROP Use_Debug_Libraries 0 # PROP Output_Dir "URelease" # PROP Intermediate_Dir "URelease" -# PROP Cmd_Line "make -f Makefile.MinGW UNICODE=1" +# PROP Cmd_Line "msdevfilt -gcc make -f Makefile.MinGW UNICODE=1" # PROP Rebuild_Opt "clean all" # PROP Target_File "explorer.exe" # PROP Bsc_Name "" diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.h b/reactos/subsys/system/explorer/utility/xmlstorage.h index 910f8bb3b3e..616c3401906 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.h +++ b/reactos/subsys/system/explorer/utility/xmlstorage.h @@ -213,6 +213,7 @@ typedef __gnu_cxx::stdio_filebuf<char> STDIO_FILEBUF; typedef std::filebuf STDIO_FILEBUF; #endif + /// input file stream with ANSI/UNICODE file names struct tifstream : public std::istream { typedef std::istream super; @@ -239,6 +240,7 @@ protected: STDIO_FILEBUF _buf; }; + /// output file stream with ANSI/UNICODE file names struct tofstream : public std::ostream { typedef std::ostream super; @@ -295,7 +297,7 @@ struct String_from_XML_Char : public String inline bool operator==(const String& s1, const char* s2) { LPCWSTR p = s1; - const unsigned char* q = (const unsigned char *) s2; + const unsigned char* q = (const unsigned char*)s2; while(*p && *q) if (*p++ != *q++) From c6bdf3f977ec9e9e8ca72fcde7eb2e2272142975 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sat, 22 May 2004 16:48:50 +0000 Subject: [PATCH 1201/1463] 1. added basic reference counting for message queues 2. fixed memory leak when a thread terminates while dispatching a message 3. wake the sender's thread in case of 2. svn path=/trunk/; revision=9470 --- reactos/subsys/win32k/include/msgqueue.h | 29 ++++-- reactos/subsys/win32k/main/dllmain.c | 3 +- reactos/subsys/win32k/ntuser/msgqueue.c | 120 ++++++++++++++++++++--- 3 files changed, 129 insertions(+), 23 deletions(-) diff --git a/reactos/subsys/win32k/include/msgqueue.h b/reactos/subsys/win32k/include/msgqueue.h index ce25369b9da..603865662e3 100644 --- a/reactos/subsys/win32k/include/msgqueue.h +++ b/reactos/subsys/win32k/include/msgqueue.h @@ -42,6 +42,9 @@ typedef struct _USER_SENT_MESSAGE_NOTIFY typedef struct _USER_MESSAGE_QUEUE { + /* Reference counter, only access this variable with interlocked functions! */ + LONG References; + /* Owner of the message queue */ struct _ETHREAD *Thread; /* Queue of messages sent to the queue. */ @@ -99,6 +102,8 @@ typedef struct _USER_MESSAGE_QUEUE /* messages that are currently dispatched by other threads */ LIST_ENTRY DispatchingMessagesHead; + /* messages that are currently dispatched by this message queue, required for cleanup */ + LIST_ENTRY LocalDispatchingMessagesHead; } USER_MESSAGE_QUEUE, *PUSER_MESSAGE_QUEUE; BOOL FASTCALL @@ -127,7 +132,7 @@ MsqFindMessage(IN PUSER_MESSAGE_QUEUE MessageQueue, VOID FASTCALL MsqInitializeMessageQueue(struct _ETHREAD *Thread, PUSER_MESSAGE_QUEUE MessageQueue); VOID FASTCALL -MsqFreeMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue); +MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue); PUSER_MESSAGE_QUEUE FASTCALL MsqCreateMessageQueue(struct _ETHREAD *Thread); VOID FASTCALL @@ -197,20 +202,32 @@ LPARAM FASTCALL MsqSetMessageExtraInfo(LPARAM lParam); LPARAM FASTCALL MsqGetMessageExtraInfo(VOID); #define IntLockMessageQueue(MsgQueue) \ - ExAcquireFastMutex(&MsgQueue->Lock) + ExAcquireFastMutex(&(MsgQueue)->Lock) #define IntUnLockMessageQueue(MsgQueue) \ - ExReleaseFastMutex(&MsgQueue->Lock) + ExReleaseFastMutex(&(MsgQueue)->Lock) #define IntLockHardwareMessageQueue(MsgQueue) \ - KeWaitForMutexObject(&MsgQueue->HardwareLock, UserRequest, KernelMode, FALSE, NULL) + KeWaitForMutexObject(&(MsgQueue)->HardwareLock, UserRequest, KernelMode, FALSE, NULL) #define IntUnLockHardwareMessageQueue(MsgQueue) \ - KeReleaseMutex(&MsgQueue->HardwareLock, FALSE) + KeReleaseMutex(&(MsgQueue)->HardwareLock, FALSE) + +#define IntReferenceMessageQueue(MsgQueue) \ + InterlockedIncrement(&(MsgQueue)->References) + +#define IntDereferenceMessageQueue(MsgQueue) \ + do { \ + if(InterlockedDecrement(&(MsgQueue)->References) == 0) \ + { \ + DPRINT("Free message queue 0x%x\n", (MsgQueue)); \ + ExFreePool((MsgQueue)); \ + } \ + } while(0) /* check the queue status */ #define MsqIsSignaled(MsgQueue) \ - ((MsgQueue->WakeBits & MsgQueue->WakeMask) || (MsgQueue->ChangedBits & MsgQueue->ChangedMask)) + (((MsgQueue)->WakeBits & (MsgQueue)->WakeMask) || ((MsgQueue)->ChangedBits & (MsgQueue)->ChangedMask)) #define IS_BTN_MESSAGE(message,code) \ ((message) == WM_LBUTTON##code || \ diff --git a/reactos/subsys/win32k/main/dllmain.c b/reactos/subsys/win32k/main/dllmain.c index 17b6b41456c..42e9fec7eb9 100644 --- a/reactos/subsys/win32k/main/dllmain.c +++ b/reactos/subsys/win32k/main/dllmain.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: dllmain.c,v 1.74 2004/05/21 10:09:31 weiden Exp $ +/* $Id: dllmain.c,v 1.75 2004/05/22 16:48:50 weiden Exp $ * * Entry Point for win32k.sys */ @@ -181,6 +181,7 @@ Win32kThreadCallback (struct _ETHREAD *Thread, UnregisterThreadHotKeys(Thread); DestroyThreadWindows(Thread); IntBlockInput(Win32Thread, FALSE); + MsqDestroyMessageQueue(Win32Thread->MessageQueue); } return STATUS_SUCCESS; diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index d143c5311e5..74613cf6fb7 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.98 2004/05/20 21:48:41 weiden Exp $ +/* $Id: msgqueue.c,v 1.99 2004/05/22 16:48:50 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -420,8 +420,6 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, return FALSE; } - DesktopWindow = IntGetWindowObject(IntGetDesktopWindow()); - WaitObjects[1] = &MessageQueue->NewMessages; WaitObjects[0] = &HardwareMessageQueueLock; do @@ -435,6 +433,8 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, } while (NT_SUCCESS(WaitStatus) && STATUS_WAIT_0 != WaitStatus); + DesktopWindow = IntGetWindowObject(IntGetDesktopWindow()); + /* Process messages in the message queue itself. */ IntLockHardwareMessageQueue(MessageQueue); CurrentEntry = MessageQueue->HardwareMessagesListHead.Flink; @@ -729,6 +729,7 @@ MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) PUSER_SENT_MESSAGE Message; PLIST_ENTRY Entry; LRESULT Result; + BOOL Freed; PUSER_SENT_MESSAGE_NOTIFY NotifyMessage; IntLockMessageQueue(MessageQueue); @@ -737,19 +738,35 @@ MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) IntUnLockMessageQueue(MessageQueue); return(FALSE); } + + /* remove it from the list of pending messages */ Entry = RemoveHeadList(&MessageQueue->SentMessagesListHead); Message = CONTAINING_RECORD(Entry, USER_SENT_MESSAGE, ListEntry); + + /* insert it to the list of messages that are currently dispatched by this + message queue */ + InsertTailList(&MessageQueue->LocalDispatchingMessagesHead, + &Message->ListEntry); + IntUnLockMessageQueue(MessageQueue); - + /* Call the window procedure. */ Result = IntSendMessage(Message->Msg.hwnd, Message->Msg.message, Message->Msg.wParam, Message->Msg.lParam); + + /* remove the message from the local dispatching list, because it doesn't need + to be cleaned up on thread termination anymore */ + IntLockMessageQueue(MessageQueue); + RemoveEntryList(&Message->ListEntry); + IntUnLockMessageQueue(MessageQueue); /* remove the message from the dispatching list, so lock the sender's message queue */ IntLockMessageQueue(Message->SenderQueue); - if(Message->DispatchingListEntry.Flink != NULL) + + Freed = (Message->DispatchingListEntry.Flink == NULL); + if(!Freed) { /* only remove it from the dispatching list if not already removed by a timeout */ RemoveEntryList(&Message->DispatchingListEntry); @@ -768,12 +785,12 @@ MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) { KeSetEvent(Message->CompletionEvent, IO_NO_INCREMENT, FALSE); } - + /* unlock the sender's message queue, the safe operation is done */ IntUnLockMessageQueue(Message->SenderQueue); /* Notify the sender if they specified a callback. */ - if (Message->CompletionCallback != NULL) + if (!Freed && Message->CompletionCallback != NULL) { if(!(NotifyMessage = ExAllocatePoolWithTag(NonPagedPool, sizeof(USER_SENT_MESSAGE_NOTIFY), TAG_USRMSG))) @@ -792,7 +809,13 @@ MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) } Notified: - /* FIXME - decrease reference counter of sender's message queue here */ + if(!Freed) + { + /* only dereference our message queue if the message has not been timed out */ + IntDereferenceMessageQueue(MessageQueue); + } + + /* only free the message if not freed already */ ExFreePool(Message); return(TRUE); } @@ -846,6 +869,8 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, Message->SenderQueue = ThreadQueue; Message->CompletionCallback = NULL; + IntReferenceMessageQueue(MessageQueue); + /* add it to the list of pending messages */ IntLockMessageQueue(ThreadQueue); InsertTailList(&ThreadQueue->DispatchingMessagesHead, &Message->DispatchingListEntry); @@ -902,6 +927,7 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, Message->CompletionEvent = NULL; Message->Result = NULL; RemoveEntryList(&Message->DispatchingListEntry); + IntDereferenceMessageQueue(MessageQueue); break; } Entry = Entry->Flink; @@ -941,7 +967,7 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, } Entry = Entry->Flink; } - IntUnLockMessageQueue(MessageQueue); + IntUnLockMessageQueue(MessageQueue); /* remove from the local dispatching list so the other thread knows, it can't pass a result and it must not set the completion event anymore */ @@ -959,6 +985,7 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, Message->CompletionEvent = NULL; Message->Result = NULL; RemoveEntryList(&Message->DispatchingListEntry); + IntDereferenceMessageQueue(MessageQueue); break; } Entry = Entry->Flink; @@ -1085,6 +1112,7 @@ MsqInitializeMessageQueue(struct _ETHREAD *Thread, PUSER_MESSAGE_QUEUE MessageQu InitializeListHead(&MessageQueue->SentMessagesListHead); InitializeListHead(&MessageQueue->HardwareMessagesListHead); InitializeListHead(&MessageQueue->DispatchingMessagesHead); + InitializeListHead(&MessageQueue->LocalDispatchingMessagesHead); KeInitializeMutex(&MessageQueue->HardwareLock, 0); ExInitializeFastMutex(&MessageQueue->Lock); MessageQueue->QuitPosted = FALSE; @@ -1098,19 +1126,75 @@ MsqInitializeMessageQueue(struct _ETHREAD *Thread, PUSER_MESSAGE_QUEUE MessageQu } VOID FASTCALL -MsqFreeMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue) +MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue) { PLIST_ENTRY CurrentEntry; PUSER_MESSAGE CurrentMessage; - - CurrentEntry = MessageQueue->PostedMessagesListHead.Flink; - while (CurrentEntry != &MessageQueue->PostedMessagesListHead) + PUSER_SENT_MESSAGE CurrentSentMessage; + + IntLockMessageQueue(MessageQueue); + + /* cleanup posted messages */ + while (!IsListEmpty(&MessageQueue->PostedMessagesListHead)) { + CurrentEntry = RemoveHeadList(&MessageQueue->PostedMessagesListHead); CurrentMessage = CONTAINING_RECORD(CurrentEntry, USER_MESSAGE, ListEntry); - CurrentEntry = CurrentEntry->Flink; MsqDestroyMessage(CurrentMessage); } + + /* remove the messages that have not yet been dispatched */ + while (!IsListEmpty(&MessageQueue->SentMessagesListHead)) + { + CurrentEntry = RemoveHeadList(&MessageQueue->SentMessagesListHead); + CurrentSentMessage = CONTAINING_RECORD(CurrentEntry, USER_SENT_MESSAGE, + ListEntry); + + DPRINT("Notify the sender and remove a message from the queue that had not been dispatched\n"); + + /* remove the message from the dispatching list */ + if(CurrentSentMessage->DispatchingListEntry.Flink != NULL) + { + RemoveEntryList(&CurrentSentMessage->DispatchingListEntry); + } + + /* wake the sender's thread */ + if (CurrentSentMessage->CompletionEvent != NULL) + { + KeSetEvent(CurrentSentMessage->CompletionEvent, IO_NO_INCREMENT, FALSE); + } + + /* dereference our message queue */ + IntDereferenceMessageQueue(MessageQueue); + + /* free the message */ + ExFreePool(CurrentSentMessage); + } + + /* notify senders of dispatching messages. This needs to be cleaned up if e.g. + ExitThread() was called in a SendMessage() umode callback */ + while (!IsListEmpty(&MessageQueue->LocalDispatchingMessagesHead)) + { + CurrentEntry = RemoveHeadList(&MessageQueue->LocalDispatchingMessagesHead); + CurrentSentMessage = CONTAINING_RECORD(CurrentEntry, USER_SENT_MESSAGE, + ListEntry); + + DPRINT("Notify the sender, the thread has been terminated while dispatching a message!\n"); + + /* wake the sender's thread */ + if (CurrentSentMessage->CompletionEvent != NULL) + { + KeSetEvent(CurrentSentMessage->CompletionEvent, IO_NO_INCREMENT, FALSE); + } + + /* dereference our message queue */ + IntDereferenceMessageQueue(MessageQueue); + + /* free the message */ + ExFreePool(CurrentSentMessage); + } + DbgPrint("Done cleaning up message queue...\n"); + IntUnLockMessageQueue(MessageQueue); } PUSER_MESSAGE_QUEUE FASTCALL @@ -1128,6 +1212,9 @@ MsqCreateMessageQueue(struct _ETHREAD *Thread) } RtlZeroMemory(MessageQueue, sizeof(USER_MESSAGE_QUEUE) + sizeof(THRDCARETINFO)); + /* hold at least one reference until it'll be destroyed */ + IntReferenceMessageQueue(MessageQueue); + /* initialize the queue */ MsqInitializeMessageQueue(Thread, MessageQueue); return MessageQueue; @@ -1136,8 +1223,9 @@ MsqCreateMessageQueue(struct _ETHREAD *Thread) VOID FASTCALL MsqDestroyMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue) { - MsqFreeMessageQueue(MessageQueue); - ExFreePool(MessageQueue); + MsqCleanupMessageQueue(MessageQueue); + /* decrease the reference counter, if it hits zero, the queue will be freed */ + IntDereferenceMessageQueue(MessageQueue); } PHOOKTABLE FASTCALL From d805aabcae5dcdda2524fb376ec28595a66b84ac Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sat, 22 May 2004 17:51:08 +0000 Subject: [PATCH 1202/1463] silence debug message svn path=/trunk/; revision=9471 --- reactos/subsys/win32k/ntuser/msgqueue.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index 74613cf6fb7..f65c030a783 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.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: msgqueue.c,v 1.99 2004/05/22 16:48:50 weiden Exp $ +/* $Id: msgqueue.c,v 1.100 2004/05/22 17:51:08 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1193,7 +1193,7 @@ MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue) /* free the message */ ExFreePool(CurrentSentMessage); } - DbgPrint("Done cleaning up message queue...\n"); + IntUnLockMessageQueue(MessageQueue); } From ef7b36dd4604574d3a551505a69fbbd33d250a18 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sat, 22 May 2004 18:28:18 +0000 Subject: [PATCH 1203/1463] - Do not immediately write the zeroed region to the disk for a cached file. - Fixed a problem, which does occur if the cluster size is lower than the segment size. svn path=/trunk/; revision=9472 --- reactos/ntoskrnl/cc/copy.c | 157 ++++++++++++------------------------- 1 file changed, 49 insertions(+), 108 deletions(-) diff --git a/reactos/ntoskrnl/cc/copy.c b/reactos/ntoskrnl/cc/copy.c index 2ce0702ceb9..e9739367db6 100644 --- a/reactos/ntoskrnl/cc/copy.c +++ b/reactos/ntoskrnl/cc/copy.c @@ -1,4 +1,4 @@ -/* $Id: copy.c,v 1.20 2003/12/30 18:52:03 fireball Exp $ +/* $Id: copy.c,v 1.21 2004/05/22 18:28:18 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -32,6 +32,8 @@ static PHYSICAL_ADDRESS CcZeroPage = (PHYSICAL_ADDRESS)0LL; static PHYSICAL_ADDRESS CcZeroPage = { 0 }; #endif +#define MAX_ZERO_LENGTH (256 * 1024) + /* FUNCTIONS *****************************************************************/ VOID @@ -354,15 +356,7 @@ CcCopyRead (IN PFILE_OBJECT FileObject, ReadLength += TempLength; Length -= TempLength; ReadOffset += TempLength; -#if defined(__GNUC__) - Buffer += TempLength; -#else - { - char* pTemp = Buffer; - pTemp += TempLength; - Buffer = pTemp; - } -#endif + Buffer = (PVOID)((char*)Buffer + TempLength); } while (Length > 0) { @@ -523,41 +517,35 @@ CcZeroData (IN PFILE_OBJECT FileObject, NTSTATUS Status; LARGE_INTEGER WriteOffset; ULONG Length; + ULONG CurrentLength; PMDL Mdl; ULONG i; IO_STATUS_BLOCK Iosb; KEVENT Event; DPRINT("CcZeroData(FileObject %x, StartOffset %I64x, EndOffset %I64x, " - "Wait %d\n", FileObject, StartOffset->QuadPart, EndOffset->QuadPart, + "Wait %d)\n", FileObject, StartOffset->QuadPart, EndOffset->QuadPart, Wait); Length = EndOffset->u.LowPart - StartOffset->u.LowPart; + WriteOffset.QuadPart = StartOffset->QuadPart; if (FileObject->SectionObjectPointer->SharedCacheMap == NULL) { /* File is not cached */ - WriteOffset.QuadPart = StartOffset->QuadPart; - + while (Length > 0) { - if (Length + WriteOffset.u.LowPart % PAGE_SIZE > 262144) + if (Length + WriteOffset.u.LowPart % PAGE_SIZE > MAX_ZERO_LENGTH) { - Mdl = MmCreateMdl(NULL, (PVOID)WriteOffset.u.LowPart, - 262144 - WriteOffset.u.LowPart % PAGE_SIZE); - WriteOffset.QuadPart += - (262144 - WriteOffset.u.LowPart % PAGE_SIZE); - Length -= (262144 - WriteOffset.u.LowPart % PAGE_SIZE); + CurrentLength = MAX_ZERO_LENGTH - WriteOffset.u.LowPart % PAGE_SIZE; } else { - Mdl = - MmCreateMdl(NULL, (PVOID)WriteOffset.u.LowPart, - Length - WriteOffset.u.LowPart % PAGE_SIZE); - WriteOffset.QuadPart += - (Length - WriteOffset.u.LowPart % PAGE_SIZE); - Length = 0; + CurrentLength = Length; } + Mdl = MmCreateMdl(NULL, (PVOID)WriteOffset.u.LowPart, CurrentLength); + if (Mdl == NULL) { return(FALSE); @@ -568,7 +556,7 @@ CcZeroData (IN PFILE_OBJECT FileObject, ((PULONG)(Mdl + 1))[i] = CcZeroPage.u.LowPart; } KeInitializeEvent(&Event, NotificationEvent, FALSE); - Status = IoPageWrite(FileObject, Mdl, StartOffset, &Event, &Iosb); + Status = IoPageWrite(FileObject, Mdl, &WriteOffset, &Event, &Iosb); if (Status == STATUS_PENDING) { KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); @@ -578,6 +566,8 @@ CcZeroData (IN PFILE_OBJECT FileObject, { return(FALSE); } + WriteOffset.QuadPart += CurrentLength; + Length -= CurrentLength; } } else @@ -588,12 +578,7 @@ CcZeroData (IN PFILE_OBJECT FileObject, PLIST_ENTRY current_entry; PCACHE_SEGMENT CacheSeg, current, previous; ULONG TempLength; - ULONG Start; - ULONG count; - ULONG size; - PHYSICAL_ADDRESS page; - Start = StartOffset->u.LowPart; Bcb = FileObject->SectionObjectPointer->SharedCacheMap; if (Wait) { @@ -606,10 +591,10 @@ CcZeroData (IN PFILE_OBJECT FileObject, BcbSegmentListEntry); if (!CacheSeg->Valid) { - if ((Start >= CacheSeg->FileOffset && - Start < CacheSeg->FileOffset + Bcb->CacheSegmentSize) - || (Start + Length > CacheSeg->FileOffset && - Start + Length <= + if ((WriteOffset.u.LowPart >= CacheSeg->FileOffset && + WriteOffset.u.LowPart < CacheSeg->FileOffset + Bcb->CacheSegmentSize) + || (WriteOffset.u.LowPart + Length > CacheSeg->FileOffset && + WriteOffset.u.LowPart + Length <= CacheSeg->FileOffset + Bcb->CacheSegmentSize)) { KeReleaseSpinLock(&Bcb->BcbLock, oldirql); @@ -621,56 +606,35 @@ CcZeroData (IN PFILE_OBJECT FileObject, } KeReleaseSpinLock(&Bcb->BcbLock, oldirql); } - while (Length > 0) { - ULONG RStart = ROUND_DOWN(Start, Bcb->CacheSegmentSize); - WriteOffset.QuadPart = ROUND_DOWN(Start, Bcb->CacheSegmentSize); - if (Start % Bcb->CacheSegmentSize + Length > 262144) + ULONG Offset; + Offset = WriteOffset.u.LowPart % Bcb->CacheSegmentSize; + if (Length + Offset > MAX_ZERO_LENGTH) { - Mdl = MmCreateMdl(NULL, NULL, 262144); - if (Mdl == NULL) - { - return FALSE; - } - Status = CcRosGetCacheSegmentChain (Bcb, RStart, - 262144, &CacheSeg); - if (!NT_SUCCESS(Status)) - { - ExFreePool(Mdl); - return(FALSE); - } + CurrentLength = MAX_ZERO_LENGTH - Offset; } else { - ULONG RLength; - RLength = Start % Bcb->CacheSegmentSize + Length; - RLength = ROUND_UP(RLength, Bcb->CacheSegmentSize); - Mdl = MmCreateMdl(NULL, (PVOID)RStart, RLength); - if (Mdl == NULL) - { - return(FALSE); - } - Status = CcRosGetCacheSegmentChain (Bcb, RStart, RLength, - &CacheSeg); - if (!NT_SUCCESS(Status)) - { - ExFreePool(Mdl); - return(FALSE); - } + CurrentLength = Length; + } + Status = CcRosGetCacheSegmentChain (Bcb, WriteOffset.u.LowPart - Offset, + Offset + CurrentLength, &CacheSeg); + if (!NT_SUCCESS(Status)) + { + return FALSE; } - Mdl->MdlFlags |= (MDL_PAGES_LOCKED|MDL_IO_PAGE_READ); current = CacheSeg; - count = 0; + while (current != NULL) { - if ((Start % Bcb->CacheSegmentSize) != 0 || - Start % Bcb->CacheSegmentSize + Length < - Bcb->CacheSegmentSize) - { + Offset = WriteOffset.u.LowPart % Bcb->CacheSegmentSize; + if (Offset != 0 || + Offset + CurrentLength < Bcb->CacheSegmentSize) + { if (!current->Valid) { - /* Segment lesen */ + /* read the segment */ Status = ReadCacheSegment(current); if (!NT_SUCCESS(Status)) { @@ -678,50 +642,27 @@ CcZeroData (IN PFILE_OBJECT FileObject, Status); } } - TempLength = min (Length, Bcb->CacheSegmentSize - - Start % Bcb->CacheSegmentSize); - memset ((char*)current->BaseAddress + Start % Bcb->CacheSegmentSize, - 0, TempLength); + TempLength = min (CurrentLength, Bcb->CacheSegmentSize - Offset); } else - { + { TempLength = Bcb->CacheSegmentSize; - memset (current->BaseAddress, 0, Bcb->CacheSegmentSize); } - Start += TempLength; + memset ((PUCHAR)current->BaseAddress + Offset, 0, TempLength); + + WriteOffset.QuadPart += TempLength; + CurrentLength -= TempLength; Length -= TempLength; - - size = ((Mdl->Size - sizeof(MDL)) / sizeof(ULONG)); - for (i = 0; i < (Bcb->CacheSegmentSize / PAGE_SIZE) && - count < size; i++) - { - PVOID Address; - Address = (char*)current->BaseAddress + (i * PAGE_SIZE); - page = - MmGetPhysicalAddressForProcess(NULL, Address); - ((PULONG)(Mdl + 1))[count++] = page.u.LowPart; - } - current = current->NextInChain; - } - - /* Write the Segment */ - KeInitializeEvent(&Event, NotificationEvent, FALSE); - Status = IoPageWrite(FileObject, Mdl, &WriteOffset, &Event, &Iosb); - if (Status == STATUS_PENDING) - { - KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); - Status = Iosb.Status; - } - if (!NT_SUCCESS(Status)) - { - DPRINT1("IoPageWrite failed, status %x\n", Status); - } - current = CacheSeg; + + current = current->NextInChain; + } + + current = CacheSeg; while (current != NULL) { previous = current; current = current->NextInChain; - CcRosReleaseCacheSegment(Bcb, previous, TRUE, FALSE, FALSE); + CcRosReleaseCacheSegment(Bcb, previous, TRUE, TRUE, FALSE); } } } From f2992e0c096333ecc7b5235ce65293e048c62673 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sat, 22 May 2004 21:12:15 +0000 Subject: [PATCH 1204/1463] prevent memory leaks if callbacks to usermode never return svn path=/trunk/; revision=9473 --- reactos/include/napi/win32.h | 2 + reactos/subsys/win32k/include/callback.h | 12 ++- reactos/subsys/win32k/include/tags.h | 1 + reactos/subsys/win32k/main/dllmain.c | 5 +- reactos/subsys/win32k/ntuser/callback.c | 112 +++++++++++++++++------ reactos/subsys/win32k/ntuser/message.c | 4 +- reactos/subsys/win32k/ntuser/winsta.c | 6 +- 7 files changed, 103 insertions(+), 39 deletions(-) diff --git a/reactos/include/napi/win32.h b/reactos/include/napi/win32.h index 7c323b65417..e3c6e53e021 100644 --- a/reactos/include/napi/win32.h +++ b/reactos/include/napi/win32.h @@ -8,6 +8,8 @@ typedef struct _W32THREAD PVOID MessageQueue; FAST_MUTEX WindowListLock; LIST_ENTRY WindowListHead; + FAST_MUTEX W32CallbackListLock; + LIST_ENTRY W32CallbackListHead; struct _KBDTABLES* KeyboardLayout; struct _DESKTOP_OBJECT* Desktop; HANDLE hDesktop; diff --git a/reactos/subsys/win32k/include/callback.h b/reactos/subsys/win32k/include/callback.h index b0ab227baf1..d8194a77440 100644 --- a/reactos/subsys/win32k/include/callback.h +++ b/reactos/subsys/win32k/include/callback.h @@ -21,9 +21,6 @@ IntCallSentMessageCallback(SENDASYNCPROC CompletionCallback, HMENU STDCALL IntLoadSysMenuTemplate(); -BOOL STDCALL -IntLoadDefaultCursors(BOOL SetDefault); - LRESULT STDCALL IntCallHookProc(INT HookId, INT Code, @@ -33,4 +30,13 @@ IntCallHookProc(INT HookId, BOOLEAN Ansi, PUNICODE_STRING ModuleName); +VOID FASTCALL +IntCleanupThreadCallbacks(PW32THREAD W32Thread); + +PVOID FASTCALL +IntCbAllocateMemory(ULONG Size); + +VOID FASTCALL +IntCbFreeMemory(PVOID Data); + #endif /* _WIN32K_CALLBACK_H */ diff --git a/reactos/subsys/win32k/include/tags.h b/reactos/subsys/win32k/include/tags.h index 9ce0a959d69..83dfc2b19fa 100644 --- a/reactos/subsys/win32k/include/tags.h +++ b/reactos/subsys/win32k/include/tags.h @@ -21,6 +21,7 @@ #define TAG_TIMER TAG('T', 'I', 'M', 'R') /* timer entry */ #define TAG_TIMERTD TAG('T', 'I', 'M', 'T') /* timer thread dereference list */ #define TAG_TIMERBMP TAG('T', 'I', 'M', 'B') /* timers bitmap */ +#define TAG_CALLBACK TAG('C', 'B', 'C', 'K') /* callback memory */ /* objects */ #define TAG_BEZIER TAG('B', 'E', 'Z', 'R') /* bezier */ diff --git a/reactos/subsys/win32k/main/dllmain.c b/reactos/subsys/win32k/main/dllmain.c index 42e9fec7eb9..ce8063a5ed0 100644 --- a/reactos/subsys/win32k/main/dllmain.c +++ b/reactos/subsys/win32k/main/dllmain.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: dllmain.c,v 1.75 2004/05/22 16:48:50 weiden Exp $ +/* $Id: dllmain.c,v 1.76 2004/05/22 21:12:15 weiden Exp $ * * Entry Point for win32k.sys */ @@ -149,6 +149,8 @@ Win32kThreadCallback (struct _ETHREAD *Thread, Win32Thread->MessagePumpHookValue = 0; InitializeListHead(&Win32Thread->WindowListHead); ExInitializeFastMutex(&Win32Thread->WindowListLock); + InitializeListHead(&Win32Thread->W32CallbackListHead); + ExInitializeFastMutex(&Win32Thread->W32CallbackListLock); /* By default threads get assigned their process's desktop. */ Win32Thread->Desktop = NULL; @@ -182,6 +184,7 @@ Win32kThreadCallback (struct _ETHREAD *Thread, DestroyThreadWindows(Thread); IntBlockInput(Win32Thread, FALSE); MsqDestroyMessageQueue(Win32Thread->MessageQueue); + IntCleanupThreadCallbacks(Win32Thread); } return STATUS_SUCCESS; diff --git a/reactos/subsys/win32k/ntuser/callback.c b/reactos/subsys/win32k/ntuser/callback.c index a3f3cd5ac4a..3b254fc87c5 100644 --- a/reactos/subsys/win32k/ntuser/callback.c +++ b/reactos/subsys/win32k/ntuser/callback.c @@ -16,15 +16,19 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: callback.c,v 1.22 2004/05/10 17:07:18 weiden Exp $ +/* $Id: callback.c,v 1.23 2004/05/22 21:12:15 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * PURPOSE: Window classes * FILE: subsys/win32k/ntuser/wndproc.c * PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net) + * Thomas Weidenmueller (w3seek@users.sourceforge.net) * REVISION HISTORY: * 06-06-2001 CSH Created + * NOTES: Please use the Callback Memory Management functions for + * callbacks to make sure, the memory is freed on thread + * termination! */ /* INCLUDES ******************************************************************/ @@ -34,7 +38,78 @@ #define NDEBUG #include <debug.h> -#define TAG_CALLBACK TAG('C', 'B', 'C', 'K') +/* CALLBACK MEMORY MANAGEMENT ************************************************/ + +typedef struct _INT_CALLBACK_HEADER +{ + /* list entry in the W32THREAD structure */ + LIST_ENTRY ListEntry; +} INT_CALLBACK_HEADER, *PINT_CALLBACK_HEADER; + +PVOID FASTCALL +IntCbAllocateMemory(ULONG Size) +{ + PINT_CALLBACK_HEADER Mem; + PW32THREAD W32Thread; + + if(!(Mem = ExAllocatePoolWithTag(PagedPool, Size + sizeof(INT_CALLBACK_HEADER), + TAG_CALLBACK))) + { + return NULL; + } + + W32Thread = PsGetWin32Thread(); + ASSERT(W32Thread); + + /* insert the callback memory into the thread's callback list */ + + ExAcquireFastMutex(&W32Thread->W32CallbackListLock); + InsertTailList(&W32Thread->W32CallbackListHead, &Mem->ListEntry); + ExReleaseFastMutex(&W32Thread->W32CallbackListLock); + + return (Mem + 1); +} + +VOID FASTCALL +IntCbFreeMemory(PVOID Data) +{ + PINT_CALLBACK_HEADER Mem; + PW32THREAD W32Thread; + + ASSERT(Data); + + Mem = ((PINT_CALLBACK_HEADER)Data - 1); + + W32Thread = PsGetWin32Thread(); + ASSERT(W32Thread); + + /* remove the memory block from the thread's callback list */ + ExAcquireFastMutex(&W32Thread->W32CallbackListLock); + RemoveEntryList(&Mem->ListEntry); + ExReleaseFastMutex(&W32Thread->W32CallbackListLock); + + /* free memory */ + ExFreePool(Mem); +} + +VOID FASTCALL +IntCleanupThreadCallbacks(PW32THREAD W32Thread) +{ + PLIST_ENTRY CurrentEntry; + PINT_CALLBACK_HEADER Mem; + + ExAcquireFastMutex(&W32Thread->W32CallbackListLock); + while (!IsListEmpty(&W32Thread->W32CallbackListHead)) + { + CurrentEntry = RemoveHeadList(&W32Thread->W32CallbackListHead); + Mem = CONTAINING_RECORD(CurrentEntry, INT_CALLBACK_HEADER, + ListEntry); + + /* free memory */ + ExFreePool(Mem); + } + ExReleaseFastMutex(&W32Thread->W32CallbackListLock); +} /* FUNCTIONS *****************************************************************/ @@ -85,7 +160,7 @@ IntCallWindowProc(WNDPROC Proc, if (0 < lParamBufferSize) { ArgumentLength = sizeof(WINDOWPROC_CALLBACK_ARGUMENTS) + lParamBufferSize; - Arguments = ExAllocatePoolWithTag(PagedPool,ArgumentLength, TAG_CALLBACK); + Arguments = IntCbAllocateMemory(ArgumentLength); if (NULL == Arguments) { DPRINT1("Unable to allocate buffer for window proc callback\n"); @@ -117,7 +192,7 @@ IntCallWindowProc(WNDPROC Proc, { if (0 < lParamBufferSize) { - ExFreePool(Arguments); + IntCbFreeMemory(Arguments); } return -1; } @@ -128,7 +203,7 @@ IntCallWindowProc(WNDPROC Proc, RtlMoveMemory((PVOID) lParam, (PVOID) ((char *) Arguments + sizeof(WINDOWPROC_CALLBACK_ARGUMENTS)), lParamBufferSize); - ExFreePool(Arguments); + IntCbFreeMemory(Arguments); } return Result; @@ -156,28 +231,6 @@ IntLoadSysMenuTemplate() return (HMENU)Result; } -BOOL STDCALL -IntLoadDefaultCursors(BOOL SetDefault) -{ - LRESULT Result; - NTSTATUS Status; - PVOID ResultPointer; - ULONG ResultLength; - - ResultPointer = &Result; - ResultLength = sizeof(LRESULT); - Status = NtW32Call(USER32_CALLBACK_LOADDEFAULTCURSORS, - &SetDefault, - sizeof(BOOL), - &ResultPointer, - &ResultLength); - if (!NT_SUCCESS(Status)) - { - return(0); - } - return (BOOL)Result; -} - LRESULT STDCALL IntCallHookProc(INT HookId, INT Code, @@ -229,7 +282,7 @@ IntCallHookProc(INT HookId, return 0; } - Argument = ExAllocatePoolWithTag(PagedPool, ArgumentLength, TAG_CALLBACK); + Argument = IntCbAllocateMemory(ArgumentLength); if (NULL == Argument) { DPRINT1("HookProc callback failed: out of memory\n"); @@ -283,6 +336,9 @@ IntCallHookProc(INT HookId, ArgumentLength, &ResultPointer, &ResultLength); + + IntCbFreeMemory(Argument); + if (!NT_SUCCESS(Status)) { return 0; diff --git a/reactos/subsys/win32k/ntuser/message.c b/reactos/subsys/win32k/ntuser/message.c index 66fb98ad808..42cc2eec8b5 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.68 2004/05/22 09:22:41 weiden Exp $ +/* $Id: message.c,v 1.69 2004/05/22 21:12:15 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -410,8 +410,6 @@ IntTranslateMouseMessage(PUSER_MESSAGE_QUEUE ThreadQueue, LPMSG Msg, USHORT *Hit if(!(Window = IntGetWindowObject(Msg->hwnd))) { - /* FIXME - change the mouse cursor to an arrow, maybe do this a better way */ - IntLoadDefaultCursors(TRUE); /* let's just eat the message?! */ return TRUE; } diff --git a/reactos/subsys/win32k/ntuser/winsta.c b/reactos/subsys/win32k/ntuser/winsta.c index 66e21c5ae48..ed330d0af00 100644 --- a/reactos/subsys/win32k/ntuser/winsta.c +++ b/reactos/subsys/win32k/ntuser/winsta.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: winsta.c,v 1.62 2004/05/15 23:07:11 weiden Exp $ + * $Id: winsta.c,v 1.63 2004/05/22 21:12:15 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -198,9 +198,7 @@ IntInitializeDesktopGraphics(VOID) DC_SetOwnership(ScreenDeviceContext, NULL); EnableMouse(ScreenDeviceContext); - - /* not the best place to load the cursors but it's good for now */ - IntLoadDefaultCursors(FALSE); + NtUserAcquireOrReleaseInputOwnership(FALSE); return TRUE; From 11a1d291a0bd2323f768471ae257620dc160e595 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 22 May 2004 22:07:42 +0000 Subject: [PATCH 1205/1463] - Disable NtGdiRealizePalette. It has a lot of bugs and really doesn't do any of the work it should do. svn path=/trunk/; revision=9474 --- reactos/subsys/win32k/objects/color.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/objects/color.c b/reactos/subsys/win32k/objects/color.c index 0077518fd8b..9bf96aa14a4 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.41 2004/05/16 19:42:32 navaraf Exp $ */ +/* $Id: color.c,v 1.42 2004/05/22 22:07:42 navaraf Exp $ */ #include <w32k.h> // FIXME: Use PXLATEOBJ logicalToSystem instead of int *mapping @@ -306,6 +306,15 @@ A logical palette is a buffer between color-intensive applications and the syste */ UINT STDCALL NtGdiRealizePalette(HDC hDC) { + /* + * This function doesn't do any real work now and there's plenty + * of bugd in it (calling SetPalette for high/true-color modes, + * using DEFAULT_PALETTE instead of the device palette, ...). + */ +#if 1 + DPRINT1("NtGdiRealizePalette is unimplemented\n"); + return 0; +#else PALOBJ *palPtr, *sysPtr; PPALGDI palGDI, sysGDI; int realized = 0; @@ -370,6 +379,7 @@ UINT STDCALL NtGdiRealizePalette(HDC hDC) DC_UnlockDc(hDC); return realized; +#endif } BOOL STDCALL NtGdiResizePalette(HPALETTE hpal, From fffba95c4776358a86ed9a2ed7442ac9981c6f44 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III <royce3@ev1.net> Date: Sun, 23 May 2004 04:04:10 +0000 Subject: [PATCH 1206/1463] remove UNIMPLEMENTED from NtUserIsClipboardFormatAvailable and replace it with a DPRINT1 warning that it is not implemented. This change gets Irfanview working. svn path=/trunk/; revision=9477 --- reactos/subsys/win32k/ntuser/clipboard.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/ntuser/clipboard.c b/reactos/subsys/win32k/ntuser/clipboard.c index f6c23314c16..43d3053949e 100644 --- a/reactos/subsys/win32k/ntuser/clipboard.c +++ b/reactos/subsys/win32k/ntuser/clipboard.c @@ -227,7 +227,7 @@ NtUserGetPriorityClipboardFormat(UINT *paFormatPriorityList, INT cFormats) BOOL STDCALL NtUserIsClipboardFormatAvailable(UINT format) { - UNIMPLEMENTED + DPRINT1("FIXME: NtUserIsClipboardFormatAvailable() is not implemented\n"); return 0; } From 27119bd65cca72808e783d6bb1d46d5ed4abc0a1 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sun, 23 May 2004 09:36:47 +0000 Subject: [PATCH 1207/1463] fixed typos svn path=/trunk/; revision=9478 --- reactos/subsys/win32k/include/tags.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/include/tags.h b/reactos/subsys/win32k/include/tags.h index 83dfc2b19fa..d57f20738ad 100644 --- a/reactos/subsys/win32k/include/tags.h +++ b/reactos/subsys/win32k/include/tags.h @@ -8,7 +8,7 @@ #define TAG_ACCEL TAG('A', 'C', 'C', 'L') /* accelerator */ #define TAG_HOOK TAG('W', 'N', 'H', 'K') /* hook */ #define TAG_HOTKEY TAG('H', 'O', 'T', 'K') /* hotkey */ -#define TAG_MENUITEM TAG('M', 'E', 'N', 'I') /* menu itme */ +#define TAG_MENUITEM TAG('M', 'E', 'N', 'I') /* menu item */ #define TAG_MSG TAG('M', 'E', 'S', 'G') /* message */ #define TAG_MSGQ TAG('M', 'S', 'G', 'Q') /* message queue */ #define TAG_USRMSG TAG('U', 'M', 'S', 'G') /* user message */ @@ -39,7 +39,7 @@ #define TAG_PALETTEMAP TAG('P', 'A', 'L', 'M') /* palette mapping */ #define TAG_PATH TAG('P', 'A', 'T', 'H') /* path */ #define TAG_PRINT TAG('P', 'R', 'N', 'T') /* print */ -#define TAG_REGION TAG('P', 'R', 'N', 'T') /* region */ +#define TAG_REGION TAG('R', 'G', 'N', 'O') /* region */ #define TAG_GDITEXT TAG('T', 'X', 'T', 'O') /* text */ #define TAG_FONT TAG('F', 'N', 'T', 'O') /* font entry */ From fc9d0d4b4d55f0603991edc73585cc75190700ce Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Sun, 23 May 2004 11:56:16 +0000 Subject: [PATCH 1208/1463] - Implement RtlFindRange(). - Add documentation. svn path=/trunk/; revision=9479 --- reactos/lib/ntdll/rtl/rangelist.c | 182 ++++++++++++++++++++++++++---- 1 file changed, 158 insertions(+), 24 deletions(-) diff --git a/reactos/lib/ntdll/rtl/rangelist.c b/reactos/lib/ntdll/rtl/rangelist.c index 34ce2201049..bab0406646d 100644 --- a/reactos/lib/ntdll/rtl/rangelist.c +++ b/reactos/lib/ntdll/rtl/rangelist.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: rangelist.c,v 1.5 2004/05/17 13:21:52 ekohl Exp $ +/* $Id: rangelist.c,v 1.6 2004/05/23 11:56:16 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -31,6 +31,7 @@ #define NDEBUG #include <ntdll/ntdll.h> +#define ROUND_DOWN(N, S) ((N) - ((N) % (S))) typedef struct _RTL_RANGE_ENTRY { @@ -41,7 +42,25 @@ typedef struct _RTL_RANGE_ENTRY /* FUNCTIONS ***************************************************************/ -/* +/********************************************************************** + * NAME EXPORTED + * RtlAddRange + * + * DESCRIPTION + * Adds a range to a range list. + * + * ARGUMENTS + * RangeList Range list. + * Start + * End + * Attributes + * Flags + * UserData + * Owner + * + * RETURN VALUE + * Status + * * TODO: * - Check for overlapping ranges. * @@ -122,6 +141,10 @@ RtlAddRange (IN OUT PRTL_RANGE_LIST RangeList, return STATUS_SUCCESS; } + RtlFreeHeap (RtlGetProcessHeap(), + 0, + RangeEntry); + return STATUS_UNSUCCESSFUL; } @@ -280,8 +303,32 @@ RtlDeleteRange (IN OUT PRTL_RANGE_LIST RangeList, } -/* - * @unimplemented +/********************************************************************** + * NAME EXPORTED + * RtlFindRange + * + * DESCRIPTION + * Searches for an unused range. + * + * ARGUMENTS + * RangeList Pointer to the range list. + * Minimum + * Maximum + * Length + * Alignment + * Flags + * AttributeAvailableMask + * Context + * Callback + * Start + * + * RETURN VALUE + * Status + * + * TODO + * Support shared ranges and callback. + * + * @implemented */ NTSTATUS STDCALL RtlFindRange (IN PRTL_RANGE_LIST RangeList, @@ -295,34 +342,74 @@ RtlFindRange (IN PRTL_RANGE_LIST RangeList, IN PRTL_CONFLICT_RANGE_CALLBACK Callback OPTIONAL, OUT PULONGLONG Start) { -#if 0 - PRTL_RANGE_ENTRY Current; + PRTL_RANGE_ENTRY CurrentEntry; + PRTL_RANGE_ENTRY NextEntry; PLIST_ENTRY Entry; + ULONGLONG RangeMin; + ULONGLONG RangeMax; - Entry = RangeList->ListHead.Flink; + if (Alignment == 0 || Length == 0) + { + return STATUS_INVALID_PARAMETER; + } + + if (IsListEmpty(&RangeList->ListHead)) + { + *Start = ROUND_DOWN (Maximum - (Length - 1), Alignment); + return STATUS_SUCCESS; + } + + NextEntry = NULL; + Entry = RangeList->ListHead.Blink; while (Entry != &RangeList->ListHead) { - Current = CONTAINING_RECORD (Entry, RTL_RANGE_ENTRY, Entry); - if (Current->Range.Start >= Minimum && - Current->Range.End <= Maximum) + CurrentEntry = CONTAINING_RECORD (Entry, RTL_RANGE_ENTRY, Entry); + + RangeMax = NextEntry ? (NextEntry->Range.Start - 1) : Maximum; + if (RangeMax + (Length - 1) < Minimum) { - if (Callback != NULL) - { - Callback (Context, - &Current->Range); - } + return STATUS_RANGE_NOT_FOUND; + } - *Start = Current->Range.Start; + RangeMin = ROUND_DOWN (RangeMax - (Length - 1), Alignment); + if (RangeMin < Minimum || + (RangeMax - RangeMin) < (Length - 1)) + { + return STATUS_RANGE_NOT_FOUND; + } + DPRINT("RangeMax: %I64x\n", RangeMax); + DPRINT("RangeMin: %I64x\n", RangeMin); + + if (RangeMin > CurrentEntry->Range.End) + { + *Start = RangeMin; return STATUS_SUCCESS; } - Entry = Entry->Flink; + NextEntry = CurrentEntry; + Entry = Entry->Blink; } - return STATUS_RANGE_NOT_FOUND; -#endif - return STATUS_NOT_IMPLEMENTED; + RangeMax = NextEntry ? (NextEntry->Range.Start - 1) : Maximum; + if (RangeMax + (Length - 1) < Minimum) + { + return STATUS_RANGE_NOT_FOUND; + } + + RangeMin = ROUND_DOWN (RangeMax - (Length - 1), Alignment); + if (RangeMin < Minimum || + (RangeMax - RangeMin) < (Length - 1)) + { + return STATUS_RANGE_NOT_FOUND; + } + + DPRINT("RangeMax: %I64x\n", RangeMax); + DPRINT("RangeMin: %I64x\n", RangeMin); + + *Start = RangeMin; + + return STATUS_SUCCESS; } @@ -331,7 +418,7 @@ RtlFindRange (IN PRTL_RANGE_LIST RangeList, * RtlFreeRangeList * * DESCRIPTION - * Deletes all ranges of a range list. + * Deletes all ranges in a range list. * * ARGUMENTS * RangeList Pointer to the range list. @@ -478,7 +565,20 @@ RtlInitializeRangeList (IN OUT PRTL_RANGE_LIST RangeList) } -/* +/********************************************************************** + * NAME EXPORTED + * RtlInvertRangeList + * + * DESCRIPTION + * Inverts a range list. + * + * ARGUMENTS + * InvertedRangeList Inverted range list. + * RangeList Range list. + * + * RETURN VALUE + * Status + * * @unimplemented */ NTSTATUS STDCALL @@ -489,7 +589,26 @@ RtlInvertRangeList (OUT PRTL_RANGE_LIST InvertedRangeList, } -/* +/********************************************************************** + * NAME EXPORTED + * RtlIsRangeAvailable + * + * DESCRIPTION + * Checks whether a range is available or not. + * + * ARGUMENTS + * RangeList Pointer to the range list. + * Start + * End + * Flags + * AttributeAvailableMask + * Context + * Callback + * Available + * + * RETURN VALUE + * Status + * * TODO: * - honor Flags and AttributeAvailableMask. * @@ -535,7 +654,22 @@ RtlIsRangeAvailable (IN PRTL_RANGE_LIST RangeList, } -/* +/********************************************************************** + * NAME EXPORTED + * RtlMergeRangeList + * + * DESCRIPTION + * Merges two range lists. + * + * ARGUMENTS + * MergedRangeList Resulting range list. + * RangeList1 First range list. + * RangeList2 Second range list + * Flags + * + * RETURN VALUE + * Status + * * @unimplemented */ NTSTATUS STDCALL From 84d6759c0a40f17efed03adf770b3918a25a6afc Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sun, 23 May 2004 13:27:26 +0000 Subject: [PATCH 1209/1463] - Fixed the calculated file attribute in CdfsFileFlagsToAttributes. svn path=/trunk/; revision=9480 --- reactos/drivers/fs/cdfs/misc.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reactos/drivers/fs/cdfs/misc.c b/reactos/drivers/fs/cdfs/misc.c index ba13bcc2bc1..41af857297d 100644 --- a/reactos/drivers/fs/cdfs/misc.c +++ b/reactos/drivers/fs/cdfs/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/03/08 08:51:26 ekohl Exp $ +/* $Id: misc.c,v 1.7 2004/05/23 13:27:26 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -128,10 +128,10 @@ CdfsFileFlagsToAttributes(PFCB Fcb, /* FIXME: Fix attributes */ *FileAttributes = // FILE_ATTRIBUTE_READONLY | - (Fcb->Entry.FileFlags & FILE_FLAG_HIDDEN) ? FILE_ATTRIBUTE_HIDDEN : 0 | - (Fcb->Entry.FileFlags & FILE_FLAG_DIRECTORY) ? FILE_ATTRIBUTE_DIRECTORY : 0 | - (Fcb->Entry.FileFlags & FILE_FLAG_SYSTEM) ? FILE_ATTRIBUTE_SYSTEM : 0 | - (Fcb->Entry.FileFlags & FILE_FLAG_READONLY) ? FILE_ATTRIBUTE_READONLY : 0; + ((Fcb->Entry.FileFlags & FILE_FLAG_HIDDEN) ? FILE_ATTRIBUTE_HIDDEN : 0) | + ((Fcb->Entry.FileFlags & FILE_FLAG_DIRECTORY) ? FILE_ATTRIBUTE_DIRECTORY : 0) | + ((Fcb->Entry.FileFlags & FILE_FLAG_SYSTEM) ? FILE_ATTRIBUTE_SYSTEM : 0) | + ((Fcb->Entry.FileFlags & FILE_FLAG_READONLY) ? FILE_ATTRIBUTE_READONLY : 0); } /* EOF */ From 924e3b2bea2630ed2876f920641230b3460280f5 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sun, 23 May 2004 13:34:32 +0000 Subject: [PATCH 1210/1463] - Don't return a file or allocation size for directories. svn path=/trunk/; revision=9481 --- reactos/drivers/fs/cdfs/dirctl.c | 45 ++++++++++++++++++++------- reactos/drivers/fs/cdfs/finfo.c | 44 ++++++++++++++++++++------ reactos/drivers/fs/vfat/dir.c | 46 ++++++++++++++++++--------- reactos/drivers/fs/vfat/finfo.c | 53 +++++++++++++++++++++++--------- 4 files changed, 138 insertions(+), 50 deletions(-) diff --git a/reactos/drivers/fs/cdfs/dirctl.c b/reactos/drivers/fs/cdfs/dirctl.c index 3baf171678b..62627b365c2 100644 --- a/reactos/drivers/fs/cdfs/dirctl.c +++ b/reactos/drivers/fs/cdfs/dirctl.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: dirctl.c,v 1.14 2003/11/13 15:25:08 ekohl Exp $ +/* $Id: dirctl.c,v 1.15 2004/05/23 13:31:25 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -420,11 +420,18 @@ CdfsGetDirectoryInformation(PFCB Fcb, /* Convert file flags */ CdfsFileFlagsToAttributes(Fcb, &Info->FileAttributes); + if (CdfsFCBIsDirectory(Fcb)) + { + Info->EndOfFile.QuadPart = 0LL; + Info->AllocationSize.QuadPart = 0LL; + } + else + { + Info->EndOfFile.QuadPart = Fcb->Entry.DataLengthL; - Info->EndOfFile.QuadPart = Fcb->Entry.DataLengthL; - - /* Make AllocSize a rounded up multiple of the sector size */ - Info->AllocationSize.QuadPart = ROUND_UP(Fcb->Entry.DataLengthL, BLOCKSIZE); + /* Make AllocSize a rounded up multiple of the sector size */ + Info->AllocationSize.QuadPart = ROUND_UP(Fcb->Entry.DataLengthL, BLOCKSIZE); + } // Info->FileIndex=; @@ -465,10 +472,18 @@ CdfsGetFullDirectoryInformation(PFCB Fcb, CdfsFileFlagsToAttributes(Fcb, &Info->FileAttributes); - Info->EndOfFile.QuadPart = Fcb->Entry.DataLengthL; + if (CdfsFCBIsDirectory(Fcb)) + { + Info->EndOfFile.QuadPart = 0LL; + Info->AllocationSize.QuadPart = 0LL; + } + else + { + Info->EndOfFile.QuadPart = Fcb->Entry.DataLengthL; - /* Make AllocSize a rounded up multiple of the sector size */ - Info->AllocationSize.QuadPart = ROUND_UP(Fcb->Entry.DataLengthL, BLOCKSIZE); + /* Make AllocSize a rounded up multiple of the sector size */ + Info->AllocationSize.QuadPart = ROUND_UP(Fcb->Entry.DataLengthL, BLOCKSIZE); + } // Info->FileIndex=; Info->EaSize = 0; @@ -510,10 +525,18 @@ CdfsGetBothDirectoryInformation(PFCB Fcb, CdfsFileFlagsToAttributes(Fcb, &Info->FileAttributes); - Info->EndOfFile.QuadPart = Fcb->Entry.DataLengthL; + if (CdfsFCBIsDirectory(Fcb)) + { + Info->EndOfFile.QuadPart = 0LL; + Info->AllocationSize.QuadPart = 0LL; + } + else + { + Info->EndOfFile.QuadPart = Fcb->Entry.DataLengthL; - /* Make AllocSize a rounded up multiple of the sector size */ - Info->AllocationSize.QuadPart = ROUND_UP(Fcb->Entry.DataLengthL, BLOCKSIZE); + /* Make AllocSize a rounded up multiple of the sector size */ + Info->AllocationSize.QuadPart = ROUND_UP(Fcb->Entry.DataLengthL, BLOCKSIZE); + } // Info->FileIndex=; Info->EaSize = 0; diff --git a/reactos/drivers/fs/cdfs/finfo.c b/reactos/drivers/fs/cdfs/finfo.c index e81889a308f..e0e798528f0 100644 --- a/reactos/drivers/fs/cdfs/finfo.c +++ b/reactos/drivers/fs/cdfs/finfo.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: finfo.c,v 1.9 2004/03/08 08:51:26 ekohl Exp $ +/* $Id: finfo.c,v 1.10 2004/05/23 13:31:25 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -60,11 +60,20 @@ CdfsGetStandardInformation(PFCB Fcb, RtlZeroMemory(StandardInfo, sizeof(FILE_STANDARD_INFORMATION)); - StandardInfo->AllocationSize = Fcb->RFCB.AllocationSize; - StandardInfo->EndOfFile = Fcb->RFCB.FileSize; + if (CdfsFCBIsDirectory(Fcb)) + { + StandardInfo->AllocationSize.QuadPart = 0LL;; + StandardInfo->EndOfFile.QuadPart = 0LL; + StandardInfo->Directory = TRUE; + } + else + { + StandardInfo->AllocationSize = Fcb->RFCB.AllocationSize; + StandardInfo->EndOfFile = Fcb->RFCB.FileSize; + StandardInfo->Directory = TRUE; + } StandardInfo->NumberOfLinks = 0; StandardInfo->DeletePending = FALSE; - StandardInfo->Directory = Fcb->Entry.FileFlags & 0x02 ? TRUE : FALSE; *BufferLength -= sizeof(FILE_STANDARD_INFORMATION); return(STATUS_SUCCESS); @@ -207,8 +216,16 @@ CdfsGetNetworkOpenInformation(PFCB Fcb, &NetworkInfo->LastWriteTime); CdfsDateTimeToFileTime(Fcb, &NetworkInfo->ChangeTime); - NetworkInfo->AllocationSize = Fcb->RFCB.AllocationSize; - NetworkInfo->EndOfFile = Fcb->RFCB.FileSize; + if (CdfsFCBIsDirectory(Fcb)) + { + NetworkInfo->AllocationSize.QuadPart = 0LL;; + NetworkInfo->EndOfFile.QuadPart = 0LL; + } + else + { + NetworkInfo->AllocationSize = Fcb->RFCB.AllocationSize; + NetworkInfo->EndOfFile = Fcb->RFCB.FileSize; + } CdfsFileFlagsToAttributes(Fcb, &NetworkInfo->FileAttributes); @@ -249,11 +266,20 @@ CdfsGetAllInformation(PFILE_OBJECT FileObject, &Info->BasicInformation.FileAttributes); /* Standard Information */ - Info->StandardInformation.AllocationSize = Fcb->RFCB.AllocationSize; - Info->StandardInformation.EndOfFile = Fcb->RFCB.FileSize; + if (CdfsFCBIsDirectory(Fcb)) + { + Info->StandardInformation.AllocationSize.QuadPart = 0LL; + Info->StandardInformation.EndOfFile.QuadPart = 0LL; + Info->StandardInformation.Directory = TRUE; + } + else + { + Info->StandardInformation.AllocationSize = Fcb->RFCB.AllocationSize; + Info->StandardInformation.EndOfFile = Fcb->RFCB.FileSize; + Info->StandardInformation.Directory = FALSE; + } Info->StandardInformation.NumberOfLinks = 0; Info->StandardInformation.DeletePending = FALSE; - Info->StandardInformation.Directory = Fcb->Entry.FileFlags & FILE_FLAG_DIRECTORY ? TRUE : FALSE; /* Internal Information */ Info->InternalInformation.IndexNumber.QuadPart = Fcb->IndexNumber.QuadPart; diff --git a/reactos/drivers/fs/vfat/dir.c b/reactos/drivers/fs/vfat/dir.c index ac5434d7a46..e7e99f23aba 100644 --- a/reactos/drivers/fs/vfat/dir.c +++ b/reactos/drivers/fs/vfat/dir.c @@ -1,5 +1,5 @@ /* - * $Id: dir.c,v 1.33 2003/12/13 14:25:04 ekohl Exp $ + * $Id: dir.c,v 1.34 2004/05/23 13:34:32 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -110,12 +110,20 @@ VfatGetFileDirectoryInformation (PVFAT_DIRENTRY_CONTEXT DirContext, FsdDosDateTimeToFileTime (DirContext->FatDirEntry.UpdateDate, DirContext->FatDirEntry.UpdateTime, &pInfo->LastWriteTime); pInfo->ChangeTime = pInfo->LastWriteTime; - pInfo->EndOfFile.u.HighPart = 0; - pInfo->EndOfFile.u.LowPart = DirContext->FatDirEntry.FileSize; - /* Make allocsize a rounded up multiple of BytesPerCluster */ - pInfo->AllocationSize.u.HighPart = 0; - pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->FatDirEntry.FileSize, DeviceExt->FatInfo.BytesPerCluster); - pInfo->FileAttributes = DirContext->FatDirEntry.Attrib; + if (DirContext->FatDirEntry.Attrib & FILE_ATTRIBUTE_DIRECTORY) + { + pInfo->EndOfFile.QuadPart = 0LL; + pInfo->AllocationSize.QuadPart = 0LL; + } + else + { + pInfo->EndOfFile.u.HighPart = 0; + pInfo->EndOfFile.u.LowPart = DirContext->FatDirEntry.FileSize; + /* Make allocsize a rounded up multiple of BytesPerCluster */ + pInfo->AllocationSize.u.HighPart = 0; + pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->FatDirEntry.FileSize, DeviceExt->FatInfo.BytesPerCluster); + } + pInfo->FileAttributes = DirContext->FatDirEntry.Attrib & 0x3f; return STATUS_SUCCESS; } @@ -145,7 +153,7 @@ VfatGetFileFullDirectoryInformation (PVFAT_DIRENTRY_CONTEXT DirContext, /* Make allocsize a rounded up multiple of BytesPerCluster */ pInfo->AllocationSize.u.HighPart = 0; pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->FatDirEntry.FileSize, DeviceExt->FatInfo.BytesPerCluster); - pInfo->FileAttributes = DirContext->FatDirEntry.Attrib; + pInfo->FileAttributes = DirContext->FatDirEntry.Attrib & 0x3f; // pInfo->EaSize=; return STATUS_SUCCESS; } @@ -172,13 +180,21 @@ VfatGetFileBothInformation (PVFAT_DIRENTRY_CONTEXT DirContext, FsdDosDateTimeToFileTime (DirContext->FatDirEntry.UpdateDate, DirContext->FatDirEntry.UpdateTime, &pInfo->LastWriteTime); pInfo->ChangeTime = pInfo->LastWriteTime; - pInfo->EndOfFile.u.HighPart = 0; - pInfo->EndOfFile.u.LowPart = DirContext->FatDirEntry.FileSize; - /* Make allocsize a rounded up multiple of BytesPerCluster */ - pInfo->AllocationSize.u.HighPart = 0; - pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->FatDirEntry.FileSize, DeviceExt->FatInfo.BytesPerCluster); - pInfo->FileAttributes = DirContext->FatDirEntry.Attrib; -// pInfo->EaSize=; + if (DirContext->FatDirEntry.Attrib & FILE_ATTRIBUTE_DIRECTORY) + { + pInfo->EndOfFile.QuadPart = 0LL; + pInfo->AllocationSize.QuadPart = 0LL; + } + else + { + pInfo->EndOfFile.u.HighPart = 0; + pInfo->EndOfFile.u.LowPart = DirContext->FatDirEntry.FileSize; + /* Make allocsize a rounded up multiple of BytesPerCluster */ + pInfo->AllocationSize.u.HighPart = 0; + pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->FatDirEntry.FileSize, DeviceExt->FatInfo.BytesPerCluster); + } + pInfo->FileAttributes = DirContext->FatDirEntry.Attrib & 0x3f; + pInfo->EaSize=0; return STATUS_SUCCESS; } diff --git a/reactos/drivers/fs/vfat/finfo.c b/reactos/drivers/fs/vfat/finfo.c index ed92d52c68d..94546f58632 100644 --- a/reactos/drivers/fs/vfat/finfo.c +++ b/reactos/drivers/fs/vfat/finfo.c @@ -1,4 +1,4 @@ -/* $Id: finfo.c,v 1.34 2003/10/11 17:51:56 hbirr Exp $ +/* $Id: finfo.c,v 1.35 2004/05/23 13:34:32 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -37,14 +37,20 @@ VfatGetStandardInformation(PVFATFCB FCB, assert (StandardInfo != NULL); assert (FCB != NULL); - RtlZeroMemory(StandardInfo, - sizeof(FILE_STANDARD_INFORMATION)); - - StandardInfo->AllocationSize = FCB->RFCB.AllocationSize; - StandardInfo->EndOfFile = FCB->RFCB.FileSize; + if (vfatFCBIsDirectory(FCB)) + { + StandardInfo->AllocationSize.QuadPart = 0LL; + StandardInfo->EndOfFile.QuadPart = 0LL; + StandardInfo->Directory = TRUE; + } + else + { + StandardInfo->AllocationSize = FCB->RFCB.AllocationSize; + StandardInfo->EndOfFile = FCB->RFCB.FileSize; + StandardInfo->Directory = FALSE; + } StandardInfo->NumberOfLinks = 0; StandardInfo->DeletePending = FCB->Flags & FCB_DELETE_PENDING ? TRUE : FALSE; - StandardInfo->Directory = FCB->entry.Attrib & 0x10 ? TRUE : FALSE; *BufferLength -= sizeof(FILE_STANDARD_INFORMATION); return(STATUS_SUCCESS); @@ -148,7 +154,7 @@ VfatGetBasicInformation(PFILE_OBJECT FileObject, (TIME *)&BasicInfo->LastWriteTime); BasicInfo->ChangeTime = BasicInfo->LastWriteTime; - BasicInfo->FileAttributes = FCB->entry.Attrib; + BasicInfo->FileAttributes = FCB->entry.Attrib & 0x3f; /* Synthesize FILE_ATTRIBUTE_NORMAL */ if (0 == (BasicInfo->FileAttributes & (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_ARCHIVE | @@ -299,9 +305,17 @@ VfatGetNetworkOpenInformation(PVFATFCB Fcb, Fcb->entry.UpdateTime, &NetworkInfo->LastWriteTime); NetworkInfo->ChangeTime = NetworkInfo->LastWriteTime; - NetworkInfo->AllocationSize = Fcb->RFCB.AllocationSize; - NetworkInfo->EndOfFile = Fcb->RFCB.FileSize; - NetworkInfo->FileAttributes = Fcb->entry.Attrib; + if (vfatFCBIsDirectory(Fcb)) + { + NetworkInfo->EndOfFile.QuadPart = 0L; + NetworkInfo->AllocationSize.QuadPart = 0L; + } + else + { + NetworkInfo->AllocationSize = Fcb->RFCB.AllocationSize; + NetworkInfo->EndOfFile = Fcb->RFCB.FileSize; + } + NetworkInfo->FileAttributes = Fcb->entry.Attrib & 0x3f; *BufferLength -= sizeof(FILE_NETWORK_OPEN_INFORMATION); return STATUS_SUCCESS; @@ -335,14 +349,23 @@ VfatGetAllInformation(PFILE_OBJECT FileObject, Fcb->entry.UpdateTime, (TIME *)&Info->BasicInformation.LastWriteTime); Info->BasicInformation.ChangeTime = Info->BasicInformation.LastWriteTime; - Info->BasicInformation.FileAttributes = Fcb->entry.Attrib; + Info->BasicInformation.FileAttributes = Fcb->entry.Attrib & 0x3f; /* Standard Information */ - Info->StandardInformation.AllocationSize = Fcb->RFCB.AllocationSize; - Info->StandardInformation.EndOfFile = Fcb->RFCB.FileSize; + if (vfatFCBIsDirectory(Fcb)) + { + Info->StandardInformation.AllocationSize.QuadPart = 0LL; + Info->StandardInformation.EndOfFile.QuadPart = 0LL; + Info->StandardInformation.Directory = TRUE; + } + else + { + Info->StandardInformation.AllocationSize = Fcb->RFCB.AllocationSize; + Info->StandardInformation.EndOfFile = Fcb->RFCB.FileSize; + Info->StandardInformation.Directory = FALSE; + } Info->StandardInformation.NumberOfLinks = 0; Info->StandardInformation.DeletePending = Fcb->Flags & FCB_DELETE_PENDING ? TRUE : FALSE; - Info->StandardInformation.Directory = Fcb->entry.Attrib & 0x10 ? TRUE : FALSE; /* Internal Information */ /* FIXME: get a real index, that can be used in a create operation */ From 5096908ac71a8a82365c0b07b3c69a031ea138c3 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sun, 23 May 2004 14:04:58 +0000 Subject: [PATCH 1211/1463] ignore the hInstance field while searching classes if it's NULL svn path=/trunk/; revision=9482 --- reactos/lib/user32/windows/window.c | 8 +------- reactos/subsys/win32k/ntuser/class.c | 4 ++-- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/reactos/lib/user32/windows/window.c b/reactos/lib/user32/windows/window.c index 49e7404a164..921e8885971 100644 --- a/reactos/lib/user32/windows/window.c +++ b/reactos/lib/user32/windows/window.c @@ -1,4 +1,4 @@ -/* $Id: window.c,v 1.118 2004/05/21 10:09:31 weiden Exp $ +/* $Id: window.c,v 1.119 2004/05/23 14:04:58 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -193,9 +193,6 @@ CreateWindowExA(DWORD dwExStyle, ControlsInitialized = ControlsInit(ClassName.Buffer); } - if ( hInstance == NULL ) - hInstance = GetModuleHandleW(NULL); - if (dwExStyle & WS_EX_MDICHILD) { if (!IS_ATOM(lpClassName)) @@ -281,9 +278,6 @@ CreateWindowExW(DWORD dwExStyle, ControlsInitialized = ControlsInit(lpClassName); } - if ( hInstance == NULL ) - hInstance = GetModuleHandleW(NULL); - if (dwExStyle & WS_EX_MDICHILD) return CreateMDIWindowW(lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hInstance, (LPARAM)lpParam); diff --git a/reactos/subsys/win32k/ntuser/class.c b/reactos/subsys/win32k/ntuser/class.c index 654d364ec40..4cab09725ff 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.55 2004/05/17 16:38:58 navaraf Exp $ +/* $Id: class.c,v 1.56 2004/05/23 14:04:58 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -63,7 +63,7 @@ ClassReferenceClassByAtom( { Current = CONTAINING_RECORD(CurrentEntry, WNDCLASS_OBJECT, ListEntry); - if (Current->Atom == Atom && Current->hInstance == hInstance) + if (Current->Atom == Atom && (hInstance == NULL || Current->hInstance == hInstance)) { *Class = Current; ObmReferenceObject(Current); From 8c86d7049fa018df5da101cbc01598def53579f7 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sun, 23 May 2004 15:49:56 +0000 Subject: [PATCH 1212/1463] - Fixed my copy-and-paste bug. Thanks to Royce III. svn path=/trunk/; revision=9483 --- reactos/drivers/fs/cdfs/finfo.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/fs/cdfs/finfo.c b/reactos/drivers/fs/cdfs/finfo.c index e0e798528f0..708b78104ec 100644 --- a/reactos/drivers/fs/cdfs/finfo.c +++ b/reactos/drivers/fs/cdfs/finfo.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: finfo.c,v 1.10 2004/05/23 13:31:25 hbirr Exp $ +/* $Id: finfo.c,v 1.11 2004/05/23 15:49:56 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -70,7 +70,7 @@ CdfsGetStandardInformation(PFCB Fcb, { StandardInfo->AllocationSize = Fcb->RFCB.AllocationSize; StandardInfo->EndOfFile = Fcb->RFCB.FileSize; - StandardInfo->Directory = TRUE; + StandardInfo->Directory = FALSE; } StandardInfo->NumberOfLinks = 0; StandardInfo->DeletePending = FALSE; From 47f7ff67c1d67142e11eda5521632adc9ea1ae95 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Mon, 24 May 2004 12:03:24 +0000 Subject: [PATCH 1213/1463] Implement RtlInvertRangeList() and RtlMergeRangeList(). svn path=/trunk/; revision=9484 --- reactos/lib/ntdll/rtl/rangelist.c | 115 ++++++++++++++++++++++++++++-- 1 file changed, 109 insertions(+), 6 deletions(-) diff --git a/reactos/lib/ntdll/rtl/rangelist.c b/reactos/lib/ntdll/rtl/rangelist.c index bab0406646d..6d95fc501e4 100644 --- a/reactos/lib/ntdll/rtl/rangelist.c +++ b/reactos/lib/ntdll/rtl/rangelist.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: rangelist.c,v 1.6 2004/05/23 11:56:16 ekohl Exp $ +/* $Id: rangelist.c,v 1.7 2004/05/24 12:03:24 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -62,7 +62,7 @@ typedef struct _RTL_RANGE_ENTRY * Status * * TODO: - * - Check for overlapping ranges. + * - Support shared ranges. * * @implemented */ @@ -579,13 +579,80 @@ RtlInitializeRangeList (IN OUT PRTL_RANGE_LIST RangeList) * RETURN VALUE * Status * - * @unimplemented + * @implemented */ NTSTATUS STDCALL RtlInvertRangeList (OUT PRTL_RANGE_LIST InvertedRangeList, IN PRTL_RANGE_LIST RangeList) { - return STATUS_NOT_IMPLEMENTED; + PRTL_RANGE_ENTRY Previous; + PRTL_RANGE_ENTRY Current; + PLIST_ENTRY Entry; + NTSTATUS Status; + + /* Don't invert an empty range list */ + if (IsListEmpty(&RangeList->ListHead)) + { + return STATUS_SUCCESS; + } + + /* Add leading and intermediate ranges */ + Previous = NULL; + Entry = RangeList->ListHead.Flink; + while (Entry != &RangeList->ListHead) + { + Current = CONTAINING_RECORD (Entry, RTL_RANGE_ENTRY, Entry); + + if (Previous == NULL) + { + if (Current->Range.Start != (ULONGLONG)0) + { + Status = RtlAddRange (InvertedRangeList, + (ULONGLONG)0, + Current->Range.Start - 1, + 0, + 0, + NULL, + NULL); + if (!NT_SUCCESS(Status)) + return Status; + } + } + else + { + if (Previous->Range.End + 1 != Current->Range.Start) + { + Status = RtlAddRange (InvertedRangeList, + Previous->Range.End + 1, + Current->Range.Start - 1, + 0, + 0, + NULL, + NULL); + if (!NT_SUCCESS(Status)) + return Status; + } + } + + Previous = Current; + Entry = Entry->Flink; + } + + /* Add trailing range */ + if (Previous->Range.End + 1 != (ULONGLONG)-1) + { + Status = RtlAddRange (InvertedRangeList, + Previous->Range.End + 1, + (ULONGLONG)-1, + 0, + 0, + NULL, + NULL); + if (!NT_SUCCESS(Status)) + return Status; + } + + return STATUS_SUCCESS; } @@ -670,7 +737,7 @@ RtlIsRangeAvailable (IN PRTL_RANGE_LIST RangeList, * RETURN VALUE * Status * - * @unimplemented + * @implemented */ NTSTATUS STDCALL RtlMergeRangeLists (OUT PRTL_RANGE_LIST MergedRangeList, @@ -678,7 +745,43 @@ RtlMergeRangeLists (OUT PRTL_RANGE_LIST MergedRangeList, IN PRTL_RANGE_LIST RangeList2, IN ULONG Flags) { - return STATUS_NOT_IMPLEMENTED; + RTL_RANGE_LIST_ITERATOR Iterator; + PRTL_RANGE Range; + NTSTATUS Status; + + /* Copy range list 1 to the merged range list */ + Status = RtlCopyRangeList (MergedRangeList, + RangeList1); + if (!NT_SUCCESS(Status)) + return Status; + + /* Add range list 2 entries to the merged range list */ + Status = RtlGetFirstRange (RangeList2, + &Iterator, + &Range); + if (!NT_SUCCESS(Status)) + return (Status == STATUS_NO_MORE_ENTRIES) ? STATUS_SUCCESS : Status; + + while (TRUE) + { + Status = RtlAddRange (MergedRangeList, + Range->Start, + Range->End, + Range->Attributes, + Range->Flags | Flags, + Range->UserData, + Range->Owner); + if (!NT_SUCCESS(Status)) + break; + + Status = RtlGetNextRange (&Iterator, + &Range, + TRUE); + if (!NT_SUCCESS(Status)) + break; + } + + return (Status == STATUS_NO_MORE_ENTRIES) ? STATUS_SUCCESS : Status; } /* EOF */ From 82a4c658f4dae6e5ea9aca7eb61bbe5a35ec8f40 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Mon, 24 May 2004 12:05:54 +0000 Subject: [PATCH 1214/1463] Implement kernel-mode range lists. svn path=/trunk/; revision=9485 --- reactos/ntoskrnl/rtl/rangelist.c | 778 +++++++++++++++++++++++++++++++ 1 file changed, 778 insertions(+) create mode 100644 reactos/ntoskrnl/rtl/rangelist.c diff --git a/reactos/ntoskrnl/rtl/rangelist.c b/reactos/ntoskrnl/rtl/rangelist.c new file mode 100644 index 00000000000..f93978e1cc3 --- /dev/null +++ b/reactos/ntoskrnl/rtl/rangelist.c @@ -0,0 +1,778 @@ +/* + * 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: rangelist.c,v 1.1 2004/05/24 12:05:54 ekohl Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * PURPOSE: Range list implementation + * FILE: ntoskrnl/rtl/rangelist.c + */ + +/* INCLUDES ****************************************************************/ + +#include <ddk/ntddk.h> + +#define NDEBUG +#include <internal/debug.h> + + +#define ROUND_DOWN(N, S) ((N) - ((N) % (S))) + +typedef struct _RTL_RANGE_ENTRY +{ + LIST_ENTRY Entry; + RTL_RANGE Range; +} RTL_RANGE_ENTRY, *PRTL_RANGE_ENTRY; + + +/* FUNCTIONS ***************************************************************/ + +/********************************************************************** + * NAME EXPORTED + * RtlAddRange + * + * DESCRIPTION + * Adds a range to a range list. + * + * ARGUMENTS + * RangeList Range list. + * Start + * End + * Attributes + * Flags + * UserData + * Owner + * + * RETURN VALUE + * Status + * + * TODO: + * - Support shared ranges. + * + * @implemented + */ +NTSTATUS STDCALL +RtlAddRange (IN OUT PRTL_RANGE_LIST RangeList, + IN ULONGLONG Start, + IN ULONGLONG End, + IN UCHAR Attributes, + IN ULONG Flags, + IN PVOID UserData OPTIONAL, + IN PVOID Owner OPTIONAL) +{ + PRTL_RANGE_ENTRY RangeEntry; + PRTL_RANGE_ENTRY Previous; + PRTL_RANGE_ENTRY Current; + PLIST_ENTRY Entry; + + if (Start > End) + return STATUS_INVALID_PARAMETER; + + /* Create new range entry */ + RangeEntry = ExAllocatePool (PagedPool, + sizeof(RTL_RANGE_ENTRY)); + if (RangeEntry == NULL) + return STATUS_INSUFFICIENT_RESOURCES; + + /* Initialize range entry */ + RangeEntry->Range.Start = Start; + RangeEntry->Range.End = End; + RangeEntry->Range.Attributes = Attributes; + RangeEntry->Range.UserData = UserData; + RangeEntry->Range.Owner = Owner; + + RangeEntry->Range.Flags = 0; + if (Flags & RTL_RANGE_LIST_ADD_SHARED) + RangeEntry->Range.Flags |= RTL_RANGE_SHARED; + + /* Insert range entry */ + if (RangeList->Count == 0) + { + InsertTailList (&RangeList->ListHead, + &RangeEntry->Entry); + RangeList->Count++; + RangeList->Stamp++; + return STATUS_SUCCESS; + } + else + { + Previous = NULL; + Entry = RangeList->ListHead.Flink; + while (Entry != &RangeList->ListHead) + { + Current = CONTAINING_RECORD (Entry, RTL_RANGE_ENTRY, Entry); + if (Current->Range.Start > RangeEntry->Range.End) + { + /* Insert before current */ + DPRINT ("Insert before current\n"); + InsertTailList (&Current->Entry, + &RangeEntry->Entry); + + RangeList->Count++; + RangeList->Stamp++; + return STATUS_SUCCESS; + } + + Previous = Current; + Entry = Entry->Flink; + } + + DPRINT ("Insert tail\n"); + InsertTailList (&RangeList->ListHead, + &RangeEntry->Entry); + RangeList->Count++; + RangeList->Stamp++; + return STATUS_SUCCESS; + } + + ExFreePool (RangeEntry); + + return STATUS_UNSUCCESSFUL; +} + + +/********************************************************************** + * NAME EXPORTED + * RtlCopyRangeList + * + * DESCRIPTION + * Copy a range list. + * + * ARGUMENTS + * CopyRangeList Pointer to the destination range list. + * RangeList Pointer to the source range list. + * + * RETURN VALUE + * Status + * + * @implemented + */ +NTSTATUS STDCALL +RtlCopyRangeList (OUT PRTL_RANGE_LIST CopyRangeList, + IN PRTL_RANGE_LIST RangeList) +{ + PRTL_RANGE_ENTRY Current; + PRTL_RANGE_ENTRY NewEntry; + PLIST_ENTRY Entry; + + CopyRangeList->Flags = RangeList->Flags; + + Entry = RangeList->ListHead.Flink; + while (Entry != &RangeList->ListHead) + { + Current = CONTAINING_RECORD (Entry, RTL_RANGE_ENTRY, Entry); + + NewEntry = ExAllocatePool (PagedPool, + sizeof(RTL_RANGE_ENTRY)); + if (NewEntry == NULL) + return STATUS_INSUFFICIENT_RESOURCES; + + RtlCopyMemory (&NewEntry->Range, + &Current->Range, + sizeof(RTL_RANGE_ENTRY)); + + InsertTailList (&CopyRangeList->ListHead, + &NewEntry->Entry); + + CopyRangeList->Count++; + + Entry = Entry->Flink; + } + + CopyRangeList->Stamp++; + + return STATUS_SUCCESS; +} + + +/********************************************************************** + * NAME EXPORTED + * RtlDeleteOwnersRanges + * + * DESCRIPTION + * Delete all ranges that belong to the given owner. + * + * ARGUMENTS + * RangeList Pointer to the range list. + * Owner User supplied value that identifies the owner + * of the ranges to be deleted. + * + * RETURN VALUE + * Status + * + * @implemented + */ +NTSTATUS STDCALL +RtlDeleteOwnersRanges (IN OUT PRTL_RANGE_LIST RangeList, + IN PVOID Owner) +{ + PRTL_RANGE_ENTRY Current; + PLIST_ENTRY Entry; + + Entry = RangeList->ListHead.Flink; + while (Entry != &RangeList->ListHead) + { + Current = CONTAINING_RECORD (Entry, RTL_RANGE_ENTRY, Entry); + if (Current->Range.Owner == Owner) + { + RemoveEntryList (Entry); + ExFreePool (Current); + + RangeList->Count--; + RangeList->Stamp++; + } + + Entry = Entry->Flink; + } + + return STATUS_SUCCESS; +} + + +/********************************************************************** + * NAME EXPORTED + * RtlDeleteRange + * + * DESCRIPTION + * Deletes a given range. + * + * ARGUMENTS + * RangeList Pointer to the range list. + * Start Start of the range to be deleted. + * End End of the range to be deleted. + * Owner Owner of the ranges to be deleted. + * + * RETURN VALUE + * Status + * + * @implemented + */ +NTSTATUS STDCALL +RtlDeleteRange (IN OUT PRTL_RANGE_LIST RangeList, + IN ULONGLONG Start, + IN ULONGLONG End, + IN PVOID Owner) +{ + PRTL_RANGE_ENTRY Current; + PLIST_ENTRY Entry; + + Entry = RangeList->ListHead.Flink; + while (Entry != &RangeList->ListHead) + { + Current = CONTAINING_RECORD (Entry, RTL_RANGE_ENTRY, Entry); + if (Current->Range.Start == Start && + Current->Range.End == End && + Current->Range.Owner == Owner) + { + RemoveEntryList (Entry); + + ExFreePool (Current); + + RangeList->Count--; + RangeList->Stamp++; + return STATUS_SUCCESS; + } + + Entry = Entry->Flink; + } + + return STATUS_RANGE_NOT_FOUND; +} + + +/********************************************************************** + * NAME EXPORTED + * RtlFindRange + * + * DESCRIPTION + * Searches for an unused range. + * + * ARGUMENTS + * RangeList Pointer to the range list. + * Minimum + * Maximum + * Length + * Alignment + * Flags + * AttributeAvailableMask + * Context + * Callback + * Start + * + * RETURN VALUE + * Status + * + * TODO + * Support shared ranges and callback. + * + * @implemented + */ +NTSTATUS STDCALL +RtlFindRange (IN PRTL_RANGE_LIST RangeList, + IN ULONGLONG Minimum, + IN ULONGLONG Maximum, + IN ULONG Length, + IN ULONG Alignment, + IN ULONG Flags, + IN UCHAR AttributeAvailableMask, + IN PVOID Context OPTIONAL, + IN PRTL_CONFLICT_RANGE_CALLBACK Callback OPTIONAL, + OUT PULONGLONG Start) +{ + PRTL_RANGE_ENTRY CurrentEntry; + PRTL_RANGE_ENTRY NextEntry; + PLIST_ENTRY Entry; + ULONGLONG RangeMin; + ULONGLONG RangeMax; + + if (Alignment == 0 || Length == 0) + { + return STATUS_INVALID_PARAMETER; + } + + if (IsListEmpty(&RangeList->ListHead)) + { + *Start = ROUND_DOWN (Maximum - (Length - 1), Alignment); + return STATUS_SUCCESS; + } + + NextEntry = NULL; + Entry = RangeList->ListHead.Blink; + while (Entry != &RangeList->ListHead) + { + CurrentEntry = CONTAINING_RECORD (Entry, RTL_RANGE_ENTRY, Entry); + + RangeMax = NextEntry ? (NextEntry->Range.Start - 1) : Maximum; + if (RangeMax + (Length - 1) < Minimum) + { + return STATUS_RANGE_NOT_FOUND; + } + + RangeMin = ROUND_DOWN (RangeMax - (Length - 1), Alignment); + if (RangeMin < Minimum || + (RangeMax - RangeMin) < (Length - 1)) + { + return STATUS_RANGE_NOT_FOUND; + } + + DPRINT("RangeMax: %I64x\n", RangeMax); + DPRINT("RangeMin: %I64x\n", RangeMin); + + if (RangeMin > CurrentEntry->Range.End) + { + *Start = RangeMin; + return STATUS_SUCCESS; + } + + NextEntry = CurrentEntry; + Entry = Entry->Blink; + } + + RangeMax = NextEntry ? (NextEntry->Range.Start - 1) : Maximum; + if (RangeMax + (Length - 1) < Minimum) + { + return STATUS_RANGE_NOT_FOUND; + } + + RangeMin = ROUND_DOWN (RangeMax - (Length - 1), Alignment); + if (RangeMin < Minimum || + (RangeMax - RangeMin) < (Length - 1)) + { + return STATUS_RANGE_NOT_FOUND; + } + + DPRINT("RangeMax: %I64x\n", RangeMax); + DPRINT("RangeMin: %I64x\n", RangeMin); + + *Start = RangeMin; + + return STATUS_SUCCESS; +} + + +/********************************************************************** + * NAME EXPORTED + * RtlFreeRangeList + * + * DESCRIPTION + * Deletes all ranges in a range list. + * + * ARGUMENTS + * RangeList Pointer to the range list. + * + * RETURN VALUE + * None + * + * @implemented + */ +VOID STDCALL +RtlFreeRangeList (IN PRTL_RANGE_LIST RangeList) +{ + PLIST_ENTRY Entry; + PRTL_RANGE_ENTRY Current; + + while (!IsListEmpty(&RangeList->ListHead)) + { + Entry = RemoveHeadList (&RangeList->ListHead); + Current = CONTAINING_RECORD (Entry, RTL_RANGE_ENTRY, Entry); + + DPRINT ("Range start: %I64u\n", Current->Range.Start); + DPRINT ("Range end: %I64u\n", Current->Range.End); + + ExFreePool (Current); + } + + RangeList->Flags = 0; + RangeList->Count = 0; +} + + +/********************************************************************** + * NAME EXPORTED + * RtlGetFirstRange + * + * DESCRIPTION + * Retrieves the first range of a range list. + * + * ARGUMENTS + * RangeList Pointer to the range list. + * Iterator Pointer to a user supplied list state buffer. + * Range Pointer to the first range. + * + * RETURN VALUE + * Status + * + * @implemented + */ +NTSTATUS STDCALL +RtlGetFirstRange (IN PRTL_RANGE_LIST RangeList, + OUT PRTL_RANGE_LIST_ITERATOR Iterator, + OUT PRTL_RANGE *Range) +{ + Iterator->RangeListHead = &RangeList->ListHead; + Iterator->MergedHead = NULL; + Iterator->Stamp = RangeList->Stamp; + if (IsListEmpty(&RangeList->ListHead)) + { + Iterator->Current = NULL; + *Range = NULL; + return STATUS_NO_MORE_ENTRIES; + } + + Iterator->Current = RangeList->ListHead.Flink; + *Range = &((PRTL_RANGE_ENTRY)Iterator->Current)->Range; + + return STATUS_SUCCESS; +} + + +/********************************************************************** + * NAME EXPORTED + * RtlGetNextRange + * + * DESCRIPTION + * Retrieves the next (or previous) range of a range list. + * + * ARGUMENTS + * Iterator Pointer to a user supplied list state buffer. + * Range Pointer to the first range. + * MoveForwards TRUE, get next range + * FALSE, get previous range + * + * RETURN VALUE + * Status + * + * @implemented + */ +NTSTATUS STDCALL +RtlGetNextRange (IN OUT PRTL_RANGE_LIST_ITERATOR Iterator, + OUT PRTL_RANGE *Range, + IN BOOLEAN MoveForwards) +{ + PRTL_RANGE_LIST RangeList; + PLIST_ENTRY Next; + + RangeList = CONTAINING_RECORD(Iterator->RangeListHead, RTL_RANGE_LIST, ListHead); + if (Iterator->Stamp != RangeList->Stamp) + return STATUS_INVALID_PARAMETER; + + if (MoveForwards) + { + Next = ((PRTL_RANGE_ENTRY)Iterator->Current)->Entry.Flink; + } + else + { + Next = ((PRTL_RANGE_ENTRY)Iterator->Current)->Entry.Blink; + } + + if (Next == Iterator->RangeListHead) + return STATUS_NO_MORE_ENTRIES; + + Iterator->Current = Next; + *Range = &((PRTL_RANGE_ENTRY)Next)->Range; + + return STATUS_SUCCESS; +} + + +/********************************************************************** + * NAME EXPORTED + * RtlInitializeRangeList + * + * DESCRIPTION + * Initializes a range list. + * + * ARGUMENTS + * RangeList Pointer to a user supplied range list. + * + * RETURN VALUE + * None + * + * @implemented + */ +VOID STDCALL +RtlInitializeRangeList (IN OUT PRTL_RANGE_LIST RangeList) +{ + InitializeListHead (&RangeList->ListHead); + RangeList->Flags = 0; + RangeList->Count = 0; + RangeList->Stamp = 0; +} + + +/********************************************************************** + * NAME EXPORTED + * RtlInvertRangeList + * + * DESCRIPTION + * Inverts a range list. + * + * ARGUMENTS + * InvertedRangeList Inverted range list. + * RangeList Range list. + * + * RETURN VALUE + * Status + * + * @implemented + */ +NTSTATUS STDCALL +RtlInvertRangeList (OUT PRTL_RANGE_LIST InvertedRangeList, + IN PRTL_RANGE_LIST RangeList) +{ + PRTL_RANGE_ENTRY Previous; + PRTL_RANGE_ENTRY Current; + PLIST_ENTRY Entry; + NTSTATUS Status; + + /* Don't invert an empty range list */ + if (IsListEmpty(&RangeList->ListHead)) + { + return STATUS_SUCCESS; + } + + /* Add leading and intermediate ranges */ + Previous = NULL; + Entry = RangeList->ListHead.Flink; + while (Entry != &RangeList->ListHead) + { + Current = CONTAINING_RECORD (Entry, RTL_RANGE_ENTRY, Entry); + + if (Previous == NULL) + { + if (Current->Range.Start != (ULONGLONG)0) + { + Status = RtlAddRange (InvertedRangeList, + (ULONGLONG)0, + Current->Range.Start - 1, + 0, + 0, + NULL, + NULL); + if (!NT_SUCCESS(Status)) + return Status; + } + } + else + { + if (Previous->Range.End + 1 != Current->Range.Start) + { + Status = RtlAddRange (InvertedRangeList, + Previous->Range.End + 1, + Current->Range.Start - 1, + 0, + 0, + NULL, + NULL); + if (!NT_SUCCESS(Status)) + return Status; + } + } + + Previous = Current; + Entry = Entry->Flink; + } + + /* Add trailing range */ + if (Previous->Range.End + 1 != (ULONGLONG)-1) + { + Status = RtlAddRange (InvertedRangeList, + Previous->Range.End + 1, + (ULONGLONG)-1, + 0, + 0, + NULL, + NULL); + if (!NT_SUCCESS(Status)) + return Status; + } + + return STATUS_SUCCESS; +} + + +/********************************************************************** + * NAME EXPORTED + * RtlIsRangeAvailable + * + * DESCRIPTION + * Checks whether a range is available or not. + * + * ARGUMENTS + * RangeList Pointer to the range list. + * Start + * End + * Flags + * AttributeAvailableMask + * Context + * Callback + * Available + * + * RETURN VALUE + * Status + * + * TODO: + * - honor Flags and AttributeAvailableMask. + * + * @implemented + */ +NTSTATUS STDCALL +RtlIsRangeAvailable (IN PRTL_RANGE_LIST RangeList, + IN ULONGLONG Start, + IN ULONGLONG End, + IN ULONG Flags, + IN UCHAR AttributeAvailableMask, + IN PVOID Context OPTIONAL, + IN PRTL_CONFLICT_RANGE_CALLBACK Callback OPTIONAL, + OUT PBOOLEAN Available) +{ + PRTL_RANGE_ENTRY Current; + PLIST_ENTRY Entry; + + *Available = TRUE; + + Entry = RangeList->ListHead.Flink; + while (Entry != &RangeList->ListHead) + { + Current = CONTAINING_RECORD (Entry, RTL_RANGE_ENTRY, Entry); + if (!((Current->Range.Start > End && Current->Range.End > End) || + (Current->Range.Start < Start && Current->Range.End < Start))) + { + if (Callback != NULL) + { + *Available = Callback (Context, + &Current->Range); + } + else + { + *Available = FALSE; + } + } + + Entry = Entry->Flink; + } + + return STATUS_SUCCESS; +} + + +/********************************************************************** + * NAME EXPORTED + * RtlMergeRangeList + * + * DESCRIPTION + * Merges two range lists. + * + * ARGUMENTS + * MergedRangeList Resulting range list. + * RangeList1 First range list. + * RangeList2 Second range list + * Flags + * + * RETURN VALUE + * Status + * + * @implemented + */ +NTSTATUS STDCALL +RtlMergeRangeLists (OUT PRTL_RANGE_LIST MergedRangeList, + IN PRTL_RANGE_LIST RangeList1, + IN PRTL_RANGE_LIST RangeList2, + IN ULONG Flags) +{ + RTL_RANGE_LIST_ITERATOR Iterator; + PRTL_RANGE Range; + NTSTATUS Status; + + /* Copy range list 1 to the merged range list */ + Status = RtlCopyRangeList (MergedRangeList, + RangeList1); + if (!NT_SUCCESS(Status)) + return Status; + + /* Add range list 2 entries to the merged range list */ + Status = RtlGetFirstRange (RangeList2, + &Iterator, + &Range); + if (!NT_SUCCESS(Status)) + return (Status == STATUS_NO_MORE_ENTRIES) ? STATUS_SUCCESS : Status; + + while (TRUE) + { + Status = RtlAddRange (MergedRangeList, + Range->Start, + Range->End, + Range->Attributes, + Range->Flags | Flags, + Range->UserData, + Range->Owner); + if (!NT_SUCCESS(Status)) + break; + + Status = RtlGetNextRange (&Iterator, + &Range, + TRUE); + if (!NT_SUCCESS(Status)) + break; + } + + return (Status == STATUS_NO_MORE_ENTRIES) ? STATUS_SUCCESS : Status; +} + +/* EOF */ From b718b8e34863d4550c946370be5ad353c1712d78 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Mon, 24 May 2004 12:08:55 +0000 Subject: [PATCH 1215/1463] Implement kernel-mode range lists. Install target must not rebuild executables. svn path=/trunk/; revision=9486 --- reactos/ntoskrnl/Makefile | 72 ++++++++++++++++++----------------- reactos/ntoskrnl/ntoskrnl.def | 14 ++++++- reactos/ntoskrnl/ntoskrnl.edf | 14 ++++++- 3 files changed, 63 insertions(+), 37 deletions(-) diff --git a/reactos/ntoskrnl/Makefile b/reactos/ntoskrnl/Makefile index 7f47e510975..f2baa3c3b84 100644 --- a/reactos/ntoskrnl/Makefile +++ b/reactos/ntoskrnl/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.118 2004/03/13 18:21:56 dwelch Exp $ +# $Id: Makefile,v 1.119 2004/05/24 12:08:55 ekohl Exp $ # # ReactOS Operating System # @@ -94,14 +94,15 @@ OBJECTS_NT = \ nt/nttimer.o \ nt/plugplay.o \ nt/profile.o \ - nt/zw.o \ - nt/vdm.o + nt/vdm.o \ + nt/zw.o # Run-Time Library (Rtl) OBJECTS_RTL = \ rtl/atom.o \ rtl/bit.o \ rtl/bitmap.o \ + rtl/capture.o \ rtl/compress.o \ rtl/ctype.o \ rtl/dos8dot3.o \ @@ -113,6 +114,7 @@ OBJECTS_RTL = \ rtl/nls.o \ rtl/purecall.o \ rtl/random.o \ + rtl/rangelist.o \ rtl/regio.o \ rtl/sprintf.o \ rtl/stdlib.o \ @@ -122,8 +124,7 @@ OBJECTS_RTL = \ rtl/timezone.o \ rtl/unicode.o \ rtl/version.o \ - rtl/wstring.o \ - rtl/capture.o + rtl/wstring.o OBJECTS_RTL := $(filter-out $(RTL_EXCLUDE_FILTER), $(OBJECTS_RTL)) @@ -138,46 +139,46 @@ OBJECTS_KE = \ ke/error.o \ ke/event.o \ ke/kqueue.o \ + ke/kthread.o \ ke/main.o \ ke/mutex.o \ ke/process.o \ + ke/queue.o \ ke/sem.o \ ke/spinlock.o \ ke/timer.o \ - ke/wait.o \ - ke/kthread.o \ - ke/queue.o + ke/wait.o # Memory Manager (Mm) OBJECTS_MM = \ + mm/anonmem.o \ mm/aspace.o \ + mm/balance.o \ mm/cont.o \ mm/drvlck.o \ mm/freelist.o \ mm/iospace.o \ + mm/kmap.o \ mm/marea.o \ mm/mdl.o \ mm/mm.o \ + mm/mminit.o \ + mm/mpw.o \ mm/ncache.o \ mm/npool.o \ mm/pagfault.o \ mm/pagefile.o \ + mm/pageop.o \ + mm/pager.o \ mm/paging.o \ mm/pool.o \ mm/ppool.o \ - mm/section.o \ - mm/virtual.o \ - mm/pager.o \ - mm/wset.o \ - mm/mminit.o \ - mm/kmap.o \ - mm/mpw.o \ - mm/pageop.o \ - mm/balance.o \ + mm/region.o \ mm/rmap.o \ + mm/section.o \ mm/slab.o \ - mm/anonmem.o \ - mm/region.o + mm/virtual.o \ + mm/wset.o # I/O Subsystem (Io) OBJECTS_IO = \ @@ -242,24 +243,24 @@ OBJECTS_OB = \ # Process Manager (Ps) OBJECTS_PS = \ ps/create.o \ + ps/debug.o \ ps/idle.o \ ps/kill.o \ ps/locale.o \ ps/process.o \ ps/psmgr.o \ + ps/suspend.o \ ps/thread.o \ ps/tinfo.o \ - ps/debug.o \ - ps/suspend.o \ ps/win32.o \ ps/w32call.o # Executive Subsystem (Ex) OBJECTS_EX = \ - ex/btree.o \ + ex/btree.o \ ex/callback.o \ ex/fmutex.o \ - ex/hashtab.o \ + ex/hashtab.o \ ex/init.o \ ex/interlck.o \ ex/list.o \ @@ -268,7 +269,7 @@ OBJECTS_EX = \ ex/power.o \ ex/resource.o \ ex/time.o \ - ex/stree.o \ + ex/stree.o \ ex/sysinfo.o \ ex/win32k.o \ ex/work.o \ @@ -304,11 +305,11 @@ OBJECTS_SE = \ # Configuration Manager (Registry) OBJECTS_CM = \ cm/import.o \ - cm/registry.o \ cm/ntfunc.o \ - cm/rtlfunc.o \ cm/regfile.o \ - cm/regobj.o + cm/registry.o \ + cm/regobj.o \ + cm/rtlfunc.o # Debugger Support (Dbg) OBJECTS_DBG = \ @@ -342,23 +343,24 @@ OBJECTS_LPC = \ lpc/send.o # Power Management (Po) -OBJECTS_PO = po/power.o +OBJECTS_PO = \ + po/power.o # Cache Manager (Cc) OBJECTS_CC = \ cc/cacheman.o \ - cc/view.o \ cc/copy.o \ cc/pin.o \ - cc/misc.o + cc/misc.o \ + cc/view.o # Kernel Debugger Support (Kd) OBJECTS_KD = \ - kd/kdebug.o \ - kd/service.o \ kd/dlog.o \ kd/gdbstub.o \ - kd/mda.o + kd/kdebug.o \ + kd/mda.o \ + kd/service.o # Boot video (Inbv) OBJECTS_INBV = \ @@ -712,12 +714,12 @@ clean: ifneq ($(BOOTCD_INSTALL),) -install: $(TARGETNAME).exe $(TARGETNAME).sym $(TARGETNAME).nostrip.exe +install: - $(CP) $(TARGETNAME).exe $(INSTALL_DIR)/$(TARGETNAME).exe else # BOOTCD_INSTALL -install: $(TARGETNAME).exe $(TARGETNAME).sym $(TARGETNAME).nostrip.exe +install: - $(CP) $(TARGETNAME).exe $(INSTALL_DIR)/system32/$(TARGETNAME).exe - $(CP) $(TARGETNAME).sym $(INSTALL_DIR)/symbols/$(TARGETNAME).sym diff --git a/reactos/ntoskrnl/ntoskrnl.def b/reactos/ntoskrnl/ntoskrnl.def index ba6c5210657..fa76d746657 100644 --- a/reactos/ntoskrnl/ntoskrnl.def +++ b/reactos/ntoskrnl/ntoskrnl.def @@ -1,4 +1,4 @@ -; $Id: ntoskrnl.def,v 1.181 2004/05/20 12:42:51 ekohl Exp $ +; $Id: ntoskrnl.def,v 1.182 2004/05/24 12:08:55 ekohl Exp $ ; ; reactos/ntoskrnl/ntoskrnl.def ; @@ -688,6 +688,7 @@ RtlAbsoluteToSelfRelativeSD@12 RtlAddAccessAllowedAce@16 RtlAddAce@20 RtlAddAtomToAtomTable@12 +RtlAddRange@36 ;RtlAllocateAndInitializeSid ;RtlAllocateHeap RtlAnsiCharToUnicodeChar@4 @@ -717,6 +718,7 @@ RtlConvertLongToLargeInteger@4 RtlConvertSidToUnicodeString@12 RtlConvertUlongToLargeInteger@4 RtlCopyLuid@8 +RtlCopyRangeList@8 RtlCopySid@12 RtlCopyString@8 RtlCopyUnicodeString@8 @@ -734,6 +736,8 @@ RtlDecompressFragment@32 RtlDeleteAtomFromAtomTable@8 ;RtlDeleteElementGenericTable ;RtlDeleteNoSplay +RtlDeleteOwnersRanges@8 +RtlDeleteRange@24 RtlDeleteRegistryValue@12 RtlDescribeChunk@20 RtlDestroyAtomTable@4 @@ -763,12 +767,14 @@ RtlFindLongestRunClear@8 RtlFindLongestRunSet@8 RtlFindMessage@20 RtlFindMostSignificantBit@8 +RtlFindRange@48 RtlFindSetBits@12 RtlFindSetBitsAndClear@12 ;RtlFindUnicodePrefix RtlFormatCurrentUserKeyPath@4 RtlFreeAnsiString@4 ;RtlFreeHeap +RtlFreeRangeList@4 RtlFreeOemString@4 RtlFreeUnicodeString@4 RtlGenerate8dot3Name@16 @@ -777,7 +783,9 @@ RtlGetCompressionWorkSpaceSize@12 RtlGetDaclSecurityDescriptor@16 RtlGetDefaultCodePage@8 ;RtlGetElementGenericTable +RtlGetFirstRange@12 RtlGetGroupSecurityDescriptor@12 +RtlGetNextRange@12 RtlGetOwnerSecurityDescriptor@12 RtlGetVersion@4 RtlImageNtHeader@4 @@ -788,13 +796,16 @@ RtlInitString@8 RtlInitUnicodeString@8 RtlInitializeBitMap@12 ;RtlInitializeGenericTable +RtlInitializeRangeList@4 RtlInitializeSid@12 ;RtlInitializeUnicodePrefix ;RtlInsertElementGenericTable ;RtlInsertUnicodePrefix RtlIntegerToChar@16 RtlIntegerToUnicodeString@12 +RtlInvertRangeList@8 RtlIsNameLegalDOS8Dot3@12 +RtlIsRangeAvailable@40 RtlLargeIntegerAdd@16 RtlLargeIntegerArithmeticShift@12 RtlLargeIntegerDivide@20 @@ -808,6 +819,7 @@ RtlLengthSid@4 RtlLookupAtomInAtomTable@12 ;RtlLookupElementGenericTable RtlMapGenericMask@8 +RtlMergeRangeLists@16 RtlMoveMemory@12 RtlMultiByteToUnicodeN@20 RtlMultiByteToUnicodeSize@12 diff --git a/reactos/ntoskrnl/ntoskrnl.edf b/reactos/ntoskrnl/ntoskrnl.edf index 4514a03c411..3da53ac294b 100644 --- a/reactos/ntoskrnl/ntoskrnl.edf +++ b/reactos/ntoskrnl/ntoskrnl.edf @@ -1,4 +1,4 @@ -; $Id: ntoskrnl.edf,v 1.167 2004/05/20 12:42:51 ekohl Exp $ +; $Id: ntoskrnl.edf,v 1.168 2004/05/24 12:08:55 ekohl Exp $ ; ; reactos/ntoskrnl/ntoskrnl.def ; @@ -689,6 +689,7 @@ RtlAbsoluteToSelfRelativeSD=RtlAbsoluteToSelfRelativeSD@12 RtlAddAccessAllowedAce=RtlAddAccessAllowedAce@16 RtlAddAce=RtlAddAce@20 RtlAddAtomToAtomTable=RtlAddAtomToAtomTable@12 +RtlAddRange=RtlAddRange@36 ;RtlAllocateAndInitializeSid ;RtlAllocateHeap RtlAnsiCharToUnicodeChar=RtlAnsiCharToUnicodeChar@4 @@ -718,6 +719,7 @@ RtlConvertLongToLargeInteger=RtlConvertLongToLargeInteger@4 RtlConvertSidToUnicodeString=RtlConvertSidToUnicodeString@12 RtlConvertUlongToLargeInteger=RtlConvertUlongToLargeInteger@4 RtlCopyLuid=RtlCopyLuid@8 +RtlCopyRangeList=RtlCopyRangeList@8 RtlCopySid=RtlCopySid@12 RtlCopyString=RtlCopyString@8 RtlCopyUnicodeString=RtlCopyUnicodeString@8 @@ -735,6 +737,8 @@ RtlDecompressFragment=RtlDecompressFragment@32 RtlDeleteAtomFromAtomTable=RtlDeleteAtomFromAtomTable@8 ;RtlDeleteElementGenericTable ;RtlDeleteNoSplay +RtlDeleteOwnersRanges=RtlDeleteOwnersRanges@8 +RtlDeleteRange=RtlDeleteRange@24 RtlDeleteRegistryValue=RtlDeleteRegistryValue@12 RtlDescribeChunk=RtlDescribeChunk@20 RtlDestroyAtomTable=RtlDestroyAtomTable@4 @@ -764,12 +768,14 @@ RtlFindLongestRunClear=RtlFindLongestRunClear@8 RtlFindLongestRunSet=RtlFindLongestRunSet@8 RtlFindMessage=RtlFindMessage@20 RtlFindMostSignificantBit=RtlFindMostSignificantBit@8 +RtlFindRange=RtlFindRange@48 RtlFindSetBits=RtlFindSetBits@12 RtlFindSetBitsAndClear=RtlFindSetBitsAndClear@12 ;RtlFindUnicodePrefix RtlFormatCurrentUserKeyPath=RtlFormatCurrentUserKeyPath@4 RtlFreeAnsiString=RtlFreeAnsiString@4 ;RtlFreeHeap +RtlFreeRangeList=RtlFreeRangeList@4 RtlFreeOemString=RtlFreeOemString@4 RtlFreeUnicodeString=RtlFreeUnicodeString@4 RtlGenerate8dot3Name=RtlGenerate8dot3Name@16 @@ -778,7 +784,9 @@ RtlGetCompressionWorkSpaceSize=RtlGetCompressionWorkSpaceSize@12 RtlGetDaclSecurityDescriptor=RtlGetDaclSecurityDescriptor@16 RtlGetDefaultCodePage=RtlGetDefaultCodePage@8 ;RtlGetElementGenericTable +RtlGetFirstRange=RtlGetFirstRange@12 RtlGetGroupSecurityDescriptor=RtlGetGroupSecurityDescriptor@12 +RtlGetNextRange=RtlGetNextRange@12 RtlGetOwnerSecurityDescriptor=RtlGetOwnerSecurityDescriptor@12 RtlGetVersion=RtlGetVersion@4 RtlImageNtHeader=RtlImageNtHeader@4 @@ -789,13 +797,16 @@ RtlInitString=RtlInitString@8 RtlInitUnicodeString=RtlInitUnicodeString@8 RtlInitializeBitMap=RtlInitializeBitMap@12 ;RtlInitializeGenericTable +RtlInitializeRangeList=RtlInitializeRangeList@4 RtlInitializeSid=RtlInitializeSid@12 ;RtlInitializeUnicodePrefix ;RtlInsertElementGenericTable ;RtlInsertUnicodePrefix RtlIntegerToChar=RtlIntegerToChar@16 RtlIntegerToUnicodeString=RtlIntegerToUnicodeString@12 +RtlInvertRangeList=RtlInvertRangeList@8 RtlIsNameLegalDOS8Dot3=RtlIsNameLegalDOS8Dot3@12 +RtlIsRangeAvailable=RtlIsRangeAvailable@40 RtlLargeIntegerAdd=RtlLargeIntegerAdd@16 RtlLargeIntegerArithmeticShift=RtlLargeIntegerArithmeticShift@12 RtlLargeIntegerDivide=RtlLargeIntegerDivide@20 @@ -809,6 +820,7 @@ RtlLengthSid=RtlLengthSid@4 RtlLookupAtomInAtomTable=RtlLookupAtomInAtomTable@12 ;RtlLookupElementGenericTable RtlMapGenericMask=RtlMapGenericMask@8 +RtlMergeRangeLists=RtlMergeRangeLists@16 RtlMoveMemory=RtlMoveMemory@12 RtlMultiByteToUnicodeN=RtlMultiByteToUnicodeN@20 RtlMultiByteToUnicodeSize=RtlMultiByteToUnicodeSize@12 From e58206820b4d5116f3b5963eed773ff6ab78d497 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Mon, 24 May 2004 20:33:41 +0000 Subject: [PATCH 1216/1463] - Implemented ScsiPortGetPhysicalAddress also for addresses from sense info buffer. - Allocated the sense info buffer within contiguous physical memory. - Don't send an sence request after an error if the miniport driver is autosense-capable. svn path=/trunk/; revision=9487 --- reactos/drivers/storage/scsiport/scsiport.c | 147 +++++++++++--------- 1 file changed, 83 insertions(+), 64 deletions(-) diff --git a/reactos/drivers/storage/scsiport/scsiport.c b/reactos/drivers/storage/scsiport/scsiport.c index 9ba439dd777..e4a1785e3c2 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.56 2004/05/15 22:45:50 hbirr Exp $ +/* $Id: scsiport.c,v 1.57 2004/05/24 20:33:41 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -433,26 +433,37 @@ ScsiPortGetPhysicalAddress(IN PVOID HwDeviceExtension, SCSI_PORT_DEVICE_EXTENSION, MiniPortDeviceExtension); - *Length = 0; - + if (Length != NULL) + { + *Length = 0; + } if (Srb == NULL) { - if ((ULONG_PTR)DeviceExtension->VirtualAddress > (ULONG_PTR)VirtualAddress) - { - PhysicalAddress.QuadPart = 0ULL; - return PhysicalAddress; + EndAddress = DeviceExtension->VirtualAddress + DeviceExtension->CommonBufferLength; + if (VirtualAddress >= DeviceExtension->VirtualAddress && VirtualAddress < EndAddress) + { + Offset = (ULONG_PTR)VirtualAddress - (ULONG_PTR)DeviceExtension->VirtualAddress; + PhysicalAddress.QuadPart = DeviceExtension->PhysicalAddress.QuadPart + Offset; + BufferLength = (ULONG_PTR)EndAddress - (ULONG_PTR)VirtualAddress; } - - Offset = (ULONG_PTR)VirtualAddress - (ULONG_PTR)DeviceExtension->VirtualAddress; - if (Offset >= DeviceExtension->CommonBufferLength) - { - PhysicalAddress.QuadPart = 0ULL; - return PhysicalAddress; + else + { + /* + * The given virtual address is not within the range + * of the drivers uncached extension or srb extension. + */ + /* + * FIXME: + * Check if the address is a sense info buffer of an active srb. + */ + PhysicalAddress = MmGetPhysicalAddress(VirtualAddress); + if (PhysicalAddress.QuadPart == 0LL) + { + CHECKPOINT; + return PhysicalAddress; + } + BufferLength = PAGE_SIZE - PhysicalAddress.u.LowPart % PAGE_SIZE; } - - PhysicalAddress.QuadPart = - DeviceExtension->PhysicalAddress.QuadPart + (ULONGLONG)Offset; - BufferLength = DeviceExtension->CommonBufferLength - Offset; } else { @@ -463,30 +474,27 @@ ScsiPortGetPhysicalAddress(IN PVOID HwDeviceExtension, } else if (VirtualAddress < Srb->DataBuffer || VirtualAddress >= EndAddress) { - PhysicalAddress.QuadPart = 0LL; - return PhysicalAddress; + EndAddress = Srb->SenseInfoBuffer + Srb->SenseInfoBufferLength; + if (VirtualAddress < Srb->SenseInfoBuffer || VirtualAddress >= EndAddress) + { + PhysicalAddress.QuadPart = 0LL; + CHECKPOINT; + return PhysicalAddress; + } } PhysicalAddress = MmGetPhysicalAddress(VirtualAddress); if (PhysicalAddress.QuadPart == 0LL) { + CHECKPOINT; return PhysicalAddress; } - Offset = (ULONG_PTR)VirtualAddress & (PAGE_SIZE - 1); -#if 1 - /* - * FIXME: - * MmGetPhysicalAddress doesn't return the offset within the page. - * We must set the correct offset. - */ - PhysicalAddress.u.LowPart = (PhysicalAddress.u.LowPart & ~(PAGE_SIZE - 1)) + Offset; -#endif - BufferLength += PAGE_SIZE - Offset; + BufferLength = PAGE_SIZE - (ULONG_PTR)VirtualAddress % PAGE_SIZE; while (VirtualAddress + BufferLength < EndAddress) { NextPhysicalAddress = MmGetPhysicalAddress(VirtualAddress + BufferLength); - if (PhysicalAddress.QuadPart + (ULONGLONG)BufferLength != NextPhysicalAddress.QuadPart) + if (PhysicalAddress.QuadPart + BufferLength != NextPhysicalAddress.QuadPart) { break; } @@ -497,9 +505,11 @@ ScsiPortGetPhysicalAddress(IN PVOID HwDeviceExtension, BufferLength = EndAddress - VirtualAddress; } } - - *Length = BufferLength; - + if (Length != NULL) + { + *Length = BufferLength; + } + DPRINT("Address %I64x, Length %d\n", PhysicalAddress.QuadPart, BufferLength); return PhysicalAddress; } @@ -758,13 +768,11 @@ ScsiPortInitialize(IN PVOID Argument1, DeviceExtension->HwStartIo = HwInitializationData->HwStartIo; DeviceExtension->HwInterrupt = HwInitializationData->HwInterrupt; -#if 0 DeviceExtension->AdapterObject = NULL; DeviceExtension->MapRegisterCount = 0; DeviceExtension->PhysicalAddress.QuadPart = 0ULL; DeviceExtension->VirtualAddress = NULL; DeviceExtension->CommonBufferLength = 0; -#endif /* Initialize the device base list */ InitializeListHead (&DeviceExtension->DeviceBaseListHead); @@ -814,36 +822,36 @@ ScsiPortInitialize(IN PVOID Argument1, PortConfig->NumberOfPhysicalBreaks = SP_UNINITIALIZED_VALUE; PortConfig->DmaChannel = SP_UNINITIALIZED_VALUE; PortConfig->DmaPort = SP_UNINITIALIZED_VALUE; -// PortConfig->DmaWidth = -// PortConfig->DmaSpeed = -// PortConfig->AlignmentMask = + PortConfig->DmaWidth = 0; + PortConfig->DmaSpeed = Compatible; + PortConfig->AlignmentMask = 0; PortConfig->NumberOfAccessRanges = HwInitializationData->NumberOfAccessRanges; -// PortConfig->NumberOfBuses = + PortConfig->NumberOfBuses = 0; for (i = 0; i < SCSI_MAXIMUM_BUSES; i++) PortConfig->InitiatorBusId[i] = 255; -// PortConfig->ScatterGather = -// PortConfig->Master = -// PortConfig->CachesData = -// PortConfig->AdapterScansDown = + PortConfig->ScatterGather = FALSE; + PortConfig->Master = FALSE; + PortConfig->CachesData = FALSE; + PortConfig->AdapterScansDown = FALSE; PortConfig->AtdiskPrimaryClaimed = SystemConfig->AtDiskPrimaryAddressClaimed; PortConfig->AtdiskSecondaryClaimed = SystemConfig->AtDiskSecondaryAddressClaimed; -// PortConfig->Dma32BitAddresses = -// PortConfig->DemandMode = + PortConfig->Dma32BitAddresses = FALSE; + PortConfig->DemandMode = FALSE; PortConfig->MapBuffers = HwInitializationData->MapBuffers; PortConfig->NeedPhysicalAddresses = HwInitializationData->NeedPhysicalAddresses; PortConfig->TaggedQueuing = HwInitializationData->TaggedQueueing; PortConfig->AutoRequestSense = HwInitializationData->AutoRequestSense; PortConfig->MultipleRequestPerLu = HwInitializationData->MultipleRequestPerLu; PortConfig->ReceiveEvent = HwInitializationData->ReceiveEvent; -// PortConfig->RealModeInitialized = -// PortConfig->BufferAccessScsiPortControlled = + PortConfig->RealModeInitialized = FALSE; + PortConfig->BufferAccessScsiPortControlled = FALSE; PortConfig->MaximumNumberOfTargets = SCSI_MAXIMUM_TARGETS; -// PortConfig->MaximumNumberOfLogicalUnits = SCSI_MAXIMUM_LOGICAL_UNITS; +// PortConfig->MaximumNumberOfLogicalUnits = SCSI_MAXIMUM_LOGICAL_UNITS; - PortConfig->SrbExtensionSize = HwInitializationData->SrbExtensionSize; - PortConfig->SpecificLuExtensionSize = HwInitializationData->SpecificLuExtensionSize; + PortConfig->SrbExtensionSize = HwInitializationData->SrbExtensionSize; + PortConfig->SpecificLuExtensionSize = HwInitializationData->SpecificLuExtensionSize; PortConfig->SlotNumber = SlotNumber.u.AsULONG; @@ -1903,6 +1911,7 @@ SpiScanAdapter (IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension) else { SpiRemoveLunExtension (LunExtension); + break; } } } @@ -2070,14 +2079,19 @@ static PSCSI_REQUEST_BLOCK ScsiPortInitSenseRequestSrb(PSCSI_REQUEST_BLOCK OriginalSrb) { PSCSI_REQUEST_BLOCK Srb; + ULONG Length; PCDB Cdb; + Length = sizeof(SCSI_REQUEST_BLOCK) + sizeof(SENSE_DATA) + 32; Srb = ExAllocatePoolWithTag(NonPagedPool, - sizeof(SCSI_REQUEST_BLOCK) + sizeof(SENSE_DATA), - TAG('S', 'S', 'r', 'b')); + Length, + TAG('S', 'S', 'r', 'b')); + if (Srb == NULL) + { + return NULL; + } - RtlZeroMemory(Srb, - sizeof(SCSI_REQUEST_BLOCK) + sizeof(SENSE_DATA)); + RtlZeroMemory(Srb, Length); Srb->PathId = OriginalSrb->PathId; Srb->TargetId = OriginalSrb->TargetId; @@ -2089,7 +2103,12 @@ ScsiPortInitSenseRequestSrb(PSCSI_REQUEST_BLOCK OriginalSrb) Srb->TimeOutValue = 4; Srb->CdbLength = 6; - Srb->DataBuffer = Srb + 1; + /* The DataBuffer must be located in contiguous physical memory if + * the miniport driver uses dma for the sense info. The size of + * the sense data is 18 byte. If the buffer starts at a 32 byte + * boundary than is the buffer always in one memory page. + */ + Srb->DataBuffer = (PVOID)ROUND_UP((ULONG_PTR)(Srb + 1), 32); Srb->DataTransferLength = sizeof(SENSE_DATA); Cdb = (PCDB)Srb->Cdb; @@ -2625,18 +2644,18 @@ SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, DPRINT("SenseCode: %x\n", SenseInfoBuffer->AdditionalSenseCode); /* Copy sense data */ - if (OriginalSrb->SenseInfoBufferLength != 0) - { - RtlCopyMemory(OriginalSrb->SenseInfoBuffer, - SenseInfoBuffer, - sizeof(SENSE_DATA)); - OriginalSrb->SrbStatus |= SRB_STATUS_AUTOSENSE_VALID; - } + RtlCopyMemory(OriginalSrb->SenseInfoBuffer, + SenseInfoBuffer, + sizeof(SENSE_DATA)); + OriginalSrb->SrbStatus |= SRB_STATUS_AUTOSENSE_VALID; ExFreePool(Srb); CompleteThisRequest = TRUE; } - else if ((SRB_STATUS(Srb->SrbStatus) != SRB_STATUS_SUCCESS) && - (Srb->ScsiStatus == SCSISTAT_CHECK_CONDITION)) + else if (SRB_STATUS(Srb->SrbStatus) != SRB_STATUS_SUCCESS && + Srb->ScsiStatus == SCSISTAT_CHECK_CONDITION && + Srb->SenseInfoBuffer != NULL && + Srb->SenseInfoBufferLength >= sizeof(SENSE_DATA) && + !(Srb->SrbStatus & SRB_STATUS_AUTOSENSE_VALID)) { DPRINT("SCSIOP_REQUEST_SENSE required!\n"); From 6368fbd7a81588649cb7fcf2b146eefad544b7fe Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Tue, 25 May 2004 15:52:45 +0000 Subject: [PATCH 1217/1463] - Support for window-less hotkeys. - Send hotkeys even if there's no focus window. svn path=/trunk/; revision=9488 --- reactos/subsys/win32k/ntuser/hotkey.c | 31 +++++++----- reactos/subsys/win32k/ntuser/input.c | 69 +++++++++++++-------------- 2 files changed, 51 insertions(+), 49 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/hotkey.c b/reactos/subsys/win32k/ntuser/hotkey.c index 44db4b110e7..f50f2c2dd02 100644 --- a/reactos/subsys/win32k/ntuser/hotkey.c +++ b/reactos/subsys/win32k/ntuser/hotkey.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: hotkey.c,v 1.9 2004/05/10 17:07:18 weiden Exp $ +/* $Id: hotkey.c,v 1.10 2004/05/25 15:52:44 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -210,20 +210,30 @@ NtUserRegisterHotKey(HWND hWnd, PHOT_KEY_ITEM HotKeyItem; PWINDOW_OBJECT Window; PWINSTATION_OBJECT WinStaObject = NULL; + PETHREAD HotKeyThread; - Window = IntGetWindowObject(hWnd); - if(!Window) + if (hWnd == NULL) { - SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); - return FALSE; + HotKeyThread = PsGetCurrentThread(); } + else + { + Window = IntGetWindowObject(hWnd); + if(!Window) + { + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + return FALSE; + } + HotKeyThread = Window->OwnerThread; + IntReleaseWindowObject(Window); + } + - if(Window->OwnerThread->ThreadsProcess && Window->OwnerThread->ThreadsProcess->Win32Process) - WinStaObject = Window->OwnerThread->ThreadsProcess->Win32Process->WindowStation; + if(HotKeyThread->ThreadsProcess && HotKeyThread->ThreadsProcess->Win32Process) + WinStaObject = HotKeyThread->ThreadsProcess->Win32Process->WindowStation; if(!WinStaObject) { - IntReleaseWindowObject(Window); return FALSE; } @@ -233,7 +243,6 @@ NtUserRegisterHotKey(HWND hWnd, if (IsHotKey (WinStaObject, fsModifiers, vk)) { IntUnLockHotKeys(WinStaObject); - IntReleaseWindowObject(Window); return FALSE; } @@ -241,11 +250,10 @@ NtUserRegisterHotKey(HWND hWnd, if (HotKeyItem == NULL) { IntUnLockHotKeys(WinStaObject); - IntReleaseWindowObject(Window); return FALSE; } - HotKeyItem->Thread = PsGetCurrentThread(); + HotKeyItem->Thread = HotKeyThread; HotKeyItem->hWnd = hWnd; HotKeyItem->id = id; HotKeyItem->fsModifiers = fsModifiers; @@ -256,7 +264,6 @@ NtUserRegisterHotKey(HWND hWnd, IntUnLockHotKeys(WinStaObject); - IntReleaseWindowObject(Window); return TRUE; } diff --git a/reactos/subsys/win32k/ntuser/input.c b/reactos/subsys/win32k/ntuser/input.c index f2ff2a0fb25..039b607879e 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.33 2004/05/14 23:57:32 weiden Exp $ +/* $Id: input.c,v 1.34 2004/05/25 15:52:45 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -30,12 +30,8 @@ /* INCLUDES ******************************************************************/ #include <w32k.h> - #include <rosrtl/string.h> -#define NDEBUG -#include <debug.h> - /* GLOBALS *******************************************************************/ #define ENABLEMOUSEGDICALLBACK 1 @@ -238,14 +234,24 @@ KeyboardThreadMain(PVOID StartContext) lParam |= (1 << 29); } - if(KeyEvent.bKeyDown && (fsModifiers & MOD_ALT)) - msg.message = WM_SYSKEYDOWN; - else if(KeyEvent.bKeyDown) - msg.message = WM_KEYDOWN; - else if(fsModifiers & MOD_ALT) - msg.message = WM_SYSKEYUP; - else - msg.message = WM_KEYUP; + if (GetHotKey(InputWindowStation, + fsModifiers, + KeyEvent.wVirtualKeyCode, + &Thread, + &hWnd, + &id)) + { + if (KeyEvent.bKeyDown) + { + DPRINT("Hot key pressed (hWnd %lx, id %d)\n", hWnd, id); + MsqPostHotKeyMessage (Thread, + hWnd, + (WPARAM)id, + MAKELPARAM((WORD)fsModifiers, + (WORD)msg.wParam)); + } + continue; + } /* Find the target thread whose locale is in effect */ if (!IntGetScreenDC()) @@ -259,6 +265,15 @@ KeyboardThreadMain(PVOID StartContext) if (!FocusQueue) continue; + if(KeyEvent.bKeyDown && (fsModifiers & MOD_ALT)) + msg.message = WM_SYSKEYDOWN; + else if(KeyEvent.bKeyDown) + msg.message = WM_KEYDOWN; + else if(fsModifiers & MOD_ALT) + msg.message = WM_SYSKEYUP; + else + msg.message = WM_KEYUP; + msg.wParam = KeyEvent.wVirtualKeyCode; msg.lParam = lParam; msg.hwnd = FocusQueue->FocusWindow; @@ -274,30 +289,10 @@ KeyboardThreadMain(PVOID StartContext) else continue; - if (GetHotKey(InputWindowStation, - fsModifiers, - msg.wParam, - &Thread, - &hWnd, - &id)) - { - if (KeyEvent.bKeyDown) - { - DPRINT("Hot key pressed (hWnd %lx, id %d)\n", hWnd, id); - MsqPostHotKeyMessage (Thread, - hWnd, - (WPARAM)id, - MAKELPARAM((WORD)fsModifiers, - (WORD)msg.wParam)); - } - } - else - { - /* - * Post a keyboard message. - */ - MsqPostKeyboardMessage(msg.message,msg.wParam,msg.lParam); - } + /* + * Post a keyboard message. + */ + MsqPostKeyboardMessage(msg.message,msg.wParam,msg.lParam); } DPRINT( "KeyboardInput Thread Stopped...\n" ); } From 7a98b74d8bdbb037acacc6420611dca7f29d42d2 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Tue, 25 May 2004 15:53:16 +0000 Subject: [PATCH 1218/1463] - Run Task Manager when CTRL-ALT-DEL is pressed. svn path=/trunk/; revision=9489 --- reactos/subsys/system/winlogon/winlogon.c | 78 ++++++++++++++++++++++- 1 file changed, 75 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/system/winlogon/winlogon.c b/reactos/subsys/system/winlogon/winlogon.c index 7365f34609e..7dd5bd4ab1d 100644 --- a/reactos/subsys/system/winlogon/winlogon.c +++ b/reactos/subsys/system/winlogon/winlogon.c @@ -1,4 +1,4 @@ -/* $Id: winlogon.c,v 1.29 2004/03/28 12:21:41 weiden Exp $ +/* $Id: winlogon.c,v 1.30 2004/05/25 15:53:16 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -287,6 +287,54 @@ static BOOL RestartShell(void) } */ +VOID STDCALL +RegisterHotKeys(VOID) +{ + RegisterHotKey(NULL, 0, MOD_ALT | MOD_CONTROL, VK_DELETE); +} + +VOID STDCALL +UnregisterHotKeys(VOID) +{ + UnregisterHotKey(NULL, 0); +} + +VOID STDCALL +HandleHotKey(MSG *Msg) +{ + DbgPrint("HOTKEY: Got hot key (%d)\n", Msg->wParam); + + /* CTRL-ALT-DEL */ + if (Msg->wParam == 0) + { + STARTUPINFO StartupInfo; + PROCESS_INFORMATION ProcessInformation; + + StartupInfo.cb = sizeof(StartupInfo); + StartupInfo.lpReserved = NULL; + StartupInfo.lpDesktop = NULL; + StartupInfo.lpTitle = NULL; + StartupInfo.dwFlags = 0; + StartupInfo.cbReserved2 = 0; + StartupInfo.lpReserved2 = 0; + + CreateProcessW( + L"taskmgr.exe", + NULL, + NULL, + NULL, + FALSE, + CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS, + NULL, + NULL, + &StartupInfo, + &ProcessInformation); + + CloseHandle (ProcessInformation.hProcess); + CloseHandle (ProcessInformation.hThread); + } +} + #if SUPPORT_CONSOLESTART static BOOL StartIntoGUI(VOID) { @@ -371,6 +419,7 @@ DoLogonUser (PWCHAR Name, PROFILEINFOW ProfileInfo; BOOL Result; LPVOID lpEnvironment = NULL; + MSG Msg; Result = LogonUserW (Name, NULL, @@ -443,7 +492,25 @@ 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) + { + if (PeekMessage(&Msg, 0, 0, 0, PM_REMOVE)) + { + if (Msg.message == WM_HOTKEY) + HandleHotKey(&Msg); + TranslateMessage(&Msg); + DispatchMessage(&Msg); + } + } + + UnregisterHotKeys(); +#endif CloseHandle (ProcessInformation.hProcess); CloseHandle (ProcessInformation.hThread); @@ -459,7 +526,6 @@ DoLogonUser (PWCHAR Name, } #endif - int STDCALL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, @@ -656,9 +722,13 @@ WinMain(HINSTANCE hInstance, else { #endif + + RegisterHotKeys(); - SessionLoop(WLSession); + SessionLoop(WLSession); + UnregisterHotKeys(); + /* FIXME - Flush disks and registry, ... */ if(WLSession->LogonStatus == LOGON_SHUTDOWN) @@ -833,6 +903,8 @@ SessionLoop(PWLSESSION Session) /* Message loop for the SAS window */ while(GetMessage(&Msg, 0, 0, 0)) { + if (Msg.message == WM_HOTKEY) + HandleHotKey(&Msg); TranslateMessage(&Msg); DispatchMessage(&Msg); } From 0f711c642b41242c6649c13c5ba4ff332403c59f Mon Sep 17 00:00:00 2001 From: Aleksey Bragin <aleksey@reactos.org> Date: Tue, 25 May 2004 18:49:04 +0000 Subject: [PATCH 1219/1463] New version of man by Semyon Novikov. Manual pages should be located in c:\\man for now, later it will be enhanced to environment variable. I have changed the makefile so it is compatible with ReactOS, and compiles just by running 'make'. There are some warnings also, but I didn't have time to fix them. svn path=/trunk/; revision=9490 --- rosapps/sysutils/man/makefile | 23 +++ rosapps/sysutils/man/man.c | 229 +++++++++++++++++++++++++++++ rosapps/sysutils/man/used_tags.txt | 7 + 3 files changed, 259 insertions(+) create mode 100644 rosapps/sysutils/man/makefile create mode 100644 rosapps/sysutils/man/man.c create mode 100644 rosapps/sysutils/man/used_tags.txt diff --git a/rosapps/sysutils/man/makefile b/rosapps/sysutils/man/makefile new file mode 100644 index 00000000000..db1f877d80a --- /dev/null +++ b/rosapps/sysutils/man/makefile @@ -0,0 +1,23 @@ +# + +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = console + +TARGET_NAME = man + +TARGET_SDKLIBS = ntdll.a + +TARGET_CFLAGS = -D__USE_W32API -Wall + +TARGET_OBJECTS = $(TARGET_NAME).o + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/sysutils/man/man.c b/rosapps/sysutils/man/man.c new file mode 100644 index 00000000000..8c192a02439 --- /dev/null +++ b/rosapps/sysutils/man/man.c @@ -0,0 +1,229 @@ +/* + * FILE : man.c + * NATIVE NAME: ReactOS manual browser + * AUTHOR : Semyon Novikov (tappak) + * PROJECT : ReactOS Operating System + * DESCRIPTION: manual file browser (Use Linux man file syntax) + * DATE : 2004-03-29 + * LICENSE : GPL + */ + + /* Known issues. + * 1. Scroll screen + * 2. Non ENVIRONMENT manpath varrible + * 3. At the end of man page must be ./" tag! + */ + + +#include <stdio.h> +#include <string.h> +#include <windows.h> +#include <wincon.h> + +#define MAXLINE 256 +#define BOLD 7|9 +#define ITALIC 3|9 +#define NORMAL 7|0 + +/*===[functions]===*/ +void SetCl(WORD cl); +int OpenF(char* name); +int CloseF(void); +void Usage(void); +int AnalyzeArgv(char *); +int AnalyzeFile(); +/*=================*/ + +/*====[Globals]====*/ +FILE* manfile; +char OpenFlag=0; +char manpath[MAXLINE]="c:\\man\\"; +/*=================*/ + +void +SetCl(WORD cl) +{ + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),cl); +} + +int +OpenF(char* name) +{ + int retval=0; + char *manpath_local=(char*)malloc(sizeof(char)*MAXLINE); + + strcpy(manpath_local, manpath); //save mandir value + + if((manfile=fopen((strcat(manpath_local,name)),"r"))!=NULL) + { + OpenFlag=1; + AnalyzeFile(); + } + else + retval=-1; + + strcpy(manpath_local, manpath); + return retval; +} + +int +CloseF() +{ + int retval=0; + + if(fclose(manfile)) + OpenFlag=0; + else retval=-1; + + return retval; +} + +void +Usage() +{ + puts("usage: man [command]"); + puts("see \"man man\" for details"); +} + +int +AnalyzeArgv(char *argument) +{ + char element=0; + char HelpFlag=0; + char *keys[]={"--help","/h","/?","-h"}; + char *sections[]={".1",".2",".3",".4",".5",".6",".7",".8",".9"}; + char *filename=(char*)malloc(sizeof(char)*MAXLINE); + + strcpy(filename,argument); //save argument value + + for(element=0; element < 5;element++) + if(!strcmp(keys[element],argument)) + { + Usage(); + HelpFlag=1; + } + + element = 0; + + if(!HelpFlag) + + if(OpenF(filename)) + while(OpenF(strcat(filename,sections[element])) && (element<9)) + { + strcpy(filename,argument); + element++; + } + + if(element>8) printf("No manual for %s\n",argument); + + return element; +} + +int +AnalyzeFile() +{ + char *cur_string=(char*)malloc(sizeof(char)*MAXLINE); + char symbol=0; + char *THtag=(char*)malloc(sizeof(char)*MAXLINE); + + + void sh_outp(void) + { + putchar('\n'); + putchar('\n'); + for(symbol=3;putchar(cur_string[symbol]); symbol++); + } + + void th_outp(void) + { + putchar('\n'); + putchar('\n'); + putchar('\t'); + putchar('\t'); + SetCl(ITALIC); + for(symbol=3;putchar(THtag[symbol]); symbol++); + putchar('\n'); + SetCl(NORMAL); + } + + void text_outp(void) + { + char TagFlag=0; + symbol=0; + + if(cur_string[0]=='.') + while(cur_string[symbol]!=' ') + symbol++; + + if(symbol) TagFlag=1; + + for(symbol;cur_string[symbol]!='\n'; symbol++) + putchar(cur_string[symbol]); + putchar(' '); + } + + while(fgets(cur_string,MAXLINE,manfile)) + +/* TAGs processing */ + if((cur_string[0]=='.')&&(cur_string[1]=='S')&& + (cur_string[2]=='H')) // .SH tag + { + SetCl(BOLD); + sh_outp(); + SetCl(NORMAL); + } + else + if((cur_string[0]=='.')&&(cur_string[1]=='I')&& + (cur_string[2]==' ')) // .I tag + { + SetCl(ITALIC); + text_outp(); + SetCl(NORMAL); + } + else + if((cur_string[0]=='.')&&(cur_string[1]=='/')&& + (cur_string[2]=='\"')); // ./" tag (comment) + + else + if((cur_string[0]=='.')&&(cur_string[1]=='T')&& + (cur_string[2]=='H')) // .TH tag + { + strcpy(THtag,cur_string); + } + else + if((cur_string[0]=='.')&&(cur_string[1]=='B')&& + (cur_string[2]==' ')) // .B tag + { + SetCl(BOLD); + text_outp(); + SetCl(NORMAL); + } + else + if((cur_string[0]=='.')&&(cur_string[1]=='N')&& + (cur_string[2]=='L')) + { + putchar('\n'); + putchar(' '); + } + + else text_outp(); // print plane text + th_outp(); +/* END of TAGs processing */ +} + + +int +main(int argc, char *argv[]) +{ + + switch(argc) + { + case 1: Usage(); break; + case 2: AnalyzeArgv(argv[1]);break; + default: Usage();break; + } + + if(OpenFlag)CloseF(); + SetCl(NORMAL); +} + diff --git a/rosapps/sysutils/man/used_tags.txt b/rosapps/sysutils/man/used_tags.txt new file mode 100644 index 00000000000..79aa27c66a4 --- /dev/null +++ b/rosapps/sysutils/man/used_tags.txt @@ -0,0 +1,7 @@ +.B bold +.I italic +.SH section (BOLD string without /n) +.TH at the end (page comment) +.NL +.\" comment + From f11893f56ed7f5ce5dc2d05733fad201882dfb25 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin <aleksey@reactos.org> Date: Tue, 25 May 2004 18:50:54 +0000 Subject: [PATCH 1220/1463] Sample man files svn path=/trunk/; revision=9491 --- rosapps/sysutils/man/man/foo.1 | 78 +++++++++++++++++++++++++ rosapps/sysutils/man/man/man.1 | 100 +++++++++++++++++++++++++++++++++ 2 files changed, 178 insertions(+) create mode 100644 rosapps/sysutils/man/man/foo.1 create mode 100644 rosapps/sysutils/man/man/man.1 diff --git a/rosapps/sysutils/man/man/foo.1 b/rosapps/sysutils/man/man/foo.1 new file mode 100644 index 00000000000..f18971771a7 --- /dev/null +++ b/rosapps/sysutils/man/man/foo.1 @@ -0,0 +1,78 @@ +.\" Process this file with +.\" groff -man -Tascii foo.1 +.\" +.TH FOO 1 "MARCH 1995" Linux "User Manuals" +.SH NAME +foo \- frobnicate the bar library +.SH SYNOPSIS +.B foo [-bar] [-c +.I config-file +.B ] +.I file +.B ... +.SH DESCRIPTION +.B foo +frobnicates the bar library by tweaking internal +symbol tables. By default it parses all baz segments +and rearranges them in reverse order by time for the +.BR xyzzy (1) +linker to find them. The symdef entry is then compressed +using the WBG (Whiz-Bang-Gizmo) algorithm. +All files are processed in the order specified. +.SH OPTIONS +.IP -b +Do not write 'busy' to stdout while processing. +.IP "-c config-file" +Use the alternate system wide +.I config-file +instead of +.IR /etc/foo.conf . +This overrides any +.B FOOCONF +environment variable. +.IP -a +In addition to the baz segments, also parse the +blurfl headers. +.IP -r +Recursive mode. Operates as fast as lightning +at the expense of a megabyte of virtual memory. +.SH FILES +.I /etc/foo.conf +.RS +The system wide configuration file. See +.BR foo (5) +for further details. +.RE +.I ~/.foorc +.RS +Per user configuration file. See +.BR foo (5) +for further details. +.SH ENVIRONMENT +.IP FOOCONF +If non-null the full pathname for an alternate system wide +.IR foo.conf . +Overridden by the +.B -c +option. +.SH DIAGNOSTICS +The following diagnostics may be issued on stderr: + +Bad magic number. +.RS +The input file does not look like an archive file. +.RE +Old style baz segments. +.RS +.B foo +can only handle new style baz segments. COBOL +object libraries are not supported in this version. +.SH BUGS +The command name should have been chosen more carefully +to reflect its purpose. +.SH AUTHOR +Jens Schweikhardt <schweikh@noc.dfn.de> +.SH "SEE ALSO" +.BR bar (1), +.BR foo (5), +.BR xyzzy (1) \ No newline at end of file diff --git a/rosapps/sysutils/man/man/man.1 b/rosapps/sysutils/man/man/man.1 new file mode 100644 index 00000000000..429cc1d60db --- /dev/null +++ b/rosapps/sysutils/man/man/man.1 @@ -0,0 +1,100 @@ +./" My first man page for ReactOS :) +.TH ReactOS manual project 2004 + +.SH NAME +man.exe - manual browser for ReactOS +.SH SYNOPSIS +.B man [ +.I manual page +.B ] +.SH DESCRIPTION +This project is UNIX(tm) man compatible tool for ReactOS. +.NL +Manual browser support next tags: +.NL +.I ./" +as comment tag +.NL +.I .NL +as "new line" tag (ReactOS only) +.NL +.I .B + as "bold" tag +.NL +.I .I + as "italic" tag +.NL +.I .SH + as part tag +.NL +.I .TH + as page descriptor +.NL +.SH OPTIONS +At this moment man support only +.B "/?, /h, -h, --help" +arguments :) +.SH FILES +Now all of manual pages must be in +.B c:\man\ +directory. This is hack or +bug, i don't know... We planed use ENVIRONMENT +varrible to set manual path. +.NL +Manual files should have extension which marks section of his content. +.NL +.SH SECTIONS +.B (1) +basic commands. (dir,del,man,etc...) +.NL +.B (2) +kernel calls +.NL +.B (3) +calls from system librares +.NL +.B (4) +device files or devices +.NL +.B (5) +file syntax description +.NL +.B (6) +games +.NL +.B (7) +different information (such as licences, manifestos, etc...) +.NL +.B (8) +administration tools (Admin or root only) +.NL +.B (9) +additional kernel information +.NL + +.SH ENVIRONMENT +Comming soon +.SH BUGS +Heh... A lot of. For example: +.NL +.I Scroll-bug +man can't correctly scroll screen +.NL +.I .NL hack +tag who absent in original man +.NL +.I ./" hack +at the end of man file must be ./" tag +.NL +.I putchar() method +all text displays with putchar() function. +.NL + And we have non correct word carry. + +.SH AUTHOR +Semyon <tappak> Novikov +.NL +.I <tappak@freemail.ru> +.NL +Sorry for my English. I'm just a Russian first-year student. +./" \ No newline at end of file From 5a22e5bcf080f86711c2d5d3435654e99da21eca Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Tue, 25 May 2004 20:04:14 +0000 Subject: [PATCH 1221/1463] - Fixed definition of assert macro. - Fixed few DPRINTs to compile. - Handle OF_CREATE flag of OpenFile. svn path=/trunk/; revision=9492 --- reactos/lib/kernel32/file/file.c | 65 +++++++++++++++++++--------- reactos/lib/kernel32/include/debug.h | 2 +- reactos/lib/kernel32/mem/section.c | 6 +-- 3 files changed, 49 insertions(+), 24 deletions(-) diff --git a/reactos/lib/kernel32/file/file.c b/reactos/lib/kernel32/file/file.c index 80d24faea74..7c50bcaaa2a 100644 --- a/reactos/lib/kernel32/file/file.c +++ b/reactos/lib/kernel32/file/file.c @@ -1,4 +1,4 @@ -/* $Id: file.c,v 1.53 2004/03/18 18:29:18 weiden Exp $ +/* $Id: file.c,v 1.54 2004/05/25 20:04:13 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -89,19 +89,22 @@ OpenFile(LPCSTR lpFileName, RtlAnsiStringToUnicodeString (&FileNameU, &FileName, TRUE); else RtlOemStringToUnicodeString (&FileNameU, &FileName, TRUE); - - Len = SearchPathW (NULL, - FileNameU.Buffer, - NULL, - OFS_MAXPATHNAME, - PathNameW, - &FilePart); - - RtlFreeUnicodeString(&FileNameU); - - if (Len == 0 || Len > OFS_MAXPATHNAME) + + if ((uStyle & OF_CREATE) == 0) { - return (HFILE)INVALID_HANDLE_VALUE; + Len = SearchPathW (NULL, + FileNameU.Buffer, + NULL, + OFS_MAXPATHNAME, + PathNameW, + &FilePart); + + RtlFreeUnicodeString(&FileNameU); + + if (Len == 0 || Len > OFS_MAXPATHNAME) + { + return (HFILE)INVALID_HANDLE_VALUE; + } } FileName.Buffer = lpReOpenBuff->szPathName; @@ -124,13 +127,6 @@ OpenFile(LPCSTR lpFileName, return (HFILE)INVALID_HANDLE_VALUE; } - ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES); - ObjectAttributes.RootDirectory = NULL; - ObjectAttributes.ObjectName = &FileNameString; - ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE| OBJ_INHERIT; - ObjectAttributes.SecurityDescriptor = NULL; - ObjectAttributes.SecurityQualityOfService = NULL; - // FILE_SHARE_READ // FILE_NO_INTERMEDIATE_BUFFERING @@ -140,6 +136,35 @@ OpenFile(LPCSTR lpFileName, return (HFILE)NULL; } + if ((uStyle & OF_CREATE) == OF_CREATE) + { + DWORD Sharing; + switch (uStyle & 0x70) + { + case OF_SHARE_EXCLUSIVE: Sharing = 0; break; + case OF_SHARE_DENY_WRITE: Sharing = FILE_SHARE_READ; break; + case OF_SHARE_DENY_READ: Sharing = FILE_SHARE_WRITE; break; + case OF_SHARE_DENY_NONE: + case OF_SHARE_COMPAT: + default: + Sharing = FILE_SHARE_READ | FILE_SHARE_WRITE; + } + return (HFILE) CreateFileA (lpFileName, + GENERIC_READ | GENERIC_WRITE, + Sharing, + NULL, + CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL, + 0); + } + + ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES); + ObjectAttributes.RootDirectory = NULL; + ObjectAttributes.ObjectName = &FileNameString; + ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE| OBJ_INHERIT; + ObjectAttributes.SecurityDescriptor = NULL; + ObjectAttributes.SecurityQualityOfService = NULL; + errCode = NtOpenFile (&FileHandle, GENERIC_READ|SYNCHRONIZE, &ObjectAttributes, diff --git a/reactos/lib/kernel32/include/debug.h b/reactos/lib/kernel32/include/debug.h index 45a87555015..a0ddb9833f4 100644 --- a/reactos/lib/kernel32/include/debug.h +++ b/reactos/lib/kernel32/include/debug.h @@ -16,7 +16,7 @@ #ifdef assert #undef assert #endif -#define assert(x) do { if(!x) RtlAssert(x, __FILE__,__LINE__, ""); } while(0); +#define assert(x) do { if(!x) RtlAssert("#x", __FILE__,__LINE__, ""); } while(0); #endif #define DPRINT1(args...) do { DbgPrint("(KERNEL32:%s:%d) ",__FILE__,__LINE__); DbgPrint(args); } while(0); diff --git a/reactos/lib/kernel32/mem/section.c b/reactos/lib/kernel32/mem/section.c index fcc397a4939..5590c377328 100644 --- a/reactos/lib/kernel32/mem/section.c +++ b/reactos/lib/kernel32/mem/section.c @@ -1,4 +1,4 @@ -/* $Id: section.c,v 1.24 2004/02/08 10:42:15 jfilby Exp $ +/* $Id: section.c,v 1.25 2004/05/25 20:04:14 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -66,7 +66,7 @@ CreateFileMappingA(HANDLE hFile, FileStandardInformation); if (!NT_SUCCESS(Status)) { - DPRINT("Status 0x%08x obtaining FileStandardInformation for source\n", errCode); + DPRINT("Status 0x%08x obtaining FileStandardInformation for source\n", Status); SetLastErrorByStatus(Status); return NULL; } @@ -149,7 +149,7 @@ CreateFileMappingW(HANDLE hFile, FileStandardInformation); if (!NT_SUCCESS(Status)) { - DPRINT("Status 0x%08x obtaining FileStandardInformation for source\n", errCode); + DPRINT("Status 0x%08x obtaining FileStandardInformation for source\n", Status); SetLastErrorByStatus(Status); return NULL; } From 470210fb06e00bc30a0142f6bdd9a8aa0e0233db Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Tue, 25 May 2004 21:31:27 +0000 Subject: [PATCH 1222/1463] - Enabled the 'Press any key to boot from CD' message in the ISO boot code and show it only when some hard disk is present. - Adjusted detection timeouts for PS/2 and RS232 to the minimum allowed by the specifications so we don't spend ages in hardware detection. - Experimental NTFS reading support. (No boot code, no attribute lists, no decompression) svn path=/trunk/; revision=9493 --- freeldr/bootsect/isoboot.asm | 21 +++++++++++---------- freeldr/freeldr/CHANGELOG | 8 ++++++++ freeldr/freeldr/Makefile | 1 + freeldr/freeldr/arch/i386/hardware.c | 18 +++++++++--------- freeldr/freeldr/fs/fs.c | 25 +++++++++++++++++++++++++ freeldr/freeldr/fs/fsrec.c | 23 +++++++++++++++++++++++ freeldr/freeldr/fs/fsrec.h | 1 + freeldr/freeldr/include/disk.h | 1 + freeldr/freeldr/include/version.h | 4 ++-- 9 files changed, 81 insertions(+), 21 deletions(-) diff --git a/freeldr/bootsect/isoboot.asm b/freeldr/bootsect/isoboot.asm index 89f9752fa4b..c6ef9bd44da 100644 --- a/freeldr/bootsect/isoboot.asm +++ b/freeldr/bootsect/isoboot.asm @@ -33,7 +33,7 @@ ; Note: The Makefile builds one version with DEBUG_MESSAGES automatically. ;%define DEBUG_MESSAGES ; Uncomment to get debugging messages - +%define WAIT_FOR_KEY ; --------------------------------------------------------------------------- @@ -139,6 +139,14 @@ relocate: jmp .kbd_buffer_test .kbd_buffer_empty: + ; Check if there is harddisk + pusha + mov ax, 0800h + mov dx, 0080h + int 13h + popa + jc .boot_cdrom + ; Display the 'Press key' message and wait for a maximum of 5 seconds call crlf mov si, presskey_msg ; si points to 'Press key' message @@ -164,6 +172,8 @@ relocate: jmp .next_second .boot_harddisk: + call crlf + ; Boot first harddisk (drive 0x80) mov ax, 0201h mov dx, 0080h @@ -998,12 +1008,3 @@ MaxTransfer dw 2 ;32 ; Max sectors per transfer times 2046-($-$$) db 0 ; Pad to file offset 2046 dw 0aa55h ; BootSector signature - - - - - - - - - diff --git a/freeldr/freeldr/CHANGELOG b/freeldr/freeldr/CHANGELOG index 36b13baed63..3e9685cdcf2 100644 --- a/freeldr/freeldr/CHANGELOG +++ b/freeldr/freeldr/CHANGELOG @@ -1,3 +1,11 @@ +Changes in v1.8.21 (21/05/2004) (navaraf) + +- Experimental NTFS reading support with no boot code yet. +- Adjusted detection timeouts for PS/2 and RS232 to the minimum + allowed by the specifications. +- Enabled the 'Press any key to boot from CD' message in the ISO + boot code and show it only when some hard disk is present. + Changes in v1.8.20 (21/05/2004) (navaraf) - Added support for special value "LiveCD" of SystemPath option diff --git a/freeldr/freeldr/Makefile b/freeldr/freeldr/Makefile index df4ad1eea15..f491077819e 100644 --- a/freeldr/freeldr/Makefile +++ b/freeldr/freeldr/Makefile @@ -249,6 +249,7 @@ FS_OBJS = fs.o \ fat.o \ iso.o \ ext2.o \ + ntfs.o \ fsrec.o UI_OBJS = tui.o \ diff --git a/freeldr/freeldr/arch/i386/hardware.c b/freeldr/freeldr/arch/i386/hardware.c index 5b5838ddb03..84f2e3fadfb 100644 --- a/freeldr/freeldr/arch/i386/hardware.c +++ b/freeldr/freeldr/arch/i386/hardware.c @@ -719,13 +719,13 @@ DetectMicrosoftMouse(U32 Port) { CHAR Buffer[4]; U32 i; - U32 TimeOut = 250; + U32 TimeOut = 200; U8 LineControl; /* Shutdown mouse or something like that */ LineControl = READ_PORT_UCHAR((PUCHAR)Port + 4); WRITE_PORT_UCHAR((PUCHAR)Port + 4, (LineControl & ~0x02) | 0x01); - KeStallExecutionProcessor(500000); + KeStallExecutionProcessor(100000); /* Clear buffer */ while (READ_PORT_UCHAR((PUCHAR)Port + 5) & 0x01) @@ -812,15 +812,15 @@ GetMousePnpId(U32 Port, char *Buffer) WRITE_PORT_UCHAR((PUCHAR)Port + 4, 0x09); /* Wait 10 milliseconds for the mouse getting ready */ - KeStallExecutionProcessor(200000); + KeStallExecutionProcessor(10000); WRITE_PORT_UCHAR((PUCHAR)Port + 4, 0x0b); - KeStallExecutionProcessor(200000); + KeStallExecutionProcessor(10000); for (;;) { - TimeOut = 250; + TimeOut = 200; while (((READ_PORT_UCHAR((PUCHAR)Port + 5) & 1) == 0) && (TimeOut > 0)) { KeStallExecutionProcessor(1000); @@ -841,7 +841,7 @@ GetMousePnpId(U32 Port, char *Buffer) for (;;) { - TimeOut = 250; + TimeOut = 200; while (((READ_PORT_UCHAR((PUCHAR)Port + 5) & 1) == 0) && (TimeOut > 0)) { KeStallExecutionProcessor(1000); @@ -1244,7 +1244,7 @@ DetectPS2AuxPort(VOID) break; } - KeStallExecutionProcessor(10000); + KeStallExecutionProcessor(1000); } return FALSE; @@ -1266,7 +1266,7 @@ DetectPS2AuxDevice(VOID) WRITE_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA, 0xF2); - KeStallExecutionProcessor(10000); + KeStallExecutionProcessor(1000); Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); if ((Status & CONTROLLER_STATUS_MOUSE_OUTPUT_BUFFER_FULL) == 0) @@ -1278,7 +1278,7 @@ DetectPS2AuxDevice(VOID) if (Scancode != 0xFA) return FALSE; - KeStallExecutionProcessor(10000); + KeStallExecutionProcessor(1000); Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); if ((Status & CONTROLLER_STATUS_MOUSE_OUTPUT_BUFFER_FULL) == 0) diff --git a/freeldr/freeldr/fs/fs.c b/freeldr/freeldr/fs/fs.c index 544189eaff8..912b8cac982 100644 --- a/freeldr/freeldr/fs/fs.c +++ b/freeldr/freeldr/fs/fs.c @@ -22,6 +22,7 @@ #include "fat.h" #include "iso.h" #include "ext2.h" +#include "ntfs.h" #include "fsrec.h" #include <disk.h> #include <rtl.h> @@ -140,6 +141,9 @@ BOOL FsOpenVolume(U32 DriveNumber, U32 PartitionNumber) case PARTITION_EXT2: FileSystemType = FS_EXT2; return Ext2OpenVolume(DriveNumber, PartitionTableEntry.SectorCountBeforePartition); + case PARTITION_NTFS: + FileSystemType = FS_NTFS; + return NtfsOpenVolume(DriveNumber, PartitionTableEntry.SectorCountBeforePartition); default: FileSystemType = 0; sprintf(ErrorText, "Unsupported file system. Type: 0x%x", VolumeType); @@ -181,6 +185,9 @@ PFILE FsOpenFile(PUCHAR FileName) case FS_EXT2: FileHandle = Ext2OpenFile(FileName); break; + case FS_NTFS: + FileHandle = NtfsOpenFile(FileName); + break; default: FileSystemError("Error: Unknown filesystem."); break; @@ -241,6 +248,10 @@ BOOL FsReadFile(PFILE FileHandle, U32 BytesToRead, U32* BytesRead, PVOID Buffer) *BytesRead = (U32)BytesReadBig; return Success; + case FS_NTFS: + + return NtfsReadFile(FileHandle, BytesToRead, BytesRead, Buffer); + default: FileSystemError("Unknown file system."); @@ -266,6 +277,10 @@ U32 FsGetFileSize(PFILE FileHandle) return Ext2GetFileSize(FileHandle); + case FS_NTFS: + + return NtfsGetFileSize(FileHandle); + default: FileSystemError("Unknown file system."); break; @@ -293,6 +308,11 @@ VOID FsSetFilePointer(PFILE FileHandle, U32 NewFilePointer) Ext2SetFilePointer(FileHandle, NewFilePointer); break; + case FS_NTFS: + + NtfsSetFilePointer(FileHandle, NewFilePointer); + break; + default: FileSystemError("Unknown file system."); break; @@ -318,6 +338,11 @@ U32 FsGetFilePointer(PFILE FileHandle) return Ext2GetFilePointer(FileHandle); break; + case FS_NTFS: + + return NtfsGetFilePointer(FileHandle); + break; + default: FileSystemError("Unknown file system."); break; diff --git a/freeldr/freeldr/fs/fsrec.c b/freeldr/freeldr/fs/fsrec.c index b7d7dfe05ad..0de3708c7bf 100644 --- a/freeldr/freeldr/fs/fsrec.c +++ b/freeldr/freeldr/fs/fsrec.c @@ -23,6 +23,7 @@ #include "fat.h" #include "iso.h" #include "ext2.h" +#include "ntfs.h" #include <disk.h> #include <rtl.h> #include <arch.h> @@ -55,6 +56,11 @@ BOOL FsRecognizeVolume(U32 DriveNumber, U32 VolumeStartSector, U8* VolumeType) *VolumeType = PARTITION_FAT32; return TRUE; } + else if (FsRecIsNtfs(DriveNumber, VolumeStartSector)) + { + *VolumeType = PARTITION_NTFS; + return TRUE; + } return FALSE; } @@ -114,3 +120,20 @@ BOOL FsRecIsFat(U32 DriveNumber, U32 VolumeStartSector) return FALSE; } + +BOOL FsRecIsNtfs(U32 DriveNumber, U32 VolumeStartSector) +{ + PNTFS_BOOTSECTOR BootSector = (PNTFS_BOOTSECTOR)DISKREADBUFFER; + if (!DiskReadLogicalSectors(DriveNumber, VolumeStartSector, 1, BootSector)) + { + FileSystemError("Failed to read the boot sector."); + return FALSE; + } + + if (!RtlCompareMemory(BootSector->SystemId, "NTFS", 4)) + { + return TRUE; + } + + return FALSE; +} diff --git a/freeldr/freeldr/fs/fsrec.h b/freeldr/freeldr/fs/fsrec.h index bf42b9994c7..210a4acebcf 100644 --- a/freeldr/freeldr/fs/fsrec.h +++ b/freeldr/freeldr/fs/fsrec.h @@ -24,5 +24,6 @@ BOOL FsRecognizeVolume(U32 DriveNumber, U32 VolumeStartSector, U8* VolumeType); BOOL FsRecIsIso9660(U32 DriveNumber); BOOL FsRecIsExt2(U32 DriveNumber, U32 VolumeStartSector); BOOL FsRecIsFat(U32 DriveNumber, U32 VolumeStartSector); +BOOL FsRecIsNtfs(U32 DriveNumber, U32 VolumeStartSector); #endif // #defined __FSREC_H diff --git a/freeldr/freeldr/include/disk.h b/freeldr/freeldr/include/disk.h index 147bf4de862..780409e22f8 100644 --- a/freeldr/freeldr/include/disk.h +++ b/freeldr/freeldr/include/disk.h @@ -92,6 +92,7 @@ typedef struct _MASTER_BOOT_RECORD #define PARTITION_FAT32_XINT13 0x0C // FAT32 using extended int13 services #define PARTITION_XINT13 0x0E // Win95 partition using extended int13 services #define PARTITION_XINT13_EXTENDED 0x0F // Same as type 5 but uses extended int13 services +#define PARTITION_NTFS 0x17 // NTFS #define PARTITION_PREP 0x41 // PowerPC Reference Platform (PReP) Boot Partition #define PARTITION_LDM 0x42 // Logical Disk Manager partition #define PARTITION_UNIX 0x63 // Unix diff --git a/freeldr/freeldr/include/version.h b/freeldr/freeldr/include/version.h index db7358ad37f..93f0e6139d4 100644 --- a/freeldr/freeldr/include/version.h +++ b/freeldr/freeldr/include/version.h @@ -22,7 +22,7 @@ /* just some stuff */ -#define VERSION "FreeLoader v1.8.20" +#define VERSION "FreeLoader v1.8.21" #define COPYRIGHT "Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com>" #define AUTHOR_EMAIL "<brianp@sginet.com>" #define BY_AUTHOR "by Brian Palmer" @@ -36,7 +36,7 @@ // #define FREELOADER_MAJOR_VERSION 1 #define FREELOADER_MINOR_VERSION 8 -#define FREELOADER_PATCH_VERSION 20 +#define FREELOADER_PATCH_VERSION 21 #ifndef ASM From d35144407f03648c169c524173c8e6ce37719c6c Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Tue, 25 May 2004 21:47:39 +0000 Subject: [PATCH 1223/1463] - Enabled the 'Press any key to boot from CD' message in the ISO boot code and show it only when some hard disk is present. - Adjusted detection timeouts for PS/2 and RS232 to the minimum allowed by the specifications so we don't spend ages in hardware detection. - Experimental NTFS reading support. (No boot code, no attribute lists, no decompression) svn path=/trunk/; revision=9494 --- freeldr/freeldr/fs/ntfs.c | 690 ++++++++++++++++++++++++++++++++++++++ freeldr/freeldr/fs/ntfs.h | 226 +++++++++++++ 2 files changed, 916 insertions(+) create mode 100644 freeldr/freeldr/fs/ntfs.c create mode 100644 freeldr/freeldr/fs/ntfs.h diff --git a/freeldr/freeldr/fs/ntfs.c b/freeldr/freeldr/fs/ntfs.c new file mode 100644 index 00000000000..6aedde95260 --- /dev/null +++ b/freeldr/freeldr/fs/ntfs.c @@ -0,0 +1,690 @@ +/* + * FreeLoader + * Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com> + * + * FreeLoader NTFS support + * Copyright (C) 2004 Filip Navara <xnavara@volny.cz> + * + * 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. + */ + +/* + * Limitations: + * - No support for compressed files. + * - No attribute list support. + * - May crash on currupted filesystem. + * + * Bugs: + * - I encountered file names like 'KERNEL~1.EE' stored on + * the disk. These aren't handled correctly yet. + */ + +#include <freeldr.h> +#include <fs.h> +#include <disk.h> +#include <rtl.h> +#include <arch.h> +#include <mm.h> +#include <debug.h> +#include <cache.h> + +#define NTFS_DEFS +#include "ntfs.h" + +PNTFS_BOOTSECTOR NtfsBootSector; +U32 NtfsClusterSize; +U32 NtfsMftRecordSize; +U32 NtfsIndexRecordSize; +U32 NtfsDriveNumber; +U32 NtfsSectorOfClusterZero; +PNTFS_MFT_RECORD NtfsMasterFileTable; +NTFS_ATTR_CONTEXT NtfsMFTContext; + +PUCHAR NtfsDecodeRun(PUCHAR DataRun, S64 *DataRunOffset, U64 *DataRunLength) +{ + U8 DataRunOffsetSize; + U8 DataRunLengthSize; + U8 i; + + DataRunOffsetSize = (*DataRun >> 4) & 0xF; + DataRunLengthSize = *DataRun & 0xF; + *DataRunOffset = 0; + *DataRunLength = 0; + DataRun++; + for (i = 0; i < DataRunLengthSize; i++) + { + *DataRunLength += *DataRun << (i << 3); + DataRun++; + } + for (i = 0; i < DataRunOffsetSize; i++) + { + *DataRunOffset += *DataRun << (i << 3); + DataRun++; + } + + DbgPrint((DPRINT_FILESYSTEM, "DataRunOffsetSize: %x\n", DataRunOffsetSize)); + DbgPrint((DPRINT_FILESYSTEM, "DataRunLengthSize: %x\n", DataRunLengthSize)); + DbgPrint((DPRINT_FILESYSTEM, "DataRunOffset: %x\n", DataRunOffset)); + DbgPrint((DPRINT_FILESYSTEM, "DataRunLength: %x\n", DataRunLength)); + + return DataRun; +} + +/* FIXME: Add support for attribute lists! */ +BOOL NtfsFindAttribute(PNTFS_ATTR_CONTEXT Context, PNTFS_MFT_RECORD MftRecord, U32 Type, PWCHAR Name) +{ + PNTFS_ATTR_RECORD AttrRecord; + PNTFS_ATTR_RECORD AttrRecordEnd; + U32 NameLength; + PWCHAR AttrName; + + AttrRecord = (PNTFS_ATTR_RECORD)((PCHAR)MftRecord + MftRecord->AttributesOffset); + AttrRecordEnd = (PNTFS_ATTR_RECORD)((PCHAR)MftRecord + NtfsMftRecordSize); + for (NameLength = 0; Name[NameLength] != 0; NameLength++) + ; + + while (AttrRecord < AttrRecordEnd) + { + if (AttrRecord->Type == ATTR_TYPE_END) + break; + + if (AttrRecord->Type == Type) + { + if (AttrRecord->NameLength == NameLength) + { + AttrName = (PWCHAR)((PCHAR)AttrRecord + AttrRecord->NameOffset); + if (!RtlCompareMemory(AttrName, Name, NameLength << 1)) + { + /* Found it, fill up the context and return. */ + Context->Record = AttrRecord; + if (AttrRecord->IsNonResident) + { + S64 DataRunOffset; + U64 DataRunLength; + + Context->CacheRun = (PUCHAR)Context->Record + Context->Record->NonResident.MappingPairsOffset; + Context->CacheRunOffset = 0; + Context->CacheRun = NtfsDecodeRun(Context->CacheRun, &DataRunOffset, &DataRunLength); + if (DataRunOffset != -1) + { + /* Normal run. */ + Context->CacheRunStartLCN = + Context->CacheRunLastLCN = DataRunOffset; + } + else + { + /* Sparse run. */ + Context->CacheRunStartLCN = -1; + Context->CacheRunLastLCN = 0; + } + Context->CacheRunCurrentOffset = 0; + } + return TRUE; + } + } + } + + AttrRecord = (PNTFS_ATTR_RECORD)((PCHAR)AttrRecord + AttrRecord->Length); + } + + return FALSE; +} + +/* FIXME: Optimize for multisector reads. */ +BOOL NtfsDiskRead(U64 Offset, U64 Length, PCHAR Buffer) +{ + U16 ReadLength; + + /* I. Read partial first sector if needed */ + if (Offset % NtfsBootSector->BytesPerSector) + { + if (!DiskReadLogicalSectors(NtfsDriveNumber, NtfsSectorOfClusterZero + (Offset / NtfsBootSector->BytesPerSector), 1, (PCHAR)DISKREADBUFFER)) + return FALSE; + ReadLength = min(Length, NtfsBootSector->BytesPerSector - (Offset % NtfsBootSector->BytesPerSector)); + RtlCopyMemory(Buffer, (PCHAR)DISKREADBUFFER + (Offset % NtfsBootSector->BytesPerSector), ReadLength); + Buffer += ReadLength; + Length -= ReadLength; + Offset += ReadLength; + } + + /* II. Read all complete 64-sector blocks. */ + while (Length >= 64 * NtfsBootSector->BytesPerSector) + { + if (!DiskReadLogicalSectors(NtfsDriveNumber, NtfsSectorOfClusterZero + (Offset / NtfsBootSector->BytesPerSector), 64, (PCHAR)DISKREADBUFFER)) + return FALSE; + RtlCopyMemory(Buffer, (PCHAR)DISKREADBUFFER, 64 * NtfsBootSector->BytesPerSector); + Buffer += 64 * NtfsBootSector->BytesPerSector; + Length -= 64 * NtfsBootSector->BytesPerSector; + Offset += 64 * NtfsBootSector->BytesPerSector; + } + + /* III. Read the rest of data */ + if (Length) + { + ReadLength = ((Length + NtfsBootSector->BytesPerSector - 1) / NtfsBootSector->BytesPerSector); + if (!DiskReadLogicalSectors(NtfsDriveNumber, NtfsSectorOfClusterZero + (Offset / NtfsBootSector->BytesPerSector), ReadLength, (PCHAR)DISKREADBUFFER)) + return FALSE; + RtlCopyMemory(Buffer, (PCHAR)DISKREADBUFFER, Length); + } + + return TRUE; +} + +U64 NtfsReadAttribute(PNTFS_ATTR_CONTEXT Context, U64 Offset, PCHAR Buffer, U64 Length) +{ + U64 LastLCN; + PUCHAR DataRun; + S64 DataRunOffset; + U64 DataRunLength; + S64 DataRunStartLCN; + U64 CurrentOffset; + U64 ReadLength; + U64 AlreadyRead; + + if (!Context->Record->IsNonResident) + { + if (Offset > Context->Record->Resident.ValueLength) + return 0; + if (Offset + Length > Context->Record->Resident.ValueLength) + Length = Context->Record->Resident.ValueLength - Offset; + RtlCopyMemory(Buffer, (PCHAR)Context->Record + Context->Record->Resident.ValueOffset + Offset, Length); + return Length; + } + + /* + * Non-resident attribute + */ + + /* + * I. Find the corresponding start data run. + */ + + if (Context->CacheRunOffset == Offset) + { + DataRun = Context->CacheRun; + LastLCN = Context->CacheRunLastLCN; + DataRunStartLCN = Context->CacheRunStartLCN; + CurrentOffset = Context->CacheRunCurrentOffset; + } + else + { + LastLCN = 0; + DataRun = (PUCHAR)Context->Record + Context->Record->NonResident.MappingPairsOffset; + CurrentOffset = 0; + + while (1) + { + DataRun = NtfsDecodeRun(DataRun, &DataRunOffset, &DataRunLength); + if (DataRunOffset != -1) + { + /* Normal data run. */ + DataRunStartLCN = LastLCN + DataRunOffset; + LastLCN = DataRunStartLCN; + } + else + { + /* Sparse data run. */ + DataRunStartLCN = -1; + } + + if (Offset >= CurrentOffset && + Offset < CurrentOffset + (DataRunLength * NtfsClusterSize)) + { + break; + } + + if (*DataRun == 0) + { + return 0; + } + + CurrentOffset += DataRunLength * NtfsClusterSize; + } + } + + /* + * II. Go through the run list and read the data + */ + + AlreadyRead = 0; + while (Length > 0) + { + ReadLength = min(DataRunLength * NtfsClusterSize, Length); + if (DataRunStartLCN == -1) + RtlZeroMemory(Buffer, ReadLength); + else if (!NtfsDiskRead(DataRunStartLCN * NtfsClusterSize + Offset - CurrentOffset, ReadLength, Buffer)) + break; + Length -= ReadLength; + Buffer += ReadLength; + AlreadyRead += ReadLength; + + /* + * Go to next run in the list. Note that we don't do it only for + * Length > 0 because of run pointer caching. + */ + + { + if (*DataRun == 0) + break; + DataRun = NtfsDecodeRun(DataRun, &DataRunOffset, &DataRunLength); + if (DataRunOffset != -1) + { + /* Normal data run. */ + DataRunStartLCN = LastLCN + DataRunOffset; + LastLCN = DataRunStartLCN; + } + else + { + /* Sparse data run. */ + DataRunStartLCN = -1; + } + CurrentOffset += DataRunLength * NtfsClusterSize; + } + } + + Context->CacheRun = DataRun; + Context->CacheRunOffset = Offset + AlreadyRead; + Context->CacheRunStartLCN = DataRunStartLCN; + Context->CacheRunLastLCN = LastLCN; + Context->CacheRunCurrentOffset = CurrentOffset; + + return AlreadyRead; +} + +BOOL NtfsReadMftRecord(U32 MFTIndex, PNTFS_MFT_RECORD Buffer) +{ + return NtfsReadAttribute(&NtfsMFTContext, MFTIndex * NtfsMftRecordSize, (PCHAR)Buffer, NtfsMftRecordSize) == NtfsMftRecordSize; +} + +#ifdef DEBUG +VOID NtfsPrintFile(PNTFS_INDEX_ENTRY IndexEntry) +{ + PWCHAR FileName; + U8 FileNameLength; + CHAR AnsiFileName[256]; + U8 i; + + FileName = IndexEntry->FileName.FileName; + FileNameLength = IndexEntry->FileName.FileNameLength; + + for (i = 0; i < FileNameLength; i++) + AnsiFileName[i] = FileName[i]; + AnsiFileName[i] = 0; + + DbgPrint((DPRINT_FILESYSTEM, "- %s (%x)\n", AnsiFileName, IndexEntry->Data.Directory.IndexedFile)); +} +#endif + +BOOL NtfsCompareFileName(PCHAR FileName, PNTFS_INDEX_ENTRY IndexEntry) +{ + PWCHAR EntryFileName; + U8 EntryFileNameLength; + U8 i; + + EntryFileName = IndexEntry->FileName.FileName; + EntryFileNameLength = IndexEntry->FileName.FileNameLength; + +#ifdef DEBUG + NtfsPrintFile(IndexEntry); +#endif + + if (strlen(FileName) != EntryFileNameLength) + return FALSE; + + /* Do case-sensitive compares for Posix file names. */ + if (IndexEntry->FileName.FileNameType == FILE_NAME_POSIX) + { + for (i = 0; i < EntryFileNameLength; i++) + if (EntryFileName[i] != FileName[i]) + return FALSE; + } + else + { + for (i = 0; i < EntryFileNameLength; i++) + if (tolower(EntryFileName[i]) != tolower(FileName[i])) + return FALSE; + } + + return TRUE; +} + +BOOL NtfsFindMftRecord(U32 MFTIndex, PCHAR FileName, U32 *OutMFTIndex) +{ + PNTFS_MFT_RECORD MftRecord; + U32 Magic; + NTFS_ATTR_CONTEXT IndexRootCtx; + NTFS_ATTR_CONTEXT IndexBitmapCtx; + NTFS_ATTR_CONTEXT IndexAllocationCtx; + PNTFS_INDEX_ROOT IndexRoot; + U64 BitmapDataSize; + U64 IndexAllocationSize; + PCHAR BitmapData; + PCHAR IndexRecord; + PNTFS_INDEX_ENTRY IndexEntry, IndexEntryEnd; + U32 RecordOffset; + U32 IndexBlockSize; + + MftRecord = MmAllocateMemory(NtfsMftRecordSize); + if (MftRecord == NULL) + { + return FALSE; + } + + if (NtfsReadMftRecord(MFTIndex, MftRecord)) + { + Magic = MftRecord->Magic; + + if (!NtfsFindAttribute(&IndexRootCtx, MftRecord, ATTR_TYPE_INDEX_ROOT, L"$I30")) + { + MmFreeMemory(MftRecord); + return FALSE; + } + + IndexRecord = MmAllocateMemory(NtfsIndexRecordSize); + if (IndexRecord == NULL) + { + MmFreeMemory(MftRecord); + return FALSE; + } + + NtfsReadAttribute(&IndexRootCtx, 0, IndexRecord, NtfsIndexRecordSize); + IndexRoot = (PNTFS_INDEX_ROOT)IndexRecord; + IndexEntry = (PNTFS_INDEX_ENTRY)((PCHAR)&IndexRoot->IndexHeader + IndexRoot->IndexHeader.EntriesOffset); + /* Index root is always resident. */ + IndexEntryEnd = (PNTFS_INDEX_ENTRY)(IndexRecord + IndexRootCtx.Record->Resident.ValueLength); + + DbgPrint((DPRINT_FILESYSTEM, "NtfsIndexRecordSize: %x IndexBlockSize: %x\n", NtfsIndexRecordSize, IndexRoot->IndexBlockSize)); + + while (IndexEntry < IndexEntryEnd && + !(IndexEntry->Flags & INDEX_ENTRY_END)) + { + if (NtfsCompareFileName(FileName, IndexEntry)) + { + *OutMFTIndex = IndexEntry->Data.Directory.IndexedFile; + MmFreeMemory(IndexRecord); + MmFreeMemory(MftRecord); + return TRUE; + } + IndexEntry = (PNTFS_INDEX_ENTRY)((PCHAR)IndexEntry + IndexEntry->Length); + } + + if (IndexRoot->IndexHeader.Flags & LARGE_INDEX) + { + DbgPrint((DPRINT_FILESYSTEM, "Large Index!\n")); + + IndexBlockSize = IndexRoot->IndexBlockSize; + + if (!NtfsFindAttribute(&IndexBitmapCtx, MftRecord, ATTR_TYPE_BITMAP, L"$I30")) + { + DbgPrint((DPRINT_FILESYSTEM, "Corrupted filesystem!\n")); + MmFreeMemory(MftRecord); + return FALSE; + } + if (IndexBitmapCtx.Record->IsNonResident) + BitmapDataSize = IndexBitmapCtx.Record->NonResident.DataSize; + else + BitmapDataSize = IndexBitmapCtx.Record->Resident.ValueLength; + DbgPrint((DPRINT_FILESYSTEM, "BitmapDataSize: %x\n", BitmapDataSize)); + BitmapData = MmAllocateMemory(BitmapDataSize); + if (BitmapData == NULL) + { + MmFreeMemory(IndexRecord); + MmFreeMemory(MftRecord); + return FALSE; + } + NtfsReadAttribute(&IndexBitmapCtx, 0, BitmapData, BitmapDataSize); + + if (!NtfsFindAttribute(&IndexAllocationCtx, MftRecord, ATTR_TYPE_INDEX_ALLOCATION, L"$I30")) + { + DbgPrint((DPRINT_FILESYSTEM, "Corrupted filesystem!\n")); + MmFreeMemory(BitmapData); + MmFreeMemory(IndexRecord); + MmFreeMemory(MftRecord); + return FALSE; + } + if (IndexAllocationCtx.Record->IsNonResident) + IndexAllocationSize = IndexAllocationCtx.Record->NonResident.DataSize; + else + IndexAllocationSize = IndexAllocationCtx.Record->Resident.ValueLength; + + RecordOffset = 0; + + for (;;) + { + DbgPrint((DPRINT_FILESYSTEM, "RecordOffset: %x IndexAllocationSize: %x\n", RecordOffset, IndexAllocationSize)); + for (; RecordOffset < IndexAllocationSize;) + { + U8 Bit = 1 << ((RecordOffset / IndexBlockSize) & 3); + U32 Byte = (RecordOffset / IndexBlockSize) >> 3; + if ((BitmapData[Byte] & Bit)) + break; + RecordOffset += IndexBlockSize; + } + + if (RecordOffset >= IndexAllocationSize) + break; + + NtfsReadAttribute(&IndexAllocationCtx, RecordOffset, IndexRecord, IndexBlockSize); + + /* FIXME */ + IndexEntry = (PNTFS_INDEX_ENTRY)(IndexRecord + 0x18 + *(U16 *)(IndexRecord + 0x18)); + IndexEntryEnd = (PNTFS_INDEX_ENTRY)(IndexRecord + IndexBlockSize); + + while (IndexEntry < IndexEntryEnd && + !(IndexEntry->Flags & INDEX_ENTRY_END)) + { + if (NtfsCompareFileName(FileName, IndexEntry)) + { + DbgPrint((DPRINT_FILESYSTEM, "File found\n")); + *OutMFTIndex = IndexEntry->Data.Directory.IndexedFile; + MmFreeMemory(BitmapData); + MmFreeMemory(IndexRecord); + MmFreeMemory(MftRecord); + return TRUE; + } + IndexEntry = (PNTFS_INDEX_ENTRY)((PCHAR)IndexEntry + IndexEntry->Length); + } + + RecordOffset += IndexBlockSize; + } + + MmFreeMemory(BitmapData); + } + + MmFreeMemory(IndexRecord); + } + else + { + DbgPrint((DPRINT_FILESYSTEM, "Can't read MFT record\n")); + } + MmFreeMemory(MftRecord); + + return FALSE; +} + +BOOL NtfsLookupFile(PUCHAR FileName, PNTFS_MFT_RECORD MftRecord, PNTFS_ATTR_CONTEXT DataContext) +{ + U32 NumberOfPathParts; + UCHAR PathPart[261]; + U32 CurrentMFTIndex; + U8 i; + + DbgPrint((DPRINT_FILESYSTEM, "NtfsLookupFile() FileName = %s\n", FileName)); + + CurrentMFTIndex = FILE_ROOT; + NumberOfPathParts = FsGetNumPathParts(FileName); + for (i = 0; i < NumberOfPathParts; i++) + { + FsGetFirstNameFromPath(PathPart, FileName); + + for (; (*FileName != '\\') && (*FileName != '/') && (*FileName != '\0'); FileName++) + ; + FileName++; + + DbgPrint((DPRINT_FILESYSTEM, "- Lookup: %s\n", PathPart)); + if (!NtfsFindMftRecord(CurrentMFTIndex, PathPart, &CurrentMFTIndex)) + { + DbgPrint((DPRINT_FILESYSTEM, "- Failed\n")); + return FALSE; + } + DbgPrint((DPRINT_FILESYSTEM, "- Lookup: %x\n", CurrentMFTIndex)); + } + + if (!NtfsReadMftRecord(CurrentMFTIndex, MftRecord)) + { + DbgPrint((DPRINT_FILESYSTEM, "NtfsLookupFile: Can't read MFT record\n")); + return FALSE; + } + + if (!NtfsFindAttribute(DataContext, MftRecord, ATTR_TYPE_DATA, L"")) + { + DbgPrint((DPRINT_FILESYSTEM, "NtfsLookupFile: Can't find data attribute\n")); + return FALSE; + } + + return TRUE; +} + +BOOL NtfsOpenVolume(U32 DriveNumber, U32 VolumeStartSector) +{ + NtfsBootSector = (PNTFS_BOOTSECTOR)DISKREADBUFFER; + + DbgPrint((DPRINT_FILESYSTEM, "NtfsOpenVolume() DriveNumber = 0x%x VolumeStartSector = 0x%x\n", DriveNumber, VolumeStartSector)); + + if (!DiskReadLogicalSectors(DriveNumber, VolumeStartSector, 1, (PCHAR)DISKREADBUFFER)) + { + FileSystemError("Failed to read the boot sector."); + return FALSE; + } + + if (RtlCompareMemory(NtfsBootSector->SystemId, "NTFS", 4)) + { + FileSystemError("Invalid NTFS signature."); + return FALSE; + } + + NtfsBootSector = MmAllocateMemory(NtfsBootSector->BytesPerSector); + if (NtfsBootSector == NULL) + { + return FALSE; + } + + RtlCopyMemory(NtfsBootSector, (PCHAR)DISKREADBUFFER, ((PNTFS_BOOTSECTOR)DISKREADBUFFER)->BytesPerSector); + + NtfsClusterSize = NtfsBootSector->SectorsPerCluster * NtfsBootSector->BytesPerSector; + if (NtfsBootSector->ClustersPerMftRecord > 0) + NtfsMftRecordSize = NtfsBootSector->ClustersPerMftRecord * NtfsClusterSize; + else + NtfsMftRecordSize = 1 << (-NtfsBootSector->ClustersPerMftRecord); + if (NtfsBootSector->ClustersPerIndexRecord > 0) + NtfsIndexRecordSize = NtfsBootSector->ClustersPerIndexRecord * NtfsClusterSize; + else + NtfsIndexRecordSize = 1 << (-NtfsBootSector->ClustersPerIndexRecord); + + DbgPrint((DPRINT_FILESYSTEM, "NtfsClusterSize: 0x%x\n", NtfsClusterSize)); + DbgPrint((DPRINT_FILESYSTEM, "ClustersPerMftRecord: %d\n", NtfsBootSector->ClustersPerMftRecord)); + DbgPrint((DPRINT_FILESYSTEM, "ClustersPerIndexRecord: %d\n", NtfsBootSector->ClustersPerIndexRecord)); + DbgPrint((DPRINT_FILESYSTEM, "NtfsMftRecordSize: 0x%x\n", NtfsMftRecordSize)); + DbgPrint((DPRINT_FILESYSTEM, "NtfsIndexRecordSize: 0x%x\n", NtfsIndexRecordSize)); + + NtfsDriveNumber = DriveNumber; + NtfsSectorOfClusterZero = VolumeStartSector; + + DbgPrint((DPRINT_FILESYSTEM, "Reading MFT index...\n")); + if (!DiskReadLogicalSectors(DriveNumber, + NtfsSectorOfClusterZero + + (NtfsBootSector->MftLocation * NtfsBootSector->SectorsPerCluster), + NtfsMftRecordSize / NtfsBootSector->BytesPerSector, (PCHAR)DISKREADBUFFER)) + { + FileSystemError("Failed to read the Master File Table record."); + return FALSE; + } + + NtfsMasterFileTable = MmAllocateMemory(NtfsMftRecordSize); + if (NtfsMasterFileTable == NULL) + { + MmFreeMemory(NtfsBootSector); + return FALSE; + } + + RtlCopyMemory(NtfsMasterFileTable, (PCHAR)DISKREADBUFFER, NtfsMftRecordSize); + + DbgPrint((DPRINT_FILESYSTEM, "Searching for DATA attribute...\n")); + if (!NtfsFindAttribute(&NtfsMFTContext, NtfsMasterFileTable, ATTR_TYPE_DATA, L"")) + { + FileSystemError("Can't find data attribute for Master File Table."); + return FALSE; + } + + return TRUE; +} + +FILE* NtfsOpenFile(PUCHAR FileName) +{ + PNTFS_FILE_HANDLE FileHandle; + PNTFS_MFT_RECORD MftRecord; + + FileHandle = MmAllocateMemory(sizeof(NTFS_FILE_HANDLE) + NtfsMftRecordSize); + if (FileHandle == NULL) + { + return NULL; + } + + MftRecord = (PNTFS_MFT_RECORD)(FileHandle + 1); + if (!NtfsLookupFile(FileName, MftRecord, &FileHandle->DataContext)) + { + MmFreeMemory(FileHandle); + return NULL; + } + + FileHandle->Offset = 0; + + return (FILE*)FileHandle; +} + +BOOL NtfsReadFile(FILE *File, U32 BytesToRead, U32* BytesRead, PVOID Buffer) +{ + PNTFS_FILE_HANDLE FileHandle = (PNTFS_FILE_HANDLE)File; + U64 BytesRead64; + BytesRead64 = NtfsReadAttribute(&FileHandle->DataContext, FileHandle->Offset, Buffer, BytesToRead); + if (BytesRead64) + { + *BytesRead = (U32)BytesRead64; + FileHandle->Offset += BytesRead64; + return TRUE; + } + return FALSE; +} + +U32 NtfsGetFileSize(FILE *File) +{ + PNTFS_FILE_HANDLE FileHandle = (PNTFS_FILE_HANDLE)File; + if (FileHandle->DataContext.Record->IsNonResident) + return (U32)FileHandle->DataContext.Record->NonResident.DataSize; + else + return (U32)FileHandle->DataContext.Record->Resident.ValueLength; +} + +VOID NtfsSetFilePointer(FILE *File, U32 NewFilePointer) +{ + PNTFS_FILE_HANDLE FileHandle = (PNTFS_FILE_HANDLE)File; + FileHandle->Offset = NewFilePointer; +} + +U32 NtfsGetFilePointer(FILE *File) +{ + PNTFS_FILE_HANDLE FileHandle = (PNTFS_FILE_HANDLE)File; + return FileHandle->Offset; +} diff --git a/freeldr/freeldr/fs/ntfs.h b/freeldr/freeldr/fs/ntfs.h new file mode 100644 index 00000000000..e3229b5ea7c --- /dev/null +++ b/freeldr/freeldr/fs/ntfs.h @@ -0,0 +1,226 @@ +/* + * FreeLoader + * Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com> + * + * FreeLoader NTFS support + * Copyright (C) 2004 Filip Navara <xnavara@volny.cz> + * + * 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. + */ + +#ifndef __NTFS_H +#define __NTFS_H + +#ifdef NTFS_DEFS + +#define FILE_MFT 0 +#define FILE_MFTMIRR 1 +#define FILE_LOGFILE 2 +#define FILE_VOLUME 3 +#define FILE_ATTRDEF 4 +#define FILE_ROOT 5 +#define FILE_BITMAP 6 +#define FILE_BOOT 7 +#define FILE_BADCLUS 8 +#define FILE_QUOTA 9 +#define FILE_UPCASE 10 + +#define ATTR_TYPE_STANDARD_INFORMATION 0x10 +#define ATTR_TYPE_ATTRIBUTE_LIST 0x20 +#define ATTR_TYPE_FILENAME 0x30 +#define ATTR_TYPE_SECURITY_DESCRIPTOR 0x50 +#define ATTR_TYPE_DATA 0x80 +#define ATTR_TYPE_INDEX_ROOT 0x90 +#define ATTR_TYPE_INDEX_ALLOCATION 0xa0 +#define ATTR_TYPE_BITMAP 0xb0 +#define ATTR_TYPE_SYMLINK 0xc0 +#define ATTR_TYPE_END 0xffffffff + +#define ATTR_NORMAL 0 +#define ATTR_COMPRESSED 1 +#define ATTR_RESIDENT 2 +#define ATTR_ENCRYPTED 0x4000 + +#define SMALL_INDEX 0 +#define LARGE_INDEX 1 + +#define INDEX_ENTRY_NODE 1 +#define INDEX_ENTRY_END 2 + +#define FILE_NAME_POSIX 0 +#define FILE_NAME_WIN32 1 +#define FILE_NAME_DOS 2 +#define FILE_NAME_WIN32_AND_DOS 3 +#endif + +typedef struct +{ + U8 JumpBoot[3]; // Jump to the boot loader routine + U8 SystemId[8]; // System Id ("NTFS ") + U16 BytesPerSector; // Bytes per sector + U8 SectorsPerCluster; // Number of sectors in a cluster + U8 Unused1[7]; + U8 MediaDescriptor; // Media descriptor byte + U8 Unused2[2]; + U16 SectorsPerTrack; // Number of sectors in a track + U16 NumberOfHeads; // Number of heads on the disk + U8 Unused3[8]; + U8 DriveNumber; // Int 0x13 drive number (e.g. 0x80) + U8 CurrentHead; + U8 BootSignature; // Extended boot signature (0x80) + U8 Unused4; + U64 VolumeSectorCount; // Number of sectors in the volume + U64 MftLocation; + U64 MftMirrorLocation; + S8 ClustersPerMftRecord; // Clusters per MFT Record + U8 Unused5[3]; + S8 ClustersPerIndexRecord; // Clusters per Index Record + U8 Unused6[3]; + U64 VolumeSerialNumber; // Volume serial number + U8 BootCodeAndData[430]; // The remainder of the boot sector + U16 BootSectorMagic; // 0xAA55 +} PACKED NTFS_BOOTSECTOR, *PNTFS_BOOTSECTOR; + +typedef struct +{ + U32 Magic; + U16 USAOffset; // Offset to the Update Sequence Array from the start of the ntfs record + U16 USACount; + U64 LogSequenceNumber; + U16 SequenceNumber; + U16 LinkCount; + U16 AttributesOffset; + U16 Flags; + U32 BytesInUse; // Number of bytes used in this mft record. + U32 BytesAllocated; + U64 BaseMFTRecord; + U16 NextAttributeInstance; +} PACKED NTFS_MFT_RECORD, *PNTFS_MFT_RECORD; + +typedef struct +{ + U32 Type; + U32 Length; + U8 IsNonResident; + U8 NameLength; + U16 NameOffset; + U16 Flags; + U16 Instance; + union + { + // Resident attributes + struct + { + U32 ValueLength; + U16 ValueOffset; + U16 Flags; + } PACKED Resident; + // Non-resident attributes + struct + { + U64 LowestVCN; + U64 HighestVCN; + U16 MappingPairsOffset; + U8 CompressionUnit; + U8 Reserved[5]; + S64 AllocatedSize; + S64 DataSize; + S64 InitializedSize; + S64 CompressedSize; + } PACKED NonResident; + } PACKED; +} PACKED NTFS_ATTR_RECORD, *PNTFS_ATTR_RECORD; + +typedef struct +{ + U32 EntriesOffset; + U32 IndexLength; + U32 AllocatedSize; + U8 Flags; + U8 Reserved[3]; +} PACKED NTFS_INDEX_HEADER, *PNTFS_INDEX_HEADER; + +typedef struct +{ + U32 Type; + U32 CollationRule; + U32 IndexBlockSize; + U8 ClustersPerIndexBlock; + U8 Reserved[3]; + NTFS_INDEX_HEADER IndexHeader; +} PACKED NTFS_INDEX_ROOT, *PNTFS_INDEX_ROOT; + +typedef struct +{ + U64 ParentDirectory; + S64 CreationTime; + S64 LastDataChangeTime; + S64 LastMftChangeTime; + S64 LastAccessTime; + S64 AllocatedSize; + S64 DataSize; + U32 FileAttributes; + U16 PackedExtendedAttributeSize; + U16 Reserved; + U8 FileNameLength; + U8 FileNameType; + WCHAR FileName[0]; +} PACKED NTFS_FILE_NAME_ATTR, *PNTFS_FILE_NAME_ATTR; + +typedef struct { + union + { + struct + { + U64 IndexedFile; + } PACKED Directory; + struct + { + U16 DataOffset; + U16 DataLength; + U32 Reserved; + } PACKED ViewIndex; + } PACKED Data; + U16 Length; + U16 KeyLength; + U16 Flags; + U16 Reserved; + NTFS_FILE_NAME_ATTR FileName; +} PACKED NTFS_INDEX_ENTRY, *PNTFS_INDEX_ENTRY; + +typedef struct +{ + PNTFS_ATTR_RECORD Record; + PUCHAR CacheRun; + U64 CacheRunOffset; + S64 CacheRunStartLCN; + S64 CacheRunLastLCN; + U64 CacheRunCurrentOffset; +} NTFS_ATTR_CONTEXT, *PNTFS_ATTR_CONTEXT; + +typedef struct +{ + NTFS_ATTR_CONTEXT DataContext; + U64 Offset; +} PACKED NTFS_FILE_HANDLE, *PNTFS_FILE_HANDLE; + +BOOL NtfsOpenVolume(U32 DriveNumber, U32 VolumeStartSector); +FILE* NtfsOpenFile(PUCHAR FileName); +BOOL NtfsReadFile(FILE *FileHandle, U32 BytesToRead, U32* BytesRead, PVOID Buffer); +U32 NtfsGetFileSize(FILE *FileHandle); +VOID NtfsSetFilePointer(FILE *FileHandle, U32 NewFilePointer); +U32 NtfsGetFilePointer(FILE *FileHandle); + +#endif // #defined __NTFS_H From 0fc57920475af612fef995ff08dc6f2824ce0044 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Tue, 25 May 2004 22:03:48 +0000 Subject: [PATCH 1224/1463] - Set CurrentThread->u1.ExitTime to exit time in PsTerminateCurrentThread. Patch by Alex Ionescu. svn path=/trunk/; revision=9495 --- reactos/ntoskrnl/ps/kill.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/ps/kill.c b/reactos/ntoskrnl/ps/kill.c index e22774d860b..081b22a3ccd 100644 --- a/reactos/ntoskrnl/ps/kill.c +++ b/reactos/ntoskrnl/ps/kill.c @@ -1,4 +1,4 @@ -/* $Id: kill.c,v 1.71 2004/04/28 23:46:26 tamlin Exp $ +/* $Id: kill.c,v 1.72 2004/05/25 22:03:48 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -137,6 +137,7 @@ PsTerminateCurrentThread(NTSTATUS ExitStatus) DPRINT("terminating %x\n",CurrentThread); CurrentThread->ExitStatus = ExitStatus; + KeQuerySystemTime((PLARGE_INTEGER)&CurrentThread->u1.ExitTime); KeCancelTimer(&CurrentThread->Tcb.Timer); /* Remove the thread from the thread list of its process */ From d7d7bbef1344d61d763762a88d5f4f27fb7c734c Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Wed, 26 May 2004 09:50:10 +0000 Subject: [PATCH 1225/1463] added stubs for SetFileSecurityW(), GetNamedSecurityInfoA/W() and SetNamedSecurityInfoA/W() svn path=/trunk/; revision=9496 --- reactos/lib/advapi32/advapi32.def | 11 ++-- reactos/lib/advapi32/advapi32.edf | 12 ++-- reactos/lib/advapi32/sec/misc.c | 93 ++++++++++++++++++++++++++++++- 3 files changed, 104 insertions(+), 12 deletions(-) diff --git a/reactos/lib/advapi32/advapi32.def b/reactos/lib/advapi32/advapi32.def index 15474206918..d868d825633 100644 --- a/reactos/lib/advapi32/advapi32.def +++ b/reactos/lib/advapi32/advapi32.def @@ -1,4 +1,4 @@ -; $Id: advapi32.def,v 1.18 2004/05/13 20:42:27 navaraf Exp $ +; $Id: advapi32.def,v 1.19 2004/05/26 09:50:09 weiden Exp $ ; ; advapi32.def ; @@ -144,8 +144,8 @@ GetLengthSid@4 ;GetMultipleTrusteeOperationA@4 ;GetMultipleTrusteeOperationW@4 ;GetMultipleTrusteeW@4 -;GetNamedSecurityInfoA@32 -;GetNamedSecurityInfoW@32 +GetNamedSecurityInfoA@32 +GetNamedSecurityInfoW@32 ;GetNumberOfEventLogRecords@8 ;GetOldestEventLogRecord@8 ;GetPrivateObjectSecurity@20 @@ -353,9 +353,10 @@ SetAclInformation@16 ;SetEntriesInAclA@16 ;SetEntriesInAclW@16 SetFileSecurityA@20 +SetFileSecurityW@20 SetKernelObjectSecurity@12 -;SetNamedSecurityInfoA@28 -;SetNamedSecurityInfoW@28 +SetNamedSecurityInfoA@28 +SetNamedSecurityInfoW@28 ;SetPrivateObjectSecurity@20 SetSecurityDescriptorDacl@16 SetSecurityDescriptorGroup@12 diff --git a/reactos/lib/advapi32/advapi32.edf b/reactos/lib/advapi32/advapi32.edf index 6634ff7f551..b5985fed2ed 100644 --- a/reactos/lib/advapi32/advapi32.edf +++ b/reactos/lib/advapi32/advapi32.edf @@ -1,4 +1,4 @@ -; $Id: advapi32.edf,v 1.38 2004/05/13 20:42:27 navaraf Exp $ +; $Id: advapi32.edf,v 1.39 2004/05/26 09:50:10 weiden Exp $ ; ; advapi32.edf ; @@ -140,8 +140,8 @@ GetLengthSid=GetLengthSid@4 ;GetMultipleTrusteeOperationA=GetMultipleTrusteeOperationA@4 ;GetMultipleTrusteeOperationW=GetMultipleTrusteeOperationW@4 ;GetMultipleTrusteeW=GetMultipleTrusteeW@4 -;GetNamedSecurityInfoA=GetNamedSecurityInfoA@32 -;GetNamedSecurityInfoW=GetNamedSecurityInfoW@32 +GetNamedSecurityInfoA=GetNamedSecurityInfoA@32 +GetNamedSecurityInfoW=GetNamedSecurityInfoW@32 GetNumberOfEventLogRecords=GetNumberOfEventLogRecords@8 GetOldestEventLogRecord=GetOldestEventLogRecord@8 ;GetPrivateObjectSecurity=GetPrivateObjectSecurity@20 @@ -350,10 +350,10 @@ SetAclInformation=SetAclInformation@16 ;SetEntriesInAclA=SetEntriesInAclA@16 ;SetEntriesInAclW=SetEntriesInAclW@16 SetFileSecurityA=SetFileSecurityA@12 -;SetFileSecurityW=SetFileSecurityW@12 +SetFileSecurityW=SetFileSecurityW@12 SetKernelObjectSecurity=SetKernelObjectSecurity@12 -;SetNamedSecurityInfoA=SetNamedSecurityInfoA@28 -;SetNamedSecurityInfoW=SetNamedSecurityInfoW@28 +SetNamedSecurityInfoA=SetNamedSecurityInfoA@28 +SetNamedSecurityInfoW=SetNamedSecurityInfoW@28 ;SetPrivateObjectSecurity=SetPrivateObjectSecurity@20 SetSecurityDescriptorDacl=SetSecurityDescriptorDacl@16 SetSecurityDescriptorGroup=SetSecurityDescriptorGroup@12 diff --git a/reactos/lib/advapi32/sec/misc.c b/reactos/lib/advapi32/sec/misc.c index 497f248e481..481d86f0cf1 100644 --- a/reactos/lib/advapi32/sec/misc.c +++ b/reactos/lib/advapi32/sec/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.15 2004/05/13 20:42:28 navaraf Exp $ +/* $Id: misc.c,v 1.16 2004/05/26 09:50:10 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -9,6 +9,7 @@ #define NTOS_MODE_USER #include <ntos.h> #include <windows.h> +#include <Accctrl.h> #define NDEBUG #include <debug.h> @@ -110,6 +111,22 @@ GetKernelObjectSecurity(HANDLE Handle, } +/****************************************************************************** + * SetFileSecurityW [ADVAPI32.@] + * Sets the security of a file or directory + * + * @unimplemented + */ +BOOL STDCALL +SetFileSecurityW (LPCWSTR lpFileName, + SECURITY_INFORMATION RequestedInformation, + PSECURITY_DESCRIPTOR pSecurityDescriptor) +{ + DPRINT("SetFileSecurityA : stub\n"); + return TRUE; +} + + /****************************************************************************** * SetFileSecurityA [ADVAPI32.@] * Sets the security of a file or directory @@ -509,4 +526,78 @@ LookupPrivilegeNameW (LPCWSTR lpSystemName, return FALSE; } + +/********************************************************************** + * GetNamedSecurityInfoW EXPORTED + * + * @unimplemented + */ +DWORD STDCALL +GetNamedSecurityInfoW(LPWSTR pObjectName, + SE_OBJECT_TYPE ObjectType, + SECURITY_INFORMATION SecurityInfo, + PSID *ppsidOwner, + PSID *ppsidGroup, + PACL *ppDacl, + PACL *ppSacl, + PSECURITY_DESCRIPTOR *ppSecurityDescriptor) +{ + return ERROR_CALL_NOT_IMPLEMENTED; +} + + +/********************************************************************** + * GetNamedSecurityInfoA EXPORTED + * + * @unimplemented + */ +DWORD STDCALL +GetNamedSecurityInfoA(LPSTR pObjectName, + SE_OBJECT_TYPE ObjectType, + SECURITY_INFORMATION SecurityInfo, + PSID *ppsidOwner, + PSID *ppsidGroup, + PACL *ppDacl, + PACL *ppSacl, + PSECURITY_DESCRIPTOR *ppSecurityDescriptor) +{ + return ERROR_CALL_NOT_IMPLEMENTED; +} + + +/********************************************************************** + * SetNamedSecurityInfoW EXPORTED + * + * @unimplemented + */ +DWORD STDCALL +SetNamedSecurityInfoW(LPWSTR pObjectName, + SE_OBJECT_TYPE ObjectType, + SECURITY_INFORMATION SecurityInfo, + PSID psidOwner, + PSID psidGroup, + PACL pDacl, + PACL pSacl) +{ + return ERROR_CALL_NOT_IMPLEMENTED; +} + + +/********************************************************************** + * SetNamedSecurityInfoA EXPORTED + * + * @unimplemented + */ +DWORD STDCALL +SetNamedSecurityInfoA(LPSTR pObjectName, + SE_OBJECT_TYPE ObjectType, + SECURITY_INFORMATION SecurityInfo, + PSID psidOwner, + PSID psidGroup, + PACL pDacl, + PACL pSacl) +{ + return ERROR_CALL_NOT_IMPLEMENTED; +} + /* EOF */ From 8158fc02d0df82990d197be215435fedb20f2848 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Wed, 26 May 2004 10:58:29 +0000 Subject: [PATCH 1226/1463] Append two newlines to the "Press any key to boot form CD....." string. svn path=/trunk/; revision=9497 --- freeldr/bootsect/isoboot.asm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/freeldr/bootsect/isoboot.asm b/freeldr/bootsect/isoboot.asm index c6ef9bd44da..81287c259ad 100644 --- a/freeldr/bootsect/isoboot.asm +++ b/freeldr/bootsect/isoboot.asm @@ -194,6 +194,11 @@ relocate: %endif .boot_cdrom: +%ifdef WAIT_FOR_KEY + call crlf + call crlf +%endif + ; Save and display the boot drive number mov [DriveNo], dl %ifdef DEBUG_MESSAGES From 6248b04e6f0813a62ecedb03c07c65cf96197ff5 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Wed, 26 May 2004 18:49:06 +0000 Subject: [PATCH 1227/1463] fixed returning uninitialized variable in NtGdiSelectVisRgn() and NtGdiExtSelectClipRgn() svn path=/trunk/; revision=9498 --- reactos/subsys/win32k/objects/cliprgn.c | 9 +++++---- reactos/subsys/win32k/objects/dc.c | 10 ++++++++-- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/reactos/subsys/win32k/objects/cliprgn.c b/reactos/subsys/win32k/objects/cliprgn.c index 5a565624555..71b819e50d6 100644 --- a/reactos/subsys/win32k/objects/cliprgn.c +++ b/reactos/subsys/win32k/objects/cliprgn.c @@ -16,10 +16,10 @@ * 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.39 2004/05/15 20:19:20 weiden Exp $ */ +/* $Id: cliprgn.c,v 1.40 2004/05/26 18:49:06 weiden Exp $ */ #include <w32k.h> -VOID FASTCALL +int FASTCALL CLIPPING_UpdateGCRegion(DC* Dc) { PROSRGNDATA CombinedRegion; @@ -46,7 +46,7 @@ CLIPPING_UpdateGCRegion(DC* Dc) ASSERT(Dc->CombinedClip != NULL); RGNDATA_UnlockRgn(Dc->w.hGCClipRgn); - NtGdiOffsetRgn(Dc->w.hGCClipRgn, -Dc->w.DCOrgX, -Dc->w.DCOrgY); + return NtGdiOffsetRgn(Dc->w.hGCClipRgn, -Dc->w.DCOrgX, -Dc->w.DCOrgY); } HRGN WINAPI SaveVisRgn(HDC hdc) @@ -128,6 +128,7 @@ int STDCALL NtGdiExtSelectClipRgn(HDC hDC, { NtGdiDeleteObject(dc->w.hClipRgn); dc->w.hClipRgn = NULL; + retval = NULLREGION; } } else @@ -162,7 +163,7 @@ int STDCALL NtGdiExtSelectClipRgn(HDC hDC, NtGdiCombineRgn(dc->w.hClipRgn, dc->w.hClipRgn, hrgn, fnMode); } - CLIPPING_UpdateGCRegion(dc); + retval = CLIPPING_UpdateGCRegion(dc); DC_UnlockDc( hDC ); return retval; diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index 360f3f6d63f..eea26dd4325 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.135 2004/05/14 16:55:18 navaraf Exp $ +/* $Id: dc.c,v 1.136 2004/05/26 18:49:06 weiden Exp $ * * DC.C - Device context functions * @@ -1756,7 +1756,7 @@ NtGdiSelectObject(HDC hDC, HGDIOBJ hGDIObj) USHORT Mode; if(!hDC || !hGDIObj) return NULL; - + dc = DC_LockDc(hDC); if (NULL == dc) { @@ -1949,6 +1949,12 @@ NtGdiSelectObject(HDC hDC, HGDIOBJ hGDIObj) case GDI_OBJECT_TYPE_REGION: DC_UnlockDc (hDC); + /* + * The return value is one of the following values: + * SIMPLEREGION + * COMPLEXREGION + * NULLREGION + */ return (HGDIOBJ) NtGdiSelectClipRgn(hDC, (HRGN) hGDIObj); default: From cb1ea2ade72ea9717a782389b6002ffb76506de2 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Wed, 26 May 2004 18:59:21 +0000 Subject: [PATCH 1228/1463] selecting a new clipping region into a dc doesn't return the previous clipping region handle svn path=/trunk/; revision=9499 --- reactos/lib/user32/windows/defwnd.c | 30 ++++++++++------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/reactos/lib/user32/windows/defwnd.c b/reactos/lib/user32/windows/defwnd.c index 55e99be42e4..a35bf7d1615 100644 --- a/reactos/lib/user32/windows/defwnd.c +++ b/reactos/lib/user32/windows/defwnd.c @@ -1,4 +1,4 @@ -/* $Id: defwnd.c,v 1.139 2004/05/21 12:46:59 weiden Exp $ +/* $Id: defwnd.c,v 1.140 2004/05/26 18:59:21 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -466,15 +466,8 @@ UserDrawWindowFrame(HDC hdc, const RECT *rect, } VOID STATIC -UserDrawMovingFrame(HDC hdc, RECT *rect, BOOL thickframe, HRGN ClipRgn) +UserDrawMovingFrame(HDC hdc, RECT *rect, BOOL thickframe) { - HGDIOBJ OldObj; - - if(ClipRgn) - { - OldObj = SelectObject(hdc, ClipRgn); - } - if(thickframe) { UserDrawWindowFrame(hdc, rect, GetSystemMetrics(SM_CXFRAME), GetSystemMetrics(SM_CYFRAME)); @@ -483,11 +476,6 @@ UserDrawMovingFrame(HDC hdc, RECT *rect, BOOL thickframe, HRGN ClipRgn) { UserDrawWindowFrame(hdc, rect, 1, 1); } - - if(ClipRgn) - { - SelectObject(hdc, OldObj); - } } VOID STATIC @@ -628,6 +616,8 @@ DefWndDoSizeMove(HWND hwnd, WORD wParam) DesktopRgn = CreateRectRgnIndirect(&clipRect); } + SelectObject(hdc, DesktopRgn); + if( iconic ) /* create a cursor for dragging */ { HICON hIcon = (HICON)GetClassLongW(hwnd, GCL_HICON); @@ -639,7 +629,7 @@ DefWndDoSizeMove(HWND hwnd, WORD wParam) /* invert frame if WIN31_LOOK to indicate mouse click on caption */ if( !iconic && !DragFullWindows) { - UserDrawMovingFrame( hdc, &sizingRect, thickframe, DesktopRgn ); + UserDrawMovingFrame( hdc, &sizingRect, thickframe); } for(;;) @@ -655,9 +645,9 @@ DefWndDoSizeMove(HWND hwnd, WORD wParam) if (msg.message == WM_PAINT) { - if(!iconic && !DragFullWindows) UserDrawMovingFrame( hdc, &sizingRect, thickframe, DesktopRgn ); + if(!iconic && !DragFullWindows) UserDrawMovingFrame( hdc, &sizingRect, thickframe ); UpdateWindow( msg.hwnd ); - if(!iconic && !DragFullWindows) UserDrawMovingFrame( hdc, &sizingRect, thickframe, DesktopRgn ); + if(!iconic && !DragFullWindows) UserDrawMovingFrame( hdc, &sizingRect, thickframe ); continue; } @@ -706,7 +696,7 @@ DefWndDoSizeMove(HWND hwnd, WORD wParam) else if (ON_RIGHT_BORDER(hittest)) newRect.right += dx; if (ON_TOP_BORDER(hittest)) newRect.top += dy; else if (ON_BOTTOM_BORDER(hittest)) newRect.bottom += dy; - if(!iconic && !DragFullWindows) UserDrawMovingFrame( hdc, &sizingRect, thickframe, DesktopRgn ); + if(!iconic && !DragFullWindows) UserDrawMovingFrame( hdc, &sizingRect, thickframe ); capturePoint = pt; /* determine the hit location */ @@ -717,7 +707,7 @@ DefWndDoSizeMove(HWND hwnd, WORD wParam) if (!iconic) { if(!DragFullWindows) - UserDrawMovingFrame( hdc, &newRect, thickframe, DesktopRgn ); + UserDrawMovingFrame( hdc, &newRect, thickframe ); else { /* To avoid any deadlocks, all the locks on the windows structures must be suspended before the SetWindowPos */ @@ -744,7 +734,7 @@ DefWndDoSizeMove(HWND hwnd, WORD wParam) DestroyCursor( hDragCursor ); } else if(!DragFullWindows) - UserDrawMovingFrame( hdc, &sizingRect, thickframe, DesktopRgn ); + UserDrawMovingFrame( hdc, &sizingRect, thickframe ); if (Style & WS_CHILD) ReleaseDC( hWndParent, hdc ); From 72afcc3bb84efe4df8be9a4e372af9fbffc42265 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Wed, 26 May 2004 19:53:48 +0000 Subject: [PATCH 1229/1463] - Fixed the third passed parameter to NtSetInformationThread call in ImpersonateLoggedOnUser. svn path=/trunk/; revision=9500 --- reactos/lib/advapi32/sec/misc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/advapi32/sec/misc.c b/reactos/lib/advapi32/sec/misc.c index 481d86f0cf1..3b041d5469f 100644 --- a/reactos/lib/advapi32/sec/misc.c +++ b/reactos/lib/advapi32/sec/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.16 2004/05/26 09:50:10 weiden Exp $ +/* $Id: misc.c,v 1.17 2004/05/26 19:53:48 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -242,7 +242,7 @@ ImpersonateLoggedOnUser(HANDLE hToken) /* Impersonate the the current thread */ Status = NtSetInformationThread (NtCurrentThread (), ThreadImpersonationToken, - NewToken, + &NewToken, sizeof(HANDLE)); if (Duplicated == TRUE) From 5141945b5767a33b08c182a57f3f9f4eb8b8f561 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Wed, 26 May 2004 19:56:35 +0000 Subject: [PATCH 1230/1463] - Return success for SystemFileCacheInformation requests to NtQuerySystemInformation, so we can see some information in the Task Manager. svn path=/trunk/; revision=9501 --- reactos/include/ntos/zwtypes.h | 4 +++- reactos/ntoskrnl/ex/sysinfo.c | 16 +++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/reactos/include/ntos/zwtypes.h b/reactos/include/ntos/zwtypes.h index 8e240f772d6..3b8f166351c 100755 --- a/reactos/include/ntos/zwtypes.h +++ b/reactos/include/ntos/zwtypes.h @@ -441,7 +441,9 @@ struct _SYSTEM_CACHE_INFORMATION ULONG PageFaultCount; ULONG MinimumWorkingSet; ULONG MaximumWorkingSet; - ULONG Unused[4]; + ULONG TransitionSharedPages; + ULONG TransitionSharedPagesPeak; + ULONG Unused[2]; } SYSTEM_CACHE_INFORMATION; diff --git a/reactos/ntoskrnl/ex/sysinfo.c b/reactos/ntoskrnl/ex/sysinfo.c index 0ed3180ee36..94e61dac831 100644 --- a/reactos/ntoskrnl/ex/sysinfo.c +++ b/reactos/ntoskrnl/ex/sysinfo.c @@ -1,4 +1,4 @@ -/* $Id: sysinfo.c,v 1.34 2004/05/02 19:34:21 ekohl Exp $ +/* $Id: sysinfo.c,v 1.35 2004/05/26 19:56:35 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -763,13 +763,23 @@ QSI_DEF(SystemVdmBopInformation) /* Class 21 - File Cache Information */ QSI_DEF(SystemFileCacheInformation) { + SYSTEM_CACHE_INFORMATION *Sci = (SYSTEM_CACHE_INFORMATION *) Buffer; + if (Size < sizeof (SYSTEM_CACHE_INFORMATION)) { * ReqSize = sizeof (SYSTEM_CACHE_INFORMATION); return (STATUS_INFO_LENGTH_MISMATCH); } - /* FIXME */ - return (STATUS_NOT_IMPLEMENTED); + + Sci->CurrentSize = 0; /* FIXME */ + Sci->PeakSize = 0; /* FIXME */ + Sci->PageFaultCount = 0; /* FIXME */ + Sci->MinimumWorkingSet = 0; /* FIXME */ + Sci->MaximumWorkingSet = 0; /* FIXME */ + Sci->TransitionSharedPages = 0; /* FIXME */ + Sci->TransitionSharedPagesPeak = 0; /* FIXME */ + + return (STATUS_SUCCESS); } SSI_DEF(SystemFileCacheInformation) From ac9cb4c5a6ec57a48213a7ba41b1cbae642866b1 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin <aleksey@reactos.org> Date: Wed, 26 May 2004 20:37:25 +0000 Subject: [PATCH 1231/1463] Fix warnings by vandread. svn path=/trunk/; revision=9502 --- rosapps/sysutils/man/man.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/rosapps/sysutils/man/man.c b/rosapps/sysutils/man/man.c index 8c192a02439..9a420477670 100644 --- a/rosapps/sysutils/man/man.c +++ b/rosapps/sysutils/man/man.c @@ -88,7 +88,7 @@ Usage() int AnalyzeArgv(char *argument) { - char element=0; + int element=0; char HelpFlag=0; char *keys[]={"--help","/h","/?","-h"}; char *sections[]={".1",".2",".3",".4",".5",".6",".7",".8",".9"}; @@ -123,7 +123,7 @@ int AnalyzeFile() { char *cur_string=(char*)malloc(sizeof(char)*MAXLINE); - char symbol=0; + int symbol=0; char *THtag=(char*)malloc(sizeof(char)*MAXLINE); @@ -157,7 +157,7 @@ AnalyzeFile() if(symbol) TagFlag=1; - for(symbol;cur_string[symbol]!='\n'; symbol++) + for(;cur_string[symbol]!='\n'; symbol++) putchar(cur_string[symbol]); putchar(' '); } @@ -209,6 +209,7 @@ AnalyzeFile() else text_outp(); // print plane text th_outp(); /* END of TAGs processing */ + return 0; } @@ -225,5 +226,6 @@ main(int argc, char *argv[]) if(OpenFlag)CloseF(); SetCl(NORMAL); + return 0; } From 43836af86c2d7d4b4cd0cabe6f4721235c754539 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Wed, 26 May 2004 20:58:37 +0000 Subject: [PATCH 1232/1463] - Implement dummy device settings pages. - Hide the cursor at startup. svn path=/trunk/; revision=9503 --- reactos/subsys/system/usetup/console.c | 36 ++++ reactos/subsys/system/usetup/console.h | 6 + reactos/subsys/system/usetup/usetup.c | 283 ++++++++++++++++++++++++- 3 files changed, 316 insertions(+), 9 deletions(-) diff --git a/reactos/subsys/system/usetup/console.c b/reactos/subsys/system/usetup/console.c index f207594fb25..ea6e546f141 100644 --- a/reactos/subsys/system/usetup/console.c +++ b/reactos/subsys/system/usetup/console.c @@ -821,6 +821,42 @@ SetStatusText(char* fmt, ...) } +VOID +InvertTextXY(SHORT x, SHORT y, SHORT col, SHORT row) +{ + COORD coPos; + ULONG Written; + + for (coPos.Y = y; coPos.Y < y + row; coPos.Y++) + { + coPos.X = x; + + FillConsoleOutputAttribute(0x71, + col, + coPos, + &Written); + } +} + + +VOID +NormalTextXY(SHORT x, SHORT y, SHORT col, SHORT row) +{ + COORD coPos; + ULONG Written; + + for (coPos.Y = y; coPos.Y < y + row; coPos.Y++) + { + coPos.X = x; + + FillConsoleOutputAttribute(0x17, + col, + coPos, + &Written); + } +} + + VOID SetTextXY(SHORT x, SHORT y, PCHAR Text) { diff --git a/reactos/subsys/system/usetup/console.h b/reactos/subsys/system/usetup/console.h index c68cd46ca74..495f54eb47e 100644 --- a/reactos/subsys/system/usetup/console.h +++ b/reactos/subsys/system/usetup/console.h @@ -115,6 +115,12 @@ ClearScreen(VOID); VOID SetStatusText(char* fmt, ...); +VOID +InvertTextXY(SHORT x, SHORT y, SHORT col, SHORT row); + +VOID +NormalTextXY(SHORT x, SHORT y, SHORT col, SHORT row); + VOID SetTextXY(SHORT x, SHORT y, PCHAR Text); diff --git a/reactos/subsys/system/usetup/usetup.c b/reactos/subsys/system/usetup/usetup.c index a0edcd97171..54ed334e5b8 100644 --- a/reactos/subsys/system/usetup/usetup.c +++ b/reactos/subsys/system/usetup/usetup.c @@ -56,6 +56,13 @@ typedef enum _PAGE_NUMBER INTRO_PAGE, INSTALL_INTRO_PAGE, + DEVICE_SETTINGS_PAGE, + COMPUTER_SETTINGS_PAGE, + DISPLAY_SETTINGS_PAGE, + KEYBOARD_SETTINGS_PAGE, + LAYOUT_SETTINGS_PAGE, + POINTER_SETTINGS_PAGE, + SELECT_PARTITION_PAGE, CREATE_PARTITION_PAGE, DELETE_PARTITION_PAGE, @@ -391,12 +398,12 @@ ConfirmQuit(PINPUT_RECORD Ir) } } - return(Result); + return Result; } VOID -CheckUnattendedSetup() +CheckUnattendedSetup(VOID) { WCHAR UnattendInfPath[MAX_PATH]; UNICODE_STRING FileName; @@ -700,7 +707,7 @@ IntroPage(PINPUT_RECORD Ir) return INSTALL_INTRO_PAGE; } - while(TRUE) + while (TRUE) { ConInKey(Ir); @@ -831,16 +838,252 @@ InstallIntroPage(PINPUT_RECORD Ir) (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */ { if (ConfirmQuit(Ir) == TRUE) - return(QUIT_PAGE); + return QUIT_PAGE; break; } else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(SELECT_PARTITION_PAGE); + return DEVICE_SETTINGS_PAGE; } } - return(INSTALL_INTRO_PAGE); + return INSTALL_INTRO_PAGE; +} + + +static PAGE_NUMBER +DeviceSettingsPage(PINPUT_RECORD Ir) +{ + static ULONG Line = 17; + + SetTextXY(6, 8, "The list below shows the current device settings."); + + SetTextXY(8, 11, " Computer:"); + SetTextXY(8, 12, " Display:"); + SetTextXY(8, 13, " Keyboard:"); + SetTextXY(8, 14, "Keyboard layout:"); + SetTextXY(8, 15, " Pointer device:"); + + SetTextXY(8, 17, " Accept:"); + + + SetTextXY(25, 11, "Standard-PC"); + SetTextXY(25, 12, "Automatic detection"); + SetTextXY(25, 13, "XT-, AT- or extended keyboard (83-105 keys)"); + SetTextXY(25, 14, "English (USA)"); + SetTextXY(25, 15, "PS/2 (Mouse port) mouse"); + + SetTextXY(25, 17, "Accept these device setings"); + InvertTextXY (24, Line, 48, 1); + + + SetTextXY(6, 20, "You can change the hardware settings by pressing the UP or DOWN keys"); + SetTextXY(6, 21, "to select an entry. Then press the ENTER key to select alternative"); + SetTextXY(6, 22, "settings."); + + SetTextXY(6, 24, "When all settings are correct, select \"Accept these device setings\""); + SetTextXY(6, 25, "and press ENTER."); + + SetStatusText(" ENTER = Continue F3 = Quit"); + + while(TRUE) + { + ConInKey(Ir); + + if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */ + { + NormalTextXY (24, Line, 48, 1); + if (Line == 15) + Line = 17; + else if (Line == 17) + Line = 11; + else + Line++; + InvertTextXY (24, Line, 48, 1); + } + if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */ + { + NormalTextXY (24, Line, 48, 1); + if (Line == 11) + Line = 17; + else if (Line == 17) + Line = 15; + else + Line--; + InvertTextXY (24, 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 == 11) + return COMPUTER_SETTINGS_PAGE; + else if (Line == 12) + return DISPLAY_SETTINGS_PAGE; + else if (Line == 13) + return KEYBOARD_SETTINGS_PAGE; + else if (Line == 14) + return LAYOUT_SETTINGS_PAGE; + else if (Line == 15) + return POINTER_SETTINGS_PAGE; + else if (Line == 17) + return SELECT_PARTITION_PAGE; + } + } + + return DEVICE_SETTINGS_PAGE; +} + + +static PAGE_NUMBER +ComputerSettingsPage(PINPUT_RECORD Ir) +{ + SetTextXY(6, 8, "Computer settings are not implemented yet."); + + + 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 DEVICE_SETTINGS_PAGE; + } + } + + return COMPUTER_SETTINGS_PAGE; +} + + +static PAGE_NUMBER +DisplaySettingsPage(PINPUT_RECORD Ir) +{ + SetTextXY(6, 8, "Display settings are not implemented yet."); + + + 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 DEVICE_SETTINGS_PAGE; + } + } + + return DISPLAY_SETTINGS_PAGE; +} + + +static PAGE_NUMBER +KeyboardSettingsPage(PINPUT_RECORD Ir) +{ + SetTextXY(6, 8, "Keyboard settings are not implemented yet."); + + + 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 DEVICE_SETTINGS_PAGE; + } + } + + return DISPLAY_SETTINGS_PAGE; +} + + +static PAGE_NUMBER +LayoutSettingsPage(PINPUT_RECORD Ir) +{ + SetTextXY(6, 8, "Keyboard layout settings are not implemented yet."); + + + 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 DEVICE_SETTINGS_PAGE; + } + } + + return DISPLAY_SETTINGS_PAGE; +} + + +static PAGE_NUMBER +PointerSettingsPage(PINPUT_RECORD Ir) +{ + SetTextXY(6, 8, "Pointer settings are not implemented yet."); + + + 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 DEVICE_SETTINGS_PAGE; + } + } + + return DISPLAY_SETTINGS_PAGE; } @@ -871,7 +1114,7 @@ SelectPartitionPage(PINPUT_RECORD Ir) if (PartitionList == NULL) { /* FIXME: show an error dialog */ - return(QUIT_PAGE); + return QUIT_PAGE; } } @@ -3445,6 +3688,8 @@ NtProcessStartup(PPEB Peb) RtlInitUnicodeString(&DestinationRootPath, NULL); RtlInitUnicodeString(&SystemRootPath, NULL); + /* Hide the cursor */ + SetCursorType(TRUE, FALSE); Page = START_PAGE; while (Page != REBOOT_PAGE) @@ -3476,9 +3721,29 @@ NtProcessStartup(PPEB Peb) break; #endif -#if 0 case DEVICE_SETTINGS_PAGE: -#endif + Page = DeviceSettingsPage(&Ir); + break; + + case COMPUTER_SETTINGS_PAGE: + Page = ComputerSettingsPage(&Ir); + break; + + case DISPLAY_SETTINGS_PAGE: + Page = DisplaySettingsPage(&Ir); + break; + + case KEYBOARD_SETTINGS_PAGE: + Page = KeyboardSettingsPage(&Ir); + break; + + case LAYOUT_SETTINGS_PAGE: + Page = LayoutSettingsPage(&Ir); + break; + + case POINTER_SETTINGS_PAGE: + Page = PointerSettingsPage(&Ir); + break; case SELECT_PARTITION_PAGE: Page = SelectPartitionPage(&Ir); From ae8595141361223fa929cbe46d2175bc56d0458b Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Wed, 26 May 2004 21:47:07 +0000 Subject: [PATCH 1233/1463] - New font substitution: MS Sans Serif -> Bitstream Vera Serif svn path=/trunk/; revision=9504 --- reactos/bootdata/hivesft.inf | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/bootdata/hivesft.inf b/reactos/bootdata/hivesft.inf index 5d6a985c2fa..81658fb540b 100644 --- a/reactos/bootdata/hivesft.inf +++ b/reactos/bootdata/hivesft.inf @@ -43,5 +43,6 @@ HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SysFontSubstitutes","Arial",0 HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SysFontSubstitutes","Courier New",0x00000000,"Bitstream Vera Sans Mono" 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 Serif" ; EOF From 94c04c2051467d168f8a3b4fd1feaf9616fabda5 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Thu, 27 May 2004 11:47:42 +0000 Subject: [PATCH 1234/1463] fixed missing class dereferencings and store a list of windows in the class object svn path=/trunk/; revision=9505 --- reactos/subsys/win32k/include/class.h | 16 ++++++++++++++-- reactos/subsys/win32k/include/window.h | 2 ++ reactos/subsys/win32k/ntuser/class.c | 23 +++++++++++++++++------ reactos/subsys/win32k/ntuser/window.c | 22 ++++++++++++++++++---- 4 files changed, 51 insertions(+), 12 deletions(-) diff --git a/reactos/subsys/win32k/include/class.h b/reactos/subsys/win32k/include/class.h index b8a752b6005..527b50fc2d7 100644 --- a/reactos/subsys/win32k/include/class.h +++ b/reactos/subsys/win32k/include/class.h @@ -28,6 +28,9 @@ typedef struct _WNDCLASS_OBJECT BOOL Global; LIST_ENTRY ListEntry; PCHAR ExtraData; + /* list of windows */ + FAST_MUTEX ClassWindowsListLock; + LIST_ENTRY ClassWindowsListHead; } WNDCLASS_OBJECT, *PWNDCLASS_OBJECT; NTSTATUS FASTCALL @@ -37,10 +40,19 @@ NTSTATUS FASTCALL CleanupClassImpl(VOID); #define IntLockProcessClasses(W32Process) \ - ExAcquireFastMutex(&W32Process->ClassListLock) + ExAcquireFastMutex(&(W32Process)->ClassListLock) #define IntUnLockProcessClasses(W32Process) \ - ExReleaseFastMutex(&W32Process->ClassListLock) + ExReleaseFastMutex(&(W32Process)->ClassListLock) + +#define IntLockClassWindows(ClassObj) \ + ExAcquireFastMutex(&(ClassObj)->ClassWindowsListLock) + +#define IntUnLockClassWindows(ClassObj) \ + ExReleaseFastMutex(&(ClassObj)->ClassWindowsListLock) + +#define ClassDereferenceObject(ClassObj) \ + ObmDereferenceObject(ClassObj) BOOL FASTCALL ClassReferenceClassByAtom( diff --git a/reactos/subsys/win32k/include/window.h b/reactos/subsys/win32k/include/window.h index 77a280a0b63..03da203bd3a 100644 --- a/reactos/subsys/win32k/include/window.h +++ b/reactos/subsys/win32k/include/window.h @@ -30,6 +30,8 @@ typedef struct _WINDOW_OBJECT { /* Pointer to the window class. */ PWNDCLASS_OBJECT Class; + /* entry in the window list of the class object */ + LIST_ENTRY ClassListEntry; /* Extended style. */ DWORD ExStyle; /* Window name. */ diff --git a/reactos/subsys/win32k/ntuser/class.c b/reactos/subsys/win32k/ntuser/class.c index 4cab09725ff..c38f3f6fa06 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.56 2004/05/23 14:04:58 weiden Exp $ +/* $Id: class.c,v 1.57 2004/05/27 11:47:42 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -366,6 +366,9 @@ IntCreateClass( ClassObject->ExtraData = NULL; } + InitializeListHead(&ClassObject->ClassWindowsListHead); + ExInitializeFastMutex(&ClassObject->ClassWindowsListLock); + return(ClassObject); } @@ -690,34 +693,42 @@ NtUserUnregisterClass( if (!ClassReferenceClassByNameOrAtom(&Class, ClassNameOrAtom, hInstance)) { + ObDereferenceObject(WinStaObject); SetLastWin32Error(ERROR_CLASS_DOES_NOT_EXIST); return FALSE; } if (Class->hInstance && Class->hInstance != hInstance) { - ObmDereferenceObject(Class); + ClassDereferenceObject(Class); + ObDereferenceObject(WinStaObject); SetLastWin32Error(ERROR_CLASS_DOES_NOT_EXIST); return FALSE; } - if (ObmGetReferenceCount(Class) > 2) + IntLockClassWindows(Class); + if (!IsListEmpty(&Class->ClassWindowsListHead)) { + IntUnLockClassWindows(Class); + /* Dereference the ClassReferenceClassByNameOrAtom() call */ ObmDereferenceObject(Class); + ObDereferenceObject(WinStaObject); SetLastWin32Error(ERROR_CLASS_HAS_WINDOWS); return FALSE; } + IntUnLockClassWindows(Class); /* Dereference the ClassReferenceClassByNameOrAtom() call */ - ObmDereferenceObject(Class); + ClassDereferenceObject(Class); RemoveEntryList(&Class->ListEntry); RtlDeleteAtomFromAtomTable(WinStaObject->AtomTable, Class->Atom); - ObDereferenceObject(WinStaObject); /* Free the object */ - ObmDereferenceObject(Class); + ClassDereferenceObject(Class); + + ObDereferenceObject(WinStaObject); return TRUE; } diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index eef3351487d..5af359c5efd 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.235 2004/05/19 19:16:47 weiden Exp $ +/* $Id: window.c,v 1.236 2004/05/27 11:47:42 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -387,7 +387,13 @@ static LRESULT IntDestroyWindow(PWINDOW_OBJECT Window, /* don't remove the WINDOWSTATUS_DESTROYING bit */ IntUnLockThreadWindows(Window->OwnerThread->Win32Thread); - ObmDereferenceObject(Window->Class); + /* remove the window from the class object */ + IntLockClassWindows(Window->Class); + RemoveEntryList(&Window->ClassListEntry); + IntUnLockClassWindows(Window->Class); + + /* dereference the class */ + ClassDereferenceObject(Window->Class); Window->Class = NULL; if(Window->WindowRegion) @@ -1509,7 +1515,7 @@ NtUserCreateWindowEx(DWORD dwExStyle, &WinStaObject); if (!NT_SUCCESS(Status)) { - ObmDereferenceObject(ClassObject); + ClassDereferenceObject(ClassObject); RtlFreeUnicodeString(&WindowName); if (NULL != ParentWindow) { @@ -1530,7 +1536,7 @@ NtUserCreateWindowEx(DWORD dwExStyle, if (!WindowObject) { ObDereferenceObject(WinStaObject); - ObmDereferenceObject(ClassObject); + ClassDereferenceObject(ClassObject); RtlFreeUnicodeString(&WindowName); if (NULL != ParentWindow) { @@ -1551,6 +1557,10 @@ NtUserCreateWindowEx(DWORD dwExStyle, * Fill out the structure describing it. */ WindowObject->Class = ClassObject; + IntLockClassWindows(ClassObject); + InsertTailList(&ClassObject->ClassWindowsListHead, &WindowObject->ClassListEntry); + IntUnLockClassWindows(ClassObject); + WindowObject->ExStyle = dwExStyle; WindowObject->Style = dwStyle & ~WS_VISIBLE; DPRINT("1: Style is now %lx\n", WindowObject->Style); @@ -1690,6 +1700,7 @@ NtUserCreateWindowEx(DWORD dwExStyle, /* FIXME - Delete window object and remove it from the thread windows list */ /* FIXME - delete allocated DCE */ + ClassDereferenceObject(ClassObject); DPRINT1("CBT-hook returned !0\n"); return (HWND) NULL; } @@ -1907,6 +1918,7 @@ NtUserCreateWindowEx(DWORD dwExStyle, { IntReleaseWindowObject(ParentWindow); } + ClassDereferenceObject(ClassObject); DPRINT("NtUserCreateWindowEx(): send CREATE message failed.\n"); return((HWND)0); } @@ -2463,6 +2475,8 @@ NtUserFindWindowEx(HWND hwndParent, } #endif + ClassDereferenceObject(ClassObject); + Cleanup: if(ClassName.Length > 0 && ClassName.Buffer) ExFreePool(ClassName.Buffer); From 6e3bbc606d9d6f0480c745e39f2c483ee8c29dd8 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Thu, 27 May 2004 11:49:48 +0000 Subject: [PATCH 1235/1463] - Don't change the environment block if the number of variables has not changed (in BlockEnvToEnviron). - Use a copy of the environment strings (in BlockEnvToEnviron). svn path=/trunk/; revision=9506 --- reactos/lib/msvcrt/misc/dllmain.c | 80 ++++++++++--------------------- reactos/lib/msvcrt/misc/environ.c | 78 ++++++++++++++++++++---------- 2 files changed, 78 insertions(+), 80 deletions(-) diff --git a/reactos/lib/msvcrt/misc/dllmain.c b/reactos/lib/msvcrt/misc/dllmain.c index e9c159890f8..d86e5e7bdfe 100644 --- a/reactos/lib/msvcrt/misc/dllmain.c +++ b/reactos/lib/msvcrt/misc/dllmain.c @@ -1,4 +1,4 @@ -/* $Id: dllmain.c,v 1.21 2004/05/11 20:44:30 gvg Exp $ +/* $Id: dllmain.c,v 1.22 2004/05/27 11:49:48 hbirr Exp $ * * dllmain.c * @@ -14,9 +14,9 @@ * DISCLAMED. This includes but is not limited to warrenties of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * - * $Revision: 1.21 $ - * $Author: gvg $ - * $Date: 2004/05/11 20:44:30 $ + * $Revision: 1.22 $ + * $Author: hbirr $ + * $Date: 2004/05/27 11:49:48 $ * */ @@ -48,8 +48,6 @@ extern char** __initenv; /* pointer to initial environment block */ /* LIBRARY GLOBAL VARIABLES ***************************************************/ -static int nAttachCount = 0; - HANDLE hHeap = NULL; /* handle for heap */ @@ -69,22 +67,11 @@ DllMain(PVOID hinstDll, ULONG dwReason, PVOID reserved) _winminor = _osver & 0xFF; _winver = (_winmajor << 8) + _winminor; _osver = (_osver >> 16) & 0xFFFF; - if (hHeap == NULL || hHeap == INVALID_HANDLE_VALUE) - { - hHeap = HeapCreate(0, 100000, 0); - if (hHeap == NULL || hHeap == INVALID_HANDLE_VALUE) - { - return FALSE; - } - } - if (nAttachCount==0) - { - if (!__fileno_init()) { - HeapDestroy(hHeap); - hHeap = NULL; - return FALSE; - } - } + hHeap = HeapCreate(0, 100000, 0); + if (hHeap == NULL) + return FALSE; + if (!__fileno_init()) + return FALSE; /* create tls stuff */ if (!CreateThreadData()) @@ -102,7 +89,6 @@ DllMain(PVOID hinstDll, ULONG dwReason, PVOID reserved) msvcrt_init_mt_locks(); msvcrt_init_args(); - nAttachCount++; DPRINT("Attach done\n"); break; @@ -115,42 +101,26 @@ DllMain(PVOID hinstDll, ULONG dwReason, PVOID reserved) case DLL_PROCESS_DETACH://0 DPRINT("Detach %d\n", nAttachCount); - if (nAttachCount > 0) - { - nAttachCount--; + /* FIXME: more cleanup... */ + _fcloseall(); - /* Deinitialization of the WINE code */ - msvcrt_free_args(); - msvcrt_free_mt_locks(); + /* destroy tls stuff */ + DestroyThreadData(); - /* FIXME: more cleanup... */ - _fcloseall(); + if (__initenv && __initenv != _environ) + { + free(__initenv[0]); + free(__initenv); + } + if (_environ) + { + free(_environ[0]); + free(_environ); + } + /* destroy heap */ + HeapDestroy(hHeap); - /* destroy tls stuff */ - DestroyThreadData(); - - /* destroy heap */ - if (nAttachCount == 0) - { - if (__initenv && __initenv != _environ) - { - FreeEnvironmentStringsA(__initenv[0]); - free(__initenv); - __initenv = NULL; - } - if (_environ) - { - FreeEnvironmentStringsA(_environ[0]); - free(_environ); - _environ = NULL; - } -#if 1 - HeapDestroy(hHeap); - hHeap = NULL; -#endif - } DPRINT("Detach done\n"); - } break; } diff --git a/reactos/lib/msvcrt/misc/environ.c b/reactos/lib/msvcrt/misc/environ.c index e3ee991e27f..8bf7447cad2 100644 --- a/reactos/lib/msvcrt/misc/environ.c +++ b/reactos/lib/msvcrt/misc/environ.c @@ -1,4 +1,4 @@ -/* $Id: environ.c,v 1.7 2004/02/21 08:02:49 tamlin Exp $ +/* $Id: environ.c,v 1.8 2004/05/27 11:49:48 hbirr Exp $ * * dllmain.c * @@ -20,6 +20,7 @@ unsigned int _winmajor = 0; unsigned int _winver = 0; char *_acmdln = NULL; /* pointer to ascii command line */ +unsigned _envvar_count; /* number of environment vars within current environment */ #undef _environ char **_environ = NULL; /* pointer to environment block */ char ***_environ_dll = &_environ;/* pointer to environment block */ @@ -43,46 +44,73 @@ int *__p__commode(void) // not exported by NTDLL int BlockEnvToEnviron(void) { char * ptr, * ptr2; - int i, count; + int i, count, len, size; DPRINT("BlockEnvToEnviron()\n"); - if (_environ && _environ != __initenv) { - FreeEnvironmentStringsA(_environ[0]); - free(_environ); - } - _environ = NULL; ptr2 = ptr = (char*)GetEnvironmentStringsA(); if (ptr == NULL) { - DPRINT("GetEnvironmentStringsA() returnd NULL\n"); - return -1; + return -1; } + + size = 0; count = 0; while (*ptr2) { - /* skip current directory of the form "=C:=C:\directory\" */ - if (*ptr2 != '=') { - count++; - } - ptr2 += strlen(ptr2) + 1; + len = strlen(ptr2); + if (*ptr2 != '=') { + count++; + size += len + 1; + } + ptr2 += len + 1; } - _environ = malloc((count + 1) * sizeof(char*)); - if (_environ == NULL) { - FreeEnvironmentStringsA(ptr); - return -1; + + if (count != _envvar_count) { + if (_environ && _environ != __initenv) { + free(_environ[0]); + _environ = realloc(_environ, (count + 1) * sizeof(char*)); + } else { + _environ = malloc((count + 1) * sizeof(char*)); + } + if (_environ == NULL) { + FreeEnvironmentStringsA(ptr); + _envvar_count = 0; + return -1; + } + _environ[0] = NULL; } + if (_environ[0] != NULL) { + free(_environ[0]); + } + + _environ[0] = malloc(size); + if (_environ[0] == NULL) { + FreeEnvironmentStringsA(ptr); + free(_environ); + _envvar_count = 0; + return -1; + } + + ptr2 = ptr; i = 0; - while (i < count && *ptr) { - if (*ptr != '=') { - _environ[i] = ptr; - ++i; - } - ptr += strlen(ptr) + 1; + while (*ptr2 && i < count) { + len = strlen(ptr2); + /* skip current directory of the form "=C:=C:\directory\" */ + if (*ptr2 != '=') { + memcpy(_environ[i], ptr2, len + 1); + i++; + if (i < count) { + _environ[i] = _environ[i - 1] + len + 1; + } + } + ptr2 += len + 1; } _environ[i] = NULL; - if (__initenv == NULL) + _envvar_count = count; + if (__initenv == NULL) { __initenv = _environ; } + FreeEnvironmentStringsA(ptr); return 0; } From 961036b735d7dfced1ca37134df4c9588d847157 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III <royce3@ev1.net> Date: Thu, 27 May 2004 12:35:23 +0000 Subject: [PATCH 1236/1463] eliminate unnecessary multiplications in the inner loops of DIB_1BPP_BitBltSrcCopy_From1BPP svn path=/trunk/; revision=9507 --- reactos/subsys/win32k/dib/dib1bpp.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib1bpp.c b/reactos/subsys/win32k/dib/dib1bpp.c index 996d31b245b..57c7e6daf34 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.28 2004/05/14 22:56:17 gvg Exp $ */ +/* $Id: dib1bpp.c,v 1.29 2004/05/27 12:35:23 royce Exp $ */ #include <w32k.h> VOID @@ -77,6 +77,7 @@ DIB_1BPP_BitBltSrcCopy_From1BPP ( // which direction are we going? int xinc; int yinc; + int ySrcDelta, yDstDelta; // following 4 variables are used for the y-sweep int dy; // dest y @@ -101,6 +102,8 @@ DIB_1BPP_BitBltSrcCopy_From1BPP ( dy2 = DestRect->bottom - 1; sy1 = SourcePoint->y; yinc = 1; + ySrcDelta = SourceSurf->lDelta; + yDstDelta = DestSurf->lDelta; } else { @@ -109,6 +112,8 @@ DIB_1BPP_BitBltSrcCopy_From1BPP ( dy2 = DestRect->top; sy1 = SourcePoint->y + dy1 - dy2; yinc = -1; + ySrcDelta = -SourceSurf->lDelta; + yDstDelta = -DestSurf->lDelta; } if ( DestRect->left <= SourcePoint->x ) { @@ -161,8 +166,8 @@ DIB_1BPP_BitBltSrcCopy_From1BPP ( if ( dy == dy2 ) break; dy += yinc; - pd += yinc * DestSurf->lDelta; - ps += yinc * SourceSurf->lDelta; + pd += yDstDelta; + ps += ySrcDelta; } } else if ( !(0xFF00 & (srcmask<<shift) ) ) // check if ps[0] not needed... @@ -176,8 +181,8 @@ DIB_1BPP_BitBltSrcCopy_From1BPP ( if ( dy == dy2 ) break; dy += yinc; - pd += yinc * DestSurf->lDelta; - ps += yinc * SourceSurf->lDelta; + pd += yDstDelta; + ps += ySrcDelta; } } else if ( !(0xFF & (srcmask<<shift) ) ) // check if ps[1] not needed... @@ -191,8 +196,8 @@ DIB_1BPP_BitBltSrcCopy_From1BPP ( if ( dy == dy2 ) break; dy += yinc; - pd += yinc * DestSurf->lDelta; - ps += yinc * SourceSurf->lDelta; + pd += yDstDelta; + ps += ySrcDelta; } } else // both ps[0] and ps[1] are needed @@ -206,8 +211,8 @@ DIB_1BPP_BitBltSrcCopy_From1BPP ( if ( dy == dy2 ) break; dy += yinc; - pd += yinc * DestSurf->lDelta; - ps += yinc * SourceSurf->lDelta; + pd += yDstDelta; + ps += ySrcDelta; } } From d7b5932acd918f80311b0f80c9a89463673ab492 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Thu, 27 May 2004 14:50:17 +0000 Subject: [PATCH 1237/1463] fixed filename in include statement and added some debug prints for stubs svn path=/trunk/; revision=9508 --- reactos/lib/advapi32/sec/misc.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/reactos/lib/advapi32/sec/misc.c b/reactos/lib/advapi32/sec/misc.c index 3b041d5469f..88d3c9c1983 100644 --- a/reactos/lib/advapi32/sec/misc.c +++ b/reactos/lib/advapi32/sec/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.17 2004/05/26 19:53:48 navaraf Exp $ +/* $Id: misc.c,v 1.18 2004/05/27 14:50:17 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -9,7 +9,7 @@ #define NTOS_MODE_USER #include <ntos.h> #include <windows.h> -#include <Accctrl.h> +#include <accctrl.h> #define NDEBUG #include <debug.h> @@ -68,7 +68,7 @@ GetFileSecurityA (LPCSTR lpFileName, DWORD nLength, LPDWORD lpnLengthNeeded) { - DPRINT("GetFileSecurityA: stub\n"); + DPRINT1("GetFileSecurityA: stub\n"); return TRUE; } @@ -81,7 +81,7 @@ GetFileSecurityW (LPCWSTR lpFileName, PSECURITY_DESCRIPTOR pSecurityDescriptor, DWORD nLength, LPDWORD lpnLengthNeeded) { - DPRINT("GetFileSecurityW: stub\n"); + DPRINT1("GetFileSecurityW: stub\n"); return TRUE; } @@ -122,7 +122,7 @@ SetFileSecurityW (LPCWSTR lpFileName, SECURITY_INFORMATION RequestedInformation, PSECURITY_DESCRIPTOR pSecurityDescriptor) { - DPRINT("SetFileSecurityA : stub\n"); + DPRINT1("SetFileSecurityW : stub\n"); return TRUE; } @@ -332,6 +332,7 @@ GetUserNameA( LPSTR lpszName, LPDWORD lpSize ) // *lpSize = len; // strcpy(lpszName, name); + DPRINT1("GetUserNameA: stub\n"); return TRUE; } @@ -358,6 +359,7 @@ GetUserNameW( LPWSTR lpszName, LPDWORD lpSize ) // *lpSize = len; // MultiByteToWideChar( CP_ACP, 0, name, -1, lpszName, len ); + DPRINT1("GetUserNameW: stub\n"); return TRUE; } @@ -457,6 +459,7 @@ LookupPrivilegeValueW (LPCWSTR lpSystemName, LPCWSTR lpName, PLUID lpLuid) { + DPRINT1("LookupPrivilegeValueW: stub\n"); return FALSE; } @@ -473,6 +476,7 @@ LookupPrivilegeDisplayNameA (LPCSTR lpSystemName, LPDWORD cbDisplayName, LPDWORD lpLanguageId) { + DPRINT1("LookupPrivilegeDisplayNameA: stub\n"); SetLastError (ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -490,6 +494,7 @@ LookupPrivilegeDisplayNameW (LPCWSTR lpSystemName, LPDWORD cbDisplayName, LPDWORD lpLanguageId) { + DPRINT1("LookupPrivilegeDisplayNameW: stub\n"); SetLastError (ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -506,6 +511,7 @@ LookupPrivilegeNameA (LPCSTR lpSystemName, LPSTR lpName, LPDWORD cbName) { + DPRINT1("LookupPrivilegeNameA: stub\n"); SetLastError (ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -522,6 +528,7 @@ LookupPrivilegeNameW (LPCWSTR lpSystemName, LPWSTR lpName, LPDWORD cbName) { + DPRINT1("LookupPrivilegeNameW: stub\n"); SetLastError (ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -542,6 +549,7 @@ GetNamedSecurityInfoW(LPWSTR pObjectName, PACL *ppSacl, PSECURITY_DESCRIPTOR *ppSecurityDescriptor) { + DPRINT1("GetNamedSecurityInfoW: stub\n"); return ERROR_CALL_NOT_IMPLEMENTED; } @@ -561,6 +569,7 @@ GetNamedSecurityInfoA(LPSTR pObjectName, PACL *ppSacl, PSECURITY_DESCRIPTOR *ppSecurityDescriptor) { + DPRINT1("GetNamedSecurityInfoA: stub\n"); return ERROR_CALL_NOT_IMPLEMENTED; } @@ -579,6 +588,7 @@ SetNamedSecurityInfoW(LPWSTR pObjectName, PACL pDacl, PACL pSacl) { + DPRINT1("SetNamedSecurityInfoW: stub\n"); return ERROR_CALL_NOT_IMPLEMENTED; } @@ -597,6 +607,7 @@ SetNamedSecurityInfoA(LPSTR pObjectName, PACL pDacl, PACL pSacl) { + DPRINT1("SetNamedSecurityInfoA: stub\n"); return ERROR_CALL_NOT_IMPLEMENTED; } From bd2990f457055a9ccb8ab44129acdf6683241b6c Mon Sep 17 00:00:00 2001 From: Mark Tempel <mtempel@visi.com> Date: Fri, 28 May 2004 02:32:43 +0000 Subject: [PATCH 1238/1463] removed programs that link to iphlpapi till exports are worked out. svn path=/trunk/; revision=9510 --- rosapps/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rosapps/Makefile b/rosapps/Makefile index 2a82178398f..21b138f79ba 100644 --- a/rosapps/Makefile +++ b/rosapps/Makefile @@ -25,8 +25,6 @@ APPS = calc \ net$(SEP)niclist \ net$(SEP)whois \ net$(SEP)arp \ - net$(SEP)netstat \ - net$(SEP)ipconfig \ net$(SEP)ncftp \ regedt32 \ welcome \ @@ -40,6 +38,8 @@ APPS = calc \ # Removed because it doesn't build correctly # # sysutils$(SEP)tlist \ +# net$(SEP)netstat \ +# net$(SEP)ipconfig \ # all: $(APPS) From 69a06d8f31c0eedf1c64c3f09ab5cedf5ec4682b Mon Sep 17 00:00:00 2001 From: Royce Mitchell III <royce3@ev1.net> Date: Fri, 28 May 2004 03:43:12 +0000 Subject: [PATCH 1239/1463] added CS_DROPSHADOW, needed by latest version of wine's user32 test app svn path=/trunk/; revision=9511 --- reactos/w32api/include/winuser.h | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/w32api/include/winuser.h b/reactos/w32api/include/winuser.h index 374b486fad6..68b1c63dbb0 100644 --- a/reactos/w32api/include/winuser.h +++ b/reactos/w32api/include/winuser.h @@ -593,6 +593,7 @@ extern "C" { #define CS_SAVEBITS 2048 #define CS_VREDRAW 1 #define CS_IME 0x10000 +#define CS_DROPSHADOW 0x20000 #define GCW_ATOM (-32) #define GCL_CBCLSEXTRA (-20) #define GCL_CBWNDEXTRA (-18) From 938ede25cd6f22afae7a9bebb38629cfab6f2a58 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Fri, 28 May 2004 12:14:00 +0000 Subject: [PATCH 1240/1463] - Implement a generic selection list. - Use selection list in device settings pages. svn path=/trunk/; revision=9512 --- reactos/subsys/system/usetup/genlist.c | 303 +++++++++++++++++++++ reactos/subsys/system/usetup/genlist.h | 86 ++++++ reactos/subsys/system/usetup/makefile | 6 +- reactos/subsys/system/usetup/usetup.c | 347 +++++++++++++++++++++---- 4 files changed, 692 insertions(+), 50 deletions(-) create mode 100644 reactos/subsys/system/usetup/genlist.c create mode 100644 reactos/subsys/system/usetup/genlist.h diff --git a/reactos/subsys/system/usetup/genlist.c b/reactos/subsys/system/usetup/genlist.c new file mode 100644 index 00000000000..d27b5096863 --- /dev/null +++ b/reactos/subsys/system/usetup/genlist.c @@ -0,0 +1,303 @@ +/* genlist.c */ + +#include <ddk/ntddk.h> +#include <ntdll/rtl.h> +#include <ntos/minmax.h> + +#include "usetup.h" +#include "console.h" +#include "genlist.h" + +#define NDEBUG +#include <debug.h> + + + +/* FUNCTIONS ****************************************************************/ + +PGENERIC_LIST +CreateGenericList(VOID) +{ + PGENERIC_LIST List; + + List = (PGENERIC_LIST)RtlAllocateHeap(ProcessHeap, + 0, + sizeof(GENERIC_LIST)); + if (List == NULL) + return NULL; + + InitializeListHead(&List->ListHead); + + List->Left = 0; + List->Top = 0; + List->Right = 0; + List->Bottom = 0; + + List->CurrentEntry = NULL; + + return List; +} + + +VOID +DestroyGenericList(PGENERIC_LIST List, + BOOLEAN FreeUserData) +{ + PGENERIC_LIST_ENTRY ListEntry; + PLIST_ENTRY Entry; + + /* Release list entries */ + while (!IsListEmpty (&List->ListHead)) + { + Entry = RemoveHeadList (&List->ListHead); + ListEntry = CONTAINING_RECORD (Entry, GENERIC_LIST_ENTRY, Entry); + + /* Release user data */ + if (FreeUserData && ListEntry->UserData != NULL) + RtlFreeHeap (ProcessHeap, 0, &ListEntry->UserData); + + /* Release list entry */ + RtlFreeHeap (ProcessHeap, 0, ListEntry); + } + + /* Release list head */ + RtlFreeHeap (ProcessHeap, 0, List); +} + + +BOOLEAN +AppendGenericListEntry(PGENERIC_LIST List, + PCHAR Text, + PVOID UserData, + BOOLEAN Current) +{ + PGENERIC_LIST_ENTRY Entry; + + Entry = (PGENERIC_LIST_ENTRY)RtlAllocateHeap(ProcessHeap, + 0, + sizeof(GENERIC_LIST_ENTRY) + strlen(Text)); + if (Entry == NULL) + return FALSE; + + strcpy (Entry->Text, Text); + Entry->UserData = UserData; + + InsertTailList(&List->ListHead, + &Entry->Entry); + + if (Current || List->CurrentEntry == NULL) + { + List->CurrentEntry = Entry; + } + + return TRUE; +} + + +static VOID +DrawListFrame(PGENERIC_LIST GenericList) +{ + COORD coPos; + ULONG Written; + SHORT i; + + /* Draw upper left corner */ + coPos.X = GenericList->Left; + coPos.Y = GenericList->Top; + FillConsoleOutputCharacter (0xDA, // '+', + 1, + coPos, + &Written); + + /* Draw upper edge */ + coPos.X = GenericList->Left + 1; + coPos.Y = GenericList->Top; + FillConsoleOutputCharacter (0xC4, // '-', + GenericList->Right - GenericList->Left - 1, + coPos, + &Written); + + /* Draw upper right corner */ + coPos.X = GenericList->Right; + coPos.Y = GenericList->Top; + FillConsoleOutputCharacter (0xBF, // '+', + 1, + coPos, + &Written); + + /* Draw left and right edge */ + for (i = GenericList->Top + 1; i < GenericList->Bottom; i++) + { + coPos.X = GenericList->Left; + coPos.Y = i; + FillConsoleOutputCharacter (0xB3, // '|', + 1, + coPos, + &Written); + + coPos.X = GenericList->Right; + FillConsoleOutputCharacter (0xB3, //'|', + 1, + coPos, + &Written); + } + + /* Draw lower left corner */ + coPos.X = GenericList->Left; + coPos.Y = GenericList->Bottom; + FillConsoleOutputCharacter (0xC0, // '+', + 1, + coPos, + &Written); + + /* Draw lower edge */ + coPos.X = GenericList->Left + 1; + coPos.Y = GenericList->Bottom; + FillConsoleOutputCharacter (0xC4, // '-', + GenericList->Right - GenericList->Left - 1, + coPos, + &Written); + + /* Draw lower right corner */ + coPos.X = GenericList->Right; + coPos.Y = GenericList->Bottom; + FillConsoleOutputCharacter (0xD9, // '+', + 1, + coPos, + &Written); +} + + +static VOID +DrawListEntries(PGENERIC_LIST GenericList) +{ + PGENERIC_LIST_ENTRY ListEntry; + PLIST_ENTRY Entry; + COORD coPos; + ULONG Written; + USHORT Width; + + coPos.X = GenericList->Left + 1; + coPos.Y = GenericList->Top + 1; + Width = GenericList->Right - GenericList->Left - 1; + + Entry = GenericList->ListHead.Flink; + while (Entry != &GenericList->ListHead) + { + ListEntry = CONTAINING_RECORD (Entry, GENERIC_LIST_ENTRY, Entry); + + if (coPos.Y == GenericList->Bottom) + break; + + FillConsoleOutputAttribute ((GenericList->CurrentEntry == ListEntry) ? 0x71 : 0x17, + Width, + coPos, + &Written); + + FillConsoleOutputCharacter (' ', + Width, + coPos, + &Written); + + coPos.X++; + WriteConsoleOutputCharacters (ListEntry->Text, + min (strlen(ListEntry->Text), Width - 2), + coPos); + coPos.X--; + + coPos.Y++; + Entry = Entry->Flink; + } + + while (coPos.Y < GenericList->Bottom) + { + FillConsoleOutputAttribute (0x17, + Width, + coPos, + &Written); + + FillConsoleOutputCharacter (' ', + Width, + coPos, + &Written); + coPos.Y++; + } +} + + +VOID +DrawGenericList(PGENERIC_LIST List, + SHORT Left, + SHORT Top, + SHORT Right, + SHORT Bottom) +{ + List->Left = Left; + List->Top = Top; + List->Right = Right; + List->Bottom = Bottom; + + DrawListFrame(List); + + if (IsListEmpty(&List->ListHead)) + return; + + DrawListEntries(List); +} + + +VOID +ScrollDownGenericList (PGENERIC_LIST List) +{ + PLIST_ENTRY Entry; + + if (List->CurrentEntry == NULL) + return; + + if (List->CurrentEntry->Entry.Flink != &List->ListHead) + { + Entry = List->CurrentEntry->Entry.Flink; + List->CurrentEntry = CONTAINING_RECORD (Entry, GENERIC_LIST_ENTRY, Entry); + DrawListEntries(List); + } +} + + +VOID +ScrollUpGenericList (PGENERIC_LIST List) +{ + PLIST_ENTRY Entry; + + if (List->CurrentEntry == NULL) + return; + + if (List->CurrentEntry->Entry.Blink != &List->ListHead) + { + Entry = List->CurrentEntry->Entry.Blink; + List->CurrentEntry = CONTAINING_RECORD (Entry, GENERIC_LIST_ENTRY, Entry); + DrawListEntries(List); + } +} + + +PGENERIC_LIST_ENTRY +GetGenericListEntry(PGENERIC_LIST List) +{ + return List->CurrentEntry; +} + + +VOID +SaveGenericListState(PGENERIC_LIST List) +{ + List->BackupEntry = List->CurrentEntry; +} + + +VOID +RestoreGenericListState(PGENERIC_LIST List) +{ + List->CurrentEntry = List->BackupEntry; +} + +/* EOF */ diff --git a/reactos/subsys/system/usetup/genlist.h b/reactos/subsys/system/usetup/genlist.h new file mode 100644 index 00000000000..0bc49a8d1ac --- /dev/null +++ b/reactos/subsys/system/usetup/genlist.h @@ -0,0 +1,86 @@ +/* + * 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: genlist.h,v 1.1 2004/05/28 12:14:00 ekohl Exp $ + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS text-mode setup + * FILE: subsys/system/usetup/genlist.h + * PURPOSE: Generic list functions + * PROGRAMMER: Eric Kohl + */ + + +typedef struct _GENERIC_LIST_ENTRY +{ + LIST_ENTRY Entry; + PVOID UserData; + CHAR Text[1]; +} GENERIC_LIST_ENTRY, *PGENERIC_LIST_ENTRY; + + +typedef struct _GENERIC_LIST +{ + LIST_ENTRY ListHead; + + SHORT Left; + SHORT Top; + SHORT Right; + SHORT Bottom; + + PGENERIC_LIST_ENTRY CurrentEntry; + PGENERIC_LIST_ENTRY BackupEntry; +} GENERIC_LIST, *PGENERIC_LIST; + + + +PGENERIC_LIST +CreateGenericList(VOID); + +VOID +DestroyGenericList(PGENERIC_LIST List, + BOOLEAN FreeUserData); + +BOOLEAN +AppendGenericListEntry(PGENERIC_LIST List, + PCHAR Text, + PVOID UserData, + BOOLEAN Current); + +VOID +DrawGenericList(PGENERIC_LIST List, + SHORT Left, + SHORT Top, + SHORT Right, + SHORT Bottom); + +VOID +ScrollDownGenericList(PGENERIC_LIST List); + +VOID +ScrollUpGenericList(PGENERIC_LIST List); + +PGENERIC_LIST_ENTRY +GetGenericListEntry(PGENERIC_LIST List); + +VOID +SaveGenericListState(PGENERIC_LIST List); + +VOID +RestoreGenericListState(PGENERIC_LIST List); + +/* EOF */ diff --git a/reactos/subsys/system/usetup/makefile b/reactos/subsys/system/usetup/makefile index 70c297cc3d2..c2281496898 100644 --- a/reactos/subsys/system/usetup/makefile +++ b/reactos/subsys/system/usetup/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.15 2004/02/23 11:58:27 ekohl Exp $ +# $Id: makefile,v 1.16 2004/05/28 12:14:00 ekohl Exp $ PATH_TO_TOP = ../../.. @@ -18,8 +18,8 @@ TARGET_INSTALLDIR = system32 TARGET_CFLAGS = -D__NTAPP__ -I$(PATH_TO_TOP)/lib/zlib -Wall -Werror -Wno-format -TARGET_OBJECTS = bootsup.o cabinet.o console.o drivesup.o \ - filequeue.o filesup.o format.o fslist.o infcache.o \ +TARGET_OBJECTS = bootsup.o cabinet.o console.o drivesup.o filequeue.o \ + filesup.o format.o fslist.o genlist.o infcache.o \ inicache.o partlist.o progress.o registry.o usetup.o include $(PATH_TO_TOP)/rules.mak diff --git a/reactos/subsys/system/usetup/usetup.c b/reactos/subsys/system/usetup/usetup.c index 54ed334e5b8..ab55e066ab5 100644 --- a/reactos/subsys/system/usetup/usetup.c +++ b/reactos/subsys/system/usetup/usetup.c @@ -45,6 +45,7 @@ #include "cabinet.h" #include "filesup.h" #include "drivesup.h" +#include "genlist.h" #define NDEBUG #include <debug.h> @@ -129,6 +130,12 @@ static HSPFILEQ SetupFileQueue = NULL; static BOOLEAN WarnLinuxPartitions = TRUE; +static PGENERIC_LIST ComputerList = NULL; +static PGENERIC_LIST DisplayList = NULL; +static PGENERIC_LIST KeyboardList = NULL; +static PGENERIC_LIST LayoutList = NULL; +static PGENERIC_LIST PointerList = NULL; + /* FUNCTIONS ****************************************************************/ @@ -553,7 +560,7 @@ StartPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -568,7 +575,7 @@ StartPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -587,7 +594,7 @@ StartPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -619,7 +626,7 @@ StartPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -636,7 +643,7 @@ StartPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -654,7 +661,7 @@ StartPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -671,14 +678,14 @@ StartPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } CheckUnattendedSetup(); - return(INTRO_PAGE); + return INTRO_PAGE; } @@ -756,16 +763,16 @@ EmergencyIntroPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(REBOOT_PAGE); + return REBOOT_PAGE; } else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && (Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)) /* ESC */ { - return(INTRO_PAGE); + return INTRO_PAGE; } } - return(REPAIR_INTRO_PAGE); + return REPAIR_INTRO_PAGE; } @@ -789,16 +796,16 @@ RepairIntroPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(REBOOT_PAGE); + return REBOOT_PAGE; } else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && (Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)) /* ESC */ { - return(INTRO_PAGE); + return INTRO_PAGE; } } - return(REPAIR_INTRO_PAGE); + return REPAIR_INTRO_PAGE; } @@ -856,6 +863,46 @@ DeviceSettingsPage(PINPUT_RECORD Ir) { static ULONG Line = 17; + /* Initialize the computer settings list */ + if (ComputerList == NULL) + { + ComputerList = CreateGenericList(); + AppendGenericListEntry(ComputerList, "Standard-PC", NULL, TRUE); + } + + /* Initialize the display settings list */ + if (DisplayList == NULL) + { + DisplayList = CreateGenericList(); + AppendGenericListEntry(DisplayList, "VGA display", NULL, FALSE); + AppendGenericListEntry(DisplayList, "VESA display", NULL, FALSE); + AppendGenericListEntry(DisplayList, "Automatic detection", NULL, TRUE); + } + + /* Initialize the keyboard settings list */ + if (KeyboardList == NULL) + { + KeyboardList = CreateGenericList(); + AppendGenericListEntry(KeyboardList, "XT-, AT- or extended keyboard (83-105 keys)", NULL, TRUE); + } + + /* Initialize the keyboard settings list */ + if (LayoutList == NULL) + { + LayoutList = CreateGenericList(); + AppendGenericListEntry(LayoutList, "English (USA)", NULL, TRUE); + AppendGenericListEntry(LayoutList, "French (France)", NULL, FALSE); + AppendGenericListEntry(LayoutList, "German (Germany)", NULL, FALSE); + } + + /* Initialize the keyboard settings list */ + if (PointerList == NULL) + { + PointerList = CreateGenericList(); + AppendGenericListEntry(PointerList, "PS/2 (Mouse port) mouse", NULL, TRUE); + AppendGenericListEntry(PointerList, "Serial mouse", NULL, FALSE); + } + SetTextXY(6, 8, "The list below shows the current device settings."); SetTextXY(8, 11, " Computer:"); @@ -866,12 +913,11 @@ DeviceSettingsPage(PINPUT_RECORD Ir) SetTextXY(8, 17, " Accept:"); - - SetTextXY(25, 11, "Standard-PC"); - SetTextXY(25, 12, "Automatic detection"); - SetTextXY(25, 13, "XT-, AT- or extended keyboard (83-105 keys)"); - SetTextXY(25, 14, "English (USA)"); - SetTextXY(25, 15, "PS/2 (Mouse port) mouse"); + SetTextXY(25, 11, GetGenericListEntry(ComputerList)->Text); + SetTextXY(25, 12, GetGenericListEntry(DisplayList)->Text); + SetTextXY(25, 13, GetGenericListEntry(KeyboardList)->Text); + SetTextXY(25, 14, GetGenericListEntry(LayoutList)->Text); + SetTextXY(25, 15, GetGenericListEntry(PointerList)->Text); SetTextXY(25, 17, "Accept these device setings"); InvertTextXY (24, Line, 48, 1); @@ -902,8 +948,8 @@ DeviceSettingsPage(PINPUT_RECORD Ir) Line++; InvertTextXY (24, Line, 48, 1); } - if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && - (Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */ + else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */ { NormalTextXY (24, Line, 48, 1); if (Line == 11) @@ -945,22 +991,56 @@ DeviceSettingsPage(PINPUT_RECORD Ir) static PAGE_NUMBER ComputerSettingsPage(PINPUT_RECORD Ir) { - SetTextXY(6, 8, "Computer settings are not implemented yet."); + SHORT xScreen; + SHORT yScreen; + SetTextXY(6, 8, "You want to change the type of computer to be installed."); - SetStatusText(" ENTER = Continue F3 = Quit"); + SetTextXY(8, 10, "\x07 Press the UP or DOWN key to select the desired computer type."); + SetTextXY(8, 11, " Then press ENTER."); + + SetTextXY(8, 13, "\x07 Press the ESC key to return to the previous page without changing"); + SetTextXY(8, 14, " the computer type."); + + GetScreenSize(&xScreen, &yScreen); + + DrawGenericList(ComputerList, + 2, + 18, + xScreen - 3, + yScreen - 3); + + SetStatusText(" ENTER = Continue ESC = Cancel F3 = Quit"); + + SaveGenericListState(ComputerList); while(TRUE) { ConInKey(Ir); if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && - (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */ + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */ + { + ScrollDownGenericList (ComputerList); + } + else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */ + { + ScrollUpGenericList (ComputerList); + } + 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 == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)) /* ESC */ + { + RestoreGenericListState(ComputerList); + return DEVICE_SETTINGS_PAGE; + } else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { return DEVICE_SETTINGS_PAGE; @@ -974,22 +1054,58 @@ ComputerSettingsPage(PINPUT_RECORD Ir) static PAGE_NUMBER DisplaySettingsPage(PINPUT_RECORD Ir) { - SetTextXY(6, 8, "Display settings are not implemented yet."); + SHORT xScreen; + SHORT yScreen; + SetTextXY(6, 8, "You want to change the type of display to be installed."); - SetStatusText(" ENTER = Continue F3 = Quit"); + SetTextXY(8, 10, "\x07 Press the UP or DOWN key to select the desired display type."); + SetTextXY(8, 11, " Then press ENTER."); + + SetTextXY(8, 13, "\x07 Press the ESC key to return to the previous page without changing"); + SetTextXY(8, 14, " the display type."); + + GetScreenSize(&xScreen, &yScreen); + + DrawGenericList(DisplayList, + 2, + 18, + xScreen - 3, + yScreen - 3); + + SetStatusText(" ENTER = Continue ESC = Cancel F3 = Quit"); + + SaveGenericListState(DisplayList); while(TRUE) { ConInKey(Ir); if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && - (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */ + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */ + { + ScrollDownGenericList (DisplayList); + } + else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */ + { + ScrollUpGenericList (DisplayList); + } + else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */ { if (ConfirmQuit(Ir) == TRUE) - return QUIT_PAGE; + { + return QUIT_PAGE; + } break; } + else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)) /* ESC */ + { + RestoreGenericListState(DisplayList); + return DEVICE_SETTINGS_PAGE; + } else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { return DEVICE_SETTINGS_PAGE; @@ -1003,22 +1119,56 @@ DisplaySettingsPage(PINPUT_RECORD Ir) static PAGE_NUMBER KeyboardSettingsPage(PINPUT_RECORD Ir) { - SetTextXY(6, 8, "Keyboard settings are not implemented yet."); + SHORT xScreen; + SHORT yScreen; + SetTextXY(6, 8, "You want to change the type of keyboard to be installed."); - SetStatusText(" ENTER = Continue F3 = Quit"); + SetTextXY(8, 10, "\x07 Press the UP or DOWN key to select the desired keyboard type."); + SetTextXY(8, 11, " Then press ENTER."); + + SetTextXY(8, 13, "\x07 Press the ESC key to return to the previous page without changing"); + SetTextXY(8, 14, " the keyboard type."); + + GetScreenSize(&xScreen, &yScreen); + + DrawGenericList(KeyboardList, + 2, + 18, + xScreen - 3, + yScreen - 3); + + SetStatusText(" ENTER = Continue ESC = Cancel F3 = Quit"); + + SaveGenericListState(KeyboardList); while(TRUE) { ConInKey(Ir); if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && - (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */ + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */ + { + ScrollDownGenericList (KeyboardList); + } + else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */ + { + ScrollUpGenericList (KeyboardList); + } + 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 == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)) /* ESC */ + { + RestoreGenericListState(KeyboardList); + return DEVICE_SETTINGS_PAGE; + } else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { return DEVICE_SETTINGS_PAGE; @@ -1032,22 +1182,56 @@ KeyboardSettingsPage(PINPUT_RECORD Ir) static PAGE_NUMBER LayoutSettingsPage(PINPUT_RECORD Ir) { - SetTextXY(6, 8, "Keyboard layout settings are not implemented yet."); + SHORT xScreen; + SHORT yScreen; + SetTextXY(6, 8, "You want to change the keyboard layout to be installed."); - SetStatusText(" ENTER = Continue F3 = Quit"); + SetTextXY(8, 10, "\x07 Press the UP or DOWN key to select the desired keyboard"); + SetTextXY(8, 11, " layout. Then press ENTER."); + + SetTextXY(8, 13, "\x07 Press the ESC key to return to the previous page without changing"); + SetTextXY(8, 14, " the keyboard layout."); + + GetScreenSize(&xScreen, &yScreen); + + DrawGenericList(LayoutList, + 2, + 18, + xScreen - 3, + yScreen - 3); + + SetStatusText(" ENTER = Continue ESC = Cancel F3 = Quit"); + + SaveGenericListState(LayoutList); while(TRUE) { ConInKey(Ir); if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && - (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */ + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */ + { + ScrollDownGenericList (LayoutList); + } + else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */ + { + ScrollUpGenericList (LayoutList); + } + 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 == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)) /* ESC */ + { + RestoreGenericListState(LayoutList); + return DEVICE_SETTINGS_PAGE; + } else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { return DEVICE_SETTINGS_PAGE; @@ -1061,22 +1245,56 @@ LayoutSettingsPage(PINPUT_RECORD Ir) static PAGE_NUMBER PointerSettingsPage(PINPUT_RECORD Ir) { - SetTextXY(6, 8, "Pointer settings are not implemented yet."); + SHORT xScreen; + SHORT yScreen; + SetTextXY(6, 8, "You want to change the pointing device to be installed."); - SetStatusText(" ENTER = Continue F3 = Quit"); + SetTextXY(8, 10, "\x07 Press the UP or DOWN key to select the desired pointing"); + SetTextXY(8, 11, " device. Then press ENTER."); + + SetTextXY(8, 13, "\x07 Press the ESC key to return to the previous page without changing"); + SetTextXY(8, 14, " the pointing device."); + + GetScreenSize(&xScreen, &yScreen); + + DrawGenericList(PointerList, + 2, + 18, + xScreen - 3, + yScreen - 3); + + SetStatusText(" ENTER = Continue ESC = Cancel F3 = Quit"); + + SaveGenericListState(PointerList); while(TRUE) { ConInKey(Ir); if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && - (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */ + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */ + { + ScrollDownGenericList(PointerList); + } + else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */ + { + ScrollUpGenericList(PointerList); + } + 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 == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)) /* ESC */ + { + RestoreGenericListState(PointerList); + return DEVICE_SETTINGS_PAGE; + } else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { return DEVICE_SETTINGS_PAGE; @@ -3493,7 +3711,7 @@ BootLoaderPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -3518,7 +3736,7 @@ BootLoaderPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -3544,7 +3762,7 @@ BootLoaderPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -3565,12 +3783,12 @@ BootLoaderPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } - return(SUCCESS_PAGE); + return SUCCESS_PAGE; } @@ -3600,6 +3818,41 @@ QuitPage(PINPUT_RECORD Ir) FileSystemList = NULL; } + /* Destroy computer settings list */ + if (ComputerList != NULL) + { + DestroyGenericList(ComputerList, TRUE); + ComputerList = NULL; + } + + /* Destroy display settings list */ + if (DisplayList != NULL) + { + DestroyGenericList(DisplayList, TRUE); + DisplayList = NULL; + } + + /* Destroy keyboard settings list */ + if (KeyboardList != NULL) + { + DestroyGenericList(KeyboardList, TRUE); + KeyboardList = NULL; + } + + /* Destroy keyboard layout list */ + if (LayoutList != NULL) + { + DestroyGenericList(LayoutList, TRUE); + LayoutList = NULL; + } + + /* Destroy pointer device list */ + if (PointerList != NULL) + { + DestroyGenericList(PointerList, TRUE); + PointerList = NULL; + } + SetStatusText(" ENTER = Reboot computer"); while(TRUE) @@ -3608,7 +3861,7 @@ QuitPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(FLUSH_PAGE); + return FLUSH_PAGE; } } } @@ -3628,7 +3881,7 @@ SuccessPage(PINPUT_RECORD Ir) if (IsUnattendedSetup) { - return(FLUSH_PAGE); + return FLUSH_PAGE; } while(TRUE) @@ -3637,7 +3890,7 @@ SuccessPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(FLUSH_PAGE); + return FLUSH_PAGE; } } } @@ -3653,7 +3906,7 @@ FlushPage(PINPUT_RECORD Ir) SetStatusText(" Flushing cache"); - return(REBOOT_PAGE); + return REBOOT_PAGE; } From 336746ec954352f101c2d437bda1be9bdc16b99f Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Fri, 28 May 2004 13:17:32 +0000 Subject: [PATCH 1241/1463] 1. properly check parameters in SetFilePointer(Ex)() 2. fixed several functions to fail if dealing with console handles svn path=/trunk/; revision=9513 --- reactos/lib/kernel32/file/file.c | 68 +++++++++++++++++++++++++---- reactos/lib/kernel32/misc/console.c | 16 +++---- 2 files changed, 64 insertions(+), 20 deletions(-) diff --git a/reactos/lib/kernel32/file/file.c b/reactos/lib/kernel32/file/file.c index 7c50bcaaa2a..52aa7e1e3a6 100644 --- a/reactos/lib/kernel32/file/file.c +++ b/reactos/lib/kernel32/file/file.c @@ -1,4 +1,4 @@ -/* $Id: file.c,v 1.54 2004/05/25 20:04:13 navaraf Exp $ +/* $Id: file.c,v 1.55 2004/05/28 13:17:32 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -221,7 +221,7 @@ SetFilePointer(HANDLE hFile, DWORD dwMoveMethod) { FILE_POSITION_INFORMATION FilePosition; - FILE_STANDARD_INFORMATION FileStandart; + FILE_STANDARD_INFORMATION FileStandard; NTSTATUS errCode; IO_STATUS_BLOCK IoStatusBlock; LARGE_INTEGER Distance; @@ -229,7 +229,11 @@ SetFilePointer(HANDLE hFile, DPRINT("SetFilePointer(hFile %x, lDistanceToMove %d, dwMoveMethod %d)\n", hFile,lDistanceToMove,dwMoveMethod); - /* FIXME - should fail if hFile is a console handle */ + if(IsConsoleHandle(hFile)) + { + SetLastError(ERROR_INVALID_HANDLE); + return -1; + } Distance.u.LowPart = lDistanceToMove; if (lpDistanceToMoveHigh) @@ -258,15 +262,18 @@ SetFilePointer(HANDLE hFile, case FILE_END: NtQueryInformationFile(hFile, &IoStatusBlock, - &FileStandart, + &FileStandard, sizeof(FILE_STANDARD_INFORMATION), FileStandardInformation); FilePosition.CurrentByteOffset.QuadPart = - FileStandart.EndOfFile.QuadPart + Distance.QuadPart; + FileStandard.EndOfFile.QuadPart + Distance.QuadPart; break; case FILE_BEGIN: FilePosition.CurrentByteOffset.QuadPart = Distance.QuadPart; break; + default: + SetLastError(ERROR_INVALID_PARAMETER); + return -1; } if(FilePosition.CurrentByteOffset.QuadPart < 0) @@ -305,11 +312,15 @@ SetFilePointerEx(HANDLE hFile, DWORD dwMoveMethod) { FILE_POSITION_INFORMATION FilePosition; - FILE_STANDARD_INFORMATION FileStandart; + FILE_STANDARD_INFORMATION FileStandard; NTSTATUS errCode; IO_STATUS_BLOCK IoStatusBlock; - /* FIXME - should fail if hFile is a console handle */ + if(IsConsoleHandle(hFile)) + { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } switch(dwMoveMethod) { @@ -324,15 +335,18 @@ SetFilePointerEx(HANDLE hFile, case FILE_END: NtQueryInformationFile(hFile, &IoStatusBlock, - &FileStandart, + &FileStandard, sizeof(FILE_STANDARD_INFORMATION), FileStandardInformation); FilePosition.CurrentByteOffset.QuadPart = - FileStandart.EndOfFile.QuadPart + liDistanceToMove.QuadPart; + FileStandard.EndOfFile.QuadPart + liDistanceToMove.QuadPart; break; case FILE_BEGIN: FilePosition.CurrentByteOffset.QuadPart = liDistanceToMove.QuadPart; break; + default: + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; } if(FilePosition.CurrentByteOffset.QuadPart < 0) @@ -594,6 +608,12 @@ GetFileInformationByHandle(HANDLE hFile, NTSTATUS errCode; IO_STATUS_BLOCK IoStatusBlock; + if(IsConsoleHandle(hFile)) + { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + errCode = NtQueryInformationFile(hFile, &IoStatusBlock, &FileBasic, @@ -1043,6 +1063,12 @@ GetFileTime(HANDLE hFile, FILE_BASIC_INFORMATION FileBasic; NTSTATUS Status; + if(IsConsoleHandle(hFile)) + { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + Status = NtQueryInformationFile(hFile, &IoStatusBlock, &FileBasic, @@ -1078,6 +1104,12 @@ SetFileTime(HANDLE hFile, IO_STATUS_BLOCK IoStatusBlock; NTSTATUS Status; + if(IsConsoleHandle(hFile)) + { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + Status = NtQueryInformationFile(hFile, &IoStatusBlock, &FileBasic, @@ -1127,6 +1159,12 @@ SetEndOfFile(HANDLE hFile) FILE_POSITION_INFORMATION FilePosInfo; NTSTATUS Status; + if(IsConsoleHandle(hFile)) + { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + //get current position Status = NtQueryInformationFile( hFile, @@ -1233,6 +1271,12 @@ SetFileShortNameW( IO_STATUS_BLOCK IoStatusBlock; PFILE_NAME_INFORMATION FileNameInformation; + if(IsConsoleHandle(hFile)) + { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + if(!lpShortName) { SetLastError(ERROR_INVALID_PARAMETER); @@ -1283,6 +1327,12 @@ SetFileShortNameA( ANSI_STRING ShortNameA; UNICODE_STRING ShortName; + if(IsConsoleHandle(hFile)) + { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + if(!lpShortName) { SetLastError(ERROR_INVALID_PARAMETER); diff --git a/reactos/lib/kernel32/misc/console.c b/reactos/lib/kernel32/misc/console.c index 0b3f632e365..a4f53f5194c 100644 --- a/reactos/lib/kernel32/misc/console.c +++ b/reactos/lib/kernel32/misc/console.c @@ -1,4 +1,4 @@ -/* $Id: console.c,v 1.74 2004/03/14 17:53:26 weiden Exp $ +/* $Id: console.c,v 1.75 2004/05/28 13:17:32 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -1030,17 +1030,10 @@ SetStdHandle(DWORD nStdHandle, { PRTL_USER_PROCESS_PARAMETERS Ppb; + /* no need to check if hHandle == INVALID_HANDLE_VALUE */ + Ppb = NtCurrentPeb()->ProcessParameters; - /* More checking needed? */ - if (hHandle == INVALID_HANDLE_VALUE) - { - SetLastError (ERROR_INVALID_HANDLE); - return FALSE; - } - - SetLastError(ERROR_SUCCESS); /* OK */ - switch (nStdHandle) { case STD_INPUT_HANDLE: @@ -1056,7 +1049,8 @@ SetStdHandle(DWORD nStdHandle, return TRUE; } - SetLastError (ERROR_INVALID_PARAMETER); + /* windows for whatever reason sets the last error to ERROR_INVALID_HANDLE here */ + SetLastError (ERROR_INVALID_HANDLE); return FALSE; } From 004720f1a674eb00cf74d44bd3e6b61b5ecd3468 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Fri, 28 May 2004 13:23:24 +0000 Subject: [PATCH 1242/1463] fixed typo svn path=/trunk/; revision=9514 --- reactos/subsys/system/usetup/cabinet.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/system/usetup/cabinet.c b/reactos/subsys/system/usetup/cabinet.c index fc4080a8fe8..77346b118f8 100755 --- a/reactos/subsys/system/usetup/cabinet.c +++ b/reactos/subsys/system/usetup/cabinet.c @@ -205,7 +205,7 @@ SeekInFile(HANDLE hFile, PNTSTATUS Status) { FILE_POSITION_INFORMATION FilePosition; - FILE_STANDARD_INFORMATION FileStandart; + FILE_STANDARD_INFORMATION FileStandard; NTSTATUS errCode; IO_STATUS_BLOCK IoStatusBlock; LARGE_INTEGER Distance; @@ -240,11 +240,11 @@ SeekInFile(HANDLE hFile, { NtQueryInformationFile(hFile, &IoStatusBlock, - &FileStandart, + &FileStandard, sizeof(FILE_STANDARD_INFORMATION), FileStandardInformation); FilePosition.CurrentByteOffset.QuadPart = - FileStandart.EndOfFile.QuadPart + Distance.QuadPart; + FileStandard.EndOfFile.QuadPart + Distance.QuadPart; } else if ( dwMoveMethod == SEEK_BEGIN ) { From b9b553dbf6f2c3e758b1d9cb96ea1214e2220ca1 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III <royce3@ev1.net> Date: Fri, 28 May 2004 14:31:49 +0000 Subject: [PATCH 1243/1463] added constants needed by wine's "user32 msg" test svn path=/trunk/; revision=9515 --- reactos/w32api/include/winuser.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/reactos/w32api/include/winuser.h b/reactos/w32api/include/winuser.h index 68b1c63dbb0..51ef91b698a 100644 --- a/reactos/w32api/include/winuser.h +++ b/reactos/w32api/include/winuser.h @@ -1134,9 +1134,13 @@ extern "C" { #define SPI_GETLOWPOWERACTIVE 83 #define SPI_GETLOWPOWERTIMEOUT 79 #define SPI_GETMENUDROPALIGNMENT 27 +#define SPI_GETMENUSHOWDELAY 106 #define SPI_GETMINIMIZEDMETRICS 43 #define SPI_GETMOUSE 3 #define SPI_GETMOUSEKEYS 54 +#define SPI_GETMOUSEHOVERHEIGHT 100 +#define SPI_GETMOUSEHOVERTIME 102 +#define SPI_GETMOUSEHOVERWIDTH 98 #define SPI_GETMOUSETRAILS 94 #define SPI_GETNONCLIENTMETRICS 41 #define SPI_GETPOWEROFFACTIVE 84 @@ -1188,9 +1192,13 @@ extern "C" { #define SPI_SETLOWPOWERACTIVE 85 #define SPI_SETLOWPOWERTIMEOUT 81 #define SPI_SETMENUDROPALIGNMENT 28 +#define SPI_SETMENUSHOWDELAY 107 #define SPI_SETMINIMIZEDMETRICS 44 #define SPI_SETMOUSE 4 #define SPI_SETMOUSEBUTTONSWAP 33 +#define SPI_SETMOUSEHOVERHEIGHT 101 +#define SPI_SETMOUSEHOVERTIME 103 +#define SPI_SETMOUSEHOVERWIDTH 99 #define SPI_SETMOUSEKEYS 55 #define SPI_SETMOUSETRAILS 93 #define SPI_SETNONCLIENTMETRICS 42 @@ -1259,6 +1267,7 @@ extern "C" { #define WM_CANCELMODE 31 #define WM_CAPTURECHANGED 533 #define WM_CHANGECBCHAIN 781 +#define WM_CHANGEUISTATE 295 #define WM_CHAR 258 #define WM_CHARTOITEM 47 #define WM_CHILDACTIVATE 34 From 11f4efc5111501f2b0bddb07d1affd6a073875be Mon Sep 17 00:00:00 2001 From: Royce Mitchell III <royce3@ev1.net> Date: Fri, 28 May 2004 17:56:17 +0000 Subject: [PATCH 1244/1463] upgrading user32 test to Wine-20040527 - disabled a test in the 'msg' test because it fails on XP SP1. svn path=/trunk/; revision=9516 --- reactos/apps/tests/user32/class.c | 16 +- reactos/apps/tests/user32/dde.c | 119 ++++ reactos/apps/tests/user32/dialog.c | 6 +- reactos/apps/tests/user32/input.c | 18 +- reactos/apps/tests/user32/listbox.c | 2 +- reactos/apps/tests/user32/makefile | 3 +- reactos/apps/tests/user32/msg.c | 899 ++++++++++++++++++++++---- reactos/apps/tests/user32/resource.c | 2 +- reactos/apps/tests/user32/sysparams.c | 209 ++++++ reactos/apps/tests/user32/testlist.c | 4 + reactos/apps/tests/user32/win.c | 541 +++++++++++++++- 11 files changed, 1666 insertions(+), 153 deletions(-) create mode 100644 reactos/apps/tests/user32/dde.c diff --git a/reactos/apps/tests/user32/class.c b/reactos/apps/tests/user32/class.c index ec46a95b359..5d61df4c1ac 100644 --- a/reactos/apps/tests/user32/class.c +++ b/reactos/apps/tests/user32/class.c @@ -20,9 +20,6 @@ /* To get CS_DROPSHADOW with the MSVC headers */ #define _WIN32_WINNT 0x0501 -#ifndef CS_DROPSHADOW -#define CS_DROPSHADOW 0x00020000 -#endif #include <assert.h> #include <stdlib.h> @@ -48,8 +45,8 @@ static LRESULT WINAPI ClassTest_WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPA static void ClassTest(HINSTANCE hInstance, BOOL global) { WNDCLASSW cls, wc; - WCHAR className[] = {'T','e','s','t','C','l','a','s','s',0}; - WCHAR winName[] = {'W','i','n','C','l','a','s','s','T','e','s','t',0}; + static const WCHAR className[] = {'T','e','s','t','C','l','a','s','s',0}; + static const WCHAR winName[] = {'W','i','n','C','l','a','s','s','T','e','s','t',0}; ATOM test_atom; HWND hTestWnd; DWORD i; @@ -243,7 +240,7 @@ static void check_class(HINSTANCE inst, const char *name, const char *menu_name) static void check_instance( const char *name, HINSTANCE inst, HINSTANCE info_inst, HINSTANCE gcl_inst ) { - WNDCLASS wc; + WNDCLASSA wc; HWND hwnd; ok( GetClassInfo( inst, name, &wc ), "Couldn't find class %s inst %p\n", name, inst ); @@ -251,9 +248,12 @@ static void check_instance( const char *name, HINSTANCE inst, HINSTANCE info_ins wc.hInstance, info_inst, name ); hwnd = CreateWindowExA( 0, name, "test_window", 0, 0, 0, 0, 0, 0, 0, inst, 0 ); ok( hwnd != NULL, "Couldn't create window for class %s inst %p\n", name, inst ); - ok( (HINSTANCE)GetClassLong( hwnd, GCL_HMODULE ) == gcl_inst, + ok( (HINSTANCE)GetClassLongA( hwnd, GCL_HMODULE ) == gcl_inst, "Wrong GCL instance %p/%p for class %s\n", - (HINSTANCE)GetClassLong( hwnd, GCL_HMODULE ), gcl_inst, name ); + (HINSTANCE)GetClassLongA( hwnd, GCL_HMODULE ), gcl_inst, name ); + ok( (HINSTANCE)GetWindowLongA( hwnd, GWL_HINSTANCE ) == inst, + "Wrong GWL instance %p/%p for window %s\n", + (HINSTANCE)GetWindowLongA( hwnd, GWL_HINSTANCE ), inst, name ); DestroyWindow(hwnd); } diff --git a/reactos/apps/tests/user32/dde.c b/reactos/apps/tests/user32/dde.c new file mode 100644 index 00000000000..c0b8696d1a7 --- /dev/null +++ b/reactos/apps/tests/user32/dde.c @@ -0,0 +1,119 @@ +/* + * Unit tests for DDE functions + * + * Copyright (c) 2004 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 + */ + +#include <assert.h> + +#include "wine/test.h" +#include "winbase.h" +#include "winuser.h" +#include "ddeml.h" +#include "winerror.h" + +static HDDEDATA CALLBACK DdeCallback(UINT uType, UINT uFmt, HCONV hconv, + HSZ hsz1, HSZ hsz2, HDDEDATA hdata, + ULONG_PTR dwData1, ULONG_PTR dwData2) +{ + return 0; +} + +static void test_DdeCreateStringHandleW(DWORD dde_inst, int codepage) +{ + static const WCHAR dde_string[] = {'D','D','E',' ','S','t','r','i','n','g',0}; + HSZ str_handle; + WCHAR bufW[256]; + char buf[256]; + int ret; + + str_handle = DdeCreateStringHandleW(dde_inst, dde_string, codepage); + ok(str_handle != 0, "DdeCreateStringHandleW failed with error %08x\n", + DdeGetLastError(dde_inst)); + + ret = DdeQueryStringW(dde_inst, str_handle, NULL, 0, codepage); + if (codepage == CP_WINANSI) + ok(ret == 1, "DdeQueryStringW returned wrong length %d\n", ret); + else + ok(ret == lstrlenW(dde_string), "DdeQueryStringW returned wrong length %d\n", ret); + + ret = DdeQueryStringW(dde_inst, str_handle, bufW, 256, codepage); + if (codepage == CP_WINANSI) + { + ok(ret == 1, "DdeQueryStringW returned wrong length %d\n", ret); + ok(!lstrcmpA("D", (LPCSTR)bufW), "DdeQueryStringW returned wrong string\n"); + } + else + { + ok(ret == lstrlenW(dde_string), "DdeQueryStringW returned wrong length %d\n", ret); + ok(!lstrcmpW(dde_string, bufW), "DdeQueryStringW returned wrong string\n"); + } + + ret = DdeQueryStringA(dde_inst, str_handle, buf, 256, CP_WINANSI); + if (codepage == CP_WINANSI) + { + ok(ret == 1, "DdeQueryStringA returned wrong length %d\n", ret); + ok(!lstrcmpA("D", buf), "DdeQueryStringW returned wrong string\n"); + } + else + { + ok(ret == lstrlenA("DDE String"), "DdeQueryStringA returned wrong length %d\n", ret); + ok(!lstrcmpA("DDE String", buf), "DdeQueryStringA returned wrong string %s\n", buf); + } + + ret = DdeQueryStringA(dde_inst, str_handle, buf, 256, CP_WINUNICODE); + if (codepage == CP_WINANSI) + { + ok(ret == 1, "DdeQueryStringA returned wrong length %d\n", ret); + ok(!lstrcmpA("D", buf), "DdeQueryStringA returned wrong string %s\n", buf); + } + else + { + ok(ret == lstrlenA("DDE String"), "DdeQueryStringA returned wrong length %d\n", ret); + ok(!lstrcmpW(dde_string, (LPCWSTR)buf), "DdeQueryStringW returned wrong string\n"); + } + + ok(DdeFreeStringHandle(dde_inst, str_handle), "DdeFreeStringHandle failed\n"); +} + +START_TEST(dde) +{ + DWORD dde_inst, ret; + + dde_inst = 0xdeadbeef; + SetLastError(0xdeadbeef); + ret = DdeInitializeW(&dde_inst, DdeCallback, APPCMD_CLIENTONLY, 0); + if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + trace("Skipping the DDE test on a Win9x platform\n"); + return; + } + + ok(ret == DMLERR_INVALIDPARAMETER, "DdeInitializeW should fail, but got %04lx instead\n", ret); + ok(DdeGetLastError(dde_inst) == DMLERR_INVALIDPARAMETER, "expected DMLERR_INVALIDPARAMETER\n"); + + dde_inst = 0; + ret = DdeInitializeW(&dde_inst, DdeCallback, APPCMD_CLIENTONLY, 0); + ok(ret == DMLERR_NO_ERROR, "DdeInitializeW failed with error %04lx (%08x)\n", + ret, DdeGetLastError(dde_inst)); + + test_DdeCreateStringHandleW(dde_inst, 0); + test_DdeCreateStringHandleW(dde_inst, CP_WINUNICODE); + test_DdeCreateStringHandleW(dde_inst, CP_WINANSI); + + ok(DdeUninitialize(dde_inst), "DdeUninitialize failed\n"); +} diff --git a/reactos/apps/tests/user32/dialog.c b/reactos/apps/tests/user32/dialog.c index c4f55888f09..963580d6d33 100644 --- a/reactos/apps/tests/user32/dialog.c +++ b/reactos/apps/tests/user32/dialog.c @@ -365,9 +365,9 @@ static void GetNextDlgItemTest (void) { 1, 23, 6, 68, 0, 0, 68}, { 1, 24, 6, 25, 0, 1, 72}, { 1, 25, 1, 70, 0, 0, 72}, - { 0, 26, 1, 70, 0, 1, 3}, + /*{ 0, 26, 1, 70, 0, 1, 3}, Crashes Win95*/ { 1, 27, 1, 70, 1, 0, 72}, - { 0, 28, 1, 70, 1, 1, 61}, + /*{ 0, 28, 1, 70, 1, 1, 61}, Crashes Win95*/ { 1, 29, 6, 67, 1, 0, 72}, { 1, 30, 6, 72, 1, 1, 67}, @@ -515,4 +515,4 @@ START_TEST(dialog) GetNextDlgItemTest(); IsDialogMessageWTest(); -} +} \ No newline at end of file diff --git a/reactos/apps/tests/user32/input.c b/reactos/apps/tests/user32/input.c index f068f2ccf49..a9b71425b6e 100644 --- a/reactos/apps/tests/user32/input.c +++ b/reactos/apps/tests/user32/input.c @@ -46,9 +46,10 @@ #define _WIN32_WINNT 0x401 +#include <windows.h> #include "wine/test.h" -#include "winbase.h" -#include "winuser.h" +//#include "winbase.h" +//#include "winuser.h" #include <assert.h> @@ -56,6 +57,8 @@ HWND hWndTest; long timetag = 0x10000000; +static UINT (WINAPI *ptr_SendInput) (UINT, INPUT*, size_t); + #define MAXKEYEVENTS 6 #define MAXKEYMESSAGES MAXKEYEVENTS /* assuming a key event generates one and only one message */ @@ -203,12 +206,19 @@ int KbdMessage( KEV kev, WPARAM *pwParam, LPARAM *plParam ) */ void do_test( HWND hwnd, int seqnr, KEV td[] ) { + HMODULE module; INPUT inputs[MAXKEYEVENTS]; KMSG expmsg[MAXKEYEVENTS]; MSG msg; char buf[100]; UINT evtctr=0; int kmctr, i; + + module = GetModuleHandleA("user32"); + if (!module) return; + ptr_SendInput = (void *)GetProcAddress(module, "SendInput"); + if (!ptr_SendInput) return; + buf[0]='\0'; TrackSysKey=0; /* see input.c */ for( i = 0; i < MAXKEYEVENTS; i++) { @@ -222,7 +232,7 @@ void do_test( HWND hwnd, int seqnr, KEV td[] ) for( kmctr = 0; kmctr < MAXKEYEVENTS && expmsg[kmctr].message; kmctr++) ; assert( evtctr <= MAXKEYEVENTS ); - assert( evtctr == SendInput(evtctr, &inputs[0], sizeof(INPUT))); + assert( evtctr == ptr_SendInput(evtctr, &inputs[0], sizeof(INPUT))); i = 0; trace("======== key stroke sequence #%d: %s =============\n", seqnr + 1, buf); @@ -352,4 +362,4 @@ START_TEST(input) TranslateMessage( &msg ); DispatchMessageA( &msg ); } -} +} \ No newline at end of file diff --git a/reactos/apps/tests/user32/listbox.c b/reactos/apps/tests/user32/listbox.c index 5304fbff55e..5a2074670f3 100644 --- a/reactos/apps/tests/user32/listbox.c +++ b/reactos/apps/tests/user32/listbox.c @@ -170,4 +170,4 @@ START_TEST(listbox) check (MS); trace (" ... with NOSEL\n"); check (MS_NS); -} +} \ No newline at end of file diff --git a/reactos/apps/tests/user32/makefile b/reactos/apps/tests/user32/makefile index 7929791fbc1..fa0d1b28f2c 100644 --- a/reactos/apps/tests/user32/makefile +++ b/reactos/apps/tests/user32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.2 2004/02/14 20:13:04 sedwards Exp $ +# $Id: makefile,v 1.3 2004/05/28 17:56:17 royce Exp $ PATH_TO_TOP = ../../.. @@ -18,6 +18,7 @@ TARGET_SDKLIBS = gdi32.a user32.a TARGET_OBJECTS = \ testlist.o \ class.o \ + dde.o \ dialog.o \ listbox.o \ msg.o \ diff --git a/reactos/apps/tests/user32/msg.c b/reactos/apps/tests/user32/msg.c index 775ce9819ec..55a9b2c9638 100644 --- a/reactos/apps/tests/user32/msg.c +++ b/reactos/apps/tests/user32/msg.c @@ -3,6 +3,7 @@ * * Copyright 1999 Ove Kaaven * Copyright 2003 Dimitrie O. Paun + * Copyright 2004 Dmitry Timoshkov * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -20,9 +21,7 @@ */ #include <assert.h> -#include <stdlib.h> #include <stdarg.h> -#include <stdio.h> #include "windef.h" #include "winbase.h" @@ -44,102 +43,246 @@ Window Edge Styles (Win31/Win95/98 look), in order of precedence: typedef enum { sent=0x1, posted=0x2, parent=0x4, wparam=0x8, lparam=0x10, - defwinproc=0x20 + defwinproc=0x20, optional=0x40, hook=0x80 } msg_flags_t; struct message { UINT message; /* the WM_* code */ msg_flags_t flags; /* message props */ - WPARAM wParam; /* expacted value of wParam */ - LPARAM lParam; /* expacted value of lParam */ + WPARAM wParam; /* expected value of wParam */ + LPARAM lParam; /* expected value of lParam */ }; /* CreateWindow (for overlapped window, not initially visible) (16/32) */ -static struct message WmCreateOverlappedSeq[] = { +static const struct message WmCreateOverlappedSeq[] = { + { HCBT_CREATEWND, hook }, { WM_GETMINMAXINFO, sent }, { WM_NCCREATE, sent }, { WM_NCCALCSIZE, sent|wparam, 0 }, { WM_CREATE, sent }, { 0 } }; -/* ShowWindow (for overlapped window) (16/32) */ -static struct message WmShowOverlappedSeq[] = { - { WM_SHOWWINDOW, sent|wparam, 1 }, - { WM_WINDOWPOSCHANGING, sent|wparam, /*FIXME: SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW*/ 0 }, - /* FIXME: WM_QUERYNEWPALETTE, if in 256-color mode */ - { WM_WINDOWPOSCHANGING, sent|wparam, /*FIXME: SWP_NOMOVE|SWP_NOSIZE*/ 0 }, +/* SetWindowPos(SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE) + * for a not visible overlapped window. + */ +static const struct message WmSWP_ShowOverlappedSeq[] = { + { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, + { WM_NCPAINT, sent|wparam|optional, 1 }, + { WM_GETTEXT, sent|defwinproc|optional }, + { WM_ERASEBKGND, sent|optional }, + { HCBT_ACTIVATE, hook }, + { WM_QUERYNEWPALETTE, sent|wparam|lparam|optional, 0, 0 }, + { WM_WINDOWPOSCHANGING, sent|wparam|optional, 0 }, /* Win9x: SWP_NOSENDCHANGING */ { WM_ACTIVATEAPP, sent|wparam, 1 }, { WM_NCACTIVATE, sent|wparam, 1 }, - { WM_GETTEXT, sent|defwinproc }, + { WM_GETTEXT, sent|defwinproc|optional }, { WM_ACTIVATE, sent|wparam, 1 }, + { HCBT_SETFOCUS, hook }, + { WM_IME_SETCONTEXT, sent|wparam|defwinproc|optional, 1 }, { WM_SETFOCUS, sent|wparam|defwinproc, 0 }, - { WM_NCPAINT, sent|wparam, 1 }, - { WM_GETTEXT, sent|defwinproc }, - { WM_ERASEBKGND, sent }, - { WM_WINDOWPOSCHANGED, sent|wparam, SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_SHOWWINDOW }, - { WM_SIZE, sent }, - { WM_MOVE, sent }, + { WM_NCPAINT, sent|wparam|optional, 1 }, + { WM_GETTEXT, sent|defwinproc|optional }, + { WM_ERASEBKGND, sent|optional }, + { WM_WINDOWPOSCHANGED, sent|wparam, 0 }, + { WM_NCCALCSIZE, sent|wparam|optional, 1 }, + { WM_NCPAINT, sent|wparam|optional, 1 }, + { WM_ERASEBKGND, sent|optional }, { 0 } }; - -/* DestroyWindow (for overlapped window) (32) */ -static struct message WmDestroyOverlappedSeq[] = { +/* SetWindowPos(SWP_HIDEWINDOW|SWP_NOSIZE|SWP_NOMOVE) + * for a visible overlapped window. + */ +static const struct message WmSWP_HideOverlappedSeq[] = { + { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, + { WM_WINDOWPOSCHANGED, sent|wparam, 0 }, + { 0 } +}; +/* ShowWindow(SW_SHOW) for a not visible overlapped window */ +static const struct message WmShowOverlappedSeq[] = { + { WM_SHOWWINDOW, sent|wparam, 1 }, + { WM_NCPAINT, sent|wparam|optional, 1 }, + { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, + { WM_NCPAINT, sent|wparam|optional, 1 }, + { WM_GETTEXT, sent|defwinproc|optional }, + { WM_ERASEBKGND, sent|optional }, + { HCBT_ACTIVATE, hook }, + { WM_QUERYNEWPALETTE, sent|wparam|lparam|optional, 0, 0 }, + { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, + { WM_ACTIVATEAPP, sent|wparam, 1 }, + { WM_NCACTIVATE, sent|wparam, 1 }, + { WM_GETTEXT, sent|defwinproc|optional }, + { WM_ACTIVATE, sent|wparam, 1 }, + { HCBT_SETFOCUS, hook }, + { WM_IME_SETCONTEXT, sent|wparam|defwinproc|optional, 1 }, + { WM_SETFOCUS, sent|wparam|defwinproc, 0 }, + { WM_NCPAINT, sent|wparam|optional, 1 }, + { WM_GETTEXT, sent|defwinproc|optional }, + { WM_ERASEBKGND, sent|optional }, + { WM_WINDOWPOSCHANGED, sent|wparam, 0 }, + { WM_NCCALCSIZE, sent|optional }, + { WM_NCPAINT, sent|optional }, + { WM_ERASEBKGND, sent|optional }, +#if 0 /* CreateWindow/ShowWindow(SW_SHOW) also generates WM_SIZE/WM_MOVE + * messages. Does that mean that CreateWindow doesn't set initial + * window dimensions for overlapped windows? + */ + { WM_SIZE, sent }, + { WM_MOVE, sent }, +#endif + { 0 } +}; +/* ShowWindow(SW_HIDE) for a visible overlapped window */ +static const struct message WmHideOverlappedSeq[] = { + { WM_SHOWWINDOW, sent|wparam, 0 }, + { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, + { WM_WINDOWPOSCHANGED, sent|wparam, 0 }, + { WM_SIZE, sent }, + { WM_MOVE, sent }, + { WM_NCACTIVATE, sent|wparam, 0 }, + { WM_ACTIVATE, sent|wparam, 0 }, + { WM_ACTIVATEAPP, sent|wparam, 0 }, + { WM_KILLFOCUS, sent|wparam, 0 }, + { WM_IME_SETCONTEXT, sent|wparam|optional, 0 }, + { 0 } +}; +/* DestroyWindow for a visible overlapped window */ +static const struct message WmDestroyOverlappedSeq[] = { + { HCBT_DESTROYWND, hook }, { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, { WM_WINDOWPOSCHANGED, sent|wparam, 0 }, { WM_NCACTIVATE, sent|wparam, 0 }, { WM_ACTIVATE, sent|wparam, 0 }, { WM_ACTIVATEAPP, sent|wparam, 0 }, { WM_KILLFOCUS, sent|wparam, 0 }, + { WM_IME_SETCONTEXT, sent|wparam|optional, 0 }, { WM_DESTROY, sent }, { WM_NCDESTROY, sent }, { 0 } }; +/* CreateWindow (for a child popup window, not initially visible) */ +static const struct message WmCreateChildPopupSeq[] = { + { HCBT_CREATEWND, hook }, + { WM_NCCREATE, sent }, + { WM_NCCALCSIZE, sent|wparam, 0 }, + { WM_CREATE, sent }, + { WM_SIZE, sent }, + { WM_MOVE, sent }, + { 0 } +}; +/* CreateWindow (for a popup window, not initially visible, + * which sets WS_VISIBLE in WM_CREATE handler) + */ +static const struct message WmCreateInvisiblePopupSeq[] = { + { HCBT_CREATEWND, hook }, + { WM_NCCREATE, sent }, + { WM_NCCALCSIZE, sent|wparam, 0 }, + { WM_CREATE, sent }, + { WM_STYLECHANGING, sent }, + { WM_STYLECHANGED, sent }, + { WM_SIZE, sent }, + { WM_MOVE, sent }, + { 0 } +}; +/* ShowWindow (for a popup window with WS_VISIBLE style set) */ +static const struct message WmShowVisiblePopupSeq[] = { + { 0 } +}; +/* SetWindowPos(SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER) + * for a popup window with WS_VISIBLE style set + */ +static const struct message WmShowVisiblePopupSeq_2[] = { + { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, + { 0 } +}; +/* SetWindowPos(SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE) + * for a popup window with WS_VISIBLE style set + */ +static const struct message WmShowVisiblePopupSeq_3[] = { + { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, + { HCBT_ACTIVATE, hook }, + { WM_QUERYNEWPALETTE, sent|wparam|lparam|optional, 0, 0 }, + { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, + { WM_NCACTIVATE, sent|wparam, 1 }, + { WM_ACTIVATE, sent|wparam, 1 }, + { HCBT_SETFOCUS, hook }, + { WM_KILLFOCUS, sent|parent }, + { WM_IME_SETCONTEXT, sent|parent|wparam|optional, 0 }, + { WM_IME_SETCONTEXT, sent|wparam|defwinproc|optional, 1 }, + { WM_SETFOCUS, sent|defwinproc }, + { 0 } +}; /* CreateWindow (for child window, not initially visible) */ -static struct message WmCreateChildSeq[] = { +static const struct message WmCreateChildSeq[] = { + { HCBT_CREATEWND, hook }, { WM_NCCREATE, sent }, /* child is inserted into parent's child list after WM_NCCREATE returns */ { WM_NCCALCSIZE, sent|wparam, 0 }, { WM_CREATE, sent }, { WM_SIZE, sent }, { WM_MOVE, sent }, - { WM_PARENTNOTIFY, sent|parent|wparam, 1 }, + { WM_PARENTNOTIFY, sent|parent|wparam, WM_CREATE }, { 0 } }; -/* ShowWindow (for child window) */ -static struct message WmShowChildSeq[] = { +/* CreateWindow (for maximized child window, not initially visible) */ +static const struct message WmCreateMaximizedChildSeq[] = { + { HCBT_CREATEWND, hook }, + { WM_NCCREATE, sent }, + { WM_NCCALCSIZE, sent|wparam, 0 }, + { WM_CREATE, sent }, + { WM_SIZE, sent }, + { WM_MOVE, sent }, + { HCBT_MINMAX, hook|lparam, 0, SW_MAXIMIZE }, + { WM_GETMINMAXINFO, sent }, + { WM_WINDOWPOSCHANGING, sent }, + { WM_NCCALCSIZE, sent }, + { WM_WINDOWPOSCHANGED, sent }, + { WM_SIZE, sent|defwinproc }, + { WM_PARENTNOTIFY, sent|parent|wparam, WM_CREATE }, + { 0 } +}; +/* ShowWindow(SW_SHOW) for a not visible child window */ +static const struct message WmShowChildSeq[] = { { WM_SHOWWINDOW, sent|wparam, 1 }, { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, - { WM_ERASEBKGND, sent|parent }, + { WM_ERASEBKGND, sent|parent|optional }, { WM_WINDOWPOSCHANGED, sent|wparam, 0 }, { 0 } }; -/* DestroyWindow (for child window) */ -static struct message WmDestroyChildSeq[] = { - { WM_PARENTNOTIFY, sent|parent|wparam, 2 }, +/* DestroyWindow for a visible child window */ +static const struct message WmDestroyChildSeq[] = { + { HCBT_DESTROYWND, hook }, + { WM_PARENTNOTIFY, sent|parent|wparam, WM_DESTROY }, { WM_SHOWWINDOW, sent|wparam, 0 }, { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, - { WM_ERASEBKGND, sent|parent }, + { WM_ERASEBKGND, sent|parent|optional }, { WM_WINDOWPOSCHANGED, sent|wparam, 0 }, + { HCBT_SETFOCUS, hook }, /* set focus to a parent */ + { WM_KILLFOCUS, sent }, + { WM_IME_SETCONTEXT, sent|wparam|optional, 0 }, + { WM_IME_SETCONTEXT, sent|wparam|parent|optional, 1 }, + { WM_SETFOCUS, sent|parent }, { WM_DESTROY, sent }, + { WM_DESTROY, sent|optional }, /* a bug in win2k sp4 ? */ { WM_NCDESTROY, sent }, + { WM_NCDESTROY, sent|optional }, /* a bug in win2k sp4 ? */ { 0 } }; /* Moving the mouse in nonclient area */ -static struct message WmMouseMoveInNonClientAreaSeq[] = { /* FIXME: add */ +static const struct message WmMouseMoveInNonClientAreaSeq[] = { /* FIXME: add */ { WM_NCHITTEST, sent }, { WM_SETCURSOR, sent }, { WM_NCMOUSEMOVE, posted }, { 0 } }; /* Moving the mouse in client area */ -static struct message WmMouseMoveInClientAreaSeq[] = { /* FIXME: add */ +static const struct message WmMouseMoveInClientAreaSeq[] = { /* FIXME: add */ { WM_NCHITTEST, sent }, { WM_SETCURSOR, sent }, { WM_MOUSEMOVE, posted }, { 0 } }; /* Moving by dragging the title bar (after WM_NCHITTEST and WM_SETCURSOR) (outline move) */ -static struct message WmDragTitleBarSeq[] = { /* FIXME: add */ +static const struct message WmDragTitleBarSeq[] = { /* FIXME: add */ { WM_NCLBUTTONDOWN, sent|wparam, HTCAPTION }, { WM_SYSCOMMAND, sent|defwinproc|wparam, SC_MOVE+2 }, { WM_GETMINMAXINFO, sent|defwinproc }, @@ -151,7 +294,7 @@ static struct message WmDragTitleBarSeq[] = { /* FIXME: add */ { 0 } }; /* Sizing by dragging the thick borders (after WM_NCHITTEST and WM_SETCURSOR) (outline move) */ -static struct message WmDragThinkBordersBarSeq[] = { /* FIXME: add */ +static const struct message WmDragThickBordersBarSeq[] = { /* FIXME: add */ { WM_NCLBUTTONDOWN, sent|wparam, 0xd }, { WM_SYSCOMMAND, sent|defwinproc|wparam, 0xf004 }, { WM_GETMINMAXINFO, sent|defwinproc }, @@ -170,17 +313,17 @@ static struct message WmDragThinkBordersBarSeq[] = { /* FIXME: add */ { 0 } }; /* Resizing child window with MoveWindow (32) */ -static struct message WmResizingChildWithMoveWindowSeq[] = { +static const struct message WmResizingChildWithMoveWindowSeq[] = { { WM_WINDOWPOSCHANGING, sent }, { WM_NCCALCSIZE, sent|wparam, 1 }, - { WM_ERASEBKGND, sent }, + { WM_ERASEBKGND, sent|optional }, { WM_WINDOWPOSCHANGED, sent }, { WM_MOVE, sent|defwinproc }, { WM_SIZE, sent|defwinproc }, { 0 } }; /* Clicking on inactive button */ -static struct message WmClickInactiveButtonSeq[] = { /* FIXME: add */ +static const struct message WmClickInactiveButtonSeq[] = { /* FIXME: add */ { WM_NCHITTEST, sent }, { WM_PARENTNOTIFY, sent|parent|wparam, WM_LBUTTONDOWN }, { WM_MOUSEACTIVATE, sent }, @@ -201,7 +344,7 @@ static struct message WmClickInactiveButtonSeq[] = { /* FIXME: add */ }; /* Reparenting a button (16/32) */ /* The last child (button) reparented gets topmost for its new parent. */ -static struct message WmReparentButtonSeq[] = { /* FIXME: add */ +static const struct message WmReparentButtonSeq[] = { /* FIXME: add */ { WM_SHOWWINDOW, sent|wparam, 0 }, { WM_WINDOWPOSCHANGING, sent|wparam, SWP_HIDEWINDOW|SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER }, { WM_ERASEBKGND, sent|parent }, @@ -213,62 +356,147 @@ static struct message WmReparentButtonSeq[] = { /* FIXME: add */ { WM_SHOWWINDOW, sent|wparam, 1 }, { 0 } }; -/* Creation of a modal dialog (32) */ -static struct message WmCreateModalDialogSeq[] = { /* FIXME: add */ - { WM_CANCELMODE, sent|parent }, - { WM_KILLFOCUS, sent|parent }, - { WM_ENABLE, sent|parent|wparam, 0 }, - /* (window proc creation messages not tracked yet, because...) */ - { WM_SETFONT, sent }, - { WM_INITDIALOG, sent }, - /* (...the window proc message hook was installed here, IsVisible still FALSE) */ - { WM_NCACTIVATE, sent|parent|wparam, 0 }, - { WM_GETTEXT, sent|defwinproc }, - { WM_ACTIVATE, sent|parent|wparam, 0 }, - { WM_WINDOWPOSCHANGING, sent }, - { WM_WINDOWPOSCHANGING, sent|parent }, - { WM_NCACTIVATE, sent|wparam, 1 }, - { WM_ACTIVATE, sent|wparam, 1 }, - /* (setting focus) */ +/* Creation of a custom dialog (32) */ +static const struct message WmCreateCustomDialogSeq[] = { + { HCBT_CREATEWND, hook }, + { WM_GETMINMAXINFO, sent }, + { WM_NCCREATE, sent }, + { WM_NCCALCSIZE, sent|wparam, 0 }, + { WM_CREATE, sent }, { WM_SHOWWINDOW, sent|wparam, 1 }, - { WM_WINDOWPOSCHANGING, sent }, - { WM_NCPAINT, sent }, - { WM_GETTEXT, sent|defwinproc }, + { HCBT_ACTIVATE, hook }, + { WM_QUERYNEWPALETTE, sent|wparam|lparam|optional, 0, 0 }, + { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, + { WM_NCACTIVATE, sent|wparam, 1 }, + { WM_GETTEXT, sent|optional|defwinproc }, + { WM_GETICON, sent|optional|defwinproc }, + { WM_GETICON, sent|optional|defwinproc }, + { WM_GETICON, sent|optional|defwinproc }, + { WM_GETTEXT, sent|optional|defwinproc }, + { WM_ACTIVATE, sent|wparam, 1 }, + { WM_KILLFOCUS, sent|parent }, + { WM_IME_SETCONTEXT, sent|parent|wparam|optional, 0 }, + { WM_IME_SETCONTEXT, sent|wparam|optional, 1 }, + { WM_SETFOCUS, sent }, + { WM_GETDLGCODE, sent|defwinproc|wparam, 0 }, + { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, + { WM_NCPAINT, sent|wparam, 1 }, + { WM_GETTEXT, sent|optional|defwinproc }, + { WM_GETICON, sent|optional|defwinproc }, + { WM_GETICON, sent|optional|defwinproc }, + { WM_GETICON, sent|optional|defwinproc }, + { WM_GETTEXT, sent|optional|defwinproc }, { WM_ERASEBKGND, sent }, { WM_CTLCOLORDLG, sent|defwinproc }, - { WM_WINDOWPOSCHANGED, sent }, - { WM_PAINT, sent }, - /* FIXME: (bunch of WM_CTLCOLOR* for each control) */ - { WM_PAINT, sent|parent }, - { WM_ENTERIDLE, sent|parent|wparam, 0}, - { WM_SETCURSOR, sent|parent }, + { WM_WINDOWPOSCHANGED, sent|wparam, 0 }, + { WM_GETTEXT, sent|optional }, + { WM_GETICON, sent|optional }, + { WM_GETICON, sent|optional }, + { WM_GETICON, sent|optional }, + { WM_GETTEXT, sent|optional }, + { WM_NCCALCSIZE, sent|optional }, + { WM_NCPAINT, sent|optional }, + { WM_GETTEXT, sent|optional|defwinproc }, + { WM_GETICON, sent|optional|defwinproc }, + { WM_GETICON, sent|optional|defwinproc }, + { WM_GETICON, sent|optional|defwinproc }, + { WM_GETTEXT, sent|optional|defwinproc }, + { WM_ERASEBKGND, sent|optional }, + { WM_CTLCOLORDLG, sent|optional|defwinproc }, + { WM_SIZE, sent }, + { WM_MOVE, sent }, { 0 } }; -/* Destruction of a modal dialog (32) */ -static struct message WmDestroyModalDialogSeq[] = { /* FIXME: add */ - /* (inside dialog proc: EndDialog is called) */ - { WM_ENABLE, sent|parent|wparam, 1 }, - { WM_SETFOCUS, sent }, +/* Calling EndDialog for a custom dialog (32) */ +static const struct message WmEndCustomDialogSeq[] = { { WM_WINDOWPOSCHANGING, sent }, - { WM_NCPAINT, sent|parent }, - { WM_GETTEXT, sent|defwinproc }, - { WM_ERASEBKGND, sent|parent }, { WM_WINDOWPOSCHANGED, sent }, + { WM_GETTEXT, sent|optional }, + { WM_GETICON, sent|optional }, + { WM_GETICON, sent|optional }, + { WM_GETICON, sent|optional }, + { HCBT_ACTIVATE, hook }, { WM_NCACTIVATE, sent|wparam, 0 }, + { WM_GETTEXT, sent|optional|defwinproc }, + { WM_GETICON, sent|optional|defwinproc }, + { WM_GETICON, sent|optional|defwinproc }, + { WM_GETICON, sent|optional|defwinproc }, + { WM_GETTEXT, sent|optional|defwinproc }, { WM_ACTIVATE, sent|wparam, 0 }, - { WM_WINDOWPOSCHANGING, sent }, - { WM_WINDOWPOSCHANGING, sent|parent }, - { WM_NCACTIVATE, sent|parent|wparam, 1 }, - { WM_GETTEXT, sent|defwinproc }, - { WM_ACTIVATE, sent|parent|wparam, 1 }, + { WM_WINDOWPOSCHANGING, sent|optional }, + { HCBT_SETFOCUS, hook }, { WM_KILLFOCUS, sent }, - { WM_SETFOCUS, sent|parent }, + { WM_IME_SETCONTEXT, sent|wparam|optional, 0 }, + { WM_IME_SETCONTEXT, sent|parent|wparam|defwinproc|optional, 1 }, + { WM_SETFOCUS, sent|parent|defwinproc }, + { 0 } +}; +/* Creation and destruction of a modal dialog (32) */ +static const struct message WmModalDialogSeq[] = { + { WM_CANCELMODE, sent|parent }, + { WM_KILLFOCUS, sent|parent }, + { WM_IME_SETCONTEXT, sent|parent|wparam|optional, 0 }, + { WM_ENABLE, sent|parent|wparam, 0 }, + { WM_SETFONT, sent }, + { WM_INITDIALOG, sent }, + { WM_CHANGEUISTATE, sent|optional }, + { WM_SHOWWINDOW, sent }, + { WM_WINDOWPOSCHANGING, sent }, + { WM_NCACTIVATE, sent|wparam, 1 }, + { WM_GETICON, sent|optional }, + { WM_GETICON, sent|optional }, + { WM_GETICON, sent|optional }, + { WM_GETTEXT, sent|optional }, + { WM_ACTIVATE, sent|wparam, 1 }, + { WM_WINDOWPOSCHANGING, sent }, + { WM_NCPAINT, sent }, + { WM_GETICON, sent|optional }, + { WM_GETICON, sent|optional }, + { WM_GETICON, sent|optional }, + { WM_GETTEXT, sent|optional }, + { WM_ERASEBKGND, sent }, + { WM_CTLCOLORDLG, sent }, + { WM_WINDOWPOSCHANGED, sent }, + { WM_GETICON, sent|optional }, + { WM_GETICON, sent|optional }, + { WM_GETICON, sent|optional }, + { WM_GETTEXT, sent|optional }, + { WM_NCCALCSIZE, sent|optional }, + { WM_NCPAINT, sent|optional }, + { WM_GETICON, sent|optional }, + { WM_GETICON, sent|optional }, + { WM_GETICON, sent|optional }, + { WM_GETTEXT, sent|optional }, + { WM_ERASEBKGND, sent|optional }, + { WM_CTLCOLORDLG, sent|optional }, + { WM_PAINT, sent|optional }, + { WM_CTLCOLORBTN, sent }, + { WM_ENTERIDLE, sent|parent }, + { WM_TIMER, sent }, + { WM_ENABLE, sent|parent|wparam, 1 }, + { WM_WINDOWPOSCHANGING, sent }, + { WM_WINDOWPOSCHANGED, sent }, + { WM_GETICON, sent|optional }, + { WM_GETICON, sent|optional }, + { WM_GETICON, sent|optional }, + { WM_GETTEXT, sent|optional }, + { HCBT_ACTIVATE, hook }, + { WM_NCACTIVATE, sent|wparam, 0 }, + { WM_GETICON, sent|optional }, + { WM_GETICON, sent|optional }, + { WM_GETICON, sent|optional }, + { WM_GETTEXT, sent|optional }, + { WM_ACTIVATE, sent|wparam, 0 }, + { WM_WINDOWPOSCHANGING, sent|optional }, + { HCBT_SETFOCUS, hook }, + { WM_IME_SETCONTEXT, sent|parent|wparam|defwinproc|optional, 1 }, + { WM_SETFOCUS, sent|parent|defwinproc }, { WM_DESTROY, sent }, { WM_NCDESTROY, sent }, { 0 } }; /* Creation of a modal dialog that is resized inside WM_INITDIALOG (32) */ -static struct message WmCreateModalDialogResizeSeq[] = { /* FIXME: add */ +static const struct message WmCreateModalDialogResizeSeq[] = { /* FIXME: add */ /* (inside dialog proc, handling WM_INITDIALOG) */ { WM_WINDOWPOSCHANGING, sent }, { WM_NCCALCSIZE, sent }, @@ -296,37 +524,124 @@ static struct message WmCreateModalDialogResizeSeq[] = { /* FIXME: add */ { WM_SETCURSOR, sent|parent }, { 0 } }; +/* SetMenu for NonVisible windows with size change*/ +static const struct message WmSetMenuNonVisibleSizeChangeSeq[] = { + { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, + { WM_NCCALCSIZE, sent|wparam, 1 }, + { WM_WINDOWPOSCHANGED, sent|wparam, 0 }, + { WM_MOVE, sent|defwinproc }, + { WM_SIZE, sent|defwinproc }, + { WM_GETICON, sent|optional }, + { WM_GETICON, sent|optional }, + { WM_GETICON, sent|optional }, + { WM_GETTEXT, sent|optional }, + { WM_NCCALCSIZE, sent|wparam|optional, 1 }, + { 0 } +}; +/* SetMenu for NonVisible windows with no size change */ +static const struct message WmSetMenuNonVisibleNoSizeChangeSeq[] = { + { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, + { WM_NCCALCSIZE, sent|wparam, 1 }, + { WM_WINDOWPOSCHANGED, sent|wparam, 0 }, + { 0 } +}; +/* SetMenu for Visible windows with size change */ +static const struct message WmSetMenuVisibleSizeChangeSeq[] = { + { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, + { WM_NCCALCSIZE, sent|wparam, 1 }, + { WM_NCPAINT, sent|wparam, 1 }, + { WM_GETTEXT, sent|defwinproc|optional }, + { WM_ERASEBKGND, sent|optional }, + { WM_ACTIVATE, sent|optional }, + { WM_WINDOWPOSCHANGED, sent|wparam, 0 }, + { WM_MOVE, sent|defwinproc }, + { WM_SIZE, sent|defwinproc }, + { WM_NCCALCSIZE, sent|wparam|optional, 1 }, + { WM_NCPAINT, sent|wparam|optional, 1 }, + { WM_ERASEBKGND, sent|optional }, + { 0 } +}; +/* SetMenu for Visible windows with no size change */ +static const struct message WmSetMenuVisibleNoSizeChangeSeq[] = { + { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, + { WM_NCCALCSIZE, sent|wparam, 1 }, + { WM_NCPAINT, sent|wparam, 1 }, + { WM_GETTEXT, sent|defwinproc|optional }, + { WM_ERASEBKGND, sent|optional }, + { WM_ACTIVATE, sent|optional }, + { WM_WINDOWPOSCHANGED, sent|wparam, 0 }, + { 0 } +}; +/* DrawMenuBar for a visible window */ +static const struct message WmDrawMenuBarSeq[] = +{ + { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, + { WM_NCCALCSIZE, sent|wparam, 1 }, + { WM_NCPAINT, sent|wparam, 1 }, + { WM_GETTEXT, sent|defwinproc|optional }, + { WM_ERASEBKGND, sent|optional }, + { WM_WINDOWPOSCHANGED, sent|wparam, 0 }, + { 0 } +}; +static const struct message WmSetRedrawFalseSeq[] = +{ + { WM_SETREDRAW, sent|wparam, 0 }, + { 0 } +}; + +static const struct message WmSetRedrawTrueSeq[] = +{ + { WM_SETREDRAW, sent|wparam, 1 }, + { 0 } +}; + +static int after_end_dialog; static int sequence_cnt, sequence_size; static struct message* sequence; -static void add_message(struct message msg) +static void add_message(const struct message *msg) { if (!sequence) - sequence = malloc ( (sequence_size = 10) * sizeof (struct message) ); + { + sequence_size = 10; + sequence = HeapAlloc( GetProcessHeap(), 0, sequence_size * sizeof (struct message) ); + } if (sequence_cnt == sequence_size) - sequence = realloc ( sequence, (sequence_size *= 2) * sizeof (struct message) ); + { + sequence_size *= 2; + sequence = HeapReAlloc( GetProcessHeap(), 0, sequence, sequence_size * sizeof (struct message) ); + } assert(sequence); - sequence[sequence_cnt++] = msg; + + sequence[sequence_cnt].message = msg->message; + sequence[sequence_cnt].flags = msg->flags; + sequence[sequence_cnt].wParam = msg->wParam; + sequence[sequence_cnt].lParam = msg->lParam; + + sequence_cnt++; } static void flush_sequence() { - free(sequence); + HeapFree(GetProcessHeap(), 0, sequence); sequence = 0; sequence_cnt = sequence_size = 0; } -static void ok_sequence(struct message *expected, const char *context) +static void ok_sequence(const struct message *expected, const char *context) { - static struct message end_of_sequence = { 0, 0, 0, 0 }; - struct message *actual = sequence; + static const struct message end_of_sequence = { 0, 0, 0, 0 }; + const struct message *actual; - add_message(end_of_sequence); + add_message(&end_of_sequence); - /* naive sequence comparison. Would be nice to use a regexp engine here */ - while (expected->message || actual->message) + actual = sequence; + + while (expected->message && actual->message) { + trace("expected %04x - actual %04x\n", expected->message, actual->message); + if (expected->message == actual->message) { if (expected->flags & wparam) @@ -337,30 +652,23 @@ static void ok_sequence(struct message *expected, const char *context) ok (expected->lParam == actual->lParam, "%s: in msg 0x%04x expecting lParam 0x%lx got 0x%lx\n", context, expected->message, expected->lParam, actual->lParam); - /* FIXME: should we check defwinproc? */ + ok ((expected->flags & defwinproc) == (actual->flags & defwinproc), + "%s: the msg 0x%04x should %shave been sent by DefWindowProc\n", + context, expected->message, (expected->flags & defwinproc) ? "" : "NOT "); ok ((expected->flags & (sent|posted)) == (actual->flags & (sent|posted)), "%s: the msg 0x%04x should have been %s\n", context, expected->message, (expected->flags & posted) ? "posted" : "sent"); ok ((expected->flags & parent) == (actual->flags & parent), "%s: the msg 0x%04x was expected in %s\n", context, expected->message, (expected->flags & parent) ? "parent" : "child"); + ok ((expected->flags & hook) == (actual->flags & hook), + "%s: the msg 0x%04x should have been sent by a hook\n", + context, expected->message); expected++; actual++; } - else if (expected->message && ((expected + 1)->message == actual->message) ) - { - todo_wine { - ok (FALSE, "%s: the msg 0x%04x was not received\n", context, expected->message); + else if (expected->flags & optional) expected++; - } - } - else if (actual->message && (expected->message == (actual + 1)->message) ) - { - todo_wine { - ok (FALSE, "%s: the msg 0x%04x was not expected\n", context, actual->message); - actual++; - } - } else { todo_wine { @@ -372,31 +680,112 @@ static void ok_sequence(struct message *expected, const char *context) } } + /* skip all optional trailing messages */ + while (expected->message && (expected->flags & optional)) + expected++; + // the next test was disabled because it fails in XP - Royce3 + /*todo_wine { + if (expected->message || actual->message) + ok (FALSE, "%s: the msg sequence is not complete (got 0x%04x)\n", context, actual->message); + }*/ + flush_sequence(); } +static void test_WM_SETREDRAW(HWND hwnd) +{ + DWORD style = GetWindowLongA(hwnd, GWL_STYLE); + + flush_sequence(); + + SendMessageA(hwnd, WM_SETREDRAW, FALSE, 0); + ok_sequence(WmSetRedrawFalseSeq, "SetRedraw:FALSE"); + + ok(!(GetWindowLongA(hwnd, GWL_STYLE) & WS_VISIBLE), "WS_VISIBLE should NOT be set\n"); + ok(!IsWindowVisible(hwnd), "IsWindowVisible() should return FALSE\n"); + + flush_sequence(); + SendMessageA(hwnd, WM_SETREDRAW, TRUE, 0); + ok_sequence(WmSetRedrawTrueSeq, "SetRedraw:TRUE"); + + ok(GetWindowLongA(hwnd, GWL_STYLE) & WS_VISIBLE, "WS_VISIBLE should be set\n"); + ok(IsWindowVisible(hwnd), "IsWindowVisible() should return TRUE\n"); + + /* restore original WS_VISIBLE state */ + SetWindowLongA(hwnd, GWL_STYLE, style); + + flush_sequence(); +} + +static INT_PTR CALLBACK TestModalDlgProcA(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + struct message msg; + + trace("dialog: %p, %04x, %08x, %08lx\n", hwnd, message, wParam, lParam); + + msg.message = message; + msg.flags = sent|wparam|lparam; + msg.wParam = wParam; + msg.lParam = lParam; + add_message(&msg); + + if (message == WM_INITDIALOG) SetTimer( hwnd, 1, 100, NULL ); + if (message == WM_TIMER) EndDialog( hwnd, 0 ); + return 0; +} + /* test if we receive the right sequence of messages */ static void test_messages(void) { HWND hwnd, hparent, hchild; HWND hchild2, hbutton; + HMENU hmenu; hwnd = CreateWindowExA(0, "TestWindowClass", "Test overlapped", WS_OVERLAPPEDWINDOW, 100, 100, 200, 200, 0, 0, 0, NULL); ok (hwnd != 0, "Failed to create overlapped window\n"); ok_sequence(WmCreateOverlappedSeq, "CreateWindow:overlapped"); + + /* test WM_SETREDRAW on a not visible top level window */ + test_WM_SETREDRAW(hwnd); + + SetWindowPos(hwnd, 0,0,0,0,0, SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE); + ok_sequence(WmSWP_ShowOverlappedSeq, "SetWindowPos:SWP_SHOWWINDOW:overlapped"); + ok(IsWindowVisible(hwnd), "window should be visible at this point\n"); + + ok(GetActiveWindow() == hwnd, "window should be active\n"); + ok(GetFocus() == hwnd, "window should have input focus\n"); + ShowWindow(hwnd, SW_HIDE); + ok_sequence(WmHideOverlappedSeq, "ShowWindow(SW_HIDE):overlapped"); - ShowWindow(hwnd, TRUE); - ok_sequence(WmShowOverlappedSeq, "ShowWindow:overlapped"); + ShowWindow(hwnd, SW_SHOW); + ok_sequence(WmShowOverlappedSeq, "ShowWindow(SW_SHOW):overlapped"); + + ok(GetActiveWindow() == hwnd, "window should be active\n"); + ok(GetFocus() == hwnd, "window should have input focus\n"); + SetWindowPos(hwnd, 0,0,0,0,0, SWP_HIDEWINDOW|SWP_NOSIZE|SWP_NOMOVE); + ok_sequence(WmSWP_HideOverlappedSeq, "SetWindowPos:SWP_HIDEWINDOW:overlapped"); + ok(!IsWindowVisible(hwnd), "window should not be visible at this point\n"); + + /* test WM_SETREDRAW on a visible top level window */ + ShowWindow(hwnd, SW_SHOW); + test_WM_SETREDRAW(hwnd); DestroyWindow(hwnd); ok_sequence(WmDestroyOverlappedSeq, "DestroyWindow:overlapped"); - hparent = CreateWindowExA(0, "TestParentClass", "Test parent", WS_OVERLAPPEDWINDOW, + hparent = CreateWindowExA(0, "TestParentClass", "Test parent", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 200, 200, 0, 0, 0, NULL); ok (hparent != 0, "Failed to create parent window\n"); flush_sequence(); + hchild = CreateWindowExA(0, "TestWindowClass", "Test child", WS_CHILD | WS_MAXIMIZE, + 0, 0, 10, 10, hparent, 0, 0, NULL); + ok (hchild != 0, "Failed to create child window\n"); + ok_sequence(WmCreateMaximizedChildSeq, "CreateWindow:maximized child"); + DestroyWindow(hchild); + flush_sequence(); + hchild = CreateWindowExA(0, "TestWindowClass", "Test child", WS_CHILDWINDOW, 0, 0, 10, 10, hparent, 0, 0, NULL); ok (hchild != 0, "Failed to create child window\n"); @@ -410,24 +799,247 @@ static void test_messages(void) hbutton = CreateWindowExA(0, "TestWindowClass", "Test button", WS_CHILDWINDOW, 0, 100, 50, 50, hchild, 0, 0, NULL); ok (hbutton != 0, "Failed to create button window\n"); - flush_sequence(); - ShowWindow(hchild, TRUE); + /* test WM_SETREDRAW on a not visible child window */ + test_WM_SETREDRAW(hchild); + + ShowWindow(hchild, SW_SHOW); ok_sequence(WmShowChildSeq, "ShowWindow:child"); + /* test WM_SETREDRAW on a visible child window */ + test_WM_SETREDRAW(hchild); + + SetFocus(hchild); + flush_sequence(); + MoveWindow(hchild, 10, 10, 20, 20, TRUE); ok_sequence(WmResizingChildWithMoveWindowSeq, "MoveWindow:child"); DestroyWindow(hchild); ok_sequence(WmDestroyChildSeq, "DestroyWindow:child"); + DestroyWindow(hchild2); + DestroyWindow(hbutton); + + flush_sequence(); + hchild = CreateWindowExA(0, "TestWindowClass", "Test Child Popup", WS_CHILD | WS_POPUP, + 0, 0, 100, 100, hparent, 0, 0, NULL); + ok (hchild != 0, "Failed to create child popup window\n"); + ok_sequence(WmCreateChildPopupSeq, "CreateWindow:child_popup"); + DestroyWindow(hchild); + + /* test what happens to a window which sets WS_VISIBLE in WM_CREATE */ + flush_sequence(); + hchild = CreateWindowExA(0, "TestPopupClass", "Test Popup", WS_POPUP, + 0, 0, 100, 100, hparent, 0, 0, NULL); + ok (hchild != 0, "Failed to create popup window\n"); + ok_sequence(WmCreateInvisiblePopupSeq, "CreateWindow:invisible_popup"); + ok(GetWindowLongA(hchild, GWL_STYLE) & WS_VISIBLE, "WS_VISIBLE should be set\n"); + ok(IsWindowVisible(hchild), "IsWindowVisible() should return TRUE\n"); + flush_sequence(); + ShowWindow(hchild, SW_SHOW); + ok_sequence(WmShowVisiblePopupSeq, "CreateWindow:show_visible_popup"); + flush_sequence(); + SetWindowPos(hchild, 0,0,0,0,0, SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER); + ok_sequence(WmShowVisiblePopupSeq_2, "CreateWindow:show_visible_popup_2"); + flush_sequence(); + SetWindowPos(hchild, 0,0,0,0,0, SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE); + ok_sequence(WmShowVisiblePopupSeq_3, "CreateWindow:show_visible_popup_3"); + DestroyWindow(hchild); + + /* this time add WS_VISIBLE for CreateWindowEx, but this fact actually + * changes nothing in message sequences. + */ + flush_sequence(); + hchild = CreateWindowExA(0, "TestPopupClass", "Test Popup", WS_POPUP | WS_VISIBLE, + 0, 0, 100, 100, hparent, 0, 0, NULL); + ok (hchild != 0, "Failed to create popup window\n"); + ok_sequence(WmCreateInvisiblePopupSeq, "CreateWindow:invisible_popup"); + ok(GetWindowLongA(hchild, GWL_STYLE) & WS_VISIBLE, "WS_VISIBLE should be set\n"); + ok(IsWindowVisible(hchild), "IsWindowVisible() should return TRUE\n"); + flush_sequence(); + ShowWindow(hchild, SW_SHOW); + ok_sequence(WmShowVisiblePopupSeq, "CreateWindow:show_visible_popup"); + flush_sequence(); + SetWindowPos(hchild, 0,0,0,0,0, SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER); + ok_sequence(WmShowVisiblePopupSeq_2, "CreateWindow:show_visible_popup_2"); + DestroyWindow(hchild); + + flush_sequence(); + hwnd = CreateWindowExA(WS_EX_DLGMODALFRAME, "TestDialogClass", NULL, WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_DLGFRAME, + 0, 0, 100, 100, hparent, 0, 0, NULL); + ok(hwnd != 0, "Failed to create custom dialog window\n"); + ok_sequence(WmCreateCustomDialogSeq, "CreateCustomDialog"); + + flush_sequence(); + after_end_dialog = 1; + EndDialog( hwnd, 0 ); + ok_sequence(WmEndCustomDialogSeq, "EndCustomDialog"); + + DestroyWindow(hwnd); + after_end_dialog = 0; + + flush_sequence(); + DialogBoxA( 0, "TEST_DIALOG", hparent, TestModalDlgProcA ); + ok_sequence(WmModalDialogSeq, "ModalDialog"); + + DestroyWindow(hparent); + flush_sequence(); + + /* Message sequence for SetMenu */ + hmenu = CreateMenu(); + ok (hmenu != 0, "Failed to create menu\n"); + ok (InsertMenuA(hmenu, -1, MF_BYPOSITION, 0x1000, "foo"), "InsertMenu failed\n"); + hwnd = CreateWindowExA(0, "TestWindowClass", "Test overlapped", WS_OVERLAPPEDWINDOW, + 100, 100, 200, 200, 0, hmenu, 0, NULL); + ok_sequence(WmCreateOverlappedSeq, "CreateWindow:overlapped"); + ok (SetMenu(hwnd, 0), "SetMenu\n"); + ok_sequence(WmSetMenuNonVisibleSizeChangeSeq, "SetMenu:NonVisibleSizeChange"); + ok (SetMenu(hwnd, 0), "SetMenu\n"); + ok_sequence(WmSetMenuNonVisibleNoSizeChangeSeq, "SetMenu:NonVisibleNoSizeChange"); + ShowWindow(hwnd, SW_SHOW); + flush_sequence(); + ok (SetMenu(hwnd, 0), "SetMenu\n"); + ok_sequence(WmSetMenuVisibleNoSizeChangeSeq, "SetMenu:VisibleNoSizeChange"); + ok (SetMenu(hwnd, hmenu), "SetMenu\n"); + ok_sequence(WmSetMenuVisibleSizeChangeSeq, "SetMenu:VisibleSizeChange"); + + ok(DrawMenuBar(hwnd), "DrawMenuBar\n"); + ok_sequence(WmDrawMenuBarSeq, "DrawMenuBar"); + + DestroyWindow(hwnd); } static LRESULT WINAPI MsgCheckProcA(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { - struct message msg = { message, sent|wparam|lparam, wParam, lParam }; + static long defwndproc_counter = 0; + LRESULT ret; + struct message msg; - add_message(msg); - return DefWindowProcA(hwnd, message, wParam, lParam); + trace("%p, %04x, %08x, %08lx\n", hwnd, message, wParam, lParam); + + msg.message = message; + msg.flags = sent|wparam|lparam; + if (defwndproc_counter) msg.flags |= defwinproc; + msg.wParam = wParam; + msg.lParam = lParam; + add_message(&msg); + + if (message == WM_GETMINMAXINFO && (GetWindowLongA(hwnd, GWL_STYLE) & WS_CHILD)) + { + HWND parent = GetParent(hwnd); + RECT rc; + MINMAXINFO *minmax = (MINMAXINFO *)lParam; + + GetClientRect(parent, &rc); + trace("parent %p client size = (%ld x %ld)\n", parent, rc.right, rc.bottom); + + trace("ptReserved = (%ld,%ld)\n" + "ptMaxSize = (%ld,%ld)\n" + "ptMaxPosition = (%ld,%ld)\n" + "ptMinTrackSize = (%ld,%ld)\n" + "ptMaxTrackSize = (%ld,%ld)\n", + minmax->ptReserved.x, minmax->ptReserved.y, + minmax->ptMaxSize.x, minmax->ptMaxSize.y, + minmax->ptMaxPosition.x, minmax->ptMaxPosition.y, + minmax->ptMinTrackSize.x, minmax->ptMinTrackSize.y, + minmax->ptMaxTrackSize.x, minmax->ptMaxTrackSize.y); + + ok(minmax->ptMaxSize.x == rc.right, "default width of maximized child %ld != %ld\n", + minmax->ptMaxSize.x, rc.right); + ok(minmax->ptMaxSize.y == rc.bottom, "default height of maximized child %ld != %ld\n", + minmax->ptMaxSize.y, rc.bottom); + } + + defwndproc_counter++; + ret = DefWindowProcA(hwnd, message, wParam, lParam); + defwndproc_counter--; + + return ret; +} + +static LRESULT WINAPI PopupMsgCheckProcA(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + static long defwndproc_counter = 0; + LRESULT ret; + struct message msg; + + trace("popup: %p, %04x, %08x, %08lx\n", hwnd, message, wParam, lParam); + + msg.message = message; + msg.flags = sent|wparam|lparam; + if (defwndproc_counter) msg.flags |= defwinproc; + msg.wParam = wParam; + msg.lParam = lParam; + add_message(&msg); + + if (message == WM_CREATE) + { + DWORD style = GetWindowLongA(hwnd, GWL_STYLE) | WS_VISIBLE; + SetWindowLongA(hwnd, GWL_STYLE, style); + } + + defwndproc_counter++; + ret = DefWindowProcA(hwnd, message, wParam, lParam); + defwndproc_counter--; + + return ret; +} + +static LRESULT WINAPI ParentMsgCheckProcA(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + static long defwndproc_counter = 0; + LRESULT ret; + struct message msg; + + trace("parent: %p, %04x, %08x, %08lx\n", hwnd, message, wParam, lParam); + + if (message == WM_PARENTNOTIFY || message == WM_CANCELMODE || + message == WM_SETFOCUS || message == WM_KILLFOCUS || + message == WM_ENABLE || message == WM_ENTERIDLE || + message == WM_IME_SETCONTEXT) + { + msg.message = message; + msg.flags = sent|parent|wparam|lparam; + if (defwndproc_counter) msg.flags |= defwinproc; + msg.wParam = wParam; + msg.lParam = lParam; + add_message(&msg); + } + + defwndproc_counter++; + ret = DefWindowProcA(hwnd, message, wParam, lParam); + defwndproc_counter--; + + return ret; +} + +static LRESULT WINAPI TestDlgProcA(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + static long defwndproc_counter = 0; + LRESULT ret; + struct message msg; + + trace("dialog: %p, %04x, %08x, %08lx\n", hwnd, message, wParam, lParam); + + DefDlgProcA(hwnd, DM_SETDEFID, 1, 0); + ret = DefDlgProcA(hwnd, DM_GETDEFID, 0, 0); + if (after_end_dialog) + ok( ret == 0, "DM_GETDEFID should return 0 after EndDialog, got %lx\n", ret ); + else + ok(HIWORD(ret) == DC_HASDEFID, "DM_GETDEFID should return DC_HASDEFID, got %lx\n", ret); + + msg.message = message; + msg.flags = sent|wparam|lparam; + if (defwndproc_counter) msg.flags |= defwinproc; + msg.wParam = wParam; + msg.lParam = lParam; + add_message(&msg); + + defwndproc_counter++; + ret = DefDlgProcA(hwnd, message, wParam, lParam); + defwndproc_counter--; + + return ret; } static BOOL RegisterWindowClasses(void) @@ -444,41 +1056,64 @@ static BOOL RegisterWindowClasses(void) cls.hbrBackground = GetStockObject(WHITE_BRUSH); cls.lpszMenuName = NULL; cls.lpszClassName = "TestWindowClass"; - if(!RegisterClassA(&cls)) return FALSE; - cls.style = 0; - cls.lpfnWndProc = DefWindowProcA; - cls.cbClsExtra = 0; - cls.cbWndExtra = 0; - cls.hInstance = GetModuleHandleA(0); - cls.hIcon = 0; - cls.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); - cls.hbrBackground = GetStockObject(WHITE_BRUSH); - cls.lpszMenuName = NULL; + cls.lpfnWndProc = PopupMsgCheckProcA; + cls.lpszClassName = "TestPopupClass"; + if(!RegisterClassA(&cls)) return FALSE; + + cls.lpfnWndProc = ParentMsgCheckProcA; cls.lpszClassName = "TestParentClass"; - if(!RegisterClassA(&cls)) return FALSE; - cls.style = 0; cls.lpfnWndProc = DefWindowProcA; - cls.cbClsExtra = 0; - cls.cbWndExtra = 0; - cls.hInstance = GetModuleHandleA(0); - cls.hIcon = 0; - cls.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); - cls.hbrBackground = GetStockObject(WHITE_BRUSH); - cls.lpszMenuName = NULL; cls.lpszClassName = "SimpleWindowClass"; + if(!RegisterClassA(&cls)) return FALSE; + ok(GetClassInfoA(0, "#32770", &cls), "GetClassInfo failed\n"); + cls.lpfnWndProc = TestDlgProcA; + cls.lpszClassName = "TestDialogClass"; if(!RegisterClassA(&cls)) return FALSE; return TRUE; } +static HHOOK hCBT_hook; + +static LRESULT CALLBACK cbt_hook_proc(int nCode, WPARAM wParam, LPARAM lParam) +{ + char buf[256]; + + trace("CBT: %d, %08x, %08lx\n", nCode, wParam, lParam); + + if (GetClassNameA((HWND)wParam, buf, sizeof(buf))) + { + if (!strcmp(buf, "TestWindowClass") || + !strcmp(buf, "TestParentClass") || + !strcmp(buf, "TestPopupClass") || + !strcmp(buf, "SimpleWindowClass") || + !strcmp(buf, "TestDialogClass")) + { + struct message msg; + + msg.message = nCode; + msg.flags = hook; + msg.wParam = wParam; + msg.lParam = lParam; + add_message(&msg); + } + } + return CallNextHookEx(hCBT_hook, nCode, wParam, lParam); +} + START_TEST(msg) { if (!RegisterWindowClasses()) assert(0); + hCBT_hook = SetWindowsHookExA(WH_CBT, cbt_hook_proc, 0, GetCurrentThreadId()); + assert(hCBT_hook); + test_messages(); + + UnhookWindowsHookEx(hCBT_hook); } diff --git a/reactos/apps/tests/user32/resource.c b/reactos/apps/tests/user32/resource.c index ef82349e34e..66b4a1de614 100644 --- a/reactos/apps/tests/user32/resource.c +++ b/reactos/apps/tests/user32/resource.c @@ -26,7 +26,7 @@ void test_LoadStringA (void) { HINSTANCE hInst = GetModuleHandle (NULL); - const char str[] = "String resource"; /* same in resource.rc */ + static const char str[] = "String resource"; /* same in resource.rc */ char buf[128]; struct string_test { int bufsiz; diff --git a/reactos/apps/tests/user32/sysparams.c b/reactos/apps/tests/user32/sysparams.c index 21dfa7fcc81..190fec695bd 100644 --- a/reactos/apps/tests/user32/sysparams.c +++ b/reactos/apps/tests/user32/sysparams.c @@ -78,6 +78,16 @@ static int strict; #define SPI_SETSHOWSOUNDS_VALNAME "On" #define SPI_SETDRAGFULLWINDOWS_REGKEY "Control Panel\\Desktop" #define SPI_SETDRAGFULLWINDOWS_VALNAME "DragFullWindows" +#define SPI_SETMOUSEHOVERWIDTH_REGKEY "Control Panel\\Mouse" +#define SPI_SETMOUSEHOVERWIDTH_VALNAME "MouseHoverWidth" +#define SPI_SETMOUSEHOVERHEIGHT_REGKEY "Control Panel\\Mouse" +#define SPI_SETMOUSEHOVERHEIGHT_VALNAME "MouseHoverHeight" +#define SPI_SETMOUSEHOVERTIME_REGKEY "Control Panel\\Mouse" +#define SPI_SETMOUSEHOVERTIME_VALNAME "MouseHoverTime" +#define SPI_SETMOUSESCROLLLINES_REGKEY "Control Panel\\Desktop" +#define SPI_SETMOUSESCROLLLINES_VALNAME "WheelScrollLines" +#define SPI_SETMENUSHOWDELAY_REGKEY "Control Panel\\Desktop" +#define SPI_SETMENUSHOWDELAY_VALNAME "MenuShowDelay" #define SPI_SETDESKWALLPAPER_REGKEY "Control Panel\\Desktop" #define SPI_SETDESKWALLPAPER_VALNAME "Wallpaper" /* FIXME - don't have access to Windows with this action (W95, NT5.0). Set real values */ @@ -1028,6 +1038,200 @@ static void test_SPI_SETSCREENREADER( void ) /* 71 */ /* TODO!!! - don't have version of Windows which has this */ } +static void test_SPI_SETMOUSEHOVERWIDTH( void ) /* 99 */ +{ + BOOL rc; + UINT old_width; + const UINT vals[]={0,32767}; + int i; + + trace("testing SPI_{GET,SET}MOUSEHOVERWIDTH\n"); + rc=SystemParametersInfoA( SPI_GETMOUSEHOVERWIDTH, 0, &old_width, 0 ); + if (rc==0 && (GetLastError()==0 || GetLastError()==ERROR_INVALID_SPI_VALUE)) + { + /* SPI_{GET,SET}MOUSEHOVERWIDTH does not seem to be supported on Win9x despite + * what MSDN states (Verified on Win98SE) + */ + trace("SPI_{GET,SET}MOUSEHOVERWIDTH not supported on this platform\n"); + return; + } + ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError()); + + for (i=0;i<sizeof(vals)/sizeof(*vals);i++) + { + UINT v; + char buf[10]; + + rc=SystemParametersInfoA( SPI_SETMOUSEHOVERWIDTH, vals[i], 0, + SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError()); + test_change_message( SPI_SETMOUSEHOVERWIDTH, 0 ); + sprintf( buf, "%d", vals[i] ); + test_reg_key( SPI_SETMOUSEHOVERWIDTH_REGKEY, + SPI_SETMOUSEHOVERWIDTH_VALNAME, buf ); + + SystemParametersInfoA( SPI_GETMOUSEHOVERWIDTH, 0, &v, 0 ); + ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError()); + eq( v, vals[i], "SPI_{GET,SET}MOUSEHOVERWIDTH", "%d" ); + } + + rc=SystemParametersInfoA( SPI_SETMOUSEHOVERWIDTH, old_width, 0, + SPIF_UPDATEINIFILE ); + ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError()); +} + +static void test_SPI_SETMOUSEHOVERHEIGHT( void ) /* 101 */ +{ + BOOL rc; + UINT old_height; + const UINT vals[]={0,32767}; + int i; + + trace("testing SPI_{GET,SET}MOUSEHOVERHEIGHT\n"); + rc=SystemParametersInfoA( SPI_GETMOUSEHOVERHEIGHT, 0, &old_height, 0 ); + if (rc==0 && (GetLastError()==0 || GetLastError()==ERROR_INVALID_SPI_VALUE)) + { + /* SPI_{GET,SET}MOUSEHOVERWIDTH does not seem to be supported on Win9x despite + * what MSDN states (Verified on Win98SE) + */ + trace("SPI_{GET,SET}MOUSEHOVERHEIGHT not supported on this platform\n"); + return; + } + ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError()); + + for (i=0;i<sizeof(vals)/sizeof(*vals);i++) + { + UINT v; + char buf[10]; + + rc=SystemParametersInfoA( SPI_SETMOUSEHOVERHEIGHT, vals[i], 0, + SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError()); + test_change_message( SPI_SETMOUSEHOVERHEIGHT, 0 ); + sprintf( buf, "%d", vals[i] ); + test_reg_key( SPI_SETMOUSEHOVERHEIGHT_REGKEY, + SPI_SETMOUSEHOVERHEIGHT_VALNAME, buf ); + + SystemParametersInfoA( SPI_GETMOUSEHOVERHEIGHT, 0, &v, 0 ); + ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError()); + eq( v, vals[i], "SPI_{GET,SET}MOUSEHOVERHEIGHT", "%d" ); + } + + rc=SystemParametersInfoA( SPI_SETMOUSEHOVERHEIGHT, old_height, 0, + SPIF_UPDATEINIFILE ); + ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError()); +} + +static void test_SPI_SETMOUSEHOVERTIME( void ) /* 103 */ +{ + BOOL rc; + UINT old_time; + const UINT vals[]={0,32767}; + int i; + + trace("testing SPI_{GET,SET}MOUSEHOVERTIME\n"); + rc=SystemParametersInfoA( SPI_GETMOUSEHOVERTIME, 0, &old_time, 0 ); + if (rc==0 && (GetLastError()==0 || GetLastError()==ERROR_INVALID_SPI_VALUE)) + { + /* SPI_{GET,SET}MOUSEHOVERWIDTH does not seem to be supported on Win9x despite + * what MSDN states (Verified on Win98SE) + */ + trace("SPI_{GET,SET}MOUSEHOVERTIME not supported on this platform\n"); + return; + } + ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError()); + + for (i=0;i<sizeof(vals)/sizeof(*vals);i++) + { + UINT v; + char buf[10]; + + rc=SystemParametersInfoA( SPI_SETMOUSEHOVERTIME, vals[i], 0, + SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError()); + test_change_message( SPI_SETMOUSEHOVERTIME, 0 ); + sprintf( buf, "%d", vals[i] ); + test_reg_key( SPI_SETMOUSEHOVERTIME_REGKEY, + SPI_SETMOUSEHOVERTIME_VALNAME, buf ); + + SystemParametersInfoA( SPI_GETMOUSEHOVERTIME, 0, &v, 0 ); + ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError()); + eq( v, vals[i], "SPI_{GET,SET}MOUSEHOVERTIME", "%d" ); + } + + rc=SystemParametersInfoA( SPI_SETMOUSEHOVERTIME, old_time, 0, + SPIF_UPDATEINIFILE ); + ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError()); +} + +static void test_SPI_SETWHEELSCROLLLINES( void ) /* 105 */ +{ + BOOL rc; + UINT old_lines; + const UINT vals[]={0,32767}; + int i; + + trace("testing SPI_{GET,SET}WHEELSCROLLLINES\n"); + rc=SystemParametersInfoA( SPI_GETWHEELSCROLLLINES, 0, &old_lines, 0 ); + ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError()); + + for (i=0;i<sizeof(vals)/sizeof(*vals);i++) + { + UINT v; + char buf[10]; + + rc=SystemParametersInfoA( SPI_SETWHEELSCROLLLINES, vals[i], 0, + SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError()); + test_change_message( SPI_SETWHEELSCROLLLINES, 0 ); + sprintf( buf, "%d", vals[i] ); + test_reg_key( SPI_SETMOUSESCROLLLINES_REGKEY, + SPI_SETMOUSESCROLLLINES_VALNAME, buf ); + + SystemParametersInfoA( SPI_GETWHEELSCROLLLINES, 0, &v, 0 ); + ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError()); + eq( v, vals[i], "SPI_{GET,SET}MOUSESCROLLLINES", "%d" ); + } + + rc=SystemParametersInfoA( SPI_SETWHEELSCROLLLINES, old_lines, 0, + SPIF_UPDATEINIFILE ); + ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError()); +} + +static void test_SPI_SETMENUSHOWDELAY( void ) /* 107 */ +{ + BOOL rc; + UINT old_delay; + const UINT vals[]={0,32767}; + int i; + + trace("testing SPI_{GET,SET}MENUSHOWDELAY\n"); + rc=SystemParametersInfoA( SPI_GETMENUSHOWDELAY, 0, &old_delay, 0 ); + ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError()); + + for (i=0;i<sizeof(vals)/sizeof(*vals);i++) + { + UINT v; + char buf[10]; + + rc=SystemParametersInfoA( SPI_SETMENUSHOWDELAY, vals[i], 0, + SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError()); + test_change_message( SPI_SETMENUSHOWDELAY, 0 ); + sprintf( buf, "%d", vals[i] ); + test_reg_key( SPI_SETMENUSHOWDELAY_REGKEY, + SPI_SETMENUSHOWDELAY_VALNAME, buf ); + + SystemParametersInfoA( SPI_GETMENUSHOWDELAY, 0, &v, 0 ); + ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError()); + eq( v, vals[i], "SPI_{GET,SET}MENUSHOWDELAY", "%d" ); + } + + rc=SystemParametersInfoA( SPI_SETMENUSHOWDELAY, old_delay, 0, + SPIF_UPDATEINIFILE ); + ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError()); +} + static void test_SPI_SETWALLPAPER( void ) /* 115 */ { BOOL rc; @@ -1088,6 +1292,11 @@ static DWORD WINAPI SysParamsThreadFunc( LPVOID lpParam ) test_SPI_SETSHOWSOUNDS(); /* 57 */ test_SPI_SETKEYBOARDPREF(); /* 69 */ test_SPI_SETSCREENREADER(); /* 71 */ + test_SPI_SETMOUSEHOVERWIDTH(); /* 99 */ + test_SPI_SETMOUSEHOVERHEIGHT(); /* 101 */ + test_SPI_SETMOUSEHOVERTIME(); /* 103 */ + test_SPI_SETWHEELSCROLLLINES(); /* 105 */ + test_SPI_SETMENUSHOWDELAY(); /* 107 */ test_SPI_SETWALLPAPER(); /* 115 */ SendMessageA( ghTestWnd, WM_DESTROY, 0, 0 ); return 0; diff --git a/reactos/apps/tests/user32/testlist.c b/reactos/apps/tests/user32/testlist.c index 677dd6907be..7703f6db340 100644 --- a/reactos/apps/tests/user32/testlist.c +++ b/reactos/apps/tests/user32/testlist.c @@ -7,7 +7,9 @@ #include "winbase.h" extern void func_class(void); +extern void func_dde(void); extern void func_dialog(void); +//extern void func_input(void); extern void func_listbox(void); extern void func_msg(void); extern void func_resource(void); @@ -24,7 +26,9 @@ struct test static const struct test winetest_testlist[] = { { "class", func_class }, + { "dde", func_dde }, { "dialog", func_dialog }, + //{ "input", func_input }, { "listbox", func_listbox }, { "msg", func_msg }, { "resource", func_resource }, diff --git a/reactos/apps/tests/user32/win.c b/reactos/apps/tests/user32/win.c index 1ee400d6da5..641e3fcadf3 100644 --- a/reactos/apps/tests/user32/win.c +++ b/reactos/apps/tests/user32/win.c @@ -43,7 +43,9 @@ #define ULONG_PTR UINT_PTR static HWND (WINAPI *pGetAncestor)(HWND,UINT); +static BOOL (WINAPI *pGetWindowInfo)(HWND,WINDOWINFO*); +static HWND hwndMessage; static HWND hwndMain, hwndMain2; static HHOOK hhook; @@ -443,6 +445,41 @@ static LRESULT WINAPI main_window_procA(HWND hwnd, UINT msg, WPARAM wparam, LPAR SetWindowLongA(hwnd, GWL_USERDATA, 0x20031021); break; } + case WM_WINDOWPOSCHANGING: + { + BOOL is_win9x = GetWindowLongW(hwnd, GWL_WNDPROC) == 0; + WINDOWPOS *winpos = (WINDOWPOS *)lparam; + trace("main: WM_WINDOWPOSCHANGING\n"); + trace("%p after %p, x %d, y %d, cx %d, cy %d flags %08x\n", + winpos->hwnd, winpos->hwndInsertAfter, + winpos->x, winpos->y, winpos->cx, winpos->cy, winpos->flags); + if (!(winpos->flags & SWP_NOMOVE)) + { + ok(winpos->x >= -32768 && winpos->x <= 32767, "bad winpos->x %d\n", winpos->x); + ok(winpos->y >= -32768 && winpos->y <= 32767, "bad winpos->y %d\n", winpos->y); + } + /* Win9x does not fixup cx/xy for WM_WINDOWPOSCHANGING */ + if (!(winpos->flags & SWP_NOSIZE) && !is_win9x) + { + ok(winpos->cx >= 0 && winpos->cx <= 32767, "bad winpos->cx %d\n", winpos->cx); + ok(winpos->cy >= 0 && winpos->cy <= 32767, "bad winpos->cy %d\n", winpos->cy); + } + break; + } + case WM_WINDOWPOSCHANGED: + { + WINDOWPOS *winpos = (WINDOWPOS *)lparam; + trace("main: WM_WINDOWPOSCHANGED\n"); + trace("%p after %p, x %d, y %d, cx %d, cy %d flags %08x\n", + winpos->hwnd, winpos->hwndInsertAfter, + winpos->x, winpos->y, winpos->cx, winpos->cy, winpos->flags); + ok(winpos->x >= -32768 && winpos->x <= 32767, "bad winpos->x %d\n", winpos->x); + ok(winpos->y >= -32768 && winpos->y <= 32767, "bad winpos->y %d\n", winpos->y); + + ok(winpos->cx >= 0 && winpos->cx <= 32767, "bad winpos->cx %d\n", winpos->cx); + ok(winpos->cy >= 0 && winpos->cy <= 32767, "bad winpos->cy %d\n", winpos->cy); + break; + } case WM_NCCREATE: { BOOL got_getminmaxinfo = GetWindowLongA(hwnd, GWL_USERDATA) == 0x20031021; @@ -535,6 +572,43 @@ static BOOL RegisterWindowClasses(void) return TRUE; } +static void verify_window_info(HWND hwnd, const WINDOWINFO *info, BOOL test_borders) +{ + RECT rcWindow, rcClient; + INT border; + DWORD status; + + ok(IsWindow(hwnd), "bad window handle\n"); + + GetWindowRect(hwnd, &rcWindow); + ok(EqualRect(&rcWindow, &info->rcWindow), "wrong rcWindow\n"); + + GetClientRect(hwnd, &rcClient); + /* translate to screen coordinates */ + MapWindowPoints(hwnd, 0, (LPPOINT)&rcClient, 2); + ok(EqualRect(&rcClient, &info->rcClient), "wrong rcClient\n"); + + ok(info->dwStyle == GetWindowLongA(hwnd, GWL_STYLE), "wrong dwStyle\n"); + ok(info->dwExStyle == GetWindowLongA(hwnd, GWL_EXSTYLE), "wrong dwExStyle\n"); + status = (GetActiveWindow() == hwnd) ? WS_ACTIVECAPTION : 0; + ok(info->dwWindowStatus == status, "wrong dwWindowStatus\n"); + + if (test_borders && !IsRectEmpty(&rcWindow)) + { + trace("rcWindow: %ld,%ld - %ld,%ld\n", rcWindow.left, rcWindow.top, rcWindow.right, rcWindow.bottom); + trace("rcClient: %ld,%ld - %ld,%ld\n", rcClient.left, rcClient.top, rcClient.right, rcClient.bottom); + + ok(info->cxWindowBorders == rcClient.left - rcWindow.left, + "wrong cxWindowBorders %d != %ld\n", info->cxWindowBorders, rcClient.left - rcWindow.left); + border = min(rcWindow.bottom - rcClient.bottom, rcClient.top - rcWindow.top); + ok(info->cyWindowBorders == border, + "wrong cyWindowBorders %d != %d\n", info->cyWindowBorders, border); + } + + ok(info->atomWindowType == GetClassLongA(hwnd, GCW_ATOM), "wrong atomWindowType\n"); + ok(info->wCreatorVersion == 0x0400, "wrong wCreatorVersion %04x\n", info->wCreatorVersion); +} + static LRESULT CALLBACK cbt_hook_proc(int nCode, WPARAM wParam, LPARAM lParam) { static const char *CBT_code_name[10] = { @@ -556,7 +630,11 @@ static LRESULT CALLBACK cbt_hook_proc(int nCode, WPARAM wParam, LPARAM lParam) { case HCBT_CREATEWND: { - DWORD style; +#if 0 /* Uncomment this once the test succeeds in all cases */ + static const RECT rc_null; + RECT rc; +#endif + LONG style; CBT_CREATEWNDA *createwnd = (CBT_CREATEWNDA *)lParam; trace("HCBT_CREATEWND: hwnd %p, parent %p, style %08lx\n", (HWND)wParam, createwnd->lpcs->hwndParent, createwnd->lpcs->style); @@ -567,8 +645,69 @@ static LRESULT CALLBACK cbt_hook_proc(int nCode, WPARAM wParam, LPARAM lParam) ok(style == GetWindowLongA((HWND)wParam, GWL_STYLE), "style of hwnd and style in the CREATESTRUCT do not match: %08lx != %08lx\n", GetWindowLongA((HWND)wParam, GWL_STYLE), style); + +#if 0 /* Uncomment this once the test succeeds in all cases */ + if ((style & (WS_CHILD|WS_POPUP)) == WS_CHILD) + { + ok(GetParent((HWND)wParam) == hwndMessage, + "wrong result from GetParent %p: message window %p\n", + GetParent((HWND)wParam), hwndMessage); + } + else + ok(!GetParent((HWND)wParam), "GetParent should return 0 at this point\n"); + + ok(!GetWindow((HWND)wParam, GW_OWNER), "GW_OWNER should be set to 0 at this point\n"); +#endif +#if 0 /* while NT assigns GW_HWNDFIRST/LAST some values at this point, + * Win9x still has them set to 0. + */ + ok(GetWindow((HWND)wParam, GW_HWNDFIRST) != 0, "GW_HWNDFIRST should not be set to 0 at this point\n"); + ok(GetWindow((HWND)wParam, GW_HWNDLAST) != 0, "GW_HWNDLAST should not be set to 0 at this point\n"); +#endif + ok(!GetWindow((HWND)wParam, GW_HWNDPREV), "GW_HWNDPREV should be set to 0 at this point\n"); + ok(!GetWindow((HWND)wParam, GW_HWNDNEXT), "GW_HWNDNEXT should be set to 0 at this point\n"); + +#if 0 /* Uncomment this once the test succeeds in all cases */ + if (pGetAncestor) + { + ok(pGetAncestor((HWND)wParam, GA_PARENT) == hwndMessage, "GA_PARENT should be set to hwndMessage at this point\n"); + ok(pGetAncestor((HWND)wParam, GA_ROOT) == (HWND)wParam, + "GA_ROOT is set to %p, expected %p\n", pGetAncestor((HWND)wParam, GA_ROOT), (HWND)wParam); + + if ((style & (WS_CHILD|WS_POPUP)) == WS_CHILD) + ok(pGetAncestor((HWND)wParam, GA_ROOTOWNER) == hwndMessage, + "GA_ROOTOWNER should be set to hwndMessage at this point\n"); + else + ok(pGetAncestor((HWND)wParam, GA_ROOTOWNER) == (HWND)wParam, + "GA_ROOTOWNER is set to %p, expected %p\n", pGetAncestor((HWND)wParam, GA_ROOTOWNER), (HWND)wParam); + } + + ok(GetWindowRect((HWND)wParam, &rc), "GetWindowRect failed\n"); + ok(EqualRect(&rc, &rc_null), "window rect should be set to 0 HCBT_CREATEWND\n"); + ok(GetClientRect((HWND)wParam, &rc), "GetClientRect failed\n"); + ok(EqualRect(&rc, &rc_null), "client rect should be set to 0 on HCBT_CREATEWND\n"); +#endif break; } + + case HCBT_DESTROYWND: + case HCBT_SETFOCUS: + if (wParam && pGetWindowInfo) + { + WINDOWINFO info; + + info.cbSize = 0; + ok(pGetWindowInfo((HWND)wParam, &info), "GetWindowInfo should not fail\n"); + /* win2k SP4 returns broken border info if GetWindowInfo + * is being called from HCBT_DESTROYWND hook proc. + */ + verify_window_info((HWND)wParam, &info, nCode != HCBT_DESTROYWND); + + info.cbSize = sizeof(WINDOWINFO) + 1; + ok(pGetWindowInfo((HWND)wParam, &info), "GetWindowInfo should not fail\n"); + verify_window_info((HWND)wParam, &info, nCode != HCBT_DESTROYWND); + } + break; } return CallNextHookEx(hhook, nCode, wParam, lParam); @@ -878,6 +1017,62 @@ static void test_MDI_create(HWND parent, HWND mdi_client) (LPVOID)mdi_lParam_test_message); ok(mdi_child != 0, "MDI child creation failed\n"); DestroyWindow(mdi_child); + + /* maximized child */ + mdi_child = CreateWindowExA(0, "MDI_child_Class_2", "MDI child", + WS_CHILD | WS_MAXIMIZE, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + mdi_client, 0, GetModuleHandle(0), + (LPVOID)mdi_lParam_test_message); + ok(mdi_child != 0, "MDI child creation failed\n"); + DestroyWindow(mdi_child); + + trace("Creating maximized child with a caption\n"); + mdi_child = CreateWindowExA(0, "MDI_child_Class_2", "MDI child", + WS_CHILD | WS_MAXIMIZE | WS_CAPTION, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + mdi_client, 0, GetModuleHandle(0), + (LPVOID)mdi_lParam_test_message); + ok(mdi_child != 0, "MDI child creation failed\n"); + DestroyWindow(mdi_child); + + trace("Creating maximized child with a caption and a thick frame\n"); + mdi_child = CreateWindowExA(0, "MDI_child_Class_2", "MDI child", + WS_CHILD | WS_MAXIMIZE | WS_CAPTION | WS_THICKFRAME, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + mdi_client, 0, GetModuleHandle(0), + (LPVOID)mdi_lParam_test_message); + ok(mdi_child != 0, "MDI child creation failed\n"); + DestroyWindow(mdi_child); +} + +/********************************************************************** + * MDI_ChildGetMinMaxInfo (copied from windows/mdi.c) + * + * Note: The rule here is that client rect of the maximized MDI child + * is equal to the client rect of the MDI client window. + */ +static void MDI_ChildGetMinMaxInfo( HWND client, HWND hwnd, MINMAXINFO* lpMinMax ) +{ + RECT rect; + + GetClientRect( client, &rect ); + AdjustWindowRectEx( &rect, GetWindowLongA( hwnd, GWL_STYLE ), + 0, GetWindowLongA( hwnd, GWL_EXSTYLE )); + + rect.right -= rect.left; + rect.bottom -= rect.top; + lpMinMax->ptMaxSize.x = rect.right; + lpMinMax->ptMaxSize.y = rect.bottom; + + lpMinMax->ptMaxPosition.x = rect.left; + lpMinMax->ptMaxPosition.y = rect.top; + + trace("max rect (%ld,%ld - %ld, %ld)\n", + rect.left, rect.top, rect.right, rect.bottom); } static LRESULT WINAPI mdi_child_wnd_proc_1(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) @@ -919,12 +1114,13 @@ static LRESULT WINAPI mdi_child_wnd_proc_1(HWND hwnd, UINT msg, WPARAM wparam, L if (GetWindowLongA(cs->hwndParent, GWL_STYLE) & MDIS_ALLCHILDSTYLES) { - ok(cs->style == (mdi_cs->style | WS_CHILD | WS_CLIPSIBLINGS), + LONG style = mdi_cs->style | WS_CHILD | WS_CLIPSIBLINGS; + ok(cs->style == style, "cs->style does not match (%08lx)\n", cs->style); } else { - DWORD style = mdi_cs->style; + LONG style = mdi_cs->style; style &= ~WS_POPUP; style |= WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX; @@ -933,6 +1129,69 @@ static LRESULT WINAPI mdi_child_wnd_proc_1(HWND hwnd, UINT msg, WPARAM wparam, L } break; } + + case WM_GETMINMAXINFO: + { + HWND client = GetParent(hwnd); + RECT rc; + MINMAXINFO *minmax = (MINMAXINFO *)lparam; + MINMAXINFO my_minmax; + LONG style, exstyle; + + style = GetWindowLongA(hwnd, GWL_STYLE); + exstyle = GetWindowLongA(hwnd, GWL_EXSTYLE); + + GetWindowRect(client, &rc); + trace("MDI client %p window size = (%ld x %ld)\n", client, rc.right-rc.left, rc.bottom-rc.top); + GetClientRect(client, &rc); + trace("MDI client %p client size = (%ld x %ld)\n", client, rc.right, rc.bottom); + trace("screen size: %d x %d\n", GetSystemMetrics(SM_CXSCREEN), + GetSystemMetrics(SM_CYSCREEN)); + + GetClientRect(client, &rc); + if ((style & WS_CAPTION) == WS_CAPTION) + style &= ~WS_BORDER; /* WS_CAPTION = WS_DLGFRAME | WS_BORDER */ + AdjustWindowRectEx(&rc, style, 0, exstyle); + trace("MDI child: calculated max window size = (%ld x %ld)\n", rc.right-rc.left, rc.bottom-rc.top); + + trace("ptReserved = (%ld,%ld)\n" + "ptMaxSize = (%ld,%ld)\n" + "ptMaxPosition = (%ld,%ld)\n" + "ptMinTrackSize = (%ld,%ld)\n" + "ptMaxTrackSize = (%ld,%ld)\n", + minmax->ptReserved.x, minmax->ptReserved.y, + minmax->ptMaxSize.x, minmax->ptMaxSize.y, + minmax->ptMaxPosition.x, minmax->ptMaxPosition.y, + minmax->ptMinTrackSize.x, minmax->ptMinTrackSize.y, + minmax->ptMaxTrackSize.x, minmax->ptMaxTrackSize.y); + + ok(minmax->ptMaxSize.x == rc.right - rc.left, "default width of maximized child %ld != %ld\n", + minmax->ptMaxSize.x, rc.right - rc.left); + ok(minmax->ptMaxSize.y == rc.bottom - rc.top, "default height of maximized child %ld != %ld\n", + minmax->ptMaxSize.y, rc.bottom - rc.top); + + DefMDIChildProcA(hwnd, msg, wparam, lparam); + + trace("DefMDIChildProc returned:\n" + "ptReserved = (%ld,%ld)\n" + "ptMaxSize = (%ld,%ld)\n" + "ptMaxPosition = (%ld,%ld)\n" + "ptMinTrackSize = (%ld,%ld)\n" + "ptMaxTrackSize = (%ld,%ld)\n", + minmax->ptReserved.x, minmax->ptReserved.y, + minmax->ptMaxSize.x, minmax->ptMaxSize.y, + minmax->ptMaxPosition.x, minmax->ptMaxPosition.y, + minmax->ptMinTrackSize.x, minmax->ptMinTrackSize.y, + minmax->ptMaxTrackSize.x, minmax->ptMaxTrackSize.y); + + MDI_ChildGetMinMaxInfo(client, hwnd, &my_minmax); + ok(minmax->ptMaxSize.x == my_minmax.ptMaxSize.x, "default width of maximized child %ld != %ld\n", + minmax->ptMaxSize.x, my_minmax.ptMaxSize.x); + ok(minmax->ptMaxSize.y == my_minmax.ptMaxSize.y, "default height of maximized child %ld != %ld\n", + minmax->ptMaxSize.y, my_minmax.ptMaxSize.y); + + return 1; + } } return DefMDIChildProcA(hwnd, msg, wparam, lparam); } @@ -946,6 +1205,9 @@ static LRESULT WINAPI mdi_child_wnd_proc_2(HWND hwnd, UINT msg, WPARAM wparam, L { CREATESTRUCTA *cs = (CREATESTRUCTA *)lparam; + trace("%s\n", (msg == WM_NCCREATE) ? "WM_NCCREATE" : "WM_CREATE"); + trace("x %d, y %d, cx %d, cy %d\n", cs->x, cs->y, cs->cx, cs->cy); + ok(!(cs->dwExStyle & WS_EX_MDICHILD), "WS_EX_MDICHILD should not be set\n"); ok(cs->lpCreateParams == mdi_lParam_test_message, "wrong cs->lpCreateParams\n"); @@ -963,6 +1225,68 @@ static LRESULT WINAPI mdi_child_wnd_proc_2(HWND hwnd, UINT msg, WPARAM wparam, L ok(cs->cy == 0, "%d != 0\n", cs->cy); break; } + + case WM_GETMINMAXINFO: + { + HWND parent = GetParent(hwnd); + RECT rc; + MINMAXINFO *minmax = (MINMAXINFO *)lparam; + LONG style, exstyle; + + trace("WM_GETMINMAXINFO\n"); + + style = GetWindowLongA(hwnd, GWL_STYLE); + exstyle = GetWindowLongA(hwnd, GWL_EXSTYLE); + + GetClientRect(parent, &rc); + trace("parent %p client size = (%ld x %ld)\n", parent, rc.right, rc.bottom); + + GetClientRect(parent, &rc); + if ((style & WS_CAPTION) == WS_CAPTION) + style &= ~WS_BORDER; /* WS_CAPTION = WS_DLGFRAME | WS_BORDER */ + AdjustWindowRectEx(&rc, style, 0, exstyle); + trace("calculated max child window size = (%ld x %ld)\n", rc.right-rc.left, rc.bottom-rc.top); + + trace("ptReserved = (%ld,%ld)\n" + "ptMaxSize = (%ld,%ld)\n" + "ptMaxPosition = (%ld,%ld)\n" + "ptMinTrackSize = (%ld,%ld)\n" + "ptMaxTrackSize = (%ld,%ld)\n", + minmax->ptReserved.x, minmax->ptReserved.y, + minmax->ptMaxSize.x, minmax->ptMaxSize.y, + minmax->ptMaxPosition.x, minmax->ptMaxPosition.y, + minmax->ptMinTrackSize.x, minmax->ptMinTrackSize.y, + minmax->ptMaxTrackSize.x, minmax->ptMaxTrackSize.y); + + ok(minmax->ptMaxSize.x == rc.right - rc.left, "default width of maximized child %ld != %ld\n", + minmax->ptMaxSize.x, rc.right - rc.left); + ok(minmax->ptMaxSize.y == rc.bottom - rc.top, "default height of maximized child %ld != %ld\n", + minmax->ptMaxSize.y, rc.bottom - rc.top); + break; + } + + case WM_WINDOWPOSCHANGING: + case WM_WINDOWPOSCHANGED: + { + WINDOWPOS *winpos = (WINDOWPOS *)lparam; + WINDOWPOS my_winpos = *winpos; + + trace("%s\n", (msg == WM_WINDOWPOSCHANGING) ? "WM_WINDOWPOSCHANGING" : "WM_WINDOWPOSCHANGED"); + trace("%p after %p, x %d, y %d, cx %d, cy %d flags %08x\n", + winpos->hwnd, winpos->hwndInsertAfter, + winpos->x, winpos->y, winpos->cx, winpos->cy, winpos->flags); + + DefWindowProcA(hwnd, msg, wparam, lparam); + + trace("%p after %p, x %d, y %d, cx %d, cy %d flags %08x\n", + winpos->hwnd, winpos->hwndInsertAfter, + winpos->x, winpos->y, winpos->cx, winpos->cy, winpos->flags); + + ok(!memcmp(&my_winpos, winpos, sizeof(WINDOWPOS)), + "DefWindowProc should not change WINDOWPOS values\n"); + + return 1; + } } return DefWindowProcA(hwnd, msg, wparam, lparam); } @@ -1131,9 +1455,214 @@ static void test_icons(void) ok( res == icon2, "wrong big icon after set %p/%p\n", res, icon2 ); } +static void test_SetWindowPos(HWND hwnd) +{ + SetWindowPos(hwnd, 0, -32769, -40000, -32769, -90000, SWP_NOMOVE); + SetWindowPos(hwnd, 0, 32768, 40000, 32768, 40000, SWP_NOMOVE); + + SetWindowPos(hwnd, 0, -32769, -40000, -32769, -90000, SWP_NOSIZE); + SetWindowPos(hwnd, 0, 32768, 40000, 32768, 40000, SWP_NOSIZE); +} + +static void test_SetMenu(HWND parent) +{ + HWND child; + HMENU hMenu, ret; + + hMenu = CreateMenu(); + assert(hMenu); + + /* parent */ + ret = GetMenu(parent); + ok(ret == 0, "unexpected menu id %p\n", ret); + + ok(!SetMenu(parent, (HMENU)20), "SetMenu with invalid menu handle should fail\n"); + ret = GetMenu(parent); + ok(ret == 0, "unexpected menu id %p\n", ret); + + ok(SetMenu(parent, hMenu), "SetMenu on a top level window should not fail\n"); + ret = GetMenu(parent); + ok(ret == (HMENU)hMenu, "unexpected menu id %p\n", ret); + + ok(SetMenu(parent, 0), "SetMenu(0) on a top level window should not fail\n"); + ret = GetMenu(parent); + ok(ret == 0, "unexpected menu id %p\n", ret); + + /* child */ + child = CreateWindowExA(0, "static", NULL, WS_CHILD, 0, 0, 0, 0, parent, (HMENU)10, 0, NULL); + assert(child); + + ret = GetMenu(child); + ok(ret == (HMENU)10, "unexpected menu id %p\n", ret); + + ok(!SetMenu(child, (HMENU)20), "SetMenu with invalid menu handle should fail\n"); + ret = GetMenu(child); + ok(ret == (HMENU)10, "unexpected menu id %p\n", ret); + + ok(!SetMenu(child, hMenu), "SetMenu on a child window should fail\n"); + ret = GetMenu(child); + ok(ret == (HMENU)10, "unexpected menu id %p\n", ret); + + ok(!SetMenu(child, 0), "SetMenu(0) on a child window should fail\n"); + ret = GetMenu(child); + ok(ret == (HMENU)10, "unexpected menu id %p\n", ret); + + DestroyWindow(child); + DestroyMenu(hMenu); +} + +static void test_window_tree(HWND parent, const DWORD *style, const int *order, int total) +{ + HWND child[5], hwnd; + int i; + + assert(total <= 5); + + hwnd = GetWindow(parent, GW_CHILD); + ok(!hwnd, "have to start without children to perform the test\n"); + + for (i = 0; i < total; i++) + { + child[i] = CreateWindowExA(0, "static", "", style[i], 0,0,10,10, + parent, 0, 0, NULL); + trace("child[%d] = %p\n", i, child[i]); + ok(child[i] != 0, "CreateWindowEx failed to create child window\n"); + } + + hwnd = GetWindow(parent, GW_CHILD); + ok(hwnd != 0, "GetWindow(GW_CHILD) failed\n"); + ok(hwnd == GetWindow(child[total - 1], GW_HWNDFIRST), "GW_HWNDFIRST is wrong\n"); + ok(child[order[total - 1]] == GetWindow(child[0], GW_HWNDLAST), "GW_HWNDLAST is wrong\n"); + + for (i = 0; i < total; i++) + { + trace("hwnd[%d] = %p\n", i, hwnd); + ok(child[order[i]] == hwnd, "Z order of child #%d is wrong\n", i); + + hwnd = GetWindow(hwnd, GW_HWNDNEXT); + } + + for (i = 0; i < total; i++) + ok(DestroyWindow(child[i]), "DestroyWindow failed\n"); +} + +static void test_children_zorder(HWND parent) +{ + const DWORD simple_style[5] = { WS_CHILD, WS_CHILD, WS_CHILD, WS_CHILD, + WS_CHILD }; + const int simple_order[5] = { 0, 1, 2, 3, 4 }; + + const DWORD complex_style[5] = { WS_CHILD, WS_CHILD | WS_MAXIMIZE, + WS_CHILD | WS_VISIBLE, WS_CHILD, + WS_CHILD | WS_MAXIMIZE | WS_VISIBLE }; + const int complex_order_1[1] = { 0 }; + const int complex_order_2[2] = { 1, 0 }; + const int complex_order_3[3] = { 1, 0, 2 }; + const int complex_order_4[4] = { 1, 0, 2, 3 }; + const int complex_order_5[5] = { 4, 1, 0, 2, 3 }; + + /* simple WS_CHILD */ + test_window_tree(parent, simple_style, simple_order, 5); + + /* complex children styles */ + test_window_tree(parent, complex_style, complex_order_1, 1); + test_window_tree(parent, complex_style, complex_order_2, 2); + test_window_tree(parent, complex_style, complex_order_3, 3); + test_window_tree(parent, complex_style, complex_order_4, 4); + test_window_tree(parent, complex_style, complex_order_5, 5); +} + +static void test_SetFocus(HWND hwnd) +{ + HWND child; + + /* check if we can set focus to non-visible windows */ + + ShowWindow(hwnd, SW_SHOW); + SetFocus(0); + SetFocus(hwnd); + ok( GetFocus() == hwnd, "Failed to set focus to visible window %p\n", hwnd ); + ok( GetWindowLong(hwnd,GWL_STYLE) & WS_VISIBLE, "Window %p not visible\n", hwnd ); + ShowWindow(hwnd, SW_HIDE); + SetFocus(0); + SetFocus(hwnd); + ok( GetFocus() == hwnd, "Failed to set focus to invisible window %p\n", hwnd ); + ok( !(GetWindowLong(hwnd,GWL_STYLE) & WS_VISIBLE), "Window %p still visible\n", hwnd ); + child = CreateWindowExA(0, "static", NULL, WS_CHILD, 0, 0, 0, 0, hwnd, 0, 0, NULL); + assert(child); + SetFocus(child); + ok( GetFocus() == child, "Failed to set focus to invisible child %p\n", child ); + ok( !(GetWindowLong(child,GWL_STYLE) & WS_VISIBLE), "Child %p is visible\n", child ); + ShowWindow(child, SW_SHOW); + ok( GetWindowLong(child,GWL_STYLE) & WS_VISIBLE, "Child %p is not visible\n", child ); + ok( GetFocus() == child, "Focus no longer on child %p\n", child ); + ShowWindow(child, SW_HIDE); + ok( !(GetWindowLong(child,GWL_STYLE) & WS_VISIBLE), "Child %p is visible\n", child ); + ok( GetFocus() == hwnd, "Focus should be on parent %p, not %p\n", hwnd, GetFocus() ); + ShowWindow(child, SW_SHOW); + SetFocus(child); + ok( GetFocus() == child, "Focus should be on child %p\n", child ); + SetWindowPos(child,0,0,0,0,0,SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_HIDEWINDOW); + ok( GetFocus() == child, "Focus should still be on child %p\n", child ); + + ShowWindow(child, SW_HIDE); + SetFocus(hwnd); + ok( GetFocus() == hwnd, "Focus should be on parent %p, not %p\n", hwnd, GetFocus() ); + SetWindowPos(child,0,0,0,0,0,SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW); + ok( GetFocus() == hwnd, "Focus should still be on parent %p, not %p\n", hwnd, GetFocus() ); + ShowWindow(child, SW_HIDE); + ok( GetFocus() == hwnd, "Focus should still be on parent %p, not %p\n", hwnd, GetFocus() ); + + DestroyWindow( child ); +} + +static void test_SetActiveWindow(HWND hwnd) +{ + HWND hwnd2; + + ShowWindow(hwnd, SW_SHOW); + SetActiveWindow(0); + SetActiveWindow(hwnd); + ok( GetActiveWindow() == hwnd, "Failed to set focus to visible window %p\n", hwnd ); + SetWindowPos(hwnd,0,0,0,0,0,SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|SWP_HIDEWINDOW); + ok( GetActiveWindow() == hwnd, "Window %p no longer active\n", hwnd ); + SetWindowPos(hwnd,0,0,0,0,0,SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|SWP_SHOWWINDOW); + ShowWindow(hwnd, SW_HIDE); + ok( GetActiveWindow() != hwnd, "Window %p is still active\n", hwnd ); + ShowWindow(hwnd, SW_SHOW); + + hwnd2 = CreateWindowExA(0, "static", NULL, WS_POPUP|WS_VISIBLE, 0, 0, 0, 0, hwnd, 0, 0, NULL); + ok( GetActiveWindow() == hwnd2, "Window %p is not active\n", hwnd2 ); + DestroyWindow(hwnd2); + ok( GetActiveWindow() != hwnd2, "Window %p is still active\n", hwnd2 ); + + hwnd2 = CreateWindowExA(0, "static", NULL, WS_POPUP|WS_VISIBLE, 0, 0, 0, 0, hwnd, 0, 0, NULL); + ok( GetActiveWindow() == hwnd2, "Window %p is not active\n", hwnd2 ); + SetWindowPos(hwnd2,0,0,0,0,0,SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|SWP_HIDEWINDOW); + ok( GetActiveWindow() == hwnd2, "Window %p no longer active (%p)\n", hwnd2, GetActiveWindow() ); + DestroyWindow(hwnd2); + ok( GetActiveWindow() != hwnd2, "Window %p is still active\n", hwnd2 ); +} + START_TEST(win) { pGetAncestor = (void *)GetProcAddress( GetModuleHandleA("user32.dll"), "GetAncestor" ); + pGetWindowInfo = (void *)GetProcAddress( GetModuleHandleA("user32.dll"), "GetWindowInfo" ); + + hwndMain = CreateWindowExA(0, "static", NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, 0, 0, NULL); + if (hwndMain) + { + ok(!GetParent(hwndMain), "GetParent should return 0 for message only windows\n"); + if (pGetAncestor) + { + hwndMessage = pGetAncestor(hwndMain, GA_PARENT); + ok(hwndMessage != 0, "GetAncestor(GA_PARENT) should not return 0 for message only windows\n"); + trace("hwndMessage %p\n", hwndMessage); + } + DestroyWindow(hwndMain); + } + else + trace("CreateWindowExA with parent HWND_MESSAGE failed\n"); if (!RegisterWindowClasses()) assert(0); @@ -1158,6 +1687,12 @@ START_TEST(win) test_mdi(); test_icons(); + test_SetWindowPos(hwndMain); + test_SetMenu(hwndMain); + test_SetFocus(hwndMain); + test_SetActiveWindow(hwndMain); + + test_children_zorder(hwndMain); UnhookWindowsHookEx(hhook); } From 26beb80a117e4f428916580afeb5bce076be2557 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Fri, 28 May 2004 18:16:46 +0000 Subject: [PATCH 1245/1463] Add rule for generating .i (preprocessed) files from .c files svn path=/trunk/; revision=9517 --- reactos/tools/helper.mk | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/tools/helper.mk b/reactos/tools/helper.mk index 97cee87489b..1abf61ced50 100644 --- a/reactos/tools/helper.mk +++ b/reactos/tools/helper.mk @@ -1,4 +1,4 @@ -# $Id: helper.mk,v 1.62 2004/05/17 19:45:10 gvg Exp $ +# $Id: helper.mk,v 1.63 2004/05/28 18:16:46 gvg Exp $ # # Helper makefile for ReactOS modules # Variables this makefile accepts: @@ -1064,6 +1064,8 @@ endif # ROS_USE_PCH $(WINEBUILD) $(DEFS) -o $@ --def $< %.drv.spec.def: %.spec $(WINEBUILD) $(DEFS) -o $@ --def $< +%.i: %.c + $(CC) $(TARGET_CFLAGS) -E $< > $@ # Kill implicit rule .o:; From 663c447ca685faa8ec0f5773b8332087d3785956 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Fri, 28 May 2004 18:18:43 +0000 Subject: [PATCH 1246/1463] cleanup of the SDK and disable use of the old WINE tree. Travis Snoozy <ai2097@yahoo.com> svn path=/trunk/; revision=9518 --- reactos/dk/w32/Makefile | 116 ++++++++++++++++++++-------------------- 1 file changed, 59 insertions(+), 57 deletions(-) diff --git a/reactos/dk/w32/Makefile b/reactos/dk/w32/Makefile index 6ae0c71cdba..74f88df5d85 100644 --- a/reactos/dk/w32/Makefile +++ b/reactos/dk/w32/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.8 2004/04/26 20:19:21 gdalsnes Exp $ +# $Id: Makefile,v 1.9 2004/05/28 18:18:43 sedwards Exp $ # # PROJECT : ReactOS Operating System # FILE : reactos/dk/w32/Makefile @@ -59,7 +59,6 @@ MODULES_MISC=\ $(TARGET_FOLDER_LIB)/winmm.a MODULES_WINE=\ - $(TARGET_FOLDER_LIB)/libwine.a\ $(TARGET_FOLDER_LIB)/rpcrt4.a\ $(TARGET_FOLDER_LIB)/shlwapi.a\ $(TARGET_FOLDER_LIB)/ole32.a\ @@ -68,6 +67,9 @@ MODULES_WINE=\ $(TARGET_FOLDER_LIB)/wininet.a\ $(TARGET_FOLDER_LIB)/wine_unicode.a +# $(TARGET_FOLDER_LIB)/libwine.a + + MODULES_CONTRIB=\ $(TARGET_FOLDER_LIB)/perl58.a @@ -130,41 +132,41 @@ $(TARGET_FOLDER_LIB)/imagehlp.a: $(PATH_TO_TOP)/lib/imagehlp/imagehlp.def -d $(PATH_TO_TOP)/lib/imagehlp/imagehlp.def # --- SHELL --- -$(TARGET_FOLDER_LIB)/shell32.a: $(PATH_TO_TOP)/lib/shell32/shell32.def +$(TARGET_FOLDER_LIB)/shell32.a: $(PATH_TO_TOP)/lib/shell32/shell32.spec.def $(DLLTOOL) \ $(DTFLAGS)\ -D shell32.dll\ - -d $(PATH_TO_TOP)/lib/shell32/shell32.def + -d $(PATH_TO_TOP)/lib/shell32/shell32.spec.def -$(TARGET_FOLDER_LIB)/comctl32.a: $(PATH_TO_TOP)/lib/comctl32/comctl32.def +$(TARGET_FOLDER_LIB)/comctl32.a: $(PATH_TO_TOP)/lib/comctl32/comctl32.spec.def $(DLLTOOL) \ $(DTFLAGS)\ -D comctl32.dll\ - -d $(PATH_TO_TOP)/lib/comctl32/comctl32.def + -d $(PATH_TO_TOP)/lib/comctl32/comctl32.spec.def -$(TARGET_FOLDER_LIB)/$(SHELL32_ALIAS).a: $(PATH_TO_TOP)/lib/shell32/shell32.def +$(TARGET_FOLDER_LIB)/$(SHELL32_ALIAS).a: $(PATH_TO_TOP)/lib/shell32/shell32.spec.def $(DLLTOOL) \ $(DTFLAGS)\ -D $(SHELL32_ALIAS).dll\ - -d $(PATH_TO_TOP)/lib/shell32/shell32.def + -d $(PATH_TO_TOP)/lib/shell32/shell32.spec.def -$(TARGET_FOLDER_LIB)/$(COMCTL32_ALIAS).a: $(PATH_TO_TOP)/../wine/dlls/comctl32/comctl32.def +$(TARGET_FOLDER_LIB)/$(COMCTL32_ALIAS).a: $(PATH_TO_TOP)/lib/comctl32/comctl32.spec.def $(DLLTOOL) \ $(DTFLAGS)\ -D $(COMCTL32_ALIAS).dll\ - -d $(PATH_TO_TOP)/../wine/dlls/comctl32/comctl32.def + -d $(PATH_TO_TOP)/lib/comctl32/comctl32.spec.def #$(TARGET_FOLDER_LIB)/$(COMCTL32_ALIAS).a: $(PATH_TO_TOP)/lib/comctl32/comctl32.def # -d $(PATH_TO_TOP)/lib/comctl32/comctl32.def # --- NET --- -$(TARGET_FOLDER_LIB)/iphlpapi.a: $(PATH_TO_TOP)/lib/iphlpapi/iphlpapi.def +$(TARGET_FOLDER_LIB)/iphlpapi.a: $(PATH_TO_TOP)/lib/iphlpapi/iphlpapi.spec.def $(DLLTOOL) \ $(DTFLAGS)\ -D iphlpapi.dll\ - -d $(PATH_TO_TOP)/lib/iphlpapi/iphlpapi.def + -d $(PATH_TO_TOP)/lib/iphlpapi/iphlpapi.spec.def $(TARGET_FOLDER_LIB)/msafd.a: $(PATH_TO_TOP)/lib/msafd/msafd.def $(DLLTOOL) \ @@ -198,23 +200,23 @@ $(TARGET_FOLDER_LIB)/wsock32.a: $(PATH_TO_TOP)/lib/wsock32/wsock32.def # --- COM --- -#$(TARGET_FOLDER_LIB)/ole32.a: $(PATH_TO_TOP)/lib/ole32/ole32.def -# $(DLLTOOL) \ -# $(DTFLAGS)\ -# -D ole32.dll\ -# -d $(PATH_TO_TOP)/lib/ole32/ole32.def +$(TARGET_FOLDER_LIB)/ole32.a: $(PATH_TO_TOP)/lib/ole32/ole32.spec.def + $(DLLTOOL) \ + $(DTFLAGS)\ + -D ole32.dll\ + -d $(PATH_TO_TOP)/lib/ole32/ole32.spec.def -#$(TARGET_FOLDER_LIB)/oleaut32.a: $(PATH_TO_TOP)/lib/oleaut32/oleaut32.def -# $(DLLTOOL) \ -# $(DTFLAGS)\ -# -D oleaut32.dll\ -# -d $(PATH_TO_TOP)/lib/oleaut32/oleaut32.def +$(TARGET_FOLDER_LIB)/oleaut32.a: $(PATH_TO_TOP)/lib/oleaut32/oleaut32.spec.def + $(DLLTOOL) \ + $(DTFLAGS)\ + -D oleaut32.dll\ + -d $(PATH_TO_TOP)/lib/oleaut32/oleaut32.spec.def -#$(TARGET_FOLDER_LIB)/rpcrt4.a: $(PATH_TO_TOP)/lib/rpcrt4/rpcrt4.def -# $(DLLTOOL) \ -# $(DTFLAGS)\ -# -D rpcrt4.dll\ -# -d $(PATH_TO_TOP)/lib/rpcrt4/rpcrt4.def +$(TARGET_FOLDER_LIB)/rpcrt4.a: $(PATH_TO_TOP)/lib/rpcrt4/rpcrt4.spec.def + $(DLLTOOL) \ + $(DTFLAGS)\ + -D rpcrt4.dll\ + -d $(PATH_TO_TOP)/lib/rpcrt4/rpcrt4.spec.def # --- CRT --- @@ -238,62 +240,62 @@ $(TARGET_FOLDER_LIB)/version.a: $(PATH_TO_TOP)/lib/version/version.def -D version.dll\ -d $(PATH_TO_TOP)/lib/version/version.def -$(TARGET_FOLDER_LIB)/winmm.a: $(PATH_TO_TOP)/lib/winmm/winmm.def +$(TARGET_FOLDER_LIB)/winmm.a: $(PATH_TO_TOP)/lib/winmm/winmm.spec.def $(DLLTOOL) \ $(DTFLAGS)\ -D winmm.dll\ - -d $(PATH_TO_TOP)/lib/winmm/winmm.def + -d $(PATH_TO_TOP)/lib/winmm/winmm.spec.def # --- WINE --- -$(TARGET_FOLDER_LIB)/ole32.a: $(PATH_TO_TOP)/../wine/dlls/ole32/ole32.def - $(DLLTOOL) \ - $(DTFLAGS)\ - -D ole32.dll\ - -d $(PATH_TO_TOP)/../wine/dlls/ole32/ole32.def +#$(TARGET_FOLDER_LIB)/ole32.a: $(PATH_TO_TOP)/../wine/dlls/ole32/ole32.spec.def +# $(DLLTOOL) \ +# $(DTFLAGS)\ +# -D ole32.dll\ +# -d $(PATH_TO_TOP)/../wine/dlls/ole32/ole32.spec.def -$(TARGET_FOLDER_LIB)/oleaut32.a: $(PATH_TO_TOP)/../wine/dlls/oleaut32/oleaut32.def - $(DLLTOOL) \ - $(DTFLAGS)\ - -D oleaut32.dll\ - -d $(PATH_TO_TOP)/../wine/dlls/oleaut32/oleaut32.def +#$(TARGET_FOLDER_LIB)/oleaut32.a: $(PATH_TO_TOP)/../wine/dlls/oleaut32/oleaut32.spec.def +# $(DLLTOOL) \ +# $(DTFLAGS)\ +# -D oleaut32.dll\ +# -d $(PATH_TO_TOP)/../wine/dlls/oleaut32/oleaut32.spec.def -$(TARGET_FOLDER_LIB)/rpcrt4.a: $(PATH_TO_TOP)/../wine/dlls/rpcrt4/rpcrt4.def - $(DLLTOOL) \ - $(DTFLAGS)\ - -D rpcrt4.dll\ - -d $(PATH_TO_TOP)/../wine/dlls/rpcrt4/rpcrt4.def +#$(TARGET_FOLDER_LIB)/rpcrt4.a: $(PATH_TO_TOP)/../wine/dlls/rpcrt4/rpcrt4.def +# $(DLLTOOL) \ +# $(DTFLAGS)\ +# -D rpcrt4.dll\ +# -d $(PATH_TO_TOP)/../wine/dlls/rpcrt4/rpcrt4.def -$(TARGET_FOLDER_LIB)/shlwapi.a: $(PATH_TO_TOP)/../wine/dlls/shlwapi/shlwapi.def +$(TARGET_FOLDER_LIB)/shlwapi.a: $(PATH_TO_TOP)/lib/shlwapi/shlwapi.spec.def $(DLLTOOL) \ $(DTFLAGS)\ -D shlwapi.dll\ - -d $(PATH_TO_TOP)/../wine/dlls/shlwapi/shlwapi.def + -d $(PATH_TO_TOP)/lib/shlwapi/shlwapi.spec.def -$(TARGET_FOLDER_LIB)/wininet.a: $(PATH_TO_TOP)/../wine/dlls/wininet/wininet.def +$(TARGET_FOLDER_LIB)/wininet.a: $(PATH_TO_TOP)/lib/wininet/wininet.def $(DLLTOOL) \ $(DTFLAGS)\ -D wininet.dll\ - -d $(PATH_TO_TOP)/../wine/dlls/wininet/wininet.def + -d $(PATH_TO_TOP)/lib/wininet/wininet.def -$(TARGET_FOLDER_LIB)/lz32.a: $(PATH_TO_TOP)/../wine/dlls/lzexpand/lz32.def +$(TARGET_FOLDER_LIB)/lz32.a: $(PATH_TO_TOP)/lib/lzexpand/lz32.def $(DLLTOOL) \ $(DTFLAGS)\ -D lz32.dll\ - -d $(PATH_TO_TOP)/../wine/dlls/lzexpand/lz32.def + -d $(PATH_TO_TOP)/lib/lzexpand/lz32.def -$(TARGET_FOLDER_LIB)/libwine.a: $(PATH_TO_TOP)/../wine/library/libwine.def - $(DLLTOOL) \ - $(DTFLAGS)\ - -D libwine.dll\ - -d $(PATH_TO_TOP)/../wine/library/libwine.def +#$(TARGET_FOLDER_LIB)/libwine.a: $(PATH_TO_TOP)/../wine/libs/wine/wine.def +# $(DLLTOOL) \ +# $(DTFLAGS)\ +# -D libwine.dll\ +# -d $(PATH_TO_TOP)/../wine/libs/wine/wine.def -$(TARGET_FOLDER_LIB)/wine_unicode.a: $(PATH_TO_TOP)/../wine/unicode/wine_unicode.def +$(TARGET_FOLDER_LIB)/wine_unicode.a: $(PATH_TO_TOP)/lib/unicode/wine_unicode.def $(DLLTOOL) \ $(DTFLAGS)\ -D wine_unicode.dll\ - -d $(PATH_TO_TOP)/../wine/unicode/wine_unicode.def + -d $(PATH_TO_TOP)/lib/unicode/wine_unicode.def # --- CONTRIB --- From 942d157b7adeb06294edce2930bceb769f56aed7 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Fri, 28 May 2004 18:21:18 +0000 Subject: [PATCH 1247/1463] Remove dummy WINAPI define svn path=/trunk/; revision=9519 --- rosapps/net/netstat/netstat.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/rosapps/net/netstat/netstat.c b/rosapps/net/netstat/netstat.c index d3f331eddd9..666c94c6015 100644 --- a/rosapps/net/netstat/netstat.c +++ b/rosapps/net/netstat/netstat.c @@ -18,11 +18,6 @@ #include <stdio.h> #include <time.h> -#ifdef __GNUC__ -#undef WINAPI -#define WINAPI -#endif - #include <iptypes.h> #include <ipexport.h> #include <tlhelp32.h> From 137743321e5c615210d95d955214ac0044ca2dba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Fri, 28 May 2004 18:25:05 +0000 Subject: [PATCH 1248/1463] Don't redefine WINAPI. Spotted by Travis Snoozy <ai2097@yahoo.com> svn path=/trunk/; revision=9520 --- rosapps/net/ipconfig/ipconfig.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/rosapps/net/ipconfig/ipconfig.c b/rosapps/net/ipconfig/ipconfig.c index b66e3873fc1..c2a6563a0be 100644 --- a/rosapps/net/ipconfig/ipconfig.c +++ b/rosapps/net/ipconfig/ipconfig.c @@ -10,11 +10,6 @@ #include <tchar.h> #include <time.h> -#ifdef __GNUC__ -#undef WINAPI -#define WINAPI -#endif - #include <iptypes.h> #include <ipexport.h> #include <iphlpapi.h> From 69f34486397a88fa90199fe9510fdb2d0b2fb7fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Fri, 28 May 2004 18:30:22 +0000 Subject: [PATCH 1249/1463] Turn net/netstat and net/ipconfig back on again, since the build problems were solved svn path=/trunk/; revision=9521 --- rosapps/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rosapps/Makefile b/rosapps/Makefile index 21b138f79ba..86b666da88f 100644 --- a/rosapps/Makefile +++ b/rosapps/Makefile @@ -26,6 +26,8 @@ APPS = calc \ net$(SEP)whois \ net$(SEP)arp \ net$(SEP)ncftp \ + net$(SEP)netstat \ + net$(SEP)ipconfig \ regedt32 \ welcome \ winfile @@ -38,8 +40,6 @@ APPS = calc \ # Removed because it doesn't build correctly # # sysutils$(SEP)tlist \ -# net$(SEP)netstat \ -# net$(SEP)ipconfig \ # all: $(APPS) From 2e294f5461144ae1af1a3af7144cd4c96cb253fa Mon Sep 17 00:00:00 2001 From: Royce Mitchell III <royce3@ev1.net> Date: Fri, 28 May 2004 19:58:30 +0000 Subject: [PATCH 1250/1463] OS version information - patch by Christoph von Wittich svn path=/trunk/; revision=9522 --- reactos/bootdata/hivesys.inf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reactos/bootdata/hivesys.inf b/reactos/bootdata/hivesys.inf index a8f97669710..8360194b76c 100644 --- a/reactos/bootdata/hivesys.inf +++ b/reactos/bootdata/hivesys.inf @@ -614,6 +614,11 @@ HKLM,"SYSTEM\Setup","SetupType",0x00010001,0x00000001 HKLM,"SYSTEM\Setup","SystemPartition",0x00000000,"\Device\Harddisk0\Partition1" HKLM,"SYSTEM\Setup","SystemSetupInProgress",0x00010001,0x00000000 +; 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" + ; ----------------------------- KJS Init ---------------------------- HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","kjsinit",0x00010000,\ "function init(v) { var rk = '\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Kdb'; eval(System.regread(rk,v)); } for( i = 1; i <= 45; i++ ) { init((new Number(i)).toString()); }" From 7440bee0cfb1ef668dcb4ddf82baf47a44eb95b2 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III <royce3@ev1.net> Date: Fri, 28 May 2004 21:16:27 +0000 Subject: [PATCH 1251/1463] reactos-specific debugging functions KeRosDumpStackFrames and KeRosPrintAddress svn path=/trunk/; revision=9523 --- reactos/ntoskrnl/ke/i386/exp.c | 67 +++++++++++++++++++---------- reactos/ntoskrnl/ntoskrnl.def | 4 +- reactos/ntoskrnl/ntoskrnl.edf | 4 +- reactos/w32api/include/ddk/winddk.h | 11 +++++ 4 files changed, 62 insertions(+), 24 deletions(-) diff --git a/reactos/ntoskrnl/ke/i386/exp.c b/reactos/ntoskrnl/ke/i386/exp.c index 488eea88b7e..f034a19a918 100644 --- a/reactos/ntoskrnl/ke/i386/exp.c +++ b/reactos/ntoskrnl/ke/i386/exp.c @@ -126,15 +126,15 @@ static NTSTATUS ExceptionToNtStatus[] = /* FUNCTIONS ****************************************************************/ #ifdef KDBG -STATIC BOOLEAN -print_address(PVOID address) +BOOLEAN STDCALL +KeRosPrintAddress(PVOID address) { KdbPrintAddress(address); return TRUE; } #else /* KDBG */ -STATIC BOOLEAN -print_address(PVOID address) +BOOLEAN STDCALL +KeRosPrintAddress(PVOID address) { PLIST_ENTRY current_entry; MODULE_TEXT_SECTION* current; @@ -268,7 +268,7 @@ KiDoubleFaultHandler(VOID) DbgPrint("Exception: %d(%x)\n", ExceptionNr, 0); } DbgPrint("CS:EIP %x:%x ", OldTss->Cs, OldTss->Eip); - print_address((PVOID)OldTss->Eip); + KeRosPrintAddress((PVOID)OldTss->Eip); DbgPrint("\n"); DbgPrint("cr2 %x cr3 %x ", cr2_, OldCr3); DbgPrint("Proc: %x ",PsGetCurrentProcess()); @@ -327,7 +327,7 @@ KiDoubleFaultHandler(VOID) Frame = (PULONG)OldTss->Ebp; while (Frame != NULL && (ULONG)Frame >= StackBase) { - print_address((PVOID)Frame[1]); + KeRosPrintAddress((PVOID)Frame[1]); Frame = (PULONG)Frame[0]; DbgPrint(" "); } @@ -391,7 +391,7 @@ KiDoubleFaultHandler(VOID) { if (StackRepeatCount[i] == 0) { - print_address(StackTrace[i]); + KeRosPrintAddress(StackTrace[i]); i++; } else @@ -403,7 +403,7 @@ KiDoubleFaultHandler(VOID) } for (j = 0; j < StackRepeatLength[i]; j++) { - print_address(StackTrace[i + j]); + KeRosPrintAddress(StackTrace[i + j]); } DbgPrint("}*%d", StackRepeatCount[i]); i = i + StackRepeatLength[i] * StackRepeatCount[i]; @@ -444,7 +444,7 @@ KiDumpTrapFrame(PKTRAP_FRAME Tf, ULONG Parameter1, ULONG Parameter2) } DbgPrint("Processor: %d CS:EIP %x:%x ", KeGetCurrentProcessorNumber(), Tf->Cs&0xffff, Tf->Eip); - print_address((PVOID)Tf->Eip); + KeRosPrintAddress((PVOID)Tf->Eip); DbgPrint("\n"); Ke386GetPageTableDirectory(cr3_); DbgPrint("cr2 %x cr3 %x ", cr2, cr3_); @@ -505,7 +505,7 @@ KiDumpTrapFrame(PKTRAP_FRAME Tf, ULONG Parameter1, ULONG Parameter2) DbgPrint("<INVALID>"); break; } - if (!print_address(Eip)) + if (!KeRosPrintAddress(Eip)) { DbgPrint("<%X>", Eip); break; @@ -524,7 +524,7 @@ KiDumpTrapFrame(PKTRAP_FRAME Tf, ULONG Parameter1, ULONG Parameter2) while (Frame < (PULONG)PsGetCurrentThread()->Tcb.StackBase && i < 50) { ULONG Address = *Frame; - if (print_address((PVOID)Address)) + if (KeRosPrintAddress((PVOID)Address)) { i++; } @@ -630,20 +630,43 @@ KiTrapHandler(PKTRAP_FRAME Tf, ULONG ExceptionNr) VOID KeDumpStackFrames(PULONG Frame) { - ULONG i; + ULONG i; - DbgPrint("Frames: "); - i = 1; - while (Frame != NULL) - { - if (!print_address((PVOID)Frame[1])) + DbgPrint("Frames: "); + i = 1; + while ( MmIsAddressValid(Frame) ) { - DbgPrint("<%X>", (PVOID)Frame[1]); + if (!KeRosPrintAddress((PVOID)Frame[1])) + { + DbgPrint("<%X>", (PVOID)Frame[1]); + } + Frame = (PULONG)Frame[0]; + i++; + DbgPrint(" "); + } +} + +VOID STDCALL +KeRosDumpStackFrames ( PULONG Frame, ULONG FrameCount ) +{ + ULONG i; + + DbgPrint("Frames: "); + if ( !Frame ) + { + __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])) + { + DbgPrint("<%X>", (PVOID)Frame[1]); + } + Frame = (PULONG)Frame[0]; + DbgPrint(" "); } - Frame = (PULONG)Frame[0]; - i++; - DbgPrint(" "); - } } static void set_system_call_gate(unsigned int sel, unsigned int func) diff --git a/reactos/ntoskrnl/ntoskrnl.def b/reactos/ntoskrnl/ntoskrnl.def index fa76d746657..5375539f58c 100644 --- a/reactos/ntoskrnl/ntoskrnl.def +++ b/reactos/ntoskrnl/ntoskrnl.def @@ -1,4 +1,4 @@ -; $Id: ntoskrnl.def,v 1.182 2004/05/24 12:08:55 ekohl Exp $ +; $Id: ntoskrnl.def,v 1.183 2004/05/28 21:16:27 royce Exp $ ; ; reactos/ntoskrnl/ntoskrnl.def ; @@ -684,6 +684,8 @@ READ_REGISTER_USHORT@4 READ_REGISTER_BUFFER_UCHAR@12 READ_REGISTER_BUFFER_ULONG@12 READ_REGISTER_BUFFER_USHORT@12 +KeRosPrintAddress@4 +KeRosDumpStackFrames@8 RtlAbsoluteToSelfRelativeSD@12 RtlAddAccessAllowedAce@16 RtlAddAce@20 diff --git a/reactos/ntoskrnl/ntoskrnl.edf b/reactos/ntoskrnl/ntoskrnl.edf index 3da53ac294b..ea879bf5b1e 100644 --- a/reactos/ntoskrnl/ntoskrnl.edf +++ b/reactos/ntoskrnl/ntoskrnl.edf @@ -1,4 +1,4 @@ -; $Id: ntoskrnl.edf,v 1.168 2004/05/24 12:08:55 ekohl Exp $ +; $Id: ntoskrnl.edf,v 1.169 2004/05/28 21:16:27 royce Exp $ ; ; reactos/ntoskrnl/ntoskrnl.def ; @@ -685,6 +685,8 @@ READ_REGISTER_USHORT=READ_REGISTER_USHORT@4 READ_REGISTER_BUFFER_UCHAR=READ_REGISTER_BUFFER_UCHAR@12 READ_REGISTER_BUFFER_ULONG=READ_REGISTER_BUFFER_ULONG@12 READ_REGISTER_BUFFER_USHORT=READ_REGISTER_BUFFER_USHORT@12 +KeRosPrintAddress=KeRosPrintAddress@4 +KeRosDumpStackFrames=KeRosDumpStackFrames@8 RtlAbsoluteToSelfRelativeSD=RtlAbsoluteToSelfRelativeSD@12 RtlAddAccessAllowedAce=RtlAddAccessAllowedAce@16 RtlAddAce=RtlAddAce@20 diff --git a/reactos/w32api/include/ddk/winddk.h b/reactos/w32api/include/ddk/winddk.h index 42e31013302..7309a3e526b 100644 --- a/reactos/w32api/include/ddk/winddk.h +++ b/reactos/w32api/include/ddk/winddk.h @@ -9088,6 +9088,17 @@ DbgSetDebugFilterState( IN ULONG Level, IN BOOLEAN State); +NTOSAPI +BOOLEAN +DDKAPI +KeRosPrintAddress ( PVOID address ); + +NTOSAPI +VOID +DDKAPI +KeRosDumpStackFrames ( PULONG Frame, ULONG FrameCount ); + + #ifdef DBG #define KdPrint(_x_) DbgPrint _x_ From f1b0bedbad3ab90c83a0a1a862f4f0640311bae2 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 28 May 2004 21:17:42 +0000 Subject: [PATCH 1252/1463] - Revert the PS/2 timeouts to the old values. svn path=/trunk/; revision=9524 --- freeldr/freeldr/arch/i386/hardware.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/freeldr/freeldr/arch/i386/hardware.c b/freeldr/freeldr/arch/i386/hardware.c index 84f2e3fadfb..9a0e9423672 100644 --- a/freeldr/freeldr/arch/i386/hardware.c +++ b/freeldr/freeldr/arch/i386/hardware.c @@ -1244,7 +1244,7 @@ DetectPS2AuxPort(VOID) break; } - KeStallExecutionProcessor(1000); + KeStallExecutionProcessor(10000); } return FALSE; @@ -1266,7 +1266,7 @@ DetectPS2AuxDevice(VOID) WRITE_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA, 0xF2); - KeStallExecutionProcessor(1000); + KeStallExecutionProcessor(10000); Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); if ((Status & CONTROLLER_STATUS_MOUSE_OUTPUT_BUFFER_FULL) == 0) @@ -1278,7 +1278,7 @@ DetectPS2AuxDevice(VOID) if (Scancode != 0xFA) return FALSE; - KeStallExecutionProcessor(1000); + KeStallExecutionProcessor(10000); Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); if ((Status & CONTROLLER_STATUS_MOUSE_OUTPUT_BUFFER_FULL) == 0) From 63fc502d5afbe9a3dc29c62199a055ec72308e39 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III <royce3@ev1.net> Date: Fri, 28 May 2004 21:21:06 +0000 Subject: [PATCH 1253/1463] put version information where it's supposed to go - thanks to Ge svn path=/trunk/; revision=9525 --- reactos/bootdata/hivesft.inf | 5 +++++ reactos/bootdata/hivesys.inf | 5 ----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/reactos/bootdata/hivesft.inf b/reactos/bootdata/hivesft.inf index 81658fb540b..ee30f9eafcf 100644 --- a/reactos/bootdata/hivesft.inf +++ b/reactos/bootdata/hivesft.inf @@ -3,6 +3,11 @@ 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,"%SystemDrive%\Documents and Settings\All Users\Desktop" HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common AppData",0x00020000,"%SystemDrive%\Documents and Settings\All Users\Application Data" diff --git a/reactos/bootdata/hivesys.inf b/reactos/bootdata/hivesys.inf index 8360194b76c..a8f97669710 100644 --- a/reactos/bootdata/hivesys.inf +++ b/reactos/bootdata/hivesys.inf @@ -614,11 +614,6 @@ HKLM,"SYSTEM\Setup","SetupType",0x00010001,0x00000001 HKLM,"SYSTEM\Setup","SystemPartition",0x00000000,"\Device\Harddisk0\Partition1" HKLM,"SYSTEM\Setup","SystemSetupInProgress",0x00010001,0x00000000 -; 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" - ; ----------------------------- KJS Init ---------------------------- HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","kjsinit",0x00010000,\ "function init(v) { var rk = '\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Kdb'; eval(System.regread(rk,v)); } for( i = 1; i <= 45; i++ ) { init((new Number(i)).toString()); }" From 683ba367cc4f3dfd36e830b35feb043f6bfc8c94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Fri, 28 May 2004 21:33:41 +0000 Subject: [PATCH 1254/1463] Clean up calls from win32k to csrss svn path=/trunk/; revision=9526 --- reactos/include/win32k/ntuser.h | 1 + reactos/lib/user32/misc/misc.c | 11 ++- reactos/lib/user32/user32.def | 1 + reactos/lib/user32/user32.edf | 1 + reactos/subsys/csrss/include/csrplugin.h | 7 +- reactos/subsys/csrss/init.c | 63 ++++++++++++++++- reactos/subsys/csrss/makefile | 6 +- reactos/subsys/csrss/win32csr/dllmain.c | 12 +++- reactos/subsys/csrss/win32csr/win32csr.edf | 4 +- reactos/subsys/win32k/include/csr.h | 18 +++++ reactos/subsys/win32k/makefile | 14 ++-- reactos/subsys/win32k/ntuser/csr.c | 79 ++++++++++++++++++++++ reactos/subsys/win32k/ntuser/desktop.c | 47 +------------ reactos/subsys/win32k/ntuser/misc.c | 8 ++- reactos/subsys/win32k/w32k.h | 1 + 15 files changed, 207 insertions(+), 66 deletions(-) create mode 100644 reactos/subsys/win32k/include/csr.h create mode 100644 reactos/subsys/win32k/ntuser/csr.c diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index 745e27118da..7b81cad034c 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -162,6 +162,7 @@ NtUserCallNextHookEx( #define NOPARAM_ROUTINE_INIT_MESSAGE_PUMP 0xffff0004 #define NOPARAM_ROUTINE_GETMESSAGEEXTRAINFO 0xffff0005 #define NOPARAM_ROUTINE_ANYPOPUP 0xffff0006 +#define NOPARAM_ROUTINE_CSRSS_INITIALIZED 0xffff0007 DWORD STDCALL NtUserCallNoParam( diff --git a/reactos/lib/user32/misc/misc.c b/reactos/lib/user32/misc/misc.c index 15503839f79..9f3393287f6 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.4 2004/05/01 16:43:14 weiden Exp $ +/* $Id: misc.c,v 1.5 2004/05/28 21:33:41 gvg Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/misc/misc.c @@ -48,7 +48,7 @@ GetGuiResources( /* - * Private call for CSRSS + * Private calls for CSRSS */ VOID STDCALL @@ -57,6 +57,13 @@ PrivateCsrssManualGuiCheck(LONG Check) NtUserManualGuiCheck(Check); } +VOID +STDCALL +PrivateCsrssInitialized() +{ + NtUserCallNoParam(NOPARAM_ROUTINE_CSRSS_INITIALIZED); +} + /* * @implemented */ diff --git a/reactos/lib/user32/user32.def b/reactos/lib/user32/user32.def index 1f95ec157c2..c55360f168d 100644 --- a/reactos/lib/user32/user32.def +++ b/reactos/lib/user32/user32.def @@ -523,6 +523,7 @@ PrintWindow@12 PrivateCsrssAcquireOrReleaseInputOwnership@4 PrivateCsrssRegisterPrimitive@0 PrivateCsrssManualGuiCheck@4 +PrivateCsrssInitialized@0 PrivateExtractIconExA@20 PrivateExtractIconExW@20 PrivateExtractIconsA@32 diff --git a/reactos/lib/user32/user32.edf b/reactos/lib/user32/user32.edf index fd639d04a55..8b89e76c88c 100644 --- a/reactos/lib/user32/user32.edf +++ b/reactos/lib/user32/user32.edf @@ -524,6 +524,7 @@ PrintWindow=PrintWindow@12 PrivateCsrssAcquireOrReleaseInputOwnership=PrivateCsrssAcquireOrReleaseInputOwnership@4 PrivateCsrssRegisterPrimitive=PrivateCsrssRegisterPrimitive@0 PrivateCsrssManualGuiCheck=PrivateCsrssManualGuiCheck@4 +PrivateCsrssInitialized=PrivateCsrssInitialized@0 PrivateExtractIconExA=PrivateExtractIconExA@20 PrivateExtractIconExW=PrivateExtractIconExW@20 PrivateExtractIconsA=PrivateExtractIconsA@32 diff --git a/reactos/subsys/csrss/include/csrplugin.h b/reactos/subsys/csrss/include/csrplugin.h index 3e64bc80c4e..3b7bedd76ce 100644 --- a/reactos/subsys/csrss/include/csrplugin.h +++ b/reactos/subsys/csrss/include/csrplugin.h @@ -1,4 +1,4 @@ -/* $Id: csrplugin.h,v 1.1 2003/12/02 11:38:46 gvg Exp $ +/* $Id: csrplugin.h,v 1.2 2004/05/28 21:33:41 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -38,8 +38,11 @@ typedef struct tagCSRSS_EXPORTED_FUNCS CSRSS_RELEASE_OBJECT_PROC CsrReleaseObjectProc; } CSRSS_EXPORTED_FUNCS, *PCSRSS_EXPORTED_FUNCS; -typedef BOOL STDCALL (*CSRPLUGIN_INITIALIZE_PROC)(PCSRSS_API_DEFINITION *ApiDefinitions, +typedef BOOL (STDCALL *CSRPLUGIN_INIT_COMPLETE_PROC)(void); + +typedef BOOL (STDCALL *CSRPLUGIN_INITIALIZE_PROC)(PCSRSS_API_DEFINITION *ApiDefinitions, PCSRSS_OBJECT_DEFINITION *ObjectDefinitions, + CSRPLUGIN_INIT_COMPLETE_PROC *InitCompleteProc, PCSRSS_EXPORTED_FUNCS Exports, HANDLE CsrssApiHeap); diff --git a/reactos/subsys/csrss/init.c b/reactos/subsys/csrss/init.c index 0c194cc08d4..c232a896f77 100644 --- a/reactos/subsys/csrss/init.c +++ b/reactos/subsys/csrss/init.c @@ -1,4 +1,4 @@ -/* $Id: init.c,v 1.26 2004/04/09 20:03:15 navaraf Exp $ +/* $Id: init.c,v 1.27 2004/05/28 21:33:41 gvg Exp $ * * reactos/subsys/csrss/init.c * @@ -35,6 +35,53 @@ UNICODE_STRING CsrDirectoryName; extern HANDLE CsrssApiHeap; +static unsigned InitCompleteProcCount; +static CSRPLUGIN_INIT_COMPLETE_PROC *InitCompleteProcs = NULL; + +static NTSTATUS FASTCALL +AddInitCompleteProc(CSRPLUGIN_INIT_COMPLETE_PROC Proc) +{ + CSRPLUGIN_INIT_COMPLETE_PROC *NewProcs; + + NewProcs = RtlAllocateHeap(CsrssApiHeap, 0, + (InitCompleteProcCount + 1) + * sizeof(CSRPLUGIN_INIT_COMPLETE_PROC)); + if (NULL == NewProcs) + { + return STATUS_NO_MEMORY; + } + if (0 != InitCompleteProcCount) + { + RtlCopyMemory(NewProcs, InitCompleteProcs, + InitCompleteProcCount * sizeof(CSRPLUGIN_INIT_COMPLETE_PROC)); + RtlFreeHeap(CsrssApiHeap, 0, InitCompleteProcs); + } + NewProcs[InitCompleteProcCount] = Proc; + InitCompleteProcs = NewProcs; + InitCompleteProcCount++; + + return STATUS_SUCCESS; +} + +static BOOL FASTCALL +CallInitComplete(void) +{ + BOOL Ok; + unsigned i; + + Ok = TRUE; + if (0 != InitCompleteProcCount) + { + for (i = 0; i < InitCompleteProcCount && Ok; i++) + { + Ok = (*(InitCompleteProcs[i]))(); + } + RtlFreeHeap(CsrssApiHeap, 0, InitCompleteProcs); + } + + return Ok; +} + ULONG InitializeVideoAddressSpace(VOID); @@ -113,6 +160,7 @@ InitWin32Csr() CSRSS_EXPORTED_FUNCS Exports; PCSRSS_API_DEFINITION ApiDefinitions; PCSRSS_OBJECT_DEFINITION ObjectDefinitions; + CSRPLUGIN_INIT_COMPLETE_PROC InitCompleteProc; RtlInitUnicodeString(&DllName, L"win32csr.dll"); Status = LdrLoadDll(NULL, 0, &DllName, (PVOID *) &hInst); @@ -129,7 +177,8 @@ InitWin32Csr() Exports.CsrInsertObjectProc = CsrInsertObject; Exports.CsrGetObjectProc = CsrGetObject; Exports.CsrReleaseObjectProc = CsrReleaseObject; - if (! (*InitProc)(&ApiDefinitions, &ObjectDefinitions, &Exports, CsrssApiHeap)) + if (! (*InitProc)(&ApiDefinitions, &ObjectDefinitions, &InitCompleteProc, + &Exports, CsrssApiHeap)) { return STATUS_UNSUCCESSFUL; } @@ -140,6 +189,14 @@ InitWin32Csr() return Status; } Status = CsrRegisterObjectDefinitions(ObjectDefinitions); + if (! NT_SUCCESS(Status)) + { + return Status; + } + if (NULL != InitCompleteProc) + { + Status = AddInitCompleteProc(InitCompleteProc); + } return Status; } @@ -254,7 +311,7 @@ CsrServerInitialization ( return FALSE; } - return TRUE; + return CallInitComplete(); } /* EOF */ diff --git a/reactos/subsys/csrss/makefile b/reactos/subsys/csrss/makefile index 389be59adb1..886a8af589b 100644 --- a/reactos/subsys/csrss/makefile +++ b/reactos/subsys/csrss/makefile @@ -1,9 +1,9 @@ -# $Id: makefile,v 1.28 2004/04/09 20:03:15 navaraf Exp $ +# $Id: makefile,v 1.29 2004/05/28 21:33:41 gvg Exp $ PATH_TO_TOP = ../.. -#TARGET_TYPE = program -TARGET_TYPE = proglib +TARGET_TYPE = program +#TARGET_TYPE = proglib TARGET_APPTYPE = native diff --git a/reactos/subsys/csrss/win32csr/dllmain.c b/reactos/subsys/csrss/win32csr/dllmain.c index 4113359244d..2de47cf71e8 100644 --- a/reactos/subsys/csrss/win32csr/dllmain.c +++ b/reactos/subsys/csrss/win32csr/dllmain.c @@ -1,4 +1,4 @@ -/* $Id: dllmain.c,v 1.4 2004/01/19 20:14:28 gvg Exp $ +/* $Id: dllmain.c,v 1.5 2004/05/28 21:33:41 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -19,6 +19,7 @@ /* Not defined in any header file */ extern VOID STDCALL PrivateCsrssManualGuiCheck(LONG Check); +extern VOID STDCALL PrivateCsrssInitialized(); /* GLOBALS *******************************************************************/ @@ -141,10 +142,18 @@ Win32CsrReleaseObject(PCSRSS_PROCESS_DATA ProcessData, return (CsrExports.CsrReleaseObjectProc)(ProcessData, Object); } +static BOOL STDCALL +Win32CsrInitComplete(void) +{ + PrivateCsrssInitialized(); + + return TRUE; +} BOOL STDCALL Win32CsrInitialization(PCSRSS_API_DEFINITION *ApiDefinitions, PCSRSS_OBJECT_DEFINITION *ObjectDefinitions, + CSRPLUGIN_INIT_COMPLETE_PROC *InitComplete, PCSRSS_EXPORTED_FUNCS Exports, HANDLE CsrssApiHeap) { @@ -165,6 +174,7 @@ Win32CsrInitialization(PCSRSS_API_DEFINITION *ApiDefinitions, *ApiDefinitions = Win32CsrApiDefinitions; *ObjectDefinitions = Win32CsrObjectDefinitions; + *InitComplete = Win32CsrInitComplete; return TRUE; } diff --git a/reactos/subsys/csrss/win32csr/win32csr.edf b/reactos/subsys/csrss/win32csr/win32csr.edf index 829b54ff19b..3bfb344e3f9 100644 --- a/reactos/subsys/csrss/win32csr/win32csr.edf +++ b/reactos/subsys/csrss/win32csr/win32csr.edf @@ -1,4 +1,4 @@ -; $Id: win32csr.edf,v 1.1 2003/12/02 11:38:46 gvg Exp $ +; $Id: win32csr.edf,v 1.2 2004/05/28 21:33:41 gvg Exp $ ; ; @@ -6,4 +6,4 @@ LIBRARY win32csr.dll EXPORTS -Win32CsrInitialization=Win32CsrInitialization@16 +Win32CsrInitialization=Win32CsrInitialization@20 diff --git a/reactos/subsys/win32k/include/csr.h b/reactos/subsys/win32k/include/csr.h new file mode 100644 index 00000000000..dd8e1b783c9 --- /dev/null +++ b/reactos/subsys/win32k/include/csr.h @@ -0,0 +1,18 @@ +/* $Id: csr.h,v 1.1 2004/05/28 21:33:41 gvg Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * PURPOSE: Interface to csrss + * FILE: subsys/win32k/include/csr.h + * PROGRAMER: Ge van Geldorp (ge@gse.nl) + */ + +#ifndef CSR_H_INCLUDED +#define CSR_H_INCLUDED + +extern NTSTATUS FASTCALL CsrInit(void); +extern NTSTATUS FASTCALL CsrNotify(PCSRSS_API_REQUEST Request, PCSRSS_API_REPLY Reply); + +#endif /* CSR_H_INCLUDED */ + +/* EOF */ diff --git a/reactos/subsys/win32k/makefile b/reactos/subsys/win32k/makefile index de8e52d271b..9a50688c475 100644 --- a/reactos/subsys/win32k/makefile +++ b/reactos/subsys/win32k/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.99 2004/05/13 19:29:47 jfilby Exp $ +# $Id: makefile,v 1.100 2004/05/28 21:33:40 gvg Exp $ PATH_TO_TOP = ../.. @@ -54,12 +54,12 @@ MISC_OBJECTS = misc/driver.o misc/error.o misc/math.o misc/object.o LDR_OBJECTS = ldr/loader.o NTUSER_OBJECTS = ntuser/accelerator.o ntuser/callback.o ntuser/caret.o ntuser/class.o \ - ntuser/clipboard.o ntuser/focus.o ntuser/desktop.o ntuser/guicheck.o \ - ntuser/hook.o ntuser/hotkey.o ntuser/input.o ntuser/keyboard.o \ - ntuser/menu.o ntuser/message.o ntuser/metric.o ntuser/misc.o \ - ntuser/msgqueue.o ntuser/painting.o ntuser/prop.o ntuser/scrollbar.o \ - ntuser/stubs.o ntuser/timer.o ntuser/useratom.o ntuser/vis.o \ - ntuser/windc.o ntuser/window.o ntuser/winpos.o ntuser/winsta.o + ntuser/clipboard.o ntuser/csr.o ntuser/focus.o ntuser/desktop.o \ + ntuser/guicheck.o ntuser/hook.o ntuser/hotkey.o ntuser/input.o \ + ntuser/keyboard.o ntuser/menu.o ntuser/message.o ntuser/metric.o \ + ntuser/misc.o ntuser/msgqueue.o ntuser/painting.o ntuser/prop.o \ + ntuser/scrollbar.o ntuser/stubs.o ntuser/timer.o ntuser/useratom.o \ + ntuser/vis.o ntuser/windc.o ntuser/window.o ntuser/winpos.o ntuser/winsta.o OBJECTS_OBJECTS = objects/bitmaps.o objects/brush.o objects/cliprgn.o \ objects/color.o objects/coord.o objects/dc.o \ diff --git a/reactos/subsys/win32k/ntuser/csr.c b/reactos/subsys/win32k/ntuser/csr.c new file mode 100644 index 00000000000..abf1ee9680a --- /dev/null +++ b/reactos/subsys/win32k/ntuser/csr.c @@ -0,0 +1,79 @@ +/* $Id: csr.c,v 1.1 2004/05/28 21:33:41 gvg Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * PURPOSE: Interface to csrss + * FILE: subsys/win32k/ntuser/csr.c + * PROGRAMER: Ge van Geldorp (ge@gse.nl) + */ + +#include <w32k.h> + +static HANDLE WindowsApiPort = NULL; +static PEPROCESS CsrProcess = NULL; + +NTSTATUS FASTCALL +CsrInit(void) +{ + NTSTATUS Status; + UNICODE_STRING PortName; + ULONG ConnectInfoLength; + + RtlInitUnicodeString(&PortName, L"\\Windows\\ApiPort"); + ConnectInfoLength = 0; + Status = ZwConnectPort(&WindowsApiPort, + &PortName, + NULL, + NULL, + NULL, + NULL, + NULL, + &ConnectInfoLength); + if (! NT_SUCCESS(Status)) + { + return Status; + } + + CsrProcess = PsGetCurrentProcess(); + + return STATUS_SUCCESS; +} + + +NTSTATUS FASTCALL +CsrNotify(PCSRSS_API_REQUEST Request, PCSRSS_API_REPLY Reply) +{ + NTSTATUS Status; + PEPROCESS OldProcess; + + if (NULL == CsrProcess) + { + return STATUS_INVALID_PORT_HANDLE; + } + + Request->Header.DataSize = sizeof(CSRSS_API_REQUEST) - LPC_MESSAGE_BASE_SIZE; + Request->Header.MessageSize = sizeof(CSRSS_API_REQUEST); + + /* Switch to the process in which the WindowsApiPort handle is valid */ + OldProcess = PsGetCurrentProcess(); + if (CsrProcess != OldProcess) + { + KeAttachProcess(CsrProcess); + } + Status = ZwRequestWaitReplyPort(WindowsApiPort, + &Request->Header, + &Reply->Header); + if (CsrProcess != OldProcess) + { + KeDetachProcess(); + } + + if (NT_SUCCESS(Status)) + { + Status = Reply->Status; + } + + return STATUS_SUCCESS; +} + +/* EOF */ diff --git a/reactos/subsys/win32k/ntuser/desktop.c b/reactos/subsys/win32k/ntuser/desktop.c index 60d22f8c91d..c368b01ccd3 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.14 2004/05/10 17:07:18 weiden Exp $ + * $Id: desktop.c,v 1.15 2004/05/28 21:33:41 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -207,47 +207,6 @@ HWND FASTCALL IntGetDesktopWindow(VOID) /* PUBLIC FUNCTIONS ***********************************************************/ - -static NTSTATUS FASTCALL -NotifyCsrss(PCSRSS_API_REQUEST Request, PCSRSS_API_REPLY Reply) -{ - NTSTATUS Status; - UNICODE_STRING PortName; - ULONG ConnectInfoLength; - static HANDLE WindowsApiPort = NULL; - - RtlInitUnicodeString(&PortName, L"\\Windows\\ApiPort"); - ConnectInfoLength = 0; - Status = ZwConnectPort(&WindowsApiPort, - &PortName, - NULL, - NULL, - NULL, - NULL, - NULL, - &ConnectInfoLength); - if (! NT_SUCCESS(Status)) - { - return Status; - } - - Request->Header.DataSize = sizeof(CSRSS_API_REQUEST) - LPC_MESSAGE_BASE_SIZE; - Request->Header.MessageSize = sizeof(CSRSS_API_REQUEST); - - Status = ZwRequestWaitReplyPort(WindowsApiPort, - &Request->Header, - &Reply->Header); - if (! NT_SUCCESS(Status) || ! NT_SUCCESS(Status = Reply->Status)) - { - ZwClose(WindowsApiPort); - return Status; - } - -// ZwClose(WindowsApiPort); - - return STATUS_SUCCESS; -} - NTSTATUS FASTCALL IntShowDesktop(PDESKTOP_OBJECT Desktop, ULONG Width, ULONG Height) { @@ -259,7 +218,7 @@ IntShowDesktop(PDESKTOP_OBJECT Desktop, ULONG Width, ULONG Height) Request.Data.ShowDesktopRequest.Width = Width; Request.Data.ShowDesktopRequest.Height = Height; - return NotifyCsrss(&Request, &Reply); + return CsrNotify(&Request, &Reply); } NTSTATUS FASTCALL @@ -446,7 +405,7 @@ NtUserCreateDesktop( lpszDesktopName->Length); Request.Data.CreateDesktopRequest.DesktopName[lpszDesktopName->Length / sizeof(WCHAR)] = L'\0'; - Status = NotifyCsrss(&Request, &Reply); + Status = CsrNotify(&Request, &Reply); if (! NT_SUCCESS(Status)) { DPRINT1("Failed to notify CSRSS about new desktop\n"); diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index dbdd734c5f5..b64f7878c93 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.75 2004/05/21 10:09:31 weiden Exp $ +/* $Id: misc.c,v 1.76 2004/05/28 21:33:41 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -114,9 +114,13 @@ NtUserCallNoParam(DWORD Routine) case NOPARAM_ROUTINE_ANYPOPUP: Result = (DWORD)IntAnyPopup(); break; + + case NOPARAM_ROUTINE_CSRSS_INITIALIZED: + Result = (DWORD)CsrInit(); + break; default: - DPRINT1("Calling invalid routine number 0x%x in NtUserCallNoParam\n"); + DPRINT1("Calling invalid routine number 0x%x in NtUserCallNoParam\n", Routine); SetLastWin32Error(ERROR_INVALID_PARAMETER); break; } diff --git a/reactos/subsys/win32k/w32k.h b/reactos/subsys/win32k/w32k.h index 106e677cf1e..13630062753 100644 --- a/reactos/subsys/win32k/w32k.h +++ b/reactos/subsys/win32k/w32k.h @@ -34,6 +34,7 @@ #include <include/cleanup.h> #include <include/clipboard.h> #include <include/color.h> +#include <include/csr.h> #include <include/cursoricon.h> #include <include/dce.h> #include <include/desktop.h> From d31c888e861e099b1bfd911e1e4055e1c742951c Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Sat, 29 May 2004 00:16:39 +0000 Subject: [PATCH 1255/1463] moved oskittcp as it is a driver lib. svn path=/trunk/; revision=9527 --- reactos/Makefile | 6 +- reactos/drivers/lib/oskittcp/README | 5 + .../include/freebsd/dev/include/vm/vm.h | 42 + .../include/freebsd/dev/include/vm/vm_param.h | 27 + .../include/freebsd/net/include/arpa/inet.h | 53 + .../include/freebsd/net/include/imp.h | 1 + .../include/freebsd/src/sys/machine/ansi.h | 96 + .../include/freebsd/src/sys/machine/cpufunc.h | 460 ++++ .../include/freebsd/src/sys/machine/endian.h | 119 + .../include/freebsd/src/sys/machine/ipl.h | 41 + .../include/freebsd/src/sys/machine/limits.h | 96 + .../include/freebsd/src/sys/machine/param.h | 161 ++ .../include/freebsd/src/sys/machine/proc.h | 49 + .../include/freebsd/src/sys/machine/signal.h | 80 + .../include/freebsd/src/sys/machine/spl.h | 221 ++ .../include/freebsd/src/sys/machine/stdarg.h | 63 + .../include/freebsd/src/sys/machine/trap.h | 95 + .../include/freebsd/src/sys/machine/types.h | 65 + .../include/freebsd/src/sys/machine/vmparam.h | 136 ++ .../oskittcp/include/freebsd/src/sys/net/if.h | 394 +++ .../include/freebsd/src/sys/net/if_arp.h | 92 + .../include/freebsd/src/sys/net/netisr.h | 86 + .../include/freebsd/src/sys/net/radix.h | 170 ++ .../include/freebsd/src/sys/net/raw_cb.h | 74 + .../include/freebsd/src/sys/net/route.h | 258 ++ .../freebsd/src/sys/netinet/if_ether.h | 237 ++ .../freebsd/src/sys/netinet/igmp_var.h | 91 + .../include/freebsd/src/sys/netinet/in.h | 262 ++ .../include/freebsd/src/sys/netinet/in_pcb.h | 107 + .../freebsd/src/sys/netinet/in_systm.h | 61 + .../include/freebsd/src/sys/netinet/in_var.h | 233 ++ .../include/freebsd/src/sys/netinet/ip.h | 174 ++ .../include/freebsd/src/sys/netinet/ip_fw.h | 145 ++ .../include/freebsd/src/sys/netinet/ip_icmp.h | 184 ++ .../include/freebsd/src/sys/netinet/ip_var.h | 210 ++ .../include/freebsd/src/sys/netinet/tcp.h | 121 + .../freebsd/src/sys/netinet/tcp_debug.h | 64 + .../include/freebsd/src/sys/netinet/tcp_fsm.h | 91 + .../include/freebsd/src/sys/netinet/tcp_seq.h | 86 + .../freebsd/src/sys/netinet/tcp_timer.h | 136 ++ .../include/freebsd/src/sys/netinet/tcp_var.h | 387 +++ .../include/freebsd/src/sys/netinet/tcpip.h | 74 + .../include/freebsd/src/sys/netinet/udp.h | 50 + .../include/freebsd/src/sys/netinet/udp_var.h | 105 + .../include/freebsd/src/sys/sys/buf.h | 254 ++ .../include/freebsd/src/sys/sys/callout.h | 56 + .../include/freebsd/src/sys/sys/cdefs.h | 147 ++ .../include/freebsd/src/sys/sys/domain.h | 73 + .../include/freebsd/src/sys/sys/errno.h | 168 ++ .../include/freebsd/src/sys/sys/fcntl.h | 190 ++ .../include/freebsd/src/sys/sys/file.h | 83 + .../include/freebsd/src/sys/sys/filedesc.h | 108 + .../include/freebsd/src/sys/sys/filio.h | 57 + .../include/freebsd/src/sys/sys/ioccom.h | 68 + .../include/freebsd/src/sys/sys/ioctl.h | 84 + .../include/freebsd/src/sys/sys/kernel.h | 116 + .../include/freebsd/src/sys/sys/libkern.h | 64 + .../include/freebsd/src/sys/sys/malloc.h | 333 +++ .../include/freebsd/src/sys/sys/mbuf.h | 512 ++++ .../include/freebsd/src/sys/sys/param.h | 224 ++ .../include/freebsd/src/sys/sys/proc.h | 336 +++ .../include/freebsd/src/sys/sys/protosw.h | 221 ++ .../include/freebsd/src/sys/sys/queue.h | 391 +++ .../include/freebsd/src/sys/sys/resource.h | 127 + .../include/freebsd/src/sys/sys/resourcevar.h | 97 + .../include/freebsd/src/sys/sys/rtprio.h | 69 + .../include/freebsd/src/sys/sys/select.h | 63 + .../include/freebsd/src/sys/sys/signal.h | 194 ++ .../include/freebsd/src/sys/sys/signalvar.h | 170 ++ .../include/freebsd/src/sys/sys/socket.h | 357 +++ .../include/freebsd/src/sys/sys/socketvar.h | 264 ++ .../include/freebsd/src/sys/sys/sockio.h | 88 + .../include/freebsd/src/sys/sys/stat.h | 203 ++ .../include/freebsd/src/sys/sys/sysctl.h | 412 ++++ .../include/freebsd/src/sys/sys/syslimits.h | 65 + .../include/freebsd/src/sys/sys/syslog.h | 202 ++ .../include/freebsd/src/sys/sys/systm.h | 245 ++ .../include/freebsd/src/sys/sys/time.h | 135 ++ .../include/freebsd/src/sys/sys/ttycom.h | 139 ++ .../include/freebsd/src/sys/sys/types.h | 167 ++ .../include/freebsd/src/sys/sys/ucred.h | 63 + .../include/freebsd/src/sys/sys/uio.h | 91 + .../include/freebsd/src/sys/sys/unistd.h | 121 + .../drivers/lib/oskittcp/include/memtrack.h | 73 + .../drivers/lib/oskittcp/include/oskitdebug.h | 94 + .../drivers/lib/oskittcp/include/oskiterrno.h | 170 ++ .../lib/oskittcp/include/oskitfreebsd.h | 14 + .../drivers/lib/oskittcp/include/oskittcp.h | 106 + .../drivers/lib/oskittcp/include/oskittypes.h | 60 + reactos/drivers/lib/oskittcp/makefile | 83 + .../drivers/lib/oskittcp/oskittcp/.cvsignore | 2 + .../drivers/lib/oskittcp/oskittcp/defaults.c | 215 ++ reactos/drivers/lib/oskittcp/oskittcp/in.c | 181 ++ .../drivers/lib/oskittcp/oskittcp/in_cksum.c | 150 ++ .../drivers/lib/oskittcp/oskittcp/in_pcb.c | 521 ++++ .../drivers/lib/oskittcp/oskittcp/in_proto.c | 150 ++ .../drivers/lib/oskittcp/oskittcp/in_rmx.c | 91 + .../drivers/lib/oskittcp/oskittcp/inet_ntoa.c | 51 + .../drivers/lib/oskittcp/oskittcp/interface.c | 292 +++ .../drivers/lib/oskittcp/oskittcp/ip_input.c | 190 ++ .../drivers/lib/oskittcp/oskittcp/ip_output.c | 300 +++ .../lib/oskittcp/oskittcp/kern_clock.c | 361 +++ .../drivers/lib/oskittcp/oskittcp/kern_subr.c | 252 ++ .../drivers/lib/oskittcp/oskittcp/malloc.c | 16 + reactos/drivers/lib/oskittcp/oskittcp/param.c | 24 + reactos/drivers/lib/oskittcp/oskittcp/radix.c | 1006 ++++++++ .../drivers/lib/oskittcp/oskittcp/random.c | 63 + reactos/drivers/lib/oskittcp/oskittcp/route.c | 807 ++++++ .../drivers/lib/oskittcp/oskittcp/rtsock.c | 79 + reactos/drivers/lib/oskittcp/oskittcp/scanc.c | 52 + reactos/drivers/lib/oskittcp/oskittcp/sleep.c | 209 ++ .../drivers/lib/oskittcp/oskittcp/tcp_debug.c | 163 ++ .../drivers/lib/oskittcp/oskittcp/tcp_input.c | 2160 +++++++++++++++++ .../lib/oskittcp/oskittcp/tcp_output.c | 823 +++++++ .../drivers/lib/oskittcp/oskittcp/tcp_subr.c | 610 +++++ .../drivers/lib/oskittcp/oskittcp/tcp_timer.c | 358 +++ .../lib/oskittcp/oskittcp/tcp_usrreq.c | 773 ++++++ .../lib/oskittcp/oskittcp/uipc_domain.c | 231 ++ .../drivers/lib/oskittcp/oskittcp/uipc_mbuf.c | 769 ++++++ .../lib/oskittcp/oskittcp/uipc_socket.c | 1061 ++++++++ .../lib/oskittcp/oskittcp/uipc_socket2.c | 812 +++++++ 121 files changed, 25834 insertions(+), 3 deletions(-) create mode 100644 reactos/drivers/lib/oskittcp/README create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/dev/include/vm/vm.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/dev/include/vm/vm_param.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/net/include/arpa/inet.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/net/include/imp.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/ansi.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/cpufunc.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/endian.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/ipl.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/limits.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/param.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/proc.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/signal.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/spl.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/stdarg.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/trap.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/types.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/vmparam.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/net/if.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/net/if_arp.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/net/netisr.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/net/radix.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/net/raw_cb.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/net/route.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/if_ether.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/igmp_var.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/in.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/in_pcb.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/in_systm.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/in_var.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/ip.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/ip_fw.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/ip_icmp.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/ip_var.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcp.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_debug.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_fsm.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_seq.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_timer.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_var.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcpip.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/udp.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/udp_var.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/buf.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/callout.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/cdefs.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/domain.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/errno.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/fcntl.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/file.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/filedesc.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/filio.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/ioccom.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/ioctl.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/kernel.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/libkern.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/malloc.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/mbuf.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/param.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/proc.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/protosw.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/queue.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/resource.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/resourcevar.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/rtprio.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/select.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/signal.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/signalvar.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/socket.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/socketvar.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/sockio.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/stat.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/sysctl.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/syslimits.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/syslog.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/systm.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/time.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/ttycom.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/types.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/ucred.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/uio.h create mode 100644 reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/unistd.h create mode 100644 reactos/drivers/lib/oskittcp/include/memtrack.h create mode 100644 reactos/drivers/lib/oskittcp/include/oskitdebug.h create mode 100644 reactos/drivers/lib/oskittcp/include/oskiterrno.h create mode 100644 reactos/drivers/lib/oskittcp/include/oskitfreebsd.h create mode 100644 reactos/drivers/lib/oskittcp/include/oskittcp.h create mode 100644 reactos/drivers/lib/oskittcp/include/oskittypes.h create mode 100644 reactos/drivers/lib/oskittcp/makefile create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/.cvsignore create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/defaults.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/in.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/in_cksum.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/in_pcb.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/in_proto.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/in_rmx.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/inet_ntoa.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/interface.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/ip_input.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/ip_output.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/kern_clock.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/kern_subr.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/malloc.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/param.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/radix.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/random.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/route.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/rtsock.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/scanc.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/sleep.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/tcp_debug.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/tcp_input.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/tcp_output.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/tcp_subr.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/tcp_timer.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/tcp_usrreq.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/uipc_domain.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/uipc_mbuf.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/uipc_socket.c create mode 100644 reactos/drivers/lib/oskittcp/oskittcp/uipc_socket2.c diff --git a/reactos/Makefile b/reactos/Makefile index 3a58a69a1fb..a573ddbcd3c 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.221 2004/05/03 15:29:01 sedwards Exp $ +# $Id: Makefile,v 1.222 2004/05/29 00:16:39 sedwards Exp $ # # Global makefile # @@ -63,8 +63,8 @@ SERVERS = win32 LOADERS = dos # Driver support libraries -#bzip2 zlib -DRIVERS_LIB = bzip2 +#bzip2 zlib oskittcp +DRIVERS_LIB = bzip2 oskittcp # Kernel mode device drivers # Obsolete: ide diff --git a/reactos/drivers/lib/oskittcp/README b/reactos/drivers/lib/oskittcp/README new file mode 100644 index 00000000000..a78d4e5bbf0 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/README @@ -0,0 +1,5 @@ +These files are originally from the freebsd TCP stack contained on oskit. +Only files relevent to TCP are here, along with assorted interfaces that +are needed to make them useful. Overall, I intend this to implement a +generic, standalone TCP library that can be used with any IP machinery +required. diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/dev/include/vm/vm.h b/reactos/drivers/lib/oskittcp/include/freebsd/dev/include/vm/vm.h new file mode 100644 index 00000000000..d3b2f6d469d --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/dev/include/vm/vm.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 1997-1998 University of Utah and the Flux Group. + * All rights reserved. + * + * This file is part of the Flux OSKit. The OSKit is free software, also known + * as "open source;" you can redistribute it and/or modify it under the terms + * of the GNU General Public License (GPL), version 2, as published by the Free + * Software Foundation (FSF). To explore alternate licensing terms, contact + * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. + * + * The OSKit 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 GPL for more details. You should have + * received a copy of the GPL along with the OSKit; see the file COPYING. If + * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. + */ +/* + * here's vm.h's primary purpose in life: + * + * define `vm_map_t' for the first arg to kmem_alloc() + */ +#ifndef _FAKE_VM_H +#define _FAKE_VM_H + +typedef void *vm_map_t; + +#include <vm/vm_param.h> + +/* + * XXX This is used by syscons to compute the address of the video buffer. + * This definition means the driver will only work when kva == pa. + * The real solution would be to modify the driver to map the buffer explicitly. + */ +#define vtophys(va) va + +/* + * ip_icmp.c and possibly other files rely on vm/vm.h to get sys/proc ... + */ +#include <sys/proc.h> +#include <sys/queue.h> + +#endif /* _FAKE_VM_H */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/dev/include/vm/vm_param.h b/reactos/drivers/lib/oskittcp/include/freebsd/dev/include/vm/vm_param.h new file mode 100644 index 00000000000..4d48e0391d6 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/dev/include/vm/vm_param.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 1997-1998 University of Utah and the Flux Group. + * All rights reserved. + * + * This file is part of the Flux OSKit. The OSKit is free software, also known + * as "open source;" you can redistribute it and/or modify it under the terms + * of the GNU General Public License (GPL), version 2, as published by the Free + * Software Foundation (FSF). To explore alternate licensing terms, contact + * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. + * + * The OSKit 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 GPL for more details. You should have + * received a copy of the GPL along with the OSKit; see the file COPYING. If + * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. + */ +#ifndef _VM_PARAM_ +#define _VM_PARAM_ + +#include <machine/vmparam.h> + +typedef int boolean_t; + +#define TRUE 1 +#define FALSE 0 + +#endif /* _VM_PARAM_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/net/include/arpa/inet.h b/reactos/drivers/lib/oskittcp/include/freebsd/net/include/arpa/inet.h new file mode 100644 index 00000000000..014277cb4c1 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/net/include/arpa/inet.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)inet.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _ARPA_INET_H_ +#define _ARPA_INET_H_ + +/* External definitions for functions in inet(3) */ + +#include <sys/cdefs.h> + +__BEGIN_DECLS +unsigned long inet_addr __P((const char *)); +int inet_aton __P((const char *, struct in_addr *)); +unsigned long inet_lnaof __P((struct in_addr)); +struct in_addr inet_makeaddr __P((u_long , u_long)); +unsigned long inet_netof __P((struct in_addr)); +unsigned long inet_network __P((const char *)); +char *inet_ntoa __P((struct in_addr)); +__END_DECLS + +#endif /* !_INET_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/net/include/imp.h b/reactos/drivers/lib/oskittcp/include/freebsd/net/include/imp.h new file mode 100644 index 00000000000..ef8ea49c607 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/net/include/imp.h @@ -0,0 +1 @@ +#define NIMP 0 diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/ansi.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/ansi.h new file mode 100644 index 00000000000..7d84a8237ef --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/ansi.h @@ -0,0 +1,96 @@ +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ansi.h 8.2 (Berkeley) 1/4/94 + */ + +#ifndef _MACHINE_ANSI_H_ +#define _MACHINE_ANSI_H_ + +/* + * Types which are fundamental to the implementation and must be declared + * in more than one standard header are defined here. Standard headers + * then use: + * #ifdef _BSD_SIZE_T_ + * typedef _BSD_SIZE_T_ size_t; + * #undef _BSD_SIZE_T_ + * #endif + */ +#define _BSD_CLOCK_T_ unsigned long /* clock() */ +#define _BSD_PTRDIFF_T_ int /* ptr1 - ptr2 */ +#ifndef _BSD_SIZE_T_ +#define _BSD_SIZE_T_ unsigned int /* sizeof() */ +#endif +#define _BSD_SSIZE_T_ int /* byte count or error */ +#define _BSD_TIME_T_ long /* time() */ + +/* + * Types which are fundamental to the implementation and must be used + * in more than one standard header although they are only declared in + * one (perhaps nonstandard) header are defined here. Standard headers + * use _BSD_XXX_T_ without undef'ing it. + */ +#define _BSD_OFF_T_ long long /* file offset */ +#define _BSD_PID_T_ long /* process [group] */ +#define _BSD_VA_LIST_ char * /* va_list */ + +/* + * Runes (wchar_t) is declared to be an ``int'' instead of the more natural + * ``unsigned long'' or ``long''. Two things are happening here. It is not + * unsigned so that EOF (-1) can be naturally assigned to it and used. Also, + * it looks like 10646 will be a 31 bit standard. This means that if your + * ints cannot hold 32 bits, you will be in trouble. The reason an int was + * chosen over a long is that the is*() and to*() routines take ints (says + * ANSI C), but they use _RUNE_T_ instead of int. By changing it here, you + * lose a bit of ANSI conformance, but your programs will still work. + * + * Note that _WCHAR_T_ and _RUNE_T_ must be of the same type. When wchar_t + * and rune_t are typedef'd, _WCHAR_T_ will be undef'd, but _RUNE_T remains + * defined for ctype.h. + */ +#define _BSD_WCHAR_T_ int /* wchar_t */ +#define _BSD_RUNE_T_ int /* rune_t */ + +/* + * Frequencies of the clock ticks reported by clock() and times(). They + * are the same as stathz for bogus historical reasons. They should be + * 1e6 because clock() and times() are implemented using getrusage() and + * there is no good reason why they should be less accurate. There is + * the bad reason that (broken) programs might not like clock_t or + * CLOCKS_PER_SEC being ``double'' (``unsigned long'' is not large enough + * to hold the required 24 hours worth of ticks if the frequency is + * 1000000ul, and ``unsigned long long'' would be nonstandard). + */ +#define _BSD_CLK_TCK_ 128 +#define _BSD_CLOCKS_PER_SEC_ 128 + +#endif /* !_MACHINE_ANSI_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/cpufunc.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/cpufunc.h new file mode 100644 index 00000000000..8ccb08fff28 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/cpufunc.h @@ -0,0 +1,460 @@ +/*- + * Copyright (c) 1993 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +/* + * Functions to provide access to special i386 instructions. + */ + +#ifndef _MACHINE_CPUFUNC_H_ +#define _MACHINE_CPUFUNC_H_ + +#include <sys/cdefs.h> +#include <sys/types.h> + +#include <machine/spl.h> /* XXX belongs elsewhere */ + +#ifdef __GNUC__ + +#ifdef BDE_DEBUGGER +extern int bdb_exists; + +static __inline int +bdb(void) +{ + if (!bdb_exists) + return (0); + __asm __volatile("int $3"); + return (1); +} +#endif /* BDE_DEBUGGER */ + +static __inline void +disable_intr(void) +{ +#ifdef OSKIT + osenv_intr_disable(); +#else + __asm __volatile("cli" : : : "memory"); +#endif +} + +static __inline void +enable_intr(void) +{ +#ifdef OSKIT + osenv_intr_enable(); +#else + __asm __volatile("sti"); +#endif +} + +#define HAVE_INLINE_FFS + +static __inline int +ffs(int mask) +{ + int result; + /* + * bsfl turns out to be not all that slow on 486's. It can beaten + * using a binary search to reduce to 4 bits and then a table lookup, + * but only if the code is inlined and in the cache, and the code + * is quite large so inlining it probably busts the cache. + * + * Note that gcc-2's builtin ffs would be used if we didn't declare + * this inline or turn off the builtin. The builtin is faster but + * broken in gcc-2.4.5 and slower but working in gcc-2.5 and 2.6. + */ + __asm __volatile("testl %0,%0; je 1f; bsfl %0,%0; incl %0; 1:" + : "=r" (result) : "0" (mask)); + return (result); +} + +#if __GNUC__ < 2 + +#define inb(port) inbv(port) +#define outb(port, data) outbv(port, data) + +#else /* __GNUC >= 2 */ + +/* + * The following complications are to get around gcc not having a + * constraint letter for the range 0..255. We still put "d" in the + * constraint because "i" isn't a valid constraint when the port + * isn't constant. This only matters for -O0 because otherwise + * the non-working version gets optimized away. + * + * Use an expression-statement instead of a conditional expression + * because gcc-2.6.0 would promote the operands of the conditional + * and produce poor code for "if ((inb(var) & const1) == const2)". + */ +#define inb(port) ({ \ + u_char _data; \ + if (__builtin_constant_p((int) (port)) && (port) < 256ul) \ + _data = inbc(port); \ + else \ + _data = inbv(port); \ + _data; }) + +#define outb(port, data) \ + (__builtin_constant_p((int) (port)) && (port) < 256ul \ + ? outbc(port, data) : outbv(port, data)) + +static __inline u_char +inbc(u_int port) +{ + u_char data; + + __asm __volatile("inb %1,%0" : "=a" (data) : "id" ((u_short)(port))); + return (data); +} + +static __inline void +outbc(u_int port, u_char data) +{ + __asm __volatile("outb %0,%1" : : "a" (data), "id" ((u_short)(port))); +} + +#endif /* __GNUC <= 2 */ + +static __inline u_char +inbv(u_int port) +{ + u_char data; + /* + * We use %%dx and not %1 here because i/o is done at %dx and not at + * %edx, while gcc generates inferior code (movw instead of movl) + * if we tell it to load (u_short) port. + */ + __asm __volatile("inb %%dx,%0" : "=a" (data) : "d" (port)); + return (data); +} + +static __inline u_long +inl(u_int port) +{ + u_long data; + + __asm __volatile("inl %%dx,%0" : "=a" (data) : "d" (port)); + return (data); +} + +static __inline void +insb(u_int port, void *addr, size_t cnt) +{ + __asm __volatile("cld; rep; insb" + : : "d" (port), "D" (addr), "c" (cnt) + : "di", "cx", "memory"); +} + +static __inline void +insw(u_int port, void *addr, size_t cnt) +{ + __asm __volatile("cld; rep; insw" + : : "d" (port), "D" (addr), "c" (cnt) + : "di", "cx", "memory"); +} + +static __inline void +insl(u_int port, void *addr, size_t cnt) +{ + __asm __volatile("cld; rep; insl" + : : "d" (port), "D" (addr), "c" (cnt) + : "di", "cx", "memory"); +} + +static __inline u_short +inw(u_int port) +{ + u_short data; + + __asm __volatile("inw %%dx,%0" : "=a" (data) : "d" (port)); + return (data); +} + +static __inline unsigned +loadandclear(u_int *addr) +{ + u_int result; + + __asm __volatile("xorl %0,%0; xchgl %1,%0" + : "=&r" (result) : "m" (*addr)); + return (result); +} + +static __inline void +outbv(u_int port, u_char data) +{ + u_char al; + /* + * Use an unnecessary assignment to help gcc's register allocator. + * This make a large difference for gcc-1.40 and a tiny difference + * for gcc-2.6.0. For gcc-1.40, al had to be ``asm("ax")'' for + * best results. gcc-2.6.0 can't handle this. + */ + al = data; + __asm __volatile("outb %0,%%dx" : : "a" (al), "d" (port)); +} + +static __inline void +outl(u_int port, u_long data) +{ + /* + * outl() and outw() aren't used much so we haven't looked at + * possible micro-optimizations such as the unnecessary + * assignment for them. + */ + __asm __volatile("outl %0,%%dx" : : "a" (data), "d" (port)); +} + +static __inline void +outsb(u_int port, void *addr, size_t cnt) +{ + __asm __volatile("cld; rep; outsb" + : : "d" (port), "S" (addr), "c" (cnt) + : "si", "cx"); +} + +static __inline void +outsw(u_int port, void *addr, size_t cnt) +{ + __asm __volatile("cld; rep; outsw" + : : "d" (port), "S" (addr), "c" (cnt) + : "si", "cx"); +} + +static __inline void +outsl(u_int port, void *addr, size_t cnt) +{ + __asm __volatile("cld; rep; outsl" + : : "d" (port), "S" (addr), "c" (cnt) + : "si", "cx"); +} + +static __inline void +outw(u_int port, u_short data) +{ + __asm __volatile("outw %0,%%dx" : : "a" (data), "d" (port)); +} + +static __inline void +pmap_update(void) +{ + u_long temp; + /* + * This should be implemented as load_cr3(rcr3()) when load_cr3() + * is inlined. + */ + __asm __volatile("movl %%cr3, %0; movl %0, %%cr3" : "=r" (temp) + : : "memory"); +} + +static __inline u_long +rcr2(void) +{ + u_long data; + + __asm __volatile("movl %%cr2,%0" : "=r" (data)); + return (data); +} + +static __inline u_long +read_eflags(void) +{ + u_long ef; + + __asm __volatile("pushfl; popl %0" : "=r" (ef)); + return (ef); +} + +static __inline void +write_eflags(u_long ef) +{ + __asm __volatile("pushl %0; popfl" : : "r" (ef)); +} + +/* + * XXX queue stuff belongs elsewhere. + */ +struct quehead { + struct quehead *qh_link; + struct quehead *qh_rlink; +}; + +static __inline void +insque(void *a, void *b) +{ + struct quehead *element = (struct quehead *)a, + *head = (struct quehead *)b; + + element->qh_link = head->qh_link; + element->qh_rlink = head; + head->qh_link = element; + element->qh_link->qh_rlink = element; +} + +static __inline void +remque(void *a) +{ + struct quehead *element = (struct quehead *)a; + + element->qh_link->qh_rlink = element->qh_rlink; + element->qh_rlink->qh_link = element->qh_link; + element->qh_rlink = 0; +} + +#else /* !__GNUC__ */ + +int bdb __P((void)); +void disable_intr __P((void)); +void enable_intr __P((void)); +u_char inb __P((u_int port)); +u_long inl __P((u_int port)); +void insb __P((u_int port, void *addr, size_t cnt)); +void insl __P((u_int port, void *addr, size_t cnt)); +void insw __P((u_int port, void *addr, size_t cnt)); +u_short inw __P((u_int port)); +u_int loadandclear __P((u_int *addr)); +void outb __P((u_int port, u_char data)); +void outl __P((u_int port, u_long data)); +void outsb __P((u_int port, void *addr, size_t cnt)); +void outsl __P((u_int port, void *addr, size_t cnt)); +void outsw __P((u_int port, void *addr, size_t cnt)); +void outw __P((u_int port, u_short data)); +void pmap_update __P((void)); +u_long read_eflags __P((void)); +u_long rcr2 __P((void)); +void write_eflags __P((u_long ef)); + +void insque __P((void *a, void *b)); +void remque __P((void *a)); + +#endif /* __GNUC__ */ + +/* + * XXX the following declarations document garbage in support.s. + * gcc hasn't needed _divsi* for years. + * bcopy[bwx]() was used by pccons but isn't used now. + */ +int __divsi3 __P((int factor1, int factor2)); +u_int __udivsi3 __P((u_int factor1, u_int factor2)); +void bcopyb __P((const void *from, void *to, size_t len)); +void bcopyw __P((const void *from, void *to, size_t len)); +void bcopyx __P((const void *from, void *to, size_t len, + int stride)); + +#if 0 +/* + * These functions in support.s are declared elsewhere. + */ +void bcopy __P((const void *from, void *to, size_t len)); +void blkclr __P((void *buf, size_t len)); +void bzero __P((void *buf, size_t len)); +int copyin __P((void *udaddr, void *kaddr, size_t len)); +int copyinstr __P((void *udaddr, void *kaddr, size_t len, + size_t *lencopied)); +int copyout __P((void *kaddr, void *udaddr, size_t len)); +int copystr __P((void *kfaddr, void *kdaddr, size_t len, + size_t *lencopied)); +int fubyte __P((void *base)); +int fuswintr __P((void *base)); +int fuibyte __P((void *base)); +int fuword __P((void *base)); +struct region_descriptor; +void lgdt __P((struct region_descriptor *rdp)); +void lidt __P((struct region_descriptor *rdp)); +void lldt __P((u_short sel)); +/* + * longjmp() and setjmp() are only used by ddb. They probably shouldn't + * shouldn't be supported in the kernel. + */ +#include <setjmp.h> +void longjmp __P((jmp_buf jb, int rv)); +void ovbcopy __P((const void *from, void *to, size_t len); +int setjmp __P((jmp_buf jb)); +struct soft_segment_descriptor; +union descriptor; +int ssdtosd __P((struct soft_segment_descriptor *ssdp, + union descriptor *sdp)); +int subyte __P((void *base, int byte)); +int suibyte __P((void *base, int byte)); +int suswintr __P((void *base, int word)); +int suword __P((void *base, int word)); + +/* + * These functions in support.s are declared elsewhere, but never used. + * A silly amount of effort went into copyoutstr(). It's not worth + * maintaining, since the string length is usually known so copyout + * works better, or is easy to find so copyout() can be used. + */ +int copyoutstr __P((void *kaddr, void *udaddr, size_t len, + size_t *lencopied)); +int fuiword __P((void *base)); +int suiword __P((void *base, int word)); + +/* + * These functions in support.s are also in libkern.a and are declared in + * libkern.h. + * ffs() is built in to gcc-2 and was buggy in gcc-2.4.5 so we may may the + * buggy version if we don't replace it by an inline. + */ +int bcmp __P((const void *b1, const void *b2, size_t length)); +int ffs __P((int mask)); +#endif /* 0 */ + +/* + * These variables and functions in support.s are used. + */ +extern u_int atdevbase; /* offset in virtual memory of ISA io mem */ + +void filli __P((int pat, void *base, size_t cnt)); +void fillw __P((int /*u_short*/ pat, void *base, size_t cnt)); +int fusword __P((void *base)); +void load_cr0 __P((u_long cr0)); +void load_cr3 __P((u_long cr3)); +void ltr __P((u_short sel)); +u_int rcr0 __P((void)); +u_long rcr3 __P((void)); +int rtcin __P((int val)); + +/* + * These functions are NOT in support.s and should be declared elsewhere. + */ +void Debugger __P((const char *msg)); +u_long kvtop __P((void *addr)); +typedef void alias_for_inthand_t __P((u_int cs, u_int ef, u_int esp, + u_int ss)); +void setidt __P((int idx, alias_for_inthand_t *func, int typ, + int dpl, int selec)); + +#endif /* !_MACHINE_CPUFUNC_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/endian.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/endian.h new file mode 100644 index 00000000000..c804477311e --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/endian.h @@ -0,0 +1,119 @@ +/* + * Copyright (c) 1987, 1991 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: @(#)endian.h 7.8 (Berkeley) 4/3/91 + */ + +#ifndef _MACHINE_ENDIAN_H_ +#define _MACHINE_ENDIAN_H_ 1 + +/* + * Define the order of 32-bit words in 64-bit words. + */ +#define _QUAD_HIGHWORD 1 +#define _QUAD_LOWWORD 0 + +/* + * Definitions for byte order, according to byte significance from low + * address to high. + */ +#define LITTLE_ENDIAN 1234 /* LSB first: i386, vax */ +#define BIG_ENDIAN 4321 /* MSB first: 68000, ibm, net */ +#define PDP_ENDIAN 3412 /* LSB first in word, MSW first in long */ + +#define BYTE_ORDER LITTLE_ENDIAN + +#ifndef KERNEL +#include <sys/cdefs.h> +#endif + +#define __word_swap_long(x) \ +({ register u_long __X = (x); \ + __asm ("rorl $16, %1" \ + : "=r" (__X) \ + : "0" (__X)); \ + __X; }) +#if __GNUC__ >= 2 +#define __byte_swap_long(x) \ +__extension__ ({ register u_long __X = (x); \ + __asm ("xchgb %h1, %b1\n\trorl $16, %1\n\txchgb %h1, %b1" \ + : "=q" (__X) \ + : "0" (__X)); \ + __X; }) +#define __byte_swap_word(x) \ +__extension__ ({ register u_short __X = (x); \ + __asm ("xchgb %h1, %b1" \ + : "=q" (__X) \ + : "0" (__X)); \ + __X; }) +#else /* __GNUC__ >= 2 */ +#define __byte_swap_long(x) \ +({ register u_long __X = (x); \ + __asm ("rorw $8, %w1\n\trorl $16, %1\n\trorw $8, %w1" \ + : "=r" (__X) \ + : "0" (__X)); \ + __X; }) +#define __byte_swap_word(x) \ +({ register u_short __X = (x); \ + __asm ("rorw $8, %w1" \ + : "=r" (__X) \ + : "0" (__X)); \ + __X; }) +#endif /* __GNUC__ >= 2 */ + +/* + * Macros for network/external number representation conversion. + */ +#if BYTE_ORDER == BIG_ENDIAN && !defined(lint) +#define ntohl(x) (x) +#define ntohs(x) (x) +#define htonl(x) (x) +#define htons(x) (x) + +#define NTOHL(x) (x) +#define NTOHS(x) (x) +#define HTONL(x) (x) +#define HTONS(x) (x) + +#else + +#define ntohl __byte_swap_long +#define ntohs __byte_swap_word +#define htonl __byte_swap_long +#define htons __byte_swap_word + +#define NTOHL(x) (x) = ntohl((u_long)x) +#define NTOHS(x) (x) = ntohs((u_short)x) +#define HTONL(x) (x) = htonl((u_long)x) +#define HTONS(x) (x) = htons((u_short)x) +#endif +#endif /* _MACHINE_ENDIAN_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/ipl.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/ipl.h new file mode 100644 index 00000000000..f006d9551b6 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/ipl.h @@ -0,0 +1,41 @@ +/*- + * Copyright (c) 1993 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +#ifndef _ISA_IPL_H_ +#define _ISA_IPL_H_ + +#define NHWI 16 /* number of h/w interrupts */ +#define HWI_MASK 0xffff /* bits corresponding to h/w interrupts */ + +#endif /* _ISA_IPL_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/limits.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/limits.h new file mode 100644 index 00000000000..f90ed760fcc --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/limits.h @@ -0,0 +1,96 @@ +/* + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)limits.h 8.3 (Berkeley) 1/4/94 + */ + +#ifndef _MACHINE_LIMITS_H_ +#define _MACHINE_LIMITS_H_ + +#define CHAR_BIT 8 /* number of bits in a char */ +#ifndef __REACTOS__ +#define MB_LEN_MAX 6 /* Allow 31 bit UTF2 */ +#endif + +/* + * According to ANSI (section 2.2.4.2), the values below must be usable by + * #if preprocessing directives. Additionally, the expression must have the + * same type as would an expression that is an object of the corresponding + * type converted according to the integral promotions. The subtraction for + * INT_MIN and LONG_MIN is so the value is not unsigned; 2147483648 is an + * unsigned int for 32-bit two's complement ANSI compilers (section 3.1.3.2). + * These numbers work for pcc as well. The UINT_MAX and ULONG_MAX values + * are written as hex so that GCC will be quiet about large integer constants. + */ +#define SCHAR_MAX 127 /* min value for a signed char */ +#define SCHAR_MIN (-128) /* max value for a signed char */ + +#define UCHAR_MAX 255 /* max value for an unsigned char */ +#ifndef __REACTOS__ +#define CHAR_MAX 127 /* max value for a char */ +#define CHAR_MIN (-128) /* min value for a char */ +#endif + +#ifndef SHRT_MAX +#define USHRT_MAX 65535 /* max value for an unsigned short */ +#define SHRT_MAX 32767 /* max value for a short */ +#define SHRT_MIN (-32768) /* min value for a short */ +#endif + +#ifndef INT_MAX +#define UINT_MAX 0xffffffff /* max value for an unsigned int */ +#define INT_MAX 2147483647 /* max value for an int */ +#define INT_MIN (-2147483647-1) /* min value for an int */ +#endif + +#ifndef LONG_MAX +#define ULONG_MAX 0xffffffff /* max value for an unsigned long */ +#define LONG_MAX 2147483647 /* max value for a long */ +#define LONG_MIN (-2147483647-1) /* min value for a long */ +#endif + +#if !defined(_ANSI_SOURCE) +#define SSIZE_MAX INT_MAX /* max value for a ssize_t */ + +#if !defined(_POSIX_SOURCE) +#define SIZE_T_MAX UINT_MAX /* max value for a size_t */ + +/* GCC requires that quad constants be written as expressions. */ +#define UQUAD_MAX ((u_quad_t)0-1) /* max value for a uquad_t */ + /* max value for a quad_t */ +#define QUAD_MAX ((quad_t)(UQUAD_MAX >> 1)) +#define QUAD_MIN (-QUAD_MAX-1) /* min value for a quad_t */ + +#endif /* !_POSIX_SOURCE */ +#endif /* !_ANSI_SOURCE */ + +#endif /* !_MACHINE_LIMITS_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/param.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/param.h new file mode 100644 index 00000000000..3926e8d380b --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/param.h @@ -0,0 +1,161 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: @(#)param.h 5.8 (Berkeley) 6/28/91 + */ + +#ifndef _MACHINE_PARAM_H_ +#define _MACHINE_PARAM_H_ + +/* + * Machine dependent constants for Intel 386. + */ + +#define MACHINE "i386" +#define MID_MACHINE MID_I386 + +/* + * Round p (pointer or byte index) up to a correctly-aligned value + * for all data types (int, long, ...). The result is unsigned int + * and must be cast to any desired pointer type. + */ +#define ALIGNBYTES (sizeof(int) - 1) +#define ALIGN(p) (((unsigned)(p) + ALIGNBYTES) & ~ALIGNBYTES) + +#ifndef PAGE_SIZE +/* XXX PGSHIFT and PG_SHIFT are two names for the same thing */ +#define PGSHIFT 12 /* LOG2(NBPG) */ +#define PAGE_SHIFT 12 +#define NBPG (1 << PAGE_SHIFT) /* bytes/page */ +#define PAGE_SIZE (1 << PAGE_SHIFT) +#define PAGE_MASK (PAGE_SIZE-1) +#define PGOFSET (NBPG-1) /* byte offset into page */ +#define NPTEPG (NBPG/(sizeof (pt_entry_t))) +#endif + +/* XXX PDRSHIFT and PD_SHIFT are two names for the same thing */ +#define PDRSHIFT 22 /* LOG2(NBPDR) */ +#define NBPDR (1 << PDRSHIFT) /* bytes/page dir */ +#define PDROFSET (NBPDR-1) /* byte offset into page dir */ + +/* + * XXX This should really be KPTDPTDI << PDRSHIFT, but since KPTDPTDI is + * defined in pmap.h which is included after this we can't do that + * (YET!) + */ +#define BTOPKERNBASE (KERNBASE >> PGSHIFT) + +#define DEV_BSHIFT 9 /* log2(DEV_BSIZE) */ +#define DEV_BSIZE (1 << DEV_BSHIFT) + +#define BLKDEV_IOSIZE 2048 +#define MAXPHYS (64 * 1024) /* max raw I/O transfer size */ + +#define CLSIZELOG2 0 +#define CLSIZE (1 << CLSIZELOG2) + +/* NOTE: SSIZE, SINCR and UPAGES must be multiples of CLSIZE */ +#define SSIZE 1 /* initial stack size/NBPG */ +#define SINCR 1 /* increment of stack/NBPG */ + +#define UPAGES 2 /* pages of u-area */ + +/* + * Constants related to network buffer management. + * MCLBYTES must be no larger than CLBYTES (the software page size), and, + * on machines that exchange pages of input or output buffers with mbuf + * clusters (MAPPED_MBUFS), MCLBYTES must also be an integral multiple + * of the hardware page size. + */ +#ifndef MSIZE +#define MSIZE 128 /* size of an mbuf */ +#endif /* MSIZE */ + +#ifndef MCLSHIFT +#define MCLSHIFT 11 /* convert bytes to m_buf clusters */ +#endif /* MCLSHIFT */ +#define MCLBYTES (1 << MCLSHIFT) /* size of an m_buf cluster */ +#define MCLOFSET (MCLBYTES - 1) /* offset within an m_buf cluster */ + +/* + * Some macros for units conversion + */ +/* Core clicks (4096 bytes) to segments and vice versa */ +#define ctos(x) (x) +#define stoc(x) (x) + +/* Core clicks (4096 bytes) to disk blocks */ +#define ctod(x) ((x)<<(PGSHIFT-DEV_BSHIFT)) +#define dtoc(x) ((x)>>(PGSHIFT-DEV_BSHIFT)) +#define dtob(x) ((x)<<DEV_BSHIFT) + +/* clicks to bytes */ +#define ctob(x) ((x)<<PGSHIFT) + +/* bytes to clicks */ +#define btoc(x) (((unsigned)(x)+(NBPG-1))>>PGSHIFT) + +/* + * This is messy and perhaps slow because `bytes' may be an off_t. We + * have to shift an unsigned type to avoid sign extension and we don't + * want to widen `bytes' unnecessarily. Assume that off_t is long long + * and daddr_t is unsigned long. + */ +#define btodb(bytes) /* calculates (bytes / DEV_BSIZE) */ \ + (sizeof (bytes) > sizeof(long) \ + ? (unsigned long)((unsigned long long)(bytes) >> DEV_BSHIFT) \ + : (unsigned long)((unsigned long)(bytes) >> DEV_BSHIFT)) +#define dbtob(db) /* calculates (db * DEV_BSIZE) */ \ + ((unsigned long long)(db) << DEV_BSHIFT) + +/* + * Mach derived conversion macros + */ +#define trunc_page(x) ((unsigned)(x) & ~(NBPG-1)) +#define round_page(x) ((((unsigned)(x)) + NBPG - 1) & ~(NBPG-1)) + +#define atop(x) ((unsigned)(x) >> PG_SHIFT) +#define ptoa(x) ((unsigned)(x) << PG_SHIFT) + +#define i386_round_pdr(x) ((((unsigned)(x)) + NBPDR - 1) & ~(NBPDR-1)) +#define i386_trunc_pdr(x) ((unsigned)(x) & ~(NBPDR-1)) +#define i386_round_page(x) ((((unsigned)(x)) + NBPG - 1) & ~(NBPG-1)) +#define i386_trunc_page(x) ((unsigned)(x) & ~(NBPG-1)) +#define i386_btod(x) ((unsigned)(x) >> PDRSHIFT) +#define i386_dtob(x) ((unsigned)(x) << PDRSHIFT) +#define i386_btop(x) ((unsigned)(x) >> PGSHIFT) +#define i386_ptob(x) ((unsigned)(x) << PGSHIFT) + +#endif /* !_MACHINE_PARAM_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/proc.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/proc.h new file mode 100644 index 00000000000..583b10e2bd9 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/proc.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 1991 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: @(#)proc.h 7.1 (Berkeley) 5/15/91 + */ + +#ifndef _MACHINE_PROC_H_ +#define _MACHINE_PROC_H_ 1 + +/* + * Machine-dependent part of the proc structure for i386. + */ +struct mdproc { + int md_flags; /* machine-dependent flags */ + int *md_regs; /* registers on current frame */ +}; + +/* md_flags */ +#define MDP_AST 0x0001 /* async trap pending */ +#endif /* _MACHINE_PROC_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/signal.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/signal.h new file mode 100644 index 00000000000..e1ede966902 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/signal.h @@ -0,0 +1,80 @@ +/* + * Copyright (c) 1986, 1989, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)signal.h 8.1 (Berkeley) 6/11/93 + */ + +#ifndef _I386_MACHINE_SIGNAL_H_ +#define _I386_MACHINE_SIGNAL_H_ + +/* + * Machine-dependent signal definitions + */ + +typedef int sig_atomic_t; + +#ifndef _POSIX_SOURCE +#include <machine/trap.h> /* codes for SIGILL, SIGFPE */ +#endif + +/* + * Information pushed on stack when a signal is delivered. + * This is used by the kernel to restore state following + * execution of the signal handler. It is also made available + * to the handler to allow it to restore state properly if + * a non-standard exit is performed. + */ +struct sigcontext { + int sc_onstack; /* sigstack state to restore */ + int sc_mask; /* signal mask to restore */ + int sc_esp; /* machine state */ + int sc_ebp; + int sc_isp; + int sc_eip; + int sc_efl; + int sc_es; + int sc_ds; + int sc_cs; + int sc_ss; + int sc_edi; + int sc_esi; + int sc_ebx; + int sc_edx; + int sc_ecx; + int sc_eax; +# define sc_sp sc_esp +# define sc_fp sc_ebp +# define sc_pc sc_eip +# define sc_ps sc_efl +}; + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/spl.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/spl.h new file mode 100644 index 00000000000..578a36e5b9a --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/spl.h @@ -0,0 +1,221 @@ +/* + * Copyright (c) 1996-1999 University of Utah and the Flux Group. + * All rights reserved. + * + * This file is part of the Flux OSKit. The OSKit is free software, also known + * as "open source;" you can redistribute it and/or modify it under the terms + * of the GNU General Public License (GPL), version 2, as published by the Free + * Software Foundation (FSF). To explore alternate licensing terms, contact + * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. + * + * The OSKit 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 GPL for more details. You should have + * received a copy of the GPL along with the OSKit; see the file COPYING. If + * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. + */ +/*- + * Copyright (c) 1993 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +#ifndef _MACHINE_IPL_H_ +#define _MACHINE_IPL_H_ + +#include <machine/ipl.h> /* XXX "machine" means cpu for i386 */ + +/* + * Software interrupt bit numbers in priority order. The priority only + * determines which swi will be dispatched next; a higher priority swi + * may be dispatched when a nested h/w interrupt handler returns. + */ +#define SWI_TTY (NHWI + 0) +#define SWI_NET (NHWI + 1) +#define SWI_CLOCK 30 +#define SWI_AST 31 + +/* + * Corresponding interrupt-pending bits for ipending. + */ +#define SWI_TTY_PENDING (1 << SWI_TTY) +#define SWI_NET_PENDING (1 << SWI_NET) +#define SWI_CLOCK_PENDING (1 << SWI_CLOCK) +#define SWI_AST_PENDING (1 << SWI_AST) + +/* + * Corresponding interrupt-disable masks for cpl. The ordering is now by + * inclusion (where each mask is considered as a set of bits). Everything + * except SWI_AST_MASK includes SWI_CLOCK_MASK so that softclock() doesn't + * run while other swi handlers are running and timeout routines can call + * swi handlers. Everything includes SWI_AST_MASK so that AST's are masked + * until just before return to user mode. SWI_TTY_MASK includes SWI_NET_MASK + * in case tty interrupts are processed at splsofttty() for a tty that is in + * SLIP or PPP line discipline (this is weaker than merging net_imask with + * tty_imask in isa.c - splimp() must mask hard and soft tty interrupts, but + * spltty() apparently only needs to mask soft net interrupts). + */ +#define SWI_TTY_MASK (SWI_TTY_PENDING | SWI_CLOCK_MASK | SWI_NET_MASK) +#define SWI_NET_MASK (SWI_NET_PENDING | SWI_CLOCK_MASK) +#define SWI_CLOCK_MASK (SWI_CLOCK_PENDING | SWI_AST_MASK) +#define SWI_AST_MASK SWI_AST_PENDING +#define SWI_MASK (~HWI_MASK) + +#ifdef OSKIT +#include "osenv.h" + +extern unsigned oskit_freebsd_cpl; +extern unsigned oskit_freebsd_ipending; + +#define GENERIC_SPL(you_name_it) \ +static __inline int spl##you_name_it(void) \ +{ \ + int t; \ + osenv_intr_disable(); \ + t = oskit_freebsd_cpl; \ + oskit_freebsd_cpl = 1; \ + return t; \ +} + +GENERIC_SPL(imp) +GENERIC_SPL(net) +GENERIC_SPL(bio) +GENERIC_SPL(high) +GENERIC_SPL(clock) +GENERIC_SPL(tty) +GENERIC_SPL(softtty) +/* + * this is used to reduce the clock spl to a softclock spl before + * calling the softclock handler directly. It will never call splx! + */ +#define splsoftclock() 0 + +static __inline void splx(int x) +{ + if (x == 0) { + oskit_freebsd_cpl = 0; + osenv_intr_enable(); + } +} + +/* for code from NetBSD */ +#define spl0() splx(0) + +#define setsoftclock() (oskit_freebsd_ipending |= SWI_CLOCK_PENDING) +#define setsofttty() (oskit_freebsd_ipending |= SWI_TTY_PENDING) + +#define schedsofttty() (oskit_freebsd_ipending |= SWI_TTY_PENDING) + +/* + * functions to save and restore the current cpl + */ +static __inline void save_cpl(unsigned *x) +{ + *x = oskit_freebsd_cpl; +} + +static __inline void restore_cpl(unsigned x) +{ + oskit_freebsd_cpl = x; +} + +#else /* !OSKIT */ +#ifndef LOCORE + +extern unsigned bio_imask; /* group of interrupts masked with splbio() */ +extern unsigned cpl; /* current priority level mask */ +extern volatile unsigned idelayed; /* interrupts to become pending */ +extern volatile unsigned ipending; /* active interrupts masked by cpl */ +extern unsigned net_imask; /* group of interrupts masked with splimp() */ +extern unsigned stat_imask; /* interrupts masked with splstatclock() */ +extern unsigned tty_imask; /* group of interrupts masked with spltty() */ + +/* + * ipending has to be volatile so that it is read every time it is accessed + * in splx() and spl0(), but we don't want it to be read nonatomically when + * it is changed. Pretending that ipending is a plain int happens to give + * suitable atomic code for "ipending |= constant;". + */ +#define setdelayed() (*(unsigned *)&ipending |= loadandclear(&idelayed)) +#define setsoftast() (*(unsigned *)&ipending |= SWI_AST_PENDING) +#define setsoftclock() (*(unsigned *)&ipending |= SWI_CLOCK_PENDING) +#define setsoftnet() (*(unsigned *)&ipending |= SWI_NET_PENDING) +#define setsofttty() (*(unsigned *)&ipending |= SWI_TTY_PENDING) + +#define schedsofttty() (*(unsigned *)&idelayed |= SWI_TTY_PENDING) + +#ifdef __GNUC__ + +void splz __P((void)); + +#define GENSPL(name, set_cpl) \ +static __inline int name(void) \ +{ \ + unsigned x; \ + \ + __asm __volatile("" : : : "memory"); \ + x = cpl; \ + set_cpl; \ + return (x); \ +} + +GENSPL(splbio, cpl |= bio_imask) +GENSPL(splclock, cpl = HWI_MASK | SWI_MASK) +GENSPL(splhigh, cpl = HWI_MASK | SWI_MASK) +GENSPL(splimp, cpl |= net_imask) +GENSPL(splnet, cpl |= SWI_NET_MASK) +GENSPL(splsoftclock, cpl = SWI_CLOCK_MASK) +GENSPL(splsofttty, cpl |= SWI_TTY_MASK) +GENSPL(splstatclock, cpl |= stat_imask) +GENSPL(spltty, cpl |= tty_imask) + +static __inline void +spl0(void) +{ + cpl = SWI_AST_MASK; + if (ipending & ~SWI_AST_MASK) + splz(); +} + +static __inline void +splx(int ipl) +{ + cpl = ipl; + if (ipending & ~ipl) + splz(); +} + +#endif /* __GNUC__ */ + +#endif /* !LOCORE */ +#endif /* !OSKIT */ + +#endif /* !_MACHINE_IPL_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/stdarg.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/stdarg.h new file mode 100644 index 00000000000..64014667714 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/stdarg.h @@ -0,0 +1,63 @@ +/*- + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)stdarg.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _STDARG_H_ +#define _STDARG_H_ + +typedef char *va_list; + +#ifdef __GNUC__ +#define va_start(AP, LASTARG) \ + (AP = ((va_list) __builtin_next_arg (LASTARG))) +#else +#define __va_promote(type) \ + (((sizeof(type) + sizeof(int) - 1) / sizeof(int)) * sizeof(int)) + +#define va_start(ap, last) \ + (ap = ((va_list)&(last) + __va_promote(last))) +#endif + +#ifdef KERNEL +#define va_arg(ap, type) \ + ((type *)(ap += sizeof(type)))[-1] +#else +#define va_arg(ap, type) \ + ((type *)(ap += sizeof(type) < sizeof(int) ? \ + (abort(), 0) : sizeof(type)))[-1] +#endif + +#define va_end(ap) + +#endif /* !_STDARG_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/trap.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/trap.h new file mode 100644 index 00000000000..bd136824224 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/trap.h @@ -0,0 +1,95 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: @(#)trap.h 5.4 (Berkeley) 5/9/91 + */ + +#ifndef _MACHINE_TRAP_H_ +#define _MACHINE_TRAP_H_ + +/* + * Trap type values + * also known in trap.c for name strings + */ + +#define T_PRIVINFLT 1 /* privileged instruction */ +#define T_BPTFLT 3 /* breakpoint instruction */ +#define T_ARITHTRAP 6 /* arithmetic trap */ +#define T_ASTFLT 7 /* system forced exception */ +#define T_PROTFLT 9 /* protection fault */ +#define T_TRCTRAP 10 /* debug exception (sic) */ +#define T_PAGEFLT 12 /* page fault */ +#define T_ALIGNFLT 14 /* alignment fault */ + +#define T_DIVIDE 18 /* integer divide fault */ +#define T_NMI 19 /* non-maskable trap */ +#define T_OFLOW 20 /* overflow trap */ +#define T_BOUND 21 /* bound instruction fault */ +#define T_DNA 22 /* device not available fault */ +#define T_DOUBLEFLT 23 /* double fault */ +#define T_FPOPFLT 24 /* fp coprocessor operand fetch fault */ +#define T_TSSFLT 25 /* invalid tss fault */ +#define T_SEGNPFLT 26 /* segment not present fault */ +#define T_STKFLT 27 /* stack fault */ +#define T_RESERVED 28 /* reserved (unknown) */ + +/* XXX most of the following codes aren't used, but could be. */ + +/* definitions for <sys/signal.h> */ +#define ILL_RESAD_FAULT T_RESADFLT +#define ILL_PRIVIN_FAULT T_PRIVINFLT +#define ILL_RESOP_FAULT T_RESOPFLT +#define ILL_ALIGN_FAULT T_ALIGNFLT +#define ILL_FPOP_FAULT T_FPOPFLT /* coprocessor operand fault */ + +/* codes for SIGFPE/ARITHTRAP */ +#define FPE_INTOVF_TRAP 0x1 /* integer overflow */ +#define FPE_INTDIV_TRAP 0x2 /* integer divide by zero */ +#define FPE_FLTDIV_TRAP 0x3 /* floating/decimal divide by zero */ +#define FPE_FLTOVF_TRAP 0x4 /* floating overflow */ +#define FPE_FLTUND_TRAP 0x5 /* floating underflow */ +#define FPE_FPU_NP_TRAP 0x6 /* floating point unit not present */ +#define FPE_SUBRNG_TRAP 0x7 /* subrange out of bounds */ + +/* codes for SIGBUS */ +#define BUS_PAGE_FAULT T_PAGEFLT /* page fault protection base */ +#define BUS_SEGNP_FAULT T_SEGNPFLT /* segment not present */ +#define BUS_STK_FAULT T_STKFLT /* stack segment */ +#define BUS_SEGM_FAULT T_RESERVED /* segment protection base */ + +/* Trap's coming from user mode */ +#define T_USER 0x100 + +#endif /* !_MACHINE_TRAP_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/types.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/types.h new file mode 100644 index 00000000000..dcbb29c08fe --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/types.h @@ -0,0 +1,65 @@ +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)types.h 8.3 (Berkeley) 1/5/94 + */ + +#ifndef _MACHTYPES_H_ +#define _MACHTYPES_H_ + +#if !defined(_ANSI_SOURCE) && !defined(_POSIX_SOURCE) +typedef struct _physadr { + int r[1]; +} *physadr; + +typedef struct label_t { + int val[6]; +} label_t; +#endif + +typedef unsigned long vm_offset_t; +typedef unsigned long vm_size_t; + +/* + * Basic integral types. Omit the typedef if + * not possible for a machine/compiler combination. + */ +typedef __signed char int8_t; +typedef unsigned char u_int8_t; +typedef short int16_t; +typedef unsigned short u_int16_t; +typedef int int32_t; +typedef unsigned int u_int32_t; +typedef long long int64_t; +typedef unsigned long long u_int64_t; + +#endif /* _MACHTYPES_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/vmparam.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/vmparam.h new file mode 100644 index 00000000000..d5944b3d62b --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/machine/vmparam.h @@ -0,0 +1,136 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * Copyright (c) 1994 John S. Dyson + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: @(#)vmparam.h 5.9 (Berkeley) 5/12/91 + */ + + +#ifndef _MACHINE_VMPARAM_H_ +#define _MACHINE_VMPARAM_H_ 1 + +/* + * Machine dependent constants for 386. + */ + +/* + * Virtual memory related constants, all in bytes + */ +#define MAXTSIZ (16UL*1024*1024) /* max text size */ +#ifndef DFLDSIZ +#define DFLDSIZ (64UL*1024*1024) /* initial data size limit */ +#endif +#ifndef MAXDSIZ +#define MAXDSIZ (128UL*1024*1024) /* max data size */ +#endif +#ifndef DFLSSIZ +#define DFLSSIZ (8UL*1024*1024) /* initial stack size limit */ +#endif +#ifndef MAXSSIZ +#define MAXSSIZ (64UL*1024*1024) /* max stack size */ +#endif +#ifndef SGROWSIZ +#define SGROWSIZ (128UL*1024) /* amount to grow stack */ +#endif + +#define USRTEXT (1*NBPG) /* base of user text XXX bogus */ + +/* + * Default sizes of swap allocation chunks (see dmap.h). + * The actual values may be changed in vminit() based on MAXDSIZ. + * With MAXDSIZ of 16Mb and NDMAP of 38, dmmax will be 1024. + */ +#define DMMIN 32 /* smallest swap allocation */ +#define DMMAX 4096 /* largest potential swap allocation */ +#define DMTEXT 1024 /* swap allocation for text */ + +/* + * Sizes of the system and user portions of the system page table. + */ +#define SYSPTSIZE (2*NPTEPG) +#define USRPTSIZE (2*NPTEPG) + +/* + * Size of the Shared Memory Pages page table. + */ +#ifndef SHMMAXPGS +#define SHMMAXPGS 1024 /* XXX until we have more kmap space */ +#endif + +/* + * Size of User Raw I/O map + */ +#define USRIOSIZE 1024 + +/* + * The time for a process to be blocked before being very swappable. + * This is a number of seconds which the system takes as being a non-trivial + * amount of real time. You probably shouldn't change this; + * it is used in subtle ways (fractions and multiples of it are, that is, like + * half of a ``long time'', almost a long time, etc.) + * It is related to human patience and other factors which don't really + * change over time. + */ +#define MAXSLP 20 + +/* + * Mach derived constants + */ + +/* user/kernel map constants */ +#ifdef OSKIT +#define KERNBASE 0 /* XXX */ +#else +#define KERNBASE ((0x400-1-NKPDE)*(NBPG*NPTEPG)) +#endif + +#define VM_MIN_ADDRESS ((vm_offset_t)0) +#define VM_MAXUSER_ADDRESS ((vm_offset_t)KERNBASE - (NBPG*(NPTEPG+UPAGES))) +#define USRSTACK VM_MAXUSER_ADDRESS +#define UPT_MIN_ADDRESS ((vm_offset_t)KERNBASE - (NBPG*NPTEPG)) +#define UPT_MAX_ADDRESS ((vm_offset_t)KERNBASE - (NBPG*(NKPDE+2))) +#define VM_MAX_ADDRESS UPT_MAX_ADDRESS +#define VM_MIN_KERNEL_ADDRESS ((vm_offset_t)KERNBASE - (NBPG*(NKPDE+2))) +#define UPDT VM_MIN_KERNEL_ADDRESS +#define KPT_MIN_ADDRESS ((vm_offset_t)KERNBASE - NBPG*(NKPDE+1)) +#define KPT_MAX_ADDRESS ((vm_offset_t)KERNBASE - NBPG) +#define VM_MAX_KERNEL_ADDRESS ((vm_offset_t)KERNBASE + NKPDE*NBPG*NPTEPG) + +/* virtual sizes (bytes) for various kernel submaps */ +#define VM_KMEM_SIZE (32 * 1024 * 1024) +#define VM_PHYS_SIZE (USRIOSIZE*CLBYTES) + +#endif /* _MACHINE_VMPARAM_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/net/if.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/net/if.h new file mode 100644 index 00000000000..aca7de714cb --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/net/if.h @@ -0,0 +1,394 @@ +/* + * Copyright (c) 1982, 1986, 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)if.h 8.1 (Berkeley) 6/10/93 + * $\Id: if.h,v 1.18.4.1 1996/06/24 22:04:13 gpalmer Exp $ + */ + +#ifndef _NET_IF_H_ +#define _NET_IF_H_ + +/* + * Structures defining a network interface, providing a packet + * transport mechanism (ala level 0 of the PUP protocols). + * + * Each interface accepts output datagrams of a specified maximum + * length, and provides higher level routines with input datagrams + * received from its medium. + * + * Output occurs when the routine if_output is called, with three parameters: + * (*ifp->if_output)(ifp, m, dst, rt) + * Here m is the mbuf chain to be sent and dst is the destination address. + * The output routine encapsulates the supplied datagram if necessary, + * and then transmits it on its medium. + * + * On input, each interface unwraps the data received by it, and either + * places it on the input queue of a internetwork datagram routine + * and posts the associated software interrupt, or passes the datagram to a raw + * packet input routine. + * + * Routines exist for locating interfaces by their addresses + * or for locating a interface on a certain network, as well as more general + * routing and gateway routines maintaining information used to locate + * interfaces. These routines live in the files if.c and route.c + */ + +#include <sys/socket.h> /* for struct sockaddr */ + +#ifndef _TIME_ /* XXX fast fix for SNMP, going away soon */ +#include <sys/time.h> +#endif + +#ifdef __STDC__ +/* + * Forward structure declarations for function prototypes [sic]. + */ +struct mbuf; +struct proc; +struct rtentry; +struct socket; +struct ether_header; +#endif +/* + * Structure describing information about an interface + * which may be of interest to management entities. + */ +/* + * Structure defining a queue for a network interface. + * + * (Would like to call this struct ``if'', but C isn't PL/1.) + */ + +struct ifnet { + char *if_name; /* name, e.g. ``en'' or ``lo'' */ + struct ifnet *if_next; /* all struct ifnets are chained */ + struct ifaddr *if_addrlist; /* linked list of addresses per if */ + int if_pcount; /* number of promiscuous listeners */ + caddr_t if_bpf; /* packet filter structure */ + u_short if_index; /* numeric abbreviation for this if */ + short if_unit; /* sub-unit for lower level driver */ + short if_timer; /* time 'til if_watchdog called */ + short if_flags; /* up/down, broadcast, etc. */ + struct if_data { +/* generic interface information */ + u_char ifi_type; /* ethernet, tokenring, etc */ + u_char ifi_physical; /* e.g., AUI, Thinnet, 10base-T, etc */ + u_char ifi_addrlen; /* media address length */ + u_char ifi_hdrlen; /* media header length */ + u_long ifi_mtu; /* maximum transmission unit */ + u_long ifi_metric; /* routing metric (external only) */ + u_long ifi_baudrate; /* linespeed */ +/* volatile statistics */ + u_long ifi_ipackets; /* packets received on interface */ + u_long ifi_ierrors; /* input errors on interface */ + u_long ifi_opackets; /* packets sent on interface */ + u_long ifi_oerrors; /* output errors on interface */ + u_long ifi_collisions; /* collisions on csma interfaces */ + u_long ifi_ibytes; /* total number of octets received */ + u_long ifi_obytes; /* total number of octets sent */ + u_long ifi_imcasts; /* packets received via multicast */ + u_long ifi_omcasts; /* packets sent via multicast */ + u_long ifi_iqdrops; /* dropped on input, this interface */ + u_long ifi_noproto; /* destined for unsupported protocol */ + struct timeval ifi_lastchange;/* time of last administrative change */ + } if_data; +/* procedure handles */ + void (*if_init) /* init routine */ + __P((int)); + int (*if_output) /* output routine (enqueue) */ + __P((struct ifnet *, struct mbuf *, struct sockaddr *, + struct rtentry *)); + void (*if_start) /* initiate output routine */ + __P((struct ifnet *)); + int (*if_done) /* output complete routine */ + __P((struct ifnet *)); /* (XXX not used; fake prototype) */ + int (*if_ioctl) /* ioctl routine */ + __P((struct ifnet *, int, caddr_t)); + void (*if_reset) + __P((int)); /* new autoconfig will permit removal */ + void (*if_watchdog) /* timer routine */ + __P((int)); + struct ifqueue { + struct mbuf *ifq_head; + struct mbuf *ifq_tail; + int ifq_len; + int ifq_maxlen; + int ifq_drops; + } if_snd; /* output queue */ +}; +#define if_mtu if_data.ifi_mtu +#define if_type if_data.ifi_type +#define if_physical if_data.ifi_physical +#define if_addrlen if_data.ifi_addrlen +#define if_hdrlen if_data.ifi_hdrlen +#define if_metric if_data.ifi_metric +#define if_baudrate if_data.ifi_baudrate +#define if_ipackets if_data.ifi_ipackets +#define if_ierrors if_data.ifi_ierrors +#define if_opackets if_data.ifi_opackets +#define if_oerrors if_data.ifi_oerrors +#define if_collisions if_data.ifi_collisions +#define if_ibytes if_data.ifi_ibytes +#define if_obytes if_data.ifi_obytes +#define if_imcasts if_data.ifi_imcasts +#define if_omcasts if_data.ifi_omcasts +#define if_iqdrops if_data.ifi_iqdrops +#define if_noproto if_data.ifi_noproto +#define if_lastchange if_data.ifi_lastchange +#define if_rawoutput(if, m, sa) if_output(if, m, sa, (struct rtentry *)0) + +#define IFF_UP 0x1 /* interface is up */ +#define IFF_BROADCAST 0x2 /* broadcast address valid */ +#define IFF_DEBUG 0x4 /* turn on debugging */ +#define IFF_LOOPBACK 0x8 /* is a loopback net */ +#define IFF_POINTOPOINT 0x10 /* interface is point-to-point link */ +#define IFF_NOTRAILERS 0x20 /* avoid use of trailers */ +#define IFF_RUNNING 0x40 /* resources allocated */ +#define IFF_NOARP 0x80 /* no address resolution protocol */ +#define IFF_PROMISC 0x100 /* receive all packets */ +#define IFF_ALLMULTI 0x200 /* receive all multicast packets */ +#define IFF_OACTIVE 0x400 /* transmission in progress */ +#define IFF_SIMPLEX 0x800 /* can't hear own transmissions */ +#define IFF_LINK0 0x1000 /* per link layer defined bit */ +#define IFF_LINK1 0x2000 /* per link layer defined bit */ +#define IFF_LINK2 0x4000 /* per link layer defined bit */ +#define IFF_ALTPHYS IFF_LINK2 /* use alternate physical connection */ +#define IFF_MULTICAST 0x8000 /* supports multicast */ + +/* flags set internally only: */ +#define IFF_CANTCHANGE \ + (IFF_BROADCAST|IFF_POINTOPOINT|IFF_RUNNING|IFF_OACTIVE|\ + IFF_SIMPLEX|IFF_MULTICAST|IFF_ALLMULTI) + + +/* + * These really don't belong here, but there's no other obviously appropriate + * location. + */ +#define IFP_AUI 0 +#define IFP_10BASE2 1 +#define IFP_10BASET 2 +/* etc. */ + +/* + * Output queues (ifp->if_snd) and internetwork datagram level (pup level 1) + * input routines have queues of messages stored on ifqueue structures + * (defined above). Entries are added to and deleted from these structures + * by these macros, which should be called with ipl raised to splimp(). + */ +#define IF_QFULL(ifq) ((ifq)->ifq_len >= (ifq)->ifq_maxlen) +#define IF_DROP(ifq) ((ifq)->ifq_drops++) +#define IF_ENQUEUE(ifq, m) { \ + (m)->m_nextpkt = 0; \ + if ((ifq)->ifq_tail == 0) \ + (ifq)->ifq_head = m; \ + else \ + (ifq)->ifq_tail->m_nextpkt = m; \ + (ifq)->ifq_tail = m; \ + (ifq)->ifq_len++; \ +} +#define IF_PREPEND(ifq, m) { \ + (m)->m_nextpkt = (ifq)->ifq_head; \ + if ((ifq)->ifq_tail == 0) \ + (ifq)->ifq_tail = (m); \ + (ifq)->ifq_head = (m); \ + (ifq)->ifq_len++; \ +} +#define IF_DEQUEUE(ifq, m) { \ + (m) = (ifq)->ifq_head; \ + if (m) { \ + if (((ifq)->ifq_head = (m)->m_nextpkt) == 0) \ + (ifq)->ifq_tail = 0; \ + (m)->m_nextpkt = 0; \ + (ifq)->ifq_len--; \ + } \ +} + +#define IFQ_MAXLEN 50 +#define IFNET_SLOWHZ 1 /* granularity is 1 second */ + +#ifndef __REACTOS__ +/* + * The ifaddr structure contains information about one address + * of an interface. They are maintained by the different address families, + * are allocated and attached when an address is set, and are linked + * together so all addresses for an interface can be located. + */ +struct ifaddr { + struct sockaddr *ifa_addr; /* address of interface */ + struct sockaddr *ifa_dstaddr; /* other end of p-to-p link */ +#define ifa_broadaddr ifa_dstaddr /* broadcast address interface */ + struct sockaddr *ifa_netmask; /* used to determine subnet */ + struct ifnet *ifa_ifp; /* back-pointer to interface */ + struct ifaddr *ifa_next; /* next address for interface */ + void (*ifa_rtrequest) /* check or clean routes (+ or -)'d */ + __P((int, struct rtentry *, struct sockaddr *)); + u_short ifa_flags; /* mostly rt_flags for cloning */ + short ifa_refcnt; /* extra to malloc for link info */ + int ifa_metric; /* cost of going out this interface */ +#ifdef notdef + struct rtentry *ifa_rt; /* XXXX for ROUTETOIF ????? */ +#endif +}; +#define IFA_ROUTE RTF_UP /* route installed */ +#endif + +/* + * Message format for use in obtaining information about interfaces + * from getkerninfo and the routing socket + */ +struct if_msghdr { + u_short ifm_msglen; /* to skip over non-understood messages */ + u_char ifm_version; /* future binary compatability */ + u_char ifm_type; /* message type */ + int ifm_addrs; /* like rtm_addrs */ + int ifm_flags; /* value of if_flags */ + u_short ifm_index; /* index for associated ifp */ + struct if_data ifm_data;/* statistics and other data about if */ +}; + +/* + * Message format for use in obtaining information about interface addresses + * from getkerninfo and the routing socket + */ +struct ifa_msghdr { + u_short ifam_msglen; /* to skip over non-understood messages */ + u_char ifam_version; /* future binary compatability */ + u_char ifam_type; /* message type */ + int ifam_addrs; /* like rtm_addrs */ + int ifam_flags; /* value of ifa_flags */ + u_short ifam_index; /* index for associated ifp */ + int ifam_metric; /* value of ifa_metric */ +}; + +/* + * Interface request structure used for socket + * ioctl's. All interface ioctl's must have parameter + * definitions which begin with ifr_name. The + * remainder may be interface specific. + */ +struct ifreq { +#define IFNAMSIZ 16 + char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */ + union { + struct sockaddr ifru_addr; + struct sockaddr ifru_dstaddr; + struct sockaddr ifru_broadaddr; + short ifru_flags; + int ifru_metric; + int ifru_mtu; + int ifru_phys; + caddr_t ifru_data; + } ifr_ifru; +#define ifr_addr ifr_ifru.ifru_addr /* address */ +#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */ +#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */ +#define ifr_flags ifr_ifru.ifru_flags /* flags */ +#define ifr_metric ifr_ifru.ifru_metric /* metric */ +#define ifr_mtu ifr_ifru.ifru_mtu /* mtu */ +#define ifr_phys ifr_ifru.ifru_phys /* physical wire */ +#define ifr_data ifr_ifru.ifru_data /* for use by interface */ +}; + +struct ifaliasreq { + char ifra_name[IFNAMSIZ]; /* if name, e.g. "en0" */ + struct sockaddr ifra_addr; + struct sockaddr ifra_broadaddr; + struct sockaddr ifra_mask; +}; + +/* + * Structure used in SIOCGIFCONF request. + * Used to retrieve interface configuration + * for machine (useful for programs which + * must know all networks accessible). + */ +struct ifconf { + int ifc_len; /* size of associated buffer */ + union { + caddr_t ifcu_buf; + struct ifreq *ifcu_req; + } ifc_ifcu; +#define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */ +#define ifc_req ifc_ifcu.ifcu_req /* array of structures returned */ +}; + +#include <net/if_arp.h> + +#ifdef KERNEL +#define IFAFREE(ifa) \ + if ((ifa)->ifa_refcnt <= 0) \ + ifafree(ifa); \ + else \ + (ifa)->ifa_refcnt--; + +extern struct ifnet *ifnet; +extern struct ifnet loif[]; + +void ether_ifattach __P((struct ifnet *)); +void ether_input __P((struct ifnet *, struct ether_header *, struct mbuf *)); +int ether_output __P((struct ifnet *, + struct mbuf *, struct sockaddr *, struct rtentry *)); +char *ether_sprintf __P((u_char *)); + +void if_attach __P((struct ifnet *)); +void if_down __P((struct ifnet *)); +void if_qflush __P((struct ifqueue *)); +void if_slowtimo __P((void *)); +void if_up __P((struct ifnet *)); +#ifdef vax +void ifubareset __P((int)); +#endif +int ifconf __P((int, caddr_t)); +/*void ifinit __P((void));*/ /* declared in systm.h for main() */ +int ifioctl __P((struct socket *, int, caddr_t, struct proc *)); +int ifpromisc __P((struct ifnet *, int)); +struct ifnet *ifunit __P((char *)); + +int ifa_ifwithaddr __P((struct sockaddr *, struct ifaddr *)); +struct ifaddr *ifa_ifwithaf __P((int)); +struct ifaddr *ifa_ifwithdstaddr __P((struct sockaddr *, struct ifaddr *)); +int ifa_ifwithnet __P((struct sockaddr *, struct ifaddr *)); +struct ifaddr *ifa_ifwithroute __P((int, struct sockaddr *, + struct sockaddr *)); +struct ifaddr *ifaof_ifpforaddr __P((struct sockaddr *, struct ifnet *)); +void ifafree __P((struct ifaddr *)); +void link_rtrequest __P((int, struct rtentry *, struct sockaddr *)); + +int loioctl __P((struct ifnet *, int, caddr_t)); +void loopattach __P((void)); +int looutput __P((struct ifnet *, + struct mbuf *, struct sockaddr *, struct rtentry *)); +void lortrequest __P((int, struct rtentry *, struct sockaddr *)); +#endif /* KERNEL */ + +#endif /* !_NET_IF_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/net/if_arp.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/net/if_arp.h new file mode 100644 index 00000000000..acac0855c11 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/net/if_arp.h @@ -0,0 +1,92 @@ +/* + * Copyright (c) 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)if_arp.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NET_IF_ARP_H_ +#define _NET_IF_ARP_H_ + +#include <sys/socket.h> /* for struct sockaddr */ + +/* + * Address Resolution Protocol. + * + * See RFC 826 for protocol description. ARP packets are variable + * in size; the arphdr structure defines the fixed-length portion. + * Protocol type values are the same as those for 10 Mb/s Ethernet. + * It is followed by the variable-sized fields ar_sha, arp_spa, + * arp_tha and arp_tpa in that order, according to the lengths + * specified. Field names used correspond to RFC 826. + */ +struct arphdr { + u_short ar_hrd; /* format of hardware address */ +#define ARPHRD_ETHER 1 /* ethernet hardware format */ +#define ARPHRD_FRELAY 15 /* frame relay hardware format */ + u_short ar_pro; /* format of protocol address */ + u_char ar_hln; /* length of hardware address */ + u_char ar_pln; /* length of protocol address */ + u_short ar_op; /* one of: */ +#define ARPOP_REQUEST 1 /* request to resolve address */ +#define ARPOP_REPLY 2 /* response to previous request */ +#define ARPOP_REVREQUEST 3 /* request protocol address given hardware */ +#define ARPOP_REVREPLY 4 /* response giving protocol address */ +#define ARPOP_INVREQUEST 8 /* request to identify peer */ +#define ARPOP_INVREPLY 9 /* response identifying peer */ +/* + * The remaining fields are variable in size, + * according to the sizes above. + */ +#ifdef COMMENT_ONLY + u_char ar_sha[]; /* sender hardware address */ + u_char ar_spa[]; /* sender protocol address */ + u_char ar_tha[]; /* target hardware address */ + u_char ar_tpa[]; /* target protocol address */ +#endif +}; + +/* + * ARP ioctl request + */ +struct arpreq { + struct sockaddr arp_pa; /* protocol address */ + struct sockaddr arp_ha; /* hardware address */ + int arp_flags; /* flags */ +}; +/* arp_flags and at_flags field values */ +#define ATF_INUSE 0x01 /* entry in use */ +#define ATF_COM 0x02 /* completed entry (enaddr valid) */ +#define ATF_PERM 0x04 /* permanent entry */ +#define ATF_PUBL 0x08 /* publish entry (respond for other host) */ +#define ATF_USETRAILERS 0x10 /* has requested trailers */ + +#endif /* !_NET_IF_ARP_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/net/netisr.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/net/netisr.h new file mode 100644 index 00000000000..f212d63b8f4 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/net/netisr.h @@ -0,0 +1,86 @@ +/* + * Copyright (c) 1980, 1986, 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)netisr.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NET_NETISR_H_ +#define _NET_NETISR_H_ + +/* + * The networking code runs off software interrupts. + * + * You can switch into the network by doing splnet() and return by splx(). + * The software interrupt level for the network is higher than the software + * level for the clock (so you can enter the network in routines called + * at timeout time). + */ +#if defined(vax) || defined(tahoe) +#define setsoftnet() mtpr(SIRR, 12) +#endif + +/* + * Each ``pup-level-1'' input queue has a bit in a ``netisr'' status + * word which is used to de-multiplex a single software + * interrupt used for scheduling the network code to calls + * on the lowest level routine of each protocol. + */ +#define NETISR_RAW 0 /* same as AF_UNSPEC */ +#define NETISR_IP 2 /* same as AF_INET */ +#define NETISR_IMP 3 /* same as AF_IMPLINK */ +#define NETISR_NS 6 /* same as AF_NS */ +#define NETISR_ISO 7 /* same as AF_ISO */ +#define NETISR_CCITT 10 /* same as AF_CCITT */ +#define NETISR_ARP 18 /* same as AF_LINK */ +#define NETISR_ISDN 26 /* same as AF_E164 */ + +#define schednetisr(anisr) { netisr |= 1<<(anisr); setsoftnet(); } + +#ifndef LOCORE +#ifdef KERNEL +extern volatile unsigned int netisr; /* scheduling bits for network */ + +typedef void netisr_t(void); + +struct netisrtab { + int nit_num; + netisr_t *nit_isr; +}; + +#define NETISR_SET(num, isr) \ + static struct netisrtab mod_nit = { num, isr }; \ + DATA_SET(netisr_set, mod_nit); + +#endif +#endif + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/net/radix.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/net/radix.h new file mode 100644 index 00000000000..c37058b3cac --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/net/radix.h @@ -0,0 +1,170 @@ +/* + * Copyright (c) 1988, 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)radix.h 8.2 (Berkeley) 10/31/94 + */ + +#ifndef _RADIX_H_ +#define _RADIX_H_ + +/* + * Radix search tree node layout. + */ + +struct radix_node { + struct radix_mask *rn_mklist; /* list of masks contained in subtree */ + struct radix_node *rn_p; /* parent */ + short rn_b; /* bit offset; -1-index(netmask) */ + char rn_bmask; /* node: mask for bit test*/ + u_char rn_flags; /* enumerated next */ +#define RNF_NORMAL 1 /* leaf contains normal route */ +#define RNF_ROOT 2 /* leaf is root leaf for tree */ +#define RNF_ACTIVE 4 /* This node is alive (for rtfree) */ + union { + struct { /* leaf only data: */ + caddr_t rn_Key; /* object of search */ + caddr_t rn_Mask; /* netmask, if present */ + struct radix_node *rn_Dupedkey; + } rn_leaf; + struct { /* node only data: */ + int rn_Off; /* where to start compare */ + struct radix_node *rn_L;/* progeny */ + struct radix_node *rn_R;/* progeny */ + } rn_node; + } rn_u; +#ifdef RN_DEBUG + int rn_info; + struct radix_node *rn_twin; + struct radix_node *rn_ybro; +#endif +}; + +#define rn_dupedkey rn_u.rn_leaf.rn_Dupedkey +#define rn_key rn_u.rn_leaf.rn_Key +#define rn_mask rn_u.rn_leaf.rn_Mask +#define rn_off rn_u.rn_node.rn_Off +#define rn_l rn_u.rn_node.rn_L +#define rn_r rn_u.rn_node.rn_R + +/* + * Annotations to tree concerning potential routes applying to subtrees. + */ + +extern struct radix_mask { + short rm_b; /* bit offset; -1-index(netmask) */ + char rm_unused; /* cf. rn_bmask */ + u_char rm_flags; /* cf. rn_flags */ + struct radix_mask *rm_mklist; /* more masks to try */ + union { + caddr_t rmu_mask; /* the mask */ + struct radix_node *rmu_leaf; /* for normal routes */ + } rm_rmu; + int rm_refs; /* # of references to this struct */ +} *rn_mkfreelist; + +#define rm_mask rm_rmu.rmu_mask +#define rm_leaf rm_rmu.rmu_leaf /* extra field would make 32 bytes */ + +#define MKGet(m) {\ + if (rn_mkfreelist) {\ + m = rn_mkfreelist; \ + rn_mkfreelist = (m)->rm_mklist; \ + } else \ + R_Malloc(m, struct radix_mask *, sizeof (*(m))); }\ + +#define MKFree(m) { (m)->rm_mklist = rn_mkfreelist; rn_mkfreelist = (m);} + +typedef int walktree_f_t __P((struct radix_node *, void *)); + +struct radix_node_head { + struct radix_node *rnh_treetop; + int rnh_addrsize; /* permit, but not require fixed keys */ + int rnh_pktsize; /* permit, but not require fixed keys */ + struct radix_node *(*rnh_addaddr) /* add based on sockaddr */ + __P((void *v, void *mask, + struct radix_node_head *head, struct radix_node nodes[])); + struct radix_node *(*rnh_addpkt) /* add based on packet hdr */ + __P((void *v, void *mask, + struct radix_node_head *head, struct radix_node nodes[])); + struct radix_node *(*rnh_deladdr) /* remove based on sockaddr */ + __P((void *v, void *mask, struct radix_node_head *head)); + struct radix_node *(*rnh_delpkt) /* remove based on packet hdr */ + __P((void *v, void *mask, struct radix_node_head *head)); + struct radix_node *(*rnh_matchaddr) /* locate based on sockaddr */ + __P((void *v, struct radix_node_head *head)); + struct radix_node *(*rnh_lookup) /* locate based on sockaddr */ + __P((void *v, void *mask, struct radix_node_head *head)); + struct radix_node *(*rnh_matchpkt) /* locate based on packet hdr */ + __P((void *v, struct radix_node_head *head)); + int (*rnh_walktree) /* traverse tree */ + __P((struct radix_node_head *head, walktree_f_t *f, void *w)); + int (*rnh_walktree_from) /* traverse tree below a */ + __P((struct radix_node_head *head, void *a, void *m, + walktree_f_t *f, void *w)); + void (*rnh_close) /* do something when the last ref drops */ + __P((struct radix_node *rn, struct radix_node_head *head)); + struct radix_node rnh_nodes[3]; /* empty tree for common case */ +}; + +#ifndef KERNEL +#define Bcmp(a, b, n) bcmp(((char *)(a)), ((char *)(b)), (n)) +#define Bcopy(a, b, n) bcopy(((char *)(a)), ((char *)(b)), (unsigned)(n)) +#define Bzero(p, n) bzero((char *)(p), (int)(n)); +#define R_Malloc(p, t, n) (p = (t) malloc((unsigned int)(n))) +#define Free(p) free((char *)p); +#else +#define Bcmp(a, b, n) bcmp(((caddr_t)(a)), ((caddr_t)(b)), (unsigned)(n)) +#define Bcopy(a, b, n) bcopy(((caddr_t)(a)), ((caddr_t)(b)), (unsigned)(n)) +#define Bzero(p, n) bzero((caddr_t)(p), (unsigned)(n)); +#define R_Malloc(p, t, n) (p = (t) malloc((unsigned long)(n), M_RTABLE, M_DONTWAIT)) +#define Free(p) free((caddr_t)p, M_RTABLE); +#endif /*KERNEL*/ + +extern struct radix_node_head *mask_rnhead; + +void rn_init __P((void)); +int rn_inithead __P((void **, int)); +int rn_refines __P((void *, void *)); +int rn_walktree __P((struct radix_node_head *, walktree_f_t *, void *)); +struct radix_node + *rn_addmask __P((void *, int, int)), + *rn_addroute __P((void *, void *, struct radix_node_head *, + struct radix_node [2])), + *rn_delete __P((void *, void *, struct radix_node_head *)), + *rn_insert __P((void *, struct radix_node_head *, int *, + struct radix_node [2])), + *rn_match __P((void *, struct radix_node_head *)), + *rn_newpair __P((void *, int, struct radix_node[2])), + *rn_search __P((void *, struct radix_node *)), + *rn_search_m __P((void *, struct radix_node *, void *)); + +#endif /* _RADIX_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/net/raw_cb.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/net/raw_cb.h new file mode 100644 index 00000000000..c1273190505 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/net/raw_cb.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 1980, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)raw_cb.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NET_RAW_CB_H_ +#define _NET_RAW_CB_H_ + +/* + * Raw protocol interface control block. Used + * to tie a socket to the generic raw interface. + */ +struct rawcb { + struct rawcb *rcb_next; /* doubly linked list */ + struct rawcb *rcb_prev; + struct socket *rcb_socket; /* back pointer to socket */ + struct sockaddr *rcb_faddr; /* destination address */ + struct sockaddr *rcb_laddr; /* socket's address */ + struct sockproto rcb_proto; /* protocol family, protocol */ +}; + +#define sotorawcb(so) ((struct rawcb *)(so)->so_pcb) + +/* + * Nominal space allocated to a raw socket. + */ +#define RAWSNDQ 8192 +#define RAWRCVQ 8192 + +#ifdef KERNEL +struct rawcb rawcb; /* head of list */ + +int raw_attach __P((struct socket *, int)); +void raw_ctlinput __P((int, struct sockaddr *)); +void raw_detach __P((struct rawcb *)); +void raw_disconnect __P((struct rawcb *)); +void raw_init __P((void)); +void raw_input __P((struct mbuf *, + struct sockproto *, struct sockaddr *, struct sockaddr *)); +int raw_usrreq __P((struct socket *, + int, struct mbuf *, struct mbuf *, struct mbuf *)); +#endif + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/net/route.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/net/route.h new file mode 100644 index 00000000000..ef78cbb9392 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/net/route.h @@ -0,0 +1,258 @@ +/* + * Copyright (c) 1980, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)route.h 8.3 (Berkeley) 4/19/94 + */ + +#ifndef _NET_ROUTE_H_ +#define _NET_ROUTE_H_ + +#include <oskittypes.h> + +/* + * Kernel resident routing tables. + * + * The routing tables are initialized when interface addresses + * are set by making entries for all directly connected interfaces. + */ + +/* + * A route consists of a destination address and a reference + * to a routing entry. These are often held by protocols + * in their control blocks, e.g. inpcb. + */ +struct route { + struct rtentry ro_rt; + struct sockaddr ro_dst; +}; + +/* + * rmx_rtt and rmx_rttvar are stored as microseconds; + * RTTTOPRHZ(rtt) converts to a value suitable for use + * by a protocol slowtimo counter. + */ +#define RTM_RTTUNIT 1000000 /* units for rtt, rttvar, as units per sec */ +#define RTTTOPRHZ(r) ((r) / (RTM_RTTUNIT / PR_SLOWHZ)) + +/* + * XXX kernel function pointer `rt_output' is visible to applications. + */ +struct mbuf; + +/* + * We distinguish between routes to hosts and routes to networks, + * preferring the former if available. For each route we infer + * the interface to use from the gateway address supplied when + * the route was entered. Routes that forward packets through + * gateways are marked so that the output routines know to address the + * gateway rather than the ultimate destination. + */ +#ifndef RNF_NORMAL +#include <net/radix.h> +#endif + +#include <oskittcp.h> + +#ifndef __REACTOS__ +/* + * Following structure necessary for 4.3 compatibility; + * We should eventually move it to a compat file. + */ +struct rtentry { + u_long rt_hash; /* to speed lookups */ + struct sockaddr rt_dst; /* key */ + struct sockaddr rt_gateway; /* value */ + short rt_flags; /* up/down?, host/net */ + short rt_refcnt; /* # held references */ + u_long rt_use; /* raw # packets forwarded */ + struct ifnet *rt_ifp; /* the answer: interface to use */ +}; +#endif + +#define rt_use rt_rmx.rmx_pksent + +#define RTF_UP 0x1 /* route usable */ +#define RTF_GATEWAY 0x2 /* destination is a gateway */ +#define RTF_HOST 0x4 /* host entry (net otherwise) */ +#define RTF_REJECT 0x8 /* host or net unreachable */ +#define RTF_DYNAMIC 0x10 /* created dynamically (by redirect) */ +#define RTF_MODIFIED 0x20 /* modified dynamically (by redirect) */ +#define RTF_DONE 0x40 /* message confirmed */ +#define RTF_MASK 0x80 /* subnet mask present */ +#define RTF_CLONING 0x100 /* generate new routes on use */ +#define RTF_XRESOLVE 0x200 /* external daemon resolves name */ +#define RTF_LLINFO 0x400 /* generated by ARP or ESIS */ +#define RTF_STATIC 0x800 /* manually added */ +#define RTF_BLACKHOLE 0x1000 /* just discard pkts (during updates) */ +#define RTF_PROTO2 0x4000 /* protocol specific routing flag */ +#define RTF_PROTO1 0x8000 /* protocol specific routing flag */ + +#define RTF_PRCLONING 0x10000 /* protocol requires cloning */ +#define RTF_WASCLONED 0x20000 /* route generated through cloning */ +#define RTF_PROTO3 0x40000 /* protocol specific routing flag */ +#define RTF_CHAINDELETE 0x80000 /* chain is being deleted (internal) */ +#define RTF_PINNED 0x100000 /* future use */ + /* 0x200000 and up unassigned */ + +/* + * Routing statistics. + */ +struct rtstat { + short rts_badredirect; /* bogus redirect calls */ + short rts_dynamic; /* routes created by redirects */ + short rts_newgateway; /* routes modified by redirects */ + short rts_unreach; /* lookups which failed */ + short rts_wildcard; /* lookups satisfied by a wildcard */ +}; +/* + * Structures for routing messages. + */ +struct rt_msghdr { + u_short rtm_msglen; /* to skip over non-understood messages */ + u_char rtm_version; /* future binary compatibility */ + u_char rtm_type; /* message type */ + u_short rtm_index; /* index for associated ifp */ + int rtm_flags; /* flags, incl. kern & message, e.g. DONE */ + int rtm_addrs; /* bitmask identifying sockaddrs in msg */ + pid_t rtm_pid; /* identify sender */ + int rtm_seq; /* for sender to identify action */ + int rtm_errno; /* why failed */ + int rtm_use; /* from rtentry */ + u_long rtm_inits; /* which metrics we are initializing */ + struct rt_metrics rtm_rmx; /* metrics themselves */ +}; + +#define RTM_VERSION 5 /* Up the ante and ignore older versions */ + +#define RTM_ADD 0x1 /* Add Route */ +#define RTM_DELETE 0x2 /* Delete Route */ +#define RTM_CHANGE 0x3 /* Change Metrics or flags */ +#define RTM_GET 0x4 /* Report Metrics */ +#define RTM_LOSING 0x5 /* Kernel Suspects Partitioning */ +#define RTM_REDIRECT 0x6 /* Told to use different route */ +#define RTM_MISS 0x7 /* Lookup failed on this address */ +#define RTM_LOCK 0x8 /* fix specified metrics */ +#define RTM_OLDADD 0x9 /* caused by SIOCADDRT */ +#define RTM_OLDDEL 0xa /* caused by SIOCDELRT */ +#define RTM_RESOLVE 0xb /* req to resolve dst to LL addr */ +#define RTM_NEWADDR 0xc /* address being added to iface */ +#define RTM_DELADDR 0xd /* address being removed from iface */ +#define RTM_IFINFO 0xe /* iface going up/down etc. */ + +#define RTV_MTU 0x1 /* init or lock _mtu */ +#define RTV_HOPCOUNT 0x2 /* init or lock _hopcount */ +#define RTV_EXPIRE 0x4 /* init or lock _hopcount */ +#define RTV_RPIPE 0x8 /* init or lock _recvpipe */ +#define RTV_SPIPE 0x10 /* init or lock _sendpipe */ +#define RTV_SSTHRESH 0x20 /* init or lock _ssthresh */ +#define RTV_RTT 0x40 /* init or lock _rtt */ +#define RTV_RTTVAR 0x80 /* init or lock _rttvar */ + +/* + * Bitmask values for rtm_addr. + */ +#define RTA_DST 0x1 /* destination sockaddr present */ +#define RTA_GATEWAY 0x2 /* gateway sockaddr present */ +#define RTA_NETMASK 0x4 /* netmask sockaddr present */ +#define RTA_GENMASK 0x8 /* cloning mask sockaddr present */ +#define RTA_IFP 0x10 /* interface name sockaddr present */ +#define RTA_IFA 0x20 /* interface addr sockaddr present */ +#define RTA_AUTHOR 0x40 /* sockaddr for author of redirect */ +#define RTA_BRD 0x80 /* for NEWADDR, broadcast or p-p dest addr */ + +/* + * Index offsets for sockaddr array for alternate internal encoding. + */ +#define RTAX_DST 0 /* destination sockaddr present */ +#define RTAX_GATEWAY 1 /* gateway sockaddr present */ +#define RTAX_NETMASK 2 /* netmask sockaddr present */ +#define RTAX_GENMASK 3 /* cloning mask sockaddr present */ +#define RTAX_IFP 4 /* interface name sockaddr present */ +#define RTAX_IFA 5 /* interface addr sockaddr present */ +#define RTAX_AUTHOR 6 /* sockaddr for author of redirect */ +#define RTAX_BRD 7 /* for NEWADDR, broadcast or p-p dest addr */ +#define RTAX_MAX 8 /* size of array to allocate */ + +struct rt_addrinfo { + int rti_addrs; + struct sockaddr *rti_info[RTAX_MAX]; +}; + +struct route_cb { + int ip_count; + int ns_count; + int iso_count; + int any_count; +}; + +#ifdef KERNEL +#ifndef __REACTOS__ +#define RTFREE(rt) \ + if ((rt)->rt_refcnt <= 1) \ + rtfree(rt); \ + else \ + (rt)->rt_refcnt--; +#else +#define RTFREE(rt) rtfree(rt) +#endif + +struct route_cb route_cb; +struct rtstat rtstat; +struct radix_node_head *rt_tables[AF_MAX+1]; + +void route_init __P((void)); +int route_output __P((struct mbuf *, struct socket *)); +int route_usrreq __P((struct socket *, + int, struct mbuf *, struct mbuf *, struct mbuf *)); +void rt_ifmsg __P((struct ifnet *)); +void rt_maskedcopy __P((struct sockaddr *, + struct sockaddr *, struct sockaddr *)); +void rt_missmsg __P((int, struct rt_addrinfo *, int, int)); +void rt_newaddrmsg __P((int, struct ifaddr *, int, struct rtentry *)); +int rt_setgate __P((struct rtentry *, + struct sockaddr *, struct sockaddr *)); +void rt_setmetrics __P((u_long, struct rt_metrics *, struct rt_metrics *)); +void rtable_init __P((void **)); +void rtalloc __P((struct route *)); +void rtalloc_ign __P((struct route *, unsigned long)); +struct rtentry * + rtalloc1 __P((struct sockaddr *, int, unsigned long)); +void rtfree __P((struct rtentry *)); +int rtinit __P((struct ifaddr *, int, int)); +int rtioctl __P((int, caddr_t, struct proc *)); +void rtredirect __P((struct sockaddr *, struct sockaddr *, + struct sockaddr *, int, struct sockaddr *, struct rtentry **)); +int rtrequest __P((int, struct sockaddr *, + struct sockaddr *, struct sockaddr *, int, struct rtentry **)); +#endif + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/if_ether.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/if_ether.h new file mode 100644 index 00000000000..057878f9ca1 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/if_ether.h @@ -0,0 +1,237 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)if_ether.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_IF_ETHER_H_ +#define _NETINET_IF_ETHER_H_ + +#include <arpa/inet.h> + +/* + * Structure of a 10Mb/s Ethernet header. + */ +struct ether_header { + u_char ether_dhost[6]; + u_char ether_shost[6]; + u_short ether_type; +}; + +/* + * Structure of a 48-bit Ethernet address. + */ +struct ether_addr { + u_char octet[6]; +}; + +#define ETHERTYPE_PUP 0x0200 /* PUP protocol */ +#define ETHERTYPE_IP 0x0800 /* IP protocol */ +#define ETHERTYPE_ARP 0x0806 /* Addr. resolution protocol */ +#define ETHERTYPE_REVARP 0x8035 /* reverse Addr. resolution protocol */ + +/* + * The ETHERTYPE_NTRAILER packet types starting at ETHERTYPE_TRAIL have + * (type-ETHERTYPE_TRAIL)*512 bytes of data followed + * by an ETHER type (as given above) and then the (variable-length) header. + */ +#define ETHERTYPE_TRAIL 0x1000 /* Trailer packet */ +#define ETHERTYPE_NTRAILER 16 + +#define ETHERMTU 1500 +#define ETHERMIN (60-14) + +#ifdef KERNEL +/* + * Macro to map an IP multicast address to an Ethernet multicast address. + * The high-order 25 bits of the Ethernet address are statically assigned, + * and the low-order 23 bits are taken from the low end of the IP address. + */ +#define ETHER_MAP_IP_MULTICAST(ipaddr, enaddr) \ + /* struct in_addr *ipaddr; */ \ + /* u_char enaddr[6]; */ \ +{ \ + (enaddr)[0] = 0x01; \ + (enaddr)[1] = 0x00; \ + (enaddr)[2] = 0x5e; \ + (enaddr)[3] = ((u_char *)ipaddr)[1] & 0x7f; \ + (enaddr)[4] = ((u_char *)ipaddr)[2]; \ + (enaddr)[5] = ((u_char *)ipaddr)[3]; \ +} +#endif + +/* + * Ethernet Address Resolution Protocol. + * + * See RFC 826 for protocol description. Structure below is adapted + * to resolving internet addresses. Field names used correspond to + * RFC 826. + */ +struct ether_arp { + struct arphdr ea_hdr; /* fixed-size header */ + u_char arp_sha[6]; /* sender hardware address */ + u_char arp_spa[4]; /* sender protocol address */ + u_char arp_tha[6]; /* target hardware address */ + u_char arp_tpa[4]; /* target protocol address */ +}; +#define arp_hrd ea_hdr.ar_hrd +#define arp_pro ea_hdr.ar_pro +#define arp_hln ea_hdr.ar_hln +#define arp_pln ea_hdr.ar_pln +#define arp_op ea_hdr.ar_op + + +/* + * Structure shared between the ethernet driver modules and + * the address resolution code. For example, each ec_softc or il_softc + * begins with this structure. + */ +struct arpcom { + struct ifnet ac_if; /* network-visible interface */ + u_char ac_enaddr[6]; /* ethernet hardware address */ + struct in_addr ac_ipaddr; /* copy of ip address- XXX */ + struct ether_multi *ac_multiaddrs; /* list of ether multicast addrs */ + int ac_multicnt; /* length of ac_multiaddrs list */ +}; + +struct llinfo_arp { + struct llinfo_arp *la_next; + struct llinfo_arp *la_prev; + struct rtentry *la_rt; + struct mbuf *la_hold; /* last packet until resolved/timeout */ + long la_asked; /* last time we QUERIED for this addr */ +#define la_timer la_rt->rt_rmx.rmx_expire /* deletion time in seconds */ +}; + +struct sockaddr_inarp { + u_char sin_len; + u_char sin_family; + u_short sin_port; + struct in_addr sin_addr; + struct in_addr sin_srcaddr; + u_short sin_tos; + u_short sin_other; +#define SIN_PROXY 1 +}; +/* + * IP and ethernet specific routing flags + */ +#define RTF_USETRAILERS RTF_PROTO1 /* use trailers */ +#define RTF_ANNOUNCE RTF_PROTO2 /* announce new arp entry */ + +#ifdef KERNEL +extern u_char etherbroadcastaddr[6]; +extern u_char ether_ipmulticast_min[6]; +extern u_char ether_ipmulticast_max[6]; +extern struct ifqueue arpintrq; + +struct llinfo_arp *arptnew __P((struct in_addr *)); +extern struct llinfo_arp llinfo_arp; /* head of the llinfo queue */ + +void arpwhohas __P((struct arpcom *, struct in_addr *)); +void arpintr __P((void)); +int arpresolve __P((struct arpcom *, struct rtentry *, struct mbuf *, + struct sockaddr *, u_char *, struct rtentry *)); +void arp_ifinit __P((struct arpcom *, struct ifaddr *)); + +int ether_addmulti __P((struct ifreq *, struct arpcom *)); +int ether_delmulti __P((struct ifreq *, struct arpcom *)); + +/* + * Ethernet multicast address structure. There is one of these for each + * multicast address or range of multicast addresses that we are supposed + * to listen to on a particular interface. They are kept in a linked list, + * rooted in the interface's arpcom structure. (This really has nothing to + * do with ARP, or with the Internet address family, but this appears to be + * the minimally-disrupting place to put it.) + */ +struct ether_multi { + u_char enm_addrlo[6]; /* low or only address of range */ + u_char enm_addrhi[6]; /* high or only address of range */ + struct arpcom *enm_ac; /* back pointer to arpcom */ + u_int enm_refcount; /* no. claims to this addr/range */ + struct ether_multi *enm_next; /* ptr to next ether_multi */ +}; + +/* + * Structure used by macros below to remember position when stepping through + * all of the ether_multi records. + */ +struct ether_multistep { + struct ether_multi *e_enm; +}; + +/* + * Macro for looking up the ether_multi record for a given range of Ethernet + * multicast addresses connected to a given arpcom structure. If no matching + * record is found, "enm" returns NULL. + */ +#define ETHER_LOOKUP_MULTI(addrlo, addrhi, ac, enm) \ + /* u_char addrlo[6]; */ \ + /* u_char addrhi[6]; */ \ + /* struct arpcom *ac; */ \ + /* struct ether_multi *enm; */ \ +{ \ + for ((enm) = (ac)->ac_multiaddrs; \ + (enm) != NULL && \ + (bcmp((enm)->enm_addrlo, (addrlo), 6) != 0 || \ + bcmp((enm)->enm_addrhi, (addrhi), 6) != 0); \ + (enm) = (enm)->enm_next); \ +} + +/* + * Macro to step through all of the ether_multi records, one at a time. + * The current position is remembered in "step", which the caller must + * provide. ETHER_FIRST_MULTI(), below, must be called to initialize "step" + * and get the first record. Both macros return a NULL "enm" when there + * are no remaining records. + */ +#define ETHER_NEXT_MULTI(step, enm) \ + /* struct ether_multistep step; */ \ + /* struct ether_multi *enm; */ \ +{ \ + if (((enm) = (step).e_enm) != NULL) \ + (step).e_enm = (enm)->enm_next; \ +} + +#define ETHER_FIRST_MULTI(step, ac, enm) \ + /* struct ether_multistep step; */ \ + /* struct arpcom *ac; */ \ + /* struct ether_multi *enm; */ \ +{ \ + (step).e_enm = (ac)->ac_multiaddrs; \ + ETHER_NEXT_MULTI((step), (enm)); \ +} + +#endif + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/igmp_var.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/igmp_var.h new file mode 100644 index 00000000000..fee5e431cd9 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/igmp_var.h @@ -0,0 +1,91 @@ +/* + * Copyright (c) 1988 Stephen Deering. + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Stephen Deering of Stanford University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)igmp_var.h 8.1 (Berkeley) 7/19/93 + */ + +#ifndef _NETINET_IGMP_VAR_H_ +#define _NETINET_IGMP_VAR_H_ + +/* + * Internet Group Management Protocol (IGMP), + * implementation-specific definitions. + * + * Written by Steve Deering, Stanford, May 1988. + * + * MULTICAST Revisiob: 3.3.1.1 + */ + +struct igmpstat { + u_int igps_rcv_total; /* total IGMP messages received */ + u_int igps_rcv_tooshort; /* received with too few bytes */ + u_int igps_rcv_badsum; /* received with bad checksum */ + u_int igps_rcv_queries; /* received membership queries */ + u_int igps_rcv_badqueries; /* received invalid queries */ + u_int igps_rcv_reports; /* received membership reports */ + u_int igps_rcv_badreports; /* received invalid reports */ + u_int igps_rcv_ourreports; /* received reports for our groups */ + u_int igps_snd_reports; /* sent membership reports */ +}; + +#ifdef KERNEL +extern struct igmpstat igmpstat; + +#define IGMP_RANDOM_DELAY(X) (random() % (X) + 1) + +void igmp_init __P((void)); +void igmp_input __P((struct mbuf *, int)); +void igmp_joingroup __P((struct in_multi *)); +void igmp_leavegroup __P((struct in_multi *)); +void igmp_fasttimo __P((void)); +void igmp_slowtimo __P((void)); +int igmp_sysctl(int *, u_int, void *, size_t *, void *, size_t); +#endif + +/* + * Names for IGMP sysctl objects + */ +#define IGMPCTL_STATS 1 /* statistics (read-only) */ +#define IGMPCTL_MAXID 2 + +#define IGMPCTL_NAMES { \ + { 0, 0 }, \ + { "stats", CTLTYPE_STRUCT }, \ +} + +#endif + + diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/in.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/in.h new file mode 100644 index 00000000000..39fe9675ff8 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/in.h @@ -0,0 +1,262 @@ +/* + * Copyright (c) 1982, 1986, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)in.h 8.3 (Berkeley) 1/3/94 + */ + +#ifndef _NETINET_IN_H_ +#define _NETINET_IN_H_ + +/* + * Constants and structures defined by the internet system, + * Per RFC 790, September 1981, and numerous additions. + */ + +/* + * Protocols + */ +#define IPPROTO_IP 0 /* dummy for IP */ +#define IPPROTO_ICMP 1 /* control message protocol */ +#define IPPROTO_IGMP 2 /* group mgmt protocol */ +#define IPPROTO_GGP 3 /* gateway^2 (deprecated) */ +#define IPPROTO_IPIP 4 /* IP encapsulation in IP */ +#define IPPROTO_TCP 6 /* tcp */ +#define IPPROTO_EGP 8 /* exterior gateway protocol */ +#define IPPROTO_PUP 12 /* pup */ +#define IPPROTO_UDP 17 /* user datagram protocol */ +#define IPPROTO_IDP 22 /* xns idp */ +#define IPPROTO_TP 29 /* tp-4 w/ class negotiation */ +#define IPPROTO_RSVP 46 /* resource reservation */ +#define IPPROTO_EON 80 /* ISO cnlp */ +#define IPPROTO_ENCAP 98 /* encapsulation header */ + +#define IPPROTO_RAW 255 /* raw IP packet */ +#define IPPROTO_MAX 256 + + +/* + * Local port number conventions: + * Ports < IPPORT_RESERVED are reserved for + * privileged processes (e.g. root). + * Ports > IPPORT_USERRESERVED are reserved + * for servers, not necessarily privileged. + */ +#define IPPORT_RESERVED 1024 +#define IPPORT_USERRESERVED 5000 + +/* + * Internet address (a structure for historical reasons) + */ +struct in_addr { + u_long s_addr; +}; + +/* + * Definitions of bits in internet address integers. + * On subnets, the decomposition of addresses to host and net parts + * is done according to subnet mask, not the masks here. + */ +#define IN_CLASSA(i) (((long)(i) & 0x80000000) == 0) +#define IN_CLASSA_NET 0xff000000 +#define IN_CLASSA_NSHIFT 24 +#define IN_CLASSA_HOST 0x00ffffff +#define IN_CLASSA_MAX 128 + +#define IN_CLASSB(i) (((long)(i) & 0xc0000000) == 0x80000000) +#define IN_CLASSB_NET 0xffff0000 +#define IN_CLASSB_NSHIFT 16 +#define IN_CLASSB_HOST 0x0000ffff +#define IN_CLASSB_MAX 65536 + +#define IN_CLASSC(i) (((long)(i) & 0xe0000000) == 0xc0000000) +#define IN_CLASSC_NET 0xffffff00 +#define IN_CLASSC_NSHIFT 8 +#define IN_CLASSC_HOST 0x000000ff + +#define IN_CLASSD(i) (((long)(i) & 0xf0000000) == 0xe0000000) +#define IN_CLASSD_NET 0xf0000000 /* These ones aren't really */ +#define IN_CLASSD_NSHIFT 28 /* net and host fields, but */ +#define IN_CLASSD_HOST 0x0fffffff /* routing needn't know. */ +#define IN_MULTICAST(i) IN_CLASSD(i) + +#define IN_EXPERIMENTAL(i) (((long)(i) & 0xf0000000) == 0xf0000000) +#define IN_BADCLASS(i) (((long)(i) & 0xf0000000) == 0xf0000000) + +#define INADDR_ANY (u_long)0x00000000 +#define INADDR_BROADCAST (u_long)0xffffffff /* must be masked */ +#ifndef KERNEL +#define INADDR_NONE 0xffffffff /* -1 return */ +#endif + +#define INADDR_UNSPEC_GROUP (u_long)0xe0000000 /* 224.0.0.0 */ +#define INADDR_ALLHOSTS_GROUP (u_long)0xe0000001 /* 224.0.0.1 */ +#define INADDR_MAX_LOCAL_GROUP (u_long)0xe00000ff /* 224.0.0.255 */ + +#define IN_LOOPBACKNET 127 /* official! */ + +/* + * Socket address, internet style. + */ +struct sockaddr_in { + u_char sin_len; + u_char sin_family; + u_short sin_port; + struct in_addr sin_addr; + char sin_zero[8]; +}; + +/* + * Structure used to describe IP options. + * Used to store options internally, to pass them to a process, + * or to restore options retrieved earlier. + * The ip_dst is used for the first-hop gateway when using a source route + * (this gets put into the header proper). + */ +struct ip_opts { + struct in_addr ip_dst; /* first hop, 0 w/o src rt */ + char ip_opts[40]; /* actually variable in size */ +}; + +/* + * Options for use with [gs]etsockopt at the IP level. + * First word of comment is data type; bool is stored in int. + */ +#define IP_OPTIONS 1 /* buf/ip_opts; set/get IP options */ +#define IP_HDRINCL 2 /* int; header is included with data */ +#define IP_TOS 3 /* int; IP type of service and preced. */ +#define IP_TTL 4 /* int; IP time to live */ +#define IP_RECVOPTS 5 /* bool; receive all IP opts w/dgram */ +#define IP_RECVRETOPTS 6 /* bool; receive IP opts for response */ +#define IP_RECVDSTADDR 7 /* bool; receive IP dst addr w/dgram */ +#define IP_RETOPTS 8 /* ip_opts; set/get IP options */ +#define IP_MULTICAST_IF 9 /* u_char; set/get IP multicast i/f */ +#define IP_MULTICAST_TTL 10 /* u_char; set/get IP multicast ttl */ +#define IP_MULTICAST_LOOP 11 /* u_char; set/get IP multicast loopback */ +#define IP_ADD_MEMBERSHIP 12 /* ip_mreq; add an IP group membership */ +#define IP_DROP_MEMBERSHIP 13 /* ip_mreq; drop an IP group membership */ +#define IP_MULTICAST_VIF 14 /* set/get IP mcast virt. iface */ +#define IP_RSVP_ON 15 /* enable RSVP in kernel */ +#define IP_RSVP_OFF 16 /* disable RSVP in kernel */ +#define IP_RSVP_VIF_ON 17 /* set RSVP per-vif socket */ +#define IP_RSVP_VIF_OFF 18 /* unset RSVP per-vif socket */ + +/* + * Defaults and limits for options + */ +#define IP_DEFAULT_MULTICAST_TTL 1 /* normally limit m'casts to 1 hop */ +#define IP_DEFAULT_MULTICAST_LOOP 1 /* normally hear sends if a member */ +#define IP_MAX_MEMBERSHIPS 20 /* per socket */ + +/* + * Argument structure for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP. + */ +struct ip_mreq { + struct in_addr imr_multiaddr; /* IP multicast address of group */ + struct in_addr imr_interface; /* local IP address of interface */ +}; + +/* + * Definitions for inet sysctl operations. + * + * Third level is protocol number. + * Fourth level is desired variable within that protocol. + */ +#define IPPROTO_MAXID (IPPROTO_IDP + 1) /* don't list to IPPROTO_MAX */ + +#define CTL_IPPROTO_NAMES { \ + { "ip", CTLTYPE_NODE }, \ + { "icmp", CTLTYPE_NODE }, \ + { "igmp", CTLTYPE_NODE }, \ + { "ggp", CTLTYPE_NODE }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { "tcp", CTLTYPE_NODE }, \ + { 0, 0 }, \ + { "egp", CTLTYPE_NODE }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { "pup", CTLTYPE_NODE }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { "udp", CTLTYPE_NODE }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { "idp", CTLTYPE_NODE }, \ +} + +/* + * Names for IP sysctl objects + */ +#define IPCTL_FORWARDING 1 /* act as router */ +#define IPCTL_SENDREDIRECTS 2 /* may send redirects when forwarding */ +#define IPCTL_DEFTTL 3 /* default TTL */ +#ifdef notyet +#define IPCTL_DEFMTU 4 /* default MTU */ +#define IPCTL_RTEXPIRE 5 /* cloned route expiration time */ +#define IPCTL_RTMINEXPIRE 6 /* min value for expiration time */ +#define IPCTL_RTMAXCACHE 7 /* trigger level for dynamic expire */ +#define IPCTL_SOURCEROUTE 8 /* may perform source routes */ +#define IPCTL_MAXID 9 +#endif + +#define IPCTL_NAMES { \ + { 0, 0 }, \ + { "forwarding", CTLTYPE_INT }, \ + { "redirect", CTLTYPE_INT }, \ + { "ttl", CTLTYPE_INT }, \ + { "mtu", CTLTYPE_INT }, \ + { "rtexpire", CTLTYPE_INT }, \ + { "rtminexpire", CTLTYPE_INT }, \ + { "rtmaxcache", CTLTYPE_INT }, \ + { "sourceroute", CTLTYPE_INT }, \ +} + + +#ifdef KERNEL +struct ifnet; struct mbuf; /* forward declarations for Standard C */ + +int in_broadcast __P((struct in_addr, struct ifnet *)); +int in_canforward __P((struct in_addr)); +int in_cksum __P((struct mbuf *, int)); +int in_localaddr __P((struct in_addr)); +u_long in_netof __P((struct in_addr)); +void in_socktrim __P((struct sockaddr_in *)); +char *inet_ntoa __P((struct in_addr)); /* in libkern */ +#endif + +#endif + diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/in_pcb.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/in_pcb.h new file mode 100644 index 00000000000..f40058a4f20 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/in_pcb.h @@ -0,0 +1,107 @@ +/* + * Copyright (c) 1982, 1986, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)in_pcb.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_IN_PCB_H_ +#define _NETINET_IN_PCB_H_ + +/* + * Common structure pcb for internet protocol implementation. + * Here are stored pointers to local and foreign host table + * entries, local and foreign socket numbers, and pointers + * up (to a socket structure) and down (to a protocol-specific) + * control block. + */ +LIST_HEAD(inpcbhead, inpcb); + +struct inpcb { + LIST_ENTRY(inpcb) inp_list; /* list for all PCBs of this proto */ + LIST_ENTRY(inpcb) inp_hash; /* hash list */ + struct inpcbinfo *inp_pcbinfo; + struct in_addr inp_faddr; /* foreign host table entry */ + u_short inp_fport; /* foreign port */ + struct in_addr inp_laddr; /* local host table entry */ + u_short inp_lport; /* local port */ + struct socket *inp_socket; /* back pointer to socket */ + caddr_t inp_ppcb; /* pointer to per-protocol pcb */ + struct route inp_route; /* placeholder for routing entry */ + int inp_flags; /* generic IP/datagram flags */ + struct ip inp_ip; /* header prototype; should have more */ + struct mbuf *inp_options; /* IP options */ + struct ip_moptions *inp_moptions; /* IP multicast options */ +}; + +struct inpcbinfo { + struct inpcbhead *listhead; + struct inpcbhead *hashbase; + unsigned long hashsize; + unsigned short lastport; +}; + +/* flags in inp_flags: */ +#define INP_RECVOPTS 0x01 /* receive incoming IP options */ +#define INP_RECVRETOPTS 0x02 /* receive IP options for reply */ +#define INP_RECVDSTADDR 0x04 /* receive IP dst address */ +#define INP_CONTROLOPTS (INP_RECVOPTS|INP_RECVRETOPTS|INP_RECVDSTADDR) +#define INP_HDRINCL 0x08 /* user supplies entire IP header */ + +#define INPLOOKUP_WILDCARD 1 + +#define sotoinpcb(so) ((struct inpcb *)(so)->so_pcb) + +#ifdef KERNEL +void in_losing __P((struct inpcb *)); +int in_pcballoc __P((struct socket *, struct inpcbinfo *)); +int in_pcbbind __P((struct inpcb *, struct mbuf *)); +int in_pcbconnect __P((struct inpcb *, struct mbuf *)); +void in_pcbdetach __P((struct inpcb *)); +void in_pcbdisconnect __P((struct inpcb *)); +void in_pcbinshash __P((struct inpcb *)); +int in_pcbladdr __P((struct inpcb *, struct mbuf *, + struct sockaddr_in *)); /* XXX Reactos * <- ** */ +struct inpcb * + in_pcblookup __P((struct inpcbhead *, + struct in_addr, u_int, struct in_addr, u_int, int)); +struct inpcb * + in_pcblookuphash __P((struct inpcbinfo *, + struct in_addr, u_int, struct in_addr, u_int)); +void in_pcbnotify __P((struct inpcbhead *, struct sockaddr *, + u_int, struct in_addr, u_int, int, void (*)(struct inpcb *, int))); +void in_pcbrehash __P((struct inpcb *)); +void in_rtchange __P((struct inpcb *, int)); +void in_setpeeraddr __P((struct inpcb *, struct mbuf *)); +void in_setsockaddr __P((struct inpcb *, struct mbuf *)); +#endif + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/in_systm.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/in_systm.h new file mode 100644 index 00000000000..6c75203f60c --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/in_systm.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)in_systm.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_IN_SYSTM_H_ +#define _NETINET_IN_SYSTM_H_ + +/* + * Miscellaneous internetwork + * definitions for kernel. + */ + +/* + * Network types. + * + * Internally the system keeps counters in the headers with the bytes + * swapped so that VAX instructions will work on them. It reverses + * the bytes before transmission at each protocol level. The n_ types + * represent the types with the bytes in ``high-ender'' order. + */ +typedef u_short n_short; /* short as received from the net */ +typedef u_long n_long; /* long as received from the net */ + +typedef u_long n_time; /* ms since 00:00 GMT, byte rev */ + +#ifdef KERNEL +n_time iptime __P((void)); +#endif + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/in_var.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/in_var.h new file mode 100644 index 00000000000..bb6c9cc5375 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/in_var.h @@ -0,0 +1,233 @@ +/* + * Copyright (c) 1985, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)in_var.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_IN_VAR_H_ +#define _NETINET_IN_VAR_H_ + +#include <sys/queue.h> +/* + * Interface address, Internet version. One of these structures + * is allocated for each interface with an Internet address. + * The ifaddr structure contains the protocol-independent part + * of the structure and is assumed to be first. + */ +struct in_ifaddr { + struct ifaddr ia_ifa; /* protocol-independent info */ +#define ia_ifp ia_ifa.ifa_ifp +#define ia_flags ia_ifa.ifa_flags + /* ia_{,sub}net{,mask} in host order */ + u_long ia_net; /* network number of interface */ + u_long ia_netmask; /* mask of net part */ + u_long ia_subnet; /* subnet number, including net */ + u_long ia_subnetmask; /* mask of subnet part */ + struct in_addr ia_netbroadcast; /* to recognize net broadcasts */ + struct in_ifaddr *ia_next; /* next in list of internet addresses */ + struct sockaddr_in ia_addr; /* reserve space for interface name */ + struct sockaddr_in ia_dstaddr; /* reserve space for broadcast addr */ +#define ia_broadaddr ia_dstaddr + struct sockaddr_in ia_sockmask; /* reserve space for general netmask */ + LIST_HEAD(in_multihead, in_multi) ia_multiaddrs; + /* list of multicast addresses */ +}; + +struct in_aliasreq { + char ifra_name[IFNAMSIZ]; /* if name, e.g. "en0" */ + struct sockaddr_in ifra_addr; + struct sockaddr_in ifra_broadaddr; +#define ifra_dstaddr ifra_broadaddr + struct sockaddr_in ifra_mask; +}; +/* + * Given a pointer to an in_ifaddr (ifaddr), + * return a pointer to the addr as a sockaddr_in. + */ +#define IA_SIN(ia) (&(((struct in_ifaddr *)(ia))->ia_addr)) +#define IA_DSTSIN(ia) (&(((struct in_ifaddr *)(ia))->ia_dstaddr)) + +#define IN_LNAOF(in, ifa) \ + ((ntohl((in).s_addr) & ~((struct in_ifaddr *)(ifa)->ia_subnetmask)) + + +#ifdef KERNEL +extern struct in_ifaddr *in_ifaddr; +extern struct ifqueue ipintrq; /* ip packet input queue */ +extern struct in_addr zeroin_addr; +extern u_char inetctlerrmap[]; +extern int rtq_reallyold; /* XXX */ +extern int rtq_minreallyold; /* XXX */ +extern int rtq_toomany; /* XXX */ + +/* + * Macro for finding the interface (ifnet structure) corresponding to one + * of our IP addresses. + */ +#define INADDR_TO_IFP(addr, ifp) \ + /* struct in_addr addr; */ \ + /* struct ifnet *ifp; */ \ +{ \ + register struct in_ifaddr *ia; \ +\ + for (ia = in_ifaddr; \ + ia != NULL && ((ia->ia_ifp->if_flags & IFF_POINTOPOINT)? \ + IA_DSTSIN(ia):IA_SIN(ia))->sin_addr.s_addr != (addr).s_addr; \ + ia = ia->ia_next) \ + continue; \ + if (ia == NULL) \ + for (ia = in_ifaddr; \ + ia != NULL; \ + ia = ia->ia_next) \ + if (ia->ia_ifp->if_flags & IFF_POINTOPOINT && \ + IA_SIN(ia)->sin_addr.s_addr == (addr).s_addr) \ + break; \ + (ifp) = (ia == NULL) ? NULL : ia->ia_ifp; \ +} + +/* + * Macro for finding the internet address structure (in_ifaddr) corresponding + * to a given interface (ifnet structure). + */ +#define IFP_TO_IA(ifp, ia) \ + /* struct ifnet *ifp; */ \ + /* struct in_ifaddr *ia; */ \ +{ \ + for ((ia) = in_ifaddr; \ + (ia) != NULL && (ia)->ia_ifp != (ifp); \ + (ia) = (ia)->ia_next) \ + continue; \ +} +#endif + +/* + * This information should be part of the ifnet structure but we don't wish + * to change that - as it might break a number of things + */ + +struct router_info { + struct ifnet *ifp; + int type; /* type of router which is querier on this interface */ + int time; /* # of slow timeouts since last old query */ + struct router_info *next; +}; + +/* + * Internet multicast address structure. There is one of these for each IP + * multicast group to which this host belongs on a given network interface. + * They are kept in a linked list, rooted in the interface's in_ifaddr + * structure. + */ +struct in_multi { + LIST_ENTRY(in_multi) inm_entry; /* list glue */ + struct in_addr inm_addr; /* IP multicast address */ + struct ifnet *inm_ifp; /* back pointer to ifnet */ + struct in_ifaddr *inm_ia; /* back pointer to in_ifaddr */ + u_int inm_refcount; /* no. membership claims by sockets */ + u_int inm_timer; /* IGMP membership report timer */ + u_int inm_state; /* state of the membership */ + struct router_info *inm_rti; /* router info*/ +}; + +#ifdef KERNEL +/* + * Structure used by macros below to remember position when stepping through + * all of the in_multi records. + */ +struct in_multistep { + struct in_ifaddr *i_ia; + struct in_multi *i_inm; +}; + +/* + * Macro for looking up the in_multi record for a given IP multicast address + * on a given interface. If no matching record is found, "inm" returns NULL. + */ +#define IN_LOOKUP_MULTI(addr, ifp, inm) \ + /* struct in_addr addr; */ \ + /* struct ifnet *ifp; */ \ + /* struct in_multi *inm; */ \ +{ \ + register struct in_ifaddr *ia; \ +\ + IFP_TO_IA((ifp), ia); \ + if (ia == NULL) \ + (inm) = NULL; \ + else \ + for ((inm) = ia->ia_multiaddrs.lh_first; \ + (inm) != NULL && (inm)->inm_addr.s_addr != (addr).s_addr; \ + (inm) = inm->inm_entry.le_next) \ + continue; \ +} + +/* + * Macro to step through all of the in_multi records, one at a time. + * The current position is remembered in "step", which the caller must + * provide. IN_FIRST_MULTI(), below, must be called to initialize "step" + * and get the first record. Both macros return a NULL "inm" when there + * are no remaining records. + */ +#define IN_NEXT_MULTI(step, inm) \ + /* struct in_multistep step; */ \ + /* struct in_multi *inm; */ \ +{ \ + if (((inm) = (step).i_inm) != NULL) \ + (step).i_inm = (inm)->inm_entry.le_next; \ + else \ + while ((step).i_ia != NULL) { \ + (inm) = (step).i_ia->ia_multiaddrs.lh_first; \ + (step).i_ia = (step).i_ia->ia_next; \ + if ((inm) != NULL) { \ + (step).i_inm = (inm)->inm_entry.le_next; \ + break; \ + } \ + } \ +} + +#define IN_FIRST_MULTI(step, inm) \ + /* struct in_multistep step; */ \ + /* struct in_multi *inm; */ \ +{ \ + (step).i_ia = in_ifaddr; \ + (step).i_inm = NULL; \ + IN_NEXT_MULTI((step), (inm)); \ +} + +int in_ifinit __P((struct ifnet *, + struct in_ifaddr *, struct sockaddr_in *, int)); +struct in_multi *in_addmulti __P((struct in_addr *, struct ifnet *)); +void in_delmulti __P((struct in_multi *)); +void in_ifscrub __P((struct ifnet *, struct in_ifaddr *)); +int in_control __P((struct socket *, int, caddr_t, struct ifnet *)); + +#endif +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/ip.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/ip.h new file mode 100644 index 00000000000..6b216deceff --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/ip.h @@ -0,0 +1,174 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ip.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_IP_H_ +#define _NETINET_IP_H_ + +/* + * Definitions for internet protocol version 4. + * Per RFC 791, September 1981. + */ +#define IPVERSION 4 + +/* + * Structure of an internet header, naked of options. + * + * We declare ip_len and ip_off to be short, rather than u_short + * pragmatically since otherwise unsigned comparisons can result + * against negative integers quite easily, and fail in subtle ways. + */ +struct ip { +#if BYTE_ORDER == LITTLE_ENDIAN + u_char ip_hl:4, /* header length */ + ip_v:4; /* version */ +#endif +#if BYTE_ORDER == BIG_ENDIAN + u_char ip_v:4, /* version */ + ip_hl:4; /* header length */ +#endif + u_char ip_tos; /* type of service */ + short ip_len; /* total length */ + u_short ip_id; /* identification */ + short ip_off; /* fragment offset field */ +#define IP_DF 0x4000 /* dont fragment flag */ +#define IP_MF 0x2000 /* more fragments flag */ +#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ + u_char ip_ttl; /* time to live */ + u_char ip_p; /* protocol */ + u_short ip_sum; /* checksum */ + struct in_addr ip_src,ip_dst; /* source and dest address */ +}; + +#define IP_MAXPACKET 65535 /* maximum packet size */ + +/* + * Definitions for IP type of service (ip_tos) + */ +#define IPTOS_LOWDELAY 0x10 +#define IPTOS_THROUGHPUT 0x08 +#define IPTOS_RELIABILITY 0x04 +#define IPTOS_MINCOST 0x02 + +/* + * Definitions for IP precedence (also in ip_tos) (hopefully unused) + */ +#define IPTOS_PREC_NETCONTROL 0xe0 +#define IPTOS_PREC_INTERNETCONTROL 0xc0 +#define IPTOS_PREC_CRITIC_ECP 0xa0 +#define IPTOS_PREC_FLASHOVERRIDE 0x80 +#define IPTOS_PREC_FLASH 0x60 +#define IPTOS_PREC_IMMEDIATE 0x40 +#define IPTOS_PREC_PRIORITY 0x20 +#define IPTOS_PREC_ROUTINE 0x00 + +/* + * Definitions for options. + */ +#define IPOPT_COPIED(o) ((o)&0x80) +#define IPOPT_CLASS(o) ((o)&0x60) +#define IPOPT_NUMBER(o) ((o)&0x1f) + +#define IPOPT_CONTROL 0x00 +#define IPOPT_RESERVED1 0x20 +#define IPOPT_DEBMEAS 0x40 +#define IPOPT_RESERVED2 0x60 + +#define IPOPT_EOL 0 /* end of option list */ +#define IPOPT_NOP 1 /* no operation */ + +#define IPOPT_RR 7 /* record packet route */ +#define IPOPT_TS 68 /* timestamp */ +#define IPOPT_SECURITY 130 /* provide s,c,h,tcc */ +#define IPOPT_LSRR 131 /* loose source route */ +#define IPOPT_SATID 136 /* satnet id */ +#define IPOPT_SSRR 137 /* strict source route */ + +/* + * Offsets to fields in options other than EOL and NOP. + */ +#define IPOPT_OPTVAL 0 /* option ID */ +#define IPOPT_OLEN 1 /* option length */ +#define IPOPT_OFFSET 2 /* offset within option */ +#define IPOPT_MINOFF 4 /* min value of above */ + +/* + * Time stamp option structure. + */ +struct ip_timestamp { + u_char ipt_code; /* IPOPT_TS */ + u_char ipt_len; /* size of structure (variable) */ + u_char ipt_ptr; /* index of current entry */ +#if BYTE_ORDER == LITTLE_ENDIAN + u_char ipt_flg:4, /* flags, see below */ + ipt_oflw:4; /* overflow counter */ +#endif +#if BYTE_ORDER == BIG_ENDIAN + u_char ipt_oflw:4, /* overflow counter */ + ipt_flg:4; /* flags, see below */ +#endif + union ipt_timestamp { + n_long ipt_time[1]; + struct ipt_ta { + struct in_addr ipt_addr; + n_long ipt_time; + } ipt_ta[1]; + } ipt_timestamp; +}; + +/* flag bits for ipt_flg */ +#define IPOPT_TS_TSONLY 0 /* timestamps only */ +#define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */ +#define IPOPT_TS_PRESPEC 3 /* specified modules only */ + +/* bits for security (not byte swapped) */ +#define IPOPT_SECUR_UNCLASS 0x0000 +#define IPOPT_SECUR_CONFID 0xf135 +#define IPOPT_SECUR_EFTO 0x789a +#define IPOPT_SECUR_MMMM 0xbc4d +#define IPOPT_SECUR_RESTR 0xaf13 +#define IPOPT_SECUR_SECRET 0xd788 +#define IPOPT_SECUR_TOPSECRET 0x6bc5 + +/* + * Internet implementation parameters. + */ +#define MAXTTL 255 /* maximum time to live (seconds) */ +#define IPDEFTTL 64 /* default ttl, from RFC 1340 */ +#define IPFRAGTTL 60 /* time to live for frags, slowhz */ +#define IPTTLDEC 1 /* subtracted when forwarding */ + +#define IP_MSS 576 /* default maximum segment size */ + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/ip_fw.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/ip_fw.h new file mode 100644 index 00000000000..e102a864225 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/ip_fw.h @@ -0,0 +1,145 @@ +/* + * Copyright (c) 1993 Daniel Boulet + * Copyright (c) 1994 Ugen J.S.Antsilevich + * + * Redistribution and use in source forms, with and without modification, + * are permitted provided that this entire comment appears intact. + * + * Redistribution in binary form may occur without any restrictions. + * Obviously, it would be nice if you gave credit where credit is due + * but requiring it would be too onerous. + * + * This software is provided ``AS IS'' without any warranties of any kind. + * + */ + +/* + * Format of an IP firewall descriptor + * + * fw_src, fw_dst, fw_smsk, fw_dmsk are always stored in network byte order. + * fw_flg and fw_n*p are stored in host byte order (of course). + * Port numbers are stored in HOST byte order. + */ +#ifndef _IP_FW_H +#define _IP_FW_H + +struct ip_fw { + u_long fw_pcnt,fw_bcnt; /* Packet and byte counters */ + struct in_addr fw_src, fw_dst; /* Source and destination IP addr */ + struct in_addr fw_smsk, fw_dmsk; /* Mask for src and dest IP addr */ + union { + struct in_addr fu_via_ip; + struct { +#define FW_IFNLEN 6 /* To keep structure on 2^x boundary */ + char fu_via_name[FW_IFNLEN]; + short fu_via_unit; + } fu_via_if; + } fu_via_un; +#define fw_via_ip fu_via_un.fu_via_ip +#define fw_via_name fu_via_un.fu_via_if.fu_via_name +#define fw_via_unit fu_via_un.fu_via_if.fu_via_unit + u_short fw_number; + u_short fw_flg; /* Flags word */ + u_short fw_nsp, fw_ndp; /* N'of src ports and # of dst ports */ + /* in ports array (dst ports follow */ + /* src ports; max of 10 ports in all; */ + /* count of 0 means match all ports) */ +#define IP_FW_MAX_PORTS 10 /* A reasonable maximum */ + u_short fw_pts[IP_FW_MAX_PORTS]; /* Array of port numbers to match */ + u_char fw_ipopt,fw_ipnopt; /* IP options set/unset */ + u_char fw_tcpf,fw_tcpnf; /* TCP flags set/unset */ +#define IP_FW_ICMPTYPES_DIM (256 / (sizeof(unsigned) * 8)) + unsigned fw_icmptypes[IP_FW_ICMPTYPES_DIM]; /* ICMP types bitmap */ + long timestamp; /* timestamp (tv_sec) of last match */ +}; + +struct ip_fw_chain { + LIST_ENTRY(ip_fw_chain) chain; + struct ip_fw *rule; +}; + +/* + * Values for "flags" field . + */ + +#define IP_FW_F_ALL 0x0000 /* This is a universal packet rule */ +#define IP_FW_F_TCP 0x0001 /* This is a TCP packet rule */ +#define IP_FW_F_UDP 0x0002 /* This is a UDP packet rule */ +#define IP_FW_F_ICMP 0x0003 /* This is a ICMP packet rule */ +#define IP_FW_F_KIND 0x0003 /* Mask to isolate rule kind */ + +#define IP_FW_F_IN 0x0004 /* Inbound */ +#define IP_FW_F_OUT 0x0008 /* Outbound */ + +#define IP_FW_F_ACCEPT 0x0010 /* This is an accept rule */ +#define IP_FW_F_COUNT 0x0020 /* This is an accept rule */ +#define IP_FW_F_PRN 0x0040 /* Print if this rule matches */ +#define IP_FW_F_ICMPRPL 0x0080 /* Send back icmp unreachable packet */ + +#define IP_FW_F_SRNG 0x0100 /* The first two src ports are a min * + * and max range (stored in host byte * + * order). */ + +#define IP_FW_F_DRNG 0x0200 /* The first two dst ports are a min * + * and max range (stored in host byte * + * order). */ + +#define IP_FW_F_IFNAME 0x0400 /* Use interface name/unit (not IP) */ + +#define IP_FW_F_FRAG 0x0800 /* Fragment */ + +#define IP_FW_F_ICMPBIT 0x1000 /* ICMP type bitmap is valid */ + +#define IP_FW_F_IFUWILD 0x2000 /* Match all interface units */ + +#define IP_FW_F_MASK 0x3FFF /* All possible flag bits mask */ + +/* + * Definitions for IP option names. + */ +#define IP_FW_IPOPT_LSRR 0x01 +#define IP_FW_IPOPT_SSRR 0x02 +#define IP_FW_IPOPT_RR 0x04 +#define IP_FW_IPOPT_TS 0x08 + +/* + * Definitions for TCP flags. + */ +#define IP_FW_TCPF_FIN TH_FIN +#define IP_FW_TCPF_SYN TH_SYN +#define IP_FW_TCPF_RST TH_RST +#define IP_FW_TCPF_PSH TH_PUSH +#define IP_FW_TCPF_ACK TH_ACK +#define IP_FW_TCPF_URG TH_URG +#define IP_FW_TCPF_ESTAB 0x40 + +/* + * New IP firewall options for [gs]etsockopt at the RAW IP level. + */ +#define IP_FW_BASE_CTL 50 + +#define IP_FW_ADD (IP_FW_BASE_CTL+0) +#define IP_FW_DEL (IP_FW_BASE_CTL+1) +#define IP_FW_FLUSH (IP_FW_BASE_CTL+2) +#define IP_FW_ZERO (IP_FW_BASE_CTL+3) +#define IP_FW_GET (IP_FW_BASE_CTL+4) + +/* + * Main firewall chains definitions and global var's definitions. + */ +#ifdef KERNEL + +/* + * Function pointers. + */ +extern int (*ip_fw_chk_ptr)(struct mbuf *, struct ip *,struct ifnet *, int dir); +extern int (*ip_fw_ctl_ptr)(int,struct mbuf **); + +/* + * Function definitions. + */ +void ip_fw_init(void); + +#endif /* KERNEL */ + +#endif /* _IP_FW_H */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/ip_icmp.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/ip_icmp.h new file mode 100644 index 00000000000..a4b49c36706 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/ip_icmp.h @@ -0,0 +1,184 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ip_icmp.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_IP_ICMP_H_ +#define _NETINET_IP_ICMP_H_ + +/* + * Interface Control Message Protocol Definitions. + * Per RFC 792, September 1981. + */ + +/* + * Internal of an ICMP Router Advertisement + */ +struct icmp_ra_addr { + u_int32_t ira_addr; + u_int32_t ira_preference; +}; + +/* + * Structure of an icmp header. + */ +struct icmp { + u_char icmp_type; /* type of message, see below */ + u_char icmp_code; /* type sub code */ + u_short icmp_cksum; /* ones complement cksum of struct */ + union { + u_char ih_pptr; /* ICMP_PARAMPROB */ + struct in_addr ih_gwaddr; /* ICMP_REDIRECT */ + struct ih_idseq { + n_short icd_id; + n_short icd_seq; + } ih_idseq; + int ih_void; + + /* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */ + struct ih_pmtu { + n_short ipm_void; + n_short ipm_nextmtu; + } ih_pmtu; + + struct ih_rtradv { + u_char irt_num_addrs; + u_char irt_wpa; + u_int16_t irt_lifetime; + } ih_rtradv; + } icmp_hun; +#define icmp_pptr icmp_hun.ih_pptr +#define icmp_gwaddr icmp_hun.ih_gwaddr +#define icmp_id icmp_hun.ih_idseq.icd_id +#define icmp_seq icmp_hun.ih_idseq.icd_seq +#define icmp_void icmp_hun.ih_void +#define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void +#define icmp_nextmtu icmp_hun.ih_pmtu.ipm_nextmtu +#define icmp_num_addrs icmp_hun.ih_rtradv.irt_num_addrs +#define icmp_wpa icmp_hun.ih_rtradv.irt_wpa +#define icmp_lifetime icmp_hun.ih_rtradv.irt_lifetime + union { + struct id_ts { + n_time its_otime; + n_time its_rtime; + n_time its_ttime; + } id_ts; + struct id_ip { + struct ip idi_ip; + /* options and then 64 bits of data */ + } id_ip; + struct icmp_ra_addr id_radv; + u_long id_mask; + char id_data[1]; + } icmp_dun; +#define icmp_otime icmp_dun.id_ts.its_otime +#define icmp_rtime icmp_dun.id_ts.its_rtime +#define icmp_ttime icmp_dun.id_ts.its_ttime +#define icmp_ip icmp_dun.id_ip.idi_ip +#define icmp_radv icmp_dun.id_radv +#define icmp_mask icmp_dun.id_mask +#define icmp_data icmp_dun.id_data +}; + +/* + * Lower bounds on packet lengths for various types. + * For the error advice packets must first insure that the + * packet is large enough to contain the returned ip header. + * Only then can we do the check to see if 64 bits of packet + * data have been returned, since we need to check the returned + * ip header length. + */ +#define ICMP_MINLEN 8 /* abs minimum */ +#define ICMP_TSLEN (8 + 3 * sizeof (n_time)) /* timestamp */ +#define ICMP_MASKLEN 12 /* address mask */ +#define ICMP_ADVLENMIN (8 + sizeof (struct ip) + 8) /* min */ +#define ICMP_ADVLEN(p) (8 + ((p)->icmp_ip.ip_hl << 2) + 8) + /* N.B.: must separately check that ip_hl >= 5 */ + +/* + * Definition of type and code field values. + */ +#define ICMP_ECHOREPLY 0 /* echo reply */ +#define ICMP_UNREACH 3 /* dest unreachable, codes: */ +#define ICMP_UNREACH_NET 0 /* bad net */ +#define ICMP_UNREACH_HOST 1 /* bad host */ +#define ICMP_UNREACH_PROTOCOL 2 /* bad protocol */ +#define ICMP_UNREACH_PORT 3 /* bad port */ +#define ICMP_UNREACH_NEEDFRAG 4 /* IP_DF caused drop */ +#define ICMP_UNREACH_SRCFAIL 5 /* src route failed */ +#define ICMP_UNREACH_NET_UNKNOWN 6 /* unknown net */ +#define ICMP_UNREACH_HOST_UNKNOWN 7 /* unknown host */ +#define ICMP_UNREACH_ISOLATED 8 /* src host isolated */ +#define ICMP_UNREACH_NET_PROHIB 9 /* prohibited access */ +#define ICMP_UNREACH_HOST_PROHIB 10 /* ditto */ +#define ICMP_UNREACH_TOSNET 11 /* bad tos for net */ +#define ICMP_UNREACH_TOSHOST 12 /* bad tos for host */ +#define ICMP_SOURCEQUENCH 4 /* packet lost, slow down */ +#define ICMP_REDIRECT 5 /* shorter route, codes: */ +#define ICMP_REDIRECT_NET 0 /* for network */ +#define ICMP_REDIRECT_HOST 1 /* for host */ +#define ICMP_REDIRECT_TOSNET 2 /* for tos and net */ +#define ICMP_REDIRECT_TOSHOST 3 /* for tos and host */ +#define ICMP_ECHO 8 /* echo service */ +#define ICMP_ROUTERADVERT 9 /* router advertisement */ +#define ICMP_ROUTERSOLICIT 10 /* router solicitation */ +#define ICMP_TIMXCEED 11 /* time exceeded, code: */ +#define ICMP_TIMXCEED_INTRANS 0 /* ttl==0 in transit */ +#define ICMP_TIMXCEED_REASS 1 /* ttl==0 in reass */ +#define ICMP_PARAMPROB 12 /* ip header bad */ +#define ICMP_PARAMPROB_OPTABSENT 1 /* req. opt. absent */ +#define ICMP_TSTAMP 13 /* timestamp request */ +#define ICMP_TSTAMPREPLY 14 /* timestamp reply */ +#define ICMP_IREQ 15 /* information request */ +#define ICMP_IREQREPLY 16 /* information reply */ +#define ICMP_MASKREQ 17 /* address mask request */ +#define ICMP_MASKREPLY 18 /* address mask reply */ + +#define ICMP_MAXTYPE 18 + +#define ICMP_INFOTYPE(type) \ + ((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || \ + (type) == ICMP_ROUTERADVERT || (type) == ICMP_ROUTERSOLICIT || \ + (type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \ + (type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || \ + (type) == ICMP_MASKREQ || (type) == ICMP_MASKREPLY) + +#ifdef KERNEL +void icmp_error __P((struct mbuf *, int, int, n_long, struct ifnet *)); +void icmp_input __P((struct mbuf *, int)); +void icmp_reflect __P((struct mbuf *)); +void icmp_send __P((struct mbuf *, struct mbuf *)); +int icmp_sysctl __P((int *, u_int, void *, size_t *, void *, size_t)); +#endif + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/ip_var.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/ip_var.h new file mode 100644 index 00000000000..351ebf146e9 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/ip_var.h @@ -0,0 +1,210 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ip_var.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_IP_VAR_H_ +#define _NETINET_IP_VAR_H_ + +/* + * Overlay for ip header used by other protocols (tcp, udp). + */ +struct ipovly { + caddr_t ih_next, ih_prev; /* for protocol sequence q's */ + u_char ih_x1; /* (unused) */ + u_char ih_pr; /* protocol */ + short ih_len; /* protocol length */ + struct in_addr ih_src; /* source internet address */ + struct in_addr ih_dst; /* destination internet address */ +}; + +/* + * Ip reassembly queue structure. Each fragment + * being reassembled is attached to one of these structures. + * They are timed out after ipq_ttl drops to 0, and may also + * be reclaimed if memory becomes tight. + */ +struct ipq { + struct ipq *next,*prev; /* to other reass headers */ + u_char ipq_ttl; /* time for reass q to live */ + u_char ipq_p; /* protocol of this fragment */ + u_short ipq_id; /* sequence id for reassembly */ + struct ipasfrag *ipq_next,*ipq_prev; + /* to ip headers of fragments */ + struct in_addr ipq_src,ipq_dst; +}; + +/* + * Ip header, when holding a fragment. + * + * Note: ipf_next must be at same offset as ipq_next above + */ +struct ipasfrag { +#if BYTE_ORDER == LITTLE_ENDIAN + u_char ip_hl:4, + ip_v:4; +#endif +#if BYTE_ORDER == BIG_ENDIAN + u_char ip_v:4, + ip_hl:4; +#endif + u_char ipf_mff; /* XXX overlays ip_tos: use low bit + * to avoid destroying tos; + * copied from (ip_off&IP_MF) */ + short ip_len; + u_short ip_id; + short ip_off; + u_char ip_ttl; + u_char ip_p; + u_short ip_sum; + struct ipasfrag *ipf_next; /* next fragment */ + struct ipasfrag *ipf_prev; /* previous fragment */ +}; + +/* + * Structure stored in mbuf in inpcb.ip_options + * and passed to ip_output when ip options are in use. + * The actual length of the options (including ipopt_dst) + * is in m_len. + */ +#define MAX_IPOPTLEN 40 + +struct ipoption { + struct in_addr ipopt_dst; /* first-hop dst if source routed */ + char ipopt_list[MAX_IPOPTLEN]; /* options proper */ +}; + +/* + * Structure attached to inpcb.ip_moptions and + * passed to ip_output when IP multicast options are in use. + */ +struct ip_moptions { + struct ifnet *imo_multicast_ifp; /* ifp for outgoing multicasts */ + u_char imo_multicast_ttl; /* TTL for outgoing multicasts */ + u_char imo_multicast_loop; /* 1 => hear sends if a member */ + u_short imo_num_memberships; /* no. memberships this socket */ + struct in_multi *imo_membership[IP_MAX_MEMBERSHIPS]; + u_long imo_multicast_vif; /* vif num outgoing multicasts */ +}; + +struct ipstat { + u_long ips_total; /* total packets received */ + u_long ips_badsum; /* checksum bad */ + u_long ips_tooshort; /* packet too short */ + u_long ips_toosmall; /* not enough data */ + u_long ips_badhlen; /* ip header length < data size */ + u_long ips_badlen; /* ip length < ip header length */ + u_long ips_fragments; /* fragments received */ + u_long ips_fragdropped; /* frags dropped (dups, out of space) */ + u_long ips_fragtimeout; /* fragments timed out */ + u_long ips_forward; /* packets forwarded */ + u_long ips_cantforward; /* packets rcvd for unreachable dest */ + u_long ips_redirectsent; /* packets forwarded on same net */ + u_long ips_noproto; /* unknown or unsupported protocol */ + u_long ips_delivered; /* datagrams delivered to upper level*/ + u_long ips_localout; /* total ip packets generated here */ + u_long ips_odropped; /* lost packets due to nobufs, etc. */ + u_long ips_reassembled; /* total packets reassembled ok */ + u_long ips_fragmented; /* datagrams sucessfully fragmented */ + u_long ips_ofragments; /* output fragments created */ + u_long ips_cantfrag; /* don't fragment flag was set, etc. */ + u_long ips_badoptions; /* error in option processing */ + u_long ips_noroute; /* packets discarded due to no route */ + u_long ips_badvers; /* ip version != 4 */ + u_long ips_rawout; /* total raw ip packets generated */ +}; + +#ifdef KERNEL +/* flags passed to ip_output as last parameter */ +#define IP_FORWARDING 0x1 /* most of ip header exists */ +#define IP_RAWOUTPUT 0x2 /* raw ip header exists */ +#define IP_ROUTETOIF SO_DONTROUTE /* bypass routing tables */ +#define IP_ALLOWBROADCAST SO_BROADCAST /* can send broadcast packets */ + +extern struct ipstat ipstat; +extern struct ipq ipq; /* ip reass. queue */ +extern u_short ip_id; /* ip packet ctr, for ids */ +extern int ip_defttl; /* default IP ttl */ +extern u_char ip_protox[]; +extern struct socket *ip_rsvpd; /* reservation protocol daemon */ +extern struct socket *ip_mrouter; /* multicast routing daemon */ +extern int (*legal_vif_num) __P((int)); +extern u_long (*ip_mcast_src) __P((int)); +extern int rsvp_on; + +int ip_ctloutput __P((int, struct socket *, int, int, struct mbuf **)); +void ip_deq __P((struct ipasfrag *)); +int ip_dooptions __P((struct mbuf *)); +void ip_drain __P((void)); +void ip_enq __P((struct ipasfrag *, struct ipasfrag *)); +void ip_forward __P((struct mbuf *, int)); +void ip_freef __P((struct ipq *)); +void ip_freemoptions __P((struct ip_moptions *)); +int ip_getmoptions __P((int, struct ip_moptions *, struct mbuf **)); +void ip_init __P((void)); +extern int (*ip_mforward) __P((struct ip *, struct ifnet *, struct mbuf *, + struct ip_moptions *)); +int ip_next_mtu __P((int, int)); +int ip_optcopy __P((struct ip *, struct ip *)); +int ip_output __P((struct socket *so, struct mbuf *, + struct mbuf *, struct route *, int, struct ip_moptions *)); +int ip_pcbopts __P((struct mbuf **, struct mbuf *)); +struct ip * + ip_reass __P((struct ipasfrag *, struct ipq *)); +struct in_ifaddr * + ip_rtaddr __P((struct in_addr)); +int ip_setmoptions __P((int, struct ip_moptions **, struct mbuf *)); +void ip_slowtimo __P((void)); +struct mbuf * + ip_srcroute __P((void)); +void ip_stripoptions __P((struct mbuf *, struct mbuf *)); +int ip_sysctl __P((int *, u_int, void *, size_t *, void *, size_t)); +void ipintr __P((void)); +int rip_ctloutput __P((int, struct socket *, int, int, struct mbuf **)); +void rip_init __P((void)); +void rip_input __P((struct mbuf *)); +int rip_output __P((struct mbuf *, struct socket *, u_long)); +int rip_usrreq __P((struct socket *, + int, struct mbuf *, struct mbuf *, struct mbuf *)); +int ip_rsvp_init __P((struct socket *)); +int ip_rsvp_done __P((void)); +int ip_rsvp_vif_init __P((struct socket *, struct mbuf *)); +int ip_rsvp_vif_done __P((struct socket *, struct mbuf *)); +void ip_rsvp_force_done __P((struct socket *)); + +void rip_ip_input __P((struct mbuf *mm, + register struct socket *ip_mrouter, struct sockaddr *src)); + +#endif + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcp.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcp.h new file mode 100644 index 00000000000..d8af2c684da --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcp.h @@ -0,0 +1,121 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcp.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_TCP_H_ +#define _NETINET_TCP_H_ + +typedef u_long tcp_seq; +typedef u_long tcp_cc; /* connection count per rfc1644 */ + +/* + * TCP header. + * Per RFC 793, September, 1981. + */ +struct tcphdr { + u_short th_sport; /* source port */ + u_short th_dport; /* destination port */ + tcp_seq th_seq; /* sequence number */ + tcp_seq th_ack; /* acknowledgement number */ +#if BYTE_ORDER == LITTLE_ENDIAN + u_char th_x2:4, /* (unused) */ + th_off:4; /* data offset */ +#endif +#if BYTE_ORDER == BIG_ENDIAN + u_char th_off:4, /* data offset */ + th_x2:4; /* (unused) */ +#endif + u_char th_flags; +#define TH_FIN 0x01 +#define TH_SYN 0x02 +#define TH_RST 0x04 +#define TH_PUSH 0x08 +#define TH_ACK 0x10 +#define TH_URG 0x20 +#define TH_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG) + + u_short th_win; /* window */ + u_short th_sum; /* checksum */ + u_short th_urp; /* urgent pointer */ +}; + +#define TCPOPT_EOL 0 +#define TCPOPT_NOP 1 +#define TCPOPT_MAXSEG 2 +#define TCPOLEN_MAXSEG 4 +#define TCPOPT_WINDOW 3 +#define TCPOLEN_WINDOW 3 +#define TCPOPT_SACK_PERMITTED 4 /* Experimental */ +#define TCPOLEN_SACK_PERMITTED 2 +#define TCPOPT_SACK 5 /* Experimental */ +#define TCPOPT_TIMESTAMP 8 +#define TCPOLEN_TIMESTAMP 10 +#define TCPOLEN_TSTAMP_APPA (TCPOLEN_TIMESTAMP+2) /* appendix A */ +#define TCPOPT_TSTAMP_HDR \ + (TCPOPT_NOP<<24|TCPOPT_NOP<<16|TCPOPT_TIMESTAMP<<8|TCPOLEN_TIMESTAMP) + +#define TCPOPT_CC 11 /* CC options: RFC-1644 */ +#define TCPOPT_CCNEW 12 +#define TCPOPT_CCECHO 13 +#define TCPOLEN_CC 6 +#define TCPOLEN_CC_APPA (TCPOLEN_CC+2) +#define TCPOPT_CC_HDR(ccopt) \ + (TCPOPT_NOP<<24|TCPOPT_NOP<<16|(ccopt)<<8|TCPOLEN_CC) + +/* + * Default maximum segment size for TCP. + * With an IP MSS of 576, this is 536, + * but 512 is probably more convenient. + * This should be defined as MIN(512, IP_MSS - sizeof (struct tcpiphdr)). + */ +#define TCP_MSS 512 + +#define TCP_MAXWIN 65535 /* largest value for (unscaled) window */ +#define TTCP_CLIENT_SND_WND 4096 /* dflt send window for T/TCP client */ + +#define TCP_MAX_WINSHIFT 14 /* maximum window shift */ + +#define TCP_MAXHLEN (0xf<<2) /* max length of header in bytes */ +#define TCP_MAXOLEN (TCP_MAXHLEN - sizeof(struct tcphdr)) + /* max space left for options */ + +/* + * User-settable options (used with setsockopt). + */ +#define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */ +#define TCP_MAXSEG 0x02 /* set maximum segment size */ +#define TCP_NOPUSH 0x04 /* don't push last block of write */ +#define TCP_NOOPT 0x08 /* don't use TCP options */ + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_debug.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_debug.h new file mode 100644 index 00000000000..5266eeb64f1 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_debug.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcp_debug.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_TCP_DEBUG_H_ +#define _NETINET_TCP_DEBUG_H_ + +struct tcp_debug { + n_time td_time; + short td_act; + short td_ostate; + caddr_t td_tcb; + struct tcpiphdr td_ti; + short td_req; + struct tcpcb td_cb; +}; + +#define TA_INPUT 0 +#define TA_OUTPUT 1 +#define TA_USER 2 +#define TA_RESPOND 3 +#define TA_DROP 4 + +#ifdef TANAMES +char *tanames[] = + { "input", "output", "user", "respond", "drop" }; +#endif + +#define TCP_NDEBUG 100 +struct tcp_debug tcp_debug[TCP_NDEBUG]; +int tcp_debx; + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_fsm.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_fsm.h new file mode 100644 index 00000000000..5cbb3ec697b --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_fsm.h @@ -0,0 +1,91 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcp_fsm.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_TCP_FSM_H_ +#define _NETINET_TCP_FSM_H_ + +/* + * TCP FSM state definitions. + * Per RFC793, September, 1981. + */ + +#define TCP_NSTATES 11 + +#define TCPS_CLOSED 0 /* closed */ +#define TCPS_LISTEN 1 /* listening for connection */ +#define TCPS_SYN_SENT 2 /* active, have sent syn */ +#define TCPS_SYN_RECEIVED 3 /* have send and received syn */ +/* states < TCPS_ESTABLISHED are those where connections not established */ +#define TCPS_ESTABLISHED 4 /* established */ +#define TCPS_CLOSE_WAIT 5 /* rcvd fin, waiting for close */ +/* states > TCPS_CLOSE_WAIT are those where user has closed */ +#define TCPS_FIN_WAIT_1 6 /* have closed, sent fin */ +#define TCPS_CLOSING 7 /* closed xchd FIN; await FIN ACK */ +#define TCPS_LAST_ACK 8 /* had fin and close; await FIN ACK */ +/* states > TCPS_CLOSE_WAIT && < TCPS_FIN_WAIT_2 await ACK of FIN */ +#define TCPS_FIN_WAIT_2 9 /* have closed, fin is acked */ +#define TCPS_TIME_WAIT 10 /* in 2*msl quiet wait after close */ + +#define TCPS_HAVERCVDSYN(s) ((s) >= TCPS_SYN_RECEIVED) +#define TCPS_HAVEESTABLISHED(s) ((s) >= TCPS_ESTABLISHED) +#define TCPS_HAVERCVDFIN(s) ((s) >= TCPS_TIME_WAIT) + +#ifdef TCPOUTFLAGS +/* + * Flags used when sending segments in tcp_output. + * Basic flags (TH_RST,TH_ACK,TH_SYN,TH_FIN) are totally + * determined by state, with the proviso that TH_FIN is sent only + * if all data queued for output is included in the segment. + */ +u_char tcp_outflags[TCP_NSTATES] = { + TH_RST|TH_ACK, 0, TH_SYN, TH_SYN|TH_ACK, + TH_ACK, TH_ACK, + TH_FIN|TH_ACK, TH_FIN|TH_ACK, TH_FIN|TH_ACK, TH_ACK, TH_ACK, +}; +#endif + +#ifdef KPROF +int tcp_acounts[TCP_NSTATES][PRU_NREQ]; +#endif + +#ifdef TCPSTATES +char *tcpstates[] = { + "CLOSED", "LISTEN", "SYN_SENT", "SYN_RCVD", + "ESTABLISHED", "CLOSE_WAIT", "FIN_WAIT_1", "CLOSING", + "LAST_ACK", "FIN_WAIT_2", "TIME_WAIT", +}; +#endif + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_seq.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_seq.h new file mode 100644 index 00000000000..9baf72e5e2f --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_seq.h @@ -0,0 +1,86 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcp_seq.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_TCP_SEQ_H_ +#define _NETINET_TCP_SEQ_H_ +/* + * TCP sequence numbers are 32 bit integers operated + * on with modular arithmetic. These macros can be + * used to compare such integers. + */ +#define SEQ_LT(a,b) ((int)((a)-(b)) < 0) +#define SEQ_LEQ(a,b) ((int)((a)-(b)) <= 0) +#define SEQ_GT(a,b) ((int)((a)-(b)) > 0) +#define SEQ_GEQ(a,b) ((int)((a)-(b)) >= 0) + +/* for modulo comparisons of timestamps */ +#define TSTMP_LT(a,b) ((int)((a)-(b)) < 0) +#define TSTMP_GEQ(a,b) ((int)((a)-(b)) >= 0) + +/* + * TCP connection counts are 32 bit integers operated + * on with modular arithmetic. These macros can be + * used to compare such integers. + */ +#define CC_LT(a,b) ((int)((a)-(b)) < 0) +#define CC_LEQ(a,b) ((int)((a)-(b)) <= 0) +#define CC_GT(a,b) ((int)((a)-(b)) > 0) +#define CC_GEQ(a,b) ((int)((a)-(b)) >= 0) + +/* Macro to increment a CC: skip 0 which has a special meaning */ +#define CC_INC(c) (++(c) == 0 ? ++(c) : (c)) + +/* + * Macros to initialize tcp sequence numbers for + * send and receive from initial send and receive + * sequence numbers. + */ +#define tcp_rcvseqinit(tp) \ + (tp)->rcv_adv = (tp)->rcv_nxt = (tp)->irs + 1 + +#define tcp_sendseqinit(tp) \ + (tp)->snd_una = (tp)->snd_nxt = (tp)->snd_max = (tp)->snd_up = \ + (tp)->iss + +#define TCP_ISSINCR (125*1024) /* increment for tcp_iss each second */ + +#define TCP_PAWS_IDLE (24 * 24 * 60 * 60 * PR_SLOWHZ) + /* timestamp wrap-around time */ + +#ifdef KERNEL +extern tcp_seq tcp_iss; /* tcp initial send seq # */ +extern tcp_cc tcp_ccgen; /* global connection count */ +#endif +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_timer.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_timer.h new file mode 100644 index 00000000000..dd96dc9bf14 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_timer.h @@ -0,0 +1,136 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcp_timer.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_TCP_TIMER_H_ +#define _NETINET_TCP_TIMER_H_ + +/* + * Definitions of the TCP timers. These timers are counted + * down PR_SLOWHZ times a second. + */ +#define TCPT_NTIMERS 4 + +#define TCPT_REXMT 0 /* retransmit */ +#define TCPT_PERSIST 1 /* retransmit persistance */ +#define TCPT_KEEP 2 /* keep alive */ +#define TCPT_2MSL 3 /* 2*msl quiet time timer */ + +/* + * The TCPT_REXMT timer is used to force retransmissions. + * The TCP has the TCPT_REXMT timer set whenever segments + * have been sent for which ACKs are expected but not yet + * received. If an ACK is received which advances tp->snd_una, + * then the retransmit timer is cleared (if there are no more + * outstanding segments) or reset to the base value (if there + * are more ACKs expected). Whenever the retransmit timer goes off, + * we retransmit one unacknowledged segment, and do a backoff + * on the retransmit timer. + * + * The TCPT_PERSIST timer is used to keep window size information + * flowing even if the window goes shut. If all previous transmissions + * have been acknowledged (so that there are no retransmissions in progress), + * and the window is too small to bother sending anything, then we start + * the TCPT_PERSIST timer. When it expires, if the window is nonzero, + * we go to transmit state. Otherwise, at intervals send a single byte + * into the peer's window to force him to update our window information. + * We do this at most as often as TCPT_PERSMIN time intervals, + * but no more frequently than the current estimate of round-trip + * packet time. The TCPT_PERSIST timer is cleared whenever we receive + * a window update from the peer. + * + * The TCPT_KEEP timer is used to keep connections alive. If an + * connection is idle (no segments received) for TCPTV_KEEP_INIT amount of time, + * but not yet established, then we drop the connection. Once the connection + * is established, if the connection is idle for TCPTV_KEEP_IDLE time + * (and keepalives have been enabled on the socket), we begin to probe + * the connection. We force the peer to send us a segment by sending: + * <SEQ=SND.UNA-1><ACK=RCV.NXT><CTL=ACK> + * This segment is (deliberately) outside the window, and should elicit + * an ack segment in response from the peer. If, despite the TCPT_KEEP + * initiated segments we cannot elicit a response from a peer in TCPT_MAXIDLE + * amount of time probing, then we drop the connection. + */ + +/* + * Time constants. + */ +#define TCPTV_MSL ( 30*PR_SLOWHZ) /* max seg lifetime (hah!) */ +#define TCPTV_SRTTBASE 0 /* base roundtrip time; + if 0, no idea yet */ +#define TCPTV_SRTTDFLT ( 3*PR_SLOWHZ) /* assumed RTT if no info */ + +#define TCPTV_PERSMIN ( 5*PR_SLOWHZ) /* retransmit persistance */ +#define TCPTV_PERSMAX ( 60*PR_SLOWHZ) /* maximum persist interval */ + +#define TCPTV_KEEP_INIT ( 75*PR_SLOWHZ) /* initial connect keep alive */ +#define TCPTV_KEEP_IDLE (120*60*PR_SLOWHZ) /* dflt time before probing */ +#define TCPTV_KEEPINTVL ( 75*PR_SLOWHZ) /* default probe interval */ +#define TCPTV_KEEPCNT 8 /* max probes before drop */ + +#define TCPTV_MIN ( 1*PR_SLOWHZ) /* minimum allowable value */ +#define TCPTV_REXMTMAX ( 64*PR_SLOWHZ) /* max allowable REXMT value */ + +#define TCPTV_TWTRUNC 8 /* RTO factor to truncate TW */ + +#define TCP_LINGERTIME 120 /* linger at most 2 minutes */ + +#define TCP_MAXRXTSHIFT 12 /* maximum retransmits */ + +#ifdef TCPTIMERS +char *tcptimers[] = + { "REXMT", "PERSIST", "KEEP", "2MSL" }; +#endif + +/* + * Force a time value to be in a certain range. + */ +#define TCPT_RANGESET(tv, value, tvmin, tvmax) { \ + (tv) = (value); \ + if ((u_long)(tv) < (u_long)(tvmin)) \ + (tv) = (tvmin); \ + else if ((u_long)(tv) > (u_long)(tvmax)) \ + (tv) = (tvmax); \ +} + +#ifdef KERNEL +extern int tcp_keepinit; /* time to establish connection */ +extern int tcp_keepidle; /* time before keepalive probes begin */ +extern int tcp_keepintvl; /* time between keepalive probes */ +extern int tcp_maxidle; /* time to drop after starting probes */ +extern int tcp_ttl; /* time to live for TCP segs */ +extern int tcp_backoff[]; +#endif + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_var.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_var.h new file mode 100644 index 00000000000..a7eb3e2ac42 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_var.h @@ -0,0 +1,387 @@ +/* + * Copyright (c) 1982, 1986, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcp_var.h 8.3 (Berkeley) 4/10/94 + */ + +#ifndef _NETINET_TCP_VAR_H_ +#define _NETINET_TCP_VAR_H_ +/* + * Kernel variables for tcp. + */ + +/* + * Tcp control block, one per tcp; fields: + */ +struct tcpcb { + struct tcpiphdr *seg_next; /* sequencing queue */ + struct tcpiphdr *seg_prev; + int t_state; /* state of this connection */ + int t_timer[TCPT_NTIMERS]; /* tcp timers */ + int t_rxtshift; /* log(2) of rexmt exp. backoff */ + int t_rxtcur; /* current retransmit value */ + int t_dupacks; /* consecutive dup acks recd */ + u_int t_maxseg; /* maximum segment size */ + u_int t_maxopd; /* mss plus options */ + int t_force; /* 1 if forcing out a byte */ + u_int t_flags; +#define TF_ACKNOW 0x0001 /* ack peer immediately */ +#define TF_DELACK 0x0002 /* ack, but try to delay it */ +#define TF_NODELAY 0x0004 /* don't delay packets to coalesce */ +#define TF_NOOPT 0x0008 /* don't use tcp options */ +#define TF_SENTFIN 0x0010 /* have sent FIN */ +#define TF_REQ_SCALE 0x0020 /* have/will request window scaling */ +#define TF_RCVD_SCALE 0x0040 /* other side has requested scaling */ +#define TF_REQ_TSTMP 0x0080 /* have/will request timestamps */ +#define TF_RCVD_TSTMP 0x0100 /* a timestamp was received in SYN */ +#define TF_SACK_PERMIT 0x0200 /* other side said I could SACK */ +#define TF_NEEDSYN 0x0400 /* send SYN (implicit state) */ +#define TF_NEEDFIN 0x0800 /* send FIN (implicit state) */ +#define TF_NOPUSH 0x1000 /* don't push */ +#define TF_REQ_CC 0x2000 /* have/will request CC */ +#define TF_RCVD_CC 0x4000 /* a CC was received in SYN */ +#define TF_SENDCCNEW 0x8000 /* send CCnew instead of CC in SYN */ + + struct tcpiphdr *t_template; /* skeletal packet for transmit */ + struct inpcb *t_inpcb; /* back pointer to internet pcb */ +/* + * The following fields are used as in the protocol specification. + * See RFC783, Dec. 1981, page 21. + */ +/* send sequence variables */ + tcp_seq snd_una; /* send unacknowledged */ + tcp_seq snd_nxt; /* send next */ + tcp_seq snd_up; /* send urgent pointer */ + tcp_seq snd_wl1; /* window update seg seq number */ + tcp_seq snd_wl2; /* window update seg ack number */ + tcp_seq iss; /* initial send sequence number */ + u_long snd_wnd; /* send window */ +/* receive sequence variables */ + u_long rcv_wnd; /* receive window */ + tcp_seq rcv_nxt; /* receive next */ + tcp_seq rcv_up; /* receive urgent pointer */ + tcp_seq irs; /* initial receive sequence number */ +/* + * Additional variables for this implementation. + */ +/* receive variables */ + tcp_seq rcv_adv; /* advertised window */ +/* retransmit variables */ + tcp_seq snd_max; /* highest sequence number sent; + * used to recognize retransmits + */ +/* congestion control (for slow start, source quench, retransmit after loss) */ + u_long snd_cwnd; /* congestion-controlled window */ + u_long snd_ssthresh; /* snd_cwnd size threshhold for + * for slow start exponential to + * linear switch + */ +/* + * transmit timing stuff. See below for scale of srtt and rttvar. + * "Variance" is actually smoothed difference. + */ + u_int t_idle; /* inactivity time */ + int t_rtt; /* round trip time */ + tcp_seq t_rtseq; /* sequence number being timed */ + int t_srtt; /* smoothed round-trip time */ + int t_rttvar; /* variance in round-trip time */ + u_int t_rttmin; /* minimum rtt allowed */ + u_long max_sndwnd; /* largest window peer has offered */ + +/* out-of-band data */ + char t_oobflags; /* have some */ + char t_iobc; /* input character */ +#define TCPOOB_HAVEDATA 0x01 +#define TCPOOB_HADDATA 0x02 + int t_softerror; /* possible error not yet reported */ + +/* RFC 1323 variables */ + u_char snd_scale; /* window scaling for send window */ + u_char rcv_scale; /* window scaling for recv window */ + u_char request_r_scale; /* pending window scaling */ + u_char requested_s_scale; + u_long ts_recent; /* timestamp echo data */ + u_long ts_recent_age; /* when last updated */ + tcp_seq last_ack_sent; +/* RFC 1644 variables */ + tcp_cc cc_send; /* send connection count */ + tcp_cc cc_recv; /* receive connection count */ + u_long t_duration; /* connection duration */ + +/* TUBA stuff */ + caddr_t t_tuba_pcb; /* next level down pcb for TCP over z */ +/* More RTT stuff */ + u_long t_rttupdated; /* number of times rtt sampled */ +}; + +/* + * Structure to hold TCP options that are only used during segment + * processing (in tcp_input), but not held in the tcpcb. + * It's basically used to reduce the number of parameters + * to tcp_dooptions. + */ +struct tcpopt { + u_long to_flag; /* which options are present */ +#define TOF_TS 0x0001 /* timestamp */ +#define TOF_CC 0x0002 /* CC and CCnew are exclusive */ +#define TOF_CCNEW 0x0004 +#define TOF_CCECHO 0x0008 + u_long to_tsval; + u_long to_tsecr; + tcp_cc to_cc; /* holds CC or CCnew */ + tcp_cc to_ccecho; +}; + +/* + * The TAO cache entry which is stored in the protocol family specific + * portion of the route metrics. + */ +struct rmxp_tao { + tcp_cc tao_cc; /* latest CC in valid SYN */ + tcp_cc tao_ccsent; /* latest CC sent to peer */ + u_short tao_mssopt; /* peer's cached MSS */ +#ifdef notyet + u_short tao_flags; /* cache status flags */ +#define TAOF_DONT 0x0001 /* peer doesn't understand rfc1644 */ +#define TAOF_OK 0x0002 /* peer does understand rfc1644 */ +#define TAOF_UNDEF 0 /* we don't know yet */ +#endif /* notyet */ +}; +#define rmx_taop(r) ((struct rmxp_tao *)(r).rmx_filler) + +#define intotcpcb(ip) ((struct tcpcb *)(ip)->inp_ppcb) +#define sototcpcb(so) (intotcpcb(sotoinpcb(so))) + +/* + * The smoothed round-trip time and estimated variance + * are stored as fixed point numbers scaled by the values below. + * For convenience, these scales are also used in smoothing the average + * (smoothed = (1/scale)sample + ((scale-1)/scale)smoothed). + * With these scales, srtt has 3 bits to the right of the binary point, + * and thus an "ALPHA" of 0.875. rttvar has 2 bits to the right of the + * binary point, and is smoothed with an ALPHA of 0.75. + */ +#define TCP_RTT_SCALE 8 /* multiplier for srtt; 3 bits frac. */ +#define TCP_RTT_SHIFT 3 /* shift for srtt; 3 bits frac. */ +#define TCP_RTTVAR_SCALE 4 /* multiplier for rttvar; 2 bits */ +#define TCP_RTTVAR_SHIFT 2 /* shift for rttvar; 2 bits */ + +/* + * The initial retransmission should happen at rtt + 4 * rttvar. + * Because of the way we do the smoothing, srtt and rttvar + * will each average +1/2 tick of bias. When we compute + * the retransmit timer, we want 1/2 tick of rounding and + * 1 extra tick because of +-1/2 tick uncertainty in the + * firing of the timer. The bias will give us exactly the + * 1.5 tick we need. But, because the bias is + * statistical, we have to test that we don't drop below + * the minimum feasible timer (which is 2 ticks). + * This macro assumes that the value of TCP_RTTVAR_SCALE + * is the same as the multiplier for rttvar. + */ +#define TCP_REXMTVAL(tp) \ + (((tp)->t_srtt >> TCP_RTT_SHIFT) + (tp)->t_rttvar) + +/* XXX + * We want to avoid doing m_pullup on incoming packets but that + * means avoiding dtom on the tcp reassembly code. That in turn means + * keeping an mbuf pointer in the reassembly queue (since we might + * have a cluster). As a quick hack, the source & destination + * port numbers (which are no longer needed once we've located the + * tcpcb) are overlayed with an mbuf pointer. + */ +#define REASS_MBUF(ti) (*(struct mbuf **)&((ti)->ti_t)) + +/* + * TCP statistics. + * Many of these should be kept per connection, + * but that's inconvenient at the moment. + */ +struct tcpstat { + u_long tcps_connattempt; /* connections initiated */ + u_long tcps_accepts; /* connections accepted */ + u_long tcps_connects; /* connections established */ + u_long tcps_drops; /* connections dropped */ + u_long tcps_conndrops; /* embryonic connections dropped */ + u_long tcps_closed; /* conn. closed (includes drops) */ + u_long tcps_segstimed; /* segs where we tried to get rtt */ + u_long tcps_rttupdated; /* times we succeeded */ + u_long tcps_delack; /* delayed acks sent */ + u_long tcps_timeoutdrop; /* conn. dropped in rxmt timeout */ + u_long tcps_rexmttimeo; /* retransmit timeouts */ + u_long tcps_persisttimeo; /* persist timeouts */ + u_long tcps_keeptimeo; /* keepalive timeouts */ + u_long tcps_keepprobe; /* keepalive probes sent */ + u_long tcps_keepdrops; /* connections dropped in keepalive */ + + u_long tcps_sndtotal; /* total packets sent */ + u_long tcps_sndpack; /* data packets sent */ + u_long tcps_sndbyte; /* data bytes sent */ + u_long tcps_sndrexmitpack; /* data packets retransmitted */ + u_long tcps_sndrexmitbyte; /* data bytes retransmitted */ + u_long tcps_sndacks; /* ack-only packets sent */ + u_long tcps_sndprobe; /* window probes sent */ + u_long tcps_sndurg; /* packets sent with URG only */ + u_long tcps_sndwinup; /* window update-only packets sent */ + u_long tcps_sndctrl; /* control (SYN|FIN|RST) packets sent */ + + u_long tcps_rcvtotal; /* total packets received */ + u_long tcps_rcvpack; /* packets received in sequence */ + u_long tcps_rcvbyte; /* bytes received in sequence */ + u_long tcps_rcvbadsum; /* packets received with ccksum errs */ + u_long tcps_rcvbadoff; /* packets received with bad offset */ + u_long tcps_rcvshort; /* packets received too short */ + u_long tcps_rcvduppack; /* duplicate-only packets received */ + u_long tcps_rcvdupbyte; /* duplicate-only bytes received */ + u_long tcps_rcvpartduppack; /* packets with some duplicate data */ + u_long tcps_rcvpartdupbyte; /* dup. bytes in part-dup. packets */ + u_long tcps_rcvoopack; /* out-of-order packets received */ + u_long tcps_rcvoobyte; /* out-of-order bytes received */ + u_long tcps_rcvpackafterwin; /* packets with data after window */ + u_long tcps_rcvbyteafterwin; /* bytes rcvd after window */ + u_long tcps_rcvafterclose; /* packets rcvd after "close" */ + u_long tcps_rcvwinprobe; /* rcvd window probe packets */ + u_long tcps_rcvdupack; /* rcvd duplicate acks */ + u_long tcps_rcvacktoomuch; /* rcvd acks for unsent data */ + u_long tcps_rcvackpack; /* rcvd ack packets */ + u_long tcps_rcvackbyte; /* bytes acked by rcvd acks */ + u_long tcps_rcvwinupd; /* rcvd window update packets */ + u_long tcps_pawsdrop; /* segments dropped due to PAWS */ + u_long tcps_predack; /* times hdr predict ok for acks */ + u_long tcps_preddat; /* times hdr predict ok for data pkts */ + u_long tcps_pcbcachemiss; + u_long tcps_cachedrtt; /* times cached RTT in route updated */ + u_long tcps_cachedrttvar; /* times cached rttvar updated */ + u_long tcps_cachedssthresh; /* times cached ssthresh updated */ + u_long tcps_usedrtt; /* times RTT initialized from route */ + u_long tcps_usedrttvar; /* times RTTVAR initialized from rt */ + u_long tcps_usedssthresh; /* times ssthresh initialized from rt*/ + u_long tcps_persistdrop; /* timeout in persist state */ + u_long tcps_badsyn; /* bogus SYN, e.g. premature ACK */ + u_long tcps_mturesent; /* resends due to MTU discovery */ + u_long tcps_listendrop; /* listen queue overflows */ +}; + +/* + * Names for TCP sysctl objects + */ +#define TCPCTL_DO_RFC1323 1 /* use RFC-1323 extensions */ +#define TCPCTL_DO_RFC1644 2 /* use RFC-1644 extensions */ +#define TCPCTL_MSSDFLT 3 /* MSS default */ +#define TCPCTL_STATS 4 /* statistics (read-only) */ +#define TCPCTL_RTTDFLT 5 /* default RTT estimate */ +#define TCPCTL_KEEPIDLE 6 /* keepalive idle timer */ +#define TCPCTL_KEEPINTVL 7 /* interval to send keepalives */ +#define TCPCTL_SENDSPACE 8 /* send buffer space */ +#define TCPCTL_RECVSPACE 9 /* receive buffer space */ +#define TCPCTL_KEEPINIT 10 /* interval to wait for established */ +#define TCPCTL_MAXID 11 + +#define TCPCTL_NAMES { \ + { 0, 0 }, \ + { "rfc1323", CTLTYPE_INT }, \ + { "rfc1644", CTLTYPE_INT }, \ + { "mssdflt", CTLTYPE_INT }, \ + { "stats", CTLTYPE_STRUCT }, \ + { "rttdflt", CTLTYPE_INT }, \ + { "keepidle", CTLTYPE_INT }, \ + { "keepintvl", CTLTYPE_INT }, \ + { "sendspace", CTLTYPE_INT }, \ + { "recvspace", CTLTYPE_INT }, \ + { "keepinit", CTLTYPE_INT }, \ +} + +#ifdef KERNEL +extern struct inpcbhead tcb; /* head of queue of active tcpcb's */ +extern struct inpcbinfo tcbinfo; +extern struct tcpstat tcpstat; /* tcp statistics */ +extern int tcp_do_rfc1323; /* XXX */ +extern int tcp_do_rfc1644; /* XXX */ +extern int tcp_mssdflt; /* XXX */ +extern u_long tcp_now; /* for RFC 1323 timestamps */ +extern int tcp_rttdflt; /* XXX */ +extern u_short tcp_lastport; /* last assigned port */ + +int tcp_attach __P((struct socket *)); +void tcp_canceltimers __P((struct tcpcb *)); +struct tcpcb * + tcp_close __P((struct tcpcb *)); +int tcp_connect __P((struct tcpcb *, struct mbuf *)); +void tcp_ctlinput __P((int, struct sockaddr *, struct ip *)); +int tcp_ctloutput __P((int, struct socket *, int, int, struct mbuf **)); +struct tcpcb * + tcp_disconnect __P((struct tcpcb *)); +struct tcpcb * + tcp_drop __P((struct tcpcb *, int)); +void tcp_dooptions __P((struct tcpcb *, + u_char *, int, struct tcpiphdr *, struct tcpopt *)); +void tcp_drain __P((void)); +void tcp_fasttimo __P((void)); +struct rmxp_tao * + tcp_gettaocache __P((struct inpcb *)); +void tcp_init __P((void)); +void tcp_input __P((struct mbuf *, int)); +void tcp_mss __P((struct tcpcb *, int)); +int tcp_mssopt __P((struct tcpcb *)); +void tcp_mtudisc __P((struct inpcb *, int)); +struct tcpcb * + tcp_newtcpcb __P((struct inpcb *)); +void tcp_notify __P((struct inpcb *, int)); +int tcp_output __P((struct tcpcb *)); +void tcp_pulloutofband __P((struct socket *, + struct tcpiphdr *, struct mbuf *)); +void tcp_quench __P((struct inpcb *, int)); +int tcp_reass __P((struct tcpcb *, struct tcpiphdr *, struct mbuf *)); +void tcp_respond __P((struct tcpcb *, + struct tcpiphdr *, struct mbuf *, u_long, u_long, int)); +struct rtentry * + tcp_rtlookup __P((struct inpcb *)); +void tcp_setpersist __P((struct tcpcb *)); +void tcp_slowtimo __P((void)); +int tcp_sysctl __P((int *, u_int, void *, size_t *, void *, size_t)); +struct tcpiphdr * + tcp_template __P((struct tcpcb *)); +struct tcpcb * + tcp_timers __P((struct tcpcb *, int)); +void tcp_trace __P((int, int, struct tcpcb *, struct tcpiphdr *, int)); +struct tcpcb * + tcp_usrclosed __P((struct tcpcb *)); +int tcp_usrreq __P((struct socket *, + int, struct mbuf *, struct mbuf *, struct mbuf *)); +void tcp_xmit_timer __P((struct tcpcb *, int)); + +extern u_long tcp_sendspace; +extern u_long tcp_recvspace; + +#endif /* KERNEL */ + +#endif /* _NETINET_TCP_VAR_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcpip.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcpip.h new file mode 100644 index 00000000000..45c115cf708 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/tcpip.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcpip.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_TCPIP_H_ +#define _NETINET_TCPIP_H_ + +/* + * Tcp+ip header, after ip options removed. + */ +struct tcpiphdr { + struct ipovly ti_i; /* overlaid ip structure */ + struct tcphdr ti_t; /* tcp header */ +}; +#ifdef notyet +/* + * Tcp+ip header, after ip options removed but including TCP options. + */ +struct full_tcpiphdr { + struct ipovly ti_i; /* overlaid ip structure */ + struct tcphdr ti_t; /* tcp header */ + char ti_o[TCP_MAXOLEN]; /* space for tcp options */ +}; +#endif /* notyet */ +#define ti_next ti_i.ih_next +#define ti_prev ti_i.ih_prev +#define ti_x1 ti_i.ih_x1 +#define ti_pr ti_i.ih_pr +#define ti_len ti_i.ih_len +#define ti_src ti_i.ih_src +#define ti_dst ti_i.ih_dst +#define ti_sport ti_t.th_sport +#define ti_dport ti_t.th_dport +#define ti_seq ti_t.th_seq +#define ti_ack ti_t.th_ack +#define ti_x2 ti_t.th_x2 +#define ti_off ti_t.th_off +#define ti_flags ti_t.th_flags +#define ti_win ti_t.th_win +#define ti_sum ti_t.th_sum +#define ti_urp ti_t.th_urp + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/udp.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/udp.h new file mode 100644 index 00000000000..b05e19b401d --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/udp.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)udp.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_UDP_H_ +#define _NETINET_UDP_H_ + +/* + * Udp protocol header. + * Per RFC 768, September, 1981. + */ +struct udphdr { + u_short uh_sport; /* source port */ + u_short uh_dport; /* destination port */ + short uh_ulen; /* udp length */ + u_short uh_sum; /* udp checksum */ +}; + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/udp_var.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/udp_var.h new file mode 100644 index 00000000000..fc808e51047 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/udp_var.h @@ -0,0 +1,105 @@ +/* + * Copyright (c) 1982, 1986, 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)udp_var.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _NETINET_UDP_VAR_H_ +#define _NETINET_UDP_VAR_H_ + +/* + * UDP kernel structures and variables. + */ +struct udpiphdr { + struct ipovly ui_i; /* overlaid ip structure */ + struct udphdr ui_u; /* udp header */ +}; +#define ui_next ui_i.ih_next +#define ui_prev ui_i.ih_prev +#define ui_x1 ui_i.ih_x1 +#define ui_pr ui_i.ih_pr +#define ui_len ui_i.ih_len +#define ui_src ui_i.ih_src +#define ui_dst ui_i.ih_dst +#define ui_sport ui_u.uh_sport +#define ui_dport ui_u.uh_dport +#define ui_ulen ui_u.uh_ulen +#define ui_sum ui_u.uh_sum + +struct udpstat { + /* input statistics: */ + u_long udps_ipackets; /* total input packets */ + u_long udps_hdrops; /* packet shorter than header */ + u_long udps_badsum; /* checksum error */ + u_long udps_badlen; /* data length larger than packet */ + u_long udps_noport; /* no socket on port */ + u_long udps_noportbcast; /* of above, arrived as broadcast */ + u_long udps_fullsock; /* not delivered, input socket full */ + u_long udpps_pcbcachemiss; /* input packets missing pcb cache */ + u_long udpps_pcbhashmiss; /* input packets not for hashed pcb */ + /* output statistics: */ + u_long udps_opackets; /* total output packets */ +}; + +/* + * Names for UDP sysctl objects + */ +#define UDPCTL_CHECKSUM 1 /* checksum UDP packets */ +#define UDPCTL_STATS 2 /* statistics (read-only) */ +#define UDPCTL_MAXDGRAM 3 /* max datagram size */ +#define UDPCTL_RECVSPACE 4 /* default receive buffer space */ +#define UDPCTL_MAXID 5 + +#define UDPCTL_NAMES { \ + { 0, 0 }, \ + { "checksum", CTLTYPE_INT }, \ + { "stats", CTLTYPE_STRUCT }, \ + { "maxdgram", CTLTYPE_INT }, \ + { "recvspace", CTLTYPE_INT }, \ +} + +#ifdef KERNEL +extern struct inpcbhead udb; +extern struct inpcbinfo udbinfo; +extern struct udpstat udpstat; + +void udp_ctlinput __P((int, struct sockaddr *, struct ip *)); +void udp_init __P((void)); +void udp_input __P((struct mbuf *, int)); +int udp_output __P((struct inpcb *, + struct mbuf *, struct mbuf *, struct mbuf *)); +int udp_sysctl __P((int *, u_int, void *, size_t *, void *, size_t)); +int udp_usrreq __P((struct socket *, + int, struct mbuf *, struct mbuf *, struct mbuf *)); +#endif + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/buf.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/buf.h new file mode 100644 index 00000000000..3523331430d --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/buf.h @@ -0,0 +1,254 @@ +/* + * Copyright (c) 1982, 1986, 1989, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)buf.h 8.7 (Berkeley) 1/21/94 + */ + +#ifndef _SYS_BUF_H_ +#define _SYS_BUF_H_ +#include <sys/queue.h> + +#define NOLIST ((struct buf *)0x87654321) + +struct buf; + +struct iodone_chain { + long ic_prev_flags; + void (*ic_prev_iodone) __P((struct buf *)); + void *ic_prev_iodone_chain; + struct { + long ia_long; + void *ia_ptr; + } ic_args[5]; +}; + +/* + * The buffer header describes an I/O operation in the kernel. + */ +struct buf { + LIST_ENTRY(buf) b_hash; /* Hash chain. */ + LIST_ENTRY(buf) b_vnbufs; /* Buffer's associated vnode. */ + TAILQ_ENTRY(buf) b_freelist; /* Free list position if not active. */ + struct buf *b_actf, **b_actb; /* Device driver queue when active. */ + struct proc *b_proc; /* Associated proc; NULL if kernel. */ + volatile long b_flags; /* B_* flags. */ + int b_qindex; /* buffer queue index */ + int b_error; /* Errno value. */ + long b_bufsize; /* Allocated buffer size. */ + long b_bcount; /* Valid bytes in buffer. */ + long b_resid; /* Remaining I/O. */ + dev_t b_dev; /* Device associated with buffer. */ + struct { + caddr_t b_addr; /* Memory, superblocks, indirect etc. */ + } b_un; + void *b_saveaddr; /* Original b_addr for physio. */ + daddr_t b_lblkno; /* Logical block number. */ + daddr_t b_blkno; /* Underlying physical block number. */ + /* Function to call upon completion. */ + void (*b_iodone) __P((struct buf *)); + /* For nested b_iodone's. */ + struct iodone_chain *b_iodone_chain; + struct vnode *b_vp; /* Device vnode. */ + int b_pfcent; /* Center page when swapping cluster. */ + int b_dirtyoff; /* Offset in buffer of dirty region. */ + int b_dirtyend; /* Offset of end of dirty region. */ + struct ucred *b_rcred; /* Read credentials reference. */ + struct ucred *b_wcred; /* Write credentials reference. */ + int b_validoff; /* Offset in buffer of valid region. */ + int b_validend; /* Offset of end of valid region. */ + daddr_t b_pblkno; /* physical block number */ + caddr_t b_savekva; /* saved kva for transfer while bouncing */ + void *b_driver1; /* for private use by the driver */ + void *b_driver2; /* for private use by the driver */ + void *b_spc; + struct vm_page *b_pages[(MAXPHYS + PAGE_SIZE - 1)/PAGE_SIZE]; + int b_npages; +}; + +/* Device driver compatibility definitions. */ +#define b_active b_bcount /* Driver queue head: drive active. */ +#define b_data b_un.b_addr /* b_un.b_addr is not changeable. */ +#define b_errcnt b_resid /* Retry count while I/O in progress. */ +#define iodone biodone /* Old name for biodone. */ +#define iowait biowait /* Old name for biowait. */ + +/* + * These flags are kept in b_flags. + */ +#define B_AGE 0x00000001 /* Move to age queue when I/O done. */ +#define B_APPENDWRITE 0x00000002 /* Append-write in progress. */ +#define B_ASYNC 0x00000004 /* Start I/O, do not wait. */ +#define B_BAD 0x00000008 /* Bad block revectoring in progress. */ +#define B_BUSY 0x00000010 /* I/O in progress. */ +#define B_CACHE 0x00000020 /* Bread found us in the cache. */ +#define B_CALL 0x00000040 /* Call b_iodone from biodone. */ +#define B_DELWRI 0x00000080 /* Delay I/O until buffer reused. */ +#define B_DIRTY 0x00000100 /* Dirty page to be pushed out async. */ +#define B_DONE 0x00000200 /* I/O completed. */ +#define B_EINTR 0x00000400 /* I/O was interrupted */ +#define B_ERROR 0x00000800 /* I/O error occurred. */ +#define B_GATHERED 0x00001000 /* LFS: already in a segment. */ +#define B_INVAL 0x00002000 /* Does not contain valid info. */ +#define B_LOCKED 0x00004000 /* Locked in core (not reusable). */ +#define B_NOCACHE 0x00008000 /* Do not cache block after use. */ +#define B_MALLOC 0x00010000 /* malloced b_data */ +#define B_CLUSTEROK 0x00020000 /* Pagein op, so swap() can count it. */ +#define B_PHYS 0x00040000 /* I/O to user memory. */ +#define B_RAW 0x00080000 /* Set by physio for raw transfers. */ +#define B_READ 0x00100000 /* Read buffer. */ +#define B_TAPE 0x00200000 /* Magnetic tape I/O. */ +#define B_RELBUF 0x00400000 /* Release VMIO buffer. */ +#define B_WANTED 0x00800000 /* Process wants this buffer. */ +#define B_WRITE 0x00000000 /* Write buffer (pseudo flag). */ +#define B_WRITEINPROG 0x01000000 /* Write in progress. */ +#define B_XXX 0x02000000 /* Debugging flag. */ +#define B_PAGING 0x04000000 /* volatile paging I/O -- bypass VMIO */ +#define B_VMIO 0x20000000 /* VMIO flag */ +#define B_CLUSTER 0x40000000 /* pagein op, so swap() can count it */ +#define B_BOUNCE 0x80000000 /* bounce buffer flag */ + +/* + * This structure describes a clustered I/O. It is stored in the b_saveaddr + * field of the buffer on which I/O is done. At I/O completion, cluster + * callback uses the structure to parcel I/O's to individual buffers, and + * then free's this structure. + */ +struct cluster_save { + long bs_bcount; /* Saved b_bcount. */ + long bs_bufsize; /* Saved b_bufsize. */ + void *bs_saveaddr; /* Saved b_addr. */ + int bs_nchildren; /* Number of associated buffers. */ + struct buf **bs_children; /* List of associated buffers. */ +}; + +/* + * number of buffer hash entries + */ +#define BUFHSZ 512 + +/* + * buffer hash table calculation, originally by David Greenman + */ +#define BUFHASH(vnp, bn) \ + (&bufhashtbl[(((unsigned long)(vnp) >> 7)+(int)(bn)) % BUFHSZ]) + +/* + * Definitions for the buffer free lists. + */ +#define BUFFER_QUEUES 6 /* number of free buffer queues */ + +LIST_HEAD(bufhashhdr, buf) bufhashtbl[BUFHSZ], invalhash; +TAILQ_HEAD(bqueues, buf) bufqueues[BUFFER_QUEUES]; + +#define QUEUE_NONE 0 /* on no queue */ +#define QUEUE_LOCKED 1 /* locked buffers */ +#define QUEUE_LRU 2 /* useful buffers */ +#define QUEUE_VMIO 3 /* VMIO buffers */ +#define QUEUE_AGE 4 /* not-useful buffers */ +#define QUEUE_EMPTY 5 /* empty buffer headers*/ + +/* + * Zero out the buffer's data area. + */ +#define clrbuf(bp) { \ + blkclr((bp)->b_data, (u_int)(bp)->b_bcount); \ + (bp)->b_resid = 0; \ +} + +/* Flags to low-level allocation routines. */ +#define B_CLRBUF 0x01 /* Request allocated buffer be cleared. */ +#define B_SYNC 0x02 /* Do all allocations synchronously. */ + +#ifdef KERNEL +extern int nbuf; /* The number of buffer headers */ +extern struct buf *buf; /* The buffer headers. */ +extern char *buffers; /* The buffer contents. */ +extern int bufpages; /* Number of memory pages in the buffer pool. */ +extern struct buf *swbuf; /* Swap I/O buffer headers. */ +extern int nswbuf; /* Number of swap I/O buffer headers. */ +extern TAILQ_HEAD(swqueue, buf) bswlist; + +__BEGIN_DECLS +void bufinit __P((void)); +void bremfree __P((struct buf *)); +int bread __P((struct vnode *, daddr_t, int, + struct ucred *, struct buf **)); +int breadn __P((struct vnode *, daddr_t, int, daddr_t *, int *, int, + struct ucred *, struct buf **)); +int bwrite __P((struct buf *)); +void bdwrite __P((struct buf *)); +void bawrite __P((struct buf *)); +void brelse __P((struct buf *)); +void vfs_bio_awrite __P((struct buf *)); +struct buf * getpbuf __P((void)); +struct buf *incore __P((struct vnode *, daddr_t)); +int inmem __P((struct vnode *, daddr_t)); +struct buf *getblk __P((struct vnode *, daddr_t, int, int, int)); +struct buf *geteblk __P((int)); +int allocbuf __P((struct buf *, int)); +int biowait __P((struct buf *)); +void biodone __P((struct buf *)); + +void cluster_callback __P((struct buf *)); +int cluster_read __P((struct vnode *, u_quad_t, daddr_t, long, + struct ucred *, struct buf **)); +void cluster_wbuild __P((struct vnode *, struct buf *, long, daddr_t, int, + daddr_t)); +void cluster_write __P((struct buf *, u_quad_t)); +int physio __P((void (*)(), struct buf *, dev_t, int, u_int (*)(), + struct uio *)); +u_int minphys __P((struct buf *)); +void vfs_bio_clrbuf __P((struct buf *)); +void vfs_busy_pages __P((struct buf *, int clear_modify)); +void vfs_unbusy_pages(struct buf *); +void vwakeup __P((struct buf *)); +void vmapbuf __P((struct buf *)); +void vunmapbuf __P((struct buf *)); +void relpbuf __P((struct buf *)); +void brelvp __P((struct buf *)); +void bgetvp __P((struct vnode *, struct buf *)); +void pbgetvp __P((struct vnode *, struct buf *)); +void pbrelvp __P((struct buf *)); +void reassignbuf __P((struct buf *, struct vnode *)); +struct buf *trypbuf __P((void)); +void vm_bounce_alloc __P((struct buf *)); +void vm_bounce_free __P((struct buf *)); +vm_offset_t vm_bounce_kva_alloc __P((int)); +void vm_bounce_kva_alloc_free __P((vm_offset_t, int)); +__END_DECLS +#endif +#endif /* !_SYS_BUF_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/callout.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/callout.h new file mode 100644 index 00000000000..76d7519b5fa --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/callout.h @@ -0,0 +1,56 @@ +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)callout.h 8.2 (Berkeley) 1/21/94 + */ + +#ifndef _SYS_CALLOUT_H_ +#define _SYS_CALLOUT_H_ + +struct callout { + struct callout *c_next; /* next callout in queue */ + void *c_arg; /* function argument */ + void (*c_func) __P((void *)); /* function to call */ + int c_time; /* ticks to the event */ +}; + +#ifdef KERNEL +extern struct callout *callfree, *callout, calltodo; +extern int ncallout; +#endif + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/cdefs.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/cdefs.h new file mode 100644 index 00000000000..99d44c71415 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/cdefs.h @@ -0,0 +1,147 @@ +/* + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Berkeley Software Design, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)cdefs.h 8.7 (Berkeley) 1/21/94 + */ + +#ifndef _SYS_CDEFS_H_ +#define _SYS_CDEFS_H_ + +#if defined(__cplusplus) +#define __BEGIN_DECLS extern "C" { +#define __END_DECLS }; +#else +#define __BEGIN_DECLS +#define __END_DECLS +#endif + +/* + * The __CONCAT macro is used to concatenate parts of symbol names, e.g. + * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo. + * The __CONCAT macro is a bit tricky -- make sure you don't put spaces + * in between its arguments. __CONCAT can also concatenate double-quoted + * strings produced by the __STRING macro, but this only works with ANSI C. + */ +#if defined(__STDC__) || defined(__cplusplus) +#define __P(protos) protos /* full-blown ANSI C */ +#define __CONCAT1(x,y) x ## y +#define __CONCAT(x,y) __CONCAT1(x,y) +#define __STRING(x) #x + +#define __const const /* define reserved names to standard */ +#define __signed signed +#define __volatile volatile +#if defined(__cplusplus) +#define __inline inline /* convert to C++ keyword */ +#else +#ifndef __GNUC__ +#define __inline /* delete GCC keyword */ +#endif /* !__GNUC__ */ +#endif /* !__cplusplus */ + +#else /* !(__STDC__ || __cplusplus) */ +#define __P(protos) () /* traditional C preprocessor */ +#define __CONCAT(x,y) x/**/y +#define __STRING(x) "x" + +#ifndef __GNUC__ +#define __const /* delete pseudo-ANSI C keywords */ +#define __inline +#define __signed +#define __volatile +/* + * In non-ANSI C environments, new programs will want ANSI-only C keywords + * deleted from the program and old programs will want them left alone. + * When using a compiler other than gcc, programs using the ANSI C keywords + * const, inline etc. as normal identifiers should define -DNO_ANSI_KEYWORDS. + * When using "gcc -traditional", we assume that this is the intent; if + * __GNUC__ is defined but __STDC__ is not, we leave the new keywords alone. + */ +#ifndef NO_ANSI_KEYWORDS +#define const /* delete ANSI C keywords */ +#define inline +#define signed +#define volatile +#endif +#endif /* !NO_ANSI_KEYWORDS */ +#endif /* !(__STDC__ || __cplusplus) */ + +/* + * GCC1 and some versions of GCC2 declare dead (non-returning) and + * pure (no side effects) functions using "volatile" and "const"; + * unfortunately, these then cause warnings under "-ansi -pedantic". + * GCC2.5 uses a new, peculiar __attribute__((attrs)) style. All of + * these work for GNU C++ (modulo a slight glitch in the C++ grammar + * in the distribution version of 2.5.5). + */ +#if __GNUC__ < 2 +#define __dead +#define __dead2 +#define __pure +#define __pure2 +#define __attribute__(x) +#endif +#if __GNUC__ == 2 && __GNUC_MINOR__ < 5 +#define __dead __volatile +#define __dead2 +#define __pure __const +#define __pure2 +#endif +#if __GNUC__ == 2 && __GNUC_MINOR__ > 5 || __GNUC__ >= 3 +#define __dead +#define __dead2 __attribute__((noreturn)) +#define __pure +#define __pure2 __attribute__((const)) +#endif + +#ifdef __GNUC__ +#ifdef __STDC__ +#define __weak_reference(sym,alias) \ + __asm__(".stabs \"_" #alias "\",11,0,0,0"); \ + __asm__(".stabs \"_" #sym "\",1,0,0,0") +#define __warn_references(sym,msg) \ + __asm__(".stabs \"" msg "\",30,0,0,0"); \ + __asm__(".stabs \"_" #sym "\",1,0,0,0") +#else +#define __weak_reference(sym,alias) \ + __asm__(".stabs \"_/**/alias\",11,0,0,0"); \ + __asm__(".stabs \"_/**/sym\",1,0,0,0") +#define __warn_references(sym,msg) \ + __asm__(".stabs msg,30,0,0,0"); \ + __asm__(".stabs \"_/**/sym\",1,0,0,0") +#endif +#endif + +#endif /* !_SYS_CDEFS_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/domain.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/domain.h new file mode 100644 index 00000000000..5c8e4418ce1 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/domain.h @@ -0,0 +1,73 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)domain.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _SYS_DOMAIN_H_ +#define _SYS_DOMAIN_H_ + +/* + * Structure per communications domain. + */ + +/* + * Forward structure declarations for function prototypes [sic]. + */ +struct mbuf; + +struct domain { + int dom_family; /* AF_xxx */ + char *dom_name; + void (*dom_init) /* initialize domain data structures */ + __P((void)); + int (*dom_externalize) /* externalize access rights */ + __P((struct mbuf *)); + int (*dom_dispose) /* dispose of internalized rights */ + __P((struct mbuf *)); + struct protosw *dom_protosw, *dom_protoswNPROTOSW; + struct domain *dom_next; + int (*dom_rtattach) /* initialize routing table */ + __P((void **, int)); + int dom_rtoffset; /* an arg to rtattach, in bits */ + int dom_maxrtkey; /* for routing layer */ +}; + +#ifdef KERNEL +extern struct domain *domains; + +#define DOMAIN_SET(name) \ + DATA_SET(domain_set, name ## domain); + +#endif + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/errno.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/errno.h new file mode 100644 index 00000000000..0fd2fd754eb --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/errno.h @@ -0,0 +1,168 @@ +/* + * Copyright (c) 1982, 1986, 1989, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)errno.h 8.5 (Berkeley) 1/21/94 + */ + +#ifndef _SYS_ERRNO_H_ +#define _SYS_ERRNO_H_ + +#ifndef KERNEL +extern int errno; /* global error number */ +#endif + +#define EPERM 1 /* Operation not permitted */ +#define ENOENT 2 /* No such file or directory */ +#define ESRCH 3 /* No such process */ +#define EINTR 4 /* Interrupted system call */ +#define EIO 5 /* Input/output error */ +#define ENXIO 6 /* Device not configured */ +#define E2BIG 7 /* Argument list too long */ +#define ENOEXEC 8 /* Exec format error */ +#define EBADF 9 /* Bad file descriptor */ +#define ECHILD 10 /* No child processes */ +#define EDEADLK 11 /* Resource deadlock avoided */ + /* 11 was EAGAIN */ +#define ENOMEM 12 /* Cannot allocate memory */ +#define EACCES 13 /* Permission denied */ +#define EFAULT 14 /* Bad address */ +#ifndef _POSIX_SOURCE +#define ENOTBLK 15 /* Block device required */ +#endif +#define EBUSY 16 /* Device busy */ +#define EEXIST 17 /* File exists */ +#define EXDEV 18 /* Cross-device link */ +#define ENODEV 19 /* Operation not supported by device */ +#define ENOTDIR 20 /* Not a directory */ +#define EISDIR 21 /* Is a directory */ +#define EINVAL 22 /* Invalid argument */ +#define ENFILE 23 /* Too many open files in system */ +#define EMFILE 24 /* Too many open files */ +#define ENOTTY 25 /* Inappropriate ioctl for device */ +#ifndef _POSIX_SOURCE +#define ETXTBSY 26 /* Text file busy */ +#endif +#define EFBIG 27 /* File too large */ +#define ENOSPC 28 /* No space left on device */ +#define ESPIPE 29 /* Illegal seek */ +#define EROFS 30 /* Read-only file system */ +#define EMLINK 31 /* Too many links */ +#define EPIPE 32 /* Broken pipe */ + +/* math software */ +#define EDOM 33 /* Numerical argument out of domain */ +#define ERANGE 34 /* Result too large */ + +/* non-blocking and interrupt i/o */ +#define EAGAIN 35 /* Resource temporarily unavailable */ +#ifndef _POSIX_SOURCE +#define EWOULDBLOCK EAGAIN /* Operation would block */ +#define EINPROGRESS 36 /* Operation now in progress */ +#define EALREADY 37 /* Operation already in progress */ + +/* ipc/network software -- argument errors */ +#define ENOTSOCK 38 /* Socket operation on non-socket */ +#define EDESTADDRREQ 39 /* Destination address required */ +#define EMSGSIZE 40 /* Message too long */ +#define EPROTOTYPE 41 /* Protocol wrong type for socket */ +#define ENOPROTOOPT 42 /* Protocol not available */ +#define EPROTONOSUPPORT 43 /* Protocol not supported */ +#define ESOCKTNOSUPPORT 44 /* Socket type not supported */ +#define EOPNOTSUPP 45 /* Operation not supported */ +#define EPFNOSUPPORT 46 /* Protocol family not supported */ +#define EAFNOSUPPORT 47 /* Address family not supported by protocol family */ +#define EADDRINUSE 48 /* Address already in use */ +#define EADDRNOTAVAIL 49 /* Can't assign requested address */ + +/* ipc/network software -- operational errors */ +#define ENETDOWN 50 /* Network is down */ +#define ENETUNREACH 51 /* Network is unreachable */ +#define ENETRESET 52 /* Network dropped connection on reset */ +#define ECONNABORTED 53 /* Software caused connection abort */ +#define ECONNRESET 54 /* Connection reset by peer */ +#define ENOBUFS 55 /* No buffer space available */ +#define EISCONN 56 /* Socket is already connected */ +#define ENOTCONN 57 /* Socket is not connected */ +#define ESHUTDOWN 58 /* Can't send after socket shutdown */ +#define ETOOMANYREFS 59 /* Too many references: can't splice */ +#define ETIMEDOUT 60 /* Operation timed out */ +#define ECONNREFUSED 61 /* Connection refused */ + +#define ELOOP 62 /* Too many levels of symbolic links */ +#endif /* _POSIX_SOURCE */ +#define ENAMETOOLONG 63 /* File name too long */ + +/* should be rearranged */ +#ifndef _POSIX_SOURCE +#define EHOSTDOWN 64 /* Host is down */ +#define EHOSTUNREACH 65 /* No route to host */ +#endif /* _POSIX_SOURCE */ +#define ENOTEMPTY 66 /* Directory not empty */ + +/* quotas & mush */ +#ifndef _POSIX_SOURCE +#define EPROCLIM 67 /* Too many processes */ +#define EUSERS 68 /* Too many users */ +#define EDQUOT 69 /* Disc quota exceeded */ + +/* Network File System */ +#define ESTALE 70 /* Stale NFS file handle */ +#define EREMOTE 71 /* Too many levels of remote in path */ +#define EBADRPC 72 /* RPC struct is bad */ +#define ERPCMISMATCH 73 /* RPC version wrong */ +#define EPROGUNAVAIL 74 /* RPC prog. not avail */ +#define EPROGMISMATCH 75 /* Program version wrong */ +#define EPROCUNAVAIL 76 /* Bad procedure for program */ +#endif /* _POSIX_SOURCE */ + +#define ENOLCK 77 /* No locks available */ +#define ENOSYS 78 /* Function not implemented */ + +#ifndef _POSIX_SOURCE +#define EFTYPE 79 /* Inappropriate file type or format */ +#define EAUTH 80 /* Authentication error */ +#define ENEEDAUTH 81 /* Need authenticator */ +#define ELAST 81 /* Must be equal largest errno */ +#endif /* _POSIX_SOURCE */ + +#ifdef KERNEL +/* pseudo-errors returned inside kernel to modify return to process */ +#define ERESTART -1 /* restart syscall */ +#define EJUSTRETURN -2 /* don't modify regs, just return */ +#endif + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/fcntl.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/fcntl.h new file mode 100644 index 00000000000..62762f3498a --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/fcntl.h @@ -0,0 +1,190 @@ +/*- + * Copyright (c) 1983, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)fcntl.h 8.3 (Berkeley) 1/21/94 + */ + +#ifndef _SYS_FCNTL_H_ +#define _SYS_FCNTL_H_ + +/* + * This file includes the definitions for open and fcntl + * described by POSIX for <fcntl.h>; it also includes + * related kernel definitions. + */ + +#ifndef KERNEL +#include <sys/types.h> +#endif + +/* + * File status flags: these are used by open(2), fcntl(2). + * They are also used (indirectly) in the kernel file structure f_flags, + * which is a superset of the open/fcntl flags. Open flags and f_flags + * are inter-convertible using OFLAGS(fflags) and FFLAGS(oflags). + * Open/fcntl flags begin with O_; kernel-internal flags begin with F. + */ +/* open-only flags */ +#define O_RDONLY 0x0000 /* open for reading only */ +#define O_WRONLY 0x0001 /* open for writing only */ +#define O_RDWR 0x0002 /* open for reading and writing */ +#define O_ACCMODE 0x0003 /* mask for above modes */ + +/* + * Kernel encoding of open mode; separate read and write bits that are + * independently testable: 1 greater than the above. + * + * XXX + * FREAD and FWRITE are excluded from the #ifdef KERNEL so that TIOCFLUSH, + * which was documented to use FREAD/FWRITE, continues to work. + */ +#ifndef _POSIX_SOURCE +#define FREAD 0x0001 +#define FWRITE 0x0002 +#endif +#define O_NONBLOCK 0x0004 /* no delay */ +#define O_APPEND 0x0008 /* set append mode */ +#ifndef _POSIX_SOURCE +#define O_SHLOCK 0x0010 /* open with shared file lock */ +#define O_EXLOCK 0x0020 /* open with exclusive file lock */ +#define O_ASYNC 0x0040 /* signal pgrp when data ready */ +#define O_FSYNC 0x0080 /* synchronous writes */ +#endif +#define O_CREAT 0x0200 /* create if nonexistant */ +#define O_TRUNC 0x0400 /* truncate to zero length */ +#define O_EXCL 0x0800 /* error if already exists */ +#ifdef KERNEL +#define FMARK 0x1000 /* mark during gc() */ +#define FDEFER 0x2000 /* defer for next gc pass */ +#define FHASLOCK 0x4000 /* descriptor holds advisory lock */ +#endif + +/* defined by POSIX 1003.1; BSD default, so no bit required */ +#define O_NOCTTY 0 /* don't assign controlling terminal */ + +#ifdef KERNEL +/* convert from open() flags to/from fflags; convert O_RD/WR to FREAD/FWRITE */ +#define FFLAGS(oflags) ((oflags) + 1) +#define OFLAGS(fflags) ((fflags) - 1) + +/* bits to save after open */ +#define FMASK (FREAD|FWRITE|FAPPEND|FASYNC|FFSYNC|FNONBLOCK) +/* bits settable by fcntl(F_SETFL, ...) */ +#define FCNTLFLAGS (FAPPEND|FASYNC|FFSYNC|FNONBLOCK) +#endif + +/* + * The O_* flags used to have only F* names, which were used in the kernel + * and by fcntl. We retain the F* names for the kernel f_flags field + * and for backward compatibility for fcntl. + */ +#ifndef _POSIX_SOURCE +#define FAPPEND O_APPEND /* kernel/compat */ +#define FASYNC O_ASYNC /* kernel/compat */ +#define FFSYNC O_FSYNC /* kernel */ +#define FNONBLOCK O_NONBLOCK /* kernel */ +#define FNDELAY O_NONBLOCK /* compat */ +#define O_NDELAY O_NONBLOCK /* compat */ +#endif + +/* + * Constants used for fcntl(2) + */ + +/* command values */ +#define F_DUPFD 0 /* duplicate file descriptor */ +#define F_GETFD 1 /* get file descriptor flags */ +#define F_SETFD 2 /* set file descriptor flags */ +#define F_GETFL 3 /* get file status flags */ +#define F_SETFL 4 /* set file status flags */ +#ifndef _POSIX_SOURCE +#define F_GETOWN 5 /* get SIGIO/SIGURG proc/pgrp */ +#define F_SETOWN 6 /* set SIGIO/SIGURG proc/pgrp */ +#endif +#define F_GETLK 7 /* get record locking information */ +#define F_SETLK 8 /* set record locking information */ +#define F_SETLKW 9 /* F_SETLK; wait if blocked */ + +/* file descriptor flags (F_GETFD, F_SETFD) */ +#define FD_CLOEXEC 1 /* close-on-exec flag */ + +/* record locking flags (F_GETLK, F_SETLK, F_SETLKW) */ +#define F_RDLCK 1 /* shared or read lock */ +#define F_UNLCK 2 /* unlock */ +#define F_WRLCK 3 /* exclusive or write lock */ +#ifdef KERNEL +#define F_WAIT 0x010 /* Wait until lock is granted */ +#define F_FLOCK 0x020 /* Use flock(2) semantics for lock */ +#define F_POSIX 0x040 /* Use POSIX semantics for lock */ +#endif + +/* + * Advisory file segment locking data type - + * information passed to system by user + */ +struct flock { + off_t l_start; /* starting offset */ + off_t l_len; /* len = 0 means until end of file */ + pid_t l_pid; /* lock owner */ + short l_type; /* lock type: read/write, etc. */ + short l_whence; /* type of l_start */ +}; + + +#ifndef _POSIX_SOURCE +/* lock operations for flock(2) */ +#define LOCK_SH 0x01 /* shared file lock */ +#define LOCK_EX 0x02 /* exclusive file lock */ +#define LOCK_NB 0x04 /* don't block when locking */ +#define LOCK_UN 0x08 /* unlock file */ +#endif + + +#ifndef KERNEL +#include <sys/cdefs.h> + +__BEGIN_DECLS +int open __P((const char *, int, ...)); +int creat __P((const char *, mode_t)); +int fcntl __P((int, int, ...)); +#ifndef _POSIX_SOURCE +int flock __P((int, int)); +#endif /* !_POSIX_SOURCE */ +__END_DECLS +#endif + +#endif /* !_SYS_FCNTL_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/file.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/file.h new file mode 100644 index 00000000000..6f122605b13 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/file.h @@ -0,0 +1,83 @@ +/* + * Copyright (c) 1982, 1986, 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)file.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _SYS_FILE_H_ +#define _SYS_FILE_H_ + +#include <sys/fcntl.h> +#include <sys/unistd.h> + +#ifdef KERNEL +struct proc; +struct uio; + +/* + * Kernel descriptor table. + * One entry for each open kernel vnode and socket. + */ +struct file { + struct file *f_filef; /* list of active files */ + struct file **f_fileb; /* list of active files */ + short f_flag; /* see fcntl.h */ +#define DTYPE_VNODE 1 /* file */ +#define DTYPE_SOCKET 2 /* communications endpoint */ + short f_type; /* descriptor type */ + short f_count; /* reference count */ + short f_msgcount; /* references from message queue */ + struct ucred *f_cred; /* credentials associated with descriptor */ + struct fileops { + int (*fo_read) __P((struct file *fp, struct uio *uio, + struct ucred *cred)); + int (*fo_write) __P((struct file *fp, struct uio *uio, + struct ucred *cred)); + int (*fo_ioctl) __P((struct file *fp, int com, + caddr_t data, struct proc *p)); + int (*fo_select) __P((struct file *fp, int which, + struct proc *p)); + int (*fo_close) __P((struct file *fp, struct proc *p)); + } *f_ops; + off_t f_offset; + caddr_t f_data; /* vnode or socket */ +}; + +extern struct file *filehead; /* head of list of open files */ +extern struct fileops vnops; +extern int maxfiles; /* kernel limit on number of open files */ +extern int maxfilesperproc; /* per process limit on number of open files */ +extern int nfiles; /* actual number of open files */ + +#endif /* KERNEL */ + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/filedesc.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/filedesc.h new file mode 100644 index 00000000000..4b0dec7cff7 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/filedesc.h @@ -0,0 +1,108 @@ +/* + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)filedesc.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _SYS_FILEDESC_H_ +#define _SYS_FILEDESC_H_ + +/* + * This structure is used for the management of descriptors. It may be + * shared by multiple processes. + * + * A process is initially started out with NDFILE descriptors stored within + * this structure, selected to be enough for typical applications based on + * the historical limit of 20 open files (and the usage of descriptors by + * shells). If these descriptors are exhausted, a larger descriptor table + * may be allocated, up to a process' resource limit; the internal arrays + * are then unused. The initial expansion is set to NDEXTENT; each time + * it runs out, it is doubled until the resource limit is reached. NDEXTENT + * should be selected to be the biggest multiple of OFILESIZE (see below) + * that will fit in a power-of-two sized piece of memory. + */ +#define NDFILE 20 +#define NDEXTENT 50 /* 250 bytes in 256-byte alloc. */ + +struct filedesc { + struct file **fd_ofiles; /* file structures for open files */ + char *fd_ofileflags; /* per-process open file flags */ + struct vnode *fd_cdir; /* current directory */ + struct vnode *fd_rdir; /* root directory */ + int fd_nfiles; /* number of open files allocated */ + u_short fd_lastfile; /* high-water mark of fd_ofiles */ + u_short fd_freefile; /* approx. next free file */ + u_short fd_cmask; /* mask for file creation */ + u_short fd_refcnt; /* reference count */ +}; + +/* + * Basic allocation of descriptors: + * one of the above, plus arrays for NDFILE descriptors. + */ +struct filedesc0 { + struct filedesc fd_fd; + /* + * These arrays are used when the number of open files is + * <= NDFILE, and are then pointed to by the pointers above. + */ + struct file *fd_dfiles[NDFILE]; + char fd_dfileflags[NDFILE]; +}; + +/* + * Per-process open flags. + */ +#define UF_EXCLOSE 0x01 /* auto-close on exec */ +#define UF_MAPPED 0x02 /* mapped from device */ + +/* + * Storage required per open file descriptor. + */ +#define OFILESIZE (sizeof(struct file *) + sizeof(char)) + +#ifdef KERNEL +/* + * Kernel global variables and routines. + */ +int dupfdopen __P((struct filedesc *, int, int, int, int)); +int fdalloc __P((struct proc *p, int want, int *result)); +int fdavail __P((struct proc *p, int n)); +int falloc __P((struct proc *p, struct file **resultfp, int *resultfd)); +void ffree __P((struct file *)); +struct filedesc *fdcopy __P((struct proc *p)); +void fdfree __P((struct proc *p)); +int closef __P((struct file *fp,struct proc *p)); +void fdcloseexec __P((struct proc *p)); +#endif + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/filio.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/filio.h new file mode 100644 index 00000000000..c1566c26495 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/filio.h @@ -0,0 +1,57 @@ +/*- + * Copyright (c) 1982, 1986, 1990, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)filio.h 8.1 (Berkeley) 3/28/94 + */ + +#ifndef _SYS_FILIO_H_ +#define _SYS_FILIO_H_ + +#ifndef __REACTOS__ +#include <sys/ioccom.h> + +/* Generic file-descriptor ioctl's. */ +#define FIOCLEX _IO('f', 1) /* set close on exec on fd */ +#define FIONCLEX _IO('f', 2) /* remove close on exec */ +#define FIONREAD _IOR('f', 127, int) /* get # bytes to read */ +#define FIONBIO _IOW('f', 126, int) /* set/clear non-blocking i/o */ +#define FIOASYNC _IOW('f', 125, int) /* set/clear async i/o */ +#define FIOSETOWN _IOW('f', 124, int) /* set owner */ +#define FIOGETOWN _IOR('f', 123, int) /* get owner */ +#endif + +#endif /* !_SYS_FILIO_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/ioccom.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/ioccom.h new file mode 100644 index 00000000000..355df44d6ee --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/ioccom.h @@ -0,0 +1,68 @@ +/*- + * Copyright (c) 1982, 1986, 1990, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ioccom.h 8.2 (Berkeley) 3/28/94 + */ + +#ifndef _SYS_IOCCOM_H_ +#define _SYS_IOCCOM_H_ + +/* + * Ioctl's have the command encoded in the lower word, and the size of + * any in or out parameters in the upper word. The high 3 bits of the + * upper word are used to encode the in/out status of the parameter. + */ +#ifndef __REACTOS__ +#define IOCPARM_MASK 0x1fff /* parameter length, at most 13 bits */ +#define IOCPARM_LEN(x) (((x) >> 16) & IOCPARM_MASK) +#define IOCBASECMD(x) ((x) & ~(IOCPARM_MASK << 16)) +#define IOCGROUP(x) (((x) >> 8) & 0xff) +#endif + +#define IOCPARM_MAX NBPG /* max size of ioctl, mult. of NBPG */ +#define IOC_VOID 0x20000000 /* no parameters */ +#define IOC_OUT 0x40000000 /* copy out parameters */ +#define IOC_IN 0x80000000 /* copy in parameters */ +#define IOC_INOUT (IOC_IN|IOC_OUT) +#define IOC_DIRMASK 0xe0000000 /* mask for IN/OUT/VOID */ + +#ifndef __REACTOS__ +#define _IOC(inout,group,num,len) \ + (inout | ((len & IOCPARM_MASK) << 16) | ((group) << 8) | (num)) +#define _IO(g,n) _IOC(IOC_VOID, (g), (n), 0) +#define _IOR(g,n,t) _IOC(IOC_OUT, (g), (n), sizeof(t)) +#define _IOW(g,n,t) _IOC(IOC_IN, (g), (n), sizeof(t)) +/* this should be _IORW, but stdio got there first */ +#define _IOWR(g,n,t) _IOC(IOC_INOUT, (g), (n), sizeof(t)) +#endif + +#endif /* !_SYS_IOCCOM_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/ioctl.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/ioctl.h new file mode 100644 index 00000000000..d04394fd181 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/ioctl.h @@ -0,0 +1,84 @@ +/*- + * Copyright (c) 1982, 1986, 1990, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ioctl.h 8.6 (Berkeley) 3/28/94 + */ + +#ifndef _SYS_IOCTL_H_ +#define _SYS_IOCTL_H_ + +#include <sys/ttycom.h> + +/* + * Pun for SunOS prior to 3.2. SunOS 3.2 and later support TIOCGWINSZ + * and TIOCSWINSZ (yes, even 3.2-3.5, the fact that it wasn't documented + * nonwithstanding). + */ +struct ttysize { + unsigned short ts_lines; + unsigned short ts_cols; + unsigned short ts_xxx; + unsigned short ts_yyy; +}; +#define TIOCGSIZE TIOCGWINSZ +#define TIOCSSIZE TIOCSWINSZ + +#include <sys/ioccom.h> + +#include <sys/filio.h> +#include <sys/sockio.h> + +#ifndef KERNEL + +#include <sys/cdefs.h> + +__BEGIN_DECLS +int ioctl __P((int, unsigned long, ...)); +__END_DECLS +#endif /* !KERNEL */ +#endif /* !_SYS_IOCTL_H_ */ + +/* + * Keep outside _SYS_IOCTL_H_ + * Compatability with old terminal driver + * + * Source level -> #define USE_OLD_TTY + * Kernel level -> options COMPAT_43 or COMPAT_SUNOS + */ +#if defined(USE_OLD_TTY) || defined(COMPAT_43) || defined(COMPAT_SUNOS) +#include <sys/ioctl_compat.h> +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/kernel.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/kernel.h new file mode 100644 index 00000000000..530fd7f5e12 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/kernel.h @@ -0,0 +1,116 @@ +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)kernel.h 8.3 (Berkeley) 1/21/94 + * $\Id: kernel.h,v 1.9 1995/03/20 19:20:26 wollman Exp $ + */ + +#ifndef _SYS_KERNEL_H_ +#define _SYS_KERNEL_H_ + +/* Global variables for the kernel. */ + +/* 1.1 */ +extern long hostid; +extern char hostname[MAXHOSTNAMELEN]; +extern int hostnamelen; +extern char domainname[MAXHOSTNAMELEN]; +extern int domainnamelen; +extern char kernelname[MAXPATHLEN]; + +/* 1.2 */ +extern volatile struct timeval mono_time; +extern struct timeval boottime; +extern struct timeval runtime; +extern volatile struct timeval time; +extern struct timezone tz; /* XXX */ + +extern int tick; /* usec per tick (1000000 / hz) */ +extern int hz; /* system clock's frequency */ +extern int stathz; /* statistics clock's frequency */ +extern int profhz; /* profiling clock's frequency */ +extern int ticks; +extern int lbolt; /* once a second sleep address */ +extern int tickdelta; +extern long timedelta; + +/* + * The following macros are used to declare global sets of objects, which + * are collected by the linker into a `struct linker_set' as defined below. + * + * NB: the constants defined below must match those defined in + * ld/ld.h. Since their calculation requires arithmetic, we + * can't name them symbolically (e.g., 23 is N_SETT | N_EXT). + */ +#define MAKE_SET(set, sym, type) \ + asm(".stabs \"_" #set "\", " #type ", 0, 0, _" #sym) +#define TEXT_SET(set, sym) MAKE_SET(set, sym, 23) +#define DATA_SET(set, sym) MAKE_SET(set, sym, 25) +#define BSS_SET(set, sym) MAKE_SET(set, sym, 27) +#define ABS_SET(set, sym) MAKE_SET(set, sym, 21) + +#ifdef PSEUDO_LKM +#include <sys/conf.h> +#include <sys/exec.h> +#include <sys/sysent.h> +#include <sys/lkm.h> + +#define PSEUDO_SET(init, name) \ + extern struct linker_set MODVNOPS; \ + MOD_MISC(#name); \ + int name ## _load(struct lkm_table *lkmtp, int cmd) \ + { init(); return 0; } \ + int name ## _unload(struct lkm_table *lkmtp, int cmd) \ + { return EINVAL; } \ + int \ + name ## _mod(struct lkm_table *lkmtp, int cmd, int ver) { \ + DISPATCH(lkmtp, cmd, ver, name ## _load, name ## _unload, \ + nosys); } +#else /* PSEUDO_LKM */ + +#define PSEUDO_SET(sym, name) TEXT_SET(pseudo_set, sym) + +#endif /* PSEUDO_LKM */ + +struct linker_set { + int ls_length; + caddr_t ls_items[1]; /* really ls_length of them, trailing NULL */ +}; + +extern const struct linker_set execsw_set; + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/libkern.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/libkern.h new file mode 100644 index 00000000000..e31b51605f1 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/libkern.h @@ -0,0 +1,64 @@ +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)libkern.h 8.1 (Berkeley) 6/10/93 + */ + +#include <sys/types.h> + +static __inline int imax(int a, int b) { return (a > b ? a : b); } +static __inline int imin(int a, int b) { return (a < b ? a : b); } +static __inline long lmax(long a, long b) { return (a > b ? a : b); } +static __inline long lmin(long a, long b) { return (a < b ? a : b); } +static __inline u_int max(u_int a, u_int b) { return (a > b ? a : b); } +static __inline u_int min(u_int a, u_int b) { return (a < b ? a : b); } +static __inline quad_t qmax(quad_t a, quad_t b) { return (a > b ? a : b); } +static __inline quad_t qmin(quad_t a, quad_t b) { return (a < b ? a : b); } +static __inline u_long ulmax(u_long a, u_long b) { return (a > b ? a : b); } +static __inline u_long ulmin(u_long a, u_long b) { return (a < b ? a : b); } + +/* Prototypes for non-quad routines. */ +int bcmp __P((const void *, const void *, size_t)); +#ifndef HAVE_INLINE_FFS +int ffs __P((int)); +#endif +int locc __P((int, char *, u_int)); +u_long random __P((void)); +char *rindex __P((const char *, int)); +int scanc __P((u_int, u_char *, u_char *, int)); +int skpc __P((int, int, char *)); +char *strcat __P((char *, const char *)); +int strcmp __P((const char *, const char *)); +char *strcpy __P((char *, const char *)); +size_t strlen __P((const char *)); +int strncmp __P((const char *, const char *, size_t)); +char *strncpy __P((char *, const char *, size_t)); diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/malloc.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/malloc.h new file mode 100644 index 00000000000..d21a9193939 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/malloc.h @@ -0,0 +1,333 @@ +/* + * Copyright (c) 1987, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)malloc.h 8.3 (Berkeley) 1/12/94 + */ + +#ifndef _SYS_MALLOC_H_ +#define _SYS_MALLOC_H_ + +#ifndef OSKIT +#define KMEMSTATS +#endif + +/* + * flags to malloc + */ +#define M_WAITOK 0x0000 +#define M_NOWAIT 0x0001 +#define M_KERNEL 0x0002 + +/* + * Types of memory to be allocated + */ +#define M_FREE 0 /* should be on free list */ +#define M_MBUF 1 /* mbuf */ +#define M_DEVBUF 2 /* device driver memory */ +#define M_SOCKET 3 /* socket structure */ +#define M_PCB 4 /* protocol control block */ +#define M_RTABLE 5 /* routing tables */ +#define M_HTABLE 6 /* IMP host tables */ +#define M_FTABLE 7 /* fragment reassembly header */ +#define M_ZOMBIE 8 /* zombie proc status */ +#define M_IFADDR 9 /* interface address */ +#define M_SOOPTS 10 /* socket options */ +#define M_SONAME 11 /* socket name */ +#define M_NAMEI 12 /* namei path name buffer */ +#define M_GPROF 13 /* kernel profiling buffer */ +#define M_IOCTLOPS 14 /* ioctl data buffer */ +#define M_MAPMEM 15 /* mapped memory descriptors */ +#define M_CRED 16 /* credentials */ +#define M_PGRP 17 /* process group header */ +#define M_SESSION 18 /* session header */ +#define M_IOV 19 /* large iov's */ +#define M_MOUNT 20 /* vfs mount struct */ +#define M_FHANDLE 21 /* network file handle */ +#define M_NFSREQ 22 /* NFS request header */ +#define M_NFSMNT 23 /* NFS mount structure */ +#define M_NFSNODE 24 /* NFS vnode private part */ +#define M_VNODE 25 /* Dynamically allocated vnodes */ +#define M_CACHE 26 /* Dynamically allocated cache entries */ +#define M_DQUOT 27 /* UFS quota entries */ +#define M_UFSMNT 28 /* UFS mount structure */ +#define M_SHM 29 /* SVID compatible shared memory segments */ +#define M_VMMAP 30 /* VM map structures */ +#define M_VMMAPENT 31 /* VM map entry structures */ +#define M_VMOBJ 32 /* VM object structure */ +#define M_VMOBJHASH 33 /* VM object hash structure */ +#define M_VMPMAP 34 /* VM pmap */ +#define M_VMPVENT 35 /* VM phys-virt mapping entry */ +#define M_VMPAGER 36 /* XXX: VM pager struct */ +#define M_VMPGDATA 37 /* XXX: VM pager private data */ +#define M_FILE 38 /* Open file structure */ +#define M_FILEDESC 39 /* Open file descriptor table */ +#define M_LOCKF 40 /* Byte-range locking structures */ +#define M_PROC 41 /* Proc structures */ +#define M_SUBPROC 42 /* Proc sub-structures */ +#define M_SEGMENT 43 /* Segment for LFS */ +#define M_LFSNODE 44 /* LFS vnode private part */ +#define M_FFSNODE 45 /* FFS vnode private part */ +#define M_MFSNODE 46 /* MFS vnode private part */ +#define M_NQLEASE 47 /* Nqnfs lease */ +#define M_NQMHOST 48 /* Nqnfs host address table */ +#define M_NETADDR 49 /* Export host address structure */ +#define M_NFSSVC 50 /* Nfs server structure */ +#define M_NFSUID 51 /* Nfs uid mapping structure */ +#define M_NFSD 52 /* Nfs server daemon structure */ +#define M_IPMOPTS 53 /* internet multicast options */ +#define M_IPMADDR 54 /* internet multicast address */ +#define M_IFMADDR 55 /* link-level multicast address */ +#define M_MRTABLE 56 /* multicast routing tables */ +#define M_ISOFSMNT 57 /* ISOFS mount structure */ +#define M_ISOFSNODE 58 /* ISOFS vnode private part */ +#define M_MSDOSFSMNT 59 /* MSDOSFS mount structure */ +#define M_MSDOSFSNODE 60 /* MSDOSFS vnode private part */ +#define M_MSDOSFSFAT 61 /* MSDOSFS file allocation table */ +#define M_DEVFSMNT 62 /* DEVFS mount structure */ +#define M_DEVFSBACK 63 /* DEVFS Back node */ +#define M_DEVFSFRONT 64 /* DEVFS Front node */ +#define M_DEVFSNODE 65 /* DEVFS node */ +#define M_TEMP 74 /* misc temporary data buffers */ +#define M_TTYS 75 /* tty data structures */ +#define M_GZIP 76 /* Gzip trees */ +#define M_IPFW 77 /* IpFw/IpAcct chain's */ +#define M_DEVL 78 /* isa_device lists in userconfig() */ +#define M_LAST 79 /* Must be last type + 1 */ + +#define INITKMEMNAMES { \ + "free", /* 0 M_FREE */ \ + "mbuf", /* 1 M_MBUF */ \ + "devbuf", /* 2 M_DEVBUF */ \ + "socket", /* 3 M_SOCKET */ \ + "pcb", /* 4 M_PCB */ \ + "routetbl", /* 5 M_RTABLE */ \ + "hosttbl", /* 6 M_HTABLE */ \ + "fragtbl", /* 7 M_FTABLE */ \ + "zombie", /* 8 M_ZOMBIE */ \ + "ifaddr", /* 9 M_IFADDR */ \ + "soopts", /* 10 M_SOOPTS */ \ + "soname", /* 11 M_SONAME */ \ + "namei", /* 12 M_NAMEI */ \ + "gprof", /* 13 M_GPROF */ \ + "ioctlops", /* 14 M_IOCTLOPS */ \ + "mapmem", /* 15 M_MAPMEM */ \ + "cred", /* 16 M_CRED */ \ + "pgrp", /* 17 M_PGRP */ \ + "session", /* 18 M_SESSION */ \ + "iov", /* 19 M_IOV */ \ + "mount", /* 20 M_MOUNT */ \ + "fhandle", /* 21 M_FHANDLE */ \ + "NFS req", /* 22 M_NFSREQ */ \ + "NFS mount", /* 23 M_NFSMNT */ \ + "NFS node", /* 24 M_NFSNODE */ \ + "vnodes", /* 25 M_VNODE */ \ + "namecache", /* 26 M_CACHE */ \ + "UFS quota", /* 27 M_DQUOT */ \ + "UFS mount", /* 28 M_UFSMNT */ \ + "shm", /* 29 M_SHM */ \ + "VM map", /* 30 M_VMMAP */ \ + "VM mapent", /* 31 M_VMMAPENT */ \ + "VM object", /* 32 M_VMOBJ */ \ + "VM objhash", /* 33 M_VMOBJHASH */ \ + "VM pmap", /* 34 M_VMPMAP */ \ + "VM pvmap", /* 35 M_VMPVENT */ \ + "VM pager", /* 36 M_VMPAGER */ \ + "VM pgdata", /* 37 M_VMPGDATA */ \ + "file", /* 38 M_FILE */ \ + "file desc", /* 39 M_FILEDESC */ \ + "lockf", /* 40 M_LOCKF */ \ + "proc", /* 41 M_PROC */ \ + "subproc", /* 42 M_SUBPROC */ \ + "LFS segment", /* 43 M_SEGMENT */ \ + "LFS node", /* 44 M_LFSNODE */ \ + "FFS node", /* 45 M_FFSNODE */ \ + "MFS node", /* 46 M_MFSNODE */ \ + "NQNFS Lease", /* 47 M_NQLEASE */ \ + "NQNFS Host", /* 48 M_NQMHOST */ \ + "Export Host", /* 49 M_NETADDR */ \ + "NFS srvsock", /* 50 M_NFSSVC */ \ + "NFS uid", /* 51 M_NFSUID */ \ + "NFS daemon", /* 52 M_NFSD */ \ + "ip_moptions", /* 53 M_IPMOPTS */ \ + "in_multi", /* 54 M_IPMADDR */ \ + "ether_multi", /* 55 M_IFMADDR */ \ + "mrt", /* 56 M_MRTABLE */ \ + "ISOFS mount", /* 57 M_ISOFSMNT */ \ + "ISOFS node", /* 58 M_ISOFSNODE */ \ + "MSDOSFS mount",/* 59 M_MSDOSFSMNT */ \ + "MSDOSFS node", /* 60 M_MSDOSFSNODE */ \ + "MSDOSFS FAT", /* 61 M_MSDOSFSFAR */ \ + "DEVFS mount", /* 62 M_DEVFSMNT */ \ + "DEVFS back", /* 63 M_DEVFSBACK */ \ + "DEVFS front", /* 64 M_DEVFSFRONT */ \ + "DEVFS node", /* 65 M_DEVFSNODE */ \ + NULL, \ + NULL, NULL, NULL, NULL, NULL, \ + NULL, NULL, \ + "temp", /* 74 M_TEMP */ \ + "ttys", /* 75 M_TTYS */ \ + "Gzip trees", /* 76 M_GZIP */ \ + "IpFw/IpAcct", /* 77 M_IPFW */ \ + "isa_devlist", /* 78 M_DEVL */ \ +} + +struct kmemstats { + long ks_inuse; /* # of packets of this type currently in use */ + long ks_calls; /* total packets of this type ever allocated */ + long ks_memuse; /* total memory held in bytes */ + u_short ks_limblocks; /* number of times blocked for hitting limit */ + u_short ks_mapblocks; /* number of times blocked for kernel map */ + long ks_maxused; /* maximum number ever used */ + long ks_limit; /* most that are allowed to exist */ + long ks_size; /* sizes of this thing that are allocated */ + long ks_spare; +}; + +/* + * Array of descriptors that describe the contents of each page + */ +struct kmemusage { + short ku_indx; /* bucket index */ + union { + u_short freecnt;/* for small allocations, free pieces in page */ + u_short pagecnt;/* for large allocations, pages alloced */ + } ku_un; +}; +#define ku_freecnt ku_un.freecnt +#define ku_pagecnt ku_un.pagecnt + +/* + * Set of buckets for each size of memory block that is retained + */ +struct kmembuckets { + caddr_t kb_next; /* list of free blocks */ + caddr_t kb_last; /* last free block */ + long kb_calls; /* total calls to allocate this size */ + long kb_total; /* total number of blocks allocated */ + long kb_totalfree; /* # of free elements in this bucket */ + long kb_elmpercl; /* # of elements in this sized allocation */ + long kb_highwat; /* high water mark */ + long kb_couldfree; /* over high water mark and could free */ +}; + +#ifdef KERNEL +#define MINALLOCSIZE (1 << MINBUCKET) +#define BUCKETINDX(size) \ + (size) <= (MINALLOCSIZE * 128) \ + ? (size) <= (MINALLOCSIZE * 8) \ + ? (size) <= (MINALLOCSIZE * 2) \ + ? (size) <= (MINALLOCSIZE * 1) \ + ? (MINBUCKET + 0) \ + : (MINBUCKET + 1) \ + : (size) <= (MINALLOCSIZE * 4) \ + ? (MINBUCKET + 2) \ + : (MINBUCKET + 3) \ + : (size) <= (MINALLOCSIZE* 32) \ + ? (size) <= (MINALLOCSIZE * 16) \ + ? (MINBUCKET + 4) \ + : (MINBUCKET + 5) \ + : (size) <= (MINALLOCSIZE * 64) \ + ? (MINBUCKET + 6) \ + : (MINBUCKET + 7) \ + : (size) <= (MINALLOCSIZE * 2048) \ + ? (size) <= (MINALLOCSIZE * 512) \ + ? (size) <= (MINALLOCSIZE * 256) \ + ? (MINBUCKET + 8) \ + : (MINBUCKET + 9) \ + : (size) <= (MINALLOCSIZE * 1024) \ + ? (MINBUCKET + 10) \ + : (MINBUCKET + 11) \ + : (size) <= (MINALLOCSIZE * 8192) \ + ? (size) <= (MINALLOCSIZE * 4096) \ + ? (MINBUCKET + 12) \ + : (MINBUCKET + 13) \ + : (size) <= (MINALLOCSIZE * 16384) \ + ? (MINBUCKET + 14) \ + : (MINBUCKET + 15) + +/* + * Turn virtual addresses into kmem map indicies + */ +#define kmemxtob(alloc) (kmembase + (alloc) * NBPG) +#define btokmemx(addr) (((caddr_t)(addr) - kmembase) / NBPG) +#define btokup(addr) (&kmemusage[((caddr_t)(addr) - kmembase) >> CLSHIFT]) + +/* + * Macro versions for the usual cases of malloc/free + */ +#if defined(KMEMSTATS) || defined(DIAGNOSTIC) +#define MALLOC(space, cast, size, type, flags) \ + (space) = (cast)fbsd_malloc((u_long)(size), __FILE__, __LINE__, type, flags) +#define FREE(addr, type) fbsd_free((caddr_t)(addr), __FILE__, __LINE__, type) + +#else /* do not collect statistics */ +#define MALLOC(space, cast, size, type, flags) { \ + register struct kmembuckets *kbp = &bucket[BUCKETINDX(size)]; \ + long s = splimp(); \ + if (kbp->kb_next == NULL) { \ + (space) = (cast)fbsd_malloc((u_long)(size), __FILE__, __LINE__, type, flags); \ + } else { \ + (space) = (cast)kbp->kb_next; \ + kbp->kb_next = *(caddr_t *)(space); \ + } \ + splx(s); \ +} + +#define FREE(addr, type) { \ + register struct kmembuckets *kbp; \ + register struct kmemusage *kup = btokup(addr); \ + long s = splimp(); \ + if (1 << kup->ku_indx > MAXALLOCSAVE) { \ + fbsd_free((caddr_t)(addr), __FILE__, __LINE__, type); \ + } else { \ + kbp = &bucket[kup->ku_indx]; \ + if (kbp->kb_next == NULL) \ + kbp->kb_next = (caddr_t)(addr); \ + else \ + *(caddr_t *)(kbp->kb_last) = (caddr_t)(addr); \ + *(caddr_t *)(addr) = NULL; \ + kbp->kb_last = (caddr_t)(addr); \ + } \ + splx(s); \ +} +#endif /* do not collect statistics */ + +extern struct kmemstats kmemstats[]; +extern struct kmemusage *kmemusage; +extern char *kmembase; +extern struct kmembuckets bucket[]; +#ifndef __REACTOS__ +extern void *malloc __P((unsigned long size, ...)); +extern void free __P((void *addr, ...)); +#endif +#endif /* KERNEL */ +#endif /* !_SYS_MALLOC_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/mbuf.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/mbuf.h new file mode 100644 index 00000000000..3583ee7da50 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/mbuf.h @@ -0,0 +1,512 @@ +/* + * Copyright (c) 1997-1998 University of Utah and the Flux Group. + * All rights reserved. + * + * This file is part of the Flux OSKit. The OSKit is free software, also known + * as "open source;" you can redistribute it and/or modify it under the terms + * of the GNU General Public License (GPL), version 2, as published by the Free + * Software Foundation (FSF). To explore alternate licensing terms, contact + * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. + * + * The OSKit 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 GPL for more details. You should have + * received a copy of the GPL along with the OSKit; see the file COPYING. If + * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. + */ +/* + * Copyright (c) 1982, 1986, 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)mbuf.h 8.3 (Berkeley) 1/21/94 + * $\Id: mbuf.h,v 1.9 1994/11/14 13:54:20 bde Exp $ + */ + +#ifndef _SYS_MBUF_H_ +#define _SYS_MBUF_H_ + +#ifndef M_WAITOK +#include <sys/malloc.h> +#endif + +/* + * Mbufs are of a single size, MSIZE (machine/machparam.h), which + * includes overhead. An mbuf may add a single "mbuf cluster" of size + * MCLBYTES (also in machine/machparam.h), which has no additional overhead + * and is used instead of the internal data area; this is done when + * at least MINCLSIZE of data must be stored. + */ + +#define MLEN (MSIZE - sizeof(struct m_hdr)) /* normal data len */ +#define MHLEN (MLEN - sizeof(struct pkthdr)) /* data len w/pkthdr */ + +#define MINCLSIZE (MHLEN + MLEN) /* smallest amount to put in cluster */ +#define M_MAXCOMPRESS (MHLEN / 2) /* max amount to copy for compression */ + +/* + * Macros for type conversion + * mtod(m,t) - convert mbuf pointer to data pointer of correct type + * dtom(x) - convert data pointer within mbuf to mbuf pointer (XXX) + * mtocl(x) - convert pointer within cluster to cluster index # + * cltom(x) - convert cluster # to ptr to beginning of cluster + */ +#define mtod(m,t) ((t)((m)->m_data)) +#define dtom(x) ((struct mbuf *)((int)(x) - sizeof(struct m_hdr))) +#ifndef OSKIT +#define mtocl(x) (((u_int)(x) - (u_int)mbutl) >> MCLSHIFT) +#define cltom(x) ((caddr_t)((u_int)mbutl + ((u_int)(x) << MCLSHIFT))) +#endif /* OSKIT */ + +/* header at beginning of each mbuf: */ +struct m_hdr { + struct mbuf *mh_next; /* next buffer in chain */ + struct mbuf *mh_nextpkt; /* next chain in queue/record */ + int mh_len; /* amount of data in this mbuf */ + caddr_t mh_data; /* location of data */ + short mh_type; /* type of data in this mbuf */ + short mh_flags; /* flags; see below */ +}; + +/* record/packet header in first mbuf of chain; valid if M_PKTHDR set */ +struct pkthdr { + int len; /* total packet length */ + struct ifnet *rcvif; /* rcv interface */ +}; + +/* description of external storage mapped into mbuf, valid if M_EXT set */ +struct m_ext { + caddr_t ext_buf; /* start of buffer */ +#ifdef OSKIT + struct oskit_bufio *ext_bufio; /* OS Kit bufio pointer */ +#else + void (*ext_free) /* free routine if not the usual */ + __P((caddr_t, u_int)); +#endif + u_int ext_size; /* size of buffer, for ext_free */ +}; + +struct mbuf { + struct m_hdr m_hdr; + union { + struct { + struct pkthdr MH_pkthdr; /* M_PKTHDR set */ + union { + struct m_ext MH_ext; /* M_EXT set */ + char MH_databuf[MHLEN]; + } MH_dat; + } MH; + char M_databuf[MLEN]; /* !M_PKTHDR, !M_EXT */ + } M_dat; +}; +#define m_next m_hdr.mh_next +#define m_len m_hdr.mh_len +#define m_data m_hdr.mh_data +#define m_type m_hdr.mh_type +#define m_flags m_hdr.mh_flags +#define m_nextpkt m_hdr.mh_nextpkt +#define m_act m_nextpkt +#define m_pkthdr M_dat.MH.MH_pkthdr +#define m_ext M_dat.MH.MH_dat.MH_ext +#define m_pktdat M_dat.MH.MH_dat.MH_databuf +#define m_dat M_dat.M_databuf + +/* mbuf flags */ +#ifdef OSKIT +#include <oskit/io/bufio.h> +/* + * A small step for mankind, but a huge leap for BSD: + * We consistently use oskit_bufios for external mbufs + */ +#endif +#define M_EXT 0x0001 /* has associated external storage */ +#define M_PKTHDR 0x0002 /* start of record */ +#define M_EOR 0x0004 /* end of record */ + +/* mbuf pkthdr flags, also in m_flags */ +#define M_BCAST 0x0100 /* send/received as link-level broadcast */ +#define M_MCAST 0x0200 /* send/received as link-level multicast */ + +/* flags copied when copying m_pkthdr */ +#define M_COPYFLAGS (M_PKTHDR|M_EOR|M_BCAST|M_MCAST) + +/* mbuf types */ +#define MT_FREE 0 /* should be on free list */ +#define MT_DATA 1 /* dynamic (data) allocation */ +#define MT_HEADER 2 /* packet header */ +#define MT_SOCKET 3 /* socket structure */ +#define MT_PCB 4 /* protocol control block */ +#define MT_RTABLE 5 /* routing tables */ +#define MT_HTABLE 6 /* IMP host tables */ +#define MT_ATABLE 7 /* address resolution tables */ +#define MT_SONAME 8 /* socket name */ +#define MT_SOOPTS 10 /* socket options */ +#define MT_FTABLE 11 /* fragment reassembly header */ +#define MT_RIGHTS 12 /* access rights */ +#define MT_IFADDR 13 /* interface address */ +#define MT_CONTROL 14 /* extra-data protocol message */ +#define MT_OOBDATA 15 /* expedited data */ + +/* flags to m_get/MGET */ +#define M_DONTWAIT M_NOWAIT +#define M_WAIT M_WAITOK + +/* + * mbuf utility macros: + * + * MBUFLOCK(code) + * prevents a section of code from from being interrupted by network + * drivers. + */ +#define MBUFLOCK(code) \ + { int ms = splimp(); \ + { code } \ + splx(ms); \ + } + +/* + * mbuf allocation/deallocation macros: + * + * MGET(struct mbuf *m, int how, int type) + * allocates an mbuf and initializes it to contain internal data. + * + * MGETHDR(struct mbuf *m, int how, int type) + * allocates an mbuf and initializes it to contain a packet header + * and internal data. + */ +#define MGET(m, how, type) { \ + MALLOC((m), struct mbuf *, MSIZE, mbtypes[type], (how)); \ + if (m) { \ + (m)->m_type = (type); \ + MBUFLOCK(mbstat.m_mtypes[type]++;) \ + (m)->m_next = (struct mbuf *)NULL; \ + (m)->m_nextpkt = (struct mbuf *)NULL; \ + (m)->m_data = (m)->m_dat; \ + (m)->m_flags = 0; \ + } else \ + (m) = m_retry((how), (type)); \ +} + +#define MGETHDR(m, how, type) { \ + MALLOC((m), struct mbuf *, MSIZE, mbtypes[type], (how)); \ + if (m) { \ + (m)->m_type = (type); \ + MBUFLOCK(mbstat.m_mtypes[type]++;) \ + (m)->m_next = (struct mbuf *)NULL; \ + (m)->m_nextpkt = (struct mbuf *)NULL; \ + (m)->m_data = (m)->m_pktdat; \ + (m)->m_flags = M_PKTHDR; \ + } else { \ + (m) = m_retryhdr((how), (type)); \ + } \ +} + +#if defined(OSKIT) || defined(__REACTOS__) +#define MGET_DONT_RECURSE(m, how, type) { \ + MALLOC((m), struct mbuf *, MSIZE, mbtypes[type], (how)); \ + if (m) { \ + (m)->m_type = (type); \ + MBUFLOCK(mbstat.m_mtypes[type]++;) \ + (m)->m_next = (struct mbuf *)NULL; \ + (m)->m_nextpkt = (struct mbuf *)NULL; \ + (m)->m_data = (m)->m_dat; \ + (m)->m_flags = 0; \ + } else \ + (m) = (struct mbuf *)0; \ +} + +#define MGETHDR_DONT_RECURSE(m, how, type) { \ + MALLOC((m), struct mbuf *, MSIZE, mbtypes[type], (how)); \ + if (m) { \ + (m)->m_type = (type); \ + MBUFLOCK(mbstat.m_mtypes[type]++;) \ + (m)->m_next = (struct mbuf *)NULL; \ + (m)->m_nextpkt = (struct mbuf *)NULL; \ + (m)->m_data = (m)->m_pktdat; \ + (m)->m_flags = M_PKTHDR; \ + } else \ + (m) = (struct mbuf *)0; \ +} +#endif /* OSKIT */ + +#ifndef OSKIT +/* + * Mbuf cluster macros. + * MCLALLOC(caddr_t p, int how) allocates an mbuf cluster. + * MCLGET adds such clusters to a normal mbuf; + * the flag M_EXT is set upon success. + * MCLFREE releases a reference to a cluster allocated by MCLALLOC, + * freeing the cluster if the reference count has reached 0. + * + * Normal mbuf clusters are normally treated as character arrays + * after allocation, but use the first word of the buffer as a free list + * pointer while on the free list. + */ +union mcluster { + union mcluster *mcl_next; + char mcl_buf[MCLBYTES]; +}; + +#define MCLALLOC(p, how) \ + MBUFLOCK( \ + if (mclfree == 0) \ + (void)m_clalloc(1, (how)); \ + (p) = (caddr_t)mclfree; \ + if ((p)) { \ + ++mclrefcnt[mtocl(p)]; \ + mbstat.m_clfree--; \ + mclfree = ((union mcluster *)(p))->mcl_next; \ + } \ + ) + +#define MCLGET(m, how) \ + { MCLALLOC((m)->m_ext.ext_buf, (how)); \ + if ((m)->m_ext.ext_buf != NULL) { \ + (m)->m_data = (m)->m_ext.ext_buf; \ + (m)->m_flags |= M_EXT; \ + (m)->m_ext.ext_size = MCLBYTES; \ + } \ + } + +#define MCLFREE(p) \ + MBUFLOCK ( \ + if (--mclrefcnt[mtocl(p)] == 0) { \ + ((union mcluster *)(p))->mcl_next = mclfree; \ + mclfree = (union mcluster *)(p); \ + mbstat.m_clfree++; \ + } \ + ) +#else +#define MCLGET(m, how) \ + { (m)->m_ext.ext_bufio = oskit_bufio_create(MCLBYTES); \ + oskit_bufio_map((m)->m_ext.ext_bufio, \ + (void **)&((m)->m_ext.ext_buf), 0, MCLBYTES); \ + if ((m)->m_ext.ext_buf != NULL) { \ + (m)->m_data = (m)->m_ext.ext_buf; \ + (m)->m_flags |= M_EXT; \ + (m)->m_ext.ext_size = MCLBYTES; \ + } \ + } + +#endif /* !OSKIT */ + +/* + * MFREE(struct mbuf *m, struct mbuf *n) + * Free a single mbuf and associated external storage. + * Place the successor, if any, in n. + */ +#ifdef notyet +#define MFREE(m, n) \ + { MBUFLOCK(mbstat.m_mtypes[(m)->m_type]--;) \ + if ((m)->m_flags & M_EXT) { \ + if ((m)->m_ext.ext_free) \ + (*((m)->m_ext.ext_free))((m)->m_ext.ext_buf, \ + (m)->m_ext.ext_size); \ + else \ + MCLFREE((m)->m_ext.ext_buf); \ + } \ + (n) = (m)->m_next; \ + FREE((m), mbtypes[(m)->m_type]); \ + } +#else /* notyet */ +#ifdef OSKIT +#define MFREE(m, nn) \ + { MBUFLOCK(mbstat.m_mtypes[(m)->m_type]--;) \ + if ((m)->m_flags & M_EXT) { \ + oskit_bufio_release((m)->m_ext.ext_bufio); \ + } \ + (nn) = (m)->m_next; \ + FREE((m), mbtypes[(m)->m_type]); \ + } +#else /* !OSKIT */ +#define MFREE(m, nn) \ + { MBUFLOCK(mbstat.m_mtypes[(m)->m_type]--;) \ + if ((m)->m_flags & M_EXT) { \ + MCLFREE((m)->m_ext.ext_buf); \ + } \ + (nn) = (m)->m_next; \ + FREE((m), mbtypes[(m)->m_type]); \ + } +#endif /* OSKIT */ +#endif + +/* + * Copy mbuf pkthdr from from to to. + * from must have M_PKTHDR set, and to must be empty. + */ +#define M_COPY_PKTHDR(to, from) { \ + (to)->m_pkthdr = (from)->m_pkthdr; \ + (to)->m_flags = (from)->m_flags & M_COPYFLAGS; \ + (to)->m_data = (to)->m_pktdat; \ +} + +/* + * Set the m_data pointer of a newly-allocated mbuf (m_get/MGET) to place + * an object of the specified size at the end of the mbuf, longword aligned. + */ +#define M_ALIGN(m, len) \ + { (m)->m_data += (MLEN - (len)) &~ (sizeof(long) - 1); } +/* + * As above, for mbufs allocated with m_gethdr/MGETHDR + * or initialized by M_COPY_PKTHDR. + */ +#define MH_ALIGN(m, len) \ + { (m)->m_data += (MHLEN - (len)) &~ (sizeof(long) - 1); } + +/* + * Compute the amount of space available + * before the current start of data in an mbuf. + */ +#ifdef OSKIT +/* Be bold and strong: why shouldn't that work??? */ +#define M_LEADINGSPACE(m) \ + ((m)->m_flags & M_EXT ? (m)->m_data - (m)->m_ext.ext_buf : \ + (m)->m_flags & M_PKTHDR ? (m)->m_data - (m)->m_pktdat : \ + (m)->m_data - (m)->m_dat) +#else +#define M_LEADINGSPACE(m) \ + ((m)->m_flags & M_EXT ? /* (m)->m_data - (m)->m_ext.ext_buf */ 0 : \ + (m)->m_flags & M_PKTHDR ? (m)->m_data - (m)->m_pktdat : \ + (m)->m_data - (m)->m_dat) +#endif /* OSKIT */ + +/* + * Compute the amount of space available + * after the end of data in an mbuf. + */ +#define M_TRAILINGSPACE(m) \ + ((m)->m_flags & M_EXT ? (m)->m_ext.ext_buf + (m)->m_ext.ext_size - \ + ((m)->m_data + (m)->m_len) : \ + &(m)->m_dat[MLEN] - ((m)->m_data + (m)->m_len)) + +/* + * Arrange to prepend space of size plen to mbuf m. + * If a new mbuf must be allocated, how specifies whether to wait. + * If how is M_DONTWAIT and allocation fails, the original mbuf chain + * is freed and m is set to NULL. + */ +#define M_PREPEND(m, plen, how) { \ + if (M_LEADINGSPACE(m) >= (plen)) { \ + (m)->m_data -= (plen); \ + (m)->m_len += (plen); \ + } else \ + (m) = m_prepend((m), (plen), (how)); \ + if ((m) && (m)->m_flags & M_PKTHDR) \ + (m)->m_pkthdr.len += (plen); \ +} + +/* change mbuf to new type */ +#define MCHTYPE(m, t) { \ + MBUFLOCK(mbstat.m_mtypes[(m)->m_type]--; mbstat.m_mtypes[t]++;) \ + (m)->m_type = t;\ +} + +/* length to m_copy to copy all */ +#define M_COPYALL 1000000000 + +/* compatiblity with 4.3 */ +#define m_copy(m, o, l) m_copym((m), (o), (l), M_DONTWAIT) + +/* + * Mbuf statistics. + */ +struct mbstat { + u_long m_mbufs; /* mbufs obtained from page pool */ + u_long m_clusters; /* clusters obtained from page pool */ + u_long m_spare; /* spare field */ + u_long m_clfree; /* free clusters */ + u_long m_drops; /* times failed to find space */ + u_long m_wait; /* times waited for space */ + u_long m_drain; /* times drained protocols for space */ + u_short m_mtypes[256]; /* type specific mbuf allocations */ +}; + +#ifdef KERNEL +#ifndef OSKIT +extern struct mbuf *mbutl; /* virtual address of mclusters */ +extern char *mclrefcnt; /* cluster reference counts */ +#endif /* !OSKIT */ +struct mbstat mbstat; +#ifndef OSKIT +extern int nmbclusters; +union mcluster *mclfree; +#endif /* !OSKIT */ +int max_linkhdr; /* largest link-level header */ +int max_protohdr; /* largest protocol header */ +int max_hdr; /* largest link+protocol header */ +int max_datalen; /* MHLEN - max_hdr */ +extern int mbtypes[]; /* XXX */ + +int m_clalloc __P((int, int)); +void m_copyback __P((struct mbuf *, int, int, caddr_t)); +struct mbuf *m_retry __P((int, int)); +struct mbuf *m_retryhdr __P((int, int)); +void m_reclaim __P((void)); +struct mbuf *m_get __P((int, int)); +struct mbuf *m_gethdr __P((int, int)); +struct mbuf *m_getclr __P((int, int)); +struct mbuf *m_free __P((struct mbuf *)); +void m_freem __P((struct mbuf *)); +struct mbuf *m_prepend __P((struct mbuf *,int,int)); +struct mbuf *m_copym __P((struct mbuf *, int, int, int)); +void m_copydata __P((struct mbuf *,int,int,caddr_t)); +void m_cat __P((struct mbuf *,struct mbuf *)); +void m_adj __P((struct mbuf *,int)); +struct mbuf *m_pullup __P((struct mbuf *, int)); +struct mbuf *m_split __P((struct mbuf *,int,int)); +struct mbuf *m_devget __P((char *, int, int, struct ifnet *, + void (*copy)(struct mbuf *, caddr_t, u_int))); + +#ifdef MBTYPES +int mbtypes[] = { /* XXX */ + M_FREE, /* MT_FREE 0 should be on free list */ + M_MBUF, /* MT_DATA 1 dynamic (data) allocation */ + M_MBUF, /* MT_HEADER 2 packet header */ + M_SOCKET, /* MT_SOCKET 3 socket structure */ + M_PCB, /* MT_PCB 4 protocol control block */ + M_RTABLE, /* MT_RTABLE 5 routing tables */ + M_HTABLE, /* MT_HTABLE 6 IMP host tables */ + 0, /* MT_ATABLE 7 address resolution tables */ + M_MBUF, /* MT_SONAME 8 socket name */ + 0, /* 9 */ + M_SOOPTS, /* MT_SOOPTS 10 socket options */ + M_FTABLE, /* MT_FTABLE 11 fragment reassembly header */ + M_MBUF, /* MT_RIGHTS 12 access rights */ + M_IFADDR, /* MT_IFADDR 13 interface address */ + M_MBUF, /* MT_CONTROL 14 extra-data protocol message */ + M_MBUF, /* MT_OOBDATA 15 expedited data */ +#ifdef DATAKIT + 25, 26, 27, 28, 29, 30, 31, 32 /* datakit ugliness */ +#endif +}; +#endif +#endif + +#endif /* !_SYS_MBUF_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/param.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/param.h new file mode 100644 index 00000000000..99f983d0189 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/param.h @@ -0,0 +1,224 @@ +/*- + * Copyright (c) 1982, 1986, 1989, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)param.h 8.2 (Berkeley) 1/21/94 + */ + +#ifndef _SYS_PARAM_H_ +#define _SYS_PARAM_H_ + +#define BSD 199306 /* System version (year & month). */ +#define BSD4_3 1 +#define BSD4_4 1 + +#ifndef NULL +#define NULL 0 +#endif + +#ifndef LOCORE +#include <sys/types.h> +#endif + +/* + * Machine-independent constants (some used in following include files). + * Redefined constants are from POSIX 1003.1 limits file. + * + * MAXCOMLEN should be >= sizeof(ac_comm) (see <acct.h>) + * MAXLOGNAME should be >= UT_NAMESIZE (see <utmp.h>) + */ +#include <sys/syslimits.h> + +#define MAXCOMLEN 16 /* max command name remembered */ +#define MAXINTERP 32 /* max interpreter file name length */ +#define MAXLOGNAME 12 /* max login name length */ +#define MAXUPRC CHILD_MAX /* max simultaneous processes */ +#define NCARGS ARG_MAX /* max bytes for an exec function */ +#define NGROUPS NGROUPS_MAX /* max number groups */ +#define NOFILE OPEN_MAX /* max open files per process */ +#define NOGROUP 65535 /* marker for empty group set member */ +#define MAXHOSTNAMELEN 256 /* max hostname size */ + +/* More types and definitions used throughout the kernel. */ +#ifdef KERNEL +#include <sys/cdefs.h> +#include <sys/errno.h> +#include <sys/time.h> +#include <sys/resource.h> +#include <sys/ucred.h> +#include <sys/uio.h> +#include <sys/rtprio.h> +#endif + +/* Signals. */ +#include <sys/signal.h> + +/* Machine type dependent parameters. */ +#include <machine/param.h> +#include <machine/limits.h> + +/* + * Priorities. Note that with 32 run queues, differences less than 4 are + * insignificant. + */ +#define PSWP 0 +#define PVM 4 +#define PINOD 8 +#define PRIBIO 16 +#define PVFS 20 +#define PZERO 22 /* No longer magic, shouldn't be here. XXX */ +#define PSOCK 24 +#define PWAIT 32 +#define PLOCK 36 +#define PPAUSE 40 +#define PUSER 50 +#define MAXPRI 127 /* Priorities range from 0 through MAXPRI. */ + +#define PRIMASK 0x0ff +#define PCATCH 0x100 /* OR'd with pri for tsleep to check signals */ + +#define NZERO 0 /* default "nice" */ + +#define NBPW sizeof(int) /* number of bytes per word (integer) */ + +#define CMASK 022 /* default file mask: S_IWGRP|S_IWOTH */ +#define NODEV (dev_t)(-1) /* non-existent device */ + +/* + * Clustering of hardware pages on machines with ridiculously small + * page sizes is done here. The paging subsystem deals with units of + * CLSIZE pte's describing NBPG (from machine/machparam.h) pages each. + */ +#define CLBYTES (CLSIZE*NBPG) +#define CLOFSET (CLSIZE*NBPG-1) /* for clusters, like PGOFSET */ +#define claligned(x) ((((int)(x))&CLOFSET)==0) +#define CLOFF CLOFSET +#define CLSHIFT (PGSHIFT+CLSIZELOG2) + +#if CLSIZE==1 +#define clbase(i) (i) +#define clrnd(i) (i) +#else +/* Give the base virtual address (first of CLSIZE). */ +#define clbase(i) ((i) &~ (CLSIZE-1)) +/* Round a number of clicks up to a whole cluster. */ +#define clrnd(i) (((i) + (CLSIZE-1)) &~ (CLSIZE-1)) +#endif + +#define CBLOCK 128 /* Clist block size, must be a power of 2. */ +#define CBQSIZE (CBLOCK/NBBY) /* Quote bytes/cblock - can do better. */ + /* Data chars/clist. */ +#define CBSIZE (CBLOCK - sizeof(struct cblock *) - CBQSIZE) +#define CROUND (CBLOCK - 1) /* Clist rounding. */ + +/* + * File system parameters and macros. + * + * The file system is made out of blocks of at most MAXBSIZE units, with + * smaller units (fragments) only in the last direct block. MAXBSIZE + * primarily determines the size of buffers in the buffer pool. It may be + * made larger without any effect on existing file systems; however making + * it smaller make make some file systems unmountable. Also, MAXBSIZE + * must be less than MAXPHYS!!! + */ +#define MAXBSIZE 16384 +#define MAXFRAG 8 + +/* + * MAXPATHLEN defines the longest permissable path length after expanding + * symbolic links. It is used to allocate a temporary buffer from the buffer + * pool in which to do the name expansion, hence should be a power of two, + * and must be less than or equal to MAXBSIZE. MAXSYMLINKS defines the + * maximum number of symbolic links that may be expanded in a path name. + * It should be set high enough to allow all legitimate uses, but halt + * infinite loops reasonably quickly. + */ +#define MAXPATHLEN PATH_MAX +#define MAXSYMLINKS 32 + +/* Bit map related macros. */ +#define setbit(a,i) ((a)[(i)/NBBY] |= 1<<((i)%NBBY)) +#define clrbit(a,i) ((a)[(i)/NBBY] &= ~(1<<((i)%NBBY))) +#define isset(a,i) ((a)[(i)/NBBY] & (1<<((i)%NBBY))) +#define isclr(a,i) (((a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0) + +/* Macros for counting and rounding. */ +#ifndef howmany +#define howmany(x, y) (((x)+((y)-1))/(y)) +#endif +#define rounddown(x, y) (((x)/(y))*(y)) +#define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) +#define powerof2(x) ((((x)-1)&(x))==0) + +/* Macros for min/max. */ +#ifndef KERNEL +#define MIN(a,b) (((a)<(b))?(a):(b)) +#define MAX(a,b) (((a)>(b))?(a):(b)) +#endif + +/* + * Constants for setting the parameters of the kernel memory allocator. + * + * 2 ** MINBUCKET is the smallest unit of memory that will be + * allocated. It must be at least large enough to hold a pointer. + * + * Units of memory less or equal to MAXALLOCSAVE will permanently + * allocate physical memory; requests for these size pieces of + * memory are quite fast. Allocations greater than MAXALLOCSAVE must + * always allocate and free physical memory; requests for these + * size allocations should be done infrequently as they will be slow. + * + * Constraints: CLBYTES <= MAXALLOCSAVE <= 2 ** (MINBUCKET + 14), and + * MAXALLOCSIZE must be a power of two. + */ +#define MINBUCKET 4 /* 4 => min allocation of 16 bytes */ +#define MAXALLOCSAVE (2 * CLBYTES) + +/* + * Scale factor for scaled integers used to count %cpu time and load avgs. + * + * The number of CPU `tick's that map to a unique `%age' can be expressed + * by the formula (1 / (2 ^ (FSHIFT - 11))). The maximum load average that + * can be calculated (assuming 32 bits) can be closely approximated using + * the formula (2 ^ (2 * (16 - FSHIFT))) for (FSHIFT < 15). + * + * For the scheduler to maintain a 1:1 mapping of CPU `tick' to `%age', + * FSHIFT must be at least 11; this gives us a maximum load avg of ~1024. + */ +#define FSHIFT 11 /* bits to right of fixed binary point */ +#define FSCALE (1<<FSHIFT) + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/proc.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/proc.h new file mode 100644 index 00000000000..e8634b7550e --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/proc.h @@ -0,0 +1,336 @@ +/* + * Copyright (c) 1996-1998 University of Utah and the Flux Group. + * All rights reserved. + * + * This file is part of the Flux OSKit. The OSKit is free software, also known + * as "open source;" you can redistribute it and/or modify it under the terms + * of the GNU General Public License (GPL), version 2, as published by the Free + * Software Foundation (FSF). To explore alternate licensing terms, contact + * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. + * + * The OSKit 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 GPL for more details. You should have + * received a copy of the GPL along with the OSKit; see the file COPYING. If + * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. + */ +/*- + * Copyright (c) 1986, 1989, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)proc.h 8.8 (Berkeley) 1/21/94 + * $\Id: proc.h,v 1.17.4.1 1996/06/04 02:45:01 davidg Exp $ + */ + +#ifndef _SYS_PROC_H_ +#define _SYS_PROC_H_ + +#include <machine/proc.h> /* Machine-dependent proc substruct. */ +#include <sys/rtprio.h> /* For struct rtprio. */ +#include <sys/select.h> /* For struct selinfo. */ +#include <sys/time.h> /* For structs itimerval, timeval. */ + +#ifdef OSKIT +#include <oskit/dev/dev.h> +#endif + +/* + * One structure allocated per session. + */ +struct session { + int s_count; /* Ref cnt; pgrps in session. */ + struct proc *s_leader; /* Session leader. */ + struct vnode *s_ttyvp; /* Vnode of controlling terminal. */ + struct tty *s_ttyp; /* Controlling terminal. */ + char s_login[MAXLOGNAME]; /* Setlogin() name. */ +}; + +/* + * One structure allocated per process group. + */ +struct pgrp { + struct pgrp *pg_hforw; /* Forward link in hash bucket. */ + struct proc *pg_mem; /* Pointer to pgrp members. */ + struct session *pg_session; /* Pointer to session. */ + pid_t pg_id; /* Pgrp id. */ + int pg_jobc; /* # procs qualifying pgrp for job control */ +}; + +/* + * Description of a process. + * + * This structure contains the information needed to manage a thread of + * control, known in UN*X as a process; it has references to substructures + * containing descriptions of things that the process uses, but may share + * with related processes. The process structure and the substructures + * are always addressible except for those marked "(PROC ONLY)" below, + * which might be addressible only on a processor on which the process + * is running. + */ +struct proc { +#ifndef OSKIT + struct proc *p_forw; /* Doubly-linked run/sleep queue. */ + struct proc *p_back; + struct proc *p_next; /* Linked list of active procs */ + struct proc **p_prev; /* and zombies. */ + + /* substructures: */ + struct pcred *p_cred; /* Process owner's identity. */ + struct filedesc *p_fd; /* Ptr to open files structure. */ + struct pstats *p_stats; /* Accounting/statistics (PROC ONLY). */ + struct plimit *p_limit; /* Process limits. */ + struct vmspace *p_vmspace; /* Address space. */ + struct sigacts *p_sigacts; /* Signal actions, state (PROC ONLY). */ + +#define p_ucred p_cred->pc_ucred +#define p_rlimit p_limit->pl_rlimit + + int p_flag; /* P_* flags. */ + char p_stat; /* S* process status. */ + + char p_pad1[3]; + + pid_t p_pid; /* Process identifier. */ + struct proc *p_hash; /* Hashed based on p_pid for kill+exit+... */ + struct proc *p_pgrpnxt; /* Pointer to next process in process group. */ + struct proc *p_pptr; /* Pointer to process structure of parent. */ + struct proc *p_osptr; /* Pointer to older sibling processes. */ + +/* The following fields are all zeroed upon creation in fork. */ +#define p_startzero p_ysptr + struct proc *p_ysptr; /* Pointer to younger siblings. */ + struct proc *p_cptr; /* Pointer to youngest living child. */ + pid_t p_oppid; /* Save parent pid during ptrace. XXX */ + int p_dupfd; /* Sideways return value from fdopen. XXX */ + + /* scheduling */ + u_int p_estcpu; /* Time averaged value of p_cpticks. */ + int p_cpticks; /* Ticks of cpu time. */ + fixpt_t p_pctcpu; /* %cpu for this process during p_swtime */ + void *p_wchan; /* Sleep address. */ + char *p_wmesg; /* Reason for sleep. */ + u_int p_swtime; /* Time swapped in or out. */ + u_int p_slptime; /* Time since last blocked. */ + + struct itimerval p_realtimer; /* Alarm timer. */ + struct timeval p_rtime; /* Real time. */ + u_quad_t p_uticks; /* Statclock hits in user mode. */ + u_quad_t p_sticks; /* Statclock hits in system mode. */ + u_quad_t p_iticks; /* Statclock hits processing intr. */ + + int p_traceflag; /* Kernel trace points. */ + struct vnode *p_tracep; /* Trace to vnode. */ + + int p_siglist; /* Signals arrived but not delivered. */ + + struct vnode *p_textvp; /* Vnode of executable. */ + + char p_lock; /* Process lock count. */ + char p_pad2[3]; /* alignment */ + long p_spare[2]; /* Pad to 256, avoid shifting eproc. XXX */ + +/* End area that is zeroed on creation. */ +#define p_endzero p_startcopy + +/* The following fields are all copied upon creation in fork. */ +#define p_startcopy p_sigmask + + sigset_t p_sigmask; /* Current signal mask. */ + sigset_t p_sigignore; /* Signals being ignored. */ + sigset_t p_sigcatch; /* Signals being caught by user. */ + + u_char p_priority; /* Process priority. */ + u_char p_usrpri; /* User-priority based on p_cpu and p_nice. */ + char p_nice; /* Process "nice" value. */ + char p_comm[MAXCOMLEN+1]; + + struct pgrp *p_pgrp; /* Pointer to process group. */ + + struct sysentvec *p_sysent; /* System call dispatch information. */ + + struct rtprio p_rtprio; /* Realtime priority. */ +/* End area that is copied on creation. */ +#define p_endcopy p_thread + int p_thread; /* Id for this "thread"; Mach glue. XXX */ + struct user *p_addr; /* Kernel virtual addr of u-area (PROC ONLY). */ + struct mdproc p_md; /* Any machine-dependent fields. */ + + u_short p_xstat; /* Exit status for wait; also stop signal. */ + u_short p_acflag; /* Accounting flags. */ + struct rusage *p_ru; /* Exit information. XXX */ +#else /* OSKIT */ + /* + * let's build our own rudimentary struct proc + */ + struct proc *p_forw; /* Doubly-linked run/sleep queue. */ + struct pcred *p_cred; /* Process owner's identity. */ + struct pstats *p_stats; /* Accounting/statistics (PROC ONLY). */ +#define p_ucred p_cred->pc_ucred + int p_flag; /* P_* flags. */ + char p_stat; /* S* process status. */ + pid_t p_pid; /* Process identifier. */ + void *p_wchan; /* Sleep address. */ + char *p_wmesg; /* Reason for sleep. */ + u_short p_acflag; /* Accounting flags. */ + + osenv_sleeprec_t p_sr; + /* + * When selrecord is invoked, this points to an object used to + * manage a set of listeners + */ + struct listener_mgr *p_sel; +#endif /* !OSKIT */ +}; + +#define p_session p_pgrp->pg_session +#define p_pgid p_pgrp->pg_id + +/* Status values. */ +#define SIDL 1 /* Process being created by fork. */ +#define SRUN 2 /* Currently runnable. */ +#define SSLEEP 3 /* Sleeping on an address. */ +#define SSTOP 4 /* Process debugging or suspension. */ +#define SZOMB 5 /* Awaiting collection by parent. */ + +/* These flags are kept in p_flags. */ +#define P_ADVLOCK 0x00001 /* Process may hold a POSIX advisory lock. */ +#define P_CONTROLT 0x00002 /* Has a controlling terminal. */ +#define P_INMEM 0x00004 /* Loaded into memory. */ +#define P_NOCLDSTOP 0x00008 /* No SIGCHLD when children stop. */ +#define P_PPWAIT 0x00010 /* Parent is waiting for child to exec/exit. */ +#define P_PROFIL 0x00020 /* Has started profiling. */ +#define P_SELECT 0x00040 /* Selecting; wakeup/waiting danger. */ +#define P_SINTR 0x00080 /* Sleep is interruptible. */ +#define P_SUGID 0x00100 /* Had set id privileges since last exec. */ +#define P_SYSTEM 0x00200 /* System proc: no sigs, stats or swapping. */ +#define P_TIMEOUT 0x00400 /* Timing out during sleep. */ +#define P_TRACED 0x00800 /* Debugged process being traced. */ +#define P_WAITED 0x01000 /* Debugging process has waited for child. */ +#define P_WEXIT 0x02000 /* Working on exiting. */ +#define P_EXEC 0x04000 /* Process called exec. */ +#define P_SWAPPING 0x40000 /* Process is being swapped. */ + +/* Should probably be changed into a hold count (They have. -DG). */ +#define P_NOSWAP 0x08000 /* Another flag to prevent swap out. */ +#define P_PHYSIO 0x10000 /* Doing physical I/O. */ + +/* Should be moved to machine-dependent areas. */ +#define P_OWEUPC 0x20000 /* Owe process an addupc() call at next ast. */ + +/* + * MOVE TO ucred.h? + * + * Shareable process credentials (always resident). This includes a reference + * to the current user credentials as well as real and saved ids that may be + * used to change ids. + */ +struct pcred { + struct ucred *pc_ucred; /* Current credentials. */ + uid_t p_ruid; /* Real user id. */ + uid_t p_svuid; /* Saved effective user id. */ + gid_t p_rgid; /* Real group id. */ + gid_t p_svgid; /* Saved effective group id. */ + int p_refcnt; /* Number of references. */ +}; + +#ifdef KERNEL +/* + * We use process IDs <= PID_MAX; PID_MAX + 1 must also fit in a pid_t, + * as it is used to represent "no process group". + */ +#define PID_MAX 30000 +#define NO_PID 30001 +#define PIDHASH(pid) ((pid) & pidhashmask) + +#define SESS_LEADER(p) ((p)->p_session->s_leader == (p)) +#define SESSHOLD(s) ((s)->s_count++) +#define SESSRELE(s) { \ + if (--(s)->s_count == 0) \ + FREE(s, M_SESSION); \ +} + +extern struct proc *pidhash[]; /* In param.c. */ +extern struct pgrp *pgrphash[]; /* In param.c. */ +extern struct proc *curproc; /* Current running proc. */ +extern struct proc proc0; /* Process slot for swapper. */ +extern int nprocs, maxproc; /* Current and max number of procs. */ +extern int maxprocperuid; /* Max procs per uid. */ +extern int pidhashmask; /* In param.c. */ + +extern volatile struct proc *allproc; /* List of active procs. */ +extern struct proc *zombproc; /* List of zombie procs. */ +extern struct proc *initproc, *pageproc; /* Process slots for init, pager. */ + +#define NQS 32 /* 32 run queues. */ +extern struct prochd qs[]; +extern struct prochd rtqs[]; +extern struct prochd idqs[]; +extern int whichqs; /* Bit mask summary of non-empty Q's. */ +struct prochd { + struct proc *ph_link; /* Linked list of running processes. */ + struct proc *ph_rlink; +}; + +int chgproccnt __P((uid_t, int)); +struct proc *pfind __P((pid_t)); /* Find process by id. */ +struct proc *zpfind __P((pid_t)); /* Find zombie process by id. */ +struct pgrp *pgfind __P((pid_t)); /* Find process group by id. */ +void mi_switch __P((void)); +void resetpriority __P((struct proc *)); +void roundrobin __P((void *)); +void schedcpu __P((void *)); +void setrunnable __P((struct proc *)); +void setrunqueue __P((struct proc *)); +void remrq __P((struct proc *)); +void cpu_switch __P((struct proc *)); +void sleep __P((void *chan, int pri)); +int tsleep __P((void *chan, int pri, char *wmesg, int timo)); +void unsleep __P((struct proc *)); +void wakeup __P((void *chan)); + +__dead void cpu_exit __P((struct proc *)) __dead2; +__dead void exit1 __P((struct proc *, int)) __dead2; +void fixjobc __P((struct proc *, struct pgrp *, int)); +int acct_process __P((struct proc *)); +int leavepgrp __P((struct proc *)); +int enterpgrp __P((struct proc *, pid_t, int)); +int trace_req __P((struct proc *)); +void cpu_wait __P((struct proc *)); +int cpu_coredump __P((struct proc *, struct vnode *, struct ucred *)); +int inferior __P((struct proc *)); +#endif /* KERNEL */ + +#endif /* !_SYS_PROC_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/protosw.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/protosw.h new file mode 100644 index 00000000000..8d5e161e5a3 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/protosw.h @@ -0,0 +1,221 @@ +/*- + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)protosw.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _SYS_PROTOSW_H_ +#define _SYS_PROTOSW_H_ + +/* + * Protocol switch table. + * + * Each protocol has a handle initializing one of these structures, + * which is used for protocol-protocol and system-protocol communication. + * + * A protocol is called through the pr_init entry before any other. + * Thereafter it is called every 200ms through the pr_fasttimo entry and + * every 500ms through the pr_slowtimo for timer based actions. + * The system will call the pr_drain entry if it is low on space and + * this should throw away any non-critical data. + * + * Protocols pass data between themselves as chains of mbufs using + * the pr_input and pr_output hooks. Pr_input passes data up (towards + * UNIX) and pr_output passes it down (towards the imps); control + * information passes up and down on pr_ctlinput and pr_ctloutput. + * The protocol is responsible for the space occupied by any the + * arguments to these entries and must dispose it. + * + * The userreq routine interfaces protocols to the system and is + * described below. + */ +struct protosw { + short pr_type; /* socket type used for */ + struct domain *pr_domain; /* domain protocol a member of */ + short pr_protocol; /* protocol number */ + short pr_flags; /* see below */ +/* protocol-protocol hooks */ + void (*pr_input)(); /* input to protocol (from below) */ + int (*pr_output)(); /* output to protocol (from above) */ + void (*pr_ctlinput)(); /* control input (from below) */ + int (*pr_ctloutput)(); /* control output (from above) */ +/* user-protocol hook */ + int (*pr_usrreq)(); /* user request: see list below */ +/* utility hooks */ + void (*pr_init)(); /* initialization hook */ + void (*pr_fasttimo)(); /* fast timeout (200ms) */ + void (*pr_slowtimo)(); /* slow timeout (500ms) */ + void (*pr_drain)(); /* flush any excess space possible */ + int (*pr_sysctl)(); /* sysctl for protocol */ +}; + +#define PR_SLOWHZ 2 /* 2 slow timeouts per second */ +#define PR_FASTHZ 5 /* 5 fast timeouts per second */ + +/* + * Values for pr_flags. + * PR_ADDR requires PR_ATOMIC; + * PR_ADDR and PR_CONNREQUIRED are mutually exclusive. + * PR_IMPLOPCL means that the protocol allows sendto without prior connect, + * and the protocol understands the MSG_EOF flag. The first property is + * is only relevant if PR_CONNREQUIRED is set (otherwise sendto is allowed + * anyhow). + */ +#define PR_ATOMIC 0x01 /* exchange atomic messages only */ +#define PR_ADDR 0x02 /* addresses given with messages */ +#define PR_CONNREQUIRED 0x04 /* connection required by protocol */ +#define PR_WANTRCVD 0x08 /* want PRU_RCVD calls */ +#define PR_RIGHTS 0x10 /* passes capabilities */ +#define PR_IMPLOPCL 0x20 /* implied open/close */ + +/* + * The arguments to usrreq are: + * (*protosw[].pr_usrreq)(up, req, m, nam, opt); + * where up is a (struct socket *), req is one of these requests, + * m is a optional mbuf chain containing a message, + * nam is an optional mbuf chain containing an address, + * and opt is a pointer to a socketopt structure or nil. + * The protocol is responsible for disposal of the mbuf chain m, + * the caller is responsible for any space held by nam and opt. + * A non-zero return from usrreq gives an + * UNIX error number which should be passed to higher level software. + */ +#define PRU_ATTACH 0 /* attach protocol to up */ +#define PRU_DETACH 1 /* detach protocol from up */ +#define PRU_BIND 2 /* bind socket to address */ +#define PRU_LISTEN 3 /* listen for connection */ +#define PRU_CONNECT 4 /* establish connection to peer */ +#define PRU_ACCEPT 5 /* accept connection from peer */ +#define PRU_DISCONNECT 6 /* disconnect from peer */ +#define PRU_SHUTDOWN 7 /* won't send any more data */ +#define PRU_RCVD 8 /* have taken data; more room now */ +#define PRU_SEND 9 /* send this data */ +#define PRU_ABORT 10 /* abort (fast DISCONNECT, DETATCH) */ +#define PRU_CONTROL 11 /* control operations on protocol */ +#define PRU_SENSE 12 /* return status into m */ +#define PRU_RCVOOB 13 /* retrieve out of band data */ +#define PRU_SENDOOB 14 /* send out of band data */ +#define PRU_SOCKADDR 15 /* fetch socket's address */ +#define PRU_PEERADDR 16 /* fetch peer's address */ +#define PRU_CONNECT2 17 /* connect two sockets */ +/* begin for protocols internal use */ +#define PRU_FASTTIMO 18 /* 200ms timeout */ +#define PRU_SLOWTIMO 19 /* 500ms timeout */ +#define PRU_PROTORCV 20 /* receive from below */ +#define PRU_PROTOSEND 21 /* send to below */ +#define PRU_SEND_EOF 22 /* send and close */ +#define PRU_NREQ 22 + +#ifdef PRUREQUESTS +char *prurequests[] = { + "ATTACH", "DETACH", "BIND", "LISTEN", + "CONNECT", "ACCEPT", "DISCONNECT", "SHUTDOWN", + "RCVD", "SEND", "ABORT", "CONTROL", + "SENSE", "RCVOOB", "SENDOOB", "SOCKADDR", + "PEERADDR", "CONNECT2", "FASTTIMO", "SLOWTIMO", + "PROTORCV", "PROTOSEND", + "SEND_EOF", +}; +#endif + +/* + * The arguments to the ctlinput routine are + * (*protosw[].pr_ctlinput)(cmd, sa, arg); + * where cmd is one of the commands below, sa is a pointer to a sockaddr, + * and arg is an optional caddr_t argument used within a protocol family. + */ +#define PRC_IFDOWN 0 /* interface transition */ +#define PRC_ROUTEDEAD 1 /* select new route if possible ??? */ +#define PRC_QUENCH2 3 /* DEC congestion bit says slow down */ +#define PRC_QUENCH 4 /* some one said to slow down */ +#define PRC_MSGSIZE 5 /* message size forced drop */ +#define PRC_HOSTDEAD 6 /* host appears to be down */ +#define PRC_HOSTUNREACH 7 /* deprecated (use PRC_UNREACH_HOST) */ +#define PRC_UNREACH_NET 8 /* no route to network */ +#define PRC_UNREACH_HOST 9 /* no route to host */ +#define PRC_UNREACH_PROTOCOL 10 /* dst says bad protocol */ +#define PRC_UNREACH_PORT 11 /* bad port # */ +/* was PRC_UNREACH_NEEDFRAG 12 (use PRC_MSGSIZE) */ +#define PRC_UNREACH_SRCFAIL 13 /* source route failed */ +#define PRC_REDIRECT_NET 14 /* net routing redirect */ +#define PRC_REDIRECT_HOST 15 /* host routing redirect */ +#define PRC_REDIRECT_TOSNET 16 /* redirect for type of service & net */ +#define PRC_REDIRECT_TOSHOST 17 /* redirect for tos & host */ +#define PRC_TIMXCEED_INTRANS 18 /* packet lifetime expired in transit */ +#define PRC_TIMXCEED_REASS 19 /* lifetime expired on reass q */ +#define PRC_PARAMPROB 20 /* header incorrect */ + +#define PRC_NCMDS 21 + +#define PRC_IS_REDIRECT(cmd) \ + ((cmd) >= PRC_REDIRECT_NET && (cmd) <= PRC_REDIRECT_TOSHOST) + +#ifdef PRCREQUESTS +char *prcrequests[] = { + "IFDOWN", "ROUTEDEAD", "#2", "DEC-BIT-QUENCH2", + "QUENCH", "MSGSIZE", "HOSTDEAD", "#7", + "NET-UNREACH", "HOST-UNREACH", "PROTO-UNREACH", "PORT-UNREACH", + "#12", "SRCFAIL-UNREACH", "NET-REDIRECT", "HOST-REDIRECT", + "TOSNET-REDIRECT", "TOSHOST-REDIRECT", "TX-INTRANS", "TX-REASS", + "PARAMPROB" +}; +#endif + +/* + * The arguments to ctloutput are: + * (*protosw[].pr_ctloutput)(req, so, level, optname, optval); + * req is one of the actions listed below, so is a (struct socket *), + * level is an indication of which protocol layer the option is intended. + * optname is a protocol dependent socket option request, + * optval is a pointer to a mbuf-chain pointer, for value-return results. + * The protocol is responsible for disposal of the mbuf chain *optval + * if supplied, + * the caller is responsible for any space held by *optval, when returned. + * A non-zero return from usrreq gives an + * UNIX error number which should be passed to higher level software. + */ +#define PRCO_GETOPT 0 +#define PRCO_SETOPT 1 + +#define PRCO_NCMDS 2 + +#ifdef PRCOREQUESTS +char *prcorequests[] = { + "GETOPT", "SETOPT", +}; +#endif + +#ifdef KERNEL +extern struct protosw *pffindproto(), *pffindtype(); +#endif + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/queue.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/queue.h new file mode 100644 index 00000000000..fee9536f9e6 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/queue.h @@ -0,0 +1,391 @@ +/* + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)queue.h 8.5 (Berkeley) 8/20/94 + */ + +#ifndef _SYS_QUEUE_H_ +#define _SYS_QUEUE_H_ + +/* + * This file defines five types of data structures: singly-linked lists, + * slingly-linked tail queues, lists, tail queues, and circular queues. + * + * A singly-linked list is headed by a single forward pointer. The elements + * are singly linked for minimum space and pointer manipulation overhead at + * the expense of O(n) removal for arbitrary elements. New elements can be + * added to the list after an existing element or at the head of the list. + * Elements being removed from the head of the list should use the explicit + * macro for this purpose for optimum efficiency. A singly-linked list may + * only be traversed in the forward direction. Singly-linked lists are ideal + * for applications with large datasets and few or no removals or for + * implementing a LIFO queue. + * + * A singly-linked tail queue is headed by a pair of pointers, one to the + * head of the list and the other to the tail of the list. The elements are + * singly linked for minimum space and pointer manipulation overhead at the + * expense of O(n) removal for arbitrary elements. New elements can be added + * to the list after an existing element, at the head of the list, or at the + * end of the list. Elements being removed from the head of the tail queue + * should use the explicit macro for this purpose for optimum efficiency. + * A singly-linked tail queue may only be traversed in the forward direction. + * Singly-linked tail queues are ideal for applications with large datasets + * and few or no removals or for implementing a FIFO queue. + * + * A list is headed by a single forward pointer (or an array of forward + * pointers for a hash table header). The elements are doubly linked + * so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before + * or after an existing element or at the head of the list. A list + * may only be traversed in the forward direction. + * + * A tail queue is headed by a pair of pointers, one to the head of the + * list and the other to the tail of the list. The elements are doubly + * linked so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before or + * after an existing element, at the head of the list, or at the end of + * the list. A tail queue may only be traversed in the forward direction. + * + * A circle queue is headed by a pair of pointers, one to the head of the + * list and the other to the tail of the list. The elements are doubly + * linked so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before or after + * an existing element, at the head of the list, or at the end of the list. + * A circle queue may be traversed in either direction, but has a more + * complex end of list detection. + * + * For details on the use of these macros, see the queue(3) manual page. + */ + +#undef SLIST_HEAD +#undef SLIST_ENTRY +#undef SLIST_INIT + +/* + * Singly-linked List definitions. + */ +#define SLIST_HEAD(name, type) \ +struct name { \ + struct type *slh_first; /* first element */ \ +} + +#define SLIST_ENTRY(type) \ +struct { \ + struct type *sle_next; /* next element */ \ +} + +/* + * Singly-linked List functions. + */ +#define SLIST_INIT(head) { \ + (head)->slh_first = NULL; \ +} + +#define SLIST_INSERT_AFTER(slistelm, elm, field) { \ + (elm)->field.sle_next = (slistelm)->field.sle_next; \ + (slistelm)->field.sle_next = (elm); \ +} + +#define SLIST_INSERT_HEAD(head, elm, field) { \ + (elm)->field.sle_next = (head)->slh_first; \ + (head)->slh_first = (elm); \ +} + +#define SLIST_REMOVE_HEAD(head, field) { \ + (head)->slh_first = (head)->slh_first->field.sle_next; \ +} + +#define SLIST_REMOVE(head, elm, type, field) { \ + if ((head)->slh_first == (elm)) { \ + SLIST_REMOVE_HEAD((head), field); \ + } \ + else { \ + struct type *curelm = (head)->slh_first; \ + while( curelm->field.sle_next != (elm) ) \ + curelm = curelm->field.sle_next; \ + curelm->field.sle_next = \ + curelm->field.sle_next->field.sle_next; \ + } \ +} + +/* + * Singly-linked Tail queue definitions. + */ +#define STAILQ_HEAD(name, type) \ +struct name { \ + struct type *stqh_first;/* first element */ \ + struct type **stqh_last;/* addr of last next element */ \ +} + +#define STAILQ_ENTRY(type) \ +struct { \ + struct type *stqe_next; /* next element */ \ +} + +/* + * Singly-linked Tail queue functions. + */ +#define STAILQ_INIT(head) { \ + (head)->stqh_first = NULL; \ + (head)->stqh_last = &(head)->stqh_first; \ +} + +#define STAILQ_INSERT_HEAD(head, elm, field) { \ + if (((elm)->field.stqe_next = (head)->stqh_first) == NULL) \ + (head)->stqh_last = &(elm)->field.stqe_next; \ + (head)->stqh_first = (elm); \ +} + +#define STAILQ_INSERT_TAIL(head, elm, field) { \ + (elm)->field.stqe_next = NULL; \ + *(head)->stqh_last = (elm); \ + (head)->stqh_last = &(elm)->field.stqe_next; \ +} + +#define STAILQ_INSERT_AFTER(head, tqelm, elm, field) { \ + if (((elm)->field.stqe_next = (tqelm)->field.stqe_next) == NULL)\ + (head)->stqh_last = &(elm)->field.stqe_next; \ + (tqelm)->field.stqe_next = (elm); \ +} + +#define STAILQ_REMOVE_HEAD(head, field) { \ + if (((head)->stqh_first = \ + (head)->stqh_first->field.stqe_next) == NULL) \ + (head)->stqh_last = &(head)->stqh_first; \ +} + +#define STAILQ_REMOVE(head, elm, type, field) { \ + if ((head)->stqh_first == (elm)) { \ + STAILQ_REMOVE_HEAD(head, field); \ + } \ + else { \ + struct type *curelm = (head)->stqh_first; \ + while( curelm->field.stqe_next != (elm) ) \ + curelm = curelm->field.stqe_next; \ + if((curelm->field.stqe_next = \ + curelm->field.stqe_next->field.stqe_next) == NULL) \ + (head)->stqh_last = &(curelm)->field.stqe_next; \ + } \ +} + +/* + * List definitions. + */ +#define LIST_HEAD(name, type) \ +struct name { \ + struct type *lh_first; /* first element */ \ +} + +#define LIST_ENTRY(type) \ +struct { \ + struct type *le_next; /* next element */ \ + struct type **le_prev; /* address of previous next element */ \ +} + +/* + * List functions. + */ +#define LIST_INIT(head) { \ + (head)->lh_first = NULL; \ +} + +#define LIST_INSERT_AFTER(listelm, elm, field) { \ + if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \ + (listelm)->field.le_next->field.le_prev = \ + &(elm)->field.le_next; \ + (listelm)->field.le_next = (elm); \ + (elm)->field.le_prev = &(listelm)->field.le_next; \ +} + +#define LIST_INSERT_BEFORE(listelm, elm, field) { \ + (elm)->field.le_prev = (listelm)->field.le_prev; \ + (elm)->field.le_next = (listelm); \ + *(listelm)->field.le_prev = (elm); \ + (listelm)->field.le_prev = &(elm)->field.le_next; \ +} + +#define LIST_INSERT_HEAD(head, elm, field) { \ + if (((elm)->field.le_next = (head)->lh_first) != NULL) \ + (head)->lh_first->field.le_prev = &(elm)->field.le_next;\ + (head)->lh_first = (elm); \ + (elm)->field.le_prev = &(head)->lh_first; \ +} + +#define LIST_REMOVE(elm, field) { \ + if ((elm)->field.le_next != NULL) \ + (elm)->field.le_next->field.le_prev = \ + (elm)->field.le_prev; \ + *(elm)->field.le_prev = (elm)->field.le_next; \ +} + +/* + * Tail queue definitions. + */ +#define TAILQ_HEAD(name, type) \ +struct name { \ + struct type *tqh_first; /* first element */ \ + struct type **tqh_last; /* addr of last next element */ \ +} + +#define TAILQ_ENTRY(type) \ +struct { \ + struct type *tqe_next; /* next element */ \ + struct type **tqe_prev; /* address of previous next element */ \ +} + +/* + * Tail queue functions. + */ +#define TAILQ_INIT(head) { \ + (head)->tqh_first = NULL; \ + (head)->tqh_last = &(head)->tqh_first; \ +} + +#define TAILQ_INSERT_HEAD(head, elm, field) { \ + if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \ + (head)->tqh_first->field.tqe_prev = \ + &(elm)->field.tqe_next; \ + else \ + (head)->tqh_last = &(elm)->field.tqe_next; \ + (head)->tqh_first = (elm); \ + (elm)->field.tqe_prev = &(head)->tqh_first; \ +} + +#define TAILQ_INSERT_TAIL(head, elm, field) { \ + (elm)->field.tqe_next = NULL; \ + (elm)->field.tqe_prev = (head)->tqh_last; \ + *(head)->tqh_last = (elm); \ + (head)->tqh_last = &(elm)->field.tqe_next; \ +} + +#define TAILQ_INSERT_AFTER(head, listelm, elm, field) { \ + if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\ + (elm)->field.tqe_next->field.tqe_prev = \ + &(elm)->field.tqe_next; \ + else \ + (head)->tqh_last = &(elm)->field.tqe_next; \ + (listelm)->field.tqe_next = (elm); \ + (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ +} + +#define TAILQ_INSERT_BEFORE(listelm, elm, field) { \ + (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ + (elm)->field.tqe_next = (listelm); \ + *(listelm)->field.tqe_prev = (elm); \ + (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ +} + +#define TAILQ_REMOVE(head, elm, field) { \ + if (((elm)->field.tqe_next) != NULL) \ + (elm)->field.tqe_next->field.tqe_prev = \ + (elm)->field.tqe_prev; \ + else \ + (head)->tqh_last = (elm)->field.tqe_prev; \ + *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ +} + +/* + * Circular queue definitions. + */ +#define CIRCLEQ_HEAD(name, type) \ +struct name { \ + struct type *cqh_first; /* first element */ \ + struct type *cqh_last; /* last element */ \ +} + +#define CIRCLEQ_ENTRY(type) \ +struct { \ + struct type *cqe_next; /* next element */ \ + struct type *cqe_prev; /* previous element */ \ +} + +/* + * Circular queue functions. + */ +#define CIRCLEQ_INIT(head) { \ + (head)->cqh_first = (void *)(head); \ + (head)->cqh_last = (void *)(head); \ +} + +#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) { \ + (elm)->field.cqe_next = (listelm)->field.cqe_next; \ + (elm)->field.cqe_prev = (listelm); \ + if ((listelm)->field.cqe_next == (void *)(head)) \ + (head)->cqh_last = (elm); \ + else \ + (listelm)->field.cqe_next->field.cqe_prev = (elm); \ + (listelm)->field.cqe_next = (elm); \ +} + +#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) { \ + (elm)->field.cqe_next = (listelm); \ + (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \ + if ((listelm)->field.cqe_prev == (void *)(head)) \ + (head)->cqh_first = (elm); \ + else \ + (listelm)->field.cqe_prev->field.cqe_next = (elm); \ + (listelm)->field.cqe_prev = (elm); \ +} + +#define CIRCLEQ_INSERT_HEAD(head, elm, field) { \ + (elm)->field.cqe_next = (head)->cqh_first; \ + (elm)->field.cqe_prev = (void *)(head); \ + if ((head)->cqh_last == (void *)(head)) \ + (head)->cqh_last = (elm); \ + else \ + (head)->cqh_first->field.cqe_prev = (elm); \ + (head)->cqh_first = (elm); \ +} + +#define CIRCLEQ_INSERT_TAIL(head, elm, field) { \ + (elm)->field.cqe_next = (void *)(head); \ + (elm)->field.cqe_prev = (head)->cqh_last; \ + if ((head)->cqh_first == (void *)(head)) \ + (head)->cqh_first = (elm); \ + else \ + (head)->cqh_last->field.cqe_next = (elm); \ + (head)->cqh_last = (elm); \ +} + +#define CIRCLEQ_REMOVE(head, elm, field) { \ + if ((elm)->field.cqe_next == (void *)(head)) \ + (head)->cqh_last = (elm)->field.cqe_prev; \ + else \ + (elm)->field.cqe_next->field.cqe_prev = \ + (elm)->field.cqe_prev; \ + if ((elm)->field.cqe_prev == (void *)(head)) \ + (head)->cqh_first = (elm)->field.cqe_next; \ + else \ + (elm)->field.cqe_prev->field.cqe_next = \ + (elm)->field.cqe_next; \ +} +#endif /* !_SYS_QUEUE_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/resource.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/resource.h new file mode 100644 index 00000000000..cff763c56e5 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/resource.h @@ -0,0 +1,127 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)resource.h 8.2 (Berkeley) 1/4/94 + */ + +#ifndef _SYS_RESOURCE_H_ +#define _SYS_RESOURCE_H_ + +/* + * Process priority specifications to get/setpriority. + */ +#define PRIO_MIN -20 +#define PRIO_MAX 20 + +#define PRIO_PROCESS 0 +#define PRIO_PGRP 1 +#define PRIO_USER 2 + +/* + * Resource utilization information. + */ + +#define RUSAGE_SELF 0 +#define RUSAGE_CHILDREN -1 + +struct rusage { + struct timeval ru_utime; /* user time used */ + struct timeval ru_stime; /* system time used */ + long ru_maxrss; /* max resident set size */ +#define ru_first ru_ixrss + long ru_ixrss; /* integral shared memory size */ + long ru_idrss; /* integral unshared data " */ + long ru_isrss; /* integral unshared stack " */ + long ru_minflt; /* page reclaims */ + long ru_majflt; /* page faults */ + long ru_nswap; /* swaps */ + long ru_inblock; /* block input operations */ + long ru_oublock; /* block output operations */ + long ru_msgsnd; /* messages sent */ + long ru_msgrcv; /* messages received */ + long ru_nsignals; /* signals received */ + long ru_nvcsw; /* voluntary context switches */ + long ru_nivcsw; /* involuntary " */ +#define ru_last ru_nivcsw +}; + +/* + * Resource limits + */ +#define RLIMIT_CPU 0 /* cpu time in milliseconds */ +#define RLIMIT_FSIZE 1 /* maximum file size */ +#define RLIMIT_DATA 2 /* data size */ +#define RLIMIT_STACK 3 /* stack size */ +#define RLIMIT_CORE 4 /* core file size */ +#define RLIMIT_RSS 5 /* resident set size */ +#define RLIMIT_MEMLOCK 6 /* locked-in-memory address space */ +#define RLIMIT_NPROC 7 /* number of processes */ +#define RLIMIT_NOFILE 8 /* number of open files */ + +#define RLIM_NLIMITS 9 /* number of resource limits */ + +#include <sys/types.h> /* XXX for quad_t */ + +#define RLIM_INFINITY (((u_quad_t)1 << 63) - 1) + +struct orlimit { + long rlim_cur; /* current (soft) limit */ + long rlim_max; /* maximum value for rlim_cur */ +}; + +struct rlimit { + quad_t rlim_cur; /* current (soft) limit */ + quad_t rlim_max; /* maximum value for rlim_cur */ +}; + +/* Load average structure. */ +struct loadavg { + fixpt_t ldavg[3]; + long fscale; +}; + +#ifdef KERNEL +extern struct loadavg averunnable; + +#else +#include <sys/cdefs.h> + +__BEGIN_DECLS +int getpriority __P((int, int)); +int getrlimit __P((int, struct rlimit *)); +int getrusage __P((int, struct rusage *)); +int setpriority __P((int, int, int)); +int setrlimit __P((int, const struct rlimit *)); +__END_DECLS + +#endif /* KERNEL */ +#endif /* !_SYS_RESOURCE_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/resourcevar.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/resourcevar.h new file mode 100644 index 00000000000..1dd0dc55418 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/resourcevar.h @@ -0,0 +1,97 @@ +/* + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)resourcevar.h 8.3 (Berkeley) 2/22/94 + */ + +#ifndef _SYS_RESOURCEVAR_H_ +#define _SYS_RESOURCEVAR_H_ + +/* + * Kernel per-process accounting / statistics + * (not necessarily resident except when running). + */ +struct pstats { +#define pstat_startzero p_ru + struct rusage p_ru; /* stats for this proc */ + struct rusage p_cru; /* sum of stats for reaped children */ +#define pstat_endzero pstat_startcopy + +#define pstat_startcopy p_timer + struct itimerval p_timer[3]; /* virtual-time timers */ + + struct uprof { /* profile arguments */ + caddr_t pr_base; /* buffer base */ + u_long pr_size; /* buffer size */ + u_long pr_off; /* pc offset */ + u_long pr_scale; /* pc scaling */ + u_long pr_addr; /* temp storage for addr until AST */ + u_long pr_ticks; /* temp storage for ticks until AST */ + } p_prof; +#define pstat_endcopy p_start + struct timeval p_start; /* starting time */ +}; + +/* + * Kernel shareable process resource limits. Because this structure + * is moderately large but changes infrequently, it is normally + * shared copy-on-write after forks. If a group of processes + * ("threads") share modifications, the PL_SHAREMOD flag is set, + * and a copy must be made for the child of a new fork that isn't + * sharing modifications to the limits. + */ +struct plimit { + struct rlimit pl_rlimit[RLIM_NLIMITS]; +#define PL_SHAREMOD 0x01 /* modifications are shared */ + int p_lflags; + int p_refcnt; /* number of references */ +}; + +/* add user profiling from AST */ +#define ADDUPROF(p) \ + addupc_task(p, \ + (p)->p_stats->p_prof.pr_addr, (p)->p_stats->p_prof.pr_ticks) + +#ifdef KERNEL +int addupc __P((int pc, struct uprof *up, int ticks)); +void addupc_intr __P((struct proc *p, u_long pc, u_int ticks)); +void addupc_task __P((struct proc *p, u_long pc, u_int ticks)); +void calcru __P((struct proc *p, struct timeval *up, struct timeval *sp, + struct timeval *ip)); +int fuswintr __P((void *base)); +struct plimit + *limcopy __P((struct plimit *lim)); +void ruadd __P((struct rusage *ru, struct rusage *ru2)); +int suswintr __P((void *base, int word)); +#endif + +#endif /* !_SYS_RESOURCEVAR_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/rtprio.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/rtprio.h new file mode 100644 index 00000000000..9719930d324 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/rtprio.h @@ -0,0 +1,69 @@ +/* + * Copyright (c) 1994, Henrik Vestergaard Draboel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by (name). + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +#ifndef _SYS_RTPRIO_H_ +#define _SYS_RTPRIO_H_ + +/* + * Process realtime-priority specifications to rtprio. + */ + +/* priority types */ +#define RTP_PRIO_REALTIME 0 +#define RTP_PRIO_NORMAL 1 +#define RTP_PRIO_IDLE 2 + +/* priority range */ +#define RTP_PRIO_MIN 0 /* Highest priority */ +#define RTP_PRIO_MAX 31 /* Lowest priority */ + +/* + * rtprio() syscall functions + */ +#define RTP_LOOKUP 0 +#define RTP_SET 1 + +#ifndef LOCORE +struct rtprio { + u_short type; + u_short prio; +}; +#endif + +#ifndef KERNEL +#include <sys/cdefs.h> + +__BEGIN_DECLS +int rtprio __P((int, pid_t, struct rtprio *)); +__END_DECLS +#endif /* !KERNEL */ +#endif /* !_SYS_RTPRIO_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/select.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/select.h new file mode 100644 index 00000000000..bbb19ffd9a7 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/select.h @@ -0,0 +1,63 @@ +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)select.h 8.2 (Berkeley) 1/4/94 + */ + +#ifndef _SYS_SELECT_H_ +#define _SYS_SELECT_H_ + +#if defined(OSKIT) +struct listener_mgr; +#endif + +/* + * Used to maintain information about processes that wish to be + * notified when I/O becomes possible. + */ +struct selinfo { +#if defined(OSKIT) + struct listener_mgr *si_sel; +#endif /* OSKIT */ + pid_t si_pid; /* process to be notified */ + short si_flags; /* see below */ +}; +#define SI_COLL 0x0001 /* collision occurred */ + +#ifdef KERNEL +struct proc; + +void selrecord __P((struct proc *selector, struct selinfo *)); +void selwakeup __P((struct selinfo *)); +#endif + +#endif /* !_SYS_SELECT_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/signal.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/signal.h new file mode 100644 index 00000000000..ad025895730 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/signal.h @@ -0,0 +1,194 @@ +/* + * Copyright (c) 1982, 1986, 1989, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)signal.h 8.2 (Berkeley) 1/21/94 + */ + +#ifndef _SYS_SIGNAL_H_ +#define _SYS_SIGNAL_H_ + +#define NSIG 32 /* counting 0; could be 33 (mask is 1-32) */ + +#ifndef _ANSI_SOURCE +#include <machine/signal.h> /* sigcontext; codes for SIGILL, SIGFPE */ +#endif + +#define SIGHUP 1 /* hangup */ +#define SIGINT 2 /* interrupt */ +#define SIGQUIT 3 /* quit */ +#define SIGILL 4 /* illegal instruction (not reset when caught) */ +#ifndef _POSIX_SOURCE +#define SIGTRAP 5 /* trace trap (not reset when caught) */ +#endif +#define SIGABRT 6 /* abort() */ +#ifndef _POSIX_SOURCE +#define SIGIOT SIGABRT /* compatibility */ +#define SIGEMT 7 /* EMT instruction */ +#endif +#define SIGFPE 8 /* floating point exception */ +#define SIGKILL 9 /* kill (cannot be caught or ignored) */ +#ifndef _POSIX_SOURCE +#define SIGBUS 10 /* bus error */ +#endif +#define SIGSEGV 11 /* segmentation violation */ +#ifndef _POSIX_SOURCE +#define SIGSYS 12 /* bad argument to system call */ +#endif +#define SIGPIPE 13 /* write on a pipe with no one to read it */ +#define SIGALRM 14 /* alarm clock */ +#define SIGTERM 15 /* software termination signal from kill */ +#ifndef _POSIX_SOURCE +#define SIGURG 16 /* urgent condition on IO channel */ +#endif +#define SIGSTOP 17 /* sendable stop signal not from tty */ +#define SIGTSTP 18 /* stop signal from tty */ +#define SIGCONT 19 /* continue a stopped process */ +#define SIGCHLD 20 /* to parent on child stop or exit */ +#define SIGTTIN 21 /* to readers pgrp upon background tty read */ +#define SIGTTOU 22 /* like TTIN for output if (tp->t_local<OSTOP) */ +#ifndef _POSIX_SOURCE +#define SIGIO 23 /* input/output possible signal */ +#define SIGXCPU 24 /* exceeded CPU time limit */ +#define SIGXFSZ 25 /* exceeded file size limit */ +#define SIGVTALRM 26 /* virtual time alarm */ +#define SIGPROF 27 /* profiling time alarm */ +#define SIGWINCH 28 /* window size changes */ +#define SIGINFO 29 /* information request */ +#endif +#define SIGUSR1 30 /* user defined signal 1 */ +#define SIGUSR2 31 /* user defined signal 2 */ + +#if defined(_ANSI_SOURCE) || defined(__cplusplus) +/* + * Language spec sez we must list exactly one parameter, even though we + * actually supply three. Ugh! + */ +#define SIG_DFL (void (*)(int))0 +#define SIG_IGN (void (*)(int))1 +#define SIG_ERR (void (*)(int))-1 +#else +#define SIG_DFL (void (*)())0 +#define SIG_IGN (void (*)())1 +#define SIG_ERR (void (*)())-1 +#endif + +#ifndef _ANSI_SOURCE +typedef unsigned int sigset_t; + +/* + * Signal vector "template" used in sigaction call. + */ +struct sigaction { + void (*sa_handler)(); /* signal handler */ + sigset_t sa_mask; /* signal mask to apply */ + int sa_flags; /* see signal options below */ +}; +#ifndef _POSIX_SOURCE +#define SA_ONSTACK 0x0001 /* take signal on signal stack */ +#define SA_RESTART 0x0002 /* restart system on signal return */ +#define SA_DISABLE 0x0004 /* disable taking signals on alternate stack */ +#ifdef COMPAT_SUNOS +#define SA_USERTRAMP 0x0100 /* do not bounce off kernel's sigtramp */ +#endif +#endif +#define SA_NOCLDSTOP 0x0008 /* do not generate SIGCHLD on child stop */ + +/* + * Flags for sigprocmask: + */ +#define SIG_BLOCK 1 /* block specified signal set */ +#define SIG_UNBLOCK 2 /* unblock specified signal set */ +#define SIG_SETMASK 3 /* set specified signal set */ + +#ifndef _POSIX_SOURCE +#ifndef KERNEL +#include <sys/cdefs.h> +#endif +typedef void (*sig_t) __P((int)); /* type of signal function */ + +/* + * Structure used in sigaltstack call. + */ +struct sigaltstack { + char *ss_sp; /* signal stack base */ + int ss_size; /* signal stack length */ + int ss_flags; /* SA_DISABLE and/or SA_ONSTACK */ +}; +#define MINSIGSTKSZ 8192 /* minimum allowable stack */ +#define SIGSTKSZ (MINSIGSTKSZ + 32768) /* recommended stack size */ + +/* + * 4.3 compatibility: + * Signal vector "template" used in sigvec call. + */ +struct sigvec { + void (*sv_handler)(); /* signal handler */ + int sv_mask; /* signal mask to apply */ + int sv_flags; /* see signal options below */ +}; + +#define SV_ONSTACK SA_ONSTACK +#define SV_INTERRUPT SA_RESTART /* same bit, opposite sense */ +#define sv_onstack sv_flags /* isn't compatibility wonderful! */ + +/* + * Structure used in sigstack call. + */ +struct sigstack { + char *ss_sp; /* signal stack pointer */ + int ss_onstack; /* current status */ +}; + +/* + * Macro for converting signal number to a mask suitable for + * sigblock(). + */ +#define sigmask(m) (1 << ((m)-1)) + +#define BADSIG SIG_ERR + +#endif /* !_POSIX_SOURCE */ +#endif /* !_ANSI_SOURCE */ + +/* + * For historical reasons; programs expect signal's return value to be + * defined by <sys/signal.h>. + */ +__BEGIN_DECLS +void (*signal __P((int, void (*) __P((int))))) __P((int)); +__END_DECLS +#endif /* !_SYS_SIGNAL_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/signalvar.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/signalvar.h new file mode 100644 index 00000000000..2c5394d96f4 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/signalvar.h @@ -0,0 +1,170 @@ +/* + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)signalvar.h 8.3 (Berkeley) 1/4/94 + */ + +#ifndef _SYS_SIGNALVAR_H_ /* tmp for user.h */ +#define _SYS_SIGNALVAR_H_ + +/* + * Kernel signal definitions and data structures, + * not exported to user programs. + */ + +/* + * Process signal actions and state, needed only within the process + * (not necessarily resident). + */ +struct sigacts { + sig_t ps_sigact[NSIG]; /* disposition of signals */ + sigset_t ps_catchmask[NSIG]; /* signals to be blocked */ + sigset_t ps_sigonstack; /* signals to take on sigstack */ + sigset_t ps_sigintr; /* signals that interrupt syscalls */ + sigset_t ps_oldmask; /* saved mask from before sigpause */ + int ps_flags; /* signal flags, below */ + struct sigaltstack ps_sigstk; /* sp & on stack state variable */ + int ps_sig; /* for core dump/debugger XXX */ + int ps_code; /* for core dump/debugger XXX */ + int ps_addr; /* for core dump/debugger XXX */ + sigset_t ps_usertramp; /* SunOS compat; libc sigtramp XXX */ +}; + +/* signal flags */ +#define SAS_OLDMASK 0x01 /* need to restore mask before pause */ +#define SAS_ALTSTACK 0x02 /* have alternate signal stack */ + +/* additional signal action values, used only temporarily/internally */ +#define SIG_CATCH (void (*)())2 +#define SIG_HOLD (void (*)())3 + +/* + * get signal action for process and signal; currently only for current process + */ +#define SIGACTION(p, sig) (p->p_sigacts->ps_sigact[(sig)]) + +/* + * Determine signal that should be delivered to process p, the current + * process, 0 if none. If there is a pending stop signal with default + * action, the process stops in issig(). + */ +#define CURSIG(p) \ + (((p)->p_siglist == 0 || \ + (((p)->p_flag & P_TRACED) == 0 && \ + ((p)->p_siglist & ~(p)->p_sigmask) == 0)) ? \ + 0 : issignal(p)) + +/* + * Clear a pending signal from a process. + */ +#define CLRSIG(p, sig) { (p)->p_siglist &= ~sigmask(sig); } + +/* + * Signal properties and actions. + * The array below categorizes the signals and their default actions + * according to the following properties: + */ +#define SA_KILL 0x01 /* terminates process by default */ +#define SA_CORE 0x02 /* ditto and coredumps */ +#define SA_STOP 0x04 /* suspend process */ +#define SA_TTYSTOP 0x08 /* ditto, from tty */ +#define SA_IGNORE 0x10 /* ignore by default */ +#define SA_CONT 0x20 /* continue if suspended */ +#define SA_CANTMASK 0x40 /* non-maskable, catchable */ + +#ifdef SIGPROP +int sigprop[NSIG + 1] = { + 0, /* unused */ + SA_KILL, /* SIGHUP */ + SA_KILL, /* SIGINT */ + SA_KILL|SA_CORE, /* SIGQUIT */ + SA_KILL|SA_CORE, /* SIGILL */ + SA_KILL|SA_CORE, /* SIGTRAP */ + SA_KILL|SA_CORE, /* SIGABRT */ + SA_KILL|SA_CORE, /* SIGEMT */ + SA_KILL|SA_CORE, /* SIGFPE */ + SA_KILL, /* SIGKILL */ + SA_KILL|SA_CORE, /* SIGBUS */ + SA_KILL|SA_CORE, /* SIGSEGV */ + SA_KILL|SA_CORE, /* SIGSYS */ + SA_KILL, /* SIGPIPE */ + SA_KILL, /* SIGALRM */ + SA_KILL, /* SIGTERM */ + SA_IGNORE, /* SIGURG */ + SA_STOP, /* SIGSTOP */ + SA_STOP|SA_TTYSTOP, /* SIGTSTP */ + SA_IGNORE|SA_CONT, /* SIGCONT */ + SA_IGNORE, /* SIGCHLD */ + SA_STOP|SA_TTYSTOP, /* SIGTTIN */ + SA_STOP|SA_TTYSTOP, /* SIGTTOU */ + SA_IGNORE, /* SIGIO */ + SA_KILL, /* SIGXCPU */ + SA_KILL, /* SIGXFSZ */ + SA_KILL, /* SIGVTALRM */ + SA_KILL, /* SIGPROF */ + SA_IGNORE, /* SIGWINCH */ + SA_IGNORE, /* SIGINFO */ + SA_KILL, /* SIGUSR1 */ + SA_KILL, /* SIGUSR2 */ +}; + +#define contsigmask (sigmask(SIGCONT)) +#define stopsigmask (sigmask(SIGSTOP) | sigmask(SIGTSTP) | \ + sigmask(SIGTTIN) | sigmask(SIGTTOU)) + +#endif /* SIGPROP */ + +#define sigcantmask (sigmask(SIGKILL) | sigmask(SIGSTOP)) + +#ifdef KERNEL +/* + * Machine-independent functions: + */ +int coredump __P((struct proc *p)); +void execsigs __P((struct proc *p)); +void gsignal __P((int pgid, int sig)); +int issig __P((struct proc *p)); +int issignal __P((struct proc *p)); +void killproc __P((struct proc *, char *)); +void pgsignal __P((struct pgrp *pgrp, int sig, int checkctty)); +void postsig __P((int sig)); +void psignal __P((struct proc *p, int sig)); +void sigexit __P((struct proc *, int)); +void siginit __P((struct proc *p)); +void trapsignal __P((struct proc *p, int sig, unsigned code)); + +/* + * Machine-dependent functions: + */ +void sendsig __P((sig_t action, int sig, int returnmask, unsigned code)); +#endif /* KERNEL */ +#endif /* !_SYS_SIGNALVAR_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/socket.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/socket.h new file mode 100644 index 00000000000..63183ec87e3 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/socket.h @@ -0,0 +1,357 @@ +/* + * Copyright (c) 1982, 1985, 1986, 1988, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)socket.h 8.4 (Berkeley) 2/21/94 + */ + +#ifndef _OSK_SYS_SOCKET_H_ +#define _OSK_SYS_SOCKET_H_ + +/* + * Definitions related to sockets: types, address families, options. + */ + +/* + * Types + */ +#define SOCK_STREAM 1 /* stream socket */ +#define SOCK_DGRAM 2 /* datagram socket */ +#define SOCK_RAW 3 /* raw-protocol interface */ +#define SOCK_RDM 4 /* reliably-delivered message */ +#define SOCK_SEQPACKET 5 /* sequenced packet stream */ + +/* + * Option flags per-socket. + */ +#define SO_DEBUG 0x0001 /* turn on debugging info recording */ +#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */ +#define SO_REUSEADDR 0x0004 /* allow local address reuse */ +#define SO_KEEPALIVE 0x0008 /* keep connections alive */ +#define SO_DONTROUTE 0x0010 /* just use interface addresses */ +#define SO_BROADCAST 0x0020 /* permit sending of broadcast msgs */ +#define SO_USELOOPBACK 0x0040 /* bypass hardware when possible */ +#define SO_LINGER 0x0080 /* linger on close if data present */ +#define SO_OOBINLINE 0x0100 /* leave received OOB data in line */ +#define SO_REUSEPORT 0x0200 /* allow local address & port reuse */ + +/* + * Additional options, not kept in so_options. + */ +#define SO_SNDBUF 0x1001 /* send buffer size */ +#define SO_RCVBUF 0x1002 /* receive buffer size */ +#define SO_SNDLOWAT 0x1003 /* send low-water mark */ +#define SO_RCVLOWAT 0x1004 /* receive low-water mark */ +#define SO_SNDTIMEO 0x1005 /* send timeout */ +#define SO_RCVTIMEO 0x1006 /* receive timeout */ +#define SO_ERROR 0x1007 /* get error status and clear */ +#define SO_TYPE 0x1008 /* get socket type */ + +/* + * Structure used for manipulating linger option. + */ +struct linger { + int l_onoff; /* option on/off */ + int l_linger; /* linger time */ +}; + +/* + * Level number for (get/set)sockopt() to apply to socket itself. + */ +#define SOL_SOCKET 0xffff /* options for socket level */ + +/* + * Address families. + */ +#define AF_UNSPEC 0 /* unspecified */ +#define AF_LOCAL 1 /* local to host (pipes, portals) */ +#define AF_UNIX AF_LOCAL /* backward compatibility */ +#define AF_INET 2 /* internetwork: UDP, TCP, etc. */ +#define AF_IMPLINK 3 /* arpanet imp addresses */ +#define AF_PUP 4 /* pup protocols: e.g. BSP */ +#define AF_CHAOS 5 /* mit CHAOS protocols */ +#define AF_NS 6 /* XEROX NS protocols */ +#define AF_ISO 7 /* ISO protocols */ +#define AF_OSI AF_ISO +#define AF_ECMA 8 /* european computer manufacturers */ +#define AF_DATAKIT 9 /* datakit protocols */ +#define AF_CCITT 10 /* CCITT protocols, X.25 etc */ +#define AF_SNA 11 /* IBM SNA */ +#define AF_DECnet 12 /* DECnet */ +#define AF_DLI 13 /* DEC Direct data link interface */ +#define AF_LAT 14 /* LAT */ +#define AF_HYLINK 15 /* NSC Hyperchannel */ +#define AF_APPLETALK 16 /* Apple Talk */ +#define AF_ROUTE 17 /* Internal Routing Protocol */ +#define AF_LINK 18 /* Link layer interface */ +#define pseudo_AF_XTP 19 /* eXpress Transfer Protocol (no AF) */ +#define AF_COIP 20 /* connection-oriented IP, aka ST II */ +#define AF_CNT 21 /* Computer Network Technology */ +#define pseudo_AF_RTIP 22 /* Help Identify RTIP packets */ +#define AF_IPX 23 /* Novell Internet Protocol */ +#define AF_SIP 24 /* Simple Internet Protocol */ +#define pseudo_AF_PIP 25 /* Help Identify PIP packets */ +#define AF_ISDN 26 /* Integrated Services Digital Network*/ +#define AF_E164 AF_ISDN /* CCITT E.164 recommendation */ +#define pseudo_AF_KEY 27 /* Internal key-management function */ +#define AF_INET6 28 /* IPv6 */ + +#define AF_MAX 29 + +/* + * Structure used by kernel to store most + * addresses. + */ +struct sockaddr { + u_char sa_len; /* total length */ + u_char sa_family; /* address family */ + char sa_data[14]; /* actually longer; address value */ +}; + +/* + * Structure used by kernel to pass protocol + * information in raw sockets. + */ +struct sockproto { + u_short sp_family; /* address family */ + u_short sp_protocol; /* protocol */ +}; + +/* + * Protocol families, same as address families for now. + */ +#define PF_UNSPEC AF_UNSPEC +#define PF_LOCAL AF_LOCAL +#define PF_UNIX PF_LOCAL /* backward compatibility */ +#define PF_INET AF_INET +#define PF_IMPLINK AF_IMPLINK +#define PF_PUP AF_PUP +#define PF_CHAOS AF_CHAOS +#define PF_NS AF_NS +#define PF_ISO AF_ISO +#define PF_OSI AF_ISO +#define PF_ECMA AF_ECMA +#define PF_DATAKIT AF_DATAKIT +#define PF_CCITT AF_CCITT +#define PF_SNA AF_SNA +#define PF_DECnet AF_DECnet +#define PF_DLI AF_DLI +#define PF_LAT AF_LAT +#define PF_HYLINK AF_HYLINK +#define PF_APPLETALK AF_APPLETALK +#define PF_ROUTE AF_ROUTE +#define PF_LINK AF_LINK +#define PF_XTP pseudo_AF_XTP /* really just proto family, no AF */ +#define PF_COIP AF_COIP +#define PF_CNT AF_CNT +#define PF_SIP AF_SIP +#define PF_IPX AF_IPX /* same format as AF_NS */ +#define PF_RTIP pseudo_AF_FTIP /* same format as AF_INET */ +#define PF_PIP pseudo_AF_PIP +#define PF_ISDN AF_ISDN + +#define PF_MAX AF_MAX + +/* + * Definitions for network related sysctl, CTL_NET. + * + * Second level is protocol family. + * Third level is protocol number. + * + * Further levels are defined by the individual families below. + */ +#define NET_MAXID AF_MAX + +#define CTL_NET_NAMES { \ + { 0, 0 }, \ + { "unix", CTLTYPE_NODE }, \ + { "inet", CTLTYPE_NODE }, \ + { "implink", CTLTYPE_NODE }, \ + { "pup", CTLTYPE_NODE }, \ + { "chaos", CTLTYPE_NODE }, \ + { "xerox_ns", CTLTYPE_NODE }, \ + { "iso", CTLTYPE_NODE }, \ + { "emca", CTLTYPE_NODE }, \ + { "datakit", CTLTYPE_NODE }, \ + { "ccitt", CTLTYPE_NODE }, \ + { "ibm_sna", CTLTYPE_NODE }, \ + { "decnet", CTLTYPE_NODE }, \ + { "dec_dli", CTLTYPE_NODE }, \ + { "lat", CTLTYPE_NODE }, \ + { "hylink", CTLTYPE_NODE }, \ + { "appletalk", CTLTYPE_NODE }, \ + { "route", CTLTYPE_NODE }, \ + { "link_layer", CTLTYPE_NODE }, \ + { "xtp", CTLTYPE_NODE }, \ + { "coip", CTLTYPE_NODE }, \ + { "cnt", CTLTYPE_NODE }, \ + { "rtip", CTLTYPE_NODE }, \ + { "ipx", CTLTYPE_NODE }, \ + { "sip", CTLTYPE_NODE }, \ + { "pip", CTLTYPE_NODE }, \ +} + +/* + * PF_ROUTE - Routing table + * + * Three additional levels are defined: + * Fourth: address family, 0 is wildcard + * Fifth: type of info, defined below + * Sixth: flag(s) to mask with for NET_RT_FLAGS + */ +#define NET_RT_DUMP 1 /* dump; may limit to a.f. */ +#define NET_RT_FLAGS 2 /* by flags, e.g. RESOLVING */ +#define NET_RT_IFLIST 3 /* survey interface list */ +#define NET_RT_MAXID 4 + +#define CTL_NET_RT_NAMES { \ + { 0, 0 }, \ + { "dump", CTLTYPE_STRUCT }, \ + { "flags", CTLTYPE_STRUCT }, \ + { "iflist", CTLTYPE_STRUCT }, \ +} + +/* + * Maximum queue length specifiable by listen. + */ +#define SOMAXCONN 128 + +/* + * Message header for recvmsg and sendmsg calls. + * Used value-result for recvmsg, value only for sendmsg. + */ +struct msghdr { + caddr_t msg_name; /* optional address */ + u_int msg_namelen; /* size of address */ + struct iovec *msg_iov; /* scatter/gather array */ + u_int msg_iovlen; /* # elements in msg_iov */ + caddr_t msg_control; /* ancillary data, see below */ + u_int msg_controllen; /* ancillary data buffer len */ + int msg_flags; /* flags on received message */ +}; + +#endif + +#ifndef MSG_OOB +#define MSG_OOB 0x1 /* process out-of-band data */ +#define MSG_PEEK 0x2 /* peek at incoming message */ +#define MSG_DONTROUTE 0x4 /* send without using routing tables */ +#endif +#ifndef MSG_EOR +#define MSG_EOR 0x8 /* data completes record */ +#define MSG_TRUNC 0x10 /* data discarded before delivery */ +#define MSG_CTRUNC 0x20 /* control data lost before delivery */ +#define MSG_WAITALL 0x40 /* wait for full request or error */ +#endif +#ifndef MSG_DONTWAIT +#define MSG_DONTWAIT 0x80 /* this message should be nonblocking */ +#define MSG_EOF 0x100 /* data completes connection */ +#define MSG_COMPAT 0x8000 /* used in sendit() */ +#endif + +#ifndef __REACTOS__ +/* + * Header for ancillary data objects in msg_control buffer. + * Used for additional information with/about a datagram + * not expressible by flags. The format is a sequence + * of message elements headed by cmsghdr structures. + */ +struct cmsghdr { + u_int cmsg_len; /* data byte count, including hdr */ + int cmsg_level; /* originating protocol */ + int cmsg_type; /* protocol-specific type */ +/* followed by u_char cmsg_data[]; */ +}; + +/* given pointer to struct cmsghdr, return pointer to data */ +#define CMSG_DATA(cmsg) ((u_char *)((cmsg) + 1)) + +/* given pointer to struct cmsghdr, return pointer to next cmsghdr */ +#define CMSG_NXTHDR(mhdr, cmsg) \ + (((caddr_t)(cmsg) + (cmsg)->cmsg_len + sizeof(struct cmsghdr) > \ + (mhdr)->msg_control + (mhdr)->msg_controllen) ? \ + (struct cmsghdr *)NULL : \ + (struct cmsghdr *)((caddr_t)(cmsg) + ALIGN((cmsg)->cmsg_len))) + +#define CMSG_FIRSTHDR(mhdr) ((struct cmsghdr *)(mhdr)->msg_control) + +/* "Socket"-level control message types: */ +#define SCM_RIGHTS 0x01 /* access rights (array of int) */ + +/* + * 4.3 compat sockaddr, move to compat file later + */ +struct osockaddr { + u_short sa_family; /* address family */ + char sa_data[14]; /* up to 14 bytes of direct address */ +}; + +/* + * 4.3-compat message header (move to compat file later). + */ +struct omsghdr { + caddr_t msg_name; /* optional address */ + int msg_namelen; /* size of address */ + struct iovec *msg_iov; /* scatter/gather array */ + int msg_iovlen; /* # elements in msg_iov */ + caddr_t msg_accrights; /* access rights sent/received */ + int msg_accrightslen; +}; + +#ifndef KERNEL + +#include <sys/cdefs.h> + +__BEGIN_DECLS +int accept __P((int, struct sockaddr *, int *)); +int bind __P((int, const struct sockaddr *, int)); +int connect __P((int, const struct sockaddr *, int)); +int getpeername __P((int, struct sockaddr *, int *)); +int getsockname __P((int, struct sockaddr *, int *)); +int getsockopt __P((int, int, int, void *, int *)); +int listen __P((int, int)); +ssize_t recv __P((int, void *, size_t, int)); +ssize_t recvfrom __P((int, void *, size_t, int, struct sockaddr *, int *)); +ssize_t recvmsg __P((int, struct msghdr *, int)); +ssize_t send __P((int, const void *, size_t, int)); +ssize_t sendto __P((int, const void *, + size_t, int, const struct sockaddr *, int)); +ssize_t sendmsg __P((int, const struct msghdr *, int)); +int setsockopt __P((int, int, int, const void *, int)); +int shutdown __P((int, int)); +int socket __P((int, int, int)); +int socketpair __P((int, int, int, int *)); +__END_DECLS + +#else /* KERNEL */ +void pfctlinput __P((int, struct sockaddr *)); +#endif /* !KERNEL */ +#endif /* !_OSK_SYS_SOCKET_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/socketvar.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/socketvar.h new file mode 100644 index 00000000000..d5b4fb59f90 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/socketvar.h @@ -0,0 +1,264 @@ +/*- + * Copyright (c) 1982, 1986, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)socketvar.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _SYS_SOCKETVAR_H_ +#define _SYS_SOCKETVAR_H_ + +#include <sys/stat.h> /* for struct stat */ +#include <sys/filedesc.h> /* for struct filedesc */ +#include <sys/select.h> /* for struct selinfo */ + +/* + * Kernel structure per socket. + * Contains send and receive buffer queues, + * handle on protocol and pointer to protocol + * private data and error information. + */ +struct socket { + short so_type; /* generic type, see socket.h */ + short so_options; /* from socket call, see socket.h */ + short so_linger; /* time to linger while closing */ + short so_state; /* internal state flags SS_*, below */ + caddr_t so_pcb; /* protocol control block */ + struct protosw *so_proto; /* protocol handle */ +/* + * Variables for connection queueing. + * Socket where accepts occur is so_head in all subsidiary sockets. + * If so_head is 0, socket is not related to an accept. + * For head socket so_q0 queues partially completed connections, + * while so_q is a queue of connections ready to be accepted. + * If a connection is aborted and it has so_head set, then + * it has to be pulled out of either so_q0 or so_q. + * We allow connections to queue up based on current queue lengths + * and limit on number of queued connections for this socket. + */ + struct socket *so_head; /* back pointer to accept socket */ + struct socket *so_q0; /* queue of partial connections */ + struct socket *so_q; /* queue of incoming connections */ + short so_q0len; /* partials on so_q0 */ + short so_qlen; /* number of connections on so_q */ + short so_qlimit; /* max number queued connections */ + short so_timeo; /* connection timeout */ + u_short so_error; /* error affecting connection */ + pid_t so_pgid; /* pgid for signals */ + u_long so_oobmark; /* chars to oob mark */ +/* + * Variables for socket buffering. + */ + struct sockbuf { + u_long sb_cc; /* actual chars in buffer */ + u_long sb_hiwat; /* max actual char count */ + u_long sb_mbcnt; /* chars of mbufs used */ + u_long sb_mbmax; /* max chars of mbufs to use */ + long sb_lowat; /* low water mark */ + struct mbuf *sb_mb; /* the mbuf chain */ + struct selinfo sb_sel; /* process selecting read/write */ + short sb_flags; /* flags, see below */ + short sb_timeo; /* timeout for read/write */ + } so_rcv, so_snd; +#define SB_MAX (256*1024) /* default for max chars in sockbuf */ +#define SB_LOCK 0x01 /* lock on data queue */ +#define SB_WANT 0x02 /* someone is waiting to lock */ +#define SB_WAIT 0x04 /* someone is waiting for data/space */ +#define SB_SEL 0x08 /* someone is selecting */ +#define SB_ASYNC 0x10 /* ASYNC I/O, need signals */ +#define SB_NOTIFY (SB_WAIT|SB_SEL|SB_ASYNC) +#define SB_NOINTR 0x40 /* operations not interruptible */ + + caddr_t so_tpcb; /* Wisc. protocol control block XXX */ + void (*so_upcall) __P((struct socket *so, caddr_t arg, int waitf)); + caddr_t so_upcallarg; /* Arg for above */ + +#ifdef __REACTOS__ + void *so_connection; /* The connection object used by our parent */ +#endif +}; + +/* + * Socket state bits. + */ +#define SS_NOFDREF 0x001 /* no file table ref any more */ +#define SS_ISCONNECTED 0x002 /* socket connected to a peer */ +#define SS_ISCONNECTING 0x004 /* in process of connecting to peer */ +#define SS_ISDISCONNECTING 0x008 /* in process of disconnecting */ +#define SS_CANTSENDMORE 0x010 /* can't send more data to peer */ +#define SS_CANTRCVMORE 0x020 /* can't receive more data from peer */ +#define SS_RCVATMARK 0x040 /* at mark on input */ + +#define SS_PRIV 0x080 /* privileged for broadcast, raw... */ +#define SS_NBIO 0x100 /* non-blocking ops */ +#define SS_ASYNC 0x200 /* async i/o notify */ +#define SS_ISCONFIRMING 0x400 /* deciding to accept connection req */ + + +/* + * Macros for sockets and socket buffering. + */ + +/* + * How much space is there in a socket buffer (so->so_snd or so->so_rcv)? + * This is problematical if the fields are unsigned, as the space might + * still be negative (cc > hiwat or mbcnt > mbmax). Should detect + * overflow and return 0. Should use "lmin" but it doesn't exist now. + */ +#define sbspace(sb) \ + ((long) imin((int)((sb)->sb_hiwat - (sb)->sb_cc), \ + (int)((sb)->sb_mbmax - (sb)->sb_mbcnt))) + +/* do we have to send all at once on a socket? */ +#define sosendallatonce(so) \ + ((so)->so_proto->pr_flags & PR_ATOMIC) + +/* can we read something from so? */ +#define soreadable(so) \ + ((so)->so_rcv.sb_cc >= (so)->so_rcv.sb_lowat || \ + ((so)->so_state & SS_CANTRCVMORE) || \ + (so)->so_qlen || (so)->so_error) + +/* can we write something to so? */ +#define sowriteable(so) \ + ((sbspace(&(so)->so_snd) >= (so)->so_snd.sb_lowat && \ + (((so)->so_state&SS_ISCONNECTED) || \ + ((so)->so_proto->pr_flags&PR_CONNREQUIRED)==0)) || \ + ((so)->so_state & SS_CANTSENDMORE) || \ + (so)->so_error) + +/* adjust counters in sb reflecting allocation of m */ +#define sballoc(sb, m) { \ + (sb)->sb_cc += (m)->m_len; \ + (sb)->sb_mbcnt += MSIZE; \ + if ((m)->m_flags & M_EXT) \ + (sb)->sb_mbcnt += (m)->m_ext.ext_size; \ +} + +/* adjust counters in sb reflecting freeing of m */ +#define sbfree(sb, m) { \ + (sb)->sb_cc -= (m)->m_len; \ + (sb)->sb_mbcnt -= MSIZE; \ + if ((m)->m_flags & M_EXT) \ + (sb)->sb_mbcnt -= (m)->m_ext.ext_size; \ +} + +/* + * Set lock on sockbuf sb; sleep if lock is already held. + * Unless SB_NOINTR is set on sockbuf, sleep is interruptible. + * Returns error without lock if sleep is interrupted. + */ +#define sblock(sb, wf) ((sb)->sb_flags & SB_LOCK ? \ + (((wf) == M_WAITOK) ? sb_lock(sb) : EWOULDBLOCK) : \ + ((sb)->sb_flags |= SB_LOCK), 0) + +/* release lock on sockbuf sb */ +#define sbunlock(sb) { \ + (sb)->sb_flags &= ~SB_LOCK; \ + if ((sb)->sb_flags & SB_WANT) { \ + (sb)->sb_flags &= ~SB_WANT; \ + wakeup((caddr_t)&(sb)->sb_flags); \ + } \ +} + +#define sorwakeup(so) { sowakeup((so), &(so)->so_rcv); \ + if ((so)->so_upcall) \ + (*((so)->so_upcall))((so), (so)->so_upcallarg, M_DONTWAIT); \ + } + +#define sowwakeup(so) sowakeup((so), &(so)->so_snd) + +#ifdef KERNEL +extern u_long sb_max; +/* to catch callers missing new second argument to sonewconn: */ +#define sonewconn(head, connstatus) sonewconn1((head), (connstatus)) +struct socket *sonewconn1 __P((struct socket *head, int connstatus)); + +/* strings for sleep message: */ +extern char netio[], netcon[], netcls[]; + +/* + * File operations on sockets. + */ +int soo_read __P((struct file *fp, struct uio *uio, struct ucred *cred)); +int soo_write __P((struct file *fp, struct uio *uio, struct ucred *cred)); +int soo_ioctl __P((struct file *fp, int com, caddr_t data, struct proc *p)); +int soo_select __P((struct file *fp, int which, struct proc *p)); +int soo_close __P((struct file *fp, struct proc *p)); +int soo_stat __P((struct socket *, struct stat *)); + +/* + * From uipc_socket and friends + */ +void soqinsque __P((struct socket *, struct socket *, int)); +void sowakeup __P((struct socket *, struct sockbuf *)); +void socantrcvmore __P((struct socket *)); +void socantsendmore __P((struct socket *)); +void sbrelease __P((struct sockbuf *)); +void sbappend __P((struct socket *, struct sockbuf *, struct mbuf *)); +void sbappendrecord __P((struct sockbuf *, struct mbuf *)); +int sbappendcontrol __P((struct sockbuf *, struct mbuf *, struct mbuf *)); +int sbappendaddr __P((struct sockbuf *, struct sockaddr *, struct mbuf *, struct mbuf *)); +void sbdroprecord __P((struct sockbuf *)); +void sbcompress __P((struct sockbuf *, struct mbuf *, struct mbuf *)); +void sbflush __P((struct sockbuf *)); +int sbreserve __P((struct sockbuf *,u_long)); +int soreserve __P((struct socket *,u_long,u_long)); +int sb_lock __P((struct sockbuf *)); +int sbwait __P((struct sockbuf *)); +void sbdrop __P((struct sockbuf *, int)); +void sofree __P((struct socket *)); +void sorflush __P((struct socket *)); +int soqremque __P((struct socket *,int)); +int soabort __P((struct socket *)); +void soisdisconnected __P((struct socket *)); +void soisconnected __P((struct socket *)); +void soisconnecting __P((struct socket *)); +void soisdisconnecting __P((struct socket *)); +void sohasoutofband __P((struct socket *)); +int sodisconnect __P((struct socket *)); +int sosend __P((struct socket *,struct mbuf *, struct uio *, struct mbuf *, struct mbuf *, int)); +int socreate __P((int, struct socket **,int,int)); +int getsock __P((struct filedesc *,int,struct file **)); +int sockargs __P((struct mbuf **,caddr_t,int,int)); +int sobind __P((struct socket *,struct mbuf *)); +int solisten __P((struct socket *,int)); +int soaccept __P((struct socket *,struct mbuf *)); +int soconnect __P((struct socket *,struct mbuf *)); +int soconnect2 __P((struct socket *,struct socket *)); +int soclose __P((struct socket *)); +int soshutdown __P((struct socket *,int)); +int soreceive __P((struct socket *,struct mbuf **,struct uio *,struct mbuf **,struct mbuf **,int *)); +int sosetopt __P((struct socket *,int, int, struct mbuf *)); +int sogetopt __P((struct socket *,int, int, struct mbuf **)); +#endif + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/sockio.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/sockio.h new file mode 100644 index 00000000000..05dfd904a5f --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/sockio.h @@ -0,0 +1,88 @@ +/*- + * Copyright (c) 1982, 1986, 1990, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)sockio.h 8.1 (Berkeley) 3/28/94 + */ + +#ifndef _SYS_SOCKIO_H_ +#define _SYS_SOCKIO_H_ + +#ifndef __REACTOS__ +#include <sys/ioccom.h> + +/* Socket ioctl's. */ +#define SIOCSHIWAT _IOW('s', 0, int) /* set high watermark */ +#define SIOCGHIWAT _IOR('s', 1, int) /* get high watermark */ +#define SIOCSLOWAT _IOW('s', 2, int) /* set low watermark */ +#define SIOCGLOWAT _IOR('s', 3, int) /* get low watermark */ +#define SIOCATMARK _IOR('s', 7, int) /* at oob mark? */ +#define SIOCSPGRP _IOW('s', 8, int) /* set process group */ +#define SIOCGPGRP _IOR('s', 9, int) /* get process group */ + +#define SIOCADDRT _IOW('r', 10, struct ortentry) /* add route */ +#define SIOCDELRT _IOW('r', 11, struct ortentry) /* delete route */ +#define SIOCSETRTINFO _IOWR('r', 12, struct fullrtentry) /* change aux info */ +#define SIOCGETRTINFO _IOWR('r', 13, struct fullrtentry) /* read aux info */ +#define SIOCGETVIFINF _IOWR('r', 14, struct vif_conf) /* read m/c vifs */ +#define SIOCGETVIFCNT _IOWR('r', 15, struct sioc_vif_req)/* get vif pkt cnt */ +#define SIOCGETSGCNT _IOWR('r', 16, struct sioc_sg_req) /* get s,g pkt cnt */ + +#define SIOCSIFADDR _IOW('i', 12, struct ifreq) /* set ifnet address */ +#define OSIOCGIFADDR _IOWR('i', 13, struct ifreq) /* get ifnet address */ +#define SIOCGIFADDR _IOWR('i', 33, struct ifreq) /* get ifnet address */ +#define SIOCSIFDSTADDR _IOW('i', 14, struct ifreq) /* set p-p address */ +#define OSIOCGIFDSTADDR _IOWR('i', 15, struct ifreq) /* get p-p address */ +#define SIOCGIFDSTADDR _IOWR('i', 34, struct ifreq) /* get p-p address */ +#define SIOCSIFFLAGS _IOW('i', 16, struct ifreq) /* set ifnet flags */ +#define SIOCGIFFLAGS _IOWR('i', 17, struct ifreq) /* get ifnet flags */ +#define OSIOCGIFBRDADDR _IOWR('i', 18, struct ifreq) /* get broadcast addr */ +#define SIOCGIFBRDADDR _IOWR('i', 35, struct ifreq) /* get broadcast addr */ +#define SIOCSIFBRDADDR _IOW('i', 19, struct ifreq) /* set broadcast addr */ +#define OSIOCGIFCONF _IOWR('i', 20, struct ifconf) /* get ifnet list */ +#define SIOCGIFCONF _IOWR('i', 36, struct ifconf) /* get ifnet list */ +#define OSIOCGIFNETMASK _IOWR('i', 21, struct ifreq) /* get net addr mask */ +#define SIOCGIFNETMASK _IOWR('i', 37, struct ifreq) /* get net addr mask */ +#define SIOCSIFNETMASK _IOW('i', 22, struct ifreq) /* set net addr mask */ +#define SIOCGIFMETRIC _IOWR('i', 23, struct ifreq) /* get IF metric */ +#define SIOCSIFMETRIC _IOW('i', 24, struct ifreq) /* set IF metric */ +#define SIOCDIFADDR _IOW('i', 25, struct ifreq) /* delete IF addr */ +#define SIOCAIFADDR _IOW('i', 26, struct ifaliasreq)/* add/chg IF alias */ + +#define SIOCADDMULTI _IOW('i', 49, struct ifreq) /* add m'cast addr */ +#define SIOCDELMULTI _IOW('i', 50, struct ifreq) /* del m'cast addr */ +#define SIOCGIFMTU _IOWR('i', 51, struct ifreq) /* get IF mtu */ +#define SIOCSIFMTU _IOW('i', 52, struct ifreq) /* set IF mtu */ +#define SIOCGIFPHYS _IOWR('i', 53, struct ifreq) /* get IF wire */ +#define SIOCSIFPHYS _IOW('i', 54, struct ifreq) /* set IF wire */ +#endif + +#endif /* !_SYS_SOCKIO_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/stat.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/stat.h new file mode 100644 index 00000000000..87e6e5f1f88 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/stat.h @@ -0,0 +1,203 @@ +/*- + * Copyright (c) 1982, 1986, 1989, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)stat.h 8.6 (Berkeley) 3/8/94 + */ + +#ifndef _SYS_STAT_H_ +#define _SYS_STAT_H_ + +/* + * XXX we need this for struct timespec. We get miscellaneous namespace + * pollution with it. struct timespace itself is namespace pollution if + * _POSIX_SOURCE is defined. + */ +#include <sys/time.h> + +#ifndef _POSIX_SOURCE +struct ostat { + unsigned short st_dev; /* inode's device */ + ino_t st_ino; /* inode's number */ + mode_t st_mode; /* inode protection mode */ + nlink_t st_nlink; /* number of hard links */ + unsigned short st_uid; /* user ID of the file's owner */ + unsigned short st_gid; /* group ID of the file's group */ + unsigned short st_rdev; /* device type */ + long st_size; /* file size, in bytes */ + struct timespec st_atimespec; /* time of last access */ + struct timespec st_mtimespec; /* time of last data modification */ + struct timespec st_ctimespec; /* time of last file status change */ + long st_blksize; /* optimal blocksize for I/O */ + long st_blocks; /* blocks allocated for file */ + unsigned long st_flags; /* user defined flags for file */ + unsigned long st_gen; /* file generation number */ +}; +#endif /* !_POSIX_SOURCE */ + +struct stat { + dev_t st_dev; /* inode's device */ + ino_t st_ino; /* inode's number */ + mode_t st_mode; /* inode protection mode */ + nlink_t st_nlink; /* number of hard links */ + uid_t st_uid; /* user ID of the file's owner */ + gid_t st_gid; /* group ID of the file's group */ + dev_t st_rdev; /* device type */ + struct timespec st_atimespec; /* time of last access */ + struct timespec st_mtimespec; /* time of last data modification */ + struct timespec st_ctimespec; /* time of last file status change */ + off_t st_size; /* file size, in bytes */ + quad_t st_blocks; /* blocks allocated for file */ + unsigned long st_blksize; /* optimal blocksize for I/O */ + unsigned long st_flags; /* user defined flags for file */ + unsigned long st_gen; /* file generation number */ + long st_lspare; + quad_t st_qspare[2]; +}; +#define st_atime st_atimespec.ts_sec +#define st_mtime st_mtimespec.ts_sec +#define st_ctime st_ctimespec.ts_sec + +#define S_ISUID 0004000 /* set user id on execution */ +#define S_ISGID 0002000 /* set group id on execution */ +#ifndef _POSIX_SOURCE +#define S_ISTXT 0001000 /* sticky bit */ +#endif + +#define S_IRWXU 0000700 /* RWX mask for owner */ +#define S_IRUSR 0000400 /* R for owner */ +#define S_IWUSR 0000200 /* W for owner */ +#define S_IXUSR 0000100 /* X for owner */ + +#ifndef _POSIX_SOURCE +#define S_IREAD S_IRUSR +#define S_IWRITE S_IWUSR +#define S_IEXEC S_IXUSR +#endif + +#define S_IRWXG 0000070 /* RWX mask for group */ +#define S_IRGRP 0000040 /* R for group */ +#define S_IWGRP 0000020 /* W for group */ +#define S_IXGRP 0000010 /* X for group */ + +#define S_IRWXO 0000007 /* RWX mask for other */ +#define S_IROTH 0000004 /* R for other */ +#define S_IWOTH 0000002 /* W for other */ +#define S_IXOTH 0000001 /* X for other */ + +#ifndef _POSIX_SOURCE +#define S_IFMT 0170000 /* type of file mask */ +#define S_IFIFO 0010000 /* named pipe (fifo) */ +#define S_IFCHR 0020000 /* character special */ +#define S_IFDIR 0040000 /* directory */ +#define S_IFBLK 0060000 /* block special */ +#define S_IFREG 0100000 /* regular */ +#define S_IFLNK 0120000 /* symbolic link */ +#define S_IFSOCK 0140000 /* socket */ +#define S_ISVTX 0001000 /* save swapped text even after use */ +#endif + +#define S_ISDIR(m) (((m) & 0170000) == 0040000) /* directory */ +#define S_ISCHR(m) (((m) & 0170000) == 0020000) /* char special */ +#define S_ISBLK(m) (((m) & 0170000) == 0060000) /* block special */ +#define S_ISREG(m) (((m) & 0170000) == 0100000) /* regular file */ +#define S_ISFIFO(m) (((m) & 0170000) == 0010000 || \ + ((m) & 0170000) == 0140000) /* fifo or socket */ +#ifndef _POSIX_SOURCE +#define S_ISLNK(m) (((m) & 0170000) == 0120000) /* symbolic link */ +#define S_ISSOCK(m) (((m) & 0170000) == 0010000 || \ + ((m) & 0170000) == 0140000) /* fifo or socket */ +#endif + +#ifndef _POSIX_SOURCE +#define ACCESSPERMS (S_IRWXU|S_IRWXG|S_IRWXO) /* 0777 */ + /* 7777 */ +#define ALLPERMS (S_ISUID|S_ISGID|S_ISTXT|S_IRWXU|S_IRWXG|S_IRWXO) + /* 0666 */ +#define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) + +#define S_BLKSIZE 512 /* block size used in the stat struct */ + +/* + * Definitions of flags stored in file flags word. + * + * Super-user and owner changeable flags. + */ +#define UF_SETTABLE 0x0000ffff /* mask of owner changeable flags */ +#define UF_NODUMP 0x00000001 /* do not dump file */ +#define UF_IMMUTABLE 0x00000002 /* file may not be changed */ +#define UF_APPEND 0x00000004 /* writes to file may only append */ +/* + * Super-user changeable flags. + */ +#define SF_SETTABLE 0xffff0000 /* mask of superuser changeable flags */ +#define SF_ARCHIVED 0x00010000 /* file is archived */ +#define SF_IMMUTABLE 0x00020000 /* file may not be changed */ +#define SF_APPEND 0x00040000 /* writes to file may only append */ + +#ifdef KERNEL +/* + * Shorthand abbreviations of above. + */ +#define APPEND (UF_APPEND | SF_APPEND) +#define IMMUTABLE (UF_IMMUTABLE | SF_IMMUTABLE) +#endif + +#endif /* !_POSIX_SOURCE */ + +#ifdef KERNEL +void cvtstat __P((struct stat *, struct ostat *)); +#else /* KERNEL */ +#include <sys/cdefs.h> + +__BEGIN_DECLS +int chmod __P((const char *, mode_t)); +int fstat __P((int, struct stat *)); +int mkdir __P((const char *, mode_t)); +int mkfifo __P((const char *, mode_t)); +int stat __P((const char *, struct stat *)); +mode_t umask __P((mode_t)); +#ifndef _POSIX_SOURCE +int chflags __P((const char *, u_long)); +int fchflags __P((int, u_long)); +int fchmod __P((int, mode_t)); +int lstat __P((const char *, struct stat *)); +#endif +__END_DECLS + +#endif /* KERNEL */ + +#endif /* !_SYS_STAT_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/sysctl.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/sysctl.h new file mode 100644 index 00000000000..c3aa9667fcc --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/sysctl.h @@ -0,0 +1,412 @@ +/* + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Mike Karels at Berkeley Software Design, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)sysctl.h 8.1 (Berkeley) 6/2/93 + * $\Id: sysctl.h,v 1.23.4.5 1996/09/19 08:19:00 pst Exp $ + */ + +#ifndef _SYS_SYSCTL_H_ +#define _SYS_SYSCTL_H_ + +/* + * These are for the eproc structure defined below. + */ +#ifndef KERNEL +#include <sys/time.h> +#include <sys/ucred.h> +#include <sys/proc.h> +#include <vm/vm.h> +#endif + +/* + * Definitions for sysctl call. The sysctl call uses a hierarchical name + * for objects that can be examined or modified. The name is expressed as + * a sequence of integers. Like a file path name, the meaning of each + * component depends on its place in the hierarchy. The top-level and kern + * identifiers are defined here, and other identifiers are defined in the + * respective subsystem header files. + */ + +#define CTL_MAXNAME 12 /* largest number of components supported */ + +/* + * Each subsystem defined by sysctl defines a list of variables + * for that subsystem. Each name is either a node with further + * levels defined below it, or it is a leaf of some particular + * type given below. Each sysctl level defines a set of name/type + * pairs to be used by sysctl(1) in manipulating the subsystem. + */ +struct ctlname { + char *ctl_name; /* subsystem name */ + int ctl_type; /* type of name */ +}; +#define CTLTYPE_NODE 1 /* name is a node */ +#define CTLTYPE_INT 2 /* name describes an integer */ +#define CTLTYPE_STRING 3 /* name describes a string */ +#define CTLTYPE_QUAD 4 /* name describes a 64-bit number */ +#define CTLTYPE_STRUCT 5 /* name describes a structure */ + +/* + * Top-level identifiers + */ +#define CTL_UNSPEC 0 /* unused */ +#define CTL_KERN 1 /* "high kernel": proc, limits */ +#define CTL_VM 2 /* virtual memory */ +#define CTL_FS 3 /* file system, mount type is next */ +#define CTL_NET 4 /* network, see socket.h */ +#define CTL_DEBUG 5 /* debugging parameters */ +#define CTL_HW 6 /* generic cpu/io */ +#define CTL_MACHDEP 7 /* machine dependent */ +#define CTL_USER 8 /* user-level */ +#define CTL_MAXID 9 /* number of valid top-level ids */ + +#define CTL_NAMES { \ + { 0, 0 }, \ + { "kern", CTLTYPE_NODE }, \ + { "vm", CTLTYPE_NODE }, \ + { "fs", CTLTYPE_NODE }, \ + { "net", CTLTYPE_NODE }, \ + { "debug", CTLTYPE_NODE }, \ + { "hw", CTLTYPE_NODE }, \ + { "machdep", CTLTYPE_NODE }, \ + { "user", CTLTYPE_NODE }, \ +} + +/* + * CTL_KERN identifiers + */ +#define KERN_OSTYPE 1 /* string: system version */ +#define KERN_OSRELEASE 2 /* string: system release */ +#define KERN_OSREV 3 /* int: system revision */ +#define KERN_VERSION 4 /* string: compile time info */ +#define KERN_MAXVNODES 5 /* int: max vnodes */ +#define KERN_MAXPROC 6 /* int: max processes */ +#define KERN_MAXFILES 7 /* int: max open files */ +#define KERN_ARGMAX 8 /* int: max arguments to exec */ +#define KERN_SECURELVL 9 /* int: system security level */ +#define KERN_HOSTNAME 10 /* string: hostname */ +#define KERN_HOSTID 11 /* int: host identifier */ +#define KERN_CLOCKRATE 12 /* struct: struct clockrate */ +#define KERN_VNODE 13 /* struct: vnode structures */ +#define KERN_PROC 14 /* struct: process entries */ +#define KERN_FILE 15 /* struct: file entries */ +#define KERN_PROF 16 /* node: kernel profiling info */ +#define KERN_POSIX1 17 /* int: POSIX.1 version */ +#define KERN_NGROUPS 18 /* int: # of supplemental group ids */ +#define KERN_JOB_CONTROL 19 /* int: is job control available */ +#define KERN_SAVED_IDS 20 /* int: saved set-user/group-ID */ +#define KERN_BOOTTIME 21 /* struct: time kernel was booted */ +#define KERN_DOMAINNAME 22 /* string: YP domain name */ +#define KERN_UPDATEINTERVAL 23 /* int: update process sleep time */ +#define KERN_OSRELDATE 24 /* int: OS release date */ +#define KERN_NTP_PLL 25 /* node: NTP PLL control */ +#define KERN_BOOTFILE 26 /* string: name of booted kernel */ +#define KERN_MAXFILESPERPROC 27 /* int: max open files per proc */ +#define KERN_MAXPROCPERUID 28 /* int: max processes per uid */ +#define KERN_DUMPDEV 29 /* dev_t: device to dump on */ +#define KERN_SOMAXCONN 30 /* int: max connections in listen q */ +#define KERN_MAXSOCKBUF 31 /* int: max size of a socket buffer */ +#define KERN_PS_STRINGS 32 /* int: address of PS_STRINGS */ +#define KERN_USRSTACK 33 /* int: address of USRSTACK */ +#define KERN_SOCKBUF_WASTE 34 /* int: reserved sockbuf space */ +#define KERN_SOMINQUEUE 35 /* int: override socket listen() */ +#define KERN_MAXID 36 /* number of valid kern ids */ + +#define CTL_KERN_NAMES { \ + { 0, 0 }, \ + { "ostype", CTLTYPE_STRING }, \ + { "osrelease", CTLTYPE_STRING }, \ + { "osrevision", CTLTYPE_INT }, \ + { "version", CTLTYPE_STRING }, \ + { "maxvnodes", CTLTYPE_INT }, \ + { "maxproc", CTLTYPE_INT }, \ + { "maxfiles", CTLTYPE_INT }, \ + { "argmax", CTLTYPE_INT }, \ + { "securelevel", CTLTYPE_INT }, \ + { "hostname", CTLTYPE_STRING }, \ + { "hostid", CTLTYPE_INT }, \ + { "clockrate", CTLTYPE_STRUCT }, \ + { "vnode", CTLTYPE_STRUCT }, \ + { "proc", CTLTYPE_STRUCT }, \ + { "file", CTLTYPE_STRUCT }, \ + { "profiling", CTLTYPE_NODE }, \ + { "posix1version", CTLTYPE_INT }, \ + { "ngroups", CTLTYPE_INT }, \ + { "job_control", CTLTYPE_INT }, \ + { "saved_ids", CTLTYPE_INT }, \ + { "boottime", CTLTYPE_STRUCT }, \ + { "domainname", CTLTYPE_STRING }, \ + { "update", CTLTYPE_INT }, \ + { "osreldate", CTLTYPE_INT }, \ + { "ntp_pll", CTLTYPE_NODE }, \ + { "bootfile", CTLTYPE_STRING }, \ + { "maxfilesperproc", CTLTYPE_INT }, \ + { "maxprocperuid", CTLTYPE_INT }, \ + { "dumpdev", CTLTYPE_STRUCT }, /* we lie; don't print as int */ \ + { "somaxconn", CTLTYPE_INT }, \ + { "maxsockbuf", CTLTYPE_INT }, \ + { "ps_strings", CTLTYPE_INT }, \ + { "usrstack", CTLTYPE_INT }, \ + { "sockbuf_waste_factor", CTLTYPE_INT }, \ + { "sominqueue", CTLTYPE_INT }, \ +} + +/* + * CTL_FS identifiers + */ +#define FS_VFSCONF 0 /* get configured filesystems */ +#define FS_MAXID 1 /* number of items */ + +#define CTL_FS_NAMES { \ + { "vfsconf", CTLTYPE_STRUCT }, \ +} + +/* + * KERN_PROC subtypes + */ +#define KERN_PROC_ALL 0 /* everything */ +#define KERN_PROC_PID 1 /* by process id */ +#define KERN_PROC_PGRP 2 /* by process group id */ +#define KERN_PROC_SESSION 3 /* by session of pid */ +#define KERN_PROC_TTY 4 /* by controlling tty */ +#define KERN_PROC_UID 5 /* by effective uid */ +#define KERN_PROC_RUID 6 /* by real uid */ + +/* + * KERN_PROC subtype ops return arrays of augmented proc structures: + */ +struct kinfo_proc { + struct proc kp_proc; /* proc structure */ + struct eproc { + struct proc *e_paddr; /* address of proc */ + struct session *e_sess; /* session pointer */ + struct pcred e_pcred; /* process credentials */ + struct ucred e_ucred; /* current credentials */ +#if defined(sparc) || defined(__REACTOS__) + struct { + segsz_t vm_rssize; /* resident set size */ + segsz_t vm_tsize; /* text size */ + segsz_t vm_dsize; /* data size */ + segsz_t vm_ssize; /* stack size */ + } e_vm; +#else +#ifndef OSKIT + struct vmspace e_vm; /* address space */ +#endif +#endif + pid_t e_ppid; /* parent process id */ + pid_t e_pgid; /* process group id */ + short e_jobc; /* job control counter */ + dev_t e_tdev; /* controlling tty dev */ + pid_t e_tpgid; /* tty process group id */ + struct session *e_tsess; /* tty session pointer */ +#define WMESGLEN 7 + char e_wmesg[WMESGLEN+1]; /* wchan message */ + segsz_t e_xsize; /* text size */ + short e_xrssize; /* text rss */ + short e_xccount; /* text references */ + short e_xswrss; + long e_flag; +#define EPROC_CTTY 0x01 /* controlling tty vnode active */ +#define EPROC_SLEADER 0x02 /* session leader */ + char e_login[MAXLOGNAME]; /* setlogin() name */ + long e_spare[4]; + } kp_eproc; +}; + +/* + * CTL_HW identifiers + */ +#define HW_MACHINE 1 /* string: machine class */ +#define HW_MODEL 2 /* string: specific machine model */ +#define HW_NCPU 3 /* int: number of cpus */ +#define HW_BYTEORDER 4 /* int: machine byte order */ +#define HW_PHYSMEM 5 /* int: total memory */ +#define HW_USERMEM 6 /* int: non-kernel memory */ +#define HW_PAGESIZE 7 /* int: software page size */ +#define HW_DISKNAMES 8 /* strings: disk drive names */ +#define HW_DISKSTATS 9 /* struct: diskstats[] */ +#define HW_FLOATINGPT 10 /* int: has HW floating point? */ +#define HW_DEVCONF 11 /* node: device configuration */ +#define HW_MAXID 12 /* number of valid hw ids */ + +#define CTL_HW_NAMES { \ + { 0, 0 }, \ + { "machine", CTLTYPE_STRING }, \ + { "model", CTLTYPE_STRING }, \ + { "ncpu", CTLTYPE_INT }, \ + { "byteorder", CTLTYPE_INT }, \ + { "physmem", CTLTYPE_INT }, \ + { "usermem", CTLTYPE_INT }, \ + { "pagesize", CTLTYPE_INT }, \ + { "disknames", CTLTYPE_STRUCT }, \ + { "diskstats", CTLTYPE_STRUCT }, \ + { "floatingpoint", CTLTYPE_INT }, \ + { "devconf", CTLTYPE_NODE }, \ +} + +/* + * CTL_USER definitions + */ +#define USER_CS_PATH 1 /* string: _CS_PATH */ +#define USER_BC_BASE_MAX 2 /* int: BC_BASE_MAX */ +#define USER_BC_DIM_MAX 3 /* int: BC_DIM_MAX */ +#define USER_BC_SCALE_MAX 4 /* int: BC_SCALE_MAX */ +#define USER_BC_STRING_MAX 5 /* int: BC_STRING_MAX */ +#define USER_COLL_WEIGHTS_MAX 6 /* int: COLL_WEIGHTS_MAX */ +#define USER_EXPR_NEST_MAX 7 /* int: EXPR_NEST_MAX */ +#define USER_LINE_MAX 8 /* int: LINE_MAX */ +#define USER_RE_DUP_MAX 9 /* int: RE_DUP_MAX */ +#define USER_POSIX2_VERSION 10 /* int: POSIX2_VERSION */ +#define USER_POSIX2_C_BIND 11 /* int: POSIX2_C_BIND */ +#define USER_POSIX2_C_DEV 12 /* int: POSIX2_C_DEV */ +#define USER_POSIX2_CHAR_TERM 13 /* int: POSIX2_CHAR_TERM */ +#define USER_POSIX2_FORT_DEV 14 /* int: POSIX2_FORT_DEV */ +#define USER_POSIX2_FORT_RUN 15 /* int: POSIX2_FORT_RUN */ +#define USER_POSIX2_LOCALEDEF 16 /* int: POSIX2_LOCALEDEF */ +#define USER_POSIX2_SW_DEV 17 /* int: POSIX2_SW_DEV */ +#define USER_POSIX2_UPE 18 /* int: POSIX2_UPE */ +#define USER_STREAM_MAX 19 /* int: POSIX2_STREAM_MAX */ +#define USER_TZNAME_MAX 20 /* int: POSIX2_TZNAME_MAX */ +#define USER_MAXID 21 /* number of valid user ids */ + +#define CTL_USER_NAMES { \ + { 0, 0 }, \ + { "cs_path", CTLTYPE_STRING }, \ + { "bc_base_max", CTLTYPE_INT }, \ + { "bc_dim_max", CTLTYPE_INT }, \ + { "bc_scale_max", CTLTYPE_INT }, \ + { "bc_string_max", CTLTYPE_INT }, \ + { "coll_weights_max", CTLTYPE_INT }, \ + { "expr_nest_max", CTLTYPE_INT }, \ + { "line_max", CTLTYPE_INT }, \ + { "re_dup_max", CTLTYPE_INT }, \ + { "posix2_version", CTLTYPE_INT }, \ + { "posix2_c_bind", CTLTYPE_INT }, \ + { "posix2_c_dev", CTLTYPE_INT }, \ + { "posix2_char_term", CTLTYPE_INT }, \ + { "posix2_fort_dev", CTLTYPE_INT }, \ + { "posix2_fort_run", CTLTYPE_INT }, \ + { "posix2_localedef", CTLTYPE_INT }, \ + { "posix2_sw_dev", CTLTYPE_INT }, \ + { "posix2_upe", CTLTYPE_INT }, \ + { "stream_max", CTLTYPE_INT }, \ + { "tzname_max", CTLTYPE_INT }, \ +} + +/* + * CTL_DEBUG definitions + * + * Second level identifier specifies which debug variable. + * Third level identifier specifies which stucture component. + */ +#define CTL_DEBUG_NAME 0 /* string: variable name */ +#define CTL_DEBUG_VALUE 1 /* int: variable value */ +#define CTL_DEBUG_MAXID 20 + +#ifdef KERNEL +#if defined(DEBUG) || defined(DIAGNOSTIC) +/* + * CTL_DEBUG variables. + * + * These are declared as separate variables so that they can be + * individually initialized at the location of their associated + * variable. The loader prevents multiple use by issuing errors + * if a variable is initialized in more than one place. They are + * aggregated into an array in debug_sysctl(), so that it can + * conveniently locate them when querried. If more debugging + * variables are added, they must also be declared here and also + * entered into the array. + */ +struct ctldebug { + char *debugname; /* name of debugging variable */ + int *debugvar; /* pointer to debugging variable */ +}; +extern struct ctldebug debug0, debug1, debug2, debug3, debug4; +extern struct ctldebug debug5, debug6, debug7, debug8, debug9; +extern struct ctldebug debug10, debug11, debug12, debug13, debug14; +extern struct ctldebug debug15, debug16, debug17, debug18, debug19; +#endif /* DEBUG */ + +extern char cpu_model[]; +extern int hw_float; +extern char machine[]; +extern char osrelease[]; +extern char ostype[]; + +/* + * Internal sysctl function calling convention: + * + * (*sysctlfn)(name, namelen, oldval, oldlenp, newval, newlen, p); + * + * The name parameter points at the next component of the name to be + * interpreted. The namelen parameter is the number of integers in + * the name. + */ +typedef int (sysctlfn) + __P((int *, u_int, void *, size_t *, void *, size_t, struct proc *)); + +sysctlfn cpu_sysctl; +sysctlfn dev_sysctl; +sysctlfn fs_sysctl; +sysctlfn hw_sysctl; +sysctlfn kern_sysctl; +sysctlfn net_sysctl; +sysctlfn ntp_sysctl; +sysctlfn vm_sysctl; + +int sysctl_int __P((void *, size_t *, void *, size_t, int *)); +int sysctl_rdint __P((void *, size_t *, void *, int)); +int sysctl_string __P((void *, size_t *, void *, size_t, char *, int)); +int sysctl_rdstring __P((void *, size_t *, void *, char *)); +int sysctl_rdstruct __P((void *, size_t *, void *, void *, int)); +int sysctl_struct __P((void *oldp, size_t *, void *, size_t, void *, int)); +void fill_eproc __P((struct proc *, struct eproc *)); + +int sysctl_clockrate __P((char *, size_t*)); +int sysctl_vnode __P((char *, size_t*)); +int sysctl_file __P((char *, size_t*)); +int sysctl_doproc __P((int *, u_int, char *, size_t*)); +int sysctl_doprof __P((int *, u_int, void *, size_t *, void *, size_t)); + +#else /* !KERNEL */ +#include <sys/cdefs.h> + +__BEGIN_DECLS +int sysctl __P((int *, u_int, void *, size_t *, void *, size_t)); +__END_DECLS +#endif /* KERNEL */ + +#endif /* !_SYS_SYSCTL_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/syslimits.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/syslimits.h new file mode 100644 index 00000000000..502474c96de --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/syslimits.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)syslimits.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _SYS_SYSLIMITS_H_ +#define _SYS_SYSLIMITS_H_ + +#define ARG_MAX 65536 /* max bytes for an exec function */ +#ifndef CHILD_MAX +#define CHILD_MAX 40 /* max simultaneous processes */ +#endif +#define LINK_MAX 32767 /* max file link count */ +#define MAX_CANON 255 /* max bytes in term canon input line */ +#define MAX_INPUT 255 /* max bytes in terminal input */ +#define NAME_MAX 255 /* max bytes in a file name */ +#define NGROUPS_MAX 16 /* max supplemental group id's */ +#ifndef OPEN_MAX +#define OPEN_MAX 64 /* max open files per process */ +#endif +#ifndef PATH_MAX +#define PATH_MAX 1024 /* max bytes in pathname */ +#endif +#define PIPE_BUF 512 /* max bytes for atomic pipe writes */ + +#define BC_BASE_MAX 99 /* max ibase/obase values in bc(1) */ +#define BC_DIM_MAX 2048 /* max array elements in bc(1) */ +#define BC_SCALE_MAX 99 /* max scale value in bc(1) */ +#define BC_STRING_MAX 1000 /* max const string length in bc(1) */ +#define COLL_WEIGHTS_MAX 0 /* max weights for order keyword */ +#define EXPR_NEST_MAX 32 /* max expressions nested in expr(1) */ +#define LINE_MAX 2048 /* max bytes in an input line */ +#define RE_DUP_MAX 255 /* max RE's in interval notation */ + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/syslog.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/syslog.h new file mode 100644 index 00000000000..34f7c2a89a7 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/syslog.h @@ -0,0 +1,202 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)syslog.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _SYS_SYSLOG_H_ +#define _SYS_SYSLOG_H_ + +#define _PATH_LOG "/dev/log" + +/* + * priorities/facilities are encoded into a single 32-bit quantity, where the + * bottom 3 bits are the priority (0-7) and the top 28 bits are the facility + * (0-big number). Both the priorities and the facilities map roughly + * one-to-one to strings in the syslogd(8) source code. This mapping is + * included in this file. + * + * priorities (these are ordered) + */ +#define LOG_EMERG 0 /* system is unusable */ +#define LOG_ALERT 1 /* action must be taken immediately */ +#define LOG_CRIT 2 /* critical conditions */ +#define LOG_ERR 3 /* error conditions */ +#define LOG_WARNING 4 /* warning conditions */ +#define LOG_NOTICE 5 /* normal but significant condition */ +#define LOG_INFO 6 /* informational */ +#define LOG_DEBUG 7 /* debug-level messages */ + +#define LOG_PRIMASK 0x07 /* mask to extract priority part (internal) */ + /* extract priority */ +#define LOG_PRI(p) ((p) & LOG_PRIMASK) +#define LOG_MAKEPRI(fac, pri) (((fac) << 3) | (pri)) + +#ifdef SYSLOG_NAMES +#define INTERNAL_NOPRI 0x10 /* the "no priority" priority */ + /* mark "facility" */ +#define INTERNAL_MARK LOG_MAKEPRI(LOG_NFACILITIES, 0) +typedef struct _code { + char *c_name; + int c_val; +} CODE; + +CODE prioritynames[] = { + "alert", LOG_ALERT, + "crit", LOG_CRIT, + "debug", LOG_DEBUG, + "emerg", LOG_EMERG, + "err", LOG_ERR, + "error", LOG_ERR, /* DEPRECATED */ + "info", LOG_INFO, + "none", INTERNAL_NOPRI, /* INTERNAL */ + "notice", LOG_NOTICE, + "panic", LOG_EMERG, /* DEPRECATED */ + "warn", LOG_WARNING, /* DEPRECATED */ + "warning", LOG_WARNING, + NULL, -1, +}; +#endif + +/* facility codes */ +#define LOG_KERN (0<<3) /* kernel messages */ +#define LOG_USER (1<<3) /* random user-level messages */ +#define LOG_MAIL (2<<3) /* mail system */ +#define LOG_DAEMON (3<<3) /* system daemons */ +#define LOG_AUTH (4<<3) /* security/authorization messages */ +#define LOG_SYSLOG (5<<3) /* messages generated internally by syslogd */ +#define LOG_LPR (6<<3) /* line printer subsystem */ +#define LOG_NEWS (7<<3) /* network news subsystem */ +#define LOG_UUCP (8<<3) /* UUCP subsystem */ +#define LOG_CRON (9<<3) /* clock daemon */ +#define LOG_AUTHPRIV (10<<3) /* security/authorization messages (private) */ +#define LOG_FTP (11<<3) /* ftp daemon */ + + /* other codes through 15 reserved for system use */ +#define LOG_LOCAL0 (16<<3) /* reserved for local use */ +#define LOG_LOCAL1 (17<<3) /* reserved for local use */ +#define LOG_LOCAL2 (18<<3) /* reserved for local use */ +#define LOG_LOCAL3 (19<<3) /* reserved for local use */ +#define LOG_LOCAL4 (20<<3) /* reserved for local use */ +#define LOG_LOCAL5 (21<<3) /* reserved for local use */ +#define LOG_LOCAL6 (22<<3) /* reserved for local use */ +#define LOG_LOCAL7 (23<<3) /* reserved for local use */ + +#define LOG_NFACILITIES 24 /* current number of facilities */ +#define LOG_FACMASK 0x03f8 /* mask to extract facility part */ + /* facility of pri */ +#define LOG_FAC(p) (((p) & LOG_FACMASK) >> 3) + +#ifdef SYSLOG_NAMES +CODE facilitynames[] = { + "auth", LOG_AUTH, + "authpriv", LOG_AUTHPRIV, + "cron", LOG_CRON, + "daemon", LOG_DAEMON, + "ftp", LOG_FTP, + "kern", LOG_KERN, + "lpr", LOG_LPR, + "mail", LOG_MAIL, + "mark", INTERNAL_MARK, /* INTERNAL */ + "news", LOG_NEWS, + "security", LOG_AUTH, /* DEPRECATED */ + "syslog", LOG_SYSLOG, + "user", LOG_USER, + "uucp", LOG_UUCP, + "local0", LOG_LOCAL0, + "local1", LOG_LOCAL1, + "local2", LOG_LOCAL2, + "local3", LOG_LOCAL3, + "local4", LOG_LOCAL4, + "local5", LOG_LOCAL5, + "local6", LOG_LOCAL6, + "local7", LOG_LOCAL7, + NULL, -1, +}; +#endif + +#ifdef KERNEL +#define LOG_PRINTF -1 /* pseudo-priority to indicate use of printf */ +#endif + +/* + * arguments to setlogmask. + */ +#define LOG_MASK(pri) (1 << (pri)) /* mask for one priority */ +#define LOG_UPTO(pri) ((1 << ((pri)+1)) - 1) /* all priorities through pri */ + +/* + * Option flags for openlog. + * + * LOG_ODELAY no longer does anything. + * LOG_NDELAY is the inverse of what it used to be. + */ +#define LOG_PID 0x01 /* log the pid with each message */ +#define LOG_CONS 0x02 /* log on the console if errors in sending */ +#define LOG_ODELAY 0x04 /* delay open until first syslog() (default) */ +#define LOG_NDELAY 0x08 /* don't delay open */ +#define LOG_NOWAIT 0x10 /* don't wait for console forks: DEPRECATED */ +#define LOG_PERROR 0x20 /* log to stderr as well */ + +#ifdef KERNEL + +#else /* not KERNEL */ + +/* + * Don't use va_list in the vsyslog() prototype. Va_list is typedef'd in two + * places (<machine/varargs.h> and <machine/stdarg.h>), so if we include one + * of them here we may collide with the utility's includes. It's unreasonable + * for utilities to have to include one of them to include syslog.h, so we get + * _BSD_VA_LIST_ from <machine/ansi.h> and use it. + */ +#include <machine/ansi.h> +#include <sys/cdefs.h> + +__BEGIN_DECLS +void closelog __P((void)); +void openlog __P((const char *, int, int)); +int setlogmask __P((int)); +void syslog __P((int, const char *, ...)); +void vsyslog __P((int, const char *, _BSD_VA_LIST_)); +__END_DECLS + +#ifdef OSKIT +/* + * Silliness. + */ +typedef void (*oskit_syslogger_t)(int, const char *, ...); +extern oskit_syslogger_t oskit_libc_syslogger; +#endif + +#endif /* !KERNEL */ + +#endif diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/systm.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/systm.h new file mode 100644 index 00000000000..fc5bb5a941a --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/systm.h @@ -0,0 +1,245 @@ +/*- + * Copyright (c) 1982, 1988, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)systm.h 8.4 (Berkeley) 2/23/94 + */ + +#ifndef _SYS_SYSTM_H_ +#define _SYS_SYSTM_H_ + +#include <machine/cpufunc.h> +#include <machine/stdarg.h> + +/* + * The `securelevel' variable controls the security level of the system. + * It can only be decreased by process 1 (/sbin/init). + * + * Security levels are as follows: + * -1 permannently insecure mode - always run system in level 0 mode. + * 0 insecure mode - immutable and append-only flags make be turned off. + * All devices may be read or written subject to permission modes. + * 1 secure mode - immutable and append-only flags may not be changed; + * raw disks of mounted filesystems, /dev/mem, and /dev/kmem are + * read-only. + * 2 highly secure mode - same as (1) plus raw disks are always + * read-only whether mounted or not. This level precludes tampering + * with filesystems by unmounting them, but also inhibits running + * newfs while the system is secured. + * + * In normal operation, the system runs in level 0 mode while single user + * and in level 1 mode while multiuser. If level 2 mode is desired while + * running multiuser, it can be set in the multiuser startup script + * (/etc/rc.local) using sysctl(1). If it is desired to run the system + * in level 0 mode while multiuser, initialize the variable securelevel + * in /sys/kern/kern_sysctl.c to -1. Note that it is NOT initialized to + * zero as that would allow the kernel binary to be patched to -1. + * Without initialization, securelevel loads in the BSS area which only + * comes into existence when the kernel is loaded and hence cannot be + * patched by a stalking hacker. + */ +extern int securelevel; /* system security level */ + +extern int cold; /* nonzero if we are doing a cold boot */ +extern const char *panicstr; /* panic message */ +extern char version[]; /* system version */ +extern char copyright[]; /* system copyright */ + +extern int nblkdev; /* number of entries in bdevsw */ +extern int nchrdev; /* number of entries in cdevsw */ +extern struct swdevt *swdevt; /* swap-device information */ +extern int nswdev; /* number of swap devices */ +extern int nswap; /* size of swap space */ + +extern int selwait; /* select timeout address */ + +extern u_char curpriority; /* priority of current process */ + +extern int physmem; /* physical memory */ + +extern dev_t dumpdev; /* dump device */ +extern long dumplo; /* offset into dumpdev */ + +extern dev_t rootdev; /* root device */ +extern struct vnode *rootvp; /* vnode equivalent to above */ + +extern dev_t swapdev; /* swapping device */ +extern struct vnode *swapdev_vp;/* vnode equivalent to above */ + +extern int boothowto; /* reboot flags, from console subsystem */ + +/* + * General function declarations. + */ +int nullop __P((void)); +int enodev __P((void)); +int enoioctl __P((void)); +int enxio __P((void)); +int eopnotsupp __P((void)); +int seltrue __P((dev_t dev, int which, struct proc *p)); +int ureadc __P((int, struct uio *)); +void *hashinit __P((int count, int type, u_long *hashmask)); +void *phashinit __P((int count, int type, u_long *nentries)); + +__dead void panic __P((const char *, ...)) __dead2; +__dead void boot __P((int)) __dead2; +void tablefull __P((const char *)); +void addlog __P((const char *, ...)); +#ifndef __REACTOS__ +void log __P((int, const char *, ...)); +void printf __P((const char *, ...)); +#else +#include <oskitfreebsd.h> +#include <oskitdebug.h> +#define log(x,...) OS_DbgPrint(x,(__VA_ARGS__)) +#endif +void uprintf __P((const char *, ...)); +int sprintf __P((char *buf, const char *, ...)); +void ttyprintf __P((struct tty *, const char *, ...)); +void kprintf __P((const char *fmt, int flags, struct tty *tp, va_list ap)); + +#ifndef __REACTOS__ +void bcopy __P((const void *from, void *to, size_t len)); +#endif +void ovbcopy __P((const void *from, void *to, size_t len)); +void blkclr __P((void *buf, u_int len)); +void bzero __P((void *buf, size_t len)); + +#ifndef __REACTOS__ +void *memcpy __P((void *to, const void *from, size_t len)); +#endif + +int copystr __P((void *kfaddr, void *kdaddr, u_int len, u_int *done)); +int copyinstr __P((void *udaddr, void *kaddr, u_int len, u_int *done)); +int copyoutstr __P((void *kaddr, void *udaddr, u_int len, u_int *done)); +int copyin __P((void *udaddr, void *kaddr, u_int len)); +int copyout __P((void *kaddr, void *udaddr, u_int len)); + +int fubyte __P((void *base)); +int fuibyte __P((void *base)); +int subyte __P((void *base, int byte)); +int suibyte __P((void *base, int byte)); +int fuword __P((void *base)); +int fuiword __P((void *base)); +int suword __P((void *base, int word)); +int susword __P((void *base, int word)); +int suiword __P((void *base, int word)); + +int hzto __P((struct timeval *tv)); +void realitexpire __P((void *)); + +struct clockframe; +void hardclock __P((struct clockframe *frame)); +void softclock __P((void)); +void statclock __P((struct clockframe *frame)); + +void initclocks __P((void)); + +void startprofclock __P((struct proc *)); +void stopprofclock __P((struct proc *)); +void setstatclockrate __P((int hzrate)); + +void hardupdate __P((long)); +#include <sys/libkern.h> + +/* Initialize the world */ +extern void consinit(void); +extern void kmeminit(void); +extern void cpu_startup(void); +extern void usrinfoinit(void); +extern void rqinit(void); +extern void vfsinit(void); +extern void mbinit(void); +extern void clist_init(void); +extern void ifinit(void); +extern void domaininit(void); +extern void cpu_initclocks(void); +extern void vntblinit(void); +extern void nchinit(void); + +/* Finalize the world. */ +void shutdown_nice __P((void)); + +extern __dead void vm_pageout(void) __dead2; /* pagedaemon, called in proc 2 */ +extern __dead void vfs_update(void) __dead2; /* update, called in proc 3 */ +extern __dead void scheduler(void) __dead2; /* sched, called in process 0 */ + +/* + * Kernel to clock driver interface. + */ +void inittodr __P((time_t base)); +void resettodr __P((void)); +void startrtclock __P((void)); + +/* Timeouts */ +typedef void (timeout_t)(void *); /* actual timeout function type */ +typedef timeout_t *timeout_func_t; /* a pointer to this type */ + +void timeout(timeout_func_t, void *, int); +void untimeout(timeout_func_t, void *); +void logwakeup __P((void)); + +/* Syscalls that are called internally. */ +struct close_args { + int fd; +}; +int close __P((struct proc *, struct close_args *uap, int *retval)); +struct execve_args { + char *fname; + char **argv; + char **envv; +}; +int execve __P((struct proc *, struct execve_args *, int *retval)); +struct fork_args { + int dummy; +}; +int fork __P((struct proc *, struct fork_args *, int retval[])); +struct sync_args { + int dummy; +}; +int sync __P((struct proc *, struct sync_args *, int *retval)); +struct wait_args { + int pid; + int *status; + int options; + struct rusage *rusage; +#if defined(COMPAT_43) || defined(COMPAT_IBCS2) + int compat; /* pseudo */ +#endif +}; +int wait1 __P((struct proc *, struct wait_args *, int retval[])); + +#endif /* !_SYS_SYSTM_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/time.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/time.h new file mode 100644 index 00000000000..dc28aa72865 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/time.h @@ -0,0 +1,135 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)time.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _SYS_TIME_H_ +#define _SYS_TIME_H_ + +/* + * Structure returned by gettimeofday(2) system call, + * and used in other calls. + */ +struct timeval { + long tv_sec; /* seconds */ + long tv_usec; /* and microseconds */ +}; + +/* + * Structure defined by POSIX.4 to be like a timeval. + */ +struct timespec { + long ts_sec; /* seconds */ + long ts_nsec; /* and nanoseconds */ +}; + +#define TIMEVAL_TO_TIMESPEC(tv, ts) { \ + (ts)->ts_sec = (tv)->tv_sec; \ + (ts)->ts_nsec = (tv)->tv_usec * 1000; \ +} +#define TIMESPEC_TO_TIMEVAL(tv, ts) { \ + (tv)->tv_sec = (ts)->ts_sec; \ + (tv)->tv_usec = (ts)->ts_nsec / 1000; \ +} + +struct timezone { + int tz_minuteswest; /* minutes west of Greenwich */ + int tz_dsttime; /* type of dst correction */ +}; +#define DST_NONE 0 /* not on dst */ +#define DST_USA 1 /* USA style dst */ +#define DST_AUST 2 /* Australian style dst */ +#define DST_WET 3 /* Western European dst */ +#define DST_MET 4 /* Middle European dst */ +#define DST_EET 5 /* Eastern European dst */ +#define DST_CAN 6 /* Canada */ + +/* Operations on timevals. */ +#define timerclear(tvp) (tvp)->tv_sec = (tvp)->tv_usec = 0 +#define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec) +#define timercmp(tvp, uvp, cmp) \ + (((tvp)->tv_sec == (uvp)->tv_sec) ? \ + ((tvp)->tv_usec cmp (uvp)->tv_usec) : \ + ((tvp)->tv_sec cmp (uvp)->tv_sec)) + +/* + * Names of the interval timers, and structure + * defining a timer setting. + */ +#define ITIMER_REAL 0 +#define ITIMER_VIRTUAL 1 +#define ITIMER_PROF 2 + +struct itimerval { + struct timeval it_interval; /* timer interval */ + struct timeval it_value; /* current value */ +}; + +/* + * Getkerninfo clock information structure + */ +struct clockinfo { + int hz; /* clock frequency */ + int tick; /* micro-seconds per hz tick */ + int stathz; /* statistics clock frequency */ + int profhz; /* profiling clock frequency */ +}; + +#ifdef KERNEL + +int itimerdecr __P((struct itimerval *itp,int usec)); +int itimerfix __P((struct timeval *)); +void microtime __P((struct timeval *)); +void timevaladd __P((struct timeval *, struct timeval *)); +void timevalfix __P((struct timeval *)); +void timevalsub __P((struct timeval *, struct timeval *)); + +#else /* not KERNEL */ +#include <time.h> + +#ifndef _POSIX_SOURCE +#include <sys/cdefs.h> + +__BEGIN_DECLS +int adjtime __P((const struct timeval *, struct timeval *)); +int getitimer __P((int, struct itimerval *)); +int gettimeofday __P((struct timeval *, struct timezone *)); +int setitimer __P((int, const struct itimerval *, struct itimerval *)); +int settimeofday __P((const struct timeval *, const struct timezone *)); +int utimes __P((const char *, const struct timeval *)); +__END_DECLS +#endif /* !POSIX */ + +#endif /* !KERNEL */ + +#endif /* !_SYS_TIME_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/ttycom.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/ttycom.h new file mode 100644 index 00000000000..3ae6ee516e0 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/ttycom.h @@ -0,0 +1,139 @@ +/*- + * Copyright (c) 1982, 1986, 1990, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ttycom.h 8.1 (Berkeley) 3/28/94 + */ + +#ifndef _SYS_TTYCOM_H_ +#define _SYS_TTYCOM_H_ + +#include <sys/ioccom.h> + +/* + * Tty ioctl's except for those supported only for backwards compatibility + * with the old tty driver. + */ + +/* + * Window/terminal size structure. This information is stored by the kernel + * in order to provide a consistent interface, but is not used by the kernel. + */ +struct winsize { + unsigned short ws_row; /* rows, in characters */ + unsigned short ws_col; /* columns, in characters */ + unsigned short ws_xpixel; /* horizontal size, pixels */ + unsigned short ws_ypixel; /* vertical size, pixels */ +}; + +#define TIOCMODG _IOR('t', 3, int) /* get modem control state */ +#define TIOCMODS _IOW('t', 4, int) /* set modem control state */ +#define TIOCM_LE 0001 /* line enable */ +#define TIOCM_DTR 0002 /* data terminal ready */ +#define TIOCM_RTS 0004 /* request to send */ +#define TIOCM_ST 0010 /* secondary transmit */ +#define TIOCM_SR 0020 /* secondary receive */ +#define TIOCM_CTS 0040 /* clear to send */ +#define TIOCM_CAR 0100 /* carrier detect */ +#define TIOCM_CD TIOCM_CAR +#define TIOCM_RNG 0200 /* ring */ +#define TIOCM_RI TIOCM_RNG +#define TIOCM_DSR 0400 /* data set ready */ + /* 8-10 compat */ +#define TIOCEXCL _IO('t', 13) /* set exclusive use of tty */ +#define TIOCNXCL _IO('t', 14) /* reset exclusive use of tty */ + /* 15 unused */ +#define TIOCFLUSH _IOW('t', 16, int) /* flush buffers */ + /* 17-18 compat */ +#define TIOCGETA _IOR('t', 19, struct termios) /* get termios struct */ +#define TIOCSETA _IOW('t', 20, struct termios) /* set termios struct */ +#define TIOCSETAW _IOW('t', 21, struct termios) /* drain output, set */ +#define TIOCSETAF _IOW('t', 22, struct termios) /* drn out, fls in, set */ +#define TIOCGETD _IOR('t', 26, int) /* get line discipline */ +#define TIOCSETD _IOW('t', 27, int) /* set line discipline */ + /* 127-124 compat */ +#define TIOCSBRK _IO('t', 123) /* set break bit */ +#define TIOCCBRK _IO('t', 122) /* clear break bit */ +#define TIOCSDTR _IO('t', 121) /* set data terminal ready */ +#define TIOCCDTR _IO('t', 120) /* clear data terminal ready */ +#define TIOCGPGRP _IOR('t', 119, int) /* get pgrp of tty */ +#define TIOCSPGRP _IOW('t', 118, int) /* set pgrp of tty */ + /* 117-116 compat */ +#define TIOCOUTQ _IOR('t', 115, int) /* output queue size */ +#define TIOCSTI _IOW('t', 114, char) /* simulate terminal input */ +#define TIOCNOTTY _IO('t', 113) /* void tty association */ +#define TIOCPKT _IOW('t', 112, int) /* pty: set/clear packet mode */ +#define TIOCPKT_DATA 0x00 /* data packet */ +#define TIOCPKT_FLUSHREAD 0x01 /* flush packet */ +#define TIOCPKT_FLUSHWRITE 0x02 /* flush packet */ +#define TIOCPKT_STOP 0x04 /* stop output */ +#define TIOCPKT_START 0x08 /* start output */ +#define TIOCPKT_NOSTOP 0x10 /* no more ^S, ^Q */ +#define TIOCPKT_DOSTOP 0x20 /* now do ^S ^Q */ +#define TIOCPKT_IOCTL 0x40 /* state change of pty driver */ +#define TIOCSTOP _IO('t', 111) /* stop output, like ^S */ +#define TIOCSTART _IO('t', 110) /* start output, like ^Q */ +#define TIOCMSET _IOW('t', 109, int) /* set all modem bits */ +#define TIOCMBIS _IOW('t', 108, int) /* bis modem bits */ +#define TIOCMBIC _IOW('t', 107, int) /* bic modem bits */ +#define TIOCMGET _IOR('t', 106, int) /* get all modem bits */ +#define TIOCREMOTE _IOW('t', 105, int) /* remote input editing */ +#define TIOCGWINSZ _IOR('t', 104, struct winsize) /* get window size */ +#define TIOCSWINSZ _IOW('t', 103, struct winsize) /* set window size */ +#define TIOCUCNTL _IOW('t', 102, int) /* pty: set/clr usr cntl mode */ +#define TIOCSTAT _IO('t', 101) /* simulate a control-T status msg */ +#define UIOCCMD(n) _IO('u', n) /* usr cntl op "n" */ +#define TIOCCONS _IOW('t', 98, int) /* become virtual console */ +#define TIOCSCTTY _IO('t', 97) /* become controlling tty */ +#define TIOCEXT _IOW('t', 96, int) /* pty: external processing */ +#define TIOCSIG _IO('t', 95) /* pty: generate signal */ +#define TIOCDRAIN _IO('t', 94) /* wait till output drained */ +#define TIOCMSDTRWAIT _IOW('t', 91, int) /* modem: set wait on close */ +#define TIOCMGDTRWAIT _IOR('t', 90, int) /* modem: get wait on close */ +#define TIOCTIMESTAMP _IOR('t', 89, struct timeval) /* get timestamp of + last interrupt for xntp. */ +#define TIOCDSIMICROCODE _IO('t', 85) /* Download microcode to + DSI Softmodem */ +#define TIOCSDRAINWAIT _IOW('t', 87, int) /* set ttywait timeout */ +#define TIOCGDRAINWAIT _IOR('t', 86, int) /* get ttywait timeout */ + +#define TTYDISC 0 /* termios tty line discipline */ +#define TABLDISC 3 /* tablet discipline */ +#define SLIPDISC 4 /* serial IP discipline */ +#define PPPDISC 5 /* PPP discipline */ + + +#endif /* !_SYS_TTYCOM_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/types.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/types.h new file mode 100644 index 00000000000..dbcacb42530 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/types.h @@ -0,0 +1,167 @@ +/*- + * Copyright (c) 1982, 1986, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)types.h 8.4 (Berkeley) 1/21/94 + */ + +#ifndef _SYS_TYPES_H_ +#define _SYS_TYPES_H_ + +#include <sys/cdefs.h> + +/* Machine type dependent parameters. */ +#include <machine/endian.h> + +#if !defined(_POSIX_SOURCE) +typedef unsigned char u_char; +typedef unsigned short u_short; +typedef unsigned int u_int; +typedef unsigned long u_long; +typedef unsigned short ushort; /* Sys V compatibility */ +typedef unsigned int uint; /* Sys V compatibility */ + +typedef unsigned long long u_quad_t; /* quads */ +typedef long long quad_t; +typedef quad_t * qaddr_t; + +typedef char * caddr_t; /* core address */ +typedef long daddr_t; /* disk address */ +typedef unsigned long dev_t; /* device number */ +typedef unsigned long fixpt_t; /* fixed point number */ +typedef unsigned long gid_t; /* group id */ +typedef unsigned long ino_t; /* inode number */ +typedef unsigned short mode_t; /* permissions */ +typedef unsigned short nlink_t; /* link count */ +typedef quad_t off_t; /* file offset */ +typedef long pid_t; /* process id */ +typedef long segsz_t; /* segment size */ +typedef long swblk_t; /* swap offset */ +typedef unsigned long uid_t; /* user id */ +#endif + +/* + * This belongs in unistd.h, but is placed here to ensure that programs + * casting the second parameter of lseek to off_t will get the correct + * version of lseek. + */ +#ifndef KERNEL +__BEGIN_DECLS +off_t lseek __P((int, off_t, int)); +__END_DECLS +#endif + +#ifndef _POSIX_SOURCE +/* + * minor() gives a cookie instead of an index since we don't want to + * change the meanings of bits 0-15 or waste time and space shifting + * bits 16-31 for devices that don't use them. + */ +#define major(x) ((int)(((u_int)(x) >> 8)&0xff)) /* major number */ +#define minor(x) ((int)((x)&0xffff00ff)) /* minor number */ +#define makedev(x,y) ((dev_t)(((x)<<8) | (y))) /* create dev_t */ +#endif + +#include <machine/ansi.h> +#include <machine/types.h> + +#ifdef _BSD_CLOCK_T_ +typedef _BSD_CLOCK_T_ clock_t; +#undef _BSD_CLOCK_T_ +#endif + +#ifdef _BSD_SIZE_T_ +typedef _BSD_SIZE_T_ size_t; +#undef _BSD_SIZE_T_ +#endif + +#ifdef _BSD_SSIZE_T_ +typedef _BSD_SSIZE_T_ ssize_t; +#undef _BSD_SSIZE_T_ +#endif + +#ifdef _BSD_TIME_T_ +typedef _BSD_TIME_T_ time_t; +#undef _BSD_TIME_T_ +#endif + +#ifndef _POSIX_SOURCE +#define NBBY 8 /* number of bits in a byte */ + +/* + * Select uses bit masks of file descriptors in longs. These macros + * manipulate such bit fields (the filesystem macros use chars). + * FD_SETSIZE may be defined by the user, but the default here should + * be enough for most uses. + */ +#ifndef FD_SETSIZE +#define FD_SETSIZE 256 +#endif + +typedef long fd_mask; +#define NFDBITS (sizeof(fd_mask) * NBBY) /* bits per mask */ + +#ifndef howmany +#define howmany(x, y) (((x)+((y)-1))/(y)) +#endif + +typedef struct fd_set { + fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)]; +} fd_set; + +#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS))) +#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS))) +#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS))) +#define FD_COPY(f, t) bcopy(f, t, sizeof(*(f))) +#define FD_ZERO(p) bzero(p, sizeof(*(p))) + +#if defined(__STDC__) && defined(KERNEL) +/* + * Forward structure declarations for function prototypes. We include the + * common structures that cross subsystem boundaries here; others are mostly + * used in the same place that the structure is defined. + */ +struct proc; +struct pgrp; +struct ucred; +struct rusage; +struct file; +struct buf; +struct tty; +struct uio; +#endif +#endif /* !_POSIX_SOURCE */ +#endif /* !_SYS_TYPES_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/ucred.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/ucred.h new file mode 100644 index 00000000000..0d74bd9d02e --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/ucred.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ucred.h 8.2 (Berkeley) 1/4/94 + */ + +#ifndef _SYS_UCRED_H_ +#define _SYS_UCRED_H_ + +/* + * Credentials. + */ +struct ucred { + u_short cr_ref; /* reference count */ + uid_t cr_uid; /* effective user id */ + short cr_ngroups; /* number of groups */ + gid_t cr_groups[NGROUPS]; /* groups */ +}; +#define cr_gid cr_groups[0] +#define NOCRED ((struct ucred *)-1) /* no credential available */ +#define FSCRED ((struct ucred *)-2) /* filesystem credential */ + +#ifdef KERNEL +#define crhold(cr) (cr)->cr_ref++ +struct ucred *crget(void); +struct ucred *crcopy(struct ucred *); +struct ucred *crdup(struct ucred *); +extern void crfree(struct ucred *); +extern int suser(struct ucred *, u_short *); +int groupmember __P((gid_t, struct ucred *)); + +#endif /* KERNEL */ + +#endif /* !_SYS_UCRED_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/uio.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/uio.h new file mode 100644 index 00000000000..35e46ab1021 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/uio.h @@ -0,0 +1,91 @@ +/* + * Copyright (c) 1982, 1986, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)uio.h 8.5 (Berkeley) 2/22/94 + */ + +#ifndef _SYS_UIO_H_ +#define _SYS_UIO_H_ + +/* + * XXX + * iov_base should be a void *. + */ +struct iovec { + char *iov_base; /* Base address. */ + size_t iov_len; /* Length. */ +}; + +enum uio_rw { UIO_READ, UIO_WRITE }; + +/* Segment flag values. */ +enum uio_seg { + UIO_USERSPACE, /* from user data space */ + UIO_SYSSPACE, /* from system space */ + UIO_USERISPACE, /* from user I space */ + UIO_NOCOPY /* don't copy, already in object */ +}; + +#ifdef KERNEL +struct uio { + struct iovec *uio_iov; + int uio_iovcnt; + off_t uio_offset; + int uio_resid; + enum uio_seg uio_segflg; + enum uio_rw uio_rw; + struct proc *uio_procp; +}; + +/* + * Limits + */ +#define UIO_MAXIOV 1024 /* max 1K of iov's */ +#define UIO_SMALLIOV 8 /* 8 on stack, else malloc */ +#endif /* KERNEL */ + +#ifdef KERNEL + +int uiomove __P((caddr_t, int, struct uio *)); + +#else /* !KERNEL */ + +#include <sys/cdefs.h> + +__BEGIN_DECLS +ssize_t readv __P((int, const struct iovec *, int)); +ssize_t writev __P((int, const struct iovec *, int)); +__END_DECLS + +#endif /* KERNEL */ + +#endif /* !_SYS_UIO_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/unistd.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/unistd.h new file mode 100644 index 00000000000..cb4b33e1299 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/unistd.h @@ -0,0 +1,121 @@ +/* + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)unistd.h 8.2 (Berkeley) 1/7/94 + */ + +#ifndef _SYS_UNISTD_H_ +#define _SYS_UNISTD_H_ + +/* compile-time symbolic constants */ +#define _POSIX_JOB_CONTROL /* implementation supports job control */ + +/* + * This feature does not work for root according to POSIX 1003.1. + * We use the saved IDs in seteuid/setegid, which are not currently + * part of the POSIX 1003.1 specification. + */ +#define _POSIX_SAVED_IDS /* saved set-user-ID and set-group-ID */ + +#define _POSIX_VERSION 198808L +#define _POSIX2_VERSION 199212L + +/* execution-time symbolic constants */ + /* chown requires appropriate privileges */ +#define _POSIX_CHOWN_RESTRICTED 1 + /* too-long path components generate errors */ +#define _POSIX_NO_TRUNC 1 + /* may disable terminal special characters */ +#define _POSIX_VDISABLE 0xff + +/* access function */ +#define F_OK 0 /* test for existence of file */ +#define X_OK 0x01 /* test for execute or search permission */ +#define W_OK 0x02 /* test for write permission */ +#define R_OK 0x04 /* test for read permission */ + +/* whence values for lseek(2) */ +#define SEEK_SET 0 /* set file offset to offset */ +#define SEEK_CUR 1 /* set file offset to current plus offset */ +#define SEEK_END 2 /* set file offset to EOF plus offset */ + +#ifndef _POSIX_SOURCE +/* whence values for lseek(2); renamed by POSIX 1003.1 */ +#define L_SET SEEK_SET +#define L_INCR SEEK_CUR +#define L_XTND SEEK_END +#endif + +/* configurable pathname variables */ +#define _PC_LINK_MAX 1 +#define _PC_MAX_CANON 2 +#define _PC_MAX_INPUT 3 +#define _PC_NAME_MAX 4 +#define _PC_PATH_MAX 5 +#define _PC_PIPE_BUF 6 +#define _PC_CHOWN_RESTRICTED 7 +#define _PC_NO_TRUNC 8 +#define _PC_VDISABLE 9 + +/* configurable system variables */ +#define _SC_ARG_MAX 1 +#define _SC_CHILD_MAX 2 +#define _SC_CLK_TCK 3 +#define _SC_NGROUPS_MAX 4 +#define _SC_OPEN_MAX 5 +#define _SC_JOB_CONTROL 6 +#define _SC_SAVED_IDS 7 +#define _SC_VERSION 8 +#define _SC_BC_BASE_MAX 9 +#define _SC_BC_DIM_MAX 10 +#define _SC_BC_SCALE_MAX 11 +#define _SC_BC_STRING_MAX 12 +#define _SC_COLL_WEIGHTS_MAX 13 +#define _SC_EXPR_NEST_MAX 14 +#define _SC_LINE_MAX 15 +#define _SC_RE_DUP_MAX 16 +#define _SC_2_VERSION 17 +#define _SC_2_C_BIND 18 +#define _SC_2_C_DEV 19 +#define _SC_2_CHAR_TERM 20 +#define _SC_2_FORT_DEV 21 +#define _SC_2_FORT_RUN 22 +#define _SC_2_LOCALEDEF 23 +#define _SC_2_SW_DEV 24 +#define _SC_2_UPE 25 +#define _SC_STREAM_MAX 26 +#define _SC_TZNAME_MAX 27 + +/* configurable system strings */ +#define _CS_PATH 1 + +#endif /* !_SYS_UNISTD_H_ */ diff --git a/reactos/drivers/lib/oskittcp/include/memtrack.h b/reactos/drivers/lib/oskittcp/include/memtrack.h new file mode 100644 index 00000000000..b4c0bbc6b49 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/memtrack.h @@ -0,0 +1,73 @@ +#ifndef MEMTRACK_H +#define MEMTRACK_H + +#ifndef FOURCC +#define FOURCC(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d)) +#endif + +#define FBSD_MALLOC FOURCC('d','s','b','f') +#define EXALLOC_TAG FOURCC('E','x','A','l') + +#ifdef MEMTRACK +#define MTMARK() TrackDumpFL(__FILE__, __LINE__) +#define NdisAllocateBuffer(x,y,z,a,b) { \ + NdisAllocateBuffer(x,y,z,a,b); \ + if( *x == NDIS_STATUS_SUCCESS ) { \ + Track(NDIS_BUFFER_TAG, *y); \ + } \ +} +#define NdisAllocatePacket(x,y,z) { \ + NdisAllocatePacket(x,y,z); \ + if( *x == NDIS_STATUS_SUCCESS ) { \ + Track(NDIS_PACKET_TAG, *y); \ + } \ +} +#define FreeNdisPacket(x) { TI_DbgPrint(MID_TRACE,("Deleting Packet %x\n", x)); FreeNdisPacketX(x); } +#define NdisFreePacket(x) { Untrack(x); NdisFreePacket(x); } +#define NdisFreeBuffer(x) { Untrack(x); NdisFreeBuffer(x); } +#define exAllocatePool(x,y) ExAllocatePoolX(x,y,__FILE__,__LINE__) +#define exAllocatePoolWithTag(x,y,z) ExAllocatePoolX(x,y,__FILE__,__LINE__) +#define exFreePool(x) ExFreePoolX(x,__FILE__,__LINE__) + +extern LIST_ENTRY AllocatedObjectsHead; +extern KSPIN_LOCK AllocatedObjectsLock; + +typedef struct _ALLOCATION_TRACKER { + LIST_ENTRY Entry; + DWORD Tag; + PVOID Thing; + PCHAR FileName; + DWORD LineNo; +} ALLOCATION_TRACKER, *PALLOCATION_TRACKER; + +VOID TrackingInit(); +VOID TrackWithTag( DWORD Tag, PVOID Thing, PCHAR File, DWORD Line ); +#define Track(Tag,Thing) TrackWithTag(Tag,Thing,__FILE__,__LINE__) +VOID UntrackFL( PCHAR File, DWORD Line, PVOID Thing ); +#define Untrack(Thing) UntrackFL(__FILE__,__LINE__,Thing) +VOID TrackDumpFL( PCHAR File, DWORD Line ); +#define TrackDump() TrackDumpFL(__FILE__,__LINE__) +VOID TrackTag( DWORD Tag ); + +static inline PVOID ExAllocatePoolX( POOL_TYPE type, SIZE_T size, PCHAR File, ULONG Line ) { + PVOID Out = ExAllocatePool( type, size ); + if( Out ) TrackWithTag( EXALLOC_TAG, Out, File, Line ); + return Out; +} +static inline VOID ExFreePoolX( PVOID Data, PCHAR File, ULONG Line ) { + UntrackFL(File, Line, Data); + ExFreePool(Data); +} + +#define MEMTRACK_MAX_TAGS_TO_TRACK 64 +#else +#define MTMARK() +#define Track(x,y) +#define TrackingInit() +#define TrackDump() +#define Untrack(x) +#define TrackTag(x) +#define FreeNdisPacket FreeNdisPacketX +#endif + +#endif/*MEMMTRAC_H*/ diff --git a/reactos/drivers/lib/oskittcp/include/oskitdebug.h b/reactos/drivers/lib/oskittcp/include/oskitdebug.h new file mode 100644 index 00000000000..c263b4b8575 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/oskitdebug.h @@ -0,0 +1,94 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS TCP/IP protocol driver + * FILE: include/debug.h + * PURPOSE: Debugging support macros + * DEFINES: DBG - Enable debug output + * NASSERT - Disable assertions + */ +#ifndef __OSKITDEBUG_H +#define __OSKITDEBUG_H + +#define OSK_NORMAL_MASK 0x000000FF +#define OSK_SPECIAL_MASK 0xFFFFFF00 +#define OSK_MIN_TRACE 0x00000001 +#define OSK_MID_TRACE 0x00000002 +#define OSK_MAX_TRACE 0x00000003 + +#define OSK_DEBUG_CHECK 0x00000100 +#define OSK_DEBUG_MEMORY 0x00000200 +#define OSK_DEBUG_BUFFER 0x00000400 +#define OSK_DEBUG_IRP 0x00000800 +#define OSK_DEBUG_REFCOUNT 0x00001000 +#define OSK_DEBUG_ADDRFILE 0x00002000 +#define OSK_DEBUG_DATALINK 0x00004000 +#define OSK_DEBUG_ARP 0x00008000 +#define OSK_DEBUG_IP 0x00010000 +#define OSK_DEBUG_UDP 0x00020000 +#define OSK_DEBUG_TCP 0x00040000 +#define OSK_DEBUG_ICMP 0x00080000 +#define OSK_DEBUG_ROUTER 0x00100000 +#define OSK_DEBUG_RCACHE 0x00200000 +#define OSK_DEBUG_NCACHE 0x00400000 +#define OSK_DEBUG_CPOINT 0x00800000 +#define OSK_DEBUG_ULTRA 0xFFFFFFFF + +#include <roscfg.h> +#include <oskittypes.h> + +#ifdef DBG + +extern OSK_UINT OskitDebugTraceLevel; + +#ifdef _MSC_VER + +#define OS_DbgPrint(_t_, _x_) \ + if (((OskitDebugTraceLevel & OSK_NORMAL_MASK) >= _t_) || \ + ((OskitDebugTraceLevel & _t_) > OSK_NORMAL_MASK)) { \ + DbgPrint("(%s:%d) ", __FILE__, __LINE__); \ + DbgPrint _x_ ; \ + } + +#else /* _MSC_VER */ + +#define OS_DbgPrint(_t_, _x_) \ + if (((OskitDebugTraceLevel & OSK_NORMAL_MASK) >= _t_) || \ + ((OskitDebugTraceLevel & _t_) > OSK_NORMAL_MASK)) { \ + DbgPrint("(%s:%d)(%s) ", __FILE__, __LINE__, __FUNCTION__); \ + DbgPrint _x_ ; \ + } + +#endif /* _MSC_VER */ + +#if 0 +#ifdef ASSERT +#undef ASSERT +#endif + +#ifdef NASSERT +#define ASSERT(x) +#else /* NASSERT */ +#define ASSERT(x) if (!(x)) { OS_DbgPrint(MIN_TRACE, ("Assertion "#x" failed at %s:%d\n", __FILE__, __LINE__)); KeBugCheck(0); } +#endif /* NASSERT */ +#endif + +#define ASSERT_IRQL(x) ASSERT(KeGetCurrentIrql() <= (x)) + +#else /* DBG */ + +#define OS_DbgPrint(_t_, _x_) + +#if 0 +#define ASSERT_IRQL(x) +#define ASSERT(x) +#endif + +#endif /* DBG */ + + +#define assert(x) ASSERT(x) +#define assert_irql(x) ASSERT_IRQL(x) + +#endif /* __OSKITDEBUG_H */ + +/* EOF */ diff --git a/reactos/drivers/lib/oskittcp/include/oskiterrno.h b/reactos/drivers/lib/oskittcp/include/oskiterrno.h new file mode 100644 index 00000000000..d8d2efa8ed6 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/oskiterrno.h @@ -0,0 +1,170 @@ +/* + * Copyright (c) 1982, 1986, 1989, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)errno.h 8.5 (Berkeley) 1/21/94 + */ + +#ifndef _OSK_SYS_ERRNO_H_ +#define _OSK_SYS_ERRNO_H_ + +#ifndef __REACTOS__ +#ifndef KERNEL +extern int errno; /* global error number */ +#endif +#endif + +#define OSK_EPERM 1 /* Operation not permitted */ +#define OSK_ENOENT 2 /* No such file or directory */ +#define OSK_ESRCH 3 /* No such process */ +#define OSK_EINTR 4 /* Interrupted system call */ +#define OSK_EIO 5 /* Input/output error */ +#define OSK_ENXIO 6 /* Device not configured */ +#define OSK_E2BIG 7 /* Argument list too long */ +#define OSK_ENOEXEC 8 /* Exec format error */ +#define OSK_EBADF 9 /* Bad file descriptor */ +#define OSK_ECHILD 10 /* No child processes */ +#define OSK_EDEADLK 11 /* Resource deadlock avoided */ +/* 11 was OSK_EAGAIN */ +#define OSK_ENOMEM 12 /* Cannot allocate memory */ +#define OSK_EACCES 13 /* Permission denied */ +#define OSK_EFAULT 14 /* Bad address */ +#ifndef _POSIX_SOURCOSK_E +#define OSK_ENOTBLK 15 /* Block device required */ +#endif +#define OSK_EBUSY 16 /* Device busy */ +#define OSK_EEXIST 17 /* File exists */ +#define OSK_EXDEV 18 /* Cross-device link */ +#define OSK_ENODEV 19 /* Operation not supported by device */ +#define OSK_ENOTDIR 20 /* Not a directory */ +#define OSK_EISDIR 21 /* Is a directory */ +#define OSK_EINVAL 22 /* Invalid argument */ +#define OSK_ENFILE 23 /* Too many open files in system */ +#define OSK_EMFILE 24 /* Too many open files */ +#define OSK_ENOTTY 25 /* Inappropriate ioctl for device */ +#ifndef _POSIX_SOURCE +#define OSK_ETXTBSY 26 /* Text file busy */ +#endif +#define OSK_EFBIG 27 /* File too large */ +#define OSK_ENOSPC 28 /* No space left on device */ +#define OSK_ESPIPE 29 /* Illegal seek */ +#define OSK_EROFS 30 /* Read-only file system */ +#define OSK_EMLINK 31 /* Too many links */ +#define OSK_EPIPE 32 /* Broken pipe */ + +/* math software */ +#define OSK_EDOM 33 /* Numerical argument out of domain */ +#define OSK_ERANGE 34 /* Result too large */ + +/* non-blocking and interrupt i/o */ +#define OSK_EAGAIN 35 /* Resource temporarily unavailable */ +#ifndef _POSIX_SOURCE +#define OSK_EWOULDBLOCK EAGAIN /* Operation would block */ +#define OSK_EINPROGRESS 36 /* Operation now in progress */ +#define OSK_EALREADY 37 /* Operation already in progress */ + +/* ipc/network software -- argument errors */ +#define OSK_ENOTSOCK 38 /* Socket operation on non-socket */ +#define OSK_EDESTADDRREQ 39 /* Destination address required */ +#define OSK_EMSGSIZE 40 /* Message too long */ +#define OSK_EPROTOTYPE 41 /* Protocol wrong type for socket */ +#define OSK_ENOPROTOOPT 42 /* Protocol not available */ +#define OSK_EPROTONOSUPPORT 43 /* Protocol not supported */ +#define OSK_ESOCKTNOSUPPORT 44 /* Socket type not supported */ +#define OSK_EOPNOTSUPP 45 /* Operation not supported */ +#define OSK_EPFNOSUPPORT 46 /* Protocol family not supported */ +#define OSK_EAFNOSUPPORT 47 /* Address family not supported by protocol family */ +#define OSK_EADDRINUSE 48 /* Address already in use */ +#define OSK_EADDRNOTAVAIL 49 /* Can't assign requested address */ + +/* ipc/network software -- operational errors */ +#define OSK_ENETDOWN 50 /* Network is down */ +#define OSK_ENETUNREACH 51 /* Network is unreachable */ +#define OSK_ENETRESET 52 /* Network dropped connection on reset */ +#define OSK_ECONNABORTED 53 /* Software caused connection abort */ +#define OSK_ECONNRESET 54 /* Connection reset by peer */ +#define OSK_ENOBUFS 55 /* No buffer space available */ +#define OSK_EISCONN 56 /* Socket is already connected */ +#define OSK_ENOTCONN 57 /* Socket is not connected */ +#define OSK_ESHUTDOWN 58 /* Can't send after socket shutdown */ +#define OSK_ETOOMANYREFS 59 /* Too many references: can't splice */ +#define OSK_ETIMEDOUT 60 /* Operation timed out */ +#define OSK_ECONNREFUSED 61 /* Connection refused */ + +#define OSK_ELOOP 62 /* Too many levels of symbolic links */ +#endif /* _POSIX_SOURCE */ +#define OSK_ENAMETOOLONG 63 /* File name too long */ + +/* should be rearranged */ +#ifndef _POSIX_SOURCE +#define OSK_EHOSTDOWN 64 /* Host is down */ +#define OSK_EHOSTUNREACH 65 /* No route to host */ +#endif /* _POSIX_SOURCE */ +#define OSK_ENOTEMPTY 66 /* Directory not empty */ + +/* quotas & mush */ +#ifndef _POSIX_SOURCE +#define OSK_EPROCLIM 67 /* Too many processes */ +#define OSK_EUSERS 68 /* Too many users */ +#define OSK_EDQUOT 69 /* Disc quota exceeded */ + +/* Network File System */ +#define OSK_ESTALE 70 /* Stale NFS file handle */ +#define OSK_EREMOTE 71 /* Too many levels of remote in path */ +#define OSK_EBADRPC 72 /* RPC struct is bad */ +#define OSK_ERPCMISMATCH 73 /* RPC version wrong */ +#define OSK_EPROGUNAVAIL 74 /* RPC prog. not avail */ +#define OSK_EPROGMISMATCH 75 /* Program version wrong */ +#define OSK_EPROCUNAVAIL 76 /* Bad procedure for program */ +#endif /* _POSIX_SOURCE */ + +#define OSK_ENOLCK 77 /* No locks available */ +#define OSK_ENOSYS 78 /* Function not implemented */ + +#ifndef _POSIX_SOURCE +#define OSK_EFTYPE 79 /* Inappropriate file type or format */ +#define OSK_EAUTH 80 /* Authentication error */ +#define OSK_ENEEDAUTH 81 /* Need authenticator */ +#define OSK_ELAST 81 /* Must be equal largest errno */ +#endif /* _POSIX_SOURCE */ + +#ifdef KERNEL +/* pseudo-errors returned inside kernel to modify return to process */ +#define OSK_ERESTART -1 /* restart syscall */ +#define OSK_EJUSTRETURN -2 /* don't modify regs, just return */ +#endif + +#endif/*OSK_SYS_ERRNO*/ diff --git a/reactos/drivers/lib/oskittcp/include/oskitfreebsd.h b/reactos/drivers/lib/oskittcp/include/oskitfreebsd.h new file mode 100644 index 00000000000..36ba212f1b9 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/oskitfreebsd.h @@ -0,0 +1,14 @@ +#ifndef _OSKITFREEBSD_H +#define _OSKITFREEBSD_H + +extern void oskittcp_die(const char *file, int line); + +#define printf DbgPrint +#define ovbcopy(x,y,z) bcopy(x,y,z) +#define bzero(x,y) memset(x,0,y) +#define bcopy memcpy +#define panic(...) do { DbgPrint(__VA_ARGS__); \ + oskittcp_die(__FILE__,__LINE__); } while(0) +#define kmem_malloc(x,y,z) malloc(y) + +#endif//_OSKITFREEBSD_H diff --git a/reactos/drivers/lib/oskittcp/include/oskittcp.h b/reactos/drivers/lib/oskittcp/include/oskittcp.h new file mode 100644 index 00000000000..b98b2fe2df7 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/oskittcp.h @@ -0,0 +1,106 @@ +#ifndef OSKITTCP_H +#define OSKITTCP_H + +#include <roscfg.h> +#ifdef KERNEL +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/malloc.h> +#include <sys/mbuf.h> +#include <sys/protosw.h> +#include <sys/socket.h> +#include <sys/socketvar.h> +#include <sys/errno.h> +#include <sys/queue.h> +#include <sys/kernel.h> + +#include <net/if.h> +#include <net/route.h> + +#include <netinet/in.h> +#include <netinet/in_systm.h> +#include <netinet/ip.h> +#include <netinet/in_pcb.h> +#include <netinet/ip_var.h> +#include <netinet/tcp.h> +#include <netinet/tcp_fsm.h> +#include <netinet/tcp_seq.h> +#include <netinet/tcp_timer.h> +#include <netinet/tcp_var.h> +#include <netinet/tcpip.h> + +struct connect_args { + int s; + caddr_t name; + int namelen; +}; +#endif + +#include <oskittypes.h> + +#define IPHDR_SIZE 20 + +typedef void (*OSKITTCP_SOCKET_DATA_AVAILABLE) + ( void *ClientData, + void *WhichSocket, + void *WhichConnection, + OSK_PCHAR Data, + OSK_UINT Len ); +typedef void (*OSKITTCP_SOCKET_CONNECT_INDICATION) + ( void *ClientData, + void *WhichSocket, + void *WhichConnection ); +typedef void (*OSKITTCP_SOCKET_CLOSE_INDICATION) + ( void *WhichSocket ); +typedef void (*OSKITTCP_SOCKET_PENDING_CONNECT_INDICATION) + ( void *WhichSocket ); +typedef void (*OSKITTCP_SOCKET_RESET_INDICATION) + ( void *WhichSocket ); +typedef int (*OSKITTCP_SEND_PACKET) + ( void *ClientData, + void *WhichSocket, + void *WhichConnection, + OSK_PCHAR Data, + OSK_UINT Len ); +typedef int (*OSKITTCP_NEED_BIND) + ( void *ClientData, + void *WhichSocket, + void *WhichConnection, + struct sockaddr *address, + OSK_UINT addrlen, + OSK_UINT reuseport ); + +typedef struct _OSKITTCP_EVENT_HANDLERS { + void *ClientData; + OSKITTCP_SOCKET_DATA_AVAILABLE SocketDataAvailable; + OSKITTCP_SOCKET_CONNECT_INDICATION SocketConnectIndication; + OSKITTCP_SOCKET_CLOSE_INDICATION SocketCloseIndication; + OSKITTCP_SOCKET_PENDING_CONNECT_INDICATION SocketPendingConnectIndication; + OSKITTCP_SOCKET_RESET_INDICATION SocketResetIndication; + OSKITTCP_SEND_PACKET PacketSend; + OSKITTCP_NEED_BIND Bind; +} OSKITTCP_EVENT_HANDLERS, *POSKITTCP_EVENT_HANDLERS; + +extern OSKITTCP_EVENT_HANDLERS OtcpEvent; + +extern void InitOskitTCP(); +extern void DeinitOskitTCP(); +extern void TimerOskitTCP(); +extern int OskitTCPSocket( void *Connection, void **ConnectionContext, + int Af, int Type, int Proto ); +extern void RegisterOskitTCPEventHandlers +( POSKITTCP_EVENT_HANDLERS EventHandlers ); +extern void OskitTCPReceiveDatagram( OSK_PCHAR Data, OSK_UINT Len, + OSK_UINT IpHeaderLen ); + +#undef errno + +#define malloc(x,...) fbsd_malloc(x,__FILE__,__LINE__) +#define free(x,...) fbsd_free(x,__FILE__,__LINE__) + +/* Error codes */ +#include <oskiterrno.h> + +#define SOCK_MAXADDRLEN 255 + +#endif/*OSKITTCP_H*/ diff --git a/reactos/drivers/lib/oskittcp/include/oskittypes.h b/reactos/drivers/lib/oskittcp/include/oskittypes.h new file mode 100644 index 00000000000..1040980e2db --- /dev/null +++ b/reactos/drivers/lib/oskittcp/include/oskittypes.h @@ -0,0 +1,60 @@ + +#ifndef OSKITTYPES_H +#define OSKITTYPES_H + +typedef struct sockaddr OSK_SOCKADDR; +typedef unsigned char *OSK_PCHAR; +typedef unsigned int OSK_UINT; +typedef unsigned short OSK_UI16; +typedef char * osk_caddr_t; + +#define SWAP_FAMILY_LEN(sabuf,s) \ + (sabuf)->sin_family = htons((sabuf)->sin_family) +/* do { s = (sabuf)->sin_family; (sabuf)->sin_family = (sabuf)->sin_len; (sabuf)->sin_len = s; } while(0); */ + +/* + * The ifaddr structure contains information about one address + * of an interface. They are maintained by the different address families, + * are allocated and attached when an address is set, and are linked + * together so all addresses for an interface can be located. + */ +struct ifaddr { + struct sockaddr *ifa_addr; /* address of interface */ + struct sockaddr *ifa_dstaddr; /* other end of p-to-p link */ +#define ifa_broadaddr ifa_dstaddr /* broadcast address interface */ + struct sockaddr *ifa_netmask; /* used to determine subnet */ + u_short ifa_flags; /* mostly rt_flags for cloning */ + short ifa_refcnt; /* extra to malloc for link info */ + int ifa_metric; /* cost of going out this interface */ + u_short ifa_mtu; /* MTU */ +}; +#define IFA_ROUTE RTF_UP /* route installed */ +#define OSK_IFQ_MAXLEN 50 + +/* + * These numbers are used by reliable protocols for determining + * retransmission behavior and are included in the routing structure. + */ +struct rt_metrics { + u_long rmx_locks; /* Kernel must leave these values alone */ + u_long rmx_mtu; /* MTU for this path */ + u_long rmx_hopcount; /* max hops expected */ + u_long rmx_expire; /* lifetime for route, e.g. redirect */ + u_long rmx_recvpipe; /* inbound delay-bandwith product */ + u_long rmx_sendpipe; /* outbound delay-bandwith product */ + u_long rmx_ssthresh; /* outbound gateway buffer limit */ + u_long rmx_rtt; /* estimated round trip time */ + u_long rmx_rttvar; /* estimated rtt variance */ + u_long rmx_pksent; /* packets sent using this route */ + u_long rmx_filler[4]; /* will be used for T/TCP later */ +}; + +struct rtentry { + struct sockaddr *rt_gateway; /* value */ + u_long rt_flags; /* up/down?, host/net */ + struct ifaddr rt_ifa; /* the answer: interface to use */ + struct rt_metrics rt_rmx; /* metrics used by rx'ing protocols */ + u_long rt_mtu; /* Path MTU */ +}; + +#endif/*OSKITTYPES_H*/ diff --git a/reactos/drivers/lib/oskittcp/makefile b/reactos/drivers/lib/oskittcp/makefile new file mode 100644 index 00000000000..15d31c11859 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/makefile @@ -0,0 +1,83 @@ + + +# $Id: makefile,v 1.1 2004/05/29 00:15:44 sedwards Exp $ + +PATH_TO_TOP = ../../.. + +TARGET_BOOTSTRAP = yes + +TARGET_TYPE = library + +TARGET_NAME = oskittcp + +TARGET_CFLAGS = -g -D__REACTOS__=1 -DKERNEL -Iinclude/freebsd -Iinclude/freebsd/sys/include -Iinclude/freebsd/src/sys -Iinclude/freebsd/dev/include -Iinclude/freebsd/net/include -Iinclude -I$(PATH_TO_TOP)/w32api/include -I$(PATH_TO_TOP)/include -DMEMTRACK + +# require os code to explicitly request A/W version of structs/functions +TARGET_CFLAGS += -D_DISABLE_TIDENTS + +TARGET_ASFLAGS = -I $(PATH_TO_TOP)/include + +TARGET_LFLAGS = -Wl,--file-alignment,0x1000 \ + -Wl,--section-alignment,0x1000 \ + -nostartfiles -nostdlib \ + +TARGET_GCCLIBS = gcc + +TARGET_BASE = 0x79f60000 + +TARGET_PATH = + +REACTOS_OBJECTS = \ + oskittcp/defaults.o \ + oskittcp/in.o \ + oskittcp/in_cksum.o \ + oskittcp/in_pcb.o \ + oskittcp/in_proto.o \ + oskittcp/in_rmx.o \ + oskittcp/inet_ntoa.o \ + oskittcp/interface.o \ + oskittcp/ip_input.o \ + oskittcp/ip_output.o \ + oskittcp/kern_clock.o \ + oskittcp/kern_subr.o \ + oskittcp/malloc.o \ + oskittcp/param.o \ + oskittcp/radix.o \ + oskittcp/random.o \ + oskittcp/rtsock.o \ + oskittcp/scanc.o \ + oskittcp/sleep.o \ + oskittcp/tcp_input.o \ + oskittcp/tcp_output.o \ + oskittcp/tcp_subr.o \ + oskittcp/tcp_usrreq.o \ + oskittcp/tcp_debug.o \ + oskittcp/tcp_timer.o \ + oskittcp/uipc_domain.o \ + oskittcp/uipc_mbuf.o \ + oskittcp/uipc_socket.o \ + oskittcp/uipc_socket2.o + +TARGET_OBJECTS = $(FREEBSD_OBJECTS) $(REACTOS_OBJECTS) +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: csr/TAGS dbg/TAGS ldr/TAGS main/TAGS rtl/TAGS stdio/TAGS stdlib/TAGS string/TAGS stubs/TAGS + etags -i csr/TAGS -i dbg/TAGS -i ldr/TAGS -i main/TAGS -i rtl/TAGS -i stdio/TAGS -i stdlib/TAGS -i string/TAGS -i stubs/TAGS + + +docu: + doxygen Doxyfile + +.PHONY: docu + + +# EOF diff --git a/reactos/drivers/lib/oskittcp/oskittcp/.cvsignore b/reactos/drivers/lib/oskittcp/oskittcp/.cvsignore new file mode 100644 index 00000000000..31dc3078b3a --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/.cvsignore @@ -0,0 +1,2 @@ +*.d +*.o diff --git a/reactos/drivers/lib/oskittcp/oskittcp/defaults.c b/reactos/drivers/lib/oskittcp/oskittcp/defaults.c new file mode 100644 index 00000000000..0133e6531d4 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/defaults.c @@ -0,0 +1,215 @@ +/* + * Copyright (c) 1996-1998 University of Utah and the Flux Group. + * All rights reserved. + * + * This file is part of the Flux OSKit. The OSKit is free software, also known + * as "open source;" you can redistribute it and/or modify it under the terms + * of the GNU General Public License (GPL), version 2, as published by the Free + * Software Foundation (FSF). To explore alternate licensing terms, contact + * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. + * + * The OSKit 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 GPL for more details. You should have + * received a copy of the GPL along with the OSKit; see the file COPYING. If + * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. + */ +/* + * Routines necessary for the bsdnet code. + */ + +#include <sys/types.h> +#include <sys/param.h> +#include <vm/vm.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/domain.h> +#include "net/netisr.h" + +int oskit_cpl; /* for machine/spl.h */ +int bootverbose; /* networking code wants to know whether booting + is to be verbose */ +int securelevel = 3; /* used in ip_fw.c:ip_fw_ctl -- make it > 2 */ + +vm_map_t mb_map; /* this is passed in kmem_alloc, but ignored there */ + +struct proc proc0; +struct proc *curproc = &proc0; + +struct domain localdomain; /* see uipc_domain.c ADDDOMAIN macro */ + +/* ---------------------------------------------------------------------- */ + +/* + * find a process by pid + */ +struct proc * +pfind(pid_t pid) +{ + printf(__FUNCTION__" called, pid=%d, returning x%p\n", + (int)pid, (void*)&proc0); + return &proc0; +} + +/* + * signal a process + */ +void +psignal (struct proc *p, int sig) +{ + printf(__FUNCTION__" called, proc=x%p sig=%d\n", p, sig); +} + +/* + * signal a process group + */ +void +gsignal (int pgid, int sig) +{ + printf(__FUNCTION__" called, pgid=%d sig=%d\n", pgid, sig); +} + +/* ---------------------------------------------------------------------- */ + +/* + * copy in from userspace + */ +int +copyin (void *udaddr, void *kaddr, u_int len) +{ + memcpy(kaddr, udaddr, len); + return 0; +} + +/* + * copy out to userspace + */ +int +copyout (void *kaddr, void *udaddr, u_int len) +{ + memcpy(udaddr, kaddr, len); + return 0; +} + +/* + * even though these functions have an odd signature, + * they only copy one byte + */ +int subyte (void *base, int byte) +{ + return (int)((char *)base = (char)byte); +} + +int suibyte (void *base, int byte) +{ + return (int)((char *)base = (char)byte); +} + +/* ---------------------------------------------------------------------- */ + +#ifndef __REACTOS__ +/* + * log some information + */ +void +log (int level, const char *format, ...) +{ + extern int vprintf(const char *, va_list); + va_list args; + va_start(args, format); + printf("__FUNCTION__(%d):", level); + vprintf(format, args); + va_end(args); +} +#endif + +/* ---------------------------------------------------------------------- */ + +/* + * do we have super user credentials? + */ +/* ARGSUSED */ +int +suser(struct ucred *ucred, u_short *acflag) +{ + /* of course. */ + return 0; +} + +/* ---------------------------------------------------------------------- */ +/* + * stuff stolen from kern/kern_sysctl.c + */ +/* + * Validate parameters and get old / set new parameters + * for an integer-valued sysctl function. + */ +int +sysctl_int(oldp, oldlenp, newp, newlen, valp) + void *oldp; + size_t *oldlenp; + void *newp; + size_t newlen; + int *valp; +{ + int error = 0; + + if (oldp && *oldlenp < sizeof(int)) + return (ENOMEM); + if (newp && newlen != sizeof(int)) + return (EINVAL); + *oldlenp = sizeof(int); + if (oldp) + error = copyout(valp, oldp, sizeof(int)); + if (error == 0 && newp) + error = copyin(newp, valp, sizeof(int)); + return (error); +} + +/* + * Validate parameters and get old parameters + * for a structure oriented sysctl function. + */ +int +sysctl_rdstruct(oldp, oldlenp, newp, sp, len) + void *oldp; + size_t *oldlenp; + void *newp, *sp; + int len; +{ + int error = 0; + + if (oldp && *oldlenp < len) + return (ENOMEM); + if (newp) + return (EPERM); + *oldlenp = len; + if (oldp) + error = copyout(sp, oldp, len); + return (error); +} + +/* ---------------------------------------------------------------------- */ +/* + * normally, this is a builtin function in gcc + * net/if.c doesn't seem to get it, though + */ +int +memcmp(const void *s1v, const void *s2v, size_t size) +{ + register const char *s1 = s1v, *s2 = s2v; + register unsigned int a, b; + + while (size-- > 0) { + if ((a = *s1++) != (b = *s2++)) + return (a-b); + } + + return 0; +} + +int bcmp(const void *b1, const void *b2, size_t len) +{ + return memcmp(b1, b2, len); +} + diff --git a/reactos/drivers/lib/oskittcp/oskittcp/in.c b/reactos/drivers/lib/oskittcp/oskittcp/in.c new file mode 100644 index 00000000000..89ad849f36f --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/in.c @@ -0,0 +1,181 @@ +/* + * Copyright (c) 1982, 1986, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)in.c 8.2 (Berkeley) 11/15/93 + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/ioctl.h> +#include <sys/errno.h> +#include <sys/malloc.h> +#include <sys/socket.h> +#include <sys/socketvar.h> +#include <sys/queue.h> + +#include <net/if.h> +#include <net/route.h> + +#include <netinet/in_systm.h> +#include <netinet/in.h> +#include <netinet/in_var.h> +#include <netinet/if_ether.h> + +#include <netinet/igmp_var.h> + +/* + * This structure is used to keep track of in_multi chains which belong to + * deleted interface addresses. + */ +static LIST_HEAD(, multi_kludge) in_mk; /* XXX BSS initialization */ + +struct multi_kludge { + LIST_ENTRY(multi_kludge) mk_entry; + struct ifnet *mk_ifp; + struct in_multihead mk_head; +}; + +/* + * Return the network number from an internet address. + */ +u_long +in_netof(in) + struct in_addr in; +{ + register u_long i = ntohl(in.s_addr); + register u_long net; + register struct in_ifaddr *ia; + + if (IN_CLASSA(i)) + net = i & IN_CLASSA_NET; + else if (IN_CLASSB(i)) + net = i & IN_CLASSB_NET; + else if (IN_CLASSC(i)) + net = i & IN_CLASSC_NET; + else if (IN_CLASSD(i)) + net = i & IN_CLASSD_NET; + else + return (0); + + /* + * Check whether network is a subnet; + * if so, return subnet number. + */ + for (ia = in_ifaddr; ia; ia = ia->ia_next) + if (net == ia->ia_net) + return (i & ia->ia_subnetmask); + return (net); +} + +#ifndef SUBNETSARELOCAL +#define SUBNETSARELOCAL 1 +#endif +int subnetsarelocal = SUBNETSARELOCAL; +/* + * Return 1 if an internet address is for a ``local'' host + * (one to which we have a connection). If subnetsarelocal + * is true, this includes other subnets of the local net. + * Otherwise, it includes only the directly-connected (sub)nets. + */ +int +in_localaddr(in) + struct in_addr in; +{ + register u_long i = ntohl(in.s_addr); + register struct in_ifaddr *ia; + + if (subnetsarelocal) { + for (ia = in_ifaddr; ia; ia = ia->ia_next) + if ((i & ia->ia_netmask) == ia->ia_net) + return (1); + } else { + for (ia = in_ifaddr; ia; ia = ia->ia_next) + if ((i & ia->ia_subnetmask) == ia->ia_subnet) + return (1); + } + return (0); +} + +int in_interfaces; /* number of external internet interfaces */ + +/* + * Generic internet control operations (ioctl's). + * Ifp is 0 if not an interface-specific ioctl. + */ +/* ARGSUSED */ +int +in_control(so, cmd, data, ifp) + struct socket *so; + int cmd; + caddr_t data; + register struct ifnet *ifp; +{ + return (0); +} + +/* + * Delete a multicast address record. + */ +void +in_delmulti(inm) + register struct in_multi *inm; +{ +#if 0 + register struct in_multi **p; + struct ifreq ifr; + int s = splnet(); + + if (--inm->inm_refcount == 0) { + /* + * No remaining claims to this record; let IGMP know that + * we are leaving the multicast group. + */ + /* igmp_leavegroup(inm); XXX arty */ + /* + * Unlink from list. + */ + LIST_REMOVE(inm, inm_entry); + + /* + * Notify the network driver to update its multicast reception + * filter. + */ + ((struct sockaddr_in *)&(ifr.ifr_addr))->sin_family = AF_INET; + ((struct sockaddr_in *)&(ifr.ifr_addr))->sin_addr = + inm->inm_addr; + (*inm->inm_ifp->if_ioctl)(inm->inm_ifp, SIOCDELMULTI, + (caddr_t)&ifr); + free(inm, M_IPMADDR); + } + splx(s); +#endif +} diff --git a/reactos/drivers/lib/oskittcp/oskittcp/in_cksum.c b/reactos/drivers/lib/oskittcp/oskittcp/in_cksum.c new file mode 100644 index 00000000000..4175f8cb087 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/in_cksum.c @@ -0,0 +1,150 @@ +/* + * Copyright (c) 1988, 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)in_cksum.c 8.1 (Berkeley) 6/10/93 + */ + +#include <sys/param.h> +#include <sys/mbuf.h> +#include <sys/systm.h> + +/* + * Checksum routine for Internet Protocol family headers (Portable Version). + * + * This routine is very heavily used in the network + * code and should be modified for each CPU to be as fast as possible. + */ + +#define ADDCARRY(x) (x > 65535 ? x -= 65535 : x) +#define REDUCE {l_util.l = sum; sum = l_util.s[0] + l_util.s[1]; ADDCARRY(sum);} + +int +in_cksum(m, len) + register struct mbuf *m; + register int len; +{ + register u_short *w; + register int sum = 0; + register int mlen = 0; + int byte_swapped = 0; + + union { + char c[2]; + u_short s; + } s_util; + union { + u_short s[2]; + long l; + } l_util; + + for (;m && len; m = m->m_next) { + if (m->m_len == 0) + continue; + w = mtod(m, u_short *); + if (mlen == -1) { + /* + * The first byte of this mbuf is the continuation + * of a word spanning between this mbuf and the + * last mbuf. + * + * s_util.c[0] is already saved when scanning previous + * mbuf. + */ + s_util.c[1] = *(char *)w; + sum += s_util.s; + w = (u_short *)((char *)w + 1); + mlen = m->m_len - 1; + len--; + } else + mlen = m->m_len; + if (len < mlen) + mlen = len; + len -= mlen; + /* + * Force to even boundary. + */ + if ((1 & (int) w) && (mlen > 0)) { + REDUCE; + sum <<= 8; + s_util.c[0] = *(u_char *)w; + w = (u_short *)((char *)w + 1); + mlen--; + byte_swapped = 1; + } + /* + * Unroll the loop to make overhead from + * branches &c small. + */ + while ((mlen -= 32) >= 0) { + sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3]; + sum += w[4]; sum += w[5]; sum += w[6]; sum += w[7]; + sum += w[8]; sum += w[9]; sum += w[10]; sum += w[11]; + sum += w[12]; sum += w[13]; sum += w[14]; sum += w[15]; + w += 16; + } + mlen += 32; + while ((mlen -= 8) >= 0) { + sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3]; + w += 4; + } + mlen += 8; + if (mlen == 0 && byte_swapped == 0) + continue; + REDUCE; + while ((mlen -= 2) >= 0) { + sum += *w++; + } + if (byte_swapped) { + REDUCE; + sum <<= 8; + byte_swapped = 0; + if (mlen == -1) { + s_util.c[1] = *(char *)w; + sum += s_util.s; + mlen = 0; + } else + mlen = -1; + } else if (mlen == -1) + s_util.c[0] = *(char *)w; + } + if (len) + printf("cksum: out of data\n"); + if (mlen == -1) { + /* The last mbuf has odd # of bytes. Follow the + standard (the odd byte may be shifted left by 8 bits + or not as determined by endian-ness of the machine) */ + s_util.c[1] = 0; + sum += s_util.s; + } + REDUCE; + return (~sum & 0xffff); +} diff --git a/reactos/drivers/lib/oskittcp/oskittcp/in_pcb.c b/reactos/drivers/lib/oskittcp/oskittcp/in_pcb.c new file mode 100644 index 00000000000..f050eb655d4 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/in_pcb.c @@ -0,0 +1,521 @@ +/* + * Copyright (c) 1982, 1986, 1991, 1993, 1995 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)in_pcb.c 8.2 (Berkeley) 1/4/94 + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/malloc.h> +#include <sys/mbuf.h> +#include <sys/protosw.h> +#include <sys/socket.h> +#include <sys/socketvar.h> +#include <sys/ioctl.h> +#include <sys/errno.h> +#include <sys/time.h> +#include <sys/proc.h> +#include <sys/queue.h> + +#include <net/if.h> +#include <net/route.h> + +#include <netinet/in.h> +#include <netinet/in_systm.h> +#include <netinet/ip.h> +#include <netinet/in_pcb.h> +#include <netinet/in_var.h> +#include <netinet/ip_var.h> + +struct in_addr zeroin_addr; + +int +in_pcballoc(so, pcbinfo) + struct socket *so; + struct inpcbinfo *pcbinfo; +{ + register struct inpcb *inp; + int s; + + MALLOC(inp, struct inpcb *, sizeof(*inp), M_PCB, M_NOWAIT); + if (inp == NULL) + return (ENOBUFS); + bzero((caddr_t)inp, sizeof(*inp)); + inp->inp_pcbinfo = pcbinfo; + inp->inp_socket = so; + s = splnet(); + LIST_INSERT_HEAD(pcbinfo->listhead, inp, inp_list); + in_pcbinshash(inp); + splx(s); + so->so_pcb = (caddr_t)inp; + return (0); +} + +int +in_pcbbind(inp, nam) + register struct inpcb *inp; + struct mbuf *nam; +{ + register struct socket *so = inp->inp_socket; + struct inpcbhead *head = inp->inp_pcbinfo->listhead; + unsigned short *lastport = &inp->inp_pcbinfo->lastport; + struct sockaddr_in *sin; + struct proc *p = curproc; /* XXX */ + struct ifaddr ifa; + u_short lport = 0; + int wild = 0, reuseport = (so->so_options & SO_REUSEPORT); + int error; + + if (inp->inp_lport || inp->inp_laddr.s_addr != INADDR_ANY) + return (EINVAL); + if ((so->so_options & (SO_REUSEADDR|SO_REUSEPORT)) == 0 && + ((so->so_proto->pr_flags & PR_CONNREQUIRED) == 0 || + (so->so_options & SO_ACCEPTCONN) == 0)) + wild = INPLOOKUP_WILDCARD; + if (nam) { + sin = mtod(nam, struct sockaddr_in *); + if (nam->m_len != sizeof (*sin)) + return (EINVAL); +#ifdef notdef + /* + * We should check the family, but old programs + * incorrectly fail to initialize it. + */ + if (sin->sin_family != AF_INET) + return (EAFNOSUPPORT); +#endif + lport = sin->sin_port; + if (IN_MULTICAST(ntohl(sin->sin_addr.s_addr))) { + /* + * Treat SO_REUSEADDR as SO_REUSEPORT for multicast; + * allow complete duplication of binding if + * SO_REUSEPORT is set, or if SO_REUSEADDR is set + * and a multicast address is bound on both + * new and duplicated sockets. + */ + if (so->so_options & SO_REUSEADDR) + reuseport = SO_REUSEADDR|SO_REUSEPORT; + } else if (sin->sin_addr.s_addr != INADDR_ANY) { + sin->sin_port = 0; /* yech... */ + if (ifa_ifwithaddr((struct sockaddr *)sin, &ifa) != 0) + return (EADDRNOTAVAIL); + } + if (lport) { + struct inpcb *t; + + /* GROSS */ + if (ntohs(lport) < IPPORT_RESERVED && + (error = suser(p->p_ucred, &p->p_acflag))) + return (EACCES); + t = in_pcblookup(head, zeroin_addr, 0, + sin->sin_addr, lport, wild); + if (t && (reuseport & t->inp_socket->so_options) == 0) + return (EADDRINUSE); + } + inp->inp_laddr = sin->sin_addr; + } + if (lport == 0) + do { + ++*lastport; + if (*lastport < IPPORT_RESERVED || + *lastport > IPPORT_USERRESERVED) + *lastport = IPPORT_RESERVED; + lport = htons(*lastport); + } while (in_pcblookup(head, + zeroin_addr, 0, inp->inp_laddr, lport, wild)); + inp->inp_lport = lport; + in_pcbrehash(inp); + return (0); +} + +/* + * Transform old in_pcbconnect() into an inner subroutine for new + * in_pcbconnect(): Do some validity-checking on the remote + * address (in mbuf 'nam') and then determine local host address + * (i.e., which interface) to use to access that remote host. + * + * This preserves definition of in_pcbconnect(), while supporting a + * slightly different version for T/TCP. (This is more than + * a bit of a kludge, but cleaning up the internal interfaces would + * have forced minor changes in every protocol). + */ + +int +in_pcbladdr(inp, nam, plocal_sin) + register struct inpcb *inp; + struct mbuf *nam; + struct sockaddr_in *plocal_sin; +{ + struct ifaddr ifa; + struct sockaddr_in *ifaddr = 0; + register struct sockaddr_in *sin = mtod(nam, struct sockaddr_in *); + + if (nam->m_len != sizeof (*sin)) + return (EINVAL); + if (sin->sin_family != AF_INET) { + OS_DbgPrint(OSK_MID_TRACE,("EAFNOSUPPORT: %d\n", sin->sin_family)); + return (EAFNOSUPPORT); + } + if (sin->sin_port == 0) + return (EADDRNOTAVAIL); + if (inp->inp_laddr.s_addr == INADDR_ANY) { + register struct route *ro; + /* + * If route is known or can be allocated now, + * our src addr is taken from the i/f, else punt. + */ + ro = &inp->inp_route; + if ((inp->inp_socket->so_options & SO_DONTROUTE) == 0) { + /* No route yet, so try to acquire one */ + ro->ro_dst.sa_family = AF_INET; + /* ro->ro_dst.sa_len = sizeof(struct sockaddr_in); */ + ((struct sockaddr_in *) &ro->ro_dst)->sin_addr = + sin->sin_addr; + if( ifa_ifwithnet( sin, &ifa ) == 0 ) { + inp->inp_laddr = + ((struct sockaddr_in *)&ifa.ifa_addr)->sin_addr; + OS_DbgPrint(OSK_MID_TRACE, + ("Assigning local address: %x\n", + inp->inp_laddr.s_addr)); + } + } + } + /* + * Don't do pcblookup call here; return interface in plocal_sin + * and exit to caller, that will do the lookup. + */ + plocal_sin->sin_family = AF_INET; + plocal_sin->sin_addr = ((struct sockaddr_in *)&ifa.ifa_addr)->sin_addr; + plocal_sin->sin_port = sin->sin_port; + return(0); +} + +/* + * Outer subroutine: + * Connect from a socket to a specified address. + * Both address and port must be specified in argument sin. + * If don't have a local address for this socket yet, + * then pick one. + */ +int +in_pcbconnect(inp, nam) + register struct inpcb *inp; + struct mbuf *nam; +{ + struct sockaddr_in ifaddr; + register struct sockaddr_in *sin = mtod(nam, struct sockaddr_in *); + int error; + + /* + * Call inner routine, to assign local interface address. + */ + if (error = in_pcbladdr(inp, nam, &ifaddr)) + return(error); + + if (in_pcblookuphash(inp->inp_pcbinfo, sin->sin_addr, sin->sin_port, + inp->inp_laddr.s_addr ? inp->inp_laddr : + ifaddr.sin_addr, + inp->inp_lport) != NULL) + return (EADDRINUSE); + if (inp->inp_laddr.s_addr == INADDR_ANY) { + if (inp->inp_lport == 0) + (void)in_pcbbind(inp, (struct mbuf *)0); + inp->inp_laddr = ifaddr.sin_addr; + } + inp->inp_faddr = sin->sin_addr; + inp->inp_fport = sin->sin_port; + in_pcbrehash(inp); + return (0); +} + +void +in_pcbdisconnect(inp) + struct inpcb *inp; +{ + + inp->inp_faddr.s_addr = INADDR_ANY; + inp->inp_fport = 0; + in_pcbrehash(inp); + if (inp->inp_socket->so_state & SS_NOFDREF) + in_pcbdetach(inp); +} + +void +in_pcbdetach(inp) + struct inpcb *inp; +{ + struct socket *so = inp->inp_socket; + int s; + + so->so_pcb = 0; + sofree(so); + if (inp->inp_options) + (void)m_free(inp->inp_options); + ip_freemoptions(inp->inp_moptions); + s = splnet(); + LIST_REMOVE(inp, inp_hash); + LIST_REMOVE(inp, inp_list); + splx(s); + FREE(inp, M_PCB); +} + +void +in_setsockaddr(inp, nam) + register struct inpcb *inp; + struct mbuf *nam; +{ + register struct sockaddr_in *sin; + + nam->m_len = sizeof (*sin); + sin = mtod(nam, struct sockaddr_in *); + bzero((caddr_t)sin, sizeof (*sin)); + sin->sin_family = AF_INET; + /* sin->sin_len = sizeof(*sin); */ + sin->sin_port = inp->inp_lport; + sin->sin_addr = inp->inp_laddr; +} + +void +in_setpeeraddr(inp, nam) + struct inpcb *inp; + struct mbuf *nam; +{ + register struct sockaddr_in *sin; + + nam->m_len = sizeof (*sin); + sin = mtod(nam, struct sockaddr_in *); + bzero((caddr_t)sin, sizeof (*sin)); + sin->sin_family = AF_INET; + /* sin->sin_len = sizeof(*sin); */ + sin->sin_port = inp->inp_fport; + sin->sin_addr = inp->inp_faddr; +} + +/* + * Pass some notification to all connections of a protocol + * associated with address dst. The local address and/or port numbers + * may be specified to limit the search. The "usual action" will be + * taken, depending on the ctlinput cmd. The caller must filter any + * cmds that are uninteresting (e.g., no error in the map). + * Call the protocol specific routine (if any) to report + * any errors for each matching socket. + * + * Must be called at splnet. + */ +void +in_pcbnotify(head, dst, fport_arg, laddr, lport_arg, cmd, notify) + struct inpcbhead *head; + struct sockaddr *dst; + u_int fport_arg, lport_arg; + struct in_addr laddr; + int cmd; + void (*notify) __P((struct inpcb *, int)); +{ + register struct inpcb *inp, *oinp; + struct in_addr faddr; + u_short fport = fport_arg, lport = lport_arg; + int errno, s; + + if ((unsigned)cmd > PRC_NCMDS || dst->sa_family != AF_INET) + return; + faddr = ((struct sockaddr_in *)dst)->sin_addr; + if (faddr.s_addr == INADDR_ANY) + return; + + /* + * Redirects go to all references to the destination, + * and use in_rtchange to invalidate the route cache. + * Dead host indications: notify all references to the destination. + * Otherwise, if we have knowledge of the local port and address, + * deliver only to that socket. + */ + if (PRC_IS_REDIRECT(cmd) || cmd == PRC_HOSTDEAD) { + fport = 0; + lport = 0; + laddr.s_addr = 0; + if (cmd != PRC_HOSTDEAD) + notify = in_rtchange; + } + errno = inetctlerrmap[cmd]; + s = splnet(); + for (inp = head->lh_first; inp != NULL;) { + if (inp->inp_faddr.s_addr != faddr.s_addr || + inp->inp_socket == 0 || + (lport && inp->inp_lport != lport) || + (laddr.s_addr && inp->inp_laddr.s_addr != laddr.s_addr) || + (fport && inp->inp_fport != fport)) { + inp = inp->inp_list.le_next; + continue; + } + oinp = inp; + inp = inp->inp_list.le_next; + if (notify) + (*notify)(oinp, errno); + } + splx(s); +} + +/* + * After a routing change, flush old routing + * and allocate a (hopefully) better one. + */ +void +in_rtchange(inp, errno) + register struct inpcb *inp; + int errno; +{ +} + +struct inpcb * +in_pcblookup(head, faddr, fport_arg, laddr, lport_arg, flags) + struct inpcbhead *head; + struct in_addr faddr, laddr; + u_int fport_arg, lport_arg; + int flags; +{ + register struct inpcb *inp, *match = NULL; + int matchwild = 3, wildcard; + u_short fport = fport_arg, lport = lport_arg; + int s; + + s = splnet(); + + for (inp = head->lh_first; inp != NULL; inp = inp->inp_list.le_next) { + if (inp->inp_lport != lport) + continue; + wildcard = 0; + if (inp->inp_faddr.s_addr != INADDR_ANY) { + if (faddr.s_addr == INADDR_ANY) + wildcard++; + else if (inp->inp_faddr.s_addr != faddr.s_addr || + inp->inp_fport != fport) + continue; + } else { + if (faddr.s_addr != INADDR_ANY) + wildcard++; + } + if (inp->inp_laddr.s_addr != INADDR_ANY) { + if (laddr.s_addr == INADDR_ANY) + wildcard++; + else if (inp->inp_laddr.s_addr != laddr.s_addr) + continue; + } else { + if (laddr.s_addr != INADDR_ANY) + wildcard++; + } + if (wildcard && (flags & INPLOOKUP_WILDCARD) == 0) + continue; + if (wildcard < matchwild) { + match = inp; + matchwild = wildcard; + if (matchwild == 0) { + break; + } + } + } + splx(s); + return (match); +} + +/* + * Lookup PCB in hash list. + */ +struct inpcb * +in_pcblookuphash(pcbinfo, faddr, fport_arg, laddr, lport_arg) + struct inpcbinfo *pcbinfo; + struct in_addr faddr, laddr; + u_int fport_arg, lport_arg; +{ + struct inpcbhead *head; + register struct inpcb *inp; + u_short fport = fport_arg, lport = lport_arg; + int s; + + s = splnet(); + /* + * First look for an exact match. + */ + head = &pcbinfo->hashbase[(faddr.s_addr + lport + fport) % pcbinfo->hashsize]; + + for (inp = head->lh_first; inp != NULL; inp = inp->inp_hash.le_next) { + if (inp->inp_faddr.s_addr != faddr.s_addr || + inp->inp_fport != fport || + inp->inp_lport != lport || + inp->inp_laddr.s_addr != laddr.s_addr) + continue; + /* + * Move PCB to head of this hash chain so that it can be + * found more quickly in the future. + */ + if (inp != head->lh_first) { + LIST_REMOVE(inp, inp_hash); + LIST_INSERT_HEAD(head, inp, inp_hash); + } + break; + } + splx(s); + return (inp); +} + +/* + * Insert PCB into hash chain. Must be called at splnet. + */ +void +in_pcbinshash(inp) + struct inpcb *inp; +{ + struct inpcbhead *head; + + head = &inp->inp_pcbinfo->hashbase[(inp->inp_faddr.s_addr + + inp->inp_lport + inp->inp_fport) % inp->inp_pcbinfo->hashsize]; + + LIST_INSERT_HEAD(head, inp, inp_hash); +} + +void +in_pcbrehash(inp) + struct inpcb *inp; +{ + struct inpcbhead *head; + int s; + + s = splnet(); + LIST_REMOVE(inp, inp_hash); + + head = &inp->inp_pcbinfo->hashbase[(inp->inp_faddr.s_addr + + inp->inp_lport + inp->inp_fport) % inp->inp_pcbinfo->hashsize]; + + LIST_INSERT_HEAD(head, inp, inp_hash); + splx(s); +} + +void in_losing(struct inpcb *inp) { } diff --git a/reactos/drivers/lib/oskittcp/oskittcp/in_proto.c b/reactos/drivers/lib/oskittcp/oskittcp/in_proto.c new file mode 100644 index 00000000000..3c8ce2f0fbf --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/in_proto.c @@ -0,0 +1,150 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * From: @(#)in_proto.c 8.1 (Berkeley) 6/10/93 + */ + +#include <sys/param.h> +#include <sys/kernel.h> +#include <sys/socket.h> +#include <sys/protosw.h> +#include <sys/domain.h> +#include <sys/mbuf.h> +#include <sys/queue.h> + +#include <net/if.h> +#include <net/radix.h> +#include <net/route.h> + +#include <netinet/in.h> +#include <netinet/in_systm.h> +#include <netinet/ip.h> +#include <netinet/ip_var.h> +#include <netinet/ip_icmp.h> +#include <netinet/in_pcb.h> +#include <netinet/igmp_var.h> +#include <netinet/tcp.h> +#include <netinet/tcp_fsm.h> +#include <netinet/tcp_seq.h> +#include <netinet/tcp_timer.h> +#include <netinet/tcp_var.h> +#include <netinet/tcpip.h> +#ifdef TCPDEBUG +#include <netinet/tcp_debug.h> +#endif +#include <netinet/udp.h> +#include <netinet/udp_var.h> +/* + * TCP/IP protocol family: IP, ICMP, UDP, TCP. + */ + +#ifdef NSIP +void idpip_input(), nsip_ctlinput(); +#endif + +#ifdef TPIP +void tpip_input(), tpip_ctlinput(), tp_ctloutput(); +int tp_init(), tp_slowtimo(), tp_drain(), tp_usrreq(); +#endif + +#ifdef EON +void eoninput(), eonctlinput(), eonprotoinit(); +#endif /* EON */ + +void rsvp_input(struct mbuf *, int); +void ipip_input(struct mbuf *, int); + +extern struct domain inetdomain; + +struct protosw inetsw[] = { +{ SOCK_STREAM, &inetdomain, IPPROTO_TCP, + PR_CONNREQUIRED|PR_IMPLOPCL|PR_WANTRCVD, + tcp_input, 0, tcp_ctlinput, tcp_ctloutput, + tcp_usrreq, + tcp_init, tcp_fasttimo, tcp_slowtimo, tcp_drain, tcp_sysctl +}, +}; + +extern int in_inithead(void **, int); + +struct domain inetdomain = + { AF_INET, "internet", 0, 0, 0, + inetsw, &inetsw[sizeof(inetsw)/sizeof(inetsw[0])], 0, + in_inithead, 32, sizeof(struct sockaddr_in) + }; + +DOMAIN_SET(inet); + +#include "imp.h" +#if NIMP > 0 +extern struct domain impdomain; +int rimp_output(), hostslowtimo(); + +struct protosw impsw[] = { +{ SOCK_RAW, &impdomain, 0, PR_ATOMIC|PR_ADDR, + 0, rimp_output, 0, 0, + rip_usrreq, + 0, 0, hostslowtimo, 0, +}, +}; + +struct domain impdomain = + { AF_IMPLINK, "imp", 0, 0, 0, + impsw, &impsw[sizeof (impsw)/sizeof(impsw[0])] }; + +DOMAIN_SET(imp); + +#endif + +#if 0 +#include "hy.h" +#if NHY > 0 +/* + * HYPERchannel protocol family: raw interface. + */ +int rhy_output(); +extern struct domain hydomain; + +struct protosw hysw[] = { +{ SOCK_RAW, &hydomain, 0, PR_ATOMIC|PR_ADDR, + 0, rhy_output, 0, 0, + rip_usrreq, + 0, 0, 0, 0, +}, +}; + +struct domain hydomain = + { AF_HYLINK, "hy", 0, 0, 0, hysw, &hysw[sizeof (hysw)/sizeof(hysw[0])] }; + +DOMAIN_SET(hy); +#endif +#endif diff --git a/reactos/drivers/lib/oskittcp/oskittcp/in_rmx.c b/reactos/drivers/lib/oskittcp/oskittcp/in_rmx.c new file mode 100644 index 00000000000..ce8d1b0e2d1 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/in_rmx.c @@ -0,0 +1,91 @@ +/* + * Copyright 1994, 1995 Massachusetts Institute of Technology + * + * Permission to use, copy, modify, and distribute this software and + * its documentation for any purpose and without fee is hereby + * granted, provided that both the above copyright notice and this + * permission notice appear in all copies, that both the above + * copyright notice and this permission notice appear in all + * supporting documentation, and that the name of M.I.T. not be used + * in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. M.I.T. makes + * no representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied + * warranty. + * + * THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS + * ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + * SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +/* + * This code does two things necessary for the enhanced TCP metrics to + * function in a useful manner: + * 1) It marks all non-host routes as `cloning', thus ensuring that + * every actual reference to such a route actually gets turned + * into a reference to a host route to the specific destination + * requested. + * 2) When such routes lose all their references, it arranges for them + * to be deleted in some random collection of circumstances, so that + * a large quantity of stale routing data is not kept in kernel memory + * indefinitely. See in_rtqtimo() below for the exact mechanism. + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/queue.h> +#include <sys/socket.h> +#include <sys/socketvar.h> +#include <sys/mbuf.h> +#include <sys/syslog.h> + +#include <net/if.h> +#include <net/route.h> +#include <netinet/in.h> +#include <netinet/in_systm.h> +#include <netinet/in_var.h> + +#include <netinet/ip.h> +#include <netinet/ip_var.h> + +#include <netinet/tcp.h> +#include <netinet/tcp_seq.h> +#include <netinet/tcp_timer.h> +#include <netinet/tcp_var.h> +#include <netinet/tcpip.h> + +/* + * Initialize our routing tree. + */ +int +in_inithead(void **head, int off) +{ + struct radix_node_head *rnh; + + if(!rn_inithead(head, off)) + return 0; + + if(head != (void **)&rt_tables[AF_INET]) /* BOGUS! */ + return 1; /* only do this for the real routing table */ + + rnh = *head; +#if 0 + rnh->rnh_addaddr = in_addroute; + rnh->rnh_matchaddr = in_matroute; + rnh->rnh_close = in_clsroute; + in_rtqtimo(rnh); /* kick off timeout first time */ +#endif + return 1; +} + diff --git a/reactos/drivers/lib/oskittcp/oskittcp/inet_ntoa.c b/reactos/drivers/lib/oskittcp/oskittcp/inet_ntoa.c new file mode 100644 index 00000000000..d25dff83f84 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/inet_ntoa.c @@ -0,0 +1,51 @@ + +/* + * Copyright 1994, 1995 Massachusetts Institute of Technology + * + * Permission to use, copy, modify, and distribute this software and + * its documentation for any purpose and without fee is hereby + * granted, provided that both the above copyright notice and this + * permission notice appear in all copies, that both the above + * copyright notice and this permission notice appear in all + * supporting documentation, and that the name of M.I.T. not be used + * in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. M.I.T. makes + * no representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied + * warranty. + * + * THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS + * ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT + * SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <sys/param.h> +#include <sys/systm.h> + +#include <netinet/in.h> + +#ifndef __REACTOS__ +char * +inet_ntoa(struct in_addr ina) +{ + static char buf[4*sizeof "123"]; + unsigned char *ucp = (unsigned char *)&ina; + + sprintf(buf, "%d.%d.%d.%d", + ucp[0] & 0xff, + ucp[1] & 0xff, + ucp[2] & 0xff, + ucp[3] & 0xff); + return buf; +} + +#endif diff --git a/reactos/drivers/lib/oskittcp/oskittcp/interface.c b/reactos/drivers/lib/oskittcp/oskittcp/interface.c new file mode 100644 index 00000000000..08ef28fd604 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/interface.c @@ -0,0 +1,292 @@ +#include <oskittcp.h> +#include <oskitdebug.h> +#include <ntddk.h> +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/socket.h> +#include <sys/kernel.h> +#include <sys/filedesc.h> +#include <sys/proc.h> +#include <sys/fcntl.h> +#include <sys/file.h> +#include <sys/mbuf.h> +#include <sys/protosw.h> +#include <sys/socket.h> +#include <sys/socketvar.h> +#include <sys/uio.h> + +struct linker_set domain_set; + +OSKITTCP_EVENT_HANDLERS OtcpEvent = { 0 }; + +OSK_UINT OskitDebugTraceLevel = OSK_DEBUG_ULTRA; + +/* SPL */ +unsigned cpl; +unsigned net_imask; +unsigned volatile ipending; +struct timeval boottime; + +void InitOskitTCP() { + OS_DbgPrint(OSK_MID_TRACE,("Init Called\n")); + OS_DbgPrint(OSK_MID_TRACE,("Init fake freebsd scheduling\n")); + init_freebsd_sched(); + OS_DbgPrint(OSK_MID_TRACE,("Init clock\n")); + clock_init(); + OS_DbgPrint(OSK_MID_TRACE,("Init TCP\n")); + tcp_init(); + OS_DbgPrint(OSK_MID_TRACE,("Init routing\n")); + domaininit(); + memset( &OtcpEvent, 0, sizeof( OtcpEvent ) ); + OS_DbgPrint(OSK_MID_TRACE,("Init Finished\n")); + tcp_iss = 1024; +} + +void DeinitOskitTCP() { +} + +void TimerOskitTCP() { + tcp_slowtimo(); +} + +void RegisterOskitTCPEventHandlers( POSKITTCP_EVENT_HANDLERS EventHandlers ) { + memcpy( &OtcpEvent, EventHandlers, sizeof(OtcpEvent) ); + if( OtcpEvent.PacketSend ) + OS_DbgPrint(OSK_MID_TRACE,("SendPacket handler registered: %x\n", + OtcpEvent.PacketSend)); + if( OtcpEvent.Bind ) + OS_DbgPrint(OSK_MID_TRACE,("Bind handler registered: %x\n", + OtcpEvent.Bind)); +} + +void OskitDumpBuffer( OSK_PCHAR Data, OSK_UINT Len ) { + unsigned int i; + + for( i = 0; i < Len; i++ ) { + if( i && !(i & 0xf) ) DbgPrint( "\n" ); + if( !(i & 0xf) ) DbgPrint( "%08x: ", (UINT)(Data + i) ); + DbgPrint( " %02x", Data[i] ); + } + DbgPrint("\n"); +} + +/* From uipc_syscalls.c */ + +int OskitTCPSocket( void *context, + void **aso, + int domain, + int type, + int proto ) +{ + struct socket *so; + int error = socreate(domain, &so, type, proto); + if( !error ) { + so->so_connection = context; + *aso = so; + } + return error; +#if 0 + register struct protosw *prp; + register struct socket *so; + register int error; + + if (proto) { + prp = pffindproto(domain, proto, type); + } else { + prp = pffindtype(domain, type); + } + if (prp == 0 || prp->pr_usrreq == 0) { + return (EPROTONOSUPPORT); + } + if (prp->pr_type != type) { + return (EPROTOTYPE); + } + MALLOC(so, struct socket *, sizeof(*so), M_SOCKET, M_WAIT); + bzero((caddr_t)so, sizeof(*so)); + so->so_type = type; + so->so_proto = prp; + error = + (*prp->pr_usrreq)(so, PRU_ATTACH, + (struct mbuf *)0, + (struct mbuf *)proto, + (struct mbuf *)0); + if (error) { + so->so_state |= SS_NOFDREF; + sofree(so); + return (error); + } + *aso = so; + OS_DbgPrint(OSK_MAX_TRACE,("Returning Socket %x\n", so)); + return STATUS_SUCCESS; +#endif +} + +static int +getsockaddr(namp, uaddr, len) +/* [<][>][^][v][top][bottom][index][help] */ + struct sockaddr **namp; +caddr_t uaddr; +size_t len; +{ + struct sockaddr *sa; + int error; + + if (len > SOCK_MAXADDRLEN) + return ENAMETOOLONG; + MALLOC(sa, struct sockaddr *, len, M_SONAME, M_WAITOK); + error = copyin(uaddr, sa, len); + if (error) { + FREE(sa, M_SONAME); + } else { + *namp = sa; + } + return error; +} + +NTSTATUS OskitTCPConnect( PVOID socket, PVOID connection, + PVOID nam, OSK_UINT namelen ) { + struct socket *so = socket; + struct connect_args _uap = { + 0, nam, namelen + }, *uap = &_uap; + int error = EFAULT, s; + struct mbuf sabuf = { 0 }; + struct sockaddr addr; + + OS_DbgPrint(OSK_MID_TRACE,("Called, socket = %08x\n", socket)); + + so->so_connection = connection; + + if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) { + error = EALREADY; + goto done; + } + + OS_DbgPrint(OSK_MIN_TRACE,("Nam: %x\n", nam)); + if( nam ) + addr = *((struct sockaddr *)nam); + + sabuf.m_data = (void *)&addr; + sabuf.m_len = sizeof(addr); + + addr.sa_family = addr.sa_len; + addr.sa_len = sizeof(struct sockaddr); + + error = soconnect(so, &sabuf); + + if (error) + goto bad; + + if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) { + error = EINPROGRESS; + 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; + + if (error == ERESTART) + error = EINTR; + +done: + OS_DbgPrint(OSK_MID_TRACE,("Ending: %08x\n", error)); + return (error); +} + +DWORD OskitTCPClose( VOID *socket ) { +} + +DWORD OskitTCPSend( VOID *socket, OSK_PCHAR Data, OSK_UINT Len, int flags ) { + OskitDumpBuffer( Data, Len ); + struct mbuf mb; + mb.m_data = Data; + mb.m_len = Len; + return sosend( socket, NULL, NULL, (struct mbuf *)&mb, NULL, 0 ); +} + +void OskitTCPReceive( VOID *socket, PVOID AddrOut, + OSK_PCHAR Data, OSK_UINT Len, OSK_UINT *OutLen ) { +} + +VOID *OskitTCPAccept( VOID *socket, PVOID AddrOut ) { +} + +void OskitTCPReceiveDatagram( OSK_PCHAR Data, OSK_UINT Len, + OSK_UINT IpHeaderLen ) { + struct mbuf *Ip = m_get(M_DONTWAIT, MT_DATA); + char *NewData = malloc( Len ); + + OS_DbgPrint(OSK_MAX_TRACE, ("OskitTCPReceiveDatagram: %d Bytes\n", Len)); + + OskitDumpBuffer( Data, Len ); + + memset( Ip, 0, sizeof( *Ip ) ); + Ip->m_len = Len; + Ip->m_data = NewData; + memcpy( Ip->m_data, Data, Len ); + + tcp_input(Ip, IpHeaderLen); + + /* The buffer Ip is freed by tcp_input */ +} + +void OskitTCPBind( VOID *socket, PVOID name ) { +} + +void OskitTCPListen( VOID *socket, int backlog ) { +} + +void OskitTCPSetAddress( VOID *socket, + ULONG LocalAddress, + USHORT LocalPort, + ULONG RemoteAddress, + USHORT RemotePort ) { + struct socket *so = socket; + struct inpcb *inp = so->so_pcb; + inp->inp_laddr.s_addr = LocalAddress; + inp->inp_lport = LocalPort; + inp->inp_faddr.s_addr = RemoteAddress; + inp->inp_fport = RemotePort; + DbgPrint("OSKIT: SET ADDR %x:%x -> %x:%x\n", + LocalAddress, LocalPort, + RemoteAddress, RemotePort); +} + +void OskitTCPGetAddress( VOID *socket, + PULONG LocalAddress, + PUSHORT LocalPort, + PULONG RemoteAddress, + PUSHORT RemotePort ) { + struct socket *so = socket; + struct inpcb *inp = so ? so->so_pcb : 0; + if( inp ) { + *LocalAddress = inp->inp_laddr.s_addr; + *LocalPort = inp->inp_lport; + *RemoteAddress = inp->inp_faddr.s_addr; + *RemotePort = inp->inp_fport; + DbgPrint("OSKIT: GET ADDR %x:%x -> %x:%x\n", + *LocalAddress, *LocalPort, + *RemoteAddress, *RemotePort); + } +} + +void oskittcp_die( const char *file, int line ) { + DbgPrint("\n\n*** OSKITTCP: Panic Called at %s:%d ***\n", file, line); + KeBugCheck(0); +} diff --git a/reactos/drivers/lib/oskittcp/oskittcp/ip_input.c b/reactos/drivers/lib/oskittcp/oskittcp/ip_input.c new file mode 100644 index 00000000000..d816fe69725 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/ip_input.c @@ -0,0 +1,190 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ip_input.c 8.2 (Berkeley) 1/4/94 + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/malloc.h> +#include <sys/mbuf.h> +#include <sys/domain.h> +#include <sys/protosw.h> +#include <sys/socket.h> +#include <sys/errno.h> +#include <sys/time.h> +#include <sys/kernel.h> +#include <sys/syslog.h> + +#include <vm/vm.h> +#include <sys/sysctl.h> + +#include <net/if.h> +#include <net/route.h> +#include <net/netisr.h> + +#include <netinet/in.h> +#include <netinet/in_systm.h> +#include <netinet/in_var.h> +#include <netinet/ip.h> +#include <netinet/in_pcb.h> +#include <netinet/in_var.h> +#include <netinet/ip_var.h> +#include <netinet/ip_icmp.h> + +#include <netinet/ip_fw.h> + +#include <sys/socketvar.h> + +u_char inetctlerrmap[PRC_NCMDS] = { + 0, 0, 0, 0, + 0, EMSGSIZE, EHOSTDOWN, EHOSTUNREACH, + EHOSTUNREACH, EHOSTUNREACH, ECONNREFUSED, ECONNREFUSED, + EMSGSIZE, EHOSTUNREACH, 0, 0, + 0, 0, 0, 0, + ENOPROTOOPT +}; + +struct in_ifaddr *in_ifaddr; /* first inet address */ +int ip_defttl = IPDEFTTL; +struct ipstat ipstat; + +/* + * We need to save the IP options in case a protocol wants to respond + * to an incoming packet over the same route if the packet got here + * using IP source routing. This allows connection establishment and + * maintenance when the remote end is on a network that is not known + * to us. + */ +int ip_nhops = 0; +static struct ip_srcrt { + struct in_addr dst; /* final destination */ + char nop; /* one NOP to align */ + char srcopt[IPOPT_OFFSET + 1]; /* OPTVAL, OLEN and OFFSET */ + struct in_addr route[MAX_IPOPTLEN/sizeof(struct in_addr)]; +} ip_srcrt; + +/* + * Strip out IP options, at higher + * level protocol in the kernel. + * Second argument is buffer to which options + * will be moved, and return value is their length. + * XXX should be deleted; last arg currently ignored. + */ +void +ip_stripoptions(m, mopt) + register struct mbuf *m; + struct mbuf *mopt; +{ + register int i; + struct ip *ip = mtod(m, struct ip *); + register caddr_t opts; + int olen; + + olen = (ip->ip_hl<<2) - sizeof (struct ip); + opts = (caddr_t)(ip + 1); + i = m->m_len - (sizeof (struct ip) + olen); + bcopy(opts + olen, opts, (unsigned)i); + m->m_len -= olen; + if (m->m_flags & M_PKTHDR) + m->m_pkthdr.len -= olen; + ip->ip_hl = sizeof(struct ip) >> 2; +} + +/* + * Retrieve incoming source route for use in replies, + * in the same form used by setsockopt. + * The first hop is placed before the options, will be removed later. + */ +struct mbuf * +ip_srcroute() +{ + register struct in_addr *p, *q; + register struct mbuf *m; + + if (ip_nhops == 0) + return ((struct mbuf *)0); + m = m_get(M_DONTWAIT, MT_SOOPTS); + if (m == 0) + return ((struct mbuf *)0); + +#define OPTSIZ (sizeof(ip_srcrt.nop) + sizeof(ip_srcrt.srcopt)) + + /* length is (nhops+1)*sizeof(addr) + sizeof(nop + srcrt header) */ + m->m_len = ip_nhops * sizeof(struct in_addr) + sizeof(struct in_addr) + + OPTSIZ; +#ifdef DIAGNOSTIC + if (ipprintfs) + printf("ip_srcroute: nhops %d mlen %d", ip_nhops, m->m_len); +#endif + + /* + * First save first hop for return route + */ + p = &ip_srcrt.route[ip_nhops - 1]; + *(mtod(m, struct in_addr *)) = *p--; +#ifdef DIAGNOSTIC + if (ipprintfs) + printf(" hops %lx", ntohl(mtod(m, struct in_addr *)->s_addr)); +#endif + + /* + * Copy option fields and padding (nop) to mbuf. + */ + ip_srcrt.nop = IPOPT_NOP; + ip_srcrt.srcopt[IPOPT_OFFSET] = IPOPT_MINOFF; + (void)memcpy(mtod(m, caddr_t) + sizeof(struct in_addr), + &ip_srcrt.nop, OPTSIZ); + q = (struct in_addr *)(mtod(m, caddr_t) + + sizeof(struct in_addr) + OPTSIZ); +#undef OPTSIZ + /* + * Record return path as an IP source route, + * reversing the path (pointers are now aligned). + */ + while (p >= ip_srcrt.route) { +#ifdef DIAGNOSTIC + if (ipprintfs) + printf(" %lx", ntohl(q->s_addr)); +#endif + *q++ = *p--; + } + /* + * Last hop goes to final destination. + */ + *q = ip_srcrt.dst; +#ifdef DIAGNOSTIC + if (ipprintfs) + printf(" %lx\n", ntohl(q->s_addr)); +#endif + return (m); +} diff --git a/reactos/drivers/lib/oskittcp/oskittcp/ip_output.c b/reactos/drivers/lib/oskittcp/oskittcp/ip_output.c new file mode 100644 index 00000000000..4a00269f56c --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/ip_output.c @@ -0,0 +1,300 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ip_output.c 8.3 (Berkeley) 1/21/94 + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/malloc.h> +#include <sys/mbuf.h> +#include <sys/errno.h> +#include <sys/protosw.h> +#include <sys/socket.h> +#include <sys/socketvar.h> +#include <sys/queue.h> + +#include <net/if.h> +#include <net/route.h> + +#include <netinet/in.h> +#include <netinet/in_systm.h> +#include <netinet/ip.h> +#include <netinet/in_pcb.h> +#include <netinet/in_var.h> +#include <netinet/ip_var.h> + +#include <netinet/ip_fw.h> + +#ifdef vax +#include <machine/mtpr.h> +#endif +#include <oskittcp.h> + +u_short ip_id; + +/* + * Discard the IP multicast options. + */ +void +ip_freemoptions(imo) + register struct ip_moptions *imo; +{ + register int i; + + if (imo != NULL) { + for (i = 0; i < imo->imo_num_memberships; ++i) + in_delmulti(imo->imo_membership[i]); + free(imo, M_IPMOPTS); + } +} + +/* + * IP output. The packet in mbuf chain m contains a skeletal IP + * header (with len, off, ttl, proto, tos, src, dst). + * The mbuf chain containing the packet will be freed. + * The mbuf opt, if present, will not be freed. + */ +int +ip_output(so, m0, opt, ro, flags, imo) + struct socket *so; + struct mbuf *m0; + struct mbuf *opt; + struct route *ro; + int flags; + struct ip_moptions *imo; +{ + register struct mbuf *m = m0; + int error = ENETDOWN; + /* + * It might seem obvious at first glance that one could easily + * make a one-behind cache out of this by simply making `iproute' + * static and eliminating the bzero() below. However, this turns + * out not to work, for two reasons: + * + * 1) This routine needs to be reentrant. It can be called + * recursively from encapsulating network interfaces, and it + * is always called recursively from ip_mforward(). + * + * 2) You turn out not to gain much. There is already a one- + * behind cache implemented for the specific case of forwarding, + * and sends on a connected socket will use a route associated + * with the PCB. The only cases left are sends on unconnected + * and raw sockets, and if these cases are really significant, + * something is seriously wrong. + */ + ipstat.ips_localout++; + + /* + * If this is the case, we probably don't want to allocate + * a protocol-cloned route since we didn't get one from the + * ULP. This lets TCP do its thing, while not burdening + * forwarding or ICMP with the overhead of cloning a route. + * Of course, we still want to do any cloning requested by + * the link layer, as this is probably required in all cases + * for correct operation (as it is for ARP). + */ + + if( OtcpEvent.PacketSend ) { + error = OtcpEvent.PacketSend + ( OtcpEvent.ClientData, + so, + so ? so->so_connection : 0, + m->m_data + IPHDR_SIZE, m->m_len - IPHDR_SIZE ); + } + + return (error); +} + +/* + * Copy options from ip to jp, + * omitting those not copied during fragmentation. + */ +int +ip_optcopy(ip, jp) + struct ip *ip, *jp; +{ + register u_char *cp, *dp; + int opt, optlen, cnt; + + cp = (u_char *)(ip + 1); + dp = (u_char *)(jp + 1); + cnt = (ip->ip_hl << 2) - sizeof (struct ip); + for (; cnt > 0; cnt -= optlen, cp += optlen) { + opt = cp[0]; + if (opt == IPOPT_EOL) + break; + if (opt == IPOPT_NOP) { + /* Preserve for IP mcast tunnel's LSRR alignment. */ + *dp++ = IPOPT_NOP; + optlen = 1; + continue; + } else + optlen = cp[IPOPT_OLEN]; + /* bogus lengths should have been caught by ip_dooptions */ + if (optlen > cnt) + optlen = cnt; + if (IPOPT_COPIED(opt)) { + (void)memcpy(dp, cp, (unsigned)optlen); + dp += optlen; + } + } + for (optlen = dp - (u_char *)(jp+1); optlen & 0x3; optlen++) + *dp++ = IPOPT_EOL; + return (optlen); +} + +/* + * IP socket option processing. + */ +int +ip_ctloutput(op, so, level, optname, mp) + int op; + struct socket *so; + int level, optname; + struct mbuf **mp; +{ + register struct inpcb *inp = sotoinpcb(so); + register struct mbuf *m = *mp; + register int optval = 0; + int error = 0; + + if (level != IPPROTO_IP) { + error = EINVAL; + if (op == PRCO_SETOPT && *mp) + (void) m_free(*mp); + } else switch (op) { + + case PRCO_SETOPT: + switch (optname) { + case IP_TOS: + case IP_TTL: + case IP_RECVOPTS: + case IP_RECVRETOPTS: + case IP_RECVDSTADDR: + if (m == 0 || m->m_len != sizeof(int)) + error = EINVAL; + else { + optval = *mtod(m, int *); + switch (optname) { + + case IP_TOS: + inp->inp_ip.ip_tos = optval; + break; + + case IP_TTL: + inp->inp_ip.ip_ttl = optval; + break; +#define OPTSET(bit) \ + if (optval) \ + inp->inp_flags |= bit; \ + else \ + inp->inp_flags &= ~bit; + + case IP_RECVOPTS: + OPTSET(INP_RECVOPTS); + break; + + case IP_RECVRETOPTS: + OPTSET(INP_RECVRETOPTS); + break; + + case IP_RECVDSTADDR: + OPTSET(INP_RECVDSTADDR); + break; + } + } + break; +#undef OPTSET + default: + error = ENOPROTOOPT; + break; + } + if (m) + (void)m_free(m); + break; + + case PRCO_GETOPT: + switch (optname) { + case IP_OPTIONS: + case IP_RETOPTS: + *mp = m = m_get(M_WAIT, MT_SOOPTS); + if (inp->inp_options) { + m->m_len = inp->inp_options->m_len; + (void)memcpy(mtod(m, void *), + mtod(inp->inp_options, void *), (unsigned)m->m_len); + } else + m->m_len = 0; + break; + + case IP_TOS: + case IP_TTL: + case IP_RECVOPTS: + case IP_RECVRETOPTS: + case IP_RECVDSTADDR: + *mp = m = m_get(M_WAIT, MT_SOOPTS); + m->m_len = sizeof(int); + switch (optname) { + + case IP_TOS: + optval = inp->inp_ip.ip_tos; + break; + + case IP_TTL: + optval = inp->inp_ip.ip_ttl; + break; + +#define OPTBIT(bit) (inp->inp_flags & bit ? 1 : 0) + + case IP_RECVOPTS: + optval = OPTBIT(INP_RECVOPTS); + break; + + case IP_RECVRETOPTS: + optval = OPTBIT(INP_RECVRETOPTS); + break; + + case IP_RECVDSTADDR: + optval = OPTBIT(INP_RECVDSTADDR); + break; + } + *mtod(m, int *) = optval; + break; + + default: + error = ENOPROTOOPT; + break; + } + break; + } + return (error); +} diff --git a/reactos/drivers/lib/oskittcp/oskittcp/kern_clock.c b/reactos/drivers/lib/oskittcp/oskittcp/kern_clock.c new file mode 100644 index 00000000000..c53581fd5fe --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/kern_clock.c @@ -0,0 +1,361 @@ +/* + * Copyright (c) 1997-1998 University of Utah and the Flux Group. + * All rights reserved. + * + * This file is part of the Flux OSKit. The OSKit is free software, also known + * as "open source;" you can redistribute it and/or modify it under the terms + * of the GNU General Public License (GPL), version 2, as published by the Free + * Software Foundation (FSF). To explore alternate licensing terms, contact + * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. + * + * The OSKit 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 GPL for more details. You should have + * received a copy of the GPL along with the OSKit; see the file COPYING. If + * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. + */ +/* + * I am having no mercy with this file. + * I ripped out everything I didn't need + */ +/*- + * Copyright (c) 1982, 1986, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)kern_clock.c 8.5 (Berkeley) 1/21/94 + * $\Id: kern_clock.c,v 1.26 1996/07/30 16:59:22 bde Exp $ + */ + +/* Portions of this software are covered by the following: */ +/****************************************************************************** + * * + * Copyright (c) David L. Mills 1993, 1994 * + * * + * Permission to use, copy, modify, and distribute this software and its * + * documentation for any purpose and without fee is hereby granted, provided * + * that the above copyright notice appears in all copies and that both the * + * copyright notice and this permission notice appear in supporting * + * documentation, and that the name University of Delaware not be used in * + * advertising or publicity pertaining to distribution of the software * + * without specific, written prior permission. The University of Delaware * + * makes no representations about the suitability this software for any * + * purpose. It is provided "as is" without express or implied warranty. * + * * + *****************************************************************************/ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/callout.h> +#include <sys/kernel.h> +#include <sys/proc.h> + +/* Exported to machdep.c. */ +struct callout *callfree, *callout; + +static struct callout calltodo; + +long tk_cancc; +long tk_nin; +long tk_nout; +long tk_rawcc; + +/* + * Clock handling routines. + * + * This code is written to operate with two timers that run independently of + * each other. The main clock, running hz times per second, is used to keep + * track of real time. The second timer handles kernel and user profiling, + * and does resource use estimation. If the second timer is programmable, + * it is randomized to avoid aliasing between the two clocks. For example, + * the randomization prevents an adversary from always giving up the cpu + * just before its quantum expires. Otherwise, it would never accumulate + * cpu ticks. The mean frequency of the second timer is stathz. + * + * If no second timer exists, stathz will be zero; in this case we drive + * profiling and statistics off the main clock. This WILL NOT be accurate; + * do not do it unless absolutely necessary. + * + * The statistics clock may (or may not) be run at a higher rate while + * profiling. This profile clock runs at profhz. We require that profhz + * be an integral multiple of stathz. + * + * If the statistics clock is running fast, it must be divided by the ratio + * profhz/stathz for statistics. (For profiling, every tick counts.) + */ + +/* + * TODO: + * allocate more timeout table slots when table overflows. + */ + +/* + * Bump a timeval by a small number of usec's. + */ +#define BUMPTIME(t, usec) { \ + register volatile struct timeval *tp = (t); \ + register long us; \ + \ + tp->tv_usec = us = tp->tv_usec + (usec); \ + if (us >= 1000000) { \ + tp->tv_usec = us - 1000000; \ + tp->tv_sec++; \ + } \ +} + +int ticks; +volatile struct timeval time; +volatile struct timeval mono_time; + +/* + * The real-time timer, interrupting hz times per second. + */ +void bsd_hardclock(void) +{ + register struct callout *p1; + register int needsoft; + unsigned cpl; + int s; + + save_cpl(&cpl); + splhigh(); + + /* + * Update real-time timeout queue. + * At front of queue are some number of events which are ``due''. + * The time to these is <= 0 and if negative represents the + * number of ticks which have passed since it was supposed to happen. + * The rest of the q elements (times > 0) are events yet to happen, + * where the time for each is given as a delta from the previous. + * Decrementing just the first of these serves to decrement the time + * to all events. + */ + needsoft = 0; + for (p1 = calltodo.c_next; p1 != NULL; p1 = p1->c_next) { + if (--p1->c_time > 0) + break; + needsoft = 1; + if (p1->c_time == 0) + break; + } + + /* + * Increment the time-of-day. + */ + ticks++; + BUMPTIME(&mono_time, tick); + BUMPTIME(&time, tick); + + /* + * At this point, we might need a soft interrupt. We say, what the + * heck, let's do the work now. Reduce priority level to softclock + * first, though. The alternative (postponing it) would be called + * 'setsoftclock' + */ + if (needsoft) { + (void)splsoftclock(); + softclock(); + } + + restore_cpl(cpl); +} + +/* + * Software (low priority) clock interrupt. + * Run periodic events from timeout queue. + */ +/*ARGSUSED*/ +void +softclock() +{ + register struct callout *c; + register void *arg; + register void (*func) __P((void *)); + register int s; + + s = splhigh(); + while ((c = calltodo.c_next) != NULL && c->c_time <= 0) { + func = c->c_func; + arg = c->c_arg; + calltodo.c_next = c->c_next; + c->c_next = callfree; + callfree = c; + splx(s); + (*func)(arg); + (void) splhigh(); + } + splx(s); +} + +/* + * timeout -- + * Execute a function after a specified length of time. + * + * untimeout -- + * Cancel previous timeout function call. + * + * See AT&T BCI Driver Reference Manual for specification. This + * implementation differs from that one in that no identification + * value is returned from timeout, rather, the original arguments + * to timeout are used to identify entries for untimeout. + */ +void +timeout(ftn, arg, ticks) + timeout_t ftn; + void *arg; + register int ticks; +{ + register struct callout *new, *p, *t; + register int s; + + if (ticks <= 0) + ticks = 1; + + /* Lock out the clock. */ + s = splhigh(); + + /* Fill in the next free callout structure. */ + if (callfree == NULL) + panic("timeout table full"); + new = callfree; + callfree = new->c_next; + new->c_arg = arg; + new->c_func = ftn; + + /* + * The time for each event is stored as a difference from the time + * of the previous event on the queue. Walk the queue, correcting + * the ticks argument for queue entries passed. Correct the ticks + * value for the queue entry immediately after the insertion point + * as well. Watch out for negative c_time values; these represent + * overdue events. + */ + for (p = &calltodo; + (t = p->c_next) != NULL && ticks > t->c_time; p = t) + if (t->c_time > 0) + ticks -= t->c_time; + new->c_time = ticks; + if (t != NULL) + t->c_time -= ticks; + + /* Insert the new entry into the queue. */ + p->c_next = new; + new->c_next = t; + splx(s); +} + +void +untimeout(ftn, arg) + timeout_t ftn; + void *arg; +{ + register struct callout *p, *t; + register int s; + + s = splhigh(); + for (p = &calltodo; (t = p->c_next) != NULL; p = t) + if (t->c_func == ftn && t->c_arg == arg) { + /* Increment next entry's tick count. */ + if (t->c_next && t->c_time > 0) + t->c_next->c_time += t->c_time; + + /* Move entry from callout queue to callfree queue. */ + p->c_next = t->c_next; + t->c_next = callfree; + callfree = t; + break; + } + splx(s); +} + +/* + * Compute number of hz until specified time. Used to + * compute third argument to timeout() from an absolute time. + */ +int +hzto(tv) + struct timeval *tv; +{ + register unsigned long ticks; + register long sec, usec; + int s; + + /* + * If the number of usecs in the whole seconds part of the time + * difference fits in a long, then the total number of usecs will + * fit in an unsigned long. Compute the total and convert it to + * ticks, rounding up and adding 1 to allow for the current tick + * to expire. Rounding also depends on unsigned long arithmetic + * to avoid overflow. + * + * Otherwise, if the number of ticks in the whole seconds part of + * the time difference fits in a long, then convert the parts to + * ticks separately and add, using similar rounding methods and + * overflow avoidance. This method would work in the previous + * case but it is slightly slower and assumes that hz is integral. + * + * Otherwise, round the time difference down to the maximum + * representable value. + * + * If ints have 32 bits, then the maximum value for any timeout in + * 10ms ticks is 248 days. + */ + s = splclock(); + sec = tv->tv_sec - time.tv_sec; + usec = tv->tv_usec - time.tv_usec; + splx(s); + if (usec < 0) { + sec--; + usec += 1000000; + } + if (sec < 0) { +#ifdef DIAGNOSTIC + printf("hzto: negative time difference %ld sec %ld usec\n", + sec, usec); +#endif + ticks = 1; + } else if (sec <= LONG_MAX / 1000000) + ticks = (sec * 1000000 + (unsigned long)usec + (tick - 1)) + / tick + 1; + else if (sec <= LONG_MAX / hz) + ticks = sec * hz + + ((unsigned long)usec + (tick - 1)) / tick + 1; + else + ticks = LONG_MAX; + if (ticks > INT_MAX) + ticks = INT_MAX; + return (ticks); +} + diff --git a/reactos/drivers/lib/oskittcp/oskittcp/kern_subr.c b/reactos/drivers/lib/oskittcp/oskittcp/kern_subr.c new file mode 100644 index 00000000000..a7daef481f3 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/kern_subr.c @@ -0,0 +1,252 @@ +/* + * Copyright (c) 1982, 1986, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)kern_subr.c 8.3 (Berkeley) 1/21/94 + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/proc.h> +#include <sys/malloc.h> +#include <sys/queue.h> +#include <oskittcp.h> + +int +uiomove(cp, n, uio) + register caddr_t cp; + register int n; + register struct uio *uio; +{ + register struct iovec *iov; + u_int cnt; + int error; + +#ifdef DIAGNOSTIC + if (uio->uio_rw != UIO_READ && uio->uio_rw != UIO_WRITE) + panic("uiomove: mode"); + if (uio->uio_segflg == UIO_USERSPACE && uio->uio_procp != curproc) + panic("uiomove proc"); +#endif + while (n > 0 && uio->uio_resid) { + iov = uio->uio_iov; + cnt = iov->iov_len; + if (cnt == 0) { + uio->uio_iov++; + uio->uio_iovcnt--; + continue; + } + if (cnt > n) + cnt = n; + + switch (uio->uio_segflg) { + + case UIO_USERSPACE: + case UIO_USERISPACE: + if (uio->uio_rw == UIO_READ) + error = copyout(cp, iov->iov_base, cnt); + else + error = copyin(iov->iov_base, cp, cnt); + if (error) + return (error); + break; + + case UIO_SYSSPACE: + if (uio->uio_rw == UIO_READ) + bcopy((caddr_t)cp, iov->iov_base, cnt); + else + bcopy(iov->iov_base, (caddr_t)cp, cnt); + break; + case UIO_NOCOPY: + break; + } + iov->iov_base += cnt; + iov->iov_len -= cnt; + uio->uio_resid -= cnt; + uio->uio_offset += cnt; + cp += cnt; + n -= cnt; + } + return (0); +} + +/* + * Give next character to user as result of read. + */ +int +ureadc(c, uio) + register int c; + register struct uio *uio; +{ + register struct iovec *iov; + +again: + if (uio->uio_iovcnt == 0 || uio->uio_resid == 0) + panic("ureadc"); + iov = uio->uio_iov; + if (iov->iov_len == 0) { + uio->uio_iovcnt--; + uio->uio_iov++; + goto again; + } + switch (uio->uio_segflg) { + + case UIO_USERSPACE: + if (subyte(iov->iov_base, c) < 0) + return (EFAULT); + break; + + case UIO_SYSSPACE: + *iov->iov_base = c; + break; + + case UIO_USERISPACE: + if (suibyte(iov->iov_base, c) < 0) + return (EFAULT); + break; + case UIO_NOCOPY: + break; + } + iov->iov_base++; + iov->iov_len--; + uio->uio_resid--; + uio->uio_offset++; + return (0); +} + +#ifdef vax /* unused except by ct.c, other oddities XXX */ +/* + * Get next character written in by user from uio. + */ +int +uwritec(uio) + struct uio *uio; +{ + register struct iovec *iov; + register int c; + + if (uio->uio_resid <= 0) + return (-1); +again: + if (uio->uio_iovcnt <= 0) + panic("uwritec"); + iov = uio->uio_iov; + if (iov->iov_len == 0) { + uio->uio_iov++; + if (--uio->uio_iovcnt == 0) + return (-1); + goto again; + } + switch (uio->uio_segflg) { + + case UIO_USERSPACE: + c = fubyte(iov->iov_base); + break; + + case UIO_SYSSPACE: + c = *(u_char *) iov->iov_base; + break; + + case UIO_USERISPACE: + c = fuibyte(iov->iov_base); + break; + } + if (c < 0) + return (-1); + iov->iov_base++; + iov->iov_len--; + uio->uio_resid--; + uio->uio_offset++; + return (c); +} +#endif /* vax */ + +/* + * General routine to allocate a hash table. + */ +void * +hashinit(elements, type, hashmask) + int elements, type; + u_long *hashmask; +{ + long hashsize; + LIST_HEAD(generic, generic) *hashtbl; + int i; + + if (elements <= 0) + panic("hashinit: bad elements"); + for (hashsize = 1; hashsize <= elements; hashsize <<= 1) + continue; + hashsize >>= 1; + hashtbl = malloc((u_long)hashsize * sizeof(*hashtbl), type, M_WAITOK); + for (i = 0; i < hashsize; i++) + LIST_INIT(&hashtbl[i]); + *hashmask = hashsize - 1; + return (hashtbl); +} + +#define NPRIMES 27 +static int primes[] = { 1, 13, 31, 61, 127, 251, 509, 761, 1021, 1531, 2039, + 2557, 3067, 3583, 4093, 4603, 5119, 5623, 6143, 6653, + 7159, 7673, 8191, 12281, 16381, 24571, 32749 }; + +/* + * General routine to allocate a prime number sized hash table. + */ +void * +phashinit(elements, type, nentries) + int elements, type; + u_long *nentries; +{ + long hashsize; + LIST_HEAD(generic, generic) *hashtbl; + int i; + + if (elements <= 0) + panic("phashinit: bad elements"); + for (i = 1, hashsize = primes[1]; hashsize <= elements;) { + i++; + if (i == NPRIMES) + break; + hashsize = primes[i]; + } + hashsize = primes[i - 1]; + hashtbl = malloc((u_long)hashsize * sizeof(*hashtbl), type, M_WAITOK); + for (i = 0; i < hashsize; i++) + LIST_INIT(&hashtbl[i]); + *nentries = hashsize; + return (hashtbl); +} diff --git a/reactos/drivers/lib/oskittcp/oskittcp/malloc.c b/reactos/drivers/lib/oskittcp/oskittcp/malloc.c new file mode 100644 index 00000000000..2d3fb43500a --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/malloc.c @@ -0,0 +1,16 @@ +#include <oskittcp.h> +#include <oskitdebug.h> +#include <ntddk.h> +#include <memtrack.h> + +void *fbsd_malloc( size_t size, char *file, int line, ... ) { + void *v; + v = ExAllocatePool( NonPagedPool, size ); + if( v ) TrackWithTag(FBSD_MALLOC,v,file,line); + return v; +} + +void fbsd_free( void *data, char *file, int line, ... ) { + UntrackFL(file,line,data); + ExFreePool( data ); +} diff --git a/reactos/drivers/lib/oskittcp/oskittcp/param.c b/reactos/drivers/lib/oskittcp/oskittcp/param.c new file mode 100644 index 00000000000..871441fa780 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/param.c @@ -0,0 +1,24 @@ +/* + * Copyright (c) 1997-1998 University of Utah and the Flux Group. + * All rights reserved. + * + * This file is part of the Flux OSKit. The OSKit is free software, also known + * as "open source;" you can redistribute it and/or modify it under the terms + * of the GNU General Public License (GPL), version 2, as published by the Free + * Software Foundation (FSF). To explore alternate licensing terms, contact + * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. + * + * The OSKit 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 GPL for more details. You should have + * received a copy of the GPL along with the OSKit; see the file COPYING. If + * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. + */ + +#define HZ 100 +#define MAXUSERS 64 + +int hz = HZ; +int tick = 1000000 / HZ; +int nmbclusters = 512 + MAXUSERS * 16; + diff --git a/reactos/drivers/lib/oskittcp/oskittcp/radix.c b/reactos/drivers/lib/oskittcp/oskittcp/radix.c new file mode 100644 index 00000000000..a23552cc517 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/radix.c @@ -0,0 +1,1006 @@ +/* + * Copyright (c) 1988, 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)radix.c 8.4 (Berkeley) 11/2/94 + */ + +/* + * Routines to build and maintain radix trees for routing lookups. + */ +#ifndef _RADIX_H_ +#include <sys/param.h> +#ifdef KERNEL +#include <sys/systm.h> +#include <sys/malloc.h> +#define M_DONTWAIT M_NOWAIT +#include <sys/domain.h> +#else +#include <stdlib.h> +#endif +#include <sys/syslog.h> +#include <net/radix.h> +#endif +#include <oskittcp.h> + +int max_keylen; +struct radix_mask *rn_mkfreelist; +struct radix_node_head *mask_rnhead; +static char *addmask_key; +static char normal_chars[] = {0, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, -1}; +static char *rn_zeros, *rn_ones; + +#define rn_masktop (mask_rnhead->rnh_treetop) +#undef Bcmp +#define Bcmp(a, b, l) (l == 0 ? 0 : bcmp((caddr_t)(a), (caddr_t)(b), (u_long)l)) +/* + * The data structure for the keys is a radix tree with one way + * branching removed. The index rn_b at an internal node n represents a bit + * position to be tested. The tree is arranged so that all descendants + * of a node n have keys whose bits all agree up to position rn_b - 1. + * (We say the index of n is rn_b.) + * + * There is at least one descendant which has a one bit at position rn_b, + * and at least one with a zero there. + * + * A route is determined by a pair of key and mask. We require that the + * bit-wise logical and of the key and mask to be the key. + * We define the index of a route to associated with the mask to be + * the first bit number in the mask where 0 occurs (with bit number 0 + * representing the highest order bit). + * + * We say a mask is normal if every bit is 0, past the index of the mask. + * If a node n has a descendant (k, m) with index(m) == index(n) == rn_b, + * and m is a normal mask, then the route applies to every descendant of n. + * If the index(m) < rn_b, this implies the trailing last few bits of k + * before bit b are all 0, (and hence consequently true of every descendant + * of n), so the route applies to all descendants of the node as well. + * + * Similar logic shows that a non-normal mask m such that + * index(m) <= index(n) could potentially apply to many children of n. + * Thus, for each non-host route, we attach its mask to a list at an internal + * node as high in the tree as we can go. + * + * The present version of the code makes use of normal routes in short- + * circuiting an explict mask and compare operation when testing whether + * a key satisfies a normal route, and also in remembering the unique leaf + * that governs a subtree. + */ + +struct radix_node * +rn_search(v_arg, head) + void *v_arg; + struct radix_node *head; +{ + register struct radix_node *x; + register caddr_t v; + + for (x = head, v = v_arg; x->rn_b >= 0;) { + if (x->rn_bmask & v[x->rn_off]) + x = x->rn_r; + else + x = x->rn_l; + } + return (x); +}; + +struct radix_node * +rn_search_m(v_arg, head, m_arg) + struct radix_node *head; + void *v_arg, *m_arg; +{ + register struct radix_node *x; + register caddr_t v = v_arg, m = m_arg; + + for (x = head; x->rn_b >= 0;) { + if ((x->rn_bmask & m[x->rn_off]) && + (x->rn_bmask & v[x->rn_off])) + x = x->rn_r; + else + x = x->rn_l; + } + return x; +}; + +int +rn_refines(m_arg, n_arg) + void *m_arg, *n_arg; +{ + register caddr_t m = m_arg, n = n_arg; + register caddr_t lim, lim2 = lim = n + *(u_char *)n; + int longer = (*(u_char *)n++) - (int)(*(u_char *)m++); + int masks_are_equal = 1; + + if (longer > 0) + lim -= longer; + while (n < lim) { + if (*n & ~(*m)) + return 0; + if (*n++ != *m++) + masks_are_equal = 0; + } + while (n < lim2) + if (*n++) + return 0; + if (masks_are_equal && (longer < 0)) + for (lim2 = m - longer; m < lim2; ) + if (*m++) + return 1; + return (!masks_are_equal); +} + +struct radix_node * +rn_lookup(v_arg, m_arg, head) + void *v_arg, *m_arg; + struct radix_node_head *head; +{ + register struct radix_node *x; + caddr_t netmask = 0; + + if (m_arg) { + if ((x = rn_addmask(m_arg, 1, head->rnh_treetop->rn_off)) == 0) + return (0); + netmask = x->rn_key; + } + x = rn_match(v_arg, head); + if (x && netmask) { + while (x && x->rn_mask != netmask) + x = x->rn_dupedkey; + } + return x; +} + +static int +rn_satsifies_leaf(trial, leaf, skip) + char *trial; + register struct radix_node *leaf; + int skip; +{ + register char *cp = trial, *cp2 = leaf->rn_key, *cp3 = leaf->rn_mask; + char *cplim; + int length = min(*(u_char *)cp, *(u_char *)cp2); + + if (cp3 == 0) + cp3 = rn_ones; + else + length = min(length, *(u_char *)cp3); + cplim = cp + length; cp3 += skip; cp2 += skip; + for (cp += skip; cp < cplim; cp++, cp2++, cp3++) + if ((*cp ^ *cp2) & *cp3) + return 0; + return 1; +} + +struct radix_node * +rn_match(v_arg, head) + void *v_arg; + struct radix_node_head *head; +{ + caddr_t v = v_arg; + register struct radix_node *t = head->rnh_treetop, *x; + register caddr_t cp = v, cp2; + caddr_t cplim; + struct radix_node *saved_t, *top = t; + int off = t->rn_off, vlen = *(u_char *)cp, matched_off; + register int test, b, rn_b; + + /* + * Open code rn_search(v, top) to avoid overhead of extra + * subroutine call. + */ + for (; t->rn_b >= 0; ) { + if (t->rn_bmask & cp[t->rn_off]) + t = t->rn_r; + else + t = t->rn_l; + } + /* + * See if we match exactly as a host destination + * or at least learn how many bits match, for normal mask finesse. + * + * It doesn't hurt us to limit how many bytes to check + * to the length of the mask, since if it matches we had a genuine + * match and the leaf we have is the most specific one anyway; + * if it didn't match with a shorter length it would fail + * with a long one. This wins big for class B&C netmasks which + * are probably the most common case... + */ + if (t->rn_mask) + vlen = *(u_char *)t->rn_mask; + cp += off; cp2 = t->rn_key + off; cplim = v + vlen; + for (; cp < cplim; cp++, cp2++) + if (*cp != *cp2) + goto on1; + /* + * This extra grot is in case we are explicitly asked + * to look up the default. Ugh! + */ + if ((t->rn_flags & RNF_ROOT) && t->rn_dupedkey) + t = t->rn_dupedkey; + return t; +on1: + test = (*cp ^ *cp2) & 0xff; /* find first bit that differs */ + for (b = 7; (test >>= 1) > 0;) + b--; + matched_off = cp - v; + b += matched_off << 3; + rn_b = -1 - b; + /* + * If there is a host route in a duped-key chain, it will be first. + */ + if ((saved_t = t)->rn_mask == 0) + t = t->rn_dupedkey; + for (; t; t = t->rn_dupedkey) + /* + * Even if we don't match exactly as a host, + * we may match if the leaf we wound up at is + * a route to a net. + */ + if (t->rn_flags & RNF_NORMAL) { + if (rn_b <= t->rn_b) + return t; + } else if (rn_satsifies_leaf(v, t, matched_off)) + return t; + t = saved_t; + /* start searching up the tree */ + do { + register struct radix_mask *m; + t = t->rn_p; + m = t->rn_mklist; + if (m) { + /* + * If non-contiguous masks ever become important + * we can restore the masking and open coding of + * the search and satisfaction test and put the + * calculation of "off" back before the "do". + */ + do { + if (m->rm_flags & RNF_NORMAL) { + if (rn_b <= m->rm_b) + return (m->rm_leaf); + } else { + off = min(t->rn_off, matched_off); + x = rn_search_m(v, t, m->rm_mask); + while (x && x->rn_mask != m->rm_mask) + x = x->rn_dupedkey; + if (x && rn_satsifies_leaf(v, x, off)) + return x; + } + m = m->rm_mklist; + } while (m); + } + } while (t != top); + return 0; +}; + +#ifdef RN_DEBUG +int rn_nodenum; +struct radix_node *rn_clist; +int rn_saveinfo; +int rn_debug = 1; +#endif + +struct radix_node * +rn_newpair(v, b, nodes) + void *v; + int b; + struct radix_node nodes[2]; +{ + register struct radix_node *tt = nodes, *t = tt + 1; + t->rn_b = b; t->rn_bmask = 0x80 >> (b & 7); + t->rn_l = tt; t->rn_off = b >> 3; + tt->rn_b = -1; tt->rn_key = (caddr_t)v; tt->rn_p = t; + tt->rn_flags = t->rn_flags = RNF_ACTIVE; +#ifdef RN_DEBUG + tt->rn_info = rn_nodenum++; t->rn_info = rn_nodenum++; + tt->rn_twin = t; tt->rn_ybro = rn_clist; rn_clist = tt; +#endif + return t; +} + +struct radix_node * +rn_insert(v_arg, head, dupentry, nodes) + void *v_arg; + struct radix_node_head *head; + int *dupentry; + struct radix_node nodes[2]; +{ + caddr_t v = v_arg; + struct radix_node *top = head->rnh_treetop; + int head_off = top->rn_off, vlen = (int)*((u_char *)v); + register struct radix_node *t = rn_search(v_arg, top); + register caddr_t cp = v + head_off; + register int b; + struct radix_node *tt; + /* + * Find first bit at which v and t->rn_key differ + */ + { + register caddr_t cp2 = t->rn_key + head_off; + register int cmp_res; + caddr_t cplim = v + vlen; + + while (cp < cplim) + if (*cp2++ != *cp++) + goto on1; + *dupentry = 1; + return t; +on1: + *dupentry = 0; + cmp_res = (cp[-1] ^ cp2[-1]) & 0xff; + for (b = (cp - v) << 3; cmp_res; b--) + cmp_res >>= 1; + } + { + register struct radix_node *p, *x = top; + cp = v; + do { + p = x; + if (cp[x->rn_off] & x->rn_bmask) + x = x->rn_r; + else x = x->rn_l; + } while (b > (unsigned) x->rn_b); /* x->rn_b < b && x->rn_b >= 0 */ +#ifdef RN_DEBUG + if (rn_debug) + log(LOG_DEBUG, "rn_insert: Going In:\n"), traverse(p); +#endif + t = rn_newpair(v_arg, b, nodes); tt = t->rn_l; + if ((cp[p->rn_off] & p->rn_bmask) == 0) + p->rn_l = t; + else + p->rn_r = t; + x->rn_p = t; t->rn_p = p; /* frees x, p as temp vars below */ + if ((cp[t->rn_off] & t->rn_bmask) == 0) { + t->rn_r = x; + } else { + t->rn_r = tt; t->rn_l = x; + } +#ifdef RN_DEBUG + if (rn_debug) + log(LOG_DEBUG, "rn_insert: Coming Out:\n"), traverse(p); +#endif + } + return (tt); +} + +struct radix_node * +rn_addmask(n_arg, search, skip) + int search, skip; + void *n_arg; +{ + caddr_t netmask = (caddr_t)n_arg; + register struct radix_node *x; + register caddr_t cp, cplim; + register int b = 0, mlen, j; + int maskduplicated, m0, isnormal; + struct radix_node *saved_x; + static int last_zeroed = 0; + + if ((mlen = *(u_char *)netmask) > max_keylen) + mlen = max_keylen; + if (skip == 0) + skip = 1; + if (mlen <= skip) + return (mask_rnhead->rnh_nodes); + if (skip > 1) + Bcopy(rn_ones + 1, addmask_key + 1, skip - 1); + if ((m0 = mlen) > skip) + Bcopy(netmask + skip, addmask_key + skip, mlen - skip); + /* + * Trim trailing zeroes. + */ + for (cp = addmask_key + mlen; (cp > addmask_key) && cp[-1] == 0;) + cp--; + mlen = cp - addmask_key; + if (mlen <= skip) { + if (m0 >= last_zeroed) + last_zeroed = mlen; + return (mask_rnhead->rnh_nodes); + } + if (m0 < last_zeroed) + Bzero(addmask_key + m0, last_zeroed - m0); + *addmask_key = last_zeroed = mlen; + x = rn_search(addmask_key, rn_masktop); + if (Bcmp(addmask_key, x->rn_key, mlen) != 0) + x = 0; + if (x || search) + return (x); + R_Malloc(x, struct radix_node *, max_keylen + 2 * sizeof (*x)); + if ((saved_x = x) == 0) + return (0); + Bzero(x, max_keylen + 2 * sizeof (*x)); + netmask = cp = (caddr_t)(x + 2); + Bcopy(addmask_key, cp, mlen); + x = rn_insert(cp, mask_rnhead, &maskduplicated, x); + if (maskduplicated) { + log(LOG_ERR, "rn_addmask: mask impossibly already in tree"); + Free(saved_x); + return (x); + } + /* + * Calculate index of mask, and check for normalcy. + */ + cplim = netmask + mlen; isnormal = 1; + for (cp = netmask + skip; (cp < cplim) && *(u_char *)cp == 0xff;) + cp++; + if (cp != cplim) { + for (j = 0x80; (j & *cp) != 0; j >>= 1) + b++; + if (*cp != normal_chars[b] || cp != (cplim - 1)) + isnormal = 0; + } + b += (cp - netmask) << 3; + x->rn_b = -1 - b; + if (isnormal) + x->rn_flags |= RNF_NORMAL; + return (x); +} + +static int /* XXX: arbitrary ordering for non-contiguous masks */ +rn_lexobetter(m_arg, n_arg) + void *m_arg, *n_arg; +{ + register u_char *mp = m_arg, *np = n_arg, *lim; + + if (*mp > *np) + return 1; /* not really, but need to check longer one first */ + if (*mp == *np) + for (lim = mp + *mp; mp < lim;) + if (*mp++ > *np++) + return 1; + return 0; +} + +static struct radix_mask * +rn_new_radix_mask(tt, next) + register struct radix_node *tt; + register struct radix_mask *next; +{ + register struct radix_mask *m; + + MKGet(m); + if (m == 0) { + log(LOG_ERR, "Mask for route not entered\n"); + return (0); + } + Bzero(m, sizeof *m); + m->rm_b = tt->rn_b; + m->rm_flags = tt->rn_flags; + if (tt->rn_flags & RNF_NORMAL) + m->rm_leaf = tt; + else + m->rm_mask = tt->rn_mask; + m->rm_mklist = next; + tt->rn_mklist = m; + return m; +} + +struct radix_node * +rn_addroute(v_arg, n_arg, head, treenodes) + void *v_arg, *n_arg; + struct radix_node_head *head; + struct radix_node treenodes[2]; +{ + caddr_t v = (caddr_t)v_arg, netmask = (caddr_t)n_arg; + register struct radix_node *t, *x = 0, *tt; + struct radix_node *saved_tt, *top = head->rnh_treetop; + short b = 0, b_leaf = 0; + int keyduplicated; + caddr_t mmask; + struct radix_mask *m, **mp; + + /* + * In dealing with non-contiguous masks, there may be + * many different routes which have the same mask. + * We will find it useful to have a unique pointer to + * the mask to speed avoiding duplicate references at + * nodes and possibly save time in calculating indices. + */ + if (netmask) { + if ((x = rn_addmask(netmask, 0, top->rn_off)) == 0) + return (0); + b_leaf = x->rn_b; + b = -1 - x->rn_b; + netmask = x->rn_key; + } + /* + * Deal with duplicated keys: attach node to previous instance + */ + saved_tt = tt = rn_insert(v, head, &keyduplicated, treenodes); + if (keyduplicated) { + for (t = tt; tt; t = tt, tt = tt->rn_dupedkey) { + if (tt->rn_mask == netmask) + return (0); + if (netmask == 0 || + (tt->rn_mask && + ((b_leaf < tt->rn_b) || /* index(netmask) > node */ + rn_refines(netmask, tt->rn_mask) || + rn_lexobetter(netmask, tt->rn_mask)))) + break; + } + /* + * If the mask is not duplicated, we wouldn't + * find it among possible duplicate key entries + * anyway, so the above test doesn't hurt. + * + * We sort the masks for a duplicated key the same way as + * in a masklist -- most specific to least specific. + * This may require the unfortunate nuisance of relocating + * the head of the list. + */ + if (tt == saved_tt) { + struct radix_node *xx = x; + /* link in at head of list */ + (tt = treenodes)->rn_dupedkey = t; + tt->rn_flags = t->rn_flags; + tt->rn_p = x = t->rn_p; + t->rn_p = tt; /* parent */ + if (x->rn_l == t) x->rn_l = tt; else x->rn_r = tt; + saved_tt = tt; x = xx; + } else { + (tt = treenodes)->rn_dupedkey = t->rn_dupedkey; + t->rn_dupedkey = tt; + tt->rn_p = t; /* parent */ + if (tt->rn_dupedkey) /* parent */ + tt->rn_dupedkey->rn_p = tt; /* parent */ + } +#ifdef RN_DEBUG + t=tt+1; tt->rn_info = rn_nodenum++; t->rn_info = rn_nodenum++; + tt->rn_twin = t; tt->rn_ybro = rn_clist; rn_clist = tt; +#endif + tt->rn_key = (caddr_t) v; + tt->rn_b = -1; + tt->rn_flags = RNF_ACTIVE; + } + /* + * Put mask in tree. + */ + if (netmask) { + tt->rn_mask = netmask; + tt->rn_b = x->rn_b; + tt->rn_flags |= x->rn_flags & RNF_NORMAL; + } + t = saved_tt->rn_p; + if (keyduplicated) + goto on2; + b_leaf = -1 - t->rn_b; + if (t->rn_r == saved_tt) x = t->rn_l; else x = t->rn_r; + /* Promote general routes from below */ + if (x->rn_b < 0) { + for (mp = &t->rn_mklist; x; x = x->rn_dupedkey) + if (x->rn_mask && (x->rn_b >= b_leaf) && x->rn_mklist == 0) { + *mp = m = rn_new_radix_mask(x, 0); + if (m) + mp = &m->rm_mklist; + } + } else if (x->rn_mklist) { + /* + * Skip over masks whose index is > that of new node + */ + for (mp = &x->rn_mklist; (m = *mp); mp = &m->rm_mklist) + if (m->rm_b >= b_leaf) + break; + t->rn_mklist = m; *mp = 0; + } +on2: + /* Add new route to highest possible ancestor's list */ + if ((netmask == 0) || (b > t->rn_b )) + return tt; /* can't lift at all */ + b_leaf = tt->rn_b; + do { + x = t; + t = t->rn_p; + } while (b <= t->rn_b && x != top); + /* + * Search through routes associated with node to + * insert new route according to index. + * Need same criteria as when sorting dupedkeys to avoid + * double loop on deletion. + */ + for (mp = &x->rn_mklist; (m = *mp); mp = &m->rm_mklist) { + if (m->rm_b < b_leaf) + continue; + if (m->rm_b > b_leaf) + break; + if (m->rm_flags & RNF_NORMAL) { + mmask = m->rm_leaf->rn_mask; + if (tt->rn_flags & RNF_NORMAL) { + log(LOG_ERR, + "Non-unique normal route, mask not entered"); + return tt; + } + } else + mmask = m->rm_mask; + if (mmask == netmask) { + m->rm_refs++; + tt->rn_mklist = m; + return tt; + } + if (rn_refines(netmask, mmask) || rn_lexobetter(netmask, mmask)) + break; + } + *mp = rn_new_radix_mask(tt, *mp); + return tt; +} + +struct radix_node * +rn_delete(v_arg, netmask_arg, head) + void *v_arg, *netmask_arg; + struct radix_node_head *head; +{ + register struct radix_node *t, *p, *x, *tt; + struct radix_mask *m, *saved_m, **mp; + struct radix_node *dupedkey, *saved_tt, *top; + caddr_t v, netmask; + int b, head_off, vlen; + + v = v_arg; + netmask = netmask_arg; + x = head->rnh_treetop; + tt = rn_search(v, x); + head_off = x->rn_off; + vlen = *(u_char *)v; + saved_tt = tt; + top = x; + if (tt == 0 || + Bcmp(v + head_off, tt->rn_key + head_off, vlen - head_off)) + return (0); + /* + * Delete our route from mask lists. + */ + if (netmask) { + if ((x = rn_addmask(netmask, 1, head_off)) == 0) + return (0); + netmask = x->rn_key; + while (tt->rn_mask != netmask) + if ((tt = tt->rn_dupedkey) == 0) + return (0); + } + if (tt->rn_mask == 0 || (saved_m = m = tt->rn_mklist) == 0) + goto on1; + if (tt->rn_flags & RNF_NORMAL) { + if (m->rm_leaf != tt || m->rm_refs > 0) { + log(LOG_ERR, "rn_delete: inconsistent annotation\n"); + return 0; /* dangling ref could cause disaster */ + } + } else { + if (m->rm_mask != tt->rn_mask) { + log(LOG_ERR, "rn_delete: inconsistent annotation\n"); + goto on1; + } + if (--m->rm_refs >= 0) + goto on1; + } + b = -1 - tt->rn_b; + t = saved_tt->rn_p; + if (b > t->rn_b) + goto on1; /* Wasn't lifted at all */ + do { + x = t; + t = t->rn_p; + } while (b <= t->rn_b && x != top); + for (mp = &x->rn_mklist; (m = *mp); mp = &m->rm_mklist) + if (m == saved_m) { + *mp = m->rm_mklist; + MKFree(m); + break; + } + if (m == 0) { + log(LOG_ERR, "rn_delete: couldn't find our annotation\n"); + if (tt->rn_flags & RNF_NORMAL) + return (0); /* Dangling ref to us */ + } +on1: + /* + * Eliminate us from tree + */ + if (tt->rn_flags & RNF_ROOT) + return (0); +#ifdef RN_DEBUG + /* Get us out of the creation list */ + for (t = rn_clist; t && t->rn_ybro != tt; t = t->rn_ybro) {} + if (t) t->rn_ybro = tt->rn_ybro; +#endif + t = tt->rn_p; + dupedkey = saved_tt->rn_dupedkey; + if (dupedkey) { + /* + * at this point, tt is the deletion target and saved_tt + * is the head of the dupekey chain + */ + if (tt == saved_tt) { + /* remove from head of chain */ + x = dupedkey; x->rn_p = t; + if (t->rn_l == tt) t->rn_l = x; else t->rn_r = x; + } else { + /* find node in front of tt on the chain */ + for (x = p = saved_tt; p && p->rn_dupedkey != tt;) + p = p->rn_dupedkey; + if (p) { + p->rn_dupedkey = tt->rn_dupedkey; + if (tt->rn_dupedkey) /* parent */ + tt->rn_dupedkey->rn_p = p; /* parent */ + } else log(LOG_ERR, "rn_delete: couldn't find us\n"); + } + t = tt + 1; + if (t->rn_flags & RNF_ACTIVE) { +#ifndef RN_DEBUG + *++x = *t; p = t->rn_p; +#else + b = t->rn_info; *++x = *t; t->rn_info = b; p = t->rn_p; +#endif + if (p->rn_l == t) p->rn_l = x; else p->rn_r = x; + x->rn_l->rn_p = x; x->rn_r->rn_p = x; + } + goto out; + } + if (t->rn_l == tt) x = t->rn_r; else x = t->rn_l; + p = t->rn_p; + if (p->rn_r == t) p->rn_r = x; else p->rn_l = x; + x->rn_p = p; + /* + * Demote routes attached to us. + */ + if (t->rn_mklist) { + if (x->rn_b >= 0) { + for (mp = &x->rn_mklist; (m = *mp);) + mp = &m->rm_mklist; + *mp = t->rn_mklist; + } else { + /* If there are any key,mask pairs in a sibling + duped-key chain, some subset will appear sorted + in the same order attached to our mklist */ + for (m = t->rn_mklist; m && x; x = x->rn_dupedkey) + if (m == x->rn_mklist) { + struct radix_mask *mm = m->rm_mklist; + x->rn_mklist = 0; + if (--(m->rm_refs) < 0) + MKFree(m); + m = mm; + } + if (m) + log(LOG_ERR, "%s %p at %x\n", + "rn_delete: Orphaned Mask", m, x); + } + } + /* + * We may be holding an active internal node in the tree. + */ + x = tt + 1; + if (t != x) { +#ifndef RN_DEBUG + *t = *x; +#else + b = t->rn_info; *t = *x; t->rn_info = b; +#endif + t->rn_l->rn_p = t; t->rn_r->rn_p = t; + p = x->rn_p; + if (p->rn_l == x) p->rn_l = t; else p->rn_r = t; + } +out: + tt->rn_flags &= ~RNF_ACTIVE; + tt[1].rn_flags &= ~RNF_ACTIVE; + return (tt); +} + +/* + * This is the same as rn_walktree() except for the parameters and the + * exit. + */ +int +rn_walktree_from(h, a, m, f, w) + struct radix_node_head *h; + void *a, *m; + register int (*f)(); + void *w; +{ + int error; + struct radix_node *base, *next; + u_char *xa = (u_char *)a; + u_char *xm = (u_char *)m; + register struct radix_node *rn, *last = 0 /* shut up gcc */; + int stopping = 0; + int lastb; + + /* + * rn_search_m is sort-of-open-coded here. + */ + /* printf("about to search\n"); */ + for (rn = h->rnh_treetop; rn->rn_b >= 0; ) { + last = rn; + /* printf("rn_b %d, rn_bmask %x, xm[rn_off] %x\n", + rn->rn_b, rn->rn_bmask, xm[rn->rn_off]); */ + if (!(rn->rn_bmask & xm[rn->rn_off])) { + break; + } + if (rn->rn_bmask & xa[rn->rn_off]) { + rn = rn->rn_r; + } else { + rn = rn->rn_l; + } + } + /* printf("done searching\n"); */ + + /* + * Two cases: either we stepped off the end of our mask, + * in which case last == rn, or we reached a leaf, in which + * case we want to start from the last node we looked at. + * Either way, last is the node we want to start from. + */ + rn = last; + lastb = rn->rn_b; + + /* printf("rn %p, lastb %d\n", rn, lastb);*/ + + /* + * This gets complicated because we may delete the node + * while applying the function f to it, so we need to calculate + * the successor node in advance. + */ + while (rn->rn_b >= 0) + rn = rn->rn_l; + + while (!stopping) { + /* printf("node %p (%d)\n", rn, rn->rn_b); */ + base = rn; + /* If at right child go back up, otherwise, go right */ + while (rn->rn_p->rn_r == rn && !(rn->rn_flags & RNF_ROOT)) { + rn = rn->rn_p; + + /* if went up beyond last, stop */ + if (rn->rn_b < lastb) { + stopping = 1; + /* printf("up too far\n"); */ + } + } + + /* Find the next *leaf* since next node might vanish, too */ + for (rn = rn->rn_p->rn_r; rn->rn_b >= 0;) + rn = rn->rn_l; + next = rn; + /* Process leaves */ + while ((rn = base) != 0) { + base = rn->rn_dupedkey; + /* printf("leaf %p\n", rn); */ + if (!(rn->rn_flags & RNF_ROOT) + && (error = (*f)(rn, w))) + return (error); + } + rn = next; + + if (rn->rn_flags & RNF_ROOT) { + /* printf("root, stopping"); */ + stopping = 1; + } + + } + return 0; +} + +int +rn_walktree(h, f, w) + struct radix_node_head *h; + register int (*f)(); + void *w; +{ + int error; + struct radix_node *base, *next; + register struct radix_node *rn = h->rnh_treetop; + /* + * This gets complicated because we may delete the node + * while applying the function f to it, so we need to calculate + * the successor node in advance. + */ + /* First time through node, go left */ + while (rn->rn_b >= 0) + rn = rn->rn_l; + for (;;) { + base = rn; + /* If at right child go back up, otherwise, go right */ + while (rn->rn_p->rn_r == rn && (rn->rn_flags & RNF_ROOT) == 0) + rn = rn->rn_p; + /* Find the next *leaf* since next node might vanish, too */ + for (rn = rn->rn_p->rn_r; rn->rn_b >= 0;) + rn = rn->rn_l; + next = rn; + /* Process leaves */ + while ((rn = base)) { + base = rn->rn_dupedkey; + if (!(rn->rn_flags & RNF_ROOT) && (error = (*f)(rn, w))) + return (error); + } + rn = next; + if (rn->rn_flags & RNF_ROOT) + return (0); + } + /* NOTREACHED */ +} + +int +rn_inithead(head, off) + void **head; + int off; +{ + register struct radix_node_head *rnh; + register struct radix_node *t, *tt, *ttt; + if (*head) + return (1); + R_Malloc(rnh, struct radix_node_head *, sizeof (*rnh)); + if (rnh == 0) + return (0); + Bzero(rnh, sizeof (*rnh)); + *head = rnh; + t = rn_newpair(rn_zeros, off, rnh->rnh_nodes); + ttt = rnh->rnh_nodes + 2; + t->rn_r = ttt; + t->rn_p = t; + tt = t->rn_l; + tt->rn_flags = t->rn_flags = RNF_ROOT | RNF_ACTIVE; + tt->rn_b = -1 - off; + *ttt = *tt; + ttt->rn_key = rn_ones; + rnh->rnh_addaddr = rn_addroute; + rnh->rnh_deladdr = rn_delete; + rnh->rnh_matchaddr = rn_match; + rnh->rnh_lookup = rn_lookup; + rnh->rnh_walktree = rn_walktree; + rnh->rnh_walktree_from = rn_walktree_from; + rnh->rnh_treetop = t; + return (1); +} + +void +rn_init() +{ + char *cp, *cplim; +#ifdef KERNEL + struct domain *dom; + + for (dom = domains; dom; dom = dom->dom_next) + if (dom->dom_maxrtkey > max_keylen) + max_keylen = dom->dom_maxrtkey; +#endif + if (max_keylen == 0) { + log(LOG_ERR, + "rn_init: radix functions require max_keylen be set\n"); + return; + } + R_Malloc(rn_zeros, char *, 3 * max_keylen); + if (rn_zeros == NULL) + panic("rn_init"); + Bzero(rn_zeros, 3 * max_keylen); + rn_ones = cp = rn_zeros + max_keylen; + addmask_key = cplim = rn_ones + max_keylen; + while (cp < cplim) + *cp++ = -1; + if (rn_inithead((void **)&mask_rnhead, 0) == 0) + panic("rn_init 2"); +} diff --git a/reactos/drivers/lib/oskittcp/oskittcp/random.c b/reactos/drivers/lib/oskittcp/oskittcp/random.c new file mode 100644 index 00000000000..ffbf03030e1 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/random.c @@ -0,0 +1,63 @@ +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)random.c 8.1 (Berkeley) 6/10/93 + */ + +#include <sys/libkern.h> + +/* + * Pseudo-random number generator for randomizing the profiling clock, + * and whatever else we might use it for. The result is uniform on + * [0, 2^31 - 1]. + */ +unsigned long +random() +{ + static unsigned long randseed = 1; + register long x, hi, lo, t; + + /* + * Compute x[n + 1] = (7^5 * x[n]) mod (2^31 - 1). + * From "Random number generators: good ones are hard to find", + * Park and Miller, Communications of the ACM, vol. 31, no. 10, + * October 1988, p. 1195. + */ + x = randseed; + hi = x / 127773; + lo = x % 127773; + t = 16807 * lo - 2836 * hi; + if (t <= 0) + t += 0x7fffffff; + randseed = t; + return (t); +} diff --git a/reactos/drivers/lib/oskittcp/oskittcp/route.c b/reactos/drivers/lib/oskittcp/oskittcp/route.c new file mode 100644 index 00000000000..a7b2f1edfaa --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/route.c @@ -0,0 +1,807 @@ +/* + * Copyright (c) 1980, 1986, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)route.c 8.2 (Berkeley) 11/15/93 + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/proc.h> +#include <sys/mbuf.h> +#include <sys/socket.h> +#include <sys/socketvar.h> +#include <sys/domain.h> +#include <sys/protosw.h> +#include <sys/ioctl.h> + +#include <net/if.h> +#include <net/route.h> +#include <net/raw_cb.h> + +#include <netinet/in.h> +#include <netinet/in_var.h> +#include <netinet/ip_mroute.h> + +#define SA(p) ((struct sockaddr *)(p)) + +int rttrash; /* routes not in table but not freed */ +struct sockaddr wildcard; /* zero valued cookie for wildcard searches */ + +#define UNIMP panic("Unimplemented function") + +/* + * Packet routing routines. + */ +void +rtalloc(ro) + register struct route *ro; +{ +#if 0 + if (ro->ro_rt && ro->ro_rt->rt_ifp && (ro->ro_rt->rt_flags & RTF_UP)) + return; /* XXX */ + ro->ro_rt = rtalloc1(&ro->ro_dst, 1, 0UL); +#endif + UNIMP; +} + +void +rtalloc_ign(ro, ignore) + register struct route *ro; + u_long ignore; +{ +#if 0 + if (ro->ro_rt && ro->ro_rt->rt_ifp && (ro->ro_rt->rt_flags & RTF_UP)) + return; /* XXX */ + ro->ro_rt = rtalloc1(&ro->ro_dst, 1, ignore); +#endif + UNIMP; +} + +struct rtentry * +rtalloc1(dst, report, ignflags) + register struct sockaddr *dst; + int report; + u_long ignflags; +{ +#if 0 + register struct radix_node_head *rnh = rt_tables[dst->sa_family]; + register struct rtentry *rt; + register struct radix_node *rn; + struct rtentry *newrt = 0; + struct rt_addrinfo info; + u_long nflags; + int s = splnet(), err = 0, msgtype = RTM_MISS; + + if (rnh && (rn = rnh->rnh_matchaddr((caddr_t)dst, rnh)) && + ((rn->rn_flags & RNF_ROOT) == 0)) { + newrt = rt = (struct rtentry *)rn; + nflags = rt->rt_flags & ~ignflags; + if (report && (nflags & (RTF_CLONING | RTF_PRCLONING))) { + err = rtrequest(RTM_RESOLVE, dst, SA(0), + SA(0), 0, &newrt); + if (err) { + newrt = rt; + rt->rt_refcnt++; + goto miss; + } + if ((rt = newrt) && (rt->rt_flags & RTF_XRESOLVE)) { + msgtype = RTM_RESOLVE; + goto miss; + } + } else + rt->rt_refcnt++; + } else { + rtstat.rts_unreach++; + miss: if (report) { + bzero((caddr_t)&info, sizeof(info)); + info.rti_info[RTAX_DST] = dst; + rt_missmsg(msgtype, &info, 0, err); + } + } + splx(s); + return (newrt); +#endif + UNIMP; +} + +void +rtfree(rt) + register struct rtentry *rt; +{ +#if 0 + register struct radix_node_head *rnh = + rt_tables[rt_key(rt)->sa_family]; + register struct ifaddr *ifa; + + if (rt == 0 || rnh == 0) + panic("rtfree"); + rt->rt_refcnt--; + if(rnh->rnh_close && rt->rt_refcnt == 0) { + rnh->rnh_close((struct radix_node *)rt, rnh); + } + if (rt->rt_refcnt <= 0 && (rt->rt_flags & RTF_UP) == 0) { + if (rt->rt_nodes->rn_flags & (RNF_ACTIVE | RNF_ROOT)) + panic ("rtfree 2"); + rttrash--; + if (rt->rt_refcnt < 0) { + printf("rtfree: %p not freed (neg refs)\n", rt); + return; + } + ifa = rt->rt_ifa; + IFAFREE(ifa); + if (rt->rt_parent) { + RTFREE(rt->rt_parent); + } + Free(rt_key(rt)); + Free(rt); + } +#endif + UNIMP; +} + +void +ifafree(ifa) + register struct ifaddr *ifa; +{ +#if 0 + if (ifa == NULL) + panic("ifafree"); + if (ifa->ifa_refcnt == 0) + free(ifa, M_IFADDR); + else + ifa->ifa_refcnt--; +#endif + UNIMP; +} + +/* + * Force a routing table entry to the specified + * destination to go through the given gateway. + * Normally called as a result of a routing redirect + * message from the network layer. + * + * N.B.: must be called at splnet + * + */ +void +rtredirect(dst, gateway, netmask, flags, src, rtp) + struct sockaddr *dst, *gateway, *netmask, *src; + int flags; + struct rtentry **rtp; +{ +#if 0 + register struct rtentry *rt; + int error = 0; + short *stat = 0; + struct rt_addrinfo info; + struct ifaddr *ifa; + + /* verify the gateway is directly reachable */ + if ((ifa = ifa_ifwithnet(gateway)) == 0) { + error = ENETUNREACH; + goto out; + } + rt = rtalloc1(dst, 0, 0UL); + /* + * If the redirect isn't from our current router for this dst, + * it's either old or wrong. If it redirects us to ourselves, + * we have a routing loop, perhaps as a result of an interface + * going down recently. + */ +#define equal(a1, a2) (bcmp((caddr_t)(a1), (caddr_t)(a2), (a1)->sa_len) == 0) + if (!(flags & RTF_DONE) && rt && + (!equal(src, rt->rt_gateway) || rt->rt_ifa != ifa)) + error = EINVAL; + else if (ifa_ifwithaddr(gateway)) + error = EHOSTUNREACH; + if (error) + goto done; + /* + * Create a new entry if we just got back a wildcard entry + * or the the lookup failed. This is necessary for hosts + * which use routing redirects generated by smart gateways + * to dynamically build the routing tables. + */ + if ((rt == 0) || (rt_mask(rt) && rt_mask(rt)->sa_len < 2)) + goto create; + /* + * Don't listen to the redirect if it's + * for a route to an interface. + */ + if (rt->rt_flags & RTF_GATEWAY) { + if (((rt->rt_flags & RTF_HOST) == 0) && (flags & RTF_HOST)) { + /* + * Changing from route to net => route to host. + * Create new route, rather than smashing route to net. + */ + create: + flags |= RTF_GATEWAY | RTF_DYNAMIC; + error = rtrequest((int)RTM_ADD, dst, gateway, + netmask, flags, + (struct rtentry **)0); + stat = &rtstat.rts_dynamic; + } else { + /* + * Smash the current notion of the gateway to + * this destination. Should check about netmask!!! + */ + rt->rt_flags |= RTF_MODIFIED; + flags |= RTF_MODIFIED; + stat = &rtstat.rts_newgateway; + rt_setgate(rt, rt_key(rt), gateway); + } + } else + error = EHOSTUNREACH; +done: + if (rt) { + if (rtp && !error) + *rtp = rt; + else + rtfree(rt); + } +out: + if (error) + rtstat.rts_badredirect++; + else if (stat != NULL) + (*stat)++; + bzero((caddr_t)&info, sizeof(info)); + info.rti_info[RTAX_DST] = dst; + info.rti_info[RTAX_GATEWAY] = gateway; + info.rti_info[RTAX_NETMASK] = netmask; + info.rti_info[RTAX_AUTHOR] = src; + rt_missmsg(RTM_REDIRECT, &info, flags, error); +#endif + UNIMP; +} + +/* +* Routing table ioctl interface. +*/ +int +rtioctl(req, data, p) + int req; + caddr_t data; + struct proc *p; +{ +#if 0 +#ifdef INET + /* Multicast goop, grrr... */ + return mrt_ioctl(req, data, p); +#else /* INET */ + return ENXIO; +#endif /* INET */ +#endif + UNIMP; +} + +struct ifaddr * +ifa_ifwithroute(flags, dst, gateway) + int flags; + struct sockaddr *dst, *gateway; +{ +#if 0 + register struct ifaddr *ifa; + if ((flags & RTF_GATEWAY) == 0) { + /* + * If we are adding a route to an interface, + * and the interface is a pt to pt link + * we should search for the destination + * as our clue to the interface. Otherwise + * we can use the local address. + */ + ifa = 0; + if (flags & RTF_HOST) { + ifa = ifa_ifwithdstaddr(dst); + } + if (ifa == 0) + ifa = ifa_ifwithaddr(gateway); + } else { + /* + * If we are adding a route to a remote net + * or host, the gateway may still be on the + * other end of a pt to pt link. + */ + ifa = ifa_ifwithdstaddr(gateway); + } + if (ifa == 0) + ifa = ifa_ifwithnet(gateway); + if (ifa == 0) { + struct rtentry *rt = rtalloc1(dst, 0, 0UL); + if (rt == 0) + return (0); + rt->rt_refcnt--; + if ((ifa = rt->rt_ifa) == 0) + return (0); + } + if (ifa->ifa_addr->sa_family != dst->sa_family) { + struct ifaddr *oifa = ifa; + ifa = ifaof_ifpforaddr(dst, ifa->ifa_ifp); + if (ifa == 0) + ifa = oifa; + } + return (ifa); +#endif + UNIMP; +} + +#define ROUNDUP(a) (a>0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long)) + +static int rt_fixdelete(struct radix_node *, void *); +static int rt_fixchange(struct radix_node *, void *); + +struct rtfc_arg { + struct rtentry *rt0; + struct radix_node_head *rnh; +}; + +int +rtrequest(req, dst, gateway, netmask, flags, ret_nrt) + int req, flags; + struct sockaddr *dst, *gateway, *netmask; + struct rtentry **ret_nrt; +{ +#if 0 + int s = splnet(); int error = 0; + register struct rtentry *rt; + register struct radix_node *rn; + register struct radix_node_head *rnh; + struct ifaddr *ifa; + struct sockaddr *ndst; + u_long prflags = 0UL; +#define senderr(x) { error = x ; goto bad; } + + if ((rnh = rt_tables[dst->sa_family]) == 0) + senderr(ESRCH); + if (flags & RTF_HOST) + netmask = 0; + switch (req) { + case RTM_DELETE: + if ((rn = rnh->rnh_deladdr(dst, netmask, rnh)) == 0) + senderr(ESRCH); + if (rn->rn_flags & (RNF_ACTIVE | RNF_ROOT)) + panic ("rtrequest delete"); + rt = (struct rtentry *)rn; + + /* + * Now search what's left of the subtree for any cloned + * routes which might have been formed from this node. + */ + if ((rt->rt_flags & RTF_PRCLONING) && netmask) { + rnh->rnh_walktree_from(rnh, dst, netmask, + rt_fixdelete, rt); + } + + if (rt->rt_gwroute) { + rt = rt->rt_gwroute; RTFREE(rt); + (rt = (struct rtentry *)rn)->rt_gwroute = 0; + } + + /* + * NB: RTF_UP must be set during the search above, + * because we might delete the last ref, causing + * rt to get freed prematurely. + */ + rt->rt_flags &= ~RTF_UP; + + if ((ifa = rt->rt_ifa) && ifa->ifa_rtrequest) + ifa->ifa_rtrequest(RTM_DELETE, rt, SA(0)); + rttrash++; + if (ret_nrt) + *ret_nrt = rt; + else if (rt->rt_refcnt <= 0) { + rt->rt_refcnt++; + rtfree(rt); + } + break; + + case RTM_RESOLVE: + if (ret_nrt == 0 || (rt = *ret_nrt) == 0) + senderr(EINVAL); + ifa = rt->rt_ifa; + flags = rt->rt_flags & + ~(RTF_CLONING | RTF_PRCLONING | RTF_STATIC); + flags |= RTF_WASCLONED; + gateway = rt->rt_gateway; + if ((netmask = rt->rt_genmask) == 0) + flags |= RTF_HOST; + goto makeroute; + + case RTM_ADD: + if ((flags & RTF_GATEWAY) && !gateway) + panic("rtrequest: GATEWAY but no gateway"); + + if ((ifa = ifa_ifwithroute(flags, dst, gateway)) == 0) + senderr(ENETUNREACH); + + makeroute: + R_Malloc(rt, struct rtentry *, sizeof(*rt)); + if (rt == 0) + senderr(ENOBUFS); + Bzero(rt, sizeof(*rt)); + rt->rt_flags = RTF_UP | flags; + if (rt_setgate(rt, dst, gateway)) { + Free(rt); + senderr(ENOBUFS); + } + ndst = rt_key(rt); + if (netmask) { + rt_maskedcopy(dst, ndst, netmask); + } else + Bcopy(dst, ndst, dst->sa_len); + + /* + * This moved from below so that rnh->rnh_addaddr() can + * examine the ifa and ifp if it so desires. + */ + ifa->ifa_refcnt++; + rt->rt_ifa = ifa; + rt->rt_ifp = ifa->ifa_ifp; + + rn = rnh->rnh_addaddr((caddr_t)ndst, (caddr_t)netmask, + rnh, rt->rt_nodes); + if (rn == 0) { + struct rtentry *rt2; + /* + * Uh-oh, we already have one of these in the tree. + * We do a special hack: if the route that's already + * there was generated by the protocol-cloning + * mechanism, then we just blow it away and retry + * the insertion of the new one. + */ + rt2 = rtalloc1(dst, 0, RTF_PRCLONING); + if (rt2 && rt2->rt_parent) { + rtrequest(RTM_DELETE, + (struct sockaddr *)rt_key(rt2), + rt2->rt_gateway, + rt_mask(rt2), rt2->rt_flags, 0); + RTFREE(rt2); + rn = rnh->rnh_addaddr((caddr_t)ndst, + (caddr_t)netmask, + rnh, rt->rt_nodes); + } else if (rt2) { + RTFREE(rt2); + } + } + + if (rn == 0) { + if (rt->rt_gwroute) + rtfree(rt->rt_gwroute); + if (rt->rt_ifa) { + IFAFREE(rt->rt_ifa); + } + Free(rt_key(rt)); + Free(rt); + senderr(EEXIST); + } + rt->rt_parent = 0; + + if (req == RTM_RESOLVE) { + rt->rt_rmx = (*ret_nrt)->rt_rmx; /* copy metrics */ + if ((*ret_nrt)->rt_flags & RTF_PRCLONING) { + rt->rt_parent = (*ret_nrt); + (*ret_nrt)->rt_refcnt++; + } + } + if (ifa->ifa_rtrequest) + ifa->ifa_rtrequest(req, rt, SA(ret_nrt ? *ret_nrt : 0)); + /* + * We repeat the same procedure from rt_setgate() here because + * it doesn't fire when we call it there because the node + * hasn't been added to the tree yet. + */ + if (!(rt->rt_flags & RTF_HOST)) { + struct rtfc_arg arg; + arg.rnh = rnh; + arg.rt0 = rt; + rnh->rnh_walktree_from(rnh, rt_key(rt), rt_mask(rt), + rt_fixchange, &arg); + } + + if (ret_nrt) { + *ret_nrt = rt; + rt->rt_refcnt++; + } + break; + } +bad: + splx(s); + return (error); +#endif + UNIMP; +} + +/* + * Called from rtrequest(RTM_DELETE, ...) to fix up the route's ``family'' + * (i.e., the routes related to it by the operation of cloning). This + * routine is iterated over all potential former-child-routes by way of + * rnh->rnh_walktree_from() above, and those that actually are children of + * the late parent (passed in as VP here) are themselves deleted. + */ +static int +rt_fixdelete(struct radix_node *rn, void *vp) +{ +#if 0 + struct rtentry *rt = (struct rtentry *)rn; + struct rtentry *rt0 = vp; + + if (rt->rt_parent == rt0 && !(rt->rt_flags & RTF_PINNED)) { + return rtrequest(RTM_DELETE, rt_key(rt), + (struct sockaddr *)0, rt_mask(rt), + rt->rt_flags, (struct rtentry **)0); + } + return 0; +#endif + UNIMP; +} + +/* + * This routine is called from rt_setgate() to do the analogous thing for + * adds and changes. There is the added complication in this case of a + * middle insert; i.e., insertion of a new network route between an older + * network route and (cloned) host routes. For this reason, a simple check + * of rt->rt_parent is insufficient; each candidate route must be tested + * against the (mask, value) of the new route (passed as before in vp) + * to see if the new route matches it. Unfortunately, this has the obnoxious + * property of also triggering for insertion /above/ a pre-existing network + * route and clones. Sigh. This may be fixed some day. + * + * XXX - it may be possible to do fixdelete() for changes and reserve this + * routine just for adds. I'm not sure why I thought it was necessary to do + * changes this way. + */ +#ifdef DEBUG +int rtfcdebug = 0; +#endif + +static int +rt_fixchange(struct radix_node *rn, void *vp) +{ + struct rtentry *rt = (struct rtentry *)rn; + struct rtfc_arg *ap = vp; + struct rtentry *rt0 = ap->rt0; + struct radix_node_head *rnh = ap->rnh; + u_char *xk1, *xm1, *xk2; + int i, len; + +#if 0 +#ifdef DEBUG + if (rtfcdebug) + printf("rt_fixchange: rt %p, rt0 %p\n", rt, rt0); +#endif + + if (!rt->rt_parent || (rt->rt_flags & RTF_PINNED)) { +#ifdef DEBUG + if(rtfcdebug) printf("no parent or pinned\n"); +#endif + return 0; + } + + if (rt->rt_parent == rt0) { +#ifdef DEBUG + if(rtfcdebug) printf("parent match\n"); +#endif + return rtrequest(RTM_DELETE, rt_key(rt), + (struct sockaddr *)0, rt_mask(rt), + rt->rt_flags, (struct rtentry **)0); + } + + /* + * There probably is a function somewhere which does this... + * if not, there should be. + */ + len = imin(((struct sockaddr *)rt_key(rt0))->sa_len, + ((struct sockaddr *)rt_key(rt))->sa_len); + + xk1 = (u_char *)rt_key(rt0); + xm1 = (u_char *)rt_mask(rt0); + xk2 = (u_char *)rt_key(rt); + + for (i = rnh->rnh_treetop->rn_off; i < len; i++) { + if ((xk2[i] & xm1[i]) != xk1[i]) { +#ifdef DEBUG + if(rtfcdebug) printf("no match\n"); +#endif + return 0; + } + } + + /* + * OK, this node is a clone, and matches the node currently being + * changed/added under the node's mask. So, get rid of it. + */ +#ifdef DEBUG + if(rtfcdebug) printf("deleting\n"); +#endif + return rtrequest(RTM_DELETE, rt_key(rt), (struct sockaddr *)0, + rt_mask(rt), rt->rt_flags, (struct rtentry **)0); +#endif + UNIMP; +} + +int +rt_setgate(rt0, dst, gate) + struct rtentry *rt0; + struct sockaddr *dst, *gate; +{ +#if 0 + caddr_t new, old; + int dlen = ROUNDUP(dst->sa_len), glen = ROUNDUP(gate->sa_len); + register struct rtentry *rt = rt0; + struct radix_node_head *rnh = rt_tables[dst->sa_family]; + + if (rt->rt_gateway == 0 || glen > ROUNDUP(rt->rt_gateway->sa_len)) { + old = (caddr_t)rt_key(rt); + R_Malloc(new, caddr_t, dlen + glen); + if (new == 0) + return 1; + rt->rt_nodes->rn_key = new; + } else { + new = rt->rt_nodes->rn_key; + old = 0; + } + Bcopy(gate, (rt->rt_gateway = (struct sockaddr *)(new + dlen)), glen); + if (old) { + Bcopy(dst, new, dlen); + Free(old); + } + if (rt->rt_gwroute) { + rt = rt->rt_gwroute; RTFREE(rt); + rt = rt0; rt->rt_gwroute = 0; + } + /* + * Cloning loop avoidance: + * In the presence of protocol-cloning and bad configuration, + * it is possible to get stuck in bottomless mutual recursion + * (rtrequest rt_setgate rtalloc1). We avoid this by not allowing + * protocol-cloning to operate for gateways (which is probably the + * correct choice anyway), and avoid the resulting reference loops + * by disallowing any route to run through itself as a gateway. + * This is obviuosly mandatory when we get rt->rt_output(). + */ + if (rt->rt_flags & RTF_GATEWAY) { + rt->rt_gwroute = rtalloc1(gate, 1, RTF_PRCLONING); + if (rt->rt_gwroute == rt) { + RTFREE(rt->rt_gwroute); + rt->rt_gwroute = 0; + return 1; /* failure */ + } + } + + /* + * This isn't going to do anything useful for host routes, so + * don't bother. Also make sure we have a reasonable mask + * (we don't yet have one during adds). + */ + if (!(rt->rt_flags & RTF_HOST) && rt_mask(rt) != 0) { + struct rtfc_arg arg; + arg.rnh = rnh; + arg.rt0 = rt; + rnh->rnh_walktree_from(rnh, rt_key(rt), rt_mask(rt), + rt_fixchange, &arg); + } + + return 0; +#endif + UNIMP; +} + +void +rt_maskedcopy(src, dst, netmask) + struct sockaddr *src, *dst, *netmask; +{ +#if 0 + register u_char *cp1 = (u_char *)src; + register u_char *cp2 = (u_char *)dst; + register u_char *cp3 = (u_char *)netmask; + u_char *cplim = cp2 + *cp3; + u_char *cplim2 = cp2 + *cp1; + + *cp2++ = *cp1++; *cp2++ = *cp1++; /* copies sa_len & sa_family */ + cp3 += 2; + if (cplim > cplim2) + cplim = cplim2; + while (cp2 < cplim) + *cp2++ = *cp1++ & *cp3++; + if (cp2 < cplim2) + bzero((caddr_t)cp2, (unsigned)(cplim2 - cp2)); +#endif + UNIMP; +} + +/* + * Set up a routing table entry, normally + * for an interface. + */ +int +rtinit(ifa, cmd, flags) + register struct ifaddr *ifa; + int cmd, flags; +{ +#if 0 + register struct rtentry *rt; + register struct sockaddr *dst; + register struct sockaddr *deldst; + struct mbuf *m = 0; + struct rtentry *nrt = 0; + int error; + + dst = flags & RTF_HOST ? ifa->ifa_dstaddr : ifa->ifa_addr; + if (cmd == RTM_DELETE) { + if ((flags & RTF_HOST) == 0 && ifa->ifa_netmask) { + m = m_get(M_WAIT, MT_SONAME); + deldst = mtod(m, struct sockaddr *); + rt_maskedcopy(dst, deldst, ifa->ifa_netmask); + dst = deldst; + } + rt = rtalloc1(dst, 0, 0UL); + if (rt) { + rt->rt_refcnt--; + if (rt->rt_ifa != ifa) { + if (m) + (void) m_free(m); + return (flags & RTF_HOST ? EHOSTUNREACH + : ENETUNREACH); + } + } + } + error = rtrequest(cmd, dst, ifa->ifa_addr, ifa->ifa_netmask, + flags | ifa->ifa_flags, &nrt); + if (m) + (void) m_free(m); + if (cmd == RTM_DELETE && error == 0 && (rt = nrt)) { + rt_newaddrmsg(cmd, ifa, error, nrt); + if (rt->rt_refcnt <= 0) { + rt->rt_refcnt++; + rtfree(rt); + } + } + if (cmd == RTM_ADD && error == 0 && (rt = nrt)) { + rt->rt_refcnt--; + if (rt->rt_ifa != ifa) { + printf("rtinit: wrong ifa (%p) was (%p)\n", ifa, + rt->rt_ifa); + if (rt->rt_ifa->ifa_rtrequest) + rt->rt_ifa->ifa_rtrequest(RTM_DELETE, rt, SA(0)); + IFAFREE(rt->rt_ifa); + rt->rt_ifa = ifa; + rt->rt_ifp = ifa->ifa_ifp; + ifa->ifa_refcnt++; + if (ifa->ifa_rtrequest) + ifa->ifa_rtrequest(RTM_ADD, rt, SA(0)); + } + rt_newaddrmsg(cmd, ifa, error, nrt); + } + return (error); +#endif + UNIMP; +} diff --git a/reactos/drivers/lib/oskittcp/oskittcp/rtsock.c b/reactos/drivers/lib/oskittcp/oskittcp/rtsock.c new file mode 100644 index 00000000000..51cc2efe84a --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/rtsock.c @@ -0,0 +1,79 @@ +/* + * Copyright (c) 1988, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)rtsock.c 8.5 (Berkeley) 11/2/94 + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/proc.h> +#include <sys/mbuf.h> +#include <sys/socket.h> +#include <sys/socketvar.h> +#include <sys/domain.h> +#include <sys/protosw.h> + +#include <net/if.h> +#include <net/route.h> +#include <net/raw_cb.h> + +/* + * This routine is called to generate a message from the routing + * socket indicating that a redirect has occured, a routing lookup + * has failed, or that a protocol has detected timeouts to a particular + * destination. + */ +void +rt_missmsg(type, rtinfo, flags, error) + int type, flags, error; + register struct rt_addrinfo *rtinfo; +{ +#if 0 + register struct rt_msghdr *rtm; + register struct mbuf *m; + struct sockaddr *sa = rtinfo->rti_info[RTAX_DST]; + + if (route_cb.any_count == 0) + return; + m = rt_msg1(type, rtinfo); + if (m == 0) + return; + rtm = mtod(m, struct rt_msghdr *); + rtm->rtm_flags = RTF_DONE | flags; + rtm->rtm_errno = error; + rtm->rtm_addrs = rtinfo->rti_addrs; + route_proto.sp_protocol = sa ? sa->sa_family : 0; + raw_input(m, &route_proto, &route_src, &route_dst); +#endif + panic("Unimplemented function\n"); +} diff --git a/reactos/drivers/lib/oskittcp/oskittcp/scanc.c b/reactos/drivers/lib/oskittcp/oskittcp/scanc.c new file mode 100644 index 00000000000..491bd36464d --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/scanc.c @@ -0,0 +1,52 @@ +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)scanc.c 8.1 (Berkeley) 6/10/93 + * + * $\Id: scanc.c,v 1.3 1995/03/17 06:15:39 phk Exp $ + */ + +#include <sys/libkern.h> + +int +scanc(size, cp, table, mask0) + u_int size; + register u_char *cp, table[]; + int mask0; +{ + register u_char *end; + register u_char mask; + + mask = mask0; + for (end = &cp[size]; cp < end && (table[*cp] & mask) == 0; ++cp); + return (end - cp); +} diff --git a/reactos/drivers/lib/oskittcp/oskittcp/sleep.c b/reactos/drivers/lib/oskittcp/oskittcp/sleep.c new file mode 100644 index 00000000000..83bed686a77 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/sleep.c @@ -0,0 +1,209 @@ +#include <roscfg.h> +#include <oskittcp.h> +#include <ntddk.h> +#include <sys/callout.h> +#include <oskitfreebsd.h> +#include <oskitdebug.h> + +typedef struct _SLEEPING_THREAD { + LIST_ENTRY Entry; + PVOID SleepToken; + KEVENT Event; +} SLEEPING_THREAD, *PSLEEPING_THREAD; + +LIST_ENTRY SleepingThreadsList; +KSPIN_LOCK SleepingThreadsLock; + +/* clock_init */ +int ncallout = 256; +struct callout *callout; + +void init_freebsd_sched() { + KeInitializeSpinLock( &SleepingThreadsLock ); + InitializeListHead( &SleepingThreadsList ); +} + +void tsleep( void *token, int priority, char *wmesg, int tmio ) { + KIRQL OldIrql; + KEVENT Event; + PLIST_ENTRY Entry; + PSLEEPING_THREAD SleepingThread; + + OS_DbgPrint(OSK_MID_TRACE, + ("Called TSLEEP: tok = %x, pri = %d, wmesg = %s, tmio = %x\n", + token, priority, wmesg, tmio)); + + SleepingThread = ExAllocatePool( NonPagedPool, sizeof( *SleepingThread ) ); + if( SleepingThread ) { + KeInitializeEvent( &SleepingThread->Event, NotificationEvent, FALSE ); + SleepingThread->SleepToken = token; + ExInterlockedInsertTailList( &SleepingThreadsList, + &SleepingThread->Entry, + &SleepingThreadsLock ); + } + + OS_DbgPrint(OSK_MID_TRACE,("Waiting on %x\n", token)); + KeWaitForSingleObject( &SleepingThread->Event, + WrSuspended, + KernelMode, + TRUE, + NULL ); + OS_DbgPrint(OSK_MID_TRACE,("Waiting finished: %x\n", token)); +} + +void wakeup( void *token ) { + KIRQL OldIrql; + KEVENT Event; + PLIST_ENTRY Entry; + PSLEEPING_THREAD SleepingThread; + + OS_DbgPrint(OSK_MID_TRACE,("Wakeup %x!\n",token)); + + KeAcquireSpinLock( &SleepingThreadsLock, &OldIrql ); + Entry = SleepingThreadsList.Flink; + while( Entry != &SleepingThreadsList ) { + SleepingThread = CONTAINING_RECORD(Entry, SLEEPING_THREAD, Entry); + if( SleepingThread->SleepToken == token ) { + RemoveEntryList(Entry); + KeReleaseSpinLock( &SleepingThreadsLock, OldIrql ); + OS_DbgPrint(OSK_MID_TRACE,("Setting event to wake %x\n", token)); + KeSetEvent( &SleepingThread->Event, IO_NO_INCREMENT, FALSE ); + ExFreePool( SleepingThread ); + return; + } + Entry = Entry->Flink; + } + KeReleaseSpinLock( &SleepingThreadsLock, OldIrql ); + OS_DbgPrint(OSK_MID_TRACE,("Wakeup done %x\n", token)); +} + +/* ---------------------------------------------------------------------- */ + + +static void +timeout_init(void) +{ + int i; + + callout = (struct callout *) + malloc(sizeof(struct callout) * ncallout, M_FREE, M_WAITOK); + if (!callout) + panic("can't allocate callout queue!\n"); + + /* + * Initialize callouts + */ + callfree = callout; + for (i = 1; i < ncallout; i++) + callout[i-1].c_next = &callout[i]; + +} + +/* get clock up and running */ +void clock_init() +{ + timeout_init(); + /* inittodr(0); // what does this do? */ + boottime = time; + /* Start a clock we can use for timeouts */ +} + + +extern unsigned bio_imask; /* group of interrupts masked with splbio() */ +extern unsigned cpl; /* current priority level mask */ +extern volatile unsigned idelayed; /* interrupts to become pending */ +extern volatile unsigned ipending; /* active interrupts masked by cpl */ +extern unsigned net_imask; /* group of interrupts masked with splimp() */ +extern unsigned stat_imask; /* interrupts masked with splstatclock() */ +extern unsigned tty_imask; /* group of interrupts masked with spltty() */ + +/* + * ipending has to be volatile so that it is read every time it is accessed + * in splx() and spl0(), but we don't want it to be read nonatomically when + * it is changed. Pretending that ipending is a plain int happens to give + * suitable atomic code for "ipending |= constant;". + */ +#define setdelayed() (*(unsigned *)&ipending |= loadandclear(&idelayed)) +#define setsoftast() (*(unsigned *)&ipending |= SWI_AST_PENDING) +#define setsoftclock() (*(unsigned *)&ipending |= SWI_CLOCK_PENDING) +#define setsoftnet() (*(unsigned *)&ipending |= SWI_NET_PENDING) +#define setsofttty() (*(unsigned *)&ipending |= SWI_TTY_PENDING) + +#define schedsofttty() (*(unsigned *)&idelayed |= SWI_TTY_PENDING) + +#define GENSPL(name, set_cpl) \ +static __inline int name(void) \ +{ \ + unsigned x; \ + \ + __asm __volatile("" : : : "memory"); \ + x = cpl; \ + set_cpl; \ + return (x); \ +} + +#if 0 +GENSPL(splbio, cpl |= bio_imask) +GENSPL(splclock, cpl = HWI_MASK | SWI_MASK) +GENSPL(splhigh, cpl = HWI_MASK | SWI_MASK) +GENSPL(splimp, cpl |= net_imask) +GENSPL(splnet, cpl |= SWI_NET_MASK) +GENSPL(splsoftclock, cpl = SWI_CLOCK_MASK) +GENSPL(splsofttty, cpl |= SWI_TTY_MASK) +GENSPL(splstatclock, cpl |= stat_imask) +GENSPL(spltty, cpl |= tty_imask) +#endif + +#if 0 +void spl0(void) { + cpl = SWI_AST_MASK; + if (ipending & ~SWI_AST_MASK) + splz(); +} + +void splx(int ipl) { + cpl = ipl; + if (ipending & ~ipl) + splz(); +} +#endif + +void splz(void) { + OS_DbgPrint(OSK_MID_TRACE,("Called SPLZ\n")); +} + +/* + * functions to save and restore the current cpl + */ +void save_cpl(unsigned *x) +{ + *x = cpl; +} + +void restore_cpl(unsigned x) +{ + cpl = x; +} + +void selrecord( struct proc *selector, struct selinfo *sip) { + OS_DbgPrint(OSK_MID_TRACE,("Called selrecord\n")); +} + +void wakeupsocket( struct socket *so, struct selinfo *sel ) { + void *connection = so->so_connection; + char *data = 0; + int datalen = 0; + int flags = 0; + + OS_DbgPrint(OSK_MID_TRACE,("Wakeup: %x\n", so)); +#if 0 + if( soreceive(so, &paddr, 0, &mp0, &controlp, flags) == 0 ) { + /* We have data available */ + OS_DbgPrint(OSK_MID_TRACE,("Data available on %x\n", so)); + } +#endif +} + +void selwakeup( struct selinfo *sel ) { + OS_DbgPrint(OSK_MID_TRACE,("Called selwakeup\n")); +} diff --git a/reactos/drivers/lib/oskittcp/oskittcp/tcp_debug.c b/reactos/drivers/lib/oskittcp/oskittcp/tcp_debug.c new file mode 100644 index 00000000000..5d48032a9a1 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/tcp_debug.c @@ -0,0 +1,163 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcp_debug.c 8.1 (Berkeley) 6/10/93 + */ + +#ifdef TCPDEBUG +/* load symbolic names */ +#define PRUREQUESTS +#define TCPSTATES +#define TCPTIMERS +#define TANAMES +#endif + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/mbuf.h> +#include <sys/socket.h> +#include <sys/socketvar.h> +#include <sys/protosw.h> +#include <sys/errno.h> +#include <sys/queue.h> + +#include <net/route.h> +#include <net/if.h> + +#include <netinet/in.h> +#include <netinet/in_systm.h> +#include <netinet/ip.h> +#include <netinet/in_pcb.h> +#include <netinet/ip_var.h> +#include <netinet/tcp.h> +#include <netinet/tcp_fsm.h> +#include <netinet/tcp_seq.h> +#include <netinet/tcp_timer.h> +#include <netinet/tcp_var.h> +#include <netinet/tcpip.h> +#include <netinet/tcp_debug.h> + +#ifdef TCPDEBUG +int tcpconsdebug = 0; +#endif +/* + * Tcp debug routines + */ +void +tcp_trace(act, ostate, tp, ti, req) + short act, ostate; + struct tcpcb *tp; + struct tcpiphdr *ti; + int req; +{ + tcp_seq seq, ack; + int len, flags; + struct tcp_debug *td = &tcp_debug[tcp_debx++]; + + if (tcp_debx == TCP_NDEBUG) + tcp_debx = 0; + td->td_time = iptime(); + td->td_act = act; + td->td_ostate = ostate; + td->td_tcb = (caddr_t)tp; + if (tp) + td->td_cb = *tp; + else + bzero((caddr_t)&td->td_cb, sizeof (*tp)); + if (ti) + td->td_ti = *ti; + else + bzero((caddr_t)&td->td_ti, sizeof (*ti)); + td->td_req = req; +#ifdef TCPDEBUG + if (tcpconsdebug == 0) + return; + if (tp) + printf("%p %s:", tp, tcpstates[ostate]); + else + printf("???????? "); + printf("%s ", tanames[act]); + switch (act) { + + case TA_INPUT: + case TA_OUTPUT: + case TA_DROP: + if (ti == 0) + break; + seq = ti->ti_seq; + ack = ti->ti_ack; + len = ti->ti_len; + if (act == TA_OUTPUT) { + seq = ntohl(seq); + ack = ntohl(ack); + len = ntohs((u_short)len); + } + if (act == TA_OUTPUT) + len -= sizeof (struct tcphdr); + if (len) + printf("[%x..%x)", seq, seq+len); + else + printf("%x", seq); + printf("@%x, urp=%x", ack, ti->ti_urp); + flags = ti->ti_flags; + if (flags) { + char *cp = "<"; +#define pf(f) { \ + if (ti->ti_flags & TH_##f) { \ + printf("%s%s", cp, #f); \ + cp = ","; \ + } \ +} + pf(SYN); pf(ACK); pf(FIN); pf(RST); pf(PUSH); pf(URG); + printf(">"); + } + break; + + case TA_USER: + printf("%s", prurequests[req&0xff]); + if ((req & 0xff) == PRU_SLOWTIMO) + printf("<%s>", tcptimers[req>>8]); + break; + } + if (tp) + printf(" -> %s", tcpstates[tp->t_state]); + /* print out internal state of tp !?! */ + printf("\n"); + if (tp == 0) + return; + printf("\trcv_(nxt,wnd,up) (%x,%x,%x) snd_(una,nxt,max) (%x,%x,%x)\n", + tp->rcv_nxt, tp->rcv_wnd, tp->rcv_up, tp->snd_una, tp->snd_nxt, + tp->snd_max); + printf("\tsnd_(wl1,wl2,wnd) (%x,%x,%x)\n", + tp->snd_wl1, tp->snd_wl2, tp->snd_wnd); +#endif /* TCPDEBUG */ +} diff --git a/reactos/drivers/lib/oskittcp/oskittcp/tcp_input.c b/reactos/drivers/lib/oskittcp/oskittcp/tcp_input.c new file mode 100644 index 00000000000..260b695237f --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/tcp_input.c @@ -0,0 +1,2160 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1990, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * From: @(#)tcp_input.c 8.5 (Berkeley) 4/10/94 + */ + +#ifndef TUBA_INCLUDE +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/malloc.h> +#include <sys/mbuf.h> +#include <sys/protosw.h> +#include <sys/socket.h> +#include <sys/socketvar.h> +#include <sys/errno.h> +#include <sys/queue.h> +#include <sys/kernel.h> + +#include <net/if.h> +#include <net/route.h> + +#include <netinet/in.h> +#include <netinet/in_systm.h> +#include <netinet/ip.h> +#include <netinet/in_pcb.h> +#include <netinet/ip_var.h> +#include <netinet/tcp.h> +#include <netinet/tcp_fsm.h> +#include <netinet/tcp_seq.h> +#include <netinet/tcp_timer.h> +#include <netinet/tcp_var.h> +#include <netinet/tcpip.h> +#ifdef TCPDEBUG +#include <netinet/tcp_debug.h> +struct tcpiphdr tcp_saveti; +#endif + +int tcprexmtthresh = 3; +tcp_seq tcp_iss; +tcp_cc tcp_ccgen; +struct tcpstat tcpstat; +u_long tcp_now; +struct inpcbhead tcb; +struct inpcbinfo tcbinfo; + +#endif /* TUBA_INCLUDE */ + +/* + * Insert segment ti into reassembly queue of tcp with + * control block tp. Return TH_FIN if reassembly now includes + * a segment with FIN. The macro form does the common case inline + * (segment is the next to be received on an established connection, + * and the queue is empty), avoiding linkage into and removal + * from the queue and repetition of various conversions. + * Set DELACK for segments received in order, but ack immediately + * when segments are out of order (so fast retransmit can work). + */ +#ifdef TCP_ACK_HACK +#define TCP_REASS(tp, ti, m, so, flags) { \ + if ((ti)->ti_seq == (tp)->rcv_nxt && \ + (tp)->seg_next == (struct tcpiphdr *)(tp) && \ + (tp)->t_state == TCPS_ESTABLISHED) { \ + if (ti->ti_flags & TH_PUSH) \ + tp->t_flags |= TF_ACKNOW; \ + else \ + tp->t_flags |= TF_DELACK; \ + (tp)->rcv_nxt += (ti)->ti_len - IPHDR_SIZE; \ + OS_DbgPrint(OSK_MID_TRACE,("Added %d to rcv_nxt\n", \ + (ti)->ti_len - IPHDR_SIZE)); \ + flags = (ti)->ti_flags & TH_FIN; \ + tcpstat.tcps_rcvpack++;\ + tcpstat.tcps_rcvbyte += (ti)->ti_len;\ + sbappend(so, &(so)->so_rcv, (m)); \ + sorwakeup(so); \ + } else { \ + (flags) = tcp_reass((tp), (ti), (m)); \ + tp->t_flags |= TF_ACKNOW; \ + } \ +} +#else +#define TCP_REASS(tp, ti, m, so, flags) { \ + if ((ti)->ti_seq == (tp)->rcv_nxt && \ + (tp)->seg_next == (struct tcpiphdr *)(tp) && \ + (tp)->t_state == TCPS_ESTABLISHED) { \ + tp->t_flags |= TF_DELACK; \ + (tp)->rcv_nxt += (ti)->ti_len - IPHDR_SIZE; \ + OS_DbgPrint(OSK_MID_TRACE,("Added %d to rcv_nxt\n", \ + (ti)->ti_len - IPHDR_SIZE)); \ + flags = (ti)->ti_flags & TH_FIN; \ + tcpstat.tcps_rcvpack++;\ + tcpstat.tcps_rcvbyte += (ti)->ti_len;\ + sbappend(so, &(so)->so_rcv, (m)); \ + sorwakeup(so); \ + } else { \ + (flags) = tcp_reass((tp), (ti), (m)); \ + tp->t_flags |= TF_ACKNOW; \ + } \ +} +#endif +#ifndef TUBA_INCLUDE + +int +tcp_reass(tp, ti, m) + register struct tcpcb *tp; + register struct tcpiphdr *ti; + struct mbuf *m; +{ + register struct tcpiphdr *q; + struct socket *so = tp->t_inpcb->inp_socket; + int flags; + + /* + * Call with ti==0 after become established to + * force pre-ESTABLISHED data up to user socket. + */ + if (ti == 0) + goto present; + + /* + * 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; + + /* + * If there is a preceding segment, it may provide some of + * our data already. If so, drop the data from the incoming + * segment. If it provides all of our data, drop us. + */ + if ((struct tcpiphdr *)q->ti_prev != (struct tcpiphdr *)tp) { + register int i; + q = (struct tcpiphdr *)q->ti_prev; + /* conversion to int (in i) handles seq wraparound */ + i = q->ti_seq + q->ti_len - ti->ti_seq; + if (i > 0) { + if (i >= ti->ti_len) { + tcpstat.tcps_rcvduppack++; + tcpstat.tcps_rcvdupbyte += ti->ti_len; + m_freem(m); + /* + * Try to present any queued data + * at the left window edge to the user. + * This is needed after the 3-WHS + * completes. + */ + goto present; /* ??? */ + } + m_adj(m, i); + ti->ti_len -= i; + ti->ti_seq += i; + } + q = (struct tcpiphdr *)(q->ti_next); + } + tcpstat.tcps_rcvoopack++; + tcpstat.tcps_rcvoobyte += ti->ti_len; + REASS_MBUF(ti) = m; /* XXX */ + + /* + * While we overlap succeeding segments trim them or, + * if they are completely covered, dequeue them. + */ + while (q != (struct tcpiphdr *)tp) { + register int i = (ti->ti_seq + ti->ti_len) - q->ti_seq; + if (i <= 0) + break; + if (i < q->ti_len) { + q->ti_seq += i; + q->ti_len -= i; + m_adj(REASS_MBUF(q), i); + break; + } + q = (struct tcpiphdr *)q->ti_next; + m = REASS_MBUF((struct tcpiphdr *)q->ti_prev); + remque(q->ti_prev); + m_freem(m); + } + + /* + * Stick new segment in its place. + */ + insque(ti, q->ti_prev); + +present: + /* + * Present data to user, advancing rcv_nxt through + * completed sequence space. + */ + if (!TCPS_HAVEESTABLISHED(tp->t_state)) + return (0); + ti = tp->seg_next; + if (ti == (struct tcpiphdr *)tp || ti->ti_seq != tp->rcv_nxt) + return (0); + do { + tp->rcv_nxt += ti->ti_len; + OS_DbgPrint(OSK_MID_TRACE,("Added %d to rcv_nxt\n", + ti->ti_len)); + flags = ti->ti_flags & TH_FIN; + remque(ti); + m = REASS_MBUF(ti); + ti = (struct tcpiphdr *)ti->ti_next; + if (so->so_state & SS_CANTRCVMORE) + m_freem(m); + else + sbappend(so, &so->so_rcv, m); + } while (ti != (struct tcpiphdr *)tp && ti->ti_seq == tp->rcv_nxt); + sorwakeup(so); + return (flags); +} + +/* + * TCP input routine, follows pages 65-76 of the + * protocol specification dated September, 1981 very closely. + */ +void +tcp_input(m, iphlen) + register struct mbuf *m; + int iphlen; +{ + register struct tcpiphdr *ti; + register struct inpcb *inp; + caddr_t optp = NULL; + int optlen = 0; + int len, tlen, off; + register struct tcpcb *tp = 0; + register int tiflags; + struct socket *so = 0; + int todrop, acked, ourfinisacked, needoutput = 0; + struct in_addr laddr; + int dropsocket = 0; + int iss = 0; + u_long tiwin; + struct tcpopt to; /* options in this segment */ + struct rmxp_tao *taop; /* pointer to our TAO cache entry */ + struct rmxp_tao tao_noncached; /* in case there's no cached entry */ +#ifdef TCPDEBUG + short ostate = 0; +#endif + + bzero((char *)&to, sizeof(to)); + + tcpstat.tcps_rcvtotal++; + /* + * Get IP and TCP header together in first mbuf. + * Note: IP leaves IP header in first mbuf. + */ + ti = mtod(m, struct tcpiphdr *); + if (iphlen > sizeof (struct ip)) + ip_stripoptions(m, (struct mbuf *)0); + if (m->m_len < sizeof (struct tcpiphdr)) { + if ((m = m_pullup(m, sizeof (struct tcpiphdr))) == 0) { + tcpstat.tcps_rcvshort++; + return; + } + ti = mtod(m, struct tcpiphdr *); + } + + /* + * Checksum extended TCP header and data. + */ + tlen = ntohs(((struct ip *)ti)->ip_len); + len = sizeof (struct ip); + OS_DbgPrint(OSK_MID_TRACE,("tlen = %x, len = %x, m_len = %d\n", tlen, len, m->m_len)); + OS_DbgPrint(OSK_MID_TRACE,("ti->ti_len = %x\n", htons(ti->ti_len))); + ti->ti_sum = in_cksum(m, len); + OskitDumpBuffer(m->m_data, len); + ti->ti_next = ti->ti_prev = 0; + ti->ti_x1 = 0; + if (ti->ti_sum) { + tcpstat.tcps_rcvbadsum++; + OS_DbgPrint(OSK_MID_TRACE,("Dropping packet due to bad csum (%x)\n", ti->ti_sum)); + goto drop; + } + ti->ti_len = htons((u_short)tlen); +#endif /* TUBA_INCLUDE */ + + /* + * Check that TCP offset makes sense, + * pull out TCP options and adjust length. XXX + */ + off = ti->ti_off << 2; + if (off < sizeof (struct tcphdr) || off > tlen) { + tcpstat.tcps_rcvbadoff++; + goto drop; + } + tlen -= off; + ti->ti_len = tlen; + if (off > sizeof (struct tcphdr)) { + if (m->m_len < sizeof(struct ip) + off) { + if ((m = m_pullup(m, sizeof (struct ip) + off)) == 0) { + tcpstat.tcps_rcvshort++; + return; + } + ti = mtod(m, struct tcpiphdr *); + } + optlen = off - sizeof (struct tcphdr); + optp = mtod(m, caddr_t) + sizeof (struct tcpiphdr); + } + tiflags = ti->ti_flags; + + /* + * Convert TCP protocol specific fields to host format. + */ + NTOHL(ti->ti_seq); + NTOHL(ti->ti_ack); + NTOHS(ti->ti_win); + NTOHS(ti->ti_urp); + + /* + * Drop TCP, IP headers and TCP options. + */ + m->m_data += sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr); + m->m_len -= sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr); + + /* + * Locate pcb for segment. + */ +findpcb: + /* + * First look for an exact match. + */ + inp = in_pcblookuphash(&tcbinfo, ti->ti_src, ti->ti_sport, + ti->ti_dst, ti->ti_dport); + /* + * ...and if that fails, do a wildcard search. + */ + if (inp == NULL) { + inp = in_pcblookup(&tcb, ti->ti_src, ti->ti_sport, + ti->ti_dst, ti->ti_dport, INPLOOKUP_WILDCARD); + } + + /* + * If the state is CLOSED (i.e., TCB does not exist) then + * all data in the incoming segment is discarded. + * If the TCB exists but is in CLOSED state, it is embryonic, + * but should either do a listen or a connect soon. + */ + if (inp == NULL) + goto dropwithreset; + tp = intotcpcb(inp); + if (tp == 0) + goto dropwithreset; + if (tp->t_state == TCPS_CLOSED) + goto drop; + + /* Unscale the window into a 32-bit value. */ + if ((tiflags & TH_SYN) == 0) + tiwin = ti->ti_win << tp->snd_scale; + else + tiwin = ti->ti_win; + + so = inp->inp_socket; + if (so->so_options & (SO_DEBUG|SO_ACCEPTCONN)) { +#ifdef TCPDEBUG + if (so->so_options & SO_DEBUG) { + ostate = tp->t_state; + tcp_saveti = *ti; + } +#endif + if (so->so_options & SO_ACCEPTCONN) { + register struct tcpcb *tp0 = tp; + struct socket *so2; + if ((tiflags & (TH_RST|TH_ACK|TH_SYN)) != TH_SYN) { + /* + * Note: dropwithreset makes sure we don't + * send a RST in response to a RST. + */ + if (tiflags & TH_ACK) { + tcpstat.tcps_badsyn++; + goto dropwithreset; + } + goto drop; + } + so2 = sonewconn(so, 0); + if (so2 == 0) { + unsigned int i, j, qlen; + + static int rnd; + static long old_mono_secs; + static unsigned int cur_cnt, old_cnt; + + tcpstat.tcps_listendrop++; + + /* + * Keep a decaying average of the number + * of overruns we've been getting. + */ + if ((i = (mono_time.tv_sec - + old_mono_secs)) != 0) { + old_mono_secs = mono_time.tv_sec; + old_cnt = cur_cnt / i; + cur_cnt = 0; + } + + so2 = so->so_q0; + if (so2 == 0) + goto drop; + + /* + * If we've been getting a lot of hits, + * random drop an incomplete connection + * from the queue, otherwise, fall through + * so we head-drop from the queue. + */ + qlen = so->so_q0len; + if (++cur_cnt > qlen || old_cnt > qlen) { + rnd = (314159 * rnd + 66329) & 0xffff; + j = ((qlen + 1) * rnd) >> 16; + + while (j-- && so2) + so2 = so2->so_q0; + } + if (so2) { + tcp_drop(sototcpcb(so2), ETIMEDOUT); + so2 = sonewconn(so, 0); + } + if (!so2) + goto drop; + } + so = so2; + /* + * This is ugly, but .... + * + * Mark socket as temporary until we're + * committed to keeping it. The code at + * ``drop'' and ``dropwithreset'' check the + * flag dropsocket to see if the temporary + * socket created here should be discarded. + * We mark the socket as discardable until + * we're committed to it below in TCPS_LISTEN. + */ + dropsocket++; + inp = (struct inpcb *)so->so_pcb; + inp->inp_laddr = ti->ti_dst; + inp->inp_lport = ti->ti_dport; + in_pcbrehash(inp); +#if BSD>=43 + inp->inp_options = ip_srcroute(); +#endif + tp = intotcpcb(inp); + tp->t_state = TCPS_LISTEN; + tp->t_flags |= tp0->t_flags & (TF_NOPUSH|TF_NOOPT); + + /* Compute proper scaling value from buffer space */ + while (tp->request_r_scale < TCP_MAX_WINSHIFT && + TCP_MAXWIN << tp->request_r_scale < so->so_rcv.sb_hiwat) + tp->request_r_scale++; + } + } + + /* + * Segment received on connection. + * Reset idle time and keep-alive timer. + */ + tp->t_idle = 0; + if (TCPS_HAVEESTABLISHED(tp->t_state)) + tp->t_timer[TCPT_KEEP] = tcp_keepidle; + + /* + * Process options if not in LISTEN state, + * else do it below (after getting remote address). + */ + if (tp->t_state != TCPS_LISTEN) + tcp_dooptions(tp, optp, optlen, ti, &to); + + /* + * Header prediction: check for the two common cases + * of a uni-directional data xfer. If the packet has + * no control flags, is in-sequence, the window didn't + * change and we're not retransmitting, it's a + * candidate. If the length is zero and the ack moved + * forward, we're the sender side of the xfer. Just + * free the data acked & wake any higher level process + * that was blocked waiting for space. If the length + * is non-zero and the ack didn't move, we're the + * receiver side. If we're getting packets in-order + * (the reassembly queue is empty), add the data to + * the socket buffer and note that we need a delayed ack. + * Make sure that the hidden state-flags are also off. + * Since we check for TCPS_ESTABLISHED above, it can only + * be TH_NEEDSYN. + */ + if (tp->t_state == TCPS_ESTABLISHED && + (tiflags & (TH_SYN|TH_FIN|TH_RST|TH_URG|TH_ACK)) == TH_ACK && + ((tp->t_flags & (TF_NEEDSYN|TF_NEEDFIN)) == 0) && + ((to.to_flag & TOF_TS) == 0 || + TSTMP_GEQ(to.to_tsval, tp->ts_recent)) && + /* + * Using the CC option is compulsory if once started: + * the segment is OK if no T/TCP was negotiated or + * if the segment has a CC option equal to CCrecv + */ + ((tp->t_flags & (TF_REQ_CC|TF_RCVD_CC)) != (TF_REQ_CC|TF_RCVD_CC) || + (to.to_flag & TOF_CC) != 0 && to.to_cc == tp->cc_recv) && + ti->ti_seq == tp->rcv_nxt && + tiwin && tiwin == tp->snd_wnd && + tp->snd_nxt == tp->snd_max) { + + /* + * If last ACK falls within this segment's sequence numbers, + * record the timestamp. + * NOTE that the test is modified according to the latest + * proposal of the tcplw@cray.com list (Braden 1993/04/26). + */ + if ((to.to_flag & TOF_TS) != 0 && + SEQ_LEQ(ti->ti_seq, tp->last_ack_sent)) { + tp->ts_recent_age = tcp_now; + tp->ts_recent = to.to_tsval; + } + + if (ti->ti_len == 0) { + if (SEQ_GT(ti->ti_ack, tp->snd_una) && + SEQ_LEQ(ti->ti_ack, tp->snd_max) && + tp->snd_cwnd >= tp->snd_wnd) { + /* + * this is a pure ack for outstanding data. + */ + ++tcpstat.tcps_predack; + if ((to.to_flag & TOF_TS) != 0) + tcp_xmit_timer(tp, + tcp_now - to.to_tsecr + 1); + else if (tp->t_rtt && + SEQ_GT(ti->ti_ack, tp->t_rtseq)) + tcp_xmit_timer(tp, tp->t_rtt); + acked = ti->ti_ack - tp->snd_una; + tcpstat.tcps_rcvackpack++; + tcpstat.tcps_rcvackbyte += acked; + sbdrop(&so->so_snd, acked); + tp->snd_una = ti->ti_ack; + m_freem(m); + + /* + * If all outstanding data are acked, stop + * retransmit timer, otherwise restart timer + * using current (possibly backed-off) value. + * If process is waiting for space, + * wakeup/selwakeup/signal. If data + * are ready to send, let tcp_output + * decide between more output or persist. + */ + if (tp->snd_una == tp->snd_max) + tp->t_timer[TCPT_REXMT] = 0; + else if (tp->t_timer[TCPT_PERSIST] == 0) + tp->t_timer[TCPT_REXMT] = tp->t_rxtcur; + + if (so->so_snd.sb_flags & SB_NOTIFY) + sowwakeup(so); + if (so->so_snd.sb_cc) + (void) tcp_output(tp); + return; + } + } else if (ti->ti_ack == tp->snd_una && + tp->seg_next == (struct tcpiphdr *)tp && + ti->ti_len <= sbspace(&so->so_rcv)) { + /* + * this is a pure, in-sequence data packet + * with nothing on the reassembly queue and + * we have enough buffer space to take it. + */ + ++tcpstat.tcps_preddat; + tp->rcv_nxt += ti->ti_len; + OS_DbgPrint(OSK_MID_TRACE,("Added %d to rcv_nxt\n", + ti->ti_len)); + tcpstat.tcps_rcvpack++; + tcpstat.tcps_rcvbyte += ti->ti_len; + /* + * Add data to socket buffer. + */ + sbappend(so, &so->so_rcv, m); + sorwakeup(so); +#ifdef TCP_ACK_HACK + /* + * If this is a short packet, then ACK now - with Nagel + * congestion avoidance sender won't send more until + * he gets an ACK. + */ + if (tiflags & TH_PUSH) { + tp->t_flags |= TF_ACKNOW; + tcp_output(tp); + } else { + tp->t_flags |= TF_DELACK; + } +#else + tp->t_flags |= TF_DELACK; +#endif + return; + } + } + + /* + * Calculate amount of space in receive window, + * and then do TCP input processing. + * Receive window is amount of space in rcv queue, + * but not less than advertised window. + */ + { int win; + + win = sbspace(&so->so_rcv); + if (win < 0) + win = 0; + tp->rcv_wnd = max(win, (int)(tp->rcv_adv - tp->rcv_nxt)); + } + + switch (tp->t_state) { + + /* + * If the state is LISTEN then ignore segment if it contains an RST. + * If the segment contains an ACK then it is bad and send a RST. + * If it does not contain a SYN then it is not interesting; drop it. + * Don't bother responding if the destination was a broadcast. + * Otherwise initialize tp->rcv_nxt, and tp->irs, select an initial + * tp->iss, and send a segment: + * <SEQ=ISS><ACK=RCV_NXT><CTL=SYN,ACK> + * Also initialize tp->snd_nxt to tp->iss+1 and tp->snd_una to tp->iss. + * Fill in remote peer address fields if not previously specified. + * Enter SYN_RECEIVED state, and process any other fields of this + * segment in this state. + */ + case TCPS_LISTEN: { + struct mbuf *am; + register struct sockaddr_in *sin; + + if (tiflags & TH_RST) + goto drop; + if (tiflags & TH_ACK) + goto dropwithreset; + if ((tiflags & TH_SYN) == 0) + goto drop; + /* + * RFC1122 4.2.3.10, p. 104: discard bcast/mcast SYN + * in_broadcast() should never return true on a received + * packet with M_BCAST not set. + */ + if (m->m_flags & (M_BCAST|M_MCAST) || + IN_MULTICAST(ntohl(ti->ti_dst.s_addr))) + goto drop; + am = m_get(M_DONTWAIT, MT_SONAME); /* XXX */ + if (am == NULL) + goto drop; + am->m_len = sizeof (struct sockaddr_in); + sin = mtod(am, struct sockaddr_in *); + sin->sin_family = AF_INET; + /*sin->sin_len = sizeof(*sin); */ + sin->sin_addr = ti->ti_src; + sin->sin_port = ti->ti_sport; + bzero((caddr_t)sin->sin_zero, sizeof(sin->sin_zero)); + laddr = inp->inp_laddr; + if (inp->inp_laddr.s_addr == INADDR_ANY) + inp->inp_laddr = ti->ti_dst; + if (in_pcbconnect(inp, am)) { + inp->inp_laddr = laddr; + /*(void) m_free(am);*/ + goto drop; + } + /*(void) m_free(am);*/ + tp->t_template = tcp_template(tp); + if (tp->t_template == 0) { + tp = tcp_drop(tp, ENOBUFS); + dropsocket = 0; /* socket is already gone */ + goto drop; + } + if ((taop = tcp_gettaocache(inp)) == NULL) { + taop = &tao_noncached; + bzero(taop, sizeof(*taop)); + } + tcp_dooptions(tp, optp, optlen, ti, &to); + if (iss) + tp->iss = iss; + else + tp->iss = tcp_iss; + tcp_iss += TCP_ISSINCR/2; + tp->irs = ti->ti_seq; + tcp_sendseqinit(tp); + tcp_rcvseqinit(tp); + /* + * Initialization of the tcpcb for transaction; + * set SND.WND = SEG.WND, + * initialize CCsend and CCrecv. + */ + tp->snd_wnd = tiwin; /* initial send-window */ + tp->cc_send = CC_INC(tcp_ccgen); + tp->cc_recv = to.to_cc; + /* + * Perform TAO test on incoming CC (SEG.CC) option, if any. + * - compare SEG.CC against cached CC from the same host, + * if any. + * - if SEG.CC > chached value, SYN must be new and is accepted + * immediately: save new CC in the cache, mark the socket + * connected, enter ESTABLISHED state, turn on flag to + * send a SYN in the next segment. + * A virtual advertised window is set in rcv_adv to + * initialize SWS prevention. Then enter normal segment + * processing: drop SYN, process data and FIN. + * - otherwise do a normal 3-way handshake. + */ + if ((to.to_flag & TOF_CC) != 0) { + if (taop->tao_cc != 0 && CC_GT(to.to_cc, taop->tao_cc)) { + taop->tao_cc = to.to_cc; + tp->t_state = TCPS_ESTABLISHED; + + /* + * If there is a FIN, or if there is data and the + * connection is local, then delay SYN,ACK(SYN) in + * the hope of piggy-backing it on a response + * segment. Otherwise must send ACK now in case + * the other side is slow starting. + */ + if ((tiflags & TH_FIN) || (ti->ti_len != 0 && + in_localaddr(inp->inp_faddr))) + tp->t_flags |= (TF_DELACK | TF_NEEDSYN); + else + tp->t_flags |= (TF_ACKNOW | TF_NEEDSYN); + + /* + * Limit the `virtual advertised window' to TCP_MAXWIN + * here. Even if we requested window scaling, it will + * become effective only later when our SYN is acked. + */ + tp->rcv_adv += min(tp->rcv_wnd, TCP_MAXWIN); + tcpstat.tcps_connects++; + soisconnected(so); + tp->t_timer[TCPT_KEEP] = tcp_keepinit; + dropsocket = 0; /* committed to socket */ + tcpstat.tcps_accepts++; + goto trimthenstep6; + } + /* else do standard 3-way handshake */ + } else { + /* + * No CC option, but maybe CC.NEW: + * invalidate cached value. + */ + taop->tao_cc = 0; + } + /* + * TAO test failed or there was no CC option, + * do a standard 3-way handshake. + */ + tp->t_flags |= TF_ACKNOW; + tp->t_state = TCPS_SYN_RECEIVED; + tp->t_timer[TCPT_KEEP] = tcp_keepinit; + dropsocket = 0; /* committed to socket */ + tcpstat.tcps_accepts++; + goto trimthenstep6; + } + + /* + * If the state is SYN_RECEIVED: + * do just the ack and RST checks from SYN_SENT state. + * If the state is SYN_SENT: + * if seg contains an ACK, but not for our SYN, drop the input. + * if seg contains a RST, then drop the connection. + * if seg does not contain SYN, then drop it. + * Otherwise this is an acceptable SYN segment + * initialize tp->rcv_nxt and tp->irs + * if seg contains ack then advance tp->snd_una + * if SYN has been acked change to ESTABLISHED else SYN_RCVD state + * arrange for segment to be acked (eventually) + * continue processing rest of data/controls, beginning with URG + */ + case TCPS_SYN_RECEIVED: + case TCPS_SYN_SENT: + if ((taop = tcp_gettaocache(inp)) == NULL) { + taop = &tao_noncached; + bzero(taop, sizeof(*taop)); + } + + if ((tiflags & TH_ACK) && + (SEQ_LEQ(ti->ti_ack, tp->iss) || + SEQ_GT(ti->ti_ack, tp->snd_max))) { + /* + * If we have a cached CCsent for the remote host, + * hence we haven't just crashed and restarted, + * do not send a RST. This may be a retransmission + * from the other side after our earlier ACK was lost. + * Our new SYN, when it arrives, will serve as the + * needed ACK. + */ + if (taop->tao_ccsent != 0) + goto drop; + else + goto dropwithreset; + } + if (tiflags & TH_RST) { + if (tiflags & TH_ACK) + tp = tcp_drop(tp, ECONNREFUSED); + goto drop; + } + if (tp->t_state == TCPS_SYN_RECEIVED) + break; + if ((tiflags & TH_SYN) == 0) + goto drop; + tp->snd_wnd = ti->ti_win; /* initial send window */ + tp->cc_recv = to.to_cc; /* foreign CC */ + + tp->irs = ti->ti_seq; + tcp_rcvseqinit(tp); + if (tiflags & TH_ACK) { + /* + * Our SYN was acked. If segment contains CC.ECHO + * option, check it to make sure this segment really + * matches our SYN. If not, just drop it as old + * duplicate, but send an RST if we're still playing + * by the old rules. + */ + if ((to.to_flag & TOF_CCECHO) && + tp->cc_send != to.to_ccecho) { + if (taop->tao_ccsent != 0) + goto drop; + else + goto dropwithreset; + } + tcpstat.tcps_connects++; + soisconnected(so); + /* Do window scaling on this connection? */ + if ((tp->t_flags & (TF_RCVD_SCALE|TF_REQ_SCALE)) == + (TF_RCVD_SCALE|TF_REQ_SCALE)) { + tp->snd_scale = tp->requested_s_scale; + tp->rcv_scale = tp->request_r_scale; + } + /* Segment is acceptable, update cache if undefined. */ + if (taop->tao_ccsent == 0) + taop->tao_ccsent = to.to_ccecho; + + tp->rcv_adv += tp->rcv_wnd; + tp->snd_una++; /* SYN is acked */ + /* + * If there's data, delay ACK; if there's also a FIN + * ACKNOW will be turned on later. + */ + if (ti->ti_len != 0) + tp->t_flags |= TF_DELACK; + else + tp->t_flags |= TF_ACKNOW; + /* + * Received <SYN,ACK> in SYN_SENT[*] state. + * Transitions: + * SYN_SENT --> ESTABLISHED + * SYN_SENT* --> FIN_WAIT_1 + */ + if (tp->t_flags & TF_NEEDFIN) { + tp->t_state = TCPS_FIN_WAIT_1; + tp->t_flags &= ~TF_NEEDFIN; + tiflags &= ~TH_SYN; + } else { + OS_DbgPrint + (OSK_MID_TRACE, + ("Socket %x entered ESTABLISHED state\n", + so)); + tp->t_state = TCPS_ESTABLISHED; + tp->t_timer[TCPT_KEEP] = tcp_keepidle; + } + } else { + /* + * Received initial SYN in SYN-SENT[*] state => simul- + * taneous open. If segment contains CC option and there is + * a cached CC, apply TAO test; if it succeeds, connection is + * half-synchronized. Otherwise, do 3-way handshake: + * SYN-SENT -> SYN-RECEIVED + * SYN-SENT* -> SYN-RECEIVED* + * If there was no CC option, clear cached CC value. + */ + tp->t_flags |= TF_ACKNOW; + tp->t_timer[TCPT_REXMT] = 0; + if (to.to_flag & TOF_CC) { + if (taop->tao_cc != 0 && + CC_GT(to.to_cc, taop->tao_cc)) { + /* + * update cache and make transition: + * SYN-SENT -> ESTABLISHED* + * SYN-SENT* -> FIN-WAIT-1* + */ + taop->tao_cc = to.to_cc; + if (tp->t_flags & TF_NEEDFIN) { + tp->t_state = TCPS_FIN_WAIT_1; + tp->t_flags &= ~TF_NEEDFIN; + } else { + tp->t_state = TCPS_ESTABLISHED; + tp->t_timer[TCPT_KEEP] = tcp_keepidle; + } + tp->t_flags |= TF_NEEDSYN; + } else + tp->t_state = TCPS_SYN_RECEIVED; + } else { + /* CC.NEW or no option => invalidate cache */ + taop->tao_cc = 0; + tp->t_state = TCPS_SYN_RECEIVED; + } + } + +trimthenstep6: + /* + * Advance ti->ti_seq to correspond to first data byte. + * If data, trim to stay within window, + * dropping FIN if necessary. + */ + ti->ti_seq++; + if (ti->ti_len > tp->rcv_wnd) { + todrop = ti->ti_len - tp->rcv_wnd; + m_adj(m, -todrop); + ti->ti_len = tp->rcv_wnd; + tiflags &= ~TH_FIN; + tcpstat.tcps_rcvpackafterwin++; + tcpstat.tcps_rcvbyteafterwin += todrop; + } + tp->snd_wl1 = ti->ti_seq - 1; + tp->rcv_up = ti->ti_seq; + /* + * Client side of transaction: already sent SYN and data. + * If the remote host used T/TCP to validate the SYN, + * our data will be ACK'd; if so, enter normal data segment + * processing in the middle of step 5, ack processing. + * Otherwise, goto step 6. + */ + if (tiflags & TH_ACK) + goto process_ACK; + goto step6; + /* + * If the state is LAST_ACK or CLOSING or TIME_WAIT: + * if segment contains a SYN and CC [not CC.NEW] option: + * if state == TIME_WAIT and connection duration > MSL, + * drop packet and send RST; + * + * if SEG.CC > CCrecv then is new SYN, and can implicitly + * ack the FIN (and data) in retransmission queue. + * Complete close and delete TCPCB. Then reprocess + * segment, hoping to find new TCPCB in LISTEN state; + * + * else must be old SYN; drop it. + * else do normal processing. + */ + case TCPS_LAST_ACK: + case TCPS_CLOSING: + case TCPS_TIME_WAIT: + if ((tiflags & TH_SYN) && + (to.to_flag & TOF_CC) && tp->cc_recv != 0) { + if (tp->t_state == TCPS_TIME_WAIT && + tp->t_duration > TCPTV_MSL) + goto dropwithreset; + if (CC_GT(to.to_cc, tp->cc_recv)) { + tp = tcp_close(tp); + goto findpcb; + } + else + goto drop; + } + break; /* continue normal processing */ + } + + /* + * States other than LISTEN or SYN_SENT. + * First check timestamp, if present. + * Then check the connection count, if present. + * Then check that at least some bytes of segment are within + * receive window. If segment begins before rcv_nxt, + * drop leading data (and SYN); if nothing left, just ack. + * + * RFC 1323 PAWS: If we have a timestamp reply on this segment + * and it's less than ts_recent, drop it. + */ + if ((to.to_flag & TOF_TS) != 0 && (tiflags & TH_RST) == 0 && + tp->ts_recent && TSTMP_LT(to.to_tsval, tp->ts_recent)) { + + /* Check to see if ts_recent is over 24 days old. */ + if ((int)(tcp_now - tp->ts_recent_age) > TCP_PAWS_IDLE) { + /* + * Invalidate ts_recent. If this segment updates + * ts_recent, the age will be reset later and ts_recent + * will get a valid value. If it does not, setting + * ts_recent to zero will at least satisfy the + * requirement that zero be placed in the timestamp + * echo reply when ts_recent isn't valid. The + * age isn't reset until we get a valid ts_recent + * because we don't want out-of-order segments to be + * dropped when ts_recent is old. + */ + tp->ts_recent = 0; + } else { + tcpstat.tcps_rcvduppack++; + tcpstat.tcps_rcvdupbyte += ti->ti_len; + tcpstat.tcps_pawsdrop++; + goto dropafterack; + } + } + + /* + * T/TCP mechanism + * If T/TCP was negotiated and the segment doesn't have CC, + * or if it's CC is wrong then drop the segment. + * RST segments do not have to comply with this. + */ + if ((tp->t_flags & (TF_REQ_CC|TF_RCVD_CC)) == (TF_REQ_CC|TF_RCVD_CC) && + ((to.to_flag & TOF_CC) == 0 || tp->cc_recv != to.to_cc) && + (tiflags & TH_RST) == 0) + goto dropafterack; + + todrop = tp->rcv_nxt - ti->ti_seq; + if (todrop > 0) { + if (tiflags & TH_SYN) { + tiflags &= ~TH_SYN; + ti->ti_seq++; + if (ti->ti_urp > 1) + ti->ti_urp--; + else + tiflags &= ~TH_URG; + todrop--; + } + /* + * Following if statement from Stevens, vol. 2, p. 960. + */ + if (todrop > ti->ti_len + || (todrop == ti->ti_len && (tiflags & TH_FIN) == 0)) { + /* + * Any valid FIN must be to the left of the window. + * At this point the FIN must be a duplicate or out + * of sequence; drop it. + */ + tiflags &= ~TH_FIN; + + /* + * Send an ACK to resynchronize and drop any data. + * But keep on processing for RST or ACK. + */ + tp->t_flags |= TF_ACKNOW; + todrop = ti->ti_len; + tcpstat.tcps_rcvduppack++; + tcpstat.tcps_rcvdupbyte += todrop; + } else { + tcpstat.tcps_rcvpartduppack++; + tcpstat.tcps_rcvpartdupbyte += todrop; + } + m_adj(m, todrop); + ti->ti_seq += todrop; + ti->ti_len -= todrop; + if (ti->ti_urp > todrop) + ti->ti_urp -= todrop; + else { + tiflags &= ~TH_URG; + ti->ti_urp = 0; + } + } + + /* + * If new data are received on a connection after the + * user processes are gone, then RST the other end. + */ + if ((so->so_state & SS_NOFDREF) && + tp->t_state > TCPS_CLOSE_WAIT && ti->ti_len) { + tp = tcp_close(tp); + tcpstat.tcps_rcvafterclose++; + goto dropwithreset; + } + + /* + * If segment ends after window, drop trailing data + * (and PUSH and FIN); if nothing left, just ACK. + */ + todrop = (ti->ti_seq+ti->ti_len) - (tp->rcv_nxt+tp->rcv_wnd); + if (todrop > 0) { + tcpstat.tcps_rcvpackafterwin++; + if (todrop >= ti->ti_len) { + tcpstat.tcps_rcvbyteafterwin += ti->ti_len; + /* + * If a new connection request is received + * while in TIME_WAIT, drop the old connection + * and start over if the sequence numbers + * are above the previous ones. + */ + if (tiflags & TH_SYN && + tp->t_state == TCPS_TIME_WAIT && + SEQ_GT(ti->ti_seq, tp->rcv_nxt)) { + iss = tp->rcv_nxt + TCP_ISSINCR; + tp = tcp_close(tp); + goto findpcb; + } + /* + * If window is closed can only take segments at + * window edge, and have to drop data and PUSH from + * incoming segments. Continue processing, but + * remember to ack. Otherwise, drop segment + * and ack. + */ + if (tp->rcv_wnd == 0 && ti->ti_seq == tp->rcv_nxt) { + tp->t_flags |= TF_ACKNOW; + tcpstat.tcps_rcvwinprobe++; + } else + goto dropafterack; + } else + tcpstat.tcps_rcvbyteafterwin += todrop; + m_adj(m, -todrop); + ti->ti_len -= todrop; + tiflags &= ~(TH_PUSH|TH_FIN); + } + + /* + * If last ACK falls within this segment's sequence numbers, + * record its timestamp. + * NOTE that the test is modified according to the latest + * proposal of the tcplw@cray.com list (Braden 1993/04/26). + */ + if ((to.to_flag & TOF_TS) != 0 && + SEQ_LEQ(ti->ti_seq, tp->last_ack_sent)) { + tp->ts_recent_age = tcp_now; + tp->ts_recent = to.to_tsval; + } + + /* + * If the RST bit is set examine the state: + * SYN_RECEIVED STATE: + * If passive open, return to LISTEN state. + * If active open, inform user that connection was refused. + * ESTABLISHED, FIN_WAIT_1, FIN_WAIT2, CLOSE_WAIT STATES: + * Inform user that connection was reset, and close tcb. + * CLOSING, LAST_ACK, TIME_WAIT STATES + * Close the tcb. + */ + if (tiflags&TH_RST) switch (tp->t_state) { + + case TCPS_SYN_RECEIVED: + so->so_error = ECONNREFUSED; + goto close; + + case TCPS_ESTABLISHED: + case TCPS_FIN_WAIT_1: + case TCPS_FIN_WAIT_2: + case TCPS_CLOSE_WAIT: + so->so_error = ECONNRESET; + close: + tp->t_state = TCPS_CLOSED; + tcpstat.tcps_drops++; + tp = tcp_close(tp); + goto drop; + + case TCPS_CLOSING: + case TCPS_LAST_ACK: + case TCPS_TIME_WAIT: + tp = tcp_close(tp); + goto drop; + } + + /* + * If a SYN is in the window, then this is an + * error and we send an RST and drop the connection. + */ + if (tiflags & TH_SYN) { + tp = tcp_drop(tp, ECONNRESET); + goto dropwithreset; + } + + /* + * If the ACK bit is off: if in SYN-RECEIVED state or SENDSYN + * flag is on (half-synchronized state), then queue data for + * later processing; else drop segment and return. + */ + if ((tiflags & TH_ACK) == 0) { + if (tp->t_state == TCPS_SYN_RECEIVED || + (tp->t_flags & TF_NEEDSYN)) + goto step6; + else + goto drop; + } + + /* + * Ack processing. + */ + switch (tp->t_state) { + + /* + * In SYN_RECEIVED state if the ack ACKs our SYN then enter + * ESTABLISHED state and continue processing, otherwise + * send an RST. + */ + case TCPS_SYN_RECEIVED: + if (SEQ_GT(tp->snd_una, ti->ti_ack) || + SEQ_GT(ti->ti_ack, tp->snd_max)) + goto dropwithreset; + + tcpstat.tcps_connects++; + soisconnected(so); + /* Do window scaling? */ + if ((tp->t_flags & (TF_RCVD_SCALE|TF_REQ_SCALE)) == + (TF_RCVD_SCALE|TF_REQ_SCALE)) { + tp->snd_scale = tp->requested_s_scale; + tp->rcv_scale = tp->request_r_scale; + } + /* + * Upon successful completion of 3-way handshake, + * update cache.CC if it was undefined, pass any queued + * data to the user, and advance state appropriately. + */ + if ((taop = tcp_gettaocache(inp)) != NULL && + taop->tao_cc == 0) + taop->tao_cc = tp->cc_recv; + + /* + * Make transitions: + * SYN-RECEIVED -> ESTABLISHED + * SYN-RECEIVED* -> FIN-WAIT-1 + */ + if (tp->t_flags & TF_NEEDFIN) { + tp->t_state = TCPS_FIN_WAIT_1; + tp->t_flags &= ~TF_NEEDFIN; + } else { + tp->t_state = TCPS_ESTABLISHED; + tp->t_timer[TCPT_KEEP] = tcp_keepidle; + } + /* + * If segment contains data or ACK, will call tcp_reass() + * later; if not, do so now to pass queued data to user. + */ + if (ti->ti_len == 0 && (tiflags & TH_FIN) == 0) + (void) tcp_reass(tp, (struct tcpiphdr *)0, + (struct mbuf *)0); + tp->snd_wl1 = ti->ti_seq - 1; + /* fall into ... */ + + /* + * In ESTABLISHED state: drop duplicate ACKs; ACK out of range + * ACKs. If the ack is in the range + * tp->snd_una < ti->ti_ack <= tp->snd_max + * then advance tp->snd_una to ti->ti_ack and drop + * data from the retransmission queue. If this ACK reflects + * more up to date window information we update our window information. + */ + case TCPS_ESTABLISHED: + case TCPS_FIN_WAIT_1: + case TCPS_FIN_WAIT_2: + case TCPS_CLOSE_WAIT: + case TCPS_CLOSING: + case TCPS_LAST_ACK: + case TCPS_TIME_WAIT: + + if (SEQ_LEQ(ti->ti_ack, tp->snd_una)) { + if (ti->ti_len == 0 && tiwin == tp->snd_wnd) { + tcpstat.tcps_rcvdupack++; + /* + * If we have outstanding data (other than + * a window probe), this is a completely + * duplicate ack (ie, window info didn't + * change), the ack is the biggest we've + * seen and we've seen exactly our rexmt + * threshhold of them, assume a packet + * has been dropped and retransmit it. + * Kludge snd_nxt & the congestion + * window so we send only this one + * packet. + * + * We know we're losing at the current + * window size so do congestion avoidance + * (set ssthresh to half the current window + * and pull our congestion window back to + * the new ssthresh). + * + * Dup acks mean that packets have left the + * network (they're now cached at the receiver) + * so bump cwnd by the amount in the receiver + * to keep a constant cwnd packets in the + * network. + */ + if (tp->t_timer[TCPT_REXMT] == 0 || + ti->ti_ack != tp->snd_una) + tp->t_dupacks = 0; + else if (++tp->t_dupacks == tcprexmtthresh) { + tcp_seq onxt = tp->snd_nxt; + u_int win = + min(tp->snd_wnd, tp->snd_cwnd) / 2 / + tp->t_maxseg; + + if (win < 2) + win = 2; + tp->snd_ssthresh = win * tp->t_maxseg; + tp->t_timer[TCPT_REXMT] = 0; + tp->t_rtt = 0; + tp->snd_nxt = ti->ti_ack; + tp->snd_cwnd = tp->t_maxseg; + (void) tcp_output(tp); + tp->snd_cwnd = tp->snd_ssthresh + + tp->t_maxseg * tp->t_dupacks; + if (SEQ_GT(onxt, tp->snd_nxt)) + tp->snd_nxt = onxt; + goto drop; + } else if (tp->t_dupacks > tcprexmtthresh) { + tp->snd_cwnd += tp->t_maxseg; + (void) tcp_output(tp); + goto drop; + } + } else + tp->t_dupacks = 0; + break; + } + /* + * If the congestion window was inflated to account + * for the other side's cached packets, retract it. + */ + if (tp->t_dupacks > tcprexmtthresh && + tp->snd_cwnd > tp->snd_ssthresh) + tp->snd_cwnd = tp->snd_ssthresh; + tp->t_dupacks = 0; + if (SEQ_GT(ti->ti_ack, tp->snd_max)) { + tcpstat.tcps_rcvacktoomuch++; + goto dropafterack; + } + /* + * If we reach this point, ACK is not a duplicate, + * i.e., it ACKs something we sent. + */ + if (tp->t_flags & TF_NEEDSYN) { + /* + * T/TCP: Connection was half-synchronized, and our + * SYN has been ACK'd (so connection is now fully + * synchronized). Go to non-starred state, + * increment snd_una for ACK of SYN, and check if + * we can do window scaling. + */ + tp->t_flags &= ~TF_NEEDSYN; + tp->snd_una++; + /* Do window scaling? */ + if ((tp->t_flags & (TF_RCVD_SCALE|TF_REQ_SCALE)) == + (TF_RCVD_SCALE|TF_REQ_SCALE)) { + tp->snd_scale = tp->requested_s_scale; + tp->rcv_scale = tp->request_r_scale; + } + } + +process_ACK: + acked = ti->ti_ack - tp->snd_una; + tcpstat.tcps_rcvackpack++; + tcpstat.tcps_rcvackbyte += acked; + + /* + * If we have a timestamp reply, update smoothed + * round trip time. If no timestamp is present but + * transmit timer is running and timed sequence + * number was acked, update smoothed round trip time. + * Since we now have an rtt measurement, cancel the + * timer backoff (cf., Phil Karn's retransmit alg.). + * Recompute the initial retransmit timer. + */ + if (to.to_flag & TOF_TS) + tcp_xmit_timer(tp, tcp_now - to.to_tsecr + 1); + else if (tp->t_rtt && SEQ_GT(ti->ti_ack, tp->t_rtseq)) + tcp_xmit_timer(tp,tp->t_rtt); + + /* + * If all outstanding data is acked, stop retransmit + * timer and remember to restart (more output or persist). + * If there is more data to be acked, restart retransmit + * timer, using current (possibly backed-off) value. + */ + if (ti->ti_ack == tp->snd_max) { + tp->t_timer[TCPT_REXMT] = 0; + needoutput = 1; + } else if (tp->t_timer[TCPT_PERSIST] == 0) + tp->t_timer[TCPT_REXMT] = tp->t_rxtcur; + + /* + * If no data (only SYN) was ACK'd, + * skip rest of ACK processing. + */ + if (acked == 0) + goto step6; + + /* + * When new data is acked, open the congestion window. + * If the window gives us less than ssthresh packets + * in flight, open exponentially (maxseg per packet). + * Otherwise open linearly: maxseg per window + * (maxseg^2 / cwnd per packet). + */ + { + register u_int cw = tp->snd_cwnd; + register u_int incr = tp->t_maxseg; + + if (cw > tp->snd_ssthresh) + incr = incr * incr / cw; + tp->snd_cwnd = min(cw + incr, TCP_MAXWIN<<tp->snd_scale); + } + if (acked > so->so_snd.sb_cc) { + tp->snd_wnd -= so->so_snd.sb_cc; + sbdrop(&so->so_snd, (int)so->so_snd.sb_cc); + ourfinisacked = 1; + } else { + sbdrop(&so->so_snd, acked); + tp->snd_wnd -= acked; + ourfinisacked = 0; + } + if (so->so_snd.sb_flags & SB_NOTIFY) + sowwakeup(so); + tp->snd_una = ti->ti_ack; + if (SEQ_LT(tp->snd_nxt, tp->snd_una)) + tp->snd_nxt = tp->snd_una; + + switch (tp->t_state) { + + /* + * In FIN_WAIT_1 STATE in addition to the processing + * for the ESTABLISHED state if our FIN is now acknowledged + * then enter FIN_WAIT_2. + */ + case TCPS_FIN_WAIT_1: + if (ourfinisacked) { + /* + * If we can't receive any more + * data, then closing user can proceed. + * Starting the timer is contrary to the + * specification, but if we don't get a FIN + * we'll hang forever. + */ + if (so->so_state & SS_CANTRCVMORE) { + soisdisconnected(so); + tp->t_timer[TCPT_2MSL] = tcp_maxidle; + } + tp->t_state = TCPS_FIN_WAIT_2; + } + break; + + /* + * In CLOSING STATE in addition to the processing for + * the ESTABLISHED state if the ACK acknowledges our FIN + * then enter the TIME-WAIT state, otherwise ignore + * the segment. + */ + case TCPS_CLOSING: + if (ourfinisacked) { + tp->t_state = TCPS_TIME_WAIT; + tcp_canceltimers(tp); + /* Shorten TIME_WAIT [RFC-1644, p.28] */ + if (tp->cc_recv != 0 && + tp->t_duration < TCPTV_MSL) + tp->t_timer[TCPT_2MSL] = + tp->t_rxtcur * TCPTV_TWTRUNC; + else + tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL; + soisdisconnected(so); + } + break; + + /* + * In LAST_ACK, we may still be waiting for data to drain + * and/or to be acked, as well as for the ack of our FIN. + * If our FIN is now acknowledged, delete the TCB, + * enter the closed state and return. + */ + case TCPS_LAST_ACK: + if (ourfinisacked) { + tp = tcp_close(tp); + goto drop; + } + break; + + /* + * In TIME_WAIT state the only thing that should arrive + * is a retransmission of the remote FIN. Acknowledge + * it and restart the finack timer. + */ + case TCPS_TIME_WAIT: + tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL; + goto dropafterack; + } + } + +step6: + /* + * Update window information. + * Don't look at window if no ACK: TAC's send garbage on first SYN. + */ + if ((tiflags & TH_ACK) && + (SEQ_LT(tp->snd_wl1, ti->ti_seq) || + (tp->snd_wl1 == ti->ti_seq && (SEQ_LT(tp->snd_wl2, ti->ti_ack) || + (tp->snd_wl2 == ti->ti_ack && tiwin > tp->snd_wnd))))) { + /* keep track of pure window updates */ + if (ti->ti_len == 0 && + tp->snd_wl2 == ti->ti_ack && tiwin > tp->snd_wnd) + tcpstat.tcps_rcvwinupd++; + tp->snd_wnd = tiwin; + tp->snd_wl1 = ti->ti_seq; + tp->snd_wl2 = ti->ti_ack; + if (tp->snd_wnd > tp->max_sndwnd) + tp->max_sndwnd = tp->snd_wnd; + needoutput = 1; + } + + /* + * Process segments with URG. + */ + if ((tiflags & TH_URG) && ti->ti_urp && + TCPS_HAVERCVDFIN(tp->t_state) == 0) { + /* + * This is a kludge, but if we receive and accept + * random urgent pointers, we'll crash in + * soreceive. It's hard to imagine someone + * actually wanting to send this much urgent data. + */ + if (ti->ti_urp + so->so_rcv.sb_cc > sb_max) { + ti->ti_urp = 0; /* XXX */ + tiflags &= ~TH_URG; /* XXX */ + goto dodata; /* XXX */ + } + /* + * If this segment advances the known urgent pointer, + * then mark the data stream. This should not happen + * in CLOSE_WAIT, CLOSING, LAST_ACK or TIME_WAIT STATES since + * a FIN has been received from the remote side. + * In these states we ignore the URG. + * + * According to RFC961 (Assigned Protocols), + * the urgent pointer points to the last octet + * of urgent data. We continue, however, + * to consider it to indicate the first octet + * of data past the urgent section as the original + * spec states (in one of two places). + */ + if (SEQ_GT(ti->ti_seq+ti->ti_urp, tp->rcv_up)) { + tp->rcv_up = ti->ti_seq + ti->ti_urp; + so->so_oobmark = so->so_rcv.sb_cc + + (tp->rcv_up - tp->rcv_nxt) - 1; + if (so->so_oobmark == 0) + so->so_state |= SS_RCVATMARK; + sohasoutofband(so); + tp->t_oobflags &= ~(TCPOOB_HAVEDATA | TCPOOB_HADDATA); + } + /* + * Remove out of band data so doesn't get presented to user. + * This can happen independent of advancing the URG pointer, + * but if two URG's are pending at once, some out-of-band + * data may creep in... ick. + */ + if (ti->ti_urp <= (u_long)ti->ti_len +#ifdef SO_OOBINLINE + && (so->so_options & SO_OOBINLINE) == 0 +#endif + ) + tcp_pulloutofband(so, ti, m); + } else + /* + * If no out of band data is expected, + * pull receive urgent pointer along + * with the receive window. + */ + if (SEQ_GT(tp->rcv_nxt, tp->rcv_up)) + tp->rcv_up = tp->rcv_nxt; +dodata: /* XXX */ + + /* + * Process the segment text, merging it into the TCP sequencing queue, + * and arranging for acknowledgment of receipt if necessary. + * This process logically involves adjusting tp->rcv_wnd as data + * is presented to the user (this happens in tcp_usrreq.c, + * case PRU_RCVD). If a FIN has already been received on this + * connection then we just ignore the text. + */ + if ((ti->ti_len || (tiflags&TH_FIN)) && + TCPS_HAVERCVDFIN(tp->t_state) == 0) { + TCP_REASS(tp, ti, m, so, tiflags); + /* + * Note the amount of data that peer has sent into + * our window, in order to estimate the sender's + * buffer size. + */ + len = so->so_rcv.sb_hiwat - (tp->rcv_adv - tp->rcv_nxt); + } else { + m_freem(m); + tiflags &= ~TH_FIN; + } + + /* + * If FIN is received ACK the FIN and let the user know + * that the connection is closing. + */ + if (tiflags & TH_FIN) { + if (TCPS_HAVERCVDFIN(tp->t_state) == 0) { + socantrcvmore(so); + /* + * If connection is half-synchronized + * (ie NEEDSYN flag on) then delay ACK, + * so it may be piggybacked when SYN is sent. + * Otherwise, since we received a FIN then no + * more input can be expected, send ACK now. + */ + if (tp->t_flags & TF_NEEDSYN) + tp->t_flags |= TF_DELACK; + else + tp->t_flags |= TF_ACKNOW; + tp->rcv_nxt++; + } + switch (tp->t_state) { + + /* + * In SYN_RECEIVED and ESTABLISHED STATES + * enter the CLOSE_WAIT state. + */ + case TCPS_SYN_RECEIVED: + case TCPS_ESTABLISHED: + tp->t_state = TCPS_CLOSE_WAIT; + break; + + /* + * If still in FIN_WAIT_1 STATE FIN has not been acked so + * enter the CLOSING state. + */ + case TCPS_FIN_WAIT_1: + tp->t_state = TCPS_CLOSING; + break; + + /* + * In FIN_WAIT_2 state enter the TIME_WAIT state, + * starting the time-wait timer, turning off the other + * standard timers. + */ + case TCPS_FIN_WAIT_2: + tp->t_state = TCPS_TIME_WAIT; + tcp_canceltimers(tp); + /* Shorten TIME_WAIT [RFC-1644, p.28] */ + if (tp->cc_recv != 0 && + tp->t_duration < TCPTV_MSL) { + tp->t_timer[TCPT_2MSL] = + tp->t_rxtcur * TCPTV_TWTRUNC; + /* For transaction client, force ACK now. */ + tp->t_flags |= TF_ACKNOW; + } + else + tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL; + soisdisconnected(so); + break; + + /* + * In TIME_WAIT state restart the 2 MSL time_wait timer. + */ + case TCPS_TIME_WAIT: + tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL; + break; + } + } +#ifdef TCPDEBUG + if (so->so_options & SO_DEBUG) + tcp_trace(TA_INPUT, ostate, tp, &tcp_saveti, 0); +#endif + + /* + * Return any desired output. + */ + OS_DbgPrint(OSK_MID_TRACE, + ("needoutput: %d, tp->t_flags & TF_ACKNOW: %d\n", + needoutput, tp->t_flags & TF_ACKNOW)); + + if (needoutput || (tp->t_flags & TF_ACKNOW)) + (void) tcp_output(tp); + return; + +dropafterack: + /* + * Generate an ACK dropping incoming segment if it occupies + * sequence space, where the ACK reflects our state. + */ + if (tiflags & TH_RST) + goto drop; +#ifdef TCPDEBUG + if (so->so_options & SO_DEBUG) + tcp_trace(TA_DROP, ostate, tp, &tcp_saveti, 0); +#endif + m_freem(m); + tp->t_flags |= TF_ACKNOW; + (void) tcp_output(tp); + return; + +dropwithreset: + /* + * Generate a RST, dropping incoming segment. + * Make ACK acceptable to originator of segment. + * Don't bother to respond if destination was broadcast/multicast. + */ + if ((tiflags & TH_RST) || m->m_flags & (M_BCAST|M_MCAST) || + IN_MULTICAST(ntohl(ti->ti_dst.s_addr))) + goto drop; +#ifdef TCPDEBUG + if (tp == 0 || (tp->t_inpcb->inp_socket->so_options & SO_DEBUG)) + tcp_trace(TA_DROP, ostate, tp, &tcp_saveti, 0); +#endif + if (tiflags & TH_ACK) + tcp_respond(tp, ti, m, (tcp_seq)0, ti->ti_ack, TH_RST); + else { + if (tiflags & TH_SYN) + ti->ti_len++; + tcp_respond(tp, ti, m, ti->ti_seq+ti->ti_len, (tcp_seq)0, + TH_RST|TH_ACK); + } + /* destroy temporarily created socket */ + if (dropsocket) + (void) soabort(so); + return; + +drop: + /* + * Drop space held by incoming segment and return. + */ +#ifdef TCPDEBUG + if (tp == 0 || (tp->t_inpcb->inp_socket->so_options & SO_DEBUG)) + tcp_trace(TA_DROP, ostate, tp, &tcp_saveti, 0); +#endif + /* destroy temporarily created socket */ + if (dropsocket) + (void) soabort(so); + return; +#ifndef TUBA_INCLUDE +} + +void +tcp_dooptions(tp, cp, cnt, ti, to) + struct tcpcb *tp; + u_char *cp; + int cnt; + struct tcpiphdr *ti; + struct tcpopt *to; +{ + u_short mss = 0; + int opt, optlen; + + for (; cnt > 0; cnt -= optlen, cp += optlen) { + opt = cp[0]; + if (opt == TCPOPT_EOL) + break; + if (opt == TCPOPT_NOP) + optlen = 1; + else { + optlen = cp[1]; + if (optlen <= 0) + break; + } + switch (opt) { + + default: + continue; + + case TCPOPT_MAXSEG: + if (optlen != TCPOLEN_MAXSEG) + continue; + if (!(ti->ti_flags & TH_SYN)) + continue; + bcopy((char *) cp + 2, (char *) &mss, sizeof(mss)); + NTOHS(mss); + break; + + case TCPOPT_WINDOW: + if (optlen != TCPOLEN_WINDOW) + continue; + if (!(ti->ti_flags & TH_SYN)) + continue; + tp->t_flags |= TF_RCVD_SCALE; + tp->requested_s_scale = min(cp[2], TCP_MAX_WINSHIFT); + break; + + case TCPOPT_TIMESTAMP: + if (optlen != TCPOLEN_TIMESTAMP) + continue; + to->to_flag |= TOF_TS; + bcopy((char *)cp + 2, + (char *)&to->to_tsval, sizeof(to->to_tsval)); + NTOHL(to->to_tsval); + bcopy((char *)cp + 6, + (char *)&to->to_tsecr, sizeof(to->to_tsecr)); + NTOHL(to->to_tsecr); + + /* + * A timestamp received in a SYN makes + * it ok to send timestamp requests and replies. + */ + if (ti->ti_flags & TH_SYN) { + tp->t_flags |= TF_RCVD_TSTMP; + tp->ts_recent = to->to_tsval; + tp->ts_recent_age = tcp_now; + } + break; + case TCPOPT_CC: + if (optlen != TCPOLEN_CC) + continue; + to->to_flag |= TOF_CC; + bcopy((char *)cp + 2, + (char *)&to->to_cc, sizeof(to->to_cc)); + NTOHL(to->to_cc); + /* + * A CC or CC.new option received in a SYN makes + * it ok to send CC in subsequent segments. + */ + if (ti->ti_flags & TH_SYN) + tp->t_flags |= TF_RCVD_CC; + break; + case TCPOPT_CCNEW: + if (optlen != TCPOLEN_CC) + continue; + if (!(ti->ti_flags & TH_SYN)) + continue; + to->to_flag |= TOF_CCNEW; + bcopy((char *)cp + 2, + (char *)&to->to_cc, sizeof(to->to_cc)); + NTOHL(to->to_cc); + /* + * A CC or CC.new option received in a SYN makes + * it ok to send CC in subsequent segments. + */ + tp->t_flags |= TF_RCVD_CC; + break; + case TCPOPT_CCECHO: + if (optlen != TCPOLEN_CC) + continue; + if (!(ti->ti_flags & TH_SYN)) + continue; + to->to_flag |= TOF_CCECHO; + bcopy((char *)cp + 2, + (char *)&to->to_ccecho, sizeof(to->to_ccecho)); + NTOHL(to->to_ccecho); + break; + } + } + if (ti->ti_flags & TH_SYN) + tcp_mss(tp, mss); /* sets t_maxseg */ +} + +/* + * Pull out of band byte out of a segment so + * it doesn't appear in the user's data queue. + * It is still reflected in the segment length for + * sequencing purposes. + */ +void +tcp_pulloutofband(so, ti, m) + struct socket *so; + struct tcpiphdr *ti; + register struct mbuf *m; +{ + int cnt = ti->ti_urp - 1; + + while (cnt >= 0) { + if (m->m_len > cnt) { + char *cp = mtod(m, caddr_t) + cnt; + struct tcpcb *tp = sototcpcb(so); + + tp->t_iobc = *cp; + tp->t_oobflags |= TCPOOB_HAVEDATA; + bcopy(cp+1, cp, (unsigned)(m->m_len - cnt - 1)); + m->m_len--; + return; + } + cnt -= m->m_len; + m = m->m_next; + if (m == 0) + break; + } + panic("tcp_pulloutofband"); +} + +/* + * Collect new round-trip time estimate + * and update averages and current timeout. + */ +void +tcp_xmit_timer(tp, rtt) + register struct tcpcb *tp; + short rtt; +{ + register short delta; + + tcpstat.tcps_rttupdated++; + tp->t_rttupdated++; + if (tp->t_srtt != 0) { + /* + * srtt is stored as fixed point with 3 bits after the + * binary point (i.e., scaled by 8). The following magic + * is equivalent to the smoothing algorithm in rfc793 with + * an alpha of .875 (srtt = rtt/8 + srtt*7/8 in fixed + * point). Adjust rtt to origin 0. + */ + delta = rtt - 1 - (tp->t_srtt >> TCP_RTT_SHIFT); + if ((tp->t_srtt += delta) <= 0) + tp->t_srtt = 1; + /* + * We accumulate a smoothed rtt variance (actually, a + * smoothed mean difference), then set the retransmit + * timer to smoothed rtt + 4 times the smoothed variance. + * rttvar is stored as fixed point with 2 bits after the + * binary point (scaled by 4). The following is + * equivalent to rfc793 smoothing with an alpha of .75 + * (rttvar = rttvar*3/4 + |delta| / 4). This replaces + * rfc793's wired-in beta. + */ + if (delta < 0) + delta = -delta; + delta -= (tp->t_rttvar >> TCP_RTTVAR_SHIFT); + if ((tp->t_rttvar += delta) <= 0) + tp->t_rttvar = 1; + } else { + /* + * No rtt measurement yet - use the unsmoothed rtt. + * Set the variance to half the rtt (so our first + * retransmit happens at 3*rtt). + */ + tp->t_srtt = rtt << TCP_RTT_SHIFT; + tp->t_rttvar = rtt << (TCP_RTTVAR_SHIFT - 1); + } + tp->t_rtt = 0; + tp->t_rxtshift = 0; + + /* + * the retransmit should happen at rtt + 4 * rttvar. + * Because of the way we do the smoothing, srtt and rttvar + * will each average +1/2 tick of bias. When we compute + * the retransmit timer, we want 1/2 tick of rounding and + * 1 extra tick because of +-1/2 tick uncertainty in the + * firing of the timer. The bias will give us exactly the + * 1.5 tick we need. But, because the bias is + * statistical, we have to test that we don't drop below + * the minimum feasible timer (which is 2 ticks). + */ + TCPT_RANGESET(tp->t_rxtcur, TCP_REXMTVAL(tp), + tp->t_rttmin, TCPTV_REXMTMAX); + + /* + * We received an ack for a packet that wasn't retransmitted; + * it is probably safe to discard any error indications we've + * received recently. This isn't quite right, but close enough + * for now (a route might have failed after we sent a segment, + * and the return path might not be symmetrical). + */ + tp->t_softerror = 0; +} + +/* + * Determine a reasonable value for maxseg size. + * If the route is known, check route for mtu. + * If none, use an mss that can be handled on the outgoing + * interface without forcing IP to fragment; if bigger than + * an mbuf cluster (MCLBYTES), round down to nearest multiple of MCLBYTES + * to utilize large mbufs. If no route is found, route has no mtu, + * or the destination isn't local, use a default, hopefully conservative + * size (usually 512 or the default IP max size, but no more than the mtu + * of the interface), as we can't discover anything about intervening + * gateways or networks. We also initialize the congestion/slow start + * window to be a single segment if the destination isn't local. + * While looking at the routing entry, we also initialize other path-dependent + * parameters from pre-set or cached values in the routing entry. + * + * Also take into account the space needed for options that we + * send regularly. Make maxseg shorter by that amount to assure + * that we can send maxseg amount of data even when the options + * are present. Store the upper limit of the length of options plus + * data in maxopd. + * + * NOTE that this routine is only called when we process an incoming + * segment, for outgoing segments only tcp_mssopt is called. + * + * In case of T/TCP, we call this routine during implicit connection + * setup as well (offer = -1), to initialize maxseg from the cached + * MSS of our peer. + */ +void +tcp_mss(tp, offer) + struct tcpcb *tp; + int offer; +{ + register struct rtentry *rt; + struct ifnet *ifp; + register int rtt, mss; + u_long bufsize; + struct inpcb *inp; + struct socket *so; + struct rmxp_tao *taop; + int origoffer = offer; + + inp = tp->t_inpcb; + if ((rt = tcp_rtlookup(inp)) == NULL) { + tp->t_maxopd = tp->t_maxseg = tcp_mssdflt; + return; + } + so = inp->inp_socket; + + taop = rmx_taop(rt->rt_rmx); + /* + * Offer == -1 means that we didn't receive SYN yet, + * use cached value in that case; + */ + if (offer == -1) + offer = taop->tao_mssopt; + /* + * Offer == 0 means that there was no MSS on the SYN segment, + * in this case we use tcp_mssdflt. + */ + if (offer == 0) + offer = tcp_mssdflt; + else + /* + * Sanity check: make sure that maxopd will be large + * enough to allow some data on segments even is the + * all the option space is used (40bytes). Otherwise + * funny things may happen in tcp_output. + */ + offer = max(offer, 64); + taop->tao_mssopt = offer; + + /* + * While we're here, check if there's an initial rtt + * or rttvar. Convert from the route-table units + * to scaled multiples of the slow timeout timer. + */ + if (tp->t_srtt == 0 && (rtt = rt->rt_rmx.rmx_rtt)) { + /* + * XXX the lock bit for RTT indicates that the value + * is also a minimum value; this is subject to time. + */ + if (rt->rt_rmx.rmx_locks & RTV_RTT) + tp->t_rttmin = rtt / (RTM_RTTUNIT / PR_SLOWHZ); + tp->t_srtt = rtt / (RTM_RTTUNIT / (PR_SLOWHZ * TCP_RTT_SCALE)); + tcpstat.tcps_usedrtt++; + if (rt->rt_rmx.rmx_rttvar) { + tp->t_rttvar = rt->rt_rmx.rmx_rttvar / + (RTM_RTTUNIT / (PR_SLOWHZ * TCP_RTTVAR_SCALE)); + tcpstat.tcps_usedrttvar++; + } else { + /* default variation is +- 1 rtt */ + tp->t_rttvar = + tp->t_srtt * TCP_RTTVAR_SCALE / TCP_RTT_SCALE; + } + TCPT_RANGESET(tp->t_rxtcur, + ((tp->t_srtt >> 2) + tp->t_rttvar) >> 1, + tp->t_rttmin, TCPTV_REXMTMAX); + } + /* + * if there's an mtu associated with the route, use it + */ + if (rt->rt_rmx.rmx_mtu) + mss = rt->rt_rmx.rmx_mtu - sizeof(struct tcpiphdr); + else + { + mss = rt->rt_mtu - sizeof(struct tcpiphdr); + if (!in_localaddr(inp->inp_faddr)) + mss = min(mss, tcp_mssdflt); + } + mss = min(mss, offer); + /* + * maxopd stores the maximum length of data AND options + * in a segment; maxseg is the amount of data in a normal + * segment. We need to store this value (maxopd) apart + * from maxseg, because now every segment carries options + * and thus we normally have somewhat less data in segments. + */ + tp->t_maxopd = mss; + + /* + * In case of T/TCP, origoffer==-1 indicates, that no segments + * were received yet. In this case we just guess, otherwise + * we do the same as before T/TCP. + */ + if ((tp->t_flags & (TF_REQ_TSTMP|TF_NOOPT)) == TF_REQ_TSTMP && + (origoffer == -1 || + (tp->t_flags & TF_RCVD_TSTMP) == TF_RCVD_TSTMP)) + mss -= TCPOLEN_TSTAMP_APPA; + if ((tp->t_flags & (TF_REQ_CC|TF_NOOPT)) == TF_REQ_CC && + (origoffer == -1 || + (tp->t_flags & TF_RCVD_CC) == TF_RCVD_CC)) + mss -= TCPOLEN_CC_APPA; + +#if (MCLBYTES & (MCLBYTES - 1)) == 0 + if (mss > MCLBYTES) + mss &= ~(MCLBYTES-1); +#else + if (mss > MCLBYTES) + mss = mss / MCLBYTES * MCLBYTES; +#endif + /* + * If there's a pipesize, change the socket buffer + * to that size. Make the socket buffers an integral + * number of mss units; if the mss is larger than + * the socket buffer, decrease the mss. + */ +#ifdef RTV_SPIPE + if ((bufsize = rt->rt_rmx.rmx_sendpipe) == 0) +#endif + bufsize = so->so_snd.sb_hiwat; + if (bufsize < mss) + mss = bufsize; + else { + bufsize = roundup(bufsize, mss); + if (bufsize > sb_max) + bufsize = sb_max; + (void)sbreserve(&so->so_snd, bufsize); + } + tp->t_maxseg = mss; + +#ifdef RTV_RPIPE + if ((bufsize = rt->rt_rmx.rmx_recvpipe) == 0) +#endif + bufsize = so->so_rcv.sb_hiwat; + if (bufsize > mss) { + bufsize = roundup(bufsize, mss); + if (bufsize > sb_max) + bufsize = sb_max; + (void)sbreserve(&so->so_rcv, bufsize); + } + /* + * Don't force slow-start on local network. + */ + if (!in_localaddr(inp->inp_faddr)) + tp->snd_cwnd = mss; + + if (rt->rt_rmx.rmx_ssthresh) { + /* + * There's some sort of gateway or interface + * buffer limit on the path. Use this to set + * the slow start threshhold, but set the + * threshold to no less than 2*mss. + */ + tp->snd_ssthresh = max(2 * mss, rt->rt_rmx.rmx_ssthresh); + tcpstat.tcps_usedssthresh++; + } +} + +/* + * Determine the MSS option to send on an outgoing SYN. + */ +int +tcp_mssopt(tp) + struct tcpcb *tp; +{ + struct rtentry *rt; + + rt = tcp_rtlookup(tp->t_inpcb); + if (rt == NULL) + return tcp_mssdflt; + + return rt->rt_mtu - sizeof(struct tcpiphdr); +} +#endif /* TUBA_INCLUDE */ diff --git a/reactos/drivers/lib/oskittcp/oskittcp/tcp_output.c b/reactos/drivers/lib/oskittcp/oskittcp/tcp_output.c new file mode 100644 index 00000000000..976057494d3 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/tcp_output.c @@ -0,0 +1,823 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcp_output.c 8.3 (Berkeley) 12/30/93 + */ + +#define TCPOUTFLAGS +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/malloc.h> +#include <sys/mbuf.h> +#include <sys/protosw.h> +#include <sys/socket.h> +#include <sys/socketvar.h> +#include <sys/errno.h> +#include <sys/queue.h> + +#include <net/route.h> + +#include <netinet/in.h> +#include <netinet/in_systm.h> +#include <netinet/ip.h> +#include <netinet/in_pcb.h> +#include <netinet/ip_var.h> +#include <netinet/tcp.h> +#include <netinet/tcp_fsm.h> +#include <netinet/tcp_seq.h> +#include <netinet/tcp_timer.h> +#include <netinet/tcp_var.h> +#include <netinet/tcpip.h> +#ifdef TCPDEBUG +#include <netinet/tcp_debug.h> +#endif +#include <oskittcp.h> + +#ifdef notyet +extern struct mbuf *m_copypack(); +#endif + + +/* + * Tcp output routine: figure out what should be sent and send it. + */ +int +tcp_output(tp) + register struct tcpcb *tp; +{ + register struct socket *so = tp->t_inpcb->inp_socket; + register long len, win; + int off, flags, error = EINVAL; + register struct mbuf *m; + register struct tcpiphdr *ti; + u_char opt[TCP_MAXOLEN]; + unsigned optlen, hdrlen; + int idle, sendalot; + struct rmxp_tao *taop; + struct rmxp_tao tao_noncached; + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); + + /* + * Determine length of data that should be transmitted, + * and flags that will be used. + * If there is some data or critical controls (SYN, RST) + * to send, then transmit; otherwise, investigate further. + */ + idle = (tp->snd_max == tp->snd_una); + if (idle && tp->t_idle >= tp->t_rxtcur) + /* + * We have been idle for "a while" and no acks are + * expected to clock out any data we send -- + * slow start to get ack "clock" running again. + */ + tp->snd_cwnd = tp->t_maxseg; +again: + sendalot = 0; + off = tp->snd_nxt - tp->snd_una; + win = min(tp->snd_wnd, tp->snd_cwnd); + + flags = tcp_outflags[tp->t_state]; + /* + * Get standard flags, and add SYN or FIN if requested by 'hidden' + * state flags. + */ + if (tp->t_flags & TF_NEEDFIN) + flags |= TH_FIN; + if (tp->t_flags & TF_NEEDSYN) + flags |= TH_SYN; + + /* + * If in persist timeout with window of 0, send 1 byte. + * Otherwise, if window is small but nonzero + * and timer expired, we will send what we can + * and go to transmit state. + */ + if (tp->t_force) { + if (win == 0) { + /* + * If we still have some data to send, then + * clear the FIN bit. Usually this would + * happen below when it realizes that we + * aren't sending all the data. However, + * if we have exactly 1 byte of unset data, + * then it won't clear the FIN bit below, + * and if we are in persist state, we wind + * up sending the packet without recording + * that we sent the FIN bit. + * + * We can't just blindly clear the FIN bit, + * because if we don't have any more data + * to send then the probe will be the FIN + * itself. + */ + if (off < so->so_snd.sb_cc) + flags &= ~TH_FIN; + win = 1; + } else { + tp->t_timer[TCPT_PERSIST] = 0; + tp->t_rxtshift = 0; + } + } + + len = min(so->so_snd.sb_cc, win) - off; + + if ((taop = tcp_gettaocache(tp->t_inpcb)) == NULL) { + taop = &tao_noncached; + bzero(taop, sizeof(*taop)); + } + + /* + * Lop off SYN bit if it has already been sent. However, if this + * is SYN-SENT state and if segment contains data and if we don't + * know that foreign host supports TAO, suppress sending segment. + */ + if ((flags & TH_SYN) && SEQ_GT(tp->snd_nxt, tp->snd_una)) { + flags &= ~TH_SYN; + off--, len++; + if (len > 0 && tp->t_state == TCPS_SYN_SENT && + taop->tao_ccsent == 0) + return 0; + } + + /* + * Be careful not to send data and/or FIN on SYN segments + * in cases when no CC option will be sent. + * This measure is needed to prevent interoperability problems + * with not fully conformant TCP implementations. + */ + if ((flags & TH_SYN) && + ((tp->t_flags & TF_NOOPT) || !(tp->t_flags & TF_REQ_CC) || + ((flags & TH_ACK) && !(tp->t_flags & TF_RCVD_CC)))) { + len = 0; + flags &= ~TH_FIN; + } + + if (len < 0) { + /* + * If FIN has been sent but not acked, + * but we haven't been called to retransmit, + * len will be -1. Otherwise, window shrank + * after we sent into it. If window shrank to 0, + * cancel pending retransmit, pull snd_nxt back + * to (closed) window, and set the persist timer + * if it isn't already going. If the window didn't + * close completely, just wait for an ACK. + */ + len = 0; + if (win == 0) { + tp->t_timer[TCPT_REXMT] = 0; + tp->t_rxtshift = 0; + tp->snd_nxt = tp->snd_una; + if (tp->t_timer[TCPT_PERSIST] == 0) + tcp_setpersist(tp); + } + } + if (len > tp->t_maxseg) { + len = tp->t_maxseg; + sendalot = 1; + } + if (SEQ_LT(tp->snd_nxt + len, tp->snd_una + so->so_snd.sb_cc)) + flags &= ~TH_FIN; + + win = sbspace(&so->so_rcv); + + /* + * Sender silly window avoidance. If connection is idle + * and can send all data, a maximum segment, + * at least a maximum default-size segment do it, + * or are forced, do it; otherwise don't bother. + * If peer's buffer is tiny, then send + * when window is at least half open. + * If retransmitting (possibly after persist timer forced us + * to send into a small window), then must resend. + */ + if (len) { + if (len == tp->t_maxseg) + goto send; + if ((idle || tp->t_flags & TF_NODELAY) && + (tp->t_flags & TF_NOPUSH) == 0 && + len + off >= so->so_snd.sb_cc) + goto send; + if (tp->t_force) + goto send; + if (len >= tp->max_sndwnd / 2 && tp->max_sndwnd > 0) + goto send; + if (SEQ_LT(tp->snd_nxt, tp->snd_max)) + goto send; + } + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); + + /* + * Compare available window to amount of window + * known to peer (as advertised window less + * next expected input). If the difference is at least two + * max size segments, or at least 50% of the maximum possible + * window, then want to send a window update to peer. + */ + if (win > 0) { + /* + * "adv" is the amount we can increase the window, + * taking into account that we are limited by + * TCP_MAXWIN << tp->rcv_scale. + */ + long adv = min(win, (long)TCP_MAXWIN << tp->rcv_scale) - + (tp->rcv_adv - tp->rcv_nxt); + + if (adv >= (long) (2 * tp->t_maxseg)) + goto send; + if (2 * adv >= (long) so->so_rcv.sb_hiwat) + goto send; + } + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); + + /* + * Send if we owe peer an ACK. + */ + if (tp->t_flags & TF_ACKNOW) + goto send; + if ((flags & TH_RST) || + ((flags & TH_SYN) && (tp->t_flags & TF_NEEDSYN) == 0)) + goto send; + if (SEQ_GT(tp->snd_up, tp->snd_una)) + goto send; + /* + * If our state indicates that FIN should be sent + * and we have not yet done so, or we're retransmitting the FIN, + * then we need to send. + */ + if (flags & TH_FIN && + ((tp->t_flags & TF_SENTFIN) == 0 || tp->snd_nxt == tp->snd_una)) + goto send; + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); + + /* + * TCP window updates are not reliable, rather a polling protocol + * using ``persist'' packets is used to insure receipt of window + * updates. The three ``states'' for the output side are: + * idle not doing retransmits or persists + * persisting to move a small or zero window + * (re)transmitting and thereby not persisting + * + * tp->t_timer[TCPT_PERSIST] + * is set when we are in persist state. + * tp->t_force + * is set when we are called to send a persist packet. + * tp->t_timer[TCPT_REXMT] + * is set when we are retransmitting + * The output side is idle when both timers are zero. + * + * If send window is too small, there is data to transmit, and no + * retransmit or persist is pending, then go to persist state. + * If nothing happens soon, send when timer expires: + * if window is nonzero, transmit what we can, + * otherwise force out a byte. + */ + if (so->so_snd.sb_cc && tp->t_timer[TCPT_REXMT] == 0 && + tp->t_timer[TCPT_PERSIST] == 0) { + tp->t_rxtshift = 0; + tcp_setpersist(tp); + } + + /* + * No reason to send a segment, just return. + */ + /*return (0);*/ + +send: + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); + + /* + * Before ESTABLISHED, force sending of initial options + * unless TCP set not to do any options. + * NOTE: we assume that the IP/TCP header plus TCP options + * always fit in a single mbuf, leaving room for a maximum + * link header, i.e. + * max_linkhdr + sizeof (struct tcpiphdr) + optlen <= MHLEN + */ + optlen = 0; + hdrlen = sizeof (struct tcpiphdr); + if (flags & TH_SYN) { + tp->snd_nxt = tp->iss; + if ((tp->t_flags & TF_NOOPT) == 0) { + u_short mss; + + opt[0] = TCPOPT_MAXSEG; + opt[1] = TCPOLEN_MAXSEG; + mss = htons((u_short) tcp_mssopt(tp)); + (void)memcpy(opt + 2, &mss, sizeof(mss)); + optlen = TCPOLEN_MAXSEG; + + if ((tp->t_flags & TF_REQ_SCALE) && + ((flags & TH_ACK) == 0 || + (tp->t_flags & TF_RCVD_SCALE))) { + *((u_long *) (opt + optlen)) = htonl( + TCPOPT_NOP << 24 | + TCPOPT_WINDOW << 16 | + TCPOLEN_WINDOW << 8 | + tp->request_r_scale); + optlen += 4; + } + } + } + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); + + /* + * Send a timestamp and echo-reply if this is a SYN and our side + * wants to use timestamps (TF_REQ_TSTMP is set) or both our side + * and our peer have sent timestamps in our SYN's. + */ + if ((tp->t_flags & (TF_REQ_TSTMP|TF_NOOPT)) == TF_REQ_TSTMP && + (flags & TH_RST) == 0 && + ((flags & TH_ACK) == 0 || + (tp->t_flags & TF_RCVD_TSTMP))) { + u_long *lp = (u_long *)(opt + optlen); + + /* Form timestamp option as shown in appendix A of RFC 1323. */ + *lp++ = htonl(TCPOPT_TSTAMP_HDR); + *lp++ = htonl(tcp_now); + *lp = htonl(tp->ts_recent); + optlen += TCPOLEN_TSTAMP_APPA; + } + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); + + /* + * Send `CC-family' options if our side wants to use them (TF_REQ_CC), + * options are allowed (!TF_NOOPT) and it's not a RST. + */ + if ((tp->t_flags & (TF_REQ_CC|TF_NOOPT)) == TF_REQ_CC && + (flags & TH_RST) == 0) { + switch (flags & (TH_SYN|TH_ACK)) { + /* + * This is a normal ACK, send CC if we received CC before + * from our peer. + */ + case TH_ACK: + if (!(tp->t_flags & TF_RCVD_CC)) + break; + /*FALLTHROUGH*/ + + /* + * We can only get here in T/TCP's SYN_SENT* state, when + * we're a sending a non-SYN segment without waiting for + * the ACK of our SYN. A check above assures that we only + * do this if our peer understands T/TCP. + */ + case 0: + opt[optlen++] = TCPOPT_NOP; + opt[optlen++] = TCPOPT_NOP; + opt[optlen++] = TCPOPT_CC; + opt[optlen++] = TCPOLEN_CC; + *(u_int32_t *)&opt[optlen] = htonl(tp->cc_send); + + optlen += 4; + break; + + /* + * This is our initial SYN, check whether we have to use + * CC or CC.new. + */ + case TH_SYN: +#if 0 + opt[optlen++] = TCPOPT_NOP; + opt[optlen++] = TCPOPT_NOP; + opt[optlen++] = tp->t_flags & TF_SENDCCNEW ? + TCPOPT_CCNEW : TCPOPT_CC; + opt[optlen++] = TCPOLEN_CC; + *(u_int32_t *)&opt[optlen] = htonl(tp->cc_send); + optlen += 4; +#endif + break; + + /* + * This is a SYN,ACK; send CC and CC.echo if we received + * CC from our peer. + */ + case (TH_SYN|TH_ACK): + if (tp->t_flags & TF_RCVD_CC) { + opt[optlen++] = TCPOPT_NOP; + opt[optlen++] = TCPOPT_NOP; + opt[optlen++] = TCPOPT_CC; + opt[optlen++] = TCPOLEN_CC; + *(u_int32_t *)&opt[optlen] = + htonl(tp->cc_send); + optlen += 4; + opt[optlen++] = TCPOPT_NOP; + opt[optlen++] = TCPOPT_NOP; + opt[optlen++] = TCPOPT_CCECHO; + opt[optlen++] = TCPOLEN_CC; + *(u_int32_t *)&opt[optlen] = + htonl(tp->cc_recv); + optlen += 4; + } + break; + } + } + + hdrlen += optlen; + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); + + /* + * Adjust data length if insertion of options will + * bump the packet length beyond the t_maxopd length. + * Clear the FIN bit because we cut off the tail of + * the segment. + */ + if (len + optlen > tp->t_maxopd) { + /* + * If there is still more to send, don't close the connection. + */ + flags &= ~TH_FIN; + len = tp->t_maxopd - optlen; + sendalot = 1; + } + +/*#ifdef DIAGNOSTIC*/ + if (max_linkhdr + hdrlen > MHLEN) + panic("tcphdr too big"); +/*#endif*/ + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); + + /* + * Grab a header mbuf, attaching a copy of data to + * be transmitted, and initialize the header from + * the template for sends on this connection. + */ + if (len) { + if (tp->t_force && len == 1) + tcpstat.tcps_sndprobe++; + else if (SEQ_LT(tp->snd_nxt, tp->snd_max)) { + tcpstat.tcps_sndrexmitpack++; + tcpstat.tcps_sndrexmitbyte += len; + } else { + tcpstat.tcps_sndpack++; + tcpstat.tcps_sndbyte += len; + } +#ifdef notyet + if ((m = m_copypack(so->so_snd.sb_mb, off, + (int)len, max_linkhdr + hdrlen)) == 0) { + error = ENOBUFS; + goto out; + } + /* + * m_copypack left space for our hdr; use it. + */ + m->m_len += hdrlen; + m->m_data -= hdrlen; +#else + MGETHDR(m, M_DONTWAIT, MT_HEADER); + if (m == NULL) { + error = ENOBUFS; + goto out; + } + m->m_data += max_linkhdr; + m->m_len = hdrlen; + if (len <= MHLEN - hdrlen - max_linkhdr) { + m_copydata(so->so_snd.sb_mb, off, (int) len, + mtod(m, caddr_t) + hdrlen); + m->m_len += len; + } else { + m->m_next = m_copy(so->so_snd.sb_mb, off, (int) len); + if (m->m_next == 0) { + (void) m_free(m); + error = ENOBUFS; + goto out; + } + } +#endif + /* + * If we're sending everything we've got, set PUSH. + * (This will keep happy those implementations which only + * give data to the user when a buffer fills or + * a PUSH comes in.) + */ + if (off + len == so->so_snd.sb_cc) + flags |= TH_PUSH; + } else { + if (tp->t_flags & TF_ACKNOW) + tcpstat.tcps_sndacks++; + else if (flags & (TH_SYN|TH_FIN|TH_RST)) + tcpstat.tcps_sndctrl++; + else if (SEQ_GT(tp->snd_up, tp->snd_una)) + tcpstat.tcps_sndurg++; + else + tcpstat.tcps_sndwinup++; + + MGETHDR(m, M_DONTWAIT, MT_HEADER); + if (m == NULL) { + error = ENOBUFS; + goto out; + } + m->m_data += max_linkhdr; + m->m_len = hdrlen; + } + + m->m_pkthdr.rcvif = (struct ifnet *)0; + ti = mtod(m, struct tcpiphdr *); + if (tp->t_template == 0) + panic("tcp_output"); + (void)memcpy(ti, tp->t_template, sizeof (struct tcpiphdr)); + + /* + * Fill in fields, remembering maximum advertised + * window for use in delaying messages about window sizes. + * If resending a FIN, be sure not to use a new sequence number. + */ + + if (flags & TH_FIN && tp->t_flags & TF_SENTFIN && + tp->snd_nxt == tp->snd_max) + tp->snd_nxt--; + + /* + * If we are doing retransmissions, then snd_nxt will + * not reflect the first unsent octet. For ACK only + * packets, we do not want the sequence number of the + * retransmitted packet, we want the sequence number + * of the next unsent octet. So, if there is no data + * (and no SYN or FIN), use snd_max instead of snd_nxt + * when filling in ti_seq. But if we are in persist + * state, snd_max might reflect one byte beyond the + * right edge of the window, so use snd_nxt in that + * case, since we know we aren't doing a retransmission. + * (retransmit and persist are mutually exclusive...) + */ + if (len || (flags & (TH_SYN|TH_FIN)) || tp->t_timer[TCPT_PERSIST]) + ti->ti_seq = htonl(tp->snd_nxt); + else + ti->ti_seq = htonl(tp->snd_max); + + ti->ti_ack = htonl(tp->rcv_nxt); + + if (optlen) { + (void)memcpy(ti + 1, opt, optlen); + ti->ti_off = (sizeof (struct tcphdr) + optlen) >> 2; + } + + ti->ti_flags = flags; + + /* + * Calculate receive window. Don't shrink window, + * but avoid silly window syndrome. + */ + if (win < (long)(so->so_rcv.sb_hiwat / 4) && win < (long)tp->t_maxseg) + win = 0; + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); + + if (win > (long)TCP_MAXWIN << tp->rcv_scale) + win = (long)TCP_MAXWIN << tp->rcv_scale; + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); + + if (win < (long)(tp->rcv_adv - tp->rcv_nxt)) + win = (long)(tp->rcv_adv - tp->rcv_nxt); + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); + + ti->ti_win = htons((u_short) (win>>tp->rcv_scale)); + if (SEQ_GT(tp->snd_up, tp->snd_nxt)) { + ti->ti_urp = htons((u_short)(tp->snd_up - tp->snd_nxt)); + ti->ti_flags |= TH_URG; + } else + /* + * If no urgent pointer to send, then we pull + * the urgent pointer to the left edge of the send window + * so that it doesn't drift into the send window on sequence + * number wraparound. + */ + tp->snd_up = tp->snd_una; /* drag it along */ + + /* + * Put TCP length in extended header, and then + * checksum extended header and data. + */ + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); + + if (len + optlen) { + ti->ti_src.s_addr = tp->t_inpcb->inp_laddr.s_addr; + ti->ti_dst.s_addr = tp->t_inpcb->inp_faddr.s_addr; + ti->ti_pr = 6; + ti->ti_len = htons((u_short)(sizeof (struct tcphdr) + + optlen + len)); + } + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); + + ti->ti_sum = in_cksum(m, (int)(hdrlen + len)); + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); + + /* + * In transmit state, time the transmission and arrange for + * the retransmit. In persist state, just set snd_max. + */ + if (tp->t_force == 0 || tp->t_timer[TCPT_PERSIST] == 0) { + tcp_seq startseq = tp->snd_nxt; + + /* + * Advance snd_nxt over sequence space of this segment. + */ + if (flags & (TH_SYN|TH_FIN)) { + if (flags & TH_SYN) + tp->snd_nxt++; + if (flags & TH_FIN) { + tp->snd_nxt++; + tp->t_flags |= TF_SENTFIN; + } + } + tp->snd_nxt += len; + if (SEQ_GT(tp->snd_nxt, tp->snd_max)) { + tp->snd_max = tp->snd_nxt; + /* + * Time this transmission if not a retransmission and + * not currently timing anything. + */ + if (tp->t_rtt == 0) { + tp->t_rtt = 1; + tp->t_rtseq = startseq; + tcpstat.tcps_segstimed++; + } + } + + /* + * Set retransmit timer if not currently set, + * and not doing an ack or a keep-alive probe. + * Initial value for retransmit timer is smoothed + * round-trip time + 2 * round-trip time variance. + * Initialize shift counter which is used for backoff + * of retransmit time. + */ + if (tp->t_timer[TCPT_REXMT] == 0 && + tp->snd_nxt != tp->snd_una) { + tp->t_timer[TCPT_REXMT] = tp->t_rxtcur; + if (tp->t_timer[TCPT_PERSIST]) { + tp->t_timer[TCPT_PERSIST] = 0; + tp->t_rxtshift = 0; + } + } + } else + if (SEQ_GT(tp->snd_nxt + len, tp->snd_max)) + tp->snd_max = tp->snd_nxt + len; + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); + +#ifdef TCPDEBUG + /* + * Trace. + */ + if (so->so_options & SO_DEBUG) + tcp_trace(TA_OUTPUT, tp->t_state, tp, ti, 0); +#endif + + /* + * Fill in IP length and desired time to live and + * send to IP level. There should be a better way + * to handle ttl and tos; we could keep them in + * the template, but need a way to checksum without them. + */ + m->m_pkthdr.len = hdrlen + len; +#ifdef TUBA + if (tp->t_tuba_pcb) + error = tuba_output(m, tp); + else +#endif + { +#if 1 + struct rtentry *rt; +#endif + ((struct ip *)ti)->ip_len = m->m_pkthdr.len; + ((struct ip *)ti)->ip_ttl = tp->t_inpcb->inp_ip.ip_ttl; /* XXX */ + ((struct ip *)ti)->ip_tos = tp->t_inpcb->inp_ip.ip_tos; /* XXX */ +#if 1 + /* + * See if we should do MTU discovery. We do it only if the following + * are true: + * 1) we have a valid route to the destination + * 2) the MTU is not locked (if it is, then discovery has been + * disabled) + */ + if ((rt = &tp->t_inpcb->inp_route.ro_rt) + && rt->rt_flags & RTF_UP + && !(rt->rt_rmx.rmx_locks & RTV_MTU)) { + ((struct ip *)ti)->ip_off |= IP_DF; + } +#endif + + OS_DbgPrint(OSK_MID_TRACE, + ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); + + error = ip_output(so, m, tp->t_inpcb->inp_options, &tp->t_inpcb->inp_route, + so->so_options & SO_DONTROUTE, 0); + } + if (error) { +out: + if (error == ENOBUFS) { + tcp_quench(tp->t_inpcb, 0); + return (0); + } +#if 1 + if (error == EMSGSIZE) { + /* + * ip_output() will have already fixed the route + * for us. tcp_mtudisc() will, as its last action, + * initiate retransmission, so it is important to + * not do so here. + */ + tcp_mtudisc(tp->t_inpcb, 0); + return 0; + } +#endif + if ((error == EHOSTUNREACH || error == ENETDOWN) + && TCPS_HAVERCVDSYN(tp->t_state)) { + tp->t_softerror = error; + return (0); + } + return (error); + } + tcpstat.tcps_sndtotal++; + + /* + * Data sent (as far as we can tell). + * If this advertises a larger window than any other segment, + * then remember the size of the advertised window. + * Any pending ACK has now been sent. + */ + if (win > 0 && SEQ_GT(tp->rcv_nxt+win, tp->rcv_adv)) + tp->rcv_adv = tp->rcv_nxt + win; + tp->last_ack_sent = tp->rcv_nxt; + tp->t_flags &= ~(TF_ACKNOW|TF_DELACK); + if (sendalot) + goto again; + return (0); +} + +void +tcp_setpersist(tp) + register struct tcpcb *tp; +{ + register t = ((tp->t_srtt >> 2) + tp->t_rttvar) >> 1; + + if (tp->t_timer[TCPT_REXMT]) + panic("tcp_output REXMT"); + /* + * Start/restart persistance timer. + */ + TCPT_RANGESET(tp->t_timer[TCPT_PERSIST], + t * tcp_backoff[tp->t_rxtshift], + TCPTV_PERSMIN, TCPTV_PERSMAX); + if (tp->t_rxtshift < TCP_MAXRXTSHIFT) + tp->t_rxtshift++; +} diff --git a/reactos/drivers/lib/oskittcp/oskittcp/tcp_subr.c b/reactos/drivers/lib/oskittcp/oskittcp/tcp_subr.c new file mode 100644 index 00000000000..b67a1e91db5 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/tcp_subr.c @@ -0,0 +1,610 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcp_subr.c 8.1 (Berkeley) 6/10/93 + */ + +#include <sys/param.h> +#include <sys/proc.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/malloc.h> +#include <sys/mbuf.h> +#include <sys/socket.h> +#include <sys/socketvar.h> +#include <sys/protosw.h> +#include <sys/errno.h> +#include <sys/queue.h> + +#include <net/route.h> +#include <net/if.h> + +#include <netinet/in.h> +#include <netinet/in_systm.h> +#include <netinet/ip.h> +#include <netinet/in_pcb.h> +#include <netinet/in_var.h> +#include <netinet/ip_var.h> +#include <netinet/ip_icmp.h> +#include <netinet/tcp.h> +#include <netinet/tcp_fsm.h> +#include <netinet/tcp_seq.h> +#include <netinet/tcp_timer.h> +#include <netinet/tcp_var.h> +#include <netinet/tcpip.h> +#ifdef TCPDEBUG +#include <netinet/tcp_debug.h> +#endif + +/* patchable/settable parameters for tcp */ +int tcp_mssdflt = TCP_MSS; +int tcp_rttdflt = TCPTV_SRTTDFLT / PR_SLOWHZ; +int tcp_do_rfc1323 = 1; +int tcp_do_rfc1644 = 1; +static void tcp_cleartaocache(void); + +/* + * Target size of TCP PCB hash table. Will be rounded down to a prime + * number. + */ +#ifndef TCBHASHSIZE +#define TCBHASHSIZE 128 +#endif + +/* + * Tcp initialization + */ +void +tcp_init() +{ + + tcp_iss = boottime.tv_sec; /* wrong */ + tcp_ccgen = 1; + tcp_cleartaocache(); + LIST_INIT(&tcb); + tcbinfo.listhead = &tcb; + tcbinfo.hashbase = phashinit(TCBHASHSIZE, M_PCB, &tcbinfo.hashsize); + if (max_protohdr < sizeof(struct tcpiphdr)) + max_protohdr = sizeof(struct tcpiphdr); + if (max_linkhdr + sizeof(struct tcpiphdr) > MHLEN) + panic("tcp_init"); +} + +/* + * Create template to be used to send tcp packets on a connection. + * Call after host entry created, allocates an mbuf and fills + * in a skeletal tcp/ip header, minimizing the amount of work + * necessary when the connection is used. + */ +struct tcpiphdr * +tcp_template(tp) + struct tcpcb *tp; +{ + register struct inpcb *inp = tp->t_inpcb; + register struct mbuf *m; + register struct tcpiphdr *n; + + if ((n = tp->t_template) == 0) { + m = m_get(M_DONTWAIT, MT_HEADER); + OS_DbgPrint(OSK_MID_TRACE,("Allocated template mbuf at %x\n", m)); + if (m == NULL) + return (0); + m->m_len = sizeof (struct tcpiphdr); + n = mtod(m, struct tcpiphdr *); + } + n->ti_next = n->ti_prev = 0; + n->ti_x1 = 0; + n->ti_pr = IPPROTO_TCP; + n->ti_len = htons(sizeof (struct tcpiphdr) - sizeof (struct ip)); + n->ti_src = inp->inp_laddr; + n->ti_dst = inp->inp_faddr; + n->ti_sport = inp->inp_lport; + n->ti_dport = inp->inp_fport; + n->ti_seq = 0; + n->ti_ack = 0; + n->ti_x2 = 0; + n->ti_off = 5; + n->ti_flags = 0; + n->ti_win = 0; + n->ti_sum = 0; + n->ti_urp = 0; + return (n); +} + +/* + * Send a single message to the TCP at address specified by + * the given TCP/IP header. If m == 0, then we make a copy + * of the tcpiphdr at ti and send directly to the addressed host. + * This is used to force keep alive messages out using the TCP + * template for a connection tp->t_template. If flags are given + * then we send a message back to the TCP which originated the + * segment ti, and discard the mbuf containing it and any other + * attached mbufs. + * + * In any case the ack and sequence number of the transmitted + * segment are as specified by the parameters. + */ +void +tcp_respond(tp, ti, m, ack, seq, flags) + struct tcpcb *tp; + register struct tcpiphdr *ti; + register struct mbuf *m; + tcp_seq ack, seq; + int flags; +{ + register int tlen; + int win = 0; + struct route *ro = 0; + + if (tp) { + win = sbspace(&tp->t_inpcb->inp_socket->so_rcv); + ro = &tp->t_inpcb->inp_route; + } + if (m == 0) { + m = m_gethdr(M_DONTWAIT, MT_HEADER); + if (m == NULL) + return; +#ifdef TCP_COMPAT_42 + tlen = 1; +#else + tlen = 0; +#endif + m->m_data += max_linkhdr; + *mtod(m, struct tcpiphdr *) = *ti; + ti = mtod(m, struct tcpiphdr *); + flags = TH_ACK; + } else { + m_freem(m->m_next); + m->m_next = 0; + m->m_data = (caddr_t)ti; + m->m_len = sizeof (struct tcpiphdr); + tlen = 0; +#define xchg(a,b,type) { type t; t=a; a=b; b=t; } + xchg(ti->ti_dst.s_addr, ti->ti_src.s_addr, u_long); + xchg(ti->ti_dport, ti->ti_sport, u_short); +#undef xchg + } + ti->ti_len = htons((u_short)(sizeof (struct tcphdr) + tlen)); + tlen += sizeof (struct tcpiphdr); + m->m_len = tlen; + m->m_pkthdr.len = tlen; + m->m_pkthdr.rcvif = (struct ifnet *) 0; + ti->ti_next = ti->ti_prev = 0; + ti->ti_x1 = 0; + ti->ti_seq = htonl(seq); + ti->ti_ack = htonl(ack); + ti->ti_x2 = 0; + ti->ti_off = sizeof (struct tcphdr) >> 2; + ti->ti_flags = flags; + if (tp) + ti->ti_win = htons((u_short) (win >> tp->rcv_scale)); + else + ti->ti_win = htons((u_short)win); + ti->ti_urp = 0; + ti->ti_sum = 0; + ti->ti_sum = in_cksum(m, tlen); + ((struct ip *)ti)->ip_len = tlen; + ((struct ip *)ti)->ip_ttl = ip_defttl; +#ifdef TCPDEBUG + if (tp == NULL || (tp->t_inpcb->inp_socket->so_options & SO_DEBUG)) + tcp_trace(TA_OUTPUT, 0, tp, ti, 0); +#endif + (void) ip_output(0, m, NULL, ro, 0, NULL); +} + +/* + * Create a new TCP control block, making an + * empty reassembly queue and hooking it to the argument + * protocol control block. + */ +struct tcpcb * +tcp_newtcpcb(inp) + struct inpcb *inp; +{ + register struct tcpcb *tp; + + tp = malloc(sizeof(*tp), M_PCB, M_NOWAIT); + if (tp == NULL) + return ((struct tcpcb *)0); + bzero((char *) tp, sizeof(struct tcpcb)); + tp->seg_next = tp->seg_prev = (struct tcpiphdr *)tp; + tp->t_maxseg = tp->t_maxopd = tcp_mssdflt; + + if (tcp_do_rfc1323) + tp->t_flags = (TF_REQ_SCALE|TF_REQ_TSTMP); + if (tcp_do_rfc1644) + tp->t_flags |= TF_REQ_CC; + tp->t_inpcb = inp; + /* + * Init srtt to TCPTV_SRTTBASE (0), so we can tell that we have no + * rtt estimate. Set rttvar so that srtt + 2 * rttvar gives + * reasonable initial retransmit time. + */ + tp->t_srtt = TCPTV_SRTTBASE; + tp->t_rttvar = tcp_rttdflt * PR_SLOWHZ << 2; + tp->t_rttmin = TCPTV_MIN; + TCPT_RANGESET(tp->t_rxtcur, + ((TCPTV_SRTTBASE >> 2) + (TCPTV_SRTTDFLT << 2)) >> 1, + TCPTV_MIN, TCPTV_REXMTMAX); + tp->snd_cwnd = TCP_MAXWIN << TCP_MAX_WINSHIFT; + tp->snd_ssthresh = TCP_MAXWIN << TCP_MAX_WINSHIFT; + inp->inp_ip.ip_ttl = ip_defttl; + inp->inp_ppcb = (caddr_t)tp; + return (tp); +} + +/* + * Drop a TCP connection, reporting + * the specified error. If connection is synchronized, + * then send a RST to peer. + */ +struct tcpcb * +tcp_drop(tp, errno) + register struct tcpcb *tp; + int errno; +{ + struct socket *so = tp->t_inpcb->inp_socket; + + if (TCPS_HAVERCVDSYN(tp->t_state)) { + tp->t_state = TCPS_CLOSED; + (void) tcp_output(tp); + tcpstat.tcps_drops++; + } else + tcpstat.tcps_conndrops++; + if (errno == ETIMEDOUT && tp->t_softerror) + errno = tp->t_softerror; + so->so_error = errno; + return (tcp_close(tp)); +} + +/* + * Close a TCP control block: + * discard all space held by the tcp + * discard internet protocol block + * wake up any sleepers + */ +struct tcpcb * +tcp_close(tp) + register struct tcpcb *tp; +{ + register struct tcpiphdr *t; + struct inpcb *inp = tp->t_inpcb; + struct socket *so = inp->inp_socket; + register struct mbuf *m; +#ifdef RTV_RTT + register struct rtentry *rt; + + /* + * If we got enough samples through the srtt filter, + * save the rtt and rttvar in the routing entry. + * 'Enough' is arbitrarily defined as the 16 samples. + * 16 samples is enough for the srtt filter to converge + * to within 5% of the correct value; fewer samples and + * we could save a very bogus rtt. + * + * Don't update the default route's characteristics and don't + * update anything that the user "locked". + */ + if (tp->t_rttupdated >= 16 && (rt = &inp->inp_route.ro_rt)) { + register u_long i = 0; + + if ((rt->rt_rmx.rmx_locks & RTV_RTT) == 0) { + i = tp->t_srtt * + (RTM_RTTUNIT / (PR_SLOWHZ * TCP_RTT_SCALE)); + if (rt->rt_rmx.rmx_rtt && i) + /* + * filter this update to half the old & half + * the new values, converting scale. + * See route.h and tcp_var.h for a + * description of the scaling constants. + */ + rt->rt_rmx.rmx_rtt = + (rt->rt_rmx.rmx_rtt + i) / 2; + else + rt->rt_rmx.rmx_rtt = i; + tcpstat.tcps_cachedrtt++; + } + if ((rt->rt_rmx.rmx_locks & RTV_RTTVAR) == 0) { + i = tp->t_rttvar * + (RTM_RTTUNIT / (PR_SLOWHZ * TCP_RTTVAR_SCALE)); + if (rt->rt_rmx.rmx_rttvar && i) + rt->rt_rmx.rmx_rttvar = + (rt->rt_rmx.rmx_rttvar + i) / 2; + else + rt->rt_rmx.rmx_rttvar = i; + tcpstat.tcps_cachedrttvar++; + } + /* + * update the pipelimit (ssthresh) if it has been updated + * already or if a pipesize was specified & the threshhold + * got below half the pipesize. I.e., wait for bad news + * before we start updating, then update on both good + * and bad news. + */ + if (((rt->rt_rmx.rmx_locks & RTV_SSTHRESH) == 0 && + ((i = tp->snd_ssthresh) != 0) && rt->rt_rmx.rmx_ssthresh) || + i < (rt->rt_rmx.rmx_sendpipe / 2)) { + /* + * convert the limit from user data bytes to + * packets then to packet data bytes. + */ + i = (i + tp->t_maxseg / 2) / tp->t_maxseg; + if (i < 2) + i = 2; + i *= (u_long)(tp->t_maxseg + sizeof (struct tcpiphdr)); + if (rt->rt_rmx.rmx_ssthresh) + rt->rt_rmx.rmx_ssthresh = + (rt->rt_rmx.rmx_ssthresh + i) / 2; + else + rt->rt_rmx.rmx_ssthresh = i; + tcpstat.tcps_cachedssthresh++; + } + } +#endif /* RTV_RTT */ + /* free the reassembly queue, if any */ + t = tp->seg_next; + while (t != (struct tcpiphdr *)tp) { + t = (struct tcpiphdr *)t->ti_next; + m = REASS_MBUF((struct tcpiphdr *)t->ti_prev); + remque(t->ti_prev); + m_freem(m); + } + if (tp->t_template) { + (void) m_free(dtom(tp->t_template)); + OS_DbgPrint(OSK_MID_TRACE,("Freeing template mbuf at %x\n", + tp->t_template)); + tp->t_template = 0; + } + free(tp, M_PCB); + inp->inp_ppcb = 0; + soisdisconnected(so); + in_pcbdetach(inp); + tcpstat.tcps_closed++; + return ((struct tcpcb *)0); +} + +void +tcp_drain() +{ + +} + +/* + * Notify a tcp user of an asynchronous error; + * store error as soft error, but wake up user + * (for now, won't do anything until can select for soft error). + */ +void +tcp_notify(inp, error) + struct inpcb *inp; + int error; +{ + register struct tcpcb *tp = (struct tcpcb *)inp->inp_ppcb; + register struct socket *so = inp->inp_socket; + + /* + * Ignore some errors if we are hooked up. + * If connection hasn't completed, has retransmitted several times, + * and receives a second error, give up now. This is better + * than waiting a long time to establish a connection that + * can never complete. + */ + if (tp->t_state == TCPS_ESTABLISHED && + (error == EHOSTUNREACH || error == ENETUNREACH || + error == EHOSTDOWN)) { + return; + } else if (tp->t_state < TCPS_ESTABLISHED && tp->t_rxtshift > 3 && + tp->t_softerror) + so->so_error = error; + else + tp->t_softerror = error; + wakeup((caddr_t) &so->so_timeo); + sorwakeup(so); + sowwakeup(so); +} + +void +tcp_ctlinput(cmd, sa, ip) + int cmd; + struct sockaddr *sa; + register struct ip *ip; +{ + register struct tcphdr *th; + void (*notify) __P((struct inpcb *, int)) = tcp_notify; + + if (cmd == PRC_QUENCH) + notify = tcp_quench; +#if 1 + else if (cmd == PRC_MSGSIZE) + notify = tcp_mtudisc; +#endif + else if (!PRC_IS_REDIRECT(cmd) && + ((unsigned)cmd > PRC_NCMDS || inetctlerrmap[cmd] == 0)) + return; + if (ip) { + th = (struct tcphdr *)((caddr_t)ip + (ip->ip_hl << 2)); + in_pcbnotify(&tcb, sa, th->th_dport, ip->ip_src, th->th_sport, + cmd, notify); + } else + in_pcbnotify(&tcb, sa, 0, zeroin_addr, 0, cmd, notify); +} + +/* + * When a source quench is received, close congestion window + * to one segment. We will gradually open it again as we proceed. + */ +void +tcp_quench(inp, errno) + struct inpcb *inp; + int errno; +{ + struct tcpcb *tp = intotcpcb(inp); + + if (tp) + tp->snd_cwnd = tp->t_maxseg; +} + +#if 1 +/* + * When `need fragmentation' ICMP is received, update our idea of the MSS + * based on the new value in the route. Also nudge TCP to send something, + * since we know the packet we just sent was dropped. + * This duplicates some code in the tcp_mss() function in tcp_input.c. + */ +void +tcp_mtudisc(inp, errno) + struct inpcb *inp; + int errno; +{ + struct tcpcb *tp = intotcpcb(inp); + struct rtentry *rt; + struct rmxp_tao *taop; + struct socket *so = inp->inp_socket; + int offered; + int mss; + + if (tp) { + rt = tcp_rtlookup(inp); + if (!rt || !rt->rt_rmx.rmx_mtu) { + tp->t_maxopd = tp->t_maxseg = tcp_mssdflt; + return; + } + taop = rmx_taop(rt->rt_rmx); + offered = taop->tao_mssopt; + mss = rt->rt_rmx.rmx_mtu - sizeof(struct tcpiphdr); + if (offered) + mss = min(mss, offered); + /* + * XXX - The above conditional probably violates the TCP + * spec. The problem is that, since we don't know the + * other end's MSS, we are supposed to use a conservative + * default. But, if we do that, then MTU discovery will + * never actually take place, because the conservative + * default is much less than the MTUs typically seen + * on the Internet today. For the moment, we'll sweep + * this under the carpet. + * + * The conservative default might not actually be a problem + * if the only case this occurs is when sending an initial + * SYN with options and data to a host we've never talked + * to before. Then, they will reply with an MSS value which + * will get recorded and the new parameters should get + * recomputed. For Further Study. + */ + if (tp->t_maxopd <= mss) + return; + tp->t_maxopd = mss; + + if ((tp->t_flags & (TF_REQ_TSTMP|TF_NOOPT)) == TF_REQ_TSTMP && + (tp->t_flags & TF_RCVD_TSTMP) == TF_RCVD_TSTMP) + mss -= TCPOLEN_TSTAMP_APPA; + if ((tp->t_flags & (TF_REQ_CC|TF_NOOPT)) == TF_REQ_CC && + (tp->t_flags & TF_RCVD_CC) == TF_RCVD_CC) + mss -= TCPOLEN_CC_APPA; +#if (MCLBYTES & (MCLBYTES - 1)) == 0 + if (mss > MCLBYTES) + mss &= ~(MCLBYTES-1); +#else + if (mss > MCLBYTES) + mss = mss / MCLBYTES * MCLBYTES; +#endif + if (so->so_snd.sb_hiwat < mss) + mss = so->so_snd.sb_hiwat; + + tp->t_maxseg = mss; + + tcpstat.tcps_mturesent++; + tp->t_rtt = 0; + tp->snd_nxt = tp->snd_una; + tcp_output(tp); + } +} +#endif + +/* + * Look-up the routing entry to the peer of this inpcb. If no route + * is found and it cannot be allocated the return NULL. This routine + * is called by TCP routines that access the rmx structure and by tcp_mss + * to get the interface MTU. + */ +struct rtentry * +tcp_rtlookup(inp) + struct inpcb *inp; +{ + struct route *ro; + struct rtentry *rt; + + ro = &inp->inp_route; + rt = &ro->ro_rt; + if (!(rt->rt_flags & RTF_UP)) { + /* No route yet, so try to acquire one */ + if (inp->inp_faddr.s_addr != INADDR_ANY) { + ro->ro_dst.sa_family = AF_INET; + /* ro->ro_dst.sa_len = sizeof(ro->ro_dst); */ + ((struct sockaddr_in *) &ro->ro_dst)->sin_addr = + inp->inp_faddr; + rt = &ro->ro_rt; + } + } + return rt; +} + +/* + * Return a pointer to the cached information about the remote host. + * The cached information is stored in the protocol specific part of + * the route metrics. + */ +struct rmxp_tao * +tcp_gettaocache(inp) + struct inpcb *inp; +{ + struct rtentry *rt = tcp_rtlookup(inp); + + /* Make sure this is a host route and is up. */ + if (rt == NULL || + (rt->rt_flags & (RTF_UP|RTF_HOST)) != (RTF_UP|RTF_HOST)) + return NULL; + + return rmx_taop(rt->rt_rmx); +} + +/* + * Clear all the TAO cache entries, called from tcp_init. + * + * XXX + * This routine is just an empty one, because we assume that the routing + * routing tables are initialized at the same time when TCP, so there is + * nothing in the cache left over. + */ +static void +tcp_cleartaocache(void) +{ } diff --git a/reactos/drivers/lib/oskittcp/oskittcp/tcp_timer.c b/reactos/drivers/lib/oskittcp/oskittcp/tcp_timer.c new file mode 100644 index 00000000000..dd2ff8d276c --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/tcp_timer.c @@ -0,0 +1,358 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcp_timer.c 8.1 (Berkeley) 6/10/93 + */ + +#ifndef TUBA_INCLUDE +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/malloc.h> +#include <sys/mbuf.h> +#include <sys/socket.h> +#include <sys/socketvar.h> +#include <sys/protosw.h> +#include <sys/errno.h> +#include <sys/queue.h> + +#include <net/if.h> +#include <net/route.h> + +#include <netinet/in.h> +#include <netinet/in_systm.h> +#include <netinet/ip.h> +#include <netinet/in_pcb.h> +#include <netinet/ip_var.h> +#include <netinet/tcp.h> +#include <netinet/tcp_fsm.h> +#include <netinet/tcp_seq.h> +#include <netinet/tcp_timer.h> +#include <netinet/tcp_var.h> +#include <netinet/tcpip.h> +#ifdef TCPDEBUG +#include <netinet/tcp_debug.h> +#endif + +int tcp_keepidle = TCPTV_KEEP_IDLE; +int tcp_keepintvl = TCPTV_KEEPINTVL; +int tcp_keepinit = TCPTV_KEEP_INIT; +int tcp_maxidle; +int tcp_maxpersistidle = TCPTV_KEEP_IDLE; +int tcp_totbackoff = 511; +#endif /* TUBA_INCLUDE */ +/* + * Fast timeout routine for processing delayed acks + */ +void +tcp_fasttimo() +{ + register struct inpcb *inp; + register struct tcpcb *tp; + int s; + + s = splnet(); + + for (inp = tcb.lh_first; inp != NULL; inp = inp->inp_list.le_next) { + if ((tp = (struct tcpcb *)inp->inp_ppcb) && + (tp->t_flags & TF_DELACK)) { + tp->t_flags &= ~TF_DELACK; + tp->t_flags |= TF_ACKNOW; + tcpstat.tcps_delack++; + (void) tcp_output(tp); + } + } + splx(s); +} + +/* + * Tcp protocol timeout routine called every 500 ms. + * Updates the timers in all active tcb's and + * causes finite state machine actions if timers expire. + */ +void +tcp_slowtimo() +{ + register struct inpcb *ip, *ipnxt; + register struct tcpcb *tp; + register int i; + int s; +#ifdef TCPDEBUG + int ostate; +#endif + + s = splnet(); + + tcp_maxidle = TCPTV_KEEPCNT * tcp_keepintvl; + + ip = tcb.lh_first; + if (ip == NULL) { + splx(s); + return; + } + /* + * Search through tcb's and update active timers. + */ + for (; ip != NULL; ip = ipnxt) { + ipnxt = ip->inp_list.le_next; + tp = intotcpcb(ip); + if (tp == 0) + continue; + for (i = 0; i < TCPT_NTIMERS; i++) { + if (tp->t_timer[i] && --tp->t_timer[i] == 0) { +#ifdef TCPDEBUG + ostate = tp->t_state; +#endif + tp = tcp_timers(tp, i); + if (tp == NULL) + goto tpgone; +#ifdef TCPDEBUG + if (tp->t_inpcb->inp_socket->so_options + & SO_DEBUG) + tcp_trace(TA_USER, ostate, tp, + (struct tcpiphdr *)0, + PRU_SLOWTIMO); +#endif + } + } + tp->t_idle++; + tp->t_duration++; + if (tp->t_rtt) + tp->t_rtt++; +tpgone: + ; + } + tcp_iss += TCP_ISSINCR/PR_SLOWHZ; /* increment iss */ +#ifdef TCP_COMPAT_42 + if ((int)tcp_iss < 0) + tcp_iss = 0; /* XXX */ +#endif + tcp_now++; /* for timestamps */ + splx(s); +} +#ifndef TUBA_INCLUDE + +/* + * Cancel all timers for TCP tp. + */ +void +tcp_canceltimers(tp) + struct tcpcb *tp; +{ + register int i; + + for (i = 0; i < TCPT_NTIMERS; i++) + tp->t_timer[i] = 0; +} + +int tcp_backoff[TCP_MAXRXTSHIFT + 1] = + { 1, 2, 4, 8, 16, 32, 64, 64, 64, 64, 64, 64, 64 }; + +/* + * TCP timer processing. + */ +struct tcpcb * +tcp_timers(tp, timer) + register struct tcpcb *tp; + int timer; +{ + register int rexmt; + + switch (timer) { + + /* + * 2 MSL timeout in shutdown went off. If we're closed but + * still waiting for peer to close and connection has been idle + * too long, or if 2MSL time is up from TIME_WAIT, delete connection + * control block. Otherwise, check again in a bit. + */ + case TCPT_2MSL: + if (tp->t_state != TCPS_TIME_WAIT && + tp->t_idle <= tcp_maxidle) + tp->t_timer[TCPT_2MSL] = tcp_keepintvl; + else + tp = tcp_close(tp); + break; + + /* + * Retransmission timer went off. Message has not + * been acked within retransmit interval. Back off + * to a longer retransmit interval and retransmit one segment. + */ + case TCPT_REXMT: + if (++tp->t_rxtshift > TCP_MAXRXTSHIFT) { + tp->t_rxtshift = TCP_MAXRXTSHIFT; + tcpstat.tcps_timeoutdrop++; + tp = tcp_drop(tp, tp->t_softerror ? + tp->t_softerror : ETIMEDOUT); + break; + } + tcpstat.tcps_rexmttimeo++; + rexmt = TCP_REXMTVAL(tp) * tcp_backoff[tp->t_rxtshift]; + TCPT_RANGESET(tp->t_rxtcur, rexmt, + tp->t_rttmin, TCPTV_REXMTMAX); + tp->t_timer[TCPT_REXMT] = tp->t_rxtcur; + /* + * If losing, let the lower level know and try for + * a better route. Also, if we backed off this far, + * our srtt estimate is probably bogus. Clobber it + * so we'll take the next rtt measurement as our srtt; + * move the current srtt into rttvar to keep the current + * retransmit times until then. + */ + if (tp->t_rxtshift > TCP_MAXRXTSHIFT / 4) { + in_losing(tp->t_inpcb); + tp->t_rttvar += (tp->t_srtt >> TCP_RTT_SHIFT); + tp->t_srtt = 0; + } + tp->snd_nxt = tp->snd_una; + /* + * Force a segment to be sent. + */ + tp->t_flags |= TF_ACKNOW; + /* + * If timing a segment in this window, stop the timer. + */ + tp->t_rtt = 0; + /* + * Close the congestion window down to one segment + * (we'll open it by one segment for each ack we get). + * Since we probably have a window's worth of unacked + * data accumulated, this "slow start" keeps us from + * dumping all that data as back-to-back packets (which + * might overwhelm an intermediate gateway). + * + * There are two phases to the opening: Initially we + * open by one mss on each ack. This makes the window + * size increase exponentially with time. If the + * window is larger than the path can handle, this + * exponential growth results in dropped packet(s) + * almost immediately. To get more time between + * drops but still "push" the network to take advantage + * of improving conditions, we switch from exponential + * to linear window opening at some threshhold size. + * For a threshhold, we use half the current window + * size, truncated to a multiple of the mss. + * + * (the minimum cwnd that will give us exponential + * growth is 2 mss. We don't allow the threshhold + * to go below this.) + */ + { + u_int win = min(tp->snd_wnd, tp->snd_cwnd) / 2 / tp->t_maxseg; + if (win < 2) + win = 2; + tp->snd_cwnd = tp->t_maxseg; + tp->snd_ssthresh = win * tp->t_maxseg; + tp->t_dupacks = 0; + } + (void) tcp_output(tp); + break; + + /* + * Persistance timer into zero window. + * Force a byte to be output, if possible. + */ + case TCPT_PERSIST: + tcpstat.tcps_persisttimeo++; + /* + * Hack: if the peer is dead/unreachable, we do not + * time out if the window is closed. After a full + * backoff, drop the connection if the idle time + * (no responses to probes) reaches the maximum + * backoff that we would use if retransmitting. + */ + if (tp->t_rxtshift == TCP_MAXRXTSHIFT) { + u_long maxidle = TCP_REXMTVAL(tp); + if (maxidle < tp->t_rttmin) + maxidle = tp->t_rttmin; + maxidle *= tcp_totbackoff; + if (tp->t_idle >= tcp_maxpersistidle || + tp->t_idle >= maxidle) { + tcpstat.tcps_persistdrop++; + tp = tcp_drop(tp, ETIMEDOUT); + break; + } + } + tcp_setpersist(tp); + tp->t_force = 1; + (void) tcp_output(tp); + tp->t_force = 0; + break; + + /* + * Keep-alive timer went off; send something + * or drop connection if idle for too long. + */ + case TCPT_KEEP: + tcpstat.tcps_keeptimeo++; + if (tp->t_state < TCPS_ESTABLISHED) + goto dropit; + if (tp->t_inpcb->inp_socket->so_options & SO_KEEPALIVE && + tp->t_state <= TCPS_CLOSING) { + if (tp->t_idle >= tcp_keepidle + tcp_maxidle) + goto dropit; + /* + * Send a packet designed to force a response + * if the peer is up and reachable: + * either an ACK if the connection is still alive, + * or an RST if the peer has closed the connection + * due to timeout or reboot. + * Using sequence number tp->snd_una-1 + * causes the transmitted zero-length segment + * to lie outside the receive window; + * by the protocol spec, this requires the + * correspondent TCP to respond. + */ + tcpstat.tcps_keepprobe++; +#ifdef TCP_COMPAT_42 + /* + * The keepalive packet must have nonzero length + * to get a 4.2 host to respond. + */ + tcp_respond(tp, tp->t_template, (struct mbuf *)NULL, + tp->rcv_nxt - 1, tp->snd_una - 1, 0); +#else + tcp_respond(tp, tp->t_template, (struct mbuf *)NULL, + tp->rcv_nxt, tp->snd_una - 1, 0); +#endif + tp->t_timer[TCPT_KEEP] = tcp_keepintvl; + } else + tp->t_timer[TCPT_KEEP] = tcp_keepidle; + break; + dropit: + tcpstat.tcps_keepdrops++; + tp = tcp_drop(tp, ETIMEDOUT); + break; + } + return (tp); +} +#endif /* TUBA_INCLUDE */ diff --git a/reactos/drivers/lib/oskittcp/oskittcp/tcp_usrreq.c b/reactos/drivers/lib/oskittcp/oskittcp/tcp_usrreq.c new file mode 100644 index 00000000000..ac61c4eb609 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/tcp_usrreq.c @@ -0,0 +1,773 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * From: @(#)tcp_usrreq.c 8.2 (Berkeley) 1/3/94 + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/malloc.h> +#include <sys/mbuf.h> +#include <sys/socket.h> +#include <sys/socketvar.h> +#include <sys/protosw.h> +#include <sys/errno.h> +#include <sys/stat.h> +#include <vm/vm.h> +#include <sys/sysctl.h> + +#include <net/if.h> +#include <net/route.h> + +#include <netinet/in.h> +#include <netinet/in_systm.h> +#include <netinet/ip.h> +#include <netinet/in_pcb.h> +#include <netinet/in_var.h> +#include <netinet/ip_var.h> +#include <netinet/tcp.h> +#include <netinet/tcp_fsm.h> +#include <netinet/tcp_seq.h> +#include <netinet/tcp_timer.h> +#include <netinet/tcp_var.h> +#include <netinet/tcpip.h> +#ifdef TCPDEBUG +#include <netinet/tcp_debug.h> +#endif + +/* + * TCP protocol interface to socket abstraction. + */ +extern char *tcpstates[]; + +/* + * Process a TCP user request for TCP tb. If this is a send request + * then m is the mbuf chain of send data. If this is a timer expiration + * (called from the software clock routine), then timertype tells which timer. + */ +/*ARGSUSED*/ +int +tcp_usrreq(so, req, m, nam, control) + struct socket *so; + int req; + struct mbuf *m, *nam, *control; +{ + register struct inpcb *inp; + register struct tcpcb *tp = 0; + struct sockaddr_in *sinp; + int s; + int error = 0; + + if (req == PRU_CONTROL) + return (in_control(so, (u_long)m, (caddr_t)nam, + (struct ifnet *)control)); + if (control && control->m_len) { + m_freem(control); + if (m) + m_freem(m); + return (EINVAL); + } + + s = splnet(); + inp = sotoinpcb(so); + + /* + * When a TCP is attached to a socket, then there will be + * a (struct inpcb) pointed at by the socket, and this + * structure will point at a subsidary (struct tcpcb). + */ + if (inp == 0 && req != PRU_ATTACH) { + splx(s); + /* safer version of fix for mbuf leak */ + if (m && (req == PRU_SEND || req == PRU_SENDOOB)) + m_freem(m); + } + + if( inp ) + tp = intotcpcb(inp); + + switch (req) { + /* + * TCP attaches to socket via PRU_ATTACH, reserving space, + * and an internet control block. + */ + case PRU_ATTACH: + if (inp) { + error = EISCONN; + break; + } + error = tcp_attach(so); + if (error) + break; + if ((so->so_options & SO_LINGER) && so->so_linger == 0) + so->so_linger = TCP_LINGERTIME * hz; + tp = sototcpcb(so); + break; + + /* + * PRU_DETACH detaches the TCP protocol from the socket. + * If the protocol state is non-embryonic, then can't + * do this directly: have to initiate a PRU_DISCONNECT, + * which may finish later; embryonic TCB's can just + * be discarded here. + */ + case PRU_DETACH: + if (tp->t_state > TCPS_LISTEN) + tp = tcp_disconnect(tp); + else + tp = tcp_close(tp); + break; + + /* + * Give the socket an address. + */ + case PRU_BIND: + /* + * Must check for multicast addresses and disallow binding + * to them. + */ + sinp = mtod(nam, struct sockaddr_in *); + error = in_pcbbind(inp, nam); + if (error) + break; + break; + + /* + * Prepare to accept connections. + */ + case PRU_LISTEN: + if (inp->inp_lport == 0) + error = in_pcbbind(inp, NULL); + if (error == 0) + tp->t_state = TCPS_LISTEN; + break; + + /* + * Initiate connection to peer. + * Create a template for use in transmissions on this connection. + * Enter SYN_SENT state, and mark socket as connecting. + * Start keep-alive timer, and seed output sequence space. + * Send initial segment on connection. + */ + case PRU_CONNECT: + /* + * Must disallow TCP ``connections'' to multicast addresses. + */ + sinp = mtod(nam, struct sockaddr_in *); + if ((error = tcp_connect(tp, nam)) != 0) { + OS_DbgPrint(OSK_MID_TRACE,("TC: %d\n", error)); + break; + } + error = tcp_output(tp); + OS_DbgPrint(OSK_MID_TRACE,("TO: %d\n", error)); + break; + + /* + * Create a TCP connection between two sockets. + */ + case PRU_CONNECT2: + error = EOPNOTSUPP; + break; + + /* + * Initiate disconnect from peer. + * If connection never passed embryonic stage, just drop; + * else if don't need to let data drain, then can just drop anyways, + * else have to begin TCP shutdown process: mark socket disconnecting, + * drain unread data, state switch to reflect user close, and + * send segment (e.g. FIN) to peer. Socket will be really disconnected + * when peer sends FIN and acks ours. + * + * SHOULD IMPLEMENT LATER PRU_CONNECT VIA REALLOC TCPCB. + */ + case PRU_DISCONNECT: + tp = tcp_disconnect(tp); + break; + + /* + * Accept a connection. Essentially all the work is + * done at higher levels; just return the address + * of the peer, storing through addr. + */ + case PRU_ACCEPT: + in_setpeeraddr(inp, nam); + break; + + /* + * Mark the connection as being incapable of further output. + */ + case PRU_SHUTDOWN: + socantsendmore(so); + tp = tcp_usrclosed(tp); + if (tp) + error = tcp_output(tp); + break; + + /* + * After a receive, possibly send window update to peer. + */ + case PRU_RCVD: + (void) tcp_output(tp); + break; + + /* + * Do a send by putting data in output queue and updating urgent + * marker if URG set. Possibly send more data. + */ + case PRU_SEND_EOF: + case PRU_SEND: + sbappend(so, &so->so_snd, m); + if (nam && tp->t_state < TCPS_SYN_SENT) { + /* + * Do implied connect if not yet connected, + * initialize window to default value, and + * initialize maxseg/maxopd using peer's cached + * MSS. + */ + error = tcp_connect(tp, nam); + if (error) + break; + tp->snd_wnd = TTCP_CLIENT_SND_WND; + tcp_mss(tp, -1); + } + + if (req == PRU_SEND_EOF) { + /* + * Close the send side of the connection after + * the data is sent. + */ + socantsendmore(so); + tp = tcp_usrclosed(tp); + } + if (tp != NULL) + error = tcp_output(tp); + break; + + /* + * Abort the TCP. + */ + case PRU_ABORT: + tp = tcp_drop(tp, ECONNABORTED); + break; + + case PRU_SENSE: + ((struct stat *) m)->st_blksize = so->so_snd.sb_hiwat; + (void) splx(s); + return (0); + + case PRU_RCVOOB: + if ((so->so_oobmark == 0 && + (so->so_state & SS_RCVATMARK) == 0) || + so->so_options & SO_OOBINLINE || + tp->t_oobflags & TCPOOB_HADDATA) { + error = EINVAL; + break; + } + if ((tp->t_oobflags & TCPOOB_HAVEDATA) == 0) { + error = EWOULDBLOCK; + break; + } + m->m_len = 1; + *mtod(m, caddr_t) = tp->t_iobc; + if (((int)nam & MSG_PEEK) == 0) + tp->t_oobflags ^= (TCPOOB_HAVEDATA | TCPOOB_HADDATA); + break; + + case PRU_SENDOOB: + if (sbspace(&so->so_snd) < -512) { + m_freem(m); + error = ENOBUFS; + break; + } + /* + * According to RFC961 (Assigned Protocols), + * the urgent pointer points to the last octet + * of urgent data. We continue, however, + * to consider it to indicate the first octet + * of data past the urgent section. + * Otherwise, snd_up should be one lower. + */ + sbappend(so, &so->so_snd, m); + if (nam && tp->t_state < TCPS_SYN_SENT) { + /* + * Do implied connect if not yet connected, + * initialize window to default value, and + * initialize maxseg/maxopd using peer's cached + * MSS. + */ + error = tcp_connect(tp, nam); + if (error) + break; + tp->snd_wnd = TTCP_CLIENT_SND_WND; + tcp_mss(tp, -1); + } + tp->snd_up = tp->snd_una + so->so_snd.sb_cc; + tp->t_force = 1; + error = tcp_output(tp); + tp->t_force = 0; + break; + + case PRU_SOCKADDR: + in_setsockaddr(inp, nam); + break; + + case PRU_PEERADDR: + in_setpeeraddr(inp, nam); + break; + + /* + * TCP slow timer went off; going through this + * routine for tracing's sake. + */ + case PRU_SLOWTIMO: + tp = tcp_timers(tp, (int)nam); +#ifdef TCPDEBUG + req |= (int)nam << 8; /* for debug's sake */ +#endif + break; + + default: + panic("tcp_usrreq"); + } +#ifdef TCPDEBUG + if (tp && (so->so_options & SO_DEBUG)) + tcp_trace(TA_USER, ostate, tp, (struct tcpiphdr *)0, req); +#endif + splx(s); + return (error); +} + +/* + * Common subroutine to open a TCP connection to remote host specified + * by struct sockaddr_in in mbuf *nam. Call in_pcbbind to assign a local + * port number if needed. Call in_pcbladdr to do the routing and to choose + * a local host address (interface). If there is an existing incarnation + * of the same connection in TIME-WAIT state and if the remote host was + * sending CC options and if the connection duration was < MSL, then + * truncate the previous TIME-WAIT state and proceed. + * Initialize connection parameters and enter SYN-SENT state. + */ +int +tcp_connect(tp, nam) + register struct tcpcb *tp; + struct mbuf *nam; +{ + struct inpcb *inp/* = tp->t_inpcb */, *oinp; + struct socket *so; + struct tcpcb *otp; + struct sockaddr_in *sin = mtod(nam, struct sockaddr_in *); + struct sockaddr_in ifaddr; + int error; + struct rmxp_tao *taop; + struct rmxp_tao tao_noncached; + + if( !tp ) + panic( "No tcpcb provided.\n" ); + + if( !tp->t_inpcb ) + panic( "No inpcb provided.\n" ); + + inp = tp->t_inpcb; + + if( !inp->inp_socket ) + panic( "No socket provided.\n" ); + + so = inp->inp_socket; + + if (inp->inp_lport == 0) { + error = in_pcbbind(inp, NULL); + if (error) { + OS_DbgPrint(OSK_MID_TRACE,("error %d\n", error)); + return error; + } + } + /* + * Cannot simply call in_pcbconnect, because there might be an + * earlier incarnation of this same connection still in + * TIME_WAIT state, creating an ADDRINUSE error. + */ + error = in_pcbladdr(inp, nam, &ifaddr); + + if (error) { + OS_DbgPrint(OSK_MID_TRACE,("error %d\n", error)); + return error; + } + + oinp = in_pcblookup(inp->inp_pcbinfo->listhead, + sin->sin_addr, sin->sin_port, + inp->inp_laddr.s_addr != INADDR_ANY ? inp->inp_laddr + : ifaddr.sin_addr, + inp->inp_lport, 0); + + if (oinp) { + + if (oinp != inp && (otp = intotcpcb(oinp)) != NULL && + otp->t_state == TCPS_TIME_WAIT && + otp->t_duration < TCPTV_MSL && + (otp->t_flags & TF_RCVD_CC)) + otp = tcp_close(otp); + else { + + OS_DbgPrint(OSK_MID_TRACE,("error EADDRINUSE\n")); + return EADDRINUSE; + } + + } + + if (inp->inp_laddr.s_addr == INADDR_ANY) + inp->inp_laddr = ifaddr.sin_addr; + + inp->inp_faddr = sin->sin_addr; + inp->inp_fport = sin->sin_port; + + in_pcbrehash(inp); + + + tp->t_template = tcp_template(tp); + + if (tp->t_template == 0) { + in_pcbdisconnect(inp); + OS_DbgPrint(OSK_MID_TRACE,("error ENOBUFS\n")); + return ENOBUFS; + } + + + /* Compute window scaling to request. */ + while (tp->request_r_scale < TCP_MAX_WINSHIFT && + (TCP_MAXWIN << tp->request_r_scale) < so->so_rcv.sb_hiwat) + tp->request_r_scale++; + + + soisconnecting(so); + + tcpstat.tcps_connattempt++; + tp->t_state = TCPS_SYN_SENT; + tp->t_timer[TCPT_KEEP] = tcp_keepinit; + tp->rcv_nxt = 0; + tp->iss = tcp_iss; tcp_iss += TCP_ISSINCR/2; + + tcp_sendseqinit(tp); + + + /* + * Generate a CC value for this connection and + * check whether CC or CCnew should be used. + */ + if ((taop = tcp_gettaocache(tp->t_inpcb)) == NULL) { + taop = &tao_noncached; + bzero(taop, sizeof(*taop)); + } + + tp->cc_send = CC_INC(tcp_ccgen); + if (taop->tao_ccsent != 0 && + CC_GEQ(tp->cc_send, taop->tao_ccsent)) { + taop->tao_ccsent = tp->cc_send; + } else { + taop->tao_ccsent = 0; + tp->t_flags |= TF_SENDCCNEW; + } + + return 0; +} + +int +tcp_ctloutput(op, so, level, optname, mp) + int op; + struct socket *so; + int level, optname; + struct mbuf **mp; +{ + int error = 0, s; + struct inpcb *inp; + register struct tcpcb *tp; + register struct mbuf *m; + register int i; + + s = splnet(); + inp = sotoinpcb(so); + if (inp == NULL) { + splx(s); + if (op == PRCO_SETOPT && *mp) + (void) m_free(*mp); + return (ECONNRESET); + } + if (level != IPPROTO_TCP) { + error = ip_ctloutput(op, so, level, optname, mp); + splx(s); + return (error); + } + tp = intotcpcb(inp); + + switch (op) { + + case PRCO_SETOPT: + m = *mp; + switch (optname) { + + case TCP_NODELAY: + if (m == NULL || m->m_len < sizeof (int)) + error = EINVAL; + else if (*mtod(m, int *)) + tp->t_flags |= TF_NODELAY; + else + tp->t_flags &= ~TF_NODELAY; + break; + + case TCP_MAXSEG: + if (m && (i = *mtod(m, int *)) > 0 && i <= tp->t_maxseg) + tp->t_maxseg = i; + else + error = EINVAL; + break; + + case TCP_NOOPT: + if (m == NULL || m->m_len < sizeof (int)) + error = EINVAL; + else if (*mtod(m, int *)) + tp->t_flags |= TF_NOOPT; + else + tp->t_flags &= ~TF_NOOPT; + break; + + case TCP_NOPUSH: + if (m == NULL || m->m_len < sizeof (int)) + error = EINVAL; + else if (*mtod(m, int *)) + tp->t_flags |= TF_NOPUSH; + else + tp->t_flags &= ~TF_NOPUSH; + break; + + default: + error = ENOPROTOOPT; + break; + } + if (m) + (void) m_free(m); + break; + + case PRCO_GETOPT: + *mp = m = m_get(M_WAIT, MT_SOOPTS); + m->m_len = sizeof(int); + + switch (optname) { + case TCP_NODELAY: + *mtod(m, int *) = tp->t_flags & TF_NODELAY; + break; + case TCP_MAXSEG: + *mtod(m, int *) = tp->t_maxseg; + break; + case TCP_NOOPT: + *mtod(m, int *) = tp->t_flags & TF_NOOPT; + break; + case TCP_NOPUSH: + *mtod(m, int *) = tp->t_flags & TF_NOPUSH; + break; + default: + error = ENOPROTOOPT; + break; + } + break; + } + splx(s); + return (error); +} + +/* + * tcp_sendspace and tcp_recvspace are the default send and receive window + * sizes, respectively. These are obsolescent (this information should + * be set by the route). + */ +u_long tcp_sendspace = 1024*16; +u_long tcp_recvspace = 1024*16; + +/* + * Attach TCP protocol to socket, allocating + * internet protocol control block, tcp control block, + * bufer space, and entering LISTEN state if to accept connections. + */ +int +tcp_attach(so) + struct socket *so; +{ + register struct tcpcb *tp; + struct inpcb *inp; + int error; + + if (so->so_snd.sb_hiwat == 0 || so->so_rcv.sb_hiwat == 0) { + error = soreserve(so, tcp_sendspace, tcp_recvspace); + if (error) + return (error); + } + error = in_pcballoc(so, &tcbinfo); + if (error) + return (error); + inp = sotoinpcb(so); + tp = tcp_newtcpcb(inp); + if (tp == 0) { + int nofd = so->so_state & SS_NOFDREF; /* XXX */ + + so->so_state &= ~SS_NOFDREF; /* don't free the socket yet */ + in_pcbdetach(inp); + so->so_state |= nofd; + OS_DbgPrint(OSK_MID_TRACE,("ENOBUFS: no tcpcb allocated\n")); + return (ENOBUFS); + } + tp->t_state = TCPS_CLOSED; + return (0); +} + +/* + * Initiate (or continue) disconnect. + * If embryonic state, just send reset (once). + * If in ``let data drain'' option and linger null, just drop. + * Otherwise (hard), mark socket disconnecting and drop + * current input data; switch states based on user close, and + * send segment to peer (with FIN). + */ +struct tcpcb * +tcp_disconnect(tp) + register struct tcpcb *tp; +{ + struct socket *so = tp->t_inpcb->inp_socket; + + if (tp->t_state < TCPS_ESTABLISHED) + tp = tcp_close(tp); + else if ((so->so_options & SO_LINGER) && so->so_linger == 0) + tp = tcp_drop(tp, 0); + else { + soisdisconnecting(so); + sbflush(&so->so_rcv); + tp = tcp_usrclosed(tp); + if (tp) + (void) tcp_output(tp); + } + return (tp); +} + +/* + * User issued close, and wish to trail through shutdown states: + * if never received SYN, just forget it. If got a SYN from peer, + * but haven't sent FIN, then go to FIN_WAIT_1 state to send peer a FIN. + * If already got a FIN from peer, then almost done; go to LAST_ACK + * state. In all other cases, have already sent FIN to peer (e.g. + * after PRU_SHUTDOWN), and just have to play tedious game waiting + * for peer to send FIN or not respond to keep-alives, etc. + * We can let the user exit from the close as soon as the FIN is acked. + */ +struct tcpcb * +tcp_usrclosed(tp) + register struct tcpcb *tp; +{ + + switch (tp->t_state) { + + case TCPS_CLOSED: + case TCPS_LISTEN: + tp->t_state = TCPS_CLOSED; + tp = tcp_close(tp); + break; + + case TCPS_SYN_SENT: + case TCPS_SYN_RECEIVED: + tp->t_flags |= TF_NEEDFIN; + break; + + case TCPS_ESTABLISHED: + tp->t_state = TCPS_FIN_WAIT_1; + break; + + case TCPS_CLOSE_WAIT: + tp->t_state = TCPS_LAST_ACK; + break; + } + if (tp && tp->t_state >= TCPS_FIN_WAIT_2) { + soisdisconnected(tp->t_inpcb->inp_socket); + /* To prevent the connection hanging in FIN_WAIT_2 forever. */ + if (tp->t_state == TCPS_FIN_WAIT_2) + tp->t_timer[TCPT_2MSL] = tcp_maxidle; + } + return (tp); +} + +/* + * Sysctl for tcp variables. + */ +int +tcp_sysctl(name, namelen, oldp, oldlenp, newp, newlen) + int *name; + u_int namelen; + void *oldp; + size_t *oldlenp; + void *newp; + size_t newlen; +{ + /* All sysctl names at this level are terminal. */ + if (namelen != 1) + return (ENOTDIR); + + switch (name[0]) { + case TCPCTL_DO_RFC1323: + return (sysctl_int(oldp, oldlenp, newp, newlen, + &tcp_do_rfc1323)); + case TCPCTL_DO_RFC1644: + return (sysctl_int(oldp, oldlenp, newp, newlen, + &tcp_do_rfc1644)); + case TCPCTL_MSSDFLT: + return (sysctl_int(oldp, oldlenp, newp, newlen, + &tcp_mssdflt)); + case TCPCTL_STATS: + return (sysctl_rdstruct(oldp, oldlenp, newp, &tcpstat, + sizeof tcpstat)); + case TCPCTL_RTTDFLT: + return (sysctl_int(oldp, oldlenp, newp, newlen, &tcp_rttdflt)); + case TCPCTL_KEEPIDLE: + return (sysctl_int(oldp, oldlenp, newp, newlen, + &tcp_keepidle)); + case TCPCTL_KEEPINTVL: + return (sysctl_int(oldp, oldlenp, newp, newlen, + &tcp_keepintvl)); + case TCPCTL_SENDSPACE: + return (sysctl_int(oldp, oldlenp, newp, newlen, + (int *)&tcp_sendspace)); /* XXX */ + case TCPCTL_RECVSPACE: + return (sysctl_int(oldp, oldlenp, newp, newlen, + (int *)&tcp_recvspace)); /* XXX */ + case TCPCTL_KEEPINIT: + return (sysctl_int(oldp, oldlenp, newp, newlen, + &tcp_keepinit)); + default: + return (ENOPROTOOPT); + } + /* NOTREACHED */ +} diff --git a/reactos/drivers/lib/oskittcp/oskittcp/uipc_domain.c b/reactos/drivers/lib/oskittcp/oskittcp/uipc_domain.c new file mode 100644 index 00000000000..08a1800eb41 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/uipc_domain.c @@ -0,0 +1,231 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)uipc_domain.c 8.2 (Berkeley) 10/18/93 + */ + +#include <sys/param.h> +#include <sys/socket.h> +#include <sys/protosw.h> +#include <sys/domain.h> +#include <sys/mbuf.h> +#include <sys/time.h> +#include <sys/kernel.h> +#include <sys/systm.h> +#include <sys/proc.h> +#include <vm/vm.h> +#include <sys/sysctl.h> + +void pffasttimo __P((void *)); +void pfslowtimo __P((void *)); + +struct domain *domains; + +#define ADDDOMAIN(x) { \ + extern struct domain __CONCAT(x,domain); \ + __CONCAT(x,domain.dom_next) = domains; \ + domains = &__CONCAT(x,domain); \ +} + +extern struct linker_set domain_set; + +void +domaininit() +{ + register struct domain *dp, **dpp; + register struct protosw *pr; + + printf("domaininit starting\n"); + + /* + * NB - local domain is always present. + */ + ADDDOMAIN(local); + ADDDOMAIN(inet); + + for (dpp = (struct domain **)domain_set.ls_items; *dpp; dpp++) { + printf("(1) Domain %s counting\n", (**dpp).dom_name); + (**dpp).dom_next = domains; + domains = *dpp; + } + +/* - not in our sources +#ifdef ISDN + ADDDOMAIN(isdn); +#endif +*/ + for (dp = domains; dp; dp = dp->dom_next) { + printf("(1) Domain %s initializing\n", dp->dom_name); + if (dp->dom_init) + (*dp->dom_init)(); + for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) { + printf("Registering protocols for %s\n", dp->dom_name); + if (pr->pr_init) + (*pr->pr_init)(); + } + if( dp->dom_next && !dp->dom_next->dom_name ) + dp->dom_next = 0; + } + + if (max_linkhdr < 16) /* XXX */ + max_linkhdr = 16; + max_hdr = max_linkhdr + max_protohdr; + max_datalen = MHLEN - max_hdr; + timeout(pffasttimo, (void *)0, 1); + timeout(pfslowtimo, (void *)0, 1); + + printf("Domaininit done\n"); +} + +struct protosw * +pffindtype(family, type) + int family, type; +{ + register struct domain *dp; + register struct protosw *pr; + + for (dp = domains; dp; dp = dp->dom_next) + if (dp->dom_family == family) + goto found; + return (0); +found: + for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) + if (pr->pr_type && pr->pr_type == type) + return (pr); + return (0); +} + +struct protosw * +pffindproto(family, protocol, type) + int family, protocol, type; +{ + register struct domain *dp; + register struct protosw *pr; + struct protosw *maybe = 0; + + if (family == 0) + return (0); + for (dp = domains; dp; dp = dp->dom_next) + if (dp->dom_family == family) + goto found; + return (0); +found: + for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) { + if ((pr->pr_protocol == protocol) && (pr->pr_type == type)) + return (pr); + + if (type == SOCK_RAW && pr->pr_type == SOCK_RAW && + pr->pr_protocol == 0 && maybe == (struct protosw *)0) + maybe = pr; + } + return (maybe); +} + +int +net_sysctl(name, namelen, oldp, oldlenp, newp, newlen, p) + int *name; + u_int namelen; + void *oldp; + size_t *oldlenp; + void *newp; + size_t newlen; + struct proc *p; +{ + register struct domain *dp; + register struct protosw *pr; + int family, protocol; + + /* + * All sysctl names at this level are nonterminal; + * next two components are protocol family and protocol number, + * then at least one addition component. + */ + if (namelen < 3) + return (EISDIR); /* overloaded */ + family = name[0]; + protocol = name[1]; + + if (family == 0) + return (0); + for (dp = domains; dp; dp = dp->dom_next) + if (dp->dom_family == family) + goto found; + return (ENOPROTOOPT); +found: + for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) + if (pr->pr_protocol == protocol && pr->pr_sysctl) + return ((*pr->pr_sysctl)(name + 2, namelen - 2, + oldp, oldlenp, newp, newlen)); + return (ENOPROTOOPT); +} + +void +pfctlinput(cmd, sa) + int cmd; + struct sockaddr *sa; +{ + register struct domain *dp; + register struct protosw *pr; + + for (dp = domains; dp; dp = dp->dom_next) + for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) + if (pr->pr_ctlinput) + (*pr->pr_ctlinput)(cmd, sa, (caddr_t)0); +} + +void +pfslowtimo(arg) + void *arg; +{ + register struct domain *dp; + register struct protosw *pr; + + for (dp = domains; dp; dp = dp->dom_next) + for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) + if (pr->pr_slowtimo) + (*pr->pr_slowtimo)(); + timeout(pfslowtimo, (void *)0, hz/2); +} + +void +pffasttimo(arg) + void *arg; +{ + register struct domain *dp; + register struct protosw *pr; + + for (dp = domains; dp; dp = dp->dom_next) + for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) + if (pr->pr_fasttimo) + (*pr->pr_fasttimo)(); + timeout(pffasttimo, (void *)0, hz/5); +} diff --git a/reactos/drivers/lib/oskittcp/oskittcp/uipc_mbuf.c b/reactos/drivers/lib/oskittcp/oskittcp/uipc_mbuf.c new file mode 100644 index 00000000000..222efa3739f --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/uipc_mbuf.c @@ -0,0 +1,769 @@ +/* + * Copyright (c) 1997-1998 University of Utah and the Flux Group. + * All rights reserved. + * + * This file is part of the Flux OSKit. The OSKit is free software, also known + * as "open source;" you can redistribute it and/or modify it under the terms + * of the GNU General Public License (GPL), version 2, as published by the Free + * Software Foundation (FSF). To explore alternate licensing terms, contact + * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. + * + * The OSKit 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 GPL for more details. You should have + * received a copy of the GPL along with the OSKit; see the file COPYING. If + * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. + */ +/* + * Copyright (c) 1982, 1986, 1988, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)uipc_mbuf.c 8.2 (Berkeley) 1/4/94 + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/proc.h> +#include <sys/malloc.h> +#define MBTYPES +#include <sys/mbuf.h> +#include <sys/kernel.h> +#include <sys/syslog.h> +#include <sys/domain.h> +#include <sys/protosw.h> + +#include <vm/vm.h> +#include <oskittcp.h> + +#ifndef OSKIT +extern vm_map_t mb_map; +struct mbuf *mbutl; +char *mclrefcnt; +int mb_map_full; + +void +mbinit() +{ + int s; + +#if CLBYTES < 4096 +#define NCL_INIT (4096/CLBYTES) +#else +#define NCL_INIT 1 +#endif + s = splimp(); + if (m_clalloc(NCL_INIT, M_DONTWAIT) == 0) + goto bad; + splx(s); + return; +bad: + panic("mbinit"); +} + +/* + * Allocate some number of mbuf clusters + * and place on cluster free list. + * Must be called at splimp. + */ +/* ARGSUSED */ +int +m_clalloc(ncl, nowait) + register int ncl; + int nowait; +{ + static int logged; + register caddr_t p; + register int i; + int npg; + + /* + * Once we run out of map space, it will be impossible + * to get any more (nothing is ever freed back to the + * map). + */ + if (mb_map_full) + return (0); + + npg = ncl * CLSIZE; + p = (caddr_t)kmem_malloc(mb_map, ctob(npg), + nowait ? M_NOWAIT : M_WAITOK); + /* + * Either the map is now full, or this is nowait and there + * are no pages left. + */ + if (p == NULL) + return (0); + + ncl = ncl * CLBYTES / MCLBYTES; + for (i = 0; i < ncl; i++) { + ((union mcluster *)p)->mcl_next = mclfree; + mclfree = (union mcluster *)p; + p += MCLBYTES; + mbstat.m_clfree++; + } + mbstat.m_clusters += ncl; + return (1); +} +#endif /* !OSKIT */ + +/* + * When MGET failes, ask protocols to free space when short of memory, + * then re-attempt to allocate an mbuf. + */ +struct mbuf * +m_retry(i, t) + int i, t; +{ + register struct mbuf *m; + + m_reclaim(); +/* + * I'm getting rid of the utterly ugly redefinition of m_retry + * - same for m_retryhdr below + */ + MGET_DONT_RECURSE(m, i, t); + if (m != NULL) + mbstat.m_wait++; + else + mbstat.m_drops++; + return (m); +} + +/* + * As above; retry an MGETHDR. + */ +struct mbuf * +m_retryhdr(i, t) + int i, t; +{ + register struct mbuf *m; + + m_reclaim(); + MGETHDR_DONT_RECURSE(m, i, t); + if (m != NULL) + mbstat.m_wait++; + else + mbstat.m_drops++; + return (m); +} + +void +m_reclaim() +{ + register struct domain *dp; + register struct protosw *pr; + int s = splimp(); + + for (dp = domains; dp; dp = dp->dom_next) { + for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) { + if (pr->pr_drain) + (*pr->pr_drain)(); + } + } + + splx(s); + mbstat.m_drain++; +} + +/* + * Space allocation routines. + * These are also available as macros + * for critical paths. + */ +struct mbuf * +m_get(nowait, type) + int nowait, type; +{ + register struct mbuf *m; + + MGET(m, nowait, type); + return (m); +} + +struct mbuf * +m_gethdr(nowait, type) + int nowait, type; +{ + register struct mbuf *m; + + MGETHDR(m, nowait, type); + return (m); +} + +struct mbuf * +m_getclr(nowait, type) + int nowait, type; +{ + register struct mbuf *m; + + MGET(m, nowait, type); + if (m == 0) + return (0); + bzero(mtod(m, caddr_t), MLEN); + return (m); +} + +struct mbuf * +m_free(m) + struct mbuf *m; +{ + register struct mbuf *n; + + MFREE(m, n); + return (n); +} + +void +m_freem(m) + register struct mbuf *m; +{ + register struct mbuf *n; + + if (m == NULL) + return; + do { + MFREE(m, n); + m = n; + } while (m); +} + +/* + * Mbuffer utility routines. + */ + +/* + * Lesser-used path for M_PREPEND: + * allocate new mbuf to prepend to chain, + * copy junk along. + */ +struct mbuf * +m_prepend(m, len, how) + register struct mbuf *m; + int len, how; +{ + struct mbuf *mn; + + MGET(mn, how, m->m_type); + if (mn == (struct mbuf *)NULL) { + m_freem(m); + return ((struct mbuf *)NULL); + } + if (m->m_flags & M_PKTHDR) { + M_COPY_PKTHDR(mn, m); + m->m_flags &= ~M_PKTHDR; + } + mn->m_next = m; + m = mn; + if (len < MHLEN) + MH_ALIGN(m, len); + m->m_len = len; + return (m); +} + +/* + * Make a copy of an mbuf chain starting "off0" bytes from the beginning, + * continuing for "len" bytes. If len is M_COPYALL, copy to end of mbuf. + * The wait parameter is a choice of M_WAIT/M_DONTWAIT from caller. + */ +int MCFail; + +struct mbuf * +m_copym(m, off0, len, wait) + register struct mbuf *m; + int off0, wait; + register int len; +{ + register struct mbuf *n, **np; + register int off = off0; + struct mbuf *top; + int copyhdr = 0; + + if (off < 0 || len < 0) + panic("m_copym"); + if (off == 0 && m->m_flags & M_PKTHDR) + copyhdr = 1; + while (off > 0) { + if (m == 0) + panic("m_copym"); + if (off < m->m_len) + break; + off -= m->m_len; + m = m->m_next; + } + np = ⊤ + top = 0; + while (len > 0) { + if (m == 0) { + if (len != M_COPYALL) + panic("m_copym"); + break; + } + MGET(n, wait, m->m_type); + *np = n; + if (n == 0) + goto nospace; + if (copyhdr) { + M_COPY_PKTHDR(n, m); + if (len == M_COPYALL) + n->m_pkthdr.len -= off0; + else + n->m_pkthdr.len = len; + copyhdr = 0; + } + n->m_len = min(len, m->m_len - off); + + if (m->m_flags & M_EXT) { + n->m_data = m->m_data + off; +#ifdef OSKIT + oskit_bufio_addref(m->m_ext.ext_bufio); +#else + mclrefcnt[mtocl(m->m_ext.ext_buf)]++; +#endif /* OSKIT */ + n->m_ext = m->m_ext; + n->m_flags |= M_EXT; + } else + bcopy(mtod(m, caddr_t)+off, mtod(n, caddr_t), + (unsigned)n->m_len); + if (len != M_COPYALL) + len -= n->m_len; + off = 0; + m = m->m_next; + np = &n->m_next; + } + if (top == 0) + MCFail++; + return (top); +nospace: + m_freem(top); + MCFail++; + return (0); +} + +/* + * Copy data from an mbuf chain starting "off" bytes from the beginning, + * continuing for "len" bytes, into the indicated buffer. + */ +void +m_copydata(m, off, len, cp) + register struct mbuf *m; + register int off; + register int len; + caddr_t cp; +{ + register unsigned count; + + if (off < 0 || len < 0) + panic("m_copydata"); + while (off > 0) { + if (m == 0) + panic("m_copydata"); + if (off < m->m_len) + break; + off -= m->m_len; + m = m->m_next; + } + while (len > 0) { + if (m == 0) + panic("m_copydata"); + count = min(m->m_len - off, len); + bcopy(mtod(m, caddr_t) + off, cp, count); + len -= count; + cp += count; + off = 0; + m = m->m_next; + } +} + +/* + * Concatenate mbuf chain n to m. + * Both chains must be of the same type (e.g. MT_DATA). + * Any m_pkthdr is not updated. + */ +void +m_cat(m, n) + register struct mbuf *m, *n; +{ + while (m->m_next) + m = m->m_next; + while (n) { + if (m->m_flags & M_EXT || + m->m_data + m->m_len + n->m_len >= &m->m_dat[MLEN]) { + /* just join the two chains */ + m->m_next = n; + return; + } + /* splat the data from one into the other */ + bcopy(mtod(n, caddr_t), mtod(m, caddr_t) + m->m_len, + (u_int)n->m_len); + m->m_len += n->m_len; + n = m_free(n); + } +} + +void +m_adj(mp, req_len) + struct mbuf *mp; + int req_len; +{ + register int len = req_len; + register struct mbuf *m; + register count; + + if ((m = mp) == NULL) + return; + if (len >= 0) { + /* + * Trim from head. + */ + while (m != NULL && len > 0) { + if (m->m_len <= len) { + len -= m->m_len; + m->m_len = 0; + m = m->m_next; + } else { + m->m_len -= len; + m->m_data += len; + len = 0; + } + } + m = mp; + if (mp->m_flags & M_PKTHDR) + m->m_pkthdr.len -= (req_len - len); + } else { + /* + * Trim from tail. Scan the mbuf chain, + * calculating its length and finding the last mbuf. + * If the adjustment only affects this mbuf, then just + * adjust and return. Otherwise, rescan and truncate + * after the remaining size. + */ + len = -len; + count = 0; + for (;;) { + count += m->m_len; + if (m->m_next == (struct mbuf *)0) + break; + m = m->m_next; + } + if (m->m_len >= len) { + m->m_len -= len; + if (mp->m_flags & M_PKTHDR) + mp->m_pkthdr.len -= len; + return; + } + count -= len; + if (count < 0) + count = 0; + /* + * Correct length for chain is "count". + * Find the mbuf with last data, adjust its length, + * and toss data from remaining mbufs on chain. + */ + m = mp; + if (m->m_flags & M_PKTHDR) + m->m_pkthdr.len = count; + for (; m; m = m->m_next) { + if (m->m_len >= count) { + m->m_len = count; + break; + } + count -= m->m_len; + } + while (m->m_next) + (m = m->m_next) ->m_len = 0; + } +} + +/* + * Rearange an mbuf chain so that len bytes are contiguous + * and in the data area of an mbuf (so that mtod and dtom + * will work for a structure of size len). Returns the resulting + * mbuf chain on success, frees it and returns null on failure. + * If there is room, it will add up to max_protohdr-len extra bytes to the + * contiguous region in an attempt to avoid being called next time. + */ +int MPFail; + +struct mbuf * +m_pullup(n, len) + register struct mbuf *n; + int len; +{ + register struct mbuf *m; + register int count; + int space; + + /* + * If first mbuf has no cluster, and has room for len bytes + * without shifting current data, pullup into it, + * otherwise allocate a new mbuf to prepend to the chain. + */ + if ((n->m_flags & M_EXT) == 0 && + n->m_data + len < &n->m_dat[MLEN] && n->m_next) { + if (n->m_len >= len) + return (n); + m = n; + n = n->m_next; + len -= m->m_len; + } else { + if (len > MHLEN) + goto bad; + MGET(m, M_DONTWAIT, n->m_type); + if (m == 0) + goto bad; + m->m_len = 0; + if (n->m_flags & M_PKTHDR) { + M_COPY_PKTHDR(m, n); + n->m_flags &= ~M_PKTHDR; + } + } + space = &m->m_dat[MLEN] - (m->m_data + m->m_len); + do { + count = min(min(max(len, max_protohdr), space), n->m_len); + bcopy(mtod(n, caddr_t), mtod(m, caddr_t) + m->m_len, + (unsigned)count); + len -= count; + m->m_len += count; + n->m_len -= count; + space -= count; + if (n->m_len) + n->m_data += count; + else + n = m_free(n); + } while (len > 0 && n); + if (len > 0) { + (void) m_free(m); + goto bad; + } + m->m_next = n; + return (m); +bad: + m_freem(n); + MPFail++; + return (0); +} + +/* + * Partition an mbuf chain in two pieces, returning the tail -- + * all but the first len0 bytes. In case of failure, it returns NULL and + * attempts to restore the chain to its original state. + */ +struct mbuf * +m_split(m0, len0, wait) + register struct mbuf *m0; + int len0, wait; +{ + register struct mbuf *m, *n; + unsigned len = len0, remain; + + for (m = m0; m && len > m->m_len; m = m->m_next) + len -= m->m_len; + if (m == 0) + return (0); + remain = m->m_len - len; + if (m0->m_flags & M_PKTHDR) { + MGETHDR(n, wait, m0->m_type); + if (n == 0) + return (0); + n->m_pkthdr.rcvif = m0->m_pkthdr.rcvif; + n->m_pkthdr.len = m0->m_pkthdr.len - len0; + m0->m_pkthdr.len = len0; + if (m->m_flags & M_EXT) + goto extpacket; + if (remain > MHLEN) { + /* m can't be the lead packet */ + MH_ALIGN(n, 0); + n->m_next = m_split(m, len, wait); + if (n->m_next == 0) { + (void) m_free(n); + return (0); + } else + return (n); + } else + MH_ALIGN(n, remain); + } else if (remain == 0) { + n = m->m_next; + m->m_next = 0; + return (n); + } else { + MGET(n, wait, m->m_type); + if (n == 0) + return (0); + M_ALIGN(n, remain); + } +extpacket: + if (m->m_flags & M_EXT) { + n->m_flags |= M_EXT; + n->m_ext = m->m_ext; +#ifdef OSKIT + oskit_bufio_addref(m->m_ext.ext_bufio); +#else + mclrefcnt[mtocl(m->m_ext.ext_buf)]++; +#endif /* OSKIT */ + m->m_ext.ext_size = 0; /* For Accounting XXXXXX danger */ + n->m_data = m->m_data + len; + } else { + bcopy(mtod(m, caddr_t) + len, mtod(n, caddr_t), remain); + } + n->m_len = remain; + m->m_len = len; + n->m_next = m->m_next; + m->m_next = 0; + return (n); +} + +#ifndef OSKIT +/* currently not OS Kit approved, and shouldn't be needed in the first place */ + +/* + * Routine to copy from device local memory into mbufs. + */ +struct mbuf * +m_devget(buf, totlen, off0, ifp, copy) + char *buf; + int totlen, off0; + struct ifnet *ifp; + void (*copy)(); +{ + register struct mbuf *m; + struct mbuf *top = 0, **mp = ⊤ + register int off = off0, len; + register char *cp; + char *epkt; + + cp = buf; + epkt = cp + totlen; + if (off) { + cp += off + 2 * sizeof(u_short); + totlen -= 2 * sizeof(u_short); + } + MGETHDR(m, M_DONTWAIT, MT_DATA); + if (m == 0) + return (0); + m->m_pkthdr.rcvif = ifp; + m->m_pkthdr.len = totlen; + m->m_len = MHLEN; + + while (totlen > 0) { + if (top) { + MGET(m, M_DONTWAIT, MT_DATA); + if (m == 0) { + m_freem(top); + return (0); + } + m->m_len = MLEN; + } + len = min(totlen, epkt - cp); + if (len >= MINCLSIZE) { + MCLGET(m, M_DONTWAIT); + if (m->m_flags & M_EXT) + m->m_len = len = min(len, MCLBYTES); + else + len = m->m_len; + } else { + /* + * Place initial small packet/header at end of mbuf. + */ + if (len < m->m_len) { + if (top == 0 && len + max_linkhdr <= m->m_len) + m->m_data += max_linkhdr; + m->m_len = len; + } else + len = m->m_len; + } + if (copy) + copy(cp, mtod(m, caddr_t), (unsigned)len); + else + bcopy(cp, mtod(m, caddr_t), (unsigned)len); + cp += len; + *mp = m; + mp = &m->m_next; + totlen -= len; + if (cp == epkt) + cp = buf; + } + return (top); +} + +#endif /* !OSKIT */ + +/* + * Copy data from a buffer back into the indicated mbuf chain, + * starting "off" bytes from the beginning, extending the mbuf + * chain if necessary. + */ +void +m_copyback(m0, off, len, cp) + struct mbuf *m0; + register int off; + register int len; + caddr_t cp; +{ + register int mlen; + register struct mbuf *m = m0, *n; + int totlen = 0; + + if (m0 == 0) + return; + while (off > (mlen = m->m_len)) { + off -= mlen; + totlen += mlen; + if (m->m_next == 0) { + n = m_getclr(M_DONTWAIT, m->m_type); + if (n == 0) + goto out; + n->m_len = min(MLEN, len + off); + m->m_next = n; + } + m = m->m_next; + } + while (len > 0) { + mlen = min (m->m_len - off, len); + bcopy(cp, off + mtod(m, caddr_t), (unsigned)mlen); + cp += mlen; + len -= mlen; + mlen += off; + off = 0; + totlen += mlen; + if (len == 0) + break; + if (m->m_next == 0) { + n = m_get(M_DONTWAIT, m->m_type); + if (n == 0) + break; + n->m_len = min(MLEN, len); + m->m_next = n; + } + m = m->m_next; + } +out: if (((m = m0)->m_flags & M_PKTHDR) && (m->m_pkthdr.len < totlen)) + m->m_pkthdr.len = totlen; +} diff --git a/reactos/drivers/lib/oskittcp/oskittcp/uipc_socket.c b/reactos/drivers/lib/oskittcp/oskittcp/uipc_socket.c new file mode 100644 index 00000000000..8d46e40c533 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/uipc_socket.c @@ -0,0 +1,1061 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)uipc_socket.c 8.3 (Berkeley) 4/15/94 + */ + +#include <roscfg.h> +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/proc.h> +#include <sys/file.h> +#include <sys/malloc.h> +#include <sys/mbuf.h> +#include <sys/domain.h> +#include <sys/kernel.h> +#include <sys/protosw.h> +#include <sys/socket.h> +#include <sys/socketvar.h> +#include <sys/resourcevar.h> +#include <sys/signalvar.h> +#include <oskittcp.h> + +/* + * Exported to userland via sysctl + */ +int somaxconn = SOMAXCONN; + +/* + * Socket operation routines. + * These routines are called by the routines in + * sys_socket.c or from a system process, and + * implement the semantics of socket operations by + * switching out to the protocol specific routines. + */ +/*ARGSUSED*/ +int +socreate(dom, aso, type, proto) + int dom; + struct socket **aso; + register int type; + int proto; +{ + struct proc *p = curproc; /* XXX */ + register struct protosw *prp; + register struct socket *so; + register int error; + + if (proto) + prp = pffindproto(dom, proto, type); + else + prp = pffindtype(dom, type); + if (prp == 0 || prp->pr_usrreq == 0) + return (EPROTONOSUPPORT); + if (prp->pr_type != type) + return (EPROTOTYPE); + MALLOC(so, struct socket *, sizeof(*so), M_SOCKET, M_WAIT); + bzero((caddr_t)so, sizeof(*so)); + so->so_type = type; + so->so_proto = prp; + error = + (*prp->pr_usrreq)(so, PRU_ATTACH, + (struct mbuf *)0, (struct mbuf *)proto, (struct mbuf *)0); + if (error) { + so->so_state |= SS_NOFDREF; + sofree(so); + return (error); + } + *aso = so; + return (0); +} + +int +sobind(so, nam) + struct socket *so; + struct mbuf *nam; +{ + int s = splnet(); + int error; + + error = + (*so->so_proto->pr_usrreq)(so, PRU_BIND, + (struct mbuf *)0, nam, (struct mbuf *)0); + splx(s); + return (error); +} + +int +solisten(so, backlog) + register struct socket *so; + int backlog; +{ + int s = splnet(), error; + + error = + (*so->so_proto->pr_usrreq)(so, PRU_LISTEN, + (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0); + if (error) { + splx(s); + return (error); + } + if (so->so_q == 0) + so->so_options |= SO_ACCEPTCONN; + if (backlog < 0 || backlog > somaxconn) + backlog = somaxconn; + so->so_qlimit = backlog; + splx(s); + return (0); +} + +void +sofree(so) + register struct socket *so; +{ + + if (so->so_pcb || (so->so_state & SS_NOFDREF) == 0) + return; + if (so->so_head) { + if (!soqremque(so, 0) && !soqremque(so, 1)) + panic("sofree dq"); + so->so_head = 0; + } + sbrelease(&so->so_snd); + sorflush(so); + FREE(so, M_SOCKET); +} + +/* + * Close a socket on last file table reference removal. + * Initiate disconnect if connected. + * Free socket when disconnect complete. + */ +int +soclose(so) + register struct socket *so; +{ + int s = splnet(); /* conservative */ + int error = 0; + + if (so->so_options & SO_ACCEPTCONN) { + while (so->so_q0) + (void) soabort(so->so_q0); + while (so->so_q) + (void) soabort(so->so_q); + } + if (so->so_pcb == 0) + goto discard; + if (so->so_state & SS_ISCONNECTED) { + if ((so->so_state & SS_ISDISCONNECTING) == 0) { + error = sodisconnect(so); + if (error) + goto drop; + } + if (so->so_options & SO_LINGER) { + if ((so->so_state & SS_ISDISCONNECTING) && + (so->so_state & SS_NBIO)) + goto drop; + while (so->so_state & SS_ISCONNECTED) { + error = tsleep((caddr_t)&so->so_timeo, + PSOCK | PCATCH, netcls, so->so_linger); + if (error) + break; + } + } + } +drop: + if (so->so_pcb) { + int error2 = + (*so->so_proto->pr_usrreq)(so, PRU_DETACH, + (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0); + if (error == 0) + error = error2; + } +discard: + if (so->so_state & SS_NOFDREF) + panic("soclose: NOFDREF"); + so->so_state |= SS_NOFDREF; + sofree(so); + splx(s); + return (error); +} + +/* + * Must be called at splnet... + */ +int +soabort(so) + struct socket *so; +{ + + return ( + (*so->so_proto->pr_usrreq)(so, PRU_ABORT, + (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0)); +} + +int +soaccept(so, nam) + register struct socket *so; + struct mbuf *nam; +{ + int s = splnet(); + int error; + + if ((so->so_state & SS_NOFDREF) == 0) + panic("soaccept: !NOFDREF"); + so->so_state &= ~SS_NOFDREF; + error = (*so->so_proto->pr_usrreq)(so, PRU_ACCEPT, + (struct mbuf *)0, nam, (struct mbuf *)0); + splx(s); + return (error); +} + +int +soconnect(so, nam) + register struct socket *so; + struct mbuf *nam; +{ + int s; + int error; + + if (so->so_options & SO_ACCEPTCONN) + return (EOPNOTSUPP); + s = splnet(); + /* + * If protocol is connection-based, can only connect once. + * Otherwise, if connected, try to disconnect first. + * This allows user to disconnect by connecting to, e.g., + * a null address. + */ + if (so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING) && + ((so->so_proto->pr_flags & PR_CONNREQUIRED) || + (error = sodisconnect(so)))) + error = EISCONN; + else + error = (*so->so_proto->pr_usrreq)(so, PRU_CONNECT, + (struct mbuf *)0, nam, (struct mbuf *)0); + splx(s); + return (error); +} + +int +soconnect2(so1, so2) + register struct socket *so1; + struct socket *so2; +{ + int s = splnet(); + int error; + + error = (*so1->so_proto->pr_usrreq)(so1, PRU_CONNECT2, + (struct mbuf *)0, (struct mbuf *)so2, (struct mbuf *)0); + splx(s); + return (error); +} + +int +sodisconnect(so) + register struct socket *so; +{ + int s = splnet(); + int error; + + if ((so->so_state & SS_ISCONNECTED) == 0) { + error = ENOTCONN; + goto bad; + } + if (so->so_state & SS_ISDISCONNECTING) { + error = EALREADY; + goto bad; + } + error = (*so->so_proto->pr_usrreq)(so, PRU_DISCONNECT, + (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0); +bad: + splx(s); + return (error); +} + +#define SBLOCKWAIT(f) (((f) & MSG_DONTWAIT) ? M_NOWAIT : M_WAITOK) +/* + * Send on a socket. + * If send must go all at once and message is larger than + * send buffering, then hard error. + * Lock against other senders. + * If must go all at once and not enough room now, then + * inform user that this would block and do nothing. + * Otherwise, if nonblocking, send as much as possible. + * The data to be sent is described by "uio" if nonzero, + * otherwise by the mbuf chain "top" (which must be null + * if uio is not). Data provided in mbuf chain must be small + * enough to send all at once. + * + * Returns nonzero on error, timeout or signal; callers + * must check for short counts if EINTR/ERESTART are returned. + * Data and control buffers are freed on return. + */ +int +sosend(so, addr, uio, top, control, flags) + register struct socket *so; + struct mbuf *addr; + struct uio *uio; + struct mbuf *top; + struct mbuf *control; + int flags; +{ + struct proc *p = curproc; /* XXX */ + struct mbuf **mp; + register struct mbuf *m; + register long space, len, resid; + int clen = 0, error, s, dontroute, mlen; + int atomic = sosendallatonce(so) || top; + + if (uio) + resid = uio->uio_resid; + else + resid = top->m_pkthdr.len; + /* + * In theory resid should be unsigned. + * However, space must be signed, as it might be less than 0 + * if we over-committed, and we must use a signed comparison + * of space and resid. On the other hand, a negative resid + * causes us to loop sending 0-length segments to the protocol. + */ + if (resid < 0) + return (EINVAL); + dontroute = + (flags & MSG_DONTROUTE) && (so->so_options & SO_DONTROUTE) == 0 && + (so->so_proto->pr_flags & PR_ATOMIC); + p->p_stats->p_ru.ru_msgsnd++; + if (control) + clen = control->m_len; +#define snderr(errno) { error = errno; splx(s); goto release; } + +restart: + error = sblock(&so->so_snd, SBLOCKWAIT(flags)); + if (error) + goto out; + do { + s = splnet(); + if (so->so_state & SS_CANTSENDMORE) + snderr(EPIPE); + if (so->so_error) + snderr(so->so_error); + if ((so->so_state & SS_ISCONNECTED) == 0) { + /* + * `sendto' and `sendmsg' is allowed on a connection- + * based socket if it supports implied connect. + * Return ENOTCONN if not connected and no address is + * supplied. + */ + if ((so->so_proto->pr_flags & PR_CONNREQUIRED) && + (so->so_proto->pr_flags & PR_IMPLOPCL) == 0) { + if ((so->so_state & SS_ISCONFIRMING) == 0 && + !(resid == 0 && clen != 0)) + snderr(ENOTCONN); + } else if (addr == 0) + snderr(so->so_proto->pr_flags & PR_CONNREQUIRED ? + ENOTCONN : EDESTADDRREQ); + } + space = sbspace(&so->so_snd); + if (flags & MSG_OOB) + space += 1024; + if ((atomic && resid > so->so_snd.sb_hiwat) || + clen > so->so_snd.sb_hiwat) + snderr(EMSGSIZE); + if (space < resid + clen && uio && + (atomic || space < so->so_snd.sb_lowat || space < clen)) { + if (so->so_state & SS_NBIO) + snderr(EWOULDBLOCK); + sbunlock(&so->so_snd); + error = sbwait(&so->so_snd); + splx(s); + if (error) + goto out; + goto restart; + } + splx(s); + mp = ⊤ + space -= clen; + do { + if (uio == NULL) { + /* + * Data is prepackaged in "top". + */ + resid = 0; + if (flags & MSG_EOR) + top->m_flags |= M_EOR; + } else do { + if (top == 0) { + MGETHDR(m, M_WAIT, MT_DATA); + mlen = MHLEN; + m->m_pkthdr.len = 0; + m->m_pkthdr.rcvif = (struct ifnet *)0; + } else { + MGET(m, M_WAIT, MT_DATA); + mlen = MLEN; + } + if (resid >= MINCLSIZE) { + MCLGET(m, M_WAIT); + if ((m->m_flags & M_EXT) == 0) + goto nopages; + mlen = MCLBYTES; + len = min(min(mlen, resid), space); + } else { +nopages: + len = min(min(mlen, resid), space); + /* + * For datagram protocols, leave room + * for protocol headers in first mbuf. + */ + if (atomic && top == 0 && len < mlen) + MH_ALIGN(m, len); + } + space -= len; + error = uiomove(mtod(m, caddr_t), (int)len, uio); + resid = uio->uio_resid; + m->m_len = len; + *mp = m; + top->m_pkthdr.len += len; + if (error) + goto release; + mp = &m->m_next; + if (resid <= 0) { + if (flags & MSG_EOR) + top->m_flags |= M_EOR; + break; + } + } while (space > 0 && atomic); + if (dontroute) + so->so_options |= SO_DONTROUTE; + s = splnet(); /* XXX */ + error = (*so->so_proto->pr_usrreq)(so, + (flags & MSG_OOB) ? PRU_SENDOOB : + /* + * If the user set MSG_EOF, the protocol + * understands this flag and nothing left to + * send then use PRU_SEND_EOF instead of PRU_SEND. + */ + ((flags & MSG_EOF) && + (so->so_proto->pr_flags & PR_IMPLOPCL) && + (resid <= 0)) ? + PRU_SEND_EOF : PRU_SEND, + top, addr, control); + splx(s); + if (dontroute) + so->so_options &= ~SO_DONTROUTE; + clen = 0; + control = 0; + top = 0; + mp = ⊤ + if (error) + goto release; + } while (resid && space > 0); + } while (resid); + +release: + sbunlock(&so->so_snd); +out: + if (top) + m_freem(top); + if (control) + m_freem(control); + return (error); +} + +/* + * Implement receive operations on a socket. + * We depend on the way that records are added to the sockbuf + * by sbappend*. In particular, each record (mbufs linked through m_next) + * must begin with an address if the protocol so specifies, + * followed by an optional mbuf or mbufs containing ancillary data, + * and then zero or more mbufs of data. + * In order to avoid blocking network interrupts for the entire time here, + * we splx() while doing the actual copy to user space. + * Although the sockbuf is locked, new data may still be appended, + * and thus we must maintain consistency of the sockbuf during that time. + * + * The caller may receive the data as a single mbuf chain by supplying + * an mbuf **mp0 for use in returning the chain. The uio is then used + * only for the count in uio_resid. + */ +int +soreceive(so, paddr, uio, mp0, controlp, flagsp) + register struct socket *so; + struct mbuf **paddr; + struct uio *uio; + struct mbuf **mp0; + struct mbuf **controlp; + int *flagsp; +{ + register struct mbuf *m, **mp; + register int flags, len, error, s, offset; + struct protosw *pr = so->so_proto; + struct mbuf *nextrecord; + int moff, type = 0; + int orig_resid = uio->uio_resid; + + mp = mp0; + if (paddr) + *paddr = 0; + if (controlp) + *controlp = 0; + if (flagsp) + flags = *flagsp &~ MSG_EOR; + else + flags = 0; + if (flags & MSG_OOB) { + m = m_get(M_WAIT, MT_DATA); + error = (*pr->pr_usrreq)(so, PRU_RCVOOB, + m, (struct mbuf *)(flags & MSG_PEEK), (struct mbuf *)0); + if (error) + goto bad; + do { + error = uiomove(mtod(m, caddr_t), + (int) min(uio->uio_resid, m->m_len), uio); + /*m = m_free(m);*/ + } while (uio->uio_resid && error == 0 && m); +bad: + if (m) + /*m_freem(m);*/ + return (error); + } + if (mp) + *mp = (struct mbuf *)0; + if (so->so_state & SS_ISCONFIRMING && uio->uio_resid) + (*pr->pr_usrreq)(so, PRU_RCVD, (struct mbuf *)0, + (struct mbuf *)0, (struct mbuf *)0); + +restart: + error = sblock(&so->so_rcv, SBLOCKWAIT(flags)); + if (error) + return (error); + s = splnet(); + + m = so->so_rcv.sb_mb; + /* + * If we have less data than requested, block awaiting more + * (subject to any timeout) if: + * 1. the current count is less than the low water mark, or + * 2. MSG_WAITALL is set, and it is possible to do the entire + * receive operation at once if we block (resid <= hiwat). + * 3. MSG_DONTWAIT is not set + * If MSG_WAITALL is set but resid is larger than the receive buffer, + * we have to do the receive in sections, and thus risk returning + * a short count if a timeout or signal occurs after we start. + */ + if (m == 0 || (((flags & MSG_DONTWAIT) == 0 && + so->so_rcv.sb_cc < uio->uio_resid) && + (so->so_rcv.sb_cc < so->so_rcv.sb_lowat || + ((flags & MSG_WAITALL) && uio->uio_resid <= so->so_rcv.sb_hiwat)) && + m->m_nextpkt == 0 && (pr->pr_flags & PR_ATOMIC) == 0)) { +#ifdef DIAGNOSTIC + if (m == 0 && so->so_rcv.sb_cc) + panic("receive 1"); +#endif + if (so->so_error) { + if (m) + goto dontblock; + error = so->so_error; + if ((flags & MSG_PEEK) == 0) + so->so_error = 0; + goto release; + } + if (so->so_state & SS_CANTRCVMORE) { + if (m) + goto dontblock; + else + goto release; + } + for (; m; m = m->m_next) + if (m->m_type == MT_OOBDATA || (m->m_flags & M_EOR)) { + m = so->so_rcv.sb_mb; + goto dontblock; + } + if ((so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING)) == 0 && + (so->so_proto->pr_flags & PR_CONNREQUIRED)) { + error = ENOTCONN; + goto release; + } + if (uio->uio_resid == 0) + goto release; + if ((so->so_state & SS_NBIO) || (flags & MSG_DONTWAIT)) { + error = EWOULDBLOCK; + goto release; + } + sbunlock(&so->so_rcv); + error = sbwait(&so->so_rcv); + splx(s); + if (error) + return (error); + goto restart; + } +dontblock: + if (uio->uio_procp) + uio->uio_procp->p_stats->p_ru.ru_msgrcv++; + nextrecord = m->m_nextpkt; + if (pr->pr_flags & PR_ADDR) { +#ifdef DIAGNOSTIC + if (m->m_type != MT_SONAME) + panic("receive 1a"); +#endif + orig_resid = 0; + if (flags & MSG_PEEK) { + if (paddr) + *paddr = m_copy(m, 0, m->m_len); + m = m->m_next; + } else { + sbfree(&so->so_rcv, m); + if (paddr) { + *paddr = m; + so->so_rcv.sb_mb = m->m_next; + m->m_next = 0; + m = so->so_rcv.sb_mb; + } else { + MFREE(m, so->so_rcv.sb_mb); + m = so->so_rcv.sb_mb; + } + } + } + while (m && m->m_type == MT_CONTROL && error == 0) { + if (flags & MSG_PEEK) { + if (controlp) + *controlp = m_copy(m, 0, m->m_len); + m = m->m_next; + } else { + sbfree(&so->so_rcv, m); + if (controlp) { +#ifndef __REACTOS__ + if (pr->pr_domain->dom_externalize && + mtod(m, struct cmsghdr *)->cmsg_type == + SCM_RIGHTS) + error = (*pr->pr_domain->dom_externalize)(m); + *controlp = m; + so->so_rcv.sb_mb = m->m_next; + m->m_next = 0; + m = so->so_rcv.sb_mb; +#endif + } else { + /*MFREE(m, so->so_rcv.sb_mb);*/ + m = so->so_rcv.sb_mb; + } + } + if (controlp) { + orig_resid = 0; + controlp = &(*controlp)->m_next; + } + } + if (m) { + if ((flags & MSG_PEEK) == 0) + m->m_nextpkt = nextrecord; + type = m->m_type; + if (type == MT_OOBDATA) + flags |= MSG_OOB; + } + moff = 0; + offset = 0; + while (m && uio->uio_resid > 0 && error == 0) { + if (m->m_type == MT_OOBDATA) { + if (type != MT_OOBDATA) + break; + } else if (type == MT_OOBDATA) + break; +#ifdef DIAGNOSTIC + else if (m->m_type != MT_DATA && m->m_type != MT_HEADER) + panic("receive 3"); +#endif + so->so_state &= ~SS_RCVATMARK; + len = uio->uio_resid; + if (so->so_oobmark && len > so->so_oobmark - offset) + len = so->so_oobmark - offset; + if (len > m->m_len - moff) + len = m->m_len - moff; + /* + * If mp is set, just pass back the mbufs. + * Otherwise copy them out via the uio, then free. + * Sockbuf must be consistent here (points to current mbuf, + * it points to next record) when we drop priority; + * we must note any additions to the sockbuf when we + * block interrupts again. + */ + if (mp == 0) { + splx(s); + error = uiomove(mtod(m, caddr_t) + moff, (int)len, uio); + s = splnet(); + } else + uio->uio_resid -= len; + if (len == m->m_len - moff) { + if (m->m_flags & M_EOR) + flags |= MSG_EOR; + if (flags & MSG_PEEK) { + m = m->m_next; + moff = 0; + } else { + nextrecord = m->m_nextpkt; + sbfree(&so->so_rcv, m); + if (mp) { + *mp = m; + mp = &m->m_next; + so->so_rcv.sb_mb = m = m->m_next; + *mp = (struct mbuf *)0; + } else { + /*MFREE(m, so->so_rcv.sb_mb);*/ + m = so->so_rcv.sb_mb; + } + if (m) + m->m_nextpkt = nextrecord; + } + } else { + if (flags & MSG_PEEK) + moff += len; + else { + if (mp) + *mp = m_copym(m, 0, len, M_WAIT); + m->m_data += len; + m->m_len -= len; + so->so_rcv.sb_cc -= len; + } + } + if (so->so_oobmark) { + if ((flags & MSG_PEEK) == 0) { + so->so_oobmark -= len; + if (so->so_oobmark == 0) { + so->so_state |= SS_RCVATMARK; + break; + } + } else { + offset += len; + if (offset == so->so_oobmark) + break; + } + } + if (flags & MSG_EOR) + break; + /* + * If the MSG_WAITALL flag is set (for non-atomic socket), + * we must not quit until "uio->uio_resid == 0" or an error + * termination. If a signal/timeout occurs, return + * with a short count but without error. + * Keep sockbuf locked against other readers. + */ + while (flags & MSG_WAITALL && m == 0 && uio->uio_resid > 0 && + !sosendallatonce(so) && !nextrecord) { + if (so->so_error || so->so_state & SS_CANTRCVMORE) + break; + error = sbwait(&so->so_rcv); + if (error) { + sbunlock(&so->so_rcv); + splx(s); + return (0); + } + m = so->so_rcv.sb_mb; + if (m) + nextrecord = m->m_nextpkt; + } + } + + if (m && pr->pr_flags & PR_ATOMIC) { + flags |= MSG_TRUNC; + if ((flags & MSG_PEEK) == 0) + (void) sbdroprecord(&so->so_rcv); + } + if ((flags & MSG_PEEK) == 0) { + if (m == 0) + so->so_rcv.sb_mb = nextrecord; + if (pr->pr_flags & PR_WANTRCVD && so->so_pcb) + (*pr->pr_usrreq)(so, PRU_RCVD, (struct mbuf *)0, + (struct mbuf *)flags, (struct mbuf *)0); + } + if (orig_resid == uio->uio_resid && orig_resid && + (flags & MSG_EOR) == 0 && (so->so_state & SS_CANTRCVMORE) == 0) { + sbunlock(&so->so_rcv); + splx(s); + goto restart; + } + + if (flagsp) + *flagsp |= flags; +release: + sbunlock(&so->so_rcv); + splx(s); + return (error); +} + +int +soshutdown(so, how) + register struct socket *so; + register int how; +{ + register struct protosw *pr = so->so_proto; + + how++; + if (how & FREAD) + sorflush(so); + if (how & FWRITE) + return ((*pr->pr_usrreq)(so, PRU_SHUTDOWN, + (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0)); + return (0); +} + +void +sorflush(so) + register struct socket *so; +{ + register struct sockbuf *sb = &so->so_rcv; + register struct protosw *pr = so->so_proto; + register int s; + struct sockbuf asb; + + sb->sb_flags |= SB_NOINTR; + (void) sblock(sb, M_WAITOK); + s = splimp(); + socantrcvmore(so); + sbunlock(sb); + asb = *sb; + bzero((caddr_t)sb, sizeof (*sb)); + splx(s); + if (pr->pr_flags & PR_RIGHTS && pr->pr_domain->dom_dispose) + (*pr->pr_domain->dom_dispose)(asb.sb_mb); + sbrelease(&asb); +} + +int +sosetopt(so, level, optname, m0) + register struct socket *so; + int level, optname; + struct mbuf *m0; +{ + int error = 0; + register struct mbuf *m = m0; + + if (level != SOL_SOCKET) { + if (so->so_proto && so->so_proto->pr_ctloutput) + return ((*so->so_proto->pr_ctloutput) + (PRCO_SETOPT, so, level, optname, &m0)); + error = ENOPROTOOPT; + } else { + switch (optname) { + + case SO_LINGER: + if (m == NULL || m->m_len != sizeof (struct linger)) { + error = EINVAL; + goto bad; + } + so->so_linger = mtod(m, struct linger *)->l_linger; + /* fall thru... */ + + case SO_DEBUG: + case SO_KEEPALIVE: + case SO_DONTROUTE: + case SO_USELOOPBACK: + case SO_BROADCAST: + case SO_REUSEADDR: + /*case SO_REUSEPORT:*/ + case SO_OOBINLINE: + if (m == NULL || m->m_len < sizeof (int)) { + error = EINVAL; + goto bad; + } + if (*mtod(m, int *)) + so->so_options |= optname; + else + so->so_options &= ~optname; + break; + + case SO_SNDBUF: + case SO_RCVBUF: + case SO_SNDLOWAT: + case SO_RCVLOWAT: + if (m == NULL || m->m_len < sizeof (int)) { + error = EINVAL; + goto bad; + } + switch (optname) { + + case SO_SNDBUF: + case SO_RCVBUF: + if (sbreserve(optname == SO_SNDBUF ? + &so->so_snd : &so->so_rcv, + (u_long) *mtod(m, int *)) == 0) { + error = ENOBUFS; + goto bad; + } + break; + + case SO_SNDLOWAT: + so->so_snd.sb_lowat = *mtod(m, int *); + break; + case SO_RCVLOWAT: + so->so_rcv.sb_lowat = *mtod(m, int *); + break; + } + break; + + case SO_SNDTIMEO: + case SO_RCVTIMEO: + { + struct timeval *tv; + short val; + + if (m == NULL || m->m_len < sizeof (*tv)) { + error = EINVAL; + goto bad; + } + tv = mtod(m, struct timeval *); + if (tv->tv_sec > SHRT_MAX / hz - hz) { + error = EDOM; + goto bad; + } + val = tv->tv_sec * hz + tv->tv_usec / tick; + + switch (optname) { + + case SO_SNDTIMEO: + so->so_snd.sb_timeo = val; + break; + case SO_RCVTIMEO: + so->so_rcv.sb_timeo = val; + break; + } + break; + } + + default: + error = ENOPROTOOPT; + break; + } + if (error == 0 && so->so_proto && so->so_proto->pr_ctloutput) { + (void) ((*so->so_proto->pr_ctloutput) + (PRCO_SETOPT, so, level, optname, &m0)); + m = NULL; /* freed by protocol */ + } + } +bad: + if (m) + /*(void) m_free(m);*/ + return (error); +} + +int +sogetopt(so, level, optname, mp) + register struct socket *so; + int level, optname; + struct mbuf **mp; +{ + register struct mbuf *m; + + if (level != SOL_SOCKET) { + if (so->so_proto && so->so_proto->pr_ctloutput) { + return ((*so->so_proto->pr_ctloutput) + (PRCO_GETOPT, so, level, optname, mp)); + } else + return (ENOPROTOOPT); + } else { + m = m_get(M_WAIT, MT_SOOPTS); + m->m_len = sizeof (int); + + switch (optname) { + + case SO_LINGER: + m->m_len = sizeof (struct linger); + mtod(m, struct linger *)->l_onoff = + so->so_options & SO_LINGER; + mtod(m, struct linger *)->l_linger = so->so_linger; + break; + + case SO_USELOOPBACK: + case SO_DONTROUTE: + case SO_DEBUG: + case SO_KEEPALIVE: + case SO_REUSEADDR: + /*case SO_REUSEPORT: */ + case SO_BROADCAST: + case SO_OOBINLINE: + *mtod(m, int *) = so->so_options & optname; + break; + + case SO_TYPE: + *mtod(m, int *) = so->so_type; + break; + + case SO_ERROR: + *mtod(m, int *) = so->so_error; + so->so_error = 0; + break; + + case SO_SNDBUF: + *mtod(m, int *) = so->so_snd.sb_hiwat; + break; + + case SO_RCVBUF: + *mtod(m, int *) = so->so_rcv.sb_hiwat; + break; + + case SO_SNDLOWAT: + *mtod(m, int *) = so->so_snd.sb_lowat; + break; + + case SO_RCVLOWAT: + *mtod(m, int *) = so->so_rcv.sb_lowat; + break; + + case SO_SNDTIMEO: + case SO_RCVTIMEO: + { + int val = (optname == SO_SNDTIMEO ? + so->so_snd.sb_timeo : so->so_rcv.sb_timeo); + + m->m_len = sizeof(struct timeval); + mtod(m, struct timeval *)->tv_sec = val / hz; + mtod(m, struct timeval *)->tv_usec = + (val % hz) * tick; + break; + } + + default: + (void)m_free(m); + return (ENOPROTOOPT); + } + *mp = m; + return (0); + } +} + +void +sohasoutofband(so) + register struct socket *so; +{ + struct proc *p; + + if (so->so_pgid < 0) + gsignal(-so->so_pgid, SIGURG); + else if (so->so_pgid > 0 && (p = pfind(so->so_pgid)) != 0) + psignal(p, SIGURG); + selwakeup(&so->so_rcv.sb_sel); +} diff --git a/reactos/drivers/lib/oskittcp/oskittcp/uipc_socket2.c b/reactos/drivers/lib/oskittcp/oskittcp/uipc_socket2.c new file mode 100644 index 00000000000..f1f7d74c819 --- /dev/null +++ b/reactos/drivers/lib/oskittcp/oskittcp/uipc_socket2.c @@ -0,0 +1,812 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)uipc_socket2.c 8.1 (Berkeley) 6/10/93 + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/proc.h> +#include <sys/file.h> +#include <sys/buf.h> +#include <sys/malloc.h> +#include <sys/mbuf.h> +#include <sys/protosw.h> +#include <sys/stat.h> +#include <sys/socket.h> +#include <sys/socketvar.h> +#include <sys/signalvar.h> +#include <oskittcp.h> + +/* + * Primitive routines for operating on sockets and socket buffers + */ + +/* strings for sleep message: */ +char netio[] = "netio"; +char netcon[] = "netcon"; +char netcls[] = "netcls"; + +/* these two are sysctl visible */ +u_long sb_max = SB_MAX; /* patchable */ + +u_long sb_efficiency = 8; /* parameter for sbreserve() */ + +int sominqueue = 0; /* minimum queue override */ + +/* + * Procedures to manipulate state flags of socket + * and do appropriate wakeups. Normal sequence from the + * active (originating) side is that soisconnecting() is + * called during processing of connect() call, + * resulting in an eventual call to soisconnected() if/when the + * connection is established. When the connection is torn down + * soisdisconnecting() is called during processing of disconnect() call, + * and soisdisconnected() is called when the connection to the peer + * is totally severed. The semantics of these routines are such that + * connectionless protocols can call soisconnected() and soisdisconnected() + * only, bypassing the in-progress calls when setting up a ``connection'' + * takes no time. + * + * From the passive side, a socket is created with + * two queues of sockets: so_q0 for connections in progress + * and so_q for connections already made and awaiting user acceptance. + * As a protocol is preparing incoming connections, it creates a socket + * structure queued on so_q0 by calling sonewconn(). When the connection + * is established, soisconnected() is called, and transfers the + * socket structure to so_q, making it available to accept(). + * + * If a socket is closed with sockets on either + * so_q0 or so_q, these sockets are dropped. + * + * If higher level protocols are implemented in + * the kernel, the wakeups done here will sometimes + * cause software-interrupt process scheduling. + */ + +void +soisconnecting(so) + register struct socket *so; +{ + + so->so_state &= ~(SS_ISCONNECTED|SS_ISDISCONNECTING); + so->so_state |= SS_ISCONNECTING; +} + +void +soisconnected(so) + register struct socket *so; +{ + register struct socket *head = so->so_head; + + so->so_state &= ~(SS_ISCONNECTING|SS_ISDISCONNECTING|SS_ISCONFIRMING); + so->so_state |= SS_ISCONNECTED; + if (head && soqremque(so, 0)) { + soqinsque(head, so, 1); + sorwakeup(head); + wakeup((caddr_t)&head->so_timeo); + } else { + wakeup((caddr_t)&so->so_timeo); + sorwakeup(so); + sowwakeup(so); + } + + if( OtcpEvent.SocketConnectIndication ) + OtcpEvent.SocketConnectIndication + ( OtcpEvent.ClientData, + so, + so->so_connection ); +} + +void +soisdisconnecting(so) + register struct socket *so; +{ + + so->so_state &= ~SS_ISCONNECTING; + so->so_state |= (SS_ISDISCONNECTING|SS_CANTRCVMORE|SS_CANTSENDMORE); + wakeup((caddr_t)&so->so_timeo); + sowwakeup(so); + sorwakeup(so); +} + +void +soisdisconnected(so) + register struct socket *so; +{ + + so->so_state &= ~(SS_ISCONNECTING|SS_ISCONNECTED|SS_ISDISCONNECTING); + so->so_state |= (SS_CANTRCVMORE|SS_CANTSENDMORE); + wakeup((caddr_t)&so->so_timeo); + sowwakeup(so); + sorwakeup(so); +} + +/* + * When an attempt at a new connection is noted on a socket + * which accepts connections, sonewconn is called. If the + * connection is possible (subject to space constraints, etc.) + * then we allocate a new structure, propoerly linked into the + * data structure of the original socket, and return this. + * Connstatus may be 0, or SO_ISCONFIRMING, or SO_ISCONNECTED. + * + * Currently, sonewconn() is defined as sonewconn1() in socketvar.h + * to catch calls that are missing the (new) second parameter. + */ +struct socket * +sonewconn1(head, connstatus) + register struct socket *head; + int connstatus; +{ + register struct socket *so; + int soqueue = connstatus ? 1 : 0; + + if ((head->so_qlen + head->so_q0len > 3 * head->so_qlimit / 2) && + (head->so_qlen + head->so_q0len > sominqueue)) + return ((struct socket *)0); + MALLOC(so, struct socket *, sizeof(*so), M_SOCKET, M_DONTWAIT); + if (so == NULL) + return ((struct socket *)0); + bzero((caddr_t)so, sizeof(*so)); + so->so_type = head->so_type; + so->so_options = head->so_options &~ SO_ACCEPTCONN; + so->so_linger = head->so_linger; + so->so_state = head->so_state | SS_NOFDREF; + so->so_proto = head->so_proto; + so->so_timeo = head->so_timeo; + so->so_pgid = head->so_pgid; + (void) soreserve(so, head->so_snd.sb_hiwat, head->so_rcv.sb_hiwat); + soqinsque(head, so, soqueue); + if ((*so->so_proto->pr_usrreq)(so, PRU_ATTACH, + (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0)) { + (void) soqremque(so, soqueue); + (void) free((caddr_t)so, M_SOCKET); + return ((struct socket *)0); + } + if (connstatus) { + sorwakeup(head); + wakeup((caddr_t)&head->so_timeo); + so->so_state |= connstatus; + } + return (so); +} + +void +soqinsque(head, so, q) + register struct socket *head, *so; + int q; +{ + + register struct socket **prev; + so->so_head = head; + if (q == 0) { + head->so_q0len++; + so->so_q0 = 0; + for (prev = &(head->so_q0); *prev; ) + prev = &((*prev)->so_q0); + } else { + head->so_qlen++; + so->so_q = 0; + for (prev = &(head->so_q); *prev; ) + prev = &((*prev)->so_q); + } + *prev = so; +} + +int +soqremque(so, q) + register struct socket *so; + int q; +{ + register struct socket *head, *prev, *next; + + head = so->so_head; + prev = head; + for (;;) { + next = q ? prev->so_q : prev->so_q0; + if (next == so) + break; + if (next == 0) + return (0); + prev = next; + } + if (q == 0) { + prev->so_q0 = next->so_q0; + head->so_q0len--; + } else { + prev->so_q = next->so_q; + head->so_qlen--; + } + next->so_q0 = next->so_q = 0; + next->so_head = 0; + return (1); +} + +/* + * Socantsendmore indicates that no more data will be sent on the + * socket; it would normally be applied to a socket when the user + * informs the system that no more data is to be sent, by the protocol + * code (in case PRU_SHUTDOWN). Socantrcvmore indicates that no more data + * will be received, and will normally be applied to the socket by a + * protocol when it detects that the peer will send no more data. + * Data queued for reading in the socket may yet be read. + */ + +void +socantsendmore(so) + struct socket *so; +{ + + so->so_state |= SS_CANTSENDMORE; + sowwakeup(so); +} + +void +socantrcvmore(so) + struct socket *so; +{ + + so->so_state |= SS_CANTRCVMORE; + sorwakeup(so); +} + +/* + * Wait for data to arrive at/drain from a socket buffer. + */ +int +sbwait(sb) + struct sockbuf *sb; +{ + + sb->sb_flags |= SB_WAIT; + return (tsleep((caddr_t)&sb->sb_cc, + (sb->sb_flags & SB_NOINTR) ? PSOCK : PSOCK | PCATCH, netio, + sb->sb_timeo)); +} + +/* + * Lock a sockbuf already known to be locked; + * return any error returned from sleep (EINTR). + */ +int +sb_lock(sb) + register struct sockbuf *sb; +{ + int error; + + while (sb->sb_flags & SB_LOCK) { + sb->sb_flags |= SB_WANT; + error = tsleep((caddr_t)&sb->sb_flags, + (sb->sb_flags & SB_NOINTR) ? PSOCK : PSOCK|PCATCH, + netio, 0); + if (error) + return (error); + } + sb->sb_flags |= SB_LOCK; + return (0); +} + +/* + * Wakeup processes waiting on a socket buffer. + * Do asynchronous notification via SIGIO + * if the socket has the SS_ASYNC flag set. + */ +void +sowakeup(so, sb) + register struct socket *so; + register struct sockbuf *sb; +{ + struct proc *p; + + selwakeup(&sb->sb_sel); +#ifndef OSKIT + /* + * in the OS Kit, we do not want notifications to stop + */ + sb->sb_flags &= ~SB_SEL; +#endif + if (sb->sb_flags & SB_WAIT) { + sb->sb_flags &= ~SB_WAIT; + wakeup((caddr_t)&sb->sb_cc); + } + if (so->so_state & SS_ASYNC) { + if (so->so_pgid < 0) + gsignal(-so->so_pgid, SIGIO); + else if (so->so_pgid > 0 && (p = pfind(so->so_pgid)) != 0) + psignal(p, SIGIO); + } +} + +/* + * Socket buffer (struct sockbuf) utility routines. + * + * Each socket contains two socket buffers: one for sending data and + * one for receiving data. Each buffer contains a queue of mbufs, + * information about the number of mbufs and amount of data in the + * queue, and other fields allowing select() statements and notification + * on data availability to be implemented. + * + * Data stored in a socket buffer is maintained as a list of records. + * Each record is a list of mbufs chained together with the m_next + * field. Records are chained together with the m_nextpkt field. The upper + * level routine soreceive() expects the following conventions to be + * observed when placing information in the receive buffer: + * + * 1. If the protocol requires each message be preceded by the sender's + * name, then a record containing that name must be present before + * any associated data (mbuf's must be of type MT_SONAME). + * 2. If the protocol supports the exchange of ``access rights'' (really + * just additional data associated with the message), and there are + * ``rights'' to be received, then a record containing this data + * should be present (mbuf's must be of type MT_RIGHTS). + * 3. If a name or rights record exists, then it must be followed by + * a data record, perhaps of zero length. + * + * Before using a new socket structure it is first necessary to reserve + * buffer space to the socket, by calling sbreserve(). This should commit + * some of the available buffer space in the system buffer pool for the + * socket (currently, it does nothing but enforce limits). The space + * should be released by calling sbrelease() when the socket is destroyed. + */ + +int +soreserve(so, sndcc, rcvcc) + register struct socket *so; + u_long sndcc, rcvcc; +{ + + if (sbreserve(&so->so_snd, sndcc) == 0) + goto bad; + if (sbreserve(&so->so_rcv, rcvcc) == 0) + goto bad2; + if (so->so_rcv.sb_lowat == 0) + so->so_rcv.sb_lowat = 1; + if (so->so_snd.sb_lowat == 0) + so->so_snd.sb_lowat = MCLBYTES; + if (so->so_snd.sb_lowat > so->so_snd.sb_hiwat) + so->so_snd.sb_lowat = so->so_snd.sb_hiwat; + return (0); +bad2: + sbrelease(&so->so_snd); +bad: + return (ENOBUFS); +} + +/* + * Allot mbufs to a sockbuf. + * Attempt to scale mbmax so that mbcnt doesn't become limiting + * if buffering efficiency is near the normal case. + */ +int +sbreserve(sb, cc) + struct sockbuf *sb; + u_long cc; +{ + + if (cc > sb_max * MCLBYTES / (MSIZE + MCLBYTES)) + return (0); + sb->sb_hiwat = cc; + sb->sb_mbmax = min(cc * sb_efficiency, sb_max); + if (sb->sb_lowat > sb->sb_hiwat) + sb->sb_lowat = sb->sb_hiwat; + return (1); +} + +/* + * Free mbufs held by a socket, and reserved mbuf space. + */ +void +sbrelease(sb) + struct sockbuf *sb; +{ + + sbflush(sb); + sb->sb_hiwat = sb->sb_mbmax = 0; +} + +/* + * Routines to add and remove + * data from an mbuf queue. + * + * The routines sbappend() or sbappendrecord() are normally called to + * append new mbufs to a socket buffer, after checking that adequate + * space is available, comparing the function sbspace() with the amount + * of data to be added. sbappendrecord() differs from sbappend() in + * that data supplied is treated as the beginning of a new record. + * To place a sender's address, optional access rights, and data in a + * socket receive buffer, sbappendaddr() should be used. To place + * access rights and data in a socket receive buffer, sbappendrights() + * should be used. In either case, the new data begins a new record. + * Note that unlike sbappend() and sbappendrecord(), these routines check + * for the caller that there will be enough space to store the data. + * Each fails if there is not enough space, or if it cannot find mbufs + * to store additional information in. + * + * Reliable protocols may use the socket send buffer to hold data + * awaiting acknowledgement. Data is normally copied from a socket + * send buffer in a protocol with m_copy for output to a peer, + * and then removing the data from the socket buffer with sbdrop() + * or sbdroprecord() when the data is acknowledged by the peer. + */ + +/* + * Append mbuf chain m to the last record in the + * socket buffer sb. The additional space associated + * the mbuf chain is recorded in sb. Empty mbufs are + * discarded and mbufs are compacted where possible. + */ +void +sbappend(so, sb, m) + struct socket *so; + struct sockbuf *sb; + struct mbuf *m; +{ + register struct mbuf *n; + + if (m == 0) + return; + n = sb->sb_mb; + if (n) { + while (n->m_nextpkt) + n = n->m_nextpkt; + do { + if (n->m_flags & M_EOR) { + sbappendrecord(sb, m); /* XXXXXX!!!! */ + return; + } + } while (n->m_next && (n = n->m_next)); + } + OskitDumpBuffer( m->m_data, m->m_len ); + if( OtcpEvent.SocketDataAvailable ) + OtcpEvent.SocketDataAvailable + ( OtcpEvent.ClientData, + so, + so->so_connection, + m->m_data, m->m_len ); +} + +#ifdef SOCKBUF_DEBUG +void +sbcheck(sb) + register struct sockbuf *sb; +{ + register struct mbuf *m; + register int len = 0, mbcnt = 0; + + for (m = sb->sb_mb; m; m = m->m_next) { + len += m->m_len; + mbcnt += MSIZE; + if (m->m_flags & M_EXT) + mbcnt += m->m_ext.ext_size; + if (m->m_nextpkt) + panic("sbcheck nextpkt"); + } + if (len != sb->sb_cc || mbcnt != sb->sb_mbcnt) { + printf("cc %d != %d || mbcnt %d != %d\n", len, sb->sb_cc, + mbcnt, sb->sb_mbcnt); + panic("sbcheck"); + } +} +#endif + +/* + * As above, except the mbuf chain + * begins a new record. + */ +void +sbappendrecord(sb, m0) + register struct sockbuf *sb; + register struct mbuf *m0; +{ + register struct mbuf *m; + + if (m0 == 0) + return; + m = sb->sb_mb; + if (m) + while (m->m_nextpkt) + m = m->m_nextpkt; + /* + * Put the first mbuf on the queue. + * Note this permits zero length records. + */ + sballoc(sb, m0); + if (m) + m->m_nextpkt = m0; + else + sb->sb_mb = m0; + m = m0->m_next; + m0->m_next = 0; + if (m && (m0->m_flags & M_EOR)) { + m0->m_flags &= ~M_EOR; + m->m_flags |= M_EOR; + } + sbcompress(sb, m, m0); +} + +/* + * As above except that OOB data + * is inserted at the beginning of the sockbuf, + * but after any other OOB data. + */ +void +sbinsertoob(sb, m0) + register struct sockbuf *sb; + register struct mbuf *m0; +{ + register struct mbuf *m; + register struct mbuf **mp; + + if (m0 == 0) + return; + for (mp = &sb->sb_mb; *mp ; mp = &((*mp)->m_nextpkt)) { + m = *mp; + again: + switch (m->m_type) { + + case MT_OOBDATA: + continue; /* WANT next train */ + + case MT_CONTROL: + m = m->m_next; + if (m) + goto again; /* inspect THIS train further */ + } + break; + } + /* + * Put the first mbuf on the queue. + * Note this permits zero length records. + */ + sballoc(sb, m0); + m0->m_nextpkt = *mp; + *mp = m0; + m = m0->m_next; + m0->m_next = 0; + if (m && (m0->m_flags & M_EOR)) { + m0->m_flags &= ~M_EOR; + m->m_flags |= M_EOR; + } + sbcompress(sb, m, m0); +} + +/* + * Append address and data, and optionally, control (ancillary) data + * to the receive queue of a socket. If present, + * m0 must include a packet header with total length. + * Returns 0 if no space in sockbuf or insufficient mbufs. + */ +int +sbappendaddr(sb, asa, m0, control) + register struct sockbuf *sb; + struct sockaddr *asa; + struct mbuf *m0, *control; +{ + register struct mbuf *m, *n; + int space = /*asa->sa_len;*/ sizeof(struct sockaddr); + +if (m0 && (m0->m_flags & M_PKTHDR) == 0) +panic("sbappendaddr"); + if (m0) + space += m0->m_pkthdr.len; + for (n = control; n; n = n->m_next) { + space += n->m_len; + if (n->m_next == 0) /* keep pointer to last control buf */ + break; + } + if (space > sbspace(sb)) + return (0); + MGET(m, M_DONTWAIT, MT_SONAME); + if (m == 0) + return (0); + m->m_len = sizeof(struct sockaddr); + bcopy((caddr_t)asa, mtod(m, caddr_t), sizeof(struct sockaddr)); + if (n) + n->m_next = m0; /* concatenate data to control */ + else + control = m0; + m->m_next = control; + for (n = m; n; n = n->m_next) + sballoc(sb, n); + n = sb->sb_mb; + if (n) { + while (n->m_nextpkt) + n = n->m_nextpkt; + n->m_nextpkt = m; + } else + sb->sb_mb = m; + return (1); +} + +int +sbappendcontrol(sb, m0, control) + struct sockbuf *sb; + struct mbuf *control, *m0; +{ + register struct mbuf *m, *n; + int space = 0; + + if (control == 0) + panic("sbappendcontrol"); + for (m = control; ; m = m->m_next) { + space += m->m_len; + if (m->m_next == 0) + break; + } + n = m; /* save pointer to last control buffer */ + for (m = m0; m; m = m->m_next) + space += m->m_len; + if (space > sbspace(sb)) + return (0); + n->m_next = m0; /* concatenate data to control */ + for (m = control; m; m = m->m_next) + sballoc(sb, m); + n = sb->sb_mb; + if (n) { + while (n->m_nextpkt) + n = n->m_nextpkt; + n->m_nextpkt = control; + } else + sb->sb_mb = control; + return (1); +} + +/* + * Compress mbuf chain m into the socket + * buffer sb following mbuf n. If n + * is null, the buffer is presumed empty. + */ +void +sbcompress(sb, m, n) + register struct sockbuf *sb; + register struct mbuf *m, *n; +{ + register int eor = 0; + register struct mbuf *o; + + while (m) { + eor |= m->m_flags & M_EOR; + if (m->m_len == 0 && + (eor == 0 || + (((o = m->m_next) || (o = n)) && + o->m_type == m->m_type))) { + m = m_free(m); + continue; + } + if (n && (n->m_flags & (M_EXT | M_EOR)) == 0 && + (n->m_data + n->m_len + m->m_len) < &n->m_dat[MLEN] && + n->m_type == m->m_type) { + bcopy(mtod(m, caddr_t), mtod(n, caddr_t) + n->m_len, + (unsigned)m->m_len); + n->m_len += m->m_len; + sb->sb_cc += m->m_len; + m = m_free(m); + continue; + } + if (n) + n->m_next = m; + else + sb->sb_mb = m; + sballoc(sb, m); + n = m; + m->m_flags &= ~M_EOR; + m = m->m_next; + n->m_next = 0; + } + if (eor) { + if (n) + n->m_flags |= eor; + else + printf("semi-panic: sbcompress\n"); + } +} + +/* + * Free all mbufs in a sockbuf. + * Check that all resources are reclaimed. + */ +void +sbflush(sb) + register struct sockbuf *sb; +{ + + if (sb->sb_flags & SB_LOCK) + panic("sbflush"); + while (sb->sb_mbcnt) + sbdrop(sb, (int)sb->sb_cc); + if (sb->sb_cc || sb->sb_mb) + panic("sbflush 2"); +} + +/* + * Drop data from (the front of) a sockbuf. + */ +void +sbdrop(sb, len) + register struct sockbuf *sb; + register int len; +{ + register struct mbuf *m, *mn; + struct mbuf *next; + + next = (m = sb->sb_mb) ? m->m_nextpkt : 0; + while (len > 0) { + if (m == 0) { + if (next == 0) + panic("sbdrop"); + m = next; + next = m->m_nextpkt; + continue; + } + if (m->m_len > len) { + m->m_len -= len; + m->m_data += len; + sb->sb_cc -= len; + break; + } + len -= m->m_len; + sbfree(sb, m); + MFREE(m, mn); + m = mn; + } + while (m && m->m_len == 0) { + sbfree(sb, m); + MFREE(m, mn); + m = mn; + } + if (m) { + sb->sb_mb = m; + m->m_nextpkt = next; + } else + sb->sb_mb = next; +} + +/* + * Drop a record off the front of a sockbuf + * and move the next record to the front. + */ +void +sbdroprecord(sb) + register struct sockbuf *sb; +{ + register struct mbuf *m, *mn; + + m = sb->sb_mb; + if (m) { + sb->sb_mb = m->m_nextpkt; + do { + sbfree(sb, m); + MFREE(m, mn); + m = mn; + } while (m); + } +} From 76fea742f0fd8a611970178e043ac118b7462242 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Sat, 29 May 2004 00:56:56 +0000 Subject: [PATCH 1256/1463] moved oskittcp as it is a driver lib. svn path=/trunk/; revision=9529 --- reactos/lib/oskittcp/README | 5 - .../include/freebsd/dev/include/vm/vm.h | 42 - .../include/freebsd/dev/include/vm/vm_param.h | 27 - .../include/freebsd/net/include/arpa/inet.h | 53 - .../include/freebsd/net/include/imp.h | 1 - .../include/freebsd/src/sys/machine/ansi.h | 96 - .../include/freebsd/src/sys/machine/cpufunc.h | 460 ---- .../include/freebsd/src/sys/machine/endian.h | 119 - .../include/freebsd/src/sys/machine/ipl.h | 41 - .../include/freebsd/src/sys/machine/limits.h | 96 - .../include/freebsd/src/sys/machine/param.h | 161 -- .../include/freebsd/src/sys/machine/proc.h | 49 - .../include/freebsd/src/sys/machine/signal.h | 80 - .../include/freebsd/src/sys/machine/spl.h | 221 -- .../include/freebsd/src/sys/machine/stdarg.h | 63 - .../include/freebsd/src/sys/machine/trap.h | 95 - .../include/freebsd/src/sys/machine/types.h | 65 - .../include/freebsd/src/sys/machine/vmparam.h | 136 -- .../oskittcp/include/freebsd/src/sys/net/if.h | 394 --- .../include/freebsd/src/sys/net/if_arp.h | 92 - .../include/freebsd/src/sys/net/netisr.h | 86 - .../include/freebsd/src/sys/net/radix.h | 170 -- .../include/freebsd/src/sys/net/raw_cb.h | 74 - .../include/freebsd/src/sys/net/route.h | 258 -- .../freebsd/src/sys/netinet/if_ether.h | 237 -- .../freebsd/src/sys/netinet/igmp_var.h | 91 - .../include/freebsd/src/sys/netinet/in.h | 262 -- .../include/freebsd/src/sys/netinet/in_pcb.h | 107 - .../freebsd/src/sys/netinet/in_systm.h | 61 - .../include/freebsd/src/sys/netinet/in_var.h | 233 -- .../include/freebsd/src/sys/netinet/ip.h | 174 -- .../include/freebsd/src/sys/netinet/ip_fw.h | 145 -- .../include/freebsd/src/sys/netinet/ip_icmp.h | 184 -- .../include/freebsd/src/sys/netinet/ip_var.h | 210 -- .../include/freebsd/src/sys/netinet/tcp.h | 121 - .../freebsd/src/sys/netinet/tcp_debug.h | 64 - .../include/freebsd/src/sys/netinet/tcp_fsm.h | 91 - .../include/freebsd/src/sys/netinet/tcp_seq.h | 86 - .../freebsd/src/sys/netinet/tcp_timer.h | 136 -- .../include/freebsd/src/sys/netinet/tcp_var.h | 387 --- .../include/freebsd/src/sys/netinet/tcpip.h | 74 - .../include/freebsd/src/sys/netinet/udp.h | 50 - .../include/freebsd/src/sys/netinet/udp_var.h | 105 - .../include/freebsd/src/sys/sys/buf.h | 254 -- .../include/freebsd/src/sys/sys/callout.h | 56 - .../include/freebsd/src/sys/sys/cdefs.h | 147 -- .../include/freebsd/src/sys/sys/domain.h | 73 - .../include/freebsd/src/sys/sys/errno.h | 168 -- .../include/freebsd/src/sys/sys/fcntl.h | 190 -- .../include/freebsd/src/sys/sys/file.h | 83 - .../include/freebsd/src/sys/sys/filedesc.h | 108 - .../include/freebsd/src/sys/sys/filio.h | 57 - .../include/freebsd/src/sys/sys/ioccom.h | 68 - .../include/freebsd/src/sys/sys/ioctl.h | 84 - .../include/freebsd/src/sys/sys/kernel.h | 116 - .../include/freebsd/src/sys/sys/libkern.h | 64 - .../include/freebsd/src/sys/sys/malloc.h | 333 --- .../include/freebsd/src/sys/sys/mbuf.h | 512 ---- .../include/freebsd/src/sys/sys/param.h | 224 -- .../include/freebsd/src/sys/sys/proc.h | 336 --- .../include/freebsd/src/sys/sys/protosw.h | 221 -- .../include/freebsd/src/sys/sys/queue.h | 391 --- .../include/freebsd/src/sys/sys/resource.h | 127 - .../include/freebsd/src/sys/sys/resourcevar.h | 97 - .../include/freebsd/src/sys/sys/rtprio.h | 69 - .../include/freebsd/src/sys/sys/select.h | 63 - .../include/freebsd/src/sys/sys/signal.h | 194 -- .../include/freebsd/src/sys/sys/signalvar.h | 170 -- .../include/freebsd/src/sys/sys/socket.h | 357 --- .../include/freebsd/src/sys/sys/socketvar.h | 264 -- .../include/freebsd/src/sys/sys/sockio.h | 88 - .../include/freebsd/src/sys/sys/stat.h | 203 -- .../include/freebsd/src/sys/sys/sysctl.h | 412 ---- .../include/freebsd/src/sys/sys/syslimits.h | 65 - .../include/freebsd/src/sys/sys/syslog.h | 202 -- .../include/freebsd/src/sys/sys/systm.h | 245 -- .../include/freebsd/src/sys/sys/time.h | 135 -- .../include/freebsd/src/sys/sys/ttycom.h | 139 -- .../include/freebsd/src/sys/sys/types.h | 167 -- .../include/freebsd/src/sys/sys/ucred.h | 63 - .../include/freebsd/src/sys/sys/uio.h | 91 - .../include/freebsd/src/sys/sys/unistd.h | 121 - reactos/lib/oskittcp/include/memtrack.h | 73 - reactos/lib/oskittcp/include/oskitdebug.h | 94 - reactos/lib/oskittcp/include/oskiterrno.h | 170 -- reactos/lib/oskittcp/include/oskitfreebsd.h | 14 - reactos/lib/oskittcp/include/oskittcp.h | 106 - reactos/lib/oskittcp/include/oskittypes.h | 60 - reactos/lib/oskittcp/makefile | 83 - reactos/lib/oskittcp/oskittcp/.cvsignore | 2 - reactos/lib/oskittcp/oskittcp/defaults.c | 215 -- reactos/lib/oskittcp/oskittcp/in.c | 181 -- reactos/lib/oskittcp/oskittcp/in_cksum.c | 150 -- reactos/lib/oskittcp/oskittcp/in_pcb.c | 521 ---- reactos/lib/oskittcp/oskittcp/in_proto.c | 150 -- reactos/lib/oskittcp/oskittcp/in_rmx.c | 91 - reactos/lib/oskittcp/oskittcp/inet_ntoa.c | 51 - reactos/lib/oskittcp/oskittcp/interface.c | 292 --- reactos/lib/oskittcp/oskittcp/ip_input.c | 190 -- reactos/lib/oskittcp/oskittcp/ip_output.c | 300 --- reactos/lib/oskittcp/oskittcp/kern_clock.c | 361 --- reactos/lib/oskittcp/oskittcp/kern_subr.c | 252 -- reactos/lib/oskittcp/oskittcp/malloc.c | 16 - reactos/lib/oskittcp/oskittcp/param.c | 24 - reactos/lib/oskittcp/oskittcp/radix.c | 1006 -------- reactos/lib/oskittcp/oskittcp/random.c | 63 - reactos/lib/oskittcp/oskittcp/route.c | 807 ------ reactos/lib/oskittcp/oskittcp/rtsock.c | 79 - reactos/lib/oskittcp/oskittcp/scanc.c | 52 - reactos/lib/oskittcp/oskittcp/sleep.c | 209 -- reactos/lib/oskittcp/oskittcp/tcp_debug.c | 163 -- reactos/lib/oskittcp/oskittcp/tcp_input.c | 2160 ----------------- reactos/lib/oskittcp/oskittcp/tcp_output.c | 823 ------- reactos/lib/oskittcp/oskittcp/tcp_subr.c | 610 ----- reactos/lib/oskittcp/oskittcp/tcp_timer.c | 358 --- reactos/lib/oskittcp/oskittcp/tcp_usrreq.c | 773 ------ reactos/lib/oskittcp/oskittcp/uipc_domain.c | 231 -- reactos/lib/oskittcp/oskittcp/uipc_mbuf.c | 769 ------ reactos/lib/oskittcp/oskittcp/uipc_socket.c | 1061 -------- reactos/lib/oskittcp/oskittcp/uipc_socket2.c | 812 ------- 120 files changed, 25831 deletions(-) delete mode 100644 reactos/lib/oskittcp/README delete mode 100644 reactos/lib/oskittcp/include/freebsd/dev/include/vm/vm.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/dev/include/vm/vm_param.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/net/include/arpa/inet.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/net/include/imp.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/machine/ansi.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/machine/cpufunc.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/machine/endian.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/machine/ipl.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/machine/limits.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/machine/param.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/machine/proc.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/machine/signal.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/machine/spl.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/machine/stdarg.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/machine/trap.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/machine/types.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/machine/vmparam.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/net/if.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/net/if_arp.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/net/netisr.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/net/radix.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/net/raw_cb.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/net/route.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/if_ether.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/igmp_var.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in_pcb.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in_systm.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in_var.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip_fw.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip_icmp.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip_var.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_debug.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_fsm.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_seq.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_timer.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_var.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcpip.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/udp.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/netinet/udp_var.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/buf.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/callout.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/cdefs.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/domain.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/errno.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/fcntl.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/file.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/filedesc.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/filio.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/ioccom.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/ioctl.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/kernel.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/libkern.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/malloc.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/mbuf.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/param.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/proc.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/protosw.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/queue.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/resource.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/resourcevar.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/rtprio.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/select.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/signal.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/signalvar.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/socket.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/socketvar.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/sockio.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/stat.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/sysctl.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/syslimits.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/syslog.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/systm.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/time.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/ttycom.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/types.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/ucred.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/uio.h delete mode 100644 reactos/lib/oskittcp/include/freebsd/src/sys/sys/unistd.h delete mode 100644 reactos/lib/oskittcp/include/memtrack.h delete mode 100644 reactos/lib/oskittcp/include/oskitdebug.h delete mode 100644 reactos/lib/oskittcp/include/oskiterrno.h delete mode 100644 reactos/lib/oskittcp/include/oskitfreebsd.h delete mode 100644 reactos/lib/oskittcp/include/oskittcp.h delete mode 100644 reactos/lib/oskittcp/include/oskittypes.h delete mode 100644 reactos/lib/oskittcp/makefile delete mode 100644 reactos/lib/oskittcp/oskittcp/.cvsignore delete mode 100644 reactos/lib/oskittcp/oskittcp/defaults.c delete mode 100644 reactos/lib/oskittcp/oskittcp/in.c delete mode 100644 reactos/lib/oskittcp/oskittcp/in_cksum.c delete mode 100644 reactos/lib/oskittcp/oskittcp/in_pcb.c delete mode 100644 reactos/lib/oskittcp/oskittcp/in_proto.c delete mode 100644 reactos/lib/oskittcp/oskittcp/in_rmx.c delete mode 100644 reactos/lib/oskittcp/oskittcp/inet_ntoa.c delete mode 100644 reactos/lib/oskittcp/oskittcp/interface.c delete mode 100644 reactos/lib/oskittcp/oskittcp/ip_input.c delete mode 100644 reactos/lib/oskittcp/oskittcp/ip_output.c delete mode 100644 reactos/lib/oskittcp/oskittcp/kern_clock.c delete mode 100644 reactos/lib/oskittcp/oskittcp/kern_subr.c delete mode 100644 reactos/lib/oskittcp/oskittcp/malloc.c delete mode 100644 reactos/lib/oskittcp/oskittcp/param.c delete mode 100644 reactos/lib/oskittcp/oskittcp/radix.c delete mode 100644 reactos/lib/oskittcp/oskittcp/random.c delete mode 100644 reactos/lib/oskittcp/oskittcp/route.c delete mode 100644 reactos/lib/oskittcp/oskittcp/rtsock.c delete mode 100644 reactos/lib/oskittcp/oskittcp/scanc.c delete mode 100644 reactos/lib/oskittcp/oskittcp/sleep.c delete mode 100644 reactos/lib/oskittcp/oskittcp/tcp_debug.c delete mode 100644 reactos/lib/oskittcp/oskittcp/tcp_input.c delete mode 100644 reactos/lib/oskittcp/oskittcp/tcp_output.c delete mode 100644 reactos/lib/oskittcp/oskittcp/tcp_subr.c delete mode 100644 reactos/lib/oskittcp/oskittcp/tcp_timer.c delete mode 100644 reactos/lib/oskittcp/oskittcp/tcp_usrreq.c delete mode 100644 reactos/lib/oskittcp/oskittcp/uipc_domain.c delete mode 100644 reactos/lib/oskittcp/oskittcp/uipc_mbuf.c delete mode 100644 reactos/lib/oskittcp/oskittcp/uipc_socket.c delete mode 100644 reactos/lib/oskittcp/oskittcp/uipc_socket2.c diff --git a/reactos/lib/oskittcp/README b/reactos/lib/oskittcp/README deleted file mode 100644 index a78d4e5bbf0..00000000000 --- a/reactos/lib/oskittcp/README +++ /dev/null @@ -1,5 +0,0 @@ -These files are originally from the freebsd TCP stack contained on oskit. -Only files relevent to TCP are here, along with assorted interfaces that -are needed to make them useful. Overall, I intend this to implement a -generic, standalone TCP library that can be used with any IP machinery -required. diff --git a/reactos/lib/oskittcp/include/freebsd/dev/include/vm/vm.h b/reactos/lib/oskittcp/include/freebsd/dev/include/vm/vm.h deleted file mode 100644 index d3b2f6d469d..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/dev/include/vm/vm.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 1997-1998 University of Utah and the Flux Group. - * All rights reserved. - * - * This file is part of the Flux OSKit. The OSKit is free software, also known - * as "open source;" you can redistribute it and/or modify it under the terms - * of the GNU General Public License (GPL), version 2, as published by the Free - * Software Foundation (FSF). To explore alternate licensing terms, contact - * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. - * - * The OSKit 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 GPL for more details. You should have - * received a copy of the GPL along with the OSKit; see the file COPYING. If - * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. - */ -/* - * here's vm.h's primary purpose in life: - * - * define `vm_map_t' for the first arg to kmem_alloc() - */ -#ifndef _FAKE_VM_H -#define _FAKE_VM_H - -typedef void *vm_map_t; - -#include <vm/vm_param.h> - -/* - * XXX This is used by syscons to compute the address of the video buffer. - * This definition means the driver will only work when kva == pa. - * The real solution would be to modify the driver to map the buffer explicitly. - */ -#define vtophys(va) va - -/* - * ip_icmp.c and possibly other files rely on vm/vm.h to get sys/proc ... - */ -#include <sys/proc.h> -#include <sys/queue.h> - -#endif /* _FAKE_VM_H */ diff --git a/reactos/lib/oskittcp/include/freebsd/dev/include/vm/vm_param.h b/reactos/lib/oskittcp/include/freebsd/dev/include/vm/vm_param.h deleted file mode 100644 index 4d48e0391d6..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/dev/include/vm/vm_param.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 1997-1998 University of Utah and the Flux Group. - * All rights reserved. - * - * This file is part of the Flux OSKit. The OSKit is free software, also known - * as "open source;" you can redistribute it and/or modify it under the terms - * of the GNU General Public License (GPL), version 2, as published by the Free - * Software Foundation (FSF). To explore alternate licensing terms, contact - * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. - * - * The OSKit 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 GPL for more details. You should have - * received a copy of the GPL along with the OSKit; see the file COPYING. If - * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. - */ -#ifndef _VM_PARAM_ -#define _VM_PARAM_ - -#include <machine/vmparam.h> - -typedef int boolean_t; - -#define TRUE 1 -#define FALSE 0 - -#endif /* _VM_PARAM_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/net/include/arpa/inet.h b/reactos/lib/oskittcp/include/freebsd/net/include/arpa/inet.h deleted file mode 100644 index 014277cb4c1..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/net/include/arpa/inet.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 1983, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)inet.h 8.1 (Berkeley) 6/2/93 - */ - -#ifndef _ARPA_INET_H_ -#define _ARPA_INET_H_ - -/* External definitions for functions in inet(3) */ - -#include <sys/cdefs.h> - -__BEGIN_DECLS -unsigned long inet_addr __P((const char *)); -int inet_aton __P((const char *, struct in_addr *)); -unsigned long inet_lnaof __P((struct in_addr)); -struct in_addr inet_makeaddr __P((u_long , u_long)); -unsigned long inet_netof __P((struct in_addr)); -unsigned long inet_network __P((const char *)); -char *inet_ntoa __P((struct in_addr)); -__END_DECLS - -#endif /* !_INET_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/net/include/imp.h b/reactos/lib/oskittcp/include/freebsd/net/include/imp.h deleted file mode 100644 index ef8ea49c607..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/net/include/imp.h +++ /dev/null @@ -1 +0,0 @@ -#define NIMP 0 diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/ansi.h b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/ansi.h deleted file mode 100644 index 7d84a8237ef..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/ansi.h +++ /dev/null @@ -1,96 +0,0 @@ -/*- - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)ansi.h 8.2 (Berkeley) 1/4/94 - */ - -#ifndef _MACHINE_ANSI_H_ -#define _MACHINE_ANSI_H_ - -/* - * Types which are fundamental to the implementation and must be declared - * in more than one standard header are defined here. Standard headers - * then use: - * #ifdef _BSD_SIZE_T_ - * typedef _BSD_SIZE_T_ size_t; - * #undef _BSD_SIZE_T_ - * #endif - */ -#define _BSD_CLOCK_T_ unsigned long /* clock() */ -#define _BSD_PTRDIFF_T_ int /* ptr1 - ptr2 */ -#ifndef _BSD_SIZE_T_ -#define _BSD_SIZE_T_ unsigned int /* sizeof() */ -#endif -#define _BSD_SSIZE_T_ int /* byte count or error */ -#define _BSD_TIME_T_ long /* time() */ - -/* - * Types which are fundamental to the implementation and must be used - * in more than one standard header although they are only declared in - * one (perhaps nonstandard) header are defined here. Standard headers - * use _BSD_XXX_T_ without undef'ing it. - */ -#define _BSD_OFF_T_ long long /* file offset */ -#define _BSD_PID_T_ long /* process [group] */ -#define _BSD_VA_LIST_ char * /* va_list */ - -/* - * Runes (wchar_t) is declared to be an ``int'' instead of the more natural - * ``unsigned long'' or ``long''. Two things are happening here. It is not - * unsigned so that EOF (-1) can be naturally assigned to it and used. Also, - * it looks like 10646 will be a 31 bit standard. This means that if your - * ints cannot hold 32 bits, you will be in trouble. The reason an int was - * chosen over a long is that the is*() and to*() routines take ints (says - * ANSI C), but they use _RUNE_T_ instead of int. By changing it here, you - * lose a bit of ANSI conformance, but your programs will still work. - * - * Note that _WCHAR_T_ and _RUNE_T_ must be of the same type. When wchar_t - * and rune_t are typedef'd, _WCHAR_T_ will be undef'd, but _RUNE_T remains - * defined for ctype.h. - */ -#define _BSD_WCHAR_T_ int /* wchar_t */ -#define _BSD_RUNE_T_ int /* rune_t */ - -/* - * Frequencies of the clock ticks reported by clock() and times(). They - * are the same as stathz for bogus historical reasons. They should be - * 1e6 because clock() and times() are implemented using getrusage() and - * there is no good reason why they should be less accurate. There is - * the bad reason that (broken) programs might not like clock_t or - * CLOCKS_PER_SEC being ``double'' (``unsigned long'' is not large enough - * to hold the required 24 hours worth of ticks if the frequency is - * 1000000ul, and ``unsigned long long'' would be nonstandard). - */ -#define _BSD_CLK_TCK_ 128 -#define _BSD_CLOCKS_PER_SEC_ 128 - -#endif /* !_MACHINE_ANSI_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/cpufunc.h b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/cpufunc.h deleted file mode 100644 index 8ccb08fff28..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/cpufunc.h +++ /dev/null @@ -1,460 +0,0 @@ -/*- - * Copyright (c) 1993 The Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -/* - * Functions to provide access to special i386 instructions. - */ - -#ifndef _MACHINE_CPUFUNC_H_ -#define _MACHINE_CPUFUNC_H_ - -#include <sys/cdefs.h> -#include <sys/types.h> - -#include <machine/spl.h> /* XXX belongs elsewhere */ - -#ifdef __GNUC__ - -#ifdef BDE_DEBUGGER -extern int bdb_exists; - -static __inline int -bdb(void) -{ - if (!bdb_exists) - return (0); - __asm __volatile("int $3"); - return (1); -} -#endif /* BDE_DEBUGGER */ - -static __inline void -disable_intr(void) -{ -#ifdef OSKIT - osenv_intr_disable(); -#else - __asm __volatile("cli" : : : "memory"); -#endif -} - -static __inline void -enable_intr(void) -{ -#ifdef OSKIT - osenv_intr_enable(); -#else - __asm __volatile("sti"); -#endif -} - -#define HAVE_INLINE_FFS - -static __inline int -ffs(int mask) -{ - int result; - /* - * bsfl turns out to be not all that slow on 486's. It can beaten - * using a binary search to reduce to 4 bits and then a table lookup, - * but only if the code is inlined and in the cache, and the code - * is quite large so inlining it probably busts the cache. - * - * Note that gcc-2's builtin ffs would be used if we didn't declare - * this inline or turn off the builtin. The builtin is faster but - * broken in gcc-2.4.5 and slower but working in gcc-2.5 and 2.6. - */ - __asm __volatile("testl %0,%0; je 1f; bsfl %0,%0; incl %0; 1:" - : "=r" (result) : "0" (mask)); - return (result); -} - -#if __GNUC__ < 2 - -#define inb(port) inbv(port) -#define outb(port, data) outbv(port, data) - -#else /* __GNUC >= 2 */ - -/* - * The following complications are to get around gcc not having a - * constraint letter for the range 0..255. We still put "d" in the - * constraint because "i" isn't a valid constraint when the port - * isn't constant. This only matters for -O0 because otherwise - * the non-working version gets optimized away. - * - * Use an expression-statement instead of a conditional expression - * because gcc-2.6.0 would promote the operands of the conditional - * and produce poor code for "if ((inb(var) & const1) == const2)". - */ -#define inb(port) ({ \ - u_char _data; \ - if (__builtin_constant_p((int) (port)) && (port) < 256ul) \ - _data = inbc(port); \ - else \ - _data = inbv(port); \ - _data; }) - -#define outb(port, data) \ - (__builtin_constant_p((int) (port)) && (port) < 256ul \ - ? outbc(port, data) : outbv(port, data)) - -static __inline u_char -inbc(u_int port) -{ - u_char data; - - __asm __volatile("inb %1,%0" : "=a" (data) : "id" ((u_short)(port))); - return (data); -} - -static __inline void -outbc(u_int port, u_char data) -{ - __asm __volatile("outb %0,%1" : : "a" (data), "id" ((u_short)(port))); -} - -#endif /* __GNUC <= 2 */ - -static __inline u_char -inbv(u_int port) -{ - u_char data; - /* - * We use %%dx and not %1 here because i/o is done at %dx and not at - * %edx, while gcc generates inferior code (movw instead of movl) - * if we tell it to load (u_short) port. - */ - __asm __volatile("inb %%dx,%0" : "=a" (data) : "d" (port)); - return (data); -} - -static __inline u_long -inl(u_int port) -{ - u_long data; - - __asm __volatile("inl %%dx,%0" : "=a" (data) : "d" (port)); - return (data); -} - -static __inline void -insb(u_int port, void *addr, size_t cnt) -{ - __asm __volatile("cld; rep; insb" - : : "d" (port), "D" (addr), "c" (cnt) - : "di", "cx", "memory"); -} - -static __inline void -insw(u_int port, void *addr, size_t cnt) -{ - __asm __volatile("cld; rep; insw" - : : "d" (port), "D" (addr), "c" (cnt) - : "di", "cx", "memory"); -} - -static __inline void -insl(u_int port, void *addr, size_t cnt) -{ - __asm __volatile("cld; rep; insl" - : : "d" (port), "D" (addr), "c" (cnt) - : "di", "cx", "memory"); -} - -static __inline u_short -inw(u_int port) -{ - u_short data; - - __asm __volatile("inw %%dx,%0" : "=a" (data) : "d" (port)); - return (data); -} - -static __inline unsigned -loadandclear(u_int *addr) -{ - u_int result; - - __asm __volatile("xorl %0,%0; xchgl %1,%0" - : "=&r" (result) : "m" (*addr)); - return (result); -} - -static __inline void -outbv(u_int port, u_char data) -{ - u_char al; - /* - * Use an unnecessary assignment to help gcc's register allocator. - * This make a large difference for gcc-1.40 and a tiny difference - * for gcc-2.6.0. For gcc-1.40, al had to be ``asm("ax")'' for - * best results. gcc-2.6.0 can't handle this. - */ - al = data; - __asm __volatile("outb %0,%%dx" : : "a" (al), "d" (port)); -} - -static __inline void -outl(u_int port, u_long data) -{ - /* - * outl() and outw() aren't used much so we haven't looked at - * possible micro-optimizations such as the unnecessary - * assignment for them. - */ - __asm __volatile("outl %0,%%dx" : : "a" (data), "d" (port)); -} - -static __inline void -outsb(u_int port, void *addr, size_t cnt) -{ - __asm __volatile("cld; rep; outsb" - : : "d" (port), "S" (addr), "c" (cnt) - : "si", "cx"); -} - -static __inline void -outsw(u_int port, void *addr, size_t cnt) -{ - __asm __volatile("cld; rep; outsw" - : : "d" (port), "S" (addr), "c" (cnt) - : "si", "cx"); -} - -static __inline void -outsl(u_int port, void *addr, size_t cnt) -{ - __asm __volatile("cld; rep; outsl" - : : "d" (port), "S" (addr), "c" (cnt) - : "si", "cx"); -} - -static __inline void -outw(u_int port, u_short data) -{ - __asm __volatile("outw %0,%%dx" : : "a" (data), "d" (port)); -} - -static __inline void -pmap_update(void) -{ - u_long temp; - /* - * This should be implemented as load_cr3(rcr3()) when load_cr3() - * is inlined. - */ - __asm __volatile("movl %%cr3, %0; movl %0, %%cr3" : "=r" (temp) - : : "memory"); -} - -static __inline u_long -rcr2(void) -{ - u_long data; - - __asm __volatile("movl %%cr2,%0" : "=r" (data)); - return (data); -} - -static __inline u_long -read_eflags(void) -{ - u_long ef; - - __asm __volatile("pushfl; popl %0" : "=r" (ef)); - return (ef); -} - -static __inline void -write_eflags(u_long ef) -{ - __asm __volatile("pushl %0; popfl" : : "r" (ef)); -} - -/* - * XXX queue stuff belongs elsewhere. - */ -struct quehead { - struct quehead *qh_link; - struct quehead *qh_rlink; -}; - -static __inline void -insque(void *a, void *b) -{ - struct quehead *element = (struct quehead *)a, - *head = (struct quehead *)b; - - element->qh_link = head->qh_link; - element->qh_rlink = head; - head->qh_link = element; - element->qh_link->qh_rlink = element; -} - -static __inline void -remque(void *a) -{ - struct quehead *element = (struct quehead *)a; - - element->qh_link->qh_rlink = element->qh_rlink; - element->qh_rlink->qh_link = element->qh_link; - element->qh_rlink = 0; -} - -#else /* !__GNUC__ */ - -int bdb __P((void)); -void disable_intr __P((void)); -void enable_intr __P((void)); -u_char inb __P((u_int port)); -u_long inl __P((u_int port)); -void insb __P((u_int port, void *addr, size_t cnt)); -void insl __P((u_int port, void *addr, size_t cnt)); -void insw __P((u_int port, void *addr, size_t cnt)); -u_short inw __P((u_int port)); -u_int loadandclear __P((u_int *addr)); -void outb __P((u_int port, u_char data)); -void outl __P((u_int port, u_long data)); -void outsb __P((u_int port, void *addr, size_t cnt)); -void outsl __P((u_int port, void *addr, size_t cnt)); -void outsw __P((u_int port, void *addr, size_t cnt)); -void outw __P((u_int port, u_short data)); -void pmap_update __P((void)); -u_long read_eflags __P((void)); -u_long rcr2 __P((void)); -void write_eflags __P((u_long ef)); - -void insque __P((void *a, void *b)); -void remque __P((void *a)); - -#endif /* __GNUC__ */ - -/* - * XXX the following declarations document garbage in support.s. - * gcc hasn't needed _divsi* for years. - * bcopy[bwx]() was used by pccons but isn't used now. - */ -int __divsi3 __P((int factor1, int factor2)); -u_int __udivsi3 __P((u_int factor1, u_int factor2)); -void bcopyb __P((const void *from, void *to, size_t len)); -void bcopyw __P((const void *from, void *to, size_t len)); -void bcopyx __P((const void *from, void *to, size_t len, - int stride)); - -#if 0 -/* - * These functions in support.s are declared elsewhere. - */ -void bcopy __P((const void *from, void *to, size_t len)); -void blkclr __P((void *buf, size_t len)); -void bzero __P((void *buf, size_t len)); -int copyin __P((void *udaddr, void *kaddr, size_t len)); -int copyinstr __P((void *udaddr, void *kaddr, size_t len, - size_t *lencopied)); -int copyout __P((void *kaddr, void *udaddr, size_t len)); -int copystr __P((void *kfaddr, void *kdaddr, size_t len, - size_t *lencopied)); -int fubyte __P((void *base)); -int fuswintr __P((void *base)); -int fuibyte __P((void *base)); -int fuword __P((void *base)); -struct region_descriptor; -void lgdt __P((struct region_descriptor *rdp)); -void lidt __P((struct region_descriptor *rdp)); -void lldt __P((u_short sel)); -/* - * longjmp() and setjmp() are only used by ddb. They probably shouldn't - * shouldn't be supported in the kernel. - */ -#include <setjmp.h> -void longjmp __P((jmp_buf jb, int rv)); -void ovbcopy __P((const void *from, void *to, size_t len); -int setjmp __P((jmp_buf jb)); -struct soft_segment_descriptor; -union descriptor; -int ssdtosd __P((struct soft_segment_descriptor *ssdp, - union descriptor *sdp)); -int subyte __P((void *base, int byte)); -int suibyte __P((void *base, int byte)); -int suswintr __P((void *base, int word)); -int suword __P((void *base, int word)); - -/* - * These functions in support.s are declared elsewhere, but never used. - * A silly amount of effort went into copyoutstr(). It's not worth - * maintaining, since the string length is usually known so copyout - * works better, or is easy to find so copyout() can be used. - */ -int copyoutstr __P((void *kaddr, void *udaddr, size_t len, - size_t *lencopied)); -int fuiword __P((void *base)); -int suiword __P((void *base, int word)); - -/* - * These functions in support.s are also in libkern.a and are declared in - * libkern.h. - * ffs() is built in to gcc-2 and was buggy in gcc-2.4.5 so we may may the - * buggy version if we don't replace it by an inline. - */ -int bcmp __P((const void *b1, const void *b2, size_t length)); -int ffs __P((int mask)); -#endif /* 0 */ - -/* - * These variables and functions in support.s are used. - */ -extern u_int atdevbase; /* offset in virtual memory of ISA io mem */ - -void filli __P((int pat, void *base, size_t cnt)); -void fillw __P((int /*u_short*/ pat, void *base, size_t cnt)); -int fusword __P((void *base)); -void load_cr0 __P((u_long cr0)); -void load_cr3 __P((u_long cr3)); -void ltr __P((u_short sel)); -u_int rcr0 __P((void)); -u_long rcr3 __P((void)); -int rtcin __P((int val)); - -/* - * These functions are NOT in support.s and should be declared elsewhere. - */ -void Debugger __P((const char *msg)); -u_long kvtop __P((void *addr)); -typedef void alias_for_inthand_t __P((u_int cs, u_int ef, u_int esp, - u_int ss)); -void setidt __P((int idx, alias_for_inthand_t *func, int typ, - int dpl, int selec)); - -#endif /* !_MACHINE_CPUFUNC_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/endian.h b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/endian.h deleted file mode 100644 index c804477311e..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/endian.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (c) 1987, 1991 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * from: @(#)endian.h 7.8 (Berkeley) 4/3/91 - */ - -#ifndef _MACHINE_ENDIAN_H_ -#define _MACHINE_ENDIAN_H_ 1 - -/* - * Define the order of 32-bit words in 64-bit words. - */ -#define _QUAD_HIGHWORD 1 -#define _QUAD_LOWWORD 0 - -/* - * Definitions for byte order, according to byte significance from low - * address to high. - */ -#define LITTLE_ENDIAN 1234 /* LSB first: i386, vax */ -#define BIG_ENDIAN 4321 /* MSB first: 68000, ibm, net */ -#define PDP_ENDIAN 3412 /* LSB first in word, MSW first in long */ - -#define BYTE_ORDER LITTLE_ENDIAN - -#ifndef KERNEL -#include <sys/cdefs.h> -#endif - -#define __word_swap_long(x) \ -({ register u_long __X = (x); \ - __asm ("rorl $16, %1" \ - : "=r" (__X) \ - : "0" (__X)); \ - __X; }) -#if __GNUC__ >= 2 -#define __byte_swap_long(x) \ -__extension__ ({ register u_long __X = (x); \ - __asm ("xchgb %h1, %b1\n\trorl $16, %1\n\txchgb %h1, %b1" \ - : "=q" (__X) \ - : "0" (__X)); \ - __X; }) -#define __byte_swap_word(x) \ -__extension__ ({ register u_short __X = (x); \ - __asm ("xchgb %h1, %b1" \ - : "=q" (__X) \ - : "0" (__X)); \ - __X; }) -#else /* __GNUC__ >= 2 */ -#define __byte_swap_long(x) \ -({ register u_long __X = (x); \ - __asm ("rorw $8, %w1\n\trorl $16, %1\n\trorw $8, %w1" \ - : "=r" (__X) \ - : "0" (__X)); \ - __X; }) -#define __byte_swap_word(x) \ -({ register u_short __X = (x); \ - __asm ("rorw $8, %w1" \ - : "=r" (__X) \ - : "0" (__X)); \ - __X; }) -#endif /* __GNUC__ >= 2 */ - -/* - * Macros for network/external number representation conversion. - */ -#if BYTE_ORDER == BIG_ENDIAN && !defined(lint) -#define ntohl(x) (x) -#define ntohs(x) (x) -#define htonl(x) (x) -#define htons(x) (x) - -#define NTOHL(x) (x) -#define NTOHS(x) (x) -#define HTONL(x) (x) -#define HTONS(x) (x) - -#else - -#define ntohl __byte_swap_long -#define ntohs __byte_swap_word -#define htonl __byte_swap_long -#define htons __byte_swap_word - -#define NTOHL(x) (x) = ntohl((u_long)x) -#define NTOHS(x) (x) = ntohs((u_short)x) -#define HTONL(x) (x) = htonl((u_long)x) -#define HTONS(x) (x) = htons((u_short)x) -#endif -#endif /* _MACHINE_ENDIAN_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/ipl.h b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/ipl.h deleted file mode 100644 index f006d9551b6..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/ipl.h +++ /dev/null @@ -1,41 +0,0 @@ -/*- - * Copyright (c) 1993 The Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#ifndef _ISA_IPL_H_ -#define _ISA_IPL_H_ - -#define NHWI 16 /* number of h/w interrupts */ -#define HWI_MASK 0xffff /* bits corresponding to h/w interrupts */ - -#endif /* _ISA_IPL_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/limits.h b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/limits.h deleted file mode 100644 index f90ed760fcc..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/limits.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)limits.h 8.3 (Berkeley) 1/4/94 - */ - -#ifndef _MACHINE_LIMITS_H_ -#define _MACHINE_LIMITS_H_ - -#define CHAR_BIT 8 /* number of bits in a char */ -#ifndef __REACTOS__ -#define MB_LEN_MAX 6 /* Allow 31 bit UTF2 */ -#endif - -/* - * According to ANSI (section 2.2.4.2), the values below must be usable by - * #if preprocessing directives. Additionally, the expression must have the - * same type as would an expression that is an object of the corresponding - * type converted according to the integral promotions. The subtraction for - * INT_MIN and LONG_MIN is so the value is not unsigned; 2147483648 is an - * unsigned int for 32-bit two's complement ANSI compilers (section 3.1.3.2). - * These numbers work for pcc as well. The UINT_MAX and ULONG_MAX values - * are written as hex so that GCC will be quiet about large integer constants. - */ -#define SCHAR_MAX 127 /* min value for a signed char */ -#define SCHAR_MIN (-128) /* max value for a signed char */ - -#define UCHAR_MAX 255 /* max value for an unsigned char */ -#ifndef __REACTOS__ -#define CHAR_MAX 127 /* max value for a char */ -#define CHAR_MIN (-128) /* min value for a char */ -#endif - -#ifndef SHRT_MAX -#define USHRT_MAX 65535 /* max value for an unsigned short */ -#define SHRT_MAX 32767 /* max value for a short */ -#define SHRT_MIN (-32768) /* min value for a short */ -#endif - -#ifndef INT_MAX -#define UINT_MAX 0xffffffff /* max value for an unsigned int */ -#define INT_MAX 2147483647 /* max value for an int */ -#define INT_MIN (-2147483647-1) /* min value for an int */ -#endif - -#ifndef LONG_MAX -#define ULONG_MAX 0xffffffff /* max value for an unsigned long */ -#define LONG_MAX 2147483647 /* max value for a long */ -#define LONG_MIN (-2147483647-1) /* min value for a long */ -#endif - -#if !defined(_ANSI_SOURCE) -#define SSIZE_MAX INT_MAX /* max value for a ssize_t */ - -#if !defined(_POSIX_SOURCE) -#define SIZE_T_MAX UINT_MAX /* max value for a size_t */ - -/* GCC requires that quad constants be written as expressions. */ -#define UQUAD_MAX ((u_quad_t)0-1) /* max value for a uquad_t */ - /* max value for a quad_t */ -#define QUAD_MAX ((quad_t)(UQUAD_MAX >> 1)) -#define QUAD_MIN (-QUAD_MAX-1) /* min value for a quad_t */ - -#endif /* !_POSIX_SOURCE */ -#endif /* !_ANSI_SOURCE */ - -#endif /* !_MACHINE_LIMITS_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/param.h b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/param.h deleted file mode 100644 index 3926e8d380b..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/param.h +++ /dev/null @@ -1,161 +0,0 @@ -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * William Jolitz. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * from: @(#)param.h 5.8 (Berkeley) 6/28/91 - */ - -#ifndef _MACHINE_PARAM_H_ -#define _MACHINE_PARAM_H_ - -/* - * Machine dependent constants for Intel 386. - */ - -#define MACHINE "i386" -#define MID_MACHINE MID_I386 - -/* - * Round p (pointer or byte index) up to a correctly-aligned value - * for all data types (int, long, ...). The result is unsigned int - * and must be cast to any desired pointer type. - */ -#define ALIGNBYTES (sizeof(int) - 1) -#define ALIGN(p) (((unsigned)(p) + ALIGNBYTES) & ~ALIGNBYTES) - -#ifndef PAGE_SIZE -/* XXX PGSHIFT and PG_SHIFT are two names for the same thing */ -#define PGSHIFT 12 /* LOG2(NBPG) */ -#define PAGE_SHIFT 12 -#define NBPG (1 << PAGE_SHIFT) /* bytes/page */ -#define PAGE_SIZE (1 << PAGE_SHIFT) -#define PAGE_MASK (PAGE_SIZE-1) -#define PGOFSET (NBPG-1) /* byte offset into page */ -#define NPTEPG (NBPG/(sizeof (pt_entry_t))) -#endif - -/* XXX PDRSHIFT and PD_SHIFT are two names for the same thing */ -#define PDRSHIFT 22 /* LOG2(NBPDR) */ -#define NBPDR (1 << PDRSHIFT) /* bytes/page dir */ -#define PDROFSET (NBPDR-1) /* byte offset into page dir */ - -/* - * XXX This should really be KPTDPTDI << PDRSHIFT, but since KPTDPTDI is - * defined in pmap.h which is included after this we can't do that - * (YET!) - */ -#define BTOPKERNBASE (KERNBASE >> PGSHIFT) - -#define DEV_BSHIFT 9 /* log2(DEV_BSIZE) */ -#define DEV_BSIZE (1 << DEV_BSHIFT) - -#define BLKDEV_IOSIZE 2048 -#define MAXPHYS (64 * 1024) /* max raw I/O transfer size */ - -#define CLSIZELOG2 0 -#define CLSIZE (1 << CLSIZELOG2) - -/* NOTE: SSIZE, SINCR and UPAGES must be multiples of CLSIZE */ -#define SSIZE 1 /* initial stack size/NBPG */ -#define SINCR 1 /* increment of stack/NBPG */ - -#define UPAGES 2 /* pages of u-area */ - -/* - * Constants related to network buffer management. - * MCLBYTES must be no larger than CLBYTES (the software page size), and, - * on machines that exchange pages of input or output buffers with mbuf - * clusters (MAPPED_MBUFS), MCLBYTES must also be an integral multiple - * of the hardware page size. - */ -#ifndef MSIZE -#define MSIZE 128 /* size of an mbuf */ -#endif /* MSIZE */ - -#ifndef MCLSHIFT -#define MCLSHIFT 11 /* convert bytes to m_buf clusters */ -#endif /* MCLSHIFT */ -#define MCLBYTES (1 << MCLSHIFT) /* size of an m_buf cluster */ -#define MCLOFSET (MCLBYTES - 1) /* offset within an m_buf cluster */ - -/* - * Some macros for units conversion - */ -/* Core clicks (4096 bytes) to segments and vice versa */ -#define ctos(x) (x) -#define stoc(x) (x) - -/* Core clicks (4096 bytes) to disk blocks */ -#define ctod(x) ((x)<<(PGSHIFT-DEV_BSHIFT)) -#define dtoc(x) ((x)>>(PGSHIFT-DEV_BSHIFT)) -#define dtob(x) ((x)<<DEV_BSHIFT) - -/* clicks to bytes */ -#define ctob(x) ((x)<<PGSHIFT) - -/* bytes to clicks */ -#define btoc(x) (((unsigned)(x)+(NBPG-1))>>PGSHIFT) - -/* - * This is messy and perhaps slow because `bytes' may be an off_t. We - * have to shift an unsigned type to avoid sign extension and we don't - * want to widen `bytes' unnecessarily. Assume that off_t is long long - * and daddr_t is unsigned long. - */ -#define btodb(bytes) /* calculates (bytes / DEV_BSIZE) */ \ - (sizeof (bytes) > sizeof(long) \ - ? (unsigned long)((unsigned long long)(bytes) >> DEV_BSHIFT) \ - : (unsigned long)((unsigned long)(bytes) >> DEV_BSHIFT)) -#define dbtob(db) /* calculates (db * DEV_BSIZE) */ \ - ((unsigned long long)(db) << DEV_BSHIFT) - -/* - * Mach derived conversion macros - */ -#define trunc_page(x) ((unsigned)(x) & ~(NBPG-1)) -#define round_page(x) ((((unsigned)(x)) + NBPG - 1) & ~(NBPG-1)) - -#define atop(x) ((unsigned)(x) >> PG_SHIFT) -#define ptoa(x) ((unsigned)(x) << PG_SHIFT) - -#define i386_round_pdr(x) ((((unsigned)(x)) + NBPDR - 1) & ~(NBPDR-1)) -#define i386_trunc_pdr(x) ((unsigned)(x) & ~(NBPDR-1)) -#define i386_round_page(x) ((((unsigned)(x)) + NBPG - 1) & ~(NBPG-1)) -#define i386_trunc_page(x) ((unsigned)(x) & ~(NBPG-1)) -#define i386_btod(x) ((unsigned)(x) >> PDRSHIFT) -#define i386_dtob(x) ((unsigned)(x) << PDRSHIFT) -#define i386_btop(x) ((unsigned)(x) >> PGSHIFT) -#define i386_ptob(x) ((unsigned)(x) << PGSHIFT) - -#endif /* !_MACHINE_PARAM_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/proc.h b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/proc.h deleted file mode 100644 index 583b10e2bd9..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/proc.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 1991 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * from: @(#)proc.h 7.1 (Berkeley) 5/15/91 - */ - -#ifndef _MACHINE_PROC_H_ -#define _MACHINE_PROC_H_ 1 - -/* - * Machine-dependent part of the proc structure for i386. - */ -struct mdproc { - int md_flags; /* machine-dependent flags */ - int *md_regs; /* registers on current frame */ -}; - -/* md_flags */ -#define MDP_AST 0x0001 /* async trap pending */ -#endif /* _MACHINE_PROC_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/signal.h b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/signal.h deleted file mode 100644 index e1ede966902..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/signal.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 1986, 1989, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)signal.h 8.1 (Berkeley) 6/11/93 - */ - -#ifndef _I386_MACHINE_SIGNAL_H_ -#define _I386_MACHINE_SIGNAL_H_ - -/* - * Machine-dependent signal definitions - */ - -typedef int sig_atomic_t; - -#ifndef _POSIX_SOURCE -#include <machine/trap.h> /* codes for SIGILL, SIGFPE */ -#endif - -/* - * Information pushed on stack when a signal is delivered. - * This is used by the kernel to restore state following - * execution of the signal handler. It is also made available - * to the handler to allow it to restore state properly if - * a non-standard exit is performed. - */ -struct sigcontext { - int sc_onstack; /* sigstack state to restore */ - int sc_mask; /* signal mask to restore */ - int sc_esp; /* machine state */ - int sc_ebp; - int sc_isp; - int sc_eip; - int sc_efl; - int sc_es; - int sc_ds; - int sc_cs; - int sc_ss; - int sc_edi; - int sc_esi; - int sc_ebx; - int sc_edx; - int sc_ecx; - int sc_eax; -# define sc_sp sc_esp -# define sc_fp sc_ebp -# define sc_pc sc_eip -# define sc_ps sc_efl -}; - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/spl.h b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/spl.h deleted file mode 100644 index 578a36e5b9a..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/spl.h +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright (c) 1996-1999 University of Utah and the Flux Group. - * All rights reserved. - * - * This file is part of the Flux OSKit. The OSKit is free software, also known - * as "open source;" you can redistribute it and/or modify it under the terms - * of the GNU General Public License (GPL), version 2, as published by the Free - * Software Foundation (FSF). To explore alternate licensing terms, contact - * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. - * - * The OSKit 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 GPL for more details. You should have - * received a copy of the GPL along with the OSKit; see the file COPYING. If - * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. - */ -/*- - * Copyright (c) 1993 The Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#ifndef _MACHINE_IPL_H_ -#define _MACHINE_IPL_H_ - -#include <machine/ipl.h> /* XXX "machine" means cpu for i386 */ - -/* - * Software interrupt bit numbers in priority order. The priority only - * determines which swi will be dispatched next; a higher priority swi - * may be dispatched when a nested h/w interrupt handler returns. - */ -#define SWI_TTY (NHWI + 0) -#define SWI_NET (NHWI + 1) -#define SWI_CLOCK 30 -#define SWI_AST 31 - -/* - * Corresponding interrupt-pending bits for ipending. - */ -#define SWI_TTY_PENDING (1 << SWI_TTY) -#define SWI_NET_PENDING (1 << SWI_NET) -#define SWI_CLOCK_PENDING (1 << SWI_CLOCK) -#define SWI_AST_PENDING (1 << SWI_AST) - -/* - * Corresponding interrupt-disable masks for cpl. The ordering is now by - * inclusion (where each mask is considered as a set of bits). Everything - * except SWI_AST_MASK includes SWI_CLOCK_MASK so that softclock() doesn't - * run while other swi handlers are running and timeout routines can call - * swi handlers. Everything includes SWI_AST_MASK so that AST's are masked - * until just before return to user mode. SWI_TTY_MASK includes SWI_NET_MASK - * in case tty interrupts are processed at splsofttty() for a tty that is in - * SLIP or PPP line discipline (this is weaker than merging net_imask with - * tty_imask in isa.c - splimp() must mask hard and soft tty interrupts, but - * spltty() apparently only needs to mask soft net interrupts). - */ -#define SWI_TTY_MASK (SWI_TTY_PENDING | SWI_CLOCK_MASK | SWI_NET_MASK) -#define SWI_NET_MASK (SWI_NET_PENDING | SWI_CLOCK_MASK) -#define SWI_CLOCK_MASK (SWI_CLOCK_PENDING | SWI_AST_MASK) -#define SWI_AST_MASK SWI_AST_PENDING -#define SWI_MASK (~HWI_MASK) - -#ifdef OSKIT -#include "osenv.h" - -extern unsigned oskit_freebsd_cpl; -extern unsigned oskit_freebsd_ipending; - -#define GENERIC_SPL(you_name_it) \ -static __inline int spl##you_name_it(void) \ -{ \ - int t; \ - osenv_intr_disable(); \ - t = oskit_freebsd_cpl; \ - oskit_freebsd_cpl = 1; \ - return t; \ -} - -GENERIC_SPL(imp) -GENERIC_SPL(net) -GENERIC_SPL(bio) -GENERIC_SPL(high) -GENERIC_SPL(clock) -GENERIC_SPL(tty) -GENERIC_SPL(softtty) -/* - * this is used to reduce the clock spl to a softclock spl before - * calling the softclock handler directly. It will never call splx! - */ -#define splsoftclock() 0 - -static __inline void splx(int x) -{ - if (x == 0) { - oskit_freebsd_cpl = 0; - osenv_intr_enable(); - } -} - -/* for code from NetBSD */ -#define spl0() splx(0) - -#define setsoftclock() (oskit_freebsd_ipending |= SWI_CLOCK_PENDING) -#define setsofttty() (oskit_freebsd_ipending |= SWI_TTY_PENDING) - -#define schedsofttty() (oskit_freebsd_ipending |= SWI_TTY_PENDING) - -/* - * functions to save and restore the current cpl - */ -static __inline void save_cpl(unsigned *x) -{ - *x = oskit_freebsd_cpl; -} - -static __inline void restore_cpl(unsigned x) -{ - oskit_freebsd_cpl = x; -} - -#else /* !OSKIT */ -#ifndef LOCORE - -extern unsigned bio_imask; /* group of interrupts masked with splbio() */ -extern unsigned cpl; /* current priority level mask */ -extern volatile unsigned idelayed; /* interrupts to become pending */ -extern volatile unsigned ipending; /* active interrupts masked by cpl */ -extern unsigned net_imask; /* group of interrupts masked with splimp() */ -extern unsigned stat_imask; /* interrupts masked with splstatclock() */ -extern unsigned tty_imask; /* group of interrupts masked with spltty() */ - -/* - * ipending has to be volatile so that it is read every time it is accessed - * in splx() and spl0(), but we don't want it to be read nonatomically when - * it is changed. Pretending that ipending is a plain int happens to give - * suitable atomic code for "ipending |= constant;". - */ -#define setdelayed() (*(unsigned *)&ipending |= loadandclear(&idelayed)) -#define setsoftast() (*(unsigned *)&ipending |= SWI_AST_PENDING) -#define setsoftclock() (*(unsigned *)&ipending |= SWI_CLOCK_PENDING) -#define setsoftnet() (*(unsigned *)&ipending |= SWI_NET_PENDING) -#define setsofttty() (*(unsigned *)&ipending |= SWI_TTY_PENDING) - -#define schedsofttty() (*(unsigned *)&idelayed |= SWI_TTY_PENDING) - -#ifdef __GNUC__ - -void splz __P((void)); - -#define GENSPL(name, set_cpl) \ -static __inline int name(void) \ -{ \ - unsigned x; \ - \ - __asm __volatile("" : : : "memory"); \ - x = cpl; \ - set_cpl; \ - return (x); \ -} - -GENSPL(splbio, cpl |= bio_imask) -GENSPL(splclock, cpl = HWI_MASK | SWI_MASK) -GENSPL(splhigh, cpl = HWI_MASK | SWI_MASK) -GENSPL(splimp, cpl |= net_imask) -GENSPL(splnet, cpl |= SWI_NET_MASK) -GENSPL(splsoftclock, cpl = SWI_CLOCK_MASK) -GENSPL(splsofttty, cpl |= SWI_TTY_MASK) -GENSPL(splstatclock, cpl |= stat_imask) -GENSPL(spltty, cpl |= tty_imask) - -static __inline void -spl0(void) -{ - cpl = SWI_AST_MASK; - if (ipending & ~SWI_AST_MASK) - splz(); -} - -static __inline void -splx(int ipl) -{ - cpl = ipl; - if (ipending & ~ipl) - splz(); -} - -#endif /* __GNUC__ */ - -#endif /* !LOCORE */ -#endif /* !OSKIT */ - -#endif /* !_MACHINE_IPL_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/stdarg.h b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/stdarg.h deleted file mode 100644 index 64014667714..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/stdarg.h +++ /dev/null @@ -1,63 +0,0 @@ -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)stdarg.h 8.1 (Berkeley) 6/10/93 - */ - -#ifndef _STDARG_H_ -#define _STDARG_H_ - -typedef char *va_list; - -#ifdef __GNUC__ -#define va_start(AP, LASTARG) \ - (AP = ((va_list) __builtin_next_arg (LASTARG))) -#else -#define __va_promote(type) \ - (((sizeof(type) + sizeof(int) - 1) / sizeof(int)) * sizeof(int)) - -#define va_start(ap, last) \ - (ap = ((va_list)&(last) + __va_promote(last))) -#endif - -#ifdef KERNEL -#define va_arg(ap, type) \ - ((type *)(ap += sizeof(type)))[-1] -#else -#define va_arg(ap, type) \ - ((type *)(ap += sizeof(type) < sizeof(int) ? \ - (abort(), 0) : sizeof(type)))[-1] -#endif - -#define va_end(ap) - -#endif /* !_STDARG_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/trap.h b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/trap.h deleted file mode 100644 index bd136824224..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/trap.h +++ /dev/null @@ -1,95 +0,0 @@ -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * William Jolitz. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * from: @(#)trap.h 5.4 (Berkeley) 5/9/91 - */ - -#ifndef _MACHINE_TRAP_H_ -#define _MACHINE_TRAP_H_ - -/* - * Trap type values - * also known in trap.c for name strings - */ - -#define T_PRIVINFLT 1 /* privileged instruction */ -#define T_BPTFLT 3 /* breakpoint instruction */ -#define T_ARITHTRAP 6 /* arithmetic trap */ -#define T_ASTFLT 7 /* system forced exception */ -#define T_PROTFLT 9 /* protection fault */ -#define T_TRCTRAP 10 /* debug exception (sic) */ -#define T_PAGEFLT 12 /* page fault */ -#define T_ALIGNFLT 14 /* alignment fault */ - -#define T_DIVIDE 18 /* integer divide fault */ -#define T_NMI 19 /* non-maskable trap */ -#define T_OFLOW 20 /* overflow trap */ -#define T_BOUND 21 /* bound instruction fault */ -#define T_DNA 22 /* device not available fault */ -#define T_DOUBLEFLT 23 /* double fault */ -#define T_FPOPFLT 24 /* fp coprocessor operand fetch fault */ -#define T_TSSFLT 25 /* invalid tss fault */ -#define T_SEGNPFLT 26 /* segment not present fault */ -#define T_STKFLT 27 /* stack fault */ -#define T_RESERVED 28 /* reserved (unknown) */ - -/* XXX most of the following codes aren't used, but could be. */ - -/* definitions for <sys/signal.h> */ -#define ILL_RESAD_FAULT T_RESADFLT -#define ILL_PRIVIN_FAULT T_PRIVINFLT -#define ILL_RESOP_FAULT T_RESOPFLT -#define ILL_ALIGN_FAULT T_ALIGNFLT -#define ILL_FPOP_FAULT T_FPOPFLT /* coprocessor operand fault */ - -/* codes for SIGFPE/ARITHTRAP */ -#define FPE_INTOVF_TRAP 0x1 /* integer overflow */ -#define FPE_INTDIV_TRAP 0x2 /* integer divide by zero */ -#define FPE_FLTDIV_TRAP 0x3 /* floating/decimal divide by zero */ -#define FPE_FLTOVF_TRAP 0x4 /* floating overflow */ -#define FPE_FLTUND_TRAP 0x5 /* floating underflow */ -#define FPE_FPU_NP_TRAP 0x6 /* floating point unit not present */ -#define FPE_SUBRNG_TRAP 0x7 /* subrange out of bounds */ - -/* codes for SIGBUS */ -#define BUS_PAGE_FAULT T_PAGEFLT /* page fault protection base */ -#define BUS_SEGNP_FAULT T_SEGNPFLT /* segment not present */ -#define BUS_STK_FAULT T_STKFLT /* stack segment */ -#define BUS_SEGM_FAULT T_RESERVED /* segment protection base */ - -/* Trap's coming from user mode */ -#define T_USER 0x100 - -#endif /* !_MACHINE_TRAP_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/types.h b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/types.h deleted file mode 100644 index dcbb29c08fe..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/types.h +++ /dev/null @@ -1,65 +0,0 @@ -/*- - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)types.h 8.3 (Berkeley) 1/5/94 - */ - -#ifndef _MACHTYPES_H_ -#define _MACHTYPES_H_ - -#if !defined(_ANSI_SOURCE) && !defined(_POSIX_SOURCE) -typedef struct _physadr { - int r[1]; -} *physadr; - -typedef struct label_t { - int val[6]; -} label_t; -#endif - -typedef unsigned long vm_offset_t; -typedef unsigned long vm_size_t; - -/* - * Basic integral types. Omit the typedef if - * not possible for a machine/compiler combination. - */ -typedef __signed char int8_t; -typedef unsigned char u_int8_t; -typedef short int16_t; -typedef unsigned short u_int16_t; -typedef int int32_t; -typedef unsigned int u_int32_t; -typedef long long int64_t; -typedef unsigned long long u_int64_t; - -#endif /* _MACHTYPES_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/vmparam.h b/reactos/lib/oskittcp/include/freebsd/src/sys/machine/vmparam.h deleted file mode 100644 index d5944b3d62b..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/machine/vmparam.h +++ /dev/null @@ -1,136 +0,0 @@ -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * Copyright (c) 1994 John S. Dyson - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * William Jolitz. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * from: @(#)vmparam.h 5.9 (Berkeley) 5/12/91 - */ - - -#ifndef _MACHINE_VMPARAM_H_ -#define _MACHINE_VMPARAM_H_ 1 - -/* - * Machine dependent constants for 386. - */ - -/* - * Virtual memory related constants, all in bytes - */ -#define MAXTSIZ (16UL*1024*1024) /* max text size */ -#ifndef DFLDSIZ -#define DFLDSIZ (64UL*1024*1024) /* initial data size limit */ -#endif -#ifndef MAXDSIZ -#define MAXDSIZ (128UL*1024*1024) /* max data size */ -#endif -#ifndef DFLSSIZ -#define DFLSSIZ (8UL*1024*1024) /* initial stack size limit */ -#endif -#ifndef MAXSSIZ -#define MAXSSIZ (64UL*1024*1024) /* max stack size */ -#endif -#ifndef SGROWSIZ -#define SGROWSIZ (128UL*1024) /* amount to grow stack */ -#endif - -#define USRTEXT (1*NBPG) /* base of user text XXX bogus */ - -/* - * Default sizes of swap allocation chunks (see dmap.h). - * The actual values may be changed in vminit() based on MAXDSIZ. - * With MAXDSIZ of 16Mb and NDMAP of 38, dmmax will be 1024. - */ -#define DMMIN 32 /* smallest swap allocation */ -#define DMMAX 4096 /* largest potential swap allocation */ -#define DMTEXT 1024 /* swap allocation for text */ - -/* - * Sizes of the system and user portions of the system page table. - */ -#define SYSPTSIZE (2*NPTEPG) -#define USRPTSIZE (2*NPTEPG) - -/* - * Size of the Shared Memory Pages page table. - */ -#ifndef SHMMAXPGS -#define SHMMAXPGS 1024 /* XXX until we have more kmap space */ -#endif - -/* - * Size of User Raw I/O map - */ -#define USRIOSIZE 1024 - -/* - * The time for a process to be blocked before being very swappable. - * This is a number of seconds which the system takes as being a non-trivial - * amount of real time. You probably shouldn't change this; - * it is used in subtle ways (fractions and multiples of it are, that is, like - * half of a ``long time'', almost a long time, etc.) - * It is related to human patience and other factors which don't really - * change over time. - */ -#define MAXSLP 20 - -/* - * Mach derived constants - */ - -/* user/kernel map constants */ -#ifdef OSKIT -#define KERNBASE 0 /* XXX */ -#else -#define KERNBASE ((0x400-1-NKPDE)*(NBPG*NPTEPG)) -#endif - -#define VM_MIN_ADDRESS ((vm_offset_t)0) -#define VM_MAXUSER_ADDRESS ((vm_offset_t)KERNBASE - (NBPG*(NPTEPG+UPAGES))) -#define USRSTACK VM_MAXUSER_ADDRESS -#define UPT_MIN_ADDRESS ((vm_offset_t)KERNBASE - (NBPG*NPTEPG)) -#define UPT_MAX_ADDRESS ((vm_offset_t)KERNBASE - (NBPG*(NKPDE+2))) -#define VM_MAX_ADDRESS UPT_MAX_ADDRESS -#define VM_MIN_KERNEL_ADDRESS ((vm_offset_t)KERNBASE - (NBPG*(NKPDE+2))) -#define UPDT VM_MIN_KERNEL_ADDRESS -#define KPT_MIN_ADDRESS ((vm_offset_t)KERNBASE - NBPG*(NKPDE+1)) -#define KPT_MAX_ADDRESS ((vm_offset_t)KERNBASE - NBPG) -#define VM_MAX_KERNEL_ADDRESS ((vm_offset_t)KERNBASE + NKPDE*NBPG*NPTEPG) - -/* virtual sizes (bytes) for various kernel submaps */ -#define VM_KMEM_SIZE (32 * 1024 * 1024) -#define VM_PHYS_SIZE (USRIOSIZE*CLBYTES) - -#endif /* _MACHINE_VMPARAM_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/net/if.h b/reactos/lib/oskittcp/include/freebsd/src/sys/net/if.h deleted file mode 100644 index aca7de714cb..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/net/if.h +++ /dev/null @@ -1,394 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)if.h 8.1 (Berkeley) 6/10/93 - * $\Id: if.h,v 1.18.4.1 1996/06/24 22:04:13 gpalmer Exp $ - */ - -#ifndef _NET_IF_H_ -#define _NET_IF_H_ - -/* - * Structures defining a network interface, providing a packet - * transport mechanism (ala level 0 of the PUP protocols). - * - * Each interface accepts output datagrams of a specified maximum - * length, and provides higher level routines with input datagrams - * received from its medium. - * - * Output occurs when the routine if_output is called, with three parameters: - * (*ifp->if_output)(ifp, m, dst, rt) - * Here m is the mbuf chain to be sent and dst is the destination address. - * The output routine encapsulates the supplied datagram if necessary, - * and then transmits it on its medium. - * - * On input, each interface unwraps the data received by it, and either - * places it on the input queue of a internetwork datagram routine - * and posts the associated software interrupt, or passes the datagram to a raw - * packet input routine. - * - * Routines exist for locating interfaces by their addresses - * or for locating a interface on a certain network, as well as more general - * routing and gateway routines maintaining information used to locate - * interfaces. These routines live in the files if.c and route.c - */ - -#include <sys/socket.h> /* for struct sockaddr */ - -#ifndef _TIME_ /* XXX fast fix for SNMP, going away soon */ -#include <sys/time.h> -#endif - -#ifdef __STDC__ -/* - * Forward structure declarations for function prototypes [sic]. - */ -struct mbuf; -struct proc; -struct rtentry; -struct socket; -struct ether_header; -#endif -/* - * Structure describing information about an interface - * which may be of interest to management entities. - */ -/* - * Structure defining a queue for a network interface. - * - * (Would like to call this struct ``if'', but C isn't PL/1.) - */ - -struct ifnet { - char *if_name; /* name, e.g. ``en'' or ``lo'' */ - struct ifnet *if_next; /* all struct ifnets are chained */ - struct ifaddr *if_addrlist; /* linked list of addresses per if */ - int if_pcount; /* number of promiscuous listeners */ - caddr_t if_bpf; /* packet filter structure */ - u_short if_index; /* numeric abbreviation for this if */ - short if_unit; /* sub-unit for lower level driver */ - short if_timer; /* time 'til if_watchdog called */ - short if_flags; /* up/down, broadcast, etc. */ - struct if_data { -/* generic interface information */ - u_char ifi_type; /* ethernet, tokenring, etc */ - u_char ifi_physical; /* e.g., AUI, Thinnet, 10base-T, etc */ - u_char ifi_addrlen; /* media address length */ - u_char ifi_hdrlen; /* media header length */ - u_long ifi_mtu; /* maximum transmission unit */ - u_long ifi_metric; /* routing metric (external only) */ - u_long ifi_baudrate; /* linespeed */ -/* volatile statistics */ - u_long ifi_ipackets; /* packets received on interface */ - u_long ifi_ierrors; /* input errors on interface */ - u_long ifi_opackets; /* packets sent on interface */ - u_long ifi_oerrors; /* output errors on interface */ - u_long ifi_collisions; /* collisions on csma interfaces */ - u_long ifi_ibytes; /* total number of octets received */ - u_long ifi_obytes; /* total number of octets sent */ - u_long ifi_imcasts; /* packets received via multicast */ - u_long ifi_omcasts; /* packets sent via multicast */ - u_long ifi_iqdrops; /* dropped on input, this interface */ - u_long ifi_noproto; /* destined for unsupported protocol */ - struct timeval ifi_lastchange;/* time of last administrative change */ - } if_data; -/* procedure handles */ - void (*if_init) /* init routine */ - __P((int)); - int (*if_output) /* output routine (enqueue) */ - __P((struct ifnet *, struct mbuf *, struct sockaddr *, - struct rtentry *)); - void (*if_start) /* initiate output routine */ - __P((struct ifnet *)); - int (*if_done) /* output complete routine */ - __P((struct ifnet *)); /* (XXX not used; fake prototype) */ - int (*if_ioctl) /* ioctl routine */ - __P((struct ifnet *, int, caddr_t)); - void (*if_reset) - __P((int)); /* new autoconfig will permit removal */ - void (*if_watchdog) /* timer routine */ - __P((int)); - struct ifqueue { - struct mbuf *ifq_head; - struct mbuf *ifq_tail; - int ifq_len; - int ifq_maxlen; - int ifq_drops; - } if_snd; /* output queue */ -}; -#define if_mtu if_data.ifi_mtu -#define if_type if_data.ifi_type -#define if_physical if_data.ifi_physical -#define if_addrlen if_data.ifi_addrlen -#define if_hdrlen if_data.ifi_hdrlen -#define if_metric if_data.ifi_metric -#define if_baudrate if_data.ifi_baudrate -#define if_ipackets if_data.ifi_ipackets -#define if_ierrors if_data.ifi_ierrors -#define if_opackets if_data.ifi_opackets -#define if_oerrors if_data.ifi_oerrors -#define if_collisions if_data.ifi_collisions -#define if_ibytes if_data.ifi_ibytes -#define if_obytes if_data.ifi_obytes -#define if_imcasts if_data.ifi_imcasts -#define if_omcasts if_data.ifi_omcasts -#define if_iqdrops if_data.ifi_iqdrops -#define if_noproto if_data.ifi_noproto -#define if_lastchange if_data.ifi_lastchange -#define if_rawoutput(if, m, sa) if_output(if, m, sa, (struct rtentry *)0) - -#define IFF_UP 0x1 /* interface is up */ -#define IFF_BROADCAST 0x2 /* broadcast address valid */ -#define IFF_DEBUG 0x4 /* turn on debugging */ -#define IFF_LOOPBACK 0x8 /* is a loopback net */ -#define IFF_POINTOPOINT 0x10 /* interface is point-to-point link */ -#define IFF_NOTRAILERS 0x20 /* avoid use of trailers */ -#define IFF_RUNNING 0x40 /* resources allocated */ -#define IFF_NOARP 0x80 /* no address resolution protocol */ -#define IFF_PROMISC 0x100 /* receive all packets */ -#define IFF_ALLMULTI 0x200 /* receive all multicast packets */ -#define IFF_OACTIVE 0x400 /* transmission in progress */ -#define IFF_SIMPLEX 0x800 /* can't hear own transmissions */ -#define IFF_LINK0 0x1000 /* per link layer defined bit */ -#define IFF_LINK1 0x2000 /* per link layer defined bit */ -#define IFF_LINK2 0x4000 /* per link layer defined bit */ -#define IFF_ALTPHYS IFF_LINK2 /* use alternate physical connection */ -#define IFF_MULTICAST 0x8000 /* supports multicast */ - -/* flags set internally only: */ -#define IFF_CANTCHANGE \ - (IFF_BROADCAST|IFF_POINTOPOINT|IFF_RUNNING|IFF_OACTIVE|\ - IFF_SIMPLEX|IFF_MULTICAST|IFF_ALLMULTI) - - -/* - * These really don't belong here, but there's no other obviously appropriate - * location. - */ -#define IFP_AUI 0 -#define IFP_10BASE2 1 -#define IFP_10BASET 2 -/* etc. */ - -/* - * Output queues (ifp->if_snd) and internetwork datagram level (pup level 1) - * input routines have queues of messages stored on ifqueue structures - * (defined above). Entries are added to and deleted from these structures - * by these macros, which should be called with ipl raised to splimp(). - */ -#define IF_QFULL(ifq) ((ifq)->ifq_len >= (ifq)->ifq_maxlen) -#define IF_DROP(ifq) ((ifq)->ifq_drops++) -#define IF_ENQUEUE(ifq, m) { \ - (m)->m_nextpkt = 0; \ - if ((ifq)->ifq_tail == 0) \ - (ifq)->ifq_head = m; \ - else \ - (ifq)->ifq_tail->m_nextpkt = m; \ - (ifq)->ifq_tail = m; \ - (ifq)->ifq_len++; \ -} -#define IF_PREPEND(ifq, m) { \ - (m)->m_nextpkt = (ifq)->ifq_head; \ - if ((ifq)->ifq_tail == 0) \ - (ifq)->ifq_tail = (m); \ - (ifq)->ifq_head = (m); \ - (ifq)->ifq_len++; \ -} -#define IF_DEQUEUE(ifq, m) { \ - (m) = (ifq)->ifq_head; \ - if (m) { \ - if (((ifq)->ifq_head = (m)->m_nextpkt) == 0) \ - (ifq)->ifq_tail = 0; \ - (m)->m_nextpkt = 0; \ - (ifq)->ifq_len--; \ - } \ -} - -#define IFQ_MAXLEN 50 -#define IFNET_SLOWHZ 1 /* granularity is 1 second */ - -#ifndef __REACTOS__ -/* - * The ifaddr structure contains information about one address - * of an interface. They are maintained by the different address families, - * are allocated and attached when an address is set, and are linked - * together so all addresses for an interface can be located. - */ -struct ifaddr { - struct sockaddr *ifa_addr; /* address of interface */ - struct sockaddr *ifa_dstaddr; /* other end of p-to-p link */ -#define ifa_broadaddr ifa_dstaddr /* broadcast address interface */ - struct sockaddr *ifa_netmask; /* used to determine subnet */ - struct ifnet *ifa_ifp; /* back-pointer to interface */ - struct ifaddr *ifa_next; /* next address for interface */ - void (*ifa_rtrequest) /* check or clean routes (+ or -)'d */ - __P((int, struct rtentry *, struct sockaddr *)); - u_short ifa_flags; /* mostly rt_flags for cloning */ - short ifa_refcnt; /* extra to malloc for link info */ - int ifa_metric; /* cost of going out this interface */ -#ifdef notdef - struct rtentry *ifa_rt; /* XXXX for ROUTETOIF ????? */ -#endif -}; -#define IFA_ROUTE RTF_UP /* route installed */ -#endif - -/* - * Message format for use in obtaining information about interfaces - * from getkerninfo and the routing socket - */ -struct if_msghdr { - u_short ifm_msglen; /* to skip over non-understood messages */ - u_char ifm_version; /* future binary compatability */ - u_char ifm_type; /* message type */ - int ifm_addrs; /* like rtm_addrs */ - int ifm_flags; /* value of if_flags */ - u_short ifm_index; /* index for associated ifp */ - struct if_data ifm_data;/* statistics and other data about if */ -}; - -/* - * Message format for use in obtaining information about interface addresses - * from getkerninfo and the routing socket - */ -struct ifa_msghdr { - u_short ifam_msglen; /* to skip over non-understood messages */ - u_char ifam_version; /* future binary compatability */ - u_char ifam_type; /* message type */ - int ifam_addrs; /* like rtm_addrs */ - int ifam_flags; /* value of ifa_flags */ - u_short ifam_index; /* index for associated ifp */ - int ifam_metric; /* value of ifa_metric */ -}; - -/* - * Interface request structure used for socket - * ioctl's. All interface ioctl's must have parameter - * definitions which begin with ifr_name. The - * remainder may be interface specific. - */ -struct ifreq { -#define IFNAMSIZ 16 - char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */ - union { - struct sockaddr ifru_addr; - struct sockaddr ifru_dstaddr; - struct sockaddr ifru_broadaddr; - short ifru_flags; - int ifru_metric; - int ifru_mtu; - int ifru_phys; - caddr_t ifru_data; - } ifr_ifru; -#define ifr_addr ifr_ifru.ifru_addr /* address */ -#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */ -#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */ -#define ifr_flags ifr_ifru.ifru_flags /* flags */ -#define ifr_metric ifr_ifru.ifru_metric /* metric */ -#define ifr_mtu ifr_ifru.ifru_mtu /* mtu */ -#define ifr_phys ifr_ifru.ifru_phys /* physical wire */ -#define ifr_data ifr_ifru.ifru_data /* for use by interface */ -}; - -struct ifaliasreq { - char ifra_name[IFNAMSIZ]; /* if name, e.g. "en0" */ - struct sockaddr ifra_addr; - struct sockaddr ifra_broadaddr; - struct sockaddr ifra_mask; -}; - -/* - * Structure used in SIOCGIFCONF request. - * Used to retrieve interface configuration - * for machine (useful for programs which - * must know all networks accessible). - */ -struct ifconf { - int ifc_len; /* size of associated buffer */ - union { - caddr_t ifcu_buf; - struct ifreq *ifcu_req; - } ifc_ifcu; -#define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */ -#define ifc_req ifc_ifcu.ifcu_req /* array of structures returned */ -}; - -#include <net/if_arp.h> - -#ifdef KERNEL -#define IFAFREE(ifa) \ - if ((ifa)->ifa_refcnt <= 0) \ - ifafree(ifa); \ - else \ - (ifa)->ifa_refcnt--; - -extern struct ifnet *ifnet; -extern struct ifnet loif[]; - -void ether_ifattach __P((struct ifnet *)); -void ether_input __P((struct ifnet *, struct ether_header *, struct mbuf *)); -int ether_output __P((struct ifnet *, - struct mbuf *, struct sockaddr *, struct rtentry *)); -char *ether_sprintf __P((u_char *)); - -void if_attach __P((struct ifnet *)); -void if_down __P((struct ifnet *)); -void if_qflush __P((struct ifqueue *)); -void if_slowtimo __P((void *)); -void if_up __P((struct ifnet *)); -#ifdef vax -void ifubareset __P((int)); -#endif -int ifconf __P((int, caddr_t)); -/*void ifinit __P((void));*/ /* declared in systm.h for main() */ -int ifioctl __P((struct socket *, int, caddr_t, struct proc *)); -int ifpromisc __P((struct ifnet *, int)); -struct ifnet *ifunit __P((char *)); - -int ifa_ifwithaddr __P((struct sockaddr *, struct ifaddr *)); -struct ifaddr *ifa_ifwithaf __P((int)); -struct ifaddr *ifa_ifwithdstaddr __P((struct sockaddr *, struct ifaddr *)); -int ifa_ifwithnet __P((struct sockaddr *, struct ifaddr *)); -struct ifaddr *ifa_ifwithroute __P((int, struct sockaddr *, - struct sockaddr *)); -struct ifaddr *ifaof_ifpforaddr __P((struct sockaddr *, struct ifnet *)); -void ifafree __P((struct ifaddr *)); -void link_rtrequest __P((int, struct rtentry *, struct sockaddr *)); - -int loioctl __P((struct ifnet *, int, caddr_t)); -void loopattach __P((void)); -int looutput __P((struct ifnet *, - struct mbuf *, struct sockaddr *, struct rtentry *)); -void lortrequest __P((int, struct rtentry *, struct sockaddr *)); -#endif /* KERNEL */ - -#endif /* !_NET_IF_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/net/if_arp.h b/reactos/lib/oskittcp/include/freebsd/src/sys/net/if_arp.h deleted file mode 100644 index acac0855c11..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/net/if_arp.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)if_arp.h 8.1 (Berkeley) 6/10/93 - */ - -#ifndef _NET_IF_ARP_H_ -#define _NET_IF_ARP_H_ - -#include <sys/socket.h> /* for struct sockaddr */ - -/* - * Address Resolution Protocol. - * - * See RFC 826 for protocol description. ARP packets are variable - * in size; the arphdr structure defines the fixed-length portion. - * Protocol type values are the same as those for 10 Mb/s Ethernet. - * It is followed by the variable-sized fields ar_sha, arp_spa, - * arp_tha and arp_tpa in that order, according to the lengths - * specified. Field names used correspond to RFC 826. - */ -struct arphdr { - u_short ar_hrd; /* format of hardware address */ -#define ARPHRD_ETHER 1 /* ethernet hardware format */ -#define ARPHRD_FRELAY 15 /* frame relay hardware format */ - u_short ar_pro; /* format of protocol address */ - u_char ar_hln; /* length of hardware address */ - u_char ar_pln; /* length of protocol address */ - u_short ar_op; /* one of: */ -#define ARPOP_REQUEST 1 /* request to resolve address */ -#define ARPOP_REPLY 2 /* response to previous request */ -#define ARPOP_REVREQUEST 3 /* request protocol address given hardware */ -#define ARPOP_REVREPLY 4 /* response giving protocol address */ -#define ARPOP_INVREQUEST 8 /* request to identify peer */ -#define ARPOP_INVREPLY 9 /* response identifying peer */ -/* - * The remaining fields are variable in size, - * according to the sizes above. - */ -#ifdef COMMENT_ONLY - u_char ar_sha[]; /* sender hardware address */ - u_char ar_spa[]; /* sender protocol address */ - u_char ar_tha[]; /* target hardware address */ - u_char ar_tpa[]; /* target protocol address */ -#endif -}; - -/* - * ARP ioctl request - */ -struct arpreq { - struct sockaddr arp_pa; /* protocol address */ - struct sockaddr arp_ha; /* hardware address */ - int arp_flags; /* flags */ -}; -/* arp_flags and at_flags field values */ -#define ATF_INUSE 0x01 /* entry in use */ -#define ATF_COM 0x02 /* completed entry (enaddr valid) */ -#define ATF_PERM 0x04 /* permanent entry */ -#define ATF_PUBL 0x08 /* publish entry (respond for other host) */ -#define ATF_USETRAILERS 0x10 /* has requested trailers */ - -#endif /* !_NET_IF_ARP_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/net/netisr.h b/reactos/lib/oskittcp/include/freebsd/src/sys/net/netisr.h deleted file mode 100644 index f212d63b8f4..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/net/netisr.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (c) 1980, 1986, 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)netisr.h 8.1 (Berkeley) 6/10/93 - */ - -#ifndef _NET_NETISR_H_ -#define _NET_NETISR_H_ - -/* - * The networking code runs off software interrupts. - * - * You can switch into the network by doing splnet() and return by splx(). - * The software interrupt level for the network is higher than the software - * level for the clock (so you can enter the network in routines called - * at timeout time). - */ -#if defined(vax) || defined(tahoe) -#define setsoftnet() mtpr(SIRR, 12) -#endif - -/* - * Each ``pup-level-1'' input queue has a bit in a ``netisr'' status - * word which is used to de-multiplex a single software - * interrupt used for scheduling the network code to calls - * on the lowest level routine of each protocol. - */ -#define NETISR_RAW 0 /* same as AF_UNSPEC */ -#define NETISR_IP 2 /* same as AF_INET */ -#define NETISR_IMP 3 /* same as AF_IMPLINK */ -#define NETISR_NS 6 /* same as AF_NS */ -#define NETISR_ISO 7 /* same as AF_ISO */ -#define NETISR_CCITT 10 /* same as AF_CCITT */ -#define NETISR_ARP 18 /* same as AF_LINK */ -#define NETISR_ISDN 26 /* same as AF_E164 */ - -#define schednetisr(anisr) { netisr |= 1<<(anisr); setsoftnet(); } - -#ifndef LOCORE -#ifdef KERNEL -extern volatile unsigned int netisr; /* scheduling bits for network */ - -typedef void netisr_t(void); - -struct netisrtab { - int nit_num; - netisr_t *nit_isr; -}; - -#define NETISR_SET(num, isr) \ - static struct netisrtab mod_nit = { num, isr }; \ - DATA_SET(netisr_set, mod_nit); - -#endif -#endif - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/net/radix.h b/reactos/lib/oskittcp/include/freebsd/src/sys/net/radix.h deleted file mode 100644 index c37058b3cac..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/net/radix.h +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright (c) 1988, 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)radix.h 8.2 (Berkeley) 10/31/94 - */ - -#ifndef _RADIX_H_ -#define _RADIX_H_ - -/* - * Radix search tree node layout. - */ - -struct radix_node { - struct radix_mask *rn_mklist; /* list of masks contained in subtree */ - struct radix_node *rn_p; /* parent */ - short rn_b; /* bit offset; -1-index(netmask) */ - char rn_bmask; /* node: mask for bit test*/ - u_char rn_flags; /* enumerated next */ -#define RNF_NORMAL 1 /* leaf contains normal route */ -#define RNF_ROOT 2 /* leaf is root leaf for tree */ -#define RNF_ACTIVE 4 /* This node is alive (for rtfree) */ - union { - struct { /* leaf only data: */ - caddr_t rn_Key; /* object of search */ - caddr_t rn_Mask; /* netmask, if present */ - struct radix_node *rn_Dupedkey; - } rn_leaf; - struct { /* node only data: */ - int rn_Off; /* where to start compare */ - struct radix_node *rn_L;/* progeny */ - struct radix_node *rn_R;/* progeny */ - } rn_node; - } rn_u; -#ifdef RN_DEBUG - int rn_info; - struct radix_node *rn_twin; - struct radix_node *rn_ybro; -#endif -}; - -#define rn_dupedkey rn_u.rn_leaf.rn_Dupedkey -#define rn_key rn_u.rn_leaf.rn_Key -#define rn_mask rn_u.rn_leaf.rn_Mask -#define rn_off rn_u.rn_node.rn_Off -#define rn_l rn_u.rn_node.rn_L -#define rn_r rn_u.rn_node.rn_R - -/* - * Annotations to tree concerning potential routes applying to subtrees. - */ - -extern struct radix_mask { - short rm_b; /* bit offset; -1-index(netmask) */ - char rm_unused; /* cf. rn_bmask */ - u_char rm_flags; /* cf. rn_flags */ - struct radix_mask *rm_mklist; /* more masks to try */ - union { - caddr_t rmu_mask; /* the mask */ - struct radix_node *rmu_leaf; /* for normal routes */ - } rm_rmu; - int rm_refs; /* # of references to this struct */ -} *rn_mkfreelist; - -#define rm_mask rm_rmu.rmu_mask -#define rm_leaf rm_rmu.rmu_leaf /* extra field would make 32 bytes */ - -#define MKGet(m) {\ - if (rn_mkfreelist) {\ - m = rn_mkfreelist; \ - rn_mkfreelist = (m)->rm_mklist; \ - } else \ - R_Malloc(m, struct radix_mask *, sizeof (*(m))); }\ - -#define MKFree(m) { (m)->rm_mklist = rn_mkfreelist; rn_mkfreelist = (m);} - -typedef int walktree_f_t __P((struct radix_node *, void *)); - -struct radix_node_head { - struct radix_node *rnh_treetop; - int rnh_addrsize; /* permit, but not require fixed keys */ - int rnh_pktsize; /* permit, but not require fixed keys */ - struct radix_node *(*rnh_addaddr) /* add based on sockaddr */ - __P((void *v, void *mask, - struct radix_node_head *head, struct radix_node nodes[])); - struct radix_node *(*rnh_addpkt) /* add based on packet hdr */ - __P((void *v, void *mask, - struct radix_node_head *head, struct radix_node nodes[])); - struct radix_node *(*rnh_deladdr) /* remove based on sockaddr */ - __P((void *v, void *mask, struct radix_node_head *head)); - struct radix_node *(*rnh_delpkt) /* remove based on packet hdr */ - __P((void *v, void *mask, struct radix_node_head *head)); - struct radix_node *(*rnh_matchaddr) /* locate based on sockaddr */ - __P((void *v, struct radix_node_head *head)); - struct radix_node *(*rnh_lookup) /* locate based on sockaddr */ - __P((void *v, void *mask, struct radix_node_head *head)); - struct radix_node *(*rnh_matchpkt) /* locate based on packet hdr */ - __P((void *v, struct radix_node_head *head)); - int (*rnh_walktree) /* traverse tree */ - __P((struct radix_node_head *head, walktree_f_t *f, void *w)); - int (*rnh_walktree_from) /* traverse tree below a */ - __P((struct radix_node_head *head, void *a, void *m, - walktree_f_t *f, void *w)); - void (*rnh_close) /* do something when the last ref drops */ - __P((struct radix_node *rn, struct radix_node_head *head)); - struct radix_node rnh_nodes[3]; /* empty tree for common case */ -}; - -#ifndef KERNEL -#define Bcmp(a, b, n) bcmp(((char *)(a)), ((char *)(b)), (n)) -#define Bcopy(a, b, n) bcopy(((char *)(a)), ((char *)(b)), (unsigned)(n)) -#define Bzero(p, n) bzero((char *)(p), (int)(n)); -#define R_Malloc(p, t, n) (p = (t) malloc((unsigned int)(n))) -#define Free(p) free((char *)p); -#else -#define Bcmp(a, b, n) bcmp(((caddr_t)(a)), ((caddr_t)(b)), (unsigned)(n)) -#define Bcopy(a, b, n) bcopy(((caddr_t)(a)), ((caddr_t)(b)), (unsigned)(n)) -#define Bzero(p, n) bzero((caddr_t)(p), (unsigned)(n)); -#define R_Malloc(p, t, n) (p = (t) malloc((unsigned long)(n), M_RTABLE, M_DONTWAIT)) -#define Free(p) free((caddr_t)p, M_RTABLE); -#endif /*KERNEL*/ - -extern struct radix_node_head *mask_rnhead; - -void rn_init __P((void)); -int rn_inithead __P((void **, int)); -int rn_refines __P((void *, void *)); -int rn_walktree __P((struct radix_node_head *, walktree_f_t *, void *)); -struct radix_node - *rn_addmask __P((void *, int, int)), - *rn_addroute __P((void *, void *, struct radix_node_head *, - struct radix_node [2])), - *rn_delete __P((void *, void *, struct radix_node_head *)), - *rn_insert __P((void *, struct radix_node_head *, int *, - struct radix_node [2])), - *rn_match __P((void *, struct radix_node_head *)), - *rn_newpair __P((void *, int, struct radix_node[2])), - *rn_search __P((void *, struct radix_node *)), - *rn_search_m __P((void *, struct radix_node *, void *)); - -#endif /* _RADIX_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/net/raw_cb.h b/reactos/lib/oskittcp/include/freebsd/src/sys/net/raw_cb.h deleted file mode 100644 index c1273190505..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/net/raw_cb.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 1980, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)raw_cb.h 8.1 (Berkeley) 6/10/93 - */ - -#ifndef _NET_RAW_CB_H_ -#define _NET_RAW_CB_H_ - -/* - * Raw protocol interface control block. Used - * to tie a socket to the generic raw interface. - */ -struct rawcb { - struct rawcb *rcb_next; /* doubly linked list */ - struct rawcb *rcb_prev; - struct socket *rcb_socket; /* back pointer to socket */ - struct sockaddr *rcb_faddr; /* destination address */ - struct sockaddr *rcb_laddr; /* socket's address */ - struct sockproto rcb_proto; /* protocol family, protocol */ -}; - -#define sotorawcb(so) ((struct rawcb *)(so)->so_pcb) - -/* - * Nominal space allocated to a raw socket. - */ -#define RAWSNDQ 8192 -#define RAWRCVQ 8192 - -#ifdef KERNEL -struct rawcb rawcb; /* head of list */ - -int raw_attach __P((struct socket *, int)); -void raw_ctlinput __P((int, struct sockaddr *)); -void raw_detach __P((struct rawcb *)); -void raw_disconnect __P((struct rawcb *)); -void raw_init __P((void)); -void raw_input __P((struct mbuf *, - struct sockproto *, struct sockaddr *, struct sockaddr *)); -int raw_usrreq __P((struct socket *, - int, struct mbuf *, struct mbuf *, struct mbuf *)); -#endif - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/net/route.h b/reactos/lib/oskittcp/include/freebsd/src/sys/net/route.h deleted file mode 100644 index ef78cbb9392..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/net/route.h +++ /dev/null @@ -1,258 +0,0 @@ -/* - * Copyright (c) 1980, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)route.h 8.3 (Berkeley) 4/19/94 - */ - -#ifndef _NET_ROUTE_H_ -#define _NET_ROUTE_H_ - -#include <oskittypes.h> - -/* - * Kernel resident routing tables. - * - * The routing tables are initialized when interface addresses - * are set by making entries for all directly connected interfaces. - */ - -/* - * A route consists of a destination address and a reference - * to a routing entry. These are often held by protocols - * in their control blocks, e.g. inpcb. - */ -struct route { - struct rtentry ro_rt; - struct sockaddr ro_dst; -}; - -/* - * rmx_rtt and rmx_rttvar are stored as microseconds; - * RTTTOPRHZ(rtt) converts to a value suitable for use - * by a protocol slowtimo counter. - */ -#define RTM_RTTUNIT 1000000 /* units for rtt, rttvar, as units per sec */ -#define RTTTOPRHZ(r) ((r) / (RTM_RTTUNIT / PR_SLOWHZ)) - -/* - * XXX kernel function pointer `rt_output' is visible to applications. - */ -struct mbuf; - -/* - * We distinguish between routes to hosts and routes to networks, - * preferring the former if available. For each route we infer - * the interface to use from the gateway address supplied when - * the route was entered. Routes that forward packets through - * gateways are marked so that the output routines know to address the - * gateway rather than the ultimate destination. - */ -#ifndef RNF_NORMAL -#include <net/radix.h> -#endif - -#include <oskittcp.h> - -#ifndef __REACTOS__ -/* - * Following structure necessary for 4.3 compatibility; - * We should eventually move it to a compat file. - */ -struct rtentry { - u_long rt_hash; /* to speed lookups */ - struct sockaddr rt_dst; /* key */ - struct sockaddr rt_gateway; /* value */ - short rt_flags; /* up/down?, host/net */ - short rt_refcnt; /* # held references */ - u_long rt_use; /* raw # packets forwarded */ - struct ifnet *rt_ifp; /* the answer: interface to use */ -}; -#endif - -#define rt_use rt_rmx.rmx_pksent - -#define RTF_UP 0x1 /* route usable */ -#define RTF_GATEWAY 0x2 /* destination is a gateway */ -#define RTF_HOST 0x4 /* host entry (net otherwise) */ -#define RTF_REJECT 0x8 /* host or net unreachable */ -#define RTF_DYNAMIC 0x10 /* created dynamically (by redirect) */ -#define RTF_MODIFIED 0x20 /* modified dynamically (by redirect) */ -#define RTF_DONE 0x40 /* message confirmed */ -#define RTF_MASK 0x80 /* subnet mask present */ -#define RTF_CLONING 0x100 /* generate new routes on use */ -#define RTF_XRESOLVE 0x200 /* external daemon resolves name */ -#define RTF_LLINFO 0x400 /* generated by ARP or ESIS */ -#define RTF_STATIC 0x800 /* manually added */ -#define RTF_BLACKHOLE 0x1000 /* just discard pkts (during updates) */ -#define RTF_PROTO2 0x4000 /* protocol specific routing flag */ -#define RTF_PROTO1 0x8000 /* protocol specific routing flag */ - -#define RTF_PRCLONING 0x10000 /* protocol requires cloning */ -#define RTF_WASCLONED 0x20000 /* route generated through cloning */ -#define RTF_PROTO3 0x40000 /* protocol specific routing flag */ -#define RTF_CHAINDELETE 0x80000 /* chain is being deleted (internal) */ -#define RTF_PINNED 0x100000 /* future use */ - /* 0x200000 and up unassigned */ - -/* - * Routing statistics. - */ -struct rtstat { - short rts_badredirect; /* bogus redirect calls */ - short rts_dynamic; /* routes created by redirects */ - short rts_newgateway; /* routes modified by redirects */ - short rts_unreach; /* lookups which failed */ - short rts_wildcard; /* lookups satisfied by a wildcard */ -}; -/* - * Structures for routing messages. - */ -struct rt_msghdr { - u_short rtm_msglen; /* to skip over non-understood messages */ - u_char rtm_version; /* future binary compatibility */ - u_char rtm_type; /* message type */ - u_short rtm_index; /* index for associated ifp */ - int rtm_flags; /* flags, incl. kern & message, e.g. DONE */ - int rtm_addrs; /* bitmask identifying sockaddrs in msg */ - pid_t rtm_pid; /* identify sender */ - int rtm_seq; /* for sender to identify action */ - int rtm_errno; /* why failed */ - int rtm_use; /* from rtentry */ - u_long rtm_inits; /* which metrics we are initializing */ - struct rt_metrics rtm_rmx; /* metrics themselves */ -}; - -#define RTM_VERSION 5 /* Up the ante and ignore older versions */ - -#define RTM_ADD 0x1 /* Add Route */ -#define RTM_DELETE 0x2 /* Delete Route */ -#define RTM_CHANGE 0x3 /* Change Metrics or flags */ -#define RTM_GET 0x4 /* Report Metrics */ -#define RTM_LOSING 0x5 /* Kernel Suspects Partitioning */ -#define RTM_REDIRECT 0x6 /* Told to use different route */ -#define RTM_MISS 0x7 /* Lookup failed on this address */ -#define RTM_LOCK 0x8 /* fix specified metrics */ -#define RTM_OLDADD 0x9 /* caused by SIOCADDRT */ -#define RTM_OLDDEL 0xa /* caused by SIOCDELRT */ -#define RTM_RESOLVE 0xb /* req to resolve dst to LL addr */ -#define RTM_NEWADDR 0xc /* address being added to iface */ -#define RTM_DELADDR 0xd /* address being removed from iface */ -#define RTM_IFINFO 0xe /* iface going up/down etc. */ - -#define RTV_MTU 0x1 /* init or lock _mtu */ -#define RTV_HOPCOUNT 0x2 /* init or lock _hopcount */ -#define RTV_EXPIRE 0x4 /* init or lock _hopcount */ -#define RTV_RPIPE 0x8 /* init or lock _recvpipe */ -#define RTV_SPIPE 0x10 /* init or lock _sendpipe */ -#define RTV_SSTHRESH 0x20 /* init or lock _ssthresh */ -#define RTV_RTT 0x40 /* init or lock _rtt */ -#define RTV_RTTVAR 0x80 /* init or lock _rttvar */ - -/* - * Bitmask values for rtm_addr. - */ -#define RTA_DST 0x1 /* destination sockaddr present */ -#define RTA_GATEWAY 0x2 /* gateway sockaddr present */ -#define RTA_NETMASK 0x4 /* netmask sockaddr present */ -#define RTA_GENMASK 0x8 /* cloning mask sockaddr present */ -#define RTA_IFP 0x10 /* interface name sockaddr present */ -#define RTA_IFA 0x20 /* interface addr sockaddr present */ -#define RTA_AUTHOR 0x40 /* sockaddr for author of redirect */ -#define RTA_BRD 0x80 /* for NEWADDR, broadcast or p-p dest addr */ - -/* - * Index offsets for sockaddr array for alternate internal encoding. - */ -#define RTAX_DST 0 /* destination sockaddr present */ -#define RTAX_GATEWAY 1 /* gateway sockaddr present */ -#define RTAX_NETMASK 2 /* netmask sockaddr present */ -#define RTAX_GENMASK 3 /* cloning mask sockaddr present */ -#define RTAX_IFP 4 /* interface name sockaddr present */ -#define RTAX_IFA 5 /* interface addr sockaddr present */ -#define RTAX_AUTHOR 6 /* sockaddr for author of redirect */ -#define RTAX_BRD 7 /* for NEWADDR, broadcast or p-p dest addr */ -#define RTAX_MAX 8 /* size of array to allocate */ - -struct rt_addrinfo { - int rti_addrs; - struct sockaddr *rti_info[RTAX_MAX]; -}; - -struct route_cb { - int ip_count; - int ns_count; - int iso_count; - int any_count; -}; - -#ifdef KERNEL -#ifndef __REACTOS__ -#define RTFREE(rt) \ - if ((rt)->rt_refcnt <= 1) \ - rtfree(rt); \ - else \ - (rt)->rt_refcnt--; -#else -#define RTFREE(rt) rtfree(rt) -#endif - -struct route_cb route_cb; -struct rtstat rtstat; -struct radix_node_head *rt_tables[AF_MAX+1]; - -void route_init __P((void)); -int route_output __P((struct mbuf *, struct socket *)); -int route_usrreq __P((struct socket *, - int, struct mbuf *, struct mbuf *, struct mbuf *)); -void rt_ifmsg __P((struct ifnet *)); -void rt_maskedcopy __P((struct sockaddr *, - struct sockaddr *, struct sockaddr *)); -void rt_missmsg __P((int, struct rt_addrinfo *, int, int)); -void rt_newaddrmsg __P((int, struct ifaddr *, int, struct rtentry *)); -int rt_setgate __P((struct rtentry *, - struct sockaddr *, struct sockaddr *)); -void rt_setmetrics __P((u_long, struct rt_metrics *, struct rt_metrics *)); -void rtable_init __P((void **)); -void rtalloc __P((struct route *)); -void rtalloc_ign __P((struct route *, unsigned long)); -struct rtentry * - rtalloc1 __P((struct sockaddr *, int, unsigned long)); -void rtfree __P((struct rtentry *)); -int rtinit __P((struct ifaddr *, int, int)); -int rtioctl __P((int, caddr_t, struct proc *)); -void rtredirect __P((struct sockaddr *, struct sockaddr *, - struct sockaddr *, int, struct sockaddr *, struct rtentry **)); -int rtrequest __P((int, struct sockaddr *, - struct sockaddr *, struct sockaddr *, int, struct rtentry **)); -#endif - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/if_ether.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/if_ether.h deleted file mode 100644 index 057878f9ca1..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/if_ether.h +++ /dev/null @@ -1,237 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)if_ether.h 8.1 (Berkeley) 6/10/93 - */ - -#ifndef _NETINET_IF_ETHER_H_ -#define _NETINET_IF_ETHER_H_ - -#include <arpa/inet.h> - -/* - * Structure of a 10Mb/s Ethernet header. - */ -struct ether_header { - u_char ether_dhost[6]; - u_char ether_shost[6]; - u_short ether_type; -}; - -/* - * Structure of a 48-bit Ethernet address. - */ -struct ether_addr { - u_char octet[6]; -}; - -#define ETHERTYPE_PUP 0x0200 /* PUP protocol */ -#define ETHERTYPE_IP 0x0800 /* IP protocol */ -#define ETHERTYPE_ARP 0x0806 /* Addr. resolution protocol */ -#define ETHERTYPE_REVARP 0x8035 /* reverse Addr. resolution protocol */ - -/* - * The ETHERTYPE_NTRAILER packet types starting at ETHERTYPE_TRAIL have - * (type-ETHERTYPE_TRAIL)*512 bytes of data followed - * by an ETHER type (as given above) and then the (variable-length) header. - */ -#define ETHERTYPE_TRAIL 0x1000 /* Trailer packet */ -#define ETHERTYPE_NTRAILER 16 - -#define ETHERMTU 1500 -#define ETHERMIN (60-14) - -#ifdef KERNEL -/* - * Macro to map an IP multicast address to an Ethernet multicast address. - * The high-order 25 bits of the Ethernet address are statically assigned, - * and the low-order 23 bits are taken from the low end of the IP address. - */ -#define ETHER_MAP_IP_MULTICAST(ipaddr, enaddr) \ - /* struct in_addr *ipaddr; */ \ - /* u_char enaddr[6]; */ \ -{ \ - (enaddr)[0] = 0x01; \ - (enaddr)[1] = 0x00; \ - (enaddr)[2] = 0x5e; \ - (enaddr)[3] = ((u_char *)ipaddr)[1] & 0x7f; \ - (enaddr)[4] = ((u_char *)ipaddr)[2]; \ - (enaddr)[5] = ((u_char *)ipaddr)[3]; \ -} -#endif - -/* - * Ethernet Address Resolution Protocol. - * - * See RFC 826 for protocol description. Structure below is adapted - * to resolving internet addresses. Field names used correspond to - * RFC 826. - */ -struct ether_arp { - struct arphdr ea_hdr; /* fixed-size header */ - u_char arp_sha[6]; /* sender hardware address */ - u_char arp_spa[4]; /* sender protocol address */ - u_char arp_tha[6]; /* target hardware address */ - u_char arp_tpa[4]; /* target protocol address */ -}; -#define arp_hrd ea_hdr.ar_hrd -#define arp_pro ea_hdr.ar_pro -#define arp_hln ea_hdr.ar_hln -#define arp_pln ea_hdr.ar_pln -#define arp_op ea_hdr.ar_op - - -/* - * Structure shared between the ethernet driver modules and - * the address resolution code. For example, each ec_softc or il_softc - * begins with this structure. - */ -struct arpcom { - struct ifnet ac_if; /* network-visible interface */ - u_char ac_enaddr[6]; /* ethernet hardware address */ - struct in_addr ac_ipaddr; /* copy of ip address- XXX */ - struct ether_multi *ac_multiaddrs; /* list of ether multicast addrs */ - int ac_multicnt; /* length of ac_multiaddrs list */ -}; - -struct llinfo_arp { - struct llinfo_arp *la_next; - struct llinfo_arp *la_prev; - struct rtentry *la_rt; - struct mbuf *la_hold; /* last packet until resolved/timeout */ - long la_asked; /* last time we QUERIED for this addr */ -#define la_timer la_rt->rt_rmx.rmx_expire /* deletion time in seconds */ -}; - -struct sockaddr_inarp { - u_char sin_len; - u_char sin_family; - u_short sin_port; - struct in_addr sin_addr; - struct in_addr sin_srcaddr; - u_short sin_tos; - u_short sin_other; -#define SIN_PROXY 1 -}; -/* - * IP and ethernet specific routing flags - */ -#define RTF_USETRAILERS RTF_PROTO1 /* use trailers */ -#define RTF_ANNOUNCE RTF_PROTO2 /* announce new arp entry */ - -#ifdef KERNEL -extern u_char etherbroadcastaddr[6]; -extern u_char ether_ipmulticast_min[6]; -extern u_char ether_ipmulticast_max[6]; -extern struct ifqueue arpintrq; - -struct llinfo_arp *arptnew __P((struct in_addr *)); -extern struct llinfo_arp llinfo_arp; /* head of the llinfo queue */ - -void arpwhohas __P((struct arpcom *, struct in_addr *)); -void arpintr __P((void)); -int arpresolve __P((struct arpcom *, struct rtentry *, struct mbuf *, - struct sockaddr *, u_char *, struct rtentry *)); -void arp_ifinit __P((struct arpcom *, struct ifaddr *)); - -int ether_addmulti __P((struct ifreq *, struct arpcom *)); -int ether_delmulti __P((struct ifreq *, struct arpcom *)); - -/* - * Ethernet multicast address structure. There is one of these for each - * multicast address or range of multicast addresses that we are supposed - * to listen to on a particular interface. They are kept in a linked list, - * rooted in the interface's arpcom structure. (This really has nothing to - * do with ARP, or with the Internet address family, but this appears to be - * the minimally-disrupting place to put it.) - */ -struct ether_multi { - u_char enm_addrlo[6]; /* low or only address of range */ - u_char enm_addrhi[6]; /* high or only address of range */ - struct arpcom *enm_ac; /* back pointer to arpcom */ - u_int enm_refcount; /* no. claims to this addr/range */ - struct ether_multi *enm_next; /* ptr to next ether_multi */ -}; - -/* - * Structure used by macros below to remember position when stepping through - * all of the ether_multi records. - */ -struct ether_multistep { - struct ether_multi *e_enm; -}; - -/* - * Macro for looking up the ether_multi record for a given range of Ethernet - * multicast addresses connected to a given arpcom structure. If no matching - * record is found, "enm" returns NULL. - */ -#define ETHER_LOOKUP_MULTI(addrlo, addrhi, ac, enm) \ - /* u_char addrlo[6]; */ \ - /* u_char addrhi[6]; */ \ - /* struct arpcom *ac; */ \ - /* struct ether_multi *enm; */ \ -{ \ - for ((enm) = (ac)->ac_multiaddrs; \ - (enm) != NULL && \ - (bcmp((enm)->enm_addrlo, (addrlo), 6) != 0 || \ - bcmp((enm)->enm_addrhi, (addrhi), 6) != 0); \ - (enm) = (enm)->enm_next); \ -} - -/* - * Macro to step through all of the ether_multi records, one at a time. - * The current position is remembered in "step", which the caller must - * provide. ETHER_FIRST_MULTI(), below, must be called to initialize "step" - * and get the first record. Both macros return a NULL "enm" when there - * are no remaining records. - */ -#define ETHER_NEXT_MULTI(step, enm) \ - /* struct ether_multistep step; */ \ - /* struct ether_multi *enm; */ \ -{ \ - if (((enm) = (step).e_enm) != NULL) \ - (step).e_enm = (enm)->enm_next; \ -} - -#define ETHER_FIRST_MULTI(step, ac, enm) \ - /* struct ether_multistep step; */ \ - /* struct arpcom *ac; */ \ - /* struct ether_multi *enm; */ \ -{ \ - (step).e_enm = (ac)->ac_multiaddrs; \ - ETHER_NEXT_MULTI((step), (enm)); \ -} - -#endif - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/igmp_var.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/igmp_var.h deleted file mode 100644 index fee5e431cd9..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/igmp_var.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 1988 Stephen Deering. - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Stephen Deering of Stanford University. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)igmp_var.h 8.1 (Berkeley) 7/19/93 - */ - -#ifndef _NETINET_IGMP_VAR_H_ -#define _NETINET_IGMP_VAR_H_ - -/* - * Internet Group Management Protocol (IGMP), - * implementation-specific definitions. - * - * Written by Steve Deering, Stanford, May 1988. - * - * MULTICAST Revisiob: 3.3.1.1 - */ - -struct igmpstat { - u_int igps_rcv_total; /* total IGMP messages received */ - u_int igps_rcv_tooshort; /* received with too few bytes */ - u_int igps_rcv_badsum; /* received with bad checksum */ - u_int igps_rcv_queries; /* received membership queries */ - u_int igps_rcv_badqueries; /* received invalid queries */ - u_int igps_rcv_reports; /* received membership reports */ - u_int igps_rcv_badreports; /* received invalid reports */ - u_int igps_rcv_ourreports; /* received reports for our groups */ - u_int igps_snd_reports; /* sent membership reports */ -}; - -#ifdef KERNEL -extern struct igmpstat igmpstat; - -#define IGMP_RANDOM_DELAY(X) (random() % (X) + 1) - -void igmp_init __P((void)); -void igmp_input __P((struct mbuf *, int)); -void igmp_joingroup __P((struct in_multi *)); -void igmp_leavegroup __P((struct in_multi *)); -void igmp_fasttimo __P((void)); -void igmp_slowtimo __P((void)); -int igmp_sysctl(int *, u_int, void *, size_t *, void *, size_t); -#endif - -/* - * Names for IGMP sysctl objects - */ -#define IGMPCTL_STATS 1 /* statistics (read-only) */ -#define IGMPCTL_MAXID 2 - -#define IGMPCTL_NAMES { \ - { 0, 0 }, \ - { "stats", CTLTYPE_STRUCT }, \ -} - -#endif - - diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in.h deleted file mode 100644 index 39fe9675ff8..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in.h +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)in.h 8.3 (Berkeley) 1/3/94 - */ - -#ifndef _NETINET_IN_H_ -#define _NETINET_IN_H_ - -/* - * Constants and structures defined by the internet system, - * Per RFC 790, September 1981, and numerous additions. - */ - -/* - * Protocols - */ -#define IPPROTO_IP 0 /* dummy for IP */ -#define IPPROTO_ICMP 1 /* control message protocol */ -#define IPPROTO_IGMP 2 /* group mgmt protocol */ -#define IPPROTO_GGP 3 /* gateway^2 (deprecated) */ -#define IPPROTO_IPIP 4 /* IP encapsulation in IP */ -#define IPPROTO_TCP 6 /* tcp */ -#define IPPROTO_EGP 8 /* exterior gateway protocol */ -#define IPPROTO_PUP 12 /* pup */ -#define IPPROTO_UDP 17 /* user datagram protocol */ -#define IPPROTO_IDP 22 /* xns idp */ -#define IPPROTO_TP 29 /* tp-4 w/ class negotiation */ -#define IPPROTO_RSVP 46 /* resource reservation */ -#define IPPROTO_EON 80 /* ISO cnlp */ -#define IPPROTO_ENCAP 98 /* encapsulation header */ - -#define IPPROTO_RAW 255 /* raw IP packet */ -#define IPPROTO_MAX 256 - - -/* - * Local port number conventions: - * Ports < IPPORT_RESERVED are reserved for - * privileged processes (e.g. root). - * Ports > IPPORT_USERRESERVED are reserved - * for servers, not necessarily privileged. - */ -#define IPPORT_RESERVED 1024 -#define IPPORT_USERRESERVED 5000 - -/* - * Internet address (a structure for historical reasons) - */ -struct in_addr { - u_long s_addr; -}; - -/* - * Definitions of bits in internet address integers. - * On subnets, the decomposition of addresses to host and net parts - * is done according to subnet mask, not the masks here. - */ -#define IN_CLASSA(i) (((long)(i) & 0x80000000) == 0) -#define IN_CLASSA_NET 0xff000000 -#define IN_CLASSA_NSHIFT 24 -#define IN_CLASSA_HOST 0x00ffffff -#define IN_CLASSA_MAX 128 - -#define IN_CLASSB(i) (((long)(i) & 0xc0000000) == 0x80000000) -#define IN_CLASSB_NET 0xffff0000 -#define IN_CLASSB_NSHIFT 16 -#define IN_CLASSB_HOST 0x0000ffff -#define IN_CLASSB_MAX 65536 - -#define IN_CLASSC(i) (((long)(i) & 0xe0000000) == 0xc0000000) -#define IN_CLASSC_NET 0xffffff00 -#define IN_CLASSC_NSHIFT 8 -#define IN_CLASSC_HOST 0x000000ff - -#define IN_CLASSD(i) (((long)(i) & 0xf0000000) == 0xe0000000) -#define IN_CLASSD_NET 0xf0000000 /* These ones aren't really */ -#define IN_CLASSD_NSHIFT 28 /* net and host fields, but */ -#define IN_CLASSD_HOST 0x0fffffff /* routing needn't know. */ -#define IN_MULTICAST(i) IN_CLASSD(i) - -#define IN_EXPERIMENTAL(i) (((long)(i) & 0xf0000000) == 0xf0000000) -#define IN_BADCLASS(i) (((long)(i) & 0xf0000000) == 0xf0000000) - -#define INADDR_ANY (u_long)0x00000000 -#define INADDR_BROADCAST (u_long)0xffffffff /* must be masked */ -#ifndef KERNEL -#define INADDR_NONE 0xffffffff /* -1 return */ -#endif - -#define INADDR_UNSPEC_GROUP (u_long)0xe0000000 /* 224.0.0.0 */ -#define INADDR_ALLHOSTS_GROUP (u_long)0xe0000001 /* 224.0.0.1 */ -#define INADDR_MAX_LOCAL_GROUP (u_long)0xe00000ff /* 224.0.0.255 */ - -#define IN_LOOPBACKNET 127 /* official! */ - -/* - * Socket address, internet style. - */ -struct sockaddr_in { - u_char sin_len; - u_char sin_family; - u_short sin_port; - struct in_addr sin_addr; - char sin_zero[8]; -}; - -/* - * Structure used to describe IP options. - * Used to store options internally, to pass them to a process, - * or to restore options retrieved earlier. - * The ip_dst is used for the first-hop gateway when using a source route - * (this gets put into the header proper). - */ -struct ip_opts { - struct in_addr ip_dst; /* first hop, 0 w/o src rt */ - char ip_opts[40]; /* actually variable in size */ -}; - -/* - * Options for use with [gs]etsockopt at the IP level. - * First word of comment is data type; bool is stored in int. - */ -#define IP_OPTIONS 1 /* buf/ip_opts; set/get IP options */ -#define IP_HDRINCL 2 /* int; header is included with data */ -#define IP_TOS 3 /* int; IP type of service and preced. */ -#define IP_TTL 4 /* int; IP time to live */ -#define IP_RECVOPTS 5 /* bool; receive all IP opts w/dgram */ -#define IP_RECVRETOPTS 6 /* bool; receive IP opts for response */ -#define IP_RECVDSTADDR 7 /* bool; receive IP dst addr w/dgram */ -#define IP_RETOPTS 8 /* ip_opts; set/get IP options */ -#define IP_MULTICAST_IF 9 /* u_char; set/get IP multicast i/f */ -#define IP_MULTICAST_TTL 10 /* u_char; set/get IP multicast ttl */ -#define IP_MULTICAST_LOOP 11 /* u_char; set/get IP multicast loopback */ -#define IP_ADD_MEMBERSHIP 12 /* ip_mreq; add an IP group membership */ -#define IP_DROP_MEMBERSHIP 13 /* ip_mreq; drop an IP group membership */ -#define IP_MULTICAST_VIF 14 /* set/get IP mcast virt. iface */ -#define IP_RSVP_ON 15 /* enable RSVP in kernel */ -#define IP_RSVP_OFF 16 /* disable RSVP in kernel */ -#define IP_RSVP_VIF_ON 17 /* set RSVP per-vif socket */ -#define IP_RSVP_VIF_OFF 18 /* unset RSVP per-vif socket */ - -/* - * Defaults and limits for options - */ -#define IP_DEFAULT_MULTICAST_TTL 1 /* normally limit m'casts to 1 hop */ -#define IP_DEFAULT_MULTICAST_LOOP 1 /* normally hear sends if a member */ -#define IP_MAX_MEMBERSHIPS 20 /* per socket */ - -/* - * Argument structure for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP. - */ -struct ip_mreq { - struct in_addr imr_multiaddr; /* IP multicast address of group */ - struct in_addr imr_interface; /* local IP address of interface */ -}; - -/* - * Definitions for inet sysctl operations. - * - * Third level is protocol number. - * Fourth level is desired variable within that protocol. - */ -#define IPPROTO_MAXID (IPPROTO_IDP + 1) /* don't list to IPPROTO_MAX */ - -#define CTL_IPPROTO_NAMES { \ - { "ip", CTLTYPE_NODE }, \ - { "icmp", CTLTYPE_NODE }, \ - { "igmp", CTLTYPE_NODE }, \ - { "ggp", CTLTYPE_NODE }, \ - { 0, 0 }, \ - { 0, 0 }, \ - { "tcp", CTLTYPE_NODE }, \ - { 0, 0 }, \ - { "egp", CTLTYPE_NODE }, \ - { 0, 0 }, \ - { 0, 0 }, \ - { 0, 0 }, \ - { "pup", CTLTYPE_NODE }, \ - { 0, 0 }, \ - { 0, 0 }, \ - { 0, 0 }, \ - { 0, 0 }, \ - { "udp", CTLTYPE_NODE }, \ - { 0, 0 }, \ - { 0, 0 }, \ - { 0, 0 }, \ - { 0, 0 }, \ - { "idp", CTLTYPE_NODE }, \ -} - -/* - * Names for IP sysctl objects - */ -#define IPCTL_FORWARDING 1 /* act as router */ -#define IPCTL_SENDREDIRECTS 2 /* may send redirects when forwarding */ -#define IPCTL_DEFTTL 3 /* default TTL */ -#ifdef notyet -#define IPCTL_DEFMTU 4 /* default MTU */ -#define IPCTL_RTEXPIRE 5 /* cloned route expiration time */ -#define IPCTL_RTMINEXPIRE 6 /* min value for expiration time */ -#define IPCTL_RTMAXCACHE 7 /* trigger level for dynamic expire */ -#define IPCTL_SOURCEROUTE 8 /* may perform source routes */ -#define IPCTL_MAXID 9 -#endif - -#define IPCTL_NAMES { \ - { 0, 0 }, \ - { "forwarding", CTLTYPE_INT }, \ - { "redirect", CTLTYPE_INT }, \ - { "ttl", CTLTYPE_INT }, \ - { "mtu", CTLTYPE_INT }, \ - { "rtexpire", CTLTYPE_INT }, \ - { "rtminexpire", CTLTYPE_INT }, \ - { "rtmaxcache", CTLTYPE_INT }, \ - { "sourceroute", CTLTYPE_INT }, \ -} - - -#ifdef KERNEL -struct ifnet; struct mbuf; /* forward declarations for Standard C */ - -int in_broadcast __P((struct in_addr, struct ifnet *)); -int in_canforward __P((struct in_addr)); -int in_cksum __P((struct mbuf *, int)); -int in_localaddr __P((struct in_addr)); -u_long in_netof __P((struct in_addr)); -void in_socktrim __P((struct sockaddr_in *)); -char *inet_ntoa __P((struct in_addr)); /* in libkern */ -#endif - -#endif - diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in_pcb.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in_pcb.h deleted file mode 100644 index f40058a4f20..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in_pcb.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)in_pcb.h 8.1 (Berkeley) 6/10/93 - */ - -#ifndef _NETINET_IN_PCB_H_ -#define _NETINET_IN_PCB_H_ - -/* - * Common structure pcb for internet protocol implementation. - * Here are stored pointers to local and foreign host table - * entries, local and foreign socket numbers, and pointers - * up (to a socket structure) and down (to a protocol-specific) - * control block. - */ -LIST_HEAD(inpcbhead, inpcb); - -struct inpcb { - LIST_ENTRY(inpcb) inp_list; /* list for all PCBs of this proto */ - LIST_ENTRY(inpcb) inp_hash; /* hash list */ - struct inpcbinfo *inp_pcbinfo; - struct in_addr inp_faddr; /* foreign host table entry */ - u_short inp_fport; /* foreign port */ - struct in_addr inp_laddr; /* local host table entry */ - u_short inp_lport; /* local port */ - struct socket *inp_socket; /* back pointer to socket */ - caddr_t inp_ppcb; /* pointer to per-protocol pcb */ - struct route inp_route; /* placeholder for routing entry */ - int inp_flags; /* generic IP/datagram flags */ - struct ip inp_ip; /* header prototype; should have more */ - struct mbuf *inp_options; /* IP options */ - struct ip_moptions *inp_moptions; /* IP multicast options */ -}; - -struct inpcbinfo { - struct inpcbhead *listhead; - struct inpcbhead *hashbase; - unsigned long hashsize; - unsigned short lastport; -}; - -/* flags in inp_flags: */ -#define INP_RECVOPTS 0x01 /* receive incoming IP options */ -#define INP_RECVRETOPTS 0x02 /* receive IP options for reply */ -#define INP_RECVDSTADDR 0x04 /* receive IP dst address */ -#define INP_CONTROLOPTS (INP_RECVOPTS|INP_RECVRETOPTS|INP_RECVDSTADDR) -#define INP_HDRINCL 0x08 /* user supplies entire IP header */ - -#define INPLOOKUP_WILDCARD 1 - -#define sotoinpcb(so) ((struct inpcb *)(so)->so_pcb) - -#ifdef KERNEL -void in_losing __P((struct inpcb *)); -int in_pcballoc __P((struct socket *, struct inpcbinfo *)); -int in_pcbbind __P((struct inpcb *, struct mbuf *)); -int in_pcbconnect __P((struct inpcb *, struct mbuf *)); -void in_pcbdetach __P((struct inpcb *)); -void in_pcbdisconnect __P((struct inpcb *)); -void in_pcbinshash __P((struct inpcb *)); -int in_pcbladdr __P((struct inpcb *, struct mbuf *, - struct sockaddr_in *)); /* XXX Reactos * <- ** */ -struct inpcb * - in_pcblookup __P((struct inpcbhead *, - struct in_addr, u_int, struct in_addr, u_int, int)); -struct inpcb * - in_pcblookuphash __P((struct inpcbinfo *, - struct in_addr, u_int, struct in_addr, u_int)); -void in_pcbnotify __P((struct inpcbhead *, struct sockaddr *, - u_int, struct in_addr, u_int, int, void (*)(struct inpcb *, int))); -void in_pcbrehash __P((struct inpcb *)); -void in_rtchange __P((struct inpcb *, int)); -void in_setpeeraddr __P((struct inpcb *, struct mbuf *)); -void in_setsockaddr __P((struct inpcb *, struct mbuf *)); -#endif - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in_systm.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in_systm.h deleted file mode 100644 index 6c75203f60c..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in_systm.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)in_systm.h 8.1 (Berkeley) 6/10/93 - */ - -#ifndef _NETINET_IN_SYSTM_H_ -#define _NETINET_IN_SYSTM_H_ - -/* - * Miscellaneous internetwork - * definitions for kernel. - */ - -/* - * Network types. - * - * Internally the system keeps counters in the headers with the bytes - * swapped so that VAX instructions will work on them. It reverses - * the bytes before transmission at each protocol level. The n_ types - * represent the types with the bytes in ``high-ender'' order. - */ -typedef u_short n_short; /* short as received from the net */ -typedef u_long n_long; /* long as received from the net */ - -typedef u_long n_time; /* ms since 00:00 GMT, byte rev */ - -#ifdef KERNEL -n_time iptime __P((void)); -#endif - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in_var.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in_var.h deleted file mode 100644 index bb6c9cc5375..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/in_var.h +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Copyright (c) 1985, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)in_var.h 8.1 (Berkeley) 6/10/93 - */ - -#ifndef _NETINET_IN_VAR_H_ -#define _NETINET_IN_VAR_H_ - -#include <sys/queue.h> -/* - * Interface address, Internet version. One of these structures - * is allocated for each interface with an Internet address. - * The ifaddr structure contains the protocol-independent part - * of the structure and is assumed to be first. - */ -struct in_ifaddr { - struct ifaddr ia_ifa; /* protocol-independent info */ -#define ia_ifp ia_ifa.ifa_ifp -#define ia_flags ia_ifa.ifa_flags - /* ia_{,sub}net{,mask} in host order */ - u_long ia_net; /* network number of interface */ - u_long ia_netmask; /* mask of net part */ - u_long ia_subnet; /* subnet number, including net */ - u_long ia_subnetmask; /* mask of subnet part */ - struct in_addr ia_netbroadcast; /* to recognize net broadcasts */ - struct in_ifaddr *ia_next; /* next in list of internet addresses */ - struct sockaddr_in ia_addr; /* reserve space for interface name */ - struct sockaddr_in ia_dstaddr; /* reserve space for broadcast addr */ -#define ia_broadaddr ia_dstaddr - struct sockaddr_in ia_sockmask; /* reserve space for general netmask */ - LIST_HEAD(in_multihead, in_multi) ia_multiaddrs; - /* list of multicast addresses */ -}; - -struct in_aliasreq { - char ifra_name[IFNAMSIZ]; /* if name, e.g. "en0" */ - struct sockaddr_in ifra_addr; - struct sockaddr_in ifra_broadaddr; -#define ifra_dstaddr ifra_broadaddr - struct sockaddr_in ifra_mask; -}; -/* - * Given a pointer to an in_ifaddr (ifaddr), - * return a pointer to the addr as a sockaddr_in. - */ -#define IA_SIN(ia) (&(((struct in_ifaddr *)(ia))->ia_addr)) -#define IA_DSTSIN(ia) (&(((struct in_ifaddr *)(ia))->ia_dstaddr)) - -#define IN_LNAOF(in, ifa) \ - ((ntohl((in).s_addr) & ~((struct in_ifaddr *)(ifa)->ia_subnetmask)) - - -#ifdef KERNEL -extern struct in_ifaddr *in_ifaddr; -extern struct ifqueue ipintrq; /* ip packet input queue */ -extern struct in_addr zeroin_addr; -extern u_char inetctlerrmap[]; -extern int rtq_reallyold; /* XXX */ -extern int rtq_minreallyold; /* XXX */ -extern int rtq_toomany; /* XXX */ - -/* - * Macro for finding the interface (ifnet structure) corresponding to one - * of our IP addresses. - */ -#define INADDR_TO_IFP(addr, ifp) \ - /* struct in_addr addr; */ \ - /* struct ifnet *ifp; */ \ -{ \ - register struct in_ifaddr *ia; \ -\ - for (ia = in_ifaddr; \ - ia != NULL && ((ia->ia_ifp->if_flags & IFF_POINTOPOINT)? \ - IA_DSTSIN(ia):IA_SIN(ia))->sin_addr.s_addr != (addr).s_addr; \ - ia = ia->ia_next) \ - continue; \ - if (ia == NULL) \ - for (ia = in_ifaddr; \ - ia != NULL; \ - ia = ia->ia_next) \ - if (ia->ia_ifp->if_flags & IFF_POINTOPOINT && \ - IA_SIN(ia)->sin_addr.s_addr == (addr).s_addr) \ - break; \ - (ifp) = (ia == NULL) ? NULL : ia->ia_ifp; \ -} - -/* - * Macro for finding the internet address structure (in_ifaddr) corresponding - * to a given interface (ifnet structure). - */ -#define IFP_TO_IA(ifp, ia) \ - /* struct ifnet *ifp; */ \ - /* struct in_ifaddr *ia; */ \ -{ \ - for ((ia) = in_ifaddr; \ - (ia) != NULL && (ia)->ia_ifp != (ifp); \ - (ia) = (ia)->ia_next) \ - continue; \ -} -#endif - -/* - * This information should be part of the ifnet structure but we don't wish - * to change that - as it might break a number of things - */ - -struct router_info { - struct ifnet *ifp; - int type; /* type of router which is querier on this interface */ - int time; /* # of slow timeouts since last old query */ - struct router_info *next; -}; - -/* - * Internet multicast address structure. There is one of these for each IP - * multicast group to which this host belongs on a given network interface. - * They are kept in a linked list, rooted in the interface's in_ifaddr - * structure. - */ -struct in_multi { - LIST_ENTRY(in_multi) inm_entry; /* list glue */ - struct in_addr inm_addr; /* IP multicast address */ - struct ifnet *inm_ifp; /* back pointer to ifnet */ - struct in_ifaddr *inm_ia; /* back pointer to in_ifaddr */ - u_int inm_refcount; /* no. membership claims by sockets */ - u_int inm_timer; /* IGMP membership report timer */ - u_int inm_state; /* state of the membership */ - struct router_info *inm_rti; /* router info*/ -}; - -#ifdef KERNEL -/* - * Structure used by macros below to remember position when stepping through - * all of the in_multi records. - */ -struct in_multistep { - struct in_ifaddr *i_ia; - struct in_multi *i_inm; -}; - -/* - * Macro for looking up the in_multi record for a given IP multicast address - * on a given interface. If no matching record is found, "inm" returns NULL. - */ -#define IN_LOOKUP_MULTI(addr, ifp, inm) \ - /* struct in_addr addr; */ \ - /* struct ifnet *ifp; */ \ - /* struct in_multi *inm; */ \ -{ \ - register struct in_ifaddr *ia; \ -\ - IFP_TO_IA((ifp), ia); \ - if (ia == NULL) \ - (inm) = NULL; \ - else \ - for ((inm) = ia->ia_multiaddrs.lh_first; \ - (inm) != NULL && (inm)->inm_addr.s_addr != (addr).s_addr; \ - (inm) = inm->inm_entry.le_next) \ - continue; \ -} - -/* - * Macro to step through all of the in_multi records, one at a time. - * The current position is remembered in "step", which the caller must - * provide. IN_FIRST_MULTI(), below, must be called to initialize "step" - * and get the first record. Both macros return a NULL "inm" when there - * are no remaining records. - */ -#define IN_NEXT_MULTI(step, inm) \ - /* struct in_multistep step; */ \ - /* struct in_multi *inm; */ \ -{ \ - if (((inm) = (step).i_inm) != NULL) \ - (step).i_inm = (inm)->inm_entry.le_next; \ - else \ - while ((step).i_ia != NULL) { \ - (inm) = (step).i_ia->ia_multiaddrs.lh_first; \ - (step).i_ia = (step).i_ia->ia_next; \ - if ((inm) != NULL) { \ - (step).i_inm = (inm)->inm_entry.le_next; \ - break; \ - } \ - } \ -} - -#define IN_FIRST_MULTI(step, inm) \ - /* struct in_multistep step; */ \ - /* struct in_multi *inm; */ \ -{ \ - (step).i_ia = in_ifaddr; \ - (step).i_inm = NULL; \ - IN_NEXT_MULTI((step), (inm)); \ -} - -int in_ifinit __P((struct ifnet *, - struct in_ifaddr *, struct sockaddr_in *, int)); -struct in_multi *in_addmulti __P((struct in_addr *, struct ifnet *)); -void in_delmulti __P((struct in_multi *)); -void in_ifscrub __P((struct ifnet *, struct in_ifaddr *)); -int in_control __P((struct socket *, int, caddr_t, struct ifnet *)); - -#endif -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip.h deleted file mode 100644 index 6b216deceff..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip.h +++ /dev/null @@ -1,174 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)ip.h 8.1 (Berkeley) 6/10/93 - */ - -#ifndef _NETINET_IP_H_ -#define _NETINET_IP_H_ - -/* - * Definitions for internet protocol version 4. - * Per RFC 791, September 1981. - */ -#define IPVERSION 4 - -/* - * Structure of an internet header, naked of options. - * - * We declare ip_len and ip_off to be short, rather than u_short - * pragmatically since otherwise unsigned comparisons can result - * against negative integers quite easily, and fail in subtle ways. - */ -struct ip { -#if BYTE_ORDER == LITTLE_ENDIAN - u_char ip_hl:4, /* header length */ - ip_v:4; /* version */ -#endif -#if BYTE_ORDER == BIG_ENDIAN - u_char ip_v:4, /* version */ - ip_hl:4; /* header length */ -#endif - u_char ip_tos; /* type of service */ - short ip_len; /* total length */ - u_short ip_id; /* identification */ - short ip_off; /* fragment offset field */ -#define IP_DF 0x4000 /* dont fragment flag */ -#define IP_MF 0x2000 /* more fragments flag */ -#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ - u_char ip_ttl; /* time to live */ - u_char ip_p; /* protocol */ - u_short ip_sum; /* checksum */ - struct in_addr ip_src,ip_dst; /* source and dest address */ -}; - -#define IP_MAXPACKET 65535 /* maximum packet size */ - -/* - * Definitions for IP type of service (ip_tos) - */ -#define IPTOS_LOWDELAY 0x10 -#define IPTOS_THROUGHPUT 0x08 -#define IPTOS_RELIABILITY 0x04 -#define IPTOS_MINCOST 0x02 - -/* - * Definitions for IP precedence (also in ip_tos) (hopefully unused) - */ -#define IPTOS_PREC_NETCONTROL 0xe0 -#define IPTOS_PREC_INTERNETCONTROL 0xc0 -#define IPTOS_PREC_CRITIC_ECP 0xa0 -#define IPTOS_PREC_FLASHOVERRIDE 0x80 -#define IPTOS_PREC_FLASH 0x60 -#define IPTOS_PREC_IMMEDIATE 0x40 -#define IPTOS_PREC_PRIORITY 0x20 -#define IPTOS_PREC_ROUTINE 0x00 - -/* - * Definitions for options. - */ -#define IPOPT_COPIED(o) ((o)&0x80) -#define IPOPT_CLASS(o) ((o)&0x60) -#define IPOPT_NUMBER(o) ((o)&0x1f) - -#define IPOPT_CONTROL 0x00 -#define IPOPT_RESERVED1 0x20 -#define IPOPT_DEBMEAS 0x40 -#define IPOPT_RESERVED2 0x60 - -#define IPOPT_EOL 0 /* end of option list */ -#define IPOPT_NOP 1 /* no operation */ - -#define IPOPT_RR 7 /* record packet route */ -#define IPOPT_TS 68 /* timestamp */ -#define IPOPT_SECURITY 130 /* provide s,c,h,tcc */ -#define IPOPT_LSRR 131 /* loose source route */ -#define IPOPT_SATID 136 /* satnet id */ -#define IPOPT_SSRR 137 /* strict source route */ - -/* - * Offsets to fields in options other than EOL and NOP. - */ -#define IPOPT_OPTVAL 0 /* option ID */ -#define IPOPT_OLEN 1 /* option length */ -#define IPOPT_OFFSET 2 /* offset within option */ -#define IPOPT_MINOFF 4 /* min value of above */ - -/* - * Time stamp option structure. - */ -struct ip_timestamp { - u_char ipt_code; /* IPOPT_TS */ - u_char ipt_len; /* size of structure (variable) */ - u_char ipt_ptr; /* index of current entry */ -#if BYTE_ORDER == LITTLE_ENDIAN - u_char ipt_flg:4, /* flags, see below */ - ipt_oflw:4; /* overflow counter */ -#endif -#if BYTE_ORDER == BIG_ENDIAN - u_char ipt_oflw:4, /* overflow counter */ - ipt_flg:4; /* flags, see below */ -#endif - union ipt_timestamp { - n_long ipt_time[1]; - struct ipt_ta { - struct in_addr ipt_addr; - n_long ipt_time; - } ipt_ta[1]; - } ipt_timestamp; -}; - -/* flag bits for ipt_flg */ -#define IPOPT_TS_TSONLY 0 /* timestamps only */ -#define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */ -#define IPOPT_TS_PRESPEC 3 /* specified modules only */ - -/* bits for security (not byte swapped) */ -#define IPOPT_SECUR_UNCLASS 0x0000 -#define IPOPT_SECUR_CONFID 0xf135 -#define IPOPT_SECUR_EFTO 0x789a -#define IPOPT_SECUR_MMMM 0xbc4d -#define IPOPT_SECUR_RESTR 0xaf13 -#define IPOPT_SECUR_SECRET 0xd788 -#define IPOPT_SECUR_TOPSECRET 0x6bc5 - -/* - * Internet implementation parameters. - */ -#define MAXTTL 255 /* maximum time to live (seconds) */ -#define IPDEFTTL 64 /* default ttl, from RFC 1340 */ -#define IPFRAGTTL 60 /* time to live for frags, slowhz */ -#define IPTTLDEC 1 /* subtracted when forwarding */ - -#define IP_MSS 576 /* default maximum segment size */ - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip_fw.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip_fw.h deleted file mode 100644 index e102a864225..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip_fw.h +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright (c) 1993 Daniel Boulet - * Copyright (c) 1994 Ugen J.S.Antsilevich - * - * Redistribution and use in source forms, with and without modification, - * are permitted provided that this entire comment appears intact. - * - * Redistribution in binary form may occur without any restrictions. - * Obviously, it would be nice if you gave credit where credit is due - * but requiring it would be too onerous. - * - * This software is provided ``AS IS'' without any warranties of any kind. - * - */ - -/* - * Format of an IP firewall descriptor - * - * fw_src, fw_dst, fw_smsk, fw_dmsk are always stored in network byte order. - * fw_flg and fw_n*p are stored in host byte order (of course). - * Port numbers are stored in HOST byte order. - */ -#ifndef _IP_FW_H -#define _IP_FW_H - -struct ip_fw { - u_long fw_pcnt,fw_bcnt; /* Packet and byte counters */ - struct in_addr fw_src, fw_dst; /* Source and destination IP addr */ - struct in_addr fw_smsk, fw_dmsk; /* Mask for src and dest IP addr */ - union { - struct in_addr fu_via_ip; - struct { -#define FW_IFNLEN 6 /* To keep structure on 2^x boundary */ - char fu_via_name[FW_IFNLEN]; - short fu_via_unit; - } fu_via_if; - } fu_via_un; -#define fw_via_ip fu_via_un.fu_via_ip -#define fw_via_name fu_via_un.fu_via_if.fu_via_name -#define fw_via_unit fu_via_un.fu_via_if.fu_via_unit - u_short fw_number; - u_short fw_flg; /* Flags word */ - u_short fw_nsp, fw_ndp; /* N'of src ports and # of dst ports */ - /* in ports array (dst ports follow */ - /* src ports; max of 10 ports in all; */ - /* count of 0 means match all ports) */ -#define IP_FW_MAX_PORTS 10 /* A reasonable maximum */ - u_short fw_pts[IP_FW_MAX_PORTS]; /* Array of port numbers to match */ - u_char fw_ipopt,fw_ipnopt; /* IP options set/unset */ - u_char fw_tcpf,fw_tcpnf; /* TCP flags set/unset */ -#define IP_FW_ICMPTYPES_DIM (256 / (sizeof(unsigned) * 8)) - unsigned fw_icmptypes[IP_FW_ICMPTYPES_DIM]; /* ICMP types bitmap */ - long timestamp; /* timestamp (tv_sec) of last match */ -}; - -struct ip_fw_chain { - LIST_ENTRY(ip_fw_chain) chain; - struct ip_fw *rule; -}; - -/* - * Values for "flags" field . - */ - -#define IP_FW_F_ALL 0x0000 /* This is a universal packet rule */ -#define IP_FW_F_TCP 0x0001 /* This is a TCP packet rule */ -#define IP_FW_F_UDP 0x0002 /* This is a UDP packet rule */ -#define IP_FW_F_ICMP 0x0003 /* This is a ICMP packet rule */ -#define IP_FW_F_KIND 0x0003 /* Mask to isolate rule kind */ - -#define IP_FW_F_IN 0x0004 /* Inbound */ -#define IP_FW_F_OUT 0x0008 /* Outbound */ - -#define IP_FW_F_ACCEPT 0x0010 /* This is an accept rule */ -#define IP_FW_F_COUNT 0x0020 /* This is an accept rule */ -#define IP_FW_F_PRN 0x0040 /* Print if this rule matches */ -#define IP_FW_F_ICMPRPL 0x0080 /* Send back icmp unreachable packet */ - -#define IP_FW_F_SRNG 0x0100 /* The first two src ports are a min * - * and max range (stored in host byte * - * order). */ - -#define IP_FW_F_DRNG 0x0200 /* The first two dst ports are a min * - * and max range (stored in host byte * - * order). */ - -#define IP_FW_F_IFNAME 0x0400 /* Use interface name/unit (not IP) */ - -#define IP_FW_F_FRAG 0x0800 /* Fragment */ - -#define IP_FW_F_ICMPBIT 0x1000 /* ICMP type bitmap is valid */ - -#define IP_FW_F_IFUWILD 0x2000 /* Match all interface units */ - -#define IP_FW_F_MASK 0x3FFF /* All possible flag bits mask */ - -/* - * Definitions for IP option names. - */ -#define IP_FW_IPOPT_LSRR 0x01 -#define IP_FW_IPOPT_SSRR 0x02 -#define IP_FW_IPOPT_RR 0x04 -#define IP_FW_IPOPT_TS 0x08 - -/* - * Definitions for TCP flags. - */ -#define IP_FW_TCPF_FIN TH_FIN -#define IP_FW_TCPF_SYN TH_SYN -#define IP_FW_TCPF_RST TH_RST -#define IP_FW_TCPF_PSH TH_PUSH -#define IP_FW_TCPF_ACK TH_ACK -#define IP_FW_TCPF_URG TH_URG -#define IP_FW_TCPF_ESTAB 0x40 - -/* - * New IP firewall options for [gs]etsockopt at the RAW IP level. - */ -#define IP_FW_BASE_CTL 50 - -#define IP_FW_ADD (IP_FW_BASE_CTL+0) -#define IP_FW_DEL (IP_FW_BASE_CTL+1) -#define IP_FW_FLUSH (IP_FW_BASE_CTL+2) -#define IP_FW_ZERO (IP_FW_BASE_CTL+3) -#define IP_FW_GET (IP_FW_BASE_CTL+4) - -/* - * Main firewall chains definitions and global var's definitions. - */ -#ifdef KERNEL - -/* - * Function pointers. - */ -extern int (*ip_fw_chk_ptr)(struct mbuf *, struct ip *,struct ifnet *, int dir); -extern int (*ip_fw_ctl_ptr)(int,struct mbuf **); - -/* - * Function definitions. - */ -void ip_fw_init(void); - -#endif /* KERNEL */ - -#endif /* _IP_FW_H */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip_icmp.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip_icmp.h deleted file mode 100644 index a4b49c36706..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip_icmp.h +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)ip_icmp.h 8.1 (Berkeley) 6/10/93 - */ - -#ifndef _NETINET_IP_ICMP_H_ -#define _NETINET_IP_ICMP_H_ - -/* - * Interface Control Message Protocol Definitions. - * Per RFC 792, September 1981. - */ - -/* - * Internal of an ICMP Router Advertisement - */ -struct icmp_ra_addr { - u_int32_t ira_addr; - u_int32_t ira_preference; -}; - -/* - * Structure of an icmp header. - */ -struct icmp { - u_char icmp_type; /* type of message, see below */ - u_char icmp_code; /* type sub code */ - u_short icmp_cksum; /* ones complement cksum of struct */ - union { - u_char ih_pptr; /* ICMP_PARAMPROB */ - struct in_addr ih_gwaddr; /* ICMP_REDIRECT */ - struct ih_idseq { - n_short icd_id; - n_short icd_seq; - } ih_idseq; - int ih_void; - - /* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */ - struct ih_pmtu { - n_short ipm_void; - n_short ipm_nextmtu; - } ih_pmtu; - - struct ih_rtradv { - u_char irt_num_addrs; - u_char irt_wpa; - u_int16_t irt_lifetime; - } ih_rtradv; - } icmp_hun; -#define icmp_pptr icmp_hun.ih_pptr -#define icmp_gwaddr icmp_hun.ih_gwaddr -#define icmp_id icmp_hun.ih_idseq.icd_id -#define icmp_seq icmp_hun.ih_idseq.icd_seq -#define icmp_void icmp_hun.ih_void -#define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void -#define icmp_nextmtu icmp_hun.ih_pmtu.ipm_nextmtu -#define icmp_num_addrs icmp_hun.ih_rtradv.irt_num_addrs -#define icmp_wpa icmp_hun.ih_rtradv.irt_wpa -#define icmp_lifetime icmp_hun.ih_rtradv.irt_lifetime - union { - struct id_ts { - n_time its_otime; - n_time its_rtime; - n_time its_ttime; - } id_ts; - struct id_ip { - struct ip idi_ip; - /* options and then 64 bits of data */ - } id_ip; - struct icmp_ra_addr id_radv; - u_long id_mask; - char id_data[1]; - } icmp_dun; -#define icmp_otime icmp_dun.id_ts.its_otime -#define icmp_rtime icmp_dun.id_ts.its_rtime -#define icmp_ttime icmp_dun.id_ts.its_ttime -#define icmp_ip icmp_dun.id_ip.idi_ip -#define icmp_radv icmp_dun.id_radv -#define icmp_mask icmp_dun.id_mask -#define icmp_data icmp_dun.id_data -}; - -/* - * Lower bounds on packet lengths for various types. - * For the error advice packets must first insure that the - * packet is large enough to contain the returned ip header. - * Only then can we do the check to see if 64 bits of packet - * data have been returned, since we need to check the returned - * ip header length. - */ -#define ICMP_MINLEN 8 /* abs minimum */ -#define ICMP_TSLEN (8 + 3 * sizeof (n_time)) /* timestamp */ -#define ICMP_MASKLEN 12 /* address mask */ -#define ICMP_ADVLENMIN (8 + sizeof (struct ip) + 8) /* min */ -#define ICMP_ADVLEN(p) (8 + ((p)->icmp_ip.ip_hl << 2) + 8) - /* N.B.: must separately check that ip_hl >= 5 */ - -/* - * Definition of type and code field values. - */ -#define ICMP_ECHOREPLY 0 /* echo reply */ -#define ICMP_UNREACH 3 /* dest unreachable, codes: */ -#define ICMP_UNREACH_NET 0 /* bad net */ -#define ICMP_UNREACH_HOST 1 /* bad host */ -#define ICMP_UNREACH_PROTOCOL 2 /* bad protocol */ -#define ICMP_UNREACH_PORT 3 /* bad port */ -#define ICMP_UNREACH_NEEDFRAG 4 /* IP_DF caused drop */ -#define ICMP_UNREACH_SRCFAIL 5 /* src route failed */ -#define ICMP_UNREACH_NET_UNKNOWN 6 /* unknown net */ -#define ICMP_UNREACH_HOST_UNKNOWN 7 /* unknown host */ -#define ICMP_UNREACH_ISOLATED 8 /* src host isolated */ -#define ICMP_UNREACH_NET_PROHIB 9 /* prohibited access */ -#define ICMP_UNREACH_HOST_PROHIB 10 /* ditto */ -#define ICMP_UNREACH_TOSNET 11 /* bad tos for net */ -#define ICMP_UNREACH_TOSHOST 12 /* bad tos for host */ -#define ICMP_SOURCEQUENCH 4 /* packet lost, slow down */ -#define ICMP_REDIRECT 5 /* shorter route, codes: */ -#define ICMP_REDIRECT_NET 0 /* for network */ -#define ICMP_REDIRECT_HOST 1 /* for host */ -#define ICMP_REDIRECT_TOSNET 2 /* for tos and net */ -#define ICMP_REDIRECT_TOSHOST 3 /* for tos and host */ -#define ICMP_ECHO 8 /* echo service */ -#define ICMP_ROUTERADVERT 9 /* router advertisement */ -#define ICMP_ROUTERSOLICIT 10 /* router solicitation */ -#define ICMP_TIMXCEED 11 /* time exceeded, code: */ -#define ICMP_TIMXCEED_INTRANS 0 /* ttl==0 in transit */ -#define ICMP_TIMXCEED_REASS 1 /* ttl==0 in reass */ -#define ICMP_PARAMPROB 12 /* ip header bad */ -#define ICMP_PARAMPROB_OPTABSENT 1 /* req. opt. absent */ -#define ICMP_TSTAMP 13 /* timestamp request */ -#define ICMP_TSTAMPREPLY 14 /* timestamp reply */ -#define ICMP_IREQ 15 /* information request */ -#define ICMP_IREQREPLY 16 /* information reply */ -#define ICMP_MASKREQ 17 /* address mask request */ -#define ICMP_MASKREPLY 18 /* address mask reply */ - -#define ICMP_MAXTYPE 18 - -#define ICMP_INFOTYPE(type) \ - ((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || \ - (type) == ICMP_ROUTERADVERT || (type) == ICMP_ROUTERSOLICIT || \ - (type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \ - (type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || \ - (type) == ICMP_MASKREQ || (type) == ICMP_MASKREPLY) - -#ifdef KERNEL -void icmp_error __P((struct mbuf *, int, int, n_long, struct ifnet *)); -void icmp_input __P((struct mbuf *, int)); -void icmp_reflect __P((struct mbuf *)); -void icmp_send __P((struct mbuf *, struct mbuf *)); -int icmp_sysctl __P((int *, u_int, void *, size_t *, void *, size_t)); -#endif - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip_var.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip_var.h deleted file mode 100644 index 351ebf146e9..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/ip_var.h +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)ip_var.h 8.1 (Berkeley) 6/10/93 - */ - -#ifndef _NETINET_IP_VAR_H_ -#define _NETINET_IP_VAR_H_ - -/* - * Overlay for ip header used by other protocols (tcp, udp). - */ -struct ipovly { - caddr_t ih_next, ih_prev; /* for protocol sequence q's */ - u_char ih_x1; /* (unused) */ - u_char ih_pr; /* protocol */ - short ih_len; /* protocol length */ - struct in_addr ih_src; /* source internet address */ - struct in_addr ih_dst; /* destination internet address */ -}; - -/* - * Ip reassembly queue structure. Each fragment - * being reassembled is attached to one of these structures. - * They are timed out after ipq_ttl drops to 0, and may also - * be reclaimed if memory becomes tight. - */ -struct ipq { - struct ipq *next,*prev; /* to other reass headers */ - u_char ipq_ttl; /* time for reass q to live */ - u_char ipq_p; /* protocol of this fragment */ - u_short ipq_id; /* sequence id for reassembly */ - struct ipasfrag *ipq_next,*ipq_prev; - /* to ip headers of fragments */ - struct in_addr ipq_src,ipq_dst; -}; - -/* - * Ip header, when holding a fragment. - * - * Note: ipf_next must be at same offset as ipq_next above - */ -struct ipasfrag { -#if BYTE_ORDER == LITTLE_ENDIAN - u_char ip_hl:4, - ip_v:4; -#endif -#if BYTE_ORDER == BIG_ENDIAN - u_char ip_v:4, - ip_hl:4; -#endif - u_char ipf_mff; /* XXX overlays ip_tos: use low bit - * to avoid destroying tos; - * copied from (ip_off&IP_MF) */ - short ip_len; - u_short ip_id; - short ip_off; - u_char ip_ttl; - u_char ip_p; - u_short ip_sum; - struct ipasfrag *ipf_next; /* next fragment */ - struct ipasfrag *ipf_prev; /* previous fragment */ -}; - -/* - * Structure stored in mbuf in inpcb.ip_options - * and passed to ip_output when ip options are in use. - * The actual length of the options (including ipopt_dst) - * is in m_len. - */ -#define MAX_IPOPTLEN 40 - -struct ipoption { - struct in_addr ipopt_dst; /* first-hop dst if source routed */ - char ipopt_list[MAX_IPOPTLEN]; /* options proper */ -}; - -/* - * Structure attached to inpcb.ip_moptions and - * passed to ip_output when IP multicast options are in use. - */ -struct ip_moptions { - struct ifnet *imo_multicast_ifp; /* ifp for outgoing multicasts */ - u_char imo_multicast_ttl; /* TTL for outgoing multicasts */ - u_char imo_multicast_loop; /* 1 => hear sends if a member */ - u_short imo_num_memberships; /* no. memberships this socket */ - struct in_multi *imo_membership[IP_MAX_MEMBERSHIPS]; - u_long imo_multicast_vif; /* vif num outgoing multicasts */ -}; - -struct ipstat { - u_long ips_total; /* total packets received */ - u_long ips_badsum; /* checksum bad */ - u_long ips_tooshort; /* packet too short */ - u_long ips_toosmall; /* not enough data */ - u_long ips_badhlen; /* ip header length < data size */ - u_long ips_badlen; /* ip length < ip header length */ - u_long ips_fragments; /* fragments received */ - u_long ips_fragdropped; /* frags dropped (dups, out of space) */ - u_long ips_fragtimeout; /* fragments timed out */ - u_long ips_forward; /* packets forwarded */ - u_long ips_cantforward; /* packets rcvd for unreachable dest */ - u_long ips_redirectsent; /* packets forwarded on same net */ - u_long ips_noproto; /* unknown or unsupported protocol */ - u_long ips_delivered; /* datagrams delivered to upper level*/ - u_long ips_localout; /* total ip packets generated here */ - u_long ips_odropped; /* lost packets due to nobufs, etc. */ - u_long ips_reassembled; /* total packets reassembled ok */ - u_long ips_fragmented; /* datagrams sucessfully fragmented */ - u_long ips_ofragments; /* output fragments created */ - u_long ips_cantfrag; /* don't fragment flag was set, etc. */ - u_long ips_badoptions; /* error in option processing */ - u_long ips_noroute; /* packets discarded due to no route */ - u_long ips_badvers; /* ip version != 4 */ - u_long ips_rawout; /* total raw ip packets generated */ -}; - -#ifdef KERNEL -/* flags passed to ip_output as last parameter */ -#define IP_FORWARDING 0x1 /* most of ip header exists */ -#define IP_RAWOUTPUT 0x2 /* raw ip header exists */ -#define IP_ROUTETOIF SO_DONTROUTE /* bypass routing tables */ -#define IP_ALLOWBROADCAST SO_BROADCAST /* can send broadcast packets */ - -extern struct ipstat ipstat; -extern struct ipq ipq; /* ip reass. queue */ -extern u_short ip_id; /* ip packet ctr, for ids */ -extern int ip_defttl; /* default IP ttl */ -extern u_char ip_protox[]; -extern struct socket *ip_rsvpd; /* reservation protocol daemon */ -extern struct socket *ip_mrouter; /* multicast routing daemon */ -extern int (*legal_vif_num) __P((int)); -extern u_long (*ip_mcast_src) __P((int)); -extern int rsvp_on; - -int ip_ctloutput __P((int, struct socket *, int, int, struct mbuf **)); -void ip_deq __P((struct ipasfrag *)); -int ip_dooptions __P((struct mbuf *)); -void ip_drain __P((void)); -void ip_enq __P((struct ipasfrag *, struct ipasfrag *)); -void ip_forward __P((struct mbuf *, int)); -void ip_freef __P((struct ipq *)); -void ip_freemoptions __P((struct ip_moptions *)); -int ip_getmoptions __P((int, struct ip_moptions *, struct mbuf **)); -void ip_init __P((void)); -extern int (*ip_mforward) __P((struct ip *, struct ifnet *, struct mbuf *, - struct ip_moptions *)); -int ip_next_mtu __P((int, int)); -int ip_optcopy __P((struct ip *, struct ip *)); -int ip_output __P((struct socket *so, struct mbuf *, - struct mbuf *, struct route *, int, struct ip_moptions *)); -int ip_pcbopts __P((struct mbuf **, struct mbuf *)); -struct ip * - ip_reass __P((struct ipasfrag *, struct ipq *)); -struct in_ifaddr * - ip_rtaddr __P((struct in_addr)); -int ip_setmoptions __P((int, struct ip_moptions **, struct mbuf *)); -void ip_slowtimo __P((void)); -struct mbuf * - ip_srcroute __P((void)); -void ip_stripoptions __P((struct mbuf *, struct mbuf *)); -int ip_sysctl __P((int *, u_int, void *, size_t *, void *, size_t)); -void ipintr __P((void)); -int rip_ctloutput __P((int, struct socket *, int, int, struct mbuf **)); -void rip_init __P((void)); -void rip_input __P((struct mbuf *)); -int rip_output __P((struct mbuf *, struct socket *, u_long)); -int rip_usrreq __P((struct socket *, - int, struct mbuf *, struct mbuf *, struct mbuf *)); -int ip_rsvp_init __P((struct socket *)); -int ip_rsvp_done __P((void)); -int ip_rsvp_vif_init __P((struct socket *, struct mbuf *)); -int ip_rsvp_vif_done __P((struct socket *, struct mbuf *)); -void ip_rsvp_force_done __P((struct socket *)); - -void rip_ip_input __P((struct mbuf *mm, - register struct socket *ip_mrouter, struct sockaddr *src)); - -#endif - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp.h deleted file mode 100644 index d8af2c684da..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp.h +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)tcp.h 8.1 (Berkeley) 6/10/93 - */ - -#ifndef _NETINET_TCP_H_ -#define _NETINET_TCP_H_ - -typedef u_long tcp_seq; -typedef u_long tcp_cc; /* connection count per rfc1644 */ - -/* - * TCP header. - * Per RFC 793, September, 1981. - */ -struct tcphdr { - u_short th_sport; /* source port */ - u_short th_dport; /* destination port */ - tcp_seq th_seq; /* sequence number */ - tcp_seq th_ack; /* acknowledgement number */ -#if BYTE_ORDER == LITTLE_ENDIAN - u_char th_x2:4, /* (unused) */ - th_off:4; /* data offset */ -#endif -#if BYTE_ORDER == BIG_ENDIAN - u_char th_off:4, /* data offset */ - th_x2:4; /* (unused) */ -#endif - u_char th_flags; -#define TH_FIN 0x01 -#define TH_SYN 0x02 -#define TH_RST 0x04 -#define TH_PUSH 0x08 -#define TH_ACK 0x10 -#define TH_URG 0x20 -#define TH_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG) - - u_short th_win; /* window */ - u_short th_sum; /* checksum */ - u_short th_urp; /* urgent pointer */ -}; - -#define TCPOPT_EOL 0 -#define TCPOPT_NOP 1 -#define TCPOPT_MAXSEG 2 -#define TCPOLEN_MAXSEG 4 -#define TCPOPT_WINDOW 3 -#define TCPOLEN_WINDOW 3 -#define TCPOPT_SACK_PERMITTED 4 /* Experimental */ -#define TCPOLEN_SACK_PERMITTED 2 -#define TCPOPT_SACK 5 /* Experimental */ -#define TCPOPT_TIMESTAMP 8 -#define TCPOLEN_TIMESTAMP 10 -#define TCPOLEN_TSTAMP_APPA (TCPOLEN_TIMESTAMP+2) /* appendix A */ -#define TCPOPT_TSTAMP_HDR \ - (TCPOPT_NOP<<24|TCPOPT_NOP<<16|TCPOPT_TIMESTAMP<<8|TCPOLEN_TIMESTAMP) - -#define TCPOPT_CC 11 /* CC options: RFC-1644 */ -#define TCPOPT_CCNEW 12 -#define TCPOPT_CCECHO 13 -#define TCPOLEN_CC 6 -#define TCPOLEN_CC_APPA (TCPOLEN_CC+2) -#define TCPOPT_CC_HDR(ccopt) \ - (TCPOPT_NOP<<24|TCPOPT_NOP<<16|(ccopt)<<8|TCPOLEN_CC) - -/* - * Default maximum segment size for TCP. - * With an IP MSS of 576, this is 536, - * but 512 is probably more convenient. - * This should be defined as MIN(512, IP_MSS - sizeof (struct tcpiphdr)). - */ -#define TCP_MSS 512 - -#define TCP_MAXWIN 65535 /* largest value for (unscaled) window */ -#define TTCP_CLIENT_SND_WND 4096 /* dflt send window for T/TCP client */ - -#define TCP_MAX_WINSHIFT 14 /* maximum window shift */ - -#define TCP_MAXHLEN (0xf<<2) /* max length of header in bytes */ -#define TCP_MAXOLEN (TCP_MAXHLEN - sizeof(struct tcphdr)) - /* max space left for options */ - -/* - * User-settable options (used with setsockopt). - */ -#define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */ -#define TCP_MAXSEG 0x02 /* set maximum segment size */ -#define TCP_NOPUSH 0x04 /* don't push last block of write */ -#define TCP_NOOPT 0x08 /* don't use TCP options */ - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_debug.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_debug.h deleted file mode 100644 index 5266eeb64f1..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_debug.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)tcp_debug.h 8.1 (Berkeley) 6/10/93 - */ - -#ifndef _NETINET_TCP_DEBUG_H_ -#define _NETINET_TCP_DEBUG_H_ - -struct tcp_debug { - n_time td_time; - short td_act; - short td_ostate; - caddr_t td_tcb; - struct tcpiphdr td_ti; - short td_req; - struct tcpcb td_cb; -}; - -#define TA_INPUT 0 -#define TA_OUTPUT 1 -#define TA_USER 2 -#define TA_RESPOND 3 -#define TA_DROP 4 - -#ifdef TANAMES -char *tanames[] = - { "input", "output", "user", "respond", "drop" }; -#endif - -#define TCP_NDEBUG 100 -struct tcp_debug tcp_debug[TCP_NDEBUG]; -int tcp_debx; - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_fsm.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_fsm.h deleted file mode 100644 index 5cbb3ec697b..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_fsm.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)tcp_fsm.h 8.1 (Berkeley) 6/10/93 - */ - -#ifndef _NETINET_TCP_FSM_H_ -#define _NETINET_TCP_FSM_H_ - -/* - * TCP FSM state definitions. - * Per RFC793, September, 1981. - */ - -#define TCP_NSTATES 11 - -#define TCPS_CLOSED 0 /* closed */ -#define TCPS_LISTEN 1 /* listening for connection */ -#define TCPS_SYN_SENT 2 /* active, have sent syn */ -#define TCPS_SYN_RECEIVED 3 /* have send and received syn */ -/* states < TCPS_ESTABLISHED are those where connections not established */ -#define TCPS_ESTABLISHED 4 /* established */ -#define TCPS_CLOSE_WAIT 5 /* rcvd fin, waiting for close */ -/* states > TCPS_CLOSE_WAIT are those where user has closed */ -#define TCPS_FIN_WAIT_1 6 /* have closed, sent fin */ -#define TCPS_CLOSING 7 /* closed xchd FIN; await FIN ACK */ -#define TCPS_LAST_ACK 8 /* had fin and close; await FIN ACK */ -/* states > TCPS_CLOSE_WAIT && < TCPS_FIN_WAIT_2 await ACK of FIN */ -#define TCPS_FIN_WAIT_2 9 /* have closed, fin is acked */ -#define TCPS_TIME_WAIT 10 /* in 2*msl quiet wait after close */ - -#define TCPS_HAVERCVDSYN(s) ((s) >= TCPS_SYN_RECEIVED) -#define TCPS_HAVEESTABLISHED(s) ((s) >= TCPS_ESTABLISHED) -#define TCPS_HAVERCVDFIN(s) ((s) >= TCPS_TIME_WAIT) - -#ifdef TCPOUTFLAGS -/* - * Flags used when sending segments in tcp_output. - * Basic flags (TH_RST,TH_ACK,TH_SYN,TH_FIN) are totally - * determined by state, with the proviso that TH_FIN is sent only - * if all data queued for output is included in the segment. - */ -u_char tcp_outflags[TCP_NSTATES] = { - TH_RST|TH_ACK, 0, TH_SYN, TH_SYN|TH_ACK, - TH_ACK, TH_ACK, - TH_FIN|TH_ACK, TH_FIN|TH_ACK, TH_FIN|TH_ACK, TH_ACK, TH_ACK, -}; -#endif - -#ifdef KPROF -int tcp_acounts[TCP_NSTATES][PRU_NREQ]; -#endif - -#ifdef TCPSTATES -char *tcpstates[] = { - "CLOSED", "LISTEN", "SYN_SENT", "SYN_RCVD", - "ESTABLISHED", "CLOSE_WAIT", "FIN_WAIT_1", "CLOSING", - "LAST_ACK", "FIN_WAIT_2", "TIME_WAIT", -}; -#endif - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_seq.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_seq.h deleted file mode 100644 index 9baf72e5e2f..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_seq.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)tcp_seq.h 8.1 (Berkeley) 6/10/93 - */ - -#ifndef _NETINET_TCP_SEQ_H_ -#define _NETINET_TCP_SEQ_H_ -/* - * TCP sequence numbers are 32 bit integers operated - * on with modular arithmetic. These macros can be - * used to compare such integers. - */ -#define SEQ_LT(a,b) ((int)((a)-(b)) < 0) -#define SEQ_LEQ(a,b) ((int)((a)-(b)) <= 0) -#define SEQ_GT(a,b) ((int)((a)-(b)) > 0) -#define SEQ_GEQ(a,b) ((int)((a)-(b)) >= 0) - -/* for modulo comparisons of timestamps */ -#define TSTMP_LT(a,b) ((int)((a)-(b)) < 0) -#define TSTMP_GEQ(a,b) ((int)((a)-(b)) >= 0) - -/* - * TCP connection counts are 32 bit integers operated - * on with modular arithmetic. These macros can be - * used to compare such integers. - */ -#define CC_LT(a,b) ((int)((a)-(b)) < 0) -#define CC_LEQ(a,b) ((int)((a)-(b)) <= 0) -#define CC_GT(a,b) ((int)((a)-(b)) > 0) -#define CC_GEQ(a,b) ((int)((a)-(b)) >= 0) - -/* Macro to increment a CC: skip 0 which has a special meaning */ -#define CC_INC(c) (++(c) == 0 ? ++(c) : (c)) - -/* - * Macros to initialize tcp sequence numbers for - * send and receive from initial send and receive - * sequence numbers. - */ -#define tcp_rcvseqinit(tp) \ - (tp)->rcv_adv = (tp)->rcv_nxt = (tp)->irs + 1 - -#define tcp_sendseqinit(tp) \ - (tp)->snd_una = (tp)->snd_nxt = (tp)->snd_max = (tp)->snd_up = \ - (tp)->iss - -#define TCP_ISSINCR (125*1024) /* increment for tcp_iss each second */ - -#define TCP_PAWS_IDLE (24 * 24 * 60 * 60 * PR_SLOWHZ) - /* timestamp wrap-around time */ - -#ifdef KERNEL -extern tcp_seq tcp_iss; /* tcp initial send seq # */ -extern tcp_cc tcp_ccgen; /* global connection count */ -#endif -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_timer.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_timer.h deleted file mode 100644 index dd96dc9bf14..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_timer.h +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)tcp_timer.h 8.1 (Berkeley) 6/10/93 - */ - -#ifndef _NETINET_TCP_TIMER_H_ -#define _NETINET_TCP_TIMER_H_ - -/* - * Definitions of the TCP timers. These timers are counted - * down PR_SLOWHZ times a second. - */ -#define TCPT_NTIMERS 4 - -#define TCPT_REXMT 0 /* retransmit */ -#define TCPT_PERSIST 1 /* retransmit persistance */ -#define TCPT_KEEP 2 /* keep alive */ -#define TCPT_2MSL 3 /* 2*msl quiet time timer */ - -/* - * The TCPT_REXMT timer is used to force retransmissions. - * The TCP has the TCPT_REXMT timer set whenever segments - * have been sent for which ACKs are expected but not yet - * received. If an ACK is received which advances tp->snd_una, - * then the retransmit timer is cleared (if there are no more - * outstanding segments) or reset to the base value (if there - * are more ACKs expected). Whenever the retransmit timer goes off, - * we retransmit one unacknowledged segment, and do a backoff - * on the retransmit timer. - * - * The TCPT_PERSIST timer is used to keep window size information - * flowing even if the window goes shut. If all previous transmissions - * have been acknowledged (so that there are no retransmissions in progress), - * and the window is too small to bother sending anything, then we start - * the TCPT_PERSIST timer. When it expires, if the window is nonzero, - * we go to transmit state. Otherwise, at intervals send a single byte - * into the peer's window to force him to update our window information. - * We do this at most as often as TCPT_PERSMIN time intervals, - * but no more frequently than the current estimate of round-trip - * packet time. The TCPT_PERSIST timer is cleared whenever we receive - * a window update from the peer. - * - * The TCPT_KEEP timer is used to keep connections alive. If an - * connection is idle (no segments received) for TCPTV_KEEP_INIT amount of time, - * but not yet established, then we drop the connection. Once the connection - * is established, if the connection is idle for TCPTV_KEEP_IDLE time - * (and keepalives have been enabled on the socket), we begin to probe - * the connection. We force the peer to send us a segment by sending: - * <SEQ=SND.UNA-1><ACK=RCV.NXT><CTL=ACK> - * This segment is (deliberately) outside the window, and should elicit - * an ack segment in response from the peer. If, despite the TCPT_KEEP - * initiated segments we cannot elicit a response from a peer in TCPT_MAXIDLE - * amount of time probing, then we drop the connection. - */ - -/* - * Time constants. - */ -#define TCPTV_MSL ( 30*PR_SLOWHZ) /* max seg lifetime (hah!) */ -#define TCPTV_SRTTBASE 0 /* base roundtrip time; - if 0, no idea yet */ -#define TCPTV_SRTTDFLT ( 3*PR_SLOWHZ) /* assumed RTT if no info */ - -#define TCPTV_PERSMIN ( 5*PR_SLOWHZ) /* retransmit persistance */ -#define TCPTV_PERSMAX ( 60*PR_SLOWHZ) /* maximum persist interval */ - -#define TCPTV_KEEP_INIT ( 75*PR_SLOWHZ) /* initial connect keep alive */ -#define TCPTV_KEEP_IDLE (120*60*PR_SLOWHZ) /* dflt time before probing */ -#define TCPTV_KEEPINTVL ( 75*PR_SLOWHZ) /* default probe interval */ -#define TCPTV_KEEPCNT 8 /* max probes before drop */ - -#define TCPTV_MIN ( 1*PR_SLOWHZ) /* minimum allowable value */ -#define TCPTV_REXMTMAX ( 64*PR_SLOWHZ) /* max allowable REXMT value */ - -#define TCPTV_TWTRUNC 8 /* RTO factor to truncate TW */ - -#define TCP_LINGERTIME 120 /* linger at most 2 minutes */ - -#define TCP_MAXRXTSHIFT 12 /* maximum retransmits */ - -#ifdef TCPTIMERS -char *tcptimers[] = - { "REXMT", "PERSIST", "KEEP", "2MSL" }; -#endif - -/* - * Force a time value to be in a certain range. - */ -#define TCPT_RANGESET(tv, value, tvmin, tvmax) { \ - (tv) = (value); \ - if ((u_long)(tv) < (u_long)(tvmin)) \ - (tv) = (tvmin); \ - else if ((u_long)(tv) > (u_long)(tvmax)) \ - (tv) = (tvmax); \ -} - -#ifdef KERNEL -extern int tcp_keepinit; /* time to establish connection */ -extern int tcp_keepidle; /* time before keepalive probes begin */ -extern int tcp_keepintvl; /* time between keepalive probes */ -extern int tcp_maxidle; /* time to drop after starting probes */ -extern int tcp_ttl; /* time to live for TCP segs */ -extern int tcp_backoff[]; -#endif - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_var.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_var.h deleted file mode 100644 index a7eb3e2ac42..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcp_var.h +++ /dev/null @@ -1,387 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)tcp_var.h 8.3 (Berkeley) 4/10/94 - */ - -#ifndef _NETINET_TCP_VAR_H_ -#define _NETINET_TCP_VAR_H_ -/* - * Kernel variables for tcp. - */ - -/* - * Tcp control block, one per tcp; fields: - */ -struct tcpcb { - struct tcpiphdr *seg_next; /* sequencing queue */ - struct tcpiphdr *seg_prev; - int t_state; /* state of this connection */ - int t_timer[TCPT_NTIMERS]; /* tcp timers */ - int t_rxtshift; /* log(2) of rexmt exp. backoff */ - int t_rxtcur; /* current retransmit value */ - int t_dupacks; /* consecutive dup acks recd */ - u_int t_maxseg; /* maximum segment size */ - u_int t_maxopd; /* mss plus options */ - int t_force; /* 1 if forcing out a byte */ - u_int t_flags; -#define TF_ACKNOW 0x0001 /* ack peer immediately */ -#define TF_DELACK 0x0002 /* ack, but try to delay it */ -#define TF_NODELAY 0x0004 /* don't delay packets to coalesce */ -#define TF_NOOPT 0x0008 /* don't use tcp options */ -#define TF_SENTFIN 0x0010 /* have sent FIN */ -#define TF_REQ_SCALE 0x0020 /* have/will request window scaling */ -#define TF_RCVD_SCALE 0x0040 /* other side has requested scaling */ -#define TF_REQ_TSTMP 0x0080 /* have/will request timestamps */ -#define TF_RCVD_TSTMP 0x0100 /* a timestamp was received in SYN */ -#define TF_SACK_PERMIT 0x0200 /* other side said I could SACK */ -#define TF_NEEDSYN 0x0400 /* send SYN (implicit state) */ -#define TF_NEEDFIN 0x0800 /* send FIN (implicit state) */ -#define TF_NOPUSH 0x1000 /* don't push */ -#define TF_REQ_CC 0x2000 /* have/will request CC */ -#define TF_RCVD_CC 0x4000 /* a CC was received in SYN */ -#define TF_SENDCCNEW 0x8000 /* send CCnew instead of CC in SYN */ - - struct tcpiphdr *t_template; /* skeletal packet for transmit */ - struct inpcb *t_inpcb; /* back pointer to internet pcb */ -/* - * The following fields are used as in the protocol specification. - * See RFC783, Dec. 1981, page 21. - */ -/* send sequence variables */ - tcp_seq snd_una; /* send unacknowledged */ - tcp_seq snd_nxt; /* send next */ - tcp_seq snd_up; /* send urgent pointer */ - tcp_seq snd_wl1; /* window update seg seq number */ - tcp_seq snd_wl2; /* window update seg ack number */ - tcp_seq iss; /* initial send sequence number */ - u_long snd_wnd; /* send window */ -/* receive sequence variables */ - u_long rcv_wnd; /* receive window */ - tcp_seq rcv_nxt; /* receive next */ - tcp_seq rcv_up; /* receive urgent pointer */ - tcp_seq irs; /* initial receive sequence number */ -/* - * Additional variables for this implementation. - */ -/* receive variables */ - tcp_seq rcv_adv; /* advertised window */ -/* retransmit variables */ - tcp_seq snd_max; /* highest sequence number sent; - * used to recognize retransmits - */ -/* congestion control (for slow start, source quench, retransmit after loss) */ - u_long snd_cwnd; /* congestion-controlled window */ - u_long snd_ssthresh; /* snd_cwnd size threshhold for - * for slow start exponential to - * linear switch - */ -/* - * transmit timing stuff. See below for scale of srtt and rttvar. - * "Variance" is actually smoothed difference. - */ - u_int t_idle; /* inactivity time */ - int t_rtt; /* round trip time */ - tcp_seq t_rtseq; /* sequence number being timed */ - int t_srtt; /* smoothed round-trip time */ - int t_rttvar; /* variance in round-trip time */ - u_int t_rttmin; /* minimum rtt allowed */ - u_long max_sndwnd; /* largest window peer has offered */ - -/* out-of-band data */ - char t_oobflags; /* have some */ - char t_iobc; /* input character */ -#define TCPOOB_HAVEDATA 0x01 -#define TCPOOB_HADDATA 0x02 - int t_softerror; /* possible error not yet reported */ - -/* RFC 1323 variables */ - u_char snd_scale; /* window scaling for send window */ - u_char rcv_scale; /* window scaling for recv window */ - u_char request_r_scale; /* pending window scaling */ - u_char requested_s_scale; - u_long ts_recent; /* timestamp echo data */ - u_long ts_recent_age; /* when last updated */ - tcp_seq last_ack_sent; -/* RFC 1644 variables */ - tcp_cc cc_send; /* send connection count */ - tcp_cc cc_recv; /* receive connection count */ - u_long t_duration; /* connection duration */ - -/* TUBA stuff */ - caddr_t t_tuba_pcb; /* next level down pcb for TCP over z */ -/* More RTT stuff */ - u_long t_rttupdated; /* number of times rtt sampled */ -}; - -/* - * Structure to hold TCP options that are only used during segment - * processing (in tcp_input), but not held in the tcpcb. - * It's basically used to reduce the number of parameters - * to tcp_dooptions. - */ -struct tcpopt { - u_long to_flag; /* which options are present */ -#define TOF_TS 0x0001 /* timestamp */ -#define TOF_CC 0x0002 /* CC and CCnew are exclusive */ -#define TOF_CCNEW 0x0004 -#define TOF_CCECHO 0x0008 - u_long to_tsval; - u_long to_tsecr; - tcp_cc to_cc; /* holds CC or CCnew */ - tcp_cc to_ccecho; -}; - -/* - * The TAO cache entry which is stored in the protocol family specific - * portion of the route metrics. - */ -struct rmxp_tao { - tcp_cc tao_cc; /* latest CC in valid SYN */ - tcp_cc tao_ccsent; /* latest CC sent to peer */ - u_short tao_mssopt; /* peer's cached MSS */ -#ifdef notyet - u_short tao_flags; /* cache status flags */ -#define TAOF_DONT 0x0001 /* peer doesn't understand rfc1644 */ -#define TAOF_OK 0x0002 /* peer does understand rfc1644 */ -#define TAOF_UNDEF 0 /* we don't know yet */ -#endif /* notyet */ -}; -#define rmx_taop(r) ((struct rmxp_tao *)(r).rmx_filler) - -#define intotcpcb(ip) ((struct tcpcb *)(ip)->inp_ppcb) -#define sototcpcb(so) (intotcpcb(sotoinpcb(so))) - -/* - * The smoothed round-trip time and estimated variance - * are stored as fixed point numbers scaled by the values below. - * For convenience, these scales are also used in smoothing the average - * (smoothed = (1/scale)sample + ((scale-1)/scale)smoothed). - * With these scales, srtt has 3 bits to the right of the binary point, - * and thus an "ALPHA" of 0.875. rttvar has 2 bits to the right of the - * binary point, and is smoothed with an ALPHA of 0.75. - */ -#define TCP_RTT_SCALE 8 /* multiplier for srtt; 3 bits frac. */ -#define TCP_RTT_SHIFT 3 /* shift for srtt; 3 bits frac. */ -#define TCP_RTTVAR_SCALE 4 /* multiplier for rttvar; 2 bits */ -#define TCP_RTTVAR_SHIFT 2 /* shift for rttvar; 2 bits */ - -/* - * The initial retransmission should happen at rtt + 4 * rttvar. - * Because of the way we do the smoothing, srtt and rttvar - * will each average +1/2 tick of bias. When we compute - * the retransmit timer, we want 1/2 tick of rounding and - * 1 extra tick because of +-1/2 tick uncertainty in the - * firing of the timer. The bias will give us exactly the - * 1.5 tick we need. But, because the bias is - * statistical, we have to test that we don't drop below - * the minimum feasible timer (which is 2 ticks). - * This macro assumes that the value of TCP_RTTVAR_SCALE - * is the same as the multiplier for rttvar. - */ -#define TCP_REXMTVAL(tp) \ - (((tp)->t_srtt >> TCP_RTT_SHIFT) + (tp)->t_rttvar) - -/* XXX - * We want to avoid doing m_pullup on incoming packets but that - * means avoiding dtom on the tcp reassembly code. That in turn means - * keeping an mbuf pointer in the reassembly queue (since we might - * have a cluster). As a quick hack, the source & destination - * port numbers (which are no longer needed once we've located the - * tcpcb) are overlayed with an mbuf pointer. - */ -#define REASS_MBUF(ti) (*(struct mbuf **)&((ti)->ti_t)) - -/* - * TCP statistics. - * Many of these should be kept per connection, - * but that's inconvenient at the moment. - */ -struct tcpstat { - u_long tcps_connattempt; /* connections initiated */ - u_long tcps_accepts; /* connections accepted */ - u_long tcps_connects; /* connections established */ - u_long tcps_drops; /* connections dropped */ - u_long tcps_conndrops; /* embryonic connections dropped */ - u_long tcps_closed; /* conn. closed (includes drops) */ - u_long tcps_segstimed; /* segs where we tried to get rtt */ - u_long tcps_rttupdated; /* times we succeeded */ - u_long tcps_delack; /* delayed acks sent */ - u_long tcps_timeoutdrop; /* conn. dropped in rxmt timeout */ - u_long tcps_rexmttimeo; /* retransmit timeouts */ - u_long tcps_persisttimeo; /* persist timeouts */ - u_long tcps_keeptimeo; /* keepalive timeouts */ - u_long tcps_keepprobe; /* keepalive probes sent */ - u_long tcps_keepdrops; /* connections dropped in keepalive */ - - u_long tcps_sndtotal; /* total packets sent */ - u_long tcps_sndpack; /* data packets sent */ - u_long tcps_sndbyte; /* data bytes sent */ - u_long tcps_sndrexmitpack; /* data packets retransmitted */ - u_long tcps_sndrexmitbyte; /* data bytes retransmitted */ - u_long tcps_sndacks; /* ack-only packets sent */ - u_long tcps_sndprobe; /* window probes sent */ - u_long tcps_sndurg; /* packets sent with URG only */ - u_long tcps_sndwinup; /* window update-only packets sent */ - u_long tcps_sndctrl; /* control (SYN|FIN|RST) packets sent */ - - u_long tcps_rcvtotal; /* total packets received */ - u_long tcps_rcvpack; /* packets received in sequence */ - u_long tcps_rcvbyte; /* bytes received in sequence */ - u_long tcps_rcvbadsum; /* packets received with ccksum errs */ - u_long tcps_rcvbadoff; /* packets received with bad offset */ - u_long tcps_rcvshort; /* packets received too short */ - u_long tcps_rcvduppack; /* duplicate-only packets received */ - u_long tcps_rcvdupbyte; /* duplicate-only bytes received */ - u_long tcps_rcvpartduppack; /* packets with some duplicate data */ - u_long tcps_rcvpartdupbyte; /* dup. bytes in part-dup. packets */ - u_long tcps_rcvoopack; /* out-of-order packets received */ - u_long tcps_rcvoobyte; /* out-of-order bytes received */ - u_long tcps_rcvpackafterwin; /* packets with data after window */ - u_long tcps_rcvbyteafterwin; /* bytes rcvd after window */ - u_long tcps_rcvafterclose; /* packets rcvd after "close" */ - u_long tcps_rcvwinprobe; /* rcvd window probe packets */ - u_long tcps_rcvdupack; /* rcvd duplicate acks */ - u_long tcps_rcvacktoomuch; /* rcvd acks for unsent data */ - u_long tcps_rcvackpack; /* rcvd ack packets */ - u_long tcps_rcvackbyte; /* bytes acked by rcvd acks */ - u_long tcps_rcvwinupd; /* rcvd window update packets */ - u_long tcps_pawsdrop; /* segments dropped due to PAWS */ - u_long tcps_predack; /* times hdr predict ok for acks */ - u_long tcps_preddat; /* times hdr predict ok for data pkts */ - u_long tcps_pcbcachemiss; - u_long tcps_cachedrtt; /* times cached RTT in route updated */ - u_long tcps_cachedrttvar; /* times cached rttvar updated */ - u_long tcps_cachedssthresh; /* times cached ssthresh updated */ - u_long tcps_usedrtt; /* times RTT initialized from route */ - u_long tcps_usedrttvar; /* times RTTVAR initialized from rt */ - u_long tcps_usedssthresh; /* times ssthresh initialized from rt*/ - u_long tcps_persistdrop; /* timeout in persist state */ - u_long tcps_badsyn; /* bogus SYN, e.g. premature ACK */ - u_long tcps_mturesent; /* resends due to MTU discovery */ - u_long tcps_listendrop; /* listen queue overflows */ -}; - -/* - * Names for TCP sysctl objects - */ -#define TCPCTL_DO_RFC1323 1 /* use RFC-1323 extensions */ -#define TCPCTL_DO_RFC1644 2 /* use RFC-1644 extensions */ -#define TCPCTL_MSSDFLT 3 /* MSS default */ -#define TCPCTL_STATS 4 /* statistics (read-only) */ -#define TCPCTL_RTTDFLT 5 /* default RTT estimate */ -#define TCPCTL_KEEPIDLE 6 /* keepalive idle timer */ -#define TCPCTL_KEEPINTVL 7 /* interval to send keepalives */ -#define TCPCTL_SENDSPACE 8 /* send buffer space */ -#define TCPCTL_RECVSPACE 9 /* receive buffer space */ -#define TCPCTL_KEEPINIT 10 /* interval to wait for established */ -#define TCPCTL_MAXID 11 - -#define TCPCTL_NAMES { \ - { 0, 0 }, \ - { "rfc1323", CTLTYPE_INT }, \ - { "rfc1644", CTLTYPE_INT }, \ - { "mssdflt", CTLTYPE_INT }, \ - { "stats", CTLTYPE_STRUCT }, \ - { "rttdflt", CTLTYPE_INT }, \ - { "keepidle", CTLTYPE_INT }, \ - { "keepintvl", CTLTYPE_INT }, \ - { "sendspace", CTLTYPE_INT }, \ - { "recvspace", CTLTYPE_INT }, \ - { "keepinit", CTLTYPE_INT }, \ -} - -#ifdef KERNEL -extern struct inpcbhead tcb; /* head of queue of active tcpcb's */ -extern struct inpcbinfo tcbinfo; -extern struct tcpstat tcpstat; /* tcp statistics */ -extern int tcp_do_rfc1323; /* XXX */ -extern int tcp_do_rfc1644; /* XXX */ -extern int tcp_mssdflt; /* XXX */ -extern u_long tcp_now; /* for RFC 1323 timestamps */ -extern int tcp_rttdflt; /* XXX */ -extern u_short tcp_lastport; /* last assigned port */ - -int tcp_attach __P((struct socket *)); -void tcp_canceltimers __P((struct tcpcb *)); -struct tcpcb * - tcp_close __P((struct tcpcb *)); -int tcp_connect __P((struct tcpcb *, struct mbuf *)); -void tcp_ctlinput __P((int, struct sockaddr *, struct ip *)); -int tcp_ctloutput __P((int, struct socket *, int, int, struct mbuf **)); -struct tcpcb * - tcp_disconnect __P((struct tcpcb *)); -struct tcpcb * - tcp_drop __P((struct tcpcb *, int)); -void tcp_dooptions __P((struct tcpcb *, - u_char *, int, struct tcpiphdr *, struct tcpopt *)); -void tcp_drain __P((void)); -void tcp_fasttimo __P((void)); -struct rmxp_tao * - tcp_gettaocache __P((struct inpcb *)); -void tcp_init __P((void)); -void tcp_input __P((struct mbuf *, int)); -void tcp_mss __P((struct tcpcb *, int)); -int tcp_mssopt __P((struct tcpcb *)); -void tcp_mtudisc __P((struct inpcb *, int)); -struct tcpcb * - tcp_newtcpcb __P((struct inpcb *)); -void tcp_notify __P((struct inpcb *, int)); -int tcp_output __P((struct tcpcb *)); -void tcp_pulloutofband __P((struct socket *, - struct tcpiphdr *, struct mbuf *)); -void tcp_quench __P((struct inpcb *, int)); -int tcp_reass __P((struct tcpcb *, struct tcpiphdr *, struct mbuf *)); -void tcp_respond __P((struct tcpcb *, - struct tcpiphdr *, struct mbuf *, u_long, u_long, int)); -struct rtentry * - tcp_rtlookup __P((struct inpcb *)); -void tcp_setpersist __P((struct tcpcb *)); -void tcp_slowtimo __P((void)); -int tcp_sysctl __P((int *, u_int, void *, size_t *, void *, size_t)); -struct tcpiphdr * - tcp_template __P((struct tcpcb *)); -struct tcpcb * - tcp_timers __P((struct tcpcb *, int)); -void tcp_trace __P((int, int, struct tcpcb *, struct tcpiphdr *, int)); -struct tcpcb * - tcp_usrclosed __P((struct tcpcb *)); -int tcp_usrreq __P((struct socket *, - int, struct mbuf *, struct mbuf *, struct mbuf *)); -void tcp_xmit_timer __P((struct tcpcb *, int)); - -extern u_long tcp_sendspace; -extern u_long tcp_recvspace; - -#endif /* KERNEL */ - -#endif /* _NETINET_TCP_VAR_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcpip.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcpip.h deleted file mode 100644 index 45c115cf708..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/tcpip.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)tcpip.h 8.1 (Berkeley) 6/10/93 - */ - -#ifndef _NETINET_TCPIP_H_ -#define _NETINET_TCPIP_H_ - -/* - * Tcp+ip header, after ip options removed. - */ -struct tcpiphdr { - struct ipovly ti_i; /* overlaid ip structure */ - struct tcphdr ti_t; /* tcp header */ -}; -#ifdef notyet -/* - * Tcp+ip header, after ip options removed but including TCP options. - */ -struct full_tcpiphdr { - struct ipovly ti_i; /* overlaid ip structure */ - struct tcphdr ti_t; /* tcp header */ - char ti_o[TCP_MAXOLEN]; /* space for tcp options */ -}; -#endif /* notyet */ -#define ti_next ti_i.ih_next -#define ti_prev ti_i.ih_prev -#define ti_x1 ti_i.ih_x1 -#define ti_pr ti_i.ih_pr -#define ti_len ti_i.ih_len -#define ti_src ti_i.ih_src -#define ti_dst ti_i.ih_dst -#define ti_sport ti_t.th_sport -#define ti_dport ti_t.th_dport -#define ti_seq ti_t.th_seq -#define ti_ack ti_t.th_ack -#define ti_x2 ti_t.th_x2 -#define ti_off ti_t.th_off -#define ti_flags ti_t.th_flags -#define ti_win ti_t.th_win -#define ti_sum ti_t.th_sum -#define ti_urp ti_t.th_urp - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/udp.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/udp.h deleted file mode 100644 index b05e19b401d..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/udp.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)udp.h 8.1 (Berkeley) 6/10/93 - */ - -#ifndef _NETINET_UDP_H_ -#define _NETINET_UDP_H_ - -/* - * Udp protocol header. - * Per RFC 768, September, 1981. - */ -struct udphdr { - u_short uh_sport; /* source port */ - u_short uh_dport; /* destination port */ - short uh_ulen; /* udp length */ - u_short uh_sum; /* udp checksum */ -}; - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/udp_var.h b/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/udp_var.h deleted file mode 100644 index fc808e51047..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/netinet/udp_var.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)udp_var.h 8.1 (Berkeley) 6/10/93 - */ - -#ifndef _NETINET_UDP_VAR_H_ -#define _NETINET_UDP_VAR_H_ - -/* - * UDP kernel structures and variables. - */ -struct udpiphdr { - struct ipovly ui_i; /* overlaid ip structure */ - struct udphdr ui_u; /* udp header */ -}; -#define ui_next ui_i.ih_next -#define ui_prev ui_i.ih_prev -#define ui_x1 ui_i.ih_x1 -#define ui_pr ui_i.ih_pr -#define ui_len ui_i.ih_len -#define ui_src ui_i.ih_src -#define ui_dst ui_i.ih_dst -#define ui_sport ui_u.uh_sport -#define ui_dport ui_u.uh_dport -#define ui_ulen ui_u.uh_ulen -#define ui_sum ui_u.uh_sum - -struct udpstat { - /* input statistics: */ - u_long udps_ipackets; /* total input packets */ - u_long udps_hdrops; /* packet shorter than header */ - u_long udps_badsum; /* checksum error */ - u_long udps_badlen; /* data length larger than packet */ - u_long udps_noport; /* no socket on port */ - u_long udps_noportbcast; /* of above, arrived as broadcast */ - u_long udps_fullsock; /* not delivered, input socket full */ - u_long udpps_pcbcachemiss; /* input packets missing pcb cache */ - u_long udpps_pcbhashmiss; /* input packets not for hashed pcb */ - /* output statistics: */ - u_long udps_opackets; /* total output packets */ -}; - -/* - * Names for UDP sysctl objects - */ -#define UDPCTL_CHECKSUM 1 /* checksum UDP packets */ -#define UDPCTL_STATS 2 /* statistics (read-only) */ -#define UDPCTL_MAXDGRAM 3 /* max datagram size */ -#define UDPCTL_RECVSPACE 4 /* default receive buffer space */ -#define UDPCTL_MAXID 5 - -#define UDPCTL_NAMES { \ - { 0, 0 }, \ - { "checksum", CTLTYPE_INT }, \ - { "stats", CTLTYPE_STRUCT }, \ - { "maxdgram", CTLTYPE_INT }, \ - { "recvspace", CTLTYPE_INT }, \ -} - -#ifdef KERNEL -extern struct inpcbhead udb; -extern struct inpcbinfo udbinfo; -extern struct udpstat udpstat; - -void udp_ctlinput __P((int, struct sockaddr *, struct ip *)); -void udp_init __P((void)); -void udp_input __P((struct mbuf *, int)); -int udp_output __P((struct inpcb *, - struct mbuf *, struct mbuf *, struct mbuf *)); -int udp_sysctl __P((int *, u_int, void *, size_t *, void *, size_t)); -int udp_usrreq __P((struct socket *, - int, struct mbuf *, struct mbuf *, struct mbuf *)); -#endif - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/buf.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/buf.h deleted file mode 100644 index 3523331430d..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/buf.h +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1989, 1993 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)buf.h 8.7 (Berkeley) 1/21/94 - */ - -#ifndef _SYS_BUF_H_ -#define _SYS_BUF_H_ -#include <sys/queue.h> - -#define NOLIST ((struct buf *)0x87654321) - -struct buf; - -struct iodone_chain { - long ic_prev_flags; - void (*ic_prev_iodone) __P((struct buf *)); - void *ic_prev_iodone_chain; - struct { - long ia_long; - void *ia_ptr; - } ic_args[5]; -}; - -/* - * The buffer header describes an I/O operation in the kernel. - */ -struct buf { - LIST_ENTRY(buf) b_hash; /* Hash chain. */ - LIST_ENTRY(buf) b_vnbufs; /* Buffer's associated vnode. */ - TAILQ_ENTRY(buf) b_freelist; /* Free list position if not active. */ - struct buf *b_actf, **b_actb; /* Device driver queue when active. */ - struct proc *b_proc; /* Associated proc; NULL if kernel. */ - volatile long b_flags; /* B_* flags. */ - int b_qindex; /* buffer queue index */ - int b_error; /* Errno value. */ - long b_bufsize; /* Allocated buffer size. */ - long b_bcount; /* Valid bytes in buffer. */ - long b_resid; /* Remaining I/O. */ - dev_t b_dev; /* Device associated with buffer. */ - struct { - caddr_t b_addr; /* Memory, superblocks, indirect etc. */ - } b_un; - void *b_saveaddr; /* Original b_addr for physio. */ - daddr_t b_lblkno; /* Logical block number. */ - daddr_t b_blkno; /* Underlying physical block number. */ - /* Function to call upon completion. */ - void (*b_iodone) __P((struct buf *)); - /* For nested b_iodone's. */ - struct iodone_chain *b_iodone_chain; - struct vnode *b_vp; /* Device vnode. */ - int b_pfcent; /* Center page when swapping cluster. */ - int b_dirtyoff; /* Offset in buffer of dirty region. */ - int b_dirtyend; /* Offset of end of dirty region. */ - struct ucred *b_rcred; /* Read credentials reference. */ - struct ucred *b_wcred; /* Write credentials reference. */ - int b_validoff; /* Offset in buffer of valid region. */ - int b_validend; /* Offset of end of valid region. */ - daddr_t b_pblkno; /* physical block number */ - caddr_t b_savekva; /* saved kva for transfer while bouncing */ - void *b_driver1; /* for private use by the driver */ - void *b_driver2; /* for private use by the driver */ - void *b_spc; - struct vm_page *b_pages[(MAXPHYS + PAGE_SIZE - 1)/PAGE_SIZE]; - int b_npages; -}; - -/* Device driver compatibility definitions. */ -#define b_active b_bcount /* Driver queue head: drive active. */ -#define b_data b_un.b_addr /* b_un.b_addr is not changeable. */ -#define b_errcnt b_resid /* Retry count while I/O in progress. */ -#define iodone biodone /* Old name for biodone. */ -#define iowait biowait /* Old name for biowait. */ - -/* - * These flags are kept in b_flags. - */ -#define B_AGE 0x00000001 /* Move to age queue when I/O done. */ -#define B_APPENDWRITE 0x00000002 /* Append-write in progress. */ -#define B_ASYNC 0x00000004 /* Start I/O, do not wait. */ -#define B_BAD 0x00000008 /* Bad block revectoring in progress. */ -#define B_BUSY 0x00000010 /* I/O in progress. */ -#define B_CACHE 0x00000020 /* Bread found us in the cache. */ -#define B_CALL 0x00000040 /* Call b_iodone from biodone. */ -#define B_DELWRI 0x00000080 /* Delay I/O until buffer reused. */ -#define B_DIRTY 0x00000100 /* Dirty page to be pushed out async. */ -#define B_DONE 0x00000200 /* I/O completed. */ -#define B_EINTR 0x00000400 /* I/O was interrupted */ -#define B_ERROR 0x00000800 /* I/O error occurred. */ -#define B_GATHERED 0x00001000 /* LFS: already in a segment. */ -#define B_INVAL 0x00002000 /* Does not contain valid info. */ -#define B_LOCKED 0x00004000 /* Locked in core (not reusable). */ -#define B_NOCACHE 0x00008000 /* Do not cache block after use. */ -#define B_MALLOC 0x00010000 /* malloced b_data */ -#define B_CLUSTEROK 0x00020000 /* Pagein op, so swap() can count it. */ -#define B_PHYS 0x00040000 /* I/O to user memory. */ -#define B_RAW 0x00080000 /* Set by physio for raw transfers. */ -#define B_READ 0x00100000 /* Read buffer. */ -#define B_TAPE 0x00200000 /* Magnetic tape I/O. */ -#define B_RELBUF 0x00400000 /* Release VMIO buffer. */ -#define B_WANTED 0x00800000 /* Process wants this buffer. */ -#define B_WRITE 0x00000000 /* Write buffer (pseudo flag). */ -#define B_WRITEINPROG 0x01000000 /* Write in progress. */ -#define B_XXX 0x02000000 /* Debugging flag. */ -#define B_PAGING 0x04000000 /* volatile paging I/O -- bypass VMIO */ -#define B_VMIO 0x20000000 /* VMIO flag */ -#define B_CLUSTER 0x40000000 /* pagein op, so swap() can count it */ -#define B_BOUNCE 0x80000000 /* bounce buffer flag */ - -/* - * This structure describes a clustered I/O. It is stored in the b_saveaddr - * field of the buffer on which I/O is done. At I/O completion, cluster - * callback uses the structure to parcel I/O's to individual buffers, and - * then free's this structure. - */ -struct cluster_save { - long bs_bcount; /* Saved b_bcount. */ - long bs_bufsize; /* Saved b_bufsize. */ - void *bs_saveaddr; /* Saved b_addr. */ - int bs_nchildren; /* Number of associated buffers. */ - struct buf **bs_children; /* List of associated buffers. */ -}; - -/* - * number of buffer hash entries - */ -#define BUFHSZ 512 - -/* - * buffer hash table calculation, originally by David Greenman - */ -#define BUFHASH(vnp, bn) \ - (&bufhashtbl[(((unsigned long)(vnp) >> 7)+(int)(bn)) % BUFHSZ]) - -/* - * Definitions for the buffer free lists. - */ -#define BUFFER_QUEUES 6 /* number of free buffer queues */ - -LIST_HEAD(bufhashhdr, buf) bufhashtbl[BUFHSZ], invalhash; -TAILQ_HEAD(bqueues, buf) bufqueues[BUFFER_QUEUES]; - -#define QUEUE_NONE 0 /* on no queue */ -#define QUEUE_LOCKED 1 /* locked buffers */ -#define QUEUE_LRU 2 /* useful buffers */ -#define QUEUE_VMIO 3 /* VMIO buffers */ -#define QUEUE_AGE 4 /* not-useful buffers */ -#define QUEUE_EMPTY 5 /* empty buffer headers*/ - -/* - * Zero out the buffer's data area. - */ -#define clrbuf(bp) { \ - blkclr((bp)->b_data, (u_int)(bp)->b_bcount); \ - (bp)->b_resid = 0; \ -} - -/* Flags to low-level allocation routines. */ -#define B_CLRBUF 0x01 /* Request allocated buffer be cleared. */ -#define B_SYNC 0x02 /* Do all allocations synchronously. */ - -#ifdef KERNEL -extern int nbuf; /* The number of buffer headers */ -extern struct buf *buf; /* The buffer headers. */ -extern char *buffers; /* The buffer contents. */ -extern int bufpages; /* Number of memory pages in the buffer pool. */ -extern struct buf *swbuf; /* Swap I/O buffer headers. */ -extern int nswbuf; /* Number of swap I/O buffer headers. */ -extern TAILQ_HEAD(swqueue, buf) bswlist; - -__BEGIN_DECLS -void bufinit __P((void)); -void bremfree __P((struct buf *)); -int bread __P((struct vnode *, daddr_t, int, - struct ucred *, struct buf **)); -int breadn __P((struct vnode *, daddr_t, int, daddr_t *, int *, int, - struct ucred *, struct buf **)); -int bwrite __P((struct buf *)); -void bdwrite __P((struct buf *)); -void bawrite __P((struct buf *)); -void brelse __P((struct buf *)); -void vfs_bio_awrite __P((struct buf *)); -struct buf * getpbuf __P((void)); -struct buf *incore __P((struct vnode *, daddr_t)); -int inmem __P((struct vnode *, daddr_t)); -struct buf *getblk __P((struct vnode *, daddr_t, int, int, int)); -struct buf *geteblk __P((int)); -int allocbuf __P((struct buf *, int)); -int biowait __P((struct buf *)); -void biodone __P((struct buf *)); - -void cluster_callback __P((struct buf *)); -int cluster_read __P((struct vnode *, u_quad_t, daddr_t, long, - struct ucred *, struct buf **)); -void cluster_wbuild __P((struct vnode *, struct buf *, long, daddr_t, int, - daddr_t)); -void cluster_write __P((struct buf *, u_quad_t)); -int physio __P((void (*)(), struct buf *, dev_t, int, u_int (*)(), - struct uio *)); -u_int minphys __P((struct buf *)); -void vfs_bio_clrbuf __P((struct buf *)); -void vfs_busy_pages __P((struct buf *, int clear_modify)); -void vfs_unbusy_pages(struct buf *); -void vwakeup __P((struct buf *)); -void vmapbuf __P((struct buf *)); -void vunmapbuf __P((struct buf *)); -void relpbuf __P((struct buf *)); -void brelvp __P((struct buf *)); -void bgetvp __P((struct vnode *, struct buf *)); -void pbgetvp __P((struct vnode *, struct buf *)); -void pbrelvp __P((struct buf *)); -void reassignbuf __P((struct buf *, struct vnode *)); -struct buf *trypbuf __P((void)); -void vm_bounce_alloc __P((struct buf *)); -void vm_bounce_free __P((struct buf *)); -vm_offset_t vm_bounce_kva_alloc __P((int)); -void vm_bounce_kva_alloc_free __P((vm_offset_t, int)); -__END_DECLS -#endif -#endif /* !_SYS_BUF_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/callout.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/callout.h deleted file mode 100644 index 76d7519b5fa..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/callout.h +++ /dev/null @@ -1,56 +0,0 @@ -/*- - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)callout.h 8.2 (Berkeley) 1/21/94 - */ - -#ifndef _SYS_CALLOUT_H_ -#define _SYS_CALLOUT_H_ - -struct callout { - struct callout *c_next; /* next callout in queue */ - void *c_arg; /* function argument */ - void (*c_func) __P((void *)); /* function to call */ - int c_time; /* ticks to the event */ -}; - -#ifdef KERNEL -extern struct callout *callfree, *callout, calltodo; -extern int ncallout; -#endif - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/cdefs.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/cdefs.h deleted file mode 100644 index 99d44c71415..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/cdefs.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Berkeley Software Design, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)cdefs.h 8.7 (Berkeley) 1/21/94 - */ - -#ifndef _SYS_CDEFS_H_ -#define _SYS_CDEFS_H_ - -#if defined(__cplusplus) -#define __BEGIN_DECLS extern "C" { -#define __END_DECLS }; -#else -#define __BEGIN_DECLS -#define __END_DECLS -#endif - -/* - * The __CONCAT macro is used to concatenate parts of symbol names, e.g. - * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo. - * The __CONCAT macro is a bit tricky -- make sure you don't put spaces - * in between its arguments. __CONCAT can also concatenate double-quoted - * strings produced by the __STRING macro, but this only works with ANSI C. - */ -#if defined(__STDC__) || defined(__cplusplus) -#define __P(protos) protos /* full-blown ANSI C */ -#define __CONCAT1(x,y) x ## y -#define __CONCAT(x,y) __CONCAT1(x,y) -#define __STRING(x) #x - -#define __const const /* define reserved names to standard */ -#define __signed signed -#define __volatile volatile -#if defined(__cplusplus) -#define __inline inline /* convert to C++ keyword */ -#else -#ifndef __GNUC__ -#define __inline /* delete GCC keyword */ -#endif /* !__GNUC__ */ -#endif /* !__cplusplus */ - -#else /* !(__STDC__ || __cplusplus) */ -#define __P(protos) () /* traditional C preprocessor */ -#define __CONCAT(x,y) x/**/y -#define __STRING(x) "x" - -#ifndef __GNUC__ -#define __const /* delete pseudo-ANSI C keywords */ -#define __inline -#define __signed -#define __volatile -/* - * In non-ANSI C environments, new programs will want ANSI-only C keywords - * deleted from the program and old programs will want them left alone. - * When using a compiler other than gcc, programs using the ANSI C keywords - * const, inline etc. as normal identifiers should define -DNO_ANSI_KEYWORDS. - * When using "gcc -traditional", we assume that this is the intent; if - * __GNUC__ is defined but __STDC__ is not, we leave the new keywords alone. - */ -#ifndef NO_ANSI_KEYWORDS -#define const /* delete ANSI C keywords */ -#define inline -#define signed -#define volatile -#endif -#endif /* !NO_ANSI_KEYWORDS */ -#endif /* !(__STDC__ || __cplusplus) */ - -/* - * GCC1 and some versions of GCC2 declare dead (non-returning) and - * pure (no side effects) functions using "volatile" and "const"; - * unfortunately, these then cause warnings under "-ansi -pedantic". - * GCC2.5 uses a new, peculiar __attribute__((attrs)) style. All of - * these work for GNU C++ (modulo a slight glitch in the C++ grammar - * in the distribution version of 2.5.5). - */ -#if __GNUC__ < 2 -#define __dead -#define __dead2 -#define __pure -#define __pure2 -#define __attribute__(x) -#endif -#if __GNUC__ == 2 && __GNUC_MINOR__ < 5 -#define __dead __volatile -#define __dead2 -#define __pure __const -#define __pure2 -#endif -#if __GNUC__ == 2 && __GNUC_MINOR__ > 5 || __GNUC__ >= 3 -#define __dead -#define __dead2 __attribute__((noreturn)) -#define __pure -#define __pure2 __attribute__((const)) -#endif - -#ifdef __GNUC__ -#ifdef __STDC__ -#define __weak_reference(sym,alias) \ - __asm__(".stabs \"_" #alias "\",11,0,0,0"); \ - __asm__(".stabs \"_" #sym "\",1,0,0,0") -#define __warn_references(sym,msg) \ - __asm__(".stabs \"" msg "\",30,0,0,0"); \ - __asm__(".stabs \"_" #sym "\",1,0,0,0") -#else -#define __weak_reference(sym,alias) \ - __asm__(".stabs \"_/**/alias\",11,0,0,0"); \ - __asm__(".stabs \"_/**/sym\",1,0,0,0") -#define __warn_references(sym,msg) \ - __asm__(".stabs msg,30,0,0,0"); \ - __asm__(".stabs \"_/**/sym\",1,0,0,0") -#endif -#endif - -#endif /* !_SYS_CDEFS_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/domain.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/domain.h deleted file mode 100644 index 5c8e4418ce1..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/domain.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)domain.h 8.1 (Berkeley) 6/2/93 - */ - -#ifndef _SYS_DOMAIN_H_ -#define _SYS_DOMAIN_H_ - -/* - * Structure per communications domain. - */ - -/* - * Forward structure declarations for function prototypes [sic]. - */ -struct mbuf; - -struct domain { - int dom_family; /* AF_xxx */ - char *dom_name; - void (*dom_init) /* initialize domain data structures */ - __P((void)); - int (*dom_externalize) /* externalize access rights */ - __P((struct mbuf *)); - int (*dom_dispose) /* dispose of internalized rights */ - __P((struct mbuf *)); - struct protosw *dom_protosw, *dom_protoswNPROTOSW; - struct domain *dom_next; - int (*dom_rtattach) /* initialize routing table */ - __P((void **, int)); - int dom_rtoffset; /* an arg to rtattach, in bits */ - int dom_maxrtkey; /* for routing layer */ -}; - -#ifdef KERNEL -extern struct domain *domains; - -#define DOMAIN_SET(name) \ - DATA_SET(domain_set, name ## domain); - -#endif - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/errno.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/errno.h deleted file mode 100644 index 0fd2fd754eb..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/errno.h +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1989, 1993 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)errno.h 8.5 (Berkeley) 1/21/94 - */ - -#ifndef _SYS_ERRNO_H_ -#define _SYS_ERRNO_H_ - -#ifndef KERNEL -extern int errno; /* global error number */ -#endif - -#define EPERM 1 /* Operation not permitted */ -#define ENOENT 2 /* No such file or directory */ -#define ESRCH 3 /* No such process */ -#define EINTR 4 /* Interrupted system call */ -#define EIO 5 /* Input/output error */ -#define ENXIO 6 /* Device not configured */ -#define E2BIG 7 /* Argument list too long */ -#define ENOEXEC 8 /* Exec format error */ -#define EBADF 9 /* Bad file descriptor */ -#define ECHILD 10 /* No child processes */ -#define EDEADLK 11 /* Resource deadlock avoided */ - /* 11 was EAGAIN */ -#define ENOMEM 12 /* Cannot allocate memory */ -#define EACCES 13 /* Permission denied */ -#define EFAULT 14 /* Bad address */ -#ifndef _POSIX_SOURCE -#define ENOTBLK 15 /* Block device required */ -#endif -#define EBUSY 16 /* Device busy */ -#define EEXIST 17 /* File exists */ -#define EXDEV 18 /* Cross-device link */ -#define ENODEV 19 /* Operation not supported by device */ -#define ENOTDIR 20 /* Not a directory */ -#define EISDIR 21 /* Is a directory */ -#define EINVAL 22 /* Invalid argument */ -#define ENFILE 23 /* Too many open files in system */ -#define EMFILE 24 /* Too many open files */ -#define ENOTTY 25 /* Inappropriate ioctl for device */ -#ifndef _POSIX_SOURCE -#define ETXTBSY 26 /* Text file busy */ -#endif -#define EFBIG 27 /* File too large */ -#define ENOSPC 28 /* No space left on device */ -#define ESPIPE 29 /* Illegal seek */ -#define EROFS 30 /* Read-only file system */ -#define EMLINK 31 /* Too many links */ -#define EPIPE 32 /* Broken pipe */ - -/* math software */ -#define EDOM 33 /* Numerical argument out of domain */ -#define ERANGE 34 /* Result too large */ - -/* non-blocking and interrupt i/o */ -#define EAGAIN 35 /* Resource temporarily unavailable */ -#ifndef _POSIX_SOURCE -#define EWOULDBLOCK EAGAIN /* Operation would block */ -#define EINPROGRESS 36 /* Operation now in progress */ -#define EALREADY 37 /* Operation already in progress */ - -/* ipc/network software -- argument errors */ -#define ENOTSOCK 38 /* Socket operation on non-socket */ -#define EDESTADDRREQ 39 /* Destination address required */ -#define EMSGSIZE 40 /* Message too long */ -#define EPROTOTYPE 41 /* Protocol wrong type for socket */ -#define ENOPROTOOPT 42 /* Protocol not available */ -#define EPROTONOSUPPORT 43 /* Protocol not supported */ -#define ESOCKTNOSUPPORT 44 /* Socket type not supported */ -#define EOPNOTSUPP 45 /* Operation not supported */ -#define EPFNOSUPPORT 46 /* Protocol family not supported */ -#define EAFNOSUPPORT 47 /* Address family not supported by protocol family */ -#define EADDRINUSE 48 /* Address already in use */ -#define EADDRNOTAVAIL 49 /* Can't assign requested address */ - -/* ipc/network software -- operational errors */ -#define ENETDOWN 50 /* Network is down */ -#define ENETUNREACH 51 /* Network is unreachable */ -#define ENETRESET 52 /* Network dropped connection on reset */ -#define ECONNABORTED 53 /* Software caused connection abort */ -#define ECONNRESET 54 /* Connection reset by peer */ -#define ENOBUFS 55 /* No buffer space available */ -#define EISCONN 56 /* Socket is already connected */ -#define ENOTCONN 57 /* Socket is not connected */ -#define ESHUTDOWN 58 /* Can't send after socket shutdown */ -#define ETOOMANYREFS 59 /* Too many references: can't splice */ -#define ETIMEDOUT 60 /* Operation timed out */ -#define ECONNREFUSED 61 /* Connection refused */ - -#define ELOOP 62 /* Too many levels of symbolic links */ -#endif /* _POSIX_SOURCE */ -#define ENAMETOOLONG 63 /* File name too long */ - -/* should be rearranged */ -#ifndef _POSIX_SOURCE -#define EHOSTDOWN 64 /* Host is down */ -#define EHOSTUNREACH 65 /* No route to host */ -#endif /* _POSIX_SOURCE */ -#define ENOTEMPTY 66 /* Directory not empty */ - -/* quotas & mush */ -#ifndef _POSIX_SOURCE -#define EPROCLIM 67 /* Too many processes */ -#define EUSERS 68 /* Too many users */ -#define EDQUOT 69 /* Disc quota exceeded */ - -/* Network File System */ -#define ESTALE 70 /* Stale NFS file handle */ -#define EREMOTE 71 /* Too many levels of remote in path */ -#define EBADRPC 72 /* RPC struct is bad */ -#define ERPCMISMATCH 73 /* RPC version wrong */ -#define EPROGUNAVAIL 74 /* RPC prog. not avail */ -#define EPROGMISMATCH 75 /* Program version wrong */ -#define EPROCUNAVAIL 76 /* Bad procedure for program */ -#endif /* _POSIX_SOURCE */ - -#define ENOLCK 77 /* No locks available */ -#define ENOSYS 78 /* Function not implemented */ - -#ifndef _POSIX_SOURCE -#define EFTYPE 79 /* Inappropriate file type or format */ -#define EAUTH 80 /* Authentication error */ -#define ENEEDAUTH 81 /* Need authenticator */ -#define ELAST 81 /* Must be equal largest errno */ -#endif /* _POSIX_SOURCE */ - -#ifdef KERNEL -/* pseudo-errors returned inside kernel to modify return to process */ -#define ERESTART -1 /* restart syscall */ -#define EJUSTRETURN -2 /* don't modify regs, just return */ -#endif - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/fcntl.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/fcntl.h deleted file mode 100644 index 62762f3498a..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/fcntl.h +++ /dev/null @@ -1,190 +0,0 @@ -/*- - * Copyright (c) 1983, 1990, 1993 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)fcntl.h 8.3 (Berkeley) 1/21/94 - */ - -#ifndef _SYS_FCNTL_H_ -#define _SYS_FCNTL_H_ - -/* - * This file includes the definitions for open and fcntl - * described by POSIX for <fcntl.h>; it also includes - * related kernel definitions. - */ - -#ifndef KERNEL -#include <sys/types.h> -#endif - -/* - * File status flags: these are used by open(2), fcntl(2). - * They are also used (indirectly) in the kernel file structure f_flags, - * which is a superset of the open/fcntl flags. Open flags and f_flags - * are inter-convertible using OFLAGS(fflags) and FFLAGS(oflags). - * Open/fcntl flags begin with O_; kernel-internal flags begin with F. - */ -/* open-only flags */ -#define O_RDONLY 0x0000 /* open for reading only */ -#define O_WRONLY 0x0001 /* open for writing only */ -#define O_RDWR 0x0002 /* open for reading and writing */ -#define O_ACCMODE 0x0003 /* mask for above modes */ - -/* - * Kernel encoding of open mode; separate read and write bits that are - * independently testable: 1 greater than the above. - * - * XXX - * FREAD and FWRITE are excluded from the #ifdef KERNEL so that TIOCFLUSH, - * which was documented to use FREAD/FWRITE, continues to work. - */ -#ifndef _POSIX_SOURCE -#define FREAD 0x0001 -#define FWRITE 0x0002 -#endif -#define O_NONBLOCK 0x0004 /* no delay */ -#define O_APPEND 0x0008 /* set append mode */ -#ifndef _POSIX_SOURCE -#define O_SHLOCK 0x0010 /* open with shared file lock */ -#define O_EXLOCK 0x0020 /* open with exclusive file lock */ -#define O_ASYNC 0x0040 /* signal pgrp when data ready */ -#define O_FSYNC 0x0080 /* synchronous writes */ -#endif -#define O_CREAT 0x0200 /* create if nonexistant */ -#define O_TRUNC 0x0400 /* truncate to zero length */ -#define O_EXCL 0x0800 /* error if already exists */ -#ifdef KERNEL -#define FMARK 0x1000 /* mark during gc() */ -#define FDEFER 0x2000 /* defer for next gc pass */ -#define FHASLOCK 0x4000 /* descriptor holds advisory lock */ -#endif - -/* defined by POSIX 1003.1; BSD default, so no bit required */ -#define O_NOCTTY 0 /* don't assign controlling terminal */ - -#ifdef KERNEL -/* convert from open() flags to/from fflags; convert O_RD/WR to FREAD/FWRITE */ -#define FFLAGS(oflags) ((oflags) + 1) -#define OFLAGS(fflags) ((fflags) - 1) - -/* bits to save after open */ -#define FMASK (FREAD|FWRITE|FAPPEND|FASYNC|FFSYNC|FNONBLOCK) -/* bits settable by fcntl(F_SETFL, ...) */ -#define FCNTLFLAGS (FAPPEND|FASYNC|FFSYNC|FNONBLOCK) -#endif - -/* - * The O_* flags used to have only F* names, which were used in the kernel - * and by fcntl. We retain the F* names for the kernel f_flags field - * and for backward compatibility for fcntl. - */ -#ifndef _POSIX_SOURCE -#define FAPPEND O_APPEND /* kernel/compat */ -#define FASYNC O_ASYNC /* kernel/compat */ -#define FFSYNC O_FSYNC /* kernel */ -#define FNONBLOCK O_NONBLOCK /* kernel */ -#define FNDELAY O_NONBLOCK /* compat */ -#define O_NDELAY O_NONBLOCK /* compat */ -#endif - -/* - * Constants used for fcntl(2) - */ - -/* command values */ -#define F_DUPFD 0 /* duplicate file descriptor */ -#define F_GETFD 1 /* get file descriptor flags */ -#define F_SETFD 2 /* set file descriptor flags */ -#define F_GETFL 3 /* get file status flags */ -#define F_SETFL 4 /* set file status flags */ -#ifndef _POSIX_SOURCE -#define F_GETOWN 5 /* get SIGIO/SIGURG proc/pgrp */ -#define F_SETOWN 6 /* set SIGIO/SIGURG proc/pgrp */ -#endif -#define F_GETLK 7 /* get record locking information */ -#define F_SETLK 8 /* set record locking information */ -#define F_SETLKW 9 /* F_SETLK; wait if blocked */ - -/* file descriptor flags (F_GETFD, F_SETFD) */ -#define FD_CLOEXEC 1 /* close-on-exec flag */ - -/* record locking flags (F_GETLK, F_SETLK, F_SETLKW) */ -#define F_RDLCK 1 /* shared or read lock */ -#define F_UNLCK 2 /* unlock */ -#define F_WRLCK 3 /* exclusive or write lock */ -#ifdef KERNEL -#define F_WAIT 0x010 /* Wait until lock is granted */ -#define F_FLOCK 0x020 /* Use flock(2) semantics for lock */ -#define F_POSIX 0x040 /* Use POSIX semantics for lock */ -#endif - -/* - * Advisory file segment locking data type - - * information passed to system by user - */ -struct flock { - off_t l_start; /* starting offset */ - off_t l_len; /* len = 0 means until end of file */ - pid_t l_pid; /* lock owner */ - short l_type; /* lock type: read/write, etc. */ - short l_whence; /* type of l_start */ -}; - - -#ifndef _POSIX_SOURCE -/* lock operations for flock(2) */ -#define LOCK_SH 0x01 /* shared file lock */ -#define LOCK_EX 0x02 /* exclusive file lock */ -#define LOCK_NB 0x04 /* don't block when locking */ -#define LOCK_UN 0x08 /* unlock file */ -#endif - - -#ifndef KERNEL -#include <sys/cdefs.h> - -__BEGIN_DECLS -int open __P((const char *, int, ...)); -int creat __P((const char *, mode_t)); -int fcntl __P((int, int, ...)); -#ifndef _POSIX_SOURCE -int flock __P((int, int)); -#endif /* !_POSIX_SOURCE */ -__END_DECLS -#endif - -#endif /* !_SYS_FCNTL_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/file.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/file.h deleted file mode 100644 index 6f122605b13..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/file.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)file.h 8.1 (Berkeley) 6/2/93 - */ - -#ifndef _SYS_FILE_H_ -#define _SYS_FILE_H_ - -#include <sys/fcntl.h> -#include <sys/unistd.h> - -#ifdef KERNEL -struct proc; -struct uio; - -/* - * Kernel descriptor table. - * One entry for each open kernel vnode and socket. - */ -struct file { - struct file *f_filef; /* list of active files */ - struct file **f_fileb; /* list of active files */ - short f_flag; /* see fcntl.h */ -#define DTYPE_VNODE 1 /* file */ -#define DTYPE_SOCKET 2 /* communications endpoint */ - short f_type; /* descriptor type */ - short f_count; /* reference count */ - short f_msgcount; /* references from message queue */ - struct ucred *f_cred; /* credentials associated with descriptor */ - struct fileops { - int (*fo_read) __P((struct file *fp, struct uio *uio, - struct ucred *cred)); - int (*fo_write) __P((struct file *fp, struct uio *uio, - struct ucred *cred)); - int (*fo_ioctl) __P((struct file *fp, int com, - caddr_t data, struct proc *p)); - int (*fo_select) __P((struct file *fp, int which, - struct proc *p)); - int (*fo_close) __P((struct file *fp, struct proc *p)); - } *f_ops; - off_t f_offset; - caddr_t f_data; /* vnode or socket */ -}; - -extern struct file *filehead; /* head of list of open files */ -extern struct fileops vnops; -extern int maxfiles; /* kernel limit on number of open files */ -extern int maxfilesperproc; /* per process limit on number of open files */ -extern int nfiles; /* actual number of open files */ - -#endif /* KERNEL */ - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/filedesc.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/filedesc.h deleted file mode 100644 index 4b0dec7cff7..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/filedesc.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)filedesc.h 8.1 (Berkeley) 6/2/93 - */ - -#ifndef _SYS_FILEDESC_H_ -#define _SYS_FILEDESC_H_ - -/* - * This structure is used for the management of descriptors. It may be - * shared by multiple processes. - * - * A process is initially started out with NDFILE descriptors stored within - * this structure, selected to be enough for typical applications based on - * the historical limit of 20 open files (and the usage of descriptors by - * shells). If these descriptors are exhausted, a larger descriptor table - * may be allocated, up to a process' resource limit; the internal arrays - * are then unused. The initial expansion is set to NDEXTENT; each time - * it runs out, it is doubled until the resource limit is reached. NDEXTENT - * should be selected to be the biggest multiple of OFILESIZE (see below) - * that will fit in a power-of-two sized piece of memory. - */ -#define NDFILE 20 -#define NDEXTENT 50 /* 250 bytes in 256-byte alloc. */ - -struct filedesc { - struct file **fd_ofiles; /* file structures for open files */ - char *fd_ofileflags; /* per-process open file flags */ - struct vnode *fd_cdir; /* current directory */ - struct vnode *fd_rdir; /* root directory */ - int fd_nfiles; /* number of open files allocated */ - u_short fd_lastfile; /* high-water mark of fd_ofiles */ - u_short fd_freefile; /* approx. next free file */ - u_short fd_cmask; /* mask for file creation */ - u_short fd_refcnt; /* reference count */ -}; - -/* - * Basic allocation of descriptors: - * one of the above, plus arrays for NDFILE descriptors. - */ -struct filedesc0 { - struct filedesc fd_fd; - /* - * These arrays are used when the number of open files is - * <= NDFILE, and are then pointed to by the pointers above. - */ - struct file *fd_dfiles[NDFILE]; - char fd_dfileflags[NDFILE]; -}; - -/* - * Per-process open flags. - */ -#define UF_EXCLOSE 0x01 /* auto-close on exec */ -#define UF_MAPPED 0x02 /* mapped from device */ - -/* - * Storage required per open file descriptor. - */ -#define OFILESIZE (sizeof(struct file *) + sizeof(char)) - -#ifdef KERNEL -/* - * Kernel global variables and routines. - */ -int dupfdopen __P((struct filedesc *, int, int, int, int)); -int fdalloc __P((struct proc *p, int want, int *result)); -int fdavail __P((struct proc *p, int n)); -int falloc __P((struct proc *p, struct file **resultfp, int *resultfd)); -void ffree __P((struct file *)); -struct filedesc *fdcopy __P((struct proc *p)); -void fdfree __P((struct proc *p)); -int closef __P((struct file *fp,struct proc *p)); -void fdcloseexec __P((struct proc *p)); -#endif - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/filio.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/filio.h deleted file mode 100644 index c1566c26495..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/filio.h +++ /dev/null @@ -1,57 +0,0 @@ -/*- - * Copyright (c) 1982, 1986, 1990, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)filio.h 8.1 (Berkeley) 3/28/94 - */ - -#ifndef _SYS_FILIO_H_ -#define _SYS_FILIO_H_ - -#ifndef __REACTOS__ -#include <sys/ioccom.h> - -/* Generic file-descriptor ioctl's. */ -#define FIOCLEX _IO('f', 1) /* set close on exec on fd */ -#define FIONCLEX _IO('f', 2) /* remove close on exec */ -#define FIONREAD _IOR('f', 127, int) /* get # bytes to read */ -#define FIONBIO _IOW('f', 126, int) /* set/clear non-blocking i/o */ -#define FIOASYNC _IOW('f', 125, int) /* set/clear async i/o */ -#define FIOSETOWN _IOW('f', 124, int) /* set owner */ -#define FIOGETOWN _IOR('f', 123, int) /* get owner */ -#endif - -#endif /* !_SYS_FILIO_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/ioccom.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/ioccom.h deleted file mode 100644 index 355df44d6ee..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/ioccom.h +++ /dev/null @@ -1,68 +0,0 @@ -/*- - * Copyright (c) 1982, 1986, 1990, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)ioccom.h 8.2 (Berkeley) 3/28/94 - */ - -#ifndef _SYS_IOCCOM_H_ -#define _SYS_IOCCOM_H_ - -/* - * Ioctl's have the command encoded in the lower word, and the size of - * any in or out parameters in the upper word. The high 3 bits of the - * upper word are used to encode the in/out status of the parameter. - */ -#ifndef __REACTOS__ -#define IOCPARM_MASK 0x1fff /* parameter length, at most 13 bits */ -#define IOCPARM_LEN(x) (((x) >> 16) & IOCPARM_MASK) -#define IOCBASECMD(x) ((x) & ~(IOCPARM_MASK << 16)) -#define IOCGROUP(x) (((x) >> 8) & 0xff) -#endif - -#define IOCPARM_MAX NBPG /* max size of ioctl, mult. of NBPG */ -#define IOC_VOID 0x20000000 /* no parameters */ -#define IOC_OUT 0x40000000 /* copy out parameters */ -#define IOC_IN 0x80000000 /* copy in parameters */ -#define IOC_INOUT (IOC_IN|IOC_OUT) -#define IOC_DIRMASK 0xe0000000 /* mask for IN/OUT/VOID */ - -#ifndef __REACTOS__ -#define _IOC(inout,group,num,len) \ - (inout | ((len & IOCPARM_MASK) << 16) | ((group) << 8) | (num)) -#define _IO(g,n) _IOC(IOC_VOID, (g), (n), 0) -#define _IOR(g,n,t) _IOC(IOC_OUT, (g), (n), sizeof(t)) -#define _IOW(g,n,t) _IOC(IOC_IN, (g), (n), sizeof(t)) -/* this should be _IORW, but stdio got there first */ -#define _IOWR(g,n,t) _IOC(IOC_INOUT, (g), (n), sizeof(t)) -#endif - -#endif /* !_SYS_IOCCOM_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/ioctl.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/ioctl.h deleted file mode 100644 index d04394fd181..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/ioctl.h +++ /dev/null @@ -1,84 +0,0 @@ -/*- - * Copyright (c) 1982, 1986, 1990, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)ioctl.h 8.6 (Berkeley) 3/28/94 - */ - -#ifndef _SYS_IOCTL_H_ -#define _SYS_IOCTL_H_ - -#include <sys/ttycom.h> - -/* - * Pun for SunOS prior to 3.2. SunOS 3.2 and later support TIOCGWINSZ - * and TIOCSWINSZ (yes, even 3.2-3.5, the fact that it wasn't documented - * nonwithstanding). - */ -struct ttysize { - unsigned short ts_lines; - unsigned short ts_cols; - unsigned short ts_xxx; - unsigned short ts_yyy; -}; -#define TIOCGSIZE TIOCGWINSZ -#define TIOCSSIZE TIOCSWINSZ - -#include <sys/ioccom.h> - -#include <sys/filio.h> -#include <sys/sockio.h> - -#ifndef KERNEL - -#include <sys/cdefs.h> - -__BEGIN_DECLS -int ioctl __P((int, unsigned long, ...)); -__END_DECLS -#endif /* !KERNEL */ -#endif /* !_SYS_IOCTL_H_ */ - -/* - * Keep outside _SYS_IOCTL_H_ - * Compatability with old terminal driver - * - * Source level -> #define USE_OLD_TTY - * Kernel level -> options COMPAT_43 or COMPAT_SUNOS - */ -#if defined(USE_OLD_TTY) || defined(COMPAT_43) || defined(COMPAT_SUNOS) -#include <sys/ioctl_compat.h> -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/kernel.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/kernel.h deleted file mode 100644 index 530fd7f5e12..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/kernel.h +++ /dev/null @@ -1,116 +0,0 @@ -/*- - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)kernel.h 8.3 (Berkeley) 1/21/94 - * $\Id: kernel.h,v 1.9 1995/03/20 19:20:26 wollman Exp $ - */ - -#ifndef _SYS_KERNEL_H_ -#define _SYS_KERNEL_H_ - -/* Global variables for the kernel. */ - -/* 1.1 */ -extern long hostid; -extern char hostname[MAXHOSTNAMELEN]; -extern int hostnamelen; -extern char domainname[MAXHOSTNAMELEN]; -extern int domainnamelen; -extern char kernelname[MAXPATHLEN]; - -/* 1.2 */ -extern volatile struct timeval mono_time; -extern struct timeval boottime; -extern struct timeval runtime; -extern volatile struct timeval time; -extern struct timezone tz; /* XXX */ - -extern int tick; /* usec per tick (1000000 / hz) */ -extern int hz; /* system clock's frequency */ -extern int stathz; /* statistics clock's frequency */ -extern int profhz; /* profiling clock's frequency */ -extern int ticks; -extern int lbolt; /* once a second sleep address */ -extern int tickdelta; -extern long timedelta; - -/* - * The following macros are used to declare global sets of objects, which - * are collected by the linker into a `struct linker_set' as defined below. - * - * NB: the constants defined below must match those defined in - * ld/ld.h. Since their calculation requires arithmetic, we - * can't name them symbolically (e.g., 23 is N_SETT | N_EXT). - */ -#define MAKE_SET(set, sym, type) \ - asm(".stabs \"_" #set "\", " #type ", 0, 0, _" #sym) -#define TEXT_SET(set, sym) MAKE_SET(set, sym, 23) -#define DATA_SET(set, sym) MAKE_SET(set, sym, 25) -#define BSS_SET(set, sym) MAKE_SET(set, sym, 27) -#define ABS_SET(set, sym) MAKE_SET(set, sym, 21) - -#ifdef PSEUDO_LKM -#include <sys/conf.h> -#include <sys/exec.h> -#include <sys/sysent.h> -#include <sys/lkm.h> - -#define PSEUDO_SET(init, name) \ - extern struct linker_set MODVNOPS; \ - MOD_MISC(#name); \ - int name ## _load(struct lkm_table *lkmtp, int cmd) \ - { init(); return 0; } \ - int name ## _unload(struct lkm_table *lkmtp, int cmd) \ - { return EINVAL; } \ - int \ - name ## _mod(struct lkm_table *lkmtp, int cmd, int ver) { \ - DISPATCH(lkmtp, cmd, ver, name ## _load, name ## _unload, \ - nosys); } -#else /* PSEUDO_LKM */ - -#define PSEUDO_SET(sym, name) TEXT_SET(pseudo_set, sym) - -#endif /* PSEUDO_LKM */ - -struct linker_set { - int ls_length; - caddr_t ls_items[1]; /* really ls_length of them, trailing NULL */ -}; - -extern const struct linker_set execsw_set; - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/libkern.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/libkern.h deleted file mode 100644 index e31b51605f1..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/libkern.h +++ /dev/null @@ -1,64 +0,0 @@ -/*- - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)libkern.h 8.1 (Berkeley) 6/10/93 - */ - -#include <sys/types.h> - -static __inline int imax(int a, int b) { return (a > b ? a : b); } -static __inline int imin(int a, int b) { return (a < b ? a : b); } -static __inline long lmax(long a, long b) { return (a > b ? a : b); } -static __inline long lmin(long a, long b) { return (a < b ? a : b); } -static __inline u_int max(u_int a, u_int b) { return (a > b ? a : b); } -static __inline u_int min(u_int a, u_int b) { return (a < b ? a : b); } -static __inline quad_t qmax(quad_t a, quad_t b) { return (a > b ? a : b); } -static __inline quad_t qmin(quad_t a, quad_t b) { return (a < b ? a : b); } -static __inline u_long ulmax(u_long a, u_long b) { return (a > b ? a : b); } -static __inline u_long ulmin(u_long a, u_long b) { return (a < b ? a : b); } - -/* Prototypes for non-quad routines. */ -int bcmp __P((const void *, const void *, size_t)); -#ifndef HAVE_INLINE_FFS -int ffs __P((int)); -#endif -int locc __P((int, char *, u_int)); -u_long random __P((void)); -char *rindex __P((const char *, int)); -int scanc __P((u_int, u_char *, u_char *, int)); -int skpc __P((int, int, char *)); -char *strcat __P((char *, const char *)); -int strcmp __P((const char *, const char *)); -char *strcpy __P((char *, const char *)); -size_t strlen __P((const char *)); -int strncmp __P((const char *, const char *, size_t)); -char *strncpy __P((char *, const char *, size_t)); diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/malloc.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/malloc.h deleted file mode 100644 index d21a9193939..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/malloc.h +++ /dev/null @@ -1,333 +0,0 @@ -/* - * Copyright (c) 1987, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)malloc.h 8.3 (Berkeley) 1/12/94 - */ - -#ifndef _SYS_MALLOC_H_ -#define _SYS_MALLOC_H_ - -#ifndef OSKIT -#define KMEMSTATS -#endif - -/* - * flags to malloc - */ -#define M_WAITOK 0x0000 -#define M_NOWAIT 0x0001 -#define M_KERNEL 0x0002 - -/* - * Types of memory to be allocated - */ -#define M_FREE 0 /* should be on free list */ -#define M_MBUF 1 /* mbuf */ -#define M_DEVBUF 2 /* device driver memory */ -#define M_SOCKET 3 /* socket structure */ -#define M_PCB 4 /* protocol control block */ -#define M_RTABLE 5 /* routing tables */ -#define M_HTABLE 6 /* IMP host tables */ -#define M_FTABLE 7 /* fragment reassembly header */ -#define M_ZOMBIE 8 /* zombie proc status */ -#define M_IFADDR 9 /* interface address */ -#define M_SOOPTS 10 /* socket options */ -#define M_SONAME 11 /* socket name */ -#define M_NAMEI 12 /* namei path name buffer */ -#define M_GPROF 13 /* kernel profiling buffer */ -#define M_IOCTLOPS 14 /* ioctl data buffer */ -#define M_MAPMEM 15 /* mapped memory descriptors */ -#define M_CRED 16 /* credentials */ -#define M_PGRP 17 /* process group header */ -#define M_SESSION 18 /* session header */ -#define M_IOV 19 /* large iov's */ -#define M_MOUNT 20 /* vfs mount struct */ -#define M_FHANDLE 21 /* network file handle */ -#define M_NFSREQ 22 /* NFS request header */ -#define M_NFSMNT 23 /* NFS mount structure */ -#define M_NFSNODE 24 /* NFS vnode private part */ -#define M_VNODE 25 /* Dynamically allocated vnodes */ -#define M_CACHE 26 /* Dynamically allocated cache entries */ -#define M_DQUOT 27 /* UFS quota entries */ -#define M_UFSMNT 28 /* UFS mount structure */ -#define M_SHM 29 /* SVID compatible shared memory segments */ -#define M_VMMAP 30 /* VM map structures */ -#define M_VMMAPENT 31 /* VM map entry structures */ -#define M_VMOBJ 32 /* VM object structure */ -#define M_VMOBJHASH 33 /* VM object hash structure */ -#define M_VMPMAP 34 /* VM pmap */ -#define M_VMPVENT 35 /* VM phys-virt mapping entry */ -#define M_VMPAGER 36 /* XXX: VM pager struct */ -#define M_VMPGDATA 37 /* XXX: VM pager private data */ -#define M_FILE 38 /* Open file structure */ -#define M_FILEDESC 39 /* Open file descriptor table */ -#define M_LOCKF 40 /* Byte-range locking structures */ -#define M_PROC 41 /* Proc structures */ -#define M_SUBPROC 42 /* Proc sub-structures */ -#define M_SEGMENT 43 /* Segment for LFS */ -#define M_LFSNODE 44 /* LFS vnode private part */ -#define M_FFSNODE 45 /* FFS vnode private part */ -#define M_MFSNODE 46 /* MFS vnode private part */ -#define M_NQLEASE 47 /* Nqnfs lease */ -#define M_NQMHOST 48 /* Nqnfs host address table */ -#define M_NETADDR 49 /* Export host address structure */ -#define M_NFSSVC 50 /* Nfs server structure */ -#define M_NFSUID 51 /* Nfs uid mapping structure */ -#define M_NFSD 52 /* Nfs server daemon structure */ -#define M_IPMOPTS 53 /* internet multicast options */ -#define M_IPMADDR 54 /* internet multicast address */ -#define M_IFMADDR 55 /* link-level multicast address */ -#define M_MRTABLE 56 /* multicast routing tables */ -#define M_ISOFSMNT 57 /* ISOFS mount structure */ -#define M_ISOFSNODE 58 /* ISOFS vnode private part */ -#define M_MSDOSFSMNT 59 /* MSDOSFS mount structure */ -#define M_MSDOSFSNODE 60 /* MSDOSFS vnode private part */ -#define M_MSDOSFSFAT 61 /* MSDOSFS file allocation table */ -#define M_DEVFSMNT 62 /* DEVFS mount structure */ -#define M_DEVFSBACK 63 /* DEVFS Back node */ -#define M_DEVFSFRONT 64 /* DEVFS Front node */ -#define M_DEVFSNODE 65 /* DEVFS node */ -#define M_TEMP 74 /* misc temporary data buffers */ -#define M_TTYS 75 /* tty data structures */ -#define M_GZIP 76 /* Gzip trees */ -#define M_IPFW 77 /* IpFw/IpAcct chain's */ -#define M_DEVL 78 /* isa_device lists in userconfig() */ -#define M_LAST 79 /* Must be last type + 1 */ - -#define INITKMEMNAMES { \ - "free", /* 0 M_FREE */ \ - "mbuf", /* 1 M_MBUF */ \ - "devbuf", /* 2 M_DEVBUF */ \ - "socket", /* 3 M_SOCKET */ \ - "pcb", /* 4 M_PCB */ \ - "routetbl", /* 5 M_RTABLE */ \ - "hosttbl", /* 6 M_HTABLE */ \ - "fragtbl", /* 7 M_FTABLE */ \ - "zombie", /* 8 M_ZOMBIE */ \ - "ifaddr", /* 9 M_IFADDR */ \ - "soopts", /* 10 M_SOOPTS */ \ - "soname", /* 11 M_SONAME */ \ - "namei", /* 12 M_NAMEI */ \ - "gprof", /* 13 M_GPROF */ \ - "ioctlops", /* 14 M_IOCTLOPS */ \ - "mapmem", /* 15 M_MAPMEM */ \ - "cred", /* 16 M_CRED */ \ - "pgrp", /* 17 M_PGRP */ \ - "session", /* 18 M_SESSION */ \ - "iov", /* 19 M_IOV */ \ - "mount", /* 20 M_MOUNT */ \ - "fhandle", /* 21 M_FHANDLE */ \ - "NFS req", /* 22 M_NFSREQ */ \ - "NFS mount", /* 23 M_NFSMNT */ \ - "NFS node", /* 24 M_NFSNODE */ \ - "vnodes", /* 25 M_VNODE */ \ - "namecache", /* 26 M_CACHE */ \ - "UFS quota", /* 27 M_DQUOT */ \ - "UFS mount", /* 28 M_UFSMNT */ \ - "shm", /* 29 M_SHM */ \ - "VM map", /* 30 M_VMMAP */ \ - "VM mapent", /* 31 M_VMMAPENT */ \ - "VM object", /* 32 M_VMOBJ */ \ - "VM objhash", /* 33 M_VMOBJHASH */ \ - "VM pmap", /* 34 M_VMPMAP */ \ - "VM pvmap", /* 35 M_VMPVENT */ \ - "VM pager", /* 36 M_VMPAGER */ \ - "VM pgdata", /* 37 M_VMPGDATA */ \ - "file", /* 38 M_FILE */ \ - "file desc", /* 39 M_FILEDESC */ \ - "lockf", /* 40 M_LOCKF */ \ - "proc", /* 41 M_PROC */ \ - "subproc", /* 42 M_SUBPROC */ \ - "LFS segment", /* 43 M_SEGMENT */ \ - "LFS node", /* 44 M_LFSNODE */ \ - "FFS node", /* 45 M_FFSNODE */ \ - "MFS node", /* 46 M_MFSNODE */ \ - "NQNFS Lease", /* 47 M_NQLEASE */ \ - "NQNFS Host", /* 48 M_NQMHOST */ \ - "Export Host", /* 49 M_NETADDR */ \ - "NFS srvsock", /* 50 M_NFSSVC */ \ - "NFS uid", /* 51 M_NFSUID */ \ - "NFS daemon", /* 52 M_NFSD */ \ - "ip_moptions", /* 53 M_IPMOPTS */ \ - "in_multi", /* 54 M_IPMADDR */ \ - "ether_multi", /* 55 M_IFMADDR */ \ - "mrt", /* 56 M_MRTABLE */ \ - "ISOFS mount", /* 57 M_ISOFSMNT */ \ - "ISOFS node", /* 58 M_ISOFSNODE */ \ - "MSDOSFS mount",/* 59 M_MSDOSFSMNT */ \ - "MSDOSFS node", /* 60 M_MSDOSFSNODE */ \ - "MSDOSFS FAT", /* 61 M_MSDOSFSFAR */ \ - "DEVFS mount", /* 62 M_DEVFSMNT */ \ - "DEVFS back", /* 63 M_DEVFSBACK */ \ - "DEVFS front", /* 64 M_DEVFSFRONT */ \ - "DEVFS node", /* 65 M_DEVFSNODE */ \ - NULL, \ - NULL, NULL, NULL, NULL, NULL, \ - NULL, NULL, \ - "temp", /* 74 M_TEMP */ \ - "ttys", /* 75 M_TTYS */ \ - "Gzip trees", /* 76 M_GZIP */ \ - "IpFw/IpAcct", /* 77 M_IPFW */ \ - "isa_devlist", /* 78 M_DEVL */ \ -} - -struct kmemstats { - long ks_inuse; /* # of packets of this type currently in use */ - long ks_calls; /* total packets of this type ever allocated */ - long ks_memuse; /* total memory held in bytes */ - u_short ks_limblocks; /* number of times blocked for hitting limit */ - u_short ks_mapblocks; /* number of times blocked for kernel map */ - long ks_maxused; /* maximum number ever used */ - long ks_limit; /* most that are allowed to exist */ - long ks_size; /* sizes of this thing that are allocated */ - long ks_spare; -}; - -/* - * Array of descriptors that describe the contents of each page - */ -struct kmemusage { - short ku_indx; /* bucket index */ - union { - u_short freecnt;/* for small allocations, free pieces in page */ - u_short pagecnt;/* for large allocations, pages alloced */ - } ku_un; -}; -#define ku_freecnt ku_un.freecnt -#define ku_pagecnt ku_un.pagecnt - -/* - * Set of buckets for each size of memory block that is retained - */ -struct kmembuckets { - caddr_t kb_next; /* list of free blocks */ - caddr_t kb_last; /* last free block */ - long kb_calls; /* total calls to allocate this size */ - long kb_total; /* total number of blocks allocated */ - long kb_totalfree; /* # of free elements in this bucket */ - long kb_elmpercl; /* # of elements in this sized allocation */ - long kb_highwat; /* high water mark */ - long kb_couldfree; /* over high water mark and could free */ -}; - -#ifdef KERNEL -#define MINALLOCSIZE (1 << MINBUCKET) -#define BUCKETINDX(size) \ - (size) <= (MINALLOCSIZE * 128) \ - ? (size) <= (MINALLOCSIZE * 8) \ - ? (size) <= (MINALLOCSIZE * 2) \ - ? (size) <= (MINALLOCSIZE * 1) \ - ? (MINBUCKET + 0) \ - : (MINBUCKET + 1) \ - : (size) <= (MINALLOCSIZE * 4) \ - ? (MINBUCKET + 2) \ - : (MINBUCKET + 3) \ - : (size) <= (MINALLOCSIZE* 32) \ - ? (size) <= (MINALLOCSIZE * 16) \ - ? (MINBUCKET + 4) \ - : (MINBUCKET + 5) \ - : (size) <= (MINALLOCSIZE * 64) \ - ? (MINBUCKET + 6) \ - : (MINBUCKET + 7) \ - : (size) <= (MINALLOCSIZE * 2048) \ - ? (size) <= (MINALLOCSIZE * 512) \ - ? (size) <= (MINALLOCSIZE * 256) \ - ? (MINBUCKET + 8) \ - : (MINBUCKET + 9) \ - : (size) <= (MINALLOCSIZE * 1024) \ - ? (MINBUCKET + 10) \ - : (MINBUCKET + 11) \ - : (size) <= (MINALLOCSIZE * 8192) \ - ? (size) <= (MINALLOCSIZE * 4096) \ - ? (MINBUCKET + 12) \ - : (MINBUCKET + 13) \ - : (size) <= (MINALLOCSIZE * 16384) \ - ? (MINBUCKET + 14) \ - : (MINBUCKET + 15) - -/* - * Turn virtual addresses into kmem map indicies - */ -#define kmemxtob(alloc) (kmembase + (alloc) * NBPG) -#define btokmemx(addr) (((caddr_t)(addr) - kmembase) / NBPG) -#define btokup(addr) (&kmemusage[((caddr_t)(addr) - kmembase) >> CLSHIFT]) - -/* - * Macro versions for the usual cases of malloc/free - */ -#if defined(KMEMSTATS) || defined(DIAGNOSTIC) -#define MALLOC(space, cast, size, type, flags) \ - (space) = (cast)fbsd_malloc((u_long)(size), __FILE__, __LINE__, type, flags) -#define FREE(addr, type) fbsd_free((caddr_t)(addr), __FILE__, __LINE__, type) - -#else /* do not collect statistics */ -#define MALLOC(space, cast, size, type, flags) { \ - register struct kmembuckets *kbp = &bucket[BUCKETINDX(size)]; \ - long s = splimp(); \ - if (kbp->kb_next == NULL) { \ - (space) = (cast)fbsd_malloc((u_long)(size), __FILE__, __LINE__, type, flags); \ - } else { \ - (space) = (cast)kbp->kb_next; \ - kbp->kb_next = *(caddr_t *)(space); \ - } \ - splx(s); \ -} - -#define FREE(addr, type) { \ - register struct kmembuckets *kbp; \ - register struct kmemusage *kup = btokup(addr); \ - long s = splimp(); \ - if (1 << kup->ku_indx > MAXALLOCSAVE) { \ - fbsd_free((caddr_t)(addr), __FILE__, __LINE__, type); \ - } else { \ - kbp = &bucket[kup->ku_indx]; \ - if (kbp->kb_next == NULL) \ - kbp->kb_next = (caddr_t)(addr); \ - else \ - *(caddr_t *)(kbp->kb_last) = (caddr_t)(addr); \ - *(caddr_t *)(addr) = NULL; \ - kbp->kb_last = (caddr_t)(addr); \ - } \ - splx(s); \ -} -#endif /* do not collect statistics */ - -extern struct kmemstats kmemstats[]; -extern struct kmemusage *kmemusage; -extern char *kmembase; -extern struct kmembuckets bucket[]; -#ifndef __REACTOS__ -extern void *malloc __P((unsigned long size, ...)); -extern void free __P((void *addr, ...)); -#endif -#endif /* KERNEL */ -#endif /* !_SYS_MALLOC_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/mbuf.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/mbuf.h deleted file mode 100644 index 3583ee7da50..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/mbuf.h +++ /dev/null @@ -1,512 +0,0 @@ -/* - * Copyright (c) 1997-1998 University of Utah and the Flux Group. - * All rights reserved. - * - * This file is part of the Flux OSKit. The OSKit is free software, also known - * as "open source;" you can redistribute it and/or modify it under the terms - * of the GNU General Public License (GPL), version 2, as published by the Free - * Software Foundation (FSF). To explore alternate licensing terms, contact - * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. - * - * The OSKit 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 GPL for more details. You should have - * received a copy of the GPL along with the OSKit; see the file COPYING. If - * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. - */ -/* - * Copyright (c) 1982, 1986, 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)mbuf.h 8.3 (Berkeley) 1/21/94 - * $\Id: mbuf.h,v 1.9 1994/11/14 13:54:20 bde Exp $ - */ - -#ifndef _SYS_MBUF_H_ -#define _SYS_MBUF_H_ - -#ifndef M_WAITOK -#include <sys/malloc.h> -#endif - -/* - * Mbufs are of a single size, MSIZE (machine/machparam.h), which - * includes overhead. An mbuf may add a single "mbuf cluster" of size - * MCLBYTES (also in machine/machparam.h), which has no additional overhead - * and is used instead of the internal data area; this is done when - * at least MINCLSIZE of data must be stored. - */ - -#define MLEN (MSIZE - sizeof(struct m_hdr)) /* normal data len */ -#define MHLEN (MLEN - sizeof(struct pkthdr)) /* data len w/pkthdr */ - -#define MINCLSIZE (MHLEN + MLEN) /* smallest amount to put in cluster */ -#define M_MAXCOMPRESS (MHLEN / 2) /* max amount to copy for compression */ - -/* - * Macros for type conversion - * mtod(m,t) - convert mbuf pointer to data pointer of correct type - * dtom(x) - convert data pointer within mbuf to mbuf pointer (XXX) - * mtocl(x) - convert pointer within cluster to cluster index # - * cltom(x) - convert cluster # to ptr to beginning of cluster - */ -#define mtod(m,t) ((t)((m)->m_data)) -#define dtom(x) ((struct mbuf *)((int)(x) - sizeof(struct m_hdr))) -#ifndef OSKIT -#define mtocl(x) (((u_int)(x) - (u_int)mbutl) >> MCLSHIFT) -#define cltom(x) ((caddr_t)((u_int)mbutl + ((u_int)(x) << MCLSHIFT))) -#endif /* OSKIT */ - -/* header at beginning of each mbuf: */ -struct m_hdr { - struct mbuf *mh_next; /* next buffer in chain */ - struct mbuf *mh_nextpkt; /* next chain in queue/record */ - int mh_len; /* amount of data in this mbuf */ - caddr_t mh_data; /* location of data */ - short mh_type; /* type of data in this mbuf */ - short mh_flags; /* flags; see below */ -}; - -/* record/packet header in first mbuf of chain; valid if M_PKTHDR set */ -struct pkthdr { - int len; /* total packet length */ - struct ifnet *rcvif; /* rcv interface */ -}; - -/* description of external storage mapped into mbuf, valid if M_EXT set */ -struct m_ext { - caddr_t ext_buf; /* start of buffer */ -#ifdef OSKIT - struct oskit_bufio *ext_bufio; /* OS Kit bufio pointer */ -#else - void (*ext_free) /* free routine if not the usual */ - __P((caddr_t, u_int)); -#endif - u_int ext_size; /* size of buffer, for ext_free */ -}; - -struct mbuf { - struct m_hdr m_hdr; - union { - struct { - struct pkthdr MH_pkthdr; /* M_PKTHDR set */ - union { - struct m_ext MH_ext; /* M_EXT set */ - char MH_databuf[MHLEN]; - } MH_dat; - } MH; - char M_databuf[MLEN]; /* !M_PKTHDR, !M_EXT */ - } M_dat; -}; -#define m_next m_hdr.mh_next -#define m_len m_hdr.mh_len -#define m_data m_hdr.mh_data -#define m_type m_hdr.mh_type -#define m_flags m_hdr.mh_flags -#define m_nextpkt m_hdr.mh_nextpkt -#define m_act m_nextpkt -#define m_pkthdr M_dat.MH.MH_pkthdr -#define m_ext M_dat.MH.MH_dat.MH_ext -#define m_pktdat M_dat.MH.MH_dat.MH_databuf -#define m_dat M_dat.M_databuf - -/* mbuf flags */ -#ifdef OSKIT -#include <oskit/io/bufio.h> -/* - * A small step for mankind, but a huge leap for BSD: - * We consistently use oskit_bufios for external mbufs - */ -#endif -#define M_EXT 0x0001 /* has associated external storage */ -#define M_PKTHDR 0x0002 /* start of record */ -#define M_EOR 0x0004 /* end of record */ - -/* mbuf pkthdr flags, also in m_flags */ -#define M_BCAST 0x0100 /* send/received as link-level broadcast */ -#define M_MCAST 0x0200 /* send/received as link-level multicast */ - -/* flags copied when copying m_pkthdr */ -#define M_COPYFLAGS (M_PKTHDR|M_EOR|M_BCAST|M_MCAST) - -/* mbuf types */ -#define MT_FREE 0 /* should be on free list */ -#define MT_DATA 1 /* dynamic (data) allocation */ -#define MT_HEADER 2 /* packet header */ -#define MT_SOCKET 3 /* socket structure */ -#define MT_PCB 4 /* protocol control block */ -#define MT_RTABLE 5 /* routing tables */ -#define MT_HTABLE 6 /* IMP host tables */ -#define MT_ATABLE 7 /* address resolution tables */ -#define MT_SONAME 8 /* socket name */ -#define MT_SOOPTS 10 /* socket options */ -#define MT_FTABLE 11 /* fragment reassembly header */ -#define MT_RIGHTS 12 /* access rights */ -#define MT_IFADDR 13 /* interface address */ -#define MT_CONTROL 14 /* extra-data protocol message */ -#define MT_OOBDATA 15 /* expedited data */ - -/* flags to m_get/MGET */ -#define M_DONTWAIT M_NOWAIT -#define M_WAIT M_WAITOK - -/* - * mbuf utility macros: - * - * MBUFLOCK(code) - * prevents a section of code from from being interrupted by network - * drivers. - */ -#define MBUFLOCK(code) \ - { int ms = splimp(); \ - { code } \ - splx(ms); \ - } - -/* - * mbuf allocation/deallocation macros: - * - * MGET(struct mbuf *m, int how, int type) - * allocates an mbuf and initializes it to contain internal data. - * - * MGETHDR(struct mbuf *m, int how, int type) - * allocates an mbuf and initializes it to contain a packet header - * and internal data. - */ -#define MGET(m, how, type) { \ - MALLOC((m), struct mbuf *, MSIZE, mbtypes[type], (how)); \ - if (m) { \ - (m)->m_type = (type); \ - MBUFLOCK(mbstat.m_mtypes[type]++;) \ - (m)->m_next = (struct mbuf *)NULL; \ - (m)->m_nextpkt = (struct mbuf *)NULL; \ - (m)->m_data = (m)->m_dat; \ - (m)->m_flags = 0; \ - } else \ - (m) = m_retry((how), (type)); \ -} - -#define MGETHDR(m, how, type) { \ - MALLOC((m), struct mbuf *, MSIZE, mbtypes[type], (how)); \ - if (m) { \ - (m)->m_type = (type); \ - MBUFLOCK(mbstat.m_mtypes[type]++;) \ - (m)->m_next = (struct mbuf *)NULL; \ - (m)->m_nextpkt = (struct mbuf *)NULL; \ - (m)->m_data = (m)->m_pktdat; \ - (m)->m_flags = M_PKTHDR; \ - } else { \ - (m) = m_retryhdr((how), (type)); \ - } \ -} - -#if defined(OSKIT) || defined(__REACTOS__) -#define MGET_DONT_RECURSE(m, how, type) { \ - MALLOC((m), struct mbuf *, MSIZE, mbtypes[type], (how)); \ - if (m) { \ - (m)->m_type = (type); \ - MBUFLOCK(mbstat.m_mtypes[type]++;) \ - (m)->m_next = (struct mbuf *)NULL; \ - (m)->m_nextpkt = (struct mbuf *)NULL; \ - (m)->m_data = (m)->m_dat; \ - (m)->m_flags = 0; \ - } else \ - (m) = (struct mbuf *)0; \ -} - -#define MGETHDR_DONT_RECURSE(m, how, type) { \ - MALLOC((m), struct mbuf *, MSIZE, mbtypes[type], (how)); \ - if (m) { \ - (m)->m_type = (type); \ - MBUFLOCK(mbstat.m_mtypes[type]++;) \ - (m)->m_next = (struct mbuf *)NULL; \ - (m)->m_nextpkt = (struct mbuf *)NULL; \ - (m)->m_data = (m)->m_pktdat; \ - (m)->m_flags = M_PKTHDR; \ - } else \ - (m) = (struct mbuf *)0; \ -} -#endif /* OSKIT */ - -#ifndef OSKIT -/* - * Mbuf cluster macros. - * MCLALLOC(caddr_t p, int how) allocates an mbuf cluster. - * MCLGET adds such clusters to a normal mbuf; - * the flag M_EXT is set upon success. - * MCLFREE releases a reference to a cluster allocated by MCLALLOC, - * freeing the cluster if the reference count has reached 0. - * - * Normal mbuf clusters are normally treated as character arrays - * after allocation, but use the first word of the buffer as a free list - * pointer while on the free list. - */ -union mcluster { - union mcluster *mcl_next; - char mcl_buf[MCLBYTES]; -}; - -#define MCLALLOC(p, how) \ - MBUFLOCK( \ - if (mclfree == 0) \ - (void)m_clalloc(1, (how)); \ - (p) = (caddr_t)mclfree; \ - if ((p)) { \ - ++mclrefcnt[mtocl(p)]; \ - mbstat.m_clfree--; \ - mclfree = ((union mcluster *)(p))->mcl_next; \ - } \ - ) - -#define MCLGET(m, how) \ - { MCLALLOC((m)->m_ext.ext_buf, (how)); \ - if ((m)->m_ext.ext_buf != NULL) { \ - (m)->m_data = (m)->m_ext.ext_buf; \ - (m)->m_flags |= M_EXT; \ - (m)->m_ext.ext_size = MCLBYTES; \ - } \ - } - -#define MCLFREE(p) \ - MBUFLOCK ( \ - if (--mclrefcnt[mtocl(p)] == 0) { \ - ((union mcluster *)(p))->mcl_next = mclfree; \ - mclfree = (union mcluster *)(p); \ - mbstat.m_clfree++; \ - } \ - ) -#else -#define MCLGET(m, how) \ - { (m)->m_ext.ext_bufio = oskit_bufio_create(MCLBYTES); \ - oskit_bufio_map((m)->m_ext.ext_bufio, \ - (void **)&((m)->m_ext.ext_buf), 0, MCLBYTES); \ - if ((m)->m_ext.ext_buf != NULL) { \ - (m)->m_data = (m)->m_ext.ext_buf; \ - (m)->m_flags |= M_EXT; \ - (m)->m_ext.ext_size = MCLBYTES; \ - } \ - } - -#endif /* !OSKIT */ - -/* - * MFREE(struct mbuf *m, struct mbuf *n) - * Free a single mbuf and associated external storage. - * Place the successor, if any, in n. - */ -#ifdef notyet -#define MFREE(m, n) \ - { MBUFLOCK(mbstat.m_mtypes[(m)->m_type]--;) \ - if ((m)->m_flags & M_EXT) { \ - if ((m)->m_ext.ext_free) \ - (*((m)->m_ext.ext_free))((m)->m_ext.ext_buf, \ - (m)->m_ext.ext_size); \ - else \ - MCLFREE((m)->m_ext.ext_buf); \ - } \ - (n) = (m)->m_next; \ - FREE((m), mbtypes[(m)->m_type]); \ - } -#else /* notyet */ -#ifdef OSKIT -#define MFREE(m, nn) \ - { MBUFLOCK(mbstat.m_mtypes[(m)->m_type]--;) \ - if ((m)->m_flags & M_EXT) { \ - oskit_bufio_release((m)->m_ext.ext_bufio); \ - } \ - (nn) = (m)->m_next; \ - FREE((m), mbtypes[(m)->m_type]); \ - } -#else /* !OSKIT */ -#define MFREE(m, nn) \ - { MBUFLOCK(mbstat.m_mtypes[(m)->m_type]--;) \ - if ((m)->m_flags & M_EXT) { \ - MCLFREE((m)->m_ext.ext_buf); \ - } \ - (nn) = (m)->m_next; \ - FREE((m), mbtypes[(m)->m_type]); \ - } -#endif /* OSKIT */ -#endif - -/* - * Copy mbuf pkthdr from from to to. - * from must have M_PKTHDR set, and to must be empty. - */ -#define M_COPY_PKTHDR(to, from) { \ - (to)->m_pkthdr = (from)->m_pkthdr; \ - (to)->m_flags = (from)->m_flags & M_COPYFLAGS; \ - (to)->m_data = (to)->m_pktdat; \ -} - -/* - * Set the m_data pointer of a newly-allocated mbuf (m_get/MGET) to place - * an object of the specified size at the end of the mbuf, longword aligned. - */ -#define M_ALIGN(m, len) \ - { (m)->m_data += (MLEN - (len)) &~ (sizeof(long) - 1); } -/* - * As above, for mbufs allocated with m_gethdr/MGETHDR - * or initialized by M_COPY_PKTHDR. - */ -#define MH_ALIGN(m, len) \ - { (m)->m_data += (MHLEN - (len)) &~ (sizeof(long) - 1); } - -/* - * Compute the amount of space available - * before the current start of data in an mbuf. - */ -#ifdef OSKIT -/* Be bold and strong: why shouldn't that work??? */ -#define M_LEADINGSPACE(m) \ - ((m)->m_flags & M_EXT ? (m)->m_data - (m)->m_ext.ext_buf : \ - (m)->m_flags & M_PKTHDR ? (m)->m_data - (m)->m_pktdat : \ - (m)->m_data - (m)->m_dat) -#else -#define M_LEADINGSPACE(m) \ - ((m)->m_flags & M_EXT ? /* (m)->m_data - (m)->m_ext.ext_buf */ 0 : \ - (m)->m_flags & M_PKTHDR ? (m)->m_data - (m)->m_pktdat : \ - (m)->m_data - (m)->m_dat) -#endif /* OSKIT */ - -/* - * Compute the amount of space available - * after the end of data in an mbuf. - */ -#define M_TRAILINGSPACE(m) \ - ((m)->m_flags & M_EXT ? (m)->m_ext.ext_buf + (m)->m_ext.ext_size - \ - ((m)->m_data + (m)->m_len) : \ - &(m)->m_dat[MLEN] - ((m)->m_data + (m)->m_len)) - -/* - * Arrange to prepend space of size plen to mbuf m. - * If a new mbuf must be allocated, how specifies whether to wait. - * If how is M_DONTWAIT and allocation fails, the original mbuf chain - * is freed and m is set to NULL. - */ -#define M_PREPEND(m, plen, how) { \ - if (M_LEADINGSPACE(m) >= (plen)) { \ - (m)->m_data -= (plen); \ - (m)->m_len += (plen); \ - } else \ - (m) = m_prepend((m), (plen), (how)); \ - if ((m) && (m)->m_flags & M_PKTHDR) \ - (m)->m_pkthdr.len += (plen); \ -} - -/* change mbuf to new type */ -#define MCHTYPE(m, t) { \ - MBUFLOCK(mbstat.m_mtypes[(m)->m_type]--; mbstat.m_mtypes[t]++;) \ - (m)->m_type = t;\ -} - -/* length to m_copy to copy all */ -#define M_COPYALL 1000000000 - -/* compatiblity with 4.3 */ -#define m_copy(m, o, l) m_copym((m), (o), (l), M_DONTWAIT) - -/* - * Mbuf statistics. - */ -struct mbstat { - u_long m_mbufs; /* mbufs obtained from page pool */ - u_long m_clusters; /* clusters obtained from page pool */ - u_long m_spare; /* spare field */ - u_long m_clfree; /* free clusters */ - u_long m_drops; /* times failed to find space */ - u_long m_wait; /* times waited for space */ - u_long m_drain; /* times drained protocols for space */ - u_short m_mtypes[256]; /* type specific mbuf allocations */ -}; - -#ifdef KERNEL -#ifndef OSKIT -extern struct mbuf *mbutl; /* virtual address of mclusters */ -extern char *mclrefcnt; /* cluster reference counts */ -#endif /* !OSKIT */ -struct mbstat mbstat; -#ifndef OSKIT -extern int nmbclusters; -union mcluster *mclfree; -#endif /* !OSKIT */ -int max_linkhdr; /* largest link-level header */ -int max_protohdr; /* largest protocol header */ -int max_hdr; /* largest link+protocol header */ -int max_datalen; /* MHLEN - max_hdr */ -extern int mbtypes[]; /* XXX */ - -int m_clalloc __P((int, int)); -void m_copyback __P((struct mbuf *, int, int, caddr_t)); -struct mbuf *m_retry __P((int, int)); -struct mbuf *m_retryhdr __P((int, int)); -void m_reclaim __P((void)); -struct mbuf *m_get __P((int, int)); -struct mbuf *m_gethdr __P((int, int)); -struct mbuf *m_getclr __P((int, int)); -struct mbuf *m_free __P((struct mbuf *)); -void m_freem __P((struct mbuf *)); -struct mbuf *m_prepend __P((struct mbuf *,int,int)); -struct mbuf *m_copym __P((struct mbuf *, int, int, int)); -void m_copydata __P((struct mbuf *,int,int,caddr_t)); -void m_cat __P((struct mbuf *,struct mbuf *)); -void m_adj __P((struct mbuf *,int)); -struct mbuf *m_pullup __P((struct mbuf *, int)); -struct mbuf *m_split __P((struct mbuf *,int,int)); -struct mbuf *m_devget __P((char *, int, int, struct ifnet *, - void (*copy)(struct mbuf *, caddr_t, u_int))); - -#ifdef MBTYPES -int mbtypes[] = { /* XXX */ - M_FREE, /* MT_FREE 0 should be on free list */ - M_MBUF, /* MT_DATA 1 dynamic (data) allocation */ - M_MBUF, /* MT_HEADER 2 packet header */ - M_SOCKET, /* MT_SOCKET 3 socket structure */ - M_PCB, /* MT_PCB 4 protocol control block */ - M_RTABLE, /* MT_RTABLE 5 routing tables */ - M_HTABLE, /* MT_HTABLE 6 IMP host tables */ - 0, /* MT_ATABLE 7 address resolution tables */ - M_MBUF, /* MT_SONAME 8 socket name */ - 0, /* 9 */ - M_SOOPTS, /* MT_SOOPTS 10 socket options */ - M_FTABLE, /* MT_FTABLE 11 fragment reassembly header */ - M_MBUF, /* MT_RIGHTS 12 access rights */ - M_IFADDR, /* MT_IFADDR 13 interface address */ - M_MBUF, /* MT_CONTROL 14 extra-data protocol message */ - M_MBUF, /* MT_OOBDATA 15 expedited data */ -#ifdef DATAKIT - 25, 26, 27, 28, 29, 30, 31, 32 /* datakit ugliness */ -#endif -}; -#endif -#endif - -#endif /* !_SYS_MBUF_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/param.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/param.h deleted file mode 100644 index 99f983d0189..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/param.h +++ /dev/null @@ -1,224 +0,0 @@ -/*- - * Copyright (c) 1982, 1986, 1989, 1993 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)param.h 8.2 (Berkeley) 1/21/94 - */ - -#ifndef _SYS_PARAM_H_ -#define _SYS_PARAM_H_ - -#define BSD 199306 /* System version (year & month). */ -#define BSD4_3 1 -#define BSD4_4 1 - -#ifndef NULL -#define NULL 0 -#endif - -#ifndef LOCORE -#include <sys/types.h> -#endif - -/* - * Machine-independent constants (some used in following include files). - * Redefined constants are from POSIX 1003.1 limits file. - * - * MAXCOMLEN should be >= sizeof(ac_comm) (see <acct.h>) - * MAXLOGNAME should be >= UT_NAMESIZE (see <utmp.h>) - */ -#include <sys/syslimits.h> - -#define MAXCOMLEN 16 /* max command name remembered */ -#define MAXINTERP 32 /* max interpreter file name length */ -#define MAXLOGNAME 12 /* max login name length */ -#define MAXUPRC CHILD_MAX /* max simultaneous processes */ -#define NCARGS ARG_MAX /* max bytes for an exec function */ -#define NGROUPS NGROUPS_MAX /* max number groups */ -#define NOFILE OPEN_MAX /* max open files per process */ -#define NOGROUP 65535 /* marker for empty group set member */ -#define MAXHOSTNAMELEN 256 /* max hostname size */ - -/* More types and definitions used throughout the kernel. */ -#ifdef KERNEL -#include <sys/cdefs.h> -#include <sys/errno.h> -#include <sys/time.h> -#include <sys/resource.h> -#include <sys/ucred.h> -#include <sys/uio.h> -#include <sys/rtprio.h> -#endif - -/* Signals. */ -#include <sys/signal.h> - -/* Machine type dependent parameters. */ -#include <machine/param.h> -#include <machine/limits.h> - -/* - * Priorities. Note that with 32 run queues, differences less than 4 are - * insignificant. - */ -#define PSWP 0 -#define PVM 4 -#define PINOD 8 -#define PRIBIO 16 -#define PVFS 20 -#define PZERO 22 /* No longer magic, shouldn't be here. XXX */ -#define PSOCK 24 -#define PWAIT 32 -#define PLOCK 36 -#define PPAUSE 40 -#define PUSER 50 -#define MAXPRI 127 /* Priorities range from 0 through MAXPRI. */ - -#define PRIMASK 0x0ff -#define PCATCH 0x100 /* OR'd with pri for tsleep to check signals */ - -#define NZERO 0 /* default "nice" */ - -#define NBPW sizeof(int) /* number of bytes per word (integer) */ - -#define CMASK 022 /* default file mask: S_IWGRP|S_IWOTH */ -#define NODEV (dev_t)(-1) /* non-existent device */ - -/* - * Clustering of hardware pages on machines with ridiculously small - * page sizes is done here. The paging subsystem deals with units of - * CLSIZE pte's describing NBPG (from machine/machparam.h) pages each. - */ -#define CLBYTES (CLSIZE*NBPG) -#define CLOFSET (CLSIZE*NBPG-1) /* for clusters, like PGOFSET */ -#define claligned(x) ((((int)(x))&CLOFSET)==0) -#define CLOFF CLOFSET -#define CLSHIFT (PGSHIFT+CLSIZELOG2) - -#if CLSIZE==1 -#define clbase(i) (i) -#define clrnd(i) (i) -#else -/* Give the base virtual address (first of CLSIZE). */ -#define clbase(i) ((i) &~ (CLSIZE-1)) -/* Round a number of clicks up to a whole cluster. */ -#define clrnd(i) (((i) + (CLSIZE-1)) &~ (CLSIZE-1)) -#endif - -#define CBLOCK 128 /* Clist block size, must be a power of 2. */ -#define CBQSIZE (CBLOCK/NBBY) /* Quote bytes/cblock - can do better. */ - /* Data chars/clist. */ -#define CBSIZE (CBLOCK - sizeof(struct cblock *) - CBQSIZE) -#define CROUND (CBLOCK - 1) /* Clist rounding. */ - -/* - * File system parameters and macros. - * - * The file system is made out of blocks of at most MAXBSIZE units, with - * smaller units (fragments) only in the last direct block. MAXBSIZE - * primarily determines the size of buffers in the buffer pool. It may be - * made larger without any effect on existing file systems; however making - * it smaller make make some file systems unmountable. Also, MAXBSIZE - * must be less than MAXPHYS!!! - */ -#define MAXBSIZE 16384 -#define MAXFRAG 8 - -/* - * MAXPATHLEN defines the longest permissable path length after expanding - * symbolic links. It is used to allocate a temporary buffer from the buffer - * pool in which to do the name expansion, hence should be a power of two, - * and must be less than or equal to MAXBSIZE. MAXSYMLINKS defines the - * maximum number of symbolic links that may be expanded in a path name. - * It should be set high enough to allow all legitimate uses, but halt - * infinite loops reasonably quickly. - */ -#define MAXPATHLEN PATH_MAX -#define MAXSYMLINKS 32 - -/* Bit map related macros. */ -#define setbit(a,i) ((a)[(i)/NBBY] |= 1<<((i)%NBBY)) -#define clrbit(a,i) ((a)[(i)/NBBY] &= ~(1<<((i)%NBBY))) -#define isset(a,i) ((a)[(i)/NBBY] & (1<<((i)%NBBY))) -#define isclr(a,i) (((a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0) - -/* Macros for counting and rounding. */ -#ifndef howmany -#define howmany(x, y) (((x)+((y)-1))/(y)) -#endif -#define rounddown(x, y) (((x)/(y))*(y)) -#define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) -#define powerof2(x) ((((x)-1)&(x))==0) - -/* Macros for min/max. */ -#ifndef KERNEL -#define MIN(a,b) (((a)<(b))?(a):(b)) -#define MAX(a,b) (((a)>(b))?(a):(b)) -#endif - -/* - * Constants for setting the parameters of the kernel memory allocator. - * - * 2 ** MINBUCKET is the smallest unit of memory that will be - * allocated. It must be at least large enough to hold a pointer. - * - * Units of memory less or equal to MAXALLOCSAVE will permanently - * allocate physical memory; requests for these size pieces of - * memory are quite fast. Allocations greater than MAXALLOCSAVE must - * always allocate and free physical memory; requests for these - * size allocations should be done infrequently as they will be slow. - * - * Constraints: CLBYTES <= MAXALLOCSAVE <= 2 ** (MINBUCKET + 14), and - * MAXALLOCSIZE must be a power of two. - */ -#define MINBUCKET 4 /* 4 => min allocation of 16 bytes */ -#define MAXALLOCSAVE (2 * CLBYTES) - -/* - * Scale factor for scaled integers used to count %cpu time and load avgs. - * - * The number of CPU `tick's that map to a unique `%age' can be expressed - * by the formula (1 / (2 ^ (FSHIFT - 11))). The maximum load average that - * can be calculated (assuming 32 bits) can be closely approximated using - * the formula (2 ^ (2 * (16 - FSHIFT))) for (FSHIFT < 15). - * - * For the scheduler to maintain a 1:1 mapping of CPU `tick' to `%age', - * FSHIFT must be at least 11; this gives us a maximum load avg of ~1024. - */ -#define FSHIFT 11 /* bits to right of fixed binary point */ -#define FSCALE (1<<FSHIFT) - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/proc.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/proc.h deleted file mode 100644 index e8634b7550e..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/proc.h +++ /dev/null @@ -1,336 +0,0 @@ -/* - * Copyright (c) 1996-1998 University of Utah and the Flux Group. - * All rights reserved. - * - * This file is part of the Flux OSKit. The OSKit is free software, also known - * as "open source;" you can redistribute it and/or modify it under the terms - * of the GNU General Public License (GPL), version 2, as published by the Free - * Software Foundation (FSF). To explore alternate licensing terms, contact - * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. - * - * The OSKit 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 GPL for more details. You should have - * received a copy of the GPL along with the OSKit; see the file COPYING. If - * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. - */ -/*- - * Copyright (c) 1986, 1989, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)proc.h 8.8 (Berkeley) 1/21/94 - * $\Id: proc.h,v 1.17.4.1 1996/06/04 02:45:01 davidg Exp $ - */ - -#ifndef _SYS_PROC_H_ -#define _SYS_PROC_H_ - -#include <machine/proc.h> /* Machine-dependent proc substruct. */ -#include <sys/rtprio.h> /* For struct rtprio. */ -#include <sys/select.h> /* For struct selinfo. */ -#include <sys/time.h> /* For structs itimerval, timeval. */ - -#ifdef OSKIT -#include <oskit/dev/dev.h> -#endif - -/* - * One structure allocated per session. - */ -struct session { - int s_count; /* Ref cnt; pgrps in session. */ - struct proc *s_leader; /* Session leader. */ - struct vnode *s_ttyvp; /* Vnode of controlling terminal. */ - struct tty *s_ttyp; /* Controlling terminal. */ - char s_login[MAXLOGNAME]; /* Setlogin() name. */ -}; - -/* - * One structure allocated per process group. - */ -struct pgrp { - struct pgrp *pg_hforw; /* Forward link in hash bucket. */ - struct proc *pg_mem; /* Pointer to pgrp members. */ - struct session *pg_session; /* Pointer to session. */ - pid_t pg_id; /* Pgrp id. */ - int pg_jobc; /* # procs qualifying pgrp for job control */ -}; - -/* - * Description of a process. - * - * This structure contains the information needed to manage a thread of - * control, known in UN*X as a process; it has references to substructures - * containing descriptions of things that the process uses, but may share - * with related processes. The process structure and the substructures - * are always addressible except for those marked "(PROC ONLY)" below, - * which might be addressible only on a processor on which the process - * is running. - */ -struct proc { -#ifndef OSKIT - struct proc *p_forw; /* Doubly-linked run/sleep queue. */ - struct proc *p_back; - struct proc *p_next; /* Linked list of active procs */ - struct proc **p_prev; /* and zombies. */ - - /* substructures: */ - struct pcred *p_cred; /* Process owner's identity. */ - struct filedesc *p_fd; /* Ptr to open files structure. */ - struct pstats *p_stats; /* Accounting/statistics (PROC ONLY). */ - struct plimit *p_limit; /* Process limits. */ - struct vmspace *p_vmspace; /* Address space. */ - struct sigacts *p_sigacts; /* Signal actions, state (PROC ONLY). */ - -#define p_ucred p_cred->pc_ucred -#define p_rlimit p_limit->pl_rlimit - - int p_flag; /* P_* flags. */ - char p_stat; /* S* process status. */ - - char p_pad1[3]; - - pid_t p_pid; /* Process identifier. */ - struct proc *p_hash; /* Hashed based on p_pid for kill+exit+... */ - struct proc *p_pgrpnxt; /* Pointer to next process in process group. */ - struct proc *p_pptr; /* Pointer to process structure of parent. */ - struct proc *p_osptr; /* Pointer to older sibling processes. */ - -/* The following fields are all zeroed upon creation in fork. */ -#define p_startzero p_ysptr - struct proc *p_ysptr; /* Pointer to younger siblings. */ - struct proc *p_cptr; /* Pointer to youngest living child. */ - pid_t p_oppid; /* Save parent pid during ptrace. XXX */ - int p_dupfd; /* Sideways return value from fdopen. XXX */ - - /* scheduling */ - u_int p_estcpu; /* Time averaged value of p_cpticks. */ - int p_cpticks; /* Ticks of cpu time. */ - fixpt_t p_pctcpu; /* %cpu for this process during p_swtime */ - void *p_wchan; /* Sleep address. */ - char *p_wmesg; /* Reason for sleep. */ - u_int p_swtime; /* Time swapped in or out. */ - u_int p_slptime; /* Time since last blocked. */ - - struct itimerval p_realtimer; /* Alarm timer. */ - struct timeval p_rtime; /* Real time. */ - u_quad_t p_uticks; /* Statclock hits in user mode. */ - u_quad_t p_sticks; /* Statclock hits in system mode. */ - u_quad_t p_iticks; /* Statclock hits processing intr. */ - - int p_traceflag; /* Kernel trace points. */ - struct vnode *p_tracep; /* Trace to vnode. */ - - int p_siglist; /* Signals arrived but not delivered. */ - - struct vnode *p_textvp; /* Vnode of executable. */ - - char p_lock; /* Process lock count. */ - char p_pad2[3]; /* alignment */ - long p_spare[2]; /* Pad to 256, avoid shifting eproc. XXX */ - -/* End area that is zeroed on creation. */ -#define p_endzero p_startcopy - -/* The following fields are all copied upon creation in fork. */ -#define p_startcopy p_sigmask - - sigset_t p_sigmask; /* Current signal mask. */ - sigset_t p_sigignore; /* Signals being ignored. */ - sigset_t p_sigcatch; /* Signals being caught by user. */ - - u_char p_priority; /* Process priority. */ - u_char p_usrpri; /* User-priority based on p_cpu and p_nice. */ - char p_nice; /* Process "nice" value. */ - char p_comm[MAXCOMLEN+1]; - - struct pgrp *p_pgrp; /* Pointer to process group. */ - - struct sysentvec *p_sysent; /* System call dispatch information. */ - - struct rtprio p_rtprio; /* Realtime priority. */ -/* End area that is copied on creation. */ -#define p_endcopy p_thread - int p_thread; /* Id for this "thread"; Mach glue. XXX */ - struct user *p_addr; /* Kernel virtual addr of u-area (PROC ONLY). */ - struct mdproc p_md; /* Any machine-dependent fields. */ - - u_short p_xstat; /* Exit status for wait; also stop signal. */ - u_short p_acflag; /* Accounting flags. */ - struct rusage *p_ru; /* Exit information. XXX */ -#else /* OSKIT */ - /* - * let's build our own rudimentary struct proc - */ - struct proc *p_forw; /* Doubly-linked run/sleep queue. */ - struct pcred *p_cred; /* Process owner's identity. */ - struct pstats *p_stats; /* Accounting/statistics (PROC ONLY). */ -#define p_ucred p_cred->pc_ucred - int p_flag; /* P_* flags. */ - char p_stat; /* S* process status. */ - pid_t p_pid; /* Process identifier. */ - void *p_wchan; /* Sleep address. */ - char *p_wmesg; /* Reason for sleep. */ - u_short p_acflag; /* Accounting flags. */ - - osenv_sleeprec_t p_sr; - /* - * When selrecord is invoked, this points to an object used to - * manage a set of listeners - */ - struct listener_mgr *p_sel; -#endif /* !OSKIT */ -}; - -#define p_session p_pgrp->pg_session -#define p_pgid p_pgrp->pg_id - -/* Status values. */ -#define SIDL 1 /* Process being created by fork. */ -#define SRUN 2 /* Currently runnable. */ -#define SSLEEP 3 /* Sleeping on an address. */ -#define SSTOP 4 /* Process debugging or suspension. */ -#define SZOMB 5 /* Awaiting collection by parent. */ - -/* These flags are kept in p_flags. */ -#define P_ADVLOCK 0x00001 /* Process may hold a POSIX advisory lock. */ -#define P_CONTROLT 0x00002 /* Has a controlling terminal. */ -#define P_INMEM 0x00004 /* Loaded into memory. */ -#define P_NOCLDSTOP 0x00008 /* No SIGCHLD when children stop. */ -#define P_PPWAIT 0x00010 /* Parent is waiting for child to exec/exit. */ -#define P_PROFIL 0x00020 /* Has started profiling. */ -#define P_SELECT 0x00040 /* Selecting; wakeup/waiting danger. */ -#define P_SINTR 0x00080 /* Sleep is interruptible. */ -#define P_SUGID 0x00100 /* Had set id privileges since last exec. */ -#define P_SYSTEM 0x00200 /* System proc: no sigs, stats or swapping. */ -#define P_TIMEOUT 0x00400 /* Timing out during sleep. */ -#define P_TRACED 0x00800 /* Debugged process being traced. */ -#define P_WAITED 0x01000 /* Debugging process has waited for child. */ -#define P_WEXIT 0x02000 /* Working on exiting. */ -#define P_EXEC 0x04000 /* Process called exec. */ -#define P_SWAPPING 0x40000 /* Process is being swapped. */ - -/* Should probably be changed into a hold count (They have. -DG). */ -#define P_NOSWAP 0x08000 /* Another flag to prevent swap out. */ -#define P_PHYSIO 0x10000 /* Doing physical I/O. */ - -/* Should be moved to machine-dependent areas. */ -#define P_OWEUPC 0x20000 /* Owe process an addupc() call at next ast. */ - -/* - * MOVE TO ucred.h? - * - * Shareable process credentials (always resident). This includes a reference - * to the current user credentials as well as real and saved ids that may be - * used to change ids. - */ -struct pcred { - struct ucred *pc_ucred; /* Current credentials. */ - uid_t p_ruid; /* Real user id. */ - uid_t p_svuid; /* Saved effective user id. */ - gid_t p_rgid; /* Real group id. */ - gid_t p_svgid; /* Saved effective group id. */ - int p_refcnt; /* Number of references. */ -}; - -#ifdef KERNEL -/* - * We use process IDs <= PID_MAX; PID_MAX + 1 must also fit in a pid_t, - * as it is used to represent "no process group". - */ -#define PID_MAX 30000 -#define NO_PID 30001 -#define PIDHASH(pid) ((pid) & pidhashmask) - -#define SESS_LEADER(p) ((p)->p_session->s_leader == (p)) -#define SESSHOLD(s) ((s)->s_count++) -#define SESSRELE(s) { \ - if (--(s)->s_count == 0) \ - FREE(s, M_SESSION); \ -} - -extern struct proc *pidhash[]; /* In param.c. */ -extern struct pgrp *pgrphash[]; /* In param.c. */ -extern struct proc *curproc; /* Current running proc. */ -extern struct proc proc0; /* Process slot for swapper. */ -extern int nprocs, maxproc; /* Current and max number of procs. */ -extern int maxprocperuid; /* Max procs per uid. */ -extern int pidhashmask; /* In param.c. */ - -extern volatile struct proc *allproc; /* List of active procs. */ -extern struct proc *zombproc; /* List of zombie procs. */ -extern struct proc *initproc, *pageproc; /* Process slots for init, pager. */ - -#define NQS 32 /* 32 run queues. */ -extern struct prochd qs[]; -extern struct prochd rtqs[]; -extern struct prochd idqs[]; -extern int whichqs; /* Bit mask summary of non-empty Q's. */ -struct prochd { - struct proc *ph_link; /* Linked list of running processes. */ - struct proc *ph_rlink; -}; - -int chgproccnt __P((uid_t, int)); -struct proc *pfind __P((pid_t)); /* Find process by id. */ -struct proc *zpfind __P((pid_t)); /* Find zombie process by id. */ -struct pgrp *pgfind __P((pid_t)); /* Find process group by id. */ -void mi_switch __P((void)); -void resetpriority __P((struct proc *)); -void roundrobin __P((void *)); -void schedcpu __P((void *)); -void setrunnable __P((struct proc *)); -void setrunqueue __P((struct proc *)); -void remrq __P((struct proc *)); -void cpu_switch __P((struct proc *)); -void sleep __P((void *chan, int pri)); -int tsleep __P((void *chan, int pri, char *wmesg, int timo)); -void unsleep __P((struct proc *)); -void wakeup __P((void *chan)); - -__dead void cpu_exit __P((struct proc *)) __dead2; -__dead void exit1 __P((struct proc *, int)) __dead2; -void fixjobc __P((struct proc *, struct pgrp *, int)); -int acct_process __P((struct proc *)); -int leavepgrp __P((struct proc *)); -int enterpgrp __P((struct proc *, pid_t, int)); -int trace_req __P((struct proc *)); -void cpu_wait __P((struct proc *)); -int cpu_coredump __P((struct proc *, struct vnode *, struct ucred *)); -int inferior __P((struct proc *)); -#endif /* KERNEL */ - -#endif /* !_SYS_PROC_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/protosw.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/protosw.h deleted file mode 100644 index 8d5e161e5a3..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/protosw.h +++ /dev/null @@ -1,221 +0,0 @@ -/*- - * Copyright (c) 1982, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)protosw.h 8.1 (Berkeley) 6/2/93 - */ - -#ifndef _SYS_PROTOSW_H_ -#define _SYS_PROTOSW_H_ - -/* - * Protocol switch table. - * - * Each protocol has a handle initializing one of these structures, - * which is used for protocol-protocol and system-protocol communication. - * - * A protocol is called through the pr_init entry before any other. - * Thereafter it is called every 200ms through the pr_fasttimo entry and - * every 500ms through the pr_slowtimo for timer based actions. - * The system will call the pr_drain entry if it is low on space and - * this should throw away any non-critical data. - * - * Protocols pass data between themselves as chains of mbufs using - * the pr_input and pr_output hooks. Pr_input passes data up (towards - * UNIX) and pr_output passes it down (towards the imps); control - * information passes up and down on pr_ctlinput and pr_ctloutput. - * The protocol is responsible for the space occupied by any the - * arguments to these entries and must dispose it. - * - * The userreq routine interfaces protocols to the system and is - * described below. - */ -struct protosw { - short pr_type; /* socket type used for */ - struct domain *pr_domain; /* domain protocol a member of */ - short pr_protocol; /* protocol number */ - short pr_flags; /* see below */ -/* protocol-protocol hooks */ - void (*pr_input)(); /* input to protocol (from below) */ - int (*pr_output)(); /* output to protocol (from above) */ - void (*pr_ctlinput)(); /* control input (from below) */ - int (*pr_ctloutput)(); /* control output (from above) */ -/* user-protocol hook */ - int (*pr_usrreq)(); /* user request: see list below */ -/* utility hooks */ - void (*pr_init)(); /* initialization hook */ - void (*pr_fasttimo)(); /* fast timeout (200ms) */ - void (*pr_slowtimo)(); /* slow timeout (500ms) */ - void (*pr_drain)(); /* flush any excess space possible */ - int (*pr_sysctl)(); /* sysctl for protocol */ -}; - -#define PR_SLOWHZ 2 /* 2 slow timeouts per second */ -#define PR_FASTHZ 5 /* 5 fast timeouts per second */ - -/* - * Values for pr_flags. - * PR_ADDR requires PR_ATOMIC; - * PR_ADDR and PR_CONNREQUIRED are mutually exclusive. - * PR_IMPLOPCL means that the protocol allows sendto without prior connect, - * and the protocol understands the MSG_EOF flag. The first property is - * is only relevant if PR_CONNREQUIRED is set (otherwise sendto is allowed - * anyhow). - */ -#define PR_ATOMIC 0x01 /* exchange atomic messages only */ -#define PR_ADDR 0x02 /* addresses given with messages */ -#define PR_CONNREQUIRED 0x04 /* connection required by protocol */ -#define PR_WANTRCVD 0x08 /* want PRU_RCVD calls */ -#define PR_RIGHTS 0x10 /* passes capabilities */ -#define PR_IMPLOPCL 0x20 /* implied open/close */ - -/* - * The arguments to usrreq are: - * (*protosw[].pr_usrreq)(up, req, m, nam, opt); - * where up is a (struct socket *), req is one of these requests, - * m is a optional mbuf chain containing a message, - * nam is an optional mbuf chain containing an address, - * and opt is a pointer to a socketopt structure or nil. - * The protocol is responsible for disposal of the mbuf chain m, - * the caller is responsible for any space held by nam and opt. - * A non-zero return from usrreq gives an - * UNIX error number which should be passed to higher level software. - */ -#define PRU_ATTACH 0 /* attach protocol to up */ -#define PRU_DETACH 1 /* detach protocol from up */ -#define PRU_BIND 2 /* bind socket to address */ -#define PRU_LISTEN 3 /* listen for connection */ -#define PRU_CONNECT 4 /* establish connection to peer */ -#define PRU_ACCEPT 5 /* accept connection from peer */ -#define PRU_DISCONNECT 6 /* disconnect from peer */ -#define PRU_SHUTDOWN 7 /* won't send any more data */ -#define PRU_RCVD 8 /* have taken data; more room now */ -#define PRU_SEND 9 /* send this data */ -#define PRU_ABORT 10 /* abort (fast DISCONNECT, DETATCH) */ -#define PRU_CONTROL 11 /* control operations on protocol */ -#define PRU_SENSE 12 /* return status into m */ -#define PRU_RCVOOB 13 /* retrieve out of band data */ -#define PRU_SENDOOB 14 /* send out of band data */ -#define PRU_SOCKADDR 15 /* fetch socket's address */ -#define PRU_PEERADDR 16 /* fetch peer's address */ -#define PRU_CONNECT2 17 /* connect two sockets */ -/* begin for protocols internal use */ -#define PRU_FASTTIMO 18 /* 200ms timeout */ -#define PRU_SLOWTIMO 19 /* 500ms timeout */ -#define PRU_PROTORCV 20 /* receive from below */ -#define PRU_PROTOSEND 21 /* send to below */ -#define PRU_SEND_EOF 22 /* send and close */ -#define PRU_NREQ 22 - -#ifdef PRUREQUESTS -char *prurequests[] = { - "ATTACH", "DETACH", "BIND", "LISTEN", - "CONNECT", "ACCEPT", "DISCONNECT", "SHUTDOWN", - "RCVD", "SEND", "ABORT", "CONTROL", - "SENSE", "RCVOOB", "SENDOOB", "SOCKADDR", - "PEERADDR", "CONNECT2", "FASTTIMO", "SLOWTIMO", - "PROTORCV", "PROTOSEND", - "SEND_EOF", -}; -#endif - -/* - * The arguments to the ctlinput routine are - * (*protosw[].pr_ctlinput)(cmd, sa, arg); - * where cmd is one of the commands below, sa is a pointer to a sockaddr, - * and arg is an optional caddr_t argument used within a protocol family. - */ -#define PRC_IFDOWN 0 /* interface transition */ -#define PRC_ROUTEDEAD 1 /* select new route if possible ??? */ -#define PRC_QUENCH2 3 /* DEC congestion bit says slow down */ -#define PRC_QUENCH 4 /* some one said to slow down */ -#define PRC_MSGSIZE 5 /* message size forced drop */ -#define PRC_HOSTDEAD 6 /* host appears to be down */ -#define PRC_HOSTUNREACH 7 /* deprecated (use PRC_UNREACH_HOST) */ -#define PRC_UNREACH_NET 8 /* no route to network */ -#define PRC_UNREACH_HOST 9 /* no route to host */ -#define PRC_UNREACH_PROTOCOL 10 /* dst says bad protocol */ -#define PRC_UNREACH_PORT 11 /* bad port # */ -/* was PRC_UNREACH_NEEDFRAG 12 (use PRC_MSGSIZE) */ -#define PRC_UNREACH_SRCFAIL 13 /* source route failed */ -#define PRC_REDIRECT_NET 14 /* net routing redirect */ -#define PRC_REDIRECT_HOST 15 /* host routing redirect */ -#define PRC_REDIRECT_TOSNET 16 /* redirect for type of service & net */ -#define PRC_REDIRECT_TOSHOST 17 /* redirect for tos & host */ -#define PRC_TIMXCEED_INTRANS 18 /* packet lifetime expired in transit */ -#define PRC_TIMXCEED_REASS 19 /* lifetime expired on reass q */ -#define PRC_PARAMPROB 20 /* header incorrect */ - -#define PRC_NCMDS 21 - -#define PRC_IS_REDIRECT(cmd) \ - ((cmd) >= PRC_REDIRECT_NET && (cmd) <= PRC_REDIRECT_TOSHOST) - -#ifdef PRCREQUESTS -char *prcrequests[] = { - "IFDOWN", "ROUTEDEAD", "#2", "DEC-BIT-QUENCH2", - "QUENCH", "MSGSIZE", "HOSTDEAD", "#7", - "NET-UNREACH", "HOST-UNREACH", "PROTO-UNREACH", "PORT-UNREACH", - "#12", "SRCFAIL-UNREACH", "NET-REDIRECT", "HOST-REDIRECT", - "TOSNET-REDIRECT", "TOSHOST-REDIRECT", "TX-INTRANS", "TX-REASS", - "PARAMPROB" -}; -#endif - -/* - * The arguments to ctloutput are: - * (*protosw[].pr_ctloutput)(req, so, level, optname, optval); - * req is one of the actions listed below, so is a (struct socket *), - * level is an indication of which protocol layer the option is intended. - * optname is a protocol dependent socket option request, - * optval is a pointer to a mbuf-chain pointer, for value-return results. - * The protocol is responsible for disposal of the mbuf chain *optval - * if supplied, - * the caller is responsible for any space held by *optval, when returned. - * A non-zero return from usrreq gives an - * UNIX error number which should be passed to higher level software. - */ -#define PRCO_GETOPT 0 -#define PRCO_SETOPT 1 - -#define PRCO_NCMDS 2 - -#ifdef PRCOREQUESTS -char *prcorequests[] = { - "GETOPT", "SETOPT", -}; -#endif - -#ifdef KERNEL -extern struct protosw *pffindproto(), *pffindtype(); -#endif - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/queue.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/queue.h deleted file mode 100644 index fee9536f9e6..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/queue.h +++ /dev/null @@ -1,391 +0,0 @@ -/* - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)queue.h 8.5 (Berkeley) 8/20/94 - */ - -#ifndef _SYS_QUEUE_H_ -#define _SYS_QUEUE_H_ - -/* - * This file defines five types of data structures: singly-linked lists, - * slingly-linked tail queues, lists, tail queues, and circular queues. - * - * A singly-linked list is headed by a single forward pointer. The elements - * are singly linked for minimum space and pointer manipulation overhead at - * the expense of O(n) removal for arbitrary elements. New elements can be - * added to the list after an existing element or at the head of the list. - * Elements being removed from the head of the list should use the explicit - * macro for this purpose for optimum efficiency. A singly-linked list may - * only be traversed in the forward direction. Singly-linked lists are ideal - * for applications with large datasets and few or no removals or for - * implementing a LIFO queue. - * - * A singly-linked tail queue is headed by a pair of pointers, one to the - * head of the list and the other to the tail of the list. The elements are - * singly linked for minimum space and pointer manipulation overhead at the - * expense of O(n) removal for arbitrary elements. New elements can be added - * to the list after an existing element, at the head of the list, or at the - * end of the list. Elements being removed from the head of the tail queue - * should use the explicit macro for this purpose for optimum efficiency. - * A singly-linked tail queue may only be traversed in the forward direction. - * Singly-linked tail queues are ideal for applications with large datasets - * and few or no removals or for implementing a FIFO queue. - * - * A list is headed by a single forward pointer (or an array of forward - * pointers for a hash table header). The elements are doubly linked - * so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before - * or after an existing element or at the head of the list. A list - * may only be traversed in the forward direction. - * - * A tail queue is headed by a pair of pointers, one to the head of the - * list and the other to the tail of the list. The elements are doubly - * linked so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before or - * after an existing element, at the head of the list, or at the end of - * the list. A tail queue may only be traversed in the forward direction. - * - * A circle queue is headed by a pair of pointers, one to the head of the - * list and the other to the tail of the list. The elements are doubly - * linked so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before or after - * an existing element, at the head of the list, or at the end of the list. - * A circle queue may be traversed in either direction, but has a more - * complex end of list detection. - * - * For details on the use of these macros, see the queue(3) manual page. - */ - -#undef SLIST_HEAD -#undef SLIST_ENTRY -#undef SLIST_INIT - -/* - * Singly-linked List definitions. - */ -#define SLIST_HEAD(name, type) \ -struct name { \ - struct type *slh_first; /* first element */ \ -} - -#define SLIST_ENTRY(type) \ -struct { \ - struct type *sle_next; /* next element */ \ -} - -/* - * Singly-linked List functions. - */ -#define SLIST_INIT(head) { \ - (head)->slh_first = NULL; \ -} - -#define SLIST_INSERT_AFTER(slistelm, elm, field) { \ - (elm)->field.sle_next = (slistelm)->field.sle_next; \ - (slistelm)->field.sle_next = (elm); \ -} - -#define SLIST_INSERT_HEAD(head, elm, field) { \ - (elm)->field.sle_next = (head)->slh_first; \ - (head)->slh_first = (elm); \ -} - -#define SLIST_REMOVE_HEAD(head, field) { \ - (head)->slh_first = (head)->slh_first->field.sle_next; \ -} - -#define SLIST_REMOVE(head, elm, type, field) { \ - if ((head)->slh_first == (elm)) { \ - SLIST_REMOVE_HEAD((head), field); \ - } \ - else { \ - struct type *curelm = (head)->slh_first; \ - while( curelm->field.sle_next != (elm) ) \ - curelm = curelm->field.sle_next; \ - curelm->field.sle_next = \ - curelm->field.sle_next->field.sle_next; \ - } \ -} - -/* - * Singly-linked Tail queue definitions. - */ -#define STAILQ_HEAD(name, type) \ -struct name { \ - struct type *stqh_first;/* first element */ \ - struct type **stqh_last;/* addr of last next element */ \ -} - -#define STAILQ_ENTRY(type) \ -struct { \ - struct type *stqe_next; /* next element */ \ -} - -/* - * Singly-linked Tail queue functions. - */ -#define STAILQ_INIT(head) { \ - (head)->stqh_first = NULL; \ - (head)->stqh_last = &(head)->stqh_first; \ -} - -#define STAILQ_INSERT_HEAD(head, elm, field) { \ - if (((elm)->field.stqe_next = (head)->stqh_first) == NULL) \ - (head)->stqh_last = &(elm)->field.stqe_next; \ - (head)->stqh_first = (elm); \ -} - -#define STAILQ_INSERT_TAIL(head, elm, field) { \ - (elm)->field.stqe_next = NULL; \ - *(head)->stqh_last = (elm); \ - (head)->stqh_last = &(elm)->field.stqe_next; \ -} - -#define STAILQ_INSERT_AFTER(head, tqelm, elm, field) { \ - if (((elm)->field.stqe_next = (tqelm)->field.stqe_next) == NULL)\ - (head)->stqh_last = &(elm)->field.stqe_next; \ - (tqelm)->field.stqe_next = (elm); \ -} - -#define STAILQ_REMOVE_HEAD(head, field) { \ - if (((head)->stqh_first = \ - (head)->stqh_first->field.stqe_next) == NULL) \ - (head)->stqh_last = &(head)->stqh_first; \ -} - -#define STAILQ_REMOVE(head, elm, type, field) { \ - if ((head)->stqh_first == (elm)) { \ - STAILQ_REMOVE_HEAD(head, field); \ - } \ - else { \ - struct type *curelm = (head)->stqh_first; \ - while( curelm->field.stqe_next != (elm) ) \ - curelm = curelm->field.stqe_next; \ - if((curelm->field.stqe_next = \ - curelm->field.stqe_next->field.stqe_next) == NULL) \ - (head)->stqh_last = &(curelm)->field.stqe_next; \ - } \ -} - -/* - * List definitions. - */ -#define LIST_HEAD(name, type) \ -struct name { \ - struct type *lh_first; /* first element */ \ -} - -#define LIST_ENTRY(type) \ -struct { \ - struct type *le_next; /* next element */ \ - struct type **le_prev; /* address of previous next element */ \ -} - -/* - * List functions. - */ -#define LIST_INIT(head) { \ - (head)->lh_first = NULL; \ -} - -#define LIST_INSERT_AFTER(listelm, elm, field) { \ - if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \ - (listelm)->field.le_next->field.le_prev = \ - &(elm)->field.le_next; \ - (listelm)->field.le_next = (elm); \ - (elm)->field.le_prev = &(listelm)->field.le_next; \ -} - -#define LIST_INSERT_BEFORE(listelm, elm, field) { \ - (elm)->field.le_prev = (listelm)->field.le_prev; \ - (elm)->field.le_next = (listelm); \ - *(listelm)->field.le_prev = (elm); \ - (listelm)->field.le_prev = &(elm)->field.le_next; \ -} - -#define LIST_INSERT_HEAD(head, elm, field) { \ - if (((elm)->field.le_next = (head)->lh_first) != NULL) \ - (head)->lh_first->field.le_prev = &(elm)->field.le_next;\ - (head)->lh_first = (elm); \ - (elm)->field.le_prev = &(head)->lh_first; \ -} - -#define LIST_REMOVE(elm, field) { \ - if ((elm)->field.le_next != NULL) \ - (elm)->field.le_next->field.le_prev = \ - (elm)->field.le_prev; \ - *(elm)->field.le_prev = (elm)->field.le_next; \ -} - -/* - * Tail queue definitions. - */ -#define TAILQ_HEAD(name, type) \ -struct name { \ - struct type *tqh_first; /* first element */ \ - struct type **tqh_last; /* addr of last next element */ \ -} - -#define TAILQ_ENTRY(type) \ -struct { \ - struct type *tqe_next; /* next element */ \ - struct type **tqe_prev; /* address of previous next element */ \ -} - -/* - * Tail queue functions. - */ -#define TAILQ_INIT(head) { \ - (head)->tqh_first = NULL; \ - (head)->tqh_last = &(head)->tqh_first; \ -} - -#define TAILQ_INSERT_HEAD(head, elm, field) { \ - if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \ - (head)->tqh_first->field.tqe_prev = \ - &(elm)->field.tqe_next; \ - else \ - (head)->tqh_last = &(elm)->field.tqe_next; \ - (head)->tqh_first = (elm); \ - (elm)->field.tqe_prev = &(head)->tqh_first; \ -} - -#define TAILQ_INSERT_TAIL(head, elm, field) { \ - (elm)->field.tqe_next = NULL; \ - (elm)->field.tqe_prev = (head)->tqh_last; \ - *(head)->tqh_last = (elm); \ - (head)->tqh_last = &(elm)->field.tqe_next; \ -} - -#define TAILQ_INSERT_AFTER(head, listelm, elm, field) { \ - if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\ - (elm)->field.tqe_next->field.tqe_prev = \ - &(elm)->field.tqe_next; \ - else \ - (head)->tqh_last = &(elm)->field.tqe_next; \ - (listelm)->field.tqe_next = (elm); \ - (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ -} - -#define TAILQ_INSERT_BEFORE(listelm, elm, field) { \ - (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ - (elm)->field.tqe_next = (listelm); \ - *(listelm)->field.tqe_prev = (elm); \ - (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ -} - -#define TAILQ_REMOVE(head, elm, field) { \ - if (((elm)->field.tqe_next) != NULL) \ - (elm)->field.tqe_next->field.tqe_prev = \ - (elm)->field.tqe_prev; \ - else \ - (head)->tqh_last = (elm)->field.tqe_prev; \ - *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ -} - -/* - * Circular queue definitions. - */ -#define CIRCLEQ_HEAD(name, type) \ -struct name { \ - struct type *cqh_first; /* first element */ \ - struct type *cqh_last; /* last element */ \ -} - -#define CIRCLEQ_ENTRY(type) \ -struct { \ - struct type *cqe_next; /* next element */ \ - struct type *cqe_prev; /* previous element */ \ -} - -/* - * Circular queue functions. - */ -#define CIRCLEQ_INIT(head) { \ - (head)->cqh_first = (void *)(head); \ - (head)->cqh_last = (void *)(head); \ -} - -#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) { \ - (elm)->field.cqe_next = (listelm)->field.cqe_next; \ - (elm)->field.cqe_prev = (listelm); \ - if ((listelm)->field.cqe_next == (void *)(head)) \ - (head)->cqh_last = (elm); \ - else \ - (listelm)->field.cqe_next->field.cqe_prev = (elm); \ - (listelm)->field.cqe_next = (elm); \ -} - -#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) { \ - (elm)->field.cqe_next = (listelm); \ - (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \ - if ((listelm)->field.cqe_prev == (void *)(head)) \ - (head)->cqh_first = (elm); \ - else \ - (listelm)->field.cqe_prev->field.cqe_next = (elm); \ - (listelm)->field.cqe_prev = (elm); \ -} - -#define CIRCLEQ_INSERT_HEAD(head, elm, field) { \ - (elm)->field.cqe_next = (head)->cqh_first; \ - (elm)->field.cqe_prev = (void *)(head); \ - if ((head)->cqh_last == (void *)(head)) \ - (head)->cqh_last = (elm); \ - else \ - (head)->cqh_first->field.cqe_prev = (elm); \ - (head)->cqh_first = (elm); \ -} - -#define CIRCLEQ_INSERT_TAIL(head, elm, field) { \ - (elm)->field.cqe_next = (void *)(head); \ - (elm)->field.cqe_prev = (head)->cqh_last; \ - if ((head)->cqh_first == (void *)(head)) \ - (head)->cqh_first = (elm); \ - else \ - (head)->cqh_last->field.cqe_next = (elm); \ - (head)->cqh_last = (elm); \ -} - -#define CIRCLEQ_REMOVE(head, elm, field) { \ - if ((elm)->field.cqe_next == (void *)(head)) \ - (head)->cqh_last = (elm)->field.cqe_prev; \ - else \ - (elm)->field.cqe_next->field.cqe_prev = \ - (elm)->field.cqe_prev; \ - if ((elm)->field.cqe_prev == (void *)(head)) \ - (head)->cqh_first = (elm)->field.cqe_next; \ - else \ - (elm)->field.cqe_prev->field.cqe_next = \ - (elm)->field.cqe_next; \ -} -#endif /* !_SYS_QUEUE_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/resource.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/resource.h deleted file mode 100644 index cff763c56e5..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/resource.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)resource.h 8.2 (Berkeley) 1/4/94 - */ - -#ifndef _SYS_RESOURCE_H_ -#define _SYS_RESOURCE_H_ - -/* - * Process priority specifications to get/setpriority. - */ -#define PRIO_MIN -20 -#define PRIO_MAX 20 - -#define PRIO_PROCESS 0 -#define PRIO_PGRP 1 -#define PRIO_USER 2 - -/* - * Resource utilization information. - */ - -#define RUSAGE_SELF 0 -#define RUSAGE_CHILDREN -1 - -struct rusage { - struct timeval ru_utime; /* user time used */ - struct timeval ru_stime; /* system time used */ - long ru_maxrss; /* max resident set size */ -#define ru_first ru_ixrss - long ru_ixrss; /* integral shared memory size */ - long ru_idrss; /* integral unshared data " */ - long ru_isrss; /* integral unshared stack " */ - long ru_minflt; /* page reclaims */ - long ru_majflt; /* page faults */ - long ru_nswap; /* swaps */ - long ru_inblock; /* block input operations */ - long ru_oublock; /* block output operations */ - long ru_msgsnd; /* messages sent */ - long ru_msgrcv; /* messages received */ - long ru_nsignals; /* signals received */ - long ru_nvcsw; /* voluntary context switches */ - long ru_nivcsw; /* involuntary " */ -#define ru_last ru_nivcsw -}; - -/* - * Resource limits - */ -#define RLIMIT_CPU 0 /* cpu time in milliseconds */ -#define RLIMIT_FSIZE 1 /* maximum file size */ -#define RLIMIT_DATA 2 /* data size */ -#define RLIMIT_STACK 3 /* stack size */ -#define RLIMIT_CORE 4 /* core file size */ -#define RLIMIT_RSS 5 /* resident set size */ -#define RLIMIT_MEMLOCK 6 /* locked-in-memory address space */ -#define RLIMIT_NPROC 7 /* number of processes */ -#define RLIMIT_NOFILE 8 /* number of open files */ - -#define RLIM_NLIMITS 9 /* number of resource limits */ - -#include <sys/types.h> /* XXX for quad_t */ - -#define RLIM_INFINITY (((u_quad_t)1 << 63) - 1) - -struct orlimit { - long rlim_cur; /* current (soft) limit */ - long rlim_max; /* maximum value for rlim_cur */ -}; - -struct rlimit { - quad_t rlim_cur; /* current (soft) limit */ - quad_t rlim_max; /* maximum value for rlim_cur */ -}; - -/* Load average structure. */ -struct loadavg { - fixpt_t ldavg[3]; - long fscale; -}; - -#ifdef KERNEL -extern struct loadavg averunnable; - -#else -#include <sys/cdefs.h> - -__BEGIN_DECLS -int getpriority __P((int, int)); -int getrlimit __P((int, struct rlimit *)); -int getrusage __P((int, struct rusage *)); -int setpriority __P((int, int, int)); -int setrlimit __P((int, const struct rlimit *)); -__END_DECLS - -#endif /* KERNEL */ -#endif /* !_SYS_RESOURCE_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/resourcevar.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/resourcevar.h deleted file mode 100644 index 1dd0dc55418..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/resourcevar.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)resourcevar.h 8.3 (Berkeley) 2/22/94 - */ - -#ifndef _SYS_RESOURCEVAR_H_ -#define _SYS_RESOURCEVAR_H_ - -/* - * Kernel per-process accounting / statistics - * (not necessarily resident except when running). - */ -struct pstats { -#define pstat_startzero p_ru - struct rusage p_ru; /* stats for this proc */ - struct rusage p_cru; /* sum of stats for reaped children */ -#define pstat_endzero pstat_startcopy - -#define pstat_startcopy p_timer - struct itimerval p_timer[3]; /* virtual-time timers */ - - struct uprof { /* profile arguments */ - caddr_t pr_base; /* buffer base */ - u_long pr_size; /* buffer size */ - u_long pr_off; /* pc offset */ - u_long pr_scale; /* pc scaling */ - u_long pr_addr; /* temp storage for addr until AST */ - u_long pr_ticks; /* temp storage for ticks until AST */ - } p_prof; -#define pstat_endcopy p_start - struct timeval p_start; /* starting time */ -}; - -/* - * Kernel shareable process resource limits. Because this structure - * is moderately large but changes infrequently, it is normally - * shared copy-on-write after forks. If a group of processes - * ("threads") share modifications, the PL_SHAREMOD flag is set, - * and a copy must be made for the child of a new fork that isn't - * sharing modifications to the limits. - */ -struct plimit { - struct rlimit pl_rlimit[RLIM_NLIMITS]; -#define PL_SHAREMOD 0x01 /* modifications are shared */ - int p_lflags; - int p_refcnt; /* number of references */ -}; - -/* add user profiling from AST */ -#define ADDUPROF(p) \ - addupc_task(p, \ - (p)->p_stats->p_prof.pr_addr, (p)->p_stats->p_prof.pr_ticks) - -#ifdef KERNEL -int addupc __P((int pc, struct uprof *up, int ticks)); -void addupc_intr __P((struct proc *p, u_long pc, u_int ticks)); -void addupc_task __P((struct proc *p, u_long pc, u_int ticks)); -void calcru __P((struct proc *p, struct timeval *up, struct timeval *sp, - struct timeval *ip)); -int fuswintr __P((void *base)); -struct plimit - *limcopy __P((struct plimit *lim)); -void ruadd __P((struct rusage *ru, struct rusage *ru2)); -int suswintr __P((void *base, int word)); -#endif - -#endif /* !_SYS_RESOURCEVAR_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/rtprio.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/rtprio.h deleted file mode 100644 index 9719930d324..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/rtprio.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 1994, Henrik Vestergaard Draboel - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by (name). - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#ifndef _SYS_RTPRIO_H_ -#define _SYS_RTPRIO_H_ - -/* - * Process realtime-priority specifications to rtprio. - */ - -/* priority types */ -#define RTP_PRIO_REALTIME 0 -#define RTP_PRIO_NORMAL 1 -#define RTP_PRIO_IDLE 2 - -/* priority range */ -#define RTP_PRIO_MIN 0 /* Highest priority */ -#define RTP_PRIO_MAX 31 /* Lowest priority */ - -/* - * rtprio() syscall functions - */ -#define RTP_LOOKUP 0 -#define RTP_SET 1 - -#ifndef LOCORE -struct rtprio { - u_short type; - u_short prio; -}; -#endif - -#ifndef KERNEL -#include <sys/cdefs.h> - -__BEGIN_DECLS -int rtprio __P((int, pid_t, struct rtprio *)); -__END_DECLS -#endif /* !KERNEL */ -#endif /* !_SYS_RTPRIO_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/select.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/select.h deleted file mode 100644 index bbb19ffd9a7..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/select.h +++ /dev/null @@ -1,63 +0,0 @@ -/*- - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)select.h 8.2 (Berkeley) 1/4/94 - */ - -#ifndef _SYS_SELECT_H_ -#define _SYS_SELECT_H_ - -#if defined(OSKIT) -struct listener_mgr; -#endif - -/* - * Used to maintain information about processes that wish to be - * notified when I/O becomes possible. - */ -struct selinfo { -#if defined(OSKIT) - struct listener_mgr *si_sel; -#endif /* OSKIT */ - pid_t si_pid; /* process to be notified */ - short si_flags; /* see below */ -}; -#define SI_COLL 0x0001 /* collision occurred */ - -#ifdef KERNEL -struct proc; - -void selrecord __P((struct proc *selector, struct selinfo *)); -void selwakeup __P((struct selinfo *)); -#endif - -#endif /* !_SYS_SELECT_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/signal.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/signal.h deleted file mode 100644 index ad025895730..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/signal.h +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1989, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)signal.h 8.2 (Berkeley) 1/21/94 - */ - -#ifndef _SYS_SIGNAL_H_ -#define _SYS_SIGNAL_H_ - -#define NSIG 32 /* counting 0; could be 33 (mask is 1-32) */ - -#ifndef _ANSI_SOURCE -#include <machine/signal.h> /* sigcontext; codes for SIGILL, SIGFPE */ -#endif - -#define SIGHUP 1 /* hangup */ -#define SIGINT 2 /* interrupt */ -#define SIGQUIT 3 /* quit */ -#define SIGILL 4 /* illegal instruction (not reset when caught) */ -#ifndef _POSIX_SOURCE -#define SIGTRAP 5 /* trace trap (not reset when caught) */ -#endif -#define SIGABRT 6 /* abort() */ -#ifndef _POSIX_SOURCE -#define SIGIOT SIGABRT /* compatibility */ -#define SIGEMT 7 /* EMT instruction */ -#endif -#define SIGFPE 8 /* floating point exception */ -#define SIGKILL 9 /* kill (cannot be caught or ignored) */ -#ifndef _POSIX_SOURCE -#define SIGBUS 10 /* bus error */ -#endif -#define SIGSEGV 11 /* segmentation violation */ -#ifndef _POSIX_SOURCE -#define SIGSYS 12 /* bad argument to system call */ -#endif -#define SIGPIPE 13 /* write on a pipe with no one to read it */ -#define SIGALRM 14 /* alarm clock */ -#define SIGTERM 15 /* software termination signal from kill */ -#ifndef _POSIX_SOURCE -#define SIGURG 16 /* urgent condition on IO channel */ -#endif -#define SIGSTOP 17 /* sendable stop signal not from tty */ -#define SIGTSTP 18 /* stop signal from tty */ -#define SIGCONT 19 /* continue a stopped process */ -#define SIGCHLD 20 /* to parent on child stop or exit */ -#define SIGTTIN 21 /* to readers pgrp upon background tty read */ -#define SIGTTOU 22 /* like TTIN for output if (tp->t_local<OSTOP) */ -#ifndef _POSIX_SOURCE -#define SIGIO 23 /* input/output possible signal */ -#define SIGXCPU 24 /* exceeded CPU time limit */ -#define SIGXFSZ 25 /* exceeded file size limit */ -#define SIGVTALRM 26 /* virtual time alarm */ -#define SIGPROF 27 /* profiling time alarm */ -#define SIGWINCH 28 /* window size changes */ -#define SIGINFO 29 /* information request */ -#endif -#define SIGUSR1 30 /* user defined signal 1 */ -#define SIGUSR2 31 /* user defined signal 2 */ - -#if defined(_ANSI_SOURCE) || defined(__cplusplus) -/* - * Language spec sez we must list exactly one parameter, even though we - * actually supply three. Ugh! - */ -#define SIG_DFL (void (*)(int))0 -#define SIG_IGN (void (*)(int))1 -#define SIG_ERR (void (*)(int))-1 -#else -#define SIG_DFL (void (*)())0 -#define SIG_IGN (void (*)())1 -#define SIG_ERR (void (*)())-1 -#endif - -#ifndef _ANSI_SOURCE -typedef unsigned int sigset_t; - -/* - * Signal vector "template" used in sigaction call. - */ -struct sigaction { - void (*sa_handler)(); /* signal handler */ - sigset_t sa_mask; /* signal mask to apply */ - int sa_flags; /* see signal options below */ -}; -#ifndef _POSIX_SOURCE -#define SA_ONSTACK 0x0001 /* take signal on signal stack */ -#define SA_RESTART 0x0002 /* restart system on signal return */ -#define SA_DISABLE 0x0004 /* disable taking signals on alternate stack */ -#ifdef COMPAT_SUNOS -#define SA_USERTRAMP 0x0100 /* do not bounce off kernel's sigtramp */ -#endif -#endif -#define SA_NOCLDSTOP 0x0008 /* do not generate SIGCHLD on child stop */ - -/* - * Flags for sigprocmask: - */ -#define SIG_BLOCK 1 /* block specified signal set */ -#define SIG_UNBLOCK 2 /* unblock specified signal set */ -#define SIG_SETMASK 3 /* set specified signal set */ - -#ifndef _POSIX_SOURCE -#ifndef KERNEL -#include <sys/cdefs.h> -#endif -typedef void (*sig_t) __P((int)); /* type of signal function */ - -/* - * Structure used in sigaltstack call. - */ -struct sigaltstack { - char *ss_sp; /* signal stack base */ - int ss_size; /* signal stack length */ - int ss_flags; /* SA_DISABLE and/or SA_ONSTACK */ -}; -#define MINSIGSTKSZ 8192 /* minimum allowable stack */ -#define SIGSTKSZ (MINSIGSTKSZ + 32768) /* recommended stack size */ - -/* - * 4.3 compatibility: - * Signal vector "template" used in sigvec call. - */ -struct sigvec { - void (*sv_handler)(); /* signal handler */ - int sv_mask; /* signal mask to apply */ - int sv_flags; /* see signal options below */ -}; - -#define SV_ONSTACK SA_ONSTACK -#define SV_INTERRUPT SA_RESTART /* same bit, opposite sense */ -#define sv_onstack sv_flags /* isn't compatibility wonderful! */ - -/* - * Structure used in sigstack call. - */ -struct sigstack { - char *ss_sp; /* signal stack pointer */ - int ss_onstack; /* current status */ -}; - -/* - * Macro for converting signal number to a mask suitable for - * sigblock(). - */ -#define sigmask(m) (1 << ((m)-1)) - -#define BADSIG SIG_ERR - -#endif /* !_POSIX_SOURCE */ -#endif /* !_ANSI_SOURCE */ - -/* - * For historical reasons; programs expect signal's return value to be - * defined by <sys/signal.h>. - */ -__BEGIN_DECLS -void (*signal __P((int, void (*) __P((int))))) __P((int)); -__END_DECLS -#endif /* !_SYS_SIGNAL_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/signalvar.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/signalvar.h deleted file mode 100644 index 2c5394d96f4..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/signalvar.h +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)signalvar.h 8.3 (Berkeley) 1/4/94 - */ - -#ifndef _SYS_SIGNALVAR_H_ /* tmp for user.h */ -#define _SYS_SIGNALVAR_H_ - -/* - * Kernel signal definitions and data structures, - * not exported to user programs. - */ - -/* - * Process signal actions and state, needed only within the process - * (not necessarily resident). - */ -struct sigacts { - sig_t ps_sigact[NSIG]; /* disposition of signals */ - sigset_t ps_catchmask[NSIG]; /* signals to be blocked */ - sigset_t ps_sigonstack; /* signals to take on sigstack */ - sigset_t ps_sigintr; /* signals that interrupt syscalls */ - sigset_t ps_oldmask; /* saved mask from before sigpause */ - int ps_flags; /* signal flags, below */ - struct sigaltstack ps_sigstk; /* sp & on stack state variable */ - int ps_sig; /* for core dump/debugger XXX */ - int ps_code; /* for core dump/debugger XXX */ - int ps_addr; /* for core dump/debugger XXX */ - sigset_t ps_usertramp; /* SunOS compat; libc sigtramp XXX */ -}; - -/* signal flags */ -#define SAS_OLDMASK 0x01 /* need to restore mask before pause */ -#define SAS_ALTSTACK 0x02 /* have alternate signal stack */ - -/* additional signal action values, used only temporarily/internally */ -#define SIG_CATCH (void (*)())2 -#define SIG_HOLD (void (*)())3 - -/* - * get signal action for process and signal; currently only for current process - */ -#define SIGACTION(p, sig) (p->p_sigacts->ps_sigact[(sig)]) - -/* - * Determine signal that should be delivered to process p, the current - * process, 0 if none. If there is a pending stop signal with default - * action, the process stops in issig(). - */ -#define CURSIG(p) \ - (((p)->p_siglist == 0 || \ - (((p)->p_flag & P_TRACED) == 0 && \ - ((p)->p_siglist & ~(p)->p_sigmask) == 0)) ? \ - 0 : issignal(p)) - -/* - * Clear a pending signal from a process. - */ -#define CLRSIG(p, sig) { (p)->p_siglist &= ~sigmask(sig); } - -/* - * Signal properties and actions. - * The array below categorizes the signals and their default actions - * according to the following properties: - */ -#define SA_KILL 0x01 /* terminates process by default */ -#define SA_CORE 0x02 /* ditto and coredumps */ -#define SA_STOP 0x04 /* suspend process */ -#define SA_TTYSTOP 0x08 /* ditto, from tty */ -#define SA_IGNORE 0x10 /* ignore by default */ -#define SA_CONT 0x20 /* continue if suspended */ -#define SA_CANTMASK 0x40 /* non-maskable, catchable */ - -#ifdef SIGPROP -int sigprop[NSIG + 1] = { - 0, /* unused */ - SA_KILL, /* SIGHUP */ - SA_KILL, /* SIGINT */ - SA_KILL|SA_CORE, /* SIGQUIT */ - SA_KILL|SA_CORE, /* SIGILL */ - SA_KILL|SA_CORE, /* SIGTRAP */ - SA_KILL|SA_CORE, /* SIGABRT */ - SA_KILL|SA_CORE, /* SIGEMT */ - SA_KILL|SA_CORE, /* SIGFPE */ - SA_KILL, /* SIGKILL */ - SA_KILL|SA_CORE, /* SIGBUS */ - SA_KILL|SA_CORE, /* SIGSEGV */ - SA_KILL|SA_CORE, /* SIGSYS */ - SA_KILL, /* SIGPIPE */ - SA_KILL, /* SIGALRM */ - SA_KILL, /* SIGTERM */ - SA_IGNORE, /* SIGURG */ - SA_STOP, /* SIGSTOP */ - SA_STOP|SA_TTYSTOP, /* SIGTSTP */ - SA_IGNORE|SA_CONT, /* SIGCONT */ - SA_IGNORE, /* SIGCHLD */ - SA_STOP|SA_TTYSTOP, /* SIGTTIN */ - SA_STOP|SA_TTYSTOP, /* SIGTTOU */ - SA_IGNORE, /* SIGIO */ - SA_KILL, /* SIGXCPU */ - SA_KILL, /* SIGXFSZ */ - SA_KILL, /* SIGVTALRM */ - SA_KILL, /* SIGPROF */ - SA_IGNORE, /* SIGWINCH */ - SA_IGNORE, /* SIGINFO */ - SA_KILL, /* SIGUSR1 */ - SA_KILL, /* SIGUSR2 */ -}; - -#define contsigmask (sigmask(SIGCONT)) -#define stopsigmask (sigmask(SIGSTOP) | sigmask(SIGTSTP) | \ - sigmask(SIGTTIN) | sigmask(SIGTTOU)) - -#endif /* SIGPROP */ - -#define sigcantmask (sigmask(SIGKILL) | sigmask(SIGSTOP)) - -#ifdef KERNEL -/* - * Machine-independent functions: - */ -int coredump __P((struct proc *p)); -void execsigs __P((struct proc *p)); -void gsignal __P((int pgid, int sig)); -int issig __P((struct proc *p)); -int issignal __P((struct proc *p)); -void killproc __P((struct proc *, char *)); -void pgsignal __P((struct pgrp *pgrp, int sig, int checkctty)); -void postsig __P((int sig)); -void psignal __P((struct proc *p, int sig)); -void sigexit __P((struct proc *, int)); -void siginit __P((struct proc *p)); -void trapsignal __P((struct proc *p, int sig, unsigned code)); - -/* - * Machine-dependent functions: - */ -void sendsig __P((sig_t action, int sig, int returnmask, unsigned code)); -#endif /* KERNEL */ -#endif /* !_SYS_SIGNALVAR_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/socket.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/socket.h deleted file mode 100644 index 63183ec87e3..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/socket.h +++ /dev/null @@ -1,357 +0,0 @@ -/* - * Copyright (c) 1982, 1985, 1986, 1988, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)socket.h 8.4 (Berkeley) 2/21/94 - */ - -#ifndef _OSK_SYS_SOCKET_H_ -#define _OSK_SYS_SOCKET_H_ - -/* - * Definitions related to sockets: types, address families, options. - */ - -/* - * Types - */ -#define SOCK_STREAM 1 /* stream socket */ -#define SOCK_DGRAM 2 /* datagram socket */ -#define SOCK_RAW 3 /* raw-protocol interface */ -#define SOCK_RDM 4 /* reliably-delivered message */ -#define SOCK_SEQPACKET 5 /* sequenced packet stream */ - -/* - * Option flags per-socket. - */ -#define SO_DEBUG 0x0001 /* turn on debugging info recording */ -#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */ -#define SO_REUSEADDR 0x0004 /* allow local address reuse */ -#define SO_KEEPALIVE 0x0008 /* keep connections alive */ -#define SO_DONTROUTE 0x0010 /* just use interface addresses */ -#define SO_BROADCAST 0x0020 /* permit sending of broadcast msgs */ -#define SO_USELOOPBACK 0x0040 /* bypass hardware when possible */ -#define SO_LINGER 0x0080 /* linger on close if data present */ -#define SO_OOBINLINE 0x0100 /* leave received OOB data in line */ -#define SO_REUSEPORT 0x0200 /* allow local address & port reuse */ - -/* - * Additional options, not kept in so_options. - */ -#define SO_SNDBUF 0x1001 /* send buffer size */ -#define SO_RCVBUF 0x1002 /* receive buffer size */ -#define SO_SNDLOWAT 0x1003 /* send low-water mark */ -#define SO_RCVLOWAT 0x1004 /* receive low-water mark */ -#define SO_SNDTIMEO 0x1005 /* send timeout */ -#define SO_RCVTIMEO 0x1006 /* receive timeout */ -#define SO_ERROR 0x1007 /* get error status and clear */ -#define SO_TYPE 0x1008 /* get socket type */ - -/* - * Structure used for manipulating linger option. - */ -struct linger { - int l_onoff; /* option on/off */ - int l_linger; /* linger time */ -}; - -/* - * Level number for (get/set)sockopt() to apply to socket itself. - */ -#define SOL_SOCKET 0xffff /* options for socket level */ - -/* - * Address families. - */ -#define AF_UNSPEC 0 /* unspecified */ -#define AF_LOCAL 1 /* local to host (pipes, portals) */ -#define AF_UNIX AF_LOCAL /* backward compatibility */ -#define AF_INET 2 /* internetwork: UDP, TCP, etc. */ -#define AF_IMPLINK 3 /* arpanet imp addresses */ -#define AF_PUP 4 /* pup protocols: e.g. BSP */ -#define AF_CHAOS 5 /* mit CHAOS protocols */ -#define AF_NS 6 /* XEROX NS protocols */ -#define AF_ISO 7 /* ISO protocols */ -#define AF_OSI AF_ISO -#define AF_ECMA 8 /* european computer manufacturers */ -#define AF_DATAKIT 9 /* datakit protocols */ -#define AF_CCITT 10 /* CCITT protocols, X.25 etc */ -#define AF_SNA 11 /* IBM SNA */ -#define AF_DECnet 12 /* DECnet */ -#define AF_DLI 13 /* DEC Direct data link interface */ -#define AF_LAT 14 /* LAT */ -#define AF_HYLINK 15 /* NSC Hyperchannel */ -#define AF_APPLETALK 16 /* Apple Talk */ -#define AF_ROUTE 17 /* Internal Routing Protocol */ -#define AF_LINK 18 /* Link layer interface */ -#define pseudo_AF_XTP 19 /* eXpress Transfer Protocol (no AF) */ -#define AF_COIP 20 /* connection-oriented IP, aka ST II */ -#define AF_CNT 21 /* Computer Network Technology */ -#define pseudo_AF_RTIP 22 /* Help Identify RTIP packets */ -#define AF_IPX 23 /* Novell Internet Protocol */ -#define AF_SIP 24 /* Simple Internet Protocol */ -#define pseudo_AF_PIP 25 /* Help Identify PIP packets */ -#define AF_ISDN 26 /* Integrated Services Digital Network*/ -#define AF_E164 AF_ISDN /* CCITT E.164 recommendation */ -#define pseudo_AF_KEY 27 /* Internal key-management function */ -#define AF_INET6 28 /* IPv6 */ - -#define AF_MAX 29 - -/* - * Structure used by kernel to store most - * addresses. - */ -struct sockaddr { - u_char sa_len; /* total length */ - u_char sa_family; /* address family */ - char sa_data[14]; /* actually longer; address value */ -}; - -/* - * Structure used by kernel to pass protocol - * information in raw sockets. - */ -struct sockproto { - u_short sp_family; /* address family */ - u_short sp_protocol; /* protocol */ -}; - -/* - * Protocol families, same as address families for now. - */ -#define PF_UNSPEC AF_UNSPEC -#define PF_LOCAL AF_LOCAL -#define PF_UNIX PF_LOCAL /* backward compatibility */ -#define PF_INET AF_INET -#define PF_IMPLINK AF_IMPLINK -#define PF_PUP AF_PUP -#define PF_CHAOS AF_CHAOS -#define PF_NS AF_NS -#define PF_ISO AF_ISO -#define PF_OSI AF_ISO -#define PF_ECMA AF_ECMA -#define PF_DATAKIT AF_DATAKIT -#define PF_CCITT AF_CCITT -#define PF_SNA AF_SNA -#define PF_DECnet AF_DECnet -#define PF_DLI AF_DLI -#define PF_LAT AF_LAT -#define PF_HYLINK AF_HYLINK -#define PF_APPLETALK AF_APPLETALK -#define PF_ROUTE AF_ROUTE -#define PF_LINK AF_LINK -#define PF_XTP pseudo_AF_XTP /* really just proto family, no AF */ -#define PF_COIP AF_COIP -#define PF_CNT AF_CNT -#define PF_SIP AF_SIP -#define PF_IPX AF_IPX /* same format as AF_NS */ -#define PF_RTIP pseudo_AF_FTIP /* same format as AF_INET */ -#define PF_PIP pseudo_AF_PIP -#define PF_ISDN AF_ISDN - -#define PF_MAX AF_MAX - -/* - * Definitions for network related sysctl, CTL_NET. - * - * Second level is protocol family. - * Third level is protocol number. - * - * Further levels are defined by the individual families below. - */ -#define NET_MAXID AF_MAX - -#define CTL_NET_NAMES { \ - { 0, 0 }, \ - { "unix", CTLTYPE_NODE }, \ - { "inet", CTLTYPE_NODE }, \ - { "implink", CTLTYPE_NODE }, \ - { "pup", CTLTYPE_NODE }, \ - { "chaos", CTLTYPE_NODE }, \ - { "xerox_ns", CTLTYPE_NODE }, \ - { "iso", CTLTYPE_NODE }, \ - { "emca", CTLTYPE_NODE }, \ - { "datakit", CTLTYPE_NODE }, \ - { "ccitt", CTLTYPE_NODE }, \ - { "ibm_sna", CTLTYPE_NODE }, \ - { "decnet", CTLTYPE_NODE }, \ - { "dec_dli", CTLTYPE_NODE }, \ - { "lat", CTLTYPE_NODE }, \ - { "hylink", CTLTYPE_NODE }, \ - { "appletalk", CTLTYPE_NODE }, \ - { "route", CTLTYPE_NODE }, \ - { "link_layer", CTLTYPE_NODE }, \ - { "xtp", CTLTYPE_NODE }, \ - { "coip", CTLTYPE_NODE }, \ - { "cnt", CTLTYPE_NODE }, \ - { "rtip", CTLTYPE_NODE }, \ - { "ipx", CTLTYPE_NODE }, \ - { "sip", CTLTYPE_NODE }, \ - { "pip", CTLTYPE_NODE }, \ -} - -/* - * PF_ROUTE - Routing table - * - * Three additional levels are defined: - * Fourth: address family, 0 is wildcard - * Fifth: type of info, defined below - * Sixth: flag(s) to mask with for NET_RT_FLAGS - */ -#define NET_RT_DUMP 1 /* dump; may limit to a.f. */ -#define NET_RT_FLAGS 2 /* by flags, e.g. RESOLVING */ -#define NET_RT_IFLIST 3 /* survey interface list */ -#define NET_RT_MAXID 4 - -#define CTL_NET_RT_NAMES { \ - { 0, 0 }, \ - { "dump", CTLTYPE_STRUCT }, \ - { "flags", CTLTYPE_STRUCT }, \ - { "iflist", CTLTYPE_STRUCT }, \ -} - -/* - * Maximum queue length specifiable by listen. - */ -#define SOMAXCONN 128 - -/* - * Message header for recvmsg and sendmsg calls. - * Used value-result for recvmsg, value only for sendmsg. - */ -struct msghdr { - caddr_t msg_name; /* optional address */ - u_int msg_namelen; /* size of address */ - struct iovec *msg_iov; /* scatter/gather array */ - u_int msg_iovlen; /* # elements in msg_iov */ - caddr_t msg_control; /* ancillary data, see below */ - u_int msg_controllen; /* ancillary data buffer len */ - int msg_flags; /* flags on received message */ -}; - -#endif - -#ifndef MSG_OOB -#define MSG_OOB 0x1 /* process out-of-band data */ -#define MSG_PEEK 0x2 /* peek at incoming message */ -#define MSG_DONTROUTE 0x4 /* send without using routing tables */ -#endif -#ifndef MSG_EOR -#define MSG_EOR 0x8 /* data completes record */ -#define MSG_TRUNC 0x10 /* data discarded before delivery */ -#define MSG_CTRUNC 0x20 /* control data lost before delivery */ -#define MSG_WAITALL 0x40 /* wait for full request or error */ -#endif -#ifndef MSG_DONTWAIT -#define MSG_DONTWAIT 0x80 /* this message should be nonblocking */ -#define MSG_EOF 0x100 /* data completes connection */ -#define MSG_COMPAT 0x8000 /* used in sendit() */ -#endif - -#ifndef __REACTOS__ -/* - * Header for ancillary data objects in msg_control buffer. - * Used for additional information with/about a datagram - * not expressible by flags. The format is a sequence - * of message elements headed by cmsghdr structures. - */ -struct cmsghdr { - u_int cmsg_len; /* data byte count, including hdr */ - int cmsg_level; /* originating protocol */ - int cmsg_type; /* protocol-specific type */ -/* followed by u_char cmsg_data[]; */ -}; - -/* given pointer to struct cmsghdr, return pointer to data */ -#define CMSG_DATA(cmsg) ((u_char *)((cmsg) + 1)) - -/* given pointer to struct cmsghdr, return pointer to next cmsghdr */ -#define CMSG_NXTHDR(mhdr, cmsg) \ - (((caddr_t)(cmsg) + (cmsg)->cmsg_len + sizeof(struct cmsghdr) > \ - (mhdr)->msg_control + (mhdr)->msg_controllen) ? \ - (struct cmsghdr *)NULL : \ - (struct cmsghdr *)((caddr_t)(cmsg) + ALIGN((cmsg)->cmsg_len))) - -#define CMSG_FIRSTHDR(mhdr) ((struct cmsghdr *)(mhdr)->msg_control) - -/* "Socket"-level control message types: */ -#define SCM_RIGHTS 0x01 /* access rights (array of int) */ - -/* - * 4.3 compat sockaddr, move to compat file later - */ -struct osockaddr { - u_short sa_family; /* address family */ - char sa_data[14]; /* up to 14 bytes of direct address */ -}; - -/* - * 4.3-compat message header (move to compat file later). - */ -struct omsghdr { - caddr_t msg_name; /* optional address */ - int msg_namelen; /* size of address */ - struct iovec *msg_iov; /* scatter/gather array */ - int msg_iovlen; /* # elements in msg_iov */ - caddr_t msg_accrights; /* access rights sent/received */ - int msg_accrightslen; -}; - -#ifndef KERNEL - -#include <sys/cdefs.h> - -__BEGIN_DECLS -int accept __P((int, struct sockaddr *, int *)); -int bind __P((int, const struct sockaddr *, int)); -int connect __P((int, const struct sockaddr *, int)); -int getpeername __P((int, struct sockaddr *, int *)); -int getsockname __P((int, struct sockaddr *, int *)); -int getsockopt __P((int, int, int, void *, int *)); -int listen __P((int, int)); -ssize_t recv __P((int, void *, size_t, int)); -ssize_t recvfrom __P((int, void *, size_t, int, struct sockaddr *, int *)); -ssize_t recvmsg __P((int, struct msghdr *, int)); -ssize_t send __P((int, const void *, size_t, int)); -ssize_t sendto __P((int, const void *, - size_t, int, const struct sockaddr *, int)); -ssize_t sendmsg __P((int, const struct msghdr *, int)); -int setsockopt __P((int, int, int, const void *, int)); -int shutdown __P((int, int)); -int socket __P((int, int, int)); -int socketpair __P((int, int, int, int *)); -__END_DECLS - -#else /* KERNEL */ -void pfctlinput __P((int, struct sockaddr *)); -#endif /* !KERNEL */ -#endif /* !_OSK_SYS_SOCKET_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/socketvar.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/socketvar.h deleted file mode 100644 index d5b4fb59f90..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/socketvar.h +++ /dev/null @@ -1,264 +0,0 @@ -/*- - * Copyright (c) 1982, 1986, 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)socketvar.h 8.1 (Berkeley) 6/2/93 - */ - -#ifndef _SYS_SOCKETVAR_H_ -#define _SYS_SOCKETVAR_H_ - -#include <sys/stat.h> /* for struct stat */ -#include <sys/filedesc.h> /* for struct filedesc */ -#include <sys/select.h> /* for struct selinfo */ - -/* - * Kernel structure per socket. - * Contains send and receive buffer queues, - * handle on protocol and pointer to protocol - * private data and error information. - */ -struct socket { - short so_type; /* generic type, see socket.h */ - short so_options; /* from socket call, see socket.h */ - short so_linger; /* time to linger while closing */ - short so_state; /* internal state flags SS_*, below */ - caddr_t so_pcb; /* protocol control block */ - struct protosw *so_proto; /* protocol handle */ -/* - * Variables for connection queueing. - * Socket where accepts occur is so_head in all subsidiary sockets. - * If so_head is 0, socket is not related to an accept. - * For head socket so_q0 queues partially completed connections, - * while so_q is a queue of connections ready to be accepted. - * If a connection is aborted and it has so_head set, then - * it has to be pulled out of either so_q0 or so_q. - * We allow connections to queue up based on current queue lengths - * and limit on number of queued connections for this socket. - */ - struct socket *so_head; /* back pointer to accept socket */ - struct socket *so_q0; /* queue of partial connections */ - struct socket *so_q; /* queue of incoming connections */ - short so_q0len; /* partials on so_q0 */ - short so_qlen; /* number of connections on so_q */ - short so_qlimit; /* max number queued connections */ - short so_timeo; /* connection timeout */ - u_short so_error; /* error affecting connection */ - pid_t so_pgid; /* pgid for signals */ - u_long so_oobmark; /* chars to oob mark */ -/* - * Variables for socket buffering. - */ - struct sockbuf { - u_long sb_cc; /* actual chars in buffer */ - u_long sb_hiwat; /* max actual char count */ - u_long sb_mbcnt; /* chars of mbufs used */ - u_long sb_mbmax; /* max chars of mbufs to use */ - long sb_lowat; /* low water mark */ - struct mbuf *sb_mb; /* the mbuf chain */ - struct selinfo sb_sel; /* process selecting read/write */ - short sb_flags; /* flags, see below */ - short sb_timeo; /* timeout for read/write */ - } so_rcv, so_snd; -#define SB_MAX (256*1024) /* default for max chars in sockbuf */ -#define SB_LOCK 0x01 /* lock on data queue */ -#define SB_WANT 0x02 /* someone is waiting to lock */ -#define SB_WAIT 0x04 /* someone is waiting for data/space */ -#define SB_SEL 0x08 /* someone is selecting */ -#define SB_ASYNC 0x10 /* ASYNC I/O, need signals */ -#define SB_NOTIFY (SB_WAIT|SB_SEL|SB_ASYNC) -#define SB_NOINTR 0x40 /* operations not interruptible */ - - caddr_t so_tpcb; /* Wisc. protocol control block XXX */ - void (*so_upcall) __P((struct socket *so, caddr_t arg, int waitf)); - caddr_t so_upcallarg; /* Arg for above */ - -#ifdef __REACTOS__ - void *so_connection; /* The connection object used by our parent */ -#endif -}; - -/* - * Socket state bits. - */ -#define SS_NOFDREF 0x001 /* no file table ref any more */ -#define SS_ISCONNECTED 0x002 /* socket connected to a peer */ -#define SS_ISCONNECTING 0x004 /* in process of connecting to peer */ -#define SS_ISDISCONNECTING 0x008 /* in process of disconnecting */ -#define SS_CANTSENDMORE 0x010 /* can't send more data to peer */ -#define SS_CANTRCVMORE 0x020 /* can't receive more data from peer */ -#define SS_RCVATMARK 0x040 /* at mark on input */ - -#define SS_PRIV 0x080 /* privileged for broadcast, raw... */ -#define SS_NBIO 0x100 /* non-blocking ops */ -#define SS_ASYNC 0x200 /* async i/o notify */ -#define SS_ISCONFIRMING 0x400 /* deciding to accept connection req */ - - -/* - * Macros for sockets and socket buffering. - */ - -/* - * How much space is there in a socket buffer (so->so_snd or so->so_rcv)? - * This is problematical if the fields are unsigned, as the space might - * still be negative (cc > hiwat or mbcnt > mbmax). Should detect - * overflow and return 0. Should use "lmin" but it doesn't exist now. - */ -#define sbspace(sb) \ - ((long) imin((int)((sb)->sb_hiwat - (sb)->sb_cc), \ - (int)((sb)->sb_mbmax - (sb)->sb_mbcnt))) - -/* do we have to send all at once on a socket? */ -#define sosendallatonce(so) \ - ((so)->so_proto->pr_flags & PR_ATOMIC) - -/* can we read something from so? */ -#define soreadable(so) \ - ((so)->so_rcv.sb_cc >= (so)->so_rcv.sb_lowat || \ - ((so)->so_state & SS_CANTRCVMORE) || \ - (so)->so_qlen || (so)->so_error) - -/* can we write something to so? */ -#define sowriteable(so) \ - ((sbspace(&(so)->so_snd) >= (so)->so_snd.sb_lowat && \ - (((so)->so_state&SS_ISCONNECTED) || \ - ((so)->so_proto->pr_flags&PR_CONNREQUIRED)==0)) || \ - ((so)->so_state & SS_CANTSENDMORE) || \ - (so)->so_error) - -/* adjust counters in sb reflecting allocation of m */ -#define sballoc(sb, m) { \ - (sb)->sb_cc += (m)->m_len; \ - (sb)->sb_mbcnt += MSIZE; \ - if ((m)->m_flags & M_EXT) \ - (sb)->sb_mbcnt += (m)->m_ext.ext_size; \ -} - -/* adjust counters in sb reflecting freeing of m */ -#define sbfree(sb, m) { \ - (sb)->sb_cc -= (m)->m_len; \ - (sb)->sb_mbcnt -= MSIZE; \ - if ((m)->m_flags & M_EXT) \ - (sb)->sb_mbcnt -= (m)->m_ext.ext_size; \ -} - -/* - * Set lock on sockbuf sb; sleep if lock is already held. - * Unless SB_NOINTR is set on sockbuf, sleep is interruptible. - * Returns error without lock if sleep is interrupted. - */ -#define sblock(sb, wf) ((sb)->sb_flags & SB_LOCK ? \ - (((wf) == M_WAITOK) ? sb_lock(sb) : EWOULDBLOCK) : \ - ((sb)->sb_flags |= SB_LOCK), 0) - -/* release lock on sockbuf sb */ -#define sbunlock(sb) { \ - (sb)->sb_flags &= ~SB_LOCK; \ - if ((sb)->sb_flags & SB_WANT) { \ - (sb)->sb_flags &= ~SB_WANT; \ - wakeup((caddr_t)&(sb)->sb_flags); \ - } \ -} - -#define sorwakeup(so) { sowakeup((so), &(so)->so_rcv); \ - if ((so)->so_upcall) \ - (*((so)->so_upcall))((so), (so)->so_upcallarg, M_DONTWAIT); \ - } - -#define sowwakeup(so) sowakeup((so), &(so)->so_snd) - -#ifdef KERNEL -extern u_long sb_max; -/* to catch callers missing new second argument to sonewconn: */ -#define sonewconn(head, connstatus) sonewconn1((head), (connstatus)) -struct socket *sonewconn1 __P((struct socket *head, int connstatus)); - -/* strings for sleep message: */ -extern char netio[], netcon[], netcls[]; - -/* - * File operations on sockets. - */ -int soo_read __P((struct file *fp, struct uio *uio, struct ucred *cred)); -int soo_write __P((struct file *fp, struct uio *uio, struct ucred *cred)); -int soo_ioctl __P((struct file *fp, int com, caddr_t data, struct proc *p)); -int soo_select __P((struct file *fp, int which, struct proc *p)); -int soo_close __P((struct file *fp, struct proc *p)); -int soo_stat __P((struct socket *, struct stat *)); - -/* - * From uipc_socket and friends - */ -void soqinsque __P((struct socket *, struct socket *, int)); -void sowakeup __P((struct socket *, struct sockbuf *)); -void socantrcvmore __P((struct socket *)); -void socantsendmore __P((struct socket *)); -void sbrelease __P((struct sockbuf *)); -void sbappend __P((struct socket *, struct sockbuf *, struct mbuf *)); -void sbappendrecord __P((struct sockbuf *, struct mbuf *)); -int sbappendcontrol __P((struct sockbuf *, struct mbuf *, struct mbuf *)); -int sbappendaddr __P((struct sockbuf *, struct sockaddr *, struct mbuf *, struct mbuf *)); -void sbdroprecord __P((struct sockbuf *)); -void sbcompress __P((struct sockbuf *, struct mbuf *, struct mbuf *)); -void sbflush __P((struct sockbuf *)); -int sbreserve __P((struct sockbuf *,u_long)); -int soreserve __P((struct socket *,u_long,u_long)); -int sb_lock __P((struct sockbuf *)); -int sbwait __P((struct sockbuf *)); -void sbdrop __P((struct sockbuf *, int)); -void sofree __P((struct socket *)); -void sorflush __P((struct socket *)); -int soqremque __P((struct socket *,int)); -int soabort __P((struct socket *)); -void soisdisconnected __P((struct socket *)); -void soisconnected __P((struct socket *)); -void soisconnecting __P((struct socket *)); -void soisdisconnecting __P((struct socket *)); -void sohasoutofband __P((struct socket *)); -int sodisconnect __P((struct socket *)); -int sosend __P((struct socket *,struct mbuf *, struct uio *, struct mbuf *, struct mbuf *, int)); -int socreate __P((int, struct socket **,int,int)); -int getsock __P((struct filedesc *,int,struct file **)); -int sockargs __P((struct mbuf **,caddr_t,int,int)); -int sobind __P((struct socket *,struct mbuf *)); -int solisten __P((struct socket *,int)); -int soaccept __P((struct socket *,struct mbuf *)); -int soconnect __P((struct socket *,struct mbuf *)); -int soconnect2 __P((struct socket *,struct socket *)); -int soclose __P((struct socket *)); -int soshutdown __P((struct socket *,int)); -int soreceive __P((struct socket *,struct mbuf **,struct uio *,struct mbuf **,struct mbuf **,int *)); -int sosetopt __P((struct socket *,int, int, struct mbuf *)); -int sogetopt __P((struct socket *,int, int, struct mbuf **)); -#endif - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/sockio.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/sockio.h deleted file mode 100644 index 05dfd904a5f..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/sockio.h +++ /dev/null @@ -1,88 +0,0 @@ -/*- - * Copyright (c) 1982, 1986, 1990, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)sockio.h 8.1 (Berkeley) 3/28/94 - */ - -#ifndef _SYS_SOCKIO_H_ -#define _SYS_SOCKIO_H_ - -#ifndef __REACTOS__ -#include <sys/ioccom.h> - -/* Socket ioctl's. */ -#define SIOCSHIWAT _IOW('s', 0, int) /* set high watermark */ -#define SIOCGHIWAT _IOR('s', 1, int) /* get high watermark */ -#define SIOCSLOWAT _IOW('s', 2, int) /* set low watermark */ -#define SIOCGLOWAT _IOR('s', 3, int) /* get low watermark */ -#define SIOCATMARK _IOR('s', 7, int) /* at oob mark? */ -#define SIOCSPGRP _IOW('s', 8, int) /* set process group */ -#define SIOCGPGRP _IOR('s', 9, int) /* get process group */ - -#define SIOCADDRT _IOW('r', 10, struct ortentry) /* add route */ -#define SIOCDELRT _IOW('r', 11, struct ortentry) /* delete route */ -#define SIOCSETRTINFO _IOWR('r', 12, struct fullrtentry) /* change aux info */ -#define SIOCGETRTINFO _IOWR('r', 13, struct fullrtentry) /* read aux info */ -#define SIOCGETVIFINF _IOWR('r', 14, struct vif_conf) /* read m/c vifs */ -#define SIOCGETVIFCNT _IOWR('r', 15, struct sioc_vif_req)/* get vif pkt cnt */ -#define SIOCGETSGCNT _IOWR('r', 16, struct sioc_sg_req) /* get s,g pkt cnt */ - -#define SIOCSIFADDR _IOW('i', 12, struct ifreq) /* set ifnet address */ -#define OSIOCGIFADDR _IOWR('i', 13, struct ifreq) /* get ifnet address */ -#define SIOCGIFADDR _IOWR('i', 33, struct ifreq) /* get ifnet address */ -#define SIOCSIFDSTADDR _IOW('i', 14, struct ifreq) /* set p-p address */ -#define OSIOCGIFDSTADDR _IOWR('i', 15, struct ifreq) /* get p-p address */ -#define SIOCGIFDSTADDR _IOWR('i', 34, struct ifreq) /* get p-p address */ -#define SIOCSIFFLAGS _IOW('i', 16, struct ifreq) /* set ifnet flags */ -#define SIOCGIFFLAGS _IOWR('i', 17, struct ifreq) /* get ifnet flags */ -#define OSIOCGIFBRDADDR _IOWR('i', 18, struct ifreq) /* get broadcast addr */ -#define SIOCGIFBRDADDR _IOWR('i', 35, struct ifreq) /* get broadcast addr */ -#define SIOCSIFBRDADDR _IOW('i', 19, struct ifreq) /* set broadcast addr */ -#define OSIOCGIFCONF _IOWR('i', 20, struct ifconf) /* get ifnet list */ -#define SIOCGIFCONF _IOWR('i', 36, struct ifconf) /* get ifnet list */ -#define OSIOCGIFNETMASK _IOWR('i', 21, struct ifreq) /* get net addr mask */ -#define SIOCGIFNETMASK _IOWR('i', 37, struct ifreq) /* get net addr mask */ -#define SIOCSIFNETMASK _IOW('i', 22, struct ifreq) /* set net addr mask */ -#define SIOCGIFMETRIC _IOWR('i', 23, struct ifreq) /* get IF metric */ -#define SIOCSIFMETRIC _IOW('i', 24, struct ifreq) /* set IF metric */ -#define SIOCDIFADDR _IOW('i', 25, struct ifreq) /* delete IF addr */ -#define SIOCAIFADDR _IOW('i', 26, struct ifaliasreq)/* add/chg IF alias */ - -#define SIOCADDMULTI _IOW('i', 49, struct ifreq) /* add m'cast addr */ -#define SIOCDELMULTI _IOW('i', 50, struct ifreq) /* del m'cast addr */ -#define SIOCGIFMTU _IOWR('i', 51, struct ifreq) /* get IF mtu */ -#define SIOCSIFMTU _IOW('i', 52, struct ifreq) /* set IF mtu */ -#define SIOCGIFPHYS _IOWR('i', 53, struct ifreq) /* get IF wire */ -#define SIOCSIFPHYS _IOW('i', 54, struct ifreq) /* set IF wire */ -#endif - -#endif /* !_SYS_SOCKIO_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/stat.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/stat.h deleted file mode 100644 index 87e6e5f1f88..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/stat.h +++ /dev/null @@ -1,203 +0,0 @@ -/*- - * Copyright (c) 1982, 1986, 1989, 1993 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)stat.h 8.6 (Berkeley) 3/8/94 - */ - -#ifndef _SYS_STAT_H_ -#define _SYS_STAT_H_ - -/* - * XXX we need this for struct timespec. We get miscellaneous namespace - * pollution with it. struct timespace itself is namespace pollution if - * _POSIX_SOURCE is defined. - */ -#include <sys/time.h> - -#ifndef _POSIX_SOURCE -struct ostat { - unsigned short st_dev; /* inode's device */ - ino_t st_ino; /* inode's number */ - mode_t st_mode; /* inode protection mode */ - nlink_t st_nlink; /* number of hard links */ - unsigned short st_uid; /* user ID of the file's owner */ - unsigned short st_gid; /* group ID of the file's group */ - unsigned short st_rdev; /* device type */ - long st_size; /* file size, in bytes */ - struct timespec st_atimespec; /* time of last access */ - struct timespec st_mtimespec; /* time of last data modification */ - struct timespec st_ctimespec; /* time of last file status change */ - long st_blksize; /* optimal blocksize for I/O */ - long st_blocks; /* blocks allocated for file */ - unsigned long st_flags; /* user defined flags for file */ - unsigned long st_gen; /* file generation number */ -}; -#endif /* !_POSIX_SOURCE */ - -struct stat { - dev_t st_dev; /* inode's device */ - ino_t st_ino; /* inode's number */ - mode_t st_mode; /* inode protection mode */ - nlink_t st_nlink; /* number of hard links */ - uid_t st_uid; /* user ID of the file's owner */ - gid_t st_gid; /* group ID of the file's group */ - dev_t st_rdev; /* device type */ - struct timespec st_atimespec; /* time of last access */ - struct timespec st_mtimespec; /* time of last data modification */ - struct timespec st_ctimespec; /* time of last file status change */ - off_t st_size; /* file size, in bytes */ - quad_t st_blocks; /* blocks allocated for file */ - unsigned long st_blksize; /* optimal blocksize for I/O */ - unsigned long st_flags; /* user defined flags for file */ - unsigned long st_gen; /* file generation number */ - long st_lspare; - quad_t st_qspare[2]; -}; -#define st_atime st_atimespec.ts_sec -#define st_mtime st_mtimespec.ts_sec -#define st_ctime st_ctimespec.ts_sec - -#define S_ISUID 0004000 /* set user id on execution */ -#define S_ISGID 0002000 /* set group id on execution */ -#ifndef _POSIX_SOURCE -#define S_ISTXT 0001000 /* sticky bit */ -#endif - -#define S_IRWXU 0000700 /* RWX mask for owner */ -#define S_IRUSR 0000400 /* R for owner */ -#define S_IWUSR 0000200 /* W for owner */ -#define S_IXUSR 0000100 /* X for owner */ - -#ifndef _POSIX_SOURCE -#define S_IREAD S_IRUSR -#define S_IWRITE S_IWUSR -#define S_IEXEC S_IXUSR -#endif - -#define S_IRWXG 0000070 /* RWX mask for group */ -#define S_IRGRP 0000040 /* R for group */ -#define S_IWGRP 0000020 /* W for group */ -#define S_IXGRP 0000010 /* X for group */ - -#define S_IRWXO 0000007 /* RWX mask for other */ -#define S_IROTH 0000004 /* R for other */ -#define S_IWOTH 0000002 /* W for other */ -#define S_IXOTH 0000001 /* X for other */ - -#ifndef _POSIX_SOURCE -#define S_IFMT 0170000 /* type of file mask */ -#define S_IFIFO 0010000 /* named pipe (fifo) */ -#define S_IFCHR 0020000 /* character special */ -#define S_IFDIR 0040000 /* directory */ -#define S_IFBLK 0060000 /* block special */ -#define S_IFREG 0100000 /* regular */ -#define S_IFLNK 0120000 /* symbolic link */ -#define S_IFSOCK 0140000 /* socket */ -#define S_ISVTX 0001000 /* save swapped text even after use */ -#endif - -#define S_ISDIR(m) (((m) & 0170000) == 0040000) /* directory */ -#define S_ISCHR(m) (((m) & 0170000) == 0020000) /* char special */ -#define S_ISBLK(m) (((m) & 0170000) == 0060000) /* block special */ -#define S_ISREG(m) (((m) & 0170000) == 0100000) /* regular file */ -#define S_ISFIFO(m) (((m) & 0170000) == 0010000 || \ - ((m) & 0170000) == 0140000) /* fifo or socket */ -#ifndef _POSIX_SOURCE -#define S_ISLNK(m) (((m) & 0170000) == 0120000) /* symbolic link */ -#define S_ISSOCK(m) (((m) & 0170000) == 0010000 || \ - ((m) & 0170000) == 0140000) /* fifo or socket */ -#endif - -#ifndef _POSIX_SOURCE -#define ACCESSPERMS (S_IRWXU|S_IRWXG|S_IRWXO) /* 0777 */ - /* 7777 */ -#define ALLPERMS (S_ISUID|S_ISGID|S_ISTXT|S_IRWXU|S_IRWXG|S_IRWXO) - /* 0666 */ -#define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) - -#define S_BLKSIZE 512 /* block size used in the stat struct */ - -/* - * Definitions of flags stored in file flags word. - * - * Super-user and owner changeable flags. - */ -#define UF_SETTABLE 0x0000ffff /* mask of owner changeable flags */ -#define UF_NODUMP 0x00000001 /* do not dump file */ -#define UF_IMMUTABLE 0x00000002 /* file may not be changed */ -#define UF_APPEND 0x00000004 /* writes to file may only append */ -/* - * Super-user changeable flags. - */ -#define SF_SETTABLE 0xffff0000 /* mask of superuser changeable flags */ -#define SF_ARCHIVED 0x00010000 /* file is archived */ -#define SF_IMMUTABLE 0x00020000 /* file may not be changed */ -#define SF_APPEND 0x00040000 /* writes to file may only append */ - -#ifdef KERNEL -/* - * Shorthand abbreviations of above. - */ -#define APPEND (UF_APPEND | SF_APPEND) -#define IMMUTABLE (UF_IMMUTABLE | SF_IMMUTABLE) -#endif - -#endif /* !_POSIX_SOURCE */ - -#ifdef KERNEL -void cvtstat __P((struct stat *, struct ostat *)); -#else /* KERNEL */ -#include <sys/cdefs.h> - -__BEGIN_DECLS -int chmod __P((const char *, mode_t)); -int fstat __P((int, struct stat *)); -int mkdir __P((const char *, mode_t)); -int mkfifo __P((const char *, mode_t)); -int stat __P((const char *, struct stat *)); -mode_t umask __P((mode_t)); -#ifndef _POSIX_SOURCE -int chflags __P((const char *, u_long)); -int fchflags __P((int, u_long)); -int fchmod __P((int, mode_t)); -int lstat __P((const char *, struct stat *)); -#endif -__END_DECLS - -#endif /* KERNEL */ - -#endif /* !_SYS_STAT_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/sysctl.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/sysctl.h deleted file mode 100644 index c3aa9667fcc..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/sysctl.h +++ /dev/null @@ -1,412 +0,0 @@ -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Mike Karels at Berkeley Software Design, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)sysctl.h 8.1 (Berkeley) 6/2/93 - * $\Id: sysctl.h,v 1.23.4.5 1996/09/19 08:19:00 pst Exp $ - */ - -#ifndef _SYS_SYSCTL_H_ -#define _SYS_SYSCTL_H_ - -/* - * These are for the eproc structure defined below. - */ -#ifndef KERNEL -#include <sys/time.h> -#include <sys/ucred.h> -#include <sys/proc.h> -#include <vm/vm.h> -#endif - -/* - * Definitions for sysctl call. The sysctl call uses a hierarchical name - * for objects that can be examined or modified. The name is expressed as - * a sequence of integers. Like a file path name, the meaning of each - * component depends on its place in the hierarchy. The top-level and kern - * identifiers are defined here, and other identifiers are defined in the - * respective subsystem header files. - */ - -#define CTL_MAXNAME 12 /* largest number of components supported */ - -/* - * Each subsystem defined by sysctl defines a list of variables - * for that subsystem. Each name is either a node with further - * levels defined below it, or it is a leaf of some particular - * type given below. Each sysctl level defines a set of name/type - * pairs to be used by sysctl(1) in manipulating the subsystem. - */ -struct ctlname { - char *ctl_name; /* subsystem name */ - int ctl_type; /* type of name */ -}; -#define CTLTYPE_NODE 1 /* name is a node */ -#define CTLTYPE_INT 2 /* name describes an integer */ -#define CTLTYPE_STRING 3 /* name describes a string */ -#define CTLTYPE_QUAD 4 /* name describes a 64-bit number */ -#define CTLTYPE_STRUCT 5 /* name describes a structure */ - -/* - * Top-level identifiers - */ -#define CTL_UNSPEC 0 /* unused */ -#define CTL_KERN 1 /* "high kernel": proc, limits */ -#define CTL_VM 2 /* virtual memory */ -#define CTL_FS 3 /* file system, mount type is next */ -#define CTL_NET 4 /* network, see socket.h */ -#define CTL_DEBUG 5 /* debugging parameters */ -#define CTL_HW 6 /* generic cpu/io */ -#define CTL_MACHDEP 7 /* machine dependent */ -#define CTL_USER 8 /* user-level */ -#define CTL_MAXID 9 /* number of valid top-level ids */ - -#define CTL_NAMES { \ - { 0, 0 }, \ - { "kern", CTLTYPE_NODE }, \ - { "vm", CTLTYPE_NODE }, \ - { "fs", CTLTYPE_NODE }, \ - { "net", CTLTYPE_NODE }, \ - { "debug", CTLTYPE_NODE }, \ - { "hw", CTLTYPE_NODE }, \ - { "machdep", CTLTYPE_NODE }, \ - { "user", CTLTYPE_NODE }, \ -} - -/* - * CTL_KERN identifiers - */ -#define KERN_OSTYPE 1 /* string: system version */ -#define KERN_OSRELEASE 2 /* string: system release */ -#define KERN_OSREV 3 /* int: system revision */ -#define KERN_VERSION 4 /* string: compile time info */ -#define KERN_MAXVNODES 5 /* int: max vnodes */ -#define KERN_MAXPROC 6 /* int: max processes */ -#define KERN_MAXFILES 7 /* int: max open files */ -#define KERN_ARGMAX 8 /* int: max arguments to exec */ -#define KERN_SECURELVL 9 /* int: system security level */ -#define KERN_HOSTNAME 10 /* string: hostname */ -#define KERN_HOSTID 11 /* int: host identifier */ -#define KERN_CLOCKRATE 12 /* struct: struct clockrate */ -#define KERN_VNODE 13 /* struct: vnode structures */ -#define KERN_PROC 14 /* struct: process entries */ -#define KERN_FILE 15 /* struct: file entries */ -#define KERN_PROF 16 /* node: kernel profiling info */ -#define KERN_POSIX1 17 /* int: POSIX.1 version */ -#define KERN_NGROUPS 18 /* int: # of supplemental group ids */ -#define KERN_JOB_CONTROL 19 /* int: is job control available */ -#define KERN_SAVED_IDS 20 /* int: saved set-user/group-ID */ -#define KERN_BOOTTIME 21 /* struct: time kernel was booted */ -#define KERN_DOMAINNAME 22 /* string: YP domain name */ -#define KERN_UPDATEINTERVAL 23 /* int: update process sleep time */ -#define KERN_OSRELDATE 24 /* int: OS release date */ -#define KERN_NTP_PLL 25 /* node: NTP PLL control */ -#define KERN_BOOTFILE 26 /* string: name of booted kernel */ -#define KERN_MAXFILESPERPROC 27 /* int: max open files per proc */ -#define KERN_MAXPROCPERUID 28 /* int: max processes per uid */ -#define KERN_DUMPDEV 29 /* dev_t: device to dump on */ -#define KERN_SOMAXCONN 30 /* int: max connections in listen q */ -#define KERN_MAXSOCKBUF 31 /* int: max size of a socket buffer */ -#define KERN_PS_STRINGS 32 /* int: address of PS_STRINGS */ -#define KERN_USRSTACK 33 /* int: address of USRSTACK */ -#define KERN_SOCKBUF_WASTE 34 /* int: reserved sockbuf space */ -#define KERN_SOMINQUEUE 35 /* int: override socket listen() */ -#define KERN_MAXID 36 /* number of valid kern ids */ - -#define CTL_KERN_NAMES { \ - { 0, 0 }, \ - { "ostype", CTLTYPE_STRING }, \ - { "osrelease", CTLTYPE_STRING }, \ - { "osrevision", CTLTYPE_INT }, \ - { "version", CTLTYPE_STRING }, \ - { "maxvnodes", CTLTYPE_INT }, \ - { "maxproc", CTLTYPE_INT }, \ - { "maxfiles", CTLTYPE_INT }, \ - { "argmax", CTLTYPE_INT }, \ - { "securelevel", CTLTYPE_INT }, \ - { "hostname", CTLTYPE_STRING }, \ - { "hostid", CTLTYPE_INT }, \ - { "clockrate", CTLTYPE_STRUCT }, \ - { "vnode", CTLTYPE_STRUCT }, \ - { "proc", CTLTYPE_STRUCT }, \ - { "file", CTLTYPE_STRUCT }, \ - { "profiling", CTLTYPE_NODE }, \ - { "posix1version", CTLTYPE_INT }, \ - { "ngroups", CTLTYPE_INT }, \ - { "job_control", CTLTYPE_INT }, \ - { "saved_ids", CTLTYPE_INT }, \ - { "boottime", CTLTYPE_STRUCT }, \ - { "domainname", CTLTYPE_STRING }, \ - { "update", CTLTYPE_INT }, \ - { "osreldate", CTLTYPE_INT }, \ - { "ntp_pll", CTLTYPE_NODE }, \ - { "bootfile", CTLTYPE_STRING }, \ - { "maxfilesperproc", CTLTYPE_INT }, \ - { "maxprocperuid", CTLTYPE_INT }, \ - { "dumpdev", CTLTYPE_STRUCT }, /* we lie; don't print as int */ \ - { "somaxconn", CTLTYPE_INT }, \ - { "maxsockbuf", CTLTYPE_INT }, \ - { "ps_strings", CTLTYPE_INT }, \ - { "usrstack", CTLTYPE_INT }, \ - { "sockbuf_waste_factor", CTLTYPE_INT }, \ - { "sominqueue", CTLTYPE_INT }, \ -} - -/* - * CTL_FS identifiers - */ -#define FS_VFSCONF 0 /* get configured filesystems */ -#define FS_MAXID 1 /* number of items */ - -#define CTL_FS_NAMES { \ - { "vfsconf", CTLTYPE_STRUCT }, \ -} - -/* - * KERN_PROC subtypes - */ -#define KERN_PROC_ALL 0 /* everything */ -#define KERN_PROC_PID 1 /* by process id */ -#define KERN_PROC_PGRP 2 /* by process group id */ -#define KERN_PROC_SESSION 3 /* by session of pid */ -#define KERN_PROC_TTY 4 /* by controlling tty */ -#define KERN_PROC_UID 5 /* by effective uid */ -#define KERN_PROC_RUID 6 /* by real uid */ - -/* - * KERN_PROC subtype ops return arrays of augmented proc structures: - */ -struct kinfo_proc { - struct proc kp_proc; /* proc structure */ - struct eproc { - struct proc *e_paddr; /* address of proc */ - struct session *e_sess; /* session pointer */ - struct pcred e_pcred; /* process credentials */ - struct ucred e_ucred; /* current credentials */ -#if defined(sparc) || defined(__REACTOS__) - struct { - segsz_t vm_rssize; /* resident set size */ - segsz_t vm_tsize; /* text size */ - segsz_t vm_dsize; /* data size */ - segsz_t vm_ssize; /* stack size */ - } e_vm; -#else -#ifndef OSKIT - struct vmspace e_vm; /* address space */ -#endif -#endif - pid_t e_ppid; /* parent process id */ - pid_t e_pgid; /* process group id */ - short e_jobc; /* job control counter */ - dev_t e_tdev; /* controlling tty dev */ - pid_t e_tpgid; /* tty process group id */ - struct session *e_tsess; /* tty session pointer */ -#define WMESGLEN 7 - char e_wmesg[WMESGLEN+1]; /* wchan message */ - segsz_t e_xsize; /* text size */ - short e_xrssize; /* text rss */ - short e_xccount; /* text references */ - short e_xswrss; - long e_flag; -#define EPROC_CTTY 0x01 /* controlling tty vnode active */ -#define EPROC_SLEADER 0x02 /* session leader */ - char e_login[MAXLOGNAME]; /* setlogin() name */ - long e_spare[4]; - } kp_eproc; -}; - -/* - * CTL_HW identifiers - */ -#define HW_MACHINE 1 /* string: machine class */ -#define HW_MODEL 2 /* string: specific machine model */ -#define HW_NCPU 3 /* int: number of cpus */ -#define HW_BYTEORDER 4 /* int: machine byte order */ -#define HW_PHYSMEM 5 /* int: total memory */ -#define HW_USERMEM 6 /* int: non-kernel memory */ -#define HW_PAGESIZE 7 /* int: software page size */ -#define HW_DISKNAMES 8 /* strings: disk drive names */ -#define HW_DISKSTATS 9 /* struct: diskstats[] */ -#define HW_FLOATINGPT 10 /* int: has HW floating point? */ -#define HW_DEVCONF 11 /* node: device configuration */ -#define HW_MAXID 12 /* number of valid hw ids */ - -#define CTL_HW_NAMES { \ - { 0, 0 }, \ - { "machine", CTLTYPE_STRING }, \ - { "model", CTLTYPE_STRING }, \ - { "ncpu", CTLTYPE_INT }, \ - { "byteorder", CTLTYPE_INT }, \ - { "physmem", CTLTYPE_INT }, \ - { "usermem", CTLTYPE_INT }, \ - { "pagesize", CTLTYPE_INT }, \ - { "disknames", CTLTYPE_STRUCT }, \ - { "diskstats", CTLTYPE_STRUCT }, \ - { "floatingpoint", CTLTYPE_INT }, \ - { "devconf", CTLTYPE_NODE }, \ -} - -/* - * CTL_USER definitions - */ -#define USER_CS_PATH 1 /* string: _CS_PATH */ -#define USER_BC_BASE_MAX 2 /* int: BC_BASE_MAX */ -#define USER_BC_DIM_MAX 3 /* int: BC_DIM_MAX */ -#define USER_BC_SCALE_MAX 4 /* int: BC_SCALE_MAX */ -#define USER_BC_STRING_MAX 5 /* int: BC_STRING_MAX */ -#define USER_COLL_WEIGHTS_MAX 6 /* int: COLL_WEIGHTS_MAX */ -#define USER_EXPR_NEST_MAX 7 /* int: EXPR_NEST_MAX */ -#define USER_LINE_MAX 8 /* int: LINE_MAX */ -#define USER_RE_DUP_MAX 9 /* int: RE_DUP_MAX */ -#define USER_POSIX2_VERSION 10 /* int: POSIX2_VERSION */ -#define USER_POSIX2_C_BIND 11 /* int: POSIX2_C_BIND */ -#define USER_POSIX2_C_DEV 12 /* int: POSIX2_C_DEV */ -#define USER_POSIX2_CHAR_TERM 13 /* int: POSIX2_CHAR_TERM */ -#define USER_POSIX2_FORT_DEV 14 /* int: POSIX2_FORT_DEV */ -#define USER_POSIX2_FORT_RUN 15 /* int: POSIX2_FORT_RUN */ -#define USER_POSIX2_LOCALEDEF 16 /* int: POSIX2_LOCALEDEF */ -#define USER_POSIX2_SW_DEV 17 /* int: POSIX2_SW_DEV */ -#define USER_POSIX2_UPE 18 /* int: POSIX2_UPE */ -#define USER_STREAM_MAX 19 /* int: POSIX2_STREAM_MAX */ -#define USER_TZNAME_MAX 20 /* int: POSIX2_TZNAME_MAX */ -#define USER_MAXID 21 /* number of valid user ids */ - -#define CTL_USER_NAMES { \ - { 0, 0 }, \ - { "cs_path", CTLTYPE_STRING }, \ - { "bc_base_max", CTLTYPE_INT }, \ - { "bc_dim_max", CTLTYPE_INT }, \ - { "bc_scale_max", CTLTYPE_INT }, \ - { "bc_string_max", CTLTYPE_INT }, \ - { "coll_weights_max", CTLTYPE_INT }, \ - { "expr_nest_max", CTLTYPE_INT }, \ - { "line_max", CTLTYPE_INT }, \ - { "re_dup_max", CTLTYPE_INT }, \ - { "posix2_version", CTLTYPE_INT }, \ - { "posix2_c_bind", CTLTYPE_INT }, \ - { "posix2_c_dev", CTLTYPE_INT }, \ - { "posix2_char_term", CTLTYPE_INT }, \ - { "posix2_fort_dev", CTLTYPE_INT }, \ - { "posix2_fort_run", CTLTYPE_INT }, \ - { "posix2_localedef", CTLTYPE_INT }, \ - { "posix2_sw_dev", CTLTYPE_INT }, \ - { "posix2_upe", CTLTYPE_INT }, \ - { "stream_max", CTLTYPE_INT }, \ - { "tzname_max", CTLTYPE_INT }, \ -} - -/* - * CTL_DEBUG definitions - * - * Second level identifier specifies which debug variable. - * Third level identifier specifies which stucture component. - */ -#define CTL_DEBUG_NAME 0 /* string: variable name */ -#define CTL_DEBUG_VALUE 1 /* int: variable value */ -#define CTL_DEBUG_MAXID 20 - -#ifdef KERNEL -#if defined(DEBUG) || defined(DIAGNOSTIC) -/* - * CTL_DEBUG variables. - * - * These are declared as separate variables so that they can be - * individually initialized at the location of their associated - * variable. The loader prevents multiple use by issuing errors - * if a variable is initialized in more than one place. They are - * aggregated into an array in debug_sysctl(), so that it can - * conveniently locate them when querried. If more debugging - * variables are added, they must also be declared here and also - * entered into the array. - */ -struct ctldebug { - char *debugname; /* name of debugging variable */ - int *debugvar; /* pointer to debugging variable */ -}; -extern struct ctldebug debug0, debug1, debug2, debug3, debug4; -extern struct ctldebug debug5, debug6, debug7, debug8, debug9; -extern struct ctldebug debug10, debug11, debug12, debug13, debug14; -extern struct ctldebug debug15, debug16, debug17, debug18, debug19; -#endif /* DEBUG */ - -extern char cpu_model[]; -extern int hw_float; -extern char machine[]; -extern char osrelease[]; -extern char ostype[]; - -/* - * Internal sysctl function calling convention: - * - * (*sysctlfn)(name, namelen, oldval, oldlenp, newval, newlen, p); - * - * The name parameter points at the next component of the name to be - * interpreted. The namelen parameter is the number of integers in - * the name. - */ -typedef int (sysctlfn) - __P((int *, u_int, void *, size_t *, void *, size_t, struct proc *)); - -sysctlfn cpu_sysctl; -sysctlfn dev_sysctl; -sysctlfn fs_sysctl; -sysctlfn hw_sysctl; -sysctlfn kern_sysctl; -sysctlfn net_sysctl; -sysctlfn ntp_sysctl; -sysctlfn vm_sysctl; - -int sysctl_int __P((void *, size_t *, void *, size_t, int *)); -int sysctl_rdint __P((void *, size_t *, void *, int)); -int sysctl_string __P((void *, size_t *, void *, size_t, char *, int)); -int sysctl_rdstring __P((void *, size_t *, void *, char *)); -int sysctl_rdstruct __P((void *, size_t *, void *, void *, int)); -int sysctl_struct __P((void *oldp, size_t *, void *, size_t, void *, int)); -void fill_eproc __P((struct proc *, struct eproc *)); - -int sysctl_clockrate __P((char *, size_t*)); -int sysctl_vnode __P((char *, size_t*)); -int sysctl_file __P((char *, size_t*)); -int sysctl_doproc __P((int *, u_int, char *, size_t*)); -int sysctl_doprof __P((int *, u_int, void *, size_t *, void *, size_t)); - -#else /* !KERNEL */ -#include <sys/cdefs.h> - -__BEGIN_DECLS -int sysctl __P((int *, u_int, void *, size_t *, void *, size_t)); -__END_DECLS -#endif /* KERNEL */ - -#endif /* !_SYS_SYSCTL_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/syslimits.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/syslimits.h deleted file mode 100644 index 502474c96de..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/syslimits.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)syslimits.h 8.1 (Berkeley) 6/2/93 - */ - -#ifndef _SYS_SYSLIMITS_H_ -#define _SYS_SYSLIMITS_H_ - -#define ARG_MAX 65536 /* max bytes for an exec function */ -#ifndef CHILD_MAX -#define CHILD_MAX 40 /* max simultaneous processes */ -#endif -#define LINK_MAX 32767 /* max file link count */ -#define MAX_CANON 255 /* max bytes in term canon input line */ -#define MAX_INPUT 255 /* max bytes in terminal input */ -#define NAME_MAX 255 /* max bytes in a file name */ -#define NGROUPS_MAX 16 /* max supplemental group id's */ -#ifndef OPEN_MAX -#define OPEN_MAX 64 /* max open files per process */ -#endif -#ifndef PATH_MAX -#define PATH_MAX 1024 /* max bytes in pathname */ -#endif -#define PIPE_BUF 512 /* max bytes for atomic pipe writes */ - -#define BC_BASE_MAX 99 /* max ibase/obase values in bc(1) */ -#define BC_DIM_MAX 2048 /* max array elements in bc(1) */ -#define BC_SCALE_MAX 99 /* max scale value in bc(1) */ -#define BC_STRING_MAX 1000 /* max const string length in bc(1) */ -#define COLL_WEIGHTS_MAX 0 /* max weights for order keyword */ -#define EXPR_NEST_MAX 32 /* max expressions nested in expr(1) */ -#define LINE_MAX 2048 /* max bytes in an input line */ -#define RE_DUP_MAX 255 /* max RE's in interval notation */ - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/syslog.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/syslog.h deleted file mode 100644 index 34f7c2a89a7..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/syslog.h +++ /dev/null @@ -1,202 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)syslog.h 8.1 (Berkeley) 6/2/93 - */ - -#ifndef _SYS_SYSLOG_H_ -#define _SYS_SYSLOG_H_ - -#define _PATH_LOG "/dev/log" - -/* - * priorities/facilities are encoded into a single 32-bit quantity, where the - * bottom 3 bits are the priority (0-7) and the top 28 bits are the facility - * (0-big number). Both the priorities and the facilities map roughly - * one-to-one to strings in the syslogd(8) source code. This mapping is - * included in this file. - * - * priorities (these are ordered) - */ -#define LOG_EMERG 0 /* system is unusable */ -#define LOG_ALERT 1 /* action must be taken immediately */ -#define LOG_CRIT 2 /* critical conditions */ -#define LOG_ERR 3 /* error conditions */ -#define LOG_WARNING 4 /* warning conditions */ -#define LOG_NOTICE 5 /* normal but significant condition */ -#define LOG_INFO 6 /* informational */ -#define LOG_DEBUG 7 /* debug-level messages */ - -#define LOG_PRIMASK 0x07 /* mask to extract priority part (internal) */ - /* extract priority */ -#define LOG_PRI(p) ((p) & LOG_PRIMASK) -#define LOG_MAKEPRI(fac, pri) (((fac) << 3) | (pri)) - -#ifdef SYSLOG_NAMES -#define INTERNAL_NOPRI 0x10 /* the "no priority" priority */ - /* mark "facility" */ -#define INTERNAL_MARK LOG_MAKEPRI(LOG_NFACILITIES, 0) -typedef struct _code { - char *c_name; - int c_val; -} CODE; - -CODE prioritynames[] = { - "alert", LOG_ALERT, - "crit", LOG_CRIT, - "debug", LOG_DEBUG, - "emerg", LOG_EMERG, - "err", LOG_ERR, - "error", LOG_ERR, /* DEPRECATED */ - "info", LOG_INFO, - "none", INTERNAL_NOPRI, /* INTERNAL */ - "notice", LOG_NOTICE, - "panic", LOG_EMERG, /* DEPRECATED */ - "warn", LOG_WARNING, /* DEPRECATED */ - "warning", LOG_WARNING, - NULL, -1, -}; -#endif - -/* facility codes */ -#define LOG_KERN (0<<3) /* kernel messages */ -#define LOG_USER (1<<3) /* random user-level messages */ -#define LOG_MAIL (2<<3) /* mail system */ -#define LOG_DAEMON (3<<3) /* system daemons */ -#define LOG_AUTH (4<<3) /* security/authorization messages */ -#define LOG_SYSLOG (5<<3) /* messages generated internally by syslogd */ -#define LOG_LPR (6<<3) /* line printer subsystem */ -#define LOG_NEWS (7<<3) /* network news subsystem */ -#define LOG_UUCP (8<<3) /* UUCP subsystem */ -#define LOG_CRON (9<<3) /* clock daemon */ -#define LOG_AUTHPRIV (10<<3) /* security/authorization messages (private) */ -#define LOG_FTP (11<<3) /* ftp daemon */ - - /* other codes through 15 reserved for system use */ -#define LOG_LOCAL0 (16<<3) /* reserved for local use */ -#define LOG_LOCAL1 (17<<3) /* reserved for local use */ -#define LOG_LOCAL2 (18<<3) /* reserved for local use */ -#define LOG_LOCAL3 (19<<3) /* reserved for local use */ -#define LOG_LOCAL4 (20<<3) /* reserved for local use */ -#define LOG_LOCAL5 (21<<3) /* reserved for local use */ -#define LOG_LOCAL6 (22<<3) /* reserved for local use */ -#define LOG_LOCAL7 (23<<3) /* reserved for local use */ - -#define LOG_NFACILITIES 24 /* current number of facilities */ -#define LOG_FACMASK 0x03f8 /* mask to extract facility part */ - /* facility of pri */ -#define LOG_FAC(p) (((p) & LOG_FACMASK) >> 3) - -#ifdef SYSLOG_NAMES -CODE facilitynames[] = { - "auth", LOG_AUTH, - "authpriv", LOG_AUTHPRIV, - "cron", LOG_CRON, - "daemon", LOG_DAEMON, - "ftp", LOG_FTP, - "kern", LOG_KERN, - "lpr", LOG_LPR, - "mail", LOG_MAIL, - "mark", INTERNAL_MARK, /* INTERNAL */ - "news", LOG_NEWS, - "security", LOG_AUTH, /* DEPRECATED */ - "syslog", LOG_SYSLOG, - "user", LOG_USER, - "uucp", LOG_UUCP, - "local0", LOG_LOCAL0, - "local1", LOG_LOCAL1, - "local2", LOG_LOCAL2, - "local3", LOG_LOCAL3, - "local4", LOG_LOCAL4, - "local5", LOG_LOCAL5, - "local6", LOG_LOCAL6, - "local7", LOG_LOCAL7, - NULL, -1, -}; -#endif - -#ifdef KERNEL -#define LOG_PRINTF -1 /* pseudo-priority to indicate use of printf */ -#endif - -/* - * arguments to setlogmask. - */ -#define LOG_MASK(pri) (1 << (pri)) /* mask for one priority */ -#define LOG_UPTO(pri) ((1 << ((pri)+1)) - 1) /* all priorities through pri */ - -/* - * Option flags for openlog. - * - * LOG_ODELAY no longer does anything. - * LOG_NDELAY is the inverse of what it used to be. - */ -#define LOG_PID 0x01 /* log the pid with each message */ -#define LOG_CONS 0x02 /* log on the console if errors in sending */ -#define LOG_ODELAY 0x04 /* delay open until first syslog() (default) */ -#define LOG_NDELAY 0x08 /* don't delay open */ -#define LOG_NOWAIT 0x10 /* don't wait for console forks: DEPRECATED */ -#define LOG_PERROR 0x20 /* log to stderr as well */ - -#ifdef KERNEL - -#else /* not KERNEL */ - -/* - * Don't use va_list in the vsyslog() prototype. Va_list is typedef'd in two - * places (<machine/varargs.h> and <machine/stdarg.h>), so if we include one - * of them here we may collide with the utility's includes. It's unreasonable - * for utilities to have to include one of them to include syslog.h, so we get - * _BSD_VA_LIST_ from <machine/ansi.h> and use it. - */ -#include <machine/ansi.h> -#include <sys/cdefs.h> - -__BEGIN_DECLS -void closelog __P((void)); -void openlog __P((const char *, int, int)); -int setlogmask __P((int)); -void syslog __P((int, const char *, ...)); -void vsyslog __P((int, const char *, _BSD_VA_LIST_)); -__END_DECLS - -#ifdef OSKIT -/* - * Silliness. - */ -typedef void (*oskit_syslogger_t)(int, const char *, ...); -extern oskit_syslogger_t oskit_libc_syslogger; -#endif - -#endif /* !KERNEL */ - -#endif diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/systm.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/systm.h deleted file mode 100644 index fc5bb5a941a..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/systm.h +++ /dev/null @@ -1,245 +0,0 @@ -/*- - * Copyright (c) 1982, 1988, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)systm.h 8.4 (Berkeley) 2/23/94 - */ - -#ifndef _SYS_SYSTM_H_ -#define _SYS_SYSTM_H_ - -#include <machine/cpufunc.h> -#include <machine/stdarg.h> - -/* - * The `securelevel' variable controls the security level of the system. - * It can only be decreased by process 1 (/sbin/init). - * - * Security levels are as follows: - * -1 permannently insecure mode - always run system in level 0 mode. - * 0 insecure mode - immutable and append-only flags make be turned off. - * All devices may be read or written subject to permission modes. - * 1 secure mode - immutable and append-only flags may not be changed; - * raw disks of mounted filesystems, /dev/mem, and /dev/kmem are - * read-only. - * 2 highly secure mode - same as (1) plus raw disks are always - * read-only whether mounted or not. This level precludes tampering - * with filesystems by unmounting them, but also inhibits running - * newfs while the system is secured. - * - * In normal operation, the system runs in level 0 mode while single user - * and in level 1 mode while multiuser. If level 2 mode is desired while - * running multiuser, it can be set in the multiuser startup script - * (/etc/rc.local) using sysctl(1). If it is desired to run the system - * in level 0 mode while multiuser, initialize the variable securelevel - * in /sys/kern/kern_sysctl.c to -1. Note that it is NOT initialized to - * zero as that would allow the kernel binary to be patched to -1. - * Without initialization, securelevel loads in the BSS area which only - * comes into existence when the kernel is loaded and hence cannot be - * patched by a stalking hacker. - */ -extern int securelevel; /* system security level */ - -extern int cold; /* nonzero if we are doing a cold boot */ -extern const char *panicstr; /* panic message */ -extern char version[]; /* system version */ -extern char copyright[]; /* system copyright */ - -extern int nblkdev; /* number of entries in bdevsw */ -extern int nchrdev; /* number of entries in cdevsw */ -extern struct swdevt *swdevt; /* swap-device information */ -extern int nswdev; /* number of swap devices */ -extern int nswap; /* size of swap space */ - -extern int selwait; /* select timeout address */ - -extern u_char curpriority; /* priority of current process */ - -extern int physmem; /* physical memory */ - -extern dev_t dumpdev; /* dump device */ -extern long dumplo; /* offset into dumpdev */ - -extern dev_t rootdev; /* root device */ -extern struct vnode *rootvp; /* vnode equivalent to above */ - -extern dev_t swapdev; /* swapping device */ -extern struct vnode *swapdev_vp;/* vnode equivalent to above */ - -extern int boothowto; /* reboot flags, from console subsystem */ - -/* - * General function declarations. - */ -int nullop __P((void)); -int enodev __P((void)); -int enoioctl __P((void)); -int enxio __P((void)); -int eopnotsupp __P((void)); -int seltrue __P((dev_t dev, int which, struct proc *p)); -int ureadc __P((int, struct uio *)); -void *hashinit __P((int count, int type, u_long *hashmask)); -void *phashinit __P((int count, int type, u_long *nentries)); - -__dead void panic __P((const char *, ...)) __dead2; -__dead void boot __P((int)) __dead2; -void tablefull __P((const char *)); -void addlog __P((const char *, ...)); -#ifndef __REACTOS__ -void log __P((int, const char *, ...)); -void printf __P((const char *, ...)); -#else -#include <oskitfreebsd.h> -#include <oskitdebug.h> -#define log(x,...) OS_DbgPrint(x,(__VA_ARGS__)) -#endif -void uprintf __P((const char *, ...)); -int sprintf __P((char *buf, const char *, ...)); -void ttyprintf __P((struct tty *, const char *, ...)); -void kprintf __P((const char *fmt, int flags, struct tty *tp, va_list ap)); - -#ifndef __REACTOS__ -void bcopy __P((const void *from, void *to, size_t len)); -#endif -void ovbcopy __P((const void *from, void *to, size_t len)); -void blkclr __P((void *buf, u_int len)); -void bzero __P((void *buf, size_t len)); - -#ifndef __REACTOS__ -void *memcpy __P((void *to, const void *from, size_t len)); -#endif - -int copystr __P((void *kfaddr, void *kdaddr, u_int len, u_int *done)); -int copyinstr __P((void *udaddr, void *kaddr, u_int len, u_int *done)); -int copyoutstr __P((void *kaddr, void *udaddr, u_int len, u_int *done)); -int copyin __P((void *udaddr, void *kaddr, u_int len)); -int copyout __P((void *kaddr, void *udaddr, u_int len)); - -int fubyte __P((void *base)); -int fuibyte __P((void *base)); -int subyte __P((void *base, int byte)); -int suibyte __P((void *base, int byte)); -int fuword __P((void *base)); -int fuiword __P((void *base)); -int suword __P((void *base, int word)); -int susword __P((void *base, int word)); -int suiword __P((void *base, int word)); - -int hzto __P((struct timeval *tv)); -void realitexpire __P((void *)); - -struct clockframe; -void hardclock __P((struct clockframe *frame)); -void softclock __P((void)); -void statclock __P((struct clockframe *frame)); - -void initclocks __P((void)); - -void startprofclock __P((struct proc *)); -void stopprofclock __P((struct proc *)); -void setstatclockrate __P((int hzrate)); - -void hardupdate __P((long)); -#include <sys/libkern.h> - -/* Initialize the world */ -extern void consinit(void); -extern void kmeminit(void); -extern void cpu_startup(void); -extern void usrinfoinit(void); -extern void rqinit(void); -extern void vfsinit(void); -extern void mbinit(void); -extern void clist_init(void); -extern void ifinit(void); -extern void domaininit(void); -extern void cpu_initclocks(void); -extern void vntblinit(void); -extern void nchinit(void); - -/* Finalize the world. */ -void shutdown_nice __P((void)); - -extern __dead void vm_pageout(void) __dead2; /* pagedaemon, called in proc 2 */ -extern __dead void vfs_update(void) __dead2; /* update, called in proc 3 */ -extern __dead void scheduler(void) __dead2; /* sched, called in process 0 */ - -/* - * Kernel to clock driver interface. - */ -void inittodr __P((time_t base)); -void resettodr __P((void)); -void startrtclock __P((void)); - -/* Timeouts */ -typedef void (timeout_t)(void *); /* actual timeout function type */ -typedef timeout_t *timeout_func_t; /* a pointer to this type */ - -void timeout(timeout_func_t, void *, int); -void untimeout(timeout_func_t, void *); -void logwakeup __P((void)); - -/* Syscalls that are called internally. */ -struct close_args { - int fd; -}; -int close __P((struct proc *, struct close_args *uap, int *retval)); -struct execve_args { - char *fname; - char **argv; - char **envv; -}; -int execve __P((struct proc *, struct execve_args *, int *retval)); -struct fork_args { - int dummy; -}; -int fork __P((struct proc *, struct fork_args *, int retval[])); -struct sync_args { - int dummy; -}; -int sync __P((struct proc *, struct sync_args *, int *retval)); -struct wait_args { - int pid; - int *status; - int options; - struct rusage *rusage; -#if defined(COMPAT_43) || defined(COMPAT_IBCS2) - int compat; /* pseudo */ -#endif -}; -int wait1 __P((struct proc *, struct wait_args *, int retval[])); - -#endif /* !_SYS_SYSTM_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/time.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/time.h deleted file mode 100644 index dc28aa72865..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/time.h +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)time.h 8.1 (Berkeley) 6/2/93 - */ - -#ifndef _SYS_TIME_H_ -#define _SYS_TIME_H_ - -/* - * Structure returned by gettimeofday(2) system call, - * and used in other calls. - */ -struct timeval { - long tv_sec; /* seconds */ - long tv_usec; /* and microseconds */ -}; - -/* - * Structure defined by POSIX.4 to be like a timeval. - */ -struct timespec { - long ts_sec; /* seconds */ - long ts_nsec; /* and nanoseconds */ -}; - -#define TIMEVAL_TO_TIMESPEC(tv, ts) { \ - (ts)->ts_sec = (tv)->tv_sec; \ - (ts)->ts_nsec = (tv)->tv_usec * 1000; \ -} -#define TIMESPEC_TO_TIMEVAL(tv, ts) { \ - (tv)->tv_sec = (ts)->ts_sec; \ - (tv)->tv_usec = (ts)->ts_nsec / 1000; \ -} - -struct timezone { - int tz_minuteswest; /* minutes west of Greenwich */ - int tz_dsttime; /* type of dst correction */ -}; -#define DST_NONE 0 /* not on dst */ -#define DST_USA 1 /* USA style dst */ -#define DST_AUST 2 /* Australian style dst */ -#define DST_WET 3 /* Western European dst */ -#define DST_MET 4 /* Middle European dst */ -#define DST_EET 5 /* Eastern European dst */ -#define DST_CAN 6 /* Canada */ - -/* Operations on timevals. */ -#define timerclear(tvp) (tvp)->tv_sec = (tvp)->tv_usec = 0 -#define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec) -#define timercmp(tvp, uvp, cmp) \ - (((tvp)->tv_sec == (uvp)->tv_sec) ? \ - ((tvp)->tv_usec cmp (uvp)->tv_usec) : \ - ((tvp)->tv_sec cmp (uvp)->tv_sec)) - -/* - * Names of the interval timers, and structure - * defining a timer setting. - */ -#define ITIMER_REAL 0 -#define ITIMER_VIRTUAL 1 -#define ITIMER_PROF 2 - -struct itimerval { - struct timeval it_interval; /* timer interval */ - struct timeval it_value; /* current value */ -}; - -/* - * Getkerninfo clock information structure - */ -struct clockinfo { - int hz; /* clock frequency */ - int tick; /* micro-seconds per hz tick */ - int stathz; /* statistics clock frequency */ - int profhz; /* profiling clock frequency */ -}; - -#ifdef KERNEL - -int itimerdecr __P((struct itimerval *itp,int usec)); -int itimerfix __P((struct timeval *)); -void microtime __P((struct timeval *)); -void timevaladd __P((struct timeval *, struct timeval *)); -void timevalfix __P((struct timeval *)); -void timevalsub __P((struct timeval *, struct timeval *)); - -#else /* not KERNEL */ -#include <time.h> - -#ifndef _POSIX_SOURCE -#include <sys/cdefs.h> - -__BEGIN_DECLS -int adjtime __P((const struct timeval *, struct timeval *)); -int getitimer __P((int, struct itimerval *)); -int gettimeofday __P((struct timeval *, struct timezone *)); -int setitimer __P((int, const struct itimerval *, struct itimerval *)); -int settimeofday __P((const struct timeval *, const struct timezone *)); -int utimes __P((const char *, const struct timeval *)); -__END_DECLS -#endif /* !POSIX */ - -#endif /* !KERNEL */ - -#endif /* !_SYS_TIME_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/ttycom.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/ttycom.h deleted file mode 100644 index 3ae6ee516e0..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/ttycom.h +++ /dev/null @@ -1,139 +0,0 @@ -/*- - * Copyright (c) 1982, 1986, 1990, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)ttycom.h 8.1 (Berkeley) 3/28/94 - */ - -#ifndef _SYS_TTYCOM_H_ -#define _SYS_TTYCOM_H_ - -#include <sys/ioccom.h> - -/* - * Tty ioctl's except for those supported only for backwards compatibility - * with the old tty driver. - */ - -/* - * Window/terminal size structure. This information is stored by the kernel - * in order to provide a consistent interface, but is not used by the kernel. - */ -struct winsize { - unsigned short ws_row; /* rows, in characters */ - unsigned short ws_col; /* columns, in characters */ - unsigned short ws_xpixel; /* horizontal size, pixels */ - unsigned short ws_ypixel; /* vertical size, pixels */ -}; - -#define TIOCMODG _IOR('t', 3, int) /* get modem control state */ -#define TIOCMODS _IOW('t', 4, int) /* set modem control state */ -#define TIOCM_LE 0001 /* line enable */ -#define TIOCM_DTR 0002 /* data terminal ready */ -#define TIOCM_RTS 0004 /* request to send */ -#define TIOCM_ST 0010 /* secondary transmit */ -#define TIOCM_SR 0020 /* secondary receive */ -#define TIOCM_CTS 0040 /* clear to send */ -#define TIOCM_CAR 0100 /* carrier detect */ -#define TIOCM_CD TIOCM_CAR -#define TIOCM_RNG 0200 /* ring */ -#define TIOCM_RI TIOCM_RNG -#define TIOCM_DSR 0400 /* data set ready */ - /* 8-10 compat */ -#define TIOCEXCL _IO('t', 13) /* set exclusive use of tty */ -#define TIOCNXCL _IO('t', 14) /* reset exclusive use of tty */ - /* 15 unused */ -#define TIOCFLUSH _IOW('t', 16, int) /* flush buffers */ - /* 17-18 compat */ -#define TIOCGETA _IOR('t', 19, struct termios) /* get termios struct */ -#define TIOCSETA _IOW('t', 20, struct termios) /* set termios struct */ -#define TIOCSETAW _IOW('t', 21, struct termios) /* drain output, set */ -#define TIOCSETAF _IOW('t', 22, struct termios) /* drn out, fls in, set */ -#define TIOCGETD _IOR('t', 26, int) /* get line discipline */ -#define TIOCSETD _IOW('t', 27, int) /* set line discipline */ - /* 127-124 compat */ -#define TIOCSBRK _IO('t', 123) /* set break bit */ -#define TIOCCBRK _IO('t', 122) /* clear break bit */ -#define TIOCSDTR _IO('t', 121) /* set data terminal ready */ -#define TIOCCDTR _IO('t', 120) /* clear data terminal ready */ -#define TIOCGPGRP _IOR('t', 119, int) /* get pgrp of tty */ -#define TIOCSPGRP _IOW('t', 118, int) /* set pgrp of tty */ - /* 117-116 compat */ -#define TIOCOUTQ _IOR('t', 115, int) /* output queue size */ -#define TIOCSTI _IOW('t', 114, char) /* simulate terminal input */ -#define TIOCNOTTY _IO('t', 113) /* void tty association */ -#define TIOCPKT _IOW('t', 112, int) /* pty: set/clear packet mode */ -#define TIOCPKT_DATA 0x00 /* data packet */ -#define TIOCPKT_FLUSHREAD 0x01 /* flush packet */ -#define TIOCPKT_FLUSHWRITE 0x02 /* flush packet */ -#define TIOCPKT_STOP 0x04 /* stop output */ -#define TIOCPKT_START 0x08 /* start output */ -#define TIOCPKT_NOSTOP 0x10 /* no more ^S, ^Q */ -#define TIOCPKT_DOSTOP 0x20 /* now do ^S ^Q */ -#define TIOCPKT_IOCTL 0x40 /* state change of pty driver */ -#define TIOCSTOP _IO('t', 111) /* stop output, like ^S */ -#define TIOCSTART _IO('t', 110) /* start output, like ^Q */ -#define TIOCMSET _IOW('t', 109, int) /* set all modem bits */ -#define TIOCMBIS _IOW('t', 108, int) /* bis modem bits */ -#define TIOCMBIC _IOW('t', 107, int) /* bic modem bits */ -#define TIOCMGET _IOR('t', 106, int) /* get all modem bits */ -#define TIOCREMOTE _IOW('t', 105, int) /* remote input editing */ -#define TIOCGWINSZ _IOR('t', 104, struct winsize) /* get window size */ -#define TIOCSWINSZ _IOW('t', 103, struct winsize) /* set window size */ -#define TIOCUCNTL _IOW('t', 102, int) /* pty: set/clr usr cntl mode */ -#define TIOCSTAT _IO('t', 101) /* simulate a control-T status msg */ -#define UIOCCMD(n) _IO('u', n) /* usr cntl op "n" */ -#define TIOCCONS _IOW('t', 98, int) /* become virtual console */ -#define TIOCSCTTY _IO('t', 97) /* become controlling tty */ -#define TIOCEXT _IOW('t', 96, int) /* pty: external processing */ -#define TIOCSIG _IO('t', 95) /* pty: generate signal */ -#define TIOCDRAIN _IO('t', 94) /* wait till output drained */ -#define TIOCMSDTRWAIT _IOW('t', 91, int) /* modem: set wait on close */ -#define TIOCMGDTRWAIT _IOR('t', 90, int) /* modem: get wait on close */ -#define TIOCTIMESTAMP _IOR('t', 89, struct timeval) /* get timestamp of - last interrupt for xntp. */ -#define TIOCDSIMICROCODE _IO('t', 85) /* Download microcode to - DSI Softmodem */ -#define TIOCSDRAINWAIT _IOW('t', 87, int) /* set ttywait timeout */ -#define TIOCGDRAINWAIT _IOR('t', 86, int) /* get ttywait timeout */ - -#define TTYDISC 0 /* termios tty line discipline */ -#define TABLDISC 3 /* tablet discipline */ -#define SLIPDISC 4 /* serial IP discipline */ -#define PPPDISC 5 /* PPP discipline */ - - -#endif /* !_SYS_TTYCOM_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/types.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/types.h deleted file mode 100644 index dbcacb42530..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/types.h +++ /dev/null @@ -1,167 +0,0 @@ -/*- - * Copyright (c) 1982, 1986, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)types.h 8.4 (Berkeley) 1/21/94 - */ - -#ifndef _SYS_TYPES_H_ -#define _SYS_TYPES_H_ - -#include <sys/cdefs.h> - -/* Machine type dependent parameters. */ -#include <machine/endian.h> - -#if !defined(_POSIX_SOURCE) -typedef unsigned char u_char; -typedef unsigned short u_short; -typedef unsigned int u_int; -typedef unsigned long u_long; -typedef unsigned short ushort; /* Sys V compatibility */ -typedef unsigned int uint; /* Sys V compatibility */ - -typedef unsigned long long u_quad_t; /* quads */ -typedef long long quad_t; -typedef quad_t * qaddr_t; - -typedef char * caddr_t; /* core address */ -typedef long daddr_t; /* disk address */ -typedef unsigned long dev_t; /* device number */ -typedef unsigned long fixpt_t; /* fixed point number */ -typedef unsigned long gid_t; /* group id */ -typedef unsigned long ino_t; /* inode number */ -typedef unsigned short mode_t; /* permissions */ -typedef unsigned short nlink_t; /* link count */ -typedef quad_t off_t; /* file offset */ -typedef long pid_t; /* process id */ -typedef long segsz_t; /* segment size */ -typedef long swblk_t; /* swap offset */ -typedef unsigned long uid_t; /* user id */ -#endif - -/* - * This belongs in unistd.h, but is placed here to ensure that programs - * casting the second parameter of lseek to off_t will get the correct - * version of lseek. - */ -#ifndef KERNEL -__BEGIN_DECLS -off_t lseek __P((int, off_t, int)); -__END_DECLS -#endif - -#ifndef _POSIX_SOURCE -/* - * minor() gives a cookie instead of an index since we don't want to - * change the meanings of bits 0-15 or waste time and space shifting - * bits 16-31 for devices that don't use them. - */ -#define major(x) ((int)(((u_int)(x) >> 8)&0xff)) /* major number */ -#define minor(x) ((int)((x)&0xffff00ff)) /* minor number */ -#define makedev(x,y) ((dev_t)(((x)<<8) | (y))) /* create dev_t */ -#endif - -#include <machine/ansi.h> -#include <machine/types.h> - -#ifdef _BSD_CLOCK_T_ -typedef _BSD_CLOCK_T_ clock_t; -#undef _BSD_CLOCK_T_ -#endif - -#ifdef _BSD_SIZE_T_ -typedef _BSD_SIZE_T_ size_t; -#undef _BSD_SIZE_T_ -#endif - -#ifdef _BSD_SSIZE_T_ -typedef _BSD_SSIZE_T_ ssize_t; -#undef _BSD_SSIZE_T_ -#endif - -#ifdef _BSD_TIME_T_ -typedef _BSD_TIME_T_ time_t; -#undef _BSD_TIME_T_ -#endif - -#ifndef _POSIX_SOURCE -#define NBBY 8 /* number of bits in a byte */ - -/* - * Select uses bit masks of file descriptors in longs. These macros - * manipulate such bit fields (the filesystem macros use chars). - * FD_SETSIZE may be defined by the user, but the default here should - * be enough for most uses. - */ -#ifndef FD_SETSIZE -#define FD_SETSIZE 256 -#endif - -typedef long fd_mask; -#define NFDBITS (sizeof(fd_mask) * NBBY) /* bits per mask */ - -#ifndef howmany -#define howmany(x, y) (((x)+((y)-1))/(y)) -#endif - -typedef struct fd_set { - fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)]; -} fd_set; - -#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS))) -#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS))) -#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS))) -#define FD_COPY(f, t) bcopy(f, t, sizeof(*(f))) -#define FD_ZERO(p) bzero(p, sizeof(*(p))) - -#if defined(__STDC__) && defined(KERNEL) -/* - * Forward structure declarations for function prototypes. We include the - * common structures that cross subsystem boundaries here; others are mostly - * used in the same place that the structure is defined. - */ -struct proc; -struct pgrp; -struct ucred; -struct rusage; -struct file; -struct buf; -struct tty; -struct uio; -#endif -#endif /* !_POSIX_SOURCE */ -#endif /* !_SYS_TYPES_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/ucred.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/ucred.h deleted file mode 100644 index 0d74bd9d02e..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/ucred.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)ucred.h 8.2 (Berkeley) 1/4/94 - */ - -#ifndef _SYS_UCRED_H_ -#define _SYS_UCRED_H_ - -/* - * Credentials. - */ -struct ucred { - u_short cr_ref; /* reference count */ - uid_t cr_uid; /* effective user id */ - short cr_ngroups; /* number of groups */ - gid_t cr_groups[NGROUPS]; /* groups */ -}; -#define cr_gid cr_groups[0] -#define NOCRED ((struct ucred *)-1) /* no credential available */ -#define FSCRED ((struct ucred *)-2) /* filesystem credential */ - -#ifdef KERNEL -#define crhold(cr) (cr)->cr_ref++ -struct ucred *crget(void); -struct ucred *crcopy(struct ucred *); -struct ucred *crdup(struct ucred *); -extern void crfree(struct ucred *); -extern int suser(struct ucred *, u_short *); -int groupmember __P((gid_t, struct ucred *)); - -#endif /* KERNEL */ - -#endif /* !_SYS_UCRED_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/uio.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/uio.h deleted file mode 100644 index 35e46ab1021..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/uio.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)uio.h 8.5 (Berkeley) 2/22/94 - */ - -#ifndef _SYS_UIO_H_ -#define _SYS_UIO_H_ - -/* - * XXX - * iov_base should be a void *. - */ -struct iovec { - char *iov_base; /* Base address. */ - size_t iov_len; /* Length. */ -}; - -enum uio_rw { UIO_READ, UIO_WRITE }; - -/* Segment flag values. */ -enum uio_seg { - UIO_USERSPACE, /* from user data space */ - UIO_SYSSPACE, /* from system space */ - UIO_USERISPACE, /* from user I space */ - UIO_NOCOPY /* don't copy, already in object */ -}; - -#ifdef KERNEL -struct uio { - struct iovec *uio_iov; - int uio_iovcnt; - off_t uio_offset; - int uio_resid; - enum uio_seg uio_segflg; - enum uio_rw uio_rw; - struct proc *uio_procp; -}; - -/* - * Limits - */ -#define UIO_MAXIOV 1024 /* max 1K of iov's */ -#define UIO_SMALLIOV 8 /* 8 on stack, else malloc */ -#endif /* KERNEL */ - -#ifdef KERNEL - -int uiomove __P((caddr_t, int, struct uio *)); - -#else /* !KERNEL */ - -#include <sys/cdefs.h> - -__BEGIN_DECLS -ssize_t readv __P((int, const struct iovec *, int)); -ssize_t writev __P((int, const struct iovec *, int)); -__END_DECLS - -#endif /* KERNEL */ - -#endif /* !_SYS_UIO_H_ */ diff --git a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/unistd.h b/reactos/lib/oskittcp/include/freebsd/src/sys/sys/unistd.h deleted file mode 100644 index cb4b33e1299..00000000000 --- a/reactos/lib/oskittcp/include/freebsd/src/sys/sys/unistd.h +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)unistd.h 8.2 (Berkeley) 1/7/94 - */ - -#ifndef _SYS_UNISTD_H_ -#define _SYS_UNISTD_H_ - -/* compile-time symbolic constants */ -#define _POSIX_JOB_CONTROL /* implementation supports job control */ - -/* - * This feature does not work for root according to POSIX 1003.1. - * We use the saved IDs in seteuid/setegid, which are not currently - * part of the POSIX 1003.1 specification. - */ -#define _POSIX_SAVED_IDS /* saved set-user-ID and set-group-ID */ - -#define _POSIX_VERSION 198808L -#define _POSIX2_VERSION 199212L - -/* execution-time symbolic constants */ - /* chown requires appropriate privileges */ -#define _POSIX_CHOWN_RESTRICTED 1 - /* too-long path components generate errors */ -#define _POSIX_NO_TRUNC 1 - /* may disable terminal special characters */ -#define _POSIX_VDISABLE 0xff - -/* access function */ -#define F_OK 0 /* test for existence of file */ -#define X_OK 0x01 /* test for execute or search permission */ -#define W_OK 0x02 /* test for write permission */ -#define R_OK 0x04 /* test for read permission */ - -/* whence values for lseek(2) */ -#define SEEK_SET 0 /* set file offset to offset */ -#define SEEK_CUR 1 /* set file offset to current plus offset */ -#define SEEK_END 2 /* set file offset to EOF plus offset */ - -#ifndef _POSIX_SOURCE -/* whence values for lseek(2); renamed by POSIX 1003.1 */ -#define L_SET SEEK_SET -#define L_INCR SEEK_CUR -#define L_XTND SEEK_END -#endif - -/* configurable pathname variables */ -#define _PC_LINK_MAX 1 -#define _PC_MAX_CANON 2 -#define _PC_MAX_INPUT 3 -#define _PC_NAME_MAX 4 -#define _PC_PATH_MAX 5 -#define _PC_PIPE_BUF 6 -#define _PC_CHOWN_RESTRICTED 7 -#define _PC_NO_TRUNC 8 -#define _PC_VDISABLE 9 - -/* configurable system variables */ -#define _SC_ARG_MAX 1 -#define _SC_CHILD_MAX 2 -#define _SC_CLK_TCK 3 -#define _SC_NGROUPS_MAX 4 -#define _SC_OPEN_MAX 5 -#define _SC_JOB_CONTROL 6 -#define _SC_SAVED_IDS 7 -#define _SC_VERSION 8 -#define _SC_BC_BASE_MAX 9 -#define _SC_BC_DIM_MAX 10 -#define _SC_BC_SCALE_MAX 11 -#define _SC_BC_STRING_MAX 12 -#define _SC_COLL_WEIGHTS_MAX 13 -#define _SC_EXPR_NEST_MAX 14 -#define _SC_LINE_MAX 15 -#define _SC_RE_DUP_MAX 16 -#define _SC_2_VERSION 17 -#define _SC_2_C_BIND 18 -#define _SC_2_C_DEV 19 -#define _SC_2_CHAR_TERM 20 -#define _SC_2_FORT_DEV 21 -#define _SC_2_FORT_RUN 22 -#define _SC_2_LOCALEDEF 23 -#define _SC_2_SW_DEV 24 -#define _SC_2_UPE 25 -#define _SC_STREAM_MAX 26 -#define _SC_TZNAME_MAX 27 - -/* configurable system strings */ -#define _CS_PATH 1 - -#endif /* !_SYS_UNISTD_H_ */ diff --git a/reactos/lib/oskittcp/include/memtrack.h b/reactos/lib/oskittcp/include/memtrack.h deleted file mode 100644 index b4c0bbc6b49..00000000000 --- a/reactos/lib/oskittcp/include/memtrack.h +++ /dev/null @@ -1,73 +0,0 @@ -#ifndef MEMTRACK_H -#define MEMTRACK_H - -#ifndef FOURCC -#define FOURCC(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d)) -#endif - -#define FBSD_MALLOC FOURCC('d','s','b','f') -#define EXALLOC_TAG FOURCC('E','x','A','l') - -#ifdef MEMTRACK -#define MTMARK() TrackDumpFL(__FILE__, __LINE__) -#define NdisAllocateBuffer(x,y,z,a,b) { \ - NdisAllocateBuffer(x,y,z,a,b); \ - if( *x == NDIS_STATUS_SUCCESS ) { \ - Track(NDIS_BUFFER_TAG, *y); \ - } \ -} -#define NdisAllocatePacket(x,y,z) { \ - NdisAllocatePacket(x,y,z); \ - if( *x == NDIS_STATUS_SUCCESS ) { \ - Track(NDIS_PACKET_TAG, *y); \ - } \ -} -#define FreeNdisPacket(x) { TI_DbgPrint(MID_TRACE,("Deleting Packet %x\n", x)); FreeNdisPacketX(x); } -#define NdisFreePacket(x) { Untrack(x); NdisFreePacket(x); } -#define NdisFreeBuffer(x) { Untrack(x); NdisFreeBuffer(x); } -#define exAllocatePool(x,y) ExAllocatePoolX(x,y,__FILE__,__LINE__) -#define exAllocatePoolWithTag(x,y,z) ExAllocatePoolX(x,y,__FILE__,__LINE__) -#define exFreePool(x) ExFreePoolX(x,__FILE__,__LINE__) - -extern LIST_ENTRY AllocatedObjectsHead; -extern KSPIN_LOCK AllocatedObjectsLock; - -typedef struct _ALLOCATION_TRACKER { - LIST_ENTRY Entry; - DWORD Tag; - PVOID Thing; - PCHAR FileName; - DWORD LineNo; -} ALLOCATION_TRACKER, *PALLOCATION_TRACKER; - -VOID TrackingInit(); -VOID TrackWithTag( DWORD Tag, PVOID Thing, PCHAR File, DWORD Line ); -#define Track(Tag,Thing) TrackWithTag(Tag,Thing,__FILE__,__LINE__) -VOID UntrackFL( PCHAR File, DWORD Line, PVOID Thing ); -#define Untrack(Thing) UntrackFL(__FILE__,__LINE__,Thing) -VOID TrackDumpFL( PCHAR File, DWORD Line ); -#define TrackDump() TrackDumpFL(__FILE__,__LINE__) -VOID TrackTag( DWORD Tag ); - -static inline PVOID ExAllocatePoolX( POOL_TYPE type, SIZE_T size, PCHAR File, ULONG Line ) { - PVOID Out = ExAllocatePool( type, size ); - if( Out ) TrackWithTag( EXALLOC_TAG, Out, File, Line ); - return Out; -} -static inline VOID ExFreePoolX( PVOID Data, PCHAR File, ULONG Line ) { - UntrackFL(File, Line, Data); - ExFreePool(Data); -} - -#define MEMTRACK_MAX_TAGS_TO_TRACK 64 -#else -#define MTMARK() -#define Track(x,y) -#define TrackingInit() -#define TrackDump() -#define Untrack(x) -#define TrackTag(x) -#define FreeNdisPacket FreeNdisPacketX -#endif - -#endif/*MEMMTRAC_H*/ diff --git a/reactos/lib/oskittcp/include/oskitdebug.h b/reactos/lib/oskittcp/include/oskitdebug.h deleted file mode 100644 index c263b4b8575..00000000000 --- a/reactos/lib/oskittcp/include/oskitdebug.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS TCP/IP protocol driver - * FILE: include/debug.h - * PURPOSE: Debugging support macros - * DEFINES: DBG - Enable debug output - * NASSERT - Disable assertions - */ -#ifndef __OSKITDEBUG_H -#define __OSKITDEBUG_H - -#define OSK_NORMAL_MASK 0x000000FF -#define OSK_SPECIAL_MASK 0xFFFFFF00 -#define OSK_MIN_TRACE 0x00000001 -#define OSK_MID_TRACE 0x00000002 -#define OSK_MAX_TRACE 0x00000003 - -#define OSK_DEBUG_CHECK 0x00000100 -#define OSK_DEBUG_MEMORY 0x00000200 -#define OSK_DEBUG_BUFFER 0x00000400 -#define OSK_DEBUG_IRP 0x00000800 -#define OSK_DEBUG_REFCOUNT 0x00001000 -#define OSK_DEBUG_ADDRFILE 0x00002000 -#define OSK_DEBUG_DATALINK 0x00004000 -#define OSK_DEBUG_ARP 0x00008000 -#define OSK_DEBUG_IP 0x00010000 -#define OSK_DEBUG_UDP 0x00020000 -#define OSK_DEBUG_TCP 0x00040000 -#define OSK_DEBUG_ICMP 0x00080000 -#define OSK_DEBUG_ROUTER 0x00100000 -#define OSK_DEBUG_RCACHE 0x00200000 -#define OSK_DEBUG_NCACHE 0x00400000 -#define OSK_DEBUG_CPOINT 0x00800000 -#define OSK_DEBUG_ULTRA 0xFFFFFFFF - -#include <roscfg.h> -#include <oskittypes.h> - -#ifdef DBG - -extern OSK_UINT OskitDebugTraceLevel; - -#ifdef _MSC_VER - -#define OS_DbgPrint(_t_, _x_) \ - if (((OskitDebugTraceLevel & OSK_NORMAL_MASK) >= _t_) || \ - ((OskitDebugTraceLevel & _t_) > OSK_NORMAL_MASK)) { \ - DbgPrint("(%s:%d) ", __FILE__, __LINE__); \ - DbgPrint _x_ ; \ - } - -#else /* _MSC_VER */ - -#define OS_DbgPrint(_t_, _x_) \ - if (((OskitDebugTraceLevel & OSK_NORMAL_MASK) >= _t_) || \ - ((OskitDebugTraceLevel & _t_) > OSK_NORMAL_MASK)) { \ - DbgPrint("(%s:%d)(%s) ", __FILE__, __LINE__, __FUNCTION__); \ - DbgPrint _x_ ; \ - } - -#endif /* _MSC_VER */ - -#if 0 -#ifdef ASSERT -#undef ASSERT -#endif - -#ifdef NASSERT -#define ASSERT(x) -#else /* NASSERT */ -#define ASSERT(x) if (!(x)) { OS_DbgPrint(MIN_TRACE, ("Assertion "#x" failed at %s:%d\n", __FILE__, __LINE__)); KeBugCheck(0); } -#endif /* NASSERT */ -#endif - -#define ASSERT_IRQL(x) ASSERT(KeGetCurrentIrql() <= (x)) - -#else /* DBG */ - -#define OS_DbgPrint(_t_, _x_) - -#if 0 -#define ASSERT_IRQL(x) -#define ASSERT(x) -#endif - -#endif /* DBG */ - - -#define assert(x) ASSERT(x) -#define assert_irql(x) ASSERT_IRQL(x) - -#endif /* __OSKITDEBUG_H */ - -/* EOF */ diff --git a/reactos/lib/oskittcp/include/oskiterrno.h b/reactos/lib/oskittcp/include/oskiterrno.h deleted file mode 100644 index d8d2efa8ed6..00000000000 --- a/reactos/lib/oskittcp/include/oskiterrno.h +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1989, 1993 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)errno.h 8.5 (Berkeley) 1/21/94 - */ - -#ifndef _OSK_SYS_ERRNO_H_ -#define _OSK_SYS_ERRNO_H_ - -#ifndef __REACTOS__ -#ifndef KERNEL -extern int errno; /* global error number */ -#endif -#endif - -#define OSK_EPERM 1 /* Operation not permitted */ -#define OSK_ENOENT 2 /* No such file or directory */ -#define OSK_ESRCH 3 /* No such process */ -#define OSK_EINTR 4 /* Interrupted system call */ -#define OSK_EIO 5 /* Input/output error */ -#define OSK_ENXIO 6 /* Device not configured */ -#define OSK_E2BIG 7 /* Argument list too long */ -#define OSK_ENOEXEC 8 /* Exec format error */ -#define OSK_EBADF 9 /* Bad file descriptor */ -#define OSK_ECHILD 10 /* No child processes */ -#define OSK_EDEADLK 11 /* Resource deadlock avoided */ -/* 11 was OSK_EAGAIN */ -#define OSK_ENOMEM 12 /* Cannot allocate memory */ -#define OSK_EACCES 13 /* Permission denied */ -#define OSK_EFAULT 14 /* Bad address */ -#ifndef _POSIX_SOURCOSK_E -#define OSK_ENOTBLK 15 /* Block device required */ -#endif -#define OSK_EBUSY 16 /* Device busy */ -#define OSK_EEXIST 17 /* File exists */ -#define OSK_EXDEV 18 /* Cross-device link */ -#define OSK_ENODEV 19 /* Operation not supported by device */ -#define OSK_ENOTDIR 20 /* Not a directory */ -#define OSK_EISDIR 21 /* Is a directory */ -#define OSK_EINVAL 22 /* Invalid argument */ -#define OSK_ENFILE 23 /* Too many open files in system */ -#define OSK_EMFILE 24 /* Too many open files */ -#define OSK_ENOTTY 25 /* Inappropriate ioctl for device */ -#ifndef _POSIX_SOURCE -#define OSK_ETXTBSY 26 /* Text file busy */ -#endif -#define OSK_EFBIG 27 /* File too large */ -#define OSK_ENOSPC 28 /* No space left on device */ -#define OSK_ESPIPE 29 /* Illegal seek */ -#define OSK_EROFS 30 /* Read-only file system */ -#define OSK_EMLINK 31 /* Too many links */ -#define OSK_EPIPE 32 /* Broken pipe */ - -/* math software */ -#define OSK_EDOM 33 /* Numerical argument out of domain */ -#define OSK_ERANGE 34 /* Result too large */ - -/* non-blocking and interrupt i/o */ -#define OSK_EAGAIN 35 /* Resource temporarily unavailable */ -#ifndef _POSIX_SOURCE -#define OSK_EWOULDBLOCK EAGAIN /* Operation would block */ -#define OSK_EINPROGRESS 36 /* Operation now in progress */ -#define OSK_EALREADY 37 /* Operation already in progress */ - -/* ipc/network software -- argument errors */ -#define OSK_ENOTSOCK 38 /* Socket operation on non-socket */ -#define OSK_EDESTADDRREQ 39 /* Destination address required */ -#define OSK_EMSGSIZE 40 /* Message too long */ -#define OSK_EPROTOTYPE 41 /* Protocol wrong type for socket */ -#define OSK_ENOPROTOOPT 42 /* Protocol not available */ -#define OSK_EPROTONOSUPPORT 43 /* Protocol not supported */ -#define OSK_ESOCKTNOSUPPORT 44 /* Socket type not supported */ -#define OSK_EOPNOTSUPP 45 /* Operation not supported */ -#define OSK_EPFNOSUPPORT 46 /* Protocol family not supported */ -#define OSK_EAFNOSUPPORT 47 /* Address family not supported by protocol family */ -#define OSK_EADDRINUSE 48 /* Address already in use */ -#define OSK_EADDRNOTAVAIL 49 /* Can't assign requested address */ - -/* ipc/network software -- operational errors */ -#define OSK_ENETDOWN 50 /* Network is down */ -#define OSK_ENETUNREACH 51 /* Network is unreachable */ -#define OSK_ENETRESET 52 /* Network dropped connection on reset */ -#define OSK_ECONNABORTED 53 /* Software caused connection abort */ -#define OSK_ECONNRESET 54 /* Connection reset by peer */ -#define OSK_ENOBUFS 55 /* No buffer space available */ -#define OSK_EISCONN 56 /* Socket is already connected */ -#define OSK_ENOTCONN 57 /* Socket is not connected */ -#define OSK_ESHUTDOWN 58 /* Can't send after socket shutdown */ -#define OSK_ETOOMANYREFS 59 /* Too many references: can't splice */ -#define OSK_ETIMEDOUT 60 /* Operation timed out */ -#define OSK_ECONNREFUSED 61 /* Connection refused */ - -#define OSK_ELOOP 62 /* Too many levels of symbolic links */ -#endif /* _POSIX_SOURCE */ -#define OSK_ENAMETOOLONG 63 /* File name too long */ - -/* should be rearranged */ -#ifndef _POSIX_SOURCE -#define OSK_EHOSTDOWN 64 /* Host is down */ -#define OSK_EHOSTUNREACH 65 /* No route to host */ -#endif /* _POSIX_SOURCE */ -#define OSK_ENOTEMPTY 66 /* Directory not empty */ - -/* quotas & mush */ -#ifndef _POSIX_SOURCE -#define OSK_EPROCLIM 67 /* Too many processes */ -#define OSK_EUSERS 68 /* Too many users */ -#define OSK_EDQUOT 69 /* Disc quota exceeded */ - -/* Network File System */ -#define OSK_ESTALE 70 /* Stale NFS file handle */ -#define OSK_EREMOTE 71 /* Too many levels of remote in path */ -#define OSK_EBADRPC 72 /* RPC struct is bad */ -#define OSK_ERPCMISMATCH 73 /* RPC version wrong */ -#define OSK_EPROGUNAVAIL 74 /* RPC prog. not avail */ -#define OSK_EPROGMISMATCH 75 /* Program version wrong */ -#define OSK_EPROCUNAVAIL 76 /* Bad procedure for program */ -#endif /* _POSIX_SOURCE */ - -#define OSK_ENOLCK 77 /* No locks available */ -#define OSK_ENOSYS 78 /* Function not implemented */ - -#ifndef _POSIX_SOURCE -#define OSK_EFTYPE 79 /* Inappropriate file type or format */ -#define OSK_EAUTH 80 /* Authentication error */ -#define OSK_ENEEDAUTH 81 /* Need authenticator */ -#define OSK_ELAST 81 /* Must be equal largest errno */ -#endif /* _POSIX_SOURCE */ - -#ifdef KERNEL -/* pseudo-errors returned inside kernel to modify return to process */ -#define OSK_ERESTART -1 /* restart syscall */ -#define OSK_EJUSTRETURN -2 /* don't modify regs, just return */ -#endif - -#endif/*OSK_SYS_ERRNO*/ diff --git a/reactos/lib/oskittcp/include/oskitfreebsd.h b/reactos/lib/oskittcp/include/oskitfreebsd.h deleted file mode 100644 index 36ba212f1b9..00000000000 --- a/reactos/lib/oskittcp/include/oskitfreebsd.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef _OSKITFREEBSD_H -#define _OSKITFREEBSD_H - -extern void oskittcp_die(const char *file, int line); - -#define printf DbgPrint -#define ovbcopy(x,y,z) bcopy(x,y,z) -#define bzero(x,y) memset(x,0,y) -#define bcopy memcpy -#define panic(...) do { DbgPrint(__VA_ARGS__); \ - oskittcp_die(__FILE__,__LINE__); } while(0) -#define kmem_malloc(x,y,z) malloc(y) - -#endif//_OSKITFREEBSD_H diff --git a/reactos/lib/oskittcp/include/oskittcp.h b/reactos/lib/oskittcp/include/oskittcp.h deleted file mode 100644 index b98b2fe2df7..00000000000 --- a/reactos/lib/oskittcp/include/oskittcp.h +++ /dev/null @@ -1,106 +0,0 @@ -#ifndef OSKITTCP_H -#define OSKITTCP_H - -#include <roscfg.h> -#ifdef KERNEL -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/malloc.h> -#include <sys/mbuf.h> -#include <sys/protosw.h> -#include <sys/socket.h> -#include <sys/socketvar.h> -#include <sys/errno.h> -#include <sys/queue.h> -#include <sys/kernel.h> - -#include <net/if.h> -#include <net/route.h> - -#include <netinet/in.h> -#include <netinet/in_systm.h> -#include <netinet/ip.h> -#include <netinet/in_pcb.h> -#include <netinet/ip_var.h> -#include <netinet/tcp.h> -#include <netinet/tcp_fsm.h> -#include <netinet/tcp_seq.h> -#include <netinet/tcp_timer.h> -#include <netinet/tcp_var.h> -#include <netinet/tcpip.h> - -struct connect_args { - int s; - caddr_t name; - int namelen; -}; -#endif - -#include <oskittypes.h> - -#define IPHDR_SIZE 20 - -typedef void (*OSKITTCP_SOCKET_DATA_AVAILABLE) - ( void *ClientData, - void *WhichSocket, - void *WhichConnection, - OSK_PCHAR Data, - OSK_UINT Len ); -typedef void (*OSKITTCP_SOCKET_CONNECT_INDICATION) - ( void *ClientData, - void *WhichSocket, - void *WhichConnection ); -typedef void (*OSKITTCP_SOCKET_CLOSE_INDICATION) - ( void *WhichSocket ); -typedef void (*OSKITTCP_SOCKET_PENDING_CONNECT_INDICATION) - ( void *WhichSocket ); -typedef void (*OSKITTCP_SOCKET_RESET_INDICATION) - ( void *WhichSocket ); -typedef int (*OSKITTCP_SEND_PACKET) - ( void *ClientData, - void *WhichSocket, - void *WhichConnection, - OSK_PCHAR Data, - OSK_UINT Len ); -typedef int (*OSKITTCP_NEED_BIND) - ( void *ClientData, - void *WhichSocket, - void *WhichConnection, - struct sockaddr *address, - OSK_UINT addrlen, - OSK_UINT reuseport ); - -typedef struct _OSKITTCP_EVENT_HANDLERS { - void *ClientData; - OSKITTCP_SOCKET_DATA_AVAILABLE SocketDataAvailable; - OSKITTCP_SOCKET_CONNECT_INDICATION SocketConnectIndication; - OSKITTCP_SOCKET_CLOSE_INDICATION SocketCloseIndication; - OSKITTCP_SOCKET_PENDING_CONNECT_INDICATION SocketPendingConnectIndication; - OSKITTCP_SOCKET_RESET_INDICATION SocketResetIndication; - OSKITTCP_SEND_PACKET PacketSend; - OSKITTCP_NEED_BIND Bind; -} OSKITTCP_EVENT_HANDLERS, *POSKITTCP_EVENT_HANDLERS; - -extern OSKITTCP_EVENT_HANDLERS OtcpEvent; - -extern void InitOskitTCP(); -extern void DeinitOskitTCP(); -extern void TimerOskitTCP(); -extern int OskitTCPSocket( void *Connection, void **ConnectionContext, - int Af, int Type, int Proto ); -extern void RegisterOskitTCPEventHandlers -( POSKITTCP_EVENT_HANDLERS EventHandlers ); -extern void OskitTCPReceiveDatagram( OSK_PCHAR Data, OSK_UINT Len, - OSK_UINT IpHeaderLen ); - -#undef errno - -#define malloc(x,...) fbsd_malloc(x,__FILE__,__LINE__) -#define free(x,...) fbsd_free(x,__FILE__,__LINE__) - -/* Error codes */ -#include <oskiterrno.h> - -#define SOCK_MAXADDRLEN 255 - -#endif/*OSKITTCP_H*/ diff --git a/reactos/lib/oskittcp/include/oskittypes.h b/reactos/lib/oskittcp/include/oskittypes.h deleted file mode 100644 index 1040980e2db..00000000000 --- a/reactos/lib/oskittcp/include/oskittypes.h +++ /dev/null @@ -1,60 +0,0 @@ - -#ifndef OSKITTYPES_H -#define OSKITTYPES_H - -typedef struct sockaddr OSK_SOCKADDR; -typedef unsigned char *OSK_PCHAR; -typedef unsigned int OSK_UINT; -typedef unsigned short OSK_UI16; -typedef char * osk_caddr_t; - -#define SWAP_FAMILY_LEN(sabuf,s) \ - (sabuf)->sin_family = htons((sabuf)->sin_family) -/* do { s = (sabuf)->sin_family; (sabuf)->sin_family = (sabuf)->sin_len; (sabuf)->sin_len = s; } while(0); */ - -/* - * The ifaddr structure contains information about one address - * of an interface. They are maintained by the different address families, - * are allocated and attached when an address is set, and are linked - * together so all addresses for an interface can be located. - */ -struct ifaddr { - struct sockaddr *ifa_addr; /* address of interface */ - struct sockaddr *ifa_dstaddr; /* other end of p-to-p link */ -#define ifa_broadaddr ifa_dstaddr /* broadcast address interface */ - struct sockaddr *ifa_netmask; /* used to determine subnet */ - u_short ifa_flags; /* mostly rt_flags for cloning */ - short ifa_refcnt; /* extra to malloc for link info */ - int ifa_metric; /* cost of going out this interface */ - u_short ifa_mtu; /* MTU */ -}; -#define IFA_ROUTE RTF_UP /* route installed */ -#define OSK_IFQ_MAXLEN 50 - -/* - * These numbers are used by reliable protocols for determining - * retransmission behavior and are included in the routing structure. - */ -struct rt_metrics { - u_long rmx_locks; /* Kernel must leave these values alone */ - u_long rmx_mtu; /* MTU for this path */ - u_long rmx_hopcount; /* max hops expected */ - u_long rmx_expire; /* lifetime for route, e.g. redirect */ - u_long rmx_recvpipe; /* inbound delay-bandwith product */ - u_long rmx_sendpipe; /* outbound delay-bandwith product */ - u_long rmx_ssthresh; /* outbound gateway buffer limit */ - u_long rmx_rtt; /* estimated round trip time */ - u_long rmx_rttvar; /* estimated rtt variance */ - u_long rmx_pksent; /* packets sent using this route */ - u_long rmx_filler[4]; /* will be used for T/TCP later */ -}; - -struct rtentry { - struct sockaddr *rt_gateway; /* value */ - u_long rt_flags; /* up/down?, host/net */ - struct ifaddr rt_ifa; /* the answer: interface to use */ - struct rt_metrics rt_rmx; /* metrics used by rx'ing protocols */ - u_long rt_mtu; /* Path MTU */ -}; - -#endif/*OSKITTYPES_H*/ diff --git a/reactos/lib/oskittcp/makefile b/reactos/lib/oskittcp/makefile deleted file mode 100644 index e555c1b23fc..00000000000 --- a/reactos/lib/oskittcp/makefile +++ /dev/null @@ -1,83 +0,0 @@ - - -# $Id: makefile,v 1.1 2004/05/02 07:21:58 arty Exp $ - -PATH_TO_TOP = ../.. - -TARGET_BOOTSTRAP = yes - -TARGET_TYPE = library - -TARGET_NAME = oskittcp - -TARGET_CFLAGS = -g -D__REACTOS__=1 -DKERNEL -Iinclude/freebsd -Iinclude/freebsd/sys/include -Iinclude/freebsd/src/sys -Iinclude/freebsd/dev/include -Iinclude/freebsd/net/include -Iinclude -I$(PATH_TO_TOP)/w32api/include -I$(PATH_TO_TOP)/include -DMEMTRACK - -# require os code to explicitly request A/W version of structs/functions -TARGET_CFLAGS += -D_DISABLE_TIDENTS - -TARGET_ASFLAGS = -I $(PATH_TO_TOP)/include - -TARGET_LFLAGS = -Wl,--file-alignment,0x1000 \ - -Wl,--section-alignment,0x1000 \ - -nostartfiles -nostdlib \ - -TARGET_GCCLIBS = gcc - -TARGET_BASE = 0x79f60000 - -TARGET_PATH = - -REACTOS_OBJECTS = \ - oskittcp/defaults.o \ - oskittcp/in.o \ - oskittcp/in_cksum.o \ - oskittcp/in_pcb.o \ - oskittcp/in_proto.o \ - oskittcp/in_rmx.o \ - oskittcp/inet_ntoa.o \ - oskittcp/interface.o \ - oskittcp/ip_input.o \ - oskittcp/ip_output.o \ - oskittcp/kern_clock.o \ - oskittcp/kern_subr.o \ - oskittcp/malloc.o \ - oskittcp/param.o \ - oskittcp/radix.o \ - oskittcp/random.o \ - oskittcp/rtsock.o \ - oskittcp/scanc.o \ - oskittcp/sleep.o \ - oskittcp/tcp_input.o \ - oskittcp/tcp_output.o \ - oskittcp/tcp_subr.o \ - oskittcp/tcp_usrreq.o \ - oskittcp/tcp_debug.o \ - oskittcp/tcp_timer.o \ - oskittcp/uipc_domain.o \ - oskittcp/uipc_mbuf.o \ - oskittcp/uipc_socket.o \ - oskittcp/uipc_socket2.o - -TARGET_OBJECTS = $(FREEBSD_OBJECTS) $(REACTOS_OBJECTS) -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: csr/TAGS dbg/TAGS ldr/TAGS main/TAGS rtl/TAGS stdio/TAGS stdlib/TAGS string/TAGS stubs/TAGS - etags -i csr/TAGS -i dbg/TAGS -i ldr/TAGS -i main/TAGS -i rtl/TAGS -i stdio/TAGS -i stdlib/TAGS -i string/TAGS -i stubs/TAGS - - -docu: - doxygen Doxyfile - -.PHONY: docu - - -# EOF diff --git a/reactos/lib/oskittcp/oskittcp/.cvsignore b/reactos/lib/oskittcp/oskittcp/.cvsignore deleted file mode 100644 index 31dc3078b3a..00000000000 --- a/reactos/lib/oskittcp/oskittcp/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -*.d -*.o diff --git a/reactos/lib/oskittcp/oskittcp/defaults.c b/reactos/lib/oskittcp/oskittcp/defaults.c deleted file mode 100644 index 0133e6531d4..00000000000 --- a/reactos/lib/oskittcp/oskittcp/defaults.c +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright (c) 1996-1998 University of Utah and the Flux Group. - * All rights reserved. - * - * This file is part of the Flux OSKit. The OSKit is free software, also known - * as "open source;" you can redistribute it and/or modify it under the terms - * of the GNU General Public License (GPL), version 2, as published by the Free - * Software Foundation (FSF). To explore alternate licensing terms, contact - * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. - * - * The OSKit 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 GPL for more details. You should have - * received a copy of the GPL along with the OSKit; see the file COPYING. If - * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. - */ -/* - * Routines necessary for the bsdnet code. - */ - -#include <sys/types.h> -#include <sys/param.h> -#include <vm/vm.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/domain.h> -#include "net/netisr.h" - -int oskit_cpl; /* for machine/spl.h */ -int bootverbose; /* networking code wants to know whether booting - is to be verbose */ -int securelevel = 3; /* used in ip_fw.c:ip_fw_ctl -- make it > 2 */ - -vm_map_t mb_map; /* this is passed in kmem_alloc, but ignored there */ - -struct proc proc0; -struct proc *curproc = &proc0; - -struct domain localdomain; /* see uipc_domain.c ADDDOMAIN macro */ - -/* ---------------------------------------------------------------------- */ - -/* - * find a process by pid - */ -struct proc * -pfind(pid_t pid) -{ - printf(__FUNCTION__" called, pid=%d, returning x%p\n", - (int)pid, (void*)&proc0); - return &proc0; -} - -/* - * signal a process - */ -void -psignal (struct proc *p, int sig) -{ - printf(__FUNCTION__" called, proc=x%p sig=%d\n", p, sig); -} - -/* - * signal a process group - */ -void -gsignal (int pgid, int sig) -{ - printf(__FUNCTION__" called, pgid=%d sig=%d\n", pgid, sig); -} - -/* ---------------------------------------------------------------------- */ - -/* - * copy in from userspace - */ -int -copyin (void *udaddr, void *kaddr, u_int len) -{ - memcpy(kaddr, udaddr, len); - return 0; -} - -/* - * copy out to userspace - */ -int -copyout (void *kaddr, void *udaddr, u_int len) -{ - memcpy(udaddr, kaddr, len); - return 0; -} - -/* - * even though these functions have an odd signature, - * they only copy one byte - */ -int subyte (void *base, int byte) -{ - return (int)((char *)base = (char)byte); -} - -int suibyte (void *base, int byte) -{ - return (int)((char *)base = (char)byte); -} - -/* ---------------------------------------------------------------------- */ - -#ifndef __REACTOS__ -/* - * log some information - */ -void -log (int level, const char *format, ...) -{ - extern int vprintf(const char *, va_list); - va_list args; - va_start(args, format); - printf("__FUNCTION__(%d):", level); - vprintf(format, args); - va_end(args); -} -#endif - -/* ---------------------------------------------------------------------- */ - -/* - * do we have super user credentials? - */ -/* ARGSUSED */ -int -suser(struct ucred *ucred, u_short *acflag) -{ - /* of course. */ - return 0; -} - -/* ---------------------------------------------------------------------- */ -/* - * stuff stolen from kern/kern_sysctl.c - */ -/* - * Validate parameters and get old / set new parameters - * for an integer-valued sysctl function. - */ -int -sysctl_int(oldp, oldlenp, newp, newlen, valp) - void *oldp; - size_t *oldlenp; - void *newp; - size_t newlen; - int *valp; -{ - int error = 0; - - if (oldp && *oldlenp < sizeof(int)) - return (ENOMEM); - if (newp && newlen != sizeof(int)) - return (EINVAL); - *oldlenp = sizeof(int); - if (oldp) - error = copyout(valp, oldp, sizeof(int)); - if (error == 0 && newp) - error = copyin(newp, valp, sizeof(int)); - return (error); -} - -/* - * Validate parameters and get old parameters - * for a structure oriented sysctl function. - */ -int -sysctl_rdstruct(oldp, oldlenp, newp, sp, len) - void *oldp; - size_t *oldlenp; - void *newp, *sp; - int len; -{ - int error = 0; - - if (oldp && *oldlenp < len) - return (ENOMEM); - if (newp) - return (EPERM); - *oldlenp = len; - if (oldp) - error = copyout(sp, oldp, len); - return (error); -} - -/* ---------------------------------------------------------------------- */ -/* - * normally, this is a builtin function in gcc - * net/if.c doesn't seem to get it, though - */ -int -memcmp(const void *s1v, const void *s2v, size_t size) -{ - register const char *s1 = s1v, *s2 = s2v; - register unsigned int a, b; - - while (size-- > 0) { - if ((a = *s1++) != (b = *s2++)) - return (a-b); - } - - return 0; -} - -int bcmp(const void *b1, const void *b2, size_t len) -{ - return memcmp(b1, b2, len); -} - diff --git a/reactos/lib/oskittcp/oskittcp/in.c b/reactos/lib/oskittcp/oskittcp/in.c deleted file mode 100644 index 89ad849f36f..00000000000 --- a/reactos/lib/oskittcp/oskittcp/in.c +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)in.c 8.2 (Berkeley) 11/15/93 - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/ioctl.h> -#include <sys/errno.h> -#include <sys/malloc.h> -#include <sys/socket.h> -#include <sys/socketvar.h> -#include <sys/queue.h> - -#include <net/if.h> -#include <net/route.h> - -#include <netinet/in_systm.h> -#include <netinet/in.h> -#include <netinet/in_var.h> -#include <netinet/if_ether.h> - -#include <netinet/igmp_var.h> - -/* - * This structure is used to keep track of in_multi chains which belong to - * deleted interface addresses. - */ -static LIST_HEAD(, multi_kludge) in_mk; /* XXX BSS initialization */ - -struct multi_kludge { - LIST_ENTRY(multi_kludge) mk_entry; - struct ifnet *mk_ifp; - struct in_multihead mk_head; -}; - -/* - * Return the network number from an internet address. - */ -u_long -in_netof(in) - struct in_addr in; -{ - register u_long i = ntohl(in.s_addr); - register u_long net; - register struct in_ifaddr *ia; - - if (IN_CLASSA(i)) - net = i & IN_CLASSA_NET; - else if (IN_CLASSB(i)) - net = i & IN_CLASSB_NET; - else if (IN_CLASSC(i)) - net = i & IN_CLASSC_NET; - else if (IN_CLASSD(i)) - net = i & IN_CLASSD_NET; - else - return (0); - - /* - * Check whether network is a subnet; - * if so, return subnet number. - */ - for (ia = in_ifaddr; ia; ia = ia->ia_next) - if (net == ia->ia_net) - return (i & ia->ia_subnetmask); - return (net); -} - -#ifndef SUBNETSARELOCAL -#define SUBNETSARELOCAL 1 -#endif -int subnetsarelocal = SUBNETSARELOCAL; -/* - * Return 1 if an internet address is for a ``local'' host - * (one to which we have a connection). If subnetsarelocal - * is true, this includes other subnets of the local net. - * Otherwise, it includes only the directly-connected (sub)nets. - */ -int -in_localaddr(in) - struct in_addr in; -{ - register u_long i = ntohl(in.s_addr); - register struct in_ifaddr *ia; - - if (subnetsarelocal) { - for (ia = in_ifaddr; ia; ia = ia->ia_next) - if ((i & ia->ia_netmask) == ia->ia_net) - return (1); - } else { - for (ia = in_ifaddr; ia; ia = ia->ia_next) - if ((i & ia->ia_subnetmask) == ia->ia_subnet) - return (1); - } - return (0); -} - -int in_interfaces; /* number of external internet interfaces */ - -/* - * Generic internet control operations (ioctl's). - * Ifp is 0 if not an interface-specific ioctl. - */ -/* ARGSUSED */ -int -in_control(so, cmd, data, ifp) - struct socket *so; - int cmd; - caddr_t data; - register struct ifnet *ifp; -{ - return (0); -} - -/* - * Delete a multicast address record. - */ -void -in_delmulti(inm) - register struct in_multi *inm; -{ -#if 0 - register struct in_multi **p; - struct ifreq ifr; - int s = splnet(); - - if (--inm->inm_refcount == 0) { - /* - * No remaining claims to this record; let IGMP know that - * we are leaving the multicast group. - */ - /* igmp_leavegroup(inm); XXX arty */ - /* - * Unlink from list. - */ - LIST_REMOVE(inm, inm_entry); - - /* - * Notify the network driver to update its multicast reception - * filter. - */ - ((struct sockaddr_in *)&(ifr.ifr_addr))->sin_family = AF_INET; - ((struct sockaddr_in *)&(ifr.ifr_addr))->sin_addr = - inm->inm_addr; - (*inm->inm_ifp->if_ioctl)(inm->inm_ifp, SIOCDELMULTI, - (caddr_t)&ifr); - free(inm, M_IPMADDR); - } - splx(s); -#endif -} diff --git a/reactos/lib/oskittcp/oskittcp/in_cksum.c b/reactos/lib/oskittcp/oskittcp/in_cksum.c deleted file mode 100644 index 4175f8cb087..00000000000 --- a/reactos/lib/oskittcp/oskittcp/in_cksum.c +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (c) 1988, 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)in_cksum.c 8.1 (Berkeley) 6/10/93 - */ - -#include <sys/param.h> -#include <sys/mbuf.h> -#include <sys/systm.h> - -/* - * Checksum routine for Internet Protocol family headers (Portable Version). - * - * This routine is very heavily used in the network - * code and should be modified for each CPU to be as fast as possible. - */ - -#define ADDCARRY(x) (x > 65535 ? x -= 65535 : x) -#define REDUCE {l_util.l = sum; sum = l_util.s[0] + l_util.s[1]; ADDCARRY(sum);} - -int -in_cksum(m, len) - register struct mbuf *m; - register int len; -{ - register u_short *w; - register int sum = 0; - register int mlen = 0; - int byte_swapped = 0; - - union { - char c[2]; - u_short s; - } s_util; - union { - u_short s[2]; - long l; - } l_util; - - for (;m && len; m = m->m_next) { - if (m->m_len == 0) - continue; - w = mtod(m, u_short *); - if (mlen == -1) { - /* - * The first byte of this mbuf is the continuation - * of a word spanning between this mbuf and the - * last mbuf. - * - * s_util.c[0] is already saved when scanning previous - * mbuf. - */ - s_util.c[1] = *(char *)w; - sum += s_util.s; - w = (u_short *)((char *)w + 1); - mlen = m->m_len - 1; - len--; - } else - mlen = m->m_len; - if (len < mlen) - mlen = len; - len -= mlen; - /* - * Force to even boundary. - */ - if ((1 & (int) w) && (mlen > 0)) { - REDUCE; - sum <<= 8; - s_util.c[0] = *(u_char *)w; - w = (u_short *)((char *)w + 1); - mlen--; - byte_swapped = 1; - } - /* - * Unroll the loop to make overhead from - * branches &c small. - */ - while ((mlen -= 32) >= 0) { - sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3]; - sum += w[4]; sum += w[5]; sum += w[6]; sum += w[7]; - sum += w[8]; sum += w[9]; sum += w[10]; sum += w[11]; - sum += w[12]; sum += w[13]; sum += w[14]; sum += w[15]; - w += 16; - } - mlen += 32; - while ((mlen -= 8) >= 0) { - sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3]; - w += 4; - } - mlen += 8; - if (mlen == 0 && byte_swapped == 0) - continue; - REDUCE; - while ((mlen -= 2) >= 0) { - sum += *w++; - } - if (byte_swapped) { - REDUCE; - sum <<= 8; - byte_swapped = 0; - if (mlen == -1) { - s_util.c[1] = *(char *)w; - sum += s_util.s; - mlen = 0; - } else - mlen = -1; - } else if (mlen == -1) - s_util.c[0] = *(char *)w; - } - if (len) - printf("cksum: out of data\n"); - if (mlen == -1) { - /* The last mbuf has odd # of bytes. Follow the - standard (the odd byte may be shifted left by 8 bits - or not as determined by endian-ness of the machine) */ - s_util.c[1] = 0; - sum += s_util.s; - } - REDUCE; - return (~sum & 0xffff); -} diff --git a/reactos/lib/oskittcp/oskittcp/in_pcb.c b/reactos/lib/oskittcp/oskittcp/in_pcb.c deleted file mode 100644 index f050eb655d4..00000000000 --- a/reactos/lib/oskittcp/oskittcp/in_pcb.c +++ /dev/null @@ -1,521 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1991, 1993, 1995 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)in_pcb.c 8.2 (Berkeley) 1/4/94 - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/malloc.h> -#include <sys/mbuf.h> -#include <sys/protosw.h> -#include <sys/socket.h> -#include <sys/socketvar.h> -#include <sys/ioctl.h> -#include <sys/errno.h> -#include <sys/time.h> -#include <sys/proc.h> -#include <sys/queue.h> - -#include <net/if.h> -#include <net/route.h> - -#include <netinet/in.h> -#include <netinet/in_systm.h> -#include <netinet/ip.h> -#include <netinet/in_pcb.h> -#include <netinet/in_var.h> -#include <netinet/ip_var.h> - -struct in_addr zeroin_addr; - -int -in_pcballoc(so, pcbinfo) - struct socket *so; - struct inpcbinfo *pcbinfo; -{ - register struct inpcb *inp; - int s; - - MALLOC(inp, struct inpcb *, sizeof(*inp), M_PCB, M_NOWAIT); - if (inp == NULL) - return (ENOBUFS); - bzero((caddr_t)inp, sizeof(*inp)); - inp->inp_pcbinfo = pcbinfo; - inp->inp_socket = so; - s = splnet(); - LIST_INSERT_HEAD(pcbinfo->listhead, inp, inp_list); - in_pcbinshash(inp); - splx(s); - so->so_pcb = (caddr_t)inp; - return (0); -} - -int -in_pcbbind(inp, nam) - register struct inpcb *inp; - struct mbuf *nam; -{ - register struct socket *so = inp->inp_socket; - struct inpcbhead *head = inp->inp_pcbinfo->listhead; - unsigned short *lastport = &inp->inp_pcbinfo->lastport; - struct sockaddr_in *sin; - struct proc *p = curproc; /* XXX */ - struct ifaddr ifa; - u_short lport = 0; - int wild = 0, reuseport = (so->so_options & SO_REUSEPORT); - int error; - - if (inp->inp_lport || inp->inp_laddr.s_addr != INADDR_ANY) - return (EINVAL); - if ((so->so_options & (SO_REUSEADDR|SO_REUSEPORT)) == 0 && - ((so->so_proto->pr_flags & PR_CONNREQUIRED) == 0 || - (so->so_options & SO_ACCEPTCONN) == 0)) - wild = INPLOOKUP_WILDCARD; - if (nam) { - sin = mtod(nam, struct sockaddr_in *); - if (nam->m_len != sizeof (*sin)) - return (EINVAL); -#ifdef notdef - /* - * We should check the family, but old programs - * incorrectly fail to initialize it. - */ - if (sin->sin_family != AF_INET) - return (EAFNOSUPPORT); -#endif - lport = sin->sin_port; - if (IN_MULTICAST(ntohl(sin->sin_addr.s_addr))) { - /* - * Treat SO_REUSEADDR as SO_REUSEPORT for multicast; - * allow complete duplication of binding if - * SO_REUSEPORT is set, or if SO_REUSEADDR is set - * and a multicast address is bound on both - * new and duplicated sockets. - */ - if (so->so_options & SO_REUSEADDR) - reuseport = SO_REUSEADDR|SO_REUSEPORT; - } else if (sin->sin_addr.s_addr != INADDR_ANY) { - sin->sin_port = 0; /* yech... */ - if (ifa_ifwithaddr((struct sockaddr *)sin, &ifa) != 0) - return (EADDRNOTAVAIL); - } - if (lport) { - struct inpcb *t; - - /* GROSS */ - if (ntohs(lport) < IPPORT_RESERVED && - (error = suser(p->p_ucred, &p->p_acflag))) - return (EACCES); - t = in_pcblookup(head, zeroin_addr, 0, - sin->sin_addr, lport, wild); - if (t && (reuseport & t->inp_socket->so_options) == 0) - return (EADDRINUSE); - } - inp->inp_laddr = sin->sin_addr; - } - if (lport == 0) - do { - ++*lastport; - if (*lastport < IPPORT_RESERVED || - *lastport > IPPORT_USERRESERVED) - *lastport = IPPORT_RESERVED; - lport = htons(*lastport); - } while (in_pcblookup(head, - zeroin_addr, 0, inp->inp_laddr, lport, wild)); - inp->inp_lport = lport; - in_pcbrehash(inp); - return (0); -} - -/* - * Transform old in_pcbconnect() into an inner subroutine for new - * in_pcbconnect(): Do some validity-checking on the remote - * address (in mbuf 'nam') and then determine local host address - * (i.e., which interface) to use to access that remote host. - * - * This preserves definition of in_pcbconnect(), while supporting a - * slightly different version for T/TCP. (This is more than - * a bit of a kludge, but cleaning up the internal interfaces would - * have forced minor changes in every protocol). - */ - -int -in_pcbladdr(inp, nam, plocal_sin) - register struct inpcb *inp; - struct mbuf *nam; - struct sockaddr_in *plocal_sin; -{ - struct ifaddr ifa; - struct sockaddr_in *ifaddr = 0; - register struct sockaddr_in *sin = mtod(nam, struct sockaddr_in *); - - if (nam->m_len != sizeof (*sin)) - return (EINVAL); - if (sin->sin_family != AF_INET) { - OS_DbgPrint(OSK_MID_TRACE,("EAFNOSUPPORT: %d\n", sin->sin_family)); - return (EAFNOSUPPORT); - } - if (sin->sin_port == 0) - return (EADDRNOTAVAIL); - if (inp->inp_laddr.s_addr == INADDR_ANY) { - register struct route *ro; - /* - * If route is known or can be allocated now, - * our src addr is taken from the i/f, else punt. - */ - ro = &inp->inp_route; - if ((inp->inp_socket->so_options & SO_DONTROUTE) == 0) { - /* No route yet, so try to acquire one */ - ro->ro_dst.sa_family = AF_INET; - /* ro->ro_dst.sa_len = sizeof(struct sockaddr_in); */ - ((struct sockaddr_in *) &ro->ro_dst)->sin_addr = - sin->sin_addr; - if( ifa_ifwithnet( sin, &ifa ) == 0 ) { - inp->inp_laddr = - ((struct sockaddr_in *)&ifa.ifa_addr)->sin_addr; - OS_DbgPrint(OSK_MID_TRACE, - ("Assigning local address: %x\n", - inp->inp_laddr.s_addr)); - } - } - } - /* - * Don't do pcblookup call here; return interface in plocal_sin - * and exit to caller, that will do the lookup. - */ - plocal_sin->sin_family = AF_INET; - plocal_sin->sin_addr = ((struct sockaddr_in *)&ifa.ifa_addr)->sin_addr; - plocal_sin->sin_port = sin->sin_port; - return(0); -} - -/* - * Outer subroutine: - * Connect from a socket to a specified address. - * Both address and port must be specified in argument sin. - * If don't have a local address for this socket yet, - * then pick one. - */ -int -in_pcbconnect(inp, nam) - register struct inpcb *inp; - struct mbuf *nam; -{ - struct sockaddr_in ifaddr; - register struct sockaddr_in *sin = mtod(nam, struct sockaddr_in *); - int error; - - /* - * Call inner routine, to assign local interface address. - */ - if (error = in_pcbladdr(inp, nam, &ifaddr)) - return(error); - - if (in_pcblookuphash(inp->inp_pcbinfo, sin->sin_addr, sin->sin_port, - inp->inp_laddr.s_addr ? inp->inp_laddr : - ifaddr.sin_addr, - inp->inp_lport) != NULL) - return (EADDRINUSE); - if (inp->inp_laddr.s_addr == INADDR_ANY) { - if (inp->inp_lport == 0) - (void)in_pcbbind(inp, (struct mbuf *)0); - inp->inp_laddr = ifaddr.sin_addr; - } - inp->inp_faddr = sin->sin_addr; - inp->inp_fport = sin->sin_port; - in_pcbrehash(inp); - return (0); -} - -void -in_pcbdisconnect(inp) - struct inpcb *inp; -{ - - inp->inp_faddr.s_addr = INADDR_ANY; - inp->inp_fport = 0; - in_pcbrehash(inp); - if (inp->inp_socket->so_state & SS_NOFDREF) - in_pcbdetach(inp); -} - -void -in_pcbdetach(inp) - struct inpcb *inp; -{ - struct socket *so = inp->inp_socket; - int s; - - so->so_pcb = 0; - sofree(so); - if (inp->inp_options) - (void)m_free(inp->inp_options); - ip_freemoptions(inp->inp_moptions); - s = splnet(); - LIST_REMOVE(inp, inp_hash); - LIST_REMOVE(inp, inp_list); - splx(s); - FREE(inp, M_PCB); -} - -void -in_setsockaddr(inp, nam) - register struct inpcb *inp; - struct mbuf *nam; -{ - register struct sockaddr_in *sin; - - nam->m_len = sizeof (*sin); - sin = mtod(nam, struct sockaddr_in *); - bzero((caddr_t)sin, sizeof (*sin)); - sin->sin_family = AF_INET; - /* sin->sin_len = sizeof(*sin); */ - sin->sin_port = inp->inp_lport; - sin->sin_addr = inp->inp_laddr; -} - -void -in_setpeeraddr(inp, nam) - struct inpcb *inp; - struct mbuf *nam; -{ - register struct sockaddr_in *sin; - - nam->m_len = sizeof (*sin); - sin = mtod(nam, struct sockaddr_in *); - bzero((caddr_t)sin, sizeof (*sin)); - sin->sin_family = AF_INET; - /* sin->sin_len = sizeof(*sin); */ - sin->sin_port = inp->inp_fport; - sin->sin_addr = inp->inp_faddr; -} - -/* - * Pass some notification to all connections of a protocol - * associated with address dst. The local address and/or port numbers - * may be specified to limit the search. The "usual action" will be - * taken, depending on the ctlinput cmd. The caller must filter any - * cmds that are uninteresting (e.g., no error in the map). - * Call the protocol specific routine (if any) to report - * any errors for each matching socket. - * - * Must be called at splnet. - */ -void -in_pcbnotify(head, dst, fport_arg, laddr, lport_arg, cmd, notify) - struct inpcbhead *head; - struct sockaddr *dst; - u_int fport_arg, lport_arg; - struct in_addr laddr; - int cmd; - void (*notify) __P((struct inpcb *, int)); -{ - register struct inpcb *inp, *oinp; - struct in_addr faddr; - u_short fport = fport_arg, lport = lport_arg; - int errno, s; - - if ((unsigned)cmd > PRC_NCMDS || dst->sa_family != AF_INET) - return; - faddr = ((struct sockaddr_in *)dst)->sin_addr; - if (faddr.s_addr == INADDR_ANY) - return; - - /* - * Redirects go to all references to the destination, - * and use in_rtchange to invalidate the route cache. - * Dead host indications: notify all references to the destination. - * Otherwise, if we have knowledge of the local port and address, - * deliver only to that socket. - */ - if (PRC_IS_REDIRECT(cmd) || cmd == PRC_HOSTDEAD) { - fport = 0; - lport = 0; - laddr.s_addr = 0; - if (cmd != PRC_HOSTDEAD) - notify = in_rtchange; - } - errno = inetctlerrmap[cmd]; - s = splnet(); - for (inp = head->lh_first; inp != NULL;) { - if (inp->inp_faddr.s_addr != faddr.s_addr || - inp->inp_socket == 0 || - (lport && inp->inp_lport != lport) || - (laddr.s_addr && inp->inp_laddr.s_addr != laddr.s_addr) || - (fport && inp->inp_fport != fport)) { - inp = inp->inp_list.le_next; - continue; - } - oinp = inp; - inp = inp->inp_list.le_next; - if (notify) - (*notify)(oinp, errno); - } - splx(s); -} - -/* - * After a routing change, flush old routing - * and allocate a (hopefully) better one. - */ -void -in_rtchange(inp, errno) - register struct inpcb *inp; - int errno; -{ -} - -struct inpcb * -in_pcblookup(head, faddr, fport_arg, laddr, lport_arg, flags) - struct inpcbhead *head; - struct in_addr faddr, laddr; - u_int fport_arg, lport_arg; - int flags; -{ - register struct inpcb *inp, *match = NULL; - int matchwild = 3, wildcard; - u_short fport = fport_arg, lport = lport_arg; - int s; - - s = splnet(); - - for (inp = head->lh_first; inp != NULL; inp = inp->inp_list.le_next) { - if (inp->inp_lport != lport) - continue; - wildcard = 0; - if (inp->inp_faddr.s_addr != INADDR_ANY) { - if (faddr.s_addr == INADDR_ANY) - wildcard++; - else if (inp->inp_faddr.s_addr != faddr.s_addr || - inp->inp_fport != fport) - continue; - } else { - if (faddr.s_addr != INADDR_ANY) - wildcard++; - } - if (inp->inp_laddr.s_addr != INADDR_ANY) { - if (laddr.s_addr == INADDR_ANY) - wildcard++; - else if (inp->inp_laddr.s_addr != laddr.s_addr) - continue; - } else { - if (laddr.s_addr != INADDR_ANY) - wildcard++; - } - if (wildcard && (flags & INPLOOKUP_WILDCARD) == 0) - continue; - if (wildcard < matchwild) { - match = inp; - matchwild = wildcard; - if (matchwild == 0) { - break; - } - } - } - splx(s); - return (match); -} - -/* - * Lookup PCB in hash list. - */ -struct inpcb * -in_pcblookuphash(pcbinfo, faddr, fport_arg, laddr, lport_arg) - struct inpcbinfo *pcbinfo; - struct in_addr faddr, laddr; - u_int fport_arg, lport_arg; -{ - struct inpcbhead *head; - register struct inpcb *inp; - u_short fport = fport_arg, lport = lport_arg; - int s; - - s = splnet(); - /* - * First look for an exact match. - */ - head = &pcbinfo->hashbase[(faddr.s_addr + lport + fport) % pcbinfo->hashsize]; - - for (inp = head->lh_first; inp != NULL; inp = inp->inp_hash.le_next) { - if (inp->inp_faddr.s_addr != faddr.s_addr || - inp->inp_fport != fport || - inp->inp_lport != lport || - inp->inp_laddr.s_addr != laddr.s_addr) - continue; - /* - * Move PCB to head of this hash chain so that it can be - * found more quickly in the future. - */ - if (inp != head->lh_first) { - LIST_REMOVE(inp, inp_hash); - LIST_INSERT_HEAD(head, inp, inp_hash); - } - break; - } - splx(s); - return (inp); -} - -/* - * Insert PCB into hash chain. Must be called at splnet. - */ -void -in_pcbinshash(inp) - struct inpcb *inp; -{ - struct inpcbhead *head; - - head = &inp->inp_pcbinfo->hashbase[(inp->inp_faddr.s_addr + - inp->inp_lport + inp->inp_fport) % inp->inp_pcbinfo->hashsize]; - - LIST_INSERT_HEAD(head, inp, inp_hash); -} - -void -in_pcbrehash(inp) - struct inpcb *inp; -{ - struct inpcbhead *head; - int s; - - s = splnet(); - LIST_REMOVE(inp, inp_hash); - - head = &inp->inp_pcbinfo->hashbase[(inp->inp_faddr.s_addr + - inp->inp_lport + inp->inp_fport) % inp->inp_pcbinfo->hashsize]; - - LIST_INSERT_HEAD(head, inp, inp_hash); - splx(s); -} - -void in_losing(struct inpcb *inp) { } diff --git a/reactos/lib/oskittcp/oskittcp/in_proto.c b/reactos/lib/oskittcp/oskittcp/in_proto.c deleted file mode 100644 index 3c8ce2f0fbf..00000000000 --- a/reactos/lib/oskittcp/oskittcp/in_proto.c +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * From: @(#)in_proto.c 8.1 (Berkeley) 6/10/93 - */ - -#include <sys/param.h> -#include <sys/kernel.h> -#include <sys/socket.h> -#include <sys/protosw.h> -#include <sys/domain.h> -#include <sys/mbuf.h> -#include <sys/queue.h> - -#include <net/if.h> -#include <net/radix.h> -#include <net/route.h> - -#include <netinet/in.h> -#include <netinet/in_systm.h> -#include <netinet/ip.h> -#include <netinet/ip_var.h> -#include <netinet/ip_icmp.h> -#include <netinet/in_pcb.h> -#include <netinet/igmp_var.h> -#include <netinet/tcp.h> -#include <netinet/tcp_fsm.h> -#include <netinet/tcp_seq.h> -#include <netinet/tcp_timer.h> -#include <netinet/tcp_var.h> -#include <netinet/tcpip.h> -#ifdef TCPDEBUG -#include <netinet/tcp_debug.h> -#endif -#include <netinet/udp.h> -#include <netinet/udp_var.h> -/* - * TCP/IP protocol family: IP, ICMP, UDP, TCP. - */ - -#ifdef NSIP -void idpip_input(), nsip_ctlinput(); -#endif - -#ifdef TPIP -void tpip_input(), tpip_ctlinput(), tp_ctloutput(); -int tp_init(), tp_slowtimo(), tp_drain(), tp_usrreq(); -#endif - -#ifdef EON -void eoninput(), eonctlinput(), eonprotoinit(); -#endif /* EON */ - -void rsvp_input(struct mbuf *, int); -void ipip_input(struct mbuf *, int); - -extern struct domain inetdomain; - -struct protosw inetsw[] = { -{ SOCK_STREAM, &inetdomain, IPPROTO_TCP, - PR_CONNREQUIRED|PR_IMPLOPCL|PR_WANTRCVD, - tcp_input, 0, tcp_ctlinput, tcp_ctloutput, - tcp_usrreq, - tcp_init, tcp_fasttimo, tcp_slowtimo, tcp_drain, tcp_sysctl -}, -}; - -extern int in_inithead(void **, int); - -struct domain inetdomain = - { AF_INET, "internet", 0, 0, 0, - inetsw, &inetsw[sizeof(inetsw)/sizeof(inetsw[0])], 0, - in_inithead, 32, sizeof(struct sockaddr_in) - }; - -DOMAIN_SET(inet); - -#include "imp.h" -#if NIMP > 0 -extern struct domain impdomain; -int rimp_output(), hostslowtimo(); - -struct protosw impsw[] = { -{ SOCK_RAW, &impdomain, 0, PR_ATOMIC|PR_ADDR, - 0, rimp_output, 0, 0, - rip_usrreq, - 0, 0, hostslowtimo, 0, -}, -}; - -struct domain impdomain = - { AF_IMPLINK, "imp", 0, 0, 0, - impsw, &impsw[sizeof (impsw)/sizeof(impsw[0])] }; - -DOMAIN_SET(imp); - -#endif - -#if 0 -#include "hy.h" -#if NHY > 0 -/* - * HYPERchannel protocol family: raw interface. - */ -int rhy_output(); -extern struct domain hydomain; - -struct protosw hysw[] = { -{ SOCK_RAW, &hydomain, 0, PR_ATOMIC|PR_ADDR, - 0, rhy_output, 0, 0, - rip_usrreq, - 0, 0, 0, 0, -}, -}; - -struct domain hydomain = - { AF_HYLINK, "hy", 0, 0, 0, hysw, &hysw[sizeof (hysw)/sizeof(hysw[0])] }; - -DOMAIN_SET(hy); -#endif -#endif diff --git a/reactos/lib/oskittcp/oskittcp/in_rmx.c b/reactos/lib/oskittcp/oskittcp/in_rmx.c deleted file mode 100644 index ce8d1b0e2d1..00000000000 --- a/reactos/lib/oskittcp/oskittcp/in_rmx.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 1994, 1995 Massachusetts Institute of Technology - * - * Permission to use, copy, modify, and distribute this software and - * its documentation for any purpose and without fee is hereby - * granted, provided that both the above copyright notice and this - * permission notice appear in all copies, that both the above - * copyright notice and this permission notice appear in all - * supporting documentation, and that the name of M.I.T. not be used - * in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. M.I.T. makes - * no representations about the suitability of this software for any - * purpose. It is provided "as is" without express or implied - * warranty. - * - * THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS - * ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT - * SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -/* - * This code does two things necessary for the enhanced TCP metrics to - * function in a useful manner: - * 1) It marks all non-host routes as `cloning', thus ensuring that - * every actual reference to such a route actually gets turned - * into a reference to a host route to the specific destination - * requested. - * 2) When such routes lose all their references, it arranges for them - * to be deleted in some random collection of circumstances, so that - * a large quantity of stale routing data is not kept in kernel memory - * indefinitely. See in_rtqtimo() below for the exact mechanism. - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/queue.h> -#include <sys/socket.h> -#include <sys/socketvar.h> -#include <sys/mbuf.h> -#include <sys/syslog.h> - -#include <net/if.h> -#include <net/route.h> -#include <netinet/in.h> -#include <netinet/in_systm.h> -#include <netinet/in_var.h> - -#include <netinet/ip.h> -#include <netinet/ip_var.h> - -#include <netinet/tcp.h> -#include <netinet/tcp_seq.h> -#include <netinet/tcp_timer.h> -#include <netinet/tcp_var.h> -#include <netinet/tcpip.h> - -/* - * Initialize our routing tree. - */ -int -in_inithead(void **head, int off) -{ - struct radix_node_head *rnh; - - if(!rn_inithead(head, off)) - return 0; - - if(head != (void **)&rt_tables[AF_INET]) /* BOGUS! */ - return 1; /* only do this for the real routing table */ - - rnh = *head; -#if 0 - rnh->rnh_addaddr = in_addroute; - rnh->rnh_matchaddr = in_matroute; - rnh->rnh_close = in_clsroute; - in_rtqtimo(rnh); /* kick off timeout first time */ -#endif - return 1; -} - diff --git a/reactos/lib/oskittcp/oskittcp/inet_ntoa.c b/reactos/lib/oskittcp/oskittcp/inet_ntoa.c deleted file mode 100644 index d25dff83f84..00000000000 --- a/reactos/lib/oskittcp/oskittcp/inet_ntoa.c +++ /dev/null @@ -1,51 +0,0 @@ - -/* - * Copyright 1994, 1995 Massachusetts Institute of Technology - * - * Permission to use, copy, modify, and distribute this software and - * its documentation for any purpose and without fee is hereby - * granted, provided that both the above copyright notice and this - * permission notice appear in all copies, that both the above - * copyright notice and this permission notice appear in all - * supporting documentation, and that the name of M.I.T. not be used - * in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. M.I.T. makes - * no representations about the suitability of this software for any - * purpose. It is provided "as is" without express or implied - * warranty. - * - * THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS - * ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT - * SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <sys/param.h> -#include <sys/systm.h> - -#include <netinet/in.h> - -#ifndef __REACTOS__ -char * -inet_ntoa(struct in_addr ina) -{ - static char buf[4*sizeof "123"]; - unsigned char *ucp = (unsigned char *)&ina; - - sprintf(buf, "%d.%d.%d.%d", - ucp[0] & 0xff, - ucp[1] & 0xff, - ucp[2] & 0xff, - ucp[3] & 0xff); - return buf; -} - -#endif diff --git a/reactos/lib/oskittcp/oskittcp/interface.c b/reactos/lib/oskittcp/oskittcp/interface.c deleted file mode 100644 index 08ef28fd604..00000000000 --- a/reactos/lib/oskittcp/oskittcp/interface.c +++ /dev/null @@ -1,292 +0,0 @@ -#include <oskittcp.h> -#include <oskitdebug.h> -#include <ntddk.h> -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/socket.h> -#include <sys/kernel.h> -#include <sys/filedesc.h> -#include <sys/proc.h> -#include <sys/fcntl.h> -#include <sys/file.h> -#include <sys/mbuf.h> -#include <sys/protosw.h> -#include <sys/socket.h> -#include <sys/socketvar.h> -#include <sys/uio.h> - -struct linker_set domain_set; - -OSKITTCP_EVENT_HANDLERS OtcpEvent = { 0 }; - -OSK_UINT OskitDebugTraceLevel = OSK_DEBUG_ULTRA; - -/* SPL */ -unsigned cpl; -unsigned net_imask; -unsigned volatile ipending; -struct timeval boottime; - -void InitOskitTCP() { - OS_DbgPrint(OSK_MID_TRACE,("Init Called\n")); - OS_DbgPrint(OSK_MID_TRACE,("Init fake freebsd scheduling\n")); - init_freebsd_sched(); - OS_DbgPrint(OSK_MID_TRACE,("Init clock\n")); - clock_init(); - OS_DbgPrint(OSK_MID_TRACE,("Init TCP\n")); - tcp_init(); - OS_DbgPrint(OSK_MID_TRACE,("Init routing\n")); - domaininit(); - memset( &OtcpEvent, 0, sizeof( OtcpEvent ) ); - OS_DbgPrint(OSK_MID_TRACE,("Init Finished\n")); - tcp_iss = 1024; -} - -void DeinitOskitTCP() { -} - -void TimerOskitTCP() { - tcp_slowtimo(); -} - -void RegisterOskitTCPEventHandlers( POSKITTCP_EVENT_HANDLERS EventHandlers ) { - memcpy( &OtcpEvent, EventHandlers, sizeof(OtcpEvent) ); - if( OtcpEvent.PacketSend ) - OS_DbgPrint(OSK_MID_TRACE,("SendPacket handler registered: %x\n", - OtcpEvent.PacketSend)); - if( OtcpEvent.Bind ) - OS_DbgPrint(OSK_MID_TRACE,("Bind handler registered: %x\n", - OtcpEvent.Bind)); -} - -void OskitDumpBuffer( OSK_PCHAR Data, OSK_UINT Len ) { - unsigned int i; - - for( i = 0; i < Len; i++ ) { - if( i && !(i & 0xf) ) DbgPrint( "\n" ); - if( !(i & 0xf) ) DbgPrint( "%08x: ", (UINT)(Data + i) ); - DbgPrint( " %02x", Data[i] ); - } - DbgPrint("\n"); -} - -/* From uipc_syscalls.c */ - -int OskitTCPSocket( void *context, - void **aso, - int domain, - int type, - int proto ) -{ - struct socket *so; - int error = socreate(domain, &so, type, proto); - if( !error ) { - so->so_connection = context; - *aso = so; - } - return error; -#if 0 - register struct protosw *prp; - register struct socket *so; - register int error; - - if (proto) { - prp = pffindproto(domain, proto, type); - } else { - prp = pffindtype(domain, type); - } - if (prp == 0 || prp->pr_usrreq == 0) { - return (EPROTONOSUPPORT); - } - if (prp->pr_type != type) { - return (EPROTOTYPE); - } - MALLOC(so, struct socket *, sizeof(*so), M_SOCKET, M_WAIT); - bzero((caddr_t)so, sizeof(*so)); - so->so_type = type; - so->so_proto = prp; - error = - (*prp->pr_usrreq)(so, PRU_ATTACH, - (struct mbuf *)0, - (struct mbuf *)proto, - (struct mbuf *)0); - if (error) { - so->so_state |= SS_NOFDREF; - sofree(so); - return (error); - } - *aso = so; - OS_DbgPrint(OSK_MAX_TRACE,("Returning Socket %x\n", so)); - return STATUS_SUCCESS; -#endif -} - -static int -getsockaddr(namp, uaddr, len) -/* [<][>][^][v][top][bottom][index][help] */ - struct sockaddr **namp; -caddr_t uaddr; -size_t len; -{ - struct sockaddr *sa; - int error; - - if (len > SOCK_MAXADDRLEN) - return ENAMETOOLONG; - MALLOC(sa, struct sockaddr *, len, M_SONAME, M_WAITOK); - error = copyin(uaddr, sa, len); - if (error) { - FREE(sa, M_SONAME); - } else { - *namp = sa; - } - return error; -} - -NTSTATUS OskitTCPConnect( PVOID socket, PVOID connection, - PVOID nam, OSK_UINT namelen ) { - struct socket *so = socket; - struct connect_args _uap = { - 0, nam, namelen - }, *uap = &_uap; - int error = EFAULT, s; - struct mbuf sabuf = { 0 }; - struct sockaddr addr; - - OS_DbgPrint(OSK_MID_TRACE,("Called, socket = %08x\n", socket)); - - so->so_connection = connection; - - if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) { - error = EALREADY; - goto done; - } - - OS_DbgPrint(OSK_MIN_TRACE,("Nam: %x\n", nam)); - if( nam ) - addr = *((struct sockaddr *)nam); - - sabuf.m_data = (void *)&addr; - sabuf.m_len = sizeof(addr); - - addr.sa_family = addr.sa_len; - addr.sa_len = sizeof(struct sockaddr); - - error = soconnect(so, &sabuf); - - if (error) - goto bad; - - if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) { - error = EINPROGRESS; - 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; - - if (error == ERESTART) - error = EINTR; - -done: - OS_DbgPrint(OSK_MID_TRACE,("Ending: %08x\n", error)); - return (error); -} - -DWORD OskitTCPClose( VOID *socket ) { -} - -DWORD OskitTCPSend( VOID *socket, OSK_PCHAR Data, OSK_UINT Len, int flags ) { - OskitDumpBuffer( Data, Len ); - struct mbuf mb; - mb.m_data = Data; - mb.m_len = Len; - return sosend( socket, NULL, NULL, (struct mbuf *)&mb, NULL, 0 ); -} - -void OskitTCPReceive( VOID *socket, PVOID AddrOut, - OSK_PCHAR Data, OSK_UINT Len, OSK_UINT *OutLen ) { -} - -VOID *OskitTCPAccept( VOID *socket, PVOID AddrOut ) { -} - -void OskitTCPReceiveDatagram( OSK_PCHAR Data, OSK_UINT Len, - OSK_UINT IpHeaderLen ) { - struct mbuf *Ip = m_get(M_DONTWAIT, MT_DATA); - char *NewData = malloc( Len ); - - OS_DbgPrint(OSK_MAX_TRACE, ("OskitTCPReceiveDatagram: %d Bytes\n", Len)); - - OskitDumpBuffer( Data, Len ); - - memset( Ip, 0, sizeof( *Ip ) ); - Ip->m_len = Len; - Ip->m_data = NewData; - memcpy( Ip->m_data, Data, Len ); - - tcp_input(Ip, IpHeaderLen); - - /* The buffer Ip is freed by tcp_input */ -} - -void OskitTCPBind( VOID *socket, PVOID name ) { -} - -void OskitTCPListen( VOID *socket, int backlog ) { -} - -void OskitTCPSetAddress( VOID *socket, - ULONG LocalAddress, - USHORT LocalPort, - ULONG RemoteAddress, - USHORT RemotePort ) { - struct socket *so = socket; - struct inpcb *inp = so->so_pcb; - inp->inp_laddr.s_addr = LocalAddress; - inp->inp_lport = LocalPort; - inp->inp_faddr.s_addr = RemoteAddress; - inp->inp_fport = RemotePort; - DbgPrint("OSKIT: SET ADDR %x:%x -> %x:%x\n", - LocalAddress, LocalPort, - RemoteAddress, RemotePort); -} - -void OskitTCPGetAddress( VOID *socket, - PULONG LocalAddress, - PUSHORT LocalPort, - PULONG RemoteAddress, - PUSHORT RemotePort ) { - struct socket *so = socket; - struct inpcb *inp = so ? so->so_pcb : 0; - if( inp ) { - *LocalAddress = inp->inp_laddr.s_addr; - *LocalPort = inp->inp_lport; - *RemoteAddress = inp->inp_faddr.s_addr; - *RemotePort = inp->inp_fport; - DbgPrint("OSKIT: GET ADDR %x:%x -> %x:%x\n", - *LocalAddress, *LocalPort, - *RemoteAddress, *RemotePort); - } -} - -void oskittcp_die( const char *file, int line ) { - DbgPrint("\n\n*** OSKITTCP: Panic Called at %s:%d ***\n", file, line); - KeBugCheck(0); -} diff --git a/reactos/lib/oskittcp/oskittcp/ip_input.c b/reactos/lib/oskittcp/oskittcp/ip_input.c deleted file mode 100644 index d816fe69725..00000000000 --- a/reactos/lib/oskittcp/oskittcp/ip_input.c +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)ip_input.c 8.2 (Berkeley) 1/4/94 - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/malloc.h> -#include <sys/mbuf.h> -#include <sys/domain.h> -#include <sys/protosw.h> -#include <sys/socket.h> -#include <sys/errno.h> -#include <sys/time.h> -#include <sys/kernel.h> -#include <sys/syslog.h> - -#include <vm/vm.h> -#include <sys/sysctl.h> - -#include <net/if.h> -#include <net/route.h> -#include <net/netisr.h> - -#include <netinet/in.h> -#include <netinet/in_systm.h> -#include <netinet/in_var.h> -#include <netinet/ip.h> -#include <netinet/in_pcb.h> -#include <netinet/in_var.h> -#include <netinet/ip_var.h> -#include <netinet/ip_icmp.h> - -#include <netinet/ip_fw.h> - -#include <sys/socketvar.h> - -u_char inetctlerrmap[PRC_NCMDS] = { - 0, 0, 0, 0, - 0, EMSGSIZE, EHOSTDOWN, EHOSTUNREACH, - EHOSTUNREACH, EHOSTUNREACH, ECONNREFUSED, ECONNREFUSED, - EMSGSIZE, EHOSTUNREACH, 0, 0, - 0, 0, 0, 0, - ENOPROTOOPT -}; - -struct in_ifaddr *in_ifaddr; /* first inet address */ -int ip_defttl = IPDEFTTL; -struct ipstat ipstat; - -/* - * We need to save the IP options in case a protocol wants to respond - * to an incoming packet over the same route if the packet got here - * using IP source routing. This allows connection establishment and - * maintenance when the remote end is on a network that is not known - * to us. - */ -int ip_nhops = 0; -static struct ip_srcrt { - struct in_addr dst; /* final destination */ - char nop; /* one NOP to align */ - char srcopt[IPOPT_OFFSET + 1]; /* OPTVAL, OLEN and OFFSET */ - struct in_addr route[MAX_IPOPTLEN/sizeof(struct in_addr)]; -} ip_srcrt; - -/* - * Strip out IP options, at higher - * level protocol in the kernel. - * Second argument is buffer to which options - * will be moved, and return value is their length. - * XXX should be deleted; last arg currently ignored. - */ -void -ip_stripoptions(m, mopt) - register struct mbuf *m; - struct mbuf *mopt; -{ - register int i; - struct ip *ip = mtod(m, struct ip *); - register caddr_t opts; - int olen; - - olen = (ip->ip_hl<<2) - sizeof (struct ip); - opts = (caddr_t)(ip + 1); - i = m->m_len - (sizeof (struct ip) + olen); - bcopy(opts + olen, opts, (unsigned)i); - m->m_len -= olen; - if (m->m_flags & M_PKTHDR) - m->m_pkthdr.len -= olen; - ip->ip_hl = sizeof(struct ip) >> 2; -} - -/* - * Retrieve incoming source route for use in replies, - * in the same form used by setsockopt. - * The first hop is placed before the options, will be removed later. - */ -struct mbuf * -ip_srcroute() -{ - register struct in_addr *p, *q; - register struct mbuf *m; - - if (ip_nhops == 0) - return ((struct mbuf *)0); - m = m_get(M_DONTWAIT, MT_SOOPTS); - if (m == 0) - return ((struct mbuf *)0); - -#define OPTSIZ (sizeof(ip_srcrt.nop) + sizeof(ip_srcrt.srcopt)) - - /* length is (nhops+1)*sizeof(addr) + sizeof(nop + srcrt header) */ - m->m_len = ip_nhops * sizeof(struct in_addr) + sizeof(struct in_addr) + - OPTSIZ; -#ifdef DIAGNOSTIC - if (ipprintfs) - printf("ip_srcroute: nhops %d mlen %d", ip_nhops, m->m_len); -#endif - - /* - * First save first hop for return route - */ - p = &ip_srcrt.route[ip_nhops - 1]; - *(mtod(m, struct in_addr *)) = *p--; -#ifdef DIAGNOSTIC - if (ipprintfs) - printf(" hops %lx", ntohl(mtod(m, struct in_addr *)->s_addr)); -#endif - - /* - * Copy option fields and padding (nop) to mbuf. - */ - ip_srcrt.nop = IPOPT_NOP; - ip_srcrt.srcopt[IPOPT_OFFSET] = IPOPT_MINOFF; - (void)memcpy(mtod(m, caddr_t) + sizeof(struct in_addr), - &ip_srcrt.nop, OPTSIZ); - q = (struct in_addr *)(mtod(m, caddr_t) + - sizeof(struct in_addr) + OPTSIZ); -#undef OPTSIZ - /* - * Record return path as an IP source route, - * reversing the path (pointers are now aligned). - */ - while (p >= ip_srcrt.route) { -#ifdef DIAGNOSTIC - if (ipprintfs) - printf(" %lx", ntohl(q->s_addr)); -#endif - *q++ = *p--; - } - /* - * Last hop goes to final destination. - */ - *q = ip_srcrt.dst; -#ifdef DIAGNOSTIC - if (ipprintfs) - printf(" %lx\n", ntohl(q->s_addr)); -#endif - return (m); -} diff --git a/reactos/lib/oskittcp/oskittcp/ip_output.c b/reactos/lib/oskittcp/oskittcp/ip_output.c deleted file mode 100644 index 4a00269f56c..00000000000 --- a/reactos/lib/oskittcp/oskittcp/ip_output.c +++ /dev/null @@ -1,300 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1988, 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)ip_output.c 8.3 (Berkeley) 1/21/94 - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/malloc.h> -#include <sys/mbuf.h> -#include <sys/errno.h> -#include <sys/protosw.h> -#include <sys/socket.h> -#include <sys/socketvar.h> -#include <sys/queue.h> - -#include <net/if.h> -#include <net/route.h> - -#include <netinet/in.h> -#include <netinet/in_systm.h> -#include <netinet/ip.h> -#include <netinet/in_pcb.h> -#include <netinet/in_var.h> -#include <netinet/ip_var.h> - -#include <netinet/ip_fw.h> - -#ifdef vax -#include <machine/mtpr.h> -#endif -#include <oskittcp.h> - -u_short ip_id; - -/* - * Discard the IP multicast options. - */ -void -ip_freemoptions(imo) - register struct ip_moptions *imo; -{ - register int i; - - if (imo != NULL) { - for (i = 0; i < imo->imo_num_memberships; ++i) - in_delmulti(imo->imo_membership[i]); - free(imo, M_IPMOPTS); - } -} - -/* - * IP output. The packet in mbuf chain m contains a skeletal IP - * header (with len, off, ttl, proto, tos, src, dst). - * The mbuf chain containing the packet will be freed. - * The mbuf opt, if present, will not be freed. - */ -int -ip_output(so, m0, opt, ro, flags, imo) - struct socket *so; - struct mbuf *m0; - struct mbuf *opt; - struct route *ro; - int flags; - struct ip_moptions *imo; -{ - register struct mbuf *m = m0; - int error = ENETDOWN; - /* - * It might seem obvious at first glance that one could easily - * make a one-behind cache out of this by simply making `iproute' - * static and eliminating the bzero() below. However, this turns - * out not to work, for two reasons: - * - * 1) This routine needs to be reentrant. It can be called - * recursively from encapsulating network interfaces, and it - * is always called recursively from ip_mforward(). - * - * 2) You turn out not to gain much. There is already a one- - * behind cache implemented for the specific case of forwarding, - * and sends on a connected socket will use a route associated - * with the PCB. The only cases left are sends on unconnected - * and raw sockets, and if these cases are really significant, - * something is seriously wrong. - */ - ipstat.ips_localout++; - - /* - * If this is the case, we probably don't want to allocate - * a protocol-cloned route since we didn't get one from the - * ULP. This lets TCP do its thing, while not burdening - * forwarding or ICMP with the overhead of cloning a route. - * Of course, we still want to do any cloning requested by - * the link layer, as this is probably required in all cases - * for correct operation (as it is for ARP). - */ - - if( OtcpEvent.PacketSend ) { - error = OtcpEvent.PacketSend - ( OtcpEvent.ClientData, - so, - so ? so->so_connection : 0, - m->m_data + IPHDR_SIZE, m->m_len - IPHDR_SIZE ); - } - - return (error); -} - -/* - * Copy options from ip to jp, - * omitting those not copied during fragmentation. - */ -int -ip_optcopy(ip, jp) - struct ip *ip, *jp; -{ - register u_char *cp, *dp; - int opt, optlen, cnt; - - cp = (u_char *)(ip + 1); - dp = (u_char *)(jp + 1); - cnt = (ip->ip_hl << 2) - sizeof (struct ip); - for (; cnt > 0; cnt -= optlen, cp += optlen) { - opt = cp[0]; - if (opt == IPOPT_EOL) - break; - if (opt == IPOPT_NOP) { - /* Preserve for IP mcast tunnel's LSRR alignment. */ - *dp++ = IPOPT_NOP; - optlen = 1; - continue; - } else - optlen = cp[IPOPT_OLEN]; - /* bogus lengths should have been caught by ip_dooptions */ - if (optlen > cnt) - optlen = cnt; - if (IPOPT_COPIED(opt)) { - (void)memcpy(dp, cp, (unsigned)optlen); - dp += optlen; - } - } - for (optlen = dp - (u_char *)(jp+1); optlen & 0x3; optlen++) - *dp++ = IPOPT_EOL; - return (optlen); -} - -/* - * IP socket option processing. - */ -int -ip_ctloutput(op, so, level, optname, mp) - int op; - struct socket *so; - int level, optname; - struct mbuf **mp; -{ - register struct inpcb *inp = sotoinpcb(so); - register struct mbuf *m = *mp; - register int optval = 0; - int error = 0; - - if (level != IPPROTO_IP) { - error = EINVAL; - if (op == PRCO_SETOPT && *mp) - (void) m_free(*mp); - } else switch (op) { - - case PRCO_SETOPT: - switch (optname) { - case IP_TOS: - case IP_TTL: - case IP_RECVOPTS: - case IP_RECVRETOPTS: - case IP_RECVDSTADDR: - if (m == 0 || m->m_len != sizeof(int)) - error = EINVAL; - else { - optval = *mtod(m, int *); - switch (optname) { - - case IP_TOS: - inp->inp_ip.ip_tos = optval; - break; - - case IP_TTL: - inp->inp_ip.ip_ttl = optval; - break; -#define OPTSET(bit) \ - if (optval) \ - inp->inp_flags |= bit; \ - else \ - inp->inp_flags &= ~bit; - - case IP_RECVOPTS: - OPTSET(INP_RECVOPTS); - break; - - case IP_RECVRETOPTS: - OPTSET(INP_RECVRETOPTS); - break; - - case IP_RECVDSTADDR: - OPTSET(INP_RECVDSTADDR); - break; - } - } - break; -#undef OPTSET - default: - error = ENOPROTOOPT; - break; - } - if (m) - (void)m_free(m); - break; - - case PRCO_GETOPT: - switch (optname) { - case IP_OPTIONS: - case IP_RETOPTS: - *mp = m = m_get(M_WAIT, MT_SOOPTS); - if (inp->inp_options) { - m->m_len = inp->inp_options->m_len; - (void)memcpy(mtod(m, void *), - mtod(inp->inp_options, void *), (unsigned)m->m_len); - } else - m->m_len = 0; - break; - - case IP_TOS: - case IP_TTL: - case IP_RECVOPTS: - case IP_RECVRETOPTS: - case IP_RECVDSTADDR: - *mp = m = m_get(M_WAIT, MT_SOOPTS); - m->m_len = sizeof(int); - switch (optname) { - - case IP_TOS: - optval = inp->inp_ip.ip_tos; - break; - - case IP_TTL: - optval = inp->inp_ip.ip_ttl; - break; - -#define OPTBIT(bit) (inp->inp_flags & bit ? 1 : 0) - - case IP_RECVOPTS: - optval = OPTBIT(INP_RECVOPTS); - break; - - case IP_RECVRETOPTS: - optval = OPTBIT(INP_RECVRETOPTS); - break; - - case IP_RECVDSTADDR: - optval = OPTBIT(INP_RECVDSTADDR); - break; - } - *mtod(m, int *) = optval; - break; - - default: - error = ENOPROTOOPT; - break; - } - break; - } - return (error); -} diff --git a/reactos/lib/oskittcp/oskittcp/kern_clock.c b/reactos/lib/oskittcp/oskittcp/kern_clock.c deleted file mode 100644 index c53581fd5fe..00000000000 --- a/reactos/lib/oskittcp/oskittcp/kern_clock.c +++ /dev/null @@ -1,361 +0,0 @@ -/* - * Copyright (c) 1997-1998 University of Utah and the Flux Group. - * All rights reserved. - * - * This file is part of the Flux OSKit. The OSKit is free software, also known - * as "open source;" you can redistribute it and/or modify it under the terms - * of the GNU General Public License (GPL), version 2, as published by the Free - * Software Foundation (FSF). To explore alternate licensing terms, contact - * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. - * - * The OSKit 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 GPL for more details. You should have - * received a copy of the GPL along with the OSKit; see the file COPYING. If - * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. - */ -/* - * I am having no mercy with this file. - * I ripped out everything I didn't need - */ -/*- - * Copyright (c) 1982, 1986, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)kern_clock.c 8.5 (Berkeley) 1/21/94 - * $\Id: kern_clock.c,v 1.26 1996/07/30 16:59:22 bde Exp $ - */ - -/* Portions of this software are covered by the following: */ -/****************************************************************************** - * * - * Copyright (c) David L. Mills 1993, 1994 * - * * - * Permission to use, copy, modify, and distribute this software and its * - * documentation for any purpose and without fee is hereby granted, provided * - * that the above copyright notice appears in all copies and that both the * - * copyright notice and this permission notice appear in supporting * - * documentation, and that the name University of Delaware not be used in * - * advertising or publicity pertaining to distribution of the software * - * without specific, written prior permission. The University of Delaware * - * makes no representations about the suitability this software for any * - * purpose. It is provided "as is" without express or implied warranty. * - * * - *****************************************************************************/ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/callout.h> -#include <sys/kernel.h> -#include <sys/proc.h> - -/* Exported to machdep.c. */ -struct callout *callfree, *callout; - -static struct callout calltodo; - -long tk_cancc; -long tk_nin; -long tk_nout; -long tk_rawcc; - -/* - * Clock handling routines. - * - * This code is written to operate with two timers that run independently of - * each other. The main clock, running hz times per second, is used to keep - * track of real time. The second timer handles kernel and user profiling, - * and does resource use estimation. If the second timer is programmable, - * it is randomized to avoid aliasing between the two clocks. For example, - * the randomization prevents an adversary from always giving up the cpu - * just before its quantum expires. Otherwise, it would never accumulate - * cpu ticks. The mean frequency of the second timer is stathz. - * - * If no second timer exists, stathz will be zero; in this case we drive - * profiling and statistics off the main clock. This WILL NOT be accurate; - * do not do it unless absolutely necessary. - * - * The statistics clock may (or may not) be run at a higher rate while - * profiling. This profile clock runs at profhz. We require that profhz - * be an integral multiple of stathz. - * - * If the statistics clock is running fast, it must be divided by the ratio - * profhz/stathz for statistics. (For profiling, every tick counts.) - */ - -/* - * TODO: - * allocate more timeout table slots when table overflows. - */ - -/* - * Bump a timeval by a small number of usec's. - */ -#define BUMPTIME(t, usec) { \ - register volatile struct timeval *tp = (t); \ - register long us; \ - \ - tp->tv_usec = us = tp->tv_usec + (usec); \ - if (us >= 1000000) { \ - tp->tv_usec = us - 1000000; \ - tp->tv_sec++; \ - } \ -} - -int ticks; -volatile struct timeval time; -volatile struct timeval mono_time; - -/* - * The real-time timer, interrupting hz times per second. - */ -void bsd_hardclock(void) -{ - register struct callout *p1; - register int needsoft; - unsigned cpl; - int s; - - save_cpl(&cpl); - splhigh(); - - /* - * Update real-time timeout queue. - * At front of queue are some number of events which are ``due''. - * The time to these is <= 0 and if negative represents the - * number of ticks which have passed since it was supposed to happen. - * The rest of the q elements (times > 0) are events yet to happen, - * where the time for each is given as a delta from the previous. - * Decrementing just the first of these serves to decrement the time - * to all events. - */ - needsoft = 0; - for (p1 = calltodo.c_next; p1 != NULL; p1 = p1->c_next) { - if (--p1->c_time > 0) - break; - needsoft = 1; - if (p1->c_time == 0) - break; - } - - /* - * Increment the time-of-day. - */ - ticks++; - BUMPTIME(&mono_time, tick); - BUMPTIME(&time, tick); - - /* - * At this point, we might need a soft interrupt. We say, what the - * heck, let's do the work now. Reduce priority level to softclock - * first, though. The alternative (postponing it) would be called - * 'setsoftclock' - */ - if (needsoft) { - (void)splsoftclock(); - softclock(); - } - - restore_cpl(cpl); -} - -/* - * Software (low priority) clock interrupt. - * Run periodic events from timeout queue. - */ -/*ARGSUSED*/ -void -softclock() -{ - register struct callout *c; - register void *arg; - register void (*func) __P((void *)); - register int s; - - s = splhigh(); - while ((c = calltodo.c_next) != NULL && c->c_time <= 0) { - func = c->c_func; - arg = c->c_arg; - calltodo.c_next = c->c_next; - c->c_next = callfree; - callfree = c; - splx(s); - (*func)(arg); - (void) splhigh(); - } - splx(s); -} - -/* - * timeout -- - * Execute a function after a specified length of time. - * - * untimeout -- - * Cancel previous timeout function call. - * - * See AT&T BCI Driver Reference Manual for specification. This - * implementation differs from that one in that no identification - * value is returned from timeout, rather, the original arguments - * to timeout are used to identify entries for untimeout. - */ -void -timeout(ftn, arg, ticks) - timeout_t ftn; - void *arg; - register int ticks; -{ - register struct callout *new, *p, *t; - register int s; - - if (ticks <= 0) - ticks = 1; - - /* Lock out the clock. */ - s = splhigh(); - - /* Fill in the next free callout structure. */ - if (callfree == NULL) - panic("timeout table full"); - new = callfree; - callfree = new->c_next; - new->c_arg = arg; - new->c_func = ftn; - - /* - * The time for each event is stored as a difference from the time - * of the previous event on the queue. Walk the queue, correcting - * the ticks argument for queue entries passed. Correct the ticks - * value for the queue entry immediately after the insertion point - * as well. Watch out for negative c_time values; these represent - * overdue events. - */ - for (p = &calltodo; - (t = p->c_next) != NULL && ticks > t->c_time; p = t) - if (t->c_time > 0) - ticks -= t->c_time; - new->c_time = ticks; - if (t != NULL) - t->c_time -= ticks; - - /* Insert the new entry into the queue. */ - p->c_next = new; - new->c_next = t; - splx(s); -} - -void -untimeout(ftn, arg) - timeout_t ftn; - void *arg; -{ - register struct callout *p, *t; - register int s; - - s = splhigh(); - for (p = &calltodo; (t = p->c_next) != NULL; p = t) - if (t->c_func == ftn && t->c_arg == arg) { - /* Increment next entry's tick count. */ - if (t->c_next && t->c_time > 0) - t->c_next->c_time += t->c_time; - - /* Move entry from callout queue to callfree queue. */ - p->c_next = t->c_next; - t->c_next = callfree; - callfree = t; - break; - } - splx(s); -} - -/* - * Compute number of hz until specified time. Used to - * compute third argument to timeout() from an absolute time. - */ -int -hzto(tv) - struct timeval *tv; -{ - register unsigned long ticks; - register long sec, usec; - int s; - - /* - * If the number of usecs in the whole seconds part of the time - * difference fits in a long, then the total number of usecs will - * fit in an unsigned long. Compute the total and convert it to - * ticks, rounding up and adding 1 to allow for the current tick - * to expire. Rounding also depends on unsigned long arithmetic - * to avoid overflow. - * - * Otherwise, if the number of ticks in the whole seconds part of - * the time difference fits in a long, then convert the parts to - * ticks separately and add, using similar rounding methods and - * overflow avoidance. This method would work in the previous - * case but it is slightly slower and assumes that hz is integral. - * - * Otherwise, round the time difference down to the maximum - * representable value. - * - * If ints have 32 bits, then the maximum value for any timeout in - * 10ms ticks is 248 days. - */ - s = splclock(); - sec = tv->tv_sec - time.tv_sec; - usec = tv->tv_usec - time.tv_usec; - splx(s); - if (usec < 0) { - sec--; - usec += 1000000; - } - if (sec < 0) { -#ifdef DIAGNOSTIC - printf("hzto: negative time difference %ld sec %ld usec\n", - sec, usec); -#endif - ticks = 1; - } else if (sec <= LONG_MAX / 1000000) - ticks = (sec * 1000000 + (unsigned long)usec + (tick - 1)) - / tick + 1; - else if (sec <= LONG_MAX / hz) - ticks = sec * hz - + ((unsigned long)usec + (tick - 1)) / tick + 1; - else - ticks = LONG_MAX; - if (ticks > INT_MAX) - ticks = INT_MAX; - return (ticks); -} - diff --git a/reactos/lib/oskittcp/oskittcp/kern_subr.c b/reactos/lib/oskittcp/oskittcp/kern_subr.c deleted file mode 100644 index a7daef481f3..00000000000 --- a/reactos/lib/oskittcp/oskittcp/kern_subr.c +++ /dev/null @@ -1,252 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)kern_subr.c 8.3 (Berkeley) 1/21/94 - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/proc.h> -#include <sys/malloc.h> -#include <sys/queue.h> -#include <oskittcp.h> - -int -uiomove(cp, n, uio) - register caddr_t cp; - register int n; - register struct uio *uio; -{ - register struct iovec *iov; - u_int cnt; - int error; - -#ifdef DIAGNOSTIC - if (uio->uio_rw != UIO_READ && uio->uio_rw != UIO_WRITE) - panic("uiomove: mode"); - if (uio->uio_segflg == UIO_USERSPACE && uio->uio_procp != curproc) - panic("uiomove proc"); -#endif - while (n > 0 && uio->uio_resid) { - iov = uio->uio_iov; - cnt = iov->iov_len; - if (cnt == 0) { - uio->uio_iov++; - uio->uio_iovcnt--; - continue; - } - if (cnt > n) - cnt = n; - - switch (uio->uio_segflg) { - - case UIO_USERSPACE: - case UIO_USERISPACE: - if (uio->uio_rw == UIO_READ) - error = copyout(cp, iov->iov_base, cnt); - else - error = copyin(iov->iov_base, cp, cnt); - if (error) - return (error); - break; - - case UIO_SYSSPACE: - if (uio->uio_rw == UIO_READ) - bcopy((caddr_t)cp, iov->iov_base, cnt); - else - bcopy(iov->iov_base, (caddr_t)cp, cnt); - break; - case UIO_NOCOPY: - break; - } - iov->iov_base += cnt; - iov->iov_len -= cnt; - uio->uio_resid -= cnt; - uio->uio_offset += cnt; - cp += cnt; - n -= cnt; - } - return (0); -} - -/* - * Give next character to user as result of read. - */ -int -ureadc(c, uio) - register int c; - register struct uio *uio; -{ - register struct iovec *iov; - -again: - if (uio->uio_iovcnt == 0 || uio->uio_resid == 0) - panic("ureadc"); - iov = uio->uio_iov; - if (iov->iov_len == 0) { - uio->uio_iovcnt--; - uio->uio_iov++; - goto again; - } - switch (uio->uio_segflg) { - - case UIO_USERSPACE: - if (subyte(iov->iov_base, c) < 0) - return (EFAULT); - break; - - case UIO_SYSSPACE: - *iov->iov_base = c; - break; - - case UIO_USERISPACE: - if (suibyte(iov->iov_base, c) < 0) - return (EFAULT); - break; - case UIO_NOCOPY: - break; - } - iov->iov_base++; - iov->iov_len--; - uio->uio_resid--; - uio->uio_offset++; - return (0); -} - -#ifdef vax /* unused except by ct.c, other oddities XXX */ -/* - * Get next character written in by user from uio. - */ -int -uwritec(uio) - struct uio *uio; -{ - register struct iovec *iov; - register int c; - - if (uio->uio_resid <= 0) - return (-1); -again: - if (uio->uio_iovcnt <= 0) - panic("uwritec"); - iov = uio->uio_iov; - if (iov->iov_len == 0) { - uio->uio_iov++; - if (--uio->uio_iovcnt == 0) - return (-1); - goto again; - } - switch (uio->uio_segflg) { - - case UIO_USERSPACE: - c = fubyte(iov->iov_base); - break; - - case UIO_SYSSPACE: - c = *(u_char *) iov->iov_base; - break; - - case UIO_USERISPACE: - c = fuibyte(iov->iov_base); - break; - } - if (c < 0) - return (-1); - iov->iov_base++; - iov->iov_len--; - uio->uio_resid--; - uio->uio_offset++; - return (c); -} -#endif /* vax */ - -/* - * General routine to allocate a hash table. - */ -void * -hashinit(elements, type, hashmask) - int elements, type; - u_long *hashmask; -{ - long hashsize; - LIST_HEAD(generic, generic) *hashtbl; - int i; - - if (elements <= 0) - panic("hashinit: bad elements"); - for (hashsize = 1; hashsize <= elements; hashsize <<= 1) - continue; - hashsize >>= 1; - hashtbl = malloc((u_long)hashsize * sizeof(*hashtbl), type, M_WAITOK); - for (i = 0; i < hashsize; i++) - LIST_INIT(&hashtbl[i]); - *hashmask = hashsize - 1; - return (hashtbl); -} - -#define NPRIMES 27 -static int primes[] = { 1, 13, 31, 61, 127, 251, 509, 761, 1021, 1531, 2039, - 2557, 3067, 3583, 4093, 4603, 5119, 5623, 6143, 6653, - 7159, 7673, 8191, 12281, 16381, 24571, 32749 }; - -/* - * General routine to allocate a prime number sized hash table. - */ -void * -phashinit(elements, type, nentries) - int elements, type; - u_long *nentries; -{ - long hashsize; - LIST_HEAD(generic, generic) *hashtbl; - int i; - - if (elements <= 0) - panic("phashinit: bad elements"); - for (i = 1, hashsize = primes[1]; hashsize <= elements;) { - i++; - if (i == NPRIMES) - break; - hashsize = primes[i]; - } - hashsize = primes[i - 1]; - hashtbl = malloc((u_long)hashsize * sizeof(*hashtbl), type, M_WAITOK); - for (i = 0; i < hashsize; i++) - LIST_INIT(&hashtbl[i]); - *nentries = hashsize; - return (hashtbl); -} diff --git a/reactos/lib/oskittcp/oskittcp/malloc.c b/reactos/lib/oskittcp/oskittcp/malloc.c deleted file mode 100644 index 2d3fb43500a..00000000000 --- a/reactos/lib/oskittcp/oskittcp/malloc.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <oskittcp.h> -#include <oskitdebug.h> -#include <ntddk.h> -#include <memtrack.h> - -void *fbsd_malloc( size_t size, char *file, int line, ... ) { - void *v; - v = ExAllocatePool( NonPagedPool, size ); - if( v ) TrackWithTag(FBSD_MALLOC,v,file,line); - return v; -} - -void fbsd_free( void *data, char *file, int line, ... ) { - UntrackFL(file,line,data); - ExFreePool( data ); -} diff --git a/reactos/lib/oskittcp/oskittcp/param.c b/reactos/lib/oskittcp/oskittcp/param.c deleted file mode 100644 index 871441fa780..00000000000 --- a/reactos/lib/oskittcp/oskittcp/param.c +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 1997-1998 University of Utah and the Flux Group. - * All rights reserved. - * - * This file is part of the Flux OSKit. The OSKit is free software, also known - * as "open source;" you can redistribute it and/or modify it under the terms - * of the GNU General Public License (GPL), version 2, as published by the Free - * Software Foundation (FSF). To explore alternate licensing terms, contact - * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. - * - * The OSKit 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 GPL for more details. You should have - * received a copy of the GPL along with the OSKit; see the file COPYING. If - * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. - */ - -#define HZ 100 -#define MAXUSERS 64 - -int hz = HZ; -int tick = 1000000 / HZ; -int nmbclusters = 512 + MAXUSERS * 16; - diff --git a/reactos/lib/oskittcp/oskittcp/radix.c b/reactos/lib/oskittcp/oskittcp/radix.c deleted file mode 100644 index a23552cc517..00000000000 --- a/reactos/lib/oskittcp/oskittcp/radix.c +++ /dev/null @@ -1,1006 +0,0 @@ -/* - * Copyright (c) 1988, 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)radix.c 8.4 (Berkeley) 11/2/94 - */ - -/* - * Routines to build and maintain radix trees for routing lookups. - */ -#ifndef _RADIX_H_ -#include <sys/param.h> -#ifdef KERNEL -#include <sys/systm.h> -#include <sys/malloc.h> -#define M_DONTWAIT M_NOWAIT -#include <sys/domain.h> -#else -#include <stdlib.h> -#endif -#include <sys/syslog.h> -#include <net/radix.h> -#endif -#include <oskittcp.h> - -int max_keylen; -struct radix_mask *rn_mkfreelist; -struct radix_node_head *mask_rnhead; -static char *addmask_key; -static char normal_chars[] = {0, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, -1}; -static char *rn_zeros, *rn_ones; - -#define rn_masktop (mask_rnhead->rnh_treetop) -#undef Bcmp -#define Bcmp(a, b, l) (l == 0 ? 0 : bcmp((caddr_t)(a), (caddr_t)(b), (u_long)l)) -/* - * The data structure for the keys is a radix tree with one way - * branching removed. The index rn_b at an internal node n represents a bit - * position to be tested. The tree is arranged so that all descendants - * of a node n have keys whose bits all agree up to position rn_b - 1. - * (We say the index of n is rn_b.) - * - * There is at least one descendant which has a one bit at position rn_b, - * and at least one with a zero there. - * - * A route is determined by a pair of key and mask. We require that the - * bit-wise logical and of the key and mask to be the key. - * We define the index of a route to associated with the mask to be - * the first bit number in the mask where 0 occurs (with bit number 0 - * representing the highest order bit). - * - * We say a mask is normal if every bit is 0, past the index of the mask. - * If a node n has a descendant (k, m) with index(m) == index(n) == rn_b, - * and m is a normal mask, then the route applies to every descendant of n. - * If the index(m) < rn_b, this implies the trailing last few bits of k - * before bit b are all 0, (and hence consequently true of every descendant - * of n), so the route applies to all descendants of the node as well. - * - * Similar logic shows that a non-normal mask m such that - * index(m) <= index(n) could potentially apply to many children of n. - * Thus, for each non-host route, we attach its mask to a list at an internal - * node as high in the tree as we can go. - * - * The present version of the code makes use of normal routes in short- - * circuiting an explict mask and compare operation when testing whether - * a key satisfies a normal route, and also in remembering the unique leaf - * that governs a subtree. - */ - -struct radix_node * -rn_search(v_arg, head) - void *v_arg; - struct radix_node *head; -{ - register struct radix_node *x; - register caddr_t v; - - for (x = head, v = v_arg; x->rn_b >= 0;) { - if (x->rn_bmask & v[x->rn_off]) - x = x->rn_r; - else - x = x->rn_l; - } - return (x); -}; - -struct radix_node * -rn_search_m(v_arg, head, m_arg) - struct radix_node *head; - void *v_arg, *m_arg; -{ - register struct radix_node *x; - register caddr_t v = v_arg, m = m_arg; - - for (x = head; x->rn_b >= 0;) { - if ((x->rn_bmask & m[x->rn_off]) && - (x->rn_bmask & v[x->rn_off])) - x = x->rn_r; - else - x = x->rn_l; - } - return x; -}; - -int -rn_refines(m_arg, n_arg) - void *m_arg, *n_arg; -{ - register caddr_t m = m_arg, n = n_arg; - register caddr_t lim, lim2 = lim = n + *(u_char *)n; - int longer = (*(u_char *)n++) - (int)(*(u_char *)m++); - int masks_are_equal = 1; - - if (longer > 0) - lim -= longer; - while (n < lim) { - if (*n & ~(*m)) - return 0; - if (*n++ != *m++) - masks_are_equal = 0; - } - while (n < lim2) - if (*n++) - return 0; - if (masks_are_equal && (longer < 0)) - for (lim2 = m - longer; m < lim2; ) - if (*m++) - return 1; - return (!masks_are_equal); -} - -struct radix_node * -rn_lookup(v_arg, m_arg, head) - void *v_arg, *m_arg; - struct radix_node_head *head; -{ - register struct radix_node *x; - caddr_t netmask = 0; - - if (m_arg) { - if ((x = rn_addmask(m_arg, 1, head->rnh_treetop->rn_off)) == 0) - return (0); - netmask = x->rn_key; - } - x = rn_match(v_arg, head); - if (x && netmask) { - while (x && x->rn_mask != netmask) - x = x->rn_dupedkey; - } - return x; -} - -static int -rn_satsifies_leaf(trial, leaf, skip) - char *trial; - register struct radix_node *leaf; - int skip; -{ - register char *cp = trial, *cp2 = leaf->rn_key, *cp3 = leaf->rn_mask; - char *cplim; - int length = min(*(u_char *)cp, *(u_char *)cp2); - - if (cp3 == 0) - cp3 = rn_ones; - else - length = min(length, *(u_char *)cp3); - cplim = cp + length; cp3 += skip; cp2 += skip; - for (cp += skip; cp < cplim; cp++, cp2++, cp3++) - if ((*cp ^ *cp2) & *cp3) - return 0; - return 1; -} - -struct radix_node * -rn_match(v_arg, head) - void *v_arg; - struct radix_node_head *head; -{ - caddr_t v = v_arg; - register struct radix_node *t = head->rnh_treetop, *x; - register caddr_t cp = v, cp2; - caddr_t cplim; - struct radix_node *saved_t, *top = t; - int off = t->rn_off, vlen = *(u_char *)cp, matched_off; - register int test, b, rn_b; - - /* - * Open code rn_search(v, top) to avoid overhead of extra - * subroutine call. - */ - for (; t->rn_b >= 0; ) { - if (t->rn_bmask & cp[t->rn_off]) - t = t->rn_r; - else - t = t->rn_l; - } - /* - * See if we match exactly as a host destination - * or at least learn how many bits match, for normal mask finesse. - * - * It doesn't hurt us to limit how many bytes to check - * to the length of the mask, since if it matches we had a genuine - * match and the leaf we have is the most specific one anyway; - * if it didn't match with a shorter length it would fail - * with a long one. This wins big for class B&C netmasks which - * are probably the most common case... - */ - if (t->rn_mask) - vlen = *(u_char *)t->rn_mask; - cp += off; cp2 = t->rn_key + off; cplim = v + vlen; - for (; cp < cplim; cp++, cp2++) - if (*cp != *cp2) - goto on1; - /* - * This extra grot is in case we are explicitly asked - * to look up the default. Ugh! - */ - if ((t->rn_flags & RNF_ROOT) && t->rn_dupedkey) - t = t->rn_dupedkey; - return t; -on1: - test = (*cp ^ *cp2) & 0xff; /* find first bit that differs */ - for (b = 7; (test >>= 1) > 0;) - b--; - matched_off = cp - v; - b += matched_off << 3; - rn_b = -1 - b; - /* - * If there is a host route in a duped-key chain, it will be first. - */ - if ((saved_t = t)->rn_mask == 0) - t = t->rn_dupedkey; - for (; t; t = t->rn_dupedkey) - /* - * Even if we don't match exactly as a host, - * we may match if the leaf we wound up at is - * a route to a net. - */ - if (t->rn_flags & RNF_NORMAL) { - if (rn_b <= t->rn_b) - return t; - } else if (rn_satsifies_leaf(v, t, matched_off)) - return t; - t = saved_t; - /* start searching up the tree */ - do { - register struct radix_mask *m; - t = t->rn_p; - m = t->rn_mklist; - if (m) { - /* - * If non-contiguous masks ever become important - * we can restore the masking and open coding of - * the search and satisfaction test and put the - * calculation of "off" back before the "do". - */ - do { - if (m->rm_flags & RNF_NORMAL) { - if (rn_b <= m->rm_b) - return (m->rm_leaf); - } else { - off = min(t->rn_off, matched_off); - x = rn_search_m(v, t, m->rm_mask); - while (x && x->rn_mask != m->rm_mask) - x = x->rn_dupedkey; - if (x && rn_satsifies_leaf(v, x, off)) - return x; - } - m = m->rm_mklist; - } while (m); - } - } while (t != top); - return 0; -}; - -#ifdef RN_DEBUG -int rn_nodenum; -struct radix_node *rn_clist; -int rn_saveinfo; -int rn_debug = 1; -#endif - -struct radix_node * -rn_newpair(v, b, nodes) - void *v; - int b; - struct radix_node nodes[2]; -{ - register struct radix_node *tt = nodes, *t = tt + 1; - t->rn_b = b; t->rn_bmask = 0x80 >> (b & 7); - t->rn_l = tt; t->rn_off = b >> 3; - tt->rn_b = -1; tt->rn_key = (caddr_t)v; tt->rn_p = t; - tt->rn_flags = t->rn_flags = RNF_ACTIVE; -#ifdef RN_DEBUG - tt->rn_info = rn_nodenum++; t->rn_info = rn_nodenum++; - tt->rn_twin = t; tt->rn_ybro = rn_clist; rn_clist = tt; -#endif - return t; -} - -struct radix_node * -rn_insert(v_arg, head, dupentry, nodes) - void *v_arg; - struct radix_node_head *head; - int *dupentry; - struct radix_node nodes[2]; -{ - caddr_t v = v_arg; - struct radix_node *top = head->rnh_treetop; - int head_off = top->rn_off, vlen = (int)*((u_char *)v); - register struct radix_node *t = rn_search(v_arg, top); - register caddr_t cp = v + head_off; - register int b; - struct radix_node *tt; - /* - * Find first bit at which v and t->rn_key differ - */ - { - register caddr_t cp2 = t->rn_key + head_off; - register int cmp_res; - caddr_t cplim = v + vlen; - - while (cp < cplim) - if (*cp2++ != *cp++) - goto on1; - *dupentry = 1; - return t; -on1: - *dupentry = 0; - cmp_res = (cp[-1] ^ cp2[-1]) & 0xff; - for (b = (cp - v) << 3; cmp_res; b--) - cmp_res >>= 1; - } - { - register struct radix_node *p, *x = top; - cp = v; - do { - p = x; - if (cp[x->rn_off] & x->rn_bmask) - x = x->rn_r; - else x = x->rn_l; - } while (b > (unsigned) x->rn_b); /* x->rn_b < b && x->rn_b >= 0 */ -#ifdef RN_DEBUG - if (rn_debug) - log(LOG_DEBUG, "rn_insert: Going In:\n"), traverse(p); -#endif - t = rn_newpair(v_arg, b, nodes); tt = t->rn_l; - if ((cp[p->rn_off] & p->rn_bmask) == 0) - p->rn_l = t; - else - p->rn_r = t; - x->rn_p = t; t->rn_p = p; /* frees x, p as temp vars below */ - if ((cp[t->rn_off] & t->rn_bmask) == 0) { - t->rn_r = x; - } else { - t->rn_r = tt; t->rn_l = x; - } -#ifdef RN_DEBUG - if (rn_debug) - log(LOG_DEBUG, "rn_insert: Coming Out:\n"), traverse(p); -#endif - } - return (tt); -} - -struct radix_node * -rn_addmask(n_arg, search, skip) - int search, skip; - void *n_arg; -{ - caddr_t netmask = (caddr_t)n_arg; - register struct radix_node *x; - register caddr_t cp, cplim; - register int b = 0, mlen, j; - int maskduplicated, m0, isnormal; - struct radix_node *saved_x; - static int last_zeroed = 0; - - if ((mlen = *(u_char *)netmask) > max_keylen) - mlen = max_keylen; - if (skip == 0) - skip = 1; - if (mlen <= skip) - return (mask_rnhead->rnh_nodes); - if (skip > 1) - Bcopy(rn_ones + 1, addmask_key + 1, skip - 1); - if ((m0 = mlen) > skip) - Bcopy(netmask + skip, addmask_key + skip, mlen - skip); - /* - * Trim trailing zeroes. - */ - for (cp = addmask_key + mlen; (cp > addmask_key) && cp[-1] == 0;) - cp--; - mlen = cp - addmask_key; - if (mlen <= skip) { - if (m0 >= last_zeroed) - last_zeroed = mlen; - return (mask_rnhead->rnh_nodes); - } - if (m0 < last_zeroed) - Bzero(addmask_key + m0, last_zeroed - m0); - *addmask_key = last_zeroed = mlen; - x = rn_search(addmask_key, rn_masktop); - if (Bcmp(addmask_key, x->rn_key, mlen) != 0) - x = 0; - if (x || search) - return (x); - R_Malloc(x, struct radix_node *, max_keylen + 2 * sizeof (*x)); - if ((saved_x = x) == 0) - return (0); - Bzero(x, max_keylen + 2 * sizeof (*x)); - netmask = cp = (caddr_t)(x + 2); - Bcopy(addmask_key, cp, mlen); - x = rn_insert(cp, mask_rnhead, &maskduplicated, x); - if (maskduplicated) { - log(LOG_ERR, "rn_addmask: mask impossibly already in tree"); - Free(saved_x); - return (x); - } - /* - * Calculate index of mask, and check for normalcy. - */ - cplim = netmask + mlen; isnormal = 1; - for (cp = netmask + skip; (cp < cplim) && *(u_char *)cp == 0xff;) - cp++; - if (cp != cplim) { - for (j = 0x80; (j & *cp) != 0; j >>= 1) - b++; - if (*cp != normal_chars[b] || cp != (cplim - 1)) - isnormal = 0; - } - b += (cp - netmask) << 3; - x->rn_b = -1 - b; - if (isnormal) - x->rn_flags |= RNF_NORMAL; - return (x); -} - -static int /* XXX: arbitrary ordering for non-contiguous masks */ -rn_lexobetter(m_arg, n_arg) - void *m_arg, *n_arg; -{ - register u_char *mp = m_arg, *np = n_arg, *lim; - - if (*mp > *np) - return 1; /* not really, but need to check longer one first */ - if (*mp == *np) - for (lim = mp + *mp; mp < lim;) - if (*mp++ > *np++) - return 1; - return 0; -} - -static struct radix_mask * -rn_new_radix_mask(tt, next) - register struct radix_node *tt; - register struct radix_mask *next; -{ - register struct radix_mask *m; - - MKGet(m); - if (m == 0) { - log(LOG_ERR, "Mask for route not entered\n"); - return (0); - } - Bzero(m, sizeof *m); - m->rm_b = tt->rn_b; - m->rm_flags = tt->rn_flags; - if (tt->rn_flags & RNF_NORMAL) - m->rm_leaf = tt; - else - m->rm_mask = tt->rn_mask; - m->rm_mklist = next; - tt->rn_mklist = m; - return m; -} - -struct radix_node * -rn_addroute(v_arg, n_arg, head, treenodes) - void *v_arg, *n_arg; - struct radix_node_head *head; - struct radix_node treenodes[2]; -{ - caddr_t v = (caddr_t)v_arg, netmask = (caddr_t)n_arg; - register struct radix_node *t, *x = 0, *tt; - struct radix_node *saved_tt, *top = head->rnh_treetop; - short b = 0, b_leaf = 0; - int keyduplicated; - caddr_t mmask; - struct radix_mask *m, **mp; - - /* - * In dealing with non-contiguous masks, there may be - * many different routes which have the same mask. - * We will find it useful to have a unique pointer to - * the mask to speed avoiding duplicate references at - * nodes and possibly save time in calculating indices. - */ - if (netmask) { - if ((x = rn_addmask(netmask, 0, top->rn_off)) == 0) - return (0); - b_leaf = x->rn_b; - b = -1 - x->rn_b; - netmask = x->rn_key; - } - /* - * Deal with duplicated keys: attach node to previous instance - */ - saved_tt = tt = rn_insert(v, head, &keyduplicated, treenodes); - if (keyduplicated) { - for (t = tt; tt; t = tt, tt = tt->rn_dupedkey) { - if (tt->rn_mask == netmask) - return (0); - if (netmask == 0 || - (tt->rn_mask && - ((b_leaf < tt->rn_b) || /* index(netmask) > node */ - rn_refines(netmask, tt->rn_mask) || - rn_lexobetter(netmask, tt->rn_mask)))) - break; - } - /* - * If the mask is not duplicated, we wouldn't - * find it among possible duplicate key entries - * anyway, so the above test doesn't hurt. - * - * We sort the masks for a duplicated key the same way as - * in a masklist -- most specific to least specific. - * This may require the unfortunate nuisance of relocating - * the head of the list. - */ - if (tt == saved_tt) { - struct radix_node *xx = x; - /* link in at head of list */ - (tt = treenodes)->rn_dupedkey = t; - tt->rn_flags = t->rn_flags; - tt->rn_p = x = t->rn_p; - t->rn_p = tt; /* parent */ - if (x->rn_l == t) x->rn_l = tt; else x->rn_r = tt; - saved_tt = tt; x = xx; - } else { - (tt = treenodes)->rn_dupedkey = t->rn_dupedkey; - t->rn_dupedkey = tt; - tt->rn_p = t; /* parent */ - if (tt->rn_dupedkey) /* parent */ - tt->rn_dupedkey->rn_p = tt; /* parent */ - } -#ifdef RN_DEBUG - t=tt+1; tt->rn_info = rn_nodenum++; t->rn_info = rn_nodenum++; - tt->rn_twin = t; tt->rn_ybro = rn_clist; rn_clist = tt; -#endif - tt->rn_key = (caddr_t) v; - tt->rn_b = -1; - tt->rn_flags = RNF_ACTIVE; - } - /* - * Put mask in tree. - */ - if (netmask) { - tt->rn_mask = netmask; - tt->rn_b = x->rn_b; - tt->rn_flags |= x->rn_flags & RNF_NORMAL; - } - t = saved_tt->rn_p; - if (keyduplicated) - goto on2; - b_leaf = -1 - t->rn_b; - if (t->rn_r == saved_tt) x = t->rn_l; else x = t->rn_r; - /* Promote general routes from below */ - if (x->rn_b < 0) { - for (mp = &t->rn_mklist; x; x = x->rn_dupedkey) - if (x->rn_mask && (x->rn_b >= b_leaf) && x->rn_mklist == 0) { - *mp = m = rn_new_radix_mask(x, 0); - if (m) - mp = &m->rm_mklist; - } - } else if (x->rn_mklist) { - /* - * Skip over masks whose index is > that of new node - */ - for (mp = &x->rn_mklist; (m = *mp); mp = &m->rm_mklist) - if (m->rm_b >= b_leaf) - break; - t->rn_mklist = m; *mp = 0; - } -on2: - /* Add new route to highest possible ancestor's list */ - if ((netmask == 0) || (b > t->rn_b )) - return tt; /* can't lift at all */ - b_leaf = tt->rn_b; - do { - x = t; - t = t->rn_p; - } while (b <= t->rn_b && x != top); - /* - * Search through routes associated with node to - * insert new route according to index. - * Need same criteria as when sorting dupedkeys to avoid - * double loop on deletion. - */ - for (mp = &x->rn_mklist; (m = *mp); mp = &m->rm_mklist) { - if (m->rm_b < b_leaf) - continue; - if (m->rm_b > b_leaf) - break; - if (m->rm_flags & RNF_NORMAL) { - mmask = m->rm_leaf->rn_mask; - if (tt->rn_flags & RNF_NORMAL) { - log(LOG_ERR, - "Non-unique normal route, mask not entered"); - return tt; - } - } else - mmask = m->rm_mask; - if (mmask == netmask) { - m->rm_refs++; - tt->rn_mklist = m; - return tt; - } - if (rn_refines(netmask, mmask) || rn_lexobetter(netmask, mmask)) - break; - } - *mp = rn_new_radix_mask(tt, *mp); - return tt; -} - -struct radix_node * -rn_delete(v_arg, netmask_arg, head) - void *v_arg, *netmask_arg; - struct radix_node_head *head; -{ - register struct radix_node *t, *p, *x, *tt; - struct radix_mask *m, *saved_m, **mp; - struct radix_node *dupedkey, *saved_tt, *top; - caddr_t v, netmask; - int b, head_off, vlen; - - v = v_arg; - netmask = netmask_arg; - x = head->rnh_treetop; - tt = rn_search(v, x); - head_off = x->rn_off; - vlen = *(u_char *)v; - saved_tt = tt; - top = x; - if (tt == 0 || - Bcmp(v + head_off, tt->rn_key + head_off, vlen - head_off)) - return (0); - /* - * Delete our route from mask lists. - */ - if (netmask) { - if ((x = rn_addmask(netmask, 1, head_off)) == 0) - return (0); - netmask = x->rn_key; - while (tt->rn_mask != netmask) - if ((tt = tt->rn_dupedkey) == 0) - return (0); - } - if (tt->rn_mask == 0 || (saved_m = m = tt->rn_mklist) == 0) - goto on1; - if (tt->rn_flags & RNF_NORMAL) { - if (m->rm_leaf != tt || m->rm_refs > 0) { - log(LOG_ERR, "rn_delete: inconsistent annotation\n"); - return 0; /* dangling ref could cause disaster */ - } - } else { - if (m->rm_mask != tt->rn_mask) { - log(LOG_ERR, "rn_delete: inconsistent annotation\n"); - goto on1; - } - if (--m->rm_refs >= 0) - goto on1; - } - b = -1 - tt->rn_b; - t = saved_tt->rn_p; - if (b > t->rn_b) - goto on1; /* Wasn't lifted at all */ - do { - x = t; - t = t->rn_p; - } while (b <= t->rn_b && x != top); - for (mp = &x->rn_mklist; (m = *mp); mp = &m->rm_mklist) - if (m == saved_m) { - *mp = m->rm_mklist; - MKFree(m); - break; - } - if (m == 0) { - log(LOG_ERR, "rn_delete: couldn't find our annotation\n"); - if (tt->rn_flags & RNF_NORMAL) - return (0); /* Dangling ref to us */ - } -on1: - /* - * Eliminate us from tree - */ - if (tt->rn_flags & RNF_ROOT) - return (0); -#ifdef RN_DEBUG - /* Get us out of the creation list */ - for (t = rn_clist; t && t->rn_ybro != tt; t = t->rn_ybro) {} - if (t) t->rn_ybro = tt->rn_ybro; -#endif - t = tt->rn_p; - dupedkey = saved_tt->rn_dupedkey; - if (dupedkey) { - /* - * at this point, tt is the deletion target and saved_tt - * is the head of the dupekey chain - */ - if (tt == saved_tt) { - /* remove from head of chain */ - x = dupedkey; x->rn_p = t; - if (t->rn_l == tt) t->rn_l = x; else t->rn_r = x; - } else { - /* find node in front of tt on the chain */ - for (x = p = saved_tt; p && p->rn_dupedkey != tt;) - p = p->rn_dupedkey; - if (p) { - p->rn_dupedkey = tt->rn_dupedkey; - if (tt->rn_dupedkey) /* parent */ - tt->rn_dupedkey->rn_p = p; /* parent */ - } else log(LOG_ERR, "rn_delete: couldn't find us\n"); - } - t = tt + 1; - if (t->rn_flags & RNF_ACTIVE) { -#ifndef RN_DEBUG - *++x = *t; p = t->rn_p; -#else - b = t->rn_info; *++x = *t; t->rn_info = b; p = t->rn_p; -#endif - if (p->rn_l == t) p->rn_l = x; else p->rn_r = x; - x->rn_l->rn_p = x; x->rn_r->rn_p = x; - } - goto out; - } - if (t->rn_l == tt) x = t->rn_r; else x = t->rn_l; - p = t->rn_p; - if (p->rn_r == t) p->rn_r = x; else p->rn_l = x; - x->rn_p = p; - /* - * Demote routes attached to us. - */ - if (t->rn_mklist) { - if (x->rn_b >= 0) { - for (mp = &x->rn_mklist; (m = *mp);) - mp = &m->rm_mklist; - *mp = t->rn_mklist; - } else { - /* If there are any key,mask pairs in a sibling - duped-key chain, some subset will appear sorted - in the same order attached to our mklist */ - for (m = t->rn_mklist; m && x; x = x->rn_dupedkey) - if (m == x->rn_mklist) { - struct radix_mask *mm = m->rm_mklist; - x->rn_mklist = 0; - if (--(m->rm_refs) < 0) - MKFree(m); - m = mm; - } - if (m) - log(LOG_ERR, "%s %p at %x\n", - "rn_delete: Orphaned Mask", m, x); - } - } - /* - * We may be holding an active internal node in the tree. - */ - x = tt + 1; - if (t != x) { -#ifndef RN_DEBUG - *t = *x; -#else - b = t->rn_info; *t = *x; t->rn_info = b; -#endif - t->rn_l->rn_p = t; t->rn_r->rn_p = t; - p = x->rn_p; - if (p->rn_l == x) p->rn_l = t; else p->rn_r = t; - } -out: - tt->rn_flags &= ~RNF_ACTIVE; - tt[1].rn_flags &= ~RNF_ACTIVE; - return (tt); -} - -/* - * This is the same as rn_walktree() except for the parameters and the - * exit. - */ -int -rn_walktree_from(h, a, m, f, w) - struct radix_node_head *h; - void *a, *m; - register int (*f)(); - void *w; -{ - int error; - struct radix_node *base, *next; - u_char *xa = (u_char *)a; - u_char *xm = (u_char *)m; - register struct radix_node *rn, *last = 0 /* shut up gcc */; - int stopping = 0; - int lastb; - - /* - * rn_search_m is sort-of-open-coded here. - */ - /* printf("about to search\n"); */ - for (rn = h->rnh_treetop; rn->rn_b >= 0; ) { - last = rn; - /* printf("rn_b %d, rn_bmask %x, xm[rn_off] %x\n", - rn->rn_b, rn->rn_bmask, xm[rn->rn_off]); */ - if (!(rn->rn_bmask & xm[rn->rn_off])) { - break; - } - if (rn->rn_bmask & xa[rn->rn_off]) { - rn = rn->rn_r; - } else { - rn = rn->rn_l; - } - } - /* printf("done searching\n"); */ - - /* - * Two cases: either we stepped off the end of our mask, - * in which case last == rn, or we reached a leaf, in which - * case we want to start from the last node we looked at. - * Either way, last is the node we want to start from. - */ - rn = last; - lastb = rn->rn_b; - - /* printf("rn %p, lastb %d\n", rn, lastb);*/ - - /* - * This gets complicated because we may delete the node - * while applying the function f to it, so we need to calculate - * the successor node in advance. - */ - while (rn->rn_b >= 0) - rn = rn->rn_l; - - while (!stopping) { - /* printf("node %p (%d)\n", rn, rn->rn_b); */ - base = rn; - /* If at right child go back up, otherwise, go right */ - while (rn->rn_p->rn_r == rn && !(rn->rn_flags & RNF_ROOT)) { - rn = rn->rn_p; - - /* if went up beyond last, stop */ - if (rn->rn_b < lastb) { - stopping = 1; - /* printf("up too far\n"); */ - } - } - - /* Find the next *leaf* since next node might vanish, too */ - for (rn = rn->rn_p->rn_r; rn->rn_b >= 0;) - rn = rn->rn_l; - next = rn; - /* Process leaves */ - while ((rn = base) != 0) { - base = rn->rn_dupedkey; - /* printf("leaf %p\n", rn); */ - if (!(rn->rn_flags & RNF_ROOT) - && (error = (*f)(rn, w))) - return (error); - } - rn = next; - - if (rn->rn_flags & RNF_ROOT) { - /* printf("root, stopping"); */ - stopping = 1; - } - - } - return 0; -} - -int -rn_walktree(h, f, w) - struct radix_node_head *h; - register int (*f)(); - void *w; -{ - int error; - struct radix_node *base, *next; - register struct radix_node *rn = h->rnh_treetop; - /* - * This gets complicated because we may delete the node - * while applying the function f to it, so we need to calculate - * the successor node in advance. - */ - /* First time through node, go left */ - while (rn->rn_b >= 0) - rn = rn->rn_l; - for (;;) { - base = rn; - /* If at right child go back up, otherwise, go right */ - while (rn->rn_p->rn_r == rn && (rn->rn_flags & RNF_ROOT) == 0) - rn = rn->rn_p; - /* Find the next *leaf* since next node might vanish, too */ - for (rn = rn->rn_p->rn_r; rn->rn_b >= 0;) - rn = rn->rn_l; - next = rn; - /* Process leaves */ - while ((rn = base)) { - base = rn->rn_dupedkey; - if (!(rn->rn_flags & RNF_ROOT) && (error = (*f)(rn, w))) - return (error); - } - rn = next; - if (rn->rn_flags & RNF_ROOT) - return (0); - } - /* NOTREACHED */ -} - -int -rn_inithead(head, off) - void **head; - int off; -{ - register struct radix_node_head *rnh; - register struct radix_node *t, *tt, *ttt; - if (*head) - return (1); - R_Malloc(rnh, struct radix_node_head *, sizeof (*rnh)); - if (rnh == 0) - return (0); - Bzero(rnh, sizeof (*rnh)); - *head = rnh; - t = rn_newpair(rn_zeros, off, rnh->rnh_nodes); - ttt = rnh->rnh_nodes + 2; - t->rn_r = ttt; - t->rn_p = t; - tt = t->rn_l; - tt->rn_flags = t->rn_flags = RNF_ROOT | RNF_ACTIVE; - tt->rn_b = -1 - off; - *ttt = *tt; - ttt->rn_key = rn_ones; - rnh->rnh_addaddr = rn_addroute; - rnh->rnh_deladdr = rn_delete; - rnh->rnh_matchaddr = rn_match; - rnh->rnh_lookup = rn_lookup; - rnh->rnh_walktree = rn_walktree; - rnh->rnh_walktree_from = rn_walktree_from; - rnh->rnh_treetop = t; - return (1); -} - -void -rn_init() -{ - char *cp, *cplim; -#ifdef KERNEL - struct domain *dom; - - for (dom = domains; dom; dom = dom->dom_next) - if (dom->dom_maxrtkey > max_keylen) - max_keylen = dom->dom_maxrtkey; -#endif - if (max_keylen == 0) { - log(LOG_ERR, - "rn_init: radix functions require max_keylen be set\n"); - return; - } - R_Malloc(rn_zeros, char *, 3 * max_keylen); - if (rn_zeros == NULL) - panic("rn_init"); - Bzero(rn_zeros, 3 * max_keylen); - rn_ones = cp = rn_zeros + max_keylen; - addmask_key = cplim = rn_ones + max_keylen; - while (cp < cplim) - *cp++ = -1; - if (rn_inithead((void **)&mask_rnhead, 0) == 0) - panic("rn_init 2"); -} diff --git a/reactos/lib/oskittcp/oskittcp/random.c b/reactos/lib/oskittcp/oskittcp/random.c deleted file mode 100644 index ffbf03030e1..00000000000 --- a/reactos/lib/oskittcp/oskittcp/random.c +++ /dev/null @@ -1,63 +0,0 @@ -/*- - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)random.c 8.1 (Berkeley) 6/10/93 - */ - -#include <sys/libkern.h> - -/* - * Pseudo-random number generator for randomizing the profiling clock, - * and whatever else we might use it for. The result is uniform on - * [0, 2^31 - 1]. - */ -unsigned long -random() -{ - static unsigned long randseed = 1; - register long x, hi, lo, t; - - /* - * Compute x[n + 1] = (7^5 * x[n]) mod (2^31 - 1). - * From "Random number generators: good ones are hard to find", - * Park and Miller, Communications of the ACM, vol. 31, no. 10, - * October 1988, p. 1195. - */ - x = randseed; - hi = x / 127773; - lo = x % 127773; - t = 16807 * lo - 2836 * hi; - if (t <= 0) - t += 0x7fffffff; - randseed = t; - return (t); -} diff --git a/reactos/lib/oskittcp/oskittcp/route.c b/reactos/lib/oskittcp/oskittcp/route.c deleted file mode 100644 index a7b2f1edfaa..00000000000 --- a/reactos/lib/oskittcp/oskittcp/route.c +++ /dev/null @@ -1,807 +0,0 @@ -/* - * Copyright (c) 1980, 1986, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)route.c 8.2 (Berkeley) 11/15/93 - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/proc.h> -#include <sys/mbuf.h> -#include <sys/socket.h> -#include <sys/socketvar.h> -#include <sys/domain.h> -#include <sys/protosw.h> -#include <sys/ioctl.h> - -#include <net/if.h> -#include <net/route.h> -#include <net/raw_cb.h> - -#include <netinet/in.h> -#include <netinet/in_var.h> -#include <netinet/ip_mroute.h> - -#define SA(p) ((struct sockaddr *)(p)) - -int rttrash; /* routes not in table but not freed */ -struct sockaddr wildcard; /* zero valued cookie for wildcard searches */ - -#define UNIMP panic("Unimplemented function") - -/* - * Packet routing routines. - */ -void -rtalloc(ro) - register struct route *ro; -{ -#if 0 - if (ro->ro_rt && ro->ro_rt->rt_ifp && (ro->ro_rt->rt_flags & RTF_UP)) - return; /* XXX */ - ro->ro_rt = rtalloc1(&ro->ro_dst, 1, 0UL); -#endif - UNIMP; -} - -void -rtalloc_ign(ro, ignore) - register struct route *ro; - u_long ignore; -{ -#if 0 - if (ro->ro_rt && ro->ro_rt->rt_ifp && (ro->ro_rt->rt_flags & RTF_UP)) - return; /* XXX */ - ro->ro_rt = rtalloc1(&ro->ro_dst, 1, ignore); -#endif - UNIMP; -} - -struct rtentry * -rtalloc1(dst, report, ignflags) - register struct sockaddr *dst; - int report; - u_long ignflags; -{ -#if 0 - register struct radix_node_head *rnh = rt_tables[dst->sa_family]; - register struct rtentry *rt; - register struct radix_node *rn; - struct rtentry *newrt = 0; - struct rt_addrinfo info; - u_long nflags; - int s = splnet(), err = 0, msgtype = RTM_MISS; - - if (rnh && (rn = rnh->rnh_matchaddr((caddr_t)dst, rnh)) && - ((rn->rn_flags & RNF_ROOT) == 0)) { - newrt = rt = (struct rtentry *)rn; - nflags = rt->rt_flags & ~ignflags; - if (report && (nflags & (RTF_CLONING | RTF_PRCLONING))) { - err = rtrequest(RTM_RESOLVE, dst, SA(0), - SA(0), 0, &newrt); - if (err) { - newrt = rt; - rt->rt_refcnt++; - goto miss; - } - if ((rt = newrt) && (rt->rt_flags & RTF_XRESOLVE)) { - msgtype = RTM_RESOLVE; - goto miss; - } - } else - rt->rt_refcnt++; - } else { - rtstat.rts_unreach++; - miss: if (report) { - bzero((caddr_t)&info, sizeof(info)); - info.rti_info[RTAX_DST] = dst; - rt_missmsg(msgtype, &info, 0, err); - } - } - splx(s); - return (newrt); -#endif - UNIMP; -} - -void -rtfree(rt) - register struct rtentry *rt; -{ -#if 0 - register struct radix_node_head *rnh = - rt_tables[rt_key(rt)->sa_family]; - register struct ifaddr *ifa; - - if (rt == 0 || rnh == 0) - panic("rtfree"); - rt->rt_refcnt--; - if(rnh->rnh_close && rt->rt_refcnt == 0) { - rnh->rnh_close((struct radix_node *)rt, rnh); - } - if (rt->rt_refcnt <= 0 && (rt->rt_flags & RTF_UP) == 0) { - if (rt->rt_nodes->rn_flags & (RNF_ACTIVE | RNF_ROOT)) - panic ("rtfree 2"); - rttrash--; - if (rt->rt_refcnt < 0) { - printf("rtfree: %p not freed (neg refs)\n", rt); - return; - } - ifa = rt->rt_ifa; - IFAFREE(ifa); - if (rt->rt_parent) { - RTFREE(rt->rt_parent); - } - Free(rt_key(rt)); - Free(rt); - } -#endif - UNIMP; -} - -void -ifafree(ifa) - register struct ifaddr *ifa; -{ -#if 0 - if (ifa == NULL) - panic("ifafree"); - if (ifa->ifa_refcnt == 0) - free(ifa, M_IFADDR); - else - ifa->ifa_refcnt--; -#endif - UNIMP; -} - -/* - * Force a routing table entry to the specified - * destination to go through the given gateway. - * Normally called as a result of a routing redirect - * message from the network layer. - * - * N.B.: must be called at splnet - * - */ -void -rtredirect(dst, gateway, netmask, flags, src, rtp) - struct sockaddr *dst, *gateway, *netmask, *src; - int flags; - struct rtentry **rtp; -{ -#if 0 - register struct rtentry *rt; - int error = 0; - short *stat = 0; - struct rt_addrinfo info; - struct ifaddr *ifa; - - /* verify the gateway is directly reachable */ - if ((ifa = ifa_ifwithnet(gateway)) == 0) { - error = ENETUNREACH; - goto out; - } - rt = rtalloc1(dst, 0, 0UL); - /* - * If the redirect isn't from our current router for this dst, - * it's either old or wrong. If it redirects us to ourselves, - * we have a routing loop, perhaps as a result of an interface - * going down recently. - */ -#define equal(a1, a2) (bcmp((caddr_t)(a1), (caddr_t)(a2), (a1)->sa_len) == 0) - if (!(flags & RTF_DONE) && rt && - (!equal(src, rt->rt_gateway) || rt->rt_ifa != ifa)) - error = EINVAL; - else if (ifa_ifwithaddr(gateway)) - error = EHOSTUNREACH; - if (error) - goto done; - /* - * Create a new entry if we just got back a wildcard entry - * or the the lookup failed. This is necessary for hosts - * which use routing redirects generated by smart gateways - * to dynamically build the routing tables. - */ - if ((rt == 0) || (rt_mask(rt) && rt_mask(rt)->sa_len < 2)) - goto create; - /* - * Don't listen to the redirect if it's - * for a route to an interface. - */ - if (rt->rt_flags & RTF_GATEWAY) { - if (((rt->rt_flags & RTF_HOST) == 0) && (flags & RTF_HOST)) { - /* - * Changing from route to net => route to host. - * Create new route, rather than smashing route to net. - */ - create: - flags |= RTF_GATEWAY | RTF_DYNAMIC; - error = rtrequest((int)RTM_ADD, dst, gateway, - netmask, flags, - (struct rtentry **)0); - stat = &rtstat.rts_dynamic; - } else { - /* - * Smash the current notion of the gateway to - * this destination. Should check about netmask!!! - */ - rt->rt_flags |= RTF_MODIFIED; - flags |= RTF_MODIFIED; - stat = &rtstat.rts_newgateway; - rt_setgate(rt, rt_key(rt), gateway); - } - } else - error = EHOSTUNREACH; -done: - if (rt) { - if (rtp && !error) - *rtp = rt; - else - rtfree(rt); - } -out: - if (error) - rtstat.rts_badredirect++; - else if (stat != NULL) - (*stat)++; - bzero((caddr_t)&info, sizeof(info)); - info.rti_info[RTAX_DST] = dst; - info.rti_info[RTAX_GATEWAY] = gateway; - info.rti_info[RTAX_NETMASK] = netmask; - info.rti_info[RTAX_AUTHOR] = src; - rt_missmsg(RTM_REDIRECT, &info, flags, error); -#endif - UNIMP; -} - -/* -* Routing table ioctl interface. -*/ -int -rtioctl(req, data, p) - int req; - caddr_t data; - struct proc *p; -{ -#if 0 -#ifdef INET - /* Multicast goop, grrr... */ - return mrt_ioctl(req, data, p); -#else /* INET */ - return ENXIO; -#endif /* INET */ -#endif - UNIMP; -} - -struct ifaddr * -ifa_ifwithroute(flags, dst, gateway) - int flags; - struct sockaddr *dst, *gateway; -{ -#if 0 - register struct ifaddr *ifa; - if ((flags & RTF_GATEWAY) == 0) { - /* - * If we are adding a route to an interface, - * and the interface is a pt to pt link - * we should search for the destination - * as our clue to the interface. Otherwise - * we can use the local address. - */ - ifa = 0; - if (flags & RTF_HOST) { - ifa = ifa_ifwithdstaddr(dst); - } - if (ifa == 0) - ifa = ifa_ifwithaddr(gateway); - } else { - /* - * If we are adding a route to a remote net - * or host, the gateway may still be on the - * other end of a pt to pt link. - */ - ifa = ifa_ifwithdstaddr(gateway); - } - if (ifa == 0) - ifa = ifa_ifwithnet(gateway); - if (ifa == 0) { - struct rtentry *rt = rtalloc1(dst, 0, 0UL); - if (rt == 0) - return (0); - rt->rt_refcnt--; - if ((ifa = rt->rt_ifa) == 0) - return (0); - } - if (ifa->ifa_addr->sa_family != dst->sa_family) { - struct ifaddr *oifa = ifa; - ifa = ifaof_ifpforaddr(dst, ifa->ifa_ifp); - if (ifa == 0) - ifa = oifa; - } - return (ifa); -#endif - UNIMP; -} - -#define ROUNDUP(a) (a>0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long)) - -static int rt_fixdelete(struct radix_node *, void *); -static int rt_fixchange(struct radix_node *, void *); - -struct rtfc_arg { - struct rtentry *rt0; - struct radix_node_head *rnh; -}; - -int -rtrequest(req, dst, gateway, netmask, flags, ret_nrt) - int req, flags; - struct sockaddr *dst, *gateway, *netmask; - struct rtentry **ret_nrt; -{ -#if 0 - int s = splnet(); int error = 0; - register struct rtentry *rt; - register struct radix_node *rn; - register struct radix_node_head *rnh; - struct ifaddr *ifa; - struct sockaddr *ndst; - u_long prflags = 0UL; -#define senderr(x) { error = x ; goto bad; } - - if ((rnh = rt_tables[dst->sa_family]) == 0) - senderr(ESRCH); - if (flags & RTF_HOST) - netmask = 0; - switch (req) { - case RTM_DELETE: - if ((rn = rnh->rnh_deladdr(dst, netmask, rnh)) == 0) - senderr(ESRCH); - if (rn->rn_flags & (RNF_ACTIVE | RNF_ROOT)) - panic ("rtrequest delete"); - rt = (struct rtentry *)rn; - - /* - * Now search what's left of the subtree for any cloned - * routes which might have been formed from this node. - */ - if ((rt->rt_flags & RTF_PRCLONING) && netmask) { - rnh->rnh_walktree_from(rnh, dst, netmask, - rt_fixdelete, rt); - } - - if (rt->rt_gwroute) { - rt = rt->rt_gwroute; RTFREE(rt); - (rt = (struct rtentry *)rn)->rt_gwroute = 0; - } - - /* - * NB: RTF_UP must be set during the search above, - * because we might delete the last ref, causing - * rt to get freed prematurely. - */ - rt->rt_flags &= ~RTF_UP; - - if ((ifa = rt->rt_ifa) && ifa->ifa_rtrequest) - ifa->ifa_rtrequest(RTM_DELETE, rt, SA(0)); - rttrash++; - if (ret_nrt) - *ret_nrt = rt; - else if (rt->rt_refcnt <= 0) { - rt->rt_refcnt++; - rtfree(rt); - } - break; - - case RTM_RESOLVE: - if (ret_nrt == 0 || (rt = *ret_nrt) == 0) - senderr(EINVAL); - ifa = rt->rt_ifa; - flags = rt->rt_flags & - ~(RTF_CLONING | RTF_PRCLONING | RTF_STATIC); - flags |= RTF_WASCLONED; - gateway = rt->rt_gateway; - if ((netmask = rt->rt_genmask) == 0) - flags |= RTF_HOST; - goto makeroute; - - case RTM_ADD: - if ((flags & RTF_GATEWAY) && !gateway) - panic("rtrequest: GATEWAY but no gateway"); - - if ((ifa = ifa_ifwithroute(flags, dst, gateway)) == 0) - senderr(ENETUNREACH); - - makeroute: - R_Malloc(rt, struct rtentry *, sizeof(*rt)); - if (rt == 0) - senderr(ENOBUFS); - Bzero(rt, sizeof(*rt)); - rt->rt_flags = RTF_UP | flags; - if (rt_setgate(rt, dst, gateway)) { - Free(rt); - senderr(ENOBUFS); - } - ndst = rt_key(rt); - if (netmask) { - rt_maskedcopy(dst, ndst, netmask); - } else - Bcopy(dst, ndst, dst->sa_len); - - /* - * This moved from below so that rnh->rnh_addaddr() can - * examine the ifa and ifp if it so desires. - */ - ifa->ifa_refcnt++; - rt->rt_ifa = ifa; - rt->rt_ifp = ifa->ifa_ifp; - - rn = rnh->rnh_addaddr((caddr_t)ndst, (caddr_t)netmask, - rnh, rt->rt_nodes); - if (rn == 0) { - struct rtentry *rt2; - /* - * Uh-oh, we already have one of these in the tree. - * We do a special hack: if the route that's already - * there was generated by the protocol-cloning - * mechanism, then we just blow it away and retry - * the insertion of the new one. - */ - rt2 = rtalloc1(dst, 0, RTF_PRCLONING); - if (rt2 && rt2->rt_parent) { - rtrequest(RTM_DELETE, - (struct sockaddr *)rt_key(rt2), - rt2->rt_gateway, - rt_mask(rt2), rt2->rt_flags, 0); - RTFREE(rt2); - rn = rnh->rnh_addaddr((caddr_t)ndst, - (caddr_t)netmask, - rnh, rt->rt_nodes); - } else if (rt2) { - RTFREE(rt2); - } - } - - if (rn == 0) { - if (rt->rt_gwroute) - rtfree(rt->rt_gwroute); - if (rt->rt_ifa) { - IFAFREE(rt->rt_ifa); - } - Free(rt_key(rt)); - Free(rt); - senderr(EEXIST); - } - rt->rt_parent = 0; - - if (req == RTM_RESOLVE) { - rt->rt_rmx = (*ret_nrt)->rt_rmx; /* copy metrics */ - if ((*ret_nrt)->rt_flags & RTF_PRCLONING) { - rt->rt_parent = (*ret_nrt); - (*ret_nrt)->rt_refcnt++; - } - } - if (ifa->ifa_rtrequest) - ifa->ifa_rtrequest(req, rt, SA(ret_nrt ? *ret_nrt : 0)); - /* - * We repeat the same procedure from rt_setgate() here because - * it doesn't fire when we call it there because the node - * hasn't been added to the tree yet. - */ - if (!(rt->rt_flags & RTF_HOST)) { - struct rtfc_arg arg; - arg.rnh = rnh; - arg.rt0 = rt; - rnh->rnh_walktree_from(rnh, rt_key(rt), rt_mask(rt), - rt_fixchange, &arg); - } - - if (ret_nrt) { - *ret_nrt = rt; - rt->rt_refcnt++; - } - break; - } -bad: - splx(s); - return (error); -#endif - UNIMP; -} - -/* - * Called from rtrequest(RTM_DELETE, ...) to fix up the route's ``family'' - * (i.e., the routes related to it by the operation of cloning). This - * routine is iterated over all potential former-child-routes by way of - * rnh->rnh_walktree_from() above, and those that actually are children of - * the late parent (passed in as VP here) are themselves deleted. - */ -static int -rt_fixdelete(struct radix_node *rn, void *vp) -{ -#if 0 - struct rtentry *rt = (struct rtentry *)rn; - struct rtentry *rt0 = vp; - - if (rt->rt_parent == rt0 && !(rt->rt_flags & RTF_PINNED)) { - return rtrequest(RTM_DELETE, rt_key(rt), - (struct sockaddr *)0, rt_mask(rt), - rt->rt_flags, (struct rtentry **)0); - } - return 0; -#endif - UNIMP; -} - -/* - * This routine is called from rt_setgate() to do the analogous thing for - * adds and changes. There is the added complication in this case of a - * middle insert; i.e., insertion of a new network route between an older - * network route and (cloned) host routes. For this reason, a simple check - * of rt->rt_parent is insufficient; each candidate route must be tested - * against the (mask, value) of the new route (passed as before in vp) - * to see if the new route matches it. Unfortunately, this has the obnoxious - * property of also triggering for insertion /above/ a pre-existing network - * route and clones. Sigh. This may be fixed some day. - * - * XXX - it may be possible to do fixdelete() for changes and reserve this - * routine just for adds. I'm not sure why I thought it was necessary to do - * changes this way. - */ -#ifdef DEBUG -int rtfcdebug = 0; -#endif - -static int -rt_fixchange(struct radix_node *rn, void *vp) -{ - struct rtentry *rt = (struct rtentry *)rn; - struct rtfc_arg *ap = vp; - struct rtentry *rt0 = ap->rt0; - struct radix_node_head *rnh = ap->rnh; - u_char *xk1, *xm1, *xk2; - int i, len; - -#if 0 -#ifdef DEBUG - if (rtfcdebug) - printf("rt_fixchange: rt %p, rt0 %p\n", rt, rt0); -#endif - - if (!rt->rt_parent || (rt->rt_flags & RTF_PINNED)) { -#ifdef DEBUG - if(rtfcdebug) printf("no parent or pinned\n"); -#endif - return 0; - } - - if (rt->rt_parent == rt0) { -#ifdef DEBUG - if(rtfcdebug) printf("parent match\n"); -#endif - return rtrequest(RTM_DELETE, rt_key(rt), - (struct sockaddr *)0, rt_mask(rt), - rt->rt_flags, (struct rtentry **)0); - } - - /* - * There probably is a function somewhere which does this... - * if not, there should be. - */ - len = imin(((struct sockaddr *)rt_key(rt0))->sa_len, - ((struct sockaddr *)rt_key(rt))->sa_len); - - xk1 = (u_char *)rt_key(rt0); - xm1 = (u_char *)rt_mask(rt0); - xk2 = (u_char *)rt_key(rt); - - for (i = rnh->rnh_treetop->rn_off; i < len; i++) { - if ((xk2[i] & xm1[i]) != xk1[i]) { -#ifdef DEBUG - if(rtfcdebug) printf("no match\n"); -#endif - return 0; - } - } - - /* - * OK, this node is a clone, and matches the node currently being - * changed/added under the node's mask. So, get rid of it. - */ -#ifdef DEBUG - if(rtfcdebug) printf("deleting\n"); -#endif - return rtrequest(RTM_DELETE, rt_key(rt), (struct sockaddr *)0, - rt_mask(rt), rt->rt_flags, (struct rtentry **)0); -#endif - UNIMP; -} - -int -rt_setgate(rt0, dst, gate) - struct rtentry *rt0; - struct sockaddr *dst, *gate; -{ -#if 0 - caddr_t new, old; - int dlen = ROUNDUP(dst->sa_len), glen = ROUNDUP(gate->sa_len); - register struct rtentry *rt = rt0; - struct radix_node_head *rnh = rt_tables[dst->sa_family]; - - if (rt->rt_gateway == 0 || glen > ROUNDUP(rt->rt_gateway->sa_len)) { - old = (caddr_t)rt_key(rt); - R_Malloc(new, caddr_t, dlen + glen); - if (new == 0) - return 1; - rt->rt_nodes->rn_key = new; - } else { - new = rt->rt_nodes->rn_key; - old = 0; - } - Bcopy(gate, (rt->rt_gateway = (struct sockaddr *)(new + dlen)), glen); - if (old) { - Bcopy(dst, new, dlen); - Free(old); - } - if (rt->rt_gwroute) { - rt = rt->rt_gwroute; RTFREE(rt); - rt = rt0; rt->rt_gwroute = 0; - } - /* - * Cloning loop avoidance: - * In the presence of protocol-cloning and bad configuration, - * it is possible to get stuck in bottomless mutual recursion - * (rtrequest rt_setgate rtalloc1). We avoid this by not allowing - * protocol-cloning to operate for gateways (which is probably the - * correct choice anyway), and avoid the resulting reference loops - * by disallowing any route to run through itself as a gateway. - * This is obviuosly mandatory when we get rt->rt_output(). - */ - if (rt->rt_flags & RTF_GATEWAY) { - rt->rt_gwroute = rtalloc1(gate, 1, RTF_PRCLONING); - if (rt->rt_gwroute == rt) { - RTFREE(rt->rt_gwroute); - rt->rt_gwroute = 0; - return 1; /* failure */ - } - } - - /* - * This isn't going to do anything useful for host routes, so - * don't bother. Also make sure we have a reasonable mask - * (we don't yet have one during adds). - */ - if (!(rt->rt_flags & RTF_HOST) && rt_mask(rt) != 0) { - struct rtfc_arg arg; - arg.rnh = rnh; - arg.rt0 = rt; - rnh->rnh_walktree_from(rnh, rt_key(rt), rt_mask(rt), - rt_fixchange, &arg); - } - - return 0; -#endif - UNIMP; -} - -void -rt_maskedcopy(src, dst, netmask) - struct sockaddr *src, *dst, *netmask; -{ -#if 0 - register u_char *cp1 = (u_char *)src; - register u_char *cp2 = (u_char *)dst; - register u_char *cp3 = (u_char *)netmask; - u_char *cplim = cp2 + *cp3; - u_char *cplim2 = cp2 + *cp1; - - *cp2++ = *cp1++; *cp2++ = *cp1++; /* copies sa_len & sa_family */ - cp3 += 2; - if (cplim > cplim2) - cplim = cplim2; - while (cp2 < cplim) - *cp2++ = *cp1++ & *cp3++; - if (cp2 < cplim2) - bzero((caddr_t)cp2, (unsigned)(cplim2 - cp2)); -#endif - UNIMP; -} - -/* - * Set up a routing table entry, normally - * for an interface. - */ -int -rtinit(ifa, cmd, flags) - register struct ifaddr *ifa; - int cmd, flags; -{ -#if 0 - register struct rtentry *rt; - register struct sockaddr *dst; - register struct sockaddr *deldst; - struct mbuf *m = 0; - struct rtentry *nrt = 0; - int error; - - dst = flags & RTF_HOST ? ifa->ifa_dstaddr : ifa->ifa_addr; - if (cmd == RTM_DELETE) { - if ((flags & RTF_HOST) == 0 && ifa->ifa_netmask) { - m = m_get(M_WAIT, MT_SONAME); - deldst = mtod(m, struct sockaddr *); - rt_maskedcopy(dst, deldst, ifa->ifa_netmask); - dst = deldst; - } - rt = rtalloc1(dst, 0, 0UL); - if (rt) { - rt->rt_refcnt--; - if (rt->rt_ifa != ifa) { - if (m) - (void) m_free(m); - return (flags & RTF_HOST ? EHOSTUNREACH - : ENETUNREACH); - } - } - } - error = rtrequest(cmd, dst, ifa->ifa_addr, ifa->ifa_netmask, - flags | ifa->ifa_flags, &nrt); - if (m) - (void) m_free(m); - if (cmd == RTM_DELETE && error == 0 && (rt = nrt)) { - rt_newaddrmsg(cmd, ifa, error, nrt); - if (rt->rt_refcnt <= 0) { - rt->rt_refcnt++; - rtfree(rt); - } - } - if (cmd == RTM_ADD && error == 0 && (rt = nrt)) { - rt->rt_refcnt--; - if (rt->rt_ifa != ifa) { - printf("rtinit: wrong ifa (%p) was (%p)\n", ifa, - rt->rt_ifa); - if (rt->rt_ifa->ifa_rtrequest) - rt->rt_ifa->ifa_rtrequest(RTM_DELETE, rt, SA(0)); - IFAFREE(rt->rt_ifa); - rt->rt_ifa = ifa; - rt->rt_ifp = ifa->ifa_ifp; - ifa->ifa_refcnt++; - if (ifa->ifa_rtrequest) - ifa->ifa_rtrequest(RTM_ADD, rt, SA(0)); - } - rt_newaddrmsg(cmd, ifa, error, nrt); - } - return (error); -#endif - UNIMP; -} diff --git a/reactos/lib/oskittcp/oskittcp/rtsock.c b/reactos/lib/oskittcp/oskittcp/rtsock.c deleted file mode 100644 index 51cc2efe84a..00000000000 --- a/reactos/lib/oskittcp/oskittcp/rtsock.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 1988, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)rtsock.c 8.5 (Berkeley) 11/2/94 - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/proc.h> -#include <sys/mbuf.h> -#include <sys/socket.h> -#include <sys/socketvar.h> -#include <sys/domain.h> -#include <sys/protosw.h> - -#include <net/if.h> -#include <net/route.h> -#include <net/raw_cb.h> - -/* - * This routine is called to generate a message from the routing - * socket indicating that a redirect has occured, a routing lookup - * has failed, or that a protocol has detected timeouts to a particular - * destination. - */ -void -rt_missmsg(type, rtinfo, flags, error) - int type, flags, error; - register struct rt_addrinfo *rtinfo; -{ -#if 0 - register struct rt_msghdr *rtm; - register struct mbuf *m; - struct sockaddr *sa = rtinfo->rti_info[RTAX_DST]; - - if (route_cb.any_count == 0) - return; - m = rt_msg1(type, rtinfo); - if (m == 0) - return; - rtm = mtod(m, struct rt_msghdr *); - rtm->rtm_flags = RTF_DONE | flags; - rtm->rtm_errno = error; - rtm->rtm_addrs = rtinfo->rti_addrs; - route_proto.sp_protocol = sa ? sa->sa_family : 0; - raw_input(m, &route_proto, &route_src, &route_dst); -#endif - panic("Unimplemented function\n"); -} diff --git a/reactos/lib/oskittcp/oskittcp/scanc.c b/reactos/lib/oskittcp/oskittcp/scanc.c deleted file mode 100644 index 491bd36464d..00000000000 --- a/reactos/lib/oskittcp/oskittcp/scanc.c +++ /dev/null @@ -1,52 +0,0 @@ -/*- - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)scanc.c 8.1 (Berkeley) 6/10/93 - * - * $\Id: scanc.c,v 1.3 1995/03/17 06:15:39 phk Exp $ - */ - -#include <sys/libkern.h> - -int -scanc(size, cp, table, mask0) - u_int size; - register u_char *cp, table[]; - int mask0; -{ - register u_char *end; - register u_char mask; - - mask = mask0; - for (end = &cp[size]; cp < end && (table[*cp] & mask) == 0; ++cp); - return (end - cp); -} diff --git a/reactos/lib/oskittcp/oskittcp/sleep.c b/reactos/lib/oskittcp/oskittcp/sleep.c deleted file mode 100644 index 83bed686a77..00000000000 --- a/reactos/lib/oskittcp/oskittcp/sleep.c +++ /dev/null @@ -1,209 +0,0 @@ -#include <roscfg.h> -#include <oskittcp.h> -#include <ntddk.h> -#include <sys/callout.h> -#include <oskitfreebsd.h> -#include <oskitdebug.h> - -typedef struct _SLEEPING_THREAD { - LIST_ENTRY Entry; - PVOID SleepToken; - KEVENT Event; -} SLEEPING_THREAD, *PSLEEPING_THREAD; - -LIST_ENTRY SleepingThreadsList; -KSPIN_LOCK SleepingThreadsLock; - -/* clock_init */ -int ncallout = 256; -struct callout *callout; - -void init_freebsd_sched() { - KeInitializeSpinLock( &SleepingThreadsLock ); - InitializeListHead( &SleepingThreadsList ); -} - -void tsleep( void *token, int priority, char *wmesg, int tmio ) { - KIRQL OldIrql; - KEVENT Event; - PLIST_ENTRY Entry; - PSLEEPING_THREAD SleepingThread; - - OS_DbgPrint(OSK_MID_TRACE, - ("Called TSLEEP: tok = %x, pri = %d, wmesg = %s, tmio = %x\n", - token, priority, wmesg, tmio)); - - SleepingThread = ExAllocatePool( NonPagedPool, sizeof( *SleepingThread ) ); - if( SleepingThread ) { - KeInitializeEvent( &SleepingThread->Event, NotificationEvent, FALSE ); - SleepingThread->SleepToken = token; - ExInterlockedInsertTailList( &SleepingThreadsList, - &SleepingThread->Entry, - &SleepingThreadsLock ); - } - - OS_DbgPrint(OSK_MID_TRACE,("Waiting on %x\n", token)); - KeWaitForSingleObject( &SleepingThread->Event, - WrSuspended, - KernelMode, - TRUE, - NULL ); - OS_DbgPrint(OSK_MID_TRACE,("Waiting finished: %x\n", token)); -} - -void wakeup( void *token ) { - KIRQL OldIrql; - KEVENT Event; - PLIST_ENTRY Entry; - PSLEEPING_THREAD SleepingThread; - - OS_DbgPrint(OSK_MID_TRACE,("Wakeup %x!\n",token)); - - KeAcquireSpinLock( &SleepingThreadsLock, &OldIrql ); - Entry = SleepingThreadsList.Flink; - while( Entry != &SleepingThreadsList ) { - SleepingThread = CONTAINING_RECORD(Entry, SLEEPING_THREAD, Entry); - if( SleepingThread->SleepToken == token ) { - RemoveEntryList(Entry); - KeReleaseSpinLock( &SleepingThreadsLock, OldIrql ); - OS_DbgPrint(OSK_MID_TRACE,("Setting event to wake %x\n", token)); - KeSetEvent( &SleepingThread->Event, IO_NO_INCREMENT, FALSE ); - ExFreePool( SleepingThread ); - return; - } - Entry = Entry->Flink; - } - KeReleaseSpinLock( &SleepingThreadsLock, OldIrql ); - OS_DbgPrint(OSK_MID_TRACE,("Wakeup done %x\n", token)); -} - -/* ---------------------------------------------------------------------- */ - - -static void -timeout_init(void) -{ - int i; - - callout = (struct callout *) - malloc(sizeof(struct callout) * ncallout, M_FREE, M_WAITOK); - if (!callout) - panic("can't allocate callout queue!\n"); - - /* - * Initialize callouts - */ - callfree = callout; - for (i = 1; i < ncallout; i++) - callout[i-1].c_next = &callout[i]; - -} - -/* get clock up and running */ -void clock_init() -{ - timeout_init(); - /* inittodr(0); // what does this do? */ - boottime = time; - /* Start a clock we can use for timeouts */ -} - - -extern unsigned bio_imask; /* group of interrupts masked with splbio() */ -extern unsigned cpl; /* current priority level mask */ -extern volatile unsigned idelayed; /* interrupts to become pending */ -extern volatile unsigned ipending; /* active interrupts masked by cpl */ -extern unsigned net_imask; /* group of interrupts masked with splimp() */ -extern unsigned stat_imask; /* interrupts masked with splstatclock() */ -extern unsigned tty_imask; /* group of interrupts masked with spltty() */ - -/* - * ipending has to be volatile so that it is read every time it is accessed - * in splx() and spl0(), but we don't want it to be read nonatomically when - * it is changed. Pretending that ipending is a plain int happens to give - * suitable atomic code for "ipending |= constant;". - */ -#define setdelayed() (*(unsigned *)&ipending |= loadandclear(&idelayed)) -#define setsoftast() (*(unsigned *)&ipending |= SWI_AST_PENDING) -#define setsoftclock() (*(unsigned *)&ipending |= SWI_CLOCK_PENDING) -#define setsoftnet() (*(unsigned *)&ipending |= SWI_NET_PENDING) -#define setsofttty() (*(unsigned *)&ipending |= SWI_TTY_PENDING) - -#define schedsofttty() (*(unsigned *)&idelayed |= SWI_TTY_PENDING) - -#define GENSPL(name, set_cpl) \ -static __inline int name(void) \ -{ \ - unsigned x; \ - \ - __asm __volatile("" : : : "memory"); \ - x = cpl; \ - set_cpl; \ - return (x); \ -} - -#if 0 -GENSPL(splbio, cpl |= bio_imask) -GENSPL(splclock, cpl = HWI_MASK | SWI_MASK) -GENSPL(splhigh, cpl = HWI_MASK | SWI_MASK) -GENSPL(splimp, cpl |= net_imask) -GENSPL(splnet, cpl |= SWI_NET_MASK) -GENSPL(splsoftclock, cpl = SWI_CLOCK_MASK) -GENSPL(splsofttty, cpl |= SWI_TTY_MASK) -GENSPL(splstatclock, cpl |= stat_imask) -GENSPL(spltty, cpl |= tty_imask) -#endif - -#if 0 -void spl0(void) { - cpl = SWI_AST_MASK; - if (ipending & ~SWI_AST_MASK) - splz(); -} - -void splx(int ipl) { - cpl = ipl; - if (ipending & ~ipl) - splz(); -} -#endif - -void splz(void) { - OS_DbgPrint(OSK_MID_TRACE,("Called SPLZ\n")); -} - -/* - * functions to save and restore the current cpl - */ -void save_cpl(unsigned *x) -{ - *x = cpl; -} - -void restore_cpl(unsigned x) -{ - cpl = x; -} - -void selrecord( struct proc *selector, struct selinfo *sip) { - OS_DbgPrint(OSK_MID_TRACE,("Called selrecord\n")); -} - -void wakeupsocket( struct socket *so, struct selinfo *sel ) { - void *connection = so->so_connection; - char *data = 0; - int datalen = 0; - int flags = 0; - - OS_DbgPrint(OSK_MID_TRACE,("Wakeup: %x\n", so)); -#if 0 - if( soreceive(so, &paddr, 0, &mp0, &controlp, flags) == 0 ) { - /* We have data available */ - OS_DbgPrint(OSK_MID_TRACE,("Data available on %x\n", so)); - } -#endif -} - -void selwakeup( struct selinfo *sel ) { - OS_DbgPrint(OSK_MID_TRACE,("Called selwakeup\n")); -} diff --git a/reactos/lib/oskittcp/oskittcp/tcp_debug.c b/reactos/lib/oskittcp/oskittcp/tcp_debug.c deleted file mode 100644 index 5d48032a9a1..00000000000 --- a/reactos/lib/oskittcp/oskittcp/tcp_debug.c +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)tcp_debug.c 8.1 (Berkeley) 6/10/93 - */ - -#ifdef TCPDEBUG -/* load symbolic names */ -#define PRUREQUESTS -#define TCPSTATES -#define TCPTIMERS -#define TANAMES -#endif - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/mbuf.h> -#include <sys/socket.h> -#include <sys/socketvar.h> -#include <sys/protosw.h> -#include <sys/errno.h> -#include <sys/queue.h> - -#include <net/route.h> -#include <net/if.h> - -#include <netinet/in.h> -#include <netinet/in_systm.h> -#include <netinet/ip.h> -#include <netinet/in_pcb.h> -#include <netinet/ip_var.h> -#include <netinet/tcp.h> -#include <netinet/tcp_fsm.h> -#include <netinet/tcp_seq.h> -#include <netinet/tcp_timer.h> -#include <netinet/tcp_var.h> -#include <netinet/tcpip.h> -#include <netinet/tcp_debug.h> - -#ifdef TCPDEBUG -int tcpconsdebug = 0; -#endif -/* - * Tcp debug routines - */ -void -tcp_trace(act, ostate, tp, ti, req) - short act, ostate; - struct tcpcb *tp; - struct tcpiphdr *ti; - int req; -{ - tcp_seq seq, ack; - int len, flags; - struct tcp_debug *td = &tcp_debug[tcp_debx++]; - - if (tcp_debx == TCP_NDEBUG) - tcp_debx = 0; - td->td_time = iptime(); - td->td_act = act; - td->td_ostate = ostate; - td->td_tcb = (caddr_t)tp; - if (tp) - td->td_cb = *tp; - else - bzero((caddr_t)&td->td_cb, sizeof (*tp)); - if (ti) - td->td_ti = *ti; - else - bzero((caddr_t)&td->td_ti, sizeof (*ti)); - td->td_req = req; -#ifdef TCPDEBUG - if (tcpconsdebug == 0) - return; - if (tp) - printf("%p %s:", tp, tcpstates[ostate]); - else - printf("???????? "); - printf("%s ", tanames[act]); - switch (act) { - - case TA_INPUT: - case TA_OUTPUT: - case TA_DROP: - if (ti == 0) - break; - seq = ti->ti_seq; - ack = ti->ti_ack; - len = ti->ti_len; - if (act == TA_OUTPUT) { - seq = ntohl(seq); - ack = ntohl(ack); - len = ntohs((u_short)len); - } - if (act == TA_OUTPUT) - len -= sizeof (struct tcphdr); - if (len) - printf("[%x..%x)", seq, seq+len); - else - printf("%x", seq); - printf("@%x, urp=%x", ack, ti->ti_urp); - flags = ti->ti_flags; - if (flags) { - char *cp = "<"; -#define pf(f) { \ - if (ti->ti_flags & TH_##f) { \ - printf("%s%s", cp, #f); \ - cp = ","; \ - } \ -} - pf(SYN); pf(ACK); pf(FIN); pf(RST); pf(PUSH); pf(URG); - printf(">"); - } - break; - - case TA_USER: - printf("%s", prurequests[req&0xff]); - if ((req & 0xff) == PRU_SLOWTIMO) - printf("<%s>", tcptimers[req>>8]); - break; - } - if (tp) - printf(" -> %s", tcpstates[tp->t_state]); - /* print out internal state of tp !?! */ - printf("\n"); - if (tp == 0) - return; - printf("\trcv_(nxt,wnd,up) (%x,%x,%x) snd_(una,nxt,max) (%x,%x,%x)\n", - tp->rcv_nxt, tp->rcv_wnd, tp->rcv_up, tp->snd_una, tp->snd_nxt, - tp->snd_max); - printf("\tsnd_(wl1,wl2,wnd) (%x,%x,%x)\n", - tp->snd_wl1, tp->snd_wl2, tp->snd_wnd); -#endif /* TCPDEBUG */ -} diff --git a/reactos/lib/oskittcp/oskittcp/tcp_input.c b/reactos/lib/oskittcp/oskittcp/tcp_input.c deleted file mode 100644 index 260b695237f..00000000000 --- a/reactos/lib/oskittcp/oskittcp/tcp_input.c +++ /dev/null @@ -1,2160 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1988, 1990, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * From: @(#)tcp_input.c 8.5 (Berkeley) 4/10/94 - */ - -#ifndef TUBA_INCLUDE -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/malloc.h> -#include <sys/mbuf.h> -#include <sys/protosw.h> -#include <sys/socket.h> -#include <sys/socketvar.h> -#include <sys/errno.h> -#include <sys/queue.h> -#include <sys/kernel.h> - -#include <net/if.h> -#include <net/route.h> - -#include <netinet/in.h> -#include <netinet/in_systm.h> -#include <netinet/ip.h> -#include <netinet/in_pcb.h> -#include <netinet/ip_var.h> -#include <netinet/tcp.h> -#include <netinet/tcp_fsm.h> -#include <netinet/tcp_seq.h> -#include <netinet/tcp_timer.h> -#include <netinet/tcp_var.h> -#include <netinet/tcpip.h> -#ifdef TCPDEBUG -#include <netinet/tcp_debug.h> -struct tcpiphdr tcp_saveti; -#endif - -int tcprexmtthresh = 3; -tcp_seq tcp_iss; -tcp_cc tcp_ccgen; -struct tcpstat tcpstat; -u_long tcp_now; -struct inpcbhead tcb; -struct inpcbinfo tcbinfo; - -#endif /* TUBA_INCLUDE */ - -/* - * Insert segment ti into reassembly queue of tcp with - * control block tp. Return TH_FIN if reassembly now includes - * a segment with FIN. The macro form does the common case inline - * (segment is the next to be received on an established connection, - * and the queue is empty), avoiding linkage into and removal - * from the queue and repetition of various conversions. - * Set DELACK for segments received in order, but ack immediately - * when segments are out of order (so fast retransmit can work). - */ -#ifdef TCP_ACK_HACK -#define TCP_REASS(tp, ti, m, so, flags) { \ - if ((ti)->ti_seq == (tp)->rcv_nxt && \ - (tp)->seg_next == (struct tcpiphdr *)(tp) && \ - (tp)->t_state == TCPS_ESTABLISHED) { \ - if (ti->ti_flags & TH_PUSH) \ - tp->t_flags |= TF_ACKNOW; \ - else \ - tp->t_flags |= TF_DELACK; \ - (tp)->rcv_nxt += (ti)->ti_len - IPHDR_SIZE; \ - OS_DbgPrint(OSK_MID_TRACE,("Added %d to rcv_nxt\n", \ - (ti)->ti_len - IPHDR_SIZE)); \ - flags = (ti)->ti_flags & TH_FIN; \ - tcpstat.tcps_rcvpack++;\ - tcpstat.tcps_rcvbyte += (ti)->ti_len;\ - sbappend(so, &(so)->so_rcv, (m)); \ - sorwakeup(so); \ - } else { \ - (flags) = tcp_reass((tp), (ti), (m)); \ - tp->t_flags |= TF_ACKNOW; \ - } \ -} -#else -#define TCP_REASS(tp, ti, m, so, flags) { \ - if ((ti)->ti_seq == (tp)->rcv_nxt && \ - (tp)->seg_next == (struct tcpiphdr *)(tp) && \ - (tp)->t_state == TCPS_ESTABLISHED) { \ - tp->t_flags |= TF_DELACK; \ - (tp)->rcv_nxt += (ti)->ti_len - IPHDR_SIZE; \ - OS_DbgPrint(OSK_MID_TRACE,("Added %d to rcv_nxt\n", \ - (ti)->ti_len - IPHDR_SIZE)); \ - flags = (ti)->ti_flags & TH_FIN; \ - tcpstat.tcps_rcvpack++;\ - tcpstat.tcps_rcvbyte += (ti)->ti_len;\ - sbappend(so, &(so)->so_rcv, (m)); \ - sorwakeup(so); \ - } else { \ - (flags) = tcp_reass((tp), (ti), (m)); \ - tp->t_flags |= TF_ACKNOW; \ - } \ -} -#endif -#ifndef TUBA_INCLUDE - -int -tcp_reass(tp, ti, m) - register struct tcpcb *tp; - register struct tcpiphdr *ti; - struct mbuf *m; -{ - register struct tcpiphdr *q; - struct socket *so = tp->t_inpcb->inp_socket; - int flags; - - /* - * Call with ti==0 after become established to - * force pre-ESTABLISHED data up to user socket. - */ - if (ti == 0) - goto present; - - /* - * 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; - - /* - * If there is a preceding segment, it may provide some of - * our data already. If so, drop the data from the incoming - * segment. If it provides all of our data, drop us. - */ - if ((struct tcpiphdr *)q->ti_prev != (struct tcpiphdr *)tp) { - register int i; - q = (struct tcpiphdr *)q->ti_prev; - /* conversion to int (in i) handles seq wraparound */ - i = q->ti_seq + q->ti_len - ti->ti_seq; - if (i > 0) { - if (i >= ti->ti_len) { - tcpstat.tcps_rcvduppack++; - tcpstat.tcps_rcvdupbyte += ti->ti_len; - m_freem(m); - /* - * Try to present any queued data - * at the left window edge to the user. - * This is needed after the 3-WHS - * completes. - */ - goto present; /* ??? */ - } - m_adj(m, i); - ti->ti_len -= i; - ti->ti_seq += i; - } - q = (struct tcpiphdr *)(q->ti_next); - } - tcpstat.tcps_rcvoopack++; - tcpstat.tcps_rcvoobyte += ti->ti_len; - REASS_MBUF(ti) = m; /* XXX */ - - /* - * While we overlap succeeding segments trim them or, - * if they are completely covered, dequeue them. - */ - while (q != (struct tcpiphdr *)tp) { - register int i = (ti->ti_seq + ti->ti_len) - q->ti_seq; - if (i <= 0) - break; - if (i < q->ti_len) { - q->ti_seq += i; - q->ti_len -= i; - m_adj(REASS_MBUF(q), i); - break; - } - q = (struct tcpiphdr *)q->ti_next; - m = REASS_MBUF((struct tcpiphdr *)q->ti_prev); - remque(q->ti_prev); - m_freem(m); - } - - /* - * Stick new segment in its place. - */ - insque(ti, q->ti_prev); - -present: - /* - * Present data to user, advancing rcv_nxt through - * completed sequence space. - */ - if (!TCPS_HAVEESTABLISHED(tp->t_state)) - return (0); - ti = tp->seg_next; - if (ti == (struct tcpiphdr *)tp || ti->ti_seq != tp->rcv_nxt) - return (0); - do { - tp->rcv_nxt += ti->ti_len; - OS_DbgPrint(OSK_MID_TRACE,("Added %d to rcv_nxt\n", - ti->ti_len)); - flags = ti->ti_flags & TH_FIN; - remque(ti); - m = REASS_MBUF(ti); - ti = (struct tcpiphdr *)ti->ti_next; - if (so->so_state & SS_CANTRCVMORE) - m_freem(m); - else - sbappend(so, &so->so_rcv, m); - } while (ti != (struct tcpiphdr *)tp && ti->ti_seq == tp->rcv_nxt); - sorwakeup(so); - return (flags); -} - -/* - * TCP input routine, follows pages 65-76 of the - * protocol specification dated September, 1981 very closely. - */ -void -tcp_input(m, iphlen) - register struct mbuf *m; - int iphlen; -{ - register struct tcpiphdr *ti; - register struct inpcb *inp; - caddr_t optp = NULL; - int optlen = 0; - int len, tlen, off; - register struct tcpcb *tp = 0; - register int tiflags; - struct socket *so = 0; - int todrop, acked, ourfinisacked, needoutput = 0; - struct in_addr laddr; - int dropsocket = 0; - int iss = 0; - u_long tiwin; - struct tcpopt to; /* options in this segment */ - struct rmxp_tao *taop; /* pointer to our TAO cache entry */ - struct rmxp_tao tao_noncached; /* in case there's no cached entry */ -#ifdef TCPDEBUG - short ostate = 0; -#endif - - bzero((char *)&to, sizeof(to)); - - tcpstat.tcps_rcvtotal++; - /* - * Get IP and TCP header together in first mbuf. - * Note: IP leaves IP header in first mbuf. - */ - ti = mtod(m, struct tcpiphdr *); - if (iphlen > sizeof (struct ip)) - ip_stripoptions(m, (struct mbuf *)0); - if (m->m_len < sizeof (struct tcpiphdr)) { - if ((m = m_pullup(m, sizeof (struct tcpiphdr))) == 0) { - tcpstat.tcps_rcvshort++; - return; - } - ti = mtod(m, struct tcpiphdr *); - } - - /* - * Checksum extended TCP header and data. - */ - tlen = ntohs(((struct ip *)ti)->ip_len); - len = sizeof (struct ip); - OS_DbgPrint(OSK_MID_TRACE,("tlen = %x, len = %x, m_len = %d\n", tlen, len, m->m_len)); - OS_DbgPrint(OSK_MID_TRACE,("ti->ti_len = %x\n", htons(ti->ti_len))); - ti->ti_sum = in_cksum(m, len); - OskitDumpBuffer(m->m_data, len); - ti->ti_next = ti->ti_prev = 0; - ti->ti_x1 = 0; - if (ti->ti_sum) { - tcpstat.tcps_rcvbadsum++; - OS_DbgPrint(OSK_MID_TRACE,("Dropping packet due to bad csum (%x)\n", ti->ti_sum)); - goto drop; - } - ti->ti_len = htons((u_short)tlen); -#endif /* TUBA_INCLUDE */ - - /* - * Check that TCP offset makes sense, - * pull out TCP options and adjust length. XXX - */ - off = ti->ti_off << 2; - if (off < sizeof (struct tcphdr) || off > tlen) { - tcpstat.tcps_rcvbadoff++; - goto drop; - } - tlen -= off; - ti->ti_len = tlen; - if (off > sizeof (struct tcphdr)) { - if (m->m_len < sizeof(struct ip) + off) { - if ((m = m_pullup(m, sizeof (struct ip) + off)) == 0) { - tcpstat.tcps_rcvshort++; - return; - } - ti = mtod(m, struct tcpiphdr *); - } - optlen = off - sizeof (struct tcphdr); - optp = mtod(m, caddr_t) + sizeof (struct tcpiphdr); - } - tiflags = ti->ti_flags; - - /* - * Convert TCP protocol specific fields to host format. - */ - NTOHL(ti->ti_seq); - NTOHL(ti->ti_ack); - NTOHS(ti->ti_win); - NTOHS(ti->ti_urp); - - /* - * Drop TCP, IP headers and TCP options. - */ - m->m_data += sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr); - m->m_len -= sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr); - - /* - * Locate pcb for segment. - */ -findpcb: - /* - * First look for an exact match. - */ - inp = in_pcblookuphash(&tcbinfo, ti->ti_src, ti->ti_sport, - ti->ti_dst, ti->ti_dport); - /* - * ...and if that fails, do a wildcard search. - */ - if (inp == NULL) { - inp = in_pcblookup(&tcb, ti->ti_src, ti->ti_sport, - ti->ti_dst, ti->ti_dport, INPLOOKUP_WILDCARD); - } - - /* - * If the state is CLOSED (i.e., TCB does not exist) then - * all data in the incoming segment is discarded. - * If the TCB exists but is in CLOSED state, it is embryonic, - * but should either do a listen or a connect soon. - */ - if (inp == NULL) - goto dropwithreset; - tp = intotcpcb(inp); - if (tp == 0) - goto dropwithreset; - if (tp->t_state == TCPS_CLOSED) - goto drop; - - /* Unscale the window into a 32-bit value. */ - if ((tiflags & TH_SYN) == 0) - tiwin = ti->ti_win << tp->snd_scale; - else - tiwin = ti->ti_win; - - so = inp->inp_socket; - if (so->so_options & (SO_DEBUG|SO_ACCEPTCONN)) { -#ifdef TCPDEBUG - if (so->so_options & SO_DEBUG) { - ostate = tp->t_state; - tcp_saveti = *ti; - } -#endif - if (so->so_options & SO_ACCEPTCONN) { - register struct tcpcb *tp0 = tp; - struct socket *so2; - if ((tiflags & (TH_RST|TH_ACK|TH_SYN)) != TH_SYN) { - /* - * Note: dropwithreset makes sure we don't - * send a RST in response to a RST. - */ - if (tiflags & TH_ACK) { - tcpstat.tcps_badsyn++; - goto dropwithreset; - } - goto drop; - } - so2 = sonewconn(so, 0); - if (so2 == 0) { - unsigned int i, j, qlen; - - static int rnd; - static long old_mono_secs; - static unsigned int cur_cnt, old_cnt; - - tcpstat.tcps_listendrop++; - - /* - * Keep a decaying average of the number - * of overruns we've been getting. - */ - if ((i = (mono_time.tv_sec - - old_mono_secs)) != 0) { - old_mono_secs = mono_time.tv_sec; - old_cnt = cur_cnt / i; - cur_cnt = 0; - } - - so2 = so->so_q0; - if (so2 == 0) - goto drop; - - /* - * If we've been getting a lot of hits, - * random drop an incomplete connection - * from the queue, otherwise, fall through - * so we head-drop from the queue. - */ - qlen = so->so_q0len; - if (++cur_cnt > qlen || old_cnt > qlen) { - rnd = (314159 * rnd + 66329) & 0xffff; - j = ((qlen + 1) * rnd) >> 16; - - while (j-- && so2) - so2 = so2->so_q0; - } - if (so2) { - tcp_drop(sototcpcb(so2), ETIMEDOUT); - so2 = sonewconn(so, 0); - } - if (!so2) - goto drop; - } - so = so2; - /* - * This is ugly, but .... - * - * Mark socket as temporary until we're - * committed to keeping it. The code at - * ``drop'' and ``dropwithreset'' check the - * flag dropsocket to see if the temporary - * socket created here should be discarded. - * We mark the socket as discardable until - * we're committed to it below in TCPS_LISTEN. - */ - dropsocket++; - inp = (struct inpcb *)so->so_pcb; - inp->inp_laddr = ti->ti_dst; - inp->inp_lport = ti->ti_dport; - in_pcbrehash(inp); -#if BSD>=43 - inp->inp_options = ip_srcroute(); -#endif - tp = intotcpcb(inp); - tp->t_state = TCPS_LISTEN; - tp->t_flags |= tp0->t_flags & (TF_NOPUSH|TF_NOOPT); - - /* Compute proper scaling value from buffer space */ - while (tp->request_r_scale < TCP_MAX_WINSHIFT && - TCP_MAXWIN << tp->request_r_scale < so->so_rcv.sb_hiwat) - tp->request_r_scale++; - } - } - - /* - * Segment received on connection. - * Reset idle time and keep-alive timer. - */ - tp->t_idle = 0; - if (TCPS_HAVEESTABLISHED(tp->t_state)) - tp->t_timer[TCPT_KEEP] = tcp_keepidle; - - /* - * Process options if not in LISTEN state, - * else do it below (after getting remote address). - */ - if (tp->t_state != TCPS_LISTEN) - tcp_dooptions(tp, optp, optlen, ti, &to); - - /* - * Header prediction: check for the two common cases - * of a uni-directional data xfer. If the packet has - * no control flags, is in-sequence, the window didn't - * change and we're not retransmitting, it's a - * candidate. If the length is zero and the ack moved - * forward, we're the sender side of the xfer. Just - * free the data acked & wake any higher level process - * that was blocked waiting for space. If the length - * is non-zero and the ack didn't move, we're the - * receiver side. If we're getting packets in-order - * (the reassembly queue is empty), add the data to - * the socket buffer and note that we need a delayed ack. - * Make sure that the hidden state-flags are also off. - * Since we check for TCPS_ESTABLISHED above, it can only - * be TH_NEEDSYN. - */ - if (tp->t_state == TCPS_ESTABLISHED && - (tiflags & (TH_SYN|TH_FIN|TH_RST|TH_URG|TH_ACK)) == TH_ACK && - ((tp->t_flags & (TF_NEEDSYN|TF_NEEDFIN)) == 0) && - ((to.to_flag & TOF_TS) == 0 || - TSTMP_GEQ(to.to_tsval, tp->ts_recent)) && - /* - * Using the CC option is compulsory if once started: - * the segment is OK if no T/TCP was negotiated or - * if the segment has a CC option equal to CCrecv - */ - ((tp->t_flags & (TF_REQ_CC|TF_RCVD_CC)) != (TF_REQ_CC|TF_RCVD_CC) || - (to.to_flag & TOF_CC) != 0 && to.to_cc == tp->cc_recv) && - ti->ti_seq == tp->rcv_nxt && - tiwin && tiwin == tp->snd_wnd && - tp->snd_nxt == tp->snd_max) { - - /* - * If last ACK falls within this segment's sequence numbers, - * record the timestamp. - * NOTE that the test is modified according to the latest - * proposal of the tcplw@cray.com list (Braden 1993/04/26). - */ - if ((to.to_flag & TOF_TS) != 0 && - SEQ_LEQ(ti->ti_seq, tp->last_ack_sent)) { - tp->ts_recent_age = tcp_now; - tp->ts_recent = to.to_tsval; - } - - if (ti->ti_len == 0) { - if (SEQ_GT(ti->ti_ack, tp->snd_una) && - SEQ_LEQ(ti->ti_ack, tp->snd_max) && - tp->snd_cwnd >= tp->snd_wnd) { - /* - * this is a pure ack for outstanding data. - */ - ++tcpstat.tcps_predack; - if ((to.to_flag & TOF_TS) != 0) - tcp_xmit_timer(tp, - tcp_now - to.to_tsecr + 1); - else if (tp->t_rtt && - SEQ_GT(ti->ti_ack, tp->t_rtseq)) - tcp_xmit_timer(tp, tp->t_rtt); - acked = ti->ti_ack - tp->snd_una; - tcpstat.tcps_rcvackpack++; - tcpstat.tcps_rcvackbyte += acked; - sbdrop(&so->so_snd, acked); - tp->snd_una = ti->ti_ack; - m_freem(m); - - /* - * If all outstanding data are acked, stop - * retransmit timer, otherwise restart timer - * using current (possibly backed-off) value. - * If process is waiting for space, - * wakeup/selwakeup/signal. If data - * are ready to send, let tcp_output - * decide between more output or persist. - */ - if (tp->snd_una == tp->snd_max) - tp->t_timer[TCPT_REXMT] = 0; - else if (tp->t_timer[TCPT_PERSIST] == 0) - tp->t_timer[TCPT_REXMT] = tp->t_rxtcur; - - if (so->so_snd.sb_flags & SB_NOTIFY) - sowwakeup(so); - if (so->so_snd.sb_cc) - (void) tcp_output(tp); - return; - } - } else if (ti->ti_ack == tp->snd_una && - tp->seg_next == (struct tcpiphdr *)tp && - ti->ti_len <= sbspace(&so->so_rcv)) { - /* - * this is a pure, in-sequence data packet - * with nothing on the reassembly queue and - * we have enough buffer space to take it. - */ - ++tcpstat.tcps_preddat; - tp->rcv_nxt += ti->ti_len; - OS_DbgPrint(OSK_MID_TRACE,("Added %d to rcv_nxt\n", - ti->ti_len)); - tcpstat.tcps_rcvpack++; - tcpstat.tcps_rcvbyte += ti->ti_len; - /* - * Add data to socket buffer. - */ - sbappend(so, &so->so_rcv, m); - sorwakeup(so); -#ifdef TCP_ACK_HACK - /* - * If this is a short packet, then ACK now - with Nagel - * congestion avoidance sender won't send more until - * he gets an ACK. - */ - if (tiflags & TH_PUSH) { - tp->t_flags |= TF_ACKNOW; - tcp_output(tp); - } else { - tp->t_flags |= TF_DELACK; - } -#else - tp->t_flags |= TF_DELACK; -#endif - return; - } - } - - /* - * Calculate amount of space in receive window, - * and then do TCP input processing. - * Receive window is amount of space in rcv queue, - * but not less than advertised window. - */ - { int win; - - win = sbspace(&so->so_rcv); - if (win < 0) - win = 0; - tp->rcv_wnd = max(win, (int)(tp->rcv_adv - tp->rcv_nxt)); - } - - switch (tp->t_state) { - - /* - * If the state is LISTEN then ignore segment if it contains an RST. - * If the segment contains an ACK then it is bad and send a RST. - * If it does not contain a SYN then it is not interesting; drop it. - * Don't bother responding if the destination was a broadcast. - * Otherwise initialize tp->rcv_nxt, and tp->irs, select an initial - * tp->iss, and send a segment: - * <SEQ=ISS><ACK=RCV_NXT><CTL=SYN,ACK> - * Also initialize tp->snd_nxt to tp->iss+1 and tp->snd_una to tp->iss. - * Fill in remote peer address fields if not previously specified. - * Enter SYN_RECEIVED state, and process any other fields of this - * segment in this state. - */ - case TCPS_LISTEN: { - struct mbuf *am; - register struct sockaddr_in *sin; - - if (tiflags & TH_RST) - goto drop; - if (tiflags & TH_ACK) - goto dropwithreset; - if ((tiflags & TH_SYN) == 0) - goto drop; - /* - * RFC1122 4.2.3.10, p. 104: discard bcast/mcast SYN - * in_broadcast() should never return true on a received - * packet with M_BCAST not set. - */ - if (m->m_flags & (M_BCAST|M_MCAST) || - IN_MULTICAST(ntohl(ti->ti_dst.s_addr))) - goto drop; - am = m_get(M_DONTWAIT, MT_SONAME); /* XXX */ - if (am == NULL) - goto drop; - am->m_len = sizeof (struct sockaddr_in); - sin = mtod(am, struct sockaddr_in *); - sin->sin_family = AF_INET; - /*sin->sin_len = sizeof(*sin); */ - sin->sin_addr = ti->ti_src; - sin->sin_port = ti->ti_sport; - bzero((caddr_t)sin->sin_zero, sizeof(sin->sin_zero)); - laddr = inp->inp_laddr; - if (inp->inp_laddr.s_addr == INADDR_ANY) - inp->inp_laddr = ti->ti_dst; - if (in_pcbconnect(inp, am)) { - inp->inp_laddr = laddr; - /*(void) m_free(am);*/ - goto drop; - } - /*(void) m_free(am);*/ - tp->t_template = tcp_template(tp); - if (tp->t_template == 0) { - tp = tcp_drop(tp, ENOBUFS); - dropsocket = 0; /* socket is already gone */ - goto drop; - } - if ((taop = tcp_gettaocache(inp)) == NULL) { - taop = &tao_noncached; - bzero(taop, sizeof(*taop)); - } - tcp_dooptions(tp, optp, optlen, ti, &to); - if (iss) - tp->iss = iss; - else - tp->iss = tcp_iss; - tcp_iss += TCP_ISSINCR/2; - tp->irs = ti->ti_seq; - tcp_sendseqinit(tp); - tcp_rcvseqinit(tp); - /* - * Initialization of the tcpcb for transaction; - * set SND.WND = SEG.WND, - * initialize CCsend and CCrecv. - */ - tp->snd_wnd = tiwin; /* initial send-window */ - tp->cc_send = CC_INC(tcp_ccgen); - tp->cc_recv = to.to_cc; - /* - * Perform TAO test on incoming CC (SEG.CC) option, if any. - * - compare SEG.CC against cached CC from the same host, - * if any. - * - if SEG.CC > chached value, SYN must be new and is accepted - * immediately: save new CC in the cache, mark the socket - * connected, enter ESTABLISHED state, turn on flag to - * send a SYN in the next segment. - * A virtual advertised window is set in rcv_adv to - * initialize SWS prevention. Then enter normal segment - * processing: drop SYN, process data and FIN. - * - otherwise do a normal 3-way handshake. - */ - if ((to.to_flag & TOF_CC) != 0) { - if (taop->tao_cc != 0 && CC_GT(to.to_cc, taop->tao_cc)) { - taop->tao_cc = to.to_cc; - tp->t_state = TCPS_ESTABLISHED; - - /* - * If there is a FIN, or if there is data and the - * connection is local, then delay SYN,ACK(SYN) in - * the hope of piggy-backing it on a response - * segment. Otherwise must send ACK now in case - * the other side is slow starting. - */ - if ((tiflags & TH_FIN) || (ti->ti_len != 0 && - in_localaddr(inp->inp_faddr))) - tp->t_flags |= (TF_DELACK | TF_NEEDSYN); - else - tp->t_flags |= (TF_ACKNOW | TF_NEEDSYN); - - /* - * Limit the `virtual advertised window' to TCP_MAXWIN - * here. Even if we requested window scaling, it will - * become effective only later when our SYN is acked. - */ - tp->rcv_adv += min(tp->rcv_wnd, TCP_MAXWIN); - tcpstat.tcps_connects++; - soisconnected(so); - tp->t_timer[TCPT_KEEP] = tcp_keepinit; - dropsocket = 0; /* committed to socket */ - tcpstat.tcps_accepts++; - goto trimthenstep6; - } - /* else do standard 3-way handshake */ - } else { - /* - * No CC option, but maybe CC.NEW: - * invalidate cached value. - */ - taop->tao_cc = 0; - } - /* - * TAO test failed or there was no CC option, - * do a standard 3-way handshake. - */ - tp->t_flags |= TF_ACKNOW; - tp->t_state = TCPS_SYN_RECEIVED; - tp->t_timer[TCPT_KEEP] = tcp_keepinit; - dropsocket = 0; /* committed to socket */ - tcpstat.tcps_accepts++; - goto trimthenstep6; - } - - /* - * If the state is SYN_RECEIVED: - * do just the ack and RST checks from SYN_SENT state. - * If the state is SYN_SENT: - * if seg contains an ACK, but not for our SYN, drop the input. - * if seg contains a RST, then drop the connection. - * if seg does not contain SYN, then drop it. - * Otherwise this is an acceptable SYN segment - * initialize tp->rcv_nxt and tp->irs - * if seg contains ack then advance tp->snd_una - * if SYN has been acked change to ESTABLISHED else SYN_RCVD state - * arrange for segment to be acked (eventually) - * continue processing rest of data/controls, beginning with URG - */ - case TCPS_SYN_RECEIVED: - case TCPS_SYN_SENT: - if ((taop = tcp_gettaocache(inp)) == NULL) { - taop = &tao_noncached; - bzero(taop, sizeof(*taop)); - } - - if ((tiflags & TH_ACK) && - (SEQ_LEQ(ti->ti_ack, tp->iss) || - SEQ_GT(ti->ti_ack, tp->snd_max))) { - /* - * If we have a cached CCsent for the remote host, - * hence we haven't just crashed and restarted, - * do not send a RST. This may be a retransmission - * from the other side after our earlier ACK was lost. - * Our new SYN, when it arrives, will serve as the - * needed ACK. - */ - if (taop->tao_ccsent != 0) - goto drop; - else - goto dropwithreset; - } - if (tiflags & TH_RST) { - if (tiflags & TH_ACK) - tp = tcp_drop(tp, ECONNREFUSED); - goto drop; - } - if (tp->t_state == TCPS_SYN_RECEIVED) - break; - if ((tiflags & TH_SYN) == 0) - goto drop; - tp->snd_wnd = ti->ti_win; /* initial send window */ - tp->cc_recv = to.to_cc; /* foreign CC */ - - tp->irs = ti->ti_seq; - tcp_rcvseqinit(tp); - if (tiflags & TH_ACK) { - /* - * Our SYN was acked. If segment contains CC.ECHO - * option, check it to make sure this segment really - * matches our SYN. If not, just drop it as old - * duplicate, but send an RST if we're still playing - * by the old rules. - */ - if ((to.to_flag & TOF_CCECHO) && - tp->cc_send != to.to_ccecho) { - if (taop->tao_ccsent != 0) - goto drop; - else - goto dropwithreset; - } - tcpstat.tcps_connects++; - soisconnected(so); - /* Do window scaling on this connection? */ - if ((tp->t_flags & (TF_RCVD_SCALE|TF_REQ_SCALE)) == - (TF_RCVD_SCALE|TF_REQ_SCALE)) { - tp->snd_scale = tp->requested_s_scale; - tp->rcv_scale = tp->request_r_scale; - } - /* Segment is acceptable, update cache if undefined. */ - if (taop->tao_ccsent == 0) - taop->tao_ccsent = to.to_ccecho; - - tp->rcv_adv += tp->rcv_wnd; - tp->snd_una++; /* SYN is acked */ - /* - * If there's data, delay ACK; if there's also a FIN - * ACKNOW will be turned on later. - */ - if (ti->ti_len != 0) - tp->t_flags |= TF_DELACK; - else - tp->t_flags |= TF_ACKNOW; - /* - * Received <SYN,ACK> in SYN_SENT[*] state. - * Transitions: - * SYN_SENT --> ESTABLISHED - * SYN_SENT* --> FIN_WAIT_1 - */ - if (tp->t_flags & TF_NEEDFIN) { - tp->t_state = TCPS_FIN_WAIT_1; - tp->t_flags &= ~TF_NEEDFIN; - tiflags &= ~TH_SYN; - } else { - OS_DbgPrint - (OSK_MID_TRACE, - ("Socket %x entered ESTABLISHED state\n", - so)); - tp->t_state = TCPS_ESTABLISHED; - tp->t_timer[TCPT_KEEP] = tcp_keepidle; - } - } else { - /* - * Received initial SYN in SYN-SENT[*] state => simul- - * taneous open. If segment contains CC option and there is - * a cached CC, apply TAO test; if it succeeds, connection is - * half-synchronized. Otherwise, do 3-way handshake: - * SYN-SENT -> SYN-RECEIVED - * SYN-SENT* -> SYN-RECEIVED* - * If there was no CC option, clear cached CC value. - */ - tp->t_flags |= TF_ACKNOW; - tp->t_timer[TCPT_REXMT] = 0; - if (to.to_flag & TOF_CC) { - if (taop->tao_cc != 0 && - CC_GT(to.to_cc, taop->tao_cc)) { - /* - * update cache and make transition: - * SYN-SENT -> ESTABLISHED* - * SYN-SENT* -> FIN-WAIT-1* - */ - taop->tao_cc = to.to_cc; - if (tp->t_flags & TF_NEEDFIN) { - tp->t_state = TCPS_FIN_WAIT_1; - tp->t_flags &= ~TF_NEEDFIN; - } else { - tp->t_state = TCPS_ESTABLISHED; - tp->t_timer[TCPT_KEEP] = tcp_keepidle; - } - tp->t_flags |= TF_NEEDSYN; - } else - tp->t_state = TCPS_SYN_RECEIVED; - } else { - /* CC.NEW or no option => invalidate cache */ - taop->tao_cc = 0; - tp->t_state = TCPS_SYN_RECEIVED; - } - } - -trimthenstep6: - /* - * Advance ti->ti_seq to correspond to first data byte. - * If data, trim to stay within window, - * dropping FIN if necessary. - */ - ti->ti_seq++; - if (ti->ti_len > tp->rcv_wnd) { - todrop = ti->ti_len - tp->rcv_wnd; - m_adj(m, -todrop); - ti->ti_len = tp->rcv_wnd; - tiflags &= ~TH_FIN; - tcpstat.tcps_rcvpackafterwin++; - tcpstat.tcps_rcvbyteafterwin += todrop; - } - tp->snd_wl1 = ti->ti_seq - 1; - tp->rcv_up = ti->ti_seq; - /* - * Client side of transaction: already sent SYN and data. - * If the remote host used T/TCP to validate the SYN, - * our data will be ACK'd; if so, enter normal data segment - * processing in the middle of step 5, ack processing. - * Otherwise, goto step 6. - */ - if (tiflags & TH_ACK) - goto process_ACK; - goto step6; - /* - * If the state is LAST_ACK or CLOSING or TIME_WAIT: - * if segment contains a SYN and CC [not CC.NEW] option: - * if state == TIME_WAIT and connection duration > MSL, - * drop packet and send RST; - * - * if SEG.CC > CCrecv then is new SYN, and can implicitly - * ack the FIN (and data) in retransmission queue. - * Complete close and delete TCPCB. Then reprocess - * segment, hoping to find new TCPCB in LISTEN state; - * - * else must be old SYN; drop it. - * else do normal processing. - */ - case TCPS_LAST_ACK: - case TCPS_CLOSING: - case TCPS_TIME_WAIT: - if ((tiflags & TH_SYN) && - (to.to_flag & TOF_CC) && tp->cc_recv != 0) { - if (tp->t_state == TCPS_TIME_WAIT && - tp->t_duration > TCPTV_MSL) - goto dropwithreset; - if (CC_GT(to.to_cc, tp->cc_recv)) { - tp = tcp_close(tp); - goto findpcb; - } - else - goto drop; - } - break; /* continue normal processing */ - } - - /* - * States other than LISTEN or SYN_SENT. - * First check timestamp, if present. - * Then check the connection count, if present. - * Then check that at least some bytes of segment are within - * receive window. If segment begins before rcv_nxt, - * drop leading data (and SYN); if nothing left, just ack. - * - * RFC 1323 PAWS: If we have a timestamp reply on this segment - * and it's less than ts_recent, drop it. - */ - if ((to.to_flag & TOF_TS) != 0 && (tiflags & TH_RST) == 0 && - tp->ts_recent && TSTMP_LT(to.to_tsval, tp->ts_recent)) { - - /* Check to see if ts_recent is over 24 days old. */ - if ((int)(tcp_now - tp->ts_recent_age) > TCP_PAWS_IDLE) { - /* - * Invalidate ts_recent. If this segment updates - * ts_recent, the age will be reset later and ts_recent - * will get a valid value. If it does not, setting - * ts_recent to zero will at least satisfy the - * requirement that zero be placed in the timestamp - * echo reply when ts_recent isn't valid. The - * age isn't reset until we get a valid ts_recent - * because we don't want out-of-order segments to be - * dropped when ts_recent is old. - */ - tp->ts_recent = 0; - } else { - tcpstat.tcps_rcvduppack++; - tcpstat.tcps_rcvdupbyte += ti->ti_len; - tcpstat.tcps_pawsdrop++; - goto dropafterack; - } - } - - /* - * T/TCP mechanism - * If T/TCP was negotiated and the segment doesn't have CC, - * or if it's CC is wrong then drop the segment. - * RST segments do not have to comply with this. - */ - if ((tp->t_flags & (TF_REQ_CC|TF_RCVD_CC)) == (TF_REQ_CC|TF_RCVD_CC) && - ((to.to_flag & TOF_CC) == 0 || tp->cc_recv != to.to_cc) && - (tiflags & TH_RST) == 0) - goto dropafterack; - - todrop = tp->rcv_nxt - ti->ti_seq; - if (todrop > 0) { - if (tiflags & TH_SYN) { - tiflags &= ~TH_SYN; - ti->ti_seq++; - if (ti->ti_urp > 1) - ti->ti_urp--; - else - tiflags &= ~TH_URG; - todrop--; - } - /* - * Following if statement from Stevens, vol. 2, p. 960. - */ - if (todrop > ti->ti_len - || (todrop == ti->ti_len && (tiflags & TH_FIN) == 0)) { - /* - * Any valid FIN must be to the left of the window. - * At this point the FIN must be a duplicate or out - * of sequence; drop it. - */ - tiflags &= ~TH_FIN; - - /* - * Send an ACK to resynchronize and drop any data. - * But keep on processing for RST or ACK. - */ - tp->t_flags |= TF_ACKNOW; - todrop = ti->ti_len; - tcpstat.tcps_rcvduppack++; - tcpstat.tcps_rcvdupbyte += todrop; - } else { - tcpstat.tcps_rcvpartduppack++; - tcpstat.tcps_rcvpartdupbyte += todrop; - } - m_adj(m, todrop); - ti->ti_seq += todrop; - ti->ti_len -= todrop; - if (ti->ti_urp > todrop) - ti->ti_urp -= todrop; - else { - tiflags &= ~TH_URG; - ti->ti_urp = 0; - } - } - - /* - * If new data are received on a connection after the - * user processes are gone, then RST the other end. - */ - if ((so->so_state & SS_NOFDREF) && - tp->t_state > TCPS_CLOSE_WAIT && ti->ti_len) { - tp = tcp_close(tp); - tcpstat.tcps_rcvafterclose++; - goto dropwithreset; - } - - /* - * If segment ends after window, drop trailing data - * (and PUSH and FIN); if nothing left, just ACK. - */ - todrop = (ti->ti_seq+ti->ti_len) - (tp->rcv_nxt+tp->rcv_wnd); - if (todrop > 0) { - tcpstat.tcps_rcvpackafterwin++; - if (todrop >= ti->ti_len) { - tcpstat.tcps_rcvbyteafterwin += ti->ti_len; - /* - * If a new connection request is received - * while in TIME_WAIT, drop the old connection - * and start over if the sequence numbers - * are above the previous ones. - */ - if (tiflags & TH_SYN && - tp->t_state == TCPS_TIME_WAIT && - SEQ_GT(ti->ti_seq, tp->rcv_nxt)) { - iss = tp->rcv_nxt + TCP_ISSINCR; - tp = tcp_close(tp); - goto findpcb; - } - /* - * If window is closed can only take segments at - * window edge, and have to drop data and PUSH from - * incoming segments. Continue processing, but - * remember to ack. Otherwise, drop segment - * and ack. - */ - if (tp->rcv_wnd == 0 && ti->ti_seq == tp->rcv_nxt) { - tp->t_flags |= TF_ACKNOW; - tcpstat.tcps_rcvwinprobe++; - } else - goto dropafterack; - } else - tcpstat.tcps_rcvbyteafterwin += todrop; - m_adj(m, -todrop); - ti->ti_len -= todrop; - tiflags &= ~(TH_PUSH|TH_FIN); - } - - /* - * If last ACK falls within this segment's sequence numbers, - * record its timestamp. - * NOTE that the test is modified according to the latest - * proposal of the tcplw@cray.com list (Braden 1993/04/26). - */ - if ((to.to_flag & TOF_TS) != 0 && - SEQ_LEQ(ti->ti_seq, tp->last_ack_sent)) { - tp->ts_recent_age = tcp_now; - tp->ts_recent = to.to_tsval; - } - - /* - * If the RST bit is set examine the state: - * SYN_RECEIVED STATE: - * If passive open, return to LISTEN state. - * If active open, inform user that connection was refused. - * ESTABLISHED, FIN_WAIT_1, FIN_WAIT2, CLOSE_WAIT STATES: - * Inform user that connection was reset, and close tcb. - * CLOSING, LAST_ACK, TIME_WAIT STATES - * Close the tcb. - */ - if (tiflags&TH_RST) switch (tp->t_state) { - - case TCPS_SYN_RECEIVED: - so->so_error = ECONNREFUSED; - goto close; - - case TCPS_ESTABLISHED: - case TCPS_FIN_WAIT_1: - case TCPS_FIN_WAIT_2: - case TCPS_CLOSE_WAIT: - so->so_error = ECONNRESET; - close: - tp->t_state = TCPS_CLOSED; - tcpstat.tcps_drops++; - tp = tcp_close(tp); - goto drop; - - case TCPS_CLOSING: - case TCPS_LAST_ACK: - case TCPS_TIME_WAIT: - tp = tcp_close(tp); - goto drop; - } - - /* - * If a SYN is in the window, then this is an - * error and we send an RST and drop the connection. - */ - if (tiflags & TH_SYN) { - tp = tcp_drop(tp, ECONNRESET); - goto dropwithreset; - } - - /* - * If the ACK bit is off: if in SYN-RECEIVED state or SENDSYN - * flag is on (half-synchronized state), then queue data for - * later processing; else drop segment and return. - */ - if ((tiflags & TH_ACK) == 0) { - if (tp->t_state == TCPS_SYN_RECEIVED || - (tp->t_flags & TF_NEEDSYN)) - goto step6; - else - goto drop; - } - - /* - * Ack processing. - */ - switch (tp->t_state) { - - /* - * In SYN_RECEIVED state if the ack ACKs our SYN then enter - * ESTABLISHED state and continue processing, otherwise - * send an RST. - */ - case TCPS_SYN_RECEIVED: - if (SEQ_GT(tp->snd_una, ti->ti_ack) || - SEQ_GT(ti->ti_ack, tp->snd_max)) - goto dropwithreset; - - tcpstat.tcps_connects++; - soisconnected(so); - /* Do window scaling? */ - if ((tp->t_flags & (TF_RCVD_SCALE|TF_REQ_SCALE)) == - (TF_RCVD_SCALE|TF_REQ_SCALE)) { - tp->snd_scale = tp->requested_s_scale; - tp->rcv_scale = tp->request_r_scale; - } - /* - * Upon successful completion of 3-way handshake, - * update cache.CC if it was undefined, pass any queued - * data to the user, and advance state appropriately. - */ - if ((taop = tcp_gettaocache(inp)) != NULL && - taop->tao_cc == 0) - taop->tao_cc = tp->cc_recv; - - /* - * Make transitions: - * SYN-RECEIVED -> ESTABLISHED - * SYN-RECEIVED* -> FIN-WAIT-1 - */ - if (tp->t_flags & TF_NEEDFIN) { - tp->t_state = TCPS_FIN_WAIT_1; - tp->t_flags &= ~TF_NEEDFIN; - } else { - tp->t_state = TCPS_ESTABLISHED; - tp->t_timer[TCPT_KEEP] = tcp_keepidle; - } - /* - * If segment contains data or ACK, will call tcp_reass() - * later; if not, do so now to pass queued data to user. - */ - if (ti->ti_len == 0 && (tiflags & TH_FIN) == 0) - (void) tcp_reass(tp, (struct tcpiphdr *)0, - (struct mbuf *)0); - tp->snd_wl1 = ti->ti_seq - 1; - /* fall into ... */ - - /* - * In ESTABLISHED state: drop duplicate ACKs; ACK out of range - * ACKs. If the ack is in the range - * tp->snd_una < ti->ti_ack <= tp->snd_max - * then advance tp->snd_una to ti->ti_ack and drop - * data from the retransmission queue. If this ACK reflects - * more up to date window information we update our window information. - */ - case TCPS_ESTABLISHED: - case TCPS_FIN_WAIT_1: - case TCPS_FIN_WAIT_2: - case TCPS_CLOSE_WAIT: - case TCPS_CLOSING: - case TCPS_LAST_ACK: - case TCPS_TIME_WAIT: - - if (SEQ_LEQ(ti->ti_ack, tp->snd_una)) { - if (ti->ti_len == 0 && tiwin == tp->snd_wnd) { - tcpstat.tcps_rcvdupack++; - /* - * If we have outstanding data (other than - * a window probe), this is a completely - * duplicate ack (ie, window info didn't - * change), the ack is the biggest we've - * seen and we've seen exactly our rexmt - * threshhold of them, assume a packet - * has been dropped and retransmit it. - * Kludge snd_nxt & the congestion - * window so we send only this one - * packet. - * - * We know we're losing at the current - * window size so do congestion avoidance - * (set ssthresh to half the current window - * and pull our congestion window back to - * the new ssthresh). - * - * Dup acks mean that packets have left the - * network (they're now cached at the receiver) - * so bump cwnd by the amount in the receiver - * to keep a constant cwnd packets in the - * network. - */ - if (tp->t_timer[TCPT_REXMT] == 0 || - ti->ti_ack != tp->snd_una) - tp->t_dupacks = 0; - else if (++tp->t_dupacks == tcprexmtthresh) { - tcp_seq onxt = tp->snd_nxt; - u_int win = - min(tp->snd_wnd, tp->snd_cwnd) / 2 / - tp->t_maxseg; - - if (win < 2) - win = 2; - tp->snd_ssthresh = win * tp->t_maxseg; - tp->t_timer[TCPT_REXMT] = 0; - tp->t_rtt = 0; - tp->snd_nxt = ti->ti_ack; - tp->snd_cwnd = tp->t_maxseg; - (void) tcp_output(tp); - tp->snd_cwnd = tp->snd_ssthresh + - tp->t_maxseg * tp->t_dupacks; - if (SEQ_GT(onxt, tp->snd_nxt)) - tp->snd_nxt = onxt; - goto drop; - } else if (tp->t_dupacks > tcprexmtthresh) { - tp->snd_cwnd += tp->t_maxseg; - (void) tcp_output(tp); - goto drop; - } - } else - tp->t_dupacks = 0; - break; - } - /* - * If the congestion window was inflated to account - * for the other side's cached packets, retract it. - */ - if (tp->t_dupacks > tcprexmtthresh && - tp->snd_cwnd > tp->snd_ssthresh) - tp->snd_cwnd = tp->snd_ssthresh; - tp->t_dupacks = 0; - if (SEQ_GT(ti->ti_ack, tp->snd_max)) { - tcpstat.tcps_rcvacktoomuch++; - goto dropafterack; - } - /* - * If we reach this point, ACK is not a duplicate, - * i.e., it ACKs something we sent. - */ - if (tp->t_flags & TF_NEEDSYN) { - /* - * T/TCP: Connection was half-synchronized, and our - * SYN has been ACK'd (so connection is now fully - * synchronized). Go to non-starred state, - * increment snd_una for ACK of SYN, and check if - * we can do window scaling. - */ - tp->t_flags &= ~TF_NEEDSYN; - tp->snd_una++; - /* Do window scaling? */ - if ((tp->t_flags & (TF_RCVD_SCALE|TF_REQ_SCALE)) == - (TF_RCVD_SCALE|TF_REQ_SCALE)) { - tp->snd_scale = tp->requested_s_scale; - tp->rcv_scale = tp->request_r_scale; - } - } - -process_ACK: - acked = ti->ti_ack - tp->snd_una; - tcpstat.tcps_rcvackpack++; - tcpstat.tcps_rcvackbyte += acked; - - /* - * If we have a timestamp reply, update smoothed - * round trip time. If no timestamp is present but - * transmit timer is running and timed sequence - * number was acked, update smoothed round trip time. - * Since we now have an rtt measurement, cancel the - * timer backoff (cf., Phil Karn's retransmit alg.). - * Recompute the initial retransmit timer. - */ - if (to.to_flag & TOF_TS) - tcp_xmit_timer(tp, tcp_now - to.to_tsecr + 1); - else if (tp->t_rtt && SEQ_GT(ti->ti_ack, tp->t_rtseq)) - tcp_xmit_timer(tp,tp->t_rtt); - - /* - * If all outstanding data is acked, stop retransmit - * timer and remember to restart (more output or persist). - * If there is more data to be acked, restart retransmit - * timer, using current (possibly backed-off) value. - */ - if (ti->ti_ack == tp->snd_max) { - tp->t_timer[TCPT_REXMT] = 0; - needoutput = 1; - } else if (tp->t_timer[TCPT_PERSIST] == 0) - tp->t_timer[TCPT_REXMT] = tp->t_rxtcur; - - /* - * If no data (only SYN) was ACK'd, - * skip rest of ACK processing. - */ - if (acked == 0) - goto step6; - - /* - * When new data is acked, open the congestion window. - * If the window gives us less than ssthresh packets - * in flight, open exponentially (maxseg per packet). - * Otherwise open linearly: maxseg per window - * (maxseg^2 / cwnd per packet). - */ - { - register u_int cw = tp->snd_cwnd; - register u_int incr = tp->t_maxseg; - - if (cw > tp->snd_ssthresh) - incr = incr * incr / cw; - tp->snd_cwnd = min(cw + incr, TCP_MAXWIN<<tp->snd_scale); - } - if (acked > so->so_snd.sb_cc) { - tp->snd_wnd -= so->so_snd.sb_cc; - sbdrop(&so->so_snd, (int)so->so_snd.sb_cc); - ourfinisacked = 1; - } else { - sbdrop(&so->so_snd, acked); - tp->snd_wnd -= acked; - ourfinisacked = 0; - } - if (so->so_snd.sb_flags & SB_NOTIFY) - sowwakeup(so); - tp->snd_una = ti->ti_ack; - if (SEQ_LT(tp->snd_nxt, tp->snd_una)) - tp->snd_nxt = tp->snd_una; - - switch (tp->t_state) { - - /* - * In FIN_WAIT_1 STATE in addition to the processing - * for the ESTABLISHED state if our FIN is now acknowledged - * then enter FIN_WAIT_2. - */ - case TCPS_FIN_WAIT_1: - if (ourfinisacked) { - /* - * If we can't receive any more - * data, then closing user can proceed. - * Starting the timer is contrary to the - * specification, but if we don't get a FIN - * we'll hang forever. - */ - if (so->so_state & SS_CANTRCVMORE) { - soisdisconnected(so); - tp->t_timer[TCPT_2MSL] = tcp_maxidle; - } - tp->t_state = TCPS_FIN_WAIT_2; - } - break; - - /* - * In CLOSING STATE in addition to the processing for - * the ESTABLISHED state if the ACK acknowledges our FIN - * then enter the TIME-WAIT state, otherwise ignore - * the segment. - */ - case TCPS_CLOSING: - if (ourfinisacked) { - tp->t_state = TCPS_TIME_WAIT; - tcp_canceltimers(tp); - /* Shorten TIME_WAIT [RFC-1644, p.28] */ - if (tp->cc_recv != 0 && - tp->t_duration < TCPTV_MSL) - tp->t_timer[TCPT_2MSL] = - tp->t_rxtcur * TCPTV_TWTRUNC; - else - tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL; - soisdisconnected(so); - } - break; - - /* - * In LAST_ACK, we may still be waiting for data to drain - * and/or to be acked, as well as for the ack of our FIN. - * If our FIN is now acknowledged, delete the TCB, - * enter the closed state and return. - */ - case TCPS_LAST_ACK: - if (ourfinisacked) { - tp = tcp_close(tp); - goto drop; - } - break; - - /* - * In TIME_WAIT state the only thing that should arrive - * is a retransmission of the remote FIN. Acknowledge - * it and restart the finack timer. - */ - case TCPS_TIME_WAIT: - tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL; - goto dropafterack; - } - } - -step6: - /* - * Update window information. - * Don't look at window if no ACK: TAC's send garbage on first SYN. - */ - if ((tiflags & TH_ACK) && - (SEQ_LT(tp->snd_wl1, ti->ti_seq) || - (tp->snd_wl1 == ti->ti_seq && (SEQ_LT(tp->snd_wl2, ti->ti_ack) || - (tp->snd_wl2 == ti->ti_ack && tiwin > tp->snd_wnd))))) { - /* keep track of pure window updates */ - if (ti->ti_len == 0 && - tp->snd_wl2 == ti->ti_ack && tiwin > tp->snd_wnd) - tcpstat.tcps_rcvwinupd++; - tp->snd_wnd = tiwin; - tp->snd_wl1 = ti->ti_seq; - tp->snd_wl2 = ti->ti_ack; - if (tp->snd_wnd > tp->max_sndwnd) - tp->max_sndwnd = tp->snd_wnd; - needoutput = 1; - } - - /* - * Process segments with URG. - */ - if ((tiflags & TH_URG) && ti->ti_urp && - TCPS_HAVERCVDFIN(tp->t_state) == 0) { - /* - * This is a kludge, but if we receive and accept - * random urgent pointers, we'll crash in - * soreceive. It's hard to imagine someone - * actually wanting to send this much urgent data. - */ - if (ti->ti_urp + so->so_rcv.sb_cc > sb_max) { - ti->ti_urp = 0; /* XXX */ - tiflags &= ~TH_URG; /* XXX */ - goto dodata; /* XXX */ - } - /* - * If this segment advances the known urgent pointer, - * then mark the data stream. This should not happen - * in CLOSE_WAIT, CLOSING, LAST_ACK or TIME_WAIT STATES since - * a FIN has been received from the remote side. - * In these states we ignore the URG. - * - * According to RFC961 (Assigned Protocols), - * the urgent pointer points to the last octet - * of urgent data. We continue, however, - * to consider it to indicate the first octet - * of data past the urgent section as the original - * spec states (in one of two places). - */ - if (SEQ_GT(ti->ti_seq+ti->ti_urp, tp->rcv_up)) { - tp->rcv_up = ti->ti_seq + ti->ti_urp; - so->so_oobmark = so->so_rcv.sb_cc + - (tp->rcv_up - tp->rcv_nxt) - 1; - if (so->so_oobmark == 0) - so->so_state |= SS_RCVATMARK; - sohasoutofband(so); - tp->t_oobflags &= ~(TCPOOB_HAVEDATA | TCPOOB_HADDATA); - } - /* - * Remove out of band data so doesn't get presented to user. - * This can happen independent of advancing the URG pointer, - * but if two URG's are pending at once, some out-of-band - * data may creep in... ick. - */ - if (ti->ti_urp <= (u_long)ti->ti_len -#ifdef SO_OOBINLINE - && (so->so_options & SO_OOBINLINE) == 0 -#endif - ) - tcp_pulloutofband(so, ti, m); - } else - /* - * If no out of band data is expected, - * pull receive urgent pointer along - * with the receive window. - */ - if (SEQ_GT(tp->rcv_nxt, tp->rcv_up)) - tp->rcv_up = tp->rcv_nxt; -dodata: /* XXX */ - - /* - * Process the segment text, merging it into the TCP sequencing queue, - * and arranging for acknowledgment of receipt if necessary. - * This process logically involves adjusting tp->rcv_wnd as data - * is presented to the user (this happens in tcp_usrreq.c, - * case PRU_RCVD). If a FIN has already been received on this - * connection then we just ignore the text. - */ - if ((ti->ti_len || (tiflags&TH_FIN)) && - TCPS_HAVERCVDFIN(tp->t_state) == 0) { - TCP_REASS(tp, ti, m, so, tiflags); - /* - * Note the amount of data that peer has sent into - * our window, in order to estimate the sender's - * buffer size. - */ - len = so->so_rcv.sb_hiwat - (tp->rcv_adv - tp->rcv_nxt); - } else { - m_freem(m); - tiflags &= ~TH_FIN; - } - - /* - * If FIN is received ACK the FIN and let the user know - * that the connection is closing. - */ - if (tiflags & TH_FIN) { - if (TCPS_HAVERCVDFIN(tp->t_state) == 0) { - socantrcvmore(so); - /* - * If connection is half-synchronized - * (ie NEEDSYN flag on) then delay ACK, - * so it may be piggybacked when SYN is sent. - * Otherwise, since we received a FIN then no - * more input can be expected, send ACK now. - */ - if (tp->t_flags & TF_NEEDSYN) - tp->t_flags |= TF_DELACK; - else - tp->t_flags |= TF_ACKNOW; - tp->rcv_nxt++; - } - switch (tp->t_state) { - - /* - * In SYN_RECEIVED and ESTABLISHED STATES - * enter the CLOSE_WAIT state. - */ - case TCPS_SYN_RECEIVED: - case TCPS_ESTABLISHED: - tp->t_state = TCPS_CLOSE_WAIT; - break; - - /* - * If still in FIN_WAIT_1 STATE FIN has not been acked so - * enter the CLOSING state. - */ - case TCPS_FIN_WAIT_1: - tp->t_state = TCPS_CLOSING; - break; - - /* - * In FIN_WAIT_2 state enter the TIME_WAIT state, - * starting the time-wait timer, turning off the other - * standard timers. - */ - case TCPS_FIN_WAIT_2: - tp->t_state = TCPS_TIME_WAIT; - tcp_canceltimers(tp); - /* Shorten TIME_WAIT [RFC-1644, p.28] */ - if (tp->cc_recv != 0 && - tp->t_duration < TCPTV_MSL) { - tp->t_timer[TCPT_2MSL] = - tp->t_rxtcur * TCPTV_TWTRUNC; - /* For transaction client, force ACK now. */ - tp->t_flags |= TF_ACKNOW; - } - else - tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL; - soisdisconnected(so); - break; - - /* - * In TIME_WAIT state restart the 2 MSL time_wait timer. - */ - case TCPS_TIME_WAIT: - tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL; - break; - } - } -#ifdef TCPDEBUG - if (so->so_options & SO_DEBUG) - tcp_trace(TA_INPUT, ostate, tp, &tcp_saveti, 0); -#endif - - /* - * Return any desired output. - */ - OS_DbgPrint(OSK_MID_TRACE, - ("needoutput: %d, tp->t_flags & TF_ACKNOW: %d\n", - needoutput, tp->t_flags & TF_ACKNOW)); - - if (needoutput || (tp->t_flags & TF_ACKNOW)) - (void) tcp_output(tp); - return; - -dropafterack: - /* - * Generate an ACK dropping incoming segment if it occupies - * sequence space, where the ACK reflects our state. - */ - if (tiflags & TH_RST) - goto drop; -#ifdef TCPDEBUG - if (so->so_options & SO_DEBUG) - tcp_trace(TA_DROP, ostate, tp, &tcp_saveti, 0); -#endif - m_freem(m); - tp->t_flags |= TF_ACKNOW; - (void) tcp_output(tp); - return; - -dropwithreset: - /* - * Generate a RST, dropping incoming segment. - * Make ACK acceptable to originator of segment. - * Don't bother to respond if destination was broadcast/multicast. - */ - if ((tiflags & TH_RST) || m->m_flags & (M_BCAST|M_MCAST) || - IN_MULTICAST(ntohl(ti->ti_dst.s_addr))) - goto drop; -#ifdef TCPDEBUG - if (tp == 0 || (tp->t_inpcb->inp_socket->so_options & SO_DEBUG)) - tcp_trace(TA_DROP, ostate, tp, &tcp_saveti, 0); -#endif - if (tiflags & TH_ACK) - tcp_respond(tp, ti, m, (tcp_seq)0, ti->ti_ack, TH_RST); - else { - if (tiflags & TH_SYN) - ti->ti_len++; - tcp_respond(tp, ti, m, ti->ti_seq+ti->ti_len, (tcp_seq)0, - TH_RST|TH_ACK); - } - /* destroy temporarily created socket */ - if (dropsocket) - (void) soabort(so); - return; - -drop: - /* - * Drop space held by incoming segment and return. - */ -#ifdef TCPDEBUG - if (tp == 0 || (tp->t_inpcb->inp_socket->so_options & SO_DEBUG)) - tcp_trace(TA_DROP, ostate, tp, &tcp_saveti, 0); -#endif - /* destroy temporarily created socket */ - if (dropsocket) - (void) soabort(so); - return; -#ifndef TUBA_INCLUDE -} - -void -tcp_dooptions(tp, cp, cnt, ti, to) - struct tcpcb *tp; - u_char *cp; - int cnt; - struct tcpiphdr *ti; - struct tcpopt *to; -{ - u_short mss = 0; - int opt, optlen; - - for (; cnt > 0; cnt -= optlen, cp += optlen) { - opt = cp[0]; - if (opt == TCPOPT_EOL) - break; - if (opt == TCPOPT_NOP) - optlen = 1; - else { - optlen = cp[1]; - if (optlen <= 0) - break; - } - switch (opt) { - - default: - continue; - - case TCPOPT_MAXSEG: - if (optlen != TCPOLEN_MAXSEG) - continue; - if (!(ti->ti_flags & TH_SYN)) - continue; - bcopy((char *) cp + 2, (char *) &mss, sizeof(mss)); - NTOHS(mss); - break; - - case TCPOPT_WINDOW: - if (optlen != TCPOLEN_WINDOW) - continue; - if (!(ti->ti_flags & TH_SYN)) - continue; - tp->t_flags |= TF_RCVD_SCALE; - tp->requested_s_scale = min(cp[2], TCP_MAX_WINSHIFT); - break; - - case TCPOPT_TIMESTAMP: - if (optlen != TCPOLEN_TIMESTAMP) - continue; - to->to_flag |= TOF_TS; - bcopy((char *)cp + 2, - (char *)&to->to_tsval, sizeof(to->to_tsval)); - NTOHL(to->to_tsval); - bcopy((char *)cp + 6, - (char *)&to->to_tsecr, sizeof(to->to_tsecr)); - NTOHL(to->to_tsecr); - - /* - * A timestamp received in a SYN makes - * it ok to send timestamp requests and replies. - */ - if (ti->ti_flags & TH_SYN) { - tp->t_flags |= TF_RCVD_TSTMP; - tp->ts_recent = to->to_tsval; - tp->ts_recent_age = tcp_now; - } - break; - case TCPOPT_CC: - if (optlen != TCPOLEN_CC) - continue; - to->to_flag |= TOF_CC; - bcopy((char *)cp + 2, - (char *)&to->to_cc, sizeof(to->to_cc)); - NTOHL(to->to_cc); - /* - * A CC or CC.new option received in a SYN makes - * it ok to send CC in subsequent segments. - */ - if (ti->ti_flags & TH_SYN) - tp->t_flags |= TF_RCVD_CC; - break; - case TCPOPT_CCNEW: - if (optlen != TCPOLEN_CC) - continue; - if (!(ti->ti_flags & TH_SYN)) - continue; - to->to_flag |= TOF_CCNEW; - bcopy((char *)cp + 2, - (char *)&to->to_cc, sizeof(to->to_cc)); - NTOHL(to->to_cc); - /* - * A CC or CC.new option received in a SYN makes - * it ok to send CC in subsequent segments. - */ - tp->t_flags |= TF_RCVD_CC; - break; - case TCPOPT_CCECHO: - if (optlen != TCPOLEN_CC) - continue; - if (!(ti->ti_flags & TH_SYN)) - continue; - to->to_flag |= TOF_CCECHO; - bcopy((char *)cp + 2, - (char *)&to->to_ccecho, sizeof(to->to_ccecho)); - NTOHL(to->to_ccecho); - break; - } - } - if (ti->ti_flags & TH_SYN) - tcp_mss(tp, mss); /* sets t_maxseg */ -} - -/* - * Pull out of band byte out of a segment so - * it doesn't appear in the user's data queue. - * It is still reflected in the segment length for - * sequencing purposes. - */ -void -tcp_pulloutofband(so, ti, m) - struct socket *so; - struct tcpiphdr *ti; - register struct mbuf *m; -{ - int cnt = ti->ti_urp - 1; - - while (cnt >= 0) { - if (m->m_len > cnt) { - char *cp = mtod(m, caddr_t) + cnt; - struct tcpcb *tp = sototcpcb(so); - - tp->t_iobc = *cp; - tp->t_oobflags |= TCPOOB_HAVEDATA; - bcopy(cp+1, cp, (unsigned)(m->m_len - cnt - 1)); - m->m_len--; - return; - } - cnt -= m->m_len; - m = m->m_next; - if (m == 0) - break; - } - panic("tcp_pulloutofband"); -} - -/* - * Collect new round-trip time estimate - * and update averages and current timeout. - */ -void -tcp_xmit_timer(tp, rtt) - register struct tcpcb *tp; - short rtt; -{ - register short delta; - - tcpstat.tcps_rttupdated++; - tp->t_rttupdated++; - if (tp->t_srtt != 0) { - /* - * srtt is stored as fixed point with 3 bits after the - * binary point (i.e., scaled by 8). The following magic - * is equivalent to the smoothing algorithm in rfc793 with - * an alpha of .875 (srtt = rtt/8 + srtt*7/8 in fixed - * point). Adjust rtt to origin 0. - */ - delta = rtt - 1 - (tp->t_srtt >> TCP_RTT_SHIFT); - if ((tp->t_srtt += delta) <= 0) - tp->t_srtt = 1; - /* - * We accumulate a smoothed rtt variance (actually, a - * smoothed mean difference), then set the retransmit - * timer to smoothed rtt + 4 times the smoothed variance. - * rttvar is stored as fixed point with 2 bits after the - * binary point (scaled by 4). The following is - * equivalent to rfc793 smoothing with an alpha of .75 - * (rttvar = rttvar*3/4 + |delta| / 4). This replaces - * rfc793's wired-in beta. - */ - if (delta < 0) - delta = -delta; - delta -= (tp->t_rttvar >> TCP_RTTVAR_SHIFT); - if ((tp->t_rttvar += delta) <= 0) - tp->t_rttvar = 1; - } else { - /* - * No rtt measurement yet - use the unsmoothed rtt. - * Set the variance to half the rtt (so our first - * retransmit happens at 3*rtt). - */ - tp->t_srtt = rtt << TCP_RTT_SHIFT; - tp->t_rttvar = rtt << (TCP_RTTVAR_SHIFT - 1); - } - tp->t_rtt = 0; - tp->t_rxtshift = 0; - - /* - * the retransmit should happen at rtt + 4 * rttvar. - * Because of the way we do the smoothing, srtt and rttvar - * will each average +1/2 tick of bias. When we compute - * the retransmit timer, we want 1/2 tick of rounding and - * 1 extra tick because of +-1/2 tick uncertainty in the - * firing of the timer. The bias will give us exactly the - * 1.5 tick we need. But, because the bias is - * statistical, we have to test that we don't drop below - * the minimum feasible timer (which is 2 ticks). - */ - TCPT_RANGESET(tp->t_rxtcur, TCP_REXMTVAL(tp), - tp->t_rttmin, TCPTV_REXMTMAX); - - /* - * We received an ack for a packet that wasn't retransmitted; - * it is probably safe to discard any error indications we've - * received recently. This isn't quite right, but close enough - * for now (a route might have failed after we sent a segment, - * and the return path might not be symmetrical). - */ - tp->t_softerror = 0; -} - -/* - * Determine a reasonable value for maxseg size. - * If the route is known, check route for mtu. - * If none, use an mss that can be handled on the outgoing - * interface without forcing IP to fragment; if bigger than - * an mbuf cluster (MCLBYTES), round down to nearest multiple of MCLBYTES - * to utilize large mbufs. If no route is found, route has no mtu, - * or the destination isn't local, use a default, hopefully conservative - * size (usually 512 or the default IP max size, but no more than the mtu - * of the interface), as we can't discover anything about intervening - * gateways or networks. We also initialize the congestion/slow start - * window to be a single segment if the destination isn't local. - * While looking at the routing entry, we also initialize other path-dependent - * parameters from pre-set or cached values in the routing entry. - * - * Also take into account the space needed for options that we - * send regularly. Make maxseg shorter by that amount to assure - * that we can send maxseg amount of data even when the options - * are present. Store the upper limit of the length of options plus - * data in maxopd. - * - * NOTE that this routine is only called when we process an incoming - * segment, for outgoing segments only tcp_mssopt is called. - * - * In case of T/TCP, we call this routine during implicit connection - * setup as well (offer = -1), to initialize maxseg from the cached - * MSS of our peer. - */ -void -tcp_mss(tp, offer) - struct tcpcb *tp; - int offer; -{ - register struct rtentry *rt; - struct ifnet *ifp; - register int rtt, mss; - u_long bufsize; - struct inpcb *inp; - struct socket *so; - struct rmxp_tao *taop; - int origoffer = offer; - - inp = tp->t_inpcb; - if ((rt = tcp_rtlookup(inp)) == NULL) { - tp->t_maxopd = tp->t_maxseg = tcp_mssdflt; - return; - } - so = inp->inp_socket; - - taop = rmx_taop(rt->rt_rmx); - /* - * Offer == -1 means that we didn't receive SYN yet, - * use cached value in that case; - */ - if (offer == -1) - offer = taop->tao_mssopt; - /* - * Offer == 0 means that there was no MSS on the SYN segment, - * in this case we use tcp_mssdflt. - */ - if (offer == 0) - offer = tcp_mssdflt; - else - /* - * Sanity check: make sure that maxopd will be large - * enough to allow some data on segments even is the - * all the option space is used (40bytes). Otherwise - * funny things may happen in tcp_output. - */ - offer = max(offer, 64); - taop->tao_mssopt = offer; - - /* - * While we're here, check if there's an initial rtt - * or rttvar. Convert from the route-table units - * to scaled multiples of the slow timeout timer. - */ - if (tp->t_srtt == 0 && (rtt = rt->rt_rmx.rmx_rtt)) { - /* - * XXX the lock bit for RTT indicates that the value - * is also a minimum value; this is subject to time. - */ - if (rt->rt_rmx.rmx_locks & RTV_RTT) - tp->t_rttmin = rtt / (RTM_RTTUNIT / PR_SLOWHZ); - tp->t_srtt = rtt / (RTM_RTTUNIT / (PR_SLOWHZ * TCP_RTT_SCALE)); - tcpstat.tcps_usedrtt++; - if (rt->rt_rmx.rmx_rttvar) { - tp->t_rttvar = rt->rt_rmx.rmx_rttvar / - (RTM_RTTUNIT / (PR_SLOWHZ * TCP_RTTVAR_SCALE)); - tcpstat.tcps_usedrttvar++; - } else { - /* default variation is +- 1 rtt */ - tp->t_rttvar = - tp->t_srtt * TCP_RTTVAR_SCALE / TCP_RTT_SCALE; - } - TCPT_RANGESET(tp->t_rxtcur, - ((tp->t_srtt >> 2) + tp->t_rttvar) >> 1, - tp->t_rttmin, TCPTV_REXMTMAX); - } - /* - * if there's an mtu associated with the route, use it - */ - if (rt->rt_rmx.rmx_mtu) - mss = rt->rt_rmx.rmx_mtu - sizeof(struct tcpiphdr); - else - { - mss = rt->rt_mtu - sizeof(struct tcpiphdr); - if (!in_localaddr(inp->inp_faddr)) - mss = min(mss, tcp_mssdflt); - } - mss = min(mss, offer); - /* - * maxopd stores the maximum length of data AND options - * in a segment; maxseg is the amount of data in a normal - * segment. We need to store this value (maxopd) apart - * from maxseg, because now every segment carries options - * and thus we normally have somewhat less data in segments. - */ - tp->t_maxopd = mss; - - /* - * In case of T/TCP, origoffer==-1 indicates, that no segments - * were received yet. In this case we just guess, otherwise - * we do the same as before T/TCP. - */ - if ((tp->t_flags & (TF_REQ_TSTMP|TF_NOOPT)) == TF_REQ_TSTMP && - (origoffer == -1 || - (tp->t_flags & TF_RCVD_TSTMP) == TF_RCVD_TSTMP)) - mss -= TCPOLEN_TSTAMP_APPA; - if ((tp->t_flags & (TF_REQ_CC|TF_NOOPT)) == TF_REQ_CC && - (origoffer == -1 || - (tp->t_flags & TF_RCVD_CC) == TF_RCVD_CC)) - mss -= TCPOLEN_CC_APPA; - -#if (MCLBYTES & (MCLBYTES - 1)) == 0 - if (mss > MCLBYTES) - mss &= ~(MCLBYTES-1); -#else - if (mss > MCLBYTES) - mss = mss / MCLBYTES * MCLBYTES; -#endif - /* - * If there's a pipesize, change the socket buffer - * to that size. Make the socket buffers an integral - * number of mss units; if the mss is larger than - * the socket buffer, decrease the mss. - */ -#ifdef RTV_SPIPE - if ((bufsize = rt->rt_rmx.rmx_sendpipe) == 0) -#endif - bufsize = so->so_snd.sb_hiwat; - if (bufsize < mss) - mss = bufsize; - else { - bufsize = roundup(bufsize, mss); - if (bufsize > sb_max) - bufsize = sb_max; - (void)sbreserve(&so->so_snd, bufsize); - } - tp->t_maxseg = mss; - -#ifdef RTV_RPIPE - if ((bufsize = rt->rt_rmx.rmx_recvpipe) == 0) -#endif - bufsize = so->so_rcv.sb_hiwat; - if (bufsize > mss) { - bufsize = roundup(bufsize, mss); - if (bufsize > sb_max) - bufsize = sb_max; - (void)sbreserve(&so->so_rcv, bufsize); - } - /* - * Don't force slow-start on local network. - */ - if (!in_localaddr(inp->inp_faddr)) - tp->snd_cwnd = mss; - - if (rt->rt_rmx.rmx_ssthresh) { - /* - * There's some sort of gateway or interface - * buffer limit on the path. Use this to set - * the slow start threshhold, but set the - * threshold to no less than 2*mss. - */ - tp->snd_ssthresh = max(2 * mss, rt->rt_rmx.rmx_ssthresh); - tcpstat.tcps_usedssthresh++; - } -} - -/* - * Determine the MSS option to send on an outgoing SYN. - */ -int -tcp_mssopt(tp) - struct tcpcb *tp; -{ - struct rtentry *rt; - - rt = tcp_rtlookup(tp->t_inpcb); - if (rt == NULL) - return tcp_mssdflt; - - return rt->rt_mtu - sizeof(struct tcpiphdr); -} -#endif /* TUBA_INCLUDE */ diff --git a/reactos/lib/oskittcp/oskittcp/tcp_output.c b/reactos/lib/oskittcp/oskittcp/tcp_output.c deleted file mode 100644 index 976057494d3..00000000000 --- a/reactos/lib/oskittcp/oskittcp/tcp_output.c +++ /dev/null @@ -1,823 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1988, 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)tcp_output.c 8.3 (Berkeley) 12/30/93 - */ - -#define TCPOUTFLAGS -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/malloc.h> -#include <sys/mbuf.h> -#include <sys/protosw.h> -#include <sys/socket.h> -#include <sys/socketvar.h> -#include <sys/errno.h> -#include <sys/queue.h> - -#include <net/route.h> - -#include <netinet/in.h> -#include <netinet/in_systm.h> -#include <netinet/ip.h> -#include <netinet/in_pcb.h> -#include <netinet/ip_var.h> -#include <netinet/tcp.h> -#include <netinet/tcp_fsm.h> -#include <netinet/tcp_seq.h> -#include <netinet/tcp_timer.h> -#include <netinet/tcp_var.h> -#include <netinet/tcpip.h> -#ifdef TCPDEBUG -#include <netinet/tcp_debug.h> -#endif -#include <oskittcp.h> - -#ifdef notyet -extern struct mbuf *m_copypack(); -#endif - - -/* - * Tcp output routine: figure out what should be sent and send it. - */ -int -tcp_output(tp) - register struct tcpcb *tp; -{ - register struct socket *so = tp->t_inpcb->inp_socket; - register long len, win; - int off, flags, error = EINVAL; - register struct mbuf *m; - register struct tcpiphdr *ti; - u_char opt[TCP_MAXOLEN]; - unsigned optlen, hdrlen; - int idle, sendalot; - struct rmxp_tao *taop; - struct rmxp_tao tao_noncached; - - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); - - /* - * Determine length of data that should be transmitted, - * and flags that will be used. - * If there is some data or critical controls (SYN, RST) - * to send, then transmit; otherwise, investigate further. - */ - idle = (tp->snd_max == tp->snd_una); - if (idle && tp->t_idle >= tp->t_rxtcur) - /* - * We have been idle for "a while" and no acks are - * expected to clock out any data we send -- - * slow start to get ack "clock" running again. - */ - tp->snd_cwnd = tp->t_maxseg; -again: - sendalot = 0; - off = tp->snd_nxt - tp->snd_una; - win = min(tp->snd_wnd, tp->snd_cwnd); - - flags = tcp_outflags[tp->t_state]; - /* - * Get standard flags, and add SYN or FIN if requested by 'hidden' - * state flags. - */ - if (tp->t_flags & TF_NEEDFIN) - flags |= TH_FIN; - if (tp->t_flags & TF_NEEDSYN) - flags |= TH_SYN; - - /* - * If in persist timeout with window of 0, send 1 byte. - * Otherwise, if window is small but nonzero - * and timer expired, we will send what we can - * and go to transmit state. - */ - if (tp->t_force) { - if (win == 0) { - /* - * If we still have some data to send, then - * clear the FIN bit. Usually this would - * happen below when it realizes that we - * aren't sending all the data. However, - * if we have exactly 1 byte of unset data, - * then it won't clear the FIN bit below, - * and if we are in persist state, we wind - * up sending the packet without recording - * that we sent the FIN bit. - * - * We can't just blindly clear the FIN bit, - * because if we don't have any more data - * to send then the probe will be the FIN - * itself. - */ - if (off < so->so_snd.sb_cc) - flags &= ~TH_FIN; - win = 1; - } else { - tp->t_timer[TCPT_PERSIST] = 0; - tp->t_rxtshift = 0; - } - } - - len = min(so->so_snd.sb_cc, win) - off; - - if ((taop = tcp_gettaocache(tp->t_inpcb)) == NULL) { - taop = &tao_noncached; - bzero(taop, sizeof(*taop)); - } - - /* - * Lop off SYN bit if it has already been sent. However, if this - * is SYN-SENT state and if segment contains data and if we don't - * know that foreign host supports TAO, suppress sending segment. - */ - if ((flags & TH_SYN) && SEQ_GT(tp->snd_nxt, tp->snd_una)) { - flags &= ~TH_SYN; - off--, len++; - if (len > 0 && tp->t_state == TCPS_SYN_SENT && - taop->tao_ccsent == 0) - return 0; - } - - /* - * Be careful not to send data and/or FIN on SYN segments - * in cases when no CC option will be sent. - * This measure is needed to prevent interoperability problems - * with not fully conformant TCP implementations. - */ - if ((flags & TH_SYN) && - ((tp->t_flags & TF_NOOPT) || !(tp->t_flags & TF_REQ_CC) || - ((flags & TH_ACK) && !(tp->t_flags & TF_RCVD_CC)))) { - len = 0; - flags &= ~TH_FIN; - } - - if (len < 0) { - /* - * If FIN has been sent but not acked, - * but we haven't been called to retransmit, - * len will be -1. Otherwise, window shrank - * after we sent into it. If window shrank to 0, - * cancel pending retransmit, pull snd_nxt back - * to (closed) window, and set the persist timer - * if it isn't already going. If the window didn't - * close completely, just wait for an ACK. - */ - len = 0; - if (win == 0) { - tp->t_timer[TCPT_REXMT] = 0; - tp->t_rxtshift = 0; - tp->snd_nxt = tp->snd_una; - if (tp->t_timer[TCPT_PERSIST] == 0) - tcp_setpersist(tp); - } - } - if (len > tp->t_maxseg) { - len = tp->t_maxseg; - sendalot = 1; - } - if (SEQ_LT(tp->snd_nxt + len, tp->snd_una + so->so_snd.sb_cc)) - flags &= ~TH_FIN; - - win = sbspace(&so->so_rcv); - - /* - * Sender silly window avoidance. If connection is idle - * and can send all data, a maximum segment, - * at least a maximum default-size segment do it, - * or are forced, do it; otherwise don't bother. - * If peer's buffer is tiny, then send - * when window is at least half open. - * If retransmitting (possibly after persist timer forced us - * to send into a small window), then must resend. - */ - if (len) { - if (len == tp->t_maxseg) - goto send; - if ((idle || tp->t_flags & TF_NODELAY) && - (tp->t_flags & TF_NOPUSH) == 0 && - len + off >= so->so_snd.sb_cc) - goto send; - if (tp->t_force) - goto send; - if (len >= tp->max_sndwnd / 2 && tp->max_sndwnd > 0) - goto send; - if (SEQ_LT(tp->snd_nxt, tp->snd_max)) - goto send; - } - - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); - - /* - * Compare available window to amount of window - * known to peer (as advertised window less - * next expected input). If the difference is at least two - * max size segments, or at least 50% of the maximum possible - * window, then want to send a window update to peer. - */ - if (win > 0) { - /* - * "adv" is the amount we can increase the window, - * taking into account that we are limited by - * TCP_MAXWIN << tp->rcv_scale. - */ - long adv = min(win, (long)TCP_MAXWIN << tp->rcv_scale) - - (tp->rcv_adv - tp->rcv_nxt); - - if (adv >= (long) (2 * tp->t_maxseg)) - goto send; - if (2 * adv >= (long) so->so_rcv.sb_hiwat) - goto send; - } - - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); - - /* - * Send if we owe peer an ACK. - */ - if (tp->t_flags & TF_ACKNOW) - goto send; - if ((flags & TH_RST) || - ((flags & TH_SYN) && (tp->t_flags & TF_NEEDSYN) == 0)) - goto send; - if (SEQ_GT(tp->snd_up, tp->snd_una)) - goto send; - /* - * If our state indicates that FIN should be sent - * and we have not yet done so, or we're retransmitting the FIN, - * then we need to send. - */ - if (flags & TH_FIN && - ((tp->t_flags & TF_SENTFIN) == 0 || tp->snd_nxt == tp->snd_una)) - goto send; - - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); - - /* - * TCP window updates are not reliable, rather a polling protocol - * using ``persist'' packets is used to insure receipt of window - * updates. The three ``states'' for the output side are: - * idle not doing retransmits or persists - * persisting to move a small or zero window - * (re)transmitting and thereby not persisting - * - * tp->t_timer[TCPT_PERSIST] - * is set when we are in persist state. - * tp->t_force - * is set when we are called to send a persist packet. - * tp->t_timer[TCPT_REXMT] - * is set when we are retransmitting - * The output side is idle when both timers are zero. - * - * If send window is too small, there is data to transmit, and no - * retransmit or persist is pending, then go to persist state. - * If nothing happens soon, send when timer expires: - * if window is nonzero, transmit what we can, - * otherwise force out a byte. - */ - if (so->so_snd.sb_cc && tp->t_timer[TCPT_REXMT] == 0 && - tp->t_timer[TCPT_PERSIST] == 0) { - tp->t_rxtshift = 0; - tcp_setpersist(tp); - } - - /* - * No reason to send a segment, just return. - */ - /*return (0);*/ - -send: - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); - - /* - * Before ESTABLISHED, force sending of initial options - * unless TCP set not to do any options. - * NOTE: we assume that the IP/TCP header plus TCP options - * always fit in a single mbuf, leaving room for a maximum - * link header, i.e. - * max_linkhdr + sizeof (struct tcpiphdr) + optlen <= MHLEN - */ - optlen = 0; - hdrlen = sizeof (struct tcpiphdr); - if (flags & TH_SYN) { - tp->snd_nxt = tp->iss; - if ((tp->t_flags & TF_NOOPT) == 0) { - u_short mss; - - opt[0] = TCPOPT_MAXSEG; - opt[1] = TCPOLEN_MAXSEG; - mss = htons((u_short) tcp_mssopt(tp)); - (void)memcpy(opt + 2, &mss, sizeof(mss)); - optlen = TCPOLEN_MAXSEG; - - if ((tp->t_flags & TF_REQ_SCALE) && - ((flags & TH_ACK) == 0 || - (tp->t_flags & TF_RCVD_SCALE))) { - *((u_long *) (opt + optlen)) = htonl( - TCPOPT_NOP << 24 | - TCPOPT_WINDOW << 16 | - TCPOLEN_WINDOW << 8 | - tp->request_r_scale); - optlen += 4; - } - } - } - - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); - - /* - * Send a timestamp and echo-reply if this is a SYN and our side - * wants to use timestamps (TF_REQ_TSTMP is set) or both our side - * and our peer have sent timestamps in our SYN's. - */ - if ((tp->t_flags & (TF_REQ_TSTMP|TF_NOOPT)) == TF_REQ_TSTMP && - (flags & TH_RST) == 0 && - ((flags & TH_ACK) == 0 || - (tp->t_flags & TF_RCVD_TSTMP))) { - u_long *lp = (u_long *)(opt + optlen); - - /* Form timestamp option as shown in appendix A of RFC 1323. */ - *lp++ = htonl(TCPOPT_TSTAMP_HDR); - *lp++ = htonl(tcp_now); - *lp = htonl(tp->ts_recent); - optlen += TCPOLEN_TSTAMP_APPA; - } - - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); - - /* - * Send `CC-family' options if our side wants to use them (TF_REQ_CC), - * options are allowed (!TF_NOOPT) and it's not a RST. - */ - if ((tp->t_flags & (TF_REQ_CC|TF_NOOPT)) == TF_REQ_CC && - (flags & TH_RST) == 0) { - switch (flags & (TH_SYN|TH_ACK)) { - /* - * This is a normal ACK, send CC if we received CC before - * from our peer. - */ - case TH_ACK: - if (!(tp->t_flags & TF_RCVD_CC)) - break; - /*FALLTHROUGH*/ - - /* - * We can only get here in T/TCP's SYN_SENT* state, when - * we're a sending a non-SYN segment without waiting for - * the ACK of our SYN. A check above assures that we only - * do this if our peer understands T/TCP. - */ - case 0: - opt[optlen++] = TCPOPT_NOP; - opt[optlen++] = TCPOPT_NOP; - opt[optlen++] = TCPOPT_CC; - opt[optlen++] = TCPOLEN_CC; - *(u_int32_t *)&opt[optlen] = htonl(tp->cc_send); - - optlen += 4; - break; - - /* - * This is our initial SYN, check whether we have to use - * CC or CC.new. - */ - case TH_SYN: -#if 0 - opt[optlen++] = TCPOPT_NOP; - opt[optlen++] = TCPOPT_NOP; - opt[optlen++] = tp->t_flags & TF_SENDCCNEW ? - TCPOPT_CCNEW : TCPOPT_CC; - opt[optlen++] = TCPOLEN_CC; - *(u_int32_t *)&opt[optlen] = htonl(tp->cc_send); - optlen += 4; -#endif - break; - - /* - * This is a SYN,ACK; send CC and CC.echo if we received - * CC from our peer. - */ - case (TH_SYN|TH_ACK): - if (tp->t_flags & TF_RCVD_CC) { - opt[optlen++] = TCPOPT_NOP; - opt[optlen++] = TCPOPT_NOP; - opt[optlen++] = TCPOPT_CC; - opt[optlen++] = TCPOLEN_CC; - *(u_int32_t *)&opt[optlen] = - htonl(tp->cc_send); - optlen += 4; - opt[optlen++] = TCPOPT_NOP; - opt[optlen++] = TCPOPT_NOP; - opt[optlen++] = TCPOPT_CCECHO; - opt[optlen++] = TCPOLEN_CC; - *(u_int32_t *)&opt[optlen] = - htonl(tp->cc_recv); - optlen += 4; - } - break; - } - } - - hdrlen += optlen; - - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); - - /* - * Adjust data length if insertion of options will - * bump the packet length beyond the t_maxopd length. - * Clear the FIN bit because we cut off the tail of - * the segment. - */ - if (len + optlen > tp->t_maxopd) { - /* - * If there is still more to send, don't close the connection. - */ - flags &= ~TH_FIN; - len = tp->t_maxopd - optlen; - sendalot = 1; - } - -/*#ifdef DIAGNOSTIC*/ - if (max_linkhdr + hdrlen > MHLEN) - panic("tcphdr too big"); -/*#endif*/ - - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); - - /* - * Grab a header mbuf, attaching a copy of data to - * be transmitted, and initialize the header from - * the template for sends on this connection. - */ - if (len) { - if (tp->t_force && len == 1) - tcpstat.tcps_sndprobe++; - else if (SEQ_LT(tp->snd_nxt, tp->snd_max)) { - tcpstat.tcps_sndrexmitpack++; - tcpstat.tcps_sndrexmitbyte += len; - } else { - tcpstat.tcps_sndpack++; - tcpstat.tcps_sndbyte += len; - } -#ifdef notyet - if ((m = m_copypack(so->so_snd.sb_mb, off, - (int)len, max_linkhdr + hdrlen)) == 0) { - error = ENOBUFS; - goto out; - } - /* - * m_copypack left space for our hdr; use it. - */ - m->m_len += hdrlen; - m->m_data -= hdrlen; -#else - MGETHDR(m, M_DONTWAIT, MT_HEADER); - if (m == NULL) { - error = ENOBUFS; - goto out; - } - m->m_data += max_linkhdr; - m->m_len = hdrlen; - if (len <= MHLEN - hdrlen - max_linkhdr) { - m_copydata(so->so_snd.sb_mb, off, (int) len, - mtod(m, caddr_t) + hdrlen); - m->m_len += len; - } else { - m->m_next = m_copy(so->so_snd.sb_mb, off, (int) len); - if (m->m_next == 0) { - (void) m_free(m); - error = ENOBUFS; - goto out; - } - } -#endif - /* - * If we're sending everything we've got, set PUSH. - * (This will keep happy those implementations which only - * give data to the user when a buffer fills or - * a PUSH comes in.) - */ - if (off + len == so->so_snd.sb_cc) - flags |= TH_PUSH; - } else { - if (tp->t_flags & TF_ACKNOW) - tcpstat.tcps_sndacks++; - else if (flags & (TH_SYN|TH_FIN|TH_RST)) - tcpstat.tcps_sndctrl++; - else if (SEQ_GT(tp->snd_up, tp->snd_una)) - tcpstat.tcps_sndurg++; - else - tcpstat.tcps_sndwinup++; - - MGETHDR(m, M_DONTWAIT, MT_HEADER); - if (m == NULL) { - error = ENOBUFS; - goto out; - } - m->m_data += max_linkhdr; - m->m_len = hdrlen; - } - - m->m_pkthdr.rcvif = (struct ifnet *)0; - ti = mtod(m, struct tcpiphdr *); - if (tp->t_template == 0) - panic("tcp_output"); - (void)memcpy(ti, tp->t_template, sizeof (struct tcpiphdr)); - - /* - * Fill in fields, remembering maximum advertised - * window for use in delaying messages about window sizes. - * If resending a FIN, be sure not to use a new sequence number. - */ - - if (flags & TH_FIN && tp->t_flags & TF_SENTFIN && - tp->snd_nxt == tp->snd_max) - tp->snd_nxt--; - - /* - * If we are doing retransmissions, then snd_nxt will - * not reflect the first unsent octet. For ACK only - * packets, we do not want the sequence number of the - * retransmitted packet, we want the sequence number - * of the next unsent octet. So, if there is no data - * (and no SYN or FIN), use snd_max instead of snd_nxt - * when filling in ti_seq. But if we are in persist - * state, snd_max might reflect one byte beyond the - * right edge of the window, so use snd_nxt in that - * case, since we know we aren't doing a retransmission. - * (retransmit and persist are mutually exclusive...) - */ - if (len || (flags & (TH_SYN|TH_FIN)) || tp->t_timer[TCPT_PERSIST]) - ti->ti_seq = htonl(tp->snd_nxt); - else - ti->ti_seq = htonl(tp->snd_max); - - ti->ti_ack = htonl(tp->rcv_nxt); - - if (optlen) { - (void)memcpy(ti + 1, opt, optlen); - ti->ti_off = (sizeof (struct tcphdr) + optlen) >> 2; - } - - ti->ti_flags = flags; - - /* - * Calculate receive window. Don't shrink window, - * but avoid silly window syndrome. - */ - if (win < (long)(so->so_rcv.sb_hiwat / 4) && win < (long)tp->t_maxseg) - win = 0; - - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); - - if (win > (long)TCP_MAXWIN << tp->rcv_scale) - win = (long)TCP_MAXWIN << tp->rcv_scale; - - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); - - if (win < (long)(tp->rcv_adv - tp->rcv_nxt)) - win = (long)(tp->rcv_adv - tp->rcv_nxt); - - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); - - ti->ti_win = htons((u_short) (win>>tp->rcv_scale)); - if (SEQ_GT(tp->snd_up, tp->snd_nxt)) { - ti->ti_urp = htons((u_short)(tp->snd_up - tp->snd_nxt)); - ti->ti_flags |= TH_URG; - } else - /* - * If no urgent pointer to send, then we pull - * the urgent pointer to the left edge of the send window - * so that it doesn't drift into the send window on sequence - * number wraparound. - */ - tp->snd_up = tp->snd_una; /* drag it along */ - - /* - * Put TCP length in extended header, and then - * checksum extended header and data. - */ - - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); - - if (len + optlen) { - ti->ti_src.s_addr = tp->t_inpcb->inp_laddr.s_addr; - ti->ti_dst.s_addr = tp->t_inpcb->inp_faddr.s_addr; - ti->ti_pr = 6; - ti->ti_len = htons((u_short)(sizeof (struct tcphdr) + - optlen + len)); - } - - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); - - ti->ti_sum = in_cksum(m, (int)(hdrlen + len)); - - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); - - /* - * In transmit state, time the transmission and arrange for - * the retransmit. In persist state, just set snd_max. - */ - if (tp->t_force == 0 || tp->t_timer[TCPT_PERSIST] == 0) { - tcp_seq startseq = tp->snd_nxt; - - /* - * Advance snd_nxt over sequence space of this segment. - */ - if (flags & (TH_SYN|TH_FIN)) { - if (flags & TH_SYN) - tp->snd_nxt++; - if (flags & TH_FIN) { - tp->snd_nxt++; - tp->t_flags |= TF_SENTFIN; - } - } - tp->snd_nxt += len; - if (SEQ_GT(tp->snd_nxt, tp->snd_max)) { - tp->snd_max = tp->snd_nxt; - /* - * Time this transmission if not a retransmission and - * not currently timing anything. - */ - if (tp->t_rtt == 0) { - tp->t_rtt = 1; - tp->t_rtseq = startseq; - tcpstat.tcps_segstimed++; - } - } - - /* - * Set retransmit timer if not currently set, - * and not doing an ack or a keep-alive probe. - * Initial value for retransmit timer is smoothed - * round-trip time + 2 * round-trip time variance. - * Initialize shift counter which is used for backoff - * of retransmit time. - */ - if (tp->t_timer[TCPT_REXMT] == 0 && - tp->snd_nxt != tp->snd_una) { - tp->t_timer[TCPT_REXMT] = tp->t_rxtcur; - if (tp->t_timer[TCPT_PERSIST]) { - tp->t_timer[TCPT_PERSIST] = 0; - tp->t_rxtshift = 0; - } - } - } else - if (SEQ_GT(tp->snd_nxt + len, tp->snd_max)) - tp->snd_max = tp->snd_nxt + len; - - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); - -#ifdef TCPDEBUG - /* - * Trace. - */ - if (so->so_options & SO_DEBUG) - tcp_trace(TA_OUTPUT, tp->t_state, tp, ti, 0); -#endif - - /* - * Fill in IP length and desired time to live and - * send to IP level. There should be a better way - * to handle ttl and tos; we could keep them in - * the template, but need a way to checksum without them. - */ - m->m_pkthdr.len = hdrlen + len; -#ifdef TUBA - if (tp->t_tuba_pcb) - error = tuba_output(m, tp); - else -#endif - { -#if 1 - struct rtentry *rt; -#endif - ((struct ip *)ti)->ip_len = m->m_pkthdr.len; - ((struct ip *)ti)->ip_ttl = tp->t_inpcb->inp_ip.ip_ttl; /* XXX */ - ((struct ip *)ti)->ip_tos = tp->t_inpcb->inp_ip.ip_tos; /* XXX */ -#if 1 - /* - * See if we should do MTU discovery. We do it only if the following - * are true: - * 1) we have a valid route to the destination - * 2) the MTU is not locked (if it is, then discovery has been - * disabled) - */ - if ((rt = &tp->t_inpcb->inp_route.ro_rt) - && rt->rt_flags & RTF_UP - && !(rt->rt_rmx.rmx_locks & RTV_MTU)) { - ((struct ip *)ti)->ip_off |= IP_DF; - } -#endif - - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); - - error = ip_output(so, m, tp->t_inpcb->inp_options, &tp->t_inpcb->inp_route, - so->so_options & SO_DONTROUTE, 0); - } - if (error) { -out: - if (error == ENOBUFS) { - tcp_quench(tp->t_inpcb, 0); - return (0); - } -#if 1 - if (error == EMSGSIZE) { - /* - * ip_output() will have already fixed the route - * for us. tcp_mtudisc() will, as its last action, - * initiate retransmission, so it is important to - * not do so here. - */ - tcp_mtudisc(tp->t_inpcb, 0); - return 0; - } -#endif - if ((error == EHOSTUNREACH || error == ENETDOWN) - && TCPS_HAVERCVDSYN(tp->t_state)) { - tp->t_softerror = error; - return (0); - } - return (error); - } - tcpstat.tcps_sndtotal++; - - /* - * Data sent (as far as we can tell). - * If this advertises a larger window than any other segment, - * then remember the size of the advertised window. - * Any pending ACK has now been sent. - */ - if (win > 0 && SEQ_GT(tp->rcv_nxt+win, tp->rcv_adv)) - tp->rcv_adv = tp->rcv_nxt + win; - tp->last_ack_sent = tp->rcv_nxt; - tp->t_flags &= ~(TF_ACKNOW|TF_DELACK); - if (sendalot) - goto again; - return (0); -} - -void -tcp_setpersist(tp) - register struct tcpcb *tp; -{ - register t = ((tp->t_srtt >> 2) + tp->t_rttvar) >> 1; - - if (tp->t_timer[TCPT_REXMT]) - panic("tcp_output REXMT"); - /* - * Start/restart persistance timer. - */ - TCPT_RANGESET(tp->t_timer[TCPT_PERSIST], - t * tcp_backoff[tp->t_rxtshift], - TCPTV_PERSMIN, TCPTV_PERSMAX); - if (tp->t_rxtshift < TCP_MAXRXTSHIFT) - tp->t_rxtshift++; -} diff --git a/reactos/lib/oskittcp/oskittcp/tcp_subr.c b/reactos/lib/oskittcp/oskittcp/tcp_subr.c deleted file mode 100644 index b67a1e91db5..00000000000 --- a/reactos/lib/oskittcp/oskittcp/tcp_subr.c +++ /dev/null @@ -1,610 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1988, 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)tcp_subr.c 8.1 (Berkeley) 6/10/93 - */ - -#include <sys/param.h> -#include <sys/proc.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/malloc.h> -#include <sys/mbuf.h> -#include <sys/socket.h> -#include <sys/socketvar.h> -#include <sys/protosw.h> -#include <sys/errno.h> -#include <sys/queue.h> - -#include <net/route.h> -#include <net/if.h> - -#include <netinet/in.h> -#include <netinet/in_systm.h> -#include <netinet/ip.h> -#include <netinet/in_pcb.h> -#include <netinet/in_var.h> -#include <netinet/ip_var.h> -#include <netinet/ip_icmp.h> -#include <netinet/tcp.h> -#include <netinet/tcp_fsm.h> -#include <netinet/tcp_seq.h> -#include <netinet/tcp_timer.h> -#include <netinet/tcp_var.h> -#include <netinet/tcpip.h> -#ifdef TCPDEBUG -#include <netinet/tcp_debug.h> -#endif - -/* patchable/settable parameters for tcp */ -int tcp_mssdflt = TCP_MSS; -int tcp_rttdflt = TCPTV_SRTTDFLT / PR_SLOWHZ; -int tcp_do_rfc1323 = 1; -int tcp_do_rfc1644 = 1; -static void tcp_cleartaocache(void); - -/* - * Target size of TCP PCB hash table. Will be rounded down to a prime - * number. - */ -#ifndef TCBHASHSIZE -#define TCBHASHSIZE 128 -#endif - -/* - * Tcp initialization - */ -void -tcp_init() -{ - - tcp_iss = boottime.tv_sec; /* wrong */ - tcp_ccgen = 1; - tcp_cleartaocache(); - LIST_INIT(&tcb); - tcbinfo.listhead = &tcb; - tcbinfo.hashbase = phashinit(TCBHASHSIZE, M_PCB, &tcbinfo.hashsize); - if (max_protohdr < sizeof(struct tcpiphdr)) - max_protohdr = sizeof(struct tcpiphdr); - if (max_linkhdr + sizeof(struct tcpiphdr) > MHLEN) - panic("tcp_init"); -} - -/* - * Create template to be used to send tcp packets on a connection. - * Call after host entry created, allocates an mbuf and fills - * in a skeletal tcp/ip header, minimizing the amount of work - * necessary when the connection is used. - */ -struct tcpiphdr * -tcp_template(tp) - struct tcpcb *tp; -{ - register struct inpcb *inp = tp->t_inpcb; - register struct mbuf *m; - register struct tcpiphdr *n; - - if ((n = tp->t_template) == 0) { - m = m_get(M_DONTWAIT, MT_HEADER); - OS_DbgPrint(OSK_MID_TRACE,("Allocated template mbuf at %x\n", m)); - if (m == NULL) - return (0); - m->m_len = sizeof (struct tcpiphdr); - n = mtod(m, struct tcpiphdr *); - } - n->ti_next = n->ti_prev = 0; - n->ti_x1 = 0; - n->ti_pr = IPPROTO_TCP; - n->ti_len = htons(sizeof (struct tcpiphdr) - sizeof (struct ip)); - n->ti_src = inp->inp_laddr; - n->ti_dst = inp->inp_faddr; - n->ti_sport = inp->inp_lport; - n->ti_dport = inp->inp_fport; - n->ti_seq = 0; - n->ti_ack = 0; - n->ti_x2 = 0; - n->ti_off = 5; - n->ti_flags = 0; - n->ti_win = 0; - n->ti_sum = 0; - n->ti_urp = 0; - return (n); -} - -/* - * Send a single message to the TCP at address specified by - * the given TCP/IP header. If m == 0, then we make a copy - * of the tcpiphdr at ti and send directly to the addressed host. - * This is used to force keep alive messages out using the TCP - * template for a connection tp->t_template. If flags are given - * then we send a message back to the TCP which originated the - * segment ti, and discard the mbuf containing it and any other - * attached mbufs. - * - * In any case the ack and sequence number of the transmitted - * segment are as specified by the parameters. - */ -void -tcp_respond(tp, ti, m, ack, seq, flags) - struct tcpcb *tp; - register struct tcpiphdr *ti; - register struct mbuf *m; - tcp_seq ack, seq; - int flags; -{ - register int tlen; - int win = 0; - struct route *ro = 0; - - if (tp) { - win = sbspace(&tp->t_inpcb->inp_socket->so_rcv); - ro = &tp->t_inpcb->inp_route; - } - if (m == 0) { - m = m_gethdr(M_DONTWAIT, MT_HEADER); - if (m == NULL) - return; -#ifdef TCP_COMPAT_42 - tlen = 1; -#else - tlen = 0; -#endif - m->m_data += max_linkhdr; - *mtod(m, struct tcpiphdr *) = *ti; - ti = mtod(m, struct tcpiphdr *); - flags = TH_ACK; - } else { - m_freem(m->m_next); - m->m_next = 0; - m->m_data = (caddr_t)ti; - m->m_len = sizeof (struct tcpiphdr); - tlen = 0; -#define xchg(a,b,type) { type t; t=a; a=b; b=t; } - xchg(ti->ti_dst.s_addr, ti->ti_src.s_addr, u_long); - xchg(ti->ti_dport, ti->ti_sport, u_short); -#undef xchg - } - ti->ti_len = htons((u_short)(sizeof (struct tcphdr) + tlen)); - tlen += sizeof (struct tcpiphdr); - m->m_len = tlen; - m->m_pkthdr.len = tlen; - m->m_pkthdr.rcvif = (struct ifnet *) 0; - ti->ti_next = ti->ti_prev = 0; - ti->ti_x1 = 0; - ti->ti_seq = htonl(seq); - ti->ti_ack = htonl(ack); - ti->ti_x2 = 0; - ti->ti_off = sizeof (struct tcphdr) >> 2; - ti->ti_flags = flags; - if (tp) - ti->ti_win = htons((u_short) (win >> tp->rcv_scale)); - else - ti->ti_win = htons((u_short)win); - ti->ti_urp = 0; - ti->ti_sum = 0; - ti->ti_sum = in_cksum(m, tlen); - ((struct ip *)ti)->ip_len = tlen; - ((struct ip *)ti)->ip_ttl = ip_defttl; -#ifdef TCPDEBUG - if (tp == NULL || (tp->t_inpcb->inp_socket->so_options & SO_DEBUG)) - tcp_trace(TA_OUTPUT, 0, tp, ti, 0); -#endif - (void) ip_output(0, m, NULL, ro, 0, NULL); -} - -/* - * Create a new TCP control block, making an - * empty reassembly queue and hooking it to the argument - * protocol control block. - */ -struct tcpcb * -tcp_newtcpcb(inp) - struct inpcb *inp; -{ - register struct tcpcb *tp; - - tp = malloc(sizeof(*tp), M_PCB, M_NOWAIT); - if (tp == NULL) - return ((struct tcpcb *)0); - bzero((char *) tp, sizeof(struct tcpcb)); - tp->seg_next = tp->seg_prev = (struct tcpiphdr *)tp; - tp->t_maxseg = tp->t_maxopd = tcp_mssdflt; - - if (tcp_do_rfc1323) - tp->t_flags = (TF_REQ_SCALE|TF_REQ_TSTMP); - if (tcp_do_rfc1644) - tp->t_flags |= TF_REQ_CC; - tp->t_inpcb = inp; - /* - * Init srtt to TCPTV_SRTTBASE (0), so we can tell that we have no - * rtt estimate. Set rttvar so that srtt + 2 * rttvar gives - * reasonable initial retransmit time. - */ - tp->t_srtt = TCPTV_SRTTBASE; - tp->t_rttvar = tcp_rttdflt * PR_SLOWHZ << 2; - tp->t_rttmin = TCPTV_MIN; - TCPT_RANGESET(tp->t_rxtcur, - ((TCPTV_SRTTBASE >> 2) + (TCPTV_SRTTDFLT << 2)) >> 1, - TCPTV_MIN, TCPTV_REXMTMAX); - tp->snd_cwnd = TCP_MAXWIN << TCP_MAX_WINSHIFT; - tp->snd_ssthresh = TCP_MAXWIN << TCP_MAX_WINSHIFT; - inp->inp_ip.ip_ttl = ip_defttl; - inp->inp_ppcb = (caddr_t)tp; - return (tp); -} - -/* - * Drop a TCP connection, reporting - * the specified error. If connection is synchronized, - * then send a RST to peer. - */ -struct tcpcb * -tcp_drop(tp, errno) - register struct tcpcb *tp; - int errno; -{ - struct socket *so = tp->t_inpcb->inp_socket; - - if (TCPS_HAVERCVDSYN(tp->t_state)) { - tp->t_state = TCPS_CLOSED; - (void) tcp_output(tp); - tcpstat.tcps_drops++; - } else - tcpstat.tcps_conndrops++; - if (errno == ETIMEDOUT && tp->t_softerror) - errno = tp->t_softerror; - so->so_error = errno; - return (tcp_close(tp)); -} - -/* - * Close a TCP control block: - * discard all space held by the tcp - * discard internet protocol block - * wake up any sleepers - */ -struct tcpcb * -tcp_close(tp) - register struct tcpcb *tp; -{ - register struct tcpiphdr *t; - struct inpcb *inp = tp->t_inpcb; - struct socket *so = inp->inp_socket; - register struct mbuf *m; -#ifdef RTV_RTT - register struct rtentry *rt; - - /* - * If we got enough samples through the srtt filter, - * save the rtt and rttvar in the routing entry. - * 'Enough' is arbitrarily defined as the 16 samples. - * 16 samples is enough for the srtt filter to converge - * to within 5% of the correct value; fewer samples and - * we could save a very bogus rtt. - * - * Don't update the default route's characteristics and don't - * update anything that the user "locked". - */ - if (tp->t_rttupdated >= 16 && (rt = &inp->inp_route.ro_rt)) { - register u_long i = 0; - - if ((rt->rt_rmx.rmx_locks & RTV_RTT) == 0) { - i = tp->t_srtt * - (RTM_RTTUNIT / (PR_SLOWHZ * TCP_RTT_SCALE)); - if (rt->rt_rmx.rmx_rtt && i) - /* - * filter this update to half the old & half - * the new values, converting scale. - * See route.h and tcp_var.h for a - * description of the scaling constants. - */ - rt->rt_rmx.rmx_rtt = - (rt->rt_rmx.rmx_rtt + i) / 2; - else - rt->rt_rmx.rmx_rtt = i; - tcpstat.tcps_cachedrtt++; - } - if ((rt->rt_rmx.rmx_locks & RTV_RTTVAR) == 0) { - i = tp->t_rttvar * - (RTM_RTTUNIT / (PR_SLOWHZ * TCP_RTTVAR_SCALE)); - if (rt->rt_rmx.rmx_rttvar && i) - rt->rt_rmx.rmx_rttvar = - (rt->rt_rmx.rmx_rttvar + i) / 2; - else - rt->rt_rmx.rmx_rttvar = i; - tcpstat.tcps_cachedrttvar++; - } - /* - * update the pipelimit (ssthresh) if it has been updated - * already or if a pipesize was specified & the threshhold - * got below half the pipesize. I.e., wait for bad news - * before we start updating, then update on both good - * and bad news. - */ - if (((rt->rt_rmx.rmx_locks & RTV_SSTHRESH) == 0 && - ((i = tp->snd_ssthresh) != 0) && rt->rt_rmx.rmx_ssthresh) || - i < (rt->rt_rmx.rmx_sendpipe / 2)) { - /* - * convert the limit from user data bytes to - * packets then to packet data bytes. - */ - i = (i + tp->t_maxseg / 2) / tp->t_maxseg; - if (i < 2) - i = 2; - i *= (u_long)(tp->t_maxseg + sizeof (struct tcpiphdr)); - if (rt->rt_rmx.rmx_ssthresh) - rt->rt_rmx.rmx_ssthresh = - (rt->rt_rmx.rmx_ssthresh + i) / 2; - else - rt->rt_rmx.rmx_ssthresh = i; - tcpstat.tcps_cachedssthresh++; - } - } -#endif /* RTV_RTT */ - /* free the reassembly queue, if any */ - t = tp->seg_next; - while (t != (struct tcpiphdr *)tp) { - t = (struct tcpiphdr *)t->ti_next; - m = REASS_MBUF((struct tcpiphdr *)t->ti_prev); - remque(t->ti_prev); - m_freem(m); - } - if (tp->t_template) { - (void) m_free(dtom(tp->t_template)); - OS_DbgPrint(OSK_MID_TRACE,("Freeing template mbuf at %x\n", - tp->t_template)); - tp->t_template = 0; - } - free(tp, M_PCB); - inp->inp_ppcb = 0; - soisdisconnected(so); - in_pcbdetach(inp); - tcpstat.tcps_closed++; - return ((struct tcpcb *)0); -} - -void -tcp_drain() -{ - -} - -/* - * Notify a tcp user of an asynchronous error; - * store error as soft error, but wake up user - * (for now, won't do anything until can select for soft error). - */ -void -tcp_notify(inp, error) - struct inpcb *inp; - int error; -{ - register struct tcpcb *tp = (struct tcpcb *)inp->inp_ppcb; - register struct socket *so = inp->inp_socket; - - /* - * Ignore some errors if we are hooked up. - * If connection hasn't completed, has retransmitted several times, - * and receives a second error, give up now. This is better - * than waiting a long time to establish a connection that - * can never complete. - */ - if (tp->t_state == TCPS_ESTABLISHED && - (error == EHOSTUNREACH || error == ENETUNREACH || - error == EHOSTDOWN)) { - return; - } else if (tp->t_state < TCPS_ESTABLISHED && tp->t_rxtshift > 3 && - tp->t_softerror) - so->so_error = error; - else - tp->t_softerror = error; - wakeup((caddr_t) &so->so_timeo); - sorwakeup(so); - sowwakeup(so); -} - -void -tcp_ctlinput(cmd, sa, ip) - int cmd; - struct sockaddr *sa; - register struct ip *ip; -{ - register struct tcphdr *th; - void (*notify) __P((struct inpcb *, int)) = tcp_notify; - - if (cmd == PRC_QUENCH) - notify = tcp_quench; -#if 1 - else if (cmd == PRC_MSGSIZE) - notify = tcp_mtudisc; -#endif - else if (!PRC_IS_REDIRECT(cmd) && - ((unsigned)cmd > PRC_NCMDS || inetctlerrmap[cmd] == 0)) - return; - if (ip) { - th = (struct tcphdr *)((caddr_t)ip + (ip->ip_hl << 2)); - in_pcbnotify(&tcb, sa, th->th_dport, ip->ip_src, th->th_sport, - cmd, notify); - } else - in_pcbnotify(&tcb, sa, 0, zeroin_addr, 0, cmd, notify); -} - -/* - * When a source quench is received, close congestion window - * to one segment. We will gradually open it again as we proceed. - */ -void -tcp_quench(inp, errno) - struct inpcb *inp; - int errno; -{ - struct tcpcb *tp = intotcpcb(inp); - - if (tp) - tp->snd_cwnd = tp->t_maxseg; -} - -#if 1 -/* - * When `need fragmentation' ICMP is received, update our idea of the MSS - * based on the new value in the route. Also nudge TCP to send something, - * since we know the packet we just sent was dropped. - * This duplicates some code in the tcp_mss() function in tcp_input.c. - */ -void -tcp_mtudisc(inp, errno) - struct inpcb *inp; - int errno; -{ - struct tcpcb *tp = intotcpcb(inp); - struct rtentry *rt; - struct rmxp_tao *taop; - struct socket *so = inp->inp_socket; - int offered; - int mss; - - if (tp) { - rt = tcp_rtlookup(inp); - if (!rt || !rt->rt_rmx.rmx_mtu) { - tp->t_maxopd = tp->t_maxseg = tcp_mssdflt; - return; - } - taop = rmx_taop(rt->rt_rmx); - offered = taop->tao_mssopt; - mss = rt->rt_rmx.rmx_mtu - sizeof(struct tcpiphdr); - if (offered) - mss = min(mss, offered); - /* - * XXX - The above conditional probably violates the TCP - * spec. The problem is that, since we don't know the - * other end's MSS, we are supposed to use a conservative - * default. But, if we do that, then MTU discovery will - * never actually take place, because the conservative - * default is much less than the MTUs typically seen - * on the Internet today. For the moment, we'll sweep - * this under the carpet. - * - * The conservative default might not actually be a problem - * if the only case this occurs is when sending an initial - * SYN with options and data to a host we've never talked - * to before. Then, they will reply with an MSS value which - * will get recorded and the new parameters should get - * recomputed. For Further Study. - */ - if (tp->t_maxopd <= mss) - return; - tp->t_maxopd = mss; - - if ((tp->t_flags & (TF_REQ_TSTMP|TF_NOOPT)) == TF_REQ_TSTMP && - (tp->t_flags & TF_RCVD_TSTMP) == TF_RCVD_TSTMP) - mss -= TCPOLEN_TSTAMP_APPA; - if ((tp->t_flags & (TF_REQ_CC|TF_NOOPT)) == TF_REQ_CC && - (tp->t_flags & TF_RCVD_CC) == TF_RCVD_CC) - mss -= TCPOLEN_CC_APPA; -#if (MCLBYTES & (MCLBYTES - 1)) == 0 - if (mss > MCLBYTES) - mss &= ~(MCLBYTES-1); -#else - if (mss > MCLBYTES) - mss = mss / MCLBYTES * MCLBYTES; -#endif - if (so->so_snd.sb_hiwat < mss) - mss = so->so_snd.sb_hiwat; - - tp->t_maxseg = mss; - - tcpstat.tcps_mturesent++; - tp->t_rtt = 0; - tp->snd_nxt = tp->snd_una; - tcp_output(tp); - } -} -#endif - -/* - * Look-up the routing entry to the peer of this inpcb. If no route - * is found and it cannot be allocated the return NULL. This routine - * is called by TCP routines that access the rmx structure and by tcp_mss - * to get the interface MTU. - */ -struct rtentry * -tcp_rtlookup(inp) - struct inpcb *inp; -{ - struct route *ro; - struct rtentry *rt; - - ro = &inp->inp_route; - rt = &ro->ro_rt; - if (!(rt->rt_flags & RTF_UP)) { - /* No route yet, so try to acquire one */ - if (inp->inp_faddr.s_addr != INADDR_ANY) { - ro->ro_dst.sa_family = AF_INET; - /* ro->ro_dst.sa_len = sizeof(ro->ro_dst); */ - ((struct sockaddr_in *) &ro->ro_dst)->sin_addr = - inp->inp_faddr; - rt = &ro->ro_rt; - } - } - return rt; -} - -/* - * Return a pointer to the cached information about the remote host. - * The cached information is stored in the protocol specific part of - * the route metrics. - */ -struct rmxp_tao * -tcp_gettaocache(inp) - struct inpcb *inp; -{ - struct rtentry *rt = tcp_rtlookup(inp); - - /* Make sure this is a host route and is up. */ - if (rt == NULL || - (rt->rt_flags & (RTF_UP|RTF_HOST)) != (RTF_UP|RTF_HOST)) - return NULL; - - return rmx_taop(rt->rt_rmx); -} - -/* - * Clear all the TAO cache entries, called from tcp_init. - * - * XXX - * This routine is just an empty one, because we assume that the routing - * routing tables are initialized at the same time when TCP, so there is - * nothing in the cache left over. - */ -static void -tcp_cleartaocache(void) -{ } diff --git a/reactos/lib/oskittcp/oskittcp/tcp_timer.c b/reactos/lib/oskittcp/oskittcp/tcp_timer.c deleted file mode 100644 index dd2ff8d276c..00000000000 --- a/reactos/lib/oskittcp/oskittcp/tcp_timer.c +++ /dev/null @@ -1,358 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1988, 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)tcp_timer.c 8.1 (Berkeley) 6/10/93 - */ - -#ifndef TUBA_INCLUDE -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/malloc.h> -#include <sys/mbuf.h> -#include <sys/socket.h> -#include <sys/socketvar.h> -#include <sys/protosw.h> -#include <sys/errno.h> -#include <sys/queue.h> - -#include <net/if.h> -#include <net/route.h> - -#include <netinet/in.h> -#include <netinet/in_systm.h> -#include <netinet/ip.h> -#include <netinet/in_pcb.h> -#include <netinet/ip_var.h> -#include <netinet/tcp.h> -#include <netinet/tcp_fsm.h> -#include <netinet/tcp_seq.h> -#include <netinet/tcp_timer.h> -#include <netinet/tcp_var.h> -#include <netinet/tcpip.h> -#ifdef TCPDEBUG -#include <netinet/tcp_debug.h> -#endif - -int tcp_keepidle = TCPTV_KEEP_IDLE; -int tcp_keepintvl = TCPTV_KEEPINTVL; -int tcp_keepinit = TCPTV_KEEP_INIT; -int tcp_maxidle; -int tcp_maxpersistidle = TCPTV_KEEP_IDLE; -int tcp_totbackoff = 511; -#endif /* TUBA_INCLUDE */ -/* - * Fast timeout routine for processing delayed acks - */ -void -tcp_fasttimo() -{ - register struct inpcb *inp; - register struct tcpcb *tp; - int s; - - s = splnet(); - - for (inp = tcb.lh_first; inp != NULL; inp = inp->inp_list.le_next) { - if ((tp = (struct tcpcb *)inp->inp_ppcb) && - (tp->t_flags & TF_DELACK)) { - tp->t_flags &= ~TF_DELACK; - tp->t_flags |= TF_ACKNOW; - tcpstat.tcps_delack++; - (void) tcp_output(tp); - } - } - splx(s); -} - -/* - * Tcp protocol timeout routine called every 500 ms. - * Updates the timers in all active tcb's and - * causes finite state machine actions if timers expire. - */ -void -tcp_slowtimo() -{ - register struct inpcb *ip, *ipnxt; - register struct tcpcb *tp; - register int i; - int s; -#ifdef TCPDEBUG - int ostate; -#endif - - s = splnet(); - - tcp_maxidle = TCPTV_KEEPCNT * tcp_keepintvl; - - ip = tcb.lh_first; - if (ip == NULL) { - splx(s); - return; - } - /* - * Search through tcb's and update active timers. - */ - for (; ip != NULL; ip = ipnxt) { - ipnxt = ip->inp_list.le_next; - tp = intotcpcb(ip); - if (tp == 0) - continue; - for (i = 0; i < TCPT_NTIMERS; i++) { - if (tp->t_timer[i] && --tp->t_timer[i] == 0) { -#ifdef TCPDEBUG - ostate = tp->t_state; -#endif - tp = tcp_timers(tp, i); - if (tp == NULL) - goto tpgone; -#ifdef TCPDEBUG - if (tp->t_inpcb->inp_socket->so_options - & SO_DEBUG) - tcp_trace(TA_USER, ostate, tp, - (struct tcpiphdr *)0, - PRU_SLOWTIMO); -#endif - } - } - tp->t_idle++; - tp->t_duration++; - if (tp->t_rtt) - tp->t_rtt++; -tpgone: - ; - } - tcp_iss += TCP_ISSINCR/PR_SLOWHZ; /* increment iss */ -#ifdef TCP_COMPAT_42 - if ((int)tcp_iss < 0) - tcp_iss = 0; /* XXX */ -#endif - tcp_now++; /* for timestamps */ - splx(s); -} -#ifndef TUBA_INCLUDE - -/* - * Cancel all timers for TCP tp. - */ -void -tcp_canceltimers(tp) - struct tcpcb *tp; -{ - register int i; - - for (i = 0; i < TCPT_NTIMERS; i++) - tp->t_timer[i] = 0; -} - -int tcp_backoff[TCP_MAXRXTSHIFT + 1] = - { 1, 2, 4, 8, 16, 32, 64, 64, 64, 64, 64, 64, 64 }; - -/* - * TCP timer processing. - */ -struct tcpcb * -tcp_timers(tp, timer) - register struct tcpcb *tp; - int timer; -{ - register int rexmt; - - switch (timer) { - - /* - * 2 MSL timeout in shutdown went off. If we're closed but - * still waiting for peer to close and connection has been idle - * too long, or if 2MSL time is up from TIME_WAIT, delete connection - * control block. Otherwise, check again in a bit. - */ - case TCPT_2MSL: - if (tp->t_state != TCPS_TIME_WAIT && - tp->t_idle <= tcp_maxidle) - tp->t_timer[TCPT_2MSL] = tcp_keepintvl; - else - tp = tcp_close(tp); - break; - - /* - * Retransmission timer went off. Message has not - * been acked within retransmit interval. Back off - * to a longer retransmit interval and retransmit one segment. - */ - case TCPT_REXMT: - if (++tp->t_rxtshift > TCP_MAXRXTSHIFT) { - tp->t_rxtshift = TCP_MAXRXTSHIFT; - tcpstat.tcps_timeoutdrop++; - tp = tcp_drop(tp, tp->t_softerror ? - tp->t_softerror : ETIMEDOUT); - break; - } - tcpstat.tcps_rexmttimeo++; - rexmt = TCP_REXMTVAL(tp) * tcp_backoff[tp->t_rxtshift]; - TCPT_RANGESET(tp->t_rxtcur, rexmt, - tp->t_rttmin, TCPTV_REXMTMAX); - tp->t_timer[TCPT_REXMT] = tp->t_rxtcur; - /* - * If losing, let the lower level know and try for - * a better route. Also, if we backed off this far, - * our srtt estimate is probably bogus. Clobber it - * so we'll take the next rtt measurement as our srtt; - * move the current srtt into rttvar to keep the current - * retransmit times until then. - */ - if (tp->t_rxtshift > TCP_MAXRXTSHIFT / 4) { - in_losing(tp->t_inpcb); - tp->t_rttvar += (tp->t_srtt >> TCP_RTT_SHIFT); - tp->t_srtt = 0; - } - tp->snd_nxt = tp->snd_una; - /* - * Force a segment to be sent. - */ - tp->t_flags |= TF_ACKNOW; - /* - * If timing a segment in this window, stop the timer. - */ - tp->t_rtt = 0; - /* - * Close the congestion window down to one segment - * (we'll open it by one segment for each ack we get). - * Since we probably have a window's worth of unacked - * data accumulated, this "slow start" keeps us from - * dumping all that data as back-to-back packets (which - * might overwhelm an intermediate gateway). - * - * There are two phases to the opening: Initially we - * open by one mss on each ack. This makes the window - * size increase exponentially with time. If the - * window is larger than the path can handle, this - * exponential growth results in dropped packet(s) - * almost immediately. To get more time between - * drops but still "push" the network to take advantage - * of improving conditions, we switch from exponential - * to linear window opening at some threshhold size. - * For a threshhold, we use half the current window - * size, truncated to a multiple of the mss. - * - * (the minimum cwnd that will give us exponential - * growth is 2 mss. We don't allow the threshhold - * to go below this.) - */ - { - u_int win = min(tp->snd_wnd, tp->snd_cwnd) / 2 / tp->t_maxseg; - if (win < 2) - win = 2; - tp->snd_cwnd = tp->t_maxseg; - tp->snd_ssthresh = win * tp->t_maxseg; - tp->t_dupacks = 0; - } - (void) tcp_output(tp); - break; - - /* - * Persistance timer into zero window. - * Force a byte to be output, if possible. - */ - case TCPT_PERSIST: - tcpstat.tcps_persisttimeo++; - /* - * Hack: if the peer is dead/unreachable, we do not - * time out if the window is closed. After a full - * backoff, drop the connection if the idle time - * (no responses to probes) reaches the maximum - * backoff that we would use if retransmitting. - */ - if (tp->t_rxtshift == TCP_MAXRXTSHIFT) { - u_long maxidle = TCP_REXMTVAL(tp); - if (maxidle < tp->t_rttmin) - maxidle = tp->t_rttmin; - maxidle *= tcp_totbackoff; - if (tp->t_idle >= tcp_maxpersistidle || - tp->t_idle >= maxidle) { - tcpstat.tcps_persistdrop++; - tp = tcp_drop(tp, ETIMEDOUT); - break; - } - } - tcp_setpersist(tp); - tp->t_force = 1; - (void) tcp_output(tp); - tp->t_force = 0; - break; - - /* - * Keep-alive timer went off; send something - * or drop connection if idle for too long. - */ - case TCPT_KEEP: - tcpstat.tcps_keeptimeo++; - if (tp->t_state < TCPS_ESTABLISHED) - goto dropit; - if (tp->t_inpcb->inp_socket->so_options & SO_KEEPALIVE && - tp->t_state <= TCPS_CLOSING) { - if (tp->t_idle >= tcp_keepidle + tcp_maxidle) - goto dropit; - /* - * Send a packet designed to force a response - * if the peer is up and reachable: - * either an ACK if the connection is still alive, - * or an RST if the peer has closed the connection - * due to timeout or reboot. - * Using sequence number tp->snd_una-1 - * causes the transmitted zero-length segment - * to lie outside the receive window; - * by the protocol spec, this requires the - * correspondent TCP to respond. - */ - tcpstat.tcps_keepprobe++; -#ifdef TCP_COMPAT_42 - /* - * The keepalive packet must have nonzero length - * to get a 4.2 host to respond. - */ - tcp_respond(tp, tp->t_template, (struct mbuf *)NULL, - tp->rcv_nxt - 1, tp->snd_una - 1, 0); -#else - tcp_respond(tp, tp->t_template, (struct mbuf *)NULL, - tp->rcv_nxt, tp->snd_una - 1, 0); -#endif - tp->t_timer[TCPT_KEEP] = tcp_keepintvl; - } else - tp->t_timer[TCPT_KEEP] = tcp_keepidle; - break; - dropit: - tcpstat.tcps_keepdrops++; - tp = tcp_drop(tp, ETIMEDOUT); - break; - } - return (tp); -} -#endif /* TUBA_INCLUDE */ diff --git a/reactos/lib/oskittcp/oskittcp/tcp_usrreq.c b/reactos/lib/oskittcp/oskittcp/tcp_usrreq.c deleted file mode 100644 index ac61c4eb609..00000000000 --- a/reactos/lib/oskittcp/oskittcp/tcp_usrreq.c +++ /dev/null @@ -1,773 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * From: @(#)tcp_usrreq.c 8.2 (Berkeley) 1/3/94 - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/malloc.h> -#include <sys/mbuf.h> -#include <sys/socket.h> -#include <sys/socketvar.h> -#include <sys/protosw.h> -#include <sys/errno.h> -#include <sys/stat.h> -#include <vm/vm.h> -#include <sys/sysctl.h> - -#include <net/if.h> -#include <net/route.h> - -#include <netinet/in.h> -#include <netinet/in_systm.h> -#include <netinet/ip.h> -#include <netinet/in_pcb.h> -#include <netinet/in_var.h> -#include <netinet/ip_var.h> -#include <netinet/tcp.h> -#include <netinet/tcp_fsm.h> -#include <netinet/tcp_seq.h> -#include <netinet/tcp_timer.h> -#include <netinet/tcp_var.h> -#include <netinet/tcpip.h> -#ifdef TCPDEBUG -#include <netinet/tcp_debug.h> -#endif - -/* - * TCP protocol interface to socket abstraction. - */ -extern char *tcpstates[]; - -/* - * Process a TCP user request for TCP tb. If this is a send request - * then m is the mbuf chain of send data. If this is a timer expiration - * (called from the software clock routine), then timertype tells which timer. - */ -/*ARGSUSED*/ -int -tcp_usrreq(so, req, m, nam, control) - struct socket *so; - int req; - struct mbuf *m, *nam, *control; -{ - register struct inpcb *inp; - register struct tcpcb *tp = 0; - struct sockaddr_in *sinp; - int s; - int error = 0; - - if (req == PRU_CONTROL) - return (in_control(so, (u_long)m, (caddr_t)nam, - (struct ifnet *)control)); - if (control && control->m_len) { - m_freem(control); - if (m) - m_freem(m); - return (EINVAL); - } - - s = splnet(); - inp = sotoinpcb(so); - - /* - * When a TCP is attached to a socket, then there will be - * a (struct inpcb) pointed at by the socket, and this - * structure will point at a subsidary (struct tcpcb). - */ - if (inp == 0 && req != PRU_ATTACH) { - splx(s); - /* safer version of fix for mbuf leak */ - if (m && (req == PRU_SEND || req == PRU_SENDOOB)) - m_freem(m); - } - - if( inp ) - tp = intotcpcb(inp); - - switch (req) { - /* - * TCP attaches to socket via PRU_ATTACH, reserving space, - * and an internet control block. - */ - case PRU_ATTACH: - if (inp) { - error = EISCONN; - break; - } - error = tcp_attach(so); - if (error) - break; - if ((so->so_options & SO_LINGER) && so->so_linger == 0) - so->so_linger = TCP_LINGERTIME * hz; - tp = sototcpcb(so); - break; - - /* - * PRU_DETACH detaches the TCP protocol from the socket. - * If the protocol state is non-embryonic, then can't - * do this directly: have to initiate a PRU_DISCONNECT, - * which may finish later; embryonic TCB's can just - * be discarded here. - */ - case PRU_DETACH: - if (tp->t_state > TCPS_LISTEN) - tp = tcp_disconnect(tp); - else - tp = tcp_close(tp); - break; - - /* - * Give the socket an address. - */ - case PRU_BIND: - /* - * Must check for multicast addresses and disallow binding - * to them. - */ - sinp = mtod(nam, struct sockaddr_in *); - error = in_pcbbind(inp, nam); - if (error) - break; - break; - - /* - * Prepare to accept connections. - */ - case PRU_LISTEN: - if (inp->inp_lport == 0) - error = in_pcbbind(inp, NULL); - if (error == 0) - tp->t_state = TCPS_LISTEN; - break; - - /* - * Initiate connection to peer. - * Create a template for use in transmissions on this connection. - * Enter SYN_SENT state, and mark socket as connecting. - * Start keep-alive timer, and seed output sequence space. - * Send initial segment on connection. - */ - case PRU_CONNECT: - /* - * Must disallow TCP ``connections'' to multicast addresses. - */ - sinp = mtod(nam, struct sockaddr_in *); - if ((error = tcp_connect(tp, nam)) != 0) { - OS_DbgPrint(OSK_MID_TRACE,("TC: %d\n", error)); - break; - } - error = tcp_output(tp); - OS_DbgPrint(OSK_MID_TRACE,("TO: %d\n", error)); - break; - - /* - * Create a TCP connection between two sockets. - */ - case PRU_CONNECT2: - error = EOPNOTSUPP; - break; - - /* - * Initiate disconnect from peer. - * If connection never passed embryonic stage, just drop; - * else if don't need to let data drain, then can just drop anyways, - * else have to begin TCP shutdown process: mark socket disconnecting, - * drain unread data, state switch to reflect user close, and - * send segment (e.g. FIN) to peer. Socket will be really disconnected - * when peer sends FIN and acks ours. - * - * SHOULD IMPLEMENT LATER PRU_CONNECT VIA REALLOC TCPCB. - */ - case PRU_DISCONNECT: - tp = tcp_disconnect(tp); - break; - - /* - * Accept a connection. Essentially all the work is - * done at higher levels; just return the address - * of the peer, storing through addr. - */ - case PRU_ACCEPT: - in_setpeeraddr(inp, nam); - break; - - /* - * Mark the connection as being incapable of further output. - */ - case PRU_SHUTDOWN: - socantsendmore(so); - tp = tcp_usrclosed(tp); - if (tp) - error = tcp_output(tp); - break; - - /* - * After a receive, possibly send window update to peer. - */ - case PRU_RCVD: - (void) tcp_output(tp); - break; - - /* - * Do a send by putting data in output queue and updating urgent - * marker if URG set. Possibly send more data. - */ - case PRU_SEND_EOF: - case PRU_SEND: - sbappend(so, &so->so_snd, m); - if (nam && tp->t_state < TCPS_SYN_SENT) { - /* - * Do implied connect if not yet connected, - * initialize window to default value, and - * initialize maxseg/maxopd using peer's cached - * MSS. - */ - error = tcp_connect(tp, nam); - if (error) - break; - tp->snd_wnd = TTCP_CLIENT_SND_WND; - tcp_mss(tp, -1); - } - - if (req == PRU_SEND_EOF) { - /* - * Close the send side of the connection after - * the data is sent. - */ - socantsendmore(so); - tp = tcp_usrclosed(tp); - } - if (tp != NULL) - error = tcp_output(tp); - break; - - /* - * Abort the TCP. - */ - case PRU_ABORT: - tp = tcp_drop(tp, ECONNABORTED); - break; - - case PRU_SENSE: - ((struct stat *) m)->st_blksize = so->so_snd.sb_hiwat; - (void) splx(s); - return (0); - - case PRU_RCVOOB: - if ((so->so_oobmark == 0 && - (so->so_state & SS_RCVATMARK) == 0) || - so->so_options & SO_OOBINLINE || - tp->t_oobflags & TCPOOB_HADDATA) { - error = EINVAL; - break; - } - if ((tp->t_oobflags & TCPOOB_HAVEDATA) == 0) { - error = EWOULDBLOCK; - break; - } - m->m_len = 1; - *mtod(m, caddr_t) = tp->t_iobc; - if (((int)nam & MSG_PEEK) == 0) - tp->t_oobflags ^= (TCPOOB_HAVEDATA | TCPOOB_HADDATA); - break; - - case PRU_SENDOOB: - if (sbspace(&so->so_snd) < -512) { - m_freem(m); - error = ENOBUFS; - break; - } - /* - * According to RFC961 (Assigned Protocols), - * the urgent pointer points to the last octet - * of urgent data. We continue, however, - * to consider it to indicate the first octet - * of data past the urgent section. - * Otherwise, snd_up should be one lower. - */ - sbappend(so, &so->so_snd, m); - if (nam && tp->t_state < TCPS_SYN_SENT) { - /* - * Do implied connect if not yet connected, - * initialize window to default value, and - * initialize maxseg/maxopd using peer's cached - * MSS. - */ - error = tcp_connect(tp, nam); - if (error) - break; - tp->snd_wnd = TTCP_CLIENT_SND_WND; - tcp_mss(tp, -1); - } - tp->snd_up = tp->snd_una + so->so_snd.sb_cc; - tp->t_force = 1; - error = tcp_output(tp); - tp->t_force = 0; - break; - - case PRU_SOCKADDR: - in_setsockaddr(inp, nam); - break; - - case PRU_PEERADDR: - in_setpeeraddr(inp, nam); - break; - - /* - * TCP slow timer went off; going through this - * routine for tracing's sake. - */ - case PRU_SLOWTIMO: - tp = tcp_timers(tp, (int)nam); -#ifdef TCPDEBUG - req |= (int)nam << 8; /* for debug's sake */ -#endif - break; - - default: - panic("tcp_usrreq"); - } -#ifdef TCPDEBUG - if (tp && (so->so_options & SO_DEBUG)) - tcp_trace(TA_USER, ostate, tp, (struct tcpiphdr *)0, req); -#endif - splx(s); - return (error); -} - -/* - * Common subroutine to open a TCP connection to remote host specified - * by struct sockaddr_in in mbuf *nam. Call in_pcbbind to assign a local - * port number if needed. Call in_pcbladdr to do the routing and to choose - * a local host address (interface). If there is an existing incarnation - * of the same connection in TIME-WAIT state and if the remote host was - * sending CC options and if the connection duration was < MSL, then - * truncate the previous TIME-WAIT state and proceed. - * Initialize connection parameters and enter SYN-SENT state. - */ -int -tcp_connect(tp, nam) - register struct tcpcb *tp; - struct mbuf *nam; -{ - struct inpcb *inp/* = tp->t_inpcb */, *oinp; - struct socket *so; - struct tcpcb *otp; - struct sockaddr_in *sin = mtod(nam, struct sockaddr_in *); - struct sockaddr_in ifaddr; - int error; - struct rmxp_tao *taop; - struct rmxp_tao tao_noncached; - - if( !tp ) - panic( "No tcpcb provided.\n" ); - - if( !tp->t_inpcb ) - panic( "No inpcb provided.\n" ); - - inp = tp->t_inpcb; - - if( !inp->inp_socket ) - panic( "No socket provided.\n" ); - - so = inp->inp_socket; - - if (inp->inp_lport == 0) { - error = in_pcbbind(inp, NULL); - if (error) { - OS_DbgPrint(OSK_MID_TRACE,("error %d\n", error)); - return error; - } - } - /* - * Cannot simply call in_pcbconnect, because there might be an - * earlier incarnation of this same connection still in - * TIME_WAIT state, creating an ADDRINUSE error. - */ - error = in_pcbladdr(inp, nam, &ifaddr); - - if (error) { - OS_DbgPrint(OSK_MID_TRACE,("error %d\n", error)); - return error; - } - - oinp = in_pcblookup(inp->inp_pcbinfo->listhead, - sin->sin_addr, sin->sin_port, - inp->inp_laddr.s_addr != INADDR_ANY ? inp->inp_laddr - : ifaddr.sin_addr, - inp->inp_lport, 0); - - if (oinp) { - - if (oinp != inp && (otp = intotcpcb(oinp)) != NULL && - otp->t_state == TCPS_TIME_WAIT && - otp->t_duration < TCPTV_MSL && - (otp->t_flags & TF_RCVD_CC)) - otp = tcp_close(otp); - else { - - OS_DbgPrint(OSK_MID_TRACE,("error EADDRINUSE\n")); - return EADDRINUSE; - } - - } - - if (inp->inp_laddr.s_addr == INADDR_ANY) - inp->inp_laddr = ifaddr.sin_addr; - - inp->inp_faddr = sin->sin_addr; - inp->inp_fport = sin->sin_port; - - in_pcbrehash(inp); - - - tp->t_template = tcp_template(tp); - - if (tp->t_template == 0) { - in_pcbdisconnect(inp); - OS_DbgPrint(OSK_MID_TRACE,("error ENOBUFS\n")); - return ENOBUFS; - } - - - /* Compute window scaling to request. */ - while (tp->request_r_scale < TCP_MAX_WINSHIFT && - (TCP_MAXWIN << tp->request_r_scale) < so->so_rcv.sb_hiwat) - tp->request_r_scale++; - - - soisconnecting(so); - - tcpstat.tcps_connattempt++; - tp->t_state = TCPS_SYN_SENT; - tp->t_timer[TCPT_KEEP] = tcp_keepinit; - tp->rcv_nxt = 0; - tp->iss = tcp_iss; tcp_iss += TCP_ISSINCR/2; - - tcp_sendseqinit(tp); - - - /* - * Generate a CC value for this connection and - * check whether CC or CCnew should be used. - */ - if ((taop = tcp_gettaocache(tp->t_inpcb)) == NULL) { - taop = &tao_noncached; - bzero(taop, sizeof(*taop)); - } - - tp->cc_send = CC_INC(tcp_ccgen); - if (taop->tao_ccsent != 0 && - CC_GEQ(tp->cc_send, taop->tao_ccsent)) { - taop->tao_ccsent = tp->cc_send; - } else { - taop->tao_ccsent = 0; - tp->t_flags |= TF_SENDCCNEW; - } - - return 0; -} - -int -tcp_ctloutput(op, so, level, optname, mp) - int op; - struct socket *so; - int level, optname; - struct mbuf **mp; -{ - int error = 0, s; - struct inpcb *inp; - register struct tcpcb *tp; - register struct mbuf *m; - register int i; - - s = splnet(); - inp = sotoinpcb(so); - if (inp == NULL) { - splx(s); - if (op == PRCO_SETOPT && *mp) - (void) m_free(*mp); - return (ECONNRESET); - } - if (level != IPPROTO_TCP) { - error = ip_ctloutput(op, so, level, optname, mp); - splx(s); - return (error); - } - tp = intotcpcb(inp); - - switch (op) { - - case PRCO_SETOPT: - m = *mp; - switch (optname) { - - case TCP_NODELAY: - if (m == NULL || m->m_len < sizeof (int)) - error = EINVAL; - else if (*mtod(m, int *)) - tp->t_flags |= TF_NODELAY; - else - tp->t_flags &= ~TF_NODELAY; - break; - - case TCP_MAXSEG: - if (m && (i = *mtod(m, int *)) > 0 && i <= tp->t_maxseg) - tp->t_maxseg = i; - else - error = EINVAL; - break; - - case TCP_NOOPT: - if (m == NULL || m->m_len < sizeof (int)) - error = EINVAL; - else if (*mtod(m, int *)) - tp->t_flags |= TF_NOOPT; - else - tp->t_flags &= ~TF_NOOPT; - break; - - case TCP_NOPUSH: - if (m == NULL || m->m_len < sizeof (int)) - error = EINVAL; - else if (*mtod(m, int *)) - tp->t_flags |= TF_NOPUSH; - else - tp->t_flags &= ~TF_NOPUSH; - break; - - default: - error = ENOPROTOOPT; - break; - } - if (m) - (void) m_free(m); - break; - - case PRCO_GETOPT: - *mp = m = m_get(M_WAIT, MT_SOOPTS); - m->m_len = sizeof(int); - - switch (optname) { - case TCP_NODELAY: - *mtod(m, int *) = tp->t_flags & TF_NODELAY; - break; - case TCP_MAXSEG: - *mtod(m, int *) = tp->t_maxseg; - break; - case TCP_NOOPT: - *mtod(m, int *) = tp->t_flags & TF_NOOPT; - break; - case TCP_NOPUSH: - *mtod(m, int *) = tp->t_flags & TF_NOPUSH; - break; - default: - error = ENOPROTOOPT; - break; - } - break; - } - splx(s); - return (error); -} - -/* - * tcp_sendspace and tcp_recvspace are the default send and receive window - * sizes, respectively. These are obsolescent (this information should - * be set by the route). - */ -u_long tcp_sendspace = 1024*16; -u_long tcp_recvspace = 1024*16; - -/* - * Attach TCP protocol to socket, allocating - * internet protocol control block, tcp control block, - * bufer space, and entering LISTEN state if to accept connections. - */ -int -tcp_attach(so) - struct socket *so; -{ - register struct tcpcb *tp; - struct inpcb *inp; - int error; - - if (so->so_snd.sb_hiwat == 0 || so->so_rcv.sb_hiwat == 0) { - error = soreserve(so, tcp_sendspace, tcp_recvspace); - if (error) - return (error); - } - error = in_pcballoc(so, &tcbinfo); - if (error) - return (error); - inp = sotoinpcb(so); - tp = tcp_newtcpcb(inp); - if (tp == 0) { - int nofd = so->so_state & SS_NOFDREF; /* XXX */ - - so->so_state &= ~SS_NOFDREF; /* don't free the socket yet */ - in_pcbdetach(inp); - so->so_state |= nofd; - OS_DbgPrint(OSK_MID_TRACE,("ENOBUFS: no tcpcb allocated\n")); - return (ENOBUFS); - } - tp->t_state = TCPS_CLOSED; - return (0); -} - -/* - * Initiate (or continue) disconnect. - * If embryonic state, just send reset (once). - * If in ``let data drain'' option and linger null, just drop. - * Otherwise (hard), mark socket disconnecting and drop - * current input data; switch states based on user close, and - * send segment to peer (with FIN). - */ -struct tcpcb * -tcp_disconnect(tp) - register struct tcpcb *tp; -{ - struct socket *so = tp->t_inpcb->inp_socket; - - if (tp->t_state < TCPS_ESTABLISHED) - tp = tcp_close(tp); - else if ((so->so_options & SO_LINGER) && so->so_linger == 0) - tp = tcp_drop(tp, 0); - else { - soisdisconnecting(so); - sbflush(&so->so_rcv); - tp = tcp_usrclosed(tp); - if (tp) - (void) tcp_output(tp); - } - return (tp); -} - -/* - * User issued close, and wish to trail through shutdown states: - * if never received SYN, just forget it. If got a SYN from peer, - * but haven't sent FIN, then go to FIN_WAIT_1 state to send peer a FIN. - * If already got a FIN from peer, then almost done; go to LAST_ACK - * state. In all other cases, have already sent FIN to peer (e.g. - * after PRU_SHUTDOWN), and just have to play tedious game waiting - * for peer to send FIN or not respond to keep-alives, etc. - * We can let the user exit from the close as soon as the FIN is acked. - */ -struct tcpcb * -tcp_usrclosed(tp) - register struct tcpcb *tp; -{ - - switch (tp->t_state) { - - case TCPS_CLOSED: - case TCPS_LISTEN: - tp->t_state = TCPS_CLOSED; - tp = tcp_close(tp); - break; - - case TCPS_SYN_SENT: - case TCPS_SYN_RECEIVED: - tp->t_flags |= TF_NEEDFIN; - break; - - case TCPS_ESTABLISHED: - tp->t_state = TCPS_FIN_WAIT_1; - break; - - case TCPS_CLOSE_WAIT: - tp->t_state = TCPS_LAST_ACK; - break; - } - if (tp && tp->t_state >= TCPS_FIN_WAIT_2) { - soisdisconnected(tp->t_inpcb->inp_socket); - /* To prevent the connection hanging in FIN_WAIT_2 forever. */ - if (tp->t_state == TCPS_FIN_WAIT_2) - tp->t_timer[TCPT_2MSL] = tcp_maxidle; - } - return (tp); -} - -/* - * Sysctl for tcp variables. - */ -int -tcp_sysctl(name, namelen, oldp, oldlenp, newp, newlen) - int *name; - u_int namelen; - void *oldp; - size_t *oldlenp; - void *newp; - size_t newlen; -{ - /* All sysctl names at this level are terminal. */ - if (namelen != 1) - return (ENOTDIR); - - switch (name[0]) { - case TCPCTL_DO_RFC1323: - return (sysctl_int(oldp, oldlenp, newp, newlen, - &tcp_do_rfc1323)); - case TCPCTL_DO_RFC1644: - return (sysctl_int(oldp, oldlenp, newp, newlen, - &tcp_do_rfc1644)); - case TCPCTL_MSSDFLT: - return (sysctl_int(oldp, oldlenp, newp, newlen, - &tcp_mssdflt)); - case TCPCTL_STATS: - return (sysctl_rdstruct(oldp, oldlenp, newp, &tcpstat, - sizeof tcpstat)); - case TCPCTL_RTTDFLT: - return (sysctl_int(oldp, oldlenp, newp, newlen, &tcp_rttdflt)); - case TCPCTL_KEEPIDLE: - return (sysctl_int(oldp, oldlenp, newp, newlen, - &tcp_keepidle)); - case TCPCTL_KEEPINTVL: - return (sysctl_int(oldp, oldlenp, newp, newlen, - &tcp_keepintvl)); - case TCPCTL_SENDSPACE: - return (sysctl_int(oldp, oldlenp, newp, newlen, - (int *)&tcp_sendspace)); /* XXX */ - case TCPCTL_RECVSPACE: - return (sysctl_int(oldp, oldlenp, newp, newlen, - (int *)&tcp_recvspace)); /* XXX */ - case TCPCTL_KEEPINIT: - return (sysctl_int(oldp, oldlenp, newp, newlen, - &tcp_keepinit)); - default: - return (ENOPROTOOPT); - } - /* NOTREACHED */ -} diff --git a/reactos/lib/oskittcp/oskittcp/uipc_domain.c b/reactos/lib/oskittcp/oskittcp/uipc_domain.c deleted file mode 100644 index 08a1800eb41..00000000000 --- a/reactos/lib/oskittcp/oskittcp/uipc_domain.c +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)uipc_domain.c 8.2 (Berkeley) 10/18/93 - */ - -#include <sys/param.h> -#include <sys/socket.h> -#include <sys/protosw.h> -#include <sys/domain.h> -#include <sys/mbuf.h> -#include <sys/time.h> -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/proc.h> -#include <vm/vm.h> -#include <sys/sysctl.h> - -void pffasttimo __P((void *)); -void pfslowtimo __P((void *)); - -struct domain *domains; - -#define ADDDOMAIN(x) { \ - extern struct domain __CONCAT(x,domain); \ - __CONCAT(x,domain.dom_next) = domains; \ - domains = &__CONCAT(x,domain); \ -} - -extern struct linker_set domain_set; - -void -domaininit() -{ - register struct domain *dp, **dpp; - register struct protosw *pr; - - printf("domaininit starting\n"); - - /* - * NB - local domain is always present. - */ - ADDDOMAIN(local); - ADDDOMAIN(inet); - - for (dpp = (struct domain **)domain_set.ls_items; *dpp; dpp++) { - printf("(1) Domain %s counting\n", (**dpp).dom_name); - (**dpp).dom_next = domains; - domains = *dpp; - } - -/* - not in our sources -#ifdef ISDN - ADDDOMAIN(isdn); -#endif -*/ - for (dp = domains; dp; dp = dp->dom_next) { - printf("(1) Domain %s initializing\n", dp->dom_name); - if (dp->dom_init) - (*dp->dom_init)(); - for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) { - printf("Registering protocols for %s\n", dp->dom_name); - if (pr->pr_init) - (*pr->pr_init)(); - } - if( dp->dom_next && !dp->dom_next->dom_name ) - dp->dom_next = 0; - } - - if (max_linkhdr < 16) /* XXX */ - max_linkhdr = 16; - max_hdr = max_linkhdr + max_protohdr; - max_datalen = MHLEN - max_hdr; - timeout(pffasttimo, (void *)0, 1); - timeout(pfslowtimo, (void *)0, 1); - - printf("Domaininit done\n"); -} - -struct protosw * -pffindtype(family, type) - int family, type; -{ - register struct domain *dp; - register struct protosw *pr; - - for (dp = domains; dp; dp = dp->dom_next) - if (dp->dom_family == family) - goto found; - return (0); -found: - for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) - if (pr->pr_type && pr->pr_type == type) - return (pr); - return (0); -} - -struct protosw * -pffindproto(family, protocol, type) - int family, protocol, type; -{ - register struct domain *dp; - register struct protosw *pr; - struct protosw *maybe = 0; - - if (family == 0) - return (0); - for (dp = domains; dp; dp = dp->dom_next) - if (dp->dom_family == family) - goto found; - return (0); -found: - for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) { - if ((pr->pr_protocol == protocol) && (pr->pr_type == type)) - return (pr); - - if (type == SOCK_RAW && pr->pr_type == SOCK_RAW && - pr->pr_protocol == 0 && maybe == (struct protosw *)0) - maybe = pr; - } - return (maybe); -} - -int -net_sysctl(name, namelen, oldp, oldlenp, newp, newlen, p) - int *name; - u_int namelen; - void *oldp; - size_t *oldlenp; - void *newp; - size_t newlen; - struct proc *p; -{ - register struct domain *dp; - register struct protosw *pr; - int family, protocol; - - /* - * All sysctl names at this level are nonterminal; - * next two components are protocol family and protocol number, - * then at least one addition component. - */ - if (namelen < 3) - return (EISDIR); /* overloaded */ - family = name[0]; - protocol = name[1]; - - if (family == 0) - return (0); - for (dp = domains; dp; dp = dp->dom_next) - if (dp->dom_family == family) - goto found; - return (ENOPROTOOPT); -found: - for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) - if (pr->pr_protocol == protocol && pr->pr_sysctl) - return ((*pr->pr_sysctl)(name + 2, namelen - 2, - oldp, oldlenp, newp, newlen)); - return (ENOPROTOOPT); -} - -void -pfctlinput(cmd, sa) - int cmd; - struct sockaddr *sa; -{ - register struct domain *dp; - register struct protosw *pr; - - for (dp = domains; dp; dp = dp->dom_next) - for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) - if (pr->pr_ctlinput) - (*pr->pr_ctlinput)(cmd, sa, (caddr_t)0); -} - -void -pfslowtimo(arg) - void *arg; -{ - register struct domain *dp; - register struct protosw *pr; - - for (dp = domains; dp; dp = dp->dom_next) - for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) - if (pr->pr_slowtimo) - (*pr->pr_slowtimo)(); - timeout(pfslowtimo, (void *)0, hz/2); -} - -void -pffasttimo(arg) - void *arg; -{ - register struct domain *dp; - register struct protosw *pr; - - for (dp = domains; dp; dp = dp->dom_next) - for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) - if (pr->pr_fasttimo) - (*pr->pr_fasttimo)(); - timeout(pffasttimo, (void *)0, hz/5); -} diff --git a/reactos/lib/oskittcp/oskittcp/uipc_mbuf.c b/reactos/lib/oskittcp/oskittcp/uipc_mbuf.c deleted file mode 100644 index 222efa3739f..00000000000 --- a/reactos/lib/oskittcp/oskittcp/uipc_mbuf.c +++ /dev/null @@ -1,769 +0,0 @@ -/* - * Copyright (c) 1997-1998 University of Utah and the Flux Group. - * All rights reserved. - * - * This file is part of the Flux OSKit. The OSKit is free software, also known - * as "open source;" you can redistribute it and/or modify it under the terms - * of the GNU General Public License (GPL), version 2, as published by the Free - * Software Foundation (FSF). To explore alternate licensing terms, contact - * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. - * - * The OSKit 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 GPL for more details. You should have - * received a copy of the GPL along with the OSKit; see the file COPYING. If - * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. - */ -/* - * Copyright (c) 1982, 1986, 1988, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)uipc_mbuf.c 8.2 (Berkeley) 1/4/94 - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/proc.h> -#include <sys/malloc.h> -#define MBTYPES -#include <sys/mbuf.h> -#include <sys/kernel.h> -#include <sys/syslog.h> -#include <sys/domain.h> -#include <sys/protosw.h> - -#include <vm/vm.h> -#include <oskittcp.h> - -#ifndef OSKIT -extern vm_map_t mb_map; -struct mbuf *mbutl; -char *mclrefcnt; -int mb_map_full; - -void -mbinit() -{ - int s; - -#if CLBYTES < 4096 -#define NCL_INIT (4096/CLBYTES) -#else -#define NCL_INIT 1 -#endif - s = splimp(); - if (m_clalloc(NCL_INIT, M_DONTWAIT) == 0) - goto bad; - splx(s); - return; -bad: - panic("mbinit"); -} - -/* - * Allocate some number of mbuf clusters - * and place on cluster free list. - * Must be called at splimp. - */ -/* ARGSUSED */ -int -m_clalloc(ncl, nowait) - register int ncl; - int nowait; -{ - static int logged; - register caddr_t p; - register int i; - int npg; - - /* - * Once we run out of map space, it will be impossible - * to get any more (nothing is ever freed back to the - * map). - */ - if (mb_map_full) - return (0); - - npg = ncl * CLSIZE; - p = (caddr_t)kmem_malloc(mb_map, ctob(npg), - nowait ? M_NOWAIT : M_WAITOK); - /* - * Either the map is now full, or this is nowait and there - * are no pages left. - */ - if (p == NULL) - return (0); - - ncl = ncl * CLBYTES / MCLBYTES; - for (i = 0; i < ncl; i++) { - ((union mcluster *)p)->mcl_next = mclfree; - mclfree = (union mcluster *)p; - p += MCLBYTES; - mbstat.m_clfree++; - } - mbstat.m_clusters += ncl; - return (1); -} -#endif /* !OSKIT */ - -/* - * When MGET failes, ask protocols to free space when short of memory, - * then re-attempt to allocate an mbuf. - */ -struct mbuf * -m_retry(i, t) - int i, t; -{ - register struct mbuf *m; - - m_reclaim(); -/* - * I'm getting rid of the utterly ugly redefinition of m_retry - * - same for m_retryhdr below - */ - MGET_DONT_RECURSE(m, i, t); - if (m != NULL) - mbstat.m_wait++; - else - mbstat.m_drops++; - return (m); -} - -/* - * As above; retry an MGETHDR. - */ -struct mbuf * -m_retryhdr(i, t) - int i, t; -{ - register struct mbuf *m; - - m_reclaim(); - MGETHDR_DONT_RECURSE(m, i, t); - if (m != NULL) - mbstat.m_wait++; - else - mbstat.m_drops++; - return (m); -} - -void -m_reclaim() -{ - register struct domain *dp; - register struct protosw *pr; - int s = splimp(); - - for (dp = domains; dp; dp = dp->dom_next) { - for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) { - if (pr->pr_drain) - (*pr->pr_drain)(); - } - } - - splx(s); - mbstat.m_drain++; -} - -/* - * Space allocation routines. - * These are also available as macros - * for critical paths. - */ -struct mbuf * -m_get(nowait, type) - int nowait, type; -{ - register struct mbuf *m; - - MGET(m, nowait, type); - return (m); -} - -struct mbuf * -m_gethdr(nowait, type) - int nowait, type; -{ - register struct mbuf *m; - - MGETHDR(m, nowait, type); - return (m); -} - -struct mbuf * -m_getclr(nowait, type) - int nowait, type; -{ - register struct mbuf *m; - - MGET(m, nowait, type); - if (m == 0) - return (0); - bzero(mtod(m, caddr_t), MLEN); - return (m); -} - -struct mbuf * -m_free(m) - struct mbuf *m; -{ - register struct mbuf *n; - - MFREE(m, n); - return (n); -} - -void -m_freem(m) - register struct mbuf *m; -{ - register struct mbuf *n; - - if (m == NULL) - return; - do { - MFREE(m, n); - m = n; - } while (m); -} - -/* - * Mbuffer utility routines. - */ - -/* - * Lesser-used path for M_PREPEND: - * allocate new mbuf to prepend to chain, - * copy junk along. - */ -struct mbuf * -m_prepend(m, len, how) - register struct mbuf *m; - int len, how; -{ - struct mbuf *mn; - - MGET(mn, how, m->m_type); - if (mn == (struct mbuf *)NULL) { - m_freem(m); - return ((struct mbuf *)NULL); - } - if (m->m_flags & M_PKTHDR) { - M_COPY_PKTHDR(mn, m); - m->m_flags &= ~M_PKTHDR; - } - mn->m_next = m; - m = mn; - if (len < MHLEN) - MH_ALIGN(m, len); - m->m_len = len; - return (m); -} - -/* - * Make a copy of an mbuf chain starting "off0" bytes from the beginning, - * continuing for "len" bytes. If len is M_COPYALL, copy to end of mbuf. - * The wait parameter is a choice of M_WAIT/M_DONTWAIT from caller. - */ -int MCFail; - -struct mbuf * -m_copym(m, off0, len, wait) - register struct mbuf *m; - int off0, wait; - register int len; -{ - register struct mbuf *n, **np; - register int off = off0; - struct mbuf *top; - int copyhdr = 0; - - if (off < 0 || len < 0) - panic("m_copym"); - if (off == 0 && m->m_flags & M_PKTHDR) - copyhdr = 1; - while (off > 0) { - if (m == 0) - panic("m_copym"); - if (off < m->m_len) - break; - off -= m->m_len; - m = m->m_next; - } - np = ⊤ - top = 0; - while (len > 0) { - if (m == 0) { - if (len != M_COPYALL) - panic("m_copym"); - break; - } - MGET(n, wait, m->m_type); - *np = n; - if (n == 0) - goto nospace; - if (copyhdr) { - M_COPY_PKTHDR(n, m); - if (len == M_COPYALL) - n->m_pkthdr.len -= off0; - else - n->m_pkthdr.len = len; - copyhdr = 0; - } - n->m_len = min(len, m->m_len - off); - - if (m->m_flags & M_EXT) { - n->m_data = m->m_data + off; -#ifdef OSKIT - oskit_bufio_addref(m->m_ext.ext_bufio); -#else - mclrefcnt[mtocl(m->m_ext.ext_buf)]++; -#endif /* OSKIT */ - n->m_ext = m->m_ext; - n->m_flags |= M_EXT; - } else - bcopy(mtod(m, caddr_t)+off, mtod(n, caddr_t), - (unsigned)n->m_len); - if (len != M_COPYALL) - len -= n->m_len; - off = 0; - m = m->m_next; - np = &n->m_next; - } - if (top == 0) - MCFail++; - return (top); -nospace: - m_freem(top); - MCFail++; - return (0); -} - -/* - * Copy data from an mbuf chain starting "off" bytes from the beginning, - * continuing for "len" bytes, into the indicated buffer. - */ -void -m_copydata(m, off, len, cp) - register struct mbuf *m; - register int off; - register int len; - caddr_t cp; -{ - register unsigned count; - - if (off < 0 || len < 0) - panic("m_copydata"); - while (off > 0) { - if (m == 0) - panic("m_copydata"); - if (off < m->m_len) - break; - off -= m->m_len; - m = m->m_next; - } - while (len > 0) { - if (m == 0) - panic("m_copydata"); - count = min(m->m_len - off, len); - bcopy(mtod(m, caddr_t) + off, cp, count); - len -= count; - cp += count; - off = 0; - m = m->m_next; - } -} - -/* - * Concatenate mbuf chain n to m. - * Both chains must be of the same type (e.g. MT_DATA). - * Any m_pkthdr is not updated. - */ -void -m_cat(m, n) - register struct mbuf *m, *n; -{ - while (m->m_next) - m = m->m_next; - while (n) { - if (m->m_flags & M_EXT || - m->m_data + m->m_len + n->m_len >= &m->m_dat[MLEN]) { - /* just join the two chains */ - m->m_next = n; - return; - } - /* splat the data from one into the other */ - bcopy(mtod(n, caddr_t), mtod(m, caddr_t) + m->m_len, - (u_int)n->m_len); - m->m_len += n->m_len; - n = m_free(n); - } -} - -void -m_adj(mp, req_len) - struct mbuf *mp; - int req_len; -{ - register int len = req_len; - register struct mbuf *m; - register count; - - if ((m = mp) == NULL) - return; - if (len >= 0) { - /* - * Trim from head. - */ - while (m != NULL && len > 0) { - if (m->m_len <= len) { - len -= m->m_len; - m->m_len = 0; - m = m->m_next; - } else { - m->m_len -= len; - m->m_data += len; - len = 0; - } - } - m = mp; - if (mp->m_flags & M_PKTHDR) - m->m_pkthdr.len -= (req_len - len); - } else { - /* - * Trim from tail. Scan the mbuf chain, - * calculating its length and finding the last mbuf. - * If the adjustment only affects this mbuf, then just - * adjust and return. Otherwise, rescan and truncate - * after the remaining size. - */ - len = -len; - count = 0; - for (;;) { - count += m->m_len; - if (m->m_next == (struct mbuf *)0) - break; - m = m->m_next; - } - if (m->m_len >= len) { - m->m_len -= len; - if (mp->m_flags & M_PKTHDR) - mp->m_pkthdr.len -= len; - return; - } - count -= len; - if (count < 0) - count = 0; - /* - * Correct length for chain is "count". - * Find the mbuf with last data, adjust its length, - * and toss data from remaining mbufs on chain. - */ - m = mp; - if (m->m_flags & M_PKTHDR) - m->m_pkthdr.len = count; - for (; m; m = m->m_next) { - if (m->m_len >= count) { - m->m_len = count; - break; - } - count -= m->m_len; - } - while (m->m_next) - (m = m->m_next) ->m_len = 0; - } -} - -/* - * Rearange an mbuf chain so that len bytes are contiguous - * and in the data area of an mbuf (so that mtod and dtom - * will work for a structure of size len). Returns the resulting - * mbuf chain on success, frees it and returns null on failure. - * If there is room, it will add up to max_protohdr-len extra bytes to the - * contiguous region in an attempt to avoid being called next time. - */ -int MPFail; - -struct mbuf * -m_pullup(n, len) - register struct mbuf *n; - int len; -{ - register struct mbuf *m; - register int count; - int space; - - /* - * If first mbuf has no cluster, and has room for len bytes - * without shifting current data, pullup into it, - * otherwise allocate a new mbuf to prepend to the chain. - */ - if ((n->m_flags & M_EXT) == 0 && - n->m_data + len < &n->m_dat[MLEN] && n->m_next) { - if (n->m_len >= len) - return (n); - m = n; - n = n->m_next; - len -= m->m_len; - } else { - if (len > MHLEN) - goto bad; - MGET(m, M_DONTWAIT, n->m_type); - if (m == 0) - goto bad; - m->m_len = 0; - if (n->m_flags & M_PKTHDR) { - M_COPY_PKTHDR(m, n); - n->m_flags &= ~M_PKTHDR; - } - } - space = &m->m_dat[MLEN] - (m->m_data + m->m_len); - do { - count = min(min(max(len, max_protohdr), space), n->m_len); - bcopy(mtod(n, caddr_t), mtod(m, caddr_t) + m->m_len, - (unsigned)count); - len -= count; - m->m_len += count; - n->m_len -= count; - space -= count; - if (n->m_len) - n->m_data += count; - else - n = m_free(n); - } while (len > 0 && n); - if (len > 0) { - (void) m_free(m); - goto bad; - } - m->m_next = n; - return (m); -bad: - m_freem(n); - MPFail++; - return (0); -} - -/* - * Partition an mbuf chain in two pieces, returning the tail -- - * all but the first len0 bytes. In case of failure, it returns NULL and - * attempts to restore the chain to its original state. - */ -struct mbuf * -m_split(m0, len0, wait) - register struct mbuf *m0; - int len0, wait; -{ - register struct mbuf *m, *n; - unsigned len = len0, remain; - - for (m = m0; m && len > m->m_len; m = m->m_next) - len -= m->m_len; - if (m == 0) - return (0); - remain = m->m_len - len; - if (m0->m_flags & M_PKTHDR) { - MGETHDR(n, wait, m0->m_type); - if (n == 0) - return (0); - n->m_pkthdr.rcvif = m0->m_pkthdr.rcvif; - n->m_pkthdr.len = m0->m_pkthdr.len - len0; - m0->m_pkthdr.len = len0; - if (m->m_flags & M_EXT) - goto extpacket; - if (remain > MHLEN) { - /* m can't be the lead packet */ - MH_ALIGN(n, 0); - n->m_next = m_split(m, len, wait); - if (n->m_next == 0) { - (void) m_free(n); - return (0); - } else - return (n); - } else - MH_ALIGN(n, remain); - } else if (remain == 0) { - n = m->m_next; - m->m_next = 0; - return (n); - } else { - MGET(n, wait, m->m_type); - if (n == 0) - return (0); - M_ALIGN(n, remain); - } -extpacket: - if (m->m_flags & M_EXT) { - n->m_flags |= M_EXT; - n->m_ext = m->m_ext; -#ifdef OSKIT - oskit_bufio_addref(m->m_ext.ext_bufio); -#else - mclrefcnt[mtocl(m->m_ext.ext_buf)]++; -#endif /* OSKIT */ - m->m_ext.ext_size = 0; /* For Accounting XXXXXX danger */ - n->m_data = m->m_data + len; - } else { - bcopy(mtod(m, caddr_t) + len, mtod(n, caddr_t), remain); - } - n->m_len = remain; - m->m_len = len; - n->m_next = m->m_next; - m->m_next = 0; - return (n); -} - -#ifndef OSKIT -/* currently not OS Kit approved, and shouldn't be needed in the first place */ - -/* - * Routine to copy from device local memory into mbufs. - */ -struct mbuf * -m_devget(buf, totlen, off0, ifp, copy) - char *buf; - int totlen, off0; - struct ifnet *ifp; - void (*copy)(); -{ - register struct mbuf *m; - struct mbuf *top = 0, **mp = ⊤ - register int off = off0, len; - register char *cp; - char *epkt; - - cp = buf; - epkt = cp + totlen; - if (off) { - cp += off + 2 * sizeof(u_short); - totlen -= 2 * sizeof(u_short); - } - MGETHDR(m, M_DONTWAIT, MT_DATA); - if (m == 0) - return (0); - m->m_pkthdr.rcvif = ifp; - m->m_pkthdr.len = totlen; - m->m_len = MHLEN; - - while (totlen > 0) { - if (top) { - MGET(m, M_DONTWAIT, MT_DATA); - if (m == 0) { - m_freem(top); - return (0); - } - m->m_len = MLEN; - } - len = min(totlen, epkt - cp); - if (len >= MINCLSIZE) { - MCLGET(m, M_DONTWAIT); - if (m->m_flags & M_EXT) - m->m_len = len = min(len, MCLBYTES); - else - len = m->m_len; - } else { - /* - * Place initial small packet/header at end of mbuf. - */ - if (len < m->m_len) { - if (top == 0 && len + max_linkhdr <= m->m_len) - m->m_data += max_linkhdr; - m->m_len = len; - } else - len = m->m_len; - } - if (copy) - copy(cp, mtod(m, caddr_t), (unsigned)len); - else - bcopy(cp, mtod(m, caddr_t), (unsigned)len); - cp += len; - *mp = m; - mp = &m->m_next; - totlen -= len; - if (cp == epkt) - cp = buf; - } - return (top); -} - -#endif /* !OSKIT */ - -/* - * Copy data from a buffer back into the indicated mbuf chain, - * starting "off" bytes from the beginning, extending the mbuf - * chain if necessary. - */ -void -m_copyback(m0, off, len, cp) - struct mbuf *m0; - register int off; - register int len; - caddr_t cp; -{ - register int mlen; - register struct mbuf *m = m0, *n; - int totlen = 0; - - if (m0 == 0) - return; - while (off > (mlen = m->m_len)) { - off -= mlen; - totlen += mlen; - if (m->m_next == 0) { - n = m_getclr(M_DONTWAIT, m->m_type); - if (n == 0) - goto out; - n->m_len = min(MLEN, len + off); - m->m_next = n; - } - m = m->m_next; - } - while (len > 0) { - mlen = min (m->m_len - off, len); - bcopy(cp, off + mtod(m, caddr_t), (unsigned)mlen); - cp += mlen; - len -= mlen; - mlen += off; - off = 0; - totlen += mlen; - if (len == 0) - break; - if (m->m_next == 0) { - n = m_get(M_DONTWAIT, m->m_type); - if (n == 0) - break; - n->m_len = min(MLEN, len); - m->m_next = n; - } - m = m->m_next; - } -out: if (((m = m0)->m_flags & M_PKTHDR) && (m->m_pkthdr.len < totlen)) - m->m_pkthdr.len = totlen; -} diff --git a/reactos/lib/oskittcp/oskittcp/uipc_socket.c b/reactos/lib/oskittcp/oskittcp/uipc_socket.c deleted file mode 100644 index 8d46e40c533..00000000000 --- a/reactos/lib/oskittcp/oskittcp/uipc_socket.c +++ /dev/null @@ -1,1061 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1988, 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)uipc_socket.c 8.3 (Berkeley) 4/15/94 - */ - -#include <roscfg.h> -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/proc.h> -#include <sys/file.h> -#include <sys/malloc.h> -#include <sys/mbuf.h> -#include <sys/domain.h> -#include <sys/kernel.h> -#include <sys/protosw.h> -#include <sys/socket.h> -#include <sys/socketvar.h> -#include <sys/resourcevar.h> -#include <sys/signalvar.h> -#include <oskittcp.h> - -/* - * Exported to userland via sysctl - */ -int somaxconn = SOMAXCONN; - -/* - * Socket operation routines. - * These routines are called by the routines in - * sys_socket.c or from a system process, and - * implement the semantics of socket operations by - * switching out to the protocol specific routines. - */ -/*ARGSUSED*/ -int -socreate(dom, aso, type, proto) - int dom; - struct socket **aso; - register int type; - int proto; -{ - struct proc *p = curproc; /* XXX */ - register struct protosw *prp; - register struct socket *so; - register int error; - - if (proto) - prp = pffindproto(dom, proto, type); - else - prp = pffindtype(dom, type); - if (prp == 0 || prp->pr_usrreq == 0) - return (EPROTONOSUPPORT); - if (prp->pr_type != type) - return (EPROTOTYPE); - MALLOC(so, struct socket *, sizeof(*so), M_SOCKET, M_WAIT); - bzero((caddr_t)so, sizeof(*so)); - so->so_type = type; - so->so_proto = prp; - error = - (*prp->pr_usrreq)(so, PRU_ATTACH, - (struct mbuf *)0, (struct mbuf *)proto, (struct mbuf *)0); - if (error) { - so->so_state |= SS_NOFDREF; - sofree(so); - return (error); - } - *aso = so; - return (0); -} - -int -sobind(so, nam) - struct socket *so; - struct mbuf *nam; -{ - int s = splnet(); - int error; - - error = - (*so->so_proto->pr_usrreq)(so, PRU_BIND, - (struct mbuf *)0, nam, (struct mbuf *)0); - splx(s); - return (error); -} - -int -solisten(so, backlog) - register struct socket *so; - int backlog; -{ - int s = splnet(), error; - - error = - (*so->so_proto->pr_usrreq)(so, PRU_LISTEN, - (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0); - if (error) { - splx(s); - return (error); - } - if (so->so_q == 0) - so->so_options |= SO_ACCEPTCONN; - if (backlog < 0 || backlog > somaxconn) - backlog = somaxconn; - so->so_qlimit = backlog; - splx(s); - return (0); -} - -void -sofree(so) - register struct socket *so; -{ - - if (so->so_pcb || (so->so_state & SS_NOFDREF) == 0) - return; - if (so->so_head) { - if (!soqremque(so, 0) && !soqremque(so, 1)) - panic("sofree dq"); - so->so_head = 0; - } - sbrelease(&so->so_snd); - sorflush(so); - FREE(so, M_SOCKET); -} - -/* - * Close a socket on last file table reference removal. - * Initiate disconnect if connected. - * Free socket when disconnect complete. - */ -int -soclose(so) - register struct socket *so; -{ - int s = splnet(); /* conservative */ - int error = 0; - - if (so->so_options & SO_ACCEPTCONN) { - while (so->so_q0) - (void) soabort(so->so_q0); - while (so->so_q) - (void) soabort(so->so_q); - } - if (so->so_pcb == 0) - goto discard; - if (so->so_state & SS_ISCONNECTED) { - if ((so->so_state & SS_ISDISCONNECTING) == 0) { - error = sodisconnect(so); - if (error) - goto drop; - } - if (so->so_options & SO_LINGER) { - if ((so->so_state & SS_ISDISCONNECTING) && - (so->so_state & SS_NBIO)) - goto drop; - while (so->so_state & SS_ISCONNECTED) { - error = tsleep((caddr_t)&so->so_timeo, - PSOCK | PCATCH, netcls, so->so_linger); - if (error) - break; - } - } - } -drop: - if (so->so_pcb) { - int error2 = - (*so->so_proto->pr_usrreq)(so, PRU_DETACH, - (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0); - if (error == 0) - error = error2; - } -discard: - if (so->so_state & SS_NOFDREF) - panic("soclose: NOFDREF"); - so->so_state |= SS_NOFDREF; - sofree(so); - splx(s); - return (error); -} - -/* - * Must be called at splnet... - */ -int -soabort(so) - struct socket *so; -{ - - return ( - (*so->so_proto->pr_usrreq)(so, PRU_ABORT, - (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0)); -} - -int -soaccept(so, nam) - register struct socket *so; - struct mbuf *nam; -{ - int s = splnet(); - int error; - - if ((so->so_state & SS_NOFDREF) == 0) - panic("soaccept: !NOFDREF"); - so->so_state &= ~SS_NOFDREF; - error = (*so->so_proto->pr_usrreq)(so, PRU_ACCEPT, - (struct mbuf *)0, nam, (struct mbuf *)0); - splx(s); - return (error); -} - -int -soconnect(so, nam) - register struct socket *so; - struct mbuf *nam; -{ - int s; - int error; - - if (so->so_options & SO_ACCEPTCONN) - return (EOPNOTSUPP); - s = splnet(); - /* - * If protocol is connection-based, can only connect once. - * Otherwise, if connected, try to disconnect first. - * This allows user to disconnect by connecting to, e.g., - * a null address. - */ - if (so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING) && - ((so->so_proto->pr_flags & PR_CONNREQUIRED) || - (error = sodisconnect(so)))) - error = EISCONN; - else - error = (*so->so_proto->pr_usrreq)(so, PRU_CONNECT, - (struct mbuf *)0, nam, (struct mbuf *)0); - splx(s); - return (error); -} - -int -soconnect2(so1, so2) - register struct socket *so1; - struct socket *so2; -{ - int s = splnet(); - int error; - - error = (*so1->so_proto->pr_usrreq)(so1, PRU_CONNECT2, - (struct mbuf *)0, (struct mbuf *)so2, (struct mbuf *)0); - splx(s); - return (error); -} - -int -sodisconnect(so) - register struct socket *so; -{ - int s = splnet(); - int error; - - if ((so->so_state & SS_ISCONNECTED) == 0) { - error = ENOTCONN; - goto bad; - } - if (so->so_state & SS_ISDISCONNECTING) { - error = EALREADY; - goto bad; - } - error = (*so->so_proto->pr_usrreq)(so, PRU_DISCONNECT, - (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0); -bad: - splx(s); - return (error); -} - -#define SBLOCKWAIT(f) (((f) & MSG_DONTWAIT) ? M_NOWAIT : M_WAITOK) -/* - * Send on a socket. - * If send must go all at once and message is larger than - * send buffering, then hard error. - * Lock against other senders. - * If must go all at once and not enough room now, then - * inform user that this would block and do nothing. - * Otherwise, if nonblocking, send as much as possible. - * The data to be sent is described by "uio" if nonzero, - * otherwise by the mbuf chain "top" (which must be null - * if uio is not). Data provided in mbuf chain must be small - * enough to send all at once. - * - * Returns nonzero on error, timeout or signal; callers - * must check for short counts if EINTR/ERESTART are returned. - * Data and control buffers are freed on return. - */ -int -sosend(so, addr, uio, top, control, flags) - register struct socket *so; - struct mbuf *addr; - struct uio *uio; - struct mbuf *top; - struct mbuf *control; - int flags; -{ - struct proc *p = curproc; /* XXX */ - struct mbuf **mp; - register struct mbuf *m; - register long space, len, resid; - int clen = 0, error, s, dontroute, mlen; - int atomic = sosendallatonce(so) || top; - - if (uio) - resid = uio->uio_resid; - else - resid = top->m_pkthdr.len; - /* - * In theory resid should be unsigned. - * However, space must be signed, as it might be less than 0 - * if we over-committed, and we must use a signed comparison - * of space and resid. On the other hand, a negative resid - * causes us to loop sending 0-length segments to the protocol. - */ - if (resid < 0) - return (EINVAL); - dontroute = - (flags & MSG_DONTROUTE) && (so->so_options & SO_DONTROUTE) == 0 && - (so->so_proto->pr_flags & PR_ATOMIC); - p->p_stats->p_ru.ru_msgsnd++; - if (control) - clen = control->m_len; -#define snderr(errno) { error = errno; splx(s); goto release; } - -restart: - error = sblock(&so->so_snd, SBLOCKWAIT(flags)); - if (error) - goto out; - do { - s = splnet(); - if (so->so_state & SS_CANTSENDMORE) - snderr(EPIPE); - if (so->so_error) - snderr(so->so_error); - if ((so->so_state & SS_ISCONNECTED) == 0) { - /* - * `sendto' and `sendmsg' is allowed on a connection- - * based socket if it supports implied connect. - * Return ENOTCONN if not connected and no address is - * supplied. - */ - if ((so->so_proto->pr_flags & PR_CONNREQUIRED) && - (so->so_proto->pr_flags & PR_IMPLOPCL) == 0) { - if ((so->so_state & SS_ISCONFIRMING) == 0 && - !(resid == 0 && clen != 0)) - snderr(ENOTCONN); - } else if (addr == 0) - snderr(so->so_proto->pr_flags & PR_CONNREQUIRED ? - ENOTCONN : EDESTADDRREQ); - } - space = sbspace(&so->so_snd); - if (flags & MSG_OOB) - space += 1024; - if ((atomic && resid > so->so_snd.sb_hiwat) || - clen > so->so_snd.sb_hiwat) - snderr(EMSGSIZE); - if (space < resid + clen && uio && - (atomic || space < so->so_snd.sb_lowat || space < clen)) { - if (so->so_state & SS_NBIO) - snderr(EWOULDBLOCK); - sbunlock(&so->so_snd); - error = sbwait(&so->so_snd); - splx(s); - if (error) - goto out; - goto restart; - } - splx(s); - mp = ⊤ - space -= clen; - do { - if (uio == NULL) { - /* - * Data is prepackaged in "top". - */ - resid = 0; - if (flags & MSG_EOR) - top->m_flags |= M_EOR; - } else do { - if (top == 0) { - MGETHDR(m, M_WAIT, MT_DATA); - mlen = MHLEN; - m->m_pkthdr.len = 0; - m->m_pkthdr.rcvif = (struct ifnet *)0; - } else { - MGET(m, M_WAIT, MT_DATA); - mlen = MLEN; - } - if (resid >= MINCLSIZE) { - MCLGET(m, M_WAIT); - if ((m->m_flags & M_EXT) == 0) - goto nopages; - mlen = MCLBYTES; - len = min(min(mlen, resid), space); - } else { -nopages: - len = min(min(mlen, resid), space); - /* - * For datagram protocols, leave room - * for protocol headers in first mbuf. - */ - if (atomic && top == 0 && len < mlen) - MH_ALIGN(m, len); - } - space -= len; - error = uiomove(mtod(m, caddr_t), (int)len, uio); - resid = uio->uio_resid; - m->m_len = len; - *mp = m; - top->m_pkthdr.len += len; - if (error) - goto release; - mp = &m->m_next; - if (resid <= 0) { - if (flags & MSG_EOR) - top->m_flags |= M_EOR; - break; - } - } while (space > 0 && atomic); - if (dontroute) - so->so_options |= SO_DONTROUTE; - s = splnet(); /* XXX */ - error = (*so->so_proto->pr_usrreq)(so, - (flags & MSG_OOB) ? PRU_SENDOOB : - /* - * If the user set MSG_EOF, the protocol - * understands this flag and nothing left to - * send then use PRU_SEND_EOF instead of PRU_SEND. - */ - ((flags & MSG_EOF) && - (so->so_proto->pr_flags & PR_IMPLOPCL) && - (resid <= 0)) ? - PRU_SEND_EOF : PRU_SEND, - top, addr, control); - splx(s); - if (dontroute) - so->so_options &= ~SO_DONTROUTE; - clen = 0; - control = 0; - top = 0; - mp = ⊤ - if (error) - goto release; - } while (resid && space > 0); - } while (resid); - -release: - sbunlock(&so->so_snd); -out: - if (top) - m_freem(top); - if (control) - m_freem(control); - return (error); -} - -/* - * Implement receive operations on a socket. - * We depend on the way that records are added to the sockbuf - * by sbappend*. In particular, each record (mbufs linked through m_next) - * must begin with an address if the protocol so specifies, - * followed by an optional mbuf or mbufs containing ancillary data, - * and then zero or more mbufs of data. - * In order to avoid blocking network interrupts for the entire time here, - * we splx() while doing the actual copy to user space. - * Although the sockbuf is locked, new data may still be appended, - * and thus we must maintain consistency of the sockbuf during that time. - * - * The caller may receive the data as a single mbuf chain by supplying - * an mbuf **mp0 for use in returning the chain. The uio is then used - * only for the count in uio_resid. - */ -int -soreceive(so, paddr, uio, mp0, controlp, flagsp) - register struct socket *so; - struct mbuf **paddr; - struct uio *uio; - struct mbuf **mp0; - struct mbuf **controlp; - int *flagsp; -{ - register struct mbuf *m, **mp; - register int flags, len, error, s, offset; - struct protosw *pr = so->so_proto; - struct mbuf *nextrecord; - int moff, type = 0; - int orig_resid = uio->uio_resid; - - mp = mp0; - if (paddr) - *paddr = 0; - if (controlp) - *controlp = 0; - if (flagsp) - flags = *flagsp &~ MSG_EOR; - else - flags = 0; - if (flags & MSG_OOB) { - m = m_get(M_WAIT, MT_DATA); - error = (*pr->pr_usrreq)(so, PRU_RCVOOB, - m, (struct mbuf *)(flags & MSG_PEEK), (struct mbuf *)0); - if (error) - goto bad; - do { - error = uiomove(mtod(m, caddr_t), - (int) min(uio->uio_resid, m->m_len), uio); - /*m = m_free(m);*/ - } while (uio->uio_resid && error == 0 && m); -bad: - if (m) - /*m_freem(m);*/ - return (error); - } - if (mp) - *mp = (struct mbuf *)0; - if (so->so_state & SS_ISCONFIRMING && uio->uio_resid) - (*pr->pr_usrreq)(so, PRU_RCVD, (struct mbuf *)0, - (struct mbuf *)0, (struct mbuf *)0); - -restart: - error = sblock(&so->so_rcv, SBLOCKWAIT(flags)); - if (error) - return (error); - s = splnet(); - - m = so->so_rcv.sb_mb; - /* - * If we have less data than requested, block awaiting more - * (subject to any timeout) if: - * 1. the current count is less than the low water mark, or - * 2. MSG_WAITALL is set, and it is possible to do the entire - * receive operation at once if we block (resid <= hiwat). - * 3. MSG_DONTWAIT is not set - * If MSG_WAITALL is set but resid is larger than the receive buffer, - * we have to do the receive in sections, and thus risk returning - * a short count if a timeout or signal occurs after we start. - */ - if (m == 0 || (((flags & MSG_DONTWAIT) == 0 && - so->so_rcv.sb_cc < uio->uio_resid) && - (so->so_rcv.sb_cc < so->so_rcv.sb_lowat || - ((flags & MSG_WAITALL) && uio->uio_resid <= so->so_rcv.sb_hiwat)) && - m->m_nextpkt == 0 && (pr->pr_flags & PR_ATOMIC) == 0)) { -#ifdef DIAGNOSTIC - if (m == 0 && so->so_rcv.sb_cc) - panic("receive 1"); -#endif - if (so->so_error) { - if (m) - goto dontblock; - error = so->so_error; - if ((flags & MSG_PEEK) == 0) - so->so_error = 0; - goto release; - } - if (so->so_state & SS_CANTRCVMORE) { - if (m) - goto dontblock; - else - goto release; - } - for (; m; m = m->m_next) - if (m->m_type == MT_OOBDATA || (m->m_flags & M_EOR)) { - m = so->so_rcv.sb_mb; - goto dontblock; - } - if ((so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING)) == 0 && - (so->so_proto->pr_flags & PR_CONNREQUIRED)) { - error = ENOTCONN; - goto release; - } - if (uio->uio_resid == 0) - goto release; - if ((so->so_state & SS_NBIO) || (flags & MSG_DONTWAIT)) { - error = EWOULDBLOCK; - goto release; - } - sbunlock(&so->so_rcv); - error = sbwait(&so->so_rcv); - splx(s); - if (error) - return (error); - goto restart; - } -dontblock: - if (uio->uio_procp) - uio->uio_procp->p_stats->p_ru.ru_msgrcv++; - nextrecord = m->m_nextpkt; - if (pr->pr_flags & PR_ADDR) { -#ifdef DIAGNOSTIC - if (m->m_type != MT_SONAME) - panic("receive 1a"); -#endif - orig_resid = 0; - if (flags & MSG_PEEK) { - if (paddr) - *paddr = m_copy(m, 0, m->m_len); - m = m->m_next; - } else { - sbfree(&so->so_rcv, m); - if (paddr) { - *paddr = m; - so->so_rcv.sb_mb = m->m_next; - m->m_next = 0; - m = so->so_rcv.sb_mb; - } else { - MFREE(m, so->so_rcv.sb_mb); - m = so->so_rcv.sb_mb; - } - } - } - while (m && m->m_type == MT_CONTROL && error == 0) { - if (flags & MSG_PEEK) { - if (controlp) - *controlp = m_copy(m, 0, m->m_len); - m = m->m_next; - } else { - sbfree(&so->so_rcv, m); - if (controlp) { -#ifndef __REACTOS__ - if (pr->pr_domain->dom_externalize && - mtod(m, struct cmsghdr *)->cmsg_type == - SCM_RIGHTS) - error = (*pr->pr_domain->dom_externalize)(m); - *controlp = m; - so->so_rcv.sb_mb = m->m_next; - m->m_next = 0; - m = so->so_rcv.sb_mb; -#endif - } else { - /*MFREE(m, so->so_rcv.sb_mb);*/ - m = so->so_rcv.sb_mb; - } - } - if (controlp) { - orig_resid = 0; - controlp = &(*controlp)->m_next; - } - } - if (m) { - if ((flags & MSG_PEEK) == 0) - m->m_nextpkt = nextrecord; - type = m->m_type; - if (type == MT_OOBDATA) - flags |= MSG_OOB; - } - moff = 0; - offset = 0; - while (m && uio->uio_resid > 0 && error == 0) { - if (m->m_type == MT_OOBDATA) { - if (type != MT_OOBDATA) - break; - } else if (type == MT_OOBDATA) - break; -#ifdef DIAGNOSTIC - else if (m->m_type != MT_DATA && m->m_type != MT_HEADER) - panic("receive 3"); -#endif - so->so_state &= ~SS_RCVATMARK; - len = uio->uio_resid; - if (so->so_oobmark && len > so->so_oobmark - offset) - len = so->so_oobmark - offset; - if (len > m->m_len - moff) - len = m->m_len - moff; - /* - * If mp is set, just pass back the mbufs. - * Otherwise copy them out via the uio, then free. - * Sockbuf must be consistent here (points to current mbuf, - * it points to next record) when we drop priority; - * we must note any additions to the sockbuf when we - * block interrupts again. - */ - if (mp == 0) { - splx(s); - error = uiomove(mtod(m, caddr_t) + moff, (int)len, uio); - s = splnet(); - } else - uio->uio_resid -= len; - if (len == m->m_len - moff) { - if (m->m_flags & M_EOR) - flags |= MSG_EOR; - if (flags & MSG_PEEK) { - m = m->m_next; - moff = 0; - } else { - nextrecord = m->m_nextpkt; - sbfree(&so->so_rcv, m); - if (mp) { - *mp = m; - mp = &m->m_next; - so->so_rcv.sb_mb = m = m->m_next; - *mp = (struct mbuf *)0; - } else { - /*MFREE(m, so->so_rcv.sb_mb);*/ - m = so->so_rcv.sb_mb; - } - if (m) - m->m_nextpkt = nextrecord; - } - } else { - if (flags & MSG_PEEK) - moff += len; - else { - if (mp) - *mp = m_copym(m, 0, len, M_WAIT); - m->m_data += len; - m->m_len -= len; - so->so_rcv.sb_cc -= len; - } - } - if (so->so_oobmark) { - if ((flags & MSG_PEEK) == 0) { - so->so_oobmark -= len; - if (so->so_oobmark == 0) { - so->so_state |= SS_RCVATMARK; - break; - } - } else { - offset += len; - if (offset == so->so_oobmark) - break; - } - } - if (flags & MSG_EOR) - break; - /* - * If the MSG_WAITALL flag is set (for non-atomic socket), - * we must not quit until "uio->uio_resid == 0" or an error - * termination. If a signal/timeout occurs, return - * with a short count but without error. - * Keep sockbuf locked against other readers. - */ - while (flags & MSG_WAITALL && m == 0 && uio->uio_resid > 0 && - !sosendallatonce(so) && !nextrecord) { - if (so->so_error || so->so_state & SS_CANTRCVMORE) - break; - error = sbwait(&so->so_rcv); - if (error) { - sbunlock(&so->so_rcv); - splx(s); - return (0); - } - m = so->so_rcv.sb_mb; - if (m) - nextrecord = m->m_nextpkt; - } - } - - if (m && pr->pr_flags & PR_ATOMIC) { - flags |= MSG_TRUNC; - if ((flags & MSG_PEEK) == 0) - (void) sbdroprecord(&so->so_rcv); - } - if ((flags & MSG_PEEK) == 0) { - if (m == 0) - so->so_rcv.sb_mb = nextrecord; - if (pr->pr_flags & PR_WANTRCVD && so->so_pcb) - (*pr->pr_usrreq)(so, PRU_RCVD, (struct mbuf *)0, - (struct mbuf *)flags, (struct mbuf *)0); - } - if (orig_resid == uio->uio_resid && orig_resid && - (flags & MSG_EOR) == 0 && (so->so_state & SS_CANTRCVMORE) == 0) { - sbunlock(&so->so_rcv); - splx(s); - goto restart; - } - - if (flagsp) - *flagsp |= flags; -release: - sbunlock(&so->so_rcv); - splx(s); - return (error); -} - -int -soshutdown(so, how) - register struct socket *so; - register int how; -{ - register struct protosw *pr = so->so_proto; - - how++; - if (how & FREAD) - sorflush(so); - if (how & FWRITE) - return ((*pr->pr_usrreq)(so, PRU_SHUTDOWN, - (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0)); - return (0); -} - -void -sorflush(so) - register struct socket *so; -{ - register struct sockbuf *sb = &so->so_rcv; - register struct protosw *pr = so->so_proto; - register int s; - struct sockbuf asb; - - sb->sb_flags |= SB_NOINTR; - (void) sblock(sb, M_WAITOK); - s = splimp(); - socantrcvmore(so); - sbunlock(sb); - asb = *sb; - bzero((caddr_t)sb, sizeof (*sb)); - splx(s); - if (pr->pr_flags & PR_RIGHTS && pr->pr_domain->dom_dispose) - (*pr->pr_domain->dom_dispose)(asb.sb_mb); - sbrelease(&asb); -} - -int -sosetopt(so, level, optname, m0) - register struct socket *so; - int level, optname; - struct mbuf *m0; -{ - int error = 0; - register struct mbuf *m = m0; - - if (level != SOL_SOCKET) { - if (so->so_proto && so->so_proto->pr_ctloutput) - return ((*so->so_proto->pr_ctloutput) - (PRCO_SETOPT, so, level, optname, &m0)); - error = ENOPROTOOPT; - } else { - switch (optname) { - - case SO_LINGER: - if (m == NULL || m->m_len != sizeof (struct linger)) { - error = EINVAL; - goto bad; - } - so->so_linger = mtod(m, struct linger *)->l_linger; - /* fall thru... */ - - case SO_DEBUG: - case SO_KEEPALIVE: - case SO_DONTROUTE: - case SO_USELOOPBACK: - case SO_BROADCAST: - case SO_REUSEADDR: - /*case SO_REUSEPORT:*/ - case SO_OOBINLINE: - if (m == NULL || m->m_len < sizeof (int)) { - error = EINVAL; - goto bad; - } - if (*mtod(m, int *)) - so->so_options |= optname; - else - so->so_options &= ~optname; - break; - - case SO_SNDBUF: - case SO_RCVBUF: - case SO_SNDLOWAT: - case SO_RCVLOWAT: - if (m == NULL || m->m_len < sizeof (int)) { - error = EINVAL; - goto bad; - } - switch (optname) { - - case SO_SNDBUF: - case SO_RCVBUF: - if (sbreserve(optname == SO_SNDBUF ? - &so->so_snd : &so->so_rcv, - (u_long) *mtod(m, int *)) == 0) { - error = ENOBUFS; - goto bad; - } - break; - - case SO_SNDLOWAT: - so->so_snd.sb_lowat = *mtod(m, int *); - break; - case SO_RCVLOWAT: - so->so_rcv.sb_lowat = *mtod(m, int *); - break; - } - break; - - case SO_SNDTIMEO: - case SO_RCVTIMEO: - { - struct timeval *tv; - short val; - - if (m == NULL || m->m_len < sizeof (*tv)) { - error = EINVAL; - goto bad; - } - tv = mtod(m, struct timeval *); - if (tv->tv_sec > SHRT_MAX / hz - hz) { - error = EDOM; - goto bad; - } - val = tv->tv_sec * hz + tv->tv_usec / tick; - - switch (optname) { - - case SO_SNDTIMEO: - so->so_snd.sb_timeo = val; - break; - case SO_RCVTIMEO: - so->so_rcv.sb_timeo = val; - break; - } - break; - } - - default: - error = ENOPROTOOPT; - break; - } - if (error == 0 && so->so_proto && so->so_proto->pr_ctloutput) { - (void) ((*so->so_proto->pr_ctloutput) - (PRCO_SETOPT, so, level, optname, &m0)); - m = NULL; /* freed by protocol */ - } - } -bad: - if (m) - /*(void) m_free(m);*/ - return (error); -} - -int -sogetopt(so, level, optname, mp) - register struct socket *so; - int level, optname; - struct mbuf **mp; -{ - register struct mbuf *m; - - if (level != SOL_SOCKET) { - if (so->so_proto && so->so_proto->pr_ctloutput) { - return ((*so->so_proto->pr_ctloutput) - (PRCO_GETOPT, so, level, optname, mp)); - } else - return (ENOPROTOOPT); - } else { - m = m_get(M_WAIT, MT_SOOPTS); - m->m_len = sizeof (int); - - switch (optname) { - - case SO_LINGER: - m->m_len = sizeof (struct linger); - mtod(m, struct linger *)->l_onoff = - so->so_options & SO_LINGER; - mtod(m, struct linger *)->l_linger = so->so_linger; - break; - - case SO_USELOOPBACK: - case SO_DONTROUTE: - case SO_DEBUG: - case SO_KEEPALIVE: - case SO_REUSEADDR: - /*case SO_REUSEPORT: */ - case SO_BROADCAST: - case SO_OOBINLINE: - *mtod(m, int *) = so->so_options & optname; - break; - - case SO_TYPE: - *mtod(m, int *) = so->so_type; - break; - - case SO_ERROR: - *mtod(m, int *) = so->so_error; - so->so_error = 0; - break; - - case SO_SNDBUF: - *mtod(m, int *) = so->so_snd.sb_hiwat; - break; - - case SO_RCVBUF: - *mtod(m, int *) = so->so_rcv.sb_hiwat; - break; - - case SO_SNDLOWAT: - *mtod(m, int *) = so->so_snd.sb_lowat; - break; - - case SO_RCVLOWAT: - *mtod(m, int *) = so->so_rcv.sb_lowat; - break; - - case SO_SNDTIMEO: - case SO_RCVTIMEO: - { - int val = (optname == SO_SNDTIMEO ? - so->so_snd.sb_timeo : so->so_rcv.sb_timeo); - - m->m_len = sizeof(struct timeval); - mtod(m, struct timeval *)->tv_sec = val / hz; - mtod(m, struct timeval *)->tv_usec = - (val % hz) * tick; - break; - } - - default: - (void)m_free(m); - return (ENOPROTOOPT); - } - *mp = m; - return (0); - } -} - -void -sohasoutofband(so) - register struct socket *so; -{ - struct proc *p; - - if (so->so_pgid < 0) - gsignal(-so->so_pgid, SIGURG); - else if (so->so_pgid > 0 && (p = pfind(so->so_pgid)) != 0) - psignal(p, SIGURG); - selwakeup(&so->so_rcv.sb_sel); -} diff --git a/reactos/lib/oskittcp/oskittcp/uipc_socket2.c b/reactos/lib/oskittcp/oskittcp/uipc_socket2.c deleted file mode 100644 index f1f7d74c819..00000000000 --- a/reactos/lib/oskittcp/oskittcp/uipc_socket2.c +++ /dev/null @@ -1,812 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1988, 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)uipc_socket2.c 8.1 (Berkeley) 6/10/93 - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/proc.h> -#include <sys/file.h> -#include <sys/buf.h> -#include <sys/malloc.h> -#include <sys/mbuf.h> -#include <sys/protosw.h> -#include <sys/stat.h> -#include <sys/socket.h> -#include <sys/socketvar.h> -#include <sys/signalvar.h> -#include <oskittcp.h> - -/* - * Primitive routines for operating on sockets and socket buffers - */ - -/* strings for sleep message: */ -char netio[] = "netio"; -char netcon[] = "netcon"; -char netcls[] = "netcls"; - -/* these two are sysctl visible */ -u_long sb_max = SB_MAX; /* patchable */ - -u_long sb_efficiency = 8; /* parameter for sbreserve() */ - -int sominqueue = 0; /* minimum queue override */ - -/* - * Procedures to manipulate state flags of socket - * and do appropriate wakeups. Normal sequence from the - * active (originating) side is that soisconnecting() is - * called during processing of connect() call, - * resulting in an eventual call to soisconnected() if/when the - * connection is established. When the connection is torn down - * soisdisconnecting() is called during processing of disconnect() call, - * and soisdisconnected() is called when the connection to the peer - * is totally severed. The semantics of these routines are such that - * connectionless protocols can call soisconnected() and soisdisconnected() - * only, bypassing the in-progress calls when setting up a ``connection'' - * takes no time. - * - * From the passive side, a socket is created with - * two queues of sockets: so_q0 for connections in progress - * and so_q for connections already made and awaiting user acceptance. - * As a protocol is preparing incoming connections, it creates a socket - * structure queued on so_q0 by calling sonewconn(). When the connection - * is established, soisconnected() is called, and transfers the - * socket structure to so_q, making it available to accept(). - * - * If a socket is closed with sockets on either - * so_q0 or so_q, these sockets are dropped. - * - * If higher level protocols are implemented in - * the kernel, the wakeups done here will sometimes - * cause software-interrupt process scheduling. - */ - -void -soisconnecting(so) - register struct socket *so; -{ - - so->so_state &= ~(SS_ISCONNECTED|SS_ISDISCONNECTING); - so->so_state |= SS_ISCONNECTING; -} - -void -soisconnected(so) - register struct socket *so; -{ - register struct socket *head = so->so_head; - - so->so_state &= ~(SS_ISCONNECTING|SS_ISDISCONNECTING|SS_ISCONFIRMING); - so->so_state |= SS_ISCONNECTED; - if (head && soqremque(so, 0)) { - soqinsque(head, so, 1); - sorwakeup(head); - wakeup((caddr_t)&head->so_timeo); - } else { - wakeup((caddr_t)&so->so_timeo); - sorwakeup(so); - sowwakeup(so); - } - - if( OtcpEvent.SocketConnectIndication ) - OtcpEvent.SocketConnectIndication - ( OtcpEvent.ClientData, - so, - so->so_connection ); -} - -void -soisdisconnecting(so) - register struct socket *so; -{ - - so->so_state &= ~SS_ISCONNECTING; - so->so_state |= (SS_ISDISCONNECTING|SS_CANTRCVMORE|SS_CANTSENDMORE); - wakeup((caddr_t)&so->so_timeo); - sowwakeup(so); - sorwakeup(so); -} - -void -soisdisconnected(so) - register struct socket *so; -{ - - so->so_state &= ~(SS_ISCONNECTING|SS_ISCONNECTED|SS_ISDISCONNECTING); - so->so_state |= (SS_CANTRCVMORE|SS_CANTSENDMORE); - wakeup((caddr_t)&so->so_timeo); - sowwakeup(so); - sorwakeup(so); -} - -/* - * When an attempt at a new connection is noted on a socket - * which accepts connections, sonewconn is called. If the - * connection is possible (subject to space constraints, etc.) - * then we allocate a new structure, propoerly linked into the - * data structure of the original socket, and return this. - * Connstatus may be 0, or SO_ISCONFIRMING, or SO_ISCONNECTED. - * - * Currently, sonewconn() is defined as sonewconn1() in socketvar.h - * to catch calls that are missing the (new) second parameter. - */ -struct socket * -sonewconn1(head, connstatus) - register struct socket *head; - int connstatus; -{ - register struct socket *so; - int soqueue = connstatus ? 1 : 0; - - if ((head->so_qlen + head->so_q0len > 3 * head->so_qlimit / 2) && - (head->so_qlen + head->so_q0len > sominqueue)) - return ((struct socket *)0); - MALLOC(so, struct socket *, sizeof(*so), M_SOCKET, M_DONTWAIT); - if (so == NULL) - return ((struct socket *)0); - bzero((caddr_t)so, sizeof(*so)); - so->so_type = head->so_type; - so->so_options = head->so_options &~ SO_ACCEPTCONN; - so->so_linger = head->so_linger; - so->so_state = head->so_state | SS_NOFDREF; - so->so_proto = head->so_proto; - so->so_timeo = head->so_timeo; - so->so_pgid = head->so_pgid; - (void) soreserve(so, head->so_snd.sb_hiwat, head->so_rcv.sb_hiwat); - soqinsque(head, so, soqueue); - if ((*so->so_proto->pr_usrreq)(so, PRU_ATTACH, - (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0)) { - (void) soqremque(so, soqueue); - (void) free((caddr_t)so, M_SOCKET); - return ((struct socket *)0); - } - if (connstatus) { - sorwakeup(head); - wakeup((caddr_t)&head->so_timeo); - so->so_state |= connstatus; - } - return (so); -} - -void -soqinsque(head, so, q) - register struct socket *head, *so; - int q; -{ - - register struct socket **prev; - so->so_head = head; - if (q == 0) { - head->so_q0len++; - so->so_q0 = 0; - for (prev = &(head->so_q0); *prev; ) - prev = &((*prev)->so_q0); - } else { - head->so_qlen++; - so->so_q = 0; - for (prev = &(head->so_q); *prev; ) - prev = &((*prev)->so_q); - } - *prev = so; -} - -int -soqremque(so, q) - register struct socket *so; - int q; -{ - register struct socket *head, *prev, *next; - - head = so->so_head; - prev = head; - for (;;) { - next = q ? prev->so_q : prev->so_q0; - if (next == so) - break; - if (next == 0) - return (0); - prev = next; - } - if (q == 0) { - prev->so_q0 = next->so_q0; - head->so_q0len--; - } else { - prev->so_q = next->so_q; - head->so_qlen--; - } - next->so_q0 = next->so_q = 0; - next->so_head = 0; - return (1); -} - -/* - * Socantsendmore indicates that no more data will be sent on the - * socket; it would normally be applied to a socket when the user - * informs the system that no more data is to be sent, by the protocol - * code (in case PRU_SHUTDOWN). Socantrcvmore indicates that no more data - * will be received, and will normally be applied to the socket by a - * protocol when it detects that the peer will send no more data. - * Data queued for reading in the socket may yet be read. - */ - -void -socantsendmore(so) - struct socket *so; -{ - - so->so_state |= SS_CANTSENDMORE; - sowwakeup(so); -} - -void -socantrcvmore(so) - struct socket *so; -{ - - so->so_state |= SS_CANTRCVMORE; - sorwakeup(so); -} - -/* - * Wait for data to arrive at/drain from a socket buffer. - */ -int -sbwait(sb) - struct sockbuf *sb; -{ - - sb->sb_flags |= SB_WAIT; - return (tsleep((caddr_t)&sb->sb_cc, - (sb->sb_flags & SB_NOINTR) ? PSOCK : PSOCK | PCATCH, netio, - sb->sb_timeo)); -} - -/* - * Lock a sockbuf already known to be locked; - * return any error returned from sleep (EINTR). - */ -int -sb_lock(sb) - register struct sockbuf *sb; -{ - int error; - - while (sb->sb_flags & SB_LOCK) { - sb->sb_flags |= SB_WANT; - error = tsleep((caddr_t)&sb->sb_flags, - (sb->sb_flags & SB_NOINTR) ? PSOCK : PSOCK|PCATCH, - netio, 0); - if (error) - return (error); - } - sb->sb_flags |= SB_LOCK; - return (0); -} - -/* - * Wakeup processes waiting on a socket buffer. - * Do asynchronous notification via SIGIO - * if the socket has the SS_ASYNC flag set. - */ -void -sowakeup(so, sb) - register struct socket *so; - register struct sockbuf *sb; -{ - struct proc *p; - - selwakeup(&sb->sb_sel); -#ifndef OSKIT - /* - * in the OS Kit, we do not want notifications to stop - */ - sb->sb_flags &= ~SB_SEL; -#endif - if (sb->sb_flags & SB_WAIT) { - sb->sb_flags &= ~SB_WAIT; - wakeup((caddr_t)&sb->sb_cc); - } - if (so->so_state & SS_ASYNC) { - if (so->so_pgid < 0) - gsignal(-so->so_pgid, SIGIO); - else if (so->so_pgid > 0 && (p = pfind(so->so_pgid)) != 0) - psignal(p, SIGIO); - } -} - -/* - * Socket buffer (struct sockbuf) utility routines. - * - * Each socket contains two socket buffers: one for sending data and - * one for receiving data. Each buffer contains a queue of mbufs, - * information about the number of mbufs and amount of data in the - * queue, and other fields allowing select() statements and notification - * on data availability to be implemented. - * - * Data stored in a socket buffer is maintained as a list of records. - * Each record is a list of mbufs chained together with the m_next - * field. Records are chained together with the m_nextpkt field. The upper - * level routine soreceive() expects the following conventions to be - * observed when placing information in the receive buffer: - * - * 1. If the protocol requires each message be preceded by the sender's - * name, then a record containing that name must be present before - * any associated data (mbuf's must be of type MT_SONAME). - * 2. If the protocol supports the exchange of ``access rights'' (really - * just additional data associated with the message), and there are - * ``rights'' to be received, then a record containing this data - * should be present (mbuf's must be of type MT_RIGHTS). - * 3. If a name or rights record exists, then it must be followed by - * a data record, perhaps of zero length. - * - * Before using a new socket structure it is first necessary to reserve - * buffer space to the socket, by calling sbreserve(). This should commit - * some of the available buffer space in the system buffer pool for the - * socket (currently, it does nothing but enforce limits). The space - * should be released by calling sbrelease() when the socket is destroyed. - */ - -int -soreserve(so, sndcc, rcvcc) - register struct socket *so; - u_long sndcc, rcvcc; -{ - - if (sbreserve(&so->so_snd, sndcc) == 0) - goto bad; - if (sbreserve(&so->so_rcv, rcvcc) == 0) - goto bad2; - if (so->so_rcv.sb_lowat == 0) - so->so_rcv.sb_lowat = 1; - if (so->so_snd.sb_lowat == 0) - so->so_snd.sb_lowat = MCLBYTES; - if (so->so_snd.sb_lowat > so->so_snd.sb_hiwat) - so->so_snd.sb_lowat = so->so_snd.sb_hiwat; - return (0); -bad2: - sbrelease(&so->so_snd); -bad: - return (ENOBUFS); -} - -/* - * Allot mbufs to a sockbuf. - * Attempt to scale mbmax so that mbcnt doesn't become limiting - * if buffering efficiency is near the normal case. - */ -int -sbreserve(sb, cc) - struct sockbuf *sb; - u_long cc; -{ - - if (cc > sb_max * MCLBYTES / (MSIZE + MCLBYTES)) - return (0); - sb->sb_hiwat = cc; - sb->sb_mbmax = min(cc * sb_efficiency, sb_max); - if (sb->sb_lowat > sb->sb_hiwat) - sb->sb_lowat = sb->sb_hiwat; - return (1); -} - -/* - * Free mbufs held by a socket, and reserved mbuf space. - */ -void -sbrelease(sb) - struct sockbuf *sb; -{ - - sbflush(sb); - sb->sb_hiwat = sb->sb_mbmax = 0; -} - -/* - * Routines to add and remove - * data from an mbuf queue. - * - * The routines sbappend() or sbappendrecord() are normally called to - * append new mbufs to a socket buffer, after checking that adequate - * space is available, comparing the function sbspace() with the amount - * of data to be added. sbappendrecord() differs from sbappend() in - * that data supplied is treated as the beginning of a new record. - * To place a sender's address, optional access rights, and data in a - * socket receive buffer, sbappendaddr() should be used. To place - * access rights and data in a socket receive buffer, sbappendrights() - * should be used. In either case, the new data begins a new record. - * Note that unlike sbappend() and sbappendrecord(), these routines check - * for the caller that there will be enough space to store the data. - * Each fails if there is not enough space, or if it cannot find mbufs - * to store additional information in. - * - * Reliable protocols may use the socket send buffer to hold data - * awaiting acknowledgement. Data is normally copied from a socket - * send buffer in a protocol with m_copy for output to a peer, - * and then removing the data from the socket buffer with sbdrop() - * or sbdroprecord() when the data is acknowledged by the peer. - */ - -/* - * Append mbuf chain m to the last record in the - * socket buffer sb. The additional space associated - * the mbuf chain is recorded in sb. Empty mbufs are - * discarded and mbufs are compacted where possible. - */ -void -sbappend(so, sb, m) - struct socket *so; - struct sockbuf *sb; - struct mbuf *m; -{ - register struct mbuf *n; - - if (m == 0) - return; - n = sb->sb_mb; - if (n) { - while (n->m_nextpkt) - n = n->m_nextpkt; - do { - if (n->m_flags & M_EOR) { - sbappendrecord(sb, m); /* XXXXXX!!!! */ - return; - } - } while (n->m_next && (n = n->m_next)); - } - OskitDumpBuffer( m->m_data, m->m_len ); - if( OtcpEvent.SocketDataAvailable ) - OtcpEvent.SocketDataAvailable - ( OtcpEvent.ClientData, - so, - so->so_connection, - m->m_data, m->m_len ); -} - -#ifdef SOCKBUF_DEBUG -void -sbcheck(sb) - register struct sockbuf *sb; -{ - register struct mbuf *m; - register int len = 0, mbcnt = 0; - - for (m = sb->sb_mb; m; m = m->m_next) { - len += m->m_len; - mbcnt += MSIZE; - if (m->m_flags & M_EXT) - mbcnt += m->m_ext.ext_size; - if (m->m_nextpkt) - panic("sbcheck nextpkt"); - } - if (len != sb->sb_cc || mbcnt != sb->sb_mbcnt) { - printf("cc %d != %d || mbcnt %d != %d\n", len, sb->sb_cc, - mbcnt, sb->sb_mbcnt); - panic("sbcheck"); - } -} -#endif - -/* - * As above, except the mbuf chain - * begins a new record. - */ -void -sbappendrecord(sb, m0) - register struct sockbuf *sb; - register struct mbuf *m0; -{ - register struct mbuf *m; - - if (m0 == 0) - return; - m = sb->sb_mb; - if (m) - while (m->m_nextpkt) - m = m->m_nextpkt; - /* - * Put the first mbuf on the queue. - * Note this permits zero length records. - */ - sballoc(sb, m0); - if (m) - m->m_nextpkt = m0; - else - sb->sb_mb = m0; - m = m0->m_next; - m0->m_next = 0; - if (m && (m0->m_flags & M_EOR)) { - m0->m_flags &= ~M_EOR; - m->m_flags |= M_EOR; - } - sbcompress(sb, m, m0); -} - -/* - * As above except that OOB data - * is inserted at the beginning of the sockbuf, - * but after any other OOB data. - */ -void -sbinsertoob(sb, m0) - register struct sockbuf *sb; - register struct mbuf *m0; -{ - register struct mbuf *m; - register struct mbuf **mp; - - if (m0 == 0) - return; - for (mp = &sb->sb_mb; *mp ; mp = &((*mp)->m_nextpkt)) { - m = *mp; - again: - switch (m->m_type) { - - case MT_OOBDATA: - continue; /* WANT next train */ - - case MT_CONTROL: - m = m->m_next; - if (m) - goto again; /* inspect THIS train further */ - } - break; - } - /* - * Put the first mbuf on the queue. - * Note this permits zero length records. - */ - sballoc(sb, m0); - m0->m_nextpkt = *mp; - *mp = m0; - m = m0->m_next; - m0->m_next = 0; - if (m && (m0->m_flags & M_EOR)) { - m0->m_flags &= ~M_EOR; - m->m_flags |= M_EOR; - } - sbcompress(sb, m, m0); -} - -/* - * Append address and data, and optionally, control (ancillary) data - * to the receive queue of a socket. If present, - * m0 must include a packet header with total length. - * Returns 0 if no space in sockbuf or insufficient mbufs. - */ -int -sbappendaddr(sb, asa, m0, control) - register struct sockbuf *sb; - struct sockaddr *asa; - struct mbuf *m0, *control; -{ - register struct mbuf *m, *n; - int space = /*asa->sa_len;*/ sizeof(struct sockaddr); - -if (m0 && (m0->m_flags & M_PKTHDR) == 0) -panic("sbappendaddr"); - if (m0) - space += m0->m_pkthdr.len; - for (n = control; n; n = n->m_next) { - space += n->m_len; - if (n->m_next == 0) /* keep pointer to last control buf */ - break; - } - if (space > sbspace(sb)) - return (0); - MGET(m, M_DONTWAIT, MT_SONAME); - if (m == 0) - return (0); - m->m_len = sizeof(struct sockaddr); - bcopy((caddr_t)asa, mtod(m, caddr_t), sizeof(struct sockaddr)); - if (n) - n->m_next = m0; /* concatenate data to control */ - else - control = m0; - m->m_next = control; - for (n = m; n; n = n->m_next) - sballoc(sb, n); - n = sb->sb_mb; - if (n) { - while (n->m_nextpkt) - n = n->m_nextpkt; - n->m_nextpkt = m; - } else - sb->sb_mb = m; - return (1); -} - -int -sbappendcontrol(sb, m0, control) - struct sockbuf *sb; - struct mbuf *control, *m0; -{ - register struct mbuf *m, *n; - int space = 0; - - if (control == 0) - panic("sbappendcontrol"); - for (m = control; ; m = m->m_next) { - space += m->m_len; - if (m->m_next == 0) - break; - } - n = m; /* save pointer to last control buffer */ - for (m = m0; m; m = m->m_next) - space += m->m_len; - if (space > sbspace(sb)) - return (0); - n->m_next = m0; /* concatenate data to control */ - for (m = control; m; m = m->m_next) - sballoc(sb, m); - n = sb->sb_mb; - if (n) { - while (n->m_nextpkt) - n = n->m_nextpkt; - n->m_nextpkt = control; - } else - sb->sb_mb = control; - return (1); -} - -/* - * Compress mbuf chain m into the socket - * buffer sb following mbuf n. If n - * is null, the buffer is presumed empty. - */ -void -sbcompress(sb, m, n) - register struct sockbuf *sb; - register struct mbuf *m, *n; -{ - register int eor = 0; - register struct mbuf *o; - - while (m) { - eor |= m->m_flags & M_EOR; - if (m->m_len == 0 && - (eor == 0 || - (((o = m->m_next) || (o = n)) && - o->m_type == m->m_type))) { - m = m_free(m); - continue; - } - if (n && (n->m_flags & (M_EXT | M_EOR)) == 0 && - (n->m_data + n->m_len + m->m_len) < &n->m_dat[MLEN] && - n->m_type == m->m_type) { - bcopy(mtod(m, caddr_t), mtod(n, caddr_t) + n->m_len, - (unsigned)m->m_len); - n->m_len += m->m_len; - sb->sb_cc += m->m_len; - m = m_free(m); - continue; - } - if (n) - n->m_next = m; - else - sb->sb_mb = m; - sballoc(sb, m); - n = m; - m->m_flags &= ~M_EOR; - m = m->m_next; - n->m_next = 0; - } - if (eor) { - if (n) - n->m_flags |= eor; - else - printf("semi-panic: sbcompress\n"); - } -} - -/* - * Free all mbufs in a sockbuf. - * Check that all resources are reclaimed. - */ -void -sbflush(sb) - register struct sockbuf *sb; -{ - - if (sb->sb_flags & SB_LOCK) - panic("sbflush"); - while (sb->sb_mbcnt) - sbdrop(sb, (int)sb->sb_cc); - if (sb->sb_cc || sb->sb_mb) - panic("sbflush 2"); -} - -/* - * Drop data from (the front of) a sockbuf. - */ -void -sbdrop(sb, len) - register struct sockbuf *sb; - register int len; -{ - register struct mbuf *m, *mn; - struct mbuf *next; - - next = (m = sb->sb_mb) ? m->m_nextpkt : 0; - while (len > 0) { - if (m == 0) { - if (next == 0) - panic("sbdrop"); - m = next; - next = m->m_nextpkt; - continue; - } - if (m->m_len > len) { - m->m_len -= len; - m->m_data += len; - sb->sb_cc -= len; - break; - } - len -= m->m_len; - sbfree(sb, m); - MFREE(m, mn); - m = mn; - } - while (m && m->m_len == 0) { - sbfree(sb, m); - MFREE(m, mn); - m = mn; - } - if (m) { - sb->sb_mb = m; - m->m_nextpkt = next; - } else - sb->sb_mb = next; -} - -/* - * Drop a record off the front of a sockbuf - * and move the next record to the front. - */ -void -sbdroprecord(sb) - register struct sockbuf *sb; -{ - register struct mbuf *m, *mn; - - m = sb->sb_mb; - if (m) { - sb->sb_mb = m->m_nextpkt; - do { - sbfree(sb, m); - MFREE(m, mn); - m = mn; - } while (m); - } -} From 05769811b4c7361f1f26d2305cfac417a1bc77fe Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Sat, 29 May 2004 09:59:25 +0000 Subject: [PATCH 1257/1463] Fixes for gcc-3.4.0 (pasting the __FUNCTION__ constant with a string) and cast lvalue (reported by thomas weidenmueller) svn path=/trunk/; revision=9537 --- reactos/drivers/lib/oskittcp/oskittcp/defaults.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/reactos/drivers/lib/oskittcp/oskittcp/defaults.c b/reactos/drivers/lib/oskittcp/oskittcp/defaults.c index 0133e6531d4..747ad2c7711 100644 --- a/reactos/drivers/lib/oskittcp/oskittcp/defaults.c +++ b/reactos/drivers/lib/oskittcp/oskittcp/defaults.c @@ -46,8 +46,8 @@ struct domain localdomain; /* see uipc_domain.c ADDDOMAIN macro */ struct proc * pfind(pid_t pid) { - printf(__FUNCTION__" called, pid=%d, returning x%p\n", - (int)pid, (void*)&proc0); + printf("%s called, pid=%d, returning x%p\n", + __FUNCTION__, (int)pid, (void*)&proc0); return &proc0; } @@ -57,7 +57,7 @@ pfind(pid_t pid) void psignal (struct proc *p, int sig) { - printf(__FUNCTION__" called, proc=x%p sig=%d\n", p, sig); + printf("%s called, proc=x%p sig=%d\n", __FUNCTION__, p, sig); } /* @@ -66,7 +66,7 @@ psignal (struct proc *p, int sig) void gsignal (int pgid, int sig) { - printf(__FUNCTION__" called, pgid=%d sig=%d\n", pgid, sig); + printf("%s called, pgid=%d sig=%d\n", __FUNCTION__, pgid, sig); } /* ---------------------------------------------------------------------- */ @@ -97,12 +97,12 @@ copyout (void *kaddr, void *udaddr, u_int len) */ int subyte (void *base, int byte) { - return (int)((char *)base = (char)byte); + return (int)(base = (char *)byte); } int suibyte (void *base, int byte) { - return (int)((char *)base = (char)byte); + return (int)(base = (char *)byte); } /* ---------------------------------------------------------------------- */ @@ -194,7 +194,7 @@ sysctl_rdstruct(oldp, oldlenp, newp, sp, len) * normally, this is a builtin function in gcc * net/if.c doesn't seem to get it, though */ -int +static int memcmp(const void *s1v, const void *s2v, size_t size) { register const char *s1 = s1v, *s2 = s2v; From 0f0b33c44c55c6e5225c83b9bda66c6ac8704e9c Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Sat, 29 May 2004 10:45:26 +0000 Subject: [PATCH 1258/1463] NdisQueryPacketLength -- Based in an obvious way on a similar macro. svn path=/trunk/; revision=9539 --- reactos/w32api/include/ddk/ndis.h | 42 +++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/reactos/w32api/include/ddk/ndis.h b/reactos/w32api/include/ddk/ndis.h index 216249df48e..68fc9644f78 100644 --- a/reactos/w32api/include/ddk/ndis.h +++ b/reactos/w32api/include/ddk/ndis.h @@ -2026,6 +2026,48 @@ NdisFreeBuffer( } \ } +/* + * VOID + * NdisQueryPacketLength( + * IN PNDIS_PACKET Packet, + * OUT PUINT PhysicalBufferCount OPTIONAL, + * OUT PUINT BufferCount OPTIONAL, + * OUT PNDIS_BUFFER *FirstBuffer OPTIONAL, + * OUT PUINT TotalPacketLength OPTIONAL); + */ +#define NdisQueryPacketLength(Packet, \ + TotalPacketLength) \ +{ \ + if ((TotalPacketLength)) \ + { \ + if (!(Packet)->Private.ValidCounts) { \ + UINT _Offset; \ + UINT _PacketLength; \ + PNDIS_BUFFER _NdisBuffer; \ + UINT _PhysicalBufferCount = 0; \ + UINT _TotalPacketLength = 0; \ + UINT _Count = 0; \ + \ + for (_NdisBuffer = (Packet)->Private.Head; \ + _NdisBuffer != (PNDIS_BUFFER)NULL; \ + _NdisBuffer = _NdisBuffer->Next) \ + { \ + _PhysicalBufferCount += NDIS_BUFFER_TO_SPAN_PAGES(_NdisBuffer); \ + NdisQueryBufferOffset(_NdisBuffer, &_Offset, &_PacketLength); \ + _TotalPacketLength += _PacketLength; \ + _Count++; \ + } \ + (Packet)->Private.PhysicalCount = _PhysicalBufferCount; \ + (Packet)->Private.TotalLength = _TotalPacketLength; \ + (Packet)->Private.Count = _Count; \ + (Packet)->Private.ValidCounts = TRUE; \ + } \ + \ + if (TotalPacketLength) \ + *((PUINT)TotalPacketLength) = (Packet)->Private.TotalLength; \ + } \ +} + /* * VOID From 206298fe27cd33ab0e1d0dbacd788642f5f5a649 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 29 May 2004 11:51:33 +0000 Subject: [PATCH 1259/1463] - RaiseException should pass the exception parameters even if the exception is non-continuable. svn path=/trunk/; revision=9541 --- reactos/lib/kernel32/except/except.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/reactos/lib/kernel32/except/except.c b/reactos/lib/kernel32/except/except.c index eb2ba0aba5b..597ff008d76 100644 --- a/reactos/lib/kernel32/except/except.c +++ b/reactos/lib/kernel32/except/except.c @@ -1,4 +1,4 @@ -/* $Id: except.c,v 1.12 2003/08/24 14:49:55 dwelch Exp $ +/* $Id: except.c,v 1.13 2004/05/29 11:51:33 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -141,10 +141,9 @@ RaiseException ( } /* * If the exception has no argument, - * or it is a non-continuable exception, * ignore nNumberOfArguments and lpArguments. */ - if ((NULL == lpArguments) || ExceptionRecord.ExceptionFlags) + if (NULL == lpArguments) { ExceptionRecord.NumberParameters = 0; } From 206a67a937e071f8b48d5fdd131b994aebc931bf Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 29 May 2004 11:53:43 +0000 Subject: [PATCH 1260/1463] - The last parameter of NtReadVirtualMemory should be optional. svn path=/trunk/; revision=9542 --- reactos/ntoskrnl/mm/virtual.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/mm/virtual.c b/reactos/ntoskrnl/mm/virtual.c index 6b7af5c5831..d8200fe0d3c 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.73 2004/05/05 02:00:01 tamlin Exp $ +/* $Id: virtual.c,v 1.74 2004/05/29 11:53:43 navaraf Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/virtual.c @@ -274,7 +274,7 @@ NtReadVirtualMemory(IN HANDLE ProcessHandle, IN PVOID BaseAddress, OUT PVOID Buffer, IN ULONG NumberOfBytesToRead, - OUT PULONG NumberOfBytesRead) + OUT PULONG NumberOfBytesRead OPTIONAL) { NTSTATUS Status; PMDL Mdl; @@ -319,7 +319,9 @@ NtReadVirtualMemory(IN HANDLE ProcessHandle, ObDereferenceObject(Process); - *NumberOfBytesRead = NumberOfBytesToRead; + if (NumberOfBytesRead) + *NumberOfBytesRead = NumberOfBytesToRead; + return(STATUS_SUCCESS); } From b94f2fca332c5b6696d8a6554c3c0c8c7812df54 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 29 May 2004 11:58:16 +0000 Subject: [PATCH 1261/1463] - Fixed declaration of IMAGE_EXPORT_DIRECTORY structure. svn path=/trunk/; revision=9543 --- reactos/w32api/include/winnt.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/w32api/include/winnt.h b/reactos/w32api/include/winnt.h index 3cfa2667a61..3f57b173a77 100644 --- a/reactos/w32api/include/winnt.h +++ b/reactos/w32api/include/winnt.h @@ -2617,9 +2617,9 @@ typedef struct _IMAGE_EXPORT_DIRECTORY { DWORD Base; DWORD NumberOfFunctions; DWORD NumberOfNames; - PDWORD *AddressOfFunctions; - PDWORD *AddressOfNames; - PWORD *AddressOfNameOrdinals; + DWORD AddressOfFunctions; + DWORD AddressOfNames; + DWORD AddressOfNameOrdinals; } IMAGE_EXPORT_DIRECTORY,*PIMAGE_EXPORT_DIRECTORY; typedef struct _IMAGE_IMPORT_BY_NAME { WORD Hint; From 1aeb737c6b577a6d99b64a34900d7b6a4756a3a1 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 29 May 2004 13:12:08 +0000 Subject: [PATCH 1262/1463] - Fixed unicode string copying bug in NtGdiAddFontResource. svn path=/trunk/; revision=9544 --- reactos/subsys/win32k/objects/text.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index 4e64e7edec5..207906b9b30 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.91 2004/05/10 17:07:20 weiden Exp $ */ +/* $Id: text.c,v 1.92 2004/05/29 13:12:08 navaraf Exp $ */ #include <w32k.h> #include <ft2build.h> @@ -460,7 +460,7 @@ NtGdiAddFontResource(PUNICODE_STRING Filename, DWORD fl) return 0; } - Status = MmCopyFromCaller(&SafeFileName.Buffer, src, SafeFileName.MaximumLength); + Status = MmCopyFromCaller(SafeFileName.Buffer, src, SafeFileName.MaximumLength); if(!NT_SUCCESS(Status)) { ExFreePool(SafeFileName.Buffer); From 4faf15614f8d68395fc9c5b9377b81842de96d23 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 29 May 2004 15:10:27 +0000 Subject: [PATCH 1263/1463] - Prepend "\\??\" to the file name in NtGdiAddFontResource. svn path=/trunk/; revision=9545 --- 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 207906b9b30..8ac8f2afee6 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.92 2004/05/29 13:12:08 navaraf Exp $ */ +/* $Id: text.c,v 1.93 2004/05/29 15:10:27 navaraf Exp $ */ #include <w32k.h> #include <ft2build.h> @@ -451,6 +451,10 @@ NtGdiAddFontResource(PUNICODE_STRING Filename, DWORD fl) SetLastNtError(Status); return 0; } + + /* Reserve for prepending '\??\' */ + SafeFileName.Length += 4 * sizeof(WCHAR); + SafeFileName.MaximumLength += 4 * sizeof(WCHAR); src = SafeFileName.Buffer; SafeFileName.Buffer = (PWSTR)ExAllocatePoolWithTag(PagedPool, SafeFileName.MaximumLength, TAG_STRING); @@ -460,7 +464,10 @@ NtGdiAddFontResource(PUNICODE_STRING Filename, DWORD fl) return 0; } - Status = MmCopyFromCaller(SafeFileName.Buffer, src, SafeFileName.MaximumLength); + /* Prepend '\??\' */ + RtlCopyMemory(SafeFileName.Buffer, L"\\??\\", 4 * sizeof(WCHAR)); + + Status = MmCopyFromCaller(SafeFileName.Buffer + 4, src, SafeFileName.MaximumLength - (4 * sizeof(WCHAR))); if(!NT_SUCCESS(Status)) { ExFreePool(SafeFileName.Buffer); From 45d5d0cea1d0667967c9ee9770f72d57a60b1f96 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 29 May 2004 15:10:28 +0000 Subject: [PATCH 1264/1463] - Correctly initialize the startup info in WinExec. svn path=/trunk/; revision=9546 --- reactos/lib/kernel32/process/proc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/lib/kernel32/process/proc.c b/reactos/lib/kernel32/process/proc.c index 04500dadc8d..1bf9048a184 100644 --- a/reactos/lib/kernel32/process/proc.c +++ b/reactos/lib/kernel32/process/proc.c @@ -1,4 +1,4 @@ -/* $Id: proc.c,v 1.61 2004/03/14 18:16:40 weiden Exp $ +/* $Id: proc.c,v 1.62 2004/05/29 15:10:28 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -383,6 +383,7 @@ WinExec(LPCSTR lpCmdLine, HINSTANCE hInst; DWORD dosErr; + RtlZeroMemory(&StartupInfo, sizeof(StartupInfo)); StartupInfo.cb = sizeof(STARTUPINFOA); StartupInfo.wShowWindow = uCmdShow; StartupInfo.dwFlags = 0; From 8900df33c80f2c0b33b75bb55861323058c1c3cf Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 29 May 2004 15:53:56 +0000 Subject: [PATCH 1265/1463] - Changed font substitution: MS Sans Serif -> Bitstream Vera Sans. svn path=/trunk/; revision=9547 --- 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 ee30f9eafcf..608bf2d4780 100644 --- a/reactos/bootdata/hivesft.inf +++ b/reactos/bootdata/hivesft.inf @@ -48,6 +48,6 @@ HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SysFontSubstitutes","Arial",0 HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SysFontSubstitutes","Courier New",0x00000000,"Bitstream Vera Sans Mono" 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 Serif" +HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SysFontSubstitutes","MS Sans Serif",0x00000000,"Bitstream Vera Sans" ; EOF From dd2e0b0978cc00b74f1010c46a930ab387db2b0e Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Sat, 29 May 2004 17:00:41 +0000 Subject: [PATCH 1266/1463] Added csq to build. svn path=/trunk/; revision=9548 --- reactos/drivers/lib/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/drivers/lib/Makefile b/reactos/drivers/lib/Makefile index 2da325d05f0..4b6e3ca5442 100644 --- a/reactos/drivers/lib/Makefile +++ b/reactos/drivers/lib/Makefile @@ -6,7 +6,7 @@ PATH_TO_TOP = ../.. include $(PATH_TO_TOP)/rules.mak -DRIVERS = bzip2 +DRIVERS = bzip2 csq all: $(DRIVERS) From 9136088529f0b581515973f69d144fb73bf4db05 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 29 May 2004 21:15:58 +0000 Subject: [PATCH 1267/1463] - Fixed DPRINTs. - Added support for including other .inf files while building the standard hives. svn path=/trunk/; revision=9551 --- reactos/tools/mkhive/binhive.c | 12 ++++++------ reactos/tools/mkhive/mkhive.c | 12 ++++++++++-- reactos/tools/mkhive/registry.c | 16 ++++++++-------- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/reactos/tools/mkhive/binhive.c b/reactos/tools/mkhive/binhive.c index fd6fd63c232..b4946d605c5 100644 --- a/reactos/tools/mkhive/binhive.c +++ b/reactos/tools/mkhive/binhive.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: binhive.c,v 1.10 2004/05/09 14:50:09 ekohl Exp $ +/* $Id: binhive.c,v 1.11 2004/05/29 21:15:58 navaraf Exp $ * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS hive maker * FILE: tools/mkhive/binhive.c @@ -351,7 +351,7 @@ CmiCreateRegistryHive (PCHAR KeyName) } memset (Hive, 0, sizeof(REGISTRY_HIVE)); - DPRINT("Hive %x\n", Hive); + DPRINT("Hive %p\n", Hive); /* Create hive beader (aka 'base block') */ Hive->HiveHeader = (PHIVE_HEADER) malloc (REG_BLOCK_SIZE); @@ -457,7 +457,7 @@ CmiDestroyRegistryHive (PREGISTRY_HIVE Hive) Bin = Hive->BlockList[i]; DPRINT ("Bin[%lu]: Offset 0x%lx Size 0x%lx\n", - i, Bin->BlockOffset, Bin->BlockSize); + i, Bin->BinOffset, Bin->BinSize); free (Bin); } @@ -514,7 +514,7 @@ CmiMergeFree(PREGISTRY_HIVE RegistryHive, PHBIN Bin; ULONG i; - DPRINT("CmiMergeFree(Block %lx Offset %lx Size %lx) called\n", + DPRINT("CmiMergeFree(Block %p Offset %lx Size %lx) called\n", FreeBlock, FreeOffset, FreeBlock->CellSize); CmiGetCell (RegistryHive, @@ -608,7 +608,7 @@ CmiAddFree(PREGISTRY_HIVE RegistryHive, assert(RegistryHive); assert(FreeBlock); - DPRINT("FreeBlock %.08lx FreeOffset %.08lx\n", + DPRINT("FreeBlock %p FreeOffset %.08lx\n", FreeBlock, FreeOffset); /* Merge free blocks */ @@ -1376,7 +1376,7 @@ CmiWriteHive(PREGISTRY_HIVE Hive, Bin = Hive->BlockList[i]; DPRINT ("Bin[%lu]: Offset 0x%lx Size 0x%lx\n", - i, Bin->BlockOffset, Bin->BlockSize); + i, Bin->BinOffset, Bin->BinSize); fwrite (Bin, Bin->BinSize, 1, File); } diff --git a/reactos/tools/mkhive/mkhive.c b/reactos/tools/mkhive/mkhive.c index fa8f536e036..dfed05995c3 100644 --- a/reactos/tools/mkhive/mkhive.c +++ b/reactos/tools/mkhive/mkhive.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: mkhive.c,v 1.3 2003/11/14 17:13:36 weiden Exp $ +/* $Id: mkhive.c,v 1.4 2004/05/29 21:15:58 navaraf Exp $ * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS hive maker * FILE: tools/mkhive/mkhive.c @@ -47,9 +47,10 @@ void usage (void) { - printf ("Usage: mkhive <srcdir> <dstdir>\n\n"); + printf ("Usage: mkhive <srcdir> <dstdir> <addinf>\n\n"); printf (" srcdir - inf files are read from this directory\n"); printf (" dstdir - binary hive files are created in this directory\n"); + printf (" addinf - additional inf files with full path\n"); } void convert_path(char *dst, char *src) @@ -84,6 +85,7 @@ void convert_path(char *dst, char *src) int main (int argc, char *argv[]) { char FileName[PATH_MAX]; + int Param; printf ("Binary hive maker\n"); @@ -115,6 +117,12 @@ int main (int argc, char *argv[]) strcat (FileName, "hivedef.inf"); ImportRegistryFile (FileName, "AddReg", FALSE); + for (Param = 3; Param < argc; Param++) + { + convert_path (FileName, argv[Param]); + ImportRegistryFile (FileName, "AddReg", FALSE); + } + convert_path (FileName, argv[2]); strcat (FileName, DIR_SEPARATOR_STRING); strcat (FileName, "system"); diff --git a/reactos/tools/mkhive/registry.c b/reactos/tools/mkhive/registry.c index 6afd9051de8..bf32069deca 100644 --- a/reactos/tools/mkhive/registry.c +++ b/reactos/tools/mkhive/registry.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: registry.c,v 1.8 2003/11/14 17:13:36 weiden Exp $ +/* $Id: registry.c,v 1.9 2004/05/29 21:15:58 navaraf Exp $ * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS hive maker * FILE: tools/mkhive/registry.c @@ -171,12 +171,12 @@ RegCreateKey(HKEY ParentKey, Ptr = CurrentKey->SubKeyList.Flink; while (Ptr != &CurrentKey->SubKeyList) { - DPRINT ("Ptr 0x%x\n", Ptr); + DPRINT ("Ptr 0x%p\n", Ptr); SearchKey = CONTAINING_RECORD(Ptr, KEY, KeyList); - DPRINT ("SearchKey 0x%x\n", SearchKey); + DPRINT ("SearchKey 0x%p\n", SearchKey); DPRINT ("Searching '%s'\n", SearchKey->Name); if (strncasecmp (SearchKey->Name, name, subkeyLength) == 0) break; @@ -211,8 +211,8 @@ RegCreateKey(HKEY ParentKey, memcpy(NewKey->Name, name, subkeyLength); NewKey->Name[subkeyLength] = 0; - DPRINT ("NewKey 0x%x\n", NewKey); - DPRINT ("NewKey '%s' Length %d\n", NewKey->Name, NewKey->NameSize); + DPRINT ("NewKey 0x%p\n", NewKey); + DPRINT ("NewKey '%s' Length %ld\n", NewKey->Name, NewKey->NameSize); CurrentKey = NewKey; } @@ -279,7 +279,7 @@ RegEnumKey(HKEY Key, KEY, KeyList); - DPRINT ("Name '%s' Length %d\n", SearchKey->Name, SearchKey->NameSize); + DPRINT ("Name '%s' Length %ld\n", SearchKey->Name, SearchKey->NameSize); Size = min(SearchKey->NameSize, *NameSize); *NameSize = Size; @@ -349,13 +349,13 @@ RegOpenKey(HKEY ParentKey, Ptr = CurrentKey->SubKeyList.Flink; while (Ptr != &CurrentKey->SubKeyList) { - DPRINT ("Ptr 0x%x\n", Ptr); + DPRINT ("Ptr 0x%p\n", Ptr); SearchKey = CONTAINING_RECORD(Ptr, KEY, KeyList); - DPRINT ("SearchKey 0x%x\n", SearchKey); + DPRINT ("SearchKey 0x%p\n", SearchKey); DPRINT ("Searching '%s'\n", SearchKey->Name); if (strncasecmp(SearchKey->Name, name, subkeyLength) == 0) From ceb8aca19426d97cdde37c65bc3e1a6f1e8df6b2 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 29 May 2004 21:21:06 +0000 Subject: [PATCH 1268/1463] - Fix the "use of cast expressions as lvalues is deprecated" warning. svn path=/trunk/; revision=9552 --- reactos/lib/kjs/ksrc/iostream.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/kjs/ksrc/iostream.c b/reactos/lib/kjs/ksrc/iostream.c index 75ed6c17eed..7e084e2a89e 100644 --- a/reactos/lib/kjs/ksrc/iostream.c +++ b/reactos/lib/kjs/ksrc/iostream.c @@ -24,7 +24,7 @@ /* * $Source: /cygdrive/c/RCVS/CVS/ReactOS/reactos/lib/kjs/ksrc/iostream.c,v $ - * $Id: iostream.c,v 1.1 2004/01/10 20:38:17 arty Exp $ + * $Id: iostream.c,v 1.2 2004/05/29 21:21:06 navaraf Exp $ */ #include "jsint.h" @@ -88,7 +88,7 @@ js_iostream_read (JSIOStream *stream, void *ptr, size_t size) stream->bufpos += got; size -= got; - (unsigned char *) ptr += got; + ptr = (void *)((unsigned char *)ptr + got); total += got; } else From 716bbd44ba4d8c4cf62f8a97588f8aec47e895bf Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sat, 29 May 2004 21:24:48 +0000 Subject: [PATCH 1269/1463] - Moved the definition of all dll base addresses to baseaddress.cfg. svn path=/trunk/; revision=9553 --- reactos/baseaddress.cfg | 142 +++++++++++++-------- reactos/lib/advapi32/makefile | 4 +- reactos/lib/cabinet/Makefile.ros-template | 4 +- reactos/lib/cards/Makefile | 2 +- reactos/lib/comctl32/Makefile.ros-template | 4 +- reactos/lib/comdlg32/Makefile.ros-template | 2 +- reactos/lib/commctrl/Makefile | 2 +- reactos/lib/coredll/Makefile | 2 +- reactos/lib/cpl/sysdm/Makefile | 4 +- reactos/lib/crtdll/makefile | 4 +- reactos/lib/d3d8thk/Makefile | 2 +- reactos/lib/devmgr/Makefile | 4 +- reactos/lib/dinput/Makefile | 2 + reactos/lib/dnsapi/Makefile | 4 +- reactos/lib/dsound/Makefile | 2 + reactos/lib/expat/Makefile | 4 +- reactos/lib/fmifs/makefile | 4 +- reactos/lib/gdi32/makefile | 4 +- reactos/lib/glu32/Makefile | 2 + reactos/lib/imagehlp/makefile | 2 +- reactos/lib/imm32/Makefile | 2 +- reactos/lib/iphlpapi/Makefile.ros-template | 4 +- reactos/lib/iprtprio/makefile | 2 +- reactos/lib/kernel32/makefile | 4 +- reactos/lib/lzexpand/Makefile | 2 +- reactos/lib/mmdrv/Makefile | 2 + reactos/lib/mpr/Makefile.ros-template | 4 +- reactos/lib/msacm/Makefile.ros-template | 4 +- reactos/lib/msafd/makefile | 4 +- reactos/lib/msgina/Makefile | 4 +- reactos/lib/msimg32/Makefile | 2 +- reactos/lib/msvcrt/Makefile | 4 +- reactos/lib/msvcrt20/Makefile | 2 +- reactos/lib/mswsock/Makefile | 4 +- reactos/lib/netapi32/Makefile.ros-template | 4 +- reactos/lib/odbc32/Makefile.ros-template | 4 +- reactos/lib/ole32/Makefile.ros-template | 4 +- reactos/lib/oleaut32/Makefile.ros-template | 4 +- reactos/lib/oledlg/Makefile.ros-template | 4 +- reactos/lib/olepro32/Makefile.ros-template | 4 +- reactos/lib/opengl32/Makefile | 2 + reactos/lib/packet/makefile | 4 +- reactos/lib/psapi/makefile | 4 +- reactos/lib/richedit/Makefile.ros-template | 4 +- reactos/lib/rpcrt4/Makefile.ros-template | 4 +- reactos/lib/samlib/makefile | 4 +- reactos/lib/secur32/Makefile | 4 +- reactos/lib/setupapi/Makefile.ros-template | 4 +- reactos/lib/shell32/Makefile.ros-template | 4 +- reactos/lib/shlwapi/Makefile.ros-template | 4 +- reactos/lib/snmpapi/makefile | 2 +- reactos/lib/syssetup/Makefile | 4 +- reactos/lib/twain/Makefile | 4 +- reactos/lib/unicode/Makefile.ros-template | 4 +- reactos/lib/user32/Makefile | 4 +- reactos/lib/userenv/makefile | 2 +- reactos/lib/version/makefile | 4 +- reactos/lib/wininet/Makefile | 4 +- reactos/lib/winmm/Makefile.ros-template | 4 +- reactos/lib/winspool/Makefile | 2 +- reactos/lib/ws2_32/makefile | 4 +- reactos/lib/ws2help/makefile | 2 +- reactos/lib/wshirda/makefile | 2 +- reactos/lib/wsock32/Makefile | 4 +- reactos/tools/helper.mk | 4 +- 65 files changed, 198 insertions(+), 158 deletions(-) diff --git a/reactos/baseaddress.cfg b/reactos/baseaddress.cfg index 581caefe622..c149050787f 100644 --- a/reactos/baseaddress.cfg +++ b/reactos/baseaddress.cfg @@ -1,62 +1,92 @@ +# $Id: baseaddress.cfg,v 1.16 2004/05/29 21:24:42 hbirr Exp $ +# # Please try to keep this up2date. Please clean up # after yourself. -REACTOS +# REACTOS -lib/advapi32 TARGET_BASE=0x77dc0000 -lib/comctl32 TARGET_BASE=0x76160000 -lib/comdlg32 TARGET_BASE=0x76200000 -lib/cabinet TARGET_BASE=0x75120000 -lib/crtdll TARGET_BASE=0x77630000 -lib/expat TARGET_BASE=0x79000000 -lib/fmifs TARGET_BASE=0x76df0000 -lib/gdi32 TARGET_BASE=0x77ed0000 -lib/imagehlp TARGET_BASE=0x76c90000 -lib/imm32 TARGET_BASE=0x75e60000 -lib/kernel32 TARGET_BASE=0x77f00000 -lib/lzexpand TARGET_BASE=0x73d80000 -lib/mpr TARGET_BASE=0x76620000 -lib/msafd TARGET_BASE=0x777a0000 -lib/msvcrt TARGET_BASE=0x78000000 -lib/mswsock TARGET_BASE=0x71a30000 -lib/ntdll TARGET_BASE=0x77f80000 -lib/ole32 TARGET_BASE=0x77a50000 -lib/oleaut32 TARGET_BASE=0x76260000 -lib/oledlg TARGET_BASE=0x74d00000 -lib/psapi TARGET_BASE=0x68F70000 -lib/richedit TARGET_BASE=0x76340000 -lib/rpcrt4 TARGET_BASE=0x76000000 -lib/samlib TARGET_BASE=0x750C0000 -lib/secur32 TARGET_BASE=0x10000000 -lib/setupapi TARGET_BASE=0x76660000 -lib/shell32 TARGET_BASE=0x77260000 -lib/shlwapi TARGET_BASE=0x76120000 -lib/syssetup TARGET_BASE=0x74A30000 -lib/user32 TARGET_BASE=0x77e70000 -lib/userenv TARGET_BASE=0x74850000 -lib/version TARGET_BASE=0x77a90000 -lib/winspool TARGET_BASE=0x77800000 -lib/ws2_32 TARGET_BASE=0x77780000 -lib/wsock32 TARGET_BASE=0x71ab0000 -services/dd/vga/display TARGET_BASE=0x70000000 -services/net/wshtcpip TARGET_BASE=0x777c0000 -subsys/psx/lib/psxdll TARGET_BASE=0x68EB0000 -subsys/psx/lib/psxx # TARGET_BASE=0x77dc0000 -subsys/win32k TARGET_BASE=0x0 +TARGET_BASE_LIB_ADVAPI32 =0x77dc0000 +TARGET_BASE_LIB_CABINET =0x75120000 +TARGET_BASE_LIB_CARDS =0x701a0000 +TARGET_BASE_LIB_COMCTL32 =0x76160000 +TARGET_BASE_LIB_COMDLG32 =0x76200000 +TARGET_BASE_LIB_COMMCTRL =0x75e60000 +TARGET_BASE_LIB_COREDLL =0x73D80000 +TARGET_BASE_LIB_CPL_SYSDM =0x58760000 +TARGET_BASE_LIB_CRTDLL =0x77630000 +TARGET_BASE_LIB_D3D8THK =0x76340000 +TARGET_BASE_LIB_DEVMGR =0x72A90000 +TARGET_BASE_LIB_DINPUT =0x50000000 +TARGET_BASE_LIB_DNSAPI =0x78000000 +TARGET_BASE_LIB_DSOUND =0x50000000 +TARGET_BASE_LIB_EXPAT =0x79000000 +TARGET_BASE_LIB_FMIFS =0x76df0000 +TARGET_BASE_LIB_GDI32 =0x77ed0000 +TARGET_BASE_LIB_GLU32 =0x50000000 +TARGET_BASE_LIB_IMAGEHLP =0x76c90000 +TARGET_BASE_LIB_IMM32 =0x75e60000 +TARGET_BASE_LIB_IPHLPAPI =0x77300000 +TARGET_BASE_LIB_IPRTPRIO =0x777c0000 +TARGET_BASE_LIB_KERNEL32 =0x77f00000 +TARGET_BASE_LIB_LZEXPAND =0x73d80000 +TARGET_BASE_LIB_MMDRV =0x50000000 +TARGET_BASE_LIB_MPR =0x76620000 +TARGET_BASE_LIB_MSACM =0x77300000 +TARGET_BASE_LIB_MSAFD =0x777a0000 +TARGET_BASE_LIB_MSGINA =0x75970000 +TARGET_BASE_LIB_MSIMG32 =0x69cc0000 +TARGET_BASE_LIB_MSVCRT =0x78000000 +TARGET_BASE_LIB_MSVCRT20 =0x78000000 +TARGET_BASE_LIB_MSWSOCK =0x71a30000 +TARGET_BASE_LIB_NETAPI32 =0x71C00000 +TARGET_BASE_LIB_NTDLL =0x77f80000 +TARGET_BASE_LIB_ODBC32 =0x76660000 +TARGET_BASE_LIB_OLE32 =0x77a50000 +TARGET_BASE_LIB_OLEAUT32 =0x76260000 +TARGET_BASE_LIB_OLEDLG =0x74d00000 +TARGET_BASE_LIB_OLEPRO32 =0x77a50000 +TARGET_BASE_LIB_OPENGL32 =0x50000000 +TARGET_BASE_LIB_PACKET =0x77780000 +TARGET_BASE_LIB_PSAPI =0x68F70000 +TARGET_BASE_LIB_RICHEDIT =0x76340000 +TARGET_BASE_LIB_RPCRT4 =0x76000000 +TARGET_BASE_LIB_SAMLIB =0x750C0000 +TARGET_BASE_LIB_SECURE32 =0x10000000 +TARGET_BASE_LIB_SETUPAPI =0x76660000 +TARGET_BASE_LIB_SHELL32 =0x77260000 +TARGET_BASE_LIB_SHLWAPI =0x76120000 +TARGET_BASE_LIB_SNMPAPI =0x777c0000 +TARGET_BASE_LIB_SYSSETUP =0x74A30000 +TARGET_BASE_LIB_TWAIN_32 =0x76380000 +TARGET_BASE_LIB_UNICODE =0x6b200000 +TARGET_BASE_LIB_USER32 =0x77e60000 +TARGET_BASE_LIB_USERENV =0x74850000 +TARGET_BASE_LIB_VERSION =0x77a90000 +TARGET_BASE_LIB_WININET =0x70200000 +TARGET_BASE_LIB_WINMM =0x777c0000 +TARGET_BASE_LIB_WINSPOOL =0x77800000 +TARGET_BASE_LIB_W2_32 =0x77780000 +TARGET_BASE_LIB_WS2HELP =0x777c0000 +TARGET_BASE_LIB_WSHIRDA =0x777c0000 +TARGET_BASE_LIB_WSOCK32 =0x71ab0000 +TARGET_BASE_VGA_DISPLAY =0x70000000 +TARGET_BASE_NET_WSHTCPIP =0x777c0000 +TARGET_BASE_PSX_LIB_PSXDLL =0x68EB0000 +# TARGET_BASE_PSX_LIB_PSXX =0x77dc0000 -WINE +# WINE -dlls/ddraw TARGET_BASE=0x76240000 -dlls/dinput TARGET_BASE=0x76280000 -dlls/dplay TARGET_BASE=0x76320000 -dlls/dplayx TARGET_BASE=0x76310000 -dlls/mapi32 TARGET_BASE=0x76430000 -dlls/olecli TARGET_BASE=0x76070000 -dlls/olepro32 TARGET_BASE=0x76060000 -dlls/olesvr TARGET_BASE=0x76080000 -dlls/url TARGET_BASE=0x76530000 -dlls/urlmon TARGET_BASE=0x76730000 -dlls/serialui TARGET_BASE=0x76370000 -dlls/shdocvw TARGET_BASE=0x76190000 -dlls/shfolder TARGET_BASE=0x76180000 -unicode/wine_unicode TARGET_BASE=0x76590000 #Do not use +#dlls/ddraw TARGET_BASE=0x76240000 +#dlls/dinput TARGET_BASE=0x76280000 +#dlls/dplay TARGET_BASE=0x76320000 +#dlls/dplayx TARGET_BASE=0x76310000 +#dlls/mapi32 TARGET_BASE=0x76430000 +#dlls/olecli TARGET_BASE=0x76070000 +#dlls/olepro32 TARGET_BASE=0x76060000 +#dlls/olesvr TARGET_BASE=0x76080000 +#dlls/url TARGET_BASE=0x76530000 +#dlls/urlmon TARGET_BASE=0x76730000 +#dlls/serialui TARGET_BASE=0x76370000 +#dlls/shdocvw TARGET_BASE=0x76190000 +#dlls/shfolder TARGET_BASE=0x76180000 +#unicode/wine_unicode TARGET_BASE=0x76590000 #Do not use diff --git a/reactos/lib/advapi32/makefile b/reactos/lib/advapi32/makefile index b744dab612a..e4ff8528f03 100644 --- a/reactos/lib/advapi32/makefile +++ b/reactos/lib/advapi32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.39 2004/03/25 11:30:07 ekohl Exp $ +# $Id: makefile,v 1.40 2004/05/29 21:24:42 hbirr Exp $ PATH_TO_TOP = ../.. @@ -13,7 +13,7 @@ TARGET_LFLAGS = -nostartfiles -nostdlib TARGET_SDKLIBS = ntdll.a kernel32.a libwine.a msvcrt.a -TARGET_BASE = 0x77DB0000 +TARGET_BASE = $(TARGET_BASE_LIB_ADVAPI32) MISC_OBJECTS = \ misc/dllmain.o \ diff --git a/reactos/lib/cabinet/Makefile.ros-template b/reactos/lib/cabinet/Makefile.ros-template index 1703af0db2c..fb90c0d5dd5 100644 --- a/reactos/lib/cabinet/Makefile.ros-template +++ b/reactos/lib/cabinet/Makefile.ros-template @@ -1,4 +1,4 @@ -# $Id: Makefile.ros-template,v 1.2 2004/01/28 19:34:44 navaraf Exp $ +# $Id: Makefile.ros-template,v 1.3 2004/05/29 21:24:42 hbirr Exp $ TARGET_NAME = cabinet @@ -8,7 +8,7 @@ TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ TARGET_SDKLIBS = @IMPORTS@ libwine.a wine_uuid.a ntdll.a -TARGET_BASE = 0x75120000 +TARGET_BASE = $(TARGET_BASE_LIB_CABINET) TARGET_RC_SRCS = @RC_SRCS@ TARGET_RC_BINSRC = @RC_BINSRC@ diff --git a/reactos/lib/cards/Makefile b/reactos/lib/cards/Makefile index 39e65e71294..7453c66d5f6 100644 --- a/reactos/lib/cards/Makefile +++ b/reactos/lib/cards/Makefile @@ -4,7 +4,7 @@ TARGET_TYPE = dynlink TARGET_NAME = cards -TARGET_BASE = 0x701a0000 +TARGET_BASE = $(TARGET_BASE_LIB_CARDS) TARGET_CFLAGS = -fno-builtin -D__USE_W32API diff --git a/reactos/lib/comctl32/Makefile.ros-template b/reactos/lib/comctl32/Makefile.ros-template index fff925149ff..37272100b65 100644 --- a/reactos/lib/comctl32/Makefile.ros-template +++ b/reactos/lib/comctl32/Makefile.ros-template @@ -1,4 +1,4 @@ -# $Id: Makefile.ros-template,v 1.2 2004/01/12 23:48:37 sedwards Exp $ +# $Id: Makefile.ros-template,v 1.3 2004/05/29 21:24:42 hbirr Exp $ TARGET_NAME = comctl32 @@ -8,7 +8,7 @@ TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ TARGET_SDKLIBS = @IMPORTS@ winmm.a libwine.a wine_uuid.a ntdll.a -TARGET_BASE = 0x76160000 +TARGET_BASE = $(TARGET_BASE_LIB_COMCTL32) TARGET_RC_SRCS = @RC_SRCS@ TARGET_RC_BINSRC = @RC_BINSRC@ diff --git a/reactos/lib/comdlg32/Makefile.ros-template b/reactos/lib/comdlg32/Makefile.ros-template index f470da9de14..5fc6347b0f4 100644 --- a/reactos/lib/comdlg32/Makefile.ros-template +++ b/reactos/lib/comdlg32/Makefile.ros-template @@ -7,7 +7,7 @@ TARGET_CFLAGS = -D__REACTOS__ @EXTRADEFS@ TARGET_SDKLIBS = @IMPORTS@ libwine.a libwine_unicode.a wine_uuid.a ntdll.a winspool.a -TARGET_BASE = 0x76200000 +TARGET_BASE = $(TARGET_BASE_LIB_COMDLG32) TARGET_RC_SRCS = @RC_SRCS@ TARGET_RC_BINSRC = @RC_BINSRC@ diff --git a/reactos/lib/commctrl/Makefile b/reactos/lib/commctrl/Makefile index c1a29b85932..ee15267ac76 100644 --- a/reactos/lib/commctrl/Makefile +++ b/reactos/lib/commctrl/Makefile @@ -5,7 +5,7 @@ TARGET_TYPE = dynlink TARGET_NAME = commctrl -TARGET_BASE=0x75e60000 +TARGET_BASE=$(TARGET_BASE_LIB_COMMCTRL) # require os code to explicitly request A/W version of structs/functions TARGET_CFLAGS += -D_DISABLE_TIDENTS -Wall -Werror diff --git a/reactos/lib/coredll/Makefile b/reactos/lib/coredll/Makefile index 0643ca69d63..b6c109e1393 100644 --- a/reactos/lib/coredll/Makefile +++ b/reactos/lib/coredll/Makefile @@ -5,7 +5,7 @@ TARGET_TYPE = dynlink TARGET_NAME = coredll -TARGET_BASE=0x73D80000 +TARGET_BASE=$(TARGET_BASE_LIB_COREDLL) # require os code to explicitly request A/W version of structs/functions TARGET_CFLAGS += -D_DISABLE_TIDENTS -Wall -Werror diff --git a/reactos/lib/cpl/sysdm/Makefile b/reactos/lib/cpl/sysdm/Makefile index a4640c9451f..20f88d4b9b8 100644 --- a/reactos/lib/cpl/sysdm/Makefile +++ b/reactos/lib/cpl/sysdm/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.1 2004/03/08 14:24:47 weiden Exp $ +# $Id: Makefile,v 1.2 2004/05/29 21:24:43 hbirr Exp $ PATH_TO_TOP = ../../.. @@ -10,7 +10,7 @@ TARGET_NAME = sysdm TARGET_INSTALLDIR = system32 -TARGET_BASE = 0x58760000 +TARGET_BASE = $(TARGET_BASE_LIB_CPL_SYSDM) TARGET_CFLAGS = \ -I./include \ diff --git a/reactos/lib/crtdll/makefile b/reactos/lib/crtdll/makefile index 5c596be696d..696e3a6c342 100644 --- a/reactos/lib/crtdll/makefile +++ b/reactos/lib/crtdll/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.63 2004/02/26 12:23:29 ekohl Exp $ +# $Id: makefile,v 1.64 2004/05/29 21:24:43 hbirr Exp $ PATH_TO_TOP = ../.. @@ -10,7 +10,7 @@ TARGET_TYPE = dynlink TARGET_NAME = crtdll -TARGET_BASE = 0x77630000 +TARGET_BASE = $(TARGET_BASE_LIB_CRTDLL) TARGET_LFLAGS = -nostartfiles -nostdlib diff --git a/reactos/lib/d3d8thk/Makefile b/reactos/lib/d3d8thk/Makefile index 7d6374518f3..ee0dd9deecc 100644 --- a/reactos/lib/d3d8thk/Makefile +++ b/reactos/lib/d3d8thk/Makefile @@ -4,7 +4,7 @@ TARGET_TYPE = dynlink TARGET_NAME = d3d8thk -#TARGET_BASE = 0x76340000 +TARGET_BASE = $(TARGET_BASE_LIB_D3D8THK) # require os code to explicitly request A/W version of structs/functions TARGET_CFLAGS += -D_DISABLE_TIDENTS -Werror -Wall diff --git a/reactos/lib/devmgr/Makefile b/reactos/lib/devmgr/Makefile index 0e66fd2705d..434e610f38a 100644 --- a/reactos/lib/devmgr/Makefile +++ b/reactos/lib/devmgr/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.1 2004/04/04 21:49:15 weiden Exp $ +# $Id: Makefile,v 1.2 2004/05/29 21:24:43 hbirr Exp $ PATH_TO_TOP = ../.. @@ -8,7 +8,7 @@ TARGET_NAME = devmgr TARGET_INSTALLDIR = system32 -TARGET_BASE = 0x72A90000 +TARGET_BASE = $(TARGET_BASE_LIB_DEVMGR) TARGET_CFLAGS = \ -I./include \ diff --git a/reactos/lib/dinput/Makefile b/reactos/lib/dinput/Makefile index 3665693b6b7..127f4a07731 100644 --- a/reactos/lib/dinput/Makefile +++ b/reactos/lib/dinput/Makefile @@ -14,6 +14,8 @@ TARGET_CFLAGS += -D_DISABLE_TIDENTS -Wall -Werror TARGET_SDKLIBS = ntdll.a gdi32.a +TARGET_BASE = $(TARGET_BASE_LIB_DINPUT) + TARGET_OBJECTS = \ dinput.o diff --git a/reactos/lib/dnsapi/Makefile b/reactos/lib/dnsapi/Makefile index 83e88f591dc..3841062eff1 100644 --- a/reactos/lib/dnsapi/Makefile +++ b/reactos/lib/dnsapi/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.4 2003/12/25 09:52:44 arty Exp $ +# $Id: Makefile,v 1.5 2004/05/29 21:24:43 hbirr Exp $ PATH_TO_TOP = ../.. @@ -8,7 +8,7 @@ TARGET_TYPE = dynlink TARGET_NAME = dnsapi -TARGET_BASE = 0x78000000 +TARGET_BASE = $(TARGET_BASE_LIB_DNSAPI) TARGET_LFLAGS = -nostartfiles -g --kill-at diff --git a/reactos/lib/dsound/Makefile b/reactos/lib/dsound/Makefile index e1176a82304..ea71955204c 100644 --- a/reactos/lib/dsound/Makefile +++ b/reactos/lib/dsound/Makefile @@ -14,6 +14,8 @@ TARGET_CFLAGS += -D_DISABLE_TIDENTS -Wall -Werror TARGET_SDKLIBS = ntdll.a gdi32.a +TARGET_BASE = $(TARGET_BASE_LIB_DSOUND) + TARGET_OBJECTS = \ dsound.o diff --git a/reactos/lib/expat/Makefile b/reactos/lib/expat/Makefile index c7c0db74b21..a1de9e0c7a0 100644 --- a/reactos/lib/expat/Makefile +++ b/reactos/lib/expat/Makefile @@ -1,11 +1,11 @@ -# $Id: Makefile,v 1.2 2004/03/24 09:39:37 mf Exp $ +# $Id: Makefile,v 1.3 2004/05/29 21:24:43 hbirr Exp $ PATH_TO_TOP = ../.. TARGET_NAME = libexpat TARGET_TYPE = dynlink -TARGET_BASE = 0x79000000 +TARGET_BASE = $(TARGET_BASE_LIB_EXPAT) TARGET_NORC = yes TARGET_DEFONLY = yes TARGET_DEFNAME = lib/libexpat diff --git a/reactos/lib/fmifs/makefile b/reactos/lib/fmifs/makefile index a04e7ea675b..7038f4ae836 100644 --- a/reactos/lib/fmifs/makefile +++ b/reactos/lib/fmifs/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.21 2004/02/23 11:55:12 ekohl Exp $ +# $Id: makefile,v 1.22 2004/05/29 21:24:43 hbirr Exp $ PATH_TO_TOP = ../.. @@ -6,7 +6,7 @@ TARGET_TYPE = dynlink TARGET_NAME = fmifs -TARGET_BASE = 0x76df0000 +TARGET_BASE = $(TARGET_BASE_LIB_FMIFS) TARGET_ENTRY = _InitializeFmIfs@12 diff --git a/reactos/lib/gdi32/makefile b/reactos/lib/gdi32/makefile index 1e4d98f5d61..e28ca6e1ae6 100644 --- a/reactos/lib/gdi32/makefile +++ b/reactos/lib/gdi32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.37 2004/04/09 20:03:11 navaraf Exp $ +# $Id: makefile,v 1.38 2004/05/29 21:24:43 hbirr Exp $ PATH_TO_TOP = ../.. @@ -6,7 +6,7 @@ TARGET_TYPE = dynlink TARGET_NAME = gdi32 -TARGET_BASE = 0x77ed0000 +TARGET_BASE = $(TARGET_BASE_LIB_GDI32) TARGET_SDKLIBS = rosrtl.a ntdll.a advapi32.a kernel32.a diff --git a/reactos/lib/glu32/Makefile b/reactos/lib/glu32/Makefile index cc690069010..c29375c8f14 100644 --- a/reactos/lib/glu32/Makefile +++ b/reactos/lib/glu32/Makefile @@ -6,6 +6,8 @@ TARGET_NORC = yes TARGET_NAME = glu32 +TARGET_BASE = $(TARGET_BASE_LIB_GLU32) + TARGET_CFLAGS = -D__USE_W32API -DRESOLVE_3D_TEXTURE_SUPPORT -DBUILD_GL32 -DLIBRARYBUILD -Wall -Werror -Iinclude -Ilibnurbs/internals -Ilibnurbs/interface -Ilibnurbs/nurbtess TARGET_CPPFLAGS = $(TARGET_CFLAGS) diff --git a/reactos/lib/imagehlp/makefile b/reactos/lib/imagehlp/makefile index 27c6b512c0d..bf310baef35 100644 --- a/reactos/lib/imagehlp/makefile +++ b/reactos/lib/imagehlp/makefile @@ -36,7 +36,7 @@ TARGET_LFLAGS = -nostartfiles -nostdlib TARGET_SDKLIBS = libwine.a ntdll.a kernel32.a -TARGET_BASE = 0x76C90000 +TARGET_BASE = $(TARGET_BASE_LIB_IMAGEHLP) TARGET_OBJECTS = \ debug.o \ diff --git a/reactos/lib/imm32/Makefile b/reactos/lib/imm32/Makefile index 43cc3a66d13..8557e798a6c 100644 --- a/reactos/lib/imm32/Makefile +++ b/reactos/lib/imm32/Makefile @@ -5,7 +5,7 @@ TARGET_TYPE = dynlink TARGET_NAME = imm32 -TARGET_BASE=0x75e60000 +TARGET_BASE=$(TARGET_BASE_LIB_IMM32) # require os code to explicitly request A/W version of structs/functions TARGET_CFLAGS += -D_DISABLE_TIDENTS -D__USE_W32API diff --git a/reactos/lib/iphlpapi/Makefile.ros-template b/reactos/lib/iphlpapi/Makefile.ros-template index 622389c6314..50b1c6f7cdd 100644 --- a/reactos/lib/iphlpapi/Makefile.ros-template +++ b/reactos/lib/iphlpapi/Makefile.ros-template @@ -1,4 +1,4 @@ -# $Id: Makefile.ros-template,v 1.1 2004/02/25 07:41:50 arty Exp $ +# $Id: Makefile.ros-template,v 1.2 2004/05/29 21:24:44 hbirr Exp $ TARGET_NAME = iphlpapi @@ -8,7 +8,7 @@ TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ TARGET_SDKLIBS = @IMPORTS@ libwine.a advapi32.a kernel32.a ws2_32.a wine_uuid.a ntdll.a -TARGET_BASE = 0x77300000 +TARGET_BASE = $(TARGET_BASE_LIB_IPHLPAPI) TARGET_RC_SRCS = @RC_SRCS@ TARGET_RC_BINSRC = @RC_BINSRC@ diff --git a/reactos/lib/iprtprio/makefile b/reactos/lib/iprtprio/makefile index deaab01ef7b..5f1d34d6671 100644 --- a/reactos/lib/iprtprio/makefile +++ b/reactos/lib/iprtprio/makefile @@ -6,7 +6,7 @@ TARGET_TYPE = dynlink TARGET_NAME = iprtprio -TARGET_BASE = 0x777c0000 +TARGET_BASE = $(TARGET_BASE_LIB_IPRTPRIO) TARGET_CFLAGS = -DUNICODE diff --git a/reactos/lib/kernel32/makefile b/reactos/lib/kernel32/makefile index ba3a3f9ee0a..3ac8a5e71c7 100644 --- a/reactos/lib/kernel32/makefile +++ b/reactos/lib/kernel32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.79 2004/05/02 14:47:05 weiden Exp $ +# $Id: makefile,v 1.80 2004/05/29 21:24:44 hbirr Exp $ PATH_TO_TOP = ../.. @@ -8,7 +8,7 @@ TARGET_TYPE = dynlink TARGET_NAME = kernel32 -TARGET_BASE = 0x77f00000 +TARGET_BASE = $(TARGET_BASE_LIB_KERNEL32) # require os code to explicitly request A/W version of structs/functions TARGET_CFLAGS += -D_DISABLE_TIDENTS -Wall -Werror diff --git a/reactos/lib/lzexpand/Makefile b/reactos/lib/lzexpand/Makefile index 6e713ca9d4a..b7ec8925be5 100644 --- a/reactos/lib/lzexpand/Makefile +++ b/reactos/lib/lzexpand/Makefile @@ -5,7 +5,7 @@ TARGET_TYPE = dynlink TARGET_NAME = lz32 -TARGET_BASE=0x73D80000 +TARGET_BASE=$(TARGET_BASE_LIB_LZEXPAND) # require os code to explicitly request A/W version of structs/functions TARGET_CFLAGS += -D_DISABLE_TIDENTS -Wall -Werror diff --git a/reactos/lib/mmdrv/Makefile b/reactos/lib/mmdrv/Makefile index 7f1ab6cbf92..cff30e3f81e 100644 --- a/reactos/lib/mmdrv/Makefile +++ b/reactos/lib/mmdrv/Makefile @@ -16,6 +16,8 @@ TARGET_LFLAGS = TARGET_SDKLIBS = winmm.a +TARGET_BASE = $(TARGET_BASE_LIB_MMDRV) + TARGET_OBJECTS = \ auxil.o \ entry.o \ diff --git a/reactos/lib/mpr/Makefile.ros-template b/reactos/lib/mpr/Makefile.ros-template index f11beb5deb4..410ed9a553f 100644 --- a/reactos/lib/mpr/Makefile.ros-template +++ b/reactos/lib/mpr/Makefile.ros-template @@ -1,4 +1,4 @@ -# $Id: Makefile.ros-template,v 1.1 2004/02/01 19:48:44 gvg Exp $ +# $Id: Makefile.ros-template,v 1.2 2004/05/29 21:24:44 hbirr Exp $ TARGET_NAME = mpr @@ -8,7 +8,7 @@ TARGET_CFLAGS = -D__REACTOS__ TARGET_SDKLIBS = @IMPORTS@ kernel32.a libwine.a ntdll.a -TARGET_BASE = 0x76620000 +TARGET_BASE = $(TARGET_BASE_LIB_MPR) TARGET_NORC = yes diff --git a/reactos/lib/msacm/Makefile.ros-template b/reactos/lib/msacm/Makefile.ros-template index 42e0d76161d..ad08d203471 100644 --- a/reactos/lib/msacm/Makefile.ros-template +++ b/reactos/lib/msacm/Makefile.ros-template @@ -1,4 +1,4 @@ -# $Id: Makefile.ros-template,v 1.1 2004/03/10 15:22:44 silverblade Exp $ +# $Id: Makefile.ros-template,v 1.2 2004/05/29 21:24:44 hbirr Exp $ TARGET_NAME = iphlpapi @@ -8,7 +8,7 @@ TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ TARGET_SDKLIBS = @IMPORTS@ libwine.a advapi32.a kernel32.a ws2_32.a wine_uuid.a ntdll.a -TARGET_BASE = 0x77300000 +TARGET_BASE = $(TARGET_BASE_LIB_MSACM) TARGET_RC_SRCS = @RC_SRCS@ TARGET_RC_BINSRC = @RC_BINSRC@ diff --git a/reactos/lib/msafd/makefile b/reactos/lib/msafd/makefile index 7de028e97d3..e58319aef80 100644 --- a/reactos/lib/msafd/makefile +++ b/reactos/lib/msafd/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.12 2004/01/11 20:46:05 navaraf Exp $ +# $Id: makefile,v 1.13 2004/05/29 21:24:44 hbirr Exp $ PATH_TO_TOP = ../.. @@ -6,7 +6,7 @@ TARGET_TYPE = dynlink TARGET_NAME = msafd -TARGET_BASE = 0x777a0000 +TARGET_BASE = $(TARGET_BASE_LIB_MSAFD) TARGET_SDKLIBS = ntdll.a kernel32.a diff --git a/reactos/lib/msgina/Makefile b/reactos/lib/msgina/Makefile index 395e7200c8b..8c49998ade6 100644 --- a/reactos/lib/msgina/Makefile +++ b/reactos/lib/msgina/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.6 2003/12/07 01:12:58 weiden Exp $ +# $Id: Makefile,v 1.7 2004/05/29 21:24:44 hbirr Exp $ PATH_TO_TOP = ../.. @@ -8,7 +8,7 @@ TARGET_NAME = msgina TARGET_INSTALLDIR = system32 -TARGET_BASE = 0x75970000 +TARGET_BASE = $(TARGET_BASE_LIB_MSGINA) TARGET_CFLAGS = \ -I./include \ diff --git a/reactos/lib/msimg32/Makefile b/reactos/lib/msimg32/Makefile index c7f4b9d093e..beb73ae5edf 100644 --- a/reactos/lib/msimg32/Makefile +++ b/reactos/lib/msimg32/Makefile @@ -4,7 +4,7 @@ TARGET_TYPE = dynlink TARGET_NAME = msimg32 -TARGET_BASE = 0x69cc0000 +TARGET_BASE = $(TARGET_BASE_LIB_MSIMG32) TARGET_CFLAGS = -fno-builtin -D__USE_W32API diff --git a/reactos/lib/msvcrt/Makefile b/reactos/lib/msvcrt/Makefile index 381e1fe61d1..4598b157c81 100644 --- a/reactos/lib/msvcrt/Makefile +++ b/reactos/lib/msvcrt/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.43 2004/05/15 12:55:47 jfilby Exp $ +# $Id: Makefile,v 1.44 2004/05/29 21:24:44 hbirr Exp $ PATH_TO_TOP = ../.. @@ -8,7 +8,7 @@ TARGET_TYPE = dynlink TARGET_NAME = msvcrt -TARGET_BASE = 0x78000000 +TARGET_BASE = $(TARGET_BASE_LIB_MSVCRT) TARGET_LFLAGS = -nostartfiles --enable-stdcall-fixup diff --git a/reactos/lib/msvcrt20/Makefile b/reactos/lib/msvcrt20/Makefile index d69151d5c88..7b23526cd38 100644 --- a/reactos/lib/msvcrt20/Makefile +++ b/reactos/lib/msvcrt20/Makefile @@ -7,7 +7,7 @@ TARGET_TYPE = dynlink TARGET_NAME = msvcrt20 -TARGET_BASE = 0x78000000 +TARGET_BASE = $(TARGET_BASE_LIB_MSVCRT20) TARGET_LFLAGS = -nostartfiles --enable-stdcall-fixup diff --git a/reactos/lib/mswsock/Makefile b/reactos/lib/mswsock/Makefile index 4da4007311a..0c823e0af6d 100644 --- a/reactos/lib/mswsock/Makefile +++ b/reactos/lib/mswsock/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.3 2004/01/11 20:46:05 navaraf Exp $ +# $Id: Makefile,v 1.4 2004/05/29 21:24:44 hbirr Exp $ PATH_TO_TOP = ../.. @@ -6,7 +6,7 @@ TARGET_TYPE = dynlink TARGET_NAME = mswsock -TARGET_BASE = 0x71a30000 +TARGET_BASE = $(TARGET_BASE_LIB_MSWSOCK) TARGET_CFLAGS = \ -I./include \ diff --git a/reactos/lib/netapi32/Makefile.ros-template b/reactos/lib/netapi32/Makefile.ros-template index e5f77377503..020cb509d69 100644 --- a/reactos/lib/netapi32/Makefile.ros-template +++ b/reactos/lib/netapi32/Makefile.ros-template @@ -1,4 +1,4 @@ -# $Id: Makefile.ros-template,v 1.2 2004/03/07 14:33:13 navaraf Exp $ +# $Id: Makefile.ros-template,v 1.3 2004/05/29 21:24:44 hbirr Exp $ TARGET_NAME = netapi32 @@ -8,7 +8,7 @@ TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ TARGET_SDKLIBS = @IMPORTS@ libwine.a ntdll.a -TARGET_BASE = 0x71C00000 +TARGET_BASE = $(TARGET_BASE_LIB_NETAPI32) TARGET_RC_SRCS = @RC_SRCS@ TARGET_RC_BINSRC = @RC_BINSRC@ diff --git a/reactos/lib/odbc32/Makefile.ros-template b/reactos/lib/odbc32/Makefile.ros-template index 3558498f02f..dd6b4e309ea 100644 --- a/reactos/lib/odbc32/Makefile.ros-template +++ b/reactos/lib/odbc32/Makefile.ros-template @@ -1,4 +1,4 @@ -# $Id: Makefile.ros-template,v 1.1 2004/02/25 20:09:39 sedwards Exp $ +# $Id: Makefile.ros-template,v 1.2 2004/05/29 21:24:45 hbirr Exp $ TARGET_NAME = odbc32 @@ -8,7 +8,7 @@ TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ -D__WINESRC__ TARGET_SDKLIBS = @IMPORTS@ libwine.a ntdll.a -TARGET_BASE = 0x76660000 +TARGET_BASE = $(TARGET_BASE_LIB_ODBC32) TARGET_RC_SRCS = @RC_SRCS@ TARGET_RC_BINSRC = @RC_BINSRC@ diff --git a/reactos/lib/ole32/Makefile.ros-template b/reactos/lib/ole32/Makefile.ros-template index 699b5e7d552..3badc40a700 100644 --- a/reactos/lib/ole32/Makefile.ros-template +++ b/reactos/lib/ole32/Makefile.ros-template @@ -1,4 +1,4 @@ -# $Id: Makefile.ros-template,v 1.1 2004/01/02 19:49:45 gvg Exp $ +# $Id: Makefile.ros-template,v 1.2 2004/05/29 21:24:45 hbirr Exp $ TARGET_NAME = ole32 @@ -8,7 +8,7 @@ TARGET_CFLAGS = @EXTRADEFS@ TARGET_SDKLIBS = @IMPORTS@ libwine.a wine_uuid.a ntdll.a -TARGET_BASE = 0x77a50000 +TARGET_BASE = $(TARGET_BASE_LIB_OLE32) TARGET_RC_SRCS = @RC_SRCS@ TARGET_RC_BINSRC = @RC_BINSRC@ diff --git a/reactos/lib/oleaut32/Makefile.ros-template b/reactos/lib/oleaut32/Makefile.ros-template index d1d72c52409..00b2f1a5f75 100644 --- a/reactos/lib/oleaut32/Makefile.ros-template +++ b/reactos/lib/oleaut32/Makefile.ros-template @@ -1,4 +1,4 @@ -# $Id: Makefile.ros-template,v 1.3 2004/03/07 14:33:13 navaraf Exp $ +# $Id: Makefile.ros-template,v 1.4 2004/05/29 21:24:45 hbirr Exp $ TARGET_NAME = oleaut32 @@ -8,7 +8,7 @@ TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ TARGET_SDKLIBS = @IMPORTS@ winmm.a libwine.a wine_uuid.a libwine_unicode.a ntdll.a -TARGET_BASE = 0x76260000 +TARGET_BASE = $(TARGET_BASE_LIB_OLEAUT32) TARGET_RC_SRCS = @RC_SRCS@ TARGET_RC_BINSRC = @RC_BINSRC@ diff --git a/reactos/lib/oledlg/Makefile.ros-template b/reactos/lib/oledlg/Makefile.ros-template index 9d93d9a4463..2e5401be943 100644 --- a/reactos/lib/oledlg/Makefile.ros-template +++ b/reactos/lib/oledlg/Makefile.ros-template @@ -1,4 +1,4 @@ -# $Id: Makefile.ros-template,v 1.2 2004/01/28 19:34:45 navaraf Exp $ +# $Id: Makefile.ros-template,v 1.3 2004/05/29 21:24:45 hbirr Exp $ TARGET_NAME = oledlg @@ -8,7 +8,7 @@ TARGET_CFLAGS = @EXTRADEFS@ TARGET_SDKLIBS = @IMPORTS@ libwine.a wine_uuid.a ntdll.a -TARGET_BASE = 0x74D00000 +TARGET_BASE = $(TARGET_BASE_LIB_OLEDLG) TARGET_RC_SRCS = @RC_SRCS@ TARGET_RC_BINSRC = @RC_BINSRC@ diff --git a/reactos/lib/olepro32/Makefile.ros-template b/reactos/lib/olepro32/Makefile.ros-template index 833e09a6af2..8eb920c7d38 100644 --- a/reactos/lib/olepro32/Makefile.ros-template +++ b/reactos/lib/olepro32/Makefile.ros-template @@ -1,4 +1,4 @@ -# $Id: Makefile.ros-template,v 1.1 2004/02/26 02:01:13 sedwards Exp $ +# $Id: Makefile.ros-template,v 1.2 2004/05/29 21:24:45 hbirr Exp $ TARGET_NAME = olepro32 @@ -8,7 +8,7 @@ TARGET_CFLAGS = @EXTRADEFS@ TARGET_SDKLIBS = @IMPORTS@ libwine.a wine_uuid.a ntdll.a oleaut32.a -TARGET_BASE = 0x77a50000 +TARGET_BASE = $(TARGET_BASE_LIB_OLEPRO32) TARGET_RC_SRCS = @RC_SRCS@ TARGET_RC_BINSRC = @RC_BINSRC@ diff --git a/reactos/lib/opengl32/Makefile b/reactos/lib/opengl32/Makefile index 9a84d68e134..b3f181e628f 100644 --- a/reactos/lib/opengl32/Makefile +++ b/reactos/lib/opengl32/Makefile @@ -14,6 +14,8 @@ TARGET_CFLAGS += -D_DISABLE_TIDENTS -Wall -Werror TARGET_LFLAGS = -lgdi32 -lntdll +TARGET_BASE = $(TARGET_BASE_LIB_OPENGL32) + TARGET_SDKLIBS = gdi32.a ntdll.a # ntdll.a gdi32.a - may still need these diff --git a/reactos/lib/packet/makefile b/reactos/lib/packet/makefile index e5ae3e57e22..0146b1c8dfc 100644 --- a/reactos/lib/packet/makefile +++ b/reactos/lib/packet/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.6 2004/01/11 20:46:06 navaraf Exp $ +# $Id: makefile,v 1.7 2004/05/29 21:24:46 hbirr Exp $ PATH_TO_TOP = ../.. @@ -6,7 +6,7 @@ TARGET_TYPE = dynlink TARGET_NAME = packet -TARGET_BASE = 0x77780000 +TARGET_BASE = $(TARGET_BASE_LIB_PACKET) TARGET_CFLAGS = -I./include -DUNICODE -D_UNICODE -DLE -DDBG -D_DEBUG -D__USE_W32API -Wall -Werror diff --git a/reactos/lib/psapi/makefile b/reactos/lib/psapi/makefile index 2e356b5f038..b16f5a63039 100644 --- a/reactos/lib/psapi/makefile +++ b/reactos/lib/psapi/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.9 2003/09/12 17:51:48 vizzini Exp $ +# $Id: makefile,v 1.10 2004/05/29 21:24:46 hbirr Exp $ PATH_TO_TOP = ../.. @@ -15,7 +15,7 @@ TARGET_CFLAGS += -D_DISABLE_TIDENTS TARGET_LFLAGS = -nostartfiles -nostdlib -TARGET_BASE = 0x68F70000 +TARGET_BASE = $(TARGET_BASE_LIB_PSAPI) TARGET_OBJECTS = \ misc/dllmain.o \ diff --git a/reactos/lib/richedit/Makefile.ros-template b/reactos/lib/richedit/Makefile.ros-template index 1f793c6743d..c414a2ec84c 100644 --- a/reactos/lib/richedit/Makefile.ros-template +++ b/reactos/lib/richedit/Makefile.ros-template @@ -1,4 +1,4 @@ -# $Id: Makefile.ros-template,v 1.1 2004/02/01 21:20:05 gvg Exp $ +# $Id: Makefile.ros-template,v 1.2 2004/05/29 21:24:46 hbirr Exp $ TARGET_NAME = riched32 @@ -8,7 +8,7 @@ TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ TARGET_SDKLIBS = @IMPORTS@ libwine.a ntdll.a -TARGET_BASE = 0x76340000 +TARGET_BASE = $(TARGET_BASE_LIB_RICHEDIT) TARGET_NORC = yes diff --git a/reactos/lib/rpcrt4/Makefile.ros-template b/reactos/lib/rpcrt4/Makefile.ros-template index c42d3e65d3e..eea98ecda7d 100644 --- a/reactos/lib/rpcrt4/Makefile.ros-template +++ b/reactos/lib/rpcrt4/Makefile.ros-template @@ -1,4 +1,4 @@ -# $Id: Makefile.ros-template,v 1.2 2004/05/05 18:30:13 navaraf Exp $ +# $Id: Makefile.ros-template,v 1.3 2004/05/29 21:24:46 hbirr Exp $ TARGET_NAME = rpcrt4 @@ -8,7 +8,7 @@ TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ -Wall TARGET_SDKLIBS = @IMPORTS@ winmm.a libwine.a wine_uuid.a ntdll.a -TARGET_BASE = 0x76000000 +TARGET_BASE = $(TARGET_BASE_LIB_RPCRT4) TARGET_RC_BINSRC = @RC_BINSRC@ TARGET_RC_BINARIES = @RC_BINARIES@ diff --git a/reactos/lib/samlib/makefile b/reactos/lib/samlib/makefile index 3b8c34f5526..0450aa0e8dd 100644 --- a/reactos/lib/samlib/makefile +++ b/reactos/lib/samlib/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.2 2004/02/01 15:56:37 ekohl Exp $ +# $Id: makefile,v 1.3 2004/05/29 21:24:46 hbirr Exp $ PATH_TO_TOP = ../.. @@ -6,7 +6,7 @@ TARGET_TYPE = dynlink TARGET_NAME = samlib -TARGET_BASE = 0x750C0000 +TARGET_BASE = $(TARGET_BASE_LIB_SAMLIB) TARGET_SDKLIBS = ntdll.a kernel32.a advapi32.a diff --git a/reactos/lib/secur32/Makefile b/reactos/lib/secur32/Makefile index 309d9a0f287..dbc03253b77 100644 --- a/reactos/lib/secur32/Makefile +++ b/reactos/lib/secur32/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.11 2003/08/07 04:03:23 royce Exp $ +# $Id: Makefile,v 1.12 2004/05/29 21:24:46 hbirr Exp $ PATH_TO_TOP = ../.. @@ -7,7 +7,7 @@ TARGET_TYPE = dynlink TARGET_NAME = secur32 -TARGET_BASE = 0x10000000 +TARGET_BASE = $(TARGET_BASE_LIB_SECURE32) TARGET_SDKLIBS = ntdll.a diff --git a/reactos/lib/setupapi/Makefile.ros-template b/reactos/lib/setupapi/Makefile.ros-template index 3fb9999da99..c35c7be1a2c 100644 --- a/reactos/lib/setupapi/Makefile.ros-template +++ b/reactos/lib/setupapi/Makefile.ros-template @@ -1,4 +1,4 @@ -# $Id: Makefile.ros-template,v 1.3 2004/02/10 23:46:24 gvg Exp $ +# $Id: Makefile.ros-template,v 1.4 2004/05/29 21:24:46 hbirr Exp $ TARGET_NAME = setupapi @@ -8,7 +8,7 @@ TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ -D__WINESRC__ TARGET_SDKLIBS = @IMPORTS@ libwine.a ntdll.a libwine_unicode.a -TARGET_BASE = 0x76660000 +TARGET_BASE = $(TARGET_BASE_LIB_SETUPAPI) TARGET_RC_SRCS = @RC_SRCS@ TARGET_RC_BINSRC = @RC_BINSRC@ diff --git a/reactos/lib/shell32/Makefile.ros-template b/reactos/lib/shell32/Makefile.ros-template index 4273529bb6e..4f5efabbd62 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.2 2004/01/25 18:42:49 gvg Exp $ +# $Id: Makefile.ros-template,v 1.3 2004/05/29 21:24:46 hbirr Exp $ TARGET_NAME = shell32 @@ -8,7 +8,7 @@ TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ TARGET_SDKLIBS = libwine.a @IMPORTS@ wine_uuid.a -TARGET_BASE = 0x77260000 +TARGET_BASE = $(TARGET_BASE_LIB_SHELL32) TARGET_RC_SRCS = @RC_SRCS@ TARGET_RC_BINSRC = @RC_BINSRC@ diff --git a/reactos/lib/shlwapi/Makefile.ros-template b/reactos/lib/shlwapi/Makefile.ros-template index 484eebff1a1..b80d2f52f43 100644 --- a/reactos/lib/shlwapi/Makefile.ros-template +++ b/reactos/lib/shlwapi/Makefile.ros-template @@ -1,4 +1,4 @@ -# $Id: Makefile.ros-template,v 1.5 2004/02/28 15:12:28 navaraf Exp $ +# $Id: Makefile.ros-template,v 1.6 2004/05/29 21:24:47 hbirr Exp $ TARGET_NAME = shlwapi @@ -13,7 +13,7 @@ TARGET_SDKLIBS = @IMPORTS@ msvcrt.a oleaut32.a libwine.a wine_uuid.a libwine_uni TARGET_NORC = yes -TARGET_BASE = 0x76120000 +TARGET_BASE = $(TARGET_BASE_LIB_SHLWAPI) default: all diff --git a/reactos/lib/snmpapi/makefile b/reactos/lib/snmpapi/makefile index ee30bb5fb97..f8ff755b2ac 100644 --- a/reactos/lib/snmpapi/makefile +++ b/reactos/lib/snmpapi/makefile @@ -6,7 +6,7 @@ TARGET_TYPE = dynlink TARGET_NAME = snmpapi -TARGET_BASE = 0x777c0000 +TARGET_BASE = $(TARGET_BASE_LIB_SNMPAPI) TARGET_CFLAGS = -DUNICODE diff --git a/reactos/lib/syssetup/Makefile b/reactos/lib/syssetup/Makefile index 28e11fd148e..8d774e9bf23 100644 --- a/reactos/lib/syssetup/Makefile +++ b/reactos/lib/syssetup/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.8 2004/04/19 10:54:23 ekohl Exp $ +# $Id: Makefile,v 1.9 2004/05/29 21:24:47 hbirr Exp $ PATH_TO_TOP = ../.. @@ -6,7 +6,7 @@ TARGET_TYPE = dynlink TARGET_NAME = syssetup -TARGET_BASE = 0x74A30000 +TARGET_BASE = $(TARGET_BASE_LIB_SYSSETUP) TARGET_SDKLIBS = ntdll.a kernel32.a advapi32.a gdi32.a user32.a samlib.a userenv.a comctl32.a diff --git a/reactos/lib/twain/Makefile b/reactos/lib/twain/Makefile index 4bcb1adce2d..568eed8310d 100644 --- a/reactos/lib/twain/Makefile +++ b/reactos/lib/twain/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.6 2003/12/02 18:12:05 navaraf Exp $ +# $Id: Makefile,v 1.7 2004/05/29 21:24:47 hbirr Exp $ PATH_TO_TOP = ../.. @@ -9,7 +9,7 @@ TARGET_NAME = twain_32 # require os code to explicitly request A/W version of structs/functions TARGET_CFLAGS += -D_DISABLE_TIDENTS -Wall -Werror -TARGET_BASE=0x76380000 +TARGET_BASE=$(TARGET_BASE_LIB_TWAIN_32) TARGET_SDKLIBS = ntdll.a libwine.a diff --git a/reactos/lib/unicode/Makefile.ros-template b/reactos/lib/unicode/Makefile.ros-template index 7cd7be5f5f1..dcd8e45abcb 100644 --- a/reactos/lib/unicode/Makefile.ros-template +++ b/reactos/lib/unicode/Makefile.ros-template @@ -1,4 +1,4 @@ -# $Id: Makefile.ros-template,v 1.1 2004/01/02 19:49:46 gvg Exp $ +# $Id: Makefile.ros-template,v 1.2 2004/05/29 21:24:47 hbirr Exp $ TARGET_NAME = libwine_unicode @@ -23,7 +23,7 @@ TARGET_SDKLIBS = @IMPORTS@ TARGET_NORC = yes -TARGET_BASE = 0x6b200000 +TARGET_BASE = $(TARGET_BASE_LIB_UNICODE) TARGET_DEFNAME = wine_unicode diff --git a/reactos/lib/user32/Makefile b/reactos/lib/user32/Makefile index fce7cbb080d..569239727e2 100644 --- a/reactos/lib/user32/Makefile +++ b/reactos/lib/user32/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.37 2004/04/09 20:03:13 navaraf Exp $ +# $Id: Makefile,v 1.38 2004/05/29 21:24:47 hbirr Exp $ PATH_TO_TOP = ../.. @@ -6,7 +6,7 @@ TARGET_TYPE = dynlink TARGET_NAME = user32 -TARGET_BASE = 0x77e70000 +TARGET_BASE = $(TARGET_BASE_LIB_USER32) TARGET_SDKLIBS = libwine.a ntdll.a kernel32.a gdi32.a rosrtl.a diff --git a/reactos/lib/userenv/makefile b/reactos/lib/userenv/makefile index 571786f411d..18c5e800746 100644 --- a/reactos/lib/userenv/makefile +++ b/reactos/lib/userenv/makefile @@ -4,7 +4,7 @@ TARGET_TYPE = dynlink TARGET_NAME = userenv -TARGET_BASE = 0x74850000 +TARGET_BASE = $(TARGET_BASE_LIB_USERENV) TARGET_CFLAGS = -fno-builtin -D__USE_W32API -D_WIN32_IE=0x0400 diff --git a/reactos/lib/version/makefile b/reactos/lib/version/makefile index bd6ce205d55..241c563a66a 100644 --- a/reactos/lib/version/makefile +++ b/reactos/lib/version/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.14 2003/12/29 22:50:59 sedwards Exp $ +# $Id: makefile,v 1.15 2004/05/29 21:24:47 hbirr Exp $ PATH_TO_TOP = ../.. @@ -6,7 +6,7 @@ TARGET_TYPE = dynlink TARGET_NAME = version -TARGET_BASE = 0x77a90000 +TARGET_BASE = $(TARGET_BASE_LIB_VERSION) TARGET_CFLAGS = -fno-builtin -Wall diff --git a/reactos/lib/wininet/Makefile b/reactos/lib/wininet/Makefile index 09155a774f9..f4af16c74ff 100644 --- a/reactos/lib/wininet/Makefile +++ b/reactos/lib/wininet/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.1 2004/02/01 21:33:56 gvg Exp $ +# $Id: Makefile,v 1.2 2004/05/29 21:24:47 hbirr Exp $ PATH_TO_TOP = ../.. @@ -6,7 +6,7 @@ TARGET_TYPE = dynlink TARGET_NAME = wininet -TARGET_BASE = 0x70200000 +TARGET_BASE = $(TARGET_BASE_LIB_WININET) # require os code to explicitly request A/W version of structs/functions TARGET_CFLAGS += -Wall -Werror diff --git a/reactos/lib/winmm/Makefile.ros-template b/reactos/lib/winmm/Makefile.ros-template index ab57c63d688..e3594700e15 100644 --- a/reactos/lib/winmm/Makefile.ros-template +++ b/reactos/lib/winmm/Makefile.ros-template @@ -1,4 +1,4 @@ -# $Id: Makefile.ros-template,v 1.2 2004/03/07 14:33:13 navaraf Exp $ +# $Id: Makefile.ros-template,v 1.3 2004/05/29 21:24:47 hbirr Exp $ TARGET_NAME = winmm @@ -8,7 +8,7 @@ TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ TARGET_SDKLIBS = @IMPORTS@ libwine.a wine_uuid.a ntdll.a -TARGET_BASE = 0x777c0000 +TARGET_BASE = $(TARGET_BASE_LIB_WINMM) TARGET_RC_SRCS = @RC_SRCS@ TARGET_RC_BINSRC = @RC_BINSRC@ diff --git a/reactos/lib/winspool/Makefile b/reactos/lib/winspool/Makefile index b6919a1c1f1..e23c80b1000 100644 --- a/reactos/lib/winspool/Makefile +++ b/reactos/lib/winspool/Makefile @@ -10,7 +10,7 @@ TARGET_NAME = winspool TARGET_EXTENSION = .drv -TARGET_BASE = 0x77800000 +TARGET_BASE = $(TARGET_BASE_LIB_WINSPOOL) TARGET_CFLAGS = \ -I./include \ diff --git a/reactos/lib/ws2_32/makefile b/reactos/lib/ws2_32/makefile index 4ae2f75c270..ffcd59c2b13 100644 --- a/reactos/lib/ws2_32/makefile +++ b/reactos/lib/ws2_32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.13 2004/01/11 20:46:06 navaraf Exp $ +# $Id: makefile,v 1.14 2004/05/29 21:24:47 hbirr Exp $ PATH_TO_TOP = ../.. @@ -6,7 +6,7 @@ TARGET_TYPE = dynlink TARGET_NAME = ws2_32 -TARGET_BASE = 0x77780000 +TARGET_BASE = $(TARGET_BASE_LIB_W2_32) TARGET_CFLAGS = \ -I./include \ diff --git a/reactos/lib/ws2help/makefile b/reactos/lib/ws2help/makefile index dd805e3125e..ff141fc3c65 100644 --- a/reactos/lib/ws2help/makefile +++ b/reactos/lib/ws2help/makefile @@ -6,7 +6,7 @@ TARGET_TYPE = dynlink TARGET_NAME = ws2help -TARGET_BASE = 0x777c0000 +TARGET_BASE = $(TARGET_BASE_LIB_WS2HELP) TARGET_CFLAGS = \ -I./include \ diff --git a/reactos/lib/wshirda/makefile b/reactos/lib/wshirda/makefile index e3d71ffaf22..9ed5a074e09 100644 --- a/reactos/lib/wshirda/makefile +++ b/reactos/lib/wshirda/makefile @@ -6,7 +6,7 @@ TARGET_TYPE = dynlink TARGET_NAME = wshirda -TARGET_BASE = 0x777c0000 +TARGET_BASE = $(TARGET_BASE_LIB_WSHIRDA) TARGET_CFLAGS = -DUNICODE -D__USE_W32API -Werror -Wall diff --git a/reactos/lib/wsock32/Makefile b/reactos/lib/wsock32/Makefile index c3028278b0e..99d2d31c83e 100644 --- a/reactos/lib/wsock32/Makefile +++ b/reactos/lib/wsock32/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.5 2004/01/11 20:46:06 navaraf Exp $ +# $Id: Makefile,v 1.6 2004/05/29 21:24:48 hbirr Exp $ PATH_TO_TOP = ../.. @@ -6,7 +6,7 @@ TARGET_TYPE = dynlink TARGET_NAME = wsock32 -TARGET_BASE = 0x71ab0000 +TARGET_BASE = $(TARGET_BASE_LIB_WSOCK32) TARGET_CFLAGS = \ -I./include \ diff --git a/reactos/tools/helper.mk b/reactos/tools/helper.mk index 1abf61ced50..0f4f56eaf10 100644 --- a/reactos/tools/helper.mk +++ b/reactos/tools/helper.mk @@ -1,4 +1,4 @@ -# $Id: helper.mk,v 1.63 2004/05/28 18:16:46 gvg Exp $ +# $Id: helper.mk,v 1.64 2004/05/29 21:24:48 hbirr Exp $ # # Helper makefile for ReactOS modules # Variables this makefile accepts: @@ -55,7 +55,7 @@ # $SUBDIRS = Subdirs in which to run make (optional) include $(PATH_TO_TOP)/config - +include $(PATH_TO_TOP)/baseaddress.cfg ifeq ($(TARGET_PATH),) TARGET_PATH := . From 55532b15d9a01e98eabc58f5cb3fe3701df14aaa Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 29 May 2004 21:28:28 +0000 Subject: [PATCH 1270/1463] - When checking for ReactOS cd-rom, in addition to 'reactos/ntoskrnl.exe' check also for 'reactos/system32/ntoskrnl.exe'. svn path=/trunk/; revision=9554 --- reactos/ntoskrnl/io/arcname.c | 36 ++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/io/arcname.c b/reactos/ntoskrnl/io/arcname.c index 19e8afee493..5f68734b25c 100644 --- a/reactos/ntoskrnl/io/arcname.c +++ b/reactos/ntoskrnl/io/arcname.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: arcname.c,v 1.17 2004/05/02 22:49:24 hbirr Exp $ +/* $Id: arcname.c,v 1.18 2004/05/29 21:28:28 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -258,6 +258,10 @@ IopCheckCdromDevices(PULONG DeviceNumber) } #endif + /* + * Check for 'reactos/ntoskrnl.exe' first... + */ + swprintf(DeviceNameBuffer, L"\\Device\\CdRom%lu\\reactos\\ntoskrnl.exe", i); @@ -285,6 +289,36 @@ IopCheckCdromDevices(PULONG DeviceNumber) return(STATUS_SUCCESS); } + /* + * ...and for 'reactos/system32/ntoskrnl.exe' also. + */ + + swprintf(DeviceNameBuffer, + L"\\Device\\CdRom%lu\\reactos\\system32\\ntoskrnl.exe", + i); + RtlInitUnicodeString(&DeviceName, + DeviceNameBuffer); + + InitializeObjectAttributes(&ObjectAttributes, + &DeviceName, + 0, + NULL, + NULL); + + Status = NtOpenFile(&Handle, + FILE_ALL_ACCESS, + &ObjectAttributes, + &IoStatusBlock, + 0, + 0); + DPRINT("NtOpenFile() DeviceNumber %lu Status %lx\n", i, Status); + if (NT_SUCCESS(Status)) + { + DPRINT("Found ntoskrnl.exe on Cdrom%lu\n", i); + NtClose(Handle); + *DeviceNumber = i; + return(STATUS_SUCCESS); + } } DPRINT("Could not find ntoskrnl.exe\n"); From d73db829fae7a5697b87cae4e5a46913b1f95272 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sat, 29 May 2004 21:55:09 +0000 Subject: [PATCH 1271/1463] - Moved the definition of all dll base addresses to baseaddress.cfg. svn path=/trunk/; revision=9555 --- reactos/lib/ntdll/makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/ntdll/makefile b/reactos/lib/ntdll/makefile index 54c06d7c280..4d9bfcd3d81 100644 --- a/reactos/lib/ntdll/makefile +++ b/reactos/lib/ntdll/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.100 2004/05/13 21:01:14 navaraf Exp $ +# $Id: makefile,v 1.101 2004/05/29 21:55:09 hbirr Exp $ PATH_TO_TOP = ../.. @@ -23,7 +23,7 @@ TARGET_SDKLIBS = string.a rosrtl.a TARGET_GCCLIBS = gcc -TARGET_BASE = 0x77f80000 +TARGET_BASE = $(TARGET_BASE_LIB_NTDLL) TARGET_PATH = def From 9fa3a2fdb72525e9e2ae8535f6d3ba17eab162d4 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sat, 29 May 2004 22:10:05 +0000 Subject: [PATCH 1272/1463] - Print the memory map at start up to the debug port. svn path=/trunk/; revision=9556 --- reactos/ntoskrnl/ke/main.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/ke/main.c b/reactos/ntoskrnl/ke/main.c index 3c4028fcd88..7e910a1ce7d 100644 --- a/reactos/ntoskrnl/ke/main.c +++ b/reactos/ntoskrnl/ke/main.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: main.c,v 1.186 2004/04/30 20:49:39 gvg Exp $ +/* $Id: main.c,v 1.187 2004/05/29 22:10:05 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/main.c @@ -463,6 +463,34 @@ ExpInitializeExecutive(VOID) KeInit2(); +#if 1 + if (KeMemoryMapRangeCount > 0) + { + DPRINT1("MemoryMap:\n"); + for (i = 0; i < KeMemoryMapRangeCount; i++) + { + switch(KeMemoryMap[i].Type) + { + case 1: + strcpy(str, "(usable)"); + break; + case 2: + strcpy(str, "(reserved)"); + break; + case 3: + strcpy(str, "(ACPI data)"); + break; + case 4: + strcpy(str, "(ACPI NVS)"); + break; + default: + sprintf(str, "type %lu", KeMemoryMap[i].Type); + } + DPRINT1("%08x - %08x %s\n", KeMemoryMap[i].BaseAddrLow, KeMemoryMap[i].BaseAddrLow + KeMemoryMap[i].LengthLow, str); + } + } +#endif + KeLowerIrql(PASSIVE_LEVEL); if (!SeInit1()) From 4bbc945c9c9e835148cda36249e40041bea95e3e Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 30 May 2004 11:47:43 +0000 Subject: [PATCH 1273/1463] - Fixed some NULL-terminating issues that caused the 'videoprt.sys???????????????' module name problem. svn path=/trunk/; revision=9557 --- reactos/ntoskrnl/ldr/loader.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/reactos/ntoskrnl/ldr/loader.c b/reactos/ntoskrnl/ldr/loader.c index 32455165706..f9836154d45 100644 --- a/reactos/ntoskrnl/ldr/loader.c +++ b/reactos/ntoskrnl/ldr/loader.c @@ -1,4 +1,4 @@ -/* $Id: loader.c,v 1.141 2004/03/27 19:41:32 navaraf Exp $ +/* $Id: loader.c,v 1.142 2004/05/30 11:47:43 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -975,6 +975,11 @@ LdrPEProcessModule(PVOID ModuleLoadBase, NameString.Buffer = NameBuffer; NameString.MaximumLength = NameString.Length = PathLength + ModuleName.Length; + + /* NULL-terminate */ + NameString.MaximumLength++; + NameBuffer[NameString.Length / sizeof(WCHAR)] = 0; + Status = LdrLoadModule(&NameString, &LibraryModuleObject); } else @@ -1106,8 +1111,10 @@ LdrPEProcessModule(PVOID ModuleLoadBase, CreatedModuleObject->Base = DriverBase; CreatedModuleObject->Flags = MODULE_FLAG_PE; - RtlCreateUnicodeString(&CreatedModuleObject->FullName, - FileName->Buffer); + CreatedModuleObject->FullName.Length = 0; + CreatedModuleObject->FullName.MaximumLength = FileName->Length + sizeof(UNICODE_NULL); + CreatedModuleObject->FullName.Buffer = ExAllocatePool(PagedPool, CreatedModuleObject->FullName.MaximumLength); + RtlCopyUnicodeString(&CreatedModuleObject->FullName, FileName); LdrpBuildModuleBaseName(&CreatedModuleObject->BaseName, &CreatedModuleObject->FullName); @@ -1144,8 +1151,11 @@ LdrPEProcessModule(PVOID ModuleLoadBase, ModuleTextSection->Base = (ULONG)DriverBase; ModuleTextSection->Length = DriverSize; ModuleTextSection->Name = ExAllocatePool(NonPagedPool, - (wcslen(CreatedModuleObject->BaseName.Buffer) + 1) * sizeof(WCHAR)); - wcscpy(ModuleTextSection->Name, CreatedModuleObject->BaseName.Buffer); + (CreatedModuleObject->BaseName.Length + 1) * sizeof(WCHAR)); + RtlCopyMemory(ModuleTextSection->Name, + CreatedModuleObject->BaseName.Buffer, + CreatedModuleObject->BaseName.Length); + ModuleTextSection->Name[CreatedModuleObject->BaseName.Length / sizeof(WCHAR)] = 0; ModuleTextSection->OptionalHeader = CreatedModuleObject->Image.PE.OptionalHeader; InsertTailList(&ModuleTextListHead, &ModuleTextSection->ListEntry); From 02c974661fdfb7349c884e493deb6b7689903320 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sun, 30 May 2004 12:55:11 +0000 Subject: [PATCH 1274/1463] - Fixed a wrong address in MmAlterViewAttributes which possible does cause a crash if the region is longer than one page. svn path=/trunk/; revision=9558 --- reactos/ntoskrnl/mm/section.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/mm/section.c b/reactos/ntoskrnl/mm/section.c index efb0ee38204..953a032a015 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.149 2004/05/01 17:11:34 tamlin Exp $ +/* $Id: section.c,v 1.150 2004/05/30 12:55:11 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/section.c @@ -1978,7 +1978,7 @@ MmAlterViewAttributes(PMADDRESS_SPACE AddressSpace, if (MmIsPagePresent(AddressSpace->Process, Address)) { - MmSetPageProtect(AddressSpace->Process, BaseAddress, + MmSetPageProtect(AddressSpace->Process, Address, Protect); } } From 2e86c2a5bccabca6204854fe94ce0accbeae9aa5 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Sun, 30 May 2004 13:03:04 +0000 Subject: [PATCH 1275/1463] Add device settings information. svn path=/trunk/; revision=9559 --- reactos/bootdata/txtsetup.sif | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/reactos/bootdata/txtsetup.sif b/reactos/bootdata/txtsetup.sif index 194348955b4..11abd37d9c9 100644 --- a/reactos/bootdata/txtsetup.sif +++ b/reactos/bootdata/txtsetup.sif @@ -2,6 +2,7 @@ Signature = "$ReactOS$" [Directories] +; <directory_id> = <path> 1 = "\" 2 = system32 3 = system32\drivers @@ -11,6 +12,7 @@ Signature = "$ReactOS$" 7 = bin [SourceFiles] +; <filename> = <directory_id> atapi.sys = 3 blue.sys = 3 c_437.nls = 2 @@ -42,7 +44,35 @@ OsLoadOptions = "/NOGUIBOOT /NODEBUG" AnsiCodepage = c_1252.nls OemCodepage = c_437.nls UnicodeCasetable = l_intl.nls -;DefaultLayout = +DefaultLayout = 00000409 + +[Computer] +pci_up = "Standard-PC" + +[Display] +vga = "VGA display" +vbe = "VESA display" + +[Keyboard] +Default = "XT-, AT- or extended keyboard (83-105 keys)" + +[KeyboardLayout] +00000809 = "English (United Kingdom)" +00000409 = "English (US)" +0000040C = "French (France)" +00000407 = "German (Germany)" +0000041D = "Swedish" + +[Files.KeyboardLayout] +00000407 = kbdgr.dll +00000409 = kbdus.dll +0000040C = kbdfr.dll +0000041D = kbdse.dll +00000809 = kgbgb.dll + +[Mouse] +ps2mouse = "Mouse Port mouse (PS/2 mouse)" +sermouse = "Serial mouse" [HiveInfs.Install] AddReg=hivecls.inf,AddReg From 56099c14d47c38271a5a284009102c0245cf750e Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sun, 30 May 2004 14:01:13 +0000 Subject: [PATCH 1276/1463] little GDI speed improvements svn path=/trunk/; revision=9560 --- reactos/subsys/win32k/eng/clip.c | 15 +++------ reactos/subsys/win32k/eng/handle.c | 36 ++++++++++------------ reactos/subsys/win32k/eng/handle.h | 4 +-- reactos/subsys/win32k/eng/mouse.c | 6 ++-- reactos/subsys/win32k/eng/surface.c | 20 ++++-------- reactos/subsys/win32k/eng/xlate.c | 16 ++-------- reactos/subsys/win32k/include/object.h | 6 ++-- reactos/subsys/win32k/objects/cursoricon.c | 4 +-- reactos/subsys/win32k/objects/dc.c | 6 ++-- reactos/subsys/win32k/objects/dib.c | 4 +-- reactos/subsys/win32k/objects/text.c | 36 ++++++++++------------ 11 files changed, 63 insertions(+), 90 deletions(-) diff --git a/reactos/subsys/win32k/eng/clip.c b/reactos/subsys/win32k/eng/clip.c index cd4dd17590c..a54700834dc 100644 --- a/reactos/subsys/win32k/eng/clip.c +++ b/reactos/subsys/win32k/eng/clip.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: clip.c,v 1.21 2004/05/14 22:56:18 gvg Exp $ +/* $Id: clip.c,v 1.22 2004/05/30 14:01:12 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -45,18 +45,14 @@ IntEngCreateClipRegion(ULONG count, PRECTL pRect, PRECTL rcBounds) if (1 < count) { hClip = (HCLIP) CreateGDIHandle(sizeof(CLIPGDI) + count * sizeof(RECTL), - sizeof(CLIPOBJ)); + sizeof(CLIPOBJ), (PVOID*)&clipInt, (PVOID*)&clipUser); if (hClip) { - clipInt = (CLIPGDI *) AccessInternalObject(hClip); RtlCopyMemory(clipInt->EnumRects.arcl, pRect, count * sizeof(RECTL)); clipInt->EnumRects.c = count; clipInt->EnumOrder = CD_ANY; - clipUser = (CLIPOBJ *) AccessUserObject(hClip); - ASSERT(NULL != clipUser); - clipUser->iDComplexity = DC_COMPLEX; clipUser->iFComplexity = (count <= 4) ? FC_RECT4: FC_COMPLEX; clipUser->iMode = TC_RECTANGLES; @@ -68,17 +64,14 @@ IntEngCreateClipRegion(ULONG count, PRECTL pRect, PRECTL rcBounds) else { hClip = (HCLIP) CreateGDIHandle(sizeof(CLIPGDI), - sizeof(CLIPOBJ)); + sizeof(CLIPOBJ), + (PVOID)&clipInt, (PVOID)&clipUser); if (hClip) { - clipInt = (CLIPGDI *) AccessInternalObject(hClip); RtlCopyMemory(clipInt->EnumRects.arcl, rcBounds, sizeof(RECTL)); clipInt->EnumRects.c = 1; clipInt->EnumOrder = CD_ANY; - clipUser = (CLIPOBJ *) AccessUserObject(hClip); - ASSERT(NULL != clipUser); - clipUser->iDComplexity = ((rcBounds->top==rcBounds->bottom) && (rcBounds->left==rcBounds->right)) ? DC_TRIVIAL : DC_RECT; diff --git a/reactos/subsys/win32k/eng/handle.c b/reactos/subsys/win32k/eng/handle.c index a61557330c2..825a45cb378 100644 --- a/reactos/subsys/win32k/eng/handle.c +++ b/reactos/subsys/win32k/eng/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.15 2004/05/10 17:07:17 weiden Exp $ +/* $Id: handle.c,v 1.16 2004/05/30 14:01:12 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -29,28 +29,34 @@ #include <w32k.h> static int LastHandle = MAX_GDI_HANDLES; +static GDI_HANDLE GDIHandles[MAX_GDI_HANDLES]; -ULONG FASTCALL CreateGDIHandle(ULONG InternalSize, ULONG UserSize) +ULONG FASTCALL CreateGDIHandle(ULONG InternalSize, ULONG UserSize, PVOID *InternalObject, PVOID *UserObject) { - ULONG size; PENGOBJ pObj; int i; - //size = sizeof( ENGOBJ ) + InternalSize + UserSize; - size = InternalSize; //internal size includes header and user portions - pObj = EngAllocMem( FL_ZERO_MEMORY, size, 0 ); + /* internal size includes header and user portions */ + pObj = EngAllocMem( FL_ZERO_MEMORY, InternalSize, 0 ); if( !pObj ) return 0; - + + #if 0 + /* not used at the moment */ pObj->InternalSize = InternalSize; pObj->UserSize = UserSize; + #endif for( i = (MAX_GDI_HANDLES - 1 <= LastHandle ? 1 : LastHandle + 1); i != LastHandle; i = (MAX_GDI_HANDLES - 1 <= i ? 1 : i + 1) ){ if( GDIHandles[ i ].pEngObj == NULL ){ pObj->hObj = i; GDIHandles[ i ].pEngObj = pObj; + + *InternalObject = pObj; + *UserObject = (PVOID)( (PCHAR)pObj + sizeof( ENGOBJ ) ); + DPRINT("CreateGDIHandle: obj: %x, handle: %d, usersize: %d\n", pObj, i, UserSize ); LastHandle = i; return i; @@ -77,13 +83,12 @@ PVOID FASTCALL AccessInternalObject(ULONG Handle) PENGOBJ pEngObj; if (Handle == 0 || Handle >= MAX_GDI_HANDLES - || GDIHandles[Handle].pEngObj == NULL) + || !(pEngObj = GDIHandles[Handle].pEngObj)) { DPRINT1("AccessInternalObject: invalid handle: %d!!!!\n", Handle); return NULL; } - - pEngObj = GDIHandles[Handle].pEngObj; + return (PVOID)pEngObj; } @@ -92,13 +97,12 @@ PVOID FASTCALL AccessUserObject(ULONG Handle) PENGOBJ pEngObj; if (Handle == 0 || Handle >= MAX_GDI_HANDLES - || GDIHandles[Handle].pEngObj == NULL) + || !(pEngObj = GDIHandles[Handle].pEngObj)) { DPRINT1("AccessUserObject: invalid handle: %d!!!!\n", Handle); return NULL; } - - pEngObj = GDIHandles[Handle].pEngObj; + return (PVOID)( (PCHAR)pEngObj + sizeof( ENGOBJ ) ); } @@ -120,12 +124,6 @@ ULONG FASTCALL AccessHandleFromUserObject(PVOID UserObject) return Handle; } -PVOID FASTCALL AccessInternalObjectFromUserObject(PVOID UserObject) -{ - - return AccessInternalObject( AccessHandleFromUserObject( UserObject ) ); -} - VOID FASTCALL InitEngHandleTable( void ) { ULONG i; diff --git a/reactos/subsys/win32k/eng/handle.h b/reactos/subsys/win32k/eng/handle.h index 0aaadfdd37c..6d790cfd17b 100644 --- a/reactos/subsys/win32k/eng/handle.h +++ b/reactos/subsys/win32k/eng/handle.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: handle.h,v 1.5 2003/05/18 17:16:17 ea Exp $ +/* $Id: handle.h,v 1.6 2004/05/30 14:01:12 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -39,8 +39,6 @@ typedef struct _GDI_HANDLE { #define INVALID_HANDLE 0 #define MAX_GDI_HANDLES 4096 -GDI_HANDLE GDIHandles[MAX_GDI_HANDLES]; - #define ValidEngHandle( x ) (!( (x) == INVALID_HANDLE )) #endif diff --git a/reactos/subsys/win32k/eng/mouse.c b/reactos/subsys/win32k/eng/mouse.c index 02a19ae57e2..2097bfe27c8 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.70 2004/05/14 23:57:32 weiden Exp $ +/* $Id: mouse.c,v 1.71 2004/05/30 14:01:12 weiden Exp $ * * PROJECT: ReactOS kernel * PURPOSE: Mouse @@ -51,9 +51,11 @@ EnableMouse(HDC hDisplayDC) dc = DC_LockDc(hDisplayDC); SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface); - SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) dc->Surface); DC_UnlockDc( hDisplayDC ); + ASSERT(SurfObj); + SurfGDI = (PSURFGDI)AccessInternalObjectFromUserObject(SurfObj); + /* 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); diff --git a/reactos/subsys/win32k/eng/surface.c b/reactos/subsys/win32k/eng/surface.c index effa51ab38e..e95dc5de38a 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.39 2004/05/14 22:56:18 gvg Exp $ +/* $Id: surface.c,v 1.40 2004/05/30 14:01:12 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -317,14 +317,10 @@ EngCreateBitmap(IN SIZEL Size, PVOID UncompressedBits; ULONG UncompressedFormat; - NewBitmap = (PVOID)CreateGDIHandle(sizeof(SURFGDI), sizeof(SURFOBJ)); + NewBitmap = (PVOID)CreateGDIHandle(sizeof(SURFGDI), sizeof(SURFOBJ), (PVOID*)&SurfGDI, (PVOID*)&SurfObj); if( !ValidEngHandle( NewBitmap ) ) return 0; - SurfObj = (SURFOBJ*) AccessUserObject( (ULONG) NewBitmap ); - SurfGDI = (SURFGDI*) AccessInternalObject( (ULONG) NewBitmap ); - ASSERT( SurfObj ); - ASSERT( SurfGDI ); SurfGDI->BitsPerPixel = BitsPerFormat(Format); if (Format == BMF_4RLE) { SurfObj->lDelta = DIB_GetDIBWidthBytes(Size.cx, BitsPerFormat(BMF_4BPP)); @@ -401,15 +397,10 @@ EngCreateDeviceSurface(IN DHSURF dhsurf, SURFOBJ *SurfObj; SURFGDI *SurfGDI; - NewSurface = (HSURF)CreateGDIHandle(sizeof( SURFGDI ), sizeof( SURFOBJ )); + NewSurface = (HSURF)CreateGDIHandle(sizeof( SURFGDI ), sizeof( SURFOBJ ), (PVOID*)&SurfGDI, (PVOID*)&SurfObj); if( !ValidEngHandle( NewSurface ) ) return 0; - SurfObj = (SURFOBJ*) AccessUserObject( (ULONG) NewSurface ); - SurfGDI = (SURFGDI*) AccessInternalObject( (ULONG) NewSurface ); - ASSERT( SurfObj ); - ASSERT( SurfGDI ); - SurfGDI->BitsPerPixel = BitsPerFormat(Format); SurfObj->dhsurf = dhsurf; SurfObj->hsurf = (HSURF) dhsurf; // FIXME: Is this correct?? @@ -450,8 +441,9 @@ EngAssociateSurface(IN HSURF Surface, Device = (GDIDEVICE*)Dev; - SurfGDI = (PVOID)AccessInternalObject((ULONG)Surface); - SurfObj = (PVOID)AccessUserObject((ULONG)Surface); + SurfObj = (SURFOBJ*)AccessUserObject((ULONG)Surface); + ASSERT(SurfObj); + SurfGDI = (SURFGDI*)AccessInternalObjectFromUserObject(SurfObj); // Associate the hdev SurfObj->hdev = Dev; diff --git a/reactos/subsys/win32k/eng/xlate.c b/reactos/subsys/win32k/eng/xlate.c index 794275192bf..1c9b951e40e 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.34 2004/05/10 17:07:17 weiden Exp $ +/* $Id: xlate.c,v 1.35 2004/05/30 14:01:12 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -215,15 +215,10 @@ XLATEOBJ * STDCALL IntEngCreateXlate(USHORT DestPalType, USHORT SourcePalType, ULONG DestRedMask, DestGreenMask, DestBlueMask; UINT i; - NewXlate = (HPALETTE)CreateGDIHandle(sizeof( XLATEGDI ), sizeof( XLATEOBJ )); + NewXlate = (HPALETTE)CreateGDIHandle(sizeof( XLATEGDI ), sizeof( XLATEOBJ ), (PVOID*)&XlateGDI, (PVOID*)&XlateObj); if ( !ValidEngHandle ( NewXlate ) ) return NULL; - XlateObj = (XLATEOBJ*) AccessUserObject( (ULONG) NewXlate ); - XlateGDI = (XLATEGDI*) AccessInternalObject( (ULONG) NewXlate ); - ASSERT( XlateObj ); - ASSERT( XlateGDI ); - if (NULL != PaletteSource) { SourcePalGDI = PALETTE_LockPalette(PaletteSource); @@ -396,15 +391,10 @@ XLATEOBJ * STDCALL IntEngCreateMonoXlate( XLATEGDI *XlateGDI; PALGDI *SourcePalGDI; - NewXlate = (HPALETTE)CreateGDIHandle(sizeof(XLATEGDI), sizeof(XLATEOBJ)); + NewXlate = (HPALETTE)CreateGDIHandle(sizeof(XLATEGDI), sizeof(XLATEOBJ), (PVOID*)&XlateGDI, (PVOID*)&XlateObj); if (!ValidEngHandle(NewXlate)) return NULL; - XlateObj = (XLATEOBJ *)AccessUserObject((ULONG)NewXlate); - XlateGDI = (XLATEGDI *)AccessInternalObject((ULONG)NewXlate); - ASSERT(XlateObj); - ASSERT(XlateGDI); - XlateObj->iSrcType = SourcePalType; XlateObj->iDstType = PAL_INDEXED; diff --git a/reactos/subsys/win32k/include/object.h b/reactos/subsys/win32k/include/object.h index b2a2b931e7f..5bfc3ea1e02 100644 --- a/reactos/subsys/win32k/include/object.h +++ b/reactos/subsys/win32k/include/object.h @@ -112,15 +112,17 @@ ObmCreateHandleTable(VOID); VOID FASTCALL ObmDestroyHandleTable (PUSER_HANDLE_TABLE HandleTable); -ULONG FASTCALL CreateGDIHandle (ULONG InternalSize, ULONG UserSize); +ULONG FASTCALL CreateGDIHandle (ULONG InternalSize, ULONG UserSize, PVOID *InternalObject, PVOID *UserObject); VOID FASTCALL FreeGDIHandle (ULONG Handle); PVOID FASTCALL AccessUserObject (ULONG Handle); PVOID FASTCALL AccessInternalObject (ULONG Handle); -PVOID FASTCALL AccessInternalObjectFromUserObject (PVOID UserObject); ULONG FASTCALL AccessHandleFromUserObject (PVOID UserObject); +#define AccessInternalObjectFromUserObject(UserObj) \ + ((PVOID)( (PCHAR)(UserObj) - sizeof( ENGOBJ ) ) ) + VOID FASTCALL InitEngHandleTable (VOID); VOID FASTCALL InitGdiObjectHandleTable (VOID); diff --git a/reactos/subsys/win32k/objects/cursoricon.c b/reactos/subsys/win32k/objects/cursoricon.c index 55c7fb45e5d..0c25fee46d6 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.56 2004/05/14 23:57:32 weiden Exp $ */ +/* $Id: cursoricon.c,v 1.57 2004/05/30 14:01:13 weiden Exp $ */ #include <w32k.h> PCURICON_OBJECT FASTCALL @@ -99,7 +99,7 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, } SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface); - SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) dc->Surface); + SurfGDI = (PSURFGDI)AccessInternalObjectFromUserObject(SurfObj); DevInfo = dc->DevInfo; DC_UnlockDc(Screen); } diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index eea26dd4325..efcdfe0c883 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.136 2004/05/26 18:49:06 weiden Exp $ +/* $Id: dc.c,v 1.137 2004/05/30 14:01:13 weiden Exp $ * * DC.C - Device context functions * @@ -652,7 +652,7 @@ IntCreatePrimarySurface() SurfObj = (SURFOBJ*)AccessUserObject((ULONG) PrimarySurface.Handle); SurfObj->dhpdev = PrimarySurface.PDev; - SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) PrimarySurface.Handle); + SurfGDI = (PSURFGDI)AccessInternalObjectFromUserObject(SurfObj); IntShowDesktop( IntGetActiveDesktop(), SurfGDI->SurfObj.sizlBitmap.cx, @@ -676,7 +676,7 @@ IntDestroyPrimarySurface() #if 0 DPRINT("Hiding mouse pointer\n" ); SurfObj = (SURFOBJ*)AccessUserObject((ULONG) PrimarySurface.Handle); - SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) PrimarySurface.Handle); + SurfGDI = (PSURFGDI)AccessInternalObjectFromUserObject(SurfObj); SurfGDI->SetPointerShape(SurfObj, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0); #endif DPRINT("Reseting display\n" ); diff --git a/reactos/subsys/win32k/objects/dib.c b/reactos/subsys/win32k/objects/dib.c index a3ff49d2a5e..3a0dbb911ca 100644 --- a/reactos/subsys/win32k/objects/dib.c +++ b/reactos/subsys/win32k/objects/dib.c @@ -1,5 +1,5 @@ /* - * $Id: dib.c,v 1.49 2004/05/15 15:04:43 navaraf Exp $ + * $Id: dib.c,v 1.50 2004/05/30 14:01:13 weiden Exp $ * * ReactOS W32 Subsystem * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team @@ -152,7 +152,7 @@ IntSetDIBits( DestBitmap = BitmapToSurf(bitmap, DC->GDIDevice); DestSurf = (SURFOBJ*) AccessUserObject( (ULONG)DestBitmap ); - DestGDI = (PSURFGDI) AccessInternalObject( (ULONG)DestBitmap ); + DestGDI = (PSURFGDI) AccessInternalObjectFromUserObject( DestSurf ); // Create source surface SourceSize.cx = bmi->bmiHeader.biWidth; diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index 8ac8f2afee6..77aea4492f2 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.93 2004/05/29 15:10:27 navaraf Exp $ */ +/* $Id: text.c,v 1.94 2004/05/30 14:01:13 weiden Exp $ */ #include <w32k.h> #include <ft2build.h> @@ -178,9 +178,12 @@ IntGdiAddFontResource(PUNICODE_STRING Filename, DWORD fl) IO_STATUS_BLOCK Iosb; PFONT_ENTRY entry; - NewFont = (HFONT)CreateGDIHandle(sizeof( FONTGDI ), sizeof( FONTOBJ )); - FontObj = (FONTOBJ*) AccessUserObject( (ULONG) NewFont ); - FontGDI = (PFONTGDI) AccessInternalObject( (ULONG) NewFont ); + NewFont = (HFONT)CreateGDIHandle(sizeof( FONTGDI ), sizeof( FONTOBJ ), (PVOID*)&FontGDI, (PVOID*)&FontObj); + if(NewFont == 0) + { + DPRINT1("Could not allocate a new GDI font object\n"); + return 0; + } // Open the Module InitializeObjectAttributes(&ObjectAttributes, Filename, 0, NULL, NULL); @@ -399,18 +402,20 @@ BOOL FASTCALL InitFontSupport(VOID) static NTSTATUS STDCALL GetFontObjectsFromTextObj(PTEXTOBJ TextObj, HFONT *FontHandle, FONTOBJ **FontObj, PFONTGDI *FontGDI) { + FONTOBJ *FntObj; NTSTATUS Status = STATUS_SUCCESS; ASSERT(NULL != TextObj && NULL != TextObj->GDIFontHandle); if (NULL != TextObj && NULL != TextObj->GDIFontHandle) { - if (NT_SUCCESS(Status) && NULL != FontHandle) + if (NULL != FontHandle) { *FontHandle = TextObj->GDIFontHandle; } - if (NT_SUCCESS(Status) && NULL != FontObj) + FntObj = (FONTOBJ*)AccessUserObject((ULONG) TextObj->GDIFontHandle); + if (NULL != FontObj) { - *FontObj = AccessUserObject((ULONG) TextObj->GDIFontHandle); + *FontObj = FntObj; if (NULL == *FontObj) { ASSERT(FALSE); @@ -419,20 +424,13 @@ GetFontObjectsFromTextObj(PTEXTOBJ TextObj, HFONT *FontHandle, FONTOBJ **FontObj } if (NT_SUCCESS(Status) && NULL != FontGDI) { - *FontGDI = AccessInternalObject((ULONG) TextObj->GDIFontHandle); - if (NULL == *FontGDI) - { - ASSERT(FALSE); - Status = STATUS_INVALID_HANDLE; - } + *FontGDI = AccessInternalObjectFromUserObject(FntObj); } + + return Status; } - else - { - Status = STATUS_INVALID_HANDLE; - } - - return Status; + + return STATUS_INVALID_HANDLE; } int From e4bd8fff859aad365aa0834dc803a364f22e7d88 Mon Sep 17 00:00:00 2001 From: Jason Filby <jason.filby@gmail.com> Date: Sun, 30 May 2004 14:51:45 +0000 Subject: [PATCH 1277/1463] Prevent unnecessary code where count is zero in NtGdiExtTextOut svn path=/trunk/; revision=9561 --- reactos/subsys/win32k/objects/text.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index 77aea4492f2..96710ecbb65 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.94 2004/05/30 14:01:13 weiden Exp $ */ +/* $Id: text.c,v 1.95 2004/05/30 14:51:45 jfilby Exp $ */ #include <w32k.h> #include <ft2build.h> @@ -1502,7 +1502,7 @@ NtGdiExtTextOut( return FALSE; } - if (NULL != UnsafeDx) + if (NULL != UnsafeDx && Count > 0) { Dx = ExAllocatePoolWithTag(PagedPool, Count * sizeof(INT), TAG_GDITEXT); if (NULL == Dx) From 9c2056bb25d5fcf9911f9d5c81ae20483c45972f Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Sun, 30 May 2004 14:54:02 +0000 Subject: [PATCH 1278/1463] Read device settings from txtsetup.sif. svn path=/trunk/; revision=9562 --- reactos/subsys/system/usetup/genlist.c | 29 ++- reactos/subsys/system/usetup/genlist.h | 6 +- reactos/subsys/system/usetup/makefile | 5 +- reactos/subsys/system/usetup/settings.c | 311 ++++++++++++++++++++++++ reactos/subsys/system/usetup/settings.h | 53 ++++ reactos/subsys/system/usetup/usetup.c | 59 +++-- 6 files changed, 440 insertions(+), 23 deletions(-) create mode 100644 reactos/subsys/system/usetup/settings.c create mode 100644 reactos/subsys/system/usetup/settings.h diff --git a/reactos/subsys/system/usetup/genlist.c b/reactos/subsys/system/usetup/genlist.c index d27b5096863..ef593741116 100644 --- a/reactos/subsys/system/usetup/genlist.c +++ b/reactos/subsys/system/usetup/genlist.c @@ -1,4 +1,30 @@ -/* genlist.c */ +/* + * 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: genlist.c,v 1.2 2004/05/30 14:54:02 ekohl Exp $ + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS text-mode setup + * FILE: subsys/system/usetup/genlist.c + * PURPOSE: Generic list functions + * PROGRAMMER: Eric Kohl + */ + +/* INCLUDES *****************************************************************/ #include <ddk/ntddk.h> #include <ntdll/rtl.h> @@ -12,7 +38,6 @@ #include <debug.h> - /* FUNCTIONS ****************************************************************/ PGENERIC_LIST diff --git a/reactos/subsys/system/usetup/genlist.h b/reactos/subsys/system/usetup/genlist.h index 0bc49a8d1ac..f235713ee3d 100644 --- a/reactos/subsys/system/usetup/genlist.h +++ b/reactos/subsys/system/usetup/genlist.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: genlist.h,v 1.1 2004/05/28 12:14:00 ekohl Exp $ +/* $Id: genlist.h,v 1.2 2004/05/30 14:54:02 ekohl Exp $ * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS text-mode setup * FILE: subsys/system/usetup/genlist.h @@ -24,6 +24,8 @@ * PROGRAMMER: Eric Kohl */ +#ifndef __GENLIST_H__ +#define __GENLIST_H__ typedef struct _GENERIC_LIST_ENTRY { @@ -83,4 +85,6 @@ SaveGenericListState(PGENERIC_LIST List); VOID RestoreGenericListState(PGENERIC_LIST List); +#endif /* __GENLIST_H__ */ + /* EOF */ diff --git a/reactos/subsys/system/usetup/makefile b/reactos/subsys/system/usetup/makefile index c2281496898..2e43ce1fce6 100644 --- a/reactos/subsys/system/usetup/makefile +++ b/reactos/subsys/system/usetup/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.16 2004/05/28 12:14:00 ekohl Exp $ +# $Id: makefile,v 1.17 2004/05/30 14:54:02 ekohl Exp $ PATH_TO_TOP = ../../.. @@ -20,7 +20,8 @@ TARGET_CFLAGS = -D__NTAPP__ -I$(PATH_TO_TOP)/lib/zlib -Wall -Werror -Wno-format TARGET_OBJECTS = bootsup.o cabinet.o console.o drivesup.o filequeue.o \ filesup.o format.o fslist.o genlist.o infcache.o \ - inicache.o partlist.o progress.o registry.o usetup.o + inicache.o partlist.o progress.o registry.o settings.o \ + usetup.o include $(PATH_TO_TOP)/rules.mak diff --git a/reactos/subsys/system/usetup/settings.c b/reactos/subsys/system/usetup/settings.c new file mode 100644 index 00000000000..6c2a3437b02 --- /dev/null +++ b/reactos/subsys/system/usetup/settings.c @@ -0,0 +1,311 @@ +/* + * 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: settings.c,v 1.1 2004/05/30 14:54:02 ekohl Exp $ + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS text-mode setup + * FILE: subsys/system/usetup/settings.c + * PURPOSE: Device settings support functions + * PROGRAMMER: Eric Kohl + */ + +/* INCLUDES *****************************************************************/ + +#include <ddk/ntddk.h> +#include <ntdll/rtl.h> + +#include "usetup.h" +#include "infcache.h" +#include "genlist.h" +#include "settings.h" + +#define NDEBUG +#include <debug.h> + + +/* FUNCTIONS ****************************************************************/ + +PGENERIC_LIST +CreateComputerTypeList(HINF InfFile) +{ + CHAR Buffer[128]; + PGENERIC_LIST List; + INFCONTEXT Context; + PWCHAR KeyName; + PWCHAR KeyValue; + PWCHAR UserData; + + List = CreateGenericList(); + if (List == NULL) + return NULL; + + if (!InfFindFirstLine (InfFile, L"Computer", NULL, &Context)) + { + DestroyGenericList(List, FALSE); + return NULL; + } + + do + { + if (!InfGetData (&Context, &KeyName, &KeyValue)) + { + /* FIXME: Handle error! */ + DPRINT("InfGetData() failed\n"); + break; + } + + UserData = RtlAllocateHeap(ProcessHeap, + 0, + (wcslen(KeyName) + 1) * sizeof(WCHAR)); + if (UserData == NULL) + { + /* FIXME: Handle error! */ + } + + wcscpy(UserData, KeyName); + + sprintf(Buffer, "%S", KeyValue); + AppendGenericListEntry(List, Buffer, UserData, FALSE); + } + while (InfFindNextLine(&Context, &Context)); + + return List; +} + + +PGENERIC_LIST +CreateDisplayDriverList(HINF InfFile) +{ + CHAR Buffer[128]; + PGENERIC_LIST List; + INFCONTEXT Context; + PWCHAR KeyName; + PWCHAR KeyValue; + PWCHAR UserData; + + List = CreateGenericList(); + if (List == NULL) + return NULL; + + if (!InfFindFirstLine (InfFile, L"Display", NULL, &Context)) + { + DestroyGenericList(List, FALSE); + return NULL; + } + + do + { + if (!InfGetData (&Context, &KeyName, &KeyValue)) + { + /* FIXME: Handle error! */ + DPRINT("InfGetData() failed\n"); + break; + } + + UserData = RtlAllocateHeap(ProcessHeap, + 0, + (wcslen(KeyName) + 1) * sizeof(WCHAR)); + if (UserData == NULL) + { + /* FIXME: Handle error! */ + } + + wcscpy(UserData, KeyName); + + sprintf(Buffer, "%S", KeyValue); + AppendGenericListEntry(List, Buffer, UserData, FALSE); + } + while (InfFindNextLine(&Context, &Context)); + + AppendGenericListEntry(List, "Automatic detection", NULL, TRUE); + + return List; +} + + +PGENERIC_LIST +CreateKeyboardDriverList(HINF InfFile) +{ + CHAR Buffer[128]; + PGENERIC_LIST List; + INFCONTEXT Context; + PWCHAR KeyName; + PWCHAR KeyValue; + PWCHAR UserData; + + List = CreateGenericList(); + if (List == NULL) + return NULL; + + if (!InfFindFirstLine (InfFile, L"Keyboard", NULL, &Context)) + { + DestroyGenericList(List, FALSE); + return NULL; + } + + do + { + if (!InfGetData (&Context, &KeyName, &KeyValue)) + { + /* FIXME: Handle error! */ + DPRINT("InfGetData() failed\n"); + break; + } + + UserData = RtlAllocateHeap(ProcessHeap, + 0, + (wcslen(KeyName) + 1) * sizeof(WCHAR)); + if (UserData == NULL) + { + /* FIXME: Handle error! */ + } + + wcscpy(UserData, KeyName); + + sprintf(Buffer, "%S", KeyValue); + AppendGenericListEntry(List, Buffer, UserData, FALSE); + } + while (InfFindNextLine(&Context, &Context)); + + return List; +} + + +PGENERIC_LIST +CreateKeyboardLayoutList(HINF InfFile) +{ + CHAR Buffer[128]; + PGENERIC_LIST List; + INFCONTEXT Context; + PWCHAR KeyName; + PWCHAR KeyValue; + PWCHAR UserData; + WCHAR DefaultLayout[20]; + + /* Get default layout id */ + if (!InfFindFirstLine (InfFile, L"NLS", L"DefaultLayout", &Context)) + return NULL; + + if (!InfGetData (&Context, NULL, &KeyValue)) + return NULL; + + wcscpy(DefaultLayout, KeyValue); + + List = CreateGenericList(); + if (List == NULL) + return NULL; + + if (!InfFindFirstLine (InfFile, L"KeyboardLayout", NULL, &Context)) + { + DestroyGenericList(List, FALSE); + return NULL; + } + + do + { + if (!InfGetData (&Context, &KeyName, &KeyValue)) + { + /* FIXME: Handle error! */ + DPRINT("InfGetData() failed\n"); + break; + } + + UserData = RtlAllocateHeap(ProcessHeap, + 0, + (wcslen(KeyName) + 1) * sizeof(WCHAR)); + if (UserData == NULL) + { + /* FIXME: Handle error! */ + } + + wcscpy(UserData, KeyName); + + sprintf(Buffer, "%S", KeyValue); + AppendGenericListEntry(List, + Buffer, + UserData, + _wcsicmp(KeyName, DefaultLayout) ? FALSE : TRUE); + } + while (InfFindNextLine(&Context, &Context)); + + return List; +} + + +BOOLEAN +ProcessKeyboardLayoutRegistry(PGENERIC_LIST List) +{ + return TRUE; +} + + +BOOLEAN +ProcessKeyboardLayoutFiles(PGENERIC_LIST List) +{ + return TRUE; +} + + +PGENERIC_LIST +CreateMouseDriverList(HINF InfFile) +{ + CHAR Buffer[128]; + PGENERIC_LIST List; + INFCONTEXT Context; + PWCHAR KeyName; + PWCHAR KeyValue; + PWCHAR UserData; + + List = CreateGenericList(); + if (List == NULL) + return NULL; + + if (!InfFindFirstLine (InfFile, L"Mouse", NULL, &Context)) + { + DestroyGenericList(List, FALSE); + return NULL; + } + + do + { + if (!InfGetData (&Context, &KeyName, &KeyValue)) + { + /* FIXME: Handle error! */ + DPRINT("InfGetData() failed\n"); + break; + } + + UserData = RtlAllocateHeap(ProcessHeap, + 0, + (wcslen(KeyName) + 1) * sizeof(WCHAR)); + if (UserData == NULL) + { + /* FIXME: Handle error! */ + } + + wcscpy(UserData, KeyName); + + sprintf(Buffer, "%S", KeyValue); + AppendGenericListEntry(List, Buffer, UserData, FALSE); + } + while (InfFindNextLine(&Context, &Context)); + + return List; +} + +/* EOF */ diff --git a/reactos/subsys/system/usetup/settings.h b/reactos/subsys/system/usetup/settings.h new file mode 100644 index 00000000000..1ca3155eb1f --- /dev/null +++ b/reactos/subsys/system/usetup/settings.h @@ -0,0 +1,53 @@ +/* + * 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: settings.h,v 1.1 2004/05/30 14:54:02 ekohl Exp $ + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS text-mode setup + * FILE: subsys/system/usetup/settings.h + * PURPOSE: Device settings support functions + * PROGRAMMER: Eric Kohl + */ + +#ifndef __SETTINGS_H__ +#define __SETTINGS_H__ + +PGENERIC_LIST +CreateComputerTypeList(HINF InfFile); + +PGENERIC_LIST +CreateDisplayDriverList(HINF InfFile); + +PGENERIC_LIST +CreateKeyboardDriverList(HINF InfFile); + +PGENERIC_LIST +CreateKeyboardLayoutList(HINF InfFile); + +BOOLEAN +ProcessKeyboardLayoutRegistry(PGENERIC_LIST List); + +BOOLEAN +ProcessKeyboardLayoutFiles(PGENERIC_LIST List); + +PGENERIC_LIST +CreateMouseDriverList(HINF InfFile); + +#endif /* __SETTINGS_H__ */ + +/* EOF */ diff --git a/reactos/subsys/system/usetup/usetup.c b/reactos/subsys/system/usetup/usetup.c index ab55e066ab5..a4ee4840d09 100644 --- a/reactos/subsys/system/usetup/usetup.c +++ b/reactos/subsys/system/usetup/usetup.c @@ -46,6 +46,7 @@ #include "filesup.h" #include "drivesup.h" #include "genlist.h" +#include "settings.h" #define NDEBUG #include <debug.h> @@ -866,41 +867,63 @@ DeviceSettingsPage(PINPUT_RECORD Ir) /* Initialize the computer settings list */ if (ComputerList == NULL) { - ComputerList = CreateGenericList(); - AppendGenericListEntry(ComputerList, "Standard-PC", NULL, TRUE); + ComputerList = CreateComputerTypeList(SetupInf); + if (ComputerList == NULL) + { + /* FIXME: report error */ + } } /* Initialize the display settings list */ if (DisplayList == NULL) { - DisplayList = CreateGenericList(); - AppendGenericListEntry(DisplayList, "VGA display", NULL, FALSE); - AppendGenericListEntry(DisplayList, "VESA display", NULL, FALSE); - AppendGenericListEntry(DisplayList, "Automatic detection", NULL, TRUE); + DisplayList = CreateDisplayDriverList(SetupInf); + if (DisplayList == NULL) + { + /* FIXME: report error */ + } } /* Initialize the keyboard settings list */ if (KeyboardList == NULL) { - KeyboardList = CreateGenericList(); - AppendGenericListEntry(KeyboardList, "XT-, AT- or extended keyboard (83-105 keys)", NULL, TRUE); + KeyboardList = CreateKeyboardDriverList(SetupInf); + if (KeyboardList == NULL) + { + /* FIXME: report error */ + } } - /* Initialize the keyboard settings list */ + /* Initialize the keyboard layout list */ if (LayoutList == NULL) { - LayoutList = CreateGenericList(); - AppendGenericListEntry(LayoutList, "English (USA)", NULL, TRUE); - AppendGenericListEntry(LayoutList, "French (France)", NULL, FALSE); - AppendGenericListEntry(LayoutList, "German (Germany)", NULL, FALSE); + LayoutList = CreateKeyboardLayoutList(SetupInf); + if (LayoutList == NULL) + { + /* FIXME: report error */ + PopupError("Setup failed to load the keyboard layout list.\n", + "ENTER = Reboot computer"); + + while (TRUE) + { + ConInKey(Ir); + + if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ + { + return QUIT_PAGE; + } + } + } } - /* Initialize the keyboard settings list */ + /* Initialize the pointer settings list */ if (PointerList == NULL) { - PointerList = CreateGenericList(); - AppendGenericListEntry(PointerList, "PS/2 (Mouse port) mouse", NULL, TRUE); - AppendGenericListEntry(PointerList, "Serial mouse", NULL, FALSE); + PointerList = CreateMouseDriverList(SetupInf); + if (PointerList == NULL) + { + /* FIXME: report error */ + } } SetTextXY(6, 8, "The list below shows the current device settings."); @@ -2614,7 +2637,7 @@ InstallDirectoryPage(PINPUT_RECORD Ir) } else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return (InstallDirectoryPage1 (InstallDir, DiskEntry, PartEntry)); + return (InstallDirectoryPage1 (InstallDir, DiskEntry, PartEntry)); } else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x08) /* BACKSPACE */ { From c5cd2328e82ef18c5ee14a2fba3cf25eb5dd2ad2 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 30 May 2004 18:30:03 +0000 Subject: [PATCH 1279/1463] - Implementation of IoQueryDeviceDescription. Patch by Alex Ionescu. svn path=/trunk/; revision=9563 --- reactos/ntoskrnl/io/resource.c | 737 ++++++++++++++++++++++++++++++--- 1 file changed, 689 insertions(+), 48 deletions(-) diff --git a/reactos/ntoskrnl/io/resource.c b/reactos/ntoskrnl/io/resource.c index 1cb892e58cf..216e058d638 100644 --- a/reactos/ntoskrnl/io/resource.c +++ b/reactos/ntoskrnl/io/resource.c @@ -16,12 +16,13 @@ * 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.14 2003/12/14 17:44:02 hbirr Exp $ +/* $Id: resource.c,v 1.15 2004/05/30 18:30:03 navaraf Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/io/resource.c * PURPOSE: Hardware resource managment * PROGRAMMER: David Welch (welch@mcmail.com) + * Alex Ionescu (alex@relsoft.net) * UPDATE HISTORY: * Created 22/05/98 */ @@ -30,8 +31,6 @@ #include <ddk/ntddk.h> #include <rosrtl/string.h> - - #include <internal/debug.h> /* GLOBALS *******************************************************************/ @@ -39,7 +38,633 @@ static CONFIGURATION_INFORMATION SystemConfigurationInformation = {0, 0, 0, 0, 0, 0, 0, FALSE, FALSE}; -/* FUNCTIONS *****************************************************************/ +/* API Parameters to Pass in IopQueryBusDescription */ +typedef struct IO_QUERY { + PINTERFACE_TYPE BusType; + PULONG BusNumber; + PCONFIGURATION_TYPE ControllerType; + PULONG ControllerNumber; + PCONFIGURATION_TYPE PeripheralType; + PULONG PeripheralNumber; + PIO_QUERY_DEVICE_ROUTINE CalloutRoutine; + PVOID Context; +} IO_QUERY, *PIO_QUERY; + +PWSTR ArcTypes[42] = { + L"System", + L"CentralProcessor", + L"FloatingPointProcessor", + L"PrimaryICache", + L"PrimaryDCache", + L"SecondaryICache", + L"SecondaryDCache", + L"SecondaryCache", + L"EisaAdapter", + L"TcAdapter", + L"ScsiAdapter", + L"DtiAdapter", + L"MultifunctionAdapter", + L"DiskController", + L"TapeController", + L"CdRomController", + L"WormController", + L"SerialController", + L"NetworkController", + L"DisplayController", + L"ParallelController", + L"PointerController", + L"KeyboardController", + L"AudioController", + L"OtherController", + L"DiskPeripheral", + L"FloppyDiskPeripheral", + L"TapePeripheral", + L"ModemPeripheral", + L"MonitorPeripheral", + L"PrinterPeripheral", + L"PointerPeripheral", + L"KeyboardPeripheral", + L"TerminalPeripheral", + L"OtherPeripheral", + L"LinePeripheral", + L"NetworkPeripheral", + L"SystemMemory", + L"DockingInformation", + L"RealModeIrqRoutingTable", + L"RealModePCIEnumeration", + L"Undefined" +}; + +#define TAG_IO_RESOURCE TAG('R', 'S', 'R', 'C') + +/* PRIVATE FUNCTIONS **********************************************************/ + +/* + * IopQueryDeviceDescription + * + * FUNCTION: + * Reads and returns Hardware information from the appropriate hardware + * registry key. Helper sub of IopQueryBusDescription. + * + * ARGUMENTS: + * Query - What the parent function wants. + * RootKey - Which key to look in + * RootKeyHandle - Handle to the key + * Bus - Bus Number. + * BusInformation - The Configuration Information Sent + * + * RETURNS: + * Status + */ + +NTSTATUS STDCALL +IopQueryDeviceDescription( + PIO_QUERY Query, + UNICODE_STRING RootKey, + HANDLE RootKeyHandle, + ULONG Bus, + PKEY_VALUE_FULL_INFORMATION *BusInformation) +{ + NTSTATUS Status; + + /* Controller Stuff */ + UNICODE_STRING ControllerString; + UNICODE_STRING ControllerRootRegName = RootKey; + UNICODE_STRING ControllerRegName; + HANDLE ControllerKeyHandle; + PKEY_FULL_INFORMATION ControllerFullInformation; + PKEY_VALUE_FULL_INFORMATION ControllerInformation[3] = {NULL, NULL, NULL}; + ULONG ControllerNumber; + ULONG ControllerLoop; + ULONG MaximumControllerNumber; + + /* Peripheral Stuff */ + UNICODE_STRING PeripheralString; + HANDLE PeripheralKeyHandle; + PKEY_FULL_INFORMATION PeripheralFullInformation; + PKEY_VALUE_FULL_INFORMATION PeripheralInformation[3] = {NULL, NULL, NULL}; + ULONG PeripheralNumber; + ULONG PeripheralLoop; + ULONG MaximumPeripheralNumber; + + /* Global Registry Stuff */ + OBJECT_ATTRIBUTES ObjectAttributes; + ULONG LenFullInformation; + ULONG LenKeyFullInformation; + UNICODE_STRING TempString; + WCHAR TempBuffer[14]; + PWSTR Strings[3] = { + L"Identifier", + L"Configuration Data", + L"Component Information" + }; + + /* Temporary String */ + TempString.MaximumLength = sizeof(TempBuffer); + TempString.Length = 0; + TempString.Buffer = TempBuffer; + + /* Add Controller Name to String */ + RtlAppendUnicodeToString(&ControllerRootRegName, L"\\"); + RtlAppendUnicodeToString(&ControllerRootRegName, ArcTypes[*Query->ControllerType]); + + /* Set the Controller Number if specified */ + if (Query->ControllerNumber && *(Query->ControllerNumber)) + { + ControllerNumber = *Query->ControllerNumber; + MaximumControllerNumber = ControllerNumber + 1; + } else { + /* Find out how many Controller Numbers there are */ + InitializeObjectAttributes( + &ObjectAttributes, + &ControllerRootRegName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + Status = ZwOpenKey(&ControllerKeyHandle, KEY_READ, &ObjectAttributes); + if (NT_SUCCESS(Status)) + { + /* How much buffer space */ + ZwQueryKey(ControllerKeyHandle, KeyFullInformation, NULL, 0, &LenFullInformation); + + /* Allocate it */ + ControllerFullInformation = ExAllocatePoolWithTag(PagedPool, LenFullInformation, TAG_IO_RESOURCE); + + /* Get the Information */ + Status = ZwQueryKey(ControllerKeyHandle, KeyFullInformation, ControllerFullInformation, LenFullInformation, &LenFullInformation); + ZwClose(ControllerKeyHandle); + ControllerKeyHandle = NULL; + } + + /* No controller was found, go back to function. */ + if (!NT_SUCCESS(Status)) + { + if (ControllerFullInformation != NULL) + ExFreePool(ControllerFullInformation); + return Status; + } + + /* Find out Controller Numbers */ + ControllerNumber = 0; + MaximumControllerNumber = ControllerFullInformation->SubKeys; + + /* Free Memory */ + ExFreePool(ControllerFullInformation); + ControllerFullInformation = NULL; + } + + /* Save String */ + ControllerRegName = ControllerRootRegName; + + /* Loop through controllers */ + for (; ControllerNumber < MaximumControllerNumber; ControllerNumber++) + { + /* Load String */ + ControllerRootRegName = ControllerRegName; + + /* Controller Number to Registry String */ + Status = RtlIntegerToUnicodeString(ControllerNumber, 10, &TempString); + + /* Create String */ + Status |= RtlAppendUnicodeToString(&ControllerRootRegName, L"\\"); + Status |= RtlAppendUnicodeStringToString(&ControllerRootRegName, &TempString); + + /* Something messed up */ + if (!NT_SUCCESS(Status)) break; + + /* Open the Registry Key */ + InitializeObjectAttributes( + &ObjectAttributes, + &ControllerRootRegName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + Status = ZwOpenKey(&ControllerKeyHandle, KEY_READ, &ObjectAttributes); + + /* Read the Configuration Data... */ + if (NT_SUCCESS(Status)) + { + for (ControllerLoop = 0; ControllerLoop < 3; ControllerLoop++) + { + /* Identifier String First */ + RtlInitUnicodeString(&ControllerString, Strings[ControllerLoop]); + + /* How much buffer space */ + ZwQueryValueKey(ControllerKeyHandle, &ControllerString, KeyValueFullInformation, NULL, 0, &LenKeyFullInformation); + + /* Allocate it */ + ControllerInformation[ControllerLoop] = ExAllocatePoolWithTag(PagedPool, LenKeyFullInformation, TAG_IO_RESOURCE); + + /* Get the Information */ + Status = ZwQueryValueKey(ControllerKeyHandle, &ControllerString, KeyValueFullInformation, ControllerInformation[ControllerLoop], LenKeyFullInformation, &LenKeyFullInformation); + } + + /* Clean Up */ + ZwClose(ControllerKeyHandle); + ControllerKeyHandle = NULL; + } + + /* Something messed up */ + if (!NT_SUCCESS(Status)) + goto EndLoop; + + /* We now have Bus *AND* Controller Information.. is it enough? */ + if (!(*Query->PeripheralType)) + { + Status = Query->CalloutRoutine( + Query->Context, + &ControllerRootRegName, + *Query->BusType, + Bus, + BusInformation, + *Query->ControllerType, + ControllerNumber, + ControllerInformation, + 0, + 0, + NULL); + goto EndLoop; + } + + /* Not enough...caller also wants peripheral name */ + Status = RtlAppendUnicodeToString(&ControllerRootRegName, L"\\"); + Status |= RtlAppendUnicodeToString(&ControllerRootRegName, ArcTypes[*Query->PeripheralType]); + + /* Something messed up */ + if (!NT_SUCCESS(Status)) goto EndLoop; + + /* Set the Peripheral Number if specified */ + if (Query->PeripheralNumber && *Query->PeripheralNumber) + { + PeripheralNumber = *Query->PeripheralNumber; + MaximumPeripheralNumber = PeripheralNumber + 1; + } else { + /* Find out how many Peripheral Numbers there are */ + InitializeObjectAttributes( + &ObjectAttributes, + &ControllerRootRegName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + Status = ZwOpenKey(&PeripheralKeyHandle, KEY_READ, &ObjectAttributes); + + if (NT_SUCCESS(Status)) + { + /* How much buffer space */ + ZwQueryKey(PeripheralKeyHandle, KeyFullInformation, NULL, 0, &LenFullInformation); + + /* Allocate it */ + PeripheralFullInformation = ExAllocatePoolWithTag(PagedPool, LenFullInformation, TAG_IO_RESOURCE); + + /* Get the Information */ + Status = ZwQueryKey(PeripheralKeyHandle, KeyFullInformation, PeripheralFullInformation, LenFullInformation, &LenFullInformation); + ZwClose(PeripheralKeyHandle); + PeripheralKeyHandle = NULL; + } + + /* No controller was found, go back to function but clean up first */ + if (!NT_SUCCESS(Status)) + { + Status = STATUS_SUCCESS; + goto EndLoop; + } + + /* Find out Peripheral Number */ + PeripheralNumber = 0; + MaximumPeripheralNumber = PeripheralFullInformation->SubKeys; + + /* Free Memory */ + ExFreePool(PeripheralFullInformation); + PeripheralFullInformation = NULL; + } + + /* Save Name */ + ControllerRegName = ControllerRootRegName; + + /* Loop through Peripherals */ + for (; PeripheralNumber < MaximumPeripheralNumber; PeripheralNumber++) + { + /* Restore Name */ + ControllerRootRegName = ControllerRegName; + + /* Peripheral Number to Registry String */ + Status = RtlIntegerToUnicodeString(PeripheralNumber, 10, &TempString); + + /* Create String */ + Status |= RtlAppendUnicodeToString(&ControllerRootRegName, L"\\"); + Status |= RtlAppendUnicodeStringToString(&ControllerRootRegName, &TempString); + + /* Something messed up */ + if (!NT_SUCCESS(Status)) break; + + /* Open the Registry Key */ + InitializeObjectAttributes( + &ObjectAttributes, + &ControllerRootRegName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + Status = ZwOpenKey(&PeripheralKeyHandle, KEY_READ, &ObjectAttributes); + + if (NT_SUCCESS(Status)) + { + for (PeripheralLoop = 0; PeripheralLoop < 3; PeripheralLoop++) + { + /* Identifier String First */ + RtlInitUnicodeString(&PeripheralString, Strings[PeripheralLoop]); + + /* How much buffer space */ + ZwQueryValueKey(PeripheralKeyHandle, &PeripheralString, KeyValueFullInformation, NULL, 0, &LenKeyFullInformation); + + /* Allocate it */ + PeripheralInformation[PeripheralLoop] = ExAllocatePoolWithTag(PagedPool, LenKeyFullInformation, TAG_IO_RESOURCE); + + /* Get the Information */ + Status = ZwQueryValueKey(PeripheralKeyHandle, &PeripheralString, KeyValueFullInformation, PeripheralInformation[PeripheralLoop], LenKeyFullInformation, &LenKeyFullInformation); + } + + /* Clean Up */ + ZwClose(PeripheralKeyHandle); + PeripheralKeyHandle = NULL; + + /* We now have everything the caller could possibly want */ + if (NT_SUCCESS(Status)) + { +#if 0 + Status = Query->CalloutRoutine( + Query->Context, + &ControllerRootRegName, + *Query->BusType, + Bus, + BusInformation, + *Query->ControllerType, + ControllerNumber, + ControllerInformation, + *Query->PeripheralType, + PeripheralNumber, + PeripheralInformation); +#else + Status = STATUS_SUCCESS; +#endif + } + + /* Free the allocated memory */ + for (PeripheralLoop = 0; PeripheralLoop < 3; PeripheralLoop++) + { + if (PeripheralInformation[PeripheralLoop]) + { + ExFreePool(PeripheralInformation[PeripheralLoop]); + PeripheralInformation[PeripheralLoop] = NULL; + } + } + + /* Something Messed up */ + if (!NT_SUCCESS(Status)) break; + } + } + +EndLoop: + /* Free the allocated memory */ + for (ControllerLoop = 0; ControllerLoop < 3; ControllerLoop++) + { + if (ControllerInformation[ControllerLoop]) + { + ExFreePool(ControllerInformation[ControllerLoop]); + ControllerInformation[ControllerLoop] = NULL; + } + } + + /* Something Messed up */ + if (!NT_SUCCESS(Status)) break; + } + + return Status; +} + +/* + * IopQueryBusDescription + * + * FUNCTION: + * Reads and returns Hardware information from the appropriate hardware + * registry key. Helper sub of IoQueryDeviceDescription. Has two modes + * of operation, either looking for Root Bus Types or for sub-Bus + * information. + * + * ARGUMENTS: + * Query - What the parent function wants. + * RootKey - Which key to look in + * RootKeyHandle - Handle to the key + * Bus - Bus Number. + * KeyIsRoot - Whether we are looking for Root Bus Types or + * information under them. + * + * RETURNS: + * Status + */ + +NTSTATUS STDCALL +IopQueryBusDescription( + PIO_QUERY Query, + UNICODE_STRING RootKey, + HANDLE RootKeyHandle, + PULONG Bus, + BOOLEAN KeyIsRoot) +{ + NTSTATUS Status; + ULONG BusLoop; + UNICODE_STRING SubRootRegName; + UNICODE_STRING BusString; + UNICODE_STRING SubBusString; + ULONG LenBasicInformation; + ULONG LenFullInformation; + ULONG LenKeyFullInformation; + ULONG LenKey; + HANDLE SubRootKeyHandle; + PKEY_FULL_INFORMATION FullInformation; + PKEY_BASIC_INFORMATION BasicInformation; + OBJECT_ATTRIBUTES ObjectAttributes; + PKEY_VALUE_FULL_INFORMATION BusInformation[3] = {NULL, NULL, NULL}; + + /* How much buffer space */ + Status = ZwQueryKey(RootKeyHandle, KeyFullInformation, NULL, 0, &LenFullInformation); + + if (!NT_SUCCESS(Status)) + return Status; + + /* Allocate it */ + FullInformation = ExAllocatePoolWithTag(PagedPool, LenFullInformation, TAG_IO_RESOURCE); + + /* Get the Information */ + Status = ZwQueryKey(RootKeyHandle, KeyFullInformation, FullInformation, LenFullInformation, &LenFullInformation); + + /* Everything was fine */ + if (NT_SUCCESS(Status)) + { + /* Buffer needed for all the keys under this one */ + LenBasicInformation = FullInformation->MaxNameLen + sizeof(KEY_BASIC_INFORMATION); + + /* Allocate it */ + BasicInformation = ExAllocatePoolWithTag(PagedPool, LenBasicInformation, TAG_IO_RESOURCE); + } + + /* Deallocate the old Buffer */ + ExFreePool(FullInformation); + + /* Try to find a Bus */ + for (BusLoop = 0; NT_SUCCESS(Status); BusLoop++) + { + /* Bus parameter was passed and number was matched */ + if ((Query->BusNumber) && (*(Query->BusNumber)) == *Bus) break; + + /* Enumerate the Key */ + Status = ZwEnumerateKey( + RootKeyHandle, + BusLoop, + KeyBasicInformation, + BasicInformation, + LenBasicInformation, + &LenKey); + + /* Everything enumerated */ + if (!NT_SUCCESS(Status)) break; + + /* What Bus are we going to go down? (only check if this is a Root Key) */ + if (KeyIsRoot) + { + if (wcsncmp(BasicInformation->Name, L"MultifunctionAdapter", BasicInformation->NameLength / 2) && + wcsncmp(BasicInformation->Name, L"EisaAdapter", BasicInformation->NameLength / 2) && + wcsncmp(BasicInformation->Name, L"TcAdapter", BasicInformation->NameLength / 2)) + { + /* Nothing found, check next */ + continue; + } + } + + /* Enumerate the Bus. */ + BusString.Buffer = BasicInformation->Name; + BusString.Length = BasicInformation->NameLength; + BusString.MaximumLength = BasicInformation->NameLength; + + /* Open a handle to the Root Registry Key */ + InitializeObjectAttributes( + &ObjectAttributes, + &BusString, + OBJ_CASE_INSENSITIVE, + RootKeyHandle, + NULL); + + Status = ZwOpenKey(&SubRootKeyHandle, KEY_READ, &ObjectAttributes); + + /* Go on if we can't */ + if (!NT_SUCCESS(Status)) continue; + + /* Key opened. Create the path */ + SubRootRegName = RootKey; + RtlAppendUnicodeToString(&SubRootRegName, L"\\"); + RtlAppendUnicodeStringToString(&SubRootRegName, &BusString); + + if (!KeyIsRoot) + { + /* Parsing a SubBus-key */ + int SubBusLoop; + PWSTR Strings[3] = { + L"Identifier", + L"Configuration Data", + L"Component Information"}; + + for (SubBusLoop = 0; SubBusLoop < 3; SubBusLoop++) + { + /* Identifier String First */ + RtlInitUnicodeString(&SubBusString, Strings[SubBusLoop]); + + /* How much buffer space */ + ZwQueryValueKey(SubRootKeyHandle, &SubBusString, KeyValueFullInformation, NULL, 0, &LenKeyFullInformation); + + /* Allocate it */ + BusInformation[SubBusLoop] = ExAllocatePoolWithTag(PagedPool, LenKeyFullInformation, TAG_IO_RESOURCE); + + /* Get the Information */ + Status = ZwQueryValueKey(SubRootKeyHandle, &SubBusString, KeyValueFullInformation, BusInformation[SubBusLoop], LenKeyFullInformation, &LenKeyFullInformation); + } + + if (NT_SUCCESS(Status)) + { + /* Do we have something */ + if (BusInformation[1] != NULL && + BusInformation[1]->DataLength != 0 && + /* Does it match what we want? */ + (((PCM_FULL_RESOURCE_DESCRIPTOR)((ULONG_PTR)BusInformation[1] + BusInformation[1]->DataOffset))->InterfaceType == *(Query->BusType))) + { + /* Found a bus */ + (*Bus)++; + + /* Is it the bus we wanted */ + if (Query->BusNumber == NULL || *(Query->BusNumber) == *Bus) + { + /* If we don't want Controller Information, we're done... call the callback */ + if (Query->ControllerType == NULL) + { + Status = Query->CalloutRoutine( + Query->Context, + &SubRootRegName, + *(Query->BusType), + *Bus, + BusInformation, + 0, + 0, + NULL, + 0, + 0, + NULL); + } else { + /* We want Controller Info...get it */ + Status = IopQueryDeviceDescription(Query, SubRootRegName, RootKeyHandle, *Bus, (PKEY_VALUE_FULL_INFORMATION*)BusInformation); + } + } + } + } + + /* Free the allocated memory */ + for (SubBusLoop = 0; SubBusLoop < 3; SubBusLoop++) + { + if (BusInformation[SubBusLoop]) + { + ExFreePool(BusInformation[SubBusLoop]); + BusInformation[SubBusLoop] = NULL; + } + } + + /* Exit the Loop if we found the bus */ + if (Query->BusNumber != NULL && *(Query->BusNumber) == *Bus) + { + ZwClose(SubRootKeyHandle); + SubRootKeyHandle = NULL; + continue; + } + } + + /* Enumerate the buses below us recursively if we haven't found the bus yet */ + Status = IopQueryBusDescription(Query, SubRootRegName, SubRootKeyHandle, Bus, !KeyIsRoot); + + /* Everything enumerated */ + if (Status == STATUS_NO_MORE_ENTRIES) Status = STATUS_SUCCESS; + + ZwClose(SubRootKeyHandle); + SubRootKeyHandle = NULL; + } + + /* Free the last remaining Allocated Memory */ + if (BasicInformation) + ExFreePool(BasicInformation); + + return Status; +} + +/* PUBLIC FUNCTIONS ***********************************************************/ /* * @implemented @@ -106,9 +731,25 @@ IoAssignResources(PUNICODE_STRING RegistryPath, } /* - * @unimplemented + * FUNCTION: + * Reads and returns Hardware information from the appropriate hardware registry key. + * + * ARGUMENTS: + * BusType - MCA, ISA, EISA...specifies the Bus Type + * BusNumber - Which bus of above should be queried + * ControllerType - Specifices the Controller Type + * ControllerNumber - Which of the controllers to query. + * CalloutRoutine - Which function to call for each valid query. + * Context - Value to pass to the callback. + * + * RETURNS: + * Status + * + * STATUS: + * @implemented */ -NTSTATUS STDCALL + +NTSTATUS NTAPI IoQueryDeviceDescription(PINTERFACE_TYPE BusType, PULONG BusNumber, PCONFIGURATION_TYPE ControllerType, @@ -118,51 +759,51 @@ IoQueryDeviceDescription(PINTERFACE_TYPE BusType, PIO_QUERY_DEVICE_ROUTINE CalloutRoutine, PVOID Context) { -#if 0 - OBJECT_ATTRIBUTES ObjectAttributes; - NTSTATUS Status; - PWCH BaseKeyName[] = - L"\\Registry\\Machine\\Hardware\\MultifunctionAdapter\\0"; - HANDLE BaseKeyHandle; - ULONG i; - struct - { - KEY_BASIC_INFORMATION BasicInfo; - WCH Name[255]; - } BasicInfo; + NTSTATUS Status; + ULONG BusLoopNumber = -1; /* Root Bus */ + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING RootRegKey; + HANDLE RootRegHandle; + WCHAR RootRegString[] = L"\\REGISTRY\\MACHINE\\HARDWARE\\DESCRIPTION\\SYSTEM\\"; + IO_QUERY Query; - BaseKeyName = L"\\Registry\\Machine\\Hardware\\MultifunctionAdapter"; - InitializeObjectAttributes(&ObjectAttributes, - BaseKeyName, - 0, - NULL, - NULL); - Status = ZwOpenKey(&BaseKeyHandle, - KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEY, - &ObjectAttributes); - if (!NT_SUCCESS(Status)) - { - return(Status); - } + /* Set up the String */ + RootRegKey.Length = 0; + RootRegKey.MaximumLength = 2048; + RootRegKey.Buffer = ExAllocatePoolWithTag(PagedPool, RootRegKey.MaximumLength, TAG_IO_RESOURCE); + RtlAppendUnicodeToString(&RootRegKey, RootRegString); + + /* Open a handle to the Root Registry Key */ + InitializeObjectAttributes( + &ObjectAttributes, + &RootRegKey, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); - i = 0; - for (;;) - { - Status = ZwEnumerateKey(BaseKeyHandle, - i, - KeyBasicInformation, - &BasicInfo, - sizeof(BasicInfo), - &ResultLength); - if (!NT_SUCCESS(Status)) - { - break; - } + Status = ZwOpenKey(&RootRegHandle, KEY_READ, &ObjectAttributes); - - } -#endif - return(STATUS_NOT_IMPLEMENTED); + if (NT_SUCCESS(Status)) + { + /* Use a helper function to loop though this key and get the info */ + Query.BusType = BusType; + Query.BusNumber = BusNumber; + Query.ControllerType = ControllerType; + Query.ControllerNumber = ControllerNumber; + Query.PeripheralType = PeripheralType; + Query.PeripheralNumber = PeripheralNumber; + Query.CalloutRoutine = CalloutRoutine; + Query.Context = Context; + Status = IopQueryBusDescription(&Query, RootRegKey, RootRegHandle, &BusLoopNumber, TRUE); + + /* Close registry */ + ZwClose(RootRegHandle); + } + + /* Free Memory */ + ExFreePool(RootRegKey.Buffer); + + return Status; } /* From 58211be6c83e006d5c3373a33c8d28421ddf11e7 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 30 May 2004 21:40:47 +0000 Subject: [PATCH 1280/1463] - Write the system boot device and start options to registry, also create the MiniNT registry key if needed. svn path=/trunk/; revision=9564 --- reactos/ntoskrnl/cm/registry.c | 127 +++++++++++++++++++++++---------- 1 file changed, 89 insertions(+), 38 deletions(-) diff --git a/reactos/ntoskrnl/cm/registry.c b/reactos/ntoskrnl/cm/registry.c index baf889f72a4..017248fce09 100644 --- a/reactos/ntoskrnl/cm/registry.c +++ b/reactos/ntoskrnl/cm/registry.c @@ -1,4 +1,4 @@ -/* $Id: registry.c,v 1.123 2004/03/13 12:14:44 ekohl Exp $ +/* $Id: registry.c,v 1.124 2004/05/30 21:40:47 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -362,53 +362,104 @@ CmInitializeRegistry(VOID) VOID INIT_FUNCTION CmInit2(PCHAR CommandLine) { - PCHAR p1, p2; - ULONG PiceStart; + ULONG PiceStart = 4; + BOOL MiniNT = FALSE; + PWCHAR SystemBootDevice; + PWCHAR SystemStartOptions; + ULONG Position; NTSTATUS Status; - /* FIXME: Store system start options */ - - - /* Create the 'CurrentControlSet' link. */ Status = CmiCreateCurrentControlSetLink(); if (!NT_SUCCESS(Status)) + KEBUGCHECK(CONFIG_INITIALIZATION_FAILED); + + /* + * Parse the system boot device. + */ + Position = 0; + SystemBootDevice = ExAllocatePool(PagedPool, (strlen(CommandLine) + 1) * sizeof(WCHAR)); + if (SystemBootDevice == NULL) + KEBUGCHECK(CONFIG_INITIALIZATION_FAILED); + while (*CommandLine != 0 && *CommandLine != ' ') + SystemBootDevice[Position++] = *(CommandLine++); + SystemBootDevice[Position++] = 0; + + /* + * Write the system boot device to registry. + */ + Status = RtlWriteRegistryValue( + RTL_REGISTRY_ABSOLUTE, + L"\\Registry\\Machine\\System\\CurrentControlSet\\Control", + L"SystemBootDevice", + REG_SZ, + SystemBootDevice, + Position * sizeof(WCHAR)); + if (!NT_SUCCESS(Status)) + KEBUGCHECK(CONFIG_INITIALIZATION_FAILED); + + /* + * Parse the system start options. + */ + Position = 0; + SystemStartOptions = SystemBootDevice; + while ((CommandLine = strchr(CommandLine, '/')) != NULL) { - KEBUGCHECK(CONFIG_INITIALIZATION_FAILED); + /* Skip over the slash */ + CommandLine++; + + /* Special options */ + if (!_strnicmp(CommandLine, "MININT", 6)) + MiniNT = TRUE; + else if (!_strnicmp(CommandLine, "DEBUGPORT=PICE", 14)) + PiceStart = 1; + + /* Add a space between the options */ + if (Position != 0) + SystemStartOptions[Position++] = L' '; + + /* Copy the command */ + while (*CommandLine != 0 && *CommandLine != ' ') + SystemStartOptions[Position++] = *(CommandLine++); + } + SystemStartOptions[Position++] = 0; + + /* + * Write the system start options to registry. + */ + Status = RtlWriteRegistryValue( + RTL_REGISTRY_ABSOLUTE, + L"\\Registry\\Machine\\System\\CurrentControlSet\\Control", + L"SystemStartOptions", + REG_SZ, + SystemStartOptions, + Position * sizeof(WCHAR)); + if (!NT_SUCCESS(Status)) + KEBUGCHECK(CONFIG_INITIALIZATION_FAILED); + + /* + * Create a CurrentControlSet\Control\MiniNT key that is used + * to detect WinPE/MiniNT systems. + */ + if (MiniNT) + { + Status = RtlCreateRegistryKey(RTL_REGISTRY_CONTROL, L"MiniNT"); + if (!NT_SUCCESS(Status)) + KEBUGCHECK(CONFIG_INITIALIZATION_FAILED); } /* Set PICE 'Start' value to 1, if PICE debugging is enabled */ - PiceStart = 4; - p1 = (PCHAR)CommandLine; - while (p1 && (p2 = strchr(p1, '/'))) - { - p2++; - if (_strnicmp(p2, "DEBUGPORT", 9) == 0) - { - p2 += 9; - if (*p2 == '=') - { - p2++; - if (_strnicmp(p2, "PICE", 4) == 0) - { - p2 += 4; - PiceStart = 1; - } - } - } - p1 = p2; - } - - Status = RtlWriteRegistryValue(RTL_REGISTRY_SERVICES, - L"\\Pice", - L"Start", - REG_DWORD, - &PiceStart, - sizeof(ULONG)); + Status = RtlWriteRegistryValue( + RTL_REGISTRY_SERVICES, + L"\\Pice", + L"Start", + REG_DWORD, + &PiceStart, + sizeof(ULONG)); if (!NT_SUCCESS(Status)) - { - KEBUGCHECK(CONFIG_INITIALIZATION_FAILED); - } + KEBUGCHECK(CONFIG_INITIALIZATION_FAILED); + + ExFreePool(SystemBootDevice); } From 481600afb3b2850ca64d9ac7922d44e0f15f4ea9 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Mon, 31 May 2004 08:45:46 +0000 Subject: [PATCH 1281/1463] changed a string svn path=/trunk/; revision=9565 --- reactos/subsys/system/vmwinst/vmwinst.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/subsys/system/vmwinst/vmwinst.rc b/reactos/subsys/system/vmwinst/vmwinst.rc index 6277ed31bbe..dd80f3d6880 100644 --- a/reactos/subsys/system/vmwinst/vmwinst.rc +++ b/reactos/subsys/system/vmwinst/vmwinst.rc @@ -101,7 +101,7 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "Please select the graphics driver you would like to use:",-1,25,25,225,15 PUSHBUTTON "ReactOS VGA Driver", IDC_VGA, 25, 40, 225, 15, BS_AUTORADIOBUTTON - PUSHBUTTON "ReactOS VBE Driver (Experimental!)", IDC_VBE, 25, 55, 225, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "ReactOS VBE Driver (SVGA)", IDC_VBE, 25, 55, 225, 15, BS_AUTORADIOBUTTON LTEXT "Click 'Finish' to complete the operation or 'Cancel' to exit the setup without changes.", -1, 25, 93, 225, 20 END From f9375c3f90fa5083c39048560f36ef2a6aff5364 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Mon, 31 May 2004 11:41:14 +0000 Subject: [PATCH 1282/1463] Add more processor information. Patch by Christoph_vW. Fixes bug #321. svn path=/trunk/; revision=9566 --- reactos/lib/kernel32/misc/sysinfo.c | 48 ++++++++++++++++------------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/reactos/lib/kernel32/misc/sysinfo.c b/reactos/lib/kernel32/misc/sysinfo.c index ffd81dec71c..14a7611aaa4 100644 --- a/reactos/lib/kernel32/misc/sysinfo.c +++ b/reactos/lib/kernel32/misc/sysinfo.c @@ -1,4 +1,4 @@ -/* $Id: sysinfo.c,v 1.11 2004/03/09 16:35:15 fireball Exp $ +/* $Id: sysinfo.c,v 1.12 2004/05/31 11:41:14 ekohl Exp $ * * reactos/lib/kernel32/misc/sysinfo.c * @@ -98,29 +98,35 @@ GetSystemInfo ( case PROCESSOR_ARCHITECTURE_ALPHA: Si->dwProcessorType = PROCESSOR_ALPHA_21064; break; - + + case PROCESSOR_ARCHITECTURE_IA64: + Si->dwProcessorType = PROCESSOR_INTEL_IA64; + break; + case PROCESSOR_ARCHITECTURE_PPC: switch (Spi.ProcessorLevel) - { - case 1: - Si->dwProcessorType = PROCESSOR_PPC_601; - break; + { + case 1: + Si->dwProcessorType = PROCESSOR_PPC_601; + break; case 3: - Si->dwProcessorType = PROCESSOR_PPC_603; - break; - case 4: - Si->dwProcessorType = PROCESSOR_PPC_604; - break; - case 6: - Si->dwProcessorType = -1; /* FIXME: what value? */ - break; - case 9: - Si->dwProcessorType = -1; /* FIXME: what value? */ - break; - case 20: - Si->dwProcessorType = PROCESSOR_PPC_620; - break; - default: + Si->dwProcessorType = PROCESSOR_PPC_603; + break; + case 4: + Si->dwProcessorType = PROCESSOR_PPC_604; + break; + case 6: + /* PPC 603+ */ + Si->dwProcessorType = PROCESSOR_PPC_603; + break; + case 9: + /* PPC 604+ */ + Si->dwProcessorType = PROCESSOR_PPC_604; + break; + case 20: + Si->dwProcessorType = PROCESSOR_PPC_620; + break; + default: Si->dwProcessorType = -1; } break; From 6855f272511a6d9e3eea807ab653f9a7cb723288 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Mon, 31 May 2004 11:47:05 +0000 Subject: [PATCH 1283/1463] Temporarily undo KeAttachProcess() done by win32k svn path=/trunk/; revision=9567 --- reactos/ntoskrnl/lpc/send.c | 54 +++++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/lpc/send.c b/reactos/ntoskrnl/lpc/send.c index 6bd3f262955..f70fc964298 100644 --- a/reactos/ntoskrnl/lpc/send.c +++ b/reactos/ntoskrnl/lpc/send.c @@ -1,4 +1,4 @@ -/* $Id: send.c,v 1.14 2004/01/07 21:13:22 ea Exp $ +/* $Id: send.c,v 1.15 2004/05/31 11:47:05 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -16,6 +16,7 @@ #include <internal/port.h> #include <internal/dbg.h> #include <internal/safe.h> +#include <internal/ps.h> #define NDEBUG #include <internal/debug.h> @@ -222,6 +223,8 @@ NtRequestWaitReplyPort (IN HANDLE PortHandle, PLPC_MESSAGE UnsafeLpcRequest, PLPC_MESSAGE UnsafeLpcReply) { + PETHREAD CurrentThread; + struct _EPROCESS *AttachedProcess; NTSTATUS Status; PEPORT Port; PQUEUEDMESSAGE Message; @@ -243,22 +246,49 @@ NtRequestWaitReplyPort (IN HANDLE PortHandle, return(Status); } + /* win32k sometimes needs to KeAttach() the CSRSS process in order to make + the PortHandle valid. Now that we've got the EPORT structure from the + handle we can undo this, so everything is normal again. Need to + re-KeAttach() before returning though */ + CurrentThread = PsGetCurrentThread(); + if (NULL == CurrentThread->OldProcess) + { + AttachedProcess = NULL; + } + else + { + AttachedProcess = CurrentThread->ThreadsProcess; + KeDetachProcess(); + } + Status = MmCopyFromCaller(&LpcRequestMessageSize, &UnsafeLpcRequest->MessageSize, sizeof(USHORT)); if (!NT_SUCCESS(Status)) { + if (NULL != AttachedProcess) + { + KeAttachProcess(AttachedProcess); + } ObDereferenceObject(Port); return(Status); } if (LpcRequestMessageSize > (sizeof(LPC_MESSAGE) + MAX_MESSAGE_DATA)) { + if (NULL != AttachedProcess) + { + KeAttachProcess(AttachedProcess); + } ObDereferenceObject(Port); return(STATUS_PORT_MESSAGE_TOO_LONG); } LpcRequest = ExAllocatePool(NonPagedPool, LpcRequestMessageSize); if (LpcRequest == NULL) { + if (NULL != AttachedProcess) + { + KeAttachProcess(AttachedProcess); + } ObDereferenceObject(Port); return(STATUS_NO_MEMORY); } @@ -267,6 +297,10 @@ NtRequestWaitReplyPort (IN HANDLE PortHandle, if (!NT_SUCCESS(Status)) { ExFreePool(LpcRequest); + if (NULL != AttachedProcess) + { + KeAttachProcess(AttachedProcess); + } ObDereferenceObject(Port); return(Status); } @@ -274,12 +308,20 @@ NtRequestWaitReplyPort (IN HANDLE PortHandle, if (LpcRequestMessageSize > (sizeof(LPC_MESSAGE) + MAX_MESSAGE_DATA)) { ExFreePool(LpcRequest); + if (NULL != AttachedProcess) + { + KeAttachProcess(AttachedProcess); + } ObDereferenceObject(Port); return(STATUS_PORT_MESSAGE_TOO_LONG); } if (LpcRequest->DataSize != (LpcRequest->MessageSize - sizeof(LPC_MESSAGE))) { ExFreePool(LpcRequest); + if (NULL != AttachedProcess) + { + KeAttachProcess(AttachedProcess); + } ObDereferenceObject(Port); return(STATUS_PORT_MESSAGE_TOO_LONG); } @@ -290,8 +332,12 @@ NtRequestWaitReplyPort (IN HANDLE PortHandle, Port); if (!NT_SUCCESS(Status)) { - DbgPrint("Enqueue failed\n"); + DPRINT1("Enqueue failed\n"); ExFreePool(LpcRequest); + if (NULL != AttachedProcess) + { + KeAttachProcess(AttachedProcess); + } ObDereferenceObject(Port); return(Status); } @@ -334,6 +380,10 @@ NtRequestWaitReplyPort (IN HANDLE PortHandle, Status = STATUS_UNSUCCESSFUL; } } + if (NULL != AttachedProcess) + { + KeAttachProcess(AttachedProcess); + } ObDereferenceObject(Port); return(Status); From 0d5d9a4b7d74bab748b1167acc9af38c031b723d Mon Sep 17 00:00:00 2001 From: Casper Hornstrup <chorns@users.sourceforge.net> Date: Mon, 31 May 2004 12:21:24 +0000 Subject: [PATCH 1284/1463] 2004-05-31 Casper S. Hornstrup <chorns@users.sourceforge.net> * include/reactos/version.h (KERNEL_VERSION_BUILD_TYPE): Replace possible value FINAL with RELEASE. svn path=/trunk/; revision=9568 --- reactos/ChangeLog | 5 +++++ reactos/include/reactos/version.h | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/reactos/ChangeLog b/reactos/ChangeLog index 1b490475bf9..fa2b7428945 100644 --- a/reactos/ChangeLog +++ b/reactos/ChangeLog @@ -1,3 +1,8 @@ +2004-05-31 Casper S. Hornstrup <chorns@users.sourceforge.net> + + * include/reactos/version.h (KERNEL_VERSION_BUILD_TYPE): Replace possible + value FINAL with RELEASE. + 2004-03-27 Art Yerkes <arty@users.sourceforge.net> * Fixed make bootcd on windows + cross. Define TOPDIR as PATH_TO_TOP diff --git a/reactos/include/reactos/version.h b/reactos/include/reactos/version.h index e88122fa141..f4e07f4471b 100644 --- a/reactos/include/reactos/version.h +++ b/reactos/include/reactos/version.h @@ -1,4 +1,4 @@ -/* $Id: version.h,v 1.21 2004/04/11 09:57:18 gvg Exp $ +/* $Id: version.h,v 1.22 2004/05/31 12:21:24 chorns Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -21,7 +21,7 @@ #define KERNEL_VERSION_MINOR 2 #define KERNEL_VERSION_PATCH_LEVEL 3 -/* KERNEL_VERSION_BUILD_TYPE is L"CVS", L"RC1", L"RC2" or L"FINAL" */ +/* KERNEL_VERSION_BUILD_TYPE is L"CVS", L"RC1", L"RC2" or L"RELEASE" */ #define KERNEL_VERSION_BUILD_TYPE L"CVS" From 9666870f38c3f96cb5b950caede6e74d3fb4306b Mon Sep 17 00:00:00 2001 From: James Tabor <james.tabor@reactos.org> Date: Mon, 31 May 2004 16:54:04 +0000 Subject: [PATCH 1285/1463] Temp fix for GlobalMemoryStatus, pleas test. svn path=/trunk/; revision=9569 --- reactos/lib/kernel32/mem/global.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/reactos/lib/kernel32/mem/global.c b/reactos/lib/kernel32/mem/global.c index 59eb2065e09..b28cf100133 100644 --- a/reactos/lib/kernel32/mem/global.c +++ b/reactos/lib/kernel32/mem/global.c @@ -1,4 +1,4 @@ -/* $Id: global.c,v 1.23 2004/04/22 02:20:52 jimtabor Exp $ +/* $Id: global.c,v 1.24 2004/05/31 16:54:04 jimtabor Exp $ * * Win32 Global/Local heap functions (GlobalXXX, LocalXXX). * These functions included in Win32 for compatibility with 16 bit Windows @@ -453,17 +453,20 @@ VOID STDCALL GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer) { MEMORYSTATUSEX lpBufferEx; - +#if 0 if (lpBuffer->dwLength != sizeof(MEMORYSTATUS)) { SetLastError(ERROR_INVALID_PARAMETER); return; } - +#endif lpBufferEx.dwLength = sizeof(MEMORYSTATUSEX); if (GlobalMemoryStatusEx(&lpBufferEx)) { + + lpBuffer->dwLength = sizeof(MEMORYSTATUS); + lpBuffer->dwMemoryLoad = lpBufferEx.dwMemoryLoad; lpBuffer->dwTotalPhys = lpBufferEx.ullTotalPhys; lpBuffer->dwAvailPhys = lpBufferEx.ullAvailPhys; From cd5c05ea8ba5a326b079027c6a9cd8b18a11064d Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes <hardon@online.no> Date: Mon, 31 May 2004 19:33:59 +0000 Subject: [PATCH 1286/1463] create rtl for stuff common to ntdll/ntoskrnl svn path=/trunk/; revision=9570 --- reactos/lib/ntdll/makefile | 23 +- reactos/lib/ntdll/rtl/libsupp.c | 57 + reactos/lib/rtl/.cvsignore | 4 + reactos/lib/rtl/acl.c | 631 ++++++++ reactos/lib/rtl/compress.c | 233 +++ reactos/lib/rtl/dos8dot3.c | 336 +++++ reactos/lib/rtl/env.c | 522 +++++++ reactos/lib/rtl/error.c | 992 ++++++++++++ reactos/lib/rtl/heap.c | 1756 ++++++++++++++++++++++ reactos/lib/rtl/largeint.c | 356 +++++ reactos/lib/rtl/luid.c | 60 + reactos/lib/rtl/makefile | 49 + reactos/lib/rtl/mem.c | 231 +++ reactos/lib/rtl/nls.c | 754 ++++++++++ reactos/lib/rtl/random.c | 159 ++ reactos/lib/rtl/sd.c | 753 ++++++++++ reactos/lib/rtl/security.c | 150 ++ reactos/lib/rtl/sid.c | 353 +++++ reactos/lib/rtl/time.c | 412 +++++ reactos/lib/rtl/timezone.c | 175 +++ reactos/lib/rtl/unicode.c | 2498 +++++++++++++++++++++++++++++++ reactos/lib/rtl/version.c | 68 + 22 files changed, 10552 insertions(+), 20 deletions(-) create mode 100644 reactos/lib/ntdll/rtl/libsupp.c create mode 100644 reactos/lib/rtl/.cvsignore create mode 100644 reactos/lib/rtl/acl.c create mode 100644 reactos/lib/rtl/compress.c create mode 100644 reactos/lib/rtl/dos8dot3.c create mode 100644 reactos/lib/rtl/env.c create mode 100644 reactos/lib/rtl/error.c create mode 100644 reactos/lib/rtl/heap.c create mode 100644 reactos/lib/rtl/largeint.c create mode 100644 reactos/lib/rtl/luid.c create mode 100644 reactos/lib/rtl/makefile create mode 100644 reactos/lib/rtl/mem.c create mode 100644 reactos/lib/rtl/nls.c create mode 100644 reactos/lib/rtl/random.c create mode 100644 reactos/lib/rtl/sd.c create mode 100644 reactos/lib/rtl/security.c create mode 100644 reactos/lib/rtl/sid.c create mode 100644 reactos/lib/rtl/time.c create mode 100644 reactos/lib/rtl/timezone.c create mode 100644 reactos/lib/rtl/unicode.c create mode 100644 reactos/lib/rtl/version.c diff --git a/reactos/lib/ntdll/makefile b/reactos/lib/ntdll/makefile index 4d9bfcd3d81..bd5ce87d413 100644 --- a/reactos/lib/ntdll/makefile +++ b/reactos/lib/ntdll/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.101 2004/05/29 21:55:09 hbirr Exp $ +# $Id: makefile,v 1.102 2004/05/31 19:33:12 gdalsnes 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 +TARGET_SDKLIBS = string.a rosrtl.a rtl.a TARGET_GCCLIBS = gcc @@ -64,48 +64,31 @@ RTL_I386_OBJECTS = \ RTL_OBJECTS = \ rtl/access.o \ - rtl/acl.o \ rtl/apc.o \ rtl/atom.o \ rtl/bitmap.o \ rtl/callback.o \ - rtl/compress.o \ rtl/crc32.o \ rtl/critical.o \ - rtl/dos8dot3.o \ - rtl/error.o \ rtl/encode.o \ - rtl/env.o \ rtl/exception.o \ rtl/handle.o \ - rtl/heap.o \ rtl/image.o \ rtl/intrlck.o \ - rtl/largeint.o \ - rtl/luid.o \ rtl/math.o \ - rtl/mem.o \ rtl/message.o \ rtl/misc.o \ - rtl/nls.o \ rtl/path.o \ rtl/ppb.o \ rtl/process.o \ rtl/propvar.o \ - rtl/random.o \ rtl/rangelist.o \ rtl/registry.o \ rtl/resource.o \ - rtl/sd.o \ - rtl/security.o \ - rtl/sid.o \ rtl/splaytree.o \ rtl/teb.o \ rtl/thread.o \ - rtl/time.o \ - rtl/timezone.o \ - rtl/unicode.o \ - rtl/version.o + rtl/libsupp.o STDIO_OBJECTS = \ stdio/sprintf.o \ diff --git a/reactos/lib/ntdll/rtl/libsupp.c b/reactos/lib/ntdll/rtl/libsupp.c new file mode 100644 index 00000000000..aec6fe44493 --- /dev/null +++ b/reactos/lib/ntdll/rtl/libsupp.c @@ -0,0 +1,57 @@ +/* $Id: libsupp.c,v 1.1 2004/05/31 19:33:59 gdalsnes Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: lib/ntdll/rtl/libsup.c + * PURPOSE: Rtl library support routines + * PROGRAMMER: Gunnar Dalsnes + * UPDATE HISTORY: + * + */ + +#include <ddk/ntddk.h> +#include <ntdll/rtl.h> +#include <ctype.h> +#include <ntos/minmax.h> + +#define NDEBUG +#include <ntdll/ntdll.h> + +/* FUNCTIONS ***************************************************************/ + +PVOID +STDCALL +ExAllocatePool( + IN POOL_TYPE PoolType, + IN SIZE_T Bytes +) +{ + return RtlAllocateHeap ( + RtlGetProcessHeap (), + 0, + Bytes); +} + +PVOID +STDCALL +ExAllocatePoolWithTag( + IN POOL_TYPE PoolType, + IN SIZE_T Bytes, + IN ULONG Tag +) +{ + return RtlAllocateHeap ( + RtlGetProcessHeap (), + 0, + Bytes); +} + +VOID +STDCALL +ExFreePool(IN PVOID Mem) +{ + RtlFreeHeap ( + RtlGetProcessHeap (), + 0, + Mem); +} diff --git a/reactos/lib/rtl/.cvsignore b/reactos/lib/rtl/.cvsignore new file mode 100644 index 00000000000..7e8aa746198 --- /dev/null +++ b/reactos/lib/rtl/.cvsignore @@ -0,0 +1,4 @@ +*.o +*.d +*.sym +*.map diff --git a/reactos/lib/rtl/acl.c b/reactos/lib/rtl/acl.c new file mode 100644 index 00000000000..1e27a2ed000 --- /dev/null +++ b/reactos/lib/rtl/acl.c @@ -0,0 +1,631 @@ +/* + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * PURPOSE: Security manager + * FILE: lib/rtl/acl.c + * PROGRAMER: David Welch <welch@cwcom.net> + * REVISION HISTORY: + * 26/07/98: Added stubs for security functions + */ + +/* INCLUDES *****************************************************************/ + +#include <ddk/ntddk.h> +#include <ntos/rtl.h> + +#define NDEBUG +#include <debug.h> + +/* FUNCTIONS ***************************************************************/ + +BOOLEAN STDCALL +RtlFirstFreeAce(PACL Acl, + PACE* Ace) +{ + PACE Current; + PVOID AclEnd; + ULONG i; + + Current = (PACE)(Acl + 1); + *Ace = NULL; + i = 0; + if (Acl->AceCount == 0) + { + *Ace = Current; + return(TRUE); + } + AclEnd = Acl->AclSize + (PVOID)Acl; + do + { + if ((PVOID)Current >= AclEnd) + { + return(FALSE); + } + if (Current->Header.AceType == ACCESS_ALLOWED_COMPOUND_ACE_TYPE && + Acl->AclRevision < ACL_REVISION3) + { + return(FALSE); + } + Current = (PACE)((PVOID)Current + (ULONG)Current->Header.AceSize); + i++; + } + while (i < Acl->AceCount); + + if ((PVOID)Current < AclEnd) + { + *Ace = Current; + } + + return(TRUE); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlGetAce(PACL Acl, + ULONG AceIndex, + PACE *Ace) +{ + ULONG i; + + *Ace = (PACE)(Acl + 1); + + if (Acl->AclRevision < MIN_ACL_REVISION || + Acl->AclRevision > MAX_ACL_REVISION) + { + return(STATUS_INVALID_PARAMETER); + } + + if (AceIndex >= Acl->AceCount) + { + return(STATUS_INVALID_PARAMETER); + } + + for (i = 0; i < AceIndex; i++) + { + if ((PVOID)*Ace >= (PVOID)Acl + Acl->AclSize) + { + return(STATUS_INVALID_PARAMETER); + } + *Ace = (PACE)((PVOID)(*Ace) + (ULONG)(*Ace)->Header.AceSize); + } + + if ((PVOID)*Ace >= (PVOID)Acl + Acl->AclSize) + { + return(STATUS_INVALID_PARAMETER); + } + + return(STATUS_SUCCESS); +} + + +static NTSTATUS +RtlpAddKnownAce (PACL Acl, + ULONG Revision, + ULONG Flags, + ACCESS_MASK AccessMask, + PSID Sid, + ULONG Type) +{ + PACE Ace; + + if (!RtlValidSid(Sid)) + { + return(STATUS_INVALID_SID); + } + if (Acl->AclRevision > MAX_ACL_REVISION || + Revision > MAX_ACL_REVISION) + { + return(STATUS_UNKNOWN_REVISION); + } + 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 = 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); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlAddAccessAllowedAce (IN OUT PACL Acl, + IN ULONG Revision, + IN ACCESS_MASK AccessMask, + IN PSID Sid) +{ + return RtlpAddKnownAce (Acl, + Revision, + 0, + AccessMask, + Sid, + ACCESS_ALLOWED_ACE_TYPE); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlAddAccessAllowedAceEx (IN OUT PACL Acl, + IN ULONG Revision, + IN ULONG Flags, + IN ACCESS_MASK AccessMask, + IN PSID Sid) +{ + return RtlpAddKnownAce (Acl, + Revision, + Flags, + AccessMask, + Sid, + ACCESS_ALLOWED_ACE_TYPE); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlAddAccessDeniedAce (PACL Acl, + ULONG Revision, + ACCESS_MASK AccessMask, + PSID Sid) +{ + return RtlpAddKnownAce (Acl, + Revision, + 0, + AccessMask, + Sid, + ACCESS_DENIED_ACE_TYPE); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlAddAccessDeniedAceEx (IN OUT PACL Acl, + IN ULONG Revision, + IN ULONG Flags, + IN ACCESS_MASK AccessMask, + IN PSID Sid) +{ + return RtlpAddKnownAce (Acl, + Revision, + Flags, + AccessMask, + Sid, + ACCESS_DENIED_ACE_TYPE); +} + + +static VOID +RtlpAddData(PVOID AceList, + ULONG AceListLength, + PVOID Ace, + ULONG Offset) +{ + if (Offset > 0) + { + memcpy((PUCHAR)Ace + AceListLength, + Ace, + Offset); + } + + if (AceListLength != 0) + { + memcpy(Ace, + AceList, + AceListLength); + } +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlAddAce(PACL Acl, + ULONG AclRevision, + ULONG StartingIndex, + PACE AceList, + ULONG AceListLength) +{ + PACE Ace; + ULONG i; + PACE Current; + ULONG j; + + if (Acl->AclRevision < MIN_ACL_REVISION || + Acl->AclRevision > MAX_ACL_REVISION) + { + return(STATUS_INVALID_PARAMETER); + } + + if (!RtlFirstFreeAce(Acl,&Ace)) + { + return(STATUS_INVALID_PARAMETER); + } + + if (Acl->AclRevision <= AclRevision) + { + AclRevision = Acl->AclRevision; + } + + if (((PVOID)AceList + AceListLength) <= (PVOID)AceList) + { + return(STATUS_INVALID_PARAMETER); + } + + i = 0; + Current = (PACE)(Acl + 1); + while ((PVOID)Current < ((PVOID)AceList + AceListLength)) + { + if (AceList->Header.AceType == ACCESS_ALLOWED_COMPOUND_ACE_TYPE && + AclRevision < ACL_REVISION3) + { + return(STATUS_INVALID_PARAMETER); + } + Current = (PACE)((PVOID)Current + Current->Header.AceSize); + } + + if (Ace == NULL) + { + return(STATUS_BUFFER_TOO_SMALL); + } + + if (((PVOID)Ace + AceListLength) >= ((PVOID)Acl + Acl->AclSize)) + { + return(STATUS_BUFFER_TOO_SMALL); + } + + if (StartingIndex != 0) + { + if (Acl->AceCount > 0) + { + Current = (PACE)(Acl + 1); + for (j = 0; j < StartingIndex; j++) + { + Current = (PACE)((PVOID)Current + Current->Header.AceSize); + } + } + } + + RtlpAddData(AceList, + AceListLength, + Current, + (ULONG)Ace - (ULONG)Current); + Acl->AceCount = Acl->AceCount + i; + Acl->AclRevision = AclRevision; + + return(STATUS_SUCCESS); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlAddAuditAccessAce(PACL Acl, + ULONG Revision, + ACCESS_MASK AccessMask, + PSID Sid, + BOOLEAN Success, + BOOLEAN Failure) +{ + PACE Ace; + ULONG Flags = 0; + + 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, + ULONG Offset) +{ + if (AceSize < Offset) + { + memcpy(Ace, + (PUCHAR)Ace + AceSize, + Offset - AceSize); + } + + if (Offset - AceSize < Offset) + { + memset((PUCHAR)Ace + Offset - AceSize, + 0, + AceSize); + } +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlDeleteAce(PACL Acl, + ULONG AceIndex) +{ + PACE Ace; + PACE Current; + + if (Acl->AclRevision < MIN_ACL_REVISION || + Acl->AclRevision > MAX_ACL_REVISION) + { + return(STATUS_INVALID_PARAMETER); + } + + if (Acl->AceCount <= AceIndex) + { + return(STATUS_INVALID_PARAMETER); + } + + if (!RtlFirstFreeAce(Acl, &Ace)) + { + return(STATUS_INVALID_PARAMETER); + } + + Current = (PACE)(Acl + 1); + + while(AceIndex--) + { + Current = (PACE)((PVOID)Current + Current->Header.AceSize); + } + + RtlpDeleteData(Current, + Current->Header.AceSize, + Ace - Current); + Acl->AceCount++; + + return(STATUS_SUCCESS); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlCreateAcl(PACL Acl, + ULONG AclSize, + ULONG AclRevision) +{ + if (AclSize < 8) + { + return(STATUS_BUFFER_TOO_SMALL); + } + + if (AclRevision < MIN_ACL_REVISION || + AclRevision > MAX_ACL_REVISION) + { + return(STATUS_INVALID_PARAMETER); + } + + if (AclSize > 0xffff) + { + return(STATUS_INVALID_PARAMETER); + } + + AclSize = AclSize & ~(0x3); + Acl->AclSize = AclSize; + Acl->AclRevision = AclRevision; + Acl->AceCount = 0; + Acl->Sbz1 = 0; + Acl->Sbz2 = 0; + + return(STATUS_SUCCESS); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlQueryInformationAcl(PACL Acl, + PVOID Information, + ULONG InformationLength, + ACL_INFORMATION_CLASS InformationClass) +{ + PACE Ace; + + if (Acl->AclRevision < MIN_ACL_REVISION || + Acl->AclRevision > MAX_ACL_REVISION) + { + return(STATUS_INVALID_PARAMETER); + } + + switch (InformationClass) + { + case AclRevisionInformation: + { + PACL_REVISION_INFORMATION Info = (PACL_REVISION_INFORMATION)Information; + + if (InformationLength < sizeof(ACL_REVISION_INFORMATION)) + { + return(STATUS_BUFFER_TOO_SMALL); + } + Info->AclRevision = Acl->AclRevision; + } + break; + + case AclSizeInformation: + { + PACL_SIZE_INFORMATION Info = (PACL_SIZE_INFORMATION)Information; + + if (InformationLength < sizeof(ACL_SIZE_INFORMATION)) + { + return(STATUS_BUFFER_TOO_SMALL); + } + + if (!RtlFirstFreeAce(Acl, &Ace)) + { + return(STATUS_INVALID_PARAMETER); + } + + Info->AceCount = Acl->AceCount; + if (Ace != NULL) + { + Info->AclBytesInUse = (PVOID)Ace - (PVOID)Acl; + Info->AclBytesFree = Acl->AclSize - Info->AclBytesInUse; + } + else + { + Info->AclBytesInUse = Acl->AclSize; + Info->AclBytesFree = 0; + } + } + break; + + default: + return(STATUS_INVALID_INFO_CLASS); + } + + return(STATUS_SUCCESS); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlSetInformationAcl(PACL Acl, + PVOID Information, + ULONG InformationLength, + ACL_INFORMATION_CLASS InformationClass) +{ + if (Acl->AclRevision < MIN_ACL_REVISION || + Acl->AclRevision > MAX_ACL_REVISION) + { + return(STATUS_INVALID_PARAMETER); + } + + switch (InformationClass) + { + case AclRevisionInformation: + { + PACL_REVISION_INFORMATION Info = (PACL_REVISION_INFORMATION)Information; + + if (InformationLength < sizeof(ACL_REVISION_INFORMATION)) + { + return(STATUS_BUFFER_TOO_SMALL); + } + + if (Acl->AclRevision >= Info->AclRevision) + { + return(STATUS_INVALID_PARAMETER); + } + + Acl->AclRevision = Info->AclRevision; + } + break; + + default: + return(STATUS_INVALID_INFO_CLASS); + } + + return(STATUS_SUCCESS); +} + + +/* + * @implemented + */ +BOOLEAN STDCALL +RtlValidAcl (PACL Acl) +{ + PACE Ace; + USHORT Size; + + Size = (Acl->AclSize + 3) & ~3; + + if (Acl->AclRevision < MIN_ACL_REVISION || + Acl->AclRevision > MAX_ACL_REVISION) + { + return(FALSE); + } + + if (Size != Acl->AclSize) + { + return(FALSE); + } + + return(RtlFirstFreeAce(Acl, &Ace)); +} + +/* EOF */ diff --git a/reactos/lib/rtl/compress.c b/reactos/lib/rtl/compress.c new file mode 100644 index 00000000000..2a5a5ce34bb --- /dev/null +++ b/reactos/lib/rtl/compress.c @@ -0,0 +1,233 @@ +/* + * ReactOS kernel + * Copyright (C) 2002 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: compress.c,v 1.1 2004/05/31 19:29:02 gdalsnes Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * PURPOSE: Compression and decompression functions + * FILE: lib/rtl/compress.c + * PROGRAMER: Eric Kohl (ekohl@rz-online.de) + */ + +/* INCLUDES *****************************************************************/ + +#include <ddk/ntddk.h> + +#define NDEBUG +#include <debug.h> + + +/* MACROS *******************************************************************/ + +#define COMPRESSION_FORMAT_MASK 0x00FF +#define COMPRESSION_ENGINE_MASK 0xFF00 + + + + +/* FUNCTIONS ****************************************************************/ + + +static NTSTATUS +RtlpCompressBufferLZNT1(USHORT Engine, + PUCHAR UncompressedBuffer, + ULONG UncompressedBufferSize, + PUCHAR CompressedBuffer, + ULONG CompressedBufferSize, + ULONG UncompressedChunkSize, + PULONG FinalCompressedSize, + PVOID WorkSpace) +{ + return(STATUS_NOT_IMPLEMENTED); +} + + +static NTSTATUS +RtlpWorkSpaceSizeLZNT1(USHORT Engine, + PULONG BufferAndWorkSpaceSize, + PULONG FragmentWorkSpaceSize) +{ + if (Engine == COMPRESSION_ENGINE_STANDARD) + { + *BufferAndWorkSpaceSize = 0x8010; + *FragmentWorkSpaceSize = 0x1000; + return(STATUS_SUCCESS); + } + else if (Engine == COMPRESSION_ENGINE_MAXIMUM) + { + *BufferAndWorkSpaceSize = 0x10; + *FragmentWorkSpaceSize = 0x1000; + return(STATUS_SUCCESS); + } + + return(STATUS_NOT_SUPPORTED); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlCompressBuffer(IN USHORT CompressionFormatAndEngine, + IN PUCHAR UncompressedBuffer, + IN ULONG UncompressedBufferSize, + OUT PUCHAR CompressedBuffer, + IN ULONG CompressedBufferSize, + IN ULONG UncompressedChunkSize, + OUT PULONG FinalCompressedSize, + IN PVOID WorkSpace) +{ + USHORT Format = CompressionFormatAndEngine & COMPRESSION_FORMAT_MASK; + USHORT Engine = CompressionFormatAndEngine & COMPRESSION_ENGINE_MASK; + + if ((Format == COMPRESSION_FORMAT_NONE) || + (Format == COMPRESSION_FORMAT_DEFAULT)) + return(STATUS_INVALID_PARAMETER); + + if (Format == COMPRESSION_FORMAT_LZNT1) + return(RtlpCompressBufferLZNT1(Engine, + UncompressedBuffer, + UncompressedBufferSize, + CompressedBuffer, + CompressedBufferSize, + UncompressedChunkSize, + FinalCompressedSize, + WorkSpace)); + + return(STATUS_UNSUPPORTED_COMPRESSION); +} + + +/* + * @unimplemented + */ +NTSTATUS STDCALL +RtlCompressChunks(IN PUCHAR UncompressedBuffer, + IN ULONG UncompressedBufferSize, + OUT PUCHAR CompressedBuffer, + IN ULONG CompressedBufferSize, + IN OUT PCOMPRESSED_DATA_INFO CompressedDataInfo, + IN ULONG CompressedDataInfoLength, + IN PVOID WorkSpace) +{ + return(STATUS_NOT_IMPLEMENTED); +} + + +/* + * @unimplemented + */ +NTSTATUS STDCALL +RtlDecompressBuffer(IN USHORT CompressionFormat, + OUT PUCHAR UncompressedBuffer, + IN ULONG UncompressedBufferSize, + IN PUCHAR CompressedBuffer, + IN ULONG CompressedBufferSize, + OUT PULONG FinalUncompressedSize) +{ + return(STATUS_NOT_IMPLEMENTED); +} + + +/* + * @unimplemented + */ +NTSTATUS STDCALL +RtlDecompressChunks(OUT PUCHAR UncompressedBuffer, + IN ULONG UncompressedBufferSize, + IN PUCHAR CompressedBuffer, + IN ULONG CompressedBufferSize, + IN PUCHAR CompressedTail, + IN ULONG CompressedTailSize, + IN PCOMPRESSED_DATA_INFO CompressedDataInfo) +{ + return(STATUS_NOT_IMPLEMENTED); +} + + +/* + * @unimplemented + */ +NTSTATUS STDCALL +RtlDecompressFragment(IN USHORT CompressionFormat, + OUT PUCHAR UncompressedFragment, + IN ULONG UncompressedFragmentSize, + IN PUCHAR CompressedBuffer, + IN ULONG CompressedBufferSize, + IN ULONG FragmentOffset, + OUT PULONG FinalUncompressedSize, + IN PVOID WorkSpace) +{ + return(STATUS_NOT_IMPLEMENTED); +} + + +/* + * @unimplemented + */ +NTSTATUS STDCALL +RtlDescribeChunk(IN USHORT CompressionFormat, + IN OUT PUCHAR *CompressedBuffer, + IN PUCHAR EndOfCompressedBufferPlus1, + OUT PUCHAR *ChunkBuffer, + OUT PULONG ChunkSize) +{ + return(STATUS_NOT_IMPLEMENTED); +} + + +/* + * @unimplemented + */ +NTSTATUS STDCALL +RtlGetCompressionWorkSpaceSize(IN USHORT CompressionFormatAndEngine, + OUT PULONG CompressBufferAndWorkSpaceSize, + OUT PULONG CompressFragmentWorkSpaceSize) +{ + USHORT Format = CompressionFormatAndEngine & COMPRESSION_FORMAT_MASK; + USHORT Engine = CompressionFormatAndEngine & COMPRESSION_ENGINE_MASK; + + if ((Format == COMPRESSION_FORMAT_NONE) || + (Format == COMPRESSION_FORMAT_DEFAULT)) + return(STATUS_INVALID_PARAMETER); + + if (Format == COMPRESSION_FORMAT_LZNT1) + return(RtlpWorkSpaceSizeLZNT1(Engine, + CompressBufferAndWorkSpaceSize, + CompressFragmentWorkSpaceSize)); + + return(STATUS_UNSUPPORTED_COMPRESSION); +} + + + +/* + * @unimplemented + */ +NTSTATUS STDCALL +RtlReserveChunk(IN USHORT CompressionFormat, + IN OUT PUCHAR *CompressedBuffer, + IN PUCHAR EndOfCompressedBufferPlus1, + OUT PUCHAR *ChunkBuffer, + IN ULONG ChunkSize) +{ + return(STATUS_NOT_IMPLEMENTED); +} + +/* EOF */ diff --git a/reactos/lib/rtl/dos8dot3.c b/reactos/lib/rtl/dos8dot3.c new file mode 100644 index 00000000000..5bd64ca338b --- /dev/null +++ b/reactos/lib/rtl/dos8dot3.c @@ -0,0 +1,336 @@ +/* + * ReactOS kernel + * Copyright (C) 2002 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: dos8dot3.c,v 1.1 2004/05/31 19:29:02 gdalsnes Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: lib/rtl/dos8dot3.c + * PURPOSE: Short name (8.3 name) functions + * PROGRAMMER: Eric Kohl + */ + +/* INCLUDES ******************************************************************/ + +#include <ddk/ntddk.h> +#include <ntos/minmax.h> + +#define NDEBUG +#include <debug.h> + + +/* CONSTANTS *****************************************************************/ + +const PCHAR RtlpShortIllegals = " ;+=[],\"*\\<>/?:|"; + + +/* FUNCTIONS *****************************************************************/ + +static BOOLEAN +RtlpIsShortIllegal(CHAR Char) +{ + return strchr(RtlpShortIllegals, Char) ? TRUE : FALSE; +} + +static USHORT +RtlpGetCheckSum(PUNICODE_STRING Name) +{ + USHORT Hash = 0; + ULONG Length; + PWCHAR c; + + Length = Name->Length / sizeof(WCHAR); + c = Name->Buffer; + while(Length--) + { + Hash = (Hash + (*c << 4) + (*c >> 4)) * 11; + c++; + } + return Hash; +} + +static ULONG +RtlpGetIndexLength(ULONG Index) +{ + ULONG Length = 0; + while (Index) + { + Index /= 10; + Length++; + } + return Length ? Length : 1; +} + + +/* + * @implemented + */ +VOID STDCALL +RtlGenerate8dot3Name(IN PUNICODE_STRING Name, + IN BOOLEAN AllowExtendedCharacters, + IN OUT PGENERATE_NAME_CONTEXT Context, + OUT PUNICODE_STRING Name8dot3) +{ + ULONG Count; + WCHAR NameBuffer[8]; + WCHAR ExtBuffer[4]; + ULONG StrLength; + ULONG NameLength; + ULONG ExtLength; + ULONG CopyLength; + ULONG DotPos; + ULONG i, j; + ULONG IndexLength; + ULONG CurrentIndex; + USHORT Checksum; + CHAR c; + + StrLength = Name->Length / sizeof(WCHAR); + DPRINT("StrLength: %hu\n", StrLength); + + /* Find last dot in Name */ + DotPos = 0; + for (i = 0; i < StrLength; i++) + { + if (Name->Buffer[i] == L'.') + { + DotPos = i; + } + } + + if (DotPos == 0) + { + DotPos = i; + } + DPRINT("DotPos: %hu\n", DotPos); + + /* Copy name (6 valid characters max) */ + for (i = 0, NameLength = 0; NameLength < 6 && i < DotPos; i++) + { + c = 0; + RtlUpcaseUnicodeToOemN(&c, sizeof(CHAR), &Count, &Name->Buffer[i], sizeof(WCHAR)); + if (Count != 1 || c == 0 || RtlpIsShortIllegal(c)) + { + NameBuffer[NameLength++] = L'_'; + } + else if (c != '.') + { + NameBuffer[NameLength++] = (WCHAR)c; + } + } + + DPRINT("NameBuffer: '%.08S'\n", NameBuffer); + DPRINT("NameLength: %hu\n", NameLength); + + /* Copy extension (4 valid characters max) */ + if (DotPos < StrLength) + { + for (i = DotPos, ExtLength = 0; ExtLength < 4 && i < StrLength; i++) + { + c = 0; + RtlUpcaseUnicodeToOemN(&c, sizeof(CHAR), &Count, &Name->Buffer[i], sizeof(WCHAR)); + if (Count != 1 || c == 0 || RtlpIsShortIllegal(Name->Buffer[i])) + { + ExtBuffer[ExtLength++] = L'_'; + } + else + { + ExtBuffer[ExtLength++] = c; + } + } + } + else + { + ExtLength = 0; + } + DPRINT("ExtBuffer: '%.04S'\n", ExtBuffer); + DPRINT("ExtLength: %hu\n", ExtLength); + + /* Determine next index */ + IndexLength = RtlpGetIndexLength(Context->LastIndexValue); + if (Context->CheckSumInserted) + { + CopyLength = min(NameLength, 8 - 4 - 1 - IndexLength); + Checksum = RtlpGetCheckSum(Name); + } + else + { + CopyLength = min(NameLength, 8 - 1 - IndexLength); + Checksum = 0; + } + + DPRINT("CopyLength: %hu\n", CopyLength); + + if ((Context->NameLength == CopyLength) && + (wcsncmp(Context->NameBuffer, NameBuffer, CopyLength) == 0) && + (Context->ExtensionLength == ExtLength) && + (wcsncmp(Context->ExtensionBuffer, ExtBuffer, ExtLength) == 0) && + (Checksum == Context->Checksum) && + (Context->LastIndexValue < 999)) + { + CHECKPOINT; + Context->LastIndexValue++; + if (Context->CheckSumInserted == FALSE && + Context->LastIndexValue > 9) + { + Context->CheckSumInserted = TRUE; + Context->LastIndexValue = 1; + Context->Checksum = RtlpGetCheckSum(Name); + } + } + else + { + CHECKPOINT; + Context->LastIndexValue = 1; + Context->CheckSumInserted = FALSE; + } + + IndexLength = RtlpGetIndexLength(Context->LastIndexValue); + + DPRINT("CurrentIndex: %hu, IndexLength %hu\n", Context->LastIndexValue, IndexLength); + + if (Context->CheckSumInserted) + { + CopyLength = min(NameLength, 8 - 4 - 1 - IndexLength); + } + else + { + CopyLength = min(NameLength, 8 - 1 - IndexLength); + } + + /* Build the short name */ + memcpy(Name8dot3->Buffer, NameBuffer, CopyLength * sizeof(WCHAR)); + j = CopyLength; + if (Context->CheckSumInserted) + { + j += 3; + Checksum = Context->Checksum; + for (i = 0; i < 4; i++) + { + Name8dot3->Buffer[j--] = (Checksum % 16) > 9 ? (Checksum % 16) + L'A' - 10 : (Checksum % 16) + L'0'; + Checksum /= 16; + } + j = CopyLength + 4; + } + Name8dot3->Buffer[j++] = L'~'; + j += IndexLength - 1; + CurrentIndex = Context->LastIndexValue; + for (i = 0; i < IndexLength; i++) + { + Name8dot3->Buffer[j--] = (CurrentIndex % 10) + L'0'; + CurrentIndex /= 10; + } + j += IndexLength + 1; + + memcpy(Name8dot3->Buffer + j, ExtBuffer, ExtLength * sizeof(WCHAR)); + Name8dot3->Length = (j + ExtLength) * sizeof(WCHAR); + + DPRINT("Name8dot3: '%wZ'\n", Name8dot3); + + /* Update context */ + Context->NameLength = CopyLength; + Context->ExtensionLength = ExtLength; + memcpy(Context->NameBuffer, NameBuffer, CopyLength * sizeof(WCHAR)); + memcpy(Context->ExtensionBuffer, ExtBuffer, ExtLength * sizeof(WCHAR)); +} + + +/* + * @implemented + */ +BOOLEAN STDCALL +RtlIsNameLegalDOS8Dot3(IN PUNICODE_STRING UnicodeName, + IN PANSI_STRING AnsiName, + OUT PBOOLEAN SpacesFound) +{ + PANSI_STRING name = AnsiName; + ANSI_STRING DummyString; + CHAR Buffer[12]; + char *str; + ULONG Length; + ULONG i; + NTSTATUS Status; + BOOLEAN HasSpace = FALSE; + BOOLEAN HasDot = FALSE; + + if (UnicodeName->Length > 24) + { + return(FALSE); /* name too long */ + } + + if (!name) + { + name = &DummyString; + name->Length = 0; + name->MaximumLength = 12; + name->Buffer = Buffer; + } + + Status = RtlUpcaseUnicodeStringToCountedOemString(name, + UnicodeName, + FALSE); + if (!NT_SUCCESS(Status)) + { + return(FALSE); + } + + Length = name->Length; + str = name->Buffer; + + if (!(Length == 1 && *str == '.') && + !(Length == 2 && *str == '.' && *(str + 1) == '.')) + { + for (i = 0; i < Length; i++, str++) + { + switch (*str) + { + case ' ': + HasSpace = TRUE; + break; + + case '.': + if ((HasDot) || /* two or more dots */ + (i == 0) || /* dot is first char */ + (i + 1 == Length) || /* dot is last char */ + (Length - i > 4) || /* more than 3 chars of extension */ + (HasDot == FALSE && i > 8)) /* name is longer than 8 chars */ + return(FALSE); + HasDot = TRUE; + break; + default: + if (RtlpIsShortIllegal(*str)) + { + return(FALSE); + } + } + } + } + + /* Name is longer than 8 chars and does not have an extension */ + if (Length > 8 && HasDot == FALSE) + { + return(FALSE); + } + + if (SpacesFound) + *SpacesFound = HasSpace; + + return(TRUE); +} + +/* EOF */ diff --git a/reactos/lib/rtl/env.c b/reactos/lib/rtl/env.c new file mode 100644 index 00000000000..257b0dc193b --- /dev/null +++ b/reactos/lib/rtl/env.c @@ -0,0 +1,522 @@ +/* $Id: env.c,v 1.1 2004/05/31 19:29:02 gdalsnes Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * FILE: lib/rtl/env.c + * PURPOSE: Environment functions + * PROGRAMMER: Eric Kohl + * UPDATE HISTORY: + * Created 30/09/98 + */ + +/* INCLUDES ******************************************************************/ + +#include <ddk/ntddk.h> +#include <ntdll/rtl.h> +#include <napi/teb.h> +#include <string.h> + +#define NDEBUG +#include <ntdll/ntdll.h> + + + +/* FUNCTIONS *****************************************************************/ + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlCreateEnvironment(BOOLEAN Inherit, + PWSTR *Environment) +{ + MEMORY_BASIC_INFORMATION MemInfo; + PVOID EnvPtr = NULL; + NTSTATUS Status = STATUS_SUCCESS; + ULONG RegionSize = PAGE_SIZE; + + if (Inherit == TRUE) + { + RtlAcquirePebLock(); + + if (NtCurrentPeb()->ProcessParameters->Environment != NULL) + { + Status = NtQueryVirtualMemory(NtCurrentProcess(), + NtCurrentPeb()->ProcessParameters->Environment, + MemoryBasicInformation, + &MemInfo, + sizeof(MEMORY_BASIC_INFORMATION), + NULL); + if (!NT_SUCCESS(Status)) + { + RtlReleasePebLock(); + *Environment = NULL; + return(Status); + } + + RegionSize = MemInfo.RegionSize; + Status = NtAllocateVirtualMemory(NtCurrentProcess(), + &EnvPtr, + 0, + &RegionSize, + MEM_RESERVE | MEM_COMMIT, + PAGE_READWRITE); + if (!NT_SUCCESS(Status)) + { + RtlReleasePebLock(); + *Environment = NULL; + return(Status); + } + + memmove(EnvPtr, + NtCurrentPeb ()->ProcessParameters->Environment, + MemInfo.RegionSize); + + *Environment = EnvPtr; + } + + RtlReleasePebLock (); + } + else + { + Status = NtAllocateVirtualMemory(NtCurrentProcess(), + &EnvPtr, + 0, + &RegionSize, + MEM_RESERVE | MEM_COMMIT, + PAGE_READWRITE); + if (NT_SUCCESS(Status)) + { + memset(EnvPtr, + 0, + RegionSize); + *Environment = EnvPtr; + } + } + + return(Status); +} + + +/* + * @implemented + */ +VOID STDCALL +RtlDestroyEnvironment(PWSTR Environment) +{ + ULONG Size = 0; + + NtFreeVirtualMemory(NtCurrentProcess(), + (PVOID*)&Environment, + &Size, + MEM_RELEASE); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlExpandEnvironmentStrings_U(PWSTR Environment, + PUNICODE_STRING Source, + PUNICODE_STRING Destination, + PULONG Length) +{ + UNICODE_STRING var; + UNICODE_STRING val; + NTSTATUS Status = STATUS_SUCCESS; + BOOLEAN flag = FALSE; + PWSTR s; + PWSTR d; + PWSTR w; + int src_len; + int dst_max; + int tail; + + DPRINT("RtlExpandEnvironmentStrings_U %p %wZ %p %p\n", + Environment, Source, Destination, Length); + + src_len = Source->Length / sizeof(WCHAR); + s = Source->Buffer; + dst_max = Destination->MaximumLength / sizeof(WCHAR); + d = Destination->Buffer; + + while (src_len) + { + if (*s == L'%') + { + if (flag) + { + flag = FALSE; + goto copy; + } + w = s + 1; + tail = src_len - 1; + while (*w != L'%' && tail) + { + w++; + tail--; + } + if (!tail) + goto copy; + + var.Length = (w - ( s + 1)) * sizeof(WCHAR); + var.MaximumLength = var.Length; + var.Buffer = s + 1; + + val.Length = 0; + val.MaximumLength = dst_max * sizeof(WCHAR); + val.Buffer = d; + Status = RtlQueryEnvironmentVariable_U (Environment, &var, &val); + if (NT_SUCCESS(Status)) + { + d += val.Length / sizeof(WCHAR); + dst_max -= val.Length / sizeof(WCHAR); + s = w + 1; + src_len = tail - 1; + continue; + } + /* variable not found or buffer too small, just copy %var% */ + flag = TRUE; + } +copy: + if (!dst_max) + { + Status = STATUS_BUFFER_TOO_SMALL; + break; + } + + *d++ = *s++; + dst_max--; + src_len--; + } + + Destination->Length = (d - Destination->Buffer) * sizeof(WCHAR); + if (Length != NULL) + *Length = Destination->Length; + if (dst_max) + Destination->Buffer[Destination->Length / sizeof(WCHAR)] = 0; + + DPRINT("Destination %wZ\n", Destination); + return(Status); +} + + +/* + * @implemented + */ +VOID STDCALL +RtlSetCurrentEnvironment(PWSTR NewEnvironment, + PWSTR *OldEnvironment) +{ + PVOID EnvPtr; + + DPRINT("NewEnvironment %x OldEnvironment %x\n", + NewEnvironment, OldEnvironment); + + RtlAcquirePebLock(); + + EnvPtr = NtCurrentPeb()->ProcessParameters->Environment; + NtCurrentPeb()->ProcessParameters->Environment = NewEnvironment; + + if (OldEnvironment != NULL) + *OldEnvironment = EnvPtr; + + RtlReleasePebLock(); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlSetEnvironmentVariable(PWSTR *Environment, + PUNICODE_STRING Name, + PUNICODE_STRING Value) +{ + MEMORY_BASIC_INFORMATION mbi; + UNICODE_STRING var; + int hole_len, new_len, env_len = 0; + WCHAR *new_env = 0, *env_end = 0, *wcs, *env, *val = 0, *tail = 0, *hole = 0; + PWSTR head = NULL; + ULONG size = 0, new_size; + LONG f = 1; + NTSTATUS Status = STATUS_SUCCESS; + + DPRINT("RtlSetEnvironmentVariable(Environment %p Name %wZ Value %wZ)\n", + Environment, Name, Value); + + if (Environment) + { + env = *Environment; + } + else + { + RtlAcquirePebLock(); + env = NtCurrentPeb()->ProcessParameters->Environment; + } + + if (env) + { + /* get environment length */ + wcs = env_end = env; + do + { + env_end += wcslen(env_end) + 1; + } + while (*env_end); + env_end++; + env_len = env_end - env; + DPRINT("environment length %ld characters\n", env_len); + + /* find where to insert */ + while (*wcs) + { + var.Buffer = wcs++; + wcs = wcschr(wcs, L'='); + if (wcs == NULL) + { + wcs = var.Buffer + wcslen(var.Buffer); + } + if (*wcs) + { + var.Length = (wcs - var.Buffer) * sizeof(WCHAR); + var.MaximumLength = var.Length; + val = ++wcs; + wcs += wcslen(wcs); + f = RtlCompareUnicodeString(&var, Name, TRUE); + if (f >= 0) + { + if (f) /* Insert before found */ + { + hole = tail = var.Buffer; + } + else /* Exact match */ + { + head = var.Buffer; + tail = ++wcs; + hole = val; + } + goto found; + } + } + wcs++; + } + hole = tail = wcs; /* Append to environment */ + } + +found: + if (Value->Length > 0) + { + hole_len = tail - hole; + /* calculate new environment size */ + new_size = Value->Length + sizeof(WCHAR); + /* adding new variable */ + if (f) + new_size += Name->Length + sizeof(WCHAR); + new_len = new_size / sizeof(WCHAR); + if (hole_len < new_len) + { + /* enlarge environment size */ + /* check the size of available memory */ + new_size += (env_len - hole_len) * sizeof(WCHAR); + new_size = ROUNDUP(new_size, PAGE_SIZE); + mbi.RegionSize = 0; + DPRINT("new_size %lu\n", new_size); + + if (env) + { + Status = NtQueryVirtualMemory(NtCurrentProcess(), + env, + MemoryBasicInformation, + &mbi, + sizeof(MEMORY_BASIC_INFORMATION), + NULL); + if (!NT_SUCCESS(Status)) + { + if (Environment == NULL) + { + RtlReleasePebLock(); + } + return(Status); + } + } + + if (new_size > mbi.RegionSize) + { + /* reallocate memory area */ + Status = NtAllocateVirtualMemory(NtCurrentProcess(), + (VOID**)&new_env, + 0, + &new_size, + MEM_RESERVE | MEM_COMMIT, + PAGE_READWRITE); + if (!NT_SUCCESS(Status)) + { + if (Environment == NULL) + { + RtlReleasePebLock(); + } + return(Status); + } + + if (env) + { + memmove(new_env, + env, + (hole - env) * sizeof(WCHAR)); + hole = new_env + (hole - env); + } + else + { + /* absolutely new environment */ + tail = hole = new_env; + *hole = 0; + env_end = hole + 1; + } + } + } + + /* move tail */ + memmove (hole + new_len, tail, (env_end - tail) * sizeof(WCHAR)); + + if (new_env) + { + /* we reallocated environment, let's free the old one */ + if (Environment) + *Environment = new_env; + else + NtCurrentPeb()->ProcessParameters->Environment = new_env; + + if (env) + { + size = 0; + NtFreeVirtualMemory(NtCurrentProcess(), + (PVOID*)&env, + &size, + MEM_RELEASE); + } + } + + /* and now copy given stuff */ + if (f) + { + /* copy variable name and '=' character */ + memmove(hole, + Name->Buffer, + Name->Length); + hole += Name->Length / sizeof(WCHAR); + *hole++ = L'='; + } + + /* copy value */ + memmove(hole, + Value->Buffer, + Value->Length); + hole += Value->Length / sizeof(WCHAR); + *hole = 0; + } + else + { + /* remove the environment variable */ + if (f == 0) + { + memmove(head, + tail, + (env_end - tail) * sizeof(WCHAR)); + } + else + { + Status = STATUS_VARIABLE_NOT_FOUND; + } + } + + if (Environment == NULL) + { + RtlReleasePebLock(); + } + + return(Status); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlQueryEnvironmentVariable_U(PWSTR Environment, + PUNICODE_STRING Name, + PUNICODE_STRING Value) +{ + NTSTATUS Status; + PWSTR wcs; + UNICODE_STRING var; + PWSTR val; + int len; + BOOLEAN SysEnvUsed = FALSE; + + DPRINT("RtlQueryEnvironmentVariable_U Environment %p Variable %wZ Value %p\n", + Environment, Name, Value); + + if (Environment == NULL) + { + Environment = NtCurrentPeb()->ProcessParameters->Environment; + SysEnvUsed = TRUE; + } + + if (Environment == NULL) + return(STATUS_VARIABLE_NOT_FOUND); + + Value->Length = 0; + if (SysEnvUsed == TRUE) + RtlAcquirePebLock(); + + wcs = Environment; + len = Name->Length / sizeof(WCHAR); + while (*wcs) + { + var.Buffer = wcs++; + wcs = wcschr(wcs, L'='); + if (wcs == NULL) + { + wcs = var.Buffer + wcslen(var.Buffer); + } + if (*wcs) + { + var.Length = var.MaximumLength = (wcs - var.Buffer) * sizeof(WCHAR); + val = ++wcs; + wcs += wcslen(wcs); + + if (RtlEqualUnicodeString(&var, Name, TRUE)) + { + Value->Length = (wcs - val) * sizeof(WCHAR); + if (Value->Length < Value->MaximumLength) + { + memcpy(Value->Buffer, val, Value->Length + sizeof(WCHAR)); + DPRINT("Value %S\n", val); + DPRINT("Return STATUS_SUCCESS\n"); + Status = STATUS_SUCCESS; + } + else + { + DPRINT("Return STATUS_BUFFER_TOO_SMALL\n"); + Status = STATUS_BUFFER_TOO_SMALL; + } + + if (SysEnvUsed == TRUE) + RtlReleasePebLock(); + + return(Status); + } + } + wcs++; + } + + if (SysEnvUsed == TRUE) + RtlReleasePebLock(); + + DPRINT("Return STATUS_VARIABLE_NOT_FOUND\n"); + return(STATUS_VARIABLE_NOT_FOUND); +} + +/* EOF */ diff --git a/reactos/lib/rtl/error.c b/reactos/lib/rtl/error.c new file mode 100644 index 00000000000..2fadaa214b6 --- /dev/null +++ b/reactos/lib/rtl/error.c @@ -0,0 +1,992 @@ +/* $Id: error.c,v 1.1 2004/05/31 19:29:02 gdalsnes Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * PURPOSE: Rtl error functions + * FILE: lib/rtl/error.c + * PROGRAMER: Eric Kohl + * REVISION HISTORY: + * 22/07/99: Added RtlNtStatusToDosError. + * 1999-11-30: Added RtlNtStatusToPsxErrno. + * 1999-12-18: STDCALL RtlNtStatusToDosError + */ + +/* + * Partially taken from WINE, original copyright: + * + * Copyright 2000 Alexandre Julliard + */ + +/* INCLUDES *****************************************************************/ + +#include <ddk/ntddk.h> +#include <errors.h> + +#define NDEBUG +#include <debug.h> + +#ifndef HIWORD +#define HIWORD(l) ((WORD)(((DWORD)(l) >> 16) & 0xFFFF)) +#endif +#ifndef LOWORD +#define LOWORD(l) ((WORD)(l)) +#endif + +/* TYPES *******************************************************************/ + +typedef struct _ERROR_TABLE +{ + ULONG Start; + ULONG End; + const WORD *Table; +} +ERROR_TABLE, *PERROR_TABLE; + + +/* FUNCTIONS ***************************************************************/ + +static const WORD table_00000103[11] = + { + ERROR_IO_PENDING, /* 00000103 (STATUS_PENDING) */ + ERROR_MR_MID_NOT_FOUND, /* 00000104 (STATUS_REPARSE) */ + ERROR_MORE_DATA, /* 00000105 (STATUS_MORE_ENTRIES) */ + ERROR_NOT_ALL_ASSIGNED, /* 00000106 (STATUS_NOT_ALL_ASSIGNED) */ + ERROR_SOME_NOT_MAPPED, /* 00000107 (STATUS_SOME_NOT_MAPPED) */ + ERROR_MR_MID_NOT_FOUND, /* 00000108 (STATUS_OPLOCK_BREAK_IN_PROCESS) */ + ERROR_MR_MID_NOT_FOUND, /* 00000109 (STATUS_VOLUME_MOUNTED) */ + ERROR_MR_MID_NOT_FOUND, /* 0000010a (STATUS_RXACT_COMMITTED) */ + ERROR_MR_MID_NOT_FOUND, /* 0000010b (STATUS_NOTIFY_CLEANUP) */ + ERROR_NOTIFY_ENUM_DIR, /* 0000010c (STATUS_NOTIFY_ENUM_DIR) */ + ERROR_NO_QUOTAS_FOR_ACCOUNT /* 0000010d (STATUS_NO_QUOTAS_FOR_ACCOUNT) */ + // /* 0000010e (STATUS_PRIMARY_TRANSPORT_CONNECT_FAILED) */ + }; + +static const WORD table_40000002[12] = + { + ERROR_INVALID_PARAMETER, /* 40000002 */ + ERROR_MR_MID_NOT_FOUND, /* 40000003 */ + ERROR_MR_MID_NOT_FOUND, /* 40000004 */ + ERROR_MR_MID_NOT_FOUND, /* 40000005 */ + ERROR_LOCAL_USER_SESSION_KEY, /* 40000006 (STATUS_LOCAL_USER_SESSION_KEY) */ + ERROR_MR_MID_NOT_FOUND, /* 40000007 */ + ERROR_MORE_WRITES, /* 40000008 (STATUS_SERIAL_MORE_WRITES) */ + ERROR_REGISTRY_RECOVERED, /* 40000009 (STATUS_REGISTRY_RECOVERED) */ + ERROR_MR_MID_NOT_FOUND, /* 4000000a */ + ERROR_MR_MID_NOT_FOUND, /* 4000000b */ + ERROR_COUNTER_TIMEOUT, /* 4000000c (STATUS_SERIAL_COUNTER_TIMEOUT) */ + ERROR_NULL_LM_PASSWORD /* 4000000d (STATUS_NULL_LM_PASSWORD) */ + }; + +static const WORD table_40020056[1] = + { + RPC_S_UUID_LOCAL_ONLY /* 40020056 */ + }; + +static const WORD table_400200af[1] = + { + RPC_S_SEND_INCOMPLETE /* 400200af */ + }; + +static const WORD table_80000001[38] = + { + 0, /* 80000001 (STATUS_GUARD_PAGE_VIOLATION) */ + ERROR_NOACCESS, /* 80000002 (STATUS_DATATYPE_MISALIGNMENT) */ + 0, /* 80000003 (STATUS_BREAKPOINT) */ + 0, /* 80000004 (STATUS_SINGLE_STEP) */ + ERROR_MORE_DATA, /* 80000005 (STATUS_BUFFER_OVERFLOW) */ + ERROR_NO_MORE_FILES, /* 80000006 (STATUS_NO_MORE_FILES) */ + ERROR_MR_MID_NOT_FOUND, /* 80000007 (STATUS_WAKE_SYSTEM_DEBUGGER) */ + ERROR_MR_MID_NOT_FOUND, /* 80000008 */ + ERROR_MR_MID_NOT_FOUND, /* 80000009 */ + ERROR_MR_MID_NOT_FOUND, /* 8000000a (STATUS_HANDLES_CLOSED) */ + ERROR_NO_INHERITANCE, /* 8000000b (STATUS_NO_INHERITANCE) */ + ERROR_MR_MID_NOT_FOUND, /* 8000000c (STATUS_GUID_SUBSTITUTION_MADE) */ + ERROR_PARTIAL_COPY, /* 8000000d (STATUS_PARTIAL_COPY) */ + ERROR_OUT_OF_PAPER, /* 8000000e (STATUS_DEVICE_PAPER_EMPTY) */ + ERROR_NOT_READY, /* 8000000f (STATUS_DEVICE_POWERED_OFF) */ + ERROR_NOT_READY, /* 80000010 (STATUS_DEVICE_OFF_LINE) */ + ERROR_BUSY, /* 80000011 (STATUS_DEVICE_BUSY) */ + ERROR_NO_MORE_ITEMS, /* 80000012 (STATUS_NO_MORE_EAS) */ + ERROR_INVALID_EA_NAME, /* 80000013 (STATUS_INVALID_EA_NAME) */ + ERROR_EA_LIST_INCONSISTENT, /* 80000014 (STATUS_EA_LIST_INCONSISTENT) */ + ERROR_EA_LIST_INCONSISTENT, /* 80000015 (STATUS_INVALID_EA_FLAG) */ + ERROR_MEDIA_CHANGED, /* 80000016 (STATUS_VERIFY_REQUIRED) */ + ERROR_MR_MID_NOT_FOUND, /* 80000017 (STATUS_EXTRANEOUS_INFORMATION) */ + ERROR_MR_MID_NOT_FOUND, /* 80000018 (STATUS_RXACT_COMMIT_NECESSARY) */ + ERROR_MR_MID_NOT_FOUND, /* 80000019 */ + ERROR_NO_MORE_ITEMS, /* 8000001a (STATUS_NO_MORE_ENTRIES) */ + ERROR_FILEMARK_DETECTED, /* 8000001b (STATUS_FILEMARK_DETECTED) */ + ERROR_MEDIA_CHANGED, /* 8000001c (STATUS_MEDIA_CHANGED) */ + ERROR_BUS_RESET, /* 8000001d (STATUS_BUS_RESET) */ + ERROR_END_OF_MEDIA, /* 8000001e (STATUS_END_OF_MEDIA) */ + ERROR_BEGINNING_OF_MEDIA, /* 8000001f (STATUS_BEGINNING_OF_MEDIA) */ + ERROR_MR_MID_NOT_FOUND, /* 80000020 (STATUS_MEDIA_CHECK) */ + ERROR_SETMARK_DETECTED, /* 80000021 (STATUS_SETMARK_DETECTED) */ + ERROR_NO_DATA_DETECTED, /* 80000022 (STATUS_NO_DATA_DETECTED) */ + ERROR_MR_MID_NOT_FOUND, /* 80000023 (STATUS_REDIRECTOR_HAS_OPEN_HANDLES) */ + ERROR_MR_MID_NOT_FOUND, /* 80000024 (STATUS_SERVER_HAS_OPEN_HANDLES) */ + ERROR_ACTIVE_CONNECTIONS, /* 80000025 (STATUS_ALREADY_DISCONNECTED) */ + ERROR_MR_MID_NOT_FOUND /* 80000026 (STATUS_LONGJUMP) */ + }; + +static const WORD table_80090300[23] = + { + ERROR_NO_SYSTEM_RESOURCES, /* 80090300 */ + ERROR_INVALID_HANDLE, /* 80090301 */ + ERROR_INVALID_FUNCTION, /* 80090302 */ + ERROR_BAD_NETPATH, /* 80090303 */ + ERROR_INTERNAL_ERROR, /* 80090304 */ + ERROR_NO_SUCH_PACKAGE, /* 80090305 */ + ERROR_NOT_OWNER, /* 80090306 */ + ERROR_NO_SUCH_PACKAGE, /* 80090307 */ + ERROR_INVALID_PARAMETER, /* 80090308 */ + ERROR_INVALID_PARAMETER, /* 80090309 */ + ERROR_NOT_SUPPORTED, /* 8009030a */ + ERROR_CANNOT_IMPERSONATE, /* 8009030b */ + ERROR_LOGON_FAILURE, /* 8009030c */ + ERROR_INVALID_PARAMETER, /* 8009030d */ + ERROR_NO_SUCH_LOGON_SESSION, /* 8009030e */ + ERROR_ACCESS_DENIED, /* 8009030f */ + ERROR_ACCESS_DENIED, /* 80090310 */ + ERROR_NO_LOGON_SERVERS, /* 80090311 */ + ERROR_MR_MID_NOT_FOUND, /* 80090312 */ + ERROR_MR_MID_NOT_FOUND, /* 80090313 */ + ERROR_MR_MID_NOT_FOUND, /* 80090314 */ + ERROR_MR_MID_NOT_FOUND, /* 80090315 */ + ERROR_NO_SUCH_PACKAGE /* 80090316 */ + }; + +static const WORD table_c0000001[411] = + { + ERROR_GEN_FAILURE, /* c0000001 (STATUS_UNSUCCESSFUL) */ + ERROR_INVALID_FUNCTION, /* c0000002 (STATUS_NOT_IMPLEMENTED) */ + ERROR_INVALID_PARAMETER, /* c0000003 (STATUS_INVALID_INFO_CLASS) */ + ERROR_BAD_LENGTH, /* c0000004 (STATUS_INFO_LENGTH_MISMATCH) */ + ERROR_NOACCESS, /* c0000005 (STATUS_ACCESS_VIOLATION) */ + ERROR_SWAPERROR, /* c0000006 (STATUS_IN_PAGE_ERROR) */ + ERROR_PAGEFILE_QUOTA, /* c0000007 (STATUS_PAGEFILE_QUOTA) */ + ERROR_INVALID_HANDLE, /* c0000008 (STATUS_INVALID_HANDLE) */ + ERROR_STACK_OVERFLOW, /* c0000009 (STATUS_BAD_INITIAL_STACK) */ + ERROR_BAD_EXE_FORMAT, /* c000000a (STATUS_BAD_INITIAL_PC) */ + ERROR_INVALID_PARAMETER, /* c000000b (STATUS_INVALID_CID) */ + ERROR_MR_MID_NOT_FOUND, /* c000000c (STATUS_TIMER_NOT_CANCELED) */ + ERROR_INVALID_PARAMETER, /* c000000d (STATUS_INVALID_PARAMETER) */ + ERROR_FILE_NOT_FOUND, /* c000000e (STATUS_NO_SUCH_DEVICE) */ + ERROR_FILE_NOT_FOUND, /* c000000f (STATUS_NO_SUCH_FILE) */ + ERROR_INVALID_FUNCTION, /* c0000010 (STATUS_INVALID_DEVICE_REQUEST) */ + ERROR_HANDLE_EOF, /* c0000011 (STATUS_END_OF_FILE) */ + ERROR_WRONG_DISK, /* c0000012 (STATUS_WRONG_VOLUME) */ + ERROR_NOT_READY, /* c0000013 (STATUS_NO_MEDIA_IN_DEVICE) */ + ERROR_UNRECOGNIZED_MEDIA, /* c0000014 (STATUS_UNRECOGNIZED_MEDIA) */ + ERROR_SECTOR_NOT_FOUND, /* c0000015 (STATUS_NONEXISTENT_SECTOR) */ + ERROR_MORE_DATA, /* c0000016 (STATUS_MORE_PROCESSING_REQUIRED) */ + ERROR_NOT_ENOUGH_MEMORY, /* c0000017 (STATUS_NO_MEMORY) */ + ERROR_INVALID_ADDRESS, /* c0000018 (STATUS_CONFLICTING_ADDRESSES) */ + ERROR_INVALID_ADDRESS, /* c0000019 (STATUS_NOT_MAPPED_VIEW) */ + ERROR_INVALID_PARAMETER, /* c000001a (STATUS_UNABLE_TO_FREE_VM) */ + ERROR_INVALID_PARAMETER, /* c000001b (STATUS_UNABLE_TO_DELETE_SECTION) */ + ERROR_INVALID_FUNCTION, /* c000001c (STATUS_INVALID_SYSTEM_SERVICE) */ + 0, /* c000001d (STATUS_ILLEGAL_INSTRUCTION) */ + ERROR_ACCESS_DENIED, /* c000001e (STATUS_INVALID_LOCK_SEQUENCE) */ + ERROR_ACCESS_DENIED, /* c000001f (STATUS_INVALID_VIEW_SIZE) */ + ERROR_BAD_EXE_FORMAT, /* c0000020 (STATUS_INVALID_FILE_FOR_SECTION) */ + ERROR_ACCESS_DENIED, /* c0000021 (STATUS_ALREADY_COMMITTED) */ + ERROR_ACCESS_DENIED, /* c0000022 (STATUS_ACCESS_DENIED) */ + ERROR_INSUFFICIENT_BUFFER, /* c0000023 (STATUS_BUFFER_TOO_SMALL) */ + ERROR_INVALID_HANDLE, /* c0000024 (STATUS_OBJECT_TYPE_MISMATCH) */ + 0, /* c0000025 (STATUS_NONCONTINUABLE_EXCEPTION) */ + 0, /* c0000026 (STATUS_INVALID_DISPOSITION) */ + ERROR_MR_MID_NOT_FOUND, /* c0000027 (STATUS_UNWIND) */ + ERROR_MR_MID_NOT_FOUND, /* c0000028 (STATUS_BAD_STACK) */ + ERROR_MR_MID_NOT_FOUND, /* c0000029 (STATUS_INVALID_UNWIND_TARGET) */ + ERROR_NOT_LOCKED, /* c000002a (STATUS_NOT_LOCKED) */ + 0, /* c000002b (STATUS_PARITY_ERROR) */ + ERROR_INVALID_ADDRESS, /* c000002c (STATUS_UNABLE_TO_DECOMMIT_VM) */ + ERROR_INVALID_ADDRESS, /* c000002d (STATUS_NOT_COMMITTED) */ + ERROR_MR_MID_NOT_FOUND, /* c000002e (STATUS_INVALID_PORT_ATTRIBUTES) */ + ERROR_MR_MID_NOT_FOUND, /* c000002f (STATUS_PORT_MESSAGE_TOO_LONG) */ + ERROR_INVALID_PARAMETER, /* c0000030 (STATUS_INVALID_PARAMETER_MIX) */ + ERROR_MR_MID_NOT_FOUND, /* c0000031 (STATUS_INVALID_QUOTA_LOWER) */ + ERROR_DISK_CORRUPT, /* c0000032 (STATUS_DISK_CORRUPT_ERROR) */ + ERROR_INVALID_NAME, /* c0000033 (STATUS_OBJECT_NAME_INVALID) */ + ERROR_FILE_NOT_FOUND, /* c0000034 (STATUS_OBJECT_NAME_NOT_FOUND) */ + ERROR_ALREADY_EXISTS, /* c0000035 (STATUS_OBJECT_NAME_COLLISION) */ + ERROR_MR_MID_NOT_FOUND, /* c0000036 */ + ERROR_INVALID_HANDLE, /* c0000037 (STATUS_PORT_DISCONNECTED) */ + ERROR_MR_MID_NOT_FOUND, /* c0000038 (STATUS_DEVICE_ALREADY_ATTACHED) */ + ERROR_BAD_PATHNAME, /* c0000039 (STATUS_OBJECT_PATH_INVALID) */ + ERROR_PATH_NOT_FOUND, /* c000003a (STATUS_OBJECT_PATH_NOT_FOUND) */ + ERROR_BAD_PATHNAME, /* c000003b (STATUS_PATH_SYNTAX_BAD) */ + ERROR_IO_DEVICE, /* c000003c (STATUS_DATA_OVERRUN) */ + ERROR_IO_DEVICE, /* c000003d (STATUS_DATA_LATE_ERROR) */ + ERROR_CRC, /* c000003e (STATUS_DATA_ERROR) */ + ERROR_CRC, /* c000003f (STATUS_CRC_ERROR) */ + ERROR_NOT_ENOUGH_MEMORY, /* c0000040 (STATUS_SECTION_TOO_BIG) */ + ERROR_ACCESS_DENIED, /* c0000041 (STATUS_PORT_CONNECTION_REFUSED) */ + ERROR_INVALID_HANDLE, /* c0000042 (STATUS_INVALID_PORT_HANDLE) */ + ERROR_SHARING_VIOLATION, /* c0000043 (STATUS_SHARING_VIOLATION) */ + ERROR_NOT_ENOUGH_QUOTA, /* c0000044 (STATUS_QUOTA_EXCEEDED) */ + ERROR_INVALID_PARAMETER, /* c0000045 (STATUS_INVALID_PAGE_PROTECTION) */ + ERROR_NOT_OWNER, /* c0000046 (STATUS_MUTANT_NOT_OWNED) */ + ERROR_TOO_MANY_POSTS, /* c0000047 (STATUS_SEMAPHORE_LIMIT_EXCEEDED) */ + ERROR_INVALID_PARAMETER, /* c0000048 (STATUS_PORT_ALREADY_SET) */ + ERROR_INVALID_PARAMETER, /* c0000049 (STATUS_SECTION_NOT_IMAGE) */ + ERROR_SIGNAL_REFUSED, /* c000004a (STATUS_SUSPEND_COUNT_EXCEEDED) */ + ERROR_ACCESS_DENIED, /* c000004b (STATUS_THREAD_IS_TERMINATING) */ + ERROR_INVALID_PARAMETER, /* c000004c (STATUS_BAD_WORKING_SET_LIMIT) */ + ERROR_INVALID_PARAMETER, /* c000004d (STATUS_INCOMPATIBLE_FILE_MAP) */ + ERROR_INVALID_PARAMETER, /* c000004e (STATUS_SECTION_PROTECTION) */ + ERROR_MR_MID_NOT_FOUND, /* c000004f (STATUS_EAS_NOT_SUPPORTED) */ + ERROR_EA_LIST_INCONSISTENT, /* c0000050 (STATUS_EA_TOO_LARGE) */ + ERROR_FILE_CORRUPT, /* c0000051 (STATUS_NONEXISTENT_EA_ENTRY) */ + ERROR_FILE_CORRUPT, /* c0000052 (STATUS_NO_EAS_ON_FILE) */ + ERROR_FILE_CORRUPT, /* c0000053 (STATUS_EA_CORRUPT_ERROR) */ + ERROR_LOCK_VIOLATION, /* c0000054 (STATUS_LOCK_NOT_GRANTED) */ + ERROR_LOCK_VIOLATION, /* c0000055 (STATUS_FILE_LOCK_CONFLICT) */ + ERROR_ACCESS_DENIED, /* c0000056 (STATUS_DELETE_PENDING) */ + ERROR_NOT_SUPPORTED, /* c0000057 (STATUS_CTL_FILE_NOT_SUPPORTED) */ + ERROR_UNKNOWN_REVISION, /* c0000058 (STATUS_UNKNOWN_REVISION) */ + ERROR_REVISION_MISMATCH, /* c0000059 (STATUS_REVISION_MISMATCH) */ + ERROR_INVALID_OWNER, /* c000005a (STATUS_INVALID_OWNER) */ + ERROR_INVALID_PRIMARY_GROUP, /* c000005b (STATUS_INVALID_PRIMARY_GROUP) */ + ERROR_NO_IMPERSONATION_TOKEN, /* c000005c (STATUS_NO_IMPERSONATION_TOKEN) */ + ERROR_CANT_DISABLE_MANDATORY, /* c000005d (STATUS_CANT_DISABLE_MANDATORY) */ + ERROR_NO_LOGON_SERVERS, /* c000005e (STATUS_NO_LOGON_SERVERS) */ + ERROR_NO_SUCH_LOGON_SESSION, /* c000005f (STATUS_NO_SUCH_LOGON_SESSION) */ + ERROR_NO_SUCH_PRIVILEGE, /* c0000060 (STATUS_NO_SUCH_PRIVILEGE) */ + ERROR_PRIVILEGE_NOT_HELD, /* c0000061 (STATUS_PRIVILEGE_NOT_HELD) */ + ERROR_INVALID_ACCOUNT_NAME, /* c0000062 (STATUS_INVALID_ACCOUNT_NAME) */ + ERROR_USER_EXISTS, /* c0000063 (STATUS_USER_EXISTS) */ + ERROR_NO_SUCH_USER, /* c0000064 (STATUS_NO_SUCH_USER) */ + ERROR_GROUP_EXISTS, /* c0000065 (STATUS_GROUP_EXISTS) */ + ERROR_NO_SUCH_GROUP, /* c0000066 (STATUS_NO_SUCH_GROUP) */ + ERROR_MEMBER_IN_GROUP, /* c0000067 (STATUS_MEMBER_IN_GROUP) */ + ERROR_MEMBER_NOT_IN_GROUP, /* c0000068 (STATUS_MEMBER_NOT_IN_GROUP) */ + ERROR_LAST_ADMIN, /* c0000069 (STATUS_LAST_ADMIN) */ + ERROR_INVALID_PASSWORD, /* c000006a (STATUS_WRONG_PASSWORD) */ + ERROR_ILL_FORMED_PASSWORD, /* c000006b (STATUS_ILL_FORMED_PASSWORD) */ + ERROR_PASSWORD_RESTRICTION, /* c000006c (STATUS_PASSWORD_RESTRICTION) */ + ERROR_LOGON_FAILURE, /* c000006d (STATUS_LOGON_FAILURE) */ + ERROR_ACCOUNT_RESTRICTION, /* c000006e (STATUS_ACCOUNT_RESTRICTION) */ + ERROR_INVALID_LOGON_HOURS, /* c000006f (STATUS_INVALID_LOGON_HOURS) */ + ERROR_INVALID_WORKSTATION, /* c0000070 (STATUS_INVALID_WORKSTATION) */ + ERROR_PASSWORD_EXPIRED, /* c0000071 (STATUS_PASSWORD_EXPIRED) */ + ERROR_ACCOUNT_DISABLED, /* c0000072 (STATUS_ACCOUNT_DISABLED) */ + ERROR_NONE_MAPPED, /* c0000073 (STATUS_NONE_MAPPED) */ + ERROR_TOO_MANY_LUIDS_REQUESTED, /* c0000074 (STATUS_TOO_MANY_LUIDS_REQUESTED) */ + ERROR_LUIDS_EXHAUSTED, /* c0000075 (STATUS_LUIDS_EXHAUSTED) */ + ERROR_INVALID_SUB_AUTHORITY, /* c0000076 (STATUS_INVALID_SUB_AUTHORITY) */ + ERROR_INVALID_ACL, /* c0000077 (STATUS_INVALID_ACL) */ + ERROR_INVALID_SID, /* c0000078 (STATUS_INVALID_SID) */ + ERROR_INVALID_SECURITY_DESCR, /* c0000079 (STATUS_INVALID_SECURITY_DESCR) */ + ERROR_PROC_NOT_FOUND, /* c000007a (STATUS_PROCEDURE_NOT_FOUND) */ + ERROR_BAD_EXE_FORMAT, /* c000007b (STATUS_INVALID_IMAGE_FORMAT) */ + ERROR_NO_TOKEN, /* c000007c (STATUS_NO_TOKEN) */ + ERROR_BAD_INHERITANCE_ACL, /* c000007d (STATUS_BAD_INHERITANCE_ACL) */ + ERROR_NOT_LOCKED, /* c000007e (STATUS_RANGE_NOT_LOCKED) */ + ERROR_DISK_FULL, /* c000007f (STATUS_DISK_FULL) */ + ERROR_SERVER_DISABLED, /* c0000080 (STATUS_SERVER_DISABLED) */ + ERROR_SERVER_NOT_DISABLED, /* c0000081 (STATUS_SERVER_NOT_DISABLED) */ + ERROR_TOO_MANY_NAMES, /* c0000082 (STATUS_TOO_MANY_GUIDS_REQUESTED) */ + ERROR_NO_MORE_ITEMS, /* c0000083 (STATUS_GUIDS_EXHAUSTED) */ + ERROR_INVALID_ID_AUTHORITY, /* c0000084 (STATUS_INVALID_ID_AUTHORITY) */ + ERROR_NO_MORE_ITEMS, /* c0000085 (STATUS_AGENTS_EXHAUSTED) */ + ERROR_LABEL_TOO_LONG, /* c0000086 (STATUS_INVALID_VOLUME_LABEL) */ + ERROR_OUTOFMEMORY, /* c0000087 (STATUS_SECTION_NOT_EXTENDED) */ + ERROR_INVALID_ADDRESS, /* c0000088 (STATUS_NOT_MAPPED_DATA) */ + ERROR_RESOURCE_DATA_NOT_FOUND, /* c0000089 (STATUS_RESOURCE_DATA_NOT_FOUND) */ + ERROR_RESOURCE_TYPE_NOT_FOUND, /* c000008a (STATUS_RESOURCE_TYPE_NOT_FOUND) */ + ERROR_RESOURCE_NAME_NOT_FOUND, /* c000008b (STATUS_RESOURCE_NAME_NOT_FOUND) */ + 0, /* c000008c (STATUS_ARRAY_BOUNDS_EXCEEDED) */ + 0, /* c000008d (STATUS_FLOAT_DENORMAL_OPERAND) */ + 0, /* c000008e (STATUS_FLOAT_DIVIDE_BY_ZERO) */ + 0, /* c000008f (STATUS_FLOAT_INEXACT_RESULT) */ + 0, /* c0000090 (STATUS_FLOAT_INVALID_OPERATION) */ + 0, /* c0000091 (STATUS_FLOAT_OVERFLOW) */ + 0, /* c0000092 (STATUS_FLOAT_STACK_CHECK) */ + 0, /* c0000093 (STATUS_FLOAT_UNDERFLOW) */ + 0, /* c0000094 (STATUS_INTEGER_DIVIDE_BY_ZERO) */ + ERROR_ARITHMETIC_OVERFLOW, /* c0000095 (STATUS_INTEGER_OVERFLOW) */ + 0, /* c0000096 (STATUS_PRIVILEGED_INSTRUCTION) */ + ERROR_NOT_ENOUGH_MEMORY, /* c0000097 (STATUS_TOO_MANY_PAGING_FILES) */ + ERROR_FILE_INVALID, /* c0000098 (STATUS_FILE_INVALID) */ + ERROR_ALLOTTED_SPACE_EXCEEDED, /* c0000099 (STATUS_ALLOTTED_SPACE_EXCEEDED) */ + ERROR_NO_SYSTEM_RESOURCES, /* c000009a (STATUS_INSUFFICIENT_RESOURCES) */ + ERROR_PATH_NOT_FOUND, /* c000009b (STATUS_DFS_EXIT_PATH_FOUND) */ + ERROR_CRC, /* c000009c (STATUS_DEVICE_DATA_ERROR) */ + ERROR_NOT_READY, /* c000009d (STATUS_DEVICE_NOT_CONNECTED) */ + ERROR_NOT_READY, /* c000009e (STATUS_DEVICE_POWER_FAILURE) */ + ERROR_INVALID_ADDRESS, /* c000009f (STATUS_FREE_VM_NOT_AT_BASE) */ + ERROR_INVALID_ADDRESS, /* c00000a0 (STATUS_MEMORY_NOT_ALLOCATED) */ + ERROR_WORKING_SET_QUOTA, /* c00000a1 (STATUS_WORKING_SET_QUOTA) */ + ERROR_WRITE_PROTECT, /* c00000a2 (STATUS_MEDIA_WRITE_PROTECTED) */ + ERROR_NOT_READY, /* c00000a3 (STATUS_DEVICE_NOT_READY) */ + ERROR_INVALID_GROUP_ATTRIBUTES, /* c00000a4 (STATUS_INVALID_GROUP_ATTRIBUTES) */ + ERROR_BAD_IMPERSONATION_LEVEL, /* c00000a5 (STATUS_BAD_IMPERSONATION_LEVEL) */ + ERROR_CANT_OPEN_ANONYMOUS, /* c00000a6 (STATUS_CANT_OPEN_ANONYMOUS) */ + ERROR_BAD_VALIDATION_CLASS, /* c00000a7 (STATUS_BAD_VALIDATION_CLASS) */ + ERROR_BAD_TOKEN_TYPE, /* c00000a8 (STATUS_BAD_TOKEN_TYPE)*/ + ERROR_MR_MID_NOT_FOUND, /* c00000a9 (STATUS_BAD_MASTER_BOOT_RECORD) */ + ERROR_MR_MID_NOT_FOUND, /* c00000aa (STATUS_INSTRUCTION_MISALIGNMENT) */ + ERROR_PIPE_BUSY, /* c00000ab (STATUS_INSTANCE_NOT_AVAILABLE) */ + ERROR_PIPE_BUSY, /* c00000ac (STATUS_PIPE_NOT_AVAILABLE) */ + ERROR_BAD_PIPE, /* c00000ad (STATUS_INVALID_PIPE_STATE) */ + ERROR_PIPE_BUSY, /* c00000ae (STATUS_PIPE_BUSY) */ + ERROR_INVALID_FUNCTION, /* c00000af (STATUS_ILLEGAL_FUNCTION) */ + ERROR_PIPE_NOT_CONNECTED, /* c00000b0 (STATUS_PIPE_DISCONNECTED) */ + ERROR_NO_DATA, /* c00000b1 (STATUS_PIPE_CLOSING) */ + ERROR_PIPE_CONNECTED, /* c00000b2 (STATUS_PIPE_CONNECTED) */ + ERROR_PIPE_LISTENING, /* c00000b3 (STATUS_PIPE_LISTENING) */ + ERROR_BAD_PIPE, /* c00000b4 (STATUS_INVALID_READ_MODE) */ + ERROR_SEM_TIMEOUT, /* c00000b5 (STATUS_IO_TIMEOUT) */ + ERROR_HANDLE_EOF, /* c00000b6 (STATUS_FILE_FORCED_CLOSED) */ + ERROR_MR_MID_NOT_FOUND, /* c00000b7 (STATUS_PROFILING_NOT_STARTED) */ + ERROR_MR_MID_NOT_FOUND, /* c00000b8 (STATUS_PROFILING_NOT_STOPPED) */ + ERROR_MR_MID_NOT_FOUND, /* c00000b9 (STATUS_COULD_NOT_INTERPRET) */ + ERROR_ACCESS_DENIED, /* c00000ba (STATUS_FILE_IS_A_DIRECTORY) */ + ERROR_NOT_SUPPORTED, /* c00000bb (STATUS_NOT_SUPPORTED) */ + ERROR_REM_NOT_LIST, /* c00000bc (STATUS_REMOTE_NOT_LISTENING) */ + ERROR_DUP_NAME, /* c00000bd (STATUS_DUPLICATE_NAME) */ + ERROR_BAD_NETPATH, /* c00000be (STATUS_BAD_NETWORK_PATH) */ + ERROR_NETWORK_BUSY, /* c00000bf (STATUS_NETWORK_BUSY) */ + ERROR_DEV_NOT_EXIST, /* c00000c0 (STATUS_DEVICE_DOES_NOT_EXIST) */ + ERROR_TOO_MANY_CMDS, /* c00000c1 (STATUS_TOO_MANY_COMMANDS) */ + ERROR_ADAP_HDW_ERR, /* c00000c2 (STATUS_ADAPTER_HARDWARE_ERROR) */ + ERROR_BAD_NET_RESP, /* c00000c3 (STATUS_INVALID_NETWORK_RESPONSE) */ + ERROR_UNEXP_NET_ERR, /* c00000c4 (STATUS_UNEXPECTED_NETWORK_ERROR) */ + ERROR_BAD_REM_ADAP, /* c00000c5 (STATUS_BAD_REMOTE_ADAPTER) */ + ERROR_PRINTQ_FULL, /* c00000c6 (STATUS_PRINT_QUEUE_FULL) */ + ERROR_NO_SPOOL_SPACE, /* c00000c7 (STATUS_NO_SPOOL_SPACE) */ + ERROR_PRINT_CANCELLED, /* c00000c8 (STATUS_PRINT_CANCELLED) */ + ERROR_NETNAME_DELETED, /* c00000c9 (STATUS_NETWORK_NAME_DELETED) */ + ERROR_NETWORK_ACCESS_DENIED, /* c00000ca (STATUS_NETWORK_ACCESS_DENIED) */ + ERROR_BAD_DEV_TYPE, /* c00000cb (STATUS_BAD_DEVICE_TYPE) */ + ERROR_BAD_NET_NAME, /* c00000cc (STATUS_BAD_NETWORK_NAME) */ + ERROR_TOO_MANY_NAMES, /* c00000cd (STATUS_TOO_MANY_NAMES) */ + ERROR_TOO_MANY_SESS, /* c00000ce (STATUS_TOO_MANY_SESSIONS) */ + ERROR_SHARING_PAUSED, /* c00000cf (STATUS_SHARING_PAUSED) */ + ERROR_REQ_NOT_ACCEP, /* c00000d0 (STATUS_REQUEST_NOT_ACCEPTED) */ + ERROR_REDIR_PAUSED, /* c00000d1 (STATUS_REDIRECTOR_PAUSED) */ + ERROR_NET_WRITE_FAULT, /* c00000d2 (STATUS_NET_WRITE_FAULT) */ + ERROR_MR_MID_NOT_FOUND, /* c00000d3 (STATUS_PROFILING_AT_LIMIT) */ + ERROR_NOT_SAME_DEVICE, /* c00000d4 (STATUS_NOT_SAME_DEVICE) */ + ERROR_MR_MID_NOT_FOUND, /* c00000d5 (STATUS_FILE_RENAMED) */ + ERROR_VC_DISCONNECTED, /* c00000d6 (STATUS_VIRTUAL_CIRCUIT_CLOSED) */ + ERROR_NO_SECURITY_ON_OBJECT, /* c00000d7 (STATUS_NO_SECURITY_ON_OBJECT) */ + ERROR_MR_MID_NOT_FOUND, /* c00000d8 (STATUS_CANT_WAIT) */ + ERROR_NO_DATA, /* c00000d9 (STATUS_PIPE_EMPTY) */ + ERROR_CANT_ACCESS_DOMAIN_INFO, /* c00000da (STATUS_CANT_ACCESS_DOMAIN_INFO) */ + ERROR_MR_MID_NOT_FOUND, /* c00000db (STATUS_CANT_TERMINATE_SELF) */ + ERROR_INVALID_SERVER_STATE, /* c00000dc (STATUS_INVALID_SERVER_STATE) */ + ERROR_INVALID_DOMAIN_STATE, /* c00000dd (STATUS_INVALID_DOMAIN_STATE) */ + ERROR_INVALID_DOMAIN_ROLE, /* c00000de (STATUS_INVALID_DOMAIN_ROLE) */ + ERROR_NO_SUCH_DOMAIN, /* c00000df (STATUS_NO_SUCH_DOMAIN) */ + ERROR_DOMAIN_EXISTS, /* c00000e0 (STATUS_DOMAIN_EXISTS) */ + ERROR_DOMAIN_LIMIT_EXCEEDED, /* c00000e1 (STATUS_DOMAIN_LIMIT_EXCEEDED) */ + ERROR_MR_MID_NOT_FOUND, /* c00000e2 (STATUS_OPLOCK_NOT_GRANTED) */ + ERROR_MR_MID_NOT_FOUND, /* c00000e3 (STATUS_INVALID_OPLOCK_PROTOCOL) */ + ERROR_INTERNAL_DB_CORRUPTION, /* c00000e4 (STATUS_INTERNAL_DB_CORRUPTION) */ + ERROR_INTERNAL_ERROR, /* c00000e5 (STATUS_INTERNAL_ERROR) */ + ERROR_GENERIC_NOT_MAPPED, /* c00000e6 (STATUS_GENERIC_NOT_MAPPED) */ + ERROR_BAD_DESCRIPTOR_FORMAT, /* c00000e7 (STATUS_BAD_DESCRIPTOR_FORMAT) */ + ERROR_INVALID_USER_BUFFER, /* c00000e8 (STATUS_INVALID_USER_BUFFER) */ + ERROR_MR_MID_NOT_FOUND, /* c00000e9 (STATUS_UNEXPECTED_IO_ERROR) */ + ERROR_MR_MID_NOT_FOUND, /* c00000ea (STATUS_UNEXPECTED_MM_CREATE_ERR) */ + ERROR_MR_MID_NOT_FOUND, /* c00000eb (STATUS_UNEXPECTED_MM_MAP_ERROR) */ + ERROR_MR_MID_NOT_FOUND, /* c00000ec (STATUS_UNEXPECTED_MM_EXTEND_ERR) */ + ERROR_NOT_LOGON_PROCESS, /* c00000ed (STATUS_NOT_LOGON_PROCESS) */ + ERROR_LOGON_SESSION_EXISTS, /* c00000ee (STATUS_LOGON_SESSION_EXISTS) */ + ERROR_INVALID_PARAMETER, /* c00000ef (STATUS_INVALID_PARAMETER_1) */ + ERROR_INVALID_PARAMETER, /* c00000f0 (STATUS_INVALID_PARAMETER_2) */ + ERROR_INVALID_PARAMETER, /* c00000f1 (STATUS_INVALID_PARAMETER_3) */ + ERROR_INVALID_PARAMETER, /* c00000f2 (STATUS_INVALID_PARAMETER_4) */ + ERROR_INVALID_PARAMETER, /* c00000f3 (STATUS_INVALID_PARAMETER_5) */ + ERROR_INVALID_PARAMETER, /* c00000f4 (STATUS_INVALID_PARAMETER_6) */ + ERROR_INVALID_PARAMETER, /* c00000f5 (STATUS_INVALID_PARAMETER_7) */ + ERROR_INVALID_PARAMETER, /* c00000f6 (STATUS_INVALID_PARAMETER_8) */ + ERROR_INVALID_PARAMETER, /* c00000f7 (STATUS_INVALID_PARAMETER_9) */ + ERROR_INVALID_PARAMETER, /* c00000f8 (STATUS_INVALID_PARAMETER_10) */ + ERROR_INVALID_PARAMETER, /* c00000f9 (STATUS_INVALID_PARAMETER_11) */ + ERROR_INVALID_PARAMETER, /* c00000fa (STATUS_INVALID_PARAMETER_12) */ + ERROR_PATH_NOT_FOUND, /* c00000fb (STATUS_REDIRECTOR_NOT_STARTED) */ + ERROR_MR_MID_NOT_FOUND, /* c00000fc (STATUS_REDIRECTOR_STARTED) */ + ERROR_STACK_OVERFLOW, /* c00000fd (STATUS_STACK_OVERFLOW) */ + ERROR_NO_SUCH_PACKAGE, /* c00000fe (STATUS_NO_SUCH_PACKAGE) */ + ERROR_MR_MID_NOT_FOUND, /* c00000ff (STATUS_BAD_FUNCTION_TABLE) */ + ERROR_ENVVAR_NOT_FOUND, /* c0000100 (STATUS_VARIABLE_NOT_FOUND) */ + ERROR_DIR_NOT_EMPTY, /* c0000101 (STATUS_DIRECTORY_NOT_EMPTY) */ + ERROR_FILE_CORRUPT, /* c0000102 (STATUS_FILE_CORRUPT_ERROR) */ + ERROR_DIRECTORY, /* c0000103 (STATUS_NOT_A_DIRECTORY) */ + ERROR_BAD_LOGON_SESSION_STATE, /* c0000104 (STATUS_BAD_LOGON_SESSION_STATE) */ + ERROR_LOGON_SESSION_COLLISION, /* c0000105 (STATUS_LOGON_SESSION_COLLISION) */ + ERROR_FILENAME_EXCED_RANGE, /* c0000106 (STATUS_NAME_TOO_LONG) */ + ERROR_MR_MID_NOT_FOUND, /* c0000107 (STATUS_FILES_OPEN) */ + ERROR_DEVICE_IN_USE, /* c0000108 (STATUS_CONNECTION_IN_USE) */ + ERROR_MR_MID_NOT_FOUND, /* c0000109 (STATUS_MESSAGE_NOT_FOUND) */ + ERROR_ACCESS_DENIED, /* c000010a (STATUS_PROCESS_IS_TERMINATING) */ + ERROR_INVALID_LOGON_TYPE, /* c000010b (STATUS_INVALID_LOGON_TYPE) */ + ERROR_MR_MID_NOT_FOUND, /* c000010c (STATUS_NO_GUID_TRANSLATION) */ + ERROR_CANNOT_IMPERSONATE, /* c000010d (STATUS_CANNOT_IMPERSONATE) */ + ERROR_SERVICE_ALREADY_RUNNING, /* c000010e (STATUS_IMAGE_ALREADY_LOADED) */ + ERROR_MR_MID_NOT_FOUND, /* c000010f (STATUS_ABIOS_NOT_PRESENT) */ + ERROR_MR_MID_NOT_FOUND, /* c0000110 (STATUS_ABIOS_LID_NOT_EXIST) */ + ERROR_MR_MID_NOT_FOUND, /* c0000111 (STATUS_ABIOS_LID_ALREADY_OWNED) */ + ERROR_MR_MID_NOT_FOUND, /* c0000112 (STATUS_ABIOS_NOT_LID_OWNER) */ + ERROR_MR_MID_NOT_FOUND, /* c0000113 (STATUS_ABIOS_INVALID_COMMAND) */ + ERROR_MR_MID_NOT_FOUND, /* c0000114 (STATUS_ABIOS_INVALID_LID) */ + ERROR_MR_MID_NOT_FOUND, /* c0000115 (STATUS_ABIOS_SELECTOR_NOT_AVAILABLE) */ + ERROR_MR_MID_NOT_FOUND, /* c0000116 (STATUS_ABIOS_INVALID_SELECTOR) */ + ERROR_MR_MID_NOT_FOUND, /* c0000117 (STATUS_NO_LDT) */ + ERROR_MR_MID_NOT_FOUND, /* c0000118 (STATUS_INVALID_LDT_SIZE) */ + ERROR_MR_MID_NOT_FOUND, /* c0000119 (STATUS_INVALID_LDT_OFFSET) */ + ERROR_MR_MID_NOT_FOUND, /* c000011a (STATUS_INVALID_LDT_DESCRIPTOR) */ + ERROR_BAD_EXE_FORMAT, /* c000011b (STATUS_INVALID_IMAGE_NE_FORMAT) */ + ERROR_RXACT_INVALID_STATE, /* c000011c (STATUS_RXACT_INVALID_STATE) */ + ERROR_RXACT_COMMIT_FAILURE, /* c000011d (STATUS_RXACT_COMMIT_FAILURE) */ + ERROR_FILE_INVALID, /* c000011e (STATUS_MAPPED_FILE_SIZE_ZERO) */ + ERROR_TOO_MANY_OPEN_FILES, /* c000011f (STATUS_TOO_MANY_OPENED_FILES) */ + ERROR_OPERATION_ABORTED, /* c0000120 (STATUS_CANCELLED) */ + ERROR_ACCESS_DENIED, /* c0000121 (STATUS_CANNOT_DELETE) */ + ERROR_INVALID_COMPUTERNAME, /* c0000122 (STATUS_INVALID_COMPUTER_NAME) */ + ERROR_ACCESS_DENIED, /* c0000123 (STATUS_FILE_DELETED) */ + ERROR_SPECIAL_ACCOUNT, /* c0000124 (STATUS_SPECIAL_ACCOUNT) */ + ERROR_SPECIAL_GROUP, /* c0000125 (STATUS_SPECIAL_GROUP) */ + ERROR_SPECIAL_USER, /* c0000126 (STATUS_SPECIAL_USER) */ + ERROR_MEMBERS_PRIMARY_GROUP, /* c0000127 (STATUS_MEMBERS_PRIMARY_GROUP) */ + ERROR_INVALID_HANDLE, /* c0000128 (STATUS_FILE_CLOSED) */ + ERROR_MR_MID_NOT_FOUND, /* c0000129 (STATUS_TOO_MANY_THREADS) */ + ERROR_MR_MID_NOT_FOUND, /* c000012a (STATUS_THREAD_NOT_IN_PROCESS) */ + ERROR_TOKEN_ALREADY_IN_USE, /* c000012b (STATUS_TOKEN_ALREADY_IN_USE) */ + ERROR_MR_MID_NOT_FOUND, /* c000012c (STATUS_PAGEFILE_QUOTA_EXCEEDED) */ + ERROR_COMMITMENT_LIMIT, /* c000012d (STATUS_COMMITMENT_LIMIT) */ + ERROR_BAD_EXE_FORMAT, /* c000012e (STATUS_INVALID_IMAGE_LE_FORMAT) */ + ERROR_BAD_EXE_FORMAT, /* c000012f (STATUS_INVALID_IMAGE_NOT_MZ) */ + ERROR_BAD_EXE_FORMAT, /* c0000130 (STATUS_INVALID_IMAGE_PROTECT) */ + ERROR_BAD_EXE_FORMAT, /* c0000131 (STATUS_INVALID_IMAGE_WIN_16) */ + ERROR_MR_MID_NOT_FOUND, /* c0000132 (STATUS_LOGON_SERVER_CONFLICT) */ + ERROR_MR_MID_NOT_FOUND, /* c0000133 (STATUS_TIME_DIFFERENCE_AT_DC) */ + ERROR_MR_MID_NOT_FOUND, /* c0000134 (STATUS_SYNCHRONIZATION_REQUIRED) */ + ERROR_MOD_NOT_FOUND, /* c0000135 (STATUS_DLL_NOT_FOUND) */ + ERROR_MR_MID_NOT_FOUND, /* c0000136 (STATUS_OPEN_FAILED) */ + ERROR_MR_MID_NOT_FOUND, /* c0000137 (STATUS_IO_PRIVILEGE_FAILED) */ + ERROR_INVALID_ORDINAL, /* c0000138 (STATUS_ORDINAL_NOT_FOUND) */ + ERROR_PROC_NOT_FOUND, /* c0000139 (STATUS_ENTRYPOINT_NOT_FOUND) */ + ERROR_MR_MID_NOT_FOUND, /* c000013a (STATUS_CONTROL_C_EXIT) */ + ERROR_NETNAME_DELETED, /* c000013b (STATUS_LOCAL_DISCONNECT) */ + ERROR_NETNAME_DELETED, /* c000013c (STATUS_REMOTE_DISCONNECT) */ + ERROR_REM_NOT_LIST, /* c000013d (STATUS_REMOTE_RESOURCES) */ + ERROR_UNEXP_NET_ERR, /* c000013e (STATUS_LINK_FAILED) */ + ERROR_UNEXP_NET_ERR, /* c000013f (STATUS_LINK_TIMEOUT) */ + ERROR_UNEXP_NET_ERR, /* c0000140 (STATUS_INVALID_CONNECTION) */ + ERROR_UNEXP_NET_ERR, /* c0000141 (STATUS_INVALID_ADDRESS) */ + ERROR_DLL_INIT_FAILED, /* c0000142 (STATUS_DLL_INIT_FAILED) */ + ERROR_MR_MID_NOT_FOUND, /* c0000143 (STATUS_MISSING_SYSTEMFILE) */ + ERROR_MR_MID_NOT_FOUND, /* c0000144 (STATUS_UNHANDLED_EXCEPTION) */ + ERROR_MR_MID_NOT_FOUND, /* c0000145 (STATUS_APP_INIT_FAILURE) */ + ERROR_MR_MID_NOT_FOUND, /* c0000146 (STATUS_PAGEFILE_CREATE_FAILED) */ + ERROR_MR_MID_NOT_FOUND, /* c0000147 (STATUS_NO_PAGEFILE) */ + ERROR_INVALID_LEVEL, /* c0000148 (STATUS_INVALID_LEVEL) */ + ERROR_INVALID_PASSWORD, /* c0000149 (STATUS_WRONG_PASSWORD_CORE) */ + ERROR_MR_MID_NOT_FOUND, /* c000014a (STATUS_ILLEGAL_FLOAT_CONTEXT) */ + ERROR_BROKEN_PIPE, /* c000014b (STATUS_PIPE_BROKEN) */ + ERROR_BADDB, /* c000014c (STATUS_REGISTRY_CORRUPT) */ + ERROR_REGISTRY_IO_FAILED, /* c000014d (STATUS_REGISTRY_IO_FAILED) */ + ERROR_MR_MID_NOT_FOUND, /* c000014e (STATUS_NO_EVENT_PAIR) */ + ERROR_UNRECOGNIZED_VOLUME, /* c000014f (STATUS_UNRECOGNIZED_VOLUME) */ + ERROR_SERIAL_NO_DEVICE, /* c0000150 (STATUS_SERIAL_NO_DEVICE_INITED) */ + ERROR_NO_SUCH_ALIAS, /* c0000151 (STATUS_NO_SUCH_ALIAS) */ + ERROR_MEMBER_NOT_IN_ALIAS, /* c0000152 (STATUS_MEMBER_NOT_IN_ALIAS) */ + ERROR_MEMBER_IN_ALIAS, /* c0000153 (STATUS_MEMBER_IN_ALIAS) */ + ERROR_ALIAS_EXISTS, /* c0000154 (STATUS_ALIAS_EXISTS) */ + ERROR_LOGON_NOT_GRANTED, /* c0000155 (STATUS_LOGON_NOT_GRANTED) */ + ERROR_TOO_MANY_SECRETS, /* c0000156 (STATUS_TOO_MANY_SECRETS) */ + ERROR_SECRET_TOO_LONG, /* c0000157 (STATUS_SECRET_TOO_LONG) */ + ERROR_INTERNAL_DB_ERROR, /* c0000158 (STATUS_INTERNAL_DB_ERROR) */ + ERROR_FULLSCREEN_MODE, /* c0000159 (STATUS_FULLSCREEN_MODE) */ + ERROR_TOO_MANY_CONTEXT_IDS, /* c000015a (STATUS_TOO_MANY_CONTEXT_IDS) */ + ERROR_LOGON_TYPE_NOT_GRANTED, /* c000015b (STATUS_LOGON_TYPE_NOT_GRANTED) */ + ERROR_NOT_REGISTRY_FILE, /* c000015c (STATUS_NOT_REGISTRY_FILE) */ + ERROR_NT_CROSS_ENCRYPTION_REQUIRED, /* c000015d (STATUS_NT_CROSS_ENCRYPTION_REQUIRED) */ + ERROR_MR_MID_NOT_FOUND, /* c000015e (STATUS_DOMAIN_CTRLR_CONFIG_ERROR) */ + ERROR_IO_DEVICE, /* c000015f (STATUS_FT_MISSING_MEMBER) */ + ERROR_MR_MID_NOT_FOUND, /* c0000160 (STATUS_ILL_FORMED_SERVICE_ENTRY) */ + ERROR_MR_MID_NOT_FOUND, /* c0000161 (STATUS_ILLEGAL_CHARACTER) */ + ERROR_NO_UNICODE_TRANSLATION, /* c0000162 (STATUS_UNMAPPABLE_CHARACTER) */ + ERROR_MR_MID_NOT_FOUND, /* c0000163 (STATUS_UNDEFINED_CHARACTER) */ + ERROR_MR_MID_NOT_FOUND, /* c0000164 (STATUS_FLOPPY_VOLUME) */ + ERROR_FLOPPY_ID_MARK_NOT_FOUND, /* c0000165 (STATUS_FLOPPY_ID_MARK_NOT_FOUND) */ + ERROR_FLOPPY_WRONG_CYLINDER, /* c0000166 (STATUS_FLOPPY_WRONG_CYLINDER) */ + ERROR_FLOPPY_UNKNOWN_ERROR, /* c0000167 (STATUS_FLOPPY_UNKNOWN_ERROR) */ + ERROR_FLOPPY_BAD_REGISTERS, /* c0000168 (STATUS_FLOPPY_BAD_REGISTERS) */ + ERROR_DISK_RECALIBRATE_FAILED, /* c0000169 (STATUS_DISK_RECALIBRATE_FAILED) */ + ERROR_DISK_OPERATION_FAILED, /* c000016a (STATUS_DISK_OPERATION_FAILED) */ + ERROR_DISK_RESET_FAILED, /* c000016b (STATUS_DISK_RESET_FAILED) */ + ERROR_IRQ_BUSY, /* c000016c (STATUS_SHARED_IRQ_BUSY) */ + ERROR_IO_DEVICE, /* c000016d (STATUS_FT_ORPHANING) */ + ERROR_MR_MID_NOT_FOUND, /* c000016e (STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT) */ + ERROR_MR_MID_NOT_FOUND, /* c000016f */ + ERROR_MR_MID_NOT_FOUND, /* c0000170 */ + ERROR_MR_MID_NOT_FOUND, /* c0000171 */ + ERROR_PARTITION_FAILURE, /* c0000172 (STATUS_PARTITION_FAILURE) */ + ERROR_INVALID_BLOCK_LENGTH, /* c0000173 (STATUS_INVALID_BLOCK_LENGTH) */ + ERROR_DEVICE_NOT_PARTITIONED, /* c0000174 (STATUS_DEVICE_NOT_PARTITIONED) */ + ERROR_UNABLE_TO_LOCK_MEDIA, /* c0000175 (STATUS_UNABLE_TO_LOCK_MEDIA) */ + ERROR_UNABLE_TO_UNLOAD_MEDIA, /* c0000176 (STATUS_UNABLE_TO_UNLOAD_MEDIA) */ + ERROR_EOM_OVERFLOW, /* c0000177 (STATUS_EOM_OVERFLOW) */ + ERROR_NO_MEDIA_IN_DRIVE, /* c0000178 (STATUS_NO_MEDIA) */ + ERROR_MR_MID_NOT_FOUND, /* c0000179 */ + ERROR_NO_SUCH_MEMBER, /* c000017a (STATUS_NO_SUCH_MEMBER) */ + ERROR_INVALID_MEMBER, /* c000017b (STATUS_INVALID_MEMBER) */ + ERROR_KEY_DELETED, /* c000017c (STATUS_KEY_DELETED) */ + ERROR_NO_LOG_SPACE, /* c000017d (STATUS_NO_LOG_SPACE) */ + ERROR_TOO_MANY_SIDS, /* c000017e (STATUS_TOO_MANY_SIDS) */ + ERROR_LM_CROSS_ENCRYPTION_REQUIRED, /* c000017f (STATUS_LM_CROSS_ENCRYPTION_REQUIRED) */ + ERROR_KEY_HAS_CHILDREN, /* c0000180 (STATUS_KEY_HAS_CHILDREN) */ + ERROR_CHILD_MUST_BE_VOLATILE, /* c0000181 (STATUS_CHILD_MUST_BE_VOLATILE) */ + ERROR_INVALID_PARAMETER, /* c0000182 (STATUS_DEVICE_CONFIGURATION_ERROR) */ + ERROR_IO_DEVICE, /* c0000183 (STATUS_DRIVER_INTERNAL_ERROR) */ + ERROR_BAD_COMMAND, /* c0000184 (STATUS_INVALID_DEVICE_STATE) */ + ERROR_IO_DEVICE, /* c0000185 (STATUS_IO_DEVICE_ERROR) */ + ERROR_IO_DEVICE, /* c0000186 (STATUS_DEVICE_PROTOCOL_ERROR) */ + ERROR_MR_MID_NOT_FOUND, /* c0000187 (STATUS_BACKUP_CONTROLLER) */ + ERROR_LOG_FILE_FULL, /* c0000188 (STATUS_LOG_FILE_FULL) */ + ERROR_WRITE_PROTECT, /* c0000189 (STATUS_TOO_LATE) */ + ERROR_NO_TRUST_LSA_SECRET, /* c000018a (STATUS_NO_TRUST_LSA_SECRET) */ + ERROR_NO_TRUST_SAM_ACCOUNT, /* c000018b (STATUS_NO_TRUST_SAM_ACCOUNT) */ + ERROR_TRUSTED_DOMAIN_FAILURE, /* c000018c (STATUS_TRUSTED_DOMAIN_FAILURE) */ + ERROR_TRUSTED_RELATIONSHIP_FAILURE, /* c000018d (STATUS_TRUSTED_RELATIONSHIP_FAILURE) */ + ERROR_EVENTLOG_FILE_CORRUPT, /* c000018e (STATUS_EVENTLOG_FILE_CORRUPT) */ + ERROR_EVENTLOG_CANT_START, /* c000018f (STATUS_EVENTLOG_CANT_START) */ + ERROR_TRUST_FAILURE, /* c0000190 (STATUS_TRUST_FAILURE) */ + ERROR_MR_MID_NOT_FOUND, /* c0000191 (STATUS_MUTANT_LIMIT_EXCEEDED) */ + ERROR_NETLOGON_NOT_STARTED, /* c0000192 (STATUS_NETLOGON_NOT_STARTED) */ + ERROR_ACCOUNT_EXPIRED, /* c0000193 (STATUS_ACCOUNT_EXPIRED) */ + ERROR_POSSIBLE_DEADLOCK, /* c0000194 (STATUS_POSSIBLE_DEADLOCK) */ + ERROR_SESSION_CREDENTIAL_CONFLICT, /* c0000195 (STATUS_NETWORK_CREDENTIAL_CONFLICT) */ + ERROR_REMOTE_SESSION_LIMIT_EXCEEDED, /* c0000196 (STATUS_REMOTE_SESSION_LIMIT) */ + ERROR_EVENTLOG_FILE_CHANGED, /* c0000197 (STATUS_EVENTLOG_FILE_CHANGED) */ + ERROR_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT,/* c0000198 (STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT) */ + ERROR_NOLOGON_WORKSTATION_TRUST_ACCOUNT,/* c0000199 (STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT) */ + ERROR_NOLOGON_SERVER_TRUST_ACCOUNT, /* c000019a (STATUS_NOLOGON_SERVER_TRUST_ACCOUNT) */ + ERROR_DOMAIN_TRUST_INCONSISTENT /* c000019b (STATUS_DOMAIN_TRUST_INCONSISTENT) */ + }; + +static const WORD table_c0000202[109] = + { + ERROR_NO_USER_SESSION_KEY, /* c0000202 (STATUS_NO_USER_SESSION_KEY) */ + ERROR_UNEXP_NET_ERR, /* c0000203 (STATUS_USER_SESSION_DELETED) */ + ERROR_RESOURCE_LANG_NOT_FOUND, /* c0000204 (STATUS_RESOURCE_LANG_NOT_FOUND) */ + ERROR_NOT_ENOUGH_SERVER_MEMORY, /* c0000205 (STATUS_INSUFF_SERVER_RESOURCES) */ + ERROR_INVALID_USER_BUFFER, /* c0000206 (STATUS_INVALID_BUFFER_SIZE) */ + ERROR_INVALID_NETNAME, /* c0000207 (STATUS_INVALID_ADDRESS_COMPONENT) */ + ERROR_INVALID_NETNAME, /* c0000208 (STATUS_INVALID_ADDRESS_WILDCARD) */ + ERROR_TOO_MANY_NAMES, /* c0000209 (STATUS_TOO_MANY_ADDRESSES) */ + ERROR_DUP_NAME, /* c000020a (STATUS_ADDRESS_ALREADY_EXISTS) */ + ERROR_NETNAME_DELETED, /* c000020b (STATUS_ADDRESS_CLOSED) */ + ERROR_NETNAME_DELETED, /* c000020c (STATUS_CONNECTION_DISCONNECTED) */ + ERROR_NETNAME_DELETED, /* c000020d (STATUS_CONNECTION_RESET) */ + ERROR_TOO_MANY_NAMES, /* c000020e (STATUS_TOO_MANY_NODES) */ + ERROR_UNEXP_NET_ERR, /* c000020f (STATUS_TRANSACTION_ABORTED) */ + ERROR_UNEXP_NET_ERR, /* c0000210 (STATUS_TRANSACTION_TIMED_OUT) */ + ERROR_UNEXP_NET_ERR, /* c0000211 (STATUS_TRANSACTION_NO_RELEASE) */ + ERROR_UNEXP_NET_ERR, /* c0000212 (STATUS_TRANSACTION_NO_MATCH) */ + ERROR_UNEXP_NET_ERR, /* c0000213 (STATUS_TRANSACTION_RESPONDED) */ + ERROR_UNEXP_NET_ERR, /* c0000214 (STATUS_TRANSACTION_INVALID_ID) */ + ERROR_UNEXP_NET_ERR, /* c0000215 (STATUS_TRANSACTION_INVALID_TYPE) */ + ERROR_NOT_SUPPORTED, /* c0000216 (STATUS_NOT_SERVER_SESSION) */ + ERROR_NOT_SUPPORTED, /* c0000217 (STATUS_NOT_CLIENT_SESSION) */ + ERROR_MR_MID_NOT_FOUND, /* c0000218 (STATUS_CANNOT_LOAD_REGISTRY_FILE) */ + ERROR_MR_MID_NOT_FOUND, /* c0000219 */ + ERROR_MR_MID_NOT_FOUND, /* c000021a */ + ERROR_MR_MID_NOT_FOUND, /* c000021b */ + ERROR_NO_BROWSER_SERVERS_FOUND, /* c000021c (STATUS_NO_BROWSER_SERVERS_FOUND) */ + ERROR_MR_MID_NOT_FOUND, /* c000021d */ + ERROR_MR_MID_NOT_FOUND, /* c000021e */ + ERROR_MR_MID_NOT_FOUND, /* c000021f */ + ERROR_MAPPED_ALIGNMENT, /* c0000220 (STATUS_MAPPED_ALIGNMENT) */ + ERROR_BAD_EXE_FORMAT, /* c0000221 (STATUS_IMAGE_CHECKSUM_MISMATCH) */ + ERROR_MR_MID_NOT_FOUND, /* c0000222 */ + ERROR_MR_MID_NOT_FOUND, /* c0000223 */ + ERROR_PASSWORD_MUST_CHANGE, /* c0000224 (STATUS_PASSWORD_MUST_CHANGE) */ + ERROR_MR_MID_NOT_FOUND, /* c0000225 */ + ERROR_MR_MID_NOT_FOUND, /* c0000226 */ + ERROR_MR_MID_NOT_FOUND, /* c0000227 */ + ERROR_MR_MID_NOT_FOUND, /* c0000228 */ + ERROR_MR_MID_NOT_FOUND, /* c0000229 */ + 0, /* c000022a */ + 0, /* c000022b */ + ERROR_MR_MID_NOT_FOUND, /* c000022c */ + ERROR_MR_MID_NOT_FOUND, /* c000022d */ + ERROR_MR_MID_NOT_FOUND, /* c000022e */ + ERROR_MR_MID_NOT_FOUND, /* c000022f */ + ERROR_MR_MID_NOT_FOUND, /* c0000230 */ + ERROR_MR_MID_NOT_FOUND, /* c0000231 */ + ERROR_MR_MID_NOT_FOUND, /* c0000232 */ + ERROR_DOMAIN_CONTROLLER_NOT_FOUND, /* c0000233 */ + ERROR_ACCOUNT_LOCKED_OUT, /* c0000234 */ + ERROR_INVALID_HANDLE, /* c0000235 */ + ERROR_CONNECTION_REFUSED, /* c0000236 */ + ERROR_GRACEFUL_DISCONNECT, /* c0000237 */ + ERROR_ADDRESS_ALREADY_ASSOCIATED, /* c0000238 */ + ERROR_ADDRESS_NOT_ASSOCIATED, /* c0000239 */ + ERROR_CONNECTION_INVALID, /* c000023a */ + ERROR_CONNECTION_ACTIVE, /* c000023b */ + ERROR_NETWORK_UNREACHABLE, /* c000023c */ + ERROR_HOST_UNREACHABLE, /* c000023d */ + ERROR_PROTOCOL_UNREACHABLE, /* c000023e */ + ERROR_PORT_UNREACHABLE, /* c000023f */ + ERROR_REQUEST_ABORTED, /* c0000240 */ + ERROR_CONNECTION_ABORTED, /* c0000241 */ + ERROR_MR_MID_NOT_FOUND, /* c0000242 */ + ERROR_USER_MAPPED_FILE, /* c0000243 */ + ERROR_MR_MID_NOT_FOUND, /* c0000244 */ + ERROR_MR_MID_NOT_FOUND, /* c0000245 */ + ERROR_CONNECTION_COUNT_LIMIT, /* c0000246 */ + ERROR_LOGIN_TIME_RESTRICTION, /* c0000247 */ + ERROR_LOGIN_WKSTA_RESTRICTION, /* c0000248 */ + ERROR_BAD_EXE_FORMAT, /* c0000249 */ + ERROR_MR_MID_NOT_FOUND, /* c000024a */ + ERROR_MR_MID_NOT_FOUND, /* c000024b */ + ERROR_MR_MID_NOT_FOUND, /* c000024c */ + ERROR_MR_MID_NOT_FOUND, /* c000024d */ + ERROR_MR_MID_NOT_FOUND, /* c000024e */ + ERROR_MR_MID_NOT_FOUND, /* c000024f */ + ERROR_MR_MID_NOT_FOUND, /* c0000250 */ + ERROR_MR_MID_NOT_FOUND, /* c0000251 */ + ERROR_MR_MID_NOT_FOUND, /* c0000252 */ + ERROR_INTERNAL_ERROR, /* c0000253 */ + ERROR_MR_MID_NOT_FOUND, /* c0000254 */ + ERROR_MR_MID_NOT_FOUND, /* c0000255 */ + ERROR_MR_MID_NOT_FOUND, /* c0000256 */ + ERROR_HOST_UNREACHABLE, /* c0000257 */ + ERROR_MR_MID_NOT_FOUND, /* c0000258 */ + ERROR_LICENSE_QUOTA_EXCEEDED, /* c0000259 */ + ERROR_MR_MID_NOT_FOUND, /* c000025a */ + ERROR_MR_MID_NOT_FOUND, /* c000025b */ + ERROR_MR_MID_NOT_FOUND, /* c000025c */ + ERROR_MR_MID_NOT_FOUND, /* c000025d */ + ERROR_SERVICE_DISABLED, /* c000025e */ + ERROR_MR_MID_NOT_FOUND, /* c000025f */ + ERROR_MR_MID_NOT_FOUND, /* c0000260 */ + ERROR_MR_MID_NOT_FOUND, /* c0000261 */ + ERROR_INVALID_ORDINAL, /* c0000262 */ + ERROR_PROC_NOT_FOUND, /* c0000263 */ + ERROR_NOT_OWNER, /* c0000264 */ + ERROR_TOO_MANY_LINKS, /* c0000265 */ + ERROR_MR_MID_NOT_FOUND, /* c0000266 */ + ERROR_MR_MID_NOT_FOUND, /* c0000267 */ + ERROR_MR_MID_NOT_FOUND, /* c0000268 */ + ERROR_MR_MID_NOT_FOUND, /* c0000269 */ + ERROR_MR_MID_NOT_FOUND, /* c000026a */ + ERROR_MR_MID_NOT_FOUND, /* c000026b */ + ERROR_MR_MID_NOT_FOUND, /* c000026c */ + ERROR_MR_MID_NOT_FOUND, /* c000026d */ + ERROR_NOT_READY /* c000026e (STATUS_VOLUME_DISMOUNTED) */ + }; + +static const WORD table_c0020001[88] = + { + RPC_S_INVALID_STRING_BINDING, /* c0020001 (RPC_NT_INVALID_STRING_BINDING) */ + RPC_S_WRONG_KIND_OF_BINDING, /* c0020002 (RPC_NT_WRONG_KIND_OF_BINDING) */ + ERROR_INVALID_HANDLE, /* c0020003 (RPC_NT_INVALID_BINDING) */ + RPC_S_PROTSEQ_NOT_SUPPORTED, /* c0020004 (RPC_NT_PROTSEQ_NOT_SUPPORTED) */ + RPC_S_INVALID_RPC_PROTSEQ, /* c0020005 (RPC_NT_INVALID_RPC_PROTSEQ) */ + RPC_S_INVALID_STRING_UUID, /* c0020006 (RPC_NT_INVALID_STRING_UUID) */ + RPC_S_INVALID_ENDPOINT_FORMAT, /* c0020007 (RPC_NT_INVALID_ENDPOINT_FORMAT) */ + RPC_S_INVALID_NET_ADDR, /* c0020008 (RPC_NT_INVALID_NET_ADDR) */ + RPC_S_NO_ENDPOINT_FOUND, /* c0020009 (RPC_NT_NO_ENDPOINT_FOUND) */ + RPC_S_INVALID_TIMEOUT, /* c002000a (RPC_NT_INVALID_TIMEOUT) */ + RPC_S_OBJECT_NOT_FOUND, /* c002000b (RPC_NT_OBJECT_NOT_FOUND) */ + RPC_S_ALREADY_REGISTERED, /* c002000c (RPC_NT_ALREADY_REGISTERED) */ + RPC_S_TYPE_ALREADY_REGISTERED, /* c002000d (RPC_NT_TYPE_ALREADY_REGISTERED) */ + RPC_S_ALREADY_LISTENING, /* c002000e (RPC_NT_ALREADY_LISTENING) */ + RPC_S_NO_PROTSEQS_REGISTERED, /* c002000f (RPC_NT_NO_PROTSEQS_REGISTERED) */ + RPC_S_NOT_LISTENING, /* c0020010 (RPC_NT_NOT_LISTENING) */ + RPC_S_UNKNOWN_MGR_TYPE, /* c0020011 (RPC_NT_UNKNOWN_MGR_TYPE) */ + RPC_S_UNKNOWN_IF, /* c0020012 (RPC_NT_UNKNOWN_IF) */ + RPC_S_NO_BINDINGS, /* c0020013 (RPC_NT_NO_BINDINGS) */ + RPC_S_NO_PROTSEQS, /* c0020014 (RPC_NT_NO_PROTSEQS) */ + RPC_S_CANT_CREATE_ENDPOINT, /* c0020015 (RPC_NT_CANT_CREATE_ENDPOINT) */ + RPC_S_OUT_OF_RESOURCES, /* c0020016 (RPC_NT_OUT_OF_RESOURCES) */ + RPC_S_SERVER_UNAVAILABLE, /* c0020017 (RPC_NT_SERVER_UNAVAILABLE) */ + RPC_S_SERVER_TOO_BUSY, /* c0020018 (RPC_NT_SERVER_TOO_BUSY) */ + RPC_S_INVALID_NETWORK_OPTIONS, /* c0020019 (RPC_NT_INVALID_NETWORK_OPTIONS) */ + RPC_S_NO_CALL_ACTIVE, /* c002001a (RPC_NT_NO_CALL_ACTIVE) */ + RPC_S_CALL_FAILED, /* c002001b (RPC_NT_CALL_FAILED) */ + RPC_S_CALL_FAILED_DNE, /* c002001c (RPC_NT_CALL_FAILED_DNE) */ + RPC_S_PROTOCOL_ERROR, /* c002001d (RPC_NT_PROTOCOL_ERROR) */ + ERROR_MR_MID_NOT_FOUND, /* c002001e */ + RPC_S_UNSUPPORTED_TRANS_SYN, /* c002001f (RPC_NT_UNSUPPORTED_TRANS_SYN) */ + ERROR_MR_MID_NOT_FOUND, /* c0020020 */ + RPC_S_UNSUPPORTED_TYPE, /* c0020021 (RPC_NT_UNSUPPORTED_TYPE) */ + RPC_S_INVALID_TAG, /* c0020022 (RPC_NT_INVALID_TAG) */ + RPC_S_INVALID_BOUND, /* c0020023 (RPC_NT_INVALID_BOUND) */ + RPC_S_NO_ENTRY_NAME, /* c0020024 (RPC_NT_NO_ENTRY_NAME) */ + RPC_S_INVALID_NAME_SYNTAX, /* c0020025 (RPC_NT_INVALID_NAME_SYNTAX) */ + RPC_S_UNSUPPORTED_NAME_SYNTAX, /* c0020026 (RPC_NT_UNSUPPORTED_NAME_SYNTAX) */ + ERROR_MR_MID_NOT_FOUND, /* c0020027 */ + RPC_S_UUID_NO_ADDRESS, /* c0020028 (RPC_NT_UUID_NO_ADDRESS) */ + RPC_S_DUPLICATE_ENDPOINT, /* c0020029 (RPC_NT_DUPLICATE_ENDPOINT) */ + RPC_S_UNKNOWN_AUTHN_TYPE, /* c002002a (RPC_NT_UNKNOWN_AUTHN_TYPE) */ + RPC_S_MAX_CALLS_TOO_SMALL, /* c002002b (RPC_NT_MAX_CALLS_TOO_SMALL) */ + RPC_S_STRING_TOO_LONG, /* c002002c (RPC_NT_STRING_TOO_LONG) */ + RPC_S_PROTSEQ_NOT_FOUND, /* c002002d (RPC_NT_PROTSEQ_NOT_FOUND) */ + RPC_S_PROCNUM_OUT_OF_RANGE, /* c002002e (RPC_NT_PROCNUM_OUT_OF_RANGE) */ + RPC_S_BINDING_HAS_NO_AUTH, /* c002002f (RPC_NT_BINDING_HAS_NO_AUTH) */ + RPC_S_UNKNOWN_AUTHN_SERVICE, /* c0020030 (RPC_NT_UNKNOWN_AUTHN_SERVICE) */ + RPC_S_UNKNOWN_AUTHN_LEVEL, /* c0020031 (RPC_NT_UNKNOWN_AUTHN_LEVEL) */ + RPC_S_INVALID_AUTH_IDENTITY, /* c0020032 (RPC_NT_INVALID_AUTH_IDENTITY) */ + RPC_S_UNKNOWN_AUTHZ_SERVICE, /* c0020033 (RPC_NT_UNKNOWN_AUTHZ_SERVICE) */ + EPT_S_INVALID_ENTRY, /* c0020034 (EPT_NT_INVALID_ENTRY) */ + EPT_S_CANT_PERFORM_OP, /* c0020035 (EPT_NT_CANT_PERFORM_OP) */ + EPT_S_NOT_REGISTERED, /* c0020036 (EPT_NT_NOT_REGISTERED) */ + RPC_S_NOTHING_TO_EXPORT, /* c0020037 (RPC_NT_NOTHING_TO_EXPORT) */ + RPC_S_INCOMPLETE_NAME, /* c0020038 (RPC_NT_INCOMPLETE_NAME) */ + RPC_S_INVALID_VERS_OPTION, /* c0020039 (RPC_NT_INVALID_VERS_OPTION) */ + RPC_S_NO_MORE_MEMBERS, /* c002003a (RPC_NT_NO_MORE_MEMBERS) */ + RPC_S_NOT_ALL_OBJS_UNEXPORTED, /* c002003b (RPC_NT_NOT_ALL_OBJS_UNEXPORTED) */ + RPC_S_INTERFACE_NOT_FOUND, /* c002003c (RPC_NT_INTERFACE_NOT_FOUND) */ + RPC_S_ENTRY_ALREADY_EXISTS, /* c002003d (RPC_NT_ENTRY_ALREADY_EXISTS) */ + RPC_S_ENTRY_NOT_FOUND, /* c002003e (RPC_NT_ENTRY_NOT_FOUND) */ + RPC_S_NAME_SERVICE_UNAVAILABLE, /* c002003f (RPC_NT_NAME_SERVICE_UNAVAILABLE) */ + RPC_S_INVALID_NAF_ID, /* c0020040 (RPC_NT_INVALID_NAF_ID) */ + RPC_S_CANNOT_SUPPORT, /* c0020041 (RPC_NT_CANNOT_SUPPORT) */ + RPC_S_NO_CONTEXT_AVAILABLE, /* c0020042 (RPC_NT_NO_CONTEXT_AVAILABLE) */ + RPC_S_INTERNAL_ERROR, /* c0020043 (RPC_NT_INTERNAL_ERROR) */ + RPC_S_ZERO_DIVIDE, /* c0020044 (RPC_NT_ZERO_DIVIDE) */ + RPC_S_ADDRESS_ERROR, /* c0020045 (RPC_NT_ADDRESS_ERROR) */ + RPC_S_FP_DIV_ZERO, /* c0020046 (RPC_NT_FP_DIV_ZERO) */ + RPC_S_FP_UNDERFLOW, /* c0020047 (RPC_NT_FP_UNDERFLOW) */ + RPC_S_FP_OVERFLOW, /* c0020048 (RPC_NT_FP_OVERFLOW) */ + RPC_S_CALL_IN_PROGRESS, /* c0020049 (RPC_NT_CALL_IN_PROGRESS) */ + RPC_S_NO_MORE_BINDINGS, /* c002004a (RPC_NT_NO_MORE_BINDINGS) */ + RPC_S_GROUP_MEMBER_NOT_FOUND, /* c002004b (RPC_NT_GROUP_MEMBER_NOT_FOUND) */ + EPT_S_CANT_CREATE, /* c002004c (EPT_NT_CANT_CREATE) */ + RPC_S_INVALID_OBJECT, /* c002004d (RPC_NT_INVALID_OBJECT) */ + ERROR_MR_MID_NOT_FOUND, /* c002004e */ + RPC_S_NO_INTERFACES, /* c002004f */ + RPC_S_CALL_CANCELLED, /* c0020050 */ + RPC_S_BINDING_INCOMPLETE, /* c0020051 */ + RPC_S_COMM_FAILURE, /* c0020052 */ + RPC_S_UNSUPPORTED_AUTHN_LEVEL, /* c0020053 */ + RPC_S_NO_PRINC_NAME, /* c0020054 */ + RPC_S_NOT_RPC_ERROR, /* c0020055 */ + ERROR_MR_MID_NOT_FOUND, /* c0020056 */ + RPC_S_SEC_PKG_ERROR, /* c0020057 */ + RPC_S_NOT_CANCELLED /* c0020058 */ + }; + +static const WORD table_c0030001[12] = + { + RPC_X_NO_MORE_ENTRIES, /* c0030001 (RPC_NT_NO_MORE_ENTRIES) */ + RPC_X_SS_CHAR_TRANS_OPEN_FAIL, /* c0030002 (RPC_NT_SS_CHAR_TRANS_OPEN_FAIL) */ + RPC_X_SS_CHAR_TRANS_SHORT_FILE, /* c0030003 (RPC_NT_SS_CHAR_TRANS_SHORT_FILE) */ + ERROR_INVALID_HANDLE, /* c0030004 (RPC_NT_SS_IN_NULL_CONTEXT) */ + ERROR_INVALID_HANDLE, /* c0030005 */ + RPC_X_SS_CONTEXT_DAMAGED, /* c0030006 (RPC_NT_SS_CONTEXT_DAMAGED) */ + RPC_X_SS_HANDLES_MISMATCH, /* c0030007 (RPC_NT_SS_HANDLES_MISMATCH) */ + RPC_X_SS_CANNOT_GET_CALL_HANDLE, /* c0030008 (RPC_NT_SS_CANNOT_GET_CALL_HANDLE) */ + RPC_X_NULL_REF_POINTER, /* c0030009 (RPC_NT_NULL_REF_POINTER) */ + RPC_X_ENUM_VALUE_OUT_OF_RANGE, /* c003000a (RPC_NT_ENUM_VALUE_OUT_OF_RANGE) */ + RPC_X_BYTE_COUNT_TOO_SMALL, /* c003000b (RPC_NT_BYTE_COUNT_TOO_SMALL) */ + RPC_X_BAD_STUB_DATA /* c003000c (RPC_NT_BAD_STUB_DATA) */ + }; + +static const WORD table_c0030059[6] = + { + RPC_X_INVALID_ES_ACTION, /* c0030059 */ + RPC_X_WRONG_ES_VERSION, /* c003005a */ + RPC_X_WRONG_STUB_VERSION, /* c003005b */ + RPC_X_INVALID_PIPE_OBJECT, /* c003005c */ + RPC_X_WRONG_PIPE_ORDER, /* c003005d */ + RPC_X_WRONG_PIPE_VERSION /* c003005e */ + }; + +static const ERROR_TABLE ErrorTable[] = + { + { + 0x00000103, 0x0000010e, table_00000103 + }, + { 0x40000002, 0x4000000e, table_40000002 }, + { 0x40020056, 0x40020057, table_40020056 }, + { 0x400200af, 0x400200b0, table_400200af }, + { 0x80000001, 0x80000027, table_80000001 }, + { 0x80090300, 0x80090317, table_80090300 }, + { 0xc0000001, 0xc000019c, table_c0000001 }, + { 0xc0000202, 0xc000026f, table_c0000202 }, + { 0xc0020001, 0xc0020059, table_c0020001 }, + { 0xc0030001, 0xc003000d, table_c0030001 }, + { 0xc0030059, 0xc003005f, table_c0030059 }, + { 0, 0, 0 } /* last entry */ + }; + + +#if 0 +/* currently not assigned values */ +ERROR_ARENA_TRASHED +STATUS_HANDLE_NOT_WAITABLE ERROR_INVALID_HANDLE; +STATUS_LOCK_NOT_GRANTED ERROR_LOCK_VIOLATION; + +RPC_NT_SS_CONTEXT_MISMATCH ERROR_INVALID_HANDLE +#endif + + +/* FUNCTIONS ***************************************************************/ + +/* + * @implemented + */ +VOID +STDCALL +RtlAssert(PVOID FailedAssertion, + PVOID FileName, + ULONG LineNumber, + PCHAR Message) +{ + if (NULL != Message) + { + DbgPrint("Assertion \'%s\' failed at %s line %d: %s\n", + (PCHAR)FailedAssertion, + (PCHAR)FileName, + LineNumber, + Message); + } + else + { + DbgPrint("Assertion \'%s\' failed at %s line %d\n", + (PCHAR)FailedAssertion, + (PCHAR)FileName, + LineNumber); + } + + DbgBreakPoint(); +} + + +/********************************************************************** + * NAME EXPORTED + * RtlNtStatusToDosErrorNoTeb + * + * DESCRIPTION + * Convert an Executive status ID into a DOS error number + * (winerror.h). + * + * ARGUMENTS + * Status The Executive status ID to convert. + * + * RETURN VALUE + * dos error as in winerror.h + * + * REMARK + * RtlNtStatusToDosErrorNoTeb() does the real work. + * + * @implemented + */ +DWORD STDCALL +RtlNtStatusToDosErrorNoTeb(IN NTSTATUS Status) +{ + PERROR_TABLE Table = (PERROR_TABLE)ErrorTable; + + if (!Status || (Status & 0x20000000)) + return Status; + + /* 0xd... is equivalent to 0xc... */ + if ((Status & 0xf0000000) == 0xd0000000) + Status &= ~0x10000000; + + while (Table->Start) + { + if ((ULONG)Status < Table->Start) + break; + + if ((ULONG)Status < Table->End) + { + DWORD ret = Table->Table[(ULONG)Status - Table->Start]; + if (!ret) + ret = Status; /* 0 means 1:1 mapping */ + else if (ret == ERROR_MR_MID_NOT_FOUND) + { + DPRINT1("RTL: RtlNtStatusToDosErrorNoTeb(0x%lx): no valid W32 error mapping\n", Status); + } + return ret; + } + Table++; + } + + /* now some special cases */ + if (HIWORD(Status) == 0xc001) + return LOWORD(Status); + if (HIWORD(Status) == 0x8007) + return LOWORD(Status); + + DbgPrint("RTL: RtlNtStatusToDosErrorNoTeb(0x%lx): no valid W32 error mapping\n", Status); + + return ERROR_MR_MID_NOT_FOUND; +} + + +/********************************************************************** + * NAME EXPORTED + * RtlNtStatusToDosError + * + * DESCRIPTION + * Convert an Executive status ID into a DOS error number + * (winerror.h). + * + * ARGUMENTS + * Status The Executive status ID to convert. + * + * RETURN VALUE + * dos error as in winerror.h + * + * REMARK + * RtlNtStatusToDosErrorNoTeb() does the real work. + * + * @implemented + */ +DWORD STDCALL +RtlNtStatusToDosError(IN NTSTATUS Status) +{ + PTEB Teb = NtCurrentTeb (); + + if (NULL != Teb) + { + Teb->LastStatusValue = Status; + } + return RtlNtStatusToDosErrorNoTeb(Status); +} + + +/********************************************************************** + * NAME EXPORTED + * RtlNtStatusToPsxErrno + * + * DESCRIPTION + * Convert an Executive status ID into a POSIX error number + * (errno.h). + * + * NOTE + * Not present in the legacy WNT (a ReactOS extension to support + * the POSIX+ subsystem). + * + * ARGUMENTS + * Status The Executive status ID to convert. + * + * RETURN VALUE + * errno as in errno.h + * + * REVISIONS + * 1999-11-30 ea + */ +INT STDCALL +RtlNtStatusToPsxErrno(IN NTSTATUS Status) +{ +#if 0 + switch (Status) + {} +#endif + + return -1; /* generic POSIX error */ +} + +/* EOF */ diff --git a/reactos/lib/rtl/heap.c b/reactos/lib/rtl/heap.c new file mode 100644 index 00000000000..b258d1e54b6 --- /dev/null +++ b/reactos/lib/rtl/heap.c @@ -0,0 +1,1756 @@ +/* + * Win32 heap functions + * + * Copyright 1996 Alexandre Julliard + * Copyright 1998 Ulrich Weigand + */ + + +/* Note: the heap data structures are based on what Pietrek describes in his + * book 'Windows 95 System Programming Secrets'. The layout is not exactly + * the same, but could be easily adapted if it turns out some programs + * require it. + */ + +#include <string.h> +#include <ddk/ntddk.h> +#include <ntdll/rtl.h> +#include <ntos/heap.h> +#include <ntos/minmax.h> + +#define NDEBUG +#include <debug.h> + +#define DPRINTF DPRINT +#define ERR DPRINT +#define SetLastError(x) +#define WARN DPRINT +#define TRACE DPRINT +#define WARN_ON(x) (1) + +#undef assert +#ifdef NDEBUG +#define TRACE_ON(x) (0) +#define assert(x) +#else +#define TRACE_ON(x) (1) +#define assert(x) +#endif + + +static CRITICAL_SECTION RtlpProcessHeapsListLock; + + +typedef struct tagARENA_INUSE +{ + DWORD size; /* Block size; must be the first field */ + WORD threadId; /* Allocating thread id */ + WORD magic; /* Magic number */ +} +ARENA_INUSE; + +typedef struct tagARENA_FREE +{ + DWORD size; /* Block size; must be the first field */ + WORD threadId; /* Freeing thread id */ + WORD magic; /* Magic number */ + struct tagARENA_FREE *next; /* Next free arena */ + struct tagARENA_FREE *prev; /* Prev free arena */ +} +ARENA_FREE; + +#define ARENA_FLAG_FREE 0x00000001 /* flags OR'ed with arena size */ +#define ARENA_FLAG_PREV_FREE 0x00000002 +#define ARENA_SIZE_MASK 0xfffffffc +#define ARENA_INUSE_MAGIC 0x4842 /* Value for arena 'magic' field */ +#define ARENA_FREE_MAGIC 0x4846 /* Value for arena 'magic' field */ + +#define ARENA_INUSE_FILLER 0x55 +#define ARENA_FREE_FILLER 0xaa + +#define QUIET 1 /* Suppress messages */ +#define NOISY 0 /* Report all errors */ + +#define HEAP_NB_FREE_LISTS 4 /* Number of free lists */ + +/* Max size of the blocks on the free lists */ +static const DWORD HEAP_freeListSizes[HEAP_NB_FREE_LISTS] = + { + 0x20, 0x80, 0x200, 0xffffffff + }; + +typedef struct +{ + DWORD size; + ARENA_FREE arena; +} +FREE_LIST_ENTRY; + +struct tagHEAP; + +typedef struct tagSUBHEAP +{ + DWORD size; /* Size of the whole sub-heap */ + DWORD commitSize; /* Committed size of the sub-heap */ + DWORD headerSize; /* Size of the heap header */ + struct tagSUBHEAP *next; /* Next sub-heap */ + struct tagHEAP *heap; /* Main heap structure */ + DWORD magic; /* Magic number */ +} +SUBHEAP, *PSUBHEAP; + +#define SUBHEAP_MAGIC ((DWORD)('S' | ('U'<<8) | ('B'<<16) | ('H'<<24))) + +typedef struct tagHEAP +{ + SUBHEAP subheap; /* First sub-heap */ + struct tagHEAP *next; /* Next heap for this process */ + FREE_LIST_ENTRY freeList[HEAP_NB_FREE_LISTS]; /* Free lists */ + CRITICAL_SECTION critSection; /* Critical section for serialization */ + DWORD flags; /* Heap flags */ + DWORD magic; /* Magic number */ + BYTE filler[4]; /* Make multiple of 8 bytes */ +} +HEAP, *PHEAP; + +#define HEAP_MAGIC ((DWORD)('H' | ('E'<<8) | ('A'<<16) | ('P'<<24))) + +#define HEAP_DEF_SIZE 0x110000 /* Default heap size = 1Mb + 64Kb */ +#define HEAP_MIN_BLOCK_SIZE (sizeof(ARENA_FREE) + 8) /* Min. heap block size */ +#define COMMIT_MASK 0xffff /* bitmask for commit/decommit granularity */ + + +static BOOL HEAP_IsRealArena( HANDLE heap, DWORD flags, LPCVOID block, BOOL quiet ); + + +/*********************************************************************** + * HEAP_Dump + */ +void +HEAP_Dump(PHEAP heap) +{ + int i; + SUBHEAP *subheap; + char *ptr; + + DPRINTF( "Heap: %08lx\n", (DWORD)heap ); + DPRINTF( "Next: %08lx Sub-heaps: %08lx", + (DWORD)heap->next, (DWORD)&heap->subheap ); + subheap = &heap->subheap; + while (subheap->next) + { + DPRINTF( " -> %08lx", (DWORD)subheap->next ); + subheap = subheap->next; + } + + DPRINTF( "\nFree lists:\n Block Stat Size Id\n" ); + for (i = 0; i < HEAP_NB_FREE_LISTS; i++) + DPRINTF( "%08lx free %08lx %04x prev=%08lx next=%08lx\n", + (DWORD)&heap->freeList[i].arena, heap->freeList[i].arena.size, + heap->freeList[i].arena.threadId, + (DWORD)heap->freeList[i].arena.prev, + (DWORD)heap->freeList[i].arena.next ); + + subheap = &heap->subheap; + while (subheap) + { + DWORD freeSize = 0, usedSize = 0, arenaSize = subheap->headerSize; + DPRINTF( "\n\nSub-heap %08lx: size=%08lx committed=%08lx\n", + (DWORD)subheap, subheap->size, subheap->commitSize ); + + DPRINTF( "\n Block Stat Size Id\n" ); + ptr = (char*)subheap + subheap->headerSize; + while (ptr < (char *)subheap + subheap->size) + { + if (*(DWORD *)ptr & ARENA_FLAG_FREE) + { + ARENA_FREE *pArena = (ARENA_FREE *)ptr; + DPRINTF( "%08lx free %08lx %04x prev=%08lx next=%08lx\n", + (DWORD)pArena, pArena->size & ARENA_SIZE_MASK, + pArena->threadId, (DWORD)pArena->prev, + (DWORD)pArena->next); + ptr += sizeof(*pArena) + (pArena->size & ARENA_SIZE_MASK); + arenaSize += sizeof(ARENA_FREE); + freeSize += pArena->size & ARENA_SIZE_MASK; + } + else if (*(DWORD *)ptr & ARENA_FLAG_PREV_FREE) + { + ARENA_INUSE *pArena = (ARENA_INUSE *)ptr; + DPRINTF( "%08lx Used %08lx %04x back=%08lx\n", + (DWORD)pArena, pArena->size & ARENA_SIZE_MASK, + pArena->threadId, *((DWORD *)pArena - 1)); + ptr += sizeof(*pArena) + (pArena->size & ARENA_SIZE_MASK); + arenaSize += sizeof(ARENA_INUSE); + usedSize += pArena->size & ARENA_SIZE_MASK; + } + else + { + ARENA_INUSE *pArena = (ARENA_INUSE *)ptr; + DPRINTF( "%08lx used %08lx %04x\n", + (DWORD)pArena, pArena->size & ARENA_SIZE_MASK, + pArena->threadId); + ptr += sizeof(*pArena) + (pArena->size & ARENA_SIZE_MASK); + arenaSize += sizeof(ARENA_INUSE); + usedSize += pArena->size & ARENA_SIZE_MASK; + } + } + DPRINTF( "\nTotal: Size=%08lx Committed=%08lx Free=%08lx Used=%08lx Arenas=%08lx (%ld%%)\n\n", + subheap->size, subheap->commitSize, freeSize, usedSize, + arenaSize, (arenaSize * 100) / subheap->size ); + subheap = subheap->next; + } +} + + +/*********************************************************************** + * HEAP_GetPtr + * RETURNS + * Pointer to the heap + * NULL: Failure + */ +static PHEAP +HEAP_GetPtr(HANDLE heap) /* [in] Handle to the heap */ +{ + HEAP *heapPtr = (HEAP *)heap; + if (!heapPtr || (heapPtr->magic != HEAP_MAGIC)) + { + ERR("Invalid heap %08x!\n", heap ); + return NULL; + } + if (TRACE_ON(heap) && !HEAP_IsRealArena( heap, 0, NULL, NOISY )) + { + HEAP_Dump( heapPtr ); + assert( FALSE ); + return NULL; + } + return heapPtr; +} + + +/*********************************************************************** + * HEAP_InsertFreeBlock + * + * Insert a free block into the free list. + */ +static VOID +HEAP_InsertFreeBlock(PHEAP heap, + ARENA_FREE *pArena, + BOOL last) +{ + FREE_LIST_ENTRY *pEntry = heap->freeList; + while (pEntry->size < pArena->size) + pEntry++; + if (last) + { + /* insert at end of free list, i.e. before next free list entry */ + pEntry++; + if (pEntry == &heap->freeList[HEAP_NB_FREE_LISTS]) + { + pEntry = heap->freeList; + } + pArena->prev = pEntry->arena.prev; + pArena->prev->next = pArena; + pArena->next = &pEntry->arena; + pEntry->arena.prev = pArena; + } + else + { + /* insert at head of free list */ + pArena->next = pEntry->arena.next; + pArena->next->prev = pArena; + pArena->prev = &pEntry->arena; + pEntry->arena.next = pArena; + } + pArena->size |= ARENA_FLAG_FREE; +} + + +/*********************************************************************** + * HEAP_FindSubHeap + * Find the sub-heap containing a given address. + * + * RETURNS + * Pointer: Success + * NULL: Failure + */ +static PSUBHEAP +HEAP_FindSubHeap(HEAP *heap, /* [in] Heap pointer */ + LPCVOID ptr) /* [in] Address */ +{ + SUBHEAP *sub = &heap->subheap; + while (sub) + { + if (((char *)ptr >= (char *)sub) && + ((char *)ptr < (char *)sub + sub->size)) + return sub; + sub = sub->next; + } + return NULL; +} + + +/*********************************************************************** + * HEAP_Commit + * + * Make sure the heap storage is committed up to (not including) ptr. + */ +static inline BOOL +HEAP_Commit(SUBHEAP *subheap, + void *ptr, + DWORD flags) +{ + DWORD size = (DWORD)((char *)ptr - (char *)subheap); + NTSTATUS Status; + PVOID address; + ULONG commitsize; + + size = (size + COMMIT_MASK) & ~COMMIT_MASK; + if (size > subheap->size) + size = subheap->size; + if (size <= subheap->commitSize) + return TRUE; + + address = (PVOID)((char *)subheap + subheap->commitSize); + commitsize = size - subheap->commitSize; + + if (!(flags & HEAP_NO_VALLOC)) + { + Status = NtAllocateVirtualMemory(NtCurrentProcess(), + &address, + 0, + &commitsize, + MEM_COMMIT, + PAGE_EXECUTE_READWRITE); + if (!NT_SUCCESS(Status)) + { + WARN("Could not commit %08lx bytes at %08lx for heap %08lx\n", + size - subheap->commitSize, + (DWORD)((char *)subheap + subheap->commitSize), + (DWORD)subheap->heap ); + return FALSE; + } + } + subheap->commitSize += commitsize; + return TRUE; +} + + +/*********************************************************************** + * HEAP_Decommit + * + * If possible, decommit the heap storage from (including) 'ptr'. + */ +static inline BOOL HEAP_Decommit( SUBHEAP *subheap, void *ptr, DWORD flags ) +{ + DWORD size = (DWORD)((char *)ptr - (char *)subheap); + PVOID address; + ULONG decommitsize; + NTSTATUS Status; + /* round to next block and add one full block */ + size = ((size + COMMIT_MASK) & ~COMMIT_MASK) + COMMIT_MASK + 1; + if (size >= subheap->commitSize) + return TRUE; + + address = (PVOID)((char *)subheap + size); + decommitsize = subheap->commitSize - size; + + if (!(flags & HEAP_NO_VALLOC)) + { + Status = ZwFreeVirtualMemory(NtCurrentProcess(), + &address, + &decommitsize, + MEM_DECOMMIT); + if (!NT_SUCCESS(Status)) + ; + { + WARN("Could not decommit %08lx bytes at %08lx for heap %08lx\n", + subheap->commitSize - size, + (DWORD)((char *)subheap + size), + (DWORD)subheap->heap ); + return FALSE; + } + } + subheap->commitSize -= decommitsize; + return TRUE; +} + + +/*********************************************************************** + * HEAP_CreateFreeBlock + * + * Create a free block at a specified address. 'size' is the size of the + * whole block, including the new arena. + */ +static void HEAP_CreateFreeBlock( SUBHEAP *subheap, void *ptr, DWORD size ) +{ + ARENA_FREE *pFree; + BOOL last; + + /* Create a free arena */ + + pFree = (ARENA_FREE *)ptr; + pFree->threadId = (DWORD)NtCurrentTeb()->Cid.UniqueThread; + pFree->magic = ARENA_FREE_MAGIC; + + /* If debugging, erase the freed block content */ + + if (TRACE_ON(heap)) + { + char *pEnd = (char *)ptr + size; + if (pEnd > (char *)subheap + subheap->commitSize) + pEnd = (char *)subheap + subheap->commitSize; + if (pEnd > (char *)(pFree + 1)) + memset( pFree + 1, ARENA_FREE_FILLER, pEnd - (char *)(pFree + 1) ); + } + + /* Check if next block is free also */ + + if (((char *)ptr + size < (char *)subheap + subheap->size) && + (*(DWORD *)((char *)ptr + size) & ARENA_FLAG_FREE)) + { + /* Remove the next arena from the free list */ + ARENA_FREE *pNext = (ARENA_FREE *)((char *)ptr + size); + pNext->next->prev = pNext->prev; + pNext->prev->next = pNext->next; + size += (pNext->size & ARENA_SIZE_MASK) + sizeof(*pNext); + if (TRACE_ON(heap)) + memset( pNext, ARENA_FREE_FILLER, sizeof(ARENA_FREE) ); + } + + /* Set the next block PREV_FREE flag and pointer */ + + last = ((char *)ptr + size >= (char *)subheap + subheap->size); + if (!last) + { + DWORD *pNext = (DWORD *)((char *)ptr + size); + *pNext |= ARENA_FLAG_PREV_FREE; + *(ARENA_FREE **)(pNext - 1) = pFree; + } + + /* Last, insert the new block into the free list */ + + pFree->size = size - sizeof(*pFree); + HEAP_InsertFreeBlock( subheap->heap, pFree, last ); +} + + +/*********************************************************************** + * HEAP_MakeInUseBlockFree + * + * Turn an in-use block into a free block. Can also decommit the end of + * the heap, and possibly even free the sub-heap altogether. + */ +static void HEAP_MakeInUseBlockFree( SUBHEAP *subheap, ARENA_INUSE *pArena, + DWORD flags) +{ + ARENA_FREE *pFree; + DWORD size = (pArena->size & ARENA_SIZE_MASK) + sizeof(*pArena); + + /* Check if we can merge with previous block */ + + if (pArena->size & ARENA_FLAG_PREV_FREE) + { + pFree = *((ARENA_FREE **)pArena - 1); + size += (pFree->size & ARENA_SIZE_MASK) + sizeof(ARENA_FREE); + /* Remove it from the free list */ + pFree->next->prev = pFree->prev; + pFree->prev->next = pFree->next; + } + else + pFree = (ARENA_FREE *)pArena; + + /* Create a free block */ + + HEAP_CreateFreeBlock( subheap, pFree, size ); + size = (pFree->size & ARENA_SIZE_MASK) + sizeof(ARENA_FREE); + if ((char *)pFree + size < (char *)subheap + subheap->size) + return; /* Not the last block, so nothing more to do */ + + /* Free the whole sub-heap if it's empty and not the original one */ + + if (((char *)pFree == (char *)subheap + subheap->headerSize) && + (subheap != &subheap->heap->subheap)) + { + SUBHEAP *pPrev = &subheap->heap->subheap; + /* Remove the free block from the list */ + pFree->next->prev = pFree->prev; + pFree->prev->next = pFree->next; + /* Remove the subheap from the list */ + while (pPrev && (pPrev->next != subheap)) + pPrev = pPrev->next; + if (pPrev) + pPrev->next = subheap->next; + /* Free the memory */ + subheap->magic = 0; + if (!(flags & HEAP_NO_VALLOC)) + { + ULONG dummySize = 0; + ZwFreeVirtualMemory(NtCurrentProcess(), + (PVOID*)&subheap, + &dummySize, + MEM_RELEASE); + } + return; + } + + /* Decommit the end of the heap */ +} + + +/*********************************************************************** + * HEAP_ShrinkBlock + * + * Shrink an in-use block. + */ +static void HEAP_ShrinkBlock(SUBHEAP *subheap, ARENA_INUSE *pArena, DWORD size) +{ + if ((pArena->size & ARENA_SIZE_MASK) >= size + HEAP_MIN_BLOCK_SIZE) + { + HEAP_CreateFreeBlock( subheap, (char *)(pArena + 1) + size, + (pArena->size & ARENA_SIZE_MASK) - size ); + /* assign size plus previous arena flags */ + pArena->size = size | (pArena->size & ~ARENA_SIZE_MASK); + } + else + { + /* Turn off PREV_FREE flag in next block */ + char *pNext = (char *)(pArena + 1) + (pArena->size & ARENA_SIZE_MASK); + if (pNext < (char *)subheap + subheap->size) + *(DWORD *)pNext &= ~ARENA_FLAG_PREV_FREE; + } +} + +/*********************************************************************** + * HEAP_InitSubHeap + */ +static BOOL HEAP_InitSubHeap( HEAP *heap, LPVOID address, DWORD flags, + DWORD commitSize, DWORD totalSize ) +{ + SUBHEAP *subheap = (SUBHEAP *)address; + FREE_LIST_ENTRY *pEntry; + int i; + NTSTATUS Status; + + /* Commit memory */ + if (!(flags & HEAP_NO_VALLOC)) + { + Status = ZwAllocateVirtualMemory(NtCurrentProcess(), + &address, + 0, + (PULONG)&commitSize, + MEM_COMMIT, + PAGE_EXECUTE_READWRITE); + if (!NT_SUCCESS(Status)) + { + WARN("Could not commit %08lx bytes for sub-heap %08lx\n", + commitSize, (DWORD)address ); + return FALSE; + } + } + + /* Fill the sub-heap structure */ + + subheap = (SUBHEAP *)address; + subheap->heap = heap; + subheap->size = totalSize; + subheap->commitSize = commitSize; + subheap->magic = SUBHEAP_MAGIC; + + if ( subheap != (SUBHEAP *)heap ) + { + /* If this is a secondary subheap, insert it into list */ + + subheap->headerSize = sizeof(SUBHEAP); + subheap->next = heap->subheap.next; + heap->subheap.next = subheap; + } + else + { + /* If this is a primary subheap, initialize main heap */ + + subheap->headerSize = sizeof(HEAP); + subheap->next = NULL; + heap->next = NULL; + heap->flags = flags; + heap->magic = HEAP_MAGIC; + + /* Build the free lists */ + + for (i = 0, pEntry = heap->freeList; i < HEAP_NB_FREE_LISTS; i++, pEntry++) + { + pEntry->size = HEAP_freeListSizes[i]; + pEntry->arena.size = 0 | ARENA_FLAG_FREE; + pEntry->arena.next = i < HEAP_NB_FREE_LISTS-1 ? + &heap->freeList[i+1].arena : &heap->freeList[0].arena; + pEntry->arena.prev = i ? &heap->freeList[i-1].arena : + &heap->freeList[HEAP_NB_FREE_LISTS-1].arena; + pEntry->arena.threadId = 0; + pEntry->arena.magic = ARENA_FREE_MAGIC; + } + + /* Initialize critical section */ + + RtlInitializeCriticalSection( &heap->critSection ); + } + + /* Create the first free block */ + + HEAP_CreateFreeBlock( subheap, (LPBYTE)subheap + subheap->headerSize, + subheap->size - subheap->headerSize ); + + return TRUE; +} + +/*********************************************************************** + * HEAP_CreateSubHeap + * + * Create a sub-heap of the given size. + * If heap == NULL, creates a main heap. + */ +static SUBHEAP *HEAP_CreateSubHeap(PVOID BaseAddress, + HEAP *heap, DWORD flags, + DWORD commitSize, DWORD totalSize ) +{ + LPVOID address; + NTSTATUS Status; + + /* Round-up sizes on a 64K boundary */ + + totalSize = (totalSize + 0xffff) & 0xffff0000; + commitSize = (commitSize + 0xffff) & 0xffff0000; + if (!commitSize) + commitSize = 0x10000; + if (totalSize < commitSize) + totalSize = commitSize; + + /* Allocate the memory block */ + address = BaseAddress; + if (!(flags & HEAP_NO_VALLOC)) + { + Status = ZwAllocateVirtualMemory(NtCurrentProcess(), + &address, + 0, + (PULONG)&totalSize, + MEM_RESERVE | MEM_COMMIT, + PAGE_EXECUTE_READWRITE); + if (!NT_SUCCESS(Status)) + { + WARN("Could not VirtualAlloc %08lx bytes\n", + totalSize ); + return NULL; + } + } + + /* Initialize subheap */ + + if (!HEAP_InitSubHeap( heap? heap : (HEAP *)address, + address, flags, commitSize, totalSize )) + { + if (address && !(flags & HEAP_NO_VALLOC)) + { + ULONG dummySize = 0; + ZwFreeVirtualMemory(NtCurrentProcess(), + &address, + &dummySize, + MEM_RELEASE); + } + return NULL; + } + + return (SUBHEAP *)address; +} + + +/*********************************************************************** + * HEAP_FindFreeBlock + * + * Find a free block at least as large as the requested size, and make sure + * the requested size is committed. + */ +static ARENA_FREE *HEAP_FindFreeBlock( HEAP *heap, DWORD size, + SUBHEAP **ppSubHeap ) +{ + SUBHEAP *subheap; + ARENA_FREE *pArena; + FREE_LIST_ENTRY *pEntry = heap->freeList; + + /* Find a suitable free list, and in it find a block large enough */ + + while (pEntry->size < size) + pEntry++; + pArena = pEntry->arena.next; + while (pArena != &heap->freeList[0].arena) + { + DWORD arena_size = (pArena->size & ARENA_SIZE_MASK) + + sizeof(ARENA_FREE) - sizeof(ARENA_INUSE); + if (arena_size >= size) + { + subheap = HEAP_FindSubHeap( heap, pArena ); + if (!HEAP_Commit( subheap, (char *)pArena + sizeof(ARENA_INUSE) + + size + HEAP_MIN_BLOCK_SIZE, + heap->flags)) + return NULL; + *ppSubHeap = subheap; + return pArena; + } + + pArena = pArena->next; + } + + /* If no block was found, attempt to grow the heap */ + + if (!(heap->flags & HEAP_GROWABLE)) + { + WARN("Not enough space in heap %08lx for %08lx bytes\n", + (DWORD)heap, size ); + return NULL; + } + /* make sure that we have a big enough size *committed* to fit another + * last free arena in ! + * So just one heap struct, one first free arena which will eventually + * get inuse, and HEAP_MIN_BLOCK_SIZE for the second free arena that + * might get assigned all remaining free space in HEAP_ShrinkBlock() */ + size += sizeof(SUBHEAP) + sizeof(ARENA_FREE) + HEAP_MIN_BLOCK_SIZE; + if (!(subheap = HEAP_CreateSubHeap( NULL, heap, heap->flags, size, + max( HEAP_DEF_SIZE, size ) ))) + return NULL; + + TRACE("created new sub-heap %08lx of %08lx bytes for heap %08lx\n", + (DWORD)subheap, size, (DWORD)heap ); + + *ppSubHeap = subheap; + return (ARENA_FREE *)(subheap + 1); +} + + +/*********************************************************************** + * HEAP_IsValidArenaPtr + * + * Check that the pointer is inside the range possible for arenas. + */ +static BOOL HEAP_IsValidArenaPtr( HEAP *heap, void *ptr ) +{ + int i; + SUBHEAP *subheap = HEAP_FindSubHeap( heap, ptr ); + if (!subheap) + return FALSE; + if ((char *)ptr >= (char *)subheap + subheap->headerSize) + return TRUE; + if (subheap != &heap->subheap) + return FALSE; + for (i = 0; i < HEAP_NB_FREE_LISTS; i++) + if (ptr == (void *)&heap->freeList[i].arena) + return TRUE; + return FALSE; +} + + +/*********************************************************************** + * HEAP_ValidateFreeArena + */ +static BOOL HEAP_ValidateFreeArena( SUBHEAP *subheap, ARENA_FREE *pArena ) +{ + char *heapEnd = (char *)subheap + subheap->size; + + /* Check magic number */ + if (pArena->magic != ARENA_FREE_MAGIC) + { + ERR("Heap %08lx: invalid free arena magic for %08lx\n", + (DWORD)subheap->heap, (DWORD)pArena ); + return FALSE; + } + /* Check size flags */ + if (!(pArena->size & ARENA_FLAG_FREE) || + (pArena->size & ARENA_FLAG_PREV_FREE)) + { + ERR("Heap %08lx: bad flags %lx for free arena %08lx\n", + (DWORD)subheap->heap, pArena->size & ~ARENA_SIZE_MASK, (DWORD)pArena ); + } + /* Check arena size */ + if ((char *)(pArena + 1) + (pArena->size & ARENA_SIZE_MASK) > heapEnd) + { + ERR("Heap %08lx: bad size %08lx for free arena %08lx\n", + (DWORD)subheap->heap, (DWORD)pArena->size & ARENA_SIZE_MASK, (DWORD)pArena ); + return FALSE; + } + /* Check that next pointer is valid */ + if (!HEAP_IsValidArenaPtr( subheap->heap, pArena->next )) + { + ERR("Heap %08lx: bad next ptr %08lx for arena %08lx\n", + (DWORD)subheap->heap, (DWORD)pArena->next, (DWORD)pArena ); + return FALSE; + } + /* Check that next arena is free */ + if (!(pArena->next->size & ARENA_FLAG_FREE) || + (pArena->next->magic != ARENA_FREE_MAGIC)) + { + ERR("Heap %08lx: next arena %08lx invalid for %08lx\n", + (DWORD)subheap->heap, (DWORD)pArena->next, (DWORD)pArena ); + return FALSE; + } + /* Check that prev pointer is valid */ + if (!HEAP_IsValidArenaPtr( subheap->heap, pArena->prev )) + { + ERR("Heap %08lx: bad prev ptr %08lx for arena %08lx\n", + (DWORD)subheap->heap, (DWORD)pArena->prev, (DWORD)pArena ); + return FALSE; + } + /* Check that prev arena is free */ + if (!(pArena->prev->size & ARENA_FLAG_FREE) || + (pArena->prev->magic != ARENA_FREE_MAGIC)) + { + ERR("Heap %08lx: prev arena %08lx invalid for %08lx\n", + (DWORD)subheap->heap, (DWORD)pArena->prev, (DWORD)pArena ); + return FALSE; + } + /* Check that next block has PREV_FREE flag */ + if ((char *)(pArena + 1) + (pArena->size & ARENA_SIZE_MASK) < heapEnd) + { + if (!(*(DWORD *)((char *)(pArena + 1) + + (pArena->size & ARENA_SIZE_MASK)) & ARENA_FLAG_PREV_FREE)) + { + ERR("Heap %08lx: free arena %08lx next block has no PREV_FREE flag\n", + (DWORD)subheap->heap, (DWORD)pArena ); + return FALSE; + } + /* Check next block back pointer */ + if (*((ARENA_FREE **)((char *)(pArena + 1) + + (pArena->size & ARENA_SIZE_MASK)) - 1) != pArena) + { + ERR("Heap %08lx: arena %08lx has wrong back ptr %08lx\n", + (DWORD)subheap->heap, (DWORD)pArena, + *((DWORD *)((char *)(pArena+1)+ (pArena->size & ARENA_SIZE_MASK)) - 1)); + return FALSE; + } + } + return TRUE; +} + + +/*********************************************************************** + * HEAP_ValidateInUseArena + */ +static BOOL HEAP_ValidateInUseArena( SUBHEAP *subheap, ARENA_INUSE *pArena, BOOL quiet ) +{ + char *heapEnd = (char *)subheap + subheap->size; + + /* Check magic number */ + if (pArena->magic != ARENA_INUSE_MAGIC) + { + if (quiet == NOISY) + { + ERR("Heap %08lx: invalid in-use arena magic for %08lx\n", + (DWORD)subheap->heap, (DWORD)pArena ); + if (TRACE_ON(heap)) + HEAP_Dump( subheap->heap ); + } + else if (WARN_ON(heap)) + { + WARN("Heap %08lx: invalid in-use arena magic for %08lx\n", + (DWORD)subheap->heap, (DWORD)pArena ); + if (TRACE_ON(heap)) + HEAP_Dump( subheap->heap ); + } + return FALSE; + } + /* Check size flags */ + if (pArena->size & ARENA_FLAG_FREE) + { + ERR("Heap %08lx: bad flags %lx for in-use arena %08lx\n", + (DWORD)subheap->heap, pArena->size & ~ARENA_SIZE_MASK, (DWORD)pArena ); + return FALSE; + } + /* Check arena size */ + if ((char *)(pArena + 1) + (pArena->size & ARENA_SIZE_MASK) > heapEnd) + { + ERR("Heap %08lx: bad size %08lx for in-use arena %08lx\n", + (DWORD)subheap->heap, (DWORD)pArena->size & ARENA_SIZE_MASK, (DWORD)pArena ); + return FALSE; + } + /* Check next arena PREV_FREE flag */ + if (((char *)(pArena + 1) + (pArena->size & ARENA_SIZE_MASK) < heapEnd) && + (*(DWORD *)((char *)(pArena + 1) + (pArena->size & ARENA_SIZE_MASK)) & ARENA_FLAG_PREV_FREE)) + { + ERR("Heap %08lx: in-use arena %08lx next block has PREV_FREE flag\n", + (DWORD)subheap->heap, (DWORD)pArena ); + return FALSE; + } + /* Check prev free arena */ + if (pArena->size & ARENA_FLAG_PREV_FREE) + { + ARENA_FREE *pPrev = *((ARENA_FREE **)pArena - 1); + /* Check prev pointer */ + if (!HEAP_IsValidArenaPtr( subheap->heap, pPrev )) + { + ERR("Heap %08lx: bad back ptr %08lx for arena %08lx\n", + (DWORD)subheap->heap, (DWORD)pPrev, (DWORD)pArena ); + return FALSE; + } + /* Check that prev arena is free */ + if (!(pPrev->size & ARENA_FLAG_FREE) || + (pPrev->magic != ARENA_FREE_MAGIC)) + { + ERR("Heap %08lx: prev arena %08lx invalid for in-use %08lx\n", + (DWORD)subheap->heap, (DWORD)pPrev, (DWORD)pArena ); + return FALSE; + } + /* Check that prev arena is really the previous block */ + if ((char *)(pPrev + 1) + (pPrev->size & ARENA_SIZE_MASK) != (char *)pArena) + { + ERR("Heap %08lx: prev arena %08lx is not prev for in-use %08lx\n", + (DWORD)subheap->heap, (DWORD)pPrev, (DWORD)pArena ); + return FALSE; + } + } + return TRUE; +} + + +/*********************************************************************** + * HEAP_IsInsideHeap + * Checks whether the pointer points to a block inside a given heap. + * + * NOTES + * Should this return BOOL32? + * + * RETURNS + * !0: Success + * 0: Failure + */ +int HEAP_IsInsideHeap( + HANDLE heap, /* [in] Heap */ + DWORD flags, /* [in] Flags */ + LPCVOID ptr /* [in] Pointer */ +) +{ + HEAP *heapPtr = HEAP_GetPtr( heap ); + SUBHEAP *subheap; + int ret; + + /* Validate the parameters */ + + if (!heapPtr) + return 0; + flags |= heapPtr->flags; + if (!(flags & HEAP_NO_SERIALIZE)) + RtlEnterCriticalSection( &heapPtr->critSection ); + ret = (((subheap = HEAP_FindSubHeap( heapPtr, ptr )) != NULL) && + (((char *)ptr >= (char *)subheap + subheap->headerSize + + sizeof(ARENA_INUSE)))); + if (!(flags & HEAP_NO_SERIALIZE)) + RtlLeaveCriticalSection( &heapPtr->critSection ); + return ret; +} + + + + +/*********************************************************************** + * HEAP_IsRealArena [Internal] + * Validates a block is a valid arena. + * + * RETURNS + * TRUE: Success + * FALSE: Failure + */ +static BOOL HEAP_IsRealArena( + HANDLE heap, /* [in] Handle to the heap */ + DWORD flags, /* [in] Bit flags that control access during operation */ + LPCVOID block, /* [in] Optional pointer to memory block to validate */ + BOOL quiet /* [in] Flag - if true, HEAP_ValidateInUseArena + * does not complain */ +) +{ + SUBHEAP *subheap; + HEAP *heapPtr = (HEAP *)(heap); + BOOL ret = TRUE; + + if (!heapPtr || (heapPtr->magic != HEAP_MAGIC)) + { + ERR("Invalid heap %08x!\n", heap ); + return FALSE; + } + + flags &= HEAP_NO_SERIALIZE; + flags |= heapPtr->flags; + /* calling HeapLock may result in infinite recursion, so do the critsect directly */ + if (!(flags & HEAP_NO_SERIALIZE)) + RtlEnterCriticalSection( &heapPtr->critSection ); + + if (block) + { + /* Only check this single memory block */ + + /* The following code is really HEAP_IsInsideHeap * + * with serialization already done. */ + if (!(subheap = HEAP_FindSubHeap( heapPtr, block )) || + ((char *)block < (char *)subheap + subheap->headerSize + + sizeof(ARENA_INUSE))) + { + if (quiet == NOISY) + { + ERR("Heap %08lx: block %08lx is not inside heap\n", + (DWORD)heap, (DWORD)block ); + } + else if (WARN_ON(heap)) + { + WARN("Heap %08lx: block %08lx is not inside heap\n", + (DWORD)heap, (DWORD)block ); + } + ret = FALSE; + } + else + ret = HEAP_ValidateInUseArena( subheap, (ARENA_INUSE *)block - 1, quiet ); + + if (!(flags & HEAP_NO_SERIALIZE)) + RtlLeaveCriticalSection( &heapPtr->critSection ); + return ret; + } + + subheap = &heapPtr->subheap; + while (subheap && ret) + { + char *ptr = (char *)subheap + subheap->headerSize; + while (ptr < (char *)subheap + subheap->size) + { + if (*(DWORD *)ptr & ARENA_FLAG_FREE) + { + if (!HEAP_ValidateFreeArena( subheap, (ARENA_FREE *)ptr )) + { + ret = FALSE; + break; + } + ptr += sizeof(ARENA_FREE) + (*(DWORD *)ptr & ARENA_SIZE_MASK); + } + else + { + if (!HEAP_ValidateInUseArena( subheap, (ARENA_INUSE *)ptr, NOISY )) + { + ret = FALSE; + break; + } + ptr += sizeof(ARENA_INUSE) + (*(DWORD *)ptr & ARENA_SIZE_MASK); + } + } + subheap = subheap->next; + } + + if (!(flags & HEAP_NO_SERIALIZE)) + RtlLeaveCriticalSection( &heapPtr->critSection ); + return ret; +} + + +/*********************************************************************** + * HeapCreate (KERNEL32.336) + * RETURNS + * Handle of heap: Success + * NULL: Failure + * + * @implemented + */ +HANDLE STDCALL +RtlCreateHeap(ULONG flags, + PVOID BaseAddress, + ULONG maxSize, + ULONG initialSize, + PVOID Unknown, + PRTL_HEAP_DEFINITION Definition) +{ + SUBHEAP *subheap; + ULONG i; + + /* Allocate the heap block */ + + if (!maxSize) + { + maxSize = HEAP_DEF_SIZE; + flags |= HEAP_GROWABLE; + } + if (!(subheap = HEAP_CreateSubHeap( BaseAddress, NULL, flags, initialSize, maxSize ))) + { + return 0; + } + + RtlEnterCriticalSection (&RtlpProcessHeapsListLock); + for (i = 0; i < NtCurrentPeb ()->NumberOfHeaps; i++) + { + if (NtCurrentPeb ()->ProcessHeaps[i] == NULL) + { + NtCurrentPeb()->ProcessHeaps[i] = (PVOID)subheap; + break; + } + } + RtlLeaveCriticalSection (&RtlpProcessHeapsListLock); + + return (HANDLE)subheap; +} + +/*********************************************************************** + * HeapDestroy (KERNEL32.337) + * RETURNS + * TRUE: Success + * FALSE: Failure + * + * @implemented + */ +BOOL STDCALL +RtlDestroyHeap(HANDLE heap) /* [in] Handle of heap */ +{ + HEAP *heapPtr = HEAP_GetPtr( heap ); + SUBHEAP *subheap; + ULONG i, flags; + + TRACE("%08x\n", heap ); + if (!heapPtr) + return FALSE; + + RtlEnterCriticalSection (&RtlpProcessHeapsListLock); + for (i = 0; i < NtCurrentPeb ()->NumberOfHeaps; i++) + { + if (NtCurrentPeb ()->ProcessHeaps[i] == heap) + { + NtCurrentPeb()->ProcessHeaps[i] = NULL; + break; + } + } + RtlLeaveCriticalSection (&RtlpProcessHeapsListLock); + + RtlDeleteCriticalSection( &heapPtr->critSection ); + subheap = &heapPtr->subheap; + // We must save the flags. The first subheap is located after + // the heap structure. If we release the first subheap, + // we release also the heap structure. + flags = heapPtr->flags; + while (subheap) + { + SUBHEAP *next = subheap->next; + + if (!(flags & HEAP_NO_VALLOC)) + { + ULONG dummySize = 0; + ZwFreeVirtualMemory(NtCurrentProcess(), + (PVOID*)&subheap, + &dummySize, + MEM_RELEASE); + } + subheap = next; + } + return TRUE; +} + + +/*********************************************************************** + * HeapAlloc (KERNEL32.334) + * RETURNS + * Pointer to allocated memory block + * NULL: Failure + * 0x7d030f60--invalid flags in RtlHeapAllocate + * @implemented + */ +PVOID STDCALL +RtlAllocateHeap(HANDLE heap, /* [in] Handle of private heap block */ + ULONG flags, /* [in] Heap allocation control flags */ + ULONG size) /* [in] Number of bytes to allocate */ +{ + ARENA_FREE *pArena; + ARENA_INUSE *pInUse; + SUBHEAP *subheap; + HEAP *heapPtr = HEAP_GetPtr( heap ); + + /* Validate the parameters */ + + if (!heapPtr) + { + if (flags & HEAP_GENERATE_EXCEPTIONS) + RtlRaiseStatus( STATUS_NO_MEMORY ); + return NULL; + } + flags &= HEAP_GENERATE_EXCEPTIONS | HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY; + flags |= heapPtr->flags; + if (!(flags & HEAP_NO_SERIALIZE)) + RtlEnterCriticalSection( &heapPtr->critSection ); + size = (size + 7) & ~7; + if (size < HEAP_MIN_BLOCK_SIZE) + size = HEAP_MIN_BLOCK_SIZE; + + /* Locate a suitable free block */ + + if (!(pArena = HEAP_FindFreeBlock( heapPtr, size, &subheap ))) + { + TRACE("(%08x,%08lx,%08lx): returning NULL\n", + heap, flags, size ); + if (!(flags & HEAP_NO_SERIALIZE)) + RtlLeaveCriticalSection( &heapPtr->critSection ); + if (flags & HEAP_GENERATE_EXCEPTIONS) + RtlRaiseStatus( STATUS_NO_MEMORY ); + return NULL; + } + + /* Remove the arena from the free list */ + + pArena->next->prev = pArena->prev; + pArena->prev->next = pArena->next; + + /* Build the in-use arena */ + + pInUse = (ARENA_INUSE *)pArena; + pInUse->size = (pInUse->size & ~ARENA_FLAG_FREE) + + sizeof(ARENA_FREE) - sizeof(ARENA_INUSE); + pInUse->threadId = (DWORD)NtCurrentTeb()->Cid.UniqueThread; + pInUse->magic = ARENA_INUSE_MAGIC; + + /* Shrink the block */ + + HEAP_ShrinkBlock( subheap, pInUse, size ); + + if (flags & HEAP_ZERO_MEMORY) + memset( pInUse + 1, 0, pInUse->size & ARENA_SIZE_MASK ); + else if (TRACE_ON(heap)) + memset( pInUse + 1, ARENA_INUSE_FILLER, pInUse->size & ARENA_SIZE_MASK ); + + if (!(flags & HEAP_NO_SERIALIZE)) + RtlLeaveCriticalSection( &heapPtr->critSection ); + + TRACE("(%08x,%08lx,%08lx): returning %08lx\n", + heap, flags, size, (DWORD)(pInUse + 1) ); + return (LPVOID)(pInUse + 1); +} + + +/*********************************************************************** + * HeapFree (KERNEL32.338) + * RETURNS + * TRUE: Success + * FALSE: Failure + * + * @implemented + */ +BOOLEAN STDCALL RtlFreeHeap( + HANDLE heap, /* [in] Handle of heap */ + ULONG flags, /* [in] Heap freeing flags */ + PVOID ptr /* [in] Address of memory to free */ +) +{ + ARENA_INUSE *pInUse; + SUBHEAP *subheap; + HEAP *heapPtr = HEAP_GetPtr( heap ); + + /* Validate the parameters */ + + if (!heapPtr) + return FALSE; + if (!ptr) /* Freeing a NULL ptr is doesn't indicate an error in Win2k */ + { + WARN("(%08x,%08lx,%08lx): asked to free NULL\n", + heap, flags, (DWORD)ptr ); + return TRUE; + } + + flags &= HEAP_NO_SERIALIZE; + flags |= heapPtr->flags; + if (!(flags & HEAP_NO_SERIALIZE)) + RtlEnterCriticalSection( &heapPtr->critSection ); + if (!HEAP_IsRealArena( heap, HEAP_NO_SERIALIZE, ptr, QUIET )) + { + if (!(flags & HEAP_NO_SERIALIZE)) + RtlLeaveCriticalSection( &heapPtr->critSection ); + TRACE("(%08x,%08lx,%08lx): returning FALSE\n", + heap, flags, (DWORD)ptr ); + return FALSE; + } + + /* Turn the block into a free block */ + + pInUse = (ARENA_INUSE *)ptr - 1; + subheap = HEAP_FindSubHeap( heapPtr, pInUse ); + HEAP_MakeInUseBlockFree( subheap, pInUse, heapPtr->flags ); + + if (!(flags & HEAP_NO_SERIALIZE)) + RtlLeaveCriticalSection( &heapPtr->critSection ); + + TRACE("(%08x,%08lx,%08lx): returning TRUE\n", + heap, flags, (DWORD)ptr ); + return TRUE; +} + + +/*********************************************************************** + * HeapReAlloc (KERNEL32.340) + * RETURNS + * Pointer to reallocated memory block + * NULL: Failure + * 0x7d030f60--invalid flags in RtlHeapAllocate + * @implemented + */ +LPVOID STDCALL RtlReAllocateHeap( + HANDLE heap, /* [in] Handle of heap block */ + DWORD flags, /* [in] Heap reallocation flags */ + LPVOID ptr, /* [in] Address of memory to reallocate */ + DWORD size /* [in] Number of bytes to reallocate */ +) +{ + ARENA_INUSE *pArena; + DWORD oldSize; + HEAP *heapPtr; + SUBHEAP *subheap; + + if (!ptr) + return RtlAllocateHeap( heap, flags, size ); /* FIXME: correct? */ + if (!(heapPtr = HEAP_GetPtr( heap ))) + return FALSE; + + /* Validate the parameters */ + + flags &= HEAP_GENERATE_EXCEPTIONS | HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY | + HEAP_REALLOC_IN_PLACE_ONLY; + flags |= heapPtr->flags; + size = (size + 7) & ~7; + if (size < HEAP_MIN_BLOCK_SIZE) + size = HEAP_MIN_BLOCK_SIZE; + + if (!(flags & HEAP_NO_SERIALIZE)) + RtlEnterCriticalSection( &heapPtr->critSection ); + if (!HEAP_IsRealArena( heap, HEAP_NO_SERIALIZE, ptr, QUIET )) + { + if (!(flags & HEAP_NO_SERIALIZE)) + RtlLeaveCriticalSection( &heapPtr->critSection ); + TRACE("(%08x,%08lx,%08lx,%08lx): returning NULL\n", + heap, flags, (DWORD)ptr, size ); + if (flags & HEAP_GENERATE_EXCEPTIONS) + RtlRaiseStatus( STATUS_NO_MEMORY ); + return NULL; + } + + /* Check if we need to grow the block */ + + pArena = (ARENA_INUSE *)ptr - 1; + pArena->threadId = (DWORD)NtCurrentTeb()->Cid.UniqueThread; + + subheap = HEAP_FindSubHeap( heapPtr, pArena ); + oldSize = (pArena->size & ARENA_SIZE_MASK); + if (size > oldSize) + { + char *pNext = (char *)(pArena + 1) + oldSize; + if ((pNext < (char *)subheap + subheap->size) && + (*(DWORD *)pNext & ARENA_FLAG_FREE) && + (oldSize + (*(DWORD *)pNext & ARENA_SIZE_MASK) + sizeof(ARENA_FREE) >= size)) + { + /* The next block is free and large enough */ + ARENA_FREE *pFree = (ARENA_FREE *)pNext; + pFree->next->prev = pFree->prev; + pFree->prev->next = pFree->next; + pArena->size += (pFree->size & ARENA_SIZE_MASK) + sizeof(*pFree); + if (!HEAP_Commit( subheap, (char *)pArena + sizeof(ARENA_INUSE) + + size + HEAP_MIN_BLOCK_SIZE, + heapPtr->flags)) + { + if (!(flags & HEAP_NO_SERIALIZE)) + RtlLeaveCriticalSection( &heapPtr->critSection ); + if (flags & HEAP_GENERATE_EXCEPTIONS) + RtlRaiseStatus( STATUS_NO_MEMORY ); + return NULL; + } + HEAP_ShrinkBlock( subheap, pArena, size ); + } + else /* Do it the hard way */ + { + ARENA_FREE *pNew; + ARENA_INUSE *pInUse; + SUBHEAP *newsubheap; + + if ((flags & HEAP_REALLOC_IN_PLACE_ONLY) || + !(pNew = HEAP_FindFreeBlock( heapPtr, size, &newsubheap ))) + { + if (!(flags & HEAP_NO_SERIALIZE)) + RtlLeaveCriticalSection( &heapPtr->critSection ); + if (flags & HEAP_GENERATE_EXCEPTIONS) + RtlRaiseStatus( STATUS_NO_MEMORY ); + return NULL; + } + + /* Build the in-use arena */ + + pNew->next->prev = pNew->prev; + pNew->prev->next = pNew->next; + pInUse = (ARENA_INUSE *)pNew; + pInUse->size = (pInUse->size & ~ARENA_FLAG_FREE) + + sizeof(ARENA_FREE) - sizeof(ARENA_INUSE); + pInUse->threadId = (DWORD)NtCurrentTeb()->Cid.UniqueThread; + pInUse->magic = ARENA_INUSE_MAGIC; + HEAP_ShrinkBlock( newsubheap, pInUse, size ); + memcpy( pInUse + 1, pArena + 1, oldSize ); + + /* Free the previous block */ + + HEAP_MakeInUseBlockFree( subheap, pArena, flags ); + subheap = newsubheap; + pArena = pInUse; + } + } + else + HEAP_ShrinkBlock( subheap, pArena, size ); /* Shrink the block */ + + /* Clear the extra bytes if needed */ + + if (size > oldSize) + { + if (flags & HEAP_ZERO_MEMORY) + memset( (char *)(pArena + 1) + oldSize, 0, + (pArena->size & ARENA_SIZE_MASK) - oldSize ); + else if (TRACE_ON(heap)) + memset( (char *)(pArena + 1) + oldSize, ARENA_INUSE_FILLER, + (pArena->size & ARENA_SIZE_MASK) - oldSize ); + } + + /* Return the new arena */ + + if (!(flags & HEAP_NO_SERIALIZE)) + RtlLeaveCriticalSection( &heapPtr->critSection ); + + TRACE("(%08x,%08lx,%08lx,%08lx): returning %08lx\n", + heap, flags, (DWORD)ptr, size, (DWORD)(pArena + 1) ); + return (LPVOID)(pArena + 1); +} + + +/*********************************************************************** + * HeapCompact (KERNEL32.335) + * + * @unimplemented + */ +DWORD STDCALL RtlCompactHeap( HANDLE heap, DWORD flags ) +{ + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return 0; +} + + +/*********************************************************************** + * HeapLock (KERNEL32.339) + * Attempts to acquire the critical section object for a specified heap. + * + * RETURNS + * TRUE: Success + * FALSE: Failure + * + * @implemented + */ +BOOL STDCALL RtlLockHeap( + HANDLE heap /* [in] Handle of heap to lock for exclusive access */ +) +{ + HEAP *heapPtr = HEAP_GetPtr( heap ); + if (!heapPtr) + return FALSE; + RtlEnterCriticalSection( &heapPtr->critSection ); + return TRUE; +} + + +/*********************************************************************** + * HeapUnlock (KERNEL32.342) + * Releases ownership of the critical section object. + * + * RETURNS + * TRUE: Success + * FALSE: Failure + * + * @implemented + */ +BOOL STDCALL RtlUnlockHeap( + HANDLE heap /* [in] Handle to the heap to unlock */ +) +{ + HEAP *heapPtr = HEAP_GetPtr( heap ); + if (!heapPtr) + return FALSE; + RtlLeaveCriticalSection( &heapPtr->critSection ); + return TRUE; +} + + +/*********************************************************************** + * HeapSize (KERNEL32.341) + * RETURNS + * Size in bytes of allocated memory + * 0xffffffff: Failure + * + * @implemented + */ +DWORD STDCALL RtlSizeHeap( + HANDLE heap, /* [in] Handle of heap */ + DWORD flags, /* [in] Heap size control flags */ + LPVOID ptr /* [in] Address of memory to return size for */ +) +{ + DWORD ret; + HEAP *heapPtr = HEAP_GetPtr( heap ); + + if (!heapPtr) + return FALSE; + flags &= HEAP_NO_SERIALIZE; + flags |= heapPtr->flags; + if (!(flags & HEAP_NO_SERIALIZE)) + RtlEnterCriticalSection( &heapPtr->critSection ); + if (!HEAP_IsRealArena( heap, HEAP_NO_SERIALIZE, ptr, QUIET )) + { + SetLastError( ERROR_INVALID_PARAMETER ); + ret = 0xffffffff; + } + else + { + ARENA_INUSE *pArena = (ARENA_INUSE *)ptr - 1; + ret = pArena->size & ARENA_SIZE_MASK; + } + if (!(flags & HEAP_NO_SERIALIZE)) + RtlLeaveCriticalSection( &heapPtr->critSection ); + + TRACE("(%08x,%08lx,%08lx): returning %08lx\n", + heap, flags, (DWORD)ptr, ret ); + return ret; +} + + +/*********************************************************************** + * HeapValidate (KERNEL32.343) + * Validates a specified heap. + * + * NOTES + * Flags is ignored. + * + * RETURNS + * TRUE: Success + * FALSE: Failure + * + * @implemented + */ +BOOL STDCALL RtlValidateHeap( + HANDLE heap, /* [in] Handle to the heap */ + DWORD flags, /* [in] Bit flags that control access during operation */ + PVOID block /* [in] Optional pointer to memory block to validate */ +) +{ + + HEAP *heapPtr = HEAP_GetPtr( heap ); + if (!heapPtr) + return FALSE; + return HEAP_IsRealArena( heapPtr, flags, block, QUIET ); +} + + +/*********************************************************************** + * HeapWalk (KERNEL32.344) + * Enumerates the memory blocks in a specified heap. + * See HEAP_Dump() for info on heap structure. + * + * TODO + * - handling of PROCESS_HEAP_ENTRY_MOVEABLE and + * PROCESS_HEAP_ENTRY_DDESHARE (needs heap.c support) + * + * RETURNS + * TRUE: Success + * FALSE: Failure + */ +#if 0 +BOOL STDCALL HeapWalk( + HANDLE heap, /* [in] Handle to heap to enumerate */ + LPPROCESS_HEAP_ENTRY entry /* [out] Pointer to structure of enumeration info */ +) +{ + HEAP *heapPtr = HEAP_GetPtr(heap); + SUBHEAP *sub, *currentheap = NULL; + BOOL ret = FALSE; + char *ptr; + int region_index = 0; + + if (!heapPtr || !entry) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + if (!(heapPtr->flags & HEAP_NO_SERIALIZE)) + RtlEnterCriticalSection( &heapPtr->critSection ); + + /* set ptr to the next arena to be examined */ + + if (!entry->lpData) /* first call (init) ? */ + { + TRACE("begin walking of heap 0x%08x.\n", heap); + /*HEAP_Dump(heapPtr);*/ + currentheap = &heapPtr->subheap; + ptr = (char*)currentheap + currentheap->headerSize; + } + else + { + ptr = entry->lpData; + sub = &heapPtr->subheap; + while (sub) + { + if (((char *)ptr >= (char *)sub) && + ((char *)ptr < (char *)sub + sub->size)) + { + currentheap = sub; + break; + } + sub = sub->next; + region_index++; + } + if (currentheap == NULL) + { + ERR("no matching subheap found, shouldn't happen !\n"); + SetLastError(ERROR_NO_MORE_ITEMS); + goto HW_end; + } + + ptr += entry->cbData; /* point to next arena */ + if (ptr > (char *)currentheap + currentheap->size - 1) + { /* proceed with next subheap */ + if (!(currentheap = currentheap->next)) + { /* successfully finished */ + TRACE("end reached.\n"); + SetLastError(ERROR_NO_MORE_ITEMS); + goto HW_end; + } + ptr = (char*)currentheap + currentheap->headerSize; + } + } + + entry->wFlags = 0; + if (*(DWORD *)ptr & ARENA_FLAG_FREE) + { + ARENA_FREE *pArena = (ARENA_FREE *)ptr; + + /*TRACE("free, magic: %04x\n", pArena->magic);*/ + + entry->lpData = pArena + 1; + entry->cbData = pArena->size & ARENA_SIZE_MASK; + entry->cbOverhead = sizeof(ARENA_FREE); + entry->wFlags = PROCESS_HEAP_UNCOMMITTED_RANGE; + } + else + { + ARENA_INUSE *pArena = (ARENA_INUSE *)ptr; + + /*TRACE("busy, magic: %04x\n", pArena->magic);*/ + + entry->lpData = pArena + 1; + entry->cbData = pArena->size & ARENA_SIZE_MASK; + entry->cbOverhead = sizeof(ARENA_INUSE); + entry->wFlags = PROCESS_HEAP_ENTRY_BUSY; + /* FIXME: can't handle PROCESS_HEAP_ENTRY_MOVEABLE + and PROCESS_HEAP_ENTRY_DDESHARE yet */ + } + + entry->iRegionIndex = region_index; + + /* first element of heap ? */ + if (ptr == (char *)(currentheap + currentheap->headerSize)) + { + entry->wFlags |= PROCESS_HEAP_REGION; + entry->Foo.Region.dwCommittedSize = currentheap->commitSize; + entry->Foo.Region.dwUnCommittedSize = + currentheap->size - currentheap->commitSize; + entry->Foo.Region.lpFirstBlock = /* first valid block */ + currentheap + currentheap->headerSize; + entry->Foo.Region.lpLastBlock = /* first invalid block */ + currentheap + currentheap->size; + } + ret = TRUE; + +HW_end: + if (!(heapPtr->flags & HEAP_NO_SERIALIZE)) + RtlLeaveCriticalSection( &heapPtr->critSection ); + + return ret; +} +#endif + +VOID +RtlInitializeHeapManager(VOID) +{ + PPEB Peb; + + Peb = NtCurrentPeb(); + + Peb->NumberOfHeaps = 0; + Peb->MaximumNumberOfHeaps = (PAGE_SIZE - sizeof(PEB)) / sizeof(HANDLE); + Peb->ProcessHeaps = (PVOID)Peb + sizeof(PEB); + + RtlInitializeCriticalSection(&RtlpProcessHeapsListLock); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlEnumProcessHeaps(DWORD STDCALL_FUNC(*func)(void*,LONG), + LONG lParam) +{ + NTSTATUS Status = STATUS_SUCCESS; + ULONG i; + + RtlEnterCriticalSection(&RtlpProcessHeapsListLock); + + for (i = 0; i < NtCurrentPeb()->NumberOfHeaps; i++) + { + Status = func(NtCurrentPeb()->ProcessHeaps[i],lParam); + if (!NT_SUCCESS(Status)) + break; + } + + RtlLeaveCriticalSection(&RtlpProcessHeapsListLock); + + return Status; +} + + +/* + * @implemented + */ +ULONG STDCALL +RtlGetProcessHeaps(ULONG HeapCount, + HANDLE *HeapArray) +{ + ULONG Result = 0; + + RtlEnterCriticalSection(&RtlpProcessHeapsListLock); + + if (NtCurrentPeb()->NumberOfHeaps <= HeapCount) + { + Result = NtCurrentPeb()->NumberOfHeaps; + memmove(HeapArray, + NtCurrentPeb()->ProcessHeaps, + Result * sizeof(HANDLE)); + } + + RtlLeaveCriticalSection (&RtlpProcessHeapsListLock); + + return Result; +} + + +/* + * @implemented + */ +BOOLEAN STDCALL +RtlValidateProcessHeaps(VOID) +{ + HANDLE Heaps[128]; + BOOLEAN Result = TRUE; + ULONG HeapCount; + ULONG i; + + HeapCount = RtlGetProcessHeaps(128, Heaps); + for (i = 0; i < HeapCount; i++) + { + if (!RtlValidateHeap(Heaps[i], 0, NULL)) + Result = FALSE; + } + + return Result; +} + +/* EOF */ diff --git a/reactos/lib/rtl/largeint.c b/reactos/lib/rtl/largeint.c new file mode 100644 index 00000000000..b520bb08cc0 --- /dev/null +++ b/reactos/lib/rtl/largeint.c @@ -0,0 +1,356 @@ +/* $Id: largeint.c,v 1.1 2004/05/31 19:29:02 gdalsnes Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: lib/rtl/largeint.c + * PURPOSE: Large integer operations + * UPDATE HISTORY: + * Created 22/05/98 + * 08/30/98 RJJ Implemented several functions + */ + +/* INCLUDES *****************************************************************/ + +#include <ddk/ntddk.h> + +#define NDEBUG +#include <debug.h> + + +/* FUNCTIONS *****************************************************************/ + +/* + * @implemented + */ +LARGE_INTEGER +STDCALL +RtlConvertLongToLargeInteger ( + LONG SignedInteger +) +{ + LARGE_INTEGER RC; + + RC.QuadPart = SignedInteger; + + return RC; +} + +/* + * @implemented + */ +LARGE_INTEGER +STDCALL +RtlConvertUlongToLargeInteger ( + ULONG UnsignedInteger +) +{ + LARGE_INTEGER RC; + + RC.QuadPart = UnsignedInteger; + + return RC; +} + +/* + * @implemented + */ +LARGE_INTEGER +STDCALL +RtlEnlargedIntegerMultiply ( + LONG Multiplicand, + LONG Multiplier +) +{ + LARGE_INTEGER RC; + + RC.QuadPart = (LONGLONG) Multiplicand * Multiplier; + + return RC; +} + +/* + * @implemented + */ +ULONG +STDCALL +RtlEnlargedUnsignedDivide ( + ULARGE_INTEGER Dividend, + ULONG Divisor, + PULONG Remainder +) +{ + if (Remainder) + *Remainder = Dividend.QuadPart % Divisor; + + return (ULONG)(Dividend.QuadPart / Divisor); +} + +/* + * @implemented + */ +LARGE_INTEGER +STDCALL +RtlEnlargedUnsignedMultiply ( + ULONG Multiplicand, + ULONG Multiplier +) +{ + LARGE_INTEGER RC; + + RC.QuadPart = (ULONGLONG) Multiplicand * Multiplier; + + return RC; +} + +/* + * @implemented + */ +LARGE_INTEGER +STDCALL +RtlExtendedIntegerMultiply ( + LARGE_INTEGER Multiplicand, + LONG Multiplier +) +{ + LARGE_INTEGER RC; + + RC.QuadPart = Multiplicand.QuadPart * Multiplier; + + return RC; +} + +/* + * @implemented + */ +LARGE_INTEGER +STDCALL +RtlExtendedLargeIntegerDivide ( + LARGE_INTEGER Dividend, + ULONG Divisor, + PULONG Remainder +) +{ + LARGE_INTEGER RC; + + if (Remainder) + *Remainder = Dividend.QuadPart % Divisor; + + RC.QuadPart = Dividend.QuadPart / Divisor; + + return RC; +} + + +/****************************************************************************** + * RtlExtendedMagicDivide + * + * Allows replacing a division by a longlong constant with a multiplication by + * the inverse constant. + * + * RETURNS + * (Dividend * MagicDivisor) >> (64 + ShiftCount) + * + * NOTES + * If the divisor of a division is constant, the constants MagicDivisor and + * shift must be chosen such that + * MagicDivisor = 2^(64 + ShiftCount) / Divisor. + * + * Then we have RtlExtendedMagicDivide(Dividend,MagicDivisor,ShiftCount) == + * Dividend * MagicDivisor / 2^(64 + ShiftCount) == Dividend / Divisor. + * + * The Parameter MagicDivisor although defined as LONGLONG is used as + * ULONGLONG. + */ + +#define LOWER_32(A) ((A) & 0xffffffff) +#define UPPER_32(A) ((A) >> 32) + +/* + * @implemented + */ +LARGE_INTEGER STDCALL +RtlExtendedMagicDivide (LARGE_INTEGER Dividend, + LARGE_INTEGER MagicDivisor, + CCHAR ShiftCount) +{ + ULONGLONG dividend_high; + ULONGLONG dividend_low; + ULONGLONG inverse_divisor_high; + ULONGLONG inverse_divisor_low; + ULONGLONG ah_bl; + ULONGLONG al_bh; + LARGE_INTEGER result; + BOOLEAN positive; + + if (Dividend.QuadPart < 0) + { + dividend_high = UPPER_32((ULONGLONG) -Dividend.QuadPart); + dividend_low = LOWER_32((ULONGLONG) -Dividend.QuadPart); + positive = FALSE; + } + else + { + dividend_high = UPPER_32((ULONGLONG) Dividend.QuadPart); + dividend_low = LOWER_32((ULONGLONG) Dividend.QuadPart); + positive = TRUE; + } + inverse_divisor_high = UPPER_32((ULONGLONG) MagicDivisor.QuadPart); + inverse_divisor_low = LOWER_32((ULONGLONG) MagicDivisor.QuadPart); + + ah_bl = dividend_high * inverse_divisor_low; + al_bh = dividend_low * inverse_divisor_high; + + result.QuadPart = + (LONGLONG) ((dividend_high * inverse_divisor_high + + UPPER_32(ah_bl) + + UPPER_32(al_bh) + + UPPER_32(LOWER_32(ah_bl) + LOWER_32(al_bh) + + UPPER_32(dividend_low * inverse_divisor_low))) >> ShiftCount); + if (!positive) + { + result.QuadPart = -result.QuadPart; + } + + return result; +} + + +/* + * @implemented + */ +LARGE_INTEGER +STDCALL +RtlLargeIntegerAdd ( + LARGE_INTEGER Addend1, + LARGE_INTEGER Addend2 +) +{ + LARGE_INTEGER RC; + + RC.QuadPart = Addend1.QuadPart + Addend2.QuadPart; + + return RC; +} + +/* + * @implemented + */ +LARGE_INTEGER +STDCALL +RtlLargeIntegerArithmeticShift ( + LARGE_INTEGER LargeInteger, + CCHAR ShiftCount +) +{ + LARGE_INTEGER RC; + CHAR Shift; + + Shift = ShiftCount % 64; + + if (Shift < 32) + { + RC.QuadPart = LargeInteger.QuadPart >> Shift; + } + else + { + /* copy the sign bit */ + RC.u.HighPart |= (LargeInteger.u.HighPart & 0x80000000); + RC.u.LowPart = LargeInteger.u.HighPart >> Shift; + } + + return RC; +} + +/* + * @implemented + */ +LARGE_INTEGER +STDCALL +RtlLargeIntegerDivide ( + LARGE_INTEGER Dividend, + LARGE_INTEGER Divisor, + PLARGE_INTEGER Remainder +) +{ + LARGE_INTEGER RC; + + if (Remainder) + Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart; + + RC.QuadPart = Dividend.QuadPart / Divisor.QuadPart; + + return RC; +} + +/* + * @implemented + */ +LARGE_INTEGER +STDCALL +RtlLargeIntegerNegate ( + LARGE_INTEGER Subtrahend +) +{ + LARGE_INTEGER RC; + + RC.QuadPart = - Subtrahend.QuadPart; + + return RC; +} + +/* + * @implemented + */ +LARGE_INTEGER +STDCALL +RtlLargeIntegerShiftLeft ( + LARGE_INTEGER LargeInteger, + CCHAR ShiftCount +) +{ + LARGE_INTEGER RC; + CCHAR Shift; + + Shift = ShiftCount % 64; + RC.QuadPart = LargeInteger.QuadPart << Shift; + + return RC; +} + +/* + * @implemented + */ +LARGE_INTEGER +STDCALL +RtlLargeIntegerShiftRight ( + LARGE_INTEGER LargeInteger, + CCHAR ShiftCount +) +{ + LARGE_INTEGER RC; + CCHAR Shift; + + Shift = ShiftCount % 64; + RC.QuadPart = LargeInteger.QuadPart >> Shift; + + return RC; +} + +/* + * @implemented + */ +LARGE_INTEGER +STDCALL +RtlLargeIntegerSubtract ( + LARGE_INTEGER Minuend, + LARGE_INTEGER Subtrahend +) +{ + LARGE_INTEGER RC; + + RC.QuadPart = Minuend.QuadPart - Subtrahend.QuadPart; + + return RC; +} + +/* EOF */ diff --git a/reactos/lib/rtl/luid.c b/reactos/lib/rtl/luid.c new file mode 100644 index 00000000000..3bf8e6e170d --- /dev/null +++ b/reactos/lib/rtl/luid.c @@ -0,0 +1,60 @@ +/* $Id: luid.c,v 1.1 2004/05/31 19:29:02 gdalsnes Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * PURPOSE: Locally unique identifier (LUID) helper functions + * FILE: lib/rtl/luid.c + * PROGRAMER: Eric Kohl <ekohl@zr-online.de> + * REVISION HISTORY: + * 15/04/2000: Created + */ + +/* INCLUDES *****************************************************************/ + +#include <ddk/ntddk.h> + +#define NDEBUG +#include <debug.h> + +/* FUNCTIONS *****************************************************************/ + +VOID STDCALL +RtlCopyLuid(PLUID LuidDest, + PLUID LuidSrc) +{ + LuidDest->LowPart = LuidSrc->LowPart; + LuidDest->HighPart = LuidSrc->HighPart; +} + + +/* + * @implemented + */ +VOID STDCALL +RtlCopyLuidAndAttributesArray(ULONG Count, + PLUID_AND_ATTRIBUTES Src, + PLUID_AND_ATTRIBUTES Dest) +{ + ULONG i; + + for (i = 0; i < Count; i++) + { + RtlCopyMemory(&Dest[i], + &Src[i], + sizeof(LUID_AND_ATTRIBUTES)); + } +} + + +/* + * @implemented + */ +BOOLEAN STDCALL +RtlEqualLuid(PLUID Luid1, + PLUID Luid2) +{ + return (Luid1->LowPart == Luid2->LowPart && + Luid1->HighPart == Luid2->HighPart); +} + +/* EOF */ diff --git a/reactos/lib/rtl/makefile b/reactos/lib/rtl/makefile new file mode 100644 index 00000000000..dc94c041136 --- /dev/null +++ b/reactos/lib/rtl/makefile @@ -0,0 +1,49 @@ + +PATH_TO_TOP = ../.. + +TARGET_TYPE = library + +TARGET_NAME = rtl + +include $(PATH_TO_TOP)/config + +TARGET_CFLAGS = -Wall -Werror + +# require os code to explicitly request A/W version of structs/functions +TARGET_CFLAGS += -D_DISABLE_TIDENTS + +TARGET_OBJECTS = \ + acl.o \ + compress.o \ + dos8dot3.o \ + env.o \ + error.o \ + heap.o \ + largeint.o \ + luid.o \ + mem.o \ + nls.o \ + random.o \ + sd.o \ + security.o \ + sid.o \ + time.o \ + timezone.o \ + unicode.o \ + version.o + +# atom +# registry + + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +DEP_OBJECTS := $(TARGET_OBJECTS) + +TARGET_CLEAN = $(DEP_FILES) + +include $(PATH_TO_TOP)/tools/depend.mk + +# EOF diff --git a/reactos/lib/rtl/mem.c b/reactos/lib/rtl/mem.c new file mode 100644 index 00000000000..a87a87ad337 --- /dev/null +++ b/reactos/lib/rtl/mem.c @@ -0,0 +1,231 @@ + +/* $Id: mem.c,v 1.1 2004/05/31 19:29:02 gdalsnes Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: lib/rtl/mem.c + * PURPOSE: Memory functions + * PROGRAMMER: David Welch (welch@mcmail.com) + * UPDATE HISTORY: + * Created 22/05/98 + */ + +/* INCLUDES *****************************************************************/ + +#include <ddk/ntddk.h> +#include <string.h> + +#define NDEBUG +#include <debug.h> + + + + +/* FUNCTIONS *****************************************************************/ + +/****************************************************************************** + * RtlCompareMemory [NTDLL.@] + * + * Compare one block of memory with another + * + * PARAMS + * Source1 [I] Source block + * Source2 [I] Block to compare to Source1 + * Length [I] Number of bytes to fill + * + * RETURNS + * The length of the first byte at which Source1 and Source2 differ, or Length + * if they are the same. + * + * @implemented + */ +ULONG +STDCALL +RtlCompareMemory(PVOID Source1, + PVOID Source2, + ULONG Length) +{ + SIZE_T i; + for(i=0; (i<Length) && (((LPBYTE)Source1)[i]==((LPBYTE)Source2)[i]); i++) + ; + return i; +} + + +/* + * @implemented + */ +ULONG +STDCALL +RtlCompareMemoryUlong ( + PVOID Source, + ULONG Length, + ULONG Value +) +/* + * FUNCTION: Compares a block of ULONGs with an ULONG and returns the number of equal bytes + * ARGUMENTS: + * Source = Block to compare + * Length = Number of bytes to compare + * Value = Value to compare + * RETURNS: Number of equal bytes + */ +{ + PULONG ptr = (PULONG)Source; + ULONG len = Length / sizeof(ULONG); + ULONG i; + + for (i = 0; i < len; i++) + { + if (*ptr != Value) + break; + ptr++; + } + + return (ULONG)((PCHAR)ptr - (PCHAR)Source); +} + + +/* + * @implemented + */ +VOID +STDCALL +RtlFillMemory ( + PVOID Destination, + ULONG Length, + UCHAR Fill +) +{ + memset(Destination, Fill, Length); +} + + + +/* + * @implemented + */ +VOID +STDCALL +RtlFillMemoryUlong ( + PVOID Destination, + ULONG Length, + ULONG Fill +) +{ + PULONG Dest = Destination; + ULONG Count = Length / sizeof(ULONG); + + while (Count > 0) + { + *Dest = Fill; + Dest++; + Count--; + } +} + + + +/* + * @implemented + */ +VOID +STDCALL +RtlMoveMemory ( + PVOID Destination, + CONST VOID * Source, + ULONG Length +) +{ + memmove ( + Destination, + Source, + Length + ); +} + + +/* + * @implemented + */ +VOID +STDCALL +RtlZeroMemory ( + PVOID Destination, + ULONG Length +) +{ + RtlFillMemory ( + Destination, + Length, + 0 + ); +} + + +/************************************************************************* + * RtlUshortByteSwap + * + * Swap the bytes of an unsigned short value. + * + * NOTES + * Based on the inline versions in Wine winternl.h + * + * @implemented + */ +USHORT FASTCALL +RtlUshortByteSwap (IN USHORT Source) +{ + return (Source >> 8) | (Source << 8); +} + + + +/************************************************************************* + * RtlUlongByteSwap [NTDLL.@] + * + * Swap the bytes of an unsigned int value. + * + * NOTES + * Based on the inline versions in Wine winternl.h + * + * @implemented + */ +ULONG +FASTCALL +RtlUlongByteSwap( + IN ULONG Source +) +{ +#if defined(__i386__) && defined(__GNUC__) + ULONG ret; +__asm__("bswap %0" : "=r" (ret) : "0" (Source) ); + return ret; +#else + + return ((ULONG)RtlUshortByteSwap((USHORT)Source) << 16) | RtlUshortByteSwap((USHORT)(Source >> 16)); +#endif +} + + +/************************************************************************* + * RtlUlonglongByteSwap + * + * Swap the bytes of an unsigned long long value. + * + * PARAMS + * i [I] Value to swap bytes of + * + * RETURNS + * The value with its bytes swapped. + * + * @implemented + */ +ULONGLONG FASTCALL +RtlUlonglongByteSwap (IN ULONGLONG Source) +{ + return ((ULONGLONG) RtlUlongByteSwap (Source) << 32) | RtlUlongByteSwap (Source>>32); +} + + +/* EOF */ diff --git a/reactos/lib/rtl/nls.c b/reactos/lib/rtl/nls.c new file mode 100644 index 00000000000..2b926350e52 --- /dev/null +++ b/reactos/lib/rtl/nls.c @@ -0,0 +1,754 @@ +/* $Id: nls.c,v 1.1 2004/05/31 19:29:02 gdalsnes Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: lib/rtl/nls.c + * PURPOSE: National Language Support (NLS) functions + * UPDATE HISTORY: + * 20/08/99 Created by Emanuele Aliberti + * 10/11/99 Added translation functions. + * + * TODO: + * 1) Add multi-byte translation code. + */ + + +#include <ddk/ntddk.h> + +#define NDEBUG +#include <debug.h> + +/* GLOBALS *******************************************************************/ + +PUSHORT NlsUnicodeUpcaseTable = NULL; +PUSHORT NlsUnicodeLowercaseTable = NULL; + +USHORT NlsAnsiCodePage = 0; /* exported */ +BOOLEAN NlsMbCodePageTag = FALSE; /* exported */ +PWCHAR NlsAnsiToUnicodeTable = NULL; +PCHAR NlsUnicodeToAnsiTable = NULL; +PWCHAR NlsDbcsUnicodeToAnsiTable = NULL; +PUSHORT NlsLeadByteInfo = NULL; /* exported */ + + +USHORT NlsOemCodePage = 0; +BOOLEAN NlsMbOemCodePageTag = FALSE; /* exported */ +PWCHAR NlsOemToUnicodeTable = NULL; +PCHAR NlsUnicodeToOemTable =NULL; +PWCHAR NlsDbcsUnicodeToOemTable = NULL; +PUSHORT NlsOemLeadByteInfo = NULL; /* exported */ + + + + +#define INIT_FUNCTION + +/* FUNCTIONS *****************************************************************/ + + + + + + +/* + * @unimplemented + */ +NTSTATUS STDCALL +RtlCustomCPToUnicodeN(IN PCPTABLEINFO CustomCP, + PWCHAR UnicodeString, + ULONG UnicodeSize, + PULONG ResultSize, + PCHAR CustomString, + ULONG CustomSize) +{ + ULONG Size = 0; + ULONG i; + + if (CustomCP->DBCSCodePage == 0) + { + /* single-byte code page */ + if (CustomSize > (UnicodeSize / sizeof(WCHAR))) + Size = UnicodeSize / sizeof(WCHAR); + else + Size = CustomSize; + + if (ResultSize != NULL) + *ResultSize = Size * sizeof(WCHAR); + + for (i = 0; i < Size; i++) + { + *UnicodeString = CustomCP->MultiByteTable[(UCHAR)*CustomString]; + UnicodeString++; + CustomString++; + } + } + else + { + /* multi-byte code page */ + /* FIXME */ + assert(FALSE); + } + + return(STATUS_SUCCESS); +} + + + +WCHAR STDCALL +RtlDowncaseUnicodeChar (IN WCHAR Source) +{ + USHORT Offset; + + if (Source < L'A') + return Source; + + if (Source <= L'Z') + return Source + (L'a' - L'A'); + + if (Source < 0x80) + return Source; + + Offset = ((USHORT)Source >> 8); + DPRINT("Offset: %hx\n", Offset); + + Offset = NlsUnicodeLowercaseTable[Offset]; + DPRINT("Offset: %hx\n", Offset); + + Offset += (((USHORT)Source & 0x00F0) >> 4); + DPRINT("Offset: %hx\n", Offset); + + Offset = NlsUnicodeLowercaseTable[Offset]; + DPRINT("Offset: %hx\n", Offset); + + Offset += ((USHORT)Source & 0x000F); + DPRINT("Offset: %hx\n", Offset); + + Offset = NlsUnicodeLowercaseTable[Offset]; + DPRINT("Offset: %hx\n", Offset); + + DPRINT("Result: %hx\n", Source + (SHORT)Offset); + + return Source + (SHORT)Offset; +} + + + + +/* + * @implemented + */ +VOID STDCALL +RtlGetDefaultCodePage(OUT PUSHORT AnsiCodePage, + OUT PUSHORT OemCodePage) +{ + *AnsiCodePage = NlsAnsiCodePage; + *OemCodePage = NlsOemCodePage; +} + + + + +/* + * @implemented + */ +VOID STDCALL +RtlInitCodePageTable(IN PUSHORT TableBase, + OUT PCPTABLEINFO CodePageTable) +{ + PNLS_FILE_HEADER NlsFileHeader; + PUSHORT Ptr; + USHORT Offset; + + DPRINT("RtlInitCodePageTable() called\n"); + + NlsFileHeader = (PNLS_FILE_HEADER)TableBase; + + CodePageTable->CodePage = NlsFileHeader->CodePage; + CodePageTable->MaximumCharacterSize = NlsFileHeader->MaximumCharacterSize; + CodePageTable->DefaultChar = NlsFileHeader->DefaultChar; + CodePageTable->UniDefaultChar = NlsFileHeader->UniDefaultChar; + CodePageTable->TransDefaultChar = NlsFileHeader->TransDefaultChar; + CodePageTable->TransUniDefaultChar = NlsFileHeader->TransUniDefaultChar; + + RtlCopyMemory(&CodePageTable->LeadByte, + &NlsFileHeader->LeadByte, + MAXIMUM_LEADBYTES); + + /* Set Pointer to start of multi byte table */ + Ptr = (PUSHORT)((ULONG_PTR)TableBase + 2 * NlsFileHeader->HeaderSize); + + /* Get offset to the wide char table */ + Offset = (USHORT)(*Ptr++) + NlsFileHeader->HeaderSize + 1; + + /* Set pointer to the multi byte table */ + CodePageTable->MultiByteTable = Ptr; + + /* Skip ANSI and OEM table */ + Ptr += 256; + if (*Ptr++) + Ptr += 256; + + /* Set pointer to DBCS ranges */ + CodePageTable->DBCSRanges = (PUSHORT)Ptr; + + if (*Ptr > 0) + { + CodePageTable->DBCSCodePage = 1; + CodePageTable->DBCSOffsets = (PUSHORT)++Ptr; + } + else + { + CodePageTable->DBCSCodePage = 0; + CodePageTable->DBCSOffsets = 0; + } + + CodePageTable->WideCharTable = (PVOID)((ULONG_PTR)TableBase + 2 * Offset); +} + + + + +/* + * @implemented + */ +VOID STDCALL +RtlInitNlsTables(IN PUSHORT AnsiTableBase, + IN PUSHORT OemTableBase, + IN PUSHORT CaseTableBase, + OUT PNLSTABLEINFO NlsTable) +{ + DPRINT("RtlInitNlsTables()called\n"); + + if (AnsiTableBase == NULL || + OemTableBase == NULL || + CaseTableBase == NULL) + return; + + RtlInitCodePageTable (AnsiTableBase, + &NlsTable->AnsiTableInfo); + + RtlInitCodePageTable (OemTableBase, + &NlsTable->OemTableInfo); + + NlsTable->UpperCaseTable = (PUSHORT)CaseTableBase + 2; + NlsTable->LowerCaseTable = (PUSHORT)CaseTableBase + *((PUSHORT)CaseTableBase + 1) + 2; +} + + +/* + * @unimplemented + */ +NTSTATUS STDCALL +RtlMultiByteToUnicodeN( + IN PWCHAR UnicodeString, + IN ULONG UnicodeSize, + IN PULONG ResultSize, + IN PCHAR MbString, + IN ULONG MbSize) +{ + ULONG Size = 0; + ULONG i; + + if (NlsMbCodePageTag == FALSE) + { + /* single-byte code page */ + if (MbSize > (UnicodeSize / sizeof(WCHAR))) + Size = UnicodeSize / sizeof(WCHAR); + else + Size = MbSize; + + if (ResultSize != NULL) + *ResultSize = Size * sizeof(WCHAR); + + for (i = 0; i < Size; i++) + UnicodeString[i] = NlsAnsiToUnicodeTable[(UCHAR)MbString[i]]; + } + else + { + /* multi-byte code page */ + /* FIXME */ + assert(FALSE); + } + + return(STATUS_SUCCESS); +} + + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlMultiByteToUnicodeSize(PULONG UnicodeSize, + PCHAR MbString, + ULONG MbSize) +{ + ULONG Length; + + if (NlsMbCodePageTag == FALSE) + { + /* single-byte code page */ + *UnicodeSize = MbSize * sizeof (WCHAR); + } + else + { + /* multi-byte code page */ + for (Length = 0; MbSize; MbSize--, MbString++, Length++) + { + if (NlsLeadByteInfo[(UCHAR)*MbString] != 0) + { + if (!--MbSize) + break; /* partial char, ignore it */ + MbString++; + } + } + + *UnicodeSize = Length * sizeof(WCHAR); + } + + return STATUS_SUCCESS; +} + + + +/* + * @unimplemented + */ +NTSTATUS STDCALL +RtlOemToUnicodeN (PWCHAR UnicodeString, + ULONG UnicodeSize, + PULONG ResultSize, + PCHAR OemString, + ULONG OemSize) +{ + ULONG Size = 0; + ULONG i; + + if (NlsMbOemCodePageTag == FALSE) + { + /* single-byte code page */ + if (OemSize > (UnicodeSize / sizeof(WCHAR))) + Size = UnicodeSize / sizeof(WCHAR); + else + Size = OemSize; + + if (ResultSize != NULL) + *ResultSize = Size * sizeof(WCHAR); + + for (i = 0; i < Size; i++) + { + *UnicodeString = NlsOemToUnicodeTable[(INT)*OemString]; + UnicodeString++; + OemString++; + } + } + else + { + /* multi-byte code page */ + /* FIXME */ + assert(FALSE); + } + + return STATUS_SUCCESS; +} + + + +/* + * @implemented + */ +VOID STDCALL +RtlResetRtlTranslations(IN PNLSTABLEINFO NlsTable) +{ + DPRINT("RtlResetRtlTranslations() called\n"); + + /* Set ANSI data */ + NlsAnsiToUnicodeTable = NlsTable->AnsiTableInfo.MultiByteTable; + NlsUnicodeToAnsiTable = NlsTable->AnsiTableInfo.WideCharTable; + NlsDbcsUnicodeToAnsiTable = (PWCHAR)NlsTable->AnsiTableInfo.WideCharTable; + NlsMbCodePageTag = (NlsTable->AnsiTableInfo.DBCSCodePage != 0); + NlsLeadByteInfo = NlsTable->AnsiTableInfo.DBCSOffsets; + NlsAnsiCodePage = NlsTable->AnsiTableInfo.CodePage; + DPRINT("Ansi codepage %hu\n", NlsAnsiCodePage); + + /* Set OEM data */ + NlsOemToUnicodeTable = NlsTable->OemTableInfo.MultiByteTable; + NlsUnicodeToOemTable = NlsTable->OemTableInfo.WideCharTable; + NlsDbcsUnicodeToOemTable = (PWCHAR)NlsTable->OemTableInfo.WideCharTable; + NlsMbOemCodePageTag = (NlsTable->OemTableInfo.DBCSCodePage != 0); + NlsOemLeadByteInfo = NlsTable->OemTableInfo.DBCSOffsets; + NlsOemCodePage = NlsTable->OemTableInfo.CodePage; + DPRINT("Oem codepage %hu\n", NlsOemCodePage); + + /* Set Unicode case map data */ + NlsUnicodeUpcaseTable = NlsTable->UpperCaseTable; + NlsUnicodeLowercaseTable = NlsTable->LowerCaseTable; +} + + + +/* + * @unimplemented + */ +NTSTATUS STDCALL +RtlUnicodeToCustomCPN(IN PCPTABLEINFO CustomCP, + PCHAR CustomString, + ULONG CustomSize, + PULONG ResultSize, + PWCHAR UnicodeString, + ULONG UnicodeSize) +{ + ULONG Size = 0; + ULONG i; + + if (CustomCP->DBCSCodePage == 0) + { + /* single-byte code page */ + if (UnicodeSize > (CustomSize * sizeof(WCHAR))) + Size = CustomSize; + else + Size = UnicodeSize / sizeof(WCHAR); + + if (ResultSize != NULL) + *ResultSize = Size; + + for (i = 0; i < Size; i++) + { + *CustomString = ((PCHAR)CustomCP->WideCharTable)[*UnicodeString]; + CustomString++; + UnicodeString++; + } + } + else + { + /* multi-byte code page */ + /* FIXME */ + assert(FALSE); + } + + return STATUS_SUCCESS; +} + + + +/* + * @unimplemented + */ +NTSTATUS STDCALL +RtlUnicodeToMultiByteN (PCHAR MbString, + ULONG MbSize, + PULONG ResultSize, + PWCHAR UnicodeString, + ULONG UnicodeSize) +{ + ULONG Size = 0; + ULONG i; + + if (NlsMbCodePageTag == FALSE) + { + /* single-byte code page */ + if (UnicodeSize > (MbSize * sizeof(WCHAR))) + Size = MbSize; + else + Size = UnicodeSize / sizeof(WCHAR); + + if (ResultSize != NULL) + *ResultSize = Size; + + for (i = 0; i < Size; i++) + { + *MbString = NlsUnicodeToAnsiTable[*UnicodeString]; + MbString++; + UnicodeString++; + } + } + else + { + /* multi-byte code page */ + /* FIXME */ + assert(FALSE); + } + + return STATUS_SUCCESS; +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlUnicodeToMultiByteSize(PULONG MbSize, + PWCHAR UnicodeString, + ULONG UnicodeSize) +{ + ULONG UnicodeLength; + ULONG MbLength; + + if (NlsMbCodePageTag == FALSE) + { + /* single-byte code page */ + *MbSize = UnicodeSize / sizeof (WCHAR); + } + else + { + /* multi-byte code page */ + UnicodeLength = UnicodeSize / sizeof(WCHAR); + MbLength = 0; + while (UnicodeLength > 0) + { + if (NlsLeadByteInfo[(USHORT)*UnicodeString] & 0xff00) + MbLength++; + + MbLength++; + UnicodeLength--; + UnicodeString++; + } + + *MbSize = MbLength; + } + + return(STATUS_SUCCESS); +} + + + + +/* + * @unimplemented + */ +NTSTATUS STDCALL +RtlUnicodeToOemN (PCHAR OemString, + ULONG OemSize, + PULONG ResultSize, + PWCHAR UnicodeString, + ULONG UnicodeSize) +{ + ULONG Size = 0; + ULONG i; + + if (NlsMbOemCodePageTag == FALSE) + { + /* single-byte code page */ + if (UnicodeSize > (OemSize * sizeof(WCHAR))) + Size = OemSize; + else + Size = UnicodeSize / sizeof(WCHAR); + + if (ResultSize != NULL) + *ResultSize = Size; + + for (i = 0; i < Size; i++) + { + *OemString = NlsUnicodeToOemTable[*UnicodeString]; + OemString++; + UnicodeString++; + } + } + else + { + /* multi-byte code page */ + /* FIXME */ + assert(FALSE); + } + + return STATUS_SUCCESS; +} + + + + +/* + * @implemented + */ +WCHAR STDCALL +RtlUpcaseUnicodeChar(IN WCHAR Source) +{ + USHORT Offset; + + if (Source < L'a') + return Source; + + if (Source <= L'z') + return (Source - (L'a' - L'A')); + + Offset = ((USHORT)Source >> 8); + Offset = NlsUnicodeUpcaseTable[Offset]; + + Offset += (((USHORT)Source & 0x00F0) >> 4); + Offset = NlsUnicodeUpcaseTable[Offset]; + + Offset += ((USHORT)Source & 0x000F); + Offset = NlsUnicodeUpcaseTable[Offset]; + + return Source + (SHORT)Offset; +} + + + +/* + * @unimplemented + */ +NTSTATUS STDCALL +RtlUpcaseUnicodeToCustomCPN (IN PCPTABLEINFO CustomCP, + PCHAR CustomString, + ULONG CustomSize, + PULONG ResultSize, + PWCHAR UnicodeString, + ULONG UnicodeSize) +{ + WCHAR UpcaseChar; + ULONG Size = 0; + ULONG i; + + if (CustomCP->DBCSCodePage == 0) + { + /* single-byte code page */ + if (UnicodeSize > (CustomSize * sizeof(WCHAR))) + Size = CustomSize; + else + Size = UnicodeSize / sizeof(WCHAR); + + if (ResultSize != NULL) + *ResultSize = Size; + + for (i = 0; i < Size; i++) + { + UpcaseChar = RtlUpcaseUnicodeChar(*UnicodeString); + *CustomString = ((PCHAR)CustomCP->WideCharTable)[UpcaseChar]; + CustomString++; + UnicodeString++; + } + } + else + { + /* multi-byte code page */ + /* FIXME */ + assert(FALSE); + } + + return STATUS_SUCCESS; +} + + +/* + * @unimplemented + */ +NTSTATUS STDCALL +RtlUpcaseUnicodeToMultiByteN (PCHAR MbString, + ULONG MbSize, + PULONG ResultSize, + PWCHAR UnicodeString, + ULONG UnicodeSize) +{ + WCHAR UpcaseChar; + ULONG Size = 0; + ULONG i; + + if (NlsMbCodePageTag == FALSE) + { + /* single-byte code page */ + if (UnicodeSize > (MbSize * sizeof(WCHAR))) + Size = MbSize; + else + Size = UnicodeSize / sizeof(WCHAR); + + if (ResultSize != NULL) + *ResultSize = Size; + + for (i = 0; i < Size; i++) + { + UpcaseChar = RtlUpcaseUnicodeChar(*UnicodeString); + *MbString = NlsUnicodeToAnsiTable[UpcaseChar]; + MbString++; + UnicodeString++; + } + } + else + { + /* multi-byte code page */ + /* FIXME */ + assert(FALSE); + } + + return STATUS_SUCCESS; +} + + +/* + * @unimplemented + */ +NTSTATUS STDCALL +RtlUpcaseUnicodeToOemN (PCHAR OemString, + ULONG OemSize, + PULONG ResultSize, + PWCHAR UnicodeString, + ULONG UnicodeSize) +{ + WCHAR UpcaseChar; + ULONG Size = 0; + ULONG i; + + if (NlsMbOemCodePageTag == FALSE) + { + /* single-byte code page */ + if (UnicodeSize > (OemSize * sizeof(WCHAR))) + Size = OemSize; + else + Size = UnicodeSize / sizeof(WCHAR); + + if (ResultSize != NULL) + *ResultSize = Size; + + for (i = 0; i < Size; i++) + { + UpcaseChar = RtlUpcaseUnicodeChar(*UnicodeString); + *OemString = NlsUnicodeToOemTable[UpcaseChar]; + OemString++; + UnicodeString++; + } + } + else + { + /* multi-byte code page */ + /* FIXME */ + assert(FALSE); + } + + return STATUS_SUCCESS; +} + + + +/* + * @unimplemented + */ +CHAR STDCALL +RtlUpperChar (IN CHAR Source) +{ + WCHAR Unicode; + CHAR Destination; + + if (NlsMbCodePageTag == FALSE) + { + /* single-byte code page */ + + /* ansi->unicode */ + Unicode = NlsAnsiToUnicodeTable[(UCHAR)Source]; + + /* upcase conversion */ + Unicode = RtlUpcaseUnicodeChar (Unicode); + + /* unicode -> ansi */ + Destination = NlsUnicodeToAnsiTable[(USHORT)Unicode]; + } + else + { + /* multi-byte code page */ + /* FIXME */ + Destination = Source; + } + + return Destination; +} + +/* EOF */ diff --git a/reactos/lib/rtl/random.c b/reactos/lib/rtl/random.c new file mode 100644 index 00000000000..9c34bbea847 --- /dev/null +++ b/reactos/lib/rtl/random.c @@ -0,0 +1,159 @@ +/* + * 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: random.c,v 1.1 2004/05/31 19:29:02 gdalsnes Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * PURPOSE: Random number generator functions + * FILE: lib/rtl/random.c + */ + +/* INCLUDES *****************************************************************/ + +#define NTOS_MODE_USER +#include <ntos.h> + +//#include <ddk/ntddk.h> + + +static ULONG SavedValue[128] = + { + 0x4c8bc0aa, 0x4c022957, 0x2232827a, 0x2f1e7626, /* 0 */ + 0x7f8bdafb, 0x5c37d02a, 0x0ab48f72, 0x2f0c4ffa, /* 4 */ + 0x290e1954, 0x6b635f23, 0x5d3885c0, 0x74b49ff8, /* 8 */ + 0x5155fa54, 0x6214ad3f, 0x111e9c29, 0x242a3a09, /* 12 */ + 0x75932ae1, 0x40ac432e, 0x54f7ba7a, 0x585ccbd5, /* 16 */ + 0x6df5c727, 0x0374dad1, 0x7112b3f1, 0x735fc311, /* 20 */ + 0x404331a9, 0x74d97781, 0x64495118, 0x323e04be, /* 24 */ + 0x5974b425, 0x4862e393, 0x62389c1d, 0x28a68b82, /* 28 */ + 0x0f95da37, 0x7a50bbc6, 0x09b0091c, 0x22cdb7b4, /* 32 */ + 0x4faaed26, 0x66417ccd, 0x189e4bfa, 0x1ce4e8dd, /* 36 */ + 0x5274c742, 0x3bdcf4dc, 0x2d94e907, 0x32eac016, /* 40 */ + 0x26d33ca3, 0x60415a8a, 0x31f57880, 0x68c8aa52, /* 44 */ + 0x23eb16da, 0x6204f4a1, 0x373927c1, 0x0d24eb7c, /* 48 */ + 0x06dd7379, 0x2b3be507, 0x0f9c55b1, 0x2c7925eb, /* 52 */ + 0x36d67c9a, 0x42f831d9, 0x5e3961cb, 0x65d637a8, /* 56 */ + 0x24bb3820, 0x4d08e33d, 0x2188754f, 0x147e409e, /* 60 */ + 0x6a9620a0, 0x62e26657, 0x7bd8ce81, 0x11da0abb, /* 64 */ + 0x5f9e7b50, 0x23e444b6, 0x25920c78, 0x5fc894f0, /* 68 */ + 0x5e338cbb, 0x404237fd, 0x1d60f80f, 0x320a1743, /* 72 */ + 0x76013d2b, 0x070294ee, 0x695e243b, 0x56b177fd, /* 76 */ + 0x752492e1, 0x6decd52f, 0x125f5219, 0x139d2e78, /* 80 */ + 0x1898d11e, 0x2f7ee785, 0x4db405d8, 0x1a028a35, /* 84 */ + 0x63f6f323, 0x1f6d0078, 0x307cfd67, 0x3f32a78a, /* 88 */ + 0x6980796c, 0x462b3d83, 0x34b639f2, 0x53fce379, /* 92 */ + 0x74ba50f4, 0x1abc2c4b, 0x5eeaeb8d, 0x335a7a0d, /* 96 */ + 0x3973dd20, 0x0462d66b, 0x159813ff, 0x1e4643fd, /* 100 */ + 0x06bc5c62, 0x3115e3fc, 0x09101613, 0x47af2515, /* 104 */ + 0x4f11ec54, 0x78b99911, 0x3db8dd44, 0x1ec10b9b, /* 108 */ + 0x5b5506ca, 0x773ce092, 0x567be81a, 0x5475b975, /* 112 */ + 0x7a2cde1a, 0x494536f5, 0x34737bb4, 0x76d9750b, /* 116 */ + 0x2a1f6232, 0x2e49644d, 0x7dddcbe7, 0x500cebdb, /* 120 */ + 0x619dab9e, 0x48c626fe, 0x1cda3193, 0x52dabe9d /* 124 */ + }; + + +/************************************************************************* + * RtlRandom [NTDLL.@] + * + * Generates a random number + * + * PARAMS + * Seed [O] The seed of the Random function + * + * RETURNS + * It returns a random number distributed over [0..MAXLONG-1]. + */ +ULONG STDCALL +RtlRandom (IN OUT PULONG Seed) +{ + ULONG Rand; + int Pos; + ULONG Result; + + Rand = (*Seed * 0x7fffffed + 0x7fffffc3) % 0x7fffffff; + *Seed = (Rand * 0x7fffffed + 0x7fffffc3) % 0x7fffffff; + Pos = *Seed & 0x7f; + Result = SavedValue[Pos]; + SavedValue[Pos] = Rand; + + return Result; +} + + + +/************************************************************************* + * RtlUniform [NTDLL.@] + * + * Generates an uniform random number + * + * PARAMS + * Seed [O] The seed of the Random function + * + * RETURNS + * It returns a random number uniformly distributed over [0..MAXLONG-1]. + * + * NOTES + * Generates an uniform random number using D.H. Lehmer's 1948 algorithm. + * In our case the algorithm is: + * + * Result = (*Seed * 0x7fffffed + 0x7fffffc3) % MAXLONG; + * + * *Seed = Result; + * + * DIFFERENCES + * The native documentation states that the random number is + * uniformly distributed over [0..MAXLONG]. In reality the native + * function and our function return a random number uniformly + * distributed over [0..MAXLONG-1]. + */ +ULONG STDCALL +RtlUniform (PULONG Seed) +{ + ULONG Result; + + /* + * Instead of the algorithm stated above, we use the algorithm + * below, which is totally equivalent (see the tests), but does + * not use a division and therefore is faster. + */ + Result = *Seed * 0xffffffed + 0x7fffffc3; + + if (Result == 0xffffffff || Result == 0x7ffffffe) + { + Result = (Result + 2) & MAXLONG; + } + else if (Result == 0x7fffffff) + { + Result = 0; + } + else if ((Result & 0x80000000) == 0) + { + Result = Result + (~Result & 1); + } + else + { + Result = (Result + (Result & 1)) & MAXLONG; + } + + *Seed = Result; + + return Result; +} +/* EOF */ diff --git a/reactos/lib/rtl/sd.c b/reactos/lib/rtl/sd.c new file mode 100644 index 00000000000..a7cce3c9288 --- /dev/null +++ b/reactos/lib/rtl/sd.c @@ -0,0 +1,753 @@ +/* $Id: sd.c,v 1.1 2004/05/31 19:29:02 gdalsnes Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * PURPOSE: Security descriptor functions + * FILE: lib/rtl/sd.c + * PROGRAMER: David Welch <welch@cwcom.net> + * REVISION HISTORY: + * 26/07/98: Added stubs for security functions + */ + +/* INCLUDES *****************************************************************/ + +#include <ddk/ntddk.h> + +#include <ntdll/ntdll.h> + +/* FUNCTIONS ***************************************************************/ + +NTSTATUS STDCALL +RtlCreateSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, + ULONG Revision) +{ + if (Revision != 1) + { + return(STATUS_UNSUCCESSFUL); + } + + SecurityDescriptor->Revision = 1; + SecurityDescriptor->Sbz1 = 0; + SecurityDescriptor->Control = 0; + SecurityDescriptor->Owner = NULL; + SecurityDescriptor->Group = NULL; + SecurityDescriptor->Sacl = NULL; + SecurityDescriptor->Dacl = NULL; + + return(STATUS_SUCCESS); +} + +/* + * @implemented + */ +ULONG STDCALL +RtlLengthSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor) +{ + PSID Owner; + PSID Group; + ULONG Length; + PACL Dacl; + PACL Sacl; + + Length = sizeof(SECURITY_DESCRIPTOR); + + if (SecurityDescriptor->Owner != NULL) + { + Owner = SecurityDescriptor->Owner; + if (SecurityDescriptor->Control & SE_SELF_RELATIVE) + { + Owner = (PSID)((ULONG)Owner + + (ULONG)SecurityDescriptor); + } + Length = Length + ((sizeof(SID) + (Owner->SubAuthorityCount - 1) * + sizeof(ULONG) + 3) & 0xfc); + } + + if (SecurityDescriptor->Group != NULL) + { + Group = SecurityDescriptor->Group; + if (SecurityDescriptor->Control & SE_SELF_RELATIVE) + { + Group = (PSID)((ULONG)Group + (ULONG)SecurityDescriptor); + } + Length = Length + ((sizeof(SID) + (Group->SubAuthorityCount - 1) * + sizeof(ULONG) + 3) & 0xfc); + } + + if (SecurityDescriptor->Control & SE_DACL_PRESENT && + SecurityDescriptor->Dacl != NULL) + { + Dacl = SecurityDescriptor->Dacl; + if (SecurityDescriptor->Control & SE_SELF_RELATIVE) + { + Dacl = (PACL)((ULONG)Dacl + (PVOID)SecurityDescriptor); + } + Length = Length + ((Dacl->AclSize + 3) & 0xfc); + } + + if (SecurityDescriptor->Control & SE_SACL_PRESENT && + SecurityDescriptor->Sacl != NULL) + { + Sacl = SecurityDescriptor->Sacl; + if (SecurityDescriptor->Control & SE_SELF_RELATIVE) + { + Sacl = (PACL)((ULONG)Sacl + (PVOID)SecurityDescriptor); + } + Length = Length + ((Sacl->AclSize + 3) & 0xfc); + } + + return(Length); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlGetDaclSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, + PBOOLEAN DaclPresent, + PACL* Dacl, + PBOOLEAN DaclDefaulted) +{ + if (SecurityDescriptor->Revision != 1) + { + return(STATUS_UNSUCCESSFUL); + } + if (!(SecurityDescriptor->Control & SE_DACL_PRESENT)) + { + *DaclPresent = 0; + return(STATUS_SUCCESS); + } + *DaclPresent = 1; + if (SecurityDescriptor->Dacl == NULL) + { + *Dacl = NULL; + } + else + { + if (SecurityDescriptor->Control & SE_SELF_RELATIVE) + { + *Dacl = (PACL)((ULONG)SecurityDescriptor->Dacl + + (PVOID)SecurityDescriptor); + } + else + { + *Dacl = SecurityDescriptor->Dacl; + } + } + if (SecurityDescriptor->Control & SE_DACL_DEFAULTED) + { + *DaclDefaulted = 1; + } + else + { + *DaclDefaulted = 0; + } + return(STATUS_SUCCESS); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlSetDaclSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, + BOOLEAN DaclPresent, + PACL Dacl, + BOOLEAN DaclDefaulted) +{ + if (SecurityDescriptor->Revision != 1) + { + return(STATUS_UNSUCCESSFUL); + } + if (SecurityDescriptor->Control & SE_SELF_RELATIVE) + { + return(STATUS_UNSUCCESSFUL); + } + if (!DaclPresent) + { + SecurityDescriptor->Control = SecurityDescriptor->Control & ~(SE_DACL_PRESENT); + return(STATUS_SUCCESS); + } + SecurityDescriptor->Control = SecurityDescriptor->Control | SE_DACL_PRESENT; + SecurityDescriptor->Dacl = Dacl; + SecurityDescriptor->Control = SecurityDescriptor->Control & ~(SE_DACL_DEFAULTED); + if (DaclDefaulted) + { + SecurityDescriptor->Control = SecurityDescriptor->Control | SE_DACL_DEFAULTED; + } + return(STATUS_SUCCESS); +} + + +/* + * @implemented + */ +BOOLEAN STDCALL +RtlValidSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor) +{ + PSID Owner; + PSID Group; + PACL Sacl; + PACL Dacl; + + if (SecurityDescriptor->Revision != 1) + { + return(FALSE); + } + + Owner = SecurityDescriptor->Owner; + if (SecurityDescriptor->Control & SE_SELF_RELATIVE) + { + Owner = (PSID)((ULONG)Owner + (ULONG)SecurityDescriptor); + } + + if (!RtlValidSid(Owner)) + { + return(FALSE); + } + + Group = SecurityDescriptor->Group; + if (SecurityDescriptor->Control & SE_SELF_RELATIVE) + { + Group = (PSID)((ULONG)Group + (ULONG)SecurityDescriptor); + } + + if (!RtlValidSid(Group)) + { + return(FALSE); + } + + if (SecurityDescriptor->Control & SE_DACL_PRESENT && + SecurityDescriptor->Dacl != NULL) + { + Dacl = SecurityDescriptor->Dacl; + if (SecurityDescriptor->Control & SE_SELF_RELATIVE) + { + Dacl = (PACL)((ULONG)Dacl + (ULONG)SecurityDescriptor); + } + + if (!RtlValidAcl(Dacl)) + { + return(FALSE); + } + } + + if (SecurityDescriptor->Control & SE_SACL_PRESENT && + SecurityDescriptor->Sacl != NULL) + { + Sacl = SecurityDescriptor->Sacl; + if (SecurityDescriptor->Control & SE_SELF_RELATIVE) + { + Sacl = (PACL)((ULONG)Sacl + (ULONG)SecurityDescriptor); + } + + if (!RtlValidAcl(Sacl)) + { + return(FALSE); + } + } + + return(TRUE); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlSetOwnerSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, + PSID Owner, + BOOLEAN OwnerDefaulted) +{ + if (SecurityDescriptor->Revision != 1) + { + return(STATUS_UNSUCCESSFUL); + } + if (SecurityDescriptor->Control & SE_SELF_RELATIVE) + { + return(STATUS_UNSUCCESSFUL); + } + SecurityDescriptor->Owner = Owner; + SecurityDescriptor->Control = SecurityDescriptor->Control & ~(SE_OWNER_DEFAULTED); + if (OwnerDefaulted) + { + SecurityDescriptor->Control = SecurityDescriptor->Control | SE_OWNER_DEFAULTED; + } + return(STATUS_SUCCESS); +} + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlGetOwnerSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, + PSID* Owner, + PBOOLEAN OwnerDefaulted) +{ + if (SecurityDescriptor->Revision != 1) + { + return(STATUS_UNSUCCESSFUL); + } + if (SecurityDescriptor->Owner != NULL) + { + if (SecurityDescriptor->Control & SE_SELF_RELATIVE) + { + *Owner = (PSID)((ULONG)SecurityDescriptor->Owner + + (PVOID)SecurityDescriptor); + } + else + { + *Owner = SecurityDescriptor->Owner; + } + } + else + { + *Owner = NULL; + } + if (SecurityDescriptor->Control & SE_OWNER_DEFAULTED) + { + *OwnerDefaulted = 1; + } + else + { + *OwnerDefaulted = 0; + } + return(STATUS_SUCCESS); +} + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlSetGroupSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, + PSID Group, + BOOLEAN GroupDefaulted) +{ + if (SecurityDescriptor->Revision != 1) + { + return(STATUS_UNSUCCESSFUL); + } + if (SecurityDescriptor->Control & SE_SELF_RELATIVE) + { + return(STATUS_UNSUCCESSFUL); + } + SecurityDescriptor->Group = Group; + SecurityDescriptor->Control = SecurityDescriptor->Control & ~(SE_GROUP_DEFAULTED); + if (GroupDefaulted) + { + SecurityDescriptor->Control = SecurityDescriptor->Control | SE_GROUP_DEFAULTED; + } + return(STATUS_SUCCESS); +} + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlGetGroupSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, + PSID* Group, + PBOOLEAN GroupDefaulted) +{ + if (SecurityDescriptor->Revision != 1) + { + return(STATUS_UNSUCCESSFUL); + } + if (SecurityDescriptor->Group != NULL) + { + if (SecurityDescriptor->Control & SE_SELF_RELATIVE) + { + *Group = (PSID)((ULONG)SecurityDescriptor->Group + + (PVOID)SecurityDescriptor); + } + else + { + *Group = SecurityDescriptor->Group; + } + } + else + { + *Group = NULL; + } + if (SecurityDescriptor->Control & SE_GROUP_DEFAULTED) + { + *GroupDefaulted = 1; + } + else + { + *GroupDefaulted = 0; + } + return(STATUS_SUCCESS); +} + + +static VOID +RtlpQuerySecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, + PSID* Owner, + PULONG OwnerLength, + PSID* Group, + PULONG GroupLength, + PACL* Dacl, + PULONG DaclLength, + PACL* Sacl, + PULONG SaclLength) +{ + if (SecurityDescriptor->Owner != NULL) + { + *Owner = SecurityDescriptor->Owner; + if (SecurityDescriptor->Control & SE_SELF_RELATIVE) + { + *Owner = (PSID)((ULONG)*Owner + (ULONG)SecurityDescriptor); + } + } + else + { + *Owner = NULL; + } + + if (*Owner != NULL) + { + *OwnerLength = (RtlLengthSid(*Owner) + 3) & ~3; + } + else + { + *OwnerLength = 0; + } + + if ((SecurityDescriptor->Control & SE_DACL_PRESENT) && + SecurityDescriptor->Dacl != NULL) + { + *Dacl = SecurityDescriptor->Dacl; + if (SecurityDescriptor->Control & SE_SELF_RELATIVE) + { + *Dacl = (PACL)((ULONG)*Dacl + (ULONG)SecurityDescriptor); + } + } + else + { + *Dacl = NULL; + } + + if (*Dacl != NULL) + { + *DaclLength = ((*Dacl)->AclSize + 3) & ~3; + } + else + { + *DaclLength = 0; + } + + if (SecurityDescriptor->Group != NULL) + { + *Group = SecurityDescriptor->Group; + if (SecurityDescriptor->Control & SE_SELF_RELATIVE) + { + *Group = (PSID)((ULONG)*Group + (ULONG)SecurityDescriptor); + } + } + else + { + *Group = NULL; + } + + if (*Group != NULL) + { + *GroupLength = (RtlLengthSid(*Group) + 3) & ~3; + } + else + { + *GroupLength = 0; + } + + if ((SecurityDescriptor->Control & SE_SACL_PRESENT) && + SecurityDescriptor->Sacl != NULL) + { + *Sacl = SecurityDescriptor->Sacl; + if (SecurityDescriptor->Control & SE_SELF_RELATIVE) + { + *Sacl = (PACL)((ULONG)*Sacl + (ULONG)SecurityDescriptor); + } + } + else + { + *Sacl = NULL; + } + + if (*Sacl != NULL) + { + *SaclLength = ((*Sacl)->AclSize + 3) & ~3; + } + else + { + *SaclLength = 0; + } +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlMakeSelfRelativeSD(PSECURITY_DESCRIPTOR AbsSD, + PSECURITY_DESCRIPTOR RelSD, + PULONG BufferLength) +{ + PSID Owner; + PSID Group; + PACL Sacl; + PACL Dacl; + ULONG OwnerLength; + ULONG GroupLength; + ULONG SaclLength; + ULONG DaclLength; + ULONG TotalLength; + ULONG Current; + + RtlpQuerySecurityDescriptor(AbsSD, + &Owner, + &OwnerLength, + &Group, + &GroupLength, + &Dacl, + &DaclLength, + &Sacl, + &SaclLength); + + TotalLength = OwnerLength + GroupLength + SaclLength + DaclLength + sizeof(SECURITY_DESCRIPTOR); + if (*BufferLength < TotalLength) + { + return(STATUS_BUFFER_TOO_SMALL); + } + + RtlZeroMemory(RelSD, + TotalLength); + memmove(RelSD, + AbsSD, + sizeof(SECURITY_DESCRIPTOR)); + Current = (ULONG)RelSD + sizeof(SECURITY_DESCRIPTOR); + + if (SaclLength != 0) + { + memmove((PVOID)Current, + Sacl, + SaclLength); + RelSD->Sacl = (PACL)((ULONG)Current - (ULONG)RelSD); + Current += SaclLength; + } + + if (DaclLength != 0) + { + memmove((PVOID)Current, + Dacl, + DaclLength); + RelSD->Dacl = (PACL)((ULONG)Current - (ULONG)RelSD); + Current += DaclLength; + } + + if (OwnerLength != 0) + { + memmove((PVOID)Current, + Owner, + OwnerLength); + RelSD->Owner = (PSID)((ULONG)Current - (ULONG)RelSD); + Current += OwnerLength; + } + + if (GroupLength != 0) + { + memmove((PVOID)Current, + Group, + GroupLength); + RelSD->Group = (PSID)((ULONG)Current - (ULONG)RelSD); + } + + RelSD->Control |= SE_SELF_RELATIVE; + + return(STATUS_SUCCESS); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlAbsoluteToSelfRelativeSD(PSECURITY_DESCRIPTOR AbsSD, + PSECURITY_DESCRIPTOR RelSD, + PULONG BufferLength + ) +{ + if (AbsSD->Control & SE_SELF_RELATIVE) + { + return(STATUS_BAD_DESCRIPTOR_FORMAT); + } + + return(RtlMakeSelfRelativeSD(AbsSD, RelSD, BufferLength)); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlGetControlSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, + PSECURITY_DESCRIPTOR_CONTROL Control, + PULONG Revision) +{ + *Revision = SecurityDescriptor->Revision; + + if (SecurityDescriptor->Revision != 1) + { + return(STATUS_UNKNOWN_REVISION); + } + + *Control = SecurityDescriptor->Control; + + return(STATUS_SUCCESS); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlGetSaclSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, + PBOOLEAN SaclPresent, + PACL *Sacl, + PBOOLEAN SaclDefaulted) +{ + if (SecurityDescriptor->Revision != 1) + { + return(STATUS_UNSUCCESSFUL); + } + if (!(SecurityDescriptor->Control & SE_SACL_PRESENT)) + { + *SaclPresent = 0; + return(STATUS_SUCCESS); + } + *SaclPresent = 1; + if (SecurityDescriptor->Sacl == NULL) + { + *Sacl = NULL; + } + else + { + if (SecurityDescriptor->Control & SE_SELF_RELATIVE) + { + *Sacl = (PACL)((ULONG)SecurityDescriptor->Sacl + + (PVOID)SecurityDescriptor); + } + else + { + *Sacl = SecurityDescriptor->Sacl; + } + } + if (SecurityDescriptor->Control & SE_SACL_DEFAULTED) + { + *SaclDefaulted = 1; + } + else + { + *SaclDefaulted = 0; + } + return(STATUS_SUCCESS); +} + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlSetSaclSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, + BOOLEAN SaclPresent, + PACL Sacl, + BOOLEAN SaclDefaulted) +{ + if (SecurityDescriptor->Revision != 1) + { + return(STATUS_UNSUCCESSFUL); + } + if (SecurityDescriptor->Control & SE_SELF_RELATIVE) + { + return(STATUS_UNSUCCESSFUL); + } + if (!SaclPresent) + { + SecurityDescriptor->Control = SecurityDescriptor->Control & ~(SE_SACL_PRESENT); + return(STATUS_SUCCESS); + } + SecurityDescriptor->Control = SecurityDescriptor->Control | SE_SACL_PRESENT; + SecurityDescriptor->Sacl = Sacl; + SecurityDescriptor->Control = SecurityDescriptor->Control & ~(SE_SACL_DEFAULTED); + if (SaclDefaulted) + { + SecurityDescriptor->Control = SecurityDescriptor->Control | SE_SACL_DEFAULTED; + } + return(STATUS_SUCCESS); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlSelfRelativeToAbsoluteSD(PSECURITY_DESCRIPTOR RelSD, + PSECURITY_DESCRIPTOR AbsSD, + PDWORD AbsSDSize, + PACL Dacl, + PDWORD DaclSize, + PACL Sacl, + PDWORD SaclSize, + PSID Owner, + PDWORD OwnerSize, + PSID Group, + PDWORD GroupSize) +{ + ULONG OwnerLength; + ULONG GroupLength; + ULONG DaclLength; + ULONG SaclLength; + PSID pOwner; + PSID pGroup; + PACL pDacl; + PACL pSacl; + + if (!(RelSD->Control & SE_SELF_RELATIVE)) + return STATUS_BAD_DESCRIPTOR_FORMAT; + + RtlpQuerySecurityDescriptor (RelSD, + &pOwner, + &OwnerLength, + &pGroup, + &GroupLength, + &pDacl, + &DaclLength, + &pSacl, + &SaclLength); + + if (OwnerLength > *OwnerSize || + GroupLength > *GroupSize || + DaclLength > *DaclSize || + SaclLength > *SaclSize) + return STATUS_BUFFER_TOO_SMALL; + + memmove (Owner, pOwner, OwnerLength); + memmove (Group, pGroup, GroupLength); + memmove (Dacl, pDacl, DaclLength); + memmove (Sacl, pSacl, SaclLength); + + memmove (AbsSD, RelSD, sizeof (SECURITY_DESCRIPTOR)); + + AbsSD->Control &= ~SE_SELF_RELATIVE; + AbsSD->Owner = Owner; + AbsSD->Group = Group; + AbsSD->Dacl = Dacl; + AbsSD->Sacl = Sacl; + + *OwnerSize = OwnerLength; + *GroupSize = GroupLength; + *DaclSize = DaclLength; + *SaclSize = SaclLength; + + return STATUS_SUCCESS; +} + +/* EOF */ diff --git a/reactos/lib/rtl/security.c b/reactos/lib/rtl/security.c new file mode 100644 index 00000000000..c50ec28863d --- /dev/null +++ b/reactos/lib/rtl/security.c @@ -0,0 +1,150 @@ +/* $Id: security.c,v 1.1 2004/05/31 19:29:02 gdalsnes Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: lib/rtl/security.c + * PURPOSE: Miscellaneous securitiy related functions + * PROGRAMMER: Eric Kohl + * UPDATE HISTORY: + * 21/11/2001 Created + */ + +#include <ddk/ntddk.h> +#include <ntdll/rtl.h> + +#define NDEBUG +#include <debug.h> + + +/* FUNCTIONS ****************************************************************/ + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlImpersonateSelf(IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + SECURITY_QUALITY_OF_SERVICE SecQos; + HANDLE ProcessToken; + HANDLE ImpersonationToken; + NTSTATUS Status; + + Status = NtOpenProcessToken(NtCurrentProcess(), + TOKEN_DUPLICATE, + &ProcessToken); + if (!NT_SUCCESS(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, + TokenImpersonation, + &ImpersonationToken); + if (!NT_SUCCESS(Status)) + { + NtClose(ProcessToken); + return(Status); + } + + Status = NtSetInformationThread(NtCurrentThread(), + ThreadImpersonationToken, + &ImpersonationToken, + sizeof(HANDLE)); + NtClose(ImpersonationToken); + NtClose(ProcessToken); + + return(Status); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlAdjustPrivilege(IN ULONG Privilege, + IN BOOLEAN Enable, + IN BOOLEAN CurrentThread, + OUT PBOOLEAN Enabled) +{ + TOKEN_PRIVILEGES NewState; + TOKEN_PRIVILEGES OldState; + ULONG ReturnLength; + HANDLE TokenHandle; + NTSTATUS Status; + + DPRINT ("RtlAdjustPrivilege() called\n"); + + if (CurrentThread) + { + Status = NtOpenThreadToken (NtCurrentThread (), + TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, + FALSE, + &TokenHandle); + } + else + { + Status = NtOpenProcessToken (NtCurrentProcess (), + TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, + &TokenHandle); + } + + if (!NT_SUCCESS (Status)) + { + DPRINT1 ("Retrieving token handle failed (Status %lx)\n", Status); + return Status; + } + + OldState.PrivilegeCount = 1; + + NewState.PrivilegeCount = 1; + NewState.Privileges[0].Luid.LowPart = Privilege; + NewState.Privileges[0].Luid.HighPart = 0; + NewState.Privileges[0].Attributes = (Enable) ? SE_PRIVILEGE_ENABLED : 0; + + Status = NtAdjustPrivilegesToken (TokenHandle, + FALSE, + &NewState, + sizeof(TOKEN_PRIVILEGES), + &OldState, + &ReturnLength); + NtClose (TokenHandle); + if (Status == STATUS_NOT_ALL_ASSIGNED) + { + DPRINT1 ("Failed to assign all privileges\n"); + return STATUS_PRIVILEGE_NOT_HELD; + } + if (!NT_SUCCESS(Status)) + { + DPRINT1 ("NtAdjustPrivilegesToken() failed (Status %lx)\n", Status); + return Status; + } + + if (OldState.PrivilegeCount == 0) + { + *Enabled = Enable; + } + else + { + *Enabled = (OldState.Privileges[0].Attributes & SE_PRIVILEGE_ENABLED); + } + + DPRINT ("RtlAdjustPrivilege() done\n"); + + return STATUS_SUCCESS; +} + +/* EOF */ diff --git a/reactos/lib/rtl/sid.c b/reactos/lib/rtl/sid.c new file mode 100644 index 00000000000..10427eb302d --- /dev/null +++ b/reactos/lib/rtl/sid.c @@ -0,0 +1,353 @@ +/* $Id: sid.c,v 1.1 2004/05/31 19:29:02 gdalsnes Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * PURPOSE: Security manager + * FILE: lib/rtl/sid.c + * PROGRAMER: David Welch <welch@cwcom.net> + * REVISION HISTORY: + * 26/07/98: Added stubs for security functions + */ + +/* INCLUDES *****************************************************************/ + +#define __NTDRIVER__ +#include <ddk/ntddk.h> +#include <string.h> + + +#define NDEBUG +#include <debug.h> + +/* FUNCTIONS ***************************************************************/ + +BOOLEAN STDCALL +RtlValidSid(IN PSID Sid) +{ + if ((Sid->Revision & 0xf) != 1) + { + return(FALSE); + } + if (Sid->SubAuthorityCount > 15) + { + return(FALSE); + } + return(TRUE); +} + + +/* + * @implemented + */ +ULONG STDCALL +RtlLengthRequiredSid(IN UCHAR SubAuthorityCount) +{ + return(sizeof(SID) + (SubAuthorityCount - 1) * sizeof(ULONG)); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +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); +} + + +/* + * @implemented + */ +PULONG STDCALL +RtlSubAuthoritySid(IN PSID Sid, + IN ULONG SubAuthority) +{ + return(&Sid->SubAuthority[SubAuthority]); +} + + +/* + * @implemented + */ +PUCHAR STDCALL +RtlSubAuthorityCountSid(IN PSID Sid) +{ + return(&Sid->SubAuthorityCount); +} + + +/* + * @implemented + */ +BOOLEAN STDCALL +RtlEqualSid(IN PSID Sid1, + IN PSID Sid2) +{ + if (Sid1->Revision != Sid2->Revision) + { + return(FALSE); + } + if ((*RtlSubAuthorityCountSid(Sid1)) != (*RtlSubAuthorityCountSid(Sid2))) + { + return(FALSE); + } + if (RtlCompareMemory(Sid1, Sid2, RtlLengthSid(Sid1)) != 0) + { + return(FALSE); + } + return(TRUE); +} + + +/* + * @implemented + */ +ULONG STDCALL +RtlLengthSid(IN PSID Sid) +{ + return(sizeof(SID) + (Sid->SubAuthorityCount-1)*4); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlCopySid(ULONG BufferLength, + PSID Dest, + PSID Src) +{ + if (BufferLength < RtlLengthSid(Src)) + { + return(STATUS_UNSUCCESSFUL); + } + memmove(Dest, + Src, + RtlLengthSid(Src)); + return(STATUS_SUCCESS); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlCopySidAndAttributesArray(ULONG Count, + PSID_AND_ATTRIBUTES Src, + ULONG SidAreaSize, + PSID_AND_ATTRIBUTES Dest, + PVOID SidArea, + PVOID* RemainingSidArea, + PULONG RemainingSidAreaSize) +{ + ULONG SidLength; + ULONG Length; + ULONG i; + + Length = SidAreaSize; + + for (i=0; i<Count; i++) + { + if (RtlLengthSid(Src[i].Sid) > Length) + { + return(STATUS_BUFFER_TOO_SMALL); + } + SidLength = RtlLengthSid(Src[i].Sid); + Length = Length - SidLength; + Dest[i].Sid = SidArea; + Dest[i].Attributes = Src[i].Attributes; + RtlCopySid(SidLength, + SidArea, + Src[i].Sid); + SidArea = SidArea + SidLength; + } + *RemainingSidArea = SidArea; + *RemainingSidAreaSize = Length; + return(STATUS_SUCCESS); +} + + +/* + * @implemented + */ +PSID_IDENTIFIER_AUTHORITY STDCALL +RtlIdentifierAuthoritySid(IN PSID Sid) +{ + 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 +) +{ + PSID pSid; + + if (SubAuthorityCount > 8) + return STATUS_INVALID_SID; + + if (Sid == NULL) + return STATUS_INVALID_PARAMETER; + + pSid = (PSID)RtlAllocateHeap (RtlGetProcessHeap (), + 0, + SubAuthorityCount * sizeof(DWORD) + 8); + if (pSid == NULL) + return STATUS_NO_MEMORY; + + pSid->Revision = 1; + pSid->SubAuthorityCount = SubAuthorityCount; + memcpy (&pSid->IdentifierAuthority, + IdentifierAuthority, + sizeof(SID_IDENTIFIER_AUTHORITY)); + + switch (SubAuthorityCount) + { + case 8: + pSid->SubAuthority[7] = SubAuthority7; + case 7: + pSid->SubAuthority[6] = SubAuthority6; + case 6: + pSid->SubAuthority[5] = SubAuthority5; + case 5: + pSid->SubAuthority[4] = SubAuthority4; + case 4: + pSid->SubAuthority[3] = SubAuthority3; + case 3: + pSid->SubAuthority[2] = SubAuthority2; + case 2: + pSid->SubAuthority[1] = SubAuthority1; + case 1: + pSid->SubAuthority[0] = SubAuthority0; + break; + } + + *Sid = pSid; + + return STATUS_SUCCESS; +} + + +/* + * @implemented + */ +PSID STDCALL +RtlFreeSid(IN PSID Sid) +{ + RtlFreeHeap(RtlGetProcessHeap(), + 0, + Sid); + return(Sid); +} + + +/* + * @implemented + */ +BOOLEAN STDCALL +RtlEqualPrefixSid(IN PSID Sid1, + IN PSID Sid2) +{ + return(Sid1->SubAuthorityCount == Sid2->SubAuthorityCount && + !RtlCompareMemory(Sid1, Sid2, + (Sid1->SubAuthorityCount - 1) * sizeof(DWORD) + 8)); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlConvertSidToUnicodeString(PUNICODE_STRING String, + PSID Sid, + BOOLEAN AllocateBuffer) +{ + WCHAR Buffer[256]; + PWSTR wcs; + ULONG Length; + ULONG i; + + if (RtlValidSid (Sid) == FALSE) + return STATUS_INVALID_SID; + + wcs = Buffer; + wcs += swprintf (wcs, L"S-%u-", Sid->Revision); + if (Sid->IdentifierAuthority.Value[0] == 0 && + Sid->IdentifierAuthority.Value[1] == 0) + { + wcs += swprintf (wcs, + L"%lu", + (ULONG)Sid->IdentifierAuthority.Value[2] << 24 | + (ULONG)Sid->IdentifierAuthority.Value[3] << 16 | + (ULONG)Sid->IdentifierAuthority.Value[4] << 8 | + (ULONG)Sid->IdentifierAuthority.Value[5]); + } + else + { + wcs += swprintf (wcs, + L"0x%02hx%02hx%02hx%02hx%02hx%02hx", + Sid->IdentifierAuthority.Value[0], + Sid->IdentifierAuthority.Value[1], + Sid->IdentifierAuthority.Value[2], + Sid->IdentifierAuthority.Value[3], + Sid->IdentifierAuthority.Value[4], + Sid->IdentifierAuthority.Value[5]); + } + + for (i = 0; i < Sid->SubAuthorityCount; i++) + { + wcs += swprintf (wcs, + L"-%u", + Sid->SubAuthority[i]); + } + + Length = (wcs - Buffer) * sizeof(WCHAR); + if (AllocateBuffer) + { + String->Buffer = RtlAllocateHeap (RtlGetProcessHeap (), + 0, + Length + sizeof(WCHAR)); + if (String->Buffer == NULL) + return STATUS_NO_MEMORY; + String->MaximumLength = Length + sizeof(WCHAR); + } + else + { + if (Length > String->MaximumLength) + return STATUS_BUFFER_TOO_SMALL; + } + + String->Length = Length; + RtlCopyMemory (String->Buffer, + Buffer, + Length); + if (Length < String->MaximumLength) + String->Buffer[Length / sizeof(WCHAR)] = 0; + + return STATUS_SUCCESS; +} + +/* EOF */ diff --git a/reactos/lib/rtl/time.c b/reactos/lib/rtl/time.c new file mode 100644 index 00000000000..cc22ee5b230 --- /dev/null +++ b/reactos/lib/rtl/time.c @@ -0,0 +1,412 @@ +/* $Id: time.c,v 1.1 2004/05/31 19:29:02 gdalsnes Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: lib/rtl/time.c + * PURPOSE: Conversion between Time and TimeFields + * PROGRAMMER: Rex Jolliff (rex@lvcablemodem.com) + * UPDATE HISTORY: + * Created 22/05/98 + * 08/03/98 RJJ Implemented these functions + */ + +/* INCLUDES *****************************************************************/ + +#include <ddk/ntddk.h> +#include <ntdll/rtl.h> + +#define NDEBUG +#include <debug.h> + +#define TICKSPERMIN 600000000 +#define TICKSPERSEC 10000000 +#define TICKSPERMSEC 10000 +#define SECSPERDAY 86400 +#define SECSPERHOUR 3600 +#define SECSPERMIN 60 +#define MINSPERHOUR 60 +#define HOURSPERDAY 24 +#define EPOCHWEEKDAY 1 +#define DAYSPERWEEK 7 +#define EPOCHYEAR 1601 +#define DAYSPERNORMALYEAR 365 +#define DAYSPERLEAPYEAR 366 +#define MONSPERYEAR 12 + +#if defined(__GNUC__) +#define TICKSTO1970 0x019db1ded53e8000LL +#define TICKSTO1980 0x01a8e79fe1d58000LL +#else +#define TICKSTO1970 0x019db1ded53e8000i64 +#define TICKSTO1980 0x01a8e79fe1d58000i64 +#endif + + +static const int YearLengths[2] = + { + DAYSPERNORMALYEAR, DAYSPERLEAPYEAR + }; +static const int MonthLengths[2][MONSPERYEAR] = + { + { + 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 + }, + { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } + }; + +static __inline int IsLeapYear(int Year) +{ + return Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0) ? 1 : 0; +} + +static __inline void NormalizeTimeFields(CSHORT *FieldToNormalize, + CSHORT *CarryField, + int Modulus) +{ + *FieldToNormalize = (CSHORT) (*FieldToNormalize - Modulus); + *CarryField = (CSHORT) (*CarryField + 1); +} + +/* FUNCTIONS *****************************************************************/ + +/* + * @implemented + */ +BOOLEAN +STDCALL +RtlTimeFieldsToTime( + PTIME_FIELDS tfTimeFields, + PLARGE_INTEGER Time) +{ + int CurYear; + int CurMonth; +#if defined(__GNUC__) + + long long int rcTime; +#else + + __int64 rcTime; +#endif + + TIME_FIELDS TimeFields = *tfTimeFields; + + rcTime = 0; + + /* FIXME: normalize the TIME_FIELDS structure here */ + while (TimeFields.Second >= SECSPERMIN) + { + NormalizeTimeFields(&TimeFields.Second, + &TimeFields.Minute, + SECSPERMIN); + } + while (TimeFields.Minute >= MINSPERHOUR) + { + NormalizeTimeFields(&TimeFields.Minute, + &TimeFields.Hour, + MINSPERHOUR); + } + while (TimeFields.Hour >= HOURSPERDAY) + { + NormalizeTimeFields(&TimeFields.Hour, + &TimeFields.Day, + HOURSPERDAY); + } + while (TimeFields.Day > + MonthLengths[IsLeapYear(TimeFields.Year)][TimeFields.Month - 1]) + { + NormalizeTimeFields(&TimeFields.Day, + &TimeFields.Month, + SECSPERMIN); + } + while (TimeFields.Month > MONSPERYEAR) + { + NormalizeTimeFields(&TimeFields.Month, + &TimeFields.Year, + MONSPERYEAR); + } + + /* FIXME: handle calendar corrections here */ + for (CurYear = EPOCHYEAR; CurYear < TimeFields.Year; CurYear++) + { + rcTime += YearLengths[IsLeapYear(CurYear)]; + } + for (CurMonth = 1; CurMonth < TimeFields.Month; CurMonth++) + { + rcTime += MonthLengths[IsLeapYear(CurYear)][CurMonth - 1]; + } + rcTime += TimeFields.Day - 1; + rcTime *= SECSPERDAY; + rcTime += TimeFields.Hour * SECSPERHOUR + TimeFields.Minute * SECSPERMIN + + TimeFields.Second; + rcTime *= TICKSPERSEC; + rcTime += TimeFields.Milliseconds * TICKSPERMSEC; + *Time = *(LARGE_INTEGER *)&rcTime; + + return TRUE; +} + + + +/* + * @implemented + */ +VOID +STDCALL +RtlTimeToElapsedTimeFields(IN PLARGE_INTEGER Time, + OUT PTIME_FIELDS TimeFields) +{ + ULONGLONG ElapsedSeconds; + ULONG SecondsInDay; + ULONG SecondsInMinute; + + /* Extract millisecond from time */ + TimeFields->Milliseconds = (CSHORT)((Time->QuadPart % TICKSPERSEC) / TICKSPERMSEC); + + /* Compute elapsed seconds */ + ElapsedSeconds = (ULONGLONG)Time->QuadPart / TICKSPERSEC; + + /* Compute seconds within the day */ + SecondsInDay = ElapsedSeconds % SECSPERDAY; + + /* Compute elapsed minutes within the day */ + SecondsInMinute = SecondsInDay % SECSPERHOUR; + + /* Compute elapsed time of day */ + TimeFields->Hour = (CSHORT)(SecondsInDay / SECSPERHOUR); + TimeFields->Minute = (CSHORT)(SecondsInMinute / SECSPERMIN); + TimeFields->Second = (CSHORT)(SecondsInMinute % SECSPERMIN); + + /* Compute elapsed days */ + TimeFields->Day = (CSHORT)(ElapsedSeconds / SECSPERDAY); + + /* The elapsed number of months and days cannot be calculated */ + TimeFields->Month = 0; + TimeFields->Year = 0; +} + + + +/* + * @unimplemented + */ +VOID +STDCALL +RtlTimeToTimeFields( + PLARGE_INTEGER liTime, + PTIME_FIELDS TimeFields) +{ + const int *Months; + int LeapSecondCorrections, SecondsInDay, CurYear; + int LeapYear, CurMonth, GMTOffset; + long int Days; +#if defined(__GNUC__) + + long long int Time = (long long int)liTime->QuadPart; +#else + + __int64 Time = (__int64)liTime->QuadPart; +#endif + + /* Extract millisecond from time and convert time into seconds */ + TimeFields->Milliseconds = (CSHORT) ((Time % TICKSPERSEC) / TICKSPERMSEC); + Time = Time / TICKSPERSEC; + + /* FIXME: Compute the number of leap second corrections here */ + LeapSecondCorrections = 0; + + /* FIXME: get the GMT offset here */ + GMTOffset = 0; + + /* Split the time into days and seconds within the day */ + Days = Time / SECSPERDAY; + SecondsInDay = Time % SECSPERDAY; + + /* Adjust the values for GMT and leap seconds */ + SecondsInDay += (GMTOffset - LeapSecondCorrections); + while (SecondsInDay < 0) + { + SecondsInDay += SECSPERDAY; + Days--; + } + while (SecondsInDay >= SECSPERDAY) + { + SecondsInDay -= SECSPERDAY; + Days++; + } + + /* compute time of day */ + TimeFields->Hour = (CSHORT) (SecondsInDay / SECSPERHOUR); + SecondsInDay = SecondsInDay % SECSPERHOUR; + TimeFields->Minute = (CSHORT) (SecondsInDay / SECSPERMIN); + TimeFields->Second = (CSHORT) (SecondsInDay % SECSPERMIN); + + /* FIXME: handle the possibility that we are on a leap second (i.e. Second = 60) */ + + /* compute day of week */ + TimeFields->Weekday = (CSHORT) ((EPOCHWEEKDAY + Days) % DAYSPERWEEK); + + /* compute year */ + CurYear = EPOCHYEAR; + CurYear += Days / DAYSPERLEAPYEAR; + Days -= (CurYear - EPOCHYEAR) * DAYSPERLEAPYEAR; + CurYear--; /* The next calculation needs CurYear - 1 */ + Days += CurYear - CurYear / 4 + CurYear / 100 - CurYear / 400; + CurYear++; + Days -= EPOCHYEAR - 1 - (EPOCHYEAR -1) / 4 + (EPOCHYEAR -1) / 100 - (EPOCHYEAR - 1) / 400; + /* FIXME: handle calendar modifications */ + while (1) + { + LeapYear = IsLeapYear(CurYear); + if (Days < (long) YearLengths[LeapYear]) + { + break; + } + CurYear++; + Days = Days - (long) YearLengths[LeapYear]; + } + TimeFields->Year = (CSHORT) CurYear; + + /* Compute month of year */ + LeapYear = IsLeapYear(CurYear); + Months = MonthLengths[LeapYear]; + for (CurMonth = 0; Days >= (long) Months[CurMonth]; CurMonth++) + Days = Days - (long) Months[CurMonth]; + TimeFields->Month = (CSHORT) (CurMonth + 1); + TimeFields->Day = (CSHORT) (Days + 1); +} + + +/* + * @implemented + */ +BOOLEAN +STDCALL +RtlTimeToSecondsSince1970( + PLARGE_INTEGER Time, + PULONG SecondsSince1970) +{ + LARGE_INTEGER liTime; + + liTime.QuadPart = Time->QuadPart - TICKSTO1970; + liTime.QuadPart = liTime.QuadPart / TICKSPERSEC; + + if (liTime.u.HighPart != 0) + return FALSE; + + *SecondsSince1970 = liTime.u.LowPart; + + return TRUE; +} + + +/* + * @implemented + */ +BOOLEAN +STDCALL +RtlTimeToSecondsSince1980( + PLARGE_INTEGER Time, + PULONG SecondsSince1980) +{ + LARGE_INTEGER liTime; + + liTime.QuadPart = Time->QuadPart - TICKSTO1980; + liTime.QuadPart = liTime.QuadPart / TICKSPERSEC; + + if (liTime.u.HighPart != 0) + return FALSE; + + *SecondsSince1980 = liTime.u.LowPart; + + return TRUE; +} + + +/* + * @implemented + */ +NTSTATUS +STDCALL +RtlLocalTimeToSystemTime(PLARGE_INTEGER LocalTime, + PLARGE_INTEGER SystemTime) +{ + SYSTEM_TIMEOFDAY_INFORMATION TimeInformation; + NTSTATUS Status; + + Status = NtQuerySystemInformation(SystemTimeOfDayInformation, + &TimeInformation, + sizeof(SYSTEM_TIMEOFDAY_INFORMATION), + NULL); + if (!NT_SUCCESS(Status)) + return(Status); + + SystemTime->QuadPart = LocalTime->QuadPart + + TimeInformation.TimeZoneBias.QuadPart; + + return(STATUS_SUCCESS); +} + + + + +/* + * @implemented + */ +NTSTATUS +STDCALL +RtlSystemTimeToLocalTime(PLARGE_INTEGER SystemTime, + PLARGE_INTEGER LocalTime) +{ + SYSTEM_TIMEOFDAY_INFORMATION TimeInformation; + NTSTATUS Status; + + Status = NtQuerySystemInformation(SystemTimeOfDayInformation, + &TimeInformation, + sizeof(SYSTEM_TIMEOFDAY_INFORMATION), + NULL); + if (!NT_SUCCESS(Status)) + return(Status); + + LocalTime->QuadPart = SystemTime->QuadPart - + TimeInformation.TimeZoneBias.QuadPart; + + return(STATUS_SUCCESS); +} + + +/* + * @implemented + */ +VOID +STDCALL +RtlSecondsSince1970ToTime( + ULONG SecondsSince1970, + PLARGE_INTEGER Time) +{ + LONGLONG llTime; + + llTime = (SecondsSince1970 * TICKSPERSEC) + TICKSTO1970; + + *Time = *(LARGE_INTEGER *)&llTime; +} + + +/* + * @implemented + */ +VOID +STDCALL +RtlSecondsSince1980ToTime( + ULONG SecondsSince1980, + PLARGE_INTEGER Time) +{ + LONGLONG llTime; + + llTime = (SecondsSince1980 * TICKSPERSEC) + TICKSTO1980; + + *Time = *(LARGE_INTEGER *)&llTime; +} + + + +/* EOF */ diff --git a/reactos/lib/rtl/timezone.c b/reactos/lib/rtl/timezone.c new file mode 100644 index 00000000000..b65c47d65a0 --- /dev/null +++ b/reactos/lib/rtl/timezone.c @@ -0,0 +1,175 @@ +/* $Id: timezone.c,v 1.1 2004/05/31 19:29:02 gdalsnes Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * PURPOSE: Timezone functions + * FILE: lib/rtl/timezone.c + * PROGRAMER: Eric Kohl + * REVISION HISTORY: + * 29/05/2001: Created + */ + +/* INCLUDES *****************************************************************/ + +#include <ddk/ntddk.h> +#include <ntos/registry.h> +#include <ntos/time.h> + +#define NDEBUG +#include <debug.h> + + +/* FUNCTIONS *****************************************************************/ + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlQueryTimeZoneInformation(PTIME_ZONE_INFORMATION TimeZoneInformation) +{ + RTL_QUERY_REGISTRY_TABLE QueryTable[8]; + UNICODE_STRING StandardName; + UNICODE_STRING DaylightName; + NTSTATUS Status; + + DPRINT("RtlQueryTimeZoneInformation()\n"); + + RtlZeroMemory(QueryTable, + sizeof(QueryTable)); + + StandardName.Length = 0; + StandardName.MaximumLength = 32 * sizeof(WCHAR); + StandardName.Buffer = TimeZoneInformation->StandardName; + + DaylightName.Length = 0; + DaylightName.MaximumLength = 32 * sizeof(WCHAR); + DaylightName.Buffer = TimeZoneInformation->DaylightName; + + QueryTable[0].Name = L"Bias"; + QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT; + QueryTable[0].EntryContext = &TimeZoneInformation->Bias; + + QueryTable[1].Name = L"Standard Name"; + QueryTable[1].Flags = RTL_QUERY_REGISTRY_DIRECT; + QueryTable[1].EntryContext = &StandardName; + + QueryTable[2].Name = L"Standard Bias"; + QueryTable[2].Flags = RTL_QUERY_REGISTRY_DIRECT; + QueryTable[2].EntryContext = &TimeZoneInformation->StandardBias; + + QueryTable[3].Name = L"Standard Start"; + QueryTable[3].Flags = RTL_QUERY_REGISTRY_DIRECT; + QueryTable[3].EntryContext = &TimeZoneInformation->StandardDate; + + QueryTable[4].Name = L"Daylight Name"; + QueryTable[4].Flags = RTL_QUERY_REGISTRY_DIRECT; + QueryTable[4].EntryContext = &DaylightName; + + QueryTable[5].Name = L"Daylight Bias"; + QueryTable[5].Flags = RTL_QUERY_REGISTRY_DIRECT; + QueryTable[5].EntryContext = &TimeZoneInformation->DaylightBias; + + QueryTable[6].Name = L"Daylight Start"; + QueryTable[6].Flags = RTL_QUERY_REGISTRY_DIRECT; + QueryTable[6].EntryContext = &TimeZoneInformation->DaylightDate; + + Status = RtlQueryRegistryValues(RTL_REGISTRY_CONTROL, + L"TimeZoneInformation", + QueryTable, + NULL, + NULL); + + return Status; +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlSetTimeZoneInformation(PTIME_ZONE_INFORMATION TimeZoneInformation) +{ + ULONG Length; + NTSTATUS Status; + + DPRINT("RtlSetTimeZoneInformation()\n"); + + Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL, + L"TimeZoneInformation", + L"Bias", + REG_DWORD, + &TimeZoneInformation->Bias, + sizeof(LONG)); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + Length = (wcslen(TimeZoneInformation->StandardName) + 1) * sizeof(WCHAR); + Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL, + L"TimeZoneInformation", + L"Standard Name", + REG_SZ, + TimeZoneInformation->StandardName, + Length); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL, + L"TimeZoneInformation", + L"Standard Bias", + REG_DWORD, + &TimeZoneInformation->StandardBias, + sizeof(LONG)); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL, + L"TimeZoneInformation", + L"Standard Start", + REG_BINARY, + &TimeZoneInformation->StandardDate, + sizeof(SYSTEMTIME)); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + Length = (wcslen(TimeZoneInformation->DaylightName) + 1) * sizeof(WCHAR); + Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL, + L"TimeZoneInformation", + L"Daylight Name", + REG_SZ, + TimeZoneInformation->DaylightName, + Length); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL, + L"TimeZoneInformation", + L"Daylight Bias", + REG_DWORD, + &TimeZoneInformation->DaylightBias, + sizeof(LONG)); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL, + L"TimeZoneInformation", + L"Daylight Start", + REG_BINARY, + &TimeZoneInformation->DaylightDate, + sizeof(SYSTEMTIME)); + + return Status; +} + +/* EOF */ diff --git a/reactos/lib/rtl/unicode.c b/reactos/lib/rtl/unicode.c new file mode 100644 index 00000000000..83ee674408c --- /dev/null +++ b/reactos/lib/rtl/unicode.c @@ -0,0 +1,2498 @@ +/* + * Rtl string functions + * + * Copyright (C) 1996-1998 Marcus Meissner + * Copyright (C) 2000 Alexandre Julliard + * Copyright (C) 2003 Thomas Mertes + * + * 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 __NTDRIVER__ +#include <ddk/ntddk.h> + +#include <ntdll/rtl.h> + +#include <ntos/minmax.h> +#include <ctype.h> + +#define NDEBUG +#include <debug.h> + +/* GLOBALS *******************************************************************/ + +#define TAG_USTR TAG('U', 'S', 'T', 'R') +#define TAG_ASTR TAG('A', 'S', 'T', 'R') +#define TAG_OSTR TAG('O', 'S', 'T', 'R') + + +extern BOOLEAN NlsMbCodePageTag; +extern BOOLEAN NlsMbOemCodePageTag; + +/* FUNCTIONS *****************************************************************/ + + + +WCHAR STDCALL +RtlAnsiCharToUnicodeChar (IN CHAR AnsiChar) +{ + ULONG Size; + WCHAR UnicodeChar; + + Size = 1; +#if 0 + + Size = (NlsLeadByteInfo[AnsiChar] == 0) ? 1 : 2; +#endif + + RtlMultiByteToUnicodeN (&UnicodeChar, + sizeof(WCHAR), + NULL, + &AnsiChar, + Size); + + return UnicodeChar; +} + + +/* + * @implemented + * + * RETURNS + * The calculated size in bytes including nullterm. + */ +ULONG +STDCALL +RtlAnsiStringToUnicodeSize(IN PANSI_STRING AnsiString) +{ + ULONG Size; + + RtlMultiByteToUnicodeSize(&Size, + AnsiString->Buffer, + AnsiString->Length); + + return(Size); +} + + + +/* + * @implemented + * + * NOTES + * If src->length is zero dest is unchanged. + * Dest is never nullterminated. + */ +NTSTATUS +STDCALL +RtlAppendStringToString(IN OUT PSTRING Destination, + IN PSTRING Source) +{ + PCHAR Ptr; + + if (Source->Length == 0) + return(STATUS_SUCCESS); + + if (Destination->Length + Source->Length >= Destination->MaximumLength) + return(STATUS_BUFFER_TOO_SMALL); + + Ptr = Destination->Buffer + Destination->Length; + memmove(Ptr, + Source->Buffer, + Source->Length); + Ptr += Source->Length; + *Ptr = 0; + + Destination->Length += Source->Length; + + return(STATUS_SUCCESS); +} + + + +/* + * @implemented + * + * NOTES + * If src->length is zero dest is unchanged. + * Dest is nullterminated when the MaximumLength allowes it. + * When dest fits exactly in MaximumLength characters the nullterm is ommitted. + */ +NTSTATUS +STDCALL +RtlAppendUnicodeStringToString( + IN OUT PUNICODE_STRING Destination, + IN PUNICODE_STRING Source) +{ + + if ((Source->Length + Destination->Length) > Destination->MaximumLength) + return STATUS_BUFFER_TOO_SMALL; + + memcpy((char*)Destination->Buffer + Destination->Length, Source->Buffer, Source->Length); + Destination->Length += Source->Length; + /* append terminating '\0' if enough space */ + if( Destination->MaximumLength > Destination->Length ) + Destination->Buffer[Destination->Length / sizeof(WCHAR)] = 0; + + return STATUS_SUCCESS; +} + + +/* + * @implemented + */ +NTSTATUS +STDCALL +RtlCharToInteger( + IN PCSZ String, + IN ULONG Base, + IN OUT PULONG Value) +{ + ULONG Val; + + *Value = 0; + + if (Base == 0) + { + Base = 10; + if (*String == '0') + { + Base = 8; + String++; + if ((*String == 'x') && isxdigit (String[1])) + { + String++; + Base = 16; + } + } + } + + if (!isxdigit (*String)) + return STATUS_INVALID_PARAMETER; + + while (isxdigit (*String) && + (Val = isdigit (*String) ? * String - '0' : (islower (*String) + ? toupper (*String) : *String) - 'A' + 10) < Base) + { + *Value = *Value * Base + Val; + String++; + } + + return STATUS_SUCCESS; +} + + + +/* + * @implemented + */ +LONG +STDCALL +RtlCompareString( + IN PSTRING String1, + IN PSTRING String2, + IN BOOLEAN CaseInsensitive) +{ + ULONG len1, len2; + PCHAR s1, s2; + CHAR c1, c2; + + if (String1 && String2) + { + len1 = String1->Length; + len2 = String2->Length; + s1 = String1->Buffer; + s2 = String2->Buffer; + + if (s1 && s2) + { + if (CaseInsensitive) + { + while (1) + { + c1 = len1-- ? RtlUpperChar (*s1++) : 0; + c2 = len2-- ? RtlUpperChar (*s2++) : 0; + if (!c1 || !c2 || c1 != c2) + return c1 - c2; + } + } + else + { + while (1) + { + c1 = len1-- ? *s1++ : 0; + c2 = len2-- ? *s2++ : 0; + if (!c1 || !c2 || c1 != c2) + return c1 - c2; + } + } + } + } + + return 0; +} + + +/* + * @implemented + * + * RETURNS + * TRUE if strings are equal. + */ +BOOLEAN +STDCALL +RtlEqualString( + IN PSTRING String1, + IN PSTRING String2, + IN BOOLEAN CaseInsensitive) +{ + ULONG i; + CHAR c1, c2; + PCHAR p1, p2; + + if (String1->Length != String2->Length) + return FALSE; + + p1 = String1->Buffer; + p2 = String2->Buffer; + for (i = 0; i < String1->Length; i++) + { + if (CaseInsensitive == TRUE) + { + c1 = RtlUpperChar (*p1); + c2 = RtlUpperChar (*p2); + } + else + { + c1 = *p1; + c2 = *p2; + } + + if (c1 != c2) + return FALSE; + + p1++; + p2++; + } + + return TRUE; +} + + +/* + * @implemented + * + * RETURNS + * TRUE if strings are equal. + */ +BOOLEAN +STDCALL +RtlEqualUnicodeString( + IN PUNICODE_STRING String1, + IN PUNICODE_STRING String2, + IN BOOLEAN CaseInsensitive) +{ + ULONG i; + WCHAR wc1, wc2; + PWCHAR pw1, pw2; + + if (String1->Length != String2->Length) + return FALSE; + + pw1 = String1->Buffer; + pw2 = String2->Buffer; + + for (i = 0; i < String1->Length / sizeof(WCHAR); i++) + { + if (CaseInsensitive == TRUE) + { + wc1 = RtlUpcaseUnicodeChar (*pw1); + wc2 = RtlUpcaseUnicodeChar (*pw2); + } + else + { + wc1 = *pw1; + wc2 = *pw2; + } + + if (wc1 != wc2) + return FALSE; + + pw1++; + pw2++; + } + + return TRUE; +} + + +/* + * @implemented + */ +VOID +STDCALL +RtlFreeAnsiString(IN PANSI_STRING AnsiString) +{ + if (AnsiString->Buffer == NULL) + return; + + ExFreePool(AnsiString->Buffer); + + AnsiString->Buffer = NULL; + AnsiString->Length = 0; + AnsiString->MaximumLength = 0; +} + + +/* + * @implemented + */ +VOID +STDCALL +RtlFreeOemString(IN POEM_STRING OemString) +{ + if (OemString->Buffer == NULL) + return; + + ExFreePool(OemString->Buffer); + + OemString->Buffer = NULL; + OemString->Length = 0; + OemString->MaximumLength = 0; +} + + +/* + * @implemented + */ +VOID +STDCALL +RtlFreeUnicodeString(IN PUNICODE_STRING UnicodeString) +{ + if (UnicodeString->Buffer == NULL) + return; + + ExFreePool(UnicodeString->Buffer); + + UnicodeString->Buffer = NULL; + UnicodeString->Length = 0; + UnicodeString->MaximumLength = 0; +} + + +/* + * @implemented + * + * NOTES + * If source is NULL the length of source is assumed to be 0. + */ +VOID +STDCALL +RtlInitAnsiString(IN OUT PANSI_STRING DestinationString, + IN PCSZ SourceString) +{ + ULONG DestSize; + + if (SourceString == NULL) + { + DestinationString->Length = 0; + DestinationString->MaximumLength = 0; + } + else + { + DestSize = strlen ((const char *)SourceString); + DestinationString->Length = DestSize; + DestinationString->MaximumLength = DestSize + sizeof(CHAR); + } + DestinationString->Buffer = (PCHAR)SourceString; +} + + + +/* + * @implemented + * + * NOTES + * If source is NULL the length of source is assumed to be 0. + */ +VOID +STDCALL +RtlInitString( + IN OUT PSTRING DestinationString, + IN PCSZ SourceString) +{ + ULONG DestSize; + + if (SourceString == NULL) + { + DestinationString->Length = 0; + DestinationString->MaximumLength = 0; + } + else + { + DestSize = strlen((const char *)SourceString); + DestinationString->Length = DestSize; + DestinationString->MaximumLength = DestSize + sizeof(CHAR); + } + DestinationString->Buffer = (PCHAR)SourceString; +} + + +/* + * @implemented + * + * NOTES + * If source is NULL the length of source is assumed to be 0. + */ +VOID +STDCALL +RtlInitUnicodeString(IN OUT PUNICODE_STRING DestinationString, + IN PCWSTR SourceString) +{ + ULONG DestSize; + + DPRINT("RtlInitUnicodeString(DestinationString %x, SourceString %x)\n", + DestinationString, + SourceString); + + if (SourceString == NULL) + { + DestinationString->Length = 0; + DestinationString->MaximumLength = 0; + } + else + { + DestSize = wcslen((PWSTR)SourceString) * sizeof(WCHAR); + DestinationString->Length = DestSize; + DestinationString->MaximumLength = DestSize + sizeof(WCHAR); + } + DestinationString->Buffer = (PWSTR)SourceString; +} + + + +/* + * @implemented + * + * NOTES + * Writes at most length characters to the string str. + * Str is nullterminated when length allowes it. + * When str fits exactly in length characters the nullterm is ommitted. + */ +NTSTATUS +STDCALL +RtlIntegerToChar( + IN ULONG Value, + IN ULONG Base, + IN ULONG Length, + IN OUT PCHAR String) +{ + ULONG Radix; + CHAR temp[33]; + ULONG v = Value; + ULONG i; + PCHAR tp; + PCHAR sp; + + Radix = Base; + if (Radix == 0) + Radix = 10; + + if ((Radix != 2) && (Radix != 8) && + (Radix != 10) && (Radix != 16)) + return STATUS_INVALID_PARAMETER; + + tp = temp; + while (v || tp == temp) + { + i = v % Radix; + v = v / Radix; + if (i < 10) + *tp = i + '0'; + else + *tp = i + 'a' - 10; + tp++; + } + + if (tp - temp >= Length) + return STATUS_BUFFER_TOO_SMALL; + + sp = String; + while (tp > temp) + *sp++ = *--tp; + *sp = 0; + + return STATUS_SUCCESS; +} + + + +/* + * @implemented + */ +NTSTATUS +STDCALL +RtlIntegerToUnicodeString( + IN ULONG Value, + IN ULONG Base, /* optional */ + IN OUT PUNICODE_STRING String) +{ + ANSI_STRING AnsiString; + CHAR Buffer[33]; + NTSTATUS Status; + + Status = RtlIntegerToChar (Value, + Base, + 33, + Buffer); + if (!NT_SUCCESS(Status)) + return Status; + + AnsiString.Buffer = Buffer; + AnsiString.Length = strlen (Buffer); + AnsiString.MaximumLength = 33; + + Status = RtlAnsiStringToUnicodeString (String, + &AnsiString, + FALSE); + + return Status; +} + + +/* + * @implemented + * + * RETURNS + * TRUE if String2 contains String1 as a prefix. + */ +BOOLEAN +STDCALL +RtlPrefixString( + PANSI_STRING String1, + PANSI_STRING String2, + BOOLEAN CaseInsensitive) +{ + PCHAR pc1; + PCHAR pc2; + ULONG Length; + + if (String2->Length < String1->Length) + return FALSE; + + Length = String1->Length; + pc1 = String1->Buffer; + pc2 = String2->Buffer; + + if (pc1 && pc2) + { + if (CaseInsensitive) + { + while (Length--) + { + if (RtlUpperChar (*pc1++) != RtlUpperChar (*pc2++)) + return FALSE; + } + } + else + { + while (Length--) + { + if (*pc1++ != *pc2++) + return FALSE; + } + } + return TRUE; + } + return FALSE; +} + + +/* + * @implemented + * + * RETURNS + * TRUE if String2 contains String1 as a prefix. + */ +BOOLEAN +STDCALL +RtlPrefixUnicodeString( + PUNICODE_STRING String1, + PUNICODE_STRING String2, + BOOLEAN CaseInsensitive) +{ + PWCHAR pc1; + PWCHAR pc2; + ULONG Length; + + if (String2->Length < String1->Length) + return FALSE; + + Length = String1->Length / 2; + pc1 = String1->Buffer; + pc2 = String2->Buffer; + + if (pc1 && pc2) + { + if (CaseInsensitive) + { + while (Length--) + { + if (RtlUpcaseUnicodeChar (*pc1++) + != RtlUpcaseUnicodeChar (*pc2++)) + return FALSE; + } + } + else + { + while (Length--) + { + if( *pc1++ != *pc2++ ) + return FALSE; + } + } + return TRUE; + } + return FALSE; +} + + + +/* + * @implemented + */ +NTSTATUS +STDCALL +RtlUnicodeStringToInteger( + IN PUNICODE_STRING String, + IN ULONG Base, + OUT PULONG Value) +{ + PWCHAR Str; + ULONG lenmin = 0; + ULONG i; + ULONG Val; + BOOLEAN addneg = FALSE; + + *Value = 0; + Str = String->Buffer; + + for (i = 0; i < String->Length / sizeof(WCHAR); i++) + { + if (*Str == L'b') + { + Base = 2; + lenmin++; + } + else if (*Str == L'o') + { + Base = 8; + lenmin++; + } + else if (*Str == L'd') + { + Base = 10; + lenmin++; + } + else if (*Str == L'x') + { + Base = 16; + lenmin++; + } + else if (*Str == L'+') + { + lenmin++; + } + else if (*Str == L'-') + { + addneg = TRUE; + lenmin++; + } + else if ((*Str > L'1') && (Base == 2)) + { + return STATUS_INVALID_PARAMETER; + } + else if (((*Str > L'7') || (*Str < L'0')) && (Base == 8)) + { + return STATUS_INVALID_PARAMETER; + } + else if (((*Str > L'9') || (*Str < L'0')) && (Base == 10)) + { + return STATUS_INVALID_PARAMETER; + } + else if ( ((*Str > L'9') || (*Str < L'0')) && + ((towupper (*Str) > L'F') || (towupper (*Str) < L'A')) && + (Base == 16)) + { + return STATUS_INVALID_PARAMETER; + } + Str++; + } + + Str = String->Buffer + lenmin; + + if (Base == 0) + Base = 10; + + while (iswxdigit (*Str) && + (Val = iswdigit (*Str) ? *Str - L'0' : (iswlower (*Str) + ? towupper (*Str) : *Str) - L'A' + 10) < Base) + { + *Value = *Value * Base + Val; + Str++; + } + + if (addneg == TRUE) + *Value *= -1; + + return STATUS_SUCCESS; +} + + + +/* + * @implemented + * + * RETURNS + * Bytes necessary for the conversion including nullterm. + */ +ULONG +STDCALL +RtlUnicodeStringToOemSize( + IN PUNICODE_STRING UnicodeString) +{ + ULONG Size; + + RtlUnicodeToMultiByteSize (&Size, + UnicodeString->Buffer, + UnicodeString->Length); + + return Size+1; //NB: incl. nullterm +} + + +/* + * @implemented + * + + * NOTES + * See RtlpUnicodeStringToAnsiString + */ +NTSTATUS +STDCALL +RtlUnicodeStringToAnsiString( + IN OUT PANSI_STRING AnsiDest, + IN PUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString) +{ + return RtlpUnicodeStringToAnsiString( + AnsiDest, + UniSource, + AllocateDestinationString, + NonPagedPool); +} + + +/* + * private + * + * NOTES + * This function always writes a terminating '\0'. + * It performs a partial copy if ansi is too small. + */ +NTSTATUS +FASTCALL +RtlpUnicodeStringToAnsiString( + IN OUT PANSI_STRING AnsiDest, + IN PUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString, + IN POOL_TYPE PoolType) +{ + NTSTATUS Status = STATUS_SUCCESS; + ULONG Length; //including nullterm + + if (NlsMbCodePageTag == TRUE) + { + Length = RtlUnicodeStringToAnsiSize(UniSource); + } + else + Length = (UniSource->Length / sizeof(WCHAR)) + sizeof(CHAR); + + AnsiDest->Length = Length - sizeof(CHAR); + + if (AllocateDestinationString) + { + AnsiDest->Buffer = ExAllocatePoolWithTag(PoolType, Length, TAG_ASTR); + if (AnsiDest->Buffer == NULL) + return STATUS_NO_MEMORY; + + AnsiDest->MaximumLength = Length; + } + else if (AnsiDest->MaximumLength == 0) + { + return STATUS_BUFFER_TOO_SMALL; + } + else if (Length > AnsiDest->MaximumLength) + { + //make room for nullterm + AnsiDest->Length = AnsiDest->MaximumLength - sizeof(CHAR); + } + + Status = RtlUnicodeToMultiByteN (AnsiDest->Buffer, + AnsiDest->Length, + NULL, + UniSource->Buffer, + UniSource->Length); + + if (!NT_SUCCESS(Status) && AllocateDestinationString) + { + ExFreePool (AnsiDest->Buffer); + return Status; + } + + AnsiDest->Buffer[AnsiDest->Length] = 0; + return Status; +} + + +/* + * @implemented + * + * NOTES + * See RtlpOemStringToUnicodeString + */ +NTSTATUS +STDCALL +RtlOemStringToUnicodeString( + IN OUT PUNICODE_STRING UniDest, + IN POEM_STRING OemSource, + IN BOOLEAN AllocateDestinationString) +{ + return RtlpOemStringToUnicodeString( + UniDest, + OemSource, + AllocateDestinationString, + NonPagedPool); +} + + +/* + * private + * + * NOTES + * This function always writes a terminating '\0'. + * Does NOT perform a partial copy if unicode is too small! + */ +NTSTATUS +FASTCALL +RtlpOemStringToUnicodeString( + IN OUT PUNICODE_STRING UniDest, + IN POEM_STRING OemSource, + IN BOOLEAN AllocateDestinationString, + IN POOL_TYPE PoolType) +{ + NTSTATUS Status; + ULONG Length; //including nullterm + + if (NlsMbOemCodePageTag == TRUE) + Length = RtlOemStringToUnicodeSize(OemSource); + else + Length = (OemSource->Length * sizeof(WCHAR)) + sizeof(WCHAR); + + if (Length > 0xffff) + return STATUS_INVALID_PARAMETER_2; + + UniDest->Length = (WORD)(Length - sizeof(WCHAR)); + + if (AllocateDestinationString) + { + UniDest->Buffer = ExAllocatePoolWithTag(PoolType, Length, TAG_USTR); + if (UniDest->Buffer == NULL) + return STATUS_NO_MEMORY; + + UniDest->MaximumLength = Length; + } + else if (Length > UniDest->MaximumLength) + { + DPRINT("STATUS_BUFFER_TOO_SMALL\n"); + return STATUS_BUFFER_TOO_SMALL; + } + + //FIXME: Do we need this????? -Gunnar + RtlZeroMemory (UniDest->Buffer, + UniDest->Length); + + Status = RtlOemToUnicodeN (UniDest->Buffer, + UniDest->Length, + NULL, + OemSource->Buffer, + OemSource->Length); + + if (!NT_SUCCESS(Status) && AllocateDestinationString) + { + ExFreePool (UniDest->Buffer); + return Status; + } + + UniDest->Buffer[UniDest->Length / sizeof(WCHAR)] = 0; + return STATUS_SUCCESS; +} + + +/* + * @implemented + * + * NOTES + * See RtlpUnicodeStringToOemString. + */ +NTSTATUS +STDCALL +RtlUnicodeStringToOemString( + IN OUT POEM_STRING OemDest, + IN PUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString) +{ + return RtlpUnicodeStringToOemString( + OemDest, + UniSource, + AllocateDestinationString, + NonPagedPool); +} + + + +/* + * private + * + * NOTES + * This function always '\0' terminates the string returned. + */ +NTSTATUS +FASTCALL +RtlpUnicodeStringToOemString( + IN OUT POEM_STRING OemDest, + IN PUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString, + IN POOL_TYPE PoolType) +{ + NTSTATUS Status = STATUS_SUCCESS; + ULONG Length; //including nullterm + + if (NlsMbOemCodePageTag == TRUE) + Length = RtlUnicodeStringToAnsiSize (UniSource); + else + Length = (UniSource->Length / sizeof(WCHAR)) + sizeof(CHAR); + + if (Length > 0x0000FFFF) + return STATUS_INVALID_PARAMETER_2; + + OemDest->Length = (WORD)(Length - sizeof(CHAR)); + + if (AllocateDestinationString) + { + OemDest->Buffer = ExAllocatePoolWithTag(PoolType, Length, TAG_OSTR); + if (OemDest->Buffer == NULL) + return STATUS_NO_MEMORY; + + OemDest->MaximumLength = Length; + } + else if (OemDest->MaximumLength == 0) + { + return STATUS_BUFFER_TOO_SMALL; + } + else if (Length > OemDest->MaximumLength) + { + //make room for nullterm + OemDest->Length = OemDest->MaximumLength - sizeof(CHAR); + } + + Status = RtlUnicodeToOemN (OemDest->Buffer, + OemDest->Length, + NULL, + UniSource->Buffer, + UniSource->Length); + + if (!NT_SUCCESS(Status) && AllocateDestinationString) + { + ExFreePool(OemDest->Buffer); + return Status; + } + + OemDest->Buffer[OemDest->Length] = 0; + return Status; +} + + + +#define ITU_IMPLEMENTED_TESTS (IS_TEXT_UNICODE_ODD_LENGTH|IS_TEXT_UNICODE_SIGNATURE) + + +/* + * @implemented + * + * RETURNS + * The length of the string if all tests were passed, 0 otherwise. + */ +ULONG STDCALL +RtlIsTextUnicode (PVOID Buffer, + ULONG Length, + ULONG *Flags) +{ + PWSTR s = Buffer; + ULONG in_flags = (ULONG)-1; + ULONG out_flags = 0; + + if (Length == 0) + goto done; + + if (Flags != 0) + in_flags = *Flags; + + /* + * Apply various tests to the text string. According to the + * docs, each test "passed" sets the corresponding flag in + * the output flags. But some of the tests are mutually + * exclusive, so I don't see how you could pass all tests ... + */ + + /* Check for an odd length ... pass if even. */ + if (!(Length & 1)) + out_flags |= IS_TEXT_UNICODE_ODD_LENGTH; + + /* Check for the BOM (byte order mark). */ + if (*s == 0xFEFF) + out_flags |= IS_TEXT_UNICODE_SIGNATURE; + +#if 0 + /* Check for the reverse BOM (byte order mark). */ + if (*s == 0xFFFE) + out_flags |= IS_TEXT_UNICODE_REVERSE_SIGNATURE; +#endif + + /* FIXME: Add more tests */ + + /* + * Check whether the string passed all of the tests. + */ + in_flags &= ITU_IMPLEMENTED_TESTS; + if ((out_flags & in_flags) != in_flags) + Length = 0; + +done: + if (Flags != 0) + *Flags = out_flags; + + return Length; +} + + +/* + * @implemented + * + * NOTES + * See RtlpOemStringToCountedUnicodeString + */ +NTSTATUS +STDCALL +RtlOemStringToCountedUnicodeString( + IN OUT PUNICODE_STRING UniDest, + IN POEM_STRING OemSource, + IN BOOLEAN AllocateDestinationString) +{ + return RtlpOemStringToCountedUnicodeString( + UniDest, + OemSource, + AllocateDestinationString, + NonPagedPool); +} + + +/* + * private + * + + * NOTES + * Same as RtlOemStringToUnicodeString but doesn't write terminating null + * A partial copy is NOT performed if the dest buffer is too small! + */ +NTSTATUS +FASTCALL +RtlpOemStringToCountedUnicodeString( + IN OUT PUNICODE_STRING UniDest, + IN POEM_STRING OemSource, + IN BOOLEAN AllocateDestinationString, + IN POOL_TYPE PoolType) +{ + NTSTATUS Status; + ULONG Length; //excluding nullterm + + if (NlsMbCodePageTag == TRUE) + Length = RtlOemStringToUnicodeSize(OemSource) - sizeof(WCHAR); + else + Length = OemSource->Length * sizeof(WCHAR); + + if (Length > 65535) + return STATUS_INVALID_PARAMETER_2; + + if (AllocateDestinationString == TRUE) + { + UniDest->Buffer = ExAllocatePoolWithTag (PoolType, Length, TAG_USTR); + if (UniDest->Buffer == NULL) + return STATUS_NO_MEMORY; + + UniDest->MaximumLength = Length; + } + else if (Length > UniDest->MaximumLength) + { + return STATUS_BUFFER_TOO_SMALL; + } + + UniDest->Length = Length; + + Status = RtlOemToUnicodeN (UniDest->Buffer, + UniDest->Length, + NULL, + OemSource->Buffer, + OemSource->Length); + + if (!NT_SUCCESS(Status) && AllocateDestinationString) + { + ExFreePool (UniDest->Buffer); + return Status; + } + + return Status; +} + + +//FIXME: sjekk returnverdi og returtype. Wine koflikter mht. returtype for EqualString og EqualComputer--- +/* + * @implemented + * + * RETURNS + * 0 if the names are equal, non-zero otherwise. + * + * NOTES + * The comparison is case insensitive. + */ +BOOLEAN +STDCALL +RtlEqualComputerName( + IN PUNICODE_STRING ComputerName1, + IN PUNICODE_STRING ComputerName2) +{ + OEM_STRING OemString1; + OEM_STRING OemString2; + BOOLEAN Result = FALSE; + + if (NT_SUCCESS(RtlUpcaseUnicodeStringToOemString( &OemString1, ComputerName1, TRUE ))) + { + if (NT_SUCCESS(RtlUpcaseUnicodeStringToOemString( &OemString2, ComputerName2, TRUE ))) + { + Result = RtlEqualString( &OemString1, &OemString2, FALSE ); + RtlFreeOemString( &OemString2 ); + } + RtlFreeOemString( &OemString1 ); + } + + 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. + * + * NOTES + * The comparison is case insensitive. + */ +BOOLEAN +STDCALL +RtlEqualDomainName ( + IN PUNICODE_STRING DomainName1, + IN PUNICODE_STRING DomainName2 +) +{ + return RtlEqualComputerName(DomainName1, DomainName2); +} + + +/* + * @implemented + */ +/* +BOOLEAN +STDCALL +RtlEqualDomainName ( + IN PUNICODE_STRING DomainName1, + IN PUNICODE_STRING DomainName2 +) +{ + OEM_STRING OemString1; + OEM_STRING OemString2; + BOOLEAN Result; + + RtlUpcaseUnicodeStringToOemString (&OemString1, + DomainName1, + TRUE); + RtlUpcaseUnicodeStringToOemString (&OemString2, + DomainName2, + TRUE); + + Result = RtlEqualString (&OemString1, + &OemString2, + FALSE); + + RtlFreeOemString (&OemString1); + RtlFreeOemString (&OemString2); + + return Result; + +} +*/ + +/* + * @implemented + * + * RIPPED FROM WINE's ntdll\rtlstr.c rev 1.45 + * + * Convert a string representation of a GUID into a GUID. + * + * PARAMS + * str [I] String representation in the format "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" + * guid [O] Destination for the converted GUID + * + * RETURNS + * Success: STATUS_SUCCESS. guid contains the converted value. + * Failure: STATUS_INVALID_PARAMETER, if str is not in the expected format. + * + * SEE ALSO + * See RtlStringFromGUID. + */ +NTSTATUS +STDCALL +RtlGUIDFromString( + IN UNICODE_STRING *str, + OUT GUID* guid +) +{ + int i = 0; + const WCHAR *lpszCLSID = str->Buffer; + BYTE* lpOut = (BYTE*)guid; + + //TRACE("(%s,%p)\n", debugstr_us(str), guid); + + /* Convert string: {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} + * to memory: DWORD... WORD WORD BYTES............ + */ + while (i < 37) + { + switch (i) + { + case 0: + if (*lpszCLSID != '{') + return STATUS_INVALID_PARAMETER; + break; + + case 9: + case 14: + case 19: + case 24: + if (*lpszCLSID != '-') + return STATUS_INVALID_PARAMETER; + break; + + case 37: + if (*lpszCLSID != '}') + return STATUS_INVALID_PARAMETER; + break; + + default: + { + WCHAR ch = *lpszCLSID, ch2 = lpszCLSID[1]; + unsigned char byte; + + /* Read two hex digits as a byte value */ + if (ch >= '0' && ch <= '9') + ch = ch - '0'; + else if (ch >= 'a' && ch <= 'f') + ch = ch - 'a' + 10; + else if (ch >= 'A' && ch <= 'F') + ch = ch - 'A' + 10; + else + return STATUS_INVALID_PARAMETER; + + if (ch2 >= '0' && ch2 <= '9') + ch2 = ch2 - '0'; + else if (ch2 >= 'a' && ch2 <= 'f') + ch2 = ch2 - 'a' + 10; + else if (ch2 >= 'A' && ch2 <= 'F') + ch2 = ch2 - 'A' + 10; + else + return STATUS_INVALID_PARAMETER; + + byte = ch << 4 | ch2; + + switch (i) + { +#ifndef WORDS_BIGENDIAN + /* For Big Endian machines, we store the data such that the + * dword/word members can be read as DWORDS and WORDS correctly. */ + /* Dword */ + case 1: + lpOut[3] = byte; + break; + case 3: + lpOut[2] = byte; + break; + case 5: + lpOut[1] = byte; + break; + case 7: + lpOut[0] = byte; + lpOut += 4; + break; + /* Word */ + case 10: + case 15: + lpOut[1] = byte; + break; + case 12: + case 17: + lpOut[0] = byte; + lpOut += 2; + break; +#endif + /* Byte */ + default: + lpOut[0] = byte; + lpOut++; + break; + } + lpszCLSID++; /* Skip 2nd character of byte */ + i++; + } + } + lpszCLSID++; + i++; + } + + return STATUS_SUCCESS; +} + + +/* + * @unimplemented + */ +NTSTATUS STDCALL +RtlInt64ToUnicodeString (IN ULONGLONG Value, + IN ULONG Base, + OUT PUNICODE_STRING String) +{ + return STATUS_NOT_IMPLEMENTED; +} + + +/* + * @implemented + */ +VOID +STDCALL +RtlEraseUnicodeString( + IN PUNICODE_STRING String) +{ + if (String->Buffer == NULL) + return; + + if (String->MaximumLength == 0) + return; + + memset (String->Buffer, + 0, + String->MaximumLength); + + String->Length = 0; +} + + + +/* + * @implemented + * + * NOTES + * See RtlpUnicodeStringToCountedOemString. + */ +NTSTATUS +STDCALL +RtlUnicodeStringToCountedOemString( + IN OUT POEM_STRING OemDest, + IN PUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString) +{ + return RtlpUnicodeStringToCountedOemString( + OemDest, + UniSource, + AllocateDestinationString, + NonPagedPool); +} + +/* + * private + * + * NOTES + * Same as RtlUnicodeStringToOemString but doesn't write terminating null + * Does a partial copy if the dest buffer is too small + */ +NTSTATUS +FASTCALL +RtlpUnicodeStringToCountedOemString( + IN OUT POEM_STRING OemDest, + IN PUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString, + IN POOL_TYPE PoolType) +{ + NTSTATUS Status; + ULONG Length; //excluding nullterm + + if (NlsMbOemCodePageTag == TRUE) + Length = RtlUnicodeStringToAnsiSize(UniSource) - sizeof(CHAR); + else + Length = (UniSource->Length / sizeof(WCHAR)); + + if (Length > 0x0000FFFF) + return STATUS_INVALID_PARAMETER_2; + + OemDest->Length = (WORD)(Length); + + if (AllocateDestinationString) + { + OemDest->Buffer = ExAllocatePoolWithTag(PoolType, Length, TAG_OSTR); + if (OemDest->Buffer == NULL) + return STATUS_NO_MEMORY; + + OemDest->MaximumLength = Length; + } + else if (OemDest->MaximumLength == 0) + { + return STATUS_BUFFER_TOO_SMALL; + } + else if (Length > OemDest->MaximumLength) + { + OemDest->Length = OemDest->MaximumLength; + } + + Status = RtlUnicodeToOemN (OemDest->Buffer, + OemDest->Length, + NULL, + UniSource->Buffer, + UniSource->Length); + + if (!NT_SUCCESS(Status) && AllocateDestinationString) + { + ExFreePool(OemDest->Buffer); + } + + return Status; +} + + +/* + * @implemented + */ +NTSTATUS +STDCALL +RtlLargeIntegerToChar( + IN PLARGE_INTEGER Value, + IN ULONG Base, + IN ULONG Length, + IN OUT PCHAR String) +{ + ULONG Radix; + CHAR temp[65]; + ULONGLONG v = Value->QuadPart; + ULONG i; + PCHAR tp; + PCHAR sp; + + Radix = Base; + if (Radix == 0) + Radix = 10; + + if ((Radix != 2) && (Radix != 8) && + (Radix != 10) && (Radix != 16)) + return STATUS_INVALID_PARAMETER; + + tp = temp; + while (v || tp == temp) + { + i = v % Radix; + v = v / Radix; + if (i < 10) + *tp = i + '0'; + else + *tp = i + 'a' - 10; + tp++; + } + + if (tp - temp >= Length) + return STATUS_BUFFER_TOO_SMALL; + + sp = String; + while (tp > temp) + *sp++ = *--tp; + *sp = 0; + + return STATUS_SUCCESS; +} + + + +/* + * @implemented + * + * NOTES + * See RtlpUpcaseUnicodeString + */ +NTSTATUS +STDCALL +RtlUpcaseUnicodeString( + IN OUT PUNICODE_STRING UniDest, + IN PCUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString) +{ + + return RtlpUpcaseUnicodeString( + UniDest, + UniSource, + AllocateDestinationString, + NonPagedPool); +} + + +/* + * private + * + * NOTES + * dest is never '\0' terminated because it may be equal to src, and src + * might not be '\0' terminated. dest->Length is only set upon success. + */ +NTSTATUS +FASTCALL +RtlpUpcaseUnicodeString( + IN OUT PUNICODE_STRING UniDest, + IN PCUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString, + IN POOL_TYPE PoolType) +{ + ULONG i; + PWCHAR Src, Dest; + + if (AllocateDestinationString == TRUE) + { + UniDest->MaximumLength = UniSource->Length; + UniDest->Buffer = ExAllocatePoolWithTag(PoolType, UniDest->MaximumLength, TAG_USTR); + if (UniDest->Buffer == NULL) + return STATUS_NO_MEMORY; + } + else if (UniSource->Length > UniDest->MaximumLength) + { + return STATUS_BUFFER_TOO_SMALL; + } + + UniDest->Length = UniSource->Length; + + Src = UniSource->Buffer; + Dest = UniDest->Buffer; + for (i = 0; i < UniSource->Length / sizeof(WCHAR); i++) + { + *Dest = RtlUpcaseUnicodeChar (*Src); + Dest++; + Src++; + } + + return STATUS_SUCCESS; +} + + + +/* + * @implemented + * + * NOTES + * See RtlpUpcaseUnicodeStringToAnsiString + */ +NTSTATUS +STDCALL +RtlUpcaseUnicodeStringToAnsiString( + IN OUT PANSI_STRING AnsiDest, + IN PUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString) +{ + return RtlpUpcaseUnicodeStringToAnsiString( + AnsiDest, + UniSource, + AllocateDestinationString, + NonPagedPool); +} + +/* + * private + * + * NOTES + * This function always writes a terminating '\0'. + * It performs a partial copy if ansi is too small. + */ +NTSTATUS +FASTCALL +RtlpUpcaseUnicodeStringToAnsiString( + IN OUT PANSI_STRING AnsiDest, + IN PUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString, + IN POOL_TYPE PoolType) +{ + NTSTATUS Status; + ULONG Length; //including nullterm + + if (NlsMbCodePageTag == TRUE) + Length = RtlUnicodeStringToAnsiSize(UniSource); + else + Length = (UniSource->Length / sizeof(WCHAR)) + sizeof(CHAR); + + if (Length > 0x0000FFFF) + return STATUS_INVALID_PARAMETER_2; + + AnsiDest->Length = (WORD)(Length - sizeof(CHAR)); + + if (AllocateDestinationString) + { + AnsiDest->Buffer = ExAllocatePoolWithTag(PoolType, Length, TAG_ASTR); + if (AnsiDest->Buffer == NULL) + return STATUS_NO_MEMORY; + + AnsiDest->MaximumLength = Length; + } + else if (AnsiDest->MaximumLength == 0) + { + return STATUS_BUFFER_TOO_SMALL; + } + else if (Length > AnsiDest->MaximumLength) + { + //make room for nullterm + AnsiDest->Length = AnsiDest->MaximumLength - sizeof(CHAR); + } + + //FIXME: do we need this??????? -Gunnar + RtlZeroMemory (AnsiDest->Buffer, + AnsiDest->Length); + + Status = RtlUpcaseUnicodeToMultiByteN (AnsiDest->Buffer, + AnsiDest->Length, + NULL, + UniSource->Buffer, + UniSource->Length); + + if (!NT_SUCCESS(Status) && AllocateDestinationString) + { + ExFreePool(AnsiDest->Buffer); + return Status; + } + + AnsiDest->Buffer[AnsiDest->Length] = 0; + return Status; +} + + + +/* + * @implemented + * + * NOTES + * See RtlpUpcaseUnicodeStringToCountedOemString + */ +NTSTATUS +STDCALL +RtlUpcaseUnicodeStringToCountedOemString( + IN OUT POEM_STRING OemDest, + IN PUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString) +{ + return RtlpUpcaseUnicodeStringToCountedOemString( + OemDest, + UniSource, + AllocateDestinationString, + NonPagedPool); +} + + + +/* + * private + * + * NOTES + * Same as RtlUpcaseUnicodeStringToOemString but doesn't write terminating null + * It performs a partial copy if oem is too small. + */ +NTSTATUS +FASTCALL +RtlpUpcaseUnicodeStringToCountedOemString( + IN OUT POEM_STRING OemDest, + IN PUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString, + IN POOL_TYPE PoolType) +{ + NTSTATUS Status; + ULONG Length; //excluding nullterm + + if (NlsMbCodePageTag == TRUE) + Length = RtlUnicodeStringToAnsiSize(UniSource) - sizeof(CHAR); + else + Length = UniSource->Length / sizeof(WCHAR); + + if (Length > 0x0000FFFF) + return(STATUS_INVALID_PARAMETER_2); + + OemDest->Length = (WORD)(Length); + + if (AllocateDestinationString) + { + OemDest->Buffer = ExAllocatePoolWithTag(PoolType, Length, TAG_OSTR); + if (OemDest->Buffer == NULL) + return(STATUS_NO_MEMORY); + + //FIXME: Do we need this????? + RtlZeroMemory (OemDest->Buffer, Length); + + OemDest->MaximumLength = (WORD)Length; + } + else if (OemDest->MaximumLength == 0) + { + return(STATUS_BUFFER_TOO_SMALL); + } + else if (Length > OemDest->MaximumLength) + { + OemDest->Length = OemDest->MaximumLength; + } + + Status = RtlUpcaseUnicodeToOemN(OemDest->Buffer, + OemDest->Length, + NULL, + UniSource->Buffer, + UniSource->Length); + + if (!NT_SUCCESS(Status) && AllocateDestinationString) + { + ExFreePool(OemDest->Buffer); + return Status; + } + + return Status; +} + + +/* + * @implemented + * NOTES + * See RtlpUpcaseUnicodeStringToOemString + */ +NTSTATUS +STDCALL +RtlUpcaseUnicodeStringToOemString ( + IN OUT POEM_STRING OemDest, + IN PUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString +) +{ + return RtlpUpcaseUnicodeStringToOemString( + OemDest, + UniSource, + AllocateDestinationString, + NonPagedPool); +} + + +/* + * private + * + * NOTES + * Oem string is allways nullterminated + * It performs a partial copy if oem is too small. + */ +NTSTATUS +FASTCALL +RtlpUpcaseUnicodeStringToOemString ( + IN OUT POEM_STRING OemDest, + IN PUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString, + IN POOL_TYPE PoolType +) +{ + NTSTATUS Status; + ULONG Length; //including nullterm + + if (NlsMbOemCodePageTag == TRUE) + Length = RtlUnicodeStringToAnsiSize(UniSource); + else + Length = (UniSource->Length / sizeof(WCHAR)) + sizeof(CHAR); + + if (Length > 0x0000FFFF) + return STATUS_INVALID_PARAMETER_2; + + OemDest->Length = (WORD)(Length - sizeof(CHAR)); + + if (AllocateDestinationString) + { + OemDest->Buffer = ExAllocatePoolWithTag(PoolType, Length, TAG_OSTR); + if (OemDest->Buffer == NULL) + return STATUS_NO_MEMORY; + + //FIXME: Do we need this???? + RtlZeroMemory (OemDest->Buffer, Length); + + OemDest->MaximumLength = (WORD)Length; + } + else if (OemDest->MaximumLength == 0) + { + return STATUS_BUFFER_OVERFLOW; + } + else if (Length > OemDest->MaximumLength) + { + //make room for nullterm + OemDest->Length = OemDest->MaximumLength - sizeof(CHAR); + } + + Status = RtlUpcaseUnicodeToOemN (OemDest->Buffer, + OemDest->Length, + NULL, + UniSource->Buffer, + UniSource->Length); + + if (!NT_SUCCESS(Status) && AllocateDestinationString) + { + ExFreePool(OemDest->Buffer); + return Status; + } + + OemDest->Buffer[OemDest->Length] = 0; + return Status; +} + + +/* + * @implemented + * + * RETURNS + * Bytes calculated including nullterm + */ +ULONG +STDCALL +RtlOemStringToUnicodeSize(IN POEM_STRING OemString) +{ + ULONG Size; + + //this function returns size including nullterm + RtlMultiByteToUnicodeSize(&Size, + OemString->Buffer, + OemString->Length); + + return(Size); +} + + + +/* + * @implemented + */ +NTSTATUS +STDCALL +RtlStringFromGUID (IN REFGUID Guid, + OUT PUNICODE_STRING GuidString) +{ + STATIC CONST PWCHAR Hex = L"0123456789ABCDEF"; + WCHAR Buffer[40]; + PWCHAR BufferPtr; + ULONG i; + + if (Guid == NULL) + { + return STATUS_INVALID_PARAMETER; + } + + swprintf (Buffer, + L"{%08lX-%04X-%04X-%02X%02X-", + Guid->Data1, + Guid->Data2, + Guid->Data3, + Guid->Data4[0], + Guid->Data4[1]); + BufferPtr = Buffer + 25; + + /* 6 hex bytes */ + for (i = 2; i < 8; i++) + { + *BufferPtr++ = Hex[Guid->Data4[i] >> 4]; + *BufferPtr++ = Hex[Guid->Data4[i] & 0xf]; + } + + *BufferPtr++ = L'}'; + *BufferPtr++ = L'\0'; + + return RtlCreateUnicodeString (GuidString, Buffer); +} + + +/* + * @implemented + * + * RETURNS + * Bytes calculated including nullterm + */ +ULONG +STDCALL +RtlUnicodeStringToAnsiSize( + IN PUNICODE_STRING UnicodeString) +{ + ULONG Size; + + //this function return size without nullterm! + RtlUnicodeToMultiByteSize (&Size, + UnicodeString->Buffer, + UnicodeString->Length); + + return Size + sizeof(CHAR); //NB: incl. nullterm +} + + + + +/* + * @implemented + */ +LONG +STDCALL +RtlCompareUnicodeString( + IN PUNICODE_STRING String1, + IN PUNICODE_STRING String2, + IN BOOLEAN CaseInsensitive) +{ + ULONG len1, len2; + PWCHAR s1, s2; + WCHAR c1, c2; + + if (String1 && String2) + { + len1 = String1->Length / sizeof(WCHAR); + len2 = String2->Length / sizeof(WCHAR); + s1 = String1->Buffer; + s2 = String2->Buffer; + + if (s1 && s2) + { + if (CaseInsensitive) + { + while (1) + { + c1 = len1-- ? RtlUpcaseUnicodeChar (*s1++) : 0; + c2 = len2-- ? RtlUpcaseUnicodeChar (*s2++) : 0; + if (!c1 || !c2 || c1 != c2) + return c1 - c2; + } + } + else + { + while (1) + { + c1 = len1-- ? *s1++ : 0; + c2 = len2-- ? *s2++ : 0; + if (!c1 || !c2 || c1 != c2) + return c1 - c2; + } + } + } + } + + return 0; +} + + +/* + * @implemented + */ +VOID +STDCALL +RtlCopyString( + IN OUT PSTRING DestinationString, + IN PSTRING SourceString) +{ + ULONG copylen; + + if(SourceString == NULL) + { + DestinationString->Length = 0; + return; + } + + copylen = min (DestinationString->MaximumLength - sizeof(CHAR), + SourceString->Length); + + memcpy(DestinationString->Buffer, SourceString->Buffer, copylen); + DestinationString->Buffer[copylen] = 0; + DestinationString->Length = copylen; +} + + + +/* + * @implemented + */ +VOID +STDCALL +RtlCopyUnicodeString( + IN OUT PUNICODE_STRING DestinationString, + IN PUNICODE_STRING SourceString) +{ + ULONG copylen; + + if (SourceString == NULL) + { + DestinationString->Length = 0; + return; + } + + copylen = min (DestinationString->MaximumLength - sizeof(WCHAR), + SourceString->Length); + memcpy(DestinationString->Buffer, SourceString->Buffer, copylen); + DestinationString->Buffer[copylen / sizeof(WCHAR)] = 0; + DestinationString->Length = copylen; +} + + +/* + * @implemented + * + * NOTES + * See RtlpCreateUnicodeString + */ +BOOLEAN +STDCALL +RtlCreateUnicodeString( + IN OUT PUNICODE_STRING UniDest, + IN PWSTR Source) +{ + + DPRINT("RtlCreateUnicodeString\n"); + return RtlpCreateUnicodeString(UniDest, Source, NonPagedPool); +} + + +/* + * private + */ +BOOLEAN +FASTCALL +RtlpCreateUnicodeString( + IN OUT PUNICODE_STRING UniDest, + IN PWSTR Source, + IN POOL_TYPE PoolType) +{ + ULONG Length; + + Length = (wcslen (Source) + 1) * sizeof(WCHAR); + + UniDest->Buffer = ExAllocatePoolWithTag(PoolType, Length, TAG_USTR); + if (UniDest->Buffer == NULL) + return FALSE; + + memmove (UniDest->Buffer, + Source, + Length); + + UniDest->MaximumLength = Length; + UniDest->Length = Length - sizeof (WCHAR); + + return TRUE; +} + + + +/* + * @implemented + */ +BOOLEAN +STDCALL +RtlCreateUnicodeStringFromAsciiz( + OUT PUNICODE_STRING Destination, + IN PCSZ Source) +{ + ANSI_STRING AnsiString; + NTSTATUS Status; + + RtlInitAnsiString (&AnsiString, + Source); + + Status = RtlAnsiStringToUnicodeString (Destination, + &AnsiString, + TRUE); + + return NT_SUCCESS(Status); +} + + + +/* + * @implemented + * + * NOTES + * See RtlpDowncaseUnicodeString + */ +NTSTATUS STDCALL +RtlDowncaseUnicodeString( + IN OUT PUNICODE_STRING UniDest, + IN PUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString) +{ + return RtlpDowncaseUnicodeString( + UniDest, + UniSource, + AllocateDestinationString, + NonPagedPool); +} + + +/* + * private + * + * NOTES + * Dest is never '\0' terminated because it may be equal to src, and src + * might not be '\0' terminated. + * Dest->Length is only set upon success. + */ +NTSTATUS +FASTCALL +RtlpDowncaseUnicodeString( + IN OUT PUNICODE_STRING UniDest, + IN PUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString, + IN POOL_TYPE PoolType) +{ + ULONG i; + PWCHAR Src, Dest; + + if (AllocateDestinationString) + { + UniDest->Buffer = ExAllocatePoolWithTag(PoolType, UniSource->Length, TAG_USTR); + if (UniDest->Buffer == NULL) + return STATUS_NO_MEMORY; + + UniDest->MaximumLength = UniSource->Length; + } + else if (UniSource->Length > UniDest->MaximumLength) + { + return STATUS_BUFFER_TOO_SMALL; + } + + UniDest->Length = UniSource->Length; + + Src = UniSource->Buffer; + Dest = UniDest->Buffer; + for (i=0; i < UniSource->Length / sizeof(WCHAR); i++) + { + if (*Src < L'A') + { + *Dest = *Src; + } + else if (*Src <= L'Z') + { + *Dest = (*Src + (L'a' - L'A')); + } + else + { + *Dest = RtlDowncaseUnicodeChar(*Src); + } + + Dest++; + Src++; + } + + return STATUS_SUCCESS; +} + + + +/* + * @implemented + * + * NOTES + * if src is NULL dest is unchanged. + * dest is '\0' terminated when the MaximumLength allowes it. + * When dest fits exactly in MaximumLength characters the '\0' is ommitted. + */ +NTSTATUS STDCALL +RtlAppendUnicodeToString(IN OUT PUNICODE_STRING Destination, + IN PWSTR Source) +{ + ULONG slen; + + slen = wcslen(Source) * sizeof(WCHAR); + + if (Destination->Length + slen > Destination->MaximumLength) + return(STATUS_BUFFER_TOO_SMALL); + + memcpy((char*)Destination->Buffer + Destination->Length, Source, slen); + Destination->Length += slen; + /* append terminating '\0' if enough space */ + if( Destination->MaximumLength > Destination->Length ) + Destination->Buffer[Destination->Length / sizeof(WCHAR)] = 0; + + return(STATUS_SUCCESS); +} + + +/* + * @implemented + * + * NOTES + * See RtlpAnsiStringToUnicodeString + */ +NTSTATUS +STDCALL +RtlAnsiStringToUnicodeString( + IN OUT PUNICODE_STRING UniDest, + IN PANSI_STRING AnsiSource, + IN BOOLEAN AllocateDestinationString) +{ + return RtlpAnsiStringToUnicodeString( + UniDest, + AnsiSource, + AllocateDestinationString, + NonPagedPool); +} + + + +/* + * private + * + * NOTES + * This function always writes a terminating '\0'. + * If the dest buffer is too small a partial copy is NOT performed! + */ +NTSTATUS +FASTCALL +RtlpAnsiStringToUnicodeString( + IN OUT PUNICODE_STRING UniDest, + IN PANSI_STRING AnsiSource, + IN BOOLEAN AllocateDestinationString, + IN POOL_TYPE PoolType) +{ + NTSTATUS Status; + ULONG Length; //including nullterm + + if (NlsMbCodePageTag == TRUE) + Length = RtlAnsiStringToUnicodeSize(AnsiSource); + else + Length = (AnsiSource->Length * sizeof(WCHAR)) + sizeof(WCHAR); + + if (Length > 0xffff) + return STATUS_INVALID_PARAMETER_2; + + if (AllocateDestinationString == TRUE) + { + UniDest->Buffer = ExAllocatePoolWithTag(PoolType, Length, TAG_USTR); + if (UniDest->Buffer == NULL) + return STATUS_NO_MEMORY; + + UniDest->MaximumLength = Length; + } + else if (Length > UniDest->MaximumLength) + { + DPRINT("STATUS_BUFFER_TOO_SMALL\n"); + return STATUS_BUFFER_TOO_SMALL; + } + + UniDest->Length = Length - sizeof(WCHAR); + + //FIXME: We don't need this??? -Gunnar + RtlZeroMemory (UniDest->Buffer, + UniDest->Length); + + Status = RtlMultiByteToUnicodeN (UniDest->Buffer, + UniDest->Length, + NULL, + AnsiSource->Buffer, + AnsiSource->Length); + + if (!NT_SUCCESS(Status) && AllocateDestinationString) + { + ExFreePool(UniDest->Buffer); + return Status; + } + + UniDest->Buffer[UniDest->Length / sizeof(WCHAR)] = 0; + return Status; +} + + + +/* + * @implemented + * + * NOTES + * if src is NULL dest is unchanged. + * dest is never '\0' terminated. + */ +NTSTATUS +STDCALL +RtlAppendAsciizToString( + IN OUT PSTRING Destination, + IN PCSZ Source) +{ + ULONG Length; + PCHAR Ptr; + + if (Source == NULL) + return STATUS_SUCCESS; + + Length = strlen (Source); + if (Destination->Length + Length >= Destination->MaximumLength) + return STATUS_BUFFER_TOO_SMALL; + + Ptr = Destination->Buffer + Destination->Length; + memmove (Ptr, + Source, + Length); + Ptr += Length; + *Ptr = 0; + + Destination->Length += Length; + + return STATUS_SUCCESS; +} + + +/* + * @implemented + */ +VOID STDCALL +RtlUpperString(PSTRING DestinationString, + PSTRING SourceString) +{ + ULONG Length; + ULONG i; + PCHAR Src; + PCHAR Dest; + + Length = min(SourceString->Length, + DestinationString->MaximumLength - 1); + + Src = SourceString->Buffer; + Dest = DestinationString->Buffer; + for (i = 0; i < Length; i++) + { + *Dest = RtlUpperChar(*Src); + Src++; + Dest++; + } + *Dest = 0; + + DestinationString->Length = SourceString->Length; +} + + +/* + * @implemented + */ +ULONG STDCALL +RtlxAnsiStringToUnicodeSize(IN PANSI_STRING AnsiString) +{ + return RtlAnsiStringToUnicodeSize(AnsiString); +} + + +/* + * @implemented + */ +ULONG STDCALL +RtlxOemStringToUnicodeSize(IN POEM_STRING OemString) +{ + return RtlOemStringToUnicodeSize((PANSI_STRING)OemString); +} + + + +/* + * @implemented + */ +ULONG STDCALL +RtlxUnicodeStringToAnsiSize(IN PUNICODE_STRING UnicodeString) +{ + return RtlUnicodeStringToAnsiSize(UnicodeString); +} + + +/* + * @implemented + */ +ULONG STDCALL +RtlxUnicodeStringToOemSize(IN PUNICODE_STRING UnicodeString) +{ + return RtlUnicodeStringToOemSize(UnicodeString); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlDuplicateUnicodeString( + INT AddNull, + IN PUNICODE_STRING SourceString, + PUNICODE_STRING DestinationString) +{ + if (SourceString == NULL || DestinationString == NULL) + return STATUS_INVALID_PARAMETER; + + + if (SourceString->Length == 0 && AddNull != 3) + { + DestinationString->Length = 0; + DestinationString->MaximumLength = 0; + DestinationString->Buffer = NULL; + } + else + { + unsigned int DestMaxLength = SourceString->Length; + + if (AddNull) + DestMaxLength += sizeof(UNICODE_NULL); + + DestinationString->Buffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, DestMaxLength); + if (DestinationString->Buffer == NULL) + return STATUS_NO_MEMORY; + + RtlCopyMemory(DestinationString->Buffer, SourceString->Buffer, SourceString->Length); + DestinationString->Length = SourceString->Length; + DestinationString->MaximumLength = DestMaxLength; + + if (AddNull) + DestinationString->Buffer[DestinationString->Length / sizeof(WCHAR)] = 0; + } + + return STATUS_SUCCESS; +} + +/* EOF */ diff --git a/reactos/lib/rtl/version.c b/reactos/lib/rtl/version.c new file mode 100644 index 00000000000..25604dece92 --- /dev/null +++ b/reactos/lib/rtl/version.c @@ -0,0 +1,68 @@ +/* + * 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: version.c,v 1.1 2004/05/31 19:29:02 gdalsnes Exp $ + * + * PROJECT: ReactOS kernel + * PURPOSE: Runtime code + * FILE: lib/rtl/version.c + * PROGRAMER: Filip Navara + */ + +/* INCLUDES *****************************************************************/ + +#define __USE_W32API + +#include <ddk/ntddk.h> +#include <ntdll/rtl.h> + +#define NDEBUG +#include <debug.h> + + +/* FUNCTIONS ****************************************************************/ + +NTSTATUS STDCALL +RtlGetVersion(RTL_OSVERSIONINFOW *Info) +{ + WCHAR CSDString[] = L"Service Pack 6"; + + if (Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOW) || + Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW)) + { + Info->dwMajorVersion = 4; + Info->dwMinorVersion = 0; + Info->dwBuildNumber = 1381; + Info->dwPlatformId = VER_PLATFORM_WIN32_NT; + RtlCopyMemory(Info->szCSDVersion, CSDString, sizeof(CSDString)); + if (Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW)) + { + RTL_OSVERSIONINFOEXW *InfoEx = (RTL_OSVERSIONINFOEXW *)Info; + InfoEx->wServicePackMajor = 6; + InfoEx->wServicePackMinor = 0; + InfoEx->wSuiteMask = 0; + InfoEx->wProductType = VER_NT_WORKSTATION; + } + + return STATUS_SUCCESS; + } + + return STATUS_INVALID_PARAMETER; +} + +/* EOF */ From 3ebfb48eb8550d664fb0e316dc80e68c307a8a38 Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes <hardon@online.no> Date: Mon, 31 May 2004 19:45:16 +0000 Subject: [PATCH 1287/1463] create rtl for stuff common to ntdll/ntoskrnl svn path=/trunk/; revision=9571 --- reactos/Makefile | 4 +- reactos/ntoskrnl/Makefile | 30 +- reactos/ntoskrnl/rtl/libsupp.c | 97 +++++ reactos/ntoskrnl/rtl/nls.c | 751 ++------------------------------- 4 files changed, 150 insertions(+), 732 deletions(-) create mode 100644 reactos/ntoskrnl/rtl/libsupp.c diff --git a/reactos/Makefile b/reactos/Makefile index a573ddbcd3c..bd0d0a02faa 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.222 2004/05/29 00:16:39 sedwards Exp $ +# $Id: Makefile,v 1.223 2004/05/31 19:45:16 gdalsnes Exp $ # # Global makefile # @@ -32,7 +32,7 @@ BUS = acpi isapnp pci LIB_FSLIB = vfatlib # Static libraries -LIB_STATIC = string rosrtl epsapi uuid libwine zlib +LIB_STATIC = string rosrtl epsapi uuid libwine zlib rtl # Keyboard layout libraries DLLS_KBD = kbdus kbdgr kbdfr kbduk diff --git a/reactos/ntoskrnl/Makefile b/reactos/ntoskrnl/Makefile index f2baa3c3b84..406da157207 100644 --- a/reactos/ntoskrnl/Makefile +++ b/reactos/ntoskrnl/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.119 2004/05/24 12:08:55 ekohl Exp $ +# $Id: Makefile,v 1.120 2004/05/31 19:39:53 gdalsnes Exp $ # # ReactOS Operating System # @@ -103,28 +103,18 @@ OBJECTS_RTL = \ rtl/bit.o \ rtl/bitmap.o \ rtl/capture.o \ - rtl/compress.o \ rtl/ctype.o \ - rtl/dos8dot3.o \ - rtl/error.o \ rtl/handle.o \ - rtl/largeint.o \ - rtl/mem.o \ rtl/message.o \ - rtl/nls.o \ rtl/purecall.o \ - rtl/random.o \ - rtl/rangelist.o \ rtl/regio.o \ rtl/sprintf.o \ rtl/stdlib.o \ rtl/string.o \ rtl/swprintf.o \ - rtl/time.o \ - rtl/timezone.o \ - rtl/unicode.o \ - rtl/version.o \ - rtl/wstring.o + rtl/wstring.o \ + rtl/nls.o \ + rtl/libsupp.o OBJECTS_RTL := $(filter-out $(RTL_EXCLUDE_FILTER), $(OBJECTS_RTL)) @@ -534,7 +524,7 @@ OBJECTS := \ $(OBJECTS_RESOURCE) -$(TARGETNAME).nostrip.exe: $(TARGETNAME).o $(IE_DATA) $(SDK_PATH_LIB)/string.a $(SDK_PATH_LIB)/rosrtl.a +$(TARGETNAME).nostrip.exe: $(TARGETNAME).o $(IE_DATA) $(SDK_PATH_LIB)/rtl.a $(SDK_PATH_LIB)/string.a $(SDK_PATH_LIB)/rosrtl.a $(CC) \ -Wl,-T,ntoskrnl.lnk \ -nostartfiles \ @@ -548,6 +538,7 @@ $(TARGETNAME).nostrip.exe: $(TARGETNAME).o $(IE_DATA) $(SDK_PATH_LIB)/string.a $ -Wl,--entry,_NtProcessStartup \ -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 @@ -572,12 +563,13 @@ $(TARGETNAME).nostrip.exe: $(TARGETNAME).o $(IE_DATA) $(SDK_PATH_LIB)/string.a $ -Wl,--entry,_NtProcessStartup \ -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 - $(RM) temp.exp -$(TARGETNAME).exe: $(TARGETNAME).o $(LINKER_SCRIPT) $(DDK_PATH_LIB)/hal.a $(SDK_PATH_LIB)/string.a $(SDK_PATH_LIB)/rosrtl.a +$(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 - $(CC) \ -Wl,-T,$(LINKER_SCRIPT) \ -nostartfiles \ @@ -591,6 +583,7 @@ $(TARGETNAME).exe: $(TARGETNAME).o $(LINKER_SCRIPT) $(DDK_PATH_LIB)/hal.a $(SDK_ -Wl,--entry,_NtProcessStartup \ -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 @@ -615,6 +608,7 @@ $(TARGETNAME).exe: $(TARGETNAME).o $(LINKER_SCRIPT) $(DDK_PATH_LIB)/hal.a $(SDK_ -Wl,--entry,_NtProcessStartup \ -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 @@ -623,7 +617,7 @@ $(TARGETNAME).exe: $(TARGETNAME).o $(LINKER_SCRIPT) $(DDK_PATH_LIB)/hal.a $(SDK_ $(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)/string.a $(SDK_PATH_LIB)/rosrtl.a +$(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 $(CC) \ -Wl,-T,$(TARGETNAME).dbg.lnk \ -nostartfiles \ @@ -637,6 +631,7 @@ $(TARGETNAME).dbg: $(TARGETNAME).dbg.o $(TARGETNAME).a $(TARGETNAME).dbg.lnk $(D -Wl,--entry,_NtProcessStartup \ -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 @@ -661,6 +656,7 @@ $(TARGETNAME).dbg: $(TARGETNAME).dbg.o $(TARGETNAME).a $(TARGETNAME).dbg.lnk $(D -Wl,--entry,_NtProcessStartup \ -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 diff --git a/reactos/ntoskrnl/rtl/libsupp.c b/reactos/ntoskrnl/rtl/libsupp.c new file mode 100644 index 00000000000..6810be48bdb --- /dev/null +++ b/reactos/ntoskrnl/rtl/libsupp.c @@ -0,0 +1,97 @@ +/* + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * FILE: lib/ntoskrnl/rtl/libsup.c + * PURPOSE: Rtl library support routines + * UPDATE HISTORY: + * + */ + +/* INCLUDES ******************************************************************/ + +#include <ddk/ntddk.h> + +#define NDEBUG +#include <internal/debug.h> + +//FIXME: sort this out somehow +#define PCRITICAL_SECTION PVOID +#define LPCRITICAL_SECTION PVOID + +/* FUNCTIONS *****************************************************************/ + +/* + * @implemented + */ +VOID STDCALL +RtlDeleteCriticalSection(PCRITICAL_SECTION CriticalSection) +{ +} + +/* + * @implemented + */ +DWORD STDCALL +RtlSetCriticalSectionSpinCount( + LPCRITICAL_SECTION CriticalSection, + DWORD SpinCount + ) +{ + return 0; +} + + +/* + * @implemented + */ +VOID STDCALL +RtlEnterCriticalSection(PCRITICAL_SECTION CriticalSection) +{ + ExAcquireFastMutex((PFAST_MUTEX) CriticalSection ); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlInitializeCriticalSection(PCRITICAL_SECTION CriticalSection) +{ + ExInitializeFastMutex((PFAST_MUTEX)CriticalSection ); + return STATUS_SUCCESS; +} + + +/* + * @implemented + */ +VOID STDCALL +RtlLeaveCriticalSection(PCRITICAL_SECTION CriticalSection) +{ + ExReleaseFastMutex((PFAST_MUTEX) CriticalSection ); +} + +/* + * @implemented + */ +BOOLEAN STDCALL +RtlTryEnterCriticalSection(PCRITICAL_SECTION CriticalSection) +{ + return ExTryToAcquireFastMutex((PFAST_MUTEX) CriticalSection ); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlInitializeCriticalSectionAndSpinCount ( + PCRITICAL_SECTION CriticalSection, + ULONG SpinCount) +{ + ExInitializeFastMutex((PFAST_MUTEX)CriticalSection ); + return STATUS_SUCCESS; +} + +/* EOF */ diff --git a/reactos/ntoskrnl/rtl/nls.c b/reactos/ntoskrnl/rtl/nls.c index a5a05563ae4..323a7e5ac1a 100644 --- a/reactos/ntoskrnl/rtl/nls.c +++ b/reactos/ntoskrnl/rtl/nls.c @@ -1,18 +1,15 @@ -/* $Id: nls.c,v 1.22 2003/10/12 17:05:50 hbirr Exp $ +/* $Id: nls.c,v 1.23 2004/05/31 19:40:49 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * FILE: ntoskrnl/rtl/nls.c - * PURPOSE: National Language Support (NLS) functions + * PURPOSE: Bitmap functions * UPDATE HISTORY: - * 20/08/99 Created by Emanuele Aliberti - * 10/11/99 Added translation functions. - * - * TODO: - * 1) Add multi-byte translation code. + * 20/08/99 Created by Eric Kohl */ #include <ddk/ntddk.h> + #include <internal/mm.h> #include <internal/nls.h> @@ -22,25 +19,6 @@ /* GLOBALS *******************************************************************/ -USHORT NlsAnsiCodePage = 0; /* exported */ -BOOLEAN NlsMbCodePageTag = FALSE; /* exported */ -PWCHAR NlsAnsiToUnicodeTable = NULL; -PCHAR NlsUnicodeToAnsiTable = NULL; -PWCHAR NlsDbcsUnicodeToAnsiTable = NULL; -PUSHORT NlsLeadByteInfo = NULL; /* exported */ - - -USHORT NlsOemCodePage = 0; -BOOLEAN NlsMbOemCodePageTag = FALSE; /* exported */ -PWCHAR NlsOemToUnicodeTable = NULL; -PCHAR NlsUnicodeToOemTable =NULL; -PWCHAR NlsDbcsUnicodeToOemTable = NULL; -PUSHORT NlsOemLeadByteInfo = NULL; /* exported */ - - -PUSHORT NlsUnicodeUpcaseTable = NULL; -PUSHORT NlsUnicodeLowercaseTable = NULL; - static PUSHORT NlsAnsiCodePageTable = NULL; static ULONG NlsAnsiCodePageTableSize = 0; @@ -62,9 +40,11 @@ ULONG NlsUnicodeTableOffset = 0; /* FUNCTIONS *****************************************************************/ + + VOID INIT_FUNCTION RtlpImportAnsiCodePage(PUSHORT TableBase, - ULONG Size) + ULONG Size) { NlsAnsiCodePageTable = TableBase; NlsAnsiCodePageTableSize = Size; @@ -73,7 +53,7 @@ RtlpImportAnsiCodePage(PUSHORT TableBase, VOID INIT_FUNCTION RtlpImportOemCodePage(PUSHORT TableBase, - ULONG Size) + ULONG Size) { NlsOemCodePageTable = TableBase; NlsOemCodePageTableSize = Size; @@ -82,7 +62,7 @@ RtlpImportOemCodePage(PUSHORT TableBase, VOID INIT_FUNCTION RtlpImportUnicodeCasemap(PUSHORT TableBase, - ULONG Size) + ULONG Size) { NlsUnicodeCasemapTable = TableBase; NlsUnicodeCasemapTableSize = Size; @@ -102,9 +82,9 @@ RtlpCreateInitialNlsTables(VOID) } RtlInitNlsTables (NlsAnsiCodePageTable, - NlsOemCodePageTable, - NlsUnicodeCasemapTable, - &NlsTable); + NlsOemCodePageTable, + NlsUnicodeCasemapTable, + &NlsTable); RtlResetRtlTranslations (&NlsTable); } @@ -121,19 +101,19 @@ RtlpCreateNlsSection(VOID) DPRINT("RtlpCreateNlsSection() called\n"); NlsSectionViewSize = ROUND_UP(NlsAnsiCodePageTableSize, PAGE_SIZE) + - ROUND_UP(NlsOemCodePageTableSize, PAGE_SIZE) + - ROUND_UP(NlsUnicodeCasemapTableSize, PAGE_SIZE); + ROUND_UP(NlsOemCodePageTableSize, PAGE_SIZE) + + ROUND_UP(NlsUnicodeCasemapTableSize, PAGE_SIZE); DPRINT("NlsSectionViewSize %lx\n", NlsSectionViewSize); SectionSize.QuadPart = (LONGLONG)NlsSectionViewSize; Status = NtCreateSection(&SectionHandle, - SECTION_ALL_ACCESS, - NULL, - &SectionSize, - PAGE_READWRITE, - SEC_COMMIT, - NULL); + SECTION_ALL_ACCESS, + NULL, + &SectionSize, + PAGE_READWRITE, + SEC_COMMIT, + NULL); if (!NT_SUCCESS(Status)) { DPRINT1("NtCreateSection() failed\n"); @@ -141,11 +121,11 @@ RtlpCreateNlsSection(VOID) } Status = ObReferenceObjectByHandle(SectionHandle, - SECTION_ALL_ACCESS, - MmSectionObjectType, - KernelMode, - &NlsSectionObject, - NULL); + SECTION_ALL_ACCESS, + MmSectionObjectType, + KernelMode, + &NlsSectionObject, + NULL); NtClose(SectionHandle); if (!NT_SUCCESS(Status)) { @@ -154,8 +134,8 @@ RtlpCreateNlsSection(VOID) } Status = MmMapViewInSystemSpace(NlsSectionObject, - &NlsSectionBase, - &NlsSectionViewSize); + &NlsSectionBase, + &NlsSectionViewSize); if (!NT_SUCCESS(Status)) { DPRINT1("MmMapViewInSystemSpace() failed\n"); @@ -163,683 +143,28 @@ RtlpCreateNlsSection(VOID) } DPRINT("NlsSection: Base %p Size %lx\n", - NlsSectionBase, - NlsSectionViewSize); + NlsSectionBase, + NlsSectionViewSize); NlsAnsiTableOffset = 0; RtlCopyMemory((PVOID)((ULONG)NlsSectionBase + NlsAnsiTableOffset), - NlsAnsiCodePageTable, - NlsAnsiCodePageTableSize); + NlsAnsiCodePageTable, + NlsAnsiCodePageTableSize); NlsOemTableOffset = NlsAnsiTableOffset + ROUND_UP(NlsAnsiCodePageTableSize, PAGE_SIZE); RtlCopyMemory((PVOID)((ULONG)NlsSectionBase + NlsOemTableOffset), - NlsOemCodePageTable, - NlsOemCodePageTableSize); + NlsOemCodePageTable, + NlsOemCodePageTableSize); NlsUnicodeTableOffset = NlsOemTableOffset + ROUND_UP(NlsOemCodePageTableSize, PAGE_SIZE); RtlCopyMemory((PVOID)((ULONG)NlsSectionBase + NlsUnicodeTableOffset), - NlsUnicodeCasemapTable, - NlsUnicodeCasemapTableSize); + NlsUnicodeCasemapTable, + NlsUnicodeCasemapTableSize); RtlInitNlsTables ((PVOID)((ULONG)NlsSectionBase + NlsAnsiTableOffset), - (PVOID)((ULONG)NlsSectionBase + NlsOemTableOffset), - (PVOID)((ULONG)NlsSectionBase + NlsUnicodeTableOffset), - &NlsTable); + (PVOID)((ULONG)NlsSectionBase + NlsOemTableOffset), + (PVOID)((ULONG)NlsSectionBase + NlsUnicodeTableOffset), + &NlsTable); RtlResetRtlTranslations (&NlsTable); } - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlCustomCPToUnicodeN(IN PCPTABLEINFO CustomCP, - PWCHAR UnicodeString, - ULONG UnicodeSize, - PULONG ResultSize, - PCHAR CustomString, - ULONG CustomSize) -{ - ULONG Size = 0; - ULONG i; - - if (CustomCP->DBCSCodePage == 0) - { - /* single-byte code page */ - if (CustomSize > (UnicodeSize / sizeof(WCHAR))) - Size = UnicodeSize / sizeof(WCHAR); - else - Size = CustomSize; - - if (ResultSize != NULL) - *ResultSize = Size * sizeof(WCHAR); - - for (i = 0; i < Size; i++) - { - *UnicodeString = CustomCP->MultiByteTable[(UCHAR)*CustomString]; - UnicodeString++; - CustomString++; - } - } - else - { - /* multi-byte code page */ - /* FIXME */ - } - - return(STATUS_SUCCESS); -} - - -WCHAR -RtlDowncaseUnicodeChar (IN WCHAR Source) -{ - USHORT Offset; - - if (Source < L'A') - return Source; - - if (Source <= L'Z') - return Source + (L'a' - L'A'); - - if (Source < 0x80) - return Source; - - Offset = ((USHORT)Source >> 8); - Offset = NlsUnicodeLowercaseTable[Offset]; - - Offset += (((USHORT)Source & 0x00F0) >> 4); - Offset = NlsUnicodeLowercaseTable[Offset]; - - Offset += ((USHORT)Source & 0x000F); - Offset = NlsUnicodeLowercaseTable[Offset]; - - return Source + (SHORT)Offset; -} - - -/* - * @implemented - */ -VOID STDCALL -RtlGetDefaultCodePage(PUSHORT AnsiCodePage, - PUSHORT OemCodePage) -{ - *AnsiCodePage = NlsAnsiCodePage; - *OemCodePage = NlsOemCodePage; -} - - -/* - * @implemented - */ -VOID STDCALL -RtlInitCodePageTable(IN PUSHORT TableBase, - OUT PCPTABLEINFO CodePageTable) -{ - PNLS_FILE_HEADER NlsFileHeader; - PUSHORT Ptr; - USHORT Offset; - - DPRINT("RtlInitCodePageTable() called\n"); - - NlsFileHeader = (PNLS_FILE_HEADER)TableBase; - - CodePageTable->CodePage = NlsFileHeader->CodePage; - CodePageTable->MaximumCharacterSize = NlsFileHeader->MaximumCharacterSize; - CodePageTable->DefaultChar = NlsFileHeader->DefaultChar; - CodePageTable->UniDefaultChar = NlsFileHeader->UniDefaultChar; - CodePageTable->TransDefaultChar = NlsFileHeader->TransDefaultChar; - CodePageTable->TransUniDefaultChar = NlsFileHeader->TransUniDefaultChar; - - RtlCopyMemory(&CodePageTable->LeadByte, - &NlsFileHeader->LeadByte, - MAXIMUM_LEADBYTES); - - /* Set Pointer to start of multi byte table */ - Ptr = (PUSHORT)((ULONG_PTR)TableBase + 2 * NlsFileHeader->HeaderSize); - - /* Get offset to the wide char table */ - Offset = (USHORT)(*Ptr++) + NlsFileHeader->HeaderSize + 1; - - /* Set pointer to the multi byte table */ - CodePageTable->MultiByteTable = Ptr; - - /* Skip ANSI and OEM table */ - Ptr += 256; - if (*Ptr++) - Ptr += 256; - - /* Set pointer to DBCS ranges */ - CodePageTable->DBCSRanges = (PUSHORT)Ptr; - - if (*Ptr > 0) - { - CodePageTable->DBCSCodePage = 1; - CodePageTable->DBCSOffsets = (PUSHORT)++Ptr; - } - else - { - CodePageTable->DBCSCodePage = 0; - CodePageTable->DBCSOffsets = 0; - } - - CodePageTable->WideCharTable = (PVOID)((ULONG_PTR)TableBase + 2 * Offset); -} - - -VOID STDCALL -RtlInitNlsTables(IN PUSHORT AnsiTableBase, - IN PUSHORT OemTableBase, - IN PUSHORT CaseTableBase, - OUT PNLSTABLEINFO NlsTable) -{ - DPRINT("RtlInitNlsTables()called\n"); - - RtlInitCodePageTable (AnsiTableBase, - &NlsTable->AnsiTableInfo); - - RtlInitCodePageTable (OemTableBase, - &NlsTable->OemTableInfo); - - NlsTable->UpperCaseTable = (PUSHORT)CaseTableBase + 2; - NlsTable->LowerCaseTable = (PUSHORT)CaseTableBase + *((PUSHORT)CaseTableBase + 1) + 2; -} - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlMultiByteToUnicodeN(PWCHAR UnicodeString, - ULONG UnicodeSize, - PULONG ResultSize, - const PCHAR MbString, - ULONG MbSize) -{ - ULONG Size = 0; - ULONG i; - - if (NlsMbCodePageTag == FALSE) - { - /* single-byte code page */ - if (MbSize > (UnicodeSize / sizeof(WCHAR))) - Size = UnicodeSize / sizeof(WCHAR); - else - Size = MbSize; - - if (ResultSize != NULL) - *ResultSize = Size * sizeof(WCHAR); - - for (i = 0; i < Size; i++) - UnicodeString[i] = NlsAnsiToUnicodeTable[(UCHAR)MbString[i]]; - } - else - { - /* multi-byte code page */ - /* FIXME */ - } - - return(STATUS_SUCCESS); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlMultiByteToUnicodeSize(PULONG UnicodeSize, - PCHAR MbString, - ULONG MbSize) -{ - ULONG Length; - - if (NlsMbCodePageTag == FALSE) - { - /* single-byte code page */ - *UnicodeSize = MbSize * sizeof (WCHAR); - } - else - { - /* multi-byte code page */ - for (Length = 0; MbSize; MbSize--, MbString++, Length++) - { - if (NlsLeadByteInfo[(UCHAR)*MbString] != 0) - { - if (!--MbSize) - break; /* partial char, ignore it */ - MbString++; - } - } - - *UnicodeSize = Length * sizeof(WCHAR); - } - - return STATUS_SUCCESS; -} - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlOemToUnicodeN(PWCHAR UnicodeString, - ULONG UnicodeSize, - PULONG ResultSize, - PCHAR OemString, - ULONG OemSize) -{ - ULONG Size = 0; - ULONG i; - - if (NlsMbOemCodePageTag == FALSE) - { - /* single-byte code page */ - if (OemSize > (UnicodeSize / sizeof(WCHAR))) - Size = UnicodeSize / sizeof(WCHAR); - else - Size = OemSize; - - if (ResultSize != NULL) - *ResultSize = Size * sizeof(WCHAR); - - for (i = 0; i < Size; i++) - { - *UnicodeString = NlsOemToUnicodeTable[(UCHAR)*OemString]; - UnicodeString++; - OemString++; - } - } - else - { - /* multi-byte code page */ - /* FIXME */ - } - - return(STATUS_SUCCESS); -} - - -VOID STDCALL -RtlResetRtlTranslations(IN PNLSTABLEINFO NlsTable) -{ - DPRINT("RtlResetRtlTranslations() called\n"); - - /* Set ANSI data */ - NlsAnsiToUnicodeTable = NlsTable->AnsiTableInfo.MultiByteTable; - NlsUnicodeToAnsiTable = NlsTable->AnsiTableInfo.WideCharTable; - NlsDbcsUnicodeToAnsiTable = (PWCHAR)NlsTable->AnsiTableInfo.WideCharTable; - NlsMbCodePageTag = (NlsTable->AnsiTableInfo.DBCSCodePage != 0); - NlsLeadByteInfo = NlsTable->AnsiTableInfo.DBCSOffsets; - NlsAnsiCodePage = NlsTable->AnsiTableInfo.CodePage; - DPRINT("Ansi codepage %hu\n", NlsAnsiCodePage); - - /* Set OEM data */ - NlsOemToUnicodeTable = NlsTable->OemTableInfo.MultiByteTable; - NlsUnicodeToOemTable = NlsTable->OemTableInfo.WideCharTable; - NlsDbcsUnicodeToOemTable = (PWCHAR)NlsTable->OemTableInfo.WideCharTable; - NlsMbOemCodePageTag = (NlsTable->OemTableInfo.DBCSCodePage != 0); - NlsOemLeadByteInfo = NlsTable->OemTableInfo.DBCSOffsets; - NlsOemCodePage = NlsTable->OemTableInfo.CodePage; - DPRINT("Oem codepage %hu\n", NlsOemCodePage); - - /* Set Unicode case map data */ - NlsUnicodeUpcaseTable = NlsTable->UpperCaseTable; - NlsUnicodeLowercaseTable = NlsTable->LowerCaseTable; -} - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlUnicodeToCustomCPN(IN PCPTABLEINFO CustomCP, - PCHAR CustomString, - ULONG CustomSize, - PULONG ResultSize, - PWCHAR UnicodeString, - ULONG UnicodeSize) -{ - ULONG Size = 0; - ULONG i; - - if (CustomCP->DBCSCodePage == 0) - { - /* single-byte code page */ - if (UnicodeSize > (CustomSize * sizeof(WCHAR))) - Size = CustomSize; - else - Size = UnicodeSize / sizeof(WCHAR); - - if (ResultSize != NULL) - *ResultSize = Size; - - for (i = 0; i < Size; i++) - { - *CustomString = ((PCHAR)CustomCP->WideCharTable)[(USHORT)*UnicodeString]; - CustomString++; - UnicodeString++; - } - } - else - { - /* multi-byte code page */ - /* FIXME */ - } - - return(STATUS_SUCCESS); -} - - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -RtlUnicodeToMultiByteN(PCHAR MbString, - ULONG MbSize, - PULONG ResultSize, - PWCHAR UnicodeString, - ULONG UnicodeSize) -{ - ULONG Size = 0; - ULONG i; - - if (NlsMbCodePageTag == FALSE) - { - /* single-byte code page */ - if (UnicodeSize > (MbSize * sizeof(WCHAR))) - Size = MbSize; - else - Size = UnicodeSize / sizeof(WCHAR); - - if (ResultSize != NULL) - *ResultSize = Size; - - for (i = 0; i < Size; i++) - { - *MbString = NlsUnicodeToAnsiTable[(USHORT)*UnicodeString]; - MbString++; - UnicodeString++; - } - } - else - { - /* multi-byte code page */ - /* FIXME */ - } - - return(STATUS_SUCCESS); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlUnicodeToMultiByteSize(PULONG MbSize, - PWCHAR UnicodeString, - ULONG UnicodeSize) -{ - ULONG UnicodeLength; - ULONG MbLength; - - if (NlsMbCodePageTag == FALSE) - { - /* single-byte code page */ - *MbSize = UnicodeSize / sizeof (WCHAR); - } - else - { - /* multi-byte code page */ - UnicodeLength = UnicodeSize / sizeof(WCHAR); - MbLength = 0; - while (UnicodeLength > 0) - { - if (NlsLeadByteInfo[(USHORT)*UnicodeString] & 0xff00) - MbLength++; - - MbLength++; - UnicodeLength--; - UnicodeString++; - } - - *MbSize = MbLength; - } - - return(STATUS_SUCCESS); -} - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlUnicodeToOemN(PCHAR OemString, - ULONG OemSize, - PULONG ResultSize, - PWCHAR UnicodeString, - ULONG UnicodeSize) -{ - ULONG Size = 0; - ULONG i; - - if (NlsMbOemCodePageTag == FALSE) - { - /* single-byte code page */ - if (UnicodeSize > (OemSize * sizeof(WCHAR))) - Size = OemSize; - else - Size = UnicodeSize / sizeof(WCHAR); - - if (ResultSize != NULL) - *ResultSize = Size; - - for (i = 0; i < Size; i++) - { - *OemString = NlsUnicodeToOemTable[(USHORT)*UnicodeString]; - OemString++; - UnicodeString++; - } - } - else - { - /* multi-byte code page */ - /* FIXME */ - } - - return(STATUS_SUCCESS); -} - - -/* - * @implemented - */ -WCHAR STDCALL -RtlUpcaseUnicodeChar(IN WCHAR Source) -{ - USHORT Offset; - - if (Source < L'a') - return Source; - - if (Source <= L'z') - return (Source - (L'a' - L'A')); - - Offset = ((USHORT)Source >> 8); - Offset = NlsUnicodeUpcaseTable[Offset]; - - Offset += (((USHORT)Source & 0x00F0) >> 4); - Offset = NlsUnicodeUpcaseTable[Offset]; - - Offset += ((USHORT)Source & 0x000F); - Offset = NlsUnicodeUpcaseTable[Offset]; - - return Source + (SHORT)Offset; -} - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlUpcaseUnicodeToCustomCPN(IN PCPTABLEINFO CustomCP, - PCHAR CustomString, - ULONG CustomSize, - PULONG ResultSize, - PWCHAR UnicodeString, - ULONG UnicodeSize) -{ - ULONG Size = 0; - ULONG i; - WCHAR wc; - - if (CustomCP->DBCSCodePage == 0) - { - /* single-byte code page */ - if (UnicodeSize > (CustomSize * sizeof(WCHAR))) - Size = CustomSize; - else - Size = UnicodeSize / sizeof(WCHAR); - - if (ResultSize != NULL) - *ResultSize = Size; - - for (i = 0; i < Size; i++) - { - wc = RtlUpcaseUnicodeChar(*UnicodeString); - *CustomString = ((PCHAR)CustomCP->WideCharTable)[(USHORT)wc]; - CustomString++; - UnicodeString++; - } - } - else - { - /* multi-byte code page */ - /* FIXME */ - } - - return(STATUS_SUCCESS); -} - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlUpcaseUnicodeToMultiByteN(PCHAR MbString, - ULONG MbSize, - PULONG ResultSize, - PWCHAR UnicodeString, - ULONG UnicodeSize) -{ - ULONG Size = 0; - ULONG i; - WCHAR wc; - - if (NlsMbCodePageTag == FALSE) - { - /* single-byte code page */ - if (UnicodeSize > (MbSize * sizeof(WCHAR))) - Size = MbSize; - else - Size = UnicodeSize / sizeof(WCHAR); - - if (ResultSize != NULL) - *ResultSize = Size; - - for (i = 0; i < Size; i++) - { - wc = RtlUpcaseUnicodeChar(*UnicodeString); - *MbString = NlsUnicodeToAnsiTable[(USHORT)wc]; - MbString++; - UnicodeString++; - } - } - else - { - /* multi-byte code page */ - /* FIXME */ - } - - return(STATUS_SUCCESS); -} - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlUpcaseUnicodeToOemN(PCHAR OemString, - ULONG OemSize, - PULONG ResultSize, - PWCHAR UnicodeString, - ULONG UnicodeSize) -{ - ULONG Size = 0; - ULONG i; - UCHAR wc; - - if (NlsMbOemCodePageTag == FALSE) - { - /* single-byte code page */ - if (UnicodeSize > (OemSize * sizeof(WCHAR))) - Size = OemSize; - else - Size = UnicodeSize / sizeof(WCHAR); - - if (ResultSize != NULL) - *ResultSize = Size; - - for (i = 0; i < Size; i++) - { - wc = RtlUpcaseUnicodeChar(*UnicodeString); - *OemString = NlsUnicodeToOemTable[(USHORT)wc]; - OemString++; - UnicodeString++; - } - } - else - { - /* multi-byte code page */ - /* FIXME */ - } - - return(STATUS_SUCCESS); -} - - -/* - * @unimplemented - */ -CHAR STDCALL -RtlUpperChar (IN CHAR Source) -{ - WCHAR Unicode; - CHAR Destination; - - if (NlsMbCodePageTag == FALSE) - { - /* single-byte code page */ - - /* ansi->unicode */ - Unicode = NlsAnsiToUnicodeTable[(UCHAR)Source]; - - /* upcase conversion */ - Unicode = RtlUpcaseUnicodeChar (Unicode); - - /* unicode -> ansi */ - Destination = NlsUnicodeToAnsiTable[(USHORT)Unicode]; - } - else - { - /* multi-byte code page */ - /* FIXME */ - Destination = Source; - } - - return Destination; -} - -/* EOF */ From 381799ee02e9c4d56e07621da792bda5f7da1c26 Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes <hardon@online.no> Date: Mon, 31 May 2004 19:51:47 +0000 Subject: [PATCH 1288/1463] create rtl for stuff common to ntdll/ntoskrnl svn path=/trunk/; revision=9572 --- reactos/include/ntos/rtl.h | 96 +++++++++++++++++++++++++++++++++++++- 1 file changed, 95 insertions(+), 1 deletion(-) diff --git a/reactos/include/ntos/rtl.h b/reactos/include/ntos/rtl.h index 825e28312ee..7fb853ee770 100755 --- a/reactos/include/ntos/rtl.h +++ b/reactos/include/ntos/rtl.h @@ -1,4 +1,4 @@ -/* $Id: rtl.h,v 1.28 2004/05/17 13:20:05 ekohl Exp $ +/* $Id: rtl.h,v 1.29 2004/05/31 19:51:47 gdalsnes Exp $ * */ #ifndef __DDK_RTL_H @@ -2196,6 +2196,100 @@ RtlxUnicodeStringToOemSize ( IN PUNICODE_STRING UnicodeString ); +NTSTATUS +FASTCALL +RtlpOemStringToCountedUnicodeString( + IN OUT PUNICODE_STRING UniDest, + IN POEM_STRING OemSource, + IN BOOLEAN AllocateDestinationString, + IN POOL_TYPE PoolType); + +NTSTATUS +FASTCALL +RtlpUpcaseUnicodeString( + IN OUT PUNICODE_STRING UniDest, + IN PCUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString, + IN POOL_TYPE PoolType); + +NTSTATUS +FASTCALL +RtlpUpcaseUnicodeStringToAnsiString( + IN OUT PANSI_STRING AnsiDest, + IN PUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString, + IN POOL_TYPE PoolType); + +NTSTATUS +FASTCALL +RtlpUpcaseUnicodeStringToCountedOemString( + IN OUT POEM_STRING OemDest, + IN PUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString, + IN POOL_TYPE PoolType); + +NTSTATUS +FASTCALL +RtlpUpcaseUnicodeStringToOemString ( + IN OUT POEM_STRING OemDest, + IN PUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString, + IN POOL_TYPE PoolType); + +NTSTATUS +FASTCALL +RtlpDowncaseUnicodeString( + IN OUT PUNICODE_STRING UniDest, + IN PUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString, + IN POOL_TYPE PoolType); + +NTSTATUS +FASTCALL +RtlpAnsiStringToUnicodeString( + IN OUT PUNICODE_STRING DestinationString, + IN PANSI_STRING SourceString, + IN BOOLEAN AllocateDestinationString, + IN POOL_TYPE PoolType); + +NTSTATUS +FASTCALL +RtlpUnicodeStringToAnsiString( + IN OUT PANSI_STRING AnsiDest, + IN PUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString, + IN POOL_TYPE PoolType); + +NTSTATUS +FASTCALL +RtlpOemStringToUnicodeString( + IN OUT PUNICODE_STRING UniDest, + IN POEM_STRING OemSource, + IN BOOLEAN AllocateDestinationString, + IN POOL_TYPE PoolType); + +NTSTATUS +FASTCALL +RtlpUnicodeStringToOemString( + IN OUT POEM_STRING OemDest, + IN PUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString, + IN POOL_TYPE PoolType); + +BOOLEAN +FASTCALL +RtlpCreateUnicodeString( + IN OUT PUNICODE_STRING UniDest, + IN PWSTR Source, + IN POOL_TYPE PoolType); + +NTSTATUS +FASTCALL +RtlpUnicodeStringToCountedOemString( + IN OUT POEM_STRING OemDest, + IN PUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString, + IN POOL_TYPE PoolType); /* Register io functions */ From 48da820991f1a7afa20304fdd315dcefad2b13b9 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Mon, 31 May 2004 19:52:47 +0000 Subject: [PATCH 1289/1463] Merge DDE patch from Wine: Dmitry Timoshkov <dmitry@codeweavers.com> Fix a bug in ShellExecute which called DdeCreateStringHandleW with a wrong parameter. Revert previous erroneous fix. (Fixes return value of DdeQueryString[AW] and error codes) svn path=/trunk/; revision=9573 --- reactos/lib/user32/misc/dde.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/reactos/lib/user32/misc/dde.c b/reactos/lib/user32/misc/dde.c index 37906754b46..766ab370ca0 100644 --- a/reactos/lib/user32/misc/dde.c +++ b/reactos/lib/user32/misc/dde.c @@ -512,7 +512,7 @@ UINT WDML_Initialize(LPDWORD pidInst, PFNCALLBACK pfnCallback, if (WDML_InstanceList == NULL) { - ret = DMLERR_DLL_USAGE; + ret = DMLERR_INVALIDPARAMETER; goto theError; } HeapFree(GetProcessHeap(), 0, pInstance); /* finished - release heap space used as work store */ @@ -533,11 +533,11 @@ UINT WDML_Initialize(LPDWORD pidInst, PFNCALLBACK pfnCallback, { if ((reference_inst->CBFflags & CBF_FAIL_ALLSVRXACTIONS) != CBF_FAIL_ALLSVRXACTIONS) { - /* i.e. Was set to Client-only and through APPCMD_CLIENTONLY */ + /* i.e. Was set to Client-only and through APPCMD_CLIENTONLY */ if (!(afCmd & APPCMD_CLIENTONLY)) { - ret = DMLERR_DLL_USAGE; + ret = DMLERR_INVALIDPARAMETER; goto theError; } } @@ -546,7 +546,7 @@ UINT WDML_Initialize(LPDWORD pidInst, PFNCALLBACK pfnCallback, if (pInstance->monitor != reference_inst->monitor) { - ret = DMLERR_DLL_USAGE; + ret = DMLERR_INVALIDPARAMETER; goto theError; } @@ -554,7 +554,7 @@ UINT WDML_Initialize(LPDWORD pidInst, PFNCALLBACK pfnCallback, if ((afCmd&APPCMD_CLIENTONLY) && !reference_inst->clientOnly) { - ret = DMLERR_DLL_USAGE; + ret = DMLERR_INVALIDPARAMETER; goto theError; } break; @@ -563,10 +563,6 @@ UINT WDML_Initialize(LPDWORD pidInst, PFNCALLBACK pfnCallback, } if (reference_inst->next == NULL) { - /* Crazy situation - trying to re-initialize something that has not beeen initialized !! - * - * Manual does not say what we do, cannot return DMLERR_NOT_INITIALIZED so what ? - */ ret = DMLERR_INVALIDPARAMETER; goto theError; } @@ -787,8 +783,6 @@ UINT WINAPI DdeGetLastError(DWORD idInst) DWORD error_code; WDML_INSTANCE* pInstance; - FIXME("(%ld): error reporting is weakly implemented\n", idInst); - EnterCriticalSection(&WDML_CritSect); /* First check instance @@ -796,7 +790,7 @@ UINT WINAPI DdeGetLastError(DWORD idInst) pInstance = WDML_GetInstance(idInst); if (pInstance == NULL) { - error_code = DMLERR_DLL_NOT_INITIALIZED; + error_code = DMLERR_INVALIDPARAMETER; } else { @@ -997,6 +991,7 @@ static int WDML_QueryString(WDML_INSTANCE* pInstance, HSZ hsz, LPVOID ptr, DWORD break; case CP_WINUNICODE: ret = GetAtomNameW(HSZ2ATOM(hsz), ptr, cchMax); + break; default: ERR("Unknown code page %d\n", codepage); ret = 0; From dc4726b0dac8ba5ce0adc2d174cc579789b189de Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Mon, 31 May 2004 22:39:12 +0000 Subject: [PATCH 1290/1463] integrate optional SDI mode into main explorer branch svn path=/trunk/; revision=9574 --- .../system/explorer/desktop/desktop.cpp | 4 +- reactos/subsys/system/explorer/explorer-jp.rc | 84 +- reactos/subsys/system/explorer/explorer.cpp | 26 +- reactos/subsys/system/explorer/explorer.h | 2 +- .../subsys/system/explorer/explorer_intres.h | 17 +- .../subsys/system/explorer/explorer_intres.rc | 181 +- .../subsys/system/explorer/shell/filechild.h | 2 +- .../system/explorer/shell/mainframe.cpp | 1467 +++++++++++------ .../subsys/system/explorer/shell/mainframe.h | 137 +- reactos/subsys/system/explorer/shell/pane.cpp | 4 +- reactos/subsys/system/explorer/shell/pane.h | 2 +- .../system/explorer/shell/shellbrowser.cpp | 479 +++--- .../system/explorer/shell/shellbrowser.h | 204 ++- .../system/explorer/taskbar/startmenu.cpp | 2 +- 14 files changed, 1749 insertions(+), 862 deletions(-) diff --git a/reactos/subsys/system/explorer/desktop/desktop.cpp b/reactos/subsys/system/explorer/desktop/desktop.cpp index 75bb0ed9213..0a11cfd30cc 100644 --- a/reactos/subsys/system/explorer/desktop/desktop.cpp +++ b/reactos/subsys/system/explorer/desktop/desktop.cpp @@ -481,9 +481,9 @@ LRESULT DesktopWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) HRESULT DesktopWindow::OnDefaultCommand(LPIDA pida) { - if (MainFrame::OpenShellFolders(pida, 0)) +/*@@ if (SDIMainFrame::OpenShellFolders(pida, 0)) return S_OK; - +*/ return E_NOTIMPL; } diff --git a/reactos/subsys/system/explorer/explorer-jp.rc b/reactos/subsys/system/explorer/explorer-jp.rc index c9590af0c47..04da4647358 100644 --- a/reactos/subsys/system/explorer/explorer-jp.rc +++ b/reactos/subsys/system/explorer/explorer-jp.rc @@ -1,17 +1,4 @@ -// =Memo for future Japanese maintainer= -// For future ease of maintenance, I marked "FIXME?" on strings I suspect I have -// mistranslated or I haven't translated(especially, "IDM_WINEFILE" have many -// suspected strings because I haven't tested under WINE). Others are set as is in -// purpose. BTW, I feel it strange that the word;"directory" turns into "folder" for -// Japanese Windows(..or English Windows also use "folder" instead of "directory"? I -// have no idea). I obeyed as the MS do. Also, there might be some menus which have -// different shortcut keys between EN-Win and JA-Win but I dunno which ones are =D -// Despite I'm not sure that we can use "MS UI Gothic" under ROS, I changed "MS Sans -// Serif" to "MS UI Gothic" because it's lear that MS Sans Serif doesn't suit for -// the Japanese(most of you know this, I suppose). -// - M.T - -//Microsoft Developer Studio generated resource script. +// Microsoft Visual C++ generated resource script. // #include "explorer_intres.h" @@ -26,7 +13,7 @@ #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// -// Japanese resources +// Japanisch resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) #ifdef _WIN32 @@ -39,7 +26,7 @@ LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT // Menu // -IDM_MAINFRAME MENU PRELOAD DISCARDABLE +IDM_MDIFRAME MENU BEGIN POPUP "僼傽僀儖(&F)" BEGIN @@ -49,6 +36,7 @@ BEGIN BEGIN MENUITEM "僣乕儖僶乕(&T)", ID_VIEW_TOOL_BAR MENUITEM "僗僥乕僞僗僶乕(&S)", ID_VIEW_STATUSBAR + MENUITEM "嵟怴偺忣曬偵峏怴(&R)\tF5", ID_REFRESH END POPUP "僂傿儞僪僂(&W)" BEGIN @@ -58,7 +46,6 @@ BEGIN MENUITEM "悅捈偵惍楍(&V)\tShift+F4", ID_WINDOW_TILE_VERT MENUITEM "帺摦惍楍", ID_WINDOW_AUTOSORT MENUITEM "嵟彫壔偝傟偨巕僂傿儞僪僂傪惍楍(&S)", ID_WINDOW_ARRANGE - MENUITEM "嵟怴偺忣曬偵峏怴(&R)\tF5", ID_REFRESH END POPUP "僿儖僾(&H)" BEGIN @@ -68,7 +55,7 @@ BEGIN END END -IDM_WINEFILE MENU FIXED IMPURE +IDM_WINEFILE MENU BEGIN POPUP "僼傽僀儖(&F)" BEGIN @@ -178,7 +165,7 @@ BEGIN END END -IDM_DESKTOPBAR MENU DISCARDABLE +IDM_DESKTOPBAR MENU BEGIN POPUP "" BEGIN @@ -189,14 +176,34 @@ BEGIN END END +IDM_SDIFRAME MENU +BEGIN + POPUP "僼傽僀儖(&F)" + BEGIN + MENUITEM "廔椆(&X)", ID_FILE_EXIT + END + POPUP "昞\帵(&V)" + BEGIN + MENUITEM "僣乕儖僶乕(&T)", ID_VIEW_TOOL_BAR + MENUITEM "僗僥乕僞僗僶乕(&S)", ID_VIEW_STATUSBAR + MENUITEM "嵟怴偺忣曬偵峏怴(&R)\tF5", ID_REFRESH + END + POPUP "僿儖僾(&H)" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER + MENUITEM "About &OS...", ID_ABOUT_WINDOWS + END +END + ///////////////////////////////////////////////////////////////////////////// // // Dialog // -IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +IDD_EXECUTE DIALOG 15, 13, 210, 63 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Execute" FONT 8, "MS UI Gothic" BEGIN @@ -212,8 +219,8 @@ BEGIN END IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 144, 65 -STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | - WS_SYSMENU | WS_THICKFRAME +STYLE DS_SETFONT | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | + WS_CAPTION | WS_SYSMENU | WS_THICKFRAME EXSTYLE WS_EX_APPWINDOW CAPTION "僗僞乕僩儊僯儏乕偐傜僾儘僌儔儉傪専嶕" FONT 9, "MS UI Gothic", 0, 0, 0x1 @@ -225,8 +232,8 @@ BEGIN WS_TABSTOP,7,25,130,33 END -IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 172 -STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +IDD_DESKBAR_DESKTOP DIALOG 0, 0, 212, 172 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "僨僗僋僩僢僾偺僾儘僷僥傿" FONT 9, "MS UI Gothic" BEGIN @@ -258,15 +265,15 @@ BEGIN WS_TABSTOP,159,121,46,44 END -IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 154 -STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +IDD_DESKBAR_TASKBAR DIALOG 0, 0, 210, 154 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "僞僗僋僶乕偺僾儘僷僥傿" FONT 9, "MS UI Gothic" BEGIN END -IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 154 -STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +IDD_DESKBAR_STARTMENU DIALOG 0, 0, 210, 154 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "僗僞乕僩儊僯儏乕偺僾儘僷僥傿" FONT 9, "MS UI Gothic" BEGIN @@ -278,7 +285,7 @@ END // String Table // -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN IDS_TITLE "ReactOS Explorer" IDS_START "嚼澳" @@ -297,7 +304,7 @@ BEGIN IDS_ADMIN "娗棟僣乕儖" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN IDS_NETWORK "僱僢僩儚乕僋" IDS_CONNECTIONS "僱僢僩儚乕僋愙懕" @@ -318,18 +325,18 @@ BEGIN IDS_TASKBAR "僞僗僋僶乕" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN IDS_STARTMENU "僗僞乕僩儊僯儏乕" IDS_MINIMIZE_ALL "慡僂傿儞僪僂傪嵟彫壔" END -#endif // Japanese resources +#endif // Japanisch resources ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// -// German (Germany) resources +// Deutsch (Deutschland) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) #ifdef _WIN32 @@ -343,18 +350,18 @@ LANGUAGE LANG_GERMAN, SUBLANG_GERMAN // TEXTINCLUDE // -1 TEXTINCLUDE DISCARDABLE +1 TEXTINCLUDE BEGIN "explorer_intres.h\0" END -2 TEXTINCLUDE DISCARDABLE +2 TEXTINCLUDE BEGIN "#include <windows.h>\r\n" "\0" END -3 TEXTINCLUDE DISCARDABLE +3 TEXTINCLUDE BEGIN "\r\n" "\0" @@ -362,7 +369,7 @@ END #endif // APSTUDIO_INVOKED -#endif // German (Germany) resources +#endif // Deutsch (Deutschland) resources ///////////////////////////////////////////////////////////////////////////// @@ -376,3 +383,4 @@ END ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED + diff --git a/reactos/subsys/system/explorer/explorer.cpp b/reactos/subsys/system/explorer/explorer.cpp index fb55a7c808c..5bd8f2273e4 100644 --- a/reactos/subsys/system/explorer/explorer.cpp +++ b/reactos/subsys/system/explorer/explorer.cpp @@ -535,31 +535,7 @@ void explorer_show_frame(int cmdshow, LPTSTR lpCmdLine) g_Globals._prescan_nodes = false; // create main window - HWND hMainFrame = MainFrame::Create(); - - if (hMainFrame) { - g_Globals._hMainWnd = hMainFrame; - - ShowWindow(hMainFrame, cmdshow); - UpdateWindow(hMainFrame); - - bool valid_dir = false; - - if (lpCmdLine) { - DWORD attribs = GetFileAttributes(lpCmdLine); - - if (attribs!=INVALID_FILE_ATTRIBUTES && (attribs&FILE_ATTRIBUTE_DIRECTORY)) - valid_dir = true; - else if (*lpCmdLine==':' || *lpCmdLine=='"') - valid_dir = true; - } - - // Open the first child window after initializing the application - if (valid_dir) - PostMessage(hMainFrame, PM_OPEN_WINDOW, 0, (LPARAM)lpCmdLine); - else - PostMessage(hMainFrame, PM_OPEN_WINDOW, OWM_EXPLORE|OWM_DETAILS, 0); - } + MainFrameBase::Create(lpCmdLine, true, cmdshow); } diff --git a/reactos/subsys/system/explorer/explorer.h b/reactos/subsys/system/explorer/explorer.h index be9719bf3db..4531393b92c 100644 --- a/reactos/subsys/system/explorer/explorer.h +++ b/reactos/subsys/system/explorer/explorer.h @@ -65,7 +65,7 @@ #define CLASSNAME_WINEFILETREE TEXT("WFS_Tree") -#include "shell/mainframe.h" #include "shell/pane.h" #include "shell/filechild.h" #include "shell/shellbrowser.h" +#include "shell/mainframe.h" diff --git a/reactos/subsys/system/explorer/explorer_intres.h b/reactos/subsys/system/explorer/explorer_intres.h index 666ed944e7d..1e9a4e0b1d1 100644 --- a/reactos/subsys/system/explorer/explorer_intres.h +++ b/reactos/subsys/system/explorer/explorer_intres.h @@ -56,9 +56,10 @@ #define IDB_IMAGES 107 #define IDD_EXECUTE 108 #define IDR_MAINFRAME 109 -#define IDM_MAINFRAME 110 +#define IDM_MDIFRAME 110 #define ID_EXECUTE 111 #define IDM_WINEFILE 112 +#define IDM_SDIFRAME 113 #define IDI_LOGOFF 124 #define IDI_FOLDERARROW 125 #define IDI_ARROW 125 @@ -164,11 +165,11 @@ #define ID_ABOUT_WINDOWS 40002 #define ID_ABOUT_EXPLORER 40003 #define ID_DESKTOPBAR_SETTINGS 40004 -#define ID_GO_BACK 40005 -#define ID_GO_FORWARD 40006 -#define ID_GO_HOME 40007 -#define ID_GO_SEARCH 40008 -#define ID_GO_UP 40009 +#define ID_GO_BACK 40005 +#define ID_GO_FORWARD 40006 +#define ID_GO_HOME 40007 +#define ID_GO_SEARCH 40008 +#define ID_GO_UP 40009 #define ID_STOP 40010 #define ID_MINIMIZE_ALL 40011 #define ID_EXPLORE 40012 @@ -178,6 +179,8 @@ #define ID_SHOW_HIDDEN_ICONS 40016 #define ID_CONFIG_NOTIFYAREA 40017 #define ID_CONFIG_TIME 40018 +#define ID_VIEW_MDI 40019 +#define ID_VIEW_SDI 40020 #define ID_SWITCH_DESKTOP_1 50000 #define ID_WINDOW_NEW 0xE130 #define ID_WINDOW_ARRANGE 0xE131 @@ -196,7 +199,7 @@ #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 166 -#define _APS_NEXT_COMMAND_VALUE 40019 +#define _APS_NEXT_COMMAND_VALUE 40021 #define _APS_NEXT_CONTROL_VALUE 1029 #define _APS_NEXT_SYMED_VALUE 101 #endif diff --git a/reactos/subsys/system/explorer/explorer_intres.rc b/reactos/subsys/system/explorer/explorer_intres.rc index 5222c1f0ba3..52c550ed81e 100644 --- a/reactos/subsys/system/explorer/explorer_intres.rc +++ b/reactos/subsys/system/explorer/explorer_intres.rc @@ -37,7 +37,7 @@ BEGIN END END -IDM_MAINFRAME MENU PRELOAD DISCARDABLE +IDM_MDIFRAME MENU PRELOAD DISCARDABLE BEGIN POPUP "文件(&F)" BEGIN @@ -51,7 +51,9 @@ BEGIN MENUITEM "侧边栏(&S)", ID_VIEW_SIDE_BAR MENUITEM "状态栏(&S)", ID_VIEW_STATUSBAR MENUITEM SEPARATOR + MENUITEM "刷新(&R)\tF5", ID_REFRESH MENUITEM "全屏(&U)\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&SDI", ID_VIEW_SDI END POPUP "窗口(&W)" BEGIN @@ -61,7 +63,30 @@ BEGIN MENUITEM "纵向平铺(&V)\tShift+F4", ID_WINDOW_TILE_VERT MENUITEM "自动排列(&A)", ID_WINDOW_AUTOSORT MENUITEM "全部最小化(&S)", ID_WINDOW_ARRANGE + END + POPUP "帮助(&H)" + BEGIN + MENUITEM "浏览器帮助文档(&F)...", ID_EXPLORER_FAQ + MENUITEM "关于浏览器(&A)...", ID_ABOUT_EXPLORER + MENUITEM "关于操作系统(&O)...", ID_ABOUT_WINDOWS + END +END + +IDM_SDIFRAME MENU PRELOAD DISCARDABLE +BEGIN + POPUP "文件(&F)" + BEGIN + MENUITEM "退出(&X)", ID_FILE_EXIT + END + POPUP "查看(&V)" + BEGIN + MENUITEM "工具栏(&T)", ID_VIEW_TOOL_BAR + MENUITEM "侧边栏(&S)", ID_VIEW_SIDE_BAR + MENUITEM "状态栏(&S)", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR MENUITEM "刷新(&R)\tF5", ID_REFRESH + MENUITEM "全屏(&U)\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI END POPUP "帮助(&H)" BEGIN @@ -311,7 +336,7 @@ STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME EXSTYLE WS_EX_APPWINDOW CAPTION "在开始菜单搜索程序" -FONT 8, "MS Sans Serif" +FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN LTEXT "&Filter:",IDC_STATIC,7,9,18,8 EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL @@ -417,7 +442,7 @@ LANGUAGE LANG_ROMANIAN, SUBLANG_DEFAULT // Menu // -IDM_MAINFRAME MENU PRELOAD DISCARDABLE +IDM_MDIFRAME MENU PRELOAD DISCARDABLE BEGIN POPUP "&Fi篿er" BEGIN @@ -431,7 +456,9 @@ BEGIN 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 + MENUITEM "&SDI", ID_VIEW_SDI END POPUP "&Fereastr" BEGIN @@ -441,7 +468,30 @@ BEGIN MENUITEM "Aliniaz &Vertical\tShift+F4", ID_WINDOW_TILE_VERT MENUITEM "Aranjeaz automat", ID_WINDOW_AUTOSORT MENUITEM "Aranjeaz &Simbolurile", ID_WINDOW_ARRANGE + END + POPUP "&Ajutor" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&Despre Explorer...", ID_ABOUT_EXPLORER + MENUITEM "Despre &OS...", ID_ABOUT_WINDOWS + END +END + +IDM_SDIFRAME MENU PRELOAD DISCARDABLE +BEGIN + POPUP "&Fi篿er" + BEGIN + MENUITEM "&Ie篿re", ID_FILE_EXIT + END + POPUP "&Prezentare" + BEGIN + MENUITEM "&Bara cu instrumente", ID_VIEW_TOOL_BAR + 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 + MENUITEM "&MDI", ID_VIEW_MDI END POPUP "&Ajutor" BEGIN @@ -708,7 +758,7 @@ BEGIN END END -IDM_MAINFRAME MENU PRELOAD DISCARDABLE +IDM_MDIFRAME MENU PRELOAD DISCARDABLE BEGIN POPUP "&Datei" BEGIN @@ -719,10 +769,12 @@ BEGIN MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR MENUITEM "Lauf&werkleiste", ID_VIEW_DRIVE_BAR, CHECKED - MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR + MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR MENUITEM "&Status Bar", ID_VIEW_STATUSBAR MENUITEM SEPARATOR + MENUITEM "&Aktualisieren\tF5", ID_REFRESH MENUITEM "&Vollbild\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&SDI", ID_VIEW_SDI END POPUP "&Fenster" BEGIN @@ -732,9 +784,32 @@ BEGIN MENUITEM "&Nebeneinander\tUmschalt+F4", ID_WINDOW_TILE_VERT MENUITEM "au&tomatisch anordnen", ID_WINDOW_AUTOSORT MENUITEM "&Symbole anordnen", ID_WINDOW_ARRANGE - MENUITEM "&Aktualisieren\tF5", ID_REFRESH END - POPUP "&Help" + POPUP "&Hilfe" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER + MENUITEM "About &OS...", ID_ABOUT_WINDOWS + END +END + +IDM_SDIFRAME MENU PRELOAD DISCARDABLE +BEGIN + POPUP "&Datei" + BEGIN + MENUITEM "&Beenden", ID_FILE_EXIT + END + POPUP "&Ansicht" + BEGIN + MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR + MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR + MENUITEM "&Status Bar", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Aktualisieren\tF5", ID_REFRESH + MENUITEM "&Vollbild\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI + END + POPUP "&Hilfe" BEGIN MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER @@ -778,6 +853,25 @@ BEGIN END +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO DISCARDABLE +BEGIN + IDD_ABOUT_EXPLORER, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 189 + TOPMARGIN, 7 + BOTTOMMARGIN, 102 + END +END +#endif // APSTUDIO_INVOKED + + ///////////////////////////////////////////////////////////////////////////// // // Bitmap @@ -854,25 +948,6 @@ IDI_DOT ICON DISCARDABLE "res/dot.ico" IDI_DOT_TRANS ICON DISCARDABLE "res/dot_trans.ico" IDI_DOT_RED ICON DISCARDABLE "res/dot_red.ico" -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_ABOUT_EXPLORER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 189 - TOPMARGIN, 7 - BOTTOMMARGIN, 102 - END -END -#endif // APSTUDIO_INVOKED - - ///////////////////////////////////////////////////////////////////////////// // // String Table @@ -951,7 +1026,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US // Menu // -IDM_MAINFRAME MENU PRELOAD DISCARDABLE +IDM_MDIFRAME MENU PRELOAD DISCARDABLE BEGIN POPUP "&File" BEGIN @@ -965,7 +1040,9 @@ BEGIN MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR MENUITEM "&Status Bar", ID_VIEW_STATUSBAR MENUITEM SEPARATOR + MENUITEM "&Refresh\tF5", ID_REFRESH MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&SDI", ID_VIEW_SDI END POPUP "&Window" BEGIN @@ -975,7 +1052,30 @@ BEGIN MENUITEM "Tile &Vertically\tShift+F4", ID_WINDOW_TILE_VERT MENUITEM "Arrange Automatically", ID_WINDOW_AUTOSORT MENUITEM "Arrange &Symbols", ID_WINDOW_ARRANGE + END + POPUP "&Help" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER + MENUITEM "About &OS...", ID_ABOUT_WINDOWS + END +END + +IDM_SDIFRAME MENU PRELOAD DISCARDABLE +BEGIN + POPUP "&File" + BEGIN + MENUITEM "E&xit", ID_FILE_EXIT + END + POPUP "&View" + BEGIN + MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR + MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR + MENUITEM "&Status Bar", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR MENUITEM "&Refresh\tF5", ID_REFRESH + MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI END POPUP "&Help" BEGIN @@ -1378,7 +1478,7 @@ LANGUAGE LANG_FRENCH, SUBLANG_FRENCH // Menu // -IDM_MAINFRAME MENU PRELOAD DISCARDABLE +IDM_MDIFRAME MENU PRELOAD DISCARDABLE BEGIN POPUP "&Fichier" BEGIN @@ -1392,7 +1492,9 @@ BEGIN MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR MENUITEM "Barre d'&閠at", ID_VIEW_STATUSBAR MENUITEM SEPARATOR + MENUITEM "&Refresh\tF5", ID_REFRESH MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&SDI", ID_VIEW_SDI END POPUP "&Window" BEGIN @@ -1402,7 +1504,30 @@ BEGIN MENUITEM "Tile &Vertically\tShift+F4", ID_WINDOW_TILE_VERT MENUITEM "Arrange Automatically", ID_WINDOW_AUTOSORT MENUITEM "Arrange &Symbols", ID_WINDOW_ARRANGE + END + POPUP "A&ide" + BEGIN + MENUITEM "&FAQ Explorateur...", ID_EXPLORER_FAQ + MENUITEM "A propos de l'&explorateur...", ID_ABOUT_WINDOWS + MENUITEM "A propos de l'&OS...", ID_ABOUT_EXPLORER + END +END + +IDM_SDIFRAME MENU PRELOAD DISCARDABLE +BEGIN + POPUP "&Fichier" + BEGIN + MENUITEM "&Fermer", ID_FILE_EXIT + END + POPUP "&Affichage" + BEGIN + MENUITEM "Barre d'&outils", ID_VIEW_TOOL_BAR + MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR + MENUITEM "Barre d'&閠at", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR MENUITEM "&Refresh\tF5", ID_REFRESH + MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI END POPUP "A&ide" BEGIN diff --git a/reactos/subsys/system/explorer/shell/filechild.h b/reactos/subsys/system/explorer/shell/filechild.h index bbb08fbfab1..2fea578a020 100644 --- a/reactos/subsys/system/explorer/shell/filechild.h +++ b/reactos/subsys/system/explorer/shell/filechild.h @@ -40,7 +40,7 @@ struct FileChildWndInfo : public ChildWndInfo int _open_mode; //OPEN_WINDOW_MODE }; - /// information structure for creation of ShellBrowserChild + /// information structure for creation of MDIShellBrowserChild struct ShellChildWndInfo : public FileChildWndInfo { typedef FileChildWndInfo super; diff --git a/reactos/subsys/system/explorer/shell/mainframe.cpp b/reactos/subsys/system/explorer/shell/mainframe.cpp index af334eacaaf..a4c245f161a 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.cpp +++ b/reactos/subsys/system/explorer/shell/mainframe.cpp @@ -36,7 +36,57 @@ extern HWND create_webchildwindow(const WebChildWndInfo& info); #include "../explorer_intres.h" -MainFrame::MainFrame(HWND hwnd) +HWND MainFrameBase::Create(LPCTSTR path, bool mdi, UINT cmdshow) +{ + HWND hMainFrame; + +#ifndef _NO_MDI ///@todo implement command line option to switch between MDI and SDI + if (mdi) + hMainFrame = MDIMainFrame::Create(); + else +#endif + hMainFrame = SDIMainFrame::Create(); + + if (hMainFrame) { + String sPath; + HWND hwndOld = g_Globals._hMainWnd; + + g_Globals._hMainWnd = hMainFrame; + + if (path) { + sPath = path; // copy path to avoid accessing freed memory + path = sPath; + } + + if (hwndOld) + DestroyWindow(hwndOld); + + ShowWindow(hMainFrame, cmdshow); + UpdateWindow(hMainFrame); + + bool valid_dir = false; + + if (path) { + DWORD attribs = GetFileAttributes(path); + + if (attribs!=INVALID_FILE_ATTRIBUTES && (attribs&FILE_ATTRIBUTE_DIRECTORY)) + valid_dir = true; + else if (*path==':' || *path=='"') + valid_dir = true; + } + + // Open the first child window after initializing the application + if (valid_dir) + PostMessage(hMainFrame, PM_OPEN_WINDOW, 0, (LPARAM)path); + else + PostMessage(hMainFrame, PM_OPEN_WINDOW, OWM_EXPLORE|OWM_DETAILS, 0); + } + + return hMainFrame; +} + + +MainFrameBase::MainFrameBase(HWND hwnd) : super(hwnd), _himl(ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_MASK|ILC_COLOR24, 2, 0)) { @@ -48,18 +98,6 @@ MainFrame::MainFrame(HWND hwnd) _hAccel = LoadAccelerators(g_Globals._hInstance, MAKEINTRESOURCE(IDA_EXPLORER)); - CLIENTCREATESTRUCT ccs; - - ccs.hWindowMenu = _hMenuWindow; - ccs.idFirstChild = IDW_FIRST_CHILD; - -#ifndef _NO_MDI - _hmdiclient = CreateWindowEx(0, TEXT("MDICLIENT"), NULL, - WS_CHILD|WS_CLIPCHILDREN|WS_VSCROLL|WS_HSCROLL|WS_VISIBLE|WS_BORDER, - 0, 0, 0, 0, - hwnd, 0, g_Globals._hInstance, &ccs); -#endif - TBBUTTON toolbarBtns[] = { #ifdef _NO_REBAR {0, 0, 0, BTNS_SEP, {0, 0}, 0, 0}, @@ -93,6 +131,499 @@ MainFrame::MainFrame(HWND hwnd) CheckMenuItem(_menu_info._hMenuView, ID_VIEW_TOOL_BAR, MF_BYCOMMAND|MF_CHECKED); + // address & command bar + WindowCanvas canvas(hwnd); + RECT rect = {0, 0, 0, 0}; + DrawText(canvas, TEXT("My"), -1, &rect, DT_SINGLELINE|DT_NOPREFIX|DT_CALCRECT); + HFONT hfont = GetStockFont(DEFAULT_GUI_FONT); + + _haddressedit = CreateWindow(TEXT("EDIT"), NULL, WS_CHILD|WS_VISIBLE, 0, 0, 0, rect.bottom, + hwnd, (HMENU)IDW_ADDRESSBAR, g_Globals._hInstance, 0); + SetWindowFont(_haddressedit, hfont, FALSE); + new EditController(_haddressedit); + + _hcommandedit = CreateWindow(TEXT("EDIT"), TEXT("> "), WS_CHILD|WS_VISIBLE, 0, 0, 0, rect.bottom, + hwnd, (HMENU)IDW_COMMANDBAR, g_Globals._hInstance, 0); + SetWindowFont(_hcommandedit, hfont, FALSE); + new EditController(_hcommandedit); + + /* CreateStatusWindow does not accept WS_BORDER + _hstatusbar = CreateWindowEx(WS_EX_NOPARENTNOTIFY, STATUSCLASSNAME, 0, + WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_BORDER|CCS_NODIVIDER, 0,0,0,0, + hwnd, (HMENU)IDW_STATUSBAR, g_Globals._hInstance, 0);*/ + + _hstatusbar = CreateStatusWindow(WS_CHILD|WS_VISIBLE, 0, hwnd, IDW_STATUSBAR); + CheckMenuItem(_menu_info._hMenuView, ID_VIEW_STATUSBAR, MF_BYCOMMAND|MF_CHECKED); + + _hsidebar = CreateWindowEx(WS_EX_STATICEDGE, WC_TREEVIEW, TEXT("Sidebar"), + WS_CHILD|WS_TABSTOP|WS_BORDER|/*WS_VISIBLE|*/WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_SHOWSELALWAYS|TVS_INFOTIP, + -1, -1, 200, 0, _hwnd, (HMENU)IDW_SIDEBAR, g_Globals._hInstance, 0); + + TreeView_SetImageList(_hsidebar, _himl, TVSIL_NORMAL); + + CheckMenuItem(_menu_info._hMenuView, ID_VIEW_SIDE_BAR, MF_BYCOMMAND|MF_UNCHECKED/*MF_CHECKED*/); + + + // create rebar window to manage toolbar and drivebar +#ifndef _NO_REBAR + _hwndrebar = CreateWindowEx(WS_EX_TOOLWINDOW, REBARCLASSNAME, NULL, + WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN| + RBS_VARHEIGHT|RBS_AUTOSIZE|RBS_DBLCLKTOGGLE| + CCS_NODIVIDER|CCS_NOPARENTALIGN, + 0, 0, 0, 0, _hwnd, 0, g_Globals._hInstance, 0); + + int btn_hgt = HIWORD(SendMessage(_htoolbar, TB_GETBUTTONSIZE, 0, 0)); + + REBARBANDINFO rbBand; + + rbBand.cbSize = sizeof(REBARBANDINFO); + rbBand.fMask = RBBIM_TEXT|RBBIM_STYLE|RBBIM_CHILD|RBBIM_CHILDSIZE|RBBIM_SIZE; +#ifndef RBBS_HIDETITLE // missing in MinGW headers as of 25.02.2004 +#define RBBS_HIDETITLE 0x400 +#endif + rbBand.fStyle = RBBS_CHILDEDGE|RBBS_GRIPPERALWAYS|RBBS_HIDETITLE; + + rbBand.cxMinChild = 0; + rbBand.cyMinChild = 0; + rbBand.cyChild = 0; + rbBand.cyMaxChild = 0; + rbBand.cyIntegral = btn_hgt; + + rbBand.lpText = NULL;//TEXT("Toolbar"); + rbBand.hwndChild = _htoolbar; + rbBand.cxMinChild = 0; + rbBand.cyMinChild = btn_hgt + 4; + rbBand.cx = 284; + SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand); +#endif +} + + +MainFrameBase::~MainFrameBase() +{ + ImageList_Destroy(_himl); + + // don't exit desktop when closing file manager window + if (!g_Globals._desktop_mode) + if (g_Globals._hMainWnd == _hwnd) // don't quit when switching between MDI and SDI mode + PostQuitMessage(0); +} + + +LRESULT MainFrameBase::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + LRESULT res; + + if (ProcessMessage(nmsg, wparam, lparam, &res)) + return res; + else + return super::WndProc(nmsg, wparam, lparam); +} + +bool MainFrameBase::ProcessMessage(UINT nmsg, WPARAM wparam, LPARAM lparam, LRESULT* pres) +{ + switch(nmsg) { + case PM_TRANSLATE_MSG: + *pres = TranslateMsg((MSG*)lparam); + return true; + + case WM_SHOWWINDOW: + if (wparam) // trigger child resizing after window creation - now we can succesfully call IsWindowVisible() + resize_frame_client(); + return false; // goto def; + + case WM_CLOSE: + DestroyWindow(_hwnd); + g_Globals._hMainWnd = 0; + break; + + case WM_DESTROY: + break; + + case WM_SIZE: + resize_frame(LOWORD(lparam), HIWORD(lparam)); + break; // do not pass message to DefFrameProc + + case WM_GETMINMAXINFO: { + LPMINMAXINFO lpmmi = (LPMINMAXINFO)lparam; + + lpmmi->ptMaxTrackSize.x <<= 1;/*2*GetSystemMetrics(SM_CXSCREEN) / SM_CXVIRTUALSCREEN */ + lpmmi->ptMaxTrackSize.y <<= 1;/*2*GetSystemMetrics(SM_CYSCREEN) / SM_CYVIRTUALSCREEN */ + break;} + + case PM_FRM_CALC_CLIENT: + frame_get_clientspace((PRECT)lparam); + *pres = TRUE; + return true; + + case PM_FRM_GET_MENUINFO: + *pres = (LPARAM)&_menu_info; + return true; + + case PM_GET_CONTROLWINDOW: + if (wparam == FCW_STATUS) { + *pres = (LRESULT)(HWND)_hstatusbar; + return true; + } + break; + + case PM_SETSTATUSTEXT: + SendMessage(_hstatusbar, SB_SETTEXT, 0, lparam); + break; + + case PM_URL_CHANGED: + SetWindowText(_haddressedit, (LPCTSTR)lparam); + break; + + default: + return false; + } + + *pres = 0; + return true; +} + +BOOL MainFrameBase::TranslateMsg(MSG* pmsg) +{ + if (TranslateAccelerator(_hwnd, _hAccel, pmsg)) + return TRUE; + + return FALSE; +} + + +int MainFrameBase::Command(int id, int code) +{ + CONTEXT("MainFrameBase::Command()"); + + switch(id) { + case ID_FILE_EXIT: + SendMessage(_hwnd, WM_CLOSE, 0, 0); + break; + + case ID_VIEW_TOOL_BAR: + toggle_child(_hwnd, id, _htoolbar, 0); + break; + + case ID_VIEW_STATUSBAR: + toggle_child(_hwnd, id, _hstatusbar); + break; + + case ID_VIEW_SIDE_BAR: + // lazy initialization + if (!TreeView_GetCount(_hsidebar)) + FillBookmarks(); + + toggle_child(_hwnd, id, _hsidebar); + break; + + case ID_EXECUTE: { + ExecuteDialog dlg = {{0}, 0}; + + if (DialogBoxParam(g_Globals._hInstance, MAKEINTRESOURCE(IDD_EXECUTE), _hwnd, ExecuteDialog::WndProc, (LPARAM)&dlg) == IDOK) { + CONTEXT("ShellExecute()"); + + HINSTANCE hinst = ShellExecute(_hwnd, NULL/*operation*/, dlg.cmd/*file*/, NULL/*parameters*/, NULL/*dir*/, dlg.cmdshow); + + if ((int)hinst <= 32) + display_error(_hwnd, GetLastError()); + } + break;} + + case ID_HELP: + WinHelp(_hwnd, TEXT("explorer")/*file explorer.hlp*/, HELP_INDEX, 0); + break; + + case ID_VIEW_FULLSCREEN: + CheckMenuItem(_menu_info._hMenuView, id, toggle_fullscreen()?MF_CHECKED:0); + break; + + case ID_ABOUT_WINDOWS: + ShellAbout(_hwnd, ResString(IDS_TITLE), NULL, 0); + break; + + case ID_ABOUT_EXPLORER: + explorer_about(_hwnd); + break; + + case ID_EXPLORER_FAQ: + launch_file(_hwnd, TEXT("http://www.sky.franken.de/explorer/"), SW_SHOW); + break; + + case IDW_ADDRESSBAR: + if (code == 1) { + TCHAR url[BUFFER_LEN]; + + if (GetWindowText(_haddressedit, url, BUFFER_LEN)) + go_to(url, false); + } + break; + + case IDW_COMMANDBAR: + //@todo execute command in command bar + break; + + default: + return 1; // no command handlers in Window::Command() + } + + return 0; +} + + +int MainFrameBase::Notify(int id, NMHDR* pnmh) +{ + switch(pnmh->code) { + // resize children windows when the rebar size changes + case RBN_AUTOSIZE: + resize_frame_client(); + break; + + case TVN_GETINFOTIP: { + NMTVGETINFOTIP* pnmgit = (NMTVGETINFOTIP*)pnmh; + + if (pnmgit->lParam) { + const BookmarkNode& node = *(BookmarkNode*)pnmgit->lParam; + + if (node._type == BookmarkNode::BMNT_FOLDER) { + // display tooltips for bookmark folders + if (!node._pfolder->_description.empty()) + lstrcpyn(pnmgit->pszText, node._pfolder->_description.c_str(), pnmgit->cchTextMax); + } else if (node._type == BookmarkNode::BMNT_BOOKMARK) { + // display tooltips for bookmark folders + String txt = node._pbookmark->_description; + + if (!node._pbookmark->_url.empty()) { + if (!txt.empty()) + txt += TEXT(" - "); + + txt += node._pbookmark->_url; + } + + lstrcpyn(pnmgit->pszText, txt.c_str(), pnmgit->cchTextMax); + } + } + break;} + + case NM_DBLCLK: { + HTREEITEM hitem = TreeView_GetSelection(_hsidebar); + LPARAM lparam = TreeView_GetItemData(_hsidebar, hitem); + + if (lparam) { + const BookmarkNode& node = *(BookmarkNode*)lparam; + + if (node._type == BookmarkNode::BMNT_BOOKMARK) { + bool new_window = GetAsyncKeyState(VK_SHIFT)<0; + + go_to(node._pbookmark->_url, new_window); + } + } + break;} + } + + return 0; +} + + +void MainFrameBase::resize_frame(int cx, int cy) +{ + if (cy <= 0) + return; // avoid resizing children when receiving RBN_AUTOSIZE while getting minimized + + RECT rect = {0, 0, cx, cy}; + + if (_hwndrebar) { + int height = ClientRect(_hwndrebar).bottom; + MoveWindow(_hwndrebar, rect.left, rect.top, rect.right-rect.left, height, TRUE); + rect.top += height; + } else { + if (IsWindowVisible(_htoolbar)) { + SendMessage(_htoolbar, WM_SIZE, 0, 0); + WindowRect rt(_htoolbar); + rect.top = rt.bottom; + // rect.bottom -= rt.bottom; + } + } + + if (IsWindowVisible(_hstatusbar)) { + int parts[] = {300, 500}; + + SendMessage(_hstatusbar, WM_SIZE, 0, 0); + SendMessage(_hstatusbar, SB_SETPARTS, 2, (LPARAM)&parts); + ClientRect rt(_hstatusbar); + rect.bottom -= rt.bottom; + } + + if (IsWindowVisible(_haddressedit) || IsWindowVisible(_hcommandedit)) { + ClientRect rt(_haddressedit); + rect.bottom -= rt.bottom; + + int mid = (rect.right-rect.left) / 2; ///@todo use split bar + SetWindowPos(_haddressedit, 0, 0, rect.bottom, mid, rt.bottom, SWP_NOACTIVATE|SWP_NOZORDER); + SetWindowPos(_hcommandedit, 0, mid+1, rect.bottom, rect.right-(mid+1), rt.bottom, SWP_NOACTIVATE|SWP_NOZORDER); + } + + if (IsWindowVisible(_hsidebar)) { + WindowRect rt(_hsidebar); + rect.left += rt.right-rt.left; + + SetWindowPos(_hsidebar, 0, -1, rect.top-1, rt.right-rt.left, rect.bottom-rect.top+1, SWP_NOACTIVATE|SWP_NOZORDER); + } +} + +void MainFrameBase::resize_frame_client() +{ + ClientRect rect(_hwnd); + + resize_frame(rect.right, rect.bottom); +} + +void MainFrameBase::frame_get_clientspace(PRECT prect) +{ + if (!IsIconic(_hwnd)) + GetClientRect(_hwnd, prect); + else { + WINDOWPLACEMENT wp; + + GetWindowPlacement(_hwnd, &wp); + + prect->left = prect->top = 0; + prect->right = wp.rcNormalPosition.right-wp.rcNormalPosition.left- + 2*(GetSystemMetrics(SM_CXSIZEFRAME)+GetSystemMetrics(SM_CXEDGE)); + prect->bottom = wp.rcNormalPosition.bottom-wp.rcNormalPosition.top- + 2*(GetSystemMetrics(SM_CYSIZEFRAME)+GetSystemMetrics(SM_CYEDGE))- + GetSystemMetrics(SM_CYCAPTION)-GetSystemMetrics(SM_CYMENUSIZE); + } + + if (IsWindowVisible(_htoolbar)) { + ClientRect rt(_htoolbar); + prect->top += rt.bottom+2; + } + + if (IsWindowVisible(_hstatusbar)) { + ClientRect rt(_hstatusbar); + prect->bottom -= rt.bottom; + } +} + +BOOL MainFrameBase::toggle_fullscreen() +{ + RECT rt; + + if ((_fullscreen._mode=!_fullscreen._mode)) { + GetWindowRect(_hwnd, &_fullscreen._orgPos); + _fullscreen._wasZoomed = IsZoomed(_hwnd); + + Frame_CalcFrameClient(_hwnd, &rt); + ClientToScreen(_hwnd, (LPPOINT)&rt.left); + ClientToScreen(_hwnd, (LPPOINT)&rt.right); + + rt.left = _fullscreen._orgPos.left-rt.left; + rt.top = _fullscreen._orgPos.top-rt.top; + rt.right = GetSystemMetrics(SM_CXSCREEN)+_fullscreen._orgPos.right-rt.right; + rt.bottom = GetSystemMetrics(SM_CYSCREEN)+_fullscreen._orgPos.bottom-rt.bottom; + + MoveWindow(_hwnd, rt.left, rt.top, rt.right-rt.left, rt.bottom-rt.top, TRUE); + } else { + MoveWindow(_hwnd, _fullscreen._orgPos.left, _fullscreen._orgPos.top, + _fullscreen._orgPos.right-_fullscreen._orgPos.left, + _fullscreen._orgPos.bottom-_fullscreen._orgPos.top, TRUE); + + if (_fullscreen._wasZoomed) + ShowWindow(_hwnd, WS_MAXIMIZE); + } + + return _fullscreen._mode; +} + +void MainFrameBase::fullscreen_move() +{ + RECT rt, pos; + GetWindowRect(_hwnd, &pos); + + Frame_CalcFrameClient(_hwnd, &rt); + ClientToScreen(_hwnd, (LPPOINT)&rt.left); + ClientToScreen(_hwnd, (LPPOINT)&rt.right); + + rt.left = pos.left-rt.left; + rt.top = pos.top-rt.top; + rt.right = GetSystemMetrics(SM_CXSCREEN)+pos.right-rt.right; + rt.bottom = GetSystemMetrics(SM_CYSCREEN)+pos.bottom-rt.bottom; + + MoveWindow(_hwnd, rt.left, rt.top, rt.right-rt.left, rt.bottom-rt.top, TRUE); +} + + +void MainFrameBase::toggle_child(HWND hwnd, UINT cmd, HWND hchild, int band_idx) +{ + BOOL vis = IsWindowVisible(hchild); + + CheckMenuItem(_menu_info._hMenuView, cmd, vis?MF_BYCOMMAND:MF_BYCOMMAND|MF_CHECKED); + + if (band_idx != -1) + SendMessage(_hwndrebar, RB_SHOWBAND, band_idx, !vis); + else + ShowWindow(hchild, vis? SW_HIDE: SW_SHOW); + + if (_fullscreen._mode) + fullscreen_move(); + + resize_frame_client(); +} + +void MainFrameBase::FillBookmarks() +{ + HiddenWindow hide(_hsidebar); + WindowCanvas canvas(_hwnd); + + TreeView_DeleteAllItems(_hsidebar); + + g_Globals._icon_cache.get_icon(ICID_FAVORITES).add_to_imagelist(_himl, canvas); + g_Globals._icon_cache.get_icon(ICID_BOOKMARK).add_to_imagelist(_himl, canvas); + ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_DOT), GetStockBrush(WHITE_BRUSH), canvas); + g_Globals._icon_cache.get_icon(ICID_FOLDER).add_to_imagelist(_himl, canvas); + g_Globals._icon_cache.get_icon(ICID_FOLDER).add_to_imagelist(_himl, canvas); + + TV_INSERTSTRUCT tvi; + + tvi.hParent = TVI_ROOT; + tvi.hInsertAfter = TVI_LAST; + tvi.item.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE; + ResString sFavorites(IDS_FAVORITES); + tvi.item.pszText = (LPTSTR)sFavorites.c_str(); + tvi.item.iSelectedImage = tvi.item.iImage = 0; + + HTREEITEM hitem_bookmarks = TreeView_InsertItem(_hsidebar, &tvi); + + g_Globals._favorites.fill_tree(_hsidebar, hitem_bookmarks, _himl, canvas); + + TreeView_Expand(_hsidebar, hitem_bookmarks, TVE_EXPAND); +} + + +bool MainFrameBase::go_to(LPCTSTR url, bool new_window) +{ + ///@todo SDI implementation + + return false; +} + + +#ifndef _NO_MDI + +MDIMainFrame::MDIMainFrame(HWND hwnd) + : super(hwnd) +{ + CLIENTCREATESTRUCT ccs; + + ccs.hWindowMenu = _hMenuWindow; + ccs.idFirstChild = IDW_FIRST_CHILD; + + _hmdiclient = CreateWindowEx(0, TEXT("MDICLIENT"), NULL, + WS_CHILD|WS_CLIPCHILDREN|WS_VSCROLL|WS_HSCROLL|WS_VISIBLE|WS_BORDER, + 0, 0, 0, 0, + hwnd, 0, g_Globals._hInstance, &ccs); + TBBUTTON extraBtns = {0, 0, TBSTATE_ENABLED, BTNS_SEP, {0, 0}, 0, 0}; #ifndef _NO_REBAR @@ -200,14 +731,7 @@ MainFrame::MainFrame(HWND hwnd) } - // create rebar window to manage toolbar and drivebar #ifndef _NO_REBAR - _hwndrebar = CreateWindowEx(WS_EX_TOOLWINDOW, REBARCLASSNAME, NULL, - WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN| - RBS_VARHEIGHT|RBS_AUTOSIZE|RBS_DBLCLKTOGGLE| - CCS_NODIVIDER|CCS_NOPARENTALIGN, - 0, 0, 0, 0, _hwnd, 0, g_Globals._hInstance, 0); - int btn_hgt = HIWORD(SendMessage(_htoolbar, TB_GETBUTTONSIZE, 0, 0)); REBARBANDINFO rbBand; @@ -219,19 +743,6 @@ MainFrame::MainFrame(HWND hwnd) #endif rbBand.fStyle = RBBS_CHILDEDGE|RBBS_GRIPPERALWAYS|RBBS_HIDETITLE; - rbBand.cxMinChild = 0; - rbBand.cyMinChild = 0; - rbBand.cyChild = 0; - rbBand.cyMaxChild = 0; - rbBand.cyIntegral = btn_hgt; - - rbBand.lpText = NULL;//TEXT("Toolbar"); - rbBand.hwndChild = _htoolbar; - rbBand.cxMinChild = 0; - rbBand.cyMinChild = btn_hgt + 4; - rbBand.cx = 284; - SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand); - rbBand.lpText = TEXT("Extras"); rbBand.hwndChild = _hextrabar; rbBand.cxMinChild = 0; @@ -247,63 +758,20 @@ MainFrame::MainFrame(HWND hwnd) rbBand.cx = 400; SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand); #endif - - - // address & command bar - WindowCanvas canvas(hwnd); - RECT rect = {0, 0, 0, 0}; - DrawText(canvas, TEXT("My"), -1, &rect, DT_SINGLELINE|DT_NOPREFIX|DT_CALCRECT); - HFONT hfont = GetStockFont(DEFAULT_GUI_FONT); - - _haddressedit = CreateWindow(TEXT("EDIT"), NULL, WS_CHILD|WS_VISIBLE, 0, 0, 0, rect.bottom, - hwnd, (HMENU)IDW_ADDRESSBAR, g_Globals._hInstance, 0); - SetWindowFont(_haddressedit, hfont, FALSE); - new EditController(_haddressedit); - - _hcommandedit = CreateWindow(TEXT("EDIT"), TEXT("> "), WS_CHILD|WS_VISIBLE, 0, 0, 0, rect.bottom, - hwnd, (HMENU)IDW_COMMANDBAR, g_Globals._hInstance, 0); - SetWindowFont(_hcommandedit, hfont, FALSE); - new EditController(_hcommandedit); - - /* CreateStatusWindow does not accept WS_BORDER - _hstatusbar = CreateWindowEx(WS_EX_NOPARENTNOTIFY, STATUSCLASSNAME, 0, - WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_BORDER|CCS_NODIVIDER, 0,0,0,0, - hwnd, (HMENU)IDW_STATUSBAR, g_Globals._hInstance, 0);*/ - - _hstatusbar = CreateStatusWindow(WS_CHILD|WS_VISIBLE, 0, hwnd, IDW_STATUSBAR); - CheckMenuItem(_menu_info._hMenuView, ID_VIEW_STATUSBAR, MF_BYCOMMAND|MF_CHECKED); - - _hsidebar = CreateWindowEx(WS_EX_STATICEDGE, WC_TREEVIEW, TEXT("Sidebar"), - WS_CHILD|WS_TABSTOP|WS_BORDER|/*WS_VISIBLE|*/WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_SHOWSELALWAYS|TVS_INFOTIP, - -1, -1, 200, 0, _hwnd, (HMENU)IDW_SIDEBAR, g_Globals._hInstance, 0); - - TreeView_SetImageList(_hsidebar, _himl, TVSIL_NORMAL); - - CheckMenuItem(_menu_info._hMenuView, ID_VIEW_SIDE_BAR, MF_BYCOMMAND|MF_UNCHECKED/*MF_CHECKED*/); } -MainFrame::~MainFrame() +HWND MDIMainFrame::Create() { - ImageList_Destroy(_himl); + HMENU hMenuFrame = LoadMenu(g_Globals._hInstance, MAKEINTRESOURCE(IDM_MDIFRAME)); - // don't exit desktop when closing file manager window - if (!g_Globals._desktop_mode) - PostQuitMessage(0); -} - - -HWND MainFrame::Create() -{ - HMENU hMenuFrame = LoadMenu(g_Globals._hInstance, MAKEINTRESOURCE(IDM_MAINFRAME)); - - return super::Create(WINDOW_CREATOR(MainFrame), 0, + return Window::Create(WINDOW_CREATOR(MDIMainFrame), 0, (LPCTSTR)(int)g_Globals._hframeClass, ResString(IDS_TITLE), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0/*hwndDesktop*/, hMenuFrame); } -HWND MainFrame::Create(LPCTSTR path, int mode) +HWND MDIMainFrame::Create(LPCTSTR path, int mode) { HWND hMainFrame = Create(); if (!hMainFrame) @@ -311,7 +779,7 @@ HWND MainFrame::Create(LPCTSTR path, int mode) ShowWindow(hMainFrame, SW_SHOW); - MainFrame* pMainFrame = GET_WINDOW(MainFrame, hMainFrame); + MDIMainFrame* pMainFrame = GET_WINDOW(MDIMainFrame, hMainFrame); if (pMainFrame) pMainFrame->CreateChild(path, mode); @@ -319,7 +787,7 @@ HWND MainFrame::Create(LPCTSTR path, int mode) return hMainFrame; } -HWND MainFrame::Create(LPCITEMIDLIST pidl, int mode) +HWND MDIMainFrame::Create(LPCITEMIDLIST pidl, int mode) { HWND hMainFrame = Create(); if (!hMainFrame) @@ -327,7 +795,7 @@ HWND MainFrame::Create(LPCITEMIDLIST pidl, int mode) ShowWindow(hMainFrame, SW_SHOW); - MainFrame* pMainFrame = GET_WINDOW(MainFrame, hMainFrame); + MDIMainFrame* pMainFrame = GET_WINDOW(MDIMainFrame, hMainFrame); if (pMainFrame) pMainFrame->CreateChild(pidl, mode); @@ -336,18 +804,18 @@ HWND MainFrame::Create(LPCITEMIDLIST pidl, int mode) } -ChildWindow* MainFrame::CreateChild(LPCTSTR path, int mode) +ChildWindow* MDIMainFrame::CreateChild(LPCTSTR path, int mode) { return reinterpret_cast<ChildWindow*>(SendMessage(_hwnd, PM_OPEN_WINDOW, mode, (LPARAM)path)); } -ChildWindow* MainFrame::CreateChild(LPCITEMIDLIST pidl, int mode) +ChildWindow* MDIMainFrame::CreateChild(LPCITEMIDLIST pidl, int mode) { return reinterpret_cast<ChildWindow*>(SendMessage(_hwnd, PM_OPEN_WINDOW, mode|OWM_PIDL, (LPARAM)pidl)); } -int MainFrame::OpenShellFolders(LPIDA pida, HWND hFrameWnd) +int MDIMainFrame::OpenShellFolders(LPIDA pida, HWND hFrameWnd) { int cnt = 0; @@ -369,7 +837,7 @@ int MainFrame::OpenShellFolders(LPIDA pida, HWND hFrameWnd) if (SendMessage(hFrameWnd, PM_OPEN_WINDOW, OWM_PIDL, (LPARAM)(LPCITEMIDLIST)pidl_abs)) ++cnt; } else { - if (MainFrame::Create(pidl_abs, 0)) + if (MDIMainFrame::Create(pidl_abs, 0)) ++cnt; } } catch(COMException& e) { @@ -400,54 +868,19 @@ int MainFrame::OpenShellFolders(LPIDA pida, HWND hFrameWnd) } -LRESULT MainFrame::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) + +BOOL MDIMainFrame::TranslateMsg(MSG* pmsg) { - switch(nmsg) { - case PM_TRANSLATE_MSG: { - MSG* pmsg = (MSG*) lparam; - -#ifndef _NO_MDI - if (_hmdiclient && TranslateMDISysAccel(_hmdiclient, pmsg)) - return TRUE; -#endif - - if (TranslateAccelerator(_hwnd, _hAccel, pmsg)) - return TRUE; - - return FALSE;} - - case WM_SHOWWINDOW: - if (wparam) // trigger child resizing after window creation - now we can succesfully call IsWindowVisible() - resize_frame_rect(ClientRect(_hwnd)); - goto def; - - case WM_CLOSE: - DestroyWindow(_hwnd); - g_Globals._hMainWnd = 0; - break; - - case WM_DESTROY: - break; - - case WM_SIZE: - resize_frame(LOWORD(lparam), HIWORD(lparam)); - break; // do not pass message to DefFrameProc - - case WM_GETMINMAXINFO: { - LPMINMAXINFO lpmmi = (LPMINMAXINFO)lparam; - - lpmmi->ptMaxTrackSize.x <<= 1;/*2*GetSystemMetrics(SM_CXSCREEN) / SM_CXVIRTUALSCREEN */ - lpmmi->ptMaxTrackSize.y <<= 1;/*2*GetSystemMetrics(SM_CYSCREEN) / SM_CYVIRTUALSCREEN */ - break;} - - case PM_FRM_CALC_CLIENT: - frame_get_clientspace((PRECT)lparam); + if (_hmdiclient && TranslateMDISysAccel(_hmdiclient, pmsg)) return TRUE; - case PM_FRM_GET_MENUINFO: - return (LPARAM)&_menu_info; + return super::TranslateMsg(pmsg); +} - case PM_OPEN_WINDOW: {CONTEXT("PM_OPEN_WINDOW"); +LRESULT MDIMainFrame::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + switch(nmsg) { + case PM_OPEN_WINDOW: {CONTEXT("MDIMainFrame PM_OPEN_WINDOW"); TCHAR buffer[MAX_PATH]; LPCTSTR path; ShellPath shell_path = DesktopFolderPath(); @@ -496,46 +929,32 @@ LRESULT MainFrame::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) create_info._open_mode = (OPEN_WINDOW_MODE)wparam; // FileChildWindow::create(_hmdiclient, create_info); - return (LRESULT)ShellBrowserChild::create(create_info); + return (LRESULT)MDIShellBrowserChild::create(create_info); } return TRUE;} // success - case PM_GET_CONTROLWINDOW: - if (wparam == FCW_STATUS) - return (LRESULT)(HWND)_hstatusbar; - break; + default: { + LRESULT res; - case PM_SETSTATUSTEXT: - SendMessage(_hstatusbar, SB_SETTEXT, 0, lparam); - break; - - case PM_URL_CHANGED: - SetWindowText(_haddressedit, (LPCTSTR)lparam); - break; - - default: def: -#ifndef _NO_MDI - return DefFrameProc(_hwnd, _hmdiclient, nmsg, wparam, lparam); -#else - return super::WndProc(nmsg, wparam, lparam); -#endif + if (super::ProcessMessage(nmsg, wparam, lparam, &res)) + return res; + else + return DefFrameProc(_hwnd, _hmdiclient, nmsg, wparam, lparam); + } } return 0; } - -int MainFrame::Command(int id, int code) +int MDIMainFrame::Command(int id, int code) { - CONTEXT("MainFrame::Command()"); + CONTEXT("MDIMainFrame::Command()"); -#ifndef _NO_MDI HWND hwndClient = (HWND) SendMessage(_hmdiclient, WM_MDIGETACTIVE, 0, 0); if (hwndClient) if (SendMessage(hwndClient, PM_DISPATCH_COMMAND, MAKELONG(id,code), 0)) return 0; -#endif if (id>=ID_DRIVE_FIRST && id<=ID_DRIVE_FIRST+0xFF) { TCHAR drv[_MAX_DRIVE], path[MAX_PATH]; @@ -545,10 +964,8 @@ int MainFrame::Command(int id, int code) while(*root) ++root; -#ifndef _NO_MDI if (activate_drive_window(root)) return 0; -#endif _tsplitpath(root, drv, 0, 0, 0); @@ -559,32 +976,20 @@ int MainFrame::Command(int id, int code) GetCurrentDirectory(MAX_PATH, path); ///@todo store last directory per drive -#ifndef _NO_MDI FileChildWindow::create(FileChildWndInfo(_hmdiclient, path)); -#else - ///@todo SDI implementation -#endif + return 1; } switch(id) { - case ID_FILE_EXIT: - SendMessage(_hwnd, WM_CLOSE, 0, 0); - break; - case ID_WINDOW_NEW: { TCHAR path[MAX_PATH]; GetCurrentDirectory(MAX_PATH, path); -#ifndef _NO_MDI FileChildWindow::create(FileChildWndInfo(_hmdiclient, path)); -#else - ///@todo SDI implementation -#endif break;} -#ifndef _NO_MDI case ID_WINDOW_CASCADE: SendMessage(_hmdiclient, WM_MDICASCADE, 0, 0); break; @@ -600,11 +1005,6 @@ int MainFrame::Command(int id, int code) case ID_WINDOW_ARRANGE: SendMessage(_hmdiclient, WM_MDIICONARRANGE, 0, 0); break; -#endif - - case ID_VIEW_TOOL_BAR: - toggle_child(_hwnd, id, _htoolbar, 0); - break; case ID_VIEW_EXTRA_BAR: toggle_child(_hwnd, id, _hextrabar, 1); @@ -614,39 +1014,6 @@ int MainFrame::Command(int id, int code) toggle_child(_hwnd, id, _hdrivebar, 2); break; - case ID_VIEW_STATUSBAR: - toggle_child(_hwnd, id, _hstatusbar); - break; - - case ID_VIEW_SIDE_BAR: - // lazy initialization - if (!TreeView_GetCount(_hsidebar)) - FillBookmarks(); - - toggle_child(_hwnd, id, _hsidebar); - break; - - case ID_EXECUTE: { - ExecuteDialog dlg = {{0}, 0}; - - if (DialogBoxParam(g_Globals._hInstance, MAKEINTRESOURCE(IDD_EXECUTE), _hwnd, ExecuteDialog::WndProc, (LPARAM)&dlg) == IDOK) { - CONTEXT("ShellExecute()"); - - HINSTANCE hinst = ShellExecute(_hwnd, NULL/*operation*/, dlg.cmd/*file*/, NULL/*parameters*/, NULL/*dir*/, dlg.cmdshow); - - if ((int)hinst <= 32) - display_error(_hwnd, GetLastError()); - } - break;} - - case ID_HELP: - WinHelp(_hwnd, TEXT("explorer")/*file explorer.hlp*/, HELP_INDEX, 0); - break; - - case ID_VIEW_FULLSCREEN: - CheckMenuItem(_menu_info._hMenuView, id, toggle_fullscreen()?MF_CHECKED:0); - break; - #ifdef __WINE__ case ID_DRIVE_UNIX_FS: { TCHAR path[MAX_PATH]; @@ -654,78 +1021,56 @@ int MainFrame::Command(int id, int code) getcwd(path, MAX_PATH); -#ifndef _NO_MDI if (activate_child_window(TEXT("unixfs"))) break; FileChildWindow::create(_hmdiclient, FileChildWndInfo(path)); -#else - ///@todo SDI implementation -#endif break;} #endif case ID_DRIVE_DESKTOP: { TCHAR path[MAX_PATH]; -#ifndef _NO_MDI if (activate_child_window(TEXT("Desktop"))) break; -#endif GetCurrentDirectory(MAX_PATH, path); - ShellBrowserChild::create(ShellChildWndInfo(_hmdiclient, path, DesktopFolderPath())); + MDIShellBrowserChild::create(ShellChildWndInfo(_hmdiclient, path, DesktopFolderPath())); break;} case ID_DRIVE_SHELL_NS: { TCHAR path[MAX_PATH]; GetCurrentDirectory(MAX_PATH, path); -#ifndef _NO_MDI if (activate_child_window(TEXT("Shell"))) break; FileChildWindow::create(ShellChildWndInfo(_hmdiclient, path, DesktopFolderPath())); -#else - ///@todo SDI implementation -#endif break;} case ID_DRIVE_NTOBJ_NS: { -#ifndef _NO_MDI if (activate_child_window(TEXT("NTOBJ"))) break; FileChildWindow::create(NtObjChildWndInfo(_hmdiclient, TEXT("\\"))); -#else - ///@todo SDI implementation -#endif break;} case ID_DRIVE_REGISTRY: { if (activate_child_window(TEXT("Registry"))) break; -#ifndef _NO_MDI FileChildWindow::create(RegistryChildWndInfo(_hmdiclient, TEXT("\\"))); -#else - ///@todo SDI implementation -#endif break;} case ID_DRIVE_FAT: { ///@todo prompt for image file -#ifndef _NO_MDI if (activate_child_window(TEXT("FAT"))) break; FileChildWindow::create(FATChildWndInfo(_hmdiclient, TEXT("FAT Image"))); //@@ -#else - ///@todo SDI implementation -#endif break;} case ID_WEB_WINDOW: @@ -736,131 +1081,72 @@ int MainFrame::Command(int id, int code) #endif break; - ///@todo There are even more menu items! - - case ID_ABOUT_WINDOWS: - ShellAbout(_hwnd, ResString(IDS_TITLE), NULL, 0); - break; - - case ID_ABOUT_EXPLORER: - explorer_about(_hwnd); - break; - case ID_EXPLORER_FAQ: create_webchildwindow(WebChildWndInfo(_hmdiclient, TEXT("http://www.sky.franken.de/explorer/"))); break; - case IDW_ADDRESSBAR: - if (code == 1) { - TCHAR url[BUFFER_LEN]; - - if (GetWindowText(_haddressedit, url, BUFFER_LEN)) - go_to(url, false); - } + case ID_VIEW_SDI: + MainFrameBase::Create(NULL, false); break; - case IDW_COMMANDBAR: - //@todo execute command in command bar - break; + ///@todo There are even more menu items! default: -#ifndef _NO_MDI - return DefFrameProc(_hwnd, _hmdiclient, WM_COMMAND, MAKELONG(id,code), 0); -#else - return 1; -#endif + if (super::Command(id, code) == 0) + return 0; + else + return DefFrameProc(_hwnd, _hmdiclient, WM_COMMAND, MAKELONG(id,code), 0); } return 0; } -int MainFrame::Notify(int id, NMHDR* pnmh) +void MDIMainFrame::frame_get_clientspace(PRECT prect) { - switch(pnmh->code) { - case RBN_AUTOSIZE: - resize_frame_rect(ClientRect(_hwnd)); - break; + super::frame_get_clientspace(prect); - case TVN_GETINFOTIP: { - NMTVGETINFOTIP* pnmgit = (NMTVGETINFOTIP*)pnmh; - - if (pnmgit->lParam) { - const BookmarkNode& node = *(BookmarkNode*)pnmgit->lParam; - - if (node._type == BookmarkNode::BMNT_FOLDER) { - // display tooltips for bookmark folders - if (!node._pfolder->_description.empty()) - lstrcpyn(pnmgit->pszText, node._pfolder->_description.c_str(), pnmgit->cchTextMax); - } else if (node._type == BookmarkNode::BMNT_BOOKMARK) { - // display tooltips for bookmark folders - String txt = node._pbookmark->_description; - - if (!node._pbookmark->_url.empty()) { - if (!txt.empty()) - txt += TEXT(" - "); - - txt += node._pbookmark->_url; - } - - lstrcpyn(pnmgit->pszText, txt.c_str(), pnmgit->cchTextMax); - } - } - break;} - - case NM_DBLCLK: { - HTREEITEM hitem = TreeView_GetSelection(_hsidebar); - LPARAM lparam = TreeView_GetItemData(_hsidebar, hitem); - - if (lparam) { - const BookmarkNode& node = *(BookmarkNode*)lparam; - - if (node._type == BookmarkNode::BMNT_BOOKMARK) { - bool new_window = GetAsyncKeyState(VK_SHIFT)<0; - - go_to(node._pbookmark->_url, new_window); - } - } - break;} + if (IsWindowVisible(_hdrivebar)) { + ClientRect rt(_hdrivebar); + prect->top += rt.bottom+2; } - - return 0; } - -void MainFrame::resize_frame_rect(PRECT prect) +void MDIMainFrame::resize_frame(int cx, int cy) { - if (prect->bottom <= prect->top) + if (cy <= 0) return; // avoid resizing children when receiving RBN_AUTOSIZE while getting minimized + RECT rect = {0, 0, cx, cy}; + if (_hwndrebar) { int height = ClientRect(_hwndrebar).bottom; - MoveWindow(_hwndrebar, prect->left, prect->top, prect->right-prect->left, height, TRUE); - prect->top += height; + MoveWindow(_hwndrebar, rect.left, rect.top, rect.right-rect.left, height, TRUE); + rect.top += height; } else { if (IsWindowVisible(_htoolbar)) { SendMessage(_htoolbar, WM_SIZE, 0, 0); WindowRect rt(_htoolbar); - prect->top = rt.bottom; - // prect->bottom -= rt.bottom; + rect.top = rt.bottom; + // rect.bottom -= rt.bottom; } if (IsWindowVisible(_hextrabar)) { SendMessage(_hextrabar, WM_SIZE, 0, 0); WindowRect rt(_hextrabar); - int new_top = --prect->top + rt.bottom; - MoveWindow(_hextrabar, 0, prect->top, rt.right, new_top, TRUE); - prect->top = new_top; - // prect->bottom -= rt.bottom; + int new_top = --rect.top + rt.bottom; + MoveWindow(_hextrabar, 0, rect.top, rt.right, new_top, TRUE); + rect.top = new_top; + // rect.bottom -= rt.bottom; } if (IsWindowVisible(_hdrivebar)) { SendMessage(_hdrivebar, WM_SIZE, 0, 0); WindowRect rt(_hdrivebar); - int new_top = --prect->top + rt.bottom; - MoveWindow(_hdrivebar, 0, prect->top, rt.right, new_top, TRUE); - prect->top = new_top; - // prect->bottom -= rt.bottom; + int new_top = --rect.top + rt.bottom; + MoveWindow(_hdrivebar, 0, rect.top, rt.right, new_top, TRUE); + rect.top = new_top; + // rect.bottom -= rt.bottom; } } @@ -870,149 +1156,29 @@ void MainFrame::resize_frame_rect(PRECT prect) SendMessage(_hstatusbar, WM_SIZE, 0, 0); SendMessage(_hstatusbar, SB_SETPARTS, 2, (LPARAM)&parts); ClientRect rt(_hstatusbar); - prect->bottom -= rt.bottom; + rect.bottom -= rt.bottom; } if (IsWindowVisible(_haddressedit) || IsWindowVisible(_hcommandedit)) { ClientRect rt(_haddressedit); - prect->bottom -= rt.bottom; + rect.bottom -= rt.bottom; - int mid = (prect->right-prect->left) / 2; ///@todo use split bar - SetWindowPos(_haddressedit, 0, 0, prect->bottom, mid, rt.bottom, SWP_NOACTIVATE|SWP_NOZORDER); - SetWindowPos(_hcommandedit, 0, mid+1, prect->bottom, prect->right-(mid+1), rt.bottom, SWP_NOACTIVATE|SWP_NOZORDER); + int mid = (rect.right-rect.left) / 2; ///@todo use split bar + SetWindowPos(_haddressedit, 0, 0, rect.bottom, mid, rt.bottom, SWP_NOACTIVATE|SWP_NOZORDER); + SetWindowPos(_hcommandedit, 0, mid+1, rect.bottom, rect.right-(mid+1), rt.bottom, SWP_NOACTIVATE|SWP_NOZORDER); } if (IsWindowVisible(_hsidebar)) { WindowRect rt(_hsidebar); - prect->left += rt.right-rt.left; + rect.left += rt.right-rt.left; - SetWindowPos(_hsidebar, 0, -1, prect->top-1, rt.right-rt.left, prect->bottom-prect->top+1, SWP_NOACTIVATE|SWP_NOZORDER); + SetWindowPos(_hsidebar, 0, -1, rect.top-1, rt.right-rt.left, rect.bottom-rect.top+1, SWP_NOACTIVATE|SWP_NOZORDER); } -#ifndef _NO_MDI - MoveWindow(_hmdiclient, prect->left-1, prect->top-1, prect->right-prect->left+2, prect->bottom-prect->top+1, TRUE); -#endif + MoveWindow(_hmdiclient, rect.left-1, rect.top-1, rect.right-rect.left+2, rect.bottom-rect.top+1, TRUE); } -void MainFrame::resize_frame(int cx, int cy) -{ - RECT rect; - - rect.left = 0; - rect.top = 0; - rect.right = cx; - rect.bottom = cy; - - resize_frame_rect(&rect); -} - -void MainFrame::resize_frame_client() -{ - ClientRect rect(_hwnd); - - resize_frame_rect(&rect); -} - -void MainFrame::frame_get_clientspace(PRECT prect) -{ - if (!IsIconic(_hwnd)) - GetClientRect(_hwnd, prect); - else { - WINDOWPLACEMENT wp; - - GetWindowPlacement(_hwnd, &wp); - - prect->left = prect->top = 0; - prect->right = wp.rcNormalPosition.right-wp.rcNormalPosition.left- - 2*(GetSystemMetrics(SM_CXSIZEFRAME)+GetSystemMetrics(SM_CXEDGE)); - prect->bottom = wp.rcNormalPosition.bottom-wp.rcNormalPosition.top- - 2*(GetSystemMetrics(SM_CYSIZEFRAME)+GetSystemMetrics(SM_CYEDGE))- - GetSystemMetrics(SM_CYCAPTION)-GetSystemMetrics(SM_CYMENUSIZE); - } - - if (IsWindowVisible(_htoolbar)) { - ClientRect rt(_htoolbar); - prect->top += rt.bottom+2; - } - - if (IsWindowVisible(_hdrivebar)) { - ClientRect rt(_hdrivebar); - prect->top += rt.bottom+2; - } - - if (IsWindowVisible(_hstatusbar)) { - ClientRect rt(_hstatusbar); - prect->bottom -= rt.bottom; - } -} - -BOOL MainFrame::toggle_fullscreen() -{ - RECT rt; - - if ((_fullscreen._mode=!_fullscreen._mode)) { - GetWindowRect(_hwnd, &_fullscreen._orgPos); - _fullscreen._wasZoomed = IsZoomed(_hwnd); - - Frame_CalcFrameClient(_hwnd, &rt); - ClientToScreen(_hwnd, (LPPOINT)&rt.left); - ClientToScreen(_hwnd, (LPPOINT)&rt.right); - - rt.left = _fullscreen._orgPos.left-rt.left; - rt.top = _fullscreen._orgPos.top-rt.top; - rt.right = GetSystemMetrics(SM_CXSCREEN)+_fullscreen._orgPos.right-rt.right; - rt.bottom = GetSystemMetrics(SM_CYSCREEN)+_fullscreen._orgPos.bottom-rt.bottom; - - MoveWindow(_hwnd, rt.left, rt.top, rt.right-rt.left, rt.bottom-rt.top, TRUE); - } else { - MoveWindow(_hwnd, _fullscreen._orgPos.left, _fullscreen._orgPos.top, - _fullscreen._orgPos.right-_fullscreen._orgPos.left, - _fullscreen._orgPos.bottom-_fullscreen._orgPos.top, TRUE); - - if (_fullscreen._wasZoomed) - ShowWindow(_hwnd, WS_MAXIMIZE); - } - - return _fullscreen._mode; -} - -void MainFrame::fullscreen_move() -{ - RECT rt, pos; - GetWindowRect(_hwnd, &pos); - - Frame_CalcFrameClient(_hwnd, &rt); - ClientToScreen(_hwnd, (LPPOINT)&rt.left); - ClientToScreen(_hwnd, (LPPOINT)&rt.right); - - rt.left = pos.left-rt.left; - rt.top = pos.top-rt.top; - rt.right = GetSystemMetrics(SM_CXSCREEN)+pos.right-rt.right; - rt.bottom = GetSystemMetrics(SM_CYSCREEN)+pos.bottom-rt.bottom; - - MoveWindow(_hwnd, rt.left, rt.top, rt.right-rt.left, rt.bottom-rt.top, TRUE); -} - - -void MainFrame::toggle_child(HWND hwnd, UINT cmd, HWND hchild, int band_idx) -{ - BOOL vis = IsWindowVisible(hchild); - - CheckMenuItem(_menu_info._hMenuView, cmd, vis?MF_BYCOMMAND:MF_BYCOMMAND|MF_CHECKED); - - if (band_idx != -1) - SendMessage(_hwndrebar, RB_SHOWBAND, band_idx, !vis); - else - ShowWindow(hchild, vis?SW_HIDE:SW_SHOW); - - if (_fullscreen._mode) - fullscreen_move(); - - resize_frame_client(); -} - -#ifndef _NO_MDI -bool MainFrame::activate_drive_window(LPCTSTR path) +bool MDIMainFrame::activate_drive_window(LPCTSTR path) { TCHAR drv1[_MAX_DRIVE], drv2[_MAX_DRIVE]; HWND child_wnd; @@ -1040,7 +1206,7 @@ bool MainFrame::activate_drive_window(LPCTSTR path) return false; } -bool MainFrame::activate_child_window(LPCTSTR filesys) +bool MDIMainFrame::activate_child_window(LPCTSTR filesys) { HWND child_wnd; @@ -1058,7 +1224,7 @@ bool MainFrame::activate_child_window(LPCTSTR filesys) return true; } } else { - ShellBrowserChild* shell_child = (ShellBrowserChild*) SendMessage(child_wnd, PM_GET_SHELLBROWSER_PTR, 0, 0); + ShellBrowser* shell_child = (ShellBrowser*) SendMessage(child_wnd, PM_GET_SHELLBROWSER_PTR, 0, 0); if (shell_child) { if (!lstrcmpi(shell_child->get_root()._fs, filesys)) { @@ -1076,41 +1242,8 @@ bool MainFrame::activate_child_window(LPCTSTR filesys) return false; } -void MainFrame::FillBookmarks() +bool MDIMainFrame::go_to(LPCTSTR url, bool new_window) { - HiddenWindow hide(_hsidebar); - WindowCanvas canvas(_hwnd); - - TreeView_DeleteAllItems(_hsidebar); - - g_Globals._icon_cache.get_icon(ICID_FAVORITES).add_to_imagelist(_himl, canvas); - g_Globals._icon_cache.get_icon(ICID_BOOKMARK).add_to_imagelist(_himl, canvas); - ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_DOT), GetStockBrush(WHITE_BRUSH), canvas); - g_Globals._icon_cache.get_icon(ICID_FOLDER).add_to_imagelist(_himl, canvas); - g_Globals._icon_cache.get_icon(ICID_FOLDER).add_to_imagelist(_himl, canvas); - - TV_INSERTSTRUCT tvi; - - tvi.hParent = TVI_ROOT; - tvi.hInsertAfter = TVI_LAST; - tvi.item.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE; - ResString sFavorites(IDS_FAVORITES); - tvi.item.pszText = (LPTSTR)sFavorites.c_str(); - tvi.item.iSelectedImage = tvi.item.iImage = 0; - - HTREEITEM hitem_bookmarks = TreeView_InsertItem(_hsidebar, &tvi); - - g_Globals._favorites.fill_tree(_hsidebar, hitem_bookmarks, _himl, canvas); - - TreeView_Expand(_hsidebar, hitem_bookmarks, TVE_EXPAND); -} - -#endif - - -bool MainFrame::go_to(LPCTSTR url, bool new_window) -{ -#ifndef _NO_MDI if (!new_window) { HWND hwndClient = (HWND) SendMessage(_hmdiclient, WM_MDIGETACTIVE, 0, 0); @@ -1121,9 +1254,369 @@ bool MainFrame::go_to(LPCTSTR url, bool new_window) if (CreateChild(url)) return true; -#else - ///@todo SDI implementation -#endif - return false; + return super::go_to(url, new_window); +} + +#endif // _NO_MDI + + +SDIMainFrame::SDIMainFrame(HWND hwnd) + : super(hwnd) +{ + _split_pos = DEFAULT_SPLIT_POS; + _last_split = DEFAULT_SPLIT_POS; + + // create image list for explorer tree view + init_himl(); + + /* wait for PM_OPEN_WINDOW message before creating a shell view + update_shell_browser();*/ +} + +HWND SDIMainFrame::Create() +{ + HMENU hMenuFrame = LoadMenu(g_Globals._hInstance, MAKEINTRESOURCE(IDM_SDIFRAME)); + + return Window::Create(WINDOW_CREATOR(SDIMainFrame), 0, + (LPCTSTR)(int)g_Globals._hframeClass, ResString(IDS_TITLE), WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + 0/*hwndDesktop*/, hMenuFrame); +} + +LRESULT SDIMainFrame::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + switch(nmsg) { + case WM_SIZE: + resize_frame(LOWORD(lparam), HIWORD(lparam)); + break; + + case WM_PAINT: { + PaintCanvas canvas(_hwnd); + ClientRect rt(_hwnd); + rt.left = _split_pos-SPLIT_WIDTH/2; + rt.right = _split_pos+SPLIT_WIDTH/2+1; + + if (_right_hwnd) { + WindowRect right_rect(_right_hwnd); + ScreenToClient(_hwnd, &right_rect); + rt.top = right_rect.top; + rt.bottom = right_rect.bottom; + } + + HBRUSH lastBrush = SelectBrush(canvas, GetStockBrush(COLOR_SPLITBAR)); + Rectangle(canvas, rt.left, rt.top-1, rt.right, rt.bottom+1); + SelectObject(canvas, lastBrush); + break;} + + case WM_SETCURSOR: + if (LOWORD(lparam) == HTCLIENT) { + POINT pt; + GetCursorPos(&pt); + ScreenToClient(_hwnd, &pt); + + if (pt.x>=_split_pos-SPLIT_WIDTH/2 && pt.x<_split_pos+SPLIT_WIDTH/2+1) { + SetCursor(LoadCursor(0, IDC_SIZEWE)); + return TRUE; + } + } + goto def; + + case WM_LBUTTONDOWN: { + int x = GET_X_LPARAM(lparam); + + ClientRect rt(_hwnd); + + if (x>=_split_pos-SPLIT_WIDTH/2 && x<_split_pos+SPLIT_WIDTH/2+1) { + _last_split = _split_pos; + SetCapture(_hwnd); + } + + break;} + + case WM_LBUTTONUP: + if (GetCapture() == _hwnd) + ReleaseCapture(); + break; + + case WM_KEYDOWN: + if (wparam == VK_ESCAPE) + if (GetCapture() == _hwnd) { + _split_pos = _last_split; + resize_children(); + _last_split = -1; + ReleaseCapture(); + SetCursor(LoadCursor(0, IDC_ARROW)); + } + break; + + case WM_MOUSEMOVE: + if (GetCapture() == _hwnd) { + int x = LOWORD(lparam); + + ClientRect rt(_hwnd); + + if (x>=0 && x<rt.right) { + _split_pos = x; + resize_children(); + rt.left = x-SPLIT_WIDTH/2; + rt.right = x+SPLIT_WIDTH/2+1; + InvalidateRect(_hwnd, &rt, FALSE); + UpdateWindow(_left_hwnd); + UpdateWindow(_hwnd); + UpdateWindow(_right_hwnd); + } + } + break; + + case PM_OPEN_WINDOW: {CONTEXT("SDIMainFrame PM_OPEN_WINDOW"); + TCHAR buffer[MAX_PATH]; + LPCTSTR path; + ShellPath shell_path = DesktopFolderPath(); + + if (lparam) { + if (wparam & OWM_PIDL) { + // take over PIDL from lparam + shell_path.assign((LPCITEMIDLIST)lparam); // create as "rooted" window + FileSysShellPath fsp(shell_path); + path = fsp; + + if (path) { + LOG(FmtString(TEXT("PM_OPEN_WINDOW: path=%s"), path)); + lstrcpy(buffer, path); + path = buffer; + } + } else { + // take over path from lparam + path = (LPCTSTR)lparam; + shell_path = path; // create as "rooted" window + } + } else { + ///@todo read paths and window placements from registry + if (!GetCurrentDirectory(MAX_PATH, buffer)) + *buffer = '\0'; + + path = buffer; + } + + jump_to(shell_path, (OPEN_WINDOW_MODE)wparam); + return TRUE;} // success + + default: def: + return super::WndProc(nmsg, wparam, lparam); + } + + return 0; +} + +int SDIMainFrame::Command(int id, int code) +{ + switch(id) { + case ID_VIEW_MDI: + MainFrameBase::Create(_url, true); + break; + + default: + return super::Command(id, code); + } + + return 0; +} + +void SDIMainFrame::resize_frame(int cx, int cy) +{ + if (cy <= 0) + return; // avoid resizing children when receiving RBN_AUTOSIZE while getting minimized + + RECT rect = {0, 0, cx, cy}; + + if (_hwndrebar) { + int height = ClientRect(_hwndrebar).bottom; + MoveWindow(_hwndrebar, rect.left, rect.top, rect.right-rect.left, height, TRUE); + rect.top += height; + } else { + if (IsWindowVisible(_htoolbar)) { + SendMessage(_htoolbar, WM_SIZE, 0, 0); + WindowRect rt(_htoolbar); + rect.top = rt.bottom; + // rect.bottom -= rt.bottom; + } + } + + if (IsWindowVisible(_hstatusbar)) { + int parts[] = {300, 500}; + + SendMessage(_hstatusbar, WM_SIZE, 0, 0); + SendMessage(_hstatusbar, SB_SETPARTS, 2, (LPARAM)&parts); + ClientRect rt(_hstatusbar); + rect.bottom -= rt.bottom; + } + + if (IsWindowVisible(_haddressedit) || IsWindowVisible(_hcommandedit)) { + ClientRect rt(_haddressedit); + rect.bottom -= rt.bottom; + + int mid = (rect.right-rect.left) / 2; ///@todo use split bar + SetWindowPos(_haddressedit, 0, 0, rect.bottom, mid, rt.bottom, SWP_NOACTIVATE|SWP_NOZORDER); + SetWindowPos(_hcommandedit, 0, mid+1, rect.bottom, rect.right-(mid+1), rt.bottom, SWP_NOACTIVATE|SWP_NOZORDER); + } + + if (IsWindowVisible(_hsidebar)) { + WindowRect rt(_hsidebar); + rect.left += rt.right-rt.left; + + SetWindowPos(_hsidebar, 0, -1, rect.top-1, rt.right-rt.left, rect.bottom-rect.top+1, SWP_NOACTIVATE|SWP_NOZORDER); + } + + _clnt_rect = rect; + + resize_children(); +} + +void SDIMainFrame::resize_children() +{ + HDWP hdwp = BeginDeferWindowPos(2); + + int cx = _clnt_rect.left; + + if (_left_hwnd) { + cx = _split_pos + SPLIT_WIDTH/2; + + hdwp = DeferWindowPos(hdwp, _left_hwnd, 0, _clnt_rect.left, _clnt_rect.top, _split_pos-SPLIT_WIDTH/2-_clnt_rect.left, _clnt_rect.bottom-_clnt_rect.top, SWP_NOZORDER|SWP_NOACTIVATE); + } else { + //_split_pos = 0; + cx = 0; + } + + if (_right_hwnd) + hdwp = DeferWindowPos(hdwp, _right_hwnd, 0, _clnt_rect.left+cx+1, _clnt_rect.top, _clnt_rect.right-cx, _clnt_rect.bottom-_clnt_rect.top, SWP_NOZORDER|SWP_NOACTIVATE); + + EndDeferWindowPos(hdwp); +} + +void SDIMainFrame::update_clnt_rect() +{ + ClientRect rect(_hwnd); + + resize_frame(rect.right, rect.bottom); +} + +void SDIMainFrame::update_shell_browser() +{ + int split_pos = DEFAULT_SPLIT_POS; + + if (_shellBrowser.get()) { + split_pos = _split_pos; + delete _shellBrowser.release(); + } + + // create explorer treeview + if (_shellpath_info._open_mode & OWM_EXPLORE) { + if (!_left_hwnd) { + ClientRect rect(_hwnd); + + _left_hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, NULL, + WS_CHILD|WS_TABSTOP|WS_VISIBLE|WS_CHILD|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|TVS_NOTOOLTIPS|TVS_SHOWSELALWAYS, + 0, rect.top, split_pos-SPLIT_WIDTH/2, rect.bottom-rect.top, + _hwnd, (HMENU)IDC_FILETREE, g_Globals._hInstance, 0); + + // display tree window as long as the shell view is not yet visible + resize_frame(rect.right, rect.bottom); + MoveWindow(_left_hwnd, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, TRUE); + } + } else { + if (_left_hwnd) { + DestroyWindow(_left_hwnd); + _left_hwnd = 0; + } + } + + _shellBrowser = auto_ptr<ShellBrowser>(new ShellBrowser(_hwnd, _left_hwnd, _right_hwnd, + _shellpath_info, _himlSmall, this)); + + _shellBrowser->Init(_hwnd); + + if (_left_hwnd) + _shellBrowser->Init(_himlSmall); + + // update _clnt_rect and set size of new created shell view windows + update_clnt_rect(); +} + +void SDIMainFrame::entry_selected(Entry* entry) +{ + if (entry->_etype == ET_SHELL) { + ShellEntry* shell_entry = static_cast<ShellEntry*>(entry); + IShellFolder* folder; + + if (shell_entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + folder = static_cast<ShellDirectory*>(shell_entry)->_folder; + else + folder = shell_entry->get_parent_folder(); + + if (!folder) { + assert(folder); + return; + } + + TCHAR path[MAX_PATH]; + + if (shell_entry->get_path(path)) { + String url; + + if (path[0] == ':') + url.printf(TEXT("shell://%s"), path); + else + url.printf(TEXT("file://%s"), path); + + set_url(url); + } + + _shellBrowser->UpdateFolderView(folder); + + // update _clnt_rect and set size of new created shell view windows + update_clnt_rect(); + } +} + +void SDIMainFrame::set_url(LPCTSTR url) +{ + if (_url != url) { + _url = url; + + SetWindowText(_haddressedit, url); //SendMessage(_hwndFrame, PM_URL_CHANGED, 0, (LPARAM)url); + } +} + +void SDIMainFrame::jump_to(LPCTSTR path, int mode) +{/*@@todo + if (_shellBrowser.get() && (_shellpath_info._open_mode&~OWM_PIDL)==(mode&~OWM_PIDL)) { + _shellBrowser->jump_to(path); + + _shellpath_info._shell_path = path; + } else */{ + _shellpath_info._open_mode = mode; + _shellpath_info._shell_path = path; + _shellpath_info._root_shell_path = SpecialFolderPath(CSIDL_DRIVES, _hwnd); //@@ + + update_shell_browser(); + } +} + +void SDIMainFrame::jump_to(LPCITEMIDLIST path, int mode) +{ +/*@@todo + if (_shellBrowser.get() && (_shellpath_info._open_mode&~OWM_PIDL)==(mode&~OWM_PIDL)) { + ShellPath shell_path = path; + + _shellBrowser->jump_to(shell_path); + + _shellpath_info._shell_path = shell_path; + } else */{ + _shellpath_info._open_mode = mode; + _shellpath_info._shell_path = path; + _shellpath_info._root_shell_path = DesktopFolderPath(); //@@ + + update_shell_browser(); + } } diff --git a/reactos/subsys/system/explorer/shell/mainframe.h b/reactos/subsys/system/explorer/shell/mainframe.h index c1564dd2d9a..4c96cc916e9 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.h +++ b/reactos/subsys/system/explorer/shell/mainframe.h @@ -30,13 +30,65 @@ enum OPEN_WINDOW_MODE {OWM_EXPLORE=1, OWM_DETAILS=2, OWM_PIDL=4}; - /// Explorer frame window -struct MainFrame : public PreTranslateWindow + /// Explorer frame window base class +struct MainFrameBase : public PreTranslateWindow { typedef PreTranslateWindow super; - MainFrame(HWND hwnd); - ~MainFrame(); + MainFrameBase(HWND hwnd); + ~MainFrameBase(); + + static HWND Create(LPCTSTR path, bool mdi=true, UINT cmdshow=SW_SHOWNORMAL); + + WindowHandle _hwndrebar; + + WindowHandle _htoolbar; + WindowHandle _hstatusbar; + + WindowHandle _haddressedit; + WindowHandle _hcommandedit; + + WindowHandle _hsidebar; + HIMAGELIST _himl; + + HMENU _hMenuFrame; + HMENU _hMenuWindow; + + MenuInfo _menu_info; + +protected: + FullScreenParameters _fullscreen; + + HACCEL _hAccel; + + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + bool ProcessMessage(UINT nmsg, WPARAM wparam, LPARAM lparam, LRESULT* pres); + int Command(int id, int code); + int Notify(int id, NMHDR* pnmh); + + virtual BOOL TranslateMsg(MSG* pmsg); + + void toggle_child(HWND hwnd, UINT cmd, HWND hchild, int band_idx=-1); + + void resize_frame_client(); + virtual void resize_frame(int cx, int cy); + virtual void frame_get_clientspace(PRECT prect); + + BOOL toggle_fullscreen(); + void fullscreen_move(); + + void FillBookmarks(); + virtual bool go_to(LPCTSTR url, bool new_window); +}; + + +#ifndef _NO_MDI + +struct MDIMainFrame : public MainFrameBase +{ + typedef MainFrameBase super; + + MDIMainFrame(HWND hwnd); static HWND Create(); static HWND Create(LPCTSTR path, int mode=OWM_EXPLORE|OWM_DETAILS); @@ -47,47 +99,68 @@ struct MainFrame : public PreTranslateWindow ChildWindow* CreateChild(LPCITEMIDLIST pidl, int mode=OWM_EXPLORE|OWM_DETAILS|OWM_PIDL); protected: - FullScreenParameters _fullscreen; - -#ifndef _NO_MDI HWND _hmdiclient; -#endif - WindowHandle _hstatusbar; - WindowHandle _hwndrebar; - WindowHandle _htoolbar; WindowHandle _hextrabar; WindowHandle _hdrivebar; - WindowHandle _haddressedit; - WindowHandle _hcommandedit; - WindowHandle _hsidebar; - - HIMAGELIST _himl; - - HMENU _hMenuFrame; - HMENU _hMenuWindow; - - MenuInfo _menu_info; protected: LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); int Command(int id, int code); - int Notify(int id, NMHDR* pnmh); - void toggle_child(HWND hwnd, UINT cmd, HWND hchild, int band_idx=-1); + virtual BOOL TranslateMsg(MSG* pmsg); + bool activate_drive_window(LPCTSTR path); bool activate_child_window(LPCTSTR filesys); - void resize_frame_rect(PRECT prect); - void resize_frame(int cx, int cy); - void resize_frame_client(); - void frame_get_clientspace(PRECT prect); - BOOL toggle_fullscreen(); - void fullscreen_move(); + virtual void resize_frame(int cx, int cy); + virtual void frame_get_clientspace(PRECT prect); - void FillBookmarks(); - bool go_to(LPCTSTR url, bool new_window); + virtual bool go_to(LPCTSTR url, bool new_window); - HACCEL _hAccel; TCHAR _drives[BUFFER_LEN]; }; + +#endif + + +struct SDIMainFrame : public ShellBrowserChildT<MainFrameBase> +{ + typedef ShellBrowserChildT<MainFrameBase> super; + + SDIMainFrame(HWND hwnd); + + static HWND Create(); + +protected: + ShellPathInfo _shellpath_info; + + WindowHandle _left_hwnd; + WindowHandle _right_hwnd; + +/**@todo focus handling for TAB switching + int _focus_pane; // 0: left 1: right +*/ + + int _split_pos; + int _last_split; + RECT _clnt_rect; + + String _url; + + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + int Command(int id, int code); + + void resize_frame(int cx, int cy); + void resize_children(); + void update_clnt_rect(); + + void update_shell_browser(); + void jump_to(LPCTSTR path, int mode); + void jump_to(LPCITEMIDLIST path, int mode); + + // interface BrowserCallback + virtual void entry_selected(Entry* entry); + + void set_url(LPCTSTR url); +}; diff --git a/reactos/subsys/system/explorer/shell/pane.cpp b/reactos/subsys/system/explorer/shell/pane.cpp index e6d760c9fa4..652260faac9 100644 --- a/reactos/subsys/system/explorer/shell/pane.cpp +++ b/reactos/subsys/system/explorer/shell/pane.cpp @@ -980,9 +980,9 @@ BOOL Pane::command(UINT cmd) return TRUE; } -MainFrame* Pane::get_frame() +MainFrameBase* Pane::get_frame() { HWND owner = GetParent(_hwnd); - return (MainFrame*)owner; + return (MainFrameBase*)owner; } diff --git a/reactos/subsys/system/explorer/shell/pane.h b/reactos/subsys/system/explorer/shell/pane.h index c40824ace93..32c64ac1ba7 100644 --- a/reactos/subsys/system/explorer/shell/pane.h +++ b/reactos/subsys/system/explorer/shell/pane.h @@ -101,7 +101,7 @@ protected: void calc_width(LPDRAWITEMSTRUCT dis, int col, LPCTSTR str); void calc_tabbed_width(LPDRAWITEMSTRUCT dis, int col, LPCTSTR str); - MainFrame* get_frame(); + struct MainFrameBase* get_frame(); protected: HIMAGELIST _himl; diff --git a/reactos/subsys/system/explorer/shell/shellbrowser.cpp b/reactos/subsys/system/explorer/shell/shellbrowser.cpp index 72d438fc117..c674a8c681b 100644 --- a/reactos/subsys/system/explorer/shell/shellbrowser.cpp +++ b/reactos/subsys/system/explorer/shell/shellbrowser.cpp @@ -31,21 +31,22 @@ #include "../explorer_intres.h" -ShellBrowserChild::ShellBrowserChild(HWND hwnd, const ShellChildWndInfo& info) - : super(hwnd, info), - _create_info(info) +ShellBrowser::ShellBrowser(HWND hwnd, HWND left_hwnd, WindowHandle& right_hwnd, ShellPathInfo& create_info, HIMAGELIST himl, BrowserCallback* cb) + : _hwnd(hwnd), + _left_hwnd(left_hwnd), + _right_hwnd(right_hwnd), + _create_info(create_info), + _himl(himl), + _callback(cb) { _pShellView = NULL; _pDropTarget = NULL; - _himlSmall = 0; _last_sel = 0; - // store path into history - if (info._path && *info._path) - _url_history.push(info._path); + _cur_dir = NULL; } -ShellBrowserChild::~ShellBrowserChild() +ShellBrowser::~ShellBrowser() { if (_pShellView) _pShellView->Release(); @@ -54,73 +55,87 @@ ShellBrowserChild::~ShellBrowserChild() _pDropTarget->Release(); _pDropTarget = NULL; } + + if (_right_hwnd) { + DestroyWindow(_right_hwnd); + _right_hwnd = 0; + } } -LRESULT ShellBrowserChild::Init(LPCREATESTRUCT pcs) +LRESULT ShellBrowser::Init(HWND hWndFrame) { - CONTEXT("ShellBrowserChild::Init()"); - - if (super::Init(pcs)) - return 1; - - _hWndFrame = GetParent(pcs->hwndParent); - - ClientRect rect(_hwnd); - - SHFILEINFO sfi; - - _himlSmall = (HIMAGELIST)SHGetFileInfo(TEXT("C:\\"), 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX|SHGFI_SMALLICON); -// _himlLarge = (HIMAGELIST)SHGetFileInfo(TEXT("C:\\"), 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX|SHGFI_LARGEICON); + CONTEXT("ShellBrowser::Init()"); + _hWndFrame = hWndFrame; const String& root_name = GetDesktopFolder().get_name(_create_info._root_shell_path, SHGDN_FORPARSING); _root._drive_type = DRIVE_UNKNOWN; - _root._sort_order = SORT_NAME; - lstrcpy(_root._volname, root_name); // most of the time "Desktop" _root._fs_flags = 0; lstrcpy(_root._fs, TEXT("Desktop")); -//@@ _root._entry->read_tree(shell_info._root_shell_path.get_folder(), info._shell_path, _root._sort_order/*_sortOrder*/); - -/*@todo - we should call read_tree() here to iterate through the hierarchy and open all folders from shell_info._root_shell_path to shell_info._shell_path - -> see FileChildWindow::FileChildWindow() -*/ _root._entry = new ShellDirectory(GetDesktopFolder(), _create_info._root_shell_path, _hwnd); - _root._entry->read_directory_base(_root._sort_order); + + jump_to(_create_info._shell_path); + + // -> set_curdir() + _root._entry->read_directory(); /* already filled by ShellDirectory constructor lstrcpy(_root._entry->_data.cFileName, TEXT("Desktop")); */ - - // create explorer treeview - if (_create_info._open_mode & OWM_EXPLORE) - _left_hwnd = CreateWindowEx(0, WC_TREEVIEW, NULL, - WS_CHILD|WS_TABSTOP|WS_VISIBLE|WS_CHILD|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|TVS_SHOWSELALWAYS,//|TVS_NOTOOLTIPS - 0, rect.top, _split_pos-SPLIT_WIDTH/2, rect.bottom-rect.top, - _hwnd, (HMENU)IDC_FILETREE, g_Globals._hInstance, 0); - - if (_left_hwnd) { - TreeView_SetImageList(_left_hwnd, _himlSmall, TVSIL_NORMAL); - TreeView_SetScrollTime(_left_hwnd, 100); - - InitializeTree(); - - InitDragDrop(); - } else - UpdateFolderView(_create_info._shell_path.get_folder()); - return 0; } +void ShellBrowser::jump_to(LPCITEMIDLIST pidl) +{ + Entry* entry = NULL; -void ShellBrowserChild::InitializeTree() + //@@ + if (!_cur_dir) + _cur_dir = static_cast<ShellDirectory*>(_root._entry); + +/*@todo + we should call read_tree() here to iterate through the hierarchy and open all folders from shell_info._root_shell_path to shell_info._shell_path + _root._entry->read_tree(shell_info._root_shell_path.get_folder(), info._shell_path, SORT_NAME); + -> see FileChildWindow::FileChildWindow() +*/ + + if (_cur_dir) { + static DynamicFct<LPITEMIDLIST(WINAPI*)(LPCITEMIDLIST, LPCITEMIDLIST)> ILFindChild(TEXT("SHELL32"), 24); + + LPCITEMIDLIST child_pidl; + + if (ILFindChild) + child_pidl = (*ILFindChild)(_cur_dir->create_absolute_pidl(), pidl); + else + child_pidl = pidl; // This is not correct in the common case, but works on the desktop level. + + if (child_pidl) { + _cur_dir->smart_scan(); + + entry = _cur_dir->find_entry(child_pidl); + + if (entry) + _callback->entry_selected(entry); + } + } + + //@@ work around as long as we don't iterate correctly through the ShellEntry tree + if (!entry) + UpdateFolderView(ShellFolder(pidl)); +} + + +void ShellBrowser::InitializeTree(HIMAGELIST himl) { CONTEXT("ShellBrowserChild::InitializeTree()"); + TreeView_SetImageList(_left_hwnd, himl, TVSIL_NORMAL); + TreeView_SetScrollTime(_left_hwnd, 100); + TV_INSERTSTRUCT tvInsert; tvInsert.hParent = 0; @@ -138,10 +153,9 @@ void ShellBrowserChild::InitializeTree() TreeView_Expand(_left_hwnd, hItem, TVE_EXPAND); } - -bool ShellBrowserChild::InitDragDrop() +bool ShellBrowser::InitDragDrop() { - CONTEXT("ShellBrowserChild::InitDragDrop()"); + CONTEXT("ShellBrowser::InitDragDrop()"); _pDropTarget = new TreeDropTarget(_left_hwnd); @@ -171,9 +185,9 @@ bool ShellBrowserChild::InitDragDrop() } -void ShellBrowserChild::OnTreeItemRClick(int idCtrl, LPNMHDR pnmh) +void ShellBrowser::OnTreeItemRClick(int idCtrl, LPNMHDR pnmh) { - CONTEXT("ShellBrowserChild::OnTreeItemRClick()"); + CONTEXT("ShellBrowser::OnTreeItemRClick()"); TVHITTESTINFO tvhti; @@ -185,13 +199,13 @@ void ShellBrowserChild::OnTreeItemRClick(int idCtrl, LPNMHDR pnmh) if (TVHT_ONITEM & tvhti.flags) { ClientToScreen(_left_hwnd, &tvhti.pt); - Tree_DoItemMenu(_left_hwnd, tvhti.hItem , &tvhti.pt); + Tree_DoItemMenu(_left_hwnd, tvhti.hItem, &tvhti.pt); } } -void ShellBrowserChild::Tree_DoItemMenu(HWND hwndTreeView, HTREEITEM hItem, LPPOINT pptScreen) +void ShellBrowser::Tree_DoItemMenu(HWND hwndTreeView, HTREEITEM hItem, LPPOINT pptScreen) { - CONTEXT("ShellBrowserChild::Tree_DoItemMenu()"); + CONTEXT("ShellBrowser::Tree_DoItemMenu()"); LPARAM itemData = TreeView_GetItemData(hwndTreeView, hItem); @@ -214,45 +228,47 @@ void ShellBrowserChild::Tree_DoItemMenu(HWND hwndTreeView, HTREEITEM hItem, LPPO } } -void ShellBrowserChild::OnTreeGetDispInfo(int idCtrl, LPNMHDR pnmh) +void ShellBrowser::OnTreeGetDispInfo(int idCtrl, LPNMHDR pnmh) { - CONTEXT("ShellBrowserChild::OnTreeGetDispInfo()"); + CONTEXT("ShellBrowser::OnTreeGetDispInfo()"); LPNMTVDISPINFO lpdi = (LPNMTVDISPINFO)pnmh; ShellEntry* entry = (ShellEntry*)lpdi->item.lParam; - if (lpdi->item.mask & TVIF_TEXT) - lpdi->item.pszText = entry->_display_name; - - if (lpdi->item.mask & (/*TVIF_TEXT|*/TVIF_IMAGE|TVIF_SELECTEDIMAGE)) { - ShellPath pidl_abs = entry->create_absolute_pidl(); // Caching of absolute PIDLs could enhance performance. - LPCITEMIDLIST pidl = pidl_abs; - - SHFILEINFO sfi; -/* + if (entry) { if (lpdi->item.mask & TVIF_TEXT) - if (SHGetFileInfo((LPCTSTR)pidl, 0, &sfi, sizeof(sfi), SHGFI_PIDL|SHGFI_DISPLAYNAME)) - lstrcpy(lpdi->item.pszText, sfi.szDisplayName); ///@todo look at cchTextMax if there is enough space available - else - lpdi->item.pszText = entry->_data.cFileName; -*/ - if (lpdi->item.mask & TVIF_IMAGE) - if ((HIMAGELIST)SHGetFileInfo((LPCTSTR)pidl, 0, &sfi, sizeof(sfi), SHGFI_PIDL|SHGFI_SYSICONINDEX|SHGFI_SMALLICON|SHGFI_LINKOVERLAY) == _himlSmall) - lpdi->item.iImage = sfi.iIcon; - else - lpdi->item.iImage = -1; + lpdi->item.pszText = entry->_display_name; - if (lpdi->item.mask & TVIF_SELECTEDIMAGE) - if ((HIMAGELIST)SHGetFileInfo((LPCTSTR)pidl, 0, &sfi, sizeof(sfi), SHGFI_PIDL|SHGFI_SYSICONINDEX|SHGFI_SMALLICON|SHGFI_OPENICON) == _himlSmall) - lpdi->item.iSelectedImage = sfi.iIcon; - else - lpdi->item.iSelectedImage = -1; + if (lpdi->item.mask & (/*TVIF_TEXT|*/TVIF_IMAGE|TVIF_SELECTEDIMAGE)) { + ShellPath pidl_abs = entry->create_absolute_pidl(); // Caching of absolute PIDLs could enhance performance. + LPCITEMIDLIST pidl = pidl_abs; + + SHFILEINFO sfi; +/* + if (lpdi->item.mask & TVIF_TEXT) + if (SHGetFileInfo((LPCTSTR)pidl, 0, &sfi, sizeof(sfi), SHGFI_PIDL|SHGFI_DISPLAYNAME)) + lstrcpy(lpdi->item.pszText, sfi.szDisplayName); ///@todo look at cchTextMax if there is enough space available + else + lpdi->item.pszText = entry->_data.cFileName; +*/ + if (lpdi->item.mask & TVIF_IMAGE) + if ((HIMAGELIST)SHGetFileInfo((LPCTSTR)pidl, 0, &sfi, sizeof(sfi), SHGFI_PIDL|SHGFI_SYSICONINDEX|SHGFI_SMALLICON|SHGFI_LINKOVERLAY) == _himl) + lpdi->item.iImage = sfi.iIcon; + else + lpdi->item.iImage = -1; + + if (lpdi->item.mask & TVIF_SELECTEDIMAGE) + if ((HIMAGELIST)SHGetFileInfo((LPCTSTR)pidl, 0, &sfi, sizeof(sfi), SHGFI_PIDL|SHGFI_SYSICONINDEX|SHGFI_SMALLICON|SHGFI_OPENICON) == _himl) + lpdi->item.iSelectedImage = sfi.iIcon; + else + lpdi->item.iSelectedImage = -1; + } } } -void ShellBrowserChild::OnTreeItemExpanding(int idCtrl, LPNMTREEVIEW pnmtv) +void ShellBrowser::OnTreeItemExpanding(int idCtrl, LPNMTREEVIEW pnmtv) { - CONTEXT("ShellBrowserChild::OnTreeItemExpanding()"); + CONTEXT("ShellBrowser::OnTreeItemExpanding()"); if (pnmtv->action == TVE_COLLAPSE) TreeView_Expand(_left_hwnd, pnmtv->itemNew.hItem, TVE_COLLAPSE|TVE_COLLAPSERESET); @@ -275,9 +291,9 @@ void ShellBrowserChild::OnTreeItemExpanding(int idCtrl, LPNMTREEVIEW pnmtv) } } -int ShellBrowserChild::InsertSubitems(HTREEITEM hParentItem, Entry* entry, IShellFolder* pParentFolder) +int ShellBrowser::InsertSubitems(HTREEITEM hParentItem, Entry* entry, IShellFolder* pParentFolder) { - CONTEXT("ShellBrowserChild::InsertSubitems()"); + CONTEXT("ShellBrowser::InsertSubitems()"); WaitCursor wait; @@ -328,47 +344,21 @@ int ShellBrowserChild::InsertSubitems(HTREEITEM hParentItem, Entry* entry, IShel return cnt; } -void ShellBrowserChild::OnTreeItemSelected(int idCtrl, LPNMTREEVIEW pnmtv) +void ShellBrowser::OnTreeItemSelected(int idCtrl, LPNMTREEVIEW pnmtv) { - CONTEXT("ShellBrowserChild::OnTreeItemSelected()"); + CONTEXT("ShellBrowser::OnTreeItemSelected()"); ShellEntry* entry = (ShellEntry*)pnmtv->itemNew.lParam; _last_sel = pnmtv->itemNew.hItem; - if (entry->_etype == ET_SHELL) { - IShellFolder* folder; - - if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - folder = static_cast<ShellDirectory*>(entry)->_folder; - else - folder = entry->get_parent_folder(); - - if (!folder) { - assert(folder); - return; - } - - TCHAR path[MAX_PATH]; - - if (entry->get_path(path)) { - String url; - - if (path[0] == ':') - url.printf(TEXT("shell://%s"), path); - else - url.printf(TEXT("file://%s"), path); - - set_url(url); - } - - UpdateFolderView(folder); - } + if (entry) + _callback->entry_selected(entry); } -void ShellBrowserChild::UpdateFolderView(IShellFolder* folder) +void ShellBrowser::UpdateFolderView(IShellFolder* folder) { - CONTEXT("ShellBrowserChild::UpdateFolderView()"); + CONTEXT("ShellBrowser::UpdateFolderView()"); FOLDERSETTINGS fs; IShellView* pLastShellView = _pShellView; @@ -397,63 +387,15 @@ void ShellBrowserChild::UpdateFolderView(IShellFolder* folder) pLastShellView->UIActivate(SVUIA_DEACTIVATE); pLastShellView->DestroyViewWindow(); pLastShellView->Release(); - - ClientRect clnt(_hwnd); - resize_children(clnt.right, clnt.bottom); } _pShellView->UIActivate(SVUIA_ACTIVATE_NOFOCUS); } -LRESULT ShellBrowserChild::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +HRESULT ShellBrowser::OnDefaultCommand(LPIDA pida) { - switch(nmsg) { - case WM_GETISHELLBROWSER: // for Registry Explorer Plugin - return (LRESULT)static_cast<IShellBrowser*>(this); - - case PM_GET_SHELLBROWSER_PTR: - return (LRESULT)this; - - case PM_DISPATCH_COMMAND: { - switch(LOWORD(wparam)) { - case ID_WINDOW_NEW: {CONTEXT("ShellBrowserChild PM_DISPATCH_COMMAND ID_WINDOW_NEW"); - ShellBrowserChild::create(_create_info); - break;} - - case ID_REFRESH: - //@todo refresh shell child - break; - - default: - return super::WndProc(nmsg, wparam, lparam); - } - return TRUE;} - - default: - return super::WndProc(nmsg, wparam, lparam); - } - - return 0; -} - -int ShellBrowserChild::Notify(int id, NMHDR* pnmh) -{ - switch(pnmh->code) { - case TVN_GETDISPINFO: OnTreeGetDispInfo(id, pnmh); break; - case TVN_SELCHANGED: OnTreeItemSelected(id, (LPNMTREEVIEW)pnmh); break; - case TVN_ITEMEXPANDING: OnTreeItemExpanding(id, (LPNMTREEVIEW)pnmh); break; - case NM_RCLICK: OnTreeItemRClick(id, pnmh); break; - default: return super::Notify(id, pnmh); - } - - return 0; -} - - -HRESULT ShellBrowserChild::OnDefaultCommand(LPIDA pida) -{ - CONTEXT("ShellBrowserChild::OnDefaultCommand()"); + CONTEXT("ShellBrowser::OnDefaultCommand()"); if (pida->cidl >= 1) { if (_left_hwnd) { // explorer mode @@ -479,7 +421,7 @@ HRESULT ShellBrowserChild::OnDefaultCommand(LPIDA pida) } } } else { // no tree control - if (MainFrame::OpenShellFolders(pida, _hWndFrame)) + if (MDIMainFrame::OpenShellFolders(pida, _hWndFrame)) return S_OK; /* create new Frame Window @@ -493,9 +435,9 @@ HRESULT ShellBrowserChild::OnDefaultCommand(LPIDA pida) } -HTREEITEM ShellBrowserChild::select_entry(HTREEITEM hitem, Entry* entry, bool expand) +HTREEITEM ShellBrowser::select_entry(HTREEITEM hitem, Entry* entry, bool expand) { - CONTEXT("ShellBrowserChild::select_entry()"); + CONTEXT("ShellBrowser::select_entry()"); if (expand && !TreeView_Expand(_left_hwnd, hitem, TVE_EXPAND)) return 0; @@ -517,28 +459,7 @@ HTREEITEM ShellBrowserChild::select_entry(HTREEITEM hitem, Entry* entry, bool ex } -String ShellBrowserChild::jump_to_int(LPCTSTR url) -{ - String dir, fname; - - if (!_tcsnicmp(url, TEXT("shell://"), 8)) { - if (jump_to_pidl(ShellPath(url+8))) - return url; - } - - if (SplitFileSysURL(url, dir, fname)) { - - ///@todo use fname - - if (jump_to_pidl(ShellPath(dir))) - return FmtString(TEXT("file://%s"), (LPCTSTR)dir); - } - - return String(); -} - - -bool ShellBrowserChild::jump_to_pidl(LPCITEMIDLIST pidl) +bool ShellBrowser::jump_to_pidl(LPCITEMIDLIST pidl) { if (!_root._entry) return false; @@ -569,3 +490,171 @@ bool ShellBrowserChild::jump_to_pidl(LPCITEMIDLIST pidl) return false; } + + +#ifndef _NO_MDI + +MDIShellBrowserChild::MDIShellBrowserChild(HWND hwnd, const ShellChildWndInfo& info) + : super(hwnd, info), + _create_info(info), + _shellpath_info(info) //@@ copies info -> no referenz to _create_info ! +{ +/**todo Conversion of shell path into path string -> store into URL history + // store path into history + if (info._path && *info._path) + _url_history.push(info._path); +*/ +} + + +MDIShellBrowserChild* MDIShellBrowserChild::create(const ShellChildWndInfo& info) +{ + ChildWindow* child = ChildWindow::create(info, info._pos.rcNormalPosition, + WINDOW_CREATOR_INFO(MDIShellBrowserChild,ShellChildWndInfo), CLASSNAME_CHILDWND, NULL, info._pos.showCmd==SW_SHOWMAXIMIZED? WS_MAXIMIZE: 0); + + return static_cast<MDIShellBrowserChild*>(child); +} + + +LRESULT MDIShellBrowserChild::Init(LPCREATESTRUCT pcs) +{ + CONTEXT("MDIShellBrowserChild::Init()"); + + if (super::Init(pcs)) + return 1; + + init_himl(); + + update_shell_browser(); + + if (&*_shellBrowser) + if (_left_hwnd) + _shellBrowser->Init(_himlSmall); + else + _shellBrowser->UpdateFolderView(_create_info._shell_path.get_folder()); + + return 0; +} + + +LRESULT MDIShellBrowserChild::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + switch(nmsg) { + case PM_DISPATCH_COMMAND: { + switch(LOWORD(wparam)) { + case ID_WINDOW_NEW: {CONTEXT("MDIShellBrowserChild PM_DISPATCH_COMMAND ID_WINDOW_NEW"); + MDIShellBrowserChild::create(_create_info); + break;} + + case ID_REFRESH: + //@todo refresh shell child + break; + + case ID_VIEW_SDI: + MainFrameBase::Create(_url, false); + break; + + default: + return super::WndProc(nmsg, wparam, lparam); + } + return TRUE;} + + default: + return super::WndProc(nmsg, wparam, lparam); + } + + return 0; +} + +void MDIShellBrowserChild::update_shell_browser() +{ + int split_pos = DEFAULT_SPLIT_POS; + + if (_shellBrowser.get()) { + split_pos = _split_pos; + delete _shellBrowser.release(); + } + + // create explorer treeview + if (_create_info._open_mode & OWM_EXPLORE) { + if (!_left_hwnd) { + ClientRect rect(_hwnd); + + _left_hwnd = CreateWindowEx(0, WC_TREEVIEW, NULL, + WS_CHILD|WS_TABSTOP|WS_VISIBLE|WS_CHILD|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|TVS_SHOWSELALWAYS,//|TVS_NOTOOLTIPS + 0, rect.top, split_pos-SPLIT_WIDTH/2, rect.bottom-rect.top, + _hwnd, (HMENU)IDC_FILETREE, g_Globals._hInstance, 0); + } + } else { + if (_left_hwnd) { + DestroyWindow(_left_hwnd); + _left_hwnd = 0; + } + } + + _shellBrowser = auto_ptr<ShellBrowser>(new ShellBrowser(_hwnd, _left_hwnd, _right_hwnd, + _shellpath_info, _himlSmall, this)); + + _shellBrowser->Init(_hwnd); +} + + +String MDIShellBrowserChild::jump_to_int(LPCTSTR url) +{ + String dir, fname; + + if (!_tcsnicmp(url, TEXT("shell://"), 8)) { + if (_shellBrowser->jump_to_pidl(ShellPath(url+8))) + return url; + } + + if (SplitFileSysURL(url, dir, fname)) { + + ///@todo use fname + + if (_shellBrowser->jump_to_pidl(ShellPath(dir))) + return FmtString(TEXT("file://%s"), (LPCTSTR)dir); + } + + return String(); +} + + +void MDIShellBrowserChild::entry_selected(Entry* entry) +{ + if (entry->_etype == ET_SHELL) { + ShellEntry* shell_entry = static_cast<ShellEntry*>(entry); + IShellFolder* folder; + + if (shell_entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + folder = static_cast<ShellDirectory*>(shell_entry)->_folder; + else + folder = shell_entry->get_parent_folder(); + + if (!folder) { + assert(folder); + return; + } + + TCHAR path[MAX_PATH]; + + if (shell_entry->get_path(path)) { + String url; + + if (path[0] == ':') + url.printf(TEXT("shell://%s"), path); + else + url.printf(TEXT("file://%s"), path); + + set_url(url); + } + + _shellBrowser->UpdateFolderView(folder); + + // set size of new created shell view windows + ClientRect rt(_hwnd); + resize_children(rt.right, rt.bottom); + } +} + +#endif diff --git a/reactos/subsys/system/explorer/shell/shellbrowser.h b/reactos/subsys/system/explorer/shell/shellbrowser.h index a7546d4b02d..c99e07b573d 100644 --- a/reactos/subsys/system/explorer/shell/shellbrowser.h +++ b/reactos/subsys/system/explorer/shell/shellbrowser.h @@ -29,26 +29,37 @@ #include "../utility/shellbrowserimpl.h" - /// Implementation of IShellBrowserImpl interface in explorer child windows -struct ShellBrowserChild : public ChildWindow, public IShellBrowserImpl + /// information structure to hold current shell folder information +struct ShellPathInfo { - typedef ChildWindow super; + ShellPathInfo(int mode=0) : _open_mode(mode) {} - ShellBrowserChild(HWND hwnd, const ShellChildWndInfo& info); - ~ShellBrowserChild(); - - static ShellBrowserChild* create(const FileChildWndInfo& info) + ShellPathInfo(const ShellChildWndInfo& info) + : _shell_path(info._shell_path), + _root_shell_path(info._root_shell_path), + _open_mode(info._open_mode) { -#ifndef _NO_MDI - ChildWindow* child = ChildWindow::create(info, info._pos.rcNormalPosition, - WINDOW_CREATOR_INFO(ShellBrowserChild,ShellChildWndInfo), CLASSNAME_CHILDWND, NULL, info._pos.showCmd==SW_SHOWMAXIMIZED? WS_MAXIMIZE: 0); -#else - ///@todo SDI implementation -#endif - - return static_cast<ShellBrowserChild*>(child); } + ShellPath _shell_path; + ShellPath _root_shell_path; + + int _open_mode; //OPEN_WINDOW_MODE +}; + + +struct BrowserCallback +{ + virtual void entry_selected(Entry* entry) = 0; +}; + + + /// Implementation of IShellBrowserImpl interface in explorer child windows +struct ShellBrowser : public IShellBrowserImpl +{ + ShellBrowser(HWND hwnd, HWND left_hwnd, WindowHandle& right_hwnd, ShellPathInfo& create_info, HIMAGELIST himl, BrowserCallback* cb); + virtual ~ShellBrowser(); + //IOleWindow virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND* lphwnd) { @@ -101,39 +112,148 @@ struct ShellBrowserChild : public ChildWindow, public IShellBrowserImpl const Root& get_root() const {return _root;} -protected: - Root _root; - - WindowHandle _hWndFrame; - ShellChildWndInfo _create_info; - ShellFolder _folder; - - IShellView* _pShellView; // current hosted shellview - HIMAGELIST _himlSmall; // list -// HIMAGELIST _himlLarge; // shell image - TreeDropTarget* _pDropTarget; - - HTREEITEM _last_sel; - - LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); - int Notify(int id, NMHDR* pnmh); - - LRESULT Init(LPCREATESTRUCT); - void InitializeTree(/*const FileChildWndInfo& info*/); - int InsertSubitems(HTREEITEM hParentItem, Entry* entry, IShellFolder* pParentFolder); - bool InitDragDrop(); - - virtual String jump_to_int(LPCTSTR url); - bool jump_to_pidl(LPCITEMIDLIST pidl); - - HRESULT OnDefaultCommand(LPIDA pida); - void OnTreeGetDispInfo(int idCtrl, LPNMHDR pnmh); void OnTreeItemExpanding(int idCtrl, LPNMTREEVIEW pnmtv); void OnTreeItemRClick(int idCtrl, LPNMHDR pnmh); void OnTreeItemSelected(int idCtrl, LPNMTREEVIEW pnmtv); + LRESULT Init(HWND hWndFrame); + + void Init(HIMAGELIST himl) + { + InitializeTree(himl); + InitDragDrop(); + } + + int InsertSubitems(HTREEITEM hParentItem, Entry* entry, IShellFolder* pParentFolder); + + bool jump_to_pidl(LPCITEMIDLIST pidl); + + HRESULT OnDefaultCommand(LPIDA pida); + void UpdateFolderView(IShellFolder* folder); void Tree_DoItemMenu(HWND hwndTreeView, HTREEITEM hItem, LPPOINT pptScreen); HTREEITEM select_entry(HTREEITEM hitem, Entry* entry, bool expand=true); + +protected: + HWND _hwnd; + HWND _left_hwnd; + WindowHandle& _right_hwnd; + ShellPathInfo& _create_info; + HIMAGELIST _himl; + BrowserCallback* _callback; + + WindowHandle _hWndFrame; + ShellFolder _folder; + + IShellView* _pShellView; // current hosted shellview + TreeDropTarget* _pDropTarget; + + HTREEITEM _last_sel; + + Root _root; + ShellDirectory* _cur_dir; + + void InitializeTree(HIMAGELIST himl); + bool InitDragDrop(); + + // for SDIMainFrame + void jump_to(LPCITEMIDLIST pidl); }; + + +template<typename BASE> struct ShellBrowserChildT + : public BASE, public BrowserCallback +{ + typedef BASE super; + + // constructor for SDIMainFrame + ShellBrowserChildT(HWND hwnd) + : super(hwnd) + { + _himlSmall = 0; + } + + // constructor for MDIShellBrowserChild + ShellBrowserChildT(HWND hwnd, const ShellChildWndInfo& info) + : super(hwnd, info) + { + _himlSmall = 0; + } + + void init_himl() + { + SHFILEINFO sfi; + + _himlSmall = (HIMAGELIST)SHGetFileInfo(TEXT("C:\\"), 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX|SHGFI_SMALLICON); +// _himlLarge = (HIMAGELIST)SHGetFileInfo(TEXT("C:\\"), 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX|SHGFI_LARGEICON); + } + +protected: + HIMAGELIST _himlSmall; // list +// HIMAGELIST _himlLarge; // shell image + +protected: + auto_ptr<ShellBrowser> _shellBrowser; + + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) + { + switch(nmsg) { + case PM_GET_SHELLBROWSER_PTR: + return (LRESULT)&*_shellBrowser; + + case WM_GETISHELLBROWSER: // for Registry Explorer Plugin + return (LRESULT)static_cast<IShellBrowser*>(&*_shellBrowser); + + default: + return super::WndProc(nmsg, wparam, lparam); + } + + return 0; + } + + int Notify(int id, NMHDR* pnmh) + { + if (&*_shellBrowser) + switch(pnmh->code) { + case TVN_GETDISPINFO: _shellBrowser->OnTreeGetDispInfo(id, pnmh); break; + case TVN_SELCHANGED: _shellBrowser->OnTreeItemSelected(id, (LPNMTREEVIEW)pnmh); break; + case TVN_ITEMEXPANDING: _shellBrowser->OnTreeItemExpanding(id, (LPNMTREEVIEW)pnmh); break; + case NM_RCLICK: _shellBrowser->OnTreeItemRClick(id, pnmh); break; + default: return super::Notify(id, pnmh); + } + else + return super::Notify(id, pnmh); + + return 0; + } +}; + + +#ifndef _NO_MDI + +struct MDIShellBrowserChild : public ShellBrowserChildT<ChildWindow> +{ + typedef ShellBrowserChildT<ChildWindow> super; + + MDIShellBrowserChild(HWND hwnd, const ShellChildWndInfo& info); + + static MDIShellBrowserChild* create(const ShellChildWndInfo& info); + + LRESULT Init(LPCREATESTRUCT); + + virtual String jump_to_int(LPCTSTR url); + +protected: + ShellChildWndInfo _create_info; + ShellPathInfo _shellpath_info; + + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + + void update_shell_browser(); + + // interface BrowserCallback + virtual void entry_selected(Entry* entry); +}; + +#endif diff --git a/reactos/subsys/system/explorer/taskbar/startmenu.cpp b/reactos/subsys/system/explorer/taskbar/startmenu.cpp index 8bd3c5c4ec9..ec326a4f564 100644 --- a/reactos/subsys/system/explorer/taskbar/startmenu.cpp +++ b/reactos/subsys/system/explorer/taskbar/startmenu.cpp @@ -1675,7 +1675,7 @@ int StartMenuHandler::Command(int id, int code) case IDC_CONTROL_PANEL: CloseStartMenu(id); - MainFrame::Create(TEXT("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}"), 0); + //@@SDIMainFrame::Create(TEXT("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}"), 0); break; case IDC_ADMIN: From 18fcfd015e697981f15540311877eab22c28c78e Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes <hardon@online.no> Date: Mon, 31 May 2004 23:37:22 +0000 Subject: [PATCH 1291/1463] removed something i shouldn't have svn path=/trunk/; revision=9575 --- reactos/ntoskrnl/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/Makefile b/reactos/ntoskrnl/Makefile index 406da157207..26cab813555 100644 --- a/reactos/ntoskrnl/Makefile +++ b/reactos/ntoskrnl/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.120 2004/05/31 19:39:53 gdalsnes Exp $ +# $Id: Makefile,v 1.121 2004/05/31 23:37:22 gdalsnes Exp $ # # ReactOS Operating System # @@ -114,6 +114,7 @@ OBJECTS_RTL = \ rtl/swprintf.o \ rtl/wstring.o \ rtl/nls.o \ + rtl/rangelist.o \ rtl/libsupp.o OBJECTS_RTL := $(filter-out $(RTL_EXCLUDE_FILTER), $(OBJECTS_RTL)) From 5a9d7b96f4c466ad0084428837c0a3906e6ff47d Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes <hardon@online.no> Date: Tue, 1 Jun 2004 00:14:07 +0000 Subject: [PATCH 1292/1463] create rtl for stuff common to ntdll/ntoskrnl svn path=/trunk/; revision=9576 --- reactos/lib/ntdll/rtl/acl.c | 629 ---------- reactos/lib/ntdll/rtl/compress.c | 224 ---- reactos/lib/ntdll/rtl/dos8dot3.c | 335 ------ reactos/lib/ntdll/rtl/env.c | 521 -------- reactos/lib/ntdll/rtl/error.c | 933 -------------- reactos/lib/ntdll/rtl/heap.c | 1686 -------------------------- reactos/lib/ntdll/rtl/largeint.c | 356 ------ reactos/lib/ntdll/rtl/luid.c | 58 - reactos/lib/ntdll/rtl/mem.c | 235 ---- reactos/lib/ntdll/rtl/nls.c | 702 ----------- reactos/lib/ntdll/rtl/random.c | 157 --- reactos/lib/ntdll/rtl/sd.c | 753 ------------ reactos/lib/ntdll/rtl/security.c | 150 --- reactos/lib/ntdll/rtl/sid.c | 350 ------ reactos/lib/ntdll/rtl/time.c | 373 ------ reactos/lib/ntdll/rtl/timezone.c | 175 --- reactos/lib/ntdll/rtl/unicode.c | 1943 ------------------------------ reactos/lib/ntdll/rtl/version.c | 62 - reactos/ntoskrnl/rtl/compress.c | 229 ---- reactos/ntoskrnl/rtl/dos8dot3.c | 336 ------ reactos/ntoskrnl/rtl/error.c | 989 --------------- reactos/ntoskrnl/rtl/largeint.c | 356 ------ reactos/ntoskrnl/rtl/mem.c | 276 ----- reactos/ntoskrnl/rtl/random.c | 96 -- reactos/ntoskrnl/rtl/time.c | 292 ----- reactos/ntoskrnl/rtl/timezone.c | 174 --- reactos/ntoskrnl/rtl/unicode.c | 1672 ------------------------- reactos/ntoskrnl/rtl/version.c | 63 - 28 files changed, 14125 deletions(-) delete mode 100644 reactos/lib/ntdll/rtl/acl.c delete mode 100644 reactos/lib/ntdll/rtl/compress.c delete mode 100644 reactos/lib/ntdll/rtl/dos8dot3.c delete mode 100644 reactos/lib/ntdll/rtl/env.c delete mode 100644 reactos/lib/ntdll/rtl/error.c delete mode 100644 reactos/lib/ntdll/rtl/heap.c delete mode 100644 reactos/lib/ntdll/rtl/largeint.c delete mode 100644 reactos/lib/ntdll/rtl/luid.c delete mode 100644 reactos/lib/ntdll/rtl/mem.c delete mode 100644 reactos/lib/ntdll/rtl/nls.c delete mode 100644 reactos/lib/ntdll/rtl/random.c delete mode 100644 reactos/lib/ntdll/rtl/sd.c delete mode 100644 reactos/lib/ntdll/rtl/security.c delete mode 100644 reactos/lib/ntdll/rtl/sid.c delete mode 100644 reactos/lib/ntdll/rtl/time.c delete mode 100644 reactos/lib/ntdll/rtl/timezone.c delete mode 100644 reactos/lib/ntdll/rtl/unicode.c delete mode 100644 reactos/lib/ntdll/rtl/version.c delete mode 100644 reactos/ntoskrnl/rtl/compress.c delete mode 100644 reactos/ntoskrnl/rtl/dos8dot3.c delete mode 100644 reactos/ntoskrnl/rtl/error.c delete mode 100644 reactos/ntoskrnl/rtl/largeint.c delete mode 100644 reactos/ntoskrnl/rtl/mem.c delete mode 100644 reactos/ntoskrnl/rtl/random.c delete mode 100644 reactos/ntoskrnl/rtl/time.c delete mode 100644 reactos/ntoskrnl/rtl/timezone.c delete mode 100644 reactos/ntoskrnl/rtl/unicode.c delete mode 100644 reactos/ntoskrnl/rtl/version.c diff --git a/reactos/lib/ntdll/rtl/acl.c b/reactos/lib/ntdll/rtl/acl.c deleted file mode 100644 index c8288f64cfe..00000000000 --- a/reactos/lib/ntdll/rtl/acl.c +++ /dev/null @@ -1,629 +0,0 @@ -/* $Id: acl.c,v 1.11 2004/02/02 22:38:12 ekohl Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * PURPOSE: Security manager - * FILE: lib/ntdll/rtl/acl.c - * PROGRAMER: David Welch <welch@cwcom.net> - * REVISION HISTORY: - * 26/07/98: Added stubs for security functions - */ - -/* INCLUDES *****************************************************************/ - -#include <ddk/ntddk.h> - -#include <ntdll/ntdll.h> - -/* FUNCTIONS ***************************************************************/ - -BOOLEAN STDCALL -RtlFirstFreeAce(PACL Acl, - PACE* Ace) -{ - PACE Current; - PVOID AclEnd; - ULONG i; - - Current = (PACE)(Acl + 1); - *Ace = NULL; - i = 0; - if (Acl->AceCount == 0) - { - *Ace = Current; - return(TRUE); - } - AclEnd = Acl->AclSize + (PVOID)Acl; - do - { - if ((PVOID)Current >= AclEnd) - { - return(FALSE); - } - if (Current->Header.AceType == ACCESS_ALLOWED_COMPOUND_ACE_TYPE && - Acl->AclRevision < ACL_REVISION3) - { - return(FALSE); - } - Current = (PACE)((PVOID)Current + (ULONG)Current->Header.AceSize); - i++; - } - while (i < Acl->AceCount); - - if ((PVOID)Current < AclEnd) - { - *Ace = Current; - } - - return(TRUE); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlGetAce(PACL Acl, - ULONG AceIndex, - PACE *Ace) -{ - ULONG i; - - *Ace = (PACE)(Acl + 1); - - if (Acl->AclRevision < MIN_ACL_REVISION || - Acl->AclRevision > MAX_ACL_REVISION) - { - return(STATUS_INVALID_PARAMETER); - } - - if (AceIndex >= Acl->AceCount) - { - return(STATUS_INVALID_PARAMETER); - } - - for (i = 0; i < AceIndex; i++) - { - if ((PVOID)*Ace >= (PVOID)Acl + Acl->AclSize) - { - return(STATUS_INVALID_PARAMETER); - } - *Ace = (PACE)((PVOID)(*Ace) + (ULONG)(*Ace)->Header.AceSize); - } - - if ((PVOID)*Ace >= (PVOID)Acl + Acl->AclSize) - { - return(STATUS_INVALID_PARAMETER); - } - - return(STATUS_SUCCESS); -} - - -static NTSTATUS -RtlpAddKnownAce (PACL Acl, - ULONG Revision, - ULONG Flags, - ACCESS_MASK AccessMask, - PSID Sid, - ULONG Type) -{ - PACE Ace; - - if (!RtlValidSid(Sid)) - { - return(STATUS_INVALID_SID); - } - if (Acl->AclRevision > MAX_ACL_REVISION || - Revision > MAX_ACL_REVISION) - { - return(STATUS_UNKNOWN_REVISION); - } - 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 = 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); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlAddAccessAllowedAce (IN OUT PACL Acl, - IN ULONG Revision, - IN ACCESS_MASK AccessMask, - IN PSID Sid) -{ - return RtlpAddKnownAce (Acl, - Revision, - 0, - AccessMask, - Sid, - ACCESS_ALLOWED_ACE_TYPE); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlAddAccessAllowedAceEx (IN OUT PACL Acl, - IN ULONG Revision, - IN ULONG Flags, - IN ACCESS_MASK AccessMask, - IN PSID Sid) -{ - return RtlpAddKnownAce (Acl, - Revision, - Flags, - AccessMask, - Sid, - ACCESS_ALLOWED_ACE_TYPE); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlAddAccessDeniedAce (PACL Acl, - ULONG Revision, - ACCESS_MASK AccessMask, - PSID Sid) -{ - return RtlpAddKnownAce (Acl, - Revision, - 0, - AccessMask, - Sid, - ACCESS_DENIED_ACE_TYPE); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlAddAccessDeniedAceEx (IN OUT PACL Acl, - IN ULONG Revision, - IN ULONG Flags, - IN ACCESS_MASK AccessMask, - IN PSID Sid) -{ - return RtlpAddKnownAce (Acl, - Revision, - Flags, - AccessMask, - Sid, - ACCESS_DENIED_ACE_TYPE); -} - - -static VOID -RtlpAddData(PVOID AceList, - ULONG AceListLength, - PVOID Ace, - ULONG Offset) -{ - if (Offset > 0) - { - memcpy((PUCHAR)Ace + AceListLength, - Ace, - Offset); - } - - if (AceListLength != 0) - { - memcpy(Ace, - AceList, - AceListLength); - } -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlAddAce(PACL Acl, - ULONG AclRevision, - ULONG StartingIndex, - PACE AceList, - ULONG AceListLength) -{ - PACE Ace; - ULONG i; - PACE Current; - ULONG j; - - if (Acl->AclRevision < MIN_ACL_REVISION || - Acl->AclRevision > MAX_ACL_REVISION) - { - return(STATUS_INVALID_PARAMETER); - } - - if (!RtlFirstFreeAce(Acl,&Ace)) - { - return(STATUS_INVALID_PARAMETER); - } - - if (Acl->AclRevision <= AclRevision) - { - AclRevision = Acl->AclRevision; - } - - if (((PVOID)AceList + AceListLength) <= (PVOID)AceList) - { - return(STATUS_INVALID_PARAMETER); - } - - i = 0; - Current = (PACE)(Acl + 1); - while ((PVOID)Current < ((PVOID)AceList + AceListLength)) - { - if (AceList->Header.AceType == ACCESS_ALLOWED_COMPOUND_ACE_TYPE && - AclRevision < ACL_REVISION3) - { - return(STATUS_INVALID_PARAMETER); - } - Current = (PACE)((PVOID)Current + Current->Header.AceSize); - } - - if (Ace == NULL) - { - return(STATUS_BUFFER_TOO_SMALL); - } - - if (((PVOID)Ace + AceListLength) >= ((PVOID)Acl + Acl->AclSize)) - { - return(STATUS_BUFFER_TOO_SMALL); - } - - if (StartingIndex != 0) - { - if (Acl->AceCount > 0) - { - Current = (PACE)(Acl + 1); - for (j = 0; j < StartingIndex; j++) - { - Current = (PACE)((PVOID)Current + Current->Header.AceSize); - } - } - } - - RtlpAddData(AceList, - AceListLength, - Current, - (ULONG)Ace - (ULONG)Current); - Acl->AceCount = Acl->AceCount + i; - Acl->AclRevision = AclRevision; - - return(STATUS_SUCCESS); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlAddAuditAccessAce(PACL Acl, - ULONG Revision, - ACCESS_MASK AccessMask, - PSID Sid, - BOOLEAN Success, - BOOLEAN Failure) -{ - PACE Ace; - ULONG Flags = 0; - - 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, - ULONG Offset) -{ - if (AceSize < Offset) - { - memcpy(Ace, - (PUCHAR)Ace + AceSize, - Offset - AceSize); - } - - if (Offset - AceSize < Offset) - { - memset((PUCHAR)Ace + Offset - AceSize, - 0, - AceSize); - } -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlDeleteAce(PACL Acl, - ULONG AceIndex) -{ - PACE Ace; - PACE Current; - - if (Acl->AclRevision < MIN_ACL_REVISION || - Acl->AclRevision > MAX_ACL_REVISION) - { - return(STATUS_INVALID_PARAMETER); - } - - if (Acl->AceCount <= AceIndex) - { - return(STATUS_INVALID_PARAMETER); - } - - if (!RtlFirstFreeAce(Acl, &Ace)) - { - return(STATUS_INVALID_PARAMETER); - } - - Current = (PACE)(Acl + 1); - - while(AceIndex--) - { - Current = (PACE)((PVOID)Current + Current->Header.AceSize); - } - - RtlpDeleteData(Current, - Current->Header.AceSize, - Ace - Current); - Acl->AceCount++; - - return(STATUS_SUCCESS); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlCreateAcl(PACL Acl, - ULONG AclSize, - ULONG AclRevision) -{ - if (AclSize < 8) - { - return(STATUS_BUFFER_TOO_SMALL); - } - - if (AclRevision < MIN_ACL_REVISION || - AclRevision > MAX_ACL_REVISION) - { - return(STATUS_INVALID_PARAMETER); - } - - if (AclSize > 0xffff) - { - return(STATUS_INVALID_PARAMETER); - } - - AclSize = AclSize & ~(0x3); - Acl->AclSize = AclSize; - Acl->AclRevision = AclRevision; - Acl->AceCount = 0; - Acl->Sbz1 = 0; - Acl->Sbz2 = 0; - - return(STATUS_SUCCESS); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlQueryInformationAcl(PACL Acl, - PVOID Information, - ULONG InformationLength, - ACL_INFORMATION_CLASS InformationClass) -{ - PACE Ace; - - if (Acl->AclRevision < MIN_ACL_REVISION || - Acl->AclRevision > MAX_ACL_REVISION) - { - return(STATUS_INVALID_PARAMETER); - } - - switch (InformationClass) - { - case AclRevisionInformation: - { - PACL_REVISION_INFORMATION Info = (PACL_REVISION_INFORMATION)Information; - - if (InformationLength < sizeof(ACL_REVISION_INFORMATION)) - { - return(STATUS_BUFFER_TOO_SMALL); - } - Info->AclRevision = Acl->AclRevision; - } - break; - - case AclSizeInformation: - { - PACL_SIZE_INFORMATION Info = (PACL_SIZE_INFORMATION)Information; - - if (InformationLength < sizeof(ACL_SIZE_INFORMATION)) - { - return(STATUS_BUFFER_TOO_SMALL); - } - - if (!RtlFirstFreeAce(Acl, &Ace)) - { - return(STATUS_INVALID_PARAMETER); - } - - Info->AceCount = Acl->AceCount; - if (Ace != NULL) - { - Info->AclBytesInUse = (PVOID)Ace - (PVOID)Acl; - Info->AclBytesFree = Acl->AclSize - Info->AclBytesInUse; - } - else - { - Info->AclBytesInUse = Acl->AclSize; - Info->AclBytesFree = 0; - } - } - break; - - default: - return(STATUS_INVALID_INFO_CLASS); - } - - return(STATUS_SUCCESS); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlSetInformationAcl(PACL Acl, - PVOID Information, - ULONG InformationLength, - ACL_INFORMATION_CLASS InformationClass) -{ - if (Acl->AclRevision < MIN_ACL_REVISION || - Acl->AclRevision > MAX_ACL_REVISION) - { - return(STATUS_INVALID_PARAMETER); - } - - switch (InformationClass) - { - case AclRevisionInformation: - { - PACL_REVISION_INFORMATION Info = (PACL_REVISION_INFORMATION)Information; - - if (InformationLength < sizeof(ACL_REVISION_INFORMATION)) - { - return(STATUS_BUFFER_TOO_SMALL); - } - - if (Acl->AclRevision >= Info->AclRevision) - { - return(STATUS_INVALID_PARAMETER); - } - - Acl->AclRevision = Info->AclRevision; - } - break; - - default: - return(STATUS_INVALID_INFO_CLASS); - } - - return(STATUS_SUCCESS); -} - - -/* - * @implemented - */ -BOOLEAN STDCALL -RtlValidAcl (PACL Acl) -{ - PACE Ace; - USHORT Size; - - Size = (Acl->AclSize + 3) & ~3; - - if (Acl->AclRevision < MIN_ACL_REVISION || - Acl->AclRevision > MAX_ACL_REVISION) - { - return(FALSE); - } - - if (Size != Acl->AclSize) - { - return(FALSE); - } - - return(RtlFirstFreeAce(Acl, &Ace)); -} - -/* EOF */ diff --git a/reactos/lib/ntdll/rtl/compress.c b/reactos/lib/ntdll/rtl/compress.c deleted file mode 100644 index 6e816342559..00000000000 --- a/reactos/lib/ntdll/rtl/compress.c +++ /dev/null @@ -1,224 +0,0 @@ -/* - * ReactOS kernel - * Copyright (C) 2002 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: compress.c,v 1.3 2003/11/17 20:35:46 sedwards Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * PURPOSE: Compression and decompression functions - * FILE: lib/ntdll/rtl/compress.c - * PROGRAMER: Eric Kohl (ekohl@rz-online.de) - */ - -/* INCLUDES *****************************************************************/ - -#include <ddk/ntddk.h> - - -/* MACROS *******************************************************************/ - -#define COMPRESSION_FORMAT_MASK 0x00FF -#define COMPRESSION_ENGINE_MASK 0xFF00 - - -/* FUNCTIONS ****************************************************************/ - - -static NTSTATUS -RtlpCompressBufferLZNT1(USHORT Engine, - PUCHAR UncompressedBuffer, - ULONG UncompressedBufferSize, - PUCHAR CompressedBuffer, - ULONG CompressedBufferSize, - ULONG UncompressedChunkSize, - PULONG FinalCompressedSize, - PVOID WorkSpace) -{ - return(STATUS_NOT_IMPLEMENTED); -} - - -static NTSTATUS -RtlpWorkSpaceSizeLZNT1(USHORT Engine, - PULONG BufferAndWorkSpaceSize, - PULONG FragmentWorkSpaceSize) -{ - if (Engine == COMPRESSION_ENGINE_STANDARD) - { - *BufferAndWorkSpaceSize = 0x8010; - *FragmentWorkSpaceSize = 0x1000; - return(STATUS_SUCCESS); - } - else if (Engine == COMPRESSION_ENGINE_MAXIMUM) - { - *BufferAndWorkSpaceSize = 0x10; - *FragmentWorkSpaceSize = 0x1000; - return(STATUS_SUCCESS); - } - - return(STATUS_NOT_SUPPORTED); -} - - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlCompressBuffer(IN USHORT CompressionFormatAndEngine, - IN PUCHAR UncompressedBuffer, - IN ULONG UncompressedBufferSize, - OUT PUCHAR CompressedBuffer, - IN ULONG CompressedBufferSize, - IN ULONG UncompressedChunkSize, - OUT PULONG FinalCompressedSize, - IN PVOID WorkSpace) -{ - USHORT Format = CompressionFormatAndEngine & COMPRESSION_FORMAT_MASK; - USHORT Engine = CompressionFormatAndEngine & COMPRESSION_ENGINE_MASK; - - if ((Format == COMPRESSION_FORMAT_NONE) || - (Format == COMPRESSION_FORMAT_DEFAULT)) - return(STATUS_INVALID_PARAMETER); - - if (Format == COMPRESSION_FORMAT_LZNT1) - return(RtlpCompressBufferLZNT1(Engine, - UncompressedBuffer, - UncompressedBufferSize, - CompressedBuffer, - CompressedBufferSize, - UncompressedChunkSize, - FinalCompressedSize, - WorkSpace)); - - return(STATUS_UNSUPPORTED_COMPRESSION); -} - - -#if 0 -NTSTATUS STDCALL -RtlCompressChunks(IN PUCHAR UncompressedBuffer, - IN ULONG UncompressedBufferSize, - OUT PUCHAR CompressedBuffer, - IN ULONG CompressedBufferSize, - IN OUT PCOMPRESSED_DATA_INFO CompressedDataInfo, - IN ULONG CompressedDataInfoLength, - IN PVOID WorkSpace) -{ - return(STATUS_NOT_IMPLEMENTED); -} -#endif - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlDecompressBuffer(IN USHORT CompressionFormat, - OUT PUCHAR UncompressedBuffer, - IN ULONG UncompressedBufferSize, - IN PUCHAR CompressedBuffer, - IN ULONG CompressedBufferSize, - OUT PULONG FinalUncompressedSize) -{ - return(STATUS_NOT_IMPLEMENTED); -} - - -#if 0 -NTSTATUS STDCALL -RtlDecompressChunks(OUT PUCHAR UncompressedBuffer, - IN ULONG UncompressedBufferSize, - IN PUCHAR CompressedBuffer, - IN ULONG CompressedBufferSize, - IN PUCHAR CompressedTail, - IN ULONG CompressedTailSize, - IN PCOMPRESSED_DATA_INFO CompressedDataInfo) -{ - return(STATUS_NOT_IMPLEMENTED); -} -#endif - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlDecompressFragment(IN USHORT CompressionFormat, - OUT PUCHAR UncompressedFragment, - IN ULONG UncompressedFragmentSize, - IN PUCHAR CompressedBuffer, - IN ULONG CompressedBufferSize, - IN ULONG FragmentOffset, - OUT PULONG FinalUncompressedSize, - IN PVOID WorkSpace) -{ - return(STATUS_NOT_IMPLEMENTED); -} - - -#if 0 -NTSTATUS STDCALL -RtlDescribeChunk(IN USHORT CompressionFormat, - IN OUT PUCHAR *CompressedBuffer, - IN PUCHAR EndOfCompressedBufferPlus1, - OUT PUCHAR *ChunkBuffer, - OUT PULONG ChunkSize) -{ - return(STATUS_NOT_IMPLEMENTED); -} -#endif - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlGetCompressionWorkSpaceSize(IN USHORT CompressionFormatAndEngine, - OUT PULONG CompressBufferAndWorkSpaceSize, - OUT PULONG CompressFragmentWorkSpaceSize) -{ - USHORT Format = CompressionFormatAndEngine & COMPRESSION_FORMAT_MASK; - USHORT Engine = CompressionFormatAndEngine & COMPRESSION_ENGINE_MASK; - - if ((Format == COMPRESSION_FORMAT_NONE) || - (Format == COMPRESSION_FORMAT_DEFAULT)) - return(STATUS_INVALID_PARAMETER); - - if (Format == COMPRESSION_FORMAT_LZNT1) - return(RtlpWorkSpaceSizeLZNT1(Engine, - CompressBufferAndWorkSpaceSize, - CompressFragmentWorkSpaceSize)); - - return(STATUS_UNSUPPORTED_COMPRESSION); -} - - -#if 0 -NTSTATUS STDCALL -RtlReserveChunk(IN USHORT CompressionFormat, - IN OUT PUCHAR *CompressedBuffer, - IN PUCHAR EndOfCompressedBufferPlus1, - OUT PUCHAR *ChunkBuffer, - IN ULONG ChunkSize) -{ - return(STATUS_NOT_IMPLEMENTED); -} -#endif - -/* EOF */ diff --git a/reactos/lib/ntdll/rtl/dos8dot3.c b/reactos/lib/ntdll/rtl/dos8dot3.c deleted file mode 100644 index 678c3a36b86..00000000000 --- a/reactos/lib/ntdll/rtl/dos8dot3.c +++ /dev/null @@ -1,335 +0,0 @@ -/* - * ReactOS kernel - * Copyright (C) 2002 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: dos8dot3.c,v 1.8 2003/12/08 19:47:07 hbirr Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS system libraries - * FILE: lib/ntdll/rtl/dos8dot3.c - * PURPOSE: Short name (8.3 name) functions - * PROGRAMMER: Eric Kohl - */ - -/* INCLUDES ******************************************************************/ - -#include <ddk/ntddk.h> -#include <ntos/minmax.h> - -#define NDEBUG -#include <ntdll/ntdll.h> - - -/* CONSTANTS *****************************************************************/ - -const PCHAR RtlpShortIllegals = " ;+=[],\"*\\<>/?:|"; - - -/* FUNCTIONS *****************************************************************/ - -static BOOLEAN -RtlpIsShortIllegal(WCHAR Char) -{ - return strchr(RtlpShortIllegals, Char) ? TRUE : FALSE; -} - -static USHORT -RtlpGetCheckSum(PUNICODE_STRING Name) -{ - USHORT Hash = 0; - ULONG Length; - PWCHAR c; - - Length = Name->Length / sizeof(WCHAR); - c = Name->Buffer; - while(Length--) - { - Hash = (Hash + (*c << 4) + (*c >> 4)) * 11; - c++; - } - return Hash; -} - -static ULONG -RtlpGetIndexLength(ULONG Index) -{ - ULONG Length = 0; - while (Index) - { - Index /= 10; - Length++; - } - return Length ? Length : 1; -} - -/* - * @implemented - */ -VOID STDCALL -RtlGenerate8dot3Name(IN PUNICODE_STRING Name, - IN BOOLEAN AllowExtendedCharacters, - IN OUT PGENERATE_NAME_CONTEXT Context, - OUT PUNICODE_STRING Name8dot3) -{ - ULONG Count; - WCHAR NameBuffer[8]; - WCHAR ExtBuffer[4]; - ULONG StrLength; - ULONG NameLength; - ULONG ExtLength; - ULONG CopyLength; - ULONG DotPos; - ULONG i, j; - ULONG IndexLength; - ULONG CurrentIndex; - USHORT Checksum; - CHAR c; - - StrLength = Name->Length / sizeof(WCHAR); - DPRINT("StrLength: %hu\n", StrLength); - - /* Find last dot in Name */ - DotPos = 0; - for (i = 0; i < StrLength; i++) - { - if (Name->Buffer[i] == L'.') - { - DotPos = i; - } - } - - if (DotPos == 0) - { - DotPos = i; - } - DPRINT("DotPos: %hu\n", DotPos); - - /* Copy name (6 valid characters max) */ - for (i = 0, NameLength = 0; NameLength < 6 && i < DotPos; i++) - { - c = 0; - RtlUpcaseUnicodeToOemN(&c, sizeof(CHAR), &Count, &Name->Buffer[i], sizeof(WCHAR)); - if (Count != 1 || c == 0 || RtlpIsShortIllegal(c)) - { - NameBuffer[NameLength++] = L'_'; - } - else if (c != '.') - { - NameBuffer[NameLength++] = (WCHAR)c; - } - } - - DPRINT("NameBuffer: '%.08S'\n", NameBuffer); - DPRINT("NameLength: %hu\n", NameLength); - - /* Copy extension (4 valid characters max) */ - if (DotPos < StrLength) - { - for (i = DotPos, ExtLength = 0; ExtLength < 4 && i < StrLength; i++) - { - c = 0; - RtlUpcaseUnicodeToOemN(&c, sizeof(CHAR), &Count, &Name->Buffer[i], sizeof(WCHAR)); - if (Count != 1 || c == 0 || RtlpIsShortIllegal(Name->Buffer[i])) - { - ExtBuffer[ExtLength++] = L'_'; - } - else - { - ExtBuffer[ExtLength++] = c; - } - } - } - else - { - ExtLength = 0; - } - DPRINT("ExtBuffer: '%.04S'\n", ExtBuffer); - DPRINT("ExtLength: %hu\n", ExtLength); - - /* Determine next index */ - IndexLength = RtlpGetIndexLength(Context->LastIndexValue); - if (Context->CheckSumInserted) - { - CopyLength = min(NameLength, 8 - 4 - 1 - IndexLength); - Checksum = RtlpGetCheckSum(Name); - } - else - { - CopyLength = min(NameLength, 8 - 1 - IndexLength); - Checksum = 0; - } - - DPRINT("CopyLength: %hu\n", CopyLength); - - if ((Context->NameLength == CopyLength) && - (wcsncmp(Context->NameBuffer, NameBuffer, CopyLength) == 0) && - (Context->ExtensionLength == ExtLength) && - (wcsncmp(Context->ExtensionBuffer, ExtBuffer, ExtLength) == 0) && - (Checksum == Context->Checksum) && - (Context->LastIndexValue < 999)) - { - CHECKPOINT; - Context->LastIndexValue++; - if (Context->CheckSumInserted == FALSE && - Context->LastIndexValue > 9) - { - Context->CheckSumInserted = TRUE; - Context->LastIndexValue = 1; - Context->Checksum = RtlpGetCheckSum(Name); - } - } - else - { - CHECKPOINT; - Context->LastIndexValue = 1; - Context->CheckSumInserted = FALSE; - } - - IndexLength = RtlpGetIndexLength(Context->LastIndexValue); - - DPRINT("CurrentIndex: %hu, IndexLength %hu\n", Context->LastIndexValue, IndexLength); - - if (Context->CheckSumInserted) - { - CopyLength = min(NameLength, 8 - 4 - 1 - IndexLength); - } - else - { - CopyLength = min(NameLength, 8 - 1 - IndexLength); - } - - /* Build the short name */ - memcpy(Name8dot3->Buffer, NameBuffer, CopyLength * sizeof(WCHAR)); - j = CopyLength; - if (Context->CheckSumInserted) - { - j += 3; - Checksum = Context->Checksum; - for (i = 0; i < 4; i++) - { - Name8dot3->Buffer[j--] = (Checksum % 16) > 9 ? (Checksum % 16) + L'A' - 10 : (Checksum % 16) + L'0'; - Checksum /= 16; - } - j = CopyLength + 4; - } - Name8dot3->Buffer[j++] = L'~'; - j += IndexLength - 1; - CurrentIndex = Context->LastIndexValue; - for (i = 0; i < IndexLength; i++) - { - Name8dot3->Buffer[j--] = (CurrentIndex % 10) + L'0'; - CurrentIndex /= 10; - } - j += IndexLength + 1; - - memcpy(Name8dot3->Buffer + j, ExtBuffer, ExtLength * sizeof(WCHAR)); - Name8dot3->Length = (j + ExtLength) * sizeof(WCHAR); - - DPRINT("Name8dot3: '%wZ'\n", Name8dot3); - - /* Update context */ - Context->NameLength = CopyLength; - Context->ExtensionLength = ExtLength; - memcpy(Context->NameBuffer, NameBuffer, CopyLength * sizeof(WCHAR)); - memcpy(Context->ExtensionBuffer, ExtBuffer, ExtLength * sizeof(WCHAR)); -} - - -/* - * @implemented - */ -BOOLEAN STDCALL -RtlIsNameLegalDOS8Dot3(IN PUNICODE_STRING UnicodeName, - IN PANSI_STRING AnsiName, - OUT PBOOLEAN SpacesFound) -{ - PANSI_STRING name = AnsiName; - ANSI_STRING DummyString; - CHAR Buffer[12]; - char *str; - ULONG Length; - ULONG i; - NTSTATUS Status; - BOOLEAN HasSpace = FALSE; - BOOLEAN HasDot = FALSE; - - if (UnicodeName->Length > 24) - { - return(FALSE); /* name too long */ - } - - if (!name) - { - name = &DummyString; - name->Length = 0; - name->MaximumLength = 12; - name->Buffer = Buffer; - } - - Status = RtlUpcaseUnicodeStringToCountedOemString(name, - UnicodeName, - FALSE); - if (!NT_SUCCESS(Status)) - { - return(FALSE); - } - - Length = name->Length; - str = name->Buffer; - - if (!(Length == 1 && *str == '.') && - !(Length == 2 && *str == '.' && *(str + 1) == '.')) - { - for (i = 0; i < Length; i++, str++) - { - switch (*str) - { - case ' ': - HasSpace = TRUE; - break; - - case '.': - if ((HasDot) || /* two or more dots */ - (i == 0) || /* dot is first char */ - (i + 1 == Length) || /* dot is last char */ - (Length - i > 4) || /* more than 3 chars of extension */ - (HasDot == FALSE && i > 8)) /* name is longer than 8 chars */ - return(FALSE); - HasDot = TRUE; - break; - default: - if (RtlpIsShortIllegal(*str)) - { - return(FALSE); - } - } - } - } - - /* Name is longer than 8 chars and does not have an extension */ - if (Length > 8 && HasDot == FALSE) - { - return(FALSE); - } - - if (SpacesFound) - *SpacesFound = HasSpace; - - return(TRUE); -} - -/* EOF */ diff --git a/reactos/lib/ntdll/rtl/env.c b/reactos/lib/ntdll/rtl/env.c deleted file mode 100644 index 205781189f9..00000000000 --- a/reactos/lib/ntdll/rtl/env.c +++ /dev/null @@ -1,521 +0,0 @@ -/* $Id: env.c,v 1.22 2004/03/19 12:38:07 ekohl Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS system libraries - * FILE: lib/ntdll/rtl/env.c - * PURPOSE: Environment functions - * PROGRAMMER: Eric Kohl - * UPDATE HISTORY: - * Created 30/09/98 - */ - -/* INCLUDES ******************************************************************/ - -#include <ddk/ntddk.h> -#include <ntdll/rtl.h> -#include <napi/teb.h> -#include <string.h> - -#define NDEBUG -#include <ntdll/ntdll.h> - - -/* FUNCTIONS *****************************************************************/ - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlCreateEnvironment(BOOLEAN Inherit, - PWSTR *Environment) -{ - MEMORY_BASIC_INFORMATION MemInfo; - PVOID EnvPtr = NULL; - NTSTATUS Status = STATUS_SUCCESS; - ULONG RegionSize = PAGE_SIZE; - - if (Inherit == TRUE) - { - RtlAcquirePebLock(); - - if (NtCurrentPeb()->ProcessParameters->Environment != NULL) - { - Status = NtQueryVirtualMemory(NtCurrentProcess(), - NtCurrentPeb()->ProcessParameters->Environment, - MemoryBasicInformation, - &MemInfo, - sizeof(MEMORY_BASIC_INFORMATION), - NULL); - if (!NT_SUCCESS(Status)) - { - RtlReleasePebLock(); - *Environment = NULL; - return(Status); - } - - RegionSize = MemInfo.RegionSize; - Status = NtAllocateVirtualMemory(NtCurrentProcess(), - &EnvPtr, - 0, - &RegionSize, - MEM_RESERVE | MEM_COMMIT, - PAGE_READWRITE); - if (!NT_SUCCESS(Status)) - { - RtlReleasePebLock(); - *Environment = NULL; - return(Status); - } - - memmove(EnvPtr, - NtCurrentPeb ()->ProcessParameters->Environment, - MemInfo.RegionSize); - - *Environment = EnvPtr; - } - - RtlReleasePebLock (); - } - else - { - Status = NtAllocateVirtualMemory(NtCurrentProcess(), - &EnvPtr, - 0, - &RegionSize, - MEM_RESERVE | MEM_COMMIT, - PAGE_READWRITE); - if (NT_SUCCESS(Status)) - { - memset(EnvPtr, - 0, - RegionSize); - *Environment = EnvPtr; - } - } - - return(Status); -} - - -/* - * @implemented - */ -VOID STDCALL -RtlDestroyEnvironment(PWSTR Environment) -{ - ULONG Size = 0; - - NtFreeVirtualMemory(NtCurrentProcess(), - (PVOID*)&Environment, - &Size, - MEM_RELEASE); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlExpandEnvironmentStrings_U(PWSTR Environment, - PUNICODE_STRING Source, - PUNICODE_STRING Destination, - PULONG Length) -{ - UNICODE_STRING var; - UNICODE_STRING val; - NTSTATUS Status = STATUS_SUCCESS; - BOOLEAN flag = FALSE; - PWSTR s; - PWSTR d; - PWSTR w; - int src_len; - int dst_max; - int tail; - - DPRINT("RtlExpandEnvironmentStrings_U %p %wZ %p %p\n", - Environment, Source, Destination, Length); - - src_len = Source->Length / sizeof(WCHAR); - s = Source->Buffer; - dst_max = Destination->MaximumLength / sizeof(WCHAR); - d = Destination->Buffer; - - while (src_len) - { - if (*s == L'%') - { - if (flag) - { - flag = FALSE; - goto copy; - } - w = s + 1; - tail = src_len - 1; - while (*w != L'%' && tail) - { - w++; - tail--; - } - if (!tail) - goto copy; - - var.Length = (w - ( s + 1)) * sizeof(WCHAR); - var.MaximumLength = var.Length; - var.Buffer = s + 1; - - val.Length = 0; - val.MaximumLength = dst_max * sizeof(WCHAR); - val.Buffer = d; - Status = RtlQueryEnvironmentVariable_U (Environment, &var, &val); - if (NT_SUCCESS(Status)) - { - d += val.Length / sizeof(WCHAR); - dst_max -= val.Length / sizeof(WCHAR); - s = w + 1; - src_len = tail - 1; - continue; - } - /* variable not found or buffer too small, just copy %var% */ - flag = TRUE; - } -copy: - if (!dst_max) - { - Status = STATUS_BUFFER_TOO_SMALL; - break; - } - - *d++ = *s++; - dst_max--; - src_len--; - } - - Destination->Length = (d - Destination->Buffer) * sizeof(WCHAR); - if (Length != NULL) - *Length = Destination->Length; - if (dst_max) - Destination->Buffer[Destination->Length / sizeof(WCHAR)] = 0; - - DPRINT("Destination %wZ\n", Destination); - return(Status); -} - - -/* - * @implemented - */ -VOID STDCALL -RtlSetCurrentEnvironment(PWSTR NewEnvironment, - PWSTR *OldEnvironment) -{ - PVOID EnvPtr; - - DPRINT("NewEnvironment %x OldEnvironment %x\n", - NewEnvironment, OldEnvironment); - - RtlAcquirePebLock(); - - EnvPtr = NtCurrentPeb()->ProcessParameters->Environment; - NtCurrentPeb()->ProcessParameters->Environment = NewEnvironment; - - if (OldEnvironment != NULL) - *OldEnvironment = EnvPtr; - - RtlReleasePebLock(); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlSetEnvironmentVariable(PWSTR *Environment, - PUNICODE_STRING Name, - PUNICODE_STRING Value) -{ - MEMORY_BASIC_INFORMATION mbi; - UNICODE_STRING var; - int hole_len, new_len, env_len = 0; - WCHAR *new_env = 0, *env_end = 0, *wcs, *env, *val = 0, *tail = 0, *hole = 0; - PWSTR head = NULL; - ULONG size = 0, new_size; - LONG f = 1; - NTSTATUS Status = STATUS_SUCCESS; - - DPRINT("RtlSetEnvironmentVariable(Environment %p Name %wZ Value %wZ)\n", - Environment, Name, Value); - - if (Environment) - { - env = *Environment; - } - else - { - RtlAcquirePebLock(); - env = NtCurrentPeb()->ProcessParameters->Environment; - } - - if (env) - { - /* get environment length */ - wcs = env_end = env; - do - { - env_end += wcslen(env_end) + 1; - } - while (*env_end); - env_end++; - env_len = env_end - env; - DPRINT("environment length %ld characters\n", env_len); - - /* find where to insert */ - while (*wcs) - { - var.Buffer = wcs++; - wcs = wcschr(wcs, L'='); - if (wcs == NULL) - { - wcs = var.Buffer + wcslen(var.Buffer); - } - if (*wcs) - { - var.Length = (wcs - var.Buffer) * sizeof(WCHAR); - var.MaximumLength = var.Length; - val = ++wcs; - wcs += wcslen(wcs); - f = RtlCompareUnicodeString(&var, Name, TRUE); - if (f >= 0) - { - if (f) /* Insert before found */ - { - hole = tail = var.Buffer; - } - else /* Exact match */ - { - head = var.Buffer; - tail = ++wcs; - hole = val; - } - goto found; - } - } - wcs++; - } - hole = tail = wcs; /* Append to environment */ - } - -found: - if (Value->Length > 0) - { - hole_len = tail - hole; - /* calculate new environment size */ - new_size = Value->Length + sizeof(WCHAR); - /* adding new variable */ - if (f) - new_size += Name->Length + sizeof(WCHAR); - new_len = new_size / sizeof(WCHAR); - if (hole_len < new_len) - { - /* enlarge environment size */ - /* check the size of available memory */ - new_size += (env_len - hole_len) * sizeof(WCHAR); - new_size = ROUNDUP(new_size, PAGE_SIZE); - mbi.RegionSize = 0; - DPRINT("new_size %lu\n", new_size); - - if (env) - { - Status = NtQueryVirtualMemory(NtCurrentProcess(), - env, - MemoryBasicInformation, - &mbi, - sizeof(MEMORY_BASIC_INFORMATION), - NULL); - if (!NT_SUCCESS(Status)) - { - if (Environment == NULL) - { - RtlReleasePebLock(); - } - return(Status); - } - } - - if (new_size > mbi.RegionSize) - { - /* reallocate memory area */ - Status = NtAllocateVirtualMemory(NtCurrentProcess(), - (VOID**)&new_env, - 0, - &new_size, - MEM_RESERVE | MEM_COMMIT, - PAGE_READWRITE); - if (!NT_SUCCESS(Status)) - { - if (Environment == NULL) - { - RtlReleasePebLock(); - } - return(Status); - } - - if (env) - { - memmove(new_env, - env, - (hole - env) * sizeof(WCHAR)); - hole = new_env + (hole - env); - } - else - { - /* absolutely new environment */ - tail = hole = new_env; - *hole = 0; - env_end = hole + 1; - } - } - } - - /* move tail */ - memmove (hole + new_len, tail, (env_end - tail) * sizeof(WCHAR)); - - if (new_env) - { - /* we reallocated environment, let's free the old one */ - if (Environment) - *Environment = new_env; - else - NtCurrentPeb()->ProcessParameters->Environment = new_env; - - if (env) - { - size = 0; - NtFreeVirtualMemory(NtCurrentProcess(), - (PVOID*)&env, - &size, - MEM_RELEASE); - } - } - - /* and now copy given stuff */ - if (f) - { - /* copy variable name and '=' character */ - memmove(hole, - Name->Buffer, - Name->Length); - hole += Name->Length / sizeof(WCHAR); - *hole++ = L'='; - } - - /* copy value */ - memmove(hole, - Value->Buffer, - Value->Length); - hole += Value->Length / sizeof(WCHAR); - *hole = 0; - } - else - { - /* remove the environment variable */ - if (f == 0) - { - memmove(head, - tail, - (env_end - tail) * sizeof(WCHAR)); - } - else - { - Status = STATUS_VARIABLE_NOT_FOUND; - } - } - - if (Environment == NULL) - { - RtlReleasePebLock(); - } - - return(Status); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlQueryEnvironmentVariable_U(PWSTR Environment, - PUNICODE_STRING Name, - PUNICODE_STRING Value) -{ - NTSTATUS Status; - PWSTR wcs; - UNICODE_STRING var; - PWSTR val; - int len; - BOOLEAN SysEnvUsed = FALSE; - - DPRINT("RtlQueryEnvironmentVariable_U Environment %p Variable %wZ Value %p\n", - Environment, Name, Value); - - if (Environment == NULL) - { - Environment = NtCurrentPeb()->ProcessParameters->Environment; - SysEnvUsed = TRUE; - } - - if (Environment == NULL) - return(STATUS_VARIABLE_NOT_FOUND); - - Value->Length = 0; - if (SysEnvUsed == TRUE) - RtlAcquirePebLock(); - - wcs = Environment; - len = Name->Length / sizeof(WCHAR); - while (*wcs) - { - var.Buffer = wcs++; - wcs = wcschr(wcs, L'='); - if (wcs == NULL) - { - wcs = var.Buffer + wcslen(var.Buffer); - } - if (*wcs) - { - var.Length = var.MaximumLength = (wcs - var.Buffer) * sizeof(WCHAR); - val = ++wcs; - wcs += wcslen(wcs); - - if (RtlEqualUnicodeString(&var, Name, TRUE)) - { - Value->Length = (wcs - val) * sizeof(WCHAR); - if (Value->Length < Value->MaximumLength) - { - memcpy(Value->Buffer, val, Value->Length + sizeof(WCHAR)); - DPRINT("Value %S\n", val); - DPRINT("Return STATUS_SUCCESS\n"); - Status = STATUS_SUCCESS; - } - else - { - DPRINT("Return STATUS_BUFFER_TOO_SMALL\n"); - Status = STATUS_BUFFER_TOO_SMALL; - } - - if (SysEnvUsed == TRUE) - RtlReleasePebLock(); - - return(Status); - } - } - wcs++; - } - - if (SysEnvUsed == TRUE) - RtlReleasePebLock(); - - DPRINT("Return STATUS_VARIABLE_NOT_FOUND\n"); - return(STATUS_VARIABLE_NOT_FOUND); -} - -/* EOF */ diff --git a/reactos/lib/ntdll/rtl/error.c b/reactos/lib/ntdll/rtl/error.c deleted file mode 100644 index 68c76e9bc67..00000000000 --- a/reactos/lib/ntdll/rtl/error.c +++ /dev/null @@ -1,933 +0,0 @@ -/* $Id: error.c,v 1.15 2004/02/28 15:12:49 navaraf Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * PURPOSE: Rtl error functions - * FILE: lib/ntdll/rtl/error.c - * PROGRAMER: Eric Kohl - * REVISION HISTORY: - * 22/07/99: Added RtlNtStatusToDosError. - * 1999-12-18: STDCALL RtlNtStatusToDosError - */ - -/* - * Partially taken from WINE, original copyright: - * - * Copyright 2000 Alexandre Julliard - */ - - -/* INCLUDES *****************************************************************/ - -#include <ddk/ntddk.h> -#include <windows.h> - -#define NDEBUG -#include <ntdll/ntdll.h> - -/* TYPES *******************************************************************/ - -typedef struct _ERROR_TABLE -{ - ULONG Start; - ULONG End; - const WORD *Table; -} ERROR_TABLE, *PERROR_TABLE; - - -/* FUNCTIONS ***************************************************************/ - -static const WORD table_00000103[11] = -{ - ERROR_IO_PENDING, /* 00000103 (STATUS_PENDING) */ - ERROR_MR_MID_NOT_FOUND, /* 00000104 (STATUS_REPARSE) */ - ERROR_MORE_DATA, /* 00000105 (STATUS_MORE_ENTRIES) */ - ERROR_NOT_ALL_ASSIGNED, /* 00000106 (STATUS_NOT_ALL_ASSIGNED) */ - ERROR_SOME_NOT_MAPPED, /* 00000107 (STATUS_SOME_NOT_MAPPED) */ - ERROR_MR_MID_NOT_FOUND, /* 00000108 (STATUS_OPLOCK_BREAK_IN_PROCESS) */ - ERROR_MR_MID_NOT_FOUND, /* 00000109 (STATUS_VOLUME_MOUNTED) */ - ERROR_MR_MID_NOT_FOUND, /* 0000010a (STATUS_RXACT_COMMITTED) */ - ERROR_MR_MID_NOT_FOUND, /* 0000010b (STATUS_NOTIFY_CLEANUP) */ - ERROR_NOTIFY_ENUM_DIR, /* 0000010c (STATUS_NOTIFY_ENUM_DIR) */ - ERROR_NO_QUOTAS_FOR_ACCOUNT /* 0000010d (STATUS_NO_QUOTAS_FOR_ACCOUNT) */ -// /* 0000010e (STATUS_PRIMARY_TRANSPORT_CONNECT_FAILED) */ -}; - -static const WORD table_40000002[12] = -{ - ERROR_INVALID_PARAMETER, /* 40000002 */ - ERROR_MR_MID_NOT_FOUND, /* 40000003 */ - ERROR_MR_MID_NOT_FOUND, /* 40000004 */ - ERROR_MR_MID_NOT_FOUND, /* 40000005 */ - ERROR_LOCAL_USER_SESSION_KEY, /* 40000006 (STATUS_LOCAL_USER_SESSION_KEY) */ - ERROR_MR_MID_NOT_FOUND, /* 40000007 */ - ERROR_MORE_WRITES, /* 40000008 (STATUS_SERIAL_MORE_WRITES) */ - ERROR_REGISTRY_RECOVERED, /* 40000009 (STATUS_REGISTRY_RECOVERED) */ - ERROR_MR_MID_NOT_FOUND, /* 4000000a */ - ERROR_MR_MID_NOT_FOUND, /* 4000000b */ - ERROR_COUNTER_TIMEOUT, /* 4000000c (STATUS_SERIAL_COUNTER_TIMEOUT) */ - ERROR_NULL_LM_PASSWORD /* 4000000d (STATUS_NULL_LM_PASSWORD) */ -}; - -static const WORD table_40020056[1] = -{ - RPC_S_UUID_LOCAL_ONLY /* 40020056 */ -}; - -static const WORD table_400200af[1] = -{ - RPC_S_SEND_INCOMPLETE /* 400200af */ -}; - -static const WORD table_80000001[38] = -{ - 0, /* 80000001 (STATUS_GUARD_PAGE_VIOLATION) */ - ERROR_NOACCESS, /* 80000002 (STATUS_DATATYPE_MISALIGNMENT) */ - 0, /* 80000003 (STATUS_BREAKPOINT) */ - 0, /* 80000004 (STATUS_SINGLE_STEP) */ - ERROR_MORE_DATA, /* 80000005 (STATUS_BUFFER_OVERFLOW) */ - ERROR_NO_MORE_FILES, /* 80000006 (STATUS_NO_MORE_FILES) */ - ERROR_MR_MID_NOT_FOUND, /* 80000007 (STATUS_WAKE_SYSTEM_DEBUGGER) */ - ERROR_MR_MID_NOT_FOUND, /* 80000008 */ - ERROR_MR_MID_NOT_FOUND, /* 80000009 */ - ERROR_MR_MID_NOT_FOUND, /* 8000000a (STATUS_HANDLES_CLOSED) */ - ERROR_NO_INHERITANCE, /* 8000000b (STATUS_NO_INHERITANCE) */ - ERROR_MR_MID_NOT_FOUND, /* 8000000c (STATUS_GUID_SUBSTITUTION_MADE) */ - ERROR_PARTIAL_COPY, /* 8000000d (STATUS_PARTIAL_COPY) */ - ERROR_OUT_OF_PAPER, /* 8000000e (STATUS_DEVICE_PAPER_EMPTY) */ - ERROR_NOT_READY, /* 8000000f (STATUS_DEVICE_POWERED_OFF) */ - ERROR_NOT_READY, /* 80000010 (STATUS_DEVICE_OFF_LINE) */ - ERROR_BUSY, /* 80000011 (STATUS_DEVICE_BUSY) */ - ERROR_NO_MORE_ITEMS, /* 80000012 (STATUS_NO_MORE_EAS) */ - ERROR_INVALID_EA_NAME, /* 80000013 (STATUS_INVALID_EA_NAME) */ - ERROR_EA_LIST_INCONSISTENT, /* 80000014 (STATUS_EA_LIST_INCONSISTENT) */ - ERROR_EA_LIST_INCONSISTENT, /* 80000015 (STATUS_INVALID_EA_FLAG) */ - ERROR_MEDIA_CHANGED, /* 80000016 (STATUS_VERIFY_REQUIRED) */ - ERROR_MR_MID_NOT_FOUND, /* 80000017 (STATUS_EXTRANEOUS_INFORMATION) */ - ERROR_MR_MID_NOT_FOUND, /* 80000018 (STATUS_RXACT_COMMIT_NECESSARY) */ - ERROR_MR_MID_NOT_FOUND, /* 80000019 */ - ERROR_NO_MORE_ITEMS, /* 8000001a (STATUS_NO_MORE_ENTRIES) */ - ERROR_FILEMARK_DETECTED, /* 8000001b (STATUS_FILEMARK_DETECTED) */ - ERROR_MEDIA_CHANGED, /* 8000001c (STATUS_MEDIA_CHANGED) */ - ERROR_BUS_RESET, /* 8000001d (STATUS_BUS_RESET) */ - ERROR_END_OF_MEDIA, /* 8000001e (STATUS_END_OF_MEDIA) */ - ERROR_BEGINNING_OF_MEDIA, /* 8000001f (STATUS_BEGINNING_OF_MEDIA) */ - ERROR_MR_MID_NOT_FOUND, /* 80000020 (STATUS_MEDIA_CHECK) */ - ERROR_SETMARK_DETECTED, /* 80000021 (STATUS_SETMARK_DETECTED) */ - ERROR_NO_DATA_DETECTED, /* 80000022 (STATUS_NO_DATA_DETECTED) */ - ERROR_MR_MID_NOT_FOUND, /* 80000023 (STATUS_REDIRECTOR_HAS_OPEN_HANDLES) */ - ERROR_MR_MID_NOT_FOUND, /* 80000024 (STATUS_SERVER_HAS_OPEN_HANDLES) */ - ERROR_ACTIVE_CONNECTIONS, /* 80000025 (STATUS_ALREADY_DISCONNECTED) */ - ERROR_MR_MID_NOT_FOUND /* 80000026 (STATUS_LONGJUMP) */ -}; - -static const WORD table_80090300[23] = -{ - ERROR_NO_SYSTEM_RESOURCES, /* 80090300 */ - ERROR_INVALID_HANDLE, /* 80090301 */ - ERROR_INVALID_FUNCTION, /* 80090302 */ - ERROR_BAD_NETPATH, /* 80090303 */ - ERROR_INTERNAL_ERROR, /* 80090304 */ - ERROR_NO_SUCH_PACKAGE, /* 80090305 */ - ERROR_NOT_OWNER, /* 80090306 */ - ERROR_NO_SUCH_PACKAGE, /* 80090307 */ - ERROR_INVALID_PARAMETER, /* 80090308 */ - ERROR_INVALID_PARAMETER, /* 80090309 */ - ERROR_NOT_SUPPORTED, /* 8009030a */ - ERROR_CANNOT_IMPERSONATE, /* 8009030b */ - ERROR_LOGON_FAILURE, /* 8009030c */ - ERROR_INVALID_PARAMETER, /* 8009030d */ - ERROR_NO_SUCH_LOGON_SESSION, /* 8009030e */ - ERROR_ACCESS_DENIED, /* 8009030f */ - ERROR_ACCESS_DENIED, /* 80090310 */ - ERROR_NO_LOGON_SERVERS, /* 80090311 */ - ERROR_MR_MID_NOT_FOUND, /* 80090312 */ - ERROR_MR_MID_NOT_FOUND, /* 80090313 */ - ERROR_MR_MID_NOT_FOUND, /* 80090314 */ - ERROR_MR_MID_NOT_FOUND, /* 80090315 */ - ERROR_NO_SUCH_PACKAGE /* 80090316 */ -}; - -static const WORD table_c0000001[411] = -{ - ERROR_GEN_FAILURE, /* c0000001 (STATUS_UNSUCCESSFUL) */ - ERROR_INVALID_FUNCTION, /* c0000002 (STATUS_NOT_IMPLEMENTED) */ - ERROR_INVALID_PARAMETER, /* c0000003 (STATUS_INVALID_INFO_CLASS) */ - ERROR_BAD_LENGTH, /* c0000004 (STATUS_INFO_LENGTH_MISMATCH) */ - ERROR_NOACCESS, /* c0000005 (STATUS_ACCESS_VIOLATION) */ - ERROR_SWAPERROR, /* c0000006 (STATUS_IN_PAGE_ERROR) */ - ERROR_PAGEFILE_QUOTA, /* c0000007 (STATUS_PAGEFILE_QUOTA) */ - ERROR_INVALID_HANDLE, /* c0000008 (STATUS_INVALID_HANDLE) */ - ERROR_STACK_OVERFLOW, /* c0000009 (STATUS_BAD_INITIAL_STACK) */ - ERROR_BAD_EXE_FORMAT, /* c000000a (STATUS_BAD_INITIAL_PC) */ - ERROR_INVALID_PARAMETER, /* c000000b (STATUS_INVALID_CID) */ - ERROR_MR_MID_NOT_FOUND, /* c000000c (STATUS_TIMER_NOT_CANCELED) */ - ERROR_INVALID_PARAMETER, /* c000000d (STATUS_INVALID_PARAMETER) */ - ERROR_FILE_NOT_FOUND, /* c000000e (STATUS_NO_SUCH_DEVICE) */ - ERROR_FILE_NOT_FOUND, /* c000000f (STATUS_NO_SUCH_FILE) */ - ERROR_INVALID_FUNCTION, /* c0000010 (STATUS_INVALID_DEVICE_REQUEST) */ - ERROR_HANDLE_EOF, /* c0000011 (STATUS_END_OF_FILE) */ - ERROR_WRONG_DISK, /* c0000012 (STATUS_WRONG_VOLUME) */ - ERROR_NOT_READY, /* c0000013 (STATUS_NO_MEDIA_IN_DEVICE) */ - ERROR_UNRECOGNIZED_MEDIA, /* c0000014 (STATUS_UNRECOGNIZED_MEDIA) */ - ERROR_SECTOR_NOT_FOUND, /* c0000015 (STATUS_NONEXISTENT_SECTOR) */ - ERROR_MORE_DATA, /* c0000016 (STATUS_MORE_PROCESSING_REQUIRED) */ - ERROR_NOT_ENOUGH_MEMORY, /* c0000017 (STATUS_NO_MEMORY) */ - ERROR_INVALID_ADDRESS, /* c0000018 (STATUS_CONFLICTING_ADDRESSES) */ - ERROR_INVALID_ADDRESS, /* c0000019 (STATUS_NOT_MAPPED_VIEW) */ - ERROR_INVALID_PARAMETER, /* c000001a (STATUS_UNABLE_TO_FREE_VM) */ - ERROR_INVALID_PARAMETER, /* c000001b (STATUS_UNABLE_TO_DELETE_SECTION) */ - ERROR_INVALID_FUNCTION, /* c000001c (STATUS_INVALID_SYSTEM_SERVICE) */ - 0, /* c000001d (STATUS_ILLEGAL_INSTRUCTION) */ - ERROR_ACCESS_DENIED, /* c000001e (STATUS_INVALID_LOCK_SEQUENCE) */ - ERROR_ACCESS_DENIED, /* c000001f (STATUS_INVALID_VIEW_SIZE) */ - ERROR_BAD_EXE_FORMAT, /* c0000020 (STATUS_INVALID_FILE_FOR_SECTION) */ - ERROR_ACCESS_DENIED, /* c0000021 (STATUS_ALREADY_COMMITTED) */ - ERROR_ACCESS_DENIED, /* c0000022 (STATUS_ACCESS_DENIED) */ - ERROR_INSUFFICIENT_BUFFER, /* c0000023 (STATUS_BUFFER_TOO_SMALL) */ - ERROR_INVALID_HANDLE, /* c0000024 (STATUS_OBJECT_TYPE_MISMATCH) */ - 0, /* c0000025 (STATUS_NONCONTINUABLE_EXCEPTION) */ - 0, /* c0000026 (STATUS_INVALID_DISPOSITION) */ - ERROR_MR_MID_NOT_FOUND, /* c0000027 (STATUS_UNWIND) */ - ERROR_MR_MID_NOT_FOUND, /* c0000028 (STATUS_BAD_STACK) */ - ERROR_MR_MID_NOT_FOUND, /* c0000029 (STATUS_INVALID_UNWIND_TARGET) */ - ERROR_NOT_LOCKED, /* c000002a (STATUS_NOT_LOCKED) */ - 0, /* c000002b (STATUS_PARITY_ERROR) */ - ERROR_INVALID_ADDRESS, /* c000002c (STATUS_UNABLE_TO_DECOMMIT_VM) */ - ERROR_INVALID_ADDRESS, /* c000002d (STATUS_NOT_COMMITTED) */ - ERROR_MR_MID_NOT_FOUND, /* c000002e (STATUS_INVALID_PORT_ATTRIBUTES) */ - ERROR_MR_MID_NOT_FOUND, /* c000002f (STATUS_PORT_MESSAGE_TOO_LONG) */ - ERROR_INVALID_PARAMETER, /* c0000030 (STATUS_INVALID_PARAMETER_MIX) */ - ERROR_MR_MID_NOT_FOUND, /* c0000031 (STATUS_INVALID_QUOTA_LOWER) */ - ERROR_DISK_CORRUPT, /* c0000032 (STATUS_DISK_CORRUPT_ERROR) */ - ERROR_INVALID_NAME, /* c0000033 (STATUS_OBJECT_NAME_INVALID) */ - ERROR_FILE_NOT_FOUND, /* c0000034 (STATUS_OBJECT_NAME_NOT_FOUND) */ - ERROR_ALREADY_EXISTS, /* c0000035 (STATUS_OBJECT_NAME_COLLISION) */ - ERROR_MR_MID_NOT_FOUND, /* c0000036 */ - ERROR_INVALID_HANDLE, /* c0000037 (STATUS_PORT_DISCONNECTED) */ - ERROR_MR_MID_NOT_FOUND, /* c0000038 (STATUS_DEVICE_ALREADY_ATTACHED) */ - ERROR_BAD_PATHNAME, /* c0000039 (STATUS_OBJECT_PATH_INVALID) */ - ERROR_PATH_NOT_FOUND, /* c000003a (STATUS_OBJECT_PATH_NOT_FOUND) */ - ERROR_BAD_PATHNAME, /* c000003b (STATUS_PATH_SYNTAX_BAD) */ - ERROR_IO_DEVICE, /* c000003c (STATUS_DATA_OVERRUN) */ - ERROR_IO_DEVICE, /* c000003d (STATUS_DATA_LATE_ERROR) */ - ERROR_CRC, /* c000003e (STATUS_DATA_ERROR) */ - ERROR_CRC, /* c000003f (STATUS_CRC_ERROR) */ - ERROR_NOT_ENOUGH_MEMORY, /* c0000040 (STATUS_SECTION_TOO_BIG) */ - ERROR_ACCESS_DENIED, /* c0000041 (STATUS_PORT_CONNECTION_REFUSED) */ - ERROR_INVALID_HANDLE, /* c0000042 (STATUS_INVALID_PORT_HANDLE) */ - ERROR_SHARING_VIOLATION, /* c0000043 (STATUS_SHARING_VIOLATION) */ - ERROR_NOT_ENOUGH_QUOTA, /* c0000044 (STATUS_QUOTA_EXCEEDED) */ - ERROR_INVALID_PARAMETER, /* c0000045 (STATUS_INVALID_PAGE_PROTECTION) */ - ERROR_NOT_OWNER, /* c0000046 (STATUS_MUTANT_NOT_OWNED) */ - ERROR_TOO_MANY_POSTS, /* c0000047 (STATUS_SEMAPHORE_LIMIT_EXCEEDED) */ - ERROR_INVALID_PARAMETER, /* c0000048 (STATUS_PORT_ALREADY_SET) */ - ERROR_INVALID_PARAMETER, /* c0000049 (STATUS_SECTION_NOT_IMAGE) */ - ERROR_SIGNAL_REFUSED, /* c000004a (STATUS_SUSPEND_COUNT_EXCEEDED) */ - ERROR_ACCESS_DENIED, /* c000004b (STATUS_THREAD_IS_TERMINATING) */ - ERROR_INVALID_PARAMETER, /* c000004c (STATUS_BAD_WORKING_SET_LIMIT) */ - ERROR_INVALID_PARAMETER, /* c000004d (STATUS_INCOMPATIBLE_FILE_MAP) */ - ERROR_INVALID_PARAMETER, /* c000004e (STATUS_SECTION_PROTECTION) */ - ERROR_MR_MID_NOT_FOUND, /* c000004f (STATUS_EAS_NOT_SUPPORTED) */ - ERROR_EA_LIST_INCONSISTENT, /* c0000050 (STATUS_EA_TOO_LARGE) */ - ERROR_FILE_CORRUPT, /* c0000051 (STATUS_NONEXISTENT_EA_ENTRY) */ - ERROR_FILE_CORRUPT, /* c0000052 (STATUS_NO_EAS_ON_FILE) */ - ERROR_FILE_CORRUPT, /* c0000053 (STATUS_EA_CORRUPT_ERROR) */ - ERROR_LOCK_VIOLATION, /* c0000054 (STATUS_LOCK_NOT_GRANTED) */ - ERROR_LOCK_VIOLATION, /* c0000055 (STATUS_FILE_LOCK_CONFLICT) */ - ERROR_ACCESS_DENIED, /* c0000056 (STATUS_DELETE_PENDING) */ - ERROR_NOT_SUPPORTED, /* c0000057 (STATUS_CTL_FILE_NOT_SUPPORTED) */ - ERROR_UNKNOWN_REVISION, /* c0000058 (STATUS_UNKNOWN_REVISION) */ - ERROR_REVISION_MISMATCH, /* c0000059 (STATUS_REVISION_MISMATCH) */ - ERROR_INVALID_OWNER, /* c000005a (STATUS_INVALID_OWNER) */ - ERROR_INVALID_PRIMARY_GROUP, /* c000005b (STATUS_INVALID_PRIMARY_GROUP) */ - ERROR_NO_IMPERSONATION_TOKEN, /* c000005c (STATUS_NO_IMPERSONATION_TOKEN) */ - ERROR_CANT_DISABLE_MANDATORY, /* c000005d (STATUS_CANT_DISABLE_MANDATORY) */ - ERROR_NO_LOGON_SERVERS, /* c000005e (STATUS_NO_LOGON_SERVERS) */ - ERROR_NO_SUCH_LOGON_SESSION, /* c000005f (STATUS_NO_SUCH_LOGON_SESSION) */ - ERROR_NO_SUCH_PRIVILEGE, /* c0000060 (STATUS_NO_SUCH_PRIVILEGE) */ - ERROR_PRIVILEGE_NOT_HELD, /* c0000061 (STATUS_PRIVILEGE_NOT_HELD) */ - ERROR_INVALID_ACCOUNT_NAME, /* c0000062 (STATUS_INVALID_ACCOUNT_NAME) */ - ERROR_USER_EXISTS, /* c0000063 (STATUS_USER_EXISTS) */ - ERROR_NO_SUCH_USER, /* c0000064 (STATUS_NO_SUCH_USER) */ - ERROR_GROUP_EXISTS, /* c0000065 (STATUS_GROUP_EXISTS) */ - ERROR_NO_SUCH_GROUP, /* c0000066 (STATUS_NO_SUCH_GROUP) */ - ERROR_MEMBER_IN_GROUP, /* c0000067 (STATUS_MEMBER_IN_GROUP) */ - ERROR_MEMBER_NOT_IN_GROUP, /* c0000068 (STATUS_MEMBER_NOT_IN_GROUP) */ - ERROR_LAST_ADMIN, /* c0000069 (STATUS_LAST_ADMIN) */ - ERROR_INVALID_PASSWORD, /* c000006a (STATUS_WRONG_PASSWORD) */ - ERROR_ILL_FORMED_PASSWORD, /* c000006b (STATUS_ILL_FORMED_PASSWORD) */ - ERROR_PASSWORD_RESTRICTION, /* c000006c (STATUS_PASSWORD_RESTRICTION) */ - ERROR_LOGON_FAILURE, /* c000006d (STATUS_LOGON_FAILURE) */ - ERROR_ACCOUNT_RESTRICTION, /* c000006e (STATUS_ACCOUNT_RESTRICTION) */ - ERROR_INVALID_LOGON_HOURS, /* c000006f (STATUS_INVALID_LOGON_HOURS) */ - ERROR_INVALID_WORKSTATION, /* c0000070 (STATUS_INVALID_WORKSTATION) */ - ERROR_PASSWORD_EXPIRED, /* c0000071 (STATUS_PASSWORD_EXPIRED) */ - ERROR_ACCOUNT_DISABLED, /* c0000072 (STATUS_ACCOUNT_DISABLED) */ - ERROR_NONE_MAPPED, /* c0000073 (STATUS_NONE_MAPPED) */ - ERROR_TOO_MANY_LUIDS_REQUESTED, /* c0000074 (STATUS_TOO_MANY_LUIDS_REQUESTED) */ - ERROR_LUIDS_EXHAUSTED, /* c0000075 (STATUS_LUIDS_EXHAUSTED) */ - ERROR_INVALID_SUB_AUTHORITY, /* c0000076 (STATUS_INVALID_SUB_AUTHORITY) */ - ERROR_INVALID_ACL, /* c0000077 (STATUS_INVALID_ACL) */ - ERROR_INVALID_SID, /* c0000078 (STATUS_INVALID_SID) */ - ERROR_INVALID_SECURITY_DESCR, /* c0000079 (STATUS_INVALID_SECURITY_DESCR) */ - ERROR_PROC_NOT_FOUND, /* c000007a (STATUS_PROCEDURE_NOT_FOUND) */ - ERROR_BAD_EXE_FORMAT, /* c000007b (STATUS_INVALID_IMAGE_FORMAT) */ - ERROR_NO_TOKEN, /* c000007c (STATUS_NO_TOKEN) */ - ERROR_BAD_INHERITANCE_ACL, /* c000007d (STATUS_BAD_INHERITANCE_ACL) */ - ERROR_NOT_LOCKED, /* c000007e (STATUS_RANGE_NOT_LOCKED) */ - ERROR_DISK_FULL, /* c000007f (STATUS_DISK_FULL) */ - ERROR_SERVER_DISABLED, /* c0000080 (STATUS_SERVER_DISABLED) */ - ERROR_SERVER_NOT_DISABLED, /* c0000081 (STATUS_SERVER_NOT_DISABLED) */ - ERROR_TOO_MANY_NAMES, /* c0000082 (STATUS_TOO_MANY_GUIDS_REQUESTED) */ - ERROR_NO_MORE_ITEMS, /* c0000083 (STATUS_GUIDS_EXHAUSTED) */ - ERROR_INVALID_ID_AUTHORITY, /* c0000084 (STATUS_INVALID_ID_AUTHORITY) */ - ERROR_NO_MORE_ITEMS, /* c0000085 (STATUS_AGENTS_EXHAUSTED) */ - ERROR_LABEL_TOO_LONG, /* c0000086 (STATUS_INVALID_VOLUME_LABEL) */ - ERROR_OUTOFMEMORY, /* c0000087 (STATUS_SECTION_NOT_EXTENDED) */ - ERROR_INVALID_ADDRESS, /* c0000088 (STATUS_NOT_MAPPED_DATA) */ - ERROR_RESOURCE_DATA_NOT_FOUND, /* c0000089 (STATUS_RESOURCE_DATA_NOT_FOUND) */ - ERROR_RESOURCE_TYPE_NOT_FOUND, /* c000008a (STATUS_RESOURCE_TYPE_NOT_FOUND) */ - ERROR_RESOURCE_NAME_NOT_FOUND, /* c000008b (STATUS_RESOURCE_NAME_NOT_FOUND) */ - 0, /* c000008c (STATUS_ARRAY_BOUNDS_EXCEEDED) */ - 0, /* c000008d (STATUS_FLOAT_DENORMAL_OPERAND) */ - 0, /* c000008e (STATUS_FLOAT_DIVIDE_BY_ZERO) */ - 0, /* c000008f (STATUS_FLOAT_INEXACT_RESULT) */ - 0, /* c0000090 (STATUS_FLOAT_INVALID_OPERATION) */ - 0, /* c0000091 (STATUS_FLOAT_OVERFLOW) */ - 0, /* c0000092 (STATUS_FLOAT_STACK_CHECK) */ - 0, /* c0000093 (STATUS_FLOAT_UNDERFLOW) */ - 0, /* c0000094 (STATUS_INTEGER_DIVIDE_BY_ZERO) */ - ERROR_ARITHMETIC_OVERFLOW, /* c0000095 (STATUS_INTEGER_OVERFLOW) */ - 0, /* c0000096 (STATUS_PRIVILEGED_INSTRUCTION) */ - ERROR_NOT_ENOUGH_MEMORY, /* c0000097 (STATUS_TOO_MANY_PAGING_FILES) */ - ERROR_FILE_INVALID, /* c0000098 (STATUS_FILE_INVALID) */ - ERROR_ALLOTTED_SPACE_EXCEEDED, /* c0000099 (STATUS_ALLOTTED_SPACE_EXCEEDED) */ - ERROR_NO_SYSTEM_RESOURCES, /* c000009a (STATUS_INSUFFICIENT_RESOURCES) */ - ERROR_PATH_NOT_FOUND, /* c000009b (STATUS_DFS_EXIT_PATH_FOUND) */ - ERROR_CRC, /* c000009c (STATUS_DEVICE_DATA_ERROR) */ - ERROR_NOT_READY, /* c000009d (STATUS_DEVICE_NOT_CONNECTED) */ - ERROR_NOT_READY, /* c000009e (STATUS_DEVICE_POWER_FAILURE) */ - ERROR_INVALID_ADDRESS, /* c000009f (STATUS_FREE_VM_NOT_AT_BASE) */ - ERROR_INVALID_ADDRESS, /* c00000a0 (STATUS_MEMORY_NOT_ALLOCATED) */ - ERROR_WORKING_SET_QUOTA, /* c00000a1 (STATUS_WORKING_SET_QUOTA) */ - ERROR_WRITE_PROTECT, /* c00000a2 (STATUS_MEDIA_WRITE_PROTECTED) */ - ERROR_NOT_READY, /* c00000a3 (STATUS_DEVICE_NOT_READY) */ - ERROR_INVALID_GROUP_ATTRIBUTES, /* c00000a4 (STATUS_INVALID_GROUP_ATTRIBUTES) */ - ERROR_BAD_IMPERSONATION_LEVEL, /* c00000a5 (STATUS_BAD_IMPERSONATION_LEVEL) */ - ERROR_CANT_OPEN_ANONYMOUS, /* c00000a6 (STATUS_CANT_OPEN_ANONYMOUS) */ - ERROR_BAD_VALIDATION_CLASS, /* c00000a7 (STATUS_BAD_VALIDATION_CLASS) */ - ERROR_BAD_TOKEN_TYPE, /* c00000a8 (STATUS_BAD_TOKEN_TYPE)*/ - ERROR_MR_MID_NOT_FOUND, /* c00000a9 (STATUS_BAD_MASTER_BOOT_RECORD) */ - ERROR_MR_MID_NOT_FOUND, /* c00000aa (STATUS_INSTRUCTION_MISALIGNMENT) */ - ERROR_PIPE_BUSY, /* c00000ab (STATUS_INSTANCE_NOT_AVAILABLE) */ - ERROR_PIPE_BUSY, /* c00000ac (STATUS_PIPE_NOT_AVAILABLE) */ - ERROR_BAD_PIPE, /* c00000ad (STATUS_INVALID_PIPE_STATE) */ - ERROR_PIPE_BUSY, /* c00000ae (STATUS_PIPE_BUSY) */ - ERROR_INVALID_FUNCTION, /* c00000af (STATUS_ILLEGAL_FUNCTION) */ - ERROR_PIPE_NOT_CONNECTED, /* c00000b0 (STATUS_PIPE_DISCONNECTED) */ - ERROR_NO_DATA, /* c00000b1 (STATUS_PIPE_CLOSING) */ - ERROR_PIPE_CONNECTED, /* c00000b2 (STATUS_PIPE_CONNECTED) */ - ERROR_PIPE_LISTENING, /* c00000b3 (STATUS_PIPE_LISTENING) */ - ERROR_BAD_PIPE, /* c00000b4 (STATUS_INVALID_READ_MODE) */ - ERROR_SEM_TIMEOUT, /* c00000b5 (STATUS_IO_TIMEOUT) */ - ERROR_HANDLE_EOF, /* c00000b6 (STATUS_FILE_FORCED_CLOSED) */ - ERROR_MR_MID_NOT_FOUND, /* c00000b7 (STATUS_PROFILING_NOT_STARTED) */ - ERROR_MR_MID_NOT_FOUND, /* c00000b8 (STATUS_PROFILING_NOT_STOPPED) */ - ERROR_MR_MID_NOT_FOUND, /* c00000b9 (STATUS_COULD_NOT_INTERPRET) */ - ERROR_ACCESS_DENIED, /* c00000ba (STATUS_FILE_IS_A_DIRECTORY) */ - ERROR_NOT_SUPPORTED, /* c00000bb (STATUS_NOT_SUPPORTED) */ - ERROR_REM_NOT_LIST, /* c00000bc (STATUS_REMOTE_NOT_LISTENING) */ - ERROR_DUP_NAME, /* c00000bd (STATUS_DUPLICATE_NAME) */ - ERROR_BAD_NETPATH, /* c00000be (STATUS_BAD_NETWORK_PATH) */ - ERROR_NETWORK_BUSY, /* c00000bf (STATUS_NETWORK_BUSY) */ - ERROR_DEV_NOT_EXIST, /* c00000c0 (STATUS_DEVICE_DOES_NOT_EXIST) */ - ERROR_TOO_MANY_CMDS, /* c00000c1 (STATUS_TOO_MANY_COMMANDS) */ - ERROR_ADAP_HDW_ERR, /* c00000c2 (STATUS_ADAPTER_HARDWARE_ERROR) */ - ERROR_BAD_NET_RESP, /* c00000c3 (STATUS_INVALID_NETWORK_RESPONSE) */ - ERROR_UNEXP_NET_ERR, /* c00000c4 (STATUS_UNEXPECTED_NETWORK_ERROR) */ - ERROR_BAD_REM_ADAP, /* c00000c5 (STATUS_BAD_REMOTE_ADAPTER) */ - ERROR_PRINTQ_FULL, /* c00000c6 (STATUS_PRINT_QUEUE_FULL) */ - ERROR_NO_SPOOL_SPACE, /* c00000c7 (STATUS_NO_SPOOL_SPACE) */ - ERROR_PRINT_CANCELLED, /* c00000c8 (STATUS_PRINT_CANCELLED) */ - ERROR_NETNAME_DELETED, /* c00000c9 (STATUS_NETWORK_NAME_DELETED) */ - ERROR_NETWORK_ACCESS_DENIED, /* c00000ca (STATUS_NETWORK_ACCESS_DENIED) */ - ERROR_BAD_DEV_TYPE, /* c00000cb (STATUS_BAD_DEVICE_TYPE) */ - ERROR_BAD_NET_NAME, /* c00000cc (STATUS_BAD_NETWORK_NAME) */ - ERROR_TOO_MANY_NAMES, /* c00000cd (STATUS_TOO_MANY_NAMES) */ - ERROR_TOO_MANY_SESS, /* c00000ce (STATUS_TOO_MANY_SESSIONS) */ - ERROR_SHARING_PAUSED, /* c00000cf (STATUS_SHARING_PAUSED) */ - ERROR_REQ_NOT_ACCEP, /* c00000d0 (STATUS_REQUEST_NOT_ACCEPTED) */ - ERROR_REDIR_PAUSED, /* c00000d1 (STATUS_REDIRECTOR_PAUSED) */ - ERROR_NET_WRITE_FAULT, /* c00000d2 (STATUS_NET_WRITE_FAULT) */ - ERROR_MR_MID_NOT_FOUND, /* c00000d3 (STATUS_PROFILING_AT_LIMIT) */ - ERROR_NOT_SAME_DEVICE, /* c00000d4 (STATUS_NOT_SAME_DEVICE) */ - ERROR_MR_MID_NOT_FOUND, /* c00000d5 (STATUS_FILE_RENAMED) */ - ERROR_VC_DISCONNECTED, /* c00000d6 (STATUS_VIRTUAL_CIRCUIT_CLOSED) */ - ERROR_NO_SECURITY_ON_OBJECT, /* c00000d7 (STATUS_NO_SECURITY_ON_OBJECT) */ - ERROR_MR_MID_NOT_FOUND, /* c00000d8 (STATUS_CANT_WAIT) */ - ERROR_NO_DATA, /* c00000d9 (STATUS_PIPE_EMPTY) */ - ERROR_CANT_ACCESS_DOMAIN_INFO, /* c00000da (STATUS_CANT_ACCESS_DOMAIN_INFO) */ - ERROR_MR_MID_NOT_FOUND, /* c00000db (STATUS_CANT_TERMINATE_SELF) */ - ERROR_INVALID_SERVER_STATE, /* c00000dc (STATUS_INVALID_SERVER_STATE) */ - ERROR_INVALID_DOMAIN_STATE, /* c00000dd (STATUS_INVALID_DOMAIN_STATE) */ - ERROR_INVALID_DOMAIN_ROLE, /* c00000de (STATUS_INVALID_DOMAIN_ROLE) */ - ERROR_NO_SUCH_DOMAIN, /* c00000df (STATUS_NO_SUCH_DOMAIN) */ - ERROR_DOMAIN_EXISTS, /* c00000e0 (STATUS_DOMAIN_EXISTS) */ - ERROR_DOMAIN_LIMIT_EXCEEDED, /* c00000e1 (STATUS_DOMAIN_LIMIT_EXCEEDED) */ - ERROR_MR_MID_NOT_FOUND, /* c00000e2 (STATUS_OPLOCK_NOT_GRANTED) */ - ERROR_MR_MID_NOT_FOUND, /* c00000e3 (STATUS_INVALID_OPLOCK_PROTOCOL) */ - ERROR_INTERNAL_DB_CORRUPTION, /* c00000e4 (STATUS_INTERNAL_DB_CORRUPTION) */ - ERROR_INTERNAL_ERROR, /* c00000e5 (STATUS_INTERNAL_ERROR) */ - ERROR_GENERIC_NOT_MAPPED, /* c00000e6 (STATUS_GENERIC_NOT_MAPPED) */ - ERROR_BAD_DESCRIPTOR_FORMAT, /* c00000e7 (STATUS_BAD_DESCRIPTOR_FORMAT) */ - ERROR_INVALID_USER_BUFFER, /* c00000e8 (STATUS_INVALID_USER_BUFFER) */ - ERROR_MR_MID_NOT_FOUND, /* c00000e9 (STATUS_UNEXPECTED_IO_ERROR) */ - ERROR_MR_MID_NOT_FOUND, /* c00000ea (STATUS_UNEXPECTED_MM_CREATE_ERR) */ - ERROR_MR_MID_NOT_FOUND, /* c00000eb (STATUS_UNEXPECTED_MM_MAP_ERROR) */ - ERROR_MR_MID_NOT_FOUND, /* c00000ec (STATUS_UNEXPECTED_MM_EXTEND_ERR) */ - ERROR_NOT_LOGON_PROCESS, /* c00000ed (STATUS_NOT_LOGON_PROCESS) */ - ERROR_LOGON_SESSION_EXISTS, /* c00000ee (STATUS_LOGON_SESSION_EXISTS) */ - ERROR_INVALID_PARAMETER, /* c00000ef (STATUS_INVALID_PARAMETER_1) */ - ERROR_INVALID_PARAMETER, /* c00000f0 (STATUS_INVALID_PARAMETER_2) */ - ERROR_INVALID_PARAMETER, /* c00000f1 (STATUS_INVALID_PARAMETER_3) */ - ERROR_INVALID_PARAMETER, /* c00000f2 (STATUS_INVALID_PARAMETER_4) */ - ERROR_INVALID_PARAMETER, /* c00000f3 (STATUS_INVALID_PARAMETER_5) */ - ERROR_INVALID_PARAMETER, /* c00000f4 (STATUS_INVALID_PARAMETER_6) */ - ERROR_INVALID_PARAMETER, /* c00000f5 (STATUS_INVALID_PARAMETER_7) */ - ERROR_INVALID_PARAMETER, /* c00000f6 (STATUS_INVALID_PARAMETER_8) */ - ERROR_INVALID_PARAMETER, /* c00000f7 (STATUS_INVALID_PARAMETER_9) */ - ERROR_INVALID_PARAMETER, /* c00000f8 (STATUS_INVALID_PARAMETER_10) */ - ERROR_INVALID_PARAMETER, /* c00000f9 (STATUS_INVALID_PARAMETER_11) */ - ERROR_INVALID_PARAMETER, /* c00000fa (STATUS_INVALID_PARAMETER_12) */ - ERROR_PATH_NOT_FOUND, /* c00000fb (STATUS_REDIRECTOR_NOT_STARTED) */ - ERROR_MR_MID_NOT_FOUND, /* c00000fc (STATUS_REDIRECTOR_STARTED) */ - ERROR_STACK_OVERFLOW, /* c00000fd (STATUS_STACK_OVERFLOW) */ - ERROR_NO_SUCH_PACKAGE, /* c00000fe (STATUS_NO_SUCH_PACKAGE) */ - ERROR_MR_MID_NOT_FOUND, /* c00000ff (STATUS_BAD_FUNCTION_TABLE) */ - ERROR_ENVVAR_NOT_FOUND, /* c0000100 (STATUS_VARIABLE_NOT_FOUND) */ - ERROR_DIR_NOT_EMPTY, /* c0000101 (STATUS_DIRECTORY_NOT_EMPTY) */ - ERROR_FILE_CORRUPT, /* c0000102 (STATUS_FILE_CORRUPT_ERROR) */ - ERROR_DIRECTORY, /* c0000103 (STATUS_NOT_A_DIRECTORY) */ - ERROR_BAD_LOGON_SESSION_STATE, /* c0000104 (STATUS_BAD_LOGON_SESSION_STATE) */ - ERROR_LOGON_SESSION_COLLISION, /* c0000105 (STATUS_LOGON_SESSION_COLLISION) */ - ERROR_FILENAME_EXCED_RANGE, /* c0000106 (STATUS_NAME_TOO_LONG) */ - ERROR_MR_MID_NOT_FOUND, /* c0000107 (STATUS_FILES_OPEN) */ - ERROR_DEVICE_IN_USE, /* c0000108 (STATUS_CONNECTION_IN_USE) */ - ERROR_MR_MID_NOT_FOUND, /* c0000109 (STATUS_MESSAGE_NOT_FOUND) */ - ERROR_ACCESS_DENIED, /* c000010a (STATUS_PROCESS_IS_TERMINATING) */ - ERROR_INVALID_LOGON_TYPE, /* c000010b (STATUS_INVALID_LOGON_TYPE) */ - ERROR_MR_MID_NOT_FOUND, /* c000010c (STATUS_NO_GUID_TRANSLATION) */ - ERROR_CANNOT_IMPERSONATE, /* c000010d (STATUS_CANNOT_IMPERSONATE) */ - ERROR_SERVICE_ALREADY_RUNNING, /* c000010e (STATUS_IMAGE_ALREADY_LOADED) */ - ERROR_MR_MID_NOT_FOUND, /* c000010f (STATUS_ABIOS_NOT_PRESENT) */ - ERROR_MR_MID_NOT_FOUND, /* c0000110 (STATUS_ABIOS_LID_NOT_EXIST) */ - ERROR_MR_MID_NOT_FOUND, /* c0000111 (STATUS_ABIOS_LID_ALREADY_OWNED) */ - ERROR_MR_MID_NOT_FOUND, /* c0000112 (STATUS_ABIOS_NOT_LID_OWNER) */ - ERROR_MR_MID_NOT_FOUND, /* c0000113 (STATUS_ABIOS_INVALID_COMMAND) */ - ERROR_MR_MID_NOT_FOUND, /* c0000114 (STATUS_ABIOS_INVALID_LID) */ - ERROR_MR_MID_NOT_FOUND, /* c0000115 (STATUS_ABIOS_SELECTOR_NOT_AVAILABLE) */ - ERROR_MR_MID_NOT_FOUND, /* c0000116 (STATUS_ABIOS_INVALID_SELECTOR) */ - ERROR_MR_MID_NOT_FOUND, /* c0000117 (STATUS_NO_LDT) */ - ERROR_MR_MID_NOT_FOUND, /* c0000118 (STATUS_INVALID_LDT_SIZE) */ - ERROR_MR_MID_NOT_FOUND, /* c0000119 (STATUS_INVALID_LDT_OFFSET) */ - ERROR_MR_MID_NOT_FOUND, /* c000011a (STATUS_INVALID_LDT_DESCRIPTOR) */ - ERROR_BAD_EXE_FORMAT, /* c000011b (STATUS_INVALID_IMAGE_NE_FORMAT) */ - ERROR_RXACT_INVALID_STATE, /* c000011c (STATUS_RXACT_INVALID_STATE) */ - ERROR_RXACT_COMMIT_FAILURE, /* c000011d (STATUS_RXACT_COMMIT_FAILURE) */ - ERROR_FILE_INVALID, /* c000011e (STATUS_MAPPED_FILE_SIZE_ZERO) */ - ERROR_TOO_MANY_OPEN_FILES, /* c000011f (STATUS_TOO_MANY_OPENED_FILES) */ - ERROR_OPERATION_ABORTED, /* c0000120 (STATUS_CANCELLED) */ - ERROR_ACCESS_DENIED, /* c0000121 (STATUS_CANNOT_DELETE) */ - ERROR_INVALID_COMPUTERNAME, /* c0000122 (STATUS_INVALID_COMPUTER_NAME) */ - ERROR_ACCESS_DENIED, /* c0000123 (STATUS_FILE_DELETED) */ - ERROR_SPECIAL_ACCOUNT, /* c0000124 (STATUS_SPECIAL_ACCOUNT) */ - ERROR_SPECIAL_GROUP, /* c0000125 (STATUS_SPECIAL_GROUP) */ - ERROR_SPECIAL_USER, /* c0000126 (STATUS_SPECIAL_USER) */ - ERROR_MEMBERS_PRIMARY_GROUP, /* c0000127 (STATUS_MEMBERS_PRIMARY_GROUP) */ - ERROR_INVALID_HANDLE, /* c0000128 (STATUS_FILE_CLOSED) */ - ERROR_MR_MID_NOT_FOUND, /* c0000129 (STATUS_TOO_MANY_THREADS) */ - ERROR_MR_MID_NOT_FOUND, /* c000012a (STATUS_THREAD_NOT_IN_PROCESS) */ - ERROR_TOKEN_ALREADY_IN_USE, /* c000012b (STATUS_TOKEN_ALREADY_IN_USE) */ - ERROR_MR_MID_NOT_FOUND, /* c000012c (STATUS_PAGEFILE_QUOTA_EXCEEDED) */ - ERROR_COMMITMENT_LIMIT, /* c000012d (STATUS_COMMITMENT_LIMIT) */ - ERROR_BAD_EXE_FORMAT, /* c000012e (STATUS_INVALID_IMAGE_LE_FORMAT) */ - ERROR_BAD_EXE_FORMAT, /* c000012f (STATUS_INVALID_IMAGE_NOT_MZ) */ - ERROR_BAD_EXE_FORMAT, /* c0000130 (STATUS_INVALID_IMAGE_PROTECT) */ - ERROR_BAD_EXE_FORMAT, /* c0000131 (STATUS_INVALID_IMAGE_WIN_16) */ - ERROR_MR_MID_NOT_FOUND, /* c0000132 (STATUS_LOGON_SERVER_CONFLICT) */ - ERROR_MR_MID_NOT_FOUND, /* c0000133 (STATUS_TIME_DIFFERENCE_AT_DC) */ - ERROR_MR_MID_NOT_FOUND, /* c0000134 (STATUS_SYNCHRONIZATION_REQUIRED) */ - ERROR_MOD_NOT_FOUND, /* c0000135 (STATUS_DLL_NOT_FOUND) */ - ERROR_MR_MID_NOT_FOUND, /* c0000136 (STATUS_OPEN_FAILED) */ - ERROR_MR_MID_NOT_FOUND, /* c0000137 (STATUS_IO_PRIVILEGE_FAILED) */ - ERROR_INVALID_ORDINAL, /* c0000138 (STATUS_ORDINAL_NOT_FOUND) */ - ERROR_PROC_NOT_FOUND, /* c0000139 (STATUS_ENTRYPOINT_NOT_FOUND) */ - ERROR_MR_MID_NOT_FOUND, /* c000013a (STATUS_CONTROL_C_EXIT) */ - ERROR_NETNAME_DELETED, /* c000013b (STATUS_LOCAL_DISCONNECT) */ - ERROR_NETNAME_DELETED, /* c000013c (STATUS_REMOTE_DISCONNECT) */ - ERROR_REM_NOT_LIST, /* c000013d (STATUS_REMOTE_RESOURCES) */ - ERROR_UNEXP_NET_ERR, /* c000013e (STATUS_LINK_FAILED) */ - ERROR_UNEXP_NET_ERR, /* c000013f (STATUS_LINK_TIMEOUT) */ - ERROR_UNEXP_NET_ERR, /* c0000140 (STATUS_INVALID_CONNECTION) */ - ERROR_UNEXP_NET_ERR, /* c0000141 (STATUS_INVALID_ADDRESS) */ - ERROR_DLL_INIT_FAILED, /* c0000142 (STATUS_DLL_INIT_FAILED) */ - ERROR_MR_MID_NOT_FOUND, /* c0000143 (STATUS_MISSING_SYSTEMFILE) */ - ERROR_MR_MID_NOT_FOUND, /* c0000144 (STATUS_UNHANDLED_EXCEPTION) */ - ERROR_MR_MID_NOT_FOUND, /* c0000145 (STATUS_APP_INIT_FAILURE) */ - ERROR_MR_MID_NOT_FOUND, /* c0000146 (STATUS_PAGEFILE_CREATE_FAILED) */ - ERROR_MR_MID_NOT_FOUND, /* c0000147 (STATUS_NO_PAGEFILE) */ - ERROR_INVALID_LEVEL, /* c0000148 (STATUS_INVALID_LEVEL) */ - ERROR_INVALID_PASSWORD, /* c0000149 (STATUS_WRONG_PASSWORD_CORE) */ - ERROR_MR_MID_NOT_FOUND, /* c000014a (STATUS_ILLEGAL_FLOAT_CONTEXT) */ - ERROR_BROKEN_PIPE, /* c000014b (STATUS_PIPE_BROKEN) */ - ERROR_BADDB, /* c000014c (STATUS_REGISTRY_CORRUPT) */ - ERROR_REGISTRY_IO_FAILED, /* c000014d (STATUS_REGISTRY_IO_FAILED) */ - ERROR_MR_MID_NOT_FOUND, /* c000014e (STATUS_NO_EVENT_PAIR) */ - ERROR_UNRECOGNIZED_VOLUME, /* c000014f (STATUS_UNRECOGNIZED_VOLUME) */ - ERROR_SERIAL_NO_DEVICE, /* c0000150 (STATUS_SERIAL_NO_DEVICE_INITED) */ - ERROR_NO_SUCH_ALIAS, /* c0000151 (STATUS_NO_SUCH_ALIAS) */ - ERROR_MEMBER_NOT_IN_ALIAS, /* c0000152 (STATUS_MEMBER_NOT_IN_ALIAS) */ - ERROR_MEMBER_IN_ALIAS, /* c0000153 (STATUS_MEMBER_IN_ALIAS) */ - ERROR_ALIAS_EXISTS, /* c0000154 (STATUS_ALIAS_EXISTS) */ - ERROR_LOGON_NOT_GRANTED, /* c0000155 (STATUS_LOGON_NOT_GRANTED) */ - ERROR_TOO_MANY_SECRETS, /* c0000156 (STATUS_TOO_MANY_SECRETS) */ - ERROR_SECRET_TOO_LONG, /* c0000157 (STATUS_SECRET_TOO_LONG) */ - ERROR_INTERNAL_DB_ERROR, /* c0000158 (STATUS_INTERNAL_DB_ERROR) */ - ERROR_FULLSCREEN_MODE, /* c0000159 (STATUS_FULLSCREEN_MODE) */ - ERROR_TOO_MANY_CONTEXT_IDS, /* c000015a (STATUS_TOO_MANY_CONTEXT_IDS) */ - ERROR_LOGON_TYPE_NOT_GRANTED, /* c000015b (STATUS_LOGON_TYPE_NOT_GRANTED) */ - ERROR_NOT_REGISTRY_FILE, /* c000015c (STATUS_NOT_REGISTRY_FILE) */ - ERROR_NT_CROSS_ENCRYPTION_REQUIRED, /* c000015d (STATUS_NT_CROSS_ENCRYPTION_REQUIRED) */ - ERROR_MR_MID_NOT_FOUND, /* c000015e (STATUS_DOMAIN_CTRLR_CONFIG_ERROR) */ - ERROR_IO_DEVICE, /* c000015f (STATUS_FT_MISSING_MEMBER) */ - ERROR_MR_MID_NOT_FOUND, /* c0000160 (STATUS_ILL_FORMED_SERVICE_ENTRY) */ - ERROR_MR_MID_NOT_FOUND, /* c0000161 (STATUS_ILLEGAL_CHARACTER) */ - ERROR_NO_UNICODE_TRANSLATION, /* c0000162 (STATUS_UNMAPPABLE_CHARACTER) */ - ERROR_MR_MID_NOT_FOUND, /* c0000163 (STATUS_UNDEFINED_CHARACTER) */ - ERROR_MR_MID_NOT_FOUND, /* c0000164 (STATUS_FLOPPY_VOLUME) */ - ERROR_FLOPPY_ID_MARK_NOT_FOUND, /* c0000165 (STATUS_FLOPPY_ID_MARK_NOT_FOUND) */ - ERROR_FLOPPY_WRONG_CYLINDER, /* c0000166 (STATUS_FLOPPY_WRONG_CYLINDER) */ - ERROR_FLOPPY_UNKNOWN_ERROR, /* c0000167 (STATUS_FLOPPY_UNKNOWN_ERROR) */ - ERROR_FLOPPY_BAD_REGISTERS, /* c0000168 (STATUS_FLOPPY_BAD_REGISTERS) */ - ERROR_DISK_RECALIBRATE_FAILED, /* c0000169 (STATUS_DISK_RECALIBRATE_FAILED) */ - ERROR_DISK_OPERATION_FAILED, /* c000016a (STATUS_DISK_OPERATION_FAILED) */ - ERROR_DISK_RESET_FAILED, /* c000016b (STATUS_DISK_RESET_FAILED) */ - ERROR_IRQ_BUSY, /* c000016c (STATUS_SHARED_IRQ_BUSY) */ - ERROR_IO_DEVICE, /* c000016d (STATUS_FT_ORPHANING) */ - ERROR_MR_MID_NOT_FOUND, /* c000016e (STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT) */ - ERROR_MR_MID_NOT_FOUND, /* c000016f */ - ERROR_MR_MID_NOT_FOUND, /* c0000170 */ - ERROR_MR_MID_NOT_FOUND, /* c0000171 */ - ERROR_PARTITION_FAILURE, /* c0000172 (STATUS_PARTITION_FAILURE) */ - ERROR_INVALID_BLOCK_LENGTH, /* c0000173 (STATUS_INVALID_BLOCK_LENGTH) */ - ERROR_DEVICE_NOT_PARTITIONED, /* c0000174 (STATUS_DEVICE_NOT_PARTITIONED) */ - ERROR_UNABLE_TO_LOCK_MEDIA, /* c0000175 (STATUS_UNABLE_TO_LOCK_MEDIA) */ - ERROR_UNABLE_TO_UNLOAD_MEDIA, /* c0000176 (STATUS_UNABLE_TO_UNLOAD_MEDIA) */ - ERROR_EOM_OVERFLOW, /* c0000177 (STATUS_EOM_OVERFLOW) */ - ERROR_NO_MEDIA_IN_DRIVE, /* c0000178 (STATUS_NO_MEDIA) */ - ERROR_MR_MID_NOT_FOUND, /* c0000179 */ - ERROR_NO_SUCH_MEMBER, /* c000017a (STATUS_NO_SUCH_MEMBER) */ - ERROR_INVALID_MEMBER, /* c000017b (STATUS_INVALID_MEMBER) */ - ERROR_KEY_DELETED, /* c000017c (STATUS_KEY_DELETED) */ - ERROR_NO_LOG_SPACE, /* c000017d (STATUS_NO_LOG_SPACE) */ - ERROR_TOO_MANY_SIDS, /* c000017e (STATUS_TOO_MANY_SIDS) */ - ERROR_LM_CROSS_ENCRYPTION_REQUIRED, /* c000017f (STATUS_LM_CROSS_ENCRYPTION_REQUIRED) */ - ERROR_KEY_HAS_CHILDREN, /* c0000180 (STATUS_KEY_HAS_CHILDREN) */ - ERROR_CHILD_MUST_BE_VOLATILE, /* c0000181 (STATUS_CHILD_MUST_BE_VOLATILE) */ - ERROR_INVALID_PARAMETER, /* c0000182 (STATUS_DEVICE_CONFIGURATION_ERROR) */ - ERROR_IO_DEVICE, /* c0000183 (STATUS_DRIVER_INTERNAL_ERROR) */ - ERROR_BAD_COMMAND, /* c0000184 (STATUS_INVALID_DEVICE_STATE) */ - ERROR_IO_DEVICE, /* c0000185 (STATUS_IO_DEVICE_ERROR) */ - ERROR_IO_DEVICE, /* c0000186 (STATUS_DEVICE_PROTOCOL_ERROR) */ - ERROR_MR_MID_NOT_FOUND, /* c0000187 (STATUS_BACKUP_CONTROLLER) */ - ERROR_LOG_FILE_FULL, /* c0000188 (STATUS_LOG_FILE_FULL) */ - ERROR_WRITE_PROTECT, /* c0000189 (STATUS_TOO_LATE) */ - ERROR_NO_TRUST_LSA_SECRET, /* c000018a (STATUS_NO_TRUST_LSA_SECRET) */ - ERROR_NO_TRUST_SAM_ACCOUNT, /* c000018b (STATUS_NO_TRUST_SAM_ACCOUNT) */ - ERROR_TRUSTED_DOMAIN_FAILURE, /* c000018c (STATUS_TRUSTED_DOMAIN_FAILURE) */ - ERROR_TRUSTED_RELATIONSHIP_FAILURE, /* c000018d (STATUS_TRUSTED_RELATIONSHIP_FAILURE) */ - ERROR_EVENTLOG_FILE_CORRUPT, /* c000018e (STATUS_EVENTLOG_FILE_CORRUPT) */ - ERROR_EVENTLOG_CANT_START, /* c000018f (STATUS_EVENTLOG_CANT_START) */ - ERROR_TRUST_FAILURE, /* c0000190 (STATUS_TRUST_FAILURE) */ - ERROR_MR_MID_NOT_FOUND, /* c0000191 (STATUS_MUTANT_LIMIT_EXCEEDED) */ - ERROR_NETLOGON_NOT_STARTED, /* c0000192 (STATUS_NETLOGON_NOT_STARTED) */ - ERROR_ACCOUNT_EXPIRED, /* c0000193 (STATUS_ACCOUNT_EXPIRED) */ - ERROR_POSSIBLE_DEADLOCK, /* c0000194 (STATUS_POSSIBLE_DEADLOCK) */ - ERROR_SESSION_CREDENTIAL_CONFLICT, /* c0000195 (STATUS_NETWORK_CREDENTIAL_CONFLICT) */ - ERROR_REMOTE_SESSION_LIMIT_EXCEEDED, /* c0000196 (STATUS_REMOTE_SESSION_LIMIT) */ - ERROR_EVENTLOG_FILE_CHANGED, /* c0000197 (STATUS_EVENTLOG_FILE_CHANGED) */ - ERROR_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT,/* c0000198 (STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT) */ - ERROR_NOLOGON_WORKSTATION_TRUST_ACCOUNT,/* c0000199 (STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT) */ - ERROR_NOLOGON_SERVER_TRUST_ACCOUNT, /* c000019a (STATUS_NOLOGON_SERVER_TRUST_ACCOUNT) */ - ERROR_DOMAIN_TRUST_INCONSISTENT /* c000019b (STATUS_DOMAIN_TRUST_INCONSISTENT) */ -}; - -static const WORD table_c0000202[109] = -{ - ERROR_NO_USER_SESSION_KEY, /* c0000202 (STATUS_NO_USER_SESSION_KEY) */ - ERROR_UNEXP_NET_ERR, /* c0000203 (STATUS_USER_SESSION_DELETED) */ - ERROR_RESOURCE_LANG_NOT_FOUND, /* c0000204 (STATUS_RESOURCE_LANG_NOT_FOUND) */ - ERROR_NOT_ENOUGH_SERVER_MEMORY, /* c0000205 (STATUS_INSUFF_SERVER_RESOURCES) */ - ERROR_INVALID_USER_BUFFER, /* c0000206 (STATUS_INVALID_BUFFER_SIZE) */ - ERROR_INVALID_NETNAME, /* c0000207 (STATUS_INVALID_ADDRESS_COMPONENT) */ - ERROR_INVALID_NETNAME, /* c0000208 (STATUS_INVALID_ADDRESS_WILDCARD) */ - ERROR_TOO_MANY_NAMES, /* c0000209 (STATUS_TOO_MANY_ADDRESSES) */ - ERROR_DUP_NAME, /* c000020a (STATUS_ADDRESS_ALREADY_EXISTS) */ - ERROR_NETNAME_DELETED, /* c000020b (STATUS_ADDRESS_CLOSED) */ - ERROR_NETNAME_DELETED, /* c000020c (STATUS_CONNECTION_DISCONNECTED) */ - ERROR_NETNAME_DELETED, /* c000020d (STATUS_CONNECTION_RESET) */ - ERROR_TOO_MANY_NAMES, /* c000020e (STATUS_TOO_MANY_NODES) */ - ERROR_UNEXP_NET_ERR, /* c000020f (STATUS_TRANSACTION_ABORTED) */ - ERROR_UNEXP_NET_ERR, /* c0000210 (STATUS_TRANSACTION_TIMED_OUT) */ - ERROR_UNEXP_NET_ERR, /* c0000211 (STATUS_TRANSACTION_NO_RELEASE) */ - ERROR_UNEXP_NET_ERR, /* c0000212 (STATUS_TRANSACTION_NO_MATCH) */ - ERROR_UNEXP_NET_ERR, /* c0000213 (STATUS_TRANSACTION_RESPONDED) */ - ERROR_UNEXP_NET_ERR, /* c0000214 (STATUS_TRANSACTION_INVALID_ID) */ - ERROR_UNEXP_NET_ERR, /* c0000215 (STATUS_TRANSACTION_INVALID_TYPE) */ - ERROR_NOT_SUPPORTED, /* c0000216 (STATUS_NOT_SERVER_SESSION) */ - ERROR_NOT_SUPPORTED, /* c0000217 (STATUS_NOT_CLIENT_SESSION) */ - ERROR_MR_MID_NOT_FOUND, /* c0000218 (STATUS_CANNOT_LOAD_REGISTRY_FILE) */ - ERROR_MR_MID_NOT_FOUND, /* c0000219 */ - ERROR_MR_MID_NOT_FOUND, /* c000021a */ - ERROR_MR_MID_NOT_FOUND, /* c000021b */ - ERROR_NO_BROWSER_SERVERS_FOUND, /* c000021c (STATUS_NO_BROWSER_SERVERS_FOUND) */ - ERROR_MR_MID_NOT_FOUND, /* c000021d */ - ERROR_MR_MID_NOT_FOUND, /* c000021e */ - ERROR_MR_MID_NOT_FOUND, /* c000021f */ - ERROR_MAPPED_ALIGNMENT, /* c0000220 (STATUS_MAPPED_ALIGNMENT) */ - ERROR_BAD_EXE_FORMAT, /* c0000221 (STATUS_IMAGE_CHECKSUM_MISMATCH) */ - ERROR_MR_MID_NOT_FOUND, /* c0000222 */ - ERROR_MR_MID_NOT_FOUND, /* c0000223 */ - ERROR_PASSWORD_MUST_CHANGE, /* c0000224 (STATUS_PASSWORD_MUST_CHANGE) */ - ERROR_MR_MID_NOT_FOUND, /* c0000225 */ - ERROR_MR_MID_NOT_FOUND, /* c0000226 */ - ERROR_MR_MID_NOT_FOUND, /* c0000227 */ - ERROR_MR_MID_NOT_FOUND, /* c0000228 */ - ERROR_MR_MID_NOT_FOUND, /* c0000229 */ - 0, /* c000022a */ - 0, /* c000022b */ - ERROR_MR_MID_NOT_FOUND, /* c000022c */ - ERROR_MR_MID_NOT_FOUND, /* c000022d */ - ERROR_MR_MID_NOT_FOUND, /* c000022e */ - ERROR_MR_MID_NOT_FOUND, /* c000022f */ - ERROR_MR_MID_NOT_FOUND, /* c0000230 */ - ERROR_MR_MID_NOT_FOUND, /* c0000231 */ - ERROR_MR_MID_NOT_FOUND, /* c0000232 */ - ERROR_DOMAIN_CONTROLLER_NOT_FOUND, /* c0000233 */ - ERROR_ACCOUNT_LOCKED_OUT, /* c0000234 */ - ERROR_INVALID_HANDLE, /* c0000235 */ - ERROR_CONNECTION_REFUSED, /* c0000236 */ - ERROR_GRACEFUL_DISCONNECT, /* c0000237 */ - ERROR_ADDRESS_ALREADY_ASSOCIATED, /* c0000238 */ - ERROR_ADDRESS_NOT_ASSOCIATED, /* c0000239 */ - ERROR_CONNECTION_INVALID, /* c000023a */ - ERROR_CONNECTION_ACTIVE, /* c000023b */ - ERROR_NETWORK_UNREACHABLE, /* c000023c */ - ERROR_HOST_UNREACHABLE, /* c000023d */ - ERROR_PROTOCOL_UNREACHABLE, /* c000023e */ - ERROR_PORT_UNREACHABLE, /* c000023f */ - ERROR_REQUEST_ABORTED, /* c0000240 */ - ERROR_CONNECTION_ABORTED, /* c0000241 */ - ERROR_MR_MID_NOT_FOUND, /* c0000242 */ - ERROR_USER_MAPPED_FILE, /* c0000243 */ - ERROR_MR_MID_NOT_FOUND, /* c0000244 */ - ERROR_MR_MID_NOT_FOUND, /* c0000245 */ - ERROR_CONNECTION_COUNT_LIMIT, /* c0000246 */ - ERROR_LOGIN_TIME_RESTRICTION, /* c0000247 */ - ERROR_LOGIN_WKSTA_RESTRICTION, /* c0000248 */ - ERROR_BAD_EXE_FORMAT, /* c0000249 */ - ERROR_MR_MID_NOT_FOUND, /* c000024a */ - ERROR_MR_MID_NOT_FOUND, /* c000024b */ - ERROR_MR_MID_NOT_FOUND, /* c000024c */ - ERROR_MR_MID_NOT_FOUND, /* c000024d */ - ERROR_MR_MID_NOT_FOUND, /* c000024e */ - ERROR_MR_MID_NOT_FOUND, /* c000024f */ - ERROR_MR_MID_NOT_FOUND, /* c0000250 */ - ERROR_MR_MID_NOT_FOUND, /* c0000251 */ - ERROR_MR_MID_NOT_FOUND, /* c0000252 */ - ERROR_INTERNAL_ERROR, /* c0000253 */ - ERROR_MR_MID_NOT_FOUND, /* c0000254 */ - ERROR_MR_MID_NOT_FOUND, /* c0000255 */ - ERROR_MR_MID_NOT_FOUND, /* c0000256 */ - ERROR_HOST_UNREACHABLE, /* c0000257 */ - ERROR_MR_MID_NOT_FOUND, /* c0000258 */ - ERROR_LICENSE_QUOTA_EXCEEDED, /* c0000259 */ - ERROR_MR_MID_NOT_FOUND, /* c000025a */ - ERROR_MR_MID_NOT_FOUND, /* c000025b */ - ERROR_MR_MID_NOT_FOUND, /* c000025c */ - ERROR_MR_MID_NOT_FOUND, /* c000025d */ - ERROR_SERVICE_DISABLED, /* c000025e */ - ERROR_MR_MID_NOT_FOUND, /* c000025f */ - ERROR_MR_MID_NOT_FOUND, /* c0000260 */ - ERROR_MR_MID_NOT_FOUND, /* c0000261 */ - ERROR_INVALID_ORDINAL, /* c0000262 */ - ERROR_PROC_NOT_FOUND, /* c0000263 */ - ERROR_NOT_OWNER, /* c0000264 */ - ERROR_TOO_MANY_LINKS, /* c0000265 */ - ERROR_MR_MID_NOT_FOUND, /* c0000266 */ - ERROR_MR_MID_NOT_FOUND, /* c0000267 */ - ERROR_MR_MID_NOT_FOUND, /* c0000268 */ - ERROR_MR_MID_NOT_FOUND, /* c0000269 */ - ERROR_MR_MID_NOT_FOUND, /* c000026a */ - ERROR_MR_MID_NOT_FOUND, /* c000026b */ - ERROR_MR_MID_NOT_FOUND, /* c000026c */ - ERROR_MR_MID_NOT_FOUND, /* c000026d */ - ERROR_NOT_READY /* c000026e (STATUS_VOLUME_DISMOUNTED) */ -}; - -static const WORD table_c0020001[88] = -{ - RPC_S_INVALID_STRING_BINDING, /* c0020001 (RPC_NT_INVALID_STRING_BINDING) */ - RPC_S_WRONG_KIND_OF_BINDING, /* c0020002 (RPC_NT_WRONG_KIND_OF_BINDING) */ - ERROR_INVALID_HANDLE, /* c0020003 (RPC_NT_INVALID_BINDING) */ - RPC_S_PROTSEQ_NOT_SUPPORTED, /* c0020004 (RPC_NT_PROTSEQ_NOT_SUPPORTED) */ - RPC_S_INVALID_RPC_PROTSEQ, /* c0020005 (RPC_NT_INVALID_RPC_PROTSEQ) */ - RPC_S_INVALID_STRING_UUID, /* c0020006 (RPC_NT_INVALID_STRING_UUID) */ - RPC_S_INVALID_ENDPOINT_FORMAT, /* c0020007 (RPC_NT_INVALID_ENDPOINT_FORMAT) */ - RPC_S_INVALID_NET_ADDR, /* c0020008 (RPC_NT_INVALID_NET_ADDR) */ - RPC_S_NO_ENDPOINT_FOUND, /* c0020009 (RPC_NT_NO_ENDPOINT_FOUND) */ - RPC_S_INVALID_TIMEOUT, /* c002000a (RPC_NT_INVALID_TIMEOUT) */ - RPC_S_OBJECT_NOT_FOUND, /* c002000b (RPC_NT_OBJECT_NOT_FOUND) */ - RPC_S_ALREADY_REGISTERED, /* c002000c (RPC_NT_ALREADY_REGISTERED) */ - RPC_S_TYPE_ALREADY_REGISTERED, /* c002000d (RPC_NT_TYPE_ALREADY_REGISTERED) */ - RPC_S_ALREADY_LISTENING, /* c002000e (RPC_NT_ALREADY_LISTENING) */ - RPC_S_NO_PROTSEQS_REGISTERED, /* c002000f (RPC_NT_NO_PROTSEQS_REGISTERED) */ - RPC_S_NOT_LISTENING, /* c0020010 (RPC_NT_NOT_LISTENING) */ - RPC_S_UNKNOWN_MGR_TYPE, /* c0020011 (RPC_NT_UNKNOWN_MGR_TYPE) */ - RPC_S_UNKNOWN_IF, /* c0020012 (RPC_NT_UNKNOWN_IF) */ - RPC_S_NO_BINDINGS, /* c0020013 (RPC_NT_NO_BINDINGS) */ - RPC_S_NO_PROTSEQS, /* c0020014 (RPC_NT_NO_PROTSEQS) */ - RPC_S_CANT_CREATE_ENDPOINT, /* c0020015 (RPC_NT_CANT_CREATE_ENDPOINT) */ - RPC_S_OUT_OF_RESOURCES, /* c0020016 (RPC_NT_OUT_OF_RESOURCES) */ - RPC_S_SERVER_UNAVAILABLE, /* c0020017 (RPC_NT_SERVER_UNAVAILABLE) */ - RPC_S_SERVER_TOO_BUSY, /* c0020018 (RPC_NT_SERVER_TOO_BUSY) */ - RPC_S_INVALID_NETWORK_OPTIONS, /* c0020019 (RPC_NT_INVALID_NETWORK_OPTIONS) */ - RPC_S_NO_CALL_ACTIVE, /* c002001a (RPC_NT_NO_CALL_ACTIVE) */ - RPC_S_CALL_FAILED, /* c002001b (RPC_NT_CALL_FAILED) */ - RPC_S_CALL_FAILED_DNE, /* c002001c (RPC_NT_CALL_FAILED_DNE) */ - RPC_S_PROTOCOL_ERROR, /* c002001d (RPC_NT_PROTOCOL_ERROR) */ - ERROR_MR_MID_NOT_FOUND, /* c002001e */ - RPC_S_UNSUPPORTED_TRANS_SYN, /* c002001f (RPC_NT_UNSUPPORTED_TRANS_SYN) */ - ERROR_MR_MID_NOT_FOUND, /* c0020020 */ - RPC_S_UNSUPPORTED_TYPE, /* c0020021 (RPC_NT_UNSUPPORTED_TYPE) */ - RPC_S_INVALID_TAG, /* c0020022 (RPC_NT_INVALID_TAG) */ - RPC_S_INVALID_BOUND, /* c0020023 (RPC_NT_INVALID_BOUND) */ - RPC_S_NO_ENTRY_NAME, /* c0020024 (RPC_NT_NO_ENTRY_NAME) */ - RPC_S_INVALID_NAME_SYNTAX, /* c0020025 (RPC_NT_INVALID_NAME_SYNTAX) */ - RPC_S_UNSUPPORTED_NAME_SYNTAX, /* c0020026 (RPC_NT_UNSUPPORTED_NAME_SYNTAX) */ - ERROR_MR_MID_NOT_FOUND, /* c0020027 */ - RPC_S_UUID_NO_ADDRESS, /* c0020028 (RPC_NT_UUID_NO_ADDRESS) */ - RPC_S_DUPLICATE_ENDPOINT, /* c0020029 (RPC_NT_DUPLICATE_ENDPOINT) */ - RPC_S_UNKNOWN_AUTHN_TYPE, /* c002002a (RPC_NT_UNKNOWN_AUTHN_TYPE) */ - RPC_S_MAX_CALLS_TOO_SMALL, /* c002002b (RPC_NT_MAX_CALLS_TOO_SMALL) */ - RPC_S_STRING_TOO_LONG, /* c002002c (RPC_NT_STRING_TOO_LONG) */ - RPC_S_PROTSEQ_NOT_FOUND, /* c002002d (RPC_NT_PROTSEQ_NOT_FOUND) */ - RPC_S_PROCNUM_OUT_OF_RANGE, /* c002002e (RPC_NT_PROCNUM_OUT_OF_RANGE) */ - RPC_S_BINDING_HAS_NO_AUTH, /* c002002f (RPC_NT_BINDING_HAS_NO_AUTH) */ - RPC_S_UNKNOWN_AUTHN_SERVICE, /* c0020030 (RPC_NT_UNKNOWN_AUTHN_SERVICE) */ - RPC_S_UNKNOWN_AUTHN_LEVEL, /* c0020031 (RPC_NT_UNKNOWN_AUTHN_LEVEL) */ - RPC_S_INVALID_AUTH_IDENTITY, /* c0020032 (RPC_NT_INVALID_AUTH_IDENTITY) */ - RPC_S_UNKNOWN_AUTHZ_SERVICE, /* c0020033 (RPC_NT_UNKNOWN_AUTHZ_SERVICE) */ - EPT_S_INVALID_ENTRY, /* c0020034 (EPT_NT_INVALID_ENTRY) */ - EPT_S_CANT_PERFORM_OP, /* c0020035 (EPT_NT_CANT_PERFORM_OP) */ - EPT_S_NOT_REGISTERED, /* c0020036 (EPT_NT_NOT_REGISTERED) */ - RPC_S_NOTHING_TO_EXPORT, /* c0020037 (RPC_NT_NOTHING_TO_EXPORT) */ - RPC_S_INCOMPLETE_NAME, /* c0020038 (RPC_NT_INCOMPLETE_NAME) */ - RPC_S_INVALID_VERS_OPTION, /* c0020039 (RPC_NT_INVALID_VERS_OPTION) */ - RPC_S_NO_MORE_MEMBERS, /* c002003a (RPC_NT_NO_MORE_MEMBERS) */ - RPC_S_NOT_ALL_OBJS_UNEXPORTED, /* c002003b (RPC_NT_NOT_ALL_OBJS_UNEXPORTED) */ - RPC_S_INTERFACE_NOT_FOUND, /* c002003c (RPC_NT_INTERFACE_NOT_FOUND) */ - RPC_S_ENTRY_ALREADY_EXISTS, /* c002003d (RPC_NT_ENTRY_ALREADY_EXISTS) */ - RPC_S_ENTRY_NOT_FOUND, /* c002003e (RPC_NT_ENTRY_NOT_FOUND) */ - RPC_S_NAME_SERVICE_UNAVAILABLE, /* c002003f (RPC_NT_NAME_SERVICE_UNAVAILABLE) */ - RPC_S_INVALID_NAF_ID, /* c0020040 (RPC_NT_INVALID_NAF_ID) */ - RPC_S_CANNOT_SUPPORT, /* c0020041 (RPC_NT_CANNOT_SUPPORT) */ - RPC_S_NO_CONTEXT_AVAILABLE, /* c0020042 (RPC_NT_NO_CONTEXT_AVAILABLE) */ - RPC_S_INTERNAL_ERROR, /* c0020043 (RPC_NT_INTERNAL_ERROR) */ - RPC_S_ZERO_DIVIDE, /* c0020044 (RPC_NT_ZERO_DIVIDE) */ - RPC_S_ADDRESS_ERROR, /* c0020045 (RPC_NT_ADDRESS_ERROR) */ - RPC_S_FP_DIV_ZERO, /* c0020046 (RPC_NT_FP_DIV_ZERO) */ - RPC_S_FP_UNDERFLOW, /* c0020047 (RPC_NT_FP_UNDERFLOW) */ - RPC_S_FP_OVERFLOW, /* c0020048 (RPC_NT_FP_OVERFLOW) */ - RPC_S_CALL_IN_PROGRESS, /* c0020049 (RPC_NT_CALL_IN_PROGRESS) */ - RPC_S_NO_MORE_BINDINGS, /* c002004a (RPC_NT_NO_MORE_BINDINGS) */ - RPC_S_GROUP_MEMBER_NOT_FOUND, /* c002004b (RPC_NT_GROUP_MEMBER_NOT_FOUND) */ - EPT_S_CANT_CREATE, /* c002004c (EPT_NT_CANT_CREATE) */ - RPC_S_INVALID_OBJECT, /* c002004d (RPC_NT_INVALID_OBJECT) */ - ERROR_MR_MID_NOT_FOUND, /* c002004e */ - RPC_S_NO_INTERFACES, /* c002004f */ - RPC_S_CALL_CANCELLED, /* c0020050 */ - RPC_S_BINDING_INCOMPLETE, /* c0020051 */ - RPC_S_COMM_FAILURE, /* c0020052 */ - RPC_S_UNSUPPORTED_AUTHN_LEVEL, /* c0020053 */ - RPC_S_NO_PRINC_NAME, /* c0020054 */ - RPC_S_NOT_RPC_ERROR, /* c0020055 */ - ERROR_MR_MID_NOT_FOUND, /* c0020056 */ - RPC_S_SEC_PKG_ERROR, /* c0020057 */ - RPC_S_NOT_CANCELLED /* c0020058 */ -}; - -static const WORD table_c0030001[12] = -{ - RPC_X_NO_MORE_ENTRIES, /* c0030001 (RPC_NT_NO_MORE_ENTRIES) */ - RPC_X_SS_CHAR_TRANS_OPEN_FAIL, /* c0030002 (RPC_NT_SS_CHAR_TRANS_OPEN_FAIL) */ - RPC_X_SS_CHAR_TRANS_SHORT_FILE, /* c0030003 (RPC_NT_SS_CHAR_TRANS_SHORT_FILE) */ - ERROR_INVALID_HANDLE, /* c0030004 (RPC_NT_SS_IN_NULL_CONTEXT) */ - ERROR_INVALID_HANDLE, /* c0030005 */ - RPC_X_SS_CONTEXT_DAMAGED, /* c0030006 (RPC_NT_SS_CONTEXT_DAMAGED) */ - RPC_X_SS_HANDLES_MISMATCH, /* c0030007 (RPC_NT_SS_HANDLES_MISMATCH) */ - RPC_X_SS_CANNOT_GET_CALL_HANDLE, /* c0030008 (RPC_NT_SS_CANNOT_GET_CALL_HANDLE) */ - RPC_X_NULL_REF_POINTER, /* c0030009 (RPC_NT_NULL_REF_POINTER) */ - RPC_X_ENUM_VALUE_OUT_OF_RANGE, /* c003000a (RPC_NT_ENUM_VALUE_OUT_OF_RANGE) */ - RPC_X_BYTE_COUNT_TOO_SMALL, /* c003000b (RPC_NT_BYTE_COUNT_TOO_SMALL) */ - RPC_X_BAD_STUB_DATA /* c003000c (RPC_NT_BAD_STUB_DATA) */ -}; - -static const WORD table_c0030059[6] = -{ - RPC_X_INVALID_ES_ACTION, /* c0030059 */ - RPC_X_WRONG_ES_VERSION, /* c003005a */ - RPC_X_WRONG_STUB_VERSION, /* c003005b */ - RPC_X_INVALID_PIPE_OBJECT, /* c003005c */ - RPC_X_WRONG_PIPE_ORDER, /* c003005d */ - RPC_X_WRONG_PIPE_VERSION /* c003005e */ -}; - -static const ERROR_TABLE ErrorTable[] = -{ - { 0x00000103, 0x0000010e, table_00000103 }, - { 0x40000002, 0x4000000e, table_40000002 }, - { 0x40020056, 0x40020057, table_40020056 }, - { 0x400200af, 0x400200b0, table_400200af }, - { 0x80000001, 0x80000027, table_80000001 }, - { 0x80090300, 0x80090317, table_80090300 }, - { 0xc0000001, 0xc000019c, table_c0000001 }, - { 0xc0000202, 0xc000026f, table_c0000202 }, - { 0xc0020001, 0xc0020059, table_c0020001 }, - { 0xc0030001, 0xc003000d, table_c0030001 }, - { 0xc0030059, 0xc003005f, table_c0030059 }, - { 0, 0, 0 } /* last entry */ -}; - - -#if 0 -/* currently not assigned values */ - ERROR_ARENA_TRASHED -STATUS_HANDLE_NOT_WAITABLE ERROR_INVALID_HANDLE; -STATUS_LOCK_NOT_GRANTED ERROR_LOCK_VIOLATION; - -RPC_NT_SS_CONTEXT_MISMATCH ERROR_INVALID_HANDLE -#endif - - -/* FUNCTIONS ***************************************************************/ - -/* - * @implemented - */ -VOID -STDCALL -RtlAssert(PVOID FailedAssertion, - PVOID FileName, - ULONG LineNumber, - PCHAR Message) -{ - DbgPrint ("Assertion \'%s\' failed at %s line %d: %s\n", - (PCHAR)FailedAssertion, - (PCHAR)FileName, - LineNumber, - Message); -} - - -/********************************************************************** - * NAME PRIVATE - * RtlNtStatusToDosErrorNoTeb - * - * DESCRIPTION - * Convert an Executive status ID into a DOS error number - * (winerror.h). - * - * ARGUMENTS - * Status The Executive status ID to convert. - * - * RETURN VALUE - * dos error as in winerror.h - * - * REMARK - * RtlNtStatusToDosErrorNoTeb() does the real work. - */ -DWORD STDCALL -RtlNtStatusToDosErrorNoTeb(NTSTATUS Status) -{ - PERROR_TABLE Table = (PERROR_TABLE)ErrorTable; - - if (!Status || (Status & 0x20000000)) - return Status; - - /* 0xd... is equivalent to 0xc... */ - if ((Status & 0xf0000000) == 0xd0000000) - Status &= ~0x10000000; - - while (Table->Start) - { - if ((ULONG)Status < Table->Start) - break; - - if ((ULONG)Status < Table->End) - { - DWORD ret = Table->Table[(ULONG)Status - Table->Start]; - if (!ret) - ret = Status; /* 0 means 1:1 mapping */ - else if (ret == ERROR_MR_MID_NOT_FOUND) - { - DbgPrint("RTL: RtlNtStatusToDosErrorNoTeb(0x%lx): no valid W32 error mapping\n", Status); - } - return ret; - } - Table++; - } - - /* now some special cases */ - if (HIWORD(Status) == 0xc001) - return LOWORD(Status); - if (HIWORD(Status) == 0x8007) - return LOWORD(Status); - - DbgPrint("RTL: RtlNtStatusToDosErrorNoTeb(0x%lx): no valid W32 error mapping\n", Status); - return ERROR_MR_MID_NOT_FOUND; -} - - -/********************************************************************** - * NAME EXPORTED - * RtlNtStatusToDosError - * - * DESCRIPTION - * Convert an Executive status ID into a DOS error number - * (winerror.h). - * - * ARGUMENTS - * Status The Executive status ID to convert. - * - * RETURN VALUE - * dos error as in winerror.h - * - * REMARK - * RtlNtStatusToDosErrorNoTeb() does the real work. - * - * @implemented - */ -DWORD STDCALL -RtlNtStatusToDosError(NTSTATUS Status) -{ - PTEB Teb = NtCurrentTeb(); - - if (NULL != Teb) - { - Teb->LastStatusValue = Status; - } - return RtlNtStatusToDosErrorNoTeb(Status); -} -/* EOF */ diff --git a/reactos/lib/ntdll/rtl/heap.c b/reactos/lib/ntdll/rtl/heap.c deleted file mode 100644 index 8737de52dbe..00000000000 --- a/reactos/lib/ntdll/rtl/heap.c +++ /dev/null @@ -1,1686 +0,0 @@ -/* - * Win32 heap functions - * - * Copyright 1996 Alexandre Julliard - * Copyright 1998 Ulrich Weigand - */ - - -/* Note: the heap data structures are based on what Pietrek describes in his - * book 'Windows 95 System Programming Secrets'. The layout is not exactly - * the same, but could be easily adapted if it turns out some programs - * require it. - */ - -#include <string.h> -#include <ddk/ntddk.h> -#include <ntdll/rtl.h> -#include <ntos/heap.h> -#include <ntos/minmax.h> - -#define NDEBUG -#include <ntdll/ntdll.h> - -#define DPRINTF DPRINT -#define ERR DPRINT -#define SetLastError(x) -#define WARN DPRINT -#define TRACE DPRINT -#define WARN_ON(x) (1) - -#undef assert -#ifdef NDEBUG -#define TRACE_ON(x) (0) -#define assert(x) -#else -#define TRACE_ON(x) (1) -#define assert(x) -#endif - - -static CRITICAL_SECTION RtlpProcessHeapsListLock; - - -typedef struct tagARENA_INUSE -{ - DWORD size; /* Block size; must be the first field */ - WORD threadId; /* Allocating thread id */ - WORD magic; /* Magic number */ -} ARENA_INUSE; - -typedef struct tagARENA_FREE -{ - DWORD size; /* Block size; must be the first field */ - WORD threadId; /* Freeing thread id */ - WORD magic; /* Magic number */ - struct tagARENA_FREE *next; /* Next free arena */ - struct tagARENA_FREE *prev; /* Prev free arena */ -} ARENA_FREE; - -#define ARENA_FLAG_FREE 0x00000001 /* flags OR'ed with arena size */ -#define ARENA_FLAG_PREV_FREE 0x00000002 -#define ARENA_SIZE_MASK 0xfffffffc -#define ARENA_INUSE_MAGIC 0x4842 /* Value for arena 'magic' field */ -#define ARENA_FREE_MAGIC 0x4846 /* Value for arena 'magic' field */ - -#define ARENA_INUSE_FILLER 0x55 -#define ARENA_FREE_FILLER 0xaa - -#define QUIET 1 /* Suppress messages */ -#define NOISY 0 /* Report all errors */ - -#define HEAP_NB_FREE_LISTS 4 /* Number of free lists */ - -/* Max size of the blocks on the free lists */ -static const DWORD HEAP_freeListSizes[HEAP_NB_FREE_LISTS] = -{ - 0x20, 0x80, 0x200, 0xffffffff -}; - -typedef struct -{ - DWORD size; - ARENA_FREE arena; -} FREE_LIST_ENTRY; - -struct tagHEAP; - -typedef struct tagSUBHEAP -{ - DWORD size; /* Size of the whole sub-heap */ - DWORD commitSize; /* Committed size of the sub-heap */ - DWORD headerSize; /* Size of the heap header */ - struct tagSUBHEAP *next; /* Next sub-heap */ - struct tagHEAP *heap; /* Main heap structure */ - DWORD magic; /* Magic number */ -} SUBHEAP, *PSUBHEAP; - -#define SUBHEAP_MAGIC ((DWORD)('S' | ('U'<<8) | ('B'<<16) | ('H'<<24))) - -typedef struct tagHEAP -{ - SUBHEAP subheap; /* First sub-heap */ - struct tagHEAP *next; /* Next heap for this process */ - FREE_LIST_ENTRY freeList[HEAP_NB_FREE_LISTS]; /* Free lists */ - CRITICAL_SECTION critSection; /* Critical section for serialization */ - DWORD flags; /* Heap flags */ - DWORD magic; /* Magic number */ - BYTE filler[4]; /* Make multiple of 8 bytes */ -} HEAP, *PHEAP; - -#define HEAP_MAGIC ((DWORD)('H' | ('E'<<8) | ('A'<<16) | ('P'<<24))) - -#define HEAP_DEF_SIZE 0x110000 /* Default heap size = 1Mb + 64Kb */ -#define HEAP_MIN_BLOCK_SIZE (sizeof(ARENA_FREE) + 8) /* Min. heap block size */ -#define COMMIT_MASK 0xffff /* bitmask for commit/decommit granularity */ - - -static BOOL HEAP_IsRealArena( HANDLE heap, DWORD flags, LPCVOID block, BOOL quiet ); - - -/*********************************************************************** - * HEAP_Dump - */ -void -HEAP_Dump(PHEAP heap) -{ - int i; - SUBHEAP *subheap; - char *ptr; - - DPRINTF( "Heap: %08lx\n", (DWORD)heap ); - DPRINTF( "Next: %08lx Sub-heaps: %08lx", - (DWORD)heap->next, (DWORD)&heap->subheap ); - subheap = &heap->subheap; - while (subheap->next) - { - DPRINTF( " -> %08lx", (DWORD)subheap->next ); - subheap = subheap->next; - } - - DPRINTF( "\nFree lists:\n Block Stat Size Id\n" ); - for (i = 0; i < HEAP_NB_FREE_LISTS; i++) - DPRINTF( "%08lx free %08lx %04x prev=%08lx next=%08lx\n", - (DWORD)&heap->freeList[i].arena, heap->freeList[i].arena.size, - heap->freeList[i].arena.threadId, - (DWORD)heap->freeList[i].arena.prev, - (DWORD)heap->freeList[i].arena.next ); - - subheap = &heap->subheap; - while (subheap) - { - DWORD freeSize = 0, usedSize = 0, arenaSize = subheap->headerSize; - DPRINTF( "\n\nSub-heap %08lx: size=%08lx committed=%08lx\n", - (DWORD)subheap, subheap->size, subheap->commitSize ); - - DPRINTF( "\n Block Stat Size Id\n" ); - ptr = (char*)subheap + subheap->headerSize; - while (ptr < (char *)subheap + subheap->size) - { - if (*(DWORD *)ptr & ARENA_FLAG_FREE) - { - ARENA_FREE *pArena = (ARENA_FREE *)ptr; - DPRINTF( "%08lx free %08lx %04x prev=%08lx next=%08lx\n", - (DWORD)pArena, pArena->size & ARENA_SIZE_MASK, - pArena->threadId, (DWORD)pArena->prev, - (DWORD)pArena->next); - ptr += sizeof(*pArena) + (pArena->size & ARENA_SIZE_MASK); - arenaSize += sizeof(ARENA_FREE); - freeSize += pArena->size & ARENA_SIZE_MASK; - } - else if (*(DWORD *)ptr & ARENA_FLAG_PREV_FREE) - { - ARENA_INUSE *pArena = (ARENA_INUSE *)ptr; - DPRINTF( "%08lx Used %08lx %04x back=%08lx\n", - (DWORD)pArena, pArena->size & ARENA_SIZE_MASK, - pArena->threadId, *((DWORD *)pArena - 1)); - ptr += sizeof(*pArena) + (pArena->size & ARENA_SIZE_MASK); - arenaSize += sizeof(ARENA_INUSE); - usedSize += pArena->size & ARENA_SIZE_MASK; - } - else - { - ARENA_INUSE *pArena = (ARENA_INUSE *)ptr; - DPRINTF( "%08lx used %08lx %04x\n", - (DWORD)pArena, pArena->size & ARENA_SIZE_MASK, - pArena->threadId); - ptr += sizeof(*pArena) + (pArena->size & ARENA_SIZE_MASK); - arenaSize += sizeof(ARENA_INUSE); - usedSize += pArena->size & ARENA_SIZE_MASK; - } - } - DPRINTF( "\nTotal: Size=%08lx Committed=%08lx Free=%08lx Used=%08lx Arenas=%08lx (%ld%%)\n\n", - subheap->size, subheap->commitSize, freeSize, usedSize, - arenaSize, (arenaSize * 100) / subheap->size ); - subheap = subheap->next; - } -} - - -/*********************************************************************** - * HEAP_GetPtr - * RETURNS - * Pointer to the heap - * NULL: Failure - */ -static PHEAP -HEAP_GetPtr(HANDLE heap) /* [in] Handle to the heap */ -{ - HEAP *heapPtr = (HEAP *)heap; - if (!heapPtr || (heapPtr->magic != HEAP_MAGIC)) - { - ERR("Invalid heap %08x!\n", heap ); - return NULL; - } - if (TRACE_ON(heap) && !HEAP_IsRealArena( heap, 0, NULL, NOISY )) - { - HEAP_Dump( heapPtr ); - assert( FALSE ); - return NULL; - } - return heapPtr; -} - - -/*********************************************************************** - * HEAP_InsertFreeBlock - * - * Insert a free block into the free list. - */ -static VOID -HEAP_InsertFreeBlock(PHEAP heap, - ARENA_FREE *pArena, - BOOL last) -{ - FREE_LIST_ENTRY *pEntry = heap->freeList; - while (pEntry->size < pArena->size) pEntry++; - if (last) - { - /* insert at end of free list, i.e. before next free list entry */ - pEntry++; - if (pEntry == &heap->freeList[HEAP_NB_FREE_LISTS]) - { - pEntry = heap->freeList; - } - pArena->prev = pEntry->arena.prev; - pArena->prev->next = pArena; - pArena->next = &pEntry->arena; - pEntry->arena.prev = pArena; - } - else - { - /* insert at head of free list */ - pArena->next = pEntry->arena.next; - pArena->next->prev = pArena; - pArena->prev = &pEntry->arena; - pEntry->arena.next = pArena; - } - pArena->size |= ARENA_FLAG_FREE; -} - - -/*********************************************************************** - * HEAP_FindSubHeap - * Find the sub-heap containing a given address. - * - * RETURNS - * Pointer: Success - * NULL: Failure - */ -static PSUBHEAP -HEAP_FindSubHeap(HEAP *heap, /* [in] Heap pointer */ - LPCVOID ptr) /* [in] Address */ -{ - SUBHEAP *sub = &heap->subheap; - while (sub) - { - if (((char *)ptr >= (char *)sub) && - ((char *)ptr < (char *)sub + sub->size)) return sub; - sub = sub->next; - } - return NULL; -} - - -/*********************************************************************** - * HEAP_Commit - * - * Make sure the heap storage is committed up to (not including) ptr. - */ -static inline BOOL -HEAP_Commit(SUBHEAP *subheap, - void *ptr, - DWORD flags) -{ - DWORD size = (DWORD)((char *)ptr - (char *)subheap); - NTSTATUS Status; - PVOID address; - ULONG commitsize; - - size = (size + COMMIT_MASK) & ~COMMIT_MASK; - if (size > subheap->size) size = subheap->size; - if (size <= subheap->commitSize) return TRUE; - - address = (PVOID)((char *)subheap + subheap->commitSize); - commitsize = size - subheap->commitSize; - - if (!(flags & HEAP_NO_VALLOC)) - { - Status = NtAllocateVirtualMemory(NtCurrentProcess(), - &address, - 0, - &commitsize, - MEM_COMMIT, - PAGE_EXECUTE_READWRITE); - if (!NT_SUCCESS(Status)) - { - WARN("Could not commit %08lx bytes at %08lx for heap %08lx\n", - size - subheap->commitSize, - (DWORD)((char *)subheap + subheap->commitSize), - (DWORD)subheap->heap ); - return FALSE; - } - } - subheap->commitSize += commitsize; - return TRUE; -} - - -/*********************************************************************** - * HEAP_Decommit - * - * If possible, decommit the heap storage from (including) 'ptr'. - */ -static inline BOOL HEAP_Decommit( SUBHEAP *subheap, void *ptr, DWORD flags ) -{ - DWORD size = (DWORD)((char *)ptr - (char *)subheap); - PVOID address; - ULONG decommitsize; - NTSTATUS Status; - /* round to next block and add one full block */ - size = ((size + COMMIT_MASK) & ~COMMIT_MASK) + COMMIT_MASK + 1; - if (size >= subheap->commitSize) return TRUE; - - address = (PVOID)((char *)subheap + size); - decommitsize = subheap->commitSize - size; - - if (!(flags & HEAP_NO_VALLOC)) - { - Status = ZwFreeVirtualMemory(NtCurrentProcess(), - &address, - &decommitsize, - MEM_DECOMMIT); - if (!NT_SUCCESS(Status)); - { - WARN("Could not decommit %08lx bytes at %08lx for heap %08lx\n", - subheap->commitSize - size, - (DWORD)((char *)subheap + size), - (DWORD)subheap->heap ); - return FALSE; - } - } - subheap->commitSize -= decommitsize; - return TRUE; -} - - -/*********************************************************************** - * HEAP_CreateFreeBlock - * - * Create a free block at a specified address. 'size' is the size of the - * whole block, including the new arena. - */ -static void HEAP_CreateFreeBlock( SUBHEAP *subheap, void *ptr, DWORD size ) -{ - ARENA_FREE *pFree; - BOOL last; - - /* Create a free arena */ - - pFree = (ARENA_FREE *)ptr; - pFree->threadId = (DWORD)NtCurrentTeb()->Cid.UniqueThread; - pFree->magic = ARENA_FREE_MAGIC; - - /* If debugging, erase the freed block content */ - - if (TRACE_ON(heap)) - { - char *pEnd = (char *)ptr + size; - if (pEnd > (char *)subheap + subheap->commitSize) - pEnd = (char *)subheap + subheap->commitSize; - if (pEnd > (char *)(pFree + 1)) - memset( pFree + 1, ARENA_FREE_FILLER, pEnd - (char *)(pFree + 1) ); - } - - /* Check if next block is free also */ - - if (((char *)ptr + size < (char *)subheap + subheap->size) && - (*(DWORD *)((char *)ptr + size) & ARENA_FLAG_FREE)) - { - /* Remove the next arena from the free list */ - ARENA_FREE *pNext = (ARENA_FREE *)((char *)ptr + size); - pNext->next->prev = pNext->prev; - pNext->prev->next = pNext->next; - size += (pNext->size & ARENA_SIZE_MASK) + sizeof(*pNext); - if (TRACE_ON(heap)) - memset( pNext, ARENA_FREE_FILLER, sizeof(ARENA_FREE) ); - } - - /* Set the next block PREV_FREE flag and pointer */ - - last = ((char *)ptr + size >= (char *)subheap + subheap->size); - if (!last) - { - DWORD *pNext = (DWORD *)((char *)ptr + size); - *pNext |= ARENA_FLAG_PREV_FREE; - *(ARENA_FREE **)(pNext - 1) = pFree; - } - - /* Last, insert the new block into the free list */ - - pFree->size = size - sizeof(*pFree); - HEAP_InsertFreeBlock( subheap->heap, pFree, last ); -} - - -/*********************************************************************** - * HEAP_MakeInUseBlockFree - * - * Turn an in-use block into a free block. Can also decommit the end of - * the heap, and possibly even free the sub-heap altogether. - */ -static void HEAP_MakeInUseBlockFree( SUBHEAP *subheap, ARENA_INUSE *pArena, - DWORD flags) -{ - ARENA_FREE *pFree; - DWORD size = (pArena->size & ARENA_SIZE_MASK) + sizeof(*pArena); - - /* Check if we can merge with previous block */ - - if (pArena->size & ARENA_FLAG_PREV_FREE) - { - pFree = *((ARENA_FREE **)pArena - 1); - size += (pFree->size & ARENA_SIZE_MASK) + sizeof(ARENA_FREE); - /* Remove it from the free list */ - pFree->next->prev = pFree->prev; - pFree->prev->next = pFree->next; - } - else pFree = (ARENA_FREE *)pArena; - - /* Create a free block */ - - HEAP_CreateFreeBlock( subheap, pFree, size ); - size = (pFree->size & ARENA_SIZE_MASK) + sizeof(ARENA_FREE); - if ((char *)pFree + size < (char *)subheap + subheap->size) - return; /* Not the last block, so nothing more to do */ - - /* Free the whole sub-heap if it's empty and not the original one */ - - if (((char *)pFree == (char *)subheap + subheap->headerSize) && - (subheap != &subheap->heap->subheap)) - { - SUBHEAP *pPrev = &subheap->heap->subheap; - /* Remove the free block from the list */ - pFree->next->prev = pFree->prev; - pFree->prev->next = pFree->next; - /* Remove the subheap from the list */ - while (pPrev && (pPrev->next != subheap)) pPrev = pPrev->next; - if (pPrev) pPrev->next = subheap->next; - /* Free the memory */ - subheap->magic = 0; - if (!(flags & HEAP_NO_VALLOC)) - { - ULONG dummySize = 0; - ZwFreeVirtualMemory(NtCurrentProcess(), - (PVOID*)&subheap, - &dummySize, - MEM_RELEASE); - } - return; - } - - /* Decommit the end of the heap */ -} - - -/*********************************************************************** - * HEAP_ShrinkBlock - * - * Shrink an in-use block. - */ -static void HEAP_ShrinkBlock(SUBHEAP *subheap, ARENA_INUSE *pArena, DWORD size) -{ - if ((pArena->size & ARENA_SIZE_MASK) >= size + HEAP_MIN_BLOCK_SIZE) - { - HEAP_CreateFreeBlock( subheap, (char *)(pArena + 1) + size, - (pArena->size & ARENA_SIZE_MASK) - size ); - /* assign size plus previous arena flags */ - pArena->size = size | (pArena->size & ~ARENA_SIZE_MASK); - } - else - { - /* Turn off PREV_FREE flag in next block */ - char *pNext = (char *)(pArena + 1) + (pArena->size & ARENA_SIZE_MASK); - if (pNext < (char *)subheap + subheap->size) - *(DWORD *)pNext &= ~ARENA_FLAG_PREV_FREE; - } -} - -/*********************************************************************** - * HEAP_InitSubHeap - */ -static BOOL HEAP_InitSubHeap( HEAP *heap, LPVOID address, DWORD flags, - DWORD commitSize, DWORD totalSize ) -{ - SUBHEAP *subheap = (SUBHEAP *)address; - FREE_LIST_ENTRY *pEntry; - int i; - NTSTATUS Status; - - /* Commit memory */ - if (!(flags & HEAP_NO_VALLOC)) - { - Status = ZwAllocateVirtualMemory(NtCurrentProcess(), - &address, - 0, - (PULONG)&commitSize, - MEM_COMMIT, - PAGE_EXECUTE_READWRITE); - if (!NT_SUCCESS(Status)) - { - WARN("Could not commit %08lx bytes for sub-heap %08lx\n", - commitSize, (DWORD)address ); - return FALSE; - } - } - - /* Fill the sub-heap structure */ - - subheap = (SUBHEAP *)address; - subheap->heap = heap; - subheap->size = totalSize; - subheap->commitSize = commitSize; - subheap->magic = SUBHEAP_MAGIC; - - if ( subheap != (SUBHEAP *)heap ) - { - /* If this is a secondary subheap, insert it into list */ - - subheap->headerSize = sizeof(SUBHEAP); - subheap->next = heap->subheap.next; - heap->subheap.next = subheap; - } - else - { - /* If this is a primary subheap, initialize main heap */ - - subheap->headerSize = sizeof(HEAP); - subheap->next = NULL; - heap->next = NULL; - heap->flags = flags; - heap->magic = HEAP_MAGIC; - - /* Build the free lists */ - - for (i = 0, pEntry = heap->freeList; i < HEAP_NB_FREE_LISTS; i++, pEntry++) - { - pEntry->size = HEAP_freeListSizes[i]; - pEntry->arena.size = 0 | ARENA_FLAG_FREE; - pEntry->arena.next = i < HEAP_NB_FREE_LISTS-1 ? - &heap->freeList[i+1].arena : &heap->freeList[0].arena; - pEntry->arena.prev = i ? &heap->freeList[i-1].arena : - &heap->freeList[HEAP_NB_FREE_LISTS-1].arena; - pEntry->arena.threadId = 0; - pEntry->arena.magic = ARENA_FREE_MAGIC; - } - - /* Initialize critical section */ - - RtlInitializeCriticalSection( &heap->critSection ); - } - - /* Create the first free block */ - - HEAP_CreateFreeBlock( subheap, (LPBYTE)subheap + subheap->headerSize, - subheap->size - subheap->headerSize ); - - return TRUE; -} - -/*********************************************************************** - * HEAP_CreateSubHeap - * - * Create a sub-heap of the given size. - * If heap == NULL, creates a main heap. - */ -static SUBHEAP *HEAP_CreateSubHeap(PVOID BaseAddress, - HEAP *heap, DWORD flags, - DWORD commitSize, DWORD totalSize ) -{ - LPVOID address; - NTSTATUS Status; - - /* Round-up sizes on a 64K boundary */ - - totalSize = (totalSize + 0xffff) & 0xffff0000; - commitSize = (commitSize + 0xffff) & 0xffff0000; - if (!commitSize) commitSize = 0x10000; - if (totalSize < commitSize) totalSize = commitSize; - - /* Allocate the memory block */ - address = BaseAddress; - if (!(flags & HEAP_NO_VALLOC)) - { - Status = ZwAllocateVirtualMemory(NtCurrentProcess(), - &address, - 0, - (PULONG)&totalSize, - MEM_RESERVE | MEM_COMMIT, - PAGE_EXECUTE_READWRITE); - if (!NT_SUCCESS(Status)) - { - WARN("Could not VirtualAlloc %08lx bytes\n", - totalSize ); - return NULL; - } - } - - /* Initialize subheap */ - - if (!HEAP_InitSubHeap( heap? heap : (HEAP *)address, - address, flags, commitSize, totalSize )) - { - if (address && !(flags & HEAP_NO_VALLOC)) - { - ULONG dummySize = 0; - ZwFreeVirtualMemory(NtCurrentProcess(), - &address, - &dummySize, - MEM_RELEASE); - } - return NULL; - } - - return (SUBHEAP *)address; -} - - -/*********************************************************************** - * HEAP_FindFreeBlock - * - * Find a free block at least as large as the requested size, and make sure - * the requested size is committed. - */ -static ARENA_FREE *HEAP_FindFreeBlock( HEAP *heap, DWORD size, - SUBHEAP **ppSubHeap ) -{ - SUBHEAP *subheap; - ARENA_FREE *pArena; - FREE_LIST_ENTRY *pEntry = heap->freeList; - - /* Find a suitable free list, and in it find a block large enough */ - - while (pEntry->size < size) pEntry++; - pArena = pEntry->arena.next; - while (pArena != &heap->freeList[0].arena) - { - DWORD arena_size = (pArena->size & ARENA_SIZE_MASK) + - sizeof(ARENA_FREE) - sizeof(ARENA_INUSE); - if (arena_size >= size) - { - subheap = HEAP_FindSubHeap( heap, pArena ); - if (!HEAP_Commit( subheap, (char *)pArena + sizeof(ARENA_INUSE) - + size + HEAP_MIN_BLOCK_SIZE, - heap->flags)) - return NULL; - *ppSubHeap = subheap; - return pArena; - } - - pArena = pArena->next; - } - - /* If no block was found, attempt to grow the heap */ - - if (!(heap->flags & HEAP_GROWABLE)) - { - WARN("Not enough space in heap %08lx for %08lx bytes\n", - (DWORD)heap, size ); - return NULL; - } - /* make sure that we have a big enough size *committed* to fit another - * last free arena in ! - * So just one heap struct, one first free arena which will eventually - * get inuse, and HEAP_MIN_BLOCK_SIZE for the second free arena that - * might get assigned all remaining free space in HEAP_ShrinkBlock() */ - size += sizeof(SUBHEAP) + sizeof(ARENA_FREE) + HEAP_MIN_BLOCK_SIZE; - if (!(subheap = HEAP_CreateSubHeap( NULL, heap, heap->flags, size, - max( HEAP_DEF_SIZE, size ) ))) - return NULL; - - TRACE("created new sub-heap %08lx of %08lx bytes for heap %08lx\n", - (DWORD)subheap, size, (DWORD)heap ); - - *ppSubHeap = subheap; - return (ARENA_FREE *)(subheap + 1); -} - - -/*********************************************************************** - * HEAP_IsValidArenaPtr - * - * Check that the pointer is inside the range possible for arenas. - */ -static BOOL HEAP_IsValidArenaPtr( HEAP *heap, void *ptr ) -{ - int i; - SUBHEAP *subheap = HEAP_FindSubHeap( heap, ptr ); - if (!subheap) return FALSE; - if ((char *)ptr >= (char *)subheap + subheap->headerSize) return TRUE; - if (subheap != &heap->subheap) return FALSE; - for (i = 0; i < HEAP_NB_FREE_LISTS; i++) - if (ptr == (void *)&heap->freeList[i].arena) return TRUE; - return FALSE; -} - - -/*********************************************************************** - * HEAP_ValidateFreeArena - */ -static BOOL HEAP_ValidateFreeArena( SUBHEAP *subheap, ARENA_FREE *pArena ) -{ - char *heapEnd = (char *)subheap + subheap->size; - - /* Check magic number */ - if (pArena->magic != ARENA_FREE_MAGIC) - { - ERR("Heap %08lx: invalid free arena magic for %08lx\n", - (DWORD)subheap->heap, (DWORD)pArena ); - return FALSE; - } - /* Check size flags */ - if (!(pArena->size & ARENA_FLAG_FREE) || - (pArena->size & ARENA_FLAG_PREV_FREE)) - { - ERR("Heap %08lx: bad flags %lx for free arena %08lx\n", - (DWORD)subheap->heap, pArena->size & ~ARENA_SIZE_MASK, (DWORD)pArena ); - } - /* Check arena size */ - if ((char *)(pArena + 1) + (pArena->size & ARENA_SIZE_MASK) > heapEnd) - { - ERR("Heap %08lx: bad size %08lx for free arena %08lx\n", - (DWORD)subheap->heap, (DWORD)pArena->size & ARENA_SIZE_MASK, (DWORD)pArena ); - return FALSE; - } - /* Check that next pointer is valid */ - if (!HEAP_IsValidArenaPtr( subheap->heap, pArena->next )) - { - ERR("Heap %08lx: bad next ptr %08lx for arena %08lx\n", - (DWORD)subheap->heap, (DWORD)pArena->next, (DWORD)pArena ); - return FALSE; - } - /* Check that next arena is free */ - if (!(pArena->next->size & ARENA_FLAG_FREE) || - (pArena->next->magic != ARENA_FREE_MAGIC)) - { - ERR("Heap %08lx: next arena %08lx invalid for %08lx\n", - (DWORD)subheap->heap, (DWORD)pArena->next, (DWORD)pArena ); - return FALSE; - } - /* Check that prev pointer is valid */ - if (!HEAP_IsValidArenaPtr( subheap->heap, pArena->prev )) - { - ERR("Heap %08lx: bad prev ptr %08lx for arena %08lx\n", - (DWORD)subheap->heap, (DWORD)pArena->prev, (DWORD)pArena ); - return FALSE; - } - /* Check that prev arena is free */ - if (!(pArena->prev->size & ARENA_FLAG_FREE) || - (pArena->prev->magic != ARENA_FREE_MAGIC)) - { - ERR("Heap %08lx: prev arena %08lx invalid for %08lx\n", - (DWORD)subheap->heap, (DWORD)pArena->prev, (DWORD)pArena ); - return FALSE; - } - /* Check that next block has PREV_FREE flag */ - if ((char *)(pArena + 1) + (pArena->size & ARENA_SIZE_MASK) < heapEnd) - { - if (!(*(DWORD *)((char *)(pArena + 1) + - (pArena->size & ARENA_SIZE_MASK)) & ARENA_FLAG_PREV_FREE)) - { - ERR("Heap %08lx: free arena %08lx next block has no PREV_FREE flag\n", - (DWORD)subheap->heap, (DWORD)pArena ); - return FALSE; - } - /* Check next block back pointer */ - if (*((ARENA_FREE **)((char *)(pArena + 1) + - (pArena->size & ARENA_SIZE_MASK)) - 1) != pArena) - { - ERR("Heap %08lx: arena %08lx has wrong back ptr %08lx\n", - (DWORD)subheap->heap, (DWORD)pArena, - *((DWORD *)((char *)(pArena+1)+ (pArena->size & ARENA_SIZE_MASK)) - 1)); - return FALSE; - } - } - return TRUE; -} - - -/*********************************************************************** - * HEAP_ValidateInUseArena - */ -static BOOL HEAP_ValidateInUseArena( SUBHEAP *subheap, ARENA_INUSE *pArena, BOOL quiet ) -{ - char *heapEnd = (char *)subheap + subheap->size; - - /* Check magic number */ - if (pArena->magic != ARENA_INUSE_MAGIC) - { - if (quiet == NOISY) { - ERR("Heap %08lx: invalid in-use arena magic for %08lx\n", - (DWORD)subheap->heap, (DWORD)pArena ); - if (TRACE_ON(heap)) - HEAP_Dump( subheap->heap ); - } else if (WARN_ON(heap)) { - WARN("Heap %08lx: invalid in-use arena magic for %08lx\n", - (DWORD)subheap->heap, (DWORD)pArena ); - if (TRACE_ON(heap)) - HEAP_Dump( subheap->heap ); - } - return FALSE; - } - /* Check size flags */ - if (pArena->size & ARENA_FLAG_FREE) - { - ERR("Heap %08lx: bad flags %lx for in-use arena %08lx\n", - (DWORD)subheap->heap, pArena->size & ~ARENA_SIZE_MASK, (DWORD)pArena ); - return FALSE; - } - /* Check arena size */ - if ((char *)(pArena + 1) + (pArena->size & ARENA_SIZE_MASK) > heapEnd) - { - ERR("Heap %08lx: bad size %08lx for in-use arena %08lx\n", - (DWORD)subheap->heap, (DWORD)pArena->size & ARENA_SIZE_MASK, (DWORD)pArena ); - return FALSE; - } - /* Check next arena PREV_FREE flag */ - if (((char *)(pArena + 1) + (pArena->size & ARENA_SIZE_MASK) < heapEnd) && - (*(DWORD *)((char *)(pArena + 1) + (pArena->size & ARENA_SIZE_MASK)) & ARENA_FLAG_PREV_FREE)) - { - ERR("Heap %08lx: in-use arena %08lx next block has PREV_FREE flag\n", - (DWORD)subheap->heap, (DWORD)pArena ); - return FALSE; - } - /* Check prev free arena */ - if (pArena->size & ARENA_FLAG_PREV_FREE) - { - ARENA_FREE *pPrev = *((ARENA_FREE **)pArena - 1); - /* Check prev pointer */ - if (!HEAP_IsValidArenaPtr( subheap->heap, pPrev )) - { - ERR("Heap %08lx: bad back ptr %08lx for arena %08lx\n", - (DWORD)subheap->heap, (DWORD)pPrev, (DWORD)pArena ); - return FALSE; - } - /* Check that prev arena is free */ - if (!(pPrev->size & ARENA_FLAG_FREE) || - (pPrev->magic != ARENA_FREE_MAGIC)) - { - ERR("Heap %08lx: prev arena %08lx invalid for in-use %08lx\n", - (DWORD)subheap->heap, (DWORD)pPrev, (DWORD)pArena ); - return FALSE; - } - /* Check that prev arena is really the previous block */ - if ((char *)(pPrev + 1) + (pPrev->size & ARENA_SIZE_MASK) != (char *)pArena) - { - ERR("Heap %08lx: prev arena %08lx is not prev for in-use %08lx\n", - (DWORD)subheap->heap, (DWORD)pPrev, (DWORD)pArena ); - return FALSE; - } - } - return TRUE; -} - - -/*********************************************************************** - * HEAP_IsInsideHeap - * Checks whether the pointer points to a block inside a given heap. - * - * NOTES - * Should this return BOOL32? - * - * RETURNS - * !0: Success - * 0: Failure - */ -int HEAP_IsInsideHeap( - HANDLE heap, /* [in] Heap */ - DWORD flags, /* [in] Flags */ - LPCVOID ptr /* [in] Pointer */ -) { - HEAP *heapPtr = HEAP_GetPtr( heap ); - SUBHEAP *subheap; - int ret; - - /* Validate the parameters */ - - if (!heapPtr) return 0; - flags |= heapPtr->flags; - if (!(flags & HEAP_NO_SERIALIZE)) RtlEnterCriticalSection( &heapPtr->critSection ); - ret = (((subheap = HEAP_FindSubHeap( heapPtr, ptr )) != NULL) && - (((char *)ptr >= (char *)subheap + subheap->headerSize - + sizeof(ARENA_INUSE)))); - if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveCriticalSection( &heapPtr->critSection ); - return ret; -} - - - - -/*********************************************************************** - * HEAP_IsRealArena [Internal] - * Validates a block is a valid arena. - * - * RETURNS - * TRUE: Success - * FALSE: Failure - */ -static BOOL HEAP_IsRealArena( - HANDLE heap, /* [in] Handle to the heap */ - DWORD flags, /* [in] Bit flags that control access during operation */ - LPCVOID block, /* [in] Optional pointer to memory block to validate */ - BOOL quiet /* [in] Flag - if true, HEAP_ValidateInUseArena - * does not complain */ -) { - SUBHEAP *subheap; - HEAP *heapPtr = (HEAP *)(heap); - BOOL ret = TRUE; - - if (!heapPtr || (heapPtr->magic != HEAP_MAGIC)) - { - ERR("Invalid heap %08x!\n", heap ); - return FALSE; - } - - flags &= HEAP_NO_SERIALIZE; - flags |= heapPtr->flags; - /* calling HeapLock may result in infinite recursion, so do the critsect directly */ - if (!(flags & HEAP_NO_SERIALIZE)) - RtlEnterCriticalSection( &heapPtr->critSection ); - - if (block) - { - /* Only check this single memory block */ - - /* The following code is really HEAP_IsInsideHeap * - * with serialization already done. */ - if (!(subheap = HEAP_FindSubHeap( heapPtr, block )) || - ((char *)block < (char *)subheap + subheap->headerSize - + sizeof(ARENA_INUSE))) - { - if (quiet == NOISY) - { - ERR("Heap %08lx: block %08lx is not inside heap\n", - (DWORD)heap, (DWORD)block ); - } - else if (WARN_ON(heap)) - { - WARN("Heap %08lx: block %08lx is not inside heap\n", - (DWORD)heap, (DWORD)block ); - } - ret = FALSE; - } else - ret = HEAP_ValidateInUseArena( subheap, (ARENA_INUSE *)block - 1, quiet ); - - if (!(flags & HEAP_NO_SERIALIZE)) - RtlLeaveCriticalSection( &heapPtr->critSection ); - return ret; - } - - subheap = &heapPtr->subheap; - while (subheap && ret) - { - char *ptr = (char *)subheap + subheap->headerSize; - while (ptr < (char *)subheap + subheap->size) - { - if (*(DWORD *)ptr & ARENA_FLAG_FREE) - { - if (!HEAP_ValidateFreeArena( subheap, (ARENA_FREE *)ptr )) { - ret = FALSE; - break; - } - ptr += sizeof(ARENA_FREE) + (*(DWORD *)ptr & ARENA_SIZE_MASK); - } - else - { - if (!HEAP_ValidateInUseArena( subheap, (ARENA_INUSE *)ptr, NOISY )) { - ret = FALSE; - break; - } - ptr += sizeof(ARENA_INUSE) + (*(DWORD *)ptr & ARENA_SIZE_MASK); - } - } - subheap = subheap->next; - } - - if (!(flags & HEAP_NO_SERIALIZE)) - RtlLeaveCriticalSection( &heapPtr->critSection ); - return ret; -} - - -/*********************************************************************** - * HeapCreate (KERNEL32.336) - * RETURNS - * Handle of heap: Success - * NULL: Failure - * - * @implemented - */ -HANDLE STDCALL -RtlCreateHeap(ULONG flags, - PVOID BaseAddress, - ULONG maxSize, - ULONG initialSize, - PVOID Unknown, - PRTL_HEAP_DEFINITION Definition) -{ - SUBHEAP *subheap; - ULONG i; - - /* Allocate the heap block */ - - if (!maxSize) - { - maxSize = HEAP_DEF_SIZE; - flags |= HEAP_GROWABLE; - } - if (!(subheap = HEAP_CreateSubHeap( BaseAddress, NULL, flags, initialSize, maxSize ))) - { - return 0; - } - - RtlEnterCriticalSection (&RtlpProcessHeapsListLock); - for (i = 0; i < NtCurrentPeb ()->NumberOfHeaps; i++) - { - if (NtCurrentPeb ()->ProcessHeaps[i] == NULL) - { - NtCurrentPeb()->ProcessHeaps[i] = (PVOID)subheap; - break; - } - } - RtlLeaveCriticalSection (&RtlpProcessHeapsListLock); - - return (HANDLE)subheap; -} - -/*********************************************************************** - * HeapDestroy (KERNEL32.337) - * RETURNS - * TRUE: Success - * FALSE: Failure - * - * @implemented - */ -BOOL STDCALL -RtlDestroyHeap(HANDLE heap) /* [in] Handle of heap */ -{ - HEAP *heapPtr = HEAP_GetPtr( heap ); - SUBHEAP *subheap; - ULONG i, flags; - - TRACE("%08x\n", heap ); - if (!heapPtr) return FALSE; - - RtlEnterCriticalSection (&RtlpProcessHeapsListLock); - for (i = 0; i < NtCurrentPeb ()->NumberOfHeaps; i++) - { - if (NtCurrentPeb ()->ProcessHeaps[i] == heap) - { - NtCurrentPeb()->ProcessHeaps[i] = NULL; - break; - } - } - RtlLeaveCriticalSection (&RtlpProcessHeapsListLock); - - RtlDeleteCriticalSection( &heapPtr->critSection ); - subheap = &heapPtr->subheap; - // We must save the flags. The first subheap is located after - // the heap structure. If we release the first subheap, - // we release also the heap structure. - flags = heapPtr->flags; - while (subheap) - { - SUBHEAP *next = subheap->next; - - if (!(flags & HEAP_NO_VALLOC)) - { - ULONG dummySize = 0; - ZwFreeVirtualMemory(NtCurrentProcess(), - (PVOID*)&subheap, - &dummySize, - MEM_RELEASE); - } - subheap = next; - } - return TRUE; -} - - -/*********************************************************************** - * HeapAlloc (KERNEL32.334) - * RETURNS - * Pointer to allocated memory block - * NULL: Failure - * 0x7d030f60--invalid flags in RtlHeapAllocate - * @implemented - */ -PVOID STDCALL -RtlAllocateHeap(HANDLE heap, /* [in] Handle of private heap block */ - ULONG flags, /* [in] Heap allocation control flags */ - ULONG size) /* [in] Number of bytes to allocate */ -{ - ARENA_FREE *pArena; - ARENA_INUSE *pInUse; - SUBHEAP *subheap; - HEAP *heapPtr = HEAP_GetPtr( heap ); - - /* Validate the parameters */ - - if (!heapPtr) - { - if (flags & HEAP_GENERATE_EXCEPTIONS) RtlRaiseStatus( STATUS_NO_MEMORY ); - return NULL; - } - flags &= HEAP_GENERATE_EXCEPTIONS | HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY; - flags |= heapPtr->flags; - if (!(flags & HEAP_NO_SERIALIZE)) RtlEnterCriticalSection( &heapPtr->critSection ); - size = (size + 7) & ~7; - if (size < HEAP_MIN_BLOCK_SIZE) size = HEAP_MIN_BLOCK_SIZE; - - /* Locate a suitable free block */ - - if (!(pArena = HEAP_FindFreeBlock( heapPtr, size, &subheap ))) - { - TRACE("(%08x,%08lx,%08lx): returning NULL\n", - heap, flags, size ); - if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveCriticalSection( &heapPtr->critSection ); - if (flags & HEAP_GENERATE_EXCEPTIONS) RtlRaiseStatus( STATUS_NO_MEMORY ); - return NULL; - } - - /* Remove the arena from the free list */ - - pArena->next->prev = pArena->prev; - pArena->prev->next = pArena->next; - - /* Build the in-use arena */ - - pInUse = (ARENA_INUSE *)pArena; - pInUse->size = (pInUse->size & ~ARENA_FLAG_FREE) - + sizeof(ARENA_FREE) - sizeof(ARENA_INUSE); - pInUse->threadId = (DWORD)NtCurrentTeb()->Cid.UniqueThread; - pInUse->magic = ARENA_INUSE_MAGIC; - - /* Shrink the block */ - - HEAP_ShrinkBlock( subheap, pInUse, size ); - - if (flags & HEAP_ZERO_MEMORY) - memset( pInUse + 1, 0, pInUse->size & ARENA_SIZE_MASK ); - else if (TRACE_ON(heap)) - memset( pInUse + 1, ARENA_INUSE_FILLER, pInUse->size & ARENA_SIZE_MASK ); - - if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveCriticalSection( &heapPtr->critSection ); - - TRACE("(%08x,%08lx,%08lx): returning %08lx\n", - heap, flags, size, (DWORD)(pInUse + 1) ); - return (LPVOID)(pInUse + 1); -} - - -/*********************************************************************** - * HeapFree (KERNEL32.338) - * RETURNS - * TRUE: Success - * FALSE: Failure - * - * @implemented - */ -BOOLEAN STDCALL RtlFreeHeap( - HANDLE heap, /* [in] Handle of heap */ - ULONG flags, /* [in] Heap freeing flags */ - PVOID ptr /* [in] Address of memory to free */ -) { - ARENA_INUSE *pInUse; - SUBHEAP *subheap; - HEAP *heapPtr = HEAP_GetPtr( heap ); - - /* Validate the parameters */ - - if (!heapPtr) return FALSE; - if (!ptr) /* Freeing a NULL ptr is doesn't indicate an error in Win2k */ - { - WARN("(%08x,%08lx,%08lx): asked to free NULL\n", - heap, flags, (DWORD)ptr ); - return TRUE; - } - - flags &= HEAP_NO_SERIALIZE; - flags |= heapPtr->flags; - if (!(flags & HEAP_NO_SERIALIZE)) RtlEnterCriticalSection( &heapPtr->critSection ); - if (!HEAP_IsRealArena( heap, HEAP_NO_SERIALIZE, ptr, QUIET )) - { - if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveCriticalSection( &heapPtr->critSection ); - TRACE("(%08x,%08lx,%08lx): returning FALSE\n", - heap, flags, (DWORD)ptr ); - return FALSE; - } - - /* Turn the block into a free block */ - - pInUse = (ARENA_INUSE *)ptr - 1; - subheap = HEAP_FindSubHeap( heapPtr, pInUse ); - HEAP_MakeInUseBlockFree( subheap, pInUse, heapPtr->flags ); - - if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveCriticalSection( &heapPtr->critSection ); - - TRACE("(%08x,%08lx,%08lx): returning TRUE\n", - heap, flags, (DWORD)ptr ); - return TRUE; -} - - -/*********************************************************************** - * HeapReAlloc (KERNEL32.340) - * RETURNS - * Pointer to reallocated memory block - * NULL: Failure - * 0x7d030f60--invalid flags in RtlHeapAllocate - * @implemented - */ -LPVOID STDCALL RtlReAllocateHeap( - HANDLE heap, /* [in] Handle of heap block */ - DWORD flags, /* [in] Heap reallocation flags */ - LPVOID ptr, /* [in] Address of memory to reallocate */ - DWORD size /* [in] Number of bytes to reallocate */ -) { - ARENA_INUSE *pArena; - DWORD oldSize; - HEAP *heapPtr; - SUBHEAP *subheap; - - if (!ptr) return RtlAllocateHeap( heap, flags, size ); /* FIXME: correct? */ - if (!(heapPtr = HEAP_GetPtr( heap ))) return FALSE; - - /* Validate the parameters */ - - flags &= HEAP_GENERATE_EXCEPTIONS | HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY | - HEAP_REALLOC_IN_PLACE_ONLY; - flags |= heapPtr->flags; - size = (size + 7) & ~7; - if (size < HEAP_MIN_BLOCK_SIZE) size = HEAP_MIN_BLOCK_SIZE; - - if (!(flags & HEAP_NO_SERIALIZE)) RtlEnterCriticalSection( &heapPtr->critSection ); - if (!HEAP_IsRealArena( heap, HEAP_NO_SERIALIZE, ptr, QUIET )) - { - if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveCriticalSection( &heapPtr->critSection ); - TRACE("(%08x,%08lx,%08lx,%08lx): returning NULL\n", - heap, flags, (DWORD)ptr, size ); - if (flags & HEAP_GENERATE_EXCEPTIONS) RtlRaiseStatus( STATUS_NO_MEMORY ); - return NULL; - } - - /* Check if we need to grow the block */ - - pArena = (ARENA_INUSE *)ptr - 1; - pArena->threadId = (DWORD)NtCurrentTeb()->Cid.UniqueThread; - - subheap = HEAP_FindSubHeap( heapPtr, pArena ); - oldSize = (pArena->size & ARENA_SIZE_MASK); - if (size > oldSize) - { - char *pNext = (char *)(pArena + 1) + oldSize; - if ((pNext < (char *)subheap + subheap->size) && - (*(DWORD *)pNext & ARENA_FLAG_FREE) && - (oldSize + (*(DWORD *)pNext & ARENA_SIZE_MASK) + sizeof(ARENA_FREE) >= size)) - { - /* The next block is free and large enough */ - ARENA_FREE *pFree = (ARENA_FREE *)pNext; - pFree->next->prev = pFree->prev; - pFree->prev->next = pFree->next; - pArena->size += (pFree->size & ARENA_SIZE_MASK) + sizeof(*pFree); - if (!HEAP_Commit( subheap, (char *)pArena + sizeof(ARENA_INUSE) - + size + HEAP_MIN_BLOCK_SIZE, - heapPtr->flags)) - { - if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveCriticalSection( &heapPtr->critSection ); - if (flags & HEAP_GENERATE_EXCEPTIONS) RtlRaiseStatus( STATUS_NO_MEMORY ); - return NULL; - } - HEAP_ShrinkBlock( subheap, pArena, size ); - } - else /* Do it the hard way */ - { - ARENA_FREE *pNew; - ARENA_INUSE *pInUse; - SUBHEAP *newsubheap; - - if ((flags & HEAP_REALLOC_IN_PLACE_ONLY) || - !(pNew = HEAP_FindFreeBlock( heapPtr, size, &newsubheap ))) - { - if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveCriticalSection( &heapPtr->critSection ); - if (flags & HEAP_GENERATE_EXCEPTIONS) RtlRaiseStatus( STATUS_NO_MEMORY ); - return NULL; - } - - /* Build the in-use arena */ - - pNew->next->prev = pNew->prev; - pNew->prev->next = pNew->next; - pInUse = (ARENA_INUSE *)pNew; - pInUse->size = (pInUse->size & ~ARENA_FLAG_FREE) - + sizeof(ARENA_FREE) - sizeof(ARENA_INUSE); - pInUse->threadId = (DWORD)NtCurrentTeb()->Cid.UniqueThread; - pInUse->magic = ARENA_INUSE_MAGIC; - HEAP_ShrinkBlock( newsubheap, pInUse, size ); - memcpy( pInUse + 1, pArena + 1, oldSize ); - - /* Free the previous block */ - - HEAP_MakeInUseBlockFree( subheap, pArena, flags ); - subheap = newsubheap; - pArena = pInUse; - } - } - else HEAP_ShrinkBlock( subheap, pArena, size ); /* Shrink the block */ - - /* Clear the extra bytes if needed */ - - if (size > oldSize) - { - if (flags & HEAP_ZERO_MEMORY) - memset( (char *)(pArena + 1) + oldSize, 0, - (pArena->size & ARENA_SIZE_MASK) - oldSize ); - else if (TRACE_ON(heap)) - memset( (char *)(pArena + 1) + oldSize, ARENA_INUSE_FILLER, - (pArena->size & ARENA_SIZE_MASK) - oldSize ); - } - - /* Return the new arena */ - - if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveCriticalSection( &heapPtr->critSection ); - - TRACE("(%08x,%08lx,%08lx,%08lx): returning %08lx\n", - heap, flags, (DWORD)ptr, size, (DWORD)(pArena + 1) ); - return (LPVOID)(pArena + 1); -} - - -/*********************************************************************** - * HeapCompact (KERNEL32.335) - * - * @unimplemented - */ -DWORD STDCALL RtlCompactHeap( HANDLE heap, DWORD flags ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - -/*********************************************************************** - * HeapLock (KERNEL32.339) - * Attempts to acquire the critical section object for a specified heap. - * - * RETURNS - * TRUE: Success - * FALSE: Failure - * - * @implemented - */ -BOOL STDCALL RtlLockHeap( - HANDLE heap /* [in] Handle of heap to lock for exclusive access */ -) { - HEAP *heapPtr = HEAP_GetPtr( heap ); - if (!heapPtr) return FALSE; - RtlEnterCriticalSection( &heapPtr->critSection ); - return TRUE; -} - - -/*********************************************************************** - * HeapUnlock (KERNEL32.342) - * Releases ownership of the critical section object. - * - * RETURNS - * TRUE: Success - * FALSE: Failure - * - * @implemented - */ -BOOL STDCALL RtlUnlockHeap( - HANDLE heap /* [in] Handle to the heap to unlock */ -) { - HEAP *heapPtr = HEAP_GetPtr( heap ); - if (!heapPtr) return FALSE; - RtlLeaveCriticalSection( &heapPtr->critSection ); - return TRUE; -} - - -/*********************************************************************** - * HeapSize (KERNEL32.341) - * RETURNS - * Size in bytes of allocated memory - * 0xffffffff: Failure - * - * @implemented - */ -DWORD STDCALL RtlSizeHeap( - HANDLE heap, /* [in] Handle of heap */ - DWORD flags, /* [in] Heap size control flags */ - LPVOID ptr /* [in] Address of memory to return size for */ -) { - DWORD ret; - HEAP *heapPtr = HEAP_GetPtr( heap ); - - if (!heapPtr) return FALSE; - flags &= HEAP_NO_SERIALIZE; - flags |= heapPtr->flags; - if (!(flags & HEAP_NO_SERIALIZE)) RtlEnterCriticalSection( &heapPtr->critSection ); - if (!HEAP_IsRealArena( heap, HEAP_NO_SERIALIZE, ptr, QUIET )) - { - SetLastError( ERROR_INVALID_PARAMETER ); - ret = 0xffffffff; - } - else - { - ARENA_INUSE *pArena = (ARENA_INUSE *)ptr - 1; - ret = pArena->size & ARENA_SIZE_MASK; - } - if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveCriticalSection( &heapPtr->critSection ); - - TRACE("(%08x,%08lx,%08lx): returning %08lx\n", - heap, flags, (DWORD)ptr, ret ); - return ret; -} - - -/*********************************************************************** - * HeapValidate (KERNEL32.343) - * Validates a specified heap. - * - * NOTES - * Flags is ignored. - * - * RETURNS - * TRUE: Success - * FALSE: Failure - * - * @implemented - */ -BOOL STDCALL RtlValidateHeap( - HANDLE heap, /* [in] Handle to the heap */ - DWORD flags, /* [in] Bit flags that control access during operation */ - PVOID block /* [in] Optional pointer to memory block to validate */ -) { - - HEAP *heapPtr = HEAP_GetPtr( heap ); - if (!heapPtr) return FALSE; - return HEAP_IsRealArena( heapPtr, flags, block, QUIET ); -} - - -/*********************************************************************** - * HeapWalk (KERNEL32.344) - * Enumerates the memory blocks in a specified heap. - * See HEAP_Dump() for info on heap structure. - * - * TODO - * - handling of PROCESS_HEAP_ENTRY_MOVEABLE and - * PROCESS_HEAP_ENTRY_DDESHARE (needs heap.c support) - * - * RETURNS - * TRUE: Success - * FALSE: Failure - */ -#if 0 -BOOL STDCALL HeapWalk( - HANDLE heap, /* [in] Handle to heap to enumerate */ - LPPROCESS_HEAP_ENTRY entry /* [out] Pointer to structure of enumeration info */ -) { - HEAP *heapPtr = HEAP_GetPtr(heap); - SUBHEAP *sub, *currentheap = NULL; - BOOL ret = FALSE; - char *ptr; - int region_index = 0; - - if (!heapPtr || !entry) - { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - - if (!(heapPtr->flags & HEAP_NO_SERIALIZE)) RtlEnterCriticalSection( &heapPtr->critSection ); - - /* set ptr to the next arena to be examined */ - - if (!entry->lpData) /* first call (init) ? */ - { - TRACE("begin walking of heap 0x%08x.\n", heap); - /*HEAP_Dump(heapPtr);*/ - currentheap = &heapPtr->subheap; - ptr = (char*)currentheap + currentheap->headerSize; - } - else - { - ptr = entry->lpData; - sub = &heapPtr->subheap; - while (sub) - { - if (((char *)ptr >= (char *)sub) && - ((char *)ptr < (char *)sub + sub->size)) - { - currentheap = sub; - break; - } - sub = sub->next; - region_index++; - } - if (currentheap == NULL) - { - ERR("no matching subheap found, shouldn't happen !\n"); - SetLastError(ERROR_NO_MORE_ITEMS); - goto HW_end; - } - - ptr += entry->cbData; /* point to next arena */ - if (ptr > (char *)currentheap + currentheap->size - 1) - { /* proceed with next subheap */ - if (!(currentheap = currentheap->next)) - { /* successfully finished */ - TRACE("end reached.\n"); - SetLastError(ERROR_NO_MORE_ITEMS); - goto HW_end; - } - ptr = (char*)currentheap + currentheap->headerSize; - } - } - - entry->wFlags = 0; - if (*(DWORD *)ptr & ARENA_FLAG_FREE) - { - ARENA_FREE *pArena = (ARENA_FREE *)ptr; - - /*TRACE("free, magic: %04x\n", pArena->magic);*/ - - entry->lpData = pArena + 1; - entry->cbData = pArena->size & ARENA_SIZE_MASK; - entry->cbOverhead = sizeof(ARENA_FREE); - entry->wFlags = PROCESS_HEAP_UNCOMMITTED_RANGE; - } - else - { - ARENA_INUSE *pArena = (ARENA_INUSE *)ptr; - - /*TRACE("busy, magic: %04x\n", pArena->magic);*/ - - entry->lpData = pArena + 1; - entry->cbData = pArena->size & ARENA_SIZE_MASK; - entry->cbOverhead = sizeof(ARENA_INUSE); - entry->wFlags = PROCESS_HEAP_ENTRY_BUSY; - /* FIXME: can't handle PROCESS_HEAP_ENTRY_MOVEABLE - and PROCESS_HEAP_ENTRY_DDESHARE yet */ - } - - entry->iRegionIndex = region_index; - - /* first element of heap ? */ - if (ptr == (char *)(currentheap + currentheap->headerSize)) - { - entry->wFlags |= PROCESS_HEAP_REGION; - entry->Foo.Region.dwCommittedSize = currentheap->commitSize; - entry->Foo.Region.dwUnCommittedSize = - currentheap->size - currentheap->commitSize; - entry->Foo.Region.lpFirstBlock = /* first valid block */ - currentheap + currentheap->headerSize; - entry->Foo.Region.lpLastBlock = /* first invalid block */ - currentheap + currentheap->size; - } - ret = TRUE; - -HW_end: - if (!(heapPtr->flags & HEAP_NO_SERIALIZE)) RtlLeaveCriticalSection( &heapPtr->critSection ); - - return ret; -} -#endif - -VOID -RtlInitializeHeapManager(VOID) -{ - PPEB Peb; - - Peb = NtCurrentPeb(); - - Peb->NumberOfHeaps = 0; - Peb->MaximumNumberOfHeaps = (PAGE_SIZE - sizeof(PEB)) / sizeof(HANDLE); - Peb->ProcessHeaps = (PVOID)Peb + sizeof(PEB); - - RtlInitializeCriticalSection(&RtlpProcessHeapsListLock); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlEnumProcessHeaps(DWORD STDCALL_FUNC(*func)(void*,LONG), - LONG lParam) -{ - NTSTATUS Status = STATUS_SUCCESS; - ULONG i; - - RtlEnterCriticalSection(&RtlpProcessHeapsListLock); - - for (i = 0; i < NtCurrentPeb()->NumberOfHeaps; i++) - { - Status = func(NtCurrentPeb()->ProcessHeaps[i],lParam); - if (!NT_SUCCESS(Status)) - break; - } - - RtlLeaveCriticalSection(&RtlpProcessHeapsListLock); - - return Status; -} - - -/* - * @implemented - */ -ULONG STDCALL -RtlGetProcessHeaps(ULONG HeapCount, - HANDLE *HeapArray) -{ - ULONG Result = 0; - - RtlEnterCriticalSection(&RtlpProcessHeapsListLock); - - if (NtCurrentPeb()->NumberOfHeaps <= HeapCount) - { - Result = NtCurrentPeb()->NumberOfHeaps; - memmove(HeapArray, - NtCurrentPeb()->ProcessHeaps, - Result * sizeof(HANDLE)); - } - - RtlLeaveCriticalSection (&RtlpProcessHeapsListLock); - - return Result; -} - - -/* - * @implemented - */ -BOOLEAN STDCALL -RtlValidateProcessHeaps(VOID) -{ - HANDLE Heaps[128]; - BOOLEAN Result = TRUE; - ULONG HeapCount; - ULONG i; - - HeapCount = RtlGetProcessHeaps(128, Heaps); - for (i = 0; i < HeapCount; i++) - { - if (!RtlValidateHeap(Heaps[i], 0, NULL)) - Result = FALSE; - } - - return Result; -} - -/* EOF */ diff --git a/reactos/lib/ntdll/rtl/largeint.c b/reactos/lib/ntdll/rtl/largeint.c deleted file mode 100644 index 065fba7831d..00000000000 --- a/reactos/lib/ntdll/rtl/largeint.c +++ /dev/null @@ -1,356 +0,0 @@ -/* $Id: largeint.c,v 1.12 2003/07/11 13:50:23 royce Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: lib/ntdll/rtl/largeint.c - * PURPOSE: Large integer operations - * UPDATE HISTORY: - * Created 22/05/98 - * 08/30/98 RJJ Implemented several functions - */ - -/* INCLUDES *****************************************************************/ - -#include <ddk/ntddk.h> - -#define NDEBUG -#include <ntdll/ntdll.h> - - -/* FUNCTIONS *****************************************************************/ - -/* - * @implemented - */ -LARGE_INTEGER -STDCALL -RtlConvertLongToLargeInteger ( - LONG SignedInteger - ) -{ - LARGE_INTEGER RC; - - RC.QuadPart = SignedInteger; - - return RC; -} - -/* - * @implemented - */ -LARGE_INTEGER -STDCALL -RtlConvertUlongToLargeInteger ( - ULONG UnsignedInteger - ) -{ - LARGE_INTEGER RC; - - RC.QuadPart = UnsignedInteger; - - return RC; -} - -/* - * @implemented - */ -LARGE_INTEGER -STDCALL -RtlEnlargedIntegerMultiply ( - LONG Multiplicand, - LONG Multiplier - ) -{ - LARGE_INTEGER RC; - - RC.QuadPart = (LONGLONG) Multiplicand * Multiplier; - - return RC; -} - -/* - * @implemented - */ -ULONG -STDCALL -RtlEnlargedUnsignedDivide ( - ULARGE_INTEGER Dividend, - ULONG Divisor, - PULONG Remainder - ) -{ - if (Remainder) - *Remainder = Dividend.QuadPart % Divisor; - - return (ULONG)(Dividend.QuadPart / Divisor); -} - -/* - * @implemented - */ -LARGE_INTEGER -STDCALL -RtlEnlargedUnsignedMultiply ( - ULONG Multiplicand, - ULONG Multiplier - ) -{ - LARGE_INTEGER RC; - - RC.QuadPart = (ULONGLONG) Multiplicand * Multiplier; - - return RC; -} - -/* - * @implemented - */ -LARGE_INTEGER -STDCALL -RtlExtendedIntegerMultiply ( - LARGE_INTEGER Multiplicand, - LONG Multiplier - ) -{ - LARGE_INTEGER RC; - - RC.QuadPart = Multiplicand.QuadPart * Multiplier; - - return RC; -} - -/* - * @implemented - */ -LARGE_INTEGER -STDCALL -RtlExtendedLargeIntegerDivide ( - LARGE_INTEGER Dividend, - ULONG Divisor, - PULONG Remainder - ) -{ - LARGE_INTEGER RC; - - if (Remainder) - *Remainder = Dividend.QuadPart % Divisor; - - RC.QuadPart = Dividend.QuadPart / Divisor; - - return RC; -} - - -/****************************************************************************** - * RtlExtendedMagicDivide - * - * Allows replacing a division by a longlong constant with a multiplication by - * the inverse constant. - * - * RETURNS - * (Dividend * MagicDivisor) >> (64 + ShiftCount) - * - * NOTES - * If the divisor of a division is constant, the constants MagicDivisor and - * shift must be chosen such that - * MagicDivisor = 2^(64 + ShiftCount) / Divisor. - * - * Then we have RtlExtendedMagicDivide(Dividend,MagicDivisor,ShiftCount) == - * Dividend * MagicDivisor / 2^(64 + ShiftCount) == Dividend / Divisor. - * - * The Parameter MagicDivisor although defined as LONGLONG is used as - * ULONGLONG. - */ - -#define LOWER_32(A) ((A) & 0xffffffff) -#define UPPER_32(A) ((A) >> 32) - -/* - * @implemented - */ -LARGE_INTEGER STDCALL -RtlExtendedMagicDivide (LARGE_INTEGER Dividend, - LARGE_INTEGER MagicDivisor, - CCHAR ShiftCount) -{ - ULONGLONG dividend_high; - ULONGLONG dividend_low; - ULONGLONG inverse_divisor_high; - ULONGLONG inverse_divisor_low; - ULONGLONG ah_bl; - ULONGLONG al_bh; - LARGE_INTEGER result; - BOOLEAN positive; - - if (Dividend.QuadPart < 0) - { - dividend_high = UPPER_32((ULONGLONG) -Dividend.QuadPart); - dividend_low = LOWER_32((ULONGLONG) -Dividend.QuadPart); - positive = FALSE; - } - else - { - dividend_high = UPPER_32((ULONGLONG) Dividend.QuadPart); - dividend_low = LOWER_32((ULONGLONG) Dividend.QuadPart); - positive = TRUE; - } - inverse_divisor_high = UPPER_32((ULONGLONG) MagicDivisor.QuadPart); - inverse_divisor_low = LOWER_32((ULONGLONG) MagicDivisor.QuadPart); - - ah_bl = dividend_high * inverse_divisor_low; - al_bh = dividend_low * inverse_divisor_high; - - result.QuadPart = - (LONGLONG) ((dividend_high * inverse_divisor_high + - UPPER_32(ah_bl) + - UPPER_32(al_bh) + - UPPER_32(LOWER_32(ah_bl) + LOWER_32(al_bh) + - UPPER_32(dividend_low * inverse_divisor_low))) >> ShiftCount); - if (!positive) - { - result.QuadPart = -result.QuadPart; - } - - return result; -} - - -/* - * @implemented - */ -LARGE_INTEGER -STDCALL -RtlLargeIntegerAdd ( - LARGE_INTEGER Addend1, - LARGE_INTEGER Addend2 - ) -{ - LARGE_INTEGER RC; - - RC.QuadPart = Addend1.QuadPart + Addend2.QuadPart; - - return RC; -} - -/* - * @implemented - */ -LARGE_INTEGER -STDCALL -RtlLargeIntegerArithmeticShift ( - LARGE_INTEGER LargeInteger, - CCHAR ShiftCount - ) -{ - LARGE_INTEGER RC; - CHAR Shift; - - Shift = ShiftCount % 64; - - if (Shift < 32) - { - RC.QuadPart = LargeInteger.QuadPart >> Shift; - } - else - { - /* copy the sign bit */ - RC.u.HighPart |= (LargeInteger.u.HighPart & 0x80000000); - RC.u.LowPart = LargeInteger.u.HighPart >> Shift; - } - - return RC; -} - -/* - * @implemented - */ -LARGE_INTEGER -STDCALL -RtlLargeIntegerDivide ( - LARGE_INTEGER Dividend, - LARGE_INTEGER Divisor, - PLARGE_INTEGER Remainder - ) -{ - LARGE_INTEGER RC; - - if (Remainder) - Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart; - - RC.QuadPart = Dividend.QuadPart / Divisor.QuadPart; - - return RC; -} - -/* - * @implemented - */ -LARGE_INTEGER -STDCALL -RtlLargeIntegerNegate ( - LARGE_INTEGER Subtrahend - ) -{ - LARGE_INTEGER RC; - - RC.QuadPart = - Subtrahend.QuadPart; - - return RC; -} - -/* - * @implemented - */ -LARGE_INTEGER -STDCALL -RtlLargeIntegerShiftLeft ( - LARGE_INTEGER LargeInteger, - CCHAR ShiftCount - ) -{ - LARGE_INTEGER RC; - CCHAR Shift; - - Shift = ShiftCount % 64; - RC.QuadPart = LargeInteger.QuadPart << Shift; - - return RC; -} - -/* - * @implemented - */ -LARGE_INTEGER -STDCALL -RtlLargeIntegerShiftRight ( - LARGE_INTEGER LargeInteger, - CCHAR ShiftCount - ) -{ - LARGE_INTEGER RC; - CCHAR Shift; - - Shift = ShiftCount % 64; - RC.QuadPart = LargeInteger.QuadPart >> Shift; - - return RC; -} - -/* - * @implemented - */ -LARGE_INTEGER -STDCALL -RtlLargeIntegerSubtract ( - LARGE_INTEGER Minuend, - LARGE_INTEGER Subtrahend - ) -{ - LARGE_INTEGER RC; - - RC.QuadPart = Minuend.QuadPart - Subtrahend.QuadPart; - - return RC; -} - -/* EOF */ diff --git a/reactos/lib/ntdll/rtl/luid.c b/reactos/lib/ntdll/rtl/luid.c deleted file mode 100644 index 26fb15afdd5..00000000000 --- a/reactos/lib/ntdll/rtl/luid.c +++ /dev/null @@ -1,58 +0,0 @@ -/* $Id: luid.c,v 1.7 2003/07/11 13:50:23 royce Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * PURPOSE: Locally unique identifier (LUID) helper functions - * FILE: lib/ntdll/rtl/luid.c - * PROGRAMER: Eric Kohl <ekohl@zr-online.de> - * REVISION HISTORY: - * 15/04/2000: Created - */ - -/* INCLUDES *****************************************************************/ - -#include <ddk/ntddk.h> - - -/* FUNCTIONS *****************************************************************/ - -VOID STDCALL -RtlCopyLuid(PLUID LuidDest, - PLUID LuidSrc) -{ - LuidDest->LowPart = LuidSrc->LowPart; - LuidDest->HighPart = LuidSrc->HighPart; -} - - -/* - * @implemented - */ -VOID STDCALL -RtlCopyLuidAndAttributesArray(ULONG Count, - PLUID_AND_ATTRIBUTES Src, - PLUID_AND_ATTRIBUTES Dest) -{ - ULONG i; - - for (i = 0; i < Count; i++) - { - RtlCopyMemory(&Dest[i], - &Src[i], - sizeof(LUID_AND_ATTRIBUTES)); - } -} - - -/* - * @implemented - */ -BOOLEAN STDCALL -RtlEqualLuid(PLUID Luid1, - PLUID Luid2) -{ - return (Luid1->LowPart == Luid2->LowPart && - Luid1->HighPart == Luid2->HighPart); -} - -/* EOF */ diff --git a/reactos/lib/ntdll/rtl/mem.c b/reactos/lib/ntdll/rtl/mem.c deleted file mode 100644 index 9bba7a4e1ba..00000000000 --- a/reactos/lib/ntdll/rtl/mem.c +++ /dev/null @@ -1,235 +0,0 @@ -/* $Id: mem.c,v 1.14 2003/11/17 20:35:46 sedwards Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: kernel/rtl/mem.c - * PURPOSE: Memory functions - * PROGRAMMER: David Welch (welch@mcmail.com) - * UPDATE HISTORY: - * Created 22/05/98 - */ - -/* INCLUDES *****************************************************************/ - -#include <ddk/ntddk.h> -#include <string.h> - -/* FUNCTIONS *****************************************************************/ - -/****************************************************************************** - * RtlCompareMemory [NTDLL.@] - * - * Compare one block of memory with another - * - * PARAMS - * Source1 [I] Source block - * Source2 [I] Block to compare to Source1 - * Length [I] Number of bytes to fill - * - * RETURNS - * The length of the first byte at which Source1 and Source2 differ, or Length - * if they are the same. - * - * @implemented - */ -ULONG -STDCALL -RtlCompareMemory(PVOID Source1, - PVOID Source2, - ULONG Length) -{ - SIZE_T i; - for(i=0; (i<Length) && (((LPBYTE)Source1)[i]==((LPBYTE)Source2)[i]); i++); - return i; -} - -/* - * @implemented - */ -ULONG -STDCALL -RtlCompareMemoryUlong ( - PVOID Source, - ULONG Length, - ULONG Value - ) -/* - * FUNCTION: Compares a block of ULONGs with an ULONG and returns the number of equal bytes - * ARGUMENTS: - * Source = Block to compare - * Length = Number of bytes to compare - * Value = Value to compare - * RETURNS: Number of equal bytes - */ -{ - PULONG ptr = (PULONG)Source; - ULONG len = Length / sizeof(ULONG); - int i; - - for (i = 0; i < len; i++) - { - if (*ptr != Value) - break; - ptr++; - } - - return (ULONG)((PCHAR)ptr - (PCHAR)Source); -} - -#if 0 -VOID RtlCopyBytes(PVOID Destination, - CONST VOID* Source, - ULONG Length) -{ - RtlCopyMemory(Destination,Source,Length); -} - -VOID RtlCopyMemory(VOID* Destination, CONST VOID* Source, ULONG Length) -{ - DPRINT("RtlCopyMemory(Destination %x Source %x Length %d\n", - Destination,Source,Length); - memcpy(Destination,Source,Length); - DPRINT("*Destination %x\n",*(PULONG)Destination); -} -#endif - -/* - * @implemented - */ -VOID -STDCALL -RtlFillMemory ( - PVOID Destination, - ULONG Length, - UCHAR Fill - ) -{ - memset(Destination, Fill, Length); -} - -/* - * @implemented - */ -VOID -STDCALL -RtlFillMemoryUlong ( - PVOID Destination, - ULONG Length, - ULONG Fill - ) -{ - PULONG Dest = Destination; - ULONG Count = Length / sizeof(ULONG); - - while (Count > 0) - { - *Dest = Fill; - Dest++; - Count--; - } -} - - -/* - * @implemented - */ -VOID -STDCALL -RtlMoveMemory ( - PVOID Destination, - CONST VOID * Source, - ULONG Length - ) -{ - memmove ( - Destination, - Source, - Length - ); -} - - -/* - * @implemented - */ -VOID -STDCALL -RtlZeroMemory ( - PVOID Destination, - ULONG Length - ) -{ - RtlFillMemory ( - Destination, - Length, - 0 - ); -} - -/************************************************************************* - * RtlUshortByteSwap [NTDLL.@] - * - * Swap the bytes of an unsigned short value. - * - * NOTES - * Based on the inline versions in Wine winternl.h - * - * @implemented - */ -USHORT -FASTCALL -RtlUshortByteSwap( - IN USHORT Source - ) -{ - return (Source >> 8) | (Source << 8); -} - -/************************************************************************* - * RtlUlongByteSwap [NTDLL.@] - * - * Swap the bytes of an unsigned int value. - * - * NOTES - * Based on the inline versions in Wine winternl.h - * - * @implemented - */ -ULONG -FASTCALL -RtlUlongByteSwap( - IN ULONG Source - ) -{ -#if defined(__i386__) && defined(__GNUC__) - ULONG ret; - __asm__("bswap %0" : "=r" (ret) : "0" (Source) ); - return ret; -#else - return ((ULONG)RtlUshortByteSwap((USHORT)Source) << 16) | RtlUshortByteSwap((USHORT)(Source >> 16)); -#endif -} - -/************************************************************************* - * RtlUlonglongByteSwap [NTDLL.@] - * - * Swap the bytes of an unsigned long long value. - * - * PARAMS - * i [I] Value to swap bytes of - * - * RETURNS - * The value with its bytes swapped. - * - * @implemented - */ -ULONGLONG -FASTCALL -RtlUlonglongByteSwap( - IN ULONGLONG Source - ) -{ - return ((ULONGLONG)RtlUlongByteSwap(Source) << 32) | RtlUlongByteSwap(Source>>32); -} - -/* EOF */ diff --git a/reactos/lib/ntdll/rtl/nls.c b/reactos/lib/ntdll/rtl/nls.c deleted file mode 100644 index bdc8663d87f..00000000000 --- a/reactos/lib/ntdll/rtl/nls.c +++ /dev/null @@ -1,702 +0,0 @@ -/* $Id: nls.c,v 1.16 2004/02/01 20:48:06 ekohl Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: lib/ntdll/rtl/nls.c - * PURPOSE: National Language Support (NLS) functions - * UPDATE HISTORY: - * 20/08/99 Created by Emanuele Aliberti - * 10/11/99 Added translation functions. - * - * TODO: - * 1) Add multi-byte translation code. - */ - -#include <ddk/ntddk.h> - -#define NDEBUG -#include <debug.h> - - -/* GLOBALS *******************************************************************/ - -USHORT NlsAnsiCodePage = 0; /* exported */ -BOOLEAN NlsMbCodePageTag = FALSE; /* exported */ -PWCHAR NlsAnsiToUnicodeTable = NULL; -PCHAR NlsUnicodeToAnsiTable = NULL; -PUSHORT NlsLeadByteInfo = NULL; - - -USHORT NlsOemCodePage = 0; -BOOLEAN NlsMbOemCodePageTag = FALSE; /* exported */ -PWCHAR NlsOemToUnicodeTable = NULL; -PCHAR NlsUnicodeToOemTable = NULL; -PUSHORT NlsOemLeadByteInfo = NULL; - - -PUSHORT NlsUnicodeUpcaseTable = NULL; -PUSHORT NlsUnicodeLowercaseTable = NULL; - - -/* FUNCTIONS *****************************************************************/ - -/* - * RtlConsoleMultiByteToUnicodeN@24 - */ - - -NTSTATUS STDCALL -RtlCustomCPToUnicodeN(IN PCPTABLEINFO CustomCP, - PWCHAR UnicodeString, - ULONG UnicodeSize, - PULONG ResultSize, - PCHAR CustomString, - ULONG CustomSize) -{ - ULONG Size = 0; - ULONG i; - - if (CustomCP->DBCSCodePage == 0) - { - /* single-byte code page */ - if (CustomSize > (UnicodeSize / sizeof(WCHAR))) - Size = UnicodeSize / sizeof(WCHAR); - else - Size = CustomSize; - - if (ResultSize != NULL) - *ResultSize = Size * sizeof(WCHAR); - - for (i = 0; i < Size; i++) - { - *UnicodeString = CustomCP->MultiByteTable[(int)*CustomString]; - UnicodeString++; - CustomString++; - } - } - else - { - /* multi-byte code page */ - /* FIXME */ - assert(FALSE); - } - - return STATUS_SUCCESS; -} - - -WCHAR STDCALL -RtlDowncaseUnicodeChar (IN WCHAR Source) -{ - USHORT Offset; - - if (Source < L'A') - return Source; - - if (Source <= L'Z') - return Source + (L'a' - L'A'); - - if (Source < 0x80) - return Source; - - Offset = ((USHORT)Source >> 8); - DPRINT("Offset: %hx\n", Offset); - - Offset = NlsUnicodeLowercaseTable[Offset]; - DPRINT("Offset: %hx\n", Offset); - - Offset += (((USHORT)Source & 0x00F0) >> 4); - DPRINT("Offset: %hx\n", Offset); - - Offset = NlsUnicodeLowercaseTable[Offset]; - DPRINT("Offset: %hx\n", Offset); - - Offset += ((USHORT)Source & 0x000F); - DPRINT("Offset: %hx\n", Offset); - - Offset = NlsUnicodeLowercaseTable[Offset]; - DPRINT("Offset: %hx\n", Offset); - - DPRINT("Result: %hx\n", Source + (SHORT)Offset); - - return Source + (SHORT)Offset; -} - - -VOID STDCALL -RtlGetDefaultCodePage(OUT PUSHORT AnsiCodePage, - OUT PUSHORT OemCodePage) -{ - *AnsiCodePage = NlsAnsiCodePage; - *OemCodePage = NlsOemCodePage; -} - - -/* - * @implemented - */ -VOID STDCALL -RtlInitCodePageTable(IN PUSHORT TableBase, - OUT PCPTABLEINFO CodePageTable) -{ - PNLS_FILE_HEADER NlsFileHeader; - PUSHORT Ptr; - USHORT Offset; - - DPRINT("RtlInitCodePageTable() called\n"); - - NlsFileHeader = (PNLS_FILE_HEADER)TableBase; - - CodePageTable->CodePage = NlsFileHeader->CodePage; - CodePageTable->MaximumCharacterSize = NlsFileHeader->MaximumCharacterSize; - CodePageTable->DefaultChar = NlsFileHeader->DefaultChar; - CodePageTable->UniDefaultChar = NlsFileHeader->UniDefaultChar; - CodePageTable->TransDefaultChar = NlsFileHeader->TransDefaultChar; - CodePageTable->TransUniDefaultChar = NlsFileHeader->TransUniDefaultChar; - - RtlCopyMemory(&CodePageTable->LeadByte, - &NlsFileHeader->LeadByte, - MAXIMUM_LEADBYTES); - - /* Set Pointer to start of multi byte table */ - Ptr = (PUSHORT)((ULONG_PTR)TableBase + 2 * NlsFileHeader->HeaderSize); - - /* Get offset to the wide char table */ - Offset = (USHORT)(*Ptr++) + NlsFileHeader->HeaderSize + 1; - - /* Set pointer to the multi byte table */ - CodePageTable->MultiByteTable = Ptr; - - /* Skip ANSI and OEM table */ - Ptr += 256; - if (*Ptr++) - Ptr += 256; - - /* Set pointer to DBCS ranges */ - CodePageTable->DBCSRanges = (PUSHORT)Ptr; - - if (*Ptr > 0) - { - CodePageTable->DBCSCodePage = 1; - CodePageTable->DBCSOffsets = (PUSHORT)++Ptr; - } - else - { - CodePageTable->DBCSCodePage = 0; - CodePageTable->DBCSOffsets = 0; - } - - CodePageTable->WideCharTable = (PVOID)((ULONG_PTR)TableBase + 2 * Offset); -} - - -/* - * @implemented - */ -VOID STDCALL -RtlInitNlsTables(IN PUSHORT AnsiTableBase, - IN PUSHORT OemTableBase, - IN PUSHORT CaseTableBase, - OUT PNLSTABLEINFO NlsTable) -{ - DPRINT("RtlInitNlsTables()called\n"); - - if (AnsiTableBase == NULL || - OemTableBase == NULL || - CaseTableBase == NULL) - return; - - RtlInitCodePageTable (AnsiTableBase, - &NlsTable->AnsiTableInfo); - - RtlInitCodePageTable (OemTableBase, - &NlsTable->OemTableInfo); - - NlsTable->UpperCaseTable = (PUSHORT)CaseTableBase + 2; - NlsTable->LowerCaseTable = (PUSHORT)CaseTableBase + *((PUSHORT)CaseTableBase + 1) + 2; -} - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlMultiByteToUnicodeN (IN OUT PWCHAR UnicodeString, - IN ULONG UnicodeSize, - OUT PULONG ResultSize, - IN PCHAR MbString, - IN ULONG MbSize) -{ - ULONG Size = 0; - ULONG i; - - if (NlsMbCodePageTag == FALSE) - { - /* single-byte code page */ - if (MbSize > (UnicodeSize / sizeof(WCHAR))) - Size = UnicodeSize / sizeof(WCHAR); - else - Size = MbSize; - - if (ResultSize != NULL) - *ResultSize = Size * sizeof(WCHAR); - - for (i = 0; i < Size; i++) - { - *UnicodeString = NlsAnsiToUnicodeTable[*((unsigned char *) MbString)]; - UnicodeString++; - MbString++; - } - } - else - { - /* multi-byte code page */ - /* FIXME */ - assert(FALSE); - } - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlMultiByteToUnicodeSize (OUT PULONG UnicodeSize, - IN PCHAR MbString, - IN ULONG MbSize) -{ - if (NlsMbCodePageTag == FALSE) - { - /* single-byte code page */ - *UnicodeSize = MbSize * sizeof (WCHAR); - } - else - { - /* multi-byte code page */ - /* FIXME */ - assert(FALSE); - } - - return STATUS_SUCCESS; -} - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlOemToUnicodeN (PWCHAR UnicodeString, - ULONG UnicodeSize, - PULONG ResultSize, - PCHAR OemString, - ULONG OemSize) -{ - ULONG Size = 0; - ULONG i; - - if (NlsMbOemCodePageTag == FALSE) - { - /* single-byte code page */ - if (OemSize > (UnicodeSize / sizeof(WCHAR))) - Size = UnicodeSize / sizeof(WCHAR); - else - Size = OemSize; - - if (ResultSize != NULL) - *ResultSize = Size * sizeof(WCHAR); - - for (i = 0; i < Size; i++) - { - *UnicodeString = NlsOemToUnicodeTable[(INT)*OemString]; - UnicodeString++; - OemString++; - } - } - else - { - /* multi-byte code page */ - /* FIXME */ - assert(FALSE); - } - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -VOID STDCALL -RtlResetRtlTranslations(IN PNLSTABLEINFO NlsTable) -{ - DPRINT("RtlResetRtlTranslations() called\n"); - - /* Set ANSI data */ - NlsAnsiToUnicodeTable = NlsTable->AnsiTableInfo.MultiByteTable; - NlsUnicodeToAnsiTable = NlsTable->AnsiTableInfo.WideCharTable; - NlsMbCodePageTag = (NlsTable->AnsiTableInfo.DBCSCodePage != 0); - NlsLeadByteInfo = NlsTable->AnsiTableInfo.DBCSOffsets; - NlsAnsiCodePage = NlsTable->AnsiTableInfo.CodePage; - DPRINT("Ansi codepage %hu\n", NlsAnsiCodePage); - - /* Set OEM data */ - NlsOemToUnicodeTable = NlsTable->OemTableInfo.MultiByteTable; - NlsUnicodeToOemTable = NlsTable->OemTableInfo.WideCharTable; - NlsMbOemCodePageTag = (NlsTable->OemTableInfo.DBCSCodePage != 0); - NlsOemLeadByteInfo = NlsTable->OemTableInfo.DBCSOffsets; - NlsOemCodePage = NlsTable->OemTableInfo.CodePage; - DPRINT("Oem codepage %hu\n", NlsOemCodePage); - - /* Set Unicode case map data */ - NlsUnicodeUpcaseTable = NlsTable->UpperCaseTable; - NlsUnicodeLowercaseTable = NlsTable->LowerCaseTable; -} - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlUnicodeToCustomCPN(IN PCPTABLEINFO CustomCP, - PCHAR CustomString, - ULONG CustomSize, - PULONG ResultSize, - PWCHAR UnicodeString, - ULONG UnicodeSize) -{ - ULONG Size = 0; - ULONG i; - - if (CustomCP->DBCSCodePage == 0) - { - /* single-byte code page */ - if (UnicodeSize > (CustomSize * sizeof(WCHAR))) - Size = CustomSize; - else - Size = UnicodeSize / sizeof(WCHAR); - - if (ResultSize != NULL) - *ResultSize = Size; - - for (i = 0; i < Size; i++) - { - *CustomString = ((PCHAR)CustomCP->WideCharTable)[*UnicodeString]; - CustomString++; - UnicodeString++; - } - } - else - { - /* multi-byte code page */ - /* FIXME */ - assert(FALSE); - } - - return STATUS_SUCCESS; -} - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlUnicodeToMultiByteN (PCHAR MbString, - ULONG MbSize, - PULONG ResultSize, - PWCHAR UnicodeString, - ULONG UnicodeSize) -{ - ULONG Size = 0; - ULONG i; - - if (NlsMbCodePageTag == FALSE) - { - /* single-byte code page */ - if (UnicodeSize > (MbSize * sizeof(WCHAR))) - Size = MbSize; - else - Size = UnicodeSize / sizeof(WCHAR); - - if (ResultSize != NULL) - *ResultSize = Size; - - for (i = 0; i < Size; i++) - { - *MbString = NlsUnicodeToAnsiTable[*UnicodeString]; - MbString++; - UnicodeString++; - } - } - else - { - /* multi-byte code page */ - /* FIXME */ - assert(FALSE); - } - - return STATUS_SUCCESS; -} - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlUnicodeToMultiByteSize (PULONG MbSize, - PWCHAR UnicodeString, - ULONG UnicodeSize) -{ - if (NlsMbCodePageTag == FALSE) - { - /* single-byte code page */ - *MbSize = UnicodeSize / sizeof (WCHAR); - } - else - { - /* multi-byte code page */ - /* FIXME */ - *MbSize = 0; - assert(FALSE); - } - - return STATUS_SUCCESS; -} - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlUnicodeToOemN (PCHAR OemString, - ULONG OemSize, - PULONG ResultSize, - PWCHAR UnicodeString, - ULONG UnicodeSize) -{ - ULONG Size = 0; - ULONG i; - - if (NlsMbOemCodePageTag == FALSE) - { - /* single-byte code page */ - if (UnicodeSize > (OemSize * sizeof(WCHAR))) - Size = OemSize; - else - Size = UnicodeSize / sizeof(WCHAR); - - if (ResultSize != NULL) - *ResultSize = Size; - - for (i = 0; i < Size; i++) - { - *OemString = NlsUnicodeToOemTable[*UnicodeString]; - OemString++; - UnicodeString++; - } - } - else - { - /* multi-byte code page */ - /* FIXME */ - assert(FALSE); - } - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -WCHAR STDCALL -RtlUpcaseUnicodeChar(IN WCHAR Source) -{ - USHORT Offset; - - if (Source < L'a') - return Source; - - if (Source <= L'z') - return (Source - (L'a' - L'A')); - - Offset = ((USHORT)Source >> 8); - Offset = NlsUnicodeUpcaseTable[Offset]; - - Offset += (((USHORT)Source & 0x00F0) >> 4); - Offset = NlsUnicodeUpcaseTable[Offset]; - - Offset += ((USHORT)Source & 0x000F); - Offset = NlsUnicodeUpcaseTable[Offset]; - - return Source + (SHORT)Offset; -} - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlUpcaseUnicodeToCustomCPN (IN PCPTABLEINFO CustomCP, - PCHAR CustomString, - ULONG CustomSize, - PULONG ResultSize, - PWCHAR UnicodeString, - ULONG UnicodeSize) -{ - WCHAR UpcaseChar; - ULONG Size = 0; - ULONG i; - - if (CustomCP->DBCSCodePage == 0) - { - /* single-byte code page */ - if (UnicodeSize > (CustomSize * sizeof(WCHAR))) - Size = CustomSize; - else - Size = UnicodeSize / sizeof(WCHAR); - - if (ResultSize != NULL) - *ResultSize = Size; - - for (i = 0; i < Size; i++) - { - UpcaseChar = RtlUpcaseUnicodeChar(*UnicodeString); - *CustomString = ((PCHAR)CustomCP->WideCharTable)[UpcaseChar]; - CustomString++; - UnicodeString++; - } - } - else - { - /* multi-byte code page */ - /* FIXME */ - assert(FALSE); - } - - return STATUS_SUCCESS; -} - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlUpcaseUnicodeToMultiByteN (PCHAR MbString, - ULONG MbSize, - PULONG ResultSize, - PWCHAR UnicodeString, - ULONG UnicodeSize) -{ - WCHAR UpcaseChar; - ULONG Size = 0; - ULONG i; - - if (NlsMbCodePageTag == FALSE) - { - /* single-byte code page */ - if (UnicodeSize > (MbSize * sizeof(WCHAR))) - Size = MbSize; - else - Size = UnicodeSize / sizeof(WCHAR); - - if (ResultSize != NULL) - *ResultSize = Size; - - for (i = 0; i < Size; i++) - { - UpcaseChar = RtlUpcaseUnicodeChar(*UnicodeString); - *MbString = NlsUnicodeToAnsiTable[UpcaseChar]; - MbString++; - UnicodeString++; - } - } - else - { - /* multi-byte code page */ - /* FIXME */ - assert(FALSE); - } - - return STATUS_SUCCESS; -} - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlUpcaseUnicodeToOemN (PCHAR OemString, - ULONG OemSize, - PULONG ResultSize, - PWCHAR UnicodeString, - ULONG UnicodeSize) -{ - WCHAR UpcaseChar; - ULONG Size = 0; - ULONG i; - - if (NlsMbOemCodePageTag == FALSE) - { - /* single-byte code page */ - if (UnicodeSize > (OemSize * sizeof(WCHAR))) - Size = OemSize; - else - Size = UnicodeSize / sizeof(WCHAR); - - if (ResultSize != NULL) - *ResultSize = Size; - - for (i = 0; i < Size; i++) - { - UpcaseChar = RtlUpcaseUnicodeChar(*UnicodeString); - *OemString = NlsUnicodeToOemTable[UpcaseChar]; - OemString++; - UnicodeString++; - } - } - else - { - /* multi-byte code page */ - /* FIXME */ - assert(FALSE); - } - - return STATUS_SUCCESS; -} - - -/* - * @unimplemented - */ -CHAR STDCALL -RtlUpperChar (IN CHAR Source) -{ - WCHAR Unicode; - CHAR Destination; - - if (NlsMbCodePageTag == FALSE) - { - /* single-byte code page */ - - /* ansi->unicode */ - Unicode = NlsAnsiToUnicodeTable[(INT)Source]; - - /* upcase conversion */ - Unicode = RtlUpcaseUnicodeChar (Unicode); - - /* unicode -> ansi */ - Destination = NlsUnicodeToAnsiTable[Unicode]; - } - else - { - /* single-byte code page */ - /* FIXME: implement the multi-byte stuff!! */ - Destination = Source; - } - - return Destination; -} - -/* EOF */ diff --git a/reactos/lib/ntdll/rtl/random.c b/reactos/lib/ntdll/rtl/random.c deleted file mode 100644 index ba9af81d0f3..00000000000 --- a/reactos/lib/ntdll/rtl/random.c +++ /dev/null @@ -1,157 +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: random.c,v 1.2 2004/02/01 20:48:06 ekohl Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS system libraries - * PURPOSE: Random number generator functions - * FILE: lib/ntdll/rtl/random.c - */ - -#define NTOS_MODE_USER -#include <ntos.h> - - -static ULONG SavedValue[128] = -{ - 0x4c8bc0aa, 0x4c022957, 0x2232827a, 0x2f1e7626, /* 0 */ - 0x7f8bdafb, 0x5c37d02a, 0x0ab48f72, 0x2f0c4ffa, /* 4 */ - 0x290e1954, 0x6b635f23, 0x5d3885c0, 0x74b49ff8, /* 8 */ - 0x5155fa54, 0x6214ad3f, 0x111e9c29, 0x242a3a09, /* 12 */ - 0x75932ae1, 0x40ac432e, 0x54f7ba7a, 0x585ccbd5, /* 16 */ - 0x6df5c727, 0x0374dad1, 0x7112b3f1, 0x735fc311, /* 20 */ - 0x404331a9, 0x74d97781, 0x64495118, 0x323e04be, /* 24 */ - 0x5974b425, 0x4862e393, 0x62389c1d, 0x28a68b82, /* 28 */ - 0x0f95da37, 0x7a50bbc6, 0x09b0091c, 0x22cdb7b4, /* 32 */ - 0x4faaed26, 0x66417ccd, 0x189e4bfa, 0x1ce4e8dd, /* 36 */ - 0x5274c742, 0x3bdcf4dc, 0x2d94e907, 0x32eac016, /* 40 */ - 0x26d33ca3, 0x60415a8a, 0x31f57880, 0x68c8aa52, /* 44 */ - 0x23eb16da, 0x6204f4a1, 0x373927c1, 0x0d24eb7c, /* 48 */ - 0x06dd7379, 0x2b3be507, 0x0f9c55b1, 0x2c7925eb, /* 52 */ - 0x36d67c9a, 0x42f831d9, 0x5e3961cb, 0x65d637a8, /* 56 */ - 0x24bb3820, 0x4d08e33d, 0x2188754f, 0x147e409e, /* 60 */ - 0x6a9620a0, 0x62e26657, 0x7bd8ce81, 0x11da0abb, /* 64 */ - 0x5f9e7b50, 0x23e444b6, 0x25920c78, 0x5fc894f0, /* 68 */ - 0x5e338cbb, 0x404237fd, 0x1d60f80f, 0x320a1743, /* 72 */ - 0x76013d2b, 0x070294ee, 0x695e243b, 0x56b177fd, /* 76 */ - 0x752492e1, 0x6decd52f, 0x125f5219, 0x139d2e78, /* 80 */ - 0x1898d11e, 0x2f7ee785, 0x4db405d8, 0x1a028a35, /* 84 */ - 0x63f6f323, 0x1f6d0078, 0x307cfd67, 0x3f32a78a, /* 88 */ - 0x6980796c, 0x462b3d83, 0x34b639f2, 0x53fce379, /* 92 */ - 0x74ba50f4, 0x1abc2c4b, 0x5eeaeb8d, 0x335a7a0d, /* 96 */ - 0x3973dd20, 0x0462d66b, 0x159813ff, 0x1e4643fd, /* 100 */ - 0x06bc5c62, 0x3115e3fc, 0x09101613, 0x47af2515, /* 104 */ - 0x4f11ec54, 0x78b99911, 0x3db8dd44, 0x1ec10b9b, /* 108 */ - 0x5b5506ca, 0x773ce092, 0x567be81a, 0x5475b975, /* 112 */ - 0x7a2cde1a, 0x494536f5, 0x34737bb4, 0x76d9750b, /* 116 */ - 0x2a1f6232, 0x2e49644d, 0x7dddcbe7, 0x500cebdb, /* 120 */ - 0x619dab9e, 0x48c626fe, 0x1cda3193, 0x52dabe9d /* 124 */ -}; - - -/* FUNCTIONS ***************************************************************/ - -/************************************************************************* - * RtlRandom [NTDLL.@] - * - * Generates a random number - * - * PARAMS - * Seed [O] The seed of the Random function - * - * RETURNS - * It returns a random number distributed over [0..MAXLONG-1]. - */ -ULONG STDCALL -RtlRandom (IN OUT PULONG Seed) -{ - ULONG Rand; - int Pos; - ULONG Result; - - Rand = (*Seed * 0x7fffffed + 0x7fffffc3) % 0x7fffffff; - *Seed = (Rand * 0x7fffffed + 0x7fffffc3) % 0x7fffffff; - Pos = *Seed & 0x7f; - Result = SavedValue[Pos]; - SavedValue[Pos] = Rand; - - return Result; -} - - -/************************************************************************* - * RtlUniform [NTDLL.@] - * - * Generates an uniform random number - * - * PARAMS - * Seed [O] The seed of the Random function - * - * RETURNS - * It returns a random number uniformly distributed over [0..MAXLONG-1]. - * - * NOTES - * Generates an uniform random number using D.H. Lehmer's 1948 algorithm. - * In our case the algorithm is: - * - * Result = (*Seed * 0x7fffffed + 0x7fffffc3) % MAXLONG; - * - * *Seed = Result; - * - * DIFFERENCES - * The native documentation states that the random number is - * uniformly distributed over [0..MAXLONG]. In reality the native - * function and our function return a random number uniformly - * distributed over [0..MAXLONG-1]. - */ -ULONG STDCALL -RtlUniform (PULONG Seed) -{ - ULONG Result; - - /* - * Instead of the algorithm stated above, we use the algorithm - * below, which is totally equivalent (see the tests), but does - * not use a division and therefore is faster. - */ - Result = *Seed * 0xffffffed + 0x7fffffc3; - - if (Result == 0xffffffff || Result == 0x7ffffffe) - { - Result = (Result + 2) & MAXLONG; - } - else if (Result == 0x7fffffff) - { - Result = 0; - } - else if ((Result & 0x80000000) == 0) - { - Result = Result + (~Result & 1); - } - else - { - Result = (Result + (Result & 1)) & MAXLONG; - } - - *Seed = Result; - - return Result; -} - -/* EOF */ diff --git a/reactos/lib/ntdll/rtl/sd.c b/reactos/lib/ntdll/rtl/sd.c deleted file mode 100644 index 7b719e09c37..00000000000 --- a/reactos/lib/ntdll/rtl/sd.c +++ /dev/null @@ -1,753 +0,0 @@ -/* $Id: sd.c,v 1.13 2003/10/15 11:00:33 ekohl Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * PURPOSE: Security descriptor functions - * FILE: lib/ntdll/rtl/sd.c - * PROGRAMER: David Welch <welch@cwcom.net> - * REVISION HISTORY: - * 26/07/98: Added stubs for security functions - */ - -/* INCLUDES *****************************************************************/ - -#include <ddk/ntddk.h> - -#include <ntdll/ntdll.h> - -/* FUNCTIONS ***************************************************************/ - -NTSTATUS STDCALL -RtlCreateSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, - ULONG Revision) -{ - if (Revision != 1) - { - return(STATUS_UNSUCCESSFUL); - } - - SecurityDescriptor->Revision = 1; - SecurityDescriptor->Sbz1 = 0; - SecurityDescriptor->Control = 0; - SecurityDescriptor->Owner = NULL; - SecurityDescriptor->Group = NULL; - SecurityDescriptor->Sacl = NULL; - SecurityDescriptor->Dacl = NULL; - - return(STATUS_SUCCESS); -} - -/* - * @implemented - */ -ULONG STDCALL -RtlLengthSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor) -{ - PSID Owner; - PSID Group; - ULONG Length; - PACL Dacl; - PACL Sacl; - - Length = sizeof(SECURITY_DESCRIPTOR); - - if (SecurityDescriptor->Owner != NULL) - { - Owner = SecurityDescriptor->Owner; - if (SecurityDescriptor->Control & SE_SELF_RELATIVE) - { - Owner = (PSID)((ULONG)Owner + - (ULONG)SecurityDescriptor); - } - Length = Length + ((sizeof(SID) + (Owner->SubAuthorityCount - 1) * - sizeof(ULONG) + 3) & 0xfc); - } - - if (SecurityDescriptor->Group != NULL) - { - Group = SecurityDescriptor->Group; - if (SecurityDescriptor->Control & SE_SELF_RELATIVE) - { - Group = (PSID)((ULONG)Group + (ULONG)SecurityDescriptor); - } - Length = Length + ((sizeof(SID) + (Group->SubAuthorityCount - 1) * - sizeof(ULONG) + 3) & 0xfc); - } - - if (SecurityDescriptor->Control & SE_DACL_PRESENT && - SecurityDescriptor->Dacl != NULL) - { - Dacl = SecurityDescriptor->Dacl; - if (SecurityDescriptor->Control & SE_SELF_RELATIVE) - { - Dacl = (PACL)((ULONG)Dacl + (PVOID)SecurityDescriptor); - } - Length = Length + ((Dacl->AclSize + 3) & 0xfc); - } - - if (SecurityDescriptor->Control & SE_SACL_PRESENT && - SecurityDescriptor->Sacl != NULL) - { - Sacl = SecurityDescriptor->Sacl; - if (SecurityDescriptor->Control & SE_SELF_RELATIVE) - { - Sacl = (PACL)((ULONG)Sacl + (PVOID)SecurityDescriptor); - } - Length = Length + ((Sacl->AclSize + 3) & 0xfc); - } - - return(Length); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlGetDaclSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, - PBOOLEAN DaclPresent, - PACL* Dacl, - PBOOLEAN DaclDefaulted) -{ - if (SecurityDescriptor->Revision != 1) - { - return(STATUS_UNSUCCESSFUL); - } - if (!(SecurityDescriptor->Control & SE_DACL_PRESENT)) - { - *DaclPresent = 0; - return(STATUS_SUCCESS); - } - *DaclPresent = 1; - if (SecurityDescriptor->Dacl == NULL) - { - *Dacl = NULL; - } - else - { - if (SecurityDescriptor->Control & SE_SELF_RELATIVE) - { - *Dacl = (PACL)((ULONG)SecurityDescriptor->Dacl + - (PVOID)SecurityDescriptor); - } - else - { - *Dacl = SecurityDescriptor->Dacl; - } - } - if (SecurityDescriptor->Control & SE_DACL_DEFAULTED) - { - *DaclDefaulted = 1; - } - else - { - *DaclDefaulted = 0; - } - return(STATUS_SUCCESS); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlSetDaclSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, - BOOLEAN DaclPresent, - PACL Dacl, - BOOLEAN DaclDefaulted) -{ - if (SecurityDescriptor->Revision != 1) - { - return(STATUS_UNSUCCESSFUL); - } - if (SecurityDescriptor->Control & SE_SELF_RELATIVE) - { - return(STATUS_UNSUCCESSFUL); - } - if (!DaclPresent) - { - SecurityDescriptor->Control = SecurityDescriptor->Control & ~(SE_DACL_PRESENT); - return(STATUS_SUCCESS); - } - SecurityDescriptor->Control = SecurityDescriptor->Control | SE_DACL_PRESENT; - SecurityDescriptor->Dacl = Dacl; - SecurityDescriptor->Control = SecurityDescriptor->Control & ~(SE_DACL_DEFAULTED); - if (DaclDefaulted) - { - SecurityDescriptor->Control = SecurityDescriptor->Control | SE_DACL_DEFAULTED; - } - return(STATUS_SUCCESS); -} - - -/* - * @implemented - */ -BOOLEAN STDCALL -RtlValidSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor) -{ - PSID Owner; - PSID Group; - PACL Sacl; - PACL Dacl; - - if (SecurityDescriptor->Revision != 1) - { - return(FALSE); - } - - Owner = SecurityDescriptor->Owner; - if (SecurityDescriptor->Control & SE_SELF_RELATIVE) - { - Owner = (PSID)((ULONG)Owner + (ULONG)SecurityDescriptor); - } - - if (!RtlValidSid(Owner)) - { - return(FALSE); - } - - Group = SecurityDescriptor->Group; - if (SecurityDescriptor->Control & SE_SELF_RELATIVE) - { - Group = (PSID)((ULONG)Group + (ULONG)SecurityDescriptor); - } - - if (!RtlValidSid(Group)) - { - return(FALSE); - } - - if (SecurityDescriptor->Control & SE_DACL_PRESENT && - SecurityDescriptor->Dacl != NULL) - { - Dacl = SecurityDescriptor->Dacl; - if (SecurityDescriptor->Control & SE_SELF_RELATIVE) - { - Dacl = (PACL)((ULONG)Dacl + (ULONG)SecurityDescriptor); - } - - if (!RtlValidAcl(Dacl)) - { - return(FALSE); - } - } - - if (SecurityDescriptor->Control & SE_SACL_PRESENT && - SecurityDescriptor->Sacl != NULL) - { - Sacl = SecurityDescriptor->Sacl; - if (SecurityDescriptor->Control & SE_SELF_RELATIVE) - { - Sacl = (PACL)((ULONG)Sacl + (ULONG)SecurityDescriptor); - } - - if (!RtlValidAcl(Sacl)) - { - return(FALSE); - } - } - - return(TRUE); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlSetOwnerSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, - PSID Owner, - BOOLEAN OwnerDefaulted) -{ - if (SecurityDescriptor->Revision != 1) - { - return(STATUS_UNSUCCESSFUL); - } - if (SecurityDescriptor->Control & SE_SELF_RELATIVE) - { - return(STATUS_UNSUCCESSFUL); - } - SecurityDescriptor->Owner = Owner; - SecurityDescriptor->Control = SecurityDescriptor->Control & ~(SE_OWNER_DEFAULTED); - if (OwnerDefaulted) - { - SecurityDescriptor->Control = SecurityDescriptor->Control | SE_OWNER_DEFAULTED; - } - return(STATUS_SUCCESS); -} - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlGetOwnerSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, - PSID* Owner, - PBOOLEAN OwnerDefaulted) -{ - if (SecurityDescriptor->Revision != 1) - { - return(STATUS_UNSUCCESSFUL); - } - if (SecurityDescriptor->Owner != NULL) - { - if (SecurityDescriptor->Control & SE_SELF_RELATIVE) - { - *Owner = (PSID)((ULONG)SecurityDescriptor->Owner + - (PVOID)SecurityDescriptor); - } - else - { - *Owner = SecurityDescriptor->Owner; - } - } - else - { - *Owner = NULL; - } - if (SecurityDescriptor->Control & SE_OWNER_DEFAULTED) - { - *OwnerDefaulted = 1; - } - else - { - *OwnerDefaulted = 0; - } - return(STATUS_SUCCESS); -} - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlSetGroupSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, - PSID Group, - BOOLEAN GroupDefaulted) -{ - if (SecurityDescriptor->Revision != 1) - { - return(STATUS_UNSUCCESSFUL); - } - if (SecurityDescriptor->Control & SE_SELF_RELATIVE) - { - return(STATUS_UNSUCCESSFUL); - } - SecurityDescriptor->Group = Group; - SecurityDescriptor->Control = SecurityDescriptor->Control & ~(SE_GROUP_DEFAULTED); - if (GroupDefaulted) - { - SecurityDescriptor->Control = SecurityDescriptor->Control | SE_GROUP_DEFAULTED; - } - return(STATUS_SUCCESS); -} - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlGetGroupSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, - PSID* Group, - PBOOLEAN GroupDefaulted) -{ - if (SecurityDescriptor->Revision != 1) - { - return(STATUS_UNSUCCESSFUL); - } - if (SecurityDescriptor->Group != NULL) - { - if (SecurityDescriptor->Control & SE_SELF_RELATIVE) - { - *Group = (PSID)((ULONG)SecurityDescriptor->Group + - (PVOID)SecurityDescriptor); - } - else - { - *Group = SecurityDescriptor->Group; - } - } - else - { - *Group = NULL; - } - if (SecurityDescriptor->Control & SE_GROUP_DEFAULTED) - { - *GroupDefaulted = 1; - } - else - { - *GroupDefaulted = 0; - } - return(STATUS_SUCCESS); -} - - -static VOID -RtlpQuerySecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, - PSID* Owner, - PULONG OwnerLength, - PSID* Group, - PULONG GroupLength, - PACL* Dacl, - PULONG DaclLength, - PACL* Sacl, - PULONG SaclLength) -{ - if (SecurityDescriptor->Owner != NULL) - { - *Owner = SecurityDescriptor->Owner; - if (SecurityDescriptor->Control & SE_SELF_RELATIVE) - { - *Owner = (PSID)((ULONG)*Owner + (ULONG)SecurityDescriptor); - } - } - else - { - *Owner = NULL; - } - - if (*Owner != NULL) - { - *OwnerLength = (RtlLengthSid(*Owner) + 3) & ~3; - } - else - { - *OwnerLength = 0; - } - - if ((SecurityDescriptor->Control & SE_DACL_PRESENT) && - SecurityDescriptor->Dacl != NULL) - { - *Dacl = SecurityDescriptor->Dacl; - if (SecurityDescriptor->Control & SE_SELF_RELATIVE) - { - *Dacl = (PACL)((ULONG)*Dacl + (ULONG)SecurityDescriptor); - } - } - else - { - *Dacl = NULL; - } - - if (*Dacl != NULL) - { - *DaclLength = ((*Dacl)->AclSize + 3) & ~3; - } - else - { - *DaclLength = 0; - } - - if (SecurityDescriptor->Group != NULL) - { - *Group = SecurityDescriptor->Group; - if (SecurityDescriptor->Control & SE_SELF_RELATIVE) - { - *Group = (PSID)((ULONG)*Group + (ULONG)SecurityDescriptor); - } - } - else - { - *Group = NULL; - } - - if (*Group != NULL) - { - *GroupLength = (RtlLengthSid(*Group) + 3) & ~3; - } - else - { - *GroupLength = 0; - } - - if ((SecurityDescriptor->Control & SE_SACL_PRESENT) && - SecurityDescriptor->Sacl != NULL) - { - *Sacl = SecurityDescriptor->Sacl; - if (SecurityDescriptor->Control & SE_SELF_RELATIVE) - { - *Sacl = (PACL)((ULONG)*Sacl + (ULONG)SecurityDescriptor); - } - } - else - { - *Sacl = NULL; - } - - if (*Sacl != NULL) - { - *SaclLength = ((*Sacl)->AclSize + 3) & ~3; - } - else - { - *SaclLength = 0; - } -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlMakeSelfRelativeSD(PSECURITY_DESCRIPTOR AbsSD, - PSECURITY_DESCRIPTOR RelSD, - PULONG BufferLength) -{ - PSID Owner; - PSID Group; - PACL Sacl; - PACL Dacl; - ULONG OwnerLength; - ULONG GroupLength; - ULONG SaclLength; - ULONG DaclLength; - ULONG TotalLength; - ULONG Current; - - RtlpQuerySecurityDescriptor(AbsSD, - &Owner, - &OwnerLength, - &Group, - &GroupLength, - &Dacl, - &DaclLength, - &Sacl, - &SaclLength); - - TotalLength = OwnerLength + GroupLength + SaclLength + DaclLength + sizeof(SECURITY_DESCRIPTOR); - if (*BufferLength < TotalLength) - { - return(STATUS_BUFFER_TOO_SMALL); - } - - RtlZeroMemory(RelSD, - TotalLength); - memmove(RelSD, - AbsSD, - sizeof(SECURITY_DESCRIPTOR)); - Current = (ULONG)RelSD + sizeof(SECURITY_DESCRIPTOR); - - if (SaclLength != 0) - { - memmove((PVOID)Current, - Sacl, - SaclLength); - RelSD->Sacl = (PACL)((ULONG)Current - (ULONG)RelSD); - Current += SaclLength; - } - - if (DaclLength != 0) - { - memmove((PVOID)Current, - Dacl, - DaclLength); - RelSD->Dacl = (PACL)((ULONG)Current - (ULONG)RelSD); - Current += DaclLength; - } - - if (OwnerLength != 0) - { - memmove((PVOID)Current, - Owner, - OwnerLength); - RelSD->Owner = (PSID)((ULONG)Current - (ULONG)RelSD); - Current += OwnerLength; - } - - if (GroupLength != 0) - { - memmove((PVOID)Current, - Group, - GroupLength); - RelSD->Group = (PSID)((ULONG)Current - (ULONG)RelSD); - } - - RelSD->Control |= SE_SELF_RELATIVE; - - return(STATUS_SUCCESS); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlAbsoluteToSelfRelativeSD(PSECURITY_DESCRIPTOR AbsSD, - PSECURITY_DESCRIPTOR RelSD, - PULONG BufferLength - ) -{ - if (AbsSD->Control & SE_SELF_RELATIVE) - { - return(STATUS_BAD_DESCRIPTOR_FORMAT); - } - - return(RtlMakeSelfRelativeSD(AbsSD, RelSD, BufferLength)); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlGetControlSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, - PSECURITY_DESCRIPTOR_CONTROL Control, - PULONG Revision) -{ - *Revision = SecurityDescriptor->Revision; - - if (SecurityDescriptor->Revision != 1) - { - return(STATUS_UNKNOWN_REVISION); - } - - *Control = SecurityDescriptor->Control; - - return(STATUS_SUCCESS); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlGetSaclSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, - PBOOLEAN SaclPresent, - PACL *Sacl, - PBOOLEAN SaclDefaulted) -{ - if (SecurityDescriptor->Revision != 1) - { - return(STATUS_UNSUCCESSFUL); - } - if (!(SecurityDescriptor->Control & SE_SACL_PRESENT)) - { - *SaclPresent = 0; - return(STATUS_SUCCESS); - } - *SaclPresent = 1; - if (SecurityDescriptor->Sacl == NULL) - { - *Sacl = NULL; - } - else - { - if (SecurityDescriptor->Control & SE_SELF_RELATIVE) - { - *Sacl = (PACL)((ULONG)SecurityDescriptor->Sacl + - (PVOID)SecurityDescriptor); - } - else - { - *Sacl = SecurityDescriptor->Sacl; - } - } - if (SecurityDescriptor->Control & SE_SACL_DEFAULTED) - { - *SaclDefaulted = 1; - } - else - { - *SaclDefaulted = 0; - } - return(STATUS_SUCCESS); -} - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlSetSaclSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, - BOOLEAN SaclPresent, - PACL Sacl, - BOOLEAN SaclDefaulted) -{ - if (SecurityDescriptor->Revision != 1) - { - return(STATUS_UNSUCCESSFUL); - } - if (SecurityDescriptor->Control & SE_SELF_RELATIVE) - { - return(STATUS_UNSUCCESSFUL); - } - if (!SaclPresent) - { - SecurityDescriptor->Control = SecurityDescriptor->Control & ~(SE_SACL_PRESENT); - return(STATUS_SUCCESS); - } - SecurityDescriptor->Control = SecurityDescriptor->Control | SE_SACL_PRESENT; - SecurityDescriptor->Sacl = Sacl; - SecurityDescriptor->Control = SecurityDescriptor->Control & ~(SE_SACL_DEFAULTED); - if (SaclDefaulted) - { - SecurityDescriptor->Control = SecurityDescriptor->Control | SE_SACL_DEFAULTED; - } - return(STATUS_SUCCESS); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlSelfRelativeToAbsoluteSD(PSECURITY_DESCRIPTOR RelSD, - PSECURITY_DESCRIPTOR AbsSD, - PDWORD AbsSDSize, - PACL Dacl, - PDWORD DaclSize, - PACL Sacl, - PDWORD SaclSize, - PSID Owner, - PDWORD OwnerSize, - PSID Group, - PDWORD GroupSize) -{ - ULONG OwnerLength; - ULONG GroupLength; - ULONG DaclLength; - ULONG SaclLength; - PSID pOwner; - PSID pGroup; - PACL pDacl; - PACL pSacl; - - if (!(RelSD->Control & SE_SELF_RELATIVE)) - return STATUS_BAD_DESCRIPTOR_FORMAT; - - RtlpQuerySecurityDescriptor (RelSD, - &pOwner, - &OwnerLength, - &pGroup, - &GroupLength, - &pDacl, - &DaclLength, - &pSacl, - &SaclLength); - - if (OwnerLength > *OwnerSize || - GroupLength > *GroupSize || - DaclLength > *DaclSize || - SaclLength > *SaclSize) - return STATUS_BUFFER_TOO_SMALL; - - memmove (Owner, pOwner, OwnerLength); - memmove (Group, pGroup, GroupLength); - memmove (Dacl, pDacl, DaclLength); - memmove (Sacl, pSacl, SaclLength); - - memmove (AbsSD, RelSD, sizeof (SECURITY_DESCRIPTOR)); - - AbsSD->Control &= ~SE_SELF_RELATIVE; - AbsSD->Owner = Owner; - AbsSD->Group = Group; - AbsSD->Dacl = Dacl; - AbsSD->Sacl = Sacl; - - *OwnerSize = OwnerLength; - *GroupSize = GroupLength; - *DaclSize = DaclLength; - *SaclSize = SaclLength; - - return STATUS_SUCCESS; -} - -/* EOF */ diff --git a/reactos/lib/ntdll/rtl/security.c b/reactos/lib/ntdll/rtl/security.c deleted file mode 100644 index d23248dd6a0..00000000000 --- a/reactos/lib/ntdll/rtl/security.c +++ /dev/null @@ -1,150 +0,0 @@ -/* $Id: security.c,v 1.10 2003/07/11 13:50:23 royce Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: lib/ntdll/rtl/security.c - * PURPOSE: Miscellaneous securitiy related functions - * PROGRAMMER: Eric Kohl - * UPDATE HISTORY: - * 21/11/2001 Created - */ - -#include <ddk/ntddk.h> -#include <ntdll/rtl.h> - -#define NDEBUG -#include <ntdll/ntdll.h> - - -/* FUNCTIONS ****************************************************************/ - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlImpersonateSelf(IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel) -{ - OBJECT_ATTRIBUTES ObjectAttributes; - SECURITY_QUALITY_OF_SERVICE SecQos; - HANDLE ProcessToken; - HANDLE ImpersonationToken; - NTSTATUS Status; - - Status = NtOpenProcessToken(NtCurrentProcess(), - TOKEN_DUPLICATE, - &ProcessToken); - if (!NT_SUCCESS(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, - TokenImpersonation, - &ImpersonationToken); - if (!NT_SUCCESS(Status)) - { - NtClose(ProcessToken); - return(Status); - } - - Status = NtSetInformationThread(NtCurrentThread(), - ThreadImpersonationToken, - &ImpersonationToken, - sizeof(HANDLE)); - NtClose(ImpersonationToken); - NtClose(ProcessToken); - - return(Status); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlAdjustPrivilege(IN ULONG Privilege, - IN BOOLEAN Enable, - IN BOOLEAN CurrentThread, - OUT PBOOLEAN Enabled) -{ - TOKEN_PRIVILEGES NewState; - TOKEN_PRIVILEGES OldState; - ULONG ReturnLength; - HANDLE TokenHandle; - NTSTATUS Status; - - DPRINT ("RtlAdjustPrivilege() called\n"); - - if (CurrentThread) - { - Status = NtOpenThreadToken (NtCurrentThread (), - TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, - FALSE, - &TokenHandle); - } - else - { - Status = NtOpenProcessToken (NtCurrentProcess (), - TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, - &TokenHandle); - } - - if (!NT_SUCCESS (Status)) - { - DPRINT1 ("Retrieving token handle failed (Status %lx)\n", Status); - return Status; - } - - OldState.PrivilegeCount = 1; - - NewState.PrivilegeCount = 1; - NewState.Privileges[0].Luid.LowPart = Privilege; - NewState.Privileges[0].Luid.HighPart = 0; - NewState.Privileges[0].Attributes = (Enable) ? SE_PRIVILEGE_ENABLED : 0; - - Status = NtAdjustPrivilegesToken (TokenHandle, - FALSE, - &NewState, - sizeof(TOKEN_PRIVILEGES), - &OldState, - &ReturnLength); - NtClose (TokenHandle); - if (Status == STATUS_NOT_ALL_ASSIGNED) - { - DPRINT1 ("Failed to assign all privileges\n"); - return STATUS_PRIVILEGE_NOT_HELD; - } - if (!NT_SUCCESS(Status)) - { - DPRINT1 ("NtAdjustPrivilegesToken() failed (Status %lx)\n", Status); - return Status; - } - - if (OldState.PrivilegeCount == 0) - { - *Enabled = Enable; - } - else - { - *Enabled = (OldState.Privileges[0].Attributes & SE_PRIVILEGE_ENABLED); - } - - DPRINT ("RtlAdjustPrivilege() done\n"); - - return STATUS_SUCCESS; -} - -/* EOF */ diff --git a/reactos/lib/ntdll/rtl/sid.c b/reactos/lib/ntdll/rtl/sid.c deleted file mode 100644 index 96c37dfcef5..00000000000 --- a/reactos/lib/ntdll/rtl/sid.c +++ /dev/null @@ -1,350 +0,0 @@ -/* $Id: sid.c,v 1.8 2003/07/11 13:50:23 royce Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * PURPOSE: Security manager - * FILE: lib/ntdll/rtl/sid.c - * PROGRAMER: David Welch <welch@cwcom.net> - * REVISION HISTORY: - * 26/07/98: Added stubs for security functions - */ - -/* INCLUDES *****************************************************************/ - -#include <ddk/ntddk.h> -#include <string.h> - -//#include <internal/debug.h> - -/* FUNCTIONS ***************************************************************/ - -BOOLEAN STDCALL -RtlValidSid(IN PSID Sid) -{ - if ((Sid->Revision & 0xf) != 1) - { - return(FALSE); - } - if (Sid->SubAuthorityCount > 15) - { - return(FALSE); - } - return(TRUE); -} - - -/* - * @implemented - */ -ULONG STDCALL -RtlLengthRequiredSid(IN UCHAR SubAuthorityCount) -{ - return(sizeof(SID) + (SubAuthorityCount - 1) * sizeof(ULONG)); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -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); -} - - -/* - * @implemented - */ -PULONG STDCALL -RtlSubAuthoritySid(IN PSID Sid, - IN ULONG SubAuthority) -{ - return(&Sid->SubAuthority[SubAuthority]); -} - - -/* - * @implemented - */ -PUCHAR STDCALL -RtlSubAuthorityCountSid(IN PSID Sid) -{ - return(&Sid->SubAuthorityCount); -} - - -/* - * @implemented - */ -BOOLEAN STDCALL -RtlEqualSid(IN PSID Sid1, - IN PSID Sid2) -{ - if (Sid1->Revision != Sid2->Revision) - { - return(FALSE); - } - if ((*RtlSubAuthorityCountSid(Sid1)) != (*RtlSubAuthorityCountSid(Sid2))) - { - return(FALSE); - } - if (memcmp(Sid1, Sid2, RtlLengthSid(Sid1)) != 0) - { - return(FALSE); - } - return(TRUE); -} - - -/* - * @implemented - */ -ULONG STDCALL -RtlLengthSid(IN PSID Sid) -{ - return(sizeof(SID) + (Sid->SubAuthorityCount-1)*4); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlCopySid(ULONG BufferLength, - PSID Dest, - PSID Src) -{ - if (BufferLength < RtlLengthSid(Src)) - { - return(STATUS_UNSUCCESSFUL); - } - memmove(Dest, - Src, - RtlLengthSid(Src)); - return(STATUS_SUCCESS); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlCopySidAndAttributesArray(ULONG Count, - PSID_AND_ATTRIBUTES Src, - ULONG SidAreaSize, - PSID_AND_ATTRIBUTES Dest, - PVOID SidArea, - PVOID* RemainingSidArea, - PULONG RemainingSidAreaSize) -{ - ULONG SidLength; - ULONG Length; - ULONG i; - - Length = SidAreaSize; - - for (i=0; i<Count; i++) - { - if (RtlLengthSid(Src[i].Sid) > Length) - { - return(STATUS_BUFFER_TOO_SMALL); - } - SidLength = RtlLengthSid(Src[i].Sid); - Length = Length - SidLength; - Dest[i].Sid = SidArea; - Dest[i].Attributes = Src[i].Attributes; - RtlCopySid(SidLength, - SidArea, - Src[i].Sid); - SidArea = SidArea + SidLength; - } - *RemainingSidArea = SidArea; - *RemainingSidAreaSize = Length; - return(STATUS_SUCCESS); -} - - -/* - * @implemented - */ -PSID_IDENTIFIER_AUTHORITY STDCALL -RtlIdentifierAuthoritySid(IN PSID Sid) -{ - 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 - ) -{ - PSID pSid; - - if (SubAuthorityCount > 8) - return STATUS_INVALID_SID; - - if (Sid == NULL) - return STATUS_INVALID_PARAMETER; - - pSid = (PSID)RtlAllocateHeap (RtlGetProcessHeap (), - 0, - SubAuthorityCount * sizeof(DWORD) + 8); - if (pSid == NULL) - return STATUS_NO_MEMORY; - - pSid->Revision = 1; - pSid->SubAuthorityCount = SubAuthorityCount; - memcpy (&pSid->IdentifierAuthority, - IdentifierAuthority, - sizeof(SID_IDENTIFIER_AUTHORITY)); - - switch (SubAuthorityCount) - { - case 8: - pSid->SubAuthority[7] = SubAuthority7; - case 7: - pSid->SubAuthority[6] = SubAuthority6; - case 6: - pSid->SubAuthority[5] = SubAuthority5; - case 5: - pSid->SubAuthority[4] = SubAuthority4; - case 4: - pSid->SubAuthority[3] = SubAuthority3; - case 3: - pSid->SubAuthority[2] = SubAuthority2; - case 2: - pSid->SubAuthority[1] = SubAuthority1; - case 1: - pSid->SubAuthority[0] = SubAuthority0; - break; - } - - *Sid = pSid; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -PSID STDCALL -RtlFreeSid(IN PSID Sid) -{ - RtlFreeHeap(RtlGetProcessHeap(), - 0, - Sid); - return(Sid); -} - - -/* - * @implemented - */ -BOOLEAN STDCALL -RtlEqualPrefixSid(IN PSID Sid1, - IN PSID Sid2) -{ - return(Sid1->SubAuthorityCount == Sid2->SubAuthorityCount && - !memcmp(Sid1, Sid2, - (Sid1->SubAuthorityCount - 1) * sizeof(DWORD) + 8)); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlConvertSidToUnicodeString(PUNICODE_STRING String, - PSID Sid, - BOOLEAN AllocateBuffer) -{ - WCHAR Buffer[256]; - PWSTR wcs; - ULONG Length; - ULONG i; - - if (RtlValidSid (Sid) == FALSE) - return STATUS_INVALID_SID; - - wcs = Buffer; - wcs += swprintf (wcs, L"S-%u-", Sid->Revision); - if (Sid->IdentifierAuthority.Value[0] == 0 && - Sid->IdentifierAuthority.Value[1] == 0) - { - wcs += swprintf (wcs, - L"%lu", - (ULONG)Sid->IdentifierAuthority.Value[2] << 24 | - (ULONG)Sid->IdentifierAuthority.Value[3] << 16 | - (ULONG)Sid->IdentifierAuthority.Value[4] << 8 | - (ULONG)Sid->IdentifierAuthority.Value[5]); - } - else - { - wcs += swprintf (wcs, - L"0x%02hx%02hx%02hx%02hx%02hx%02hx", - Sid->IdentifierAuthority.Value[0], - Sid->IdentifierAuthority.Value[1], - Sid->IdentifierAuthority.Value[2], - Sid->IdentifierAuthority.Value[3], - Sid->IdentifierAuthority.Value[4], - Sid->IdentifierAuthority.Value[5]); - } - - for (i = 0; i < Sid->SubAuthorityCount; i++) - { - wcs += swprintf (wcs, - L"-%u", - Sid->SubAuthority[i]); - } - - Length = (wcs - Buffer) * sizeof(WCHAR); - if (AllocateBuffer) - { - String->Buffer = RtlAllocateHeap (RtlGetProcessHeap (), - 0, - Length + sizeof(WCHAR)); - if (String->Buffer == NULL) - return STATUS_NO_MEMORY; - String->MaximumLength = Length + sizeof(WCHAR); - } - else - { - if (Length > String->MaximumLength) - return STATUS_BUFFER_TOO_SMALL; - } - - String->Length = Length; - RtlCopyMemory (String->Buffer, - Buffer, - Length); - if (Length < String->MaximumLength) - String->Buffer[Length / sizeof(WCHAR)] = 0; - - return STATUS_SUCCESS; -} - -/* EOF */ diff --git a/reactos/lib/ntdll/rtl/time.c b/reactos/lib/ntdll/rtl/time.c deleted file mode 100644 index 990a4d03788..00000000000 --- a/reactos/lib/ntdll/rtl/time.c +++ /dev/null @@ -1,373 +0,0 @@ -/* $Id: time.c,v 1.17 2003/11/17 20:35:46 sedwards Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: lib/ntdll/rtl/time.c - * PURPOSE: Conversion between Time and TimeFields - * PROGRAMMER: Rex Jolliff (rex@lvcablemodem.com) - * UPDATE HISTORY: - * Created 22/05/98 - * 08/03/98 RJJ Implemented these functions - */ - -/* INCLUDES *****************************************************************/ - -#include <ddk/ntddk.h> -#include <ntdll/rtl.h> - - -#define TICKSPERSEC 10000000 -#define TICKSPERMSEC 10000 -#define SECSPERDAY 86400 -#define SECSPERHOUR 3600 -#define SECSPERMIN 60 -#define MINSPERHOUR 60 -#define HOURSPERDAY 24 -#define EPOCHWEEKDAY 1 -#define DAYSPERWEEK 7 -#define EPOCHYEAR 1601 -#define DAYSPERNORMALYEAR 365 -#define DAYSPERLEAPYEAR 366 -#define MONSPERYEAR 12 - -#define TICKSTO1970 0x019db1ded53e8000LL -#define TICKSTO1980 0x01a8e79fe1d58000LL - -static const int YearLengths[2] = {DAYSPERNORMALYEAR, DAYSPERLEAPYEAR}; -static const int MonthLengths[2][MONSPERYEAR] = -{ - { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, - { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } -}; - -static __inline int IsLeapYear(int Year) -{ - return Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0) ? 1 : 0; -} - -static __inline void NormalizeTimeFields(CSHORT *FieldToNormalize, - CSHORT *CarryField, - int Modulus) -{ - *FieldToNormalize = (CSHORT) (*FieldToNormalize - Modulus); - *CarryField = (CSHORT) (*CarryField + 1); -} - -/* FUNCTIONS *****************************************************************/ - -/* - * @implemented - */ -VOID -STDCALL -RtlTimeToTimeFields( - PLARGE_INTEGER liTime, - PTIME_FIELDS TimeFields) -{ - const int *Months; - int LeapSecondCorrections, SecondsInDay, CurYear; - int LeapYear, CurMonth, GMTOffset; - long int Days; - long long int Time = (long long int)liTime->QuadPart; - - /* Extract millisecond from time and convert time into seconds */ - TimeFields->Milliseconds = (CSHORT) ((Time % TICKSPERSEC) / TICKSPERMSEC); - Time = Time / TICKSPERSEC; - - /* FIXME: Compute the number of leap second corrections here */ - LeapSecondCorrections = 0; - - /* FIXME: get the GMT offset here */ - GMTOffset = 0; - - /* Split the time into days and seconds within the day */ - Days = Time / SECSPERDAY; - SecondsInDay = Time % SECSPERDAY; - - /* Adjust the values for GMT and leap seconds */ - SecondsInDay += (GMTOffset - LeapSecondCorrections); - while (SecondsInDay < 0) - { - SecondsInDay += SECSPERDAY; - Days--; - } - while (SecondsInDay >= SECSPERDAY) - { - SecondsInDay -= SECSPERDAY; - Days++; - } - - /* compute time of day */ - TimeFields->Hour = (CSHORT) (SecondsInDay / SECSPERHOUR); - SecondsInDay = SecondsInDay % SECSPERHOUR; - TimeFields->Minute = (CSHORT) (SecondsInDay / SECSPERMIN); - TimeFields->Second = (CSHORT) (SecondsInDay % SECSPERMIN); - - /* FIXME: handle the possibility that we are on a leap second (i.e. Second = 60) */ - - /* compute day of week */ - TimeFields->Weekday = (CSHORT) ((EPOCHWEEKDAY + Days) % DAYSPERWEEK); - - /* compute year */ - CurYear = EPOCHYEAR; - CurYear += Days / DAYSPERLEAPYEAR; - Days -= (CurYear - EPOCHYEAR) * DAYSPERLEAPYEAR; - CurYear--; /* The next calculation needs CurYear - 1 */ - Days += CurYear - CurYear / 4 + CurYear / 100 - CurYear / 400; - CurYear++; - Days -= EPOCHYEAR - 1 - (EPOCHYEAR -1) / 4 + (EPOCHYEAR -1) / 100 - (EPOCHYEAR - 1) / 400; - - /* FIXME: handle calendar modifications */ - while (1) - { - LeapYear = IsLeapYear(CurYear); - if (Days < (long) YearLengths[LeapYear]) - { - break; - } - CurYear++; - Days = Days - (long) YearLengths[LeapYear]; - } - TimeFields->Year = (CSHORT) CurYear; - - /* Compute month of year */ - LeapYear = IsLeapYear(CurYear); - Months = MonthLengths[LeapYear]; - for (CurMonth = 0; Days >= (long) Months[CurMonth]; CurMonth++) - Days = Days - (long) Months[CurMonth]; - TimeFields->Month = (CSHORT) (CurMonth + 1); - TimeFields->Day = (CSHORT) (Days + 1); -} - - -/* - * @implemented - */ -BOOLEAN -STDCALL -RtlTimeFieldsToTime( - PTIME_FIELDS tfTimeFields, - PLARGE_INTEGER Time) -{ - int CurYear; - int CurMonth; - long long int rcTime; - TIME_FIELDS TimeFields = *tfTimeFields; - - rcTime = 0; - - /* FIXME: normalize the TIME_FIELDS structure here */ - while (TimeFields.Second >= SECSPERMIN) - { - NormalizeTimeFields(&TimeFields.Second, - &TimeFields.Minute, - SECSPERMIN); - } - while (TimeFields.Minute >= MINSPERHOUR) - { - NormalizeTimeFields(&TimeFields.Minute, - &TimeFields.Hour, - MINSPERHOUR); - } - while (TimeFields.Hour >= HOURSPERDAY) - { - NormalizeTimeFields(&TimeFields.Hour, - &TimeFields.Day, - HOURSPERDAY); - } - while (TimeFields.Day > - MonthLengths[IsLeapYear(TimeFields.Year)][TimeFields.Month - 1]) - { - NormalizeTimeFields(&TimeFields.Day, - &TimeFields.Month, - SECSPERMIN); - } - while (TimeFields.Month > MONSPERYEAR) - { - NormalizeTimeFields(&TimeFields.Month, - &TimeFields.Year, - MONSPERYEAR); - } - - /* FIXME: handle calendar corrections here */ - for (CurYear = EPOCHYEAR; CurYear < TimeFields.Year; CurYear++) - { - rcTime += YearLengths[IsLeapYear(CurYear)]; - } - for (CurMonth = 1; CurMonth < TimeFields.Month; CurMonth++) - { - rcTime += MonthLengths[IsLeapYear(CurYear)][CurMonth - 1]; - } - rcTime += TimeFields.Day - 1; - rcTime *= SECSPERDAY; - rcTime += TimeFields.Hour * SECSPERHOUR + TimeFields.Minute * SECSPERMIN + - TimeFields.Second; - rcTime *= TICKSPERSEC; - rcTime += TimeFields.Milliseconds * TICKSPERMSEC; - *Time = *(LARGE_INTEGER *)&rcTime; - - return TRUE; -} - - -/* - * @implemented - */ -VOID -STDCALL -RtlSecondsSince1970ToTime( - ULONG SecondsSince1970, - PLARGE_INTEGER Time) -{ - Time->QuadPart = (SecondsSince1970 * TICKSPERSEC) + TICKSTO1970; -} - - -/* - * @implemented - */ -VOID -STDCALL -RtlSecondsSince1980ToTime( - ULONG SecondsSince1980, - PLARGE_INTEGER Time) -{ - Time->QuadPart = (SecondsSince1980 * TICKSPERSEC) + TICKSTO1980; -} - - -/* - * @implemented - */ -BOOLEAN -STDCALL -RtlTimeToSecondsSince1970( - PLARGE_INTEGER Time, - PULONG SecondsSince1970) -{ - LARGE_INTEGER liTime; - - liTime.QuadPart = Time->QuadPart - TICKSTO1970; - liTime.QuadPart = liTime.QuadPart / TICKSPERSEC; - - if (liTime.u.HighPart != 0) - return FALSE; - - *SecondsSince1970 = liTime.u.LowPart; - - return TRUE; -} - - -/* - * @implemented - */ -BOOLEAN -STDCALL -RtlTimeToSecondsSince1980( - PLARGE_INTEGER Time, - PULONG SecondsSince1980) -{ - LARGE_INTEGER liTime; - - liTime.QuadPart = Time->QuadPart - TICKSTO1980; - liTime.QuadPart = liTime.QuadPart / TICKSPERSEC; - - if (liTime.u.HighPart != 0) - return FALSE; - - *SecondsSince1980 = liTime.u.LowPart; - - return TRUE; -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlLocalTimeToSystemTime(PLARGE_INTEGER LocalTime, - PLARGE_INTEGER SystemTime) -{ - SYSTEM_TIMEOFDAY_INFORMATION TimeInformation; - NTSTATUS Status; - - Status = NtQuerySystemInformation(SystemTimeOfDayInformation, - &TimeInformation, - sizeof(SYSTEM_TIMEOFDAY_INFORMATION), - NULL); - if (!NT_SUCCESS(Status)) - return(Status); - - SystemTime->QuadPart = LocalTime->QuadPart + - TimeInformation.TimeZoneBias.QuadPart; - - return(STATUS_SUCCESS); -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlSystemTimeToLocalTime(PLARGE_INTEGER SystemTime, - PLARGE_INTEGER LocalTime) -{ - SYSTEM_TIMEOFDAY_INFORMATION TimeInformation; - NTSTATUS Status; - - Status = NtQuerySystemInformation(SystemTimeOfDayInformation, - &TimeInformation, - sizeof(SYSTEM_TIMEOFDAY_INFORMATION), - NULL); - if (!NT_SUCCESS(Status)) - return(Status); - - LocalTime->QuadPart = SystemTime->QuadPart - - TimeInformation.TimeZoneBias.QuadPart; - - return(STATUS_SUCCESS); -} - - -/* - * @implemented - */ -VOID -STDCALL -RtlTimeToElapsedTimeFields(IN PLARGE_INTEGER Time, - OUT PTIME_FIELDS TimeFields) -{ - ULONGLONG ElapsedSeconds; - ULONG SecondsInDay; - ULONG SecondsInMinute; - - /* Extract millisecond from time */ - TimeFields->Milliseconds = (CSHORT)((Time->QuadPart % TICKSPERSEC) / TICKSPERMSEC); - - /* Compute elapsed seconds */ - ElapsedSeconds = (ULONGLONG)Time->QuadPart / TICKSPERSEC; - - /* Compute seconds within the day */ - SecondsInDay = ElapsedSeconds % SECSPERDAY; - - /* Compute elapsed minutes within the day */ - SecondsInMinute = SecondsInDay % SECSPERHOUR; - - /* Compute elapsed time of day */ - TimeFields->Hour = (CSHORT)(SecondsInDay / SECSPERHOUR); - TimeFields->Minute = (CSHORT)(SecondsInMinute / SECSPERMIN); - TimeFields->Second = (CSHORT)(SecondsInMinute % SECSPERMIN); - - /* Compute elapsed days */ - TimeFields->Day = (CSHORT)(ElapsedSeconds / SECSPERDAY); - - /* The elapsed number of months and days cannot be calculated */ - TimeFields->Month = 0; - TimeFields->Year = 0; -} - - -/* EOF */ diff --git a/reactos/lib/ntdll/rtl/timezone.c b/reactos/lib/ntdll/rtl/timezone.c deleted file mode 100644 index 0f055311629..00000000000 --- a/reactos/lib/ntdll/rtl/timezone.c +++ /dev/null @@ -1,175 +0,0 @@ -/* $Id: timezone.c,v 1.7 2003/10/15 21:14:01 ekohl Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * PURPOSE: Timezone functions - * FILE: lib/ntdll/rtl/timezone.c - * PROGRAMER: Eric Kohl - * REVISION HISTORY: - * 29/05/2001: Created - */ - -/* INCLUDES *****************************************************************/ - -#include <ddk/ntddk.h> -#include <ntos/registry.h> -#include <ntos/time.h> - -#define NDEBUG -#include <ntdll/ntdll.h> - - -/* FUNCTIONS *****************************************************************/ - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlQueryTimeZoneInformation(PTIME_ZONE_INFORMATION TimeZoneInformation) -{ - RTL_QUERY_REGISTRY_TABLE QueryTable[8]; - UNICODE_STRING StandardName; - UNICODE_STRING DaylightName; - NTSTATUS Status; - - DPRINT("RtlQueryTimeZoneInformation()\n"); - - RtlZeroMemory(QueryTable, - sizeof(QueryTable)); - - StandardName.Length = 0; - StandardName.MaximumLength = 32 * sizeof(WCHAR); - StandardName.Buffer = TimeZoneInformation->StandardName; - - DaylightName.Length = 0; - DaylightName.MaximumLength = 32 * sizeof(WCHAR); - DaylightName.Buffer = TimeZoneInformation->DaylightName; - - QueryTable[0].Name = L"Bias"; - QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT; - QueryTable[0].EntryContext = &TimeZoneInformation->Bias; - - QueryTable[1].Name = L"Standard Name"; - QueryTable[1].Flags = RTL_QUERY_REGISTRY_DIRECT; - QueryTable[1].EntryContext = &StandardName; - - QueryTable[2].Name = L"Standard Bias"; - QueryTable[2].Flags = RTL_QUERY_REGISTRY_DIRECT; - QueryTable[2].EntryContext = &TimeZoneInformation->StandardBias; - - QueryTable[3].Name = L"Standard Start"; - QueryTable[3].Flags = RTL_QUERY_REGISTRY_DIRECT; - QueryTable[3].EntryContext = &TimeZoneInformation->StandardDate; - - QueryTable[4].Name = L"Daylight Name"; - QueryTable[4].Flags = RTL_QUERY_REGISTRY_DIRECT; - QueryTable[4].EntryContext = &DaylightName; - - QueryTable[5].Name = L"Daylight Bias"; - QueryTable[5].Flags = RTL_QUERY_REGISTRY_DIRECT; - QueryTable[5].EntryContext = &TimeZoneInformation->DaylightBias; - - QueryTable[6].Name = L"Daylight Start"; - QueryTable[6].Flags = RTL_QUERY_REGISTRY_DIRECT; - QueryTable[6].EntryContext = &TimeZoneInformation->DaylightDate; - - Status = RtlQueryRegistryValues(RTL_REGISTRY_CONTROL, - L"TimeZoneInformation", - QueryTable, - NULL, - NULL); - - return Status; -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlSetTimeZoneInformation(PTIME_ZONE_INFORMATION TimeZoneInformation) -{ - ULONG Length; - NTSTATUS Status; - - DPRINT("RtlSetTimeZoneInformation()\n"); - - Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL, - L"TimeZoneInformation", - L"Bias", - REG_DWORD, - &TimeZoneInformation->Bias, - sizeof(LONG)); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - Length = (wcslen(TimeZoneInformation->StandardName) + 1) * sizeof(WCHAR); - Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL, - L"TimeZoneInformation", - L"Standard Name", - REG_SZ, - TimeZoneInformation->StandardName, - Length); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL, - L"TimeZoneInformation", - L"Standard Bias", - REG_DWORD, - &TimeZoneInformation->StandardBias, - sizeof(LONG)); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL, - L"TimeZoneInformation", - L"Standard Start", - REG_BINARY, - &TimeZoneInformation->StandardDate, - sizeof(SYSTEMTIME)); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - Length = (wcslen(TimeZoneInformation->DaylightName) + 1) * sizeof(WCHAR); - Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL, - L"TimeZoneInformation", - L"Daylight Name", - REG_SZ, - TimeZoneInformation->DaylightName, - Length); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL, - L"TimeZoneInformation", - L"Daylight Bias", - REG_DWORD, - &TimeZoneInformation->DaylightBias, - sizeof(LONG)); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL, - L"TimeZoneInformation", - L"Daylight Start", - REG_BINARY, - &TimeZoneInformation->DaylightDate, - sizeof(SYSTEMTIME)); - - return Status; -} - -/* EOF */ diff --git a/reactos/lib/ntdll/rtl/unicode.c b/reactos/lib/ntdll/rtl/unicode.c deleted file mode 100644 index e00ab783986..00000000000 --- a/reactos/lib/ntdll/rtl/unicode.c +++ /dev/null @@ -1,1943 +0,0 @@ -/* $Id: unicode.c,v 1.38 2004/05/13 21:01:14 navaraf Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: lib/ntdll/rtl/unicode.c - * PURPOSE: String functions - * PROGRAMMER: Jason Filby (jasonfilby@yahoo.com) - * UPDATE HISTORY: - * Created 10/08/98 - */ - -#include <ddk/ntddk.h> -#include <ntdll/rtl.h> -#include <ctype.h> -#include <ntos/minmax.h> - -#define NDEBUG -#include <ntdll/ntdll.h> - - -extern PUSHORT NlsUnicodeUpcaseTable; -extern PUSHORT NlsUnicodeLowercaseTable; - -/* FUNCTIONS *****************************************************************/ - -WCHAR STDCALL -RtlAnsiCharToUnicodeChar (IN CHAR AnsiChar) -{ - ULONG Size; - WCHAR UnicodeChar; - - Size = 1; -#if 0 - Size = (NlsLeadByteInfo[AnsiChar] == 0) ? 1 : 2; -#endif - - RtlMultiByteToUnicodeN (&UnicodeChar, - sizeof(WCHAR), - NULL, - &AnsiChar, - Size); - - return UnicodeChar; -} - - -/* - * @implemented - */ -ULONG STDCALL -RtlAnsiStringToUnicodeSize (IN PANSI_STRING AnsiString) -{ - ULONG Size; - - RtlMultiByteToUnicodeSize (&Size, - AnsiString->Buffer, - AnsiString->Length); - - return Size; -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlAnsiStringToUnicodeString( - IN OUT PUNICODE_STRING DestinationString, - IN PANSI_STRING SourceString, - IN BOOLEAN AllocateDestinationString) -{ - NTSTATUS Status; - ULONG Length; - - if (NlsMbCodePageTag == TRUE) - Length = RtlAnsiStringToUnicodeSize (SourceString); - else - Length = SourceString->Length * sizeof(WCHAR); - - if (Length > 65535) - return STATUS_INVALID_PARAMETER_2; - - if (AllocateDestinationString == TRUE) - { - DestinationString->MaximumLength = Length + sizeof(WCHAR); - DestinationString->Buffer = - RtlAllocateHeap (RtlGetProcessHeap (), - 0, - DestinationString->MaximumLength); - if (DestinationString->Buffer == NULL) - return STATUS_NO_MEMORY; - } - else - { - if (Length + sizeof(WCHAR) > DestinationString->MaximumLength) - { - DPRINT("STATUS_BUFFER_TOO_SMALL\n"); - return STATUS_BUFFER_TOO_SMALL; - } - } - DestinationString->Length = Length; - - RtlZeroMemory (DestinationString->Buffer, - DestinationString->Length); - - Status = RtlMultiByteToUnicodeN (DestinationString->Buffer, - DestinationString->Length, - NULL, - SourceString->Buffer, - SourceString->Length); - if (!NT_SUCCESS(Status)) - { - if (AllocateDestinationString) - { - RtlFreeHeap (RtlGetProcessHeap (), - 0, - DestinationString->Buffer); - } - return Status; - } - - DestinationString->Buffer[Length / sizeof(WCHAR)] = 0; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlAppendAsciizToString( - IN OUT PSTRING Destination, - IN PCSZ Source) -{ - ULONG Length; - PCHAR Ptr; - - if (Source == NULL) - return STATUS_SUCCESS; - - Length = strlen (Source); - if (Destination->Length + Length >= Destination->MaximumLength) - return STATUS_BUFFER_TOO_SMALL; - - Ptr = Destination->Buffer + Destination->Length; - memmove (Ptr, - Source, - Length); - Ptr += Length; - *Ptr = 0; - - Destination->Length += Length; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlAppendStringToString( - IN OUT PSTRING Destination, - IN PSTRING Source) -{ - PCHAR Ptr; - - if (Source->Length == 0) - return STATUS_SUCCESS; - - if (Destination->Length + Source->Length >= Destination->MaximumLength) - return STATUS_BUFFER_TOO_SMALL; - - Ptr = Destination->Buffer + Destination->Length; - memmove (Ptr, - Source->Buffer, - Source->Length); - Ptr += Source->Length; - *Ptr = 0; - - Destination->Length += Source->Length; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlAppendUnicodeStringToString( - IN OUT PUNICODE_STRING Destination, - IN PUNICODE_STRING Source) -{ - - if ((Source->Length + Destination->Length) >= Destination->MaximumLength) - return STATUS_BUFFER_TOO_SMALL; - - memcpy((PVOID)Destination->Buffer + Destination->Length, Source->Buffer, Source->Length); - Destination->Length += Source->Length; - if( Destination->MaximumLength > Destination->Length ) - Destination->Buffer[Destination->Length / sizeof(WCHAR)] = 0; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlAppendUnicodeToString(IN OUT PUNICODE_STRING Destination, - IN PWSTR Source) -{ - ULONG slen; - - slen = wcslen(Source) * sizeof(WCHAR); - - if (Destination->Length + slen >= Destination->MaximumLength) - return(STATUS_BUFFER_TOO_SMALL); - - memcpy((PVOID)Destination->Buffer + Destination->Length, Source, slen); - Destination->Length += slen; - Destination->Buffer[Destination->Length / sizeof(WCHAR)] = 0; - - return(STATUS_SUCCESS); -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlCharToInteger( - IN PCSZ String, - IN ULONG Base, - IN OUT PULONG Value) -{ - ULONG Val; - - *Value = 0; - - if (Base == 0) - { - Base = 10; - if (*String == '0') - { - Base = 8; - String++; - if ((*String == 'x') && isxdigit (String[1])) - { - String++; - Base = 16; - } - } - } - - if (!isxdigit (*String)) - return STATUS_INVALID_PARAMETER; - - while (isxdigit (*String) && - (Val = isdigit (*String) ? * String - '0' : (islower (*String) - ? toupper (*String) : *String) - 'A' + 10) < Base) - { - *Value = *Value * Base + Val; - String++; - } - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -LONG -STDCALL -RtlCompareString( - IN PSTRING String1, - IN PSTRING String2, - IN BOOLEAN CaseInsensitive) -{ - ULONG len1, len2; - PCHAR s1, s2; - CHAR c1, c2; - - if (String1 && String2) - { - len1 = String1->Length; - len2 = String2->Length; - s1 = String1->Buffer; - s2 = String2->Buffer; - - if (s1 && s2) - { - if (CaseInsensitive) - { - while (1) - { - c1 = len1-- ? RtlUpperChar (*s1++) : 0; - c2 = len2-- ? RtlUpperChar (*s2++) : 0; - if (!c1 || !c2 || c1 != c2) - return c1 - c2; - } - } - else - { - while (1) - { - c1 = len1-- ? *s1++ : 0; - c2 = len2-- ? *s2++ : 0; - if (!c1 || !c2 || c1 != c2) - return c1 - c2; - } - } - } - } - - return 0; -} - - -/* - * @implemented - */ -LONG -STDCALL -RtlCompareUnicodeString( - IN PUNICODE_STRING String1, - IN PUNICODE_STRING String2, - IN BOOLEAN CaseInsensitive) -{ - ULONG len1, len2; - PWCHAR s1, s2; - WCHAR c1, c2; - - if (String1 && String2) - { - len1 = String1->Length / sizeof(WCHAR); - len2 = String2->Length / sizeof(WCHAR); - s1 = String1->Buffer; - s2 = String2->Buffer; - - if (s1 && s2) - { - if (CaseInsensitive) - { - while (1) - { - c1 = len1-- ? RtlUpcaseUnicodeChar (*s1++) : 0; - c2 = len2-- ? RtlUpcaseUnicodeChar (*s2++) : 0; - if (!c1 || !c2 || c1 != c2) - return c1 - c2; - } - } - else - { - while (1) - { - c1 = len1-- ? *s1++ : 0; - c2 = len2-- ? *s2++ : 0; - if (!c1 || !c2 || c1 != c2) - return c1 - c2; - } - } - } - } - - return 0; -} - - -/* - * @implemented - */ -VOID -STDCALL -RtlCopyString( - IN OUT PSTRING DestinationString, - IN PSTRING SourceString) -{ - ULONG copylen; - - if (SourceString == NULL) - { - DestinationString->Length = 0; - return; - } - - copylen = min (DestinationString->MaximumLength - sizeof(CHAR), - SourceString->Length); - memcpy(DestinationString->Buffer, SourceString->Buffer, copylen); - DestinationString->Length = copylen; - DestinationString->Buffer[copylen] = 0; -} - - -/* - * @implemented - */ -VOID -STDCALL -RtlCopyUnicodeString( - IN OUT PUNICODE_STRING DestinationString, - IN PUNICODE_STRING SourceString) -{ - ULONG copylen; - - if (SourceString == NULL) - { - DestinationString->Length = 0; - return; - } - - copylen = min (DestinationString->MaximumLength - sizeof(WCHAR), - SourceString->Length); - memcpy(DestinationString->Buffer, SourceString->Buffer, copylen); - DestinationString->Buffer[copylen / sizeof(WCHAR)] = 0; - DestinationString->Length = copylen; -} - - -/* - * @implemented - */ -BOOLEAN -STDCALL -RtlCreateUnicodeString( - IN OUT PUNICODE_STRING Destination, - IN PWSTR Source) -{ - ULONG Length; - - Length = (wcslen (Source) + 1) * sizeof(WCHAR); - - Destination->Buffer = RtlAllocateHeap (RtlGetProcessHeap (), - 0, - Length); - if (Destination->Buffer == NULL) - return FALSE; - - memmove (Destination->Buffer, - Source, - Length); - - Destination->MaximumLength = Length; - Destination->Length = Length - sizeof (WCHAR); - - return TRUE; -} - - -/* - * @implemented - */ -BOOLEAN -STDCALL -RtlCreateUnicodeStringFromAsciiz( - OUT PUNICODE_STRING Destination, - IN PCSZ Source) -{ - ANSI_STRING AnsiString; - NTSTATUS Status; - - RtlInitAnsiString (&AnsiString, - Source); - - Status = RtlAnsiStringToUnicodeString (Destination, - &AnsiString, - TRUE); - - return NT_SUCCESS(Status); -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlDowncaseUnicodeString( - IN OUT PUNICODE_STRING DestinationString, - IN PUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString) -{ - ULONG i; - PWCHAR Src, Dest; - - if (AllocateDestinationString == TRUE) - { - DestinationString->MaximumLength = SourceString->Length + sizeof(WCHAR); - DestinationString->Buffer = RtlAllocateHeap (RtlGetProcessHeap (), - 0, - SourceString->Length + sizeof(WCHAR)); - } - else - { - if (SourceString->Length >= DestinationString->MaximumLength) - return STATUS_BUFFER_TOO_SMALL; - } - DestinationString->Length = SourceString->Length; - - Src = SourceString->Buffer; - Dest = DestinationString->Buffer; - for (i=0; i < SourceString->Length / sizeof(WCHAR); i++) - { - if (*Src < L'A') - { - *Dest = *Src; - } - else if (*Src <= L'Z') - { - *Dest = (*Src + (L'a' - L'A')); - } - else - { - *Dest = RtlDowncaseUnicodeChar(*Src); - } - - Dest++; - Src++; - } - *Dest = 0; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -BOOLEAN -STDCALL -RtlEqualComputerName( - IN PUNICODE_STRING ComputerName1, - IN PUNICODE_STRING ComputerName2) -{ - return RtlEqualDomainName (ComputerName1, - ComputerName2); -} - - -/* - * @implemented - */ -BOOLEAN -STDCALL -RtlEqualDomainName ( - IN PUNICODE_STRING DomainName1, - IN PUNICODE_STRING DomainName2 - ) -{ - OEM_STRING OemString1; - OEM_STRING OemString2; - BOOLEAN Result; - - RtlUpcaseUnicodeStringToOemString (&OemString1, - DomainName1, - TRUE); - RtlUpcaseUnicodeStringToOemString (&OemString2, - DomainName2, - TRUE); - - Result = RtlEqualString (&OemString1, - &OemString2, - FALSE); - - RtlFreeOemString (&OemString1); - RtlFreeOemString (&OemString2); - - return Result; -} - - -/* - * @implemented - */ -BOOLEAN -STDCALL -RtlEqualString( - IN PSTRING String1, - IN PSTRING String2, - IN BOOLEAN CaseInsensitive) -{ - ULONG i; - CHAR c1, c2; - PCHAR p1, p2; - - if (String1->Length != String2->Length) - return FALSE; - - p1 = String1->Buffer; - p2 = String2->Buffer; - for (i = 0; i < String1->Length; i++) - { - if (CaseInsensitive == TRUE) - { - c1 = RtlUpperChar (*p1); - c2 = RtlUpperChar (*p2); - } - else - { - c1 = *p1; - c2 = *p2; - } - - if (c1 != c2) - return FALSE; - - p1++; - p2++; - } - - return TRUE; -} - - -/* - * @implemented - */ -BOOLEAN -STDCALL -RtlEqualUnicodeString( - IN PUNICODE_STRING String1, - IN PUNICODE_STRING String2, - IN BOOLEAN CaseInsensitive) -{ - ULONG i; - WCHAR wc1, wc2; - PWCHAR pw1, pw2; - - if (String1->Length != String2->Length) - return FALSE; - - pw1 = String1->Buffer; - pw2 = String2->Buffer; - - for (i = 0; i < String1->Length / sizeof(WCHAR); i++) - { - if (CaseInsensitive == TRUE) - { - wc1 = RtlUpcaseUnicodeChar (*pw1); - wc2 = RtlUpcaseUnicodeChar (*pw2); - } - else - { - wc1 = *pw1; - wc2 = *pw2; - } - - if (wc1 != wc2) - return FALSE; - - pw1++; - pw2++; - } - - return TRUE; -} - - -/* - * @implemented - */ -VOID -STDCALL -RtlEraseUnicodeString( - IN PUNICODE_STRING String) -{ - if (String->Buffer == NULL) - return; - - if (String->MaximumLength == 0) - return; - - memset (String->Buffer, - 0, - String->MaximumLength); - - String->Length = 0; -} - - -/* - * @implemented - */ -VOID -STDCALL -RtlFreeAnsiString( - IN PANSI_STRING AnsiString) -{ - if (AnsiString->Buffer == NULL) - return; - - RtlFreeHeap (RtlGetProcessHeap (), - 0, - AnsiString->Buffer); - - AnsiString->Buffer = NULL; - AnsiString->Length = 0; - AnsiString->MaximumLength = 0; -} - - -/* - * @implemented - */ -VOID -STDCALL -RtlFreeOemString( - IN POEM_STRING OemString) -{ - if (OemString->Buffer == NULL) - return; - - RtlFreeHeap (RtlGetProcessHeap (), - 0, - OemString->Buffer); - - OemString->Buffer = NULL; - OemString->Length = 0; - OemString->MaximumLength = 0; -} - - -/* - * @implemented - */ -VOID -STDCALL -RtlFreeUnicodeString( - IN PUNICODE_STRING UnicodeString) -{ - if (UnicodeString->Buffer == NULL) - return; - - RtlFreeHeap (RtlGetProcessHeap (), - 0, - UnicodeString->Buffer); - - UnicodeString->Buffer = NULL; - UnicodeString->Length = 0; - UnicodeString->MaximumLength = 0; -} - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlGUIDFromString (IN PUNICODE_STRING GuidString, - OUT GUID* Guid) -{ - return STATUS_NOT_IMPLEMENTED; -} - - -/* - * @implemented - */ -VOID -STDCALL -RtlInitAnsiString( - IN OUT PANSI_STRING DestinationString, - IN PCSZ SourceString) -{ - ULONG DestSize; - - if(SourceString==NULL) - { - DestinationString->Length = 0; - DestinationString->MaximumLength = 0; - } - else - { - DestSize = strlen ((const char *)SourceString); - DestinationString->Length = DestSize; - DestinationString->MaximumLength = DestSize + 1; - } - DestinationString->Buffer = (PCHAR)SourceString; -} - - -/* - * @implemented - */ -VOID -STDCALL -RtlInitString( - IN OUT PSTRING DestinationString, - IN PCSZ SourceString) -{ - ULONG DestSize; - - if (SourceString == NULL) - { - DestinationString->Length = 0; - DestinationString->MaximumLength = 0; - } - else - { - DestSize = strlen((const char *)SourceString); - DestinationString->Length = DestSize; - DestinationString->MaximumLength = DestSize + sizeof(CHAR); - } - DestinationString->Buffer = (PCHAR)SourceString; -} - - -/* - * @implemented - */ -VOID -STDCALL -RtlInitUnicodeString( - IN OUT PUNICODE_STRING DestinationString, - IN PCWSTR SourceString) -{ - ULONG DestSize; - - if (SourceString==NULL) - { - DestinationString->Length=0; - DestinationString->MaximumLength=0; - } - else - { - DestSize = wcslen((PWSTR)SourceString) * sizeof(WCHAR); - DestinationString->Length = DestSize; - DestinationString->MaximumLength = DestSize + sizeof(WCHAR); - } - DestinationString->Buffer = (PWSTR)SourceString; -} - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlInt64ToUnicodeString (IN ULONGLONG Value, - IN ULONG Base, - OUT PUNICODE_STRING String) -{ - return STATUS_NOT_IMPLEMENTED; -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlIntegerToChar( - IN ULONG Value, - IN ULONG Base, - IN ULONG Length, - IN OUT PCHAR String) -{ - ULONG Radix; - CHAR temp[33]; - ULONG v = Value; - ULONG i; - PCHAR tp; - PCHAR sp; - - Radix = Base; - if (Radix == 0) - Radix = 10; - - if ((Radix != 2) && (Radix != 8) && - (Radix != 10) && (Radix != 16)) - return STATUS_INVALID_PARAMETER; - - tp = temp; - while (v || tp == temp) - { - i = v % Radix; - v = v / Radix; - if (i < 10) - *tp = i + '0'; - else - *tp = i + 'a' - 10; - tp++; - } - - if (tp - temp >= Length) - return STATUS_BUFFER_TOO_SMALL; - - sp = String; - while (tp > temp) - *sp++ = *--tp; - *sp = 0; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlIntegerToUnicodeString( - IN ULONG Value, - IN ULONG Base, /* optional */ - IN OUT PUNICODE_STRING String) -{ - ANSI_STRING AnsiString; - CHAR Buffer[33]; - NTSTATUS Status; - - Status = RtlIntegerToChar (Value, - Base, - 33, - Buffer); - if (!NT_SUCCESS(Status)) - return Status; - - AnsiString.Buffer = Buffer; - AnsiString.Length = strlen (Buffer); - AnsiString.MaximumLength = 33; - - Status = RtlAnsiStringToUnicodeString (String, - &AnsiString, - FALSE); - - return Status; -} - - -#define ITU_IMPLEMENTED_TESTS (IS_TEXT_UNICODE_ODD_LENGTH|IS_TEXT_UNICODE_SIGNATURE) - -/* - * @implemented - */ -ULONG STDCALL -RtlIsTextUnicode (PVOID Buffer, - ULONG Length, - ULONG *Flags) -{ - PWSTR s = Buffer; - ULONG in_flags = (ULONG)-1; - ULONG out_flags = 0; - - if (Length == 0) - goto done; - - if (Flags != 0) - in_flags = *Flags; - - /* - * Apply various tests to the text string. According to the - * docs, each test "passed" sets the corresponding flag in - * the output flags. But some of the tests are mutually - * exclusive, so I don't see how you could pass all tests ... - */ - - /* Check for an odd length ... pass if even. */ - if (!(Length & 1)) - out_flags |= IS_TEXT_UNICODE_ODD_LENGTH; - - /* Check for the BOM (byte order mark). */ - if (*s == 0xFEFF) - out_flags |= IS_TEXT_UNICODE_SIGNATURE; - -#if 0 - /* Check for the reverse BOM (byte order mark). */ - if (*s == 0xFFFE) - out_flags |= IS_TEXT_UNICODE_REVERSE_SIGNATURE; -#endif - - /* FIXME: Add more tests */ - - /* - * Check whether the string passed all of the tests. - */ - in_flags &= ITU_IMPLEMENTED_TESTS; - if ((out_flags & in_flags) != in_flags) - Length = 0; - -done: - if (Flags != 0) - *Flags = out_flags; - - return Length; -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlLargeIntegerToChar( - IN PLARGE_INTEGER Value, - IN ULONG Base, - IN ULONG Length, - IN OUT PCHAR String) -{ - ULONG Radix; - CHAR temp[65]; - ULONGLONG v = Value->QuadPart; - ULONG i; - PCHAR tp; - PCHAR sp; - - Radix = Base; - if (Radix == 0) - Radix = 10; - - if ((Radix != 2) && (Radix != 8) && - (Radix != 10) && (Radix != 16)) - return STATUS_INVALID_PARAMETER; - - tp = temp; - while (v || tp == temp) - { - i = v % Radix; - v = v / Radix; - if (i < 10) - *tp = i + '0'; - else - *tp = i + 'a' - 10; - tp++; - } - - if (tp - temp >= Length) - return STATUS_BUFFER_TOO_SMALL; - - sp = String; - while (tp > temp) - *sp++ = *--tp; - *sp = 0; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -ULONG -STDCALL -RtlOemStringToUnicodeSize( - IN POEM_STRING OemString) -{ - ULONG Size; - - RtlMultiByteToUnicodeSize (&Size, - OemString->Buffer, - OemString->Length); - - return Size; -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlOemStringToUnicodeString( - IN OUT PUNICODE_STRING DestinationString, - IN POEM_STRING SourceString, - IN BOOLEAN AllocateDestinationString) -{ - NTSTATUS Status; - ULONG Length; - - if (NlsMbCodePageTag == TRUE) - Length = RtlAnsiStringToUnicodeSize (SourceString); - else - Length = SourceString->Length * sizeof(WCHAR); - - if (Length > 65535) - return STATUS_INVALID_PARAMETER_2; - - if (AllocateDestinationString == TRUE) - { - DestinationString->MaximumLength = Length + sizeof(WCHAR); - DestinationString->Buffer = - RtlAllocateHeap (RtlGetProcessHeap (), - 0, - DestinationString->MaximumLength); - if (DestinationString->Buffer == NULL) - return STATUS_NO_MEMORY; - } - else - { - if (Length + sizeof(WCHAR) > DestinationString->MaximumLength) - { - DPRINT("STATUS_BUFFER_TOO_SMALL\n"); - return STATUS_BUFFER_TOO_SMALL; - } - } - DestinationString->Length = Length; - - RtlZeroMemory (DestinationString->Buffer, - DestinationString->Length); - - Status = RtlOemToUnicodeN (DestinationString->Buffer, - DestinationString->Length, - NULL, - SourceString->Buffer, - SourceString->Length); - if (!NT_SUCCESS(Status)) - { - if (AllocateDestinationString) - { - RtlFreeHeap (RtlGetProcessHeap (), - 0, - DestinationString->Buffer); - } - return Status; - } - - DestinationString->Buffer[Length / sizeof(WCHAR)] = 0; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -BOOLEAN -STDCALL -RtlPrefixString( - PANSI_STRING String1, - PANSI_STRING String2, - BOOLEAN CaseInsensitive) -{ - PCHAR pc1; - PCHAR pc2; - ULONG Length; - - if (String2->Length < String1->Length) - return FALSE; - - Length = String1->Length; - pc1 = String1->Buffer; - pc2 = String2->Buffer; - - if (pc1 && pc2) - { - if (CaseInsensitive) - { - while (Length--) - { - if (RtlUpperChar (*pc1++) != RtlUpperChar (*pc2++)) - return FALSE; - } - } - else - { - while (Length--) - { - if (*pc1++ != *pc2++) - return FALSE; - } - } - return TRUE; - } - return FALSE; -} - - -/* - * @implemented - */ -BOOLEAN -STDCALL -RtlPrefixUnicodeString( - PUNICODE_STRING String1, - PUNICODE_STRING String2, - BOOLEAN CaseInsensitive) -{ - PWCHAR pc1; - PWCHAR pc2; - ULONG Length; - - if (String2->Length < String1->Length) - return FALSE; - - Length = String1->Length / 2; - pc1 = String1->Buffer; - pc2 = String2->Buffer; - - if (pc1 && pc2) - { - if (CaseInsensitive) - { - while (Length--) - { - if (RtlUpcaseUnicodeChar (*pc1++) - != RtlUpcaseUnicodeChar (*pc2++)) - return FALSE; - } - } - else - { - while (Length--) - { - if( *pc1++ != *pc2++ ) - return FALSE; - } - } - return TRUE; - } - return FALSE; -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlStringFromGUID (IN REFGUID Guid, - OUT PUNICODE_STRING GuidString) -{ - STATIC CONST PWCHAR Hex = L"0123456789ABCDEF"; - WCHAR Buffer[40]; - PWCHAR BufferPtr; - ULONG i; - - if (Guid == NULL) - { - return STATUS_INVALID_PARAMETER; - } - - swprintf (Buffer, - L"{%08lX-%04X-%04X-%02X%02X-", - Guid->Data1, - Guid->Data2, - Guid->Data3, - Guid->Data4[0], - Guid->Data4[1]); - BufferPtr = Buffer + 25; - - /* 6 hex bytes */ - for (i = 2; i < 8; i++) - { - *BufferPtr++ = Hex[Guid->Data4[i] >> 4]; - *BufferPtr++ = Hex[Guid->Data4[i] & 0xf]; - } - - *BufferPtr++ = L'}'; - *BufferPtr++ = L'\0'; - - return RtlCreateUnicodeString (GuidString, Buffer); -} - - -/* - * @implemented - */ -ULONG -STDCALL -RtlUnicodeStringToAnsiSize( - IN PUNICODE_STRING UnicodeString) -{ - ULONG Size; - - RtlUnicodeToMultiByteSize (&Size, - UnicodeString->Buffer, - UnicodeString->Length); - - return Size+1; //NB: incl. nullterm -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlUnicodeStringToAnsiString( - IN OUT PANSI_STRING DestinationString, - IN PUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString) -{ - NTSTATUS Status; - ULONG Length; - - if (NlsMbCodePageTag == TRUE) - Length = RtlUnicodeStringToAnsiSize (SourceString); - else - Length = SourceString->Length / sizeof(WCHAR); - - if (AllocateDestinationString == TRUE) - { - DestinationString->MaximumLength = Length + sizeof(CHAR); - DestinationString->Buffer = - RtlAllocateHeap (RtlGetProcessHeap (), - 0, - DestinationString->MaximumLength); - if (DestinationString->Buffer == NULL) - return STATUS_NO_MEMORY; - } - else - { - if (Length >= DestinationString->MaximumLength) - return STATUS_BUFFER_TOO_SMALL; - } - DestinationString->Length = Length; - - RtlZeroMemory (DestinationString->Buffer, - DestinationString->Length); - - Status = RtlUnicodeToMultiByteN (DestinationString->Buffer, - DestinationString->Length, - NULL, - SourceString->Buffer, - SourceString->Length); - if (!NT_SUCCESS(Status)) - { - if (AllocateDestinationString == TRUE) - { - RtlFreeHeap (RtlGetProcessHeap (), - 0, - DestinationString->Buffer); - } - return Status; - } - - DestinationString->Buffer[Length] = 0; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlUnicodeStringToInteger( - IN PUNICODE_STRING String, - IN ULONG Base, - OUT PULONG Value) -{ - PWCHAR Str; - ULONG lenmin = 0; - ULONG i; - ULONG Val; - BOOLEAN addneg = FALSE; - - *Value = 0; - Str = String->Buffer; - - for (i = 0; i < String->Length / sizeof(WCHAR); i++) - { - if (*Str == L'b') - { - Base = 2; - lenmin++; - } - else if (*Str == L'o') - { - Base = 8; - lenmin++; - } - else if (*Str == L'd') - { - Base = 10; - lenmin++; - } - else if (*Str == L'x') - { - Base = 16; - lenmin++; - } - else if (*Str == L'+') - { - lenmin++; - } - else if (*Str == L'-') - { - addneg = TRUE; - lenmin++; - } - else if ((*Str > L'1') && (Base == 2)) - { - return STATUS_INVALID_PARAMETER; - } - else if (((*Str > L'7') || (*Str < L'0')) && (Base == 8)) - { - return STATUS_INVALID_PARAMETER; - } - else if (((*Str > L'9') || (*Str < L'0')) && (Base == 10)) - { - return STATUS_INVALID_PARAMETER; - } - else if ( ((*Str > L'9') || (*Str < L'0')) && - ((towupper (*Str) > L'F') || (towupper (*Str) < L'A')) && - (Base == 16)) - { - return STATUS_INVALID_PARAMETER; - } - Str++; - } - - Str = String->Buffer + lenmin; - - if (Base == 0) - Base = 10; - - while (iswxdigit (*Str) && - (Val = iswdigit (*Str) ? *Str - L'0' : (iswlower (*Str) - ? towupper (*Str) : *Str) - L'A' + 10) < Base) - { - *Value = *Value * Base + Val; - Str++; - } - - if (addneg == TRUE) - *Value *= -1; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -ULONG -STDCALL -RtlUnicodeStringToOemSize( - IN PUNICODE_STRING UnicodeString) -{ - ULONG Size; - - RtlUnicodeToMultiByteSize (&Size, - UnicodeString->Buffer, - UnicodeString->Length); - - return Size+1; //NB: incl. nullterm -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlUnicodeStringToCountedOemString( - IN OUT POEM_STRING DestinationString, - IN PUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString) -{ - NTSTATUS Status; - ULONG Length; - ULONG Size; - - if (NlsMbOemCodePageTag == TRUE) - Length = RtlUnicodeStringToAnsiSize (SourceString)/* + 1*/; - else - Length = SourceString->Length / sizeof(WCHAR) + 1; - - if (Length > 0x0000FFFF) - return STATUS_INVALID_PARAMETER_2; - - DestinationString->Length = (WORD)(Length - 1); - - if (AllocateDestinationString) - { - DestinationString->Buffer = RtlAllocateHeap (RtlGetProcessHeap (), - 0, - Length); - if (DestinationString->Buffer == NULL) - return STATUS_NO_MEMORY; - - RtlZeroMemory (DestinationString->Buffer, - Length); - DestinationString->MaximumLength = (WORD)Length; - } - else - { - if (Length > DestinationString->MaximumLength) - { - if (DestinationString->MaximumLength == 0) - return STATUS_BUFFER_OVERFLOW; - DestinationString->Length = - DestinationString->MaximumLength - 1; - } - } - - Status = RtlUnicodeToOemN (DestinationString->Buffer, - DestinationString->Length, - &Size, - SourceString->Buffer, - SourceString->Length); - if (!NT_SUCCESS(Status)) - { - if (AllocateDestinationString) - { - RtlFreeHeap (RtlGetProcessHeap (), - 0, - DestinationString->Buffer); - } - return Status; - } - - DestinationString->Buffer[Size] = 0; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlUnicodeStringToOemString( - IN OUT POEM_STRING DestinationString, - IN PUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString) -{ - NTSTATUS Status; - ULONG Length; - ULONG Size; - - if (NlsMbOemCodePageTag == TRUE) - Length = RtlUnicodeStringToAnsiSize (SourceString)/* + 1*/; - else - Length = SourceString->Length / sizeof(WCHAR) + 1; - - if (Length > 0x0000FFFF) - return STATUS_INVALID_PARAMETER_2; - - DestinationString->Length = (WORD)(Length - 1); - - if (AllocateDestinationString) - { - DestinationString->Buffer = RtlAllocateHeap (RtlGetProcessHeap (), - 0, - Length); - if (DestinationString->Buffer == NULL) - return STATUS_NO_MEMORY; - - RtlZeroMemory (DestinationString->Buffer, - Length); - DestinationString->MaximumLength = (WORD)Length; - } - else - { - if (Length > DestinationString->MaximumLength) - { - if (DestinationString->MaximumLength == 0) - return STATUS_BUFFER_OVERFLOW; - DestinationString->Length = - DestinationString->MaximumLength - 1; - } - } - - Status = RtlUnicodeToOemN (DestinationString->Buffer, - DestinationString->Length, - &Size, - SourceString->Buffer, - SourceString->Length); - if (!NT_SUCCESS(Status)) - { - if (AllocateDestinationString) - { - RtlFreeHeap (RtlGetProcessHeap (), - 0, - DestinationString->Buffer); - } - return Status; - } - - DestinationString->Buffer[Size] = 0; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlUpcaseUnicodeString( - IN OUT PUNICODE_STRING DestinationString, - IN PCUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString) -{ - ULONG i; - PWCHAR Src, Dest; - - if (AllocateDestinationString == TRUE) - { - DestinationString->MaximumLength=SourceString->Length+sizeof(WCHAR); - DestinationString->Buffer = RtlAllocateHeap (RtlGetProcessHeap (), - 0, - SourceString->Length + sizeof(WCHAR)); - if (DestinationString->Buffer == NULL) - return STATUS_NO_MEMORY; - } - else - { - if (SourceString->Length >= DestinationString->MaximumLength) - return STATUS_BUFFER_TOO_SMALL; - } - DestinationString->Length = SourceString->Length; - - Src = SourceString->Buffer; - Dest = DestinationString->Buffer; - for (i = 0; i < SourceString->Length / sizeof(WCHAR); i++) - { - *Dest = RtlUpcaseUnicodeChar (*Src); - Dest++; - Src++; - } - *Dest = 0; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlUpcaseUnicodeStringToAnsiString( - IN OUT PANSI_STRING DestinationString, - IN PUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString) -{ - NTSTATUS Status; - ULONG Length; - ULONG Size; - - if (NlsMbCodePageTag == TRUE) - Length = RtlUnicodeStringToAnsiSize (SourceString)/* + 1*/; - else - Length = SourceString->Length / sizeof(WCHAR) + 1; - - if (Length > 0x0000FFFF) - return STATUS_INVALID_PARAMETER_2; - - DestinationString->Length = (WORD)(Length - 1); - - if (AllocateDestinationString == TRUE) - { - DestinationString->Buffer = RtlAllocateHeap (RtlGetProcessHeap (), - 0, - DestinationString->MaximumLength); - if (DestinationString->Buffer == NULL) - return STATUS_NO_MEMORY; - - RtlZeroMemory (DestinationString->Buffer, - Length); - DestinationString->MaximumLength = (WORD)Length; - } - else - { - if (Length > DestinationString->MaximumLength) - { - if (!DestinationString->MaximumLength) - return STATUS_BUFFER_OVERFLOW; - DestinationString->Length = - DestinationString->MaximumLength - 1; - } - } - - Status = RtlUpcaseUnicodeToMultiByteN (DestinationString->Buffer, - DestinationString->Length, - &Size, - SourceString->Buffer, - SourceString->Length); - if (!NT_SUCCESS(Status)) - { - if (AllocateDestinationString) - { - RtlFreeHeap (RtlGetProcessHeap (), - 0, - DestinationString->Buffer); - } - return Status; - } - - DestinationString->Buffer[Size] = 0; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlUpcaseUnicodeStringToCountedOemString( - IN OUT POEM_STRING DestinationString, - IN PUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString) -{ - NTSTATUS Status; - ULONG Length; - ULONG Size; - - if (NlsMbCodePageTag == TRUE) - Length = RtlUnicodeStringToAnsiSize (SourceString)/* + 1*/; - else - Length = SourceString->Length / sizeof(WCHAR) + 1; - - if (Length > 0x0000FFFF) - return STATUS_INVALID_PARAMETER_2; - - DestinationString->Length = (WORD)(Length - 1); - - if (AllocateDestinationString == TRUE) - { - DestinationString->Buffer = RtlAllocateHeap (RtlGetProcessHeap (), - 0, - Length); - if (DestinationString->Buffer == NULL) - return STATUS_NO_MEMORY; - - RtlZeroMemory (DestinationString->Buffer, - Length); - DestinationString->MaximumLength = (WORD)Length; - } - else - { - if (Length > DestinationString->MaximumLength) - { - if (DestinationString->MaximumLength == 0) - return STATUS_BUFFER_OVERFLOW; - DestinationString->Length = - DestinationString->MaximumLength - 1; - } - } - - Status = RtlUpcaseUnicodeToOemN (DestinationString->Buffer, - DestinationString->Length, - &Size, - SourceString->Buffer, - SourceString->Length); - if (!NT_SUCCESS(Status)) - { - if (AllocateDestinationString) - { - RtlFreeHeap (RtlGetProcessHeap (), - 0, - DestinationString->Buffer); - } - return Status; - } - - DestinationString->Buffer[Size] = 0; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlUpcaseUnicodeStringToOemString ( - IN OUT POEM_STRING DestinationString, - IN PUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString - ) -{ - NTSTATUS Status; - ULONG Length; - ULONG Size; - - if (NlsMbOemCodePageTag == TRUE) - Length = RtlUnicodeStringToAnsiSize (SourceString)/* + 1*/; - else - Length = SourceString->Length / sizeof(WCHAR) + 1; - - if (Length > 0x0000FFFF) - return STATUS_INVALID_PARAMETER_2; - - DestinationString->Length = (WORD)(Length - 1); - - if (AllocateDestinationString == TRUE) - { - DestinationString->Buffer = RtlAllocateHeap (RtlGetProcessHeap (), - 0, - Length); - if (DestinationString->Buffer == NULL) - return STATUS_NO_MEMORY; - - RtlZeroMemory (DestinationString->Buffer, - Length); - DestinationString->MaximumLength = (WORD)Length; - } - else - { - if (Length > DestinationString->MaximumLength) - { - if (DestinationString->MaximumLength == 0) - return STATUS_BUFFER_OVERFLOW; - DestinationString->Length = - DestinationString->MaximumLength - 1; - } - } - - Status = RtlUpcaseUnicodeToOemN (DestinationString->Buffer, - DestinationString->Length, - &Size, - SourceString->Buffer, - SourceString->Length); - if (!NT_SUCCESS(Status)) - { - if (AllocateDestinationString) - { - RtlFreeHeap (RtlGetProcessHeap (), - 0, - DestinationString->Buffer); - } - return Status; - } - - DestinationString->Buffer[Size] = 0; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -VOID STDCALL -RtlUpperString (IN OUT PSTRING DestinationString, - IN PSTRING SourceString) -{ - ULONG Length; - ULONG i; - PCHAR Src; - PCHAR Dest; - - Length = min(SourceString->Length, DestinationString->MaximumLength - 1); - - Src = SourceString->Buffer; - Dest = DestinationString->Buffer; - for (i = 0; i < Length; i++) - { - *Dest = RtlUpperChar (*Src); - Src++; - Dest++; - } - *Dest = 0; - - DestinationString->Length = SourceString->Length; -} - - -/* - * @implemented - */ -ULONG STDCALL -RtlxAnsiStringToUnicodeSize (IN PANSI_STRING AnsiString) -{ - return RtlAnsiStringToUnicodeSize (AnsiString); -} - - -/* - * @implemented - */ -ULONG STDCALL -RtlxOemStringToUnicodeSize (IN POEM_STRING OemString) -{ - return RtlAnsiStringToUnicodeSize ((PANSI_STRING)OemString); -} - - -/* - * @implemented - */ -ULONG STDCALL -RtlxUnicodeStringToAnsiSize (IN PUNICODE_STRING UnicodeString) -{ - return RtlUnicodeStringToAnsiSize (UnicodeString); -} - - -/* - * @implemented - */ -ULONG STDCALL -RtlxUnicodeStringToOemSize (IN PUNICODE_STRING UnicodeString) -{ - return RtlUnicodeStringToAnsiSize (UnicodeString); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlDuplicateUnicodeString( - INT AddNull, - IN PUNICODE_STRING SourceString, - PUNICODE_STRING DestinationString) -{ - if (SourceString == NULL || DestinationString == NULL) - return STATUS_INVALID_PARAMETER; - - - if (SourceString->Length == 0 && AddNull != 3) - { - DestinationString->Length = 0; - DestinationString->MaximumLength = 0; - DestinationString->Buffer = NULL; - } else - { - unsigned int DestMaxLength = SourceString->Length; - - if (AddNull) - DestMaxLength += sizeof(UNICODE_NULL); - - DestinationString->Buffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, DestMaxLength); - if (DestinationString->Buffer == NULL) - return STATUS_NO_MEMORY; - - RtlCopyMemory(DestinationString->Buffer, SourceString->Buffer, SourceString->Length); - DestinationString->Length = SourceString->Length; - DestinationString->MaximumLength = DestMaxLength; - - if (AddNull) - DestinationString->Buffer[DestinationString->Length / sizeof(WCHAR)] = 0; - } - - return STATUS_SUCCESS; -} - -/* EOF */ diff --git a/reactos/lib/ntdll/rtl/version.c b/reactos/lib/ntdll/rtl/version.c deleted file mode 100644 index 778d33bdd45..00000000000 --- a/reactos/lib/ntdll/rtl/version.c +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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: version.c,v 1.1 2004/05/13 21:01:14 navaraf Exp $ - * - * PROJECT: ReactOS kernel - * PURPOSE: Runtime code - * FILE: ntoskrnl/rtl/version.c - * PROGRAMER: Filip Navara - */ - -/* INCLUDES *****************************************************************/ - -#define __USE_W32API -#include <ddk/ntddk.h> - -/* FUNCTIONS ****************************************************************/ - -NTSTATUS STDCALL -RtlGetVersion(RTL_OSVERSIONINFOW *Info) -{ - WCHAR CSDString[] = L"Service Pack 6"; - - if (Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOW) || - Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW)) - { - Info->dwMajorVersion = 4; - Info->dwMinorVersion = 0; - Info->dwBuildNumber = 1381; - Info->dwPlatformId = VER_PLATFORM_WIN32_NT; - RtlCopyMemory(Info->szCSDVersion, CSDString, sizeof(CSDString)); - if (Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW)) - { - RTL_OSVERSIONINFOEXW *InfoEx = (RTL_OSVERSIONINFOEXW *)Info; - InfoEx->wServicePackMajor = 6; - InfoEx->wServicePackMinor = 0; - InfoEx->wSuiteMask = 0; - InfoEx->wProductType = VER_NT_WORKSTATION; - } - - return STATUS_SUCCESS; - } - - return STATUS_INVALID_PARAMETER; -} - -/* EOF */ diff --git a/reactos/ntoskrnl/rtl/compress.c b/reactos/ntoskrnl/rtl/compress.c deleted file mode 100644 index 6af1577dd74..00000000000 --- a/reactos/ntoskrnl/rtl/compress.c +++ /dev/null @@ -1,229 +0,0 @@ -/* - * ReactOS kernel - * Copyright (C) 2002 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: compress.c,v 1.2 2003/07/11 01:23:15 royce Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * PURPOSE: Compression and decompression functions - * FILE: ntoskrnl/rtl/compress.c - * PROGRAMER: Eric Kohl (ekohl@zr-online.de) - */ - -/* INCLUDES *****************************************************************/ - -#include <ddk/ntddk.h> - - -/* MACROS *******************************************************************/ - -#define COMPRESSION_FORMAT_MASK 0x00FF -#define COMPRESSION_ENGINE_MASK 0xFF00 - - -/* FUNCTIONS ****************************************************************/ - - -static NTSTATUS -RtlpCompressBufferLZNT1(USHORT Engine, - PUCHAR UncompressedBuffer, - ULONG UncompressedBufferSize, - PUCHAR CompressedBuffer, - ULONG CompressedBufferSize, - ULONG UncompressedChunkSize, - PULONG FinalCompressedSize, - PVOID WorkSpace) -{ - return(STATUS_NOT_IMPLEMENTED); -} - - -static NTSTATUS -RtlpWorkSpaceSizeLZNT1(USHORT Engine, - PULONG BufferAndWorkSpaceSize, - PULONG FragmentWorkSpaceSize) -{ - if (Engine == COMPRESSION_ENGINE_STANDARD) - { - *BufferAndWorkSpaceSize = 0x8010; - *FragmentWorkSpaceSize = 0x1000; - return(STATUS_SUCCESS); - } - else if (Engine == COMPRESSION_ENGINE_MAXIMUM) - { - *BufferAndWorkSpaceSize = 0x10; - *FragmentWorkSpaceSize = 0x1000; - return(STATUS_SUCCESS); - } - - return(STATUS_NOT_SUPPORTED); -} - - - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlCompressBuffer(IN USHORT CompressionFormatAndEngine, - IN PUCHAR UncompressedBuffer, - IN ULONG UncompressedBufferSize, - OUT PUCHAR CompressedBuffer, - IN ULONG CompressedBufferSize, - IN ULONG UncompressedChunkSize, - OUT PULONG FinalCompressedSize, - IN PVOID WorkSpace) -{ - USHORT Format = CompressionFormatAndEngine & COMPRESSION_FORMAT_MASK; - USHORT Engine = CompressionFormatAndEngine & COMPRESSION_ENGINE_MASK; - - if ((Format == COMPRESSION_FORMAT_NONE) || - (Format == COMPRESSION_FORMAT_DEFAULT)) - return(STATUS_INVALID_PARAMETER); - - if (Format == COMPRESSION_FORMAT_LZNT1) - return(RtlpCompressBufferLZNT1(Engine, - UncompressedBuffer, - UncompressedBufferSize, - CompressedBuffer, - CompressedBufferSize, - UncompressedChunkSize, - FinalCompressedSize, - WorkSpace)); - - return(STATUS_UNSUPPORTED_COMPRESSION); -} - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlCompressChunks(IN PUCHAR UncompressedBuffer, - IN ULONG UncompressedBufferSize, - OUT PUCHAR CompressedBuffer, - IN ULONG CompressedBufferSize, - IN OUT PCOMPRESSED_DATA_INFO CompressedDataInfo, - IN ULONG CompressedDataInfoLength, - IN PVOID WorkSpace) -{ - return(STATUS_NOT_IMPLEMENTED); -} - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlDecompressBuffer(IN USHORT CompressionFormat, - OUT PUCHAR UncompressedBuffer, - IN ULONG UncompressedBufferSize, - IN PUCHAR CompressedBuffer, - IN ULONG CompressedBufferSize, - OUT PULONG FinalUncompressedSize) -{ - return(STATUS_NOT_IMPLEMENTED); -} - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlDecompressChunks(OUT PUCHAR UncompressedBuffer, - IN ULONG UncompressedBufferSize, - IN PUCHAR CompressedBuffer, - IN ULONG CompressedBufferSize, - IN PUCHAR CompressedTail, - IN ULONG CompressedTailSize, - IN PCOMPRESSED_DATA_INFO CompressedDataInfo) -{ - return(STATUS_NOT_IMPLEMENTED); -} - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlDecompressFragment(IN USHORT CompressionFormat, - OUT PUCHAR UncompressedFragment, - IN ULONG UncompressedFragmentSize, - IN PUCHAR CompressedBuffer, - IN ULONG CompressedBufferSize, - IN ULONG FragmentOffset, - OUT PULONG FinalUncompressedSize, - IN PVOID WorkSpace) -{ - return(STATUS_NOT_IMPLEMENTED); -} - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlDescribeChunk(IN USHORT CompressionFormat, - IN OUT PUCHAR *CompressedBuffer, - IN PUCHAR EndOfCompressedBufferPlus1, - OUT PUCHAR *ChunkBuffer, - OUT PULONG ChunkSize) -{ - return(STATUS_NOT_IMPLEMENTED); -} - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlGetCompressionWorkSpaceSize(IN USHORT CompressionFormatAndEngine, - OUT PULONG CompressBufferAndWorkSpaceSize, - OUT PULONG CompressFragmentWorkSpaceSize) -{ - USHORT Format = CompressionFormatAndEngine & COMPRESSION_FORMAT_MASK; - USHORT Engine = CompressionFormatAndEngine & COMPRESSION_ENGINE_MASK; - - if ((Format == COMPRESSION_FORMAT_NONE) || - (Format == COMPRESSION_FORMAT_DEFAULT)) - return(STATUS_INVALID_PARAMETER); - - if (Format == COMPRESSION_FORMAT_LZNT1) - return(RtlpWorkSpaceSizeLZNT1(Engine, - CompressBufferAndWorkSpaceSize, - CompressFragmentWorkSpaceSize)); - - return(STATUS_UNSUPPORTED_COMPRESSION); -} - - -/* - * @unimplemented - */ -NTSTATUS STDCALL -RtlReserveChunk(IN USHORT CompressionFormat, - IN OUT PUCHAR *CompressedBuffer, - IN PUCHAR EndOfCompressedBufferPlus1, - OUT PUCHAR *ChunkBuffer, - IN ULONG ChunkSize) -{ - return(STATUS_NOT_IMPLEMENTED); -} - -/* EOF */ diff --git a/reactos/ntoskrnl/rtl/dos8dot3.c b/reactos/ntoskrnl/rtl/dos8dot3.c deleted file mode 100644 index 19475994d0e..00000000000 --- a/reactos/ntoskrnl/rtl/dos8dot3.c +++ /dev/null @@ -1,336 +0,0 @@ -/* - * ReactOS kernel - * Copyright (C) 2002 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: dos8dot3.c,v 1.9 2003/12/08 19:47:07 hbirr Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: ntoskrnl/rtl/dos8dot3.c - * PURPOSE: Short name (8.3 name) functions - * PROGRAMMER: Eric Kohl - */ - -/* INCLUDES ******************************************************************/ - -#include <ddk/ntddk.h> -#include <ntos/minmax.h> - -#define NDEBUG -#include <internal/debug.h> - - -/* CONSTANTS *****************************************************************/ - -const PCHAR RtlpShortIllegals = " ;+=[],\"*\\<>/?:|"; - - -/* FUNCTIONS *****************************************************************/ - -static BOOLEAN -RtlpIsShortIllegal(CHAR Char) -{ - return strchr(RtlpShortIllegals, Char) ? TRUE : FALSE; -} - -static USHORT -RtlpGetCheckSum(PUNICODE_STRING Name) -{ - USHORT Hash = 0; - ULONG Length; - PWCHAR c; - - Length = Name->Length / sizeof(WCHAR); - c = Name->Buffer; - while(Length--) - { - Hash = (Hash + (*c << 4) + (*c >> 4)) * 11; - c++; - } - return Hash; -} - -static ULONG -RtlpGetIndexLength(ULONG Index) -{ - ULONG Length = 0; - while (Index) - { - Index /= 10; - Length++; - } - return Length ? Length : 1; -} - - -/* - * @implemented - */ -VOID STDCALL -RtlGenerate8dot3Name(IN PUNICODE_STRING Name, - IN BOOLEAN AllowExtendedCharacters, - IN OUT PGENERATE_NAME_CONTEXT Context, - OUT PUNICODE_STRING Name8dot3) -{ - ULONG Count; - WCHAR NameBuffer[8]; - WCHAR ExtBuffer[4]; - ULONG StrLength; - ULONG NameLength; - ULONG ExtLength; - ULONG CopyLength; - ULONG DotPos; - ULONG i, j; - ULONG IndexLength; - ULONG CurrentIndex; - USHORT Checksum; - CHAR c; - - StrLength = Name->Length / sizeof(WCHAR); - DPRINT("StrLength: %hu\n", StrLength); - - /* Find last dot in Name */ - DotPos = 0; - for (i = 0; i < StrLength; i++) - { - if (Name->Buffer[i] == L'.') - { - DotPos = i; - } - } - - if (DotPos == 0) - { - DotPos = i; - } - DPRINT("DotPos: %hu\n", DotPos); - - /* Copy name (6 valid characters max) */ - for (i = 0, NameLength = 0; NameLength < 6 && i < DotPos; i++) - { - c = 0; - RtlUpcaseUnicodeToOemN(&c, sizeof(CHAR), &Count, &Name->Buffer[i], sizeof(WCHAR)); - if (Count != 1 || c == 0 || RtlpIsShortIllegal(c)) - { - NameBuffer[NameLength++] = L'_'; - } - else if (c != '.') - { - NameBuffer[NameLength++] = (WCHAR)c; - } - } - - DPRINT("NameBuffer: '%.08S'\n", NameBuffer); - DPRINT("NameLength: %hu\n", NameLength); - - /* Copy extension (4 valid characters max) */ - if (DotPos < StrLength) - { - for (i = DotPos, ExtLength = 0; ExtLength < 4 && i < StrLength; i++) - { - c = 0; - RtlUpcaseUnicodeToOemN(&c, sizeof(CHAR), &Count, &Name->Buffer[i], sizeof(WCHAR)); - if (Count != 1 || c == 0 || RtlpIsShortIllegal(Name->Buffer[i])) - { - ExtBuffer[ExtLength++] = L'_'; - } - else - { - ExtBuffer[ExtLength++] = c; - } - } - } - else - { - ExtLength = 0; - } - DPRINT("ExtBuffer: '%.04S'\n", ExtBuffer); - DPRINT("ExtLength: %hu\n", ExtLength); - - /* Determine next index */ - IndexLength = RtlpGetIndexLength(Context->LastIndexValue); - if (Context->CheckSumInserted) - { - CopyLength = min(NameLength, 8 - 4 - 1 - IndexLength); - Checksum = RtlpGetCheckSum(Name); - } - else - { - CopyLength = min(NameLength, 8 - 1 - IndexLength); - Checksum = 0; - } - - DPRINT("CopyLength: %hu\n", CopyLength); - - if ((Context->NameLength == CopyLength) && - (wcsncmp(Context->NameBuffer, NameBuffer, CopyLength) == 0) && - (Context->ExtensionLength == ExtLength) && - (wcsncmp(Context->ExtensionBuffer, ExtBuffer, ExtLength) == 0) && - (Checksum == Context->Checksum) && - (Context->LastIndexValue < 999)) - { - CHECKPOINT; - Context->LastIndexValue++; - if (Context->CheckSumInserted == FALSE && - Context->LastIndexValue > 9) - { - Context->CheckSumInserted = TRUE; - Context->LastIndexValue = 1; - Context->Checksum = RtlpGetCheckSum(Name); - } - } - else - { - CHECKPOINT; - Context->LastIndexValue = 1; - Context->CheckSumInserted = FALSE; - } - - IndexLength = RtlpGetIndexLength(Context->LastIndexValue); - - DPRINT("CurrentIndex: %hu, IndexLength %hu\n", Context->LastIndexValue, IndexLength); - - if (Context->CheckSumInserted) - { - CopyLength = min(NameLength, 8 - 4 - 1 - IndexLength); - } - else - { - CopyLength = min(NameLength, 8 - 1 - IndexLength); - } - - /* Build the short name */ - memcpy(Name8dot3->Buffer, NameBuffer, CopyLength * sizeof(WCHAR)); - j = CopyLength; - if (Context->CheckSumInserted) - { - j += 3; - Checksum = Context->Checksum; - for (i = 0; i < 4; i++) - { - Name8dot3->Buffer[j--] = (Checksum % 16) > 9 ? (Checksum % 16) + L'A' - 10 : (Checksum % 16) + L'0'; - Checksum /= 16; - } - j = CopyLength + 4; - } - Name8dot3->Buffer[j++] = L'~'; - j += IndexLength - 1; - CurrentIndex = Context->LastIndexValue; - for (i = 0; i < IndexLength; i++) - { - Name8dot3->Buffer[j--] = (CurrentIndex % 10) + L'0'; - CurrentIndex /= 10; - } - j += IndexLength + 1; - - memcpy(Name8dot3->Buffer + j, ExtBuffer, ExtLength * sizeof(WCHAR)); - Name8dot3->Length = (j + ExtLength) * sizeof(WCHAR); - - DPRINT("Name8dot3: '%wZ'\n", Name8dot3); - - /* Update context */ - Context->NameLength = CopyLength; - Context->ExtensionLength = ExtLength; - memcpy(Context->NameBuffer, NameBuffer, CopyLength * sizeof(WCHAR)); - memcpy(Context->ExtensionBuffer, ExtBuffer, ExtLength * sizeof(WCHAR)); -} - - -/* - * @implemented - */ -BOOLEAN STDCALL -RtlIsNameLegalDOS8Dot3(IN PUNICODE_STRING UnicodeName, - IN PANSI_STRING AnsiName, - OUT PBOOLEAN SpacesFound) -{ - PANSI_STRING name = AnsiName; - ANSI_STRING DummyString; - CHAR Buffer[12]; - char *str; - ULONG Length; - ULONG i; - NTSTATUS Status; - BOOLEAN HasSpace = FALSE; - BOOLEAN HasDot = FALSE; - - if (UnicodeName->Length > 24) - { - return(FALSE); /* name too long */ - } - - if (!name) - { - name = &DummyString; - name->Length = 0; - name->MaximumLength = 12; - name->Buffer = Buffer; - } - - Status = RtlUpcaseUnicodeStringToCountedOemString(name, - UnicodeName, - FALSE); - if (!NT_SUCCESS(Status)) - { - return(FALSE); - } - - Length = name->Length; - str = name->Buffer; - - if (!(Length == 1 && *str == '.') && - !(Length == 2 && *str == '.' && *(str + 1) == '.')) - { - for (i = 0; i < Length; i++, str++) - { - switch (*str) - { - case ' ': - HasSpace = TRUE; - break; - - case '.': - if ((HasDot) || /* two or more dots */ - (i == 0) || /* dot is first char */ - (i + 1 == Length) || /* dot is last char */ - (Length - i > 4) || /* more than 3 chars of extension */ - (HasDot == FALSE && i > 8)) /* name is longer than 8 chars */ - return(FALSE); - HasDot = TRUE; - break; - default: - if (RtlpIsShortIllegal(*str)) - { - return(FALSE); - } - } - } - } - - /* Name is longer than 8 chars and does not have an extension */ - if (Length > 8 && HasDot == FALSE) - { - return(FALSE); - } - - if (SpacesFound) - *SpacesFound = HasSpace; - - return(TRUE); -} - -/* EOF */ diff --git a/reactos/ntoskrnl/rtl/error.c b/reactos/ntoskrnl/rtl/error.c deleted file mode 100644 index 76393dfe531..00000000000 --- a/reactos/ntoskrnl/rtl/error.c +++ /dev/null @@ -1,989 +0,0 @@ -/* $Id: error.c,v 1.13 2004/05/15 16:29:55 gvg Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * PURPOSE: Rtl error functions - * FILE: lib/ntdll/rtl/error.c - * PROGRAMER: Eric Kohl - * REVISION HISTORY: - * 22/07/99: Added RtlNtStatusToDosError. - * 1999-11-30: Added RtlNtStatusToPsxErrno. - * 1999-12-18: STDCALL RtlNtStatusToDosError - */ - -/* - * Partially taken from WINE, original copyright: - * - * Copyright 2000 Alexandre Julliard - */ - -/* INCLUDES *****************************************************************/ - -#include <ddk/ntddk.h> -#include <errors.h> - -#define NDEBUG -#include <internal/debug.h> - -#ifndef HIWORD -#define HIWORD(l) ((WORD)(((DWORD)(l) >> 16) & 0xFFFF)) -#endif -#ifndef LOWORD -#define LOWORD(l) ((WORD)(l)) -#endif - -/* TYPES *******************************************************************/ - -typedef struct _ERROR_TABLE -{ - ULONG Start; - ULONG End; - const WORD *Table; -} ERROR_TABLE, *PERROR_TABLE; - - -/* FUNCTIONS ***************************************************************/ - -static const WORD table_00000103[11] = -{ - ERROR_IO_PENDING, /* 00000103 (STATUS_PENDING) */ - ERROR_MR_MID_NOT_FOUND, /* 00000104 (STATUS_REPARSE) */ - ERROR_MORE_DATA, /* 00000105 (STATUS_MORE_ENTRIES) */ - ERROR_NOT_ALL_ASSIGNED, /* 00000106 (STATUS_NOT_ALL_ASSIGNED) */ - ERROR_SOME_NOT_MAPPED, /* 00000107 (STATUS_SOME_NOT_MAPPED) */ - ERROR_MR_MID_NOT_FOUND, /* 00000108 (STATUS_OPLOCK_BREAK_IN_PROCESS) */ - ERROR_MR_MID_NOT_FOUND, /* 00000109 (STATUS_VOLUME_MOUNTED) */ - ERROR_MR_MID_NOT_FOUND, /* 0000010a (STATUS_RXACT_COMMITTED) */ - ERROR_MR_MID_NOT_FOUND, /* 0000010b (STATUS_NOTIFY_CLEANUP) */ - ERROR_NOTIFY_ENUM_DIR, /* 0000010c (STATUS_NOTIFY_ENUM_DIR) */ - ERROR_NO_QUOTAS_FOR_ACCOUNT /* 0000010d (STATUS_NO_QUOTAS_FOR_ACCOUNT) */ -// /* 0000010e (STATUS_PRIMARY_TRANSPORT_CONNECT_FAILED) */ -}; - -static const WORD table_40000002[12] = -{ - ERROR_INVALID_PARAMETER, /* 40000002 */ - ERROR_MR_MID_NOT_FOUND, /* 40000003 */ - ERROR_MR_MID_NOT_FOUND, /* 40000004 */ - ERROR_MR_MID_NOT_FOUND, /* 40000005 */ - ERROR_LOCAL_USER_SESSION_KEY, /* 40000006 (STATUS_LOCAL_USER_SESSION_KEY) */ - ERROR_MR_MID_NOT_FOUND, /* 40000007 */ - ERROR_MORE_WRITES, /* 40000008 (STATUS_SERIAL_MORE_WRITES) */ - ERROR_REGISTRY_RECOVERED, /* 40000009 (STATUS_REGISTRY_RECOVERED) */ - ERROR_MR_MID_NOT_FOUND, /* 4000000a */ - ERROR_MR_MID_NOT_FOUND, /* 4000000b */ - ERROR_COUNTER_TIMEOUT, /* 4000000c (STATUS_SERIAL_COUNTER_TIMEOUT) */ - ERROR_NULL_LM_PASSWORD /* 4000000d (STATUS_NULL_LM_PASSWORD) */ -}; - -static const WORD table_40020056[1] = -{ - RPC_S_UUID_LOCAL_ONLY /* 40020056 */ -}; - -static const WORD table_400200af[1] = -{ - RPC_S_SEND_INCOMPLETE /* 400200af */ -}; - -static const WORD table_80000001[38] = -{ - 0, /* 80000001 (STATUS_GUARD_PAGE_VIOLATION) */ - ERROR_NOACCESS, /* 80000002 (STATUS_DATATYPE_MISALIGNMENT) */ - 0, /* 80000003 (STATUS_BREAKPOINT) */ - 0, /* 80000004 (STATUS_SINGLE_STEP) */ - ERROR_MORE_DATA, /* 80000005 (STATUS_BUFFER_OVERFLOW) */ - ERROR_NO_MORE_FILES, /* 80000006 (STATUS_NO_MORE_FILES) */ - ERROR_MR_MID_NOT_FOUND, /* 80000007 (STATUS_WAKE_SYSTEM_DEBUGGER) */ - ERROR_MR_MID_NOT_FOUND, /* 80000008 */ - ERROR_MR_MID_NOT_FOUND, /* 80000009 */ - ERROR_MR_MID_NOT_FOUND, /* 8000000a (STATUS_HANDLES_CLOSED) */ - ERROR_NO_INHERITANCE, /* 8000000b (STATUS_NO_INHERITANCE) */ - ERROR_MR_MID_NOT_FOUND, /* 8000000c (STATUS_GUID_SUBSTITUTION_MADE) */ - ERROR_PARTIAL_COPY, /* 8000000d (STATUS_PARTIAL_COPY) */ - ERROR_OUT_OF_PAPER, /* 8000000e (STATUS_DEVICE_PAPER_EMPTY) */ - ERROR_NOT_READY, /* 8000000f (STATUS_DEVICE_POWERED_OFF) */ - ERROR_NOT_READY, /* 80000010 (STATUS_DEVICE_OFF_LINE) */ - ERROR_BUSY, /* 80000011 (STATUS_DEVICE_BUSY) */ - ERROR_NO_MORE_ITEMS, /* 80000012 (STATUS_NO_MORE_EAS) */ - ERROR_INVALID_EA_NAME, /* 80000013 (STATUS_INVALID_EA_NAME) */ - ERROR_EA_LIST_INCONSISTENT, /* 80000014 (STATUS_EA_LIST_INCONSISTENT) */ - ERROR_EA_LIST_INCONSISTENT, /* 80000015 (STATUS_INVALID_EA_FLAG) */ - ERROR_MEDIA_CHANGED, /* 80000016 (STATUS_VERIFY_REQUIRED) */ - ERROR_MR_MID_NOT_FOUND, /* 80000017 (STATUS_EXTRANEOUS_INFORMATION) */ - ERROR_MR_MID_NOT_FOUND, /* 80000018 (STATUS_RXACT_COMMIT_NECESSARY) */ - ERROR_MR_MID_NOT_FOUND, /* 80000019 */ - ERROR_NO_MORE_ITEMS, /* 8000001a (STATUS_NO_MORE_ENTRIES) */ - ERROR_FILEMARK_DETECTED, /* 8000001b (STATUS_FILEMARK_DETECTED) */ - ERROR_MEDIA_CHANGED, /* 8000001c (STATUS_MEDIA_CHANGED) */ - ERROR_BUS_RESET, /* 8000001d (STATUS_BUS_RESET) */ - ERROR_END_OF_MEDIA, /* 8000001e (STATUS_END_OF_MEDIA) */ - ERROR_BEGINNING_OF_MEDIA, /* 8000001f (STATUS_BEGINNING_OF_MEDIA) */ - ERROR_MR_MID_NOT_FOUND, /* 80000020 (STATUS_MEDIA_CHECK) */ - ERROR_SETMARK_DETECTED, /* 80000021 (STATUS_SETMARK_DETECTED) */ - ERROR_NO_DATA_DETECTED, /* 80000022 (STATUS_NO_DATA_DETECTED) */ - ERROR_MR_MID_NOT_FOUND, /* 80000023 (STATUS_REDIRECTOR_HAS_OPEN_HANDLES) */ - ERROR_MR_MID_NOT_FOUND, /* 80000024 (STATUS_SERVER_HAS_OPEN_HANDLES) */ - ERROR_ACTIVE_CONNECTIONS, /* 80000025 (STATUS_ALREADY_DISCONNECTED) */ - ERROR_MR_MID_NOT_FOUND /* 80000026 (STATUS_LONGJUMP) */ -}; - -static const WORD table_80090300[23] = -{ - ERROR_NO_SYSTEM_RESOURCES, /* 80090300 */ - ERROR_INVALID_HANDLE, /* 80090301 */ - ERROR_INVALID_FUNCTION, /* 80090302 */ - ERROR_BAD_NETPATH, /* 80090303 */ - ERROR_INTERNAL_ERROR, /* 80090304 */ - ERROR_NO_SUCH_PACKAGE, /* 80090305 */ - ERROR_NOT_OWNER, /* 80090306 */ - ERROR_NO_SUCH_PACKAGE, /* 80090307 */ - ERROR_INVALID_PARAMETER, /* 80090308 */ - ERROR_INVALID_PARAMETER, /* 80090309 */ - ERROR_NOT_SUPPORTED, /* 8009030a */ - ERROR_CANNOT_IMPERSONATE, /* 8009030b */ - ERROR_LOGON_FAILURE, /* 8009030c */ - ERROR_INVALID_PARAMETER, /* 8009030d */ - ERROR_NO_SUCH_LOGON_SESSION, /* 8009030e */ - ERROR_ACCESS_DENIED, /* 8009030f */ - ERROR_ACCESS_DENIED, /* 80090310 */ - ERROR_NO_LOGON_SERVERS, /* 80090311 */ - ERROR_MR_MID_NOT_FOUND, /* 80090312 */ - ERROR_MR_MID_NOT_FOUND, /* 80090313 */ - ERROR_MR_MID_NOT_FOUND, /* 80090314 */ - ERROR_MR_MID_NOT_FOUND, /* 80090315 */ - ERROR_NO_SUCH_PACKAGE /* 80090316 */ -}; - -static const WORD table_c0000001[411] = -{ - ERROR_GEN_FAILURE, /* c0000001 (STATUS_UNSUCCESSFUL) */ - ERROR_INVALID_FUNCTION, /* c0000002 (STATUS_NOT_IMPLEMENTED) */ - ERROR_INVALID_PARAMETER, /* c0000003 (STATUS_INVALID_INFO_CLASS) */ - ERROR_BAD_LENGTH, /* c0000004 (STATUS_INFO_LENGTH_MISMATCH) */ - ERROR_NOACCESS, /* c0000005 (STATUS_ACCESS_VIOLATION) */ - ERROR_SWAPERROR, /* c0000006 (STATUS_IN_PAGE_ERROR) */ - ERROR_PAGEFILE_QUOTA, /* c0000007 (STATUS_PAGEFILE_QUOTA) */ - ERROR_INVALID_HANDLE, /* c0000008 (STATUS_INVALID_HANDLE) */ - ERROR_STACK_OVERFLOW, /* c0000009 (STATUS_BAD_INITIAL_STACK) */ - ERROR_BAD_EXE_FORMAT, /* c000000a (STATUS_BAD_INITIAL_PC) */ - ERROR_INVALID_PARAMETER, /* c000000b (STATUS_INVALID_CID) */ - ERROR_MR_MID_NOT_FOUND, /* c000000c (STATUS_TIMER_NOT_CANCELED) */ - ERROR_INVALID_PARAMETER, /* c000000d (STATUS_INVALID_PARAMETER) */ - ERROR_FILE_NOT_FOUND, /* c000000e (STATUS_NO_SUCH_DEVICE) */ - ERROR_FILE_NOT_FOUND, /* c000000f (STATUS_NO_SUCH_FILE) */ - ERROR_INVALID_FUNCTION, /* c0000010 (STATUS_INVALID_DEVICE_REQUEST) */ - ERROR_HANDLE_EOF, /* c0000011 (STATUS_END_OF_FILE) */ - ERROR_WRONG_DISK, /* c0000012 (STATUS_WRONG_VOLUME) */ - ERROR_NOT_READY, /* c0000013 (STATUS_NO_MEDIA_IN_DEVICE) */ - ERROR_UNRECOGNIZED_MEDIA, /* c0000014 (STATUS_UNRECOGNIZED_MEDIA) */ - ERROR_SECTOR_NOT_FOUND, /* c0000015 (STATUS_NONEXISTENT_SECTOR) */ - ERROR_MORE_DATA, /* c0000016 (STATUS_MORE_PROCESSING_REQUIRED) */ - ERROR_NOT_ENOUGH_MEMORY, /* c0000017 (STATUS_NO_MEMORY) */ - ERROR_INVALID_ADDRESS, /* c0000018 (STATUS_CONFLICTING_ADDRESSES) */ - ERROR_INVALID_ADDRESS, /* c0000019 (STATUS_NOT_MAPPED_VIEW) */ - ERROR_INVALID_PARAMETER, /* c000001a (STATUS_UNABLE_TO_FREE_VM) */ - ERROR_INVALID_PARAMETER, /* c000001b (STATUS_UNABLE_TO_DELETE_SECTION) */ - ERROR_INVALID_FUNCTION, /* c000001c (STATUS_INVALID_SYSTEM_SERVICE) */ - 0, /* c000001d (STATUS_ILLEGAL_INSTRUCTION) */ - ERROR_ACCESS_DENIED, /* c000001e (STATUS_INVALID_LOCK_SEQUENCE) */ - ERROR_ACCESS_DENIED, /* c000001f (STATUS_INVALID_VIEW_SIZE) */ - ERROR_BAD_EXE_FORMAT, /* c0000020 (STATUS_INVALID_FILE_FOR_SECTION) */ - ERROR_ACCESS_DENIED, /* c0000021 (STATUS_ALREADY_COMMITTED) */ - ERROR_ACCESS_DENIED, /* c0000022 (STATUS_ACCESS_DENIED) */ - ERROR_INSUFFICIENT_BUFFER, /* c0000023 (STATUS_BUFFER_TOO_SMALL) */ - ERROR_INVALID_HANDLE, /* c0000024 (STATUS_OBJECT_TYPE_MISMATCH) */ - 0, /* c0000025 (STATUS_NONCONTINUABLE_EXCEPTION) */ - 0, /* c0000026 (STATUS_INVALID_DISPOSITION) */ - ERROR_MR_MID_NOT_FOUND, /* c0000027 (STATUS_UNWIND) */ - ERROR_MR_MID_NOT_FOUND, /* c0000028 (STATUS_BAD_STACK) */ - ERROR_MR_MID_NOT_FOUND, /* c0000029 (STATUS_INVALID_UNWIND_TARGET) */ - ERROR_NOT_LOCKED, /* c000002a (STATUS_NOT_LOCKED) */ - 0, /* c000002b (STATUS_PARITY_ERROR) */ - ERROR_INVALID_ADDRESS, /* c000002c (STATUS_UNABLE_TO_DECOMMIT_VM) */ - ERROR_INVALID_ADDRESS, /* c000002d (STATUS_NOT_COMMITTED) */ - ERROR_MR_MID_NOT_FOUND, /* c000002e (STATUS_INVALID_PORT_ATTRIBUTES) */ - ERROR_MR_MID_NOT_FOUND, /* c000002f (STATUS_PORT_MESSAGE_TOO_LONG) */ - ERROR_INVALID_PARAMETER, /* c0000030 (STATUS_INVALID_PARAMETER_MIX) */ - ERROR_MR_MID_NOT_FOUND, /* c0000031 (STATUS_INVALID_QUOTA_LOWER) */ - ERROR_DISK_CORRUPT, /* c0000032 (STATUS_DISK_CORRUPT_ERROR) */ - ERROR_INVALID_NAME, /* c0000033 (STATUS_OBJECT_NAME_INVALID) */ - ERROR_FILE_NOT_FOUND, /* c0000034 (STATUS_OBJECT_NAME_NOT_FOUND) */ - ERROR_ALREADY_EXISTS, /* c0000035 (STATUS_OBJECT_NAME_COLLISION) */ - ERROR_MR_MID_NOT_FOUND, /* c0000036 */ - ERROR_INVALID_HANDLE, /* c0000037 (STATUS_PORT_DISCONNECTED) */ - ERROR_MR_MID_NOT_FOUND, /* c0000038 (STATUS_DEVICE_ALREADY_ATTACHED) */ - ERROR_BAD_PATHNAME, /* c0000039 (STATUS_OBJECT_PATH_INVALID) */ - ERROR_PATH_NOT_FOUND, /* c000003a (STATUS_OBJECT_PATH_NOT_FOUND) */ - ERROR_BAD_PATHNAME, /* c000003b (STATUS_PATH_SYNTAX_BAD) */ - ERROR_IO_DEVICE, /* c000003c (STATUS_DATA_OVERRUN) */ - ERROR_IO_DEVICE, /* c000003d (STATUS_DATA_LATE_ERROR) */ - ERROR_CRC, /* c000003e (STATUS_DATA_ERROR) */ - ERROR_CRC, /* c000003f (STATUS_CRC_ERROR) */ - ERROR_NOT_ENOUGH_MEMORY, /* c0000040 (STATUS_SECTION_TOO_BIG) */ - ERROR_ACCESS_DENIED, /* c0000041 (STATUS_PORT_CONNECTION_REFUSED) */ - ERROR_INVALID_HANDLE, /* c0000042 (STATUS_INVALID_PORT_HANDLE) */ - ERROR_SHARING_VIOLATION, /* c0000043 (STATUS_SHARING_VIOLATION) */ - ERROR_NOT_ENOUGH_QUOTA, /* c0000044 (STATUS_QUOTA_EXCEEDED) */ - ERROR_INVALID_PARAMETER, /* c0000045 (STATUS_INVALID_PAGE_PROTECTION) */ - ERROR_NOT_OWNER, /* c0000046 (STATUS_MUTANT_NOT_OWNED) */ - ERROR_TOO_MANY_POSTS, /* c0000047 (STATUS_SEMAPHORE_LIMIT_EXCEEDED) */ - ERROR_INVALID_PARAMETER, /* c0000048 (STATUS_PORT_ALREADY_SET) */ - ERROR_INVALID_PARAMETER, /* c0000049 (STATUS_SECTION_NOT_IMAGE) */ - ERROR_SIGNAL_REFUSED, /* c000004a (STATUS_SUSPEND_COUNT_EXCEEDED) */ - ERROR_ACCESS_DENIED, /* c000004b (STATUS_THREAD_IS_TERMINATING) */ - ERROR_INVALID_PARAMETER, /* c000004c (STATUS_BAD_WORKING_SET_LIMIT) */ - ERROR_INVALID_PARAMETER, /* c000004d (STATUS_INCOMPATIBLE_FILE_MAP) */ - ERROR_INVALID_PARAMETER, /* c000004e (STATUS_SECTION_PROTECTION) */ - ERROR_MR_MID_NOT_FOUND, /* c000004f (STATUS_EAS_NOT_SUPPORTED) */ - ERROR_EA_LIST_INCONSISTENT, /* c0000050 (STATUS_EA_TOO_LARGE) */ - ERROR_FILE_CORRUPT, /* c0000051 (STATUS_NONEXISTENT_EA_ENTRY) */ - ERROR_FILE_CORRUPT, /* c0000052 (STATUS_NO_EAS_ON_FILE) */ - ERROR_FILE_CORRUPT, /* c0000053 (STATUS_EA_CORRUPT_ERROR) */ - ERROR_LOCK_VIOLATION, /* c0000054 (STATUS_LOCK_NOT_GRANTED) */ - ERROR_LOCK_VIOLATION, /* c0000055 (STATUS_FILE_LOCK_CONFLICT) */ - ERROR_ACCESS_DENIED, /* c0000056 (STATUS_DELETE_PENDING) */ - ERROR_NOT_SUPPORTED, /* c0000057 (STATUS_CTL_FILE_NOT_SUPPORTED) */ - ERROR_UNKNOWN_REVISION, /* c0000058 (STATUS_UNKNOWN_REVISION) */ - ERROR_REVISION_MISMATCH, /* c0000059 (STATUS_REVISION_MISMATCH) */ - ERROR_INVALID_OWNER, /* c000005a (STATUS_INVALID_OWNER) */ - ERROR_INVALID_PRIMARY_GROUP, /* c000005b (STATUS_INVALID_PRIMARY_GROUP) */ - ERROR_NO_IMPERSONATION_TOKEN, /* c000005c (STATUS_NO_IMPERSONATION_TOKEN) */ - ERROR_CANT_DISABLE_MANDATORY, /* c000005d (STATUS_CANT_DISABLE_MANDATORY) */ - ERROR_NO_LOGON_SERVERS, /* c000005e (STATUS_NO_LOGON_SERVERS) */ - ERROR_NO_SUCH_LOGON_SESSION, /* c000005f (STATUS_NO_SUCH_LOGON_SESSION) */ - ERROR_NO_SUCH_PRIVILEGE, /* c0000060 (STATUS_NO_SUCH_PRIVILEGE) */ - ERROR_PRIVILEGE_NOT_HELD, /* c0000061 (STATUS_PRIVILEGE_NOT_HELD) */ - ERROR_INVALID_ACCOUNT_NAME, /* c0000062 (STATUS_INVALID_ACCOUNT_NAME) */ - ERROR_USER_EXISTS, /* c0000063 (STATUS_USER_EXISTS) */ - ERROR_NO_SUCH_USER, /* c0000064 (STATUS_NO_SUCH_USER) */ - ERROR_GROUP_EXISTS, /* c0000065 (STATUS_GROUP_EXISTS) */ - ERROR_NO_SUCH_GROUP, /* c0000066 (STATUS_NO_SUCH_GROUP) */ - ERROR_MEMBER_IN_GROUP, /* c0000067 (STATUS_MEMBER_IN_GROUP) */ - ERROR_MEMBER_NOT_IN_GROUP, /* c0000068 (STATUS_MEMBER_NOT_IN_GROUP) */ - ERROR_LAST_ADMIN, /* c0000069 (STATUS_LAST_ADMIN) */ - ERROR_INVALID_PASSWORD, /* c000006a (STATUS_WRONG_PASSWORD) */ - ERROR_ILL_FORMED_PASSWORD, /* c000006b (STATUS_ILL_FORMED_PASSWORD) */ - ERROR_PASSWORD_RESTRICTION, /* c000006c (STATUS_PASSWORD_RESTRICTION) */ - ERROR_LOGON_FAILURE, /* c000006d (STATUS_LOGON_FAILURE) */ - ERROR_ACCOUNT_RESTRICTION, /* c000006e (STATUS_ACCOUNT_RESTRICTION) */ - ERROR_INVALID_LOGON_HOURS, /* c000006f (STATUS_INVALID_LOGON_HOURS) */ - ERROR_INVALID_WORKSTATION, /* c0000070 (STATUS_INVALID_WORKSTATION) */ - ERROR_PASSWORD_EXPIRED, /* c0000071 (STATUS_PASSWORD_EXPIRED) */ - ERROR_ACCOUNT_DISABLED, /* c0000072 (STATUS_ACCOUNT_DISABLED) */ - ERROR_NONE_MAPPED, /* c0000073 (STATUS_NONE_MAPPED) */ - ERROR_TOO_MANY_LUIDS_REQUESTED, /* c0000074 (STATUS_TOO_MANY_LUIDS_REQUESTED) */ - ERROR_LUIDS_EXHAUSTED, /* c0000075 (STATUS_LUIDS_EXHAUSTED) */ - ERROR_INVALID_SUB_AUTHORITY, /* c0000076 (STATUS_INVALID_SUB_AUTHORITY) */ - ERROR_INVALID_ACL, /* c0000077 (STATUS_INVALID_ACL) */ - ERROR_INVALID_SID, /* c0000078 (STATUS_INVALID_SID) */ - ERROR_INVALID_SECURITY_DESCR, /* c0000079 (STATUS_INVALID_SECURITY_DESCR) */ - ERROR_PROC_NOT_FOUND, /* c000007a (STATUS_PROCEDURE_NOT_FOUND) */ - ERROR_BAD_EXE_FORMAT, /* c000007b (STATUS_INVALID_IMAGE_FORMAT) */ - ERROR_NO_TOKEN, /* c000007c (STATUS_NO_TOKEN) */ - ERROR_BAD_INHERITANCE_ACL, /* c000007d (STATUS_BAD_INHERITANCE_ACL) */ - ERROR_NOT_LOCKED, /* c000007e (STATUS_RANGE_NOT_LOCKED) */ - ERROR_DISK_FULL, /* c000007f (STATUS_DISK_FULL) */ - ERROR_SERVER_DISABLED, /* c0000080 (STATUS_SERVER_DISABLED) */ - ERROR_SERVER_NOT_DISABLED, /* c0000081 (STATUS_SERVER_NOT_DISABLED) */ - ERROR_TOO_MANY_NAMES, /* c0000082 (STATUS_TOO_MANY_GUIDS_REQUESTED) */ - ERROR_NO_MORE_ITEMS, /* c0000083 (STATUS_GUIDS_EXHAUSTED) */ - ERROR_INVALID_ID_AUTHORITY, /* c0000084 (STATUS_INVALID_ID_AUTHORITY) */ - ERROR_NO_MORE_ITEMS, /* c0000085 (STATUS_AGENTS_EXHAUSTED) */ - ERROR_LABEL_TOO_LONG, /* c0000086 (STATUS_INVALID_VOLUME_LABEL) */ - ERROR_OUTOFMEMORY, /* c0000087 (STATUS_SECTION_NOT_EXTENDED) */ - ERROR_INVALID_ADDRESS, /* c0000088 (STATUS_NOT_MAPPED_DATA) */ - ERROR_RESOURCE_DATA_NOT_FOUND, /* c0000089 (STATUS_RESOURCE_DATA_NOT_FOUND) */ - ERROR_RESOURCE_TYPE_NOT_FOUND, /* c000008a (STATUS_RESOURCE_TYPE_NOT_FOUND) */ - ERROR_RESOURCE_NAME_NOT_FOUND, /* c000008b (STATUS_RESOURCE_NAME_NOT_FOUND) */ - 0, /* c000008c (STATUS_ARRAY_BOUNDS_EXCEEDED) */ - 0, /* c000008d (STATUS_FLOAT_DENORMAL_OPERAND) */ - 0, /* c000008e (STATUS_FLOAT_DIVIDE_BY_ZERO) */ - 0, /* c000008f (STATUS_FLOAT_INEXACT_RESULT) */ - 0, /* c0000090 (STATUS_FLOAT_INVALID_OPERATION) */ - 0, /* c0000091 (STATUS_FLOAT_OVERFLOW) */ - 0, /* c0000092 (STATUS_FLOAT_STACK_CHECK) */ - 0, /* c0000093 (STATUS_FLOAT_UNDERFLOW) */ - 0, /* c0000094 (STATUS_INTEGER_DIVIDE_BY_ZERO) */ - ERROR_ARITHMETIC_OVERFLOW, /* c0000095 (STATUS_INTEGER_OVERFLOW) */ - 0, /* c0000096 (STATUS_PRIVILEGED_INSTRUCTION) */ - ERROR_NOT_ENOUGH_MEMORY, /* c0000097 (STATUS_TOO_MANY_PAGING_FILES) */ - ERROR_FILE_INVALID, /* c0000098 (STATUS_FILE_INVALID) */ - ERROR_ALLOTTED_SPACE_EXCEEDED, /* c0000099 (STATUS_ALLOTTED_SPACE_EXCEEDED) */ - ERROR_NO_SYSTEM_RESOURCES, /* c000009a (STATUS_INSUFFICIENT_RESOURCES) */ - ERROR_PATH_NOT_FOUND, /* c000009b (STATUS_DFS_EXIT_PATH_FOUND) */ - ERROR_CRC, /* c000009c (STATUS_DEVICE_DATA_ERROR) */ - ERROR_NOT_READY, /* c000009d (STATUS_DEVICE_NOT_CONNECTED) */ - ERROR_NOT_READY, /* c000009e (STATUS_DEVICE_POWER_FAILURE) */ - ERROR_INVALID_ADDRESS, /* c000009f (STATUS_FREE_VM_NOT_AT_BASE) */ - ERROR_INVALID_ADDRESS, /* c00000a0 (STATUS_MEMORY_NOT_ALLOCATED) */ - ERROR_WORKING_SET_QUOTA, /* c00000a1 (STATUS_WORKING_SET_QUOTA) */ - ERROR_WRITE_PROTECT, /* c00000a2 (STATUS_MEDIA_WRITE_PROTECTED) */ - ERROR_NOT_READY, /* c00000a3 (STATUS_DEVICE_NOT_READY) */ - ERROR_INVALID_GROUP_ATTRIBUTES, /* c00000a4 (STATUS_INVALID_GROUP_ATTRIBUTES) */ - ERROR_BAD_IMPERSONATION_LEVEL, /* c00000a5 (STATUS_BAD_IMPERSONATION_LEVEL) */ - ERROR_CANT_OPEN_ANONYMOUS, /* c00000a6 (STATUS_CANT_OPEN_ANONYMOUS) */ - ERROR_BAD_VALIDATION_CLASS, /* c00000a7 (STATUS_BAD_VALIDATION_CLASS) */ - ERROR_BAD_TOKEN_TYPE, /* c00000a8 (STATUS_BAD_TOKEN_TYPE)*/ - ERROR_MR_MID_NOT_FOUND, /* c00000a9 (STATUS_BAD_MASTER_BOOT_RECORD) */ - ERROR_MR_MID_NOT_FOUND, /* c00000aa (STATUS_INSTRUCTION_MISALIGNMENT) */ - ERROR_PIPE_BUSY, /* c00000ab (STATUS_INSTANCE_NOT_AVAILABLE) */ - ERROR_PIPE_BUSY, /* c00000ac (STATUS_PIPE_NOT_AVAILABLE) */ - ERROR_BAD_PIPE, /* c00000ad (STATUS_INVALID_PIPE_STATE) */ - ERROR_PIPE_BUSY, /* c00000ae (STATUS_PIPE_BUSY) */ - ERROR_INVALID_FUNCTION, /* c00000af (STATUS_ILLEGAL_FUNCTION) */ - ERROR_PIPE_NOT_CONNECTED, /* c00000b0 (STATUS_PIPE_DISCONNECTED) */ - ERROR_NO_DATA, /* c00000b1 (STATUS_PIPE_CLOSING) */ - ERROR_PIPE_CONNECTED, /* c00000b2 (STATUS_PIPE_CONNECTED) */ - ERROR_PIPE_LISTENING, /* c00000b3 (STATUS_PIPE_LISTENING) */ - ERROR_BAD_PIPE, /* c00000b4 (STATUS_INVALID_READ_MODE) */ - ERROR_SEM_TIMEOUT, /* c00000b5 (STATUS_IO_TIMEOUT) */ - ERROR_HANDLE_EOF, /* c00000b6 (STATUS_FILE_FORCED_CLOSED) */ - ERROR_MR_MID_NOT_FOUND, /* c00000b7 (STATUS_PROFILING_NOT_STARTED) */ - ERROR_MR_MID_NOT_FOUND, /* c00000b8 (STATUS_PROFILING_NOT_STOPPED) */ - ERROR_MR_MID_NOT_FOUND, /* c00000b9 (STATUS_COULD_NOT_INTERPRET) */ - ERROR_ACCESS_DENIED, /* c00000ba (STATUS_FILE_IS_A_DIRECTORY) */ - ERROR_NOT_SUPPORTED, /* c00000bb (STATUS_NOT_SUPPORTED) */ - ERROR_REM_NOT_LIST, /* c00000bc (STATUS_REMOTE_NOT_LISTENING) */ - ERROR_DUP_NAME, /* c00000bd (STATUS_DUPLICATE_NAME) */ - ERROR_BAD_NETPATH, /* c00000be (STATUS_BAD_NETWORK_PATH) */ - ERROR_NETWORK_BUSY, /* c00000bf (STATUS_NETWORK_BUSY) */ - ERROR_DEV_NOT_EXIST, /* c00000c0 (STATUS_DEVICE_DOES_NOT_EXIST) */ - ERROR_TOO_MANY_CMDS, /* c00000c1 (STATUS_TOO_MANY_COMMANDS) */ - ERROR_ADAP_HDW_ERR, /* c00000c2 (STATUS_ADAPTER_HARDWARE_ERROR) */ - ERROR_BAD_NET_RESP, /* c00000c3 (STATUS_INVALID_NETWORK_RESPONSE) */ - ERROR_UNEXP_NET_ERR, /* c00000c4 (STATUS_UNEXPECTED_NETWORK_ERROR) */ - ERROR_BAD_REM_ADAP, /* c00000c5 (STATUS_BAD_REMOTE_ADAPTER) */ - ERROR_PRINTQ_FULL, /* c00000c6 (STATUS_PRINT_QUEUE_FULL) */ - ERROR_NO_SPOOL_SPACE, /* c00000c7 (STATUS_NO_SPOOL_SPACE) */ - ERROR_PRINT_CANCELLED, /* c00000c8 (STATUS_PRINT_CANCELLED) */ - ERROR_NETNAME_DELETED, /* c00000c9 (STATUS_NETWORK_NAME_DELETED) */ - ERROR_NETWORK_ACCESS_DENIED, /* c00000ca (STATUS_NETWORK_ACCESS_DENIED) */ - ERROR_BAD_DEV_TYPE, /* c00000cb (STATUS_BAD_DEVICE_TYPE) */ - ERROR_BAD_NET_NAME, /* c00000cc (STATUS_BAD_NETWORK_NAME) */ - ERROR_TOO_MANY_NAMES, /* c00000cd (STATUS_TOO_MANY_NAMES) */ - ERROR_TOO_MANY_SESS, /* c00000ce (STATUS_TOO_MANY_SESSIONS) */ - ERROR_SHARING_PAUSED, /* c00000cf (STATUS_SHARING_PAUSED) */ - ERROR_REQ_NOT_ACCEP, /* c00000d0 (STATUS_REQUEST_NOT_ACCEPTED) */ - ERROR_REDIR_PAUSED, /* c00000d1 (STATUS_REDIRECTOR_PAUSED) */ - ERROR_NET_WRITE_FAULT, /* c00000d2 (STATUS_NET_WRITE_FAULT) */ - ERROR_MR_MID_NOT_FOUND, /* c00000d3 (STATUS_PROFILING_AT_LIMIT) */ - ERROR_NOT_SAME_DEVICE, /* c00000d4 (STATUS_NOT_SAME_DEVICE) */ - ERROR_MR_MID_NOT_FOUND, /* c00000d5 (STATUS_FILE_RENAMED) */ - ERROR_VC_DISCONNECTED, /* c00000d6 (STATUS_VIRTUAL_CIRCUIT_CLOSED) */ - ERROR_NO_SECURITY_ON_OBJECT, /* c00000d7 (STATUS_NO_SECURITY_ON_OBJECT) */ - ERROR_MR_MID_NOT_FOUND, /* c00000d8 (STATUS_CANT_WAIT) */ - ERROR_NO_DATA, /* c00000d9 (STATUS_PIPE_EMPTY) */ - ERROR_CANT_ACCESS_DOMAIN_INFO, /* c00000da (STATUS_CANT_ACCESS_DOMAIN_INFO) */ - ERROR_MR_MID_NOT_FOUND, /* c00000db (STATUS_CANT_TERMINATE_SELF) */ - ERROR_INVALID_SERVER_STATE, /* c00000dc (STATUS_INVALID_SERVER_STATE) */ - ERROR_INVALID_DOMAIN_STATE, /* c00000dd (STATUS_INVALID_DOMAIN_STATE) */ - ERROR_INVALID_DOMAIN_ROLE, /* c00000de (STATUS_INVALID_DOMAIN_ROLE) */ - ERROR_NO_SUCH_DOMAIN, /* c00000df (STATUS_NO_SUCH_DOMAIN) */ - ERROR_DOMAIN_EXISTS, /* c00000e0 (STATUS_DOMAIN_EXISTS) */ - ERROR_DOMAIN_LIMIT_EXCEEDED, /* c00000e1 (STATUS_DOMAIN_LIMIT_EXCEEDED) */ - ERROR_MR_MID_NOT_FOUND, /* c00000e2 (STATUS_OPLOCK_NOT_GRANTED) */ - ERROR_MR_MID_NOT_FOUND, /* c00000e3 (STATUS_INVALID_OPLOCK_PROTOCOL) */ - ERROR_INTERNAL_DB_CORRUPTION, /* c00000e4 (STATUS_INTERNAL_DB_CORRUPTION) */ - ERROR_INTERNAL_ERROR, /* c00000e5 (STATUS_INTERNAL_ERROR) */ - ERROR_GENERIC_NOT_MAPPED, /* c00000e6 (STATUS_GENERIC_NOT_MAPPED) */ - ERROR_BAD_DESCRIPTOR_FORMAT, /* c00000e7 (STATUS_BAD_DESCRIPTOR_FORMAT) */ - ERROR_INVALID_USER_BUFFER, /* c00000e8 (STATUS_INVALID_USER_BUFFER) */ - ERROR_MR_MID_NOT_FOUND, /* c00000e9 (STATUS_UNEXPECTED_IO_ERROR) */ - ERROR_MR_MID_NOT_FOUND, /* c00000ea (STATUS_UNEXPECTED_MM_CREATE_ERR) */ - ERROR_MR_MID_NOT_FOUND, /* c00000eb (STATUS_UNEXPECTED_MM_MAP_ERROR) */ - ERROR_MR_MID_NOT_FOUND, /* c00000ec (STATUS_UNEXPECTED_MM_EXTEND_ERR) */ - ERROR_NOT_LOGON_PROCESS, /* c00000ed (STATUS_NOT_LOGON_PROCESS) */ - ERROR_LOGON_SESSION_EXISTS, /* c00000ee (STATUS_LOGON_SESSION_EXISTS) */ - ERROR_INVALID_PARAMETER, /* c00000ef (STATUS_INVALID_PARAMETER_1) */ - ERROR_INVALID_PARAMETER, /* c00000f0 (STATUS_INVALID_PARAMETER_2) */ - ERROR_INVALID_PARAMETER, /* c00000f1 (STATUS_INVALID_PARAMETER_3) */ - ERROR_INVALID_PARAMETER, /* c00000f2 (STATUS_INVALID_PARAMETER_4) */ - ERROR_INVALID_PARAMETER, /* c00000f3 (STATUS_INVALID_PARAMETER_5) */ - ERROR_INVALID_PARAMETER, /* c00000f4 (STATUS_INVALID_PARAMETER_6) */ - ERROR_INVALID_PARAMETER, /* c00000f5 (STATUS_INVALID_PARAMETER_7) */ - ERROR_INVALID_PARAMETER, /* c00000f6 (STATUS_INVALID_PARAMETER_8) */ - ERROR_INVALID_PARAMETER, /* c00000f7 (STATUS_INVALID_PARAMETER_9) */ - ERROR_INVALID_PARAMETER, /* c00000f8 (STATUS_INVALID_PARAMETER_10) */ - ERROR_INVALID_PARAMETER, /* c00000f9 (STATUS_INVALID_PARAMETER_11) */ - ERROR_INVALID_PARAMETER, /* c00000fa (STATUS_INVALID_PARAMETER_12) */ - ERROR_PATH_NOT_FOUND, /* c00000fb (STATUS_REDIRECTOR_NOT_STARTED) */ - ERROR_MR_MID_NOT_FOUND, /* c00000fc (STATUS_REDIRECTOR_STARTED) */ - ERROR_STACK_OVERFLOW, /* c00000fd (STATUS_STACK_OVERFLOW) */ - ERROR_NO_SUCH_PACKAGE, /* c00000fe (STATUS_NO_SUCH_PACKAGE) */ - ERROR_MR_MID_NOT_FOUND, /* c00000ff (STATUS_BAD_FUNCTION_TABLE) */ - ERROR_ENVVAR_NOT_FOUND, /* c0000100 (STATUS_VARIABLE_NOT_FOUND) */ - ERROR_DIR_NOT_EMPTY, /* c0000101 (STATUS_DIRECTORY_NOT_EMPTY) */ - ERROR_FILE_CORRUPT, /* c0000102 (STATUS_FILE_CORRUPT_ERROR) */ - ERROR_DIRECTORY, /* c0000103 (STATUS_NOT_A_DIRECTORY) */ - ERROR_BAD_LOGON_SESSION_STATE, /* c0000104 (STATUS_BAD_LOGON_SESSION_STATE) */ - ERROR_LOGON_SESSION_COLLISION, /* c0000105 (STATUS_LOGON_SESSION_COLLISION) */ - ERROR_FILENAME_EXCED_RANGE, /* c0000106 (STATUS_NAME_TOO_LONG) */ - ERROR_MR_MID_NOT_FOUND, /* c0000107 (STATUS_FILES_OPEN) */ - ERROR_DEVICE_IN_USE, /* c0000108 (STATUS_CONNECTION_IN_USE) */ - ERROR_MR_MID_NOT_FOUND, /* c0000109 (STATUS_MESSAGE_NOT_FOUND) */ - ERROR_ACCESS_DENIED, /* c000010a (STATUS_PROCESS_IS_TERMINATING) */ - ERROR_INVALID_LOGON_TYPE, /* c000010b (STATUS_INVALID_LOGON_TYPE) */ - ERROR_MR_MID_NOT_FOUND, /* c000010c (STATUS_NO_GUID_TRANSLATION) */ - ERROR_CANNOT_IMPERSONATE, /* c000010d (STATUS_CANNOT_IMPERSONATE) */ - ERROR_SERVICE_ALREADY_RUNNING, /* c000010e (STATUS_IMAGE_ALREADY_LOADED) */ - ERROR_MR_MID_NOT_FOUND, /* c000010f (STATUS_ABIOS_NOT_PRESENT) */ - ERROR_MR_MID_NOT_FOUND, /* c0000110 (STATUS_ABIOS_LID_NOT_EXIST) */ - ERROR_MR_MID_NOT_FOUND, /* c0000111 (STATUS_ABIOS_LID_ALREADY_OWNED) */ - ERROR_MR_MID_NOT_FOUND, /* c0000112 (STATUS_ABIOS_NOT_LID_OWNER) */ - ERROR_MR_MID_NOT_FOUND, /* c0000113 (STATUS_ABIOS_INVALID_COMMAND) */ - ERROR_MR_MID_NOT_FOUND, /* c0000114 (STATUS_ABIOS_INVALID_LID) */ - ERROR_MR_MID_NOT_FOUND, /* c0000115 (STATUS_ABIOS_SELECTOR_NOT_AVAILABLE) */ - ERROR_MR_MID_NOT_FOUND, /* c0000116 (STATUS_ABIOS_INVALID_SELECTOR) */ - ERROR_MR_MID_NOT_FOUND, /* c0000117 (STATUS_NO_LDT) */ - ERROR_MR_MID_NOT_FOUND, /* c0000118 (STATUS_INVALID_LDT_SIZE) */ - ERROR_MR_MID_NOT_FOUND, /* c0000119 (STATUS_INVALID_LDT_OFFSET) */ - ERROR_MR_MID_NOT_FOUND, /* c000011a (STATUS_INVALID_LDT_DESCRIPTOR) */ - ERROR_BAD_EXE_FORMAT, /* c000011b (STATUS_INVALID_IMAGE_NE_FORMAT) */ - ERROR_RXACT_INVALID_STATE, /* c000011c (STATUS_RXACT_INVALID_STATE) */ - ERROR_RXACT_COMMIT_FAILURE, /* c000011d (STATUS_RXACT_COMMIT_FAILURE) */ - ERROR_FILE_INVALID, /* c000011e (STATUS_MAPPED_FILE_SIZE_ZERO) */ - ERROR_TOO_MANY_OPEN_FILES, /* c000011f (STATUS_TOO_MANY_OPENED_FILES) */ - ERROR_OPERATION_ABORTED, /* c0000120 (STATUS_CANCELLED) */ - ERROR_ACCESS_DENIED, /* c0000121 (STATUS_CANNOT_DELETE) */ - ERROR_INVALID_COMPUTERNAME, /* c0000122 (STATUS_INVALID_COMPUTER_NAME) */ - ERROR_ACCESS_DENIED, /* c0000123 (STATUS_FILE_DELETED) */ - ERROR_SPECIAL_ACCOUNT, /* c0000124 (STATUS_SPECIAL_ACCOUNT) */ - ERROR_SPECIAL_GROUP, /* c0000125 (STATUS_SPECIAL_GROUP) */ - ERROR_SPECIAL_USER, /* c0000126 (STATUS_SPECIAL_USER) */ - ERROR_MEMBERS_PRIMARY_GROUP, /* c0000127 (STATUS_MEMBERS_PRIMARY_GROUP) */ - ERROR_INVALID_HANDLE, /* c0000128 (STATUS_FILE_CLOSED) */ - ERROR_MR_MID_NOT_FOUND, /* c0000129 (STATUS_TOO_MANY_THREADS) */ - ERROR_MR_MID_NOT_FOUND, /* c000012a (STATUS_THREAD_NOT_IN_PROCESS) */ - ERROR_TOKEN_ALREADY_IN_USE, /* c000012b (STATUS_TOKEN_ALREADY_IN_USE) */ - ERROR_MR_MID_NOT_FOUND, /* c000012c (STATUS_PAGEFILE_QUOTA_EXCEEDED) */ - ERROR_COMMITMENT_LIMIT, /* c000012d (STATUS_COMMITMENT_LIMIT) */ - ERROR_BAD_EXE_FORMAT, /* c000012e (STATUS_INVALID_IMAGE_LE_FORMAT) */ - ERROR_BAD_EXE_FORMAT, /* c000012f (STATUS_INVALID_IMAGE_NOT_MZ) */ - ERROR_BAD_EXE_FORMAT, /* c0000130 (STATUS_INVALID_IMAGE_PROTECT) */ - ERROR_BAD_EXE_FORMAT, /* c0000131 (STATUS_INVALID_IMAGE_WIN_16) */ - ERROR_MR_MID_NOT_FOUND, /* c0000132 (STATUS_LOGON_SERVER_CONFLICT) */ - ERROR_MR_MID_NOT_FOUND, /* c0000133 (STATUS_TIME_DIFFERENCE_AT_DC) */ - ERROR_MR_MID_NOT_FOUND, /* c0000134 (STATUS_SYNCHRONIZATION_REQUIRED) */ - ERROR_MOD_NOT_FOUND, /* c0000135 (STATUS_DLL_NOT_FOUND) */ - ERROR_MR_MID_NOT_FOUND, /* c0000136 (STATUS_OPEN_FAILED) */ - ERROR_MR_MID_NOT_FOUND, /* c0000137 (STATUS_IO_PRIVILEGE_FAILED) */ - ERROR_INVALID_ORDINAL, /* c0000138 (STATUS_ORDINAL_NOT_FOUND) */ - ERROR_PROC_NOT_FOUND, /* c0000139 (STATUS_ENTRYPOINT_NOT_FOUND) */ - ERROR_MR_MID_NOT_FOUND, /* c000013a (STATUS_CONTROL_C_EXIT) */ - ERROR_NETNAME_DELETED, /* c000013b (STATUS_LOCAL_DISCONNECT) */ - ERROR_NETNAME_DELETED, /* c000013c (STATUS_REMOTE_DISCONNECT) */ - ERROR_REM_NOT_LIST, /* c000013d (STATUS_REMOTE_RESOURCES) */ - ERROR_UNEXP_NET_ERR, /* c000013e (STATUS_LINK_FAILED) */ - ERROR_UNEXP_NET_ERR, /* c000013f (STATUS_LINK_TIMEOUT) */ - ERROR_UNEXP_NET_ERR, /* c0000140 (STATUS_INVALID_CONNECTION) */ - ERROR_UNEXP_NET_ERR, /* c0000141 (STATUS_INVALID_ADDRESS) */ - ERROR_DLL_INIT_FAILED, /* c0000142 (STATUS_DLL_INIT_FAILED) */ - ERROR_MR_MID_NOT_FOUND, /* c0000143 (STATUS_MISSING_SYSTEMFILE) */ - ERROR_MR_MID_NOT_FOUND, /* c0000144 (STATUS_UNHANDLED_EXCEPTION) */ - ERROR_MR_MID_NOT_FOUND, /* c0000145 (STATUS_APP_INIT_FAILURE) */ - ERROR_MR_MID_NOT_FOUND, /* c0000146 (STATUS_PAGEFILE_CREATE_FAILED) */ - ERROR_MR_MID_NOT_FOUND, /* c0000147 (STATUS_NO_PAGEFILE) */ - ERROR_INVALID_LEVEL, /* c0000148 (STATUS_INVALID_LEVEL) */ - ERROR_INVALID_PASSWORD, /* c0000149 (STATUS_WRONG_PASSWORD_CORE) */ - ERROR_MR_MID_NOT_FOUND, /* c000014a (STATUS_ILLEGAL_FLOAT_CONTEXT) */ - ERROR_BROKEN_PIPE, /* c000014b (STATUS_PIPE_BROKEN) */ - ERROR_BADDB, /* c000014c (STATUS_REGISTRY_CORRUPT) */ - ERROR_REGISTRY_IO_FAILED, /* c000014d (STATUS_REGISTRY_IO_FAILED) */ - ERROR_MR_MID_NOT_FOUND, /* c000014e (STATUS_NO_EVENT_PAIR) */ - ERROR_UNRECOGNIZED_VOLUME, /* c000014f (STATUS_UNRECOGNIZED_VOLUME) */ - ERROR_SERIAL_NO_DEVICE, /* c0000150 (STATUS_SERIAL_NO_DEVICE_INITED) */ - ERROR_NO_SUCH_ALIAS, /* c0000151 (STATUS_NO_SUCH_ALIAS) */ - ERROR_MEMBER_NOT_IN_ALIAS, /* c0000152 (STATUS_MEMBER_NOT_IN_ALIAS) */ - ERROR_MEMBER_IN_ALIAS, /* c0000153 (STATUS_MEMBER_IN_ALIAS) */ - ERROR_ALIAS_EXISTS, /* c0000154 (STATUS_ALIAS_EXISTS) */ - ERROR_LOGON_NOT_GRANTED, /* c0000155 (STATUS_LOGON_NOT_GRANTED) */ - ERROR_TOO_MANY_SECRETS, /* c0000156 (STATUS_TOO_MANY_SECRETS) */ - ERROR_SECRET_TOO_LONG, /* c0000157 (STATUS_SECRET_TOO_LONG) */ - ERROR_INTERNAL_DB_ERROR, /* c0000158 (STATUS_INTERNAL_DB_ERROR) */ - ERROR_FULLSCREEN_MODE, /* c0000159 (STATUS_FULLSCREEN_MODE) */ - ERROR_TOO_MANY_CONTEXT_IDS, /* c000015a (STATUS_TOO_MANY_CONTEXT_IDS) */ - ERROR_LOGON_TYPE_NOT_GRANTED, /* c000015b (STATUS_LOGON_TYPE_NOT_GRANTED) */ - ERROR_NOT_REGISTRY_FILE, /* c000015c (STATUS_NOT_REGISTRY_FILE) */ - ERROR_NT_CROSS_ENCRYPTION_REQUIRED, /* c000015d (STATUS_NT_CROSS_ENCRYPTION_REQUIRED) */ - ERROR_MR_MID_NOT_FOUND, /* c000015e (STATUS_DOMAIN_CTRLR_CONFIG_ERROR) */ - ERROR_IO_DEVICE, /* c000015f (STATUS_FT_MISSING_MEMBER) */ - ERROR_MR_MID_NOT_FOUND, /* c0000160 (STATUS_ILL_FORMED_SERVICE_ENTRY) */ - ERROR_MR_MID_NOT_FOUND, /* c0000161 (STATUS_ILLEGAL_CHARACTER) */ - ERROR_NO_UNICODE_TRANSLATION, /* c0000162 (STATUS_UNMAPPABLE_CHARACTER) */ - ERROR_MR_MID_NOT_FOUND, /* c0000163 (STATUS_UNDEFINED_CHARACTER) */ - ERROR_MR_MID_NOT_FOUND, /* c0000164 (STATUS_FLOPPY_VOLUME) */ - ERROR_FLOPPY_ID_MARK_NOT_FOUND, /* c0000165 (STATUS_FLOPPY_ID_MARK_NOT_FOUND) */ - ERROR_FLOPPY_WRONG_CYLINDER, /* c0000166 (STATUS_FLOPPY_WRONG_CYLINDER) */ - ERROR_FLOPPY_UNKNOWN_ERROR, /* c0000167 (STATUS_FLOPPY_UNKNOWN_ERROR) */ - ERROR_FLOPPY_BAD_REGISTERS, /* c0000168 (STATUS_FLOPPY_BAD_REGISTERS) */ - ERROR_DISK_RECALIBRATE_FAILED, /* c0000169 (STATUS_DISK_RECALIBRATE_FAILED) */ - ERROR_DISK_OPERATION_FAILED, /* c000016a (STATUS_DISK_OPERATION_FAILED) */ - ERROR_DISK_RESET_FAILED, /* c000016b (STATUS_DISK_RESET_FAILED) */ - ERROR_IRQ_BUSY, /* c000016c (STATUS_SHARED_IRQ_BUSY) */ - ERROR_IO_DEVICE, /* c000016d (STATUS_FT_ORPHANING) */ - ERROR_MR_MID_NOT_FOUND, /* c000016e (STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT) */ - ERROR_MR_MID_NOT_FOUND, /* c000016f */ - ERROR_MR_MID_NOT_FOUND, /* c0000170 */ - ERROR_MR_MID_NOT_FOUND, /* c0000171 */ - ERROR_PARTITION_FAILURE, /* c0000172 (STATUS_PARTITION_FAILURE) */ - ERROR_INVALID_BLOCK_LENGTH, /* c0000173 (STATUS_INVALID_BLOCK_LENGTH) */ - ERROR_DEVICE_NOT_PARTITIONED, /* c0000174 (STATUS_DEVICE_NOT_PARTITIONED) */ - ERROR_UNABLE_TO_LOCK_MEDIA, /* c0000175 (STATUS_UNABLE_TO_LOCK_MEDIA) */ - ERROR_UNABLE_TO_UNLOAD_MEDIA, /* c0000176 (STATUS_UNABLE_TO_UNLOAD_MEDIA) */ - ERROR_EOM_OVERFLOW, /* c0000177 (STATUS_EOM_OVERFLOW) */ - ERROR_NO_MEDIA_IN_DRIVE, /* c0000178 (STATUS_NO_MEDIA) */ - ERROR_MR_MID_NOT_FOUND, /* c0000179 */ - ERROR_NO_SUCH_MEMBER, /* c000017a (STATUS_NO_SUCH_MEMBER) */ - ERROR_INVALID_MEMBER, /* c000017b (STATUS_INVALID_MEMBER) */ - ERROR_KEY_DELETED, /* c000017c (STATUS_KEY_DELETED) */ - ERROR_NO_LOG_SPACE, /* c000017d (STATUS_NO_LOG_SPACE) */ - ERROR_TOO_MANY_SIDS, /* c000017e (STATUS_TOO_MANY_SIDS) */ - ERROR_LM_CROSS_ENCRYPTION_REQUIRED, /* c000017f (STATUS_LM_CROSS_ENCRYPTION_REQUIRED) */ - ERROR_KEY_HAS_CHILDREN, /* c0000180 (STATUS_KEY_HAS_CHILDREN) */ - ERROR_CHILD_MUST_BE_VOLATILE, /* c0000181 (STATUS_CHILD_MUST_BE_VOLATILE) */ - ERROR_INVALID_PARAMETER, /* c0000182 (STATUS_DEVICE_CONFIGURATION_ERROR) */ - ERROR_IO_DEVICE, /* c0000183 (STATUS_DRIVER_INTERNAL_ERROR) */ - ERROR_BAD_COMMAND, /* c0000184 (STATUS_INVALID_DEVICE_STATE) */ - ERROR_IO_DEVICE, /* c0000185 (STATUS_IO_DEVICE_ERROR) */ - ERROR_IO_DEVICE, /* c0000186 (STATUS_DEVICE_PROTOCOL_ERROR) */ - ERROR_MR_MID_NOT_FOUND, /* c0000187 (STATUS_BACKUP_CONTROLLER) */ - ERROR_LOG_FILE_FULL, /* c0000188 (STATUS_LOG_FILE_FULL) */ - ERROR_WRITE_PROTECT, /* c0000189 (STATUS_TOO_LATE) */ - ERROR_NO_TRUST_LSA_SECRET, /* c000018a (STATUS_NO_TRUST_LSA_SECRET) */ - ERROR_NO_TRUST_SAM_ACCOUNT, /* c000018b (STATUS_NO_TRUST_SAM_ACCOUNT) */ - ERROR_TRUSTED_DOMAIN_FAILURE, /* c000018c (STATUS_TRUSTED_DOMAIN_FAILURE) */ - ERROR_TRUSTED_RELATIONSHIP_FAILURE, /* c000018d (STATUS_TRUSTED_RELATIONSHIP_FAILURE) */ - ERROR_EVENTLOG_FILE_CORRUPT, /* c000018e (STATUS_EVENTLOG_FILE_CORRUPT) */ - ERROR_EVENTLOG_CANT_START, /* c000018f (STATUS_EVENTLOG_CANT_START) */ - ERROR_TRUST_FAILURE, /* c0000190 (STATUS_TRUST_FAILURE) */ - ERROR_MR_MID_NOT_FOUND, /* c0000191 (STATUS_MUTANT_LIMIT_EXCEEDED) */ - ERROR_NETLOGON_NOT_STARTED, /* c0000192 (STATUS_NETLOGON_NOT_STARTED) */ - ERROR_ACCOUNT_EXPIRED, /* c0000193 (STATUS_ACCOUNT_EXPIRED) */ - ERROR_POSSIBLE_DEADLOCK, /* c0000194 (STATUS_POSSIBLE_DEADLOCK) */ - ERROR_SESSION_CREDENTIAL_CONFLICT, /* c0000195 (STATUS_NETWORK_CREDENTIAL_CONFLICT) */ - ERROR_REMOTE_SESSION_LIMIT_EXCEEDED, /* c0000196 (STATUS_REMOTE_SESSION_LIMIT) */ - ERROR_EVENTLOG_FILE_CHANGED, /* c0000197 (STATUS_EVENTLOG_FILE_CHANGED) */ - ERROR_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT,/* c0000198 (STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT) */ - ERROR_NOLOGON_WORKSTATION_TRUST_ACCOUNT,/* c0000199 (STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT) */ - ERROR_NOLOGON_SERVER_TRUST_ACCOUNT, /* c000019a (STATUS_NOLOGON_SERVER_TRUST_ACCOUNT) */ - ERROR_DOMAIN_TRUST_INCONSISTENT /* c000019b (STATUS_DOMAIN_TRUST_INCONSISTENT) */ -}; - -static const WORD table_c0000202[109] = -{ - ERROR_NO_USER_SESSION_KEY, /* c0000202 (STATUS_NO_USER_SESSION_KEY) */ - ERROR_UNEXP_NET_ERR, /* c0000203 (STATUS_USER_SESSION_DELETED) */ - ERROR_RESOURCE_LANG_NOT_FOUND, /* c0000204 (STATUS_RESOURCE_LANG_NOT_FOUND) */ - ERROR_NOT_ENOUGH_SERVER_MEMORY, /* c0000205 (STATUS_INSUFF_SERVER_RESOURCES) */ - ERROR_INVALID_USER_BUFFER, /* c0000206 (STATUS_INVALID_BUFFER_SIZE) */ - ERROR_INVALID_NETNAME, /* c0000207 (STATUS_INVALID_ADDRESS_COMPONENT) */ - ERROR_INVALID_NETNAME, /* c0000208 (STATUS_INVALID_ADDRESS_WILDCARD) */ - ERROR_TOO_MANY_NAMES, /* c0000209 (STATUS_TOO_MANY_ADDRESSES) */ - ERROR_DUP_NAME, /* c000020a (STATUS_ADDRESS_ALREADY_EXISTS) */ - ERROR_NETNAME_DELETED, /* c000020b (STATUS_ADDRESS_CLOSED) */ - ERROR_NETNAME_DELETED, /* c000020c (STATUS_CONNECTION_DISCONNECTED) */ - ERROR_NETNAME_DELETED, /* c000020d (STATUS_CONNECTION_RESET) */ - ERROR_TOO_MANY_NAMES, /* c000020e (STATUS_TOO_MANY_NODES) */ - ERROR_UNEXP_NET_ERR, /* c000020f (STATUS_TRANSACTION_ABORTED) */ - ERROR_UNEXP_NET_ERR, /* c0000210 (STATUS_TRANSACTION_TIMED_OUT) */ - ERROR_UNEXP_NET_ERR, /* c0000211 (STATUS_TRANSACTION_NO_RELEASE) */ - ERROR_UNEXP_NET_ERR, /* c0000212 (STATUS_TRANSACTION_NO_MATCH) */ - ERROR_UNEXP_NET_ERR, /* c0000213 (STATUS_TRANSACTION_RESPONDED) */ - ERROR_UNEXP_NET_ERR, /* c0000214 (STATUS_TRANSACTION_INVALID_ID) */ - ERROR_UNEXP_NET_ERR, /* c0000215 (STATUS_TRANSACTION_INVALID_TYPE) */ - ERROR_NOT_SUPPORTED, /* c0000216 (STATUS_NOT_SERVER_SESSION) */ - ERROR_NOT_SUPPORTED, /* c0000217 (STATUS_NOT_CLIENT_SESSION) */ - ERROR_MR_MID_NOT_FOUND, /* c0000218 (STATUS_CANNOT_LOAD_REGISTRY_FILE) */ - ERROR_MR_MID_NOT_FOUND, /* c0000219 */ - ERROR_MR_MID_NOT_FOUND, /* c000021a */ - ERROR_MR_MID_NOT_FOUND, /* c000021b */ - ERROR_NO_BROWSER_SERVERS_FOUND, /* c000021c (STATUS_NO_BROWSER_SERVERS_FOUND) */ - ERROR_MR_MID_NOT_FOUND, /* c000021d */ - ERROR_MR_MID_NOT_FOUND, /* c000021e */ - ERROR_MR_MID_NOT_FOUND, /* c000021f */ - ERROR_MAPPED_ALIGNMENT, /* c0000220 (STATUS_MAPPED_ALIGNMENT) */ - ERROR_BAD_EXE_FORMAT, /* c0000221 (STATUS_IMAGE_CHECKSUM_MISMATCH) */ - ERROR_MR_MID_NOT_FOUND, /* c0000222 */ - ERROR_MR_MID_NOT_FOUND, /* c0000223 */ - ERROR_PASSWORD_MUST_CHANGE, /* c0000224 (STATUS_PASSWORD_MUST_CHANGE) */ - ERROR_MR_MID_NOT_FOUND, /* c0000225 */ - ERROR_MR_MID_NOT_FOUND, /* c0000226 */ - ERROR_MR_MID_NOT_FOUND, /* c0000227 */ - ERROR_MR_MID_NOT_FOUND, /* c0000228 */ - ERROR_MR_MID_NOT_FOUND, /* c0000229 */ - 0, /* c000022a */ - 0, /* c000022b */ - ERROR_MR_MID_NOT_FOUND, /* c000022c */ - ERROR_MR_MID_NOT_FOUND, /* c000022d */ - ERROR_MR_MID_NOT_FOUND, /* c000022e */ - ERROR_MR_MID_NOT_FOUND, /* c000022f */ - ERROR_MR_MID_NOT_FOUND, /* c0000230 */ - ERROR_MR_MID_NOT_FOUND, /* c0000231 */ - ERROR_MR_MID_NOT_FOUND, /* c0000232 */ - ERROR_DOMAIN_CONTROLLER_NOT_FOUND, /* c0000233 */ - ERROR_ACCOUNT_LOCKED_OUT, /* c0000234 */ - ERROR_INVALID_HANDLE, /* c0000235 */ - ERROR_CONNECTION_REFUSED, /* c0000236 */ - ERROR_GRACEFUL_DISCONNECT, /* c0000237 */ - ERROR_ADDRESS_ALREADY_ASSOCIATED, /* c0000238 */ - ERROR_ADDRESS_NOT_ASSOCIATED, /* c0000239 */ - ERROR_CONNECTION_INVALID, /* c000023a */ - ERROR_CONNECTION_ACTIVE, /* c000023b */ - ERROR_NETWORK_UNREACHABLE, /* c000023c */ - ERROR_HOST_UNREACHABLE, /* c000023d */ - ERROR_PROTOCOL_UNREACHABLE, /* c000023e */ - ERROR_PORT_UNREACHABLE, /* c000023f */ - ERROR_REQUEST_ABORTED, /* c0000240 */ - ERROR_CONNECTION_ABORTED, /* c0000241 */ - ERROR_MR_MID_NOT_FOUND, /* c0000242 */ - ERROR_USER_MAPPED_FILE, /* c0000243 */ - ERROR_MR_MID_NOT_FOUND, /* c0000244 */ - ERROR_MR_MID_NOT_FOUND, /* c0000245 */ - ERROR_CONNECTION_COUNT_LIMIT, /* c0000246 */ - ERROR_LOGIN_TIME_RESTRICTION, /* c0000247 */ - ERROR_LOGIN_WKSTA_RESTRICTION, /* c0000248 */ - ERROR_BAD_EXE_FORMAT, /* c0000249 */ - ERROR_MR_MID_NOT_FOUND, /* c000024a */ - ERROR_MR_MID_NOT_FOUND, /* c000024b */ - ERROR_MR_MID_NOT_FOUND, /* c000024c */ - ERROR_MR_MID_NOT_FOUND, /* c000024d */ - ERROR_MR_MID_NOT_FOUND, /* c000024e */ - ERROR_MR_MID_NOT_FOUND, /* c000024f */ - ERROR_MR_MID_NOT_FOUND, /* c0000250 */ - ERROR_MR_MID_NOT_FOUND, /* c0000251 */ - ERROR_MR_MID_NOT_FOUND, /* c0000252 */ - ERROR_INTERNAL_ERROR, /* c0000253 */ - ERROR_MR_MID_NOT_FOUND, /* c0000254 */ - ERROR_MR_MID_NOT_FOUND, /* c0000255 */ - ERROR_MR_MID_NOT_FOUND, /* c0000256 */ - ERROR_HOST_UNREACHABLE, /* c0000257 */ - ERROR_MR_MID_NOT_FOUND, /* c0000258 */ - ERROR_LICENSE_QUOTA_EXCEEDED, /* c0000259 */ - ERROR_MR_MID_NOT_FOUND, /* c000025a */ - ERROR_MR_MID_NOT_FOUND, /* c000025b */ - ERROR_MR_MID_NOT_FOUND, /* c000025c */ - ERROR_MR_MID_NOT_FOUND, /* c000025d */ - ERROR_SERVICE_DISABLED, /* c000025e */ - ERROR_MR_MID_NOT_FOUND, /* c000025f */ - ERROR_MR_MID_NOT_FOUND, /* c0000260 */ - ERROR_MR_MID_NOT_FOUND, /* c0000261 */ - ERROR_INVALID_ORDINAL, /* c0000262 */ - ERROR_PROC_NOT_FOUND, /* c0000263 */ - ERROR_NOT_OWNER, /* c0000264 */ - ERROR_TOO_MANY_LINKS, /* c0000265 */ - ERROR_MR_MID_NOT_FOUND, /* c0000266 */ - ERROR_MR_MID_NOT_FOUND, /* c0000267 */ - ERROR_MR_MID_NOT_FOUND, /* c0000268 */ - ERROR_MR_MID_NOT_FOUND, /* c0000269 */ - ERROR_MR_MID_NOT_FOUND, /* c000026a */ - ERROR_MR_MID_NOT_FOUND, /* c000026b */ - ERROR_MR_MID_NOT_FOUND, /* c000026c */ - ERROR_MR_MID_NOT_FOUND, /* c000026d */ - ERROR_NOT_READY /* c000026e (STATUS_VOLUME_DISMOUNTED) */ -}; - -static const WORD table_c0020001[88] = -{ - RPC_S_INVALID_STRING_BINDING, /* c0020001 (RPC_NT_INVALID_STRING_BINDING) */ - RPC_S_WRONG_KIND_OF_BINDING, /* c0020002 (RPC_NT_WRONG_KIND_OF_BINDING) */ - ERROR_INVALID_HANDLE, /* c0020003 (RPC_NT_INVALID_BINDING) */ - RPC_S_PROTSEQ_NOT_SUPPORTED, /* c0020004 (RPC_NT_PROTSEQ_NOT_SUPPORTED) */ - RPC_S_INVALID_RPC_PROTSEQ, /* c0020005 (RPC_NT_INVALID_RPC_PROTSEQ) */ - RPC_S_INVALID_STRING_UUID, /* c0020006 (RPC_NT_INVALID_STRING_UUID) */ - RPC_S_INVALID_ENDPOINT_FORMAT, /* c0020007 (RPC_NT_INVALID_ENDPOINT_FORMAT) */ - RPC_S_INVALID_NET_ADDR, /* c0020008 (RPC_NT_INVALID_NET_ADDR) */ - RPC_S_NO_ENDPOINT_FOUND, /* c0020009 (RPC_NT_NO_ENDPOINT_FOUND) */ - RPC_S_INVALID_TIMEOUT, /* c002000a (RPC_NT_INVALID_TIMEOUT) */ - RPC_S_OBJECT_NOT_FOUND, /* c002000b (RPC_NT_OBJECT_NOT_FOUND) */ - RPC_S_ALREADY_REGISTERED, /* c002000c (RPC_NT_ALREADY_REGISTERED) */ - RPC_S_TYPE_ALREADY_REGISTERED, /* c002000d (RPC_NT_TYPE_ALREADY_REGISTERED) */ - RPC_S_ALREADY_LISTENING, /* c002000e (RPC_NT_ALREADY_LISTENING) */ - RPC_S_NO_PROTSEQS_REGISTERED, /* c002000f (RPC_NT_NO_PROTSEQS_REGISTERED) */ - RPC_S_NOT_LISTENING, /* c0020010 (RPC_NT_NOT_LISTENING) */ - RPC_S_UNKNOWN_MGR_TYPE, /* c0020011 (RPC_NT_UNKNOWN_MGR_TYPE) */ - RPC_S_UNKNOWN_IF, /* c0020012 (RPC_NT_UNKNOWN_IF) */ - RPC_S_NO_BINDINGS, /* c0020013 (RPC_NT_NO_BINDINGS) */ - RPC_S_NO_PROTSEQS, /* c0020014 (RPC_NT_NO_PROTSEQS) */ - RPC_S_CANT_CREATE_ENDPOINT, /* c0020015 (RPC_NT_CANT_CREATE_ENDPOINT) */ - RPC_S_OUT_OF_RESOURCES, /* c0020016 (RPC_NT_OUT_OF_RESOURCES) */ - RPC_S_SERVER_UNAVAILABLE, /* c0020017 (RPC_NT_SERVER_UNAVAILABLE) */ - RPC_S_SERVER_TOO_BUSY, /* c0020018 (RPC_NT_SERVER_TOO_BUSY) */ - RPC_S_INVALID_NETWORK_OPTIONS, /* c0020019 (RPC_NT_INVALID_NETWORK_OPTIONS) */ - RPC_S_NO_CALL_ACTIVE, /* c002001a (RPC_NT_NO_CALL_ACTIVE) */ - RPC_S_CALL_FAILED, /* c002001b (RPC_NT_CALL_FAILED) */ - RPC_S_CALL_FAILED_DNE, /* c002001c (RPC_NT_CALL_FAILED_DNE) */ - RPC_S_PROTOCOL_ERROR, /* c002001d (RPC_NT_PROTOCOL_ERROR) */ - ERROR_MR_MID_NOT_FOUND, /* c002001e */ - RPC_S_UNSUPPORTED_TRANS_SYN, /* c002001f (RPC_NT_UNSUPPORTED_TRANS_SYN) */ - ERROR_MR_MID_NOT_FOUND, /* c0020020 */ - RPC_S_UNSUPPORTED_TYPE, /* c0020021 (RPC_NT_UNSUPPORTED_TYPE) */ - RPC_S_INVALID_TAG, /* c0020022 (RPC_NT_INVALID_TAG) */ - RPC_S_INVALID_BOUND, /* c0020023 (RPC_NT_INVALID_BOUND) */ - RPC_S_NO_ENTRY_NAME, /* c0020024 (RPC_NT_NO_ENTRY_NAME) */ - RPC_S_INVALID_NAME_SYNTAX, /* c0020025 (RPC_NT_INVALID_NAME_SYNTAX) */ - RPC_S_UNSUPPORTED_NAME_SYNTAX, /* c0020026 (RPC_NT_UNSUPPORTED_NAME_SYNTAX) */ - ERROR_MR_MID_NOT_FOUND, /* c0020027 */ - RPC_S_UUID_NO_ADDRESS, /* c0020028 (RPC_NT_UUID_NO_ADDRESS) */ - RPC_S_DUPLICATE_ENDPOINT, /* c0020029 (RPC_NT_DUPLICATE_ENDPOINT) */ - RPC_S_UNKNOWN_AUTHN_TYPE, /* c002002a (RPC_NT_UNKNOWN_AUTHN_TYPE) */ - RPC_S_MAX_CALLS_TOO_SMALL, /* c002002b (RPC_NT_MAX_CALLS_TOO_SMALL) */ - RPC_S_STRING_TOO_LONG, /* c002002c (RPC_NT_STRING_TOO_LONG) */ - RPC_S_PROTSEQ_NOT_FOUND, /* c002002d (RPC_NT_PROTSEQ_NOT_FOUND) */ - RPC_S_PROCNUM_OUT_OF_RANGE, /* c002002e (RPC_NT_PROCNUM_OUT_OF_RANGE) */ - RPC_S_BINDING_HAS_NO_AUTH, /* c002002f (RPC_NT_BINDING_HAS_NO_AUTH) */ - RPC_S_UNKNOWN_AUTHN_SERVICE, /* c0020030 (RPC_NT_UNKNOWN_AUTHN_SERVICE) */ - RPC_S_UNKNOWN_AUTHN_LEVEL, /* c0020031 (RPC_NT_UNKNOWN_AUTHN_LEVEL) */ - RPC_S_INVALID_AUTH_IDENTITY, /* c0020032 (RPC_NT_INVALID_AUTH_IDENTITY) */ - RPC_S_UNKNOWN_AUTHZ_SERVICE, /* c0020033 (RPC_NT_UNKNOWN_AUTHZ_SERVICE) */ - EPT_S_INVALID_ENTRY, /* c0020034 (EPT_NT_INVALID_ENTRY) */ - EPT_S_CANT_PERFORM_OP, /* c0020035 (EPT_NT_CANT_PERFORM_OP) */ - EPT_S_NOT_REGISTERED, /* c0020036 (EPT_NT_NOT_REGISTERED) */ - RPC_S_NOTHING_TO_EXPORT, /* c0020037 (RPC_NT_NOTHING_TO_EXPORT) */ - RPC_S_INCOMPLETE_NAME, /* c0020038 (RPC_NT_INCOMPLETE_NAME) */ - RPC_S_INVALID_VERS_OPTION, /* c0020039 (RPC_NT_INVALID_VERS_OPTION) */ - RPC_S_NO_MORE_MEMBERS, /* c002003a (RPC_NT_NO_MORE_MEMBERS) */ - RPC_S_NOT_ALL_OBJS_UNEXPORTED, /* c002003b (RPC_NT_NOT_ALL_OBJS_UNEXPORTED) */ - RPC_S_INTERFACE_NOT_FOUND, /* c002003c (RPC_NT_INTERFACE_NOT_FOUND) */ - RPC_S_ENTRY_ALREADY_EXISTS, /* c002003d (RPC_NT_ENTRY_ALREADY_EXISTS) */ - RPC_S_ENTRY_NOT_FOUND, /* c002003e (RPC_NT_ENTRY_NOT_FOUND) */ - RPC_S_NAME_SERVICE_UNAVAILABLE, /* c002003f (RPC_NT_NAME_SERVICE_UNAVAILABLE) */ - RPC_S_INVALID_NAF_ID, /* c0020040 (RPC_NT_INVALID_NAF_ID) */ - RPC_S_CANNOT_SUPPORT, /* c0020041 (RPC_NT_CANNOT_SUPPORT) */ - RPC_S_NO_CONTEXT_AVAILABLE, /* c0020042 (RPC_NT_NO_CONTEXT_AVAILABLE) */ - RPC_S_INTERNAL_ERROR, /* c0020043 (RPC_NT_INTERNAL_ERROR) */ - RPC_S_ZERO_DIVIDE, /* c0020044 (RPC_NT_ZERO_DIVIDE) */ - RPC_S_ADDRESS_ERROR, /* c0020045 (RPC_NT_ADDRESS_ERROR) */ - RPC_S_FP_DIV_ZERO, /* c0020046 (RPC_NT_FP_DIV_ZERO) */ - RPC_S_FP_UNDERFLOW, /* c0020047 (RPC_NT_FP_UNDERFLOW) */ - RPC_S_FP_OVERFLOW, /* c0020048 (RPC_NT_FP_OVERFLOW) */ - RPC_S_CALL_IN_PROGRESS, /* c0020049 (RPC_NT_CALL_IN_PROGRESS) */ - RPC_S_NO_MORE_BINDINGS, /* c002004a (RPC_NT_NO_MORE_BINDINGS) */ - RPC_S_GROUP_MEMBER_NOT_FOUND, /* c002004b (RPC_NT_GROUP_MEMBER_NOT_FOUND) */ - EPT_S_CANT_CREATE, /* c002004c (EPT_NT_CANT_CREATE) */ - RPC_S_INVALID_OBJECT, /* c002004d (RPC_NT_INVALID_OBJECT) */ - ERROR_MR_MID_NOT_FOUND, /* c002004e */ - RPC_S_NO_INTERFACES, /* c002004f */ - RPC_S_CALL_CANCELLED, /* c0020050 */ - RPC_S_BINDING_INCOMPLETE, /* c0020051 */ - RPC_S_COMM_FAILURE, /* c0020052 */ - RPC_S_UNSUPPORTED_AUTHN_LEVEL, /* c0020053 */ - RPC_S_NO_PRINC_NAME, /* c0020054 */ - RPC_S_NOT_RPC_ERROR, /* c0020055 */ - ERROR_MR_MID_NOT_FOUND, /* c0020056 */ - RPC_S_SEC_PKG_ERROR, /* c0020057 */ - RPC_S_NOT_CANCELLED /* c0020058 */ -}; - -static const WORD table_c0030001[12] = -{ - RPC_X_NO_MORE_ENTRIES, /* c0030001 (RPC_NT_NO_MORE_ENTRIES) */ - RPC_X_SS_CHAR_TRANS_OPEN_FAIL, /* c0030002 (RPC_NT_SS_CHAR_TRANS_OPEN_FAIL) */ - RPC_X_SS_CHAR_TRANS_SHORT_FILE, /* c0030003 (RPC_NT_SS_CHAR_TRANS_SHORT_FILE) */ - ERROR_INVALID_HANDLE, /* c0030004 (RPC_NT_SS_IN_NULL_CONTEXT) */ - ERROR_INVALID_HANDLE, /* c0030005 */ - RPC_X_SS_CONTEXT_DAMAGED, /* c0030006 (RPC_NT_SS_CONTEXT_DAMAGED) */ - RPC_X_SS_HANDLES_MISMATCH, /* c0030007 (RPC_NT_SS_HANDLES_MISMATCH) */ - RPC_X_SS_CANNOT_GET_CALL_HANDLE, /* c0030008 (RPC_NT_SS_CANNOT_GET_CALL_HANDLE) */ - RPC_X_NULL_REF_POINTER, /* c0030009 (RPC_NT_NULL_REF_POINTER) */ - RPC_X_ENUM_VALUE_OUT_OF_RANGE, /* c003000a (RPC_NT_ENUM_VALUE_OUT_OF_RANGE) */ - RPC_X_BYTE_COUNT_TOO_SMALL, /* c003000b (RPC_NT_BYTE_COUNT_TOO_SMALL) */ - RPC_X_BAD_STUB_DATA /* c003000c (RPC_NT_BAD_STUB_DATA) */ -}; - -static const WORD table_c0030059[6] = -{ - RPC_X_INVALID_ES_ACTION, /* c0030059 */ - RPC_X_WRONG_ES_VERSION, /* c003005a */ - RPC_X_WRONG_STUB_VERSION, /* c003005b */ - RPC_X_INVALID_PIPE_OBJECT, /* c003005c */ - RPC_X_WRONG_PIPE_ORDER, /* c003005d */ - RPC_X_WRONG_PIPE_VERSION /* c003005e */ -}; - -static const ERROR_TABLE ErrorTable[] = -{ - { 0x00000103, 0x0000010e, table_00000103 }, - { 0x40000002, 0x4000000e, table_40000002 }, - { 0x40020056, 0x40020057, table_40020056 }, - { 0x400200af, 0x400200b0, table_400200af }, - { 0x80000001, 0x80000027, table_80000001 }, - { 0x80090300, 0x80090317, table_80090300 }, - { 0xc0000001, 0xc000019c, table_c0000001 }, - { 0xc0000202, 0xc000026f, table_c0000202 }, - { 0xc0020001, 0xc0020059, table_c0020001 }, - { 0xc0030001, 0xc003000d, table_c0030001 }, - { 0xc0030059, 0xc003005f, table_c0030059 }, - { 0, 0, 0 } /* last entry */ -}; - - -#if 0 -/* currently not assigned values */ - ERROR_ARENA_TRASHED -STATUS_HANDLE_NOT_WAITABLE ERROR_INVALID_HANDLE; -STATUS_LOCK_NOT_GRANTED ERROR_LOCK_VIOLATION; - -RPC_NT_SS_CONTEXT_MISMATCH ERROR_INVALID_HANDLE -#endif - - -/* FUNCTIONS ***************************************************************/ - -/* - * @implemented - */ -VOID -STDCALL -RtlAssert(PVOID FailedAssertion, - PVOID FileName, - ULONG LineNumber, - PCHAR Message) -{ - if (NULL != Message) - { - DbgPrint("Assertion \'%s\' failed at %s line %d: %s\n", - (PCHAR)FailedAssertion, - (PCHAR)FileName, - LineNumber, - Message); - } - else - { - DbgPrint("Assertion \'%s\' failed at %s line %d\n", - (PCHAR)FailedAssertion, - (PCHAR)FileName, - LineNumber); - } - - DbgBreakPoint(); -} - - -/********************************************************************** - * NAME EXPORTED - * RtlNtStatusToDosErrorNoTeb - * - * DESCRIPTION - * Convert an Executive status ID into a DOS error number - * (winerror.h). - * - * ARGUMENTS - * Status The Executive status ID to convert. - * - * RETURN VALUE - * dos error as in winerror.h - * - * REMARK - * RtlNtStatusToDosErrorNoTeb() does the real work. - * - * @implemented - */ -DWORD STDCALL -RtlNtStatusToDosErrorNoTeb(IN NTSTATUS Status) -{ - PERROR_TABLE Table = (PERROR_TABLE)ErrorTable; - - if (!Status || (Status & 0x20000000)) - return Status; - - /* 0xd... is equivalent to 0xc... */ - if ((Status & 0xf0000000) == 0xd0000000) - Status &= ~0x10000000; - - while (Table->Start) - { - if ((ULONG)Status < Table->Start) - break; - - if ((ULONG)Status < Table->End) - { - DWORD ret = Table->Table[(ULONG)Status - Table->Start]; - if (!ret) - ret = Status; /* 0 means 1:1 mapping */ - else if (ret == ERROR_MR_MID_NOT_FOUND) - { - DbgPrint("RTL: RtlNtStatusToDosErrorNoTeb(0x%lx): no valid W32 error mapping\n", Status); - } - return ret; - } - Table++; - } - - /* now some special cases */ - if (HIWORD(Status) == 0xc001) - return LOWORD(Status); - if (HIWORD(Status) == 0x8007) - return LOWORD(Status); - - DbgPrint("RTL: RtlNtStatusToDosErrorNoTeb(0x%lx): no valid W32 error mapping\n", Status); - - return ERROR_MR_MID_NOT_FOUND; -} - - -/********************************************************************** - * NAME EXPORTED - * RtlNtStatusToDosError - * - * DESCRIPTION - * Convert an Executive status ID into a DOS error number - * (winerror.h). - * - * ARGUMENTS - * Status The Executive status ID to convert. - * - * RETURN VALUE - * dos error as in winerror.h - * - * REMARK - * RtlNtStatusToDosErrorNoTeb() does the real work. - * - * @implemented - */ -DWORD STDCALL -RtlNtStatusToDosError(IN NTSTATUS Status) -{ - PTEB Teb = NtCurrentTeb (); - - if (NULL != Teb) - { - Teb->LastStatusValue = Status; - } - return RtlNtStatusToDosErrorNoTeb(Status); -} - - -/********************************************************************** - * NAME EXPORTED - * RtlNtStatusToPsxErrno - * - * DESCRIPTION - * Convert an Executive status ID into a POSIX error number - * (errno.h). - * - * NOTE - * Not present in the legacy WNT (a ReactOS extension to support - * the POSIX+ subsystem). - * - * ARGUMENTS - * Status The Executive status ID to convert. - * - * RETURN VALUE - * errno as in errno.h - * - * REVISIONS - * 1999-11-30 ea - */ -INT STDCALL -RtlNtStatusToPsxErrno(IN NTSTATUS Status) -{ -#if 0 - switch (Status) - { - } -#endif - return -1; /* generic POSIX error */ -} - -/* EOF */ diff --git a/reactos/ntoskrnl/rtl/largeint.c b/reactos/ntoskrnl/rtl/largeint.c deleted file mode 100644 index bbcc7620725..00000000000 --- a/reactos/ntoskrnl/rtl/largeint.c +++ /dev/null @@ -1,356 +0,0 @@ -/* $Id: largeint.c,v 1.15 2003/07/11 01:23:15 royce Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: kernel/rtl/largeint.c - * PURPOSE: Large integer operations - * UPDATE HISTORY: - * Created 22/05/98 - * 08/30/98 RJJ Implemented several functions - */ - -/* INCLUDES *****************************************************************/ - -#include <ddk/ntddk.h> - -#define NDEBUG -#include <internal/debug.h> - - -/* FUNCTIONS *****************************************************************/ - -/* - * @implemented - */ -LARGE_INTEGER -STDCALL -RtlConvertLongToLargeInteger ( - LONG SignedInteger - ) -{ - LARGE_INTEGER RC; - - RC.QuadPart = SignedInteger; - - return RC; -} - -/* - * @implemented - */ -LARGE_INTEGER -STDCALL -RtlConvertUlongToLargeInteger ( - ULONG UnsignedInteger - ) -{ - LARGE_INTEGER RC; - - RC.QuadPart = UnsignedInteger; - - return RC; -} - -/* - * @implemented - */ -LARGE_INTEGER -STDCALL -RtlEnlargedIntegerMultiply ( - LONG Multiplicand, - LONG Multiplier - ) -{ - LARGE_INTEGER RC; - - RC.QuadPart = (LONGLONG) Multiplicand * Multiplier; - - return RC; -} - -/* - * @implemented - */ -ULONG -STDCALL -RtlEnlargedUnsignedDivide ( - ULARGE_INTEGER Dividend, - ULONG Divisor, - PULONG Remainder - ) -{ - if (Remainder) - *Remainder = Dividend.QuadPart % Divisor; - - return (ULONG)(Dividend.QuadPart / Divisor); -} - -/* - * @implemented - */ -LARGE_INTEGER -STDCALL -RtlEnlargedUnsignedMultiply ( - ULONG Multiplicand, - ULONG Multiplier - ) -{ - LARGE_INTEGER RC; - - RC.QuadPart = (ULONGLONG) Multiplicand * Multiplier; - - return RC; -} - -/* - * @implemented - */ -LARGE_INTEGER -STDCALL -RtlExtendedIntegerMultiply ( - LARGE_INTEGER Multiplicand, - LONG Multiplier - ) -{ - LARGE_INTEGER RC; - - RC.QuadPart = Multiplicand.QuadPart * Multiplier; - - return RC; -} - -/* - * @implemented - */ -LARGE_INTEGER -STDCALL -RtlExtendedLargeIntegerDivide ( - LARGE_INTEGER Dividend, - ULONG Divisor, - PULONG Remainder - ) -{ - LARGE_INTEGER RC; - - if (Remainder) - *Remainder = Dividend.QuadPart % Divisor; - - RC.QuadPart = Dividend.QuadPart / Divisor; - - return RC; -} - - -/****************************************************************************** - * RtlExtendedMagicDivide - * - * Allows replacing a division by a longlong constant with a multiplication by - * the inverse constant. - * - * RETURNS - * (Dividend * MagicDivisor) >> (64 + ShiftCount) - * - * NOTES - * If the divisor of a division is constant, the constants MagicDivisor and - * shift must be chosen such that - * MagicDivisor = 2^(64 + ShiftCount) / Divisor. - * - * Then we have RtlExtendedMagicDivide(Dividend,MagicDivisor,ShiftCount) == - * Dividend * MagicDivisor / 2^(64 + ShiftCount) == Dividend / Divisor. - * - * The Parameter MagicDivisor although defined as LONGLONG is used as - * ULONGLONG. - */ - -#define LOWER_32(A) ((A) & 0xffffffff) -#define UPPER_32(A) ((A) >> 32) - -/* - * @implemented - */ -LARGE_INTEGER STDCALL -RtlExtendedMagicDivide (LARGE_INTEGER Dividend, - LARGE_INTEGER MagicDivisor, - CCHAR ShiftCount) -{ - ULONGLONG dividend_high; - ULONGLONG dividend_low; - ULONGLONG inverse_divisor_high; - ULONGLONG inverse_divisor_low; - ULONGLONG ah_bl; - ULONGLONG al_bh; - LARGE_INTEGER result; - BOOLEAN positive; - - if (Dividend.QuadPart < 0) - { - dividend_high = UPPER_32((ULONGLONG) -Dividend.QuadPart); - dividend_low = LOWER_32((ULONGLONG) -Dividend.QuadPart); - positive = FALSE; - } - else - { - dividend_high = UPPER_32((ULONGLONG) Dividend.QuadPart); - dividend_low = LOWER_32((ULONGLONG) Dividend.QuadPart); - positive = TRUE; - } - inverse_divisor_high = UPPER_32((ULONGLONG) MagicDivisor.QuadPart); - inverse_divisor_low = LOWER_32((ULONGLONG) MagicDivisor.QuadPart); - - ah_bl = dividend_high * inverse_divisor_low; - al_bh = dividend_low * inverse_divisor_high; - - result.QuadPart = - (LONGLONG) ((dividend_high * inverse_divisor_high + - UPPER_32(ah_bl) + - UPPER_32(al_bh) + - UPPER_32(LOWER_32(ah_bl) + LOWER_32(al_bh) + - UPPER_32(dividend_low * inverse_divisor_low))) >> ShiftCount); - if (!positive) - { - result.QuadPart = -result.QuadPart; - } - - return result; -} - - -/* - * @implemented - */ -LARGE_INTEGER -STDCALL -RtlLargeIntegerAdd ( - LARGE_INTEGER Addend1, - LARGE_INTEGER Addend2 - ) -{ - LARGE_INTEGER RC; - - RC.QuadPart = Addend1.QuadPart + Addend2.QuadPart; - - return RC; -} - -/* - * @implemented - */ -LARGE_INTEGER -STDCALL -RtlLargeIntegerArithmeticShift ( - LARGE_INTEGER LargeInteger, - CCHAR ShiftCount - ) -{ - LARGE_INTEGER RC; - CHAR Shift; - - Shift = ShiftCount % 64; - - if (Shift < 32) - { - RC.QuadPart = LargeInteger.QuadPart >> Shift; - } - else - { - /* copy the sign bit */ - RC.u.HighPart |= (LargeInteger.u.HighPart & 0x80000000); - RC.u.LowPart = LargeInteger.u.HighPart >> Shift; - } - - return RC; -} - -/* - * @implemented - */ -LARGE_INTEGER -STDCALL -RtlLargeIntegerDivide ( - LARGE_INTEGER Dividend, - LARGE_INTEGER Divisor, - PLARGE_INTEGER Remainder - ) -{ - LARGE_INTEGER RC; - - if (Remainder) - Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart; - - RC.QuadPart = Dividend.QuadPart / Divisor.QuadPart; - - return RC; -} - -/* - * @implemented - */ -LARGE_INTEGER -STDCALL -RtlLargeIntegerNegate ( - LARGE_INTEGER Subtrahend - ) -{ - LARGE_INTEGER RC; - - RC.QuadPart = - Subtrahend.QuadPart; - - return RC; -} - -/* - * @implemented - */ -LARGE_INTEGER -STDCALL -RtlLargeIntegerShiftLeft ( - LARGE_INTEGER LargeInteger, - CCHAR ShiftCount - ) -{ - LARGE_INTEGER RC; - CHAR Shift; - - Shift = ShiftCount % 64; - RC.QuadPart = LargeInteger.QuadPart << Shift; - - return RC; -} - -/* - * @implemented - */ -LARGE_INTEGER -STDCALL -RtlLargeIntegerShiftRight ( - LARGE_INTEGER LargeInteger, - CCHAR ShiftCount - ) -{ - LARGE_INTEGER RC; - CHAR Shift; - - Shift = ShiftCount % 64; - RC.QuadPart = LargeInteger.QuadPart >> ShiftCount; - - return RC; -} - -/* - * @implemented - */ -LARGE_INTEGER -STDCALL -RtlLargeIntegerSubtract ( - LARGE_INTEGER Minuend, - LARGE_INTEGER Subtrahend - ) -{ - LARGE_INTEGER RC; - - RC.QuadPart = Minuend.QuadPart - Subtrahend.QuadPart; - - return RC; -} - -/* EOF */ diff --git a/reactos/ntoskrnl/rtl/mem.c b/reactos/ntoskrnl/rtl/mem.c deleted file mode 100644 index e91e1c9e18a..00000000000 --- a/reactos/ntoskrnl/rtl/mem.c +++ /dev/null @@ -1,276 +0,0 @@ -/* $Id: mem.c,v 1.21 2004/02/03 14:24:02 ekohl Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: kernel/rtl/mem.c - * PURPOSE: Memory functions - * PROGRAMMER: David Welch (welch@mcmail.com) - * UPDATE HISTORY: - * Created 22/05/98 - */ - -/* INCLUDES *****************************************************************/ - -#include <ddk/ntddk.h> -#include <internal/mm.h> - -#define NDEBUG -#include <internal/debug.h> - -/* FUNCTIONS *****************************************************************/ - -NTSTATUS STDCALL -MmCopyToCaller(PVOID Dest, const VOID *Src, ULONG NumberOfBytes) -{ - NTSTATUS Status; - - if (ExGetPreviousMode() == UserMode) - { - if ((ULONG)Dest >= KERNEL_BASE) - { - return(STATUS_ACCESS_VIOLATION); - } - Status = MmSafeCopyToUser(Dest, Src, NumberOfBytes); - return(Status); - } - else - { - memcpy(Dest, Src, NumberOfBytes); - return(STATUS_SUCCESS); - } -} - -NTSTATUS STDCALL -MmCopyFromCaller(PVOID Dest, const VOID *Src, ULONG NumberOfBytes) -{ - NTSTATUS Status; - - if (ExGetPreviousMode() == UserMode) - { - if ((ULONG)Src >= KERNEL_BASE) - { - return(STATUS_ACCESS_VIOLATION); - } - Status = MmSafeCopyFromUser(Dest, Src, NumberOfBytes); - return(Status); - } - else - { - memcpy(Dest, Src, NumberOfBytes); - return(STATUS_SUCCESS); - } -} - - -/* - * @implemented - */ -ULONG -STDCALL -RtlCompareMemory(PVOID Source1, - PVOID Source2, - ULONG Length) -/* - * FUNCTION: Compares blocks of memory and returns the number of equal bytes - * ARGUMENTS: - * Source1 = Block to compare - * Source2 = Block to compare - * Length = Number of bytes to compare - * RETURNS: Number of equal bytes - */ -{ - ULONG i,total; - - for (i=0,total=0;i<Length;i++) - { - if ( ((PUCHAR)Source1)[i] == ((PUCHAR)Source2)[i] ) - { - total++; - } - } - return(total); -} - - -/* - * @implemented - */ -ULONG -STDCALL -RtlCompareMemoryUlong ( - PVOID Source, - ULONG Length, - ULONG Value - ) -/* - * FUNCTION: Compares a block of ULONGs with an ULONG and returns the number of equal bytes - * ARGUMENTS: - * Source = Block to compare - * Length = Number of bytes to compare - * Value = Value to compare - * RETURNS: Number of equal bytes - */ -{ - PULONG ptr = (PULONG)Source; - ULONG len = Length / sizeof(ULONG); - ULONG i; - - for (i = 0; i < len; i++) - { - if (*ptr != Value) - break; - ptr++; - } - - return (ULONG)((PCHAR)ptr - (PCHAR)Source); -} - - -#if 0 -VOID RtlCopyBytes(PVOID Destination, - CONST VOID* Source, - ULONG Length) -{ - RtlCopyMemory(Destination,Source,Length); -} -#endif - -#if 0 -VOID RtlCopyMemory(VOID* Destination, CONST VOID* Source, ULONG Length) -{ - DPRINT("RtlCopyMemory(Destination %x Source %x Length %d\n", - Destination,Source,Length); - memcpy(Destination,Source,Length); - DPRINT("*Destination %x\n",*(PULONG)Destination); -} -#endif - -/* - * @implemented - */ -VOID -STDCALL -RtlFillMemory ( - PVOID Destination, - ULONG Length, - UCHAR Fill - ) -{ - memset(Destination,Fill,Length); -} - - -/* - * @implemented - */ -VOID -STDCALL -RtlFillMemoryUlong ( - PVOID Destination, - ULONG Length, - ULONG Fill - ) -{ - PULONG Dest = Destination; - ULONG Count = Length / sizeof(ULONG); - - while (Count > 0) - { - *Dest = Fill; - Dest++; - Count--; - } -} - - -/* - * @implemented - */ -VOID -STDCALL -RtlMoveMemory ( - PVOID Destination, - CONST VOID * Source, - ULONG Length - ) -{ - memmove ( - Destination, - Source, - Length - ); -} - - -/* - * @implemented - */ -VOID -STDCALL -RtlZeroMemory ( - PVOID Destination, - ULONG Length - ) -{ - RtlFillMemory ( - Destination, - Length, - 0 - ); -} - - -/************************************************************************* - * RtlUshortByteSwap - * - * Swap the bytes of an unsigned short value. - * - * NOTES - * Based on the inline versions in Wine winternl.h - * - * @implemented - */ -USHORT FASTCALL -RtlUshortByteSwap (IN USHORT Source) -{ - return (Source >> 8) | (Source << 8); -} - - -/************************************************************************* - * RtlUlongByteSwap - * - * Swap the bytes of an unsigned int value. - * - * NOTES - * Based on the inline versions in Wine winternl.h - * - * @implemented - */ -ULONG FASTCALL -RtlUlongByteSwap (IN ULONG Source) -{ - return ((ULONG) RtlUshortByteSwap ((USHORT)Source) << 16) | RtlUshortByteSwap ((USHORT)(Source >> 16)); -} - - -/************************************************************************* - * RtlUlonglongByteSwap - * - * Swap the bytes of an unsigned long long value. - * - * PARAMS - * i [I] Value to swap bytes of - * - * RETURNS - * The value with its bytes swapped. - * - * @implemented - */ -ULONGLONG FASTCALL -RtlUlonglongByteSwap (IN ULONGLONG Source) -{ - return ((ULONGLONG) RtlUlongByteSwap (Source) << 32) | RtlUlongByteSwap (Source>>32); -} - -/* EOF */ diff --git a/reactos/ntoskrnl/rtl/random.c b/reactos/ntoskrnl/rtl/random.c deleted file mode 100644 index 40a5f463ea9..00000000000 --- a/reactos/ntoskrnl/rtl/random.c +++ /dev/null @@ -1,96 +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: random.c,v 1.1 2003/06/07 11:30:10 ekohl Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * PURPOSE: Random number generator functions - * FILE: ntoskrnl/rtl/random.c - */ - -/* INCLUDES *****************************************************************/ - -#include <ddk/ntddk.h> - - -static ULONG SavedValue[128] = -{ - 0x4c8bc0aa, 0x4c022957, 0x2232827a, 0x2f1e7626, /* 0 */ - 0x7f8bdafb, 0x5c37d02a, 0x0ab48f72, 0x2f0c4ffa, /* 4 */ - 0x290e1954, 0x6b635f23, 0x5d3885c0, 0x74b49ff8, /* 8 */ - 0x5155fa54, 0x6214ad3f, 0x111e9c29, 0x242a3a09, /* 12 */ - 0x75932ae1, 0x40ac432e, 0x54f7ba7a, 0x585ccbd5, /* 16 */ - 0x6df5c727, 0x0374dad1, 0x7112b3f1, 0x735fc311, /* 20 */ - 0x404331a9, 0x74d97781, 0x64495118, 0x323e04be, /* 24 */ - 0x5974b425, 0x4862e393, 0x62389c1d, 0x28a68b82, /* 28 */ - 0x0f95da37, 0x7a50bbc6, 0x09b0091c, 0x22cdb7b4, /* 32 */ - 0x4faaed26, 0x66417ccd, 0x189e4bfa, 0x1ce4e8dd, /* 36 */ - 0x5274c742, 0x3bdcf4dc, 0x2d94e907, 0x32eac016, /* 40 */ - 0x26d33ca3, 0x60415a8a, 0x31f57880, 0x68c8aa52, /* 44 */ - 0x23eb16da, 0x6204f4a1, 0x373927c1, 0x0d24eb7c, /* 48 */ - 0x06dd7379, 0x2b3be507, 0x0f9c55b1, 0x2c7925eb, /* 52 */ - 0x36d67c9a, 0x42f831d9, 0x5e3961cb, 0x65d637a8, /* 56 */ - 0x24bb3820, 0x4d08e33d, 0x2188754f, 0x147e409e, /* 60 */ - 0x6a9620a0, 0x62e26657, 0x7bd8ce81, 0x11da0abb, /* 64 */ - 0x5f9e7b50, 0x23e444b6, 0x25920c78, 0x5fc894f0, /* 68 */ - 0x5e338cbb, 0x404237fd, 0x1d60f80f, 0x320a1743, /* 72 */ - 0x76013d2b, 0x070294ee, 0x695e243b, 0x56b177fd, /* 76 */ - 0x752492e1, 0x6decd52f, 0x125f5219, 0x139d2e78, /* 80 */ - 0x1898d11e, 0x2f7ee785, 0x4db405d8, 0x1a028a35, /* 84 */ - 0x63f6f323, 0x1f6d0078, 0x307cfd67, 0x3f32a78a, /* 88 */ - 0x6980796c, 0x462b3d83, 0x34b639f2, 0x53fce379, /* 92 */ - 0x74ba50f4, 0x1abc2c4b, 0x5eeaeb8d, 0x335a7a0d, /* 96 */ - 0x3973dd20, 0x0462d66b, 0x159813ff, 0x1e4643fd, /* 100 */ - 0x06bc5c62, 0x3115e3fc, 0x09101613, 0x47af2515, /* 104 */ - 0x4f11ec54, 0x78b99911, 0x3db8dd44, 0x1ec10b9b, /* 108 */ - 0x5b5506ca, 0x773ce092, 0x567be81a, 0x5475b975, /* 112 */ - 0x7a2cde1a, 0x494536f5, 0x34737bb4, 0x76d9750b, /* 116 */ - 0x2a1f6232, 0x2e49644d, 0x7dddcbe7, 0x500cebdb, /* 120 */ - 0x619dab9e, 0x48c626fe, 0x1cda3193, 0x52dabe9d /* 124 */ -}; - - -/************************************************************************* - * RtlRandom [NTDLL.@] - * - * Generates a random number - * - * PARAMS - * Seed [O] The seed of the Random function - * - * RETURNS - * It returns a random number distributed over [0..MAXLONG-1]. - */ -ULONG STDCALL -RtlRandom (IN OUT PULONG Seed) -{ - ULONG Rand; - int Pos; - ULONG Result; - - Rand = (*Seed * 0x7fffffed + 0x7fffffc3) % 0x7fffffff; - *Seed = (Rand * 0x7fffffed + 0x7fffffc3) % 0x7fffffff; - Pos = *Seed & 0x7f; - Result = SavedValue[Pos]; - SavedValue[Pos] = Rand; - - return Result; -} - -/* EOF */ diff --git a/reactos/ntoskrnl/rtl/time.c b/reactos/ntoskrnl/rtl/time.c deleted file mode 100644 index 24db8facb60..00000000000 --- a/reactos/ntoskrnl/rtl/time.c +++ /dev/null @@ -1,292 +0,0 @@ -/* $Id: time.c,v 1.18 2003/12/30 18:52:06 fireball Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: kernel/rtl/time.c - * PURPOSE: Conversion between Time and TimeFields - * PROGRAMMER: Rex Jolliff (rex@lvcablemodem.com) - * UPDATE HISTORY: - * Created 22/05/98 - * 08/03/98 RJJ Implemented these functions - */ - -/* INCLUDES *****************************************************************/ - -#include <ddk/ntddk.h> - -#define NDEBUG -#include <internal/debug.h> - -#define TICKSPERMIN 600000000 -#define TICKSPERSEC 10000000 -#define TICKSPERMSEC 10000 -#define SECSPERDAY 86400 -#define SECSPERHOUR 3600 -#define SECSPERMIN 60 -#define MINSPERHOUR 60 -#define HOURSPERDAY 24 -#define EPOCHWEEKDAY 1 -#define DAYSPERWEEK 7 -#define EPOCHYEAR 1601 -#define DAYSPERNORMALYEAR 365 -#define DAYSPERLEAPYEAR 366 -#define MONSPERYEAR 12 - -#if defined(__GNUC__) -#define TICKSTO1970 0x019db1ded53e8000LL -#define TICKSTO1980 0x01a8e79fe1d58000LL -#else -#define TICKSTO1970 0x019db1ded53e8000i64 -#define TICKSTO1980 0x01a8e79fe1d58000i64 -#endif - - -static const int YearLengths[2] = {DAYSPERNORMALYEAR, DAYSPERLEAPYEAR}; -static const int MonthLengths[2][MONSPERYEAR] = -{ - { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, - { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } -}; - -static __inline int IsLeapYear(int Year) -{ - return Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0) ? 1 : 0; -} - -static __inline void NormalizeTimeFields(CSHORT *FieldToNormalize, - CSHORT *CarryField, - int Modulus) -{ - *FieldToNormalize = (CSHORT) (*FieldToNormalize - Modulus); - *CarryField = (CSHORT) (*CarryField + 1); -} - -/* FUNCTIONS *****************************************************************/ - -/* - * @unimplemented - */ -VOID -STDCALL -RtlTimeToTimeFields( - PLARGE_INTEGER liTime, - PTIME_FIELDS TimeFields) -{ - const int *Months; - int LeapSecondCorrections, SecondsInDay, CurYear; - int LeapYear, CurMonth, GMTOffset; - long int Days; -#if defined(__GNUC__) - long long int Time = (long long int)liTime->QuadPart; -#else - __int64 Time = (__int64)liTime->QuadPart; -#endif - - /* Extract millisecond from time and convert time into seconds */ - TimeFields->Milliseconds = (CSHORT) ((Time % TICKSPERSEC) / TICKSPERMSEC); - Time = Time / TICKSPERSEC; - - /* FIXME: Compute the number of leap second corrections here */ - LeapSecondCorrections = 0; - - /* FIXME: get the GMT offset here */ - GMTOffset = 0; - - /* Split the time into days and seconds within the day */ - Days = Time / SECSPERDAY; - SecondsInDay = Time % SECSPERDAY; - - /* Adjust the values for GMT and leap seconds */ - SecondsInDay += (GMTOffset - LeapSecondCorrections); - while (SecondsInDay < 0) - { - SecondsInDay += SECSPERDAY; - Days--; - } - while (SecondsInDay >= SECSPERDAY) - { - SecondsInDay -= SECSPERDAY; - Days++; - } - - /* compute time of day */ - TimeFields->Hour = (CSHORT) (SecondsInDay / SECSPERHOUR); - SecondsInDay = SecondsInDay % SECSPERHOUR; - TimeFields->Minute = (CSHORT) (SecondsInDay / SECSPERMIN); - TimeFields->Second = (CSHORT) (SecondsInDay % SECSPERMIN); - - /* FIXME: handle the possibility that we are on a leap second (i.e. Second = 60) */ - - /* compute day of week */ - TimeFields->Weekday = (CSHORT) ((EPOCHWEEKDAY + Days) % DAYSPERWEEK); - - /* compute year */ - CurYear = EPOCHYEAR; - CurYear += Days / DAYSPERLEAPYEAR; - Days -= (CurYear - EPOCHYEAR) * DAYSPERLEAPYEAR; - CurYear--; /* The next calculation needs CurYear - 1 */ - Days += CurYear - CurYear / 4 + CurYear / 100 - CurYear / 400; - CurYear++; - Days -= EPOCHYEAR - 1 - (EPOCHYEAR -1) / 4 + (EPOCHYEAR -1) / 100 - (EPOCHYEAR - 1) / 400; - /* FIXME: handle calendar modifications */ - while (1) - { - LeapYear = IsLeapYear(CurYear); - if (Days < (long) YearLengths[LeapYear]) - { - break; - } - CurYear++; - Days = Days - (long) YearLengths[LeapYear]; - } - TimeFields->Year = (CSHORT) CurYear; - - /* Compute month of year */ - LeapYear = IsLeapYear(CurYear); - Months = MonthLengths[LeapYear]; - for (CurMonth = 0; Days >= (long) Months[CurMonth]; CurMonth++) - Days = Days - (long) Months[CurMonth]; - TimeFields->Month = (CSHORT) (CurMonth + 1); - TimeFields->Day = (CSHORT) (Days + 1); -} - -/* - * @unimplemented - */ -BOOLEAN -STDCALL -RtlTimeFieldsToTime( - PTIME_FIELDS tfTimeFields, - PLARGE_INTEGER Time) -{ - int CurMonth; -#if defined(__GNUC__) - long long int rcTime; -#else - __int64 rcTime; -#endif - TIME_FIELDS TimeFields = *tfTimeFields; - const int *Months; - - rcTime = 0; - - /* Normalize the month value, because we don't know the length for month -1, 0, 13, 14, ... */ - if (TimeFields.Month < 1 || TimeFields.Month > 12) - { - TimeFields.Year += (TimeFields.Month - 1) / MONSPERYEAR; - TimeFields.Month = ((TimeFields.Month - 1) % MONSPERYEAR) + 1; - if (TimeFields.Month < 1) - { - TimeFields.Year--; - TimeFields.Month += MONSPERYEAR; - } - } - /* FIXME: handle calendar corrections here */ - - rcTime += (TimeFields.Year - EPOCHYEAR) * DAYSPERNORMALYEAR; - /* Adjust leap years */ - rcTime += (TimeFields.Year - 1)/ 4 - (TimeFields.Year - 1) / 100 + (TimeFields.Year - 1) / 400; - rcTime -= EPOCHYEAR / 4 - EPOCHYEAR / 100 + EPOCHYEAR / 400; - - /* FIXME: handle calendar corrections here */ - Months = MonthLengths[IsLeapYear(TimeFields.Year)]; - for (CurMonth = 1; CurMonth < TimeFields.Month; CurMonth++) - { - rcTime += Months[CurMonth - 1]; - } - rcTime += TimeFields.Day - 1; - rcTime *= SECSPERDAY; - rcTime += TimeFields.Hour * SECSPERHOUR + TimeFields.Minute * SECSPERMIN + - TimeFields.Second; - rcTime *= TICKSPERSEC; - rcTime += TimeFields.Milliseconds * TICKSPERMSEC; - - /* FIXME: handle UTC bias here */ -// rcTime += UTCBias * TICKSPERMIN; - - *Time = *(LARGE_INTEGER *)&rcTime; - - return TRUE; -} - - -/* - * @implemented - */ -VOID -STDCALL -RtlSecondsSince1970ToTime( - ULONG SecondsSince1970, - PLARGE_INTEGER Time) -{ - LONGLONG llTime; - - llTime = (SecondsSince1970 * TICKSPERSEC) + TICKSTO1970; - - *Time = *(LARGE_INTEGER *)&llTime; -} - - -/* - * @implemented - */ -VOID -STDCALL -RtlSecondsSince1980ToTime( - ULONG SecondsSince1980, - PLARGE_INTEGER Time) -{ - LONGLONG llTime; - - llTime = (SecondsSince1980 * TICKSPERSEC) + TICKSTO1980; - - *Time = *(LARGE_INTEGER *)&llTime; -} - - -/* - * @implemented - */ -BOOLEAN -STDCALL -RtlTimeToSecondsSince1970( - PLARGE_INTEGER Time, - PULONG SecondsSince1970) -{ - LARGE_INTEGER liTime; - - liTime.QuadPart = Time->QuadPart - TICKSTO1970; - liTime.QuadPart = liTime.QuadPart / TICKSPERSEC; - - if (liTime.u.HighPart != 0) - return FALSE; - - *SecondsSince1970 = liTime.u.LowPart; - - return TRUE; -} - - -/* - * @implemented - */ -BOOLEAN -STDCALL -RtlTimeToSecondsSince1980( - PLARGE_INTEGER Time, - PULONG SecondsSince1980) -{ - LARGE_INTEGER liTime; - - liTime.QuadPart = Time->QuadPart - TICKSTO1980; - liTime.QuadPart = liTime.QuadPart / TICKSPERSEC; - - if (liTime.u.HighPart != 0) - return FALSE; - - *SecondsSince1980 = liTime.u.LowPart; - - return TRUE; -} - -/* EOF */ diff --git a/reactos/ntoskrnl/rtl/timezone.c b/reactos/ntoskrnl/rtl/timezone.c deleted file mode 100644 index 2c8fd515423..00000000000 --- a/reactos/ntoskrnl/rtl/timezone.c +++ /dev/null @@ -1,174 +0,0 @@ -/* $Id: timezone.c,v 1.6 2003/10/16 12:45:09 ekohl Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * PURPOSE: Timezone functions - * FILE: ntoskrnl/rtl/timezone.c - * PROGRAMER: Eric Kohl - * REVISION HISTORY: - * 29/05/2001: Created - */ - -/* INCLUDES *****************************************************************/ - -#include <ddk/ntddk.h> -#include <ntos/time.h> - -#define NDEBUG -#include <ntdll/ntdll.h> - - -/* FUNCTIONS *****************************************************************/ - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlQueryTimeZoneInformation(PTIME_ZONE_INFORMATION TimeZoneInformation) -{ - RTL_QUERY_REGISTRY_TABLE QueryTable[8]; - UNICODE_STRING StandardName; - UNICODE_STRING DaylightName; - NTSTATUS Status; - - DPRINT("RtlQueryTimeZoneInformation()\n"); - - RtlZeroMemory(QueryTable, - sizeof(QueryTable)); - - StandardName.Length = 0; - StandardName.MaximumLength = 32 * sizeof(WCHAR); - StandardName.Buffer = TimeZoneInformation->StandardName; - - DaylightName.Length = 0; - DaylightName.MaximumLength = 32 * sizeof(WCHAR); - DaylightName.Buffer = TimeZoneInformation->DaylightName; - - QueryTable[0].Name = L"Bias"; - QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT; - QueryTable[0].EntryContext = &TimeZoneInformation->Bias; - - QueryTable[1].Name = L"Standard Name"; - QueryTable[1].Flags = RTL_QUERY_REGISTRY_DIRECT; - QueryTable[1].EntryContext = &StandardName; - - QueryTable[2].Name = L"Standard Bias"; - QueryTable[2].Flags = RTL_QUERY_REGISTRY_DIRECT; - QueryTable[2].EntryContext = &TimeZoneInformation->StandardBias; - - QueryTable[3].Name = L"Standard Start"; - QueryTable[3].Flags = RTL_QUERY_REGISTRY_DIRECT; - QueryTable[3].EntryContext = &TimeZoneInformation->StandardDate; - - QueryTable[4].Name = L"Daylight Name"; - QueryTable[4].Flags = RTL_QUERY_REGISTRY_DIRECT; - QueryTable[4].EntryContext = &DaylightName; - - QueryTable[5].Name = L"Daylight Bias"; - QueryTable[5].Flags = RTL_QUERY_REGISTRY_DIRECT; - QueryTable[5].EntryContext = &TimeZoneInformation->DaylightBias; - - QueryTable[6].Name = L"Daylight Start"; - QueryTable[6].Flags = RTL_QUERY_REGISTRY_DIRECT; - QueryTable[6].EntryContext = &TimeZoneInformation->DaylightDate; - - Status = RtlQueryRegistryValues(RTL_REGISTRY_CONTROL, - L"TimeZoneInformation", - QueryTable, - NULL, - NULL); - - return Status; -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlSetTimeZoneInformation(PTIME_ZONE_INFORMATION TimeZoneInformation) -{ - ULONG Length; - NTSTATUS Status; - - DPRINT("RtlSetTimeZoneInformation()\n"); - - Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL, - L"TimeZoneInformation", - L"Bias", - REG_DWORD, - &TimeZoneInformation->Bias, - sizeof(LONG)); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - Length = (wcslen(TimeZoneInformation->StandardName) + 1) * sizeof(WCHAR); - Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL, - L"TimeZoneInformation", - L"Standard Name", - REG_SZ, - TimeZoneInformation->StandardName, - Length); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL, - L"TimeZoneInformation", - L"Standard Bias", - REG_DWORD, - &TimeZoneInformation->StandardBias, - sizeof(LONG)); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL, - L"TimeZoneInformation", - L"Standard Start", - REG_BINARY, - &TimeZoneInformation->StandardDate, - sizeof(SYSTEMTIME)); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - Length = (wcslen(TimeZoneInformation->DaylightName) + 1) * sizeof(WCHAR); - Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL, - L"TimeZoneInformation", - L"Daylight Name", - REG_SZ, - TimeZoneInformation->DaylightName, - Length); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL, - L"TimeZoneInformation", - L"Daylight Bias", - REG_DWORD, - &TimeZoneInformation->DaylightBias, - sizeof(LONG)); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL, - L"TimeZoneInformation", - L"Daylight Start", - REG_BINARY, - &TimeZoneInformation->DaylightDate, - sizeof(SYSTEMTIME)); - - return Status; -} - -/* EOF */ diff --git a/reactos/ntoskrnl/rtl/unicode.c b/reactos/ntoskrnl/rtl/unicode.c deleted file mode 100644 index 80059c800fc..00000000000 --- a/reactos/ntoskrnl/rtl/unicode.c +++ /dev/null @@ -1,1672 +0,0 @@ -/* $Id: unicode.c,v 1.37 2004/02/02 19:04:11 hbirr Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: ntoskrnl/rtl/unicode.c - * PURPOSE: String functions - * PROGRAMMERS: Jason Filby (jasonfilby@yahoo.com) - * Vizzini (vizzini@plasmic.com) - * UPDATE HISTORY: - * Created 10/08/98 - */ - -#include <ddk/ntddk.h> -#include <internal/ctype.h> -#include <ntos/minmax.h> -#include <internal/pool.h> -#include <internal/nls.h> - -#define NDEBUG -#include <internal/debug.h> - - -/* GLOBALS *******************************************************************/ - -#define TAG_USTR TAG('U', 'S', 'T', 'R') -#define TAG_ASTR TAG('A', 'S', 'T', 'R') -#define TAG_OSTR TAG('O', 'S', 'T', 'R') - - -/* FUNCTIONS *****************************************************************/ - -WCHAR -STDCALL -RtlAnsiCharToUnicodeChar(IN CHAR AnsiChar) -{ - ULONG Size; - WCHAR UnicodeChar; - - Size = 1; -#if 0 - Size = (NlsLeadByteInfo[AnsiChar] == 0) ? 1 : 2; -#endif - - RtlMultiByteToUnicodeN(&UnicodeChar, - sizeof(WCHAR), - NULL, - &AnsiChar, - Size); - - return(UnicodeChar); -} - - -/* - * @implemented - */ -ULONG -STDCALL -RtlAnsiStringToUnicodeSize(IN PANSI_STRING AnsiString) -{ - ULONG Size; - - RtlMultiByteToUnicodeSize(&Size, - AnsiString->Buffer, - AnsiString->Length); - - return(Size); -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlAnsiStringToUnicodeString(IN OUT PUNICODE_STRING DestinationString, - IN PANSI_STRING SourceString, - IN BOOLEAN AllocateDestinationString) -{ - NTSTATUS Status; - ULONG Length; - - if (NlsMbCodePageTag == TRUE) - Length = RtlAnsiStringToUnicodeSize (SourceString); - else - Length = SourceString->Length * sizeof(WCHAR); - - if (Length > 65535) - return STATUS_INVALID_PARAMETER_2; - - if (AllocateDestinationString == TRUE) - { - DestinationString->MaximumLength = Length + sizeof(WCHAR); - DestinationString->Buffer = - ExAllocatePoolWithTag (NonPagedPool, - DestinationString->MaximumLength, - TAG_USTR); - if (DestinationString->Buffer == NULL) - return STATUS_NO_MEMORY; - } - else - { - if (Length + sizeof(WCHAR) > DestinationString->MaximumLength) - { - DPRINT("STATUS_BUFFER_TOO_SMALL\n"); - return STATUS_BUFFER_TOO_SMALL; - } - } - DestinationString->Length = Length; - - RtlZeroMemory (DestinationString->Buffer, - DestinationString->Length); - - Status = RtlMultiByteToUnicodeN (DestinationString->Buffer, - DestinationString->Length, - NULL, - SourceString->Buffer, - SourceString->Length); - if (!NT_SUCCESS(Status)) - { - if (AllocateDestinationString) - ExFreePool (DestinationString->Buffer); - return Status; - } - - DestinationString->Buffer[Length / sizeof(WCHAR)] = 0; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlAppendAsciizToString(IN OUT PSTRING Destination, - IN PCSZ Source) -{ - ULONG Length; - PCHAR Ptr; - - if (Source == NULL) - return STATUS_SUCCESS; - - Length = strlen (Source); - if (Destination->Length + Length >= Destination->MaximumLength) - return STATUS_BUFFER_TOO_SMALL; - - Ptr = Destination->Buffer + Destination->Length; - memmove (Ptr, - Source, - Length); - Ptr += Length; - *Ptr = 0; - - Destination->Length += Length; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlAppendStringToString(IN OUT PSTRING Destination, - IN PSTRING Source) -{ - PCHAR Ptr; - - if (Source->Length == 0) - return(STATUS_SUCCESS); - - if (Destination->Length + Source->Length >= Destination->MaximumLength) - return(STATUS_BUFFER_TOO_SMALL); - - Ptr = Destination->Buffer + Destination->Length; - memmove(Ptr, - Source->Buffer, - Source->Length); - Ptr += Source->Length; - *Ptr = 0; - - Destination->Length += Source->Length; - - return(STATUS_SUCCESS); -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlAppendUnicodeStringToString(IN OUT PUNICODE_STRING Destination, - IN PUNICODE_STRING Source) -{ - - if ((Source->Length + Destination->Length) >= Destination->MaximumLength) - return STATUS_BUFFER_TOO_SMALL; - - memcpy((char*)Destination->Buffer + Destination->Length, Source->Buffer, Source->Length); - Destination->Length += Source->Length; - Destination->Buffer[Destination->Length / sizeof(WCHAR)] = 0; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlAppendUnicodeToString(IN OUT PUNICODE_STRING Destination, - IN PWSTR Source) -{ - ULONG slen; - - slen = wcslen(Source) * sizeof(WCHAR); - - if (Destination->Length + slen >= Destination->MaximumLength) - return(STATUS_BUFFER_TOO_SMALL); - - memcpy((char*)Destination->Buffer + Destination->Length, Source, slen + sizeof(WCHAR)); - Destination->Length += slen; - - return(STATUS_SUCCESS); -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlCharToInteger(IN PCSZ String, - IN ULONG Base, - IN OUT PULONG Value) -{ - ULONG Val; - - *Value = 0; - - if (Base == 0) - { - Base = 10; - if (*String == '0') - { - Base = 8; - String++; - if ((*String == 'x') && isxdigit (String[1])) - { - String++; - Base = 16; - } - } - } - - if (!isxdigit (*String)) - return(STATUS_INVALID_PARAMETER); - - while (isxdigit (*String) && - (Val = isdigit (*String) ? * String - '0' : (islower (*String) - ? toupper (*String) : *String) - 'A' + 10) < Base) - { - *Value = *Value * Base + Val; - String++; - } - - return(STATUS_SUCCESS); -} - - -/* - * @implemented - */ -LONG -STDCALL -RtlCompareString(IN PSTRING String1, - IN PSTRING String2, - IN BOOLEAN CaseInsensitive) -{ - ULONG len1, len2; - PCHAR s1, s2; - CHAR c1, c2; - - if (String1 && String2) - { - len1 = String1->Length; - len2 = String2->Length; - s1 = String1->Buffer; - s2 = String2->Buffer; - - if (s1 && s2) - { - if (CaseInsensitive) - { - while (1) - { - c1 = len1-- ? RtlUpperChar (*s1++) : 0; - c2 = len2-- ? RtlUpperChar (*s2++) : 0; - if (!c1 || !c2 || c1 != c2) - return c1 - c2; - } - } - else - { - while (1) - { - c1 = len1-- ? *s1++ : 0; - c2 = len2-- ? *s2++ : 0; - if (!c1 || !c2 || c1 != c2) - return c1 - c2; - } - } - } - } - - return 0; -} - - -/* - * @implemented - */ -LONG -STDCALL -RtlCompareUnicodeString(IN PUNICODE_STRING String1, - IN PUNICODE_STRING String2, - IN BOOLEAN CaseInsensitive) -{ - ULONG len1, len2; - PWCHAR s1, s2; - WCHAR c1, c2; - - if (String1 && String2) - { - len1 = String1->Length / sizeof(WCHAR); - len2 = String2->Length / sizeof(WCHAR); - s1 = String1->Buffer; - s2 = String2->Buffer; - - if (s1 && s2) - { - if (CaseInsensitive) - { - while (1) - { - c1 = len1-- ? RtlUpcaseUnicodeChar (*s1++) : 0; - c2 = len2-- ? RtlUpcaseUnicodeChar (*s2++) : 0; - if (!c1 || !c2 || c1 != c2) - return c1 - c2; - } - } - else - { - while (1) - { - c1 = len1-- ? *s1++ : 0; - c2 = len2-- ? *s2++ : 0; - if (!c1 || !c2 || c1 != c2) - return c1 - c2; - } - } - } - } - - return 0; -} - - -/* - * @implemented - */ -VOID -STDCALL -RtlCopyString(IN OUT PSTRING DestinationString, - IN PSTRING SourceString) -{ - ULONG copylen; - - if(SourceString == NULL) - { - DestinationString->Length = 0; - return; - } - - copylen = min (DestinationString->MaximumLength - sizeof(CHAR), - SourceString->Length); - - memcpy(DestinationString->Buffer, SourceString->Buffer, copylen); - DestinationString->Buffer[copylen] = 0; - DestinationString->Length = copylen; -} - - -/* - * @implemented - */ -VOID -STDCALL -RtlCopyUnicodeString(IN OUT PUNICODE_STRING DestinationString, - IN PUNICODE_STRING SourceString) -{ - ULONG copylen; - - if(SourceString==NULL) - { - DestinationString->Length=0; - return; - } - - copylen = min(DestinationString->MaximumLength - sizeof(WCHAR), - SourceString->Length); - memcpy(DestinationString->Buffer, SourceString->Buffer, copylen); - DestinationString->Buffer[copylen / sizeof(WCHAR)] = 0; - DestinationString->Length = copylen; -} - - -/* - * @implemented - */ -BOOLEAN -STDCALL -RtlCreateUnicodeString(IN OUT PUNICODE_STRING Destination, - IN PWSTR Source) -{ - ULONG Length; - - Length = (wcslen (Source) + 1) * sizeof(WCHAR); - - Destination->Buffer = ExAllocatePoolWithTag (NonPagedPool, - Length, - TAG_USTR); - if (Destination->Buffer == NULL) - return FALSE; - - memmove (Destination->Buffer, - Source, - Length); - - Destination->MaximumLength = Length; - Destination->Length = Length - sizeof (WCHAR); - - return TRUE; -} - - -BOOLEAN -STDCALL -RtlCreateUnicodeStringFromAsciiz(IN OUT PUNICODE_STRING Destination, - IN PCSZ Source) -{ - ANSI_STRING AnsiString; - NTSTATUS Status; - - RtlInitAnsiString(&AnsiString, - Source); - - Status = RtlAnsiStringToUnicodeString(Destination, - &AnsiString, - TRUE); - - return(NT_SUCCESS(Status)); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlDowncaseUnicodeString(IN OUT PUNICODE_STRING DestinationString, - IN PUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString) -{ - ULONG i; - PWCHAR Src, Dest; - - if (AllocateDestinationString == TRUE) - { - DestinationString->MaximumLength = SourceString->Length + sizeof(WCHAR); - DestinationString->Buffer = - ExAllocatePoolWithTag (NonPagedPool, - SourceString->Length + sizeof(WCHAR), - TAG_USTR); - if (DestinationString->Buffer == NULL) - return STATUS_NO_MEMORY; - } - else - { - if (SourceString->Length >= DestinationString->MaximumLength) - return STATUS_BUFFER_TOO_SMALL; - } - DestinationString->Length = SourceString->Length; - - Src = SourceString->Buffer; - Dest = DestinationString->Buffer; - for (i=0; i < SourceString->Length / sizeof(WCHAR); i++) - { - if (*Src < L'A') - { - *Dest = *Src; - } - else if (*Src <= L'Z') - { - *Dest = (*Src + (L'a' - L'A')); - } - else - { - *Dest = RtlDowncaseUnicodeChar(*Src); - } - - Dest++; - Src++; - } - *Dest = 0; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -BOOLEAN -STDCALL -RtlEqualString(IN PSTRING String1, - IN PSTRING String2, - IN BOOLEAN CaseInsensitive) -{ - unsigned long s1l=String1->Length; - unsigned long s2l=String2->Length; - unsigned long i; - char c1, c2; - - if (s1l != s2l) - return FALSE; - - for (i = 0; i < s1l; i++) - { - c1 = *String1->Buffer; - c2 = *String2->Buffer; - - if (CaseInsensitive == TRUE) - { - c1 = RtlUpperChar (c1); - c2 = RtlUpperChar (c2); - } - - if (c1 != c2) - { - String1->Buffer -= i; - String2->Buffer -= i; - return FALSE; - } - - String1->Buffer++; - String2->Buffer++; - } - - String1->Buffer -= i; - String2->Buffer -= i; - - return TRUE; -} - - -/* - * @implemented - */ -BOOLEAN -STDCALL -RtlEqualUnicodeString(IN PUNICODE_STRING String1, - IN PUNICODE_STRING String2, - IN BOOLEAN CaseInsensitive) -{ - unsigned long s1l = String1->Length / sizeof(WCHAR); - unsigned long s2l = String2->Length / sizeof(WCHAR); - unsigned long i; - WCHAR wc1, wc2; - PWCHAR pw1, pw2; - - if (s1l != s2l) - return FALSE; - - pw1 = String1->Buffer; - pw2 = String2->Buffer; - - for (i = 0; i < s1l; i++) - { - if(CaseInsensitive == TRUE) - { - wc1 = RtlUpcaseUnicodeChar (*pw1); - wc2 = RtlUpcaseUnicodeChar (*pw2); - } - else - { - wc1 = *pw1; - wc2 = *pw2; - } - - if (wc1 != wc2) - return FALSE; - - pw1++; - pw2++; - } - - return TRUE; -} - - -/* - * @implemented - */ -VOID -STDCALL -RtlFreeAnsiString(IN PANSI_STRING AnsiString) -{ - if (AnsiString->Buffer == NULL) - return; - - ExFreePool (AnsiString->Buffer); - - AnsiString->Buffer = NULL; - AnsiString->Length = 0; - AnsiString->MaximumLength = 0; -} - - -/* - * @implemented - */ -VOID -STDCALL -RtlFreeOemString(IN POEM_STRING OemString) -{ - if (OemString->Buffer == NULL) - return; - - ExFreePool (OemString->Buffer); - - OemString->Buffer = NULL; - OemString->Length = 0; - OemString->MaximumLength = 0; -} - - -/* - * @implemented - */ -VOID -STDCALL -RtlFreeUnicodeString(IN PUNICODE_STRING UnicodeString) -{ - if (UnicodeString->Buffer == NULL) - return; - - ExFreePool (UnicodeString->Buffer); - - UnicodeString->Buffer = NULL; - UnicodeString->Length = 0; - UnicodeString->MaximumLength = 0; -} - - -/* - * @implemented - */ -VOID -STDCALL -RtlInitAnsiString(IN OUT PANSI_STRING DestinationString, - IN PCSZ SourceString) -{ - ULONG DestSize; - - if (SourceString == NULL) - { - DestinationString->Length = 0; - DestinationString->MaximumLength = 0; - } - else - { - DestSize = strlen ((const char *)SourceString); - DestinationString->Length = DestSize; - DestinationString->MaximumLength = DestSize + sizeof(CHAR); - } - DestinationString->Buffer = (PCHAR)SourceString; -} - - -/* - * @implemented - */ -VOID -STDCALL -RtlInitString(IN OUT PSTRING DestinationString, - IN PCSZ SourceString) -{ - ULONG DestSize; - - if (SourceString == NULL) - { - DestinationString->Length = 0; - DestinationString->MaximumLength = 0; - } - else - { - DestSize = strlen((const char *)SourceString); - DestinationString->Length = DestSize; - DestinationString->MaximumLength = DestSize + sizeof(CHAR); - } - DestinationString->Buffer = (PCHAR)SourceString; -} - - -/* - * @implemented - */ -VOID -STDCALL -RtlInitUnicodeString(IN OUT PUNICODE_STRING DestinationString, - IN PCWSTR SourceString) -{ - ULONG DestSize; - - DPRINT("RtlInitUnicodeString(DestinationString %x, SourceString %x)\n", - DestinationString, - SourceString); - - if (SourceString == NULL) - { - DestinationString->Length = 0; - DestinationString->MaximumLength = 0; - } - else - { - DestSize = wcslen((PWSTR)SourceString) * sizeof(WCHAR); - DestinationString->Length = DestSize; - DestinationString->MaximumLength = DestSize + sizeof(WCHAR); - } - DestinationString->Buffer = (PWSTR)SourceString; -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlIntegerToChar(IN ULONG Value, - IN ULONG Base, - IN ULONG Length, - IN OUT PCHAR String) -{ - ULONG Radix; - CHAR temp[33]; - ULONG v = 0; - ULONG i; - PCHAR tp; - PCHAR sp; - - Radix = Base; - if (Radix == 0) - Radix = 10; - - if ((Radix != 2) && (Radix != 8) && - (Radix != 10) && (Radix != 16)) - return STATUS_INVALID_PARAMETER; - - tp = temp; - while (v || tp == temp) - { - i = v % Radix; - v = v / Radix; - if (i < 10) - *tp = i + '0'; - else - *tp = i + 'a' - 10; - tp++; - } - - if ((ULONG) (tp - temp) >= Length) - return STATUS_BUFFER_TOO_SMALL; - - sp = String; - while (tp > temp) - *sp++ = *--tp; - *sp = 0; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlIntegerToUnicodeString(IN ULONG Value, - IN ULONG Base, /* optional */ - IN OUT PUNICODE_STRING String) -{ - ANSI_STRING AnsiString; - CHAR Buffer[33]; - NTSTATUS Status; - - Status = RtlIntegerToChar (Value, - Base, - 33, - Buffer); - if (!NT_SUCCESS(Status)) - return Status; - - AnsiString.Buffer = Buffer; - AnsiString.Length = strlen (Buffer); - AnsiString.MaximumLength = 33; - - Status = RtlAnsiStringToUnicodeString (String, - &AnsiString, - FALSE); - - return Status; -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlOemStringToCountedUnicodeString(IN OUT PUNICODE_STRING DestinationString, - IN POEM_STRING SourceString, - IN BOOLEAN AllocateDestinationString) -{ - NTSTATUS Status; - ULONG Length; - - if (NlsMbCodePageTag == TRUE) - Length = RtlAnsiStringToUnicodeSize (SourceString); - else - Length = SourceString->Length * sizeof(WCHAR); - - if (Length > 65535) - return STATUS_INVALID_PARAMETER_2; - - if (AllocateDestinationString == TRUE) - { - DestinationString->MaximumLength = Length + sizeof(WCHAR); - DestinationString->Buffer = - ExAllocatePoolWithTag (NonPagedPool, - DestinationString->MaximumLength, - TAG_USTR); - if (DestinationString->Buffer == NULL) - return STATUS_NO_MEMORY; - } - else - { - if (Length > DestinationString->MaximumLength) - return STATUS_BUFFER_TOO_SMALL; - } - DestinationString->Length = Length; - - RtlZeroMemory (DestinationString->Buffer, - DestinationString->Length); - - Status = RtlOemToUnicodeN (DestinationString->Buffer, - DestinationString->Length, - NULL, - SourceString->Buffer, - SourceString->Length); - if (!NT_SUCCESS(Status)) - { - if (AllocateDestinationString) - ExFreePool (DestinationString->Buffer); - - return Status; - } - - DestinationString->Buffer[Length / sizeof(WCHAR)] = 0; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -ULONG -STDCALL -RtlOemStringToUnicodeSize(IN POEM_STRING OemString) -{ - ULONG Size; - - RtlMultiByteToUnicodeSize(&Size, - OemString->Buffer, - OemString->Length); - - return(Size); -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlOemStringToUnicodeString(IN OUT PUNICODE_STRING DestinationString, - IN POEM_STRING SourceString, - IN BOOLEAN AllocateDestinationString) -{ - NTSTATUS Status; - ULONG Length; - - if (NlsMbCodePageTag == TRUE) - Length = RtlAnsiStringToUnicodeSize (SourceString); - else - Length = SourceString->Length * sizeof(WCHAR); - - if (Length > 65535) - return STATUS_INVALID_PARAMETER_2; - - if (AllocateDestinationString == TRUE) - { - DestinationString->MaximumLength = Length + sizeof(WCHAR); - DestinationString->Buffer = - ExAllocatePoolWithTag (NonPagedPool, - DestinationString->MaximumLength, - TAG_USTR); - if (DestinationString->Buffer == NULL) - return STATUS_NO_MEMORY; - } - else - { - if (Length + sizeof(WCHAR) > DestinationString->MaximumLength) - { - DPRINT("STATUS_BUFFER_TOO_SMALL\n"); - return STATUS_BUFFER_TOO_SMALL; - } - } - DestinationString->Length = Length; - - RtlZeroMemory (DestinationString->Buffer, - DestinationString->Length); - - Status = RtlOemToUnicodeN (DestinationString->Buffer, - DestinationString->Length, - NULL, - SourceString->Buffer, - SourceString->Length); - if (!NT_SUCCESS(Status)) - { - if (AllocateDestinationString) - ExFreePool (DestinationString->Buffer); - return Status; - } - - DestinationString->Buffer[Length / sizeof(WCHAR)] = 0; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -BOOLEAN -STDCALL -RtlPrefixString(IN PANSI_STRING String1, - IN PANSI_STRING String2, - IN BOOLEAN CaseInsensitive) -{ - PCHAR pc1; - PCHAR pc2; - ULONG Length; - - if (String2->Length < String1->Length) - return FALSE; - - Length = String1->Length; - pc1 = String1->Buffer; - pc2 = String2->Buffer; - - if (pc1 && pc2) - { - if (CaseInsensitive) - { - while (Length--) - { - if (RtlUpperChar (*pc1++) != RtlUpperChar (*pc2++)) - return FALSE; - } - } - else - { - while (Length--) - { - if (*pc1++ != *pc2++) - return FALSE; - } - } - return TRUE; - } - return FALSE; -} - - -/* - * @implemented - */ -BOOLEAN -STDCALL -RtlPrefixUnicodeString(IN PUNICODE_STRING String1, - IN PUNICODE_STRING String2, - IN BOOLEAN CaseInsensitive) -{ - PWCHAR pc1; - PWCHAR pc2; - ULONG Length; - - if (String2->Length < String1->Length) - return FALSE; - - Length = String1->Length / 2; - pc1 = String1->Buffer; - pc2 = String2->Buffer; - - if (pc1 && pc2) - { - if (CaseInsensitive) - { - while (Length--) - { - if (RtlUpcaseUnicodeChar (*pc1++) - != RtlUpcaseUnicodeChar (*pc2++)) - return FALSE; - } - } - else - { - while (Length--) - { - if( *pc1++ != *pc2++ ) - return FALSE; - } - } - return TRUE; - } - return FALSE; -} - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlStringFromGUID( - IN REFGUID Guid, - OUT PUNICODE_STRING GuidString - ) -{ - STATIC CONST PWCHAR Hex = L"0123456789ABCDEF"; - WCHAR Buffer[40]; - PWCHAR BufferPtr; - INT i; - - if( Guid == NULL ) - { - return STATUS_INVALID_PARAMETER; - } - - swprintf( Buffer, L"{%08lX-%04X-%04X-%02X%02X-", - Guid->Data1, - Guid->Data2, - Guid->Data3, - Guid->Data4[0], - Guid->Data4[1]); - BufferPtr = Buffer + 25; - - /* 6 hex bytes */ - for (i = 2; i < 8; i++) - { - *BufferPtr++ = Hex[Guid->Data4[i] >> 4]; - *BufferPtr++ = Hex[Guid->Data4[i] & 0xf]; - } - - *BufferPtr++ = '}'; - *BufferPtr++ = '\0'; - - return RtlCreateUnicodeString( GuidString, Buffer ); -} - - -/* - * @implemented - */ -ULONG -STDCALL -RtlUnicodeStringToAnsiSize(IN PUNICODE_STRING UnicodeString) -{ - ULONG Size; - - RtlUnicodeToMultiByteSize(&Size, - UnicodeString->Buffer, - UnicodeString->Length); - - return(Size+1); -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlUnicodeStringToAnsiString(IN OUT PANSI_STRING DestinationString, - IN PUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString) -{ - NTSTATUS Status; - ULONG Length; - - if (NlsMbCodePageTag == TRUE){ - Length = RtlUnicodeStringToAnsiSize (SourceString); Length--; - } - else - Length = SourceString->Length / sizeof(WCHAR); - - if (AllocateDestinationString == TRUE) - { - DestinationString->MaximumLength = Length + sizeof(CHAR); - DestinationString->Buffer = - ExAllocatePoolWithTag (NonPagedPool, - DestinationString->MaximumLength, - TAG_ASTR); - if (DestinationString->Buffer == NULL) - return STATUS_NO_MEMORY; - } - else - { - if (Length >= DestinationString->MaximumLength) - return STATUS_BUFFER_TOO_SMALL; - } - DestinationString->Length = Length; - - RtlZeroMemory (DestinationString->Buffer, - DestinationString->Length); - - Status = RtlUnicodeToMultiByteN (DestinationString->Buffer, - DestinationString->Length, - NULL, - SourceString->Buffer, - SourceString->Length); - if (!NT_SUCCESS(Status)) - { - if (AllocateDestinationString) - ExFreePool (DestinationString->Buffer); - return Status; - } - - DestinationString->Buffer[Length] = 0; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlUnicodeStringToCountedOemString(IN OUT POEM_STRING DestinationString, - IN PUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString) -{ - NTSTATUS Status; - ULONG Length; - ULONG Size; - - if (NlsMbOemCodePageTag == TRUE) - Length = RtlUnicodeStringToAnsiSize (SourceString)/* + 1*/; - else - Length = SourceString->Length / sizeof(WCHAR) + 1; - - if (Length > 0x0000FFFF) - return STATUS_INVALID_PARAMETER_2; - - DestinationString->Length = (WORD)(Length - 1); - - if (AllocateDestinationString) - { - DestinationString->Buffer = ExAllocatePoolWithTag (NonPagedPool, - Length, - TAG_ASTR); - - if (DestinationString->Buffer == NULL) - return STATUS_NO_MEMORY; - - RtlZeroMemory (DestinationString->Buffer, - Length); - DestinationString->MaximumLength = (WORD)Length; - } - else - { - if (Length > DestinationString->MaximumLength) - { - if (DestinationString->MaximumLength == 0) - return STATUS_BUFFER_OVERFLOW; - DestinationString->Length = - DestinationString->MaximumLength - 1; - } - } - - Status = RtlUnicodeToOemN (DestinationString->Buffer, - DestinationString->Length, - &Size, - SourceString->Buffer, - SourceString->Length); - if (!NT_SUCCESS(Status)) - { - if (AllocateDestinationString) - ExFreePool (DestinationString->Buffer); - - return Status; - } - - DestinationString->Buffer[Size] = 0; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlUnicodeStringToInteger(IN PUNICODE_STRING InString, - IN ULONG Base, - OUT PULONG Value) -{ - BOOLEAN Negative = 0; - PWCHAR String = InString->Buffer; - ULONG MaxLen = InString->Length / sizeof(WCHAR); - - *Value = 0; - - if(*String == L'-') - { - Negative++; - String++; - } - else if(*String == L'+') - { - Negative = 0; - String++; - } - - if(!Base) - { - if(*String == L'b') - { - Base = 2; - String++; - } - else if(*String == L'o') - { - Base = 8; - String++; - } - else if(*String == L'x') - { - Base = 16; - String++; - } - else - Base = 10; - } - - while(*String && MaxLen) - { - short c = *String;; - String++; - MaxLen--; - - if(c >= 'a' && c <= 'f') - c -= 'a' - 'A'; - - /* validate chars for bases <= 10 */ - if( Base <= 10 && (c < '0' || c > '9') ) - return STATUS_INVALID_PARAMETER; - - /* validate chars for base 16 */ - else if( (c < '0' || c > '9') && (c < 'A' || c > 'F') ) - return STATUS_INVALID_PARAMETER; - - /* perhaps someday we'll validate additional bases */ - - if(c >= 'A' && c <= 'F') - *Value = *Value * Base + c - 'A' + 10; - else - *Value = *Value * Base + c - '0'; - } - - if(Negative) - *Value *= -1; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -ULONG STDCALL -RtlUnicodeStringToOemSize(IN PUNICODE_STRING UnicodeString) -{ - ULONG Size; - - RtlUnicodeToMultiByteSize(&Size, - UnicodeString->Buffer, - UnicodeString->Length); - return(Size+1); -} - - -/* - * @implemented - */ -NTSTATUS -STDCALL -RtlUnicodeStringToOemString(IN OUT POEM_STRING DestinationString, - IN PUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString) -{ - NTSTATUS Status; - ULONG Length; - - if (NlsMbOemCodePageTag == TRUE){ - Length = RtlUnicodeStringToAnsiSize (SourceString); Length--; - } - else - Length = SourceString->Length / sizeof(WCHAR); - - if (AllocateDestinationString == TRUE) - { - DestinationString->MaximumLength = Length + sizeof(CHAR); - DestinationString->Buffer = - ExAllocatePoolWithTag (NonPagedPool, - DestinationString->MaximumLength, - TAG_OSTR); - if (DestinationString->Buffer == NULL) - return STATUS_NO_MEMORY; - } - else - { - if (Length >= DestinationString->MaximumLength) - return STATUS_BUFFER_TOO_SMALL; - } - DestinationString->Length = Length; - - RtlZeroMemory(DestinationString->Buffer, - DestinationString->Length); - - Status = RtlUnicodeToOemN(DestinationString->Buffer, - DestinationString->Length, - NULL, - SourceString->Buffer, - SourceString->Length); - if (!NT_SUCCESS(Status)) - { - if (AllocateDestinationString) - ExFreePool(DestinationString->Buffer); - return Status; - } - - DestinationString->Buffer[Length] = 0; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlUpcaseUnicodeString(IN OUT PUNICODE_STRING DestinationString, - IN PCUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString) -{ - ULONG i; - PWCHAR Src, Dest; - - if (AllocateDestinationString == TRUE) - { - DestinationString->MaximumLength = SourceString->Length + sizeof(WCHAR); - DestinationString->Buffer = - ExAllocatePoolWithTag(NonPagedPool, - SourceString->Length + sizeof(WCHAR), - TAG_USTR); - if (DestinationString->Buffer == NULL) - return(STATUS_NO_MEMORY); - } - else - { - if (SourceString->Length >= DestinationString->MaximumLength) - return(STATUS_BUFFER_TOO_SMALL); - } - DestinationString->Length = SourceString->Length; - - Src = SourceString->Buffer; - Dest = DestinationString->Buffer; - for (i=0; i < SourceString->Length / sizeof(WCHAR); i++) - { - *Dest = RtlUpcaseUnicodeChar(*Src); - Dest++; - Src++; - } - *Dest = 0; - - return(STATUS_SUCCESS); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlUpcaseUnicodeStringToAnsiString(IN OUT PANSI_STRING DestinationString, - IN PUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString) -{ - NTSTATUS Status; - ULONG Length; - - if (NlsMbCodePageTag == TRUE) - { - Length = RtlUnicodeStringToAnsiSize(SourceString); - Length--; - } - else - Length = SourceString->Length / sizeof(WCHAR); - - if (AllocateDestinationString == TRUE) - { - DestinationString->MaximumLength = Length + sizeof(CHAR); - DestinationString->Buffer = - ExAllocatePoolWithTag(NonPagedPool, - DestinationString->MaximumLength, - TAG_ASTR); - if (DestinationString->Buffer == NULL) - return(STATUS_NO_MEMORY); - } - else - { - if (Length >= DestinationString->MaximumLength) - return(STATUS_BUFFER_TOO_SMALL); - } - DestinationString->Length = Length; - - RtlZeroMemory(DestinationString->Buffer, - DestinationString->Length); - - Status = RtlUpcaseUnicodeToMultiByteN(DestinationString->Buffer, - DestinationString->Length, - NULL, - SourceString->Buffer, - SourceString->Length); - if (!NT_SUCCESS(Status)) - { - if (AllocateDestinationString) - ExFreePool(DestinationString->Buffer); - return(Status); - } - - DestinationString->Buffer[Length] = 0; - - return(STATUS_SUCCESS); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlUpcaseUnicodeStringToCountedOemString(IN OUT POEM_STRING DestinationString, - IN PUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString) -{ - NTSTATUS Status; - ULONG Length; - ULONG Size; - - if (NlsMbCodePageTag == TRUE) - Length = RtlUnicodeStringToAnsiSize (SourceString)/* + 1*/; - else - Length = SourceString->Length / sizeof(WCHAR) + 1; - - if (Length > 0x0000FFFF) - return(STATUS_INVALID_PARAMETER_2); - - DestinationString->Length = (WORD)(Length - 1); - - if (AllocateDestinationString == TRUE) - { - DestinationString->Buffer = - ExAllocatePoolWithTag(NonPagedPool, - Length, - TAG_OSTR); - if (DestinationString->Buffer == NULL) - return(STATUS_NO_MEMORY); - - RtlZeroMemory(DestinationString->Buffer, - Length); - DestinationString->MaximumLength = (WORD)Length; - } - else - { - if (Length > DestinationString->MaximumLength) - { - if (DestinationString->MaximumLength == 0) - return(STATUS_BUFFER_OVERFLOW); - DestinationString->Length = - DestinationString->MaximumLength - 1; - } - } - - Status = RtlUpcaseUnicodeToOemN(DestinationString->Buffer, - DestinationString->Length, - &Size, - SourceString->Buffer, - SourceString->Length); - if (!NT_SUCCESS(Status)) - { - if (AllocateDestinationString) - ExFreePool(DestinationString->Buffer); - return(Status); - } - - DestinationString->Buffer[Size] = 0; - - return(STATUS_SUCCESS); -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -RtlUpcaseUnicodeStringToOemString(IN OUT POEM_STRING DestinationString, - IN PUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString) -{ - NTSTATUS Status; - ULONG Length; - - if (NlsMbOemCodePageTag == TRUE) { - Length = RtlUnicodeStringToOemSize(SourceString); Length--; - } - else - Length = SourceString->Length / sizeof(WCHAR); - - if (AllocateDestinationString == TRUE) - { - DestinationString->MaximumLength = Length + sizeof(CHAR); - DestinationString->Buffer = - ExAllocatePoolWithTag(NonPagedPool, - DestinationString->MaximumLength, - TAG_OSTR); - if (DestinationString->Buffer == NULL) - return(STATUS_NO_MEMORY); - } - else - { - if (Length >= DestinationString->MaximumLength) - return(STATUS_BUFFER_TOO_SMALL); - } - DestinationString->Length = Length; - - RtlZeroMemory(DestinationString->Buffer, - DestinationString->Length); - - Status = RtlUpcaseUnicodeToOemN(DestinationString->Buffer, - DestinationString->Length, - NULL, - SourceString->Buffer, - SourceString->Length); - if (!NT_SUCCESS(Status)) - { - if (AllocateDestinationString) - ExFreePool(DestinationString->Buffer); - return(Status); - } - - DestinationString->Buffer[Length] = 0; - - return(STATUS_SUCCESS); -} - - -/* - * @implemented - */ -VOID STDCALL -RtlUpperString(PSTRING DestinationString, - PSTRING SourceString) -{ - ULONG Length; - ULONG i; - PCHAR Src; - PCHAR Dest; - - Length = min(SourceString->Length, - DestinationString->MaximumLength - 1); - - Src = SourceString->Buffer; - Dest = DestinationString->Buffer; - for (i = 0; i < Length; i++) - { - *Dest = RtlUpperChar(*Src); - Src++; - Dest++; - } - *Dest = 0; - - DestinationString->Length = SourceString->Length; -} - - -/* - * @implemented - */ -ULONG STDCALL -RtlxAnsiStringToUnicodeSize(IN PANSI_STRING AnsiString) -{ - return RtlAnsiStringToUnicodeSize(AnsiString); -} - - -/* - * @implemented - */ -ULONG STDCALL -RtlxOemStringToUnicodeSize(IN POEM_STRING OemString) -{ - return RtlOemStringToUnicodeSize((PANSI_STRING)OemString); -} - - -/* - * @implemented - */ -ULONG STDCALL -RtlxUnicodeStringToAnsiSize(IN PUNICODE_STRING UnicodeString) -{ - return RtlUnicodeStringToAnsiSize(UnicodeString); -} - - -/* - * @implemented - */ -ULONG STDCALL -RtlxUnicodeStringToOemSize(IN PUNICODE_STRING UnicodeString) -{ - return RtlUnicodeStringToOemSize(UnicodeString); -} - -/* EOF */ diff --git a/reactos/ntoskrnl/rtl/version.c b/reactos/ntoskrnl/rtl/version.c deleted file mode 100644 index 86008195986..00000000000 --- a/reactos/ntoskrnl/rtl/version.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - * 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: version.c,v 1.2 2004/03/08 14:22:30 navaraf Exp $ - * - * PROJECT: ReactOS kernel - * PURPOSE: Runtime code - * FILE: ntoskrnl/rtl/version.c - * PROGRAMER: Filip Navara - */ - -/* INCLUDES *****************************************************************/ - -#define __USE_W32API -#include <ddk/ntddk.h> -#include <internal/safe.h> - -/* FUNCTIONS ****************************************************************/ - -NTSTATUS STDCALL -RtlGetVersion(RTL_OSVERSIONINFOW *Info) -{ - WCHAR CSDString[] = L"Service Pack 6"; - - if (Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOW) || - Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW)) - { - Info->dwMajorVersion = 4; - Info->dwMinorVersion = 0; - Info->dwBuildNumber = 1381; - Info->dwPlatformId = VER_PLATFORM_WIN32_NT; - RtlCopyMemory(Info->szCSDVersion, CSDString, sizeof(CSDString)); - if (Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW)) - { - RTL_OSVERSIONINFOEXW *InfoEx = (RTL_OSVERSIONINFOEXW *)Info; - InfoEx->wServicePackMajor = 6; - InfoEx->wServicePackMinor = 0; - InfoEx->wSuiteMask = 0; - InfoEx->wProductType = VER_NT_WORKSTATION; - } - - return STATUS_SUCCESS; - } - - return STATUS_INVALID_PARAMETER; -} - -/* EOF */ From d2a5a8678b9d35d6d4be461ec1f04c9f031adc06 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Tue, 1 Jun 2004 01:00:25 +0000 Subject: [PATCH 1293/1463] change xInterlockedAddLargeStatistic and ExInterlockedCompareExchange64 to be implemented. svn path=/trunk/; revision=9577 --- reactos/ntoskrnl/ex/interlck.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/ex/interlck.c b/reactos/ntoskrnl/ex/interlck.c index ff62ca813ec..ef627177fcd 100644 --- a/reactos/ntoskrnl/ex/interlck.c +++ b/reactos/ntoskrnl/ex/interlck.c @@ -1,4 +1,4 @@ -/* $Id: interlck.c,v 1.11 2003/07/12 10:24:45 chorns Exp $ +/* $Id: interlck.c,v 1.12 2004/06/01 01:00:25 sedwards Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -177,7 +177,7 @@ ExInterlockedIncrementLong (PLONG Addend, } /* - * @unimplemented + * @implemented */ VOID FASTCALL ExInterlockedAddLargeStatistic (IN PLARGE_INTEGER Addend, @@ -190,7 +190,7 @@ ExInterlockedAddLargeStatistic (IN PLARGE_INTEGER Addend, } /* - * @unimplemented + * @implemented */ LONGLONG FASTCALL ExInterlockedCompareExchange64 (IN OUT PLONGLONG Destination, From 7aeeda0f3ca50cca14b757902fc3eb526eb41bc2 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Tue, 1 Jun 2004 01:13:29 +0000 Subject: [PATCH 1294/1463] Fix building and use W32API Travis Snoozy <ai2097@yahoo.com> svn path=/trunk/; revision=9578 --- rosapps/regsvr32/makefile | 4 +++- rosapps/regsvr32/regsvr32.c | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/rosapps/regsvr32/makefile b/rosapps/regsvr32/makefile index e92a8d4d837..4cad9c50dd2 100644 --- a/rosapps/regsvr32/makefile +++ b/rosapps/regsvr32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.2 2002/01/26 01:37:35 sedwards Exp $ +# $Id: makefile,v 1.3 2004/06/01 01:13:29 sedwards Exp $ # # Jurgen Van Gael [jurgen.vangael@student.kuleuven.ac.be] # @@ -17,6 +17,8 @@ TARGET_NAME = regsvr32 TARGET_SDKLIBS = kernel32.a +TARGET_CFLAGS = -D__USE_W32API + TARGET_OBJECTS = $(TARGET_NAME).o include $(PATH_TO_TOP)/rules.mak diff --git a/rosapps/regsvr32/regsvr32.c b/rosapps/regsvr32/regsvr32.c index bdf570a78ff..cc69a193fa5 100644 --- a/rosapps/regsvr32/regsvr32.c +++ b/rosapps/regsvr32/regsvr32.c @@ -36,7 +36,7 @@ Cambridge, MA 02139, USA. // #include <stdio.h> #include <windows.h> -#include <ole32\olectl.h> +#include <olectl.h> typedef HRESULT (*DLLREGISTER) (void); typedef HRESULT (*DLLUNREGISTER) (void); From 56481cd659328c9cf5f6618d4015984a6569c278 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Tue, 1 Jun 2004 01:21:07 +0000 Subject: [PATCH 1295/1463] Make the freeldr build system more like the reactos module build system. (top level rules.mak, etc....) Travis Snoozy <ai2097@yahoo.com> svn path=/trunk/; revision=9579 --- freeldr/Makefile | 20 +---------------- freeldr/bootsect/Makefile | 24 -------------------- freeldr/fdebug/Makefile | 27 ---------------------- freeldr/freeldr/Makefile | 28 ----------------------- freeldr/install/Makefile | 19 ---------------- freeldr/rules.mak | 47 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 48 insertions(+), 117 deletions(-) create mode 100644 freeldr/rules.mak diff --git a/freeldr/Makefile b/freeldr/Makefile index ec556f467cd..fe140b2414a 100644 --- a/freeldr/Makefile +++ b/freeldr/Makefile @@ -22,25 +22,7 @@ ifeq ($(HOST),) HOST = mingw32-windows endif -# -# Choose various options -# -ifeq ($(HOST),mingw32-linux) -RM = rm -f -CP = cp -f -MKDIR = mkdir -SEP = / -else -RM = cmd /C del -CP = copy /Y -MKDIR = md -SEP = \$(EMPTY_VAR) -endif - -NASM_CMD = nasm -NFLAGS = -fwin32 -dwin32 -BIN2C = ..$(SEP)tools$(SEP)bin2c -TOOLSDIR = ..$(SEP)tools +include rules.mak all: $(MAKE) -C tools diff --git a/freeldr/bootsect/Makefile b/freeldr/bootsect/Makefile index 01637637273..4c0a10b843d 100644 --- a/freeldr/bootsect/Makefile +++ b/freeldr/bootsect/Makefile @@ -17,30 +17,6 @@ # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # -# Windows is default host environment -ifeq ($(HOST),) -HOST = mingw32-windows -endif - -# -# Choose various options -# -ifeq ($(HOST),mingw32-linux) -RM = rm -f -CP = cp -f -MKDIR = mkdir -SEP = / -else -RM = cmd /C del -CP = copy /Y -MKDIR = md -SEP = \$(EMPTY_VAR) -endif - -NASM_CMD = nasm -NFLAGS = -fwin32 -dwin32 -BIN2C = ..$(SEP)tools$(SEP)bin2c -TOOLSDIR = ..$(SEP)tools BOOTCD_DIR = ..$(SEP)..$(SEP)bootcd .PHONY : clean bootcd diff --git a/freeldr/fdebug/Makefile b/freeldr/fdebug/Makefile index efcdfc4e1d2..73ee4387559 100644 --- a/freeldr/fdebug/Makefile +++ b/freeldr/fdebug/Makefile @@ -18,33 +18,6 @@ # -# Windows is default host environment -ifeq ($(HOST),) -HOST = mingw32-windows -endif - -# -# Choose various options -# -ifeq ($(HOST),mingw32-linux) -RM = rm -f -CP = cp -f -MKDIR = mkdir -SEP = / -CC = mingw32-gcc -LD = mingw32-ld -WINDRES = mingw32-windres -else -RM = cmd /C del -CP = copy /Y -MKDIR = md -SEP = \$(EMPTY_VAR) -CC = gcc -LD = ld -RM = cmd /C del -WINDRES = windres -endif - FLAGS = -Wall OBJS = rs232.o fdebug.o fdebug.res diff --git a/freeldr/freeldr/Makefile b/freeldr/freeldr/Makefile index f491077819e..5a619e9dc7b 100644 --- a/freeldr/freeldr/Makefile +++ b/freeldr/freeldr/Makefile @@ -17,34 +17,6 @@ # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # -# Windows is default host environment -ifeq ($(HOST),) -HOST = mingw32-windows -endif - -# -# Choose various options -# -ifeq ($(HOST),mingw32-linux) -RM = rm -f -CP = cp -f -CC = mingw32-gcc -LD = mingw32-ld -AR = mingw32-ar -NM = mingw32-nm -MKDIR = mkdir -SEP = / -else -RM = cmd /C del -CP = copy /Y -CC = gcc -LD = ld -AR = ar -NM = nm -MKDIR = md -SEP = / -endif - ############################################# # CHANGE THESE FOR YOUR OUTPUT # diff --git a/freeldr/install/Makefile b/freeldr/install/Makefile index 927dd85f30b..70231683ed8 100644 --- a/freeldr/install/Makefile +++ b/freeldr/install/Makefile @@ -17,25 +17,6 @@ # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # -# Windows is default host environment -ifeq ($(HOST),) -HOST = mingw32-windows -endif - -# -# Choose various options -# -ifeq ($(HOST),mingw32-linux) -RM = rm -f -SEP = / -else -RM = cmd /C del -SEP = \$(EMPTY_VAR) -endif - -CC = mingw32-gcc -LD = mingw32-ld - FLAGS = -Wall OBJS = install.o volume.o diff --git a/freeldr/rules.mak b/freeldr/rules.mak new file mode 100644 index 00000000000..1ff8e0ea6f7 --- /dev/null +++ b/freeldr/rules.mak @@ -0,0 +1,47 @@ +.EXPORT_ALL_VARIABLES: + +# +# Choose various options +# +ifeq ($(HOST),mingw32-linux) +NASM_FORMAT = win32 +PREFIX = mingw32- +EXE_POSTFIX := +EXE_PREFIX := ./ +DLLTOOL = $(PREFIX)dlltool --as=$(PREFIX)as +NASM_CMD = nasm +DOSCLI = +FLOPPY_DIR = /mnt/floppy +SEP := / +PIPE := +RM = rm -f +CP = cp -f +MKDIR = mkdir +endif + +ifeq ($(HOST),mingw32-windows) +NASM_FORMAT = win32 +PREFIX = +EXE_PREFIX := +EXE_POSTFIX := .exe +DLLTOOL = $(PREFIX)dlltool --as=$(PREFIX)as +NASM_CMD = nasmw +DOSCLI = yes +FLOPPY_DIR = A: +SEP := \$(EMPTY_VAR) +PIPE := -pipe +RM = cmd /C del +CP = copy /Y +MKDIR = md +endif + + +NFLAGS = -fwin32 -dwin32 +BIN2C = ..$(SEP)tools$(SEP)bin2c +TOOLSDIR = ..$(SEP)tools + +CC = $(PREFIX)gcc +LD = $(PREFIX)ld +AR = $(PREFIX)ar +NM = $(PREFIX)nm +WINDRES = $(PREFIX)windres From 05b4d3fb1de50db952368eb10c0c95989d1e153c Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Tue, 1 Jun 2004 01:46:51 +0000 Subject: [PATCH 1296/1463] Add regsvr32 Travis Snoozy <ai2097@yahoo.com> svn path=/trunk/; revision=9580 --- rosapps/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/rosapps/Makefile b/rosapps/Makefile index 86b666da88f..19f50de44d7 100644 --- a/rosapps/Makefile +++ b/rosapps/Makefile @@ -29,6 +29,7 @@ APPS = calc \ net$(SEP)netstat \ net$(SEP)ipconfig \ regedt32 \ + regsvr32 \ welcome \ winfile From 8448faa27779914468537c33a93697bed141709a Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes <hardon@online.no> Date: Tue, 1 Jun 2004 10:16:26 +0000 Subject: [PATCH 1297/1463] moved the safe mem copy routines svn path=/trunk/; revision=9582 --- reactos/ntoskrnl/mm/mm.c | 47 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/mm.c b/reactos/ntoskrnl/mm/mm.c index a9f453080f2..f7cf9122d26 100644 --- a/reactos/ntoskrnl/mm/mm.c +++ b/reactos/ntoskrnl/mm/mm.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: mm.c,v 1.73 2004/04/10 22:35:25 gdalsnes Exp $ +/* $Id: mm.c,v 1.74 2004/06/01 10:16:26 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top directory * PROJECT: ReactOS kernel @@ -50,6 +50,51 @@ MM_STATS MmStats; /* FUNCTIONS ****************************************************************/ + +NTSTATUS STDCALL +MmCopyToCaller(PVOID Dest, const VOID *Src, ULONG NumberOfBytes) +{ + NTSTATUS Status; + + if (ExGetPreviousMode() == UserMode) + { + if ((ULONG)Dest >= KERNEL_BASE) + { + return(STATUS_ACCESS_VIOLATION); + } + Status = MmSafeCopyToUser(Dest, Src, NumberOfBytes); + return(Status); + } + else + { + memcpy(Dest, Src, NumberOfBytes); + return(STATUS_SUCCESS); + } +} + +NTSTATUS STDCALL +MmCopyFromCaller(PVOID Dest, const VOID *Src, ULONG NumberOfBytes) +{ + NTSTATUS Status; + + if (ExGetPreviousMode() == UserMode) + { + if ((ULONG)Src >= KERNEL_BASE) + { + return(STATUS_ACCESS_VIOLATION); + } + Status = MmSafeCopyFromUser(Dest, Src, NumberOfBytes); + return(Status); + } + else + { + memcpy(Dest, Src, NumberOfBytes); + return(STATUS_SUCCESS); + } +} + + + NTSTATUS MmReleaseMemoryArea(PEPROCESS Process, PMEMORY_AREA Marea) { NTSTATUS Status; From 361a0a9bb7eba2811fdfa4c15186e0886977f1f0 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin <aleksey@reactos.org> Date: Tue, 1 Jun 2004 10:20:24 +0000 Subject: [PATCH 1298/1463] Patch 257 in bugzilla: "Import Regedit translations from WINE. Existing resource 'About' from WINE has been removed since ReactOS already has it." svn path=/trunk/; revision=9583 --- reactos/subsys/system/regedit/Es.rc | 206 +++++++++++++++++++++ reactos/subsys/system/regedit/Fr.rc | 208 +++++++++++++++++++++ reactos/subsys/system/regedit/It.rc | 230 ++++++++++++++++++++++++ reactos/subsys/system/regedit/Nl.rc | 190 ++++++++++++++++++++ reactos/subsys/system/regedit/Pt.rc | 250 ++++++++++++++++++++++++++ reactos/subsys/system/regedit/Ru.rc | 206 +++++++++++++++++++++ reactos/subsys/system/regedit/Si.rc | 206 +++++++++++++++++++++ reactos/subsys/system/regedit/rsrc.rc | 6 + 8 files changed, 1502 insertions(+) create mode 100644 reactos/subsys/system/regedit/Es.rc create mode 100644 reactos/subsys/system/regedit/Fr.rc create mode 100644 reactos/subsys/system/regedit/It.rc create mode 100644 reactos/subsys/system/regedit/Nl.rc create mode 100644 reactos/subsys/system/regedit/Pt.rc create mode 100644 reactos/subsys/system/regedit/Ru.rc create mode 100644 reactos/subsys/system/regedit/Si.rc diff --git a/reactos/subsys/system/regedit/Es.rc b/reactos/subsys/system/regedit/Es.rc new file mode 100644 index 00000000000..9e36c0a7911 --- /dev/null +++ b/reactos/subsys/system/regedit/Es.rc @@ -0,0 +1,206 @@ +/* + * Regedit resources + * + * Copyright 2003 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 + +/* + * Menu + */ + +IDC_REGEDIT MENU DISCARDABLE +BEGIN + POPUP "&Archivo" + BEGIN + MENUITEM "&Salir", ID_REGISTRY_EXIT + END + POPUP "A&yuda" + BEGIN + MENUITEM "&Acerca de...", ID_HELP_ABOUT + END +END + +IDR_REGEDIT_MENU MENU DISCARDABLE +BEGIN + POPUP "&Registro" + BEGIN + MENUITEM "&Importar archivo de registro...", ID_REGISTRY_IMPORTREGISTRYFILE + MENUITEM "&Exportar archivo de registro...", ID_REGISTRY_EXPORTREGISTRYFILE + MENUITEM SEPARATOR + MENUITEM "&Conectar registro de red...", ID_REGISTRY_CONNECTNETWORKREGISTRY, GRAYED + MENUITEM "&Desconectar registro de red...", ID_REGISTRY_DISCONNECTNETWORKREGISTRY, GRAYED + MENUITEM SEPARATOR + MENUITEM "Im&primir\tCtrl+P", ID_REGISTRY_PRINT, GRAYED + MENUITEM SEPARATOR + MENUITEM "S&alir", ID_REGISTRY_EXIT + END + POPUP "&Editar" + BEGIN + MENUITEM "&Modificar", ID_EDIT_MODIFY + MENUITEM SEPARATOR + POPUP "&Nuevo" + BEGIN + MENUITEM "&Clave", ID_EDIT_NEW_KEY + MENUITEM SEPARATOR + MENUITEM "Valor de c&adena", ID_EDIT_NEW_STRINGVALUE + MENUITEM "Valor &binario", ID_EDIT_NEW_BINARYVALUE + MENUITEM "Valor &DWORD", ID_EDIT_NEW_DWORDVALUE + END + MENUITEM SEPARATOR + MENUITEM "&Eliminar\tDel", ID_EDIT_DELETE + MENUITEM "&Renombrar", ID_EDIT_RENAME + MENUITEM SEPARATOR + MENUITEM "&Copiar valor de la clave", ID_EDIT_COPYKEYNAME + MENUITEM SEPARATOR + MENUITEM "&Buscar\tCtrl+F", ID_EDIT_FIND, GRAYED + MENUITEM "Buscar &siguiente\tF3", ID_EDIT_FINDNEXT, GRAYED + END + POPUP "&Ver" + BEGIN + MENUITEM "&Barra de estado", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Separar", ID_VIEW_SPLIT + MENUITEM SEPARATOR + MENUITEM "&Actualizar\tF5", ID_VIEW_REFRESH + END + POPUP "&Favoritos" + BEGIN + MENUITEM "&A馻dir a Favoritos", ID_FAVOURITES_ADDTOFAVOURITES + , GRAYED + MENUITEM "&Eliminar Favorito", ID_FAVOURITES_REMOVEFAVOURITE + , GRAYED + END + POPUP "&Ayuda" + BEGIN + MENUITEM "&Help Topics", ID_HELP_HELPTOPICS + MENUITEM SEPARATOR + MENUITEM "&Acerca de Editor de registro", ID_HELP_ABOUT + END +END + +/* + * String Table + */ + +STRINGTABLE DISCARDABLE +BEGIN + IDS_LIST_COLUMN_NAME "Nombre" + IDS_LIST_COLUMN_TYPE "Tipo" + IDS_LIST_COLUMN_DATA "Datos" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_APP_TITLE "Editor de registro" + IDC_REGEDIT "REGEDIT" + IDC_REGEDIT_FRAME "REGEDIT_FRAME" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_REGISTRY_MENU "Contiene comandos para trabajar con el registro completo" + ID_EDIT_MENU "Contiene comandos para editar valores o claves" + ID_VIEW_MENU "Contiene comandos para personalizar la ventana de registro" + ID_FAVOURITES_MENU "Contiene comandos para acceder a claves usadas frecuentemente" + ID_HELP_MENU "Contiene comandos para mostrar ayuda e informaci髇 sobre el editor de registro" + ID_EDIT_NEW_MENU "Contiene comandos para crear nuevas claves o valores" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_EDIT_MODIFY "Modifica los datos del valor" + ID_EDIT_NEW_KEY "A馻de una nueva clave" + ID_EDIT_NEW_STRINGVALUE "A馻de un nuevo valor de cadena" + ID_EDIT_NEW_BINARYVALUE "A馻de un nuevo valor binario" + ID_EDIT_NEW_DWORDVALUE "A馻de un nuevo valor de doble palabra" + ID_REGISTRY_IMPORTREGISTRYFILE "Importa un archivo de texto al registro" + ID_REGISTRY_EXPORTREGISTRYFILE + "Exporta todo o parte del registro a un archivo de texto" + ID_REGISTRY_CONNECTNETWORKREGISTRY + "Se conecta al registro de un ordenador remoto" + ID_REGISTRY_DISCONNECTNETWORKREGISTRY + "Se desconecta del registro de un ordenador remoto" + ID_REGISTRY_PRINT "Imprime todo o parte del registro" +/* ID_HELP_HELPTOPICS "Opens registry editor help" */ + ID_HELP_ABOUT "Muestra informaci髇 del programa, n鷐ero de versi髇 y derechos de autor" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_REGISTRY_EXIT "Sale del editor de registro" + ID_FAVOURITES_ADDTOFAVOURITES "A馻de claves a la lista de favoritos" + ID_FAVOURITES_REMOVEFAVOURITE "Elimina claves de la lista de favoritos" + ID_VIEW_STATUSBAR "Muestra u oculta la barra de estado" + ID_VIEW_SPLIT "Cambia la posici髇 del separador entre dos paneles" + ID_VIEW_REFRESH "Actualiza la ventana" + ID_EDIT_DELETE "Elimina la selecci髇" + ID_EDIT_RENAME "Renombra la selecci髇" + ID_EDIT_COPYKEYNAME "Copia el nombre de la clave seleccionada al portapapeles" + ID_EDIT_FIND "Busca una cadena de texto en una clave, valor o datos" + ID_EDIT_FINDNEXT "Busca la siguiente ocurrencia del texto especificado en la b鷖queda anterior" +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 "Di醠ogo" +FONT 8, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "Aceptar",IDOK,130,7,50,14 + PUSHBUTTON "Cancelar",IDCANCEL,130,24,50,14 +END + + +/* + * TEXTINCLUDE + */ + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + + + +/* + * String Table + */ + +/* + *STRINGTABLE DISCARDABLE + *BEGIN + * ID_HELP_HELPTOPICS "Opens Registry Editor Help." + * ID_HELP_ABOUT "Displays program information, version number, and copyright." + *END + */ + +/*****************************************************************/ diff --git a/reactos/subsys/system/regedit/Fr.rc b/reactos/subsys/system/regedit/Fr.rc new file mode 100644 index 00000000000..3f1e7d3240f --- /dev/null +++ b/reactos/subsys/system/regedit/Fr.rc @@ -0,0 +1,208 @@ +/* + * Regedit resources + * + * Copyright 2002 Robert Dickenson + * Copyright 2003 Vincent B閞on + * Copyright 2004 Sylvain P閠r閛lle + * + * 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_FRENCH, SUBLANG_NEUTRAL + +/* + * Menu + */ + +IDC_REGEDIT MENU DISCARDABLE +BEGIN + POPUP "&Fichier" + BEGIN + MENUITEM "&Quitter", ID_REGISTRY_EXIT + END + POPUP "&Aide" + BEGIN + MENUITEM "&A propos...", ID_HELP_ABOUT + END +END + +IDR_REGEDIT_MENU MENU DISCARDABLE +BEGIN + POPUP "&Registres" + BEGIN + MENUITEM "&Importer un fichier de registres...", ID_REGISTRY_IMPORTREGISTRYFILE + MENUITEM "&Exporter un fichier de registres...", ID_REGISTRY_EXPORTREGISTRYFILE + MENUITEM SEPARATOR + MENUITEM "&Connecter des registres via le r閟eau...", ID_REGISTRY_CONNECTNETWORKREGISTRY, GRAYED + MENUITEM "&D閏onnecter de registres r閟eau...", ID_REGISTRY_DISCONNECTNETWORKREGISTRY, GRAYED + MENUITEM SEPARATOR + MENUITEM "Im&primer\tCtrl+P", ID_REGISTRY_PRINT, GRAYED + MENUITEM SEPARATOR + MENUITEM "&Quitter", ID_REGISTRY_EXIT + END + POPUP "&Edition" + BEGIN + MENUITEM "&Modifier", ID_EDIT_MODIFY + MENUITEM SEPARATOR + POPUP "&Nouvelle" + BEGIN + MENUITEM "&Cl", ID_EDIT_NEW_KEY + MENUITEM SEPARATOR + MENUITEM "Valeur c&ha頽e", ID_EDIT_NEW_STRINGVALUE + MENUITEM "Valeur &binaire", ID_EDIT_NEW_BINARYVALUE + MENUITEM "Valeur &mot double", ID_EDIT_NEW_DWORDVALUE + END + MENUITEM SEPARATOR + MENUITEM "&Supprimer\tDel", ID_EDIT_DELETE + MENUITEM "Ren&ommer", ID_EDIT_RENAME + MENUITEM SEPARATOR + MENUITEM "&Copier le nom de la cl", ID_EDIT_COPYKEYNAME + MENUITEM SEPARATOR + MENUITEM "&Rechercher\tCtrl+F", ID_EDIT_FIND, GRAYED + MENUITEM "Sui&vant\tF3", ID_EDIT_FINDNEXT, GRAYED + END + POPUP "&Affichage" + BEGIN + MENUITEM "&Barre d'閠at", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&S閜arateur", ID_VIEW_SPLIT + MENUITEM SEPARATOR + MENUITEM "&Rafra頲hir\tF5", ID_VIEW_REFRESH + END + POPUP "&Favoris" + BEGIN + MENUITEM "&Ajouter aux Favoris", ID_FAVOURITES_ADDTOFAVOURITES + , GRAYED + MENUITEM "&Retirer des Favoris", ID_FAVOURITES_REMOVEFAVOURITE + , GRAYED + END + POPUP "&Aide" + BEGIN + MENUITEM "&Sujets de l'aide", ID_HELP_HELPTOPICS + MENUITEM SEPARATOR + MENUITEM "&A propos de l'閐iteur de registres", ID_HELP_ABOUT + END +END + +/* + * String Table + */ + +STRINGTABLE DISCARDABLE +BEGIN + IDS_LIST_COLUMN_NAME "Nom" + IDS_LIST_COLUMN_TYPE "Type" + IDS_LIST_COLUMN_DATA "Valeur" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_APP_TITLE "蒬iteur de registres" + IDC_REGEDIT "REGEDIT" + IDC_REGEDIT_FRAME "REGEDIT_FRAME" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_REGISTRY_MENU "Contient des commandes pour travailler sur les registres de mani鑢e globale" + ID_EDIT_MENU "Contient des commandes pour 閐iter des valeurs ou des cl閟" + ID_VIEW_MENU "Contient des commandes pour personnaliser la fen阾re des registres" + ID_FAVOURITES_MENU "Contient des commandes pour acc閐er aux cl閟 fr閝uemment utilis閑s" + ID_HELP_MENU "Contient des commandes pour afficher de l'aide et de l'information propos de l'閐iteur de registres" + ID_EDIT_NEW_MENU "Contient des commandes pour cr閑r de nouvelles cl閟 ou valeurs" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_EDIT_MODIFY "Modifie les donn閑s d'une valeur" + ID_EDIT_NEW_KEY "Ajoute une nouvelle cl" + ID_EDIT_NEW_STRINGVALUE "Ajoute une nouvelle valeur cha頽e" + ID_EDIT_NEW_BINARYVALUE "Ajoute une nouvelle valeur binaire" + ID_EDIT_NEW_DWORDVALUE "Ajoute une nouvelle valeur mot double" + ID_REGISTRY_IMPORTREGISTRYFILE "Importe un fichier texte dans les registres" + ID_REGISTRY_EXPORTREGISTRYFILE + "Exporte tout ou une partie des registres dans un fichier texte" + ID_REGISTRY_CONNECTNETWORKREGISTRY + "Connecte aux registres d'un ordinateur distant" + ID_REGISTRY_DISCONNECTNETWORKREGISTRY + "D閏onnecte des registres d'un ordinateur distant" + ID_REGISTRY_PRINT "Imprime tout ou une partie des registres" +/* ID_HELP_HELPTOPICS "Ouvre l'aide de l'閐iteur de registres" */ + ID_HELP_ABOUT "Affiche de l'information sur le programme, le num閞o de version et le copyright" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_REGISTRY_EXIT "Quitte l'閐iteur de registres" + ID_FAVOURITES_ADDTOFAVOURITES "Ajoute des cl閟 la liste des Favoris" + ID_FAVOURITES_REMOVEFAVOURITE "Retire des cl閟 de la liste des Favoris" + ID_VIEW_STATUSBAR "Montre ou cache la barre d'閠at" + ID_VIEW_SPLIT "Change la position de la s閜aration entre les deux panneaux" + ID_VIEW_REFRESH "Rafra頲hit la fen阾re" + ID_EDIT_DELETE "Supprime la s閘ection" + ID_EDIT_RENAME "Renomme la s閘ection" + ID_EDIT_COPYKEYNAME "Copie le nom de la cl s閘ectionn閑 vers le presse-papier" + ID_EDIT_FIND "Recherche du texte dans une cl, une valeur ou des donn閑s" + ID_EDIT_FINDNEXT "Recherche l'occurence suivante du texte de la derni鑢e recherche" +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 "Bo顃e de dialogue" +FONT 8, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "OK",IDOK,130,7,50,14 + PUSHBUTTON "Annuler",IDCANCEL,130,24,50,14 +END + + +/* + * TEXTINCLUDE + */ + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + + + +/* + * String Table + */ + +/* + *STRINGTABLE DISCARDABLE + *BEGIN + * ID_HELP_HELPTOPICS "Ouvre l'aide de l'閐iteur de registres." + * ID_HELP_ABOUT "Affiche de l'information sur le programme, le num閞o de version et le copyright." + *END + */ + +/*****************************************************************/ diff --git a/reactos/subsys/system/regedit/It.rc b/reactos/subsys/system/regedit/It.rc new file mode 100644 index 00000000000..a488a1d780c --- /dev/null +++ b/reactos/subsys/system/regedit/It.rc @@ -0,0 +1,230 @@ +/* + * Regedit resources + * + * Copyright 2002 Robert Dickenson + * Copyright 2003-2004 Ivan Leo Murray-Smith + * Copyright 2004 Sylvain P閠r閛lle + * + * 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_ITALIAN, SUBLANG_DEFAULT + +/* + * Menu + */ + +IDC_REGEDIT MENU DISCARDABLE +BEGIN + POPUP "&File" + BEGIN + MENUITEM "E&sci", ID_REGISTRY_EXIT + END + POPUP "&Aiuto" + BEGIN + MENUITEM "&Informazioni sull'editor del Registro", ID_HELP_ABOUT + END +END + +IDR_REGEDIT_MENU MENU DISCARDABLE +BEGIN + POPUP "&Registro" + BEGIN + MENUITEM "&Importa...", ID_REGISTRY_IMPORTREGISTRYFILE + MENUITEM "&Esporta...", ID_REGISTRY_EXPORTREGISTRYFILE + MENUITEM SEPARATOR + MENUITEM "&Connetti a Registro in rete...", ID_REGISTRY_CONNECTNETWORKREGISTRY, GRAYED + MENUITEM "&Disconntti da Registro di rete...", ID_REGISTRY_DISCONNECTNETWORKREGISTRY, GRAYED + MENUITEM SEPARATOR + MENUITEM "&Stampa\tCtrl+P", ID_REGISTRY_PRINT, GRAYED + MENUITEM SEPARATOR + MENUITEM "E&sci", ID_REGISTRY_EXIT + END + POPUP "&Modifica" + BEGIN + MENUITEM "&Modifica", ID_EDIT_MODIFY + MENUITEM SEPARATOR + POPUP "&Nuovo" + BEGIN + MENUITEM "Chiave", ID_EDIT_NEW_KEY + MENUITEM SEPARATOR + MENUITEM "&Valore stringa", ID_EDIT_NEW_STRINGVALUE + MENUITEM "&Valore binario", ID_EDIT_NEW_BINARYVALUE + MENUITEM "&Valore DWORD", ID_EDIT_NEW_DWORDVALUE + END + MENUITEM SEPARATOR + MENUITEM "&Elimina\tDel", ID_EDIT_DELETE + MENUITEM "&Rinomina", ID_EDIT_RENAME + MENUITEM SEPARATOR + MENUITEM "&Copia nome chiave", ID_EDIT_COPYKEYNAME + MENUITEM SEPARATOR + MENUITEM "&Trova\tCtrl+F", ID_EDIT_FIND, GRAYED + MENUITEM "&Trova Successivo\tF3", ID_EDIT_FINDNEXT, GRAYED + END + POPUP "&Visualizza" + BEGIN + MENUITEM "Barra di &Stato", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "Di&vidi", ID_VIEW_SPLIT + MENUITEM SEPARATOR + MENUITEM "&Aggiorna\tF5", ID_VIEW_REFRESH + END + POPUP "&Preferiti" + BEGIN + MENUITEM "&Aggiungi ai Preferiti", ID_FAVOURITES_ADDTOFAVOURITES + , GRAYED + MENUITEM "&Rimuovi dai Preferiti", ID_FAVOURITES_REMOVEFAVOURITE + , GRAYED + END + POPUP "&Aiuto" + BEGIN + MENUITEM "&Sommario della Guida", ID_HELP_HELPTOPICS + MENUITEM SEPARATOR + MENUITEM "&Informazioni sull'editor del Registro", ID_HELP_ABOUT + END +END + + +IDD_EDIT_STRING DIALOG DISCARDABLE 22, 17, 210, 75 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Edita Stringa" +FONT 8, "System" +BEGIN + LTEXT "Nome del valore:",IDC_STATIC,5,5,119,8 + EDITTEXT IDC_VALUE_NAME,5,15,200,12, WS_BORDER | WS_TABSTOP | WS_DISABLED + LTEXT "Data del valore:",IDC_STATIC,5,30,119,8 + EDITTEXT IDC_VALUE_DATA,5,40,200,12, WS_BORDER | WS_TABSTOP + DEFPUSHBUTTON "OK",IDOK,140,60,30,11,WS_GROUP + DEFPUSHBUTTON "Annulla",IDCANCEL,175,60,30,11,WS_GROUP +END + +/* + * String Table + */ + +STRINGTABLE DISCARDABLE +BEGIN + IDS_LIST_COLUMN_NAME "Nome" + IDS_LIST_COLUMN_TYPE "Tipo" + IDS_LIST_COLUMN_DATA "Dati" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_APP_TITLE "Editor del Registro" + IDC_REGEDIT "REGEDIT" + IDC_REGEDIT_FRAME "REGEDIT_FRAME" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_REGISTRY_MENU "Contiene i comandi per lavorare su tutto il Registro" + ID_EDIT_MENU "Contiene i comandi per editare valori o chiavi" + ID_VIEW_MENU "Contiene i comandi per personalizzare la finestra del Registro" + ID_FAVOURITES_MENU "Contiene i comandi per accedere alle chiavi usate frequentemente" + ID_HELP_MENU "Contiene i comandi per visualizzare la Guida e informazioni sull'editor del Registro" + ID_EDIT_NEW_MENU "Contiene i comandi per creare nuove chiavi o valori" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_EDIT_MODIFY "Modifica i dati del valore" + ID_EDIT_NEW_KEY "Aggiunge una nuova chiave" + ID_EDIT_NEW_STRINGVALUE "Aggiunge un nuovo valore stringa" + ID_EDIT_NEW_BINARYVALUE "Aggiunge un nuovo valore binario" + ID_EDIT_NEW_DWORDVALUE "Aggiunge un nuovo valore a doppia parola" + ID_REGISTRY_IMPORTREGISTRYFILE "Importa un file di testo nel Registro" + ID_REGISTRY_EXPORTREGISTRYFILE + "Esporta tutto o parte del Registro in un file di testo" + ID_REGISTRY_CONNECTNETWORKREGISTRY + "Si connette al Registro di un computer remoto" + ID_REGISTRY_DISCONNECTNETWORKREGISTRY + "Si disconnette dal Registro di un computer remoto" + ID_REGISTRY_PRINT "Stampa tutto o parte del Registro" +/* ID_HELP_HELPTOPICS "Apre l'aiuto dell'Editor del Registro" */ + ID_HELP_ABOUT "Visualizza informazioni sul programma, numero di versione e copyright" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_REGISTRY_EXIT "Esce dall'editor del Registro" + ID_FAVOURITES_ADDTOFAVOURITES "Aggiunge una chiave alla lista dei Preferiti" + ID_FAVOURITES_REMOVEFAVOURITE "Rimuove una o pi chiavi dalla lista dei preferiti" + ID_VIEW_STATUSBAR "Mostra o nasconde la barra di stato" + ID_VIEW_SPLIT "Cambia la posizione del separatore tra due pannelli" + ID_VIEW_REFRESH "Aggiorna la finestra" + ID_EDIT_DELETE "Elimina la selezione" + ID_EDIT_RENAME "Rinomina la selezione" + ID_EDIT_COPYKEYNAME "Copia il nome della chiave selezionata negli appunti" + ID_EDIT_FIND "Trova una stringa di testo in una chiave, un valore o in dei dati" + ID_EDIT_FINDNEXT "Trova la volta successiva il testo specificato nella ricerca precedente" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_ERROR "Errore" + IDS_BAD_VALUE "Impossibile interrogare il valore '%s'" + IDS_UNSUPPORTED_TYPE "Impossibile editare valori di questo tipo (%ld)" + IDS_TOO_BIG_VALUE "Valore troppo grande (%ld)" +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 "Dialogo" +FONT 8, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "OK",IDOK,130,7,50,14 + PUSHBUTTON "Annulla",IDCANCEL,130,24,50,14 +END + + +/* + * TEXTINCLUDE + */ + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + + + +/* + * String Table + */ + +/* + *STRINGTABLE DISCARDABLE + *BEGIN + * ID_HELP_HELPTOPICS "Apre l'aiuto dell'editor del Registro." + * ID_HELP_ABOUT "Visualizza informazioni sul programma, il numero di versione e il copyright." + *END + */ + +/*****************************************************************/ diff --git a/reactos/subsys/system/regedit/Nl.rc b/reactos/subsys/system/regedit/Nl.rc new file mode 100644 index 00000000000..f48a717d7c1 --- /dev/null +++ b/reactos/subsys/system/regedit/Nl.rc @@ -0,0 +1,190 @@ +/* + * Regedit (Dutch resources) + * + * Copyright 2003 Hans Leidekker + * + * 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_DUTCH, SUBLANG_DEFAULT + +/* + * Menu + */ + +IDC_REGEDIT MENU DISCARDABLE +BEGIN + POPUP "&Bestand" + BEGIN + MENUITEM "&Afsluiten", ID_REGISTRY_EXIT + END + POPUP "&Help" + BEGIN + MENUITEM "&Info ...", ID_HELP_ABOUT + END +END + +IDR_REGEDIT_MENU MENU DISCARDABLE +BEGIN + POPUP "&Registerbestand" + BEGIN + MENUITEM "Registerbestand &importeren...", ID_REGISTRY_IMPORTREGISTRYFILE + MENUITEM "Registerbestand &exporteren...", ID_REGISTRY_EXPORTREGISTRYFILE + MENUITEM SEPARATOR + MENUITEM "Verbinding &maken met netwerkregister...", ID_REGISTRY_CONNECTNETWORKREGISTRY, GRAYED + MENUITEM "Verbinding &verbreken met netwerkregister...", ID_REGISTRY_DISCONNECTNETWORKREGISTRY, GRAYED + MENUITEM SEPARATOR + MENUITEM "Af&drukken\tCtrl+P", ID_REGISTRY_PRINT, GRAYED + MENUITEM SEPARATOR + MENUITEM "&Afsluiten", ID_REGISTRY_EXIT + END + POPUP "&Bewerken" + BEGIN + MENUITEM "&Wijzigen", ID_EDIT_MODIFY + MENUITEM SEPARATOR + POPUP "&Nieuw" + BEGIN + MENUITEM "&Sleutel", ID_EDIT_NEW_KEY + MENUITEM SEPARATOR + MENUITEM "&Tekenreekswaarde", ID_EDIT_NEW_STRINGVALUE + MENUITEM "&Binaire waarde", ID_EDIT_NEW_BINARYVALUE + MENUITEM "&DWORD-waarde", ID_EDIT_NEW_DWORDVALUE + END + MENUITEM SEPARATOR + MENUITEM "&Verwijderen\tDel", ID_EDIT_DELETE + MENUITEM "&Naam wijzigen", ID_EDIT_RENAME + MENUITEM SEPARATOR + MENUITEM "&Sleutelnaam kopi毛ren", ID_EDIT_COPYKEYNAME + MENUITEM SEPARATOR + MENUITEM "&Zoeken\tCtrl+F", ID_EDIT_FIND, GRAYED + MENUITEM "Volgende Zoeken\tF3", ID_EDIT_FINDNEXT, GRAYED + END + POPUP "Bee&ld" + BEGIN + MENUITEM "&Statusbalk", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "S&plitsen", ID_VIEW_SPLIT + MENUITEM SEPARATOR + MENUITEM "&Vernieuwen\tF5", ID_VIEW_REFRESH + END + POPUP "&Favorieten" + BEGIN + MENUITEM "&Toevoegen aan favorieten", ID_FAVOURITES_ADDTOFAVOURITES + , GRAYED + MENUITEM "&Verwijderen uit favorieten", ID_FAVOURITES_REMOVEFAVOURITE + , GRAYED + END + POPUP "&Help" + BEGIN + MENUITEM "&Help-onderwerpen", ID_HELP_HELPTOPICS + MENUITEM SEPARATOR + MENUITEM "&Info", ID_HELP_ABOUT + END +END + +/* + * String Table + */ + +STRINGTABLE DISCARDABLE +BEGIN + IDS_LIST_COLUMN_NAME "Naam" + IDS_LIST_COLUMN_TYPE "Type" + IDS_LIST_COLUMN_DATA "Gegevens" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_APP_TITLE "Register-editor" + IDC_REGEDIT "REGEDIT" + IDC_REGEDIT_FRAME "REGEDIT_FRAME" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_REGISTRY_MENU "Opdrachten voor het werken met het gehele register" + ID_EDIT_MENU "Opdrachten voor het bewerken van waarden of sleutels" + ID_VIEW_MENU "Opdrachten voor het aanpassen van het registervenster" + ID_FAVOURITES_MENU "Opdrachten voor toegang tot vaak gebruikte sleutels" + ID_HELP_MENU "Opdrachten voor het weergeven van Help en informatie over de Register-editor" + ID_EDIT_NEW_MENU "Opdrachten voor het maken van nieuwe sleutels of waarden" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_EDIT_MODIFY "De gegevens van de waarde wijzigen" + ID_EDIT_NEW_KEY "Een nieuwe sleutel toevoegen" + ID_EDIT_NEW_STRINGVALUE "Een nieuwe tekenreekswaarde toevoegen" + ID_EDIT_NEW_BINARYVALUE "Een nieuwe binaire waarde toevoegen" + ID_EDIT_NEW_DWORDVALUE "Een nieuwe DWORD-waarde toevoegen" + ID_REGISTRY_IMPORTREGISTRYFILE "Een tekstbestand in het register importeren" + ID_REGISTRY_EXPORTREGISTRYFILE + "Het register of een gedeelte ervan naar een tekstbestand exporteren" + ID_REGISTRY_CONNECTNETWORKREGISTRY + "Een verbinding maken met het register van een externe computer" + ID_REGISTRY_DISCONNECTNETWORKREGISTRY + "De verbinding met het register van een externe computer verbreken" + ID_REGISTRY_PRINT "Het register of een gedeelte ervan afdrukken" +/* ID_HELP_HELPTOPICS "Help voor de Register-editor openen" */ + ID_HELP_ABOUT "Programmagegevens, versienummer en copyrightgegevens weergeven" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_REGISTRY_EXIT "De Register-editor afsluiten" + ID_FAVOURITES_ADDTOFAVOURITES "Sleutels toevoegen aan de lijst met favorieten" + ID_FAVOURITES_REMOVEFAVOURITE "Sleutels verwijderen uit de lijst met favorieten" + ID_VIEW_STATUSBAR "De statusbalk weergeven of verbergen" + ID_VIEW_SPLIT "De positie van de splitsing tussen twee deelvensters wijzigen" + ID_VIEW_REFRESH "Het venster vernieuwen" + ID_EDIT_DELETE "De selectie verwijderen" + ID_EDIT_RENAME "De naam van de selectie wijzigen" + ID_EDIT_COPYKEYNAME "De naam van de geselecteerde sleutel naar het Klembord kopi毛ren" + ID_EDIT_FIND "Een tekenreeks zoeken in een sleutel, een waarde of gegevens" + ID_EDIT_FINDNEXT "De opgegeven tekst nogmaals zoeken" +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 "Annuleren",IDCANCEL,130,24,50,14 +END + + +/* + * TEXTINCLUDE + */ + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END diff --git a/reactos/subsys/system/regedit/Pt.rc b/reactos/subsys/system/regedit/Pt.rc new file mode 100644 index 00000000000..5ee1e79352c --- /dev/null +++ b/reactos/subsys/system/regedit/Pt.rc @@ -0,0 +1,250 @@ +/* + * Regedit resources + * + * Copyright 2003 Marcelo Duarte + * Copyright 2004 Sylvain P閠r閛lle + * + * 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_PORTUGUESE, SUBLANG_DEFAULT + +/* + * Menu + */ + +IDC_REGEDIT MENU DISCARDABLE +BEGIN + POPUP "&Arquivo" + BEGIN + MENUITEM "Sai&r", ID_REGISTRY_EXIT + END + POPUP "Aj&uda" + BEGIN + MENUITEM "&Sobre...", ID_HELP_ABOUT + END +END + +IDR_REGEDIT_MENU MENU DISCARDABLE +BEGIN + POPUP "&Registro" + BEGIN + MENUITEM "&Importar arquivo do Registro...", ID_REGISTRY_IMPORTREGISTRYFILE + MENUITEM "&Exportar arquivo do Registro...", ID_REGISTRY_EXPORTREGISTRYFILE + MENUITEM SEPARATOR + MENUITEM "&Conectar Registro da rede...", ID_REGISTRY_CONNECTNETWORKREGISTRY, GRAYED + MENUITEM "&Desconectar Registro da rede...", ID_REGISTRY_DISCONNECTNETWORKREGISTRY, GRAYED + MENUITEM SEPARATOR + MENUITEM "Im&primir\tCtrl+P", ID_REGISTRY_PRINT, GRAYED + MENUITEM SEPARATOR + MENUITEM "Sai&r", ID_REGISTRY_EXIT + END + POPUP "&Editar" + BEGIN + MENUITEM "&Modificar", ID_EDIT_MODIFY + MENUITEM SEPARATOR + POPUP "&Novo" + BEGIN + MENUITEM "&Chave", ID_EDIT_NEW_KEY + MENUITEM SEPARATOR + MENUITEM "Valor &Texto", ID_EDIT_NEW_STRINGVALUE + MENUITEM "Valor &Bin醨io", ID_EDIT_NEW_BINARYVALUE + MENUITEM "Valor &DWORD", ID_EDIT_NEW_DWORDVALUE + END + MENUITEM SEPARATOR + MENUITEM "&Excluir\tDel", ID_EDIT_DELETE + MENUITEM "&Renomear", ID_EDIT_RENAME + MENUITEM SEPARATOR + MENUITEM "&Copiar nome da chave", ID_EDIT_COPYKEYNAME + MENUITEM SEPARATOR + MENUITEM "&Localizar\tCtrl+F", ID_EDIT_FIND, GRAYED + MENUITEM "L&ocalizar pr髕ima\tF3", ID_EDIT_FINDNEXT, GRAYED + END + POPUP "E&xibir" + BEGIN + MENUITEM "&Barra de status", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Dividir", ID_VIEW_SPLIT + MENUITEM SEPARATOR + MENUITEM "&Atualizar\tF5", ID_VIEW_REFRESH + END + POPUP "&Favoritos" + BEGIN + MENUITEM "&Adicionar aos Favoritos", ID_FAVOURITES_ADDTOFAVOURITES + , GRAYED + MENUITEM "&Remover Favorito", ID_FAVOURITES_REMOVEFAVOURITE + , GRAYED + END + POPUP "Aj&uda" + BEGIN + MENUITEM "&Topics da Ajuda", ID_HELP_HELPTOPICS + MENUITEM SEPARATOR + MENUITEM "&Sobre o Editor do Registro", ID_HELP_ABOUT + END +END + +IDR_POPUP_MENUS MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Modificar", ID_EDIT_MODIFY + MENUITEM "Modificar dados bin醨ios", ID_EDIT_MODIFY_BIN + MENUITEM SEPARATOR + MENUITEM "&Excluir\tDel", ID_EDIT_DELETE + MENUITEM "&Renomear", ID_EDIT_RENAME + END + POPUP "" + BEGIN + POPUP "&Novo" + BEGIN + MENUITEM "&Chave", ID_EDIT_NEW_KEY + MENUITEM SEPARATOR + MENUITEM "Valor &Texto", ID_EDIT_NEW_STRINGVALUE + MENUITEM "Valor &Bin醨io", ID_EDIT_NEW_BINARYVALUE + MENUITEM "Valor &DWORD", ID_EDIT_NEW_DWORDVALUE + END + END +END + +IDD_EDIT_STRING DIALOG DISCARDABLE 22, 17, 210, 75 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Editar texto" +FONT 8, "System" +BEGIN + LTEXT "Nome do valor:",IDC_STATIC,5,5,119,8 + EDITTEXT IDC_VALUE_NAME,5,15,200,12, WS_BORDER | WS_TABSTOP | WS_DISABLED + LTEXT "Dados do valor:",IDC_STATIC,5,30,119,8 + EDITTEXT IDC_VALUE_DATA,5,40,200,12, WS_BORDER | WS_TABSTOP + DEFPUSHBUTTON "OK",IDOK,140,60,30,11,WS_GROUP + DEFPUSHBUTTON "Cancelar",IDCANCEL,175,60,30,11,WS_GROUP +END + +/* + * String Table + */ + +STRINGTABLE DISCARDABLE +BEGIN + IDS_LIST_COLUMN_NAME "Nome" + IDS_LIST_COLUMN_TYPE "Tipo" + IDS_LIST_COLUMN_DATA "Dados" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_APP_TITLE "Editor do Registro" + IDC_REGEDIT "REGEDIT" + IDC_REGEDIT_FRAME "REGEDIT_FRAME" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_REGISTRY_MENU "Cont閙 comandos para trabalhar com o Registro inteiro." + ID_EDIT_MENU "Cont閙 comandos para edi玢o de valores ou chaves." + ID_VIEW_MENU "Cont閙 comandos para personaliza玢o da janela do Registro." + ID_FAVOURITES_MENU "Cont閙 comandos para acessar chaves frequentemente usadas." + ID_HELP_MENU "Cont閙 comandos para exibi玢o da ajuda e informa珲es sobre o Editor do Registro." + ID_EDIT_NEW_MENU "Cont閙 comandos para cria玢o de novas chaves ou valores" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_EDIT_MODIFY "Modifica os dados do valor." + ID_EDIT_NEW_KEY "Adiciona uma nova chave" + ID_EDIT_NEW_STRINGVALUE "Adiciona um novo valor texto." + ID_EDIT_NEW_BINARYVALUE "Adiciona um novo valor bin醨io." + ID_EDIT_NEW_DWORDVALUE "Adiciona um novo valor DWORD." + ID_REGISTRY_IMPORTREGISTRYFILE "Importa um arquivo texto para o registro." + ID_REGISTRY_EXPORTREGISTRYFILE + "Exporta todo ou parte do registro para um arquivo texto." + ID_REGISTRY_CONNECTNETWORKREGISTRY + "Conecta a um registro em um computador remoto." + ID_REGISTRY_DISCONNECTNETWORKREGISTRY + "Desconecta de um registro um computador remoto." + ID_REGISTRY_PRINT "Imprime todo ou parte do registro." +/* ID_HELP_HELPTOPICS "Abre a ajuda do Editor do Registro." */ + ID_HELP_ABOUT "Exibe informa珲es do programa, n鷐ero da vers鉶 e copyright." +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_REGISTRY_EXIT "Encerra o Editor do Registro." + ID_FAVOURITES_ADDTOFAVOURITES "Adiciona chaves a lista de favoritos." + ID_FAVOURITES_REMOVEFAVOURITE "Remove chaves da lista de favoritos." + ID_VIEW_STATUSBAR "Mostra ou oculta a barra de status." + ID_VIEW_SPLIT "Altera a posi玢o da divis鉶 entre os pain閕s." + ID_VIEW_REFRESH "Atualiza a janela." + ID_EDIT_DELETE "Exclui a selec鉶." + ID_EDIT_RENAME "Renomeia a selec鉶." + ID_EDIT_COPYKEYNAME "Copia o nome da chave selecionada para a 羠ea de transfer阯cia." + ID_EDIT_FIND "Localiza um texto em uma chave, valor ou dado." + ID_EDIT_FINDNEXT "Localiza a pr髕ima ocorr阯cia do texto especificado na pesquisa anterior." +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_ERROR "Erro" + IDS_BAD_VALUE "N鉶 pode perguntar o valor '%s'" + IDS_UNSUPPORTED_TYPE "N鉶 pode editar chaves deste tipo (%ld)" + IDS_TOO_BIG_VALUE "Valor muito grande (%ld)" +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 "Cancelar",IDCANCEL,130,24,50,14 +END + + +/* + * TEXTINCLUDE + */ + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + + +/* + * String Table + */ + +/* + *STRINGTABLE DISCARDABLE + *BEGIN + * ID_HELP_HELPTOPICS "Opens Registry Editor Help." + * ID_HELP_ABOUT "Displays program information, version number, and copyright." + *END + */ + +/*****************************************************************/ diff --git a/reactos/subsys/system/regedit/Ru.rc b/reactos/subsys/system/regedit/Ru.rc new file mode 100644 index 00000000000..44b32436bca --- /dev/null +++ b/reactos/subsys/system/regedit/Ru.rc @@ -0,0 +1,206 @@ +/* + * Regedit (Russian resources) + * + * Copyright 2003 Igor Stepin + * + * 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_RUSSIAN, SUBLANG_DEFAULT + +/* + * Menu + */ + +IDC_REGEDIT MENU DISCARDABLE +BEGIN + POPUP "&脏殡" + BEGIN + MENUITEM "&钿", ID_REGISTRY_EXIT + END + POPUP "&扬疣怅" + BEGIN + MENUITEM "& 镳钽疣祆", ID_HELP_ABOUT + END +END + +IDR_REGEDIT_MENU MENU DISCARDABLE +BEGIN + POPUP "&绣羼蝠" + BEGIN + MENUITEM "&褥镱痱桊钼囹 羿殡 疱羼蝠...", ID_REGISTRY_IMPORTREGISTRYFILE + MENUITEM "&蓐耧铕蜩痤忄螯 羿殡 疱羼蝠...", ID_REGISTRY_EXPORTREGISTRYFILE + MENUITEM SEPARATOR + MENUITEM "&项潢膻麒螯 皴蝈忸 疱羼蝠...", ID_REGISTRY_CONNECTNETWORKREGISTRY, GRAYED + MENUITEM "&悟觌栩 皴蝈忸 疱羼蝠...", ID_REGISTRY_DISCONNECTNETWORKREGISTRY, GRAYED + MENUITEM SEPARATOR + MENUITEM "&襄鬣蜞黒tCtrl+P", ID_REGISTRY_PRINT, GRAYED + MENUITEM SEPARATOR + MENUITEM "&钿", ID_REGISTRY_EXIT + END + POPUP "&橡噔赅" + BEGIN + MENUITEM "&如戾龛螯", ID_EDIT_MODIFY + MENUITEM SEPARATOR + POPUP "杨玟&囹" + BEGIN + MENUITEM "孰&", ID_EDIT_NEW_KEY + MENUITEM SEPARATOR + MENUITEM "&羊痤觐忸 珥圜屙桢", ID_EDIT_NEW_STRINGVALUE + MENUITEM "&凌磬痦铄 珥圜屙桢", ID_EDIT_NEW_BINARYVALUE + MENUITEM "&DWORD 珥圜屙桢", ID_EDIT_NEW_DWORDVALUE + END + MENUITEM SEPARATOR + MENUITEM "&愉嚯栩黒tDel", ID_EDIT_DELETE + MENUITEM "&襄疱桁屙钼囹", ID_EDIT_RENAME + MENUITEM SEPARATOR + MENUITEM "&觐镨痤忄螯 桁 觌", ID_EDIT_COPYKEYNAME + MENUITEM SEPARATOR + MENUITEM "&袜轵鑌tCtrl+F", ID_EDIT_FIND, GRAYED + MENUITEM "袜轵 &溧脲錦tF3", ID_EDIT_FINDNEXT, GRAYED + END + POPUP "&妈" + BEGIN + MENUITEM "羊痤赅 &耦耱龛", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&朽玟咫栩", ID_VIEW_SPLIT + MENUITEM SEPARATOR + MENUITEM "&吾眍忤螯\tF5", ID_VIEW_REFRESH + END + POPUP "&如狃囗眍" + BEGIN + MENUITEM "&念徉忤螯 桤狃囗眍", ID_FAVOURITES_ADDTOFAVOURITES + , GRAYED + MENUITEM "&愉嚯栩 桤 桤狃囗眍泐", ID_FAVOURITES_REMOVEFAVOURITE + , GRAYED + END + POPUP "&扬疣怅" + BEGIN + MENUITEM "&杨溴疰囗桢", ID_HELP_HELPTOPICS + MENUITEM SEPARATOR + MENUITEM "& 疱溧牝铕 疱羼蝠", ID_HELP_ABOUT + END +END + +/* + * String Table + */ + +STRINGTABLE DISCARDABLE +BEGIN + IDS_LIST_COLUMN_NAME "褥" + IDS_LIST_COLUMN_TYPE "诣" + IDS_LIST_COLUMN_DATA "泥眄" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_APP_TITLE "绣溧牝铕 疱羼蝠" + IDC_REGEDIT "REGEDIT" + IDC_REGEDIT_FRAME "REGEDIT_FRAME" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_REGISTRY_MENU "杨溴疰栩 觐爨礓 潆 疣犷螓 疱汨耱痤 鲥腩" + ID_EDIT_MENU "杨溴疰栩 觐爨礓 潆 疱溧牝桊钼囗 珥圜屙栝 桦 觌彘" + ID_VIEW_MENU "杨溴疰栩 觐爨礓 潆 磬耱痤殛 铌磬 疱羼蝠" + ID_FAVOURITES_MENU "杨溴疰栩 觐爨礓 潆 漕耱箫 鬣耱 桉镱朦珞屐 觌囔" + ID_HELP_MENU "杨溴疰栩 觐爨礓 潆 铗钺疣驽龛 耧疣怅 桧纛痨圉梃 疱溧牝铕 疱羼蝠" + ID_EDIT_NEW_MENU "杨溴疰栩 觐爨礓 潆 耦玟囗 眍恹 觌彘 桦 珥圜屙栝" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_EDIT_MODIFY "Modifies the value's data" + ID_EDIT_NEW_KEY "念徉怆弪 眍恹 觌" + ID_EDIT_NEW_STRINGVALUE "念徉怆弪 眍忸 耱痤觐忸 珥圜屙桢" + ID_EDIT_NEW_BINARYVALUE "念徉怆弪 眍忸 徼磬痦铄 珥圜屙桢" + ID_EDIT_NEW_DWORDVALUE "念徉怆弪 眍忸 DWORD-珥圜屙桢" + ID_REGISTRY_IMPORTREGISTRYFILE "褥镱痱桊箦 蝈犟蝾忸 羿殡 疱羼蝠" + ID_REGISTRY_EXPORTREGISTRYFILE + "蓐耧铕蜩痼弪 忮顸 疱羼蝠 桦 邈 鬣耱 蝈犟蝾忸 羿殡" + ID_REGISTRY_CONNECTNETWORKREGISTRY + "项潢膻鬣弪 疱羼蝠 箐嚯疙眍泐 觐祜蝈疣" + ID_REGISTRY_DISCONNECTNETWORKREGISTRY + "悟觌噱蝰 铗 疱羼蝠 箐嚯疙眍泐 觐祜蝈疣" + ID_REGISTRY_PRINT "襄鬣蜞弪 忮顸 疱羼蝠 桦 钽 鬣耱" +/* ID_HELP_HELPTOPICS "Opens registry editor help" */ + ID_HELP_ABOUT "悟钺疣驵弪 桧纛痨圉棹 镳钽疣祆, 眍戾 忮瘃梃 噔蝾瘃蜮" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_REGISTRY_EXIT "蔓躅 桤 疱溧牝铕 疱羼蝠" + ID_FAVOURITES_ADDTOFAVOURITES "念徉忤螯 觌 桤狃囗眍" + ID_FAVOURITES_REMOVEFAVOURITE "愉嚯栩 觌 桤 桤狃囗眍泐" + ID_VIEW_STATUSBAR "项赅玎螯 桦 耜瘥螯 耱痤牦 耦耱龛" + ID_VIEW_SPLIT "如戾龛螯 镱玷鲨 疣玟咫栩咫 戾驿 溻箪 镟礤扈" + ID_VIEW_REFRESH "吾眍怆弪 铌眍" + ID_EDIT_DELETE "愉嚯弪 恹溴脲龛" + ID_EDIT_RENAME "襄疱桁屙钼噱 恹溴脲龛" + ID_EDIT_COPYKEYNAME "暑镨痼弪 桁 恹溴脲眄钽 觌 狍翦 钺戾磬" + ID_EDIT_FIND "腮弪 蝈犟蝾怏 耱痤牦 觌, 珥圜屙梃 桦 溧眄" + ID_EDIT_FINDNEXT "腮弪 耠邃簋 耦怙噤屙桢 蝈犟蜞, 玎溧眄钽 镳邃簌屐 镱桉赍" +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 "蔫嚯钽" +FONT 8, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "OK",IDOK,130,7,50,14 + PUSHBUTTON "悟戾磬",IDCANCEL,130,24,50,14 +END + + +/* + * TEXTINCLUDE + */ + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + + + +/* + * String Table + */ + +/* + *STRINGTABLE DISCARDABLE + *BEGIN + * ID_HELP_HELPTOPICS "Opens Registry Editor Help." + * ID_HELP_ABOUT "Displays program information, version number, and copyright." + *END + */ + +/*****************************************************************/ diff --git a/reactos/subsys/system/regedit/Si.rc b/reactos/subsys/system/regedit/Si.rc new file mode 100644 index 00000000000..e33ad4b8790 --- /dev/null +++ b/reactos/subsys/system/regedit/Si.rc @@ -0,0 +1,206 @@ +/* + * Regedit resources + * + * Copyright 2003 Rok Mandeljc <rok.mandeljc@gimb.org> + * + * 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_SLOVENIAN, SUBLANG_NEUTRAL + +/* + * Menu + */ + +IDC_REGEDIT MENU DISCARDABLE +BEGIN + POPUP "&Datoteka" + BEGIN + MENUITEM "Iz&hod", ID_REGISTRY_EXIT + END + POPUP "&Pomo" + BEGIN + MENUITEM "&O ...", ID_HELP_ABOUT + END +END + +IDR_REGEDIT_MENU MENU DISCARDABLE +BEGIN + POPUP "&Register" + BEGIN + MENUITEM "&Uvozi registrsko datoteko ...", ID_REGISTRY_IMPORTREGISTRYFILE + MENUITEM "&Izvozi registrsko datoteko ...", ID_REGISTRY_EXPORTREGISTRYFILE + MENUITEM SEPARATOR + MENUITEM "P&ove瀒 se z omre瀗im registrom ...", ID_REGISTRY_CONNECTNETWORKREGISTRY, GRAYED + MENUITEM "P&rekini povezavo z omre瀗im registrom ...", ID_REGISTRY_DISCONNECTNETWORKREGISTRY, GRAYED + MENUITEM SEPARATOR + MENUITEM "Na&tisni\tCtrl+P", ID_REGISTRY_PRINT, GRAYED + MENUITEM SEPARATOR + MENUITEM "Iz&hod", ID_REGISTRY_EXIT + END + POPUP "&Urejanje" + BEGIN + MENUITEM "&Spremeni", ID_EDIT_MODIFY + MENUITEM SEPARATOR + POPUP "&Nova" + BEGIN + MENUITEM "&Klju", ID_EDIT_NEW_KEY + MENUITEM SEPARATOR + MENUITEM "&Niz", ID_EDIT_NEW_STRINGVALUE + MENUITEM "&Binarna vrednost", ID_EDIT_NEW_BINARYVALUE + MENUITEM "&DWORD vrednost", ID_EDIT_NEW_DWORDVALUE + END + MENUITEM SEPARATOR + MENUITEM "Izbri&歩\tDel", ID_EDIT_DELETE + MENUITEM "Prei&menuj", ID_EDIT_RENAME + MENUITEM SEPARATOR + MENUITEM "&Kopiraj ime klju鑑", ID_EDIT_COPYKEYNAME + MENUITEM SEPARATOR + MENUITEM "&Najdi\tCtrl+F", ID_EDIT_FIND, GRAYED + MENUITEM "Na&daljuj iskanje\tF3", ID_EDIT_FINDNEXT, GRAYED + END + POPUP "Pogl&ed" + BEGIN + MENUITEM "&Vrstica stanja", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Delilna 鑢ta", ID_VIEW_SPLIT + MENUITEM SEPARATOR + MENUITEM "&Osve瀒\tF5", ID_VIEW_REFRESH + END + POPUP "&Priljubljene" + BEGIN + MENUITEM "&Dodaj med Priljubljene", ID_FAVOURITES_ADDTOFAVOURITES + , GRAYED + MENUITEM "&Odstrani iz Priljubljenih", ID_FAVOURITES_REMOVEFAVOURITE + , GRAYED + END + POPUP "&Pomo" + BEGIN + MENUITEM "&Teme pomo鑙", ID_HELP_HELPTOPICS + MENUITEM SEPARATOR + MENUITEM "&O Urejevalniku registra", ID_HELP_ABOUT + END +END + +/* + * String Table + */ + +STRINGTABLE DISCARDABLE +BEGIN + IDS_LIST_COLUMN_NAME "Ime" + IDS_LIST_COLUMN_TYPE "Vrsta" + IDS_LIST_COLUMN_DATA "Podatki" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_APP_TITLE "Urejevalnik registra" + IDC_REGEDIT "REGEDIT" + IDC_REGEDIT_FRAME "REGEDIT_FRAME" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_REGISTRY_MENU "Ukazi za delo s celotnim registrom" + ID_EDIT_MENU "Ukazi za urejanje vrednosti in klju鑕v" + ID_VIEW_MENU "Ukazi za prilagajanje registrskega okna" + ID_FAVOURITES_MENU "Ukazi za dostop do nedavno odprtih klju鑕v" + ID_HELP_MENU "Ukazi za prikazovanje pomo鑙 in informacij o programu" + ID_EDIT_NEW_MENU "Ukazi za ustvarjanje novih klju鑕v in vrednosti" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_EDIT_MODIFY "Spremeni podatke vrednosti" + ID_EDIT_NEW_KEY "Doda nov klju" + ID_EDIT_NEW_STRINGVALUE "Doda nov niz" + ID_EDIT_NEW_BINARYVALUE "Doda novo binarno vrednost" + ID_EDIT_NEW_DWORDVALUE "Doda novo DWORD vrednost" + ID_REGISTRY_IMPORTREGISTRYFILE "V register uvozi datoteko z besedilom" + ID_REGISTRY_EXPORTREGISTRYFILE + "Registrsko datoteko ali njen del izvozi v besedilno datoteko" + ID_REGISTRY_CONNECTNETWORKREGISTRY + "Vzpostavi povezavo z registrom oddaljenega ra鑥nalnika" + ID_REGISTRY_DISCONNECTNETWORKREGISTRY + "Prekine povezavo z registrom oddaljenega ra鑥nalnika" + ID_REGISTRY_PRINT "Natisne registrsko datoteko ali njen del" +/* ID_HELP_HELPTOPICS "Odpre pomoC" */ + ID_HELP_ABOUT "Informacije o programu, 歵evilki razli鑙ce in avtorskih pravicah" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_REGISTRY_EXIT "Kon鑑 program" + ID_FAVOURITES_ADDTOFAVOURITES "Doda klju med Priljubljene" + ID_FAVOURITES_REMOVEFAVOURITE "Odstrani klju iz Priljubljenih" + ID_VIEW_STATUSBAR "Prika瀍 ali skrije vrstico stanja" + ID_VIEW_SPLIT "Spremeni polo瀉j med delilne 鑢te med podokni" + ID_VIEW_REFRESH "Osve瀒 okno" + ID_EDIT_DELETE "Izbri歟 izbor" + ID_EDIT_RENAME "Preimenuje izbor" + ID_EDIT_COPYKEYNAME "Prekopira ime izbranega klju鑑 v odlo瀒氳e" + ID_EDIT_FIND "I氳e niz v klju鑥, vrednosti ali podatkih" + ID_EDIT_FINDNEXT "I氳e naslednjo ponovitev iskanega besedila" +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 "V redu",IDOK,130,7,50,14 + PUSHBUTTON "Prekli鑙",IDCANCEL,130,24,50,14 +END + + +/* + * TEXTINCLUDE + */ + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + + + +/* + * String Table + */ + +/* + *STRINGTABLE DISCARDABLE + *BEGIN + * ID_HELP_HELPTOPICS "Odpre pomo." + * ID_HELP_ABOUT "Informacije o programu, 歵evilki razli鑙ce in avtorskih pravicah." + *END + */ + +/*****************************************************************/ diff --git a/reactos/subsys/system/regedit/rsrc.rc b/reactos/subsys/system/regedit/rsrc.rc index c9d32d70796..fc5f795a49f 100644 --- a/reactos/subsys/system/regedit/rsrc.rc +++ b/reactos/subsys/system/regedit/rsrc.rc @@ -28,4 +28,10 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL /* include localised resources */ #include "En.rc" +#include "Fr.rc" +#include "It.rc" +#include "Nl.rc" +#include "Pt.rc" +#include "Ru.rc" +#include "Si.rc" From f95308afa8f22e308dbbaf15f92087f8c08d62d8 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Tue, 1 Jun 2004 11:12:59 +0000 Subject: [PATCH 1299/1463] For some strange reason IniFileSectionListHead is not initialized correctly. Intialize it maually in order to prevent access violations. svn path=/trunk/; revision=9584 --- freeldr/freeldr/inifile/parse.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/freeldr/freeldr/inifile/parse.c b/freeldr/freeldr/inifile/parse.c index 329b197893e..b229d82277c 100644 --- a/freeldr/freeldr/inifile/parse.c +++ b/freeldr/freeldr/inifile/parse.c @@ -41,6 +41,10 @@ BOOL IniParseFile(PUCHAR IniFileData, U32 IniFileSize) DbgPrint((DPRINT_INIFILE, "IniParseFile() IniFileSize: %d\n", IniFileSize)); + IniFileSectionListHead = NULL; + IniFileSectionCount = 0; + IniFileSettingCount = 0; + // Start with an 80-byte buffer IniFileLineSize = 80; IniFileLine = MmAllocateMemory(IniFileLineSize); From 73888a7753f43d32b8e666719eafd772543f9e05 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Tue, 1 Jun 2004 19:06:50 +0000 Subject: [PATCH 1300/1463] add tgetopt to the list of static libs svn path=/trunk/; revision=9585 --- reactos/Makefile | 4 ++-- reactos/subsys/system/vmwinst/vmwinst.c | 19 +------------------ 2 files changed, 3 insertions(+), 20 deletions(-) diff --git a/reactos/Makefile b/reactos/Makefile index bd0d0a02faa..914505acbb3 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.223 2004/05/31 19:45:16 gdalsnes Exp $ +# $Id: Makefile,v 1.224 2004/06/01 19:06:50 sedwards 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 +LIB_STATIC = string rosrtl epsapi uuid libwine zlib rtl tgetopt # Keyboard layout libraries DLLS_KBD = kbdus kbdgr kbdfr kbduk diff --git a/reactos/subsys/system/vmwinst/vmwinst.c b/reactos/subsys/system/vmwinst/vmwinst.c index b87412a2740..8813b48f891 100644 --- a/reactos/subsys/system/vmwinst/vmwinst.c +++ b/reactos/subsys/system/vmwinst/vmwinst.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: vmwinst.c,v 1.3 2004/04/12 16:14:54 weiden Exp $ +/* $Id: vmwinst.c,v 1.4 2004/06/01 19:06:50 sedwards Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS VMware(r) driver installation utility @@ -56,24 +56,7 @@ LONG WINAPI ExceptionHandler(LPEXCEPTION_POINTERS ExceptionInfo) BOOL DetectVMware(int *Version) { - int magic, ver; - - magic = 0; - ver = 0; - - /* Try using a VMware I/O port. If not running in VMware this'll throw an - exception! */ - __asm__ __volatile__("inl %%dx, %%eax" - : "=a" (ver), "=b" (magic) - : "0" (0x564d5868), "d" (0x5658), "c" (0xa)); - - if(magic == 0x564d5868) - { - *Version = ver; return TRUE; - } - - return FALSE; } BOOL From 08ff887056f6948eeb929fb3c6dfe1e8eb604e7d Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Tue, 1 Jun 2004 19:08:53 +0000 Subject: [PATCH 1301/1463] revert to 1.3. I didnt mean to commit that svn path=/trunk/; revision=9586 --- reactos/subsys/system/vmwinst/vmwinst.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/system/vmwinst/vmwinst.c b/reactos/subsys/system/vmwinst/vmwinst.c index 8813b48f891..dcca5ddaf7d 100644 --- a/reactos/subsys/system/vmwinst/vmwinst.c +++ b/reactos/subsys/system/vmwinst/vmwinst.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: vmwinst.c,v 1.4 2004/06/01 19:06:50 sedwards Exp $ +/* $Id: vmwinst.c,v 1.5 2004/06/01 19:08:53 sedwards Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS VMware(r) driver installation utility @@ -56,7 +56,24 @@ LONG WINAPI ExceptionHandler(LPEXCEPTION_POINTERS ExceptionInfo) BOOL DetectVMware(int *Version) { + int magic, ver; + + magic = 0; + ver = 0; + + /* Try using a VMware I/O port. If not running in VMware this'll throw an + exception! */ + __asm__ __volatile__("inl %%dx, %%eax" + : "=a" (ver), "=b" (magic) + : "0" (0x564d5868), "d" (0x5658), "c" (0xa)); + + if(magic == 0x564d5868) + { + *Version = ver; return TRUE; + } + + return FALSE; } BOOL From 5053990958d4b9ea5d9ffd3b79b6570fcdb964f8 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III <royce3@ev1.net> Date: Wed, 2 Jun 2004 02:27:04 +0000 Subject: [PATCH 1302/1463] change to zoomin Makefile to get it compiling, and enable touch, genguid, zoomin, winemine, kill, tcat, and tlist - patch by Travis Snoozy <ai2097@yahoo.com> svn path=/trunk/; revision=9587 --- rosapps/Makefile | 10 +++++++-- rosapps/devutils/zoomin/makefile | 35 +++++++++++--------------------- 2 files changed, 20 insertions(+), 25 deletions(-) diff --git a/rosapps/Makefile b/rosapps/Makefile index 19f50de44d7..2ecba2dce08 100644 --- a/rosapps/Makefile +++ b/rosapps/Makefile @@ -11,14 +11,21 @@ include rules.mak APPS = calc \ cmdutils \ cmdutils$(SEP)mode \ + cmdutils$(SEP)touch \ + demos$(SEP)maze \ + devutils$(SEP)genguid \ + devutils$(SEP)zoomin \ dflat32 \ + games$(SEP)winemine \ hcalc \ mc \ notepad \ notevil \ sysutils \ - demos$(SEP)maze\ sysutils$(SEP)ctm \ + sysutils$(SEP)kill \ + sysutils$(SEP)tcat \ + sysutils$(SEP)tlist \ net$(SEP)ping \ net$(SEP)finger \ net$(SEP)telnet \ @@ -40,7 +47,6 @@ APPS = calc \ # # Removed because it doesn't build correctly # -# sysutils$(SEP)tlist \ # all: $(APPS) diff --git a/rosapps/devutils/zoomin/makefile b/rosapps/devutils/zoomin/makefile index df99d1bad78..0296f47fd57 100644 --- a/rosapps/devutils/zoomin/makefile +++ b/rosapps/devutils/zoomin/makefile @@ -1,3 +1,4 @@ +# $Id: makefile,v 1.2 2004/06/02 02:27:04 royce Exp $ # # ReactOS zoomin # @@ -19,35 +20,23 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # - -PATH_TO_TOP = ../.. -TARGET = zoomin +PATH_TO_TOP = ../../../reactos -OBJS = framewnd.o \ - main.o +TARGET_TYPE = program -LIBS = -lkernel32 -lgdi32 -luser32 +TARGET_APPTYPE = windows -all: $(TARGET).exe +TARGET_NAME = zoomin -$(TARGET).res: $(TARGET).rc +TARGET_CFLAGS = -D_WIN32_IE=0x0501 -D_WIN32_WINNT=0x0501 -D__USE_W32API -$(TARGET).exe: $(OBJS) $(TARGET).coff - $(CC) -Wl,--subsystem,windows -o $(TARGET).exe $(OBJS) $(TARGET).coff $(LIBS) - $(NM) --numeric-sort $(TARGET).exe > $(TARGET).sym +TARGET_SDKLIBS = kernel32.a gdi32.a user32.a - -main.h: resource.h - -main.o: main.c main.h framewnd.h - -framewnd.o: framewnd.c framewnd.h main.h - -clean: - - $(RM) $(OBJS) - - $(RM) $(TARGET).exe - - $(RM) $(TARGET).sym - - $(RM) $(TARGET).coff +TARGET_OBJECTS = framewnd.o main.o include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF From 3a1705b0b19f208c9a0115b445ce302217e5f5ab Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" <hackbunny@reactos.org> Date: Wed, 2 Jun 2004 18:24:09 +0000 Subject: [PATCH 1303/1463] Changed the build system to treat nasm as a first-class citizen, making it produce output in the correct format (Microsoft COFF) and cleaning up some bit rot (unused makefile variables, different conventions from the rest of the build system, etc.) svn path=/trunk/; revision=9588 --- reactos/loaders/dos/makefile | 4 ++-- reactos/ntoskrnl/Makefile | 4 ++-- reactos/rules.mak | 5 +++-- reactos/tools/depend.mk | 2 +- reactos/tools/helper.mk | 7 ++++--- 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/reactos/loaders/dos/makefile b/reactos/loaders/dos/makefile index 9b41fe8e656..be1f5452466 100644 --- a/reactos/loaders/dos/makefile +++ b/reactos/loaders/dos/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.9 2003/11/24 16:44:10 ekohl Exp $ +# $Id: makefile,v 1.10 2004/06/02 18:24:08 hyperion Exp $ PATH_TO_TOP = ../.. @@ -7,7 +7,7 @@ include $(PATH_TO_TOP)/rules.mak all: loadros.com loadros.com: loadros.asm - $(NASM_CMD) -fbin -o loadros.com loadros.asm + $(NASM) -fbin -o loadros.com loadros.asm clean: - $(RM) loadros.com diff --git a/reactos/ntoskrnl/Makefile b/reactos/ntoskrnl/Makefile index 26cab813555..518d20ff68e 100644 --- a/reactos/ntoskrnl/Makefile +++ b/reactos/ntoskrnl/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.121 2004/05/31 23:37:22 gdalsnes Exp $ +# $Id: Makefile,v 1.122 2004/06/02 18:24:09 hyperion Exp $ # # ReactOS Operating System # @@ -744,7 +744,7 @@ ke/main.o: ke/main.c $(PATH_TO_TOP)/include/reactos/buildno.h %.o: %.s $(AS) $(ASFLAGS) -c $< -o $@ %.o: %.asm - $(NASM_CMD) $(NFLAGS) $< -o $@ + $(NASM) $(NFLAGS) $< -o $@ %.coff: %.rc $(RC) $(RCFLAGS) $< -o $@ diff --git a/reactos/rules.mak b/reactos/rules.mak index f8e6dedb250..d9489cebf77 100644 --- a/reactos/rules.mak +++ b/reactos/rules.mak @@ -28,7 +28,7 @@ PREFIX = mingw32- EXE_POSTFIX := EXE_PREFIX := ./ DLLTOOL = $(PREFIX)dlltool --as=$(PREFIX)as -NASM_CMD = nasm +NASM = nasm DOSCLI = FLOPPY_DIR = /mnt/floppy SEP := / @@ -41,7 +41,7 @@ PREFIX = EXE_PREFIX := EXE_POSTFIX := .exe DLLTOOL = $(PREFIX)dlltool --as=$(PREFIX)as -NASM_CMD = nasmw +NASM = nasmw DOSCLI = yes FLOPPY_DIR = A: SEP := \$(EMPTY_VAR) @@ -103,6 +103,7 @@ STD_CFLAGS = -I$(PATH_TO_TOP)/include -I$(W32API_PATH)/include -pipe -march=i386 STD_CPPFLAGS = $(STD_CFLAGS) STD_ASFLAGS = -I$(PATH_TO_TOP)/include -I$(W32API_PATH)/include -D__ASM__ -D_M_IX86 STD_RCFLAGS = --include-dir $(PATH_TO_TOP)/include --include-dir $(W32API_PATH)/include +STD_NFLAGS = -f win32 # Developer Kits DK_PATH=$(PATH_TO_TOP)/dk diff --git a/reactos/tools/depend.mk b/reactos/tools/depend.mk index bb39f948d65..8f4af5d1ffc 100644 --- a/reactos/tools/depend.mk +++ b/reactos/tools/depend.mk @@ -35,4 +35,4 @@ endif $(CC) $(CFLAGS) -M $< | $(DEPENDS_PATH)$(SEP)depends$(EXE_POSTFIX) $(@D) $@ .%.d: %.asm $(PATH_TO_TOP)/tools/depends$(EXE_POSTFIX) $(GENERATED_HEADER_FILES) - $(NASM_CMD) $< | $(DEPENDS_PATH)$(SEP)depends$(EXE_POSTFIX) $(@D) $@ + $(NASM) $(NFLAGS) -M $< | $(DEPENDS_PATH)$(SEP)depends$(EXE_POSTFIX) $(@D) $@ diff --git a/reactos/tools/helper.mk b/reactos/tools/helper.mk index 0f4f56eaf10..63ddc653dda 100644 --- a/reactos/tools/helper.mk +++ b/reactos/tools/helper.mk @@ -1,4 +1,4 @@ -# $Id: helper.mk,v 1.64 2004/05/29 21:24:48 hbirr Exp $ +# $Id: helper.mk,v 1.65 2004/06/02 18:24:09 hyperion Exp $ # # Helper makefile for ReactOS modules # Variables this makefile accepts: @@ -619,7 +619,7 @@ TARGET_RCFLAGS += $(MK_RCFLAGS) $(STD_RCFLAGS) TARGET_ASFLAGS += $(MK_ASFLAGS) $(STD_ASFLAGS) -TARGET_NFLAGS += $(MK_NFLAGS) +TARGET_NFLAGS += $(MK_NFLAGS) $(STD_NFLAGS) MK_GCCLIBS := $(addprefix -l, $(TARGET_GCCLIBS)) @@ -1057,7 +1057,7 @@ endif # ROS_USE_PCH %.o: %.s $(AS) $(TARGET_ASFLAGS) -c $< -o $@ %.o: %.asm - $(NASM_CMD) $(NFLAGS) $(TARGET_NFLAGS) $< -o $@ + $(NASM) $(TARGET_NFLAGS) $< -o $@ %.coff: %.rc $(RC) $(TARGET_RCFLAGS) $< -o $@ %.spec.def: %.spec @@ -1071,5 +1071,6 @@ endif # ROS_USE_PCH # Compatibility CFLAGS := $(TARGET_CFLAGS) +NFLAGS := $(TARGET_NFLAGS) # EOF From 08108f008e4ec12993127384ddf3b147008b4dbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Wed, 2 Jun 2004 18:26:58 +0000 Subject: [PATCH 1304/1463] Patch by Pablo Borobia <pablog7@argentina.com> Correct search path for DLL loading (including directory from which .exe was loaded). svn path=/trunk/; revision=9589 --- reactos/lib/kernel32/file/dir.c | 904 ++++++++++++----------- reactos/lib/ntdll/ldr/utils.c | 1210 ++++++++++++++++--------------- 2 files changed, 1077 insertions(+), 1037 deletions(-) diff --git a/reactos/lib/kernel32/file/dir.c b/reactos/lib/kernel32/file/dir.c index f8411ee5857..36b63751ad4 100644 --- a/reactos/lib/kernel32/file/dir.c +++ b/reactos/lib/kernel32/file/dir.c @@ -1,4 +1,4 @@ -/* $Id: dir.c,v 1.44 2004/01/23 21:16:03 ekohl Exp $ +/* $Id: dir.c,v 1.45 2004/06/02 18:26:57 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -29,13 +29,13 @@ BOOL STDCALL CreateDirectoryA ( - LPCSTR lpPathName, - LPSECURITY_ATTRIBUTES lpSecurityAttributes - ) + LPCSTR lpPathName, + LPSECURITY_ATTRIBUTES lpSecurityAttributes + ) { - return CreateDirectoryExA (NULL, - lpPathName, - lpSecurityAttributes); + return CreateDirectoryExA (NULL, + lpPathName, + lpSecurityAttributes); } @@ -45,69 +45,69 @@ CreateDirectoryA ( BOOL STDCALL CreateDirectoryExA ( - LPCSTR lpTemplateDirectory, - LPCSTR lpNewDirectory, - LPSECURITY_ATTRIBUTES lpSecurityAttributes) + LPCSTR lpTemplateDirectory, + LPCSTR lpNewDirectory, + LPSECURITY_ATTRIBUTES lpSecurityAttributes) { - UNICODE_STRING TmplDirU; - UNICODE_STRING NewDirU; - ANSI_STRING TmplDir; - ANSI_STRING NewDir; - BOOL Result; + UNICODE_STRING TmplDirU; + UNICODE_STRING NewDirU; + ANSI_STRING TmplDir; + ANSI_STRING NewDir; + BOOL Result; - RtlInitUnicodeString (&TmplDirU, - NULL); + RtlInitUnicodeString (&TmplDirU, + NULL); - RtlInitUnicodeString (&NewDirU, - NULL); + RtlInitUnicodeString (&NewDirU, + NULL); - if (lpTemplateDirectory != NULL) - { - RtlInitAnsiString (&TmplDir, - (LPSTR)lpTemplateDirectory); + if (lpTemplateDirectory != NULL) + { + RtlInitAnsiString (&TmplDir, + (LPSTR)lpTemplateDirectory); - /* convert ansi (or oem) string to unicode */ - if (bIsFileApiAnsi) - RtlAnsiStringToUnicodeString (&TmplDirU, - &TmplDir, - TRUE); - else - RtlOemStringToUnicodeString (&TmplDirU, - &TmplDir, - TRUE); - } + /* convert ansi (or oem) string to unicode */ + if (bIsFileApiAnsi) + RtlAnsiStringToUnicodeString (&TmplDirU, + &TmplDir, + TRUE); + else + RtlOemStringToUnicodeString (&TmplDirU, + &TmplDir, + TRUE); + } - if (lpNewDirectory != NULL) - { - RtlInitAnsiString (&NewDir, - (LPSTR)lpNewDirectory); + if (lpNewDirectory != NULL) + { + RtlInitAnsiString (&NewDir, + (LPSTR)lpNewDirectory); - /* convert ansi (or oem) string to unicode */ - if (bIsFileApiAnsi) - RtlAnsiStringToUnicodeString (&NewDirU, - &NewDir, - TRUE); - else - RtlOemStringToUnicodeString (&NewDirU, - &NewDir, - TRUE); - } + /* convert ansi (or oem) string to unicode */ + if (bIsFileApiAnsi) + RtlAnsiStringToUnicodeString (&NewDirU, + &NewDir, + TRUE); + else + RtlOemStringToUnicodeString (&NewDirU, + &NewDir, + TRUE); + } - Result = CreateDirectoryExW (TmplDirU.Buffer, - NewDirU.Buffer, - lpSecurityAttributes); + Result = CreateDirectoryExW (TmplDirU.Buffer, + NewDirU.Buffer, + lpSecurityAttributes); - if (lpTemplateDirectory != NULL) - RtlFreeHeap (RtlGetProcessHeap (), - 0, - TmplDirU.Buffer); + if (lpTemplateDirectory != NULL) + RtlFreeHeap (RtlGetProcessHeap (), + 0, + TmplDirU.Buffer); - if (lpNewDirectory != NULL) - RtlFreeHeap (RtlGetProcessHeap (), - 0, - NewDirU.Buffer); + if (lpNewDirectory != NULL) + RtlFreeHeap (RtlGetProcessHeap (), + 0, + NewDirU.Buffer); - return Result; + return Result; } @@ -117,13 +117,13 @@ CreateDirectoryExA ( BOOL STDCALL CreateDirectoryW ( - LPCWSTR lpPathName, - LPSECURITY_ATTRIBUTES lpSecurityAttributes - ) + LPCWSTR lpPathName, + LPSECURITY_ATTRIBUTES lpSecurityAttributes + ) { - return CreateDirectoryExW (NULL, - lpPathName, - lpSecurityAttributes); + return CreateDirectoryExW (NULL, + lpPathName, + lpSecurityAttributes); } @@ -133,20 +133,20 @@ CreateDirectoryW ( BOOL STDCALL CreateDirectoryExW ( - LPCWSTR lpTemplateDirectory, - LPCWSTR lpNewDirectory, - LPSECURITY_ATTRIBUTES lpSecurityAttributes - ) + LPCWSTR lpTemplateDirectory, + LPCWSTR lpNewDirectory, + LPSECURITY_ATTRIBUTES lpSecurityAttributes + ) { - OBJECT_ATTRIBUTES ObjectAttributes; - IO_STATUS_BLOCK IoStatusBlock; - UNICODE_STRING NtPathU; - HANDLE DirectoryHandle; - NTSTATUS Status; + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK IoStatusBlock; + UNICODE_STRING NtPathU; + HANDLE DirectoryHandle; + NTSTATUS Status; + + DPRINT ("lpTemplateDirectory %S lpNewDirectory %S lpSecurityAttributes %p\n", + lpTemplateDirectory, lpNewDirectory, lpSecurityAttributes); - DPRINT ("lpTemplateDirectory %S lpNewDirectory %S lpSecurityAttributes %p\n", - lpTemplateDirectory, lpNewDirectory, lpSecurityAttributes); - // Can't create empty directory if(lpNewDirectory == NULL || *lpNewDirectory == 0) { @@ -154,54 +154,54 @@ CreateDirectoryExW ( return FALSE; } - if (lpTemplateDirectory != NULL && *lpTemplateDirectory != 0) - { - // get object attributes from template directory - DPRINT("KERNEL32:FIXME:%s:%d\n",__FILE__,__LINE__); - return FALSE; - } + if (lpTemplateDirectory != NULL && *lpTemplateDirectory != 0) + { + // get object attributes from template directory + DPRINT("KERNEL32:FIXME:%s:%d\n",__FILE__,__LINE__); + return FALSE; + } - if (!RtlDosPathNameToNtPathName_U ((LPWSTR)lpNewDirectory, - &NtPathU, - NULL, - NULL)) - return FALSE; + if (!RtlDosPathNameToNtPathName_U ((LPWSTR)lpNewDirectory, + &NtPathU, + NULL, + NULL)) + return FALSE; - DPRINT ("NtPathU \'%wZ\'\n", &NtPathU); + DPRINT ("NtPathU \'%wZ\'\n", &NtPathU); - ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES); - ObjectAttributes.RootDirectory = NULL; - ObjectAttributes.ObjectName = &NtPathU; - ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE | OBJ_INHERIT; - ObjectAttributes.SecurityDescriptor = NULL; - ObjectAttributes.SecurityQualityOfService = NULL; + ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES); + ObjectAttributes.RootDirectory = NULL; + ObjectAttributes.ObjectName = &NtPathU; + ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE | OBJ_INHERIT; + ObjectAttributes.SecurityDescriptor = NULL; + ObjectAttributes.SecurityQualityOfService = NULL; - Status = NtCreateFile (&DirectoryHandle, - DIRECTORY_ALL_ACCESS, - &ObjectAttributes, - &IoStatusBlock, - NULL, - FILE_ATTRIBUTE_DIRECTORY, - 0, - FILE_CREATE, - FILE_DIRECTORY_FILE, - NULL, - 0); - DPRINT("Status: %lx\n", Status); + Status = NtCreateFile (&DirectoryHandle, + DIRECTORY_ALL_ACCESS, + &ObjectAttributes, + &IoStatusBlock, + NULL, + FILE_ATTRIBUTE_DIRECTORY, + 0, + FILE_CREATE, + FILE_DIRECTORY_FILE, + NULL, + 0); + DPRINT("Status: %lx\n", Status); - RtlFreeHeap (RtlGetProcessHeap (), - 0, - NtPathU.Buffer); + RtlFreeHeap (RtlGetProcessHeap (), + 0, + NtPathU.Buffer); - if (!NT_SUCCESS(Status)) - { - SetLastErrorByStatus(Status); - return FALSE; - } + if (!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return FALSE; + } - NtClose (DirectoryHandle); + NtClose (DirectoryHandle); - return TRUE; + return TRUE; } @@ -211,33 +211,33 @@ CreateDirectoryExW ( BOOL STDCALL RemoveDirectoryA ( - LPCSTR lpPathName - ) + LPCSTR lpPathName + ) { - UNICODE_STRING PathNameU; - ANSI_STRING PathName; - BOOL Result; + UNICODE_STRING PathNameU; + ANSI_STRING PathName; + BOOL Result; - RtlInitAnsiString (&PathName, - (LPSTR)lpPathName); + RtlInitAnsiString (&PathName, + (LPSTR)lpPathName); - /* convert ansi (or oem) string to unicode */ - if (bIsFileApiAnsi) - RtlAnsiStringToUnicodeString (&PathNameU, - &PathName, - TRUE); - else - RtlOemStringToUnicodeString (&PathNameU, - &PathName, - TRUE); + /* convert ansi (or oem) string to unicode */ + if (bIsFileApiAnsi) + RtlAnsiStringToUnicodeString (&PathNameU, + &PathName, + TRUE); + else + RtlOemStringToUnicodeString (&PathNameU, + &PathName, + TRUE); - Result = RemoveDirectoryW (PathNameU.Buffer); + Result = RemoveDirectoryW (PathNameU.Buffer); - RtlFreeHeap (RtlGetProcessHeap (), - 0, - PathNameU.Buffer); + RtlFreeHeap (RtlGetProcessHeap (), + 0, + PathNameU.Buffer); - return Result; + return Result; } @@ -247,80 +247,80 @@ RemoveDirectoryA ( BOOL STDCALL RemoveDirectoryW ( - LPCWSTR lpPathName - ) + LPCWSTR lpPathName + ) { - FILE_DISPOSITION_INFORMATION FileDispInfo; - OBJECT_ATTRIBUTES ObjectAttributes; - IO_STATUS_BLOCK IoStatusBlock; - UNICODE_STRING NtPathU; - HANDLE DirectoryHandle; - NTSTATUS Status; + FILE_DISPOSITION_INFORMATION FileDispInfo; + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK IoStatusBlock; + UNICODE_STRING NtPathU; + HANDLE DirectoryHandle; + NTSTATUS Status; - DPRINT("lpPathName %S\n", lpPathName); + DPRINT("lpPathName %S\n", lpPathName); - if (!RtlDosPathNameToNtPathName_U ((LPWSTR)lpPathName, - &NtPathU, - NULL, - NULL)) - return FALSE; + if (!RtlDosPathNameToNtPathName_U ((LPWSTR)lpPathName, + &NtPathU, + NULL, + NULL)) + return FALSE; - ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES); - ObjectAttributes.RootDirectory = NULL; - ObjectAttributes.ObjectName = &NtPathU; - ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE| OBJ_INHERIT; - ObjectAttributes.SecurityDescriptor = NULL; - ObjectAttributes.SecurityQualityOfService = NULL; + ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES); + ObjectAttributes.RootDirectory = NULL; + ObjectAttributes.ObjectName = &NtPathU; + ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE| OBJ_INHERIT; + ObjectAttributes.SecurityDescriptor = NULL; + ObjectAttributes.SecurityQualityOfService = NULL; - DPRINT("NtPathU '%S'\n", NtPathU.Buffer); + DPRINT("NtPathU '%S'\n", NtPathU.Buffer); - Status = NtCreateFile (&DirectoryHandle, - FILE_WRITE_ATTRIBUTES, /* 0x110080 */ - &ObjectAttributes, - &IoStatusBlock, - NULL, - FILE_ATTRIBUTE_DIRECTORY, /* 0x7 */ - 0, - FILE_OPEN, - FILE_DIRECTORY_FILE, /* 0x204021 */ - NULL, - 0); + Status = NtCreateFile (&DirectoryHandle, + FILE_WRITE_ATTRIBUTES, /* 0x110080 */ + &ObjectAttributes, + &IoStatusBlock, + NULL, + FILE_ATTRIBUTE_DIRECTORY, /* 0x7 */ + 0, + FILE_OPEN, + FILE_DIRECTORY_FILE, /* 0x204021 */ + NULL, + 0); - RtlFreeHeap (RtlGetProcessHeap (), - 0, - NtPathU.Buffer); + RtlFreeHeap (RtlGetProcessHeap (), + 0, + NtPathU.Buffer); - if (!NT_SUCCESS(Status)) - { - CHECKPOINT; - SetLastErrorByStatus (Status); - return FALSE; - } + if (!NT_SUCCESS(Status)) + { + CHECKPOINT; + SetLastErrorByStatus (Status); + return FALSE; + } - FileDispInfo.DoDeleteFile = TRUE; + FileDispInfo.DoDeleteFile = TRUE; - Status = NtSetInformationFile (DirectoryHandle, - &IoStatusBlock, - &FileDispInfo, - sizeof(FILE_DISPOSITION_INFORMATION), - FileDispositionInformation); - if (!NT_SUCCESS(Status)) - { - CHECKPOINT; - NtClose(DirectoryHandle); - SetLastErrorByStatus (Status); - return FALSE; - } + Status = NtSetInformationFile (DirectoryHandle, + &IoStatusBlock, + &FileDispInfo, + sizeof(FILE_DISPOSITION_INFORMATION), + FileDispositionInformation); + if (!NT_SUCCESS(Status)) + { + CHECKPOINT; + NtClose(DirectoryHandle); + SetLastErrorByStatus (Status); + return FALSE; + } - Status = NtClose (DirectoryHandle); - if (!NT_SUCCESS(Status)) - { - CHECKPOINT; - SetLastErrorByStatus (Status); - return FALSE; - } + Status = NtClose (DirectoryHandle); + if (!NT_SUCCESS(Status)) + { + CHECKPOINT; + SetLastErrorByStatus (Status); + return FALSE; + } - return TRUE; + return TRUE; } @@ -330,76 +330,76 @@ RemoveDirectoryW ( DWORD STDCALL GetFullPathNameA ( - LPCSTR lpFileName, - DWORD nBufferLength, - LPSTR lpBuffer, - LPSTR *lpFilePart - ) + LPCSTR lpFileName, + DWORD nBufferLength, + LPSTR lpBuffer, + LPSTR *lpFilePart + ) { - UNICODE_STRING nameW; - WCHAR bufferW[MAX_PATH]; - DWORD ret, retW; - LPWSTR FilePart = NULL; + UNICODE_STRING nameW; + WCHAR bufferW[MAX_PATH]; + DWORD ret, retW; + LPWSTR FilePart = NULL; - DPRINT("GetFullPathNameA(lpFileName %s, nBufferLength %d, lpBuffer %p, " - "lpFilePart %p)\n",lpFileName,nBufferLength,lpBuffer,lpFilePart); + DPRINT("GetFullPathNameA(lpFileName %s, nBufferLength %d, lpBuffer %p, " + "lpFilePart %p)\n",lpFileName,nBufferLength,lpBuffer,lpFilePart); - if (!lpFileName) - { - SetLastError(ERROR_INVALID_PARAMETER); - return 0; - } + if (!lpFileName) + { + SetLastError(ERROR_INVALID_PARAMETER); + return 0; + } - if (!RtlCreateUnicodeStringFromAsciiz(&nameW, (LPSTR)lpFileName)) - { - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return 0; - } + if (!RtlCreateUnicodeStringFromAsciiz(&nameW, (LPSTR)lpFileName)) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return 0; + } - if (lpFilePart) - { - *lpFilePart = NULL; - } + if (lpFilePart) + { + *lpFilePart = NULL; + } - retW = GetFullPathNameW(nameW.Buffer, MAX_PATH, bufferW, &FilePart); + retW = GetFullPathNameW(nameW.Buffer, MAX_PATH, bufferW, &FilePart); - if (!retW) - { - ret = 0; - } - else if (retW > MAX_PATH) - { - SetLastError(ERROR_FILENAME_EXCED_RANGE); - ret = 0; - } - else - { - ANSI_STRING AnsiBuffer; - UNICODE_STRING UnicodeBuffer; + if (!retW) + { + ret = 0; + } + else if (retW > MAX_PATH) + { + SetLastError(ERROR_FILENAME_EXCED_RANGE); + ret = 0; + } + else + { + ANSI_STRING AnsiBuffer; + UNICODE_STRING UnicodeBuffer; - UnicodeBuffer.Length = wcslen(bufferW) * sizeof(WCHAR); - ret = nameW.Length; - if (nameW.Length <= nBufferLength) - { - UnicodeBuffer.Buffer = bufferW; - AnsiBuffer.MaximumLength = nBufferLength; - AnsiBuffer.Length = 0; - AnsiBuffer.Buffer = lpBuffer; - RtlUnicodeStringToAnsiString(&AnsiBuffer, &UnicodeBuffer, FALSE); + UnicodeBuffer.Length = wcslen(bufferW) * sizeof(WCHAR); + ret = nameW.Length; + if (nameW.Length <= nBufferLength) + { + UnicodeBuffer.Buffer = bufferW; + AnsiBuffer.MaximumLength = nBufferLength; + AnsiBuffer.Length = 0; + AnsiBuffer.Buffer = lpBuffer; + RtlUnicodeStringToAnsiString(&AnsiBuffer, &UnicodeBuffer, FALSE); - if (lpFilePart && FilePart != NULL) - { - *lpFilePart = (FilePart - bufferW) + lpBuffer; - } - } - } + if (lpFilePart && FilePart != NULL) + { + *lpFilePart = (FilePart - bufferW) + lpBuffer; + } + } + } - RtlFreeUnicodeString(&nameW); + RtlFreeUnicodeString(&nameW); - DPRINT("lpBuffer %s lpFilePart %s Length %ld\n", - lpBuffer, (lpFilePart == NULL) ? "NULL" : *lpFilePart, nameW.Length); + DPRINT("lpBuffer %s lpFilePart %s Length %ld\n", + lpBuffer, (lpFilePart == NULL) ? "NULL" : *lpFilePart, nameW.Length); - return ret; + return ret; } @@ -409,26 +409,26 @@ GetFullPathNameA ( DWORD STDCALL GetFullPathNameW ( - LPCWSTR lpFileName, - DWORD nBufferLength, - LPWSTR lpBuffer, - LPWSTR *lpFilePart - ) + LPCWSTR lpFileName, + DWORD nBufferLength, + LPWSTR lpBuffer, + LPWSTR *lpFilePart + ) { - ULONG Length; + ULONG Length; - DPRINT("GetFullPathNameW(lpFileName %S, nBufferLength %d, lpBuffer %p, " - "lpFilePart %p)\n",lpFileName,nBufferLength,lpBuffer,lpFilePart); + DPRINT("GetFullPathNameW(lpFileName %S, nBufferLength %d, lpBuffer %p, " + "lpFilePart %p)\n",lpFileName,nBufferLength,lpBuffer,lpFilePart); - Length = RtlGetFullPathName_U ((LPWSTR)lpFileName, - nBufferLength * sizeof(WCHAR), - lpBuffer, - lpFilePart); + Length = RtlGetFullPathName_U ((LPWSTR)lpFileName, + nBufferLength * sizeof(WCHAR), + lpBuffer, + lpFilePart); - DPRINT("lpBuffer %S lpFilePart %S Length %ld\n", - lpBuffer, (lpFilePart == NULL) ? L"NULL" : *lpFilePart, Length / sizeof(WCHAR)); + DPRINT("lpBuffer %S lpFilePart %S Length %ld\n", + lpBuffer, (lpFilePart == NULL) ? L"NULL" : *lpFilePart, Length / sizeof(WCHAR)); - return (Length / sizeof(WCHAR)); + return (Length / sizeof(WCHAR)); } @@ -438,23 +438,23 @@ GetFullPathNameW ( DWORD STDCALL GetShortPathNameA ( - LPCSTR lpszLongPath, - LPSTR lpszShortPath, - DWORD cchBuffer - ) + LPCSTR lpszLongPath, + LPSTR lpszShortPath, + DWORD cchBuffer + ) { - //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 + //1 remove unicode chars and spaces + //2 remove preceding and trailing periods. + //3 remove embedded periods except the last one - return 0; + //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 + + return 0; } @@ -464,12 +464,12 @@ GetShortPathNameA ( DWORD STDCALL GetShortPathNameW ( - LPCWSTR lpszLongPath, - LPWSTR lpszShortPath, - DWORD cchBuffer - ) + LPCWSTR lpszLongPath, + LPWSTR lpszShortPath, + DWORD cchBuffer + ) { - return 0; + return 0; } @@ -479,111 +479,111 @@ GetShortPathNameW ( DWORD STDCALL SearchPathA ( - LPCSTR lpPath, - LPCSTR lpFileName, - LPCSTR lpExtension, - DWORD nBufferLength, - LPSTR lpBuffer, - LPSTR *lpFilePart - ) + LPCSTR lpPath, + LPCSTR lpFileName, + LPCSTR lpExtension, + DWORD nBufferLength, + LPSTR lpBuffer, + LPSTR *lpFilePart + ) { - UNICODE_STRING PathU; - UNICODE_STRING FileNameU; - UNICODE_STRING ExtensionU; - UNICODE_STRING BufferU; - ANSI_STRING Path; - ANSI_STRING FileName; - ANSI_STRING Extension; - ANSI_STRING Buffer; - PWCHAR FilePartW; - DWORD RetValue; + UNICODE_STRING PathU; + UNICODE_STRING FileNameU; + UNICODE_STRING ExtensionU; + UNICODE_STRING BufferU; + ANSI_STRING Path; + ANSI_STRING FileName; + ANSI_STRING Extension; + ANSI_STRING Buffer; + PWCHAR FilePartW; + DWORD RetValue; - RtlInitAnsiString (&Path, - (LPSTR)lpPath); - RtlInitAnsiString (&FileName, - (LPSTR)lpFileName); - RtlInitAnsiString (&Extension, - (LPSTR)lpExtension); + RtlInitAnsiString (&Path, + (LPSTR)lpPath); + RtlInitAnsiString (&FileName, + (LPSTR)lpFileName); + RtlInitAnsiString (&Extension, + (LPSTR)lpExtension); - /* convert ansi (or oem) strings to unicode */ - if (bIsFileApiAnsi) - { - RtlAnsiStringToUnicodeString (&PathU, - &Path, - TRUE); - RtlAnsiStringToUnicodeString (&FileNameU, - &FileName, - TRUE); - RtlAnsiStringToUnicodeString (&ExtensionU, - &Extension, - TRUE); - } - else - { - RtlOemStringToUnicodeString (&PathU, - &Path, - TRUE); - RtlOemStringToUnicodeString (&FileNameU, - &FileName, - TRUE); - RtlOemStringToUnicodeString (&ExtensionU, - &Extension, - TRUE); - } + /* convert ansi (or oem) strings to unicode */ + if (bIsFileApiAnsi) + { + RtlAnsiStringToUnicodeString (&PathU, + &Path, + TRUE); + RtlAnsiStringToUnicodeString (&FileNameU, + &FileName, + TRUE); + RtlAnsiStringToUnicodeString (&ExtensionU, + &Extension, + TRUE); + } + else + { + RtlOemStringToUnicodeString (&PathU, + &Path, + TRUE); + RtlOemStringToUnicodeString (&FileNameU, + &FileName, + TRUE); + RtlOemStringToUnicodeString (&ExtensionU, + &Extension, + TRUE); + } - BufferU.Length = 0; - BufferU.MaximumLength = nBufferLength * sizeof(WCHAR); - BufferU.Buffer = RtlAllocateHeap (RtlGetProcessHeap (), - 0, - BufferU.MaximumLength); + BufferU.Length = 0; + BufferU.MaximumLength = nBufferLength * sizeof(WCHAR); + BufferU.Buffer = RtlAllocateHeap (RtlGetProcessHeap (), + 0, + BufferU.MaximumLength); - Buffer.Length = 0; - Buffer.MaximumLength = nBufferLength; - Buffer.Buffer = lpBuffer; + Buffer.Length = 0; + Buffer.MaximumLength = nBufferLength; + Buffer.Buffer = lpBuffer; - RetValue = SearchPathW (NULL == lpPath ? NULL : PathU.Buffer, - NULL == lpFileName ? NULL : FileNameU.Buffer, - NULL == lpExtension ? NULL : ExtensionU.Buffer, - nBufferLength, - BufferU.Buffer, - &FilePartW); + RetValue = SearchPathW (NULL == lpPath ? NULL : PathU.Buffer, + NULL == lpFileName ? NULL : FileNameU.Buffer, + NULL == lpExtension ? NULL : ExtensionU.Buffer, + nBufferLength, + BufferU.Buffer, + &FilePartW); - RtlFreeHeap (RtlGetProcessHeap (), - 0, - PathU.Buffer); - RtlFreeHeap (RtlGetProcessHeap (), - 0, - FileNameU.Buffer); - RtlFreeHeap (RtlGetProcessHeap (), - 0, - ExtensionU.Buffer); + RtlFreeHeap (RtlGetProcessHeap (), + 0, + PathU.Buffer); + RtlFreeHeap (RtlGetProcessHeap (), + 0, + FileNameU.Buffer); + RtlFreeHeap (RtlGetProcessHeap (), + 0, + ExtensionU.Buffer); - if (0 != RetValue) - { - BufferU.Length = wcslen(BufferU.Buffer) * sizeof(WCHAR); - /* convert ansi (or oem) string to unicode */ - if (bIsFileApiAnsi) - RtlUnicodeStringToAnsiString (&Buffer, - &BufferU, - FALSE); - else - RtlUnicodeStringToOemString (&Buffer, - &BufferU, - FALSE); - /* nul-terminate ascii string */ - Buffer.Buffer[BufferU.Length / sizeof(WCHAR)] = '\0'; - } + if (0 != RetValue) + { + BufferU.Length = wcslen(BufferU.Buffer) * sizeof(WCHAR); + /* convert ansi (or oem) string to unicode */ + if (bIsFileApiAnsi) + RtlUnicodeStringToAnsiString (&Buffer, + &BufferU, + FALSE); + else + RtlUnicodeStringToOemString (&Buffer, + &BufferU, + FALSE); + /* nul-terminate ascii string */ + Buffer.Buffer[BufferU.Length / sizeof(WCHAR)] = '\0'; + } - RtlFreeHeap (RtlGetProcessHeap (), - 0, - BufferU.Buffer); + RtlFreeHeap (RtlGetProcessHeap (), + 0, + BufferU.Buffer); - if (NULL != lpFilePart) - { - *lpFilePart = strrchr (lpBuffer, '\\') + 1; - } + if (NULL != lpFilePart) + { + *lpFilePart = strrchr (lpBuffer, '\\') + 1; + } - return RetValue; + return RetValue; } @@ -593,13 +593,13 @@ SearchPathA ( DWORD STDCALL SearchPathW ( - LPCWSTR lpPath, - LPCWSTR lpFileName, - LPCWSTR lpExtension, - DWORD nBufferLength, - LPWSTR lpBuffer, - LPWSTR *lpFilePart - ) + LPCWSTR lpPath, + LPCWSTR lpFileName, + LPCWSTR lpExtension, + DWORD nBufferLength, + LPWSTR lpBuffer, + LPWSTR *lpFilePart + ) /* * FUNCTION: Searches for the specified file * ARGUMENTS: @@ -620,7 +620,7 @@ SearchPathW ( * filename extension must be a period (.). The * extension is only added if the specified filename * doesn't end with an extension - * + * * If the filename extension is not required or if the * filename contains an extension, this parameters can be * NULL @@ -628,60 +628,88 @@ SearchPathW ( * lpBuffer = Points to the buffer for the valid path and filename of * file found * lpFilePart = Points to the last component of the valid path and - * filename + * filename * RETURNS: On success, the length, in characters, of the string copied to the * buffer * On failure, zero. */ { - DWORD retCode = 0; - ULONG pos, len; - PWCHAR EnvironmentBufferW = NULL; - WCHAR Buffer; + DWORD retCode = 0; + ULONG pos, len; + PWCHAR EnvironmentBufferW = NULL; + PWCHAR AppPathW = NULL; + WCHAR Buffer; + //WCHAR drv[3]; - DPRINT("SearchPath\n"); - if (lpPath == NULL) - { - len = GetEnvironmentVariableW(L"PATH", &Buffer, 0); - len += 1 + GetCurrentDirectoryW(0, &Buffer); - len += 1 + GetSystemDirectoryW(&Buffer, 0); - len += 1 + GetWindowsDirectoryW(&Buffer, 0); + DPRINT("SearchPath\n"); - EnvironmentBufferW = (PWCHAR) RtlAllocateHeap(GetProcessHeap(), - HEAP_GENERATE_EXCEPTIONS|HEAP_ZERO_MEMORY, - len * sizeof(WCHAR)); - if (EnvironmentBufferW == NULL) - { - SetLastError(ERROR_OUTOFMEMORY); - return 0; - } + if (lpPath == NULL) + { - 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); - lpPath = EnvironmentBufferW; - } + AppPathW = (PWCHAR) RtlAllocateHeap(GetProcessHeap(), + HEAP_GENERATE_EXCEPTIONS|HEAP_ZERO_MEMORY, + MAX_PATH * sizeof(WCHAR)); - 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); - } - return retCode / 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; + + } + + 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); + } + return retCode / sizeof(WCHAR); } /* EOF */ diff --git a/reactos/lib/ntdll/ldr/utils.c b/reactos/lib/ntdll/ldr/utils.c index 02e2365f377..1ef60632967 100644 --- a/reactos/lib/ntdll/ldr/utils.c +++ b/reactos/lib/ntdll/ldr/utils.c @@ -1,4 +1,4 @@ -/* $Id: utils.c,v 1.86 2004/05/13 20:30:26 navaraf Exp $ +/* $Id: utils.c,v 1.87 2004/06/02 18:26:58 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -59,10 +59,10 @@ extern PLDR_MODULE ExeModule; static NTSTATUS LdrFindEntryForName(PUNICODE_STRING Name, PLDR_MODULE *Module, BOOL Ref); static PVOID LdrFixupForward(PCHAR ForwardName); static PVOID LdrGetExportByName(PVOID BaseAddress, PUCHAR SymbolName, USHORT Hint); -static NTSTATUS LdrpLoadModule(IN PWSTR SearchPath OPTIONAL, - IN ULONG LoadFlags, - IN PUNICODE_STRING Name, - OUT PLDR_MODULE *Module); +static NTSTATUS LdrpLoadModule(IN PWSTR SearchPath OPTIONAL, + IN ULONG LoadFlags, + IN PUNICODE_STRING Name, + OUT PLDR_MODULE *Module); static NTSTATUS LdrpAttachProcess(VOID); static VOID LdrpDetachProcess(BOOL UnloadAll); @@ -147,12 +147,12 @@ static inline VOID LdrpTlsCallback(PLDR_MODULE Module, ULONG dwReason) { while (*TlsCallback) { - TRACE_LDR("%wZ - Calling tls callback at %x\n", - &Module->BaseDllName, TlsCallback); - TlsCallback(Module->BaseAddress, dwReason, NULL); - TlsCallback++; - } - } + TRACE_LDR("%wZ - Calling tls callback at %x\n", + &Module->BaseDllName, TlsCallback); + TlsCallback(Module->BaseAddress, dwReason, NULL); + TlsCallback++; + } + } } } @@ -181,32 +181,32 @@ LdrpInitializeTlsForThread(VOID) { TlsPointers = RtlAllocateHeap(RtlGetProcessHeap(), 0, - LdrpTlsCount * sizeof(PVOID) + LdrpTlsSize); + LdrpTlsCount * sizeof(PVOID) + LdrpTlsSize); if (TlsPointers == NULL) { - DPRINT1("failed to allocate thread tls data\n"); - return STATUS_NO_MEMORY; - } - + DPRINT1("failed to allocate thread tls data\n"); + return STATUS_NO_MEMORY; + } + TlsData = (PVOID)TlsPointers + LdrpTlsCount * sizeof(PVOID); NtCurrentTeb()->ThreadLocalStoragePointer = TlsPointers; TlsInfo = LdrpTlsArray; for (i = 0; i < LdrpTlsCount; i++, TlsInfo++) { - TRACE_LDR("Initialize tls data for %wZ\n", &TlsInfo->Module->BaseDllName); - TlsPointers[i] = TlsData; - if (TlsInfo->TlsDataSize) - { - memcpy(TlsData, TlsInfo->StartAddressOfRawData, TlsInfo->TlsDataSize); - TlsData += TlsInfo->TlsDataSize; - } - if (TlsInfo->TlsZeroSize) - { - memset(TlsData, 0, TlsInfo->TlsZeroSize); - TlsData += TlsInfo->TlsZeroSize; - } - } + TRACE_LDR("Initialize tls data for %wZ\n", &TlsInfo->Module->BaseDllName); + TlsPointers[i] = TlsData; + if (TlsInfo->TlsDataSize) + { + memcpy(TlsData, TlsInfo->StartAddressOfRawData, TlsInfo->TlsDataSize); + TlsData += TlsInfo->TlsDataSize; + } + if (TlsInfo->TlsZeroSize) + { + memset(TlsData, 0, TlsInfo->TlsZeroSize); + TlsData += TlsInfo->TlsZeroSize; + } + } } DPRINT("LdrpInitializeTlsForThread() done\n"); return STATUS_SUCCESS; @@ -222,57 +222,57 @@ LdrpInitializeTlsForProccess(VOID) PTLS_DATA TlsData; DPRINT("LdrpInitializeTlsForProccess() called for %wZ\n", &ExeModule->BaseDllName); - + if (LdrpTlsCount > 0) { LdrpTlsArray = RtlAllocateHeap(RtlGetProcessHeap(), 0, - LdrpTlsCount * sizeof(TLS_DATA)); + LdrpTlsCount * sizeof(TLS_DATA)); if (LdrpTlsArray == NULL) { - DPRINT1("Failed to allocate global tls data\n"); + DPRINT1("Failed to allocate global tls data\n"); return STATUS_NO_MEMORY; } - + ModuleListHead = &NtCurrentPeb()->Ldr->InLoadOrderModuleList; Entry = ModuleListHead->Flink; while (Entry != ModuleListHead) { Module = CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList); - if (Module->LoadCount == -1 && - Module->TlsIndex >= 0) + if (Module->LoadCount == -1 && + Module->TlsIndex >= 0) { TlsDirectory = (PIMAGE_TLS_DIRECTORY) - RtlImageDirectoryEntryToData(Module->BaseAddress, + RtlImageDirectoryEntryToData(Module->BaseAddress, TRUE, IMAGE_DIRECTORY_ENTRY_TLS, NULL); assert(Module->TlsIndex < LdrpTlsCount); - TlsData = &LdrpTlsArray[Module->TlsIndex]; - TlsData->StartAddressOfRawData = (PVOID)TlsDirectory->StartAddressOfRawData; - TlsData->TlsDataSize = TlsDirectory->EndAddressOfRawData - TlsDirectory->StartAddressOfRawData; - TlsData->TlsZeroSize = TlsDirectory->SizeOfZeroFill; - TlsData->TlsAddressOfCallBacks = *TlsDirectory->AddressOfCallBacks; - TlsData->Module = Module; + TlsData = &LdrpTlsArray[Module->TlsIndex]; + TlsData->StartAddressOfRawData = (PVOID)TlsDirectory->StartAddressOfRawData; + TlsData->TlsDataSize = TlsDirectory->EndAddressOfRawData - TlsDirectory->StartAddressOfRawData; + TlsData->TlsZeroSize = TlsDirectory->SizeOfZeroFill; + TlsData->TlsAddressOfCallBacks = *TlsDirectory->AddressOfCallBacks; + TlsData->Module = Module; #if 0 DbgPrint("TLS directory for %wZ\n", &Module->BaseDllName); - DbgPrint("StartAddressOfRawData: %x\n", TlsDirectory->StartAddressOfRawData); - DbgPrint("EndAddressOfRawData: %x\n", TlsDirectory->EndAddressOfRawData); - DbgPrint("SizeOfRawData: %d\n", TlsDirectory->EndAddressOfRawData - TlsDirectory->StartAddressOfRawData); - DbgPrint("AddressOfIndex: %x\n", TlsDirectory->AddressOfIndex); - DbgPrint("AddressOfCallBacks: %x (%x)\n", TlsDirectory->AddressOfCallBacks, *TlsDirectory->AddressOfCallBacks); - DbgPrint("SizeOfZeroFill: %d\n", TlsDirectory->SizeOfZeroFill); - DbgPrint("Characteristics: %x\n", TlsDirectory->Characteristics); + DbgPrint("StartAddressOfRawData: %x\n", TlsDirectory->StartAddressOfRawData); + DbgPrint("EndAddressOfRawData: %x\n", TlsDirectory->EndAddressOfRawData); + DbgPrint("SizeOfRawData: %d\n", TlsDirectory->EndAddressOfRawData - TlsDirectory->StartAddressOfRawData); + DbgPrint("AddressOfIndex: %x\n", TlsDirectory->AddressOfIndex); + DbgPrint("AddressOfCallBacks: %x (%x)\n", TlsDirectory->AddressOfCallBacks, *TlsDirectory->AddressOfCallBacks); + DbgPrint("SizeOfZeroFill: %d\n", TlsDirectory->SizeOfZeroFill); + DbgPrint("Characteristics: %x\n", TlsDirectory->Characteristics); #endif - /* - * FIXME: - * Is this region allways writable ? - */ + /* + * FIXME: + * Is this region allways writable ? + */ *(PULONG)TlsDirectory->AddressOfIndex = Module->TlsIndex; - CHECKPOINT1; - } - Entry = Entry->Flink; - } + CHECKPOINT1; + } + Entry = Entry->Flink; + } } DPRINT("LdrpInitializeTlsForProccess() done\n"); return STATUS_SUCCESS; @@ -292,15 +292,15 @@ LdrpInitLoader(VOID) /* Get handle to the 'KnownDlls' directory */ RtlInitUnicodeString(&Name, - L"\\KnownDlls"); + L"\\KnownDlls"); InitializeObjectAttributes(&ObjectAttributes, - &Name, - OBJ_CASE_INSENSITIVE, - NULL, - NULL); + &Name, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); Status = NtOpenDirectoryObject(&LdrpKnownDllsDirHandle, - DIRECTORY_QUERY | DIRECTORY_TRAVERSE, - &ObjectAttributes); + DIRECTORY_QUERY | DIRECTORY_TRAVERSE, + &ObjectAttributes); if (!NT_SUCCESS(Status)) { DPRINT("NtOpenDirectoryObject() failed (Status %lx)\n", Status); @@ -312,8 +312,8 @@ LdrpInitLoader(VOID) LinkTarget.Length = 0; LinkTarget.MaximumLength = MAX_PATH * sizeof(WCHAR); LinkTarget.Buffer = RtlAllocateHeap(RtlGetProcessHeap(), - 0, - MAX_PATH * sizeof(WCHAR)); + 0, + MAX_PATH * sizeof(WCHAR)); if (LinkTarget.Buffer == NULL) { NtClose(LdrpKnownDllsDirHandle); @@ -322,15 +322,15 @@ LdrpInitLoader(VOID) } RtlInitUnicodeString(&Name, - L"KnownDllPath"); + L"KnownDllPath"); InitializeObjectAttributes(&ObjectAttributes, - &Name, - OBJ_CASE_INSENSITIVE | OBJ_OPENLINK, - LdrpKnownDllsDirHandle, - NULL); + &Name, + OBJ_CASE_INSENSITIVE | OBJ_OPENLINK, + LdrpKnownDllsDirHandle, + NULL); Status = NtOpenSymbolicLinkObject(&LinkHandle, - SYMBOLIC_LINK_ALL_ACCESS, - &ObjectAttributes); + SYMBOLIC_LINK_ALL_ACCESS, + &ObjectAttributes); if (!NT_SUCCESS(Status)) { RtlFreeUnicodeString(&LinkTarget); @@ -340,8 +340,8 @@ LdrpInitLoader(VOID) } Status = NtQuerySymbolicLinkObject(LinkHandle, - &LinkTarget, - &Length); + &LinkTarget, + &Length); NtClose(LinkHandle); if (!NT_SUCCESS(Status)) { @@ -351,7 +351,7 @@ LdrpInitLoader(VOID) } RtlCreateUnicodeString(&LdrpKnownDllPath, - LinkTarget.Buffer); + LinkTarget.Buffer); RtlFreeUnicodeString(&LinkTarget); @@ -441,8 +441,8 @@ LdrAdjustDllName (PUNICODE_STRING FullDllName, PLDR_MODULE LdrAddModuleEntry(PVOID ImageBase, - PIMAGE_NT_HEADERS NTHeaders, - PWSTR FullDosName) + PIMAGE_NT_HEADERS NTHeaders, + PWSTR FullDosName) { PLDR_MODULE Module; @@ -476,7 +476,7 @@ LdrAddModuleEntry(PVOID ImageBase, RtlCreateUnicodeString (&Module->BaseDllName, wcsrchr(FullDosName, L'\\') + 1); DPRINT ("BaseDllName %wZ\n", &Module->BaseDllName); - + RtlEnterCriticalSection (NtCurrentPeb()->LoaderLock); InsertTailList(&NtCurrentPeb()->Ldr->InLoadOrderModuleList, &Module->InLoadOrderModuleList); @@ -488,8 +488,8 @@ LdrAddModuleEntry(PVOID ImageBase, static NTSTATUS LdrpMapKnownDll(IN PUNICODE_STRING DllName, - OUT PUNICODE_STRING FullDosName, - OUT PHANDLE SectionHandle) + OUT PUNICODE_STRING FullDosName, + OUT PHANDLE SectionHandle) { OBJECT_ATTRIBUTES ObjectAttributes; NTSTATUS Status; @@ -505,13 +505,13 @@ LdrpMapKnownDll(IN PUNICODE_STRING DllName, DPRINT("LdrpKnownDllPath '%wZ'\n", &LdrpKnownDllPath); InitializeObjectAttributes(&ObjectAttributes, - DllName, - OBJ_CASE_INSENSITIVE, - LdrpKnownDllsDirHandle, - NULL); + DllName, + OBJ_CASE_INSENSITIVE, + LdrpKnownDllsDirHandle, + NULL); Status = NtOpenSection(SectionHandle, - SECTION_MAP_READ | SECTION_MAP_WRITE | SECTION_MAP_EXECUTE, - &ObjectAttributes); + SECTION_MAP_READ | SECTION_MAP_WRITE | SECTION_MAP_EXECUTE, + &ObjectAttributes); if (!NT_SUCCESS(Status)) { DPRINT("NtOpenSection() failed for '%wZ' (Status %lx)\n", DllName, Status); @@ -521,8 +521,8 @@ LdrpMapKnownDll(IN PUNICODE_STRING DllName, FullDosName->Length = LdrpKnownDllPath.Length + DllName->Length + sizeof(WCHAR); FullDosName->MaximumLength = FullDosName->Length + sizeof(WCHAR); FullDosName->Buffer = RtlAllocateHeap(RtlGetProcessHeap(), - 0, - FullDosName->MaximumLength); + 0, + FullDosName->MaximumLength); if (FullDosName->Buffer == NULL) { FullDosName->Length = 0; @@ -544,9 +544,9 @@ LdrpMapKnownDll(IN PUNICODE_STRING DllName, static NTSTATUS LdrpMapDllImageFile(IN PWSTR SearchPath OPTIONAL, - IN PUNICODE_STRING DllName, - OUT PUNICODE_STRING FullDosName, - OUT PHANDLE SectionHandle) + IN PUNICODE_STRING DllName, + OUT PUNICODE_STRING FullDosName, + OUT PHANDLE SectionHandle) { WCHAR SearchPathBuffer[MAX_PATH]; WCHAR DosName[MAX_PATH]; @@ -559,20 +559,33 @@ LdrpMapDllImageFile(IN PWSTR SearchPath OPTIONAL, PVOID ImageBase; ULONG ImageSize; IO_STATUS_BLOCK IoStatusBlock; - NTSTATUS Status; + NTSTATUS Status; + ULONG len; DPRINT("LdrpMapDllImageFile() called\n"); if (SearchPath == NULL) { - SearchPath = SearchPathBuffer; - wcscpy (SearchPathBuffer, SharedUserData->NtSystemRoot); + /* get application running path */ + + wcscpy (SearchPathBuffer, NtCurrentPeb()->ProcessParameters->ImagePathName.Buffer); + + len = wcslen (SearchPathBuffer); + + while (len && SearchPathBuffer[len - 1] != L'\\') + len--; + + if (len) SearchPathBuffer[len-1] = L'\0'; + + wcscat (SearchPathBuffer, L";"); + + wcscat (SearchPathBuffer, SharedUserData->NtSystemRoot); wcscat (SearchPathBuffer, L"\\system32;"); wcscat (SearchPathBuffer, SharedUserData->NtSystemRoot); wcscat (SearchPathBuffer, L";."); - } - DPRINT("SearchPath %S\n", SearchPath); + SearchPath = SearchPathBuffer; + } if (RtlDosSearchPath_U (SearchPath, DllName->Buffer, @@ -582,7 +595,6 @@ LdrpMapDllImageFile(IN PWSTR SearchPath OPTIONAL, NULL) == 0) return STATUS_DLL_NOT_FOUND; - DPRINT("DosName %S\n", DosName); if (!RtlDosPathNameToNtPathName_U (DosName, &FullNtFileName, @@ -608,7 +620,7 @@ LdrpMapDllImageFile(IN PWSTR SearchPath OPTIONAL, FILE_SYNCHRONOUS_IO_NONALERT); if (!NT_SUCCESS(Status)) { - DPRINT1("Dll open of %wZ failed: Status = 0x%08x\n", + DPRINT1("Dll open of %wZ failed: Status = 0x%08x\n", &FullNtFileName, Status); RtlFreeUnicodeString (&FullNtFileName); return Status; @@ -631,7 +643,7 @@ LdrpMapDllImageFile(IN PWSTR SearchPath OPTIONAL, return Status; } /* - * Overlay DOS and NT headers structures to the + * Overlay DOS and NT headers structures to the * buffer with DLL's header raw data. */ DosHeader = (PIMAGE_DOS_HEADER) BlockBuffer; @@ -645,15 +657,15 @@ LdrpMapDllImageFile(IN PWSTR SearchPath OPTIONAL, { DPRINT("NTDLL format invalid\n"); NtClose(FileHandle); - + return STATUS_UNSUCCESSFUL; } - + ImageBase = (PVOID) NTHeaders->OptionalHeader.ImageBase; ImageSize = NTHeaders->OptionalHeader.SizeOfImage; - + DPRINT("ImageBase 0x%08x\n", ImageBase); - + /* * Create a section for dll. */ @@ -673,7 +685,7 @@ LdrpMapDllImageFile(IN PWSTR SearchPath OPTIONAL, } RtlCreateUnicodeString(FullDosName, - DosName); + DosName); return Status; } @@ -778,7 +790,7 @@ LdrFindEntryForAddress(PVOID Address, (Address <= (ModulePtr->BaseAddress + ModulePtr->SizeOfImage))) { *Module = ModulePtr; - RtlLeaveCriticalSection(NtCurrentPeb()->LoaderLock); + RtlLeaveCriticalSection(NtCurrentPeb()->LoaderLock); return(STATUS_SUCCESS); } @@ -810,7 +822,7 @@ LdrFindEntryForAddress(PVOID Address, static NTSTATUS LdrFindEntryForName(PUNICODE_STRING Name, PLDR_MODULE *Module, - BOOL Ref) + BOOL Ref) { PLIST_ENTRY ModuleListHead; PLIST_ENTRY Entry; @@ -849,7 +861,7 @@ LdrFindEntryForName(PUNICODE_STRING Name, ContainsPath = L'\\' == AdjustedName.Buffer[i] || L'/' == AdjustedName.Buffer[i]; } - + if (LdrpLastModule) { if ((! ContainsPath && @@ -858,12 +870,12 @@ LdrFindEntryForName(PUNICODE_STRING Name, 0 == RtlCompareUnicodeString(&LdrpLastModule->FullDllName, &AdjustedName, TRUE))) { *Module = LdrpLastModule; - if (Ref && (*Module)->LoadCount != -1) - { + if (Ref && (*Module)->LoadCount != -1) + { (*Module)->LoadCount++; - } + } RtlLeaveCriticalSection(NtCurrentPeb()->LoaderLock); - RtlFreeUnicodeString(&AdjustedName); + RtlFreeUnicodeString(&AdjustedName); return(STATUS_SUCCESS); } } @@ -879,12 +891,12 @@ LdrFindEntryForName(PUNICODE_STRING Name, 0 == RtlCompareUnicodeString(&ModulePtr->FullDllName, &AdjustedName, TRUE))) { *Module = LdrpLastModule = ModulePtr; - if (Ref && ModulePtr->LoadCount != -1) - { + if (Ref && ModulePtr->LoadCount != -1) + { ModulePtr->LoadCount++; } RtlLeaveCriticalSection(NtCurrentPeb()->LoaderLock); - RtlFreeUnicodeString(&AdjustedName); + RtlFreeUnicodeString(&AdjustedName); return(STATUS_SUCCESS); } @@ -933,8 +945,8 @@ LdrFixupForward(PCHAR ForwardName) NameBuffer); Status = LdrFindEntryForName (&DllName, &Module, FALSE); - /* FIXME: - * The caller (or the image) is responsible for loading of the dll, where the function is forwarded. + /* FIXME: + * The caller (or the image) is responsible for loading of the dll, where the function is forwarded. */ if (!NT_SUCCESS(Status)) { @@ -942,11 +954,11 @@ LdrFixupForward(PCHAR ForwardName) LDRP_PROCESS_CREATION_TIME, &DllName, &BaseAddress); - if (NT_SUCCESS(Status)) - { - Status = LdrFindEntryForName (&DllName, &Module, FALSE); - } - } + if (NT_SUCCESS(Status)) + { + Status = LdrFindEntryForName (&DllName, &Module, FALSE); + } + } RtlFreeUnicodeString (&DllName); if (!NT_SUCCESS(Status)) { @@ -955,7 +967,7 @@ LdrFixupForward(PCHAR ForwardName) } DPRINT("BaseAddress: %p\n", Module->BaseAddress); - + return LdrGetExportByName(Module->BaseAddress, p+1, -1); } @@ -966,7 +978,7 @@ LdrFixupForward(PCHAR ForwardName) /********************************************************************** * NAME LOCAL * LdrGetExportByOrdinal - * + * * DESCRIPTION * * ARGUMENTS @@ -980,7 +992,7 @@ LdrFixupForward(PCHAR ForwardName) */ static PVOID LdrGetExportByOrdinal ( - PVOID BaseAddress, + PVOID BaseAddress, ULONG Ordinal ) { @@ -1029,7 +1041,7 @@ LdrGetExportByOrdinal ( /********************************************************************** * NAME LOCAL * LdrGetExportByName - * + * * DESCRIPTION * * ARGUMENTS @@ -1039,7 +1051,7 @@ LdrGetExportByOrdinal ( * REVISIONS * * NOTE - * AddressOfNames and AddressOfNameOrdinals are paralell tables, + * AddressOfNames and AddressOfNameOrdinals are paralell tables, * both with NumberOfNames entries. * */ @@ -1058,7 +1070,7 @@ LdrGetExportByName(PVOID BaseAddress, PVOID Function; LONG minn, maxn; ULONG ExportDirSize; - + DPRINT("LdrGetExportByName %x %s %hu\n", BaseAddress, SymbolName, Hint); ExportDir = (PIMAGE_EXPORT_DIRECTORY) @@ -1076,7 +1088,7 @@ LdrGetExportByName(PVOID BaseAddress, //The symbol names may be missing entirely if (ExportDir->AddressOfNames == 0) { - DPRINT("LdrGetExportByName(): symbol names missing entirely\n"); + DPRINT("LdrGetExportByName(): symbol names missing entirely\n"); return NULL; } @@ -1089,7 +1101,7 @@ LdrGetExportByName(PVOID BaseAddress, ExportDir->AddressOfNameOrdinals); ExFunctions = (PDWORD *)RVA(BaseAddress, ExportDir->AddressOfFunctions); - + /* * Check the hint first */ @@ -1105,17 +1117,17 @@ LdrGetExportByName(PVOID BaseAddress, { DPRINT("Forward: %s\n", (PCHAR)Function); Function = LdrFixupForward((PCHAR)Function); - if (Function == NULL) - { + if (Function == NULL) + { DPRINT1("LdrGetExportByName(): failed to find %s\n",SymbolName); - } - return Function; + } + return Function; } if (Function != NULL) return Function; } } - + /* * Try a binary search first */ @@ -1139,11 +1151,11 @@ LdrGetExportByName(PVOID BaseAddress, { DPRINT("Forward: %s\n", (PCHAR)Function); Function = LdrFixupForward((PCHAR)Function); - if (Function == NULL) - { + if (Function == NULL) + { DPRINT1("LdrGetExportByName(): failed to find %s\n",SymbolName); - } - return Function; + } + return Function; } if (Function != NULL) return Function; @@ -1162,7 +1174,7 @@ LdrGetExportByName(PVOID BaseAddress, minn = mid + 1; } } - + /* * Fall back on a linear search */ @@ -1180,12 +1192,12 @@ LdrGetExportByName(PVOID BaseAddress, { DPRINT("Forward: %s\n", (PCHAR)Function); Function = LdrFixupForward((PCHAR)Function); - } - if (Function == NULL) - { - break; - } - return Function; + } + if (Function == NULL) + { + break; + } + return Function; } } DPRINT1("LdrGetExportByName(): failed to find %s\n",SymbolName); @@ -1196,10 +1208,10 @@ LdrGetExportByName(PVOID BaseAddress, /********************************************************************** * NAME LOCAL * LdrPerformRelocations - * + * * DESCRIPTION * Relocate a DLL's memory image. - * + * * ARGUMENTS * * RETURN VALUE @@ -1233,7 +1245,7 @@ static NTSTATUS LdrPerformRelocations (PIMAGE_NT_HEADERS NTHeaders, return STATUS_UNSUCCESSFUL; } - Sections = + Sections = (PIMAGE_SECTION_HEADER)((PVOID)NTHeaders + sizeof(IMAGE_NT_HEADERS)); MaxExtend = 0; for (i = 0; i < NTHeaders->FileHeader.NumberOfSections; i++) @@ -1241,19 +1253,19 @@ static NTSTATUS LdrPerformRelocations (PIMAGE_NT_HEADERS NTHeaders, if (!(Sections[i].Characteristics & IMAGE_SECTION_NOLOAD)) { ULONG Extend; - Extend = + Extend = (ULONG)(Sections[i].VirtualAddress + Sections[i].Misc.VirtualSize); MaxExtend = max(MaxExtend, Extend); } } - - RelocationDDir = + + RelocationDDir = &NTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC]; RelocationRVA = RelocationDDir->VirtualAddress; if (RelocationRVA) { - RelocationDir = + RelocationDir = (PRELOCATION_DIRECTORY)((PCHAR)ImageBase + RelocationRVA); while (RelocationDir->SizeOfBlock) @@ -1261,21 +1273,21 @@ static NTSTATUS LdrPerformRelocations (PIMAGE_NT_HEADERS NTHeaders, if (RelocationDir->VirtualAddress > MaxExtend) { RelocationRVA += RelocationDir->SizeOfBlock; - RelocationDir = + RelocationDir = (PRELOCATION_DIRECTORY) (ImageBase + RelocationRVA); continue; } Delta32 = (ULONG)(ImageBase - NTHeaders->OptionalHeader.ImageBase); - RelocationBlock = - (PRELOCATION_ENTRY) (RelocationRVA + ImageBase + - sizeof (RELOCATION_DIRECTORY)); - NumberOfEntries = + RelocationBlock = + (PRELOCATION_ENTRY) (RelocationRVA + ImageBase + + sizeof (RELOCATION_DIRECTORY)); + NumberOfEntries = RelocationDir->SizeOfBlock - sizeof (RELOCATION_DIRECTORY); NumberOfEntries = NumberOfEntries / sizeof (RELOCATION_ENTRY); Status = NtProtectVirtualMemory(NtCurrentProcess(), - ImageBase + + ImageBase + RelocationDir->VirtualAddress, PAGE_SIZE, PAGE_READWRITE, @@ -1288,25 +1300,25 @@ static NTSTATUS LdrPerformRelocations (PIMAGE_NT_HEADERS NTHeaders, if (RelocationDir->VirtualAddress + PAGE_SIZE < MaxExtend) { - Status = NtProtectVirtualMemory(NtCurrentProcess(), - ImageBase + - RelocationDir->VirtualAddress + PAGE_SIZE, - PAGE_SIZE, - PAGE_READWRITE, - &OldProtect2); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to unprotect relocation target (2).\n"); + Status = NtProtectVirtualMemory(NtCurrentProcess(), + ImageBase + + RelocationDir->VirtualAddress + PAGE_SIZE, + PAGE_SIZE, + PAGE_READWRITE, + &OldProtect2); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to unprotect relocation target (2).\n"); NtProtectVirtualMemory(NtCurrentProcess(), - ImageBase + + ImageBase + RelocationDir->VirtualAddress, PAGE_SIZE, OldProtect, &OldProtect); - return(Status); - } + return(Status); + } } - + for (i = 0; i < NumberOfEntries; i++) { Offset = (RelocationBlock[i].TypeOffset & 0xfff); @@ -1320,35 +1332,35 @@ static NTSTATUS LdrPerformRelocations (PIMAGE_NT_HEADERS NTHeaders, { 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(), - ImageBase + + ImageBase + RelocationDir->VirtualAddress, PAGE_SIZE, OldProtect, @@ -1361,32 +1373,32 @@ static NTSTATUS LdrPerformRelocations (PIMAGE_NT_HEADERS NTHeaders, if (RelocationDir->VirtualAddress + PAGE_SIZE < MaxExtend) { - Status = NtProtectVirtualMemory(NtCurrentProcess(), - ImageBase + - RelocationDir->VirtualAddress + PAGE_SIZE, - PAGE_SIZE, - OldProtect2, - &OldProtect2); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to protect relocation target2.\n"); - return(Status); - } + Status = NtProtectVirtualMemory(NtCurrentProcess(), + ImageBase + + RelocationDir->VirtualAddress + PAGE_SIZE, + PAGE_SIZE, + OldProtect2, + &OldProtect2); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to protect relocation target2.\n"); + return(Status); + } } RelocationRVA += RelocationDir->SizeOfBlock; - RelocationDir = + RelocationDir = (PRELOCATION_DIRECTORY) (ImageBase + RelocationRVA); } } return STATUS_SUCCESS; } - -static NTSTATUS + +static NTSTATUS LdrpGetOrLoadModule(PWCHAR SerachPath, - PCHAR Name, - PLDR_MODULE* Module, - BOOL Load) + PCHAR Name, + PLDR_MODULE* Module, + BOOL Load) { UNICODE_STRING DllName; NTSTATUS Status; @@ -1394,18 +1406,18 @@ LdrpGetOrLoadModule(PWCHAR SerachPath, DPRINT("LdrpGetOrLoadModule() called for %s\n", Name); RtlCreateUnicodeStringFromAsciiz (&DllName, Name); - + Status = LdrFindEntryForName (&DllName, Module, Load); if (Load && !NT_SUCCESS(Status)) { - Status = LdrpLoadModule(SerachPath, - NtCurrentPeb()->Ldr->Initialized ? 0 : LDRP_PROCESS_CREATION_TIME, - &DllName, - Module); + Status = LdrpLoadModule(SerachPath, + NtCurrentPeb()->Ldr->Initialized ? 0 : LDRP_PROCESS_CREATION_TIME, + &DllName, + Module); if (NT_SUCCESS(Status)) { - Status = LdrFindEntryForName (&DllName, Module, FALSE); - } + Status = LdrFindEntryForName (&DllName, Module, FALSE); + } if (!NT_SUCCESS(Status)) { DPRINT1("failed to load %wZ\n", &DllName); @@ -1417,8 +1429,8 @@ LdrpGetOrLoadModule(PWCHAR SerachPath, static NTSTATUS LdrpProcessImportDirectoryEntry( - PLDR_MODULE Module, - PLDR_MODULE ImportedModule, + PLDR_MODULE Module, + PLDR_MODULE ImportedModule, PIMAGE_IMPORT_MODULE_DIRECTORY ImportModuleDirectory) { NTSTATUS Status; @@ -1466,7 +1478,7 @@ LdrpProcessImportDirectoryEntry( DPRINT1("Failed to unprotect IAT.\n"); return(Status); } - + /* Walk through function list and fixup addresses. */ while (*FunctionNameList != 0L) { @@ -1490,7 +1502,7 @@ LdrpProcessImportDirectoryEntry( DPRINT1("Failed to import %s from %wZ\n", pe_name->Name, &ImportedModule->FullDllName); return STATUS_UNSUCCESSFUL; } - } + } ImportAddressList++; FunctionNameList++; } @@ -1512,8 +1524,8 @@ LdrpProcessImportDirectoryEntry( static NTSTATUS LdrpProcessImportDirectory( - PLDR_MODULE Module, - PLDR_MODULE ImportedModule, + PLDR_MODULE Module, + PLDR_MODULE ImportedModule, PCHAR ImportedName) { NTSTATUS Status; @@ -1525,9 +1537,9 @@ LdrpProcessImportDirectory( ImportModuleDirectory = (PIMAGE_IMPORT_MODULE_DIRECTORY) - RtlImageDirectoryEntryToData(Module->BaseAddress, - TRUE, - IMAGE_DIRECTORY_ENTRY_IMPORT, + RtlImageDirectoryEntryToData(Module->BaseAddress, + TRUE, + IMAGE_DIRECTORY_ENTRY_IMPORT, NULL); if (ImportModuleDirectory == NULL) { @@ -1539,13 +1551,13 @@ LdrpProcessImportDirectory( Name = (PCHAR)Module->BaseAddress + ImportModuleDirectory->dwRVAModuleName; if (0 == _stricmp(Name, ImportedName)) { - Status = LdrpProcessImportDirectoryEntry(Module, - ImportedModule, + Status = LdrpProcessImportDirectoryEntry(Module, + ImportedModule, ImportModuleDirectory); - if (!NT_SUCCESS(Status)) - { - return Status; - } + if (!NT_SUCCESS(Status)) + { + return Status; + } } ImportModuleDirectory++; } @@ -1555,10 +1567,10 @@ LdrpProcessImportDirectory( } -static NTSTATUS -LdrpAdjustImportDirectory(PLDR_MODULE Module, - PLDR_MODULE ImportedModule, - PUCHAR ImportedName) +static NTSTATUS +LdrpAdjustImportDirectory(PLDR_MODULE Module, + PLDR_MODULE ImportedModule, + PUCHAR ImportedName) { PIMAGE_IMPORT_MODULE_DIRECTORY ImportModuleDirectory; NTSTATUS Status; @@ -1577,10 +1589,10 @@ LdrpAdjustImportDirectory(PLDR_MODULE Module, Module, &Module->BaseDllName, ImportedModule, &ImportedModule->BaseDllName, ImportedName); ImportModuleDirectory = (PIMAGE_IMPORT_MODULE_DIRECTORY) - RtlImageDirectoryEntryToData(Module->BaseAddress, - TRUE, - IMAGE_DIRECTORY_ENTRY_IMPORT, - NULL); + RtlImageDirectoryEntryToData(Module->BaseAddress, + TRUE, + IMAGE_DIRECTORY_ENTRY_IMPORT, + NULL); if (ImportModuleDirectory == NULL) { return STATUS_UNSUCCESSFUL; @@ -1624,7 +1636,7 @@ LdrpAdjustImportDirectory(PLDR_MODULE Module, DPRINT1("Failed to unprotect IAT.\n"); return(Status); } - + NTHeaders = RtlImageNtHeader (ImportedModule->BaseAddress); Start = (PVOID)NTHeaders->OptionalHeader.ImageBase; End = Start + ImportedModule->SizeOfImage; @@ -1635,8 +1647,8 @@ LdrpAdjustImportDirectory(PLDR_MODULE Module, { if (*ImportAddressList >= Start && *ImportAddressList < End) { - (*ImportAddressList) += Offset; - } + (*ImportAddressList) += Offset; + } ImportAddressList++; FunctionNameList++; } @@ -1652,7 +1664,7 @@ LdrpAdjustImportDirectory(PLDR_MODULE Module, DPRINT1("Failed to protect IAT.\n"); return(Status); } - } + } ImportModuleDirectory++; } return STATUS_SUCCESS; @@ -1662,7 +1674,7 @@ LdrpAdjustImportDirectory(PLDR_MODULE Module, /********************************************************************** * NAME LOCAL * LdrFixupImports - * + * * DESCRIPTION * Compute the entry point for every symbol the DLL imports * from other modules. @@ -1676,9 +1688,9 @@ LdrpAdjustImportDirectory(PLDR_MODULE Module, * NOTE * */ -static NTSTATUS +static NTSTATUS LdrFixupImports(IN PWSTR SearchPath OPTIONAL, - IN PLDR_MODULE Module) + IN PLDR_MODULE Module) { PIMAGE_IMPORT_MODULE_DIRECTORY ImportModuleDirectory; PIMAGE_IMPORT_MODULE_DIRECTORY ImportModuleDirectoryCurrent; @@ -1689,42 +1701,42 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL, NTSTATUS Status; PLDR_MODULE ImportedModule; PCHAR ImportedName; - + DPRINT("LdrFixupImports(SearchPath %x, Module %x)\n", SearchPath, Module); - + /* Check for tls data */ TlsDirectory = (PIMAGE_TLS_DIRECTORY) - RtlImageDirectoryEntryToData(Module->BaseAddress, - TRUE, - IMAGE_DIRECTORY_ENTRY_TLS, - NULL); + RtlImageDirectoryEntryToData(Module->BaseAddress, + TRUE, + IMAGE_DIRECTORY_ENTRY_TLS, + NULL); if (TlsDirectory) { - TlsSize = TlsDirectory->EndAddressOfRawData - - TlsDirectory->StartAddressOfRawData - + TlsDirectory->SizeOfZeroFill; + TlsSize = TlsDirectory->EndAddressOfRawData + - TlsDirectory->StartAddressOfRawData + + TlsDirectory->SizeOfZeroFill; if (TlsSize > 0 && - NtCurrentPeb()->Ldr->Initialized) + NtCurrentPeb()->Ldr->Initialized) { TRACE_LDR("Trying to load dynamicly %wZ which contains a tls directory\n", - &Module->BaseDllName); - return STATUS_UNSUCCESSFUL; - } + &Module->BaseDllName); + return STATUS_UNSUCCESSFUL; + } } /* * Process each import module. */ ImportModuleDirectory = (PIMAGE_IMPORT_MODULE_DIRECTORY) - RtlImageDirectoryEntryToData(Module->BaseAddress, - TRUE, - IMAGE_DIRECTORY_ENTRY_IMPORT, - NULL); + RtlImageDirectoryEntryToData(Module->BaseAddress, + TRUE, + IMAGE_DIRECTORY_ENTRY_IMPORT, + NULL); BoundImportDescriptor = (PIMAGE_BOUND_IMPORT_DESCRIPTOR) - RtlImageDirectoryEntryToData(Module->BaseAddress, - TRUE, - IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT, - NULL); + RtlImageDirectoryEntryToData(Module->BaseAddress, + TRUE, + IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT, + NULL); if (BoundImportDescriptor != NULL && ImportModuleDirectory == NULL) { @@ -1738,123 +1750,123 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL, BoundImportDescriptorCurrent = BoundImportDescriptor; while (BoundImportDescriptorCurrent->OffsetModuleName) { - ImportedName = (PCHAR)BoundImportDescriptor + BoundImportDescriptorCurrent->OffsetModuleName; - TRACE_LDR("%wZ bound to %s\n", &Module->BaseDllName, ImportedName); - Status = LdrpGetOrLoadModule(SearchPath, ImportedName, &ImportedModule, TRUE); - if (!NT_SUCCESS(Status)) - { - DPRINT1("failed to load %s\n", ImportedName); - return Status; - } - if (Module == ImportedModule) - { - LdrpDecrementLoadCount(Module, FALSE); - } - if (ImportedModule->TimeDateStamp != BoundImportDescriptorCurrent->TimeDateStamp) - { - TRACE_LDR("%wZ has stale binding to %wZ\n", - &Module->BaseDllName, &ImportedModule->BaseDllName); - Status = LdrpProcessImportDirectory(Module, ImportedModule, ImportedName); - if (!NT_SUCCESS(Status)) - { - DPRINT1("failed to import %s\n", ImportedName); - return Status; - } - } - else - { - BOOL WrongForwarder; - WrongForwarder = FALSE; - if (ImportedModule->Flags & IMAGE_NOT_AT_BASE) - { - TRACE_LDR("%wZ has stale binding to %s\n", - &Module->BaseDllName, ImportedName); - } - else - { - TRACE_LDR("%wZ has correct binding to %wZ\n", - &Module->BaseDllName, &ImportedModule->BaseDllName); - } - if (BoundImportDescriptorCurrent->NumberOfModuleForwarderRefs) - { - PIMAGE_BOUND_FORWARDER_REF BoundForwarderRef; - ULONG i; - PLDR_MODULE ForwarderModule; - PUCHAR ForwarderName; + ImportedName = (PCHAR)BoundImportDescriptor + BoundImportDescriptorCurrent->OffsetModuleName; + TRACE_LDR("%wZ bound to %s\n", &Module->BaseDllName, ImportedName); + Status = LdrpGetOrLoadModule(SearchPath, ImportedName, &ImportedModule, TRUE); + if (!NT_SUCCESS(Status)) + { + DPRINT1("failed to load %s\n", ImportedName); + return Status; + } + if (Module == ImportedModule) + { + LdrpDecrementLoadCount(Module, FALSE); + } + if (ImportedModule->TimeDateStamp != BoundImportDescriptorCurrent->TimeDateStamp) + { + TRACE_LDR("%wZ has stale binding to %wZ\n", + &Module->BaseDllName, &ImportedModule->BaseDllName); + Status = LdrpProcessImportDirectory(Module, ImportedModule, ImportedName); + if (!NT_SUCCESS(Status)) + { + DPRINT1("failed to import %s\n", ImportedName); + return Status; + } + } + else + { + BOOL WrongForwarder; + WrongForwarder = FALSE; + if (ImportedModule->Flags & IMAGE_NOT_AT_BASE) + { + TRACE_LDR("%wZ has stale binding to %s\n", + &Module->BaseDllName, ImportedName); + } + else + { + TRACE_LDR("%wZ has correct binding to %wZ\n", + &Module->BaseDllName, &ImportedModule->BaseDllName); + } + if (BoundImportDescriptorCurrent->NumberOfModuleForwarderRefs) + { + PIMAGE_BOUND_FORWARDER_REF BoundForwarderRef; + ULONG i; + PLDR_MODULE ForwarderModule; + PUCHAR ForwarderName; BoundForwarderRef = (PIMAGE_BOUND_FORWARDER_REF)(BoundImportDescriptorCurrent + 1); - for (i = 0; i < BoundImportDescriptorCurrent->NumberOfModuleForwarderRefs; i++, BoundForwarderRef++) - { - ForwarderName = (PCHAR)BoundImportDescriptor + BoundForwarderRef->OffsetModuleName; - TRACE_LDR("%wZ bound to %s via forwardes from %s\n", - &Module->BaseDllName, ForwarderName, ImportedName); - Status = LdrpGetOrLoadModule(SearchPath, ForwarderName, &ForwarderModule, TRUE); - if (!NT_SUCCESS(Status)) - { - DPRINT1("failed to load %s\n", ForwarderName); - return Status; - } - if (Module == ImportedModule) - { - LdrpDecrementLoadCount(Module, FALSE); - } - if (ForwarderModule->TimeDateStamp != BoundForwarderRef->TimeDateStamp || - ForwarderModule->Flags & IMAGE_NOT_AT_BASE) - { - TRACE_LDR("%wZ has stale binding to %s\n", - &Module->BaseDllName, ForwarderName); - WrongForwarder = TRUE; - } - else - { - TRACE_LDR("%wZ has correct binding to %s\n", - &Module->BaseDllName, ForwarderName); - } - } - } - if (WrongForwarder || - ImportedModule->Flags & IMAGE_NOT_AT_BASE) - { + for (i = 0; i < BoundImportDescriptorCurrent->NumberOfModuleForwarderRefs; i++, BoundForwarderRef++) + { + ForwarderName = (PCHAR)BoundImportDescriptor + BoundForwarderRef->OffsetModuleName; + TRACE_LDR("%wZ bound to %s via forwardes from %s\n", + &Module->BaseDllName, ForwarderName, ImportedName); + Status = LdrpGetOrLoadModule(SearchPath, ForwarderName, &ForwarderModule, TRUE); + if (!NT_SUCCESS(Status)) + { + DPRINT1("failed to load %s\n", ForwarderName); + return Status; + } + if (Module == ImportedModule) + { + LdrpDecrementLoadCount(Module, FALSE); + } + if (ForwarderModule->TimeDateStamp != BoundForwarderRef->TimeDateStamp || + ForwarderModule->Flags & IMAGE_NOT_AT_BASE) + { + TRACE_LDR("%wZ has stale binding to %s\n", + &Module->BaseDllName, ForwarderName); + WrongForwarder = TRUE; + } + else + { + TRACE_LDR("%wZ has correct binding to %s\n", + &Module->BaseDllName, ForwarderName); + } + } + } + if (WrongForwarder || + ImportedModule->Flags & IMAGE_NOT_AT_BASE) + { Status = LdrpProcessImportDirectory(Module, ImportedModule, ImportedName); - if (!NT_SUCCESS(Status)) - { - DPRINT1("failed to import %s\n", ImportedName); - return Status; - } - } - else if (ImportedModule->Flags & IMAGE_NOT_AT_BASE) - { - TRACE_LDR("Adjust imports for %s from %wZ\n", - ImportedName, &Module->BaseDllName); + if (!NT_SUCCESS(Status)) + { + DPRINT1("failed to import %s\n", ImportedName); + return Status; + } + } + else if (ImportedModule->Flags & IMAGE_NOT_AT_BASE) + { + TRACE_LDR("Adjust imports for %s from %wZ\n", + ImportedName, &Module->BaseDllName); Status = LdrpAdjustImportDirectory(Module, ImportedModule, ImportedName); - if (!NT_SUCCESS(Status)) - { - DPRINT1("failed to adjust import entries for %s\n", ImportedName); - return Status; - } - } - else if (WrongForwarder) - { - /* - * FIXME: - * Update only forwarders - */ - TRACE_LDR("Stale BIND %s from %wZ\n", - ImportedName, &Module->BaseDllName); + if (!NT_SUCCESS(Status)) + { + DPRINT1("failed to adjust import entries for %s\n", ImportedName); + return Status; + } + } + else if (WrongForwarder) + { + /* + * FIXME: + * Update only forwarders + */ + TRACE_LDR("Stale BIND %s from %wZ\n", + ImportedName, &Module->BaseDllName); Status = LdrpProcessImportDirectory(Module, ImportedModule, ImportedName); - if (!NT_SUCCESS(Status)) - { - DPRINT1("faild to import %s\n", ImportedName); - return Status; - } - } - else - { - /* nothing to do */ - } - } + if (!NT_SUCCESS(Status)) + { + DPRINT1("faild to import %s\n", ImportedName); + return Status; + } + } + else + { + /* nothing to do */ + } + } BoundImportDescriptorCurrent += BoundImportDescriptorCurrent->NumberOfModuleForwarderRefs + 1; - } + } } else if (ImportModuleDirectory) { @@ -1863,8 +1875,8 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL, ImportModuleDirectoryCurrent = ImportModuleDirectory; while (ImportModuleDirectoryCurrent->dwRVAModuleName) { - ImportedName = (PCHAR)Module->BaseAddress + ImportModuleDirectoryCurrent->dwRVAModuleName; - TRACE_LDR("%wZ imports functions from %s\n", &Module->BaseDllName, ImportedName); + ImportedName = (PCHAR)Module->BaseAddress + ImportModuleDirectoryCurrent->dwRVAModuleName; + TRACE_LDR("%wZ imports functions from %s\n", &Module->BaseDllName, ImportedName); Status = LdrpGetOrLoadModule(SearchPath, ImportedName, &ImportedModule, TRUE); if (!NT_SUCCESS(Status)) @@ -1877,16 +1889,16 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL, LdrpDecrementLoadCount(Module, FALSE); } - TRACE_LDR("Initializing imports for %wZ from %s\n", - &Module->BaseDllName, ImportedName); + TRACE_LDR("Initializing imports for %wZ from %s\n", + &Module->BaseDllName, ImportedName); Status = LdrpProcessImportDirectoryEntry(Module, ImportedModule, ImportModuleDirectoryCurrent); - if (!NT_SUCCESS(Status)) - { - DPRINT1("failed to import %s\n", ImportedName); - return Status; - } - ImportModuleDirectoryCurrent++; - } + if (!NT_SUCCESS(Status)) + { + DPRINT1("failed to import %s\n", ImportedName); + return Status; + } + ImportModuleDirectoryCurrent++; + } } if (TlsDirectory && TlsSize > 0) @@ -1911,7 +1923,7 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL, * ImageBase * Address at which the EXE's image * is loaded. - * + * * SectionHandle * Handle of the section that contains * the EXE's image. @@ -1974,10 +1986,10 @@ PEPFUNC LdrPEStartup (PVOID ImageBase, Status = LdrFindEntryForAddress(ImageBase, Module); if (!NT_SUCCESS(Status)) { - return NULL; - } + return NULL; + } } - + if (ImageBase != (PVOID) NTHeaders->OptionalHeader.ImageBase) { (*Module)->Flags |= IMAGE_NOT_AT_BASE; @@ -2028,11 +2040,11 @@ PEPFUNC LdrPEStartup (PVOID ImageBase, return EntryPoint; } -static NTSTATUS +static NTSTATUS LdrpLoadModule(IN PWSTR SearchPath OPTIONAL, - IN ULONG LoadFlags, - IN PUNICODE_STRING Name, - PLDR_MODULE *Module) + IN ULONG LoadFlags, + IN PUNICODE_STRING Name, + PLDR_MODULE *Module) { UNICODE_STRING AdjustedName; UNICODE_STRING FullDosName; @@ -2062,21 +2074,21 @@ LdrpLoadModule(IN PWSTR SearchPath OPTIONAL, { /* Open or create dll image section */ Status = LdrpMapKnownDll(&AdjustedName, &FullDosName, &SectionHandle); - if (!NT_SUCCESS(Status)) - { + if (!NT_SUCCESS(Status)) + { Status = LdrpMapDllImageFile(SearchPath, &AdjustedName, &FullDosName, &SectionHandle); - } - if (!NT_SUCCESS(Status)) - { + } + if (!NT_SUCCESS(Status)) + { DPRINT1("Failed to create or open dll section of '%wZ' (Status %lx)\n", &AdjustedName, Status); RtlFreeUnicodeString(&AdjustedName); RtlFreeUnicodeString(&FullDosName); return Status; - } + } RtlFreeUnicodeString(&AdjustedName); - /* Map the dll into the process */ - ViewSize = 0; - ImageBase = 0; + /* Map the dll into the process */ + ViewSize = 0; + ImageBase = 0; Status = NtMapViewOfSection(SectionHandle, NtCurrentProcess(), &ImageBase, @@ -2115,43 +2127,43 @@ LdrpLoadModule(IN PWSTR SearchPath OPTIONAL, if (!NT_SUCCESS(Status)) { DPRINT1("LdrPerformRelocations() failed\n"); - NtUnmapViewOfSection (NtCurrentProcess (), ImageBase); + NtUnmapViewOfSection (NtCurrentProcess (), ImageBase); NtClose (SectionHandle); RtlFreeUnicodeString(&FullDosName); return STATUS_UNSUCCESSFUL; - } + } } *Module = LdrAddModuleEntry(ImageBase, NtHeaders, FullDosName.Buffer); (*Module)->SectionHandle = SectionHandle; if (ImageBase != (PVOID) NtHeaders->OptionalHeader.ImageBase) { - (*Module)->Flags |= IMAGE_NOT_AT_BASE; - } + (*Module)->Flags |= IMAGE_NOT_AT_BASE; + } if (NtHeaders->FileHeader.Characteristics & IMAGE_FILE_DLL) { - (*Module)->Flags |= IMAGE_DLL; - } + (*Module)->Flags |= IMAGE_DLL; + } /* fixup the imported calls entry points */ Status = LdrFixupImports(SearchPath, *Module); if (!NT_SUCCESS(Status)) { - DPRINT1("LdrFixupImports failed for %wZ, status=%x\n", &(*Module)->BaseDllName, Status); - return Status; - } + DPRINT1("LdrFixupImports failed for %wZ, status=%x\n", &(*Module)->BaseDllName, Status); + return Status; + } #ifdef KDBG LdrpLoadUserModuleSymbols(*Module); #endif RtlEnterCriticalSection(NtCurrentPeb()->LoaderLock); - InsertTailList(&NtCurrentPeb()->Ldr->InInitializationOrderModuleList, - &(*Module)->InInitializationOrderModuleList); + InsertTailList(&NtCurrentPeb()->Ldr->InInitializationOrderModuleList, + &(*Module)->InInitializationOrderModuleList); RtlLeaveCriticalSection (NtCurrentPeb()->LoaderLock); } return STATUS_SUCCESS; } -static NTSTATUS -LdrpUnloadModule(PLDR_MODULE Module, - BOOL Unload) +static NTSTATUS +LdrpUnloadModule(PLDR_MODULE Module, + BOOL Unload) { PIMAGE_IMPORT_MODULE_DIRECTORY ImportModuleDirectory; PIMAGE_BOUND_IMPORT_DESCRIPTOR BoundImportDescriptor; @@ -2170,7 +2182,7 @@ LdrpUnloadModule(PLDR_MODULE Module, LoadCount = LdrpDecrementLoadCount(Module, Unload); TRACE_LDR("Unload %wZ, LoadCount %d\n", &Module->BaseDllName, LoadCount); - + if (LoadCount == 0) { /* ?????????????????? */ @@ -2179,70 +2191,70 @@ LdrpUnloadModule(PLDR_MODULE Module, else if (LoadCount == 1) { BoundImportDescriptor = (PIMAGE_BOUND_IMPORT_DESCRIPTOR) - RtlImageDirectoryEntryToData(Module->BaseAddress, - TRUE, - IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT, - NULL); + RtlImageDirectoryEntryToData(Module->BaseAddress, + TRUE, + IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT, + NULL); if (BoundImportDescriptor) { - /* dereferencing all imported modules, use the bound import descriptor */ + /* dereferencing all imported modules, use the bound import descriptor */ BoundImportDescriptorCurrent = BoundImportDescriptor; while (BoundImportDescriptorCurrent->OffsetModuleName) { - ImportedName = (PCHAR)BoundImportDescriptor + BoundImportDescriptorCurrent->OffsetModuleName; - TRACE_LDR("%wZ trys to unload %s\n", &Module->BaseDllName, ImportedName); + ImportedName = (PCHAR)BoundImportDescriptor + BoundImportDescriptorCurrent->OffsetModuleName; + TRACE_LDR("%wZ trys to unload %s\n", &Module->BaseDllName, ImportedName); Status = LdrpGetOrLoadModule(NULL, ImportedName, &ImportedModule, FALSE); - if (!NT_SUCCESS(Status)) - { - DPRINT1("unable to found imported modul %s\n", ImportedName); - } - else - { - if (Module != ImportedModule) - { + if (!NT_SUCCESS(Status)) + { + DPRINT1("unable to found imported modul %s\n", ImportedName); + } + else + { + if (Module != ImportedModule) + { Status = LdrpUnloadModule(ImportedModule, FALSE); if (!NT_SUCCESS(Status)) - { - DPRINT1("unable to unload %s\n", ImportedName); - } - } - } - BoundImportDescriptorCurrent++; - } + { + DPRINT1("unable to unload %s\n", ImportedName); + } + } + } + BoundImportDescriptorCurrent++; + } } - else + else { ImportModuleDirectory = (PIMAGE_IMPORT_MODULE_DIRECTORY) - RtlImageDirectoryEntryToData(Module->BaseAddress, - TRUE, - IMAGE_DIRECTORY_ENTRY_IMPORT, - NULL); + RtlImageDirectoryEntryToData(Module->BaseAddress, + TRUE, + IMAGE_DIRECTORY_ENTRY_IMPORT, + NULL); if (ImportModuleDirectory) - { - /* dereferencing all imported modules, use the import descriptor */ - while (ImportModuleDirectory->dwRVAModuleName) - { - ImportedName = (PCHAR)Module->BaseAddress + ImportModuleDirectory->dwRVAModuleName; - TRACE_LDR("%wZ trys to unload %s\n", &Module->BaseDllName, ImportedName); + { + /* dereferencing all imported modules, use the import descriptor */ + while (ImportModuleDirectory->dwRVAModuleName) + { + ImportedName = (PCHAR)Module->BaseAddress + ImportModuleDirectory->dwRVAModuleName; + TRACE_LDR("%wZ trys to unload %s\n", &Module->BaseDllName, ImportedName); Status = LdrpGetOrLoadModule(NULL, ImportedName, &ImportedModule, FALSE); - if (!NT_SUCCESS(Status)) - { - DPRINT1("unable to found imported modul %s\n", ImportedName); - } - else - { - if (Module != ImportedModule) - { - Status = LdrpUnloadModule(ImportedModule, FALSE); - if (!NT_SUCCESS(Status)) - { - DPRINT1("unable to unload %s\n", ImportedName); - } - } - } - ImportModuleDirectory++; - } - } + if (!NT_SUCCESS(Status)) + { + DPRINT1("unable to found imported modul %s\n", ImportedName); + } + else + { + if (Module != ImportedModule) + { + Status = LdrpUnloadModule(ImportedModule, FALSE); + if (!NT_SUCCESS(Status)) + { + DPRINT1("unable to unload %s\n", ImportedName); + } + } + } + ImportModuleDirectory++; + } + } } } @@ -2293,16 +2305,16 @@ LdrDisableThreadCalloutsForDll(IN PVOID BaseAddress) RtlEnterCriticalSection (NtCurrentPeb()->LoaderLock); ModuleListHead = &NtCurrentPeb()->Ldr->InLoadOrderModuleList; Entry = ModuleListHead->Flink; - while (Entry != ModuleListHead) + while (Entry != ModuleListHead) { Module = CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList); DPRINT("BaseDllName %wZ BaseAddress %x\n", &Module->BaseDllName, Module->BaseAddress); - if (Module->BaseAddress == BaseAddress) - { - if (Module->TlsIndex == -1) - { + if (Module->BaseAddress == BaseAddress) + { + if (Module->TlsIndex == -1) + { Module->Flags |= DONT_CALL_FOR_THREAD; Status = STATUS_SUCCESS; } @@ -2329,7 +2341,7 @@ LdrGetDllHandle(IN PWCHAR Path OPTIONAL, TRACE_LDR("LdrGetDllHandle, searching for %wZ from %S\n", DllName, Path ? Path : L""); /* NULL is the current executable */ - if (DllName == NULL) + if (DllName == NULL) { *BaseAddress = ExeModule->BaseAddress; DPRINT("BaseAddress %x\n", *BaseAddress); @@ -2375,7 +2387,7 @@ LdrGetProcedureAddress (IN PVOID BaseAddress, /* by name */ *ProcedureAddress = LdrGetExportByName(BaseAddress, Name->Buffer, 0xffff); if (*ProcedureAddress != NULL) - { + { return STATUS_SUCCESS; } DPRINT("LdrGetProcedureAddress: Can't resolve symbol '%Z'\n", Name); @@ -2397,7 +2409,7 @@ LdrGetProcedureAddress (IN PVOID BaseAddress, /********************************************************************** * NAME LOCAL * LdrpDetachProcess - * + * * DESCRIPTION * Unload dll's which are no longer referenced from others dll's * @@ -2410,9 +2422,9 @@ LdrGetProcedureAddress (IN PVOID BaseAddress, * REVISIONS * * NOTE - * The loader lock must be held on enty. + * The loader lock must be held on enty. */ -static VOID +static VOID LdrpDetachProcess(BOOL UnloadAll) { PLIST_ENTRY ModuleListHead; @@ -2431,56 +2443,56 @@ LdrpDetachProcess(BOOL UnloadAll) { Module = CONTAINING_RECORD(Entry, LDR_MODULE, InInitializationOrderModuleList); if (((UnloadAll && Module->LoadCount <= 0) || Module->LoadCount == 0) && - Module->Flags & ENTRY_PROCESSED && - !(Module->Flags & UNLOAD_IN_PROGRESS)) + Module->Flags & ENTRY_PROCESSED && + !(Module->Flags & UNLOAD_IN_PROGRESS)) { Module->Flags |= UNLOAD_IN_PROGRESS; - if (Module == LdrpLastModule) - { - LdrpLastModule = NULL; - } + if (Module == LdrpLastModule) + { + LdrpLastModule = NULL; + } if (Module->Flags & PROCESS_ATTACH_CALLED) - { - TRACE_LDR("Unload %wZ - Calling entry point at %x\n", - &Module->BaseDllName, Module->EntryPoint); - LdrpCallDllEntry(Module, DLL_PROCESS_DETACH, (PVOID)(Module->LoadCount == -1 ? 1 : 0)); - } - else - { + { + TRACE_LDR("Unload %wZ - Calling entry point at %x\n", + &Module->BaseDllName, Module->EntryPoint); + LdrpCallDllEntry(Module, DLL_PROCESS_DETACH, (PVOID)(Module->LoadCount == -1 ? 1 : 0)); + } + else + { TRACE_LDR("Unload %wZ\n", &Module->BaseDllName); - } - Entry = ModuleListHead->Blink; - } + } + Entry = ModuleListHead->Blink; + } else { - Entry = Entry->Blink; - } + Entry = Entry->Blink; + } } - + if (CallingCount == 1) { Entry = ModuleListHead->Blink; while (Entry != ModuleListHead) { Module = CONTAINING_RECORD(Entry, LDR_MODULE, InInitializationOrderModuleList); - Entry = Entry->Blink; - if (Module->Flags & UNLOAD_IN_PROGRESS && - ((UnloadAll && Module->LoadCount >= 0) || Module->LoadCount == 0)) - { + Entry = Entry->Blink; + if (Module->Flags & UNLOAD_IN_PROGRESS && + ((UnloadAll && Module->LoadCount >= 0) || Module->LoadCount == 0)) + { /* remove the module entry from the list */ RemoveEntryList (&Module->InLoadOrderModuleList) RemoveEntryList (&Module->InInitializationOrderModuleList); - NtUnmapViewOfSection (NtCurrentProcess (), Module->BaseAddress); + NtUnmapViewOfSection (NtCurrentProcess (), Module->BaseAddress); NtClose (Module->SectionHandle); - TRACE_LDR("%wZ unloaded\n", &Module->BaseDllName); + TRACE_LDR("%wZ unloaded\n", &Module->BaseDllName); RtlFreeUnicodeString (&Module->FullDllName); RtlFreeUnicodeString (&Module->BaseDllName); RtlFreeHeap (RtlGetProcessHeap (), 0, Module); - } + } } } CallingCount--; @@ -2490,7 +2502,7 @@ LdrpDetachProcess(BOOL UnloadAll) /********************************************************************** * NAME LOCAL * LdrpAttachProcess - * + * * DESCRIPTION * Initialize all dll's which are prepered for loading * @@ -2524,26 +2536,26 @@ LdrpAttachProcess(VOID) { Module = CONTAINING_RECORD(Entry, LDR_MODULE, InInitializationOrderModuleList); if (!(Module->Flags & (LOAD_IN_PROGRESS|UNLOAD_IN_PROGRESS|ENTRY_PROCESSED))) - { - Module->Flags |= LOAD_IN_PROGRESS; + { + Module->Flags |= LOAD_IN_PROGRESS; TRACE_LDR("%wZ loaded - Calling init routine at %x for process attaching\n", - &Module->BaseDllName, Module->EntryPoint); - Result = LdrpCallDllEntry(Module, DLL_PROCESS_ATTACH, (PVOID)(Module->LoadCount == -1 ? 1 : 0)); + &Module->BaseDllName, Module->EntryPoint); + Result = LdrpCallDllEntry(Module, DLL_PROCESS_ATTACH, (PVOID)(Module->LoadCount == -1 ? 1 : 0)); if (!Result) { - Status = STATUS_DLL_INIT_FAILED; - break; - } - if (Module->Flags & IMAGE_DLL && Module->EntryPoint != 0) - { - Module->Flags |= PROCESS_ATTACH_CALLED|ENTRY_PROCESSED; - } - else - { - Module->Flags |= ENTRY_PROCESSED; - } + Status = STATUS_DLL_INIT_FAILED; + break; + } + if (Module->Flags & IMAGE_DLL && Module->EntryPoint != 0) + { + Module->Flags |= PROCESS_ATTACH_CALLED|ENTRY_PROCESSED; + } + else + { + Module->Flags |= ENTRY_PROCESSED; + } Module->Flags &= ~LOAD_IN_PROGRESS; - } + } Entry = Entry->Flink; } @@ -2566,7 +2578,7 @@ LdrShutdownProcess (VOID) * @implemented */ -NTSTATUS +NTSTATUS LdrpAttachThread (VOID) { PLIST_ENTRY ModuleListHead; @@ -2590,13 +2602,13 @@ LdrpAttachThread (VOID) while (Entry != ModuleListHead) { Module = CONTAINING_RECORD(Entry, LDR_MODULE, InInitializationOrderModuleList); - if (Module->Flags & PROCESS_ATTACH_CALLED && - !(Module->Flags & DONT_CALL_FOR_THREAD) && + 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); + { + 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; } @@ -2636,11 +2648,11 @@ LdrShutdownThread (VOID) Module = CONTAINING_RECORD(Entry, LDR_MODULE, InInitializationOrderModuleList); if (Module->Flags & PROCESS_ATTACH_CALLED && - !(Module->Flags & DONT_CALL_FOR_THREAD) && + !(Module->Flags & DONT_CALL_FOR_THREAD) && !(Module->Flags & UNLOAD_IN_PROGRESS)) { - TRACE_LDR("%wZ - Calling entry point at %x for thread detaching\n", - &Module->BaseDllName, Module->EntryPoint); + TRACE_LDR("%wZ - Calling entry point at %x for thread detaching\n", + &Module->BaseDllName, Module->EntryPoint); LdrpCallDllEntry(Module, DLL_THREAD_DETACH, NULL); } Entry = Entry->Blink; @@ -2762,7 +2774,7 @@ LdrQueryProcessModuleInformation(IN PMODULE_INFORMATION ModuleInformation OPTION static BOOLEAN LdrpCheckImageChecksum (IN PVOID BaseAddress, - IN ULONG ImageSize) + IN ULONG ImageSize) { PIMAGE_NT_HEADERS Header; PUSHORT Ptr; @@ -2785,9 +2797,9 @@ LdrpCheckImageChecksum (IN PVOID BaseAddress, { Sum += (ULONG)*Ptr; if (HIWORD(Sum) != 0) - { - Sum = LOWORD(Sum) + HIWORD(Sum); - } + { + Sum = LOWORD(Sum) + HIWORD(Sum); + } Ptr++; } @@ -2795,9 +2807,9 @@ LdrpCheckImageChecksum (IN PVOID BaseAddress, { Sum += (ULONG)*((PUCHAR)Ptr); if (HIWORD(Sum) != 0) - { - Sum = LOWORD(Sum) + HIWORD(Sum); - } + { + Sum = LOWORD(Sum) + HIWORD(Sum); + } } CalcSum = (USHORT)(LOWORD(Sum) + HIWORD(Sum)); @@ -2848,9 +2860,9 @@ LdrpCheckImageChecksum (IN PVOID BaseAddress, */ NTSTATUS STDCALL LdrVerifyImageMatchesChecksum (IN HANDLE FileHandle, - ULONG Unknown1, - ULONG Unknown2, - ULONG Unknown3) + ULONG Unknown1, + ULONG Unknown2, + ULONG Unknown3) { FILE_STANDARD_INFORMATION FileInfo; IO_STATUS_BLOCK IoStatusBlock; @@ -2863,12 +2875,12 @@ LdrVerifyImageMatchesChecksum (IN HANDLE FileHandle, DPRINT ("LdrVerifyImageMatchesChecksum() called\n"); Status = NtCreateSection (&SectionHandle, - SECTION_MAP_EXECUTE, - NULL, - NULL, - PAGE_EXECUTE, - SEC_COMMIT, - FileHandle); + SECTION_MAP_EXECUTE, + NULL, + NULL, + PAGE_EXECUTE, + SEC_COMMIT, + FileHandle); if (!NT_SUCCESS(Status)) { DPRINT1 ("NtCreateSection() failed (Status %lx)\n", Status); @@ -2878,15 +2890,15 @@ LdrVerifyImageMatchesChecksum (IN HANDLE FileHandle, ViewSize = 0; BaseAddress = NULL; Status = NtMapViewOfSection (SectionHandle, - NtCurrentProcess (), - &BaseAddress, - 0, - 0, - NULL, - &ViewSize, - ViewShare, - 0, - PAGE_EXECUTE); + NtCurrentProcess (), + &BaseAddress, + 0, + 0, + NULL, + &ViewSize, + ViewShare, + 0, + PAGE_EXECUTE); if (!NT_SUCCESS(Status)) { DPRINT1 ("NtMapViewOfSection() failed (Status %lx)\n", Status); @@ -2895,28 +2907,28 @@ LdrVerifyImageMatchesChecksum (IN HANDLE FileHandle, } Status = NtQueryInformationFile (FileHandle, - &IoStatusBlock, - &FileInfo, - sizeof (FILE_STANDARD_INFORMATION), - FileStandardInformation); + &IoStatusBlock, + &FileInfo, + sizeof (FILE_STANDARD_INFORMATION), + FileStandardInformation); if (!NT_SUCCESS(Status)) { DPRINT1 ("NtMapViewOfSection() failed (Status %lx)\n", Status); NtUnmapViewOfSection (NtCurrentProcess (), - BaseAddress); + BaseAddress); NtClose (SectionHandle); return Status; } Result = LdrpCheckImageChecksum (BaseAddress, - FileInfo.EndOfFile.u.LowPart); + FileInfo.EndOfFile.u.LowPart); if (Result == FALSE) { Status = STATUS_IMAGE_CHECKSUM_MISMATCH; } NtUnmapViewOfSection (NtCurrentProcess (), - BaseAddress); + BaseAddress); NtClose (SectionHandle); @@ -2942,11 +2954,11 @@ LdrVerifyImageMatchesChecksum (IN HANDLE FileHandle, */ NTSTATUS STDCALL LdrQueryImageFileExecutionOptions (IN PUNICODE_STRING SubKey, - IN PCWSTR ValueName, - IN ULONG Type, - OUT PVOID Buffer, - IN ULONG BufferSize, - OUT PULONG ReturnedLength OPTIONAL) + IN PCWSTR ValueName, + IN ULONG Type, + OUT PVOID Buffer, + IN ULONG BufferSize, + OUT PULONG ReturnedLength OPTIONAL) { PKEY_VALUE_PARTIAL_INFORMATION KeyInfo; OBJECT_ATTRIBUTES ObjectAttributes; @@ -2960,7 +2972,7 @@ LdrQueryImageFileExecutionOptions (IN PUNICODE_STRING SubKey, NTSTATUS Status; wcscpy (NameBuffer, - L"\\Registry\\Machine\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\"); + L"\\Registry\\Machine\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\"); Ptr = wcsrchr (SubKey->Buffer, L'\\'); if (Ptr == NULL) { @@ -2972,17 +2984,17 @@ LdrQueryImageFileExecutionOptions (IN PUNICODE_STRING SubKey, } wcscat (NameBuffer, Ptr); RtlInitUnicodeString (&KeyName, - NameBuffer); + NameBuffer); InitializeObjectAttributes (&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE, - NULL, - NULL); + &KeyName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); Status = NtOpenKey (&KeyHandle, - KEY_READ, - &ObjectAttributes); + KEY_READ, + &ObjectAttributes); if (!NT_SUCCESS(Status)) { DPRINT ("NtOpenKey() failed (Status %lx)\n", Status); @@ -2991,57 +3003,57 @@ LdrQueryImageFileExecutionOptions (IN PUNICODE_STRING SubKey, KeyInfoSize = sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 32; KeyInfo = RtlAllocateHeap (RtlGetProcessHeap(), - HEAP_ZERO_MEMORY, - KeyInfoSize); + HEAP_ZERO_MEMORY, + KeyInfoSize); RtlInitUnicodeString (&ValueNameString, - (PWSTR)ValueName); + (PWSTR)ValueName); Status = NtQueryValueKey (KeyHandle, - &ValueNameString, - KeyValuePartialInformation, - KeyInfo, - KeyInfoSize, - &ResultSize); + &ValueNameString, + KeyValuePartialInformation, + KeyInfo, + KeyInfoSize, + &ResultSize); if (Status == STATUS_BUFFER_OVERFLOW) { KeyInfoSize = sizeof(KEY_VALUE_PARTIAL_INFORMATION) + KeyInfo->DataLength; RtlFreeHeap (RtlGetProcessHeap(), - 0, - KeyInfo); + 0, + KeyInfo); KeyInfo = RtlAllocateHeap (RtlGetProcessHeap(), - HEAP_ZERO_MEMORY, - KeyInfoSize); + HEAP_ZERO_MEMORY, + KeyInfoSize); if (KeyInfo == NULL) - { - NtClose (KeyHandle); - return Status; - } + { + NtClose (KeyHandle); + return Status; + } Status = NtQueryValueKey (KeyHandle, - &ValueNameString, - KeyValuePartialInformation, - KeyInfo, - KeyInfoSize, - &ResultSize); + &ValueNameString, + KeyValuePartialInformation, + KeyInfo, + KeyInfoSize, + &ResultSize); } NtClose (KeyHandle); if (!NT_SUCCESS(Status)) { if (KeyInfo != NULL) - { - RtlFreeHeap (RtlGetProcessHeap(), - 0, - KeyInfo); - } + { + RtlFreeHeap (RtlGetProcessHeap(), + 0, + KeyInfo); + } return Status; } if (KeyInfo->Type != Type) { RtlFreeHeap (RtlGetProcessHeap(), - 0, - KeyInfo); + 0, + KeyInfo); return STATUS_OBJECT_TYPE_MISMATCH; } @@ -3055,12 +3067,12 @@ LdrQueryImageFileExecutionOptions (IN PUNICODE_STRING SubKey, ResultSize = KeyInfo->DataLength; } RtlCopyMemory (Buffer, - &KeyInfo->Data, - ResultSize); + &KeyInfo->Data, + ResultSize); RtlFreeHeap (RtlGetProcessHeap(), - 0, - KeyInfo); + 0, + KeyInfo); if (ReturnedLength != NULL) { From 07320b09dd148213c081350bf31d49bbbbc23f14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Wed, 2 Jun 2004 18:29:21 +0000 Subject: [PATCH 1305/1463] Patch by Pablo Borobia <pablog7@argentina.com> Work on clipboard. svn path=/trunk/; revision=9590 --- reactos/subsys/win32k/ntuser/clipboard.c | 164 ++++++++++++++++------- 1 file changed, 116 insertions(+), 48 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/clipboard.c b/reactos/subsys/win32k/ntuser/clipboard.c index 43d3053949e..2944d955d63 100644 --- a/reactos/subsys/win32k/ntuser/clipboard.c +++ b/reactos/subsys/win32k/ntuser/clipboard.c @@ -29,14 +29,23 @@ #define NDEBUG #include <debug.h> -#if 0 +#define CHECK_LOCK \ + if (ClipboardThread && ClipboardThread != PsGetWin32Thread()) \ + { \ + SetLastWin32Error(ERROR_LOCKED); \ + return FALSE; \ + } + PW32THREAD ClipboardThread; HWND ClipboardWindow; -#endif +HWND tempClipboardWindow; +HANDLE hCBData; +UINT uCBFormat; ULONG FASTCALL IntGetClipboardFormatName(UINT format, PUNICODE_STRING FormatName) { + return IntGetAtomName((RTL_ATOM)format, FormatName->Buffer, FormatName->MaximumLength); } @@ -44,44 +53,33 @@ IntGetClipboardFormatName(UINT format, PUNICODE_STRING FormatName) UINT FASTCALL IntEnumClipboardFormats(UINT format) { - UNIMPLEMENTED; - return 0; + + CHECK_LOCK + + if (!hCBData) + return FALSE; + //UNIMPLEMENTED; + return 1; } BOOL STDCALL NtUserOpenClipboard(HWND hWnd, DWORD Unknown1) { -#if 0 - if (ClipboardThread && ClipboardThread != PsGetWin32Thread()) - { - SetLastWin32Error(ERROR_LOCKED); - return FALSE; - } - ClipboardWindow = hWnd; + CHECK_LOCK + + tempClipboardWindow = hWnd; ClipboardThread = PsGetWin32Thread(); return TRUE; -#else - DPRINT1("NtUserOpenClipboard is unimplemented\n"); - return FALSE; -#endif } BOOL STDCALL NtUserCloseClipboard(VOID) { -#if 0 - if (ClipboardThread && ClipboardThread != PsGetWin32Thread()) - { - SetLastWin32Error(ERROR_LOCKED); - return FALSE; - } + CHECK_LOCK + ClipboardWindow = 0; ClipboardThread = NULL; return TRUE; -#else - UNIMPLEMENTED - return FALSE; -#endif } /* @@ -90,8 +88,11 @@ NtUserCloseClipboard(VOID) HWND STDCALL NtUserGetOpenClipboardWindow(VOID) { + /* UNIMPLEMENTED return 0; + */ + return ClipboardWindow; } BOOL STDCALL @@ -111,33 +112,50 @@ NtUserCountClipboardFormats(VOID) DWORD STDCALL NtUserEmptyClipboard(VOID) { - UNIMPLEMENTED - return 0; + CHECK_LOCK + +// if (!hCBData) +// return FALSE; + +// FIXME! +// GlobalUnlock(hCBData); +// GlobalFree(hCBData); + hCBData = NULL; + uCBFormat = 0; + ClipboardWindow = tempClipboardWindow; + + return TRUE; } HANDLE STDCALL NtUserGetClipboardData(UINT uFormat, DWORD Unknown1) { - UNIMPLEMENTED - return 0; + CHECK_LOCK + + if ((uFormat==1 && uCBFormat==13) || (uFormat==13 && uCBFormat==1)) + uCBFormat = uFormat; + + if (uFormat != uCBFormat) + return FALSE; + + return hCBData; } INT STDCALL NtUserGetClipboardFormatName(UINT format, PUNICODE_STRING FormatName, INT cchMaxCount) { -#if 1 NTSTATUS Status; PWSTR Buf; UNICODE_STRING SafeFormatName, BufFormatName; ULONG Ret; - + if((cchMaxCount < 1) || !FormatName) { SetLastWin32Error(ERROR_INVALID_PARAMETER); return 0; } - + /* copy the FormatName UNICODE_STRING structure */ Status = MmCopyFromCaller(&SafeFormatName, FormatName, sizeof(UNICODE_STRING)); if(!NT_SUCCESS(Status)) @@ -145,7 +163,7 @@ NtUserGetClipboardFormatName(UINT format, PUNICODE_STRING FormatName, SetLastNtError(Status); return 0; } - + /* Allocate memory for the string */ Buf = ExAllocatePoolWithTag(NonPagedPool, cchMaxCount * sizeof(WCHAR), TAG_STRING); if(!Buf) @@ -153,21 +171,29 @@ NtUserGetClipboardFormatName(UINT format, PUNICODE_STRING FormatName, SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); return 0; } - + /* Setup internal unicode string */ BufFormatName.Length = 0; BufFormatName.MaximumLength = min(cchMaxCount * sizeof(WCHAR), SafeFormatName.MaximumLength); BufFormatName.Buffer = Buf; - + if(BufFormatName.MaximumLength < sizeof(WCHAR)) { ExFreePool(Buf); SetLastWin32Error(ERROR_INVALID_PARAMETER); return 0; } - - Ret = IntGetClipboardFormatName(format, &BufFormatName); - + + if (format >= 0xC000) + { + Ret = IntGetClipboardFormatName(format, &BufFormatName); + } + else + { + SetLastNtError(NO_ERROR); + return 0; + } + /* copy the UNICODE_STRING buffer back to the user */ Status = MmCopyToCaller(SafeFormatName.Buffer, BufFormatName.Buffer, BufFormatName.MaximumLength); if(!NT_SUCCESS(Status)) @@ -176,10 +202,10 @@ NtUserGetClipboardFormatName(UINT format, PUNICODE_STRING FormatName, SetLastNtError(Status); return 0; } - + BufFormatName.MaximumLength = SafeFormatName.MaximumLength; BufFormatName.Buffer = SafeFormatName.Buffer; - + /* update the UNICODE_STRING structure (only the Length member should change) */ Status = MmCopyToCaller(FormatName, &BufFormatName, sizeof(UNICODE_STRING)); if(!NT_SUCCESS(Status)) @@ -188,12 +214,9 @@ NtUserGetClipboardFormatName(UINT format, PUNICODE_STRING FormatName, SetLastNtError(Status); return 0; } - + ExFreePool(Buf); return Ret; -#else - return IntGetClipboardFormatName(format, FormatName); -#endif } HWND STDCALL @@ -227,15 +250,60 @@ NtUserGetPriorityClipboardFormat(UINT *paFormatPriorityList, INT cFormats) BOOL STDCALL NtUserIsClipboardFormatAvailable(UINT format) { - DPRINT1("FIXME: NtUserIsClipboardFormatAvailable() is not implemented\n"); - return 0; + //UNIMPLEMENTED + + if (format != 1 && format != 13) { + DbgPrint("Clipboard Format unavailable (%d)\n", format); + return FALSE; + } + + if ((format==1 && uCBFormat==13) || (format==13 && uCBFormat==1)) + uCBFormat = format; + + if (format != uCBFormat) + return FALSE; + + return TRUE; } +//SetClipboardData(CF_UNICODETEXT, hdst); HANDLE STDCALL NtUserSetClipboardData(UINT uFormat, HANDLE hMem, DWORD Unknown2) { - UNIMPLEMENTED - return 0; +// LPVOID pMem; + CHECK_LOCK + + + if (uFormat != 1 && uFormat != 13) { + DbgPrint("Clipboard unsupported format (%d)\n", uFormat); + return FALSE; + } + + if (hMem) + { + uCBFormat = uFormat; + hCBData = hMem; + //pMem = GlobalLock(hMem); + /* + switch (uFormat) { + default: + DbgPrint("Clipboard unsupported format (%d)\n", uFormat); + return FALSE; + case CF_TEXT: // 1 + break; + case CF_UNICODETEXT: // 13 + break; + case CF_BITMAP: // 2 + break; + case CF_OEMTEXT: // 7 + break; + } */ + } + else + { + //the window provides data in the specified format + } + return hMem; } HWND STDCALL From a8943a8c916b767c25ff9f041cacadfadb7172d8 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" <hackbunny@reactos.org> Date: Wed, 2 Jun 2004 18:36:55 +0000 Subject: [PATCH 1306/1463] SEH library svn path=/trunk/; revision=9591 --- reactos/lib/pseh/.cvsignore | 2 + reactos/lib/pseh/framebased.c | 103 +++++++++++++++++++++++++++ reactos/lib/pseh/i386/.cvsignore | 2 + reactos/lib/pseh/i386/framebased.asm | 48 +++++++++++++ reactos/lib/pseh/makefile | 21 ++++++ reactos/lib/pseh/makefile.i386 | 5 ++ 6 files changed, 181 insertions(+) create mode 100644 reactos/lib/pseh/.cvsignore create mode 100644 reactos/lib/pseh/framebased.c create mode 100644 reactos/lib/pseh/i386/.cvsignore create mode 100644 reactos/lib/pseh/i386/framebased.asm create mode 100644 reactos/lib/pseh/makefile create mode 100644 reactos/lib/pseh/makefile.i386 diff --git a/reactos/lib/pseh/.cvsignore b/reactos/lib/pseh/.cvsignore new file mode 100644 index 00000000000..6142305dc12 --- /dev/null +++ b/reactos/lib/pseh/.cvsignore @@ -0,0 +1,2 @@ +*.o +*.d diff --git a/reactos/lib/pseh/framebased.c b/reactos/lib/pseh/framebased.c new file mode 100644 index 00000000000..1fe1cfef9d0 --- /dev/null +++ b/reactos/lib/pseh/framebased.c @@ -0,0 +1,103 @@ +#define STRICT +#define WIN32_LEAN_AND_MEAN +#include <windows.h> + +#include <pseh/framebased/internal.h> +#include <excpt.h> + +/* Assembly helpers, see i386/framebased.asm */ +extern void __cdecl _SEHCleanHandlerEnvironment(void); +extern void __cdecl _SEHRegisterFrame(_SEHRegistration_t *); +extern void __cdecl _SEHUnregisterFrame(const _SEHRegistration_t *); +extern void __cdecl _SEHUnwind(_SEHPortableFrame_t *); + +__declspec(noreturn) void __cdecl _SEHCallHandler(_SEHPortableFrame_t * frame) +{ + frame->SPF_Handling = 1; + _SEHUnwind(frame); + frame->SPF_Handlers->SH_Handler(frame); +} + +int __cdecl _SEHFrameHandler +( + struct _EXCEPTION_RECORD * ExceptionRecord, + void * EstablisherFrame, + struct _CONTEXT * ContextRecord, + void * DispatcherContext +) +{ + _SEHPortableFrame_t * frame; + + _SEHCleanHandlerEnvironment(); + + frame = EstablisherFrame; + + /* Unwinding */ + if(ExceptionRecord->ExceptionFlags & (4 | 2)) + { + if(frame->SPF_Handlers->SH_Finally && !frame->SPF_Handling) + frame->SPF_Handlers->SH_Finally(frame); + } + /* Handling */ + else + { + if(ExceptionRecord->ExceptionCode) + frame->SPF_Code = ExceptionRecord->ExceptionCode; + else + frame->SPF_Code = 0xC0000001; + + if(frame->SPF_Handlers->SH_Filter) + { + int ret; + + switch((UINT_PTR)frame->SPF_Handlers->SH_Filter) + { + case EXCEPTION_EXECUTE_HANDLER + 1: + case EXCEPTION_CONTINUE_SEARCH + 1: + case EXCEPTION_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; + } + } + + /* EXCEPTION_CONTINUE_EXECUTION */ + if(ret < 0) + return ExceptionContinueExecution; + /* EXCEPTION_EXECUTE_HANDLER */ + else if(ret > 0) + _SEHCallHandler(frame); + /* EXCEPTION_CONTINUE_SEARCH */ + else + /* fall through */; + } + } + + return ExceptionContinueSearch; +} + +void __stdcall _SEHEnter(_SEHPortableFrame_t * frame) +{ + frame->SPF_Registration.SER_Handler = _SEHFrameHandler; + frame->SPF_Code = 0; + frame->SPF_Handling = 0; + _SEHRegisterFrame(&frame->SPF_Registration); +} + +void __stdcall _SEHLeave(_SEHPortableFrame_t * frame) +{ + _SEHUnregisterFrame(&frame->SPF_Registration); +} + +/* EOF */ diff --git a/reactos/lib/pseh/i386/.cvsignore b/reactos/lib/pseh/i386/.cvsignore new file mode 100644 index 00000000000..6142305dc12 --- /dev/null +++ b/reactos/lib/pseh/i386/.cvsignore @@ -0,0 +1,2 @@ +*.o +*.d diff --git a/reactos/lib/pseh/i386/framebased.asm b/reactos/lib/pseh/i386/framebased.asm new file mode 100644 index 00000000000..f9201bdd6ad --- /dev/null +++ b/reactos/lib/pseh/i386/framebased.asm @@ -0,0 +1,48 @@ +cpu 486 +segment .text use32 + +global __SEHCleanHandlerEnvironment +__SEHCleanHandlerEnvironment: + cld + ret + +global __SEHRegisterFrame +__SEHRegisterFrame: + mov ecx, [esp+4] + mov eax, [fs:0] + mov [ecx+0], eax + mov [fs:0], ecx + ret + +global __SEHUnregisterFrame +__SEHUnregisterFrame: + mov ecx, [esp+4] + mov ecx, [ecx] + mov [fs:0], ecx + ret + +global __SEHUnwind +__SEHUnwind: + + extern RtlUnwind + + mov ecx, [esp+4] + +; RtlUnwind clobbers all the "don't clobber" registers, so we save them + push esi + push edi + push ebx + + push eax + push eax + push eax + push ecx + call RtlUnwind + + pop ebx + pop edi + pop esi + + ret + +; EOF diff --git a/reactos/lib/pseh/makefile b/reactos/lib/pseh/makefile new file mode 100644 index 00000000000..b64033639bd --- /dev/null +++ b/reactos/lib/pseh/makefile @@ -0,0 +1,21 @@ +# $Id: makefile,v 1.1 2004/06/02 18:36:55 hyperion Exp $ + +PATH_TO_TOP = ../.. + +TARGET_TYPE = library + +TARGET_NAME = pseh + +TARGET_CFLAGS += -D_DISABLE_TIDENTS -Werror -Wall -D__USE_W32API + +include $(PATH_TO_TOP)/config +include makefile.$(ARCH) + +TARGET_OBJECTS = framebased.o $(TARGET_ARCH_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/pseh/makefile.i386 b/reactos/lib/pseh/makefile.i386 new file mode 100644 index 00000000000..1fde404d8d8 --- /dev/null +++ b/reactos/lib/pseh/makefile.i386 @@ -0,0 +1,5 @@ +# $Id: makefile.i386,v 1.1 2004/06/02 18:36:55 hyperion Exp $ + +TARGET_ARCH_OBJECTS = $(ARCH)/framebased.o + +# EOF From 739c9c2b0ab7f3e97b4325b81d8402abe69cb66c Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" <hackbunny@reactos.org> Date: Wed, 2 Jun 2004 19:22:06 +0000 Subject: [PATCH 1307/1463] Added license text (MIT license) to the SEH library, added the header files svn path=/trunk/; revision=9592 --- reactos/include/pseh.h | 31 +++++ reactos/include/pseh/framebased.h | 134 +++++++++++++++++++++ reactos/include/pseh/framebased/internal.h | 85 +++++++++++++ reactos/lib/pseh/framebased.c | 22 ++++ reactos/lib/pseh/i386/framebased.asm | 20 +++ 5 files changed, 292 insertions(+) create mode 100644 reactos/include/pseh.h create mode 100644 reactos/include/pseh/framebased.h create mode 100644 reactos/include/pseh/framebased/internal.h diff --git a/reactos/include/pseh.h b/reactos/include/pseh.h new file mode 100644 index 00000000000..ac9eb500aa4 --- /dev/null +++ b/reactos/include/pseh.h @@ -0,0 +1,31 @@ +/* + 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_H_ +#define KJK_PSEH_H_ + +/* TODO: <pseh/native.h> to wrap native SEH implementations */ +#include <pseh/framebased.h> + +#endif + +/* EOF */ diff --git a/reactos/include/pseh/framebased.h b/reactos/include/pseh/framebased.h new file mode 100644 index 00000000000..7d76aa21d0b --- /dev/null +++ b/reactos/include/pseh/framebased.h @@ -0,0 +1,134 @@ +/* + 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_FRAMEBASED_H_ +#define KJK_PSEH_FRAMEBASED_H_ + +#include <pseh/framebased/internal.h> +#include <setjmp.h> +#include <stddef.h> +#include <excpt.h> + +typedef struct __SEHFrame +{ + _SEHPortableFrame_t SEH_Header; + jmp_buf SEH_JmpBuf; + void * SEH_Locals; +} +_SEHFrame_t; + +static void __stdcall _SEHCompilerSpecificHandler(_SEHPortableFrame_t * frame) +{ + _SEHFrame_t * myframe; + myframe = (_SEHFrame_t *)(((char *)frame) - offsetof(_SEHFrame_t, SEH_Header)); + longjmp(myframe->SEH_JmpBuf, 1); +} + +#define _SEH_FILTER(NAME_) \ + int __stdcall NAME_ \ + ( \ + struct _EXCEPTION_POINTERS * _SEHExceptionPointers, \ + struct __SEHPortableFrame * _SEHPortableFrame \ + ) + +#define _SEH_FINALLY(NAME_) \ + void __stdcall NAME_ \ + ( \ + struct __SEHPortableFrame * _SEHPortableFrame \ + ) + +#define _SEH_TRY_FINALLY(FINALLY_) \ + _SEH_TRY_FILTER_FINALLY \ + ( \ + (_SEHFilter_t)(EXCEPTION_CONTINUE_SEARCH + 1), \ + (FINALLY_) \ + ) + +#define _SEH_END_FINALLY _SEH_HANDLE _SEH_END + +#define _SEH_TRY_FILTER(FILTER_) \ + _SEH_TRY_FILTER_FINALLY((FILTER_), NULL) + +#define _SEH_TRY_HANDLE_FINALLY(FINALLY_) \ + _SEH_TRY_FILTER_FINALLY \ + ( \ + (_SEHFilter_t)(EXCEPTION_EXECUTE_HANDLER + 1), \ + (FINALLY_) \ + ) + +#define _SEH_TRY \ + _SEH_TRY_HANDLE_FINALLY(NULL) + +#define _SEH_TRY_FILTER_FINALLY(FILTER_, FINALLY_) \ + { \ + static const _SEHHandlers_t _SEHHandlers = \ + { \ + (FILTER_), \ + _SEHCompilerSpecificHandler, \ + (FINALLY_) \ + }; \ + \ + _SEHFrame_t _SEHFrame; \ + _SEHPortableFrame_t * _SEHPortableFrame; \ + \ + _SEHFrame.SEH_Header.SPF_Handlers = &_SEHHandlers; \ + \ + _SEHPortableFrame = &_SEHFrame.SEH_Header; \ + (void)_SEHPortableFrame; \ + \ + if(setjmp(_SEHFrame.SEH_JmpBuf) == 0) \ + { \ + _SEHEnter(&_SEHFrame.SEH_Header); \ + \ + do \ + { + +#define _SEH_HANDLE \ + \ + } \ + while(0); \ + \ + _SEHLeave(&_SEHFrame.SEH_Header); \ + } \ + else \ + { \ + _SEHLeave(&_SEHFrame.SEH_Header); \ + +#define _SEH_END \ + } \ + \ + if(_SEHHandlers.SH_Finally) \ + _SEHHandlers.SH_Finally(&_SEHFrame.SEH_Header); \ + } + +#define _SEH_LEAVE break + +#define _SEH_GetExceptionCode() (unsigned long)(_SEHPortableFrame->SPF_Code) + +#define _SEH_GetExceptionPointers() \ + ((struct _EXCEPTION_POINTERS *)_SEHExceptionPointers) + +#define _SEH_AbnormalTermination() (_SEHPortableFrame->SPF_Code != 0) + +#endif + +/* EOF */ diff --git a/reactos/include/pseh/framebased/internal.h b/reactos/include/pseh/framebased/internal.h new file mode 100644 index 00000000000..5f7e76645ac --- /dev/null +++ b/reactos/include/pseh/framebased/internal.h @@ -0,0 +1,85 @@ +/* + 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_FRAMEBASED_INTERNAL_H_ +#define KJK_PSEH_FRAMEBASED_INTERNAL_H_ + +struct _EXCEPTION_RECORD; +struct _EXCEPTION_POINTERS; +struct _CONTEXT; + +typedef int (__cdecl * _SEHFrameHandler_t) +( + struct _EXCEPTION_RECORD *, + void *, + struct _CONTEXT *, + void * +); + +typedef struct __SEHRegistration +{ + struct __SEHRegistration * SER_Prev; + _SEHFrameHandler_t SER_Handler; +} +_SEHRegistration_t; + +struct __SEHPortableFrame; + +typedef int (__stdcall * _SEHFilter_t) +( + struct _EXCEPTION_POINTERS *, + struct __SEHPortableFrame * +); + +typedef __declspec(noreturn) void (__stdcall * _SEHHandler_t) +( + struct __SEHPortableFrame * +); + +typedef void (__stdcall * _SEHFinally_t) +( + struct __SEHPortableFrame * +); + +typedef struct __SEHHandlers +{ + _SEHFilter_t SH_Filter; + _SEHHandler_t SH_Handler; + _SEHFinally_t SH_Finally; +} +_SEHHandlers_t; + +typedef struct __SEHPortableFrame +{ + _SEHRegistration_t SPF_Registration; + unsigned long SPF_Code; + int SPF_Handling; + const _SEHHandlers_t * SPF_Handlers; +} +_SEHPortableFrame_t; + +extern void __stdcall _SEHEnter(_SEHPortableFrame_t *); +extern void __stdcall _SEHLeave(_SEHPortableFrame_t *); + +#endif + +/* EOF */ diff --git a/reactos/lib/pseh/framebased.c b/reactos/lib/pseh/framebased.c index 1fe1cfef9d0..006a7f3fd9c 100644 --- a/reactos/lib/pseh/framebased.c +++ b/reactos/lib/pseh/framebased.c @@ -1,3 +1,25 @@ +/* + 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. +*/ + #define STRICT #define WIN32_LEAN_AND_MEAN #include <windows.h> diff --git a/reactos/lib/pseh/i386/framebased.asm b/reactos/lib/pseh/i386/framebased.asm index f9201bdd6ad..da61c207737 100644 --- a/reactos/lib/pseh/i386/framebased.asm +++ b/reactos/lib/pseh/i386/framebased.asm @@ -1,3 +1,23 @@ +; 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 dos 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. + cpu 486 segment .text use32 From 26916eed77a54024d4caa208c359a9c410cc3e85 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Wed, 2 Jun 2004 20:26:08 +0000 Subject: [PATCH 1308/1463] - Fixed the makefiles for the build on windows. svn path=/trunk/; revision=9593 --- freeldr/bootsect/Makefile | 22 ++++----- freeldr/freeldr/Makefile | 94 +++++++++++++++++++-------------------- freeldr/install/Makefile | 6 +-- freeldr/tools/Makefile | 17 ++++--- 4 files changed, 69 insertions(+), 70 deletions(-) diff --git a/freeldr/bootsect/Makefile b/freeldr/bootsect/Makefile index 4c0a10b843d..1f7467e9b20 100644 --- a/freeldr/bootsect/Makefile +++ b/freeldr/bootsect/Makefile @@ -17,7 +17,7 @@ # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # -BOOTCD_DIR = ..$(SEP)..$(SEP)bootcd +BOOTCD_DIR = ../../bootcd .PHONY : clean bootcd @@ -55,20 +55,20 @@ ext2.bin : ext2.asm .PHONY : bootcd bootcd: bootcd_dirs isoboot.bin $(CP) isoboot.bin $(BOOTCD_DIR) - $(CP) dosmbr.bin $(BOOTCD_DIR)$(SEP)disk$(SEP)loader - $(CP) ext2.bin $(BOOTCD_DIR)$(SEP)disk$(SEP)loader - $(CP) fat.bin $(BOOTCD_DIR)$(SEP)disk$(SEP)loader - $(CP) fat32.bin $(BOOTCD_DIR)$(SEP)disk$(SEP)loader - $(CP) isoboot.bin $(BOOTCD_DIR)$(SEP)disk$(SEP)loader + $(CP) dosmbr.bin $(BOOTCD_DIR)/disk/loader + $(CP) ext2.bin $(BOOTCD_DIR)/disk/loader + $(CP) fat.bin $(BOOTCD_DIR)/disk/loader + $(CP) fat32.bin $(BOOTCD_DIR)/disk/loader + $(CP) isoboot.bin $(BOOTCD_DIR)/disk/loader .PHONY : bootcd_dirs bootcd_dirs: $(MKDIR) $(BOOTCD_DIR) - $(MKDIR) $(BOOTCD_DIR)$(SEP)disk - $(MKDIR) $(BOOTCD_DIR)$(SEP)disk$(SEP)reactos - $(MKDIR) $(BOOTCD_DIR)$(SEP)disk$(SEP)install - $(MKDIR) $(BOOTCD_DIR)$(SEP)disk$(SEP)bootdisk - $(MKDIR) $(BOOTCD_DIR)$(SEP)disk$(SEP)loader + $(MKDIR) $(BOOTCD_DIR)/disk + $(MKDIR) $(BOOTCD_DIR)/disk/reactos + $(MKDIR) $(BOOTCD_DIR)/disk/install + $(MKDIR) $(BOOTCD_DIR)/disk/bootdisk + $(MKDIR) $(BOOTCD_DIR)/disk/loader clean: @-$(RM) *.bin diff --git a/freeldr/freeldr/Makefile b/freeldr/freeldr/Makefile index 5a619e9dc7b..ae7711c4317 100644 --- a/freeldr/freeldr/Makefile +++ b/freeldr/freeldr/Makefile @@ -27,33 +27,33 @@ TARGET = i386 DEBUG = no OBJDIR = obj -OUTPUT_DIR = $(OBJDIR)$(SEP)$(TARGET) +OUTPUT_DIR = $(OBJDIR)/$(TARGET) -BOOTCD_DIR = ..$(SEP)..$(SEP)bootcd +BOOTCD_DIR = ../../bootcd ############################################# # COMPILER AND LINKER PROGRAMS # -TOOLSDIR = $(SRCDIR)$(SEP)..$(SEP)tools +TOOLSDIR = $(SRCDIR)/../tools -RM = $(TOOLSDIR)$(SEP)rdel -CP = $(TOOLSDIR)$(SEP)rcopy -MKDIR = $(TOOLSDIR)$(SEP)rmkdir -RMDIR = $(TOOLSDIR)$(SEP)rrmdir +RM = $(subst /,$(SEP),$(TOOLSDIR))$(SEP)rdel +CP = $(subst /,$(SEP),$(TOOLSDIR))$(SEP)rcopy +MKDIR = $(subst /,$(SEP),$(TOOLSDIR))$(SEP)rmkdir +RMDIR = $(subst /,$(SEP),$(TOOLSDIR))$(SEP)rrmdir NASM_CMD = nasm OBJCOPY = objcopy -DEPTOOL = $(TOOLSDIR)$(SEP)deptool -HOSTTOOL = $(TOOLSDIR)$(SEP)hosttype +DEPTOOL = $(subst /,$(SEP),$(TOOLSDIR))$(SEP)deptool +HOSTTOOL = $(subst /,$(SEP),$(TOOLSDIR))$(SEP)hosttype TOOLS = $(DEPTOOL) $(HOSTTOOL) -HOSTTYPE = $(shell $(HOSTTOOL)) +HOSTTYPE = $(shell $(HOSTTOOL)) #----------------------------------------------------------------------------------------------------- # TEST IF WE ARE IN THE TARGET DIRECTORY # IF NOT WE WILL CHANGE TO THE TARGET DIRECTORY AND RUN MAKE FROM THERE #----------------------------------------------------------------------------------------------------- -#ifeq (,$(filter $(CURDIR)$(SEP)$(OUTPUT_DIR),$(notdir $(CURDIR)))) -ifneq ($(CURDIR), $(SRCDIR)$(SEP)$(OUTPUT_DIR)) +#ifeq (,$(filter $(CURDIR)/$(OUTPUT_DIR),$(notdir $(CURDIR)))) +ifneq ($(CURDIR), $(SRCDIR)/$(OUTPUT_DIR)) SRCDIR = $(CURDIR) @@ -63,10 +63,10 @@ SRCDIR = $(CURDIR) # VARIABLE TO CHANGE TO TARGET DIRECTORY AND INVOKE MAKE FROM THERE # MAKETARGET = $(MAKE) --no-print-directory -C $(OUTPUT_DIR) \ - -f ..$(SEP)..$(SEP)Makefile SRCDIR=$(CURDIR) $(MAKECMDGOALS) + -f ../../Makefile SRCDIR=$(CURDIR) $(MAKECMDGOALS) .PHONY: CHANGE_TO_TARGET -CHANGE_TO_TARGET setupldr : BUILD_TOOLS $(OBJDIR) $(OBJDIR)$(SEP)$(TARGET) +CHANGE_TO_TARGET setupldr : BUILD_TOOLS $(OBJDIR) $(OBJDIR)/$(TARGET) @echo Calculating source file dependencies... +@$(MAKETARGET) @@ -78,9 +78,9 @@ $(OBJDIR): @echo Creating directory: $(OBJDIR) @$(MKDIR) $(OBJDIR) -$(OBJDIR)$(SEP)$(TARGET): $(OBJDIR) - @echo Creating directory: $(OBJDIR)$(SEP)$(TARGET) - @$(MKDIR) $(OBJDIR)$(SEP)$(TARGET) +$(OBJDIR)/$(TARGET): $(OBJDIR) + @echo Creating directory: $(OBJDIR)/$(TARGET) + @$(MKDIR) $(OBJDIR)/$(TARGET) Makefile : ; @@ -92,10 +92,10 @@ Makefile : ; .PHONY : clean clean: @$(MAKE) --no-print-directory -C $(TOOLSDIR) - @echo Cleaning directory $(OBJDIR)$(SEP)$(TARGET) - @-$(RM) $(OBJDIR)$(SEP)$(TARGET)$(SEP)* - @echo Removing directory $(OBJDIR)$(SEP)$(TARGET) - @-$(RMDIR) $(OBJDIR)$(SEP)$(TARGET) + @echo Cleaning directory $(OBJDIR)/$(TARGET) + @-$(RM) $(OBJDIR)/$(TARGET)/* + @echo Removing directory $(OBJDIR)/$(TARGET) + @-$(RMDIR) $(OBJDIR)/$(TARGET) @-$(RMDIR) $(OBJDIR) @echo Clean ALL done. @@ -107,20 +107,20 @@ bootcd : bootcd_dirs setup_loader boot_loader .PHONY : bootcd_dirs bootcd_dirs: $(MKDIR) $(BOOTCD_DIR) - $(MKDIR) $(BOOTCD_DIR)$(SEP)disk - $(MKDIR) $(BOOTCD_DIR)$(SEP)disk$(SEP)reactos - $(MKDIR) $(BOOTCD_DIR)$(SEP)disk$(SEP)install - $(MKDIR) $(BOOTCD_DIR)$(SEP)disk$(SEP)bootdisk - $(MKDIR) $(BOOTCD_DIR)$(SEP)disk$(SEP)loader + $(MKDIR) $(BOOTCD_DIR)/disk + $(MKDIR) $(BOOTCD_DIR)/disk/reactos + $(MKDIR) $(BOOTCD_DIR)/disk/install + $(MKDIR) $(BOOTCD_DIR)/disk/bootdisk + $(MKDIR) $(BOOTCD_DIR)/disk/loader .PHONY : boot_loader -boot_loader : $(OBJDIR)$(SEP)$(TARGET)$(SEP)freeldr.sys - $(CP) $(OBJDIR)$(SEP)$(TARGET)$(SEP)freeldr.sys $(BOOTCD_DIR)$(SEP)disk$(SEP)loader$(SEP)freeldr.sys - $(CP) ..$(SEP)freeldr.ini $(BOOTCD_DIR)$(SEP)disk$(SEP)loader$(SEP)freeldr.ini +boot_loader : $(OBJDIR)/$(TARGET)/freeldr.sys + $(CP) $(OBJDIR)/$(TARGET)/freeldr.sys $(BOOTCD_DIR)/disk/loader/freeldr.sys + $(CP) ../freeldr.ini $(BOOTCD_DIR)/disk/loader/freeldr.ini .PHONY : setup_loader -setup_loader : $(OBJDIR)$(SEP)$(TARGET)$(SEP)setupldr.sys - $(CP) $(OBJDIR)$(SEP)$(TARGET)$(SEP)setupldr.sys $(BOOTCD_DIR)$(SEP)disk$(SEP)loader$(SEP)setupldr.sys +setup_loader : $(OBJDIR)/$(TARGET)/setupldr.sys + $(CP) $(OBJDIR)/$(TARGET)/setupldr.sys $(BOOTCD_DIR)/disk/loader/setupldr.sys ############################################# @@ -149,7 +149,7 @@ COMPILER_DEFINES = -D__$(TARGET)__ $(COMPILER_DEBUG_DEFINES) ############################################# # INCLUDE DIRECTORY OPTIONS # -COMPILER_INCLUDES = -I$(SRCDIR)$(SEP)include +COMPILER_INCLUDES = -I$(SRCDIR)/include ############################################# # COMPILER FLAGS @@ -321,21 +321,21 @@ ALL_OBJS = $(COMMON_OBJS) \ ############################################# # SET THE VPATH SO MAKE CAN FIND THE SOURCE FILES # -VPATH = $(SRCDIR)$(SEP) \ - $(SRCDIR)$(SEP)arch$(SEP)$(TARGET) \ - $(SRCDIR)$(SEP)rtl \ - $(SRCDIR)$(SEP)fs \ - $(SRCDIR)$(SEP)ui \ - $(SRCDIR)$(SEP)reactos \ - $(SRCDIR)$(SEP)comm \ - $(SRCDIR)$(SEP)disk \ - $(SRCDIR)$(SEP)mm \ - $(SRCDIR)$(SEP)cache \ - $(SRCDIR)$(SEP)inifile \ - $(SRCDIR)$(SEP)inffile \ - $(SRCDIR)$(SEP)video \ - $(SRCDIR)$(SEP)math \ - $(SRCDIR)$(SEP)include +VPATH = $(SRCDIR)/ \ + $(SRCDIR)/arch/$(TARGET) \ + $(SRCDIR)/rtl \ + $(SRCDIR)/fs \ + $(SRCDIR)/ui \ + $(SRCDIR)/reactos \ + $(SRCDIR)/comm \ + $(SRCDIR)/disk \ + $(SRCDIR)/mm \ + $(SRCDIR)/cache \ + $(SRCDIR)/inifile \ + $(SRCDIR)/inffile \ + $(SRCDIR)/video \ + $(SRCDIR)/math \ + $(SRCDIR)/include ############################################# diff --git a/freeldr/install/Makefile b/freeldr/install/Makefile index 70231683ed8..6a0b4119b38 100644 --- a/freeldr/install/Makefile +++ b/freeldr/install/Makefile @@ -25,10 +25,10 @@ LIBS = -lkernel32 .PHONY : clean -all: ..$(SEP)bootsect$(SEP)fat.h ..$(SEP)bootsect$(SEP)fat32.h install.exe +all: ../bootsect/fat.h ../bootsect/fat32.h install.exe -..$(SEP)bootsect$(SEP)fat.h ..$(SEP)bootsect$(SEP)fat32.h : - @$(MAKE) --no-print-directory -C ..$(SEP)bootsect +../bootsect/fat.h ../bootsect/fat32.h : + @$(MAKE) --no-print-directory -C ../bootsect install.exe: $(OBJS) @echo ===================================================== LINKING install diff --git a/freeldr/tools/Makefile b/freeldr/tools/Makefile index 4311925a915..47a7b0c9876 100644 --- a/freeldr/tools/Makefile +++ b/freeldr/tools/Makefile @@ -31,13 +31,13 @@ endif ############################################# -TOOLS = deptool \ - bin2c \ - hosttype \ - rdel \ - rcopy \ - rmkdir \ - rrmdir +TOOLS = deptool$(EXE_POSTFIX) \ + bin2c$(EXE_POSTFIX) \ + hosttype$(EXE_POSTFIX) \ + rdel$(EXE_POSTFIX) \ + rcopy$(EXE_POSTFIX) \ + rmkdir$(EXE_POSTFIX) \ + rrmdir$(EXE_POSTFIX) ############################################# @@ -48,7 +48,7 @@ all : $(TOOLS) ############################################# -%: %.c +%$(EXE_POSTFIX): %.c @echo ===================================================== Compiling $* @$(CC) -Wall -O3 -o $@ $< @@ -58,5 +58,4 @@ all : $(TOOLS) .PHONY : clean clean: @-$(RM) $(TOOLS) - @-$(RM) *.exe @echo Clean ALL done. From e0027b1777f142b3b996092aeae1bfb9e8f29766 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Wed, 2 Jun 2004 20:30:56 +0000 Subject: [PATCH 1309/1463] - Fixed the searching for boot load drivers. This solves the pci driver loading problem. svn path=/trunk/; revision=9594 --- reactos/ntoskrnl/io/driver.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/io/driver.c b/reactos/ntoskrnl/io/driver.c index 2fb3553c359..f6b89bc0fab 100644 --- a/reactos/ntoskrnl/io/driver.c +++ b/reactos/ntoskrnl/io/driver.c @@ -1,4 +1,4 @@ -/* $Id: driver.c,v 1.45 2004/04/12 15:22:53 navaraf Exp $ +/* $Id: driver.c,v 1.46 2004/06/02 20:30:56 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -444,7 +444,7 @@ IopLoadServiceModule( for (i = 1; i < KeLoaderBlock.ModsCount; i++) { ModuleName = (PCHAR)KeLoaderModules[i].String; - if (!strcmp(ModuleName, SearchName)) + if (!_stricmp(ModuleName, SearchName)) { DPRINT("Initializing boot module\n"); From d311d3a57f2d2fa80b39af346edd5026e966c24b Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Wed, 2 Jun 2004 20:37:46 +0000 Subject: [PATCH 1310/1463] Keep zero-initialized varaibles in the .data section. svn path=/trunk/; revision=9595 --- freeldr/freeldr/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/freeldr/freeldr/Makefile b/freeldr/freeldr/Makefile index ae7711c4317..7fb88ab8c70 100644 --- a/freeldr/freeldr/Makefile +++ b/freeldr/freeldr/Makefile @@ -132,7 +132,8 @@ else ############################################# # COMPILER COMMAND LINE OPTIONS # -COMPILER_OPTIONS = -Wall -nostdlib -nostdinc -ffreestanding -fno-builtin -fno-inline -O1 -MD +COMPILER_OPTIONS = -Wall -nostdlib -nostdinc -ffreestanding -fno-builtin -fno-inline \ + -fno-zero-initialized-in-bss -O1 -MD # FreeLoader does not use any of the standard libraries, includes, or built-in functions ############################################# From f4722681861b16f8ae11f375866c9bd99eb3bf08 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Wed, 2 Jun 2004 22:18:06 +0000 Subject: [PATCH 1311/1463] Set selected keyboard layout and install language. svn path=/trunk/; revision=9596 --- reactos/subsys/system/usetup/settings.c | 104 ++++++++++++++++++++- reactos/subsys/system/usetup/usetup.c | 115 ++++++++++++------------ 2 files changed, 161 insertions(+), 58 deletions(-) diff --git a/reactos/subsys/system/usetup/settings.c b/reactos/subsys/system/usetup/settings.c index 6c2a3437b02..b5ed5122620 100644 --- a/reactos/subsys/system/usetup/settings.c +++ b/reactos/subsys/system/usetup/settings.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: settings.c,v 1.1 2004/05/30 14:54:02 ekohl Exp $ +/* $Id: settings.c,v 1.2 2004/06/02 22:18:06 ekohl Exp $ * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS text-mode setup * FILE: subsys/system/usetup/settings.c @@ -250,6 +250,108 @@ CreateKeyboardLayoutList(HINF InfFile) BOOLEAN ProcessKeyboardLayoutRegistry(PGENERIC_LIST List) { + PGENERIC_LIST_ENTRY Entry; + PWCHAR LanguageId; + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING KeyName; + UNICODE_STRING ValueName; + HANDLE KeyHandle; + NTSTATUS Status; + + Entry = GetGenericListEntry(List); + if (Entry == NULL) + return FALSE; + + LanguageId = (PWCHAR)Entry->UserData; + if (LanguageId == NULL) + return FALSE; + + /* Open the nls language key */ + RtlInitUnicodeString(&KeyName, + L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\NLS\\Language"); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtOpenKey(&KeyHandle, + KEY_ALL_ACCESS, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT1("NtOpenKey() failed (Status %lx)\n", Status); + return FALSE; + } + + /* Set default language */ + RtlInitUnicodeString(&ValueName, + L"Default"); + Status = NtSetValueKey (KeyHandle, + &ValueName, + 0, + REG_SZ, + (PVOID)(LanguageId + 4), + 8); + if (!NT_SUCCESS(Status)) + { + DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status); + NtClose(KeyHandle); + return FALSE; + } + + /* Set install language */ + RtlInitUnicodeString(&ValueName, + L"InstallLanguage"); + Status = NtSetValueKey (KeyHandle, + &ValueName, + 0, + REG_SZ, + (PVOID)(LanguageId + 4), + 8); + if (!NT_SUCCESS(Status)) + { + DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status); + NtClose(KeyHandle); + return FALSE; + } + + NtClose(KeyHandle); + + /* Open the nls locale key */ + RtlInitUnicodeString(&KeyName, + L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\NLS\\Locale"); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtOpenKey(&KeyHandle, + KEY_ALL_ACCESS, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT1("NtOpenKey() failed (Status %lx)\n", Status); + return FALSE; + } + + /* Set default locale */ + RtlInitUnicodeString(&ValueName, + L"(Default)"); + Status = NtSetValueKey (KeyHandle, + &ValueName, + 0, + REG_SZ, + (PVOID)LanguageId, + 16); + if (!NT_SUCCESS(Status)) + { + DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status); + NtClose(KeyHandle); + return FALSE; + } + + NtClose(KeyHandle); + return TRUE; } diff --git a/reactos/subsys/system/usetup/usetup.c b/reactos/subsys/system/usetup/usetup.c index a4ee4840d09..66db83a375e 100644 --- a/reactos/subsys/system/usetup/usetup.c +++ b/reactos/subsys/system/usetup/usetup.c @@ -2447,8 +2447,10 @@ FormatPartitionPage (PINPUT_RECORD Ir) return QUIT_PAGE; } +#ifndef NDEBUG SetStatusText (" Done. Press any key ..."); ConInKey(Ir); +#endif return INSTALL_DIRECTORY_PAGE; } @@ -2665,7 +2667,9 @@ InstallDirectoryPage(PINPUT_RECORD Ir) static BOOLEAN -PrepareCopyPageInfFile(HINF InfFile, PWCHAR SourceCabinet, PINPUT_RECORD Ir) +PrepareCopyPageInfFile(HINF InfFile, + PWCHAR SourceCabinet, + PINPUT_RECORD Ir) { WCHAR PathBuffer[MAX_PATH]; INFCONTEXT FilesContext; @@ -2874,10 +2878,6 @@ PrepareCopyPage(PINPUT_RECORD Ir) SetTextXY(6, 8, "Setup prepares your computer for copying the ReactOS files. "); - - /* - * Build the file copy list - */ SetStatusText(" Building the file copy list..."); /* Create the file queue */ @@ -2898,32 +2898,17 @@ PrepareCopyPage(PINPUT_RECORD Ir) } } - if (!PrepareCopyPageInfFile(SetupInf, NULL, Ir)) { - return(QUIT_PAGE); + return QUIT_PAGE; } - /* Search for the 'Cabinets' section */ if (!InfFindFirstLine (SetupInf, L"Cabinets", NULL, &CabinetsContext)) { - PopupError("Setup failed to find the 'Cabinets' section\n" - "in TXTSETUP.SIF.\n", - "ENTER = Reboot computer"); - - while(TRUE) - { - ConInKey(Ir); - - if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ - { - return(QUIT_PAGE); - } - } + return FILE_COPY_PAGE; } - /* * Enumerate the directory values in the 'Cabinets' * section and parse their inf files. @@ -2957,7 +2942,7 @@ PrepareCopyPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -2975,7 +2960,7 @@ PrepareCopyPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -2995,7 +2980,7 @@ PrepareCopyPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -3004,12 +2989,12 @@ PrepareCopyPage(PINPUT_RECORD Ir) if (!PrepareCopyPageInfFile(InfHandle, KeyValue, Ir)) { - return(QUIT_PAGE); + return QUIT_PAGE; } } while (InfFindNextLine (&CabinetsContext, &CabinetsContext)); - return(FILE_COPY_PAGE); + return FILE_COPY_PAGE; } @@ -3046,7 +3031,7 @@ FileCopyCallback(PVOID Context, break; } - return(0); + return 0; } @@ -3080,7 +3065,7 @@ FileCopyPage(PINPUT_RECORD Ir) DestroyProgressBar(CopyContext.ProgressBar); - return(REGISTRY_PAGE); + return REGISTRY_PAGE; } @@ -3088,13 +3073,11 @@ static PAGE_NUMBER RegistryPage(PINPUT_RECORD Ir) { INFCONTEXT InfContext; - NTSTATUS Status; - PWSTR Action; PWSTR File; PWSTR Section; BOOLEAN Delete; - + NTSTATUS Status; SetTextXY(6, 8, "Setup is updating the system configuration"); @@ -3112,7 +3095,7 @@ RegistryPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -3131,7 +3114,7 @@ RegistryPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -3151,7 +3134,7 @@ RegistryPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -3181,7 +3164,7 @@ RegistryPage(PINPUT_RECORD Ir) if (!ImportRegistryFile(File, Section, Delete)) { - DPRINT1("Importing %S failed\n", File); + DPRINT("Importing %S failed\n", File); PopupError("Setup failed to import a hive file.", "ENTER = Reboot computer"); @@ -3192,16 +3175,34 @@ RegistryPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } } while (InfFindNextLine (&InfContext, &InfContext)); + /* Update keyboard layout settings */ + SetStatusText(" Updating keyboard layout settings..."); + if (!ProcessKeyboardLayoutRegistry(LayoutList)) + { + PopupError("Setup failed to update keyboard layout settings.", + "ENTER = Reboot computer"); + + while(TRUE) + { + ConInKey(Ir); + + if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ + { + return QUIT_PAGE; + } + } + } + SetStatusText(" Done..."); - return(BOOT_LOADER_PAGE); + return BOOT_LOADER_PAGE; } @@ -3228,7 +3229,7 @@ BootLoaderPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -3247,7 +3248,7 @@ BootLoaderPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -3265,7 +3266,7 @@ BootLoaderPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -3283,7 +3284,7 @@ BootLoaderPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -3323,7 +3324,7 @@ BootLoaderPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -3350,7 +3351,7 @@ BootLoaderPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -3381,7 +3382,7 @@ BootLoaderPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -3410,7 +3411,7 @@ BootLoaderPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -3436,7 +3437,7 @@ BootLoaderPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -3462,7 +3463,7 @@ BootLoaderPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -3494,7 +3495,7 @@ BootLoaderPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -3521,7 +3522,7 @@ BootLoaderPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -3546,7 +3547,7 @@ BootLoaderPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -3573,7 +3574,7 @@ BootLoaderPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -3598,7 +3599,7 @@ BootLoaderPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -3624,7 +3625,7 @@ BootLoaderPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -3655,7 +3656,7 @@ BootLoaderPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -3682,7 +3683,7 @@ BootLoaderPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } @@ -3707,7 +3708,7 @@ BootLoaderPage(PINPUT_RECORD Ir) if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return(QUIT_PAGE); + return QUIT_PAGE; } } } From ecc193a6f040c14840511ae09e6ec90922c42748 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Wed, 2 Jun 2004 22:19:54 +0000 Subject: [PATCH 1312/1463] Revert useless changes. svn path=/trunk/; revision=9597 --- freeldr/freeldr/inifile/parse.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/freeldr/freeldr/inifile/parse.c b/freeldr/freeldr/inifile/parse.c index b229d82277c..329b197893e 100644 --- a/freeldr/freeldr/inifile/parse.c +++ b/freeldr/freeldr/inifile/parse.c @@ -41,10 +41,6 @@ BOOL IniParseFile(PUCHAR IniFileData, U32 IniFileSize) DbgPrint((DPRINT_INIFILE, "IniParseFile() IniFileSize: %d\n", IniFileSize)); - IniFileSectionListHead = NULL; - IniFileSectionCount = 0; - IniFileSettingCount = 0; - // Start with an 80-byte buffer IniFileLineSize = 80; IniFileLine = MmAllocateMemory(IniFileLineSize); From ce86f5b57626201b17413ac8820fa386d6beb82c Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" <hackbunny@reactos.org> Date: Thu, 3 Jun 2004 02:23:34 +0000 Subject: [PATCH 1313/1463] Final touches to the SEH library: now comes with a very basic setjmp/longjmp implementation for when the compiler's native one can't be used svn path=/trunk/; revision=9598 --- reactos/include/pseh/framebased.h | 10 ++++- reactos/include/pseh/setjmp.h | 44 +++++++++++++++++++++ reactos/lib/pseh/i386/setjmp.asm | 65 +++++++++++++++++++++++++++++++ reactos/lib/pseh/makefile.i386 | 4 +- 4 files changed, 120 insertions(+), 3 deletions(-) create mode 100644 reactos/include/pseh/setjmp.h create mode 100644 reactos/lib/pseh/i386/setjmp.asm diff --git a/reactos/include/pseh/framebased.h b/reactos/include/pseh/framebased.h index 7d76aa21d0b..085550bfc4c 100644 --- a/reactos/include/pseh/framebased.h +++ b/reactos/include/pseh/framebased.h @@ -24,9 +24,17 @@ #define KJK_PSEH_FRAMEBASED_H_ #include <pseh/framebased/internal.h> +#include <excpt.h> + +#ifdef _SEH_NO_NATIVE_NLG #include <setjmp.h> #include <stddef.h> -#include <excpt.h> +#else +#include <pseh/setjmp.h> +#define longjmp _SEHLongJmp +#define setjmp _SEHSetJmp +#define jmp_buf _SEHJmpBuf_t +#endif typedef struct __SEHFrame { diff --git a/reactos/include/pseh/setjmp.h b/reactos/include/pseh/setjmp.h new file mode 100644 index 00000000000..ef17bc68599 --- /dev/null +++ b/reactos/include/pseh/setjmp.h @@ -0,0 +1,44 @@ +/* + 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_SETJMP_H_ +#define KJK_PSEH_SETJMP_H_ + +#ifdef _M_IX86 +typedef struct __SEHJmpBuf +{ + unsigned long JB_Ebp; + unsigned long JB_Esp; + unsigned long JB_Eip; + unsigned long JB_Ebx; + unsigned long JB_Esi; + unsigned long JB_Edi; +} +_SEHJmpBuf_t[1]; +#endif + +extern __declspec(noreturn) void __stdcall _SEHLongJmp(_SEHJmpBuf_t, int); +extern int __stdcall _SEHSetJmp(_SEHJmpBuf_t); + +#endif + +/* EOF */ diff --git a/reactos/lib/pseh/i386/setjmp.asm b/reactos/lib/pseh/i386/setjmp.asm new file mode 100644 index 00000000000..43431bac412 --- /dev/null +++ b/reactos/lib/pseh/i386/setjmp.asm @@ -0,0 +1,65 @@ +; 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 dos 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. + +cpu 486 +segment .text use32 + +global SEHSetJmp +global __SEHSetJmp +SEHSetJmp: +__SEHSetJmp@8: + ; jump buffer + mov eax, [esp+4] + + ; program counter + mov ecx, [esp+0] + + ; stack pointer + lea edx, [esp+4] + + ; fill the jump buffer + mov [eax+0], ebp + mov [eax+4], edx + mov [eax+8], ecx + mov [eax+12], ebx + mov [eax+16], esi + mov [eax+20], edi + ret 4 + +global SEHLongJmp +global __SEHLongJmp@8 +SEHLongJmp: +__SEHLongJmp@8: + ; return value + mov eax, [esp+8] + + ; jump buffer + mov ecx, [esp+4] + + ; restore the saved context + mov ebp, [ecx+0] + mov esp, [ecx+4] + mov edx, [ecx+8] + mov ebx, [ecx+12] + mov esi, [ecx+16] + mov edi, [ecx+20] + jmp edx + +; EOF diff --git a/reactos/lib/pseh/makefile.i386 b/reactos/lib/pseh/makefile.i386 index 1fde404d8d8..09e802f0e3d 100644 --- a/reactos/lib/pseh/makefile.i386 +++ b/reactos/lib/pseh/makefile.i386 @@ -1,5 +1,5 @@ -# $Id: makefile.i386,v 1.1 2004/06/02 18:36:55 hyperion Exp $ +# $Id: makefile.i386,v 1.2 2004/06/03 02:23:34 hyperion Exp $ -TARGET_ARCH_OBJECTS = $(ARCH)/framebased.o +TARGET_ARCH_OBJECTS = $(ARCH)/framebased.o $(ARCH)/setjmp.o # EOF From cb341561afe600adb5af9450183a69eed2de7c90 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" <hackbunny@reactos.org> Date: Thu, 3 Jun 2004 03:09:01 +0000 Subject: [PATCH 1314/1463] Corrected a stupid mistake Modified the build system to make kernel-mode components use the SEH library's built-in setjmp/longjmp svn path=/trunk/; revision=9599 --- reactos/include/pseh/framebased.h | 6 +++--- reactos/tools/helper.mk | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/reactos/include/pseh/framebased.h b/reactos/include/pseh/framebased.h index 085550bfc4c..20725cd0b72 100644 --- a/reactos/include/pseh/framebased.h +++ b/reactos/include/pseh/framebased.h @@ -27,13 +27,13 @@ #include <excpt.h> #ifdef _SEH_NO_NATIVE_NLG -#include <setjmp.h> -#include <stddef.h> -#else #include <pseh/setjmp.h> #define longjmp _SEHLongJmp #define setjmp _SEHSetJmp #define jmp_buf _SEHJmpBuf_t +#else +#include <setjmp.h> +#include <stddef.h> #endif typedef struct __SEHFrame diff --git a/reactos/tools/helper.mk b/reactos/tools/helper.mk index 63ddc653dda..7bad4a6e9e9 100644 --- a/reactos/tools/helper.mk +++ b/reactos/tools/helper.mk @@ -1,4 +1,4 @@ -# $Id: helper.mk,v 1.65 2004/06/02 18:24:09 hyperion Exp $ +# $Id: helper.mk,v 1.66 2004/06/03 03:09:01 hyperion Exp $ # # Helper makefile for ReactOS modules # Variables this makefile accepts: @@ -583,6 +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 + MK_CPPFLAGS += -D_SEH_NO_NATIVE_NLG endif From 6ce11dc87856448d1128be21add627235c00c403 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" <hackbunny@reactos.org> Date: Thu, 3 Jun 2004 04:14:07 +0000 Subject: [PATCH 1315/1463] Small fixes to the SEH library svn path=/trunk/; revision=9600 --- reactos/include/pseh/framebased.h | 5 ++++- reactos/lib/pseh/i386/framebased.asm | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/reactos/include/pseh/framebased.h b/reactos/include/pseh/framebased.h index 20725cd0b72..3e7c79ec291 100644 --- a/reactos/include/pseh/framebased.h +++ b/reactos/include/pseh/framebased.h @@ -44,7 +44,10 @@ typedef struct __SEHFrame } _SEHFrame_t; -static void __stdcall _SEHCompilerSpecificHandler(_SEHPortableFrame_t * frame) +static __declspec(noreturn) void __stdcall _SEHCompilerSpecificHandler +( + _SEHPortableFrame_t * frame +) { _SEHFrame_t * myframe; myframe = (_SEHFrame_t *)(((char *)frame) - offsetof(_SEHFrame_t, SEH_Header)); diff --git a/reactos/lib/pseh/i386/framebased.asm b/reactos/lib/pseh/i386/framebased.asm index da61c207737..109b0b580cc 100644 --- a/reactos/lib/pseh/i386/framebased.asm +++ b/reactos/lib/pseh/i386/framebased.asm @@ -44,7 +44,7 @@ __SEHUnregisterFrame: global __SEHUnwind __SEHUnwind: - extern RtlUnwind + extern _RtlUnwind@16 mov ecx, [esp+4] @@ -57,7 +57,7 @@ __SEHUnwind: push eax push eax push ecx - call RtlUnwind + call _RtlUnwind@16 pop ebx pop edi From 1d286fa480a9b9109b17f5eb5e2bbc1ad9555dae Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" <hackbunny@reactos.org> Date: Thu, 3 Jun 2004 04:15:40 +0000 Subject: [PATCH 1316/1463] Small test case for the SEH library svn path=/trunk/; revision=9601 --- reactos/apps/tests/pseh/.cvsignore | 6 ++ reactos/apps/tests/pseh/Makefile | 23 ++++++ reactos/apps/tests/pseh/pseh.c | 128 +++++++++++++++++++++++++++++ 3 files changed, 157 insertions(+) create mode 100644 reactos/apps/tests/pseh/.cvsignore create mode 100644 reactos/apps/tests/pseh/Makefile create mode 100644 reactos/apps/tests/pseh/pseh.c diff --git a/reactos/apps/tests/pseh/.cvsignore b/reactos/apps/tests/pseh/.cvsignore new file mode 100644 index 00000000000..d63774a7353 --- /dev/null +++ b/reactos/apps/tests/pseh/.cvsignore @@ -0,0 +1,6 @@ +*.o +*.d +*.exe +*.coff +*.sym +*.map diff --git a/reactos/apps/tests/pseh/Makefile b/reactos/apps/tests/pseh/Makefile new file mode 100644 index 00000000000..2d19be7c6a5 --- /dev/null +++ b/reactos/apps/tests/pseh/Makefile @@ -0,0 +1,23 @@ +# $Id: Makefile,v 1.1 2004/06/03 04:15:40 hyperion Exp $ + +PATH_TO_TOP = ../../.. + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = console + +TARGET_NAME = pseh + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_CFLAGS = -Wall -Werror -D__USE_W32API + +TARGET_SDKLIBS = pseh.a + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/reactos/apps/tests/pseh/pseh.c b/reactos/apps/tests/pseh/pseh.c new file mode 100644 index 00000000000..445e7a8efd9 --- /dev/null +++ b/reactos/apps/tests/pseh/pseh.c @@ -0,0 +1,128 @@ +#include <assert.h> +#include <stdio.h> + +#define WIN32_LEAN_AND_MEAN +#define STRICT +#include <windows.h> + +#include <pseh.h> + +_SEH_FILTER(main_filter0) +{ + fprintf(stderr, "filter 0: exception code %08lX\n", _SEH_GetExceptionCode()); + return EXCEPTION_EXECUTE_HANDLER; +} + +_SEH_FILTER(main_filter1) +{ + static int n; + + fputs("filter 1\n", stderr); + + _SEH_GetExceptionPointers()->ContextRecord->Eax = (DWORD)(UINT_PTR)&n; + + return EXCEPTION_CONTINUE_EXECUTION; +} + +_SEH_FILTER(main_filter2) +{ + fputs("filter 2\n", stderr); + return EXCEPTION_CONTINUE_SEARCH; +} + +_SEH_FINALLY(main_finally0) +{ + fputs("finally 0\n", stderr); +} + +_SEH_FINALLY(main_finally1) +{ + fputs("finally 1\n", stderr); + RaiseException(0xC0000006, 0, 0, NULL); +} + +_SEH_FINALLY(main_finally2) +{ + fputs("finally 2\n", stderr); +} + +int main(void) +{ + _SEH_TRY + { + _SEH_TRY + { + _SEH_TRY_FILTER(main_filter2) + { + _SEH_TRY_FINALLY(main_finally2) + { + _SEH_TRY_FILTER_FINALLY(main_filter0, main_finally0) + { + /* This exception is handled below */ + RaiseException(0xC0000005, 0, 0, NULL); + } + /* The finally is called no problem */ + _SEH_HANDLE + /* The filter returns EXCEPTION_EXECUTE_HANDLER */ + { + /* We handle the exception */ + fprintf(stderr, "caught exception %08lX\n", _SEH_GetExceptionCode()); + } + _SEH_END; + + _SEH_TRY_FILTER_FINALLY(main_filter1, main_finally1) + { + /* This faulting code is corrected by the filter */ +#ifdef __GNUC__ + __asm__("xorl %eax, %eax"); + __asm__("movl 0(%eax), %eax"); +#else + __asm xor eax, eax + __asm mov eax, [eax] +#endif + + /* Execution continues here */ + } + /* The finally misbehaves and throws an exception */ + _SEH_HANDLE + { + /* + This handler is never called, because the filter returns + EXCEPTION_CONTINUE_EXECUTION + */ + assert(0); + } + _SEH_END; + } + /* This finally is called after the next-to-outermost filter */ + _SEH_END_FINALLY; + } + _SEH_HANDLE + { + /* + This handler is never called, because the filter returns + EXCEPTION_CONTINUE_SEARCH + */ + assert(0); + } + _SEH_END; + } + _SEH_HANDLE + { + /* This handler handles the misbehavior of a finally */ + fprintf(stderr, "caught exception %08lX\n", _SEH_GetExceptionCode()); + + /* This handler misbehaves, too */ + RaiseException(0xC0000007, 0, 0, NULL); + } + _SEH_END; + } + _SEH_HANDLE + { + /* This handler catches the exception thrown by the previous handler */ + fprintf(stderr, "caught exception %08lX\n", _SEH_GetExceptionCode()); + } + _SEH_END; + + return 0; +} From df6802c1fd5ef6532d647e684de14107c5cec198 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Thu, 3 Jun 2004 11:20:10 +0000 Subject: [PATCH 1317/1463] Add US-Dvorak keyboard layout and enable swedish keyboard layout. Patch by ai2097. This fixes bug #329. svn path=/trunk/; revision=9602 --- reactos/Makefile | 4 +- reactos/bootdata/hivesys.inf | 5 + reactos/bootdata/packages/reactos.dff | 2 + reactos/bootdata/txtsetup.sif | 4 +- reactos/lib/kbddv/.cvsignore | 12 + reactos/lib/kbddv/Jamfile | 15 + reactos/lib/kbddv/kbddv.c | 400 ++++++++++++++++++++++++++ reactos/lib/kbddv/kbddv.def | 8 + reactos/lib/kbddv/kbddv.edf | 5 + reactos/lib/kbddv/kbddv.rc | 36 +++ reactos/lib/kbddv/makefile | 41 +++ 11 files changed, 529 insertions(+), 3 deletions(-) create mode 100644 reactos/lib/kbddv/.cvsignore create mode 100644 reactos/lib/kbddv/Jamfile create mode 100644 reactos/lib/kbddv/kbddv.c create mode 100644 reactos/lib/kbddv/kbddv.def create mode 100644 reactos/lib/kbddv/kbddv.edf create mode 100644 reactos/lib/kbddv/kbddv.rc create mode 100644 reactos/lib/kbddv/makefile diff --git a/reactos/Makefile b/reactos/Makefile index 914505acbb3..43d45d070dc 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.224 2004/06/01 19:06:50 sedwards Exp $ +# $Id: Makefile,v 1.225 2004/06/03 11:14:38 ekohl Exp $ # # Global makefile # @@ -35,7 +35,7 @@ LIB_FSLIB = vfatlib LIB_STATIC = string rosrtl epsapi uuid libwine zlib rtl tgetopt # Keyboard layout libraries -DLLS_KBD = kbdus kbdgr kbdfr kbduk +DLLS_KBD = kbddv kbdfr kbdgr kbdse kbduk kbdus # Control Panels DLLS_CPL = cpl diff --git a/reactos/bootdata/hivesys.inf b/reactos/bootdata/hivesys.inf index a8f97669710..db1ce60db24 100644 --- a/reactos/bootdata/hivesys.inf +++ b/reactos/bootdata/hivesys.inf @@ -12,8 +12,12 @@ HKLM,"SYSTEM\CurrentControlSet\Control\KeyboardLayouts\00000407","Layout File",0 HKLM,"SYSTEM\CurrentControlSet\Control\KeyboardLayouts\00000407","Layout Text",0x00000000,"GR" HKLM,"SYSTEM\CurrentControlSet\Control\KeyboardLayouts\00000409","Layout File",0x00000000,"kbdus.dll" HKLM,"SYSTEM\CurrentControlSet\Control\KeyboardLayouts\00000409","Layout Text",0x00000000,"US" +HKLM,"SYSTEM\CurrentControlSet\Control\KeyboardLayouts\00010409","Layout File",0x00000000,"kbddv.dll" +HKLM,"SYSTEM\CurrentControlSet\Control\KeyboardLayouts\00010409","Layout Text",0x00000000,"US-Dvorak" HKLM,"SYSTEM\CurrentControlSet\Control\KeyboardLayouts\0000040c","Layout File",0x00000000,"kbdfr.dll" HKLM,"SYSTEM\CurrentControlSet\Control\KeyboardLayouts\0000040c","Layout Text",0x00000000,"FR" +HKLM,"SYSTEM\CurrentControlSet\Control\KeyboardLayouts\0000041d","Layout File",0x00000000,"kbdse.dll" +HKLM,"SYSTEM\CurrentControlSet\Control\KeyboardLayouts\0000041d","Layout Text",0x00000000,"SE" ; NLS Files HKLM,"SYSTEM\CurrentControlSet\Control\NLS\CodePage","10000",0x00000000,"c_10000.nls" @@ -41,6 +45,7 @@ HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Language","040d",0x00000000,"l_intl.n HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Language","040e",0x00000000,"l_intl.nls" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Language","040f",0x00000000,"l_intl.nls" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Language","0410",0x00000000,"l_intl.nls" +HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Language","041d",0x00000000,"l_intl.nls" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Language","Default",0x00000000,"0409" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Language","InstallLanguage",0x00000000,"0409" diff --git a/reactos/bootdata/packages/reactos.dff b/reactos/bootdata/packages/reactos.dff index 48cd59b37c7..dd0c99fe1df 100755 --- a/reactos/bootdata/packages/reactos.dff +++ b/reactos/bootdata/packages/reactos.dff @@ -60,8 +60,10 @@ lib\freetype\freetype.dll 1 lib\gdi32\gdi32.dll 1 lib\imm32\imm32.dll 1 lib\iphlpapi\iphlpapi.dll 1 +lib\kbdfr\kbddv.dll 1 lib\kbdfr\kbdfr.dll 1 lib\kbdgr\kbdgr.dll 1 +lib\kbdse\kbdse.dll 1 lib\kbduk\kbduk.dll 1 lib\kbdus\kbdus.dll 1 lib\kernel32\kernel32.dll 1 diff --git a/reactos/bootdata/txtsetup.sif b/reactos/bootdata/txtsetup.sif index 11abd37d9c9..daec1eee709 100644 --- a/reactos/bootdata/txtsetup.sif +++ b/reactos/bootdata/txtsetup.sif @@ -58,7 +58,8 @@ Default = "XT-, AT- or extended keyboard (83-105 keys)" [KeyboardLayout] 00000809 = "English (United Kingdom)" -00000409 = "English (US)" +00000409 = "English (USA)" +00010409 = "English (USA-Dvorak)" 0000040C = "French (France)" 00000407 = "German (Germany)" 0000041D = "Swedish" @@ -66,6 +67,7 @@ Default = "XT-, AT- or extended keyboard (83-105 keys)" [Files.KeyboardLayout] 00000407 = kbdgr.dll 00000409 = kbdus.dll +00010409 = kbddv.dll 0000040C = kbdfr.dll 0000041D = kbdse.dll 00000809 = kgbgb.dll diff --git a/reactos/lib/kbddv/.cvsignore b/reactos/lib/kbddv/.cvsignore new file mode 100644 index 00000000000..3e325d040f9 --- /dev/null +++ b/reactos/lib/kbddv/.cvsignore @@ -0,0 +1,12 @@ +errcodes.rc +temp.exp +*.a +*.o +*.bin +*.dll +*.lib +*.coff +*.sym +*.tmp +*.map +*.d diff --git a/reactos/lib/kbddv/Jamfile b/reactos/lib/kbddv/Jamfile new file mode 100644 index 00000000000..b4ad8f7cb8c --- /dev/null +++ b/reactos/lib/kbddv/Jamfile @@ -0,0 +1,15 @@ +SubDir ROS_TOP lib kbddv ; + +# This stuff should actually be moved to Jamrules +# in order to more easily support other compilers +CCFLAGS += -Wall -fno-builtin ; + +# NOTE - I'm no Jam expert, yet. This stuff should be +# abstracted into the Jamrules file. +LINKFLAGS = -nostartfiles -nostdlib -shared ; +LINKFLAGS += -Wl,--image-base,0x77F00000 -lgcc ; + +SRCS = kbddv + +SharedLibrary kbddv : $(SRCS) ; +LINKLIBS = ; diff --git a/reactos/lib/kbddv/kbddv.c b/reactos/lib/kbddv/kbddv.c new file mode 100644 index 00000000000..77f9e620d45 --- /dev/null +++ b/reactos/lib/kbddv/kbddv.c @@ -0,0 +1,400 @@ +/* + * ReactOS USASCII Keyboard layout + * Copyright (C) 2003 ReactOS + * License: LGPL, see: LGPL.txt + * + * Thanks to: http://www.barcodeman.com/altek/mule/scandoc.php + * and http://win.tue.nl/~aeb/linux/kbd/scancodes-1.html + */ + +#include <windows.h> +#include <internal/kbd.h> + +#ifdef _M_IA64 +#define ROSDATA static __declspec(allocate(".data")) +#else +#pragma data_seg(".data") +#define ROSDATA static +#endif + +#define VK_EMPTY 0xff /* The non-existent VK */ +#define KSHIFT 0x001 /* Shift modifier */ +#define KCTRL 0x002 /* Ctrl modifier */ +#define KALT 0x004 /* Alt modifier */ +#define KEXT 0x100 /* Extended key code */ +#define KMULTI 0x200 /* Multi-key */ +#define KSPEC 0x400 /* Special key */ +#define KNUMP 0x800 /* Number-pad */ +#define KNUMS 0xc00 /* Special + number pad */ +#define KMEXT 0x300 /* Multi + ext */ + +/* Thanks to http://asp.flaaten.dk/pforum/keycode/keycode.htm */ +#ifndef VK_OEM_1 /* ;/: */ +#define VK_OEM_1 0xba +#endif +#ifndef VK_OEM_PLUS +#define VK_OEM_PLUS 0xbb +#endif +#ifndef VK_OEM_COMMA +#define VK_OEM_COMMA 0xbc +#endif +#ifndef VK_OEM_MINUS +#define VK_OEM_MINUS 0xbd +#endif +#ifndef VK_OEM_PERIOD +#define VK_OEM_PERIOD 0xbe +#endif +#ifndef VK_OEM_2 /* //? */ +#define VK_OEM_2 0xbf +#endif +#ifndef VK_OEM_3 /* `/~ */ +#define VK_OEM_3 0xc0 +#endif +#ifndef VK_OEM_4 /* [/{ */ +#define VK_OEM_4 0xdb +#endif +#ifndef VK_OEM_5 /* \/| */ +#define VK_OEM_5 0xdc +#endif +#ifndef VK_OEM_6 /* ]/} */ +#define VK_OEM_6 0xdd +#endif +#ifndef VK_OEM_7 /* '/" */ +#define VK_OEM_7 0xde +#endif +#ifndef VK_OEM_8 +#define VK_OEM_8 0xdf +#endif +#ifndef VK_OEM_102 +#define VK_OEM_102 0xe1 +#endif + +ROSDATA USHORT scancode_to_vk[] = { + /* Numbers Row */ + /* - 00 - */ + /* 1 ... 2 ... 3 ... 4 ... */ + VK_EMPTY, VK_ESCAPE, '1', '2', + '3', '4', '5', '6', + '7', '8', '9', '0', + VK_OEM_4, VK_OEM_6, VK_BACK, + /* - 0f - */ + /* First Letters Row */ + VK_TAB, VK_OEM_7, VK_OEM_COMMA, VK_OEM_PERIOD, + 'P', 'Y', 'F', 'G', + 'C', 'R', 'L', + VK_OEM_2, VK_OEM_PLUS, VK_RETURN, + /* - 1d - */ + /* Second Letters Row */ + VK_LCONTROL, + 'A', 'O', 'E', 'U', + 'I', 'D', 'H', 'T', + 'N', 'S', VK_OEM_MINUS,VK_OEM_3, + VK_LSHIFT, VK_OEM_5, + /* - 2c - */ + /* Third letters row */ + VK_OEM_1, 'Q', 'J', 'K', + 'X', 'B', 'M', 'W', + 'V', 'Z', VK_RSHIFT, + /* - 37 - */ + /* Bottom Row */ + VK_MULTIPLY, VK_LMENU, VK_SPACE, VK_CAPITAL, + + /* - 3b - */ + /* F-Keys */ + VK_F1, VK_F2, VK_F3, VK_F4, VK_F5, VK_F6, + VK_F7, VK_F8, VK_F9, VK_F10, + /* - 45 - */ + /* Locks */ + VK_NUMLOCK | KMEXT, + VK_SCROLL | KMULTI, + /* - 47 - */ + /* Number-Pad */ + VK_HOME | KNUMS, VK_UP | KNUMS, VK_PRIOR | KNUMS, VK_SUBTRACT, + VK_LEFT | KNUMS, VK_CLEAR | KNUMS, VK_RIGHT | KNUMS, VK_ADD, + VK_END | KNUMS, VK_DOWN | KNUMS, VK_NEXT | KNUMS, + VK_INSERT | KNUMS, VK_DELETE | KNUMS, + /* - 54 - */ + /* Presumably PrtSc */ + VK_SNAPSHOT, + /* - 55 - */ + /* Oddities, and the remaining standard F-Keys */ + VK_EMPTY, VK_EMPTY, VK_F11, VK_F12, + /* - 59 - */ + VK_CLEAR, VK_EMPTY, VK_EMPTY, VK_EMPTY, VK_EMPTY, /* EREOF */ + VK_EMPTY, VK_EMPTY, VK_EMPTY, VK_EMPTY, VK_EMPTY, /* ZOOM */ + VK_HELP, + /* - 64 - */ + /* Even more F-Keys (for example, NCR keyboards from the early 90's) */ + VK_F13, VK_F14, VK_F15, VK_F16, VK_F17, VK_F18, VK_F19, VK_F20, + VK_F21, VK_F22, VK_F23, + /* - 6f - */ + /* Not sure who uses these codes */ + VK_EMPTY, VK_EMPTY, VK_EMPTY, + /* - 72 - */ + VK_EMPTY, VK_EMPTY, VK_EMPTY, VK_EMPTY, + /* - 76 - */ + /* One more f-key */ + VK_F24, + /* - 77 - */ + VK_EMPTY, VK_EMPTY, VK_EMPTY, VK_EMPTY, + VK_EMPTY, VK_EMPTY, VK_EMPTY, VK_EMPTY, /* PA1 */ + VK_EMPTY, + /* - 80 - */ + 0 +}; + +ROSDATA VSC_VK extcode0_to_vk[] = { + { 0, 0 }, +}; + +ROSDATA VSC_VK extcode1_to_vk[] = { + { 0, 0 }, +}; + +ROSDATA VK_TO_BIT modifier_keys[] = { + { VK_SHIFT, KSHIFT }, + { VK_CONTROL, KCTRL }, + { VK_MENU, KALT }, + { 0, 0 } +}; + +typedef struct _mymod { + PVOID mod_keys; + WORD maxmod; + BYTE mod_max[4]; +} INTERNAL_KBD_MODIFIERS; + +ROSDATA INTERNAL_KBD_MODIFIERS modifier_bits[] = { + modifier_keys, + 3, + { 0, 1, 2, 3 } /* Modifier bit order, NONE, SHIFT, CTRL, ALT */ +}; + +#define NOCAPS 0 +#define CAPS KSHIFT /* Caps -> shift */ + +ROSDATA VK_TO_WCHARS2 key_to_chars_2mod[] = { + /* Normal vs Shifted */ + /* The numbers */ + { '1', NOCAPS, '1', '!' }, + /* Ctrl-2 generates NUL */ + { '3', NOCAPS, '3', '#' }, + { '4', NOCAPS, '4', '$' }, + { '5', NOCAPS, '5', '%' }, + /* Ctrl-6 generates RS */ + { '7', NOCAPS, '7', '&' }, + { '8', NOCAPS, '8', '*' }, + { '9', NOCAPS, '9', '(' }, + { '0', NOCAPS, '0', ')' }, + /* First letter row */ + { 'P', CAPS, 'p', 'P' }, + { 'Y', CAPS, 'y', 'Y' }, + { 'F', CAPS, 'f', 'F' }, + { 'G', CAPS, 'g', 'G' }, + { 'C', CAPS, 'c', 'C' }, + { 'R', CAPS, 'r', 'R' }, + { 'L', CAPS, 'l', 'L' }, + /* Second letter row */ + { 'A', CAPS, 'a', 'A' }, + { 'O', CAPS, 'o', 'O' }, + { 'E', CAPS, 'e', 'E' }, + { 'U', CAPS, 'u', 'U' }, + { 'I', CAPS, 'i', 'I' }, + { 'D', CAPS, 'd', 'D' }, + { 'H', CAPS, 'h', 'H' }, + { 'T', CAPS, 't', 'T' }, + { 'N', CAPS, 'n', 'N' }, + { 'S', CAPS, 's', 'S' }, + /* Third letter row */ + { 'Q', CAPS, 'q', 'Q' }, + { 'J', CAPS, 'j', 'J' }, + { 'K', CAPS, 'k', 'K' }, + { 'X', CAPS, 'x', 'X' }, + { 'B', CAPS, 'b', 'B' }, + { 'M', CAPS, 'm', 'M' }, + { 'W', CAPS, 'w', 'W' }, + { 'V', CAPS, 'v', 'V' }, + { 'Z', CAPS, 'z', 'Z' }, + + /* Specials */ + /* Ctrl-_ generates US */ + { VK_OEM_7 ,NOCAPS, '\'','\"'}, + { VK_OEM_COMMA ,NOCAPS, ',', '<' }, + { VK_OEM_PERIOD ,NOCAPS, '.', '>' }, + { VK_OEM_2 ,NOCAPS, '/', '?' }, + { VK_OEM_PLUS ,NOCAPS, '=', '+' }, + { VK_OEM_1 ,NOCAPS, ';', ':' }, + { VK_OEM_3 ,NOCAPS, '`', '~' }, + /* Keys that do not have shift states */ + { VK_TAB ,NOCAPS, '\t','\t'}, + { VK_ADD ,NOCAPS, '+', '+' }, + { VK_SUBTRACT,NOCAPS, '-', '-' }, + { VK_MULTIPLY,NOCAPS, '*', '*' }, + { VK_DIVIDE ,NOCAPS, '/', '/' }, + { VK_ESCAPE ,NOCAPS, '\x1b','\x1b' }, + { VK_SPACE ,NOCAPS, ' ', ' ' }, + { 0, 0 } +}; + +ROSDATA VK_TO_WCHARS3 key_to_chars_3mod[] = { + /* Normal, Shifted, Ctrl */ + /* Legacy (telnet-style) ascii escapes */ + { VK_OEM_4, 0, '[', '{', 0x1b /* ESC */ }, + { VK_OEM_6, 0, ']', '}', 0x1d /* GS */ }, + { VK_OEM_5, 0, '\\','|', 0x1c /* FS */ }, + { VK_RETURN,0, '\r', '\r', '\n' }, + { 0,0 } +}; + +ROSDATA VK_TO_WCHARS4 key_to_chars_4mod[] = { + /* Normal, Shifted, Ctrl, C-S-x */ + /* Legacy Ascii generators */ + { '2', NOCAPS, '2', '@', WCH_NONE, 0 }, + { '6', NOCAPS, '6', '^', WCH_NONE, 0x1e /* RS */ }, + { VK_OEM_MINUS, NOCAPS, '-', '_', WCH_NONE, 0x1f /* US */ }, + { 0, 0 } +}; + +ROSDATA VK_TO_WCHARS1 keypad_numbers[] = { + { VK_NUMPAD0, 0, '0' }, + { VK_NUMPAD1, 0, '1' }, + { VK_NUMPAD2, 0, '2' }, + { VK_NUMPAD3, 0, '3' }, + { VK_NUMPAD4, 0, '4' }, + { VK_NUMPAD5, 0, '5' }, + { VK_NUMPAD6, 0, '6' }, + { VK_NUMPAD7, 0, '7' }, + { VK_NUMPAD8, 0, '8' }, + { VK_NUMPAD9, 0, '9' }, + { VK_DECIMAL, 0, '.' }, + { VK_BACK, 0, '\010' }, + { 0,0 } +}; + +#define vk_master(n,x) { (PVK_TO_WCHARS1)x, n, sizeof(x[0]) } + +ROSDATA VK_TO_WCHAR_TABLE vk_to_wchar_master_table[] = { + vk_master(1,keypad_numbers), + vk_master(2,key_to_chars_2mod), + vk_master(3,key_to_chars_3mod), + vk_master(4,key_to_chars_4mod), + { 0,0,0 } +}; + +ROSDATA VSC_LPWSTR key_names[] = { + { 0x00, L"" }, + { 0x01, L"Esc" }, + { 0x0e, L"Backspace" }, + { 0x0f, L"Tab" }, + { 0x1c, L"Enter" }, + { 0x1d, L"Ctrl" }, + { 0x2a, L"Shift" }, + { 0x36, L"Right Shift" }, + { 0x37, L"Num *" }, + { 0x38, L"Alt" }, + { 0x39, L"Space" }, + { 0x3a, L"Caps Lock" }, + { 0x3b, L"F1" }, + { 0x3c, L"F2" }, + { 0x3d, L"F3" }, + { 0x3e, L"F4" }, + { 0x3f, L"F5" }, + { 0x40, L"F6" }, + { 0x41, L"F7" }, + { 0x42, L"F8" }, + { 0x43, L"F9" }, + { 0x44, L"F10" }, + { 0x45, L"Pause" }, + { 0x46, L"Scroll Lock" }, + { 0x47, L"Num 7" }, + { 0x48, L"Num 8" }, + { 0x49, L"Num 9" }, + { 0x4a, L"Num -" }, + { 0x4b, L"Num 4" }, + { 0x4c, L"Num 5" }, + { 0x4d, L"Num 6" }, + { 0x4e, L"Num +" }, + { 0x4f, L"Num 1" }, + { 0x50, L"Num 2" }, + { 0x51, L"Num 3" }, + { 0x52, L"Num 0" }, + { 0x53, L"Num Del" }, + { 0x54, L"Sys Req" }, + { 0x57, L"F11" }, + { 0x58, L"F12" }, + { 0x7c, L"F13" }, + { 0x7d, L"F14" }, + { 0x7e, L"F15" }, + { 0x7f, L"F16" }, + { 0x80, L"F17" }, + { 0x81, L"F18" }, + { 0x82, L"F19" }, + { 0x83, L"F20" }, + { 0x84, L"F21" }, + { 0x85, L"F22" }, + { 0x86, L"F23" }, + { 0x87, L"F24" }, + { 0, NULL }, +}; + +ROSDATA VSC_LPWSTR extended_key_names[] = { + { 0x1c, L"Num Enter" }, + { 0x1d, L"Right Ctrl" }, + { 0x35, L"Num /" }, + { 0x37, L"Prnt Scrn" }, + { 0x38, L"Right Alt" }, + { 0x45, L"Num Lock" }, + { 0x46, L"Break" }, + { 0x47, L"Home" }, + { 0x48, L"Up" }, + { 0x49, L"Page Up" }, + { 0x4a, L"Left" }, + { 0x4c, L"Center" }, + { 0x4d, L"Right" }, + { 0x4f, L"End" }, + { 0x50, L"Down" }, + { 0x51, L"Page Down" }, + { 0x52, L"Insert" }, + { 0x53, L"Delete" }, + { 0x54, L"<ReactOS>" }, + { 0x55, L"Help" }, + { 0x56, L"Left Windows" }, + { 0x5b, L"Right Windows" }, + { 0, NULL }, +}; + +/* Finally, the master table */ +ROSDATA KBDTABLES keyboard_layout_table = { + /* modifier assignments */ + (PMODIFIERS)&modifier_bits, + + /* character from vk tables */ + vk_to_wchar_master_table, + + /* diacritical marks -- currently implemented by wine code */ + /* English doesn't have any, anyway */ + NULL, + + /* Key names */ + (VSC_LPWSTR *)key_names, + (VSC_LPWSTR *)extended_key_names, + NULL, /* Dead key names */ + + /* scan code to virtual key maps */ + scancode_to_vk, + sizeof(scancode_to_vk) / sizeof(scancode_to_vk[0]), + extcode0_to_vk, + extcode1_to_vk, + + MAKELONG(0,1), /* Version 1.0 */ + + /* Ligatures -- English doesn't have any */ + 0, + 0, + NULL +}; + +PKBDTABLES STDCALL KbdLayerDescriptor() { + return &keyboard_layout_table; +} + diff --git a/reactos/lib/kbddv/kbddv.def b/reactos/lib/kbddv/kbddv.def new file mode 100644 index 00000000000..56443e9d88c --- /dev/null +++ b/reactos/lib/kbddv/kbddv.def @@ -0,0 +1,8 @@ +; +; ReactOS Operating System +; +LIBRARY kbddvorak.dll + +EXPORTS +KbdLayerDescriptor@0 +;EOF diff --git a/reactos/lib/kbddv/kbddv.edf b/reactos/lib/kbddv/kbddv.edf new file mode 100644 index 00000000000..0d5436c7c1c --- /dev/null +++ b/reactos/lib/kbddv/kbddv.edf @@ -0,0 +1,5 @@ +LIBRARY user32.dll + +EXPORTS +KbdLayerDescriptor=KbdLayerDescriptor@0 +; EOF diff --git a/reactos/lib/kbddv/kbddv.rc b/reactos/lib/kbddv/kbddv.rc new file mode 100644 index 00000000000..d53fe50e703 --- /dev/null +++ b/reactos/lib/kbddv/kbddv.rc @@ -0,0 +1,36 @@ +#include <defines.h> +#include <reactos/resource.h> + +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", "ReactOS US Dvorak Keyboard Layout\0" + VALUE "FileVersion", RES_STR_FILE_VERSION + VALUE "InternalName", "kbddvorak\0" + VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT + VALUE "OriginalFilename", "kbddvorak.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/kbddv/makefile b/reactos/lib/kbddv/makefile new file mode 100644 index 00000000000..4bac9d0487e --- /dev/null +++ b/reactos/lib/kbddv/makefile @@ -0,0 +1,41 @@ +# $Id: makefile,v 1.1 2004/06/03 11:14:06 ekohl Exp $ + +PATH_TO_TOP = ../.. + +TARGET_TYPE = dynlink + +TARGET_NAME = kbddv + +TARGET_BASE = 0x5500000 + +TARGET_ENTRY = 0x00000000 + +TARGET_CFLAGS = -I$(PATH_TO_TOP)/ntoskrnl/include + +# require os code to explicitly request A/W version of structs/functions +TARGET_CFLAGS += -D_DISABLE_TIDENTS + +TARGET_LFLAGS = -nostartfiles -nostdlib + +TARGET_SDKLIBS = + +TARGET_GCCLIBS = gcc + +TARGET_PCH = + +TARGET_CLEAN = + +TARGET_OBJECTS = kbddv.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 From f739268bbbcfa55bb3bb194d9e50b2d530f001db Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" <hackbunny@reactos.org> Date: Thu, 3 Jun 2004 22:19:10 +0000 Subject: [PATCH 1318/1463] Fixes for Borland C++ compilation, and one variable is now qualified "volatile" to disable dangerous optimizations svn path=/trunk/; revision=9603 --- reactos/include/pseh/framebased.h | 2 +- reactos/lib/pseh/framebased.c | 4 ++++ reactos/lib/pseh/i386/framebased.asm | 5 +++-- reactos/lib/pseh/i386/setjmp.asm | 2 ++ 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/reactos/include/pseh/framebased.h b/reactos/include/pseh/framebased.h index 3e7c79ec291..c24d7c319a7 100644 --- a/reactos/include/pseh/framebased.h +++ b/reactos/include/pseh/framebased.h @@ -99,7 +99,7 @@ static __declspec(noreturn) void __stdcall _SEHCompilerSpecificHandler }; \ \ _SEHFrame_t _SEHFrame; \ - _SEHPortableFrame_t * _SEHPortableFrame; \ + volatile _SEHPortableFrame_t * _SEHPortableFrame; \ \ _SEHFrame.SEH_Header.SPF_Handlers = &_SEHHandlers; \ \ diff --git a/reactos/lib/pseh/framebased.c b/reactos/lib/pseh/framebased.c index 006a7f3fd9c..6393bba5f28 100644 --- a/reactos/lib/pseh/framebased.c +++ b/reactos/lib/pseh/framebased.c @@ -33,6 +33,10 @@ extern void __cdecl _SEHRegisterFrame(_SEHRegistration_t *); extern void __cdecl _SEHUnregisterFrame(const _SEHRegistration_t *); extern void __cdecl _SEHUnwind(_SEHPortableFrame_t *); +/* Borland C++ uses a different decoration (i.e. none) for stdcall functions */ +extern void __stdcall RtlUnwind(void *, void *, void *, void *); +void const * _SEHRtlUnwind = RtlUnwind; + __declspec(noreturn) void __cdecl _SEHCallHandler(_SEHPortableFrame_t * frame) { frame->SPF_Handling = 1; diff --git a/reactos/lib/pseh/i386/framebased.asm b/reactos/lib/pseh/i386/framebased.asm index 109b0b580cc..d4d56b20fa9 100644 --- a/reactos/lib/pseh/i386/framebased.asm +++ b/reactos/lib/pseh/i386/framebased.asm @@ -44,7 +44,7 @@ __SEHUnregisterFrame: global __SEHUnwind __SEHUnwind: - extern _RtlUnwind@16 + extern __SEHRtlUnwind mov ecx, [esp+4] @@ -53,11 +53,12 @@ __SEHUnwind: push edi push ebx + xor eax, eax push eax push eax push eax push ecx - call _RtlUnwind@16 + call [__SEHRtlUnwind] pop ebx pop edi diff --git a/reactos/lib/pseh/i386/setjmp.asm b/reactos/lib/pseh/i386/setjmp.asm index 43431bac412..3e95355ab54 100644 --- a/reactos/lib/pseh/i386/setjmp.asm +++ b/reactos/lib/pseh/i386/setjmp.asm @@ -21,6 +21,8 @@ cpu 486 segment .text use32 +; Note: the undecorated names are for Borland C++ (and possibly other compilers +; using the OMF format) global SEHSetJmp global __SEHSetJmp SEHSetJmp: From 6312f5152fe832b848903f6137c127853c777d98 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" <hackbunny@reactos.org> Date: Thu, 3 Jun 2004 22:30:22 +0000 Subject: [PATCH 1319/1463] "Using multiple compilers is good for your code", chapter umpteenth: removing the SEH library test (until I have a better example) because it made some non-portable assumptions about the stack layout (could cause STATUS_INVALID_UNWIND_TARGET exceptions with some compilers and full optimization) svn path=/trunk/; revision=9606 --- reactos/apps/tests/pseh/pseh.c | 128 --------------------------------- 1 file changed, 128 deletions(-) delete mode 100644 reactos/apps/tests/pseh/pseh.c diff --git a/reactos/apps/tests/pseh/pseh.c b/reactos/apps/tests/pseh/pseh.c deleted file mode 100644 index 445e7a8efd9..00000000000 --- a/reactos/apps/tests/pseh/pseh.c +++ /dev/null @@ -1,128 +0,0 @@ -#include <assert.h> -#include <stdio.h> - -#define WIN32_LEAN_AND_MEAN -#define STRICT -#include <windows.h> - -#include <pseh.h> - -_SEH_FILTER(main_filter0) -{ - fprintf(stderr, "filter 0: exception code %08lX\n", _SEH_GetExceptionCode()); - return EXCEPTION_EXECUTE_HANDLER; -} - -_SEH_FILTER(main_filter1) -{ - static int n; - - fputs("filter 1\n", stderr); - - _SEH_GetExceptionPointers()->ContextRecord->Eax = (DWORD)(UINT_PTR)&n; - - return EXCEPTION_CONTINUE_EXECUTION; -} - -_SEH_FILTER(main_filter2) -{ - fputs("filter 2\n", stderr); - return EXCEPTION_CONTINUE_SEARCH; -} - -_SEH_FINALLY(main_finally0) -{ - fputs("finally 0\n", stderr); -} - -_SEH_FINALLY(main_finally1) -{ - fputs("finally 1\n", stderr); - RaiseException(0xC0000006, 0, 0, NULL); -} - -_SEH_FINALLY(main_finally2) -{ - fputs("finally 2\n", stderr); -} - -int main(void) -{ - _SEH_TRY - { - _SEH_TRY - { - _SEH_TRY_FILTER(main_filter2) - { - _SEH_TRY_FINALLY(main_finally2) - { - _SEH_TRY_FILTER_FINALLY(main_filter0, main_finally0) - { - /* This exception is handled below */ - RaiseException(0xC0000005, 0, 0, NULL); - } - /* The finally is called no problem */ - _SEH_HANDLE - /* The filter returns EXCEPTION_EXECUTE_HANDLER */ - { - /* We handle the exception */ - fprintf(stderr, "caught exception %08lX\n", _SEH_GetExceptionCode()); - } - _SEH_END; - - _SEH_TRY_FILTER_FINALLY(main_filter1, main_finally1) - { - /* This faulting code is corrected by the filter */ -#ifdef __GNUC__ - __asm__("xorl %eax, %eax"); - __asm__("movl 0(%eax), %eax"); -#else - __asm xor eax, eax - __asm mov eax, [eax] -#endif - - /* Execution continues here */ - } - /* The finally misbehaves and throws an exception */ - _SEH_HANDLE - { - /* - This handler is never called, because the filter returns - EXCEPTION_CONTINUE_EXECUTION - */ - assert(0); - } - _SEH_END; - } - /* This finally is called after the next-to-outermost filter */ - _SEH_END_FINALLY; - } - _SEH_HANDLE - { - /* - This handler is never called, because the filter returns - EXCEPTION_CONTINUE_SEARCH - */ - assert(0); - } - _SEH_END; - } - _SEH_HANDLE - { - /* This handler handles the misbehavior of a finally */ - fprintf(stderr, "caught exception %08lX\n", _SEH_GetExceptionCode()); - - /* This handler misbehaves, too */ - RaiseException(0xC0000007, 0, 0, NULL); - } - _SEH_END; - } - _SEH_HANDLE - { - /* This handler catches the exception thrown by the previous handler */ - fprintf(stderr, "caught exception %08lX\n", _SEH_GetExceptionCode()); - } - _SEH_END; - - return 0; -} From 31af77a32a9ad6cd87f7d26d078aee3045211a30 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" <hackbunny@reactos.org> Date: Fri, 4 Jun 2004 00:47:47 +0000 Subject: [PATCH 1320/1463] Setjmp has one argument and returns zero svn path=/trunk/; revision=9607 --- reactos/lib/pseh/i386/setjmp.asm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/reactos/lib/pseh/i386/setjmp.asm b/reactos/lib/pseh/i386/setjmp.asm index 3e95355ab54..abc81b10095 100644 --- a/reactos/lib/pseh/i386/setjmp.asm +++ b/reactos/lib/pseh/i386/setjmp.asm @@ -24,9 +24,9 @@ segment .text use32 ; Note: the undecorated names are for Borland C++ (and possibly other compilers ; using the OMF format) global SEHSetJmp -global __SEHSetJmp +global __SEHSetJmp@4 SEHSetJmp: -__SEHSetJmp@8: +__SEHSetJmp@4: ; jump buffer mov eax, [esp+4] @@ -43,6 +43,8 @@ __SEHSetJmp@8: mov [eax+12], ebx mov [eax+16], esi mov [eax+20], edi + + xor eax, eax ret 4 global SEHLongJmp From 8a4f16c2767935321d3f5d9069199ad64243ce08 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" <hackbunny@reactos.org> Date: Fri, 4 Jun 2004 00:49:40 +0000 Subject: [PATCH 1321/1463] Fixed compilation in environments where the native non-local goto isn't available svn path=/trunk/; revision=9608 --- reactos/include/pseh/framebased.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/include/pseh/framebased.h b/reactos/include/pseh/framebased.h index c24d7c319a7..344e0d08401 100644 --- a/reactos/include/pseh/framebased.h +++ b/reactos/include/pseh/framebased.h @@ -33,9 +33,10 @@ #define jmp_buf _SEHJmpBuf_t #else #include <setjmp.h> -#include <stddef.h> #endif +#include <stddef.h> + typedef struct __SEHFrame { _SEHPortableFrame_t SEH_Header; From 4358005fe4057a659adbff817a65f40bcbe20d30 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Fri, 4 Jun 2004 13:30:27 +0000 Subject: [PATCH 1322/1463] fixed wrong directory for kbddv. Thanks to ai2097. svn path=/trunk/; revision=9609 --- reactos/bootdata/packages/reactos.dff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/bootdata/packages/reactos.dff b/reactos/bootdata/packages/reactos.dff index dd0c99fe1df..f8741b6408b 100755 --- a/reactos/bootdata/packages/reactos.dff +++ b/reactos/bootdata/packages/reactos.dff @@ -60,7 +60,7 @@ lib\freetype\freetype.dll 1 lib\gdi32\gdi32.dll 1 lib\imm32\imm32.dll 1 lib\iphlpapi\iphlpapi.dll 1 -lib\kbdfr\kbddv.dll 1 +lib\kbddv\kbddv.dll 1 lib\kbdfr\kbdfr.dll 1 lib\kbdgr\kbdgr.dll 1 lib\kbdse\kbdse.dll 1 From 320eabb37f160c1dd7ecb201456cba57134bb4ca Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Fri, 4 Jun 2004 13:49:15 +0000 Subject: [PATCH 1323/1463] added missing cvsignore file svn path=/trunk/; revision=9610 --- reactos/lib/kbdse/.cvsignore | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 reactos/lib/kbdse/.cvsignore diff --git a/reactos/lib/kbdse/.cvsignore b/reactos/lib/kbdse/.cvsignore new file mode 100644 index 00000000000..3e325d040f9 --- /dev/null +++ b/reactos/lib/kbdse/.cvsignore @@ -0,0 +1,12 @@ +errcodes.rc +temp.exp +*.a +*.o +*.bin +*.dll +*.lib +*.coff +*.sym +*.tmp +*.map +*.d From a880f2ee8278b32d76f4d70345a5ee550d13bc67 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 4 Jun 2004 23:44:27 +0000 Subject: [PATCH 1324/1463] - Basic Live CD building infrastructure. svn path=/trunk/; revision=9611 --- reactos/Makefile | 26 ++++++++++++++++++- reactos/bootdata/livecd.inf | 34 +++++++++++++++++++++++++ reactos/bootdata/livecd.ini | 29 +++++++++++++++++++++ reactos/rules.mak | 10 ++++++-- reactos/subsys/system/explorer/Makefile | 12 ++++++--- 5 files changed, 105 insertions(+), 6 deletions(-) create mode 100644 reactos/bootdata/livecd.inf create mode 100644 reactos/bootdata/livecd.ini diff --git a/reactos/Makefile b/reactos/Makefile index 43d45d070dc..9a4b7fd7a8a 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.225 2004/06/03 11:14:38 ekohl Exp $ +# $Id: Makefile,v 1.226 2004/06/04 23:44:26 navaraf Exp $ # # Global makefile # @@ -199,10 +199,34 @@ bootcd_makecd: ubootcd_unattend: $(CP) bootdata/unattend.inf $(BOOTCD_DIR)/reactos/unattend.inf +livecd_directory_layout: + $(RMKDIR) $(LIVECD_DIR) + $(RMKDIR) $(LIVECD_DIR)/loader + $(RMKDIR) $(LIVECD_DIR)/reactos + $(RMKDIR) $(LIVECD_DIR)/Profiles/All\ Users/Desktop + $(RMKDIR) $(LIVECD_DIR)/Profiles/Default\ User/Desktop + $(RMKDIR) $(LIVECD_DIR)/Profiles/Default\ User/My\ Documents + $(CP) ${FREELDR_DIR}/bootsect/isoboot.bin ${LIVECD_DIR}/../isoboot.bin + $(CP) ${FREELDR_DIR}/freeldr/obj/i386/freeldr.sys ${LIVECD_DIR}/loader/setupldr.sys + $(RLINE) bootdata/livecd.ini $(LIVECD_DIR)/freeldr.ini + +livecd_bootstrap_files: + $(MAKE) LIVECD_INSTALL=yes fastinstall + +livecd_install_before: + $(TOOLS_PATH)/mkhive/mkhive$(EXE_POSTFIX) bootdata $(LIVECD_DIR)/reactos/system32/config bootdata/livecd.inf + +livecd_basic: livecd_directory_layout livecd_bootstrap_files livecd_install_before + +livecd_makecd: + $(TOOLS_PATH)/cdmake/cdmake -m -j -b $(LIVECD_DIR)/../isoboot.bin $(LIVECD_DIR) REACTOS roslive.iso + bootcd: bootcd_basic bootcd_makecd ubootcd: bootcd_basic ubootcd_unattend bootcd_makecd +livecd: livecd_basic livecd_makecd + registry: tools $(TOOLS_PATH)/mkhive/mkhive$(EXE_POSTFIX) bootdata $(INSTALL_DIR)/system32/config diff --git a/reactos/bootdata/livecd.inf b/reactos/bootdata/livecd.inf new file mode 100644 index 00000000000..347515af0b7 --- /dev/null +++ b/reactos/bootdata/livecd.inf @@ -0,0 +1,34 @@ +[Version] +Signature = "$ReactOS$" + +[DelReg] + +HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" + +[AddReg] + +; Cdfs (ISO96660) filesystem driver +HKLM,"SYSTEM\CurrentControlSet\Services\Cdfs","Start",0x00010001,0x00000000 + +; Cdrom class driver +HKLM,"SYSTEM\CurrentControlSet\Services\Cdrom","Start",0x00010001,0x00000000 + +; FIXME: Disable NTFS driver +HKLM,"SYSTEM\CurrentControlSet\Services\Ntfs","Start",0x00010001,0x00000004 + +; Shell +HKLM,"SYSTEM\Setup","CmdLine",0x00020000,"%SystemRoot%\explorer.exe" + +; User Profile List +HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList",,0x00000012 +HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList","ProfilesDirectory",0x00020000,"%SystemDrive%\Profiles" +HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList","AllUsersProfile",0x00000000,"All Users" +HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList","DefaultUserProfile",0x00000000,"Default User" + +; Shell Folders +HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common Documents",0x00020000,"" +HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common Desktop",0x00020000,"%SystemDrive%\Profiles\All Users\Desktop" +HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders","Desktop",0x00020000,"%SystemDrive%\Profiles\Default User\Desktop" +HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders","Personal",0x00020000,"%SystemDrive%\Profiles\Default User\My Documents" + +; EOF diff --git a/reactos/bootdata/livecd.ini b/reactos/bootdata/livecd.ini new file mode 100644 index 00000000000..8cd3e69d157 --- /dev/null +++ b/reactos/bootdata/livecd.ini @@ -0,0 +1,29 @@ +[FREELOADER] +DefaultOS=ReactOS +Timeout=0 + +[Display] +TitleText=ReactOS Boot Manager +StatusBarColor=Cyan +StatusBarTextColor=Black +BackdropTextColor=White +BackdropColor=Blue +BackdropFillStyle=Medium +TitleBoxTextColor=White +TitleBoxColor=Red +MessageBoxTextColor=White +MessageBoxColor=Blue +MenuTextColor=White +MenuColor=Blue +TextColor=Yellow +SelectedTextColor=Black +SelectedColor=Gray + +[Operating Systems] +ReactOS="ReactOS" + +[ReactOS] +BootType=ReactOS +SystemPath=LiveCD +Options=/DEBUGPORT=COM1 + \ No newline at end of file diff --git a/reactos/rules.mak b/reactos/rules.mak index d9489cebf77..0eff03b57f7 100644 --- a/reactos/rules.mak +++ b/reactos/rules.mak @@ -52,6 +52,13 @@ endif # that it has the same meaning as PATH_TO_TOP. TOPDIR = $(PATH_TO_TOP) +# Directory to build a bootable CD image in +BOOTCD_DIR=$(TOPDIR)/../bootcd/disk +LIVECD_DIR=$(TOPDIR)/../livecd/disk + +ifeq ($(LIVECD_INSTALL),yes) +INSTALL_DIR=$(LIVECD_DIR)/reactos +else # Use environment var ROS_INSTALL to override default install dir ifeq ($(ROS_INSTALL),) ifeq ($(HOST),mingw32-windows) @@ -62,9 +69,8 @@ endif else INSTALL_DIR = $(ROS_INSTALL) endif +endif -# Directory to build a bootable CD image in -BOOTCD_DIR=$(TOPDIR)/../bootcd/disk CC = $(PREFIX)gcc CXX = $(PREFIX)g++ diff --git a/reactos/subsys/system/explorer/Makefile b/reactos/subsys/system/explorer/Makefile index 890735043cb..7b8c8652568 100644 --- a/reactos/subsys/system/explorer/Makefile +++ b/reactos/subsys/system/explorer/Makefile @@ -142,15 +142,21 @@ notifyhook.dll: notifyhook/notifyhook.c notifyhook/notifyhook.h clean: $(TOOLS_PATH)/rdel $(TARGET) $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) -# Use environment var ROS_INSTALL to override default install dir -ifneq ($(ROS_INSTALL),) -INSTALL_DIR = $(ROS_INSTALL) +LIVECD_DIR=$(PATH_TO_TOP)/../livecd/disk + +ifeq ($(LIVECD_INSTALL),yes) +INSTALL_DIR=$(LIVECD_DIR)/reactos else +# Use environment var ROS_INSTALL to override default install dir +ifeq ($(ROS_INSTALL),) ifeq ($(HOST),mingw32-windows) INSTALL_DIR = C:/reactos else INSTALL_DIR = $(PATH_TO_TOP)/reactos endif +else +INSTALL_DIR = $(ROS_INSTALL) +endif endif implib: From fe2abd055069ba458911f9455778ea78bb4b936a Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 4 Jun 2004 23:46:02 +0000 Subject: [PATCH 1325/1463] - Support expanding environment variables in the setup command line. svn path=/trunk/; revision=9612 --- reactos/subsys/system/winlogon/setup.c | 62 ++++++++++++++++---------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/reactos/subsys/system/winlogon/setup.c b/reactos/subsys/system/winlogon/setup.c index 3ce992f82c4..610f0b9d2b8 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.2 2003/12/01 18:21:04 weiden Exp $ +/* $Id: setup.c,v 1.3 2004/06/04 23:46:02 navaraf Exp $ * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS winlogon * FILE: subsys/system/winlogon/setup.h @@ -112,6 +112,7 @@ RunSetup (VOID) { PROCESS_INFORMATION ProcessInformation; STARTUPINFO StartupInfo; + WCHAR Shell[MAX_PATH]; WCHAR CommandLine[MAX_PATH]; BOOLEAN Result; DWORD dwError; @@ -122,30 +123,43 @@ RunSetup (VOID) DPRINT ("RunSetup() called\n"); - dwError = RegOpenKeyEx (HKEY_LOCAL_MACHINE, - L"SYSTEM\\Setup", - 0, - KEY_QUERY_VALUE, - &hKey); + dwError = RegOpenKeyExW (HKEY_LOCAL_MACHINE, + L"SYSTEM\\Setup", + 0, + KEY_QUERY_VALUE, + &hKey); if (dwError != ERROR_SUCCESS) { return FALSE; } dwSize = MAX_PATH; - dwError = RegQueryValueEx (hKey, - L"CmdLine", - NULL, - &dwType, - (LPBYTE)CommandLine, - &dwSize); + dwError = RegQueryValueExW (hKey, + L"CmdLine", + NULL, + &dwType, + (LPBYTE)Shell, + &dwSize); RegCloseKey (hKey); - if (dwError != ERROR_SUCCESS || dwType != REG_SZ) + if (dwError != ERROR_SUCCESS) { return FALSE; } - DPRINT ("Winlogon: Should run '%s' now.\n", CommandLine); + if (dwType == REG_EXPAND_SZ) + { + ExpandEnvironmentStringsW(Shell, CommandLine, MAX_PATH); + } + else if (dwType == REG_SZ) + { + wcscpy(CommandLine, Shell); + } + else + { + return FALSE; + } + + DPRINT ("Winlogon: Should run '%S' now.\n", CommandLine); StartupInfo.cb = sizeof(StartupInfo); StartupInfo.lpReserved = NULL; @@ -157,16 +171,16 @@ RunSetup (VOID) DPRINT ("Winlogon: Creating new setup process\n"); - Result = CreateProcess (NULL, - CommandLine, - NULL, - NULL, - FALSE, - DETACHED_PROCESS, - NULL, - NULL, - &StartupInfo, - &ProcessInformation); + Result = CreateProcessW (NULL, + CommandLine, + NULL, + NULL, + FALSE, + DETACHED_PROCESS, + NULL, + NULL, + &StartupInfo, + &ProcessInformation); if (!Result) { DPRINT ("Winlogon: Failed to run setup process\n"); From b820cca03ef54ed182501ec95ae5c648a2431092 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 4 Jun 2004 23:47:04 +0000 Subject: [PATCH 1326/1463] - Process the "DelReg" section in .inf files. svn path=/trunk/; revision=9613 --- reactos/tools/mkhive/reginf.c | 22 +++++++++++++++++----- reactos/tools/mkhive/registry.c | 5 ++--- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/reactos/tools/mkhive/reginf.c b/reactos/tools/mkhive/reginf.c index 9bc7176fcc6..5d8b0bde98b 100644 --- a/reactos/tools/mkhive/reginf.c +++ b/reactos/tools/mkhive/reginf.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: reginf.c,v 1.6 2003/11/14 17:13:36 weiden Exp $ +/* $Id: reginf.c,v 1.7 2004/06/04 23:47:04 navaraf Exp $ * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS hive maker * FILE: tools/mkhive/reginf.h @@ -379,7 +379,7 @@ registry_callback (HINF hInf, PCHAR Section, BOOL Delete) Ok = InfFindFirstLine (hInf, Section, NULL, &Context); if (!Ok) - return FALSE; + return TRUE; /* Don't fail if the section isn't present */ for (;Ok; Ok = InfFindNextLine (&Context, &Context)) { @@ -396,9 +396,16 @@ registry_callback (HINF hInf, PCHAR Section, BOOL Delete) DPRINT("KeyName: <%s>\n", Buffer); - /* get flags */ - if (!InfGetIntField (&Context, 4, (PLONG)&Flags)) - Flags = 0; + if (Delete) + { + Flags = FLG_ADDREG_DELVAL; + } + else + { + /* get flags */ + if (!InfGetIntField (&Context, 4, (PLONG)&Flags)) + Flags = 0; + } DPRINT("Flags: %lx\n", Flags); @@ -455,6 +462,11 @@ ImportRegistryFile(PCHAR FileName, return FALSE; } + if (!registry_callback (hInf, "DelReg", TRUE)) + { + DPRINT1 ("registry_callback() failed\n"); + } + if (!registry_callback (hInf, "AddReg", FALSE)) { DPRINT1 ("registry_callback() failed\n"); diff --git a/reactos/tools/mkhive/registry.c b/reactos/tools/mkhive/registry.c index bf32069deca..375fd86cffd 100644 --- a/reactos/tools/mkhive/registry.c +++ b/reactos/tools/mkhive/registry.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: registry.c,v 1.9 2004/05/29 21:15:58 navaraf Exp $ +/* $Id: registry.c,v 1.10 2004/06/04 23:47:04 navaraf Exp $ * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS hive maker * FILE: tools/mkhive/registry.c @@ -241,8 +241,7 @@ LONG RegDeleteKey(HKEY Key, PCHAR Name) { - - if (strchr(Name, '\\') != NULL) + if (Name != NULL && strchr(Name, '\\') != NULL) return(ERROR_INVALID_PARAMETER); DPRINT1("FIXME!\n"); From 70dfb7876f39106ca0f1736f1c6ac54b7732ab7d Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 4 Jun 2004 23:50:15 +0000 Subject: [PATCH 1327/1463] Merged changes from joliet_20040527 branch: - Experimental Joliet generating support. - Fixed cdname_exists to check only entries in specific directory. - Move the DIRECTORY_FLAG logic to parse_filename_into_dirrecord. svn path=/trunk/; revision=9614 --- reactos/tools/cdmake/cdmake.c | 350 ++++++++++++++++++++++++++-------- 1 file changed, 275 insertions(+), 75 deletions(-) diff --git a/reactos/tools/cdmake/cdmake.c b/reactos/tools/cdmake/cdmake.c index d880efb3476..833b0021142 100644 --- a/reactos/tools/cdmake/cdmake.c +++ b/reactos/tools/cdmake/cdmake.c @@ -1,17 +1,26 @@ -/* $Id: cdmake.c,v 1.10 2004/01/13 19:25:03 hbirr Exp $ */ -/* CD-ROM Maker - by Philip J. Erdelsky - pje@acm.org - http://www.alumni.caltech.edu/~pje/ - - ElTorito-Support - by Eric Kohl - ekohl@rz-online.de - - Linux port - by Casper S. Hornstrup - chorns@users.sourceforge.net - */ +/* + * CD-ROM Maker + * by Philip J. Erdelsky + * pje@acm.org + * http://www.alumni.caltech.edu/~pje/ + * + * ElTorito-Support + * by Eric Kohl + * ekohl@rz-online.de + * + * Linux port + * by Casper S. Hornstrup + * chorns@users.sourceforge.net + * + * Joliet support + * by Filip Navara + * xnavara@volny.cz + * Limitations: + * - No Joliet file name validations + * - Very bad ISO file name generation + * + * $Id: cdmake.c,v 1.11 2004/06/04 23:50:15 navaraf Exp $ + */ /* According to his website, this file was released into the public domain by Phillip J. Erdelsky */ @@ -56,7 +65,7 @@ const BOOL FALSE = 0; // file system parameters #define MAX_LEVEL 8 -#define MAX_NAME_LENGTH 8 +#define MAX_NAME_LENGTH 64 #define MAX_CDNAME_LENGTH 8 #define MAX_EXTENSION_LENGTH 8 #define MAX_CDEXTENSION_LENGTH 3 @@ -99,9 +108,12 @@ typedef struct directory_record char name_on_cd[MAX_CDNAME_LENGTH+1]; char extension[MAX_EXTENSION_LENGTH+1]; char extension_on_cd[MAX_CDEXTENSION_LENGTH+1]; + char *joliet_name; DATE_AND_TIME date_and_time; DWORD sector; DWORD size; + DWORD joliet_sector; + DWORD joliet_size; unsigned level; /* directory record only */ WORD path_table_index; /* directory record only */ } DIR_RECORD, *PDIR_RECORD; @@ -150,6 +162,10 @@ DWORD boot_catalog_sector; DWORD boot_image_sector; WORD boot_image_size; // counted in 512 byte sectors +BOOL joliet; +DWORD joliet_path_table_size; +DWORD joliet_little_endian_path_table_sector; +DWORD joliet_big_endian_path_table_sector; /*----------------------------------------------------------------------------- This function edits a 32-bit unsigned number into a comma-delimited form, such @@ -189,6 +205,8 @@ static void release_memory(void) { struct directory_record *next = root.next_in_memory->next_in_memory; + if (joliet) + free (root.joliet_name); free (root.next_in_memory); root.next_in_memory = next; } @@ -324,6 +342,20 @@ static void write_string(char *s) write_byte(*s++); } +/*----------------------------------------------------------------------------- +This function writes a ansi string as a big endian unicode string to the CD-ROM +image. The terminating \0 is not written. +-----------------------------------------------------------------------------*/ + +static void write_string_as_big_endian_unicode(char *s) +{ + while (*s != 0) + { + write_byte(0); + write_byte(*s++); + } +} + /*----------------------------------------------------------------------------- This function writes a block of identical bytes to the CD-ROM image. -----------------------------------------------------------------------------*/ @@ -337,33 +369,57 @@ static void write_block(unsigned count, BYTE value) } } +/*----------------------------------------------------------------------------- +This function writes a block of identical bige endian words to the CD-ROM image. +-----------------------------------------------------------------------------*/ + +static void write_word_block(unsigned count, WORD value) +{ + while (count != 0) + { + write_big_endian_word(value); + count--; + } +} + /*----------------------------------------------------------------------------- This function writes a directory record to the CD_ROM image. -----------------------------------------------------------------------------*/ static void write_directory_record(PDIR_RECORD d, - DIR_RECORD_TYPE DirType) + DIR_RECORD_TYPE DirType, + BOOL joliet) { unsigned identifier_size; unsigned record_size; - switch (DirType) + if (joliet) { - case DOT_RECORD: - case DOT_DOT_RECORD: + if (DirType == DOT_RECORD || DirType == DOT_DOT_RECORD) identifier_size = 1; - break; - case SUBDIRECTORY_RECORD: - /*printf ( "Subdir: %s\n", d->name_on_cd );*/ - identifier_size = strlen(d->name_on_cd); - break; - case FILE_RECORD: - /*printf ( "File: %s.%s -> %s.%s\n", d->name, d->extension, d->name_on_cd, d->extension_on_cd );*/ - identifier_size = strlen(d->name_on_cd) + 2; - if (d->extension_on_cd[0] != 0) - identifier_size += 1 + strlen(d->extension_on_cd); - break; + else + identifier_size = strlen(d->joliet_name) * 2; + } + else + { + switch (DirType) + { + case DOT_RECORD: + case DOT_DOT_RECORD: + identifier_size = 1; + break; + case SUBDIRECTORY_RECORD: + /*printf ( "Subdir: %s\n", d->name_on_cd );*/ + identifier_size = strlen(d->name_on_cd); + break; + case FILE_RECORD: + /*printf ( "File: %s.%s -> %s.%s\n", d->name, d->extension, d->name_on_cd, d->extension_on_cd );*/ + identifier_size = strlen(d->name_on_cd) + 2; + if (d->extension_on_cd[0] != 0) + identifier_size += 1 + strlen(d->extension_on_cd); + break; + } } record_size = 33 + identifier_size; if ((identifier_size & 1) == 0) @@ -372,8 +428,16 @@ write_directory_record(PDIR_RECORD d, fill_sector(); write_byte((BYTE)record_size); write_byte(0); // number of sectors in extended attribute record - write_both_endian_dword(d->sector); - write_both_endian_dword(d->size); + if (joliet) + { + write_both_endian_dword(d->joliet_sector); + write_both_endian_dword(d->joliet_size); + } + else + { + write_both_endian_dword(d->sector); + write_both_endian_dword(d->size); + } write_byte((BYTE)(d->date_and_time.year - 1900)); write_byte(d->date_and_time.month); write_byte(d->date_and_time.day); @@ -395,16 +459,26 @@ write_directory_record(PDIR_RECORD d, write_byte(1); break; case SUBDIRECTORY_RECORD: - write_string(d->name_on_cd); + if (joliet) + write_string_as_big_endian_unicode(d->joliet_name); + else + write_string(d->name_on_cd); break; case FILE_RECORD: - write_string(d->name_on_cd); - if (d->extension_on_cd[0] != 0) + if (joliet) { - write_byte('.'); - write_string(d->extension_on_cd); + write_string_as_big_endian_unicode(d->joliet_name); + } + else + { + write_string(d->name_on_cd); + if (d->extension_on_cd[0] != 0) + { + write_byte('.'); + write_string(d->extension_on_cd); + } + write_string(";1"); } - write_string(";1"); break; } if ((identifier_size & 1) == 0) @@ -462,16 +536,17 @@ int cdname_exists ( PDIR_RECORD d ) && !strcasecmp ( p->name_on_cd, d->name_on_cd ) && !strcasecmp ( p->extension_on_cd, d->extension_on_cd ) ) return 1; - p = p->next_in_path_table; + p = p->next_in_directory; } return 0; } -void parse_filename_into_dirrecord ( const char* filename, PDIR_RECORD d ) +void parse_filename_into_dirrecord ( const char* filename, PDIR_RECORD d, BOOL dir ) { const char *s = filename; char *t = d->name_on_cd; char *n = d->name; + int joliet_length; while (*s != 0) { @@ -483,11 +558,11 @@ void parse_filename_into_dirrecord ( const char* filename, PDIR_RECORD d ) if ( (t-d->name_on_cd) < sizeof(d->name_on_cd)-1 ) *t++ = check_for_punctuation(*s, filename); - else + else if (!joliet) error_exit ( "'%s' is not ISO-9660, aborting...", filename ); if ( (n-d->name) < sizeof(d->name)-1 ) *n++ = *s; - else + else if (!joliet) error_exit ( "'%s' is not ISO-9660, aborting...", filename ); s++; } @@ -498,15 +573,37 @@ void parse_filename_into_dirrecord ( const char* filename, PDIR_RECORD d ) { if ( (t-d->extension_on_cd) < (sizeof(d->extension_on_cd)-1) ) *t++ = check_for_punctuation(*s, filename); - else + else if (!joliet) error_exit ( "'%s' is not ISO-9660, aborting...", filename ); s++; } *t = 0; *n = 0; + if ( dir ) + { + if (d->extension[0] != 0) + { + if (joliet) + d->extension_on_cd[0] = 0; + else + error_exit("Directory with extension %s", filename); + } + d->flags = DIRECTORY_FLAG; + } else + d->flags = 0; + if ( cdname_exists ( d ) ) error_exit ( "'%s' is a duplicate file name, aborting...", filename ); + + if ( joliet ) + { + joliet_length = strlen(filename); + if (joliet_length > 64) + error_exit ( "'%s' is not Joliet, aborting...", filename ); + d->joliet_name = malloc(joliet_length + 1); + strcpy(d->joliet_name, filename); + } } /*----------------------------------------------------------------------------- @@ -534,18 +631,11 @@ new_directory_record (struct _finddata_t *f, /* I need the parent set before calling parse_filename_into_dirrecord(), because that functions checks for duplicate file names*/ d->parent = parent; - parse_filename_into_dirrecord ( f->name, d ); + parse_filename_into_dirrecord ( f->name, d, f->attrib & _A_SUBDIR ); convert_date_and_time(&d->date_and_time, &f->time_write); - if (f->attrib & _A_SUBDIR) - { - if (d->extension[0] != 0) - error_exit("Directory with extension %s", f->name); - d->flags = DIRECTORY_FLAG; - } - else - d->flags = f->attrib & _A_HIDDEN ? HIDDEN_FLAG : 0; - d->size = f->size; + d->flags |= f->attrib & _A_HIDDEN ? HIDDEN_FLAG : 0; + d->size = d->joliet_size = f->size; d->next_in_directory = parent->first_record; parent->first_record = d; return d; @@ -576,22 +666,15 @@ new_directory_record (struct dirent *entry, /* I need the parent set before calling parse_filename_into_dirrecord(), because that functions checks for duplicate file names*/ d->parent = parent; - parse_filename_into_dirrecord ( entry->d_name, d ); +#ifdef HAVE_D_TYPE + parse_filename_into_dirrecord ( entry->d_name, d, entry->d_type == DT_DIR ); +#else + parse_filename_into_dirrecord ( entry->d_name, d, S_ISDIR(stbuf->st_mode) ); +#endif convert_date_and_time(&d->date_and_time, &stbuf->st_mtime); -#ifdef HAVE_D_TYPE - if (entry->d_type == DT_DIR) -#else - if (S_ISDIR(stbuf->st_mode)) -#endif - { - if (d->extension[0] != 0) - error_exit("Directory with extension %s", entry->d_name); - d->flags = DIRECTORY_FLAG; - } - else - d->flags = entry->d_name[0] == '.' ? HIDDEN_FLAG : 0; - d->size = stbuf->st_size; + d->flags |= entry->d_name[0] == '.' ? HIDDEN_FLAG : 0; + d->size = d->joliet_size = stbuf->st_size; d->next_in_directory = parent->first_record; parent->first_record = d; return d; @@ -962,7 +1045,7 @@ static void get_file_specifications(PDIR_RECORD d) { get_file_specifications(d->parent); append_string_to_source(d->name); - if ((d->flags & DIRECTORY_FLAG) == 0 && d->extension[0] != 0) + if (((d->flags & DIRECTORY_FLAG) == 0 || joliet) && d->extension[0] != 0) { *end_source++ = '.'; append_string_to_source(d->extension); @@ -1011,7 +1094,7 @@ static void pass(void) write_little_endian_dword((DWORD) 0); // second little endian path table write_big_endian_dword(big_endian_path_table_sector); write_big_endian_dword((DWORD) 0); // second big endian path table - write_directory_record(&root, DOT_RECORD); + write_directory_record(&root, DOT_RECORD, FALSE); write_block(128, ' '); // volume set identifier write_block(128, ' '); // publisher identifier write_block(128, ' '); // data preparer identifier @@ -1045,6 +1128,53 @@ static void pass(void) fill_sector(); } + // Supplementary Volume Descriptor + + if (joliet) + { + write_string("\2CD001\1"); + write_byte(0); + + write_word_block(16, L' '); // system identifier + + t = volume_label; + for (i = 0; i < 16; i++) + write_big_endian_word( (BYTE)( (*t != 0) ? *t++ : ' ' ) ); + + write_block(8, 0); + write_both_endian_dword(total_sectors); + write_string("%/E"); + write_block(29, 0); + write_both_endian_word((WORD) 1); // volume set size + write_both_endian_word((WORD) 1); // volume sequence number + write_both_endian_word((WORD) 2048); // sector size + write_both_endian_dword(joliet_path_table_size); + write_little_endian_dword(joliet_little_endian_path_table_sector); + write_little_endian_dword((DWORD) 0); // second little endian path table + write_big_endian_dword(joliet_big_endian_path_table_sector); + write_big_endian_dword((DWORD) 0); // second big endian path table + write_directory_record(&root, DOT_RECORD, TRUE); + write_word_block(64, ' '); // volume set identifier + write_word_block(64, ' '); // publisher identifier + write_word_block(64, ' '); // data preparer identifier + write_word_block(64, ' '); // application identifier + write_block(37, ' '); // copyright file identifier + write_block(37, ' '); // abstract file identifier + write_block(37, ' '); // bibliographic file identifier + write_string("0000000000000000"); // volume creation + write_byte(0); + write_string("0000000000000000"); // most recent modification + write_byte(0); + write_string("0000000000000000"); // volume expires + write_byte(0); + write_string("0000000000000000"); // volume is effective + write_byte(0); + write_byte(1); + write_byte(0); + fill_sector(); + } + + // Volume Descriptor Set Terminator write_string("\377CD001\1"); fill_sector(); @@ -1161,20 +1291,87 @@ static void pass(void) } fill_sector(); + if (joliet) + { + // Little Endian Path Table + + joliet_little_endian_path_table_sector = cd.sector; + write_byte(1); + write_byte(0); // number of sectors in extended attribute record + write_little_endian_dword(root.joliet_sector); + write_little_endian_word((WORD) 1); + write_byte(0); + write_byte(0); + + for (d = root.next_in_path_table; d != NULL; d = d->next_in_path_table) + { + name_length = strlen(d->joliet_name) * 2; + write_byte((BYTE)name_length); + write_byte(0); // number of sectors in extended attribute record + write_little_endian_dword(d->joliet_sector); + write_little_endian_word(d->parent->path_table_index); + write_string_as_big_endian_unicode(d->joliet_name); + } + + joliet_path_table_size = (cd.sector - joliet_little_endian_path_table_sector) * + SECTOR_SIZE + cd.offset; + fill_sector(); + + // Big Endian Path Table + + joliet_big_endian_path_table_sector = cd.sector; + write_byte(1); + write_byte(0); // number of sectors in extended attribute record + write_big_endian_dword(root.joliet_sector); + write_big_endian_word((WORD) 1); + write_byte(0); + write_byte(0); + + for (d = root.next_in_path_table; d != NULL; d = d->next_in_path_table) + { + name_length = strlen(d->joliet_name) * 2; + write_byte((BYTE)name_length); + write_byte(0); // number of sectors in extended attribute record + write_big_endian_dword(d->joliet_sector); + write_big_endian_word(d->parent->path_table_index); + write_string_as_big_endian_unicode(d->joliet_name); + } + fill_sector(); + } + // directories and files for (d = &root; d != NULL; d = d->next_in_path_table) { // write directory d->sector = cd.sector; - write_directory_record(d, DOT_RECORD); - write_directory_record(d == &root ? d : d->parent, DOT_DOT_RECORD); + write_directory_record(d, DOT_RECORD, FALSE); + write_directory_record(d == &root ? d : d->parent, DOT_DOT_RECORD, FALSE); for (q = d->first_record; q != NULL; q = q->next_in_directory) { write_directory_record(q, - q->flags & DIRECTORY_FLAG ? SUBDIRECTORY_RECORD : FILE_RECORD); + q->flags & DIRECTORY_FLAG ? SUBDIRECTORY_RECORD : FILE_RECORD, + FALSE); } fill_sector(); d->size = (cd.sector - d->sector) * SECTOR_SIZE; + + // write directory for joliet + if (joliet) + { + d->joliet_sector = cd.sector; + write_directory_record(d, DOT_RECORD, TRUE); + write_directory_record(d == &root ? d : d->parent, DOT_DOT_RECORD, TRUE); + for (q = d->first_record; q != NULL; q = q->next_in_directory) + { + write_directory_record(q, + q->flags & DIRECTORY_FLAG ? SUBDIRECTORY_RECORD : FILE_RECORD, + TRUE); + } + fill_sector(); + d->joliet_size = (cd.sector - d->joliet_sector) * SECTOR_SIZE; + bytes_in_directories += d->joliet_size; + } + number_of_directories++; bytes_in_directories += d->size; @@ -1183,7 +1380,7 @@ static void pass(void) { if ((q->flags & DIRECTORY_FLAG) == 0) { - q->sector = cd.sector; + q->sector = q->joliet_sector = cd.sector; size = q->size; if (cd.file == NULL) { @@ -1234,7 +1431,7 @@ static void pass(void) } static char HELP[] = - "CDMAKE [-q] [-v] [-p] [-s N] [-m] [-b bootimage] source volume image\n" + "CDMAKE [-q] [-v] [-p] [-s N] [-m] [-b bootimage] [-j] source volume image\n" "\n" " source specifications of base directory containing all files to\n" " be written to CD-ROM image\n" @@ -1248,7 +1445,8 @@ static char HELP[] = " larger than N megabytes (i.e. 1024*1024*N bytes)\n" " -m accept punctuation marks other than underscores in\n" " names and extensions\n" - " -b bootimage create bootable ElTorito CD-ROM using 'no emulation' mode\n"; + " -b bootimage create bootable ElTorito CD-ROM using 'no emulation' mode\n" + " -j generate Joliet filename records\n"; /*----------------------------------------------------------------------------- Program execution starts here. @@ -1324,6 +1522,8 @@ int main(int argc, char **argv) show_progress = TRUE; else if (strcmp(argv[i], "-m") == 0) accept_punctuation_marks = TRUE; + else if (strcmp(argv[i], "-j") == 0) + joliet = TRUE; else if (strcmp(argv[i], "-b") == 0) { strcpy(bootimage, argv[++i]); From 39ff6d3136f27357148e58d9f4ad3ec7b865b48e Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 5 Jun 2004 08:28:37 +0000 Subject: [PATCH 1328/1463] - Fixed calculation of MFT record size. - Fixed attribute finding/dumping bounds checking. - Fixed reading of volume information MFT record. - Disabled debug messages. svn path=/trunk/; revision=9615 --- reactos/drivers/fs/ntfs/attrib.c | 5 ++- reactos/drivers/fs/ntfs/close.c | 4 +- reactos/drivers/fs/ntfs/create.c | 4 +- reactos/drivers/fs/ntfs/dirctl.c | 4 +- reactos/drivers/fs/ntfs/fcb.c | 4 +- reactos/drivers/fs/ntfs/finfo.c | 4 +- reactos/drivers/fs/ntfs/fsctl.c | 66 +++++++++++-------------------- reactos/drivers/fs/ntfs/mft.c | 21 +++++----- reactos/drivers/fs/ntfs/ntfs.c | 4 +- reactos/drivers/fs/ntfs/ntfs.h | 10 +++-- reactos/drivers/fs/ntfs/rw.c | 4 +- reactos/drivers/fs/ntfs/volinfo.c | 4 +- 12 files changed, 60 insertions(+), 74 deletions(-) diff --git a/reactos/drivers/fs/ntfs/attrib.c b/reactos/drivers/fs/ntfs/attrib.c index 69c8fe0b0e0..0f3f657548c 100644 --- a/reactos/drivers/fs/ntfs/attrib.c +++ b/reactos/drivers/fs/ntfs/attrib.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: attrib.c,v 1.9 2004/01/28 20:53:06 ekohl Exp $ +/* $Id: attrib.c,v 1.10 2004/06/05 08:28:37 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -279,7 +279,8 @@ NtfsDumpFileAttributes (PFILE_RECORD_HEADER FileRecord) PATTRIBUTE Attribute; Attribute = (PATTRIBUTE)((ULONG_PTR)FileRecord + FileRecord->AttributeOffset); - while (Attribute->AttributeType !=-1) + while (Attribute < (PATTRIBUTE)((ULONG_PTR)FileRecord + FileRecord->BytesInUse) && + Attribute->AttributeType != -1) { NtfsDumpAttribute (Attribute); diff --git a/reactos/drivers/fs/ntfs/close.c b/reactos/drivers/fs/ntfs/close.c index 9c95e94af1a..f01c3c46452 100755 --- a/reactos/drivers/fs/ntfs/close.c +++ b/reactos/drivers/fs/ntfs/close.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: close.c,v 1.1 2003/07/17 13:31:39 chorns Exp $ +/* $Id: close.c,v 1.2 2004/06/05 08:28:37 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -30,7 +30,7 @@ #include <ddk/ntddk.h> -//#define NDEBUG +#define NDEBUG #include <debug.h> #include "ntfs.h" diff --git a/reactos/drivers/fs/ntfs/create.c b/reactos/drivers/fs/ntfs/create.c index 2c90949cb24..979f2582c3e 100644 --- a/reactos/drivers/fs/ntfs/create.c +++ b/reactos/drivers/fs/ntfs/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.3 2003/11/13 15:26:34 ekohl Exp $ +/* $Id: create.c,v 1.4 2004/06/05 08:28:37 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -29,7 +29,7 @@ #include <ddk/ntddk.h> -//#define NDEBUG +#define NDEBUG #include <debug.h> #include "ntfs.h" diff --git a/reactos/drivers/fs/ntfs/dirctl.c b/reactos/drivers/fs/ntfs/dirctl.c index 5f6ab07dda7..1afc0e05afd 100644 --- a/reactos/drivers/fs/ntfs/dirctl.c +++ b/reactos/drivers/fs/ntfs/dirctl.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: dirctl.c,v 1.7 2003/11/13 15:26:34 ekohl Exp $ +/* $Id: dirctl.c,v 1.8 2004/06/05 08:28:37 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -29,7 +29,7 @@ #include <ddk/ntddk.h> -//#define NDEBUG +#define NDEBUG #include <debug.h> #include "ntfs.h" diff --git a/reactos/drivers/fs/ntfs/fcb.c b/reactos/drivers/fs/ntfs/fcb.c index c38a7f98444..b4a7bff55b7 100644 --- a/reactos/drivers/fs/ntfs/fcb.c +++ b/reactos/drivers/fs/ntfs/fcb.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: fcb.c,v 1.10 2004/01/28 20:53:06 ekohl Exp $ +/* $Id: fcb.c,v 1.11 2004/06/05 08:28:37 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -32,7 +32,7 @@ #include "ntfs.h" -//#define NDEBUG +#define NDEBUG #include <debug.h> diff --git a/reactos/drivers/fs/ntfs/finfo.c b/reactos/drivers/fs/ntfs/finfo.c index 201cc950951..ca5d1b92ad9 100644 --- a/reactos/drivers/fs/ntfs/finfo.c +++ b/reactos/drivers/fs/ntfs/finfo.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: finfo.c,v 1.2 2003/07/17 13:31:39 chorns Exp $ +/* $Id: finfo.c,v 1.3 2004/06/05 08:28:37 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -29,7 +29,7 @@ #include <ddk/ntddk.h> -//#define NDEBUG +#define NDEBUG #include <debug.h> #include "ntfs.h" diff --git a/reactos/drivers/fs/ntfs/fsctl.c b/reactos/drivers/fs/ntfs/fsctl.c index 737fda90c4f..df09b4007e0 100644 --- a/reactos/drivers/fs/ntfs/fsctl.c +++ b/reactos/drivers/fs/ntfs/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.9 2003/11/12 15:30:21 ekohl Exp $ +/* $Id: fsctl.c,v 1.10 2004/06/05 08:28:37 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -31,7 +31,7 @@ #include <ddk/ntddk.h> #include <ntos/minmax.h> -#define NDEBUG +//#define NDEBUG #include <debug.h> #include "ntfs.h" @@ -122,7 +122,7 @@ NtfsHasFileSystem(PDEVICE_OBJECT DeviceToMount) static NTSTATUS NtfsGetVolumeData(PDEVICE_OBJECT DeviceObject, - PNTFS_INFO NtfsInfo) + PDEVICE_EXTENSION DeviceExt) { DISK_GEOMETRY DiskGeometry; PFILE_RECORD_HEADER MftRecord; @@ -130,9 +130,9 @@ NtfsGetVolumeData(PDEVICE_OBJECT DeviceObject, PVOLINFO_ATTRIBUTE VolumeInfo; PBOOT_SECTOR BootSector; PATTRIBUTE Attribute; - ULONG FileRecordSize; ULONG Size; NTSTATUS Status; + PNTFS_INFO NtfsInfo = &DeviceExt->NtfsInfo; DPRINT("NtfsGetVolumeData() called\n"); @@ -179,7 +179,10 @@ NtfsGetVolumeData(PDEVICE_OBJECT DeviceObject, NtfsInfo->MftStart.QuadPart = BootSector->MftLocation; NtfsInfo->MftMirrStart.QuadPart = BootSector->MftMirrLocation; NtfsInfo->SerialNumber = BootSector->SerialNumber; - NtfsInfo->ClustersPerFileRecord = BootSector->ClustersPerMftRecord; + if (BootSector->ClustersPerMftRecord > 0) + NtfsInfo->BytesPerFileRecord = BootSector->ClustersPerMftRecord * NtfsInfo->BytesPerCluster; + else + NtfsInfo->BytesPerFileRecord = 1 << (-BootSector->ClustersPerMftRecord); //#ifndef NDEBUG DbgPrint("Boot sector information:\n"); @@ -199,13 +202,8 @@ NtfsGetVolumeData(PDEVICE_OBJECT DeviceObject, ExFreePool(BootSector); - if (NtfsInfo->ClustersPerFileRecord == 0xF6) - FileRecordSize = NtfsInfo->ClustersPerFileRecord * NtfsInfo->BytesPerCluster; - else - FileRecordSize = NtfsInfo->BytesPerCluster; - MftRecord = ExAllocatePool(NonPagedPool, - FileRecordSize); + NtfsInfo->BytesPerFileRecord); if (MftRecord == NULL) { return STATUS_INSUFFICIENT_RESOURCES; @@ -213,7 +211,7 @@ NtfsGetVolumeData(PDEVICE_OBJECT DeviceObject, Status = NtfsReadSectors(DeviceObject, NtfsInfo->MftStart.u.LowPart * NtfsInfo->SectorsPerCluster, - FileRecordSize / NtfsInfo->BytesPerSector, + NtfsInfo->BytesPerFileRecord / NtfsInfo->BytesPerSector, NtfsInfo->BytesPerSector, (PVOID)MftRecord, TRUE); @@ -223,32 +221,20 @@ NtfsGetVolumeData(PDEVICE_OBJECT DeviceObject, return Status; } - if (NtfsInfo->ClustersPerFileRecord == 0xF6) + VolumeRecord = ExAllocatePool(NonPagedPool, NtfsInfo->BytesPerFileRecord); + if (VolumeRecord == NULL) { - VolumeRecord = (PVOID)((ULONG_PTR)MftRecord + 3 * (NtfsInfo->BytesPerCluster / 4)); + ExFreePool (MftRecord); + return STATUS_INSUFFICIENT_RESOURCES; } - else - { - VolumeRecord = ExAllocatePool(NonPagedPool, - FileRecordSize); - if (VolumeRecord == NULL) - { - ExFreePool (MftRecord); - return STATUS_INSUFFICIENT_RESOURCES; - } - /* Read cluster MftStart + 3 (Volume File) */ - Status = NtfsReadSectors(DeviceObject, - (NtfsInfo->MftStart.u.LowPart + 3) * NtfsInfo->SectorsPerCluster, - FileRecordSize / NtfsInfo->BytesPerSector, - NtfsInfo->BytesPerSector, - (PVOID)VolumeRecord, - TRUE); - if (!NT_SUCCESS(Status)) - { - ExFreePool (MftRecord); - return Status; - } + /* Read Volume File (MFT index 3) */ + DeviceExt->StorageDevice = DeviceObject; + Status = ReadFileRecord(DeviceExt, 3, VolumeRecord, MftRecord); + if (!NT_SUCCESS(Status)) + { + ExFreePool (MftRecord); + return Status; } #ifndef NDEBUG @@ -266,10 +252,10 @@ NtfsGetVolumeData(PDEVICE_OBJECT DeviceObject, /* Get volume name */ Attribute = FindAttribute (VolumeRecord, AttributeVolumeName, NULL); DPRINT("Attribute %p\n", Attribute); - DPRINT("Data length %lu\n", AttributeDataLength (Attribute)); if (Attribute != NULL && ((PRESIDENT_ATTRIBUTE)Attribute)->ValueLength != 0) { + DPRINT("Data length %lu\n", AttributeDataLength (Attribute)); NtfsInfo->VolumeLabelLength = min (((PRESIDENT_ATTRIBUTE)Attribute)->ValueLength, MAXIMUM_VOLUME_LABEL_LENGTH); RtlCopyMemory (NtfsInfo->VolumeLabel, @@ -284,10 +270,10 @@ NtfsGetVolumeData(PDEVICE_OBJECT DeviceObject, /* Get volume information */ Attribute = FindAttribute (VolumeRecord, AttributeVolumeInformation, NULL); DPRINT("Attribute %p\n", Attribute); - DPRINT("Data length %lu\n", AttributeDataLength (Attribute)); if (Attribute != NULL && ((PRESIDENT_ATTRIBUTE)Attribute)->ValueLength != 0) { + DPRINT("Data length %lu\n", AttributeDataLength (Attribute)); VolumeInfo = (PVOID)((ULONG_PTR)Attribute + ((PRESIDENT_ATTRIBUTE)Attribute)->ValueOffset); NtfsInfo->MajorVersion = VolumeInfo->MajorVersion; @@ -295,10 +281,6 @@ NtfsGetVolumeData(PDEVICE_OBJECT DeviceObject, NtfsInfo->Flags = VolumeInfo->Flags; } - if (NtfsInfo->ClustersPerFileRecord != 0xF6) - { - ExFreePool (VolumeRecord); - } ExFreePool (MftRecord); return Status; @@ -353,7 +335,7 @@ NtfsMountVolume(PDEVICE_OBJECT DeviceObject, sizeof(DEVICE_EXTENSION)); Status = NtfsGetVolumeData(DeviceToMount, - &DeviceExt->NtfsInfo); + DeviceExt); if (!NT_SUCCESS(Status)) goto ByeBye; diff --git a/reactos/drivers/fs/ntfs/mft.c b/reactos/drivers/fs/ntfs/mft.c index 60f5cd6851e..5cd19e28a4f 100644 --- a/reactos/drivers/fs/ntfs/mft.c +++ b/reactos/drivers/fs/ntfs/mft.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: mft.c,v 1.4 2003/11/13 15:26:34 ekohl Exp $ +/* $Id: mft.c,v 1.5 2004/06/05 08:28:37 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -31,7 +31,7 @@ #include <ddk/ntddk.h> #include <ntos/minmax.h> -//#define NDEBUG +#define NDEBUG #include <debug.h> #include "ntfs.h" @@ -60,8 +60,7 @@ NtfsOpenMft (PDEVICE_EXTENSION Vcb) DPRINT1("NtfsOpenMft() called\n"); - BytesPerFileRecord = - Vcb->NtfsInfo.ClustersPerFileRecord * Vcb->NtfsInfo.BytesPerCluster; + BytesPerFileRecord = Vcb->NtfsInfo.BytesPerFileRecord; MftRecord = ExAllocatePool(NonPagedPool, BytesPerFileRecord); @@ -129,7 +128,8 @@ FindAttribute (PFILE_RECORD_HEADER FileRecord, PATTRIBUTE Attribute; Attribute = (PATTRIBUTE)((ULONG_PTR)FileRecord + FileRecord->AttributeOffset); - while (Attribute->AttributeType != -1) + while (Attribute < (PATTRIBUTE)((ULONG_PTR)FileRecord + FileRecord->BytesInUse) && + Attribute->AttributeType != -1) { if (Attribute->AttributeType == Type) { @@ -189,18 +189,17 @@ ReadAttribute (PATTRIBUTE attr, -VOID +NTSTATUS ReadFileRecord (PDEVICE_EXTENSION Vcb, ULONG index, PFILE_RECORD_HEADER file, PFILE_RECORD_HEADER Mft) { PVOID p; - ULONG clusters = Vcb->NtfsInfo.ClustersPerFileRecord; - ULONG BytesPerFileRecord = clusters * Vcb->NtfsInfo.BytesPerCluster; + ULONG BytesPerFileRecord = Vcb->NtfsInfo.BytesPerFileRecord; + ULONG clusters = max(BytesPerFileRecord / Vcb->NtfsInfo.BytesPerCluster, 1); - - p = ExAllocatePool(NonPagedPool, BytesPerFileRecord); + p = ExAllocatePool(NonPagedPool, clusters * Vcb->NtfsInfo.BytesPerCluster); ULONGLONG vcn = index * BytesPerFileRecord / Vcb->NtfsInfo.BytesPerCluster; @@ -215,6 +214,8 @@ ReadFileRecord (PDEVICE_EXTENSION Vcb, ExFreePool(p); FixupUpdateSequenceArray(file); + + return STATUS_SUCCESS; } diff --git a/reactos/drivers/fs/ntfs/ntfs.c b/reactos/drivers/fs/ntfs/ntfs.c index dea8bec382a..1f25cdb0d9b 100644 --- a/reactos/drivers/fs/ntfs/ntfs.c +++ b/reactos/drivers/fs/ntfs/ntfs.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: ntfs.c,v 1.5 2004/02/10 16:22:56 navaraf Exp $ +/* $Id: ntfs.c,v 1.6 2004/06/05 08:28:37 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -30,7 +30,7 @@ #include <ddk/ntddk.h> #include <rosrtl/string.h> -//#define NDEBUG +#define NDEBUG #include <debug.h> #include "ntfs.h" diff --git a/reactos/drivers/fs/ntfs/ntfs.h b/reactos/drivers/fs/ntfs/ntfs.h index d184a0beed2..35121155a26 100644 --- a/reactos/drivers/fs/ntfs/ntfs.h +++ b/reactos/drivers/fs/ntfs/ntfs.h @@ -29,8 +29,10 @@ typedef struct _BOOT_SECTOR ULONGLONG SectorCount; ULONGLONG MftLocation; ULONGLONG MftMirrLocation; - ULONG ClustersPerMftRecord; - ULONG ClustersPerIndexRecord; + CHAR ClustersPerMftRecord; + BYTE Unused3[3]; + CHAR ClustersPerIndexRecord; + BYTE Unused4[3]; ULONGLONG SerialNumber; // 0x48 UCHAR BootCode[432]; // 0x50 } __attribute__((packed)) BOOT_SECTOR, *PBOOT_SECTOR; @@ -49,7 +51,7 @@ typedef struct _NTFS_INFO ULONGLONG SectorCount; ULARGE_INTEGER MftStart; ULARGE_INTEGER MftMirrStart; - ULONG ClustersPerFileRecord; + ULONG BytesPerFileRecord; ULONGLONG SerialNumber; USHORT VolumeLabelLength; @@ -423,7 +425,7 @@ ReadAttribute(PATTRIBUTE attr, PVOID buffer, PDEVICE_EXTENSION Vcb, ULONG AttributeDataLength(PATTRIBUTE attr); -VOID +NTSTATUS ReadFileRecord (PDEVICE_EXTENSION Vcb, ULONG index, PFILE_RECORD_HEADER file, diff --git a/reactos/drivers/fs/ntfs/rw.c b/reactos/drivers/fs/ntfs/rw.c index eeeeaf069b8..0f2e757795d 100755 --- a/reactos/drivers/fs/ntfs/rw.c +++ b/reactos/drivers/fs/ntfs/rw.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: rw.c,v 1.2 2003/11/13 15:26:34 ekohl Exp $ +/* $Id: rw.c,v 1.3 2004/06/05 08:28:37 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -31,7 +31,7 @@ #include <ddk/ntddk.h> #include <ntos/minmax.h> -//#define NDEBUG +#define NDEBUG #include <debug.h> #include "ntfs.h" diff --git a/reactos/drivers/fs/ntfs/volinfo.c b/reactos/drivers/fs/ntfs/volinfo.c index bcc8d44f667..155a176ab8e 100644 --- a/reactos/drivers/fs/ntfs/volinfo.c +++ b/reactos/drivers/fs/ntfs/volinfo.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: volinfo.c,v 1.3 2003/11/12 15:30:21 ekohl Exp $ +/* $Id: volinfo.c,v 1.4 2004/06/05 08:28:37 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -29,7 +29,7 @@ #include <ddk/ntddk.h> -//#define NDEBUG +#define NDEBUG #include <debug.h> #include "ntfs.h" From 3d8820b2b15f7dc43ceaa90c80398e22f47ffc8d Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sat, 5 Jun 2004 09:08:58 +0000 Subject: [PATCH 1329/1463] - Added the '<>|' key. svn path=/trunk/; revision=9616 --- reactos/lib/kbdgr/kbdgr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/kbdgr/kbdgr.c b/reactos/lib/kbdgr/kbdgr.c index a530e9ab6ae..a2f0e6d5a78 100644 --- a/reactos/lib/kbdgr/kbdgr.c +++ b/reactos/lib/kbdgr/kbdgr.c @@ -120,7 +120,7 @@ ROSDATA USHORT scancode_to_vk[] = { VK_SNAPSHOT, /* - 55 - */ /* Oddities, and the remaining standard F-Keys */ - VK_EMPTY, VK_EMPTY, VK_F11, VK_F12, + VK_EMPTY, VK_OEM_102, VK_F11, VK_F12, /* - 59 - */ VK_CLEAR, VK_EMPTY, VK_EMPTY, VK_EMPTY, VK_EMPTY, /* EREOF */ VK_EMPTY, VK_EMPTY, VK_EMPTY, VK_EMPTY, VK_EMPTY, /* ZOOM */ From f3f89873bd4ce936f6bccf9be16ff8992637f144 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 5 Jun 2004 09:35:51 +0000 Subject: [PATCH 1330/1463] - Report the /MININT option for Live CD boots. svn path=/trunk/; revision=9617 --- freeldr/freeldr/reactos/reactos.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freeldr/freeldr/reactos/reactos.c b/freeldr/freeldr/reactos/reactos.c index 5d71163923a..37963549574 100644 --- a/freeldr/freeldr/reactos/reactos.c +++ b/freeldr/freeldr/reactos/reactos.c @@ -523,7 +523,7 @@ LoadAndBootReactOS(PUCHAR OperatingSystemName) /* Set kernel command line */ sprintf(multiboot_kernel_cmdline, - "multi(0)disk(0)cdrom(%u)\\reactos", + "multi(0)disk(0)cdrom(%u)\\reactos /MININT", (unsigned int)BootDrive); } else From 73dfa9e66a3580cf5ca52945b7157d1f486cf0cb Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 5 Jun 2004 09:35:52 +0000 Subject: [PATCH 1331/1463] - Disable paging file for Live CD. svn path=/trunk/; revision=9618 --- reactos/subsys/smss/init.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/smss/init.c b/reactos/subsys/smss/init.c index 1176746aa3b..732651a95b8 100644 --- a/reactos/subsys/smss/init.c +++ b/reactos/subsys/smss/init.c @@ -1,4 +1,4 @@ -/* $Id: init.c,v 1.54 2004/01/06 16:10:11 ekohl Exp $ +/* $Id: init.c,v 1.55 2004/06/05 09:35:52 navaraf Exp $ * * init.c - Session Manager initialization * @@ -634,6 +634,14 @@ SmCreatePagingFiles(VOID) RTL_QUERY_REGISTRY_TABLE QueryTable[2]; NTSTATUS Status; + /* + * Disable paging file on MiniNT/Live CD. + */ + if (RtlCheckRegistryKey(RTL_REGISTRY_CONTROL, L"MiniNT") == STATUS_SUCCESS) + { + return STATUS_SUCCESS; + } + RtlZeroMemory(&QueryTable, sizeof(QueryTable)); From c530406b93d433be3521e2ad61531d86ed6c9e7d Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sat, 5 Jun 2004 09:47:36 +0000 Subject: [PATCH 1332/1463] - Changed back to the old variable NASM_CMD. svn path=/trunk/; revision=9619 --- reactos/loaders/dos/makefile | 4 ++-- reactos/rules.mak | 4 ++-- reactos/tools/depend.mk | 2 +- reactos/tools/helper.mk | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/reactos/loaders/dos/makefile b/reactos/loaders/dos/makefile index be1f5452466..b45e117c7ec 100644 --- a/reactos/loaders/dos/makefile +++ b/reactos/loaders/dos/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.10 2004/06/02 18:24:08 hyperion Exp $ +# $Id: makefile,v 1.11 2004/06/05 09:47:36 hbirr Exp $ PATH_TO_TOP = ../.. @@ -7,7 +7,7 @@ include $(PATH_TO_TOP)/rules.mak all: loadros.com loadros.com: loadros.asm - $(NASM) -fbin -o loadros.com loadros.asm + $(NASM_CMD) -fbin -o loadros.com loadros.asm clean: - $(RM) loadros.com diff --git a/reactos/rules.mak b/reactos/rules.mak index 0eff03b57f7..7ab3a6a8528 100644 --- a/reactos/rules.mak +++ b/reactos/rules.mak @@ -28,7 +28,7 @@ PREFIX = mingw32- EXE_POSTFIX := EXE_PREFIX := ./ DLLTOOL = $(PREFIX)dlltool --as=$(PREFIX)as -NASM = nasm +NASM_CMD = nasm DOSCLI = FLOPPY_DIR = /mnt/floppy SEP := / @@ -41,7 +41,7 @@ PREFIX = EXE_PREFIX := EXE_POSTFIX := .exe DLLTOOL = $(PREFIX)dlltool --as=$(PREFIX)as -NASM = nasmw +NASM_CMD = nasmw DOSCLI = yes FLOPPY_DIR = A: SEP := \$(EMPTY_VAR) diff --git a/reactos/tools/depend.mk b/reactos/tools/depend.mk index 8f4af5d1ffc..6cd82d07e6f 100644 --- a/reactos/tools/depend.mk +++ b/reactos/tools/depend.mk @@ -35,4 +35,4 @@ endif $(CC) $(CFLAGS) -M $< | $(DEPENDS_PATH)$(SEP)depends$(EXE_POSTFIX) $(@D) $@ .%.d: %.asm $(PATH_TO_TOP)/tools/depends$(EXE_POSTFIX) $(GENERATED_HEADER_FILES) - $(NASM) $(NFLAGS) -M $< | $(DEPENDS_PATH)$(SEP)depends$(EXE_POSTFIX) $(@D) $@ + $(NASM_CMD) $(NFLAGS) -M $< | $(DEPENDS_PATH)$(SEP)depends$(EXE_POSTFIX) $(@D) $@ diff --git a/reactos/tools/helper.mk b/reactos/tools/helper.mk index 7bad4a6e9e9..bbc7fceefff 100644 --- a/reactos/tools/helper.mk +++ b/reactos/tools/helper.mk @@ -1,4 +1,4 @@ -# $Id: helper.mk,v 1.66 2004/06/03 03:09:01 hyperion Exp $ +# $Id: helper.mk,v 1.67 2004/06/05 09:47:35 hbirr Exp $ # # Helper makefile for ReactOS modules # Variables this makefile accepts: @@ -1059,7 +1059,7 @@ endif # ROS_USE_PCH %.o: %.s $(AS) $(TARGET_ASFLAGS) -c $< -o $@ %.o: %.asm - $(NASM) $(TARGET_NFLAGS) $< -o $@ + $(NASM_CMD) $(TARGET_NFLAGS) $< -o $@ %.coff: %.rc $(RC) $(TARGET_RCFLAGS) $< -o $@ %.spec.def: %.spec From f79f677f017baebd6d29884707091e3e2a188760 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sat, 5 Jun 2004 10:21:59 +0000 Subject: [PATCH 1333/1463] - Added a comment for NASM_CMD. svn path=/trunk/; revision=9620 --- reactos/rules.mak | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/reactos/rules.mak b/reactos/rules.mak index 7ab3a6a8528..fa84e83cbf2 100644 --- a/reactos/rules.mak +++ b/reactos/rules.mak @@ -28,6 +28,10 @@ PREFIX = mingw32- EXE_POSTFIX := EXE_PREFIX := ./ DLLTOOL = $(PREFIX)dlltool --as=$(PREFIX)as +# +# Do not change NASM_CMD to NASM because older versions of +# nasm doesn't like an environment variable NASM +# NASM_CMD = nasm DOSCLI = FLOPPY_DIR = /mnt/floppy @@ -41,6 +45,10 @@ PREFIX = EXE_PREFIX := EXE_POSTFIX := .exe DLLTOOL = $(PREFIX)dlltool --as=$(PREFIX)as +# +# Do not change NASM_CMD to NASM because older versions of +# nasm doesn't like an environment variable NASM +# NASM_CMD = nasmw DOSCLI = yes FLOPPY_DIR = A: From 97d7e660f0871351d62a357105e0b0d35ceee436 Mon Sep 17 00:00:00 2001 From: Casper Hornstrup <chorns@users.sourceforge.net> Date: Sat, 5 Jun 2004 10:47:27 +0000 Subject: [PATCH 1334/1463] 2004-06-05 Casper S. Hornstrup <chorns@users.sourceforge.net> * tools/helper.mk: Skip automatic dependency tracking if DEPENDENCIES=no. svn path=/trunk/; revision=9621 --- reactos/ChangeLog | 5 +++++ reactos/tools/depend.mk | 8 ++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/reactos/ChangeLog b/reactos/ChangeLog index fa2b7428945..2b0348d9cb8 100644 --- a/reactos/ChangeLog +++ b/reactos/ChangeLog @@ -1,3 +1,8 @@ +2004-06-05 Casper S. Hornstrup <chorns@users.sourceforge.net> + + * tools/helper.mk: Skip automatic dependency tracking if + DEPENDENCIES=no. + 2004-05-31 Casper S. Hornstrup <chorns@users.sourceforge.net> * include/reactos/version.h (KERNEL_VERSION_BUILD_TYPE): Replace possible diff --git a/reactos/tools/depend.mk b/reactos/tools/depend.mk index 6cd82d07e6f..7aa7f403242 100644 --- a/reactos/tools/depend.mk +++ b/reactos/tools/depend.mk @@ -2,12 +2,10 @@ # Define $DEP_OBJECTS before this file is included # $DEP_OBJECTS contain a list of object files that are checked for dependancies +ifneq ($(DEPENDENCIES),no) + DEP_FILTERED := $(filter-out $(DEP_EXCLUDE_FILTER), $(DEP_OBJECTS:.o=.d)) DEP_FILES := $(join $(dir $(DEP_FILTERED)), $(addprefix ., $(notdir $(DEP_FILTERED)))) - - -# I (Andrew Greenwood) had to add this to compile under MinGW: -# SEP = / ifneq ($(MAKECMDGOALS),clean) -include $(DEP_FILES) @@ -36,3 +34,5 @@ endif .%.d: %.asm $(PATH_TO_TOP)/tools/depends$(EXE_POSTFIX) $(GENERATED_HEADER_FILES) $(NASM_CMD) $(NFLAGS) -M $< | $(DEPENDS_PATH)$(SEP)depends$(EXE_POSTFIX) $(@D) $@ + +endif From f30f61c8faf1bcfa4e250b530178b5480ba91449 Mon Sep 17 00:00:00 2001 From: Casper Hornstrup <chorns@users.sourceforge.net> Date: Sat, 5 Jun 2004 11:11:13 +0000 Subject: [PATCH 1335/1463] 2004-06-05 Casper S. Hornstrup <chorns@users.sourceforge.net> * Makefile: Split target all into three parts, one that must be executed alone and two that can be executed concurrently. svn path=/trunk/; revision=9622 --- reactos/ChangeLog | 5 +++++ reactos/Makefile | 33 +++++++++++++++++---------------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/reactos/ChangeLog b/reactos/ChangeLog index 2b0348d9cb8..fa307bd6b35 100644 --- a/reactos/ChangeLog +++ b/reactos/ChangeLog @@ -1,3 +1,8 @@ +2004-06-05 Casper S. Hornstrup <chorns@users.sourceforge.net> + + * Makefile: Split target all into three parts, one that must be executed + alone and two that can be executed concurrently. + 2004-06-05 Casper S. Hornstrup <chorns@users.sourceforge.net> * tools/helper.mk: Skip automatic dependency tracking if diff --git a/reactos/Makefile b/reactos/Makefile index 9a4b7fd7a8a..a05bc797289 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.226 2004/06/04 23:44:26 navaraf Exp $ +# $Id: Makefile,v 1.227 2004/06/05 11:11:13 chorns Exp $ # # Global makefile # @@ -16,8 +16,8 @@ endif include $(PATH_TO_TOP)/rules.mak -# Required to run the system -COMPONENTS = iface_native iface_additional hallib ntoskrnl +# System call entry points and ntoskrnl dependants +COMPONENTS = iface_native iface_additional hallib # Hardware Abstraction Layers # halx86 @@ -117,25 +117,26 @@ KERNEL_DRIVERS = $(DRIVERS_LIB) $(DEVICE_DRIVERS) $(INPUT_DRIVERS) $(FS_DRIVERS) # Regression tests REGTESTS = regtests -all: tools dk implib $(LIB_STATIC) $(COMPONENTS) $(REGTESTS) $(HALS) $(BUS) $(LIB_FSLIB) $(DLLS) $(SUBSYS) \ - $(LOADERS) $(KERNEL_DRIVERS) $(SYS_APPS) $(SYS_SVC) \ - $(APPS) $(EXT_MODULES) +sequence: tools dk implib $(LIB_STATIC) $(COMPONENTS) -#config: $(TOOLS:%=%_config) +part1: ntoskrnl $(REGTESTS) $(HALS) $(BUS) $(LIB_FSLIB) $(DLLS) + +part2: $(SUBSYS) $(LOADERS) $(KERNEL_DRIVERS) $(SYS_APPS) $(SYS_SVC) $(APPS) $(EXT_MODULES) + +all: sequence part1 part2 depends: $(LIB_STATIC:%=%_depends) $(LIB_FSLIB:%=%_depends) $(DLLS:%=%_depends) $(SUBSYS:%=%_depends) $(SYS_SVC:%=%_depends) \ $(EXT_MODULES:%=%_depends) $(POSIX_LIBS:%=%_depends) -implib: $(COMPONENTS:%=%_implib) $(HALS:%=%_implib) $(BUS:%=%_implib) \ +implib: ntoskrnl_implib $(COMPONENTS:%=%_implib) $(HALS:%=%_implib) $(BUS:%=%_implib) \ $(LIB_STATIC:%=%_implib) $(LIB_FSLIB:%=%_implib) $(DLLS:%=%_implib) $(LOADERS:%=%_implib) \ $(KERNEL_DRIVERS:%=%_implib) $(SUBSYS:%=%_implib) \ $(SYS_SVC:%=%_implib) $(EXT_MODULES:%=%_implib) -clean: tools dk_clean $(HALS:%=%_clean) \ - $(COMPONENTS:%=%_clean) $(BUS:%=%_clean) $(LIB_STATIC:%=%_clean) $(LIB_FSLIB:%=%_clean) $(DLLS:%=%_clean) \ - $(LOADERS:%=%_clean) $(KERNEL_DRIVERS:%=%_clean) $(SUBSYS:%=%_clean) \ - $(SYS_APPS:%=%_clean) $(SYS_SVC:%=%_clean) \ - $(NET_APPS:%=%_clean) \ +clean: tools dk_clean \ + ntoskrnl_clean $(COMPONENTS:%=%_clean) $(HALS:%=%_clean) $(BUS:%=%_clean) $(LIB_STATIC:%=%_clean) \ + $(LIB_FSLIB:%=%_clean) $(DLLS:%=%_clean) $(LOADERS:%=%_clean) $(KERNEL_DRIVERS:%=%_clean) \ + $(SUBSYS:%=%_clean) $(SYS_APPS:%=%_clean) $(SYS_SVC:%=%_clean) $(NET_APPS:%=%_clean) \ $(APPS:%=%_clean) $(EXT_MODULES:%=%_clean) $(REGTESTS:%=%_clean) \ clean_after tools_clean @@ -143,7 +144,7 @@ clean_after: $(RM) $(PATH_TO_TOP)/include/roscfg.h fastinstall: tools install_dirs install_before \ - $(COMPONENTS:%=%_install) $(HALS:%=%_install) $(BUS:%=%_install) \ + ntoskrnl_install $(COMPONENTS:%=%_install) $(HALS:%=%_install) $(BUS:%=%_install) \ $(LIB_STATIC:%=%_install) $(LIB_FSLIB:%=%_install) $(DLLS:%=%_install) $(LOADERS:%=%_install) \ $(KERNEL_DRIVERS:%=%_install) $(SUBSYS:%=%_install) \ $(SYS_APPS:%=%_install) $(SYS_SVC:%=%_install) \ @@ -170,7 +171,7 @@ bootcd_directory_layout: $(CP) ${FREELDR_DIR}/freeldr/obj/i386/freeldr.sys ${BOOTCD_DIR}/loader/freeldr.sys $(CP) ${FREELDR_DIR}/freeldr/obj/i386/setupldr.sys ${BOOTCD_DIR}/loader/setupldr.sys -bootcd_bootstrap_files: $(COMPONENTS:%=%_bootcd) $(HALS:%=%_bootcd) $(BUS:%=%_bootcd) \ +bootcd_bootstrap_files: ntoskrnl_bootcd $(COMPONENTS:%=%_bootcd) $(HALS:%=%_bootcd) $(BUS:%=%_bootcd) \ $(LIB_STATIC:%=%_bootcd) $(LIB_FSLIB:%=%_bootcd) $(DLLS:%=%_bootcd) $(KERNEL_DRIVERS:%=%_bootcd) \ $(SUBSYS:%=%_bootcd) $(SYS_APPS:%=%_bootcd) @@ -230,7 +231,7 @@ livecd: livecd_basic livecd_makecd registry: tools $(TOOLS_PATH)/mkhive/mkhive$(EXE_POSTFIX) bootdata $(INSTALL_DIR)/system32/config -.PHONY: all depends implib clean clean_before install freeldr bootcd_directory_layout \ +.PHONY: all sequence part1 part2 depends implib clean clean_before install freeldr bootcd_directory_layout \ bootcd_bootstrap_files bootcd_install_before bootcd_basic bootcd_makecd ubootcd_unattend bootcd From c81a4db568c9d18923ac485926ef453928e7ec10 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sat, 5 Jun 2004 12:06:41 +0000 Subject: [PATCH 1336/1463] - Changed back to the old variable NASM_CMD. svn path=/trunk/; revision=9623 --- reactos/ntoskrnl/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/Makefile b/reactos/ntoskrnl/Makefile index 518d20ff68e..5223a7c1dc5 100644 --- a/reactos/ntoskrnl/Makefile +++ b/reactos/ntoskrnl/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.122 2004/06/02 18:24:09 hyperion Exp $ +# $Id: Makefile,v 1.123 2004/06/05 12:06:41 hbirr Exp $ # # ReactOS Operating System # @@ -744,7 +744,7 @@ ke/main.o: ke/main.c $(PATH_TO_TOP)/include/reactos/buildno.h %.o: %.s $(AS) $(ASFLAGS) -c $< -o $@ %.o: %.asm - $(NASM) $(NFLAGS) $< -o $@ + $(NASM_CMD) $(NFLAGS) $< -o $@ %.coff: %.rc $(RC) $(RCFLAGS) $< -o $@ From 037ba1baea06af53d84852c4979f8cb9076dda3a Mon Sep 17 00:00:00 2001 From: Casper Hornstrup <chorns@users.sourceforge.net> Date: Sat, 5 Jun 2004 13:39:02 +0000 Subject: [PATCH 1337/1463] Revert: 2004-06-05 Casper S. Hornstrup <chorns@users.sourceforge.net> * Makefile: Split target all into three parts, one that must be executed alone and two that can be executed concurrently. svn path=/trunk/; revision=9624 --- reactos/ChangeLog | 5 ----- reactos/Makefile | 33 ++++++++++++++++----------------- 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/reactos/ChangeLog b/reactos/ChangeLog index fa307bd6b35..2b0348d9cb8 100644 --- a/reactos/ChangeLog +++ b/reactos/ChangeLog @@ -1,8 +1,3 @@ -2004-06-05 Casper S. Hornstrup <chorns@users.sourceforge.net> - - * Makefile: Split target all into three parts, one that must be executed - alone and two that can be executed concurrently. - 2004-06-05 Casper S. Hornstrup <chorns@users.sourceforge.net> * tools/helper.mk: Skip automatic dependency tracking if diff --git a/reactos/Makefile b/reactos/Makefile index a05bc797289..db3d6257a38 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.227 2004/06/05 11:11:13 chorns Exp $ +# $Id: Makefile,v 1.228 2004/06/05 13:39:02 chorns Exp $ # # Global makefile # @@ -16,8 +16,8 @@ endif include $(PATH_TO_TOP)/rules.mak -# System call entry points and ntoskrnl dependants -COMPONENTS = iface_native iface_additional hallib +# Required to run the system +COMPONENTS = iface_native iface_additional hallib ntoskrnl # Hardware Abstraction Layers # halx86 @@ -117,26 +117,25 @@ KERNEL_DRIVERS = $(DRIVERS_LIB) $(DEVICE_DRIVERS) $(INPUT_DRIVERS) $(FS_DRIVERS) # Regression tests REGTESTS = regtests -sequence: tools dk implib $(LIB_STATIC) $(COMPONENTS) +all: tools dk implib $(LIB_STATIC) $(COMPONENTS) $(REGTESTS) $(HALS) $(BUS) $(LIB_FSLIB) $(DLLS) $(SUBSYS) \ + $(LOADERS) $(KERNEL_DRIVERS) $(SYS_APPS) $(SYS_SVC) \ + $(APPS) $(EXT_MODULES) -part1: ntoskrnl $(REGTESTS) $(HALS) $(BUS) $(LIB_FSLIB) $(DLLS) - -part2: $(SUBSYS) $(LOADERS) $(KERNEL_DRIVERS) $(SYS_APPS) $(SYS_SVC) $(APPS) $(EXT_MODULES) - -all: sequence part1 part2 +#config: $(TOOLS:%=%_config) depends: $(LIB_STATIC:%=%_depends) $(LIB_FSLIB:%=%_depends) $(DLLS:%=%_depends) $(SUBSYS:%=%_depends) $(SYS_SVC:%=%_depends) \ $(EXT_MODULES:%=%_depends) $(POSIX_LIBS:%=%_depends) -implib: ntoskrnl_implib $(COMPONENTS:%=%_implib) $(HALS:%=%_implib) $(BUS:%=%_implib) \ +implib: $(COMPONENTS:%=%_implib) $(HALS:%=%_implib) $(BUS:%=%_implib) \ $(LIB_STATIC:%=%_implib) $(LIB_FSLIB:%=%_implib) $(DLLS:%=%_implib) $(LOADERS:%=%_implib) \ $(KERNEL_DRIVERS:%=%_implib) $(SUBSYS:%=%_implib) \ $(SYS_SVC:%=%_implib) $(EXT_MODULES:%=%_implib) -clean: tools dk_clean \ - ntoskrnl_clean $(COMPONENTS:%=%_clean) $(HALS:%=%_clean) $(BUS:%=%_clean) $(LIB_STATIC:%=%_clean) \ - $(LIB_FSLIB:%=%_clean) $(DLLS:%=%_clean) $(LOADERS:%=%_clean) $(KERNEL_DRIVERS:%=%_clean) \ - $(SUBSYS:%=%_clean) $(SYS_APPS:%=%_clean) $(SYS_SVC:%=%_clean) $(NET_APPS:%=%_clean) \ +clean: tools dk_clean $(HALS:%=%_clean) \ + $(COMPONENTS:%=%_clean) $(BUS:%=%_clean) $(LIB_STATIC:%=%_clean) $(LIB_FSLIB:%=%_clean) $(DLLS:%=%_clean) \ + $(LOADERS:%=%_clean) $(KERNEL_DRIVERS:%=%_clean) $(SUBSYS:%=%_clean) \ + $(SYS_APPS:%=%_clean) $(SYS_SVC:%=%_clean) \ + $(NET_APPS:%=%_clean) \ $(APPS:%=%_clean) $(EXT_MODULES:%=%_clean) $(REGTESTS:%=%_clean) \ clean_after tools_clean @@ -144,7 +143,7 @@ clean_after: $(RM) $(PATH_TO_TOP)/include/roscfg.h fastinstall: tools install_dirs install_before \ - ntoskrnl_install $(COMPONENTS:%=%_install) $(HALS:%=%_install) $(BUS:%=%_install) \ + $(COMPONENTS:%=%_install) $(HALS:%=%_install) $(BUS:%=%_install) \ $(LIB_STATIC:%=%_install) $(LIB_FSLIB:%=%_install) $(DLLS:%=%_install) $(LOADERS:%=%_install) \ $(KERNEL_DRIVERS:%=%_install) $(SUBSYS:%=%_install) \ $(SYS_APPS:%=%_install) $(SYS_SVC:%=%_install) \ @@ -171,7 +170,7 @@ bootcd_directory_layout: $(CP) ${FREELDR_DIR}/freeldr/obj/i386/freeldr.sys ${BOOTCD_DIR}/loader/freeldr.sys $(CP) ${FREELDR_DIR}/freeldr/obj/i386/setupldr.sys ${BOOTCD_DIR}/loader/setupldr.sys -bootcd_bootstrap_files: ntoskrnl_bootcd $(COMPONENTS:%=%_bootcd) $(HALS:%=%_bootcd) $(BUS:%=%_bootcd) \ +bootcd_bootstrap_files: $(COMPONENTS:%=%_bootcd) $(HALS:%=%_bootcd) $(BUS:%=%_bootcd) \ $(LIB_STATIC:%=%_bootcd) $(LIB_FSLIB:%=%_bootcd) $(DLLS:%=%_bootcd) $(KERNEL_DRIVERS:%=%_bootcd) \ $(SUBSYS:%=%_bootcd) $(SYS_APPS:%=%_bootcd) @@ -231,7 +230,7 @@ livecd: livecd_basic livecd_makecd registry: tools $(TOOLS_PATH)/mkhive/mkhive$(EXE_POSTFIX) bootdata $(INSTALL_DIR)/system32/config -.PHONY: all sequence part1 part2 depends implib clean clean_before install freeldr bootcd_directory_layout \ +.PHONY: all depends implib clean clean_before install freeldr bootcd_directory_layout \ bootcd_bootstrap_files bootcd_install_before bootcd_basic bootcd_makecd ubootcd_unattend bootcd From 6110c706c4770d86d7db48c7f5feb5c0e42dbf06 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 5 Jun 2004 18:39:46 +0000 Subject: [PATCH 1338/1463] - Fixed getting of menu item texts in GetMenuItemInfo[AW]. Fixes bug #316. - Fixed memory leak in MenuDrawPopupMenu. svn path=/trunk/; revision=9625 --- reactos/lib/user32/windows/menu.c | 100 +++++++++++++++++++----------- 1 file changed, 63 insertions(+), 37 deletions(-) diff --git a/reactos/lib/user32/windows/menu.c b/reactos/lib/user32/windows/menu.c index fdf8545d00f..6471972b90c 100644 --- a/reactos/lib/user32/windows/menu.c +++ b/reactos/lib/user32/windows/menu.c @@ -21,7 +21,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: menu.c,v 1.68 2004/05/16 19:31:07 navaraf Exp $ +/* $Id: menu.c,v 1.69 2004/06/05 18:39:46 navaraf Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/menu.c @@ -917,6 +917,8 @@ MenuDrawPopupMenu(HWND Wnd, HDC Dc, HMENU Menu) MenuInfo.Height, FALSE, ODA_DRAWENTIRE); } } + + MenuCleanupRosMenuItemInfo(&ItemInfo); } } else @@ -3740,59 +3742,83 @@ GetMenuItemID(HMENU hMenu, */ BOOL STDCALL GetMenuItemInfoA( - HMENU Menu, - UINT Item, - BOOL ByPosition, - LPMENUITEMINFOA mii) + HMENU Menu, + UINT Item, + BOOL ByPosition, + LPMENUITEMINFOA mii) { - LPSTR AString; - UINT ACch; + UNICODE_STRING Text; + CHAR *AnsiString; - if (0 == (mii->fMask & (MIIM_STRING | MIIM_TYPE))) - { + if ((mii->fMask & (MIIM_STRING | MIIM_TYPE)) == 0) + { /* No text requested, just pass on */ return NtUserMenuItemInfo(Menu, Item, ByPosition, (PROSMENUITEMINFO) mii, FALSE); - } + } - AString = mii->dwTypeData; - ACch = mii->cch; - mii->dwTypeData = HeapAlloc(GetProcessHeap(), 0, mii->cch * sizeof(WCHAR)); - if (NULL == mii->dwTypeData) - { - mii->dwTypeData = AString; + Text.Length = 0; + Text.MaximumLength = mii->cch * sizeof(WCHAR); + Text.Buffer = RtlAllocateHeap(GetProcessHeap(), 0, mii->cch * sizeof(WCHAR)); + if (mii->dwTypeData == NULL) return FALSE; - } - if (! NtUserMenuItemInfo(Menu, Item, ByPosition, (PROSMENUITEMINFO) mii, FALSE)) - { + AnsiString = mii->dwTypeData; + mii->dwTypeData = (LPSTR) &Text; + + if (!NtUserMenuItemInfo(Menu, Item, ByPosition, (PROSMENUITEMINFO)mii, FALSE)) + { HeapFree(GetProcessHeap(), 0, mii->dwTypeData); - mii->dwTypeData = AString; + mii->dwTypeData = AnsiString; return FALSE; - } - - if (IS_STRING_ITEM(mii->fType)) - { - WideCharToMultiByte(CP_ACP, 0, (LPWSTR) mii->dwTypeData, mii->cch, AString, ACch, - NULL, NULL); - } - HeapFree(GetProcessHeap(), 0, mii->dwTypeData); - mii->dwTypeData = AString; + } - return TRUE; + if (IS_STRING_ITEM(mii->fType)) + { + WideCharToMultiByte(CP_ACP, 0, Text.Buffer, mii->cch, AnsiString, mii->cch, + NULL, NULL); + if (Text.MaximumLength > Text.Length) + AnsiString[mii->cch] = 0; + } + + RtlFreeHeap(GetProcessHeap(), 0, Text.Buffer); + mii->dwTypeData = AnsiString; + + return TRUE; } /* * @implemented */ -BOOL -STDCALL +BOOL STDCALL GetMenuItemInfoW( - HMENU Menu, - UINT Item, - BOOL ByPosition, - LPMENUITEMINFOW mii) + HMENU Menu, + UINT Item, + BOOL ByPosition, + LPMENUITEMINFOW mii) { - return NtUserMenuItemInfo(Menu, Item, ByPosition, (PROSMENUITEMINFO) mii, FALSE); + UNICODE_STRING Text; + WCHAR *UnicodeString; + + if ((mii->fMask & (MIIM_STRING | MIIM_TYPE)) == 0) + { + /* No text requested, just pass on */ + return NtUserMenuItemInfo(Menu, Item, ByPosition, (PROSMENUITEMINFO) mii, FALSE); + } + + Text.Length = 0; + Text.MaximumLength = mii->cch * sizeof(WCHAR); + Text.Buffer = mii->dwTypeData; + UnicodeString = mii->dwTypeData; + mii->dwTypeData = (LPWSTR) &Text; + + if (!NtUserMenuItemInfo(Menu, Item, ByPosition, (PROSMENUITEMINFO)mii, FALSE)) + { + mii->dwTypeData = UnicodeString; + return FALSE; + } + + mii->dwTypeData = UnicodeString; + return TRUE; } From 893efd8a1f2a331eacfc3b48bb0914ac32959d24 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sat, 5 Jun 2004 18:52:35 +0000 Subject: [PATCH 1339/1463] - Added a check for a waitable objects in NtWaitForSingleObject and NtWaitForMultipleObjects. svn path=/trunk/; revision=9626 --- reactos/ntoskrnl/ke/wait.c | 82 +++++++++++++++++++++++++++++++++----- 1 file changed, 72 insertions(+), 10 deletions(-) diff --git a/reactos/ntoskrnl/ke/wait.c b/reactos/ntoskrnl/ke/wait.c index df95ff2a577..524c2e14013 100644 --- a/reactos/ntoskrnl/ke/wait.c +++ b/reactos/ntoskrnl/ke/wait.c @@ -21,6 +21,7 @@ #include <internal/ps.h> #include <internal/ob.h> #include <internal/id.h> +#include <internal/safe.h> #include <ntos/ntdef.h> #define NDEBUG @@ -33,6 +34,10 @@ static KSPIN_LOCK DispatcherDatabaseLock; #define KeDispatcherObjectWakeOne(hdr) KeDispatcherObjectWakeOneOrAll(hdr, FALSE) #define KeDispatcherObjectWakeAll(hdr) KeDispatcherObjectWakeOneOrAll(hdr, TRUE) +extern POBJECT_TYPE EXPORTED ExMutantObjectType; +extern POBJECT_TYPE EXPORTED ExSemaphoreType; +extern POBJECT_TYPE EXPORTED ExTimerType; + /* FUNCTIONS *****************************************************************/ VOID KeInitializeDispatcherHeader(DISPATCHER_HEADER* Header, @@ -448,6 +453,28 @@ KiGetWaitableObjectFromObject(PVOID Object) } +inline BOOL +KiIsObjectWaitable(PVOID Object) +{ + POBJECT_HEADER Header; + Header = BODY_TO_HEADER(Object); + if (Header->ObjectType == ExEventObjectType || + Header->ObjectType == ExIoCompletionType || + Header->ObjectType == ExMutantObjectType || + Header->ObjectType == ExSemaphoreType || + Header->ObjectType == ExTimerType || + Header->ObjectType == PsProcessType || + Header->ObjectType == PsThreadType || + Header->ObjectType == IoFileObjectType) + { + return TRUE; + } + else + { + return FALSE; + } +} + /* * @implemented */ @@ -710,13 +737,14 @@ NtWaitForMultipleObjects(IN ULONG Count, IN HANDLE Object [], IN WAIT_TYPE WaitType, IN BOOLEAN Alertable, - IN PLARGE_INTEGER Time) + IN PLARGE_INTEGER UnsafeTime) { KWAIT_BLOCK WaitBlockArray[EX_MAXIMUM_WAIT_OBJECTS]; PVOID ObjectPtrArray[EX_MAXIMUM_WAIT_OBJECTS]; NTSTATUS Status; ULONG i, j; KPROCESSOR_MODE WaitMode; + LARGE_INTEGER Time; DPRINT("NtWaitForMultipleObjects(Count %lu Object[] %x, Alertable %d, " "Time %x)\n", Count,Object,Alertable,Time); @@ -724,6 +752,15 @@ NtWaitForMultipleObjects(IN ULONG Count, if (Count > EX_MAXIMUM_WAIT_OBJECTS) return STATUS_UNSUCCESSFUL; + if (UnsafeTime) + { + Status = MmCopyFromCaller(&Time, UnsafeTime, sizeof(LARGE_INTEGER)); + if (!NT_SUCCESS(Status)) + { + return(Status); + } + } + WaitMode = ExGetPreviousMode(); /* reference all objects */ @@ -735,8 +772,15 @@ NtWaitForMultipleObjects(IN ULONG Count, WaitMode, &ObjectPtrArray[i], NULL); - if (Status != STATUS_SUCCESS) + if (!NT_SUCCESS(Status) || !KiIsObjectWaitable(ObjectPtrArray[i])) { + if (NT_SUCCESS(Status)) + { + DPRINT1("Waiting for object type '%wZ' is not supported\n", + &BODY_TO_HEADER(ObjectPtrArray[i])->ObjectType->TypeName); + Status = STATUS_HANDLE_NOT_WAITABLE; + i++; + } /* dereference all referenced objects */ for (j = 0; j < i; j++) { @@ -753,7 +797,7 @@ NtWaitForMultipleObjects(IN ULONG Count, UserRequest, WaitMode, Alertable, - Time, + UnsafeTime ? &Time : NULL, WaitBlockArray); /* dereference all objects */ @@ -772,15 +816,25 @@ NtWaitForMultipleObjects(IN ULONG Count, NTSTATUS STDCALL NtWaitForSingleObject(IN HANDLE Object, IN BOOLEAN Alertable, - IN PLARGE_INTEGER Time) + IN PLARGE_INTEGER UnsafeTime) { PVOID ObjectPtr; NTSTATUS Status; KPROCESSOR_MODE WaitMode; + LARGE_INTEGER Time; DPRINT("NtWaitForSingleObject(Object %x, Alertable %d, Time %x)\n", Object,Alertable,Time); + if (UnsafeTime) + { + Status = MmCopyFromCaller(&Time, UnsafeTime, sizeof(LARGE_INTEGER)); + if (!NT_SUCCESS(Status)) + { + return(Status); + } + } + WaitMode = ExGetPreviousMode(); Status = ObReferenceObjectByHandle(Object, @@ -793,12 +847,20 @@ NtWaitForSingleObject(IN HANDLE Object, { return(Status); } - - Status = KeWaitForSingleObject(ObjectPtr, - UserRequest, - WaitMode, - Alertable, - Time); + if (!KiIsObjectWaitable(ObjectPtr)) + { + DPRINT1("Waiting for object type '%wZ' is not supported\n", + &BODY_TO_HEADER(ObjectPtr)->ObjectType->TypeName); + Status = STATUS_HANDLE_NOT_WAITABLE; + } + else + { + Status = KeWaitForSingleObject(ObjectPtr, + UserRequest, + WaitMode, + Alertable, + UnsafeTime ? &Time : NULL); + } ObDereferenceObject(ObjectPtr); From 1d623bc9b878838182008c1942b94c0ad06b3852 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Sat, 5 Jun 2004 19:52:23 +0000 Subject: [PATCH 1340/1463] Store serial port identifiers at controller keys. svn path=/trunk/; revision=9627 --- freeldr/freeldr/arch/i386/hardware.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/freeldr/freeldr/arch/i386/hardware.c b/freeldr/freeldr/arch/i386/hardware.c index 9a0e9423672..11e1a6c1418 100644 --- a/freeldr/freeldr/arch/i386/hardware.c +++ b/freeldr/freeldr/arch/i386/hardware.c @@ -715,7 +715,7 @@ InitializeSerialPort(U32 Port, static U32 -DetectMicrosoftMouse(U32 Port) +DetectSerialMouse(U32 Port) { CHAR Buffer[4]; U32 i; @@ -802,7 +802,7 @@ DetectMicrosoftMouse(U32 Port) static U32 -GetMousePnpId(U32 Port, char *Buffer) +GetSerialMousePnpId(U32 Port, char *Buffer) { U32 TimeOut; U32 i = 0; @@ -881,11 +881,11 @@ DetectSerialPointerPeripheral(HKEY ControllerKey, Identifier[0] = 0; InitializeSerialPort(Base, 2); - MouseType = DetectMicrosoftMouse(Base); + MouseType = DetectSerialMouse(Base); if (MouseType != MOUSE_TYPE_NONE) { - Length = GetMousePnpId(Base, Buffer); + Length = GetSerialMousePnpId(Base, Buffer); DbgPrint((DPRINT_HWDETECT, "PnP ID length: %u\n", Length)); @@ -1164,7 +1164,7 @@ DetectSerialPorts(HKEY BusKey) sprintf(Buffer, "COM%u", i + 1); - Error = RegSetValue(BusKey, + Error = RegSetValue(ControllerKey, "Identifier", REG_SZ, (PU8)Buffer, From 113740ebbd8a952fa73faa0db835f9546ee070c3 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sat, 5 Jun 2004 20:05:06 +0000 Subject: [PATCH 1341/1463] - Fixed the start offset of a partition within an extended partition (in xHalIoWritePartitionTable). svn path=/trunk/; revision=9628 --- reactos/ntoskrnl/io/xhaldrv.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/io/xhaldrv.c b/reactos/ntoskrnl/io/xhaldrv.c index 2c5291f68a1..3a35a0459be 100644 --- a/reactos/ntoskrnl/io/xhaldrv.c +++ b/reactos/ntoskrnl/io/xhaldrv.c @@ -1,4 +1,4 @@ -/* $Id: xhaldrv.c,v 1.44 2004/05/02 22:54:45 hbirr Exp $ +/* $Id: xhaldrv.c,v 1.45 2004/06/05 20:05:06 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1356,8 +1356,16 @@ xHalIoWritePartitionTable(IN PDEVICE_OBJECT DeviceObject, ((EndCylinder & 0x0300) >> 2) + (EndSector & 0x3f); /* Calculate start sector and sector count */ - StartBlock = - (PartitionBuffer->PartitionEntry[i + j].StartingOffset.QuadPart - ContainerOffset) / SectorSize; + if (IsContainerPartition (PartitionBuffer->PartitionEntry[i + j].PartitionType)) + { + StartBlock = + (PartitionBuffer->PartitionEntry[i + j].StartingOffset.QuadPart - ContainerOffset) / SectorSize; + } + else + { + StartBlock = + (PartitionBuffer->PartitionEntry[i + j].StartingOffset.QuadPart - NextPartitionOffset) / SectorSize; + } SectorCount = PartitionBuffer->PartitionEntry[i + j].PartitionLength.QuadPart / SectorSize; DPRINT ("LBA (StartBlock:%lu SectorCount:%lu)\n", From b4d6f4e01af884aecf6cf4c6605f22206e4317e9 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sat, 5 Jun 2004 20:10:41 +0000 Subject: [PATCH 1342/1463] - Added the dependence files to the clean target. svn path=/trunk/; revision=9629 --- reactos/subsys/system/explorer/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/subsys/system/explorer/Makefile b/reactos/subsys/system/explorer/Makefile index 7b8c8652568..f06cf4b163c 100644 --- a/reactos/subsys/system/explorer/Makefile +++ b/reactos/subsys/system/explorer/Makefile @@ -140,7 +140,7 @@ notifyhook.dll: notifyhook/notifyhook.c notifyhook/notifyhook.h $(CC) -D_WIN32_IE=0x0600 -Wall -D_NOTIFYHOOK_IMPL -Os -s notifyhook/notifyhook.c -shared -o $@ clean: - $(TOOLS_PATH)/rdel $(TARGET) $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) + $(TOOLS_PATH)/rdel $(TARGET) $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) $(DEP_FILES) LIVECD_DIR=$(PATH_TO_TOP)/../livecd/disk From 3b09731efb4c30d872d569042ec5888202e46a52 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sun, 6 Jun 2004 07:52:22 +0000 Subject: [PATCH 1343/1463] - Store page numbers instead of physical address's within mdls. svn path=/trunk/; revision=9630 --- reactos/ntoskrnl/cc/copy.c | 6 +-- reactos/ntoskrnl/mm/mdl.c | 85 +++++++++------------------------- reactos/ntoskrnl/mm/pagefile.c | 8 ++-- 3 files changed, 29 insertions(+), 70 deletions(-) diff --git a/reactos/ntoskrnl/cc/copy.c b/reactos/ntoskrnl/cc/copy.c index e9739367db6..2f11e957eb5 100644 --- a/reactos/ntoskrnl/cc/copy.c +++ b/reactos/ntoskrnl/cc/copy.c @@ -1,4 +1,4 @@ -/* $Id: copy.c,v 1.21 2004/05/22 18:28:18 hbirr Exp $ +/* $Id: copy.c,v 1.22 2004/06/06 07:52:22 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -136,7 +136,7 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length, PHYSICAL_ADDRESS page; address = (char*)current2->BaseAddress + (i * PAGE_SIZE); page = MmGetPhysicalAddressForProcess(NULL, address); - ((PULONG)(Mdl + 1))[offset] = page.u.LowPart; + ((PULONG)(Mdl + 1))[offset] = page.QuadPart >> PAGE_SHIFT; offset++; } current2 = current2->NextInChain; @@ -553,7 +553,7 @@ CcZeroData (IN PFILE_OBJECT FileObject, Mdl->MdlFlags |= (MDL_PAGES_LOCKED | MDL_IO_PAGE_READ); for (i = 0; i < ((Mdl->Size - sizeof(MDL)) / sizeof(ULONG)); i++) { - ((PULONG)(Mdl + 1))[i] = CcZeroPage.u.LowPart; + ((PULONG)(Mdl + 1))[i] = CcZeroPage.QuadPart >> PAGE_SHIFT; } KeInitializeEvent(&Event, NotificationEvent, FALSE); Status = IoPageWrite(FileObject, Mdl, &WriteOffset, &Event, &Iosb); diff --git a/reactos/ntoskrnl/mm/mdl.c b/reactos/ntoskrnl/mm/mdl.c index ff2bc4ef119..c6d8a369426 100644 --- a/reactos/ntoskrnl/mm/mdl.c +++ b/reactos/ntoskrnl/mm/mdl.c @@ -1,4 +1,4 @@ -/* $Id: mdl.c,v 1.63 2004/05/16 22:27:57 navaraf Exp $ +/* $Id: mdl.c,v 1.64 2004/06/06 07:52:22 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -111,6 +111,7 @@ MmUnlockPages(PMDL Mdl) { ULONG i; PULONG MdlPages; + PHYSICAL_ADDRESS Page; /* * MmProbeAndLockPages MUST have been called to lock this mdl! @@ -150,17 +151,9 @@ MmUnlockPages(PMDL Mdl) MdlPages = (PULONG)(Mdl + 1); for (i=0; i<(PAGE_ROUND_UP(Mdl->ByteCount+Mdl->ByteOffset)/PAGE_SIZE); i++) { -#if defined(__GNUC__) - MmUnlockPage((LARGE_INTEGER)(LONGLONG)MdlPages[i]); - MmDereferencePage((LARGE_INTEGER)(LONGLONG)MdlPages[i]); -#else - - PHYSICAL_ADDRESS dummyJunkNeeded; - dummyJunkNeeded.QuadPart = MdlPages[i]; - MmUnlockPage(dummyJunkNeeded); - MmDereferencePage(dummyJunkNeeded); -#endif - + Page.QuadPart = MdlPages[i] << PAGE_SHIFT; + MmUnlockPage(Page); + MmDereferencePage(Page); } Mdl->MdlFlags &= ~MDL_PAGES_LOCKED; @@ -193,6 +186,7 @@ MmMapLockedPages(PMDL Mdl, KPROCESSOR_MODE AccessMode) ULONG PageCount; ULONG StartingOffset; PEPROCESS CurrentProcess; + PHYSICAL_ADDRESS Page; DPRINT("MmMapLockedPages(Mdl %x, AccessMode %x)\n", Mdl, AccessMode); @@ -283,20 +277,11 @@ MmMapLockedPages(PMDL Mdl, KPROCESSOR_MODE AccessMode) for (i = 0; i < PageCount; i++) { NTSTATUS Status; -#if !defined(__GNUC__) - - PHYSICAL_ADDRESS dummyJunkNeeded; - dummyJunkNeeded.QuadPart = MdlPages[i]; -#endif - + Page.QuadPart = MdlPages[i] << PAGE_SHIFT; Status = MmCreateVirtualMapping(CurrentProcess, (PVOID)((ULONG)Base+(i*PAGE_SIZE)), PAGE_READWRITE, -#if defined(__GNUC__) - (LARGE_INTEGER)(LONGLONG)MdlPages[i], -#else - dummyJunkNeeded, -#endif + Page, FALSE); if (!NT_SUCCESS(Status)) { @@ -427,7 +412,7 @@ MmBuildMdlFromPages(PMDL Mdl, PULONG Pages) for (i=0;i<(PAGE_ROUND_UP(Mdl->ByteOffset+Mdl->ByteCount)/PAGE_SIZE);i++) { - MdlPages[i] = Pages[i]; + MdlPages[i] = Pages[i] >> PAGE_SHIFT; } //FIXME: this flag should be set by the caller perhaps? @@ -460,6 +445,7 @@ VOID STDCALL MmProbeAndLockPages (PMDL Mdl, ULONG NrPages; NTSTATUS Status; KPROCESSOR_MODE Mode; + PHYSICAL_ADDRESS Page; PEPROCESS CurrentProcess = PsGetCurrentProcess(); DPRINT("MmProbeAndLockPages(Mdl %x)\n", Mdl); @@ -475,13 +461,13 @@ VOID STDCALL MmProbeAndLockPages (PMDL Mdl, if (Mdl->StartVa >= (PVOID)KERNEL_BASE && - (MmGetPhysicalAddressForProcess(NULL, Mdl->StartVa).u.LowPart >> PAGE_SHIFT) > MmPageArraySize) + (MmGetPhysicalAddressForProcess(NULL, Mdl->StartVa).QuadPart >> PAGE_SHIFT) > MmPageArraySize) { /* phys addr is not phys memory so this must be io memory */ for (i = 0; i < NrPages; i++) { - MdlPages[i] = MmGetPhysicalAddressForProcess(NULL, (char*)Mdl->StartVa + (i*PAGE_SIZE)).u.LowPart; + MdlPages[i] = MmGetPhysicalAddressForProcess(NULL, (char*)Mdl->StartVa + (i*PAGE_SIZE)).QuadPart >> PAGE_SHIFT; } Mdl->MdlFlags |= MDL_PAGES_LOCKED|MDL_IO_SPACE; @@ -526,17 +512,9 @@ VOID STDCALL MmProbeAndLockPages (PMDL Mdl, { for (j = 0; j < i; j++) { -#if defined(__GNUC__) - MmUnlockPage((LARGE_INTEGER)(LONGLONG)MdlPages[j]); - MmDereferencePage((LARGE_INTEGER)(LONGLONG)MdlPages[j]); -#else - - PHYSICAL_ADDRESS dummyJunkNeeded; - dummyJunkNeeded.QuadPart = MdlPages[j]; - MmUnlockPage(dummyJunkNeeded); - MmDereferencePage(dummyJunkNeeded); -#endif - + Page.QuadPart = MdlPages[j] << PAGE_SHIFT; + MmUnlockPage(Page); + MmDereferencePage(Page); } ExRaiseStatus(Status); } @@ -554,35 +532,16 @@ VOID STDCALL MmProbeAndLockPages (PMDL Mdl, { for (j = 0; j < i; j++) { -#if defined(__GNUC__) - MmUnlockPage((LARGE_INTEGER)(LONGLONG)MdlPages[j]); - MmDereferencePage( - (LARGE_INTEGER)(LONGLONG)MdlPages[j]); -#else - - PHYSICAL_ADDRESS dummyJunkNeeded; - dummyJunkNeeded.QuadPart = MdlPages[j]; - MmUnlockPage(dummyJunkNeeded); - MmDereferencePage(dummyJunkNeeded); -#endif - + Page.QuadPart = (ULONGLONG)MdlPages[j] << PAGE_SHIFT; + MmUnlockPage(Page); + MmDereferencePage(Page); } ExRaiseStatus(Status); } } - MdlPages[i] = MmGetPhysicalAddressForProcess(NULL, Address).u.LowPart; -#if defined(__GNUC__) - - MmReferencePage((LARGE_INTEGER)(LONGLONG)MdlPages[i]); -#else - - { - PHYSICAL_ADDRESS dummyJunkNeeded; - dummyJunkNeeded.QuadPart = MdlPages[i]; - MmReferencePage(dummyJunkNeeded); - } -#endif - + Page = MmGetPhysicalAddressForProcess(NULL, Address); + MdlPages[i] = Page.QuadPart >> PAGE_SHIFT; + MmReferencePage(Page); } MmUnlockAddressSpace(&CurrentProcess->AddressSpace); @@ -644,7 +603,7 @@ MmBuildMdlForNonPagedPool (PMDL Mdl) for (i=0; i < PageCount; i++) { ((PULONG)(Mdl + 1))[i] = - (MmGetPhysicalAddress((char*)Mdl->StartVa + (i * PAGE_SIZE))).u.LowPart; + (MmGetPhysicalAddress((char*)Mdl->StartVa + (i * PAGE_SIZE))).QuadPart >> PAGE_SHIFT; } Mdl->MdlFlags |= MDL_SOURCE_IS_NONPAGED_POOL; diff --git a/reactos/ntoskrnl/mm/pagefile.c b/reactos/ntoskrnl/mm/pagefile.c index b984a62e70f..535a617accc 100644 --- a/reactos/ntoskrnl/mm/pagefile.c +++ b/reactos/ntoskrnl/mm/pagefile.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: pagefile.c,v 1.45 2004/05/20 08:37:20 hbirr Exp $ +/* $Id: pagefile.c,v 1.46 2004/06/06 07:52:22 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/pagefile.c @@ -485,7 +485,7 @@ MmDumpToPagingFile(ULONG BugCode, { PMM_CORE_DUMP_HEADER Headers; NTSTATUS Status; - UCHAR MdlBase[sizeof(MDL) + sizeof(PVOID)]; + UCHAR MdlBase[sizeof(MDL) + sizeof(ULONG)]; PMDL Mdl = (PMDL)MdlBase; PETHREAD Thread = PsGetCurrentThread(); ULONG StackSize; @@ -553,7 +553,7 @@ MmDumpToPagingFile(ULONG BugCode, RetrievalPointers = PagingFileList[MmCoreDumpPageFile]->RetrievalPointers; /* Dump the header. */ - MdlMap[0] = MmGetPhysicalAddress(MmCoreDumpPageFrame).u.LowPart; + MdlMap[0] = MmGetPhysicalAddress(MmCoreDumpPageFrame).QuadPart >> PAGE_SHIFT; #if defined(__GNUC__) DiskOffset = MmGetOffsetPageFile(RetrievalPointers, (LARGE_INTEGER)0LL); @@ -586,7 +586,7 @@ MmDumpToPagingFile(ULONG BugCode, { LARGE_INTEGER PhysicalAddress; PhysicalAddress.QuadPart = i * PAGE_SIZE; - MdlMap[0] = i * PAGE_SIZE; + MdlMap[0] = i; MmCreateVirtualMappingForKernel(MmCoreDumpPageFrame, PAGE_READWRITE, PhysicalAddress); From 353214e42ed3c423782b79183b26b55f72d64e75 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sun, 6 Jun 2004 08:36:31 +0000 Subject: [PATCH 1344/1463] - Allocate memory for mdl's for paging io from stack instead of the non paged pool. svn path=/trunk/; revision=9631 --- reactos/ntoskrnl/cc/copy.c | 38 ++++++++++++++++++-------- reactos/ntoskrnl/include/internal/mm.h | 4 +-- reactos/ntoskrnl/io/irp.c | 14 ++++++---- reactos/ntoskrnl/mm/anonmem.c | 17 +++--------- reactos/ntoskrnl/mm/section.c | 27 ++++-------------- 5 files changed, 47 insertions(+), 53 deletions(-) diff --git a/reactos/ntoskrnl/cc/copy.c b/reactos/ntoskrnl/cc/copy.c index 2f11e957eb5..e91f47b5086 100644 --- a/reactos/ntoskrnl/cc/copy.c +++ b/reactos/ntoskrnl/cc/copy.c @@ -1,4 +1,4 @@ -/* $Id: copy.c,v 1.22 2004/06/06 07:52:22 hbirr Exp $ +/* $Id: copy.c,v 1.23 2004/06/06 08:36:30 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -33,6 +33,15 @@ static PHYSICAL_ADDRESS CcZeroPage = { 0 }; #endif #define MAX_ZERO_LENGTH (256 * 1024) +#define MAX_RW_LENGTH (64 * 1024) + +#if defined(__GNUC__) +void * alloca(size_t size); +#elif defined(_MSC_VER) +void* _alloca(size_t size); +#else +#error Unknown compiler for alloca intrinsic stack allocation "function" +#endif /* FUNCTIONS *****************************************************************/ @@ -67,6 +76,9 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length, NTSTATUS Status; ULONG TempLength; KEVENT Event; + PMDL Mdl; + + Mdl = alloca(MmSizeOfMdl(NULL, MAX_RW_LENGTH)); Status = CcRosGetCacheSegmentChain(Bcb, ReadOffset, Length, &head); if (!NT_SUCCESS(Status)) @@ -105,7 +117,6 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length, { PCACHE_SEGMENT current2; ULONG current_size; - PMDL Mdl; ULONG i; ULONG offset; @@ -124,7 +135,7 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length, /* * Create an MDL which contains all their pages. */ - Mdl = MmCreateMdl(NULL, NULL, current_size); + MmInitializeMdl(Mdl, NULL, current_size); Mdl->MdlFlags |= (MDL_PAGES_LOCKED | MDL_IO_PAGE_READ); current2 = current; offset = 0; @@ -157,6 +168,7 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length, KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); Status = Iosb.Status; } + MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl); if (!NT_SUCCESS(Status) && Status != STATUS_END_OF_FILE) { while (current != NULL) @@ -206,8 +218,10 @@ ReadCacheSegment(PCACHE_SEGMENT CacheSeg) { Size = CacheSeg->Bcb->CacheSegmentSize; } - Mdl = MmCreateMdl(NULL, CacheSeg->BaseAddress, Size); + Mdl = alloca(MmSizeOfMdl(CacheSeg->BaseAddress, Size)); + MmInitializeMdl(Mdl, CacheSeg->BaseAddress, Size); MmBuildMdlForNonPagedPool(Mdl); + Mdl->MdlFlags |= MDL_IO_PAGE_READ; KeInitializeEvent(&Event, NotificationEvent, FALSE); Status = IoPageRead(CacheSeg->Bcb->FileObject, Mdl, &SegOffset, & Event, &IoStatus); if (Status == STATUS_PENDING) @@ -246,8 +260,10 @@ WriteCacheSegment(PCACHE_SEGMENT CacheSeg) { Size = CacheSeg->Bcb->CacheSegmentSize; } - Mdl = MmCreateMdl(NULL, CacheSeg->BaseAddress, Size); + Mdl = alloca(MmSizeOfMdl(CacheSeg->BaseAddress, Size)); + MmInitializeMdl(Mdl, CacheSeg->BaseAddress, Size); MmBuildMdlForNonPagedPool(Mdl); + Mdl->MdlFlags |= MDL_IO_PAGE_READ; KeInitializeEvent(&Event, NotificationEvent, FALSE); Status = IoPageWrite(CacheSeg->Bcb->FileObject, Mdl, &SegOffset, &Event, &IoStatus); if (Status == STATUS_PENDING) @@ -360,7 +376,7 @@ CcCopyRead (IN PFILE_OBJECT FileObject, } while (Length > 0) { - TempLength = min(max(Bcb->CacheSegmentSize, 65536), Length); + TempLength = min(max(Bcb->CacheSegmentSize, MAX_RW_LENGTH), Length); ReadCacheSegmentChain(Bcb, ReadOffset, TempLength, Buffer); ReadLength += TempLength; Length -= TempLength; @@ -533,6 +549,8 @@ CcZeroData (IN PFILE_OBJECT FileObject, if (FileObject->SectionObjectPointer->SharedCacheMap == NULL) { /* File is not cached */ + + Mdl = alloca(MmSizeOfMdl(NULL, MAX_ZERO_LENGTH)); while (Length > 0) { @@ -544,12 +562,7 @@ CcZeroData (IN PFILE_OBJECT FileObject, { CurrentLength = Length; } - Mdl = MmCreateMdl(NULL, (PVOID)WriteOffset.u.LowPart, CurrentLength); - - if (Mdl == NULL) - { - return(FALSE); - } + MmInitializeMdl(Mdl, (PVOID)WriteOffset.u.LowPart, CurrentLength); Mdl->MdlFlags |= (MDL_PAGES_LOCKED | MDL_IO_PAGE_READ); for (i = 0; i < ((Mdl->Size - sizeof(MDL)) / sizeof(ULONG)); i++) { @@ -562,6 +575,7 @@ CcZeroData (IN PFILE_OBJECT FileObject, KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); Status = Iosb.Status; } + MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl); if (!NT_SUCCESS(Status)) { return(FALSE); diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index 9fb32f2dbf1..8abd58c130d 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -368,9 +368,9 @@ extern MM_STATS MmStats; PVOID MmGetDirtyPagesFromWorkingSet(struct _EPROCESS* Process); NTSTATUS -MmWriteToSwapPage(SWAPENTRY SwapEntry, PMDL Mdl); +MmWriteToSwapPage(SWAPENTRY SwapEntry, PHYSICAL_ADDRESS* Page); NTSTATUS -MmReadFromSwapPage(SWAPENTRY SwapEntry, PMDL Mdl); +MmReadFromSwapPage(SWAPENTRY SwapEntry, PHYSICAL_ADDRESS* Page); VOID MmSetFlagsPage(PHYSICAL_ADDRESS PhysicalAddress, ULONG Flags); ULONG diff --git a/reactos/ntoskrnl/io/irp.c b/reactos/ntoskrnl/io/irp.c index 32b9d2c2967..ec80cff8de2 100644 --- a/reactos/ntoskrnl/io/irp.c +++ b/reactos/ntoskrnl/io/irp.c @@ -1,4 +1,4 @@ -/* $Id: irp.c,v 1.60 2004/04/20 23:14:35 gdalsnes Exp $ +/* $Id: irp.c,v 1.61 2004/06/06 08:36:31 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -294,11 +294,15 @@ IofCompleteRequest(PIRP Irp, /* Windows NT File System Internals, page 165 */ if (Irp->Flags & (IRP_PAGING_IO|IRP_CLOSE_OPERATION)) { - if (Irp->Flags & IRP_PAGING_IO) + /* + * If MDL_IO_PAGE_READ is set, then the caller is responsible + * for deallocating of the mdl. + */ + if (Irp->Flags & IRP_PAGING_IO && + Irp->MdlAddress && + !(Irp->MdlAddress->MdlFlags & MDL_IO_PAGE_READ)) { - /* FIXME: - * The mdl should be freed by the caller! - */ + if (Irp->MdlAddress->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) { MmUnmapLockedPages(Irp->MdlAddress->MappedSystemVa, Irp->MdlAddress); diff --git a/reactos/ntoskrnl/mm/anonmem.c b/reactos/ntoskrnl/mm/anonmem.c index 05b9ce4c144..c869b6c3658 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.27 2004/04/10 22:35:25 gdalsnes Exp $ +/* $Id: anonmem.c,v 1.28 2004/06/06 08:36:31 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/anonmem.c @@ -46,7 +46,6 @@ MmWritePageVirtualMemory(PMADDRESS_SPACE AddressSpace, { SWAPENTRY SwapEntry; LARGE_INTEGER PhysicalAddress; - PMDL Mdl; NTSTATUS Status; /* @@ -99,9 +98,7 @@ MmWritePageVirtualMemory(PMADDRESS_SPACE AddressSpace, /* * Write the page to the pagefile */ - Mdl = MmCreateMdl(NULL, NULL, PAGE_SIZE); - MmBuildMdlFromPages(Mdl, (PULONG)&PhysicalAddress); - Status = MmWriteToSwapPage(SwapEntry, Mdl); + Status = MmWriteToSwapPage(SwapEntry, &PhysicalAddress); if (!NT_SUCCESS(Status)) { DPRINT1("MM: Failed to write to swap page (Status was 0x%.8X)\n", @@ -133,7 +130,6 @@ MmPageOutVirtualMemory(PMADDRESS_SPACE AddressSpace, BOOL WasDirty; SWAPENTRY SwapEntry; NTSTATUS Status; - PMDL Mdl; DPRINT("MmPageOutVirtualMemory(Address 0x%.8X) PID %d\n", Address, MemoryArea->Process->UniqueProcessId); @@ -200,9 +196,7 @@ MmPageOutVirtualMemory(PMADDRESS_SPACE AddressSpace, /* * Write the page to the pagefile */ - Mdl = MmCreateMdl(NULL, NULL, PAGE_SIZE); - MmBuildMdlFromPages(Mdl, (ULONG *)&PhysicalAddress.u.LowPart); - Status = MmWriteToSwapPage(SwapEntry, Mdl); + Status = MmWriteToSwapPage(SwapEntry, &PhysicalAddress); if (!NT_SUCCESS(Status)) { DPRINT1("MM: Failed to write to swap page (Status was 0x%.8X)\n", @@ -372,12 +366,9 @@ MmNotPresentFaultVirtualMemory(PMADDRESS_SPACE AddressSpace, if (MmIsPageSwapEntry(NULL, Address)) { SWAPENTRY SwapEntry; - PMDL Mdl; MmDeletePageFileMapping(MemoryArea->Process, Address, &SwapEntry); - Mdl = MmCreateMdl(NULL, NULL, PAGE_SIZE); - MmBuildMdlFromPages(Mdl, (PULONG)&Page); - Status = MmReadFromSwapPage(SwapEntry, Mdl); + Status = MmReadFromSwapPage(SwapEntry, &Page); if (!NT_SUCCESS(Status)) { KEBUGCHECK(0); diff --git a/reactos/ntoskrnl/mm/section.c b/reactos/ntoskrnl/mm/section.c index 953a032a015..26c78e26e29 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.150 2004/05/30 12:55:11 hbirr Exp $ +/* $Id: section.c,v 1.151 2004/06/06 08:36:31 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/section.c @@ -396,10 +396,7 @@ MmUnsharePageEntrySectionSegment(PSECTION_OBJECT Section, * process and the current segment (also not within an other process). */ NTSTATUS Status; - PMDL Mdl; - Mdl = MmCreateMdl(NULL, NULL, PAGE_SIZE); - MmBuildMdlFromPages(Mdl, (PULONG)&Page); - Status = MmWriteToSwapPage(SavedSwapEntry, Mdl); + Status = MmWriteToSwapPage(SavedSwapEntry, &Page); if (!NT_SUCCESS(Status)) { DPRINT1("MM: Failed to write to swap page (Status was 0x%.8X)\n", Status); @@ -792,7 +789,6 @@ MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace, * Must be private page we have swapped out. */ SWAPENTRY SwapEntry; - PMDL Mdl; /* * Sanity check @@ -813,9 +809,7 @@ MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace, KEBUGCHECK(0); } - Mdl = MmCreateMdl(NULL, NULL, PAGE_SIZE); - MmBuildMdlFromPages(Mdl, (PULONG)&Page); - Status = MmReadFromSwapPage(SwapEntry, Mdl); + Status = MmReadFromSwapPage(SwapEntry, &Page); if (!NT_SUCCESS(Status)) { DPRINT1("MmReadFromSwapPage failed, status = %x\n", Status); @@ -1078,7 +1072,6 @@ MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace, else if (IS_SWAP_FROM_SSE(Entry)) { SWAPENTRY SwapEntry; - PMDL Mdl; SwapEntry = SWAPENTRY_FROM_SSE(Entry); @@ -1095,9 +1088,7 @@ MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace, KEBUGCHECK(0); } - Mdl = MmCreateMdl(NULL, NULL, PAGE_SIZE); - MmBuildMdlFromPages(Mdl, (PULONG)&Page); - Status = MmReadFromSwapPage(SwapEntry, Mdl); + Status = MmReadFromSwapPage(SwapEntry, &Page); if (!NT_SUCCESS(Status)) { KEBUGCHECK(0); @@ -1434,7 +1425,6 @@ MmPageOutSectionView(PMADDRESS_SPACE AddressSpace, PHYSICAL_ADDRESS PhysicalAddress; MM_SECTION_PAGEOUT_CONTEXT Context; SWAPENTRY SwapEntry; - PMDL Mdl; ULONG Entry; ULONG FileOffset; NTSTATUS Status; @@ -1695,9 +1685,7 @@ MmPageOutSectionView(PMADDRESS_SPACE AddressSpace, /* * Write the page to the pagefile */ - Mdl = MmCreateMdl(NULL, NULL, PAGE_SIZE); - MmBuildMdlFromPages(Mdl, (PULONG)&PhysicalAddress); - Status = MmWriteToSwapPage(SwapEntry, Mdl); + Status = MmWriteToSwapPage(SwapEntry, &PhysicalAddress); if (!NT_SUCCESS(Status)) { DPRINT1("MM: Failed to write to swap page (Status was 0x%.8X)\n", @@ -1784,7 +1772,6 @@ MmWritePageSectionView(PMADDRESS_SPACE AddressSpace, PMM_SECTION_SEGMENT Segment; PHYSICAL_ADDRESS PhysicalAddress; SWAPENTRY SwapEntry; - PMDL Mdl; ULONG Entry; BOOLEAN Private; NTSTATUS Status; @@ -1900,9 +1887,7 @@ MmWritePageSectionView(PMADDRESS_SPACE AddressSpace, /* * Write the page to the pagefile */ - Mdl = MmCreateMdl(NULL, NULL, PAGE_SIZE); - MmBuildMdlFromPages(Mdl, (PULONG)&PhysicalAddress); - Status = MmWriteToSwapPage(SwapEntry, Mdl); + Status = MmWriteToSwapPage(SwapEntry, &PhysicalAddress); if (!NT_SUCCESS(Status)) { DPRINT1("MM: Failed to write to swap page (Status was 0x%.8X)\n", From 419db01ef7a91a21333271f649e9f1051818d668 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sun, 6 Jun 2004 08:50:26 +0000 Subject: [PATCH 1345/1463] - Check if the temp path exist in GetTempPathW. svn path=/trunk/; revision=9632 --- reactos/lib/kernel32/file/curdir.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/reactos/lib/kernel32/file/curdir.c b/reactos/lib/kernel32/file/curdir.c index 8b836e61eed..f5c195d6111 100644 --- a/reactos/lib/kernel32/file/curdir.c +++ b/reactos/lib/kernel32/file/curdir.c @@ -1,4 +1,4 @@ -/* $Id: curdir.c,v 1.41 2004/01/23 21:16:03 ekohl Exp $ +/* $Id: curdir.c,v 1.42 2004/06/06 08:50:26 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -241,18 +241,26 @@ GetTempPathW ( if (!NT_SUCCESS(Status) && Status != STATUS_BUFFER_TOO_SMALL) { + /* + * FIXME: Should we use the current directory or the windows directory ? + */ Value.Length = RtlGetCurrentDirectory_U (Value.MaximumLength, Value.Buffer); } } - - if (NT_SUCCESS(Status)) + + Value.Length /= sizeof(WCHAR); + if (NT_SUCCESS(Status) && Value.Length > 0 && Value.Length + 1 < nBufferLength) { - lpBuffer[Value.Length / sizeof(WCHAR)] = L'\\'; - lpBuffer[Value.Length / sizeof(WCHAR) + 1] = 0; + lpBuffer[Value.Length] = L'\\'; + lpBuffer[Value.Length + 1] = 0; + if (!RtlDoesFileExists_U(lpBuffer)) + { + Value.Length = 0; + } } - return Value.Length / sizeof(WCHAR) + 1; + return Value.Length ? Value.Length + 1 : 0; } From fbd64e0eb98bc3463e216b0a48e3e0de1f961891 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sun, 6 Jun 2004 08:58:56 +0000 Subject: [PATCH 1346/1463] - Removed MakeSureDirectoryPathExistsEx. - Use the current directory if GetTempPath fails. - Inherit the handles to the child process (in Execute). - Assume that the current process is always a console process if ntdll exist but not contains the functions NtQueryInformationProcess or NtReadVirtualMemory. svn path=/trunk/; revision=9633 --- reactos/subsys/system/cmd/cmd.c | 69 +++++++-------------------------- 1 file changed, 13 insertions(+), 56 deletions(-) diff --git a/reactos/subsys/system/cmd/cmd.c b/reactos/subsys/system/cmd/cmd.c index 78131f812fc..7493942b431 100644 --- a/reactos/subsys/system/cmd/cmd.c +++ b/reactos/subsys/system/cmd/cmd.c @@ -1,4 +1,4 @@ -/* $Id: cmd.c,v 1.13 2004/05/11 20:44:30 gvg Exp $ +/* $Id: cmd.c,v 1.14 2004/06/06 08:58:56 hbirr Exp $ * * CMD.C - command-line interface. * @@ -122,6 +122,10 @@ * * 30-Apr-2004 (Filip Navara <xnavara@volny.cz>) * Make MakeSureDirectoryPathExistsEx unicode safe. + * + * 28-Mai-2004 (Hartmut Birr) + * Removed MakeSureDirectoryPathExistsEx. + * Use the current directory if GetTempPath fails. */ #include "config.h" @@ -167,57 +171,6 @@ WORD wColor; /* current color */ WORD wDefColor; /* default color */ #endif - - -/*********************************************************************** - * MakeSureDirectoryPathExistsEx - * - * If a dir is at the end and the path ends with a backslash, FileAtEnd - * is ignored. If the path doesn't end with a backslash, FileAtEnd is - * used to determine if the last part of the path is a file name or a - * directory. - * - * Path may be absolute or relative to current dir. - * - * FIXME: maybe put this in a header/library where everyone can use it????? - */ -BOOL WINAPI MakeSureDirectoryPathExistsEx(LPCTSTR DirPath, BOOL FileAtEnd) -{ - TCHAR Path[MAX_PATH]; - TCHAR *SlashPos = Path; - TCHAR Slash; - BOOL bRes; - - _tcscpy(Path, DirPath); - while ((SlashPos = _tcspbrk(SlashPos + 1, _T("\\/")))) - { - Slash = *SlashPos; - *SlashPos = 0; - - bRes = CreateDirectory(Path, NULL); - if (bRes == FALSE && GetLastError() != ERROR_ALREADY_EXISTS) - { - return FALSE; - } - - *SlashPos = Slash; - if (*(SlashPos + 1) == 0) return TRUE; - } - - if (!FileAtEnd) - { - bRes = CreateDirectory(Path, NULL); - if (bRes == FALSE && GetLastError() != ERROR_ALREADY_EXISTS) - { - return FALSE; - } - } - - return TRUE; -} - - - /* * is character a delimeter when used on first word? * @@ -262,7 +215,7 @@ static BOOL IsConsoleProcess(HANDLE Process) if (NULL == NtQueryInformationProcessPtr || NULL == NtReadVirtualMemoryPtr) { - return FALSE; + return TRUE; } Status = NtQueryInformationProcessPtr(Process, ProcessBasicInformation, @@ -374,7 +327,7 @@ Execute (LPTSTR full, LPTSTR first, LPTSTR rest) full, NULL, NULL, - FALSE, + TRUE, CREATE_NEW_PROCESS_GROUP, NULL, NULL, @@ -543,6 +496,7 @@ VOID ParseCommandLine (LPTSTR cmd) LPTSTR t = NULL; INT num = 0; INT nRedirFlags = 0; + INT Length; HANDLE hOldConIn; HANDLE hOldConOut; @@ -563,8 +517,11 @@ VOID ParseCommandLine (LPTSTR cmd) #ifdef FEATURE_REDIRECTION /* find the temp path to store temporary files */ - GetTempPath (MAX_PATH, szTempPath); - MakeSureDirectoryPathExistsEx(szTempPath, FALSE); + Length = GetTempPath (MAX_PATH, szTempPath); + if (Length == 0 || Length >= MAX_PATH) + { + _tcscpy(szTempPath, _T(".\\")); + } if (szTempPath[_tcslen (szTempPath) - 1] != _T('\\')) _tcscat (szTempPath, _T("\\")); From 5c92baff3c5de4b583f701ca2ec58c0e43a76211 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sun, 6 Jun 2004 09:03:07 +0000 Subject: [PATCH 1347/1463] - Fixed the set command for WinXP. - The second parameter must be zero in the call to SetEnvironmentVariable if the variable should be deleted. svn path=/trunk/; revision=9634 --- reactos/subsys/system/cmd/set.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/system/cmd/set.c b/reactos/subsys/system/cmd/set.c index 6883145cf86..005e6ac6df7 100644 --- a/reactos/subsys/system/cmd/set.c +++ b/reactos/subsys/system/cmd/set.c @@ -94,7 +94,10 @@ INT cmd_set (LPTSTR cmd, LPTSTR param) /* set or remove environment variable */ *p = _T('\0'); p++; - + if (*p == _T('\0')) + { + p = NULL; + } SetEnvironmentVariable (param, p); } else From efc91600525a5320e839159ac12876b5b683f8b4 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sun, 6 Jun 2004 09:05:21 +0000 Subject: [PATCH 1348/1463] - Get first the parameters and do then the processing. svn path=/trunk/; revision=9635 --- reactos/subsys/system/cmd/chcp.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/system/cmd/chcp.c b/reactos/subsys/system/cmd/chcp.c index f005ddc6d54..0ef8d0a19f6 100644 --- a/reactos/subsys/system/cmd/chcp.c +++ b/reactos/subsys/system/cmd/chcp.c @@ -38,6 +38,9 @@ INT CommandChcp (LPTSTR cmd, LPTSTR param) return 0; } + /* get parameters */ + arg = split (param, &args, FALSE); + if (args == 0) { /* display active code page number */ @@ -52,8 +55,6 @@ INT CommandChcp (LPTSTR cmd, LPTSTR param) return 1; } - /* get parameters */ - arg = split (param, &args, FALSE); /* save old code page */ uOldCodePage = GetConsoleCP (); From 1d4397159c6e9a9e323cb7b9513eb5242f56caab Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sun, 6 Jun 2004 09:13:21 +0000 Subject: [PATCH 1349/1463] - Allocate memory for mdl's for paging io from stack instead of the non paged pool. svn path=/trunk/; revision=9636 --- reactos/ntoskrnl/mm/pagefile.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/reactos/ntoskrnl/mm/pagefile.c b/reactos/ntoskrnl/mm/pagefile.c index 535a617accc..9e58d2d453c 100644 --- a/reactos/ntoskrnl/mm/pagefile.c +++ b/reactos/ntoskrnl/mm/pagefile.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: pagefile.c,v 1.46 2004/06/06 07:52:22 hbirr Exp $ +/* $Id: pagefile.c,v 1.47 2004/06/06 09:13:21 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/pagefile.c @@ -191,13 +191,15 @@ MmGetOffsetPageFile(PGET_RETRIEVAL_DESCRIPTOR RetrievalPointers, LARGE_INTEGER O #endif } -NTSTATUS MmWriteToSwapPage(SWAPENTRY SwapEntry, PMDL Mdl) +NTSTATUS MmWriteToSwapPage(SWAPENTRY SwapEntry, PHYSICAL_ADDRESS* Page) { ULONG i, offset; LARGE_INTEGER file_offset; IO_STATUS_BLOCK Iosb; NTSTATUS Status; KEVENT Event; + UCHAR MdlBase[sizeof(MDL) + sizeof(ULONG)]; + PMDL Mdl = (PMDL)MdlBase; DPRINT("MmWriteToSwapPage\n"); @@ -222,6 +224,9 @@ NTSTATUS MmWriteToSwapPage(SWAPENTRY SwapEntry, PMDL Mdl) KEBUGCHECK(0); } + MmInitializeMdl(Mdl, NULL, PAGE_SIZE); + MmBuildMdlFromPages(Mdl, (PULONG)Page); + file_offset.QuadPart = offset * PAGE_SIZE; file_offset = MmGetOffsetPageFile(PagingFileList[i]->RetrievalPointers, file_offset); @@ -234,18 +239,21 @@ NTSTATUS MmWriteToSwapPage(SWAPENTRY SwapEntry, PMDL Mdl) if (Status == STATUS_PENDING) { KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); - return(Iosb.Status); + Status = Iosb.Status; } + MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl); return(Status); } -NTSTATUS MmReadFromSwapPage(SWAPENTRY SwapEntry, PMDL Mdl) +NTSTATUS MmReadFromSwapPage(SWAPENTRY SwapEntry, PHYSICAL_ADDRESS* Page) { ULONG i, offset; LARGE_INTEGER file_offset; IO_STATUS_BLOCK Iosb; NTSTATUS Status; KEVENT Event; + UCHAR MdlBase[sizeof(MDL) + sizeof(ULONG)]; + PMDL Mdl = (PMDL)MdlBase; DPRINT("MmReadFromSwapPage\n"); @@ -270,6 +278,9 @@ NTSTATUS MmReadFromSwapPage(SWAPENTRY SwapEntry, PMDL Mdl) KEBUGCHECK(0); } + MmInitializeMdl(Mdl, NULL, PAGE_SIZE); + MmBuildMdlFromPages(Mdl, (PULONG)Page); + file_offset.QuadPart = offset * PAGE_SIZE; file_offset = MmGetOffsetPageFile(PagingFileList[i]->RetrievalPointers, file_offset); @@ -282,8 +293,9 @@ NTSTATUS MmReadFromSwapPage(SWAPENTRY SwapEntry, PMDL Mdl) if (Status == STATUS_PENDING) { KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); - return(Iosb.Status); + Status = Iosb.Status; } + MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl); return(Status); } @@ -538,14 +550,8 @@ MmDumpToPagingFile(ULONG BugCode, } /* Initialize the MDL. */ - Mdl->Next = NULL; - Mdl->Size = sizeof(MDL) + sizeof(PVOID); - Mdl->MdlFlags = MDL_SOURCE_IS_NONPAGED_POOL; - Mdl->Process = NULL; - Mdl->MappedSystemVa = MmCoreDumpPageFrame; - Mdl->StartVa = NULL; - Mdl->ByteCount = PAGE_SIZE; - Mdl->ByteOffset = 0; + MmInitializeMdl(Mdl, MmCoreDumpPageFrame, PAGE_SIZE); + Mdl->MdlFlags = MDL_PAGES_LOCKED|MDL_IO_PAGE_READ|MDL_SOURCE_IS_NONPAGED_POOL; MdlMap = (PULONG)(Mdl + 1); From 36b12d10259db2be2fc2691c8234b88871af66e1 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Sun, 6 Jun 2004 15:55:03 +0000 Subject: [PATCH 1350/1463] Use hardware description if available to initialize the serial mouse port. svn path=/trunk/; revision=9637 --- reactos/drivers/input/sermouse/makefile | 4 +- reactos/drivers/input/sermouse/sermouse.c | 366 ++++++++++++++++++++-- 2 files changed, 334 insertions(+), 36 deletions(-) diff --git a/reactos/drivers/input/sermouse/makefile b/reactos/drivers/input/sermouse/makefile index c8a1591582e..8dc29a6a212 100644 --- a/reactos/drivers/input/sermouse/makefile +++ b/reactos/drivers/input/sermouse/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.10 2003/11/16 22:39:35 sedwards Exp $ +# $Id: makefile,v 1.11 2004/06/06 15:55:03 ekohl Exp $ PATH_TO_TOP = ../../.. @@ -9,7 +9,7 @@ TARGET_NAME = sermouse TARGET_OBJECTS = \ sermouse.o -TARGET_CFLAGS = -Wall -Werror -D__USE_W32API +TARGET_CFLAGS = -Wall -Werror #mouse.o - Old Serial mouse driver diff --git a/reactos/drivers/input/sermouse/sermouse.c b/reactos/drivers/input/sermouse/sermouse.c index c4be585acaa..62403a8bb6b 100644 --- a/reactos/drivers/input/sermouse/sermouse.c +++ b/reactos/drivers/input/sermouse/sermouse.c @@ -8,9 +8,14 @@ * in the file sermouse.txt. */ +/* INCLUDES *****************************************************************/ + #include <ddk/ntddk.h> #include <ddk/ntddmou.h> +#define NDEBUG +#include <debug.h> + /* * Compile time options */ @@ -47,7 +52,7 @@ /* Microsoft Wheel Mouse (aka Z Mouse) */ #define MOUSE_TYPE_WHEELZ 3 /* Mouse Systems Mouse */ -#define MOUSE_TYPE_MOUSESYSTEMS 4 +#define MOUSE_TYPE_MOUSESYSTEMS 4 /* Size for packet buffer used in interrupt routine */ #define PACKET_BUFFER_SIZE 4 @@ -76,7 +81,8 @@ * Structures */ -typedef struct _DEVICE_EXTENSION { +typedef struct _DEVICE_EXTENSION +{ PDEVICE_OBJECT DeviceObject; ULONG ActiveQueue; ULONG InputDataCount[2]; @@ -98,15 +104,18 @@ typedef struct _DEVICE_EXTENSION { * Functions */ -void ClearMouse(ULONG Port) +/* Waits until the mouse calms down but also quits out after a while + * in case some destructive user wants to keep moving the mouse + * before we're done */ +VOID ClearMouse(ULONG Port) { - /* Waits until the mouse calms down but also quits out after a while - * in case some destructive user wants to keep moving the mouse - * before we're done */ - unsigned int Restarts = 0, i; + ULONG Restarts = 0; + ULONG i; + UCHAR Temp; + for (i = 0; i < 60000; i++) { - unsigned Temp = READ_PORT_UCHAR((PUCHAR)Port); + Temp = READ_PORT_UCHAR((PUCHAR)Port); if (Temp != 0) { Restarts++; @@ -177,8 +186,8 @@ SerialMouseInterruptService(IN PKINTERRUPT Interrupt, PVOID ServiceContext) Input->RawButtons = (DeviceExtension->PreviousButtons & MOUSE_BUTTON_MIDDLE) | ((UCHAR)(PacketBuffer[0] & LEFT_BUTTON_MASK) >> LEFT_BUTTON_SHIFT) | ((UCHAR)(PacketBuffer[0] & RIGHT_BUTTON_MASK) >> RIGHT_BUTTON_SHIFT); - } else - if (DeviceExtension->PacketBufferPosition == 4) + } + else if (DeviceExtension->PacketBufferPosition == 4) { DeviceExtension->PacketBufferPosition = 0; /* If middle button state changed than report event */ @@ -208,6 +217,7 @@ SerialMouseInterruptService(IN PKINTERRUPT Interrupt, PVOID ServiceContext) else Input->ButtonFlags |= MOUSE_LEFT_BUTTON_UP; } + if (ButtonsDifference & MOUSE_BUTTON_RIGHT) { if (Input->RawButtons & MOUSE_BUTTON_RIGHT) @@ -215,6 +225,7 @@ SerialMouseInterruptService(IN PKINTERRUPT Interrupt, PVOID ServiceContext) else Input->ButtonFlags |= MOUSE_RIGHT_BUTTON_UP; } + if (ButtonsDifference & MOUSE_BUTTON_MIDDLE) { if (Input->RawButtons & MOUSE_BUTTON_MIDDLE) @@ -247,7 +258,7 @@ MouseSynchronizeRoutine(PVOID Context) return TRUE; } -NTSTATUS STDCALL +VOID STDCALL SerialMouseStartIo(PDEVICE_OBJECT DeviceObject, PIRP Irp) { PDEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension; @@ -270,8 +281,6 @@ SerialMouseStartIo(PDEVICE_OBJECT DeviceObject, PIRP Irp) IoStartNextPacket (DeviceObject, FALSE); } } - - return STATUS_SUCCESS; } NTSTATUS STDCALL @@ -377,7 +386,7 @@ VOID SerialMouseIsrDpc(PKDPC Dpc, PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID C DeviceExtension->InputDataCount[Queue] = 0; } -void InitializeSerialPort(ULONG Port) +VOID InitializeSerialPort(ULONG Port) { /* DLAB off */ WRITE_PORT_UCHAR((PUCHAR)Port + 3, 0); @@ -392,7 +401,7 @@ void InitializeSerialPort(ULONG Port) WRITE_PORT_UCHAR((PUCHAR)Port + 3, 2); } -BOOL UARTReadChar(ULONG Port, CHAR *Value, ULONG Timeout) +BOOLEAN UARTReadChar(ULONG Port, CHAR *Value, ULONG Timeout) { ULONG i, j; @@ -404,13 +413,13 @@ BOOL UARTReadChar(ULONG Port, CHAR *Value, ULONG Timeout) if (READ_PORT_UCHAR((PUCHAR)Port + 5) & 0x01) { /* Yes, read it and return */ - *Value = READ_PORT_UCHAR((PUCHAR)Port); - return TRUE; + *Value = READ_PORT_UCHAR((PUCHAR)Port); + return TRUE; } else { - /* No, wait */ - KeStallExecutionProcessor(1); + /* No, wait */ + KeStallExecutionProcessor(1); } } } @@ -442,16 +451,16 @@ ULONG DetectMicrosoftMouse(ULONG Port) /* Enable DTR/RTS (OUT2 disabled) */ WRITE_PORT_UCHAR((PUCHAR)Port + 4, 3); - if (UARTReadChar(Port, &Buffer[0], 500)) - { + if (UARTReadChar(Port, &Buffer[0], 500)) + { Count = 1; while (Count < 8) - { + { if (UARTReadChar(Port, &Buffer[Count], 100)) Count++; else break; - } + } } else return MOUSE_TYPE_NONE; @@ -467,7 +476,7 @@ ULONG DetectMicrosoftMouse(ULONG Port) { DbgPrint("Microsoft Ballpoint device detected"); DbgPrint("THIS DEVICE IS NOT SUPPORTED, YET"); - return MOUSE_TYPE_NONE; + return MOUSE_TYPE_NONE; } else /* Sign for Microsoft Mouse protocol followed by button specifier */ if (Buffer[i] == 'M') @@ -507,7 +516,7 @@ AllocatePointerDevice(PDRIVER_OBJECT DriverObject) ULONG Suffix; NTSTATUS Status; - /* Allocate buffer for full device name */ + /* Allocate buffer for full device name */ RtlInitUnicodeString(&DeviceName, NULL); DeviceName.MaximumLength = sizeof(DD_MOUSE_DEVICE_NAME_U) + SUFFIX_MAXIMUM_SIZE + sizeof(UNICODE_NULL); DeviceName.Buffer = ExAllocatePool(PagedPool, DeviceName.MaximumLength); @@ -530,7 +539,7 @@ AllocatePointerDevice(PDRIVER_OBJECT DriverObject) break; DeviceName.Length -= SuffixString.Length; } - + ExFreePool(DeviceName.Buffer); /* Couldn't create device */ @@ -628,29 +637,318 @@ InitializeMouse(ULONG Port, ULONG Irq, PDRIVER_OBJECT DriverObject) IoConnectInterrupt( &DeviceExtension->MouseInterrupt, SerialMouseInterruptService, DeviceObject, NULL, MappedIrq, Dirql, Dirql, 0, FALSE, - Affinity, FALSE); + Affinity, FALSE); return TRUE; } + +static VOID +GetMouseResourceData(PCM_FULL_RESOURCE_DESCRIPTOR FullDescriptor, + PULONG Port, + PULONG Interrupt) +{ + PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor; + ULONG i; + + for (i = 0; i < FullDescriptor->PartialResourceList.Count; i++) + { + PartialDescriptor = &FullDescriptor->PartialResourceList.PartialDescriptors[i]; + + switch (PartialDescriptor->Type) + { + case CmResourceTypePort: + *Port = (ULONG)PartialDescriptor->u.Port.Start.u.LowPart; + break; + + case CmResourceTypeInterrupt: + *Interrupt = (ULONG)PartialDescriptor->u.Interrupt.Level; + break; + } + } +} + + +static BOOLEAN +GetMouseResources(PULONG Port, + PULONG Interrupt) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING KeyName; + WCHAR Buffer[32]; + HANDLE BusKey; + HANDLE BusInstanceKey; + HANDLE ControllerKey; + HANDLE ControllerInstanceKey; + HANDLE PeripheralKey; + HANDLE PeripheralInstanceKey; + ULONG BusInstance; + ULONG ControllerInstance; + ULONG PeripheralInstance; + ULONG BufferLength; + ULONG ReturnedLength; + PKEY_VALUE_PARTIAL_INFORMATION ValueInfo; + NTSTATUS Status; + + DPRINT("GetMouseResources() called\n"); + + /* Open the bus key */ + RtlInitUnicodeString(&KeyName, + L"\\Registry\\Machine\\HARDWARE\\Description\\System\\MultifunctionAdapter"); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = ZwOpenKey(&BusKey, + KEY_ALL_ACCESS, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT("NtOpenKey() failed (Status %lx)\n", Status); + return FALSE; + } + + BusInstance = 0; + while (TRUE) + { + sprintf((PCHAR)Buffer, "%lu", (ULONG)0); + swprintf(Buffer, L"%lu", BusInstance); + RtlInitUnicodeString(&KeyName, + Buffer); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + BusKey, + NULL); + Status = ZwOpenKey(&BusInstanceKey, + KEY_ALL_ACCESS, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT("NtOpenKey() failed (Status %lx)\n", Status); + ZwClose(BusKey); + return FALSE; + } + + /* Open the controller type key */ + RtlInitUnicodeString(&KeyName, + L"SerialController"); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + BusInstanceKey, + NULL); + Status = ZwOpenKey(&ControllerKey, + KEY_ALL_ACCESS, + &ObjectAttributes); + if (NT_SUCCESS(Status)) + { + ControllerInstance = 0; + while (TRUE) + { + /* Open the pointer controller instance key */ + swprintf(Buffer, L"%lu", ControllerInstance); + RtlInitUnicodeString(&KeyName, + Buffer); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + ControllerKey, + NULL); + Status = ZwOpenKey(&ControllerInstanceKey, + KEY_ALL_ACCESS, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT("NtOpenKey() failed (Status %lx)\n", Status); + ZwClose(ControllerKey); + ZwClose(BusInstanceKey); + ZwClose(BusKey); + return FALSE; + } + + /* Open the 'PointerPeripheral' key */ + RtlInitUnicodeString(&KeyName, + L"PointerPeripheral"); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + ControllerInstanceKey, + NULL); + Status = ZwOpenKey(&PeripheralKey, + KEY_ALL_ACCESS, + &ObjectAttributes); + if (NT_SUCCESS(Status)) + { + PeripheralInstance = 0; + while (TRUE) + { + /* Open the pointer peripheral instance key */ + swprintf(Buffer, L"%lu", PeripheralInstance); + RtlInitUnicodeString(&KeyName, + Buffer); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + PeripheralKey, + NULL); + Status = ZwOpenKey(&PeripheralInstanceKey, + KEY_ALL_ACCESS, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT("ZwOpenKey() failed (Status %lx)\n", Status); + ZwClose(PeripheralKey); + ZwClose(ControllerInstanceKey); + ZwClose(ControllerKey); + ZwClose(BusInstanceKey); + ZwClose(BusKey); + return FALSE; + } + + /* Get peripheral identifier */ + RtlInitUnicodeString(&KeyName, + L"Configuration Data"); + + BufferLength = sizeof(KEY_VALUE_PARTIAL_INFORMATION); + ReturnedLength = 0; + ValueInfo = ExAllocatePool(NonPagedPool, + BufferLength); + if (ValueInfo == NULL) + { + DPRINT("ExAllocatePool() failed\n"); + ZwClose(PeripheralInstanceKey); + ZwClose(PeripheralKey); + ZwClose(ControllerInstanceKey); + ZwClose(ControllerKey); + ZwClose(BusInstanceKey); + ZwClose(BusKey); + return FALSE; + } + + Status = ZwQueryValueKey(ControllerInstanceKey, + &KeyName, + KeyValuePartialInformation, + ValueInfo, + BufferLength, + &ReturnedLength); + DPRINT("ZwQueryValueKey() called (Status %lx)\n", Status); + DPRINT("ReturnedLength %ld\n", ReturnedLength); + + ExFreePool(ValueInfo); + if (!NT_SUCCESS(Status) && Status != STATUS_BUFFER_TOO_SMALL) + { + DPRINT("ZwQueryValueKey() failed (Status %lx)\n", Status); + ZwClose(PeripheralInstanceKey); + ZwClose(PeripheralKey); + ZwClose(ControllerInstanceKey); + ZwClose(ControllerKey); + ZwClose(BusInstanceKey); + ZwClose(BusKey); + return FALSE; + } + + BufferLength = ReturnedLength; + ValueInfo = ExAllocatePool(NonPagedPool, + BufferLength); + if (ValueInfo == NULL) + { + DPRINT("ExAllocatePool() failed\n"); + ZwClose(PeripheralInstanceKey); + ZwClose(PeripheralKey); + ZwClose(ControllerInstanceKey); + ZwClose(ControllerKey); + ZwClose(BusInstanceKey); + ZwClose(BusKey); + return FALSE; + } + + Status = ZwQueryValueKey(ControllerInstanceKey, + &KeyName, + KeyValuePartialInformation, + ValueInfo, + BufferLength, + &ReturnedLength); + if (NT_SUCCESS(Status)) + { + DPRINT("Done\n"); + GetMouseResourceData((PCM_FULL_RESOURCE_DESCRIPTOR)(ValueInfo->Data), + Port, + Interrupt); + + ExFreePool(ValueInfo); + ZwClose(PeripheralInstanceKey); + ZwClose(PeripheralKey); + ZwClose(ControllerInstanceKey); + ZwClose(ControllerKey); + ZwClose(BusInstanceKey); + ZwClose(BusKey); + return TRUE; + } + + ExFreePool(ValueInfo); + + ZwClose(PeripheralInstanceKey); + + PeripheralInstance++; + } + + ZwClose(PeripheralKey); + } + + ZwClose(ControllerInstanceKey); + + ControllerInstance++; + } + + ZwClose(ControllerKey); + } + + ZwClose(BusInstanceKey); + + BusInstance++; + } + + ZwClose(BusKey); + + return FALSE; +} + + + NTSTATUS STDCALL DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) { - BOOL MouseFound = FALSE; + BOOLEAN MouseFound = FALSE; + ULONG BaseAddress = (ULONG)-1; + ULONG Interrupt = (ULONG)-1; - DbgPrint("Serial Mouse Driver 0.0.9\n"); + DPRINT1("Serial Mouse Driver 0.0.9\n"); + + if (GetMouseResources(&BaseAddress, &Interrupt)) + { + if (BaseAddress != (ULONG)-1 && Interrupt != (ULONG)-1) + { + DPRINT1("Found mouse: Port %lx Interupt %lu\n", BaseAddress, Interrupt); + MouseFound |= InitializeMouse(BaseAddress, Interrupt, DriverObject); + } + } + else + { #ifdef SERMOUSE_COM1_SUPPORT - DbgPrint("Trying to find mouse on COM1\n"); - MouseFound |= InitializeMouse(MOUSE_PORT_COM1, MOUSE_IRQ_COM1, DriverObject); + DPRINT1("Trying to find mouse on COM1\n"); + MouseFound |= InitializeMouse(MOUSE_PORT_COM1, MOUSE_IRQ_COM1, DriverObject); #endif #ifdef SERMOUSE_COM2_SUPPORT - DbgPrint("Trying to find mouse on COM2\n"); - MouseFound |= InitializeMouse(MOUSE_PORT_COM2, MOUSE_IRQ_COM2, DriverObject); + DPRINT1("Trying to find mouse on COM2\n"); + MouseFound |= InitializeMouse(MOUSE_PORT_COM2, MOUSE_IRQ_COM2, DriverObject); #endif + } if (!MouseFound) { - DbgPrint("No serial mouse found.\n"); + DPRINT1("No serial mouse found.\n"); return STATUS_UNSUCCESSFUL; } From 4a7c01adb6f07f6e6c4b365aef37cb265d322c0a Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sun, 6 Jun 2004 17:29:57 +0000 Subject: [PATCH 1351/1463] - Cancelled my last change. svn path=/trunk/; revision=9638 --- reactos/lib/kernel32/file/curdir.c | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/reactos/lib/kernel32/file/curdir.c b/reactos/lib/kernel32/file/curdir.c index f5c195d6111..56405adfc9d 100644 --- a/reactos/lib/kernel32/file/curdir.c +++ b/reactos/lib/kernel32/file/curdir.c @@ -1,4 +1,4 @@ -/* $Id: curdir.c,v 1.42 2004/06/06 08:50:26 hbirr Exp $ +/* $Id: curdir.c,v 1.43 2004/06/06 17:29:57 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -241,26 +241,18 @@ GetTempPathW ( if (!NT_SUCCESS(Status) && Status != STATUS_BUFFER_TOO_SMALL) { - /* - * FIXME: Should we use the current directory or the windows directory ? - */ Value.Length = RtlGetCurrentDirectory_U (Value.MaximumLength, Value.Buffer); } } - - Value.Length /= sizeof(WCHAR); - if (NT_SUCCESS(Status) && Value.Length > 0 && Value.Length + 1 < nBufferLength) + + if (NT_SUCCESS(Status)) { - lpBuffer[Value.Length] = L'\\'; - lpBuffer[Value.Length + 1] = 0; - if (!RtlDoesFileExists_U(lpBuffer)) - { - Value.Length = 0; - } + lpBuffer[Value.Length / sizeof(WCHAR)] = L'\\'; + lpBuffer[Value.Length / sizeof(WCHAR) + 1] = 0; } - return Value.Length ? Value.Length + 1 : 0; + return Value.Length / sizeof(WCHAR) + 1; } From 440fa78c14dfc1627c3398340ac69522d18b92e6 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Sun, 6 Jun 2004 17:33:13 +0000 Subject: [PATCH 1352/1463] - Check if the temp directory exist, if not use the current directory. svn path=/trunk/; revision=9639 --- reactos/subsys/system/cmd/cmd.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/system/cmd/cmd.c b/reactos/subsys/system/cmd/cmd.c index 7493942b431..9a13b1b5324 100644 --- a/reactos/subsys/system/cmd/cmd.c +++ b/reactos/subsys/system/cmd/cmd.c @@ -1,4 +1,4 @@ -/* $Id: cmd.c,v 1.14 2004/06/06 08:58:56 hbirr Exp $ +/* $Id: cmd.c,v 1.15 2004/06/06 17:33:13 hbirr Exp $ * * CMD.C - command-line interface. * @@ -497,6 +497,7 @@ VOID ParseCommandLine (LPTSTR cmd) INT num = 0; INT nRedirFlags = 0; INT Length; + UINT Attributes; HANDLE hOldConIn; HANDLE hOldConOut; @@ -518,6 +519,15 @@ VOID ParseCommandLine (LPTSTR cmd) #ifdef FEATURE_REDIRECTION /* find the temp path to store temporary files */ Length = GetTempPath (MAX_PATH, szTempPath); + if (Length > 0 && Length < MAX_PATH) + { + Attributes = GetFileAttributes(szTempPath); + if (Attributes == 0xffffffff || + !(Attributes & FILE_ATTRIBUTE_DIRECTORY)) + { + Length = 0; + } + } if (Length == 0 || Length >= MAX_PATH) { _tcscpy(szTempPath, _T(".\\")); From 5dabb7db1044180df1e6c83488abf617d819eeda Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Mon, 7 Jun 2004 12:24:00 +0000 Subject: [PATCH 1353/1463] Implement mouse driver autodetection and installation. svn path=/trunk/; revision=9640 --- reactos/Makefile | 4 +- reactos/bootdata/hiveinst.inf | 15 + reactos/bootdata/hivesys.inf | 2 +- reactos/bootdata/txtsetup.sif | 15 +- reactos/subsys/system/usetup/console.c | 4 +- reactos/subsys/system/usetup/settings.c | 351 +++++++++++++++++++++++- reactos/subsys/system/usetup/settings.h | 5 +- reactos/subsys/system/usetup/usetup.c | 20 +- 8 files changed, 400 insertions(+), 16 deletions(-) create mode 100644 reactos/bootdata/hiveinst.inf diff --git a/reactos/Makefile b/reactos/Makefile index db3d6257a38..27e64d540a2 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.228 2004/06/05 13:39:02 chorns Exp $ +# $Id: Makefile,v 1.229 2004/06/07 12:24:00 ekohl Exp $ # # Global makefile # @@ -228,7 +228,7 @@ ubootcd: bootcd_basic ubootcd_unattend bootcd_makecd livecd: livecd_basic livecd_makecd registry: tools - $(TOOLS_PATH)/mkhive/mkhive$(EXE_POSTFIX) bootdata $(INSTALL_DIR)/system32/config + $(TOOLS_PATH)/mkhive/mkhive$(EXE_POSTFIX) bootdata $(INSTALL_DIR)/system32/config bootdata/hiveinst.inf .PHONY: all depends implib clean clean_before install freeldr bootcd_directory_layout \ bootcd_bootstrap_files bootcd_install_before bootcd_basic bootcd_makecd ubootcd_unattend bootcd diff --git a/reactos/bootdata/hiveinst.inf b/reactos/bootdata/hiveinst.inf new file mode 100644 index 00000000000..362628c1511 --- /dev/null +++ b/reactos/bootdata/hiveinst.inf @@ -0,0 +1,15 @@ +[Version] +Signature = "$ReactOS$" + +[AddReg] +; Enable _one_ driver per section by removing the leading semicolon. + +; +; Mouse driver section +; + +; PS/2 mouse port driver +HKLM,"SYSTEM\CurrentControlSet\Services\Psaux","Start",0x00010001,0x00000001 + +; Serial mouse driver +;HKLM,"SYSTEM\CurrentControlSet\Services\Sermouse","Start",0x00010001,0x00000001 diff --git a/reactos/bootdata/hivesys.inf b/reactos/bootdata/hivesys.inf index db1ce60db24..a5314abcd2e 100644 --- a/reactos/bootdata/hivesys.inf +++ b/reactos/bootdata/hivesys.inf @@ -495,7 +495,7 @@ HKLM,"SYSTEM\CurrentControlSet\Services\Pice","Type",0x00010001,0x00000001 HKLM,"SYSTEM\CurrentControlSet\Services\Psaux","ErrorControl",0x00010001,0x00000000 HKLM,"SYSTEM\CurrentControlSet\Services\Psaux","Group",0x00000000,"Pointer Port" HKLM,"SYSTEM\CurrentControlSet\Services\Psaux","ImagePath",0x00020000,"system32\drivers\psaux.sys" -HKLM,"SYSTEM\CurrentControlSet\Services\Psaux","Start",0x00010001,0x00000001 +HKLM,"SYSTEM\CurrentControlSet\Services\Psaux","Start",0x00010001,0x00000004 HKLM,"SYSTEM\CurrentControlSet\Services\Psaux","Type",0x00010001,0x00000001 HKLM,"SYSTEM\CurrentControlSet\Services\Psaux\Parameters","DisableExtensionDetection",0x00010001,0x00000000 diff --git a/reactos/bootdata/txtsetup.sif b/reactos/bootdata/txtsetup.sif index daec1eee709..7740f5087a5 100644 --- a/reactos/bootdata/txtsetup.sif +++ b/reactos/bootdata/txtsetup.sif @@ -73,8 +73,19 @@ Default = "XT-, AT- or extended keyboard (83-105 keys)" 00000809 = kgbgb.dll [Mouse] -ps2mouse = "Mouse Port mouse (PS/2 mouse)" -sermouse = "Serial mouse" +;<id> = <user friendly name>,<spare>,<service key name> +msps2 = "Microsoft PS2 Mouse",,psaux +msser = "Microsoft Serial Mouse",,sermouse +mswhs = "Microsoft Serial Wheel Mouse",,sermouse +none = "No Mouse" + +[Map.Mouse] +;<id> = <pnp id string> +msps2 = "MICROSOFT PS2 MOUSE" +msser = "MICROSOFT SERIAL MOUSE" +mswhs = "MICROSOFT MOUSE WITH WHEEL" +none = "NO MOUSE" + [HiveInfs.Install] AddReg=hivecls.inf,AddReg diff --git a/reactos/subsys/system/usetup/console.c b/reactos/subsys/system/usetup/console.c index ea6e546f141..d14f1740fcc 100644 --- a/reactos/subsys/system/usetup/console.c +++ b/reactos/subsys/system/usetup/console.c @@ -108,7 +108,7 @@ AllocConsole(VOID) VOID FreeConsole(VOID) { - DPRINT1("FreeConsole() called\n"); + DPRINT("FreeConsole() called\n"); if (StdInput != INVALID_HANDLE_VALUE) NtClose(StdInput); @@ -116,7 +116,7 @@ FreeConsole(VOID) if (StdOutput != INVALID_HANDLE_VALUE) NtClose(StdOutput); - DPRINT1("FreeConsole() done\n"); + DPRINT("FreeConsole() done\n"); } diff --git a/reactos/subsys/system/usetup/settings.c b/reactos/subsys/system/usetup/settings.c index b5ed5122620..b44191cb72b 100644 --- a/reactos/subsys/system/usetup/settings.c +++ b/reactos/subsys/system/usetup/settings.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: settings.c,v 1.2 2004/06/02 22:18:06 ekohl Exp $ +/* $Id: settings.c,v 1.3 2004/06/07 12:21:36 ekohl Exp $ * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS text-mode setup * FILE: subsys/system/usetup/settings.c @@ -28,6 +28,7 @@ #include <ddk/ntddk.h> #include <ntdll/rtl.h> +#include <ntos/minmax.h> #include "usetup.h" #include "infcache.h" @@ -356,11 +357,231 @@ ProcessKeyboardLayoutRegistry(PGENERIC_LIST List) } +#if 0 BOOLEAN ProcessKeyboardLayoutFiles(PGENERIC_LIST List) { return TRUE; } +#endif + + +static BOOLEAN +GetMouseIdentifier(PWSTR ControllerType, + PWSTR Identifier, + ULONG IdentifierLength) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING KeyName; + WCHAR Buffer[32]; + HANDLE BusKey; + HANDLE BusInstanceKey; + HANDLE ControllerKey; + HANDLE ControllerInstanceKey; + HANDLE PeripheralKey; + HANDLE PeripheralInstanceKey; + ULONG BusInstance; + ULONG ControllerInstance; + ULONG PeripheralInstance; + ULONG BufferLength; + ULONG ReturnedLength; + PKEY_VALUE_PARTIAL_INFORMATION ValueInfo; + NTSTATUS Status; + + DPRINT("GetMouseIdentifier() called\n"); + + /* Open the bus key */ + RtlInitUnicodeString(&KeyName, + L"\\Registry\\Machine\\HARDWARE\\Description\\System\\MultifunctionAdapter"); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtOpenKey(&BusKey, + KEY_ALL_ACCESS, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT("NtOpenKey() failed (Status %lx)\n", Status); + return FALSE; + } + + BusInstance = 0; + while (TRUE) + { + swprintf(Buffer, L"%lu", BusInstance); + RtlInitUnicodeString(&KeyName, + Buffer); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + BusKey, + NULL); + Status = NtOpenKey(&BusInstanceKey, + KEY_ALL_ACCESS, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT("NtOpenKey() failed (Status %lx)\n", Status); + NtClose(BusKey); + return FALSE; + } + + /* Open the controller type key */ + RtlInitUnicodeString(&KeyName, + ControllerType); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + BusInstanceKey, + NULL); + Status = NtOpenKey(&ControllerKey, + KEY_ALL_ACCESS, + &ObjectAttributes); + if (NT_SUCCESS(Status)) + { + ControllerInstance = 0; + while (TRUE) + { + /* Open the pointer controller instance key */ + swprintf(Buffer, L"%lu", ControllerInstance); + RtlInitUnicodeString(&KeyName, + Buffer); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + ControllerKey, + NULL); + Status = NtOpenKey(&ControllerInstanceKey, + KEY_ALL_ACCESS, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT("NtOpenKey() failed (Status %lx)\n", Status); + NtClose(ControllerKey); + NtClose(BusInstanceKey); + NtClose(BusKey); + return FALSE; + } + + /* Open the 'PointerPeripheral' key */ + RtlInitUnicodeString(&KeyName, + L"PointerPeripheral"); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + ControllerInstanceKey, + NULL); + Status = NtOpenKey(&PeripheralKey, + KEY_ALL_ACCESS, + &ObjectAttributes); + if (NT_SUCCESS(Status)) + { + PeripheralInstance = 0; + while (TRUE) + { + /* Open the pointer peripheral instance key */ + swprintf(Buffer, L"%lu", PeripheralInstance); + RtlInitUnicodeString(&KeyName, + Buffer); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + PeripheralKey, + NULL); + Status = NtOpenKey(&PeripheralInstanceKey, + KEY_ALL_ACCESS, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT("NtOpenKey() failed (Status %lx)\n", Status); + NtClose(PeripheralKey); + NtClose(ControllerInstanceKey); + NtClose(ControllerKey); + NtClose(BusInstanceKey); + NtClose(BusKey); + return FALSE; + } + + /* Get peripheral identifier */ + RtlInitUnicodeString(&KeyName, + L"Identifier"); + + BufferLength = sizeof(KEY_VALUE_PARTIAL_INFORMATION) + + 256 * sizeof(WCHAR); + ValueInfo = RtlAllocateHeap(RtlGetProcessHeap(), + 0, + BufferLength); + if (ValueInfo == NULL) + { + DPRINT("RtlAllocateHeap() failed\n"); + NtClose(PeripheralInstanceKey); + NtClose(PeripheralKey); + NtClose(ControllerInstanceKey); + NtClose(ControllerKey); + NtClose(BusInstanceKey); + NtClose(BusKey); + return FALSE; + } + + Status = NtQueryValueKey(PeripheralInstanceKey, + &KeyName, + KeyValuePartialInformation, + ValueInfo, + BufferLength, + &ReturnedLength); + if (NT_SUCCESS(Status)) + { + DPRINT("Identifier: %S\n", (PWSTR)ValueInfo->Data); + + BufferLength = min(ValueInfo->DataLength / sizeof(WCHAR), IdentifierLength); + RtlCopyMemory (Identifier, + ValueInfo->Data, + BufferLength * sizeof(WCHAR)); + Identifier[BufferLength] = 0; + + RtlFreeHeap(RtlGetProcessHeap(), + 0, + ValueInfo); + NtClose(PeripheralInstanceKey); + NtClose(PeripheralKey); + NtClose(ControllerInstanceKey); + NtClose(ControllerKey); + NtClose(BusInstanceKey); + NtClose(BusKey); + return TRUE; + } + + RtlFreeHeap(RtlGetProcessHeap(), + 0, + ValueInfo); + + NtClose(PeripheralInstanceKey); + + PeripheralInstance++; + } + + NtClose(PeripheralKey); + } + + NtClose(ControllerInstanceKey); + + ControllerInstance++; + } + + NtClose(ControllerKey); + } + + NtClose(BusInstanceKey); + + BusInstance++; + } + + NtClose(BusKey); + + return FALSE; +} PGENERIC_LIST @@ -372,12 +593,58 @@ CreateMouseDriverList(HINF InfFile) PWCHAR KeyName; PWCHAR KeyValue; PWCHAR UserData; + WCHAR MouseIdentifier[128]; + WCHAR MouseKey[32]; + + /* Get the mouse identification */ + if (!GetMouseIdentifier(L"SerialController", MouseIdentifier, 128)) + { + if (!GetMouseIdentifier(L"PointerController", MouseIdentifier, 128)) + { + wcscpy (MouseIdentifier, L"NO MOUSE"); + } + } + + DPRINT("Mouse identifier: '%S'\n", MouseIdentifier); + + /* Search for matching device identifier */ + if (!InfFindFirstLine(InfFile, L"Map.Mouse", NULL, &Context)) + { + /* FIXME: error message */ + return NULL; + } + + do + { + if (!InfGetDataField(&Context, 1, &KeyValue)) + { + /* FIXME: Handle error! */ + DPRINT("InfGetDataField() failed\n"); + return NULL; + } + + DPRINT("KeyValue: %S\n", KeyValue); + if (wcsstr(MouseIdentifier, KeyValue)) + { + if (!InfGetDataField(&Context, 0, &KeyName)) + { + /* FIXME: Handle error! */ + DPRINT("InfGetDataField() failed\n"); + return NULL; + } + + DPRINT("Mouse key: %S\n", KeyName); + wcscpy(MouseKey, KeyName); + } + } + while (InfFindNextLine(&Context, &Context)); + List = CreateGenericList(); if (List == NULL) return NULL; - if (!InfFindFirstLine (InfFile, L"Mouse", NULL, &Context)) + if (!InfFindFirstLine(InfFile, L"Mouse", NULL, &Context)) { DestroyGenericList(List, FALSE); return NULL; @@ -385,10 +652,15 @@ CreateMouseDriverList(HINF InfFile) do { - if (!InfGetData (&Context, &KeyName, &KeyValue)) + if (!InfGetDataField(&Context, 0, &KeyName)) { - /* FIXME: Handle error! */ - DPRINT("InfGetData() failed\n"); + DPRINT1("InfGetDataField() failed\n"); + break; + } + + if (!InfGetDataField(&Context, 1, &KeyValue)) + { + DPRINT1("InfGetDataField() failed\n"); break; } @@ -397,17 +669,82 @@ CreateMouseDriverList(HINF InfFile) (wcslen(KeyName) + 1) * sizeof(WCHAR)); if (UserData == NULL) { - /* FIXME: Handle error! */ + DPRINT1("RtlAllocateHeap() failed\n"); + DestroyGenericList(List, TRUE); + return NULL; } wcscpy(UserData, KeyName); sprintf(Buffer, "%S", KeyValue); - AppendGenericListEntry(List, Buffer, UserData, FALSE); + AppendGenericListEntry(List, + Buffer, + UserData, + _wcsicmp(KeyName, MouseKey) ? FALSE : TRUE); } while (InfFindNextLine(&Context, &Context)); return List; } + +BOOLEAN +ProcessMouseRegistry(HINF InfFile, PGENERIC_LIST List) +{ + PGENERIC_LIST_ENTRY Entry; + INFCONTEXT Context; + PWCHAR ServiceName; + ULONG StartValue; + NTSTATUS Status; + + DPRINT("ProcessMouseRegistry() called\n"); + + Entry = GetGenericListEntry(List); + if (Entry == NULL) + { + DPRINT("GetGenericListEntry() failed\n"); + return FALSE; + } + + if (!InfFindFirstLine(InfFile, L"Mouse", Entry->UserData, &Context)) + { + DPRINT("InfFindFirstLine() failed\n"); + return FALSE; + } + + if (!InfGetDataField(&Context, 3, &ServiceName)) + { + DPRINT("InfGetDataField() failed\n"); + return FALSE; + } + + DPRINT("Service name: %S\n", ServiceName); + + StartValue = 1; + Status = RtlWriteRegistryValue(RTL_REGISTRY_SERVICES, + ServiceName, + L"Start", + REG_DWORD, + &StartValue, + sizeof(ULONG)); + if (!NT_SUCCESS(Status)) + { + DPRINT("RtlWriteRegistryValue() failed (Status %lx)\n", Status); + return FALSE; + } + + DPRINT("ProcessMouseRegistry() done\n"); + + return TRUE; +} + + +#if 0 +BOOLEAN +ProcessMouseFiles(PGENERIC_LIST List) +{ + return TRUE; +} +#endif + /* EOF */ diff --git a/reactos/subsys/system/usetup/settings.h b/reactos/subsys/system/usetup/settings.h index 1ca3155eb1f..7d939960a22 100644 --- a/reactos/subsys/system/usetup/settings.h +++ b/reactos/subsys/system/usetup/settings.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: settings.h,v 1.1 2004/05/30 14:54:02 ekohl Exp $ +/* $Id: settings.h,v 1.2 2004/06/07 12:21:37 ekohl Exp $ * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS text-mode setup * FILE: subsys/system/usetup/settings.h @@ -48,6 +48,9 @@ ProcessKeyboardLayoutFiles(PGENERIC_LIST List); PGENERIC_LIST CreateMouseDriverList(HINF InfFile); +BOOLEAN +ProcessMouseRegistry(HINF InfFile, PGENERIC_LIST List); + #endif /* __SETTINGS_H__ */ /* EOF */ diff --git a/reactos/subsys/system/usetup/usetup.c b/reactos/subsys/system/usetup/usetup.c index 66db83a375e..65970f159d1 100644 --- a/reactos/subsys/system/usetup/usetup.c +++ b/reactos/subsys/system/usetup/usetup.c @@ -3145,7 +3145,7 @@ RegistryPage(PINPUT_RECORD Ir) InfGetDataField (&InfContext, 1, &File); InfGetDataField (&InfContext, 2, &Section); - DPRINT1("Action: %S File: %S Section %S\n", Action, File, Section); + DPRINT("Action: %S File: %S Section %S\n", Action, File, Section); if (!_wcsicmp (Action, L"AddReg")) { @@ -3200,6 +3200,24 @@ RegistryPage(PINPUT_RECORD Ir) } } + /* Update mouse registry settings */ + SetStatusText(" Updating mouse registry settings..."); + if (!ProcessMouseRegistry(SetupInf, PointerList)) + { + PopupError("Setup failed to update mouse registry settings.", + "ENTER = Reboot computer"); + + while(TRUE) + { + ConInKey(Ir); + + if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ + { + return QUIT_PAGE; + } + } + } + SetStatusText(" Done..."); return BOOT_LOADER_PAGE; From da9b36f49507d3c79e2329fb24a6bc21616f9b38 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Mon, 7 Jun 2004 16:37:07 +0000 Subject: [PATCH 1354/1463] - Implemented ScsiPortCompleteRequest. - Fixed the calculation of the max transfer size. - Rewrote parts of SpiScanAdapter and SpiSendInquiry to speed up device detection. - Fixed the handling of sense info data for HBA's which are auto request sense capability. - Added some more debug messages. svn path=/trunk/; revision=9641 --- reactos/drivers/storage/scsiport/makefile | 7 +- reactos/drivers/storage/scsiport/scsiport.c | 636 ++++++++++++------ reactos/drivers/storage/scsiport/scsiport.rc | 3 +- .../drivers/storage/scsiport/scsiport_int.h | 26 +- 4 files changed, 461 insertions(+), 211 deletions(-) diff --git a/reactos/drivers/storage/scsiport/makefile b/reactos/drivers/storage/scsiport/makefile index ef51fa06089..f67496e93e8 100644 --- a/reactos/drivers/storage/scsiport/makefile +++ b/reactos/drivers/storage/scsiport/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.6 2003/11/13 14:20:03 ekohl Exp $ +# $Id: makefile,v 1.7 2004/06/07 16:37:07 hbirr Exp $ PATH_TO_TOP = ../../.. @@ -12,6 +12,11 @@ TARGET_OBJECTS = $(TARGET_NAME).o TARGET_CFLAGS = -Werror -Wall +DEP_OBJECTS = $(TARGET_OBJECTS) + include $(PATH_TO_TOP)/rules.mak include $(TOOLS_PATH)/helper.mk + +include $(TOOLS_PATH)/depend.mk + diff --git a/reactos/drivers/storage/scsiport/scsiport.c b/reactos/drivers/storage/scsiport/scsiport.c index e4a1785e3c2..65a245419c2 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.57 2004/05/24 20:33:41 hbirr Exp $ +/* $Id: scsiport.c,v 1.58 2004/06/07 16:37:07 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -37,9 +37,6 @@ #define NDEBUG #include <debug.h> - -#define VERSION "0.0.1" - #include "scsiport_int.h" /* TYPES *********************************************************************/ @@ -99,7 +96,9 @@ SpiGetLunExtension (IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, static NTSTATUS SpiSendInquiry (IN PDEVICE_OBJECT DeviceObject, - IN OUT PSCSI_REQUEST_BLOCK Srb); + IN OUT PSCSI_REQUEST_BLOCK Srb, + IN OUT PIO_STATUS_BLOCK IoStatusBlock, + IN OUT PKEVENT Event); static VOID SpiScanAdapter (IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension); @@ -113,10 +112,10 @@ ScsiPortIsr(IN PKINTERRUPT Interrupt, IN PVOID ServiceContext); static VOID STDCALL -ScsiPortDpcForIsr(IN PKDPC Dpc, - IN PDEVICE_OBJECT DpcDeviceObject, - IN PIRP DpcIrp, - IN PVOID DpcContext); +ScsiPortDpc(IN PKDPC Dpc, + IN PDEVICE_OBJECT DpcDeviceObject, + IN PIRP DpcIrp, + IN PVOID DpcContext); static VOID STDCALL ScsiPortIoTimer(PDEVICE_OBJECT DeviceObject, @@ -227,8 +226,49 @@ ScsiPortCompleteRequest(IN PVOID HwDeviceExtension, IN UCHAR Lun, IN UCHAR SrbStatus) { - DPRINT("ScsiPortCompleteRequest()\n"); - UNIMPLEMENTED; + PSCSI_PORT_DEVICE_EXTENSION DeviceExtension; + PSCSI_PORT_LUN_EXTENSION LunExtension; + PLIST_ENTRY Entry; + PIRP Irp; + PSCSI_REQUEST_BLOCK Srb; + + DPRINT("ScsiPortCompleteRequest(HwDeviceExtension %x, PathId %d, TargetId %d, Lun %d, SrbStatus %x)\n", + HwDeviceExtension, PathId, TargetId, Lun, SrbStatus); + + DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, + SCSI_PORT_DEVICE_EXTENSION, + MiniPortDeviceExtension); + + Entry = DeviceExtension->LunExtensionListHead.Flink; + while (Entry != &DeviceExtension->LunExtensionListHead) + { + LunExtension = CONTAINING_RECORD(Entry, + SCSI_PORT_LUN_EXTENSION, + List); + + + + if (PathId == (UCHAR)SP_UNTAGGED || + (PathId == LunExtension->PathId && TargetId == (UCHAR)SP_UNTAGGED) || + (PathId == LunExtension->PathId && TargetId == LunExtension->TargetId && Lun == (UCHAR)SP_UNTAGGED) || + (PathId == LunExtension->PathId && TargetId == LunExtension->TargetId && Lun == LunExtension->Lun)) + { + Irp = LunExtension->NextIrp; + while (Irp) + { + Srb = (PSCSI_REQUEST_BLOCK)Irp->Tail.Overlay.DriverContext[3]; + if (Srb->SrbStatus & SRB_FLAGS_IS_ACTIVE) + { + Srb->SrbStatus = SrbStatus; + ScsiPortNotification(RequestComplete, + HwDeviceExtension, + Srb); + } + Irp = Irp->Tail.Overlay.DriverContext[1]; + } + } + Entry = Entry->Flink; + } } @@ -518,7 +558,7 @@ ScsiPortGetPhysicalAddress(IN PVOID HwDeviceExtension, * @unimplemented */ PSCSI_REQUEST_BLOCK STDCALL -ScsiPortGetSrb(IN PVOID DeviceExtension, +ScsiPortGetSrb(IN PVOID HwDeviceExtension, IN UCHAR PathId, IN UCHAR TargetId, IN UCHAR Lun, @@ -696,7 +736,33 @@ ScsiPortInitialize(IN PVOID Argument1, DPRINT ("ScsiPortInitialize() called!\n"); - +#if 0 + DPRINT1("HwInitializationDataSize: %d\n", HwInitializationData->HwInitializationDataSize); + DPRINT1("AdapterInterfaceType: %d\n", HwInitializationData->AdapterInterfaceType); + DPRINT1("HwInitialize: %x\n", HwInitializationData->HwInitialize); + DPRINT1("HwStartIo: %x\n", HwInitializationData->HwStartIo); + DPRINT1("HwInterrupt: %x\n", HwInitializationData->HwInterrupt); + DPRINT1("HwFindAdapter: %x\n", HwInitializationData->HwFindAdapter); + DPRINT1("HwResetBus: %x\n", HwInitializationData->HwResetBus); + DPRINT1("HwDmaStarted: %x\n", HwInitializationData->HwDmaStarted); + DPRINT1("HwAdapterState: %x\n", HwInitializationData->HwAdapterState); + DPRINT1("DeviceExtensionSize: %d\n", HwInitializationData->DeviceExtensionSize); + DPRINT1("SpecificLuExtensionSize: %d\n", HwInitializationData->SpecificLuExtensionSize); + DPRINT1("SrbExtensionSize: %d\n", HwInitializationData->SrbExtensionSize); + DPRINT1("NumberOfAccessRanges: %d\n", HwInitializationData->NumberOfAccessRanges); + DPRINT1("Reserved: %x\n", HwInitializationData->Reserved); + DPRINT1("MapBuffers: %d\n", HwInitializationData->MapBuffers); + DPRINT1("NeedPhysicalAddresses: %d\n", HwInitializationData->NeedPhysicalAddresses); + DPRINT1("TaggedQueueing: %d\n", HwInitializationData->TaggedQueueing); + DPRINT1("AutoRequestSense: %d\n", HwInitializationData->AutoRequestSense); + DPRINT1("MultipleRequestPerLu: %d\n", HwInitializationData->MultipleRequestPerLu); + DPRINT1("ReceiveEvent: %d\n", HwInitializationData->ReceiveEvent); + DPRINT1("VendorIdLength: %d\n", HwInitializationData->VendorIdLength); + DPRINT1("VendorId: %x\n", HwInitializationData->VendorId); + DPRINT1("ReservedUshort: %d\n", HwInitializationData->ReservedUshort); + DPRINT1("DeviceIdLength: %d\n", HwInitializationData->DeviceIdLength); + DPRINT1("DeviceId: %x\n", HwInitializationData->DeviceId); +#endif if ((HwInitializationData->HwInitialize == NULL) || (HwInitializationData->HwStartIo == NULL) || (HwInitializationData->HwInterrupt == NULL) || @@ -779,7 +845,7 @@ ScsiPortInitialize(IN PVOID Argument1, /* Initialize the irp lists */ InitializeListHead (&DeviceExtension->PendingIrpListHead); - InitializeListHead (&DeviceExtension->ActiveIrpListHead); + DeviceExtension->NextIrp = NULL; DeviceExtension->PendingIrpCount = 0; DeviceExtension->ActiveIrpCount = 0; @@ -787,12 +853,11 @@ ScsiPortInitialize(IN PVOID Argument1, InitializeListHead (&DeviceExtension->LunExtensionListHead); /* Initialize the spin lock in the controller extension */ - KeInitializeSpinLock (&DeviceExtension->IrpLock); - KeInitializeSpinLock (&DeviceExtension->SpinLock); + KeInitializeSpinLock (&DeviceExtension->Lock); /* Initialize the DPC object */ IoInitializeDpcRequest (PortDeviceObject, - ScsiPortDpcForIsr); + ScsiPortDpc); /* Initialize the device timer */ DeviceExtension->TimerState = IDETimerIdle; @@ -853,8 +918,6 @@ ScsiPortInitialize(IN PVOID Argument1, PortConfig->SrbExtensionSize = HwInitializationData->SrbExtensionSize; PortConfig->SpecificLuExtensionSize = HwInitializationData->SpecificLuExtensionSize; - PortConfig->SlotNumber = SlotNumber.u.AsULONG; - PortConfig->AccessRanges = (PACCESS_RANGE)(PortConfig + 1); /* Search for matching PCI device */ @@ -897,6 +960,51 @@ ScsiPortInitialize(IN PVOID Argument1, { DPRINT("ScsiPortInitialize(): Found HBA! (%x)\n", PortConfig->BusInterruptVector); +#if 0 + DPRINT1("SystemIoBusNumber: %x\n", PortConfig->SystemIoBusNumber); + DPRINT1("AdapterInterfaceType: %x\n", PortConfig->AdapterInterfaceType); + DPRINT1("BusInterruptLevel: %x\n", PortConfig->BusInterruptLevel); + DPRINT1("BusInterruptVector: %x\n", PortConfig->BusInterruptVector); + DPRINT1("InterruptMode: %x\n", PortConfig->InterruptMode); + DPRINT1("MaximumTransferLength: %x\n", PortConfig->MaximumTransferLength); + DPRINT1("NumberOfPhysicalBreaks: %x\n", PortConfig->NumberOfPhysicalBreaks); + DPRINT1("DmaChannel: %x\n", PortConfig->DmaChannel); + DPRINT1("DmaPort: %d\n", PortConfig->DmaPort); + DPRINT1("DmaWidth: %d\n", PortConfig->DmaWidth); + DPRINT1("DmaSpeed: %d\n", PortConfig->DmaSpeed); + DPRINT1("AlignmentMask: %d\n", PortConfig->AlignmentMask); + DPRINT1("NumberOfAccessRanges: %d\n", PortConfig->NumberOfAccessRanges); + DPRINT1("NumberOfBuses: %d\n", PortConfig->NumberOfBuses); + DPRINT1("ScatterGather: %d\n", PortConfig->ScatterGather); + DPRINT1("Master: %d\n", PortConfig->Master); + DPRINT1("CachesData: %d\n", PortConfig->CachesData); + DPRINT1("AdapterScansDown: %d\n", PortConfig->AdapterScansDown); + DPRINT1("AtdiskPrimaryClaimed: %d\n", PortConfig->AtdiskPrimaryClaimed); + DPRINT1("AtdiskSecondaryClaimed: %d\n", PortConfig->AtdiskSecondaryClaimed); + DPRINT1("Dma32BitAddresses: %d\n", PortConfig->Dma32BitAddresses); + DPRINT1("DemandMode: %d\n", PortConfig->DemandMode); + DPRINT1("MapBuffers: %d\n", PortConfig->MapBuffers); + DPRINT1("NeedPhysicalAddresses: %d\n", PortConfig->NeedPhysicalAddresses); + DPRINT1("TaggedQueuing: %d\n", PortConfig->TaggedQueuing); + DPRINT1("AutoRequestSense: %d\n", PortConfig->AutoRequestSense); + DPRINT1("MultipleRequestPerLu: %d\n", PortConfig->MultipleRequestPerLu); + DPRINT1("ReceiveEvent: %d\n", PortConfig->ReceiveEvent); + DPRINT1("RealModeInitialized: %d\n", PortConfig->RealModeInitialized); + DPRINT1("BufferAccessScsiPortControlled: %d\n", PortConfig->BufferAccessScsiPortControlled); + DPRINT1("MaximumNumberOfTargets: %d\n", PortConfig->MaximumNumberOfTargets); + DPRINT1("SlotNumber: %d\n", PortConfig->SlotNumber); + DPRINT1("BusInterruptLevel2: %x\n", PortConfig->BusInterruptLevel2); + DPRINT1("BusInterruptVector2: %x\n", PortConfig->BusInterruptVector2); + DPRINT1("InterruptMode2: %x\n", PortConfig->InterruptMode2); + DPRINT1("DmaChannel2: %d\n", PortConfig->DmaChannel2); + DPRINT1("DmaPort2: %d\n", PortConfig->DmaPort2); + DPRINT1("DmaWidth2: %d\n", PortConfig->DmaWidth2); + DPRINT1("DmaSpeed2: %d\n", PortConfig->DmaSpeed2); + DPRINT1("DeviceExtensionSize: %d\n", PortConfig->DeviceExtensionSize); + DPRINT1("SpecificLuExtensionSize: %d\n", PortConfig->SpecificLuExtensionSize); + DPRINT1("SrbExtensionSize: %d\n", PortConfig->SrbExtensionSize); + +#endif if (DeviceExtension->VirtualAddress == NULL && DeviceExtension->SrbExtensionSize) { @@ -929,7 +1037,7 @@ ScsiPortInitialize(IN PVOID Argument1, Status = IoConnectInterrupt(&DeviceExtension->Interrupt, ScsiPortIsr, DeviceExtension, - &DeviceExtension->SpinLock, + NULL, MappedIrq, Dirql, Dirql, @@ -963,8 +1071,19 @@ ScsiPortInitialize(IN PVOID Argument1, PortCapabilities = DeviceExtension->PortCapabilities; PortCapabilities->Length = sizeof(IO_SCSI_CAPABILITIES); - PortCapabilities->MaximumTransferLength = - PortConfig->MaximumTransferLength; + if (PortConfig->ScatterGather == FALSE || + PortConfig->NumberOfPhysicalBreaks >= (0x100000000LL >> PAGE_SHIFT) || + PortConfig->MaximumTransferLength < PortConfig->NumberOfPhysicalBreaks * PAGE_SIZE) + { + PortCapabilities->MaximumTransferLength = + PortConfig->MaximumTransferLength; + } + else + { + PortCapabilities->MaximumTransferLength = + PortConfig->NumberOfPhysicalBreaks * PAGE_SIZE; + } + PortCapabilities->MaximumPhysicalPages = PortCapabilities->MaximumTransferLength / PAGE_SIZE; PortCapabilities->SupportedAsynchronousEvents = 0; /* FIXME */ @@ -1137,7 +1256,7 @@ ScsiPortNotification(IN SCSI_NOTIFICATION_TYPE NotificationType, Srb = (PSCSI_REQUEST_BLOCK) va_arg (ap, PSCSI_REQUEST_BLOCK); DPRINT("Notify: RequestComplete (Srb %p)\n", Srb); - DeviceExtension->IrpFlags |= IRP_FLAG_COMPLETE; + DeviceExtension->Flags |= IRP_FLAG_COMPLETE; Srb->SrbFlags &= ~SRB_FLAGS_IS_ACTIVE; InterlockedIncrement((PLONG)&DeviceExtension->CompleteRequestCount); } @@ -1145,7 +1264,7 @@ ScsiPortNotification(IN SCSI_NOTIFICATION_TYPE NotificationType, case NextRequest: DPRINT("Notify: NextRequest\n"); - DeviceExtension->IrpFlags |= IRP_FLAG_NEXT; + DeviceExtension->Flags |= IRP_FLAG_NEXT; InterlockedIncrement((PLONG)&DeviceExtension->NextRequestCount); break; @@ -1169,7 +1288,7 @@ ScsiPortNotification(IN SCSI_NOTIFICATION_TYPE NotificationType, Lun); if (LunExtension) { - DeviceExtension->IrpFlags |= IRP_FLAG_NEXT_LU; + DeviceExtension->Flags |= IRP_FLAG_NEXT_LU; InterlockedIncrement((PLONG)&LunExtension->NextLuRequestCount); InterlockedIncrement((PLONG)&DeviceExtension->NextLuRequestCount); } @@ -1185,6 +1304,16 @@ ScsiPortNotification(IN SCSI_NOTIFICATION_TYPE NotificationType, DPRINT1 ("Unsupported notification %lu\n", NotificationType); break; } + if (KeGetCurrentIrql() >= DISPATCH_LEVEL) + { + IoRequestDpc(DeviceExtension->DeviceObject, + NULL, + DeviceExtension); + } + else + { + SpiProcessRequests(DeviceExtension, NULL); + } va_end(ap); } @@ -1353,7 +1482,11 @@ SpiGetPciConfigData (IN struct _HW_INITIALIZATION_DATA *HwInitializationData, } NextSlotNumber->u.bits.DeviceNumber = DeviceNumber; - NextSlotNumber->u.bits.FunctionNumber = FunctionNumber + 1; + NextSlotNumber->u.bits.FunctionNumber = FunctionNumber; + + PortConfig->SlotNumber = NextSlotNumber->u.AsULONG; + + NextSlotNumber->u.bits.FunctionNumber += 1; return TRUE; } @@ -1718,6 +1851,8 @@ SpiAllocateLunExtension (IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, LunExtension->PendingIrpCount = 0; LunExtension->ActiveIrpCount = 0; + LunExtension->NextIrp = NULL; + return LunExtension; } @@ -1780,20 +1915,16 @@ SpiGetLunExtension (IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, static NTSTATUS SpiSendInquiry (IN PDEVICE_OBJECT DeviceObject, - IN OUT PSCSI_REQUEST_BLOCK Srb) + IN OUT PSCSI_REQUEST_BLOCK Srb, + IN OUT PIO_STATUS_BLOCK IoStatusBlock, + IN OUT PKEVENT Event) { - IO_STATUS_BLOCK IoStatusBlock; PIO_STACK_LOCATION IrpStack; - PKEVENT Event; PIRP Irp; NTSTATUS Status; DPRINT ("SpiSendInquiry() called\n"); - Event = ExAllocatePool (NonPagedPool, - sizeof(KEVENT)); - if (Event == NULL) - return STATUS_INSUFFICIENT_RESOURCES; KeInitializeEvent (Event, NotificationEvent, @@ -1807,11 +1938,10 @@ SpiSendInquiry (IN PDEVICE_OBJECT DeviceObject, Srb->DataTransferLength, TRUE, Event, - &IoStatusBlock); + IoStatusBlock); if (Irp == NULL) { DPRINT("IoBuildDeviceIoControlRequest() failed\n"); - ExFreePool (Event); return STATUS_INSUFFICIENT_RESOURCES; } @@ -1823,102 +1953,152 @@ SpiSendInquiry (IN PDEVICE_OBJECT DeviceObject, /* Call the driver */ Status = IoCallDriver (DeviceObject, Irp); - if (Status == STATUS_PENDING) - { - KeWaitForSingleObject (Event, - Suspended, - KernelMode, - FALSE, - NULL); - Status = IoStatusBlock.Status; - } - - ExFreePool (Event); return Status; } - static VOID SpiScanAdapter (IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension) { - PSCSI_PORT_LUN_EXTENSION LunExtension; - SCSI_REQUEST_BLOCK Srb; + PSCSI_REQUEST_BLOCK Srb; PCDB Cdb; ULONG Bus; ULONG Target; - ULONG Lun; - PVOID DataBuffer; - NTSTATUS Status; - + PSCSI_PORT_SCAN_ADAPTER ScanDataArray; + PSCSI_PORT_SCAN_ADAPTER ScanData; + ULONG i; + ULONG MaxCount; + ULONG WaitCount; + ULONG ActiveCount; + PVOID* EventArray; + PKWAIT_BLOCK WaitBlockArray; + DPRINT ("SpiScanAdapter() called\n"); - DataBuffer = ExAllocatePool(NonPagedPool, 256); + MaxCount = DeviceExtension->PortConfig->NumberOfBuses * + DeviceExtension->PortConfig->MaximumNumberOfTargets; + + ScanDataArray = ExAllocatePool(NonPagedPool, MaxCount * (sizeof(SCSI_PORT_SCAN_ADAPTER) + sizeof(PVOID) + sizeof(KWAIT_BLOCK))); + if (ScanDataArray == NULL) + { + return; + } + EventArray = (PVOID*)((PUCHAR)ScanDataArray + MaxCount * sizeof(SCSI_PORT_SCAN_ADAPTER)); + WaitBlockArray = (PKWAIT_BLOCK)((PUCHAR)EventArray + MaxCount * sizeof(PVOID)); for (Bus = 0; Bus < DeviceExtension->PortConfig->NumberOfBuses; Bus++) { for (Target = 0; Target < DeviceExtension->PortConfig->MaximumNumberOfTargets; Target++) { - for (Lun = 0; Lun < SCSI_MAXIMUM_LOGICAL_UNITS; Lun++) - { - RtlZeroMemory(&Srb, - sizeof(SCSI_REQUEST_BLOCK)); - Srb.SrbFlags = SRB_FLAGS_DATA_IN; - Srb.DataBuffer = DataBuffer; - Srb.Function = SRB_FUNCTION_EXECUTE_SCSI; - Srb.DataTransferLength = 255; //256; - Srb.CdbLength = 6; - Srb.Lun = Lun; - Srb.PathId = Bus; - Srb.TargetId = Target; - Srb.SrbStatus = SRB_STATUS_SUCCESS; - - Cdb = (PCDB) &Srb.Cdb; - - Cdb->CDB6INQUIRY.OperationCode = SCSIOP_INQUIRY; - Cdb->CDB6INQUIRY.AllocationLength = 255; - Cdb->CDB6INQUIRY.LogicalUnitNumber = Lun; - - RtlZeroMemory(Srb.DataBuffer, 256); - - LunExtension = SpiAllocateLunExtension (DeviceExtension, - Bus, - Target, - Lun); - if (LunExtension == NULL) - { - DPRINT("Failed to allocate the LUN extension!\n"); - ExFreePool(DataBuffer); - return; - } - - Status = SpiSendInquiry (DeviceExtension->DeviceObject, - &Srb); - DPRINT ("Target %lu Lun %lu", Target, Lun); - DPRINT ("Status %lx Srb.SrbStatus %x\n", Status, Srb.SrbStatus); - DPRINT ("DeviceTypeQualifier %x\n", ((PINQUIRYDATA)Srb.DataBuffer)->DeviceTypeQualifier); - - if (NT_SUCCESS(Status) && - (Srb.SrbStatus == SRB_STATUS_SUCCESS || - Srb.SrbStatus == SRB_STATUS_DATA_OVERRUN) && - ((PINQUIRYDATA)Srb.DataBuffer)->DeviceTypeQualifier == 0) - { - /* Copy inquiry data */ - RtlCopyMemory (&LunExtension->InquiryData, - Srb.DataBuffer, - sizeof(INQUIRYDATA)); - } - else - { - SpiRemoveLunExtension (LunExtension); - break; - } - } + ScanData = &ScanDataArray[Bus * DeviceExtension->PortConfig->MaximumNumberOfTargets + Target]; + ScanData->Bus = Bus; + ScanData->Target = Target; + ScanData->Lun = 0; + ScanData->Active = FALSE; } } + do + { + ActiveCount = 0; + WaitCount = 0; + for (i = 0; i < MaxCount; i++) + { + ScanData = &ScanDataArray[i]; + Srb = &ScanData->Srb; + if (ScanData->Active) + { + if (ScanData->Status == STATUS_PENDING && + 0 == KeReadStateEvent(&ScanData->Event)) + { + ActiveCount++; + continue; + } + else + { + ScanData->Status = ScanData->IoStatusBlock.Status; + } + ScanData->Active = FALSE; + DPRINT ("Target %lu Lun %lu\n", ScanData->Target, ScanData->Lun); + DPRINT ("Status %lx Srb.SrbStatus %x\n", ScanData->Status, Srb->SrbStatus); + DPRINT ("DeviceTypeQualifier %x\n", ((PINQUIRYDATA)Srb->DataBuffer)->DeviceTypeQualifier); - ExFreePool(DataBuffer); + if (NT_SUCCESS(ScanData->Status) && + (Srb->SrbStatus == SRB_STATUS_SUCCESS || + Srb->SrbStatus == SRB_STATUS_DATA_OVERRUN) && + ((PINQUIRYDATA)Srb->DataBuffer)->DeviceTypeQualifier == 0) + { + /* Copy inquiry data */ + RtlCopyMemory (&ScanData->LunExtension->InquiryData, + Srb->DataBuffer, + sizeof(INQUIRYDATA)); + ScanData->Lun++; + } + else + { + SpiRemoveLunExtension (ScanData->LunExtension); + ScanData->Lun = SCSI_MAXIMUM_LOGICAL_UNITS; + } + } + if (ScanData->Lun >= SCSI_MAXIMUM_LOGICAL_UNITS) + { + continue; + } + RtlZeroMemory(Srb, sizeof(SCSI_REQUEST_BLOCK)); + Srb->SrbFlags = SRB_FLAGS_DATA_IN; + Srb->DataBuffer = ScanData->DataBuffer; + Srb->Function = SRB_FUNCTION_EXECUTE_SCSI; + Srb->DataTransferLength = 255; //256; + Srb->CdbLength = 6; + Srb->Lun = ScanData->Lun; + Srb->PathId = ScanData->Bus; + Srb->TargetId = ScanData->Target; + Srb->SrbStatus = SRB_STATUS_SUCCESS; + Cdb = (PCDB) &Srb->Cdb; + Cdb->CDB6INQUIRY.OperationCode = SCSIOP_INQUIRY; + Cdb->CDB6INQUIRY.AllocationLength = 255; + Cdb->CDB6INQUIRY.LogicalUnitNumber = ScanData->Lun; + + RtlZeroMemory(Srb->DataBuffer, 256); + + ScanData->LunExtension = SpiAllocateLunExtension (DeviceExtension, + ScanData->Bus, + ScanData->Target, + ScanData->Lun); + if (ScanData->LunExtension == NULL) + { + DPRINT1("Failed to allocate the LUN extension!\n"); + ScanData->Lun = SCSI_MAXIMUM_LOGICAL_UNITS; + continue; + } + ScanData->Status = SpiSendInquiry (DeviceExtension->DeviceObject, + Srb, + &ScanData->IoStatusBlock, + &ScanData->Event); + ScanData->Active = TRUE; + ActiveCount++; + if (ScanData->Status == STATUS_PENDING) + { + EventArray[WaitCount] = &ScanData->Event; + WaitCount++; + } + } + if (WaitCount > 0 && WaitCount == ActiveCount) + { + KeWaitForMultipleObjects(WaitCount, + EventArray, + WaitAny, + Executive, + KernelMode, + FALSE, + NULL, + WaitBlockArray); + } + } + while (ActiveCount > 0); + + ExFreePool(ScanDataArray); + DPRINT ("SpiScanAdapter() done\n"); } @@ -2003,30 +2183,16 @@ ScsiPortIsr(IN PKINTERRUPT Interrupt, IN PVOID ServiceContext) { PSCSI_PORT_DEVICE_EXTENSION DeviceExtension; - BOOLEAN Result; DPRINT("ScsiPortIsr() called!\n"); DeviceExtension = (PSCSI_PORT_DEVICE_EXTENSION)ServiceContext; - Result = DeviceExtension->HwInterrupt(&DeviceExtension->MiniPortDeviceExtension); - if (Result == FALSE) - { - return(FALSE); - } - - if (DeviceExtension->IrpFlags) - { - IoRequestDpc(DeviceExtension->DeviceObject, - NULL, - DeviceExtension); - } - - return(TRUE); + return DeviceExtension->HwInterrupt(&DeviceExtension->MiniPortDeviceExtension); } -// ScsiPortDpcForIsr +// ScsiPortDpc // DESCRIPTION: // // RUN LEVEL: @@ -2038,21 +2204,21 @@ ScsiPortIsr(IN PKINTERRUPT Interrupt, // IN PVOID DpcContext // static VOID STDCALL -ScsiPortDpcForIsr(IN PKDPC Dpc, - IN PDEVICE_OBJECT DpcDeviceObject, - IN PIRP DpcIrp, - IN PVOID DpcContext) +ScsiPortDpc(IN PKDPC Dpc, + IN PDEVICE_OBJECT DpcDeviceObject, + IN PIRP DpcIrp, + IN PVOID DpcContext) { PSCSI_PORT_DEVICE_EXTENSION DeviceExtension; - DPRINT("ScsiPortDpcForIsr(Dpc %p DpcDeviceObject %p DpcIrp %p DpcContext %p)\n", + DPRINT("ScsiPortDpc(Dpc %p DpcDeviceObject %p DpcIrp %p DpcContext %p)\n", Dpc, DpcDeviceObject, DpcIrp, DpcContext); DeviceExtension = (PSCSI_PORT_DEVICE_EXTENSION)DpcContext; SpiProcessRequests(DeviceExtension, NULL); - DPRINT("ScsiPortDpcForIsr() done\n"); + DPRINT("ScsiPortDpc() done\n"); } @@ -2541,6 +2707,61 @@ ByeBye: return Status; } +static VOID +SpiRemoveActiveIrp(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, + PIRP Irp, + PIRP PrevIrp) +{ + PSCSI_PORT_LUN_EXTENSION LunExtension; + PIRP CurrentIrp; + LunExtension = Irp->Tail.Overlay.DriverContext[2]; + LunExtension->ActiveIrpCount--; + DeviceExtension->ActiveIrpCount--; + if (PrevIrp) + { + InterlockedExchangePointer(&PrevIrp->Tail.Overlay.DriverContext[0], + Irp->Tail.Overlay.DriverContext[0]); + } + else + { + InterlockedExchangePointer(&DeviceExtension->NextIrp, + Irp->Tail.Overlay.DriverContext[0]); + } + if (LunExtension->NextIrp == Irp) + { + InterlockedExchangePointer(&LunExtension->NextIrp, + Irp->Tail.Overlay.DriverContext[1]); + return; + } + else + { + CurrentIrp = LunExtension->NextIrp; + while (CurrentIrp) + { + if (CurrentIrp->Tail.Overlay.DriverContext[1] == Irp) + { + InterlockedExchangePointer(&CurrentIrp->Tail.Overlay.DriverContext[1], + Irp->Tail.Overlay.DriverContext[1]); + return; + } + CurrentIrp = CurrentIrp->Tail.Overlay.DriverContext[1]; + } + KEBUGCHECK(0); + } +} + +static VOID +SpiAddActiveIrp(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, + PIRP Irp) +{ + PSCSI_PORT_LUN_EXTENSION LunExtension; + LunExtension = Irp->Tail.Overlay.DriverContext[2]; + Irp->Tail.Overlay.DriverContext[0] = (PVOID)DeviceExtension->NextIrp; + InterlockedExchangePointer(&DeviceExtension->NextIrp, Irp); + Irp->Tail.Overlay.DriverContext[1] = (PVOID)LunExtension->NextIrp; + InterlockedExchangePointer(&LunExtension->NextIrp, Irp); +} + static VOID SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, IN PIRP NextIrp) @@ -2562,7 +2783,8 @@ SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, * * Irp is within the active irp list or while other processing: * Srb->OriginalRequest -> Irp - * Irp->Tail.Overlay.DriverContext[0] and DriverContext[1] -> ListEntry for queue + * Irp->Tail.Overlay.DriverContext[0] -> next irp, DeviceExtension->NextIrp is head. + * Irp->Tail.Overlay.DriverContext[1] -> next irp, LunExtension->NextIrp is head. * Irp->Tail.Overlay.DriverContext[2] -> LunExtension * Irp->Tail.Overlay.DriverContext[3] -> current Srb (original or sense request) * IoStack->Parameters.Scsi.Srb -> original Srb @@ -2576,13 +2798,14 @@ SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, LIST_ENTRY CompleteIrpListHead; PSCSI_REQUEST_BLOCK Srb; PSCSI_REQUEST_BLOCK OriginalSrb; + PIRP PrevIrp; DPRINT("SpiProcessRequests() called\n"); InitializeListHead(&NextIrpListHead); InitializeListHead(&CompleteIrpListHead); - KeAcquireSpinLock(&DeviceExtension->IrpLock, &oldIrql); + KeAcquireSpinLock(&DeviceExtension->Lock, &oldIrql); if (NextIrp) { @@ -2604,23 +2827,29 @@ SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, while (DeviceExtension->CompleteRequestCount || ((DeviceExtension->SrbExtensionSize == 0 || DeviceExtension->ActiveIrpCount < MAX_SRB_EXTENSIONS) && !IsListEmpty(&DeviceExtension->PendingIrpListHead) && - (DeviceExtension->NextRequestCount || DeviceExtension->NextLuRequestCount || IsListEmpty(&DeviceExtension->ActiveIrpListHead)))) + (DeviceExtension->NextRequestCount || DeviceExtension->NextLuRequestCount || DeviceExtension->NextIrp == NULL))) { - DPRINT("CompleteRequestCount %d, NextRequestCount %d, NextLuRequestCount %d, PendingIrpList is %s, ActiveIrpList is %s\n", - DeviceExtension->CompleteRequestCount, - DeviceExtension->NextRequestCount, - DeviceExtension->NextLuRequestCount, - IsListEmpty(&DeviceExtension->PendingIrpListHead) ? "EMPTY" : "NOT empty", - IsListEmpty(&DeviceExtension->ActiveIrpListHead) ? "EMPTY" : "NOT empty"); + DPRINT ("CompleteRequestCount %d, NextRequestCount %d, NextLuRequestCount %d, PendingIrpList is %s, ActiveIrpList is %s\n", + DeviceExtension->CompleteRequestCount, + DeviceExtension->NextRequestCount, + DeviceExtension->NextLuRequestCount, + IsListEmpty(&DeviceExtension->PendingIrpListHead) ? "EMPTY" : "NOT empty", + DeviceExtension->NextIrp == NULL ? "EMPTY" : "NOT empty"); + + if (DeviceExtension->ActiveIrpCount == 0 && DeviceExtension->CompleteRequestCount > 0) + { + DeviceExtension->CompleteRequestCount = 0; + continue; + } if (DeviceExtension->CompleteRequestCount > 0) { - DeviceExtension->IrpFlags &= ~IRP_FLAG_COMPLETE; - ListEntry = DeviceExtension->ActiveIrpListHead.Flink; - while (ListEntry != &DeviceExtension->ActiveIrpListHead) + DeviceExtension->Flags &= ~IRP_FLAG_COMPLETE; + PrevIrp = NULL; + Irp = DeviceExtension->NextIrp; + while (Irp) { - Irp = CONTAINING_RECORD(ListEntry, IRP, Tail.Overlay.DriverContext[0]); - ListEntry = ListEntry->Flink; + NextIrp = (PIRP)Irp->Tail.Overlay.DriverContext[0]; Srb = Irp->Tail.Overlay.DriverContext[3]; if (!(Srb->SrbFlags & SRB_FLAGS_IS_ACTIVE)) { @@ -2630,6 +2859,17 @@ SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, IrpStack = IoGetCurrentIrpStackLocation(Irp); OriginalSrb = IrpStack->Parameters.Scsi.Srb; + if (Srb->SrbStatus == SRB_STATUS_BUSY) + { + SpiRemoveActiveIrp(DeviceExtension, Irp, PrevIrp); + SpiFreeSrbExtension(DeviceExtension, OriginalSrb); + InsertHeadList(&DeviceExtension->PendingIrpListHead, (PLIST_ENTRY)&Irp->Tail.Overlay.DriverContext[0]); + DeviceExtension->PendingIrpCount++; + LunExtension->PendingIrpCount++; + Irp = NextIrp; + continue; + } + if (OriginalSrb != Srb) { SENSE_DATA* SenseInfoBuffer; @@ -2665,10 +2905,8 @@ SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, { CompleteThisRequest = FALSE; Irp->Tail.Overlay.DriverContext[3] = Srb; - RemoveEntryList((PLIST_ENTRY)&Irp->Tail.Overlay.DriverContext[0]); + SpiRemoveActiveIrp(DeviceExtension, Irp, PrevIrp); SpiFreeSrbExtension(DeviceExtension, Srb); - LunExtension->ActiveIrpCount--; - DeviceExtension->ActiveIrpCount--; Srb->OriginalRequest = LunExtension; Irp->Tail.Overlay.DriverContext[2] = 0; @@ -2676,6 +2914,8 @@ SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, InsertHeadList(&DeviceExtension->PendingIrpListHead, (PLIST_ENTRY)&Irp->Tail.Overlay.DriverContext[0]); DeviceExtension->PendingIrpCount++; LunExtension->PendingIrpCount++; + Irp = NextIrp; + continue; } else { @@ -2689,20 +2929,38 @@ SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, } if (CompleteThisRequest) { - RemoveEntryList((PLIST_ENTRY)&Irp->Tail.Overlay.DriverContext[0]); + SpiRemoveActiveIrp(DeviceExtension, Irp, PrevIrp); InsertHeadList(&CompleteIrpListHead, (PLIST_ENTRY)&Irp->Tail.Overlay.DriverContext[0]); SpiFreeSrbExtension(DeviceExtension, OriginalSrb); - LunExtension->ActiveIrpCount--; - DeviceExtension->ActiveIrpCount--; } + else + { + PrevIrp = Irp; + } + Irp = NextIrp; + continue; } + PrevIrp = Irp; + Irp = NextIrp; } } + if (!IsListEmpty(&CompleteIrpListHead)) + { + KeReleaseSpinLockFromDpcLevel(&DeviceExtension->Lock); + while (!IsListEmpty(&CompleteIrpListHead)) + { + ListEntry = RemoveTailList(&CompleteIrpListHead); + Irp = CONTAINING_RECORD(ListEntry, IRP, Tail.Overlay.DriverContext[0]); + Srb = Irp->Tail.Overlay.DriverContext[3]; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + } + KeAcquireSpinLockAtDpcLevel(&DeviceExtension->Lock); + } if (DeviceExtension->NextLuRequestCount || DeviceExtension->NextRequestCount) { BOOLEAN StartThisRequest; - DeviceExtension->IrpFlags &= ~(IRP_FLAG_NEXT|IRP_FLAG_NEXT_LU); + DeviceExtension->Flags &= ~(IRP_FLAG_NEXT|IRP_FLAG_NEXT_LU); ListEntry = DeviceExtension->PendingIrpListHead.Flink; while (ListEntry != &DeviceExtension->PendingIrpListHead) { @@ -2754,54 +3012,40 @@ SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, { ListEntry = RemoveTailList(&NextIrpListHead); Irp = CONTAINING_RECORD(ListEntry, IRP, Tail.Overlay.DriverContext[0]); - InsertHeadList(&DeviceExtension->ActiveIrpListHead, (PLIST_ENTRY)&Irp->Tail.Overlay.DriverContext[0]); - KeReleaseSpinLockFromDpcLevel(&DeviceExtension->IrpLock); + SpiAddActiveIrp(DeviceExtension, Irp); + KeReleaseSpinLockFromDpcLevel(&DeviceExtension->Lock); // Start this Irp SpiStartIo(DeviceExtension, Irp); - KeAcquireSpinLockAtDpcLevel(&DeviceExtension->IrpLock); + KeAcquireSpinLockAtDpcLevel(&DeviceExtension->Lock); } } if (!IsListEmpty(&DeviceExtension->PendingIrpListHead) && - IsListEmpty(&DeviceExtension->ActiveIrpListHead) && - (DeviceExtension->SrbExtensionSize == 0 || DeviceExtension->ActiveIrpCount < MAX_SRB_EXTENSIONS)) + DeviceExtension->NextIrp == NULL && + (DeviceExtension->SrbExtensionSize == 0 || DeviceExtension->ActiveIrpCount < MAX_SRB_EXTENSIONS)) { ListEntry = RemoveHeadList(&DeviceExtension->PendingIrpListHead); Irp = CONTAINING_RECORD(ListEntry, IRP, Tail.Overlay.DriverContext[0]); Srb = Irp->Tail.Overlay.DriverContext[3]; LunExtension = Srb->OriginalRequest; - - LunExtension->PendingIrpCount--; - DeviceExtension->PendingIrpCount--; - InsertHeadList(&DeviceExtension->ActiveIrpListHead, (PLIST_ENTRY)&Irp->Tail.Overlay.DriverContext[0]); - LunExtension->ActiveIrpCount++; - DeviceExtension->ActiveIrpCount++; - SpiAllocateSrbExtension(DeviceExtension, Srb); - Irp->Tail.Overlay.DriverContext[2] = LunExtension; Srb->OriginalRequest = Irp; - KeReleaseSpinLockFromDpcLevel(&DeviceExtension->IrpLock); + LunExtension->PendingIrpCount--; + DeviceExtension->PendingIrpCount--; + SpiAddActiveIrp(DeviceExtension, Irp); + LunExtension->ActiveIrpCount++; + DeviceExtension->ActiveIrpCount++; + SpiAllocateSrbExtension(DeviceExtension, Srb); + KeReleaseSpinLockFromDpcLevel(&DeviceExtension->Lock); - // Start this irp + /* Start this irp */ SpiStartIo(DeviceExtension, Irp); - KeAcquireSpinLockAtDpcLevel(&DeviceExtension->IrpLock); - } - - if (!IsListEmpty(&CompleteIrpListHead)) - { - KeReleaseSpinLockFromDpcLevel(&DeviceExtension->IrpLock); - while (!IsListEmpty(&CompleteIrpListHead)) - { - ListEntry = RemoveTailList(&CompleteIrpListHead); - Irp = CONTAINING_RECORD(ListEntry, IRP, Tail.Overlay.DriverContext[0]); - IoCompleteRequest(Irp, IO_NO_INCREMENT); - } - KeAcquireSpinLockAtDpcLevel(&DeviceExtension->IrpLock); - } + KeAcquireSpinLockAtDpcLevel(&DeviceExtension->Lock); + } } - KeReleaseSpinLock(&DeviceExtension->IrpLock, oldIrql); + KeReleaseSpinLock(&DeviceExtension->Lock, oldIrql); DPRINT("SpiProcessRequests() done\n"); } @@ -2812,7 +3056,6 @@ SpiStartIo(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, { PSCSI_PORT_LUN_EXTENSION LunExtension; PSCSI_REQUEST_BLOCK Srb; - PIO_STACK_LOCATION IrpStack; DPRINT("SpiStartIo() called!\n"); @@ -2830,27 +3073,10 @@ SpiStartIo(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, Srb)) { DPRINT1("Synchronization failed!\n"); - - Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; - Irp->IoStatus.Information = 0; - - KeAcquireSpinLockAtDpcLevel(&DeviceExtension->IrpLock); - - RemoveEntryList((PLIST_ENTRY)Irp->Tail.Overlay.DriverContext[0]); - LunExtension = Irp->Tail.Overlay.DriverContext[2]; - LunExtension->ActiveIrpCount--; - SpiFreeSrbExtension(DeviceExtension, Srb); - IrpStack = IoGetCurrentIrpStackLocation(Irp); - if (IrpStack->Parameters.Scsi.Srb != Srb) - { - ExFreePool(Srb); - } - DeviceExtension->ActiveIrpCount--; - - KeReleaseSpinLockFromDpcLevel(&DeviceExtension->IrpLock); - - IoCompleteRequest(Irp, IO_NO_INCREMENT); - + DPRINT1("Irp %x, Srb->Function %02x, Srb->Cdb[0] %02x, Srb->SrbStatus %02x\n", Irp, Srb->Function, Srb->Cdb[0], Srb->SrbStatus); + ScsiPortNotification(RequestComplete, + &DeviceExtension->MiniPortDeviceExtension, + Srb); } DPRINT("SpiStartIo() done\n"); diff --git a/reactos/drivers/storage/scsiport/scsiport.rc b/reactos/drivers/storage/scsiport/scsiport.rc index a4939b8b06e..b6e98c6e7f2 100644 --- a/reactos/drivers/storage/scsiport/scsiport.rc +++ b/reactos/drivers/storage/scsiport/scsiport.rc @@ -1,5 +1,6 @@ #include <defines.h> #include <reactos/resource.h> +#include "scsiport_int.h" LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US @@ -22,7 +23,7 @@ BEGIN BEGIN VALUE "CompanyName", RES_STR_COMPANY_NAME VALUE "FileDescription", "SCSI Port Driver\0" - VALUE "FileVersion", "0.0.0\0" + VALUE "FileVersion", VERSION VALUE "InternalName", "scsiport\0" VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT VALUE "OriginalFilename", "scsiport.sys\0" diff --git a/reactos/drivers/storage/scsiport/scsiport_int.h b/reactos/drivers/storage/scsiport/scsiport_int.h index a81275d5470..4008f2ceb93 100644 --- a/reactos/drivers/storage/scsiport/scsiport_int.h +++ b/reactos/drivers/storage/scsiport/scsiport_int.h @@ -4,6 +4,9 @@ * DESCRIPTION * An enumeration containing the states in the timer DFA */ + +#define VERSION "0.0.2" + typedef enum _SCSI_PORT_TIMER_STATES { IDETimerIdle, @@ -41,6 +44,8 @@ typedef struct _SCSI_PORT_LUN_EXTENSION ULONG ActiveIrpCount; ULONG NextLuRequestCount; + PIRP NextIrp; + /* More data? */ UCHAR MiniportLunExtension[1]; /* must be the last entry */ @@ -62,10 +67,10 @@ typedef struct _SCSI_PORT_DEVICE_EXTENSION PPORT_CONFIGURATION_INFORMATION PortConfig; ULONG PortNumber; - KSPIN_LOCK IrpLock; - KSPIN_LOCK SpinLock; + KSPIN_LOCK Lock; + ULONG Flags; + PKINTERRUPT Interrupt; - ULONG IrpFlags; SCSI_PORT_TIMER_STATES TimerState; LONG TimerCount; @@ -96,7 +101,7 @@ typedef struct _SCSI_PORT_DEVICE_EXTENSION ULONG CommonBufferLength; LIST_ENTRY PendingIrpListHead; - LIST_ENTRY ActiveIrpListHead; + PIRP NextIrp; ULONG PendingIrpCount; ULONG ActiveIrpCount; @@ -107,5 +112,18 @@ typedef struct _SCSI_PORT_DEVICE_EXTENSION UCHAR MiniPortDeviceExtension[1]; /* must be the last entry */ } SCSI_PORT_DEVICE_EXTENSION, *PSCSI_PORT_DEVICE_EXTENSION; +typedef struct _SCSI_PORT_SCAN_ADAPTER +{ + KEVENT Event; + IO_STATUS_BLOCK IoStatusBlock; + NTSTATUS Status; + PSCSI_PORT_LUN_EXTENSION LunExtension; + ULONG Lun; + ULONG Bus; + ULONG Target; + SCSI_REQUEST_BLOCK Srb; + UCHAR DataBuffer[256]; + BOOL Active; +} SCSI_PORT_SCAN_ADAPTER, *PSCSI_PORT_SCAN_ADAPTER; From 4400aed36382d5350003df6a19e78f818c7ad112 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Mon, 7 Jun 2004 17:31:50 +0000 Subject: [PATCH 1355/1463] - Include bootdata/hiveinst.inf when building the Live CD registry hives. svn path=/trunk/; revision=9642 --- reactos/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/Makefile b/reactos/Makefile index 27e64d540a2..2caae3d00b9 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.229 2004/06/07 12:24:00 ekohl Exp $ +# $Id: Makefile,v 1.230 2004/06/07 17:31:50 navaraf Exp $ # # Global makefile # @@ -214,7 +214,7 @@ livecd_bootstrap_files: $(MAKE) LIVECD_INSTALL=yes fastinstall livecd_install_before: - $(TOOLS_PATH)/mkhive/mkhive$(EXE_POSTFIX) bootdata $(LIVECD_DIR)/reactos/system32/config bootdata/livecd.inf + $(TOOLS_PATH)/mkhive/mkhive$(EXE_POSTFIX) bootdata $(LIVECD_DIR)/reactos/system32/config bootdata/livecd.inf bootdata/hiveinst.inf livecd_basic: livecd_directory_layout livecd_bootstrap_files livecd_install_before From ba3d08e286771ef941e259b201658949da355604 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Mon, 7 Jun 2004 18:03:12 +0000 Subject: [PATCH 1356/1463] - Fixed redefinition of VERSION. svn path=/trunk/; revision=9643 --- reactos/drivers/storage/diskdump/diskdump.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/drivers/storage/diskdump/diskdump.c b/reactos/drivers/storage/diskdump/diskdump.c index 311b41f06ec..90651ee14ac 100644 --- a/reactos/drivers/storage/diskdump/diskdump.c +++ b/reactos/drivers/storage/diskdump/diskdump.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: diskdump.c,v 1.3 2003/11/13 15:24:14 ekohl Exp $ +/* $Id: diskdump.c,v 1.4 2004/06/07 18:03:12 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -37,6 +37,8 @@ #define NDEBUG #include <debug.h> +/* It's already defined in scsiport_int.h */ +#undef VERSION #define VERSION "0.0.1" /* PROTOTYPES ***************************************************************/ From a51ef0df37fa6aa106b145b417a55321876bfc85 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Mon, 7 Jun 2004 20:03:00 +0000 Subject: [PATCH 1357/1463] - Fixed the counting of pending irps. svn path=/trunk/; revision=9644 --- reactos/drivers/storage/scsiport/scsiport.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/reactos/drivers/storage/scsiport/scsiport.c b/reactos/drivers/storage/scsiport/scsiport.c index 65a245419c2..bf3c77ac2a1 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.58 2004/06/07 16:37:07 hbirr Exp $ +/* $Id: scsiport.c,v 1.59 2004/06/07 20:03:00 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -2811,6 +2811,7 @@ SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, { Srb = NextIrp->Tail.Overlay.DriverContext[3]; NextIrp->Tail.Overlay.DriverContext[2] = (PVOID)Srb->QueueSortKey; + LunExtension = Srb->OriginalRequest; ListEntry = DeviceExtension->PendingIrpListHead.Flink; while (ListEntry != DeviceExtension->PendingIrpListHead.Flink) @@ -2823,6 +2824,8 @@ SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, ListEntry = ListEntry->Flink; } InsertTailList(ListEntry, (PLIST_ENTRY)&NextIrp->Tail.Overlay.DriverContext[0]); + DeviceExtension->PendingIrpCount++; + LunExtension->PendingIrpCount++; } while (DeviceExtension->CompleteRequestCount || From 869566fc97508695848d5309f16e98ff5a34ee88 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Tue, 8 Jun 2004 19:31:10 +0000 Subject: [PATCH 1358/1463] - Correctly set Irp->IoStatus.Information when handling IOCTL_BOOTVID_INITIALIZE request. This fixes the occasional page faults during bugchecks when NTOSKRNL:InbvResetDisplay tried to call function pointed by uninitialized variable. svn path=/trunk/; revision=9645 --- reactos/drivers/dd/bootvid/bootvid.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/drivers/dd/bootvid/bootvid.c b/reactos/drivers/dd/bootvid/bootvid.c index fe66b5e6827..16bbd0488e0 100644 --- a/reactos/drivers/dd/bootvid/bootvid.c +++ b/reactos/drivers/dd/bootvid/bootvid.c @@ -18,7 +18,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: bootvid.c,v 1.11 2004/05/22 12:23:12 navaraf Exp $ + * $Id: bootvid.c,v 1.12 2004/06/08 19:31:10 navaraf Exp $ */ /* INCLUDES ******************************************************************/ @@ -605,6 +605,7 @@ VidDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) FunctionTable = (NTBOOTVID_FUNCTION_TABLE *) Irp->AssociatedIrp.SystemBuffer; FunctionTable->ResetDisplay = VidResetDisplay; + Irp->IoStatus.Information = sizeof(NTBOOTVID_FUNCTION_TABLE); break; case IOCTL_BOOTVID_CLEANUP: From 25e4bf3404d032b37170317695f303205d810d17 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Wed, 9 Jun 2004 14:22:53 +0000 Subject: [PATCH 1359/1463] Build Hardware IDs and Compatible IDs for PCI devices. svn path=/trunk/; revision=9646 --- reactos/drivers/bus/pci/fdo.c | 68 +++++++----- reactos/drivers/bus/pci/pci.c | 198 +++++++++++++++++++++++++++++++++- reactos/drivers/bus/pci/pci.h | 28 ++++- reactos/drivers/bus/pci/pdo.c | 25 +++-- 4 files changed, 284 insertions(+), 35 deletions(-) diff --git a/reactos/drivers/bus/pci/fdo.c b/reactos/drivers/bus/pci/fdo.c index 790827a8476..29eba5ff51d 100644 --- a/reactos/drivers/bus/pci/fdo.c +++ b/reactos/drivers/bus/pci/fdo.c @@ -1,4 +1,4 @@ -/* $Id: fdo.c,v 1.7 2004/03/14 17:10:43 navaraf Exp $ +/* $Id: fdo.c,v 1.8 2004/06/09 14:22:53 ekohl Exp $ * * PROJECT: ReactOS PCI bus driver * FILE: fdo.c @@ -128,18 +128,18 @@ FdoEnumerateDevices( return STATUS_INSUFFICIENT_RESOURCES; } - RtlZeroMemory (Device, - sizeof(PCI_DEVICE)); + RtlZeroMemory(Device, + sizeof(PCI_DEVICE)); - Device->BusNumber = BusNumber; + Device->BusNumber = BusNumber; - RtlCopyMemory (&Device->SlotNumber, - &SlotNumber, - sizeof(PCI_SLOT_NUMBER)); + RtlCopyMemory(&Device->SlotNumber, + &SlotNumber, + sizeof(PCI_SLOT_NUMBER)); - RtlCopyMemory (&Device->PciConfig, - &PciConfig, - sizeof(PCI_COMMON_CONFIG)); + RtlCopyMemory(&Device->PciConfig, + &PciConfig, + sizeof(PCI_COMMON_CONFIG)); ExInterlockedInsertTailList( &DeviceExtension->DeviceListHead, @@ -175,7 +175,6 @@ FdoQueryBusRelations( NTSTATUS Status; BOOLEAN ErrorOccurred; NTSTATUS ErrorStatus; - WCHAR Buffer[MAX_PATH]; ULONG Size; ULONG i; @@ -254,26 +253,43 @@ FdoQueryBusRelations( &Device->SlotNumber, sizeof(PCI_SLOT_NUMBER)); - /* FIXME: Get device properties (Hardware IDs, etc.) */ - - swprintf( - Buffer, - L"PCI\\VEN_%04X&DEV_%04X&SUBSYS_%08X&REV_%02X", - Device->PciConfig.VendorID, - Device->PciConfig.DeviceID, - (Device->PciConfig.u.type0.SubSystemID << 16) + - Device->PciConfig.u.type0.SubVendorID, - Device->PciConfig.RevisionID); - - if (!PciCreateUnicodeString( - &PdoDeviceExtension->DeviceID, - Buffer, - PagedPool)) { + /* Add Device ID string */ + if (!PciCreateDeviceIDString(&PdoDeviceExtension->DeviceID, + Device)) + { + ErrorStatus = STATUS_INSUFFICIENT_RESOURCES; ErrorOccurred = TRUE; break; } DPRINT("DeviceID: %S\n", PdoDeviceExtension->DeviceID.Buffer); + + /* Add Instance ID string */ + if (!PciCreateInstanceIDString(&PdoDeviceExtension->InstanceID, + Device)) + { + ErrorStatus = STATUS_INSUFFICIENT_RESOURCES; + ErrorOccurred = TRUE; + break; + } + + /* Add Hardware IDs string */ + if (!PciCreateHardwareIDsString(&PdoDeviceExtension->HardwareIDs, + Device)) + { + ErrorStatus = STATUS_INSUFFICIENT_RESOURCES; + ErrorOccurred = TRUE; + break; + } + + /* Add Compatible IDs string */ + if (!PciCreateCompatibleIDsString(&PdoDeviceExtension->CompatibleIDs, + Device)) + { + ErrorStatus = STATUS_INSUFFICIENT_RESOURCES; + ErrorOccurred = TRUE; + break; + } } if (!Device->RemovePending) { diff --git a/reactos/drivers/bus/pci/pci.c b/reactos/drivers/bus/pci/pci.c index a5ee0be59e7..ce7a1b37e2b 100644 --- a/reactos/drivers/bus/pci/pci.c +++ b/reactos/drivers/bus/pci/pci.c @@ -1,4 +1,4 @@ -/* $Id: pci.c,v 1.6 2004/02/10 16:22:55 navaraf Exp $ +/* $Id: pci.c,v 1.7 2004/06/09 14:22:53 ekohl Exp $ * * PROJECT: ReactOS PCI Bus driver * FILE: pci.c @@ -185,7 +185,7 @@ DriverEntry( BOOLEAN PciCreateUnicodeString( - PUNICODE_STRING Destination, + PUNICODE_STRING Destination, PWSTR Source, POOL_TYPE PoolType) { @@ -215,4 +215,198 @@ PciCreateUnicodeString( return TRUE; } + +NTSTATUS +PciDuplicateUnicodeString( + PUNICODE_STRING Destination, + PUNICODE_STRING Source, + POOL_TYPE PoolType) +{ + if (Source == NULL) + { + RtlInitUnicodeString(Destination, NULL); + return STATUS_SUCCESS; + } + + Destination->Buffer = ExAllocatePool(PoolType, Source->MaximumLength); + if (Destination->Buffer == NULL) + { + return STATUS_INSUFFICIENT_RESOURCES; + } + + Destination->MaximumLength = Source->MaximumLength; + Destination->Length = Source->Length; + RtlCopyMemory(Destination->Buffer, Source->Buffer, Source->MaximumLength); + + return STATUS_SUCCESS; +} + + +BOOLEAN +PciCreateDeviceIDString(PUNICODE_STRING DeviceID, + PPCI_DEVICE Device) +{ + WCHAR Buffer[256]; + + swprintf(Buffer, + L"PCI\\VEN_%04X&DEV_%04X&SUBSYS_%08X&REV_%02X", + Device->PciConfig.VendorID, + Device->PciConfig.DeviceID, + (Device->PciConfig.u.type0.SubSystemID << 16) + + Device->PciConfig.u.type0.SubVendorID, + Device->PciConfig.RevisionID); + + if (!PciCreateUnicodeString(DeviceID, Buffer, PagedPool)) + { + return FALSE; + } + + return TRUE; +} + + +BOOLEAN +PciCreateInstanceIDString(PUNICODE_STRING DeviceID, + PPCI_DEVICE Device) +{ + /* FIXME */ + +#if 0 + swprintf(Buffer, + L"%02lx&%04lx", + Device->BusNumber, + Device->SlotNumber.SlotNumber.u.AsULONG); +#endif + + return PciCreateUnicodeString(DeviceID, L"0000", PagedPool); +} + + +BOOLEAN +PciCreateHardwareIDsString(PUNICODE_STRING HardwareIDs, + PPCI_DEVICE Device) +{ + WCHAR Buffer[256]; + ULONG Length; + ULONG Index; + + Index = 0; + Index += swprintf(&Buffer[Index], + L"PCI\\VEN_%04X&DEV_%04X&SUBSYS_%08X&REV_%02X", + Device->PciConfig.VendorID, + Device->PciConfig.DeviceID, + (Device->PciConfig.u.type0.SubSystemID << 16) + + Device->PciConfig.u.type0.SubVendorID, + Device->PciConfig.RevisionID); + Index++; + + Index += swprintf(&Buffer[Index], + L"PCI\\VEN_%04X&DEV_%04X&SUBSYS_%08X", + Device->PciConfig.VendorID, + Device->PciConfig.DeviceID, + (Device->PciConfig.u.type0.SubSystemID << 16) + + Device->PciConfig.u.type0.SubVendorID); + Index++; + + Buffer[Index] = UNICODE_NULL; + + Length = (Index + 1) * sizeof(WCHAR); + HardwareIDs->Buffer = ExAllocatePool(PagedPool, Length); + if (Buffer == NULL) + { + return FALSE; + } + + HardwareIDs->Length = Length - sizeof(WCHAR); + HardwareIDs->MaximumLength = Length; + RtlCopyMemory(HardwareIDs->Buffer, Buffer, Length); + + return TRUE; +} + + +BOOLEAN +PciCreateCompatibleIDsString(PUNICODE_STRING HardwareIDs, + PPCI_DEVICE Device) +{ + WCHAR Buffer[256]; + ULONG Length; + ULONG Index; + + Index = 0; + Index += swprintf(&Buffer[Index], + L"PCI\\VEN_%04X&DEV_%04X&REV_%02X&CC_%02X%02X", + Device->PciConfig.VendorID, + Device->PciConfig.DeviceID, + Device->PciConfig.RevisionID, + Device->PciConfig.BaseClass, + Device->PciConfig.SubClass); + Index++; + + Index += swprintf(&Buffer[Index], + L"PCI\\VEN_%04X&DEV_%04X&CC_%02X%02X%02X", + Device->PciConfig.VendorID, + Device->PciConfig.DeviceID, + Device->PciConfig.BaseClass, + Device->PciConfig.SubClass, + Device->PciConfig.ProgIf); + Index++; + + Index += swprintf(&Buffer[Index], + L"PCI\\VEN_%04X&DEV_%04X&CC_%02X%02X", + Device->PciConfig.VendorID, + Device->PciConfig.DeviceID, + Device->PciConfig.BaseClass, + Device->PciConfig.SubClass); + Index++; + + Index += swprintf(&Buffer[Index], + L"PCI\\VEN_%04X&CC_%02X%02X%02X", + Device->PciConfig.VendorID, + Device->PciConfig.BaseClass, + Device->PciConfig.SubClass, + Device->PciConfig.ProgIf); + Index++; + + Index += swprintf(&Buffer[Index], + L"PCI\\VEN_%04X&CC_%02X%02X", + Device->PciConfig.VendorID, + Device->PciConfig.BaseClass, + Device->PciConfig.SubClass); + Index++; + + Index += swprintf(&Buffer[Index], + L"PCI\\VEN_%04X", + Device->PciConfig.VendorID); + Index++; + + Index += swprintf(&Buffer[Index], + L"PCI\\CC_%02X%02X%02X", + Device->PciConfig.BaseClass, + Device->PciConfig.SubClass, + Device->PciConfig.ProgIf); + Index++; + + Index += swprintf(&Buffer[Index], + L"PCI\\CC_%02X%02X", + Device->PciConfig.BaseClass, + Device->PciConfig.SubClass); + Index++; + + Buffer[Index] = UNICODE_NULL; + + Length = (Index + 1) * sizeof(WCHAR); + HardwareIDs->Buffer = ExAllocatePool(PagedPool, Length); + if (Buffer == NULL) + { + return FALSE; + } + + HardwareIDs->Length = Length - sizeof(WCHAR); + HardwareIDs->MaximumLength = Length; + RtlCopyMemory(HardwareIDs->Buffer, Buffer, Length); + + return TRUE; +} + /* EOF */ diff --git a/reactos/drivers/bus/pci/pci.h b/reactos/drivers/bus/pci/pci.h index 8a511e3bf5c..37f187aaea4 100644 --- a/reactos/drivers/bus/pci/pci.h +++ b/reactos/drivers/bus/pci/pci.h @@ -1,4 +1,4 @@ -/* $Id: pci.h,v 1.6 2004/03/14 17:10:43 navaraf Exp $ */ +/* $Id: pci.h,v 1.7 2004/06/09 14:22:53 ekohl Exp $ */ #ifndef __PCI_H #define __PCI_H @@ -112,6 +112,32 @@ PciCreateUnicodeString( PWSTR Source, POOL_TYPE PoolType); +NTSTATUS +PciDuplicateUnicodeString( + PUNICODE_STRING Destination, + PUNICODE_STRING Source, + POOL_TYPE PoolType); + +BOOLEAN +PciCreateDeviceIDString( + PUNICODE_STRING DeviceID, + PPCI_DEVICE Device); + +BOOLEAN +PciCreateInstanceIDString( + PUNICODE_STRING InstanceID, + PPCI_DEVICE Device); + +BOOLEAN +PciCreateHardwareIDsString( + PUNICODE_STRING HardwareIDs, + PPCI_DEVICE Device); + +BOOLEAN +PciCreateCompatibleIDsString( + PUNICODE_STRING HardwareIDs, + PPCI_DEVICE Device); + /* pdo.c */ NTSTATUS diff --git a/reactos/drivers/bus/pci/pdo.c b/reactos/drivers/bus/pci/pdo.c index 0af93348692..a1454e3ffb3 100644 --- a/reactos/drivers/bus/pci/pdo.c +++ b/reactos/drivers/bus/pci/pdo.c @@ -1,4 +1,4 @@ -/* $Id: pdo.c,v 1.4 2004/03/14 17:10:43 navaraf Exp $ +/* $Id: pdo.c,v 1.5 2004/06/09 14:22:53 ekohl Exp $ * * PROJECT: ReactOS PCI bus driver * FILE: pdo.c @@ -42,9 +42,9 @@ PdoQueryId( switch (IrpSp->Parameters.QueryId.IdType) { case BusQueryDeviceID: - Status = PciCreateUnicodeString( + Status = PciDuplicateUnicodeString( &String, - DeviceExtension->DeviceID.Buffer, + &DeviceExtension->DeviceID, PagedPool); DPRINT("DeviceID: %S\n", String.Buffer); @@ -53,14 +53,27 @@ PdoQueryId( break; case BusQueryHardwareIDs: + Status = PciDuplicateUnicodeString( + &String, + &DeviceExtension->HardwareIDs, + PagedPool); + + Irp->IoStatus.Information = (ULONG_PTR)String.Buffer; + break; + case BusQueryCompatibleIDs: - Status = STATUS_NOT_IMPLEMENTED; + Status = PciDuplicateUnicodeString( + &String, + &DeviceExtension->CompatibleIDs, + PagedPool); + + Irp->IoStatus.Information = (ULONG_PTR)String.Buffer; break; case BusQueryInstanceID: - Status = PciCreateUnicodeString( + Status = PciDuplicateUnicodeString( &String, - L"0000", + &DeviceExtension->InstanceID, PagedPool); DPRINT("InstanceID: %S\n", String.Buffer); From c1d0686eaa84cccbbf9d415dc5f3b898f74483ae Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Wed, 9 Jun 2004 18:11:39 +0000 Subject: [PATCH 1360/1463] This is a merge onto head of the last two months worth of changes to the networking code. There is individual change info on the branch arty_20040329. Here is a summary of what changed: tcpip: - Added a mostly working transport/tcp branch based on oskittcp (checked in at drivers/lib/oskittcp). This code shares almost nothing with the previous version. - Regularized IRP handling - Fixed ownership of buffers throughout tcpip.sys. Buffers are now required to be copied in a few more cases, but everybody can call anybody else and not have to worry about keeping a buffer alive for any specific reason. - Also moved lots more operations onto the stack (small datastructures and pointers). This will result in a further simplification of the code here. - Made each completion routine solely responsible for freeing memory from the corresponding action. - Removed reference counted small address structures in favor if inlines - Changed and clarified ownership rules almost everwhere - Fixed a few more type punning style errors - Added more info used by iphlpapi - Added some memory tracing stuff ndis: - Fixed one or two type punning errors ws2_32: - Added getservbyname and getprotobyname (partial) oskittcp: - Diagnostics everywhere - Eliminated dependence on raw_ip input - Simplified buffering and signalling model a bit - Added memory checking as in tcpip - more to come svn path=/trunk/; revision=9647 --- .../include/freebsd/src/sys/netinet/in_pcb.h | 3 +- .../include/freebsd/src/sys/sys/mbuf.h | 2 +- .../include/freebsd/src/sys/sys/proc.h | 3 +- .../include/freebsd/src/sys/sys/socketvar.h | 5 +- .../drivers/lib/oskittcp/include/memtrack.h | 5 + .../drivers/lib/oskittcp/include/oskiterrno.h | 2 +- .../drivers/lib/oskittcp/include/oskittcp.h | 51 +- reactos/drivers/lib/oskittcp/oskittcp/in.c | 32 - .../drivers/lib/oskittcp/oskittcp/interface.c | 110 +- .../drivers/lib/oskittcp/oskittcp/ip_output.c | 40 +- .../lib/oskittcp/oskittcp/kern_clock.c | 53 - reactos/drivers/lib/oskittcp/oskittcp/sleep.c | 117 +- .../drivers/lib/oskittcp/oskittcp/tcp_input.c | 118 +- .../lib/oskittcp/oskittcp/tcp_output.c | 55 +- .../drivers/lib/oskittcp/oskittcp/tcp_subr.c | 2 +- .../lib/oskittcp/oskittcp/uipc_socket.c | 376 +- .../lib/oskittcp/oskittcp/uipc_socket2.c | 103 +- reactos/drivers/net/ndis/ndis/buffer.c | 35 +- reactos/drivers/net/ndis/ndis/miniport.c | 19 +- reactos/drivers/net/ndis/ndis/protocol.c | 1 + reactos/drivers/net/tcpip/datalink/arp.c | 31 +- reactos/drivers/net/tcpip/datalink/lan.c | 211 +- reactos/drivers/net/tcpip/datalink/loopback.c | 2 + reactos/drivers/net/tcpip/include/datagram.h | 4 +- reactos/drivers/net/tcpip/include/debug.h | 6 + reactos/drivers/net/tcpip/include/info.h | 63 +- reactos/drivers/net/tcpip/include/interface.h | 16 + reactos/drivers/net/tcpip/include/ip.h | 25 +- reactos/drivers/net/tcpip/include/lan.h | 1 - reactos/drivers/net/tcpip/include/memtrack.h | 74 + reactos/drivers/net/tcpip/include/prefix.h | 28 + reactos/drivers/net/tcpip/include/router.h | 6 +- reactos/drivers/net/tcpip/include/routines.h | 26 +- reactos/drivers/net/tcpip/include/tcp.h | 39 +- reactos/drivers/net/tcpip/include/tcpip.h | 32 +- reactos/drivers/net/tcpip/include/titypes.h | 53 +- reactos/drivers/net/tcpip/makefile | 32 +- reactos/drivers/net/tcpip/network/icmp.c | 24 +- reactos/drivers/net/tcpip/network/ip.c | 181 +- reactos/drivers/net/tcpip/network/neighbor.c | 8 +- reactos/drivers/net/tcpip/network/prefix.c | 139 + reactos/drivers/net/tcpip/network/receive.c | 183 +- reactos/drivers/net/tcpip/network/route.c | 27 +- reactos/drivers/net/tcpip/network/router.c | 94 +- reactos/drivers/net/tcpip/network/transmit.c | 32 +- reactos/drivers/net/tcpip/notes.txt | 8 + reactos/drivers/net/tcpip/tcpip/address.c | 5 +- reactos/drivers/net/tcpip/tcpip/checksum.c | 1 + reactos/drivers/net/tcpip/tcpip/dispatch.c | 182 +- reactos/drivers/net/tcpip/tcpip/fileobjs.c | 66 +- reactos/drivers/net/tcpip/tcpip/iinfo.c | 108 + reactos/drivers/net/tcpip/tcpip/info.c | 611 +-- reactos/drivers/net/tcpip/tcpip/interface.c | 108 + reactos/drivers/net/tcpip/tcpip/irp.c | 30 + reactos/drivers/net/tcpip/tcpip/main.c | 83 +- reactos/drivers/net/tcpip/tcpip/memtrack.c | 146 + reactos/drivers/net/tcpip/tcpip/ninfo.c | 248 + reactos/drivers/net/tcpip/tcpip/pool.c | 1 + reactos/drivers/net/tcpip/tcpip/routines.c | 224 +- reactos/drivers/net/tcpip/tcpip/tinfo.c | 40 + .../net/tcpip/transport/datagram/datagram.c | 214 +- .../drivers/net/tcpip/transport/rawip/rawip.c | 61 +- .../drivers/net/tcpip/transport/tcp/event.c | 323 ++ reactos/drivers/net/tcpip/transport/tcp/if.c | 183 + reactos/drivers/net/tcpip/transport/tcp/tcp.c | 1952 +------- .../net/tcpip/transport/tcp/tcp_input.c | 4184 ----------------- .../net/tcpip/transport/tcp/tcp_ipv4.c | 2523 ---------- .../net/tcpip/transport/tcp/tcp_output.c | 1549 ------ .../net/tcpip/transport/tcp/tcp_timer.c | 702 --- .../drivers/net/tcpip/transport/tcp/tcpcore.c | 2783 ----------- reactos/drivers/net/tcpip/transport/udp/udp.c | 45 +- reactos/lib/msafd/makefile | 2 +- reactos/lib/msafd/misc/dllmain.c | 36 +- reactos/lib/ws2_32/include/ws2_32.h | 10 + reactos/lib/ws2_32/makefile | 2 +- reactos/lib/ws2_32/misc/dllmain.c | 5 +- reactos/lib/ws2_32/misc/ns.c | 208 +- 77 files changed, 3363 insertions(+), 15749 deletions(-) create mode 100644 reactos/drivers/net/tcpip/include/interface.h create mode 100644 reactos/drivers/net/tcpip/include/memtrack.h create mode 100644 reactos/drivers/net/tcpip/include/prefix.h create mode 100644 reactos/drivers/net/tcpip/network/prefix.c create mode 100644 reactos/drivers/net/tcpip/tcpip/iinfo.c create mode 100644 reactos/drivers/net/tcpip/tcpip/interface.c create mode 100644 reactos/drivers/net/tcpip/tcpip/irp.c create mode 100644 reactos/drivers/net/tcpip/tcpip/memtrack.c create mode 100644 reactos/drivers/net/tcpip/tcpip/ninfo.c create mode 100644 reactos/drivers/net/tcpip/tcpip/tinfo.c create mode 100644 reactos/drivers/net/tcpip/transport/tcp/event.c create mode 100644 reactos/drivers/net/tcpip/transport/tcp/if.c delete mode 100755 reactos/drivers/net/tcpip/transport/tcp/tcp_input.c delete mode 100755 reactos/drivers/net/tcpip/transport/tcp/tcp_ipv4.c delete mode 100755 reactos/drivers/net/tcpip/transport/tcp/tcp_output.c delete mode 100755 reactos/drivers/net/tcpip/transport/tcp/tcp_timer.c delete mode 100755 reactos/drivers/net/tcpip/transport/tcp/tcpcore.c diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/in_pcb.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/in_pcb.h index f40058a4f20..0a8b58d182e 100644 --- a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/in_pcb.h +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/netinet/in_pcb.h @@ -97,8 +97,7 @@ struct inpcb * in_pcblookuphash __P((struct inpcbinfo *, struct in_addr, u_int, struct in_addr, u_int)); void in_pcbnotify __P((struct inpcbhead *, struct sockaddr *, - u_int, struct in_addr, u_int, int, void (*)(struct inpcb *, int))); -void in_pcbrehash __P((struct inpcb *)); + u_int, struct in_addr, u_int, int, void (*)(struct inpcb *, int)));void in_pcbrehash __P((struct inpcb *)); void in_rtchange __P((struct inpcb *, int)); void in_setpeeraddr __P((struct inpcb *, struct mbuf *)); void in_setsockaddr __P((struct inpcb *, struct mbuf *)); diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/mbuf.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/mbuf.h index 3583ee7da50..50138e22dca 100644 --- a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/mbuf.h +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/mbuf.h @@ -351,7 +351,7 @@ union mcluster { if ((m)->m_flags & M_EXT) { \ MCLFREE((m)->m_ext.ext_buf); \ } \ - (nn) = (m)->m_next; \ + /* (nn) = (m)->m_next; */ \ FREE((m), mbtypes[(m)->m_type]); \ } #endif /* OSKIT */ diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/proc.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/proc.h index e8634b7550e..03b31b94012 100644 --- a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/proc.h +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/proc.h @@ -62,6 +62,7 @@ #include <sys/rtprio.h> /* For struct rtprio. */ #include <sys/select.h> /* For struct selinfo. */ #include <sys/time.h> /* For structs itimerval, timeval. */ +#include <sys/socketvar.h> #ifdef OSKIT #include <oskit/dev/dev.h> @@ -319,7 +320,7 @@ void cpu_switch __P((struct proc *)); void sleep __P((void *chan, int pri)); int tsleep __P((void *chan, int pri, char *wmesg, int timo)); void unsleep __P((struct proc *)); -void wakeup __P((void *chan)); +void wakeup __P((struct socket *so, struct selinfo *si, void *chan)); __dead void cpu_exit __P((struct proc *)) __dead2; __dead void exit1 __P((struct proc *, int)) __dead2; diff --git a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/socketvar.h b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/socketvar.h index d5b4fb59f90..2c90e24d085 100644 --- a/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/socketvar.h +++ b/reactos/drivers/lib/oskittcp/include/freebsd/src/sys/sys/socketvar.h @@ -181,11 +181,11 @@ struct socket { ((sb)->sb_flags |= SB_LOCK), 0) /* release lock on sockbuf sb */ -#define sbunlock(sb) { \ +#define sbunlock(so, sb) { \ (sb)->sb_flags &= ~SB_LOCK; \ if ((sb)->sb_flags & SB_WANT) { \ (sb)->sb_flags &= ~SB_WANT; \ - wakeup((caddr_t)&(sb)->sb_flags); \ + wakeup(so, &(sb)->sb_sel, (caddr_t)&(sb)->sb_flags); \ } \ } @@ -195,6 +195,7 @@ struct socket { } #define sowwakeup(so) sowakeup((so), &(so)->so_snd) +#define socwakeup(so) sowakeup((so), &(so)->so_snd) #ifdef KERNEL extern u_long sb_max; diff --git a/reactos/drivers/lib/oskittcp/include/memtrack.h b/reactos/drivers/lib/oskittcp/include/memtrack.h index b4c0bbc6b49..e63e327b71b 100644 --- a/reactos/drivers/lib/oskittcp/include/memtrack.h +++ b/reactos/drivers/lib/oskittcp/include/memtrack.h @@ -68,6 +68,11 @@ static inline VOID ExFreePoolX( PVOID Data, PCHAR File, ULONG Line ) { #define Untrack(x) #define TrackTag(x) #define FreeNdisPacket FreeNdisPacketX +#define exFreePool(x) ExFreePool(x) +#define exAllocatePool(x,y) ExAllocatePool(x,y) +#define exAllocatePoolWithTag(x,y,z) ExAllocatePoolWithTag(x,y,z) +#define TrackWithTag(a,b,c,d) +#define UntrackFL(a,b,c) #endif #endif/*MEMMTRAC_H*/ diff --git a/reactos/drivers/lib/oskittcp/include/oskiterrno.h b/reactos/drivers/lib/oskittcp/include/oskiterrno.h index d8d2efa8ed6..acb15f8c563 100644 --- a/reactos/drivers/lib/oskittcp/include/oskiterrno.h +++ b/reactos/drivers/lib/oskittcp/include/oskiterrno.h @@ -51,7 +51,7 @@ extern int errno; /* global error number */ #define OSK_ENOENT 2 /* No such file or directory */ #define OSK_ESRCH 3 /* No such process */ #define OSK_EINTR 4 /* Interrupted system call */ -#define OSK_EIO 5 /* Input/output error */ +#define OSK_EIO 5 /* Input/output error */ #define OSK_ENXIO 6 /* Device not configured */ #define OSK_E2BIG 7 /* Argument list too long */ #define OSK_ENOEXEC 8 /* Exec format error */ diff --git a/reactos/drivers/lib/oskittcp/include/oskittcp.h b/reactos/drivers/lib/oskittcp/include/oskittcp.h index b98b2fe2df7..ee4f7ea151a 100644 --- a/reactos/drivers/lib/oskittcp/include/oskittcp.h +++ b/reactos/drivers/lib/oskittcp/include/oskittcp.h @@ -39,46 +39,34 @@ struct connect_args { #include <oskittypes.h> #define IPHDR_SIZE 20 +#define SEL_CONNECT 1 +#define SEL_FIN 2 +#define SEL_RST 4 +#define SEL_ABRT 8 +#define SEL_READ 16 +#define SEL_WRITE 32 +#define SEL_ACCEPT 64 +#define SEL_OOB 128 +#define SEL_ERROR 256 +#define SEL_FINOUT 512 -typedef void (*OSKITTCP_SOCKET_DATA_AVAILABLE) +typedef void (*OSKITTCP_SOCKET_STATE) ( void *ClientData, void *WhichSocket, void *WhichConnection, - OSK_PCHAR Data, - OSK_UINT Len ); -typedef void (*OSKITTCP_SOCKET_CONNECT_INDICATION) - ( void *ClientData, - void *WhichSocket, - void *WhichConnection ); -typedef void (*OSKITTCP_SOCKET_CLOSE_INDICATION) - ( void *WhichSocket ); -typedef void (*OSKITTCP_SOCKET_PENDING_CONNECT_INDICATION) - ( void *WhichSocket ); -typedef void (*OSKITTCP_SOCKET_RESET_INDICATION) - ( void *WhichSocket ); + OSK_UINT SelFlags, + OSK_UINT SocketState ); typedef int (*OSKITTCP_SEND_PACKET) ( void *ClientData, void *WhichSocket, void *WhichConnection, OSK_PCHAR Data, OSK_UINT Len ); -typedef int (*OSKITTCP_NEED_BIND) - ( void *ClientData, - void *WhichSocket, - void *WhichConnection, - struct sockaddr *address, - OSK_UINT addrlen, - OSK_UINT reuseport ); typedef struct _OSKITTCP_EVENT_HANDLERS { void *ClientData; - OSKITTCP_SOCKET_DATA_AVAILABLE SocketDataAvailable; - OSKITTCP_SOCKET_CONNECT_INDICATION SocketConnectIndication; - OSKITTCP_SOCKET_CLOSE_INDICATION SocketCloseIndication; - OSKITTCP_SOCKET_PENDING_CONNECT_INDICATION SocketPendingConnectIndication; - OSKITTCP_SOCKET_RESET_INDICATION SocketResetIndication; + OSKITTCP_SOCKET_STATE SocketState; OSKITTCP_SEND_PACKET PacketSend; - OSKITTCP_NEED_BIND Bind; } OSKITTCP_EVENT_HANDLERS, *POSKITTCP_EVENT_HANDLERS; extern OSKITTCP_EVENT_HANDLERS OtcpEvent; @@ -92,7 +80,12 @@ extern void RegisterOskitTCPEventHandlers ( POSKITTCP_EVENT_HANDLERS EventHandlers ); extern void OskitTCPReceiveDatagram( OSK_PCHAR Data, OSK_UINT Len, OSK_UINT IpHeaderLen ); - +extern int OskitTCPReceive( void *socket, + void *Addr, + OSK_PCHAR Data, + OSK_UINT Len, + OSK_UINT *OutLen, + OSK_UINT Flags ); #undef errno #define malloc(x,...) fbsd_malloc(x,__FILE__,__LINE__) @@ -103,4 +96,8 @@ extern void OskitTCPReceiveDatagram( OSK_PCHAR Data, OSK_UINT Len, #define SOCK_MAXADDRLEN 255 +#define OSK_MSG_OOB 0x01 +#define OSK_MSG_PEEK 0x02 +#define OSK_MSG_DONTWAIT 0x80 + #endif/*OSKITTCP_H*/ diff --git a/reactos/drivers/lib/oskittcp/oskittcp/in.c b/reactos/drivers/lib/oskittcp/oskittcp/in.c index 89ad849f36f..c2a2965bce2 100644 --- a/reactos/drivers/lib/oskittcp/oskittcp/in.c +++ b/reactos/drivers/lib/oskittcp/oskittcp/in.c @@ -64,38 +64,6 @@ struct multi_kludge { struct in_multihead mk_head; }; -/* - * Return the network number from an internet address. - */ -u_long -in_netof(in) - struct in_addr in; -{ - register u_long i = ntohl(in.s_addr); - register u_long net; - register struct in_ifaddr *ia; - - if (IN_CLASSA(i)) - net = i & IN_CLASSA_NET; - else if (IN_CLASSB(i)) - net = i & IN_CLASSB_NET; - else if (IN_CLASSC(i)) - net = i & IN_CLASSC_NET; - else if (IN_CLASSD(i)) - net = i & IN_CLASSD_NET; - else - return (0); - - /* - * Check whether network is a subnet; - * if so, return subnet number. - */ - for (ia = in_ifaddr; ia; ia = ia->ia_next) - if (net == ia->ia_net) - return (i & ia->ia_subnetmask); - return (net); -} - #ifndef SUBNETSARELOCAL #define SUBNETSARELOCAL 1 #endif diff --git a/reactos/drivers/lib/oskittcp/oskittcp/interface.c b/reactos/drivers/lib/oskittcp/oskittcp/interface.c index 08ef28fd604..3d7ee049a45 100644 --- a/reactos/drivers/lib/oskittcp/oskittcp/interface.c +++ b/reactos/drivers/lib/oskittcp/oskittcp/interface.c @@ -54,9 +54,6 @@ void RegisterOskitTCPEventHandlers( POSKITTCP_EVENT_HANDLERS EventHandlers ) { if( OtcpEvent.PacketSend ) OS_DbgPrint(OSK_MID_TRACE,("SendPacket handler registered: %x\n", OtcpEvent.PacketSend)); - if( OtcpEvent.Bind ) - OS_DbgPrint(OSK_MID_TRACE,("Bind handler registered: %x\n", - OtcpEvent.Bind)); } void OskitDumpBuffer( OSK_PCHAR Data, OSK_UINT Len ) { @@ -85,42 +82,49 @@ int OskitTCPSocket( void *context, *aso = so; } return error; -#if 0 - register struct protosw *prp; - register struct socket *so; - register int error; - - if (proto) { - prp = pffindproto(domain, proto, type); - } else { - prp = pffindtype(domain, type); - } - if (prp == 0 || prp->pr_usrreq == 0) { - return (EPROTONOSUPPORT); - } - if (prp->pr_type != type) { - return (EPROTOTYPE); - } - MALLOC(so, struct socket *, sizeof(*so), M_SOCKET, M_WAIT); - bzero((caddr_t)so, sizeof(*so)); - so->so_type = type; - so->so_proto = prp; - error = - (*prp->pr_usrreq)(so, PRU_ATTACH, - (struct mbuf *)0, - (struct mbuf *)proto, - (struct mbuf *)0); - if (error) { - so->so_state |= SS_NOFDREF; - sofree(so); - return (error); - } - *aso = so; - OS_DbgPrint(OSK_MAX_TRACE,("Returning Socket %x\n", so)); - return STATUS_SUCCESS; -#endif } +int OskitTCPRecv( void *connection, + void *Addr, + OSK_PCHAR Data, + OSK_UINT Len, + OSK_UINT *OutLen, + OSK_UINT Flags ) { + struct mbuf *paddr = 0; + struct mbuf m, *mp; + struct uio uio = { 0 }; + int error = 0; + int tcp_flags = 0; + + if( Flags & OSK_MSG_OOB ) tcp_flags |= MSG_OOB; + if( Flags & OSK_MSG_DONTWAIT ) tcp_flags |= MSG_DONTWAIT; + if( Flags & OSK_MSG_PEEK ) tcp_flags |= MSG_PEEK; + + uio.uio_resid = Len; + m.m_len = Len; + m.m_data = Data; + m.m_type = MT_DATA; + m.m_flags = M_PKTHDR | M_EOR; + + mp = &m; + + OS_DbgPrint(OSK_MID_TRACE,("Reading %d bytes from TCP:\n", Len)); + + error = soreceive( connection, &paddr, &uio, &mp, NULL /* SCM_RIGHTS */, + &tcp_flags ); + + if( error == 0 ) { + OS_DbgPrint(OSK_MID_TRACE,("Successful read from TCP:\n")); + 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; +} + static int getsockaddr(namp, uaddr, len) /* [<][>][^][v][top][bottom][index][help] */ @@ -209,10 +213,13 @@ done: return (error); } -DWORD OskitTCPClose( VOID *socket ) { +DWORD OskitTCPClose( void *socket ) { + struct socket *so = socket; + so->so_connection = 0; + soclose( so ); } -DWORD OskitTCPSend( VOID *socket, OSK_PCHAR Data, OSK_UINT Len, int flags ) { +DWORD OskitTCPSend( void *socket, OSK_PCHAR Data, OSK_UINT Len, int flags ) { OskitDumpBuffer( Data, Len ); struct mbuf mb; mb.m_data = Data; @@ -220,11 +227,17 @@ DWORD OskitTCPSend( VOID *socket, OSK_PCHAR Data, OSK_UINT Len, int flags ) { return sosend( socket, NULL, NULL, (struct mbuf *)&mb, NULL, 0 ); } -void OskitTCPReceive( VOID *socket, PVOID AddrOut, - OSK_PCHAR Data, OSK_UINT Len, OSK_UINT *OutLen ) { -} +void *OskitTCPAccept( void *socket, + void *AddrOut, + OSK_UINT AddrLen, + OSK_UINT *OutAddrLen ) { + struct mbuf nam; + int error; -VOID *OskitTCPAccept( VOID *socket, PVOID AddrOut ) { + nam.m_data = AddrOut; + nam.m_len = AddrLen; + + return soaccept( socket, &nam ); } void OskitTCPReceiveDatagram( OSK_PCHAR Data, OSK_UINT Len, @@ -246,13 +259,11 @@ void OskitTCPReceiveDatagram( OSK_PCHAR Data, OSK_UINT Len, /* The buffer Ip is freed by tcp_input */ } -void OskitTCPBind( VOID *socket, PVOID name ) { +void OskitTCPListen( void *socket, int backlog ) { + return solisten( socket, backlog ); } -void OskitTCPListen( VOID *socket, int backlog ) { -} - -void OskitTCPSetAddress( VOID *socket, +void OskitTCPSetAddress( void *socket, ULONG LocalAddress, USHORT LocalPort, ULONG RemoteAddress, @@ -268,7 +279,7 @@ void OskitTCPSetAddress( VOID *socket, RemoteAddress, RemotePort); } -void OskitTCPGetAddress( VOID *socket, +void OskitTCPGetAddress( void *socket, PULONG LocalAddress, PUSHORT LocalPort, PULONG RemoteAddress, @@ -290,3 +301,4 @@ void oskittcp_die( const char *file, int line ) { DbgPrint("\n\n*** OSKITTCP: Panic Called at %s:%d ***\n", file, line); KeBugCheck(0); } + diff --git a/reactos/drivers/lib/oskittcp/oskittcp/ip_output.c b/reactos/drivers/lib/oskittcp/oskittcp/ip_output.c index 4a00269f56c..7e53ee3b594 100644 --- a/reactos/drivers/lib/oskittcp/oskittcp/ip_output.c +++ b/reactos/drivers/lib/oskittcp/oskittcp/ip_output.c @@ -132,47 +132,11 @@ ip_output(so, m0, opt, ro, flags, imo) m->m_data + IPHDR_SIZE, m->m_len - IPHDR_SIZE ); } + OS_DbgPrint(OSK_MID_TRACE,("Error from upper layer: %d\n", error)); + return (error); } -/* - * Copy options from ip to jp, - * omitting those not copied during fragmentation. - */ -int -ip_optcopy(ip, jp) - struct ip *ip, *jp; -{ - register u_char *cp, *dp; - int opt, optlen, cnt; - - cp = (u_char *)(ip + 1); - dp = (u_char *)(jp + 1); - cnt = (ip->ip_hl << 2) - sizeof (struct ip); - for (; cnt > 0; cnt -= optlen, cp += optlen) { - opt = cp[0]; - if (opt == IPOPT_EOL) - break; - if (opt == IPOPT_NOP) { - /* Preserve for IP mcast tunnel's LSRR alignment. */ - *dp++ = IPOPT_NOP; - optlen = 1; - continue; - } else - optlen = cp[IPOPT_OLEN]; - /* bogus lengths should have been caught by ip_dooptions */ - if (optlen > cnt) - optlen = cnt; - if (IPOPT_COPIED(opt)) { - (void)memcpy(dp, cp, (unsigned)optlen); - dp += optlen; - } - } - for (optlen = dp - (u_char *)(jp+1); optlen & 0x3; optlen++) - *dp++ = IPOPT_EOL; - return (optlen); -} - /* * IP socket option processing. */ diff --git a/reactos/drivers/lib/oskittcp/oskittcp/kern_clock.c b/reactos/drivers/lib/oskittcp/oskittcp/kern_clock.c index c53581fd5fe..02c70ca96e1 100644 --- a/reactos/drivers/lib/oskittcp/oskittcp/kern_clock.c +++ b/reactos/drivers/lib/oskittcp/oskittcp/kern_clock.c @@ -139,59 +139,6 @@ int ticks; volatile struct timeval time; volatile struct timeval mono_time; -/* - * The real-time timer, interrupting hz times per second. - */ -void bsd_hardclock(void) -{ - register struct callout *p1; - register int needsoft; - unsigned cpl; - int s; - - save_cpl(&cpl); - splhigh(); - - /* - * Update real-time timeout queue. - * At front of queue are some number of events which are ``due''. - * The time to these is <= 0 and if negative represents the - * number of ticks which have passed since it was supposed to happen. - * The rest of the q elements (times > 0) are events yet to happen, - * where the time for each is given as a delta from the previous. - * Decrementing just the first of these serves to decrement the time - * to all events. - */ - needsoft = 0; - for (p1 = calltodo.c_next; p1 != NULL; p1 = p1->c_next) { - if (--p1->c_time > 0) - break; - needsoft = 1; - if (p1->c_time == 0) - break; - } - - /* - * Increment the time-of-day. - */ - ticks++; - BUMPTIME(&mono_time, tick); - BUMPTIME(&time, tick); - - /* - * At this point, we might need a soft interrupt. We say, what the - * heck, let's do the work now. Reduce priority level to softclock - * first, though. The alternative (postponing it) would be called - * 'setsoftclock' - */ - if (needsoft) { - (void)splsoftclock(); - softclock(); - } - - restore_cpl(cpl); -} - /* * Software (low priority) clock interrupt. * Run periodic events from timeout queue. diff --git a/reactos/drivers/lib/oskittcp/oskittcp/sleep.c b/reactos/drivers/lib/oskittcp/oskittcp/sleep.c index 83bed686a77..f56fa322af4 100644 --- a/reactos/drivers/lib/oskittcp/oskittcp/sleep.c +++ b/reactos/drivers/lib/oskittcp/oskittcp/sleep.c @@ -12,18 +12,18 @@ typedef struct _SLEEPING_THREAD { } SLEEPING_THREAD, *PSLEEPING_THREAD; LIST_ENTRY SleepingThreadsList; -KSPIN_LOCK SleepingThreadsLock; +FAST_MUTEX SleepingThreadsLock; /* clock_init */ int ncallout = 256; struct callout *callout; void init_freebsd_sched() { - KeInitializeSpinLock( &SleepingThreadsLock ); + ExInitializeFastMutex( &SleepingThreadsLock ); InitializeListHead( &SleepingThreadsList ); } -void tsleep( void *token, int priority, char *wmesg, int tmio ) { +int tsleep( void *token, int priority, char *wmesg, int tmio ) { KIRQL OldIrql; KEVENT Event; PLIST_ENTRY Entry; @@ -37,43 +37,65 @@ void tsleep( void *token, int priority, char *wmesg, int tmio ) { if( SleepingThread ) { KeInitializeEvent( &SleepingThread->Event, NotificationEvent, FALSE ); SleepingThread->SleepToken = token; - ExInterlockedInsertTailList( &SleepingThreadsList, - &SleepingThread->Entry, - &SleepingThreadsLock ); - } - OS_DbgPrint(OSK_MID_TRACE,("Waiting on %x\n", token)); - KeWaitForSingleObject( &SleepingThread->Event, - WrSuspended, - KernelMode, - TRUE, - NULL ); + ExAcquireFastMutex( &SleepingThreadsLock ); + InsertTailList( &SleepingThreadsList, &SleepingThread->Entry ); + ExReleaseFastMutex( &SleepingThreadsLock ); + + OS_DbgPrint(OSK_MID_TRACE,("Waiting on %x\n", token)); + KeWaitForSingleObject( &SleepingThread->Event, + WrSuspended, + KernelMode, + TRUE, + NULL ); + + ExAcquireFastMutex( &SleepingThreadsLock ); + RemoveEntryList( &SleepingThread->Entry ); + ExReleaseFastMutex( &SleepingThreadsLock ); + + ExFreePool( SleepingThread ); + } OS_DbgPrint(OSK_MID_TRACE,("Waiting finished: %x\n", token)); + return 0; } -void wakeup( void *token ) { +void wakeup( struct socket *so, struct selinfo *si, void *token ) { KIRQL OldIrql; KEVENT Event; PLIST_ENTRY Entry; PSLEEPING_THREAD SleepingThread; - - OS_DbgPrint(OSK_MID_TRACE,("Wakeup %x!\n",token)); - KeAcquireSpinLock( &SleepingThreadsLock, &OldIrql ); + 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; + + 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")); + OtcpEvent.SocketState( OtcpEvent.ClientData, + so, + so->so_connection, + si ? si->si_flags : 0, + so->so_state ); + } + + ExAcquireFastMutex( &SleepingThreadsLock ); Entry = SleepingThreadsList.Flink; while( Entry != &SleepingThreadsList ) { SleepingThread = CONTAINING_RECORD(Entry, SLEEPING_THREAD, Entry); + OS_DbgPrint(OSK_MID_TRACE,("Sleeper @ %x\n", SleepingThread)); if( SleepingThread->SleepToken == token ) { - RemoveEntryList(Entry); - KeReleaseSpinLock( &SleepingThreadsLock, OldIrql ); OS_DbgPrint(OSK_MID_TRACE,("Setting event to wake %x\n", token)); - KeSetEvent( &SleepingThread->Event, IO_NO_INCREMENT, FALSE ); - ExFreePool( SleepingThread ); - return; + KeSetEvent( &SleepingThread->Event, IO_NETWORK_INCREMENT, FALSE ); } Entry = Entry->Flink; } - KeReleaseSpinLock( &SleepingThreadsLock, OldIrql ); + ExReleaseFastMutex( &SleepingThreadsLock ); OS_DbgPrint(OSK_MID_TRACE,("Wakeup done %x\n", token)); } @@ -142,32 +164,6 @@ static __inline int name(void) \ return (x); \ } -#if 0 -GENSPL(splbio, cpl |= bio_imask) -GENSPL(splclock, cpl = HWI_MASK | SWI_MASK) -GENSPL(splhigh, cpl = HWI_MASK | SWI_MASK) -GENSPL(splimp, cpl |= net_imask) -GENSPL(splnet, cpl |= SWI_NET_MASK) -GENSPL(splsoftclock, cpl = SWI_CLOCK_MASK) -GENSPL(splsofttty, cpl |= SWI_TTY_MASK) -GENSPL(splstatclock, cpl |= stat_imask) -GENSPL(spltty, cpl |= tty_imask) -#endif - -#if 0 -void spl0(void) { - cpl = SWI_AST_MASK; - if (ipending & ~SWI_AST_MASK) - splz(); -} - -void splx(int ipl) { - cpl = ipl; - if (ipending & ~ipl) - splz(); -} -#endif - void splz(void) { OS_DbgPrint(OSK_MID_TRACE,("Called SPLZ\n")); } @@ -184,26 +180,3 @@ void restore_cpl(unsigned x) { cpl = x; } - -void selrecord( struct proc *selector, struct selinfo *sip) { - OS_DbgPrint(OSK_MID_TRACE,("Called selrecord\n")); -} - -void wakeupsocket( struct socket *so, struct selinfo *sel ) { - void *connection = so->so_connection; - char *data = 0; - int datalen = 0; - int flags = 0; - - OS_DbgPrint(OSK_MID_TRACE,("Wakeup: %x\n", so)); -#if 0 - if( soreceive(so, &paddr, 0, &mp0, &controlp, flags) == 0 ) { - /* We have data available */ - OS_DbgPrint(OSK_MID_TRACE,("Data available on %x\n", so)); - } -#endif -} - -void selwakeup( struct selinfo *sel ) { - OS_DbgPrint(OSK_MID_TRACE,("Called selwakeup\n")); -} diff --git a/reactos/drivers/lib/oskittcp/oskittcp/tcp_input.c b/reactos/drivers/lib/oskittcp/oskittcp/tcp_input.c index 260b695237f..0ab79a24d37 100644 --- a/reactos/drivers/lib/oskittcp/oskittcp/tcp_input.c +++ b/reactos/drivers/lib/oskittcp/oskittcp/tcp_input.c @@ -74,58 +74,30 @@ struct inpcbinfo tcbinfo; #endif /* TUBA_INCLUDE */ -/* - * Insert segment ti into reassembly queue of tcp with - * control block tp. Return TH_FIN if reassembly now includes - * a segment with FIN. The macro form does the common case inline - * (segment is the next to be received on an established connection, - * and the queue is empty), avoiding linkage into and removal - * from the queue and repetition of various conversions. - * Set DELACK for segments received in order, but ack immediately - * when segments are out of order (so fast retransmit can work). - */ -#ifdef TCP_ACK_HACK -#define TCP_REASS(tp, ti, m, so, flags) { \ - if ((ti)->ti_seq == (tp)->rcv_nxt && \ - (tp)->seg_next == (struct tcpiphdr *)(tp) && \ - (tp)->t_state == TCPS_ESTABLISHED) { \ - if (ti->ti_flags & TH_PUSH) \ - tp->t_flags |= TF_ACKNOW; \ - else \ - tp->t_flags |= TF_DELACK; \ - (tp)->rcv_nxt += (ti)->ti_len - IPHDR_SIZE; \ - OS_DbgPrint(OSK_MID_TRACE,("Added %d to rcv_nxt\n", \ - (ti)->ti_len - IPHDR_SIZE)); \ - flags = (ti)->ti_flags & TH_FIN; \ - tcpstat.tcps_rcvpack++;\ - tcpstat.tcps_rcvbyte += (ti)->ti_len;\ - sbappend(so, &(so)->so_rcv, (m)); \ - sorwakeup(so); \ - } else { \ - (flags) = tcp_reass((tp), (ti), (m)); \ - tp->t_flags |= TF_ACKNOW; \ - } \ -} -#else #define TCP_REASS(tp, ti, m, so, flags) { \ if ((ti)->ti_seq == (tp)->rcv_nxt && \ (tp)->seg_next == (struct tcpiphdr *)(tp) && \ (tp)->t_state == TCPS_ESTABLISHED) { \ tp->t_flags |= TF_DELACK; \ - (tp)->rcv_nxt += (ti)->ti_len - IPHDR_SIZE; \ - OS_DbgPrint(OSK_MID_TRACE,("Added %d to rcv_nxt\n", \ - (ti)->ti_len - IPHDR_SIZE)); \ + if (!(ti)->ti_flags & TH_FIN && \ + !(ti)->ti_flags & TH_RST) { \ + (tp)->rcv_nxt += (ti)->ti_len - sizeof(struct ip); \ + OS_DbgPrint(OSK_MID_TRACE,("(REASS2) Added %d to rcv_nxt\n", \ + (ti)->ti_len - sizeof(struct ip))); \ + } else { \ + so->so_rcv.sb_sel.si_flags |= SEL_FIN; \ + } \ flags = (ti)->ti_flags & TH_FIN; \ - tcpstat.tcps_rcvpack++;\ - tcpstat.tcps_rcvbyte += (ti)->ti_len;\ - sbappend(so, &(so)->so_rcv, (m)); \ + tcpstat.tcps_rcvpack++; \ + tcpstat.tcps_rcvbyte += (ti)->ti_len; \ + sbappend(so, &so->so_rcv, (m)); \ sorwakeup(so); \ } else { \ (flags) = tcp_reass((tp), (ti), (m)); \ tp->t_flags |= TF_ACKNOW; \ } \ } -#endif + #ifndef TUBA_INCLUDE int @@ -231,13 +203,30 @@ present: ti = (struct tcpiphdr *)ti->ti_next; if (so->so_state & SS_CANTRCVMORE) m_freem(m); - else - sbappend(so, &so->so_rcv, m); + else { + sbappend(so, &so->so_rcv, (m)); + } } while (ti != (struct tcpiphdr *)tp && ti->ti_seq == tp->rcv_nxt); sorwakeup(so); return (flags); } +void rip_input_mini(so, ti, m) + struct socket *so; + struct tcpiphdr *ti; + struct mbuf *m; +{ + register struct ip *ip = mtod(m, struct ip *); + register struct inpcb *inp; + struct sockaddr_in ripsrc = { sizeof(ripsrc), AF_INET }; + + ripsrc.sin_addr = ti->ti_src; + + sbappendaddr(&so->so_rcv, + (struct sockaddr *)&ripsrc, m, + (struct mbuf *)0); +} + /* * TCP input routine, follows pages 65-76 of the * protocol specification dated September, 1981 very closely. @@ -249,6 +238,8 @@ tcp_input(m, iphlen) { register struct tcpiphdr *ti; register struct inpcb *inp; + struct sockaddr_in addr = { 0 }; + struct mbuf mhdr = { 0 }, mpayload = { 0 }; caddr_t optp = NULL; int optlen = 0; int len, tlen, off; @@ -342,6 +333,8 @@ tcp_input(m, iphlen) m->m_data += sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr); m->m_len -= sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr); + OskitDumpBuffer(m->m_data, m->m_len); + /* * Locate pcb for segment. */ @@ -380,6 +373,22 @@ findpcb: tiwin = ti->ti_win; so = inp->inp_socket; + +#if 0 + mhdr.m_type = MT_HEADER; + memcpy(mhdr.m_pktdat, ti, sizeof(ti)); + mhdr.m_data = mhdr.m_pktdat; + mhdr.m_len = 0; + mhdr.m_flags = M_PKTHDR | M_EOR; + mhdr.m_next = &mpayload; + mpayload.m_type = MT_DATA; + mpayload.m_data = m->m_data + sizeof(*ti); + mpayload.m_len = m->m_len - sizeof(*ti); + mpayload.m_flags = M_EOR; + + rip_input_mini(so, ti, &mhdr); +#endif + if (so->so_options & (SO_DEBUG|SO_ACCEPTCONN)) { #ifdef TCPDEBUG if (so->so_options & SO_DEBUG) { @@ -589,14 +598,17 @@ findpcb: */ ++tcpstat.tcps_preddat; tp->rcv_nxt += ti->ti_len; - OS_DbgPrint(OSK_MID_TRACE,("Added %d to rcv_nxt\n", - ti->ti_len)); tcpstat.tcps_rcvpack++; tcpstat.tcps_rcvbyte += ti->ti_len; /* * Add data to socket buffer. */ - sbappend(so, &so->so_rcv, m); + OS_DbgPrint + (OSK_MID_TRACE,("Adding %d to socket buffer\n", + m->m_len)); + + sbappend(so, &so->so_rcv, (m)); + so->so_rcv.sb_cc += m->m_len; sorwakeup(so); #ifdef TCP_ACK_HACK /* @@ -879,6 +891,7 @@ findpcb: so)); tp->t_state = TCPS_ESTABLISHED; tp->t_timer[TCPT_KEEP] = tcp_keepidle; + socwakeup(so); } } else { /* @@ -1173,8 +1186,9 @@ trimthenstep6: * error and we send an RST and drop the connection. */ if (tiflags & TH_SYN) { - tp = tcp_drop(tp, ECONNRESET); - goto dropwithreset; + OS_DbgPrint(OSK_MID_TRACE,("SYN In window\n")); + tp = tcp_drop(tp, ECONNRESET); + goto dropwithreset; } /* @@ -1415,7 +1429,7 @@ process_ACK: ourfinisacked = 0; } if (so->so_snd.sb_flags & SB_NOTIFY) - sowwakeup(so); + sowwakeup(so); tp->snd_una = ti->ti_ack; if (SEQ_LT(tp->snd_nxt, tp->snd_una)) tp->snd_nxt = tp->snd_una; @@ -1522,6 +1536,9 @@ step6: * actually wanting to send this much urgent data. */ if (ti->ti_urp + so->so_rcv.sb_cc > sb_max) { + OS_DbgPrint(OSK_MID_TRACE, + ("%x: Urgent pointer out of range: %x\n", + ti->ti_urp)); ti->ti_urp = 0; /* XXX */ tiflags &= ~TH_URG; /* XXX */ goto dodata; /* XXX */ @@ -1579,6 +1596,9 @@ dodata: /* XXX */ * case PRU_RCVD). If a FIN has already been received on this * connection then we just ignore the text. */ + + OS_DbgPrint(OSK_MID_TRACE,("TIFlags: %x\n", tiflags)); + if ((ti->ti_len || (tiflags&TH_FIN)) && TCPS_HAVERCVDFIN(tp->t_state) == 0) { TCP_REASS(tp, ti, m, so, tiflags); @@ -1589,7 +1609,7 @@ dodata: /* XXX */ */ len = so->so_rcv.sb_hiwat - (tp->rcv_adv - tp->rcv_nxt); } else { - m_freem(m); + /*m_freem(m);*/ tiflags &= ~TH_FIN; } diff --git a/reactos/drivers/lib/oskittcp/oskittcp/tcp_output.c b/reactos/drivers/lib/oskittcp/oskittcp/tcp_output.c index 976057494d3..a21e53d898b 100644 --- a/reactos/drivers/lib/oskittcp/oskittcp/tcp_output.c +++ b/reactos/drivers/lib/oskittcp/oskittcp/tcp_output.c @@ -85,8 +85,7 @@ tcp_output(tp) struct rmxp_tao *taop; struct rmxp_tao tao_noncached; - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); + OS_DbgPrint(OSK_MID_TRACE,("Start\n")); /* * Determine length of data that should be transmitted, @@ -102,7 +101,9 @@ tcp_output(tp) * slow start to get ack "clock" running again. */ tp->snd_cwnd = tp->t_maxseg; + again: + OS_DbgPrint(OSK_MID_TRACE,("Again...\n")); sendalot = 0; off = tp->snd_nxt - tp->snd_una; win = min(tp->snd_wnd, tp->snd_cwnd); @@ -237,9 +238,6 @@ again: goto send; } - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); - /* * Compare available window to amount of window * known to peer (as advertised window less @@ -262,9 +260,6 @@ again: goto send; } - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); - /* * Send if we owe peer an ACK. */ @@ -284,9 +279,6 @@ again: ((tp->t_flags & TF_SENTFIN) == 0 || tp->snd_nxt == tp->snd_una)) goto send; - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); - /* * TCP window updates are not reliable, rather a polling protocol * using ``persist'' packets is used to insure receipt of window @@ -321,9 +313,6 @@ again: /*return (0);*/ send: - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); - /* * Before ESTABLISHED, force sending of initial options * unless TCP set not to do any options. @@ -358,9 +347,6 @@ send: } } - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); - /* * Send a timestamp and echo-reply if this is a SYN and our side * wants to use timestamps (TF_REQ_TSTMP is set) or both our side @@ -379,9 +365,6 @@ send: optlen += TCPOLEN_TSTAMP_APPA; } - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); - /* * Send `CC-family' options if our side wants to use them (TF_REQ_CC), * options are allowed (!TF_NOOPT) and it's not a RST. @@ -457,9 +440,6 @@ send: hdrlen += optlen; - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); - /* * Adjust data length if insertion of options will * bump the packet length beyond the t_maxopd length. @@ -480,8 +460,6 @@ send: panic("tcphdr too big"); /*#endif*/ - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : tp->rcv_nxt %x\n", tp->rcv_nxt)); /* * Grab a header mbuf, attaching a copy of data to @@ -607,21 +585,12 @@ send: if (win < (long)(so->so_rcv.sb_hiwat / 4) && win < (long)tp->t_maxseg) win = 0; - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); - if (win > (long)TCP_MAXWIN << tp->rcv_scale) win = (long)TCP_MAXWIN << tp->rcv_scale; - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); - if (win < (long)(tp->rcv_adv - tp->rcv_nxt)) win = (long)(tp->rcv_adv - tp->rcv_nxt); - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); - ti->ti_win = htons((u_short) (win>>tp->rcv_scale)); if (SEQ_GT(tp->snd_up, tp->snd_nxt)) { ti->ti_urp = htons((u_short)(tp->snd_up - tp->snd_nxt)); @@ -640,9 +609,6 @@ send: * checksum extended header and data. */ - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); - if (len + optlen) { ti->ti_src.s_addr = tp->t_inpcb->inp_laddr.s_addr; ti->ti_dst.s_addr = tp->t_inpcb->inp_faddr.s_addr; @@ -651,14 +617,8 @@ send: optlen + len)); } - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); - ti->ti_sum = in_cksum(m, (int)(hdrlen + len)); - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); - /* * In transmit state, time the transmission and arrange for * the retransmit. In persist state, just set snd_max. @@ -711,9 +671,6 @@ send: if (SEQ_GT(tp->snd_nxt + len, tp->snd_max)) tp->snd_max = tp->snd_nxt + len; - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); - #ifdef TCPDEBUG /* * Trace. @@ -756,9 +713,7 @@ send: } #endif - OS_DbgPrint(OSK_MID_TRACE, - ("Before IP_OUTPUT : AckNumber %x\n", ti->ti_ack)); - + OS_DbgPrint(OSK_MID_TRACE,("Calling ip_output\n")); error = ip_output(so, m, tp->t_inpcb->inp_options, &tp->t_inpcb->inp_route, so->so_options & SO_DONTROUTE, 0); } @@ -799,6 +754,8 @@ out: tp->rcv_adv = tp->rcv_nxt + win; tp->last_ack_sent = tp->rcv_nxt; tp->t_flags &= ~(TF_ACKNOW|TF_DELACK); + OS_DbgPrint(OSK_MID_TRACE,("sendalot: %d (flags %x)\n", + sendalot, tp->t_flags)); if (sendalot) goto again; return (0); diff --git a/reactos/drivers/lib/oskittcp/oskittcp/tcp_subr.c b/reactos/drivers/lib/oskittcp/oskittcp/tcp_subr.c index b67a1e91db5..fc3eafdd639 100644 --- a/reactos/drivers/lib/oskittcp/oskittcp/tcp_subr.c +++ b/reactos/drivers/lib/oskittcp/oskittcp/tcp_subr.c @@ -427,7 +427,7 @@ tcp_notify(inp, error) so->so_error = error; else tp->t_softerror = error; - wakeup((caddr_t) &so->so_timeo); + wakeup(so, NULL, (caddr_t) &so->so_timeo); sorwakeup(so); sowwakeup(so); } diff --git a/reactos/drivers/lib/oskittcp/oskittcp/uipc_socket.c b/reactos/drivers/lib/oskittcp/oskittcp/uipc_socket.c index 8d46e40c533..c7ae553c3c8 100644 --- a/reactos/drivers/lib/oskittcp/oskittcp/uipc_socket.c +++ b/reactos/drivers/lib/oskittcp/oskittcp/uipc_socket.c @@ -393,7 +393,7 @@ restart: (atomic || space < so->so_snd.sb_lowat || space < clen)) { if (so->so_state & SS_NBIO) snderr(EWOULDBLOCK); - sbunlock(&so->so_snd); + sbunlock(so, &so->so_snd); error = sbwait(&so->so_snd); splx(s); if (error) @@ -480,12 +480,14 @@ nopages: } while (resid); release: - sbunlock(&so->so_snd); + sbunlock(so, &so->so_snd); out: +#ifndef __REACTOS__ if (top) - m_freem(top); + m_freem(top); if (control) - m_freem(control); + m_freem(control); +#endif /* The caller owns top and control */ return (error); } @@ -506,305 +508,87 @@ out: * only for the count in uio_resid. */ int -soreceive(so, paddr, uio, mp0, controlp, flagsp) +soreceive(so, paddr, uio, _mp0, controlp, flagsp) register struct socket *so; struct mbuf **paddr; struct uio *uio; - struct mbuf **mp0; + struct mbuf **_mp0; struct mbuf **controlp; int *flagsp; { - register struct mbuf *m, **mp; - register int flags, len, error, s, offset; - struct protosw *pr = so->so_proto; - struct mbuf *nextrecord; - int moff, type = 0; - int orig_resid = uio->uio_resid; + struct mbuf dummy = { 0 }; + struct mbuf *mb = &dummy, *mn, *mp0 = *_mp0; + int total = 0, copyamt; - mp = mp0; - if (paddr) - *paddr = 0; - if (controlp) - *controlp = 0; - if (flagsp) - flags = *flagsp &~ MSG_EOR; - else - flags = 0; - if (flags & MSG_OOB) { - m = m_get(M_WAIT, MT_DATA); - error = (*pr->pr_usrreq)(so, PRU_RCVOOB, - m, (struct mbuf *)(flags & MSG_PEEK), (struct mbuf *)0); - if (error) - goto bad; - do { - error = uiomove(mtod(m, caddr_t), - (int) min(uio->uio_resid, m->m_len), uio); - /*m = m_free(m);*/ - } while (uio->uio_resid && error == 0 && m); -bad: - if (m) - /*m_freem(m);*/ - return (error); - } - if (mp) - *mp = (struct mbuf *)0; - if (so->so_state & SS_ISCONFIRMING && uio->uio_resid) - (*pr->pr_usrreq)(so, PRU_RCVD, (struct mbuf *)0, - (struct mbuf *)0, (struct mbuf *)0); + dummy.m_nextpkt = so->so_rcv.sb_mb; + uio->uio_resid = 0; -restart: - error = sblock(&so->so_rcv, SBLOCKWAIT(flags)); - if (error) - return (error); - s = splnet(); + if( mp0->m_len == 0 ) + return 0; - m = so->so_rcv.sb_mb; - /* - * If we have less data than requested, block awaiting more - * (subject to any timeout) if: - * 1. the current count is less than the low water mark, or - * 2. MSG_WAITALL is set, and it is possible to do the entire - * receive operation at once if we block (resid <= hiwat). - * 3. MSG_DONTWAIT is not set - * If MSG_WAITALL is set but resid is larger than the receive buffer, - * we have to do the receive in sections, and thus risk returning - * a short count if a timeout or signal occurs after we start. - */ - if (m == 0 || (((flags & MSG_DONTWAIT) == 0 && - so->so_rcv.sb_cc < uio->uio_resid) && - (so->so_rcv.sb_cc < so->so_rcv.sb_lowat || - ((flags & MSG_WAITALL) && uio->uio_resid <= so->so_rcv.sb_hiwat)) && - m->m_nextpkt == 0 && (pr->pr_flags & PR_ATOMIC) == 0)) { -#ifdef DIAGNOSTIC - if (m == 0 && so->so_rcv.sb_cc) - panic("receive 1"); -#endif - if (so->so_error) { - if (m) - goto dontblock; - error = so->so_error; - if ((flags & MSG_PEEK) == 0) - so->so_error = 0; - goto release; - } - if (so->so_state & SS_CANTRCVMORE) { - if (m) - goto dontblock; - else - goto release; - } - for (; m; m = m->m_next) - if (m->m_type == MT_OOBDATA || (m->m_flags & M_EOR)) { - m = so->so_rcv.sb_mb; - goto dontblock; - } - if ((so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING)) == 0 && - (so->so_proto->pr_flags & PR_CONNREQUIRED)) { - error = ENOTCONN; - goto release; - } - if (uio->uio_resid == 0) - goto release; - if ((so->so_state & SS_NBIO) || (flags & MSG_DONTWAIT)) { - error = EWOULDBLOCK; - goto release; - } - sbunlock(&so->so_rcv); - error = sbwait(&so->so_rcv); - splx(s); - if (error) - return (error); - goto restart; - } -dontblock: - if (uio->uio_procp) - uio->uio_procp->p_stats->p_ru.ru_msgrcv++; - nextrecord = m->m_nextpkt; - if (pr->pr_flags & PR_ADDR) { -#ifdef DIAGNOSTIC - if (m->m_type != MT_SONAME) - panic("receive 1a"); -#endif - orig_resid = 0; - if (flags & MSG_PEEK) { - if (paddr) - *paddr = m_copy(m, 0, m->m_len); - m = m->m_next; - } else { - sbfree(&so->so_rcv, m); - if (paddr) { - *paddr = m; - so->so_rcv.sb_mb = m->m_next; - m->m_next = 0; - m = so->so_rcv.sb_mb; - } else { - MFREE(m, so->so_rcv.sb_mb); - m = so->so_rcv.sb_mb; - } - } - } - while (m && m->m_type == MT_CONTROL && error == 0) { - if (flags & MSG_PEEK) { - if (controlp) - *controlp = m_copy(m, 0, m->m_len); - m = m->m_next; - } else { - sbfree(&so->so_rcv, m); - if (controlp) { -#ifndef __REACTOS__ - if (pr->pr_domain->dom_externalize && - mtod(m, struct cmsghdr *)->cmsg_type == - SCM_RIGHTS) - error = (*pr->pr_domain->dom_externalize)(m); - *controlp = m; - so->so_rcv.sb_mb = m->m_next; - m->m_next = 0; - m = so->so_rcv.sb_mb; -#endif - } else { - /*MFREE(m, so->so_rcv.sb_mb);*/ - m = so->so_rcv.sb_mb; - } - } - if (controlp) { - orig_resid = 0; - controlp = &(*controlp)->m_next; - } - } - if (m) { - if ((flags & MSG_PEEK) == 0) - m->m_nextpkt = nextrecord; - type = m->m_type; - if (type == MT_OOBDATA) - flags |= MSG_OOB; - } - moff = 0; - offset = 0; - while (m && uio->uio_resid > 0 && error == 0) { - if (m->m_type == MT_OOBDATA) { - if (type != MT_OOBDATA) - break; - } else if (type == MT_OOBDATA) - break; -#ifdef DIAGNOSTIC - else if (m->m_type != MT_DATA && m->m_type != MT_HEADER) - panic("receive 3"); -#endif - so->so_state &= ~SS_RCVATMARK; - len = uio->uio_resid; - if (so->so_oobmark && len > so->so_oobmark - offset) - len = so->so_oobmark - offset; - if (len > m->m_len - moff) - len = m->m_len - moff; - /* - * If mp is set, just pass back the mbufs. - * Otherwise copy them out via the uio, then free. - * Sockbuf must be consistent here (points to current mbuf, - * it points to next record) when we drop priority; - * we must note any additions to the sockbuf when we - * block interrupts again. - */ - if (mp == 0) { - splx(s); - error = uiomove(mtod(m, caddr_t) + moff, (int)len, uio); - s = splnet(); - } else - uio->uio_resid -= len; - if (len == m->m_len - moff) { - if (m->m_flags & M_EOR) - flags |= MSG_EOR; - if (flags & MSG_PEEK) { - m = m->m_next; - moff = 0; - } else { - nextrecord = m->m_nextpkt; - sbfree(&so->so_rcv, m); - if (mp) { - *mp = m; - mp = &m->m_next; - so->so_rcv.sb_mb = m = m->m_next; - *mp = (struct mbuf *)0; - } else { - /*MFREE(m, so->so_rcv.sb_mb);*/ - m = so->so_rcv.sb_mb; - } - if (m) - m->m_nextpkt = nextrecord; - } - } else { - if (flags & MSG_PEEK) - moff += len; - else { - if (mp) - *mp = m_copym(m, 0, len, M_WAIT); - m->m_data += len; - m->m_len -= len; - so->so_rcv.sb_cc -= len; - } - } - if (so->so_oobmark) { - if ((flags & MSG_PEEK) == 0) { - so->so_oobmark -= len; - if (so->so_oobmark == 0) { - so->so_state |= SS_RCVATMARK; - break; - } - } else { - offset += len; - if (offset == so->so_oobmark) - break; - } - } - if (flags & MSG_EOR) - break; - /* - * If the MSG_WAITALL flag is set (for non-atomic socket), - * we must not quit until "uio->uio_resid == 0" or an error - * termination. If a signal/timeout occurs, return - * with a short count but without error. - * Keep sockbuf locked against other readers. - */ - while (flags & MSG_WAITALL && m == 0 && uio->uio_resid > 0 && - !sosendallatonce(so) && !nextrecord) { - if (so->so_error || so->so_state & SS_CANTRCVMORE) - break; - error = sbwait(&so->so_rcv); - if (error) { - sbunlock(&so->so_rcv); - splx(s); - return (0); - } - m = so->so_rcv.sb_mb; - if (m) - nextrecord = m->m_nextpkt; - } + if( so->so_rcv.sb_cc == 0 && so->so_rcv.sb_sel.si_flags & SEL_FIN ) + return OSK_ESHUTDOWN; + + while( mb->m_nextpkt && total < mp0->m_len ) { + OS_DbgPrint(OSK_MID_TRACE, ("Looking at packet %x\n", mb)); + + if( *flagsp & MSG_OOB ) { + OS_DbgPrint(OSK_MID_TRACE, ("Searching for oob: %x\n", mb)); + while( mb->m_nextpkt && mb->m_nextpkt->m_type != MT_OOBDATA ) + mb = mb->m_nextpkt; + } else { + while( mb->m_nextpkt && mb->m_nextpkt->m_type != MT_DATA ) { + OS_DbgPrint + (OSK_MID_TRACE, + ("Searching for data: %x (%x@%x)\n", + mb->m_nextpkt->m_type, + mb->m_nextpkt->m_len, + mb->m_nextpkt->m_data)); + mb = mb->m_nextpkt; + } } - if (m && pr->pr_flags & PR_ATOMIC) { - flags |= MSG_TRUNC; - if ((flags & MSG_PEEK) == 0) - (void) sbdroprecord(&so->so_rcv); - } - if ((flags & MSG_PEEK) == 0) { - if (m == 0) - so->so_rcv.sb_mb = nextrecord; - if (pr->pr_flags & PR_WANTRCVD && so->so_pcb) - (*pr->pr_usrreq)(so, PRU_RCVD, (struct mbuf *)0, - (struct mbuf *)flags, (struct mbuf *)0); - } - if (orig_resid == uio->uio_resid && orig_resid && - (flags & MSG_EOR) == 0 && (so->so_state & SS_CANTRCVMORE) == 0) { - sbunlock(&so->so_rcv); - splx(s); - goto restart; - } + if( !mb->m_nextpkt ) break; - if (flagsp) - *flagsp |= flags; -release: - sbunlock(&so->so_rcv); - splx(s); - return (error); + mn = mb->m_nextpkt; + + if( !mn->m_next ) mn->m_next = mn->m_data; + copyamt = min(mn->m_len, mp0->m_len); + OS_DbgPrint(OSK_MID_TRACE, + ("Copying %d bytes (%d,%d) (total is %d so far)\n", + copyamt, mn->m_len, mp0->m_len, total + copyamt)); + memcpy( mp0->m_data + total, mn->m_next, copyamt ); + total += copyamt; + mp0->m_len -= copyamt; + + if( copyamt < mn->m_len ) { + if( !(*flagsp & MSG_PEEK) ) + ((caddr_t)mn->m_next) += copyamt; + break; + } + + mb->m_nextpkt = mn->m_nextpkt; + } + + /* Free previous buffers if not peek */ + if( !(*flagsp & MSG_PEEK) ) { + while( dummy.m_nextpkt && dummy.m_nextpkt != mn ) { + mb = dummy.m_nextpkt; + dummy.m_nextpkt = mb->m_nextpkt; + OS_DbgPrint + (OSK_MID_TRACE, + ("Deleting buf %x", mb)); + m_free(mb); + } + so->so_rcv.sb_cc -= total; + so->so_rcv.sb_mb = dummy.m_nextpkt; + } + + uio->uio_resid = total; + + OS_DbgPrint(OSK_MID_TRACE,("Leaving (success)\n")); + + return 0; } int @@ -836,7 +620,7 @@ sorflush(so) (void) sblock(sb, M_WAITOK); s = splimp(); socantrcvmore(so); - sbunlock(sb); + sbunlock(so, sb); asb = *sb; bzero((caddr_t)sb, sizeof (*sb)); splx(s); @@ -958,7 +742,7 @@ sosetopt(so, level, optname, m0) } bad: if (m) - /*(void) m_free(m);*/ + (void) m_free(m); return (error); } @@ -1039,8 +823,8 @@ sogetopt(so, level, optname, mp) } default: - (void)m_free(m); - return (ENOPROTOOPT); + (void)m_free(m); + return (ENOPROTOOPT); } *mp = m; return (0); @@ -1057,5 +841,5 @@ sohasoutofband(so) gsignal(-so->so_pgid, SIGURG); else if (so->so_pgid > 0 && (p = pfind(so->so_pgid)) != 0) psignal(p, SIGURG); - selwakeup(&so->so_rcv.sb_sel); + wakeup(so, NULL, 0); } diff --git a/reactos/drivers/lib/oskittcp/oskittcp/uipc_socket2.c b/reactos/drivers/lib/oskittcp/oskittcp/uipc_socket2.c index f1f7d74c819..6c0f86f8f60 100644 --- a/reactos/drivers/lib/oskittcp/oskittcp/uipc_socket2.c +++ b/reactos/drivers/lib/oskittcp/oskittcp/uipc_socket2.c @@ -111,20 +111,14 @@ soisconnected(so) so->so_state &= ~(SS_ISCONNECTING|SS_ISDISCONNECTING|SS_ISCONFIRMING); so->so_state |= SS_ISCONNECTED; if (head && soqremque(so, 0)) { - soqinsque(head, so, 1); - sorwakeup(head); - wakeup((caddr_t)&head->so_timeo); + soqinsque(head, so, 1); + sorwakeup(head); + wakeup(so, NULL, (caddr_t)&head->so_timeo); } else { - wakeup((caddr_t)&so->so_timeo); - sorwakeup(so); - sowwakeup(so); + wakeup(so, NULL, (caddr_t)&so->so_timeo); + sorwakeup(so); + socwakeup(so); } - - if( OtcpEvent.SocketConnectIndication ) - OtcpEvent.SocketConnectIndication - ( OtcpEvent.ClientData, - so, - so->so_connection ); } void @@ -134,7 +128,7 @@ soisdisconnecting(so) so->so_state &= ~SS_ISCONNECTING; so->so_state |= (SS_ISDISCONNECTING|SS_CANTRCVMORE|SS_CANTSENDMORE); - wakeup((caddr_t)&so->so_timeo); + wakeup(so, NULL, (caddr_t)&so->so_timeo); sowwakeup(so); sorwakeup(so); } @@ -146,7 +140,7 @@ soisdisconnected(so) so->so_state &= ~(SS_ISCONNECTING|SS_ISCONNECTED|SS_ISDISCONNECTING); so->so_state |= (SS_CANTRCVMORE|SS_CANTSENDMORE); - wakeup((caddr_t)&so->so_timeo); + wakeup(so, NULL, (caddr_t)&so->so_timeo); sowwakeup(so); sorwakeup(so); } @@ -194,7 +188,7 @@ sonewconn1(head, connstatus) } if (connstatus) { sorwakeup(head); - wakeup((caddr_t)&head->so_timeo); + wakeup(so, NULL, (caddr_t)&head->so_timeo); so->so_state |= connstatus; } return (so); @@ -327,23 +321,7 @@ sowakeup(so, sb) { struct proc *p; - selwakeup(&sb->sb_sel); -#ifndef OSKIT - /* - * in the OS Kit, we do not want notifications to stop - */ - sb->sb_flags &= ~SB_SEL; -#endif - if (sb->sb_flags & SB_WAIT) { - sb->sb_flags &= ~SB_WAIT; - wakeup((caddr_t)&sb->sb_cc); - } - if (so->so_state & SS_ASYNC) { - if (so->so_pgid < 0) - gsignal(-so->so_pgid, SIGIO); - else if (so->so_pgid > 0 && (p = pfind(so->so_pgid)) != 0) - psignal(p, SIGIO); - } + wakeup(so, &sb->sb_sel, (caddr_t)&sb->sb_cc); } /* @@ -383,7 +361,6 @@ soreserve(so, sndcc, rcvcc) register struct socket *so; u_long sndcc, rcvcc; { - if (sbreserve(&so->so_snd, sndcc) == 0) goto bad; if (sbreserve(&so->so_rcv, rcvcc) == 0) @@ -470,28 +447,47 @@ sbappend(so, sb, m) struct sockbuf *sb; struct mbuf *m; { - register struct mbuf *n; + register struct mbuf *n, *new_mbuf; + + free( malloc( 2 ) ); if (m == 0) return; + n = sb->sb_mb; - if (n) { - while (n->m_nextpkt) - n = n->m_nextpkt; - do { - if (n->m_flags & M_EOR) { - sbappendrecord(sb, m); /* XXXXXX!!!! */ - return; - } - } while (n->m_next && (n = n->m_next)); + OS_DbgPrint(OSK_MID_TRACE,("sbappendrecord: %x\n", n)); + + while( n && n->m_nextpkt ) n = n->m_nextpkt; + + new_mbuf = malloc( sizeof( *m ) + m->m_len ); + memset( new_mbuf, 0, sizeof( *m ) ); + + free( malloc( 2 ) ); + + new_mbuf->m_type = MT_DATA; + free( malloc( 2 ) ); + + new_mbuf->m_len = m->m_len; + free( malloc( 2 ) ); + + new_mbuf->m_data = ((caddr_t)new_mbuf) + sizeof(*new_mbuf); + free( malloc( 2 ) ); + + memcpy( new_mbuf->m_data, m->m_data, m->m_len ); + + free( malloc( 2 ) ); + + if( n ) { + n->m_nextpkt = new_mbuf; + OS_DbgPrint(OSK_MID_TRACE,("SK BUFF NEW: %x\n", n->m_nextpkt)); + } else { + sb->sb_mb = new_mbuf; + OS_DbgPrint(OSK_MID_TRACE, + ("SK BUFF HEAD: %x (new pkt %d bytes)\n", + sb->sb_mb, sb->sb_mb->m_len)); } - OskitDumpBuffer( m->m_data, m->m_len ); - if( OtcpEvent.SocketDataAvailable ) - OtcpEvent.SocketDataAvailable - ( OtcpEvent.ClientData, - so, - so->so_connection, - m->m_data, m->m_len ); + + free( malloc( 2 ) ); } #ifdef SOCKBUF_DEBUG @@ -539,6 +535,7 @@ sbappendrecord(sb, m0) * Put the first mbuf on the queue. * Note this permits zero length records. */ + sballoc(sb, m0); if (m) m->m_nextpkt = m0; @@ -615,7 +612,7 @@ sbappendaddr(sb, asa, m0, control) int space = /*asa->sa_len;*/ sizeof(struct sockaddr); if (m0 && (m0->m_flags & M_PKTHDR) == 0) -panic("sbappendaddr"); + panic("sbappendaddr"); if (m0) space += m0->m_pkthdr.len; for (n = control; n; n = n->m_next) { @@ -709,6 +706,8 @@ sbcompress(sb, m, n) (unsigned)m->m_len); n->m_len += m->m_len; sb->sb_cc += m->m_len; + OS_DbgPrint(OSK_MID_TRACE,("SB->SB_CC = %d\n", + sb->sb_cc)); m = m_free(m); continue; } @@ -771,6 +770,8 @@ sbdrop(sb, len) m->m_len -= len; m->m_data += len; sb->sb_cc -= len; + OS_DbgPrint(OSK_MID_TRACE,("SB->SB_CC = %d\n", + sb->sb_cc)); break; } len -= m->m_len; diff --git a/reactos/drivers/net/ndis/ndis/buffer.c b/reactos/drivers/net/ndis/ndis/buffer.c index 1fd334c1a39..fe9825a4f1c 100644 --- a/reactos/drivers/net/ndis/ndis/buffer.c +++ b/reactos/drivers/net/ndis/ndis/buffer.c @@ -52,7 +52,6 @@ __inline ULONG SkipToOffset( return Offset; } - UINT CopyBufferToBufferChain( PNDIS_BUFFER DstBuffer, UINT DstOffset, @@ -355,6 +354,18 @@ NdisAllocateBuffer( "VirtualAddress (0x%X) Length (%d)\n", Status, Buffer, PoolHandle, VirtualAddress, Length)); +#if 0 + Temp = Pool->FreeList; + while( Temp ) { + NDIS_DbgPrint(MID_TRACE,("Free buffer -> %x\n", Temp)); + Temp = Temp->Next; + } + + NDIS_DbgPrint(MID_TRACE,("|:. <- End free buffers")); +#endif + + if(!VirtualAddress && !Length) return; + KeAcquireSpinLock(&Pool->SpinLock, &OldIrql); if (Pool->FreeList) { @@ -370,13 +381,13 @@ NdisAllocateBuffer( Temp->Mdl.MdlFlags |= (MDL_SOURCE_IS_NONPAGED_POOL | MDL_ALLOCATED_FIXED_SIZE); Temp->Mdl.MappedSystemVa = VirtualAddress; #else - Temp->Mdl.Next = (PMDL)NULL; - Temp->Mdl.Size = (CSHORT)(sizeof(MDL) + - (ADDRESS_AND_SIZE_TO_SPAN_PAGES(VirtualAddress, Length) * sizeof(ULONG))); - Temp->Mdl.MdlFlags = (MDL_SOURCE_IS_NONPAGED_POOL | MDL_ALLOCATED_FIXED_SIZE); -; Temp->Mdl.StartVa = (PVOID)PAGE_ROUND_DOWN(VirtualAddress); - Temp->Mdl.ByteOffset = (ULONG_PTR)(VirtualAddress - PAGE_ROUND_DOWN(VirtualAddress)); - Temp->Mdl.ByteCount = Length; + Temp->Mdl.Next = (PMDL)NULL; + Temp->Mdl.Size = (CSHORT)(sizeof(MDL) + + (ADDRESS_AND_SIZE_TO_SPAN_PAGES(VirtualAddress, Length) * sizeof(ULONG))); + Temp->Mdl.MdlFlags = (MDL_SOURCE_IS_NONPAGED_POOL | MDL_ALLOCATED_FIXED_SIZE); + ; Temp->Mdl.StartVa = (PVOID)PAGE_ROUND_DOWN(VirtualAddress); + Temp->Mdl.ByteOffset = (ULONG_PTR)(VirtualAddress - PAGE_ROUND_DOWN(VirtualAddress)); + Temp->Mdl.ByteCount = Length; Temp->Mdl.MappedSystemVa = VirtualAddress; #if 0 //Temp->Mdl.Process = PsGetCurrentProcess(); @@ -392,6 +403,8 @@ NdisAllocateBuffer( } else { KeReleaseSpinLock(&Pool->SpinLock, OldIrql); *Status = NDIS_STATUS_FAILURE; + NDIS_DbgPrint(MID_TRACE, ("Can't get another packet.\n")); + KeBugCheck(0); } } @@ -429,10 +442,12 @@ NdisAllocateBufferPool( if (NumberOfDescriptors > 0) { Buffer = &Pool->Buffers[0]; + DbgPrint("NDIS BUFFER ADDRESS << %x >>\n", Buffer); Pool->FreeList = Buffer; for (i = 1; i < NumberOfDescriptors; i++) { Buffer->Next = &Pool->Buffers[i]; Buffer = Buffer->Next; + DbgPrint("NDIS BUFFER ADDRESS << %x >>\n", Buffer); } Buffer->Next = NULL; } else @@ -850,8 +865,8 @@ NdisFreeBuffer( Pool = Temp->BufferPool; KeAcquireSpinLock(&Pool->SpinLock, &OldIrql); - Buffer->Next = (PMDL)Pool->FreeList; - Pool->FreeList = (PNETWORK_HEADER)Buffer; + Temp->Next = (PNETWORK_HEADER)Pool->FreeList; + Pool->FreeList = (PNETWORK_HEADER)Temp; KeReleaseSpinLock(&Pool->SpinLock, OldIrql); } diff --git a/reactos/drivers/net/ndis/ndis/miniport.c b/reactos/drivers/net/ndis/ndis/miniport.c index 575396f4c87..bea89356f40 100644 --- a/reactos/drivers/net/ndis/ndis/miniport.c +++ b/reactos/drivers/net/ndis/ndis/miniport.c @@ -322,6 +322,8 @@ MiniEthReceiveComplete( NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n")); + if( !Filter ) return; + Adapter = (PLOGICAL_ADAPTER)Filter->Miniport; NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n")); @@ -372,13 +374,15 @@ MiniEthReceiveIndication( * PacketSize = Total size of received packet */ { - MiniIndicateData((PLOGICAL_ADAPTER)Filter->Miniport, - MacReceiveContext, - HeaderBuffer, - HeaderBufferSize, - LookaheadBuffer, - LookaheadBufferSize, - PacketSize); + if( Filter ) { + MiniIndicateData((PLOGICAL_ADAPTER)Filter->Miniport, + MacReceiveContext, + HeaderBuffer, + HeaderBufferSize, + LookaheadBuffer, + LookaheadBufferSize, + PacketSize); + } } @@ -1555,6 +1559,7 @@ NdisIStartAdapter( NDIS_DbgPrint(MIN_TRACE, ("error: unsupported media\n")); ExFreePool(Adapter); ASSERT(FALSE); + KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); return; } diff --git a/reactos/drivers/net/ndis/ndis/protocol.c b/reactos/drivers/net/ndis/ndis/protocol.c index 6cc859ab264..8fbbd2cd50c 100644 --- a/reactos/drivers/net/ndis/ndis/protocol.c +++ b/reactos/drivers/net/ndis/ndis/protocol.c @@ -411,6 +411,7 @@ ProTransferData( /* XXX sd - why is that true? */ if (Packet == Adapter->LoopPacket) { + NDIS_DbgPrint(MAX_TRACE, ("LoopPacket\n")); /* NDIS is responsible for looping this packet */ NdisCopyFromPacketToPacket(Packet, ByteOffset, diff --git a/reactos/drivers/net/tcpip/datalink/arp.c b/reactos/drivers/net/tcpip/datalink/arp.c index 80f5f2c0e35..b66b63574c8 100644 --- a/reactos/drivers/net/tcpip/datalink/arp.c +++ b/reactos/drivers/net/tcpip/datalink/arp.c @@ -7,6 +7,7 @@ * REVISIONS: * CSH 01/08-2000 Created */ +#include <roscfg.h> #include <tcpip.h> #include <arp.h> #include <routines.h> @@ -43,42 +44,25 @@ PNDIS_PACKET PrepareARPPacket( */ { PNDIS_PACKET NdisPacket; - PNDIS_BUFFER NdisBuffer; NDIS_STATUS NdisStatus; PARP_HEADER Header; PVOID DataBuffer; - ULONG Size; + ULONG Size, Contig; TI_DbgPrint(DEBUG_ARP, ("Called.\n")); /* Prepare ARP packet */ - Size = MaxLLHeaderSize + sizeof(ARP_HEADER) + + Size = MaxLLHeaderSize + + sizeof(ARP_HEADER) + 2 * LinkAddressLength + /* Hardware address length */ 2 * ProtoAddressLength; /* Protocol address length */ Size = MAX(Size, MinLLFrameSize); - DataBuffer = ExAllocatePool(NonPagedPool, Size); - if (!DataBuffer) - return NULL; + NdisStatus = AllocatePacketWithBuffer( &NdisPacket, NULL, Size ); + if( !NT_SUCCESS(NdisStatus) ) return NULL; - /* Allocate NDIS packet */ - NdisAllocatePacket(&NdisStatus, &NdisPacket, GlobalPacketPool); - if (NdisStatus != NDIS_STATUS_SUCCESS) { - ExFreePool(DataBuffer); - return NULL; - } + GetDataPtr( NdisPacket, 0, &DataBuffer, &Contig ); - /* Allocate NDIS buffer for maximum link level header and ARP packet */ - NdisAllocateBuffer(&NdisStatus, &NdisBuffer, GlobalBufferPool, - DataBuffer, Size); - if (NdisStatus != NDIS_STATUS_SUCCESS) { - NdisFreePacket(NdisPacket); - ExFreePool(DataBuffer); - return NULL; - } - - /* Link NDIS buffer into packet */ - NdisChainBufferAtFront(NdisPacket, NdisBuffer); RtlZeroMemory(DataBuffer, Size); Header = (PARP_HEADER)((ULONG_PTR)DataBuffer + MaxLLHeaderSize); Header->HWType = HardwareType; @@ -126,7 +110,6 @@ VOID ARPTransmitComplete( */ { TI_DbgPrint(DEBUG_ARP, ("Called.\n")); - FreeNdisPacket(NdisPacket); } diff --git a/reactos/drivers/net/tcpip/datalink/lan.c b/reactos/drivers/net/tcpip/datalink/lan.c index fb84e4cdc58..b7639557e5d 100644 --- a/reactos/drivers/net/tcpip/datalink/lan.c +++ b/reactos/drivers/net/tcpip/datalink/lan.c @@ -7,6 +7,7 @@ * REVISIONS: * CSH 01/08-2000 Created */ +#include <roscfg.h> #include <tcpip.h> #include <lan.h> #include <address.h> @@ -20,7 +21,6 @@ BOOLEAN ProtocolRegistered = FALSE; LIST_ENTRY AdapterListHead; KSPIN_LOCK AdapterListLock; - NDIS_STATUS NDISCall( PLAN_ADAPTER Adapter, NDIS_REQUEST_TYPE Type, @@ -73,72 +73,6 @@ NDIS_STATUS NDISCall( } -PNDIS_PACKET AllocateTDPacket( - PLAN_ADAPTER Adapter) -/* - * FUNCTION: Allocates an NDIS packet for NdisTransferData - * ARGUMENTS: - * Adapter = Pointer to LAN_ADAPTER structure - * RETURNS: - * Pointer to NDIS packet or NULL if there was not enough free - * non-paged memory - */ -{ - NDIS_STATUS NdisStatus; - PNDIS_PACKET NdisPacket; - PNDIS_BUFFER Buffer; - PVOID Data; - - NdisAllocatePacket(&NdisStatus, &NdisPacket, GlobalPacketPool); - if (NdisStatus != NDIS_STATUS_SUCCESS) - return NULL; - - Data = ExAllocatePool(NonPagedPool, Adapter->MTU); - if (!Data) { - NdisFreePacket(NdisPacket); - return NULL; - } - - NdisAllocateBuffer(&NdisStatus, - &Buffer, - GlobalBufferPool, - Data, - Adapter->MTU); - if (NdisStatus != NDIS_STATUS_SUCCESS) { - NdisFreePacket(NdisPacket); - ExFreePool(Data); - return NULL; - } - - NdisChainBufferAtFront(NdisPacket, Buffer); - - PC(NdisPacket)->Context = NULL; /* End of list */ - - return NdisPacket; -} - - -VOID FreeTDPackets( - PLAN_ADAPTER Adapter) -/* - * FUNCTION: Frees transfer data packets - * ARGUMENTS: - * Adapter = Pointer to LAN_ADAPTER structure - */ -{ - PNDIS_PACKET NdisPacket, Next; - - /* Release transfer data packets */ - NdisPacket = Adapter->TDPackets; - while (NdisPacket) { - Next = PC(NdisPacket)->Context; - FreeNdisPacket(NdisPacket); - NdisPacket = Next; - } - Adapter->TDPackets = NULL; -} - - VOID FreeAdapter( PLAN_ADAPTER Adapter) /* @@ -147,8 +81,7 @@ VOID FreeAdapter( * Adapter = Pointer to LAN_ADAPTER structure to free */ { - FreeTDPackets(Adapter); - ExFreePool(Adapter); + exFreePool(Adapter); } @@ -241,12 +174,11 @@ VOID STDCALL ProtocolSendComplete( * Status = Status of the operation */ { - PLAN_ADAPTER Adapter = (PLAN_ADAPTER)BindingContext; + PLAN_ADAPTER Adapter = (PLAN_ADAPTER)BindingContext; TI_DbgPrint(DEBUG_DATALINK, ("Called.\n")); AdjustPacket(Packet, Adapter->HeaderSize, PC(Packet)->DLOffset); - (*PC(Packet)->DLComplete)(Adapter->Context, Packet, Status); } @@ -285,28 +217,35 @@ VOID STDCALL ProtocolTransferDataComplete( &IPPacket.ContigSize, &IPPacket.TotalSize); + IPPacket.ContigSize = IPPacket.TotalSize = BytesTransferred; /* Determine which upper layer protocol that should receive this packet and pass it to the correct receive handler */ + + OskitDumpBuffer( IPPacket.Header, BytesTransferred ); + PacketType = ((PETH_HEADER)IPPacket.Header)->EType; + IPPacket.Header += MaxLLHeaderSize; + + TI_DbgPrint + (DEBUG_DATALINK, + ("Ether Type = %x ContigSize = %d Total = %d\n", + PacketType, IPPacket.ContigSize, IPPacket.TotalSize)); + switch (PacketType) { case ETYPE_IPv4: case ETYPE_IPv6: + TI_DbgPrint(MID_TRACE,("Received IP Packet\n")); IPReceive(Adapter->Context, &IPPacket); break; case ETYPE_ARP: + TI_DbgPrint(MID_TRACE,("Received ARP Packet\n")); ARPReceive(Adapter->Context, &IPPacket); default: break; } } - /* Release the packet descriptor */ - KeAcquireSpinLockAtDpcLevel(&Adapter->Lock); - - PC(Packet)->Context = Adapter->TDPackets; - Adapter->TDPackets = Packet; - - KeReleaseSpinLockFromDpcLevel(&Adapter->Lock); + FreeNdisPacket( Packet ); } @@ -333,8 +272,10 @@ NDIS_STATUS STDCALL ProtocolReceive( */ { USHORT EType; - UINT PacketType; + UINT PacketType, BytesTransferred; IP_PACKET IPPacket; + PCHAR BufferData; + NDIS_STATUS NdisStatus; PNDIS_PACKET NdisPacket; PNDIS_BUFFER NdisBuffer; PLAN_ADAPTER Adapter = (PLAN_ADAPTER)BindingContext; @@ -374,22 +315,13 @@ NDIS_STATUS STDCALL ProtocolReceive( /* Get a transfer data packet */ KeAcquireSpinLockAtDpcLevel(&Adapter->Lock); + NdisStatus = AllocatePacketWithBuffer( &NdisPacket, NULL, Adapter->MTU ); + if( NdisStatus != NDIS_STATUS_SUCCESS ) return NDIS_STATUS_NOT_ACCEPTED; + GetDataPtr( NdisPacket, 0, &BufferData, &PacketSize ); - NdisPacket = Adapter->TDPackets; - if (NdisPacket == (PNDIS_PACKET)NULL) { - TI_DbgPrint(DEBUG_DATALINK, ("No available packet descriptors.\n")); - /* We don't have a free packet descriptor. Drop the packet */ - KeReleaseSpinLockFromDpcLevel(&Adapter->Lock); - return NDIS_STATUS_SUCCESS; - } - Adapter->TDPackets = PC(NdisPacket)->Context; - - KeReleaseSpinLockFromDpcLevel(&Adapter->Lock); - + IPPacket.NdisPacket = NdisPacket; + if (LookaheadBufferSize < PacketSize) { - NDIS_STATUS NdisStatus; - UINT BytesTransferred; - /* Get the data */ NdisTransferData(&NdisStatus, Adapter->NdisHandle, @@ -398,45 +330,23 @@ NDIS_STATUS STDCALL ProtocolReceive( PacketSize, NdisPacket, &BytesTransferred); - if (NdisStatus != NDIS_STATUS_PENDING) - ProtocolTransferDataComplete(BindingContext, - NdisPacket, - NdisStatus, - BytesTransferred); - - return NDIS_STATUS_SUCCESS; + } else { + NdisStatus = NDIS_STATUS_SUCCESS; + BytesTransferred = PacketSize; + RtlCopyMemory(BufferData, + HeaderBuffer, + HeaderBufferSize); + RtlCopyMemory(BufferData + HeaderBufferSize, + LookaheadBuffer, LookaheadBufferSize); } - /* We got all the data in the lookahead buffer */ - - IPPacket.NdisPacket = NdisPacket; - - NdisGetFirstBufferFromPacket(NdisPacket, - &NdisBuffer, - &IPPacket.Header, - &IPPacket.ContigSize, - &IPPacket.TotalSize); - - RtlCopyMemory(IPPacket.Header, LookaheadBuffer, PacketSize); - - switch (PacketType) { - case ETYPE_IPv4: - case ETYPE_IPv6: - IPReceive(Adapter->Context, &IPPacket); - break; - case ETYPE_ARP: - ARPReceive(Adapter->Context, &IPPacket); - break; - default: - break; - } + if (NdisStatus != NDIS_STATUS_PENDING) + ProtocolTransferDataComplete(BindingContext, + NdisPacket, + NdisStatus, + BytesTransferred); /* Release the packet descriptor */ - KeAcquireSpinLockAtDpcLevel(&Adapter->Lock); - - PC(NdisPacket)->Context = Adapter->TDPackets; - Adapter->TDPackets = NdisPacket; - KeReleaseSpinLockFromDpcLevel(&Adapter->Lock); return NDIS_STATUS_SUCCESS; @@ -537,7 +447,7 @@ VOID LANTransmit( area so it can be undone before we release the packet */ Data = AdjustPacket(NdisPacket, Offset, Adapter->HeaderSize); PC(NdisPacket)->DLOffset = Offset; - + if (Adapter->State == LAN_STATE_STARTED) { switch (Adapter->Media) { case NdisMedium802_3: @@ -633,7 +543,7 @@ static NTSTATUS ReadIPAddressFromRegistry( HANDLE RegHandle, if(!AnsiLen) return STATUS_NO_MEMORY; - AnsiAddress.Buffer = ExAllocatePoolWithTag(PagedPool, AnsiLen, 0x01020304); + AnsiAddress.Buffer = exAllocatePoolWithTag(PagedPool, AnsiLen, 0x01020304); if(!AnsiAddress.Buffer) return STATUS_NO_MEMORY; @@ -642,14 +552,14 @@ static NTSTATUS ReadIPAddressFromRegistry( HANDLE RegHandle, Status = RtlUnicodeStringToAnsiString(&AnsiAddress, &UnicodeAddress, FALSE); if (!NT_SUCCESS(Status)) { - ExFreePool(AnsiAddress.Buffer); + exFreePool(AnsiAddress.Buffer); return STATUS_UNSUCCESSFUL; } AnsiAddress.Buffer[AnsiAddress.Length] = 0; *Address = AddrBuildIPv4(inet_addr(AnsiAddress.Buffer)); if (!Address) { - ExFreePool(AnsiAddress.Buffer); + exFreePool(AnsiAddress.Buffer); return STATUS_UNSUCCESSFUL; } @@ -693,20 +603,6 @@ VOID BindAdapter( return; } - /* Allocate packets for NdisTransferData */ - /* FIXME: How many should we allocate? */ - Adapter->TDPackets = NULL; - for (i = 0; i < 2; i++) { - Packet = AllocateTDPacket(Adapter); - if (!Packet) { - TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); - FreeTDPackets(Adapter); - return; - } - PC(Packet)->Context = Adapter->TDPackets; - Adapter->TDPackets = Packet; - } - /* Bind the adapter to IP layer */ BindInfo.Context = Adapter; BindInfo.HeaderSize = Adapter->HeaderSize; @@ -717,9 +613,9 @@ VOID BindAdapter( BindInfo.Transmit = LANTransmit; IF = IPCreateInterface(&BindInfo); + if (!IF) { TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); - FreeTDPackets(Adapter); return; } @@ -750,7 +646,6 @@ VOID BindAdapter( ZwClose(RegHandle); if(Address) Address->Free(Address); if(Netmask) Netmask->Free(Netmask); - FreeTDPackets(Adapter); IPDestroyInterface(IF); return; } @@ -769,7 +664,6 @@ VOID BindAdapter( if (!IPCreateNTE(IF, Address, AddrCountPrefixBits(Netmask))) { Netmask->Free(Netmask); TI_DbgPrint(MIN_TRACE, ("IPCreateNTE() failed.\n")); - FreeTDPackets(Adapter); IPDestroyInterface(IF); return; } @@ -791,13 +685,11 @@ VOID BindAdapter( sizeof(UINT)); if (NdisStatus != NDIS_STATUS_SUCCESS) { TI_DbgPrint(MID_TRACE, ("Could not set packet filter (0x%X).\n", NdisStatus)); - FreeTDPackets(Adapter); IPDestroyInterface(IF); return; } Adapter->Context = IF; - Adapter->State = LAN_STATE_STARTED; } @@ -818,9 +710,6 @@ VOID UnbindAdapter( IPUnregisterInterface(IF); IPDestroyInterface(IF); - - /* Free transfer data packets */ - FreeTDPackets(Adapter); } } @@ -848,7 +737,7 @@ NDIS_STATUS LANRegisterAdapter( TI_DbgPrint(DEBUG_DATALINK, ("Called.\n")); - IF = ExAllocatePool(NonPagedPool, sizeof(LAN_ADAPTER)); + IF = exAllocatePool(NonPagedPool, sizeof(LAN_ADAPTER)); if (!IF) { TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); return NDIS_STATUS_RESOURCES; @@ -885,7 +774,7 @@ NDIS_STATUS LANRegisterAdapter( if (NdisStatus == NDIS_STATUS_PENDING) KeWaitForSingleObject(&IF->Event, UserRequest, KernelMode, FALSE, NULL); else if (NdisStatus != NDIS_STATUS_SUCCESS) { - ExFreePool(IF); + exFreePool(IF); return NdisStatus; } @@ -910,7 +799,7 @@ NDIS_STATUS LANRegisterAdapter( default: /* Unsupported media */ TI_DbgPrint(MIN_TRACE, ("Unsupported media.\n")); - ExFreePool(IF); + exFreePool(IF); return NDIS_STATUS_NOT_SUPPORTED; } @@ -921,7 +810,7 @@ NDIS_STATUS LANRegisterAdapter( &IF->MTU, sizeof(UINT)); if (NdisStatus != NDIS_STATUS_SUCCESS) { - ExFreePool(IF); + exFreePool(IF); return NdisStatus; } @@ -933,7 +822,7 @@ NDIS_STATUS LANRegisterAdapter( sizeof(UINT)); if (NdisStatus != NDIS_STATUS_SUCCESS) { TI_DbgPrint(MIN_TRACE, ("Query for maximum packet size failed.\n")); - ExFreePool(IF); + exFreePool(IF); return NdisStatus; } @@ -956,7 +845,7 @@ NDIS_STATUS LANRegisterAdapter( IF->HWAddressLength); if (NdisStatus != NDIS_STATUS_SUCCESS) { TI_DbgPrint(MIN_TRACE, ("Query for current hardware address failed.\n")); - ExFreePool(IF); + exFreePool(IF); return NdisStatus; } @@ -968,7 +857,7 @@ NDIS_STATUS LANRegisterAdapter( sizeof(UINT)); if (NdisStatus != NDIS_STATUS_SUCCESS) { TI_DbgPrint(MIN_TRACE, ("Query for maximum link speed failed.\n")); - ExFreePool(IF); + exFreePool(IF); return NdisStatus; } diff --git a/reactos/drivers/net/tcpip/datalink/loopback.c b/reactos/drivers/net/tcpip/datalink/loopback.c index beaca01f08b..cf0f72d3458 100644 --- a/reactos/drivers/net/tcpip/datalink/loopback.c +++ b/reactos/drivers/net/tcpip/datalink/loopback.c @@ -7,6 +7,7 @@ * REVISIONS: * CSH 01/08-2000 Created */ +#include <roscfg.h> #include <tcpip.h> #include <loopback.h> #include <ip.h> @@ -169,6 +170,7 @@ NDIS_STATUS LoopRegisterAdapter( BindInfo.Transmit = LoopTransmit; Loopback = IPCreateInterface(&BindInfo); + if ((Loopback != NULL) && (IPCreateNTE(Loopback, Address, 8))) { /* Reference the interface for the NTE. The reference for diff --git a/reactos/drivers/net/tcpip/include/datagram.h b/reactos/drivers/net/tcpip/include/datagram.h index f2cc413064c..3d11136fbc9 100644 --- a/reactos/drivers/net/tcpip/include/datagram.h +++ b/reactos/drivers/net/tcpip/include/datagram.h @@ -35,9 +35,7 @@ NTSTATUS DGTransmit( NTSTATUS DGSendDatagram( PTDI_REQUEST Request, PTDI_CONNECTION_INFORMATION ConnInfo, - PNDIS_BUFFER Buffer, - ULONG DataSize, - DATAGRAM_BUILD_ROUTINE Build); + PIP_PACKET Packet); NTSTATUS DGReceiveDatagram( PTDI_REQUEST Request, diff --git a/reactos/drivers/net/tcpip/include/debug.h b/reactos/drivers/net/tcpip/include/debug.h index 83ad8c95301..fffbe2c7781 100644 --- a/reactos/drivers/net/tcpip/include/debug.h +++ b/reactos/drivers/net/tcpip/include/debug.h @@ -57,6 +57,7 @@ extern DWORD DebugTraceLevel; #endif /* _MSC_VER */ +#if 0 #ifdef ASSERT #undef ASSERT #endif @@ -66,6 +67,7 @@ extern DWORD DebugTraceLevel; #else /* NASSERT */ #define ASSERT(x) if (!(x)) { TI_DbgPrint(MIN_TRACE, ("Assertion "#x" failed at %s:%d\n", __FILE__, __LINE__)); KeBugCheck(0); } #endif /* NASSERT */ +#endif #define ASSERT_IRQL(x) ASSERT(KeGetCurrentIrql() <= (x)) @@ -73,8 +75,10 @@ extern DWORD DebugTraceLevel; #define TI_DbgPrint(_t_, _x_) +#if 0 #define ASSERT_IRQL(x) #define ASSERT(x) +#endif #endif /* DBG */ @@ -103,6 +107,8 @@ extern DWORD DebugTraceLevel; #define CP CHECKPOINT +#include <memtrack.h> + #endif /* __DEBUG_H */ /* EOF */ diff --git a/reactos/drivers/net/tcpip/include/info.h b/reactos/drivers/net/tcpip/include/info.h index 2ead71a6e88..bb14a1d72a8 100644 --- a/reactos/drivers/net/tcpip/include/info.h +++ b/reactos/drivers/net/tcpip/include/info.h @@ -48,7 +48,7 @@ typedef struct IPADDR_ENTRY { typedef struct IPROUTE_ENTRY { ULONG Dest; - ULONG Index; //matches if_index in IFEntry and iae_index in IPAddrEntry + ULONG Index; //matches if_index in IFEntry and iae_index in IPAddrEntry ULONG Metric1; ULONG Metric2; ULONG Metric3; @@ -87,13 +87,13 @@ typedef struct IFENTRY { #define IP_MIB_STATS_ID 1 #define IF_MIB_STATS_ID 1 + +#ifndef IP_MIB_ROUTETABLE_ENTRY_ID +#define IP_MIB_ROUTETABLE_ENTRY_ID 0x101 +#endif #ifndef IP_MIB_ADDRTABLE_ENTRY_ID #define IP_MIB_ADDRTABLE_ENTRY_ID 0x102 #endif -#ifndef IP_MIB_ROUTETABLE_ENTRY_ID -#define IP_MIB_ROUTETABLE_ENTRY_ID 0x103 -#endif - #ifndef MAX_PHYSADDR_SIZE #define MAX_PHYSADDR_SIZE 8 #endif @@ -137,6 +137,59 @@ TDI_STATUS InfoTdiSetInformationEx( PVOID Buffer, UINT BufferSize); +/* Network layer info functions */ +TDI_STATUS InfoNetworkLayerTdiQueryEx( UINT InfoClass, + UINT InfoType, + UINT InfoId, + PVOID Context, + TDIEntityID *id, + PNDIS_BUFFER Buffer, + PUINT BufferSize ); + +TDI_STATUS InfoNetworkLayerTdiSetEx( UINT InfoClass, + UINT InfoType, + UINT InfoId, + PVOID Context, + TDIEntityID *id, + PCHAR Buffer, + UINT BufferSize ); + +TDI_STATUS InfoTransportLayerTdiQueryEx( UINT InfoClass, + UINT InfoType, + UINT InfoId, + PVOID Context, + TDIEntityID *id, + PNDIS_BUFFER Buffer, + PUINT BufferSize ); + +TDI_STATUS InfoTransportLayerTdiSetEx( UINT InfoClass, + UINT InfoType, + UINT InfoId, + PVOID Context, + TDIEntityID *id, + PCHAR Buffer, + UINT BufferSize ); + +TDI_STATUS InfoInterfaceTdiQueryEx( UINT InfoClass, + UINT InfoType, + UINT InfoId, + PVOID Context, + TDIEntityID *id, + PNDIS_BUFFER Buffer, + PUINT BufferSize ); + +TDI_STATUS InfoInterfaceTdiSetEx( UINT InfoClass, + UINT InfoType, + UINT InfoId, + PVOID Context, + TDIEntityID *id, + PCHAR Buffer, + UINT BufferSize ); + +/* Insert and remove interface entities */ +VOID InsertTDIInterfaceEntity( PIP_INTERFACE Interface ); +VOID RemoveTDIInterfaceEntity( PIP_INTERFACE Interface ); + #endif /* __INFO_H */ /* EOF */ diff --git a/reactos/drivers/net/tcpip/include/interface.h b/reactos/drivers/net/tcpip/include/interface.h new file mode 100644 index 00000000000..7269208438d --- /dev/null +++ b/reactos/drivers/net/tcpip/include/interface.h @@ -0,0 +1,16 @@ +#ifndef _TCPIP_INTERFACE_H +#define _TCPIP_INTERFACE_H + +#include <ip.h> + +NTSTATUS GetInterfaceIPv4Address( PIP_INTERFACE Interface, + ULONG Type, + PULONG Address ); + +UINT CountInterfaces(); + +NTSTATUS GetInterfaceSpeed( PIP_INTERFACE Interface, PUINT Speed ); +NTSTATUS GetInterfaceName( PIP_INTERFACE Interface, PCHAR NameBuffer, + UINT NameMaxLen ); + +#endif//_TCPIP_INTERFACE_H diff --git a/reactos/drivers/net/tcpip/include/ip.h b/reactos/drivers/net/tcpip/include/ip.h index 6c2b7190861..70716677e06 100644 --- a/reactos/drivers/net/tcpip/include/ip.h +++ b/reactos/drivers/net/tcpip/include/ip.h @@ -9,6 +9,7 @@ typedef VOID (*OBJECT_FREE_ROUTINE)(PVOID Object); +#define FOURCC(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d)) /* Raw IPv4 style address */ typedef ULONG IPv4_RAW_ADDRESS; @@ -93,7 +94,6 @@ typedef struct _PACKET_CONTEXT { /* The ProtocolReserved field is structured as a PACKET_CONTEXT */ #define PC(Packet) ((PPACKET_CONTEXT)(&Packet->ProtocolReserved)) - /* Address information a.k.a ADE */ typedef struct _ADDRESS_ENTRY { DEFINE_TAG @@ -105,10 +105,12 @@ typedef struct _ADDRESS_ENTRY { PIP_ADDRESS Address; /* Pointer to address identifying this entry */ } ADDRESS_ENTRY, *PADDRESS_ENTRY; -/* Values for address type */ -#define ADE_UNICAST 0x01 -#define ADE_MULTICAST 0x02 -#define ADE_ADDRMASK 0x03 +/* Values for address type -- also the interface flags */ +/* These values are mean to overlap meaningfully with the BSD ones */ +#define ADE_UNICAST 0x01 +#define ADE_MULTICAST 0x02 +#define ADE_ADDRMASK 0x04 +#define ADE_POINTOPOINT 0x10 /* There is one NTE for each source (unicast) address assigned to an interface */ typedef struct _NET_TABLE_ENTRY { @@ -162,17 +164,6 @@ typedef struct _IP_INTERFACE { } IP_INTERFACE, *PIP_INTERFACE; -/* Prefix List Entry */ -typedef struct _PREFIX_LIST_ENTRY { - DEFINE_TAG - LIST_ENTRY ListEntry; /* Entry on list */ - ULONG RefCount; /* Reference count */ - PIP_INTERFACE Interface; /* Pointer to interface */ - PIP_ADDRESS Prefix; /* Pointer to prefix */ - UINT PrefixLength; /* Length of prefix */ -} PREFIX_LIST_ENTRY, *PPREFIX_LIST_ENTRY; - - #define IP_PROTOCOL_TABLE_SIZE 0x100 typedef VOID (*IP_PROTOCOL_HANDLER)( @@ -202,8 +193,6 @@ extern LIST_ENTRY InterfaceListHead; extern KSPIN_LOCK InterfaceListLock; extern LIST_ENTRY NetTableListHead; extern KSPIN_LOCK NetTableListLock; -extern LIST_ENTRY PrefixListHead; -extern KSPIN_LOCK PrefixListLock; extern UINT MaxLLHeaderSize; extern UINT MinLLFrameSize; diff --git a/reactos/drivers/net/tcpip/include/lan.h b/reactos/drivers/net/tcpip/include/lan.h index 7fe2631ea50..fc59398c09f 100644 --- a/reactos/drivers/net/tcpip/include/lan.h +++ b/reactos/drivers/net/tcpip/include/lan.h @@ -56,7 +56,6 @@ typedef struct LAN_ADAPTER { UINT MacOptions; /* MAC options for NIC driver/adapter */ UINT Speed; /* Link speed */ UINT PacketFilter; /* Packet filter for this adapter */ - PNDIS_PACKET TDPackets; /* Transfer Data packets */ } LAN_ADAPTER, *PLAN_ADAPTER; /* LAN adapter state constants */ diff --git a/reactos/drivers/net/tcpip/include/memtrack.h b/reactos/drivers/net/tcpip/include/memtrack.h new file mode 100644 index 00000000000..bdffba6eb7d --- /dev/null +++ b/reactos/drivers/net/tcpip/include/memtrack.h @@ -0,0 +1,74 @@ +#ifndef MEMTRACK_H +#define MEMTRACK_H + +#ifndef FOURCC +#define FOURCC(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d)) +#endif + +#define FBSD_MALLOC FOURCC('d','s','b','f') +#define EXALLOC_TAG FOURCC('E','x','A','l') + +#define AllocatePacketWithBuffer(x,y,z) AllocatePacketWithBufferX(x,y,z,__FILE__,__LINE__) +#define FreeNdisPacket(x) FreeNdisPacketX(x,__FILE__,__LINE__) + +#ifdef MEMTRACK +#define MTMARK() TrackDumpFL(__FILE__, __LINE__) +#define NdisAllocateBuffer(x,y,z,a,b) { \ + NdisAllocateBuffer(x,y,z,a,b); \ + if( *x == NDIS_STATUS_SUCCESS ) { \ + Track(NDIS_BUFFER_TAG, *y); \ + } \ +} +#define NdisAllocatePacket(x,y,z) { \ + NdisAllocatePacket(x,y,z); \ + if( *x == NDIS_STATUS_SUCCESS ) { \ + Track(NDIS_PACKET_TAG, *y); \ + } \ +} +#define NdisFreePacket(x) { Untrack(x); NdisFreePacket(x); } +#define NdisFreeBuffer(x) { Untrack(x); NdisFreeBuffer(x); } +#define exAllocatePool(x,y) ExAllocatePoolX(x,y,__FILE__,__LINE__) +#define exAllocatePoolWithTag(x,y,z) ExAllocatePoolX(x,y,__FILE__,__LINE__) +#define exFreePool(x) ExFreePoolX(x,__FILE__,__LINE__) + +extern LIST_ENTRY AllocatedObjectsHead; +extern KSPIN_LOCK AllocatedObjectsLock; + +typedef struct _ALLOCATION_TRACKER { + LIST_ENTRY Entry; + DWORD Tag; + PVOID Thing; + PCHAR FileName; + DWORD LineNo; +} ALLOCATION_TRACKER, *PALLOCATION_TRACKER; + +VOID TrackingInit(); +VOID TrackWithTag( DWORD Tag, PVOID Thing, PCHAR File, DWORD Line ); +#define Track(Tag,Thing) TrackWithTag(Tag,Thing,__FILE__,__LINE__) +VOID UntrackFL( PCHAR File, DWORD Line, PVOID Thing ); +#define Untrack(Thing) UntrackFL(__FILE__,__LINE__,Thing) +VOID TrackDumpFL( PCHAR File, DWORD Line ); +#define TrackDump() TrackDumpFL(__FILE__,__LINE__) +VOID TrackTag( DWORD Tag ); + +static inline PVOID ExAllocatePoolX( POOL_TYPE type, SIZE_T size, PCHAR File, ULONG Line ) { + PVOID Out = ExAllocatePool( type, size ); + if( Out ) TrackWithTag( EXALLOC_TAG, Out, File, Line ); + return Out; +} +static inline VOID ExFreePoolX( PVOID Data, PCHAR File, ULONG Line ) { + UntrackFL(File, Line, Data); + ExFreePool(Data); +} + +#define MEMTRACK_MAX_TAGS_TO_TRACK 64 +#else +#define MTMARK() +#define Track(x,y) +#define TrackingInit() +#define TrackDump() +#define Untrack(x) +#define TrackTag(x) +#endif + +#endif/*MEMMTRAC_H*/ diff --git a/reactos/drivers/net/tcpip/include/prefix.h b/reactos/drivers/net/tcpip/include/prefix.h new file mode 100644 index 00000000000..21eb7544019 --- /dev/null +++ b/reactos/drivers/net/tcpip/include/prefix.h @@ -0,0 +1,28 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS TCP/IP protocol driver + * FILE: include/info.h + * PURPOSE: TdiQueryInformation definitions + */ +#ifndef __PREFIX_H +#define __PREFIX_H + +/* Prefix List Entry */ +typedef struct _PREFIX_LIST_ENTRY { + DEFINE_TAG + LIST_ENTRY ListEntry; /* Entry on list */ + ULONG RefCount; /* Reference count */ + PIP_INTERFACE Interface; /* Pointer to interface */ + PIP_ADDRESS Prefix; /* Pointer to prefix */ + UINT PrefixLength; /* Length of prefix */ +} PREFIX_LIST_ENTRY, *PPREFIX_LIST_ENTRY; + +extern LIST_ENTRY PrefixListHead; +extern KSPIN_LOCK PrefixListLock; + +VOID InitPLE(); +PPREFIX_LIST_ENTRY CreatePLE(PIP_INTERFACE IF, PIP_ADDRESS Prefix, UINT Len); +VOID DestroyPLE(PPREFIX_LIST_ENTRY PLE); +VOID DestroyPLEs(); + +#endif/*__PREFIX_H*/ diff --git a/reactos/drivers/net/tcpip/include/router.h b/reactos/drivers/net/tcpip/include/router.h index d6157ba8410..117d2133af6 100644 --- a/reactos/drivers/net/tcpip/include/router.h +++ b/reactos/drivers/net/tcpip/include/router.h @@ -17,7 +17,6 @@ typedef struct _FIB_ENTRY { OBJECT_FREE_ROUTINE Free; /* Routine used to free resources for the object */ PIP_ADDRESS NetworkAddress; /* Address of network */ PIP_ADDRESS Netmask; /* Netmask of network */ - PNET_TABLE_ENTRY NTE; /* Pointer to NTE to use */ PNEIGHBOR_CACHE_ENTRY Router; /* Pointer to NCE of router to use */ UINT Metric; /* Cost of this route */ } FIB_ENTRY, *PFIB_ENTRY; @@ -34,7 +33,6 @@ PIP_INTERFACE RouterFindOnLinkInterface( PFIB_ENTRY RouterAddRoute( PIP_ADDRESS NetworkAddress, PIP_ADDRESS Netmask, - PNET_TABLE_ENTRY NTE, PNEIGHBOR_CACHE_ENTRY Router, UINT Metric); @@ -58,6 +56,10 @@ NTSTATUS RouterStartup( NTSTATUS RouterShutdown( VOID); +UINT CountFIBs(); + +UINT CopyFIBs( PFIB_ENTRY Target ); + #endif /* __ROUTER_H */ /* EOF */ diff --git a/reactos/drivers/net/tcpip/include/routines.h b/reactos/drivers/net/tcpip/include/routines.h index 350309a797f..2c546f5247c 100644 --- a/reactos/drivers/net/tcpip/include/routines.h +++ b/reactos/drivers/net/tcpip/include/routines.h @@ -8,25 +8,7 @@ #define __ROUTINES_H -inline NTSTATUS BuildDatagramSendRequest( - PDATAGRAM_SEND_REQUEST *SendRequest, - PIP_ADDRESS RemoteAddress, - USHORT RemotePort, - PNDIS_BUFFER Buffer, - DWORD BufferSize, - DATAGRAM_COMPLETION_ROUTINE Complete, - PVOID Context, - DATAGRAM_BUILD_ROUTINE Build, - ULONG Flags); - -inline NTSTATUS BuildTCPSendRequest( - PTCP_SEND_REQUEST *SendRequest, - DATAGRAM_COMPLETION_ROUTINE Complete, - PVOID Context, - PVOID ProtocolContext); - -UINT Random( - VOID); +UINT Random(VOID); UINT CopyBufferToBufferChain( PNDIS_BUFFER DstBuffer, @@ -53,8 +35,10 @@ UINT CopyPacketToBufferChain( UINT SrcOffset, UINT Length); -VOID FreeNdisPacket( - PNDIS_PACKET Packet); +VOID FreeNdisPacketX( + PNDIS_PACKET Packet, + PCHAR File, + UINT Line); PVOID AdjustPacket( PNDIS_PACKET Packet, diff --git a/reactos/drivers/net/tcpip/include/tcp.h b/reactos/drivers/net/tcpip/include/tcp.h index 949dee73950..c71391ba8ae 100644 --- a/reactos/drivers/net/tcpip/include/tcp.h +++ b/reactos/drivers/net/tcpip/include/tcp.h @@ -35,6 +35,9 @@ typedef struct TCPv4_HEADER { #define TCPOPTLEN_MAX_SEG_SIZE 0x4 +/* Data offset; 32-bit words (leftmost 4 bits); convert to bytes */ +#define TCP_DATA_OFFSET(DataOffset)(((DataOffset) & 0xF0) >> (4-2)) + /* TCPv4 pseudo header */ typedef struct TCPv4_PSEUDO_HEADER { @@ -70,10 +73,9 @@ typedef struct TCPv4_PSEUDO_HEADER { #define SRF_SYN TCP_SYN #define SRF_FIN TCP_FIN - PTCP_SEGMENT TCPCreateSegment( PIP_PACKET IPPacket, - ULONG SequenceNumber, + PTCPv4_HEADER TCPHeader, ULONG SegmentLength); VOID TCPFreeSegment( @@ -81,25 +83,8 @@ VOID TCPFreeSegment( VOID TCPAddSegment( PCONNECTION_ENDPOINT Connection, - PTCP_SEGMENT Segment); - -inline NTSTATUS TCPBuildSendRequest( - PTCP_SEND_REQUEST *SendRequest, - PDATAGRAM_SEND_REQUEST *DGSendRequest, - PCONNECTION_ENDPOINT Connection, - DATAGRAM_COMPLETION_ROUTINE Complete, - PVOID Context, - PNDIS_BUFFER Buffer, - DWORD BufferSize, - ULONG Flags); - -inline NTSTATUS TCPBuildAndTransmitSendRequest( - PCONNECTION_ENDPOINT Connection, - DATAGRAM_COMPLETION_ROUTINE Complete, - PVOID Context, - PNDIS_BUFFER Buffer, - DWORD BufferSize, - ULONG Flags); + PTCP_SEGMENT Segment, + PULONG Acknowledged); NTSTATUS TCPConnect( PTDI_REQUEST Request, @@ -108,10 +93,16 @@ NTSTATUS TCPConnect( NTSTATUS TCPListen( PTDI_REQUEST Request, - PTDI_CONNECTION_INFORMATION ConnInfo, - PTDI_CONNECTION_INFORMATION ReturnInfo); + UINT Backlog ); -NTSTATUS TCPSendDatagram( +NTSTATUS TCPReceiveData( + PTDI_REQUEST Request, + PNDIS_BUFFER Buffer, + ULONG ReceiveLength, + ULONG ReceiveFlags, + PULONG BytesReceived); + +NTSTATUS TCPSendData( PTDI_REQUEST Request, PTDI_CONNECTION_INFORMATION ConnInfo, PNDIS_BUFFER Buffer, diff --git a/reactos/drivers/net/tcpip/include/tcpip.h b/reactos/drivers/net/tcpip/include/tcpip.h index 67a0d16c2e8..1d658c9f9bc 100644 --- a/reactos/drivers/net/tcpip/include/tcpip.h +++ b/reactos/drivers/net/tcpip/include/tcpip.h @@ -63,6 +63,8 @@ #define MAX(value1, value2) \ ((value1 > value2)? value1 : value2) +#define NDIS_BUFFER_TAG FOURCC('n','b','u','f') +#define NDIS_PACKET_TAG FOURCC('n','p','k','t') #ifdef i386 @@ -110,6 +112,34 @@ #endif /* i386 */ +typedef TDI_STATUS (*InfoRequest_f)( UINT InfoClass, + UINT InfoType, + UINT InfoId, + PVOID Context, + TDIEntityID *id, + PNDIS_BUFFER Buffer, + PUINT BufferSize ); + +typedef TDI_STATUS (*InfoSet_f)( UINT InfoClass, + UINT InfoType, + UINT InfoId, + PVOID Context, + TDIEntityID *id, + PCHAR Buffer, + UINT BufferSize ); + +/* Sufficient information to manage the entity list */ +typedef struct { + UINT tei_entity; + UINT tei_instance; + PVOID context; + InfoRequest_f info_req; + InfoSet_f info_set; +} TDIEntityInfo; + +#ifndef htons +#define htons(x) (((x) << 16) | (((x) >> 8) & 0xff)) +#endif /* Global variable */ extern PDEVICE_OBJECT TCPDeviceObject; @@ -123,7 +153,7 @@ extern KSPIN_LOCK AddressFileListLock; extern NDIS_HANDLE GlobalPacketPool; extern NDIS_HANDLE GlobalBufferPool; extern KSPIN_LOCK EntityListLock; -extern TDIEntityID *EntityList; +extern TDIEntityInfo *EntityList; extern ULONG EntityCount; extern ULONG EntityMax; extern UDP_STATISTICS UDPStats; diff --git a/reactos/drivers/net/tcpip/include/titypes.h b/reactos/drivers/net/tcpip/include/titypes.h index b2cbfc3b90c..46955a231a9 100644 --- a/reactos/drivers/net/tcpip/include/titypes.h +++ b/reactos/drivers/net/tcpip/include/titypes.h @@ -65,7 +65,7 @@ #else /* DBG */ #define DEFINE_TAG -#define INIT_TAG (Object, Tag) +#define INIT_TAG(Object, Tag) /* * VOID ReferenceObject( @@ -127,17 +127,18 @@ typedef NTSTATUS (*DATAGRAM_BUILD_ROUTINE)( PIP_PACKET *IPPacket); typedef struct _DATAGRAM_SEND_REQUEST { - LIST_ENTRY ListEntry; /* Entry on list */ - PIP_ADDRESS RemoteAddress; /* Pointer to remote IP address */ - USHORT RemotePort; /* Remote port number */ - PNDIS_BUFFER Buffer; /* Pointer to NDIS buffer to send */ - DWORD BufferSize; /* Size of Buffer */ + LIST_ENTRY ListEntry; + PNDIS_PACKET PacketToSend; DATAGRAM_COMPLETION_ROUTINE Complete; /* Completion routine */ PVOID Context; /* Pointer to context information */ - DATAGRAM_BUILD_ROUTINE Build; /* Datagram build routine */ + IP_PACKET Packet; + UINT BufferSize; + IP_ADDRESS RemoteAddress; + USHORT RemotePort; ULONG Flags; /* Protocol specific flags */ } DATAGRAM_SEND_REQUEST, *PDATAGRAM_SEND_REQUEST; +#if 0 #define InitializeDatagramSendRequest( \ _SendRequest, \ _RemoteAddress, \ @@ -157,6 +158,7 @@ typedef struct _DATAGRAM_SEND_REQUEST { (_SendRequest)->Build = (_Build); \ (_SendRequest)->Flags = (_Flags); \ } +#endif /* These things bug me... They hide the member names. */ /* Transport address file context structure. The FileObject->FsContext2 field holds a pointer to this structure */ @@ -254,32 +256,17 @@ typedef struct _AF_SEARCH { USHORT Protocol; /* Protocol number */ } AF_SEARCH, *PAF_SEARCH; - - /******************************************************* * Connection-oriented communication support structures * *******************************************************/ -typedef struct _TCP_SEND_REQUEST { +typedef struct _TCP_RECEIVE_REQUEST { LIST_ENTRY ListEntry; /* Entry on list */ + PNDIS_BUFFER Buffer; /* Pointer to receive buffer */ + ULONG BufferSize; /* Size of Buffer */ DATAGRAM_COMPLETION_ROUTINE Complete; /* Completion routine */ PVOID Context; /* Pointer to context information */ - PVOID ProtocolContext; /* Protocol specific context */ - ULONG Flags; /* Protocol specific flags */ - ULONG SequenceNumber; /* Sequence number (network byte order) */ - ULONG AckNumber; /* Acknowledgement number (network byte order) */ -} TCP_SEND_REQUEST, *PTCP_SEND_REQUEST; - -#define InitializeTCPSendRequest( \ - _SendRequest, \ - _Complete, \ - _Context, \ - _ProtocolContext) { \ - (_SendRequest)->Complete = (_Complete); \ - (_SendRequest)->Context = (_Context); \ - (_SendRequest)->ProtocolContext = (_ProtocolContext); \ - } - +} TCP_RECEIVE_REQUEST, *PTCP_RECEIVE_REQUEST; /* Connection states */ typedef enum { @@ -302,8 +289,10 @@ typedef enum { typedef struct _TCP_SEGMENT { LIST_ENTRY ListEntry; PIP_PACKET IPPacket; /* Pointer to IP packet */ + PVOID SegmentData; /* Pointer to segment data */ ULONG SequenceNumber; /* Sequence number of first byte in segment */ ULONG Length; /* Number of bytes in segment */ + ULONG BytesDelivered; /* Number of bytes already delivered to the client */ } TCP_SEGMENT, *PTCP_SEGMENT; @@ -316,15 +305,16 @@ typedef struct _CONNECTION_ENDPOINT { 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 */ - CONNECTION_STATE State; /* Connection state */ - +#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 */ @@ -335,20 +325,23 @@ typedef struct _CONNECTION_ENDPOINT { ULONG SendISS; /* Initial send sequence number */ /* Receive sequence variables */ - ULONG ReceiveNext; /* Sequence number of last data block received */ + 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; + LIST_ENTRY ReceivedSegments;/* Segments that are received */ } CONNECTION_ENDPOINT, *PCONNECTION_ENDPOINT; diff --git a/reactos/drivers/net/tcpip/makefile b/reactos/drivers/net/tcpip/makefile index 1453a369a79..51969f528f8 100644 --- a/reactos/drivers/net/tcpip/makefile +++ b/reactos/drivers/net/tcpip/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.16 2004/03/04 20:45:38 chorns Exp $ +# $Id: makefile,v 1.17 2004/06/09 18:11:37 arty Exp $ PATH_TO_TOP = ../../.. @@ -8,9 +8,16 @@ TARGET_TYPE = export_driver TARGET_NAME = tcpip -TARGET_CFLAGS = -I./include -DDBG=1 -DNDIS40 -D__USE_W32API +TARGET_CFLAGS = \ + -D__USE_W32API \ + -DNDIS40 \ + -DMEMTRACK \ + -I./include \ + -I$(PATH_TO_TOP)/drivers/lib/oskittcp/include \ + -I$(PATH_TO_TOP)/w32api/include \ + -I$(PATH_TO_TOP)/include -TARGET_DDKLIBS = ndis.a +TARGET_DDKLIBS = ndis.a $(PATH_TO_TOP)/dk/w32/lib/oskittcp.a TARGET_CLEAN = \ tcpip/*.o \ @@ -19,32 +26,35 @@ TARGET_CLEAN = \ transport/datagram/*.o \ transport/rawip/*.o \ transport/tcp/*.o \ - transport/udp/*.o + transport/udp/*.o TCPIP_OBJECTS = tcpip/main.o tcpip/address.o tcpip/checksum.o \ - tcpip/dispatch.o tcpip/fileobjs.o tcpip/info.o \ - tcpip/pool.o tcpip/routines.o + tcpip/dispatch.o tcpip/fileobjs.o \ + tcpip/pool.o tcpip/routines.o tcpip/interface.o \ + tcpip/memtrack.o tcpip/irp.o +INFO_OBJECTS = tcpip/info.o tcpip/ninfo.o tcpip/tinfo.o tcpip/iinfo.o DATALINK_OBJECTS = datalink/arp.o datalink/lan.o datalink/loopback.o NETWORK_OBJECTS = network/icmp.o network/ip.o network/neighbor.o \ network/receive.o network/route.o network/router.o \ - network/transmit.o + network/transmit.o network/prefix.o DATAGRAM_OBJECTS = transport/datagram/datagram.o RAWIP_OBJECTS = transport/rawip/rawip.o -TCP_OBJECTS = transport/tcp/tcp.o transport/tcp/tcpcore.o \ - transport/tcp/tcp_input.o transport/tcp/tcp_ipv4.o \ - transport/tcp/tcp_output.o transport/tcp/tcp_timer.o +TCP_OBJECTS = transport/tcp/tcp.o transport/tcp/event.o transport/tcp/if.o UDP_OBJECTS = transport/udp/udp.o ARCH_OBJECTS = tcpip/i386/checksum.o TARGET_OBJECTS = \ $(TCPIP_OBJECTS) \ + $(INFO_OBJECTS) \ $(DATALINK_OBJECTS) \ $(NETWORK_OBJECTS) \ $(DATAGRAM_OBJECTS) \ $(RAWIP_OBJECTS) \ $(TCP_OBJECTS) \ + $(FREEBSD_OBJECTS) \ + $(REACTOS_OBJECTS) \ $(UDP_OBJECTS) \ - $(ARCH_OBJECTS) + $(ARCH_OBJECTS) \ include $(PATH_TO_TOP)/rules.mak diff --git a/reactos/drivers/net/tcpip/network/icmp.c b/reactos/drivers/net/tcpip/network/icmp.c index c5855cea471..38bd7d918f3 100644 --- a/reactos/drivers/net/tcpip/network/icmp.c +++ b/reactos/drivers/net/tcpip/network/icmp.c @@ -7,6 +7,7 @@ * REVISIONS: * CSH 01/08-2000 Created */ +#include <roscfg.h> #include <tcpip.h> #include <icmp.h> #include <rawip.h> @@ -38,8 +39,6 @@ VOID SendICMPComplete( FreeNdisPacket(Packet); TI_DbgPrint(DEBUG_ICMP, ("Freeing IP packet at %X.\n", IPPacket)); - - (*IPPacket->Free)(IPPacket); } @@ -79,9 +78,8 @@ PIP_PACKET PrepareICMPPacket( Size = MaxLLHeaderSize + sizeof(IPv4_HEADER) + sizeof(ICMP_HEADER) + DataSize; - DataBuffer = ExAllocatePool(NonPagedPool, Size); + DataBuffer = exAllocatePool(NonPagedPool, Size); if (!DataBuffer) { - (*IPPacket->Free)(IPPacket); return NULL; } @@ -90,10 +88,10 @@ PIP_PACKET PrepareICMPPacket( /* Allocate NDIS packet */ NdisAllocatePacket(&NdisStatus, &NdisPacket, GlobalPacketPool); if (NdisStatus != NDIS_STATUS_SUCCESS) { - (*IPPacket->Free)(IPPacket); - ExFreePool(DataBuffer); + exFreePool(DataBuffer); return NULL; } + Track(NDIS_PACKET_TAG,NdisPacket); TI_DbgPrint(MAX_TRACE, ("NdisPacket at (0x%X).\n", NdisPacket)); @@ -101,12 +99,12 @@ PIP_PACKET PrepareICMPPacket( NdisAllocateBuffer(&NdisStatus, &NdisBuffer, GlobalBufferPool, DataBuffer, Size); if (NdisStatus != NDIS_STATUS_SUCCESS) { - (*IPPacket->Free)(IPPacket); - NdisFreePacket(NdisPacket); - ExFreePool(DataBuffer); + FreeNdisPacket(NdisPacket); + exFreePool(DataBuffer); return NULL; } - + Track(NDIS_BUFFER_TAG,NdisBuffer); + TI_DbgPrint(MAX_TRACE, ("NdisBuffer at (0x%X).\n", NdisBuffer)); /* Link NDIS buffer into packet */ @@ -202,9 +200,10 @@ VOID ICMPReceive( ((PICMP_HEADER)NewPacket->Data)->Code = 0; ((PICMP_HEADER)NewPacket->Data)->Checksum = 0; +#ifdef DBG DisplayIPPacket(IPPacket); - DisplayIPPacket(NewPacket); +#endif ICMPTransmit(NTE, NewPacket); @@ -245,11 +244,11 @@ VOID ICMPTransmit( IPv4Checksum(IPPacket->Data, IPPacket->TotalSize - IPPacket->HeaderSize, 0); /* Get a route to the destination address */ + PNEIGHBOR_CACHE_ENTRY *NCE = RouterGetRoute( &IPPacket->DstAddr, NULL ); if (RouteGetRouteToDestination(&IPPacket->DstAddr, NTE, &RCN) == IP_SUCCESS) { /* Send the packet */ if (IPSendDatagram(IPPacket, RCN) != STATUS_SUCCESS) { FreeNdisPacket(IPPacket->NdisPacket); - (*IPPacket->Free)(IPPacket); } /* We're done with the RCN */ DereferenceObject(RCN); @@ -261,7 +260,6 @@ VOID ICMPTransmit( IPPacket->DstAddr.Address.IPv4Address)); /* Discard packet */ FreeNdisPacket(IPPacket->NdisPacket); - (*IPPacket->Free)(IPPacket); } } diff --git a/reactos/drivers/net/tcpip/network/ip.c b/reactos/drivers/net/tcpip/network/ip.c index 5e7390689ea..f42185cf6eb 100644 --- a/reactos/drivers/net/tcpip/network/ip.c +++ b/reactos/drivers/net/tcpip/network/ip.c @@ -7,6 +7,7 @@ * REVISIONS: * CSH 01/08-2000 Created */ +#include <roscfg.h> #include <tcpip.h> #include <ip.h> #include <tcp.h> @@ -14,6 +15,7 @@ #include <neighbor.h> #include <receive.h> #include <address.h> +#include <prefix.h> #include <route.h> #include <icmp.h> #include <pool.h> @@ -25,8 +27,6 @@ LIST_ENTRY InterfaceListHead; KSPIN_LOCK InterfaceListLock; LIST_ENTRY NetTableListHead; KSPIN_LOCK NetTableListLock; -LIST_ENTRY PrefixListHead; -KSPIN_LOCK PrefixListLock; UINT MaxLLHeaderSize; /* Largest maximum header size */ UINT MinLLFrameSize; /* Largest minimum frame size */ BOOLEAN IPInitialized = FALSE; @@ -47,6 +47,17 @@ VOID FreePacket( } +VOID DontFreePacket( + PVOID Object) +/* + * FUNCTION: Do nothing for when the IPPacket struct is part of another + * ARGUMENTS: + * Object = Pointer to an IP packet structure + */ +{ +} + + VOID FreeADE( PVOID Object) /* @@ -55,7 +66,7 @@ VOID FreeADE( * Object = Pointer to an address entry structure */ { - ExFreePool(Object); + exFreePool(Object); } @@ -67,7 +78,7 @@ VOID FreeNTE( * Object = Pointer to an net table entry structure */ { - ExFreePool(Object); + exFreePool(Object); } @@ -79,7 +90,7 @@ VOID FreeIF( * Object = Pointer to an interface structure */ { - ExFreePool(Object); + exFreePool(Object); } @@ -114,7 +125,7 @@ PADDRESS_ENTRY CreateADE( A2S(Address), A2S(NTE->Address))); /* Allocate space for an ADE and set it up */ - ADE = ExAllocatePool(NonPagedPool, sizeof(ADDRESS_ENTRY)); + ADE = exAllocatePool(NonPagedPool, sizeof(ADDRESS_ENTRY)); if (!ADE) { TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); return NULL; @@ -221,119 +232,35 @@ PIP_PACKET IPCreatePacket( INIT_TAG(IPPacket, TAG('I','P','K','T')); - IPPacket->Free = FreePacket; - IPPacket->RefCount = 1; - IPPacket->Type = Type; + IPPacket->Free = FreePacket; + IPPacket->RefCount = 1; + IPPacket->Type = Type; + IPPacket->HeaderSize = 20; return IPPacket; } - -PPREFIX_LIST_ENTRY CreatePLE( - PIP_INTERFACE IF, - PIP_ADDRESS Prefix, - UINT Length) +PIP_PACKET IPInitializePacket( + PIP_PACKET IPPacket, + ULONG Type) /* - * FUNCTION: Creates a prefix list entry and binds it to an interface + * FUNCTION: Creates an IP packet object * ARGUMENTS: - * IF = Pointer to interface - * Prefix = Pointer to prefix - * Length = Length of prefix + * Type = Type of IP packet * RETURNS: - * Pointer to PLE, NULL if there was not enough free resources - * NOTES: - * The prefix list entry retains a reference to the interface and - * the provided address. The caller is responsible for providing - * these references + * Pointer to the created IP packet. NULL if there was not enough free resources. */ { - PPREFIX_LIST_ENTRY PLE; - - TI_DbgPrint(DEBUG_IP, ("Called. IF (0x%X) Prefix (0x%X) Length (%d).\n", IF, Prefix, Length)); - - TI_DbgPrint(DEBUG_IP, ("Prefix (%s).\n", A2S(Prefix))); - - /* Allocate space for an PLE and set it up */ - PLE = ExAllocatePool(NonPagedPool, sizeof(PREFIX_LIST_ENTRY)); - if (!PLE) { - TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); - return NULL; - } - - INIT_TAG(PLE, TAG('P','L','E',' ')); - PLE->RefCount = 1; - PLE->Interface = IF; - PLE->Prefix = Prefix; - PLE->PrefixLength = Length; - - /* Add PLE to the global prefix list */ - ExInterlockedInsertTailList(&PrefixListHead, &PLE->ListEntry, &PrefixListLock); - - return PLE; -} - - -VOID DestroyPLE( - PPREFIX_LIST_ENTRY PLE) -/* - * FUNCTION: Destroys an prefix list entry - * ARGUMENTS: - * PLE = Pointer to prefix list entry - * NOTES: - * The prefix list lock must be held when called - */ -{ - TI_DbgPrint(DEBUG_IP, ("Called. PLE (0x%X).\n", PLE)); - - TI_DbgPrint(DEBUG_IP, ("PLE (%s).\n", PLE->Prefix)); - - /* Unlink the prefix list entry from the list */ - RemoveEntryList(&PLE->ListEntry); - - /* Dereference the address */ - DereferenceObject(PLE->Prefix); - - /* Dereference the interface */ - DereferenceObject(PLE->Interface); - -#ifdef DBG - PLE->RefCount--; - - if (PLE->RefCount != 0) { - TI_DbgPrint(MIN_TRACE, ("Prefix list entry at (0x%X) has (%d) references (should be 0).\n", PLE, PLE->RefCount)); - } -#endif - - /* And free the PLE */ - ExFreePool(PLE); -} - - -VOID DestroyPLEs( - VOID) -/* - * FUNCTION: Destroys all prefix list entries - */ -{ - KIRQL OldIrql; - PLIST_ENTRY CurrentEntry; - PLIST_ENTRY NextEntry; - PPREFIX_LIST_ENTRY Current; - - TI_DbgPrint(DEBUG_IP, ("Called.\n")); - - KeAcquireSpinLock(&PrefixListLock, &OldIrql); - - /* Search the list and remove every PLE we find */ - CurrentEntry = PrefixListHead.Flink; - while (CurrentEntry != &PrefixListHead) { - NextEntry = CurrentEntry->Flink; - Current = CONTAINING_RECORD(CurrentEntry, PREFIX_LIST_ENTRY, ListEntry); - /* Destroy the PLE */ - DestroyPLE(Current); - CurrentEntry = NextEntry; - } - KeReleaseSpinLock(&PrefixListLock, OldIrql); + /* FIXME: Is this needed? */ + RtlZeroMemory(IPPacket, sizeof(IP_PACKET)); + + INIT_TAG(IPPacket, TAG('I','P','K','T')); + + IPPacket->Free = DontFreePacket; + IPPacket->RefCount = 1; + IPPacket->Type = Type; + + return IPPacket; } @@ -364,7 +291,7 @@ PNET_TABLE_ENTRY IPCreateNTE( TI_DbgPrint(DEBUG_IP, ("Address (%s).\n", A2S(Address))); /* Allocate room for an NTE */ - NTE = ExAllocatePool(NonPagedPool, sizeof(NET_TABLE_ENTRY)); + NTE = exAllocatePool(NonPagedPool, sizeof(NET_TABLE_ENTRY)); if (!NTE) { TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); return NULL; @@ -392,7 +319,7 @@ PNET_TABLE_ENTRY IPCreateNTE( ADE = CreateADE(IF, NTE->Address, ADE_UNICAST, NTE); if (!ADE) { TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); - ExFreePool(NTE); + exFreePool(NTE); return NULL; } @@ -400,7 +327,7 @@ PNET_TABLE_ENTRY IPCreateNTE( NTE->PLE = CreatePLE(IF, NTE->Address, PrefixLength); if (!NTE->PLE) { DestroyADE(IF, ADE); - ExFreePool(NTE); + exFreePool(NTE); return NULL; } @@ -462,7 +389,7 @@ VOID DestroyNTE( } #endif /* And free the NTE */ - ExFreePool(NTE); + exFreePool(NTE); } @@ -792,7 +719,7 @@ PIP_INTERFACE IPCreateInterface( } #endif - IF = ExAllocatePool(NonPagedPool, sizeof(IP_INTERFACE)); + IF = exAllocatePool(NonPagedPool, sizeof(IP_INTERFACE)); if (!IF) { TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); return NULL; @@ -821,6 +748,8 @@ PIP_INTERFACE IPCreateInterface( KeInitializeSpinLock(&IF->Lock); + InsertTDIInterfaceEntity( IF ); + return IF; } @@ -838,6 +767,8 @@ VOID IPDestroyInterface( TI_DbgPrint(DEBUG_IP, ("Called. IF (0x%X).\n", IF)); + RemoveTDIInterfaceEntity( IF ); + KeAcquireSpinLock(&NetTableListLock, &OldIrql1); KeAcquireSpinLock(&IF->Lock, &OldIrql2); DestroyADEs(IF); @@ -852,7 +783,8 @@ VOID IPDestroyInterface( TI_DbgPrint(MIN_TRACE, ("Interface at (0x%X) has (%d) references (should be 0).\n", IF, IF->RefCount)); } #endif - ExFreePool(IF); + + exFreePool(IF); } @@ -891,30 +823,29 @@ BOOLEAN IPRegisterInterface( KeReleaseSpinLock(&IF->Lock, OldIrql); return FALSE; } -#if 1 + /* Reference objects for forward information base */ ReferenceObject(Current->Address); ReferenceObject(Current->PLE->Prefix); - ReferenceObject(Current); + ReferenceObject(NCE); + /* NCE is already referenced */ - if (!RouterAddRoute(Current->Address, Current->PLE->Prefix, Current, NCE, 1)) { + if (!RouterAddRoute(Current->Address, Current->PLE->Prefix, NCE, 1)) { TI_DbgPrint(MIN_TRACE, ("Could not add route due to insufficient resources.\n")); DereferenceObject(Current->Address); DereferenceObject(Current->PLE->Prefix); - DereferenceObject(Current); DereferenceObject(NCE); } -#else + RCN = RouteAddRouteToDestination(Current->Address, Current, IF, NCE); if (!RCN) { TI_DbgPrint(MIN_TRACE, ("Could not create RCN.\n")); DereferenceObject(Current->Address); KeReleaseSpinLock(&IF->Lock, OldIrql); - return FALSE; } /* Don't need this any more since the route cache references the NCE */ DereferenceObject(NCE); -#endif + CurrentEntry = CurrentEntry->Flink; } @@ -1096,9 +1027,7 @@ NTSTATUS IPStartup( InitializeListHead(&ReassemblyListHead); KeInitializeSpinLock(&ReassemblyListLock); - /* Initialize the prefix list and protecting lock */ - InitializeListHead(&PrefixListHead); - KeInitializeSpinLock(&PrefixListLock); + InitPLE(); /* Initialize our periodic timer and its associated DPC object. When the timer expires, the IPTimeout deferred procedure call (DPC) is queued */ diff --git a/reactos/drivers/net/tcpip/network/neighbor.c b/reactos/drivers/net/tcpip/network/neighbor.c index cf76f3749da..e9e58fded49 100644 --- a/reactos/drivers/net/tcpip/network/neighbor.c +++ b/reactos/drivers/net/tcpip/network/neighbor.c @@ -7,10 +7,10 @@ * REVISIONS: * CSH 01/08-2000 Created */ +#include <roscfg.h> #include <tcpip.h> #include <neighbor.h> #include <routines.h> -#include <neighbor.h> #include <transmit.h> #include <address.h> #include <route.h> @@ -186,7 +186,7 @@ VOID NBShutdown( NdisPacket = NextNdisPacket; } -#if DBG +#ifdef DBG if (CurNCE->RefCount != 1) { TI_DbgPrint(DEBUG_REFCOUNT, ("NCE at (0x%X) has (%d) references (should be 1).\n", CurNCE, CurNCE->RefCount)); @@ -293,7 +293,7 @@ PNEIGHBOR_CACHE_ENTRY NBAddNeighbor( NCE->Interface = Interface; NCE->Address = Address; NCE->LinkAddressLength = LinkAddressLength; - NCE->LinkAddress = (PVOID)((ULONG_PTR)NCE + sizeof(NEIGHBOR_CACHE_ENTRY)); + NCE->LinkAddress = (PVOID)&NCE[1]; if (LinkAddress != NULL) { RtlCopyMemory(NCE->LinkAddress, LinkAddress, LinkAddressLength); @@ -524,7 +524,7 @@ VOID NBRemoveNeighbor( /* Remove reference to the address */ DereferenceObject(CurNCE->Address); -#if DBG +#ifdef DBG CurNCE->RefCount--; if (CurNCE->RefCount != 0) diff --git a/reactos/drivers/net/tcpip/network/prefix.c b/reactos/drivers/net/tcpip/network/prefix.c new file mode 100644 index 00000000000..8854258b928 --- /dev/null +++ b/reactos/drivers/net/tcpip/network/prefix.c @@ -0,0 +1,139 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS TCP/IP protocol driver + * FILE: network/ip.c + * PURPOSE: Internet Protocol module + * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net) + * Art Yerkes (arty@users.sourceforge.net) + * REVISIONS: + * CSH 01/08-2000 Created + */ +#include <roscfg.h> +#include <tcpip.h> +#include <ip.h> +#include <tcp.h> +#include <loopback.h> +#include <neighbor.h> +#include <receive.h> +#include <address.h> +#include <route.h> +#include <icmp.h> +#include <prefix.h> +#include <pool.h> + +LIST_ENTRY PrefixListHead; +KSPIN_LOCK PrefixListLock; + +/* --------- The Prefix List ---------- */ + +VOID InitPLE() { + /* Initialize the prefix list and protecting lock */ + InitializeListHead(&PrefixListHead); + KeInitializeSpinLock(&PrefixListLock); +} + + +PPREFIX_LIST_ENTRY CreatePLE(PIP_INTERFACE IF, PIP_ADDRESS Prefix, UINT Length) +/* + * FUNCTION: Creates a prefix list entry and binds it to an interface + * ARGUMENTS: + * IF = Pointer to interface + * Prefix = Pointer to prefix + * Length = Length of prefix + * RETURNS: + * Pointer to PLE, NULL if there was not enough free resources + * NOTES: + * The prefix list entry retains a reference to the interface and + * the provided address. The caller is responsible for providing + * these references + */ +{ + PPREFIX_LIST_ENTRY PLE; + + TI_DbgPrint(DEBUG_IP, ("Called. IF (0x%X) Prefix (0x%X) Length (%d).\n", IF, Prefix, Length)); + + TI_DbgPrint(DEBUG_IP, ("Prefix (%s).\n", A2S(Prefix))); + + /* Allocate space for an PLE and set it up */ + PLE = ExAllocatePool(NonPagedPool, sizeof(PREFIX_LIST_ENTRY)); + if (!PLE) { + TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); + return NULL; + } + + INIT_TAG(PLE, TAG('P','L','E',' ')); + PLE->RefCount = 1; + PLE->Interface = IF; + PLE->Prefix = Prefix; + PLE->PrefixLength = Length; + + /* Add PLE to the global prefix list */ + ExInterlockedInsertTailList(&PrefixListHead, &PLE->ListEntry, &PrefixListLock); + + return PLE; +} + + +VOID DestroyPLE( + PPREFIX_LIST_ENTRY PLE) +/* + * FUNCTION: Destroys an prefix list entry + * ARGUMENTS: + * PLE = Pointer to prefix list entry + * NOTES: + * The prefix list lock must be held when called + */ +{ + TI_DbgPrint(DEBUG_IP, ("Called. PLE (0x%X).\n", PLE)); + + TI_DbgPrint(DEBUG_IP, ("PLE (%s).\n", PLE->Prefix)); + + /* Unlink the prefix list entry from the list */ + RemoveEntryList(&PLE->ListEntry); + + /* Dereference the address */ + DereferenceObject(PLE->Prefix); + + /* Dereference the interface */ + DereferenceObject(PLE->Interface); + +#ifdef DBG + PLE->RefCount--; + + if (PLE->RefCount != 0) { + TI_DbgPrint(MIN_TRACE, ("Prefix list entry at (0x%X) has (%d) references (should be 0).\n", PLE, PLE->RefCount)); + } +#endif + + /* And free the PLE */ + ExFreePool(PLE); +} + + +VOID DestroyPLEs( + VOID) +/* + * FUNCTION: Destroys all prefix list entries + */ +{ + KIRQL OldIrql; + PLIST_ENTRY CurrentEntry; + PLIST_ENTRY NextEntry; + PPREFIX_LIST_ENTRY Current; + + TI_DbgPrint(DEBUG_IP, ("Called.\n")); + + KeAcquireSpinLock(&PrefixListLock, &OldIrql); + + /* Search the list and remove every PLE we find */ + CurrentEntry = PrefixListHead.Flink; + while (CurrentEntry != &PrefixListHead) { + NextEntry = CurrentEntry->Flink; + Current = CONTAINING_RECORD(CurrentEntry, PREFIX_LIST_ENTRY, ListEntry); + /* Destroy the PLE */ + DestroyPLE(Current); + CurrentEntry = NextEntry; + } + KeReleaseSpinLock(&PrefixListLock, OldIrql); +} + diff --git a/reactos/drivers/net/tcpip/network/receive.c b/reactos/drivers/net/tcpip/network/receive.c index 8e57493e7eb..960785e2f10 100644 --- a/reactos/drivers/net/tcpip/network/receive.c +++ b/reactos/drivers/net/tcpip/network/receive.c @@ -9,6 +9,7 @@ * REVISIONS: * CSH 01/08-2000 Created */ +#include <roscfg.h> #include <tcpip.h> #include <receive.h> #include <routines.h> @@ -100,7 +101,7 @@ VOID FreeIPDR( TI_DbgPrint(DEBUG_IP, ("Freeing fragment data at (0x%X).\n", CurrentF->Data)); /* Free the fragment data buffer */ - ExFreePool(CurrentF->Data); + exFreePool(CurrentF->Data); TI_DbgPrint(DEBUG_IP, ("Freeing fragment at (0x%X).\n", CurrentF)); @@ -112,7 +113,7 @@ VOID FreeIPDR( /* Free resources for the header, if it exists */ if (IPDR->IPv4Header) { TI_DbgPrint(DEBUG_IP, ("Freeing IPv4 header data at (0x%X).\n", IPDR->IPv4Header)); - ExFreePool(IPDR->IPv4Header); + exFreePool(IPDR->IPv4Header); } TI_DbgPrint(DEBUG_IP, ("Freeing IPDR data at (0x%X).\n", IPDR)); @@ -201,6 +202,11 @@ PIP_PACKET ReassembleDatagram( PVOID Data; TI_DbgPrint(DEBUG_IP, ("Reassembling datagram from IPDR at (0x%X).\n", IPDR)); + TI_DbgPrint(DEBUG_IP, ("IPDR->HeaderSize = %d\n", IPDR->HeaderSize)); + TI_DbgPrint(DEBUG_IP, ("IPDR->DataSize = %d\n", IPDR->DataSize)); + + TI_DbgPrint(DEBUG_IP, ("Fragment header:\n")); + OskitDumpBuffer(IPDR->IPv4Header, IPDR->HeaderSize); /* FIXME: Assume IPv4 */ IPPacket = IPCreatePacket(IP_ADDRESS_V4); @@ -216,7 +222,7 @@ PIP_PACKET ReassembleDatagram( RtlCopyMemory(&IPPacket->DstAddr, &IPDR->DstAddr, sizeof(IP_ADDRESS)); /* Allocate space for full IP datagram */ - IPPacket->Header = ExAllocatePool(NonPagedPool, IPPacket->TotalSize); + IPPacket->Header = exAllocatePool(NonPagedPool, IPPacket->TotalSize); if (!IPPacket->Header) { TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); (*IPPacket->Free)(IPPacket); @@ -226,7 +232,7 @@ PIP_PACKET ReassembleDatagram( /* Copy the header into the buffer */ RtlCopyMemory(IPPacket->Header, IPDR->IPv4Header, IPDR->HeaderSize); - Data = (PVOID)((ULONG_PTR)IPPacket->Header + IPDR->HeaderSize); + Data = IPPacket->Header + IPDR->HeaderSize; IPPacket->Data = Data; /* Copy data from all fragments into buffer */ @@ -237,11 +243,10 @@ PIP_PACKET ReassembleDatagram( TI_DbgPrint(DEBUG_IP, ("Copying (%d) bytes of fragment data from (0x%X) to offset (%d).\n", Current->Size, Data, Current->Offset)); /* Copy fragment data to the destination buffer at the correct offset */ - RtlCopyMemory( - (PVOID)((ULONG_PTR)Data + Current->Offset), - Current->Data, - Current->Size); - + RtlCopyMemory((PVOID)((ULONG_PTR)Data + Current->Offset), + Current->Data, + Current->Size); + OskitDumpBuffer( Data, Current->Offset + Current->Size ); CurrentEntry = CurrentEntry->Flink; } @@ -269,7 +274,7 @@ __inline VOID Cleanup( RemoveIPDR(IPDR); FreeIPDR(IPDR); if (Buffer) - ExFreePool(Buffer); + exFreePool(Buffer); } @@ -399,7 +404,7 @@ VOID ProcessFragment( /* If this is the first fragment, save the IP header */ if (FragFirst == 0) { - IPDR->IPv4Header = ExAllocatePool(NonPagedPool, IPPacket->HeaderSize); + IPDR->IPv4Header = exAllocatePool(NonPagedPool, IPPacket->HeaderSize); if (!IPDR->IPv4Header) { /* We don't have the resources to process this packet, discard it */ Cleanup(&IPDR->Lock, OldIrql, IPDR, NULL); @@ -426,7 +431,7 @@ VOID ProcessFragment( TI_DbgPrint(DEBUG_IP, ("Fragment descriptor allocated at (0x%X).\n", Fragment)); Fragment->Size = IPPacket->TotalSize - IPPacket->HeaderSize; - Fragment->Data = ExAllocatePool(NonPagedPool, Fragment->Size); + Fragment->Data = exAllocatePool(NonPagedPool, Fragment->Size); if (!Fragment->Data) { /* We don't have the resources to process this packet, discard it */ Cleanup(&IPDR->Lock, OldIrql, IPDR, Fragment); @@ -437,13 +442,12 @@ VOID ProcessFragment( Fragment->Data, Fragment->Size)); /* Copy datagram data into fragment buffer */ - CopyPacketToBuffer( - Fragment->Data, - IPPacket->NdisPacket, - IPPacket->Position, - Fragment->Size); - Fragment->Offset = FragFirst; - + CopyPacketToBuffer(Fragment->Data, + IPPacket->NdisPacket, + IPPacket->Position + MaxLLHeaderSize, + Fragment->Size); + Fragment->Offset = FragFirst; + /* If this is the last fragment, compute and save the datagram data size */ if (!MoreFragments) IPDR->DataSize = FragFirst + Fragment->Size; @@ -463,7 +467,7 @@ VOID ProcessFragment( Datagram = ReassembleDatagram(IPDR); - KeReleaseSpinLock(&IPDR->Lock, OldIrql); + KeReleaseSpinLock(&IPDR->Lock, OldIrql); RemoveIPDR(IPDR); FreeIPDR(IPDR); @@ -478,7 +482,7 @@ VOID ProcessFragment( IPDispatchProtocol(NTE, Datagram); /* We're done with this datagram */ - ExFreePool(Datagram->Header); + exFreePool(Datagram->Header); TI_DbgPrint(MAX_TRACE, ("Freeing datagram at (0x%X).\n", Datagram)); (*Datagram->Free)(Datagram); } else @@ -525,7 +529,6 @@ VOID IPDatagramReassemblyTimeout( { } - VOID IPv4Receive( PVOID Context, PIP_PACKET IPPacket) @@ -536,81 +539,77 @@ VOID IPv4Receive( * IPPacket = Pointer to IP packet */ { - PNEIGHBOR_CACHE_ENTRY NCE; - PNET_TABLE_ENTRY NTE; - UINT AddressType; + PNEIGHBOR_CACHE_ENTRY NCE; + PNET_TABLE_ENTRY NTE; + UINT AddressType; + + TI_DbgPrint(DEBUG_IP, ("Received IPv4 datagram.\n")); + + IPPacket->HeaderSize = (((PIPv4_HEADER)IPPacket->Header)->VerIHL & 0x0F) << 2; + TI_DbgPrint(DEBUG_IP, ("IPPacket->HeaderSize = %d\n", IPPacket->HeaderSize)); - TI_DbgPrint(DEBUG_IP, ("Received IPv4 datagram.\n")); - - IPPacket->HeaderSize = (((PIPv4_HEADER)IPPacket->Header)->VerIHL & 0x0F) << 2; - - if (IPPacket->HeaderSize > IPv4_MAX_HEADER_SIZE) { - TI_DbgPrint(MIN_TRACE, ("Datagram received with incorrect header size (%d).\n", - IPPacket->HeaderSize)); - /* Discard packet */ - return; - } - - /* Checksum IPv4 header */ - if (!IPv4CorrectChecksum(IPPacket->Header, IPPacket->HeaderSize)) { - TI_DbgPrint(MIN_TRACE, ("Datagram received with bad checksum. Checksum field (0x%X)\n", - WN2H(((PIPv4_HEADER)IPPacket->Header)->Checksum))); - /* Discard packet */ - return; - } - -// TI_DbgPrint(DEBUG_IP, ("TotalSize (datalink) is (%d).\n", IPPacket->TotalSize)); - - IPPacket->TotalSize = WN2H(((PIPv4_HEADER)IPPacket->Header)->TotalLength); - -// TI_DbgPrint(DEBUG_IP, ("TotalSize (IPv4) is (%d).\n", IPPacket->TotalSize)); - - AddrInitIPv4(&IPPacket->SrcAddr, ((PIPv4_HEADER)IPPacket->Header)->SrcAddr); - AddrInitIPv4(&IPPacket->DstAddr, ((PIPv4_HEADER)IPPacket->Header)->DstAddr); - - IPPacket->Position = IPPacket->HeaderSize; - IPPacket->Data = (PVOID)((ULONG_PTR)IPPacket->Header + IPPacket->HeaderSize); - - /* FIXME: Possibly forward packets with multicast addresses */ - - /* FIXME: Should we allow packets to be received on the wrong interface? */ -#if 0 - NTE = IPLocateNTE(&IPPacket->DstAddr, &AddressType); -#else - NTE = IPLocateNTEOnInterface((PIP_INTERFACE)Context, &IPPacket->DstAddr, &AddressType); -#endif - if (NTE) { - /* This packet is destined for us */ - ProcessFragment((PIP_INTERFACE)Context, IPPacket, NTE); - - /* Done with this NTE */ - DereferenceObject(NTE); - } else { - /* This packet is not destined for us. If we are a router, - try to find a route and forward the packet */ - - /* FIXME: Check if acting as a router */ -#if 1 - //NCE = RouteFindRouter(&IPPacket->DstAddr, NULL); - NCE = NULL; - if (NCE) { - /* FIXME: Possibly fragment datagram */ - /* Forward the packet */ - IPSendFragment(IPPacket, NCE); - } else { - TI_DbgPrint(MIN_TRACE, ("No route to destination (0x%X).\n", - IPPacket->DstAddr.Address.IPv4Address)); - - /* FIXME: Send ICMP error code */ + if (IPPacket->HeaderSize > IPv4_MAX_HEADER_SIZE) { + TI_DbgPrint + (MIN_TRACE, + ("Datagram received with incorrect header size (%d).\n", + IPPacket->HeaderSize)); + /* Discard packet */ + return; + } + + /* Checksum IPv4 header */ + if (!IPv4CorrectChecksum(IPPacket->Header, IPPacket->HeaderSize)) { + TI_DbgPrint + (MIN_TRACE, + ("Datagram received with bad checksum. Checksum field (0x%X)\n", + WN2H(((PIPv4_HEADER)IPPacket->Header)->Checksum))); + /* Discard packet */ + return; + } + + IPPacket->TotalSize = WN2H(((PIPv4_HEADER)IPPacket->Header)->TotalLength); + + AddrInitIPv4(&IPPacket->SrcAddr, ((PIPv4_HEADER)IPPacket->Header)->SrcAddr); + AddrInitIPv4(&IPPacket->DstAddr, ((PIPv4_HEADER)IPPacket->Header)->DstAddr); + + IPPacket->Position = IPPacket->HeaderSize; + IPPacket->Data = (PVOID)((ULONG_PTR)IPPacket->Header + IPPacket->HeaderSize) + 14; /* XXX 14 */ + + OskitDumpBuffer(IPPacket->Data - IPPacket->HeaderSize, IPPacket->TotalSize); + + /* FIXME: Possibly forward packets with multicast addresses */ + + /* FIXME: Should we allow packets to be received on the wrong interface? */ + NTE = IPLocateNTEOnInterface((PIP_INTERFACE)Context, &IPPacket->DstAddr, &AddressType); + + if (NTE) { + /* This packet is destined for us */ + ProcessFragment((PIP_INTERFACE)Context, IPPacket, NTE); + + /* Done with this NTE */ + DereferenceObject(NTE); + } else { + /* This packet is not destined for us. If we are a router, + try to find a route and forward the packet */ + + /* FIXME: Check if acting as a router */ + NCE = NULL; + if (NCE) { + /* FIXME: Possibly fragment datagram */ + /* Forward the packet */ + IPSendFragment(IPPacket, NCE); + } else { + TI_DbgPrint(MIN_TRACE, ("No route to destination (0x%X).\n", + IPPacket->DstAddr.Address.IPv4Address)); + + /* FIXME: Send ICMP error code */ + } } -#endif - } } -VOID IPReceive( - PVOID Context, - PIP_PACKET IPPacket) +VOID IPReceive( PVOID Context, + PIP_PACKET IPPacket ) /* * FUNCTION: Receives an IP datagram (or fragment) * ARGUMENTS: diff --git a/reactos/drivers/net/tcpip/network/route.c b/reactos/drivers/net/tcpip/network/route.c index 12618287c3b..a086f3bdf11 100644 --- a/reactos/drivers/net/tcpip/network/route.c +++ b/reactos/drivers/net/tcpip/network/route.c @@ -6,9 +6,15 @@ * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net) * NOTES: The route cache is implemented as a binary search * tree to obtain fast searches + * + * This data is not authoritative. It is a searchable cache that allows + * quick access to route information to selected hosts. This information + * should always defer to the FIB. + * * REVISIONS: * CSH 01/08-2000 Created */ +#include <roscfg.h> #include <tcpip.h> #include <route.h> #include <router.h> @@ -23,7 +29,7 @@ KSPIN_LOCK RouteCacheLock; NPAGED_LOOKASIDE_LIST IPRCNList; -#if DBG +#ifdef DBG VOID PrintTree( PROUTE_CACHE_NODE Node) /* @@ -50,6 +56,17 @@ VOID PrintTree( } #endif +UINT CountRouteNodes( PROUTE_CACHE_NODE Node ) { + if( !Node ) Node = RouteCache; + if( IsInternalRCN(Node) ) + return + /* Traverse left subtree */ + CountRouteNodes(Node->Left) + + /* Traverse right subtree */ + CountRouteNodes(Node->Right) + 1; + else + return 0; +} VOID FreeRCN( PVOID Object) @@ -168,6 +185,8 @@ PROUTE_CACHE_NODE ExpandExternalRCN(VOID) { PROUTE_CACHE_NODE RCN; + MTMARK(); + TI_DbgPrint(DEBUG_RCACHE, ("Called.\n")); RCN = ExAllocateFromNPagedLookasideList(&IPRCNList); @@ -176,6 +195,8 @@ PROUTE_CACHE_NODE ExpandExternalRCN(VOID) return NULL; } + MTMARK(); + RCN->Free = FreeRCN; if (ExternalRCN->Left) @@ -186,6 +207,8 @@ PROUTE_CACHE_NODE ExpandExternalRCN(VOID) RCN->Left = ExternalRCN; RCN->Right = ExternalRCN; + MTMARK(); + return RCN; } @@ -364,7 +387,7 @@ VOID RemoveSubtree( DereferenceObject(Node->NTE); DereferenceObject(Node->NCE); -#if DBG +#ifdef DBG if (Node->RefCount != 1) TI_DbgPrint(MIN_TRACE, ("RCN at (0x%X) has (%d) references (should be 1).\n", Node, Node->RefCount)); #endif diff --git a/reactos/drivers/net/tcpip/network/router.c b/reactos/drivers/net/tcpip/network/router.c index 5ea1d288d26..da49b8fad90 100644 --- a/reactos/drivers/net/tcpip/network/router.c +++ b/reactos/drivers/net/tcpip/network/router.c @@ -4,12 +4,18 @@ * FILE: network/router.c * PURPOSE: IP routing subsystem * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net) + * NOTES: + * This file holds authoritative routing information. + * Information queries on the route table should be handled here. + * This information should always override the route cache info. * REVISIONS: * CSH 01/08-2000 Created */ +#include <roscfg.h> #include <tcpip.h> #include <address.h> #include <router.h> +#include <prefix.h> #include <pool.h> @@ -48,7 +54,6 @@ VOID DestroyFIBE( DereferenceObject(FIBE->NetworkAddress); DereferenceObject(FIBE->Netmask); DereferenceObject(FIBE->Router); - DereferenceObject(FIBE->NTE); #ifdef DBG FIBE->RefCount--; @@ -79,7 +84,7 @@ VOID DestroyFIBEs( CurrentEntry = FIBListHead.Flink; while (CurrentEntry != &FIBListHead) { NextEntry = CurrentEntry->Flink; - Current = CONTAINING_RECORD(CurrentEntry, FIB_ENTRY, ListEntry); + Current = CONTAINING_RECORD(CurrentEntry, FIB_ENTRY, ListEntry); /* Destroy the FIB entry */ DestroyFIBE(Current); CurrentEntry = NextEntry; @@ -87,6 +92,43 @@ VOID DestroyFIBEs( } +UINT CountFIBs() { + UINT FibCount = 0; + PLIST_ENTRY CurrentEntry; + PLIST_ENTRY NextEntry; + + /* Search the list and remove every FIB entry we find */ + CurrentEntry = FIBListHead.Flink; + while (CurrentEntry != &FIBListHead) { + NextEntry = CurrentEntry->Flink; + CurrentEntry = NextEntry; + FibCount++; + } + + return FibCount; +} + + +UINT CopyFIBs( PFIB_ENTRY Target ) { + UINT FibCount = 0; + PLIST_ENTRY CurrentEntry; + PLIST_ENTRY NextEntry; + PFIB_ENTRY Current; + + /* Search the list and remove every FIB entry we find */ + CurrentEntry = FIBListHead.Flink; + while (CurrentEntry != &FIBListHead) { + NextEntry = CurrentEntry->Flink; + Current = CONTAINING_RECORD(CurrentEntry, FIB_ENTRY, ListEntry); + Target[FibCount] = *Current; + CurrentEntry = NextEntry; + FibCount++; + } + + return FibCount; +} + + UINT CommonPrefixLength( PIP_ADDRESS Address1, PIP_ADDRESS Address2) @@ -108,33 +150,25 @@ UINT CommonPrefixLength( TI_DbgPrint(DEBUG_ROUTER, ("Called. Address1 (0x%X) Address2 (0x%X).\n", Address1, Address2)); - TI_DbgPrint(DEBUG_ROUTER, ("Address1 (%s) Address2 (%s).\n", - A2S(Address1), A2S(Address2))); + /*TI_DbgPrint(DEBUG_ROUTER, ("Target (%s) \n", A2S(Address1)));*/ + /*TI_DbgPrint(DEBUG_ROUTER, ("Adapter (%s).\n", A2S(Address2)));*/ if (Address1->Type == IP_ADDRESS_V4) Size = sizeof(IPv4_RAW_ADDRESS); else Size = sizeof(IPv6_RAW_ADDRESS); - Addr1 = (PUCHAR)&Address1->Address; - Addr2 = (PUCHAR)&Address2->Address; + Addr1 = (PUCHAR)&Address1->Address.IPv4Address; + Addr2 = (PUCHAR)&Address2->Address.IPv4Address; /* Find first non-matching byte */ - for (i = 0; ; i++) { - if (i == Size) - return 8 * i; /* The two addresses are equal */ - - if (Addr1[i] != Addr2[i]) - break; - } + for (i = 0; i < Size && Addr1[i] == Addr2[i]; i++); + if( i == Size ) return 8 * i; /* Find first non-matching bit */ Bitmask = 0x80; - for (j = 0; ; j++) { - if ((Addr1[i] & Bitmask) != (Addr2[i] & Bitmask)) - break; + for (j = 0; (Addr1[i] & Bitmask) != (Addr2[i] & Bitmask); j++) Bitmask >>= 1; - } return 8 * i + j; } @@ -161,8 +195,10 @@ BOOLEAN HasPrefix( TI_DbgPrint(DEBUG_ROUTER, ("Called. Address (0x%X) Prefix (0x%X) Length (%d).\n", Address, Prefix, Length)); +#if 0 TI_DbgPrint(DEBUG_ROUTER, ("Address (%s) Prefix (%s).\n", A2S(Address), A2S(Prefix))); +#endif /* Check that initial integral bytes match */ while (Length > 8) { @@ -207,7 +243,8 @@ PNET_TABLE_ENTRY RouterFindBestNTE( CurrentEntry = Interface->NTEListHead.Flink; while (CurrentEntry != &Interface->NTEListHead) { - Current = CONTAINING_RECORD(CurrentEntry, NET_TABLE_ENTRY, IFListEntry); + Current = CONTAINING_RECORD(CurrentEntry, NET_TABLE_ENTRY, IFListEntry); + TI_DbgPrint(DEBUG_ROUTER, ("Looking at NTE %s\n", A2S(Current->Address))); Length = CommonPrefixLength(Destination, Current->Address); if (BestNTE) { @@ -271,7 +308,6 @@ PIP_INTERFACE RouterFindOnLinkInterface( PFIB_ENTRY RouterAddRoute( PIP_ADDRESS NetworkAddress, PIP_ADDRESS Netmask, - PNET_TABLE_ENTRY NTE, PNEIGHBOR_CACHE_ENTRY Router, UINT Metric) /* @@ -279,24 +315,23 @@ PFIB_ENTRY RouterAddRoute( * ARGUMENTS: * NetworkAddress = Pointer to address of network * Netmask = Pointer to netmask of network - * NTE = Pointer to NTE to use * Router = Pointer to NCE of router to use * Metric = Cost of this route * RETURNS: * Pointer to FIB entry if the route was added, NULL if not * NOTES: - * The FIB entry references the NetworkAddress, Netmask, NTE and + * The FIB entry references the NetworkAddress, Netmask and * the NCE of the router. The caller is responsible for providing * these references */ { PFIB_ENTRY FIBE; - TI_DbgPrint(DEBUG_ROUTER, ("Called. NetworkAddress (0x%X) Netmask (0x%X) NTE (0x%X) " - "Router (0x%X) Metric (%d).\n", NetworkAddress, Netmask, NTE, Router, Metric)); + TI_DbgPrint(DEBUG_ROUTER, ("Called. NetworkAddress (0x%X) Netmask (0x%X) " + "Router (0x%X) Metric (%d).\n", NetworkAddress, Netmask, Router, Metric)); - TI_DbgPrint(DEBUG_ROUTER, ("NetworkAddress (%s) Netmask (%s) NTE (%s) Router (%s).\n", - A2S(NetworkAddress), A2S(Netmask), A2S(NTE->Address), A2S(Router->Address))); + TI_DbgPrint(DEBUG_ROUTER, ("NetworkAddress (%s) Netmask (%s) Router (%s).\n", + A2S(NetworkAddress), A2S(Netmask), A2S(Router->Address))); FIBE = ExAllocatePool(NonPagedPool, sizeof(FIB_ENTRY)); if (!FIBE) { @@ -304,13 +339,11 @@ PFIB_ENTRY RouterAddRoute( return NULL; } - INIT_TAG(NTE, TAG('N','T','E',' ')); INIT_TAG(Router, TAG('R','O','U','T')); FIBE->Free = FreeFIB; FIBE->NetworkAddress = NetworkAddress; FIBE->Netmask = Netmask; - FIBE->NTE = NTE; FIBE->Router = Router; FIBE->Metric = Metric; @@ -346,8 +379,9 @@ PNEIGHBOR_CACHE_ENTRY RouterGetRoute( TI_DbgPrint(DEBUG_ROUTER, ("Called. Destination (0x%X) NTE (0x%X).\n", Destination, NTE)); - TI_DbgPrint(DEBUG_ROUTER, ("Destination (%s) NTE (%s).\n", - A2S(Destination), A2S(NTE->Address))); + TI_DbgPrint(DEBUG_ROUTER, ("Destination (%s)\n", A2S(Destination))); + if( NTE ) + TI_DbgPrint(DEBUG_ROUTER, ("NTE (%s).\n", A2S(NTE->Address))); KeAcquireSpinLock(&FIBLock, &OldIrql); @@ -476,7 +510,7 @@ PFIB_ENTRY RouterCreateRouteIPv4( ReferenceObject(pNetworkAddress); ReferenceObject(pNetmask); - FIBE = RouterAddRoute(pNetworkAddress, pNetmask, NTE, NCE, 1); + FIBE = RouterAddRoute(pNetworkAddress, pNetmask, NCE, 1); if (!FIBE) { /* Not enough free resources */ NBRemoveNeighbor(NCE); diff --git a/reactos/drivers/net/tcpip/network/transmit.c b/reactos/drivers/net/tcpip/network/transmit.c index fc8168ae656..020ad46e88c 100644 --- a/reactos/drivers/net/tcpip/network/transmit.c +++ b/reactos/drivers/net/tcpip/network/transmit.c @@ -7,6 +7,7 @@ * REVISIONS: * CSH 01/08-2000 Created */ +#include <roscfg.h> #include <tcpip.h> #include <transmit.h> #include <routines.h> @@ -66,6 +67,7 @@ BOOLEAN PrepareNextFragment( /* Calculate checksum of IP header */ Header->Checksum = 0; Header->Checksum = (USHORT)IPv4Checksum(Header, IFC->HeaderSize, 0); + TI_DbgPrint(MID_TRACE,("IP Check: %x\n", Header->Checksum)); /* Update pointers */ IFC->DatagramData = (PVOID)((ULONG_PTR)IFC->DatagramData + DataSize); @@ -103,23 +105,23 @@ NTSTATUS SendFragments( TI_DbgPrint(MAX_TRACE, ("Called. IPPacket (0x%X) NCE (0x%X) PathMTU (%d).\n", IPPacket, NCE, PathMTU)); - IFC = ExAllocatePool(NonPagedPool, sizeof(IPFRAGMENT_CONTEXT)); + IFC = exAllocatePool(NonPagedPool, sizeof(IPFRAGMENT_CONTEXT)); if (IFC == NULL) return STATUS_INSUFFICIENT_RESOURCES; /* We allocate a buffer for a PathMTU sized packet and reuse it for all fragments */ - Data = ExAllocatePool(NonPagedPool, MaxLLHeaderSize + PathMTU); + Data = exAllocatePool(NonPagedPool, MaxLLHeaderSize + PathMTU); if (Data == NULL) { - ExFreePool(IFC); + exFreePool(IFC); return STATUS_INSUFFICIENT_RESOURCES; } /* Allocate NDIS packet */ NdisAllocatePacket(&NdisStatus, &IFC->NdisPacket, GlobalPacketPool); if (NdisStatus != NDIS_STATUS_SUCCESS) { - ExFreePool(Data); - ExFreePool(IFC); + exFreePool(Data); + exFreePool(IFC); return STATUS_INSUFFICIENT_RESOURCES; } @@ -127,9 +129,9 @@ NTSTATUS SendFragments( NdisAllocateBuffer(&NdisStatus, &IFC->NdisBuffer, GlobalBufferPool, Data, MaxLLHeaderSize + PathMTU); if (NdisStatus != NDIS_STATUS_SUCCESS) { - NdisFreePacket(IFC->NdisPacket); - ExFreePool(Data); - ExFreePool(IFC); + FreeNdisPacket(IFC->NdisPacket); + exFreePool(Data); + exFreePool(IFC); return STATUS_INSUFFICIENT_RESOURCES; } @@ -206,8 +208,11 @@ VOID IPSendComplete( /* There are no more fragments to transmit, so call completion handler */ NdisPacket = IFC->Datagram; FreeNdisPacket(IFC->NdisPacket); - ExFreePool(IFC); - (*PC(NdisPacket)->Complete)(PC(NdisPacket)->Context, NdisPacket, NdisStatus); + exFreePool(IFC); + (*PC(NdisPacket)->Complete) + (PC(NdisPacket)->Context, + NdisPacket, + NdisStatus); } } } @@ -304,10 +309,11 @@ NTSTATUS IPSendDatagram( TI_DbgPrint(MAX_TRACE, ("Called. IPPacket (0x%X) RCN (0x%X)\n", IPPacket, RCN)); DISPLAY_IP_PACKET(IPPacket); + OskitDumpBuffer( IPPacket->Header, IPPacket->TotalSize ); NCE = RCN->NCE; -#if DBG +#ifdef DBG if (!NCE) { TI_DbgPrint(MIN_TRACE, ("No NCE to use.\n")); FreeNdisPacket(IPPacket->NdisPacket); @@ -317,16 +323,20 @@ NTSTATUS IPSendDatagram( /* Fetch path MTU now, because it may change */ PathMTU = RCN->PathMTU; + TI_DbgPrint(MID_TRACE,("PathMTU: %d\n", PathMTU)); if (IPPacket->TotalSize > PathMTU) { + TI_DbgPrint(MID_TRACE,("Doing SendFragments\n")); return SendFragments(IPPacket, NCE, PathMTU); } else { if ((IPPacket->Flags & IP_PACKET_FLAG_RAW) == 0) { /* Calculate checksum of IP header */ + TI_DbgPrint(MID_TRACE,("-> not IP_PACKET_FLAG_RAW\n")); ((PIPv4_HEADER)IPPacket->Header)->Checksum = 0; ((PIPv4_HEADER)IPPacket->Header)->Checksum = (USHORT) IPv4Checksum(IPPacket->Header, IPPacket->HeaderSize, 0); + TI_DbgPrint(MID_TRACE,("IP Check: %x\n", ((PIPv4_HEADER)IPPacket->Header)->Checksum)); TI_DbgPrint(MAX_TRACE, ("Sending packet (length is %d).\n", WN2H(((PIPv4_HEADER)IPPacket->Header)->TotalLength))); diff --git a/reactos/drivers/net/tcpip/notes.txt b/reactos/drivers/net/tcpip/notes.txt index 242d649039c..6d877f4fad7 100644 --- a/reactos/drivers/net/tcpip/notes.txt +++ b/reactos/drivers/net/tcpip/notes.txt @@ -1,4 +1,12 @@ +Ideas for optimizations: + +* transmit.c (SendFragments, IPSendComplete): + Keep IPFRAGMENT_CONTEXT objects and PathMTU buffers in a pool + + +References: + RFC 791 - Internet Protocol http://www.faqs.org/rfcs/rfc791.html diff --git a/reactos/drivers/net/tcpip/tcpip/address.c b/reactos/drivers/net/tcpip/tcpip/address.c index 5828c36d4da..3443675e974 100644 --- a/reactos/drivers/net/tcpip/tcpip/address.c +++ b/reactos/drivers/net/tcpip/tcpip/address.c @@ -7,6 +7,7 @@ * REVISIONS: * CSH 01/08-2000 Created */ +#include <roscfg.h> #include <tcpip.h> #include <address.h> #include <pool.h> @@ -164,7 +165,9 @@ NTSTATUS AddrGetAddress( } } - IPAddress = ExAllocatePool(NonPagedPool, sizeof(IP_ADDRESS)); + IPAddress = ExAllocatePoolWithTag(NonPagedPool, + sizeof(IP_ADDRESS), + FOURCC('I','P','v','4')); if (IPAddress) { AddrInitIPv4(IPAddress, ValidAddr->in_addr); *Address = IPAddress; diff --git a/reactos/drivers/net/tcpip/tcpip/checksum.c b/reactos/drivers/net/tcpip/tcpip/checksum.c index 2566b6b82c4..1a5b45daec5 100644 --- a/reactos/drivers/net/tcpip/tcpip/checksum.c +++ b/reactos/drivers/net/tcpip/tcpip/checksum.c @@ -8,6 +8,7 @@ * REVISIONS: * CSH 01/08-2000 Created */ +#include <roscfg.h> #include <tcpip.h> #include <checksum.h> diff --git a/reactos/drivers/net/tcpip/tcpip/dispatch.c b/reactos/drivers/net/tcpip/tcpip/dispatch.c index cec2fb22ef5..fe1ec1e7fa5 100644 --- a/reactos/drivers/net/tcpip/tcpip/dispatch.c +++ b/reactos/drivers/net/tcpip/tcpip/dispatch.c @@ -8,6 +8,7 @@ * CSH 01/08-2000 Created * TODO: Validate device object in all dispatch routines */ +#include <roscfg.h> #include <tcpip.h> #include <dispatch.h> #include <routines.h> @@ -53,13 +54,9 @@ NTSTATUS DispPrepareIrpForCancel( Irp->IoStatus.Status = STATUS_CANCELLED; Irp->IoStatus.Information = 0; - TI_DbgPrint(DEBUG_IRP, ("Completing IRP at (0x%X).\n", Irp)); - - IoCompleteRequest(Irp, IO_NETWORK_INCREMENT); - TI_DbgPrint(DEBUG_IRP, ("Leaving (IRP was already cancelled).\n")); - return STATUS_CANCELLED; + return IRPFinish(Irp, STATUS_CANCELLED); } @@ -223,7 +220,7 @@ VOID DispDataRequestComplete( TI_DbgPrint(DEBUG_IRP, ("Completing IRP at (0x%X).\n", Irp)); - IoCompleteRequest(Irp, IO_NETWORK_INCREMENT); + IRPFinish(Irp, STATUS_SUCCESS); } @@ -239,7 +236,7 @@ NTSTATUS DispTdiAccept( { TI_DbgPrint(DEBUG_IRP, ("Called.\n")); - return STATUS_NOT_IMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; } @@ -378,11 +375,14 @@ NTSTATUS DispTdiConnect( Request.RequestNotifyObject = DispDataRequestComplete; Request.RequestContext = Irp; + /* XXX Handle connected UDP, etc... */ Status = TCPConnect( &Request, Parameters->RequestConnectionInformation, Parameters->ReturnConnectionInformation); + TI_DbgPrint(MAX_TRACE, ("TCP Connect returned %08x\n", Status)); + return Status; } @@ -555,36 +555,7 @@ NTSTATUS DispTdiListen( Parameters = (PTDI_REQUEST_KERNEL)&IrpSp->Parameters; - /* Initialize a listen request */ - Request = (PTDI_REQUEST) ExAllocatePool(NonPagedPool, sizeof(TDI_REQUEST)); - if (Request == NULL) - { - return STATUS_NO_MEMORY; - } - - Status = DispPrepareIrpForCancel(TranContext, Irp, NULL); - if (NT_SUCCESS(Status)) - { - Request->Handle.ConnectionContext = TranContext->Handle.ConnectionContext; - Request->RequestNotifyObject = DispDataRequestComplete; - Request->RequestContext = Irp; - - Status = TCPListen( - Request, - Parameters->RequestConnectionInformation, - Parameters->ReturnConnectionInformation); - if (Status != STATUS_PENDING) - { - IoAcquireCancelSpinLock(&OldIrql); - IoSetCancelRoutine(Irp, NULL); - IoReleaseCancelSpinLock(OldIrql); - } - } - - if (Status != STATUS_PENDING) - { - ExFreePool(Request); - } + Status = TCPListen( Request, 1024 /* BACKLOG */ ); return Status; } @@ -683,9 +654,61 @@ NTSTATUS DispTdiReceive( * Status of operation */ { + 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")); - return STATUS_NOT_IMPLEMENTED; + IrpSp = IoGetCurrentIrpStackLocation(Irp); + ReceiveInfo = (PTDI_REQUEST_KERNEL_RECEIVE)&(IrpSp->Parameters); + + TranContext = IrpSp->FileObject->FsContext; + if (TranContext == NULL) + { + TI_DbgPrint(MID_TRACE, ("Bad transport context.\n")); + return STATUS_INVALID_CONNECTION; + } + + if (TranContext->Handle.ConnectionContext == NULL) + { + TI_DbgPrint(MID_TRACE, ("No connection endpoint file object.\n")); + return STATUS_INVALID_CONNECTION; + } + + /* 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); + if (NT_SUCCESS(Status)) + { + Status = TCPReceiveData( + &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; } @@ -712,6 +735,12 @@ NTSTATUS DispTdiReceiveDatagram( DgramInfo = (PTDI_REQUEST_KERNEL_RECEIVEDG)&(IrpSp->Parameters); TranContext = IrpSp->FileObject->FsContext; + if (TranContext == NULL) + { + TI_DbgPrint(MID_TRACE, ("Bad transport context.\n")); + return STATUS_INVALID_ADDRESS; + } + /* Initialize a receive request */ Request.Handle.AddressHandle = TranContext->Handle.AddressHandle; Request.RequestNotifyObject = DispDataRequestComplete; @@ -720,22 +749,26 @@ NTSTATUS DispTdiReceiveDatagram( IrpSp->FileObject->FsContext, Irp, (PDRIVER_CANCEL)DispCancelRequest); - if (NT_SUCCESS(Status)) { - Status = UDPReceiveDatagram( - &Request, - DgramInfo->ReceiveDatagramInformation, - (PNDIS_BUFFER)Irp->MdlAddress, - DgramInfo->ReceiveLength, - DgramInfo->ReceiveFlags, - DgramInfo->ReturnDatagramInformation, - &BytesReceived); - if (Status != STATUS_PENDING) { - DispDataRequestComplete(Irp, Status, BytesReceived); - /* Return STATUS_PENDING because DispPrepareIrpForCancel marks - the Irp as pending */ - Status = STATUS_PENDING; + if (NT_SUCCESS(Status)) + { + Status = UDPReceiveDatagram( + &Request, + DgramInfo->ReceiveDatagramInformation, + (PNDIS_BUFFER)Irp->MdlAddress, + DgramInfo->ReceiveLength, + DgramInfo->ReceiveFlags, + DgramInfo->ReturnDatagramInformation, + &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)); @@ -753,9 +786,46 @@ NTSTATUS DispTdiSend( * Status of operation */ { + PIO_STACK_LOCATION IrpSp; + TDI_REQUEST Request; + PTDI_REQUEST_KERNEL_SEND SendInfo; + PTRANSPORT_CONTEXT TranContext; + NTSTATUS Status; + TI_DbgPrint(DEBUG_IRP, ("Called.\n")); - return STATUS_NOT_IMPLEMENTED; + IrpSp = IoGetCurrentIrpStackLocation(Irp); + SendInfo = (PTDI_REQUEST_KERNEL_SEND)&(IrpSp->Parameters); + TranContext = IrpSp->FileObject->FsContext; + + /* 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; + } + } + + TI_DbgPrint(DEBUG_IRP, ("Leaving.\n")); + + return Status; } @@ -1209,9 +1279,7 @@ NTSTATUS DispTdiSetInformationEx( TI_DbgPrint(DEBUG_IRP, ("Completing IRP at (0x%X).\n", Irp)); - IoCompleteRequest(Irp, IO_NETWORK_INCREMENT); - - return STATUS_INVALID_PARAMETER; + return IRPFinish(Irp, STATUS_INVALID_PARAMETER); } Status = DispPrepareIrpForCancel(TranContext, Irp, NULL); diff --git a/reactos/drivers/net/tcpip/tcpip/fileobjs.c b/reactos/drivers/net/tcpip/tcpip/fileobjs.c index dbfef4f77c4..a482a62152f 100644 --- a/reactos/drivers/net/tcpip/tcpip/fileobjs.c +++ b/reactos/drivers/net/tcpip/tcpip/fileobjs.c @@ -7,6 +7,7 @@ * REVISIONS: * CSH 01/08-2000 Created */ +#include <roscfg.h> #include <tcpip.h> #include <datagram.h> #include <address.h> @@ -16,6 +17,7 @@ #include <udp.h> #include <ip.h> #include <fileobjs.h> +#include <oskittcp.h> /* List of all address file objects managed by this driver */ LIST_ENTRY AddressFileListHead; @@ -98,7 +100,8 @@ VOID DeleteAddress( CurrentEntry = AddrFile->TransmitQueue.Flink; while (CurrentEntry != &AddrFile->TransmitQueue) { NextEntry = CurrentEntry->Flink; - SendRequest = CONTAINING_RECORD(CurrentEntry, DATAGRAM_SEND_REQUEST, ListEntry); + SendRequest = CONTAINING_RECORD(CurrentEntry, + DATAGRAM_SEND_REQUEST, ListEntry); /* Abort the request and free its resources */ KeReleaseSpinLock(&AddrFile->Lock, OldIrql); (*SendRequest->Complete)(SendRequest->Context, STATUS_ADDRESS_CLOSED, 0); @@ -309,7 +312,7 @@ NTSTATUS FileOpenAddress( case IPPROTO_TCP: /* FIXME: If specified port is 0, a port is chosen dynamically */ AddrFile->Port = Address->Address[0].Address[0].sin_port; - AddrFile->Send = TCPSendDatagram; + AddrFile->Send = TCPSendData; break; case IPPROTO_UDP: @@ -437,7 +440,9 @@ NTSTATUS FileOpenConnection( PTDI_REQUEST Request, PVOID ClientContext) { + NTSTATUS Status; PCONNECTION_ENDPOINT Connection; + PADDRESS_FILE AddrFile; TI_DbgPrint(MID_TRACE, ("Called.\n")); @@ -455,15 +460,26 @@ NTSTATUS FileOpenConnection( /* Reference the object */ Connection->RefCount = 1; - /* Put connection in the closed state */ - Connection->State = ctClosed; - /* Save client context pointer */ Connection->ClientContext = ClientContext; + Status = OskitTCPSocket( Connection, + &Connection->SocketContext, + AF_INET, + SOCK_STREAM, + IPPROTO_TCP ); + DbgPrint("STATUS from OSKITTCP was %08x\n", Status); + + /* Initialize receive requests queue */ + InitializeListHead(&Connection->ReceiveRequests); - /* Initialize receive queue */ + /* Initialize received segments queue */ InitializeListHead(&Connection->ReceivedSegments); +TI_DbgPrint(MIN_TRACE, ("X1 cur 0x%x\n", &Connection->ReceivedSegments)); +TI_DbgPrint(MIN_TRACE, ("X1 Flink 0x%x\n", Connection->ReceivedSegments.Flink)); +TI_DbgPrint(MIN_TRACE, ("X1 Blink 0x%x\n", Connection->ReceivedSegments.Blink)); + + /* Return connection endpoint file object */ Request->Handle.ConnectionContext = Connection; @@ -497,43 +513,9 @@ NTSTATUS FileCloseConnection( Connection = Request->Handle.ConnectionContext; -#if 0 - KeAcquireSpinLock(&Connection->Lock, &OldIrql); - if ((!AF_IS_BUSY(Connection)) && (Connection->RefCount == 1)) { - /* Set connection endpoint file object exclusive to us */ - AF_SET_BUSY(Connection); - AF_CLR_VALID(Connection); + TCPClose(Request); + DeleteConnectionEndpoint(Connection); - KeReleaseSpinLock(&Connection->Lock, OldIrql); -#endif - DeleteConnectionEndpoint(Connection); -#if 0 - } else { - if (!AF_IS_PENDING(Connection, AFF_DELETE)) { - Connection->Complete = Request->RequestNotifyObject; - Connection->Context = Request->RequestContext; - - /* Shedule connection endpoint for deletion */ - AF_SET_PENDING(Connection, AFF_DELETE); - AF_CLR_VALID(Connection); - - if (!AF_IS_BUSY(Connection)) { - /* Worker function is not running, so shedule it to run */ - AF_SET_BUSY(Connection); - KeReleaseSpinLock(&Connection->Lock, OldIrql); - ExQueueWorkItem(&Connection->WorkItem, CriticalWorkQueue); - } else - KeReleaseSpinLock(&Connection->Lock, OldIrql); - - TI_DbgPrint(MAX_TRACE, ("Leaving (pending).\n")); - - return STATUS_PENDING; - } else - Status = STATUS_ADDRESS_CLOSED; - - KeReleaseSpinLock(&Connection->Lock, OldIrql); - } -#endif TI_DbgPrint(MAX_TRACE, ("Leaving.\n")); return Status; diff --git a/reactos/drivers/net/tcpip/tcpip/iinfo.c b/reactos/drivers/net/tcpip/tcpip/iinfo.c new file mode 100644 index 00000000000..68935d6d87c --- /dev/null +++ b/reactos/drivers/net/tcpip/tcpip/iinfo.c @@ -0,0 +1,108 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS TCP/IP protocol driver + * FILE: tcpip/iinfo.c + * PURPOSE: Per-interface information. + * PROGRAMMERS: Art Yerkes + * REVISIONS: + * CSH 01/08-2000 Created + */ +#include <roscfg.h> +#include <tcpip.h> +#include <lan.h> +#include <address.h> +#include <info.h> +#include <pool.h> +#include <ip.h> + +TDI_STATUS InfoTdiQueryGetInterfaceMIB(TDIEntityID *ID, + PIP_INTERFACE Interface, + PNDIS_BUFFER Buffer, + PUINT BufferSize) { + TDI_STATUS Status = TDI_INVALID_REQUEST; + PIFENTRY OutData; + PLAN_ADAPTER IF = (PLAN_ADAPTER)Interface->Context; + PCHAR IFDescr; + KIRQL OldIrql; + ULONG Size; + UINT DescrLenMax = MAX_IFDESCR_LEN - 1; + + TI_DbgPrint(MAX_TRACE, + ("Getting IFEntry MIB (IF %08x LA %08x) (%04x:%d)\n", + Interface, IF, ID->tei_entity, ID->tei_instance)); + + OutData = + (PIFENTRY)ExAllocatePool( NonPagedPool, + sizeof(IFENTRY) + MAX_IFDESCR_LEN ); + + if( !OutData ) return TDI_INVALID_REQUEST; /* Out of memory */ + + RtlZeroMemory( OutData, sizeof(IFENTRY) + MAX_IFDESCR_LEN ); + + OutData->Index = ID->tei_instance + 1; + /* viz: tcpip keeps those indices */ + OutData->Type = IF ? 1 : 0; /* XXX other -- for now ... */ + OutData->Mtu = Interface->MTU; + TI_DbgPrint(MAX_TRACE, + ("Getting interface speed\n")); + OutData->PhysAddrLen = Interface->AddressLength; + OutData->AdminStatus = 1; /* XXX Up -- How do I know? */ + OutData->OperStatus = 1; /* XXX Up -- How do I know? */ + + IFDescr = (PCHAR)&OutData[1]; + + if( IF ) { + GetInterfaceSpeed( Interface, &OutData->Speed ); + TI_DbgPrint(MAX_TRACE, + ("IF Speed = %d * 100bps\n", OutData->Speed)); + memcpy(OutData->PhysAddr,Interface->Address,Interface->AddressLength); + TI_DbgPrint(MAX_TRACE, ("Got HWAddr\n")); + GetInterfaceName( Interface, IFDescr, MAX_IFDESCR_LEN - 1 ); + DescrLenMax = strlen( IFDescr ) + 1; + } + + IFDescr[DescrLenMax] = 0; /* Terminate ifdescr string */ + + TI_DbgPrint(MAX_TRACE, ("Copied in name %s\n", IFDescr)); + OutData->DescrLen = DescrLenMax; + IFDescr += DescrLenMax; + Size = IFDescr - (PCHAR)OutData + 1; + + TI_DbgPrint(MAX_TRACE, ("Finished IFEntry MIB (%04x:%d) size %d\n", + ID->tei_entity, ID->tei_instance, Size)); + + Status = InfoCopyOut( OutData, Size, Buffer, BufferSize ); + ExFreePool( OutData ); + + return Status; +} + +TDI_STATUS InfoInterfaceTdiQueryEx( UINT InfoClass, + UINT InfoType, + UINT InfoId, + PVOID Context, + TDIEntityID *id, + PNDIS_BUFFER Buffer, + PUINT BufferSize ) { + if( InfoClass == INFO_CLASS_GENERIC && + InfoType == INFO_TYPE_PROVIDER && + InfoId == ENTITY_TYPE_ID ) { + ULONG Temp = IF_MIB; + return InfoCopyOut( &Temp, sizeof(Temp), Buffer, BufferSize ); + } else if( InfoClass == INFO_CLASS_PROTOCOL && + InfoType == INFO_TYPE_PROVIDER && + InfoId == IF_MIB_STATS_ID ) { + return InfoTdiQueryGetInterfaceMIB( id, Context, Buffer, BufferSize ); + } else + return TDI_INVALID_REQUEST; +} + +TDI_STATUS InfoInterfaceTdiSetEx( UINT InfoClass, + UINT InfoType, + UINT InfoId, + PVOID Context, + TDIEntityID *id, + PCHAR Buffer, + UINT BufferSize ) { + return TDI_INVALID_REQUEST; +} diff --git a/reactos/drivers/net/tcpip/tcpip/info.c b/reactos/drivers/net/tcpip/tcpip/info.c index 2331821ba4d..0a54f6bf480 100644 --- a/reactos/drivers/net/tcpip/tcpip/info.c +++ b/reactos/drivers/net/tcpip/tcpip/info.c @@ -7,321 +7,110 @@ * REVISIONS: * CSH 01/08-2000 Created */ +#include <roscfg.h> #include <tcpip.h> #include <info.h> #include <routines.h> +#include <debug.h> +TDI_STATUS InfoCopyOut( PCHAR DataOut, UINT SizeOut, + PNDIS_BUFFER ClientBuf, PUINT ClientBufSize ) { + UINT RememberedCBSize = *ClientBufSize; + *ClientBufSize = SizeOut; + if( RememberedCBSize < SizeOut ) + return TDI_BUFFER_TOO_SMALL; + else { + CopyBufferToBufferChain( ClientBuf, 0, (PUCHAR)DataOut, SizeOut ); + return TDI_SUCCESS; + } +} -TDI_STATUS IPTdiQueryInformationEx( - PTDI_REQUEST Request, - TDIObjectID *ID, - PNDIS_BUFFER Buffer, - PUINT BufferSize, - PVOID Context) -/* - * FUNCTION: Returns extended information about network layer - * ARGUMENTS: - * Request = Pointer to TDI request structure for the request - * ID = TDI object ID - * Buffer = Pointer to buffer with data to use. - * BufferSize = Pointer to buffer with size of Buffer. On return - * this is filled with number of bytes returned - * Context = Pointer to context buffer - * RETURNS: - * Status of operation - */ -{ - PLIST_ENTRY CurrentIFEntry; - PLIST_ENTRY CurrentADEEntry; - PADDRESS_ENTRY CurrentADE; - PIP_INTERFACE CurrentIF; - IPADDR_ENTRY IpAddress; - IPSNMP_INFO SnmpInfo; - KIRQL OldIrql; - ULONG Entity; - ULONG Temp; - UINT Count; - UINT BufSize; +VOID InsertTDIInterfaceEntity( PIP_INTERFACE Interface ) { + KIRQL OldIrql; + UINT Count = 0, i; - BufSize = *BufferSize; + TI_DbgPrint(MAX_TRACE, + ("Inserting interface %08x (%d entities already)\n", + Interface, EntityCount)); - /* Make return parameters consistent every time */ - *BufferSize = 0; + KeAcquireSpinLock( &EntityListLock, &OldIrql ); - Entity = ID->toi_entity.tei_entity; - if (Entity != CL_NL_ENTITY) - { - /* We can't handle this entity */ - return TDI_INVALID_PARAMETER; + /* Count IP Entities */ + for( i = 0; i < EntityCount; i++ ) + if( EntityList[i].tei_entity == IF_ENTITY ) { + Count++; + TI_DbgPrint(MAX_TRACE, ("Entity %d is an IF. Found %d\n", + i, Count)); + } + + EntityList[EntityCount].tei_entity = IF_ENTITY; + EntityList[EntityCount].tei_instance = Count; + EntityList[EntityCount].context = Interface; + EntityList[EntityCount].info_req = InfoInterfaceTdiQueryEx; + EntityList[EntityCount].info_set = InfoInterfaceTdiSetEx; + + EntityCount++; + + KeReleaseSpinLock( &EntityListLock, OldIrql ); +} + +VOID RemoveTDIInterfaceEntity( PIP_INTERFACE Interface ) { + KIRQL OldIrql; + UINT Count = 0, i; + + KeAcquireSpinLock( &EntityListLock, &OldIrql ); + + /* Remove entities that have this interface as context + * In the future, this might include AT_ENTITY types, too + */ + for( i = 0; i < EntityCount; i++ ) { + if( EntityList[i].context == Interface ) { + if( i != EntityCount-1 ) + memcpy( &EntityList[i], + &EntityList[--EntityCount], + sizeof(EntityList[i]) ); + } } - if (ID->toi_entity.tei_instance != TL_INSTANCE) - { - /* Only a single instance is supported */ - return TDI_INVALID_REQUEST; - } - - if (ID->toi_class == INFO_CLASS_GENERIC) - { - if ((ID->toi_type == INFO_TYPE_PROVIDER) && - (ID->toi_id == ENTITY_TYPE_ID)) - { - if (BufSize < sizeof(ULONG)) - { - return TDI_BUFFER_TOO_SMALL; - } - - Temp = CL_NL_IP; - Count = CopyBufferToBufferChain(Buffer, 0, (PUCHAR)&Temp, sizeof(ULONG)); - - return TDI_SUCCESS; - } - - return TDI_INVALID_PARAMETER; - } - - if (ID->toi_class == INFO_CLASS_PROTOCOL) - { - if (ID->toi_type != INFO_TYPE_PROVIDER) - { - return TDI_INVALID_PARAMETER; - } - - switch (ID->toi_id) - { - case IP_MIB_ADDRTABLE_ENTRY_ID: - Temp = 0; - - KeAcquireSpinLock(&InterfaceListLock, &OldIrql); - - CurrentIFEntry = InterfaceListHead.Flink; - while (CurrentIFEntry != &InterfaceListHead) - { - CurrentIF = CONTAINING_RECORD(CurrentIFEntry, IP_INTERFACE, ListEntry); - - if (Temp + sizeof(IPADDR_ENTRY) > BufSize) - { - KeReleaseSpinLock(&InterfaceListLock, OldIrql); - return TDI_BUFFER_TOO_SMALL; - } - - IpAddress.Addr = 0; - IpAddress.BcastAddr = 0; - IpAddress.Mask = 0; - - /* Locate the diffrent addresses and put them the right place */ - CurrentADEEntry = CurrentIF->ADEListHead.Flink; - while (CurrentADEEntry != &CurrentIF->ADEListHead) - { - CurrentADE = CONTAINING_RECORD(CurrentADEEntry, ADDRESS_ENTRY, ListEntry); - - switch (CurrentADE->Type) - { - case ADE_UNICAST: - IpAddress.Addr = CurrentADE->Address->Address.IPv4Address; - break; - case ADE_MULTICAST: - IpAddress.BcastAddr = CurrentADE->Address->Address.IPv4Address; - break; - case ADE_ADDRMASK: - IpAddress.Mask = CurrentADE->Address->Address.IPv4Address; - break; - default: - /* Should not happen */ - TI_DbgPrint(MIN_TRACE, ("Unknown address entry type (0x%X)\n", CurrentADE->Type)); - break; - } - CurrentADEEntry = CurrentADEEntry->Flink; - } - - /* Pack the address information into IPADDR_ENTRY structure */ - IpAddress.Index = 0; - IpAddress.ReasmSize = 0; - IpAddress.Context = 0; - IpAddress.Pad = 0; - - Count = CopyBufferToBufferChain(Buffer, Temp, (PUCHAR)&IpAddress, sizeof(IPADDR_ENTRY)); - Temp += sizeof(IPADDR_ENTRY); - - CurrentIFEntry = CurrentIFEntry->Flink; - } - - KeReleaseSpinLock(&InterfaceListLock, OldIrql); - - return TDI_SUCCESS; - - case IP_MIB_STATS_ID: - if (BufSize < sizeof(IPSNMP_INFO)) - { - return TDI_BUFFER_TOO_SMALL; - } - - RtlZeroMemory(&SnmpInfo, sizeof(IPSNMP_INFO)); - - /* Count number of interfaces */ - Count = 0; - KeAcquireSpinLock(&InterfaceListLock, &OldIrql); - - CurrentIFEntry = InterfaceListHead.Flink; - while (CurrentIFEntry != &InterfaceListHead) - { - Count++; - CurrentIFEntry = CurrentIFEntry->Flink; - } - - KeReleaseSpinLock(&InterfaceListLock, OldIrql); - - SnmpInfo.NumIf = Count; - - /* Count number of addresses */ - Count = 0; - KeAcquireSpinLock(&InterfaceListLock, &OldIrql); - - CurrentIFEntry = InterfaceListHead.Flink; - while (CurrentIFEntry != &InterfaceListHead) - { - CurrentIF = CONTAINING_RECORD(CurrentIFEntry, IP_INTERFACE, ListEntry); - Count++; - CurrentIFEntry = CurrentIFEntry->Flink; - } - - KeReleaseSpinLock(&InterfaceListLock, OldIrql); - - SnmpInfo.NumAddr = Count; - Count = CopyBufferToBufferChain(Buffer, 0, (PUCHAR)&SnmpInfo, sizeof(IPSNMP_INFO)); - - return TDI_SUCCESS; - - default: - /* We can't handle this ID */ - return TDI_INVALID_PARAMETER; - } - } - - return TDI_INVALID_PARAMETER; + KeReleaseSpinLock( &EntityListLock, OldIrql ); } TDI_STATUS InfoTdiQueryListEntities(PNDIS_BUFFER Buffer, - UINT BufSize, PUINT BufferSize) { - UINT Count, Size, Temp; + UINT Count, Size, BufSize = *BufferSize; KIRQL OldIrql; + TDIEntityID *EntityOutList; PLIST_ENTRY CurrentIFEntry; - /* Count Adapters */ - KeAcquireSpinLock(&InterfaceListLock, &OldIrql); + TI_DbgPrint(MAX_TRACE,("About to copy %d TDIEntityIDs to user\n", + EntityCount)); - CurrentIFEntry = InterfaceListHead.Flink; - Count = EntityCount; - - while( CurrentIFEntry != &InterfaceListHead ) { - Count++; - CurrentIFEntry = CurrentIFEntry->Flink; - } - - KeReleaseSpinLock(&InterfaceListLock, OldIrql); - - Size = Count * sizeof(TDIEntityID); + KeAcquireSpinLock(&EntityListLock, &OldIrql); + + Size = EntityCount * sizeof(TDIEntityID); *BufferSize = Size; if (BufSize < Size) { + KeReleaseSpinLock( &EntityListLock, OldIrql ); /* The buffer is too small to contain requested data */ return TDI_BUFFER_TOO_SMALL; } - - DbgPrint("About to copy %d TDIEntityIDs (%d bytes) to user\n", - Count, Size); - - KeAcquireSpinLock(&EntityListLock, &OldIrql); - - /* Update entity list */ - for( Temp = EntityCount; Temp < Count; Temp++ ) { - EntityList[Temp].tei_entity = IF_ENTITY; - EntityList[Temp].tei_instance = Temp - EntityCount; + + /* Return entity list -- Copy only the TDIEntityID parts. */ + for( Count = 0; Count < EntityCount; Count++ ) { + CopyBufferToBufferChain(Buffer, + Count * sizeof(TDIEntityID), + (PUCHAR)&EntityList[Count], + sizeof(TDIEntityID)); } - EntityMax = Count; - - /* Return entity list */ - Count = CopyBufferToBufferChain(Buffer, 0, (PUCHAR)EntityList, Size); KeReleaseSpinLock(&EntityListLock, OldIrql); - *BufferSize = Size; - return TDI_SUCCESS; } -TDI_STATUS InfoTdiQueryGetInterfaceMIB(TDIObjectID *ID, - PNDIS_BUFFER Buffer, - UINT BufSize, - PUINT BufferSize) { - PIFENTRY OutData; - UINT ListedIfIndex, Count, Size; - PLIST_ENTRY CurrentADEEntry; - PADDRESS_ENTRY CurrentADE; - PLIST_ENTRY CurrentIFEntry; - PIP_INTERFACE CurrentIF; - PCHAR IFDescr; - KIRQL OldIrql; - - OutData = ExAllocatePool( NonPagedPool, - sizeof(IFENTRY) + MAX_IFDESCR_LEN ); - - if( !OutData ) return STATUS_NO_MEMORY; - - RtlZeroMemory( OutData,sizeof(IFENTRY) + MAX_IFDESCR_LEN ); - - KeAcquireSpinLock(&EntityListLock, &OldIrql); - ListedIfIndex = ID->toi_entity.tei_instance - EntityCount; - if( ListedIfIndex > EntityMax ) { - KeReleaseSpinLock(&EntityListLock,OldIrql); - return TDI_INVALID_REQUEST; - } - - CurrentIFEntry = InterfaceListHead.Flink; - - for( Count = 0; Count < ListedIfIndex; Count++ ) - CurrentIFEntry = CurrentIFEntry->Flink; - - CurrentIF = CONTAINING_RECORD(CurrentIFEntry, IP_INTERFACE, ListEntry); - - CurrentADEEntry = CurrentIF->ADEListHead.Flink; - if( CurrentADEEntry == &CurrentIF->ADEListHead ) { - KeReleaseSpinLock( &EntityListLock, OldIrql ); - return TDI_INVALID_REQUEST; - } - - CurrentADE = CONTAINING_RECORD(CurrentADEEntry, ADDRESS_ENTRY, ListEntry); - - OutData->Index = Count + 1; /* XXX - arty What goes here?? */ - OutData->Type = CurrentADE->Type; - OutData->Mtu = CurrentIF->MTU; - OutData->Speed = 10000000; /* XXX - arty Not sure */ - memcpy(OutData->PhysAddr, - CurrentIF->Address,CurrentIF->AddressLength); - OutData->PhysAddrLen = CurrentIF->AddressLength; - OutData->AdminStatus = TRUE; - OutData->OperStatus = TRUE; - IFDescr = (PCHAR)&OutData[1]; - strcpy(IFDescr,"ethernet adapter"); - OutData->DescrLen = strlen(IFDescr); - IFDescr = IFDescr + strlen(IFDescr); - Size = IFDescr - (PCHAR)OutData; - - KeReleaseSpinLock(&InterfaceListLock, OldIrql); - - *BufferSize = Size; - - if( BufSize < Size ) { - return TDI_BUFFER_TOO_SMALL; - } else { - CopyBufferToBufferChain(Buffer, 0, (PUCHAR)&OutData, Size); - return TDI_SUCCESS; - } -} - TDI_STATUS InfoTdiQueryInformationEx( PTDI_REQUEST Request, TDIObjectID *ID, @@ -341,170 +130,72 @@ TDI_STATUS InfoTdiQueryInformationEx( * Status of operation */ { - PLIST_ENTRY CurrentIFEntry; - PLIST_ENTRY CurrentADEEntry; - PLIST_ENTRY CurrentADFEntry; - PADDRESS_FILE CurrentADF; - PADDRESS_ENTRY CurrentADE; - PIP_INTERFACE CurrentIF; - ADDRESS_INFO Info; - KIRQL OldIrql; - UINT BufSize; - UINT Entity; - UINT Offset; - ULONG Temp; - UINT Count; - UINT Size; - TDIEntityID EntityId; + KIRQL OldIrql; + UINT i; + PVOID context; + NTSTATUS Status = STATUS_SUCCESS; + TDIEntityID EntityId; + BOOL FoundEntity = FALSE; + InfoRequest_f InfoRequest; - Offset = 0; - BufSize = *BufferSize; + TI_DbgPrint(MAX_TRACE, + ("InfoEx Req: %x %x %x!%04x:%d\n", + ID->toi_class, + ID->toi_type, + ID->toi_id, + ID->toi_entity.tei_entity, + ID->toi_entity.tei_instance)); - /* Check wether it is a query for a list of entities */ - Entity = ID->toi_entity.tei_entity; - if (Entity == GENERIC_ENTITY) + /* Check wether it is a query for a list of entities */ + if (ID->toi_entity.tei_entity == GENERIC_ENTITY) { - if ((ID->toi_class != INFO_CLASS_GENERIC) || - (ID->toi_type != INFO_TYPE_PROVIDER) || - (ID->toi_id != ENTITY_LIST_ID)) - { - return TDI_INVALID_PARAMETER; - } - - return InfoTdiQueryListEntities(Buffer, BufSize, BufferSize); - } - - /* Get an IFENTRY */ - if (ID->toi_class == INFO_CLASS_PROTOCOL && - ID->toi_type == INFO_TYPE_PROVIDER && - ID->toi_id == IF_MIB_STATS_ID) - { - if(ID->toi_entity.tei_entity != IF_ENTITY) - return TDI_INVALID_REQUEST; - - return InfoTdiQueryGetInterfaceMIB(ID, Buffer, BufSize, BufferSize); - } - - if ((Entity != CL_TL_ENTITY) && (Entity != CO_TL_ENTITY)) - { - /* We can't handle this entity, pass it on */ - return IPTdiQueryInformationEx( - Request, ID, Buffer, BufferSize, Context); - } - - /* Make return parameters consistent every time */ - *BufferSize = 0; - - if (ID->toi_entity.tei_instance != TL_INSTANCE) - { - /* We only support a single instance */ - return TDI_INVALID_REQUEST; - } - - if (ID->toi_class == INFO_CLASS_GENERIC) - { - if ((ID->toi_type != INFO_TYPE_PROVIDER) || - (ID->toi_id != ENTITY_TYPE_ID)) - return TDI_INVALID_PARAMETER; - - if (BufSize < sizeof(ULONG)) - { - return TDI_BUFFER_TOO_SMALL; - } - - if (Entity == CL_TL_ENTITY) - { - Temp = CL_TL_UDP; - } - else if (Entity == CO_TL_ENTITY) - { - Temp = CO_TL_TCP; - } + if ((ID->toi_class != INFO_CLASS_GENERIC) || + (ID->toi_type != INFO_TYPE_PROVIDER) || + (ID->toi_id != ENTITY_LIST_ID)) + Status = TDI_INVALID_PARAMETER; else - { - return TDI_INVALID_PARAMETER; - } - - Count = CopyBufferToBufferChain(Buffer, 0, (PUCHAR)&Temp, sizeof(ULONG)); - - return TDI_SUCCESS; + Status = InfoTdiQueryListEntities(Buffer, BufferSize); + } else { + KeAcquireSpinLock( &EntityListLock, &OldIrql ); + + for( i = 0; i < EntityCount; i++ ) { + if( EntityList[i].tei_entity == ID->toi_entity.tei_entity && + EntityList[i].tei_instance == ID->toi_entity.tei_instance ) { + InfoRequest = EntityList[i].info_req; + context = EntityList[i].context; + FoundEntity = TRUE; + break; + } + } + + KeReleaseSpinLock( &EntityListLock, OldIrql ); + + if( FoundEntity ) { + TI_DbgPrint(MAX_TRACE, + ("Calling Entity %d (%04x:%d) InfoEx (%x,%x,%x)\n", + i, ID->toi_entity.tei_entity, + ID->toi_entity.tei_instance, + ID->toi_class, ID->toi_type, ID->toi_id)); + Status = InfoRequest( ID->toi_class, + ID->toi_type, + ID->toi_id, + context, + &ID->toi_entity, + Buffer, + BufferSize ); + } } - if (ID->toi_class == INFO_CLASS_PROTOCOL) - { - if (ID->toi_type != INFO_TYPE_PROVIDER) - { - return TDI_INVALID_PARAMETER; - } + TI_DbgPrint(MAX_TRACE,("Status: %08x\n", Status)); - switch (ID->toi_id) - { - case UDP_MIB_STAT_ID: - if (Entity != CL_TL_ENTITY) - { - return TDI_INVALID_PARAMETER; - } - - if (BufSize < sizeof(UDPStats)) - { - return TDI_BUFFER_TOO_SMALL; - } - - Count = CopyBufferToBufferChain(Buffer, 0, (PUCHAR)&UDPStats, sizeof(UDP_STATISTICS)); - - return TDI_SUCCESS; - - case UDP_MIB_TABLE_ID: - if (Entity != CL_TL_ENTITY) - { - return TDI_INVALID_PARAMETER; - } - - Offset = 0; - - KeAcquireSpinLock(&AddressFileListLock, &OldIrql); - - CurrentADFEntry = AddressFileListHead.Flink; - while (CurrentADFEntry != &AddressFileListHead) - { - CurrentADF = CONTAINING_RECORD(CurrentADFEntry, ADDRESS_FILE, ListEntry); - - if (Offset + sizeof(ADDRESS_INFO) > BufSize) - { - KeReleaseSpinLock(&AddressFileListLock, OldIrql); - *BufferSize = Offset; - return TDI_BUFFER_OVERFLOW; - } - - Info.LocalAddress = CurrentADF->ADE->Address->Address.IPv4Address; - Info.LocalPort = CurrentADF->Port; - - Count = CopyBufferToBufferChain(Buffer, Offset, (PUCHAR)&Info, sizeof(ADDRESS_INFO)); - Offset += Count; - - CurrentADFEntry = CurrentADFEntry->Flink; - } - - KeReleaseSpinLock(&AddressFileListLock, OldIrql); - - *BufferSize = Offset; - - return STATUS_SUCCESS; - - default: - /* We can't handle this ID */ - return TDI_INVALID_PARAMETER; - } - } - - return TDI_INVALID_PARAMETER; + return Status; } -TDI_STATUS InfoTdiSetInformationEx( - PTDI_REQUEST Request, - TDIObjectID *ID, - PVOID Buffer, - UINT BufferSize) +TDI_STATUS InfoTdiSetInformationEx +(PTDI_REQUEST Request, + TDIObjectID *ID, + PVOID Buffer, + UINT BufferSize) /* * FUNCTION: Sets extended information * ARGUMENTS: @@ -516,30 +207,30 @@ TDI_STATUS InfoTdiSetInformationEx( * Status of operation */ { - switch( ID->toi_class ) { - case INFO_CLASS_PROTOCOL: - switch( ID->toi_type ) { - case INFO_TYPE_PROVIDER: - switch( ID->toi_id ) { - case IP_MIB_ROUTETABLE_ENTRY_ID: - if( ID->toi_entity.tei_entity == CL_NL_ENTITY && - ID->toi_entity.tei_instance == TL_INSTANCE && - BufferSize >= sizeof(IPROUTE_ENTRY) ) { - /* Add route -- buffer is an IPRouteEntry */ - PIPROUTE_ENTRY ire = (PIPROUTE_ENTRY)Buffer; - RouteFriendlyAddRoute( ire ); - } else { - return TDI_INVALID_PARAMETER; - /* In my experience, we are being over - protective compared to windows */ + switch( ID->toi_class ) { + case INFO_CLASS_PROTOCOL: + switch( ID->toi_type ) { + case INFO_TYPE_PROVIDER: + switch( ID->toi_id ) { + case IP_MIB_ROUTETABLE_ENTRY_ID: + if( ID->toi_entity.tei_entity == CL_NL_ENTITY && + ID->toi_entity.tei_instance == TL_INSTANCE && + BufferSize >= sizeof(IPROUTE_ENTRY) ) { + /* Add route -- buffer is an IPRouteEntry */ + PIPROUTE_ENTRY ire = (PIPROUTE_ENTRY)Buffer; + RouteFriendlyAddRoute( ire ); + } else { + return TDI_INVALID_PARAMETER; + /* In my experience, we are being over + protective compared to windows */ + } + break; + } + break; } break; - } - break; } - break; - } - - return TDI_INVALID_PARAMETER; -} + return TDI_INVALID_PARAMETER; +} + diff --git a/reactos/drivers/net/tcpip/tcpip/interface.c b/reactos/drivers/net/tcpip/tcpip/interface.c new file mode 100644 index 00000000000..f19f1022e28 --- /dev/null +++ b/reactos/drivers/net/tcpip/tcpip/interface.c @@ -0,0 +1,108 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS TCP/IP protocol driver + * FILE: tcpip/interface.c + * PURPOSE: Convenient abstraction for getting and setting information + * in IP_INTERFACE. + * PROGRAMMERS: Art Yerkes + * REVISIONS: + * CSH 01/08-2000 Created + */ +#include <roscfg.h> +#include <tcpip.h> +#include <lan.h> +#include <address.h> +#include <pool.h> +#include <ip.h> + +NTSTATUS GetInterfaceIPv4Address( PIP_INTERFACE Interface, + ULONG TargetType, + PULONG Address ) { + PLIST_ENTRY CurrentIFEntry; + PLIST_ENTRY CurrentADEEntry; + PADDRESS_ENTRY CurrentADE; + + CurrentADEEntry = Interface->ADEListHead.Flink; + while (CurrentADEEntry != &Interface->ADEListHead) + { + CurrentADE = CONTAINING_RECORD(CurrentADEEntry, ADDRESS_ENTRY, ListEntry); + if (CurrentADE->Type == TargetType) { + *Address = CurrentADE->Address->Address.IPv4Address; + return STATUS_SUCCESS; + } + CurrentADEEntry = CurrentADEEntry->Flink; + } + + return STATUS_UNSUCCESSFUL; +} + +UINT CountInterfaces() { + DWORD Count = 0; + KIRQL OldIrql; + PLIST_ENTRY CurrentIFEntry; + + KeAcquireSpinLock(&InterfaceListLock, &OldIrql); + + CurrentIFEntry = InterfaceListHead.Flink; + while (CurrentIFEntry != &InterfaceListHead) { + Count++; + CurrentIFEntry = CurrentIFEntry->Flink; + } + + KeReleaseSpinLock(&InterfaceListLock, OldIrql); + + return Count; +} + +UINT CountInterfaceAddresses( PIP_INTERFACE Interface ) { + UINT AddrCount = 0; + PADDRESS_ENTRY CurrentADE; + PLIST_ENTRY CurrentADEntry; + + CurrentADEntry = Interface->ADEListHead.Flink; + + while( CurrentADEntry != &Interface->ADEListHead ) { + CurrentADEntry = CurrentADEntry->Flink; + CurrentADE = CONTAINING_RECORD(CurrentADEntry, + ADDRESS_ENTRY, + ListEntry); + if( CurrentADE->Type == ADE_UNICAST ) + AddrCount++; + } + + return AddrCount; +} + +NTSTATUS GetInterfaceSpeed( PIP_INTERFACE Interface, PUINT Speed ) { + NDIS_STATUS NdisStatus; + PLAN_ADAPTER IF = (PLAN_ADAPTER)Interface->Context; + + /* Get maximum link speed */ + NdisStatus = NDISCall(IF, + NdisRequestQueryInformation, + OID_GEN_LINK_SPEED, + Speed, + sizeof(UINT)); + + return + NdisStatus != NDIS_STATUS_SUCCESS ? + STATUS_UNSUCCESSFUL : STATUS_SUCCESS; +} + +NTSTATUS GetInterfaceName( PIP_INTERFACE Interface, + PCHAR NameBuffer, + UINT Len ) { + NDIS_STATUS NdisStatus; + PLAN_ADAPTER IF = (PLAN_ADAPTER)Interface->Context; + + /* Get maximum link speed */ + NdisStatus = NDISCall(IF, + NdisRequestQueryInformation, + OID_GEN_FRIENDLY_NAME, + NameBuffer, + Len); + + return + NdisStatus != NDIS_STATUS_SUCCESS ? + STATUS_UNSUCCESSFUL : STATUS_SUCCESS; +} diff --git a/reactos/drivers/net/tcpip/tcpip/irp.c b/reactos/drivers/net/tcpip/tcpip/irp.c new file mode 100644 index 00000000000..a19e10fabc2 --- /dev/null +++ b/reactos/drivers/net/tcpip/tcpip/irp.c @@ -0,0 +1,30 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS TCP/IP protocol driver + * FILE: tcpip/dispatch.h + * PURPOSE: TDI dispatch routines + * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net) + * REVISIONS: + * CSH 01/08-2000 Created + * TODO: Validate device object in all dispatch routines + */ +#include <roscfg.h> +#include <tcpip.h> +#include <dispatch.h> +#include <routines.h> +#include <datagram.h> +#include <info.h> + +NTSTATUS IRPFinish( PIRP Irp, NTSTATUS Status ) { + IoSetCancelRoutine( Irp, NULL ); + + if( Status == STATUS_PENDING ) + IoMarkIrpPending( Irp ); + else { + Irp->IoStatus.Status = Status; + IoCompleteRequest( Irp, IO_NETWORK_INCREMENT ); + } + + return Status; +} + diff --git a/reactos/drivers/net/tcpip/tcpip/main.c b/reactos/drivers/net/tcpip/tcpip/main.c index 1aec90bb6b4..4fa181cfa1c 100644 --- a/reactos/drivers/net/tcpip/tcpip/main.c +++ b/reactos/drivers/net/tcpip/tcpip/main.c @@ -17,6 +17,8 @@ #include <udp.h> #include <tcp.h> #include <rosrtl/string.h> +#include <info.h> +#include <memtrack.h> #define NDEBUG @@ -33,7 +35,7 @@ PDEVICE_OBJECT RawIPDeviceObject = NULL; NDIS_HANDLE GlobalPacketPool = NULL; NDIS_HANDLE GlobalBufferPool = NULL; KSPIN_LOCK EntityListLock; -TDIEntityID *EntityList = NULL; +TDIEntityInfo *EntityList = NULL; ULONG EntityCount = 0; ULONG EntityMax = 0; UDP_STATISTICS UDPStats; @@ -456,18 +458,9 @@ TiDispatchOpenClose( Status = STATUS_INVALID_DEVICE_REQUEST; } - if (Status != STATUS_PENDING) { - IrpSp->Control &= ~SL_PENDING_RETURNED; - Irp->IoStatus.Status = Status; - - TI_DbgPrint(DEBUG_IRP, ("Completing IRP at (0x%X).\n", Irp)); - - IoCompleteRequest(Irp, IO_NETWORK_INCREMENT); - } - TI_DbgPrint(DEBUG_IRP, ("Leaving. Status is (0x%X)\n", Status)); - return Status; + return IRPFinish( Irp, Status ); } @@ -487,7 +480,7 @@ TiDispatchInternal( * Status of the operation */ { - NTSTATUS Status; + NTSTATUS Status; PIO_STACK_LOCATION IrpSp; IrpSp = IoGetCurrentIrpStackLocation(Irp); @@ -560,17 +553,9 @@ TiDispatchInternal( Status = STATUS_INVALID_DEVICE_REQUEST; } - if (Status != STATUS_PENDING) { - Irp->IoStatus.Status = Status; - - TI_DbgPrint(DEBUG_IRP, ("Completing IRP at (0x%X).\n", Irp)); - - IoCompleteRequest(Irp, IO_NETWORK_INCREMENT); - } - TI_DbgPrint(DEBUG_IRP, ("Leaving. Status = (0x%X).\n", Status)); - return Status; + return IRPFinish( Irp, Status ); } @@ -627,17 +612,9 @@ TiDispatch( } } - if (Status != STATUS_PENDING) { - Irp->IoStatus.Status = Status; - - TI_DbgPrint(DEBUG_IRP, ("Completing IRP at (0x%X).\n", Irp)); - - IoCompleteRequest(Irp, IO_NETWORK_INCREMENT); - } - TI_DbgPrint(DEBUG_IRP, ("Leaving. Status = (0x%X).\n", Status)); - return Status; + return IRPFinish( Irp, Status ); } @@ -726,6 +703,14 @@ DriverEntry( NDIS_STRING DeviceName; TI_DbgPrint(MAX_TRACE, ("Called.\n")); + + TrackingInit(); + TrackTag(NDIS_BUFFER_TAG); + TrackTag(NDIS_PACKET_TAG); + TrackTag(FBSD_MALLOC); + TrackTag(EXALLOC_TAG); + + InitOskitTCP(); /* TdiInitialize() ? */ @@ -770,6 +755,28 @@ DriverEntry( return Status; } + /* Setup network layer and transport layer entities */ + KeInitializeSpinLock(&EntityListLock); + EntityList = ExAllocatePool(NonPagedPool, sizeof(TDIEntityID) * MAX_TDI_ENTITIES ); + if (!NT_SUCCESS(Status)) { + TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); + TiUnload(DriverObject); + return STATUS_INSUFFICIENT_RESOURCES; + } + + EntityList[0].tei_entity = CL_NL_ENTITY; + EntityList[0].tei_instance = 0; + EntityList[0].context = 0; + EntityList[0].info_req = InfoNetworkLayerTdiQueryEx; + EntityList[0].info_set = InfoNetworkLayerTdiSetEx; + EntityList[1].tei_entity = CL_TL_ENTITY; + EntityList[1].tei_instance = 0; + EntityList[1].context = 0; + EntityList[1].info_req = InfoTransportLayerTdiQueryEx; + EntityList[1].info_set = InfoTransportLayerTdiSetEx; + EntityCount = 2; + EntityMax = MAX_TDI_ENTITIES; + /* Allocate NDIS packet descriptors */ NdisAllocatePacketPool(&NdisStatus, &GlobalPacketPool, 100, sizeof(PACKET_CONTEXT)); if (NdisStatus != NDIS_STATUS_SUCCESS) { @@ -830,22 +837,6 @@ DriverEntry( return STATUS_INSUFFICIENT_RESOURCES; } - /* Setup network layer and transport layer entities */ - KeInitializeSpinLock(&EntityListLock); - EntityList = ExAllocatePool(NonPagedPool, sizeof(TDIEntityID) * MAX_TDI_ENTITIES ); - if (!NT_SUCCESS(Status)) { - TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); - TiUnload(DriverObject); - return STATUS_INSUFFICIENT_RESOURCES; - } - - EntityList[0].tei_entity = CL_NL_ENTITY; - EntityList[0].tei_instance = 0; - EntityList[1].tei_entity = CL_TL_ENTITY; - EntityList[1].tei_instance = 0; - EntityCount = 2; - EntityMax = MAX_TDI_ENTITIES; - /* Use direct I/O */ IPDeviceObject->Flags |= DO_DIRECT_IO; RawIPDeviceObject->Flags |= DO_DIRECT_IO; diff --git a/reactos/drivers/net/tcpip/tcpip/memtrack.c b/reactos/drivers/net/tcpip/tcpip/memtrack.c new file mode 100644 index 00000000000..ea75ca65563 --- /dev/null +++ b/reactos/drivers/net/tcpip/tcpip/memtrack.c @@ -0,0 +1,146 @@ +#define MEMTRACK_NO_POOL +#include <roscfg.h> +#include <tcpip.h> +#include <ntddk.h> +#include <memtrack.h> + +#ifdef MEMTRACK +LIST_ENTRY AllocatedObjectsList; +KSPIN_LOCK AllocatedObjectsLock; +DWORD TagsToShow[MEMTRACK_MAX_TAGS_TO_TRACK] = { 0 }; + +VOID TrackTag( DWORD Tag ) { + UINT i; + + for( i = 0; TagsToShow[i]; i++ ); + TagsToShow[i] = Tag; +} + +VOID TrackingInit() { + KeInitializeSpinLock( &AllocatedObjectsLock ); + InitializeListHead( &AllocatedObjectsList ); +} + +VOID ShowTrackedThing( PCHAR What, PALLOCATION_TRACKER Thing, + PCHAR File, UINT Line ) { + /* if( ShowTag( Thing->Tag ) ) */ + if( File ) { + DbgPrint( "[%s] Thing %08x %c%c%c%c (%s:%d) (Called from %s:%d)\n", + What, + Thing->Thing, + ((PCHAR)&Thing->Tag)[3], + ((PCHAR)&Thing->Tag)[2], + ((PCHAR)&Thing->Tag)[1], + ((PCHAR)&Thing->Tag)[0], + Thing->FileName, + Thing->LineNo, + File, Line ); + } else { + DbgPrint( "[%s] Thing %08x %c%c%c%c (%s:%d)\n", + What, + Thing->Thing, + ((PCHAR)&Thing->Tag)[3], + ((PCHAR)&Thing->Tag)[2], + ((PCHAR)&Thing->Tag)[1], + ((PCHAR)&Thing->Tag)[0], + Thing->FileName, + Thing->LineNo ); + } +} + +VOID TrackWithTag( DWORD Tag, PVOID Thing, PCHAR FileName, DWORD LineNo ) { + PALLOCATION_TRACKER TrackedThing = + ExAllocatePool( NonPagedPool, sizeof(*TrackedThing) ); + + KIRQL OldIrql; + PLIST_ENTRY Entry; + PALLOCATION_TRACKER ThingInList; + + KeAcquireSpinLock( &AllocatedObjectsLock, &OldIrql ); + Entry = AllocatedObjectsList.Flink; + while( Entry != &AllocatedObjectsList ) { + ThingInList = CONTAINING_RECORD(Entry, ALLOCATION_TRACKER, Entry); + if( ThingInList->Thing == Thing ) { + RemoveEntryList(Entry); + + ShowTrackedThing( "Alloc", ThingInList, FileName, LineNo ); + + ExFreePool( ThingInList ); + TrackDumpFL( FileName, LineNo ); + KeReleaseSpinLock( &AllocatedObjectsLock, OldIrql ); + DbgPrint("TRACK: SPECIFIED ALREADY ALLOCATED ITEM %x\n", Thing); + KeBugCheck( 0 ); + } + Entry = Entry->Flink; + } + + KeReleaseSpinLock( &AllocatedObjectsLock, OldIrql ); + + if( TrackedThing ) { + TrackedThing->Tag = Tag; + TrackedThing->Thing = Thing; + TrackedThing->FileName = FileName; + TrackedThing->LineNo = LineNo; + + ExInterlockedInsertTailList( &AllocatedObjectsList, + &TrackedThing->Entry, + &AllocatedObjectsLock ); + ShowTrackedThing( "Alloc", TrackedThing, FileName, LineNo ); + } + + /*TrackDumpFL( FileName, LineNo );*/ +} + +BOOL ShowTag( DWORD Tag ) { + UINT i; + + for( i = 0; TagsToShow[i] && TagsToShow[i] != Tag; i++ ); + + return TagsToShow[i] ? TRUE : FALSE; +} + +VOID UntrackFL( PCHAR File, DWORD Line, PVOID Thing ) { + KIRQL OldIrql; + PLIST_ENTRY Entry; + PALLOCATION_TRACKER ThingInList; + + KeAcquireSpinLock( &AllocatedObjectsLock, &OldIrql ); + Entry = AllocatedObjectsList.Flink; + while( Entry != &AllocatedObjectsList ) { + ThingInList = CONTAINING_RECORD(Entry, ALLOCATION_TRACKER, Entry); + if( ThingInList->Thing == Thing ) { + RemoveEntryList(Entry); + + ShowTrackedThing( "Free ", ThingInList, File, Line ); + + ExFreePool( ThingInList ); + KeReleaseSpinLock( &AllocatedObjectsLock, OldIrql ); + /* TrackDumpFL( File, Line ); */ + return; + } + Entry = Entry->Flink; + } + KeReleaseSpinLock( &AllocatedObjectsLock, OldIrql ); + TrackDumpFL( File, Line ); + DbgPrint("UNTRACK: SPECIFIED ALREADY FREE ITEM %x\n", Thing); + KeBugCheck( 0 ); +} + +VOID TrackDumpFL( PCHAR File, DWORD Line ) { + KIRQL OldIrql; + PLIST_ENTRY Entry; + PALLOCATION_TRACKER Thing; + + DbgPrint("Dump: %s:%d\n", File, Line); + + KeAcquireSpinLock( &AllocatedObjectsLock, &OldIrql ); + Entry = AllocatedObjectsList.Flink; + while( Entry != &AllocatedObjectsList ) { + Thing = CONTAINING_RECORD(Entry, ALLOCATION_TRACKER, Entry); + ShowTrackedThing( "Dump ", Thing, 0, 0 ); + Entry = Entry->Flink; + } + KeReleaseSpinLock( &AllocatedObjectsLock, OldIrql ); +} + +#endif/*MEMTRACK*/ diff --git a/reactos/drivers/net/tcpip/tcpip/ninfo.c b/reactos/drivers/net/tcpip/tcpip/ninfo.c new file mode 100644 index 00000000000..f6f61f8e595 --- /dev/null +++ b/reactos/drivers/net/tcpip/tcpip/ninfo.c @@ -0,0 +1,248 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS TCP/IP protocol driver + * FILE: tcpip/ninfo.c + * PURPOSE: Network information + * PROGRAMMERS: Art Yerkes + * REVISIONS: + * CSH 01/08-2000 Created + */ +#include <roscfg.h> +#include <tcpip.h> +#include <address.h> +#include <info.h> +#include <pool.h> +#include <prefix.h> +#include <ip.h> +#include <route.h> + +TDI_STATUS InfoTdiQueryGetAddrTable( PNDIS_BUFFER Buffer, + PUINT BufferSize ) { + PIP_INTERFACE CurrentIF; + PLIST_ENTRY CurrentIFEntry; + TDI_STATUS Status = TDI_INVALID_REQUEST; + KIRQL OldIrql; + UINT Count = 1; /* Start adapter indices at 1 */ + UINT IfCount = CountInterfaces(); + PIPADDR_ENTRY IpAddress = + ExAllocatePool( NonPagedPool, sizeof( IPADDR_ENTRY ) * IfCount ); + PIPADDR_ENTRY IpCurrent = IpAddress; + + TI_DbgPrint(MAX_TRACE, ("Called.\n")); + + KeAcquireSpinLock(&InterfaceListLock, &OldIrql); + + CurrentIFEntry = InterfaceListHead.Flink; + while (CurrentIFEntry != &InterfaceListHead) + { + CurrentIF = CONTAINING_RECORD(CurrentIFEntry, IP_INTERFACE, ListEntry); + + IpCurrent->Index = Count; + IpCurrent->Addr = 0; + IpCurrent->BcastAddr = 0; + IpCurrent->Mask = 0; + + /* Locate the diffrent addresses and put them the right place */ + GetInterfaceIPv4Address( CurrentIF, + ADE_UNICAST, + &IpAddress->Addr ); + GetInterfaceIPv4Address( CurrentIF, + ADE_MULTICAST, + &IpAddress->BcastAddr ); + GetInterfaceIPv4Address( CurrentIF, + ADE_ADDRMASK, + &IpAddress->Mask ); + IpCurrent++; + CurrentIFEntry = CurrentIFEntry->Flink; + Count++; + } + + KeReleaseSpinLock(&InterfaceListLock, OldIrql); + + Status = InfoCopyOut( IpAddress, sizeof(*IpAddress) * Count, + Buffer, BufferSize ); + + ExFreePool( IpAddress ); + + TI_DbgPrint(MAX_TRACE, ("Returning %08x\n", Status)); + + return Status; +} + +/* Get IPRouteEntry s for each of the routes in the system */ +TDI_STATUS InfoTdiQueryGetRouteTable( PNDIS_BUFFER Buffer, PUINT BufferSize ) { + PIP_INTERFACE CurrentIF; + PLIST_ENTRY CurrentIFEntry; + TDI_STATUS Status; + KIRQL OldIrql; + UINT RtCount = CountFIBs(), + Size = sizeof( IPROUTE_ENTRY ) * RtCount; + PFIB_ENTRY RCache = + ExAllocatePool( NonPagedPool, sizeof( FIB_ENTRY ) * RtCount ), + RCacheCur = RCache; + PIPROUTE_ENTRY RouteEntries = ExAllocatePool( NonPagedPool, Size ), + RtCurrent = RouteEntries; + + TI_DbgPrint(MAX_TRACE, ("Called, routes = %d, RCache = %08x\n", + RtCount, RCache)); + + if( !RCache || !RouteEntries ) { + if( RCache ) ExFreePool( RCache ); + if( RouteEntries ) ExFreePool( RouteEntries ); + return STATUS_NO_MEMORY; + } + + RtlZeroMemory( RouteEntries, Size ); + + RtCount = CopyFIBs( RCache ); + + while( RtCurrent < RouteEntries + RtCount ) { + /* Copy Desitnation */ + if( RCacheCur->NetworkAddress && RCacheCur->Netmask && + RCacheCur->Router && RCacheCur->Router->Address ) { + TI_DbgPrint(MAX_TRACE, ("%d: NA %08x NM %08x GW %08x MT %d\n", + RtCurrent - RouteEntries, + RCacheCur->NetworkAddress->Address, + RCacheCur->Netmask->Address, + RCacheCur->Router->Address->Address, + RCacheCur->Metric)); + + RtlCopyMemory( &RtCurrent->Dest, + &RCacheCur->NetworkAddress->Address, + sizeof(RtCurrent->Dest) ); + RtlCopyMemory( &RtCurrent->Mask, + &RCacheCur->Netmask->Address, + sizeof(RtCurrent->Mask) ); + /* Currently, this address is stuffed into the pointer. + * That probably is not intended. */ + RtlCopyMemory( &RtCurrent->Gw, + &RCacheCur->Router->Address->Address, + sizeof(RtCurrent->Gw) ); + RtCurrent->Metric1 = RCacheCur->Metric; + RtCurrent->Type = 2 /* PF_INET */; + + KeAcquireSpinLock(&EntityListLock, &OldIrql); + for( RtCurrent->Index = EntityCount - 1; + RtCurrent->Index >= 0 && + RCacheCur->Router->Interface != + EntityList[RtCurrent->Index].context; + RtCurrent->Index-- ); + RtCurrent->Index = EntityList[RtCurrent->Index].tei_instance; + KeReleaseSpinLock(&EntityListLock, OldIrql); + } else { + TI_DbgPrint(MAX_TRACE, ("%d: BAD: NA %08x NM %08x GW %08x MT %d\n", + RtCurrent - RouteEntries, + RCacheCur->NetworkAddress, + RCacheCur->Netmask, + RCacheCur->Router, + RCacheCur->Router ? + RCacheCur->Router->Address : 0, + RCacheCur->Metric)); + } + RtCurrent++; RCacheCur++; + } + + Status = InfoCopyOut( RouteEntries, Size, Buffer, BufferSize ); + + ExFreePool( RouteEntries ); + ExFreePool( RCache ); + + TI_DbgPrint(MAX_TRACE, ("Returning %08x\n", Status)); + + return Status; +} + +TDI_STATUS InfoTdiQueryGetIPSnmpInfo( PNDIS_BUFFER Buffer, + PUINT BufferSize ) { + KIRQL OldIrql; + PIP_INTERFACE CurrentIF; + PLIST_ENTRY CurrentIFEntry; + IPSNMP_INFO SnmpInfo; + UINT IfCount = CountInterfaces(); + UINT AddrCount = 0; + UINT RouteCount = CountRouteNodes( NULL ); + TDI_STATUS Status = TDI_INVALID_REQUEST; + + TI_DbgPrint(MAX_TRACE, ("Called.\n")); + + RtlZeroMemory(&SnmpInfo, sizeof(IPSNMP_INFO)); + + /* Count number of addresses */ + AddrCount = 0; + KeAcquireSpinLock(&InterfaceListLock, &OldIrql); + + CurrentIFEntry = InterfaceListHead.Flink; + while (CurrentIFEntry != &InterfaceListHead) + { + CurrentIF = CONTAINING_RECORD(CurrentIFEntry, IP_INTERFACE, ListEntry); + AddrCount += CountInterfaceAddresses( CurrentIF ); + CurrentIFEntry = CurrentIFEntry->Flink; + } + + KeReleaseSpinLock(&InterfaceListLock, OldIrql); + + SnmpInfo.NumIf = IfCount; + SnmpInfo.NumAddr = AddrCount; + SnmpInfo.NumRoutes = RouteCount; + + Status = InfoCopyOut( &SnmpInfo, sizeof(SnmpInfo), + Buffer, BufferSize ); + + TI_DbgPrint(MAX_TRACE, ("Returning %08x\n", Status)); + + return Status; +} + +TDI_STATUS InfoNetworkLayerTdiQueryEx( UINT InfoClass, + UINT InfoType, + UINT InfoId, + PVOID Context, + TDIEntityID *id, + PNDIS_BUFFER Buffer, + PUINT BufferSize ) { + TDI_STATUS Status = TDI_INVALID_REQUEST; + + TI_DbgPrint(MAX_TRACE, ("Called.\n")); + + switch( InfoClass ) { + case INFO_CLASS_GENERIC: + if( InfoType == INFO_TYPE_PROVIDER && InfoId == ENTITY_TYPE_ID ) { + ULONG Return = CL_NL_IP; + Status = InfoCopyOut( &Return, sizeof(Return), + Buffer, BufferSize ); + } + break; + + case INFO_CLASS_PROTOCOL: + switch( InfoType ) { + case INFO_TYPE_PROVIDER: + switch( InfoId ) { + case IP_MIB_ADDRTABLE_ENTRY_ID: + Status = InfoTdiQueryGetAddrTable( Buffer, BufferSize ); + break; + + case IP_MIB_ROUTETABLE_ENTRY_ID: + Status = InfoTdiQueryGetRouteTable( Buffer, BufferSize ); + break; + + case IP_MIB_STATS_ID: + Status = InfoTdiQueryGetIPSnmpInfo( Buffer, BufferSize ); + break; + } + break; + } + } + + TI_DbgPrint(MAX_TRACE, ("Returning %08x\n", Status)); + + return Status; +} + +TDI_STATUS InfoNetworkLayerTdiSetEx( UINT InfoClass, + UINT InfoType, + UINT InfoId, + PVOID Context, + TDIEntityID *id, + PCHAR Buffer, + UINT BufferSize ) { +} diff --git a/reactos/drivers/net/tcpip/tcpip/pool.c b/reactos/drivers/net/tcpip/tcpip/pool.c index ca6782289e3..00b764f9e17 100644 --- a/reactos/drivers/net/tcpip/tcpip/pool.c +++ b/reactos/drivers/net/tcpip/tcpip/pool.c @@ -7,6 +7,7 @@ * REVISIONS: * CSH 01/08-2000 Created */ +#include <roscfg.h> #include <tcpip.h> #include <pool.h> diff --git a/reactos/drivers/net/tcpip/tcpip/routines.c b/reactos/drivers/net/tcpip/tcpip/routines.c index dbf303d230b..cfbac1d14df 100644 --- a/reactos/drivers/net/tcpip/tcpip/routines.c +++ b/reactos/drivers/net/tcpip/tcpip/routines.c @@ -7,6 +7,7 @@ * REVISIONS: * CSH 01/08-2000 Created */ +#include <roscfg.h> #include <tcpip.h> #include <routines.h> #include <pool.h> @@ -16,89 +17,6 @@ static UINT RandomNumber = 0x12345678; -inline NTSTATUS BuildDatagramSendRequest( - PDATAGRAM_SEND_REQUEST *SendRequest, - PIP_ADDRESS RemoteAddress, - USHORT RemotePort, - PNDIS_BUFFER Buffer, - DWORD BufferSize, - DATAGRAM_COMPLETION_ROUTINE Complete, - PVOID Context, - DATAGRAM_BUILD_ROUTINE Build, - ULONG Flags) -/* - * FUNCTION: Allocates and intializes a datagram send request - * ARGUMENTS: - * SendRequest = Pointer to datagram send request - * RemoteAddress = Pointer to remote IP address - * RemotePort = Remote port number - * Buffer = Pointer to NDIS buffer to send - * BufferSize = Size of Buffer - * Complete = Completion routine - * Context = Pointer to context information - * Build = Datagram build routine - * Flags = Protocol specific flags - * RETURNS: - * Status of operation - */ -{ - PDATAGRAM_SEND_REQUEST Request; - - Request = ExAllocatePool(NonPagedPool, sizeof(DATAGRAM_SEND_REQUEST)); - if (!Request) - return STATUS_INSUFFICIENT_RESOURCES; - - InitializeDatagramSendRequest( - Request, - RemoteAddress, - RemotePort, - Buffer, - BufferSize, - Complete, - Context, - Build, - Flags); - - *SendRequest = Request; - - return STATUS_SUCCESS; -} - - -inline NTSTATUS BuildTCPSendRequest( - PTCP_SEND_REQUEST *SendRequest, - DATAGRAM_COMPLETION_ROUTINE Complete, - PVOID Context, - PVOID ProtocolContext) -/* - * FUNCTION: Allocates and intializes a TCP send request - * ARGUMENTS: - * SendRequest = Pointer to TCP send request - * Complete = Completion routine - * Context = Pointer to context information - * ProtocolContext = Protocol specific context - * RETURNS: - * Status of operation - */ -{ - PTCP_SEND_REQUEST Request; - - Request = ExAllocatePool(NonPagedPool, sizeof(TCP_SEND_REQUEST)); - if (!Request) - return STATUS_INSUFFICIENT_RESOURCES; - - InitializeTCPSendRequest( - Request, - Complete, - Context, - ProtocolContext); - - *SendRequest = Request; - - return STATUS_SUCCESS; -} - - UINT Random( VOID) /* @@ -389,35 +307,6 @@ UINT CopyPacketToBufferChain( } -VOID FreeNdisPacket( - PNDIS_PACKET Packet) -/* - * FUNCTION: Frees an NDIS packet - * ARGUMENTS: - * Packet = Pointer to NDIS packet to be freed - */ -{ - PNDIS_BUFFER Buffer, NextBuffer; - - TI_DbgPrint(DEBUG_BUFFER, ("Packet (0x%X)\n", Packet)); - - /* Free all the buffers in the packet first */ - NdisQueryPacket(Packet, NULL, NULL, &Buffer, NULL); - for (; Buffer != NULL; Buffer = NextBuffer) { - PVOID Data; - UINT Length; - - NdisGetNextBuffer(Buffer, &NextBuffer); - NdisQueryBuffer(Buffer, &Data, &Length); - NdisFreeBuffer(Buffer); - ExFreePool(Data); - } - - /* Finally free the NDIS packet discriptor */ - NdisFreePacket(Packet); -} - - PVOID AdjustPacket( PNDIS_PACKET Packet, UINT Available, @@ -538,32 +427,21 @@ VOID DisplayIPPacket( for (; Buffer != NULL; Buffer = NextBuffer) { NdisGetNextBuffer(Buffer, &NextBuffer); NdisQueryBuffer(Buffer, (PVOID)&p, &Length); - - for (i = 0; i < Length; i++) { - if (i % 16 == 0) - DbgPrint("\n"); - DbgPrint("%02X ", (p[i]) & 0xFF); - } - DbgPrint("\n"); + OskitDumpBuffer( p, Length ); } } else { p = IPPacket->Header; Length = IPPacket->ContigSize; - for (i = 0; i < Length; i++) { - if (i % 16 == 0) - DbgPrint("\n"); - DbgPrint("%02X ", (p[i]) & 0xFF); - } - DbgPrint("\n"); + OskitDumpBuffer( p, Length ); } if (IPPacket->NdisPacket) { NdisQueryPacket(IPPacket->NdisPacket, NULL, NULL, NULL, &Length); Length -= MaxLLHeaderSize; - CharBuffer = ExAllocatePool(NonPagedPool, Length); + CharBuffer = exAllocatePool(NonPagedPool, Length); Length = CopyPacketToBuffer(CharBuffer, IPPacket->NdisPacket, MaxLLHeaderSize, Length); DisplayIPHeader(CharBuffer, Length); - ExFreePool(CharBuffer); + exFreePool(CharBuffer); } else { CharBuffer = IPPacket->Header; Length = IPPacket->ContigSize; @@ -633,10 +511,10 @@ VOID DisplayTCPPacket( if (IPPacket->NdisPacket) { NdisQueryPacket(IPPacket->NdisPacket, NULL, NULL, NULL, &Length); Length -= MaxLLHeaderSize; - Buffer = ExAllocatePool(NonPagedPool, Length); + Buffer = exAllocatePool(NonPagedPool, Length); Length = CopyPacketToBuffer(Buffer, IPPacket->NdisPacket, MaxLLHeaderSize, Length); DisplayTCPHeader(Buffer, Length); - ExFreePool(Buffer); + exFreePool(Buffer); } else { Buffer = IPPacket->Header; Length = IPPacket->ContigSize; @@ -644,4 +522,90 @@ VOID DisplayTCPPacket( } } -#endif /* DBG */ +#endif DBG /* DBG */ + +void GetDataPtr( PNDIS_PACKET Packet, + UINT Offset, + PUCHAR *DataOut, + PUINT Size ) { + PNDIS_BUFFER Buffer; + + NdisQueryPacket(Packet, NULL, NULL, &Buffer, NULL); + if( !Buffer ) return NULL; + SkipToOffset( Buffer, Offset, DataOut, Size ); +} + + +#undef NdisAllocatePacket +#undef NdisAllocateBuffer +#undef NdisFreeBuffer +#undef NdisFreePacket + +NDIS_STATUS AllocatePacketWithBufferX( PNDIS_PACKET *NdisPacket, + PCHAR Data, UINT Len, + PCHAR File, UINT Line ) { + PNDIS_PACKET Packet; + PNDIS_BUFFER Buffer; + NDIS_STATUS Status; + PCHAR NewData; + + NewData = ExAllocatePool( NonPagedPool, Len ); + if( !NewData ) return NDIS_STATUS_NOT_ACCEPTED; // XXX + TrackWithTag(EXALLOC_TAG, NewData, File, Line); + + if( Data ) + RtlCopyMemory(NewData, Data, Len); + + NdisAllocatePacket( &Status, &Packet, GlobalPacketPool ); + if( Status != NDIS_STATUS_SUCCESS ) { + ExFreePool( NewData ); + return Status; + } + TrackWithTag(NDIS_PACKET_TAG, Packet, File, Line); + + NdisAllocateBuffer( &Status, &Buffer, GlobalBufferPool, NewData, Len ); + if( Status != NDIS_STATUS_SUCCESS ) { + ExFreePool( NewData ); + FreeNdisPacket( Packet ); + } + TrackWithTag(NDIS_BUFFER_TAG, Buffer, File, Line); + + NdisChainBufferAtFront( Packet, Buffer ); + *NdisPacket = Packet; + + return NDIS_STATUS_SUCCESS; +} + + +VOID FreeNdisPacketX +( PNDIS_PACKET Packet, + PCHAR File, + UINT Line ) +/* + * FUNCTION: Frees an NDIS packet + * ARGUMENTS: + * Packet = Pointer to NDIS packet to be freed + */ +{ + PNDIS_BUFFER Buffer, NextBuffer; + + TI_DbgPrint(DEBUG_BUFFER, ("Packet (0x%X)\n", Packet)); + + /* Free all the buffers in the packet first */ + NdisQueryPacket(Packet, NULL, NULL, &Buffer, NULL); + for (; Buffer != NULL; Buffer = NextBuffer) { + PVOID Data; + UINT Length; + + NdisGetNextBuffer(Buffer, &NextBuffer); + NdisQueryBuffer(Buffer, &Data, &Length); + NdisFreeBuffer(Buffer); + UntrackFL(File,Line,Buffer); + ExFreePool(Data); + UntrackFL(File,Line,Data); + } + + /* Finally free the NDIS packet discriptor */ + NdisFreePacket(Packet); + UntrackFL(File,Line,Packet); +} diff --git a/reactos/drivers/net/tcpip/tcpip/tinfo.c b/reactos/drivers/net/tcpip/tcpip/tinfo.c new file mode 100644 index 00000000000..6e2ee7628b2 --- /dev/null +++ b/reactos/drivers/net/tcpip/tcpip/tinfo.c @@ -0,0 +1,40 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS TCP/IP protocol driver + * FILE: tcpip/tinfo.c + * PURPOSE: Transport layer information + * PROGRAMMERS: Art Yerkes + * REVISIONS: + * CSH 01/08-2000 Created + */ +#include <roscfg.h> +#include <tcpip.h> +#include <address.h> +#include <pool.h> +#include <ip.h> + +TDI_STATUS InfoTransportLayerTdiQueryEx( UINT InfoClass, + UINT InfoType, + UINT InfoId, + PVOID Context, + TDIEntityID *id, + PNDIS_BUFFER Buffer, + PUINT BufferSize ) { + if( InfoClass == INFO_CLASS_GENERIC && + InfoType == INFO_TYPE_PROVIDER && + InfoId == ENTITY_TYPE_ID ) { + ULONG Temp = CL_TL_UDP; + return InfoCopyOut( &Temp, sizeof(Temp), Buffer, BufferSize ); + } + + return TDI_INVALID_REQUEST; +} + +TDI_STATUS InfoTransportLayerTdiSetEx( UINT InfoClass, + UINT InfoType, + UINT InfoId, + PVOID Context, + TDIEntityID *id, + PCHAR Buffer, + UINT BufferSize ) { +} diff --git a/reactos/drivers/net/tcpip/transport/datagram/datagram.c b/reactos/drivers/net/tcpip/transport/datagram/datagram.c index a7beb2746c5..14d6b2ca1d3 100644 --- a/reactos/drivers/net/tcpip/transport/datagram/datagram.c +++ b/reactos/drivers/net/tcpip/transport/datagram/datagram.c @@ -7,6 +7,7 @@ * REVISIONS: * CSH 01/08-2000 Created */ +#include <roscfg.h> #include <tcpip.h> #include <datagram.h> #include <routines.h> @@ -124,13 +125,6 @@ VOID SendDatagramComplete( CompleteContext = SendRequest->Context; BytesSent = SendRequest->BufferSize; - /* Remove data buffer before releasing memory for packet buffers */ - NdisQueryPacket(Packet, NULL, NULL, &NdisBuffer, NULL); - NdisUnchainBufferAtBack(Packet, &NdisBuffer); - FreeNdisPacket(Packet); - DereferenceObject(SendRequest->RemoteAddress); - ExFreePool(SendRequest); - /* If there are pending send requests, shedule worker function */ KeAcquireSpinLock(&DGPendingListLock, &OldIrql); QueueWorkItem = (!IsListEmpty(&DGPendingListHead)); @@ -141,7 +135,7 @@ VOID SendDatagramComplete( TI_DbgPrint(MAX_TRACE, ("Calling 0x%X.\n", Complete)); /* Call completion routine for send request */ - (*Complete)(CompleteContext, NdisStatus, BytesSent); + (*Complete)(Context, NdisStatus, BytesSent); TI_DbgPrint(MAX_TRACE, ("Leaving.\n")); } @@ -168,8 +162,6 @@ VOID DGSend( TI_DbgPrint(MAX_TRACE, ("Called.\n")); - ASSERT(SendRequest->Build); - /* Get the information we need from the address file now so we minimize the time we hold the spin lock */ KeAcquireSpinLock(&AddrFile->Lock, &OldIrql); @@ -182,71 +174,73 @@ VOID DGSend( /* Loop until there are no more send requests in the transmit queue or until we run out of resources */ for (;;) - { - Status = (*SendRequest->Build)(SendRequest, ADE->Address, LocalPort, &IPPacket); + { + TI_DbgPrint(MIN_TRACE, ("Looping on DGSend !!!! WHEE!\n")); if (!NT_SUCCESS(Status)) - { + { KeAcquireSpinLock(&AddrFile->Lock, &OldIrql); /* An error occurred, enqueue the send request again and return */ InsertHeadList(&AddrFile->TransmitQueue, &SendRequest->ListEntry); DereferenceObject(ADE); KeReleaseSpinLock(&AddrFile->Lock, OldIrql); - + TI_DbgPrint(MIN_TRACE, ("Leaving (insufficient resources).\n")); return; - } - + } + /* Get a route to the destination address */ - if (RouteGetRouteToDestination(SendRequest->RemoteAddress, ADE->NTE, &RCN) == IP_SUCCESS) - { + if (RouteGetRouteToDestination(&SendRequest->RemoteAddress, ADE->NTE, &RCN) == IP_SUCCESS) + { /* Set completion routine and send the packet */ + IPPacket = &SendRequest->Packet; PC(IPPacket->NdisPacket)->Complete = SendDatagramComplete; PC(IPPacket->NdisPacket)->Context = SendRequest; if (IPSendDatagram(IPPacket, RCN) != STATUS_SUCCESS) - { - SendDatagramComplete(SendRequest, - IPPacket->NdisPacket, - NDIS_STATUS_REQUEST_ABORTED); - } + { + TI_DbgPrint(MIN_TRACE, ("!! Datagram sent !! (completing)\n")); + SendDatagramComplete(SendRequest, + IPPacket->NdisPacket, + NDIS_STATUS_REQUEST_ABORTED); + } /* We're done with the RCN */ DereferenceObject(RCN); - } + } else - { - /* No route to destination */ - /* FIXME: Which error code should we use here? */ - TI_DbgPrint(MIN_TRACE, ("No route to destination address (0x%X).\n", - SendRequest->RemoteAddress->Address.IPv4Address)); - SendDatagramComplete(SendRequest, - IPPacket->NdisPacket, - NDIS_STATUS_REQUEST_ABORTED); - } + { + /* No route to destination */ + /* FIXME: Which error code should we use here? */ + TI_DbgPrint(MIN_TRACE, + ("No route to destination address (0x%X).\n", + SendRequest->RemoteAddress.Address.IPv4Address)); + SendDatagramComplete(SendRequest, + IPPacket->NdisPacket, + NDIS_STATUS_REQUEST_ABORTED); + } - (*IPPacket->Free)(IPPacket); - /* Check transmit queue for more to send */ - + KeAcquireSpinLock(&AddrFile->Lock, &OldIrql); - + if (!IsListEmpty(&AddrFile->TransmitQueue)) - { + { /* Transmit queue is not empty, process one more request */ CurrentEntry = RemoveHeadList(&AddrFile->TransmitQueue); SendRequest = CONTAINING_RECORD(CurrentEntry, DATAGRAM_SEND_REQUEST, ListEntry); - + KeReleaseSpinLock(&AddrFile->Lock, OldIrql); - } + TI_DbgPrint(MIN_TRACE, ("List is not empty\n")); + } else - { + { /* Transmit queue is empty */ AF_CLR_PENDING(AddrFile, AFF_SEND); DereferenceObject(ADE); KeReleaseSpinLock(&AddrFile->Lock, OldIrql); - + TI_DbgPrint(MAX_TRACE, ("Leaving (empty queue).\n")); return; - } - } + } + } } @@ -346,7 +340,7 @@ VOID DGDeliverData( { DereferenceObject(Current->RemoteAddress); } - ExFreePool(Current); + exFreePool(Current); } } else if (AddrFile->RegisteredReceiveDatagramHandler) @@ -431,8 +425,7 @@ VOID DGCancelSendRequest( { /* Complete the request and free its resources */ (*Current->Complete)(Current->Context, STATUS_CANCELLED, 0); - DereferenceObject(Current->RemoteAddress); - ExFreePool(Current); + exFreePool(Current); } else { @@ -489,7 +482,7 @@ VOID DGCancelReceiveRequest( { DereferenceObject(Current->RemoteAddress); } - ExFreePool(Current); + exFreePool(Current); } else { @@ -528,83 +521,80 @@ NTSTATUS DGTransmit( KeReleaseSpinLock(&AddressFile->Lock, OldIrql); /* Send the datagram */ DGSend(AddressFile, SendRequest); - TI_DbgPrint(MAX_TRACE, ("Leaving (pending).\n")); + TI_DbgPrint(MAX_TRACE, ("Leaving (pending).\n")); } return STATUS_PENDING; } -NTSTATUS DGSendDatagram( - PTDI_REQUEST Request, - PTDI_CONNECTION_INFORMATION ConnInfo, - PNDIS_BUFFER Buffer, - ULONG DataSize, - DATAGRAM_BUILD_ROUTINE Build) +NTSTATUS DGSendDatagram( PTDI_REQUEST Request, + PTDI_CONNECTION_INFORMATION ConnInfo, + PIP_PACKET Packet ) { /* * FUNCTION: Sends a datagram to a remote address * ARGUMENTS: * Request = Pointer to TDI request * ConnInfo = Pointer to connection information - * Buffer = Pointer to NDIS buffer with data - * DataSize = Size in bytes of data to be sent - * Build = Pointer to datagram build routine + * Packet = Pointer to NDIS buffer with data * RETURNS: * Status of operation */ -{ - PADDRESS_FILE AddrFile; - KIRQL OldIrql; - NTSTATUS Status; - PDATAGRAM_SEND_REQUEST SendRequest; - - TI_DbgPrint(MAX_TRACE, ("Called.\n")); - - AddrFile = Request->Handle.AddressHandle; - - KeAcquireSpinLock(&AddrFile->Lock, &OldIrql); - - if (AF_IS_VALID(AddrFile)) - { - /* Initialize a send request */ - Status = BuildDatagramSendRequest(&SendRequest, - NULL, - 0, - Buffer, - DataSize, - Request->RequestNotifyObject, - Request->RequestContext, - Build, - 0); - if (NT_SUCCESS(Status)) - { - Status = AddrGetAddress(ConnInfo->RemoteAddress, - &SendRequest->RemoteAddress, - &SendRequest->RemotePort, - &AddrFile->AddrCache); - if (NT_SUCCESS(Status)) - { - KeReleaseSpinLock(&AddrFile->Lock, OldIrql); - return DGTransmit(AddrFile, SendRequest); - } - else - { - ExFreePool(SendRequest); - } - } - else - { - Status = STATUS_INSUFFICIENT_RESOURCES; - } + PADDRESS_FILE AddrFile; + KIRQL OldIrql; + NTSTATUS Status; + PDATAGRAM_SEND_REQUEST SendRequest; + + TI_DbgPrint(MAX_TRACE, ("Called.\n")); + + AddrFile = Request->Handle.AddressHandle; + + KeAcquireSpinLock(&AddrFile->Lock, &OldIrql); + + if (AF_IS_VALID(AddrFile)) { + /* Initialize a send request */ + SendRequest = exAllocatePool( NonPagedPool, + sizeof( DATAGRAM_SEND_REQUEST ) ); + + if( SendRequest ) { + KeReleaseSpinLock(&AddrFile->Lock, OldIrql); + return STATUS_INSUFFICIENT_RESOURCES; + } + + SendRequest->Complete = Request->RequestNotifyObject; + SendRequest->Context = Request->RequestContext; + NdisQueryPacketLength( Packet->NdisPacket, + &SendRequest->BufferSize ); + SendRequest->Packet = *Packet; + + if (NT_SUCCESS(Status)) { + Status = AddrGetAddress(ConnInfo->RemoteAddress, + &SendRequest->RemoteAddress, + &SendRequest->RemotePort, + &AddrFile->AddrCache); + if (NT_SUCCESS(Status)) + { + KeReleaseSpinLock(&AddrFile->Lock, OldIrql); + return DGTransmit(AddrFile, SendRequest); + } + else + { + exFreePool(SendRequest); + } + } + else + { + Status = STATUS_INSUFFICIENT_RESOURCES; + } } - else + else { - Status = STATUS_ADDRESS_CLOSED; + Status = STATUS_ADDRESS_CLOSED; } - - KeReleaseSpinLock(&AddrFile->Lock, OldIrql); - - TI_DbgPrint(MAX_TRACE, ("Leaving. Status (0x%X)\n", Status)); - - return Status; + + KeReleaseSpinLock(&AddrFile->Lock, OldIrql); + + TI_DbgPrint(MAX_TRACE, ("Leaving. Status (0x%X)\n", Status)); + + return Status; } @@ -645,7 +635,7 @@ NTSTATUS DGReceiveDatagram( if (AF_IS_VALID(AddrFile)) { - ReceiveRequest = ExAllocatePool(NonPagedPool, sizeof(DATAGRAM_RECEIVE_REQUEST)); + ReceiveRequest = exAllocatePool(NonPagedPool, sizeof(DATAGRAM_RECEIVE_REQUEST)); if (ReceiveRequest) { /* Initialize a receive request */ @@ -660,7 +650,7 @@ NTSTATUS DGReceiveDatagram( if (!NT_SUCCESS(Status)) { KeReleaseSpinLock(&AddrFile->Lock, OldIrql); - ExFreePool(ReceiveRequest); + exFreePool(ReceiveRequest); return Status; } } diff --git a/reactos/drivers/net/tcpip/transport/rawip/rawip.c b/reactos/drivers/net/tcpip/transport/rawip/rawip.c index 16c5130c967..d4181cdae0a 100644 --- a/reactos/drivers/net/tcpip/transport/rawip/rawip.c +++ b/reactos/drivers/net/tcpip/transport/rawip/rawip.c @@ -7,6 +7,7 @@ * REVISIONS: * CSH 01/08-2000 Created */ +#include <roscfg.h> #include <tcpip.h> #include <rawip.h> #include <routines.h> @@ -21,8 +22,7 @@ BOOLEAN RawIPInitialized = FALSE; NTSTATUS BuildRawIPPacket( PVOID Context, PIP_ADDRESS LocalAddress, - USHORT LocalPort, - PIP_PACKET *IPPacket) + USHORT LocalPort ) /* * FUNCTION: Builds an UDP packet * ARGUMENTS: @@ -35,43 +35,26 @@ NTSTATUS BuildRawIPPacket( */ { PVOID Header; - PIP_PACKET Packet; NDIS_STATUS NdisStatus; PNDIS_BUFFER HeaderBuffer; PDATAGRAM_SEND_REQUEST SendRequest = (PDATAGRAM_SEND_REQUEST)Context; - - TI_DbgPrint(MAX_TRACE, ("TCPIP.SYS: NDIS data buffer is at (0x%X).\n", SendRequest->Buffer)); - TI_DbgPrint(MAX_TRACE, ("NDIS data buffer Next is at (0x%X).\n", SendRequest->Buffer->Next)); - TI_DbgPrint(MAX_TRACE, ("NDIS data buffer Size is (0x%X).\n", SendRequest->Buffer->Size)); - TI_DbgPrint(MAX_TRACE, ("NDIS data buffer MappedSystemVa is (0x%X).\n", SendRequest->Buffer->MappedSystemVa)); - TI_DbgPrint(MAX_TRACE, ("NDIS data buffer StartVa is (0x%X).\n", SendRequest->Buffer->StartVa)); - TI_DbgPrint(MAX_TRACE, ("NDIS data buffer ByteCount is (0x%X).\n", SendRequest->Buffer->ByteCount)); - TI_DbgPrint(MAX_TRACE, ("NDIS data buffer ByteOffset is (0x%X).\n", SendRequest->Buffer->ByteOffset)); + PIP_PACKET Packet = &SendRequest->Packet; /* Prepare packet */ /* FIXME: Assumes IPv4 */ - Packet = IPCreatePacket(IP_ADDRESS_V4); if (!Packet) return STATUS_INSUFFICIENT_RESOURCES; + IPInitializePacket(Packet,IP_ADDRESS_V4); Packet->Flags = IP_PACKET_FLAG_RAW; /* Don't touch IP header */ Packet->TotalSize = SendRequest->BufferSize; - /* Allocate NDIS packet */ - NdisAllocatePacket(&NdisStatus, &Packet->NdisPacket, GlobalPacketPool); - if (NdisStatus != NDIS_STATUS_SUCCESS) { - TI_DbgPrint(MIN_TRACE, ("Cannot allocate NDIS packet. NdisStatus = (0x%X)\n", NdisStatus)) - (*Packet->Free)(Packet); - return STATUS_INSUFFICIENT_RESOURCES; - } - if (MaxLLHeaderSize != 0) { Header = ExAllocatePool(NonPagedPool, MaxLLHeaderSize); if (!Header) { TI_DbgPrint(MIN_TRACE, ("Cannot allocate memory for packet headers.\n")); - NdisFreePacket(Packet->NdisPacket); - (*Packet->Free)(Packet); + FreeNdisPacket(Packet->NdisPacket); return STATUS_INSUFFICIENT_RESOURCES; } @@ -87,21 +70,15 @@ NTSTATUS BuildRawIPPacket( if (NdisStatus != NDIS_STATUS_SUCCESS) { TI_DbgPrint(MIN_TRACE, ("Cannot allocate NDIS buffer for packet headers. NdisStatus = (0x%X)\n", NdisStatus)); ExFreePool(Header); - NdisFreePacket(Packet->NdisPacket); - (*Packet->Free)(Packet); + FreeNdisPacket(Packet->NdisPacket); return STATUS_INSUFFICIENT_RESOURCES; } /* Chain header at front of packet */ NdisChainBufferAtFront(Packet->NdisPacket, HeaderBuffer); } - /* Chain data after link level header if it exists */ - NdisChainBufferAtBack(Packet->NdisPacket, SendRequest->Buffer); - DISPLAY_IP_PACKET(Packet); - *IPPacket = Packet; - return STATUS_SUCCESS; } @@ -122,8 +99,30 @@ NTSTATUS RawIPSendDatagram( * Status of operation */ { - return DGSendDatagram(Request, ConnInfo, - Buffer, DataSize, BuildRawIPPacket); + NDIS_STATUS Status; + PCHAR BufferData; + UINT BufferLen; + PADDRESS_FILE AddrFile = + (PADDRESS_FILE)Request->Handle.AddressHandle; + PDATAGRAM_SEND_REQUEST SendRequest; + + SendRequest = ExAllocatePool( NonPagedPool, sizeof(*SendRequest) ); + + NdisQueryBuffer( Buffer, &BufferData, &BufferLen ); + Status = AllocatePacketWithBuffer( &SendRequest->Packet.NdisPacket, + BufferData, + BufferLen ); + + if( Status != NDIS_STATUS_SUCCESS ) { + BuildRawIPPacket( SendRequest, + (PIP_ADDRESS)&AddrFile->ADE->Address->Address. + IPv4Address, + AddrFile->Port ); + Status = DGSendDatagram(Request, ConnInfo, &SendRequest->Packet); + NdisFreeBuffer( Buffer ); + } + + return Status; } diff --git a/reactos/drivers/net/tcpip/transport/tcp/event.c b/reactos/drivers/net/tcpip/transport/tcp/event.c new file mode 100644 index 00000000000..865f01589b4 --- /dev/null +++ b/reactos/drivers/net/tcpip/transport/tcp/event.c @@ -0,0 +1,323 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS TCP/IP protocol driver + * FILE: transport/tcp/event.c + * PURPOSE: Transmission Control Protocol -- Events from oskittcp + * PROGRAMMERS: Art Yerkes + * REVISIONS: + * CSH 01/08-2000 Created + */ +#include <roscfg.h> +#include <limits.h> +#include <tcpip.h> +#include <tcp.h> +#include <pool.h> +#include <route.h> +#include <router.h> +#include <address.h> +#include <neighbor.h> +#include <datagram.h> +#include <checksum.h> +#include <routines.h> +#include <oskittcp.h> + +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; + + TI_DbgPrint(MID_TRACE,("XX> Called\n")); + + do { + error = OskitTCPRecv( Connection->SocketContext, + &Addr, + DataBuffer, + 1024, + &BytesRead, + Flags | OSK_MSG_DONTWAIT | OSK_MSG_PEEK ); + + 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; + + 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 ) { + TCPRecvNotify( Connection, 0 ); +} + +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( 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 ); +} + +void TCPPacketSendComplete( PVOID Context, + NDIS_STATUS NdisStatus, + DWORD BytesSent ) { + TI_DbgPrint(MID_TRACE,("called\n")); + PDATAGRAM_SEND_REQUEST Send = (PDATAGRAM_SEND_REQUEST)Context; + if( Send->Packet.NdisPacket ) + FreeNdisPacket( Send->Packet.NdisPacket ); + exFreePool( Send ); +} + +NTSTATUS AddHeaderIPv4( + PDATAGRAM_SEND_REQUEST SendRequest, + PIP_ADDRESS LocalAddress, + USHORT LocalPort, + PIP_ADDRESS RemoteAddress, + USHORT RemotePort) { +/* + * FUNCTION: Adds an IPv4 and TCP header to an IP packet + * ARGUMENTS: + * SendRequest = Pointer to send request + * Connection = Pointer to connection endpoint + * LocalAddress = Pointer to our local address + * LocalPort = The port we send this segment from + * IPPacket = Pointer to IP packet + * RETURNS: + * Status of operation + */ + PIPv4_HEADER IPHeader; + PIP_PACKET IPPacket; + PVOID Header; + NDIS_STATUS NdisStatus; + PNDIS_BUFFER HeaderBuffer; + PCHAR BufferContent; + ULONG BufferSize; + ULONG PayloadBufferSize; + + IPPacket = &SendRequest->Packet; + + BufferSize = MaxLLHeaderSize + sizeof(IPv4_HEADER); + Header = exAllocatePool(NonPagedPool, BufferSize); + if (!Header) + return STATUS_INSUFFICIENT_RESOURCES; + + TI_DbgPrint(MAX_TRACE, ("Allocated %d bytes for headers at 0x%X.\n", BufferSize, Header)); + + NdisQueryPacketLength( IPPacket->NdisPacket, &PayloadBufferSize ); + + /* Allocate NDIS buffer for maximum Link level, IP and TCP header */ + NdisAllocateBuffer(&NdisStatus, + &HeaderBuffer, + GlobalBufferPool, + Header, + BufferSize); + if (NdisStatus != NDIS_STATUS_SUCCESS) { + exFreePool(Header); + TI_DbgPrint(MAX_TRACE, ("Error from NDIS: %08x\n", NdisStatus)); + return STATUS_INSUFFICIENT_RESOURCES; + } + + /* Chain header at front of NDIS packet */ + NdisChainBufferAtFront(IPPacket->NdisPacket, HeaderBuffer); + IPPacket->HeaderSize = 20; + IPPacket->ContigSize = BufferSize; + IPPacket->TotalSize = IPPacket->HeaderSize + PayloadBufferSize; + IPPacket->Header = (PVOID)((ULONG_PTR)Header + MaxLLHeaderSize); + IPPacket->Flags = 0; + + /* Build IPv4 header */ + IPHeader = (PIPv4_HEADER)IPPacket->Header; + /* Version = 4, Length = 5 DWORDs */ + IPHeader->VerIHL = 0x45; + /* Normal Type-of-Service */ + IPHeader->Tos = 0; + /* Length of header and data */ + IPHeader->TotalLength = WH2N((USHORT)IPPacket->TotalSize); + /* Identification */ + IPHeader->Id = WH2N((USHORT)InterlockedIncrement(&TCP_IPIdentification)); + /* One fragment at offset 0 */ + IPHeader->FlagsFragOfs = WH2N((USHORT)IPv4_DF_MASK); + /* Time-to-Live is 128 */ + IPHeader->Ttl = 128; + /* Transmission Control Protocol */ + IPHeader->Protocol = IPPROTO_TCP; + /* Checksum is 0 (for later calculation of this) */ + IPHeader->Checksum = 0; + /* Source address */ + IPHeader->SrcAddr = LocalAddress->Address.IPv4Address; + /* Destination address. FIXME: IPv4 only */ + IPHeader->DstAddr = RemoteAddress->Address.IPv4Address; + + return STATUS_SUCCESS; +} + +int TCPPacketSend(void *ClientData, + void *WhichSocket, + void *WhichConnection, + OSK_PCHAR data, + OSK_UINT len ) { + PADDRESS_FILE AddrFile; + PNDIS_BUFFER NdisPacket; + NDIS_STATUS NdisStatus; + KIRQL OldIrql; + PDATAGRAM_SEND_REQUEST SendRequest; + PNEIGHBOR_CACHE_ENTRY NCE = 0; + PCONNECTION_ENDPOINT Connection = (PCONNECTION_ENDPOINT)WhichConnection; + IP_ADDRESS RemoteAddress, LocalAddress; + USHORT RemotePort, LocalPort; + PULONG AckNumber = (PULONG)data; + + TI_DbgPrint(MID_TRACE,("TCP OUTPUT:\n")); + OskitDumpBuffer( data, len ); + + SendRequest = + (PDATAGRAM_SEND_REQUEST) + exAllocatePool( NonPagedPool, sizeof( DATAGRAM_SEND_REQUEST ) ); + /* if( !SendRequest || !Connection ) return OSK_EINVAL; */ + + RemoteAddress.Type = LocalAddress.Type = IP_ADDRESS_V4; + + OskitTCPGetAddress( WhichSocket, + &LocalAddress.Address.IPv4Address, + &LocalPort, + &RemoteAddress.Address.IPv4Address, + &RemotePort ); + + NCE = RouterGetRoute( &RemoteAddress, NULL ); + + if( !NCE ) return OSK_EADDRNOTAVAIL; + + GetInterfaceIPv4Address(NCE->Interface, + ADE_UNICAST, + &LocalAddress.Address.IPv4Address ); + + if( Connection ) + KeAcquireSpinLock( &Connection->Lock, &OldIrql ); + + NdisStatus = + AllocatePacketWithBuffer( &SendRequest->PacketToSend, data, len ); + if (NdisStatus != NDIS_STATUS_SUCCESS) { + TI_DbgPrint(MAX_TRACE, ("Error from NDIS: %08x\n", NdisStatus)); + goto end; + } + + SendRequest->Packet.NdisPacket = SendRequest->PacketToSend; + + SendRequest->Complete = TCPPacketSendComplete; + SendRequest->Context = Connection; + SendRequest->RemoteAddress = RemoteAddress; + SendRequest->RemotePort = RemotePort; + NdisQueryPacketLength( SendRequest->Packet.NdisPacket, + &SendRequest->BufferSize ); + + AddHeaderIPv4( SendRequest, + &LocalAddress, + LocalPort, + &RemoteAddress, + RemotePort ); + + if( Connection ) + DGTransmit( Connection->AddressFile, SendRequest ); + else + DbgPrint("Transmit called without connection.\n"); + +end: + if( Connection ) + KeReleaseSpinLock( &Connection->Lock, OldIrql ); + + if( !NT_SUCCESS(NdisStatus) ) return OSK_EINVAL; + else return 0; +} + diff --git a/reactos/drivers/net/tcpip/transport/tcp/if.c b/reactos/drivers/net/tcpip/transport/tcp/if.c new file mode 100644 index 00000000000..6c344c82308 --- /dev/null +++ b/reactos/drivers/net/tcpip/transport/tcp/if.c @@ -0,0 +1,183 @@ +/* + * Copyright (c) 1997-1998 University of Utah and the Flux Group. + * All rights reserved. + * + * This file is part of the Flux OSKit. The OSKit is free software, also known + * as "open source;" you can redistribute it and/or modify it under the terms + * of the GNU General Public License (GPL), version 2, as published by the Free + * Software Foundation (FSF). To explore alternate licensing terms, contact + * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. + * + * The OSKit 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 GPL for more details. You should have + * received a copy of the GPL along with the OSKit; see the file COPYING. If + * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. + */ + +#include <roscfg.h> +#include <limits.h> +#include <tcpip.h> +#include <tcp.h> +#include <pool.h> +#include <route.h> +#include <address.h> +#include <datagram.h> +#include <checksum.h> +#include <routines.h> +#include <neighbor.h> +#include <oskittcp.h> + +#if 0 +#include <sys/param.h> +#include <sys/kernel.h> +#include <oskit/c/assert.h> +#include <net/if.h> +#endif + +#include <oskittcp.h> + +int if_index = 0; +struct ifaddr **ifnet_addrs; + +int ifqmaxlen = OSK_IFQ_MAXLEN; +struct ifnet *ifnet; + +/* + * Network interface utility routines. + * + * Routines with ifa_ifwith* names take sockaddr *'s as + * parameters. + */ +void +ifinit() +{ +} + +void +if_attach(ifp) + struct ifnet *ifp; +{ + KeBugCheck( 0xface ); +} + +struct ifnet * +ifunit(char *name) +{ + return 0; +} + +int ifa_iffind(addr, ifaddr, type) + struct sockaddr *addr; + struct ifaddr *ifaddr; + int type; +{ + PNEIGHBOR_CACHE_ENTRY NCE; + IP_ADDRESS Destination; + NTSTATUS Status; + struct sockaddr_in *addr_in = (struct sockaddr_in *)addr; + + TI_DbgPrint(MID_TRACE,("called for type %d\n", type)); + + if( !addr || !ifaddr ) { + TI_DbgPrint(MID_TRACE,("no addr or no ifaddr (%x %x)\n", + addr, ifaddr)); + return OSK_EINVAL; + } + + Destination.Type = IP_ADDRESS_V4; + Destination.Address.IPv4Address = addr_in->sin_addr.s_addr; + + NCE = RouterGetRoute(&Destination, NULL); + + if( !NCE || !NCE->Interface ) { + TI_DbgPrint(MID_TRACE,("no neighbor cache or no interface (%x %x)\n", + NCE, NCE->Interface)); + return OSK_EADDRNOTAVAIL; + } + + /* XXX - Point-to-point interfaces not supported yet */ + memset(&ifaddr->ifa_dstaddr, 0, sizeof( struct sockaddr ) ); + + addr_in->sin_family = PF_INET; + addr_in = (struct sockaddr_in *)&ifaddr->ifa_addr; + Status = GetInterfaceIPv4Address( NCE->Interface, + type, + &addr_in->sin_addr.s_addr ); + + if( !NT_SUCCESS(Status) ) + addr_in->sin_addr.s_addr = 0; + + ifaddr->ifa_flags = 0; /* XXX what goes here? */ + ifaddr->ifa_refcnt = 0; /* Anachronistic */ + ifaddr->ifa_metric = 1; /* We can get it like in ninfo.c, if we want */ + ifaddr->ifa_mtu = NCE->Interface->MTU; + + TI_DbgPrint(MID_TRACE,("status in iffind: %x\n", Status)); + + return NT_SUCCESS(Status) ? 0 : OSK_EADDRNOTAVAIL; +} + +/* + * Find an interface on a specific network. If many, choice + * is most specific found. + */ +int ifa_ifwithnet(addr, ifaddr) + struct sockaddr *addr; + struct ifaddr *ifaddr; +{ + return ifa_iffind(addr, ifaddr, ADE_UNICAST); +} + +/* + * Locate the point to point interface with a given destination address. + */ +/*ARGSUSED*/ +struct ifaddr * +ifa_ifwithdstaddr(addr, ifaddr) + register struct sockaddr *addr; + register struct ifaddr *ifaddr; +{ + return ifa_iffind(addr, ifaddr, ADE_POINTOPOINT); +} + +/* + * Locate an interface based on a complete address. + */ +/*ARGSUSED*/ +int ifa_ifwithaddr(addr, ifaddr) + struct sockaddr *addr; + struct ifaddr *ifaddr; +{ + int error = ifa_ifwithnet( addr, ifaddr ); + struct sockaddr_in *addr_in = (struct sockaddr_in *)addr; + struct sockaddr_in *faddr_in = (struct sockaddr_in *)ifaddr->ifa_addr; + if( error != 0 ) return error; + else return + (faddr_in->sin_addr.s_addr == addr_in->sin_addr.s_addr) ? + 0 : OSK_EADDRNOTAVAIL; +} + +/* + * Handle interface watchdog timer routines. Called + * from softclock, we decrement timers (if set) and + * call the appropriate interface routine on expiration. + */ +void +if_slowtimo(arg) + void *arg; +{ +#if 0 + register struct ifnet *ifp; + int s = splimp(); + + for (ifp = ifnet; ifp; ifp = ifp->if_next) { + if (ifp->if_timer == 0 || --ifp->if_timer) + continue; + if (ifp->if_watchdog) + (*ifp->if_watchdog)(ifp->if_unit); + } + splx(s); + timeout(if_slowtimo, (void *)0, hz / IFNET_SLOWHZ); +#endif +} diff --git a/reactos/drivers/net/tcpip/transport/tcp/tcp.c b/reactos/drivers/net/tcpip/transport/tcp/tcp.c index 66596c0b6cb..da778a0641a 100644 --- a/reactos/drivers/net/tcpip/transport/tcp/tcp.c +++ b/reactos/drivers/net/tcpip/transport/tcp/tcp.c @@ -7,6 +7,8 @@ * REVISIONS: * CSH 01/08-2000 Created */ +#include <roscfg.h> +#include <limits.h> #include <tcpip.h> #include <tcp.h> #include <pool.h> @@ -14,1651 +16,13 @@ #include <datagram.h> #include <checksum.h> #include <routines.h> +#include <oskittcp.h> - +LONG TCP_IPIdentification = 0; static BOOLEAN TCPInitialized = FALSE; -static LONG IPIdentification = 0; static NPAGED_LOOKASIDE_LIST TCPSegmentList; - -PTCP_SEGMENT TCPCreateSegment( - PIP_PACKET IPPacket, - ULONG SequenceNumber, - ULONG SegmentLength) -/* - * FUNCTION: Creates a TCP segment object - * ARGUMENTS: - * IPPacket = Pointer to IP packet containing segment data - * SequenceNumber = Sequence number of first byte in the segment - * SegmentLength = Number of bytes in the segment - * RETURNS: - * Pointer to the created TCP segment. NULL if there was not enough free resources. - */ -{ - PTCP_SEGMENT Segment; - - ASSERT(IPPacket); - - Segment = ExAllocateFromNPagedLookasideList(&TCPSegmentList); - if (Segment == NULL) - return NULL; - - Segment->IPPacket = IPPacket; - Segment->SequenceNumber = SequenceNumber; - Segment->Length = SegmentLength; - - TI_DbgPrint(DEBUG_TCP, ("Created TCP segment (SequenceNumber %d, Length %d)\n", - Segment->SequenceNumber, Segment->Length)); - - return Segment; -} - - -VOID TCPFreeSegment( - PTCP_SEGMENT Segment) -/* - * FUNCTION: Frees a TCP segment object - * ARGUMENTS: - * Segment = Pointer to an TCP segment structure - */ -{ - ASSERT(Segment); - - ExFreeToNPagedLookasideList(&TCPSegmentList, Segment); -} - - -VOID TCPAddSegment( - PCONNECTION_ENDPOINT Connection, - PTCP_SEGMENT Segment) -/* - * FUNCTION: Adds a TCP segment object to the receive queue of a connection - * ARGUMENTS: - * Connection = Pointer to connection endpoint - * Segment = Pointer to TCP segment object - * RETURNS: - * Nothing. - */ -{ - PLIST_ENTRY CurrentEntry; - PLIST_ENTRY NextEntry; - PTCP_SEGMENT Current; - - ASSERT(Connection); - ASSERT(Segment); - - /* FIXME: Handle sequence number wraparound */ - - /* If all segments arrive in-order then all segments will be put last in the - receive queue when they arrive */ - - if (IsListEmpty(&Connection->ReceivedSegments)) - { - /* This is the first segment received since the connection was created - or since all data is delivered to the client */ - InsertTailList(&Connection->ReceivedSegments, &Segment->ListEntry); - return; - } - - CurrentEntry = Connection->ReceivedSegments.Blink; - Current = CONTAINING_RECORD(CurrentEntry, TCP_SEGMENT, ListEntry); - if (Segment->SequenceNumber >= Current->SequenceNumber) - { - /* This segment has the highest sequence number yet received since the - connection was created */ - InsertTailList(&Connection->ReceivedSegments, &Segment->ListEntry); - return; - } - - - TI_DbgPrint(MIN_TRACE, ("FIXME: Cannot handle segments that arrive out-of-order.\n")); - -#if 0 - do - { - if (SequenceNumber + Length...) - { - } - - CurrentEntry = CurrentEntry->Blink; - Current = CONTAINING_RECORD(CurrentEntry, TCP_SEGMENT, ListEntry); - } - while (CurrentEntry != &Connection->ReceivedSegments); -#endif -} - - -NTSTATUS TCPiAddHeaderIPv4( - PDATAGRAM_SEND_REQUEST SendRequest, - PCONNECTION_ENDPOINT Connection, - PIP_ADDRESS LocalAddress, - USHORT LocalPort, - PIP_PACKET IPPacket, - PTCPv4_HEADER *pTcpHeader, - PULONG pTcpHeaderLength) -/* - * FUNCTION: Adds an IPv4 and TCP header to an IP packet - * ARGUMENTS: - * SendRequest = Pointer to send request - * Connection = Pointer to connection endpoint - * LocalAddress = Pointer to our local address - * LocalPort = The port we send this segment from - * IPPacket = Pointer to IP packet - * TcpHeader = Address of pointer to TCPv4 header (out) - * pTcpHeaderLength = Address of buffer for length of TCP header - * RETURNS: - * Status of operation - */ -{ - PIPv4_HEADER IPHeader; - PTCPv4_HEADER TCPHeader; - PVOID Header; - ULONG BufferSize; - NDIS_STATUS NdisStatus; - PNDIS_BUFFER HeaderBuffer; - PTCP_SEND_REQUEST TcpSendRequest = (PTCP_SEND_REQUEST)SendRequest->Context; - - ASSERT(SendRequest); - ASSERT(Connection); - ASSERT(LocalAddress); - ASSERT(IPPacket); - ASSERT(pTcpHeader); - - BufferSize = MaxLLHeaderSize + sizeof(IPv4_HEADER) + sizeof(TCPv4_HEADER); - Header = ExAllocatePool(NonPagedPool, BufferSize); - if (!Header) - return STATUS_INSUFFICIENT_RESOURCES; - - TI_DbgPrint(MAX_TRACE, ("Allocated %d bytes for headers at 0x%X.\n", BufferSize, Header)); - - /* Allocate NDIS buffer for maximum Link level, IP and TCP header */ - NdisAllocateBuffer(&NdisStatus, - &HeaderBuffer, - GlobalBufferPool, - Header, - BufferSize); - if (NdisStatus != NDIS_STATUS_SUCCESS) { - ExFreePool(Header); - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* Chain header at front of NDIS packet */ - NdisChainBufferAtFront(IPPacket->NdisPacket, HeaderBuffer); - - IPPacket->ContigSize = BufferSize; - IPPacket->Header = (PVOID)((ULONG_PTR)Header + MaxLLHeaderSize); - IPPacket->HeaderSize = 20; - - /* Build IPv4 header */ - IPHeader = (PIPv4_HEADER)IPPacket->Header; - /* Version = 4, Length = 5 DWORDs */ - IPHeader->VerIHL = 0x45; - /* Normal Type-of-Service */ - IPHeader->Tos = 0; - /* Length of header and data */ - IPHeader->TotalLength = WH2N((USHORT)IPPacket->TotalSize); - /* Identification */ - IPHeader->Id = WH2N((USHORT)InterlockedIncrement(&IPIdentification)); - /* One fragment at offset 0 */ - IPHeader->FlagsFragOfs = 0; - /* Time-to-Live is 128 */ - IPHeader->Ttl = 128; - /* Transmission Control Protocol */ - IPHeader->Protocol = IPPROTO_TCP; - /* Checksum is 0 (for later calculation of this) */ - IPHeader->Checksum = 0; - /* Source address */ - IPHeader->SrcAddr = LocalAddress->Address.IPv4Address; - /* Destination address. FIXME: IPv4 only */ - IPHeader->DstAddr = SendRequest->RemoteAddress->Address.IPv4Address; - - /* Build TCP header */ - TCPHeader = (PTCPv4_HEADER)((ULONG_PTR)IPHeader + sizeof(IPv4_HEADER)); - /* Port values are already big-endian values */ - TCPHeader->SourcePort = LocalPort; - TCPHeader->DestinationPort = SendRequest->RemotePort; - /* TcpSendRequest->SequenceNumber is already a big-endian value */ - TCPHeader->SequenceNumber = TcpSendRequest->SequenceNumber; - /* TcpSendRequest->AckNumber is already a big-endian value */ - TCPHeader->AckNumber = ((SendRequest->Flags & SRF_ACK) > 0) ? TcpSendRequest->AckNumber : 0; - TCPHeader->DataOffset = (sizeof(TCPv4_HEADER) / 4) << 4; - TCPHeader->Flags = SendRequest->Flags; - TCPHeader->Window = 0; - /* FIXME: Calculate TCP checksum and put it in TCP header */ - TCPHeader->Checksum = 0; - TCPHeader->Urgent = 0; - - *pTcpHeader = TCPHeader; - *pTcpHeaderLength = sizeof(TCPv4_HEADER); - - return STATUS_SUCCESS; -} - - -NTSTATUS TCPiBuildPacket( - PVOID Context, - PIP_ADDRESS LocalAddress, - USHORT LocalPort, - PIP_PACKET *IPPacket) -/* - * FUNCTION: Builds a TCP packet - * ARGUMENTS: - * Context = Pointer to context information (DATAGRAM_SEND_REQUEST) - * LocalAddress = Pointer to our local address - * LocalPort = The port we send this segment from - * IPPacket = Address of pointer to IP packet - * RETURNS: - * Status of operation - * NOTES: - * The Context field in the send request structure (pointed to - * by the Context field) contains a pointer to the CONNECTION_ENDPOINT - * structure for the connection - */ -{ - NTSTATUS Status; - PIP_PACKET Packet; - NDIS_STATUS NdisStatus; - PDATAGRAM_SEND_REQUEST SendRequest; - PCONNECTION_ENDPOINT Connection; - ULONG Checksum; - TCPv4_PSEUDO_HEADER TcpPseudoHeader; - PTCPv4_HEADER TcpHeader; - ULONG TcpHeaderLength; - - ASSERT(LocalAddress); - ASSERT(IPPacket); - - TI_DbgPrint(MAX_TRACE, ("Called.\n")); - - SendRequest = (PDATAGRAM_SEND_REQUEST)Context; - ASSERT(SendRequest); - Connection = (PCONNECTION_ENDPOINT)SendRequest->Context; - ASSERT(Connection); - - /* Prepare packet */ - - /* FIXME: Assumes IPv4 */ - Packet = IPCreatePacket(IP_ADDRESS_V4); - if (Packet == NULL) - return STATUS_INSUFFICIENT_RESOURCES; - - Packet->TotalSize = sizeof(IPv4_HEADER) + - sizeof(TCPv4_HEADER) + - SendRequest->BufferSize; - - /* Allocate NDIS packet */ - NdisAllocatePacket(&NdisStatus, &Packet->NdisPacket, GlobalPacketPool); - if (NdisStatus != NDIS_STATUS_SUCCESS) { - (*Packet->Free)(Packet); - return STATUS_INSUFFICIENT_RESOURCES; - } - - switch (SendRequest->RemoteAddress->Type) { - case IP_ADDRESS_V4: - Status = TCPiAddHeaderIPv4(SendRequest, Connection, LocalAddress, - LocalPort, Packet, &TcpHeader, &TcpHeaderLength); - break; - case IP_ADDRESS_V6: - /* FIXME: Support IPv6 */ - TI_DbgPrint(MIN_TRACE, ("IPv6 TCP segments are not supported.\n")); - default: - Status = STATUS_UNSUCCESSFUL; - break; - } - if (!NT_SUCCESS(Status)) { - TI_DbgPrint(MIN_TRACE, ("Cannot add TCP header. Status (0x%X)\n", Status)); - NdisFreePacket(Packet->NdisPacket); - (*Packet->Free)(Packet); - return Status; - } - - /* Build pseudo TCP header which is used to prevent misrouted segments */ - TcpPseudoHeader.SourceAddress = LocalAddress->Address.IPv4Address; - TcpPseudoHeader.DestinationAddress = SendRequest->RemoteAddress->Address.IPv4Address; - TcpPseudoHeader.Zero = 0; - TcpPseudoHeader.Protocol = IPPROTO_TCP; - /* Length of TCP header and segment data */ - TcpPseudoHeader.TCPLength = WH2N(TcpHeaderLength + SendRequest->BufferSize); - Checksum = TCPv4Checksum((PUCHAR)&TcpPseudoHeader, sizeof(TCPv4_PSEUDO_HEADER), 0); - - /* Add checksum for TCP header */ - Checksum = TCPv4Checksum((PUCHAR)TcpHeader, TcpHeaderLength, ~Checksum); - - /* Chain data after header if it exists */ - if (SendRequest->Buffer != NULL) - { - PVOID Data; - UINT Size; - /* - * NOTE: - * Don't name the variable NdisBuffer, because that's internal name - * used by the NdisChainBufferAtBack macro and it's the easiest way - * how to achieve an elegant crash. - */ - PNDIS_BUFFER _NdisBuffer = SendRequest->Buffer; - NdisChainBufferAtBack(Packet->NdisPacket, _NdisBuffer); - /* Add checksum for segment data */ - /* FIXME: Verify that there is no problem for chained buffers with an odd length */ - while (_NdisBuffer != NULL) - { - NdisQueryBuffer(_NdisBuffer, &Data, &Size); - DbgPrint("Checksum7:(%d bytes)\n", Size); - Checksum = TCPv4Checksum(Data, Size, ~Checksum); - NdisGetNextBuffer(_NdisBuffer, &_NdisBuffer); - } - } - - TcpHeader->Checksum = Checksum; - DbgPrint("Checksum8: (0x%x)\n", Checksum); - - DISPLAY_TCP_PACKET(Packet); - - *IPPacket = Packet; - - return STATUS_SUCCESS; -} - - -VOID TCPiSendRequestComplete( - PVOID Context, - NDIS_STATUS Status, - ULONG Count) -/* - * FUNCTION: Completion routine for datagram send requests - * ARGUMENTS: - * Context = Pointer to context information (TCP_SEND_REQUEST) - * Status = Status of the request - * Count = Number of bytes sent or received - */ -{ - DATAGRAM_COMPLETION_ROUTINE Complete; - PVOID CompleteContext; - PTCP_SEND_REQUEST SendRequest = (PTCP_SEND_REQUEST)Context; - - TI_DbgPrint(MAX_TRACE, ("Called.\n")); - - Complete = SendRequest->Complete; - CompleteContext = SendRequest->Context; - ExFreePool(SendRequest); - - if (Complete != NULL) - { - TI_DbgPrint(MAX_TRACE, ("Calling completion routine.\n")); - - /* Call upper level completion routine */ - (*Complete)(CompleteContext, Status, Count); - } - - TI_DbgPrint(MAX_TRACE, ("Leaving.\n")); -} - - -VOID TCPTimeout(VOID) -/* - * FUNCTION: Transmission Control Protocol timeout handler - * NOTES: - * This routine is called by IPTimeout to perform several - * maintainance tasks - */ -{ -} - - -inline NTSTATUS TCPBuildSendRequest( - PTCP_SEND_REQUEST *SendRequest, - PDATAGRAM_SEND_REQUEST *DGSendRequest, - PCONNECTION_ENDPOINT Connection, - DATAGRAM_COMPLETION_ROUTINE Complete, - PVOID Context, - PNDIS_BUFFER Buffer, - DWORD BufferSize, - ULONG Flags) -/* - * FUNCTION: Allocates and intializes a TCP send request - * ARGUMENTS: - * SendRequest = TCP send request - * DGSendRequest = Datagram send request (optional) - * Connection = Connection endpoint - * Complete = Completion routine - * Context = Pointer to context information - * Buffer = Pointer to NDIS buffer to send (optional) - * BufferSize = Size of Buffer - * Flags = Protocol specific flags - * RETURNS: - * Status of operation - */ -{ - PDATAGRAM_SEND_REQUEST DGSendReq; - NTSTATUS Status; - - ASSERT(SendRequest); - ASSERT(Connection); - - Status = BuildTCPSendRequest( - SendRequest, - Complete, - Context, - NULL); - if (!NT_SUCCESS(Status)) - return Status; - - Status = BuildDatagramSendRequest( - &DGSendReq, /* Datagram send request */ - Connection->RemoteAddress, /* Address of remote peer */ - Connection->RemotePort, /* Port of remote peer */ - Buffer, /* Buffer */ - BufferSize, /* Size of buffer */ - (DATAGRAM_COMPLETION_ROUTINE) - TCPiSendRequestComplete, /* Completion function */ - *SendRequest, /* Context for completion function */ - TCPiBuildPacket, /* Packet build function */ - Flags); /* Protocol specific flags */ - if (!NT_SUCCESS(Status)) { - ExFreePool(*SendRequest); - return Status; - } - - if (DGSendRequest) - *DGSendRequest = DGSendReq; - - return STATUS_SUCCESS; -} - - -inline NTSTATUS TCPBuildAndTransmitSendRequest( - PCONNECTION_ENDPOINT Connection, - DATAGRAM_COMPLETION_ROUTINE Complete, - PVOID Context, - PNDIS_BUFFER Buffer, - DWORD BufferSize, - ULONG Flags) -/* - * FUNCTION: Allocates and intializes a TCP send request - * ARGUMENTS: - * Connection = Connection endpoint - * Complete = Completion routine (optional) - * Context = Pointer to context information - * Buffer = Pointer to NDIS buffer to send (optional) - * BufferSize = Size of Buffer - * Flags = Protocol specific flags - * RETURNS: - * Status of operation - */ -{ - PDATAGRAM_SEND_REQUEST DGSendRequest; - PTCP_SEND_REQUEST TCPSendRequest; - NTSTATUS Status; - - ASSERT(Connection); - - TI_DbgPrint(MAX_TRACE, ("Called.\n")); - - Status = TCPBuildSendRequest( - &TCPSendRequest, - &DGSendRequest, - Connection, /* Connection endpoint */ - Complete, /* Completion routine */ - Context, /* Completion routine context */ - Buffer, /* Buffer */ - BufferSize, /* Size of buffer */ - Flags); /* Protocol specific flags */ - if (!NT_SUCCESS(Status)) - return Status; - - Status = DGTransmit( - Connection->AddressFile, - DGSendRequest); - if (!NT_SUCCESS(Status)) { - ExFreePool(DGSendRequest); - ExFreePool(TCPSendRequest); - return Status; - } - - return STATUS_SUCCESS; -} - - -inline NTSTATUS TCPBuildAndTransmitSendRequest2( - PCONNECTION_ENDPOINT Connection, - DATAGRAM_COMPLETION_ROUTINE Complete, - PVOID Context, - PNDIS_BUFFER Buffer, - DWORD BufferSize, - ULONG Flags, - ULONG SequenceNumber, - ULONG AckNumber) -/* - * FUNCTION: Allocates and intializes a TCP send request - * ARGUMENTS: - * Connection = Connection endpoint - * Complete = Completion routine (optional) - * Context = Pointer to context information - * Buffer = Pointer to NDIS buffer to send - * BufferSize = Size of Buffer - * Flags = Protocol specific flags - * SequenceNumber = Sequence number (host byte order) - * AckNumber = Acknowledgement number (host byte order) - * RETURNS: - * Status of operation - */ -{ - PDATAGRAM_SEND_REQUEST DGSendRequest; - PTCP_SEND_REQUEST TCPSendRequest; - NTSTATUS Status; - - ASSERT(Connection); - - TI_DbgPrint(MAX_TRACE, ("Called.\n")); - - Status = TCPBuildSendRequest( - &TCPSendRequest, - &DGSendRequest, - Connection, /* Connection endpoint */ - Complete, /* Completion routine */ - Context, /* Completion routine context */ - Buffer, /* Buffer */ - BufferSize, /* Size of buffer */ - Flags); /* Protocol specific flags */ - if (!NT_SUCCESS(Status)) - return Status; - - /* Set extra information and convert to network byte order if necessary */ - TCPSendRequest->SequenceNumber = DH2N(SequenceNumber); - TCPSendRequest->AckNumber = DH2N(AckNumber); - - Status = DGTransmit( - Connection->AddressFile, - DGSendRequest); - if (!NT_SUCCESS(Status)) { - ExFreePool(DGSendRequest); - ExFreePool(TCPSendRequest); - return Status; - } - - return STATUS_SUCCESS; -} - - -NTSTATUS TCPConnect( - PTDI_REQUEST Request, - PTDI_CONNECTION_INFORMATION ConnInfo, - PTDI_CONNECTION_INFORMATION ReturnInfo) -/* - * FUNCTION: Attempts to connect to a remote peer - * ARGUMENTS: - * Request = Pointer to TDI request - * ConnInfo = Pointer to connection information - * ReturnInfo = Pointer to structure for return information (optional) - * RETURNS: - * Status of operation - * NOTES: - * This is the high level interface for connecting to remote peers - */ -{ - PDATAGRAM_SEND_REQUEST DGSendRequest; - PTCP_SEND_REQUEST TCPSendRequest; - PCONNECTION_ENDPOINT Connection; - LARGE_INTEGER DueTime; - NTSTATUS Status; - KIRQL OldIrql; - PNDIS_BUFFER NdisBuffer; - NDIS_STATUS NdisStatus; - PVOID DataBuffer; - ULONG Size; - - ASSERT(Request); - ASSERT(ConnInfo); - - TI_DbgPrint(MID_TRACE, ("Called.\n")); - - Connection = Request->Handle.ConnectionContext; - - KeAcquireSpinLock(&Connection->Lock, &OldIrql); - - if (Connection->State != ctClosed) { - /* The connection has already been opened so return success */ - KeReleaseSpinLock(&Connection->Lock, OldIrql); - return STATUS_SUCCESS; - } - - Connection->LocalAddress = Connection->AddressFile->ADE->Address; - Connection->LocalPort = Connection->AddressFile->Port; - - Status = AddrBuildAddress( - (PTA_ADDRESS)(&((PTRANSPORT_ADDRESS)ConnInfo->RemoteAddress)->Address[0]), - &Connection->RemoteAddress, - &Connection->RemotePort); - if (!NT_SUCCESS(Status)) { - KeReleaseSpinLock(&Connection->Lock, OldIrql); - return Status; - } - - /* Allocate NDIS buffer */ - - Size = sizeof(IPv4_HEADER); - DataBuffer = ExAllocatePool(NonPagedPool, Size); - if (!DataBuffer) { - return STATUS_INSUFFICIENT_RESOURCES; - } - - NdisAllocateBuffer(&NdisStatus, &NdisBuffer, GlobalBufferPool, - DataBuffer, Size); - if (NdisStatus != NDIS_STATUS_SUCCESS) { - KeReleaseSpinLock(&Connection->Lock, OldIrql); - ExFreePool(Connection->RemoteAddress); - return NdisStatus; - } - - /* Issue SYN segment */ - - Status = TCPBuildAndTransmitSendRequest( - Connection, /* Connection endpoint */ - Request->RequestNotifyObject, /* Completion routine */ - Request->RequestContext, /* Completion routine context */ - NdisBuffer, /* Buffer */ - 0, /* Size of buffer */ - SRF_SYN); /* Protocol specific flags */ - if (!NT_SUCCESS(Status)) { - KeReleaseSpinLock(&Connection->Lock, OldIrql); - ExFreePool(Connection->RemoteAddress); - return Status; - } - - KeReleaseSpinLock(&Connection->Lock, OldIrql); - - Status = STATUS_PENDING; - - TI_DbgPrint(MAX_TRACE, ("Leaving. Status (0x%X)\n", Status)); - - return Status; -} - - -NTSTATUS TCPListen( - PTDI_REQUEST Request, - PTDI_CONNECTION_INFORMATION ConnInfo, - PTDI_CONNECTION_INFORMATION ReturnInfo) -/* - * FUNCTION: Start listening for a connection from a remote peer - * ARGUMENTS: - * Request = Pointer to TDI request - * ConnInfo = Pointer to connection information - * ReturnInfo = Pointer to structure for return information (optional) - * RETURNS: - * Status of operation - * NOTES: - * This is the high level interface for listening for connections from remote peers - */ -{ - PDATAGRAM_SEND_REQUEST DGSendRequest; - PTCP_SEND_REQUEST TCPSendRequest; - PCONNECTION_ENDPOINT Connection; - LARGE_INTEGER DueTime; - NTSTATUS Status; - KIRQL OldIrql; - - ASSERT(Request); - ASSERT(ConnInfo); - - TI_DbgPrint(MID_TRACE, ("Called.\n")); - - Connection = Request->Handle.ConnectionContext; - - KeAcquireSpinLock(&Connection->Lock, &OldIrql); - - if (Connection->State != ctClosed) { - /* The connection has already been opened so return unsuccessful */ - KeReleaseSpinLock(&Connection->Lock, OldIrql); - return STATUS_UNSUCCESSFUL; - } - - Connection->LocalAddress = Connection->AddressFile->ADE->Address; - Connection->LocalPort = Connection->AddressFile->Port; - Connection->ListenRequest = Request; - - TI_DbgPrint(MIN_TRACE, ("Connection->LocalAddress (%s).\n", A2S(Connection->LocalAddress))); - TI_DbgPrint(MIN_TRACE, ("Connection->LocalPort (%d).\n", Connection->LocalPort)); - - /* Start listening for connection requests */ - Connection->State = ctListen; - - KeReleaseSpinLock(&Connection->Lock, OldIrql); - - Status = STATUS_PENDING; - - TI_DbgPrint(MAX_TRACE, ("Leaving. Status (0x%X)\n", Status)); - - return Status; -} - - -NTSTATUS TCPSendDatagram( - PTDI_REQUEST Request, - PTDI_CONNECTION_INFORMATION ConnInfo, - PNDIS_BUFFER Buffer, - ULONG DataSize) -/* - * FUNCTION: Sends TCP data to a remote address - * ARGUMENTS: - * Request = Pointer to TDI request - * ConnInfo = Pointer to connection information - * Buffer = Pointer to NDIS buffer with data - * DataSize = Size in bytes of data to be sent - * RETURNS: - * Status of operation - */ -{ - ASSERT(Request); - ASSERT(ConnInfo); - ASSERT(Buffer); - - return STATUS_SUCCESS; -} - - -static inline ULONG TCPiSelectISS( - PCONNECTION_ENDPOINT Connection) -{ - ASSERT(Connection); - - TI_DbgPrint(MIN_TRACE, ("Select ISS.\n")); - return 0x10000; -} - - -static inline VOID TCPiReceiveListen( - PADDRESS_FILE AddrFile, - PIP_PACKET IPPacket, - PTCPv4_HEADER TCPHeader) -{ - ASSERT(AddrFile); - ASSERT(IPPacket); - ASSERT(TCPHeader); - - /* FIXME: Protect AddrFile->Connection */ - - if ((TCPHeader->Flags & TCP_RST) > 0) - { - /* Discard */ - TI_DbgPrint(DEBUG_TCP, ("Discard.\n")); - return; - } - - if ((TCPHeader->Flags & TCP_ACK) > 0) - { - /* FIXME: Send RST (if no RST) - <SEQ=SEG.ACK><CTL=RST> */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); - return; - } - - if ((TCPHeader->Flags & TCP_SYN) > 0) - { - PCONNECTION_ENDPOINT Connection = AddrFile->Connection; - register UCHAR DelayedControls; - register NTSTATUS Status; - - /* FIXME: If the SEG.PRC is greater than the TCB.PRC then if allowed by - the user and the system set TCB.PRC<-SEG.PRC, if not allowed - send a reset and return. */ - if (FALSE) - { - /* FIXME: Send RST (if no RST) - * <SEQ=SEG.ACK><CTL=RST> - */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); - return; - } - - /* Set RCV.NXT to SEG.SEQ+1, IRS is set to SEG.SEQ and any other - control or text should be queued for processing later. ISS - should be selected and a SYN segment sent of the form: - - <SEQ=ISS><ACK=RCV.NXT><CTL=SYN,ACK> - - SND.NXT is set to ISS+1 and SND.UNA to ISS. The connection - state should be changed to SYN-RECEIVED. Note that any other - incoming control or data (combined with SYN) will be processed - in the SYN-RECEIVED state, but processing of SYN and ACK should - not be repeated. If the listen was not fully specified (i.e., - the foreign socket was not fully specified), then the - unspecified fields should be filled in now. - */ - TI_DbgPrint(DEBUG_TCP, ("Go to ctSynReceived connection state.\n")); - - Connection->RemotePort = TCPHeader->SourcePort; - /* FIXME: IPv4 only */ - Connection->RemoteAddress = AddrCloneAddress(&IPPacket->SrcAddr); - if (Connection->RemoteAddress == NULL) - { - /* FIXME: Send RST (if no RST) - * <SEQ=SEG.ACK><CTL=RST> - */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); - return; - } - - Connection->ReceiveNext = DN2H(TCPHeader->SequenceNumber) + 1; - Connection->ReceiveIRS = DN2H(TCPHeader->SequenceNumber); - Connection->State = ctSynReceived; - - Connection->SendISS = TCPiSelectISS(Connection); - Connection->SendNext = Connection->SendISS + 1; - Connection->SendUnacknowledged = Connection->SendISS; - - DelayedControls = TCPHeader->Flags & (~(TCP_SYN | TCP_ACK)); - if (DelayedControls > 0) - { - TI_DbgPrint(MIN_TRACE, ("FIXME: Queue controls (0x%x) for later processing.\n", DelayedControls)); - } - - TI_DbgPrint(MIN_TRACE, ("IPPacket->HeaderSize: %d\n", IPPacket->HeaderSize)); - TI_DbgPrint(MIN_TRACE, ("TCPHeader->DataOffset: %d\n", TCPHeader->DataOffset)); - TI_DbgPrint(MIN_TRACE, ("IPPacket->TotalSize: %d\n", IPPacket->TotalSize)); - - if (IPPacket->HeaderSize + (TCPHeader->DataOffset & 0x0F) > IPPacket->TotalSize) - { - TI_DbgPrint(MIN_TRACE, ("FIXME: Queue segment data (%d bytes) for later processing.\n", - (IPPacket->HeaderSize + (TCPHeader->DataOffset & 0x0F)) - IPPacket->TotalSize)); - } - - /* Issue SYN/ACK segment */ - Status = TCPBuildAndTransmitSendRequest2( - Connection, /* Connection endpoint */ - NULL, /* Completion routine */ - NULL, /* Completion routine context */ - NULL, /* Buffer */ - 0, /* Size of buffer */ - SRF_SYN | SRF_ACK, /* Protocol specific flags */ - Connection->SendISS, /* Sequence number */ - Connection->ReceiveNext); /* Acknowledgement number */ - if (!NT_SUCCESS(Status)) - { - /* FIXME: Send RST (if no RST) - * <SEQ=SEG.ACK><CTL=RST> - */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); - return; - } - - ASSERT(Connection->ListenRequest != NULL); - - TI_DbgPrint(DEBUG_TCP, ("Completing listen request at %p.\n", Connection->ListenRequest)); - - /* Complete the listen request */ - (*((DATAGRAM_COMPLETION_ROUTINE)Connection->ListenRequest->RequestNotifyObject))( - Connection->ListenRequest->RequestContext, - STATUS_SUCCESS, - 0); - return; - } - - /* Discard the segment as it is invalid */ - TI_DbgPrint(DEBUG_TCP, ("Discard.\n")); -} - - -static inline VOID TCPiReceiveSynSent( - PADDRESS_FILE AddrFile, - PIP_PACKET IPPacket, - PTCPv4_HEADER TCPHeader) -{ - ASSERT(AddrFile); - ASSERT(IPPacket); - ASSERT(TCPHeader); - - /* FIXME: Protect AddrFile->Connection */ - - if ((TCPHeader->Flags & TCP_ACK) > 0) - { - /* FIXME: If SEG.ACK =< ISS, or SEG.ACK > SND.NXT, send a reset (unless - the RST bit is set, if so drop the segment and return) - <SEQ=SEG.ACK><CTL=RST> */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); - return; - } - - /* FIXME: If SND.UNA =< SEG.ACK =< SND.NXT then the ACK is acceptable. */ - - if ((TCPHeader->Flags & TCP_RST) > 0) - { - if (TRUE /* ACK is acceptable */) - { - AddrFile->Connection->State = ctClosed; - /* FIXME: Signal client */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Signal client.\n")); - } - else - { - /* Discard segment */ - TI_DbgPrint(DEBUG_TCP, ("Discard.\n")); - } - return; - } - - /* FIXME: If the security/compartment in the segment does not exactly - match the security/compartment in the TCB */ - if (FALSE) - { - if ((TCPHeader->Flags & TCP_ACK) > 0) - { - /* FIXME: Send RST (if no RST) - <SEQ=SEG.ACK><CTL=RST> */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); - } - else - { - /* FIXME: Send RST (if no RST) - <SEQ=0><ACK=SEG.SEQ+SEG.LEN><CTL=RST,ACK> */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); - } - return; - } - - if ((TCPHeader->Flags & TCP_ACK) > 0) - { - /* FIXME: If the precedence in the segment does not match the precedence in the TCB */ - if (FALSE) - { - /* FIXME: Send RST (if no RST) - <SEQ=SEG.ACK><CTL=RST> */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); - return; - } - else - { - /* FIXME: If the precedence in the segment is higher than the precedence - in the TCB then if allowed by the user and the system raise - the precedence in the TCB to that in the segment, if not - allowed to raise the prec then send a reset. */ - if (FALSE) - { - /* FIXME: Send RST (if no RST) - <SEQ=0><ACK=SEG.SEQ+SEG.LEN><CTL=RST,ACK> */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); - return; - } - else - { - /* Continue */ - } - } - TI_DbgPrint(MIN_TRACE, ("?.\n")); - return; /* ??? */ - } - - /* The ACK is ok, or there is no ACK, and it the segment did not contain a RST */ - - if ((TCPHeader->Flags & TCP_SYN) > 0) - { - /* FIXME: The security/compartment and precedence are acceptable */ - if (TRUE) - { - PCONNECTION_ENDPOINT Connection = AddrFile->Connection; - register NTSTATUS Status; - - /* FIXME: RCV.NXT is set to SEG.SEQ+1, IRS is set to - SEG.SEQ. SND.UNA should be advanced to equal SEG.ACK (if there - is an ACK), and any segments on the retransmission queue which - are thereby acknowledged should be removed. - - If SND.UNA > ISS (our SYN has been ACKed), change the connection - state to ESTABLISHED, form an ACK segment - - <SEQ=SND.NXT><ACK=RCV.NXT><CTL=ACK> - - Data or controls which were queued for - transmission may be included. If there are other controls or - text in the segment then continue processing at the sixth step - below where the URG bit is checked, otherwise return. - - Otherwise enter SYN-RECEIVED, form a SYN,ACK segment - - <SEQ=ISS><ACK=RCV.NXT><CTL=SYN,ACK> - - and send it. If there are other controls or text in the - segment, queue them for processing after the ESTABLISHED state - has been reached, return. */ - - Connection->ReceiveNext = DN2H(TCPHeader->SequenceNumber) + 1; - Connection->ReceiveIRS = DN2H(TCPHeader->SequenceNumber); - - if ((TCPHeader->Flags & TCP_ACK) > 0) - { - /* FIXME: Remove any outstanding segments on the retransmission queue that is acknowledged by this */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Maybe remove outstanding segments on the retransmission queue.\n")); - Connection->SendUnacknowledged = TCPHeader->AckNumber; - } - - if (Connection->SendUnacknowledged > Connection->SendISS) - { - TI_DbgPrint(DEBUG_TCP, ("Go to ctEstablished connection state.\n")); - Connection->State = ctEstablished; - - TI_DbgPrint(MIN_TRACE, ("FIXME: Controls or segment data queued for transmission may be sent.\n")); - - /* Issue ACK segment */ - Status = TCPBuildAndTransmitSendRequest2( - Connection, /* Connection endpoint */ - NULL, /* Completion routine */ - NULL, /* Completion routine context */ - NULL, /* Buffer */ - 0, /* Size of buffer */ - SRF_ACK, /* Protocol specific flags */ - Connection->SendNext, /* Sequence number */ - Connection->ReceiveNext); /* Acknowledgement number */ - if (!NT_SUCCESS(Status)) - { - /* FIXME: Send RST (if no RST) - * <SEQ=SEG.ACK><CTL=RST> - */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); - return; - } - } - else - { - TI_DbgPrint(MIN_TRACE, ("Go to ctSynReceived connection state.\n")); - Connection->State = ctSynReceived; - - TI_DbgPrint(MIN_TRACE, ("FIXME: Controls or segment data queued for transmission may be sent.\n")); - - /* Issue SYN/ACK segment */ - Status = TCPBuildAndTransmitSendRequest2( - Connection, /* Connection endpoint */ - NULL, /* Completion routine */ - NULL, /* Completion routine context */ - NULL, /* Buffer */ - 0, /* Size of buffer */ - SRF_SYN | SRF_ACK, /* Protocol specific flags */ - Connection->SendISS, /* Sequence number */ - Connection->ReceiveNext); /* Acknowledgement number */ - if (!NT_SUCCESS(Status)) - { - /* FIXME: Send RST (if no RST) - * <SEQ=SEG.ACK><CTL=RST> - */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); - return; - } - } - } - else - { - /* FIXME: What happens here? */ - } - } - - /* FIXME: Send RST (if no RST) - <SEQ=SEG.ACK><CTL=RST> */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); -} - -/* - * Returns TRUE if processing should be continued, FALSE if not - */ -static inline BOOLEAN TCPiReceiveSynReceived( - PADDRESS_FILE AddrFile, - PIP_PACKET IPPacket, - PTCPv4_HEADER TCPHeader) -{ - PCONNECTION_ENDPOINT Connection = AddrFile->Connection; - - ASSERT(AddrFile); - ASSERT(IPPacket); - ASSERT(TCPHeader); - - /* FIXME: Protect AddrFile->Connection */ - - /* FIXME: If SND.UNA =< SEG.ACK =< SND.NXT then enter ESTABLISHED state - and continue processing. - - If the segment acknowledgment is not acceptable, form a - reset segment, - - <SEQ=SEG.ACK><CTL=RST> - - and send it. */ - - if ((Connection->SendUnacknowledged <= DN2H(TCPHeader->AckNumber)) - && (DN2H(TCPHeader->AckNumber) <= Connection->SendNext)) - { - Connection->State = ctEstablished; - TI_DbgPrint(DEBUG_TCP, ("Go to ctEstablished connection state.\n")); - return TRUE; - } - - /* FIXME: Send RST (if no RST) - <SEQ=SEG.ACK><CTL=RST> */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); - - return FALSE; -} - - -static inline VOID TCPiReceiveData( - PADDRESS_FILE AddrFile, - PIP_PACKET IPPacket, - PTCPv4_HEADER TCPHeader, - ULONG Payload) -{ - PCONNECTION_ENDPOINT Connection = AddrFile->Connection; - PTCP_SEGMENT Segment; - NTSTATUS Status; - ULONG Acknowledged; - - ASSERT(AddrFile); - ASSERT(IPPacket); - ASSERT(TCPHeader); - - TI_DbgPrint(DEBUG_TCP, ("Called (Payload %d bytes).\n", Payload)); - - /* FIXME: Protect AddrFile->Connection */ - - /* FIXME: Once in the ESTABLISHED state, it is possible to deliver segment - text to user RECEIVE buffers. Text from segments can be moved - into buffers until either the buffer is full or the segment is - empty. If the segment empties and carries an PUSH flag, then - the user is informed, when the buffer is returned, that a PUSH - has been received. - - When the TCP takes responsibility for delivering the data to the - user it must also acknowledge the receipt of the data. - - Once the TCP takes responsibility for the data it advances - RCV.NXT over the data accepted, and adjusts RCV.WND as - apporopriate to the current buffer availability. The total of - RCV.NXT and RCV.WND should not be reduced. - - Please note the window management suggestions in section 3.7. - - Send an acknowledgment of the form: - - <SEQ=SND.NXT><ACK=RCV.NXT><CTL=ACK> - - This acknowledgment should be piggybacked on a segment being - transmitted if possible without incurring undue delay. */ - - /* FIXME: If the segment is not expected, drop the segment - - A segment is judged to occupy a portion of valid receive sequence - space if - - RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND - - or - - RCV.NXT =< SEG.SEQ+SEG.LEN-1 < RCV.NXT+RCV.WND - */ - - Segment = TCPCreateSegment(IPPacket, - DN2H(TCPHeader->SequenceNumber), - Payload); - if (Segment == NULL) - { - /* FIXME: Send RST (if no RST) - * <SEQ=SEG.ACK><CTL=RST> - */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); - return; - } - - TCPAddSegment(Connection, Segment /*, &Acknowledged */); - - //Connection->ReceiveNext += ; - - /* Issue ACK segment */ - Status = TCPBuildAndTransmitSendRequest2( - Connection, /* Connection endpoint */ - NULL, /* Completion routine */ - NULL, /* Completion routine context */ - NULL, /* Buffer */ - 0, /* Size of buffer */ - SRF_ACK, /* Protocol specific flags */ - Connection->SendNext, /* Sequence number */ - Connection->ReceiveNext); /* Acknowledgement number */ - if (!NT_SUCCESS(Status)) - { - /* FIXME: Send RST (if no RST) - * <SEQ=SEG.ACK><CTL=RST> - */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); - return; - } - - if ((TCPHeader->Flags & TCP_PSH) > 0) - { - TI_DbgPrint(MIN_TRACE, ("FIXME: Handle PUSH flag.\n")); - } - - TI_DbgPrint(MAX_TRACE, ("\n")); -} - - -static inline VOID TCPiReceive( - PADDRESS_FILE AddrFile, - PIP_PACKET IPPacket, - PTCPv4_HEADER TCPHeader, - ULONG Payload) -{ - register CONNECTION_STATE State; - - ASSERT(AddrFile); - ASSERT(IPPacket); - ASSERT(TCPHeader); - - if (AddrFile->Connection == NULL || AddrFile->Connection->State == ctClosed) - { - if ((TCPHeader->Flags & TCP_RST) == 0) - { - /* FIXME: Send RST (if no RST) - * If the ACK bit is off, sequence number zero is used, - * - * <SEQ=0><ACK=SEG.SEQ+SEG.LEN><CTL=RST,ACK> - * - * If the ACK bit is on, - * - * <SEQ=SEG.ACK><CTL=RST> - */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Send RST.\n")); - } - TI_DbgPrint(DEBUG_TCP, ("Discard.\n")); - return; - } - - if (AddrFile->Connection->State == ctListen) - { - TCPiReceiveListen(AddrFile, IPPacket, TCPHeader); - return; - } - - if (AddrFile->Connection->State == ctSynSent) - { - TCPiReceiveSynSent(AddrFile, IPPacket, TCPHeader); - } - - State = AddrFile->Connection->State; - if (State == ctSynReceived - || State == ctEstablished - || State == ctFinWait1 - || State == ctFinWait2 - || State == ctCloseWait - || State == ctClosing - || State == ctLastAck - || State == ctTimeWait) - { - /* Segments are processed in sequence. Initial tests on arrival - are used to discard old duplicates, but further processing is - done in SEG.SEQ order. If a segment's contents straddle the - boundary between old and new, only the new parts should be - processed. - - There are four cases for the acceptability test for an incoming - segment: - - Segment Receive Test - Length Window - ------- ------- ------------------------------------------- - - 0 0 SEG.SEQ = RCV.NXT - - 0 >0 RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND - - >0 0 not acceptable - - >0 >0 RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND - or RCV.NXT =< SEG.SEQ+SEG.LEN-1 < RCV.NXT+RCV.WND - - If the RCV.WND is zero, no segments will be acceptable, but - special allowance should be made to accept valid ACKs, URGs and - RSTs. - - If an incoming segment is not acceptable, an acknowledgment - should be sent in reply (unless the RST bit is set, if so drop - the segment and return): - - <SEQ=SND.NXT><ACK=RCV.NXT><CTL=ACK> - - After sending the acknowledgment, drop the unacceptable segment - and return. */ - - if ((TCPHeader->Flags & TCP_RST) > 0) - { - if (AddrFile->Connection->State == ctSynReceived) - { - /* FIXME: If this connection was initiated with a passive OPEN (i.e., - came from the LISTEN state), then return this connection to - LISTEN state and return. The user need not be informed. If - this connection was initiated with an active OPEN (i.e., came - from SYN-SENT state) then the connection was refused, signal - the user "connection refused". In either case, all segments - on the retransmission queue should be removed. And in the - active OPEN case, enter the CLOSED state and delete the TCB, - and return. */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Maybe go to ctListen or ctClosed connection state.\n")); - return; - } - - State = AddrFile->Connection->State; - if (State == ctEstablished - || State == ctFinWait1 - || State == ctFinWait2 - || State == ctCloseWait) - { - /* FIXME: any outstanding RECEIVEs and SEND - should receive "reset" responses. All segment queues should be - flushed. Users should also receive an unsolicited general - "connection reset" signal. Enter the CLOSED state, delete the - TCB, and return. */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Go to ctClosed connection state.\n")); - return; - } - - State = AddrFile->Connection->State; - if (State == ctClosing - || State == ctLastAck - || State == ctTimeWait) - { - AddrFile->Connection->State = ctClosed; - TI_DbgPrint(DEBUG_TCP, ("Go to ctClosed connection state.\n")); - return; - } - } - - /* FIXME: check security and precedence */ - - if (AddrFile->Connection->State == ctSynReceived) - { - /* FIXME: If the security/compartment and precedence in the segment do not - exactly match the security/compartment and precedence in the TCB - then send a reset, and return. */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Check security/compartment and precedence.\n")); - } - - if (AddrFile->Connection->State == ctSynReceived) - { - /* FIXME: If the security/compartment and precedence in the segment do not - exactly match the security/compartment and precedence in the TCB - then send a reset, any outstanding RECEIVEs and SEND should - receive "reset" responses. All segment queues should be - flushed. Users should also receive an unsolicited general - "connection reset" signal. Enter the CLOSED state, delete the - TCB, and return. */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Check security/compartment and precedence.\n")); - } - - /* Note the previous check is placed following the sequence check to prevent - a segment from an old connection between these ports with a - different security or precedence from causing an abort of the - current connection. */ - - if ((TCPHeader->Flags & TCP_SYN) > 0) - { - State = AddrFile->Connection->State; - if (State == ctSynReceived - || State == ctEstablished - || State == ctFinWait1 - || State == ctFinWait2 - || State == ctCloseWait - || State == ctClosing - || State == ctLastAck - || State == ctTimeWait) - { - /* FIXME: If the SYN is in the window it is an error, send a reset, any - outstanding RECEIVEs and SEND should receive "reset" responses, - all segment queues should be flushed, the user should also - receive an unsolicited general "connection reset" signal, enter - the CLOSED state, delete the TCB, and return. - - If the SYN is not in the window this step would not be reached - and an ack would have been sent in the first step (sequence - number check). */ - - TI_DbgPrint(MIN_TRACE, ("FIXME: Maybe go to ctClosed connection state.\n")); - return; - } - } - - if ((TCPHeader->Flags & TCP_ACK) == 0) - { - /* Discard the segment */ - TI_DbgPrint(DEBUG_TCP, ("Discard.\n")); - return; - } - - if (AddrFile->Connection->State == ctSynReceived) - { - if (TCPiReceiveSynReceived(AddrFile, IPPacket, TCPHeader) == FALSE) - { - return; - } - } - - State = AddrFile->Connection->State; - if (State == ctEstablished - || State == ctCloseWait) - { - PCONNECTION_ENDPOINT Connection = AddrFile->Connection; - - /* FIXME: If SND.UNA < SEG.ACK =< SND.NXT then, set SND.UNA <- SEG.ACK. - Any segments on the retransmission queue which are thereby - entirely acknowledged are removed. Users should receive - positive acknowledgments for buffers which have been SENT and - fully acknowledged (i.e., SEND buffer should be returned with - "ok" response). If the ACK is a duplicate - (SEG.ACK < SND.UNA), it can be ignored. If the ACK acks - something not yet sent (SEG.ACK > SND.NXT) then send an ACK, - drop the segment, and return. - - If SND.UNA < SEG.ACK =< SND.NXT, the send window should be - updated. If (SND.WL1 < SEG.SEQ or (SND.WL1 = SEG.SEQ and - SND.WL2 =< SEG.ACK)), set SND.WND <- SEG.WND, set - SND.WL1 <- SEG.SEQ, and set SND.WL2 <- SEG.ACK. - - Note that SND.WND is an offset from SND.UNA, that SND.WL1 - records the sequence number of the last segment used to update - SND.WND, and that SND.WL2 records the acknowledgment number of - the last segment used to update SND.WND. The check here - prevents using old segments to update the window. */ - - if ((Connection->SendUnacknowledged <= DN2H(TCPHeader->AckNumber)) - && (DN2H(TCPHeader->AckNumber) <= Connection->SendNext)) - { - TI_DbgPrint(MIN_TRACE, ("FIXME: Maybe remove segments on retransmission queue.\n")); - Connection->SendUnacknowledged = DN2H(TCPHeader->AckNumber); - } - - if ((Connection->SendUnacknowledged < DN2H(TCPHeader->AckNumber)) - && (DN2H(TCPHeader->AckNumber) <= Connection->SendNext)) - { - TI_DbgPrint(MIN_TRACE, ("FIXME: Update send window.\n")); - } - - if ((Connection->SendWL1 < DN2H(TCPHeader->SequenceNumber)) - || (Connection->SendWL1 == (DN2H(TCPHeader->SequenceNumber)) - && (Connection->SendWL2 <= (DN2H(TCPHeader->AckNumber))))) - { - TI_DbgPrint(DEBUG_TCP, ("Updating SendWindow, SendWL1 and SendWL2.\n")); - Connection->SendWindow = DN2H(TCPHeader->Window); - Connection->SendWL1 = DN2H(TCPHeader->SequenceNumber); - Connection->SendWL2 = DN2H(TCPHeader->AckNumber); - } - - /* Process any available data in the segment */ - TCPiReceiveData(AddrFile, IPPacket, TCPHeader, Payload); - - return; - } - - if (AddrFile->Connection->State == ctFinWait1) - { - /* FIXME: In addition to the processing for the ESTABLISHED state, if - our FIN is now acknowledged then enter FIN-WAIT-2 and continue - processing in that state. */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Handle ctFinWait1 connection state.\n")); - return; - } - - if (AddrFile->Connection->State == ctFinWait2) - { - /* FIXME: In addition to the processing for the ESTABLISHED state, if - the retransmission queue is empty, the user's CLOSE can be - acknowledged ("ok") but do not delete the TCB. */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Handle ctFinWait2 connection state.\n")); - return; - } - - if (AddrFile->Connection->State == ctClosing) - { - /* FIXME: In addition to the processing for the ESTABLISHED state, if - the ACK acknowledges our FIN then enter the TIME-WAIT state, - otherwise ignore the segment. */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Handle ctClosing connection state.\n")); - return; - } - - if (AddrFile->Connection->State == ctLastAck) - { - /* FIXME: The only thing that can arrive in this state is an - acknowledgment of our FIN. If our FIN is now acknowledged, - delete the TCB, enter the CLOSED state, and return. */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Handle ctLastAck connection state.\n")); - return; - } - - if (AddrFile->Connection->State == ctTimeWait) - { - /* FIXME: The only thing that can arrive in this state is a - retransmission of the remote FIN. Acknowledge it, and restart - the 2 MSL timeout. */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Handle ctTimeWait connection state.\n")); - return; - } - - if ((TCPHeader->Flags & TCP_URG) > 0) - { - State = AddrFile->Connection->State; - if (State == ctEstablished - || State == ctFinWait1 - || State == ctFinWait2) - { - /* FIXME: If the URG bit is set, RCV.UP <- max(RCV.UP,SEG.UP), and signal - the user that the remote side has urgent data if the urgent - pointer (RCV.UP) is in advance of the data consumed. If the - user has already been signaled (or is still in the "urgent - mode") for this continuous sequence of urgent data, do not - signal the user again. */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Handle URG flag.\n")); - return; - } - - State = AddrFile->Connection->State; - if (State == ctCloseWait - || State == ctClosing - || State == ctLastAck - || State == ctTimeWait) - { - /* This should not occur, since a FIN has been received from the - remote side. Ignore the URG. */ - } - } - - State = AddrFile->Connection->State; - if (State == ctEstablished - || State == ctFinWait1 - || State == ctFinWait2) - { - /* Process any available data in the segment */ - TCPiReceiveData(AddrFile, IPPacket, TCPHeader, Payload); - return; - } - - State = AddrFile->Connection->State; - if (State == ctCloseWait - || State == ctClosing - || State == ctLastAck - || State == ctTimeWait) - { - /* This should not occur, since a FIN has been received from the - remote side. Ignore the segment text. */ - } - - if ((TCPHeader->Flags & TCP_FIN) > 0) - { - /* Do not process the FIN if the state is CLOSED, LISTEN or SYN-SENT - since the SEG.SEQ cannot be validated; drop the segment and - return. */ - State = AddrFile->Connection->State; - if (State == ctClosed - || State == ctListen - || State == ctSynSent) - { - /* Discard segment */ - TI_DbgPrint(DEBUG_TCP, ("Discard.\n")); - return; - } - - /* FIXME: If the FIN bit is set, signal the user "connection closing" and - return any pending RECEIVEs with same message, advance RCV.NXT - over the FIN, and send an acknowledgment for the FIN. Note that - FIN implies PUSH for any segment text not yet delivered to the - user. */ - - TI_DbgPrint(MIN_TRACE, ("FIXME: Handle FIN flag.\n")); - - State = AddrFile->Connection->State; - switch (State) - { - case ctSynReceived: - case ctEstablished: - { - /* FIXME: Enter ctClosed state */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Go to ctClosed connection state.\n")); - break; - } - case ctFinWait1: - { - /* FIXME: If our FIN has been ACKed (perhaps in this segment), then - enter TIME-WAIT, start the time-wait timer, turn off the other - timers; otherwise enter the CLOSING state. */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Maybe go to ctClosing connection state.\n")); - break; - } - case ctFinWait2: - { - /* FIXME: Enter the TIME-WAIT state. Start the time-wait timer, turn - off the other timers. */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Go to ctTimeWait connection state.\n")); - break; - } - case ctCloseWait: - case ctClosing: - case ctLastAck: - { - /* Remain in ctCloseWait, ctClosing or ctLastAck connection state */ - break; - } - case ctTimeWait: - { - /* FIXME: Remain in ctTimeWait connection state. Restart the 2 MSL time-wait - timeout */ - TI_DbgPrint(MIN_TRACE, ("FIXME: Restart the 2 MSL time-wait timeout.\n")); - return; - } - default: - ASSERT(FALSE); - return; - } - } - TI_DbgPrint(MIN_TRACE, ("Return.\n")); - return; - } -} - - -VOID TCPReceive( - PNET_TABLE_ENTRY NTE, - PIP_PACKET IPPacket) +VOID TCPReceive(PNET_TABLE_ENTRY NTE, PIP_PACKET IPPacket) /* * FUNCTION: Receives and queues TCP data * ARGUMENTS: @@ -1668,150 +32,220 @@ VOID TCPReceive( * This is the low level interface for receiving TCP data */ { - AF_SEARCH SearchContext; - PIPv4_HEADER IPv4Header; - PADDRESS_FILE AddrFile; - PTCPv4_HEADER TCPHeader; - PIP_ADDRESS DstAddress; - UINT DataSize, i; - TCPv4_PSEUDO_HEADER TcpPseudoHeader; - KIRQL OldIrql; + PCHAR BufferData = exAllocatePool( NonPagedPool, IPPacket->TotalSize ); - ASSERT(NTE); - ASSERT(IPPacket); + if( BufferData ) { + TI_DbgPrint(MID_TRACE,("Sending packet %d (%d) to oskit\n", + IPPacket->TotalSize, + IPPacket->HeaderSize)); - TI_DbgPrint(MAX_TRACE, ("Called.\n")); + memcpy( BufferData, IPPacket->Header, IPPacket->HeaderSize ); + memcpy( BufferData + IPPacket->HeaderSize, IPPacket->Data, + IPPacket->TotalSize - IPPacket->HeaderSize ); + + OskitTCPReceiveDatagram( BufferData, + IPPacket->TotalSize, + IPPacket->HeaderSize ); - switch (IPPacket->Type) { - /* IPv4 packet */ - case IP_ADDRESS_V4: - IPv4Header = IPPacket->Header; - DstAddress = &IPPacket->DstAddr; - break; - - /* IPv6 packet */ - case IP_ADDRESS_V6: - TI_DbgPrint(MIN_TRACE, ("Discarded IPv6 TCP data (%i bytes).\n", - IPPacket->TotalSize)); - - /* FIXME: IPv6 is not supported */ - return; - - default: - return; - } - - DISPLAY_TCP_PACKET(IPPacket); - - TCPHeader = (PTCPv4_HEADER)IPPacket->Data; - -#if 0 - /* Build pseudo TCP header which is used to prevent misrouted segments */ - TcpPseudoHeader.SourceAddress = IPPacket->SrcAddr.Address.IPv4Address; - TcpPseudoHeader.DestinationAddress = IPPacket->DstAddr.Address.IPv4Address;; - TcpPseudoHeader.Zero = 0; - TcpPseudoHeader.Protocol = 0; - /* Length of TCP header and segment data */ - TcpPseudoHeader.TCPLength = IPv4Header->TotalLength; - - /* Checksum TCP header and segment data */ - if (!TCPCorrectChecksum(&TcpPseudoHeader, IPPacket->Header, IPPacket->TotalSize)) { - TI_DbgPrint(MIN_TRACE, ("Segment received with bad checksum. Checksum field (0x%X)\n", - WN2H(TCPHeader->Checksum))); - /* Discard packet */ - return; - } -#endif - - /* FIXME: Sanity checks */ - - /* Locate the on destination address file object and deliver the - packet if one is found. If no matching address file object can be - found, drop the packet */ - - AddrFile = AddrSearchFirst(DstAddress, - TCPHeader->DestinationPort, - IPPROTO_TCP, - &SearchContext); - if (AddrFile) { - ULONG TotalLength; - ULONG DataOffset; - ULONG Payload; - - TotalLength = WN2H(IPv4Header->TotalLength); - DataOffset = (TCPHeader->DataOffset & 0xF0) >> (4 << 2); /* Left-most 4 bits (in 32-bit words)*/ - Payload = TotalLength - DataOffset; - - TI_DbgPrint(DEBUG_TCP, ("TotalLength %d, DataOffset %d (%d bytes payload)\n", - TotalLength, DataOffset, Payload)); - - /* There can be only one client */ - TI_DbgPrint(MID_TRACE, ("Found address file object for IPv4 TCP datagram to address (0x%X).\n", - DN2H(DstAddress->Address.IPv4Address))); - /* FIXME: Slow but effective synchronization */ - KeAcquireSpinLock(&AddrFile->Connection->Lock, &OldIrql); - TCPiReceive(AddrFile, IPPacket, TCPHeader, Payload); - KeReleaseSpinLock(&AddrFile->Connection->Lock, OldIrql); - } else { - /* There are no open address files that will take this datagram */ - /* FIXME: IPv4 only */ - TI_DbgPrint(MID_TRACE, ("Cannot deliver IPv4 TCP datagram to address (0x%X).\n", - DN2H(DstAddress->Address.IPv4Address))); - - /* FIXME: Send ICMP reply */ - } - - TI_DbgPrint(MAX_TRACE, ("Leaving.\n")); + exFreePool( BufferData ); + } } +/* event.c */ +void TCPSocketState( void *ClientData, + void *WhichSocket, + void *WhichConnection, + OSK_UINT SelFlags, + OSK_UINT SocketState ); -NTSTATUS TCPStartup( - VOID) +int TCPPacketSend( void *ClientData, + void *WhichSocket, + void *WhichConnection, + OSK_PCHAR Data, + OSK_UINT Len ); + +OSKITTCP_EVENT_HANDLERS EventHandlers = { + NULL, /* Client Data */ + TCPSocketState, /* SocketState */ + TCPPacketSend, /* PacketSend */ +}; + +NTSTATUS TCPStartup(VOID) /* * FUNCTION: Initializes the TCP subsystem * RETURNS: * Status of operation */ { - tcp_init(); - - /* Register this protocol with IP layer */ - IPRegisterProtocol(IPPROTO_TCP, TCPReceive); - - ExInitializeNPagedLookasideList( - &TCPSegmentList, /* Lookaside list */ - NULL, /* Allocate routine */ - NULL, /* Free routine */ - 0, /* Flags */ - sizeof(TCP_SEGMENT), /* Size of each entry */ - TAG('T','C','P','S'), /* Tag */ - 0); /* Depth */ - - TCPInitialized = TRUE; - - return STATUS_SUCCESS; + InitOskitTCP(); + RegisterOskitTCPEventHandlers( &EventHandlers ); + + /* Register this protocol with IP layer */ + IPRegisterProtocol(IPPROTO_TCP, TCPReceive); + + ExInitializeNPagedLookasideList( + &TCPSegmentList, /* Lookaside list */ + NULL, /* Allocate routine */ + NULL, /* Free routine */ + 0, /* Flags */ + sizeof(TCP_SEGMENT), /* Size of each entry */ + TAG('T','C','P','S'), /* Tag */ + 0); /* Depth */ + + TCPInitialized = TRUE; + + return STATUS_SUCCESS; } -NTSTATUS TCPShutdown( - VOID) +NTSTATUS TCPShutdown(VOID) /* * FUNCTION: Shuts down the TCP subsystem * RETURNS: * Status of operation */ { - if (!TCPInitialized) + if (!TCPInitialized) + return STATUS_SUCCESS; + + /* Deregister this protocol with IP layer */ + IPRegisterProtocol(IPPROTO_TCP, NULL); + + ExDeleteNPagedLookasideList(&TCPSegmentList); + + TCPInitialized = FALSE; + + DeinitOskitTCP(); + return STATUS_SUCCESS; +} - /* Deregister this protocol with IP layer */ - IPRegisterProtocol(IPPROTO_TCP, NULL); +NTSTATUS TCPTranslateError( int OskitError ) { + NTSTATUS Status = STATUS_UNSUCCESSFUL; - ExDeleteNPagedLookasideList(&TCPSegmentList); + switch( OskitError ) { + case 0: Status = STATUS_SUCCESS; break; + /*case OAK_EADDRNOTAVAIL: */ + case OSK_EAFNOSUPPORT: Status = STATUS_INVALID_CONNECTION; break; + case OSK_ECONNREFUSED: + case OSK_ECONNRESET: Status = STATUS_REMOTE_NOT_LISTENING; break; + default: Status = STATUS_INVALID_CONNECTION; break; + } - TCPInitialized = FALSE; + TI_DbgPrint(MID_TRACE,("Error %d -> %x\n", OskitError, Status)); + return Status; +} - return STATUS_SUCCESS; +NTSTATUS TCPConnect +( PTDI_REQUEST Request, + PTDI_CONNECTION_INFORMATION ConnInfo, + PTDI_CONNECTION_INFORMATION ReturnInfo ) { + KIRQL OldIrql; + NTSTATUS Status; + SOCKADDR_IN AddressToConnect; + PCONNECTION_ENDPOINT Connection; + + Connection = Request->Handle.ConnectionContext; + + KeAcquireSpinLock(&Connection->Lock, &OldIrql); + + PIP_ADDRESS RemoteAddress; + USHORT RemotePort; + + Status = AddrBuildAddress( + (PTA_ADDRESS)(&((PTRANSPORT_ADDRESS)ConnInfo->RemoteAddress)-> + Address[0]), + &RemoteAddress, + &RemotePort); + + if (!NT_SUCCESS(Status)) { + TI_DbgPrint(MID_TRACE, ("Could not AddrBuildAddress in TCPConnect\n")); + KeReleaseSpinLock(&Connection->Lock, OldIrql); + return Status; + } + + AddressToConnect.sin_family = AF_INET; + + memcpy( &AddressToConnect.sin_addr, + &RemoteAddress->Address.IPv4Address, + sizeof(AddressToConnect.sin_addr) ); + AddressToConnect.sin_port = RemotePort; + KeReleaseSpinLock(&Connection->Lock, OldIrql); + + return TCPTranslateError( OskitTCPConnect(Connection->SocketContext, + Connection, + &AddressToConnect, + sizeof(AddressToConnect)) ); +} + +NTSTATUS TCPClose +( PTDI_REQUEST Request ) { + PCONNECTION_ENDPOINT Connection; + + Connection = Request->Handle.ConnectionContext; + + return TCPTranslateError( OskitTCPClose( Connection->SocketContext ) ); +} + +NTSTATUS TCPListen +( PTDI_REQUEST Request, + UINT Backlog ) { + PCONNECTION_ENDPOINT Connection; + + Connection = Request->Handle.ConnectionContext; + + return TCPTranslateError( OskitTCPListen( Connection->SocketContext, + Backlog ) ); +} + +NTSTATUS TCPAccept +( PTDI_REQUEST Request, + VOID **NewSocketContext ) { +} + +NTSTATUS TCPReceiveData +( PTDI_REQUEST Request, + PNDIS_BUFFER Buffer, + ULONG ReceiveLength, + ULONG ReceiveFlags, + PULONG BytesReceived ) { + PCONNECTION_ENDPOINT Connection; + PCHAR DataBuffer; + UINT DataLen, Received = 0; + + Connection = Request->Handle.ConnectionContext; + + NdisQueryBuffer( Buffer, &DataBuffer, &DataLen ); + + return TCPTranslateError + ( OskitTCPRecv + ( Connection->SocketContext, + DataBuffer, + DataLen, + &Received, + ReceiveFlags ) ); +} + +NTSTATUS TCPSendData +( PTDI_REQUEST Request, + PTDI_CONNECTION_INFORMATION ConnInfo, + PNDIS_BUFFER Buffer, + ULONG DataSize ) { + PCONNECTION_ENDPOINT Connection; + PCHAR BufferData; + ULONG PacketSize; + int error; + + NdisQueryBuffer( Buffer, &BufferData, &PacketSize ); + + Connection = Request->Handle.ConnectionContext; + return OskitTCPSend( Connection->SocketContext, + BufferData, PacketSize, 0 ); +} + +NTSTATUS TCPTimeout(VOID) { + static int Times = 0; + if( (Times++ % 100) == 0 ) TimerOskitTCP(); } /* EOF */ diff --git a/reactos/drivers/net/tcpip/transport/tcp/tcp_input.c b/reactos/drivers/net/tcpip/transport/tcp/tcp_input.c deleted file mode 100755 index b4bb72a6a7c..00000000000 --- a/reactos/drivers/net/tcpip/transport/tcp/tcp_input.c +++ /dev/null @@ -1,4184 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS TCP/IP protocol driver - * FILE: transport/tcp/tcp_input.c - * PURPOSE: Transmission Control Protocol - * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net) - * REVISIONS: - * CSH 15-01-2003 Imported from linux kernel 2.4.20 - */ - -/* - * INET An implementation of the TCP/IP protocol suite for the LINUX - * operating system. INET is implemented using the BSD Socket - * interface as the means of communication with the user level. - * - * Implementation of the Transmission Control Protocol(TCP). - * - * Version: $Id: tcp_input.c,v 1.1 2003/01/15 21:57:31 chorns Exp $ - * - * Authors: Ross Biro, <bir7@leland.Stanford.Edu> - * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> - * Mark Evans, <evansmp@uhura.aston.ac.uk> - * Corey Minyard <wf-rch!minyard@relay.EU.net> - * Florian La Roche, <flla@stud.uni-sb.de> - * Charles Hedrick, <hedrick@klinzhai.rutgers.edu> - * Linus Torvalds, <torvalds@cs.helsinki.fi> - * Alan Cox, <gw4pts@gw4pts.ampr.org> - * Matthew Dillon, <dillon@apollo.west.oic.com> - * Arnt Gulbrandsen, <agulbra@nvg.unit.no> - * Jorge Cwik, <jorge@laser.satlink.net> - */ - -/* - * Changes: - * Pedro Roque : Fast Retransmit/Recovery. - * Two receive queues. - * Retransmit queue handled by TCP. - * Better retransmit timer handling. - * New congestion avoidance. - * Header prediction. - * Variable renaming. - * - * Eric : Fast Retransmit. - * Randy Scott : MSS option defines. - * Eric Schenk : Fixes to slow start algorithm. - * Eric Schenk : Yet another double ACK bug. - * Eric Schenk : Delayed ACK bug fixes. - * Eric Schenk : Floyd style fast retrans war avoidance. - * David S. Miller : Don't allow zero congestion window. - * Eric Schenk : Fix retransmitter so that it sends - * next packet on ack of previous packet. - * Andi Kleen : Moved open_request checking here - * and process RSTs for open_requests. - * Andi Kleen : Better prune_queue, and other fixes. - * Andrey Savochkin: Fix RTT measurements in the presnce of - * timestamps. - * Andrey Savochkin: Check sequence numbers correctly when - * removing SACKs due to in sequence incoming - * data segments. - * Andi Kleen: Make sure we never ack data there is not - * enough room for. Also make this condition - * a fatal error if it might still happen. - * Andi Kleen: Add tcp_measure_rcv_mss to make - * connections with MSS<min(MTU,ann. MSS) - * work without delayed acks. - * Andi Kleen: Process packets with PSH set in the - * fast path. - * J Hadi Salim: ECN support - * Andrei Gurtov, - * Pasi Sarolahti, - * Panu Kuhlberg: Experimental audit of TCP (re)transmission - * engine. Lots of bugs are found. - */ - -#if 0 -#include <linux/config.h> -#include <linux/mm.h> -#include <linux/sysctl.h> -#include <net/tcp.h> -#include <net/inet_common.h> -#include <linux/ipsec.h> -#else -#include "linux.h" -#include "tcpcore.h" -#endif - -int sysctl_tcp_timestamps = 1; -int sysctl_tcp_window_scaling = 1; -int sysctl_tcp_sack = 1; -int sysctl_tcp_fack = 1; -int sysctl_tcp_reordering = TCP_FASTRETRANS_THRESH; -#ifdef CONFIG_INET_ECN -int sysctl_tcp_ecn = 1; -#else -int sysctl_tcp_ecn = 0; -#endif -int sysctl_tcp_dsack = 1; -int sysctl_tcp_app_win = 31; -int sysctl_tcp_adv_win_scale = 2; - -int sysctl_tcp_stdurg = 0; -int sysctl_tcp_rfc1337 = 0; -//int sysctl_tcp_max_orphans = NR_FILE; - -#define FLAG_DATA 0x01 /* Incoming frame contained data. */ -#define FLAG_WIN_UPDATE 0x02 /* Incoming ACK was a window update. */ -#define FLAG_DATA_ACKED 0x04 /* This ACK acknowledged new data. */ -#define FLAG_RETRANS_DATA_ACKED 0x08 /* "" "" some of which was retransmitted. */ -#define FLAG_SYN_ACKED 0x10 /* This ACK acknowledged SYN. */ -#define FLAG_DATA_SACKED 0x20 /* New SACK. */ -#define FLAG_ECE 0x40 /* ECE in this ACK */ -#define FLAG_DATA_LOST 0x80 /* SACK detected data lossage. */ -#define FLAG_SLOWPATH 0x100 /* Do not skip RFC checks for window update.*/ - -#define FLAG_ACKED (FLAG_DATA_ACKED|FLAG_SYN_ACKED) -#define FLAG_NOT_DUP (FLAG_DATA|FLAG_WIN_UPDATE|FLAG_ACKED) -#define FLAG_CA_ALERT (FLAG_DATA_SACKED|FLAG_ECE) -#define FLAG_FORWARD_PROGRESS (FLAG_ACKED|FLAG_DATA_SACKED) - -#define IsReno(tp) ((tp)->sack_ok == 0) -#define IsFack(tp) ((tp)->sack_ok & 2) -#define IsDSack(tp) ((tp)->sack_ok & 4) - -#define TCP_REMNANT (TCP_FLAG_FIN|TCP_FLAG_URG|TCP_FLAG_SYN|TCP_FLAG_PSH) - -/* Adapt the MSS value used to make delayed ack decision to the - * real world. - */ -static __inline__ void tcp_measure_rcv_mss(struct tcp_opt *tp, struct sk_buff *skb) -{ -#if 0 - unsigned int len, lss; - - lss = tp->ack.last_seg_size; - tp->ack.last_seg_size = 0; - - /* skb->len may jitter because of SACKs, even if peer - * sends good full-sized frames. - */ - len = skb->len; - if (len >= tp->ack.rcv_mss) { - tp->ack.rcv_mss = len; - } else { - /* Otherwise, we make more careful check taking into account, - * that SACKs block is variable. - * - * "len" is invariant segment length, including TCP header. - */ - len += skb->data - skb->h.raw; - if (len >= TCP_MIN_RCVMSS + sizeof(struct tcphdr) || - /* If PSH is not set, packet should be - * full sized, provided peer TCP is not badly broken. - * This observation (if it is correct 8)) allows - * to handle super-low mtu links fairly. - */ - (len >= TCP_MIN_MSS + sizeof(struct tcphdr) && - !(tcp_flag_word(skb->h.th)&TCP_REMNANT))) { - /* Subtract also invariant (if peer is RFC compliant), - * tcp header plus fixed timestamp option length. - * Resulting "len" is MSS free of SACK jitter. - */ - len -= tp->tcp_header_len; - tp->ack.last_seg_size = len; - if (len == lss) { - tp->ack.rcv_mss = len; - return; - } - } - tp->ack.pending |= TCP_ACK_PUSHED; - } -#endif -} - -static void tcp_incr_quickack(struct tcp_opt *tp) -{ -#if 0 - unsigned quickacks = tp->rcv_wnd/(2*tp->ack.rcv_mss); - - if (quickacks==0) - quickacks=2; - if (quickacks > tp->ack.quick) - tp->ack.quick = min(quickacks, TCP_MAX_QUICKACKS); -#endif -} - -void tcp_enter_quickack_mode(struct tcp_opt *tp) -{ -#if 0 - tcp_incr_quickack(tp); - tp->ack.pingpong = 0; - tp->ack.ato = TCP_ATO_MIN; -#endif -} - -/* Send ACKs quickly, if "quick" count is not exhausted - * and the session is not interactive. - */ - -static __inline__ int tcp_in_quickack_mode(struct tcp_opt *tp) -{ -#if 0 - return (tp->ack.quick && !tp->ack.pingpong); -#else - return 0; -#endif -} - -/* Buffer size and advertised window tuning. - * - * 1. Tuning sk->sndbuf, when connection enters established state. - */ - -static void tcp_fixup_sndbuf(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - int sndmem = tp->mss_clamp+MAX_TCP_HEADER+16+sizeof(struct sk_buff); - - if (sk->sndbuf < 3*sndmem) - sk->sndbuf = min(3*sndmem, sysctl_tcp_wmem[2]); -#endif -} - -/* 2. Tuning advertised window (window_clamp, rcv_ssthresh) - * - * All tcp_full_space() is split to two parts: "network" buffer, allocated - * forward and advertised in receiver window (tp->rcv_wnd) and - * "application buffer", required to isolate scheduling/application - * latencies from network. - * window_clamp is maximal advertised window. It can be less than - * tcp_full_space(), in this case tcp_full_space() - window_clamp - * is reserved for "application" buffer. The less window_clamp is - * the smoother our behaviour from viewpoint of network, but the lower - * throughput and the higher sensitivity of the connection to losses. 8) - * - * rcv_ssthresh is more strict window_clamp used at "slow start" - * phase to predict further behaviour of this connection. - * It is used for two goals: - * - to enforce header prediction at sender, even when application - * requires some significant "application buffer". It is check #1. - * - to prevent pruning of receive queue because of misprediction - * of receiver window. Check #2. - * - * The scheme does not work when sender sends good segments opening - * window and then starts to feed us spagetti. But it should work - * in common situations. Otherwise, we have to rely on queue collapsing. - */ - -/* Slow part of check#2. */ -static int -__tcp_grow_window(struct sock *sk, struct tcp_opt *tp, struct sk_buff *skb) -{ -#if 0 - /* Optimize this! */ - int truesize = tcp_win_from_space(skb->truesize)/2; - int window = tcp_full_space(sk)/2; - - while (tp->rcv_ssthresh <= window) { - if (truesize <= skb->len) - return 2*tp->ack.rcv_mss; - - truesize >>= 1; - window >>= 1; - } - return 0; -#else - return 0; -#endif -} - -static __inline__ void -tcp_grow_window(struct sock *sk, struct tcp_opt *tp, struct sk_buff *skb) -{ -#if 0 - /* Check #1 */ - if (tp->rcv_ssthresh < tp->window_clamp && - (int)tp->rcv_ssthresh < tcp_space(sk) && - !tcp_memory_pressure) { - int incr; - - /* Check #2. Increase window, if skb with such overhead - * will fit to rcvbuf in future. - */ - if (tcp_win_from_space(skb->truesize) <= skb->len) - incr = 2*tp->advmss; - else - incr = __tcp_grow_window(sk, tp, skb); - - if (incr) { - tp->rcv_ssthresh = min(tp->rcv_ssthresh + incr, tp->window_clamp); - tp->ack.quick |= 1; - } - } -#endif -} - -/* 3. Tuning rcvbuf, when connection enters established state. */ - -static void tcp_fixup_rcvbuf(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - int rcvmem = tp->advmss+MAX_TCP_HEADER+16+sizeof(struct sk_buff); - - /* Try to select rcvbuf so that 4 mss-sized segments - * will fit to window and correspoding skbs will fit to our rcvbuf. - * (was 3; 4 is minimum to allow fast retransmit to work.) - */ - while (tcp_win_from_space(rcvmem) < tp->advmss) - rcvmem += 128; - if (sk->rcvbuf < 4*rcvmem) - sk->rcvbuf = min(4*rcvmem, sysctl_tcp_rmem[2]); -#endif -} - -/* 4. Try to fixup all. It is made iimediately after connection enters - * established state. - */ -static void tcp_init_buffer_space(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - int maxwin; - - if (!(sk->userlocks&SOCK_RCVBUF_LOCK)) - tcp_fixup_rcvbuf(sk); - if (!(sk->userlocks&SOCK_SNDBUF_LOCK)) - tcp_fixup_sndbuf(sk); - - maxwin = tcp_full_space(sk); - - if (tp->window_clamp >= maxwin) { - tp->window_clamp = maxwin; - - if (sysctl_tcp_app_win && maxwin>4*tp->advmss) - tp->window_clamp = max(maxwin-(maxwin>>sysctl_tcp_app_win), 4*tp->advmss); - } - - /* Force reservation of one segment. */ - if (sysctl_tcp_app_win && - tp->window_clamp > 2*tp->advmss && - tp->window_clamp + tp->advmss > maxwin) - tp->window_clamp = max(2*tp->advmss, maxwin-tp->advmss); - - tp->rcv_ssthresh = min(tp->rcv_ssthresh, tp->window_clamp); - tp->snd_cwnd_stamp = tcp_time_stamp; -#endif -} - -/* 5. Recalculate window clamp after socket hit its memory bounds. */ -static void tcp_clamp_window(struct sock *sk, struct tcp_opt *tp) -{ -#if 0 - struct sk_buff *skb; - unsigned int app_win = tp->rcv_nxt - tp->copied_seq; - int ofo_win = 0; - - tp->ack.quick = 0; - - skb_queue_walk(&tp->out_of_order_queue, skb) { - ofo_win += skb->len; - } - - /* If overcommit is due to out of order segments, - * do not clamp window. Try to expand rcvbuf instead. - */ - if (ofo_win) { - if (sk->rcvbuf < sysctl_tcp_rmem[2] && - !(sk->userlocks&SOCK_RCVBUF_LOCK) && - !tcp_memory_pressure && - atomic_read(&tcp_memory_allocated) < sysctl_tcp_mem[0]) - sk->rcvbuf = min(atomic_read(&sk->rmem_alloc), sysctl_tcp_rmem[2]); - } - if (atomic_read(&sk->rmem_alloc) > sk->rcvbuf) { - app_win += ofo_win; - if (atomic_read(&sk->rmem_alloc) >= 2*sk->rcvbuf) - app_win >>= 1; - if (app_win > tp->ack.rcv_mss) - app_win -= tp->ack.rcv_mss; - app_win = max(app_win, 2U*tp->advmss); - - if (!ofo_win) - tp->window_clamp = min(tp->window_clamp, app_win); - tp->rcv_ssthresh = min(tp->window_clamp, 2U*tp->advmss); - } -#endif -} - -/* There is something which you must keep in mind when you analyze the - * behavior of the tp->ato delayed ack timeout interval. When a - * connection starts up, we want to ack as quickly as possible. The - * problem is that "good" TCP's do slow start at the beginning of data - * transmission. The means that until we send the first few ACK's the - * sender will sit on his end and only queue most of his data, because - * he can only send snd_cwnd unacked packets at any given time. For - * each ACK we send, he increments snd_cwnd and transmits more of his - * queue. -DaveM - */ -static void tcp_event_data_recv(struct sock *sk, struct tcp_opt *tp, struct sk_buff *skb) -{ -#if 0 - u32 now; - - tcp_schedule_ack(tp); - - tcp_measure_rcv_mss(tp, skb); - - now = tcp_time_stamp; - - if (!tp->ack.ato) { - /* The _first_ data packet received, initialize - * delayed ACK engine. - */ - tcp_incr_quickack(tp); - tp->ack.ato = TCP_ATO_MIN; - } else { - int m = now - tp->ack.lrcvtime; - - if (m <= TCP_ATO_MIN/2) { - /* The fastest case is the first. */ - tp->ack.ato = (tp->ack.ato>>1) + TCP_ATO_MIN/2; - } else if (m < tp->ack.ato) { - tp->ack.ato = (tp->ack.ato>>1) + m; - if (tp->ack.ato > tp->rto) - tp->ack.ato = tp->rto; - } else if (m > tp->rto) { - /* Too long gap. Apparently sender falled to - * restart window, so that we send ACKs quickly. - */ - tcp_incr_quickack(tp); - tcp_mem_reclaim(sk); - } - } - tp->ack.lrcvtime = now; - - TCP_ECN_check_ce(tp, skb); - - if (skb->len >= 128) - tcp_grow_window(sk, tp, skb); -#endif -} - -/* Called to compute a smoothed rtt estimate. The data fed to this - * routine either comes from timestamps, or from segments that were - * known _not_ to have been retransmitted [see Karn/Partridge - * Proceedings SIGCOMM 87]. The algorithm is from the SIGCOMM 88 - * piece by Van Jacobson. - * NOTE: the next three routines used to be one big routine. - * To save cycles in the RFC 1323 implementation it was better to break - * it up into three procedures. -- erics - */ -static __inline__ void tcp_rtt_estimator(struct tcp_opt *tp, __u32 mrtt) -{ -#if 0 - long m = mrtt; /* RTT */ - - /* The following amusing code comes from Jacobson's - * article in SIGCOMM '88. Note that rtt and mdev - * are scaled versions of rtt and mean deviation. - * This is designed to be as fast as possible - * m stands for "measurement". - * - * On a 1990 paper the rto value is changed to: - * RTO = rtt + 4 * mdev - * - * Funny. This algorithm seems to be very broken. - * These formulae increase RTO, when it should be decreased, increase - * too slowly, when it should be incresed fastly, decrease too fastly - * etc. I guess in BSD RTO takes ONE value, so that it is absolutely - * does not matter how to _calculate_ it. Seems, it was trap - * that VJ failed to avoid. 8) - */ - if(m == 0) - m = 1; - if (tp->srtt != 0) { - m -= (tp->srtt >> 3); /* m is now error in rtt est */ - tp->srtt += m; /* rtt = 7/8 rtt + 1/8 new */ - if (m < 0) { - m = -m; /* m is now abs(error) */ - m -= (tp->mdev >> 2); /* similar update on mdev */ - /* This is similar to one of Eifel findings. - * Eifel blocks mdev updates when rtt decreases. - * This solution is a bit different: we use finer gain - * for mdev in this case (alpha*beta). - * Like Eifel it also prevents growth of rto, - * but also it limits too fast rto decreases, - * happening in pure Eifel. - */ - if (m > 0) - m >>= 3; - } else { - m -= (tp->mdev >> 2); /* similar update on mdev */ - } - tp->mdev += m; /* mdev = 3/4 mdev + 1/4 new */ - if (tp->mdev > tp->mdev_max) { - tp->mdev_max = tp->mdev; - if (tp->mdev_max > tp->rttvar) - tp->rttvar = tp->mdev_max; - } - if (after(tp->snd_una, tp->rtt_seq)) { - if (tp->mdev_max < tp->rttvar) - tp->rttvar -= (tp->rttvar-tp->mdev_max)>>2; - tp->rtt_seq = tp->snd_nxt; - tp->mdev_max = TCP_RTO_MIN; - } - } else { - /* no previous measure. */ - tp->srtt = m<<3; /* take the measured time to be rtt */ - tp->mdev = m<<1; /* make sure rto = 3*rtt */ - tp->mdev_max = tp->rttvar = max(tp->mdev, TCP_RTO_MIN); - tp->rtt_seq = tp->snd_nxt; - } -#endif -} - -/* Calculate rto without backoff. This is the second half of Van Jacobson's - * routine referred to above. - */ -static __inline__ void tcp_set_rto(struct tcp_opt *tp) -{ -#if 0 - /* Old crap is replaced with new one. 8) - * - * More seriously: - * 1. If rtt variance happened to be less 50msec, it is hallucination. - * It cannot be less due to utterly erratic ACK generation made - * at least by solaris and freebsd. "Erratic ACKs" has _nothing_ - * to do with delayed acks, because at cwnd>2 true delack timeout - * is invisible. Actually, Linux-2.4 also generates erratic - * ACKs in some curcumstances. - */ - tp->rto = (tp->srtt >> 3) + tp->rttvar; - - /* 2. Fixups made earlier cannot be right. - * If we do not estimate RTO correctly without them, - * all the algo is pure shit and should be replaced - * with correct one. It is exaclty, which we pretend to do. - */ -#endif -} - -/* NOTE: clamping at TCP_RTO_MIN is not required, current algo - * guarantees that rto is higher. - */ -static __inline__ void tcp_bound_rto(struct tcp_opt *tp) -{ -#if 0 - if (tp->rto > TCP_RTO_MAX) - tp->rto = TCP_RTO_MAX; -#endif -} - -/* Save metrics learned by this TCP session. - This function is called only, when TCP finishes successfully - i.e. when it enters TIME-WAIT or goes from LAST-ACK to CLOSE. - */ -void tcp_update_metrics(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - struct dst_entry *dst = __sk_dst_get(sk); - - dst_confirm(dst); - - if (dst && (dst->flags&DST_HOST)) { - int m; - - if (tp->backoff || !tp->srtt) { - /* This session failed to estimate rtt. Why? - * Probably, no packets returned in time. - * Reset our results. - */ - if (!(dst->mxlock&(1<<RTAX_RTT))) - dst->rtt = 0; - return; - } - - m = dst->rtt - tp->srtt; - - /* If newly calculated rtt larger than stored one, - * store new one. Otherwise, use EWMA. Remember, - * rtt overestimation is always better than underestimation. - */ - if (!(dst->mxlock&(1<<RTAX_RTT))) { - if (m <= 0) - dst->rtt = tp->srtt; - else - dst->rtt -= (m>>3); - } - - if (!(dst->mxlock&(1<<RTAX_RTTVAR))) { - if (m < 0) - m = -m; - - /* Scale deviation to rttvar fixed point */ - m >>= 1; - if (m < tp->mdev) - m = tp->mdev; - - if (m >= dst->rttvar) - dst->rttvar = m; - else - dst->rttvar -= (dst->rttvar - m)>>2; - } - - if (tp->snd_ssthresh >= 0xFFFF) { - /* Slow start still did not finish. */ - if (dst->ssthresh && - !(dst->mxlock&(1<<RTAX_SSTHRESH)) && - (tp->snd_cwnd>>1) > dst->ssthresh) - dst->ssthresh = (tp->snd_cwnd>>1); - if (!(dst->mxlock&(1<<RTAX_CWND)) && - tp->snd_cwnd > dst->cwnd) - dst->cwnd = tp->snd_cwnd; - } else if (tp->snd_cwnd > tp->snd_ssthresh && - tp->ca_state == TCP_CA_Open) { - /* Cong. avoidance phase, cwnd is reliable. */ - if (!(dst->mxlock&(1<<RTAX_SSTHRESH))) - dst->ssthresh = max(tp->snd_cwnd>>1, tp->snd_ssthresh); - if (!(dst->mxlock&(1<<RTAX_CWND))) - dst->cwnd = (dst->cwnd + tp->snd_cwnd)>>1; - } else { - /* Else slow start did not finish, cwnd is non-sense, - ssthresh may be also invalid. - */ - if (!(dst->mxlock&(1<<RTAX_CWND))) - dst->cwnd = (dst->cwnd + tp->snd_ssthresh)>>1; - if (dst->ssthresh && - !(dst->mxlock&(1<<RTAX_SSTHRESH)) && - tp->snd_ssthresh > dst->ssthresh) - dst->ssthresh = tp->snd_ssthresh; - } - - if (!(dst->mxlock&(1<<RTAX_REORDERING))) { - if (dst->reordering < tp->reordering && - tp->reordering != sysctl_tcp_reordering) - dst->reordering = tp->reordering; - } - } -#endif -} - -/* Increase initial CWND conservatively: if estimated - * RTT is low enough (<20msec) or if we have some preset ssthresh. - * - * Numbers are taken from RFC2414. - */ -__u32 tcp_init_cwnd(struct tcp_opt *tp) -{ -#if 0 - __u32 cwnd; - - if (tp->mss_cache > 1460) - return 2; - - cwnd = (tp->mss_cache > 1095) ? 3 : 4; - - if (!tp->srtt || (tp->snd_ssthresh >= 0xFFFF && tp->srtt > ((HZ/50)<<3))) - cwnd = 2; - else if (cwnd > tp->snd_ssthresh) - cwnd = tp->snd_ssthresh; - - return min_t(__u32, cwnd, tp->snd_cwnd_clamp); -#else - return 0; -#endif -} - -/* Initialize metrics on socket. */ - -static void tcp_init_metrics(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - struct dst_entry *dst = __sk_dst_get(sk); - - if (dst == NULL) - goto reset; - - dst_confirm(dst); - - if (dst->mxlock&(1<<RTAX_CWND)) - tp->snd_cwnd_clamp = dst->cwnd; - if (dst->ssthresh) { - tp->snd_ssthresh = dst->ssthresh; - if (tp->snd_ssthresh > tp->snd_cwnd_clamp) - tp->snd_ssthresh = tp->snd_cwnd_clamp; - } - if (dst->reordering && tp->reordering != dst->reordering) { - tp->sack_ok &= ~2; - tp->reordering = dst->reordering; - } - - if (dst->rtt == 0) - goto reset; - - if (!tp->srtt && dst->rtt < (TCP_TIMEOUT_INIT<<3)) - goto reset; - - /* Initial rtt is determined from SYN,SYN-ACK. - * The segment is small and rtt may appear much - * less than real one. Use per-dst memory - * to make it more realistic. - * - * A bit of theory. RTT is time passed after "normal" sized packet - * is sent until it is ACKed. In normal curcumstances sending small - * packets force peer to delay ACKs and calculation is correct too. - * The algorithm is adaptive and, provided we follow specs, it - * NEVER underestimate RTT. BUT! If peer tries to make some clever - * tricks sort of "quick acks" for time long enough to decrease RTT - * to low value, and then abruptly stops to do it and starts to delay - * ACKs, wait for troubles. - */ - if (dst->rtt > tp->srtt) - tp->srtt = dst->rtt; - if (dst->rttvar > tp->mdev) { - tp->mdev = dst->rttvar; - tp->mdev_max = tp->rttvar = max(tp->mdev, TCP_RTO_MIN); - } - tcp_set_rto(tp); - tcp_bound_rto(tp); - if (tp->rto < TCP_TIMEOUT_INIT && !tp->saw_tstamp) - goto reset; - tp->snd_cwnd = tcp_init_cwnd(tp); - tp->snd_cwnd_stamp = tcp_time_stamp; - return; - -reset: - /* Play conservative. If timestamps are not - * supported, TCP will fail to recalculate correct - * rtt, if initial rto is too small. FORGET ALL AND RESET! - */ - if (!tp->saw_tstamp && tp->srtt) { - tp->srtt = 0; - tp->mdev = tp->mdev_max = tp->rttvar = TCP_TIMEOUT_INIT; - tp->rto = TCP_TIMEOUT_INIT; - } -#endif -} - -static void tcp_update_reordering(struct tcp_opt *tp, int metric, int ts) -{ -#if 0 - if (metric > tp->reordering) { - tp->reordering = min(TCP_MAX_REORDERING, metric); - - /* This exciting event is worth to be remembered. 8) */ - if (ts) - NET_INC_STATS_BH(TCPTSReorder); - else if (IsReno(tp)) - NET_INC_STATS_BH(TCPRenoReorder); - else if (IsFack(tp)) - NET_INC_STATS_BH(TCPFACKReorder); - else - NET_INC_STATS_BH(TCPSACKReorder); -#if FASTRETRANS_DEBUG > 1 - printk(KERN_DEBUG "Disorder%d %d %u f%u s%u rr%d\n", - tp->sack_ok, tp->ca_state, - tp->reordering, tp->fackets_out, tp->sacked_out, - tp->undo_marker ? tp->undo_retrans : 0); -#endif - /* Disable FACK yet. */ - tp->sack_ok &= ~2; - } -#endif -} - -/* This procedure tags the retransmission queue when SACKs arrive. - * - * We have three tag bits: SACKED(S), RETRANS(R) and LOST(L). - * Packets in queue with these bits set are counted in variables - * sacked_out, retrans_out and lost_out, correspondingly. - * - * Valid combinations are: - * Tag InFlight Description - * 0 1 - orig segment is in flight. - * S 0 - nothing flies, orig reached receiver. - * L 0 - nothing flies, orig lost by net. - * R 2 - both orig and retransmit are in flight. - * L|R 1 - orig is lost, retransmit is in flight. - * S|R 1 - orig reached receiver, retrans is still in flight. - * (L|S|R is logically valid, it could occur when L|R is sacked, - * but it is equivalent to plain S and code short-curcuits it to S. - * L|S is logically invalid, it would mean -1 packet in flight 8)) - * - * These 6 states form finite state machine, controlled by the following events: - * 1. New ACK (+SACK) arrives. (tcp_sacktag_write_queue()) - * 2. Retransmission. (tcp_retransmit_skb(), tcp_xmit_retransmit_queue()) - * 3. Loss detection event of one of three flavors: - * A. Scoreboard estimator decided the packet is lost. - * A'. Reno "three dupacks" marks head of queue lost. - * A''. Its FACK modfication, head until snd.fack is lost. - * B. SACK arrives sacking data transmitted after never retransmitted - * hole was sent out. - * C. SACK arrives sacking SND.NXT at the moment, when the - * segment was retransmitted. - * 4. D-SACK added new rule: D-SACK changes any tag to S. - * - * It is pleasant to note, that state diagram turns out to be commutative, - * so that we are allowed not to be bothered by order of our actions, - * when multiple events arrive simultaneously. (see the function below). - * - * Reordering detection. - * -------------------- - * Reordering metric is maximal distance, which a packet can be displaced - * in packet stream. With SACKs we can estimate it: - * - * 1. SACK fills old hole and the corresponding segment was not - * ever retransmitted -> reordering. Alas, we cannot use it - * when segment was retransmitted. - * 2. The last flaw is solved with D-SACK. D-SACK arrives - * for retransmitted and already SACKed segment -> reordering.. - * Both of these heuristics are not used in Loss state, when we cannot - * account for retransmits accurately. - */ -static int -tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_una) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - unsigned char *ptr = ack_skb->h.raw + TCP_SKB_CB(ack_skb)->sacked; - struct tcp_sack_block *sp = (struct tcp_sack_block *)(ptr+2); - int num_sacks = (ptr[1] - TCPOLEN_SACK_BASE)>>3; - int reord = tp->packets_out; - int prior_fackets; - u32 lost_retrans = 0; - int flag = 0; - int i; - - if (!tp->sacked_out) - tp->fackets_out = 0; - prior_fackets = tp->fackets_out; - - for (i=0; i<num_sacks; i++, sp++) { - struct sk_buff *skb; - __u32 start_seq = ntohl(sp->start_seq); - __u32 end_seq = ntohl(sp->end_seq); - int fack_count = 0; - int dup_sack = 0; - - /* Check for D-SACK. */ - if (i == 0) { - u32 ack = TCP_SKB_CB(ack_skb)->ack_seq; - - if (before(start_seq, ack)) { - dup_sack = 1; - tp->sack_ok |= 4; - NET_INC_STATS_BH(TCPDSACKRecv); - } else if (num_sacks > 1 && - !after(end_seq, ntohl(sp[1].end_seq)) && - !before(start_seq, ntohl(sp[1].start_seq))) { - dup_sack = 1; - tp->sack_ok |= 4; - NET_INC_STATS_BH(TCPDSACKOfoRecv); - } - - /* D-SACK for already forgotten data... - * Do dumb counting. */ - if (dup_sack && - !after(end_seq, prior_snd_una) && - after(end_seq, tp->undo_marker)) - tp->undo_retrans--; - - /* Eliminate too old ACKs, but take into - * account more or less fresh ones, they can - * contain valid SACK info. - */ - if (before(ack, prior_snd_una-tp->max_window)) - return 0; - } - - /* Event "B" in the comment above. */ - if (after(end_seq, tp->high_seq)) - flag |= FLAG_DATA_LOST; - - for_retrans_queue(skb, sk, tp) { - u8 sacked = TCP_SKB_CB(skb)->sacked; - int in_sack; - - /* The retransmission queue is always in order, so - * we can short-circuit the walk early. - */ - if(!before(TCP_SKB_CB(skb)->seq, end_seq)) - break; - - fack_count++; - - in_sack = !after(start_seq, TCP_SKB_CB(skb)->seq) && - !before(end_seq, TCP_SKB_CB(skb)->end_seq); - - /* Account D-SACK for retransmitted packet. */ - if ((dup_sack && in_sack) && - (sacked & TCPCB_RETRANS) && - after(TCP_SKB_CB(skb)->end_seq, tp->undo_marker)) - tp->undo_retrans--; - - /* The frame is ACKed. */ - if (!after(TCP_SKB_CB(skb)->end_seq, tp->snd_una)) { - if (sacked&TCPCB_RETRANS) { - if ((dup_sack && in_sack) && - (sacked&TCPCB_SACKED_ACKED)) - reord = min(fack_count, reord); - } else { - /* If it was in a hole, we detected reordering. */ - if (fack_count < prior_fackets && - !(sacked&TCPCB_SACKED_ACKED)) - reord = min(fack_count, reord); - } - - /* Nothing to do; acked frame is about to be dropped. */ - continue; - } - - if ((sacked&TCPCB_SACKED_RETRANS) && - after(end_seq, TCP_SKB_CB(skb)->ack_seq) && - (!lost_retrans || after(end_seq, lost_retrans))) - lost_retrans = end_seq; - - if (!in_sack) - continue; - - if (!(sacked&TCPCB_SACKED_ACKED)) { - if (sacked & TCPCB_SACKED_RETRANS) { - /* If the segment is not tagged as lost, - * we do not clear RETRANS, believing - * that retransmission is still in flight. - */ - if (sacked & TCPCB_LOST) { - TCP_SKB_CB(skb)->sacked &= ~(TCPCB_LOST|TCPCB_SACKED_RETRANS); - tp->lost_out--; - tp->retrans_out--; - } - } else { - /* New sack for not retransmitted frame, - * which was in hole. It is reordering. - */ - if (!(sacked & TCPCB_RETRANS) && - fack_count < prior_fackets) - reord = min(fack_count, reord); - - if (sacked & TCPCB_LOST) { - TCP_SKB_CB(skb)->sacked &= ~TCPCB_LOST; - tp->lost_out--; - } - } - - TCP_SKB_CB(skb)->sacked |= TCPCB_SACKED_ACKED; - flag |= FLAG_DATA_SACKED; - tp->sacked_out++; - - if (fack_count > tp->fackets_out) - tp->fackets_out = fack_count; - } else { - if (dup_sack && (sacked&TCPCB_RETRANS)) - reord = min(fack_count, reord); - } - - /* D-SACK. We can detect redundant retransmission - * in S|R and plain R frames and clear it. - * undo_retrans is decreased above, L|R frames - * are accounted above as well. - */ - if (dup_sack && - (TCP_SKB_CB(skb)->sacked&TCPCB_SACKED_RETRANS)) { - TCP_SKB_CB(skb)->sacked &= ~TCPCB_SACKED_RETRANS; - tp->retrans_out--; - } - } - } - - /* Check for lost retransmit. This superb idea is - * borrowed from "ratehalving". Event "C". - * Later note: FACK people cheated me again 8), - * we have to account for reordering! Ugly, - * but should help. - */ - if (lost_retrans && tp->ca_state == TCP_CA_Recovery) { - struct sk_buff *skb; - - for_retrans_queue(skb, sk, tp) { - if (after(TCP_SKB_CB(skb)->seq, lost_retrans)) - break; - if (!after(TCP_SKB_CB(skb)->end_seq, tp->snd_una)) - continue; - if ((TCP_SKB_CB(skb)->sacked&TCPCB_SACKED_RETRANS) && - after(lost_retrans, TCP_SKB_CB(skb)->ack_seq) && - (IsFack(tp) || - !before(lost_retrans, TCP_SKB_CB(skb)->ack_seq+tp->reordering*tp->mss_cache))) { - TCP_SKB_CB(skb)->sacked &= ~TCPCB_SACKED_RETRANS; - tp->retrans_out--; - - if (!(TCP_SKB_CB(skb)->sacked&(TCPCB_LOST|TCPCB_SACKED_ACKED))) { - tp->lost_out++; - TCP_SKB_CB(skb)->sacked |= TCPCB_LOST; - flag |= FLAG_DATA_SACKED; - NET_INC_STATS_BH(TCPLostRetransmit); - } - } - } - } - - tp->left_out = tp->sacked_out + tp->lost_out; - - if (reord < tp->fackets_out && tp->ca_state != TCP_CA_Loss) - tcp_update_reordering(tp, (tp->fackets_out+1)-reord, 0); - -#if FASTRETRANS_DEBUG > 0 - BUG_TRAP((int)tp->sacked_out >= 0); - BUG_TRAP((int)tp->lost_out >= 0); - BUG_TRAP((int)tp->retrans_out >= 0); - BUG_TRAP((int)tcp_packets_in_flight(tp) >= 0); -#endif - return flag; -#else - return 0; -#endif -} - -void tcp_clear_retrans(struct tcp_opt *tp) -{ -#if 0 - tp->left_out = 0; - tp->retrans_out = 0; - - tp->fackets_out = 0; - tp->sacked_out = 0; - tp->lost_out = 0; - - tp->undo_marker = 0; - tp->undo_retrans = 0; -#endif -} - -/* Enter Loss state. If "how" is not zero, forget all SACK information - * and reset tags completely, otherwise preserve SACKs. If receiver - * dropped its ofo queue, we will know this due to reneging detection. - */ -void tcp_enter_loss(struct sock *sk, int how) -{ -#if 0 - struct tcp_opt *tp = &sk->tp_pinfo.af_tcp; - struct sk_buff *skb; - int cnt = 0; - - /* Reduce ssthresh if it has not yet been made inside this window. */ - if (tp->ca_state <= TCP_CA_Disorder || - tp->snd_una == tp->high_seq || - (tp->ca_state == TCP_CA_Loss && !tp->retransmits)) { - tp->prior_ssthresh = tcp_current_ssthresh(tp); - tp->snd_ssthresh = tcp_recalc_ssthresh(tp); - } - tp->snd_cwnd = 1; - tp->snd_cwnd_cnt = 0; - tp->snd_cwnd_stamp = tcp_time_stamp; - - tcp_clear_retrans(tp); - - /* Push undo marker, if it was plain RTO and nothing - * was retransmitted. */ - if (!how) - tp->undo_marker = tp->snd_una; - - for_retrans_queue(skb, sk, tp) { - cnt++; - if (TCP_SKB_CB(skb)->sacked&TCPCB_RETRANS) - tp->undo_marker = 0; - TCP_SKB_CB(skb)->sacked &= (~TCPCB_TAGBITS)|TCPCB_SACKED_ACKED; - if (!(TCP_SKB_CB(skb)->sacked&TCPCB_SACKED_ACKED) || how) { - TCP_SKB_CB(skb)->sacked &= ~TCPCB_SACKED_ACKED; - TCP_SKB_CB(skb)->sacked |= TCPCB_LOST; - tp->lost_out++; - } else { - tp->sacked_out++; - tp->fackets_out = cnt; - } - } - tcp_sync_left_out(tp); - - tp->reordering = min_t(unsigned int, tp->reordering, sysctl_tcp_reordering); - tp->ca_state = TCP_CA_Loss; - tp->high_seq = tp->snd_nxt; - TCP_ECN_queue_cwr(tp); -#endif -} - -static int tcp_check_sack_reneging(struct sock *sk, struct tcp_opt *tp) -{ -#if 0 - struct sk_buff *skb; - - /* If ACK arrived pointing to a remembered SACK, - * it means that our remembered SACKs do not reflect - * real state of receiver i.e. - * receiver _host_ is heavily congested (or buggy). - * Do processing similar to RTO timeout. - */ - if ((skb = skb_peek(&sk->write_queue)) != NULL && - (TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_ACKED)) { - NET_INC_STATS_BH(TCPSACKReneging); - - tcp_enter_loss(sk, 1); - tp->retransmits++; - tcp_retransmit_skb(sk, skb_peek(&sk->write_queue)); - tcp_reset_xmit_timer(sk, TCP_TIME_RETRANS, tp->rto); - return 1; - } - return 0; -#else - return 0; -#endif -} - -static inline int tcp_fackets_out(struct tcp_opt *tp) -{ -#if 0 - return IsReno(tp) ? tp->sacked_out+1 : tp->fackets_out; -#else - return 0; -#endif -} - -static inline int tcp_skb_timedout(struct tcp_opt *tp, struct sk_buff *skb) -{ -#if 0 - return (tcp_time_stamp - TCP_SKB_CB(skb)->when > tp->rto); -#else - return 0; -#endif -} - -static inline int tcp_head_timedout(struct sock *sk, struct tcp_opt *tp) -{ -#if 0 - return tp->packets_out && tcp_skb_timedout(tp, skb_peek(&sk->write_queue)); -#else - return 0; -#endif -} - -/* Linux NewReno/SACK/FACK/ECN state machine. - * -------------------------------------- - * - * "Open" Normal state, no dubious events, fast path. - * "Disorder" In all the respects it is "Open", - * but requires a bit more attention. It is entered when - * we see some SACKs or dupacks. It is split of "Open" - * mainly to move some processing from fast path to slow one. - * "CWR" CWND was reduced due to some Congestion Notification event. - * It can be ECN, ICMP source quench, local device congestion. - * "Recovery" CWND was reduced, we are fast-retransmitting. - * "Loss" CWND was reduced due to RTO timeout or SACK reneging. - * - * tcp_fastretrans_alert() is entered: - * - each incoming ACK, if state is not "Open" - * - when arrived ACK is unusual, namely: - * * SACK - * * Duplicate ACK. - * * ECN ECE. - * - * Counting packets in flight is pretty simple. - * - * in_flight = packets_out - left_out + retrans_out - * - * packets_out is SND.NXT-SND.UNA counted in packets. - * - * retrans_out is number of retransmitted segments. - * - * left_out is number of segments left network, but not ACKed yet. - * - * left_out = sacked_out + lost_out - * - * sacked_out: Packets, which arrived to receiver out of order - * and hence not ACKed. With SACKs this number is simply - * amount of SACKed data. Even without SACKs - * it is easy to give pretty reliable estimate of this number, - * counting duplicate ACKs. - * - * lost_out: Packets lost by network. TCP has no explicit - * "loss notification" feedback from network (for now). - * It means that this number can be only _guessed_. - * Actually, it is the heuristics to predict lossage that - * distinguishes different algorithms. - * - * F.e. after RTO, when all the queue is considered as lost, - * lost_out = packets_out and in_flight = retrans_out. - * - * Essentially, we have now two algorithms counting - * lost packets. - * - * FACK: It is the simplest heuristics. As soon as we decided - * that something is lost, we decide that _all_ not SACKed - * packets until the most forward SACK are lost. I.e. - * lost_out = fackets_out - sacked_out and left_out = fackets_out. - * It is absolutely correct estimate, if network does not reorder - * packets. And it loses any connection to reality when reordering - * takes place. We use FACK by default until reordering - * is suspected on the path to this destination. - * - * NewReno: when Recovery is entered, we assume that one segment - * is lost (classic Reno). While we are in Recovery and - * a partial ACK arrives, we assume that one more packet - * is lost (NewReno). This heuristics are the same in NewReno - * and SACK. - * - * Imagine, that's all! Forget about all this shamanism about CWND inflation - * deflation etc. CWND is real congestion window, never inflated, changes - * only according to classic VJ rules. - * - * Really tricky (and requiring careful tuning) part of algorithm - * is hidden in functions tcp_time_to_recover() and tcp_xmit_retransmit_queue(). - * The first determines the moment _when_ we should reduce CWND and, - * hence, slow down forward transmission. In fact, it determines the moment - * when we decide that hole is caused by loss, rather than by a reorder. - * - * tcp_xmit_retransmit_queue() decides, _what_ we should retransmit to fill - * holes, caused by lost packets. - * - * And the most logically complicated part of algorithm is undo - * heuristics. We detect false retransmits due to both too early - * fast retransmit (reordering) and underestimated RTO, analyzing - * timestamps and D-SACKs. When we detect that some segments were - * retransmitted by mistake and CWND reduction was wrong, we undo - * window reduction and abort recovery phase. This logic is hidden - * inside several functions named tcp_try_undo_<something>. - */ - -/* This function decides, when we should leave Disordered state - * and enter Recovery phase, reducing congestion window. - * - * Main question: may we further continue forward transmission - * with the same cwnd? - */ -static int -tcp_time_to_recover(struct sock *sk, struct tcp_opt *tp) -{ -#if 0 - /* Trick#1: The loss is proven. */ - if (tp->lost_out) - return 1; - - /* Not-A-Trick#2 : Classic rule... */ - if (tcp_fackets_out(tp) > tp->reordering) - return 1; - - /* Trick#3 : when we use RFC2988 timer restart, fast - * retransmit can be triggered by timeout of queue head. - */ - if (tcp_head_timedout(sk, tp)) - return 1; - - /* Trick#4: It is still not OK... But will it be useful to delay - * recovery more? - */ - if (tp->packets_out <= tp->reordering && - tp->sacked_out >= max_t(__u32, tp->packets_out/2, sysctl_tcp_reordering) && - !tcp_may_send_now(sk, tp)) { - /* We have nothing to send. This connection is limited - * either by receiver window or by application. - */ - return 1; - } - - return 0; -#else - return 0; -#endif -} - -/* If we receive more dupacks than we expected counting segments - * in assumption of absent reordering, interpret this as reordering. - * The only another reason could be bug in receiver TCP. - */ -static void tcp_check_reno_reordering(struct tcp_opt *tp, int addend) -{ -#if 0 - u32 holes; - - holes = max(tp->lost_out, 1U); - holes = min(holes, tp->packets_out); - - if (tp->sacked_out + holes > tp->packets_out) { - tp->sacked_out = tp->packets_out - holes; - tcp_update_reordering(tp, tp->packets_out+addend, 0); - } -#endif -} - -/* Emulate SACKs for SACKless connection: account for a new dupack. */ - -static void tcp_add_reno_sack(struct tcp_opt *tp) -{ -#if 0 - ++tp->sacked_out; - tcp_check_reno_reordering(tp, 0); - tcp_sync_left_out(tp); -#endif -} - -/* Account for ACK, ACKing some data in Reno Recovery phase. */ - -static void tcp_remove_reno_sacks(struct sock *sk, struct tcp_opt *tp, int acked) -{ -#if 0 - if (acked > 0) { - /* One ACK acked hole. The rest eat duplicate ACKs. */ - if (acked-1 >= tp->sacked_out) - tp->sacked_out = 0; - else - tp->sacked_out -= acked-1; - } - tcp_check_reno_reordering(tp, acked); - tcp_sync_left_out(tp); -#endif -} - -static inline void tcp_reset_reno_sack(struct tcp_opt *tp) -{ -#if 0 - tp->sacked_out = 0; - tp->left_out = tp->lost_out; -#endif -} - -/* Mark head of queue up as lost. */ -static void -tcp_mark_head_lost(struct sock *sk, struct tcp_opt *tp, int packets, u32 high_seq) -{ -#if 0 - struct sk_buff *skb; - int cnt = packets; - - BUG_TRAP(cnt <= tp->packets_out); - - for_retrans_queue(skb, sk, tp) { - if (--cnt < 0 || after(TCP_SKB_CB(skb)->end_seq, high_seq)) - break; - if (!(TCP_SKB_CB(skb)->sacked&TCPCB_TAGBITS)) { - TCP_SKB_CB(skb)->sacked |= TCPCB_LOST; - tp->lost_out++; - } - } - tcp_sync_left_out(tp); -#endif -} - -/* Account newly detected lost packet(s) */ - -static void tcp_update_scoreboard(struct sock *sk, struct tcp_opt *tp) -{ -#if 0 - if (IsFack(tp)) { - int lost = tp->fackets_out - tp->reordering; - if (lost <= 0) - lost = 1; - tcp_mark_head_lost(sk, tp, lost, tp->high_seq); - } else { - tcp_mark_head_lost(sk, tp, 1, tp->high_seq); - } - - /* New heuristics: it is possible only after we switched - * to restart timer each time when something is ACKed. - * Hence, we can detect timed out packets during fast - * retransmit without falling to slow start. - */ - if (tcp_head_timedout(sk, tp)) { - struct sk_buff *skb; - - for_retrans_queue(skb, sk, tp) { - if (tcp_skb_timedout(tp, skb) && - !(TCP_SKB_CB(skb)->sacked&TCPCB_TAGBITS)) { - TCP_SKB_CB(skb)->sacked |= TCPCB_LOST; - tp->lost_out++; - } - } - tcp_sync_left_out(tp); - } -#endif -} - -/* CWND moderation, preventing bursts due to too big ACKs - * in dubious situations. - */ -static __inline__ void tcp_moderate_cwnd(struct tcp_opt *tp) -{ -#if 0 - tp->snd_cwnd = min(tp->snd_cwnd, - tcp_packets_in_flight(tp)+tcp_max_burst(tp)); - tp->snd_cwnd_stamp = tcp_time_stamp; -#endif -} - -/* Decrease cwnd each second ack. */ - -static void tcp_cwnd_down(struct tcp_opt *tp) -{ -#if 0 - int decr = tp->snd_cwnd_cnt + 1; - - tp->snd_cwnd_cnt = decr&1; - decr >>= 1; - - if (decr && tp->snd_cwnd > tp->snd_ssthresh/2) - tp->snd_cwnd -= decr; - - tp->snd_cwnd = min(tp->snd_cwnd, tcp_packets_in_flight(tp)+1); - tp->snd_cwnd_stamp = tcp_time_stamp; -#endif -} - -/* Nothing was retransmitted or returned timestamp is less - * than timestamp of the first retransmission. - */ -static __inline__ int tcp_packet_delayed(struct tcp_opt *tp) -{ -#if 0 - return !tp->retrans_stamp || - (tp->saw_tstamp && tp->rcv_tsecr && - (__s32)(tp->rcv_tsecr - tp->retrans_stamp) < 0); -#else - return 0; -#endif -} - -/* Undo procedures. */ - -#if FASTRETRANS_DEBUG > 1 -static void DBGUNDO(struct sock *sk, struct tcp_opt *tp, const char *msg) -{ -#if 0 - printk(KERN_DEBUG "Undo %s %u.%u.%u.%u/%u c%u l%u ss%u/%u p%u\n", - msg, - NIPQUAD(sk->daddr), ntohs(sk->dport), - tp->snd_cwnd, tp->left_out, - tp->snd_ssthresh, tp->prior_ssthresh, tp->packets_out); -#endif -} -#else -#define DBGUNDO(x...) do { } while (0) -#endif - -static void tcp_undo_cwr(struct tcp_opt *tp, int undo) -{ -#if 0 - if (tp->prior_ssthresh) { - tp->snd_cwnd = max(tp->snd_cwnd, tp->snd_ssthresh<<1); - - if (undo && tp->prior_ssthresh > tp->snd_ssthresh) { - tp->snd_ssthresh = tp->prior_ssthresh; - TCP_ECN_withdraw_cwr(tp); - } - } else { - tp->snd_cwnd = max(tp->snd_cwnd, tp->snd_ssthresh); - } - tcp_moderate_cwnd(tp); - tp->snd_cwnd_stamp = tcp_time_stamp; -#endif -} - -static inline int tcp_may_undo(struct tcp_opt *tp) -{ -#if 0 - return tp->undo_marker && - (!tp->undo_retrans || tcp_packet_delayed(tp)); -#else - return 0; -#endif -} - -/* People celebrate: "We love our President!" */ -static int tcp_try_undo_recovery(struct sock *sk, struct tcp_opt *tp) -{ -#if 0 - if (tcp_may_undo(tp)) { - /* Happy end! We did not retransmit anything - * or our original transmission succeeded. - */ - DBGUNDO(sk, tp, tp->ca_state == TCP_CA_Loss ? "loss" : "retrans"); - tcp_undo_cwr(tp, 1); - if (tp->ca_state == TCP_CA_Loss) - NET_INC_STATS_BH(TCPLossUndo); - else - NET_INC_STATS_BH(TCPFullUndo); - tp->undo_marker = 0; - } - if (tp->snd_una == tp->high_seq && IsReno(tp)) { - /* Hold old state until something *above* high_seq - * is ACKed. For Reno it is MUST to prevent false - * fast retransmits (RFC2582). SACK TCP is safe. */ - tcp_moderate_cwnd(tp); - return 1; - } - tp->ca_state = TCP_CA_Open; - return 0; -#else - return 0; -#endif -} - -/* Try to undo cwnd reduction, because D-SACKs acked all retransmitted data */ -static void tcp_try_undo_dsack(struct sock *sk, struct tcp_opt *tp) -{ -#if 0 - if (tp->undo_marker && !tp->undo_retrans) { - DBGUNDO(sk, tp, "D-SACK"); - tcp_undo_cwr(tp, 1); - tp->undo_marker = 0; - NET_INC_STATS_BH(TCPDSACKUndo); - } -#endif -} - -/* Undo during fast recovery after partial ACK. */ - -static int tcp_try_undo_partial(struct sock *sk, struct tcp_opt *tp, int acked) -{ -#if 0 - /* Partial ACK arrived. Force Hoe's retransmit. */ - int failed = IsReno(tp) || tp->fackets_out>tp->reordering; - - if (tcp_may_undo(tp)) { - /* Plain luck! Hole if filled with delayed - * packet, rather than with a retransmit. - */ - if (tp->retrans_out == 0) - tp->retrans_stamp = 0; - - tcp_update_reordering(tp, tcp_fackets_out(tp)+acked, 1); - - DBGUNDO(sk, tp, "Hoe"); - tcp_undo_cwr(tp, 0); - NET_INC_STATS_BH(TCPPartialUndo); - - /* So... Do not make Hoe's retransmit yet. - * If the first packet was delayed, the rest - * ones are most probably delayed as well. - */ - failed = 0; - } - return failed; -#else - return 0; -#endif -} - -/* Undo during loss recovery after partial ACK. */ -static int tcp_try_undo_loss(struct sock *sk, struct tcp_opt *tp) -{ -#if 0 - if (tcp_may_undo(tp)) { - struct sk_buff *skb; - for_retrans_queue(skb, sk, tp) { - TCP_SKB_CB(skb)->sacked &= ~TCPCB_LOST; - } - DBGUNDO(sk, tp, "partial loss"); - tp->lost_out = 0; - tp->left_out = tp->sacked_out; - tcp_undo_cwr(tp, 1); - NET_INC_STATS_BH(TCPLossUndo); - tp->retransmits = 0; - tp->undo_marker = 0; - if (!IsReno(tp)) - tp->ca_state = TCP_CA_Open; - return 1; - } - return 0; -#else - return 0; -#endif -} - -static __inline__ void tcp_complete_cwr(struct tcp_opt *tp) -{ -#if 0 - tp->snd_cwnd = min(tp->snd_cwnd, tp->snd_ssthresh); - tp->snd_cwnd_stamp = tcp_time_stamp; -#endif -} - -static void tcp_try_to_open(struct sock *sk, struct tcp_opt *tp, int flag) -{ -#if 0 - tp->left_out = tp->sacked_out; - - if (tp->retrans_out == 0) - tp->retrans_stamp = 0; - - if (flag&FLAG_ECE) - tcp_enter_cwr(tp); - - if (tp->ca_state != TCP_CA_CWR) { - int state = TCP_CA_Open; - - if (tp->left_out || - tp->retrans_out || - tp->undo_marker) - state = TCP_CA_Disorder; - - if (tp->ca_state != state) { - tp->ca_state = state; - tp->high_seq = tp->snd_nxt; - } - tcp_moderate_cwnd(tp); - } else { - tcp_cwnd_down(tp); - } -#endif -} - -/* Process an event, which can update packets-in-flight not trivially. - * Main goal of this function is to calculate new estimate for left_out, - * taking into account both packets sitting in receiver's buffer and - * packets lost by network. - * - * Besides that it does CWND reduction, when packet loss is detected - * and changes state of machine. - * - * It does _not_ decide what to send, it is made in function - * tcp_xmit_retransmit_queue(). - */ -static void -tcp_fastretrans_alert(struct sock *sk, u32 prior_snd_una, - int prior_packets, int flag) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - int is_dupack = (tp->snd_una == prior_snd_una && !(flag&FLAG_NOT_DUP)); - - /* Some technical things: - * 1. Reno does not count dupacks (sacked_out) automatically. */ - if (!tp->packets_out) - tp->sacked_out = 0; - /* 2. SACK counts snd_fack in packets inaccurately. */ - if (tp->sacked_out == 0) - tp->fackets_out = 0; - - /* Now state machine starts. - * A. ECE, hence prohibit cwnd undoing, the reduction is required. */ - if (flag&FLAG_ECE) - tp->prior_ssthresh = 0; - - /* B. In all the states check for reneging SACKs. */ - if (tp->sacked_out && tcp_check_sack_reneging(sk, tp)) - return; - - /* C. Process data loss notification, provided it is valid. */ - if ((flag&FLAG_DATA_LOST) && - before(tp->snd_una, tp->high_seq) && - tp->ca_state != TCP_CA_Open && - tp->fackets_out > tp->reordering) { - tcp_mark_head_lost(sk, tp, tp->fackets_out-tp->reordering, tp->high_seq); - NET_INC_STATS_BH(TCPLoss); - } - - /* D. Synchronize left_out to current state. */ - tcp_sync_left_out(tp); - - /* E. Check state exit conditions. State can be terminated - * when high_seq is ACKed. */ - if (tp->ca_state == TCP_CA_Open) { - BUG_TRAP(tp->retrans_out == 0); - tp->retrans_stamp = 0; - } else if (!before(tp->snd_una, tp->high_seq)) { - switch (tp->ca_state) { - case TCP_CA_Loss: - tp->retransmits = 0; - if (tcp_try_undo_recovery(sk, tp)) - return; - break; - - case TCP_CA_CWR: - /* CWR is to be held something *above* high_seq - * is ACKed for CWR bit to reach receiver. */ - if (tp->snd_una != tp->high_seq) { - tcp_complete_cwr(tp); - tp->ca_state = TCP_CA_Open; - } - break; - - case TCP_CA_Disorder: - tcp_try_undo_dsack(sk, tp); - if (!tp->undo_marker || - /* For SACK case do not Open to allow to undo - * catching for all duplicate ACKs. */ - IsReno(tp) || tp->snd_una != tp->high_seq) { - tp->undo_marker = 0; - tp->ca_state = TCP_CA_Open; - } - break; - - case TCP_CA_Recovery: - if (IsReno(tp)) - tcp_reset_reno_sack(tp); - if (tcp_try_undo_recovery(sk, tp)) - return; - tcp_complete_cwr(tp); - break; - } - } - - /* F. Process state. */ - switch (tp->ca_state) { - case TCP_CA_Recovery: - if (prior_snd_una == tp->snd_una) { - if (IsReno(tp) && is_dupack) - tcp_add_reno_sack(tp); - } else { - int acked = prior_packets - tp->packets_out; - if (IsReno(tp)) - tcp_remove_reno_sacks(sk, tp, acked); - is_dupack = tcp_try_undo_partial(sk, tp, acked); - } - break; - case TCP_CA_Loss: - if (flag&FLAG_DATA_ACKED) - tp->retransmits = 0; - if (!tcp_try_undo_loss(sk, tp)) { - tcp_moderate_cwnd(tp); - tcp_xmit_retransmit_queue(sk); - return; - } - if (tp->ca_state != TCP_CA_Open) - return; - /* Loss is undone; fall through to processing in Open state. */ - default: - if (IsReno(tp)) { - if (tp->snd_una != prior_snd_una) - tcp_reset_reno_sack(tp); - if (is_dupack) - tcp_add_reno_sack(tp); - } - - if (tp->ca_state == TCP_CA_Disorder) - tcp_try_undo_dsack(sk, tp); - - if (!tcp_time_to_recover(sk, tp)) { - tcp_try_to_open(sk, tp, flag); - return; - } - - /* Otherwise enter Recovery state */ - - if (IsReno(tp)) - NET_INC_STATS_BH(TCPRenoRecovery); - else - NET_INC_STATS_BH(TCPSackRecovery); - - tp->high_seq = tp->snd_nxt; - tp->prior_ssthresh = 0; - tp->undo_marker = tp->snd_una; - tp->undo_retrans = tp->retrans_out; - - if (tp->ca_state < TCP_CA_CWR) { - if (!(flag&FLAG_ECE)) - tp->prior_ssthresh = tcp_current_ssthresh(tp); - tp->snd_ssthresh = tcp_recalc_ssthresh(tp); - TCP_ECN_queue_cwr(tp); - } - - tp->snd_cwnd_cnt = 0; - tp->ca_state = TCP_CA_Recovery; - } - - if (is_dupack || tcp_head_timedout(sk, tp)) - tcp_update_scoreboard(sk, tp); - tcp_cwnd_down(tp); - tcp_xmit_retransmit_queue(sk); -#endif -} - -/* Read draft-ietf-tcplw-high-performance before mucking - * with this code. (Superceeds RFC1323) - */ -static void tcp_ack_saw_tstamp(struct tcp_opt *tp, int flag) -{ -#if 0 - __u32 seq_rtt; - - /* RTTM Rule: A TSecr value received in a segment is used to - * update the averaged RTT measurement only if the segment - * acknowledges some new data, i.e., only if it advances the - * left edge of the send window. - * - * See draft-ietf-tcplw-high-performance-00, section 3.3. - * 1998/04/10 Andrey V. Savochkin <saw@msu.ru> - * - * Changed: reset backoff as soon as we see the first valid sample. - * If we do not, we get strongly overstimated rto. With timestamps - * samples are accepted even from very old segments: f.e., when rtt=1 - * increases to 8, we retransmit 5 times and after 8 seconds delayed - * answer arrives rto becomes 120 seconds! If at least one of segments - * in window is lost... Voila. --ANK (010210) - */ - seq_rtt = tcp_time_stamp - tp->rcv_tsecr; - tcp_rtt_estimator(tp, seq_rtt); - tcp_set_rto(tp); - tp->backoff = 0; - tcp_bound_rto(tp); -#endif -} - -static void tcp_ack_no_tstamp(struct tcp_opt *tp, u32 seq_rtt, int flag) -{ -#if 0 - /* We don't have a timestamp. Can only use - * packets that are not retransmitted to determine - * rtt estimates. Also, we must not reset the - * backoff for rto until we get a non-retransmitted - * packet. This allows us to deal with a situation - * where the network delay has increased suddenly. - * I.e. Karn's algorithm. (SIGCOMM '87, p5.) - */ - - if (flag & FLAG_RETRANS_DATA_ACKED) - return; - - tcp_rtt_estimator(tp, seq_rtt); - tcp_set_rto(tp); - tp->backoff = 0; - tcp_bound_rto(tp); -#endif -} - -static __inline__ void -tcp_ack_update_rtt(struct tcp_opt *tp, int flag, s32 seq_rtt) -{ -#if 0 - /* Note that peer MAY send zero echo. In this case it is ignored. (rfc1323) */ - if (tp->saw_tstamp && tp->rcv_tsecr) - tcp_ack_saw_tstamp(tp, flag); - else if (seq_rtt >= 0) - tcp_ack_no_tstamp(tp, seq_rtt, flag); -#endif -} - -/* This is Jacobson's slow start and congestion avoidance. - * SIGCOMM '88, p. 328. - */ -static __inline__ void tcp_cong_avoid(struct tcp_opt *tp) -{ -#if 0 - if (tp->snd_cwnd <= tp->snd_ssthresh) { - /* In "safe" area, increase. */ - if (tp->snd_cwnd < tp->snd_cwnd_clamp) - tp->snd_cwnd++; - } else { - /* In dangerous area, increase slowly. - * In theory this is tp->snd_cwnd += 1 / tp->snd_cwnd - */ - if (tp->snd_cwnd_cnt >= tp->snd_cwnd) { - if (tp->snd_cwnd < tp->snd_cwnd_clamp) - tp->snd_cwnd++; - tp->snd_cwnd_cnt=0; - } else - tp->snd_cwnd_cnt++; - } - tp->snd_cwnd_stamp = tcp_time_stamp; -#endif -} - -/* Restart timer after forward progress on connection. - * RFC2988 recommends to restart timer to now+rto. - */ - -static __inline__ void tcp_ack_packets_out(struct sock *sk, struct tcp_opt *tp) -{ -#if 0 - if (tp->packets_out==0) { - tcp_clear_xmit_timer(sk, TCP_TIME_RETRANS); - } else { - tcp_reset_xmit_timer(sk, TCP_TIME_RETRANS, tp->rto); - } -#endif -} - -/* Remove acknowledged frames from the retransmission queue. */ -static int tcp_clean_rtx_queue(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - struct sk_buff *skb; - __u32 now = tcp_time_stamp; - int acked = 0; - __s32 seq_rtt = -1; - - while((skb=skb_peek(&sk->write_queue)) && (skb != tp->send_head)) { - struct tcp_skb_cb *scb = TCP_SKB_CB(skb); - __u8 sacked = scb->sacked; - - /* If our packet is before the ack sequence we can - * discard it as it's confirmed to have arrived at - * the other end. - */ - if (after(scb->end_seq, tp->snd_una)) - break; - - /* Initial outgoing SYN's get put onto the write_queue - * just like anything else we transmit. It is not - * true data, and if we misinform our callers that - * this ACK acks real data, we will erroneously exit - * connection startup slow start one packet too - * quickly. This is severely frowned upon behavior. - */ - if(!(scb->flags & TCPCB_FLAG_SYN)) { - acked |= FLAG_DATA_ACKED; - } else { - acked |= FLAG_SYN_ACKED; - tp->retrans_stamp = 0; - } - - if (sacked) { - if(sacked & TCPCB_RETRANS) { - if(sacked & TCPCB_SACKED_RETRANS) - tp->retrans_out--; - acked |= FLAG_RETRANS_DATA_ACKED; - seq_rtt = -1; - } else if (seq_rtt < 0) - seq_rtt = now - scb->when; - if(sacked & TCPCB_SACKED_ACKED) - tp->sacked_out--; - if(sacked & TCPCB_LOST) - tp->lost_out--; - if(sacked & TCPCB_URG) { - if (tp->urg_mode && - !before(scb->end_seq, tp->snd_up)) - tp->urg_mode = 0; - } - } else if (seq_rtt < 0) - seq_rtt = now - scb->when; - if(tp->fackets_out) - tp->fackets_out--; - tp->packets_out--; - __skb_unlink(skb, skb->list); - tcp_free_skb(sk, skb); - } - - if (acked&FLAG_ACKED) { - tcp_ack_update_rtt(tp, acked, seq_rtt); - tcp_ack_packets_out(sk, tp); - } - -#if FASTRETRANS_DEBUG > 0 - BUG_TRAP((int)tp->sacked_out >= 0); - BUG_TRAP((int)tp->lost_out >= 0); - BUG_TRAP((int)tp->retrans_out >= 0); - if (tp->packets_out==0 && tp->sack_ok) { - if (tp->lost_out) { - printk(KERN_DEBUG "Leak l=%u %d\n", tp->lost_out, tp->ca_state); - tp->lost_out = 0; - } - if (tp->sacked_out) { - printk(KERN_DEBUG "Leak s=%u %d\n", tp->sacked_out, tp->ca_state); - tp->sacked_out = 0; - } - if (tp->retrans_out) { - printk(KERN_DEBUG "Leak r=%u %d\n", tp->retrans_out, tp->ca_state); - tp->retrans_out = 0; - } - } -#endif - return acked; -#else - return 0; -#endif -} - -static void tcp_ack_probe(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - - /* Was it a usable window open? */ - - if (!after(TCP_SKB_CB(tp->send_head)->end_seq, tp->snd_una + tp->snd_wnd)) { - tp->backoff = 0; - tcp_clear_xmit_timer(sk, TCP_TIME_PROBE0); - /* Socket must be waked up by subsequent tcp_data_snd_check(). - * This function is not for random using! - */ - } else { - tcp_reset_xmit_timer(sk, TCP_TIME_PROBE0, - min(tp->rto << tp->backoff, TCP_RTO_MAX)); - } -#endif -} - -static __inline__ int tcp_ack_is_dubious(struct tcp_opt *tp, int flag) -{ -#if 0 - return (!(flag & FLAG_NOT_DUP) || (flag & FLAG_CA_ALERT) || - tp->ca_state != TCP_CA_Open); -#else - return 0; -#endif -} - -static __inline__ int tcp_may_raise_cwnd(struct tcp_opt *tp, int flag) -{ -#if 0 - return (!(flag & FLAG_ECE) || tp->snd_cwnd < tp->snd_ssthresh) && - !((1<<tp->ca_state)&(TCPF_CA_Recovery|TCPF_CA_CWR)); -#else - return 0; -#endif -} - -/* Check that window update is acceptable. - * The function assumes that snd_una<=ack<=snd_next. - */ -static __inline__ int -tcp_may_update_window(struct tcp_opt *tp, u32 ack, u32 ack_seq, u32 nwin) -{ -#if 0 - return (after(ack, tp->snd_una) || - after(ack_seq, tp->snd_wl1) || - (ack_seq == tp->snd_wl1 && nwin > tp->snd_wnd)); -#else - return 0; -#endif -} - -/* Update our send window. - * - * Window update algorithm, described in RFC793/RFC1122 (used in linux-2.2 - * and in FreeBSD. NetBSD's one is even worse.) is wrong. - */ -static int tcp_ack_update_window(struct sock *sk, struct tcp_opt *tp, - struct sk_buff *skb, u32 ack, u32 ack_seq) -{ -#if 0 - int flag = 0; - u32 nwin = ntohs(skb->h.th->window) << tp->snd_wscale; - - if (tcp_may_update_window(tp, ack, ack_seq, nwin)) { - flag |= FLAG_WIN_UPDATE; - tcp_update_wl(tp, ack, ack_seq); - - if (tp->snd_wnd != nwin) { - tp->snd_wnd = nwin; - - /* Note, it is the only place, where - * fast path is recovered for sending TCP. - */ - tcp_fast_path_check(sk, tp); - - if (nwin > tp->max_window) { - tp->max_window = nwin; - tcp_sync_mss(sk, tp->pmtu_cookie); - } - } - } - - tp->snd_una = ack; - - return flag; -#else - return 0; -#endif -} - -/* This routine deals with incoming acks, but not outgoing ones. */ -static int tcp_ack(struct sock *sk, struct sk_buff *skb, int flag) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - u32 prior_snd_una = tp->snd_una; - u32 ack_seq = TCP_SKB_CB(skb)->seq; - u32 ack = TCP_SKB_CB(skb)->ack_seq; - u32 prior_in_flight; - int prior_packets; - - /* If the ack is newer than sent or older than previous acks - * then we can probably ignore it. - */ - if (after(ack, tp->snd_nxt)) - goto uninteresting_ack; - - if (before(ack, prior_snd_una)) - goto old_ack; - - if (!(flag&FLAG_SLOWPATH) && after(ack, prior_snd_una)) { - /* Window is constant, pure forward advance. - * No more checks are required. - * Note, we use the fact that SND.UNA>=SND.WL2. - */ - tcp_update_wl(tp, ack, ack_seq); - tp->snd_una = ack; - flag |= FLAG_WIN_UPDATE; - - NET_INC_STATS_BH(TCPHPAcks); - } else { - if (ack_seq != TCP_SKB_CB(skb)->end_seq) - flag |= FLAG_DATA; - else - NET_INC_STATS_BH(TCPPureAcks); - - flag |= tcp_ack_update_window(sk, tp, skb, ack, ack_seq); - - if (TCP_SKB_CB(skb)->sacked) - flag |= tcp_sacktag_write_queue(sk, skb, prior_snd_una); - - if (TCP_ECN_rcv_ecn_echo(tp, skb->h.th)) - flag |= FLAG_ECE; - } - - /* We passed data and got it acked, remove any soft error - * log. Something worked... - */ - sk->err_soft = 0; - tp->rcv_tstamp = tcp_time_stamp; - if ((prior_packets = tp->packets_out) == 0) - goto no_queue; - - prior_in_flight = tcp_packets_in_flight(tp); - - /* See if we can take anything off of the retransmit queue. */ - flag |= tcp_clean_rtx_queue(sk); - - if (tcp_ack_is_dubious(tp, flag)) { - /* Advanve CWND, if state allows this. */ - if ((flag&FLAG_DATA_ACKED) && prior_in_flight >= tp->snd_cwnd && - tcp_may_raise_cwnd(tp, flag)) - tcp_cong_avoid(tp); - tcp_fastretrans_alert(sk, prior_snd_una, prior_packets, flag); - } else { - if ((flag&FLAG_DATA_ACKED) && prior_in_flight >= tp->snd_cwnd) - tcp_cong_avoid(tp); - } - - if ((flag & FLAG_FORWARD_PROGRESS) || !(flag&FLAG_NOT_DUP)) - dst_confirm(sk->dst_cache); - - return 1; - -no_queue: - tp->probes_out = 0; - - /* If this ack opens up a zero window, clear backoff. It was - * being used to time the probes, and is probably far higher than - * it needs to be for normal retransmission. - */ - if (tp->send_head) - tcp_ack_probe(sk); - return 1; - -old_ack: - if (TCP_SKB_CB(skb)->sacked) - tcp_sacktag_write_queue(sk, skb, prior_snd_una); - -uninteresting_ack: - SOCK_DEBUG(sk, "Ack %u out of %u:%u\n", ack, tp->snd_una, tp->snd_nxt); - return 0; -#else - return 0; -#endif -} - - -/* Look for tcp options. Normally only called on SYN and SYNACK packets. - * But, this can also be called on packets in the established flow when - * the fast version below fails. - */ -void tcp_parse_options(struct sk_buff *skb, struct tcp_opt *tp, int estab) -{ -#if 0 - unsigned char *ptr; - struct tcphdr *th = skb->h.th; - int length=(th->doff*4)-sizeof(struct tcphdr); - - ptr = (unsigned char *)(th + 1); - tp->saw_tstamp = 0; - - while(length>0) { - int opcode=*ptr++; - int opsize; - - switch (opcode) { - case TCPOPT_EOL: - return; - case TCPOPT_NOP: /* Ref: RFC 793 section 3.1 */ - length--; - continue; - default: - opsize=*ptr++; - if (opsize < 2) /* "silly options" */ - return; - if (opsize > length) - return; /* don't parse partial options */ - switch(opcode) { - case TCPOPT_MSS: - if(opsize==TCPOLEN_MSS && th->syn && !estab) { - u16 in_mss = ntohs(*(__u16 *)ptr); - if (in_mss) { - if (tp->user_mss && tp->user_mss < in_mss) - in_mss = tp->user_mss; - tp->mss_clamp = in_mss; - } - } - break; - case TCPOPT_WINDOW: - if(opsize==TCPOLEN_WINDOW && th->syn && !estab) - if (sysctl_tcp_window_scaling) { - tp->wscale_ok = 1; - tp->snd_wscale = *(__u8 *)ptr; - if(tp->snd_wscale > 14) { - if(net_ratelimit()) - printk("tcp_parse_options: Illegal window " - "scaling value %d >14 received.", - tp->snd_wscale); - tp->snd_wscale = 14; - } - } - break; - case TCPOPT_TIMESTAMP: - if(opsize==TCPOLEN_TIMESTAMP) { - if ((estab && tp->tstamp_ok) || - (!estab && sysctl_tcp_timestamps)) { - tp->saw_tstamp = 1; - tp->rcv_tsval = ntohl(*(__u32 *)ptr); - tp->rcv_tsecr = ntohl(*(__u32 *)(ptr+4)); - } - } - break; - case TCPOPT_SACK_PERM: - if(opsize==TCPOLEN_SACK_PERM && th->syn && !estab) { - if (sysctl_tcp_sack) { - tp->sack_ok = 1; - tcp_sack_reset(tp); - } - } - break; - - case TCPOPT_SACK: - if((opsize >= (TCPOLEN_SACK_BASE + TCPOLEN_SACK_PERBLOCK)) && - !((opsize - TCPOLEN_SACK_BASE) % TCPOLEN_SACK_PERBLOCK) && - tp->sack_ok) { - TCP_SKB_CB(skb)->sacked = (ptr - 2) - (unsigned char *)th; - } - }; - ptr+=opsize-2; - length-=opsize; - }; - } -#endif -} - -/* Fast parse options. This hopes to only see timestamps. - * If it is wrong it falls back on tcp_parse_options(). - */ -static __inline__ int tcp_fast_parse_options(struct sk_buff *skb, struct tcphdr *th, struct tcp_opt *tp) -{ -#if 0 - if (th->doff == sizeof(struct tcphdr)>>2) { - tp->saw_tstamp = 0; - return 0; - } else if (tp->tstamp_ok && - th->doff == (sizeof(struct tcphdr)>>2)+(TCPOLEN_TSTAMP_ALIGNED>>2)) { - __u32 *ptr = (__u32 *)(th + 1); - if (*ptr == ntohl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) - | (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)) { - tp->saw_tstamp = 1; - ++ptr; - tp->rcv_tsval = ntohl(*ptr); - ++ptr; - tp->rcv_tsecr = ntohl(*ptr); - return 1; - } - } - tcp_parse_options(skb, tp, 1); - return 1; -#else - return 0; -#endif -} - -extern __inline__ void -tcp_store_ts_recent(struct tcp_opt *tp) -{ -#if 0 - tp->ts_recent = tp->rcv_tsval; - tp->ts_recent_stamp = xtime.tv_sec; -#endif -} - -extern __inline__ void -tcp_replace_ts_recent(struct tcp_opt *tp, u32 seq) -{ -#if 0 - if (tp->saw_tstamp && !after(seq, tp->rcv_wup)) { - /* PAWS bug workaround wrt. ACK frames, the PAWS discard - * extra check below makes sure this can only happen - * for pure ACK frames. -DaveM - * - * Not only, also it occurs for expired timestamps. - */ - - if((s32)(tp->rcv_tsval - tp->ts_recent) >= 0 || - xtime.tv_sec >= tp->ts_recent_stamp + TCP_PAWS_24DAYS) - tcp_store_ts_recent(tp); - } -#endif -} - -/* Sorry, PAWS as specified is broken wrt. pure-ACKs -DaveM - * - * It is not fatal. If this ACK does _not_ change critical state (seqs, window) - * it can pass through stack. So, the following predicate verifies that - * this segment is not used for anything but congestion avoidance or - * fast retransmit. Moreover, we even are able to eliminate most of such - * second order effects, if we apply some small "replay" window (~RTO) - * to timestamp space. - * - * All these measures still do not guarantee that we reject wrapped ACKs - * on networks with high bandwidth, when sequence space is recycled fastly, - * but it guarantees that such events will be very rare and do not affect - * connection seriously. This doesn't look nice, but alas, PAWS is really - * buggy extension. - * - * [ Later note. Even worse! It is buggy for segments _with_ data. RFC - * states that events when retransmit arrives after original data are rare. - * It is a blatant lie. VJ forgot about fast retransmit! 8)8) It is - * the biggest problem on large power networks even with minor reordering. - * OK, let's give it small replay window. If peer clock is even 1hz, it is safe - * up to bandwidth of 18Gigabit/sec. 8) ] - */ - -static int tcp_disordered_ack(struct tcp_opt *tp, struct sk_buff *skb) -{ -#if 0 - struct tcphdr *th = skb->h.th; - u32 seq = TCP_SKB_CB(skb)->seq; - u32 ack = TCP_SKB_CB(skb)->ack_seq; - - return (/* 1. Pure ACK with correct sequence number. */ - (th->ack && seq == TCP_SKB_CB(skb)->end_seq && seq == tp->rcv_nxt) && - - /* 2. ... and duplicate ACK. */ - ack == tp->snd_una && - - /* 3. ... and does not update window. */ - !tcp_may_update_window(tp, ack, seq, ntohs(th->window)<<tp->snd_wscale) && - - /* 4. ... and sits in replay window. */ - (s32)(tp->ts_recent - tp->rcv_tsval) <= (tp->rto*1024)/HZ); -#endif -} - -extern __inline__ int tcp_paws_discard(struct tcp_opt *tp, struct sk_buff *skb) -{ -#if 0 - return ((s32)(tp->ts_recent - tp->rcv_tsval) > TCP_PAWS_WINDOW && - xtime.tv_sec < tp->ts_recent_stamp + TCP_PAWS_24DAYS && - !tcp_disordered_ack(tp, skb)); -#else - return 0; -#endif -} - -/* Check segment sequence number for validity. - * - * Segment controls are considered valid, if the segment - * fits to the window after truncation to the window. Acceptability - * of data (and SYN, FIN, of course) is checked separately. - * See tcp_data_queue(), for example. - * - * Also, controls (RST is main one) are accepted using RCV.WUP instead - * of RCV.NXT. Peer still did not advance his SND.UNA when we - * delayed ACK, so that hisSND.UNA<=ourRCV.WUP. - * (borrowed from freebsd) - */ - -static inline int tcp_sequence(struct tcp_opt *tp, u32 seq, u32 end_seq) -{ -#if 0 - return !before(end_seq, tp->rcv_wup) && - !after(seq, tp->rcv_nxt + tcp_receive_window(tp)); -#else - return 0; -#endif -} - -/* When we get a reset we do this. */ -static void tcp_reset(struct sock *sk) -{ -#if 0 - /* We want the right error as BSD sees it (and indeed as we do). */ - switch (sk->state) { - case TCP_SYN_SENT: - sk->err = ECONNREFUSED; - break; - case TCP_CLOSE_WAIT: - sk->err = EPIPE; - break; - case TCP_CLOSE: - return; - default: - sk->err = ECONNRESET; - } - - if (!sk->dead) - sk->error_report(sk); - - tcp_done(sk); -#endif -} - -/* - * Process the FIN bit. This now behaves as it is supposed to work - * and the FIN takes effect when it is validly part of sequence - * space. Not before when we get holes. - * - * If we are ESTABLISHED, a received fin moves us to CLOSE-WAIT - * (and thence onto LAST-ACK and finally, CLOSE, we never enter - * TIME-WAIT) - * - * If we are in FINWAIT-1, a received FIN indicates simultaneous - * close and we go into CLOSING (and later onto TIME-WAIT) - * - * If we are in FINWAIT-2, a received FIN moves us to TIME-WAIT. - */ -static void tcp_fin(struct sk_buff *skb, struct sock *sk, struct tcphdr *th) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - - tcp_schedule_ack(tp); - - sk->shutdown |= RCV_SHUTDOWN; - sk->done = 1; - - switch(sk->state) { - case TCP_SYN_RECV: - case TCP_ESTABLISHED: - /* Move to CLOSE_WAIT */ - tcp_set_state(sk, TCP_CLOSE_WAIT); - tp->ack.pingpong = 1; - break; - - case TCP_CLOSE_WAIT: - case TCP_CLOSING: - /* Received a retransmission of the FIN, do - * nothing. - */ - break; - case TCP_LAST_ACK: - /* RFC793: Remain in the LAST-ACK state. */ - break; - - case TCP_FIN_WAIT1: - /* This case occurs when a simultaneous close - * happens, we must ack the received FIN and - * enter the CLOSING state. - */ - tcp_send_ack(sk); - tcp_set_state(sk, TCP_CLOSING); - break; - case TCP_FIN_WAIT2: - /* Received a FIN -- send ACK and enter TIME_WAIT. */ - tcp_send_ack(sk); - tcp_time_wait(sk, TCP_TIME_WAIT, 0); - break; - default: - /* Only TCP_LISTEN and TCP_CLOSE are left, in these - * cases we should never reach this piece of code. - */ - printk("tcp_fin: Impossible, sk->state=%d\n", sk->state); - break; - }; - - /* It _is_ possible, that we have something out-of-order _after_ FIN. - * Probably, we should reset in this case. For now drop them. - */ - __skb_queue_purge(&tp->out_of_order_queue); - if (tp->sack_ok) - tcp_sack_reset(tp); - tcp_mem_reclaim(sk); - - if (!sk->dead) { - sk->state_change(sk); - - /* Do not send POLL_HUP for half duplex close. */ - if (sk->shutdown == SHUTDOWN_MASK || sk->state == TCP_CLOSE) - sk_wake_async(sk, 1, POLL_HUP); - else - sk_wake_async(sk, 1, POLL_IN); - } -#endif -} - -static __inline__ int -tcp_sack_extend(struct tcp_sack_block *sp, u32 seq, u32 end_seq) -{ -#if 0 - if (!after(seq, sp->end_seq) && !after(sp->start_seq, end_seq)) { - if (before(seq, sp->start_seq)) - sp->start_seq = seq; - if (after(end_seq, sp->end_seq)) - sp->end_seq = end_seq; - return 1; - } - return 0; -#else - return 0; -#endif -} - -static __inline__ void tcp_dsack_set(struct tcp_opt *tp, u32 seq, u32 end_seq) -{ -#if 0 - if (tp->sack_ok && sysctl_tcp_dsack) { - if (before(seq, tp->rcv_nxt)) - NET_INC_STATS_BH(TCPDSACKOldSent); - else - NET_INC_STATS_BH(TCPDSACKOfoSent); - - tp->dsack = 1; - tp->duplicate_sack[0].start_seq = seq; - tp->duplicate_sack[0].end_seq = end_seq; - tp->eff_sacks = min(tp->num_sacks+1, 4-tp->tstamp_ok); - } -#endif -} - -static __inline__ void tcp_dsack_extend(struct tcp_opt *tp, u32 seq, u32 end_seq) -{ -#if 0 - if (!tp->dsack) - tcp_dsack_set(tp, seq, end_seq); - else - tcp_sack_extend(tp->duplicate_sack, seq, end_seq); -#endif -} - -static void tcp_send_dupack(struct sock *sk, struct sk_buff *skb) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - - if (TCP_SKB_CB(skb)->end_seq != TCP_SKB_CB(skb)->seq && - before(TCP_SKB_CB(skb)->seq, tp->rcv_nxt)) { - NET_INC_STATS_BH(DelayedACKLost); - tcp_enter_quickack_mode(tp); - - if (tp->sack_ok && sysctl_tcp_dsack) { - u32 end_seq = TCP_SKB_CB(skb)->end_seq; - - if (after(TCP_SKB_CB(skb)->end_seq, tp->rcv_nxt)) - end_seq = tp->rcv_nxt; - tcp_dsack_set(tp, TCP_SKB_CB(skb)->seq, end_seq); - } - } - - tcp_send_ack(sk); -#endif -} - -/* These routines update the SACK block as out-of-order packets arrive or - * in-order packets close up the sequence space. - */ -static void tcp_sack_maybe_coalesce(struct tcp_opt *tp) -{ -#if 0 - int this_sack; - struct tcp_sack_block *sp = &tp->selective_acks[0]; - struct tcp_sack_block *swalk = sp+1; - - /* See if the recent change to the first SACK eats into - * or hits the sequence space of other SACK blocks, if so coalesce. - */ - for (this_sack = 1; this_sack < tp->num_sacks; ) { - if (tcp_sack_extend(sp, swalk->start_seq, swalk->end_seq)) { - int i; - - /* Zap SWALK, by moving every further SACK up by one slot. - * Decrease num_sacks. - */ - tp->num_sacks--; - tp->eff_sacks = min(tp->num_sacks+tp->dsack, 4-tp->tstamp_ok); - for(i=this_sack; i < tp->num_sacks; i++) - sp[i] = sp[i+1]; - continue; - } - this_sack++, swalk++; - } -#endif -} - -static __inline__ void tcp_sack_swap(struct tcp_sack_block *sack1, struct tcp_sack_block *sack2) -{ -#if 0 - __u32 tmp; - - tmp = sack1->start_seq; - sack1->start_seq = sack2->start_seq; - sack2->start_seq = tmp; - - tmp = sack1->end_seq; - sack1->end_seq = sack2->end_seq; - sack2->end_seq = tmp; -#endif -} - -static void tcp_sack_new_ofo_skb(struct sock *sk, u32 seq, u32 end_seq) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - struct tcp_sack_block *sp = &tp->selective_acks[0]; - int cur_sacks = tp->num_sacks; - int this_sack; - - if (!cur_sacks) - goto new_sack; - - for (this_sack=0; this_sack<cur_sacks; this_sack++, sp++) { - if (tcp_sack_extend(sp, seq, end_seq)) { - /* Rotate this_sack to the first one. */ - for (; this_sack>0; this_sack--, sp--) - tcp_sack_swap(sp, sp-1); - if (cur_sacks > 1) - tcp_sack_maybe_coalesce(tp); - return; - } - } - - /* Could not find an adjacent existing SACK, build a new one, - * put it at the front, and shift everyone else down. We - * always know there is at least one SACK present already here. - * - * If the sack array is full, forget about the last one. - */ - if (this_sack >= 4) { - this_sack--; - tp->num_sacks--; - sp--; - } - for(; this_sack > 0; this_sack--, sp--) - *sp = *(sp-1); - -new_sack: - /* Build the new head SACK, and we're done. */ - sp->start_seq = seq; - sp->end_seq = end_seq; - tp->num_sacks++; - tp->eff_sacks = min(tp->num_sacks+tp->dsack, 4-tp->tstamp_ok); -#endif -} - -/* RCV.NXT advances, some SACKs should be eaten. */ - -static void tcp_sack_remove(struct tcp_opt *tp) -{ -#if 0 - struct tcp_sack_block *sp = &tp->selective_acks[0]; - int num_sacks = tp->num_sacks; - int this_sack; - - /* Empty ofo queue, hence, all the SACKs are eaten. Clear. */ - if (skb_queue_len(&tp->out_of_order_queue) == 0) { - tp->num_sacks = 0; - tp->eff_sacks = tp->dsack; - return; - } - - for(this_sack = 0; this_sack < num_sacks; ) { - /* Check if the start of the sack is covered by RCV.NXT. */ - if (!before(tp->rcv_nxt, sp->start_seq)) { - int i; - - /* RCV.NXT must cover all the block! */ - BUG_TRAP(!before(tp->rcv_nxt, sp->end_seq)); - - /* Zap this SACK, by moving forward any other SACKS. */ - for (i=this_sack+1; i < num_sacks; i++) - tp->selective_acks[i-1] = tp->selective_acks[i]; - num_sacks--; - continue; - } - this_sack++; - sp++; - } - if (num_sacks != tp->num_sacks) { - tp->num_sacks = num_sacks; - tp->eff_sacks = min(tp->num_sacks+tp->dsack, 4-tp->tstamp_ok); - } -#endif -} - -/* This one checks to see if we can put data from the - * out_of_order queue into the receive_queue. - */ -static void tcp_ofo_queue(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - __u32 dsack_high = tp->rcv_nxt; - struct sk_buff *skb; - - while ((skb = skb_peek(&tp->out_of_order_queue)) != NULL) { - if (after(TCP_SKB_CB(skb)->seq, tp->rcv_nxt)) - break; - - if (before(TCP_SKB_CB(skb)->seq, dsack_high)) { - __u32 dsack = dsack_high; - if (before(TCP_SKB_CB(skb)->end_seq, dsack_high)) - dsack_high = TCP_SKB_CB(skb)->end_seq; - tcp_dsack_extend(tp, TCP_SKB_CB(skb)->seq, dsack); - } - - if (!after(TCP_SKB_CB(skb)->end_seq, tp->rcv_nxt)) { - SOCK_DEBUG(sk, "ofo packet was already received \n"); - __skb_unlink(skb, skb->list); - __kfree_skb(skb); - continue; - } - SOCK_DEBUG(sk, "ofo requeuing : rcv_next %X seq %X - %X\n", - tp->rcv_nxt, TCP_SKB_CB(skb)->seq, - TCP_SKB_CB(skb)->end_seq); - - __skb_unlink(skb, skb->list); - __skb_queue_tail(&sk->receive_queue, skb); - tp->rcv_nxt = TCP_SKB_CB(skb)->end_seq; - if(skb->h.th->fin) - tcp_fin(skb, sk, skb->h.th); - } -#endif -} - -static inline int tcp_rmem_schedule(struct sock *sk, struct sk_buff *skb) -{ -#if 0 - return (int)skb->truesize <= sk->forward_alloc || - tcp_mem_schedule(sk, skb->truesize, 1); -#else - return 0; -#endif -} - -static int tcp_prune_queue(struct sock *sk); - -static void tcp_data_queue(struct sock *sk, struct sk_buff *skb) -{ -#if 0 - struct tcphdr *th = skb->h.th; - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - int eaten = -1; - - if (TCP_SKB_CB(skb)->seq == TCP_SKB_CB(skb)->end_seq) - goto drop; - - th = skb->h.th; - __skb_pull(skb, th->doff*4); - - TCP_ECN_accept_cwr(tp, skb); - - if (tp->dsack) { - tp->dsack = 0; - tp->eff_sacks = min_t(unsigned int, tp->num_sacks, 4-tp->tstamp_ok); - } - - /* Queue data for delivery to the user. - * Packets in sequence go to the receive queue. - * Out of sequence packets to the out_of_order_queue. - */ - if (TCP_SKB_CB(skb)->seq == tp->rcv_nxt) { - if (tcp_receive_window(tp) == 0) - goto out_of_window; - - /* Ok. In sequence. In window. */ - if (tp->ucopy.task == current && - tp->copied_seq == tp->rcv_nxt && - tp->ucopy.len && - sk->lock.users && - !tp->urg_data) { - int chunk = min_t(unsigned int, skb->len, tp->ucopy.len); - - __set_current_state(TASK_RUNNING); - - local_bh_enable(); - if (!skb_copy_datagram_iovec(skb, 0, tp->ucopy.iov, chunk)) { - tp->ucopy.len -= chunk; - tp->copied_seq += chunk; - eaten = (chunk == skb->len && !th->fin); - } - local_bh_disable(); - } - - if (eaten <= 0) { -queue_and_out: - if (eaten < 0 && - (atomic_read(&sk->rmem_alloc) > sk->rcvbuf || - !tcp_rmem_schedule(sk, skb))) { - if (tcp_prune_queue(sk) < 0 || !tcp_rmem_schedule(sk, skb)) - goto drop; - } - tcp_set_owner_r(skb, sk); - __skb_queue_tail(&sk->receive_queue, skb); - } - tp->rcv_nxt = TCP_SKB_CB(skb)->end_seq; - if(skb->len) - tcp_event_data_recv(sk, tp, skb); - if(th->fin) - tcp_fin(skb, sk, th); - - if (skb_queue_len(&tp->out_of_order_queue)) { - tcp_ofo_queue(sk); - - /* RFC2581. 4.2. SHOULD send immediate ACK, when - * gap in queue is filled. - */ - if (skb_queue_len(&tp->out_of_order_queue) == 0) - tp->ack.pingpong = 0; - } - - if(tp->num_sacks) - tcp_sack_remove(tp); - - tcp_fast_path_check(sk, tp); - - if (eaten > 0) { - __kfree_skb(skb); - } else if (!sk->dead) - sk->data_ready(sk, 0); - return; - } - - if (!after(TCP_SKB_CB(skb)->end_seq, tp->rcv_nxt)) { - /* A retransmit, 2nd most common case. Force an immediate ack. */ - NET_INC_STATS_BH(DelayedACKLost); - tcp_dsack_set(tp, TCP_SKB_CB(skb)->seq, TCP_SKB_CB(skb)->end_seq); - -out_of_window: - tcp_enter_quickack_mode(tp); - tcp_schedule_ack(tp); -drop: - __kfree_skb(skb); - return; - } - - /* Out of window. F.e. zero window probe. */ - if (!before(TCP_SKB_CB(skb)->seq, tp->rcv_nxt+tcp_receive_window(tp))) - goto out_of_window; - - tcp_enter_quickack_mode(tp); - - if (before(TCP_SKB_CB(skb)->seq, tp->rcv_nxt)) { - /* Partial packet, seq < rcv_next < end_seq */ - SOCK_DEBUG(sk, "partial packet: rcv_next %X seq %X - %X\n", - tp->rcv_nxt, TCP_SKB_CB(skb)->seq, - TCP_SKB_CB(skb)->end_seq); - - tcp_dsack_set(tp, TCP_SKB_CB(skb)->seq, tp->rcv_nxt); - - /* If window is closed, drop tail of packet. But after - * remembering D-SACK for its head made in previous line. - */ - if (!tcp_receive_window(tp)) - goto out_of_window; - goto queue_and_out; - } - - TCP_ECN_check_ce(tp, skb); - - if (atomic_read(&sk->rmem_alloc) > sk->rcvbuf || - !tcp_rmem_schedule(sk, skb)) { - if (tcp_prune_queue(sk) < 0 || !tcp_rmem_schedule(sk, skb)) - goto drop; - } - - /* Disable header prediction. */ - tp->pred_flags = 0; - tcp_schedule_ack(tp); - - SOCK_DEBUG(sk, "out of order segment: rcv_next %X seq %X - %X\n", - tp->rcv_nxt, TCP_SKB_CB(skb)->seq, TCP_SKB_CB(skb)->end_seq); - - tcp_set_owner_r(skb, sk); - - if (skb_peek(&tp->out_of_order_queue) == NULL) { - /* Initial out of order segment, build 1 SACK. */ - if(tp->sack_ok) { - tp->num_sacks = 1; - tp->dsack = 0; - tp->eff_sacks = 1; - tp->selective_acks[0].start_seq = TCP_SKB_CB(skb)->seq; - tp->selective_acks[0].end_seq = TCP_SKB_CB(skb)->end_seq; - } - __skb_queue_head(&tp->out_of_order_queue,skb); - } else { - struct sk_buff *skb1=tp->out_of_order_queue.prev; - u32 seq = TCP_SKB_CB(skb)->seq; - u32 end_seq = TCP_SKB_CB(skb)->end_seq; - - if (seq == TCP_SKB_CB(skb1)->end_seq) { - __skb_append(skb1, skb); - - if (tp->num_sacks == 0 || - tp->selective_acks[0].end_seq != seq) - goto add_sack; - - /* Common case: data arrive in order after hole. */ - tp->selective_acks[0].end_seq = end_seq; - return; - } - - /* Find place to insert this segment. */ - do { - if (!after(TCP_SKB_CB(skb1)->seq, seq)) - break; - } while ((skb1=skb1->prev) != (struct sk_buff*)&tp->out_of_order_queue); - - /* Do skb overlap to previous one? */ - if (skb1 != (struct sk_buff*)&tp->out_of_order_queue && - before(seq, TCP_SKB_CB(skb1)->end_seq)) { - if (!after(end_seq, TCP_SKB_CB(skb1)->end_seq)) { - /* All the bits are present. Drop. */ - __kfree_skb(skb); - tcp_dsack_set(tp, seq, end_seq); - goto add_sack; - } - if (after(seq, TCP_SKB_CB(skb1)->seq)) { - /* Partial overlap. */ - tcp_dsack_set(tp, seq, TCP_SKB_CB(skb1)->end_seq); - } else { - skb1 = skb1->prev; - } - } - __skb_insert(skb, skb1, skb1->next, &tp->out_of_order_queue); - - /* And clean segments covered by new one as whole. */ - while ((skb1 = skb->next) != (struct sk_buff*)&tp->out_of_order_queue && - after(end_seq, TCP_SKB_CB(skb1)->seq)) { - if (before(end_seq, TCP_SKB_CB(skb1)->end_seq)) { - tcp_dsack_extend(tp, TCP_SKB_CB(skb1)->seq, end_seq); - break; - } - __skb_unlink(skb1, skb1->list); - tcp_dsack_extend(tp, TCP_SKB_CB(skb1)->seq, TCP_SKB_CB(skb1)->end_seq); - __kfree_skb(skb1); - } - -add_sack: - if (tp->sack_ok) - tcp_sack_new_ofo_skb(sk, seq, end_seq); - } -#endif -} - -/* Collapse contiguous sequence of skbs head..tail with - * sequence numbers start..end. - * Segments with FIN/SYN are not collapsed (only because this - * simplifies code) - */ -static void -tcp_collapse(struct sock *sk, struct sk_buff *head, - struct sk_buff *tail, u32 start, u32 end) -{ -#if 0 - struct sk_buff *skb; - - /* First, check that queue is collapsable and find - * the point where collapsing can be useful. */ - for (skb = head; skb != tail; ) { - /* No new bits? It is possible on ofo queue. */ - if (!before(start, TCP_SKB_CB(skb)->end_seq)) { - struct sk_buff *next = skb->next; - __skb_unlink(skb, skb->list); - __kfree_skb(skb); - NET_INC_STATS_BH(TCPRcvCollapsed); - skb = next; - continue; - } - - /* The first skb to collapse is: - * - not SYN/FIN and - * - bloated or contains data before "start" or - * overlaps to the next one. - */ - if (!skb->h.th->syn && !skb->h.th->fin && - (tcp_win_from_space(skb->truesize) > skb->len || - before(TCP_SKB_CB(skb)->seq, start) || - (skb->next != tail && - TCP_SKB_CB(skb)->end_seq != TCP_SKB_CB(skb->next)->seq))) - break; - - /* Decided to skip this, advance start seq. */ - start = TCP_SKB_CB(skb)->end_seq; - skb = skb->next; - } - if (skb == tail || skb->h.th->syn || skb->h.th->fin) - return; - - while (before(start, end)) { - struct sk_buff *nskb; - int header = skb_headroom(skb); - int copy = (PAGE_SIZE - sizeof(struct sk_buff) - - sizeof(struct skb_shared_info) - header - 31)&~15; - - /* Too big header? This can happen with IPv6. */ - if (copy < 0) - return; - if (end-start < copy) - copy = end-start; - nskb = alloc_skb(copy+header, GFP_ATOMIC); - if (!nskb) - return; - skb_reserve(nskb, header); - memcpy(nskb->head, skb->head, header); - nskb->nh.raw = nskb->head + (skb->nh.raw-skb->head); - nskb->h.raw = nskb->head + (skb->h.raw-skb->head); - nskb->mac.raw = nskb->head + (skb->mac.raw-skb->head); - memcpy(nskb->cb, skb->cb, sizeof(skb->cb)); - TCP_SKB_CB(nskb)->seq = TCP_SKB_CB(nskb)->end_seq = start; - __skb_insert(nskb, skb->prev, skb, skb->list); - tcp_set_owner_r(nskb, sk); - - /* Copy data, releasing collapsed skbs. */ - while (copy > 0) { - int offset = start - TCP_SKB_CB(skb)->seq; - int size = TCP_SKB_CB(skb)->end_seq - start; - - if (offset < 0) BUG(); - if (size > 0) { - size = min(copy, size); - if (skb_copy_bits(skb, offset, skb_put(nskb, size), size)) - BUG(); - TCP_SKB_CB(nskb)->end_seq += size; - copy -= size; - start += size; - } - if (!before(start, TCP_SKB_CB(skb)->end_seq)) { - struct sk_buff *next = skb->next; - __skb_unlink(skb, skb->list); - __kfree_skb(skb); - NET_INC_STATS_BH(TCPRcvCollapsed); - skb = next; - if (skb == tail || skb->h.th->syn || skb->h.th->fin) - return; - } - } - } -#endif -} - -/* Collapse ofo queue. Algorithm: select contiguous sequence of skbs - * and tcp_collapse() them until all the queue is collapsed. - */ -static void tcp_collapse_ofo_queue(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - struct sk_buff *skb = skb_peek(&tp->out_of_order_queue); - struct sk_buff *head; - u32 start, end; - - if (skb == NULL) - return; - - start = TCP_SKB_CB(skb)->seq; - end = TCP_SKB_CB(skb)->end_seq; - head = skb; - - for (;;) { - skb = skb->next; - - /* Segment is terminated when we see gap or when - * we are at the end of all the queue. */ - if (skb == (struct sk_buff *)&tp->out_of_order_queue || - after(TCP_SKB_CB(skb)->seq, end) || - before(TCP_SKB_CB(skb)->end_seq, start)) { - tcp_collapse(sk, head, skb, start, end); - head = skb; - if (skb == (struct sk_buff *)&tp->out_of_order_queue) - break; - /* Start new segment */ - start = TCP_SKB_CB(skb)->seq; - end = TCP_SKB_CB(skb)->end_seq; - } else { - if (before(TCP_SKB_CB(skb)->seq, start)) - start = TCP_SKB_CB(skb)->seq; - if (after(TCP_SKB_CB(skb)->end_seq, end)) - end = TCP_SKB_CB(skb)->end_seq; - } - } -#endif -} - -/* Reduce allocated memory if we can, trying to get - * the socket within its memory limits again. - * - * Return less than zero if we should start dropping frames - * until the socket owning process reads some of the data - * to stabilize the situation. - */ -static int tcp_prune_queue(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &sk->tp_pinfo.af_tcp; - - SOCK_DEBUG(sk, "prune_queue: c=%x\n", tp->copied_seq); - - NET_INC_STATS_BH(PruneCalled); - - if (atomic_read(&sk->rmem_alloc) >= sk->rcvbuf) - tcp_clamp_window(sk, tp); - else if (tcp_memory_pressure) - tp->rcv_ssthresh = min(tp->rcv_ssthresh, 4U*tp->advmss); - - tcp_collapse_ofo_queue(sk); - tcp_collapse(sk, sk->receive_queue.next, - (struct sk_buff*)&sk->receive_queue, - tp->copied_seq, tp->rcv_nxt); - tcp_mem_reclaim(sk); - - if (atomic_read(&sk->rmem_alloc) <= sk->rcvbuf) - return 0; - - /* Collapsing did not help, destructive actions follow. - * This must not ever occur. */ - - /* First, purge the out_of_order queue. */ - if (skb_queue_len(&tp->out_of_order_queue)) { - net_statistics[smp_processor_id()*2].OfoPruned += skb_queue_len(&tp->out_of_order_queue); - __skb_queue_purge(&tp->out_of_order_queue); - - /* Reset SACK state. A conforming SACK implementation will - * do the same at a timeout based retransmit. When a connection - * is in a sad state like this, we care only about integrity - * of the connection not performance. - */ - if(tp->sack_ok) - tcp_sack_reset(tp); - tcp_mem_reclaim(sk); - } - - if(atomic_read(&sk->rmem_alloc) <= sk->rcvbuf) - return 0; - - /* If we are really being abused, tell the caller to silently - * drop receive data on the floor. It will get retransmitted - * and hopefully then we'll have sufficient space. - */ - NET_INC_STATS_BH(RcvPruned); - - /* Massive buffer overcommit. */ - tp->pred_flags = 0; - return -1; -#else - return 0; -#endif -} - - -/* RFC2861, slow part. Adjust cwnd, after it was not full during one rto. - * As additional protections, we do not touch cwnd in retransmission phases, - * and if application hit its sndbuf limit recently. - */ -void tcp_cwnd_application_limited(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - - if (tp->ca_state == TCP_CA_Open && - sk->socket && !test_bit(SOCK_NOSPACE, &sk->socket->flags)) { - /* Limited by application or receiver window. */ - u32 win_used = max(tp->snd_cwnd_used, 2U); - if (win_used < tp->snd_cwnd) { - tp->snd_ssthresh = tcp_current_ssthresh(tp); - tp->snd_cwnd = (tp->snd_cwnd+win_used)>>1; - } - tp->snd_cwnd_used = 0; - } - tp->snd_cwnd_stamp = tcp_time_stamp; -#endif -} - - -/* When incoming ACK allowed to free some skb from write_queue, - * we remember this event in flag tp->queue_shrunk and wake up socket - * on the exit from tcp input handler. - */ -static void tcp_new_space(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - - if (tp->packets_out < tp->snd_cwnd && - !(sk->userlocks&SOCK_SNDBUF_LOCK) && - !tcp_memory_pressure && - atomic_read(&tcp_memory_allocated) < sysctl_tcp_mem[0]) { - int sndmem, demanded; - - sndmem = tp->mss_clamp+MAX_TCP_HEADER+16+sizeof(struct sk_buff); - demanded = max_t(unsigned int, tp->snd_cwnd, tp->reordering+1); - sndmem *= 2*demanded; - if (sndmem > sk->sndbuf) - sk->sndbuf = min(sndmem, sysctl_tcp_wmem[2]); - tp->snd_cwnd_stamp = tcp_time_stamp; - } - - sk->write_space(sk); -#endif -} - -static inline void tcp_check_space(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - - if (tp->queue_shrunk) { - tp->queue_shrunk = 0; - if (sk->socket && test_bit(SOCK_NOSPACE, &sk->socket->flags)) - tcp_new_space(sk); - } -#endif -} - -static void __tcp_data_snd_check(struct sock *sk, struct sk_buff *skb) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - - if (after(TCP_SKB_CB(skb)->end_seq, tp->snd_una + tp->snd_wnd) || - tcp_packets_in_flight(tp) >= tp->snd_cwnd || - tcp_write_xmit(sk, tp->nonagle)) - tcp_check_probe_timer(sk, tp); -#endif -} - -static __inline__ void tcp_data_snd_check(struct sock *sk) -{ -#if 0 - struct sk_buff *skb = sk->tp_pinfo.af_tcp.send_head; - - if (skb != NULL) - __tcp_data_snd_check(sk, skb); - tcp_check_space(sk); -#endif -} - -/* - * Check if sending an ack is needed. - */ -static __inline__ void __tcp_ack_snd_check(struct sock *sk, int ofo_possible) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - - /* More than one full frame received... */ - if (((tp->rcv_nxt - tp->rcv_wup) > tp->ack.rcv_mss - /* ... and right edge of window advances far enough. - * (tcp_recvmsg() will send ACK otherwise). Or... - */ - && __tcp_select_window(sk) >= tp->rcv_wnd) || - /* We ACK each frame or... */ - tcp_in_quickack_mode(tp) || - /* We have out of order data. */ - (ofo_possible && - skb_peek(&tp->out_of_order_queue) != NULL)) { - /* Then ack it now */ - tcp_send_ack(sk); - } else { - /* Else, send delayed ack. */ - tcp_send_delayed_ack(sk); - } -#endif -} - -static __inline__ void tcp_ack_snd_check(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - if (!tcp_ack_scheduled(tp)) { - /* We sent a data segment already. */ - return; - } - __tcp_ack_snd_check(sk, 1); -#endif -} - -/* - * This routine is only called when we have urgent data - * signalled. Its the 'slow' part of tcp_urg. It could be - * moved inline now as tcp_urg is only called from one - * place. We handle URGent data wrong. We have to - as - * BSD still doesn't use the correction from RFC961. - * For 1003.1g we should support a new option TCP_STDURG to permit - * either form (or just set the sysctl tcp_stdurg). - */ - -static void tcp_check_urg(struct sock * sk, struct tcphdr * th) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - u32 ptr = ntohs(th->urg_ptr); - - if (ptr && !sysctl_tcp_stdurg) - ptr--; - ptr += ntohl(th->seq); - - /* Ignore urgent data that we've already seen and read. */ - if (after(tp->copied_seq, ptr)) - return; - - /* Do not replay urg ptr. - * - * NOTE: interesting situation not covered by specs. - * Misbehaving sender may send urg ptr, pointing to segment, - * which we already have in ofo queue. We are not able to fetch - * such data and will stay in TCP_URG_NOTYET until will be eaten - * by recvmsg(). Seems, we are not obliged to handle such wicked - * situations. But it is worth to think about possibility of some - * DoSes using some hypothetical application level deadlock. - */ - if (before(ptr, tp->rcv_nxt)) - return; - - /* Do we already have a newer (or duplicate) urgent pointer? */ - if (tp->urg_data && !after(ptr, tp->urg_seq)) - return; - - /* Tell the world about our new urgent pointer. */ - if (sk->proc != 0) { - if (sk->proc > 0) - kill_proc(sk->proc, SIGURG, 1); - else - kill_pg(-sk->proc, SIGURG, 1); - sk_wake_async(sk, 3, POLL_PRI); - } - - /* We may be adding urgent data when the last byte read was - * urgent. To do this requires some care. We cannot just ignore - * tp->copied_seq since we would read the last urgent byte again - * as data, nor can we alter copied_seq until this data arrives - * or we break the sematics of SIOCATMARK (and thus sockatmark()) - * - * NOTE. Double Dutch. Rendering to plain English: author of comment - * above did something sort of send("A", MSG_OOB); send("B", MSG_OOB); - * and expect that both A and B disappear from stream. This is _wrong_. - * Though this happens in BSD with high probability, this is occasional. - * Any application relying on this is buggy. Note also, that fix "works" - * only in this artificial test. Insert some normal data between A and B and we will - * decline of BSD again. Verdict: it is better to remove to trap - * buggy users. - */ - if (tp->urg_seq == tp->copied_seq && tp->urg_data && - !sk->urginline && - tp->copied_seq != tp->rcv_nxt) { - struct sk_buff *skb = skb_peek(&sk->receive_queue); - tp->copied_seq++; - if (skb && !before(tp->copied_seq, TCP_SKB_CB(skb)->end_seq)) { - __skb_unlink(skb, skb->list); - __kfree_skb(skb); - } - } - - tp->urg_data = TCP_URG_NOTYET; - tp->urg_seq = ptr; - - /* Disable header prediction. */ - tp->pred_flags = 0; -#endif -} - -/* This is the 'fast' part of urgent handling. */ -static inline void tcp_urg(struct sock *sk, struct sk_buff *skb, struct tcphdr *th) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - - /* Check if we get a new urgent pointer - normally not. */ - if (th->urg) - tcp_check_urg(sk,th); - - /* Do we wait for any urgent data? - normally not... */ - if (tp->urg_data == TCP_URG_NOTYET) { - u32 ptr = tp->urg_seq - ntohl(th->seq) + (th->doff*4) - th->syn; - - /* Is the urgent pointer pointing into this packet? */ - if (ptr < skb->len) { - u8 tmp; - if (skb_copy_bits(skb, ptr, &tmp, 1)) - BUG(); - tp->urg_data = TCP_URG_VALID | tmp; - if (!sk->dead) - sk->data_ready(sk,0); - } - } -#endif -} - -static int tcp_copy_to_iovec(struct sock *sk, struct sk_buff *skb, int hlen) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - int chunk = skb->len - hlen; - int err; - - local_bh_enable(); - if (skb->ip_summed==CHECKSUM_UNNECESSARY) - err = skb_copy_datagram_iovec(skb, hlen, tp->ucopy.iov, chunk); - else - err = skb_copy_and_csum_datagram_iovec(skb, hlen, tp->ucopy.iov); - - if (!err) { - tp->ucopy.len -= chunk; - tp->copied_seq += chunk; - } - - local_bh_disable(); - return err; -#else - return 0; -#endif -} - -static int __tcp_checksum_complete_user(struct sock *sk, struct sk_buff *skb) -{ -#if 0 - int result; - - if (sk->lock.users) { - local_bh_enable(); - result = __tcp_checksum_complete(skb); - local_bh_disable(); - } else { - result = __tcp_checksum_complete(skb); - } - return result; -#else - return 0; -#endif -} - -static __inline__ int -tcp_checksum_complete_user(struct sock *sk, struct sk_buff *skb) -{ -#if 0 - return skb->ip_summed != CHECKSUM_UNNECESSARY && - __tcp_checksum_complete_user(sk, skb); -#else - return 0; -#endif -} - -/* - * TCP receive function for the ESTABLISHED state. - * - * It is split into a fast path and a slow path. The fast path is - * disabled when: - * - A zero window was announced from us - zero window probing - * is only handled properly in the slow path. - * - Out of order segments arrived. - * - Urgent data is expected. - * - There is no buffer space left - * - Unexpected TCP flags/window values/header lengths are received - * (detected by checking the TCP header against pred_flags) - * - Data is sent in both directions. Fast path only supports pure senders - * or pure receivers (this means either the sequence number or the ack - * value must stay constant) - * - Unexpected TCP option. - * - * When these conditions are not satisfied it drops into a standard - * receive procedure patterned after RFC793 to handle all cases. - * The first three cases are guaranteed by proper pred_flags setting, - * the rest is checked inline. Fast processing is turned on in - * tcp_data_queue when everything is OK. - */ -int tcp_rcv_established(struct sock *sk, struct sk_buff *skb, - struct tcphdr *th, unsigned len) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - - /* - * Header prediction. - * The code losely follows the one in the famous - * "30 instruction TCP receive" Van Jacobson mail. - * - * Van's trick is to deposit buffers into socket queue - * on a device interrupt, to call tcp_recv function - * on the receive process context and checksum and copy - * the buffer to user space. smart... - * - * Our current scheme is not silly either but we take the - * extra cost of the net_bh soft interrupt processing... - * We do checksum and copy also but from device to kernel. - */ - - tp->saw_tstamp = 0; - - /* pred_flags is 0xS?10 << 16 + snd_wnd - * if header_predition is to be made - * 'S' will always be tp->tcp_header_len >> 2 - * '?' will be 0 for the fast path, otherwise pred_flags is 0 to - * turn it off (when there are holes in the receive - * space for instance) - * PSH flag is ignored. - */ - - if ((tcp_flag_word(th) & TCP_HP_BITS) == tp->pred_flags && - TCP_SKB_CB(skb)->seq == tp->rcv_nxt) { - int tcp_header_len = tp->tcp_header_len; - - /* Timestamp header prediction: tcp_header_len - * is automatically equal to th->doff*4 due to pred_flags - * match. - */ - - /* Check timestamp */ - if (tcp_header_len == sizeof(struct tcphdr) + TCPOLEN_TSTAMP_ALIGNED) { - __u32 *ptr = (__u32 *)(th + 1); - - /* No? Slow path! */ - if (*ptr != ntohl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) - | (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)) - goto slow_path; - - tp->saw_tstamp = 1; - ++ptr; - tp->rcv_tsval = ntohl(*ptr); - ++ptr; - tp->rcv_tsecr = ntohl(*ptr); - - /* If PAWS failed, check it more carefully in slow path */ - if ((s32)(tp->rcv_tsval - tp->ts_recent) < 0) - goto slow_path; - - /* DO NOT update ts_recent here, if checksum fails - * and timestamp was corrupted part, it will result - * in a hung connection since we will drop all - * future packets due to the PAWS test. - */ - } - - if (len <= tcp_header_len) { - /* Bulk data transfer: sender */ - if (len == tcp_header_len) { - /* Predicted packet is in window by definition. - * seq == rcv_nxt and rcv_wup <= rcv_nxt. - * Hence, check seq<=rcv_wup reduces to: - */ - if (tcp_header_len == - (sizeof(struct tcphdr) + TCPOLEN_TSTAMP_ALIGNED) && - tp->rcv_nxt == tp->rcv_wup) - tcp_store_ts_recent(tp); - /* We know that such packets are checksummed - * on entry. - */ - tcp_ack(sk, skb, 0); - __kfree_skb(skb); - tcp_data_snd_check(sk); - return 0; - } else { /* Header too small */ - TCP_INC_STATS_BH(TcpInErrs); - goto discard; - } - } else { - int eaten = 0; - - if (tp->ucopy.task == current && - tp->copied_seq == tp->rcv_nxt && - len - tcp_header_len <= tp->ucopy.len && - sk->lock.users) { - __set_current_state(TASK_RUNNING); - - if (!tcp_copy_to_iovec(sk, skb, tcp_header_len)) { - /* Predicted packet is in window by definition. - * seq == rcv_nxt and rcv_wup <= rcv_nxt. - * Hence, check seq<=rcv_wup reduces to: - */ - if (tcp_header_len == - (sizeof(struct tcphdr) + - TCPOLEN_TSTAMP_ALIGNED) && - tp->rcv_nxt == tp->rcv_wup) - tcp_store_ts_recent(tp); - - __skb_pull(skb, tcp_header_len); - tp->rcv_nxt = TCP_SKB_CB(skb)->end_seq; - NET_INC_STATS_BH(TCPHPHitsToUser); - eaten = 1; - } - } - if (!eaten) { - if (tcp_checksum_complete_user(sk, skb)) - goto csum_error; - - /* Predicted packet is in window by definition. - * seq == rcv_nxt and rcv_wup <= rcv_nxt. - * Hence, check seq<=rcv_wup reduces to: - */ - if (tcp_header_len == - (sizeof(struct tcphdr) + TCPOLEN_TSTAMP_ALIGNED) && - tp->rcv_nxt == tp->rcv_wup) - tcp_store_ts_recent(tp); - - if ((int)skb->truesize > sk->forward_alloc) - goto step5; - - NET_INC_STATS_BH(TCPHPHits); - - /* Bulk data transfer: receiver */ - __skb_pull(skb,tcp_header_len); - __skb_queue_tail(&sk->receive_queue, skb); - tcp_set_owner_r(skb, sk); - tp->rcv_nxt = TCP_SKB_CB(skb)->end_seq; - } - - tcp_event_data_recv(sk, tp, skb); - - if (TCP_SKB_CB(skb)->ack_seq != tp->snd_una) { - /* Well, only one small jumplet in fast path... */ - tcp_ack(sk, skb, FLAG_DATA); - tcp_data_snd_check(sk); - if (!tcp_ack_scheduled(tp)) - goto no_ack; - } - - if (eaten) { - if (tcp_in_quickack_mode(tp)) { - tcp_send_ack(sk); - } else { - tcp_send_delayed_ack(sk); - } - } else { - __tcp_ack_snd_check(sk, 0); - } - -no_ack: - if (eaten) - __kfree_skb(skb); - else - sk->data_ready(sk, 0); - return 0; - } - } - -slow_path: - if (len < (th->doff<<2) || tcp_checksum_complete_user(sk, skb)) - goto csum_error; - - /* - * RFC1323: H1. Apply PAWS check first. - */ - if (tcp_fast_parse_options(skb, th, tp) && tp->saw_tstamp && - tcp_paws_discard(tp, skb)) { - if (!th->rst) { - NET_INC_STATS_BH(PAWSEstabRejected); - tcp_send_dupack(sk, skb); - goto discard; - } - /* Resets are accepted even if PAWS failed. - - ts_recent update must be made after we are sure - that the packet is in window. - */ - } - - /* - * Standard slow path. - */ - - if (!tcp_sequence(tp, TCP_SKB_CB(skb)->seq, TCP_SKB_CB(skb)->end_seq)) { - /* RFC793, page 37: "In all states except SYN-SENT, all reset - * (RST) segments are validated by checking their SEQ-fields." - * And page 69: "If an incoming segment is not acceptable, - * an acknowledgment should be sent in reply (unless the RST bit - * is set, if so drop the segment and return)". - */ - if (!th->rst) - tcp_send_dupack(sk, skb); - goto discard; - } - - if(th->rst) { - tcp_reset(sk); - goto discard; - } - - tcp_replace_ts_recent(tp, TCP_SKB_CB(skb)->seq); - - if (th->syn && !before(TCP_SKB_CB(skb)->seq, tp->rcv_nxt)) { - TCP_INC_STATS_BH(TcpInErrs); - NET_INC_STATS_BH(TCPAbortOnSyn); - tcp_reset(sk); - return 1; - } - -step5: - if(th->ack) - tcp_ack(sk, skb, FLAG_SLOWPATH); - - /* Process urgent data. */ - tcp_urg(sk, skb, th); - - /* step 7: process the segment text */ - tcp_data_queue(sk, skb); - - tcp_data_snd_check(sk); - tcp_ack_snd_check(sk); - return 0; - -csum_error: - TCP_INC_STATS_BH(TcpInErrs); - -discard: - __kfree_skb(skb); - return 0; -#else - return 0; -#endif -} - -static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, - struct tcphdr *th, unsigned len) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - int saved_clamp = tp->mss_clamp; - - tcp_parse_options(skb, tp, 0); - - if (th->ack) { - /* rfc793: - * "If the state is SYN-SENT then - * first check the ACK bit - * If the ACK bit is set - * If SEG.ACK =< ISS, or SEG.ACK > SND.NXT, send - * a reset (unless the RST bit is set, if so drop - * the segment and return)" - * - * We do not send data with SYN, so that RFC-correct - * test reduces to: - */ - if (TCP_SKB_CB(skb)->ack_seq != tp->snd_nxt) - goto reset_and_undo; - - if (tp->saw_tstamp && tp->rcv_tsecr && - !between(tp->rcv_tsecr, tp->retrans_stamp, tcp_time_stamp)) { - NET_INC_STATS_BH(PAWSActiveRejected); - goto reset_and_undo; - } - - /* Now ACK is acceptable. - * - * "If the RST bit is set - * If the ACK was acceptable then signal the user "error: - * connection reset", drop the segment, enter CLOSED state, - * delete TCB, and return." - */ - - if (th->rst) { - tcp_reset(sk); - goto discard; - } - - /* rfc793: - * "fifth, if neither of the SYN or RST bits is set then - * drop the segment and return." - * - * See note below! - * --ANK(990513) - */ - if (!th->syn) - goto discard_and_undo; - - /* rfc793: - * "If the SYN bit is on ... - * are acceptable then ... - * (our SYN has been ACKed), change the connection - * state to ESTABLISHED..." - */ - - TCP_ECN_rcv_synack(tp, th); - - tp->snd_wl1 = TCP_SKB_CB(skb)->seq; - tcp_ack(sk, skb, FLAG_SLOWPATH); - - /* Ok.. it's good. Set up sequence numbers and - * move to established. - */ - tp->rcv_nxt = TCP_SKB_CB(skb)->seq+1; - tp->rcv_wup = TCP_SKB_CB(skb)->seq+1; - - /* RFC1323: The window in SYN & SYN/ACK segments is - * never scaled. - */ - tp->snd_wnd = ntohs(th->window); - tcp_init_wl(tp, TCP_SKB_CB(skb)->ack_seq, TCP_SKB_CB(skb)->seq); - - if (tp->wscale_ok == 0) { - tp->snd_wscale = tp->rcv_wscale = 0; - tp->window_clamp = min(tp->window_clamp, 65535U); - } - - if (tp->saw_tstamp) { - tp->tstamp_ok = 1; - tp->tcp_header_len = - sizeof(struct tcphdr) + TCPOLEN_TSTAMP_ALIGNED; - tp->advmss -= TCPOLEN_TSTAMP_ALIGNED; - tcp_store_ts_recent(tp); - } else { - tp->tcp_header_len = sizeof(struct tcphdr); - } - - if (tp->sack_ok && sysctl_tcp_fack) - tp->sack_ok |= 2; - - tcp_sync_mss(sk, tp->pmtu_cookie); - tcp_initialize_rcv_mss(sk); - tcp_init_metrics(sk); - tcp_init_buffer_space(sk); - - if (sk->keepopen) - tcp_reset_keepalive_timer(sk, keepalive_time_when(tp)); - - if (tp->snd_wscale == 0) - __tcp_fast_path_on(tp, tp->snd_wnd); - else - tp->pred_flags = 0; - - /* Remember, tcp_poll() does not lock socket! - * Change state from SYN-SENT only after copied_seq - * is initialized. */ - tp->copied_seq = tp->rcv_nxt; - mb(); - tcp_set_state(sk, TCP_ESTABLISHED); - - if(!sk->dead) { - sk->state_change(sk); - sk_wake_async(sk, 0, POLL_OUT); - } - - if (tp->write_pending || tp->defer_accept || tp->ack.pingpong) { - /* Save one ACK. Data will be ready after - * several ticks, if write_pending is set. - * - * It may be deleted, but with this feature tcpdumps - * look so _wonderfully_ clever, that I was not able - * to stand against the temptation 8) --ANK - */ - tcp_schedule_ack(tp); - tp->ack.lrcvtime = tcp_time_stamp; - tp->ack.ato = TCP_ATO_MIN; - tcp_incr_quickack(tp); - tcp_enter_quickack_mode(tp); - tcp_reset_xmit_timer(sk, TCP_TIME_DACK, TCP_DELACK_MAX); - -discard: - __kfree_skb(skb); - return 0; - } else { - tcp_send_ack(sk); - } - return -1; - } - - /* No ACK in the segment */ - - if (th->rst) { - /* rfc793: - * "If the RST bit is set - * - * Otherwise (no ACK) drop the segment and return." - */ - - goto discard_and_undo; - } - - /* PAWS check. */ - if (tp->ts_recent_stamp && tp->saw_tstamp && tcp_paws_check(tp, 0)) - goto discard_and_undo; - - if (th->syn) { - /* We see SYN without ACK. It is attempt of - * simultaneous connect with crossed SYNs. - * Particularly, it can be connect to self. - */ - tcp_set_state(sk, TCP_SYN_RECV); - - if (tp->saw_tstamp) { - tp->tstamp_ok = 1; - tcp_store_ts_recent(tp); - tp->tcp_header_len = - sizeof(struct tcphdr) + TCPOLEN_TSTAMP_ALIGNED; - } else { - tp->tcp_header_len = sizeof(struct tcphdr); - } - - tp->rcv_nxt = TCP_SKB_CB(skb)->seq + 1; - tp->rcv_wup = TCP_SKB_CB(skb)->seq + 1; - - /* RFC1323: The window in SYN & SYN/ACK segments is - * never scaled. - */ - tp->snd_wnd = ntohs(th->window); - tp->snd_wl1 = TCP_SKB_CB(skb)->seq; - tp->max_window = tp->snd_wnd; - - tcp_sync_mss(sk, tp->pmtu_cookie); - tcp_initialize_rcv_mss(sk); - - TCP_ECN_rcv_syn(tp, th); - - tcp_send_synack(sk); -#if 0 - /* Note, we could accept data and URG from this segment. - * There are no obstacles to make this. - * - * However, if we ignore data in ACKless segments sometimes, - * we have no reasons to accept it sometimes. - * Also, seems the code doing it in step6 of tcp_rcv_state_process - * is not flawless. So, discard packet for sanity. - * Uncomment this return to process the data. - */ - return -1; -#else - goto discard; -#endif - } - /* "fifth, if neither of the SYN or RST bits is set then - * drop the segment and return." - */ - -discard_and_undo: - tcp_clear_options(tp); - tp->mss_clamp = saved_clamp; - goto discard; - -reset_and_undo: - tcp_clear_options(tp); - tp->mss_clamp = saved_clamp; - return 1; -#else - return 0; -#endif -} - - -/* - * This function implements the receiving procedure of RFC 793 for - * all states except ESTABLISHED and TIME_WAIT. - * It's called from both tcp_v4_rcv and tcp_v6_rcv and should be - * address independent. - */ - -int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb, - struct tcphdr *th, unsigned len) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - int queued = 0; - - tp->saw_tstamp = 0; - - switch (sk->state) { - case TCP_CLOSE: - goto discard; - - case TCP_LISTEN: - if(th->ack) - return 1; - - if(th->rst) - goto discard; - - if(th->syn) { - if(tp->af_specific->conn_request(sk, skb) < 0) - return 1; - - /* Now we have several options: In theory there is - * nothing else in the frame. KA9Q has an option to - * send data with the syn, BSD accepts data with the - * syn up to the [to be] advertised window and - * Solaris 2.1 gives you a protocol error. For now - * we just ignore it, that fits the spec precisely - * and avoids incompatibilities. It would be nice in - * future to drop through and process the data. - * - * Now that TTCP is starting to be used we ought to - * queue this data. - * But, this leaves one open to an easy denial of - * service attack, and SYN cookies can't defend - * against this problem. So, we drop the data - * in the interest of security over speed. - */ - goto discard; - } - goto discard; - - case TCP_SYN_SENT: - queued = tcp_rcv_synsent_state_process(sk, skb, th, len); - if (queued >= 0) - return queued; - - /* Do step6 onward by hand. */ - tcp_urg(sk, skb, th); - __kfree_skb(skb); - tcp_data_snd_check(sk); - return 0; - } - - if (tcp_fast_parse_options(skb, th, tp) && tp->saw_tstamp && - tcp_paws_discard(tp, skb)) { - if (!th->rst) { - NET_INC_STATS_BH(PAWSEstabRejected); - tcp_send_dupack(sk, skb); - goto discard; - } - /* Reset is accepted even if it did not pass PAWS. */ - } - - /* step 1: check sequence number */ - if (!tcp_sequence(tp, TCP_SKB_CB(skb)->seq, TCP_SKB_CB(skb)->end_seq)) { - if (!th->rst) - tcp_send_dupack(sk, skb); - goto discard; - } - - /* step 2: check RST bit */ - if(th->rst) { - tcp_reset(sk); - goto discard; - } - - tcp_replace_ts_recent(tp, TCP_SKB_CB(skb)->seq); - - /* step 3: check security and precedence [ignored] */ - - /* step 4: - * - * Check for a SYN in window. - */ - if (th->syn && !before(TCP_SKB_CB(skb)->seq, tp->rcv_nxt)) { - NET_INC_STATS_BH(TCPAbortOnSyn); - tcp_reset(sk); - return 1; - } - - /* step 5: check the ACK field */ - if (th->ack) { - int acceptable = tcp_ack(sk, skb, FLAG_SLOWPATH); - - switch(sk->state) { - case TCP_SYN_RECV: - if (acceptable) { - tp->copied_seq = tp->rcv_nxt; - mb(); - tcp_set_state(sk, TCP_ESTABLISHED); - sk->state_change(sk); - - /* Note, that this wakeup is only for marginal - * crossed SYN case. Passively open sockets - * are not waked up, because sk->sleep == NULL - * and sk->socket == NULL. - */ - if (sk->socket) { - sk_wake_async(sk,0,POLL_OUT); - } - - tp->snd_una = TCP_SKB_CB(skb)->ack_seq; - tp->snd_wnd = ntohs(th->window) << tp->snd_wscale; - tcp_init_wl(tp, TCP_SKB_CB(skb)->ack_seq, TCP_SKB_CB(skb)->seq); - - /* tcp_ack considers this ACK as duplicate - * and does not calculate rtt. - * Fix it at least with timestamps. - */ - if (tp->saw_tstamp && tp->rcv_tsecr && !tp->srtt) - tcp_ack_saw_tstamp(tp, 0); - - if (tp->tstamp_ok) - tp->advmss -= TCPOLEN_TSTAMP_ALIGNED; - - tcp_init_metrics(sk); - tcp_initialize_rcv_mss(sk); - tcp_init_buffer_space(sk); - tcp_fast_path_on(tp); - } else { - return 1; - } - break; - - case TCP_FIN_WAIT1: - if (tp->snd_una == tp->write_seq) { - tcp_set_state(sk, TCP_FIN_WAIT2); - sk->shutdown |= SEND_SHUTDOWN; - dst_confirm(sk->dst_cache); - - if (!sk->dead) { - /* Wake up lingering close() */ - sk->state_change(sk); - } else { - int tmo; - - if (tp->linger2 < 0 || - (TCP_SKB_CB(skb)->end_seq != TCP_SKB_CB(skb)->seq && - after(TCP_SKB_CB(skb)->end_seq - th->fin, tp->rcv_nxt))) { - tcp_done(sk); - NET_INC_STATS_BH(TCPAbortOnData); - return 1; - } - - tmo = tcp_fin_time(tp); - if (tmo > TCP_TIMEWAIT_LEN) { - tcp_reset_keepalive_timer(sk, tmo - TCP_TIMEWAIT_LEN); - } else if (th->fin || sk->lock.users) { - /* Bad case. We could lose such FIN otherwise. - * It is not a big problem, but it looks confusing - * and not so rare event. We still can lose it now, - * if it spins in bh_lock_sock(), but it is really - * marginal case. - */ - tcp_reset_keepalive_timer(sk, tmo); - } else { - tcp_time_wait(sk, TCP_FIN_WAIT2, tmo); - goto discard; - } - } - } - break; - - case TCP_CLOSING: - if (tp->snd_una == tp->write_seq) { - tcp_time_wait(sk, TCP_TIME_WAIT, 0); - goto discard; - } - break; - - case TCP_LAST_ACK: - if (tp->snd_una == tp->write_seq) { - tcp_update_metrics(sk); - tcp_done(sk); - goto discard; - } - break; - } - } else - goto discard; - - /* step 6: check the URG bit */ - tcp_urg(sk, skb, th); - - /* step 7: process the segment text */ - switch (sk->state) { - case TCP_CLOSE_WAIT: - case TCP_CLOSING: - case TCP_LAST_ACK: - if (!before(TCP_SKB_CB(skb)->seq, tp->rcv_nxt)) - break; - case TCP_FIN_WAIT1: - case TCP_FIN_WAIT2: - /* RFC 793 says to queue data in these states, - * RFC 1122 says we MUST send a reset. - * BSD 4.4 also does reset. - */ - if (sk->shutdown & RCV_SHUTDOWN) { - if (TCP_SKB_CB(skb)->end_seq != TCP_SKB_CB(skb)->seq && - after(TCP_SKB_CB(skb)->end_seq - th->fin, tp->rcv_nxt)) { - NET_INC_STATS_BH(TCPAbortOnData); - tcp_reset(sk); - return 1; - } - } - /* Fall through */ - case TCP_ESTABLISHED: - tcp_data_queue(sk, skb); - queued = 1; - break; - } - - /* tcp_data could move socket to TIME-WAIT */ - if (sk->state != TCP_CLOSE) { - tcp_data_snd_check(sk); - tcp_ack_snd_check(sk); - } - - if (!queued) { -discard: - __kfree_skb(skb); - } - return 0; -#else - return 0; -#endif -} diff --git a/reactos/drivers/net/tcpip/transport/tcp/tcp_ipv4.c b/reactos/drivers/net/tcpip/transport/tcp/tcp_ipv4.c deleted file mode 100755 index cf45c02046b..00000000000 --- a/reactos/drivers/net/tcpip/transport/tcp/tcp_ipv4.c +++ /dev/null @@ -1,2523 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS TCP/IP protocol driver - * FILE: transport/tcp/tcp_ipv4.c - * PURPOSE: Transmission Control Protocol - * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net) - * REVISIONS: - * CSH 15-01-2003 Imported from linux kernel 2.4.20 - */ - -/* - * INET An implementation of the TCP/IP protocol suite for the LINUX - * operating system. INET is implemented using the BSD Socket - * interface as the means of communication with the user level. - * - * Implementation of the Transmission Control Protocol(TCP). - * - * Version: $Id: tcp_ipv4.c,v 1.1 2003/01/15 21:57:31 chorns Exp $ - * - * IPv4 specific functions - * - * - * code split from: - * linux/ipv4/tcp.c - * linux/ipv4/tcp_input.c - * linux/ipv4/tcp_output.c - * - * See tcp.c for author information - * - * 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. - */ - -/* - * Changes: - * David S. Miller : New socket lookup architecture. - * This code is dedicated to John Dyson. - * David S. Miller : Change semantics of established hash, - * half is devoted to TIME_WAIT sockets - * and the rest go in the other half. - * Andi Kleen : Add support for syncookies and fixed - * some bugs: ip options weren't passed to - * the TCP layer, missed a check for an ACK bit. - * Andi Kleen : Implemented fast path mtu discovery. - * Fixed many serious bugs in the - * open_request handling and moved - * most of it into the af independent code. - * Added tail drop and some other bugfixes. - * Added new listen sematics. - * Mike McLagan : Routing by source - * Juan Jose Ciarlante: ip_dynaddr bits - * Andi Kleen: various fixes. - * Vitaly E. Lavrov : Transparent proxy revived after year coma. - * Andi Kleen : Fix new listen. - * Andi Kleen : Fix accept error reporting. - */ - -#if 0 -#include <linux/config.h> -#include <linux/types.h> -#include <linux/fcntl.h> -#include <linux/random.h> -#include <linux/cache.h> -#include <linux/init.h> - -#include <net/icmp.h> -#include <net/tcp.h> -#include <net/ipv6.h> -#include <net/inet_common.h> - -#include <linux/inet.h> -#include <linux/stddef.h> -#include <linux/ipsec.h> -#else -#include "linux.h" -#include "tcpcore.h" -#endif - -extern int sysctl_ip_dynaddr; -extern int sysctl_ip_default_ttl; -int sysctl_tcp_tw_reuse = 0; - -/* Check TCP sequence numbers in ICMP packets. */ -#define ICMP_MIN_LENGTH 8 - -/* Socket used for sending RSTs */ -#if 0 -static struct inode tcp_inode; -static struct socket *tcp_socket=&tcp_inode.u.socket_i; -#endif - -void tcp_v4_send_check(struct sock *sk, struct tcphdr *th, int len, - struct sk_buff *skb); - -/* - * ALL members must be initialised to prevent gcc-2.7.2.3 miscompilation - */ -#if 0 -struct tcp_hashinfo __cacheline_aligned tcp_hashinfo = { - __tcp_ehash: NULL, - __tcp_bhash: NULL, - __tcp_bhash_size: 0, - __tcp_ehash_size: 0, - __tcp_listening_hash: { NULL, }, - __tcp_lhash_lock: RW_LOCK_UNLOCKED, - __tcp_lhash_users: ATOMIC_INIT(0), - __tcp_lhash_wait: - __WAIT_QUEUE_HEAD_INITIALIZER(tcp_hashinfo.__tcp_lhash_wait), - __tcp_portalloc_lock: SPIN_LOCK_UNLOCKED -}; -#endif - -/* - * This array holds the first and last local port number. - * For high-usage systems, use sysctl to change this to - * 32768-61000 - */ -int sysctl_local_port_range[2] = { 1024, 4999 }; -int tcp_port_rover = (1024 - 1); - -static __inline__ int tcp_hashfn(__u32 laddr, __u16 lport, - __u32 faddr, __u16 fport) -{ - int h = ((laddr ^ lport) ^ (faddr ^ fport)); - h ^= h>>16; - h ^= h>>8; - return h & (tcp_ehash_size - 1); -} - -static __inline__ int tcp_sk_hashfn(struct sock *sk) -{ - __u32 laddr = sk->rcv_saddr; - __u16 lport = sk->num; - __u32 faddr = sk->daddr; - __u16 fport = sk->dport; - - return tcp_hashfn(laddr, lport, faddr, fport); -} - -/* Allocate and initialize a new TCP local port bind bucket. - * The bindhash mutex for snum's hash chain must be held here. - */ -struct tcp_bind_bucket *tcp_bucket_create(struct tcp_bind_hashbucket *head, - unsigned short snum) -{ -#if 0 - struct tcp_bind_bucket *tb; - - tb = kmem_cache_alloc(tcp_bucket_cachep, SLAB_ATOMIC); - if(tb != NULL) { - tb->port = snum; - tb->fastreuse = 0; - tb->owners = NULL; - if((tb->next = head->chain) != NULL) - tb->next->pprev = &tb->next; - head->chain = tb; - tb->pprev = &head->chain; - } - return tb; -#else - return NULL; -#endif -} - -/* Caller must disable local BH processing. */ -static __inline__ void __tcp_inherit_port(struct sock *sk, struct sock *child) -{ -#if 0 - struct tcp_bind_hashbucket *head = &tcp_bhash[tcp_bhashfn(child->num)]; - struct tcp_bind_bucket *tb; - - spin_lock(&head->lock); - tb = (struct tcp_bind_bucket *)sk->prev; - if ((child->bind_next = tb->owners) != NULL) - tb->owners->bind_pprev = &child->bind_next; - tb->owners = child; - child->bind_pprev = &tb->owners; - child->prev = (struct sock *) tb; - spin_unlock(&head->lock); -#endif -} - -__inline__ void tcp_inherit_port(struct sock *sk, struct sock *child) -{ -#if 0 - local_bh_disable(); - __tcp_inherit_port(sk, child); - local_bh_enable(); -#endif -} - -static inline void tcp_bind_hash(struct sock *sk, struct tcp_bind_bucket *tb, unsigned short snum) -{ -#if 0 - sk->num = snum; - if ((sk->bind_next = tb->owners) != NULL) - tb->owners->bind_pprev = &sk->bind_next; - tb->owners = sk; - sk->bind_pprev = &tb->owners; - sk->prev = (struct sock *) tb; -#endif -} - -static inline int tcp_bind_conflict(struct sock *sk, struct tcp_bind_bucket *tb) -{ -#if 0 - struct sock *sk2 = tb->owners; - int sk_reuse = sk->reuse; - - for( ; sk2 != NULL; sk2 = sk2->bind_next) { - if (sk != sk2 && - sk2->reuse <= 1 && - sk->bound_dev_if == sk2->bound_dev_if) { - if (!sk_reuse || - !sk2->reuse || - sk2->state == TCP_LISTEN) { - if (!sk2->rcv_saddr || - !sk->rcv_saddr || - (sk2->rcv_saddr == sk->rcv_saddr)) - break; - } - } - } - return sk2 != NULL; -#else - return 0; -#endif -} - -/* Obtain a reference to a local port for the given sock, - * if snum is zero it means select any available local port. - */ -static int tcp_v4_get_port(struct sock *sk, unsigned short snum) -{ -#if 0 - struct tcp_bind_hashbucket *head; - struct tcp_bind_bucket *tb; - int ret; - - local_bh_disable(); - if (snum == 0) { - int low = sysctl_local_port_range[0]; - int high = sysctl_local_port_range[1]; - int remaining = (high - low) + 1; - int rover; - - spin_lock(&tcp_portalloc_lock); - rover = tcp_port_rover; - do { rover++; - if ((rover < low) || (rover > high)) - rover = low; - head = &tcp_bhash[tcp_bhashfn(rover)]; - spin_lock(&head->lock); - for (tb = head->chain; tb; tb = tb->next) - if (tb->port == rover) - goto next; - break; - next: - spin_unlock(&head->lock); - } while (--remaining > 0); - tcp_port_rover = rover; - spin_unlock(&tcp_portalloc_lock); - - /* Exhausted local port range during search? */ - ret = 1; - if (remaining <= 0) - goto fail; - - /* OK, here is the one we will use. HEAD is - * non-NULL and we hold it's mutex. - */ - snum = rover; - tb = NULL; - } else { - head = &tcp_bhash[tcp_bhashfn(snum)]; - spin_lock(&head->lock); - for (tb = head->chain; tb != NULL; tb = tb->next) - if (tb->port == snum) - break; - } - if (tb != NULL && tb->owners != NULL) { - if (sk->reuse > 1) - goto success; - if (tb->fastreuse > 0 && sk->reuse != 0 && sk->state != TCP_LISTEN) { - goto success; - } else { - ret = 1; - if (tcp_bind_conflict(sk, tb)) - goto fail_unlock; - } - } - ret = 1; - if (tb == NULL && - (tb = tcp_bucket_create(head, snum)) == NULL) - goto fail_unlock; - if (tb->owners == NULL) { - if (sk->reuse && sk->state != TCP_LISTEN) - tb->fastreuse = 1; - else - tb->fastreuse = 0; - } else if (tb->fastreuse && - ((sk->reuse == 0) || (sk->state == TCP_LISTEN))) - tb->fastreuse = 0; -success: - if (sk->prev == NULL) - tcp_bind_hash(sk, tb, snum); - BUG_TRAP(sk->prev == (struct sock *) tb); - ret = 0; - -fail_unlock: - spin_unlock(&head->lock); -fail: - local_bh_enable(); - return ret; -#else - return 0; -#endif -} - -/* Get rid of any references to a local port held by the - * given sock. - */ -__inline__ void __tcp_put_port(struct sock *sk) -{ -#if 0 - struct tcp_bind_hashbucket *head = &tcp_bhash[tcp_bhashfn(sk->num)]; - struct tcp_bind_bucket *tb; - - spin_lock(&head->lock); - tb = (struct tcp_bind_bucket *) sk->prev; - if (sk->bind_next) - sk->bind_next->bind_pprev = sk->bind_pprev; - *(sk->bind_pprev) = sk->bind_next; - sk->prev = NULL; - sk->num = 0; - if (tb->owners == NULL) { - if (tb->next) - tb->next->pprev = tb->pprev; - *(tb->pprev) = tb->next; - kmem_cache_free(tcp_bucket_cachep, tb); - } - spin_unlock(&head->lock); -#endif -} - -void tcp_put_port(struct sock *sk) -{ -#if 0 - local_bh_disable(); - __tcp_put_port(sk); - local_bh_enable(); -#endif -} - -/* This lock without WQ_FLAG_EXCLUSIVE is good on UP and it can be very bad on SMP. - * Look, when several writers sleep and reader wakes them up, all but one - * immediately hit write lock and grab all the cpus. Exclusive sleep solves - * this, _but_ remember, it adds useless work on UP machines (wake up each - * exclusive lock release). It should be ifdefed really. - */ - -void tcp_listen_wlock(void) -{ -#if 0 - write_lock(&tcp_lhash_lock); - - if (atomic_read(&tcp_lhash_users)) { - DECLARE_WAITQUEUE(wait, current); - - add_wait_queue_exclusive(&tcp_lhash_wait, &wait); - for (;;) { - set_current_state(TASK_UNINTERRUPTIBLE); - if (atomic_read(&tcp_lhash_users) == 0) - break; - write_unlock_bh(&tcp_lhash_lock); - schedule(); - write_lock_bh(&tcp_lhash_lock); - } - - __set_current_state(TASK_RUNNING); - remove_wait_queue(&tcp_lhash_wait, &wait); - } -#endif -} - -static __inline__ void __tcp_v4_hash(struct sock *sk, const int listen_possible) -{ -#if 0 - struct sock **skp; - rwlock_t *lock; - - BUG_TRAP(sk->pprev==NULL); - if(listen_possible && sk->state == TCP_LISTEN) { - skp = &tcp_listening_hash[tcp_sk_listen_hashfn(sk)]; - lock = &tcp_lhash_lock; - tcp_listen_wlock(); - } else { - skp = &tcp_ehash[(sk->hashent = tcp_sk_hashfn(sk))].chain; - lock = &tcp_ehash[sk->hashent].lock; - write_lock(lock); - } - if((sk->next = *skp) != NULL) - (*skp)->pprev = &sk->next; - *skp = sk; - sk->pprev = skp; - sock_prot_inc_use(sk->prot); - write_unlock(lock); - if (listen_possible && sk->state == TCP_LISTEN) - wake_up(&tcp_lhash_wait); -#endif -} - -static void tcp_v4_hash(struct sock *sk) -{ -#if 0 - if (sk->state != TCP_CLOSE) { - local_bh_disable(); - __tcp_v4_hash(sk, 1); - local_bh_enable(); - } -#endif -} - -void tcp_unhash(struct sock *sk) -{ -#if 0 - rwlock_t *lock; - - if (!sk->pprev) - goto ende; - - if (sk->state == TCP_LISTEN) { - local_bh_disable(); - tcp_listen_wlock(); - lock = &tcp_lhash_lock; - } else { - struct tcp_ehash_bucket *head = &tcp_ehash[sk->hashent]; - lock = &head->lock; - write_lock_bh(&head->lock); - } - - if(sk->pprev) { - if(sk->next) - sk->next->pprev = sk->pprev; - *sk->pprev = sk->next; - sk->pprev = NULL; - sock_prot_dec_use(sk->prot); - } - write_unlock_bh(lock); - - ende: - if (sk->state == TCP_LISTEN) - wake_up(&tcp_lhash_wait); -#endif -} - -/* Don't inline this cruft. Here are some nice properties to - * exploit here. The BSD API does not allow a listening TCP - * to specify the remote port nor the remote address for the - * connection. So always assume those are both wildcarded - * during the search since they can never be otherwise. - */ -static struct sock *__tcp_v4_lookup_listener(struct sock *sk, u32 daddr, unsigned short hnum, int dif) -{ -#if 0 - struct sock *result = NULL; - int score, hiscore; - - hiscore=0; - for(; sk; sk = sk->next) { - if(sk->num == hnum) { - __u32 rcv_saddr = sk->rcv_saddr; - - score = 1; - if(rcv_saddr) { - if (rcv_saddr != daddr) - continue; - score++; - } - if (sk->bound_dev_if) { - if (sk->bound_dev_if != dif) - continue; - score++; - } - if (score == 3) - return sk; - if (score > hiscore) { - hiscore = score; - result = sk; - } - } - } - return result; -#else - return NULL; -#endif -} - -/* Optimize the common listener case. */ -__inline__ struct sock *tcp_v4_lookup_listener(u32 daddr, unsigned short hnum, int dif) -{ -#if 0 - struct sock *sk; - - read_lock(&tcp_lhash_lock); - sk = tcp_listening_hash[tcp_lhashfn(hnum)]; - if (sk) { - if (sk->num == hnum && - sk->next == NULL && - (!sk->rcv_saddr || sk->rcv_saddr == daddr) && - !sk->bound_dev_if) - goto sherry_cache; - sk = __tcp_v4_lookup_listener(sk, daddr, hnum, dif); - } - if (sk) { -sherry_cache: - sock_hold(sk); - } - read_unlock(&tcp_lhash_lock); - return sk; -#else - return NULL; -#endif -} - -/* Sockets in TCP_CLOSE state are _always_ taken out of the hash, so - * we need not check it for TCP lookups anymore, thanks Alexey. -DaveM - * - * Local BH must be disabled here. - */ - -static inline struct sock *__tcp_v4_lookup_established(u32 saddr, u16 sport, - u32 daddr, u16 hnum, int dif) -{ -#if 0 - struct tcp_ehash_bucket *head; - TCP_V4_ADDR_COOKIE(acookie, saddr, daddr) - __u32 ports = TCP_COMBINED_PORTS(sport, hnum); - struct sock *sk; - int hash; - - /* Optimize here for direct hit, only listening connections can - * have wildcards anyways. - */ - hash = tcp_hashfn(daddr, hnum, saddr, sport); - head = &tcp_ehash[hash]; - read_lock(&head->lock); - for(sk = head->chain; sk; sk = sk->next) { - if(TCP_IPV4_MATCH(sk, acookie, saddr, daddr, ports, dif)) - goto hit; /* You sunk my battleship! */ - } - - /* Must check for a TIME_WAIT'er before going to listener hash. */ - for(sk = (head + tcp_ehash_size)->chain; sk; sk = sk->next) - if(TCP_IPV4_MATCH(sk, acookie, saddr, daddr, ports, dif)) - goto hit; - read_unlock(&head->lock); - - return NULL; - -hit: - sock_hold(sk); - read_unlock(&head->lock); - return sk; -#else - return NULL; -#endif -} - -static inline struct sock *__tcp_v4_lookup(u32 saddr, u16 sport, - u32 daddr, u16 hnum, int dif) -{ -#if 0 - struct sock *sk; - - sk = __tcp_v4_lookup_established(saddr, sport, daddr, hnum, dif); - - if (sk) - return sk; - - return tcp_v4_lookup_listener(daddr, hnum, dif); -#else - return NULL; -#endif -} - -__inline__ struct sock *tcp_v4_lookup(u32 saddr, u16 sport, u32 daddr, u16 dport, int dif) -{ -#if 0 - struct sock *sk; - - local_bh_disable(); - sk = __tcp_v4_lookup(saddr, sport, daddr, ntohs(dport), dif); - local_bh_enable(); - - return sk; -#else - return NULL; -#endif -} - -static inline __u32 tcp_v4_init_sequence(struct sock *sk, struct sk_buff *skb) -{ -#if 0 - return secure_tcp_sequence_number(skb->nh.iph->daddr, - skb->nh.iph->saddr, - skb->h.th->dest, - skb->h.th->source); -#else - return 0; -#endif -} - -/* called with local bh disabled */ -static int __tcp_v4_check_established(struct sock *sk, __u16 lport, - struct tcp_tw_bucket **twp) -{ -#if 0 - u32 daddr = sk->rcv_saddr; - u32 saddr = sk->daddr; - int dif = sk->bound_dev_if; - TCP_V4_ADDR_COOKIE(acookie, saddr, daddr) - __u32 ports = TCP_COMBINED_PORTS(sk->dport, lport); - int hash = tcp_hashfn(daddr, lport, saddr, sk->dport); - struct tcp_ehash_bucket *head = &tcp_ehash[hash]; - struct sock *sk2, **skp; - struct tcp_tw_bucket *tw; - - write_lock(&head->lock); - - /* Check TIME-WAIT sockets first. */ - for(skp = &(head + tcp_ehash_size)->chain; (sk2=*skp) != NULL; - skp = &sk2->next) { - tw = (struct tcp_tw_bucket*)sk2; - - if(TCP_IPV4_MATCH(sk2, acookie, saddr, daddr, ports, dif)) { - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - - /* With PAWS, it is safe from the viewpoint - of data integrity. Even without PAWS it - is safe provided sequence spaces do not - overlap i.e. at data rates <= 80Mbit/sec. - - Actually, the idea is close to VJ's one, - only timestamp cache is held not per host, - but per port pair and TW bucket is used - as state holder. - - If TW bucket has been already destroyed we - fall back to VJ's scheme and use initial - timestamp retrieved from peer table. - */ - if (tw->ts_recent_stamp && - (!twp || (sysctl_tcp_tw_reuse && - xtime.tv_sec - tw->ts_recent_stamp > 1))) { - if ((tp->write_seq = tw->snd_nxt+65535+2) == 0) - tp->write_seq = 1; - tp->ts_recent = tw->ts_recent; - tp->ts_recent_stamp = tw->ts_recent_stamp; - sock_hold(sk2); - skp = &head->chain; - goto unique; - } else - goto not_unique; - } - } - tw = NULL; - - /* And established part... */ - for(skp = &head->chain; (sk2=*skp)!=NULL; skp = &sk2->next) { - if(TCP_IPV4_MATCH(sk2, acookie, saddr, daddr, ports, dif)) - goto not_unique; - } - -unique: - /* Must record num and sport now. Otherwise we will see - * in hash table socket with a funny identity. */ - sk->num = lport; - sk->sport = htons(lport); - BUG_TRAP(sk->pprev==NULL); - if ((sk->next = *skp) != NULL) - (*skp)->pprev = &sk->next; - - *skp = sk; - sk->pprev = skp; - sk->hashent = hash; - sock_prot_inc_use(sk->prot); - write_unlock(&head->lock); - - if (twp) { - *twp = tw; - NET_INC_STATS_BH(TimeWaitRecycled); - } else if (tw) { - /* Silly. Should hash-dance instead... */ - tcp_tw_deschedule(tw); - tcp_timewait_kill(tw); - NET_INC_STATS_BH(TimeWaitRecycled); - - tcp_tw_put(tw); - } - - return 0; - -not_unique: - write_unlock(&head->lock); - return -EADDRNOTAVAIL; -#else - return 0; -#endif -} - -/* - * Bind a port for a connect operation and hash it. - */ -static int tcp_v4_hash_connect(struct sock *sk) -{ -#if 0 - unsigned short snum = sk->num; - struct tcp_bind_hashbucket *head; - struct tcp_bind_bucket *tb; - - if (snum == 0) { - int rover; - int low = sysctl_local_port_range[0]; - int high = sysctl_local_port_range[1]; - int remaining = (high - low) + 1; - struct tcp_tw_bucket *tw = NULL; - - local_bh_disable(); - - /* TODO. Actually it is not so bad idea to remove - * tcp_portalloc_lock before next submission to Linus. - * As soon as we touch this place at all it is time to think. - * - * Now it protects single _advisory_ variable tcp_port_rover, - * hence it is mostly useless. - * Code will work nicely if we just delete it, but - * I am afraid in contented case it will work not better or - * even worse: another cpu just will hit the same bucket - * and spin there. - * So some cpu salt could remove both contention and - * memory pingpong. Any ideas how to do this in a nice way? - */ - spin_lock(&tcp_portalloc_lock); - rover = tcp_port_rover; - - do { - rover++; - if ((rover < low) || (rover > high)) - rover = low; - head = &tcp_bhash[tcp_bhashfn(rover)]; - spin_lock(&head->lock); - - /* Does not bother with rcv_saddr checks, - * because the established check is already - * unique enough. - */ - for (tb = head->chain; tb; tb = tb->next) { - if (tb->port == rover) { - BUG_TRAP(tb->owners != NULL); - if (tb->fastreuse >= 0) - goto next_port; - if (!__tcp_v4_check_established(sk, rover, &tw)) - goto ok; - goto next_port; - } - } - - tb = tcp_bucket_create(head, rover); - if (!tb) { - spin_unlock(&head->lock); - break; - } - tb->fastreuse = -1; - goto ok; - - next_port: - spin_unlock(&head->lock); - } while (--remaining > 0); - tcp_port_rover = rover; - spin_unlock(&tcp_portalloc_lock); - - local_bh_enable(); - - return -EADDRNOTAVAIL; - - ok: - /* All locks still held and bhs disabled */ - tcp_port_rover = rover; - spin_unlock(&tcp_portalloc_lock); - - tcp_bind_hash(sk, tb, rover); - if (!sk->pprev) { - sk->sport = htons(rover); - __tcp_v4_hash(sk, 0); - } - spin_unlock(&head->lock); - - if (tw) { - tcp_tw_deschedule(tw); - tcp_timewait_kill(tw); - tcp_tw_put(tw); - } - - local_bh_enable(); - return 0; - } - - head = &tcp_bhash[tcp_bhashfn(snum)]; - tb = (struct tcp_bind_bucket *)sk->prev; - spin_lock_bh(&head->lock); - if (tb->owners == sk && sk->bind_next == NULL) { - __tcp_v4_hash(sk, 0); - spin_unlock_bh(&head->lock); - return 0; - } else { - int ret; - spin_unlock(&head->lock); - /* No definite answer... Walk to established hash table */ - ret = __tcp_v4_check_established(sk, snum, NULL); - local_bh_enable(); - return ret; - } -#else - return 0; -#endif -} - -/* This will initiate an outgoing connection. */ -int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - struct sockaddr_in *usin = (struct sockaddr_in *) uaddr; - struct rtable *rt; - u32 daddr, nexthop; - int tmp; - int err; - - if (addr_len < sizeof(struct sockaddr_in)) - return(-EINVAL); - - if (usin->sin_family != AF_INET) - return(-EAFNOSUPPORT); - - nexthop = daddr = usin->sin_addr.s_addr; - if (sk->protinfo.af_inet.opt && sk->protinfo.af_inet.opt->srr) { - if (daddr == 0) - return -EINVAL; - nexthop = sk->protinfo.af_inet.opt->faddr; - } - - tmp = ip_route_connect(&rt, nexthop, sk->saddr, - RT_CONN_FLAGS(sk), sk->bound_dev_if); - if (tmp < 0) - return tmp; - - if (rt->rt_flags&(RTCF_MULTICAST|RTCF_BROADCAST)) { - ip_rt_put(rt); - return -ENETUNREACH; - } - - __sk_dst_set(sk, &rt->u.dst); - sk->route_caps = rt->u.dst.dev->features; - - if (!sk->protinfo.af_inet.opt || !sk->protinfo.af_inet.opt->srr) - daddr = rt->rt_dst; - - if (!sk->saddr) - sk->saddr = rt->rt_src; - sk->rcv_saddr = sk->saddr; - - if (tp->ts_recent_stamp && sk->daddr != daddr) { - /* Reset inherited state */ - tp->ts_recent = 0; - tp->ts_recent_stamp = 0; - tp->write_seq = 0; - } - - if (sysctl_tcp_tw_recycle && - !tp->ts_recent_stamp && - rt->rt_dst == daddr) { - struct inet_peer *peer = rt_get_peer(rt); - - /* VJ's idea. We save last timestamp seen from - * the destination in peer table, when entering state TIME-WAIT - * and initialize ts_recent from it, when trying new connection. - */ - - if (peer && peer->tcp_ts_stamp + TCP_PAWS_MSL >= xtime.tv_sec) { - tp->ts_recent_stamp = peer->tcp_ts_stamp; - tp->ts_recent = peer->tcp_ts; - } - } - - sk->dport = usin->sin_port; - sk->daddr = daddr; - - tp->ext_header_len = 0; - if (sk->protinfo.af_inet.opt) - tp->ext_header_len = sk->protinfo.af_inet.opt->optlen; - - tp->mss_clamp = 536; - - /* Socket identity is still unknown (sport may be zero). - * However we set state to SYN-SENT and not releasing socket - * lock select source port, enter ourselves into the hash tables and - * complete initalization after this. - */ - tcp_set_state(sk, TCP_SYN_SENT); - err = tcp_v4_hash_connect(sk); - if (err) - goto failure; - - if (!tp->write_seq) - tp->write_seq = secure_tcp_sequence_number(sk->saddr, sk->daddr, - sk->sport, usin->sin_port); - - sk->protinfo.af_inet.id = tp->write_seq^jiffies; - - err = tcp_connect(sk); - if (err) - goto failure; - - return 0; - -failure: - tcp_set_state(sk, TCP_CLOSE); - __sk_dst_reset(sk); - sk->route_caps = 0; - sk->dport = 0; - return err; -#else - return 0; -#endif -} - -static __inline__ int tcp_v4_iif(struct sk_buff *skb) -{ -#if 0 - return ((struct rtable*)skb->dst)->rt_iif; -#else - return 0; -#endif -} - -static __inline__ unsigned tcp_v4_synq_hash(u32 raddr, u16 rport) -{ -#if 0 - unsigned h = raddr ^ rport; - h ^= h>>16; - h ^= h>>8; - return h&(TCP_SYNQ_HSIZE-1); -#else - return 0; -#endif -} - -static struct open_request *tcp_v4_search_req(struct tcp_opt *tp, - struct open_request ***prevp, - __u16 rport, - __u32 raddr, __u32 laddr) -{ -#if 0 - struct tcp_listen_opt *lopt = tp->listen_opt; - struct open_request *req, **prev; - - for (prev = &lopt->syn_table[tcp_v4_synq_hash(raddr, rport)]; - (req = *prev) != NULL; - prev = &req->dl_next) { - if (req->rmt_port == rport && - req->af.v4_req.rmt_addr == raddr && - req->af.v4_req.loc_addr == laddr && - TCP_INET_FAMILY(req->class->family)) { - BUG_TRAP(req->sk == NULL); - *prevp = prev; - return req; - } - } - - return NULL; -#else - return NULL; -#endif -} - -static void tcp_v4_synq_add(struct sock *sk, struct open_request *req) -{ -#if 0 - struct tcp_opt *tp = &sk->tp_pinfo.af_tcp; - struct tcp_listen_opt *lopt = tp->listen_opt; - unsigned h = tcp_v4_synq_hash(req->af.v4_req.rmt_addr, req->rmt_port); - - req->expires = jiffies + TCP_TIMEOUT_INIT; - req->retrans = 0; - req->sk = NULL; - req->dl_next = lopt->syn_table[h]; - - write_lock(&tp->syn_wait_lock); - lopt->syn_table[h] = req; - write_unlock(&tp->syn_wait_lock); - - tcp_synq_added(sk); -#endif -} - - -/* - * This routine does path mtu discovery as defined in RFC1191. - */ -static inline void do_pmtu_discovery(struct sock *sk, struct iphdr *ip, unsigned mtu) -{ -#if 0 - struct dst_entry *dst; - struct tcp_opt *tp = &sk->tp_pinfo.af_tcp; - - /* We are not interested in TCP_LISTEN and open_requests (SYN-ACKs - * send out by Linux are always <576bytes so they should go through - * unfragmented). - */ - if (sk->state == TCP_LISTEN) - return; - - /* We don't check in the destentry if pmtu discovery is forbidden - * on this route. We just assume that no packet_to_big packets - * are send back when pmtu discovery is not active. - * There is a small race when the user changes this flag in the - * route, but I think that's acceptable. - */ - if ((dst = __sk_dst_check(sk, 0)) == NULL) - return; - - ip_rt_update_pmtu(dst, mtu); - - /* Something is about to be wrong... Remember soft error - * for the case, if this connection will not able to recover. - */ - if (mtu < dst->pmtu && ip_dont_fragment(sk, dst)) - sk->err_soft = EMSGSIZE; - - if (sk->protinfo.af_inet.pmtudisc != IP_PMTUDISC_DONT && - tp->pmtu_cookie > dst->pmtu) { - tcp_sync_mss(sk, dst->pmtu); - - /* Resend the TCP packet because it's - * clear that the old packet has been - * dropped. This is the new "fast" path mtu - * discovery. - */ - tcp_simple_retransmit(sk); - } /* else let the usual retransmit timer handle it */ -#endif -} - -/* - * This routine is called by the ICMP module when it gets some - * sort of error condition. If err < 0 then the socket should - * be closed and the error returned to the user. If err > 0 - * it's just the icmp type << 8 | icmp code. After adjustment - * header points to the first 8 bytes of the tcp header. We need - * to find the appropriate port. - * - * The locking strategy used here is very "optimistic". When - * someone else accesses the socket the ICMP is just dropped - * and for some paths there is no check at all. - * A more general error queue to queue errors for later handling - * is probably better. - * - */ - -void tcp_v4_err(struct sk_buff *skb, u32 info) -{ -#if 0 - struct iphdr *iph = (struct iphdr*)skb->data; - struct tcphdr *th = (struct tcphdr*)(skb->data+(iph->ihl<<2)); - struct tcp_opt *tp; - int type = skb->h.icmph->type; - int code = skb->h.icmph->code; - struct sock *sk; - __u32 seq; - int err; - - if (skb->len < (iph->ihl << 2) + 8) { - ICMP_INC_STATS_BH(IcmpInErrors); - return; - } - - sk = tcp_v4_lookup(iph->daddr, th->dest, iph->saddr, th->source, tcp_v4_iif(skb)); - if (sk == NULL) { - ICMP_INC_STATS_BH(IcmpInErrors); - return; - } - if (sk->state == TCP_TIME_WAIT) { - tcp_tw_put((struct tcp_tw_bucket*)sk); - return; - } - - bh_lock_sock(sk); - /* If too many ICMPs get dropped on busy - * servers this needs to be solved differently. - */ - if (sk->lock.users != 0) - NET_INC_STATS_BH(LockDroppedIcmps); - - if (sk->state == TCP_CLOSE) - goto out; - - tp = &sk->tp_pinfo.af_tcp; - seq = ntohl(th->seq); - if (sk->state != TCP_LISTEN && !between(seq, tp->snd_una, tp->snd_nxt)) { - NET_INC_STATS(OutOfWindowIcmps); - goto out; - } - - switch (type) { - case ICMP_SOURCE_QUENCH: - /* This is deprecated, but if someone generated it, - * we have no reasons to ignore it. - */ - if (sk->lock.users == 0) - tcp_enter_cwr(tp); - goto out; - case ICMP_PARAMETERPROB: - err = EPROTO; - break; - case ICMP_DEST_UNREACH: - if (code > NR_ICMP_UNREACH) - goto out; - - if (code == ICMP_FRAG_NEEDED) { /* PMTU discovery (RFC1191) */ - if (sk->lock.users == 0) - do_pmtu_discovery(sk, iph, info); - goto out; - } - - err = icmp_err_convert[code].errno; - break; - case ICMP_TIME_EXCEEDED: - err = EHOSTUNREACH; - break; - default: - goto out; - } - - switch (sk->state) { - struct open_request *req, **prev; - case TCP_LISTEN: - if (sk->lock.users != 0) - goto out; - - req = tcp_v4_search_req(tp, &prev, - th->dest, - iph->daddr, iph->saddr); - if (!req) - goto out; - - /* ICMPs are not backlogged, hence we cannot get - an established socket here. - */ - BUG_TRAP(req->sk == NULL); - - if (seq != req->snt_isn) { - NET_INC_STATS_BH(OutOfWindowIcmps); - goto out; - } - - /* - * Still in SYN_RECV, just remove it silently. - * There is no good way to pass the error to the newly - * created socket, and POSIX does not want network - * errors returned from accept(). - */ - tcp_synq_drop(sk, req, prev); - goto out; - - case TCP_SYN_SENT: - case TCP_SYN_RECV: /* Cannot happen. - It can f.e. if SYNs crossed. - */ - if (sk->lock.users == 0) { - TCP_INC_STATS_BH(TcpAttemptFails); - sk->err = err; - - sk->error_report(sk); - - tcp_done(sk); - } else { - sk->err_soft = err; - } - goto out; - } - - /* If we've already connected we will keep trying - * until we time out, or the user gives up. - * - * rfc1122 4.2.3.9 allows to consider as hard errors - * only PROTO_UNREACH and PORT_UNREACH (well, FRAG_FAILED too, - * but it is obsoleted by pmtu discovery). - * - * Note, that in modern internet, where routing is unreliable - * and in each dark corner broken firewalls sit, sending random - * errors ordered by their masters even this two messages finally lose - * their original sense (even Linux sends invalid PORT_UNREACHs) - * - * Now we are in compliance with RFCs. - * --ANK (980905) - */ - - if (sk->lock.users == 0 && sk->protinfo.af_inet.recverr) { - sk->err = err; - sk->error_report(sk); - } else { /* Only an error on timeout */ - sk->err_soft = err; - } - -out: - bh_unlock_sock(sk); - sock_put(sk); -#endif -} - -/* This routine computes an IPv4 TCP checksum. */ -void tcp_v4_send_check(struct sock *sk, struct tcphdr *th, int len, - struct sk_buff *skb) -{ -#if 0 - if (skb->ip_summed == CHECKSUM_HW) { - th->check = ~tcp_v4_check(th, len, sk->saddr, sk->daddr, 0); - skb->csum = offsetof(struct tcphdr, check); - } else { - th->check = tcp_v4_check(th, len, sk->saddr, sk->daddr, - csum_partial((char *)th, th->doff<<2, skb->csum)); - } -#endif -} - -/* - * This routine will send an RST to the other tcp. - * - * Someone asks: why I NEVER use socket parameters (TOS, TTL etc.) - * for reset. - * Answer: if a packet caused RST, it is not for a socket - * existing in our system, if it is matched to a socket, - * it is just duplicate segment or bug in other side's TCP. - * So that we build reply only basing on parameters - * arrived with segment. - * Exception: precedence violation. We do not implement it in any case. - */ - -static void tcp_v4_send_reset(struct sk_buff *skb) -{ -#if 0 - struct tcphdr *th = skb->h.th; - struct tcphdr rth; - struct ip_reply_arg arg; - - /* Never send a reset in response to a reset. */ - if (th->rst) - return; - - if (((struct rtable*)skb->dst)->rt_type != RTN_LOCAL) - return; - - /* Swap the send and the receive. */ - memset(&rth, 0, sizeof(struct tcphdr)); - rth.dest = th->source; - rth.source = th->dest; - rth.doff = sizeof(struct tcphdr)/4; - rth.rst = 1; - - if (th->ack) { - rth.seq = th->ack_seq; - } else { - rth.ack = 1; - rth.ack_seq = htonl(ntohl(th->seq) + th->syn + th->fin - + skb->len - (th->doff<<2)); - } - - memset(&arg, 0, sizeof arg); - arg.iov[0].iov_base = (unsigned char *)&rth; - arg.iov[0].iov_len = sizeof rth; - arg.csum = csum_tcpudp_nofold(skb->nh.iph->daddr, - skb->nh.iph->saddr, /*XXX*/ - sizeof(struct tcphdr), - IPPROTO_TCP, - 0); - arg.n_iov = 1; - arg.csumoffset = offsetof(struct tcphdr, check) / 2; - - tcp_socket->sk->protinfo.af_inet.ttl = sysctl_ip_default_ttl; - ip_send_reply(tcp_socket->sk, skb, &arg, sizeof rth); - - TCP_INC_STATS_BH(TcpOutSegs); - TCP_INC_STATS_BH(TcpOutRsts); -#endif -} - -/* The code following below sending ACKs in SYN-RECV and TIME-WAIT states - outside socket context is ugly, certainly. What can I do? - */ - -static void tcp_v4_send_ack(struct sk_buff *skb, u32 seq, u32 ack, u32 win, u32 ts) -{ -#if 0 - struct tcphdr *th = skb->h.th; - struct { - struct tcphdr th; - u32 tsopt[3]; - } rep; - struct ip_reply_arg arg; - - memset(&rep.th, 0, sizeof(struct tcphdr)); - memset(&arg, 0, sizeof arg); - - arg.iov[0].iov_base = (unsigned char *)&rep; - arg.iov[0].iov_len = sizeof(rep.th); - arg.n_iov = 1; - if (ts) { - rep.tsopt[0] = htonl((TCPOPT_NOP << 24) | - (TCPOPT_NOP << 16) | - (TCPOPT_TIMESTAMP << 8) | - TCPOLEN_TIMESTAMP); - rep.tsopt[1] = htonl(tcp_time_stamp); - rep.tsopt[2] = htonl(ts); - arg.iov[0].iov_len = sizeof(rep); - } - - /* Swap the send and the receive. */ - rep.th.dest = th->source; - rep.th.source = th->dest; - rep.th.doff = arg.iov[0].iov_len/4; - rep.th.seq = htonl(seq); - rep.th.ack_seq = htonl(ack); - rep.th.ack = 1; - rep.th.window = htons(win); - - arg.csum = csum_tcpudp_nofold(skb->nh.iph->daddr, - skb->nh.iph->saddr, /*XXX*/ - arg.iov[0].iov_len, - IPPROTO_TCP, - 0); - arg.csumoffset = offsetof(struct tcphdr, check) / 2; - - ip_send_reply(tcp_socket->sk, skb, &arg, arg.iov[0].iov_len); - - TCP_INC_STATS_BH(TcpOutSegs); -#endif -} - -static void tcp_v4_timewait_ack(struct sock *sk, struct sk_buff *skb) -{ -#if 0 - struct tcp_tw_bucket *tw = (struct tcp_tw_bucket *)sk; - - tcp_v4_send_ack(skb, tw->snd_nxt, tw->rcv_nxt, - tw->rcv_wnd>>tw->rcv_wscale, tw->ts_recent); - - tcp_tw_put(tw); -#endif -} - -static void tcp_v4_or_send_ack(struct sk_buff *skb, struct open_request *req) -{ -#if 0 - tcp_v4_send_ack(skb, req->snt_isn+1, req->rcv_isn+1, req->rcv_wnd, - req->ts_recent); -#endif -} - -static struct dst_entry* tcp_v4_route_req(struct sock *sk, struct open_request *req) -{ -#if 0 - struct rtable *rt; - struct ip_options *opt; - - opt = req->af.v4_req.opt; - if(ip_route_output(&rt, ((opt && opt->srr) ? - opt->faddr : - req->af.v4_req.rmt_addr), - req->af.v4_req.loc_addr, - RT_CONN_FLAGS(sk), sk->bound_dev_if)) { - IP_INC_STATS_BH(IpOutNoRoutes); - return NULL; - } - if (opt && opt->is_strictroute && rt->rt_dst != rt->rt_gateway) { - ip_rt_put(rt); - IP_INC_STATS_BH(IpOutNoRoutes); - return NULL; - } - return &rt->u.dst; -#else - return NULL; -#endif -} - -/* - * Send a SYN-ACK after having received an ACK. - * This still operates on a open_request only, not on a big - * socket. - */ -static int tcp_v4_send_synack(struct sock *sk, struct open_request *req, - struct dst_entry *dst) -{ -#if 0 - int err = -1; - struct sk_buff * skb; - - /* First, grab a route. */ - if (dst == NULL && - (dst = tcp_v4_route_req(sk, req)) == NULL) - goto out; - - skb = tcp_make_synack(sk, dst, req); - - if (skb) { - struct tcphdr *th = skb->h.th; - - th->check = tcp_v4_check(th, skb->len, - req->af.v4_req.loc_addr, req->af.v4_req.rmt_addr, - csum_partial((char *)th, skb->len, skb->csum)); - - err = ip_build_and_send_pkt(skb, sk, req->af.v4_req.loc_addr, - req->af.v4_req.rmt_addr, req->af.v4_req.opt); - if (err == NET_XMIT_CN) - err = 0; - } - -out: - dst_release(dst); - return err; -#else - return 0; -#endif -} - -/* - * IPv4 open_request destructor. - */ -static void tcp_v4_or_free(struct open_request *req) -{ -#if 0 - if (req->af.v4_req.opt) - kfree(req->af.v4_req.opt); -#endif -} - -static inline void syn_flood_warning(struct sk_buff *skb) -{ -#if 0 - static unsigned long warntime; - - if (jiffies - warntime > HZ*60) { - warntime = jiffies; - printk(KERN_INFO - "possible SYN flooding on port %d. Sending cookies.\n", - ntohs(skb->h.th->dest)); - } -#endif -} - -/* - * Save and compile IPv4 options into the open_request if needed. - */ -static inline struct ip_options * -tcp_v4_save_options(struct sock *sk, struct sk_buff *skb) -{ -#if 0 - struct ip_options *opt = &(IPCB(skb)->opt); - struct ip_options *dopt = NULL; - - if (opt && opt->optlen) { - int opt_size = optlength(opt); - dopt = kmalloc(opt_size, GFP_ATOMIC); - if (dopt) { - if (ip_options_echo(dopt, skb)) { - kfree(dopt); - dopt = NULL; - } - } - } - return dopt; -#else - return NULL; -#endif -} - -/* - * Maximum number of SYN_RECV sockets in queue per LISTEN socket. - * One SYN_RECV socket costs about 80bytes on a 32bit machine. - * It would be better to replace it with a global counter for all sockets - * but then some measure against one socket starving all other sockets - * would be needed. - * - * It was 128 by default. Experiments with real servers show, that - * it is absolutely not enough even at 100conn/sec. 256 cures most - * of problems. This value is adjusted to 128 for very small machines - * (<=32Mb of memory) and to 1024 on normal or better ones (>=256Mb). - * Further increasing requires to change hash table size. - */ -int sysctl_max_syn_backlog = 256; - -#if 0 -struct or_calltable or_ipv4 = { - PF_INET, - tcp_v4_send_synack, - tcp_v4_or_send_ack, - tcp_v4_or_free, - tcp_v4_send_reset -}; -#endif - -int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb) -{ -#if 0 - struct tcp_opt tp; - struct open_request *req; - __u32 saddr = skb->nh.iph->saddr; - __u32 daddr = skb->nh.iph->daddr; - __u32 isn = TCP_SKB_CB(skb)->when; - struct dst_entry *dst = NULL; -#ifdef CONFIG_SYN_COOKIES - int want_cookie = 0; -#else -#define want_cookie 0 /* Argh, why doesn't gcc optimize this :( */ -#endif - - /* Never answer to SYNs send to broadcast or multicast */ - if (((struct rtable *)skb->dst)->rt_flags & - (RTCF_BROADCAST|RTCF_MULTICAST)) - goto drop; - - /* TW buckets are converted to open requests without - * limitations, they conserve resources and peer is - * evidently real one. - */ - if (tcp_synq_is_full(sk) && !isn) { -#ifdef CONFIG_SYN_COOKIES - if (sysctl_tcp_syncookies) { - want_cookie = 1; - } else -#endif - goto drop; - } - - /* Accept backlog is full. If we have already queued enough - * of warm entries in syn queue, drop request. It is better than - * clogging syn queue with openreqs with exponentially increasing - * timeout. - */ - if (tcp_acceptq_is_full(sk) && tcp_synq_young(sk) > 1) - goto drop; - - req = tcp_openreq_alloc(); - if (req == NULL) - goto drop; - - tcp_clear_options(&tp); - tp.mss_clamp = 536; - tp.user_mss = sk->tp_pinfo.af_tcp.user_mss; - - tcp_parse_options(skb, &tp, 0); - - if (want_cookie) { - tcp_clear_options(&tp); - tp.saw_tstamp = 0; - } - - if (tp.saw_tstamp && tp.rcv_tsval == 0) { - /* Some OSes (unknown ones, but I see them on web server, which - * contains information interesting only for windows' - * users) do not send their stamp in SYN. It is easy case. - * We simply do not advertise TS support. - */ - tp.saw_tstamp = 0; - tp.tstamp_ok = 0; - } - tp.tstamp_ok = tp.saw_tstamp; - - tcp_openreq_init(req, &tp, skb); - - req->af.v4_req.loc_addr = daddr; - req->af.v4_req.rmt_addr = saddr; - req->af.v4_req.opt = tcp_v4_save_options(sk, skb); - req->class = &or_ipv4; - if (!want_cookie) - TCP_ECN_create_request(req, skb->h.th); - - if (want_cookie) { -#ifdef CONFIG_SYN_COOKIES - syn_flood_warning(skb); -#endif - isn = cookie_v4_init_sequence(sk, skb, &req->mss); - } else if (isn == 0) { - struct inet_peer *peer = NULL; - - /* VJ's idea. We save last timestamp seen - * from the destination in peer table, when entering - * state TIME-WAIT, and check against it before - * accepting new connection request. - * - * If "isn" is not zero, this request hit alive - * timewait bucket, so that all the necessary checks - * are made in the function processing timewait state. - */ - if (tp.saw_tstamp && - sysctl_tcp_tw_recycle && - (dst = tcp_v4_route_req(sk, req)) != NULL && - (peer = rt_get_peer((struct rtable*)dst)) != NULL && - peer->v4daddr == saddr) { - if (xtime.tv_sec < peer->tcp_ts_stamp + TCP_PAWS_MSL && - (s32)(peer->tcp_ts - req->ts_recent) > TCP_PAWS_WINDOW) { - NET_INC_STATS_BH(PAWSPassiveRejected); - dst_release(dst); - goto drop_and_free; - } - } - /* Kill the following clause, if you dislike this way. */ - else if (!sysctl_tcp_syncookies && - (sysctl_max_syn_backlog - tcp_synq_len(sk) - < (sysctl_max_syn_backlog>>2)) && - (!peer || !peer->tcp_ts_stamp) && - (!dst || !dst->rtt)) { - /* Without syncookies last quarter of - * backlog is filled with destinations, proven to be alive. - * It means that we continue to communicate - * to destinations, already remembered - * to the moment of synflood. - */ - NETDEBUG(if (net_ratelimit()) \ - printk(KERN_DEBUG "TCP: drop open request from %u.%u.%u.%u/%u\n", \ - NIPQUAD(saddr), ntohs(skb->h.th->source))); - dst_release(dst); - goto drop_and_free; - } - - isn = tcp_v4_init_sequence(sk, skb); - } - req->snt_isn = isn; - - if (tcp_v4_send_synack(sk, req, dst)) - goto drop_and_free; - - if (want_cookie) { - tcp_openreq_free(req); - } else { - tcp_v4_synq_add(sk, req); - } - return 0; - -drop_and_free: - tcp_openreq_free(req); -drop: - TCP_INC_STATS_BH(TcpAttemptFails); - return 0; -#else - return 0; -#endif -} - - -/* - * The three way handshake has completed - we got a valid synack - - * now create the new socket. - */ -struct sock * tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb, - struct open_request *req, - struct dst_entry *dst) -{ -#if 0 - struct tcp_opt *newtp; - struct sock *newsk; - - if (tcp_acceptq_is_full(sk)) - goto exit_overflow; - - if (dst == NULL && - (dst = tcp_v4_route_req(sk, req)) == NULL) - goto exit; - - newsk = tcp_create_openreq_child(sk, req, skb); - if (!newsk) - goto exit; - - newsk->dst_cache = dst; - newsk->route_caps = dst->dev->features; - - newtp = &(newsk->tp_pinfo.af_tcp); - newsk->daddr = req->af.v4_req.rmt_addr; - newsk->saddr = req->af.v4_req.loc_addr; - newsk->rcv_saddr = req->af.v4_req.loc_addr; - newsk->protinfo.af_inet.opt = req->af.v4_req.opt; - req->af.v4_req.opt = NULL; - newsk->protinfo.af_inet.mc_index = tcp_v4_iif(skb); - newsk->protinfo.af_inet.mc_ttl = skb->nh.iph->ttl; - newtp->ext_header_len = 0; - if (newsk->protinfo.af_inet.opt) - newtp->ext_header_len = newsk->protinfo.af_inet.opt->optlen; - newsk->protinfo.af_inet.id = newtp->write_seq^jiffies; - - tcp_sync_mss(newsk, dst->pmtu); - newtp->advmss = dst->advmss; - tcp_initialize_rcv_mss(newsk); - - __tcp_v4_hash(newsk, 0); - __tcp_inherit_port(sk, newsk); - - return newsk; - -exit_overflow: - NET_INC_STATS_BH(ListenOverflows); -exit: - NET_INC_STATS_BH(ListenDrops); - dst_release(dst); - return NULL; -#else - return NULL; -#endif -} - -static struct sock *tcp_v4_hnd_req(struct sock *sk,struct sk_buff *skb) -{ -#if 0 - struct open_request *req, **prev; - struct tcphdr *th = skb->h.th; - struct iphdr *iph = skb->nh.iph; - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - struct sock *nsk; - - /* Find possible connection requests. */ - req = tcp_v4_search_req(tp, &prev, - th->source, - iph->saddr, iph->daddr); - if (req) - return tcp_check_req(sk, skb, req, prev); - - nsk = __tcp_v4_lookup_established(skb->nh.iph->saddr, - th->source, - skb->nh.iph->daddr, - ntohs(th->dest), - tcp_v4_iif(skb)); - - if (nsk) { - if (nsk->state != TCP_TIME_WAIT) { - bh_lock_sock(nsk); - return nsk; - } - tcp_tw_put((struct tcp_tw_bucket*)nsk); - return NULL; - } - -#ifdef CONFIG_SYN_COOKIES - if (!th->rst && !th->syn && th->ack) - sk = cookie_v4_check(sk, skb, &(IPCB(skb)->opt)); -#endif - return sk; -#else - return NULL; -#endif -} - -static int tcp_v4_checksum_init(struct sk_buff *skb) -{ -#if 0 - if (skb->ip_summed == CHECKSUM_HW) { - skb->ip_summed = CHECKSUM_UNNECESSARY; - if (!tcp_v4_check(skb->h.th,skb->len,skb->nh.iph->saddr, - skb->nh.iph->daddr,skb->csum)) - return 0; - - NETDEBUG(if (net_ratelimit()) printk(KERN_DEBUG "hw tcp v4 csum failed\n")); - skb->ip_summed = CHECKSUM_NONE; - } - if (skb->len <= 76) { - if (tcp_v4_check(skb->h.th,skb->len,skb->nh.iph->saddr, - skb->nh.iph->daddr, - skb_checksum(skb, 0, skb->len, 0))) - return -1; - skb->ip_summed = CHECKSUM_UNNECESSARY; - } else { - skb->csum = ~tcp_v4_check(skb->h.th,skb->len,skb->nh.iph->saddr, - skb->nh.iph->daddr,0); - } - return 0; -#else - return 0; -#endif -} - - -/* The socket must have it's spinlock held when we get - * here. - * - * We have a potential double-lock case here, so even when - * doing backlog processing we use the BH locking scheme. - * This is because we cannot sleep with the original spinlock - * held. - */ -int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb) -{ -#if 0 -#ifdef CONFIG_FILTER - struct sk_filter *filter = sk->filter; - if (filter && sk_filter(skb, filter)) - goto discard; -#endif /* CONFIG_FILTER */ - - IP_INC_STATS_BH(IpInDelivers); - - if (sk->state == TCP_ESTABLISHED) { /* Fast path */ - TCP_CHECK_TIMER(sk); - if (tcp_rcv_established(sk, skb, skb->h.th, skb->len)) - goto reset; - TCP_CHECK_TIMER(sk); - return 0; - } - - if (skb->len < (skb->h.th->doff<<2) || tcp_checksum_complete(skb)) - goto csum_err; - - if (sk->state == TCP_LISTEN) { - struct sock *nsk = tcp_v4_hnd_req(sk, skb); - if (!nsk) - goto discard; - - if (nsk != sk) { - if (tcp_child_process(sk, nsk, skb)) - goto reset; - return 0; - } - } - - TCP_CHECK_TIMER(sk); - if (tcp_rcv_state_process(sk, skb, skb->h.th, skb->len)) - goto reset; - TCP_CHECK_TIMER(sk); - return 0; - -reset: - tcp_v4_send_reset(skb); -discard: - kfree_skb(skb); - /* Be careful here. If this function gets more complicated and - * gcc suffers from register pressure on the x86, sk (in %ebx) - * might be destroyed here. This current version compiles correctly, - * but you have been warned. - */ - return 0; - -csum_err: - TCP_INC_STATS_BH(TcpInErrs); - goto discard; -#else - return 0; -#endif -} - -/* - * From tcp_input.c - */ - -int tcp_v4_rcv(struct sk_buff *skb) -{ -#if 0 - struct tcphdr *th; - struct sock *sk; - int ret; - - if (skb->pkt_type!=PACKET_HOST) - goto discard_it; - - /* Count it even if it's bad */ - TCP_INC_STATS_BH(TcpInSegs); - - if (!pskb_may_pull(skb, sizeof(struct tcphdr))) - goto discard_it; - - th = skb->h.th; - - if (th->doff < sizeof(struct tcphdr)/4) - goto bad_packet; - if (!pskb_may_pull(skb, th->doff*4)) - goto discard_it; - - /* An explanation is required here, I think. - * Packet length and doff are validated by header prediction, - * provided case of th->doff==0 is elimineted. - * So, we defer the checks. */ - if ((skb->ip_summed != CHECKSUM_UNNECESSARY && - tcp_v4_checksum_init(skb) < 0)) - goto bad_packet; - - th = skb->h.th; - TCP_SKB_CB(skb)->seq = ntohl(th->seq); - TCP_SKB_CB(skb)->end_seq = (TCP_SKB_CB(skb)->seq + th->syn + th->fin + - skb->len - th->doff*4); - TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq); - TCP_SKB_CB(skb)->when = 0; - TCP_SKB_CB(skb)->flags = skb->nh.iph->tos; - TCP_SKB_CB(skb)->sacked = 0; - - sk = __tcp_v4_lookup(skb->nh.iph->saddr, th->source, - skb->nh.iph->daddr, ntohs(th->dest), tcp_v4_iif(skb)); - - if (!sk) - goto no_tcp_socket; - -process: - if(!ipsec_sk_policy(sk,skb)) - goto discard_and_relse; - - if (sk->state == TCP_TIME_WAIT) - goto do_time_wait; - - skb->dev = NULL; - - bh_lock_sock(sk); - ret = 0; - if (!sk->lock.users) { - if (!tcp_prequeue(sk, skb)) - ret = tcp_v4_do_rcv(sk, skb); - } else - sk_add_backlog(sk, skb); - bh_unlock_sock(sk); - - sock_put(sk); - - return ret; - -no_tcp_socket: - if (skb->len < (th->doff<<2) || tcp_checksum_complete(skb)) { -bad_packet: - TCP_INC_STATS_BH(TcpInErrs); - } else { - tcp_v4_send_reset(skb); - } - -discard_it: - /* Discard frame. */ - kfree_skb(skb); - return 0; - -discard_and_relse: - sock_put(sk); - goto discard_it; - -do_time_wait: - if (skb->len < (th->doff<<2) || tcp_checksum_complete(skb)) { - TCP_INC_STATS_BH(TcpInErrs); - goto discard_and_relse; - } - switch(tcp_timewait_state_process((struct tcp_tw_bucket *)sk, - skb, th, skb->len)) { - case TCP_TW_SYN: - { - struct sock *sk2; - - sk2 = tcp_v4_lookup_listener(skb->nh.iph->daddr, ntohs(th->dest), tcp_v4_iif(skb)); - if (sk2 != NULL) { - tcp_tw_deschedule((struct tcp_tw_bucket *)sk); - tcp_timewait_kill((struct tcp_tw_bucket *)sk); - tcp_tw_put((struct tcp_tw_bucket *)sk); - sk = sk2; - goto process; - } - /* Fall through to ACK */ - } - case TCP_TW_ACK: - tcp_v4_timewait_ack(sk, skb); - break; - case TCP_TW_RST: - goto no_tcp_socket; - case TCP_TW_SUCCESS:; - } - goto discard_it; -#endif -} - -/* With per-bucket locks this operation is not-atomic, so that - * this version is not worse. - */ -static void __tcp_v4_rehash(struct sock *sk) -{ -#if 0 - sk->prot->unhash(sk); - sk->prot->hash(sk); -#endif -} - -static int tcp_v4_reselect_saddr(struct sock *sk) -{ -#if 0 - int err; - struct rtable *rt; - __u32 old_saddr = sk->saddr; - __u32 new_saddr; - __u32 daddr = sk->daddr; - - if(sk->protinfo.af_inet.opt && sk->protinfo.af_inet.opt->srr) - daddr = sk->protinfo.af_inet.opt->faddr; - - /* Query new route. */ - err = ip_route_connect(&rt, daddr, 0, - RT_TOS(sk->protinfo.af_inet.tos)|sk->localroute, - sk->bound_dev_if); - if (err) - return err; - - __sk_dst_set(sk, &rt->u.dst); - sk->route_caps = rt->u.dst.dev->features; - - new_saddr = rt->rt_src; - - if (new_saddr == old_saddr) - return 0; - - if (sysctl_ip_dynaddr > 1) { - printk(KERN_INFO "tcp_v4_rebuild_header(): shifting sk->saddr " - "from %d.%d.%d.%d to %d.%d.%d.%d\n", - NIPQUAD(old_saddr), - NIPQUAD(new_saddr)); - } - - sk->saddr = new_saddr; - sk->rcv_saddr = new_saddr; - - /* XXX The only one ugly spot where we need to - * XXX really change the sockets identity after - * XXX it has entered the hashes. -DaveM - * - * Besides that, it does not check for connection - * uniqueness. Wait for troubles. - */ - __tcp_v4_rehash(sk); - return 0; -#else - return 0; -#endif -} - -int tcp_v4_rebuild_header(struct sock *sk) -{ -#if 0 - struct rtable *rt = (struct rtable *)__sk_dst_check(sk, 0); - u32 daddr; - int err; - - /* Route is OK, nothing to do. */ - if (rt != NULL) - return 0; - - /* Reroute. */ - daddr = sk->daddr; - if(sk->protinfo.af_inet.opt && sk->protinfo.af_inet.opt->srr) - daddr = sk->protinfo.af_inet.opt->faddr; - - err = ip_route_output(&rt, daddr, sk->saddr, - RT_CONN_FLAGS(sk), sk->bound_dev_if); - if (!err) { - __sk_dst_set(sk, &rt->u.dst); - sk->route_caps = rt->u.dst.dev->features; - return 0; - } - - /* Routing failed... */ - sk->route_caps = 0; - - if (!sysctl_ip_dynaddr || - sk->state != TCP_SYN_SENT || - (sk->userlocks & SOCK_BINDADDR_LOCK) || - (err = tcp_v4_reselect_saddr(sk)) != 0) - sk->err_soft=-err; - - return err; -#else - return 0; -#endif -} - -static void v4_addr2sockaddr(struct sock *sk, struct sockaddr * uaddr) -{ -#if 0 - struct sockaddr_in *sin = (struct sockaddr_in *) uaddr; - - sin->sin_family = AF_INET; - sin->sin_addr.s_addr = sk->daddr; - sin->sin_port = sk->dport; -#endif -} - -/* VJ's idea. Save last timestamp seen from this destination - * and hold it at least for normal timewait interval to use for duplicate - * segment detection in subsequent connections, before they enter synchronized - * state. - */ - -int tcp_v4_remember_stamp(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &sk->tp_pinfo.af_tcp; - struct rtable *rt = (struct rtable*)__sk_dst_get(sk); - struct inet_peer *peer = NULL; - int release_it = 0; - - if (rt == NULL || rt->rt_dst != sk->daddr) { - peer = inet_getpeer(sk->daddr, 1); - release_it = 1; - } else { - if (rt->peer == NULL) - rt_bind_peer(rt, 1); - peer = rt->peer; - } - - if (peer) { - if ((s32)(peer->tcp_ts - tp->ts_recent) <= 0 || - (peer->tcp_ts_stamp + TCP_PAWS_MSL < xtime.tv_sec && - peer->tcp_ts_stamp <= tp->ts_recent_stamp)) { - peer->tcp_ts_stamp = tp->ts_recent_stamp; - peer->tcp_ts = tp->ts_recent; - } - if (release_it) - inet_putpeer(peer); - return 1; - } - - return 0; -#else - return 0; -#endif -} - -int tcp_v4_tw_remember_stamp(struct tcp_tw_bucket *tw) -{ -#if 0 - struct inet_peer *peer = NULL; - - peer = inet_getpeer(tw->daddr, 1); - - if (peer) { - if ((s32)(peer->tcp_ts - tw->ts_recent) <= 0 || - (peer->tcp_ts_stamp + TCP_PAWS_MSL < xtime.tv_sec && - peer->tcp_ts_stamp <= tw->ts_recent_stamp)) { - peer->tcp_ts_stamp = tw->ts_recent_stamp; - peer->tcp_ts = tw->ts_recent; - } - inet_putpeer(peer); - return 1; - } - - return 0; -#else - return 0; -#endif -} - -#if 0 -struct tcp_func ipv4_specific = { - ip_queue_xmit, - tcp_v4_send_check, - tcp_v4_rebuild_header, - tcp_v4_conn_request, - tcp_v4_syn_recv_sock, - tcp_v4_remember_stamp, - sizeof(struct iphdr), - - ip_setsockopt, - ip_getsockopt, - v4_addr2sockaddr, - sizeof(struct sockaddr_in) -}; -#endif - -/* NOTE: A lot of things set to zero explicitly by call to - * sk_alloc() so need not be done here. - */ -static int tcp_v4_init_sock(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - - skb_queue_head_init(&tp->out_of_order_queue); - tcp_init_xmit_timers(sk); - tcp_prequeue_init(tp); - - tp->rto = TCP_TIMEOUT_INIT; - tp->mdev = TCP_TIMEOUT_INIT; - - /* So many TCP implementations out there (incorrectly) count the - * initial SYN frame in their delayed-ACK and congestion control - * algorithms that we must have the following bandaid to talk - * efficiently to them. -DaveM - */ - tp->snd_cwnd = 2; - - /* See draft-stevens-tcpca-spec-01 for discussion of the - * initialization of these values. - */ - tp->snd_ssthresh = 0x7fffffff; /* Infinity */ - tp->snd_cwnd_clamp = ~0; - tp->mss_cache = 536; - - tp->reordering = sysctl_tcp_reordering; - - sk->state = TCP_CLOSE; - - sk->write_space = tcp_write_space; - sk->use_write_queue = 1; - - sk->tp_pinfo.af_tcp.af_specific = &ipv4_specific; - - sk->sndbuf = sysctl_tcp_wmem[1]; - sk->rcvbuf = sysctl_tcp_rmem[1]; - - atomic_inc(&tcp_sockets_allocated); - - return 0; -#else - return 0; -#endif -} - -static int tcp_v4_destroy_sock(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - - tcp_clear_xmit_timers(sk); - - /* Cleanup up the write buffer. */ - tcp_writequeue_purge(sk); - - /* Cleans up our, hopefully empty, out_of_order_queue. */ - __skb_queue_purge(&tp->out_of_order_queue); - - /* Clean prequeue, it must be empty really */ - __skb_queue_purge(&tp->ucopy.prequeue); - - /* Clean up a referenced TCP bind bucket. */ - if(sk->prev != NULL) - tcp_put_port(sk); - - /* If sendmsg cached page exists, toss it. */ - if (tp->sndmsg_page != NULL) - __free_page(tp->sndmsg_page); - - atomic_dec(&tcp_sockets_allocated); - - return 0; -#else - return 0; -#endif -} - -/* Proc filesystem TCP sock list dumping. */ -static void get_openreq(struct sock *sk, struct open_request *req, char *tmpbuf, int i, int uid) -{ -#if 0 - int ttd = req->expires - jiffies; - - sprintf(tmpbuf, "%4d: %08X:%04X %08X:%04X" - " %02X %08X:%08X %02X:%08X %08X %5d %8d %u %d %p", - i, - req->af.v4_req.loc_addr, - ntohs(sk->sport), - req->af.v4_req.rmt_addr, - ntohs(req->rmt_port), - TCP_SYN_RECV, - 0,0, /* could print option size, but that is af dependent. */ - 1, /* timers active (only the expire timer) */ - ttd, - req->retrans, - uid, - 0, /* non standard timer */ - 0, /* open_requests have no inode */ - atomic_read(&sk->refcnt), - req - ); -#endif -} - -static void get_tcp_sock(struct sock *sp, char *tmpbuf, int i) -{ -#if 0 - unsigned int dest, src; - __u16 destp, srcp; - int timer_active; - unsigned long timer_expires; - struct tcp_opt *tp = &sp->tp_pinfo.af_tcp; - - dest = sp->daddr; - src = sp->rcv_saddr; - destp = ntohs(sp->dport); - srcp = ntohs(sp->sport); - if (tp->pending == TCP_TIME_RETRANS) { - timer_active = 1; - timer_expires = tp->timeout; - } else if (tp->pending == TCP_TIME_PROBE0) { - timer_active = 4; - timer_expires = tp->timeout; - } else if (timer_pending(&sp->timer)) { - timer_active = 2; - timer_expires = sp->timer.expires; - } else { - timer_active = 0; - timer_expires = jiffies; - } - - sprintf(tmpbuf, "%4d: %08X:%04X %08X:%04X" - " %02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %p %u %u %u %u %d", - i, src, srcp, dest, destp, sp->state, - tp->write_seq-tp->snd_una, tp->rcv_nxt-tp->copied_seq, - timer_active, timer_expires-jiffies, - tp->retransmits, - sock_i_uid(sp), - tp->probes_out, - sock_i_ino(sp), - atomic_read(&sp->refcnt), sp, - tp->rto, tp->ack.ato, (tp->ack.quick<<1)|tp->ack.pingpong, - tp->snd_cwnd, tp->snd_ssthresh>=0xFFFF?-1:tp->snd_ssthresh - ); -#endif -} - -static void get_timewait_sock(struct tcp_tw_bucket *tw, char *tmpbuf, int i) -{ -#if 0 - unsigned int dest, src; - __u16 destp, srcp; - int ttd = tw->ttd - jiffies; - - if (ttd < 0) - ttd = 0; - - dest = tw->daddr; - src = tw->rcv_saddr; - destp = ntohs(tw->dport); - srcp = ntohs(tw->sport); - - sprintf(tmpbuf, "%4d: %08X:%04X %08X:%04X" - " %02X %08X:%08X %02X:%08X %08X %5d %8d %d %d %p", - i, src, srcp, dest, destp, tw->substate, 0, 0, - 3, ttd, 0, 0, 0, 0, - atomic_read(&tw->refcnt), tw); -#endif -} - -#define TMPSZ 150 - -int tcp_get_info(char *buffer, char **start, off_t offset, int length) -{ -#if 0 - int len = 0, num = 0, i; - off_t begin, pos = 0; - char tmpbuf[TMPSZ+1]; - - if (offset < TMPSZ) - len += sprintf(buffer, "%-*s\n", TMPSZ-1, - " sl local_address rem_address st tx_queue " - "rx_queue tr tm->when retrnsmt uid timeout inode"); - - pos = TMPSZ; - - /* First, walk listening socket table. */ - tcp_listen_lock(); - for(i = 0; i < TCP_LHTABLE_SIZE; i++) { - struct sock *sk; - struct tcp_listen_opt *lopt; - int k; - - for (sk = tcp_listening_hash[i]; sk; sk = sk->next, num++) { - struct open_request *req; - int uid; - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - - if (!TCP_INET_FAMILY(sk->family)) - goto skip_listen; - - pos += TMPSZ; - if (pos >= offset) { - get_tcp_sock(sk, tmpbuf, num); - len += sprintf(buffer+len, "%-*s\n", TMPSZ-1, tmpbuf); - if (pos >= offset + length) { - tcp_listen_unlock(); - goto out_no_bh; - } - } - -skip_listen: - uid = sock_i_uid(sk); - read_lock_bh(&tp->syn_wait_lock); - lopt = tp->listen_opt; - if (lopt && lopt->qlen != 0) { - for (k=0; k<TCP_SYNQ_HSIZE; k++) { - for (req = lopt->syn_table[k]; req; req = req->dl_next, num++) { - if (!TCP_INET_FAMILY(req->class->family)) - continue; - - pos += TMPSZ; - if (pos <= offset) - continue; - get_openreq(sk, req, tmpbuf, num, uid); - len += sprintf(buffer+len, "%-*s\n", TMPSZ-1, tmpbuf); - if (pos >= offset + length) { - read_unlock_bh(&tp->syn_wait_lock); - tcp_listen_unlock(); - goto out_no_bh; - } - } - } - } - read_unlock_bh(&tp->syn_wait_lock); - - /* Completed requests are in normal socket hash table */ - } - } - tcp_listen_unlock(); - - local_bh_disable(); - - /* Next, walk established hash chain. */ - for (i = 0; i < tcp_ehash_size; i++) { - struct tcp_ehash_bucket *head = &tcp_ehash[i]; - struct sock *sk; - struct tcp_tw_bucket *tw; - - read_lock(&head->lock); - for(sk = head->chain; sk; sk = sk->next, num++) { - if (!TCP_INET_FAMILY(sk->family)) - continue; - pos += TMPSZ; - if (pos <= offset) - continue; - get_tcp_sock(sk, tmpbuf, num); - len += sprintf(buffer+len, "%-*s\n", TMPSZ-1, tmpbuf); - if (pos >= offset + length) { - read_unlock(&head->lock); - goto out; - } - } - for (tw = (struct tcp_tw_bucket *)tcp_ehash[i+tcp_ehash_size].chain; - tw != NULL; - tw = (struct tcp_tw_bucket *)tw->next, num++) { - if (!TCP_INET_FAMILY(tw->family)) - continue; - pos += TMPSZ; - if (pos <= offset) - continue; - get_timewait_sock(tw, tmpbuf, num); - len += sprintf(buffer+len, "%-*s\n", TMPSZ-1, tmpbuf); - if (pos >= offset + length) { - read_unlock(&head->lock); - goto out; - } - } - read_unlock(&head->lock); - } - -out: - local_bh_enable(); -out_no_bh: - - begin = len - (pos - offset); - *start = buffer + begin; - len -= begin; - if (len > length) - len = length; - if (len < 0) - len = 0; - return len; -#endif -} - -struct proto tcp_prot = { - name: "TCP", - close: tcp_close, - connect: tcp_v4_connect, - disconnect: tcp_disconnect, - accept: tcp_accept, - ioctl: tcp_ioctl, - init: tcp_v4_init_sock, - destroy: tcp_v4_destroy_sock, - shutdown: tcp_shutdown, - setsockopt: tcp_setsockopt, - getsockopt: tcp_getsockopt, - sendmsg: tcp_sendmsg, - recvmsg: tcp_recvmsg, - backlog_rcv: tcp_v4_do_rcv, - hash: tcp_v4_hash, - unhash: tcp_unhash, - get_port: tcp_v4_get_port, -}; - - - -void tcp_v4_init(struct net_proto_family *ops) -{ -#if 0 - int err; - - tcp_inode.i_mode = S_IFSOCK; - tcp_inode.i_sock = 1; - tcp_inode.i_uid = 0; - tcp_inode.i_gid = 0; - init_waitqueue_head(&tcp_inode.i_wait); - init_waitqueue_head(&tcp_inode.u.socket_i.wait); - - tcp_socket->inode = &tcp_inode; - tcp_socket->state = SS_UNCONNECTED; - tcp_socket->type=SOCK_RAW; - - if ((err=ops->create(tcp_socket, IPPROTO_TCP))<0) - panic("Failed to create the TCP control socket.\n"); - tcp_socket->sk->allocation=GFP_ATOMIC; - tcp_socket->sk->protinfo.af_inet.ttl = MAXTTL; - - /* Unhash it so that IP input processing does not even - * see it, we do not wish this socket to see incoming - * packets. - */ - tcp_socket->sk->prot->unhash(tcp_socket->sk); -#endif -} diff --git a/reactos/drivers/net/tcpip/transport/tcp/tcp_output.c b/reactos/drivers/net/tcpip/transport/tcp/tcp_output.c deleted file mode 100755 index c85c2aca940..00000000000 --- a/reactos/drivers/net/tcpip/transport/tcp/tcp_output.c +++ /dev/null @@ -1,1549 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS TCP/IP protocol driver - * FILE: transport/tcp/tcp_output.c - * PURPOSE: Transmission Control Protocol - * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net) - * REVISIONS: - * CSH 15-01-2003 Imported from linux kernel 2.4.20 - */ - -/* - * INET An implementation of the TCP/IP protocol suite for the LINUX - * operating system. INET is implemented using the BSD Socket - * interface as the means of communication with the user level. - * - * Implementation of the Transmission Control Protocol(TCP). - * - * Version: $Id: tcp_output.c,v 1.2 2003/07/24 18:14:59 royce Exp $ - * - * Authors: Ross Biro, <bir7@leland.Stanford.Edu> - * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> - * Mark Evans, <evansmp@uhura.aston.ac.uk> - * Corey Minyard <wf-rch!minyard@relay.EU.net> - * Florian La Roche, <flla@stud.uni-sb.de> - * Charles Hedrick, <hedrick@klinzhai.rutgers.edu> - * Linus Torvalds, <torvalds@cs.helsinki.fi> - * Alan Cox, <gw4pts@gw4pts.ampr.org> - * Matthew Dillon, <dillon@apollo.west.oic.com> - * Arnt Gulbrandsen, <agulbra@nvg.unit.no> - * Jorge Cwik, <jorge@laser.satlink.net> - */ - -/* - * Changes: Pedro Roque : Retransmit queue handled by TCP. - * : Fragmentation on mtu decrease - * : Segment collapse on retransmit - * : AF independence - * - * Linus Torvalds : send_delayed_ack - * David S. Miller : Charge memory using the right skb - * during syn/ack processing. - * David S. Miller : Output engine completely rewritten. - * Andrea Arcangeli: SYNACK carry ts_recent in tsecr. - * Cacophonix Gaul : draft-minshall-nagle-01 - * J Hadi Salim : ECN support - * - */ - -#if 0 -#include <net/tcp.h> - -#include <linux/compiler.h> -#include <linux/smp_lock.h> -#else -#include "linux.h" -#include "tcpcore.h" -#endif - -/* People can turn this off for buggy TCP's found in printers etc. */ -int sysctl_tcp_retrans_collapse = 1; - -static __inline__ -void update_send_head(struct sock *sk, struct tcp_opt *tp, struct sk_buff *skb) -{ - tp->send_head = skb->next; - if (tp->send_head == (struct sk_buff *) &sk->write_queue) - tp->send_head = NULL; - tp->snd_nxt = TCP_SKB_CB(skb)->end_seq; - if (tp->packets_out++ == 0) - tcp_reset_xmit_timer(sk, TCP_TIME_RETRANS, tp->rto); -} - -/* SND.NXT, if window was not shrunk. - * If window has been shrunk, what should we make? It is not clear at all. - * Using SND.UNA we will fail to open window, SND.NXT is out of window. :-( - * Anything in between SND.UNA...SND.UNA+SND.WND also can be already - * invalid. OK, let's make this for now: - */ -static __inline__ __u32 tcp_acceptable_seq(struct sock *sk, struct tcp_opt *tp) -{ - if (!before(tp->snd_una+tp->snd_wnd, tp->snd_nxt)) - return tp->snd_nxt; - else - return tp->snd_una+tp->snd_wnd; -} - -/* Calculate mss to advertise in SYN segment. - * RFC1122, RFC1063, draft-ietf-tcpimpl-pmtud-01 state that: - * - * 1. It is independent of path mtu. - * 2. Ideally, it is maximal possible segment size i.e. 65535-40. - * 3. For IPv4 it is reasonable to calculate it from maximal MTU of - * attached devices, because some buggy hosts are confused by - * large MSS. - * 4. We do not make 3, we advertise MSS, calculated from first - * hop device mtu, but allow to raise it to ip_rt_min_advmss. - * This may be overriden via information stored in routing table. - * 5. Value 65535 for MSS is valid in IPv6 and means "as large as possible, - * probably even Jumbo". - */ -static __u16 tcp_advertise_mss(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - struct dst_entry *dst = __sk_dst_get(sk); - int mss = tp->advmss; - - if (dst && dst->advmss < mss) { - mss = dst->advmss; - tp->advmss = mss; - } - - return (__u16)mss; -#else - return 0; -#endif -} - -/* RFC2861. Reset CWND after idle period longer RTO to "restart window". - * This is the first part of cwnd validation mechanism. */ -static void tcp_cwnd_restart(struct tcp_opt *tp) -{ -#if 0 - s32 delta = tcp_time_stamp - tp->lsndtime; - u32 restart_cwnd = tcp_init_cwnd(tp); - u32 cwnd = tp->snd_cwnd; - - tp->snd_ssthresh = tcp_current_ssthresh(tp); - restart_cwnd = min(restart_cwnd, cwnd); - - while ((delta -= tp->rto) > 0 && cwnd > restart_cwnd) - cwnd >>= 1; - tp->snd_cwnd = max(cwnd, restart_cwnd); - tp->snd_cwnd_stamp = tcp_time_stamp; - tp->snd_cwnd_used = 0; -#endif -} - -static __inline__ void tcp_event_data_sent(struct tcp_opt *tp, struct sk_buff *skb) -{ -#if 0 - u32 now = tcp_time_stamp; - - if (!tp->packets_out && (s32)(now - tp->lsndtime) > tp->rto) - tcp_cwnd_restart(tp); - - tp->lsndtime = now; - - /* If it is a reply for ato after last received - * packet, enter pingpong mode. - */ - if ((u32)(now - tp->ack.lrcvtime) < tp->ack.ato) - tp->ack.pingpong = 1; -#endif -} - -static __inline__ void tcp_event_ack_sent(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - - tcp_dec_quickack_mode(tp); - tcp_clear_xmit_timer(sk, TCP_TIME_DACK); -#endif -} - -/* Chose a new window to advertise, update state in tcp_opt for the - * socket, and return result with RFC1323 scaling applied. The return - * value can be stuffed directly into th->window for an outgoing - * frame. - */ -static __inline__ u16 tcp_select_window(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - u32 cur_win = tcp_receive_window(tp); - u32 new_win = __tcp_select_window(sk); - - /* Never shrink the offered window */ - if(new_win < cur_win) { - /* Danger Will Robinson! - * Don't update rcv_wup/rcv_wnd here or else - * we will not be able to advertise a zero - * window in time. --DaveM - * - * Relax Will Robinson. - */ - new_win = cur_win; - } - tp->rcv_wnd = new_win; - tp->rcv_wup = tp->rcv_nxt; - - /* RFC1323 scaling applied */ - new_win >>= tp->rcv_wscale; - - /* If we advertise zero window, disable fast path. */ - if (new_win == 0) - tp->pred_flags = 0; - - return new_win; -#else - return 0; -#endif -} - - -/* This routine actually transmits TCP packets queued in by - * tcp_do_sendmsg(). This is used by both the initial - * transmission and possible later retransmissions. - * All SKB's seen here are completely headerless. It is our - * job to build the TCP header, and pass the packet down to - * IP so it can do the same plus pass the packet off to the - * device. - * - * We are working here with either a clone of the original - * SKB, or a fresh unique copy made by the retransmit engine. - */ -int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb) -{ -#if 0 - if(skb != NULL) { - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - struct tcp_skb_cb *tcb = TCP_SKB_CB(skb); - int tcp_header_size = tp->tcp_header_len; - struct tcphdr *th; - int sysctl_flags; - int err; - -#define SYSCTL_FLAG_TSTAMPS 0x1 -#define SYSCTL_FLAG_WSCALE 0x2 -#define SYSCTL_FLAG_SACK 0x4 - - sysctl_flags = 0; - if (tcb->flags & TCPCB_FLAG_SYN) { - tcp_header_size = sizeof(struct tcphdr) + TCPOLEN_MSS; - if(sysctl_tcp_timestamps) { - tcp_header_size += TCPOLEN_TSTAMP_ALIGNED; - sysctl_flags |= SYSCTL_FLAG_TSTAMPS; - } - if(sysctl_tcp_window_scaling) { - tcp_header_size += TCPOLEN_WSCALE_ALIGNED; - sysctl_flags |= SYSCTL_FLAG_WSCALE; - } - if(sysctl_tcp_sack) { - sysctl_flags |= SYSCTL_FLAG_SACK; - if(!(sysctl_flags & SYSCTL_FLAG_TSTAMPS)) - tcp_header_size += TCPOLEN_SACKPERM_ALIGNED; - } - } else if (tp->eff_sacks) { - /* A SACK is 2 pad bytes, a 2 byte header, plus - * 2 32-bit sequence numbers for each SACK block. - */ - tcp_header_size += (TCPOLEN_SACK_BASE_ALIGNED + - (tp->eff_sacks * TCPOLEN_SACK_PERBLOCK)); - } - th = (struct tcphdr *) skb_push(skb, tcp_header_size); - skb->h.th = th; - skb_set_owner_w(skb, sk); - - /* Build TCP header and checksum it. */ - th->source = sk->sport; - th->dest = sk->dport; - th->seq = htonl(tcb->seq); - th->ack_seq = htonl(tp->rcv_nxt); - *(((__u16 *)th) + 6) = htons(((tcp_header_size >> 2) << 12) | tcb->flags); - if (tcb->flags & TCPCB_FLAG_SYN) { - /* RFC1323: The window in SYN & SYN/ACK segments - * is never scaled. - */ - th->window = htons(tp->rcv_wnd); - } else { - th->window = htons(tcp_select_window(sk)); - } - th->check = 0; - th->urg_ptr = 0; - - if (tp->urg_mode && - between(tp->snd_up, tcb->seq+1, tcb->seq+0xFFFF)) { - th->urg_ptr = htons(tp->snd_up-tcb->seq); - th->urg = 1; - } - - if (tcb->flags & TCPCB_FLAG_SYN) { - tcp_syn_build_options((__u32 *)(th + 1), - tcp_advertise_mss(sk), - (sysctl_flags & SYSCTL_FLAG_TSTAMPS), - (sysctl_flags & SYSCTL_FLAG_SACK), - (sysctl_flags & SYSCTL_FLAG_WSCALE), - tp->rcv_wscale, - tcb->when, - tp->ts_recent); - } else { - tcp_build_and_update_options((__u32 *)(th + 1), - tp, tcb->when); - - TCP_ECN_send(sk, tp, skb, tcp_header_size); - } - tp->af_specific->send_check(sk, th, skb->len, skb); - - if (tcb->flags & TCPCB_FLAG_ACK) - tcp_event_ack_sent(sk); - - if (skb->len != tcp_header_size) - tcp_event_data_sent(tp, skb); - - TCP_INC_STATS(TcpOutSegs); - - err = tp->af_specific->queue_xmit(skb); - if (err <= 0) - return err; - - tcp_enter_cwr(tp); - - /* NET_XMIT_CN is special. It does not guarantee, - * that this packet is lost. It tells that device - * is about to start to drop packets or already - * drops some packets of the same priority and - * invokes us to send less aggressively. - */ - return err == NET_XMIT_CN ? 0 : err; - } - return -ENOBUFS; -#undef SYSCTL_FLAG_TSTAMPS -#undef SYSCTL_FLAG_WSCALE -#undef SYSCTL_FLAG_SACK -#else - return 0; -#endif -} - - -/* This is the main buffer sending routine. We queue the buffer - * and decide whether to queue or transmit now. - * - * NOTE: probe0 timer is not checked, do not forget tcp_push_pending_frames, - * otherwise socket can stall. - */ -void tcp_send_skb(struct sock *sk, struct sk_buff *skb, int force_queue, unsigned cur_mss) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - - /* Advance write_seq and place onto the write_queue. */ - tp->write_seq = TCP_SKB_CB(skb)->end_seq; - __skb_queue_tail(&sk->write_queue, skb); - tcp_charge_skb(sk, skb); - - if (!force_queue && tp->send_head == NULL && tcp_snd_test(tp, skb, cur_mss, tp->nonagle)) { - /* Send it out now. */ - TCP_SKB_CB(skb)->when = tcp_time_stamp; - if (tcp_transmit_skb(sk, skb_clone(skb, sk->allocation)) == 0) { - tp->snd_nxt = TCP_SKB_CB(skb)->end_seq; - tcp_minshall_update(tp, cur_mss, skb); - if (tp->packets_out++ == 0) - tcp_reset_xmit_timer(sk, TCP_TIME_RETRANS, tp->rto); - return; - } - } - /* Queue it, remembering where we must start sending. */ - if (tp->send_head == NULL) - tp->send_head = skb; -#endif -} - -/* Send _single_ skb sitting at the send head. This function requires - * true push pending frames to setup probe timer etc. - */ -void tcp_push_one(struct sock *sk, unsigned cur_mss) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - struct sk_buff *skb = tp->send_head; - - if (tcp_snd_test(tp, skb, cur_mss, 1)) { - /* Send it out now. */ - TCP_SKB_CB(skb)->when = tcp_time_stamp; - if (tcp_transmit_skb(sk, skb_clone(skb, sk->allocation)) == 0) { - tp->send_head = NULL; - tp->snd_nxt = TCP_SKB_CB(skb)->end_seq; - if (tp->packets_out++ == 0) - tcp_reset_xmit_timer(sk, TCP_TIME_RETRANS, tp->rto); - return; - } - } -#endif -} - -/* Split fragmented skb to two parts at length len. */ - -static void skb_split(struct sk_buff *skb, struct sk_buff *skb1, u32 len) -{ -#if 0 - int i; - int pos = skb->len - skb->data_len; - - if (len < pos) { - /* Split line is inside header. */ - memcpy(skb_put(skb1, pos-len), skb->data + len, pos-len); - - /* And move data appendix as is. */ - for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) - skb_shinfo(skb1)->frags[i] = skb_shinfo(skb)->frags[i]; - - skb_shinfo(skb1)->nr_frags = skb_shinfo(skb)->nr_frags; - skb_shinfo(skb)->nr_frags = 0; - - skb1->data_len = skb->data_len; - skb1->len += skb1->data_len; - skb->data_len = 0; - skb->len = len; - skb->tail = skb->data+len; - } else { - int k = 0; - int nfrags = skb_shinfo(skb)->nr_frags; - - /* Second chunk has no header, nothing to copy. */ - - skb_shinfo(skb)->nr_frags = 0; - skb1->len = skb1->data_len = skb->len - len; - skb->len = len; - skb->data_len = len - pos; - - for (i=0; i<nfrags; i++) { - int size = skb_shinfo(skb)->frags[i].size; - if (pos + size > len) { - skb_shinfo(skb1)->frags[k] = skb_shinfo(skb)->frags[i]; - - if (pos < len) { - /* Split frag. - * We have to variants in this case: - * 1. Move all the frag to the second - * part, if it is possible. F.e. - * this approach is mandatory for TUX, - * where splitting is expensive. - * 2. Split is accurately. We make this. - */ - get_page(skb_shinfo(skb)->frags[i].page); - skb_shinfo(skb1)->frags[0].page_offset += (len-pos); - skb_shinfo(skb1)->frags[0].size -= (len-pos); - skb_shinfo(skb)->frags[i].size = len-pos; - skb_shinfo(skb)->nr_frags++; - } - k++; - } else { - skb_shinfo(skb)->nr_frags++; - } - pos += size; - } - skb_shinfo(skb1)->nr_frags = k; - } -#endif -} - -/* Function to create two new TCP segments. Shrinks the given segment - * to the specified size and appends a new segment with the rest of the - * packet to the list. This won't be called frequently, I hope. - * Remember, these are still headerless SKBs at this point. - */ -static int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len) -{ -#if 0 - struct tcp_opt *tp = &sk->tp_pinfo.af_tcp; - struct sk_buff *buff; - int nsize = skb->len - len; - u16 flags; - - if (skb_cloned(skb) && - skb_is_nonlinear(skb) && - pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) - return -ENOMEM; - - /* Get a new skb... force flag on. */ - buff = tcp_alloc_skb(sk, nsize, GFP_ATOMIC); - if (buff == NULL) - return -ENOMEM; /* We'll just try again later. */ - tcp_charge_skb(sk, buff); - - /* Correct the sequence numbers. */ - TCP_SKB_CB(buff)->seq = TCP_SKB_CB(skb)->seq + len; - TCP_SKB_CB(buff)->end_seq = TCP_SKB_CB(skb)->end_seq; - TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(buff)->seq; - - /* PSH and FIN should only be set in the second packet. */ - flags = TCP_SKB_CB(skb)->flags; - TCP_SKB_CB(skb)->flags = flags & ~(TCPCB_FLAG_FIN|TCPCB_FLAG_PSH); - TCP_SKB_CB(buff)->flags = flags; - TCP_SKB_CB(buff)->sacked = TCP_SKB_CB(skb)->sacked&(TCPCB_LOST|TCPCB_EVER_RETRANS|TCPCB_AT_TAIL); - if (TCP_SKB_CB(buff)->sacked&TCPCB_LOST) { - tp->lost_out++; - tp->left_out++; - } - TCP_SKB_CB(skb)->sacked &= ~TCPCB_AT_TAIL; - - if (!skb_shinfo(skb)->nr_frags && skb->ip_summed != CHECKSUM_HW) { - /* Copy and checksum data tail into the new buffer. */ - buff->csum = csum_partial_copy_nocheck(skb->data + len, skb_put(buff, nsize), - nsize, 0); - - skb_trim(skb, len); - - skb->csum = csum_block_sub(skb->csum, buff->csum, len); - } else { - skb->ip_summed = CHECKSUM_HW; - skb_split(skb, buff, len); - } - - buff->ip_summed = skb->ip_summed; - - /* Looks stupid, but our code really uses when of - * skbs, which it never sent before. --ANK - */ - TCP_SKB_CB(buff)->when = TCP_SKB_CB(skb)->when; - - /* Link BUFF into the send queue. */ - __skb_append(skb, buff); - - return 0; -#else - return 0; -#endif -} - -/* This function synchronize snd mss to current pmtu/exthdr set. - - tp->user_mss is mss set by user by TCP_MAXSEG. It does NOT counts - for TCP options, but includes only bare TCP header. - - tp->mss_clamp is mss negotiated at connection setup. - It is minumum of user_mss and mss received with SYN. - It also does not include TCP options. - - tp->pmtu_cookie is last pmtu, seen by this function. - - tp->mss_cache is current effective sending mss, including - all tcp options except for SACKs. It is evaluated, - taking into account current pmtu, but never exceeds - tp->mss_clamp. - - NOTE1. rfc1122 clearly states that advertised MSS - DOES NOT include either tcp or ip options. - - NOTE2. tp->pmtu_cookie and tp->mss_cache are READ ONLY outside - this function. --ANK (980731) - */ - -int tcp_sync_mss(struct sock *sk, u32 pmtu) -{ -#if 0 - struct tcp_opt *tp = &sk->tp_pinfo.af_tcp; - int mss_now; - - /* Calculate base mss without TCP options: - It is MMS_S - sizeof(tcphdr) of rfc1122 - */ - - mss_now = pmtu - tp->af_specific->net_header_len - sizeof(struct tcphdr); - - /* Clamp it (mss_clamp does not include tcp options) */ - if (mss_now > tp->mss_clamp) - mss_now = tp->mss_clamp; - - /* Now subtract optional transport overhead */ - mss_now -= tp->ext_header_len; - - /* Then reserve room for full set of TCP options and 8 bytes of data */ - if (mss_now < 48) - mss_now = 48; - - /* Now subtract TCP options size, not including SACKs */ - mss_now -= tp->tcp_header_len - sizeof(struct tcphdr); - - /* Bound mss with half of window */ - if (tp->max_window && mss_now > (tp->max_window>>1)) - mss_now = max((tp->max_window>>1), 68U - tp->tcp_header_len); - - /* And store cached results */ - tp->pmtu_cookie = pmtu; - tp->mss_cache = mss_now; - return mss_now; -#else - return 0; -#endif -} - - -/* This routine writes packets to the network. It advances the - * send_head. This happens as incoming acks open up the remote - * window for us. - * - * Returns 1, if no segments are in flight and we have queued segments, but - * cannot send anything now because of SWS or another problem. - */ -int tcp_write_xmit(struct sock *sk, int nonagle) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - unsigned int mss_now; - - /* If we are closed, the bytes will have to remain here. - * In time closedown will finish, we empty the write queue and all - * will be happy. - */ - if(sk->state != TCP_CLOSE) { - struct sk_buff *skb; - int sent_pkts = 0; - - /* Account for SACKS, we may need to fragment due to this. - * It is just like the real MSS changing on us midstream. - * We also handle things correctly when the user adds some - * IP options mid-stream. Silly to do, but cover it. - */ - mss_now = tcp_current_mss(sk); - - while((skb = tp->send_head) && - tcp_snd_test(tp, skb, mss_now, tcp_skb_is_last(sk, skb) ? nonagle : 1)) { - if (skb->len > mss_now) { - if (tcp_fragment(sk, skb, mss_now)) - break; - } - - TCP_SKB_CB(skb)->when = tcp_time_stamp; - if (tcp_transmit_skb(sk, skb_clone(skb, GFP_ATOMIC))) - break; - /* Advance the send_head. This one is sent out. */ - update_send_head(sk, tp, skb); - tcp_minshall_update(tp, mss_now, skb); - sent_pkts = 1; - } - - if (sent_pkts) { - tcp_cwnd_validate(sk, tp); - return 0; - } - - return !tp->packets_out && tp->send_head; - } - return 0; -#else - return 0; -#endif -} - -/* This function returns the amount that we can raise the - * usable window based on the following constraints - * - * 1. The window can never be shrunk once it is offered (RFC 793) - * 2. We limit memory per socket - * - * RFC 1122: - * "the suggested [SWS] avoidance algorithm for the receiver is to keep - * RECV.NEXT + RCV.WIN fixed until: - * RCV.BUFF - RCV.USER - RCV.WINDOW >= min(1/2 RCV.BUFF, MSS)" - * - * i.e. don't raise the right edge of the window until you can raise - * it at least MSS bytes. - * - * Unfortunately, the recommended algorithm breaks header prediction, - * since header prediction assumes th->window stays fixed. - * - * Strictly speaking, keeping th->window fixed violates the receiver - * side SWS prevention criteria. The problem is that under this rule - * a stream of single byte packets will cause the right side of the - * window to always advance by a single byte. - * - * Of course, if the sender implements sender side SWS prevention - * then this will not be a problem. - * - * BSD seems to make the following compromise: - * - * If the free space is less than the 1/4 of the maximum - * space available and the free space is less than 1/2 mss, - * then set the window to 0. - * [ Actually, bsd uses MSS and 1/4 of maximal _window_ ] - * Otherwise, just prevent the window from shrinking - * and from being larger than the largest representable value. - * - * This prevents incremental opening of the window in the regime - * where TCP is limited by the speed of the reader side taking - * data out of the TCP receive queue. It does nothing about - * those cases where the window is constrained on the sender side - * because the pipeline is full. - * - * BSD also seems to "accidentally" limit itself to windows that are a - * multiple of MSS, at least until the free space gets quite small. - * This would appear to be a side effect of the mbuf implementation. - * Combining these two algorithms results in the observed behavior - * of having a fixed window size at almost all times. - * - * Below we obtain similar behavior by forcing the offered window to - * a multiple of the mss when it is feasible to do so. - * - * Note, we don't "adjust" for TIMESTAMP or SACK option bytes. - * Regular options like TIMESTAMP are taken into account. - */ -u32 __tcp_select_window(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &sk->tp_pinfo.af_tcp; - /* MSS for the peer's data. Previous verions used mss_clamp - * here. I don't know if the value based on our guesses - * of peer's MSS is better for the performance. It's more correct - * but may be worse for the performance because of rcv_mss - * fluctuations. --SAW 1998/11/1 - */ - int mss = tp->ack.rcv_mss; - int free_space = tcp_space(sk); - int full_space = min_t(int, tp->window_clamp, tcp_full_space(sk)); - int window; - - if (mss > full_space) - mss = full_space; - - if (free_space < full_space/2) { - tp->ack.quick = 0; - - if (tcp_memory_pressure) - tp->rcv_ssthresh = min(tp->rcv_ssthresh, 4U*tp->advmss); - - if (free_space < mss) - return 0; - } - - if (free_space > tp->rcv_ssthresh) - free_space = tp->rcv_ssthresh; - - /* Get the largest window that is a nice multiple of mss. - * Window clamp already applied above. - * If our current window offering is within 1 mss of the - * free space we just keep it. This prevents the divide - * and multiply from happening most of the time. - * We also don't do any window rounding when the free space - * is too small. - */ - window = tp->rcv_wnd; - if (window <= free_space - mss || window > free_space) - window = (free_space/mss)*mss; - - return window; -#else - return 0; -#endif -} - -/* Attempt to collapse two adjacent SKB's during retransmission. */ -static void tcp_retrans_try_collapse(struct sock *sk, struct sk_buff *skb, int mss_now) -{ -#if 0 - struct tcp_opt *tp = &sk->tp_pinfo.af_tcp; - struct sk_buff *next_skb = skb->next; - - /* The first test we must make is that neither of these two - * SKB's are still referenced by someone else. - */ - if(!skb_cloned(skb) && !skb_cloned(next_skb)) { - int skb_size = skb->len, next_skb_size = next_skb->len; - u16 flags = TCP_SKB_CB(skb)->flags; - - /* Also punt if next skb has been SACK'd. */ - if(TCP_SKB_CB(next_skb)->sacked & TCPCB_SACKED_ACKED) - return; - - /* Next skb is out of window. */ - if (after(TCP_SKB_CB(next_skb)->end_seq, tp->snd_una+tp->snd_wnd)) - return; - - /* Punt if not enough space exists in the first SKB for - * the data in the second, or the total combined payload - * would exceed the MSS. - */ - if ((next_skb_size > skb_tailroom(skb)) || - ((skb_size + next_skb_size) > mss_now)) - return; - - /* Ok. We will be able to collapse the packet. */ - __skb_unlink(next_skb, next_skb->list); - - if (next_skb->ip_summed == CHECKSUM_HW) - skb->ip_summed = CHECKSUM_HW; - - if (skb->ip_summed != CHECKSUM_HW) { - memcpy(skb_put(skb, next_skb_size), next_skb->data, next_skb_size); - skb->csum = csum_block_add(skb->csum, next_skb->csum, skb_size); - } - - /* Update sequence range on original skb. */ - TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(next_skb)->end_seq; - - /* Merge over control information. */ - flags |= TCP_SKB_CB(next_skb)->flags; /* This moves PSH/FIN etc. over */ - TCP_SKB_CB(skb)->flags = flags; - - /* All done, get rid of second SKB and account for it so - * packet counting does not break. - */ - TCP_SKB_CB(skb)->sacked |= TCP_SKB_CB(next_skb)->sacked&(TCPCB_EVER_RETRANS|TCPCB_AT_TAIL); - if (TCP_SKB_CB(next_skb)->sacked&TCPCB_SACKED_RETRANS) - tp->retrans_out--; - if (TCP_SKB_CB(next_skb)->sacked&TCPCB_LOST) { - tp->lost_out--; - tp->left_out--; - } - /* Reno case is special. Sigh... */ - if (!tp->sack_ok && tp->sacked_out) { - tp->sacked_out--; - tp->left_out--; - } - - /* Not quite right: it can be > snd.fack, but - * it is better to underestimate fackets. - */ - if (tp->fackets_out) - tp->fackets_out--; - tcp_free_skb(sk, next_skb); - tp->packets_out--; - } -#endif -} - -/* Do a simple retransmit without using the backoff mechanisms in - * tcp_timer. This is used for path mtu discovery. - * The socket is already locked here. - */ -void tcp_simple_retransmit(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - struct sk_buff *skb; - unsigned int mss = tcp_current_mss(sk); - int lost = 0; - - for_retrans_queue(skb, sk, tp) { - if (skb->len > mss && - !(TCP_SKB_CB(skb)->sacked&TCPCB_SACKED_ACKED)) { - if (TCP_SKB_CB(skb)->sacked&TCPCB_SACKED_RETRANS) { - TCP_SKB_CB(skb)->sacked &= ~TCPCB_SACKED_RETRANS; - tp->retrans_out--; - } - if (!(TCP_SKB_CB(skb)->sacked&TCPCB_LOST)) { - TCP_SKB_CB(skb)->sacked |= TCPCB_LOST; - tp->lost_out++; - lost = 1; - } - } - } - - if (!lost) - return; - - tcp_sync_left_out(tp); - - /* Don't muck with the congestion window here. - * Reason is that we do not increase amount of _data_ - * in network, but units changed and effective - * cwnd/ssthresh really reduced now. - */ - if (tp->ca_state != TCP_CA_Loss) { - tp->high_seq = tp->snd_nxt; - tp->snd_ssthresh = tcp_current_ssthresh(tp); - tp->prior_ssthresh = 0; - tp->undo_marker = 0; - tp->ca_state = TCP_CA_Loss; - } - tcp_xmit_retransmit_queue(sk); -#endif -} - -/* This retransmits one SKB. Policy decisions and retransmit queue - * state updates are done by the caller. Returns non-zero if an - * error occurred which prevented the send. - */ -int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - unsigned int cur_mss = tcp_current_mss(sk); - int err; - - /* Do not sent more than we queued. 1/4 is reserved for possible - * copying overhead: frgagmentation, tunneling, mangling etc. - */ - if (atomic_read(&sk->wmem_alloc) > min(sk->wmem_queued+(sk->wmem_queued>>2),sk->sndbuf)) - return -EAGAIN; - - /* If receiver has shrunk his window, and skb is out of - * new window, do not retransmit it. The exception is the - * case, when window is shrunk to zero. In this case - * our retransmit serves as a zero window probe. - */ - if (!before(TCP_SKB_CB(skb)->seq, tp->snd_una+tp->snd_wnd) - && TCP_SKB_CB(skb)->seq != tp->snd_una) - return -EAGAIN; - - if(skb->len > cur_mss) { - if(tcp_fragment(sk, skb, cur_mss)) - return -ENOMEM; /* We'll try again later. */ - - /* New SKB created, account for it. */ - tp->packets_out++; - } - - /* Collapse two adjacent packets if worthwhile and we can. */ - if(!(TCP_SKB_CB(skb)->flags & TCPCB_FLAG_SYN) && - (skb->len < (cur_mss >> 1)) && - (skb->next != tp->send_head) && - (skb->next != (struct sk_buff *)&sk->write_queue) && - (skb_shinfo(skb)->nr_frags == 0 && skb_shinfo(skb->next)->nr_frags == 0) && - (sysctl_tcp_retrans_collapse != 0)) - tcp_retrans_try_collapse(sk, skb, cur_mss); - - if(tp->af_specific->rebuild_header(sk)) - return -EHOSTUNREACH; /* Routing failure or similar. */ - - /* Some Solaris stacks overoptimize and ignore the FIN on a - * retransmit when old data is attached. So strip it off - * since it is cheap to do so and saves bytes on the network. - */ - if(skb->len > 0 && - (TCP_SKB_CB(skb)->flags & TCPCB_FLAG_FIN) && - tp->snd_una == (TCP_SKB_CB(skb)->end_seq - 1)) { - if (!pskb_trim(skb, 0)) { - TCP_SKB_CB(skb)->seq = TCP_SKB_CB(skb)->end_seq - 1; - skb->ip_summed = CHECKSUM_NONE; - skb->csum = 0; - } - } - - /* Make a copy, if the first transmission SKB clone we made - * is still in somebody's hands, else make a clone. - */ - TCP_SKB_CB(skb)->when = tcp_time_stamp; - - err = tcp_transmit_skb(sk, (skb_cloned(skb) ? - pskb_copy(skb, GFP_ATOMIC): - skb_clone(skb, GFP_ATOMIC))); - - if (err == 0) { - /* Update global TCP statistics. */ - TCP_INC_STATS(TcpRetransSegs); - -#if FASTRETRANS_DEBUG > 0 - if (TCP_SKB_CB(skb)->sacked&TCPCB_SACKED_RETRANS) { - if (net_ratelimit()) - printk(KERN_DEBUG "retrans_out leaked.\n"); - } -#endif - TCP_SKB_CB(skb)->sacked |= TCPCB_RETRANS; - tp->retrans_out++; - - /* Save stamp of the first retransmit. */ - if (!tp->retrans_stamp) - tp->retrans_stamp = TCP_SKB_CB(skb)->when; - - tp->undo_retrans++; - - /* snd_nxt is stored to detect loss of retransmitted segment, - * see tcp_input.c tcp_sacktag_write_queue(). - */ - TCP_SKB_CB(skb)->ack_seq = tp->snd_nxt; - } - return err; -#else - return 0; -#endif -} - -/* This gets called after a retransmit timeout, and the initially - * retransmitted data is acknowledged. It tries to continue - * resending the rest of the retransmit queue, until either - * we've sent it all or the congestion window limit is reached. - * If doing SACK, the first ACK which comes back for a timeout - * based retransmit packet might feed us FACK information again. - * If so, we use it to avoid unnecessarily retransmissions. - */ -void tcp_xmit_retransmit_queue(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - struct sk_buff *skb; - int packet_cnt = tp->lost_out; - - /* First pass: retransmit lost packets. */ - if (packet_cnt) { - for_retrans_queue(skb, sk, tp) { - __u8 sacked = TCP_SKB_CB(skb)->sacked; - - if (tcp_packets_in_flight(tp) >= tp->snd_cwnd) - return; - - if (sacked&TCPCB_LOST) { - if (!(sacked&(TCPCB_SACKED_ACKED|TCPCB_SACKED_RETRANS))) { - if (tcp_retransmit_skb(sk, skb)) - return; - if (tp->ca_state != TCP_CA_Loss) - NET_INC_STATS_BH(TCPFastRetrans); - else - NET_INC_STATS_BH(TCPSlowStartRetrans); - - if (skb == skb_peek(&sk->write_queue)) - tcp_reset_xmit_timer(sk, TCP_TIME_RETRANS, tp->rto); - } - - if (--packet_cnt <= 0) - break; - } - } - } - - /* OK, demanded retransmission is finished. */ - - /* Forward retransmissions are possible only during Recovery. */ - if (tp->ca_state != TCP_CA_Recovery) - return; - - /* No forward retransmissions in Reno are possible. */ - if (!tp->sack_ok) - return; - - /* Yeah, we have to make difficult choice between forward transmission - * and retransmission... Both ways have their merits... - * - * For now we do not retrnamsit anything, while we have some new - * segments to send. - */ - - if (tcp_may_send_now(sk, tp)) - return; - - packet_cnt = 0; - - for_retrans_queue(skb, sk, tp) { - if(++packet_cnt > tp->fackets_out) - break; - - if (tcp_packets_in_flight(tp) >= tp->snd_cwnd) - break; - - if(TCP_SKB_CB(skb)->sacked & TCPCB_TAGBITS) - continue; - - /* Ok, retransmit it. */ - if(tcp_retransmit_skb(sk, skb)) - break; - - if (skb == skb_peek(&sk->write_queue)) - tcp_reset_xmit_timer(sk, TCP_TIME_RETRANS, tp->rto); - - NET_INC_STATS_BH(TCPForwardRetrans); - } -#endif -} - - -/* Send a fin. The caller locks the socket for us. This cannot be - * allowed to fail queueing a FIN frame under any circumstances. - */ -void tcp_send_fin(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - struct sk_buff *skb = skb_peek_tail(&sk->write_queue); - unsigned int mss_now; - - /* Optimization, tack on the FIN if we have a queue of - * unsent frames. But be careful about outgoing SACKS - * and IP options. - */ - mss_now = tcp_current_mss(sk); - - if(tp->send_head != NULL) { - TCP_SKB_CB(skb)->flags |= TCPCB_FLAG_FIN; - TCP_SKB_CB(skb)->end_seq++; - tp->write_seq++; - } else { - /* Socket is locked, keep trying until memory is available. */ - for (;;) { - skb = alloc_skb(MAX_TCP_HEADER, GFP_KERNEL); - if (skb) - break; - yield(); - } - - /* Reserve space for headers and prepare control bits. */ - skb_reserve(skb, MAX_TCP_HEADER); - skb->csum = 0; - TCP_SKB_CB(skb)->flags = (TCPCB_FLAG_ACK | TCPCB_FLAG_FIN); - TCP_SKB_CB(skb)->sacked = 0; - - /* FIN eats a sequence byte, write_seq advanced by tcp_send_skb(). */ - TCP_SKB_CB(skb)->seq = tp->write_seq; - TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(skb)->seq + 1; - tcp_send_skb(sk, skb, 1, mss_now); - } - __tcp_push_pending_frames(sk, tp, mss_now, 1); -#endif -} - -/* We get here when a process closes a file descriptor (either due to - * an explicit close() or as a byproduct of exit()'ing) and there - * was unread data in the receive queue. This behavior is recommended - * by draft-ietf-tcpimpl-prob-03.txt section 3.10. -DaveM - */ -void tcp_send_active_reset(struct sock *sk, int priority) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - struct sk_buff *skb; - - /* NOTE: No TCP options attached and we never retransmit this. */ - skb = alloc_skb(MAX_TCP_HEADER, priority); - if (!skb) { - NET_INC_STATS(TCPAbortFailed); - return; - } - - /* Reserve space for headers and prepare control bits. */ - skb_reserve(skb, MAX_TCP_HEADER); - skb->csum = 0; - TCP_SKB_CB(skb)->flags = (TCPCB_FLAG_ACK | TCPCB_FLAG_RST); - TCP_SKB_CB(skb)->sacked = 0; - - /* Send it off. */ - TCP_SKB_CB(skb)->seq = tcp_acceptable_seq(sk, tp); - TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(skb)->seq; - TCP_SKB_CB(skb)->when = tcp_time_stamp; - if (tcp_transmit_skb(sk, skb)) - NET_INC_STATS(TCPAbortFailed); -#endif -} - -/* WARNING: This routine must only be called when we have already sent - * a SYN packet that crossed the incoming SYN that caused this routine - * to get called. If this assumption fails then the initial rcv_wnd - * and rcv_wscale values will not be correct. - */ -int tcp_send_synack(struct sock *sk) -{ -#if 0 - struct sk_buff* skb; - - skb = skb_peek(&sk->write_queue); - if (skb == NULL || !(TCP_SKB_CB(skb)->flags&TCPCB_FLAG_SYN)) { - printk(KERN_DEBUG "tcp_send_synack: wrong queue state\n"); - return -EFAULT; - } - if (!(TCP_SKB_CB(skb)->flags&TCPCB_FLAG_ACK)) { - if (skb_cloned(skb)) { - struct sk_buff *nskb = skb_copy(skb, GFP_ATOMIC); - if (nskb == NULL) - return -ENOMEM; - __skb_unlink(skb, &sk->write_queue); - __skb_queue_head(&sk->write_queue, nskb); - tcp_free_skb(sk, skb); - tcp_charge_skb(sk, nskb); - skb = nskb; - } - - TCP_SKB_CB(skb)->flags |= TCPCB_FLAG_ACK; - TCP_ECN_send_synack(&sk->tp_pinfo.af_tcp, skb); - } - TCP_SKB_CB(skb)->when = tcp_time_stamp; - return tcp_transmit_skb(sk, skb_clone(skb, GFP_ATOMIC)); -#else - return 0; -#endif -} - -/* - * Prepare a SYN-ACK. - */ -struct sk_buff * tcp_make_synack(struct sock *sk, struct dst_entry *dst, - struct open_request *req) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - struct tcphdr *th; - int tcp_header_size; - struct sk_buff *skb; - - skb = sock_wmalloc(sk, MAX_TCP_HEADER + 15, 1, GFP_ATOMIC); - if (skb == NULL) - return NULL; - - /* Reserve space for headers. */ - skb_reserve(skb, MAX_TCP_HEADER); - - skb->dst = dst_clone(dst); - - tcp_header_size = (sizeof(struct tcphdr) + TCPOLEN_MSS + - (req->tstamp_ok ? TCPOLEN_TSTAMP_ALIGNED : 0) + - (req->wscale_ok ? TCPOLEN_WSCALE_ALIGNED : 0) + - /* SACK_PERM is in the place of NOP NOP of TS */ - ((req->sack_ok && !req->tstamp_ok) ? TCPOLEN_SACKPERM_ALIGNED : 0)); - skb->h.th = th = (struct tcphdr *) skb_push(skb, tcp_header_size); - - memset(th, 0, sizeof(struct tcphdr)); - th->syn = 1; - th->ack = 1; - TCP_ECN_make_synack(req, th); - th->source = sk->sport; - th->dest = req->rmt_port; - TCP_SKB_CB(skb)->seq = req->snt_isn; - TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(skb)->seq + 1; - th->seq = htonl(TCP_SKB_CB(skb)->seq); - th->ack_seq = htonl(req->rcv_isn + 1); - if (req->rcv_wnd == 0) { /* ignored for retransmitted syns */ - __u8 rcv_wscale; - /* Set this up on the first call only */ - req->window_clamp = tp->window_clamp ? : dst->window; - /* tcp_full_space because it is guaranteed to be the first packet */ - tcp_select_initial_window(tcp_full_space(sk), - dst->advmss - (req->tstamp_ok ? TCPOLEN_TSTAMP_ALIGNED : 0), - &req->rcv_wnd, - &req->window_clamp, - req->wscale_ok, - &rcv_wscale); - req->rcv_wscale = rcv_wscale; - } - - /* RFC1323: The window in SYN & SYN/ACK segments is never scaled. */ - th->window = htons(req->rcv_wnd); - - TCP_SKB_CB(skb)->when = tcp_time_stamp; - tcp_syn_build_options((__u32 *)(th + 1), dst->advmss, req->tstamp_ok, - req->sack_ok, req->wscale_ok, req->rcv_wscale, - TCP_SKB_CB(skb)->when, - req->ts_recent); - - skb->csum = 0; - th->doff = (tcp_header_size >> 2); - TCP_INC_STATS(TcpOutSegs); - return skb; -#else - return 0; -#endif -} - -/* - * Do all connect socket setups that can be done AF independent. - */ -static inline void tcp_connect_init(struct sock *sk) -{ -#if 0 - struct dst_entry *dst = __sk_dst_get(sk); - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - - /* We'll fix this up when we get a response from the other end. - * See tcp_input.c:tcp_rcv_state_process case TCP_SYN_SENT. - */ - tp->tcp_header_len = sizeof(struct tcphdr) + - (sysctl_tcp_timestamps ? TCPOLEN_TSTAMP_ALIGNED : 0); - - /* If user gave his TCP_MAXSEG, record it to clamp */ - if (tp->user_mss) - tp->mss_clamp = tp->user_mss; - tp->max_window = 0; - tcp_sync_mss(sk, dst->pmtu); - - if (!tp->window_clamp) - tp->window_clamp = dst->window; - tp->advmss = dst->advmss; - tcp_initialize_rcv_mss(sk); - - tcp_select_initial_window(tcp_full_space(sk), - tp->advmss - (tp->ts_recent_stamp ? tp->tcp_header_len - sizeof(struct tcphdr) : 0), - &tp->rcv_wnd, - &tp->window_clamp, - sysctl_tcp_window_scaling, - &tp->rcv_wscale); - - tp->rcv_ssthresh = tp->rcv_wnd; - - sk->err = 0; - sk->done = 0; - tp->snd_wnd = 0; - tcp_init_wl(tp, tp->write_seq, 0); - tp->snd_una = tp->write_seq; - tp->snd_sml = tp->write_seq; - tp->rcv_nxt = 0; - tp->rcv_wup = 0; - tp->copied_seq = 0; - - tp->rto = TCP_TIMEOUT_INIT; - tp->retransmits = 0; - tcp_clear_retrans(tp); -#endif -} - -/* - * Build a SYN and send it off. - */ -int tcp_connect(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - struct sk_buff *buff; - - tcp_connect_init(sk); - - buff = alloc_skb(MAX_TCP_HEADER + 15, sk->allocation); - if (unlikely(buff == NULL)) - return -ENOBUFS; - - /* Reserve space for headers. */ - skb_reserve(buff, MAX_TCP_HEADER); - - TCP_SKB_CB(buff)->flags = TCPCB_FLAG_SYN; - TCP_ECN_send_syn(tp, buff); - TCP_SKB_CB(buff)->sacked = 0; - buff->csum = 0; - TCP_SKB_CB(buff)->seq = tp->write_seq++; - TCP_SKB_CB(buff)->end_seq = tp->write_seq; - tp->snd_nxt = tp->write_seq; - tp->pushed_seq = tp->write_seq; - - /* Send it off. */ - TCP_SKB_CB(buff)->when = tcp_time_stamp; - tp->retrans_stamp = TCP_SKB_CB(buff)->when; - __skb_queue_tail(&sk->write_queue, buff); - tcp_charge_skb(sk, buff); - tp->packets_out++; - tcp_transmit_skb(sk, skb_clone(buff, GFP_KERNEL)); - TCP_INC_STATS(TcpActiveOpens); - - /* Timer for repeating the SYN until an answer. */ - tcp_reset_xmit_timer(sk, TCP_TIME_RETRANS, tp->rto); - return 0; -#else - return 0; -#endif -} - -/* Send out a delayed ack, the caller does the policy checking - * to see if we should even be here. See tcp_input.c:tcp_ack_snd_check() - * for details. - */ -void tcp_send_delayed_ack(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &sk->tp_pinfo.af_tcp; - int ato = tp->ack.ato; - unsigned long timeout; - - if (ato > TCP_DELACK_MIN) { - int max_ato = HZ/2; - - if (tp->ack.pingpong || (tp->ack.pending&TCP_ACK_PUSHED)) - max_ato = TCP_DELACK_MAX; - - /* Slow path, intersegment interval is "high". */ - - /* If some rtt estimate is known, use it to bound delayed ack. - * Do not use tp->rto here, use results of rtt measurements - * directly. - */ - if (tp->srtt) { - int rtt = max(tp->srtt>>3, TCP_DELACK_MIN); - - if (rtt < max_ato) - max_ato = rtt; - } - - ato = min(ato, max_ato); - } - - /* Stay within the limit we were given */ - timeout = jiffies + ato; - - /* Use new timeout only if there wasn't a older one earlier. */ - if (tp->ack.pending&TCP_ACK_TIMER) { - /* If delack timer was blocked or is about to expire, - * send ACK now. - */ - if (tp->ack.blocked || time_before_eq(tp->ack.timeout, jiffies+(ato>>2))) { - tcp_send_ack(sk); - return; - } - - if (!time_before(timeout, tp->ack.timeout)) - timeout = tp->ack.timeout; - } - tp->ack.pending |= TCP_ACK_SCHED|TCP_ACK_TIMER; - tp->ack.timeout = timeout; - if (!mod_timer(&tp->delack_timer, timeout)) - sock_hold(sk); -#endif -} - -/* This routine sends an ack and also updates the window. */ -void tcp_send_ack(struct sock *sk) -{ -#if 0 - /* If we have been reset, we may not send again. */ - if(sk->state != TCP_CLOSE) { - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - struct sk_buff *buff; - - /* We are not putting this on the write queue, so - * tcp_transmit_skb() will set the ownership to this - * sock. - */ - buff = alloc_skb(MAX_TCP_HEADER, GFP_ATOMIC); - if (buff == NULL) { - tcp_schedule_ack(tp); - tp->ack.ato = TCP_ATO_MIN; - tcp_reset_xmit_timer(sk, TCP_TIME_DACK, TCP_DELACK_MAX); - return; - } - - /* Reserve space for headers and prepare control bits. */ - skb_reserve(buff, MAX_TCP_HEADER); - buff->csum = 0; - TCP_SKB_CB(buff)->flags = TCPCB_FLAG_ACK; - TCP_SKB_CB(buff)->sacked = 0; - - /* Send it off, this clears delayed acks for us. */ - TCP_SKB_CB(buff)->seq = TCP_SKB_CB(buff)->end_seq = tcp_acceptable_seq(sk, tp); - TCP_SKB_CB(buff)->when = tcp_time_stamp; - tcp_transmit_skb(sk, buff); - } -#else - return; -#endif -} - -/* This routine sends a packet with an out of date sequence - * number. It assumes the other end will try to ack it. - * - * Question: what should we make while urgent mode? - * 4.4BSD forces sending single byte of data. We cannot send - * out of window data, because we have SND.NXT==SND.MAX... - * - * Current solution: to send TWO zero-length segments in urgent mode: - * one is with SEG.SEQ=SND.UNA to deliver urgent pointer, another is - * out-of-date with SND.UNA-1 to probe window. - */ -static int tcp_xmit_probe_skb(struct sock *sk, int urgent) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - struct sk_buff *skb; - - /* We don't queue it, tcp_transmit_skb() sets ownership. */ - skb = alloc_skb(MAX_TCP_HEADER, GFP_ATOMIC); - if (skb == NULL) - return -1; - - /* Reserve space for headers and set control bits. */ - skb_reserve(skb, MAX_TCP_HEADER); - skb->csum = 0; - TCP_SKB_CB(skb)->flags = TCPCB_FLAG_ACK; - TCP_SKB_CB(skb)->sacked = urgent; - - /* Use a previous sequence. This should cause the other - * end to send an ack. Don't queue or clone SKB, just - * send it. - */ - TCP_SKB_CB(skb)->seq = urgent ? tp->snd_una : tp->snd_una - 1; - TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(skb)->seq; - TCP_SKB_CB(skb)->when = tcp_time_stamp; - return tcp_transmit_skb(sk, skb); -#else - return 0; -#endif -} - -int tcp_write_wakeup(struct sock *sk) -{ -#if 0 - if (sk->state != TCP_CLOSE) { - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - struct sk_buff *skb; - - if ((skb = tp->send_head) != NULL && - before(TCP_SKB_CB(skb)->seq, tp->snd_una+tp->snd_wnd)) { - int err; - int mss = tcp_current_mss(sk); - int seg_size = tp->snd_una+tp->snd_wnd-TCP_SKB_CB(skb)->seq; - - if (before(tp->pushed_seq, TCP_SKB_CB(skb)->end_seq)) - tp->pushed_seq = TCP_SKB_CB(skb)->end_seq; - - /* We are probing the opening of a window - * but the window size is != 0 - * must have been a result SWS avoidance ( sender ) - */ - if (seg_size < TCP_SKB_CB(skb)->end_seq - TCP_SKB_CB(skb)->seq || - skb->len > mss) { - seg_size = min(seg_size, mss); - TCP_SKB_CB(skb)->flags |= TCPCB_FLAG_PSH; - if (tcp_fragment(sk, skb, seg_size)) - return -1; - } - TCP_SKB_CB(skb)->flags |= TCPCB_FLAG_PSH; - TCP_SKB_CB(skb)->when = tcp_time_stamp; - err = tcp_transmit_skb(sk, skb_clone(skb, GFP_ATOMIC)); - if (!err) { - update_send_head(sk, tp, skb); - } - return err; - } else { - if (tp->urg_mode && - between(tp->snd_up, tp->snd_una+1, tp->snd_una+0xFFFF)) - tcp_xmit_probe_skb(sk, TCPCB_URG); - return tcp_xmit_probe_skb(sk, 0); - } - } - return -1; -#else - return 0; -#endif -} - -/* A window probe timeout has occurred. If window is not closed send - * a partial packet else a zero probe. - */ -void tcp_send_probe0(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - int err; - - err = tcp_write_wakeup(sk); - - if (tp->packets_out || !tp->send_head) { - /* Cancel probe timer, if it is not required. */ - tp->probes_out = 0; - tp->backoff = 0; - return; - } - - if (err <= 0) { - tp->backoff++; - tp->probes_out++; - tcp_reset_xmit_timer (sk, TCP_TIME_PROBE0, - min(tp->rto << tp->backoff, TCP_RTO_MAX)); - } else { - /* If packet was not sent due to local congestion, - * do not backoff and do not remember probes_out. - * Let local senders to fight for local resources. - * - * Use accumulated backoff yet. - */ - if (!tp->probes_out) - tp->probes_out=1; - tcp_reset_xmit_timer (sk, TCP_TIME_PROBE0, - min(tp->rto << tp->backoff, TCP_RESOURCE_PROBE_INTERVAL)); - } -#endif -} diff --git a/reactos/drivers/net/tcpip/transport/tcp/tcp_timer.c b/reactos/drivers/net/tcpip/transport/tcp/tcp_timer.c deleted file mode 100755 index 5f9affc5c4d..00000000000 --- a/reactos/drivers/net/tcpip/transport/tcp/tcp_timer.c +++ /dev/null @@ -1,702 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS TCP/IP protocol driver - * FILE: transport/tcp/tcp_input.c - * PURPOSE: Transmission Control Protocol - * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net) - * REVISIONS: - * CSH 15-01-2003 Imported from linux kernel 2.4.20 - */ - -/* - * INET An implementation of the TCP/IP protocol suite for the LINUX - * operating system. INET is implemented using the BSD Socket - * interface as the means of communication with the user level. - * - * Implementation of the Transmission Control Protocol(TCP). - * - * Version: $Id: tcp_timer.c,v 1.1 2003/01/15 21:57:31 chorns Exp $ - * - * Authors: Ross Biro, <bir7@leland.Stanford.Edu> - * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> - * Mark Evans, <evansmp@uhura.aston.ac.uk> - * Corey Minyard <wf-rch!minyard@relay.EU.net> - * Florian La Roche, <flla@stud.uni-sb.de> - * Charles Hedrick, <hedrick@klinzhai.rutgers.edu> - * Linus Torvalds, <torvalds@cs.helsinki.fi> - * Alan Cox, <gw4pts@gw4pts.ampr.org> - * Matthew Dillon, <dillon@apollo.west.oic.com> - * Arnt Gulbrandsen, <agulbra@nvg.unit.no> - * Jorge Cwik, <jorge@laser.satlink.net> - */ - -#if 0 -#include <net/tcp.h> -#else -#include "linux.h" -#include "tcpcore.h" -#endif - -int sysctl_tcp_syn_retries = TCP_SYN_RETRIES; -int sysctl_tcp_synack_retries = TCP_SYNACK_RETRIES; -//int sysctl_tcp_keepalive_time = TCP_KEEPALIVE_TIME; -int sysctl_tcp_keepalive_probes = TCP_KEEPALIVE_PROBES; -//int sysctl_tcp_keepalive_intvl = TCP_KEEPALIVE_INTVL; -int sysctl_tcp_retries1 = TCP_RETR1; -int sysctl_tcp_retries2 = TCP_RETR2; -int sysctl_tcp_orphan_retries; - -static void tcp_write_timer(unsigned long); -static void tcp_delack_timer(unsigned long); -static void tcp_keepalive_timer (unsigned long data); - -//const char timer_bug_msg[] = KERN_DEBUG "tcpbug: unknown timer value\n"; - -/* - * Using different timers for retransmit, delayed acks and probes - * We may wish use just one timer maintaining a list of expire jiffies - * to optimize. - */ - -void tcp_init_xmit_timers(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &sk->tp_pinfo.af_tcp; - - init_timer(&tp->retransmit_timer); - tp->retransmit_timer.function=&tcp_write_timer; - tp->retransmit_timer.data = (unsigned long) sk; - tp->pending = 0; - - init_timer(&tp->delack_timer); - tp->delack_timer.function=&tcp_delack_timer; - tp->delack_timer.data = (unsigned long) sk; - tp->ack.pending = 0; - - init_timer(&sk->timer); - sk->timer.function=&tcp_keepalive_timer; - sk->timer.data = (unsigned long) sk; -#endif -} - -void tcp_clear_xmit_timers(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &sk->tp_pinfo.af_tcp; - - tp->pending = 0; - if (timer_pending(&tp->retransmit_timer) && - del_timer(&tp->retransmit_timer)) - __sock_put(sk); - - tp->ack.pending = 0; - tp->ack.blocked = 0; - if (timer_pending(&tp->delack_timer) && - del_timer(&tp->delack_timer)) - __sock_put(sk); - - if(timer_pending(&sk->timer) && del_timer(&sk->timer)) - __sock_put(sk); -#endif -} - -static void tcp_write_err(struct sock *sk) -{ -#if 0 - sk->err = sk->err_soft ? : ETIMEDOUT; - sk->error_report(sk); - - tcp_done(sk); - NET_INC_STATS_BH(TCPAbortOnTimeout); -#endif -} - -/* Do not allow orphaned sockets to eat all our resources. - * This is direct violation of TCP specs, but it is required - * to prevent DoS attacks. It is called when a retransmission timeout - * or zero probe timeout occurs on orphaned socket. - * - * Criterium is still not confirmed experimentally and may change. - * We kill the socket, if: - * 1. If number of orphaned sockets exceeds an administratively configured - * limit. - * 2. If we have strong memory pressure. - */ -static int tcp_out_of_resources(struct sock *sk, int do_reset) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - int orphans = atomic_read(&tcp_orphan_count); - - /* If peer does not open window for long time, or did not transmit - * anything for long time, penalize it. */ - if ((s32)(tcp_time_stamp - tp->lsndtime) > 2*TCP_RTO_MAX || !do_reset) - orphans <<= 1; - - /* If some dubious ICMP arrived, penalize even more. */ - if (sk->err_soft) - orphans <<= 1; - - if (orphans >= sysctl_tcp_max_orphans || - (sk->wmem_queued > SOCK_MIN_SNDBUF && - atomic_read(&tcp_memory_allocated) > sysctl_tcp_mem[2])) { - if (net_ratelimit()) - printk(KERN_INFO "Out of socket memory\n"); - - /* Catch exceptional cases, when connection requires reset. - * 1. Last segment was sent recently. */ - if ((s32)(tcp_time_stamp - tp->lsndtime) <= TCP_TIMEWAIT_LEN || - /* 2. Window is closed. */ - (!tp->snd_wnd && !tp->packets_out)) - do_reset = 1; - if (do_reset) - tcp_send_active_reset(sk, GFP_ATOMIC); - tcp_done(sk); - NET_INC_STATS_BH(TCPAbortOnMemory); - return 1; - } - return 0; -#else - return 0; -#endif -} - -/* Calculate maximal number or retries on an orphaned socket. */ -static int tcp_orphan_retries(struct sock *sk, int alive) -{ -#if 0 - int retries = sysctl_tcp_orphan_retries; /* May be zero. */ - - /* We know from an ICMP that something is wrong. */ - if (sk->err_soft && !alive) - retries = 0; - - /* However, if socket sent something recently, select some safe - * number of retries. 8 corresponds to >100 seconds with minimal - * RTO of 200msec. */ - if (retries == 0 && alive) - retries = 8; - return retries; -#else - return 0; -#endif -} - -/* A write timeout has occurred. Process the after effects. */ -static int tcp_write_timeout(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - int retry_until; - - if ((1<<sk->state)&(TCPF_SYN_SENT|TCPF_SYN_RECV)) { - if (tp->retransmits) - dst_negative_advice(&sk->dst_cache); - retry_until = tp->syn_retries ? : sysctl_tcp_syn_retries; - } else { - if (tp->retransmits >= sysctl_tcp_retries1) { - /* NOTE. draft-ietf-tcpimpl-pmtud-01.txt requires pmtu black - hole detection. :-( - - It is place to make it. It is not made. I do not want - to make it. It is disguisting. It does not work in any - case. Let me to cite the same draft, which requires for - us to implement this: - - "The one security concern raised by this memo is that ICMP black holes - are often caused by over-zealous security administrators who block - all ICMP messages. It is vitally important that those who design and - deploy security systems understand the impact of strict filtering on - upper-layer protocols. The safest web site in the world is worthless - if most TCP implementations cannot transfer data from it. It would - be far nicer to have all of the black holes fixed rather than fixing - all of the TCP implementations." - - Golden words :-). - */ - - dst_negative_advice(&sk->dst_cache); - } - - retry_until = sysctl_tcp_retries2; - if (sk->dead) { - int alive = (tp->rto < TCP_RTO_MAX); - - retry_until = tcp_orphan_retries(sk, alive); - - if (tcp_out_of_resources(sk, alive || tp->retransmits < retry_until)) - return 1; - } - } - - if (tp->retransmits >= retry_until) { - /* Has it gone just too far? */ - tcp_write_err(sk); - return 1; - } - return 0; -#else - return 0; -#endif -} - -static void tcp_delack_timer(unsigned long data) -{ -#if 0 - struct sock *sk = (struct sock*)data; - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - - bh_lock_sock(sk); - if (sk->lock.users) { - /* Try again later. */ - tp->ack.blocked = 1; - NET_INC_STATS_BH(DelayedACKLocked); - if (!mod_timer(&tp->delack_timer, jiffies + TCP_DELACK_MIN)) - sock_hold(sk); - goto out_unlock; - } - - tcp_mem_reclaim(sk); - - if (sk->state == TCP_CLOSE || !(tp->ack.pending&TCP_ACK_TIMER)) - goto out; - - if ((long)(tp->ack.timeout - jiffies) > 0) { - if (!mod_timer(&tp->delack_timer, tp->ack.timeout)) - sock_hold(sk); - goto out; - } - tp->ack.pending &= ~TCP_ACK_TIMER; - - if (skb_queue_len(&tp->ucopy.prequeue)) { - struct sk_buff *skb; - - net_statistics[smp_processor_id()*2].TCPSchedulerFailed += skb_queue_len(&tp->ucopy.prequeue); - - while ((skb = __skb_dequeue(&tp->ucopy.prequeue)) != NULL) - sk->backlog_rcv(sk, skb); - - tp->ucopy.memory = 0; - } - - if (tcp_ack_scheduled(tp)) { - if (!tp->ack.pingpong) { - /* Delayed ACK missed: inflate ATO. */ - tp->ack.ato = min(tp->ack.ato << 1, tp->rto); - } else { - /* Delayed ACK missed: leave pingpong mode and - * deflate ATO. - */ - tp->ack.pingpong = 0; - tp->ack.ato = TCP_ATO_MIN; - } - tcp_send_ack(sk); - NET_INC_STATS_BH(DelayedACKs); - } - TCP_CHECK_TIMER(sk); - -out: - if (tcp_memory_pressure) - tcp_mem_reclaim(sk); -out_unlock: - bh_unlock_sock(sk); - sock_put(sk); -#endif -} - -static void tcp_probe_timer(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &sk->tp_pinfo.af_tcp; - int max_probes; - - if (tp->packets_out || !tp->send_head) { - tp->probes_out = 0; - return; - } - - /* *WARNING* RFC 1122 forbids this - * - * It doesn't AFAIK, because we kill the retransmit timer -AK - * - * FIXME: We ought not to do it, Solaris 2.5 actually has fixing - * this behaviour in Solaris down as a bug fix. [AC] - * - * Let me to explain. probes_out is zeroed by incoming ACKs - * even if they advertise zero window. Hence, connection is killed only - * if we received no ACKs for normal connection timeout. It is not killed - * only because window stays zero for some time, window may be zero - * until armageddon and even later. We are in full accordance - * with RFCs, only probe timer combines both retransmission timeout - * and probe timeout in one bottle. --ANK - */ - max_probes = sysctl_tcp_retries2; - - if (sk->dead) { - int alive = ((tp->rto<<tp->backoff) < TCP_RTO_MAX); - - max_probes = tcp_orphan_retries(sk, alive); - - if (tcp_out_of_resources(sk, alive || tp->probes_out <= max_probes)) - return; - } - - if (tp->probes_out > max_probes) { - tcp_write_err(sk); - } else { - /* Only send another probe if we didn't close things up. */ - tcp_send_probe0(sk); - } -#endif -} - -/* - * The TCP retransmit timer. - */ - -static void tcp_retransmit_timer(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &sk->tp_pinfo.af_tcp; - - if (tp->packets_out == 0) - goto out; - - BUG_TRAP(!skb_queue_empty(&sk->write_queue)); - - if (tp->snd_wnd == 0 && !sk->dead && - !((1<<sk->state)&(TCPF_SYN_SENT|TCPF_SYN_RECV))) { - /* Receiver dastardly shrinks window. Our retransmits - * become zero probes, but we should not timeout this - * connection. If the socket is an orphan, time it out, - * we cannot allow such beasts to hang infinitely. - */ -#ifdef TCP_DEBUG - if (net_ratelimit()) - printk(KERN_DEBUG "TCP: Treason uncloaked! Peer %u.%u.%u.%u:%u/%u shrinks window %u:%u. Repaired.\n", - NIPQUAD(sk->daddr), htons(sk->dport), sk->num, - tp->snd_una, tp->snd_nxt); -#endif - if (tcp_time_stamp - tp->rcv_tstamp > TCP_RTO_MAX) { - tcp_write_err(sk); - goto out; - } - tcp_enter_loss(sk, 0); - tcp_retransmit_skb(sk, skb_peek(&sk->write_queue)); - __sk_dst_reset(sk); - goto out_reset_timer; - } - - if (tcp_write_timeout(sk)) - goto out; - - if (tp->retransmits == 0) { - if (tp->ca_state == TCP_CA_Disorder || tp->ca_state == TCP_CA_Recovery) { - if (tp->sack_ok) { - if (tp->ca_state == TCP_CA_Recovery) - NET_INC_STATS_BH(TCPSackRecoveryFail); - else - NET_INC_STATS_BH(TCPSackFailures); - } else { - if (tp->ca_state == TCP_CA_Recovery) - NET_INC_STATS_BH(TCPRenoRecoveryFail); - else - NET_INC_STATS_BH(TCPRenoFailures); - } - } else if (tp->ca_state == TCP_CA_Loss) { - NET_INC_STATS_BH(TCPLossFailures); - } else { - NET_INC_STATS_BH(TCPTimeouts); - } - } - - tcp_enter_loss(sk, 0); - - if (tcp_retransmit_skb(sk, skb_peek(&sk->write_queue)) > 0) { - /* Retransmission failed because of local congestion, - * do not backoff. - */ - if (!tp->retransmits) - tp->retransmits=1; - tcp_reset_xmit_timer(sk, TCP_TIME_RETRANS, - min(tp->rto, TCP_RESOURCE_PROBE_INTERVAL)); - goto out; - } - - /* Increase the timeout each time we retransmit. Note that - * we do not increase the rtt estimate. rto is initialized - * from rtt, but increases here. Jacobson (SIGCOMM 88) suggests - * that doubling rto each time is the least we can get away with. - * In KA9Q, Karn uses this for the first few times, and then - * goes to quadratic. netBSD doubles, but only goes up to *64, - * and clamps at 1 to 64 sec afterwards. Note that 120 sec is - * defined in the protocol as the maximum possible RTT. I guess - * we'll have to use something other than TCP to talk to the - * University of Mars. - * - * PAWS allows us longer timeouts and large windows, so once - * implemented ftp to mars will work nicely. We will have to fix - * the 120 second clamps though! - */ - tp->backoff++; - tp->retransmits++; - -out_reset_timer: - tp->rto = min(tp->rto << 1, TCP_RTO_MAX); - tcp_reset_xmit_timer(sk, TCP_TIME_RETRANS, tp->rto); - if (tp->retransmits > sysctl_tcp_retries1) - __sk_dst_reset(sk); - -out:; -#endif -} - -static void tcp_write_timer(unsigned long data) -{ -#if 0 - struct sock *sk = (struct sock*)data; - struct tcp_opt *tp = &sk->tp_pinfo.af_tcp; - int event; - - bh_lock_sock(sk); - if (sk->lock.users) { - /* Try again later */ - if (!mod_timer(&tp->retransmit_timer, jiffies + (HZ/20))) - sock_hold(sk); - goto out_unlock; - } - - if (sk->state == TCP_CLOSE || !tp->pending) - goto out; - - if ((long)(tp->timeout - jiffies) > 0) { - if (!mod_timer(&tp->retransmit_timer, tp->timeout)) - sock_hold(sk); - goto out; - } - - event = tp->pending; - tp->pending = 0; - - switch (event) { - case TCP_TIME_RETRANS: - tcp_retransmit_timer(sk); - break; - case TCP_TIME_PROBE0: - tcp_probe_timer(sk); - break; - } - TCP_CHECK_TIMER(sk); - -out: - tcp_mem_reclaim(sk); -out_unlock: - bh_unlock_sock(sk); - sock_put(sk); -#endif -} - -/* - * Timer for listening sockets - */ - -static void tcp_synack_timer(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - struct tcp_listen_opt *lopt = tp->listen_opt; - int max_retries = tp->syn_retries ? : sysctl_tcp_synack_retries; - int thresh = max_retries; - unsigned long now = jiffies; - struct open_request **reqp, *req; - int i, budget; - - if (lopt == NULL || lopt->qlen == 0) - return; - - /* Normally all the openreqs are young and become mature - * (i.e. converted to established socket) for first timeout. - * If synack was not acknowledged for 3 seconds, it means - * one of the following things: synack was lost, ack was lost, - * rtt is high or nobody planned to ack (i.e. synflood). - * When server is a bit loaded, queue is populated with old - * open requests, reducing effective size of queue. - * When server is well loaded, queue size reduces to zero - * after several minutes of work. It is not synflood, - * it is normal operation. The solution is pruning - * too old entries overriding normal timeout, when - * situation becomes dangerous. - * - * Essentially, we reserve half of room for young - * embrions; and abort old ones without pity, if old - * ones are about to clog our table. - */ - if (lopt->qlen>>(lopt->max_qlen_log-1)) { - int young = (lopt->qlen_young<<1); - - while (thresh > 2) { - if (lopt->qlen < young) - break; - thresh--; - young <<= 1; - } - } - - if (tp->defer_accept) - max_retries = tp->defer_accept; - - budget = 2*(TCP_SYNQ_HSIZE/(TCP_TIMEOUT_INIT/TCP_SYNQ_INTERVAL)); - i = lopt->clock_hand; - - do { - reqp=&lopt->syn_table[i]; - while ((req = *reqp) != NULL) { - if ((long)(now - req->expires) >= 0) { - if ((req->retrans < thresh || - (req->acked && req->retrans < max_retries)) - && !req->class->rtx_syn_ack(sk, req, NULL)) { - unsigned long timeo; - - if (req->retrans++ == 0) - lopt->qlen_young--; - timeo = min((TCP_TIMEOUT_INIT << req->retrans), - TCP_RTO_MAX); - req->expires = now + timeo; - reqp = &req->dl_next; - continue; - } - - /* Drop this request */ - write_lock(&tp->syn_wait_lock); - *reqp = req->dl_next; - write_unlock(&tp->syn_wait_lock); - lopt->qlen--; - if (req->retrans == 0) - lopt->qlen_young--; - tcp_openreq_free(req); - continue; - } - reqp = &req->dl_next; - } - - i = (i+1)&(TCP_SYNQ_HSIZE-1); - - } while (--budget > 0); - - lopt->clock_hand = i; - - if (lopt->qlen) - tcp_reset_keepalive_timer(sk, TCP_SYNQ_INTERVAL); -#endif -} - -void tcp_delete_keepalive_timer (struct sock *sk) -{ -#if 0 - if (timer_pending(&sk->timer) && del_timer (&sk->timer)) - __sock_put(sk); -#endif -} - -void tcp_reset_keepalive_timer (struct sock *sk, unsigned long len) -{ -#if 0 - if (!mod_timer(&sk->timer, jiffies+len)) - sock_hold(sk); -#endif -} - -void tcp_set_keepalive(struct sock *sk, int val) -{ -#if 0 - if ((1<<sk->state)&(TCPF_CLOSE|TCPF_LISTEN)) - return; - - if (val && !sk->keepopen) - tcp_reset_keepalive_timer(sk, keepalive_time_when(&sk->tp_pinfo.af_tcp)); - else if (!val) - tcp_delete_keepalive_timer(sk); -#endif -} - - -static void tcp_keepalive_timer (unsigned long data) -{ -#if 0 - struct sock *sk = (struct sock *) data; - struct tcp_opt *tp = &sk->tp_pinfo.af_tcp; - __u32 elapsed; - - /* Only process if socket is not in use. */ - bh_lock_sock(sk); - if (sk->lock.users) { - /* Try again later. */ - tcp_reset_keepalive_timer (sk, HZ/20); - goto out; - } - - if (sk->state == TCP_LISTEN) { - tcp_synack_timer(sk); - goto out; - } - - if (sk->state == TCP_FIN_WAIT2 && sk->dead) { - if (tp->linger2 >= 0) { - int tmo = tcp_fin_time(tp) - TCP_TIMEWAIT_LEN; - - if (tmo > 0) { - tcp_time_wait(sk, TCP_FIN_WAIT2, tmo); - goto out; - } - } - tcp_send_active_reset(sk, GFP_ATOMIC); - goto death; - } - - if (!sk->keepopen || sk->state == TCP_CLOSE) - goto out; - - elapsed = keepalive_time_when(tp); - - /* It is alive without keepalive 8) */ - if (tp->packets_out || tp->send_head) - goto resched; - - elapsed = tcp_time_stamp - tp->rcv_tstamp; - - if (elapsed >= keepalive_time_when(tp)) { - if ((!tp->keepalive_probes && tp->probes_out >= sysctl_tcp_keepalive_probes) || - (tp->keepalive_probes && tp->probes_out >= tp->keepalive_probes)) { - tcp_send_active_reset(sk, GFP_ATOMIC); - tcp_write_err(sk); - goto out; - } - if (tcp_write_wakeup(sk) <= 0) { - tp->probes_out++; - elapsed = keepalive_intvl_when(tp); - } else { - /* If keepalive was lost due to local congestion, - * try harder. - */ - elapsed = TCP_RESOURCE_PROBE_INTERVAL; - } - } else { - /* It is tp->rcv_tstamp + keepalive_time_when(tp) */ - elapsed = keepalive_time_when(tp) - elapsed; - } - - TCP_CHECK_TIMER(sk); - tcp_mem_reclaim(sk); - -resched: - tcp_reset_keepalive_timer (sk, elapsed); - goto out; - -death: - tcp_done(sk); - -out: - bh_unlock_sock(sk); - sock_put(sk); -#endif -} diff --git a/reactos/drivers/net/tcpip/transport/tcp/tcpcore.c b/reactos/drivers/net/tcpip/transport/tcp/tcpcore.c deleted file mode 100755 index 8e1b3f93736..00000000000 --- a/reactos/drivers/net/tcpip/transport/tcp/tcpcore.c +++ /dev/null @@ -1,2783 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS TCP/IP protocol driver - * FILE: transport/tcp/tcpcore.c - * PURPOSE: Transmission Control Protocol - * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net) - * REVISIONS: - * CSH 15-01-2003 Imported from linux kernel 2.4.20 - */ - -/* - * INET An implementation of the TCP/IP protocol suite for the LINUX - * operating system. INET is implemented using the BSD Socket - * interface as the means of communication with the user level. - * - * Implementation of the Transmission Control Protocol(TCP). - * - * Version: $Id: tcpcore.c,v 1.1 2003/01/15 21:57:31 chorns Exp $ - * - * Authors: Ross Biro, <bir7@leland.Stanford.Edu> - * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> - * Mark Evans, <evansmp@uhura.aston.ac.uk> - * Corey Minyard <wf-rch!minyard@relay.EU.net> - * Florian La Roche, <flla@stud.uni-sb.de> - * Charles Hedrick, <hedrick@klinzhai.rutgers.edu> - * Linus Torvalds, <torvalds@cs.helsinki.fi> - * Alan Cox, <gw4pts@gw4pts.ampr.org> - * Matthew Dillon, <dillon@apollo.west.oic.com> - * Arnt Gulbrandsen, <agulbra@nvg.unit.no> - * Jorge Cwik, <jorge@laser.satlink.net> - * - * Fixes: - * Alan Cox : Numerous verify_area() calls - * Alan Cox : Set the ACK bit on a reset - * Alan Cox : Stopped it crashing if it closed while - * sk->inuse=1 and was trying to connect - * (tcp_err()). - * Alan Cox : All icmp error handling was broken - * pointers passed where wrong and the - * socket was looked up backwards. Nobody - * tested any icmp error code obviously. - * Alan Cox : tcp_err() now handled properly. It - * wakes people on errors. poll - * behaves and the icmp error race - * has gone by moving it into sock.c - * Alan Cox : tcp_send_reset() fixed to work for - * everything not just packets for - * unknown sockets. - * Alan Cox : tcp option processing. - * Alan Cox : Reset tweaked (still not 100%) [Had - * syn rule wrong] - * Herp Rosmanith : More reset fixes - * Alan Cox : No longer acks invalid rst frames. - * Acking any kind of RST is right out. - * Alan Cox : Sets an ignore me flag on an rst - * receive otherwise odd bits of prattle - * escape still - * Alan Cox : Fixed another acking RST frame bug. - * Should stop LAN workplace lockups. - * Alan Cox : Some tidyups using the new skb list - * facilities - * Alan Cox : sk->keepopen now seems to work - * Alan Cox : Pulls options out correctly on accepts - * Alan Cox : Fixed assorted sk->rqueue->next errors - * Alan Cox : PSH doesn't end a TCP read. Switched a - * bit to skb ops. - * Alan Cox : Tidied tcp_data to avoid a potential - * nasty. - * Alan Cox : Added some better commenting, as the - * tcp is hard to follow - * Alan Cox : Removed incorrect check for 20 * psh - * Michael O'Reilly : ack < copied bug fix. - * Johannes Stille : Misc tcp fixes (not all in yet). - * Alan Cox : FIN with no memory -> CRASH - * Alan Cox : Added socket option proto entries. - * Also added awareness of them to accept. - * Alan Cox : Added TCP options (SOL_TCP) - * Alan Cox : Switched wakeup calls to callbacks, - * so the kernel can layer network - * sockets. - * Alan Cox : Use ip_tos/ip_ttl settings. - * Alan Cox : Handle FIN (more) properly (we hope). - * Alan Cox : RST frames sent on unsynchronised - * state ack error. - * Alan Cox : Put in missing check for SYN bit. - * Alan Cox : Added tcp_select_window() aka NET2E - * window non shrink trick. - * Alan Cox : Added a couple of small NET2E timer - * fixes - * Charles Hedrick : TCP fixes - * Toomas Tamm : TCP window fixes - * Alan Cox : Small URG fix to rlogin ^C ack fight - * Charles Hedrick : Rewrote most of it to actually work - * Linus : Rewrote tcp_read() and URG handling - * completely - * Gerhard Koerting: Fixed some missing timer handling - * Matthew Dillon : Reworked TCP machine states as per RFC - * Gerhard Koerting: PC/TCP workarounds - * Adam Caldwell : Assorted timer/timing errors - * Matthew Dillon : Fixed another RST bug - * Alan Cox : Move to kernel side addressing changes. - * Alan Cox : Beginning work on TCP fastpathing - * (not yet usable) - * Arnt Gulbrandsen: Turbocharged tcp_check() routine. - * Alan Cox : TCP fast path debugging - * Alan Cox : Window clamping - * Michael Riepe : Bug in tcp_check() - * Matt Dillon : More TCP improvements and RST bug fixes - * Matt Dillon : Yet more small nasties remove from the - * TCP code (Be very nice to this man if - * tcp finally works 100%) 8) - * Alan Cox : BSD accept semantics. - * Alan Cox : Reset on closedown bug. - * Peter De Schrijver : ENOTCONN check missing in tcp_sendto(). - * Michael Pall : Handle poll() after URG properly in - * all cases. - * Michael Pall : Undo the last fix in tcp_read_urg() - * (multi URG PUSH broke rlogin). - * Michael Pall : Fix the multi URG PUSH problem in - * tcp_readable(), poll() after URG - * works now. - * Michael Pall : recv(...,MSG_OOB) never blocks in the - * BSD api. - * Alan Cox : Changed the semantics of sk->socket to - * fix a race and a signal problem with - * accept() and async I/O. - * Alan Cox : Relaxed the rules on tcp_sendto(). - * Yury Shevchuk : Really fixed accept() blocking problem. - * Craig I. Hagan : Allow for BSD compatible TIME_WAIT for - * clients/servers which listen in on - * fixed ports. - * Alan Cox : Cleaned the above up and shrank it to - * a sensible code size. - * Alan Cox : Self connect lockup fix. - * Alan Cox : No connect to multicast. - * Ross Biro : Close unaccepted children on master - * socket close. - * Alan Cox : Reset tracing code. - * Alan Cox : Spurious resets on shutdown. - * Alan Cox : Giant 15 minute/60 second timer error - * Alan Cox : Small whoops in polling before an - * accept. - * Alan Cox : Kept the state trace facility since - * it's handy for debugging. - * Alan Cox : More reset handler fixes. - * Alan Cox : Started rewriting the code based on - * the RFC's for other useful protocol - * references see: Comer, KA9Q NOS, and - * for a reference on the difference - * between specifications and how BSD - * works see the 4.4lite source. - * A.N.Kuznetsov : Don't time wait on completion of tidy - * close. - * Linus Torvalds : Fin/Shutdown & copied_seq changes. - * Linus Torvalds : Fixed BSD port reuse to work first syn - * Alan Cox : Reimplemented timers as per the RFC - * and using multiple timers for sanity. - * Alan Cox : Small bug fixes, and a lot of new - * comments. - * Alan Cox : Fixed dual reader crash by locking - * the buffers (much like datagram.c) - * Alan Cox : Fixed stuck sockets in probe. A probe - * now gets fed up of retrying without - * (even a no space) answer. - * Alan Cox : Extracted closing code better - * Alan Cox : Fixed the closing state machine to - * resemble the RFC. - * Alan Cox : More 'per spec' fixes. - * Jorge Cwik : Even faster checksumming. - * Alan Cox : tcp_data() doesn't ack illegal PSH - * only frames. At least one pc tcp stack - * generates them. - * Alan Cox : Cache last socket. - * Alan Cox : Per route irtt. - * Matt Day : poll()->select() match BSD precisely on error - * Alan Cox : New buffers - * Marc Tamsky : Various sk->prot->retransmits and - * sk->retransmits misupdating fixed. - * Fixed tcp_write_timeout: stuck close, - * and TCP syn retries gets used now. - * Mark Yarvis : In tcp_read_wakeup(), don't send an - * ack if state is TCP_CLOSED. - * Alan Cox : Look up device on a retransmit - routes may - * change. Doesn't yet cope with MSS shrink right - * but its a start! - * Marc Tamsky : Closing in closing fixes. - * Mike Shaver : RFC1122 verifications. - * Alan Cox : rcv_saddr errors. - * Alan Cox : Block double connect(). - * Alan Cox : Small hooks for enSKIP. - * Alexey Kuznetsov: Path MTU discovery. - * Alan Cox : Support soft errors. - * Alan Cox : Fix MTU discovery pathological case - * when the remote claims no mtu! - * Marc Tamsky : TCP_CLOSE fix. - * Colin (G3TNE) : Send a reset on syn ack replies in - * window but wrong (fixes NT lpd problems) - * Pedro Roque : Better TCP window handling, delayed ack. - * Joerg Reuter : No modification of locked buffers in - * tcp_do_retransmit() - * Eric Schenk : Changed receiver side silly window - * avoidance algorithm to BSD style - * algorithm. This doubles throughput - * against machines running Solaris, - * and seems to result in general - * improvement. - * Stefan Magdalinski : adjusted tcp_readable() to fix FIONREAD - * Willy Konynenberg : Transparent proxying support. - * Mike McLagan : Routing by source - * Keith Owens : Do proper merging with partial SKB's in - * tcp_do_sendmsg to avoid burstiness. - * Eric Schenk : Fix fast close down bug with - * shutdown() followed by close(). - * Andi Kleen : Make poll agree with SIGIO - * Salvatore Sanfilippo : Support SO_LINGER with linger == 1 and - * lingertime == 0 (RFC 793 ABORT Call) - * - * 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. - * - * Description of States: - * - * TCP_SYN_SENT sent a connection request, waiting for ack - * - * TCP_SYN_RECV received a connection request, sent ack, - * waiting for final ack in three-way handshake. - * - * TCP_ESTABLISHED connection established - * - * TCP_FIN_WAIT1 our side has shutdown, waiting to complete - * transmission of remaining buffered data - * - * TCP_FIN_WAIT2 all buffered data sent, waiting for remote - * to shutdown - * - * TCP_CLOSING both sides have shutdown but we still have - * data we have to finish sending - * - * TCP_TIME_WAIT timeout to catch resent junk before entering - * closed, can only be entered from FIN_WAIT2 - * or CLOSING. Required because the other end - * may not have gotten our last ACK causing it - * to retransmit the data packet (which we ignore) - * - * TCP_CLOSE_WAIT remote side has shutdown and is waiting for - * us to finish writing our data and to shutdown - * (we have to close() to move on to LAST_ACK) - * - * TCP_LAST_ACK out side has shutdown after remote has - * shutdown. There may still be data in our - * buffer that we have to finish sending - * - * TCP_CLOSE socket is finished - */ - -#if 0 -#include <linux/config.h> -#include <linux/types.h> -#include <linux/fcntl.h> -#include <linux/poll.h> -#include <linux/init.h> -#include <linux/smp_lock.h> -#include <linux/fs.h> - -#include <net/icmp.h> -#include <net/tcp.h> - -#include <asm/uaccess.h> -#include <asm/ioctls.h> -#else -#include "linux.h" -#include "tcpcore.h" -#endif - -int sysctl_tcp_fin_timeout = TCP_FIN_TIMEOUT; - -#ifdef ROS_STATISTICS -struct tcp_mib tcp_statistics[NR_CPUS*2]; -#endif - -kmem_cache_t *tcp_openreq_cachep; -kmem_cache_t *tcp_bucket_cachep; -kmem_cache_t *tcp_timewait_cachep; - -#if 0 -atomic_t tcp_orphan_count = ATOMIC_INIT(0); -#endif - -int sysctl_tcp_mem[3]; -int sysctl_tcp_wmem[3] = { 4*1024, 16*1024, 128*1024 }; -int sysctl_tcp_rmem[3] = { 4*1024, 87380, 87380*2 }; - -atomic_t tcp_memory_allocated; /* Current allocated memory. */ -atomic_t tcp_sockets_allocated; /* Current number of TCP sockets. */ - -/* Pressure flag: try to collapse. - * Technical note: it is used by multiple contexts non atomically. - * All the tcp_mem_schedule() is of this nature: accounting - * is strict, actions are advisory and have some latency. */ -int tcp_memory_pressure; - -#define TCP_PAGES(amt) (((amt)+TCP_MEM_QUANTUM-1)/TCP_MEM_QUANTUM) - -int tcp_mem_schedule(struct sock *sk, int size, int kind) -{ - int amt = TCP_PAGES(size); - - sk->forward_alloc += amt*TCP_MEM_QUANTUM; - atomic_add(amt, &tcp_memory_allocated); - - /* Under limit. */ - if (atomic_read(&tcp_memory_allocated) < sysctl_tcp_mem[0]) { - if (tcp_memory_pressure) - tcp_memory_pressure = 0; - return 1; - } - - /* Over hard limit. */ - if (atomic_read(&tcp_memory_allocated) > sysctl_tcp_mem[2]) { - tcp_enter_memory_pressure(); - goto suppress_allocation; - } - - /* Under pressure. */ - if (atomic_read(&tcp_memory_allocated) > sysctl_tcp_mem[1]) - tcp_enter_memory_pressure(); - - if (kind) { - if (atomic_read(&sk->rmem_alloc) < sysctl_tcp_rmem[0]) - return 1; - } else { - if (sk->wmem_queued < sysctl_tcp_wmem[0]) - return 1; - } - - if (!tcp_memory_pressure || - sysctl_tcp_mem[2] > atomic_read(&tcp_sockets_allocated) - * TCP_PAGES(sk->wmem_queued+atomic_read(&sk->rmem_alloc)+ - sk->forward_alloc)) - return 1; - -suppress_allocation: - - if (kind == 0) { - tcp_moderate_sndbuf(sk); - - /* Fail only if socket is _under_ its sndbuf. - * In this case we cannot block, so that we have to fail. - */ - if (sk->wmem_queued+size >= sk->sndbuf) - return 1; - } - - /* Alas. Undo changes. */ - sk->forward_alloc -= amt*TCP_MEM_QUANTUM; - atomic_sub(amt, &tcp_memory_allocated); - return 0; -} - -void __tcp_mem_reclaim(struct sock *sk) -{ - if (sk->forward_alloc >= TCP_MEM_QUANTUM) { - atomic_sub(sk->forward_alloc/TCP_MEM_QUANTUM, &tcp_memory_allocated); - sk->forward_alloc &= (TCP_MEM_QUANTUM-1); - if (tcp_memory_pressure && - atomic_read(&tcp_memory_allocated) < sysctl_tcp_mem[0]) - tcp_memory_pressure = 0; - } -} - -void tcp_rfree(struct sk_buff *skb) -{ - struct sock *sk = skb->sk; - - atomic_sub(skb->truesize, &sk->rmem_alloc); - sk->forward_alloc += skb->truesize; -} - -/* - * LISTEN is a special case for poll.. - */ -static __inline__ unsigned int tcp_listen_poll(struct sock *sk, poll_table *wait) -{ - return sk->tp_pinfo.af_tcp.accept_queue ? (POLLIN | POLLRDNORM) : 0; -} - -/* - * Wait for a TCP event. - * - * Note that we don't need to lock the socket, as the upper poll layers - * take care of normal races (between the test and the event) and we don't - * go look at any of the socket buffers directly. - */ -unsigned int tcp_poll(struct file * file, struct socket *sock, poll_table *wait) -{ -#if 0 - unsigned int mask; - struct sock *sk = sock->sk; - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - - poll_wait(file, sk->sleep, wait); - if (sk->state == TCP_LISTEN) - return tcp_listen_poll(sk, wait); - - /* Socket is not locked. We are protected from async events - by poll logic and correct handling of state changes - made by another threads is impossible in any case. - */ - - mask = 0; - if (sk->err) - mask = POLLERR; - - /* - * POLLHUP is certainly not done right. But poll() doesn't - * have a notion of HUP in just one direction, and for a - * socket the read side is more interesting. - * - * Some poll() documentation says that POLLHUP is incompatible - * with the POLLOUT/POLLWR flags, so somebody should check this - * all. But careful, it tends to be safer to return too many - * bits than too few, and you can easily break real applications - * if you don't tell them that something has hung up! - * - * Check-me. - * - * Check number 1. POLLHUP is _UNMASKABLE_ event (see UNIX98 and - * our fs/select.c). It means that after we received EOF, - * poll always returns immediately, making impossible poll() on write() - * in state CLOSE_WAIT. One solution is evident --- to set POLLHUP - * if and only if shutdown has been made in both directions. - * Actually, it is interesting to look how Solaris and DUX - * solve this dilemma. I would prefer, if PULLHUP were maskable, - * then we could set it on SND_SHUTDOWN. BTW examples given - * in Stevens' books assume exactly this behaviour, it explains - * why PULLHUP is incompatible with POLLOUT. --ANK - * - * NOTE. Check for TCP_CLOSE is added. The goal is to prevent - * blocking on fresh not-connected or disconnected socket. --ANK - */ - if (sk->shutdown == SHUTDOWN_MASK || sk->state == TCP_CLOSE) - mask |= POLLHUP; - if (sk->shutdown & RCV_SHUTDOWN) - mask |= POLLIN | POLLRDNORM; - - /* Connected? */ - if ((1 << sk->state) & ~(TCPF_SYN_SENT|TCPF_SYN_RECV)) { - /* Potential race condition. If read of tp below will - * escape above sk->state, we can be illegally awaken - * in SYN_* states. */ - if ((tp->rcv_nxt != tp->copied_seq) && - (tp->urg_seq != tp->copied_seq || - tp->rcv_nxt != tp->copied_seq+1 || - sk->urginline || !tp->urg_data)) - mask |= POLLIN | POLLRDNORM; - - if (!(sk->shutdown & SEND_SHUTDOWN)) { - if (tcp_wspace(sk) >= tcp_min_write_space(sk)) { - mask |= POLLOUT | POLLWRNORM; - } else { /* send SIGIO later */ - set_bit(SOCK_ASYNC_NOSPACE, &sk->socket->flags); - set_bit(SOCK_NOSPACE, &sk->socket->flags); - - /* Race breaker. If space is freed after - * wspace test but before the flags are set, - * IO signal will be lost. - */ - if (tcp_wspace(sk) >= tcp_min_write_space(sk)) - mask |= POLLOUT | POLLWRNORM; - } - } - - if (tp->urg_data & TCP_URG_VALID) - mask |= POLLPRI; - } - return mask; -#else - return 0; -#endif -} - -/* - * TCP socket write_space callback. - */ -void tcp_write_space(struct sock *sk) -{ -#if 0 - struct socket *sock = sk->socket; - - if (tcp_wspace(sk) >= tcp_min_write_space(sk) && sock) { - clear_bit(SOCK_NOSPACE, &sock->flags); - - if (sk->sleep && waitqueue_active(sk->sleep)) - wake_up_interruptible(sk->sleep); - - if (sock->fasync_list && !(sk->shutdown&SEND_SHUTDOWN)) - sock_wake_async(sock, 2, POLL_OUT); - } -#endif -} - -int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - int answ; - - switch(cmd) { - case SIOCINQ: - if (sk->state == TCP_LISTEN) - return(-EINVAL); - - lock_sock(sk); - if ((1<<sk->state) & (TCPF_SYN_SENT|TCPF_SYN_RECV)) - answ = 0; - else if (sk->urginline || !tp->urg_data || - before(tp->urg_seq,tp->copied_seq) || - !before(tp->urg_seq,tp->rcv_nxt)) { - answ = tp->rcv_nxt - tp->copied_seq; - - /* Subtract 1, if FIN is in queue. */ - if (answ && !skb_queue_empty(&sk->receive_queue)) - answ -= ((struct sk_buff*)sk->receive_queue.prev)->h.th->fin; - } else - answ = tp->urg_seq - tp->copied_seq; - release_sock(sk); - break; - case SIOCATMARK: - { - answ = tp->urg_data && tp->urg_seq == tp->copied_seq; - break; - } - case SIOCOUTQ: - if (sk->state == TCP_LISTEN) - return(-EINVAL); - - if ((1<<sk->state) & (TCPF_SYN_SENT|TCPF_SYN_RECV)) - answ = 0; - else - answ = tp->write_seq - tp->snd_una; - break; - default: - return(-ENOIOCTLCMD); - }; - - return put_user(answ, (int *)arg); -#else -return 0; -#endif -} - - -int tcp_listen_start(struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - struct tcp_listen_opt *lopt; - - sk->max_ack_backlog = 0; - sk->ack_backlog = 0; - tp->accept_queue = tp->accept_queue_tail = NULL; - tp->syn_wait_lock = RW_LOCK_UNLOCKED; - tcp_delack_init(tp); - - lopt = kmalloc(sizeof(struct tcp_listen_opt), GFP_KERNEL); - if (!lopt) - return -ENOMEM; - - memset(lopt, 0, sizeof(struct tcp_listen_opt)); - for (lopt->max_qlen_log = 6; ; lopt->max_qlen_log++) - if ((1<<lopt->max_qlen_log) >= sysctl_max_syn_backlog) - break; - - write_lock_bh(&tp->syn_wait_lock); - tp->listen_opt = lopt; - write_unlock_bh(&tp->syn_wait_lock); - - /* There is race window here: we announce ourselves listening, - * but this transition is still not validated by get_port(). - * It is OK, because this socket enters to hash table only - * after validation is complete. - */ - sk->state = TCP_LISTEN; - if (sk->prot->get_port(sk, sk->num) == 0) { - sk->sport = htons(sk->num); - - sk_dst_reset(sk); - sk->prot->hash(sk); - - return 0; - } - - sk->state = TCP_CLOSE; - write_lock_bh(&tp->syn_wait_lock); - tp->listen_opt = NULL; - write_unlock_bh(&tp->syn_wait_lock); - kfree(lopt); - return -EADDRINUSE; -#endif -} - -/* - * This routine closes sockets which have been at least partially - * opened, but not yet accepted. - */ - -static void tcp_listen_stop (struct sock *sk) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - struct tcp_listen_opt *lopt = tp->listen_opt; - struct open_request *acc_req = tp->accept_queue; - struct open_request *req; - int i; - - tcp_delete_keepalive_timer(sk); - - /* make all the listen_opt local to us */ - write_lock_bh(&tp->syn_wait_lock); - tp->listen_opt =NULL; - write_unlock_bh(&tp->syn_wait_lock); - tp->accept_queue = tp->accept_queue_tail = NULL; - - if (lopt->qlen) { - for (i=0; i<TCP_SYNQ_HSIZE; i++) { - while ((req = lopt->syn_table[i]) != NULL) { - lopt->syn_table[i] = req->dl_next; - lopt->qlen--; - tcp_openreq_free(req); - - /* Following specs, it would be better either to send FIN - * (and enter FIN-WAIT-1, it is normal close) - * or to send active reset (abort). - * Certainly, it is pretty dangerous while synflood, but it is - * bad justification for our negligence 8) - * To be honest, we are not able to make either - * of the variants now. --ANK - */ - } - } - } - BUG_TRAP(lopt->qlen == 0); - - kfree(lopt); - - while ((req=acc_req) != NULL) { - struct sock *child = req->sk; - - acc_req = req->dl_next; - - local_bh_disable(); - bh_lock_sock(child); - BUG_TRAP(child->lock.users==0); - sock_hold(child); - - tcp_disconnect(child, O_NONBLOCK); - - sock_orphan(child); - - atomic_inc(&tcp_orphan_count); - - tcp_destroy_sock(child); - - bh_unlock_sock(child); - local_bh_enable(); - sock_put(child); - - tcp_acceptq_removed(sk); - tcp_openreq_fastfree(req); - } - BUG_TRAP(sk->ack_backlog == 0); -#endif -} - -/* - * Wait for a socket to get into the connected state - * - * Note: Must be called with the socket locked. - */ -static int wait_for_tcp_connect(struct sock * sk, int flags, long *timeo_p) -{ -#if 0 - struct task_struct *tsk = current; - DECLARE_WAITQUEUE(wait, tsk); - - while((1 << sk->state) & ~(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)) { - if(sk->err) - return sock_error(sk); - if((1 << sk->state) & - ~(TCPF_SYN_SENT | TCPF_SYN_RECV)) - return -EPIPE; - if(!*timeo_p) - return -EAGAIN; - if(signal_pending(tsk)) - return sock_intr_errno(*timeo_p); - - __set_task_state(tsk, TASK_INTERRUPTIBLE); - add_wait_queue(sk->sleep, &wait); - sk->tp_pinfo.af_tcp.write_pending++; - - release_sock(sk); - *timeo_p = schedule_timeout(*timeo_p); - lock_sock(sk); - - __set_task_state(tsk, TASK_RUNNING); - remove_wait_queue(sk->sleep, &wait); - sk->tp_pinfo.af_tcp.write_pending--; - } - return 0; -#else - return 0; -#endif -} - -static inline int tcp_memory_free(struct sock *sk) -{ - return sk->wmem_queued < sk->sndbuf; -} - -/* - * Wait for more memory for a socket - */ -static int wait_for_tcp_memory(struct sock * sk, long *timeo) -{ -#if 0 - int err = 0; - long vm_wait = 0; - long current_timeo = *timeo; - DECLARE_WAITQUEUE(wait, current); - - if (tcp_memory_free(sk)) - current_timeo = vm_wait = (net_random()%(HZ/5))+2; - - add_wait_queue(sk->sleep, &wait); - for (;;) { - set_bit(SOCK_ASYNC_NOSPACE, &sk->socket->flags); - - set_current_state(TASK_INTERRUPTIBLE); - - if (sk->err || (sk->shutdown & SEND_SHUTDOWN)) - goto do_error; - if (!*timeo) - goto do_nonblock; - if (signal_pending(current)) - goto do_interrupted; - clear_bit(SOCK_ASYNC_NOSPACE, &sk->socket->flags); - if (tcp_memory_free(sk) && !vm_wait) - break; - - set_bit(SOCK_NOSPACE, &sk->socket->flags); - sk->tp_pinfo.af_tcp.write_pending++; - release_sock(sk); - if (!tcp_memory_free(sk) || vm_wait) - current_timeo = schedule_timeout(current_timeo); - lock_sock(sk); - sk->tp_pinfo.af_tcp.write_pending--; - - if (vm_wait) { - vm_wait -= current_timeo; - current_timeo = *timeo; - if (current_timeo != MAX_SCHEDULE_TIMEOUT && - (current_timeo -= vm_wait) < 0) - current_timeo = 0; - vm_wait = 0; - } - *timeo = current_timeo; - } -out: - current->state = TASK_RUNNING; - remove_wait_queue(sk->sleep, &wait); - return err; - -do_error: - err = -EPIPE; - goto out; -do_nonblock: - err = -EAGAIN; - goto out; -do_interrupted: - err = sock_intr_errno(*timeo); - goto out; -#endif -} - -ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffset, size_t psize, int flags); - -static inline int -can_coalesce(struct sk_buff *skb, int i, struct page *page, int off) -{ -#if 0 - if (i) { - skb_frag_t *frag = &skb_shinfo(skb)->frags[i-1]; - return page == frag->page && - off == frag->page_offset+frag->size; - } - return 0; -#else -return 0; -#endif -} - -static inline void -fill_page_desc(struct sk_buff *skb, int i, struct page *page, int off, int size) -{ - skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; - frag->page = page; - frag->page_offset = off; - frag->size = size; - skb_shinfo(skb)->nr_frags = i+1; -} - -static inline void tcp_mark_push(struct tcp_opt *tp, struct sk_buff *skb) -{ - TCP_SKB_CB(skb)->flags |= TCPCB_FLAG_PSH; - tp->pushed_seq = tp->write_seq; -} - -static inline int forced_push(struct tcp_opt *tp) -{ - return after(tp->write_seq, tp->pushed_seq + (tp->max_window>>1)); -} - -static inline void -skb_entail(struct sock *sk, struct tcp_opt *tp, struct sk_buff *skb) -{ - skb->csum = 0; - TCP_SKB_CB(skb)->seq = tp->write_seq; - TCP_SKB_CB(skb)->end_seq = tp->write_seq; - TCP_SKB_CB(skb)->flags = TCPCB_FLAG_ACK; - TCP_SKB_CB(skb)->sacked = 0; - __skb_queue_tail(&sk->write_queue, skb); - tcp_charge_skb(sk, skb); - if (tp->send_head == NULL) - tp->send_head = skb; -} - -static inline void -tcp_mark_urg(struct tcp_opt *tp, int flags, struct sk_buff *skb) -{ -#if 0 - if (flags & MSG_OOB) { - tp->urg_mode = 1; - tp->snd_up = tp->write_seq; - TCP_SKB_CB(skb)->sacked |= TCPCB_URG; - } -#endif -} - -static inline void -tcp_push(struct sock *sk, struct tcp_opt *tp, int flags, int mss_now, int nonagle) -{ -#if 0 - if (tp->send_head) { - struct sk_buff *skb = sk->write_queue.prev; - if (!(flags&MSG_MORE) || forced_push(tp)) - tcp_mark_push(tp, skb); - tcp_mark_urg(tp, flags, skb); - __tcp_push_pending_frames(sk, tp, mss_now, (flags&MSG_MORE) ? 2 : nonagle); - } -#endif -} - -static int tcp_error(struct sock *sk, int flags, int err) -{ -#if 0 - if (err == -EPIPE) - err = sock_error(sk) ? : -EPIPE; - if (err == -EPIPE && !(flags&MSG_NOSIGNAL)) - send_sig(SIGPIPE, current, 0); - return err; -#else - return 0; -#endif -} - -ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffset, size_t psize, int flags) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - int mss_now; - int err; - ssize_t copied; - long timeo = sock_sndtimeo(sk, flags&MSG_DONTWAIT); - - /* Wait for a connection to finish. */ - if ((1 << sk->state) & ~(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)) - if((err = wait_for_tcp_connect(sk, 0, &timeo)) != 0) - goto out_err; - - clear_bit(SOCK_ASYNC_NOSPACE, &sk->socket->flags); - - mss_now = tcp_current_mss(sk); - copied = 0; - - err = -EPIPE; - if (sk->err || (sk->shutdown & SEND_SHUTDOWN)) - goto do_error; - - while (psize > 0) { - struct sk_buff *skb = sk->write_queue.prev; - int offset, size, copy, i; - struct page *page; - - page = pages[poffset/PAGE_SIZE]; - offset = poffset % PAGE_SIZE; - size = min_t(size_t, psize, PAGE_SIZE-offset); - - if (tp->send_head==NULL || (copy = mss_now - skb->len) <= 0) { -new_segment: - if (!tcp_memory_free(sk)) - goto wait_for_sndbuf; - - skb = tcp_alloc_pskb(sk, 0, tp->mss_cache, sk->allocation); - if (skb == NULL) - goto wait_for_memory; - - skb_entail(sk, tp, skb); - copy = mss_now; - } - - if (copy > size) - copy = size; - - i = skb_shinfo(skb)->nr_frags; - if (can_coalesce(skb, i, page, offset)) { - skb_shinfo(skb)->frags[i-1].size += copy; - } else if (i < MAX_SKB_FRAGS) { - get_page(page); - fill_page_desc(skb, i, page, offset, copy); - } else { - tcp_mark_push(tp, skb); - goto new_segment; - } - - skb->len += copy; - skb->data_len += copy; - skb->ip_summed = CHECKSUM_HW; - tp->write_seq += copy; - TCP_SKB_CB(skb)->end_seq += copy; - - if (!copied) - TCP_SKB_CB(skb)->flags &= ~TCPCB_FLAG_PSH; - - copied += copy; - poffset += copy; - if (!(psize -= copy)) - goto out; - - if (skb->len != mss_now || (flags&MSG_OOB)) - continue; - - if (forced_push(tp)) { - tcp_mark_push(tp, skb); - __tcp_push_pending_frames(sk, tp, mss_now, 1); - } else if (skb == tp->send_head) - tcp_push_one(sk, mss_now); - continue; - -wait_for_sndbuf: - set_bit(SOCK_NOSPACE, &sk->socket->flags); -wait_for_memory: - if (copied) - tcp_push(sk, tp, flags&~MSG_MORE, mss_now, 1); - - if ((err = wait_for_tcp_memory(sk, &timeo)) != 0) - goto do_error; - - mss_now = tcp_current_mss(sk); - } - -out: - if (copied) - tcp_push(sk, tp, flags, mss_now, tp->nonagle); - return copied; - -do_error: - if (copied) - goto out; -out_err: - return tcp_error(sk, flags, err); -#else -return 0; -#endif -} - -ssize_t tcp_sendpage(struct socket *sock, struct page *page, int offset, size_t size, int flags) -{ -#if 0 - ssize_t res; - struct sock *sk = sock->sk; - -#define TCP_ZC_CSUM_FLAGS (NETIF_F_IP_CSUM|NETIF_F_NO_CSUM|NETIF_F_HW_CSUM) - - if (!(sk->route_caps & NETIF_F_SG) || - !(sk->route_caps & TCP_ZC_CSUM_FLAGS)) - return sock_no_sendpage(sock, page, offset, size, flags); - -#undef TCP_ZC_CSUM_FLAGS - - lock_sock(sk); - TCP_CHECK_TIMER(sk); - res = do_tcp_sendpages(sk, &page, offset, size, flags); - TCP_CHECK_TIMER(sk); - release_sock(sk); - return res; -#else - return 0; -#endif -} - -#define TCP_PAGE(sk) (sk->tp_pinfo.af_tcp.sndmsg_page) -#define TCP_OFF(sk) (sk->tp_pinfo.af_tcp.sndmsg_off) - -static inline int -tcp_copy_to_page(struct sock *sk, char *from, struct sk_buff *skb, - struct page *page, int off, int copy) -{ - int err = 0; - unsigned int csum; - - csum = csum_and_copy_from_user(from, page_address(page)+off, - copy, 0, &err); - if (!err) { - if (skb->ip_summed == CHECKSUM_NONE) - skb->csum = csum_block_add(skb->csum, csum, skb->len); - skb->len += copy; - skb->data_len += copy; - skb->truesize += copy; - sk->wmem_queued += copy; - sk->forward_alloc -= copy; - } - return err; -} - -static inline int -skb_add_data(struct sk_buff *skb, char *from, int copy) -{ -#if 0 - int err = 0; - unsigned int csum; - int off = skb->len; - - csum = csum_and_copy_from_user(from, skb_put(skb, copy), - copy, 0, &err); - if (!err) { - skb->csum = csum_block_add(skb->csum, csum, off); - return 0; - } - - __skb_trim(skb, off); - return -EFAULT; -#else -return 0; -#endif -} - -static inline int select_size(struct sock *sk, struct tcp_opt *tp) -{ -#if 0 - int tmp = tp->mss_cache; - - if (sk->route_caps&NETIF_F_SG) { - int pgbreak = SKB_MAX_HEAD(MAX_TCP_HEADER); - - if (tmp >= pgbreak && tmp <= pgbreak + (MAX_SKB_FRAGS-1)*PAGE_SIZE) - tmp = pgbreak; - } - return tmp; -#else - return 0; -#endif -} - -int tcp_sendmsg(struct sock *sk, struct msghdr *msg, int size) -{ -#if 0 - struct iovec *iov; - struct tcp_opt *tp; - struct sk_buff *skb; - int iovlen, flags; - int mss_now; - int err, copied; - long timeo; - - tp = &(sk->tp_pinfo.af_tcp); - - lock_sock(sk); - TCP_CHECK_TIMER(sk); - - flags = msg->msg_flags; - timeo = sock_sndtimeo(sk, flags&MSG_DONTWAIT); - - /* Wait for a connection to finish. */ - if ((1 << sk->state) & ~(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)) - if((err = wait_for_tcp_connect(sk, flags, &timeo)) != 0) - goto out_err; - - /* This should be in poll */ - clear_bit(SOCK_ASYNC_NOSPACE, &sk->socket->flags); - - mss_now = tcp_current_mss(sk); - - /* Ok commence sending. */ - iovlen = msg->msg_iovlen; - iov = msg->msg_iov; - copied = 0; - - err = -EPIPE; - if (sk->err || (sk->shutdown&SEND_SHUTDOWN)) - goto do_error; - - while (--iovlen >= 0) { - int seglen=iov->iov_len; - unsigned char * from=iov->iov_base; - - iov++; - - while (seglen > 0) { - int copy; - - skb = sk->write_queue.prev; - - if (tp->send_head == NULL || - (copy = mss_now - skb->len) <= 0) { - -new_segment: - /* Allocate new segment. If the interface is SG, - * allocate skb fitting to single page. - */ - if (!tcp_memory_free(sk)) - goto wait_for_sndbuf; - - skb = tcp_alloc_pskb(sk, select_size(sk, tp), 0, sk->allocation); - if (skb == NULL) - goto wait_for_memory; - - skb_entail(sk, tp, skb); - copy = mss_now; - } - - /* Try to append data to the end of skb. */ - if (copy > seglen) - copy = seglen; - - /* Where to copy to? */ - if (skb_tailroom(skb) > 0) { - /* We have some space in skb head. Superb! */ - if (copy > skb_tailroom(skb)) - copy = skb_tailroom(skb); - if ((err = skb_add_data(skb, from, copy)) != 0) - goto do_fault; - } else { - int merge = 0; - int i = skb_shinfo(skb)->nr_frags; - struct page *page = TCP_PAGE(sk); - int off = TCP_OFF(sk); - - if (can_coalesce(skb, i, page, off) && off != PAGE_SIZE) { - /* We can extend the last page fragment. */ - merge = 1; - } else if (i == MAX_SKB_FRAGS || - (i == 0 && !(sk->route_caps&NETIF_F_SG))) { - /* Need to add new fragment and cannot - * do this because interface is non-SG, - * or because all the page slots are busy. - */ - tcp_mark_push(tp, skb); - goto new_segment; - } else if (page) { - /* If page is cached, align - * offset to L1 cache boundary - */ - off = (off+L1_CACHE_BYTES-1)&~(L1_CACHE_BYTES-1); - if (off == PAGE_SIZE) { - put_page(page); - TCP_PAGE(sk) = page = NULL; - } - } - - if (!page) { - /* Allocate new cache page. */ - if (!(page=tcp_alloc_page(sk))) - goto wait_for_memory; - off = 0; - } - - if (copy > PAGE_SIZE-off) - copy = PAGE_SIZE-off; - - /* Time to copy data. We are close to the end! */ - err = tcp_copy_to_page(sk, from, skb, page, off, copy); - if (err) { - /* If this page was new, give it to the - * socket so it does not get leaked. - */ - if (TCP_PAGE(sk) == NULL) { - TCP_PAGE(sk) = page; - TCP_OFF(sk) = 0; - } - goto do_error; - } - - /* Update the skb. */ - if (merge) { - skb_shinfo(skb)->frags[i-1].size += copy; - } else { - fill_page_desc(skb, i, page, off, copy); - if (TCP_PAGE(sk)) { - get_page(page); - } else if (off + copy < PAGE_SIZE) { - get_page(page); - TCP_PAGE(sk) = page; - } - } - - TCP_OFF(sk) = off+copy; - } - - if (!copied) - TCP_SKB_CB(skb)->flags &= ~TCPCB_FLAG_PSH; - - tp->write_seq += copy; - TCP_SKB_CB(skb)->end_seq += copy; - - from += copy; - copied += copy; - if ((seglen -= copy) == 0 && iovlen == 0) - goto out; - - if (skb->len != mss_now || (flags&MSG_OOB)) - continue; - - if (forced_push(tp)) { - tcp_mark_push(tp, skb); - __tcp_push_pending_frames(sk, tp, mss_now, 1); - } else if (skb == tp->send_head) - tcp_push_one(sk, mss_now); - continue; - -wait_for_sndbuf: - set_bit(SOCK_NOSPACE, &sk->socket->flags); -wait_for_memory: - if (copied) - tcp_push(sk, tp, flags&~MSG_MORE, mss_now, 1); - - if ((err = wait_for_tcp_memory(sk, &timeo)) != 0) - goto do_error; - - mss_now = tcp_current_mss(sk); - } - } - -out: - if (copied) - tcp_push(sk, tp, flags, mss_now, tp->nonagle); - TCP_CHECK_TIMER(sk); - release_sock(sk); - return copied; - -do_fault: - if (skb->len == 0) { - if (tp->send_head == skb) - tp->send_head = NULL; - __skb_unlink(skb, skb->list); - tcp_free_skb(sk, skb); - } - -do_error: - if (copied) - goto out; -out_err: - err = tcp_error(sk, flags, err); - TCP_CHECK_TIMER(sk); - release_sock(sk); - return err; -#else - return 0; -#endif -} - -/* - * Handle reading urgent data. BSD has very simple semantics for - * this, no blocking and very strange errors 8) - */ - -static int tcp_recv_urg(struct sock * sk, long timeo, - struct msghdr *msg, int len, int flags, - int *addr_len) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - - /* No URG data to read. */ - if (sk->urginline || !tp->urg_data || tp->urg_data == TCP_URG_READ) - return -EINVAL; /* Yes this is right ! */ - - if (sk->state==TCP_CLOSE && !sk->done) - return -ENOTCONN; - - if (tp->urg_data & TCP_URG_VALID) { - int err = 0; - char c = tp->urg_data; - - if (!(flags & MSG_PEEK)) - tp->urg_data = TCP_URG_READ; - - /* Read urgent data. */ - msg->msg_flags|=MSG_OOB; - - if(len>0) { - if (!(flags & MSG_TRUNC)) - err = memcpy_toiovec(msg->msg_iov, &c, 1); - len = 1; - } else - msg->msg_flags|=MSG_TRUNC; - - return err ? -EFAULT : len; - } - - if (sk->state == TCP_CLOSE || (sk->shutdown & RCV_SHUTDOWN)) - return 0; - - /* Fixed the recv(..., MSG_OOB) behaviour. BSD docs and - * the available implementations agree in this case: - * this call should never block, independent of the - * blocking state of the socket. - * Mike <pall@rz.uni-karlsruhe.de> - */ - return -EAGAIN; -#else -return 0; -#endif -} - -/* - * Release a skb if it is no longer needed. This routine - * must be called with interrupts disabled or with the - * socket locked so that the sk_buff queue operation is ok. - */ - -static inline void tcp_eat_skb(struct sock *sk, struct sk_buff * skb) -{ -#if 0 - __skb_unlink(skb, &sk->receive_queue); - __kfree_skb(skb); -#endif -} - -/* Clean up the receive buffer for full frames taken by the user, - * then send an ACK if necessary. COPIED is the number of bytes - * tcp_recvmsg has given to the user so far, it speeds up the - * calculation of whether or not we must ACK for the sake of - * a window update. - */ -static void cleanup_rbuf(struct sock *sk, int copied) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - int time_to_ack = 0; - -#if TCP_DEBUG - struct sk_buff *skb = skb_peek(&sk->receive_queue); - - BUG_TRAP(skb==NULL || before(tp->copied_seq, TCP_SKB_CB(skb)->end_seq)); -#endif - - if (tcp_ack_scheduled(tp)) { - /* Delayed ACKs frequently hit locked sockets during bulk receive. */ - if (tp->ack.blocked - /* Once-per-two-segments ACK was not sent by tcp_input.c */ - || tp->rcv_nxt - tp->rcv_wup > tp->ack.rcv_mss - /* - * If this read emptied read buffer, we send ACK, if - * connection is not bidirectional, user drained - * receive buffer and there was a small segment - * in queue. - */ - || (copied > 0 && - (tp->ack.pending&TCP_ACK_PUSHED) && - !tp->ack.pingpong && - atomic_read(&sk->rmem_alloc) == 0)) { - time_to_ack = 1; - } - } - - /* We send an ACK if we can now advertise a non-zero window - * which has been raised "significantly". - * - * Even if window raised up to infinity, do not send window open ACK - * in states, where we will not receive more. It is useless. - */ - if(copied > 0 && !time_to_ack && !(sk->shutdown&RCV_SHUTDOWN)) { - __u32 rcv_window_now = tcp_receive_window(tp); - - /* Optimize, __tcp_select_window() is not cheap. */ - if (2*rcv_window_now <= tp->window_clamp) { - __u32 new_window = __tcp_select_window(sk); - - /* Send ACK now, if this read freed lots of space - * in our buffer. Certainly, new_window is new window. - * We can advertise it now, if it is not less than current one. - * "Lots" means "at least twice" here. - */ - if(new_window && new_window >= 2*rcv_window_now) - time_to_ack = 1; - } - } - if (time_to_ack) - tcp_send_ack(sk); -#endif -} - -/* Now socket state including sk->err is changed only under lock, - * hence we may omit checks after joining wait queue. - * We check receive queue before schedule() only as optimization; - * it is very likely that release_sock() added new data. - */ - -static long tcp_data_wait(struct sock *sk, long timeo) -{ -#if 0 - DECLARE_WAITQUEUE(wait, current); - - add_wait_queue(sk->sleep, &wait); - - __set_current_state(TASK_INTERRUPTIBLE); - - set_bit(SOCK_ASYNC_WAITDATA, &sk->socket->flags); - release_sock(sk); - - if (skb_queue_empty(&sk->receive_queue)) - timeo = schedule_timeout(timeo); - - lock_sock(sk); - clear_bit(SOCK_ASYNC_WAITDATA, &sk->socket->flags); - - remove_wait_queue(sk->sleep, &wait); - __set_current_state(TASK_RUNNING); - return timeo; -#else - return 0; -#endif -} - -static void tcp_prequeue_process(struct sock *sk) -{ -#if 0 - struct sk_buff *skb; - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - - net_statistics[smp_processor_id()*2+1].TCPPrequeued += skb_queue_len(&tp->ucopy.prequeue); - - /* RX process wants to run with disabled BHs, though it is not necessary */ - local_bh_disable(); - while ((skb = __skb_dequeue(&tp->ucopy.prequeue)) != NULL) - sk->backlog_rcv(sk, skb); - local_bh_enable(); - - /* Clear memory counter. */ - tp->ucopy.memory = 0; -#endif -} - -static inline -struct sk_buff *tcp_recv_skb(struct sock *sk, u32 seq, u32 *off) -{ -#if 0 - struct sk_buff *skb; - u32 offset; - - skb_queue_walk(&sk->receive_queue, skb) { - offset = seq - TCP_SKB_CB(skb)->seq; - if (skb->h.th->syn) - offset--; - if (offset < skb->len || skb->h.th->fin) { - *off = offset; - return skb; - } - } - return NULL; -#else - return NULL; -#endif -} - -/* - * This routine provides an alternative to tcp_recvmsg() for routines - * that would like to handle copying from skbuffs directly in 'sendfile' - * fashion. - * Note: - * - It is assumed that the socket was locked by the caller. - * - The routine does not block. - * - At present, there is no support for reading OOB data - * or for 'peeking' the socket using this routine - * (although both would be easy to implement). - */ -int tcp_read_sock(struct sock *sk, read_descriptor_t *desc, - sk_read_actor_t recv_actor) -{ -#if 0 - struct sk_buff *skb; - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - u32 seq = tp->copied_seq; - u32 offset; - int copied = 0; - - if (sk->state == TCP_LISTEN) - return -ENOTCONN; - while ((skb = tcp_recv_skb(sk, seq, &offset)) != NULL) { - if (offset < skb->len) { - size_t used, len; - - len = skb->len - offset; - /* Stop reading if we hit a patch of urgent data */ - if (tp->urg_data) { - u32 urg_offset = tp->urg_seq - seq; - if (urg_offset < len) - len = urg_offset; - if (!len) - break; - } - used = recv_actor(desc, skb, offset, len); - if (used <= len) { - seq += used; - copied += used; - offset += used; - } - if (offset != skb->len) - break; - } - if (skb->h.th->fin) { - tcp_eat_skb(sk, skb); - ++seq; - break; - } - tcp_eat_skb(sk, skb); - if (!desc->count) - break; - } - tp->copied_seq = seq; - /* Clean up data we have read: This will do ACK frames. */ - if (copied) - cleanup_rbuf(sk, copied); - return copied; -#else -#endif -} - -/* - * This routine copies from a sock struct into the user buffer. - * - * Technical note: in 2.3 we work on _locked_ socket, so that - * tricks with *seq access order and skb->users are not required. - * Probably, code can be easily improved even more. - */ - -int tcp_recvmsg(struct sock *sk, struct msghdr *msg, - int len, int nonblock, int flags, int *addr_len) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - int copied = 0; - u32 peek_seq; - u32 *seq; - unsigned long used; - int err; - int target; /* Read at least this many bytes */ - long timeo; - struct task_struct *user_recv = NULL; - - lock_sock(sk); - - TCP_CHECK_TIMER(sk); - - err = -ENOTCONN; - if (sk->state == TCP_LISTEN) - goto out; - - timeo = sock_rcvtimeo(sk, nonblock); - - /* Urgent data needs to be handled specially. */ - if (flags & MSG_OOB) - goto recv_urg; - - seq = &tp->copied_seq; - if (flags & MSG_PEEK) { - peek_seq = tp->copied_seq; - seq = &peek_seq; - } - - target = sock_rcvlowat(sk, flags & MSG_WAITALL, len); - - do { - struct sk_buff * skb; - u32 offset; - - /* Are we at urgent data? Stop if we have read anything. */ - if (copied && tp->urg_data && tp->urg_seq == *seq) - break; - - /* We need to check signals first, to get correct SIGURG - * handling. FIXME: Need to check this doesn't impact 1003.1g - * and move it down to the bottom of the loop - */ - if (signal_pending(current)) { - if (copied) - break; - copied = timeo ? sock_intr_errno(timeo) : -EAGAIN; - break; - } - - /* Next get a buffer. */ - - skb = skb_peek(&sk->receive_queue); - do { - if (!skb) - break; - - /* Now that we have two receive queues this - * shouldn't happen. - */ - if (before(*seq, TCP_SKB_CB(skb)->seq)) { - printk(KERN_INFO "recvmsg bug: copied %X seq %X\n", - *seq, TCP_SKB_CB(skb)->seq); - break; - } - offset = *seq - TCP_SKB_CB(skb)->seq; - if (skb->h.th->syn) - offset--; - if (offset < skb->len) - goto found_ok_skb; - if (skb->h.th->fin) - goto found_fin_ok; - BUG_TRAP(flags&MSG_PEEK); - skb = skb->next; - } while (skb != (struct sk_buff *)&sk->receive_queue); - - /* Well, if we have backlog, try to process it now yet. */ - - if (copied >= target && sk->backlog.tail == NULL) - break; - - if (copied) { - if (sk->err || - sk->state == TCP_CLOSE || - (sk->shutdown & RCV_SHUTDOWN) || - !timeo || - (flags & MSG_PEEK)) - break; - } else { - if (sk->done) - break; - - if (sk->err) { - copied = sock_error(sk); - break; - } - - if (sk->shutdown & RCV_SHUTDOWN) - break; - - if (sk->state == TCP_CLOSE) { - if (!sk->done) { - /* This occurs when user tries to read - * from never connected socket. - */ - copied = -ENOTCONN; - break; - } - break; - } - - if (!timeo) { - copied = -EAGAIN; - break; - } - } - - cleanup_rbuf(sk, copied); - - if (tp->ucopy.task == user_recv) { - /* Install new reader */ - if (user_recv == NULL && !(flags&(MSG_TRUNC|MSG_PEEK))) { - user_recv = current; - tp->ucopy.task = user_recv; - tp->ucopy.iov = msg->msg_iov; - } - - tp->ucopy.len = len; - - BUG_TRAP(tp->copied_seq == tp->rcv_nxt || (flags&(MSG_PEEK|MSG_TRUNC))); - - /* Ugly... If prequeue is not empty, we have to - * process it before releasing socket, otherwise - * order will be broken at second iteration. - * More elegant solution is required!!! - * - * Look: we have the following (pseudo)queues: - * - * 1. packets in flight - * 2. backlog - * 3. prequeue - * 4. receive_queue - * - * Each queue can be processed only if the next ones - * are empty. At this point we have empty receive_queue. - * But prequeue _can_ be not empty after second iteration, - * when we jumped to start of loop because backlog - * processing added something to receive_queue. - * We cannot release_sock(), because backlog contains - * packets arrived _after_ prequeued ones. - * - * Shortly, algorithm is clear --- to process all - * the queues in order. We could make it more directly, - * requeueing packets from backlog to prequeue, if - * is not empty. It is more elegant, but eats cycles, - * unfortunately. - */ - if (skb_queue_len(&tp->ucopy.prequeue)) - goto do_prequeue; - - /* __ Set realtime policy in scheduler __ */ - } - - if (copied >= target) { - /* Do not sleep, just process backlog. */ - release_sock(sk); - lock_sock(sk); - } else { - timeo = tcp_data_wait(sk, timeo); - } - - if (user_recv) { - int chunk; - - /* __ Restore normal policy in scheduler __ */ - - if ((chunk = len - tp->ucopy.len) != 0) { - net_statistics[smp_processor_id()*2+1].TCPDirectCopyFromBacklog += chunk; - len -= chunk; - copied += chunk; - } - - if (tp->rcv_nxt == tp->copied_seq && - skb_queue_len(&tp->ucopy.prequeue)) { -do_prequeue: - tcp_prequeue_process(sk); - - if ((chunk = len - tp->ucopy.len) != 0) { - net_statistics[smp_processor_id()*2+1].TCPDirectCopyFromPrequeue += chunk; - len -= chunk; - copied += chunk; - } - } - } - if ((flags & MSG_PEEK) && peek_seq != tp->copied_seq) { - if (net_ratelimit()) - printk(KERN_DEBUG "TCP(%s:%d): Application bug, race in MSG_PEEK.\n", - current->comm, current->pid); - peek_seq = tp->copied_seq; - } - continue; - - found_ok_skb: - /* Ok so how much can we use? */ - used = skb->len - offset; - if (len < used) - used = len; - - /* Do we have urgent data here? */ - if (tp->urg_data) { - u32 urg_offset = tp->urg_seq - *seq; - if (urg_offset < used) { - if (!urg_offset) { - if (!sk->urginline) { - ++*seq; - offset++; - used--; - if (!used) - goto skip_copy; - } - } else - used = urg_offset; - } - } - - if (!(flags&MSG_TRUNC)) { - err = skb_copy_datagram_iovec(skb, offset, msg->msg_iov, used); - if (err) { - /* Exception. Bailout! */ - if (!copied) - copied = -EFAULT; - break; - } - } - - *seq += used; - copied += used; - len -= used; - -skip_copy: - if (tp->urg_data && after(tp->copied_seq,tp->urg_seq)) { - tp->urg_data = 0; - tcp_fast_path_check(sk, tp); - } - if (used + offset < skb->len) - continue; - - if (skb->h.th->fin) - goto found_fin_ok; - if (!(flags & MSG_PEEK)) - tcp_eat_skb(sk, skb); - continue; - - found_fin_ok: - /* Process the FIN. */ - ++*seq; - if (!(flags & MSG_PEEK)) - tcp_eat_skb(sk, skb); - break; - } while (len > 0); - - if (user_recv) { - if (skb_queue_len(&tp->ucopy.prequeue)) { - int chunk; - - tp->ucopy.len = copied > 0 ? len : 0; - - tcp_prequeue_process(sk); - - if (copied > 0 && (chunk = len - tp->ucopy.len) != 0) { - net_statistics[smp_processor_id()*2+1].TCPDirectCopyFromPrequeue += chunk; - len -= chunk; - copied += chunk; - } - } - - tp->ucopy.task = NULL; - tp->ucopy.len = 0; - } - - /* According to UNIX98, msg_name/msg_namelen are ignored - * on connected socket. I was just happy when found this 8) --ANK - */ - - /* Clean up data we have read: This will do ACK frames. */ - cleanup_rbuf(sk, copied); - - TCP_CHECK_TIMER(sk); - release_sock(sk); - return copied; - -out: - TCP_CHECK_TIMER(sk); - release_sock(sk); - return err; - -recv_urg: - err = tcp_recv_urg(sk, timeo, msg, len, flags, addr_len); - goto out; -#else - return 0; -#endif -} - -/* - * State processing on a close. This implements the state shift for - * sending our FIN frame. Note that we only send a FIN for some - * states. A shutdown() may have already sent the FIN, or we may be - * closed. - */ - -static unsigned char new_state[16] = { - /* current state: new state: action: */ - /* (Invalid) */ TCP_CLOSE, - /* TCP_ESTABLISHED */ TCP_FIN_WAIT1 | TCP_ACTION_FIN, - /* TCP_SYN_SENT */ TCP_CLOSE, - /* TCP_SYN_RECV */ TCP_FIN_WAIT1 | TCP_ACTION_FIN, - /* TCP_FIN_WAIT1 */ TCP_FIN_WAIT1, - /* TCP_FIN_WAIT2 */ TCP_FIN_WAIT2, - /* TCP_TIME_WAIT */ TCP_CLOSE, - /* TCP_CLOSE */ TCP_CLOSE, - /* TCP_CLOSE_WAIT */ TCP_LAST_ACK | TCP_ACTION_FIN, - /* TCP_LAST_ACK */ TCP_LAST_ACK, - /* TCP_LISTEN */ TCP_CLOSE, - /* TCP_CLOSING */ TCP_CLOSING, -}; - -static int tcp_close_state(struct sock *sk) -{ -#if 0 - int next = (int) new_state[sk->state]; - int ns = (next & TCP_STATE_MASK); - - tcp_set_state(sk, ns); - - return (next & TCP_ACTION_FIN); -#else - return 0; -#endif -} - -/* - * Shutdown the sending side of a connection. Much like close except - * that we don't receive shut down or set sk->dead. - */ - -void tcp_shutdown(struct sock *sk, int how) -{ -#if 0 - /* We need to grab some memory, and put together a FIN, - * and then put it into the queue to be sent. - * Tim MacKenzie(tym@dibbler.cs.monash.edu.au) 4 Dec '92. - */ - if (!(how & SEND_SHUTDOWN)) - return; - - /* If we've already sent a FIN, or it's a closed state, skip this. */ - if ((1 << sk->state) & - (TCPF_ESTABLISHED|TCPF_SYN_SENT|TCPF_SYN_RECV|TCPF_CLOSE_WAIT)) { - /* Clear out any half completed packets. FIN if needed. */ - if (tcp_close_state(sk)) - tcp_send_fin(sk); - } -#endif -} - - -/* - * Return 1 if we still have things to send in our buffers. - */ - -static inline int closing(struct sock * sk) -{ -#if 0 - return ((1 << sk->state) & (TCPF_FIN_WAIT1|TCPF_CLOSING|TCPF_LAST_ACK)); -#else - return 0; -#endif -} - -static __inline__ void tcp_kill_sk_queues(struct sock *sk) -{ -#if 0 - /* First the read buffer. */ - __skb_queue_purge(&sk->receive_queue); - - /* Next, the error queue. */ - __skb_queue_purge(&sk->error_queue); - - /* Next, the write queue. */ - BUG_TRAP(skb_queue_empty(&sk->write_queue)); - - /* Account for returned memory. */ - tcp_mem_reclaim(sk); - - BUG_TRAP(sk->wmem_queued == 0); - BUG_TRAP(sk->forward_alloc == 0); - - /* It is _impossible_ for the backlog to contain anything - * when we get here. All user references to this socket - * have gone away, only the net layer knows can touch it. - */ -#endif -} - -/* - * At this point, there should be no process reference to this - * socket, and thus no user references at all. Therefore we - * can assume the socket waitqueue is inactive and nobody will - * try to jump onto it. - */ -void tcp_destroy_sock(struct sock *sk) -{ -#if 0 - BUG_TRAP(sk->state==TCP_CLOSE); - BUG_TRAP(sk->dead); - - /* It cannot be in hash table! */ - BUG_TRAP(sk->pprev==NULL); - - /* If it has not 0 sk->num, it must be bound */ - BUG_TRAP(!sk->num || sk->prev!=NULL); - -#ifdef TCP_DEBUG - if (sk->zapped) { - printk(KERN_DEBUG "TCP: double destroy sk=%p\n", sk); - sock_hold(sk); - } - sk->zapped = 1; -#endif - - sk->prot->destroy(sk); - - tcp_kill_sk_queues(sk); - -#ifdef INET_REFCNT_DEBUG - if (atomic_read(&sk->refcnt) != 1) { - printk(KERN_DEBUG "Destruction TCP %p delayed, c=%d\n", sk, atomic_read(&sk->refcnt)); - } -#endif - - atomic_dec(&tcp_orphan_count); - sock_put(sk); -#endif -} - -void tcp_close(struct sock *sk, long timeout) -{ -#if 0 - struct sk_buff *skb; - int data_was_unread = 0; - - lock_sock(sk); - sk->shutdown = SHUTDOWN_MASK; - - if(sk->state == TCP_LISTEN) { - tcp_set_state(sk, TCP_CLOSE); - - /* Special case. */ - tcp_listen_stop(sk); - - goto adjudge_to_death; - } - - /* We need to flush the recv. buffs. We do this only on the - * descriptor close, not protocol-sourced closes, because the - * reader process may not have drained the data yet! - */ - while((skb=__skb_dequeue(&sk->receive_queue))!=NULL) { - u32 len = TCP_SKB_CB(skb)->end_seq - TCP_SKB_CB(skb)->seq - skb->h.th->fin; - data_was_unread += len; - __kfree_skb(skb); - } - - tcp_mem_reclaim(sk); - - /* As outlined in draft-ietf-tcpimpl-prob-03.txt, section - * 3.10, we send a RST here because data was lost. To - * witness the awful effects of the old behavior of always - * doing a FIN, run an older 2.1.x kernel or 2.0.x, start - * a bulk GET in an FTP client, suspend the process, wait - * for the client to advertise a zero window, then kill -9 - * the FTP client, wheee... Note: timeout is always zero - * in such a case. - */ - if(data_was_unread != 0) { - /* Unread data was tossed, zap the connection. */ - NET_INC_STATS_USER(TCPAbortOnClose); - tcp_set_state(sk, TCP_CLOSE); - tcp_send_active_reset(sk, GFP_KERNEL); - } else if (sk->linger && sk->lingertime==0) { - /* Check zero linger _after_ checking for unread data. */ - sk->prot->disconnect(sk, 0); - NET_INC_STATS_USER(TCPAbortOnData); - } else if (tcp_close_state(sk)) { - /* We FIN if the application ate all the data before - * zapping the connection. - */ - - /* RED-PEN. Formally speaking, we have broken TCP state - * machine. State transitions: - * - * TCP_ESTABLISHED -> TCP_FIN_WAIT1 - * TCP_SYN_RECV -> TCP_FIN_WAIT1 (forget it, it's impossible) - * TCP_CLOSE_WAIT -> TCP_LAST_ACK - * - * are legal only when FIN has been sent (i.e. in window), - * rather than queued out of window. Purists blame. - * - * F.e. "RFC state" is ESTABLISHED, - * if Linux state is FIN-WAIT-1, but FIN is still not sent. - * - * The visible declinations are that sometimes - * we enter time-wait state, when it is not required really - * (harmless), do not send active resets, when they are - * required by specs (TCP_ESTABLISHED, TCP_CLOSE_WAIT, when - * they look as CLOSING or LAST_ACK for Linux) - * Probably, I missed some more holelets. - * --ANK - */ - tcp_send_fin(sk); - } - - if (timeout) { - struct task_struct *tsk = current; - DECLARE_WAITQUEUE(wait, current); - - add_wait_queue(sk->sleep, &wait); - - do { - set_current_state(TASK_INTERRUPTIBLE); - if (!closing(sk)) - break; - release_sock(sk); - timeout = schedule_timeout(timeout); - lock_sock(sk); - } while (!signal_pending(tsk) && timeout); - - tsk->state = TASK_RUNNING; - remove_wait_queue(sk->sleep, &wait); - } - -adjudge_to_death: - /* It is the last release_sock in its life. It will remove backlog. */ - release_sock(sk); - - - /* Now socket is owned by kernel and we acquire BH lock - to finish close. No need to check for user refs. - */ - local_bh_disable(); - bh_lock_sock(sk); - BUG_TRAP(sk->lock.users==0); - - sock_hold(sk); - sock_orphan(sk); - - /* This is a (useful) BSD violating of the RFC. There is a - * problem with TCP as specified in that the other end could - * keep a socket open forever with no application left this end. - * We use a 3 minute timeout (about the same as BSD) then kill - * our end. If they send after that then tough - BUT: long enough - * that we won't make the old 4*rto = almost no time - whoops - * reset mistake. - * - * Nope, it was not mistake. It is really desired behaviour - * f.e. on http servers, when such sockets are useless, but - * consume significant resources. Let's do it with special - * linger2 option. --ANK - */ - - if (sk->state == TCP_FIN_WAIT2) { - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - if (tp->linger2 < 0) { - tcp_set_state(sk, TCP_CLOSE); - tcp_send_active_reset(sk, GFP_ATOMIC); - NET_INC_STATS_BH(TCPAbortOnLinger); - } else { - int tmo = tcp_fin_time(tp); - - if (tmo > TCP_TIMEWAIT_LEN) { - tcp_reset_keepalive_timer(sk, tcp_fin_time(tp)); - } else { - atomic_inc(&tcp_orphan_count); - tcp_time_wait(sk, TCP_FIN_WAIT2, tmo); - goto out; - } - } - } - if (sk->state != TCP_CLOSE) { - tcp_mem_reclaim(sk); - if (atomic_read(&tcp_orphan_count) > sysctl_tcp_max_orphans || - (sk->wmem_queued > SOCK_MIN_SNDBUF && - atomic_read(&tcp_memory_allocated) > sysctl_tcp_mem[2])) { - if (net_ratelimit()) - printk(KERN_INFO "TCP: too many of orphaned sockets\n"); - tcp_set_state(sk, TCP_CLOSE); - tcp_send_active_reset(sk, GFP_ATOMIC); - NET_INC_STATS_BH(TCPAbortOnMemory); - } - } - atomic_inc(&tcp_orphan_count); - - if (sk->state == TCP_CLOSE) - tcp_destroy_sock(sk); - /* Otherwise, socket is reprieved until protocol close. */ - -out: - bh_unlock_sock(sk); - local_bh_enable(); - sock_put(sk); -#endif -} - -/* These states need RST on ABORT according to RFC793 */ - -extern __inline__ int tcp_need_reset(int state) -{ -#if 0 - return ((1 << state) & - (TCPF_ESTABLISHED|TCPF_CLOSE_WAIT|TCPF_FIN_WAIT1| - TCPF_FIN_WAIT2|TCPF_SYN_RECV)); -#else - return 0; -#endif -} - -int tcp_disconnect(struct sock *sk, int flags) -{ -#if 0 - struct tcp_opt *tp = &sk->tp_pinfo.af_tcp; - int old_state; - int err = 0; - - old_state = sk->state; - if (old_state != TCP_CLOSE) - tcp_set_state(sk, TCP_CLOSE); - - /* ABORT function of RFC793 */ - if (old_state == TCP_LISTEN) { - tcp_listen_stop(sk); - } else if (tcp_need_reset(old_state) || - (tp->snd_nxt != tp->write_seq && - (1<<old_state)&(TCPF_CLOSING|TCPF_LAST_ACK))) { - /* The last check adjusts for discrepance of Linux wrt. RFC - * states - */ - tcp_send_active_reset(sk, gfp_any()); - sk->err = ECONNRESET; - } else if (old_state == TCP_SYN_SENT) - sk->err = ECONNRESET; - - tcp_clear_xmit_timers(sk); - __skb_queue_purge(&sk->receive_queue); - tcp_writequeue_purge(sk); - __skb_queue_purge(&tp->out_of_order_queue); - - sk->dport = 0; - - if (!(sk->userlocks&SOCK_BINDADDR_LOCK)) { - sk->rcv_saddr = 0; - sk->saddr = 0; -#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) - memset(&sk->net_pinfo.af_inet6.saddr, 0, 16); - memset(&sk->net_pinfo.af_inet6.rcv_saddr, 0, 16); -#endif - } - - sk->shutdown = 0; - sk->done = 0; - tp->srtt = 0; - if ((tp->write_seq += tp->max_window+2) == 0) - tp->write_seq = 1; - tp->backoff = 0; - tp->snd_cwnd = 2; - tp->probes_out = 0; - tp->packets_out = 0; - tp->snd_ssthresh = 0x7fffffff; - tp->snd_cwnd_cnt = 0; - tp->ca_state = TCP_CA_Open; - tcp_clear_retrans(tp); - tcp_delack_init(tp); - tp->send_head = NULL; - tp->saw_tstamp = 0; - tcp_sack_reset(tp); - __sk_dst_reset(sk); - - BUG_TRAP(!sk->num || sk->prev); - - sk->error_report(sk); - return err; -#else - return 0; -#endif -} - -/* - * Wait for an incoming connection, avoid race - * conditions. This must be called with the socket locked. - */ -static int wait_for_connect(struct sock * sk, long timeo) -{ -#if 0 - DECLARE_WAITQUEUE(wait, current); - int err; - - /* - * True wake-one mechanism for incoming connections: only - * one process gets woken up, not the 'whole herd'. - * Since we do not 'race & poll' for established sockets - * anymore, the common case will execute the loop only once. - * - * Subtle issue: "add_wait_queue_exclusive()" will be added - * after any current non-exclusive waiters, and we know that - * it will always _stay_ after any new non-exclusive waiters - * because all non-exclusive waiters are added at the - * beginning of the wait-queue. As such, it's ok to "drop" - * our exclusiveness temporarily when we get woken up without - * having to remove and re-insert us on the wait queue. - */ - add_wait_queue_exclusive(sk->sleep, &wait); - for (;;) { - current->state = TASK_INTERRUPTIBLE; - release_sock(sk); - if (sk->tp_pinfo.af_tcp.accept_queue == NULL) - timeo = schedule_timeout(timeo); - lock_sock(sk); - err = 0; - if (sk->tp_pinfo.af_tcp.accept_queue) - break; - err = -EINVAL; - if (sk->state != TCP_LISTEN) - break; - err = sock_intr_errno(timeo); - if (signal_pending(current)) - break; - err = -EAGAIN; - if (!timeo) - break; - } - current->state = TASK_RUNNING; - remove_wait_queue(sk->sleep, &wait); - return err; -#else - return 0; -#endif -} - -/* - * This will accept the next outstanding connection. - */ - -struct sock *tcp_accept(struct sock *sk, int flags, int *err) -{ -#if 0 - struct tcp_opt *tp = &sk->tp_pinfo.af_tcp; - struct open_request *req; - struct sock *newsk; - int error; - - lock_sock(sk); - - /* We need to make sure that this socket is listening, - * and that it has something pending. - */ - error = -EINVAL; - if (sk->state != TCP_LISTEN) - goto out; - - /* Find already established connection */ - if (!tp->accept_queue) { - long timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK); - - /* If this is a non blocking socket don't sleep */ - error = -EAGAIN; - if (!timeo) - goto out; - - error = wait_for_connect(sk, timeo); - if (error) - goto out; - } - - req = tp->accept_queue; - if ((tp->accept_queue = req->dl_next) == NULL) - tp->accept_queue_tail = NULL; - - newsk = req->sk; - tcp_acceptq_removed(sk); - tcp_openreq_fastfree(req); - BUG_TRAP(newsk->state != TCP_SYN_RECV); - release_sock(sk); - return newsk; - -out: - release_sock(sk); - *err = error; - return NULL; -#else - return NULL; -#endif -} - -/* - * Socket option code for TCP. - */ - -int tcp_setsockopt(struct sock *sk, int level, int optname, char *optval, - int optlen) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - int val; - int err = 0; - - if (level != SOL_TCP) - return tp->af_specific->setsockopt(sk, level, optname, - optval, optlen); - - if(optlen<sizeof(int)) - return -EINVAL; - - if (get_user(val, (int *)optval)) - return -EFAULT; - - lock_sock(sk); - - switch(optname) { - case TCP_MAXSEG: - /* values greater than interface MTU won't take effect. however at - * the point when this call is done we typically don't yet know - * which interface is going to be used - */ - if(val < 8 || val > MAX_TCP_WINDOW) { - err = -EINVAL; - break; - } - tp->user_mss = val; - break; - - case TCP_NODELAY: - /* You cannot try to use this and TCP_CORK in - * tandem, so let the user know. - */ - if (tp->nonagle == 2) { - err = -EINVAL; - break; - } - tp->nonagle = (val == 0) ? 0 : 1; - if (val) - tcp_push_pending_frames(sk, tp); - break; - - case TCP_CORK: - /* When set indicates to always queue non-full frames. - * Later the user clears this option and we transmit - * any pending partial frames in the queue. This is - * meant to be used alongside sendfile() to get properly - * filled frames when the user (for example) must write - * out headers with a write() call first and then use - * sendfile to send out the data parts. - * - * You cannot try to use TCP_NODELAY and this mechanism - * at the same time, so let the user know. - */ - if (tp->nonagle == 1) { - err = -EINVAL; - break; - } - if (val != 0) { - tp->nonagle = 2; - } else { - tp->nonagle = 0; - - tcp_push_pending_frames(sk, tp); - } - break; - - case TCP_KEEPIDLE: - if (val < 1 || val > MAX_TCP_KEEPIDLE) - err = -EINVAL; - else { - tp->keepalive_time = val * HZ; - if (sk->keepopen && !((1<<sk->state)&(TCPF_CLOSE|TCPF_LISTEN))) { - __u32 elapsed = tcp_time_stamp - tp->rcv_tstamp; - if (tp->keepalive_time > elapsed) - elapsed = tp->keepalive_time - elapsed; - else - elapsed = 0; - tcp_reset_keepalive_timer(sk, elapsed); - } - } - break; - case TCP_KEEPINTVL: - if (val < 1 || val > MAX_TCP_KEEPINTVL) - err = -EINVAL; - else - tp->keepalive_intvl = val * HZ; - break; - case TCP_KEEPCNT: - if (val < 1 || val > MAX_TCP_KEEPCNT) - err = -EINVAL; - else - tp->keepalive_probes = val; - break; - case TCP_SYNCNT: - if (val < 1 || val > MAX_TCP_SYNCNT) - err = -EINVAL; - else - tp->syn_retries = val; - break; - - case TCP_LINGER2: - if (val < 0) - tp->linger2 = -1; - else if (val > sysctl_tcp_fin_timeout/HZ) - tp->linger2 = 0; - else - tp->linger2 = val*HZ; - break; - - case TCP_DEFER_ACCEPT: - tp->defer_accept = 0; - if (val > 0) { - /* Translate value in seconds to number of retransmits */ - while (tp->defer_accept < 32 && val > ((TCP_TIMEOUT_INIT/HZ)<<tp->defer_accept)) - tp->defer_accept++; - tp->defer_accept++; - } - break; - - case TCP_WINDOW_CLAMP: - if (val==0) { - if (sk->state != TCP_CLOSE) { - err = -EINVAL; - break; - } - tp->window_clamp = 0; - } else { - tp->window_clamp = val<SOCK_MIN_RCVBUF/2 ? - SOCK_MIN_RCVBUF/2 : val; - } - break; - - case TCP_QUICKACK: - if (!val) { - tp->ack.pingpong = 1; - } else { - tp->ack.pingpong = 0; - if ((1<<sk->state)&(TCPF_ESTABLISHED|TCPF_CLOSE_WAIT) && - tcp_ack_scheduled(tp)) { - tp->ack.pending |= TCP_ACK_PUSHED; - cleanup_rbuf(sk, 1); - if (!(val & 1)) - tp->ack.pingpong = 1; - } - } - break; - - default: - err = -ENOPROTOOPT; - break; - }; - release_sock(sk); - return err; -#else - return 0; -#endif -} - -int tcp_getsockopt(struct sock *sk, int level, int optname, char *optval, - int *optlen) -{ -#if 0 - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - int val, len; - - if(level != SOL_TCP) - return tp->af_specific->getsockopt(sk, level, optname, - optval, optlen); - - if(get_user(len,optlen)) - return -EFAULT; - - len = min_t(unsigned int, len, sizeof(int)); - - if(len < 0) - return -EINVAL; - - switch(optname) { - case TCP_MAXSEG: - val = tp->mss_cache; - if (val == 0 && ((1<<sk->state)&(TCPF_CLOSE|TCPF_LISTEN))) - val = tp->user_mss; - break; - case TCP_NODELAY: - val = (tp->nonagle == 1); - break; - case TCP_CORK: - val = (tp->nonagle == 2); - break; - case TCP_KEEPIDLE: - val = (tp->keepalive_time ? : sysctl_tcp_keepalive_time)/HZ; - break; - case TCP_KEEPINTVL: - val = (tp->keepalive_intvl ? : sysctl_tcp_keepalive_intvl)/HZ; - break; - case TCP_KEEPCNT: - val = tp->keepalive_probes ? : sysctl_tcp_keepalive_probes; - break; - case TCP_SYNCNT: - val = tp->syn_retries ? : sysctl_tcp_syn_retries; - break; - case TCP_LINGER2: - val = tp->linger2; - if (val >= 0) - val = (val ? : sysctl_tcp_fin_timeout)/HZ; - break; - case TCP_DEFER_ACCEPT: - val = tp->defer_accept == 0 ? 0 : ((TCP_TIMEOUT_INIT/HZ)<<(tp->defer_accept-1)); - break; - case TCP_WINDOW_CLAMP: - val = tp->window_clamp; - break; - case TCP_INFO: - { - struct tcp_info info; - u32 now = tcp_time_stamp; - - if(get_user(len,optlen)) - return -EFAULT; - info.tcpi_state = sk->state; - info.tcpi_ca_state = tp->ca_state; - info.tcpi_retransmits = tp->retransmits; - info.tcpi_probes = tp->probes_out; - info.tcpi_backoff = tp->backoff; - info.tcpi_options = 0; - if (tp->tstamp_ok) - info.tcpi_options |= TCPI_OPT_TIMESTAMPS; - if (tp->sack_ok) - info.tcpi_options |= TCPI_OPT_SACK; - if (tp->wscale_ok) { - info.tcpi_options |= TCPI_OPT_WSCALE; - info.tcpi_snd_wscale = tp->snd_wscale; - info.tcpi_rcv_wscale = tp->rcv_wscale; - } else { - info.tcpi_snd_wscale = 0; - info.tcpi_rcv_wscale = 0; - } - if (tp->ecn_flags&TCP_ECN_OK) - info.tcpi_options |= TCPI_OPT_ECN; - - info.tcpi_rto = (1000000*tp->rto)/HZ; - info.tcpi_ato = (1000000*tp->ack.ato)/HZ; - info.tcpi_snd_mss = tp->mss_cache; - info.tcpi_rcv_mss = tp->ack.rcv_mss; - - info.tcpi_unacked = tp->packets_out; - info.tcpi_sacked = tp->sacked_out; - info.tcpi_lost = tp->lost_out; - info.tcpi_retrans = tp->retrans_out; - info.tcpi_fackets = tp->fackets_out; - - info.tcpi_last_data_sent = ((now - tp->lsndtime)*1000)/HZ; - info.tcpi_last_ack_sent = 0; - info.tcpi_last_data_recv = ((now - tp->ack.lrcvtime)*1000)/HZ; - info.tcpi_last_ack_recv = ((now - tp->rcv_tstamp)*1000)/HZ; - - info.tcpi_pmtu = tp->pmtu_cookie; - info.tcpi_rcv_ssthresh = tp->rcv_ssthresh; - info.tcpi_rtt = ((1000000*tp->srtt)/HZ)>>3; - info.tcpi_rttvar = ((1000000*tp->mdev)/HZ)>>2; - info.tcpi_snd_ssthresh = tp->snd_ssthresh; - info.tcpi_snd_cwnd = tp->snd_cwnd; - info.tcpi_advmss = tp->advmss; - info.tcpi_reordering = tp->reordering; - - len = min_t(unsigned int, len, sizeof(info)); - if(put_user(len, optlen)) - return -EFAULT; - if(copy_to_user(optval, &info,len)) - return -EFAULT; - return 0; - } - case TCP_QUICKACK: - val = !tp->ack.pingpong; - break; - default: - return -ENOPROTOOPT; - }; - - if(put_user(len, optlen)) - return -EFAULT; - if(copy_to_user(optval, &val,len)) - return -EFAULT; - return 0; -#else - return 0; -#endif -} - - -//extern void __skb_cb_too_small_for_tcp(int, int); -//extern void tcpdiag_init(void); - -void /* __init */ tcp_init(void) -{ -#if 0 - struct sk_buff *skb = NULL; - unsigned long goal; - int order, i; - - if(sizeof(struct tcp_skb_cb) > sizeof(skb->cb)) - __skb_cb_too_small_for_tcp(sizeof(struct tcp_skb_cb), - sizeof(skb->cb)); - - tcp_openreq_cachep = kmem_cache_create("tcp_open_request", - sizeof(struct open_request), - 0, SLAB_HWCACHE_ALIGN, - NULL, NULL); - if(!tcp_openreq_cachep) - panic("tcp_init: Cannot alloc open_request cache."); - - tcp_bucket_cachep = kmem_cache_create("tcp_bind_bucket", - sizeof(struct tcp_bind_bucket), - 0, SLAB_HWCACHE_ALIGN, - NULL, NULL); - if(!tcp_bucket_cachep) - panic("tcp_init: Cannot alloc tcp_bind_bucket cache."); - - tcp_timewait_cachep = kmem_cache_create("tcp_tw_bucket", - sizeof(struct tcp_tw_bucket), - 0, SLAB_HWCACHE_ALIGN, - NULL, NULL); - if(!tcp_timewait_cachep) - panic("tcp_init: Cannot alloc tcp_tw_bucket cache."); - - /* Size and allocate the main established and bind bucket - * hash tables. - * - * The methodology is similar to that of the buffer cache. - */ - if (num_physpages >= (128 * 1024)) - goal = num_physpages >> (21 - PAGE_SHIFT); - else - goal = num_physpages >> (23 - PAGE_SHIFT); - - for(order = 0; (1UL << order) < goal; order++) - ; - do { - tcp_ehash_size = (1UL << order) * PAGE_SIZE / - sizeof(struct tcp_ehash_bucket); - tcp_ehash_size >>= 1; - while (tcp_ehash_size & (tcp_ehash_size-1)) - tcp_ehash_size--; - tcp_ehash = (struct tcp_ehash_bucket *) - __get_free_pages(GFP_ATOMIC, order); - } while (tcp_ehash == NULL && --order > 0); - - if (!tcp_ehash) - panic("Failed to allocate TCP established hash table\n"); - for (i = 0; i < (tcp_ehash_size<<1); i++) { - tcp_ehash[i].lock = RW_LOCK_UNLOCKED; - tcp_ehash[i].chain = NULL; - } - - do { - tcp_bhash_size = (1UL << order) * PAGE_SIZE / - sizeof(struct tcp_bind_hashbucket); - if ((tcp_bhash_size > (64 * 1024)) && order > 0) - continue; - tcp_bhash = (struct tcp_bind_hashbucket *) - __get_free_pages(GFP_ATOMIC, order); - } while (tcp_bhash == NULL && --order >= 0); - - if (!tcp_bhash) - panic("Failed to allocate TCP bind hash table\n"); - for (i = 0; i < tcp_bhash_size; i++) { - tcp_bhash[i].lock = SPIN_LOCK_UNLOCKED; - tcp_bhash[i].chain = NULL; - } - - /* Try to be a bit smarter and adjust defaults depending - * on available memory. - */ - if (order > 4) { - sysctl_local_port_range[0] = 32768; - sysctl_local_port_range[1] = 61000; - sysctl_tcp_max_tw_buckets = 180000; - sysctl_tcp_max_orphans = 4096<<(order-4); - sysctl_max_syn_backlog = 1024; - } else if (order < 3) { - sysctl_local_port_range[0] = 1024*(3-order); - sysctl_tcp_max_tw_buckets >>= (3-order); - sysctl_tcp_max_orphans >>= (3-order); - sysctl_max_syn_backlog = 128; - } - tcp_port_rover = sysctl_local_port_range[0] - 1; - - sysctl_tcp_mem[0] = 768<<order; - sysctl_tcp_mem[1] = 1024<<order; - sysctl_tcp_mem[2] = 1536<<order; - if (sysctl_tcp_mem[2] - sysctl_tcp_mem[1] > 512) - sysctl_tcp_mem[1] = sysctl_tcp_mem[2] - 512; - if (sysctl_tcp_mem[1] - sysctl_tcp_mem[0] > 512) - sysctl_tcp_mem[0] = sysctl_tcp_mem[1] - 512; - - if (order < 3) { - sysctl_tcp_wmem[2] = 64*1024; - sysctl_tcp_rmem[0] = PAGE_SIZE; - sysctl_tcp_rmem[1] = 43689; - sysctl_tcp_rmem[2] = 2*43689; - } - - printk(KERN_INFO "TCP: Hash tables configured (established %d bind %d)\n", - tcp_ehash_size<<1, tcp_bhash_size); - - tcpdiag_init(); -#endif -} diff --git a/reactos/drivers/net/tcpip/transport/udp/udp.c b/reactos/drivers/net/tcpip/transport/udp/udp.c index 8fc586e217a..768d02f0109 100644 --- a/reactos/drivers/net/tcpip/transport/udp/udp.c +++ b/reactos/drivers/net/tcpip/transport/udp/udp.c @@ -7,6 +7,7 @@ * REVISIONS: * CSH 01/08-2000 Created */ +#include <roscfg.h> #include <tcpip.h> #include <udp.h> #include <routines.h> @@ -91,7 +92,7 @@ NTSTATUS AddUDPHeaderIPv4( /* Source address */ IPHeader->SrcAddr = LocalAddress->Address.IPv4Address; /* Destination address. FIXME: IPv4 only */ - IPHeader->DstAddr = SendRequest->RemoteAddress->Address.IPv4Address; + IPHeader->DstAddr = SendRequest->RemoteAddress.Address.IPv4Address; /* Build UDP header */ UDPHeader = (PUDP_HEADER)((ULONG_PTR)IPHeader + sizeof(IPv4_HEADER)); @@ -110,8 +111,7 @@ NTSTATUS AddUDPHeaderIPv4( NTSTATUS BuildUDPPacket( PVOID Context, PIP_ADDRESS LocalAddress, - USHORT LocalPort, - PIP_PACKET *IPPacket) + USHORT LocalPort) /* * FUNCTION: Builds an UDP packet * ARGUMENTS: @@ -124,16 +124,16 @@ NTSTATUS BuildUDPPacket( */ { NTSTATUS Status; - PIP_PACKET Packet; NDIS_STATUS NdisStatus; PDATAGRAM_SEND_REQUEST SendRequest = (PDATAGRAM_SEND_REQUEST)Context; + PIP_PACKET Packet = &SendRequest->Packet; TI_DbgPrint(MAX_TRACE, ("Called.\n")); /* Prepare packet */ /* FIXME: Assumes IPv4 */ - Packet = IPCreatePacket(IP_ADDRESS_V4); + IPInitializePacket(IP_ADDRESS_V4, &SendRequest->Packet); if (!Packet) return STATUS_INSUFFICIENT_RESOURCES; @@ -141,15 +141,7 @@ NTSTATUS BuildUDPPacket( sizeof(UDP_HEADER) + SendRequest->BufferSize; - /* Allocate NDIS packet */ - NdisAllocatePacket(&NdisStatus, &Packet->NdisPacket, GlobalPacketPool); - if (NdisStatus != NDIS_STATUS_SUCCESS) { - TI_DbgPrint(MIN_TRACE, ("Cannot allocate NDIS packet. NdisStatus = (0x%X)\n", NdisStatus)); - (*Packet->Free)(Packet); - return STATUS_INSUFFICIENT_RESOURCES; - } - - switch (SendRequest->RemoteAddress->Type) { + switch (SendRequest->RemoteAddress.Type) { case IP_ADDRESS_V4: Status = AddUDPHeaderIPv4(SendRequest, LocalAddress, LocalPort, Packet); break; @@ -162,18 +154,12 @@ NTSTATUS BuildUDPPacket( } if (!NT_SUCCESS(Status)) { TI_DbgPrint(MIN_TRACE, ("Cannot add UDP header. Status = (0x%X)\n", Status)); - NdisFreePacket(Packet->NdisPacket); - (*Packet->Free)(Packet); + FreeNdisPacket(Packet->NdisPacket); return Status; } - /* Chain data after header */ - NdisChainBufferAtBack(Packet->NdisPacket, SendRequest->Buffer); - DISPLAY_IP_PACKET(Packet); - *IPPacket = Packet; - return STATUS_SUCCESS; } @@ -194,11 +180,18 @@ NTSTATUS UDPSendDatagram( * Status of operation */ { - return DGSendDatagram(Request, - ConnInfo, - Buffer, - DataSize, - BuildUDPPacket); + PDATAGRAM_SEND_REQUEST SendRequest; + PADDRESS_FILE AddrFile = + (PADDRESS_FILE)Request->Handle.AddressHandle; + + BuildUDPPacket( SendRequest, + (PIP_ADDRESS)&AddrFile->ADE->Address->Address. + IPv4Address, + AddrFile->Port ); + + return DGSendDatagram(Request, + ConnInfo, + &SendRequest->Packet); } diff --git a/reactos/lib/msafd/makefile b/reactos/lib/msafd/makefile index e58319aef80..e3e1d55edad 100644 --- a/reactos/lib/msafd/makefile +++ b/reactos/lib/msafd/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.13 2004/05/29 21:24:44 hbirr Exp $ +# $Id: makefile,v 1.14 2004/06/09 18:11:39 arty Exp $ PATH_TO_TOP = ../.. diff --git a/reactos/lib/msafd/misc/dllmain.c b/reactos/lib/msafd/misc/dllmain.c index feab9fef992..f465cda274a 100644 --- a/reactos/lib/msafd/misc/dllmain.c +++ b/reactos/lib/msafd/misc/dllmain.c @@ -15,8 +15,8 @@ #ifdef DBG /* See debug.h for debug/trace constants */ -DWORD DebugTraceLevel = MIN_TRACE; -//DWORD DebugTraceLevel = DEBUG_ULTRA; +//DWORD DebugTraceLevel = MIN_TRACE; +DWORD DebugTraceLevel = DEBUG_ULTRA; #endif /* DBG */ @@ -566,27 +566,29 @@ WSPAccept( Request.lpfnCondition = lpfnCondition; Request.dwCallbackData = dwCallbackData; + + Status = NtDeviceIoControlFile( - (HANDLE)s, - NULL, - NULL, - NULL, - &Iosb, - IOCTL_AFD_ACCEPT, - &Request, - sizeof(FILE_REQUEST_ACCEPT), - &Reply, - sizeof(FILE_REPLY_ACCEPT)); + (HANDLE)s, + NULL, + NULL, + NULL, + &Iosb, + IOCTL_AFD_ACCEPT, + &Request, + sizeof(FILE_REQUEST_ACCEPT), + &Reply, + sizeof(FILE_REPLY_ACCEPT)); if (Status == STATUS_PENDING) { - AFD_DbgPrint(MAX_TRACE, ("Waiting on transport.\n")); - /* FIXME: Wait only for blocking sockets */ - Status = NtWaitForSingleObject((HANDLE)s, FALSE, NULL); + AFD_DbgPrint(MAX_TRACE, ("Waiting on transport.\n")); + /* FIXME: Wait only for blocking sockets */ + Status = NtWaitForSingleObject((HANDLE)s, FALSE, NULL); } if (!NT_SUCCESS(Status)) { *lpErrno = Reply.Status; - return INVALID_SOCKET; - } + return INVALID_SOCKET; + } *addrlen = Reply.addrlen; diff --git a/reactos/lib/ws2_32/include/ws2_32.h b/reactos/lib/ws2_32/include/ws2_32.h index 5021f6e5c35..3abe94b777f 100644 --- a/reactos/lib/ws2_32/include/ws2_32.h +++ b/reactos/lib/ws2_32/include/ws2_32.h @@ -28,10 +28,20 @@ extern HANDLE GlobalHeap; extern BOOL Initialized; /* TRUE if WSAStartup() has been successfully called */ extern WSPUPCALLTABLE UpcallTable; +#define WS2_INTERNAL_MAX_ALIAS 16 + +typedef struct _WINSOCK_GETSERVBYNAME_CACHE { + UINT Size; + SERVENT ServerEntry; + PCHAR Aliases[WS2_INTERNAL_MAX_ALIAS]; + CHAR Data[1]; +} WINSOCK_GETSERVBYNAME_CACHE, *PWINSOCK_GETSERVBYNAME_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 */ } WINSOCK_THREAD_BLOCK, *PWINSOCK_THREAD_BLOCK; diff --git a/reactos/lib/ws2_32/makefile b/reactos/lib/ws2_32/makefile index ffcd59c2b13..a12133b50d6 100644 --- a/reactos/lib/ws2_32/makefile +++ b/reactos/lib/ws2_32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.14 2004/05/29 21:24:47 hbirr Exp $ +# $Id: makefile,v 1.15 2004/06/09 18:11:39 arty Exp $ PATH_TO_TOP = ../.. diff --git a/reactos/lib/ws2_32/misc/dllmain.c b/reactos/lib/ws2_32/misc/dllmain.c index 9a9407db56f..0b79ab9d019 100644 --- a/reactos/lib/ws2_32/misc/dllmain.c +++ b/reactos/lib/ws2_32/misc/dllmain.c @@ -17,7 +17,6 @@ /* See debug.h for debug/trace constants */ DWORD DebugTraceLevel = MIN_TRACE; -//DWORD DebugTraceLevel = DEBUG_ULTRA; #endif /* DBG */ @@ -37,7 +36,8 @@ INT EXPORT WSAGetLastError(VOID) { - PWINSOCK_THREAD_BLOCK p = NtCurrentTeb()->WinSockData; + +PWINSOCK_THREAD_BLOCK p = NtCurrentTeb()->WinSockData; if (p) { return p->LastErrorValue; @@ -667,6 +667,7 @@ DllMain(HANDLE hInstDll, } p->LastErrorValue = NO_ERROR; + p->Getservbyname = NULL; NtCurrentTeb()->WinSockData = p; break; diff --git a/reactos/lib/ws2_32/misc/ns.c b/reactos/lib/ws2_32/misc/ns.c index e5896d53be0..eb6799e2559 100644 --- a/reactos/lib/ws2_32/misc/ns.c +++ b/reactos/lib/ws2_32/misc/ns.c @@ -7,8 +7,13 @@ * REVISIONS: * CSH 01/09-2000 Created */ +#include <ctype.h> #include <ws2_32.h> +#ifndef BUFSIZ +#define BUFSIZ 1024 +#endif/*BUFSIZ*/ + /* Name resolution APIs */ /* @@ -420,9 +425,58 @@ getprotobynumber( return (LPPROTOENT)NULL; } +#define SKIPWS(ptr,act) \ +{while(*ptr && isspace(*ptr)) ptr++; if(!*ptr) act;} +#define SKIPANDMARKSTR(ptr,act) \ +{while(*ptr && !isspace(*ptr)) ptr++; \ + if(!*ptr) {act;} else { *ptr = 0; ptr++; }} + + +static BOOL DecodeServEntFromString( IN PCHAR ServiceString, + OUT PCHAR *ServiceName, + OUT PCHAR *PortNumberStr, + OUT PCHAR *ProtocolStr, + IN PCHAR *Aliases, + IN DWORD MaxAlias ) { + UINT NAliases = 0; + + WS_DbgPrint(MAX_TRACE, ("Parsing service ent [%s]\n", ServiceString)); + + SKIPWS(ServiceString, return FALSE); + *ServiceName = ServiceString; + SKIPANDMARKSTR(ServiceString, return FALSE); + SKIPWS(ServiceString, return FALSE); + *PortNumberStr = ServiceString; + SKIPANDMARKSTR(ServiceString, ;); + + while( *ServiceString && NAliases < MaxAlias - 1 ) { + SKIPWS(ServiceString, break); + if( *ServiceString ) { + SKIPANDMARKSTR(ServiceString, ;); + if( strlen(ServiceString) ) { + WS_DbgPrint(MAX_TRACE, ("Alias: %s\n", ServiceString)); + *Aliases++ = ServiceString; + NAliases++; + } + } + } + *Aliases = NULL; + + *ProtocolStr = strchr(*PortNumberStr,'/'); + if( !*ProtocolStr ) return FALSE; + **ProtocolStr = 0; (*ProtocolStr)++; + + WS_DbgPrint(MAX_TRACE, ("Parsing done: %s %s %s %d\n", + *ServiceName, *ProtocolStr, *PortNumberStr, + NAliases)); + + return TRUE; +} + +#define ADJ_PTR(p,b1,b2) p = (p - b1) + b2 /* - * @unimplemented + * @implemented */ LPSERVENT EXPORT @@ -430,9 +484,157 @@ getservbyname( IN CONST CHAR FAR* name, 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; + } - return (LPSERVENT)NULL; + if( !name ) { + 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 ) && + !strcmp( ServiceName, name ) && + (proto ? !strcmp( ProtocolStr, proto ) : TRUE) ) { + WS_DbgPrint(MAX_TRACE,("Found the service entry.\n")); + + Found = TRUE; + SizeNeeded = sizeof(WINSOCK_GETSERVBYNAME_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->Getservbyname || p->Getservbyname->Size < SizeNeeded ) { + /* Free previous getservbyname buffer, allocate bigger */ + if( p->Getservbyname ) + HeapFree(GlobalHeap, 0, p->Getservbyname); + p->Getservbyname = HeapAlloc(GlobalHeap, 0, SizeNeeded); + if( !p->Getservbyname ) { + WS_DbgPrint(MIN_TRACE,("Couldn't allocate %d bytes\n", + SizeNeeded)); + WSASetLastError( WSATRY_AGAIN ); + return NULL; + } + p->Getservbyname->Size = SizeNeeded; + } + + /* Copy the data */ + memmove( p->Getservbyname->Data, + ThisLine, + NextLine - ThisLine ); + + ADJ_PTR(ServiceName,ThisLine,p->Getservbyname->Data); + ADJ_PTR(ProtocolStr,ThisLine,p->Getservbyname->Data); + WS_DbgPrint(MAX_TRACE, + ("ServiceName: %s, Protocol: %s\n", ServiceName, ProtocolStr)); + + for( i = 0; Aliases[i]; i++ ) { + ADJ_PTR(Aliases[i],ThisLine,p->Getservbyname->Data); + WS_DbgPrint(MAX_TRACE,("Aliase %d: %s\n", i, Aliases[i])); + } + + memcpy(p->Getservbyname,Aliases,sizeof(Aliases)); + + /* Create the struct proper */ + p->Getservbyname->ServerEntry.s_name = ServiceName; + p->Getservbyname->ServerEntry.s_aliases = p->Getservbyname->Aliases; + p->Getservbyname->ServerEntry.s_port = htons(atoi(PortNumberStr)); + p->Getservbyname->ServerEntry.s_proto = ProtocolStr; + + return &p->Getservbyname->ServerEntry; } From 5298bf9c053e978569750ad2f2e3d915adb347d5 Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Wed, 9 Jun 2004 20:39:41 +0000 Subject: [PATCH 1361/1463] added \n for DPRINT svn path=/trunk/; revision=9648 --- reactos/subsys/win32k/dib/dib24bpp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib24bpp.c b/reactos/subsys/win32k/dib/dib24bpp.c index 22336937cfe..709c67a36ac 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.27 2004/05/14 22:56:17 gvg Exp $ */ +/* $Id: dib24bpp.c,v 1.28 2004/06/09 20:39:41 sedwards Exp $ */ #include <w32k.h> VOID @@ -200,7 +200,7 @@ DIB_24BPP_BitBltSrcCopy( SURFOBJ *DestSurf, SURFOBJ *SourceSurf, else { /* FIXME */ - DPRINT1("DIB_24BPP_Bitblt: Unhandled ColorTranslation for 16 -> 16 copy"); + DPRINT1("DIB_24BPP_Bitblt: Unhandled ColorTranslation for 16 -> 16 copy\n"); return FALSE; } break; From c3e66860e448255e22a8f2949e600bb6a2edce9e Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Thu, 10 Jun 2004 07:50:30 +0000 Subject: [PATCH 1362/1463] - Exchanged source and target in WRITE_REGISTER_BUFFER_xxx. svn path=/trunk/; revision=9649 --- reactos/ntoskrnl/rtl/regio.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/ntoskrnl/rtl/regio.c b/reactos/ntoskrnl/rtl/regio.c index ec2026588af..78d4ff3b5fc 100644 --- a/reactos/ntoskrnl/rtl/regio.c +++ b/reactos/ntoskrnl/rtl/regio.c @@ -1,4 +1,4 @@ -/* $Id: regio.c,v 1.6 2003/07/11 01:23:16 royce Exp $ +/* $Id: regio.c,v 1.7 2004/06/10 07:50:30 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -150,7 +150,7 @@ WRITE_REGISTER_BUFFER_UCHAR ( { while (Count--) { - *Buffer++ = *Register++; + *Register++ = *Buffer++; } } @@ -167,7 +167,7 @@ WRITE_REGISTER_BUFFER_USHORT ( { while (Count--) { - *Buffer++ = *Register++; + *Register++ = *Buffer++; } } @@ -184,7 +184,7 @@ WRITE_REGISTER_BUFFER_ULONG ( { while (Count--) { - *Buffer++ = *Register++; + *Register++ = *Buffer++; } } From b5273a652c47d06c55234f74b43c8fe90d64d78b Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Thu, 10 Jun 2004 07:56:42 +0000 Subject: [PATCH 1363/1463] - Allocate for each srb its one sense info buffer. - Reinitialize the transfer size if a retry is necessary in ScsiClassSendSrbSynchronous. svn path=/trunk/; revision=9650 --- reactos/drivers/storage/class2/class2.c | 52 ++++++++++++++----------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/reactos/drivers/storage/class2/class2.c b/reactos/drivers/storage/class2/class2.c index 4c0644025ad..5ea6b2bc223 100644 --- a/reactos/drivers/storage/class2/class2.c +++ b/reactos/drivers/storage/class2/class2.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: class2.c,v 1.53 2004/05/10 18:02:20 gvg Exp $ +/* $Id: class2.c,v 1.54 2004/06/10 07:56:42 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -46,6 +46,11 @@ #define INQUIRY_DATA_SIZE 2048 #define START_UNIT_TIMEOUT 30 +/* + * FIXME: + * Create a macro, which rounds up a size value to the next multiple of two. + */ +#define SENSEINFO_ALIGNMENT 32 static NTSTATUS STDCALL ScsiClassCreateClose(IN PDEVICE_OBJECT DeviceObject, @@ -205,7 +210,7 @@ ScsiClassBuildRequest(IN PDEVICE_OBJECT DeviceObject, Srb->QueueAction = SRB_SIMPLE_TAG_REQUEST; Srb->QueueSortKey = LogicalBlockAddress; - Srb->SenseInfoBuffer = DeviceExtension->SenseData; + Srb->SenseInfoBuffer = (SENSE_DATA*)ROUND_UP((ULONG_PTR)(Srb + 1), SENSEINFO_ALIGNMENT); Srb->SenseInfoBufferLength = SENSE_BUFFER_SIZE; Srb->TimeOutValue = @@ -558,9 +563,9 @@ ScsiClassDeviceControl(IN PDEVICE_OBJECT DeviceObject, Irp)); } - /* Allocate an SRB */ - Srb = ExAllocatePool (NonPagedPool, - sizeof(SCSI_REQUEST_BLOCK)); + /* Allocate and initialize an SRB */ + Srb = ExAllocateFromNPagedLookasideList(&DeviceExtension->SrbLookasideListHead); + if (Srb == NULL) { Irp->IoStatus.Information = 0; @@ -588,7 +593,9 @@ ScsiClassDeviceControl(IN PDEVICE_OBJECT DeviceObject, DPRINT ("ScsiClassDeviceControl: IOCTL_DISK_CHECK_VERIFY SMALL\n"); Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; Irp->IoStatus.Information = 0; - ExFreePool (Srb); + /* Free the SRB */ + ExFreeToNPagedLookasideList(&DeviceExtension->SrbLookasideListHead, + Srb); IoCompleteRequest (Irp, IO_NO_INCREMENT); return STATUS_BUFFER_TOO_SMALL; @@ -599,10 +606,12 @@ ScsiClassDeviceControl(IN PDEVICE_OBJECT DeviceObject, FALSE); if (SubIrp == NULL) { - DPRINT ("ScsiClassDeviceControl: IOCTL_DISK_CHECK_VERIFY NotEnuf\n"); + DPRINT ("ScsiClassDeviceControl: IOCTL_DISK_CHECK_VERIFY NotEnuf\n"); Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; Irp->IoStatus.Information = 0; - ExFreePool (Srb); + /* Free the SRB */ + ExFreeToNPagedLookasideList(&DeviceExtension->SrbLookasideListHead, + Srb); IoCompleteRequest (Irp, IO_NO_INCREMENT); return STATUS_INSUFFICIENT_RESOURCES; @@ -650,8 +659,9 @@ DPRINT ("ScsiClassDeviceControl: IOCTL_DISK_CHECK_VERIFY SrbAsync\n"); default: DPRINT("Unknown device io control code %lx\n", ModifiedControlCode); - ExFreePool(Srb); - + /* Free the SRB */ + ExFreeToNPagedLookasideList(&DeviceExtension->SrbLookasideListHead, + Srb); /* Pass the IOCTL down to the port driver */ NextStack = IoGetNextIrpStackLocation(Irp); NextStack->Parameters = Stack->Parameters; @@ -993,7 +1003,7 @@ ScsiClassInitializeSrbLookasideList(IN PDEVICE_EXTENSION DeviceExtension, NULL, NULL, NonPagedPool, - sizeof(SCSI_REQUEST_BLOCK), + sizeof(SCSI_REQUEST_BLOCK) + sizeof(SENSE_DATA) + SENSEINFO_ALIGNMENT - 1, TAG_SRBT, (USHORT)NumberElements); } @@ -1720,7 +1730,7 @@ ScsiClassReadDriveCapacity(IN PDEVICE_OBJECT DeviceObject) DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension; - CapacityBuffer = ExAllocatePool(NonPagedPool, + CapacityBuffer = ExAllocatePool(NonPagedPoolCacheAligned, sizeof(READ_CAPACITY_DATA)); if (CapacityBuffer == NULL) { @@ -1925,7 +1935,7 @@ ScsiClassSendSrbAsynchronous(PDEVICE_OBJECT DeviceObject, Srb->Function = SRB_FUNCTION_EXECUTE_SCSI; Srb->Cdb[1] |= DeviceExtension->Lun << 5; - Srb->SenseInfoBuffer = DeviceExtension->SenseData; + Srb->SenseInfoBuffer = (SENSE_DATA*)ROUND_UP((ULONG_PTR)(Srb + 1), SENSEINFO_ALIGNMENT); Srb->SenseInfoBufferLength = SENSE_BUFFER_SIZE; Srb->DataBuffer = BufferAddress; @@ -2002,7 +2012,7 @@ ScsiClassSendSrbSynchronous(PDEVICE_OBJECT DeviceObject, ULONG RequestType; BOOLEAN Retry; ULONG RetryCount; - PKEVENT Event; + KEVENT Event; PIRP Irp; NTSTATUS Status; LARGE_INTEGER RetryWait; @@ -2044,13 +2054,11 @@ ScsiClassSendSrbSynchronous(PDEVICE_OBJECT DeviceObject, } } - Srb->DataTransferLength = BufferLength; Srb->DataBuffer = BufferAddress; - Event = ExAllocatePool(NonPagedPool, - sizeof(KEVENT)); TryAgain: - KeInitializeEvent(Event, + Srb->DataTransferLength = BufferLength; + KeInitializeEvent(&Event, NotificationEvent, FALSE); @@ -2061,13 +2069,14 @@ TryAgain: BufferAddress, BufferLength, TRUE, - Event, + &Event, &IoStatusBlock); if (Irp == NULL) { DPRINT("IoBuildDeviceIoControlRequest() failed\n"); ExFreePool(Srb->SenseInfoBuffer); - ExFreePool(Event); + Srb->SenseInfoBuffer = NULL; + Srb->SenseInfoBufferLength = 0; return(STATUS_INSUFFICIENT_RESOURCES); } @@ -2081,7 +2090,7 @@ TryAgain: Irp); if (Status == STATUS_PENDING) { - KeWaitForSingleObject(Event, + KeWaitForSingleObject(&Event, Suspended, KernelMode, FALSE, @@ -2123,7 +2132,6 @@ TryAgain: } ExFreePool(Srb->SenseInfoBuffer); - ExFreePool(Event); DPRINT("ScsiClassSendSrbSynchronous() done\n"); From 5f843bef939765d13ad2f723fb43bd3e6865348b Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Thu, 10 Jun 2004 08:14:57 +0000 Subject: [PATCH 1364/1463] - Use a bitmap for managing the srb extensions. - Removed the complete request and next request counter. The counters are always wrong, because some miniport drivers fires up to much notification requests. - Enable the queues for the miniport driver, if they are supported. - Fixed a bug in ScsiPortCompleteRequest. svn path=/trunk/; revision=9651 --- reactos/drivers/storage/scsiport/scsiport.c | 166 ++++++++++-------- .../drivers/storage/scsiport/scsiport_int.h | 12 +- 2 files changed, 97 insertions(+), 81 deletions(-) diff --git a/reactos/drivers/storage/scsiport/scsiport.c b/reactos/drivers/storage/scsiport/scsiport.c index bf3c77ac2a1..efe264a53c8 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.59 2004/06/07 20:03:00 hbirr Exp $ +/* $Id: scsiport.c,v 1.60 2004/06/10 08:14:57 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -45,8 +45,6 @@ #define IRP_FLAG_NEXT 0x00000002 #define IRP_FLAG_NEXT_LU 0x00000004 -#define MAX_SRB_EXTENSIONS 32 - /* GLOBALS *******************************************************************/ static VOID @@ -257,7 +255,7 @@ ScsiPortCompleteRequest(IN PVOID HwDeviceExtension, while (Irp) { Srb = (PSCSI_REQUEST_BLOCK)Irp->Tail.Overlay.DriverContext[3]; - if (Srb->SrbStatus & SRB_FLAGS_IS_ACTIVE) + if (Srb->SrbFlags & SRB_FLAGS_IS_ACTIVE) { Srb->SrbStatus = SrbStatus; ScsiPortNotification(RequestComplete, @@ -623,16 +621,36 @@ ScsiPortGetUncachedExtension(IN PVOID HwDeviceExtension, return NULL; } } + if (DeviceExtension->SrbExtensionSize > 0) + { + PVOID Buffer; + DeviceExtension->CurrentSrbExtensions = 0; + if (DeviceExtension->PortConfig->MultipleRequestPerLu) + { + DeviceExtension->MaxSrbExtensions = 1024; + } + else + { + DeviceExtension->MaxSrbExtensions = 32; + } + Buffer = ExAllocatePool(NonPagedPool, ROUND_UP(DeviceExtension->MaxSrbExtensions / 8, sizeof(ULONG))); + if (Buffer == NULL) + { + KEBUGCHECK(0); + return NULL; + } + RtlInitializeBitMap(&DeviceExtension->SrbExtensionAllocMap, Buffer, DeviceExtension->MaxSrbExtensions); + RtlClearAllBits(&DeviceExtension->SrbExtensionAllocMap); + } /* Allocate a common DMA buffer */ DeviceExtension->CommonBufferLength = - NumberOfBytes + PAGE_ROUND_UP(DeviceExtension->SrbExtensionSize * MAX_SRB_EXTENSIONS); + NumberOfBytes + PAGE_ROUND_UP(DeviceExtension->SrbExtensionSize * DeviceExtension->MaxSrbExtensions); DeviceExtension->VirtualAddress = HalAllocateCommonBuffer(DeviceExtension->AdapterObject, DeviceExtension->CommonBufferLength, &DeviceExtension->PhysicalAddress, FALSE); - DeviceExtension->VirtualAddressMap = 0; if (DeviceExtension->VirtualAddress == NULL) { DPRINT1("HalAllocateCommonBuffer() failed!\n"); @@ -641,7 +659,7 @@ ScsiPortGetUncachedExtension(IN PVOID HwDeviceExtension, } return (PVOID)((ULONG_PTR)DeviceExtension->VirtualAddress + - PAGE_ROUND_UP(DeviceExtension->SrbExtensionSize * MAX_SRB_EXTENSIONS)); + PAGE_ROUND_UP(DeviceExtension->SrbExtensionSize * DeviceExtension->MaxSrbExtensions)); } @@ -1202,6 +1220,8 @@ ScsiPortLogError(IN PVOID HwDeviceExtension, PSCSI_PORT_DEVICE_EXTENSION DeviceExtension; DPRINT1("ScsiPortLogError() called\n"); + DPRINT1("Srb %x, PathId %d, TargetId %d, Lun %d, ErrorCode %x, UniqueId %x\n", + Srb, PathId, TargetId, Lun, ErrorCode, UniqueId); DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, SCSI_PORT_DEVICE_EXTENSION, @@ -1258,14 +1278,12 @@ ScsiPortNotification(IN SCSI_NOTIFICATION_TYPE NotificationType, DPRINT("Notify: RequestComplete (Srb %p)\n", Srb); DeviceExtension->Flags |= IRP_FLAG_COMPLETE; Srb->SrbFlags &= ~SRB_FLAGS_IS_ACTIVE; - InterlockedIncrement((PLONG)&DeviceExtension->CompleteRequestCount); } break; case NextRequest: DPRINT("Notify: NextRequest\n"); DeviceExtension->Flags |= IRP_FLAG_NEXT; - InterlockedIncrement((PLONG)&DeviceExtension->NextRequestCount); break; case NextLuRequest: @@ -1289,8 +1307,7 @@ ScsiPortNotification(IN SCSI_NOTIFICATION_TYPE NotificationType, if (LunExtension) { DeviceExtension->Flags |= IRP_FLAG_NEXT_LU; - InterlockedIncrement((PLONG)&LunExtension->NextLuRequestCount); - InterlockedIncrement((PLONG)&DeviceExtension->NextLuRequestCount); + LunExtension->Flags |= IRP_FLAG_NEXT_LU; } } break; @@ -1753,43 +1770,42 @@ static VOID SpiAllocateSrbExtension(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, PSCSI_REQUEST_BLOCK Srb) { - ULONG i; - ULONG mask; + ULONG index; DPRINT("SpiAllocateSrbExtension\n"); DPRINT("DeviceExtension->VirtualAddress %x, DeviceExtension->SrbExtensionSize %x\n", DeviceExtension->VirtualAddress, DeviceExtension->SrbExtensionSize); + Srb->SrbExtension = NULL; if (DeviceExtension->VirtualAddress != NULL && DeviceExtension->SrbExtensionSize > 0) { - for (i = 0, mask = 1; i < MAX_SRB_EXTENSIONS; i++, mask <<= 1) + index = RtlFindClearBitsAndSet(&DeviceExtension->SrbExtensionAllocMap, 1, 0); + if (index != 0xffffffff) { - if (!(DeviceExtension->VirtualAddressMap & mask)) - { - DeviceExtension->VirtualAddressMap |= mask; - Srb->SrbExtension = DeviceExtension->VirtualAddress + i * DeviceExtension->SrbExtensionSize; - DPRINT("%x\n", Srb->SrbExtension); - return; - } + DeviceExtension->CurrentSrbExtensions++; + Srb->SrbExtension = DeviceExtension->VirtualAddress + index * DeviceExtension->SrbExtensionSize; +// Srb->QueueTag = i; +// Srb->QueueAction = SRB_SIMPLE_TAG_REQUEST; } } - Srb->SrbExtension = NULL; + DPRINT("%x\n", Srb->SrbExtension); } static VOID SpiFreeSrbExtension(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, PSCSI_REQUEST_BLOCK Srb) { - ULONG i; + ULONG index; if (DeviceExtension->VirtualAddress != NULL && DeviceExtension->SrbExtensionSize > 0 && Srb->SrbExtension != NULL) { - i = ((ULONG_PTR)Srb->SrbExtension - (ULONG_PTR)DeviceExtension->VirtualAddress) / DeviceExtension->SrbExtensionSize; - DeviceExtension->VirtualAddressMap &= ~(1 << i); + index = ((ULONG_PTR)Srb->SrbExtension - (ULONG_PTR)DeviceExtension->VirtualAddress) / DeviceExtension->SrbExtensionSize; + RtlClearBits(&DeviceExtension->SrbExtensionAllocMap, index, 1); + DeviceExtension->CurrentSrbExtensions--; } Srb->SrbExtension = NULL; } @@ -1803,8 +1819,8 @@ ScsiPortStartPacket(IN OUT PVOID Context) PIRP Irp; PIO_STACK_LOCATION IrpStack; - DPRINT("ScsiPortStartPacket() called\n"); - + DPRINT("ScsiPortStartPacket(Context %x) called\n", Context); + Srb = (PSCSI_REQUEST_BLOCK)Context; Irp = (PIRP)Srb->OriginalRequest; IrpStack = IoGetCurrentIrpStackLocation(Irp); @@ -2023,8 +2039,9 @@ SpiScanAdapter (IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension) DPRINT ("DeviceTypeQualifier %x\n", ((PINQUIRYDATA)Srb->DataBuffer)->DeviceTypeQualifier); if (NT_SUCCESS(ScanData->Status) && - (Srb->SrbStatus == SRB_STATUS_SUCCESS || - Srb->SrbStatus == SRB_STATUS_DATA_OVERRUN) && + (Srb->SrbStatus == SRB_STATUS_SUCCESS || + (Srb->SrbStatus == SRB_STATUS_DATA_OVERRUN && + Srb->DataTransferLength >= sizeof(INQUIRYDATA))) && ((PINQUIRYDATA)Srb->DataBuffer)->DeviceTypeQualifier == 0) { /* Copy inquiry data */ @@ -2032,12 +2049,12 @@ SpiScanAdapter (IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension) Srb->DataBuffer, sizeof(INQUIRYDATA)); ScanData->Lun++; - } - else - { - SpiRemoveLunExtension (ScanData->LunExtension); - ScanData->Lun = SCSI_MAXIMUM_LOGICAL_UNITS; - } + } + else + { + SpiRemoveLunExtension (ScanData->LunExtension); + ScanData->Lun = SCSI_MAXIMUM_LOGICAL_UNITS; + } } if (ScanData->Lun >= SCSI_MAXIMUM_LOGICAL_UNITS) { @@ -2053,6 +2070,7 @@ SpiScanAdapter (IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension) Srb->PathId = ScanData->Bus; Srb->TargetId = ScanData->Target; Srb->SrbStatus = SRB_STATUS_SUCCESS; + Srb->TimeOutValue = 2; Cdb = (PCDB) &Srb->Cdb; Cdb->CDB6INQUIRY.OperationCode = SCSIOP_INQUIRY; @@ -2715,8 +2733,8 @@ SpiRemoveActiveIrp(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, PSCSI_PORT_LUN_EXTENSION LunExtension; PIRP CurrentIrp; LunExtension = Irp->Tail.Overlay.DriverContext[2]; - LunExtension->ActiveIrpCount--; - DeviceExtension->ActiveIrpCount--; + InterlockedDecrement((PLONG)&LunExtension->ActiveIrpCount); + InterlockedDecrement((PLONG)&DeviceExtension->ActiveIrpCount); if (PrevIrp) { InterlockedExchangePointer(&PrevIrp->Tail.Overlay.DriverContext[0], @@ -2755,11 +2773,16 @@ SpiAddActiveIrp(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, PIRP Irp) { PSCSI_PORT_LUN_EXTENSION LunExtension; + 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 @@ -2810,11 +2833,19 @@ SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, if (NextIrp) { Srb = NextIrp->Tail.Overlay.DriverContext[3]; + /* + * 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; ListEntry = DeviceExtension->PendingIrpListHead.Flink; - while (ListEntry != DeviceExtension->PendingIrpListHead.Flink) + while (ListEntry != &DeviceExtension->PendingIrpListHead) { Irp = CONTAINING_RECORD(ListEntry, IRP, Tail.Overlay.DriverContext[0]); if ((ULONG)Irp->Tail.Overlay.DriverContext[2] > Srb->QueueSortKey) @@ -2828,24 +2859,20 @@ SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, LunExtension->PendingIrpCount++; } - while (DeviceExtension->CompleteRequestCount || - ((DeviceExtension->SrbExtensionSize == 0 || DeviceExtension->ActiveIrpCount < MAX_SRB_EXTENSIONS) && !IsListEmpty(&DeviceExtension->PendingIrpListHead) && - (DeviceExtension->NextRequestCount || DeviceExtension->NextLuRequestCount || DeviceExtension->NextIrp == NULL))) + while (DeviceExtension->Flags & IRP_FLAG_COMPLETE || + (((DeviceExtension->SrbExtensionSize == 0 || DeviceExtension->CurrentSrbExtensions < DeviceExtension->MaxSrbExtensions) && + DeviceExtension->PendingIrpCount > 0 && + (DeviceExtension->Flags & (IRP_FLAG_NEXT|IRP_FLAG_NEXT_LU) || DeviceExtension->NextIrp == NULL)))) { - DPRINT ("CompleteRequestCount %d, NextRequestCount %d, NextLuRequestCount %d, PendingIrpList is %s, ActiveIrpList is %s\n", - DeviceExtension->CompleteRequestCount, - DeviceExtension->NextRequestCount, - DeviceExtension->NextLuRequestCount, - IsListEmpty(&DeviceExtension->PendingIrpListHead) ? "EMPTY" : "NOT empty", - DeviceExtension->NextIrp == NULL ? "EMPTY" : "NOT empty"); + DPRINT ("RequestComplete %d, NextRequest %d, NextLuRequest %d, PendingIrpCount %d, ActiveIrpCount %d\n", + DeviceExtension->Flags & IRP_FLAG_COMPLETE ? 1 : 0, + DeviceExtension->Flags & IRP_FLAG_NEXT ? 1 : 0, + DeviceExtension->Flags & IRP_FLAG_NEXT_LU ? 1 : 0, + DeviceExtension->PendingIrpCount, + DeviceExtension->ActiveIrpCount); - if (DeviceExtension->ActiveIrpCount == 0 && DeviceExtension->CompleteRequestCount > 0) - { - DeviceExtension->CompleteRequestCount = 0; - continue; - } - if (DeviceExtension->CompleteRequestCount > 0) + if (DeviceExtension->Flags & IRP_FLAG_COMPLETE) { DeviceExtension->Flags &= ~IRP_FLAG_COMPLETE; PrevIrp = NULL; @@ -2857,7 +2884,6 @@ SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, if (!(Srb->SrbFlags & SRB_FLAGS_IS_ACTIVE)) { BOOLEAN CompleteThisRequest; - InterlockedDecrement((PLONG)&DeviceExtension->CompleteRequestCount); LunExtension = Irp->Tail.Overlay.DriverContext[2]; IrpStack = IoGetCurrentIrpStackLocation(Irp); OriginalSrb = IrpStack->Parameters.Scsi.Srb; @@ -2954,16 +2980,14 @@ SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, { ListEntry = RemoveTailList(&CompleteIrpListHead); Irp = CONTAINING_RECORD(ListEntry, IRP, Tail.Overlay.DriverContext[0]); - Srb = Irp->Tail.Overlay.DriverContext[3]; IoCompleteRequest(Irp, IO_NO_INCREMENT); } KeAcquireSpinLockAtDpcLevel(&DeviceExtension->Lock); } - if (DeviceExtension->NextLuRequestCount || - DeviceExtension->NextRequestCount) + if (DeviceExtension->Flags & (IRP_FLAG_NEXT|IRP_FLAG_NEXT_LU) && + (DeviceExtension->SrbExtensionSize == 0 || DeviceExtension->CurrentSrbExtensions < DeviceExtension->MaxSrbExtensions)) { BOOLEAN StartThisRequest; - DeviceExtension->Flags &= ~(IRP_FLAG_NEXT|IRP_FLAG_NEXT_LU); ListEntry = DeviceExtension->PendingIrpListHead.Flink; while (ListEntry != &DeviceExtension->PendingIrpListHead) { @@ -2972,21 +2996,21 @@ SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, Srb = Irp->Tail.Overlay.DriverContext[3]; LunExtension = Srb->OriginalRequest; if (DeviceExtension->SrbExtensionSize > 0 && - DeviceExtension->ActiveIrpCount >= MAX_SRB_EXTENSIONS) + DeviceExtension->CurrentSrbExtensions >= DeviceExtension->MaxSrbExtensions) { break; } - if (LunExtension->NextLuRequestCount > 0) + if (LunExtension->Flags & IRP_FLAG_NEXT_LU) { StartThisRequest = TRUE; - InterlockedDecrement((PLONG)&LunExtension->NextLuRequestCount); - InterlockedDecrement((PLONG)&DeviceExtension->NextLuRequestCount); + LunExtension->Flags &= ~IRP_FLAG_NEXT_LU; + DeviceExtension->Flags &= ~IRP_FLAG_NEXT_LU; } - else if (DeviceExtension->NextRequestCount > 0 && + else if (DeviceExtension->Flags & IRP_FLAG_NEXT && LunExtension->ActiveIrpCount == 0) { - InterlockedDecrement((PLONG)&DeviceExtension->NextRequestCount); StartThisRequest = TRUE; + DeviceExtension->Flags &= ~IRP_FLAG_NEXT; } else { @@ -2997,12 +3021,9 @@ SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, LunExtension->PendingIrpCount--; DeviceExtension->PendingIrpCount--; RemoveEntryList((PLIST_ENTRY)&Irp->Tail.Overlay.DriverContext[0]); - LunExtension->ActiveIrpCount++; - DeviceExtension->ActiveIrpCount++; - SpiAllocateSrbExtension(DeviceExtension, Srb); - Irp->Tail.Overlay.DriverContext[2] = LunExtension; Srb->OriginalRequest = Irp; + SpiAllocateSrbExtension(DeviceExtension, Srb); InsertHeadList(&NextIrpListHead, (PLIST_ENTRY)&Irp->Tail.Overlay.DriverContext[0]); } @@ -3015,7 +3036,6 @@ SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, { ListEntry = RemoveTailList(&NextIrpListHead); Irp = CONTAINING_RECORD(ListEntry, IRP, Tail.Overlay.DriverContext[0]); - SpiAddActiveIrp(DeviceExtension, Irp); KeReleaseSpinLockFromDpcLevel(&DeviceExtension->Lock); // Start this Irp @@ -3026,7 +3046,7 @@ SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, if (!IsListEmpty(&DeviceExtension->PendingIrpListHead) && DeviceExtension->NextIrp == NULL && - (DeviceExtension->SrbExtensionSize == 0 || DeviceExtension->ActiveIrpCount < MAX_SRB_EXTENSIONS)) + (DeviceExtension->SrbExtensionSize == 0 || DeviceExtension->CurrentSrbExtensions < DeviceExtension->MaxSrbExtensions)) { ListEntry = RemoveHeadList(&DeviceExtension->PendingIrpListHead); Irp = CONTAINING_RECORD(ListEntry, IRP, Tail.Overlay.DriverContext[0]); @@ -3037,9 +3057,6 @@ SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, LunExtension->PendingIrpCount--; DeviceExtension->PendingIrpCount--; - SpiAddActiveIrp(DeviceExtension, Irp); - LunExtension->ActiveIrpCount++; - DeviceExtension->ActiveIrpCount++; SpiAllocateSrbExtension(DeviceExtension, Srb); KeReleaseSpinLockFromDpcLevel(&DeviceExtension->Lock); @@ -3067,10 +3084,11 @@ SpiStartIo(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, Srb = Irp->Tail.Overlay.DriverContext[3]; LunExtension = Irp->Tail.Overlay.DriverContext[2]; - Srb->SrbFlags |= SRB_FLAGS_IS_ACTIVE; Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = Srb->DataTransferLength; + SpiAddActiveIrp(DeviceExtension, Irp); + if (!KeSynchronizeExecution(DeviceExtension->Interrupt, ScsiPortStartPacket, Srb)) diff --git a/reactos/drivers/storage/scsiport/scsiport_int.h b/reactos/drivers/storage/scsiport/scsiport_int.h index 4008f2ceb93..e9aeba834d4 100644 --- a/reactos/drivers/storage/scsiport/scsiport_int.h +++ b/reactos/drivers/storage/scsiport/scsiport_int.h @@ -5,7 +5,7 @@ * An enumeration containing the states in the timer DFA */ -#define VERSION "0.0.2" +#define VERSION "0.0.3" typedef enum _SCSI_PORT_TIMER_STATES { @@ -42,9 +42,9 @@ typedef struct _SCSI_PORT_LUN_EXTENSION ULONG PendingIrpCount; ULONG ActiveIrpCount; - ULONG NextLuRequestCount; PIRP NextIrp; + ULONG Flags; /* More data? */ @@ -97,7 +97,9 @@ typedef struct _SCSI_PORT_DEVICE_EXTENSION PHYSICAL_ADDRESS PhysicalAddress; PVOID VirtualAddress; - ULONG VirtualAddressMap; + RTL_BITMAP SrbExtensionAllocMap; + ULONG MaxSrbExtensions; + ULONG CurrentSrbExtensions; ULONG CommonBufferLength; LIST_ENTRY PendingIrpListHead; @@ -105,10 +107,6 @@ typedef struct _SCSI_PORT_DEVICE_EXTENSION ULONG PendingIrpCount; ULONG ActiveIrpCount; - ULONG CompleteRequestCount; - ULONG NextRequestCount; - ULONG NextLuRequestCount; - UCHAR MiniPortDeviceExtension[1]; /* must be the last entry */ } SCSI_PORT_DEVICE_EXTENSION, *PSCSI_PORT_DEVICE_EXTENSION; From 00df170a8a542fe449a1af302c6cb3bf5529e234 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Thu, 10 Jun 2004 08:20:20 +0000 Subject: [PATCH 1365/1463] - Enabled the dependency check for the storage drivers. svn path=/trunk/; revision=9652 --- reactos/drivers/storage/atapi/makefile | 6 +++++- reactos/drivers/storage/cdrom/makefile | 6 +++++- reactos/drivers/storage/class2/makefile | 8 +++++++- reactos/drivers/storage/disk/makefile | 6 +++++- reactos/drivers/storage/diskdump/Makefile | 6 +++++- reactos/drivers/storage/scsiport/makefile | 3 ++- 6 files changed, 29 insertions(+), 6 deletions(-) diff --git a/reactos/drivers/storage/atapi/makefile b/reactos/drivers/storage/atapi/makefile index 924979b7bc1..d8d23a535dd 100644 --- a/reactos/drivers/storage/atapi/makefile +++ b/reactos/drivers/storage/atapi/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.3 2003/11/13 14:17:51 ekohl Exp $ +# $Id: makefile,v 1.4 2004/06/10 08:20:20 hbirr Exp $ PATH_TO_TOP = ../../.. @@ -14,8 +14,12 @@ TARGET_OBJECTS = $(TARGET_NAME).o TARGET_CFLAGS = -Werror -Wall +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/drivers/storage/cdrom/makefile b/reactos/drivers/storage/cdrom/makefile index b902100404a..79cc1bc8d38 100644 --- a/reactos/drivers/storage/cdrom/makefile +++ b/reactos/drivers/storage/cdrom/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.3 2003/11/13 14:18:26 ekohl Exp $ +# $Id: makefile,v 1.4 2004/06/10 08:20:20 hbirr Exp $ PATH_TO_TOP = ../../.. @@ -14,8 +14,12 @@ TARGET_OBJECTS = $(TARGET_NAME).o TARGET_CFLAGS = -Werror -Wall +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/drivers/storage/class2/makefile b/reactos/drivers/storage/class2/makefile index 6f7942bace5..afb77a707db 100644 --- a/reactos/drivers/storage/class2/makefile +++ b/reactos/drivers/storage/class2/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.5 2003/11/13 14:18:53 ekohl Exp $ +# $Id: makefile,v 1.6 2004/06/10 08:20:20 hbirr Exp $ PATH_TO_TOP = ../../.. @@ -12,6 +12,12 @@ TARGET_OBJECTS = $(TARGET_NAME).o TARGET_CFLAGS = -Werror -Wall +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/drivers/storage/disk/makefile b/reactos/drivers/storage/disk/makefile index 6753b8f231a..8dc0e917e71 100644 --- a/reactos/drivers/storage/disk/makefile +++ b/reactos/drivers/storage/disk/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.7 2004/03/31 03:39:12 jimtabor Exp $ +# $Id: makefile,v 1.8 2004/06/10 08:20:20 hbirr Exp $ PATH_TO_TOP = ../../.. @@ -14,8 +14,12 @@ TARGET_OBJECTS = $(TARGET_NAME).o TARGET_CFLAGS = -Werror -Wall +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/drivers/storage/diskdump/Makefile b/reactos/drivers/storage/diskdump/Makefile index 7ce627b4362..294760260fd 100644 --- a/reactos/drivers/storage/diskdump/Makefile +++ b/reactos/drivers/storage/diskdump/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.2 2003/11/13 15:24:14 ekohl Exp $ +# $Id: Makefile,v 1.3 2004/06/10 08:20:20 hbirr Exp $ PATH_TO_TOP = ../../.. @@ -14,8 +14,12 @@ TARGET_OBJECTS = $(TARGET_NAME).o diskdump_helper.o TARGET_CFLAGS = -Werror -Wall +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/drivers/storage/scsiport/makefile b/reactos/drivers/storage/scsiport/makefile index f67496e93e8..de989ef61b8 100644 --- a/reactos/drivers/storage/scsiport/makefile +++ b/reactos/drivers/storage/scsiport/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.7 2004/06/07 16:37:07 hbirr Exp $ +# $Id: makefile,v 1.8 2004/06/10 08:20:20 hbirr Exp $ PATH_TO_TOP = ../../.. @@ -20,3 +20,4 @@ include $(TOOLS_PATH)/helper.mk include $(TOOLS_PATH)/depend.mk +# EOF From fbda4aa735ef887cce887c6e7fb4c4e4c1a43e60 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Thu, 10 Jun 2004 11:00:28 +0000 Subject: [PATCH 1366/1463] Retrieve Hardware IDs and Compatible IDs from the bus driver and attach them to the device node. svn path=/trunk/; revision=9653 --- reactos/ntoskrnl/io/pnpmgr.c | 162 +++++++++++++++++++++++++---------- 1 file changed, 119 insertions(+), 43 deletions(-) diff --git a/reactos/ntoskrnl/io/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr.c index 8b694857c45..392c100887b 100644 --- a/reactos/ntoskrnl/io/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr.c @@ -1,4 +1,4 @@ -/* $Id: pnpmgr.c,v 1.28 2004/03/27 19:41:32 navaraf Exp $ +/* $Id: pnpmgr.c,v 1.29 2004/06/10 11:00:28 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -311,7 +311,7 @@ IopCreateDeviceNode(PDEVICE_NODE ParentNode, Node->NextSibling = ParentNode->Child; if (ParentNode->Child != NULL) { - ParentNode->Child->PrevSibling = Node; + ParentNode->Child->PrevSibling = Node; } ParentNode->Child = Node; KeReleaseSpinLock(&IopDeviceTreeLock, OldIrql); @@ -339,21 +339,21 @@ IopFreeDeviceNode(PDEVICE_NODE DeviceNode) /* Unlink from parent if it exists */ if ((DeviceNode->Parent) && (DeviceNode->Parent->Child == DeviceNode)) - { - DeviceNode->Parent->Child = DeviceNode->NextSibling; - } + { + DeviceNode->Parent->Child = DeviceNode->NextSibling; + } /* Unlink from sibling list */ if (DeviceNode->PrevSibling) - { - DeviceNode->PrevSibling->NextSibling = DeviceNode->NextSibling; - } + { + DeviceNode->PrevSibling->NextSibling = DeviceNode->NextSibling; + } if (DeviceNode->NextSibling) - { - DeviceNode->NextSibling->PrevSibling = DeviceNode->PrevSibling; - } + { + DeviceNode->NextSibling->PrevSibling = DeviceNode->PrevSibling; + } KeReleaseSpinLock(&IopDeviceTreeLock, OldIrql); @@ -362,24 +362,24 @@ IopFreeDeviceNode(PDEVICE_NODE DeviceNode) RtlFreeUnicodeString(&DeviceNode->ServiceName); if (DeviceNode->CapabilityFlags) - { - ExFreePool(DeviceNode->CapabilityFlags); - } + { + ExFreePool(DeviceNode->CapabilityFlags); + } if (DeviceNode->CmResourceList) - { - ExFreePool(DeviceNode->CmResourceList); - } + { + ExFreePool(DeviceNode->CmResourceList); + } if (DeviceNode->BootResourcesList) - { - ExFreePool(DeviceNode->BootResourcesList); - } + { + ExFreePool(DeviceNode->BootResourcesList); + } if (DeviceNode->ResourceRequirementsList) - { - ExFreePool(DeviceNode->ResourceRequirementsList); - } + { + ExFreePool(DeviceNode->ResourceRequirementsList); + } RtlFreeUnicodeString(&DeviceNode->DeviceID); @@ -394,9 +394,9 @@ IopFreeDeviceNode(PDEVICE_NODE DeviceNode) RtlFreeUnicodeString(&DeviceNode->DeviceTextLocation); if (DeviceNode->BusInformation) - { - ExFreePool(DeviceNode->BusInformation); - } + { + ExFreePool(DeviceNode->BusInformation); + } ExFreePool(DeviceNode); @@ -449,15 +449,15 @@ IopInitiatePnpIrp( sizeof(Stack->Parameters)); } - Status = IoCallDriver(TopDeviceObject, Irp); - if (Status == STATUS_PENDING) - { - KeWaitForSingleObject( + Status = IoCallDriver(TopDeviceObject, Irp); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject( &Event, Executive, - KernelMode, - FALSE, - NULL); + KernelMode, + FALSE, + NULL); Status = IoStatusBlock->Status; } @@ -472,7 +472,7 @@ IopQueryCapabilities( PDEVICE_OBJECT Pdo, PDEVICE_CAPABILITIES *Capabilities) { - IO_STATUS_BLOCK IoStatusBlock; + IO_STATUS_BLOCK IoStatusBlock; PDEVICE_CAPABILITIES Caps; IO_STACK_LOCATION Stack; NTSTATUS Status; @@ -679,6 +679,9 @@ IopActionInterrogateDeviceStack( IO_STACK_LOCATION Stack; NTSTATUS Status; PWSTR KeyBuffer; + PWSTR Ptr; + USHORT Length; + USHORT TotalLength; DPRINT("IopActionInterrogateDeviceStack(%p, %p)\n", DeviceNode, Context); DPRINT("PDO %x\n", DeviceNode->Pdo); @@ -725,7 +728,7 @@ IopActionInterrogateDeviceStack( { RtlInitUnicodeString( &DeviceNode->DeviceID, - (LPWSTR)IoStatusBlock.Information); + (PWSTR)IoStatusBlock.Information); /* * FIXME: Check for valid characters, if there is invalid characters @@ -750,7 +753,7 @@ IopActionInterrogateDeviceStack( { RtlInitUnicodeString( &DeviceNode->InstanceID, - (LPWSTR)IoStatusBlock.Information); + (PWSTR)IoStatusBlock.Information); /* * FIXME: Check for valid characters, if there is invalid characters @@ -763,8 +766,81 @@ IopActionInterrogateDeviceStack( RtlInitUnicodeString(&DeviceNode->InstanceID, NULL); } - /* FIXME: SEND IRP_QUERY_ID.BusQueryHardwareIDs */ - /* FIXME: SEND IRP_QUERY_ID.BusQueryCompatibleIDs */ + DPRINT("Sending IRP_MN_QUERY_ID.BusQueryHardwareIDs to device stack\n"); + + Stack.Parameters.QueryId.IdType = BusQueryHardwareIDs; + Status = IopInitiatePnpIrp( + DeviceNode->Pdo, + &IoStatusBlock, + IRP_MN_QUERY_ID, + &Stack); + if (NT_SUCCESS(Status)) + { + /* + * FIXME: Check for valid characters, if there is invalid characters + * then bugcheck. + */ + TotalLength = 0; + Ptr = (PWSTR)IoStatusBlock.Information; + DPRINT("Hardware IDs:\n"); + while (*Ptr) + { + DPRINT(" %S\n", Ptr); + Length = wcslen(Ptr) + 1; + + Ptr += Length; + TotalLength += Length; + } + DPRINT("TotalLength: %hu\n", TotalLength); + DPRINT("\n"); + + DeviceNode->HardwareIDs.Length = TotalLength * sizeof(WCHAR); + DeviceNode->HardwareIDs.MaximumLength = DeviceNode->HardwareIDs.Length + sizeof(WCHAR); + DeviceNode->HardwareIDs.Buffer = (PWSTR)IoStatusBlock.Information; + } + else + { + DPRINT("IopInitiatePnpIrp() failed (Status %x)\n", Status); + RtlInitUnicodeString(&DeviceNode->HardwareIDs, NULL); + } + + DPRINT("Sending IRP_MN_QUERY_ID.BusQueryCompatibleIDs to device stack\n"); + + Stack.Parameters.QueryId.IdType = BusQueryCompatibleIDs; + Status = IopInitiatePnpIrp( + DeviceNode->Pdo, + &IoStatusBlock, + IRP_MN_QUERY_ID, + &Stack); + if (NT_SUCCESS(Status)) + { + /* + * FIXME: Check for valid characters, if there is invalid characters + * then bugcheck. + */ + TotalLength = 0; + Ptr = (PWSTR)IoStatusBlock.Information; + DPRINT("Compatible IDs:\n"); + while (*Ptr) + { + DPRINT(" %S\n", Ptr); + Length = wcslen(Ptr) + 1; + + Ptr += Length; + TotalLength += Length; + } + DPRINT("TotalLength: %hu\n", TotalLength); + DPRINT("\n"); + + DeviceNode->CompatibleIDs.Length = TotalLength * sizeof(WCHAR); + DeviceNode->CompatibleIDs.MaximumLength = DeviceNode->CompatibleIDs.Length + sizeof(WCHAR); + DeviceNode->CompatibleIDs.Buffer = (PWSTR)IoStatusBlock.Information; + } + else + { + DPRINT("IopInitiatePnpIrp() failed (Status %x)\n", Status); + RtlInitUnicodeString(&DeviceNode->CompatibleIDs, NULL); + } Status = IopQueryCapabilities(DeviceNode->Pdo, &DeviceNode->CapabilityFlags); if (NT_SUCCESS(Status)) @@ -787,7 +863,7 @@ IopActionInterrogateDeviceStack( { RtlInitUnicodeString( &DeviceNode->DeviceText, - (LPWSTR)IoStatusBlock.Information); + (PWSTR)IoStatusBlock.Information); } else { @@ -808,7 +884,7 @@ IopActionInterrogateDeviceStack( { RtlInitUnicodeString( &DeviceNode->DeviceTextLocation, - (LPWSTR)IoStatusBlock.Information); + (PWSTR)IoStatusBlock.Information); } else { @@ -895,13 +971,13 @@ IopActionInterrogateDeviceStack( /* * Create registry key for the instance id, if it doesn't exist yet - */ + */ KeyBuffer = ExAllocatePool( - PagedPool, + PagedPool, (49 * sizeof(WCHAR)) + DeviceNode->InstancePath.Length); wcscpy(KeyBuffer, L"\\Registry\\Machine\\System\\CurrentControlSet\\Enum\\"); - wcscat(KeyBuffer, DeviceNode->InstancePath.Buffer); + wcscat(KeyBuffer, DeviceNode->InstancePath.Buffer); IopCreateDeviceKeyPath(KeyBuffer); ExFreePool(KeyBuffer); DeviceNode->Flags |= DNF_PROCESSED; From ab0a1921c13306031119fc630cd50c04fb41d5aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Fri, 11 Jun 2004 09:10:17 +0000 Subject: [PATCH 1367/1463] Prevent CVS warnings about .*.d files svn path=/trunk/; revision=9654 --- reactos/lib/tgetopt/.cvsignore | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 reactos/lib/tgetopt/.cvsignore diff --git a/reactos/lib/tgetopt/.cvsignore b/reactos/lib/tgetopt/.cvsignore new file mode 100644 index 00000000000..7e8aa746198 --- /dev/null +++ b/reactos/lib/tgetopt/.cvsignore @@ -0,0 +1,4 @@ +*.o +*.d +*.sym +*.map From 839baba4aedb27ae2a09c26a71246b2bfb6ba1b5 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Fri, 11 Jun 2004 09:33:42 +0000 Subject: [PATCH 1368/1463] The root bus driver should return an empty resource list on IRP_MN_QUERY_RESOURCES. svn path=/trunk/; revision=9655 --- reactos/ntoskrnl/io/pnproot.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/io/pnproot.c b/reactos/ntoskrnl/io/pnproot.c index 492cd9f68bc..56323e45206 100644 --- a/reactos/ntoskrnl/io/pnproot.c +++ b/reactos/ntoskrnl/io/pnproot.c @@ -1,4 +1,4 @@ -/* $Id: pnproot.c,v 1.20 2004/01/05 14:28:20 weiden Exp $ +/* $Id: pnproot.c,v 1.21 2004/06/11 09:33:42 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -247,6 +247,26 @@ PdoQueryId( } +NTSTATUS +PdoQueryResources( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + PIO_STACK_LOCATION IrpSp) +{ + PCM_RESOURCE_LIST ResourceList; + + ResourceList = ExAllocatePool(PagedPool, sizeof(CM_RESOURCE_LIST)); + if (ResourceList == NULL) + return STATUS_INSUFFICIENT_RESOURCES; + + ResourceList->Count = 0; + + Irp->IoStatus.Information = (ULONG_PTR)ResourceList; + + return STATUS_SUCCESS; +} + + NTSTATUS PnpRootPdoPnpControl( PDEVICE_OBJECT DeviceObject, @@ -308,10 +328,13 @@ PnpRootPdoPnpControl( case IRP_MN_QUERY_RESOURCE_REQUIREMENTS: break; +#endif case IRP_MN_QUERY_RESOURCES: + Status = PdoQueryResources(DeviceObject, Irp, IrpSp); break; +#if 0 case IRP_MN_QUERY_STOP_DEVICE: break; @@ -368,6 +391,7 @@ PnpRootPdoPowerControl( switch (IrpSp->MinorFunction) { default: DPRINT("Unknown IOCTL 0x%X\n", IrpSp->MinorFunction); + Status = STATUS_NOT_IMPLEMENTED; break; } From 58b454b469c2e1511dff265f5ab700d219fc9d83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Fri, 11 Jun 2004 13:59:16 +0000 Subject: [PATCH 1369/1463] Patch by Michael Fritscher <michael@fritscher.net> Fix CVS warnings. svn path=/trunk/; revision=9656 --- reactos/drivers/storage/atapi/.cvsignore | 1 + reactos/drivers/storage/cdrom/.cvsignore | 1 + reactos/drivers/storage/class2/.cvsignore | 2 ++ reactos/drivers/storage/disk/.cvsignore | 1 + reactos/drivers/storage/diskdump/.cvsignore | 1 + reactos/drivers/storage/scsiport/.cvsignore | 1 + 6 files changed, 7 insertions(+) diff --git a/reactos/drivers/storage/atapi/.cvsignore b/reactos/drivers/storage/atapi/.cvsignore index a6797a450d1..04a8e23eb9f 100644 --- a/reactos/drivers/storage/atapi/.cvsignore +++ b/reactos/drivers/storage/atapi/.cvsignore @@ -6,3 +6,4 @@ atapi.coff *.sym *.sys *.map +*.d diff --git a/reactos/drivers/storage/cdrom/.cvsignore b/reactos/drivers/storage/cdrom/.cvsignore index bea4cce6a76..29f05e12d01 100644 --- a/reactos/drivers/storage/cdrom/.cvsignore +++ b/reactos/drivers/storage/cdrom/.cvsignore @@ -6,3 +6,4 @@ cdrom.coff *.sym *.sys *.map +*.d diff --git a/reactos/drivers/storage/class2/.cvsignore b/reactos/drivers/storage/class2/.cvsignore index 180a62eee0e..be01fe75e94 100644 --- a/reactos/drivers/storage/class2/.cvsignore +++ b/reactos/drivers/storage/class2/.cvsignore @@ -6,3 +6,5 @@ class2.coff *.sys *.sym *.map +*.d + diff --git a/reactos/drivers/storage/disk/.cvsignore b/reactos/drivers/storage/disk/.cvsignore index b018b1798f9..bf4f864f9a8 100644 --- a/reactos/drivers/storage/disk/.cvsignore +++ b/reactos/drivers/storage/disk/.cvsignore @@ -6,3 +6,4 @@ disk.coff *.sys *.o *.map +*.d diff --git a/reactos/drivers/storage/diskdump/.cvsignore b/reactos/drivers/storage/diskdump/.cvsignore index 905450c3198..2d37512ea3b 100644 --- a/reactos/drivers/storage/diskdump/.cvsignore +++ b/reactos/drivers/storage/diskdump/.cvsignore @@ -6,3 +6,4 @@ diskdump.coff *.sym *.sys *.map +*.d diff --git a/reactos/drivers/storage/scsiport/.cvsignore b/reactos/drivers/storage/scsiport/.cvsignore index f95558eac75..51615a779bc 100644 --- a/reactos/drivers/storage/scsiport/.cvsignore +++ b/reactos/drivers/storage/scsiport/.cvsignore @@ -6,3 +6,4 @@ scsiport.coff *.sym *.sys *.map +*.d From b2e222b3052d57df574ab336cca44d6e9d61782d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Fri, 11 Jun 2004 14:10:12 +0000 Subject: [PATCH 1370/1463] Patch by Michael Fritscher <michael@fritscher.net> Add /? and /s cmdline options svn path=/trunk/; revision=9657 --- reactos/apps/utils/pnpdump/pnpdump.c | 39 ++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/reactos/apps/utils/pnpdump/pnpdump.c b/reactos/apps/utils/pnpdump/pnpdump.c index 4dd120807ef..ade651a0a23 100644 --- a/reactos/apps/utils/pnpdump/pnpdump.c +++ b/reactos/apps/utils/pnpdump/pnpdump.c @@ -671,6 +671,7 @@ int main (int argc, char *argv[]) HKEY hPnpKey; DWORD dwType; DWORD dwSize; + BOOL Ask = TRUE; PCM_FULL_RESOURCE_DESCRIPTOR lpBuffer; PCM_PNP_BIOS_INSTALLATION_CHECK lpPnpInst; PCM_PNP_BIOS_DEVICE_NODE lpDevNode; @@ -678,7 +679,21 @@ int main (int argc, char *argv[]) DWORD dwDataSize, dwResourceSize; hPnpKey = 0; + + if (argc >1 && (!strcmp (argv[1],"/S") || !strcmp (argv[1],"/s"))) + { + Ask = FALSE; + } + + 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"); + return 0; + } + + lError = GetPnpKey(&hPnpKey); if (lError != ERROR_SUCCESS) { @@ -783,8 +798,15 @@ return 0; lpDevNode = (PCM_PNP_BIOS_DEVICE_NODE)((DWORD)lpDevNode + lpDevNode->Size); } - printf ("\n Press any key...\n"); - getch(); + if (Ask) + { + printf ("\n Press any key...\n"); + getch(); + } + else + { + printf ("\n"); + } dwDataSize = sizeof(CM_PNP_BIOS_INSTALLATION_CHECK); lpDevNode = (PCM_PNP_BIOS_DEVICE_NODE)((DWORD)lpPnpInst + sizeof(CM_PNP_BIOS_INSTALLATION_CHECK)); @@ -793,9 +815,16 @@ return 0; { PrintDeviceData (lpDevNode); - printf ("\n Press any key...\n"); - getch(); - + if (Ask) + { + printf ("\n Press any key...\n"); + getch(); + } + else + { + printf ("\n"); + } + dwDataSize += lpDevNode->Size; lpDevNode = (PCM_PNP_BIOS_DEVICE_NODE)((DWORD)lpDevNode + lpDevNode->Size); } From 57c3c75356dd4b73709a264eb91b106924a71a27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Fri, 11 Jun 2004 20:15:07 +0000 Subject: [PATCH 1371/1463] Set MaximumLength to size of allocated memory svn path=/trunk/; revision=9658 --- reactos/subsys/win32k/ntuser/misc.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index b64f7878c93..68cfe18e24b 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.76 2004/05/28 21:33:41 gvg Exp $ +/* $Id: misc.c,v 1.77 2004/06/11 20:15:07 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1138,7 +1138,8 @@ IntSafeCopyUnicodeString(PUNICODE_STRING Dest, if(Dest->Length > 0 && Src) { - Dest->Buffer = ExAllocatePoolWithTag(NonPagedPool, Dest->Length, TAG_STRING); + Dest->MaximumLength = Dest->Length; + Dest->Buffer = ExAllocatePoolWithTag(NonPagedPool, Dest->MaximumLength, TAG_STRING); if(!Dest->Buffer) { return STATUS_NO_MEMORY; @@ -1183,7 +1184,8 @@ IntSafeCopyUnicodeStringTerminateNULL(PUNICODE_STRING Dest, if(Dest->Length > 0 && Src) { - Dest->Buffer = ExAllocatePoolWithTag(NonPagedPool, Dest->Length + sizeof(WCHAR), TAG_STRING); + Dest->MaximumLength = Dest->Length + sizeof(WCHAR); + Dest->Buffer = ExAllocatePoolWithTag(NonPagedPool, Dest->MaximumLength, TAG_STRING); if(!Dest->Buffer) { return STATUS_NO_MEMORY; From 25ae3e20a780192ed396579443f2bb84074a6290 Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Sat, 12 Jun 2004 04:46:18 +0000 Subject: [PATCH 1372/1463] Removed redundant tracking (now incorporated into NdisAllocatePacket, etc) that was causing a bugcheck in the 'ping to us' case. The memory was detected tracked twice (correctly). This condition was detected by mifritcher after I checked in. svn path=/trunk/; revision=9659 --- reactos/drivers/net/tcpip/network/icmp.c | 2 -- reactos/drivers/net/tcpip/tcpip/memtrack.c | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/reactos/drivers/net/tcpip/network/icmp.c b/reactos/drivers/net/tcpip/network/icmp.c index 38bd7d918f3..67d1ff50438 100644 --- a/reactos/drivers/net/tcpip/network/icmp.c +++ b/reactos/drivers/net/tcpip/network/icmp.c @@ -91,7 +91,6 @@ PIP_PACKET PrepareICMPPacket( exFreePool(DataBuffer); return NULL; } - Track(NDIS_PACKET_TAG,NdisPacket); TI_DbgPrint(MAX_TRACE, ("NdisPacket at (0x%X).\n", NdisPacket)); @@ -103,7 +102,6 @@ PIP_PACKET PrepareICMPPacket( exFreePool(DataBuffer); return NULL; } - Track(NDIS_BUFFER_TAG,NdisBuffer); TI_DbgPrint(MAX_TRACE, ("NdisBuffer at (0x%X).\n", NdisBuffer)); diff --git a/reactos/drivers/net/tcpip/tcpip/memtrack.c b/reactos/drivers/net/tcpip/tcpip/memtrack.c index ea75ca65563..58c8820b946 100644 --- a/reactos/drivers/net/tcpip/tcpip/memtrack.c +++ b/reactos/drivers/net/tcpip/tcpip/memtrack.c @@ -63,11 +63,10 @@ VOID TrackWithTag( DWORD Tag, PVOID Thing, PCHAR FileName, DWORD LineNo ) { if( ThingInList->Thing == Thing ) { RemoveEntryList(Entry); + KeReleaseSpinLock( &AllocatedObjectsLock, OldIrql ); ShowTrackedThing( "Alloc", ThingInList, FileName, LineNo ); - ExFreePool( ThingInList ); TrackDumpFL( FileName, LineNo ); - KeReleaseSpinLock( &AllocatedObjectsLock, OldIrql ); DbgPrint("TRACK: SPECIFIED ALREADY ALLOCATED ITEM %x\n", Thing); KeBugCheck( 0 ); } From ebb7ad1e4a149b001d288dce94a390ca1f04155b Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 13 Jun 2004 10:35:53 +0000 Subject: [PATCH 1373/1463] - Fixed prototypes of NtAddAtom, NtFindAtom, NtProtectVirtualMemory and KeQueryInterruptTime. svn path=/trunk/; revision=9660 --- reactos/iface/native/sysfuncs.lst | 4 +- reactos/include/ntos/zw.h | 20 ++++++---- reactos/lib/kernel32/mem/virtual.c | 6 +-- reactos/lib/kernel32/misc/atom.c | 6 ++- reactos/lib/ntdll/def/ntdll.def | 10 ++--- reactos/lib/ntdll/def/ntdll.edf | 10 ++--- reactos/lib/ntdll/ldr/utils.c | 63 ++++++++++++++++-------------- reactos/ntoskrnl/ex/sysinfo.c | 6 +-- reactos/ntoskrnl/ke/timer.c | 20 +++++----- reactos/ntoskrnl/mm/virtual.c | 22 ++++++++--- reactos/ntoskrnl/ntoskrnl.def | 6 +-- reactos/ntoskrnl/ntoskrnl.edf | 6 +-- reactos/ntoskrnl/rtl/atom.c | 15 +++---- 13 files changed, 111 insertions(+), 83 deletions(-) diff --git a/reactos/iface/native/sysfuncs.lst b/reactos/iface/native/sysfuncs.lst index cceb6c8a182..2361f4a2529 100644 --- a/reactos/iface/native/sysfuncs.lst +++ b/reactos/iface/native/sysfuncs.lst @@ -1,7 +1,7 @@ NtAcceptConnectPort ZwAcceptConnectPort 6 NtAccessCheck ZwAccessCheck 8 NtAccessCheckAndAuditAlarm ZwAccessCheckAndAuditAlarm 11 -NtAddAtom ZwAddAtom 2 +NtAddAtom ZwAddAtom 3 NtAdjustGroupsToken ZwAdjustGroupsToken 6 NtAdjustPrivilegesToken ZwAdjustPrivilegesToken 6 NtAlertResumeThread ZwAlertResumeThread 2 @@ -51,7 +51,7 @@ NtDuplicateToken ZwDuplicateToken 6 NtEnumerateKey ZwEnumerateKey 6 NtEnumerateValueKey ZwEnumerateValueKey 6 NtExtendSection ZwExtendSection 2 -NtFindAtom ZwFindAtom 2 +NtFindAtom ZwFindAtom 3 NtFlushBuffersFile ZwFlushBuffersFile 2 NtFlushInstructionCache ZwFlushInstructionCache 3 NtFlushKey ZwFlushKey 1 diff --git a/reactos/include/ntos/zw.h b/reactos/include/ntos/zw.h index 8549f481f39..cfb24fa142c 100755 --- a/reactos/include/ntos/zw.h +++ b/reactos/include/ntos/zw.h @@ -1,5 +1,5 @@ -/* $Id: zw.h,v 1.24 2004/05/01 19:22:49 ekohl Exp $ +/* $Id: zw.h,v 1.25 2004/06/13 10:35:51 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -4878,8 +4878,8 @@ NTSTATUS STDCALL NtProtectVirtualMemory( IN HANDLE ProcessHandle, - IN PVOID BaseAddress, - IN ULONG NumberOfBytesToProtect, + IN PVOID *BaseAddress, + IN ULONG *NumberOfBytesToProtect, IN ULONG NewAccessProtection, OUT PULONG OldAccessProtection ); @@ -5235,8 +5235,9 @@ ZwAccessCheckAndAuditAlarm( /* * FUNCTION: Adds an atom to the global atom table * ARGUMENTS: - * AtomString = The string to add to the atom table. - * Atom (OUT) = Caller supplies storage for the resulting atom. + * AtomName = The string to add to the atom table. + * AtomNameLength = Length of the atom name + * Atom (OUT) = Caller supplies storage for the resulting atom. * REMARKS: The arguments map to the win32 add GlobalAddAtom. * RETURNS: Status */ @@ -5244,6 +5245,7 @@ NTSTATUS STDCALL NtAddAtom( IN PWSTR AtomName, + IN ULONG AtomNameLength, IN OUT PRTL_ATOM Atom ); @@ -5252,6 +5254,7 @@ NTSTATUS STDCALL ZwAddAtom( IN PWSTR AtomName, + IN ULONG AtomNameLength, IN OUT PRTL_ATOM Atom ); @@ -5350,6 +5353,7 @@ ZwDuplicateToken( * FUNCTION: Finds a atom * ARGUMENTS: * AtomName = Name to search for. + * AtomNameLength = Length of the atom name * Atom = Caller supplies storage for the resulting atom * RETURNS: Status * REMARKS: @@ -5359,6 +5363,7 @@ NTSTATUS STDCALL NtFindAtom( IN PWSTR AtomName, + IN ULONG AtomNameLength, OUT PRTL_ATOM Atom OPTIONAL ); @@ -5366,6 +5371,7 @@ NTSTATUS STDCALL ZwFindAtom( IN PWSTR AtomName, + IN ULONG AtomNameLength, OUT PRTL_ATOM Atom OPTIONAL ); @@ -5491,8 +5497,8 @@ NTSTATUS STDCALL ZwProtectVirtualMemory( IN HANDLE ProcessHandle, - IN PVOID BaseAddress, - IN ULONG NumberOfBytesToProtect, + IN PVOID *BaseAddress, + IN ULONG *NumberOfBytesToProtect, IN ULONG NewAccessProtection, OUT PULONG OldAccessProtection ); diff --git a/reactos/lib/kernel32/mem/virtual.c b/reactos/lib/kernel32/mem/virtual.c index 262a0b28ab7..dba21341ce4 100644 --- a/reactos/lib/kernel32/mem/virtual.c +++ b/reactos/lib/kernel32/mem/virtual.c @@ -1,4 +1,4 @@ -/* $Id: virtual.c,v 1.12 2004/01/23 17:13:36 ekohl Exp $ +/* $Id: virtual.c,v 1.13 2004/06/13 10:35:52 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -126,8 +126,8 @@ VirtualProtectEx(HANDLE hProcess, NTSTATUS Status; Status = NtProtectVirtualMemory(hProcess, - (PVOID)lpAddress, - dwSize, + &lpAddress, + &dwSize, flNewProtect, (PULONG)lpflOldProtect); if (!NT_SUCCESS(Status)) diff --git a/reactos/lib/kernel32/misc/atom.c b/reactos/lib/kernel32/misc/atom.c index 688c3597cd2..25b58a6e4fb 100644 --- a/reactos/lib/kernel32/misc/atom.c +++ b/reactos/lib/kernel32/misc/atom.c @@ -1,4 +1,4 @@ -/* $Id: atom.c,v 1.19 2004/01/23 21:16:03 ekohl Exp $ +/* $Id: atom.c,v 1.20 2004/06/13 10:35:52 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -49,6 +49,7 @@ GlobalAddAtomA(LPCSTR lpString) (LPSTR)lpString); Status = NtAddAtom(AtomName.Buffer, + AtomName.Length, &Atom); RtlFreeUnicodeString(&AtomName); if (!NT_SUCCESS(Status)) @@ -81,6 +82,7 @@ GlobalAddAtomW(LPCWSTR lpString) } Status = NtAddAtom((LPWSTR)lpString, + wcslen(lpString), &Atom); if (!NT_SUCCESS(Status)) { @@ -139,6 +141,7 @@ GlobalFindAtomA(LPCSTR lpString) RtlCreateUnicodeStringFromAsciiz(&AtomName, (LPSTR)lpString); Status = NtFindAtom(AtomName.Buffer, + AtomName.Length, &Atom); RtlFreeUnicodeString(&AtomName); if (!NT_SUCCESS(Status)) @@ -171,6 +174,7 @@ GlobalFindAtomW(LPCWSTR lpString) } Status = NtFindAtom((LPWSTR)lpString, + wcslen(lpString), &Atom); if (!NT_SUCCESS(Status)) { diff --git a/reactos/lib/ntdll/def/ntdll.def b/reactos/lib/ntdll/def/ntdll.def index 0ba838b25ac..7f6b2e06a7c 100644 --- a/reactos/lib/ntdll/def/ntdll.def +++ b/reactos/lib/ntdll/def/ntdll.def @@ -1,4 +1,4 @@ -; $Id: ntdll.def,v 1.120 2004/05/13 21:01:14 navaraf Exp $ +; $Id: ntdll.def,v 1.121 2004/06/13 10:35:52 navaraf Exp $ ; ; ReactOS Operating System ; @@ -64,7 +64,7 @@ NlsMbOemCodePageTag DATA NtAcceptConnectPort@24 NtAccessCheck@32 NtAccessCheckAndAuditAlarm@44 -NtAddAtom@8 +NtAddAtom@12 NtAdjustGroupsToken@24 NtAdjustPrivilegesToken@24 NtAlertResumeThread@8 @@ -116,7 +116,7 @@ NtDuplicateToken@24 NtEnumerateKey@24 NtEnumerateValueKey@24 NtExtendSection@8 -NtFindAtom@8 +NtFindAtom@12 NtFlushBuffersFile@8 NtFlushInstructionCache@12 NtFlushKey@4 @@ -654,7 +654,7 @@ RtlxUnicodeStringToOemSize@4 ZwAcceptConnectPort@24 ZwAccessCheck@32 ZwAccessCheckAndAuditAlarm@44 -ZwAddAtom@8 +ZwAddAtom@12 ZwAdjustGroupsToken@24 ZwAdjustPrivilegesToken@24 ZwAlertResumeThread@8 @@ -704,7 +704,7 @@ ZwDuplicateToken@24 ZwEnumerateKey@24 ZwEnumerateValueKey@24 ZwExtendSection@8 -ZwFindAtom@8 +ZwFindAtom@12 ZwFlushBuffersFile@8 ZwFlushInstructionCache@12 ZwFlushKey@4 diff --git a/reactos/lib/ntdll/def/ntdll.edf b/reactos/lib/ntdll/def/ntdll.edf index 3e02dcf925b..d7c771d57b1 100644 --- a/reactos/lib/ntdll/def/ntdll.edf +++ b/reactos/lib/ntdll/def/ntdll.edf @@ -1,4 +1,4 @@ -; $Id: ntdll.edf,v 1.110 2004/05/13 21:01:14 navaraf Exp $ +; $Id: ntdll.edf,v 1.111 2004/06/13 10:35:52 navaraf Exp $ ; ; ReactOS Operating System ; @@ -64,7 +64,7 @@ NlsMbOemCodePageTag DATA NtAcceptConnectPort=NtAcceptConnectPort@24 NtAccessCheck=NtAccessCheck@32 NtAccessCheckAndAuditAlarm=NtAccessCheckAndAuditAlarm@44 -NtAddAtom=NtAddAtom@8 +NtAddAtom=NtAddAtom@12 NtAdjustGroupsToken=NtAdjustGroupsToken@24 NtAdjustPrivilegesToken=NtAdjustPrivilegesToken@24 NtAlertResumeThread=NtAlertResumeThread@8 @@ -116,7 +116,7 @@ NtDuplicateToken=NtDuplicateToken@24 NtEnumerateKey=NtEnumerateKey@24 NtEnumerateValueKey=NtEnumerateValueKey@24 NtExtendSection=NtExtendSection@8 -NtFindAtom=NtFindAtom@8 +NtFindAtom=NtFindAtom@12 NtFlushBuffersFile=NtFlushBuffersFile@8 NtFlushInstructionCache=NtFlushInstructionCache@12 NtFlushKey=NtFlushKey@4 @@ -656,7 +656,7 @@ RtlxUnicodeStringToOemSize=RtlxUnicodeStringToOemSize@4 ZwAcceptConnectPort=ZwAcceptConnectPort@24 ZwAccessCheck=ZwAccessCheck@32 ZwAccessCheckAndAuditAlarm=ZwAccessCheckAndAuditAlarm@44 -ZwAddAtom=ZwAddAtom@8 +ZwAddAtom=ZwAddAtom@12 ZwAdjustGroupsToken=ZwAdjustGroupsToken@24 ZwAdjustPrivilegesToken=ZwAdjustPrivilegesToken@24 ZwAlertResumeThread=ZwAlertResumeThread@8 @@ -706,7 +706,7 @@ ZwDuplicateToken=ZwDuplicateToken@24 ZwEnumerateKey=ZwEnumerateKey@24 ZwEnumerateValueKey=ZwEnumerateValueKey@24 ZwExtendSection=ZwExtendSection@8 -ZwFindAtom=ZwFindAtom@8 +ZwFindAtom=ZwFindAtom@12 ZwFlushBuffersFile=ZwFlushBuffersFile@8 ZwFlushInstructionCache=ZwFlushInstructionCache@12 ZwFlushKey=ZwFlushKey@4 diff --git a/reactos/lib/ntdll/ldr/utils.c b/reactos/lib/ntdll/ldr/utils.c index 1ef60632967..5ae83c8c3f9 100644 --- a/reactos/lib/ntdll/ldr/utils.c +++ b/reactos/lib/ntdll/ldr/utils.c @@ -1,4 +1,4 @@ -/* $Id: utils.c,v 1.87 2004/06/02 18:26:58 gvg Exp $ +/* $Id: utils.c,v 1.88 2004/06/13 10:35:52 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1235,7 +1235,11 @@ static NTSTATUS LdrPerformRelocations (PIMAGE_NT_HEADERS NTHeaders, int i; PIMAGE_DATA_DIRECTORY RelocationDDir; ULONG OldProtect; + PVOID ProtectBase; + ULONG ProtectSize; ULONG OldProtect2; + PVOID ProtectBase2; + ULONG ProtectSize2; NTSTATUS Status; PIMAGE_SECTION_HEADER Sections; ULONG MaxExtend; @@ -1286,10 +1290,11 @@ static NTSTATUS LdrPerformRelocations (PIMAGE_NT_HEADERS NTHeaders, RelocationDir->SizeOfBlock - sizeof (RELOCATION_DIRECTORY); NumberOfEntries = NumberOfEntries / sizeof (RELOCATION_ENTRY); + ProtectBase = ImageBase + RelocationDir->VirtualAddress; + ProtectSize = PAGE_SIZE; Status = NtProtectVirtualMemory(NtCurrentProcess(), - ImageBase + - RelocationDir->VirtualAddress, - PAGE_SIZE, + &ProtectBase, + &ProtectSize, PAGE_READWRITE, &OldProtect); if (!NT_SUCCESS(Status)) @@ -1300,21 +1305,21 @@ static NTSTATUS LdrPerformRelocations (PIMAGE_NT_HEADERS NTHeaders, if (RelocationDir->VirtualAddress + PAGE_SIZE < MaxExtend) { + ProtectBase2 = ImageBase + RelocationDir->VirtualAddress + PAGE_SIZE; + ProtectSize2 = PAGE_SIZE; Status = NtProtectVirtualMemory(NtCurrentProcess(), - ImageBase + - RelocationDir->VirtualAddress + PAGE_SIZE, - PAGE_SIZE, + &ProtectBase2, + &ProtectSize2, PAGE_READWRITE, &OldProtect2); if (!NT_SUCCESS(Status)) { DPRINT1("Failed to unprotect relocation target (2).\n"); - NtProtectVirtualMemory(NtCurrentProcess(), - ImageBase + - RelocationDir->VirtualAddress, - PAGE_SIZE, - OldProtect, - &OldProtect); + NtProtectVirtualMemory(NtCurrentProcess(), + &ProtectBase, + &ProtectSize, + OldProtect, + &OldProtect); return(Status); } } @@ -1360,9 +1365,8 @@ static NTSTATUS LdrPerformRelocations (PIMAGE_NT_HEADERS NTHeaders, } Status = NtProtectVirtualMemory(NtCurrentProcess(), - ImageBase + - RelocationDir->VirtualAddress, - PAGE_SIZE, + &ProtectBase, + &ProtectSize, OldProtect, &OldProtect); if (!NT_SUCCESS(Status)) @@ -1374,9 +1378,8 @@ static NTSTATUS LdrPerformRelocations (PIMAGE_NT_HEADERS NTHeaders, if (RelocationDir->VirtualAddress + PAGE_SIZE < MaxExtend) { Status = NtProtectVirtualMemory(NtCurrentProcess(), - ImageBase + - RelocationDir->VirtualAddress + PAGE_SIZE, - PAGE_SIZE, + &ProtectBase2, + &ProtectSize2, OldProtect2, &OldProtect2); if (!NT_SUCCESS(Status)) @@ -1468,11 +1471,12 @@ LdrpProcessImportDirectoryEntry( /* Unprotect the region we are about to write into. */ IATBase = (PVOID)ImportAddressList; + IATSize *= sizeof(PVOID*); Status = NtProtectVirtualMemory(NtCurrentProcess(), - IATBase, - IATSize * sizeof(PVOID*), - PAGE_READWRITE, - &OldProtect); + &IATBase, + &IATSize, + PAGE_READWRITE, + &OldProtect); if (!NT_SUCCESS(Status)) { DPRINT1("Failed to unprotect IAT.\n"); @@ -1509,8 +1513,8 @@ LdrpProcessImportDirectoryEntry( /* Protect the region we are about to write into. */ Status = NtProtectVirtualMemory(NtCurrentProcess(), - IATBase, - IATSize * sizeof(PVOID*), + &IATBase, + &IATSize, OldProtect, &OldProtect); if (!NT_SUCCESS(Status)) @@ -1626,9 +1630,10 @@ LdrpAdjustImportDirectory(PLDR_MODULE Module, /* Unprotect the region we are about to write into. */ IATBase = (PVOID)ImportAddressList; + IATSize *= sizeof(PVOID*); Status = NtProtectVirtualMemory(NtCurrentProcess(), - IATBase, - IATSize * sizeof(PVOID*), + &IATBase, + &IATSize, PAGE_READWRITE, &OldProtect); if (!NT_SUCCESS(Status)) @@ -1655,8 +1660,8 @@ LdrpAdjustImportDirectory(PLDR_MODULE Module, /* Protect the region we are about to write into. */ Status = NtProtectVirtualMemory(NtCurrentProcess(), - IATBase, - IATSize * sizeof(PVOID*), + &IATBase, + &IATSize, OldProtect, &OldProtect); if (!NT_SUCCESS(Status)) diff --git a/reactos/ntoskrnl/ex/sysinfo.c b/reactos/ntoskrnl/ex/sysinfo.c index 94e61dac831..8bd9bbbc29f 100644 --- a/reactos/ntoskrnl/ex/sysinfo.c +++ b/reactos/ntoskrnl/ex/sysinfo.c @@ -1,4 +1,4 @@ -/* $Id: sysinfo.c,v 1.35 2004/05/26 19:56:35 navaraf Exp $ +/* $Id: sysinfo.c,v 1.36 2004/06/13 10:35:52 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -28,7 +28,7 @@ #include <internal/debug.h> extern ULONG NtGlobalFlag; /* FIXME: it should go in a ddk/?.h */ -VOID STDCALL KeQueryInterruptTime(PLARGE_INTEGER CurrentTime); +ULONGLONG STDCALL KeQueryInterruptTime(VOID); VOID MmPrintMemoryStatistic(VOID); @@ -647,7 +647,7 @@ QSI_DEF(SystemProcessorPerformanceInformation) PsLookupProcessByProcessId((PVOID) 1, &TheIdleProcess); - KeQueryInterruptTime((PLARGE_INTEGER) &CurrentTime); + CurrentTime.QuadPart = KeQueryInterruptTime(); Spi->TotalProcessorRunTime.QuadPart = TheIdleProcess->Pcb.KernelTime * 100000; // IdleTime diff --git a/reactos/ntoskrnl/ke/timer.c b/reactos/ntoskrnl/ke/timer.c index 5cef98da22e..a2a0947a441 100644 --- a/reactos/ntoskrnl/ke/timer.c +++ b/reactos/ntoskrnl/ke/timer.c @@ -1,4 +1,4 @@ -/* $Id: timer.c,v 1.72 2004/04/20 20:38:41 jimtabor Exp $ +/* $Id: timer.c,v 1.73 2004/06/13 10:35:52 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -224,16 +224,19 @@ KeQuerySystemTime(PLARGE_INTEGER CurrentTime) while (CurrentTime->u.HighPart != SharedUserData->SystemTime.High2Part); } -VOID STDCALL -KeQueryInterruptTime(PLARGE_INTEGER CurrentTime) +ULONGLONG STDCALL +KeQueryInterruptTime(VOID) { + LARGE_INTEGER CurrentTime; + do { - CurrentTime->u.HighPart = SharedUserData->InterruptTime.High1Part; - CurrentTime->u.LowPart = SharedUserData->InterruptTime.LowPart; + CurrentTime.u.HighPart = SharedUserData->InterruptTime.High1Part; + CurrentTime.u.LowPart = SharedUserData->InterruptTime.LowPart; } - while (CurrentTime->u.HighPart != SharedUserData->InterruptTime.High2Part); + while (CurrentTime.u.HighPart != SharedUserData->InterruptTime.High2Part); + return CurrentTime.QuadPart; } /* @@ -305,9 +308,8 @@ KeSetTimerEx (PKTIMER Timer, Timer->Dpc = Dpc; if (DueTime.QuadPart < 0) { - KeQueryInterruptTime(&Time); Timer->Header.Absolute = 0; - Timer->DueTime.QuadPart = Time.QuadPart - DueTime.QuadPart; + Timer->DueTime.QuadPart = KeQueryInterruptTime() - DueTime.QuadPart; } else { @@ -542,7 +544,7 @@ KeExpireTimers(PKDPC Dpc, KeAcquireSpinLockAtDpcLevel(&TimerListLock); - KeQueryInterruptTime(&InterruptTime); + InterruptTime.QuadPart = KeQueryInterruptTime(); KeQuerySystemTime(&SystemTime); current_entry = RelativeTimerListHead.Flink; diff --git a/reactos/ntoskrnl/mm/virtual.c b/reactos/ntoskrnl/mm/virtual.c index d8200fe0d3c..f062fa455da 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.74 2004/05/29 11:53:43 navaraf Exp $ +/* $Id: virtual.c,v 1.75 2004/06/13 10:35:52 navaraf Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/virtual.c @@ -206,8 +206,8 @@ NtQueryVirtualMemory (IN HANDLE ProcessHandle, NTSTATUS STDCALL NtProtectVirtualMemory(IN HANDLE ProcessHandle, - IN PVOID BaseAddress, - IN ULONG NumberOfBytesToProtect, + IN PVOID *UnsafeBaseAddress, + IN ULONG *UnsafeNumberOfBytesToProtect, IN ULONG NewAccessProtection, OUT PULONG UnsafeOldAccessProtection) { @@ -216,6 +216,15 @@ NtProtectVirtualMemory(IN HANDLE ProcessHandle, NTSTATUS Status; PMADDRESS_SPACE AddressSpace; ULONG OldAccessProtection; + PVOID BaseAddress; + ULONG NumberOfBytesToProtect; + + Status = MmCopyFromCaller(&BaseAddress, UnsafeBaseAddress, sizeof(PVOID)); + if (!NT_SUCCESS(Status)) + return Status; + Status = MmCopyFromCaller(&NumberOfBytesToProtect, UnsafeNumberOfBytesToProtect, sizeof(ULONG)); + if (!NT_SUCCESS(Status)) + return Status; NumberOfBytesToProtect = PAGE_ROUND_UP(BaseAddress + NumberOfBytesToProtect) - @@ -228,7 +237,7 @@ NtProtectVirtualMemory(IN HANDLE ProcessHandle, UserMode, (PVOID*)(&Process), NULL); - if (Status != STATUS_SUCCESS) + if (!NT_SUCCESS(Status)) { DPRINT("NtProtectVirtualMemory() = %x\n",Status); return(Status); @@ -263,8 +272,9 @@ NtProtectVirtualMemory(IN HANDLE ProcessHandle, MmUnlockAddressSpace(AddressSpace); ObDereferenceObject(Process); - MmCopyToCaller(UnsafeOldAccessProtection, &OldAccessProtection, - sizeof(ULONG)); + MmCopyToCaller(UnsafeOldAccessProtection, &OldAccessProtection, sizeof(ULONG)); + MmCopyToCaller(UnsafeBaseAddress, &BaseAddress, sizeof(PVOID)); + MmCopyToCaller(UnsafeNumberOfBytesToProtect, &NumberOfBytesToProtect, sizeof(ULONG)); return(Status); } diff --git a/reactos/ntoskrnl/ntoskrnl.def b/reactos/ntoskrnl/ntoskrnl.def index 5375539f58c..06e7e9f097c 100644 --- a/reactos/ntoskrnl/ntoskrnl.def +++ b/reactos/ntoskrnl/ntoskrnl.def @@ -1,4 +1,4 @@ -; $Id: ntoskrnl.def,v 1.183 2004/05/28 21:16:27 royce Exp $ +; $Id: ntoskrnl.def,v 1.184 2004/06/13 10:35:53 navaraf Exp $ ; ; reactos/ntoskrnl/ntoskrnl.def ; @@ -559,7 +559,7 @@ NlsLeadByteInfo DATA NlsMbCodePageTag DATA NlsMbOemCodePageTag DATA NlsOemLeadByteInfo DATA -NtAddAtom@8 +NtAddAtom@12 NtAdjustPrivilegesToken@24 NtAlertThread@4 NtAllocateLocallyUniqueId@4 @@ -578,7 +578,7 @@ NtDeleteFile@4 NtDeviceIoControlFile@40 NtDuplicateObject@28 NtDuplicateToken@24 -NtFindAtom@8 +NtFindAtom@12 NtFreeVirtualMemory@16 NtFsControlFile@40 NtGlobalFlag DATA diff --git a/reactos/ntoskrnl/ntoskrnl.edf b/reactos/ntoskrnl/ntoskrnl.edf index ea879bf5b1e..e05d6846560 100644 --- a/reactos/ntoskrnl/ntoskrnl.edf +++ b/reactos/ntoskrnl/ntoskrnl.edf @@ -1,4 +1,4 @@ -; $Id: ntoskrnl.edf,v 1.169 2004/05/28 21:16:27 royce Exp $ +; $Id: ntoskrnl.edf,v 1.170 2004/06/13 10:35:53 navaraf Exp $ ; ; reactos/ntoskrnl/ntoskrnl.def ; @@ -560,7 +560,7 @@ NlsLeadByteInfo DATA NlsMbCodePageTag DATA NlsMbOemCodePageTag DATA NlsOemLeadByteInfo DATA -NtAddAtom=NtAddAtom@8 +NtAddAtom=NtAddAtom@12 NtAdjustPrivilegesToken=NtAdjustPrivilegesToken@24 NtAlertThread=NtAlertThread@4 NtAllocateLocallyUniqueId=NtAllocateLocallyUniqueId@4 @@ -579,7 +579,7 @@ NtDeleteFile=NtDeleteFile@4 NtDeviceIoControlFile=NtDeviceIoControlFile@40 NtDuplicateObject=NtDuplicateObject@28 NtDuplicateToken=NtDuplicateToken@24 -NtFindAtom=NtFindAtom@8 +NtFindAtom=NtFindAtom@12 NtFreeVirtualMemory=NtFreeVirtualMemory@16 NtFsControlFile=NtFsControlFile@40 NtGlobalFlag DATA diff --git a/reactos/ntoskrnl/rtl/atom.c b/reactos/ntoskrnl/rtl/atom.c index d4589f31e84..58d06aea7d3 100644 --- a/reactos/ntoskrnl/rtl/atom.c +++ b/reactos/ntoskrnl/rtl/atom.c @@ -1,4 +1,4 @@ -/* $Id: atom.c,v 1.9 2004/02/27 23:11:32 gvg Exp $ +/* $Id: atom.c,v 1.10 2004/06/13 10:35:53 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -67,18 +67,18 @@ static PRTL_ATOM_TABLE GlobalAtomTable = NULL; * @implemented */ NTSTATUS STDCALL -NtAddAtom(IN PWSTR AtomName, - OUT PRTL_ATOM Atom) +NtAddAtom( + IN PWSTR AtomName, + IN ULONG AtomNameLength, + OUT PRTL_ATOM Atom) { PRTL_ATOM_TABLE AtomTable; AtomTable = RtlpGetGlobalAtomTable(); if (AtomTable == NULL) - return STATUS_ACCESS_DENIED; + return STATUS_ACCESS_DENIED; - return (RtlAddAtomToAtomTable(AtomTable, - AtomName, - Atom)); + return RtlAddAtomToAtomTable(AtomTable, AtomName, Atom); } @@ -104,6 +104,7 @@ NtDeleteAtom(IN RTL_ATOM Atom) */ NTSTATUS STDCALL NtFindAtom(IN PWSTR AtomName, + IN ULONG AtomNameLength, OUT PRTL_ATOM Atom) { PRTL_ATOM_TABLE AtomTable; From 9ca2c517db775c262f638dab3eb1cea91f6b5e10 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 13 Jun 2004 12:45:29 +0000 Subject: [PATCH 1374/1463] XMLStorage update: XMLReaderBase svn path=/trunk/; revision=9661 --- .../system/explorer/utility/xmlstorage.cpp | 28 ++-- .../system/explorer/utility/xmlstorage.h | 135 ++++++++++++++---- 2 files changed, 122 insertions(+), 41 deletions(-) diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.cpp b/reactos/subsys/system/explorer/utility/xmlstorage.cpp index ee2e386b768..28f41780997 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.cpp +++ b/reactos/subsys/system/explorer/utility/xmlstorage.cpp @@ -54,16 +54,18 @@ bool XMLPos::go(const char* path) /// read XML stream into XML tree below _pos -XML_Status XMLReader::read(std::istream& in) +XML_Status XMLReaderBase::read() { XML_Status status = XML_STATUS_OK; - while(in.good() && status==XML_STATUS_OK) { + while(status == XML_STATUS_OK) { char* buffer = (char*) XML_GetBuffer(_parser, BUFFER_LEN); - in.read(buffer, BUFFER_LEN); + int l = read_buffer(buffer, BUFFER_LEN); + if (l < 0) + break; - status = XML_ParseBuffer(_parser, in.gcount(), false); + status = XML_ParseBuffer(_parser, l, false); } if (status != XML_STATUS_ERROR) @@ -81,9 +83,9 @@ XML_Status XMLReader::read(std::istream& in) /// store XML version and encoding into XML reader -void XMLCALL XMLReader::XML_XmlDeclHandler(void* userData, const XML_Char* version, const XML_Char* encoding, int standalone) +void XMLCALL XMLReaderBase::XML_XmlDeclHandler(void* userData, const XML_Char* version, const XML_Char* encoding, int standalone) { - XMLReader* pReader = (XMLReader*) userData; + XMLReaderBase* pReader = (XMLReaderBase*) userData; if (version) { pReader->_xml_version = version; @@ -92,9 +94,9 @@ void XMLCALL XMLReader::XML_XmlDeclHandler(void* userData, const XML_Char* versi } /// notifications about XML start tag -void XMLCALL XMLReader::XML_StartElementHandler(void* userData, const XML_Char* name, const XML_Char** atts) +void XMLCALL XMLReaderBase::XML_StartElementHandler(void* userData, const XML_Char* name, const XML_Char** atts) { - XMLReader* pReader = (XMLReader*) userData; + XMLReaderBase* pReader = (XMLReaderBase*) userData; XMLPos& pos = pReader->_pos; // search for end of first line @@ -139,9 +141,9 @@ void XMLCALL XMLReader::XML_StartElementHandler(void* userData, const XML_Char* } /// notifications about XML end tag -void XMLCALL XMLReader::XML_EndElementHandler(void* userData, const XML_Char* name) +void XMLCALL XMLReaderBase::XML_EndElementHandler(void* userData, const XML_Char* name) { - XMLReader* pReader = (XMLReader*) userData; + XMLReaderBase* pReader = (XMLReaderBase*) userData; XMLPos& pos = pReader->_pos; // search for end of first line @@ -174,15 +176,15 @@ void XMLCALL XMLReader::XML_EndElementHandler(void* userData, const XML_Char* na } /// store content, white space and comments -void XMLCALL XMLReader::XML_DefaultHandler(void* userData, const XML_Char* s, int len) +void XMLCALL XMLReaderBase::XML_DefaultHandler(void* userData, const XML_Char* s, int len) { - XMLReader* pReader = (XMLReader*) userData; + XMLReaderBase* pReader = (XMLReaderBase*) userData; pReader->_content.append(s, len); } -std::string XMLReader::get_error_string() const +std::string XMLReaderBase::get_error_string() const { XML_Error error = XML_GetErrorCode(_parser); diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.h b/reactos/subsys/system/explorer/utility/xmlstorage.h index 616c3401906..cf143350012 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.h +++ b/reactos/subsys/system/explorer/utility/xmlstorage.h @@ -345,7 +345,7 @@ struct XMLNode : public String // access to protected class members for XMLPos and XMLReader friend struct XMLPos; friend struct const_XMLPos; - friend struct XMLReader; + friend struct XMLReaderBase; XMLNode(const String& name) : String(name) @@ -377,6 +377,26 @@ struct XMLNode : public String } } + void clear() + { + _leading.erase(); + _content.erase(); + _end_leading.erase(); + _trailing.erase(); + + _attributes.clear(); + + while(!_children.empty()) { + XMLNode* node = _children.back(); + _children.pop_back(); + + node->clear(); + delete node; + } + + String::erase(); + } + XMLNode& operator=(const XMLNode& other) { _children.clear(); @@ -926,6 +946,9 @@ struct XMLPos } #endif + String& str() {return *_cur;} + const String& str() const {return *_cur;} + protected: XMLNode* _root; XMLNode* _cur; @@ -1017,6 +1040,8 @@ struct const_XMLPos } #endif + const String& str() const {return *_cur;} + protected: const XMLNode* _root; const XMLNode* _cur; @@ -1046,7 +1071,17 @@ struct XMLBool _value = def; } - XMLBool(XMLNode* node, const String& name, const String& attr_name, bool def=false) + XMLBool(const XMLNode* node, const String& attr_name, bool def=false) + { + const String& value = node->get(attr_name); + + if (!value.empty()) + _value = !_tcsicmp(value, TEXT("TRUE")); + else + _value = def; + } + + XMLBool(const XMLNode* node, const String& name, const String& attr_name, bool def=false) { const String& value = node->value(name, attr_name); @@ -1119,14 +1154,14 @@ protected: }; -struct XMLNumber +struct XMLInt { - XMLNumber(int value) + XMLInt(int value) : _value(value) { } - XMLNumber(LPCTSTR value, int def=0) + XMLInt(LPCTSTR value, int def=0) { if (value && *value) _value = _ttoi(value); @@ -1134,12 +1169,22 @@ struct XMLNumber _value = def; } - XMLNumber(XMLNode* node, const String& name, const String& attr_name, int def=0) + XMLInt(const XMLNode* node, const String& attr_name, int def=0) + { + const String& value = node->get(attr_name); + + if (!value.empty()) + _value = _ttoi(value); + else + _value = def; + } + + XMLInt(const XMLNode* node, const String& name, const String& attr_name, int def=0) { const String& value = node->value(name, attr_name); if (!value.empty()) - _value = _ttoi(node->value(name, attr_name)); + _value = _ttoi(value); else _value = def; } @@ -1163,16 +1208,16 @@ private: void operator=(const XMLBool&); // disallow assignment operations }; -struct XMLNumberRef +struct XMLIntRef { - XMLNumberRef(XMLNode* node, const String& name, const String& attr_name, int def=0) + XMLIntRef(XMLNode* node, const String& name, const String& attr_name, int def=0) : _ref(node->value(name, attr_name)) { if (_ref.empty()) assign(def); } - XMLNumberRef& operator=(int value) + XMLIntRef& operator=(int value) { assign(value); @@ -1202,9 +1247,9 @@ protected: #endif /// XML file reader -struct XMLReader +struct XMLReaderBase { - XMLReader(XMLNode* node) + XMLReaderBase(XMLNode* node) : _pos(node), _parser(XML_ParserCreate(NULL)) { @@ -1216,12 +1261,14 @@ struct XMLReader _last_tag = TAG_NONE; } - ~XMLReader() + virtual ~XMLReaderBase() { XML_ParserFree(_parser); } - XML_Status read(std::istream& in); + XML_Status read(); + + virtual int read_buffer(char* buffer, int len) = 0; std::string get_position() const { @@ -1253,6 +1300,30 @@ protected: }; +struct XMLReader : public XMLReaderBase +{ + XMLReader(XMLNode* node, std::istream& in) + : XMLReaderBase(node), + _in(in) + { + } + + /// read XML stream into XML tree below _pos + int read_buffer(char* buffer, int len) + { + if (!_in.good()) + return -1; + + _in.read(buffer, BUFFER_LEN); + + return _in.gcount(); + } + +protected: + std::istream& _in; +}; + + struct XMLHeader : public std::string { XMLHeader(const std::string& xml_version="1.0", const std::string& encoding="UTF-8", const std::string& doctype="") @@ -1293,18 +1364,9 @@ struct XMLDoc : public XMLNode std::istream& read(std::istream& in) { - XMLReader reader(this); + XMLReader reader(this, in); - XML_Status status = reader.read(in); - - if (status == XML_STATUS_ERROR) { - std::ostringstream out; - - out << reader.get_position() << " " << reader.get_error_string(); - - _last_error = reader.get_error_code(); - _last_error_msg = out.str(); - } + read(reader); return in; } @@ -1312,14 +1374,19 @@ struct XMLDoc : public XMLNode bool read(LPCTSTR path) { tifstream in(path); - XMLReader reader(this); + XMLReader reader(this, in); - XML_Status status = reader.read(in); + return read(reader, path); + } + + bool read(XMLReaderBase& reader, const char* display_path="") + { + XML_Status status = reader.read(); if (status == XML_STATUS_ERROR) { std::ostringstream out; - out << path << reader.get_position() << " " << reader.get_error_string(); + out << display_path << reader.get_position() << " " << reader.get_error_string(); _last_error = reader.get_error_code(); _last_error_msg = out.str(); @@ -1364,4 +1431,16 @@ struct XMLDoc : public XMLNode }; +struct XMLMessage : public XMLDoc +{ + XMLMessage(const char* name) + : _pos(this) + { + _pos.create(name); + } + + XMLPos _pos; +}; + + } // namespace XMLStorage From 1a9133bf9b5d281766af17cd3c2e34ab2d5880ea Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 13 Jun 2004 12:56:39 +0000 Subject: [PATCH 1375/1463] Unicode fix svn path=/trunk/; revision=9662 --- .../system/explorer/utility/xmlstorage.h | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.h b/reactos/subsys/system/explorer/utility/xmlstorage.h index cf143350012..5fed7e82fc6 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.h +++ b/reactos/subsys/system/explorer/utility/xmlstorage.h @@ -1376,10 +1376,26 @@ struct XMLDoc : public XMLNode tifstream in(path); XMLReader reader(this, in); - return read(reader, path); + return read(reader, String(path)); } - bool read(XMLReaderBase& reader, const char* display_path="") + bool read(XMLReaderBase& reader) + { + XML_Status status = reader.read(); + + if (status == XML_STATUS_ERROR) { + std::ostringstream out; + + out << "input stream" << reader.get_position() << " " << reader.get_error_string(); + + _last_error = reader.get_error_code(); + _last_error_msg = out.str(); + } + + return status != XML_STATUS_ERROR; + } + + bool read(XMLReaderBase& reader, const string& display_path) { XML_Status status = reader.read(); From 3aa5dd5be2f6ef5efaebc1d93e3762648a469edf Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 13 Jun 2004 14:05:53 +0000 Subject: [PATCH 1376/1463] - Fixed list traversing in MmAlterRegion to correctly handle Length that is greater than real memory area size. svn path=/trunk/; revision=9663 --- reactos/ntoskrnl/mm/region.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/mm/region.c b/reactos/ntoskrnl/mm/region.c index 4dae3a96d7f..f27cb55c122 100644 --- a/reactos/ntoskrnl/mm/region.c +++ b/reactos/ntoskrnl/mm/region.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: region.c,v 1.7 2004/04/10 22:35:25 gdalsnes Exp $ +/* $Id: region.c,v 1.8 2004/06/13 14:05:53 navaraf Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/region.c @@ -160,6 +160,7 @@ MmAlterRegion(PMADDRESS_SPACE AddressSpace, PVOID BaseAddress, { RemainingLength = 0; } + /* * If necessary then split the region into the affected and unaffected parts. */ @@ -186,7 +187,8 @@ MmAlterRegion(PMADDRESS_SPACE AddressSpace, PVOID BaseAddress, CurrentRegion = CONTAINING_RECORD(CurrentEntry, MM_REGION, RegionListEntry); CurrentBaseAddress = (char*)StartAddress + NewRegion->Length; - while (RemainingLength > 0 && CurrentRegion->Length <= RemainingLength) + while (RemainingLength > 0 && CurrentRegion->Length <= RemainingLength && + CurrentEntry != RegionListHead) { if (CurrentRegion->Type != NewType && CurrentRegion->Protect != NewProtect) @@ -217,7 +219,7 @@ MmAlterRegion(PMADDRESS_SPACE AddressSpace, PVOID BaseAddress, /* * Split any final region. */ - if (RemainingLength > 0) + if (RemainingLength > 0 && CurrentEntry != RegionListHead) { CurrentRegion = CONTAINING_RECORD(CurrentEntry, MM_REGION, RegionListEntry); From 6435dec245db030b59bdb82465e185896e004a33 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 13 Jun 2004 20:04:56 +0000 Subject: [PATCH 1377/1463] - Compile kernel32 using w32api. - Fixed some packing issues in DDK headers (more to come). svn path=/trunk/; revision=9664 --- reactos/include/napi/shared_data.h | 3 +- reactos/lib/kernel32/except/except.c | 11 +- reactos/lib/kernel32/file/iocompl.c | 7 +- reactos/lib/kernel32/file/mailslot.c | 12 +- reactos/lib/kernel32/file/move.c | 273 ++++++++++++------------ reactos/lib/kernel32/include/kernel32.h | 2 + reactos/lib/kernel32/k32.h | 4 + reactos/lib/kernel32/mem/global.c | 4 +- reactos/lib/kernel32/mem/heap.c | 4 +- reactos/lib/kernel32/mem/local.c | 10 +- reactos/lib/kernel32/mem/procmem.c | 14 +- reactos/lib/kernel32/misc/console.c | 56 +---- reactos/lib/kernel32/misc/errormsg.c | 33 +-- reactos/lib/kernel32/misc/lang.c | 8 +- reactos/lib/kernel32/misc/ldr.c | 11 +- reactos/lib/kernel32/misc/profile.c | 46 ++-- reactos/lib/kernel32/misc/res.c | 15 +- reactos/lib/kernel32/misc/stubs.c | 18 +- reactos/lib/kernel32/misc/sysinfo.c | 6 +- reactos/lib/kernel32/misc/time.c | 12 +- reactos/lib/kernel32/synch/intrlck.c | 11 +- reactos/lib/kernel32/synch/timer.c | 4 +- reactos/lib/kernel32/thread/fiber.c | 20 +- reactos/lib/kernel32/thread/thread.c | 13 +- reactos/w32api/include/ddk/ntddk.h | 4 - reactos/w32api/include/ddk/winddk.h | 55 ++--- reactos/w32api/include/ntdef.h | 2 + reactos/w32api/include/winbase.h | 49 +++-- reactos/w32api/include/winnt.h | 14 +- 29 files changed, 338 insertions(+), 383 deletions(-) diff --git a/reactos/include/napi/shared_data.h b/reactos/include/napi/shared_data.h index 032a294970e..e5e471efb2f 100644 --- a/reactos/include/napi/shared_data.h +++ b/reactos/include/napi/shared_data.h @@ -72,9 +72,8 @@ typedef struct _KUSER_SHARED_DATA #endif #define SharedUserData ((KUSER_SHARED_DATA * const)KI_USER_SHARED_DATA) #else -#ifndef __USE_W32API +#undef SharedUserData #define SharedUserData ((KUSER_SHARED_DATA * const)USER_SHARED_DATA) -#endif /* !__USE_W32API */ #endif diff --git a/reactos/lib/kernel32/except/except.c b/reactos/lib/kernel32/except/except.c index 597ff008d76..02e66b9c229 100644 --- a/reactos/lib/kernel32/except/except.c +++ b/reactos/lib/kernel32/except/except.c @@ -1,4 +1,4 @@ -/* $Id: except.c,v 1.13 2004/05/29 11:51:33 navaraf Exp $ +/* $Id: except.c,v 1.14 2004/06/13 20:04:55 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -12,18 +12,9 @@ #include <k32.h> - -typedef LONG (STDCALL *LPTOP_LEVEL_EXCEPTION_FILTER)( - struct _EXCEPTION_POINTERS *ExceptionInfo - ); - UINT GlobalErrMode; LPTOP_LEVEL_EXCEPTION_FILTER GlobalTopLevelExceptionFilter; -UINT GetErrorMode(void); - - - UINT GetErrorMode(void) { return GlobalErrMode; diff --git a/reactos/lib/kernel32/file/iocompl.c b/reactos/lib/kernel32/file/iocompl.c index bba956ef8a0..23f7aa5d796 100644 --- a/reactos/lib/kernel32/file/iocompl.c +++ b/reactos/lib/kernel32/file/iocompl.c @@ -1,4 +1,4 @@ -/* $Id: iocompl.c,v 1.13 2004/01/23 16:37:11 ekohl Exp $ +/* $Id: iocompl.c,v 1.14 2004/06/13 20:04:55 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -57,8 +57,13 @@ CreateIoCompletionPort( if ( FileHandle != INVALID_HANDLE_VALUE ) { +#ifdef __USE_W32API + CompletionInformation.Port = CompletionPort; + CompletionInformation.Key = CompletionKey; +#else CompletionInformation.IoCompletionHandle = CompletionPort; CompletionInformation.CompletionKey = CompletionKey; +#endif errCode = NtSetInformationFile(FileHandle, &IoStatusBlock, diff --git a/reactos/lib/kernel32/file/mailslot.c b/reactos/lib/kernel32/file/mailslot.c index c4148da0056..b6b1fa7b0ec 100644 --- a/reactos/lib/kernel32/file/mailslot.c +++ b/reactos/lib/kernel32/file/mailslot.c @@ -1,4 +1,4 @@ -/* $Id: mailslot.c,v 1.10 2004/01/23 21:16:03 ekohl Exp $ +/* $Id: mailslot.c,v 1.11 2004/06/13 20:04:55 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -131,19 +131,19 @@ GetMailslotInfo(HANDLE hMailslot, if (lpMaxMessageSize != NULL) { - *lpMaxMessageSize = Buffer.MaxMessageSize; + *lpMaxMessageSize = Buffer.MaximumMessageSize; } if (lpNextSize != NULL) { - *lpNextSize = Buffer.NextSize; + *lpNextSize = Buffer.NextMessageSize; } if (lpMessageCount != NULL) { - *lpMessageCount = Buffer.MessageCount; + *lpMessageCount = Buffer.MessagesAvailable; } if (lpReadTimeout != NULL) { - *lpReadTimeout = (DWORD)(Buffer.Timeout.QuadPart / -10000); + *lpReadTimeout = (DWORD)(Buffer.ReadTimeout.QuadPart / -10000); } return(TRUE); @@ -161,7 +161,7 @@ SetMailslotInfo(HANDLE hMailslot, IO_STATUS_BLOCK Iosb; NTSTATUS Status; - Buffer.Timeout.QuadPart = lReadTimeout * -10000; + Buffer.ReadTimeout.QuadPart = lReadTimeout * -10000; Status = NtSetInformationFile(hMailslot, &Iosb, diff --git a/reactos/lib/kernel32/file/move.c b/reactos/lib/kernel32/file/move.c index 1d6bbf87928..5ea15b6f777 100644 --- a/reactos/lib/kernel32/file/move.c +++ b/reactos/lib/kernel32/file/move.c @@ -1,4 +1,4 @@ -/* $Id: move.c,v 1.13 2004/01/23 21:16:03 ekohl Exp $ +/* $Id: move.c,v 1.14 2004/06/13 20:04:55 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -22,138 +22,6 @@ /* FUNCTIONS ****************************************************************/ -/* - * @implemented - */ -BOOL -STDCALL -MoveFileA ( - LPCSTR lpExistingFileName, - LPCSTR lpNewFileName - ) -{ - return MoveFileExA (lpExistingFileName, - lpNewFileName, - MOVEFILE_COPY_ALLOWED); -} - - -/* - * @implemented - */ -BOOL -STDCALL -MoveFileExA ( - LPCSTR lpExistingFileName, - LPCSTR lpNewFileName, - DWORD dwFlags - ) -{ - return MoveFileWithProgressA (lpExistingFileName, - lpNewFileName, - NULL, - NULL, - dwFlags); -} - - -/* - * @implemented - */ -BOOL -STDCALL -MoveFileWithProgressA ( - LPCSTR lpExistingFileName, - LPCSTR lpNewFileName, - LPPROGRESS_ROUTINE lpProgressRoutine, - LPVOID lpData, - DWORD dwFlags - ) -{ - UNICODE_STRING ExistingFileNameU; - UNICODE_STRING NewFileNameU; - ANSI_STRING ExistingFileName; - ANSI_STRING NewFileName; - BOOL Result; - - RtlInitAnsiString (&ExistingFileName, - (LPSTR)lpExistingFileName); - - RtlInitAnsiString (&NewFileName, - (LPSTR)lpNewFileName); - - /* convert ansi (or oem) string to unicode */ - if (bIsFileApiAnsi) - { - RtlAnsiStringToUnicodeString (&ExistingFileNameU, - &ExistingFileName, - TRUE); - RtlAnsiStringToUnicodeString (&NewFileNameU, - &NewFileName, - TRUE); - } - else - { - RtlOemStringToUnicodeString (&ExistingFileNameU, - &ExistingFileName, - TRUE); - RtlOemStringToUnicodeString (&NewFileNameU, - &NewFileName, - TRUE); - } - - Result = MoveFileWithProgressW (ExistingFileNameU.Buffer, - NewFileNameU.Buffer, - lpProgressRoutine, - lpData, - dwFlags); - - RtlFreeHeap (RtlGetProcessHeap (), - 0, - ExistingFileNameU.Buffer); - RtlFreeHeap (RtlGetProcessHeap (), - 0, - NewFileNameU.Buffer); - - return Result; -} - - -/* - * @implemented - */ -BOOL -STDCALL -MoveFileW ( - LPCWSTR lpExistingFileName, - LPCWSTR lpNewFileName - ) -{ - return MoveFileExW (lpExistingFileName, - lpNewFileName, - MOVEFILE_COPY_ALLOWED); -} - - -/* - * @implemented - */ -BOOL -STDCALL -MoveFileExW ( - LPCWSTR lpExistingFileName, - LPCWSTR lpNewFileName, - DWORD dwFlags - ) -{ - return MoveFileWithProgressW (lpExistingFileName, - lpNewFileName, - NULL, - NULL, - dwFlags); -} - - static BOOL AdjustFileAttributes ( LPCWSTR ExistingFileName, @@ -312,10 +180,9 @@ MoveFileWithProgressW ( FileRename = (FILE_RENAME_INFORMATION *)Buffer; if ((dwFlags & MOVEFILE_REPLACE_EXISTING) == MOVEFILE_REPLACE_EXISTING) - FileRename->Replace = TRUE; + FileRename->ReplaceIfExists = TRUE; else - FileRename->Replace = FALSE; - + FileRename->ReplaceIfExists = FALSE; FileRename->FileNameLength = wcslen (lpNewFileName); memcpy (FileRename->FileName, lpNewFileName, @@ -346,7 +213,7 @@ MoveFileWithProgressW ( lpProgressRoutine, lpData, NULL, - FileRename->Replace ? 0 : COPY_FILE_FAIL_IF_EXISTS) && + FileRename->ReplaceIfExists ? 0 : COPY_FILE_FAIL_IF_EXISTS) && AdjustFileAttributes(lpExistingFileName, lpNewFileName) && DeleteFileW (lpExistingFileName); if (! Result) @@ -379,4 +246,136 @@ MoveFileWithProgressW ( return Result; } + +/* + * @implemented + */ +BOOL +STDCALL +MoveFileWithProgressA ( + LPCSTR lpExistingFileName, + LPCSTR lpNewFileName, + LPPROGRESS_ROUTINE lpProgressRoutine, + LPVOID lpData, + DWORD dwFlags + ) +{ + UNICODE_STRING ExistingFileNameU; + UNICODE_STRING NewFileNameU; + ANSI_STRING ExistingFileName; + ANSI_STRING NewFileName; + BOOL Result; + + RtlInitAnsiString (&ExistingFileName, + (LPSTR)lpExistingFileName); + + RtlInitAnsiString (&NewFileName, + (LPSTR)lpNewFileName); + + /* convert ansi (or oem) string to unicode */ + if (bIsFileApiAnsi) + { + RtlAnsiStringToUnicodeString (&ExistingFileNameU, + &ExistingFileName, + TRUE); + RtlAnsiStringToUnicodeString (&NewFileNameU, + &NewFileName, + TRUE); + } + else + { + RtlOemStringToUnicodeString (&ExistingFileNameU, + &ExistingFileName, + TRUE); + RtlOemStringToUnicodeString (&NewFileNameU, + &NewFileName, + TRUE); + } + + Result = MoveFileWithProgressW (ExistingFileNameU.Buffer, + NewFileNameU.Buffer, + lpProgressRoutine, + lpData, + dwFlags); + + RtlFreeHeap (RtlGetProcessHeap (), + 0, + ExistingFileNameU.Buffer); + RtlFreeHeap (RtlGetProcessHeap (), + 0, + NewFileNameU.Buffer); + + return Result; +} + + +/* + * @implemented + */ +BOOL +STDCALL +MoveFileW ( + LPCWSTR lpExistingFileName, + LPCWSTR lpNewFileName + ) +{ + return MoveFileExW (lpExistingFileName, + lpNewFileName, + MOVEFILE_COPY_ALLOWED); +} + + +/* + * @implemented + */ +BOOL +STDCALL +MoveFileExW ( + LPCWSTR lpExistingFileName, + LPCWSTR lpNewFileName, + DWORD dwFlags + ) +{ + return MoveFileWithProgressW (lpExistingFileName, + lpNewFileName, + NULL, + NULL, + dwFlags); +} + + +/* + * @implemented + */ +BOOL +STDCALL +MoveFileA ( + LPCSTR lpExistingFileName, + LPCSTR lpNewFileName + ) +{ + return MoveFileExA (lpExistingFileName, + lpNewFileName, + MOVEFILE_COPY_ALLOWED); +} + + +/* + * @implemented + */ +BOOL +STDCALL +MoveFileExA ( + LPCSTR lpExistingFileName, + LPCSTR lpNewFileName, + DWORD dwFlags + ) +{ + return MoveFileWithProgressA (lpExistingFileName, + lpNewFileName, + NULL, + NULL, + dwFlags); +} + /* EOF */ diff --git a/reactos/lib/kernel32/include/kernel32.h b/reactos/lib/kernel32/include/kernel32.h index 41ecdfcb3ce..b3815f221e6 100755 --- a/reactos/lib/kernel32/include/kernel32.h +++ b/reactos/lib/kernel32/include/kernel32.h @@ -44,6 +44,8 @@ extern CRITICAL_SECTION DllLock; BOOL STDCALL IsConsoleHandle(HANDLE Handle); +BOOL STDCALL VerifyConsoleIoHandle(HANDLE Handle); + BOOL STDCALL CloseConsoleHandle(HANDLE Handle); HANDLE STDCALL OpenConsoleW (LPWSTR wsName, diff --git a/reactos/lib/kernel32/k32.h b/reactos/lib/kernel32/k32.h index 816c8c70f85..8f4b2d433cd 100755 --- a/reactos/lib/kernel32/k32.h +++ b/reactos/lib/kernel32/k32.h @@ -1,3 +1,5 @@ +#define _WIN32_WINNT 0x0501 +#define __USE_W32API #define NTOS_MODE_USER #include <ntos.h> #include <stdarg.h> @@ -24,5 +26,7 @@ #include <reactos/buildno.h> #include <rosrtl/thread.h> #include <rosrtl/string.h> +#include <ntos/ldrtypes.h> +#include <ddk/ldrfuncs.h> #include "include/kernel32.h" diff --git a/reactos/lib/kernel32/mem/global.c b/reactos/lib/kernel32/mem/global.c index b28cf100133..0cf2bc38d9f 100644 --- a/reactos/lib/kernel32/mem/global.c +++ b/reactos/lib/kernel32/mem/global.c @@ -1,4 +1,4 @@ -/* $Id: global.c,v 1.24 2004/05/31 16:54:04 jimtabor Exp $ +/* $Id: global.c,v 1.25 2004/06/13 20:04:55 navaraf Exp $ * * Win32 Global/Local heap functions (GlobalXXX, LocalXXX). * These functions included in Win32 for compatibility with 16 bit Windows @@ -144,7 +144,7 @@ GlobalAlloc(UINT uFlags, /* * @implemented */ -UINT STDCALL +SIZE_T STDCALL GlobalCompact(DWORD dwMinFree) { return RtlCompactHeap(hProcessHeap, 0); diff --git a/reactos/lib/kernel32/mem/heap.c b/reactos/lib/kernel32/mem/heap.c index 9a0ed7462c7..037d4348d98 100644 --- a/reactos/lib/kernel32/mem/heap.c +++ b/reactos/lib/kernel32/mem/heap.c @@ -1,4 +1,4 @@ -/* $Id: heap.c,v 1.26 2004/01/23 21:16:03 ekohl Exp $ +/* $Id: heap.c,v 1.27 2004/06/13 20:04:55 navaraf Exp $ * * kernel/heap.c * Copyright (C) 1996, Onno Hovers, All rights reserved @@ -110,7 +110,7 @@ BOOL WINAPI HeapUnlock(HANDLE hheap) /* * @implemented */ -UINT WINAPI HeapCompact(HANDLE hheap, DWORD flags) +SIZE_T WINAPI HeapCompact(HANDLE hheap, DWORD flags) { return RtlCompactHeap(hheap, flags); } diff --git a/reactos/lib/kernel32/mem/local.c b/reactos/lib/kernel32/mem/local.c index ae3f076841c..bc999652ab5 100644 --- a/reactos/lib/kernel32/mem/local.c +++ b/reactos/lib/kernel32/mem/local.c @@ -1,4 +1,4 @@ -/* $Id: local.c,v 1.10 2004/01/23 21:16:03 ekohl Exp $ +/* $Id: local.c,v 1.11 2004/06/13 20:04:55 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * Copyright (C) 1996, Onno Hovers, All rights reserved @@ -34,7 +34,7 @@ */ HLOCAL STDCALL LocalAlloc(UINT uFlags, - UINT uBytes) + SIZE_T uBytes) { return (HLOCAL)GlobalAlloc(uFlags, uBytes); } @@ -43,7 +43,7 @@ LocalAlloc(UINT uFlags, /* * @implemented */ -UINT STDCALL +SIZE_T STDCALL LocalCompact(UINT uMinFree) { return RtlCompactHeap(hProcessHeap, 0); @@ -95,7 +95,7 @@ LocalLock(HLOCAL hMem) */ HLOCAL STDCALL LocalReAlloc(HLOCAL hMem, - UINT uBytes, + SIZE_T uBytes, UINT uFlags) { return (HLOCAL)GlobalReAlloc((HGLOBAL)hMem, uBytes, uFlags); @@ -105,7 +105,7 @@ LocalReAlloc(HLOCAL hMem, /* * @implemented */ -UINT STDCALL +SIZE_T STDCALL LocalShrink(HLOCAL hMem, UINT cbNewSize) { return RtlCompactHeap(hProcessHeap, 0); diff --git a/reactos/lib/kernel32/mem/procmem.c b/reactos/lib/kernel32/mem/procmem.c index eebc645e285..e7581e5f396 100644 --- a/reactos/lib/kernel32/mem/procmem.c +++ b/reactos/lib/kernel32/mem/procmem.c @@ -1,4 +1,4 @@ -/* $Id: procmem.c,v 1.7 2004/01/23 17:13:36 ekohl Exp $ +/* $Id: procmem.c,v 1.8 2004/06/13 20:04:55 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -48,16 +48,16 @@ ReadProcessMemory ( BOOL STDCALL WriteProcessMemory ( - HANDLE hProcess, - LPVOID lpBaseAddress, - LPVOID lpBuffer, - DWORD nSize, - LPDWORD lpNumberOfBytesWritten + HANDLE hProcess, + LPVOID lpBaseAddress, + LPCVOID lpBuffer, + SIZE_T nSize, + SIZE_T *lpNumberOfBytesWritten ) { NTSTATUS Status; - Status = NtWriteVirtualMemory( hProcess, lpBaseAddress,lpBuffer, nSize, + Status = NtWriteVirtualMemory( hProcess, lpBaseAddress, (LPVOID)lpBuffer, nSize, (PULONG)lpNumberOfBytesWritten ); diff --git a/reactos/lib/kernel32/misc/console.c b/reactos/lib/kernel32/misc/console.c index a4f53f5194c..37871325f45 100644 --- a/reactos/lib/kernel32/misc/console.c +++ b/reactos/lib/kernel32/misc/console.c @@ -1,4 +1,4 @@ -/* $Id: console.c,v 1.75 2004/05/28 13:17:32 weiden Exp $ +/* $Id: console.c,v 1.76 2004/06/13 20:04:56 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -1016,7 +1016,7 @@ GetStdHandle(DWORD nStdHandle) /* * @implemented */ -WINBASEAPI BOOL WINAPI +BOOL WINAPI SetStdHandle(DWORD nStdHandle, HANDLE hHandle) /* @@ -1234,7 +1234,7 @@ BOOL STDCALL AllocConsole(VOID) if(NtCurrentPeb()->ProcessParameters->hConsole) { DPRINT("AllocConsole: Allocate duplicate console to the same Process\n"); - SetLastErrorByStatus (STATUS_OBJECT_EXISTS); + SetLastErrorByStatus (STATUS_OBJECT_NAME_EXISTS); return FALSE; } @@ -1403,7 +1403,6 @@ FillConsoleOutputCharacterW( * * @implemented */ -WINBASEAPI BOOL WINAPI PeekConsoleInputA( @@ -1474,7 +1473,6 @@ PeekConsoleInputA( * * @unimplemented */ -WINBASEAPI BOOL WINAPI PeekConsoleInputW( @@ -1494,7 +1492,7 @@ PeekConsoleInputW( * * @implemented */ -WINBASEAPI BOOL WINAPI +BOOL WINAPI ReadConsoleInputA(HANDLE hConsoleInput, PINPUT_RECORD lpBuffer, DWORD nLength, @@ -1572,7 +1570,6 @@ ReadConsoleInputA(HANDLE hConsoleInput, * * @unimplemented */ -WINBASEAPI BOOL WINAPI ReadConsoleInputW( @@ -1592,7 +1589,6 @@ ReadConsoleInputW( * * @implemented */ -WINBASEAPI BOOL WINAPI WriteConsoleInputA( @@ -1659,7 +1655,6 @@ WriteConsoleInputA( * * @unimplemented */ -WINBASEAPI BOOL WINAPI WriteConsoleInputW( @@ -1679,7 +1674,6 @@ WriteConsoleInputW( * * @implemented */ -WINBASEAPI BOOL WINAPI ReadConsoleOutputA( @@ -1754,7 +1748,6 @@ ReadConsoleOutputA( * * @unimplemented */ -WINBASEAPI BOOL WINAPI ReadConsoleOutputW( @@ -1774,7 +1767,7 @@ ReadConsoleOutputW( * * @implemented */ -WINBASEAPI BOOL WINAPI +BOOL WINAPI WriteConsoleOutputA(HANDLE hConsoleOutput, CONST CHAR_INFO *lpBuffer, COORD dwBufferSize, @@ -1839,7 +1832,6 @@ WriteConsoleOutputA(HANDLE hConsoleOutput, * * @unimplemented */ -WINBASEAPI BOOL WINAPI WriteConsoleOutputW( @@ -1860,7 +1852,6 @@ WriteConsoleOutputW( * * @implemented */ -WINBASEAPI BOOL WINAPI ReadConsoleOutputCharacterA( @@ -1929,7 +1920,6 @@ ReadConsoleOutputCharacterA( * * @unimplemented */ -WINBASEAPI BOOL WINAPI ReadConsoleOutputCharacterW( @@ -1950,7 +1940,6 @@ ReadConsoleOutputCharacterW( * * @implemented */ -WINBASEAPI BOOL WINAPI ReadConsoleOutputAttribute( @@ -2021,7 +2010,7 @@ ReadConsoleOutputAttribute( * * @implemented */ -WINBASEAPI BOOL WINAPI +BOOL WINAPI WriteConsoleOutputCharacterA(HANDLE hConsoleOutput, LPCSTR lpCharacter, DWORD nLength, @@ -2075,7 +2064,7 @@ WriteConsoleOutputCharacterA(HANDLE hConsoleOutput, * * @implemented */ -WINBASEAPI BOOL WINAPI +BOOL WINAPI WriteConsoleOutputCharacterW(HANDLE hConsoleOutput, LPCWSTR lpCharacter, DWORD nLength, @@ -2138,7 +2127,6 @@ WriteConsoleOutputCharacterW(HANDLE hConsoleOutput, * * @implemented */ -WINBASEAPI BOOL WINAPI WriteConsoleOutputAttribute( @@ -2196,7 +2184,6 @@ WriteConsoleOutputAttribute( * * @implemented */ -WINBASEAPI BOOL WINAPI FillConsoleOutputAttribute( @@ -2233,7 +2220,6 @@ FillConsoleOutputAttribute( * * @implemented */ -WINBASEAPI BOOL WINAPI GetConsoleMode( @@ -2263,7 +2249,6 @@ GetConsoleMode( * * @implemented */ -WINBASEAPI BOOL WINAPI GetNumberOfConsoleInputEvents( @@ -2301,7 +2286,6 @@ GetNumberOfConsoleInputEvents( * * @unimplemented */ -WINBASEAPI COORD WINAPI GetLargestConsoleWindowSize( @@ -2322,7 +2306,6 @@ GetLargestConsoleWindowSize( * * @implemented */ -WINBASEAPI BOOL WINAPI GetConsoleCursorInfo( @@ -2353,7 +2336,6 @@ GetConsoleCursorInfo( * * @unimplemented */ -WINBASEAPI BOOL WINAPI GetNumberOfConsoleMouseButtons( @@ -2370,7 +2352,6 @@ GetNumberOfConsoleMouseButtons( * * @implemented */ -WINBASEAPI BOOL WINAPI SetConsoleMode( @@ -2400,7 +2381,6 @@ SetConsoleMode( * * @implemented */ -WINBASEAPI BOOL WINAPI SetConsoleActiveScreenBuffer( @@ -2428,7 +2408,6 @@ SetConsoleActiveScreenBuffer( * * @implemented */ -WINBASEAPI BOOL WINAPI FlushConsoleInputBuffer( @@ -2456,7 +2435,6 @@ FlushConsoleInputBuffer( * * @unimplemented */ -WINBASEAPI BOOL WINAPI SetConsoleScreenBufferSize( @@ -2473,7 +2451,6 @@ SetConsoleScreenBufferSize( * * @implemented */ -WINBASEAPI BOOL WINAPI SetConsoleCursorInfo( @@ -2504,7 +2481,6 @@ SetConsoleCursorInfo( * * @implemented */ -WINBASEAPI BOOL WINAPI ScrollConsoleScreenBufferA( @@ -2551,7 +2527,6 @@ ScrollConsoleScreenBufferA( * * @unimplemented */ -WINBASEAPI BOOL WINAPI ScrollConsoleScreenBufferW( @@ -2572,7 +2547,6 @@ ScrollConsoleScreenBufferW( * * @unimplemented */ -WINBASEAPI BOOL WINAPI SetConsoleWindowInfo( @@ -2591,7 +2565,6 @@ SetConsoleWindowInfo( * * @implemented */ -WINBASEAPI BOOL WINAPI SetConsoleTextAttribute( @@ -2679,7 +2652,7 @@ RemoveConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine) /* * @implemented */ -WINBASEAPI BOOL WINAPI +BOOL WINAPI SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine, BOOL Add) { @@ -2704,7 +2677,7 @@ SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine, * * @unimplemented */ -WINBASEAPI BOOL WINAPI +BOOL WINAPI GenerateConsoleCtrlEvent( DWORD dwCtrlEvent, DWORD dwProcessGroupId @@ -2720,7 +2693,6 @@ GenerateConsoleCtrlEvent( * * @implemented */ -WINBASEAPI DWORD WINAPI GetConsoleTitleW( @@ -2783,7 +2755,6 @@ GetConsoleTitleW( * * @implemented */ -WINBASEAPI DWORD WINAPI GetConsoleTitleA( @@ -2823,7 +2794,6 @@ GetConsoleTitleA( * * @implemented */ -WINBASEAPI BOOL WINAPI SetConsoleTitleW( @@ -2884,7 +2854,6 @@ SetConsoleTitleW( * * @implemented */ -WINBASEAPI BOOL WINAPI SetConsoleTitleA( @@ -2943,7 +2912,6 @@ SetConsoleTitleA( * * @unimplemented */ -WINBASEAPI BOOL WINAPI ReadConsoleW( @@ -2964,7 +2932,6 @@ ReadConsoleW( * * @unimplemented */ -WINBASEAPI BOOL WINAPI WriteConsoleW( @@ -3030,7 +2997,6 @@ WriteConsoleW( * * @implemented */ -WINBASEAPI HANDLE WINAPI CreateConsoleScreenBuffer( @@ -3062,7 +3028,6 @@ CreateConsoleScreenBuffer( * * @unimplemented */ -WINBASEAPI UINT WINAPI GetConsoleCP( VOID ) @@ -3077,7 +3042,6 @@ GetConsoleCP( VOID ) * * @unimplemented */ -WINBASEAPI BOOL WINAPI SetConsoleCP( @@ -3094,7 +3058,6 @@ SetConsoleCP( * * @unimplemented */ -WINBASEAPI UINT WINAPI GetConsoleOutputCP( VOID ) @@ -3109,7 +3072,6 @@ GetConsoleOutputCP( VOID ) * * @unimplemented */ -WINBASEAPI BOOL WINAPI SetConsoleOutputCP( diff --git a/reactos/lib/kernel32/misc/errormsg.c b/reactos/lib/kernel32/misc/errormsg.c index 43a7adf3b11..4bf8ce4fc5b 100644 --- a/reactos/lib/kernel32/misc/errormsg.c +++ b/reactos/lib/kernel32/misc/errormsg.c @@ -1,4 +1,4 @@ -/* $Id: errormsg.c,v 1.16 2004/01/23 21:16:03 ekohl Exp $ +/* $Id: errormsg.c,v 1.17 2004/06/13 20:04:56 navaraf Exp $ * * reactos/lib/kernel32/misc/errormsg.c * @@ -45,35 +45,6 @@ inline static LPSTR HEAP_strdupWtoA( HANDLE heap, DWORD flags, LPCWSTR str ) return ret; } -/* INTERNAL */ - - -typedef struct tagMESSAGE_RESOURCE_ENTRY { - WORD Length; - WORD Flags; - BYTE Text[1]; -} MESSAGE_RESOURCE_ENTRY,*PMESSAGE_RESOURCE_ENTRY; -#define MESSAGE_RESOURCE_UNICODE 0x0001 - -typedef struct tagMESSAGE_RESOURCE_BLOCK { - DWORD LowId; - DWORD HighId; - DWORD OffsetToEntries; -} MESSAGE_RESOURCE_BLOCK,*PMESSAGE_RESOURCE_BLOCK; - -typedef struct tagMESSAGE_RESOURCE_DATA { - DWORD NumberOfBlocks; - MESSAGE_RESOURCE_BLOCK Blocks[ 1 ]; -} MESSAGE_RESOURCE_DATA,*PMESSAGE_RESOURCE_DATA; - - -//#define RT_RCDATAA MAKEINTRESOURCEA(10) -//#define RT_RCDATAW MAKEINTRESOURCEW(10) -////#define RT_RCDATA WINELIB_NAME_AW(RT_RCDATA) -//#define RT_MESSAGETABLEA MAKEINTRESOURCEA(11) -//#define RT_MESSAGETABLEW MAKEINTRESOURCEW(11) -////#define RT_MESSAGETABLE WINELIB_NAME_AW(RT_MESSAGETABLE) - /* Messages...used by FormatMessage32* (KERNEL32.something) * * They can be specified either directly or using a message ID and @@ -112,7 +83,7 @@ static INT load_messageA( HMODULE instance, UINT id, WORD lang, //TRACE("instance = %08lx, id = %08lx, buffer = %p, length = %ld\n", (DWORD)instance, (DWORD)id, buffer, (DWORD)buflen); /*FIXME: I am not sure about the '1' ... But I've only seen those entries*/ - hrsrc = FindResourceExW(instance,RT_MESSAGETABLEW,(LPWSTR)1,lang); + hrsrc = FindResourceExW(instance,(LPWSTR)RT_MESSAGETABLE,(LPWSTR)1,lang); if (!hrsrc) return 0; hmem = LoadResource( instance, hrsrc ); if (!hmem) return 0; diff --git a/reactos/lib/kernel32/misc/lang.c b/reactos/lib/kernel32/misc/lang.c index 56f82c64a7b..a72031093db 100644 --- a/reactos/lib/kernel32/misc/lang.c +++ b/reactos/lib/kernel32/misc/lang.c @@ -1,4 +1,4 @@ -/* $Id: lang.c,v 1.18 2004/05/03 17:12:27 weiden Exp $ +/* $Id: lang.c,v 1.19 2004/06/13 20:04:56 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT : ReactOS user mode libraries @@ -20,8 +20,6 @@ #define LOCALE_RETURN_NUMBER 0x20000000 #define LOCALE_USE_CP_ACP 0x40000000 #define LOCALE_LOCALEINFOFLAGSMASK (LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP|LOCALE_RETURN_NUMBER) -#define LOCALE_NEUTRAL (MAKELCID(MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL),SORT_DEFAULT)) -#define LOCALE_FONTSIGNATURE 0x00000058 static LCID SystemLocale = MAKELCID(LANG_ENGLISH, SORT_DEFAULT); @@ -674,7 +672,7 @@ HKEY RosCreateRegistryKey(void) { OBJECT_ATTRIBUTES objAttr; UNICODE_STRING nameW; - HKEY hKey; + HANDLE hKey; if (RtlOpenCurrentUser( KEY_ALL_ACCESS, &hKey ) != STATUS_SUCCESS) return 0; @@ -796,7 +794,7 @@ GetLocaleInfoW ( liLangID = MAKELANGID(PRIMARYLANGID(liLangID), SUBLANG_DEFAULT); hModule = GetModuleHandleW( L"kernel32.dll" ); - if (!(hRsrc = FindResourceExW( hModule, RT_STRINGW, (LPCWSTR)((LCType >> 4) + 1), liLangID ))) + if (!(hRsrc = FindResourceExW( hModule, (LPWSTR)RT_STRING, (LPCWSTR)((LCType >> 4) + 1), liLangID ))) { SetLastError( ERROR_INVALID_FLAGS ); return 0; diff --git a/reactos/lib/kernel32/misc/ldr.c b/reactos/lib/kernel32/misc/ldr.c index 0e78b060823..7ae5282964f 100644 --- a/reactos/lib/kernel32/misc/ldr.c +++ b/reactos/lib/kernel32/misc/ldr.c @@ -1,4 +1,4 @@ -/* $Id: ldr.c,v 1.20 2004/05/03 14:34:44 weiden Exp $ +/* $Id: ldr.c,v 1.21 2004/06/13 20:04:56 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT : ReactOS user mode libraries @@ -12,6 +12,12 @@ #define NDEBUG #include "../include/debug.h" +typedef struct tagLOADPARMS32 { + LPSTR lpEnvAddress; + LPSTR lpCmdLine; + LPSTR lpCmdShow; + DWORD dwReserved; +} LOADPARMS32; /* FUNCTIONS ****************************************************************/ @@ -202,7 +208,8 @@ FreeLibraryAndExitThread ( { if ( FreeLibrary(hLibModule) ) ExitThread(dwExitCode); - return; + for (;;) + ; } diff --git a/reactos/lib/kernel32/misc/profile.c b/reactos/lib/kernel32/misc/profile.c index ac2c679421b..8e5a8c0f22a 100644 --- a/reactos/lib/kernel32/misc/profile.c +++ b/reactos/lib/kernel32/misc/profile.c @@ -1,4 +1,4 @@ -/* $Id: profile.c,v 1.11 2004/01/31 23:52:42 gvg Exp $ +/* $Id: profile.c,v 1.12 2004/06/13 20:04:56 navaraf Exp $ * * Imported from Wine * Copyright 1993 Miguel de Icaza @@ -1384,13 +1384,13 @@ GetPrivateProfileStringA( /* * @unimplemented */ -DWORD STDCALL +BOOL STDCALL GetPrivateProfileStructW ( - DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2, - DWORD Unknown3, - DWORD Unknown4 + IN LPCWSTR Section, + IN LPCWSTR Key, + OUT LPVOID Struct, + IN UINT StructSize, + IN LPCWSTR File ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); @@ -1401,13 +1401,13 @@ GetPrivateProfileStructW ( /* * @unimplemented */ -DWORD STDCALL +BOOL STDCALL GetPrivateProfileStructA ( - DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2, - DWORD Unknown3, - DWORD Unknown4 + IN LPCSTR Section, + IN LPCSTR Key, + OUT LPVOID Struct, + IN UINT StructSize, + IN LPCSTR File ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); @@ -1672,11 +1672,11 @@ WritePrivateProfileStringW(LPCWSTR AppName, */ BOOL STDCALL WritePrivateProfileStructA ( - DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2, - DWORD Unknown3, - DWORD Unknown4 + IN LPCSTR Section, + IN LPCSTR Key, + IN LPVOID Struct, + IN UINT StructSize, + IN LPCSTR File ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); @@ -1689,11 +1689,11 @@ WritePrivateProfileStructA ( */ BOOL STDCALL WritePrivateProfileStructW ( - DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2, - DWORD Unknown3, - DWORD Unknown4 + IN LPCWSTR Section, + IN LPCWSTR Key, + IN LPVOID Struct, + IN UINT StructSize, + IN LPCWSTR File ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); diff --git a/reactos/lib/kernel32/misc/res.c b/reactos/lib/kernel32/misc/res.c index 850f999b5e2..b18f1e5e558 100644 --- a/reactos/lib/kernel32/misc/res.c +++ b/reactos/lib/kernel32/misc/res.c @@ -1,4 +1,4 @@ -/* $Id: res.c,v 1.20 2004/01/23 21:16:03 ekohl Exp $ +/* $Id: res.c,v 1.21 2004/06/13 20:04:56 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT : ReactOS user mode libraries @@ -149,7 +149,7 @@ FindResourceExW ( return NULL; } - return ResourceDataEntry; + return (HRSRC)ResourceDataEntry; } @@ -165,13 +165,14 @@ LoadResource ( { NTSTATUS Status; PVOID Data; + PIMAGE_RESOURCE_DATA_ENTRY ResInfo = (PIMAGE_RESOURCE_DATA_ENTRY)hResInfo; - if (hModule == NULL) - { - hModule = (HINSTANCE)GetModuleHandleW(NULL); - } + if (hModule == NULL) + { + hModule = (HINSTANCE)GetModuleHandleW(NULL); + } - Status = LdrAccessResource (hModule, hResInfo, &Data, NULL); + Status = LdrAccessResource (hModule, ResInfo, &Data, NULL); if (!NT_SUCCESS(Status)) { SetLastErrorByStatus (Status); diff --git a/reactos/lib/kernel32/misc/stubs.c b/reactos/lib/kernel32/misc/stubs.c index 680234da5b6..ffb5e290bab 100644 --- a/reactos/lib/kernel32/misc/stubs.c +++ b/reactos/lib/kernel32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.76 2004/05/13 20:42:28 navaraf Exp $ +/* $Id: stubs.c,v 1.77 2004/06/13 20:04:56 navaraf Exp $ * * KERNEL32.DLL stubs (unimplemented functions) * Remove from this file, if you implement them. @@ -305,7 +305,7 @@ GetStringTypeA ( BOOL STDCALL GetSystemPowerStatus ( - DWORD Unknown0 + LPSYSTEM_POWER_STATUS PowerStatus ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); @@ -1632,7 +1632,7 @@ FindActCtxSectionStringW( HANDLE STDCALL FindFirstVolumeW( - LPWSTR lpszVolumeName, + LPCWSTR lpszVolumeName, DWORD cchBufferLength ) { @@ -1646,7 +1646,7 @@ FindFirstVolumeW( HANDLE STDCALL FindFirstVolumeMountPointW( - LPCWSTR lpszRootPathName, + LPWSTR lpszRootPathName, LPWSTR lpszVolumeMountPoint, DWORD cchBufferLength ) @@ -1992,7 +1992,7 @@ FindActCtxSectionStringA( HANDLE STDCALL FindFirstVolumeA( - LPSTR lpszVolumeName, + LPCSTR lpszVolumeName, DWORD cchBufferLength ) { @@ -2006,7 +2006,7 @@ FindFirstVolumeA( HANDLE STDCALL FindFirstVolumeMountPointA( - LPCSTR lpszRootPathName, + LPSTR lpszRootPathName, LPSTR lpszVolumeMountPoint, DWORD cchBufferLength ) @@ -2022,7 +2022,7 @@ BOOL STDCALL FindNextVolumeA( HANDLE hFindVolume, - LPSTR lpszVolumeName, + LPCSTR lpszVolumeName, DWORD cchBufferLength ) { @@ -2385,7 +2385,11 @@ VOID STDCALL UTUnRegister( HMODULE hModule ) /* * @unimplemented */ +#if 0 FARPROC STDCALL DelayLoadFailureHook(unsigned int dliNotify, PDelayLoadInfo pdli) +#else +FARPROC STDCALL DelayLoadFailureHook(unsigned int dliNotify, PVOID pdli) +#endif { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; diff --git a/reactos/lib/kernel32/misc/sysinfo.c b/reactos/lib/kernel32/misc/sysinfo.c index 14a7611aaa4..bc0bb7dd5ed 100644 --- a/reactos/lib/kernel32/misc/sysinfo.c +++ b/reactos/lib/kernel32/misc/sysinfo.c @@ -1,4 +1,4 @@ -/* $Id: sysinfo.c,v 1.12 2004/05/31 11:41:14 ekohl Exp $ +/* $Id: sysinfo.c,v 1.13 2004/06/13 20:04:56 navaraf Exp $ * * reactos/lib/kernel32/misc/sysinfo.c * @@ -55,9 +55,9 @@ GetSystemInfo ( * PROCESSOR_ARCHITECTURE_PPC 3 * PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF */ - Si->u.s.wProcessorArchitecture = Spi.ProcessorArchitecture; + Si->wProcessorArchitecture = Spi.ProcessorArchitecture; /* For future use: always zero */ - Si->u.s.wReserved = 0; + Si->wReserved = 0; Si->dwPageSize = Sbi.PhysicalPageSize; Si->lpMinimumApplicationAddress = (PVOID)Sbi.LowestUserAddress; Si->lpMaximumApplicationAddress = (PVOID)Sbi.HighestUserAddress; diff --git a/reactos/lib/kernel32/misc/time.c b/reactos/lib/kernel32/misc/time.c index 51d24b51bbd..dab0a396dcd 100644 --- a/reactos/lib/kernel32/misc/time.c +++ b/reactos/lib/kernel32/misc/time.c @@ -1,4 +1,4 @@ -/* $Id: time.c,v 1.26 2004/01/23 21:16:03 ekohl Exp $ +/* $Id: time.c,v 1.27 2004/06/13 20:04:56 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -366,16 +366,6 @@ SetTimeZoneInformation(CONST TIME_ZONE_INFORMATION *lpTimeZoneInformation) } -/* - * @implemented - */ -DWORD STDCALL -GetCurrentTime(VOID) -{ - return GetTickCount(); -} - - /* * @implemented */ diff --git a/reactos/lib/kernel32/synch/intrlck.c b/reactos/lib/kernel32/synch/intrlck.c index ebc6d3a98ef..086a60f199e 100644 --- a/reactos/lib/kernel32/synch/intrlck.c +++ b/reactos/lib/kernel32/synch/intrlck.c @@ -123,14 +123,14 @@ InterlockedExchange(LPLONG target, LONG value ) * * @implemented */ -PVOID +LONG STDCALL InterlockedCompareExchange( - PVOID *Destination, - PVOID Exchange, - PVOID Comperand ) + PLONG Destination, + LONG Exchange, + LONG Comperand ) { - PVOID ret; + LONG ret; __asm__ ( /* lock for SMP systems */ "lock\n\t" "cmpxchgl %2,(%1)" @@ -138,7 +138,6 @@ InterlockedCompareExchange( :"r" (Destination),"r" (Exchange), "0" (Comperand) :"memory" ); return ret; - } /************************************************************************ diff --git a/reactos/lib/kernel32/synch/timer.c b/reactos/lib/kernel32/synch/timer.c index 486d967e6bd..9c261f4a6f1 100644 --- a/reactos/lib/kernel32/synch/timer.c +++ b/reactos/lib/kernel32/synch/timer.c @@ -1,4 +1,4 @@ -/* $Id: timer.c,v 1.15 2004/01/23 21:16:04 ekohl Exp $ +/* $Id: timer.c,v 1.16 2004/06/13 20:04:56 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -23,7 +23,7 @@ HANDLE STDCALL CreateWaitableTimerW(LPSECURITY_ATTRIBUTES lpTimerAttributes, BOOL bManualReset, - LPWSTR lpTimerName) + LPCWSTR lpTimerName) { NTSTATUS Status; HANDLE TimerHandle; diff --git a/reactos/lib/kernel32/thread/fiber.c b/reactos/lib/kernel32/thread/fiber.c index 5d10b43fd82..00d22281d9c 100644 --- a/reactos/lib/kernel32/thread/fiber.c +++ b/reactos/lib/kernel32/thread/fiber.c @@ -1,4 +1,4 @@ -/* $Id: fiber.c,v 1.10 2004/03/07 20:07:05 hyperion Exp $ +/* $Id: fiber.c,v 1.11 2004/06/13 20:04:56 navaraf Exp $ * * FILE: lib/kernel32/thread/fiber.c * @@ -68,15 +68,6 @@ BOOL WINAPI ConvertFiberToThread(void) } -/* - * @implemented - */ -LPVOID WINAPI ConvertThreadToFiber(LPVOID lpParameter) -{ - return ConvertThreadToFiberEx(lpParameter, 0); -} - - /* * @implemented */ @@ -116,6 +107,15 @@ LPVOID WINAPI ConvertThreadToFiberEx(LPVOID lpParameter, DWORD dwFlags) } +/* + * @implemented + */ +LPVOID WINAPI ConvertThreadToFiber(LPVOID lpParameter) +{ + return ConvertThreadToFiberEx(lpParameter, 0); +} + + /* * @implemented */ diff --git a/reactos/lib/kernel32/thread/thread.c b/reactos/lib/kernel32/thread/thread.c index 9a69976ab99..7f4723aab77 100644 --- a/reactos/lib/kernel32/thread/thread.c +++ b/reactos/lib/kernel32/thread/thread.c @@ -1,4 +1,4 @@ -/* $Id: thread.c,v 1.49 2004/01/23 21:16:04 ekohl Exp $ +/* $Id: thread.c,v 1.50 2004/06/13 20:04:56 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -640,26 +640,23 @@ GetThreadSelectorEntry(IN HANDLE hThread, /* * @implemented */ -BOOL STDCALL +DWORD STDCALL SetThreadIdealProcessor(HANDLE hThread, DWORD dwIdealProcessor) { - ULONG IdealProcessor; NTSTATUS Status; - IdealProcessor = (ULONG)dwIdealProcessor; - Status = NtSetInformationThread(hThread, ThreadIdealProcessor, - &IdealProcessor, + &dwIdealProcessor, sizeof(ULONG)); if (!NT_SUCCESS(Status)) { SetLastErrorByStatus(Status); - return(FALSE); + return -1; } - return(TRUE); + return dwIdealProcessor; } /* EOF */ diff --git a/reactos/w32api/include/ddk/ntddk.h b/reactos/w32api/include/ddk/ntddk.h index 480ff0ccfac..b6e0d22131e 100644 --- a/reactos/w32api/include/ddk/ntddk.h +++ b/reactos/w32api/include/ddk/ntddk.h @@ -35,8 +35,6 @@ extern "C" { #endif -#pragma pack(push,4) - #include <stdarg.h> #include <windef.h> #include <ntdef.h> @@ -81,8 +79,6 @@ typedef CONST char *PCSZ; /* Definitions only in Windows NT 4 */ #include "winnt4.h" -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/winddk.h b/reactos/w32api/include/ddk/winddk.h index 7309a3e526b..eea2a4cb637 100644 --- a/reactos/w32api/include/ddk/winddk.h +++ b/reactos/w32api/include/ddk/winddk.h @@ -31,8 +31,6 @@ extern "C" { #endif -#pragma pack(push,4) - /* ** Definitions specific to this Device Driver Kit */ @@ -1094,6 +1092,7 @@ typedef struct _EISA_MEMORY_TYPE { UCHAR MoreEntries : 1; } EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE; +#include <pshpack1.h> typedef struct _EISA_MEMORY_CONFIGURATION { EISA_MEMORY_TYPE ConfigurationByte; UCHAR DataSize; @@ -1101,6 +1100,7 @@ typedef struct _EISA_MEMORY_CONFIGURATION { UCHAR AddressHighByte; USHORT MemorySize; } EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION; +#include <poppack.h> typedef struct _EISA_IRQ_DESCRIPTOR { UCHAR Interrupt : 4; @@ -1134,6 +1134,7 @@ typedef struct _EISA_DMA_CONFIGURATION { DMA_CONFIGURATION_BYTE1 ConfigurationByte1; } EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION; +#include <pshpack1.h> typedef struct _EISA_PORT_DESCRIPTOR { UCHAR NumberPorts : 5; UCHAR Reserved : 1; @@ -1145,6 +1146,7 @@ typedef struct _EISA_PORT_CONFIGURATION { EISA_PORT_DESCRIPTOR Configuration; USHORT PortAddress; } EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION; +#include <poppack.h> typedef struct _CM_EISA_FUNCTION_INFORMATION { ULONG CompressedId; @@ -1243,6 +1245,7 @@ typedef struct _PNP_BUS_INFORMATION { ULONG BusNumber; } PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION; +#include <pshpack1.h> typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR { UCHAR Type; UCHAR ShareDisposition; @@ -1373,6 +1376,7 @@ typedef struct _CM_INT13_DRIVE_PARAMETER { USHORT MaxHeads; USHORT NumberDrives; } CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER; +#include <poppack.h> typedef struct _CM_KEYBOARD_DEVICE_DATA { USHORT Version; @@ -1966,7 +1970,7 @@ typedef struct _FILE_NAME_INFORMATION { WCHAR FileName[1]; } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION; -typedef struct FILE_BASIC_INFORMATION { +typedef struct _FILE_BASIC_INFORMATION { LARGE_INTEGER CreationTime; LARGE_INTEGER LastAccessTime; LARGE_INTEGER LastWriteTime; @@ -2442,6 +2446,7 @@ typedef struct _SECURITY_SUBJECT_CONTEXT { PVOID ProcessAuditId; } SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT; +#include <pshpack4.h> typedef struct _ACCESS_STATE { LUID OperationID; BOOLEAN SecurityEvaluated; @@ -2464,6 +2469,7 @@ typedef struct _ACCESS_STATE { UNICODE_STRING ObjectName; UNICODE_STRING ObjectTypeName; } ACCESS_STATE, *PACCESS_STATE; +#include <poppack.h> typedef struct _IO_SECURITY_CONTEXT { PSECURITY_QUALITY_OF_SERVICE SecurityQos; @@ -2522,6 +2528,7 @@ typedef struct _IO_CSQ { PVOID ReservePointer; } IO_CSQ, *PIO_CSQ; +#include <pshpack4.h> typedef struct _IO_STACK_LOCATION { UCHAR MajorFunction; UCHAR MinorFunction; @@ -2662,6 +2669,7 @@ typedef struct _IO_STACK_LOCATION { PIO_COMPLETION_ROUTINE CompletionRoutine; PVOID Context; } IO_STACK_LOCATION, *PIO_STACK_LOCATION; +#include <poppack.h> /* IO_STACK_LOCATION.Control */ @@ -3720,31 +3728,31 @@ typedef struct _KPCR_TIB { DWORD Version; /* 10 */ } DUMMYUNIONNAME; PVOID ArbitraryUserPointer; /* 14 */ -} KPCR_TIB, *PKPCR_TIB; /* 18 */ + struct _NT_TIB *Self; /* 18 */ +} KPCR_TIB, *PKPCR_TIB; /* 1C */ #define PCR_MINOR_VERSION 1 #define PCR_MAJOR_VERSION 1 typedef struct _KPCR { KPCR_TIB Tib; /* 00 */ - struct _KPCR *Self; /* 18 */ - struct _KPRCB *PCRCB; /* 1C */ - KIRQL Irql; /* 20 */ - ULONG IRR; /* 24 */ - ULONG IrrActive; /* 28 */ - ULONG IDR; /* 2C */ - PVOID KdVersionBlock; /* 30 */ - PUSHORT IDT; /* 34 */ - PUSHORT GDT; /* 38 */ - struct _KTSS *TSS; /* 3C */ - USHORT MajorVersion; /* 40 */ - USHORT MinorVersion; /* 42 */ - KAFFINITY SetMember; /* 44 */ - ULONG StallScaleFactor; /* 48 */ - UCHAR DebugActive; /* 4C */ - UCHAR ProcessorNumber; /* 4D */ - UCHAR Reserved[2]; /* 4E */ -} KPCR, *PKPCR; /* 50 */ + struct _KPCR *Self; /* 1C */ + struct _KPRCB *PCRCB; /* 20 */ + KIRQL Irql; /* 24 */ + ULONG IRR; /* 28 */ + ULONG IrrActive; /* 2C */ + ULONG IDR; /* 30 */ + PVOID KdVersionBlock; /* 34 */ + PUSHORT IDT; /* 38 */ + PUSHORT GDT; /* 3C */ + struct _KTSS *TSS; /* 40 */ + USHORT MajorVersion; /* 44 */ + USHORT MinorVersion; /* 46 */ + KAFFINITY SetMember; /* 48 */ + ULONG StallScaleFactor; /* 4C */ + UCHAR SpareUnused; /* 50 */ + UCHAR Number; /* 51 */ +} KPCR, *PKPCR; /* 54 */ typedef struct _KFLOATING_SAVE { ULONG ControlWord; @@ -9098,7 +9106,6 @@ VOID DDKAPI KeRosDumpStackFrames ( PULONG Frame, ULONG FrameCount ); - #ifdef DBG #define KdPrint(_x_) DbgPrint _x_ @@ -9120,8 +9127,6 @@ extern NTOSAPI PBOOLEAN KdDebuggerEnabled; #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ntdef.h b/reactos/w32api/include/ntdef.h index 83f4fa35643..4bb4be64f3e 100644 --- a/reactos/w32api/include/ntdef.h +++ b/reactos/w32api/include/ntdef.h @@ -24,6 +24,8 @@ #define NT_SUCCESS(x) ((x)>=0) #define STATUS_SUCCESS ((NTSTATUS)0) #endif +#define NT_WARNING(x) ((ULONG)(x)>>30==2) +#define NT_ERROR(x) ((ULONG)(x)>>30==3) #if !defined(_NTSECAPI_H) && !defined(_SUBAUTH_H) typedef LONG NTSTATUS, *PNTSTATUS; typedef struct _UNICODE_STRING { diff --git a/reactos/w32api/include/winbase.h b/reactos/w32api/include/winbase.h index 4cfadbf0c3d..60aeeb8e8fb 100644 --- a/reactos/w32api/include/winbase.h +++ b/reactos/w32api/include/winbase.h @@ -204,6 +204,7 @@ extern "C" { #define STILL_ACTIVE 0x103 #define FIND_FIRST_EX_CASE_SENSITIVE 1 #define SCS_32BIT_BINARY 0 +#define SCS_64BIT_BINARY 6 #define SCS_DOS_BINARY 1 #define SCS_OS216_BINARY 5 #define SCS_PIF_BINARY 3 @@ -532,6 +533,10 @@ extern "C" { #define REPLACEFILE_WRITE_THROUGH 0x00000001 #define REPLACEFILE_IGNORE_MERGE_ERRORS 0x00000002 #endif /* (_WIN32_WINNT >= 0x0500) */ +#if (_WIN32_WINNT >= 0x0400) +#define FIBER_FLAG_FLOAT_SWITCH 0x1 +#endif +#define FLS_OUT_OF_INDEXES 0xFFFFFFFF #ifndef RC_INVOKED typedef struct _FILETIME { @@ -1011,12 +1016,20 @@ typedef enum _COMPUTER_NAME_FORMAT { ComputerNameMax } COMPUTER_NAME_FORMAT; #endif /* (_WIN32_WINNT >= 0x0500) */ - +typedef struct _JOB_SET_ARRAY { + HANDLE JobHandle; + DWORD MemberLevel; + DWORD Flags; +} JOB_SET_ARRAY, *PJOB_SET_ARRAY; typedef DWORD(WINAPI *LPPROGRESS_ROUTINE)(LARGE_INTEGER,LARGE_INTEGER,LARGE_INTEGER,LARGE_INTEGER,DWORD,DWORD,HANDLE,HANDLE,LPVOID); typedef void(WINAPI *LPFIBER_START_ROUTINE)(PVOID); -typedef BOOL(CALLBACK *ENUMRESLANGPROC)(HMODULE,LPCTSTR,LPCTSTR,WORD,LONG); -typedef BOOL(CALLBACK *ENUMRESNAMEPROC)(HMODULE,LPCTSTR,LPTSTR,LONG); -typedef BOOL(CALLBACK *ENUMRESTYPEPROC)(HMODULE,LPTSTR,LONG); +typedef VOID (WINAPI *PFLS_CALLBACK_FUNCTION)(PVOID); +typedef BOOL(CALLBACK *ENUMRESLANGPROCA)(HMODULE,LPCSTR,LPCSTR,WORD,LONG); +typedef BOOL(CALLBACK *ENUMRESLANGPROCW)(HMODULE,LPCWSTR,LPCWSTR,WORD,LONG); +typedef BOOL(CALLBACK *ENUMRESNAMEPROCA)(HMODULE,LPCSTR,LPSTR,LONG); +typedef BOOL(CALLBACK *ENUMRESNAMEPROCW)(HMODULE,LPCWSTR,LPWSTR,LONG); +typedef BOOL(CALLBACK *ENUMRESTYPEPROCA)(HMODULE,LPSTR,LONG); +typedef BOOL(CALLBACK *ENUMRESTYPEPROCW)(HMODULE,LPWSTR,LONG); typedef void(CALLBACK *LPOVERLAPPED_COMPLETION_ROUTINE)(DWORD,DWORD,LPOVERLAPPED); typedef LONG(CALLBACK *PTOP_LEVEL_EXCEPTION_FILTER)(LPEXCEPTION_POINTERS); typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER; @@ -1222,12 +1235,12 @@ BOOL WINAPI EncryptFileW(LPCWSTR); BOOL WINAPI EndUpdateResourceA(HANDLE,BOOL); BOOL WINAPI EndUpdateResourceW(HANDLE,BOOL); void WINAPI EnterCriticalSection(LPCRITICAL_SECTION); -BOOL WINAPI EnumResourceLanguagesA(HMODULE,LPCSTR,LPCSTR,ENUMRESLANGPROC,LONG_PTR); -BOOL WINAPI EnumResourceLanguagesW(HMODULE,LPCWSTR,LPCWSTR,ENUMRESLANGPROC,LONG_PTR); -BOOL WINAPI EnumResourceNamesA(HMODULE,LPCSTR,ENUMRESNAMEPROC,LONG_PTR); -BOOL WINAPI EnumResourceNamesW(HMODULE,LPCWSTR,ENUMRESNAMEPROC,LONG_PTR); -BOOL WINAPI EnumResourceTypesA(HMODULE,ENUMRESTYPEPROC,LONG_PTR); -BOOL WINAPI EnumResourceTypesW(HMODULE,ENUMRESTYPEPROC,LONG_PTR); +BOOL WINAPI EnumResourceLanguagesA(HMODULE,LPCSTR,LPCSTR,ENUMRESLANGPROCA,LONG_PTR); +BOOL WINAPI EnumResourceLanguagesW(HMODULE,LPCWSTR,LPCWSTR,ENUMRESLANGPROCW,LONG_PTR); +BOOL WINAPI EnumResourceNamesA(HMODULE,LPCSTR,ENUMRESNAMEPROCA,LONG_PTR); +BOOL WINAPI EnumResourceNamesW(HMODULE,LPCWSTR,ENUMRESNAMEPROCW,LONG_PTR); +BOOL WINAPI EnumResourceTypesA(HMODULE,ENUMRESTYPEPROCA,LONG_PTR); +BOOL WINAPI EnumResourceTypesW(HMODULE,ENUMRESTYPEPROCW,LONG_PTR); BOOL WINAPI EqualPrefixSid(PSID,PSID); BOOL WINAPI EqualSid(PSID,PSID); DWORD WINAPI EraseTape(HANDLE,DWORD,BOOL); @@ -1288,6 +1301,10 @@ DWORD WINAPI GetFirmwareEnvironmentVariableW(LPCWSTR,LPCWSTR,PVOID,DWORD); BOOL WINAPI FlushFileBuffers(HANDLE); BOOL WINAPI FlushInstructionCache(HANDLE,PCVOID,DWORD); BOOL WINAPI FlushViewOfFile(PCVOID,DWORD); +DWORD WINAPI FlsAlloc(PFLS_CALLBACK_FUNCTION); +PVOID WINAPI FlsGetValue(DWORD); +BOOL WINAPI FlsSetValue(DWORD,PVOID); +BOOL WINAPI FlsFree(DWORD); DWORD WINAPI FormatMessageA(DWORD,PCVOID,DWORD,DWORD,LPSTR,DWORD,va_list*); DWORD WINAPI FormatMessageW(DWORD,PCVOID,DWORD,DWORD,LPWSTR,DWORD,va_list*); BOOL WINAPI FreeEnvironmentStringsA(LPSTR); @@ -1509,7 +1526,7 @@ BOOL WINAPI GetVolumePathNamesForVolumeNameW(LPCWSTR,LPWSTR,DWORD,PDWORD); UINT WINAPI GetWindowsDirectoryA(LPSTR,UINT); UINT WINAPI GetWindowsDirectoryW(LPWSTR,UINT); DWORD WINAPI GetWindowThreadProcessId(HWND,PDWORD); -UINT GetWriteWatch(DWORD,PVOID,SIZE_T,PVOID*,PULONG_PTR,PULONG); +UINT WINAPI GetWriteWatch(DWORD,PVOID,SIZE_T,PVOID*,PULONG_PTR,PULONG); ATOM WINAPI GlobalAddAtomA(LPCSTR); ATOM WINAPI GlobalAddAtomW( LPCWSTR); HGLOBAL WINAPI GlobalAlloc(UINT,DWORD); @@ -1596,7 +1613,7 @@ BOOL WINAPI IsBadStringPtrW(LPCWSTR,UINT); BOOL WINAPI IsBadWritePtr(PVOID,UINT); BOOL WINAPI IsDebuggerPresent(void); #if (_WIN32_WINNT >= 0x0501) -BOOL IsProcessInJob(HANDLE,HANDLE,PBOOL); +BOOL WINAPI IsProcessInJob(HANDLE,HANDLE,PBOOL); #endif BOOL WINAPI IsProcessorFeaturePresent(DWORD); BOOL WINAPI IsSystemResumeAutomatic(void); @@ -1605,7 +1622,7 @@ BOOL WINAPI IsValidAcl(PACL); BOOL WINAPI IsValidSecurityDescriptor(PSECURITY_DESCRIPTOR); BOOL WINAPI IsValidSid(PSID); #if (_WIN32_WINNT >= 0x0501) -BOOL IsWow64Process(HANDLE,PBOOL); +BOOL WINAPI IsWow64Process(HANDLE,PBOOL); #endif void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION); #define LimitEmsPages(n) @@ -1923,6 +1940,9 @@ BOOL WINAPI MapUserPhysicalPagesScatter(PVOID*,ULONG_PTR,PULONG_PTR); typedef STARTUPINFOW STARTUPINFO,*LPSTARTUPINFO; typedef WIN32_FIND_DATAW WIN32_FIND_DATA,*LPWIN32_FIND_DATA; typedef HW_PROFILE_INFOW HW_PROFILE_INFO,*LPHW_PROFILE_INFO; +typedef ENUMRESLANGPROCW ENUMRESLANGPROC; +typedef ENUMRESNAMEPROCW ENUMRESNAMEPROC; +typedef ENUMRESTYPEPROCW ENUMRESTYPEPROC; #if (_WIN32_WINNT >= 0x0501) typedef ACTCTXW ACTCTX,*PACTCTX; typedef PCACTCTXW PCACTCTX; @@ -2123,6 +2143,9 @@ typedef HW_PROFILE_INFOA HW_PROFILE_INFO,*LPHW_PROFILE_INFO; typedef ACTCTXA ACTCTX,*PACTCTX; typedef PCACTCTXA PCACTCTX; #endif +typedef ENUMRESLANGPROCA ENUMRESLANGPROC; +typedef ENUMRESNAMEPROCA ENUMRESNAMEPROC; +typedef ENUMRESTYPEPROCA ENUMRESTYPEPROC; #define AccessCheckAndAuditAlarm AccessCheckAndAuditAlarmA #define AddAtom AddAtomA #define BackupEventLog BackupEventLogA diff --git a/reactos/w32api/include/winnt.h b/reactos/w32api/include/winnt.h index 3f57b173a77..d637e2029cd 100644 --- a/reactos/w32api/include/winnt.h +++ b/reactos/w32api/include/winnt.h @@ -690,7 +690,10 @@ typedef DWORD FLONG; #define PROCESSOR_MIPS_R4000 4000 #define PROCESSOR_ALPHA_21064 21064 #define PROCESSOR_INTEL_IA64 2200 - +#define PROCESSOR_PPC_601 601 +#define PROCESSOR_PPC_603 603 +#define PROCESSOR_PPC_604 604 +#define PROCESSOR_PPC_620 620 #define PROCESSOR_ARCHITECTURE_INTEL 0 #define PROCESSOR_ARCHITECTURE_MIPS 1 #define PROCESSOR_ARCHITECTURE_ALPHA 2 @@ -2160,8 +2163,7 @@ typedef struct _TAPE_GET_MEDIA_PARAMETERS { typedef struct _TAPE_GET_POSITION { ULONG Type; ULONG Partition; - ULONG OffsetLow; - ULONG OffsetHigh; + LARGE_INTEGER Offset; } TAPE_GET_POSITION,*PTAPE_GET_POSITION; typedef struct _TAPE_PREPARE { DWORD Operation; @@ -3280,8 +3282,7 @@ ULONGLONG WINAPI VerSetConditionMask(ULONGLONG,DWORD,BYTE); #if defined(__GNUC__) -PVOID GetCurrentFiber(void); -extern __inline__ PVOID GetCurrentFiber(void) +static __inline__ PVOID GetCurrentFiber(void) { void* ret; __asm__ __volatile__ ( @@ -3291,8 +3292,7 @@ extern __inline__ PVOID GetCurrentFiber(void) return ret; } -PVOID GetFiberData(void); -extern __inline__ PVOID GetFiberData(void) +static __inline__ PVOID GetFiberData(void) { void* ret; __asm__ __volatile__ ( From f773e32aabb017e8110d271a862e3106fbb2de0d Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Mon, 14 Jun 2004 01:40:48 +0000 Subject: [PATCH 1378/1463] rawip: Removed the deallocation of the client-supplied mdl. This does not appear to be part of the definition and is not done in the UDP case. event: I moved the close notify into it's own function so that it can be worked on separately. svn path=/trunk/; revision=9665 --- .../drivers/net/tcpip/transport/rawip/rawip.c | 54 +++++++++---------- .../drivers/net/tcpip/transport/tcp/event.c | 21 +++++++- 2 files changed, 47 insertions(+), 28 deletions(-) diff --git a/reactos/drivers/net/tcpip/transport/rawip/rawip.c b/reactos/drivers/net/tcpip/transport/rawip/rawip.c index d4181cdae0a..cdb75f61f96 100644 --- a/reactos/drivers/net/tcpip/transport/rawip/rawip.c +++ b/reactos/drivers/net/tcpip/transport/rawip/rawip.c @@ -20,7 +20,8 @@ BOOLEAN RawIPInitialized = FALSE; NTSTATUS BuildRawIPPacket( - PVOID Context, + PIP_PACKET Packet, + UINT DataLength, PIP_ADDRESS LocalAddress, USHORT LocalPort ) /* @@ -37,24 +38,19 @@ NTSTATUS BuildRawIPPacket( PVOID Header; NDIS_STATUS NdisStatus; PNDIS_BUFFER HeaderBuffer; - PDATAGRAM_SEND_REQUEST SendRequest = (PDATAGRAM_SEND_REQUEST)Context; - PIP_PACKET Packet = &SendRequest->Packet; + PNDIS_PACKET NdisPacket = Packet->NdisPacket; + /* Will be zeroed in packet by IPInitializePacket */ /* Prepare packet */ - - /* FIXME: Assumes IPv4 */ - if (!Packet) - return STATUS_INSUFFICIENT_RESOURCES; - IPInitializePacket(Packet,IP_ADDRESS_V4); Packet->Flags = IP_PACKET_FLAG_RAW; /* Don't touch IP header */ - Packet->TotalSize = SendRequest->BufferSize; + Packet->TotalSize = DataLength; + Packet->NdisPacket = NdisPacket; if (MaxLLHeaderSize != 0) { Header = ExAllocatePool(NonPagedPool, MaxLLHeaderSize); if (!Header) { TI_DbgPrint(MIN_TRACE, ("Cannot allocate memory for packet headers.\n")); - FreeNdisPacket(Packet->NdisPacket); return STATUS_INSUFFICIENT_RESOURCES; } @@ -63,16 +59,17 @@ NTSTATUS BuildRawIPPacket( /* Allocate NDIS buffer for maximum link level header */ NdisAllocateBuffer(&NdisStatus, - &HeaderBuffer, - GlobalBufferPool, - Header, - MaxLLHeaderSize); + &HeaderBuffer, + GlobalBufferPool, + Header, + MaxLLHeaderSize); + if (NdisStatus != NDIS_STATUS_SUCCESS) { TI_DbgPrint(MIN_TRACE, ("Cannot allocate NDIS buffer for packet headers. NdisStatus = (0x%X)\n", NdisStatus)); ExFreePool(Header); - FreeNdisPacket(Packet->NdisPacket); return STATUS_INSUFFICIENT_RESOURCES; } + /* Chain header at front of packet */ NdisChainBufferAtFront(Packet->NdisPacket, HeaderBuffer); } @@ -104,23 +101,26 @@ NTSTATUS RawIPSendDatagram( UINT BufferLen; PADDRESS_FILE AddrFile = (PADDRESS_FILE)Request->Handle.AddressHandle; - PDATAGRAM_SEND_REQUEST SendRequest; - - SendRequest = ExAllocatePool( NonPagedPool, sizeof(*SendRequest) ); + IP_PACKET Packet; NdisQueryBuffer( Buffer, &BufferData, &BufferLen ); - Status = AllocatePacketWithBuffer( &SendRequest->Packet.NdisPacket, + Status = AllocatePacketWithBuffer( &Packet.NdisPacket, BufferData, BufferLen ); - if( Status != NDIS_STATUS_SUCCESS ) { - BuildRawIPPacket( SendRequest, - (PIP_ADDRESS)&AddrFile->ADE->Address->Address. - IPv4Address, - AddrFile->Port ); - Status = DGSendDatagram(Request, ConnInfo, &SendRequest->Packet); - NdisFreeBuffer( Buffer ); - } + TI_DbgPrint(MID_TRACE,("Packet.NdisPacket %x\n", Packet.NdisPacket)); + + if( Status == NDIS_STATUS_SUCCESS ) + Status = BuildRawIPPacket( &Packet, + BufferLen, + AddrFile->ADE->Address, + AddrFile->Port ); + if( Status == NDIS_STATUS_SUCCESS ) + Status = DGSendDatagram(Request, ConnInfo, &Packet); + else + FreeNdisPacket( Packet.NdisPacket ); + + /* NdisFreeBuffer( Buffer ); */ return Status; } diff --git a/reactos/drivers/net/tcpip/transport/tcp/event.c b/reactos/drivers/net/tcpip/transport/tcp/event.c index 865f01589b4..4f74debad59 100644 --- a/reactos/drivers/net/tcpip/transport/tcp/event.c +++ b/reactos/drivers/net/tcpip/transport/tcp/event.c @@ -101,7 +101,26 @@ void TCPRecvNotify( PCONNECTION_ENDPOINT Connection, UINT Flags ) { } void TCPCloseNotify( PCONNECTION_ENDPOINT Connection ) { - TCPRecvNotify( Connection, 0 ); + 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", From 0999a0ef815aac18bb3ff3a682308ccbf0d0b8f0 Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Mon, 14 Jun 2004 03:22:27 +0000 Subject: [PATCH 1379/1463] Preliminary version of recv. svn path=/trunk/; revision=9666 --- reactos/drivers/net/afd/afd/afd.c | 4 +- reactos/drivers/net/afd/afd/dispatch.c | 19 +++---- reactos/drivers/net/afd/afd/event.c | 76 +++++++++++++++++++++++++- reactos/drivers/net/afd/afd/routines.c | 8 ++- reactos/drivers/net/afd/include/afd.h | 4 +- 5 files changed, 92 insertions(+), 19 deletions(-) diff --git a/reactos/drivers/net/afd/afd/afd.c b/reactos/drivers/net/afd/afd/afd.c index 7b5aba9e639..791646a513b 100644 --- a/reactos/drivers/net/afd/afd/afd.c +++ b/reactos/drivers/net/afd/afd/afd.c @@ -13,8 +13,8 @@ #ifdef DBG /* See debug.h for debug/trace constants */ -DWORD DebugTraceLevel = MID_TRACE; -//DWORD DebugTraceLevel = DEBUG_ULTRA; +//DWORD DebugTraceLevel = MID_TRACE; +DWORD DebugTraceLevel = DEBUG_ULTRA; #endif /* DBG */ diff --git a/reactos/drivers/net/afd/afd/dispatch.c b/reactos/drivers/net/afd/afd/dispatch.c index 20fc516989e..d49c775853e 100644 --- a/reactos/drivers/net/afd/afd/dispatch.c +++ b/reactos/drivers/net/afd/afd/dispatch.c @@ -13,7 +13,8 @@ NTSTATUS AfdpDispRecv( PIRP Irp, PAFDFCB FCB, PFILE_REQUEST_RECVFROM Request, - PFILE_REPLY_RECVFROM Reply) + PFILE_REPLY_RECVFROM Reply, + BOOL Continuous) /* * FUNCTION: Receives data * ARGUMENTS: @@ -64,7 +65,8 @@ NTSTATUS AfdpDispRecv( FCB, Request->Buffers, Request->BufferCount, - &Count); + &Count, + Continuous); /* I.E. Packets are exhausted on short recv if not */ KeReleaseSpinLock(&FCB->ReceiveQueueLock, OldIrql); Reply->NumberOfBytesRecvd = Count; @@ -490,7 +492,8 @@ NTSTATUS AfdDispRecvFrom( Irp, FCB, Request, - Reply); + Reply, + FALSE); } else { Status = STATUS_INVALID_PARAMETER; } @@ -761,7 +764,6 @@ NTSTATUS AfdDispRecv( * Status of operation */ { -#if 0 NTSTATUS Status; UINT InputBufferLength; UINT OutputBufferLength; @@ -786,9 +788,9 @@ NTSTATUS AfdDispRecv( Status = AfdpDispRecv( Irp, FCB, - Request->Buffers, - Request->BufferCount, - &NumberOfBytesRecvd); + (PFILE_REQUEST_RECVFROM)Request, + (PFILE_REPLY_RECVFROM)Reply, + TRUE); Reply->NumberOfBytesRecvd = NumberOfBytesRecvd; Reply->Status = NO_ERROR; } else { @@ -798,9 +800,6 @@ NTSTATUS AfdDispRecv( AFD_DbgPrint(MAX_TRACE, ("Status (0x%X).\n", Status)); return Status; -#else - return STATUS_SUCCESS; -#endif } diff --git a/reactos/drivers/net/afd/afd/event.c b/reactos/drivers/net/afd/afd/event.c index 216c86f261f..951752fac64 100644 --- a/reactos/drivers/net/afd/afd/event.c +++ b/reactos/drivers/net/afd/afd/event.c @@ -44,9 +44,77 @@ NTSTATUS AfdEventReceive( IN PVOID Tsdu, OUT PIRP *IoRequestPacket) { - AFD_DbgPrint(MAX_TRACE, ("Called.\n")); + PAFDFCB FCB = (PAFDFCB)TdiEventContext; + PAFD_READ_REQUEST ReadRequest; + PVOID ReceiveBuffer; + PAFD_BUFFER Buffer; + PLIST_ENTRY Entry; + NTSTATUS Status; + KIRQL OldIrql; + ULONG Count; - return STATUS_SUCCESS; + AFD_DbgPrint(MAX_TRACE, ("Called.\n")); + + AFD_DbgPrint(MID_TRACE, ("Receiving (%d) bytes on socket\n", + BytesAvailable)); + + ReceiveBuffer = ExAllocatePool(NonPagedPool, BytesAvailable); + if (!ReceiveBuffer) + return STATUS_INSUFFICIENT_RESOURCES; + + /*Buffer = (PAFD_BUFFER)ExAllocateFromNPagedLookasideList( + &BufferLookasideList);*/ + Buffer = (PAFD_BUFFER)ExAllocatePool(NonPagedPool, sizeof(AFD_BUFFER)); + if (!Buffer) { + ExFreePool(ReceiveBuffer); + return STATUS_INSUFFICIENT_RESOURCES; + } + + /* Copy the data to a local buffer */ + RtlCopyMemory(ReceiveBuffer, Tsdu, BytesAvailable); + + Buffer->Buffer.len = BytesAvailable; + Buffer->Buffer.buf = ReceiveBuffer; + Buffer->Offset = 0; + + ExInterlockedInsertTailList( + &FCB->ReceiveQueue, + &Buffer->ListEntry, + &FCB->ReceiveQueueLock); + + KeAcquireSpinLock(&FCB->ReadRequestQueueLock, &OldIrql); + + while (!IsListEmpty(&FCB->ReadRequestQueue) && + !IsListEmpty(&FCB->ReceiveQueue)) { + AFD_DbgPrint(MAX_TRACE, ("Satisfying read request.\n")); + + Entry = RemoveHeadList(&FCB->ReceiveQueue); + ReadRequest = CONTAINING_RECORD(Entry, AFD_READ_REQUEST, ListEntry); + + Status = FillWSABuffers( + FCB, + ReadRequest->RecvFromRequest->Buffers, + ReadRequest->RecvFromRequest->BufferCount, + &Count, + TRUE ); /* Continuous */ + ReadRequest->RecvFromReply->NumberOfBytesRecvd = Count; + ReadRequest->RecvFromReply->Status = NO_ERROR; + + ReadRequest->Irp->IoStatus.Information = 0; + ReadRequest->Irp->IoStatus.Status = Status; + + AFD_DbgPrint(MAX_TRACE, ("Completing IRP at (0x%X).\n", ReadRequest->Irp)); + + IoCompleteRequest(ReadRequest->Irp, IO_NETWORK_INCREMENT); + } + + KeReleaseSpinLock(&FCB->ReadRequestQueueLock, OldIrql); + + *BytesTaken = BytesAvailable; + + AFD_DbgPrint(MAX_TRACE, ("Leaving.\n")); + + return STATUS_SUCCESS; } @@ -125,6 +193,7 @@ NTSTATUS AfdEventReceiveDatagramHandler( Buffer->Buffer.len = BytesAvailable; Buffer->Buffer.buf = ReceiveBuffer; + Buffer->Offset = 0; ExInterlockedInsertTailList( &FCB->ReceiveQueue, @@ -143,7 +212,8 @@ NTSTATUS AfdEventReceiveDatagramHandler( FCB, ReadRequest->RecvFromRequest->Buffers, ReadRequest->RecvFromRequest->BufferCount, - &Count); + &Count, + FALSE ); /* Packet oriented */ ReadRequest->RecvFromReply->NumberOfBytesRecvd = Count; ReadRequest->RecvFromReply->Status = NO_ERROR; diff --git a/reactos/drivers/net/afd/afd/routines.c b/reactos/drivers/net/afd/afd/routines.c index 211ca5be16e..1853fb1b06e 100644 --- a/reactos/drivers/net/afd/afd/routines.c +++ b/reactos/drivers/net/afd/afd/routines.c @@ -91,7 +91,8 @@ NTSTATUS FillWSABuffers( PAFDFCB FCB, LPWSABUF Buffers, DWORD BufferCount, - PULONG BytesCopied) + PULONG BytesCopied, + BOOL Continuous) { PUCHAR DstData, SrcData; UINT DstSize, SrcSize; @@ -108,8 +109,8 @@ NTSTATUS FillWSABuffers( Entry = RemoveHeadList(&FCB->ReceiveQueue); SrcBuffer = CONTAINING_RECORD(Entry, AFD_BUFFER, ListEntry); - SrcData = SrcBuffer->Buffer.buf; - SrcSize = SrcBuffer->Buffer.len; + SrcData = SrcBuffer->Buffer.buf + SrcBuffer->Offset; + SrcSize = SrcBuffer->Buffer.len - SrcBuffer->Offset; DstData = Buffers->buf; DstSize = Buffers->len; @@ -169,6 +170,7 @@ NTSTATUS FillWSABuffers( ExFreePool(SrcBuffer); } + SrcBuffer->Offset += Total; *BytesCopied = Total; return STATUS_SUCCESS; diff --git a/reactos/drivers/net/afd/include/afd.h b/reactos/drivers/net/afd/include/afd.h index f556ec076c1..5cdd2752481 100644 --- a/reactos/drivers/net/afd/include/afd.h +++ b/reactos/drivers/net/afd/include/afd.h @@ -87,6 +87,7 @@ typedef struct _AFDFCB { typedef struct _AFD_BUFFER { LIST_ENTRY ListEntry; WSABUF Buffer; + UINT Offset; } AFD_BUFFER, *PAFD_BUFFER; typedef struct _AFD_READ_REQUEST { @@ -324,7 +325,8 @@ NTSTATUS FillWSABuffers( PAFDFCB FCB, LPWSABUF Buffers, DWORD BufferCount, - PULONG BytesCopied); + PULONG BytesCopied, + BOOL Continuous); VOID BuildIPv4Header( PIPv4_HEADER IPHeader, From 4cb0e04a46ee27b942d73dec4127dc1bca398654 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Mon, 14 Jun 2004 20:05:00 +0000 Subject: [PATCH 1380/1463] - Packing fixes svn path=/trunk/; revision=9667 --- reactos/w32api/include/ddk/atm.h | 5 +---- reactos/w32api/include/ddk/batclass.h | 4 ---- reactos/w32api/include/ddk/cfg.h | 4 ---- reactos/w32api/include/ddk/cfgmgr32.h | 6 +++--- reactos/w32api/include/ddk/d4drvif.h | 4 ---- reactos/w32api/include/ddk/d4iface.h | 4 ---- reactos/w32api/include/ddk/ddkmapi.h | 4 ---- reactos/w32api/include/ddk/hidclass.h | 26 ++++++++++++++------------ reactos/w32api/include/ddk/hidpi.h | 4 ---- reactos/w32api/include/ddk/mcd.h | 4 ---- reactos/w32api/include/ddk/miniport.h | 5 ----- reactos/w32api/include/ddk/mountdev.h | 5 ----- reactos/w32api/include/ddk/mountmgr.h | 5 ----- reactos/w32api/include/ddk/ndis.h | 10 +++------- reactos/w32api/include/ddk/ndistapi.h | 4 ---- reactos/w32api/include/ddk/ndiswan.h | 4 ---- reactos/w32api/include/ddk/netpnp.h | 4 ---- reactos/w32api/include/ddk/newdev.h | 4 ---- reactos/w32api/include/ddk/ntapi.h | 4 ++-- reactos/w32api/include/ddk/ntdd8042.h | 5 ----- reactos/w32api/include/ddk/ntddbeep.h | 5 ----- reactos/w32api/include/ddk/ntddcdrm.h | 5 ----- reactos/w32api/include/ddk/ntddcdvd.h | 9 ++++----- reactos/w32api/include/ddk/ntddchgr.h | 5 ----- reactos/w32api/include/ddk/ntdddisk.h | 9 ++++----- reactos/w32api/include/ddk/ntddkbd.h | 5 ----- reactos/w32api/include/ddk/ntddmou.h | 5 ----- reactos/w32api/include/ddk/ntddpar.h | 5 ----- reactos/w32api/include/ddk/ntddpcm.h | 5 ----- reactos/w32api/include/ddk/ntddscsi.h | 5 ----- reactos/w32api/include/ddk/ntddser.h | 5 ----- reactos/w32api/include/ddk/ntddstor.h | 5 ----- reactos/w32api/include/ddk/ntddtape.h | 5 ----- reactos/w32api/include/ddk/ntddtdi.h | 5 ----- reactos/w32api/include/ddk/ntddvdeo.h | 4 ---- reactos/w32api/include/ddk/ntddvol.h | 5 ----- reactos/w32api/include/ddk/ntpoapi.h | 5 ----- reactos/w32api/include/ddk/parallel.h | 5 ----- reactos/w32api/include/ddk/pfhook.h | 5 ----- reactos/w32api/include/ddk/poclass.h | 5 ----- reactos/w32api/include/ddk/scsi.h | 4 ---- reactos/w32api/include/ddk/scsiscan.h | 5 ----- reactos/w32api/include/ddk/smbus.h | 4 ---- reactos/w32api/include/ddk/srb.h | 4 ---- reactos/w32api/include/ddk/storport.h | 4 ---- reactos/w32api/include/ddk/tdiinfo.h | 5 ----- reactos/w32api/include/ddk/tdikrnl.h | 4 ---- reactos/w32api/include/ddk/tvout.h | 5 ----- reactos/w32api/include/ddk/upssvc.h | 4 ---- reactos/w32api/include/ddk/usb.h | 4 ---- reactos/w32api/include/ddk/usb100.h | 14 +++++++++----- reactos/w32api/include/ddk/usbdi.h | 5 ----- reactos/w32api/include/ddk/usbioctl.h | 6 +++--- reactos/w32api/include/ddk/usbiodef.h | 5 ----- reactos/w32api/include/ddk/usbscan.h | 5 ----- reactos/w32api/include/ddk/usbuser.h | 5 ++--- reactos/w32api/include/ddk/video.h | 1 - reactos/w32api/include/ddk/videoagp.h | 4 ---- reactos/w32api/include/ddk/winddi.h | 6 ++---- reactos/w32api/include/ddk/winnt4.h | 4 ---- reactos/w32api/include/ddk/ws2san.h | 4 ---- 61 files changed, 47 insertions(+), 277 deletions(-) diff --git a/reactos/w32api/include/ddk/atm.h b/reactos/w32api/include/ddk/atm.h index bf95bd98ad5..d3022938517 100644 --- a/reactos/w32api/include/ddk/atm.h +++ b/reactos/w32api/include/ddk/atm.h @@ -31,8 +31,6 @@ extern "C" { #endif -#pragma pack(push,4) - typedef ULONG ATM_ADDRESSTYPE; #define SAP_TYPE_NSAP 1 @@ -431,6 +429,7 @@ typedef struct _ATM_TRAFFIC_DESCRIPTOR { typedef struct _ATM_TRAFFIC_DESCRIPTOR_IE { ATM_TRAFFIC_DESCRIPTOR ForwardTD; ATM_TRAFFIC_DESCRIPTOR BackwardTD; + BOOLEAN BestEffort; } ATM_TRAFFIC_DESCRIPTOR_IE, *PATM_TRAFFIC_DESCRIPTOR_IE; /* ATM_TRANSIT_NETWORK_SELECTION_IE.TypeOfNetworkId constants */ @@ -501,8 +500,6 @@ typedef struct _ATM_SERVICE_ADDRESS_LIST { ATM_ADDRESS Address[1]; } ATM_SERVICE_ADDRESS_LIST, *PATM_SERVICE_ADDRESS_LIST; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/batclass.h b/reactos/w32api/include/ddk/batclass.h index 1beef49113f..6644727057e 100644 --- a/reactos/w32api/include/ddk/batclass.h +++ b/reactos/w32api/include/ddk/batclass.h @@ -31,8 +31,6 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #if defined(_BATTERYCLASS_) @@ -293,8 +291,6 @@ DDKAPI BatteryClassUnload( IN PVOID ClassData); -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/cfg.h b/reactos/w32api/include/ddk/cfg.h index c2250247584..107bd4aae85 100644 --- a/reactos/w32api/include/ddk/cfg.h +++ b/reactos/w32api/include/ddk/cfg.h @@ -31,8 +31,6 @@ extern "C" { #endif -#pragma pack(push,4) - #define CM_PROB_NOT_CONFIGURED 0x00000001 #define CM_PROB_DEVLOADER_FAILED 0x00000002 #define CM_PROB_OUT_OF_MEMORY 0x00000003 @@ -134,8 +132,6 @@ typedef enum _PNP_VETO_TYPE { PNP_VetoLegacyDriver } PNP_VETO_TYPE, *PPNP_VETO_TYPE; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/cfgmgr32.h b/reactos/w32api/include/ddk/cfgmgr32.h index a048bb4922f..5249a22fc3e 100644 --- a/reactos/w32api/include/ddk/cfgmgr32.h +++ b/reactos/w32api/include/ddk/cfgmgr32.h @@ -31,8 +31,6 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #if defined(_CFGMGR32_) @@ -43,6 +41,8 @@ extern "C" { #include "cfg.h" +#include <pshpack1.h> + #define CR_SUCCESS 0x00000000 #define CR_DEFAULT 0x00000001 #define CR_OUT_OF_MEMORY 0x00000002 @@ -1524,7 +1524,7 @@ WINAPI CMP_WaitNoPendingInstallEvents( IN DWORD dwTimeout); -#pragma pack(pop) +#include <poppack.h> #ifdef __cplusplus } diff --git a/reactos/w32api/include/ddk/d4drvif.h b/reactos/w32api/include/ddk/d4drvif.h index fff128694bf..c10e781705a 100644 --- a/reactos/w32api/include/ddk/d4drvif.h +++ b/reactos/w32api/include/ddk/d4drvif.h @@ -31,8 +31,6 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #include "d4iface.h" @@ -99,8 +97,6 @@ typedef struct _DOT4_DRIVER_CMD { ULONG ulTimeout; } DOT4_DRIVER_CMD, *PDOT4_DRIVER_CMD; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/d4iface.h b/reactos/w32api/include/ddk/d4iface.h index 3cd511656b1..245bc4c82b9 100644 --- a/reactos/w32api/include/ddk/d4iface.h +++ b/reactos/w32api/include/ddk/d4iface.h @@ -31,8 +31,6 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #define DOT4_MAX_CHANNELS 128 @@ -79,8 +77,6 @@ typedef struct _DOT4_WMI_XFER_INFO { ULONG ulPacketBytesRead; } DOT4_WMI_XFER_INFO, *PDOT4_WMI_XFER_INFO; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/ddkmapi.h b/reactos/w32api/include/ddk/ddkmapi.h index feeff87639b..e5d4fee1530 100644 --- a/reactos/w32api/include/ddk/ddkmapi.h +++ b/reactos/w32api/include/ddk/ddkmapi.h @@ -31,8 +31,6 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #if defined(_DXAPI_) @@ -329,8 +327,6 @@ typedef struct _DDSETSKIPFIELD { DWORD dwStartField; } DDSETSKIPFIELD, FAR *LPDDSETSKIPFIELD; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/hidclass.h b/reactos/w32api/include/ddk/hidclass.h index 8717fc5ef29..8d52e45b135 100644 --- a/reactos/w32api/include/ddk/hidclass.h +++ b/reactos/w32api/include/ddk/hidclass.h @@ -31,8 +31,6 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #include "hidpi.h" @@ -112,25 +110,31 @@ typedef struct _HID_DRIVER_CONFIG { } HID_DRIVER_CONFIG, *PHID_DRIVER_CONFIG; typedef struct _HID_INTERFACE_HIDPARSE { -#if 0 -/* FIXME: COM stuff */ #ifdef __cplusplus INTERFACE i; #else - INTERFACE; -#endif + /* GCC doesn't support including unnamed structs, so INTERFACE is + expanded here */ + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; #endif PHIDP_GETCAPS HidpGetCaps; } HID_INTERFACE_HIDPARSE, *PHID_INTERFACE_HIDPARSE; typedef struct _HID_INTERFACE_NOTIFY_PNP { -#if 0 -/* FIXME: COM stuff */ #ifdef __cplusplus INTERFACE i; #else - INTERFACE; -#endif + /* GCC doesn't support including unnamed structs, so INTERFACE is + expanded here */ + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; #endif PHID_STATUS_CHANGE StatusChangeFn; PVOID CallbackContext; @@ -142,8 +146,6 @@ typedef struct _HID_XFER_PACKET { UCHAR reportId; } HID_XFER_PACKET, *PHID_XFER_PACKET; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/hidpi.h b/reactos/w32api/include/ddk/hidpi.h index 2f8ea573236..d6021782f20 100644 --- a/reactos/w32api/include/ddk/hidpi.h +++ b/reactos/w32api/include/ddk/hidpi.h @@ -31,8 +31,6 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #include "hidusage.h" @@ -599,8 +597,6 @@ HidP_UsageListDifference( OUT PUSAGE MakeUsageList, IN ULONG UsageListLength); -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/mcd.h b/reactos/w32api/include/ddk/mcd.h index c5e2380cf4e..4a0e7db7623 100644 --- a/reactos/w32api/include/ddk/mcd.h +++ b/reactos/w32api/include/ddk/mcd.h @@ -31,8 +31,6 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #include "srb.h" #include "scsi.h" @@ -138,8 +136,6 @@ ChangerClassInitialize( IN PUNICODE_STRING RegistryPath, IN PMCD_INIT_DATA MCDInitData); -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/miniport.h b/reactos/w32api/include/ddk/miniport.h index 01bbd23a600..7a56cd1aba0 100644 --- a/reactos/w32api/include/ddk/miniport.h +++ b/reactos/w32api/include/ddk/miniport.h @@ -31,11 +31,8 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" - #define EMULATOR_READ_ACCESS 0x01 #define EMULATOR_WRITE_ACCESS 0x02 @@ -73,8 +70,6 @@ typedef VOID DDKAPI IN ULONG WriteBank, IN PVOID Context); -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/mountdev.h b/reactos/w32api/include/ddk/mountdev.h index d22d9be7ef0..1bfed03f3e1 100644 --- a/reactos/w32api/include/ddk/mountdev.h +++ b/reactos/w32api/include/ddk/mountdev.h @@ -31,12 +31,9 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #include "mountmgr.h" - #define IOCTL_MOUNTDEV_QUERY_DEVICE_NAME \ CTL_CODE(MOUNTDEVCONTROLTYPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS) @@ -75,8 +72,6 @@ typedef struct _MOUNTDEV_UNIQUE_ID_CHANGE_NOTIFY_OUTPUT { USHORT NewUniqueIdLength; } MOUNTDEV_UNIQUE_ID_CHANGE_NOTIFY_OUTPUT; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/mountmgr.h b/reactos/w32api/include/ddk/mountmgr.h index ec5241c141a..6a56db868e9 100644 --- a/reactos/w32api/include/ddk/mountmgr.h +++ b/reactos/w32api/include/ddk/mountmgr.h @@ -31,11 +31,8 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" - DEFINE_GUID(MOUNTDEV_MOUNTED_DEVICE_GUID, 0x53f5630d, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); @@ -135,8 +132,6 @@ typedef struct _MOUNTMGR_VOLUME_MOUNT_POINT { USHORT TargetVolumeNameLength; } MOUNTMGR_VOLUME_MOUNT_POINT, *PMOUNTMGR_VOLUME_MOUNT_POINT; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/ndis.h b/reactos/w32api/include/ddk/ndis.h index 68fc9644f78..8ab5d5c9891 100644 --- a/reactos/w32api/include/ddk/ndis.h +++ b/reactos/w32api/include/ddk/ndis.h @@ -37,8 +37,6 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #include "ntddndis.h" #include "netpnp.h" @@ -537,6 +535,7 @@ typedef struct _NDIS_DMA_BLOCK { PVOID MapRegisterBase; KEVENT AllocationEvent; PADAPTER_OBJECT SystemAdapterObject; + PVOID Miniport; BOOLEAN InProgress; } NDIS_DMA_BLOCK, *PNDIS_DMA_BLOCK; @@ -703,10 +702,9 @@ typedef struct _CO_FLOW_PARAMETERS { ULONG PeakBandwidth; ULONG Latency; ULONG DelayVariation; - GUARANTEE LevelOfGuarantee; - ULONG CostOfCall; - ULONG NetworkAvailability; + SERVICETYPE ServiceType; ULONG MaxSduSize; + ULONG MinimumPolicedSize; } CO_FLOW_PARAMETERS, *PCO_FLOW_PARAMETERS; typedef struct _CO_SPECIFIC_PARAMETERS { @@ -5220,8 +5218,6 @@ typedef struct _NDIS_MAC_CHARACTERISTICS { typedef NDIS_MAC_CHARACTERISTICS NDIS_WAN_MAC_CHARACTERISTICS; typedef NDIS_WAN_MAC_CHARACTERISTICS *PNDIS_WAN_MAC_CHARACTERISTICS; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/ndistapi.h b/reactos/w32api/include/ddk/ndistapi.h index 774f42af9f2..97bd442bd8c 100644 --- a/reactos/w32api/include/ddk/ndistapi.h +++ b/reactos/w32api/include/ddk/ndistapi.h @@ -31,8 +31,6 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ndis.h" #ifndef NDIS_TAPI_CURRENT_VERSION @@ -1303,8 +1301,6 @@ typedef struct _CO_AF_TAPI_MAKE_CALL_PARAMETERS { IN NDIS_VAR_DATA_DESC LineCallParams; } CO_AF_TAPI_MAKE_CALL_PARAMETERS, *PCO_AF_TAPI_MAKE_CALL_PARAMETERS; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/ndiswan.h b/reactos/w32api/include/ddk/ndiswan.h index a3156d5a98c..66fb0de6edb 100644 --- a/reactos/w32api/include/ddk/ndiswan.h +++ b/reactos/w32api/include/ddk/ndiswan.h @@ -31,8 +31,6 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ndis.h" #define NDIS_USE_WAN_WRAPPER 0x00000001 @@ -246,8 +244,6 @@ typedef struct _NDIS_WAN_CO_GET_STATS_INFO { OUT ULONG BytesReceivedCompressed; } NDIS_WAN_CO_GET_STATS_INFO, *PNDIS_WAN_CO_GET_STATS_INFO; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/netpnp.h b/reactos/w32api/include/ddk/netpnp.h index 32f305d0323..09ea55e182b 100644 --- a/reactos/w32api/include/ddk/netpnp.h +++ b/reactos/w32api/include/ddk/netpnp.h @@ -31,8 +31,6 @@ extern "C" { #endif -#pragma pack(push,4) - typedef enum _NET_PNP_EVENT_CODE { NetEventSetPower, NetEventQueryPower, @@ -64,8 +62,6 @@ typedef enum _NET_DEVICE_POWER_STATE { NetDeviceStateMaximum } NET_DEVICE_POWER_STATE, *PNET_DEVICE_POWER_STATE; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/newdev.h b/reactos/w32api/include/ddk/newdev.h index 7f618ded045..9e317790009 100644 --- a/reactos/w32api/include/ddk/newdev.h +++ b/reactos/w32api/include/ddk/newdev.h @@ -31,8 +31,6 @@ extern "C" { #endif -#pragma pack(push,4) - /* UpdateDriverForPlugAndPlayDevices.InstallFlags constants */ #define INSTALLFLAG_FORCE 0x00000001 #define INSTALLFLAG_READONLY 0x00000002 @@ -61,8 +59,6 @@ UpdateDriverForPlugAndPlayDevicesW( #define UpdateDriverForPlugAndPlayDevices UpdateDriverForPlugAndPlayDevicesA #endif /* UNICODE */ -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/ntapi.h b/reactos/w32api/include/ddk/ntapi.h index 223c01c4e34..eedf2daba30 100644 --- a/reactos/w32api/include/ddk/ntapi.h +++ b/reactos/w32api/include/ddk/ntapi.h @@ -34,13 +34,13 @@ extern "C" { #endif -#pragma pack(push,4) - #include <stdarg.h> #include <winbase.h> #include "ntddk.h" #include "ntpoapi.h" +#pragma pack(push,4) + typedef struct _PEB *PPEB; /* FIXME: Unknown definitions */ diff --git a/reactos/w32api/include/ddk/ntdd8042.h b/reactos/w32api/include/ddk/ntdd8042.h index 7696c8e2734..b9947b162e1 100644 --- a/reactos/w32api/include/ddk/ntdd8042.h +++ b/reactos/w32api/include/ddk/ntdd8042.h @@ -31,13 +31,10 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #include "ntddkbd.h" #include "ntddmou.h" - #define IOCTL_INTERNAL_I8042_CONTROLLER_WRITE_BUFFER \ CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0FF2, METHOD_NEITHER, FILE_ANY_ACCESS) @@ -209,8 +206,6 @@ typedef struct _INTERNAL_I8042_HOOK_MOUSE { IN PVOID CallContext; } INTERNAL_I8042_HOOK_MOUSE, *PINTERNAL_I8042_HOOK_MOUSE; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/ntddbeep.h b/reactos/w32api/include/ddk/ntddbeep.h index b82b6274eaf..6052a094858 100644 --- a/reactos/w32api/include/ddk/ntddbeep.h +++ b/reactos/w32api/include/ddk/ntddbeep.h @@ -31,11 +31,8 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" - #define DD_BEEP_DEVICE_NAME "\\Device\\Beep" #define DD_BEEP_DEVICE_NAME_U L"\\Device\\Beep" @@ -50,8 +47,6 @@ typedef struct _BEEP_SET_PARAMETERS { #define BEEP_FREQUENCY_MINIMUM 0x25 #define BEEP_FREQUENCY_MAXIMUM 0x7FFF -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/ntddcdrm.h b/reactos/w32api/include/ddk/ntddcdrm.h index 82bf815c2b4..49cf29dd2c5 100644 --- a/reactos/w32api/include/ddk/ntddcdrm.h +++ b/reactos/w32api/include/ddk/ntddcdrm.h @@ -31,12 +31,9 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #include "ntddstor.h" - #define IOCTL_CDROM_BASE FILE_DEVICE_CD_ROM #define IOCTL_CDROM_CHECK_VERIFY \ @@ -343,8 +340,6 @@ typedef struct __RAW_READ_INFO { TRACK_MODE_TYPE TrackMode; } RAW_READ_INFO, *PRAW_READ_INFO; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/ntddcdvd.h b/reactos/w32api/include/ddk/ntddcdvd.h index 48a106badcc..82c2a60ff22 100644 --- a/reactos/w32api/include/ddk/ntddcdvd.h +++ b/reactos/w32api/include/ddk/ntddcdvd.h @@ -31,12 +31,9 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #include "ntddstor.h" - #define IOCTL_DVD_BASE FILE_DEVICE_DVD #define IOCTL_DVD_END_SESSION \ @@ -77,12 +74,14 @@ typedef enum DVD_STRUCTURE_FORMAT { DvdMaxDescriptor } DVD_STRUCTURE_FORMAT, *PDVD_STRUCTURE_FORMAT; +#include <pshpack1.h> typedef struct DVD_READ_STRUCTURE { LARGE_INTEGER BlockByteOffset; DVD_STRUCTURE_FORMAT Format; DVD_SESSION_ID SessionId; UCHAR LayerNumber; } DVD_READ_STRUCTURE, *PDVD_READ_STRUCTURE; +#include <poppack.h> typedef struct _DVD_DESCRIPTOR_HEADER { USHORT Length; @@ -90,6 +89,7 @@ typedef struct _DVD_DESCRIPTOR_HEADER { UCHAR Data[0]; } DVD_DESCRIPTOR_HEADER, *PDVD_DESCRIPTOR_HEADER; +#include <pshpack1.h> typedef struct _DVD_LAYER_DESCRIPTOR { UCHAR BookVersion : 4; UCHAR BookType : 4; @@ -108,6 +108,7 @@ typedef struct _DVD_LAYER_DESCRIPTOR { UCHAR BCAFlag : 1; UCHAR Reserved6; } DVD_LAYER_DESCRIPTOR, *PDVD_LAYER_DESCRIPTOR; +#include <poppack.h> typedef struct _DVD_COPYRIGHT_DESCRIPTOR { UCHAR CopyrightProtectionType; @@ -205,8 +206,6 @@ typedef struct _DVD_REGION { UCHAR ResetCount; } DVD_REGION, *PDVD_REGION; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/ntddchgr.h b/reactos/w32api/include/ddk/ntddchgr.h index 7cd6cfafdfc..8c9e81e8196 100644 --- a/reactos/w32api/include/ddk/ntddchgr.h +++ b/reactos/w32api/include/ddk/ntddchgr.h @@ -31,12 +31,9 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #include "ntddstor.h" - #define DD_CHANGER_DEVICE_NAME "\\Device\\Changer" #define DD_CHANGER_DEVICE_NAME_U L"\\Device\\Changer" @@ -349,8 +346,6 @@ typedef struct _WMI_CHANGER_PROBLEM_DEVICE_ERROR { ULONG ChangerProblemType; } WMI_CHANGER_PROBLEM_DEVICE_ERROR, *PWMI_CHANGER_PROBLEM_DEVICE_ERROR; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/ntdddisk.h b/reactos/w32api/include/ddk/ntdddisk.h index 205046928f9..daf75c0870e 100644 --- a/reactos/w32api/include/ddk/ntdddisk.h +++ b/reactos/w32api/include/ddk/ntdddisk.h @@ -31,12 +31,9 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #include "ntddstor.h" - #define DD_DISK_DEVICE_NAME "\\Device\\UNKNOWN" #define DD_DISK_DEVICE_NAME_U L"\\Device\\UNKNOWN" @@ -454,6 +451,7 @@ typedef struct _IDEREGS { UCHAR bReserved; } IDEREGS, *PIDEREGS, *LPIDEREGS; +#include <pshpack1.h> typedef struct _SENDCMDINPARAMS { ULONG cBufferSize; IDEREGS irDriveRegs; @@ -462,6 +460,7 @@ typedef struct _SENDCMDINPARAMS { ULONG dwReserved[4]; UCHAR bBuffer[1]; } SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS; +#include <poppack.h> /* DRIVERSTATUS.bDriverError constants */ #define SMART_NO_ERROR 0 @@ -495,11 +494,13 @@ typedef struct _DRIVERSTATUS { #define READ_THRESHOLD_BUFFER_SIZE 512 #define SMART_LOG_SECTOR_SIZE 512 +#include <pshpack1.h> typedef struct _SENDCMDOUTPARAMS { ULONG cBufferSize; DRIVERSTATUS DriverStatus; UCHAR bBuffer[1]; } SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS; +#include <poppack.h> #define READ_ATTRIBUTES 0xD0 #define READ_THRESHOLDS 0xD1 @@ -513,8 +514,6 @@ typedef struct _SENDCMDOUTPARAMS { #define RETURN_SMART_STATUS 0xDA #define ENABLE_DISABLE_AUTO_OFFLINE 0xDB -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/ntddkbd.h b/reactos/w32api/include/ddk/ntddkbd.h index 9a1a358a371..93bc690b5c8 100644 --- a/reactos/w32api/include/ddk/ntddkbd.h +++ b/reactos/w32api/include/ddk/ntddkbd.h @@ -31,11 +31,8 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" - #define DD_KEYBOARD_DEVICE_NAME "\\Device\\KeyboardClass" #define DD_KEYBOARD_DEVICE_NAME_U L"\\Device\\KeyboardClass" @@ -131,8 +128,6 @@ typedef struct _KEYBOARD_IME_STATUS { ULONG ImeConvMode; } KEYBOARD_IME_STATUS, *PKEYBOARD_IME_STATUS; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/ntddmou.h b/reactos/w32api/include/ddk/ntddmou.h index 457b9d96e9e..fcf9445abd6 100644 --- a/reactos/w32api/include/ddk/ntddmou.h +++ b/reactos/w32api/include/ddk/ntddmou.h @@ -31,11 +31,8 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" - #define DD_MOUSE_DEVICE_NAME "\\Device\\PointerClass" #define DD_MOUSE_DEVICE_NAME_U L"\\Device\\PointerClass" @@ -111,8 +108,6 @@ typedef struct _MOUSE_ATTRIBUTES { ULONG InputDataQueueLength; } MOUSE_ATTRIBUTES, *PMOUSE_ATTRIBUTES; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/ntddpar.h b/reactos/w32api/include/ddk/ntddpar.h index 2f88c39c432..1b423650cd0 100644 --- a/reactos/w32api/include/ddk/ntddpar.h +++ b/reactos/w32api/include/ddk/ntddpar.h @@ -31,11 +31,8 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" - /* Parallel port device GUIDs */ DEFINE_GUID (GUID_DEVINTERFACE_PARALLEL, @@ -115,8 +112,6 @@ typedef struct _PARCLASS_NEGOTIATION_MASK { #define ECP_SW 0x0400 #define ECP_ANY 0x0780 -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/ntddpcm.h b/reactos/w32api/include/ddk/ntddpcm.h index f16e33d3507..22ef5dd9525 100644 --- a/reactos/w32api/include/ddk/ntddpcm.h +++ b/reactos/w32api/include/ddk/ntddpcm.h @@ -31,11 +31,8 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" - #define IOCTL_PCMCIA_BASE FILE_DEVICE_CONTROLLER #define DD_PCMCIA_DEVICE_NAME "\\\\.\\Pcmcia" @@ -161,8 +158,6 @@ typedef struct _PCMCIA_INTERFACE_STANDARD { PPCMCIA_IS_WRITE_PROTECTED IsWriteProtected; } PCMCIA_INTERFACE_STANDARD, *PPCMCIA_INTERFACE_STANDARD; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/ntddscsi.h b/reactos/w32api/include/ddk/ntddscsi.h index c580ae3c60a..11629cbaa59 100644 --- a/reactos/w32api/include/ddk/ntddscsi.h +++ b/reactos/w32api/include/ddk/ntddscsi.h @@ -31,11 +31,8 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" - #define DD_SCSI_DEVICE_NAME "\\Device\\ScsiPort" #define DD_SCSI_DEVICE_NAME_U L"\\Device\\ScsiPort" @@ -167,8 +164,6 @@ typedef struct _DUMP_POINTERS { PVOID DeviceObject; } DUMP_POINTERS, *PDUMP_POINTERS; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/ntddser.h b/reactos/w32api/include/ddk/ntddser.h index 1a3fb1c092c..cc0bd2a9f82 100644 --- a/reactos/w32api/include/ddk/ntddser.h +++ b/reactos/w32api/include/ddk/ntddser.h @@ -31,11 +31,8 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" - /* GUIDs */ DEFINE_GUID(GUID_DEVINTERFACE_COMPORT, @@ -445,8 +442,6 @@ typedef struct _SERIALCONFIG { WCHAR ProviderData[1]; } SERIALCONFIG,*PSERIALCONFIG; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/ntddstor.h b/reactos/w32api/include/ddk/ntddstor.h index 6875cd190cc..232834aab09 100644 --- a/reactos/w32api/include/ddk/ntddstor.h +++ b/reactos/w32api/include/ddk/ntddstor.h @@ -31,11 +31,8 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" - #define IOCTL_STORAGE_BASE FILE_DEVICE_MASS_STORAGE #define IOCTL_STORAGE_CHECK_VERIFY \ @@ -329,8 +326,6 @@ typedef struct _STORAGE_PROPERTY_QUERY { UCHAR AdditionalParameters[1]; } STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/ntddtape.h b/reactos/w32api/include/ddk/ntddtape.h index 4cc88691f6a..1b3b0499098 100644 --- a/reactos/w32api/include/ddk/ntddtape.h +++ b/reactos/w32api/include/ddk/ntddtape.h @@ -31,12 +31,9 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #include "ntddstor.h" - #define DD_TAPE_DEVICE_NAME "\\Device\\Tape" #define DD_TAPE_DEVICE_NAME_U L"\\Device\\Tape" @@ -75,8 +72,6 @@ typedef enum _TAPE_DRIVE_PROBLEM_TYPE { TapeDriveSnappedTape } TAPE_DRIVE_PROBLEM_TYPE; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/ntddtdi.h b/reactos/w32api/include/ddk/ntddtdi.h index 5ff5ad0643f..e907670060d 100644 --- a/reactos/w32api/include/ddk/ntddtdi.h +++ b/reactos/w32api/include/ddk/ntddtdi.h @@ -31,11 +31,8 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" - #define DD_TDI_DEVICE_NAME "\\Device\\UNKNOWN" #define DD_TDI_DEVICE_NAME_U L"\\Device\\UNKNOWN" @@ -57,8 +54,6 @@ extern "C" { #define IOCTL_TDI_DISASSOCIATE_ADDRESS _TDI_CONTROL_CODE(12, METHOD_BUFFERED) #define IOCTL_TDI_ACTION _TDI_CONTROL_CODE(13, METHOD_OUT_DIRECT) -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/ntddvdeo.h b/reactos/w32api/include/ddk/ntddvdeo.h index e8afdbc2c7e..2027de0b076 100644 --- a/reactos/w32api/include/ddk/ntddvdeo.h +++ b/reactos/w32api/include/ddk/ntddvdeo.h @@ -31,8 +31,6 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" @@ -435,8 +433,6 @@ typedef struct _VIDEO_HARDWARE_STATE { #define VIDEO_DUALVIEW_PRIMARY 0x80000000 #define VIDEO_DUALVIEW_SECONDARY 0x40000000 -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/ntddvol.h b/reactos/w32api/include/ddk/ntddvol.h index a5d9064be4a..bc0932a98e3 100644 --- a/reactos/w32api/include/ddk/ntddvol.h +++ b/reactos/w32api/include/ddk/ntddvol.h @@ -31,11 +31,8 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" - #define IOCTL_VOLUME_BASE ((ULONG) 'V') #define IOCTL_VOLUME_LOGICAL_TO_PHYSICAL \ @@ -137,8 +134,6 @@ typedef struct _VOLUME_FAILOVER_SET { ULONG DiskNumbers[1]; } VOLUME_FAILOVER_SET, *PVOLUME_FAILOVER_SET; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/ntpoapi.h b/reactos/w32api/include/ddk/ntpoapi.h index d33de714037..9c854bf237a 100644 --- a/reactos/w32api/include/ddk/ntpoapi.h +++ b/reactos/w32api/include/ddk/ntpoapi.h @@ -31,8 +31,6 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #include "batclass.h" @@ -224,9 +222,6 @@ typedef struct _PROCESSOR_POWER_INFORMATION { ULONG CurrentIdleState; } PROCESSOR_POWER_INFORMATION, *PPROCESSOR_POWER_INFORMATION; - -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/parallel.h b/reactos/w32api/include/ddk/parallel.h index 1c7d72f1084..d6a2429aff3 100644 --- a/reactos/w32api/include/ddk/parallel.h +++ b/reactos/w32api/include/ddk/parallel.h @@ -31,12 +31,9 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #include "ntddpar.h" - #define DD_PARALLEL_PORT_BASE_NAME "ParallelPort" #define DD_PARALLEL_PORT_BASE_NAME_U L"ParallelPort" @@ -273,8 +270,6 @@ typedef struct _PARCLASS_INFORMATION { PPARALLEL_DESELECT_DEVICE ParallelDeSelect; } PARCLASS_INFORMATION, *PPARCLASS_INFORMATION; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/pfhook.h b/reactos/w32api/include/ddk/pfhook.h index 571b63ef66b..57e3973bb28 100644 --- a/reactos/w32api/include/ddk/pfhook.h +++ b/reactos/w32api/include/ddk/pfhook.h @@ -31,11 +31,8 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" - #define DD_IPFLTRDRVR_DEVICE_NAME L"\\Device\\IPFILTERDRIVER" #define INVALID_PF_IF_INDEX 0xffffffff @@ -72,8 +69,6 @@ typedef struct _PF_SET_EXTENSION_HOOK_INFO { #define IOCTL_PF_SET_EXTENSION_POINTER \ _IPFLTRDRVR_CTL_CODE(22, METHOD_BUFFERED, FILE_WRITE_ACCESS) -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/poclass.h b/reactos/w32api/include/ddk/poclass.h index 8de537884e7..2a45ad22e3f 100644 --- a/reactos/w32api/include/ddk/poclass.h +++ b/reactos/w32api/include/ddk/poclass.h @@ -31,12 +31,9 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #include "batclass.h" - DEFINE_GUID(GUID_CLASS_INPUT, 0x4D1E55B2L, 0xF16F, 0x11CF, 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30); @@ -114,8 +111,6 @@ typedef struct _PROCESSOR_OBJECT_INFO { UCHAR PBlkLength; } PROCESSOR_OBJECT_INFO, *PPROCESSOR_OBJECT_INFO; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/scsi.h b/reactos/w32api/include/ddk/scsi.h index 2042eb1ad67..65adcdd3a90 100644 --- a/reactos/w32api/include/ddk/scsi.h +++ b/reactos/w32api/include/ddk/scsi.h @@ -31,8 +31,6 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" typedef union _CDB { @@ -1689,8 +1687,6 @@ typedef union _TWO_BYTE { (Bit) = _val; \ } -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/scsiscan.h b/reactos/w32api/include/ddk/scsiscan.h index 8d32ad34209..54683288378 100644 --- a/reactos/w32api/include/ddk/scsiscan.h +++ b/reactos/w32api/include/ddk/scsiscan.h @@ -31,11 +31,8 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" - #define IOCTL_SCSISCAN_CMD \ CTL_CODE(FILE_DEVICE_SCANNER, SCSISCAN_CMD_CODE, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) @@ -126,8 +123,6 @@ typedef struct _SCSISCAN_INFO { ULONG Reserved; } SCSISCAN_INFO, *PSCSISCAN_INFO; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/smbus.h b/reactos/w32api/include/ddk/smbus.h index 5444d374d66..6531c15dc4a 100644 --- a/reactos/w32api/include/ddk/smbus.h +++ b/reactos/w32api/include/ddk/smbus.h @@ -31,8 +31,6 @@ extern "C" { #endif -#pragma pack(push,4) - #if !defined(SMBCLASS) #define SMBCLASSAPI DECLSPEC_IMPORT #else @@ -185,8 +183,6 @@ DDKAPI SmbClassUnlockDevice( IN PSMB_CLASS SmbClass); -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/srb.h b/reactos/w32api/include/ddk/srb.h index 43648df15bb..052d1682bad 100644 --- a/reactos/w32api/include/ddk/srb.h +++ b/reactos/w32api/include/ddk/srb.h @@ -31,8 +31,6 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #if defined(_SCSIPORT_) @@ -748,8 +746,6 @@ ScsiDebugPrint( IN PCCHAR DebugMessage, IN ...); -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/storport.h b/reactos/w32api/include/ddk/storport.h index a97fc7a4e1e..f4f9d3cccc4 100644 --- a/reactos/w32api/include/ddk/storport.h +++ b/reactos/w32api/include/ddk/storport.h @@ -31,8 +31,6 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #include "srb.h" @@ -417,8 +415,6 @@ StorPortSynchronizeAccess( #define DebugPrint(x) #endif -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/tdiinfo.h b/reactos/w32api/include/ddk/tdiinfo.h index a6248c880a7..ba7e1e787e1 100644 --- a/reactos/w32api/include/ddk/tdiinfo.h +++ b/reactos/w32api/include/ddk/tdiinfo.h @@ -31,11 +31,8 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" - typedef struct TDIEntityID { ULONG tei_entity; ULONG tei_instance; @@ -106,8 +103,6 @@ typedef struct _TCP_REQUEST_SET_INFORMATION_EX { UCHAR Buffer[1]; } TCP_REQUEST_SET_INFORMATION_EX, *PTCP_REQUEST_SET_INFORMATION_EX; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/tdikrnl.h b/reactos/w32api/include/ddk/tdikrnl.h index 7e684702afc..a019e7d23b3 100644 --- a/reactos/w32api/include/ddk/tdikrnl.h +++ b/reactos/w32api/include/ddk/tdikrnl.h @@ -31,8 +31,6 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #include "tdi.h" @@ -1157,8 +1155,6 @@ DDKAPI TdiUnmapBuffer( IN PMDL MdlChain); -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/tvout.h b/reactos/w32api/include/ddk/tvout.h index 740022a27bf..0310ae46386 100644 --- a/reactos/w32api/include/ddk/tvout.h +++ b/reactos/w32api/include/ddk/tvout.h @@ -31,11 +31,8 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" - /* VIDEOPARAMETERS.dwCommand constants */ #define VP_COMMAND_GET 0x00000001 #define VP_COMMAND_SET 0x00000002 @@ -112,8 +109,6 @@ typedef struct _VIDEOPARAMETERS { BYTE bOEMCopyProtection[256]; } VIDEOPARAMETERS, *PVIDEOPARAMETERS, FAR *LPVIDEOPARAMETERS; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/upssvc.h b/reactos/w32api/include/ddk/upssvc.h index 4e6f62e2d73..404c25a38c2 100644 --- a/reactos/w32api/include/ddk/upssvc.h +++ b/reactos/w32api/include/ddk/upssvc.h @@ -31,8 +31,6 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #if defined(_APCUPS_) @@ -89,8 +87,6 @@ UPSWaitForStateChange( IN DWORD aCurrentState, IN DWORD anInterval); -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/usb.h b/reactos/w32api/include/ddk/usb.h index f3439352b9f..18dac4c8ffd 100644 --- a/reactos/w32api/include/ddk/usb.h +++ b/reactos/w32api/include/ddk/usb.h @@ -35,8 +35,6 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #include "usb100.h" @@ -464,8 +462,6 @@ typedef struct _OS_STRING { UCHAR bPad; } OS_STRING, *POS_STRING; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/usb100.h b/reactos/w32api/include/ddk/usb100.h index df28f1712ed..53b774ba296 100644 --- a/reactos/w32api/include/ddk/usb100.h +++ b/reactos/w32api/include/ddk/usb100.h @@ -31,11 +31,8 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" - #define MAXIMUM_USB_STRING_LENGTH 255 #define USB_DEVICE_CLASS_RESERVED 0x00 @@ -101,15 +98,18 @@ typedef struct _USB_COMMON_DESCRIPTOR { #define USB_CONFIG_SELF_POWERED 0x40 #define USB_CONFIG_REMOTE_WAKEUP 0x20 +#include <pshpack1.h> typedef struct _USB_CONFIGURATION_DESCRIPTOR { UCHAR bLength; UCHAR bDescriptorType; USHORT wTotalLength; UCHAR bNumInterfaces; + UCHAR bConfigurationValue; UCHAR iConfiguration; UCHAR bmAttributes; UCHAR MaxPower; } USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR; +#include <poppack.h> typedef struct _USB_DEVICE_DESCRIPTOR { UCHAR bLength; @@ -140,6 +140,7 @@ typedef struct _USB_DEVICE_DESCRIPTOR { #define USB_ENDPOINT_TYPE_BULK 0x02 #define USB_ENDPOINT_TYPE_INTERRUPT 0x03 +#include <pshpack1.h> typedef struct _USB_ENDPOINT_DESCRIPTOR { UCHAR bLength; UCHAR bDescriptorType; @@ -148,6 +149,7 @@ typedef struct _USB_ENDPOINT_DESCRIPTOR { USHORT wMaxPacketSize; UCHAR bInterval; } USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR; +#include <poppack.h> #define USB_FEATURE_ENDPOINT_STALL 0x0000 #define USB_FEATURE_REMOTE_WAKEUP 0x0001 @@ -170,6 +172,7 @@ typedef struct _USB_STRING_DESCRIPTOR { WCHAR bString[1]; } USB_STRING_DESCRIPTOR, *PUSB_STRING_DESCRIPTOR; +#include <pshpack1.h> typedef struct _USB_HUB_DESCRIPTOR { UCHAR bDescriptorLength; UCHAR bDescriptorType; @@ -179,6 +182,7 @@ typedef struct _USB_HUB_DESCRIPTOR { UCHAR bHubControlCurrent; UCHAR bRemoveAndPowerMask[64]; } USB_HUB_DESCRIPTOR, *PUSB_HUB_DESCRIPTOR; +#include <poppack.h> #define USB_SUPPORT_D0_COMMAND 0x01 #define USB_SUPPORT_D1_COMMAND 0x02 @@ -209,6 +213,7 @@ typedef struct _USB_CONFIGURATION_POWER_DESCRIPTOR { #define USB_FEATURE_INTERFACE_POWER_D2 0x0004 #define USB_FEATURE_INTERFACE_POWER_D3 0x0005 +#include <pshpack1.h> typedef struct _USB_INTERFACE_POWER_DESCRIPTOR { UCHAR bLength; UCHAR bDescriptorType; @@ -223,8 +228,7 @@ typedef struct _USB_INTERFACE_POWER_DESCRIPTOR { USHORT TransitionTimeFromD2; USHORT TransitionTimeFromD3; } USB_INTERFACE_POWER_DESCRIPTOR, *PUSB_INTERFACE_POWER_DESCRIPTOR; - -#pragma pack(pop) +#include <poppack.h> #ifdef __cplusplus } diff --git a/reactos/w32api/include/ddk/usbdi.h b/reactos/w32api/include/ddk/usbdi.h index 7caca07a765..99d24754146 100644 --- a/reactos/w32api/include/ddk/usbdi.h +++ b/reactos/w32api/include/ddk/usbdi.h @@ -35,12 +35,9 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #include "usbioctl.h" - #define USBDI_VERSION 0x300 #define USB_DEFAULT_DEVICE_ADDRESS 0 @@ -401,8 +398,6 @@ typedef struct _URB { }; } URB, *PURB; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/usbioctl.h b/reactos/w32api/include/ddk/usbioctl.h index f0ab90aa0e2..abd30b6ada8 100644 --- a/reactos/w32api/include/ddk/usbioctl.h +++ b/reactos/w32api/include/ddk/usbioctl.h @@ -31,8 +31,6 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #include "usb100.h" #include "usbiodef.h" @@ -151,6 +149,8 @@ typedef enum _USB_CONNECTION_STATUS { DeviceInLegacyHub } USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS; +#include <pshpack1.h> + typedef struct _USB_DESCRIPTOR_REQUEST { ULONG ConnectionIndex; struct { @@ -344,7 +344,7 @@ typedef struct _USB_ROOT_HUB_NAME { WCHAR RootHubName[1]; } USB_ROOT_HUB_NAME, *PUSB_ROOT_HUB_NAME; -#pragma pack(pop) +#include <poppack.h> #ifdef __cplusplus } diff --git a/reactos/w32api/include/ddk/usbiodef.h b/reactos/w32api/include/ddk/usbiodef.h index 4a801e39381..5faa3443154 100644 --- a/reactos/w32api/include/ddk/usbiodef.h +++ b/reactos/w32api/include/ddk/usbiodef.h @@ -31,11 +31,8 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" - DEFINE_GUID(GUID_DEVINTERFACE_USB_HUB, \ 0xf18a0e88, 0xc30c, 0x11d0, 0x88, 0x15, 0x00, 0xa0, 0xc9, 0x06, 0xbe, 0xd8); @@ -102,8 +99,6 @@ DEFINE_GUID(GUID_USB_WMI_STD_NOTIFICATION, METHOD_NEITHER, \ FILE_ANY_ACCESS) -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/usbscan.h b/reactos/w32api/include/ddk/usbscan.h index 938c7066a5d..d9a0b8ab16f 100644 --- a/reactos/w32api/include/ddk/usbscan.h +++ b/reactos/w32api/include/ddk/usbscan.h @@ -31,11 +31,8 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" - #define FILE_DEVICE_USB_SCAN 0x8000 #define IOCTL_INDEX 0x0800 @@ -154,8 +151,6 @@ typedef enum _PIPE_TYPE { ALL_PIPE } PIPE_TYPE; -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/usbuser.h b/reactos/w32api/include/ddk/usbuser.h index feacddac379..4c4b9e9a80d 100644 --- a/reactos/w32api/include/ddk/usbuser.h +++ b/reactos/w32api/include/ddk/usbuser.h @@ -31,12 +31,11 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #include "usb.h" #include "usbiodef.h" +#include <pshpack1.h> #define USBUSER_VERSION 0x0004 @@ -320,7 +319,7 @@ typedef struct _USBUSER_GET_USB2HW_VERSION { USB_USB2HW_VERSION_PARAMETERS Parameters; } USBUSER_GET_USB2HW_VERSION, *PUSBUSER_GET_USB2HW_VERSION; -#pragma pack(pop) +#include <poppack.h> #ifdef __cplusplus } diff --git a/reactos/w32api/include/ddk/video.h b/reactos/w32api/include/ddk/video.h index 39122bf63be..68a496a625c 100644 --- a/reactos/w32api/include/ddk/video.h +++ b/reactos/w32api/include/ddk/video.h @@ -169,7 +169,6 @@ typedef struct _VIDEO_PORT_CONFIG_INFO { ULONG NumEmulatorAccessEntries; PEMULATOR_ACCESS_ENTRY EmulatorAccessEntries; ULONG_PTR EmulatorAccessEntriesContext; - PVOID Reserved0; PHYSICAL_ADDRESS VdmPhysicalVideoMemoryAddress; ULONG VdmPhysicalVideoMemoryLength; ULONG HardwareStateSize; diff --git a/reactos/w32api/include/ddk/videoagp.h b/reactos/w32api/include/ddk/videoagp.h index 89886f809da..60f48baa81f 100644 --- a/reactos/w32api/include/ddk/videoagp.h +++ b/reactos/w32api/include/ddk/videoagp.h @@ -31,8 +31,6 @@ extern "C" { #endif -#pragma pack(push,4) - #include "ntddk.h" #include "video.h" @@ -124,8 +122,6 @@ VideoPortGetAgpServices( IN PVOID HwDeviceExtension, IN PVIDEO_PORT_AGP_SERVICES AgpServices); -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/winddi.h b/reactos/w32api/include/ddk/winddi.h index c658f4910ae..3aa8f346d71 100644 --- a/reactos/w32api/include/ddk/winddi.h +++ b/reactos/w32api/include/ddk/winddi.h @@ -828,7 +828,7 @@ typedef struct _GDIINFO { typedef struct _PATHDATA { FLONG flags; ULONG count; - POINTFIX pptfx; + POINTFIX *glypptfx; } PATHDATA, *PPATHDATA; /* PATHOBJ.fl constants */ @@ -856,7 +856,7 @@ typedef union _GLYPHDEF { typedef struct _GLYPHPOS { HGLYPH hg; GLYPHDEF *pgdf; - POINTL *ptl; + POINTL ptl; } GLYPHPOS, *PGLYPHPOS; typedef struct _GLYPHDATA { @@ -4147,8 +4147,6 @@ DrvGetDirectDrawInfo( OUT DWORD *pdwNumFourCCCodes, OUT DWORD *pdwFourCC); -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/winnt4.h b/reactos/w32api/include/ddk/winnt4.h index 0c73231cb32..3f842438137 100644 --- a/reactos/w32api/include/ddk/winnt4.h +++ b/reactos/w32api/include/ddk/winnt4.h @@ -31,8 +31,6 @@ extern "C" { #endif -#pragma pack(push,4) - typedef struct _ZONE_SEGMENT_HEADER { SINGLE_LIST_ENTRY SegmentList; PVOID Reserved; @@ -599,8 +597,6 @@ Exfi386InterlockedExchangeUlong( #endif /* _X86_ */ -#pragma pack(pop) - #ifdef __cplusplus } #endif diff --git a/reactos/w32api/include/ddk/ws2san.h b/reactos/w32api/include/ddk/ws2san.h index 29a21181d8d..de392c0fa42 100644 --- a/reactos/w32api/include/ddk/ws2san.h +++ b/reactos/w32api/include/ddk/ws2san.h @@ -31,8 +31,6 @@ extern "C" { #endif -#pragma pack(push,4) - #include <winsock2.h> #include "ntddk.h" @@ -243,8 +241,6 @@ typedef int WSPAPI IN OUT LPDWORD lpdwDescriptorLength, OUT LPINT lpErrno); -#pragma pack(pop) - #ifdef __cplusplus } #endif From 9725dc0746cd24aa870f4f53f19d36f0495e0aac Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Mon, 14 Jun 2004 20:58:51 +0000 Subject: [PATCH 1381/1463] - Update trasformation matrix in SetViewportOrgEx. svn path=/trunk/; revision=9668 --- reactos/subsys/win32k/objects/coord.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/objects/coord.c b/reactos/subsys/win32k/objects/coord.c index 36e03b2ba9e..4fbd1353340 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.23 2004/05/10 17:07:20 weiden Exp $ +/* $Id: coord.c,v 1.24 2004/06/14 20:58:51 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -649,6 +649,7 @@ NtGdiSetViewportOrgEx(HDC hDC, dc->vportOrgX = X; dc->vportOrgY = Y; + DC_UpdateXforms(dc); DC_UnlockDc(hDC); return TRUE; From 5fd39d97bbb19f54847d63836cfb808dd07292ad Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Tue, 15 Jun 2004 02:56:13 +0000 Subject: [PATCH 1382/1463] recv now works every time - Standardized on recvfrom request and reply everywhere - Added a continuous parameter to FillWSABuffers for stream sockets - Added function TryToSatisfyRecvRequest - Create MDLs for the WSABUFS. These are needed because we aren't in our home process when tcpip calls back with data. - Removed extraneous and potentially confusing lock ReadRequestQueueLock Now both ReadRequestQueue and ReceiveQueue rely on ReceiveQueueLock svn path=/trunk/; revision=9669 --- reactos/drivers/net/afd/afd/afd.c | 8 ++- reactos/drivers/net/afd/afd/dispatch.c | 83 +++++++++++++------------- reactos/drivers/net/afd/afd/event.c | 41 ++----------- reactos/drivers/net/afd/afd/opnclose.c | 1 - reactos/drivers/net/afd/afd/routines.c | 72 +++++++++++++++++++++- reactos/drivers/net/afd/include/afd.h | 4 +- reactos/lib/msafd/misc/sndrcv.c | 49 ++++++++------- 7 files changed, 153 insertions(+), 105 deletions(-) diff --git a/reactos/drivers/net/afd/afd/afd.c b/reactos/drivers/net/afd/afd/afd.c index 791646a513b..e5d89842a66 100644 --- a/reactos/drivers/net/afd/afd/afd.c +++ b/reactos/drivers/net/afd/afd/afd.c @@ -52,8 +52,9 @@ AfdDispatch( * Status of the operation */ { - NTSTATUS Status; + NTSTATUS Status; PIO_STACK_LOCATION IrpSp; + BOOL DoComplete = TRUE; IrpSp = IoGetCurrentIrpStackLocation(Irp); @@ -93,6 +94,7 @@ AfdDispatch( case IOCTL_AFD_RECV: Status = AfdDispRecv(Irp, IrpSp); + DoComplete = FALSE; break; case IOCTL_AFD_SEND: @@ -115,14 +117,14 @@ AfdDispatch( break; } - if (Status != STATUS_PENDING) { + if (Status != STATUS_PENDING && DoComplete) { Irp->IoStatus.Status = Status; IoCompleteRequest(Irp, IO_NETWORK_INCREMENT); } AFD_DbgPrint(MAX_TRACE, ("Leaving. Status (0x%X).\n", Status)); - return Status; + return Status; } diff --git a/reactos/drivers/net/afd/afd/dispatch.c b/reactos/drivers/net/afd/afd/dispatch.c index d49c775853e..5f01d97b66d 100644 --- a/reactos/drivers/net/afd/afd/dispatch.c +++ b/reactos/drivers/net/afd/afd/dispatch.c @@ -29,52 +29,55 @@ NTSTATUS AfdpDispRecv( PAFD_READ_REQUEST ReadRequest; NTSTATUS Status; KIRQL OldIrql; - ULONG Count; + PMDL Mdl; + UINT i; KeAcquireSpinLock(&FCB->ReceiveQueueLock, &OldIrql); - if (IsListEmpty(&FCB->ReceiveQueue)) { - KeReleaseSpinLock(&FCB->ReceiveQueueLock, OldIrql); - - /* Queue a read request and return STATUS_PENDING */ - - AFD_DbgPrint(MAX_TRACE, ("Queueing read request.\n")); - - /*ReadRequest = (PAFD_READ_REQUEST)ExAllocateFromNPagedLookasideList( - &ReadRequestLookasideList);*/ - ReadRequest = (PAFD_READ_REQUEST)ExAllocatePool( + /* Queue a read request and return STATUS_PENDING */ + + AFD_DbgPrint(MAX_TRACE, ("Queueing read request.\n")); + + /*ReadRequest = (PAFD_READ_REQUEST)ExAllocateFromNPagedLookasideList( + &ReadRequestLookasideList);*/ + ReadRequest = (PAFD_READ_REQUEST)ExAllocatePool( NonPagedPool, sizeof(AFD_READ_REQUEST)); - if (ReadRequest) { + if (ReadRequest) { ReadRequest->Irp = Irp; ReadRequest->RecvFromRequest = Request; ReadRequest->RecvFromReply = Reply; + AFD_DbgPrint(MAX_TRACE,("Reply to %x (%x)\n", Reply, + ReadRequest->RecvFromReply)); + + for( i = 0; + i < ReadRequest->RecvFromRequest->BufferCount; + i++ ) { + /* These will be cleaned up in routines.c:FillWSABuffers */ + Mdl = IoAllocateMdl( ReadRequest->RecvFromRequest->Buffers[i].buf, + ReadRequest->RecvFromRequest->Buffers[i].len, + FALSE, + FALSE, + Irp ); + MmProbeAndLockPages( Mdl, KernelMode, IoWriteAccess ); + ReadRequest->RecvFromRequest->Buffers[i].buf = (PCHAR)Mdl; + } + + InsertTailList( &FCB->ReadRequestQueue, &ReadRequest->ListEntry ); - ExInterlockedInsertTailList( - &FCB->ReadRequestQueue, - &ReadRequest->ListEntry, - &FCB->ReadRequestQueueLock); Status = STATUS_PENDING; - } else { - Status = STATUS_INSUFFICIENT_RESOURCES; - } } else { - AFD_DbgPrint(MAX_TRACE, ("Satisfying read request.\n")); - - /* Satisfy the request at once */ - Status = FillWSABuffers( - FCB, - Request->Buffers, - Request->BufferCount, - &Count, - Continuous); /* I.E. Packets are exhausted on short recv if not */ - KeReleaseSpinLock(&FCB->ReceiveQueueLock, OldIrql); - - Reply->NumberOfBytesRecvd = Count; - Reply->Status = NO_ERROR; - - AFD_DbgPrint(MAX_TRACE, ("Bytes received (0x%X).\n", Count)); + Status = STATUS_INSUFFICIENT_RESOURCES; } + TryToSatisfyRecvRequest( FCB, Continuous ); + + if (IsListEmpty(&FCB->ReadRequestQueue)) /* All recv requests handled */ + Status = STATUS_SUCCESS; + else + IoMarkIrpPending( Irp ); + + KeReleaseSpinLock(&FCB->ReceiveQueueLock, OldIrql); + return Status; } @@ -767,8 +770,8 @@ NTSTATUS AfdDispRecv( NTSTATUS Status; UINT InputBufferLength; UINT OutputBufferLength; - PFILE_REQUEST_RECV Request; - PFILE_REPLY_RECV Reply; + PFILE_REQUEST_RECVFROM Request; + PFILE_REPLY_RECVFROM Reply; DWORD NumberOfBytesRecvd; PAFDFCB FCB; @@ -782,14 +785,14 @@ NTSTATUS AfdDispRecv( (OutputBufferLength >= sizeof(FILE_REPLY_RECV))) { FCB = IrpSp->FileObject->FsContext; - Request = (PFILE_REQUEST_RECV)Irp->AssociatedIrp.SystemBuffer; - Reply = (PFILE_REPLY_RECV)Irp->AssociatedIrp.SystemBuffer; + Request = (PFILE_REQUEST_RECVFROM)Irp->AssociatedIrp.SystemBuffer; + Reply = (PFILE_REPLY_RECVFROM)Irp->AssociatedIrp.SystemBuffer; Status = AfdpDispRecv( Irp, FCB, - (PFILE_REQUEST_RECVFROM)Request, - (PFILE_REPLY_RECVFROM)Reply, + Request, + Reply, TRUE); Reply->NumberOfBytesRecvd = NumberOfBytesRecvd; Reply->Status = NO_ERROR; diff --git a/reactos/drivers/net/afd/afd/event.c b/reactos/drivers/net/afd/afd/event.c index 951752fac64..fe08ac64c02 100644 --- a/reactos/drivers/net/afd/afd/event.c +++ b/reactos/drivers/net/afd/afd/event.c @@ -45,13 +45,9 @@ NTSTATUS AfdEventReceive( OUT PIRP *IoRequestPacket) { PAFDFCB FCB = (PAFDFCB)TdiEventContext; - PAFD_READ_REQUEST ReadRequest; PVOID ReceiveBuffer; PAFD_BUFFER Buffer; - PLIST_ENTRY Entry; - NTSTATUS Status; KIRQL OldIrql; - ULONG Count; AFD_DbgPrint(MAX_TRACE, ("Called.\n")); @@ -77,38 +73,13 @@ NTSTATUS AfdEventReceive( Buffer->Buffer.buf = ReceiveBuffer; Buffer->Offset = 0; - ExInterlockedInsertTailList( - &FCB->ReceiveQueue, - &Buffer->ListEntry, - &FCB->ReceiveQueueLock); + KeAcquireSpinLock(&FCB->ReceiveQueueLock, &OldIrql); - KeAcquireSpinLock(&FCB->ReadRequestQueueLock, &OldIrql); + InsertTailList( &FCB->ReceiveQueue, &Buffer->ListEntry ); - while (!IsListEmpty(&FCB->ReadRequestQueue) && - !IsListEmpty(&FCB->ReceiveQueue)) { - AFD_DbgPrint(MAX_TRACE, ("Satisfying read request.\n")); + TryToSatisfyRecvRequest( FCB, TRUE ); - Entry = RemoveHeadList(&FCB->ReceiveQueue); - ReadRequest = CONTAINING_RECORD(Entry, AFD_READ_REQUEST, ListEntry); - - Status = FillWSABuffers( - FCB, - ReadRequest->RecvFromRequest->Buffers, - ReadRequest->RecvFromRequest->BufferCount, - &Count, - TRUE ); /* Continuous */ - ReadRequest->RecvFromReply->NumberOfBytesRecvd = Count; - ReadRequest->RecvFromReply->Status = NO_ERROR; - - ReadRequest->Irp->IoStatus.Information = 0; - ReadRequest->Irp->IoStatus.Status = Status; - - AFD_DbgPrint(MAX_TRACE, ("Completing IRP at (0x%X).\n", ReadRequest->Irp)); - - IoCompleteRequest(ReadRequest->Irp, IO_NETWORK_INCREMENT); - } - - KeReleaseSpinLock(&FCB->ReadRequestQueueLock, OldIrql); + KeReleaseSpinLock(&FCB->ReceiveQueueLock, OldIrql); *BytesTaken = BytesAvailable; @@ -200,7 +171,7 @@ NTSTATUS AfdEventReceiveDatagramHandler( &Buffer->ListEntry, &FCB->ReceiveQueueLock); - KeAcquireSpinLock(&FCB->ReadRequestQueueLock, &OldIrql); + KeAcquireSpinLock(&FCB->ReceiveQueueLock, &OldIrql); if (!IsListEmpty(&FCB->ReadRequestQueue)) { AFD_DbgPrint(MAX_TRACE, ("Satisfying read request.\n")); @@ -225,7 +196,7 @@ NTSTATUS AfdEventReceiveDatagramHandler( IoCompleteRequest(ReadRequest->Irp, IO_NETWORK_INCREMENT); } - KeReleaseSpinLock(&FCB->ReadRequestQueueLock, OldIrql); + KeReleaseSpinLock(&FCB->ReceiveQueueLock, OldIrql); *BytesTaken = BytesAvailable; diff --git a/reactos/drivers/net/afd/afd/opnclose.c b/reactos/drivers/net/afd/afd/opnclose.c index f3bb929d8e2..7e28a37c35a 100644 --- a/reactos/drivers/net/afd/afd/opnclose.c +++ b/reactos/drivers/net/afd/afd/opnclose.c @@ -42,7 +42,6 @@ PAFDFCB AfdInitializeFCB( KeInitializeSpinLock(&NewFCB->ReceiveQueueLock); InitializeListHead(&NewFCB->ReadRequestQueue); - KeInitializeSpinLock(&NewFCB->ReadRequestQueueLock); InitializeListHead(&NewFCB->ListenRequestQueue); diff --git a/reactos/drivers/net/afd/afd/routines.c b/reactos/drivers/net/afd/afd/routines.c index 1853fb1b06e..a0812cc87d1 100644 --- a/reactos/drivers/net/afd/afd/routines.c +++ b/reactos/drivers/net/afd/afd/routines.c @@ -10,6 +10,19 @@ #include <afd.h> #include <debug.h> +#ifndef DONT_USE_ME_THIS_WAY_IM_LIFTED_FROM_NTOSKRNL_XXX_DO_THIS_THE_RIGHT_WAY +LONG FASTCALL +XxInterlockedExchange(PLONG Target, + LONG Value); + +__asm__("\n\t.global @XxInterlockedExchange@8\n\t" + "@XxInterlockedExchange@8:\n\t" + "xchgl %edx,(%ecx)\n\t" + "movl %edx,%eax\n\t" + "ret\n\t"); + +#define InterlockedExchange XxInterlockedExchange +#endif VOID DumpName( LPSOCKADDR Name) @@ -84,6 +97,49 @@ NTSTATUS MergeWSABuffers( return STATUS_SUCCESS; } +VOID TryToSatisfyRecvRequest( PAFDFCB FCB, BOOL Continuous ) { + PAFD_READ_REQUEST ReadRequest; + PLIST_ENTRY Entry; + NTSTATUS Status; + ULONG Count = 0; + + AFD_DbgPrint(MAX_TRACE, ("Satisfying read request.\n")); + + while (!IsListEmpty(&FCB->ReadRequestQueue) && + !IsListEmpty(&FCB->ReceiveQueue)) { + AFD_DbgPrint(MAX_TRACE, ("Satisfying read request.\n")); + + Entry = RemoveHeadList(&FCB->ReadRequestQueue); + ReadRequest = CONTAINING_RECORD(Entry, AFD_READ_REQUEST, ListEntry); + + AFD_DbgPrint(MAX_TRACE,("ReadRequest: (li) %x %x %x\n", + ReadRequest->Irp, + ReadRequest->RecvFromRequest, + ReadRequest->RecvFromReply)); + + Status = FillWSABuffers( + FCB, + ReadRequest->RecvFromRequest->Buffers, + ReadRequest->RecvFromRequest->BufferCount, + &Count, + Continuous ); + + ReadRequest->RecvFromReply->NumberOfBytesRecvd = Count; + ReadRequest->RecvFromReply->Status = NO_ERROR; + + ReadRequest->Irp->IoStatus.Information = + sizeof(*ReadRequest->RecvFromReply); + ReadRequest->Irp->IoStatus.Status = Status; + + AFD_DbgPrint(MAX_TRACE, ("Completing IRP at (0x%X).\n", ReadRequest->Irp)); + + IoSetCancelRoutine(ReadRequest->Irp, NULL); + IoCompleteRequest(ReadRequest->Irp, IO_NETWORK_INCREMENT); + } + + AFD_DbgPrint(MAX_TRACE, ("Bytes received (0x%X).\n", Count)); +} + /* * NOTES: ReceiveQueueLock must be acquired for the FCB when called */ @@ -98,6 +154,7 @@ NTSTATUS FillWSABuffers( UINT DstSize, SrcSize; UINT Count, Total; PAFD_BUFFER SrcBuffer; + PMDL Mdl; PLIST_ENTRY Entry; *BytesCopied = 0; @@ -112,7 +169,9 @@ NTSTATUS FillWSABuffers( SrcData = SrcBuffer->Buffer.buf + SrcBuffer->Offset; SrcSize = SrcBuffer->Buffer.len - SrcBuffer->Offset; - DstData = Buffers->buf; + /* First buffer: map the pages so we can access them */ + Mdl = (PMDL)Buffers->buf; + DstData = MmMapLockedPages( Mdl, KernelMode ); DstSize = Buffers->len; /* Copy the data */ @@ -157,20 +216,27 @@ NTSTATUS FillWSABuffers( BufferCount--; if (BufferCount < 1) break; + + /* And cleanup the pages. */ + MmUnmapLockedPages( DstData, Mdl ); + MmUnlockPages( Mdl ); + IoFreeMdl( Mdl ); + Buffers++; - DstData = Buffers->buf; + Mdl = (PMDL)Buffers->buf; + DstData = MmMapLockedPages( Mdl, KernelMode ); DstSize = Buffers->len; } } if (SrcSize > 0) { + SrcBuffer->Offset += Total; InsertHeadList(&FCB->ReceiveQueue, Entry); } else if (SrcBuffer != NULL) { ExFreePool(SrcBuffer->Buffer.buf); ExFreePool(SrcBuffer); } - SrcBuffer->Offset += Total; *BytesCopied = Total; return STATUS_SUCCESS; diff --git a/reactos/drivers/net/afd/include/afd.h b/reactos/drivers/net/afd/include/afd.h index 5cdd2752481..2e1c2899ddb 100644 --- a/reactos/drivers/net/afd/include/afd.h +++ b/reactos/drivers/net/afd/include/afd.h @@ -71,7 +71,6 @@ typedef struct _AFDFCB { LIST_ENTRY ReceiveQueue; KSPIN_LOCK ReceiveQueueLock; LIST_ENTRY ReadRequestQueue; - KSPIN_LOCK ReadRequestQueueLock; LIST_ENTRY ListenRequestQueue; /* For WSAEventSelect() */ WSANETWORKEVENTS NetworkEvents; @@ -310,6 +309,9 @@ NTSTATUS STDCALL AfdWrite( VOID DumpName( LPSOCKADDR Name); +/* Requires caller to hold the recv queue lock */ +VOID TryToSatisfyRecvRequest( PAFDFCB FCB, BOOL Continuous ); + ULONG WSABufferSize( LPWSABUF Buffers, DWORD BufferCount); diff --git a/reactos/lib/msafd/misc/sndrcv.c b/reactos/lib/msafd/misc/sndrcv.c index 3f239e4230f..7fd001ad1b8 100644 --- a/reactos/lib/msafd/misc/sndrcv.c +++ b/reactos/lib/msafd/misc/sndrcv.c @@ -38,8 +38,8 @@ WSPRecv( IN LPWSATHREADID lpThreadId, OUT LPINT lpErrno) { - PFILE_REQUEST_RECV Request; - FILE_REPLY_RECV Reply; + PFILE_REQUEST_RECVFROM Request; + FILE_REPLY_RECVFROM Reply; IO_STATUS_BLOCK Iosb; NTSTATUS Status; DWORD Size; @@ -48,8 +48,8 @@ WSPRecv( Size = dwBufferCount * sizeof(WSABUF); - Request = (PFILE_REQUEST_RECV)HeapAlloc( - GlobalHeap, 0, sizeof(FILE_REQUEST_RECV) + Size); + Request = (PFILE_REQUEST_RECVFROM)HeapAlloc( + GlobalHeap, 0, sizeof(FILE_REQUEST_RECVFROM) + Size); if (!Request) { AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); *lpErrno = WSAENOBUFS; @@ -71,9 +71,9 @@ WSPRecv( &Iosb, IOCTL_AFD_RECV, Request, - sizeof(FILE_REQUEST_RECV) + Size, + sizeof(FILE_REQUEST_RECVFROM) + Size, &Reply, - sizeof(FILE_REPLY_RECV)); + sizeof(FILE_REPLY_RECVFROM)); HeapFree(GlobalHeap, 0, Request); @@ -90,7 +90,7 @@ WSPRecv( } AFD_DbgPrint(MAX_TRACE, ("Receive successful (0x%X).\n", - Reply.NumberOfBytesRecvd)); + Reply.NumberOfBytesRecvd)); *lpNumberOfBytesRecvd = Reply.NumberOfBytesRecvd; //*lpFlags = 0; @@ -215,40 +215,45 @@ WSPSend( AFD_DbgPrint(MAX_TRACE, ("Called.\n")); Size = dwBufferCount * sizeof(WSABUF); - +CP Request = (PFILE_REQUEST_SENDTO)HeapAlloc( - GlobalHeap, 0, sizeof(FILE_REQUEST_SEND) + Size); + GlobalHeap, 0, sizeof(FILE_REQUEST_SENDTO) + Size); if (!Request) { *lpErrno = WSAENOBUFS; return SOCKET_ERROR; } +CP /* Put buffer pointers after request structure */ Request->Buffers = (LPWSABUF)(Request + 1); Request->BufferCount = dwBufferCount; Request->Flags = dwFlags; +CP RtlCopyMemory(Request->Buffers, lpBuffers, Size); +CP - Status = NtDeviceIoControlFile( - (HANDLE)s, - NULL, - NULL, - NULL, - &Iosb, - IOCTL_AFD_SEND, - Request, - sizeof(FILE_REQUEST_SEND) + Size, - &Reply, - sizeof(FILE_REPLY_SEND)); - - HeapFree(GlobalHeap, 0, Request); + Status = NtDeviceIoControlFile + ( (HANDLE)s, + NULL, + NULL, + NULL, + &Iosb, + IOCTL_AFD_SEND, + Request, + sizeof(FILE_REQUEST_SENDTO) + Size, + &Reply, + sizeof(FILE_REPLY_SENDTO)); +CP + /* HeapFree(GlobalHeap, 0, Request); */ +CP if (Status == STATUS_PENDING) { AFD_DbgPrint(MAX_TRACE, ("Waiting on transport.\n")); /* FIXME: Wait only for blocking sockets */ Status = NtWaitForSingleObject((HANDLE)s, FALSE, NULL); } +CP if (!NT_SUCCESS(Status)) { AFD_DbgPrint(MAX_TRACE, ("Status (0x%X).\n", Status)); From aefc8f79e7def20432c4f97a7ad82ae72a8a42f8 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Tue, 15 Jun 2004 08:17:23 +0000 Subject: [PATCH 1383/1463] - Initialized the variable status to get on success a proper return value. svn path=/trunk/; revision=9670 --- 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 5ae83c8c3f9..acaba6fc7f6 100644 --- a/reactos/lib/ntdll/ldr/utils.c +++ b/reactos/lib/ntdll/ldr/utils.c @@ -1,4 +1,4 @@ -/* $Id: utils.c,v 1.88 2004/06/13 10:35:52 navaraf Exp $ +/* $Id: utils.c,v 1.89 2004/06/15 08:17:23 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -2530,7 +2530,7 @@ LdrpAttachProcess(VOID) PLIST_ENTRY Entry; PLDR_MODULE Module; BOOL Result; - NTSTATUS Status; + NTSTATUS Status = STATUS_SUCCESS; DPRINT("LdrpAttachProcess() called for %wZ\n", &ExeModule->BaseDllName); From 4536f9c25b8d367ad7ce0c0b4707b3822dc56e67 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Tue, 15 Jun 2004 08:53:53 +0000 Subject: [PATCH 1384/1463] - Interpret the sign for qualifier 'l'. svn path=/trunk/; revision=9671 --- reactos/lib/crtdll/makefile | 6 +- reactos/lib/crtdll/stdio/vfprintf.c | 870 ---------------------------- reactos/lib/crtdll/stdio/vfwprint.c | 869 --------------------------- reactos/lib/msvcrt/stdio/vfprintf.c | 8 +- reactos/lib/msvcrt/stdio/vfwprint.c | 8 +- reactos/lib/ntdll/stdio/sprintf.c | 10 +- reactos/lib/ntdll/stdio/swprintf.c | 18 +- reactos/ntoskrnl/rtl/sprintf.c | 10 +- reactos/ntoskrnl/rtl/swprintf.c | 18 +- 9 files changed, 51 insertions(+), 1766 deletions(-) delete mode 100644 reactos/lib/crtdll/stdio/vfprintf.c delete mode 100644 reactos/lib/crtdll/stdio/vfwprint.c diff --git a/reactos/lib/crtdll/makefile b/reactos/lib/crtdll/makefile index 696e3a6c342..b6c3815906b 100644 --- a/reactos/lib/crtdll/makefile +++ b/reactos/lib/crtdll/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.64 2004/05/29 21:24:43 hbirr Exp $ +# $Id: makefile,v 1.65 2004/06/15 08:53:52 hbirr Exp $ PATH_TO_TOP = ../.. @@ -356,9 +356,9 @@ STDIO_OBJECTS = \ $(PATH_TO_MSVCRT)/stdio/tmpfile.o \ $(PATH_TO_MSVCRT)/stdio/tmpnam.o \ $(PATH_TO_MSVCRT)/stdio/ungetc.o \ - stdio/vfprintf.o \ + $(PATH_TO_MSVCRT)/stdio/vfprintf.o \ $(PATH_TO_MSVCRT)/stdio/vfscanf.o \ - stdio/vfwprint.o \ + $(PATH_TO_MSVCRT)/stdio/vfwprint.o \ $(PATH_TO_MSVCRT)/stdio/vprintf.o \ $(PATH_TO_MSVCRT)/stdio/vscanf.o \ $(PATH_TO_MSVCRT)/stdio/vsprintf.o \ diff --git a/reactos/lib/crtdll/stdio/vfprintf.c b/reactos/lib/crtdll/stdio/vfprintf.c deleted file mode 100644 index 5eaae3f27d8..00000000000 --- a/reactos/lib/crtdll/stdio/vfprintf.c +++ /dev/null @@ -1,870 +0,0 @@ -/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ -#include <msvcrt/stdio.h> -#include <msvcrt/stdarg.h> -#include <msvcrt/malloc.h> -#include <msvcrt/internal/file.h> - -int _isnanl(double x); -int _isinfl(double x); -int _isnan(double x); -int _isinf(double x); - - - -int -__vfprintf (FILE *fp, const char *fmt0, va_list argp); - -/* - * @implemented - */ -int -vfprintf(FILE *f, const char *fmt, va_list ap) -{ - int len; - char localbuf[BUFSIZ]; - - if (f->_flag & _IONBF) - { - f->_flag &= ~_IONBF; - f->_ptr = f->_base = localbuf; - f->_bufsiz = BUFSIZ; - len = __vfprintf(f,fmt, ap); - (void)fflush(f); - f->_flag |= _IONBF; - f->_base = NULL; - f->_bufsiz = 0; - f->_cnt = 0; - } - else - len = __vfprintf(f,fmt, ap); - return (ferror(f) ? EOF : len); -} - - -/* - * linux/lib/vsprintf.c - * - * Copyright (C) 1991, 1992 Linus Torvalds - */ - -/* vsprintf.c -- Lars Wirzenius & Linus Torvalds. */ -/* - * Wirzenius wrote this portably, Torvalds fucked it up :-) - */ - -/* - * Appropiated for the reactos kernel, March 1998 -- David Welch - */ - -#include <stdarg.h> - -#include <msvcrt/ctype.h> -#include <msvcrt/string.h> -#include <msvcrt/stdio.h> -#include <msvcrt/string.h> -#include <msvcrt/math.h> -#include <msvcrt/internal/ieee.h> - - -#define ZEROPAD 1 /* pad with zero */ -#define SIGN 2 /* unsigned/signed long */ -#define PLUS 4 /* show plus */ -#define SPACE 8 /* space if plus */ -#define LEFT 16 /* left justified */ -#define SPECIAL 32 /* 0x */ -#define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */ -#define ZEROTRUNC 128 /* truncate zero 's */ - - -static int -skip_atoi(const char **s) -{ - int i=0; - - while (isdigit(**s)) - i = i*10 + *((*s)++) - '0'; - return i; -} - - -static int -do_div(long long *n,int base) -{ - int __res = ((unsigned long long) *n) % (unsigned) base; - *n = ((unsigned long long) *n) / (unsigned) base; - return __res; -} - - -static void -number(FILE * f, long long num, int base, int size, int precision ,int type) -{ - char c,sign,tmp[66]; - const char *digits="0123456789abcdefghijklmnopqrstuvwxyz"; - int i; - - if (type & LARGE) - digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - if (type & LEFT) - type &= ~ZEROPAD; - if (base < 2 || base > 36) - return; - c = (type & ZEROPAD) ? '0' : ' '; - sign = 0; - if (type & SIGN) { - if (num < 0) { - sign = '-'; - num = -num; - size--; - } else if (type & PLUS) { - sign = '+'; - size--; - } else if (type & SPACE) { - sign = ' '; - size--; - } - } - if (type & SPECIAL) { - if (base == 16) - size -= 2; - else if (base == 8) - size--; - } - i = 0; - if (num == 0) - tmp[i++]='0'; - else while (num != 0) - tmp[i++] = digits[do_div(&num,base)]; - if (i > precision) - precision = i; - size -= precision; - if (!(type&(ZEROPAD+LEFT))) - while(size-->0) - putc(' ',f); - if (sign) - putc(sign,f); - if (type & SPECIAL) { - if (base==8) { - putc('0',f); - } - else if (base==16) { - putc('0', f); - putc(digits[33],f); - } - } - if (!(type & LEFT)) - while (size-- > 0) - putc(c,f); - while (i < precision--) - putc('0', f); - while (i-- > 0) - putc(tmp[i],f); - while (size-- > 0) - putc(' ', f); - return; -} - - -static void -numberf(FILE * f, double __n, char exp_sign, int size, int precision, int type) -{ - double exponent = 0.0; - double e; - long ie; - - //int x; - char *buf, *tmp; - int i = 0; - int j = 0; - //int k = 0; - - double frac, intr; - double p; - char sign; - char c; - char ro = 0; - - double_t *n = (double_t *)&__n; - - if ( exp_sign == 'g' || exp_sign == 'G' || exp_sign == 'e' || exp_sign == 'E' ) { - ie = ((unsigned int)n->exponent - (unsigned int)0x3ff); - exponent = ie/3.321928; - } - - if ( exp_sign == 'g' || exp_sign == 'G' ) { - type |= ZEROTRUNC; - if ( exponent < -4 || fabs(exponent) >= precision ) - exp_sign -= 2; // g -> e and G -> E - } - - if ( exp_sign == 'e' || exp_sign == 'E' ) { - frac = modf(exponent,&e); - if ( frac > 0.5 ) - e++; - else if ( frac < -0.5 ) - e--; - - numberf(f,__n/pow(10.0L,e),'f',size-4, precision, type); - putc( exp_sign,f); - size--; - ie = (long)e; - type = LEFT | PLUS; - if ( ie < 0 ) - type |= SIGN; - - number(f,ie, 10,2, 2,type ); - return; - } - - if ( exp_sign == 'f' ) { - buf = alloca(4096); - if (type & LEFT) { - type &= ~ZEROPAD; - } - - c = (type & ZEROPAD) ? '0' : ' '; - sign = 0; - if (type & SIGN) { - if (__n < 0) { - sign = '-'; - __n = fabs(__n); - size--; - } else if (type & PLUS) { - sign = '+'; - size--; - } else if (type & SPACE) { - sign = ' '; - size--; - } - } - - frac = modf(__n,&intr); - - // # flags forces a . and prevents trucation of trailing zero's - - if ( precision > 0 ) { - //frac = modfl(__n,&intr); - i = precision-1; - while ( i >= 0 ) { - frac*=10.0L; - frac = modf(frac, &p); - buf[i] = (int)p + '0'; - i--; - } - i = precision; - size -= precision; - - ro = 0; - if ( frac > 0.5 ) { - ro = 1; - } - - if ( precision >= 1 || type & SPECIAL) { - buf[i++] = '.'; - size--; - } - } - - if ( intr == 0.0 ) { - buf[i++] = '0'; - size--; - } - else { - while ( intr > 0.0 ) { - intr/=10.0L; - p = modf(intr, &intr); - - p *=10; - - buf[i++] = (int)p + '0'; - size--; - } - } - - j = 0; - while ( j < i && ro == 1) { - if ( buf[j] >= '0' && buf[j] <= '8' ) { - buf[j]++; - ro = 0; - } - else if ( buf[j] == '9' ) { - buf[j] = '0'; - } - j++; - } - if ( ro == 1 ) - buf[i++] = '1'; - - buf[i] = 0; - - size -= precision; - if (!(type&(ZEROPAD+LEFT))) - while(size-->0) - putc(' ',f); - if (sign) - putc( sign,f); - - if (!(type&(ZEROPAD+LEFT))) - while(size-->0) - putc(' ',f); - if (type & SPECIAL) { - } - - if (!(type & LEFT)) - while (size-- > 0) - putc(c,f); - - tmp = buf; - if ( type & ZEROTRUNC && ((type & SPECIAL) != SPECIAL) ) { - j = 0; - while ( j < i && ( *tmp == '0' || *tmp == '.' )) { - tmp++; - i--; - } - } -// else -// while (i < precision--) -// putc('0', f); - while (i-- > 0) - putc(tmp[i],f); - while (size-- > 0) - putc(' ', f); - } -} - - -static void -numberfl(FILE * f, long double __n, char exp_sign, int size, int precision, int type) -{ - long double exponent = 0.0; - long double e; - long ie; - - //int x; - char *buf, *tmp; - int i = 0; - int j = 0; - //int k = 0; - - long double frac, intr; - long double p; - char sign; - char c; - char ro = 0; - - long_double_t *n = (long_double_t *)&__n; - - if ( exp_sign == 'g' || exp_sign == 'G' || exp_sign == 'e' || exp_sign == 'E' ) { - ie = ((unsigned int)n->exponent - (unsigned int)0x3fff); - exponent = ie/3.321928; - } - - if ( exp_sign == 'g' || exp_sign == 'G' ) { - type |= ZEROTRUNC; - if ( exponent < -4 || fabs(exponent) >= precision ) - exp_sign -= 2; // g -> e and G -> E - } - - if ( exp_sign == 'e' || exp_sign == 'E' ) { - frac = modfl(exponent,&e); - if ( frac > 0.5 ) - e++; - else if ( frac < -0.5 ) - e--; - - numberf(f,__n/powl(10.0L,e),'f',size-4, precision, type); - putc( exp_sign,f); - size--; - ie = (long)e; - type = LEFT | PLUS; - if ( ie < 0 ) - type |= SIGN; - - number(f,ie, 10,2, 2,type ); - return; - } - - if ( exp_sign == 'f' ) { - - buf = alloca(4096); - if (type & LEFT) { - type &= ~ZEROPAD; - } - - c = (type & ZEROPAD) ? '0' : ' '; - sign = 0; - if (type & SIGN) { - if (__n < 0) { - sign = '-'; - __n = fabs(__n); - size--; - } else if (type & PLUS) { - sign = '+'; - size--; - } else if (type & SPACE) { - sign = ' '; - size--; - } - } - - frac = modfl(__n,&intr); - - // # flags forces a . and prevents trucation of trailing zero's - if ( precision > 0 ) { - //frac = modfl(__n,&intr); - - i = precision-1; - while ( i >= 0 ) { - frac*=10.0L; - frac = modfl((long double)frac, &p); - buf[i] = (int)p + '0'; - i--; - } - i = precision; - size -= precision; - - ro = 0; - if ( frac > 0.5 ) { - ro = 1; - } - - if ( precision >= 1 || type & SPECIAL) { - buf[i++] = '.'; - size--; - } - } - - if ( intr == 0.0 ) { - buf[i++] = '0'; - size--; - } - else { - while ( intr > 0.0 ) { - intr/=10.0L; - p = modfl(intr, &intr); - - p *=10; - - buf[i++] = (int)p + '0'; - size--; - } - } - - j = 0; - while ( j < i && ro == 1) { - if ( buf[j] >= '0' && buf[j] <= '8' ) { - buf[j]++; - ro = 0; - } - else if ( buf[j] == '9' ) { - buf[j] = '0'; - } - j++; - } - if ( ro == 1 ) - buf[i++] = '1'; - - buf[i] = 0; - - size -= precision; - if (!(type&(ZEROPAD+LEFT))) - while(size-->0) - putc(' ',f); - if (sign) - putc(sign,f); - - if (!(type&(ZEROPAD+LEFT))) - while(size-->0) - putc(' ',f); - if (type & SPECIAL) { - } - - if (!(type & LEFT)) - while (size-- > 0) - putc(c,f); - - tmp = buf; - if ( type & ZEROTRUNC && ((type & SPECIAL) != SPECIAL) ) { - j = 0; - while ( j < i && ( *tmp == '0' || *tmp == '.' )) { - tmp++; - i--; - } - } -// else -// while (i < precision--) -// putc( '0', f); - while (i-- > 0) - putc(tmp[i],f); - while (size-- > 0) - putc(' ', f); - } -} - - -int -__vfprintf(FILE *f, const char *fmt, va_list args) -{ - int len; - unsigned long long num; - int i, base; - long double _ldouble; - double _double; - const char *s; - const short int* sw; - - int flags; /* flags to number() */ - - int field_width; /* width of output field */ - int precision; /* min. # of digits for integers; max - number of chars for from string */ - int qualifier = 0; /* 'h', 'l', 'L' or 'I64' for integer fields */ - - for (; *fmt ; ++fmt) { - if (*fmt != '%') { - putc(*fmt,f); - continue; - } - - /* process flags */ - flags = 0; - repeat: - ++fmt; /* this also skips first '%' */ - switch (*fmt) { - case '-': flags |= LEFT; goto repeat; - case '+': flags |= PLUS; goto repeat; - case ' ': flags |= SPACE; goto repeat; - case '#': flags |= SPECIAL; goto repeat; - case '0': flags |= ZEROPAD; goto repeat; - } - - /* get field width */ - field_width = -1; - if (isdigit(*fmt)) - field_width = skip_atoi(&fmt); - else if (*fmt == '*') { - ++fmt; - /* it's the next argument */ - field_width = va_arg(args, int); - if (field_width < 0) { - field_width = -field_width; - flags |= LEFT; - } - } - - /* get the precision */ - precision = -1; - if (*fmt == '.') { - ++fmt; - if (isdigit(*fmt)) - precision = skip_atoi(&fmt); - else if (*fmt == '*') { - ++fmt; - /* it's the next argument */ - precision = va_arg(args, int); - } - if (precision < 0) - precision = 0; - } - - /* get the conversion qualifier */ - // %Z can be just stand alone or as size_t qualifier - if ( *fmt == 'Z' ) { - qualifier = *fmt; - switch ( *(fmt+1)) { - case 'o': - case 'b': - case 'X': - case 'x': - case 'd': - case 'i': - case 'u': - ++fmt; - break; - default: - break; - } - } else if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' || *fmt == 'w') { - qualifier = *fmt; - ++fmt; - } else if (*fmt == 'I' && *(fmt+1) == '6' && *(fmt+2) == '4') { - qualifier = *fmt; - fmt += 3; - } - - // go fine with ll instead of L - if ( *fmt == 'l' ) { - ++fmt; - qualifier = 'L'; - } - - /* default base */ - base = 10; - - switch (*fmt) { - case 'c': - if (!(flags & LEFT)) - while (--field_width > 0) - putc(' ', f); - if (qualifier == 'l' || qualifier == 'w') - putc((unsigned char)(wchar_t) va_arg(args, int), f); - else - putc((unsigned char) va_arg(args, int), f); - while (--field_width > 0) - putc(' ', f); - continue; - - case 'C': - if (!(flags & LEFT)) - while (--field_width > 0) - putc(' ', f); - if (qualifier == 'h') - putc((unsigned char) va_arg(args, int), f); - else - putc((unsigned char)(wchar_t) va_arg(args, int), f); - while (--field_width > 0) - putc(' ', f); - continue; - - case 's': - if (qualifier == 'l' || qualifier == 'w') { - /* print unicode string */ - sw = va_arg(args, wchar_t *); - if (sw == NULL) - sw = L"<NULL>"; - - len = wcslen (sw); - if ((unsigned int)len > (unsigned int)precision) - len = precision; - - if (!(flags & LEFT)) - while (len < field_width--) - putc(' ', f); - for (i = 0; i < len; ++i) - putc((unsigned char)(*sw++), f); - while (len < field_width--) - putc(' ', f); - } else { - /* print ascii string */ - s = va_arg(args, char *); - if (s == NULL) - s = "<NULL>"; - - len = strlen (s); - if ((unsigned int)len > (unsigned int)precision) - len = precision; - - if (!(flags & LEFT)) - while (len < field_width--) - putc(' ', f); - for (i = 0; i < len; ++i) - putc(*s++, f); - while (len < field_width--) - putc(' ', f); - } - continue; - - case 'S': - if (qualifier == 'h') { - /* print ascii string */ - s = va_arg(args, char *); - if (s == NULL) - s = "<NULL>"; - - len = strlen (s); - if ((unsigned int)len > (unsigned int)precision) - len = precision; - - if (!(flags & LEFT)) - while (len < field_width--) - putc(' ', f); - for (i = 0; i < len; ++i) - putc(*s++, f); - while (len < field_width--) - putc(' ', f); - } else { - /* print unicode string */ - sw = va_arg(args, wchar_t *); - if (sw == NULL) - sw = L"<NULL>"; - - len = wcslen (sw); - if ((unsigned int)len > (unsigned int)precision) - len = precision; - - if (!(flags & LEFT)) - while (len < field_width--) - putc(' ', f); - for (i = 0; i < len; ++i) - putc((unsigned char)(*sw++), f); - while (len < field_width--) - putc(' ', f); - } - continue; - - case 'Z': - if (qualifier == 'w') { - /* print counted unicode string */ - PUNICODE_STRING pus = va_arg(args, PUNICODE_STRING); - if ((pus == NULL) || (pus->Buffer == NULL)) { - s = "<NULL>"; - while ((*s) != 0) - putc(*s++, f); - } else { - for (i = 0; pus->Buffer[i] && i < pus->Length / sizeof(WCHAR); i++) - putc((unsigned char)(pus->Buffer[i]), f); - } - } else { - /* print counted ascii string */ - PANSI_STRING pus = va_arg(args, PANSI_STRING); - if ((pus == NULL) || (pus->Buffer == NULL)) { - s = "<NULL>"; - while ((*s) != 0) - putc(*s++, f); - } else { - for (i = 0; pus->Buffer[i] && i < pus->Length; i++) - putc(pus->Buffer[i], f); - } - } - continue; - - case 'e': - case 'E': - case 'f': - case 'g': - case 'G': - if (qualifier == 'l' || qualifier == 'L' ) { - _ldouble = va_arg(args, long double); - - if ( _isnanl(_ldouble) ) { - s = "Nan"; - len = 3; - while ( len > 0 ) { - putc(*s++,f); - len --; - } - } - else if ( _isinfl(_ldouble) < 0 ) { - s = "-Inf"; - len = 4; - while ( len > 0 ) { - putc(*s++,f); - len --; - } - } - else if ( _isinfl(_ldouble) > 0 ) { - s = "+Inf"; - len = 4; - while ( len > 0 ) { - putc(*s++,f); - len --; - } - } else { - if ( precision == -1 ) - precision = 6; - numberfl(f,_ldouble,*fmt,field_width,precision,flags); - } - } else { - _double = (double)va_arg(args, double); - - if ( _isnan(_double) ) { - s = "Nan"; - len = 3; - while ( len > 0 ) { - putc(*s++,f); - len --; - } - } else if ( _isinf(_double) < 0 ) { - s = "-Inf"; - len = 4; - while ( len > 0 ) { - putc(*s++,f); - len --; - } - } else if ( _isinf(_double) > 0 ) { - s = "+Inf"; - len = 4; - while ( len > 0 ) { - putc(*s++,f); - len --; - } - } else { - if ( precision == -1 ) - precision = 6; - numberf(f,_double,*fmt,field_width,precision,flags); - } - } - continue; - - case 'p': - if (field_width == -1) { - field_width = 2*sizeof(void *); - flags |= ZEROPAD; - } - number(f, - (unsigned long) va_arg(args, void *), 16, - field_width, precision, flags); - continue; - - case 'n': - if (qualifier == 'l') { - long * ip = va_arg(args, long *); - *ip = 0; - } else { - int * ip = va_arg(args, int *); - *ip = 0; - } - continue; - - /* integer number formats - set up the flags and "break" */ - case 'o': - base = 8; - break; - - case 'b': - base = 2; - break; - - case 'X': - flags |= LARGE; - case 'x': - base = 16; - break; - - case 'd': - case 'i': - flags |= SIGN; - case 'u': - break; - - default: - if (*fmt != '%') - putc('%', f); - if (*fmt) - putc(*fmt, f); - else - --fmt; - continue; - } - - if (qualifier == 'I') - num = va_arg(args, unsigned long long); - else if (qualifier == 'l') - num = va_arg(args, unsigned long); - else if (qualifier == 'h') { - if (flags & SIGN) - num = va_arg(args, int); - else - num = va_arg(args, unsigned int); - } - else if (flags & SIGN) - num = va_arg(args, int); - else - num = va_arg(args, unsigned int); - number(f, num, base, field_width, precision, flags); - } - //putc('\0',f); - return 0; -} - -/* EOF */ diff --git a/reactos/lib/crtdll/stdio/vfwprint.c b/reactos/lib/crtdll/stdio/vfwprint.c deleted file mode 100644 index 37265cb0cda..00000000000 --- a/reactos/lib/crtdll/stdio/vfwprint.c +++ /dev/null @@ -1,869 +0,0 @@ -/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ -#include <msvcrt/stdio.h> -#include <stdarg.h> -#include <msvcrt/malloc.h> -#include <msvcrt/internal/file.h> - -int _isnanl(double x); -int _isinfl(double x); -int _isnan(double x); -int _isinf(double x); - -int putwc(wint_t wc, FILE* fileWrite); -//wint_t putwc (wint_t wc, FILE* fileWrite); - -int -__vfwprintf(FILE *fp, const wchar_t *fmt0, va_list argp); - - -/* - * @implemented - */ -int -vfwprintf(FILE *f, const wchar_t *fmt, va_list ap) -{ - int len; - wchar_t localbuf[BUFSIZ]; - - if (f->_flag & _IONBF) { - f->_flag &= ~_IONBF; - f->_ptr = f->_base = (char *)localbuf; - f->_bufsiz = BUFSIZ; - len = __vfwprintf(f,fmt,ap); - (void)fflush(f); - f->_flag |= _IONBF; - f->_base = NULL; - f->_bufsiz = 0; - f->_cnt = 0; - } else - len = __vfwprintf(f,fmt,ap); - - return (ferror(f) ? EOF : len); - -// return 0; -} - - - -/* - * linux/lib/vsprintf.c - * - * Copyright (C) 1991, 1992 Linus Torvalds - */ - -/* vsprintf.c -- Lars Wirzenius & Linus Torvalds. */ -/* - * Wirzenius wrote this portably, Torvalds fucked it up :-) - */ - -/* - * Appropiated for the reactos kernel, March 1998 -- David Welch - */ - -#include <stdarg.h> - -#include <msvcrt/ctype.h> -#include <msvcrt/string.h> -#include <msvcrt/stdio.h> -#include <msvcrt/string.h> -#include <msvcrt/math.h> -#include <msvcrt/internal/ieee.h> - - -#define ZEROPAD 1 /* pad with zero */ -#define SIGN 2 /* unsigned/signed long */ -#define PLUS 4 /* show plus */ -#define SPACE 8 /* space if plus */ -#define LEFT 16 /* left justified */ -#define SPECIAL 32 /* 0x */ -#define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */ -#define ZEROTRUNC 128 /* truncate zero 's */ - - -static int skip_wtoi(const wchar_t **s) -{ - int i=0; - - while (iswdigit(**s)) - i = i*10 + *((*s)++) - L'0'; - return i; -} - - -static int do_div(long long *n,int base) -{ - int __res = ((unsigned long long) *n) % (unsigned) base; - *n = ((unsigned long long) *n) / (unsigned) base; - return __res; -} - - -static void number(FILE * f, long long num, int base, int size, int precision ,int type) -{ - wchar_t c,sign,tmp[66]; - const wchar_t *digits=L"0123456789abcdefghijklmnopqrstuvwxyz"; - int i; - - if (type & LARGE) - digits = L"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - if (type & LEFT) - type &= ~ZEROPAD; - if (base < 2 || base > 36) - return; - c = (type & ZEROPAD) ? L'0' : L' '; - sign = 0; - if (type & SIGN) { - if (num < 0) { - sign = L'-'; - num = -num; - size--; - } else if (type & PLUS) { - sign = L'+'; - size--; - } else if (type & SPACE) { - sign = L' '; - size--; - } - } - if (type & SPECIAL) { - if (base == 16) - size -= 2; - else if (base == 8) - size--; - } - i = 0; - if (num == 0) - tmp[i++]=L'0'; - else while (num != 0) - tmp[i++] = digits[do_div(&num,base)]; - if (i > precision) - precision = i; - size -= precision; - if (!(type&(ZEROPAD+LEFT))) - while(size-->0) - putwc(L' ',f); - if (sign) - putwc(sign,f); - if (type & SPECIAL) { - if (base==8) { - putwc(L'0',f); - } - else if (base==16) { - putwc(L'0', f); - putwc(digits[33],f); - } - } - if (!(type & LEFT)) - while (size-- > 0) - putwc(c,f); - while (i < precision--) - putwc(L'0', f); - while (i-- > 0) - putwc(tmp[i],f); - while (size-- > 0) - putwc(L' ', f); - return; -} - - -static void numberf(FILE * f, double __n, wchar_t exp_sign, int size, int precision, int type) -{ - double exponent = 0.0; - double e; - long ie; - - //int x; - char *buf, *tmp; - int i = 0; - int j = 0; - //int k = 0; - - double frac, intr; - double p; - wchar_t sign; - wchar_t c; - char ro = 0; - - double_t *n = (double_t *)&__n; - - if ( exp_sign == L'g' || exp_sign == L'G' || exp_sign == L'e' || exp_sign == L'E' ) { - ie = ((unsigned int)n->exponent - (unsigned int)0x3ff); - exponent = ie/3.321928; - } - - if ( exp_sign == L'g' || exp_sign == L'G' ) { - type |= ZEROTRUNC; - if ( exponent < -4 || fabs(exponent) >= precision ) - exp_sign -= 2; // g -> e and G -> E - } - - if ( exp_sign == L'e' || exp_sign == L'E' ) { - frac = modf(exponent,&e); - if ( frac > 0.5 ) - e++; - else if ( frac < -0.5 ) - e--; - - numberf(f,__n/pow(10.0L,e),L'f',size-4, precision, type); - putwc( exp_sign,f); - size--; - ie = (long)e; - type = LEFT | PLUS; - if ( ie < 0 ) - type |= SIGN; - - number(f,ie, 10,2, 2,type ); - return; - } - - if ( exp_sign == 'f' ) { - buf = alloca(4096); - if (type & LEFT) { - type &= ~ZEROPAD; - } - - c = (type & ZEROPAD) ? L'0' : L' '; - sign = 0; - if (type & SIGN) { - if (__n < 0) { - sign = L'-'; - __n = fabs(__n); - size--; - } else if (type & PLUS) { - sign = L'+'; - size--; - } else if (type & SPACE) { - sign = L' '; - size--; - } - } - - frac = modf(__n,&intr); - - // # flags forces a . and prevents trucation of trailing zero's - - if ( precision > 0 ) { - //frac = modfl(__n,&intr); - i = precision-1; - while ( i >= 0 ) { - frac*=10.0L; - frac = modf(frac, &p); - buf[i] = (int)p + L'0'; - i--; - } - i = precision; - size -= precision; - - ro = 0; - if ( frac > 0.5 ) { - ro = 1; - } - - if ( precision >= 1 || type & SPECIAL) { - buf[i++] = '.'; - size--; - } - } - - if ( intr == 0.0 ) { - buf[i++] = L'0'; - size--; - } - else { - while ( intr > 0.0 ) { - intr/=10.0L; - p = modf(intr, &intr); - - p *=10; - - buf[i++] = (int)p + L'0'; - size--; - } - } - - j = 0; - while ( j < i && ro == 1 ) { - if ( buf[j] >= L'0' && buf[j] <= L'8' ) { - buf[j]++; - ro = 0; - } - else if ( buf[j] == L'9' ) { - buf[j] = L'0'; - } - j++; - } - if ( ro == 1 ) - buf[i++] = L'1'; - - buf[i] = 0; - - size -= precision; - if (!(type&(ZEROPAD+LEFT))) - while(size-->0) - putwc(L' ',f); - if (sign) - putwc( sign,f); - - if (!(type&(ZEROPAD+LEFT))) - while(size-->0) - putwc(L' ',f); - if (type & SPECIAL) { - } - - if (!(type & LEFT)) - while (size-- > 0) - putwc(c,f); - - tmp = buf; - if ( type & ZEROTRUNC && ((type & SPECIAL) != SPECIAL) ) { - j = 0; - while ( j < i && ( *tmp == L'0' || *tmp == L'.' )) { - tmp++; - i--; - } - } -// else -// while (i < precision--) -// putwc(L'0', f); - while (i-- > 0) - putwc(tmp[i],f); - while (size-- > 0) - putwc(L' ', f); - } -} - - -static void numberfl(FILE * f, long double __n, wchar_t exp_sign, int size, int precision, int type) -{ - long double exponent = 0.0; - long double e; - long ie; - - //int x; - wchar_t *buf, *tmp; - int i = 0; - int j = 0; - //int k = 0; - - long double frac, intr; - long double p; - wchar_t sign; - wchar_t c; - char ro = 0; - - long_double_t *n = (long_double_t *)&__n; - - if ( exp_sign == L'g' || exp_sign == L'G' || exp_sign == L'e' || exp_sign == L'E' ) { - ie = ((unsigned int)n->exponent - (unsigned int)0x3fff); - exponent = ie/3.321928; - } - - if ( exp_sign == L'g' || exp_sign == L'G' ) { - type |= ZEROTRUNC; - if ( exponent < -4 || fabs(exponent) >= precision ) - exp_sign -= 2; // g -> e and G -> E - } - - if ( exp_sign == L'e' || exp_sign == L'E' ) { - frac = modfl(exponent,&e); - if ( frac > 0.5 ) - e++; - else if ( frac < -0.5 ) - e--; - - numberf(f,__n/powl(10.0L,e),L'f',size-4, precision, type); - putwc( exp_sign,f); - size--; - ie = (long)e; - type = LEFT | PLUS; - if ( ie < 0 ) - type |= SIGN; - - number(f,ie, 10,2, 2,type ); - return; - } - - if ( exp_sign == L'f' ) { - buf = alloca(4096); - if (type & LEFT) { - type &= ~ZEROPAD; - } - - c = (type & ZEROPAD) ? L'0' : L' '; - sign = 0; - if (type & SIGN) { - if (__n < 0) { - sign = L'-'; - __n = fabs(__n); - size--; - } else if (type & PLUS) { - sign = L'+'; - size--; - } else if (type & SPACE) { - sign = L' '; - size--; - } - } - - frac = modfl(__n,&intr); - - // # flags forces a . and prevents trucation of trailing zero's - if ( precision > 0 ) { - //frac = modfl(__n,&intr); - - i = precision-1; - while ( i >= 0 ) { - frac*=10.0L; - frac = modfl((long double)frac, &p); - buf[i] = (int)p + L'0'; - i--; - } - i = precision; - size -= precision; - - ro = 0; - if ( frac > 0.5 ) { - ro = 1; - } - - if ( precision >= 1 || type & SPECIAL) { - buf[i++] = L'.'; - size--; - } - } - - if ( intr == 0.0 ) { - buf[i++] = L'0'; - size--; - } - else { - while ( intr > 0.0 ) { - intr/=10.0L; - p = modfl(intr, &intr); - - p *=10; - - buf[i++] = (int)p + L'0'; - size--; - } - } - - j = 0; - while ( j < i && ro == 1) { - if ( buf[j] >= L'0' && buf[j] <= L'8' ) { - buf[j]++; - ro = 0; - } - else if ( buf[j] == L'9' ) { - buf[j] = L'0'; - } - j++; - } - if ( ro == 1 ) - buf[i++] = L'1'; - - buf[i] = 0; - - size -= precision; - if (!(type&(ZEROPAD+LEFT))) - while(size-->0) - putwc(L' ',f); - if (sign) - putwc(sign,f); - - if (!(type&(ZEROPAD+LEFT))) - while(size-->0) - putwc(L' ',f); - if (type & SPECIAL) { - } - - if (!(type & LEFT)) - while (size-- > 0) - putwc(c,f); - - tmp = buf; - if ( type & ZEROTRUNC && ((type & SPECIAL) != SPECIAL) ) { - j = 0; - while ( j < i && ( *tmp == L'0' || *tmp == L'.' )) { - tmp++; - i--; - } - } -// else -// while (i < precision--) -// putc( '0', f); - while (i-- > 0) - putwc(tmp[i],f); - while (size-- > 0) - putwc(L' ', f); - } -} - - -int __vfwprintf(FILE *f, const wchar_t *fmt, va_list args) -{ - int len; - unsigned long long num; - int i, base; - long double _ldouble; - double _double; - const char *s; - const wchar_t* sw; - - int flags; /* flags to number() */ - - int field_width; /* width of output field */ - int precision; /* min. # of digits for integers; max - number of chars for from string */ - int qualifier = 0; /* 'h', 'l', 'L' or 'I64' for integer fields */ - - for (; *fmt ; ++fmt) { - if (*fmt != L'%') { - putwc(*fmt,f); - continue; - } - - /* process flags */ - flags = 0; - repeat: - ++fmt; /* this also skips first '%' */ - switch (*fmt) { - case L'-': flags |= LEFT; goto repeat; - case L'+': flags |= PLUS; goto repeat; - case L' ': flags |= SPACE; goto repeat; - case L'#': flags |= SPECIAL; goto repeat; - case L'0': flags |= ZEROPAD; goto repeat; - } - - /* get field width */ - field_width = -1; - if (isxdigit(*fmt)) - field_width = skip_wtoi(&fmt); - else if (*fmt == L'*') { - ++fmt; - /* it's the next argument */ - field_width = va_arg(args, int); - if (field_width < 0) { - field_width = -field_width; - flags |= LEFT; - } - } - - /* get the precision */ - precision = -1; - if (*fmt == L'.') { - ++fmt; - if (iswdigit(*fmt)) - precision = skip_wtoi(&fmt); - else if (*fmt == L'*') { - ++fmt; - /* it's the next argument */ - precision = va_arg(args, int); - } - if (precision < 0) - precision = 0; - } - - /* get the conversion qualifier */ - // %Z can be just stand alone or as size_t qualifier - if ( *fmt == 'Z' ) { - qualifier = *fmt; - switch ( *(fmt+1)) { - case L'o': - case L'b': - case L'X': - case L'x': - case L'd': - case L'i': - case L'u': - ++fmt; - break; - default: - break; - } - } else if (*fmt == L'h' || *fmt == L'l' || *fmt == L'L' || *fmt == L'w') { - qualifier = *fmt; - ++fmt; - } else if (*fmt == L'I' && *(fmt+1) == L'6' && *(fmt+2) == L'4') { - qualifier = *fmt; - fmt += 3; - } - - // go fine with ll instead of L - if ( *fmt == L'l' ) { - ++fmt; - qualifier = L'L'; - } - - /* default base */ - base = 10; - - switch (*fmt) { - case L'c': /* finished */ - if (!(flags & LEFT)) - while (--field_width > 0) - putwc(L' ', f); - if (qualifier == L'h') - putwc((wchar_t) va_arg(args, int), f); - else - putwc((wchar_t) va_arg(args, int), f); - while (--field_width > 0) - putwc(L' ', f); - continue; - - case L'C': /* finished */ - if (!(flags & LEFT)) - while (--field_width > 0) - putwc(L' ', f); - if (qualifier == L'l' || qualifier == L'w') - putwc((unsigned char)(wchar_t) va_arg(args, int), f); - else - putwc((unsigned char) va_arg(args, int), f); - while (--field_width > 0) - putwc(L' ', f); - continue; - - case L's': /* finished */ - if (qualifier == L'h') { - /* print ascii string */ - s = va_arg(args, char *); - if (s == NULL) - s = "<NULL>"; - - len = strlen (s); - if ((unsigned int)len > (unsigned int)precision) - len = precision; - - if (!(flags & LEFT)) - while (len < field_width--) - putwc(L' ', f); - for (i = 0; i < len; ++i) - putwc((wchar_t)(*s++), f); - while (len < field_width--) - putwc(L' ', f); - } else { - /* print unicode string */ - sw = va_arg(args, wchar_t *); - if (sw == NULL) - sw = L"<NULL>"; - - len = wcslen (sw); - if ((unsigned int)len > (unsigned int)precision) - len = precision; - - if (!(flags & LEFT)) - while (len < field_width--) - putwc(L' ', f); - for (i = 0; i < len; ++i) - putwc(*sw++, f); - while (len < field_width--) - putwc(L' ', f); - } - continue; - - case L'S': - if (qualifier == L'l' || qualifier == L'w') { - /* print unicode string */ - sw = va_arg(args, wchar_t *); - if (sw == NULL) - sw = L"<NULL>"; - - len = wcslen (sw); - if ((unsigned int)len > (unsigned int)precision) - len = precision; - - if (!(flags & LEFT)) - while (len < field_width--) - putwc(L' ', f); - for (i = 0; i < len; ++i) - putwc(*sw++, f); - while (len < field_width--) - putwc(L' ', f); - } else { - /* print ascii string */ - s = va_arg(args, char *); - if (s == NULL) - s = "<NULL>"; - - len = strlen (s); - if ((unsigned int)len > (unsigned int)precision) - len = precision; - - if (!(flags & LEFT)) - while (len < field_width--) - putwc(L' ', f); - for (i = 0; i < len; ++i) - putwc((wchar_t)(*s++), f); - while (len < field_width--) - putwc(L' ', f); - } - continue; - -#if 0 - case L'Z': /* finished */ - if (qualifier == L'w') { - /* print counted unicode string */ - PUNICODE_STRING pus = va_arg(args, PUNICODE_STRING); - if ((pus == NULL) || (pus->Buffer)) { - sw = L"<NULL>"; - while ((*sw) != 0) - putwc(*sw++, f); - } else { - for (i = 0; pus->Buffer[i] && i < pus->Length; i++) - putwc(pus->Buffer[i], f); - } - } else { - /* print counted ascii string */ - PANSI_STRING pus = va_arg(args, PANSI_STRING); - if ((pus == NULL) || (pus->Buffer)) { - sw = L"<NULL>"; - while ((*sw) != 0) - putwc(*sw++, f); - } else { - for (i = 0; pus->Buffer[i] && i < pus->Length; i++) - putwc((wchar_t)pus->Buffer[i], f); - } - } - continue; -#endif - - case L'e': /* finished */ - case L'E': - case L'f': - case L'g': - case L'G': - if (qualifier == L'l' || qualifier == L'L' ) { - _ldouble = va_arg(args, long double); - - if ( _isnanl(_ldouble) ) { - sw = L"Nan"; - len = 3; - while ( len > 0 ) { - putwc(*sw++,f); - len --; - } - } - else if ( _isinfl(_ldouble) < 0 ) { - sw = L"-Inf"; - len = 4; - while ( len > 0 ) { - putwc(*sw++,f); - len --; - } - } - else if ( _isinfl(_ldouble) > 0 ) { - sw = L"+Inf"; - len = 4; - while ( len > 0 ) { - putwc(*sw++,f); - len --; - } - } else { - if ( precision == -1 ) - precision = 6; - numberfl(f,_ldouble,*fmt,field_width,precision,flags); - } - } else { - _double = (double)va_arg(args, double); - - if ( _isnan(_double) ) { - sw = L"Nan"; - len = 3; - while ( len > 0 ) { - putwc(*sw++,f); - len --; - } - } else if ( _isinf(_double) < 0 ) { - sw = L"-Inf"; - len = 4; - while ( len > 0 ) { - putwc(*sw++,f); - len --; - } - } else if ( _isinf(_double) > 0 ) { - sw = L"+Inf"; - len = 4; - while ( len > 0 ) { - putwc(*sw++,f); - len --; - } - } else { - if ( precision == -1 ) - precision = 6; - numberf(f,_double,*fmt,field_width,precision,flags); - } - } - continue; - - case L'p': - if (field_width == -1) { - field_width = 2*sizeof(void *); - flags |= ZEROPAD; - } - number(f, - (unsigned long) va_arg(args, void *), 16, - field_width, precision, flags); - continue; - - case L'n': - if (qualifier == L'l') { - long * ip = va_arg(args, long *); - *ip = 0; - } else { - int * ip = va_arg(args, int *); - *ip = 0; - } - continue; - - /* integer number formats - set up the flags and "break" */ - case L'o': - base = 8; - break; - - case L'b': - base = 2; - break; - - case L'X': - flags |= LARGE; - case L'x': - base = 16; - break; - - case L'd': - case L'i': - flags |= SIGN; - case L'u': - break; - - default: - if (*fmt != L'%') - putwc(L'%', f); - if (*fmt) - putwc(*fmt, f); - else - --fmt; - continue; - } - - if (qualifier == L'I') - num = va_arg(args, unsigned long long); - else if (qualifier == L'l') - num = va_arg(args, unsigned long); - else if (qualifier == L'h') { - if (flags & SIGN) - num = va_arg(args, int); - else - num = va_arg(args, unsigned int); - } - else if (flags & SIGN) - num = va_arg(args, int); - else - num = va_arg(args, unsigned int); - number(f, num, base, field_width, precision, flags); - } - //putwc(L'\0',f); - return 0; -} - -/* EOF */ diff --git a/reactos/lib/msvcrt/stdio/vfprintf.c b/reactos/lib/msvcrt/stdio/vfprintf.c index 4b5419659eb..61a58f08346 100644 --- a/reactos/lib/msvcrt/stdio/vfprintf.c +++ b/reactos/lib/msvcrt/stdio/vfprintf.c @@ -1071,8 +1071,12 @@ int __vfprintf(FILE *f, const char *fmt, va_list args) if (qualifier == 'I') num = va_arg(args, ULONGLONG); - else if (qualifier == 'l') - num = va_arg(args, unsigned long); + else if (qualifier == 'l') { + if (flags & SIGN) + num = va_arg(args, long); + else + num = va_arg(args, unsigned long); + } else if (qualifier == 'h') { if (flags & SIGN) num = va_arg(args, int); diff --git a/reactos/lib/msvcrt/stdio/vfwprint.c b/reactos/lib/msvcrt/stdio/vfwprint.c index 73b3bd061d2..c5971eb933e 100644 --- a/reactos/lib/msvcrt/stdio/vfwprint.c +++ b/reactos/lib/msvcrt/stdio/vfwprint.c @@ -1048,8 +1048,12 @@ int __vfwprintf(FILE *f, const wchar_t *fmt, va_list args) if (qualifier == L'I') num = va_arg(args, ULONGLONG); - else if (qualifier == L'l') - num = va_arg(args, unsigned long); + else if (qualifier == L'l') { + if (flags & SIGN) + num = va_arg(args, long); + else + num = va_arg(args, unsigned long); + } else if (qualifier == L'h') { if (flags & SIGN) num = va_arg(args, int); diff --git a/reactos/lib/ntdll/stdio/sprintf.c b/reactos/lib/ntdll/stdio/sprintf.c index b55d3d25106..d7dbf2181f1 100644 --- a/reactos/lib/ntdll/stdio/sprintf.c +++ b/reactos/lib/ntdll/stdio/sprintf.c @@ -1,4 +1,4 @@ -/* $Id: sprintf.c,v 1.14 2004/01/10 14:22:14 hbirr Exp $ +/* $Id: sprintf.c,v 1.15 2004/06/15 08:53:53 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -485,8 +485,12 @@ int _vsnprintf(char *buf, size_t cnt, const char *fmt, va_list args) if (qualifier == 'I') num = va_arg(args, unsigned long long); - else if (qualifier == 'l') - num = va_arg(args, unsigned long); + else if (qualifier == 'l') { + if (flags & SIGN) + num = va_arg(args, long); + else + num = va_arg(args, unsigned long); + } else if (qualifier == 'h') { if (flags & SIGN) num = va_arg(args, int); diff --git a/reactos/lib/ntdll/stdio/swprintf.c b/reactos/lib/ntdll/stdio/swprintf.c index 1552221771b..128450350aa 100644 --- a/reactos/lib/ntdll/stdio/swprintf.c +++ b/reactos/lib/ntdll/stdio/swprintf.c @@ -1,4 +1,4 @@ -/* $Id: swprintf.c,v 1.17 2004/02/01 20:48:06 ekohl Exp $ +/* $Id: swprintf.c,v 1.18 2004/06/15 08:53:53 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -320,10 +320,10 @@ int _vsnwprintf(wchar_t *buf, size_t cnt, const wchar_t *fmt, va_list args) /* get the conversion qualifier */ qualifier = -1; - if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' || *fmt == 'w') { + if (*fmt == L'h' || *fmt == L'l' || *fmt == L'L' || *fmt == L'w') { qualifier = *fmt; ++fmt; - } else if (*fmt == 'I' && *(fmt+1) == '6' && *(fmt+2) == '4') { + } else if (*fmt == L'I' && *(fmt+1) == L'6' && *(fmt+2) == L'4') { qualifier = *fmt; fmt += 3; } @@ -485,11 +485,15 @@ int _vsnwprintf(wchar_t *buf, size_t cnt, const wchar_t *fmt, va_list args) continue; } - if (qualifier == 'I') + if (qualifier == L'I') num = va_arg(args, unsigned long long); - else if (qualifier == 'l') - num = va_arg(args, unsigned long); - else if (qualifier == 'h') { + else if (qualifier == L'l') { + if (flags & SIGN) + num = va_arg(args, long); + else + num = va_arg(args, unsigned long); + } + else if (qualifier == L'h') { if (flags & SIGN) num = va_arg(args, int); else diff --git a/reactos/ntoskrnl/rtl/sprintf.c b/reactos/ntoskrnl/rtl/sprintf.c index f1e44592e69..16e46cce98b 100644 --- a/reactos/ntoskrnl/rtl/sprintf.c +++ b/reactos/ntoskrnl/rtl/sprintf.c @@ -1,4 +1,4 @@ -/* $Id: sprintf.c,v 1.16 2004/01/10 14:22:14 hbirr Exp $ +/* $Id: sprintf.c,v 1.17 2004/06/15 08:53:53 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -523,8 +523,12 @@ int _vsnprintf(char *buf, size_t cnt, const char *fmt, va_list args) #else num = va_arg(args, unsigned __int64); #endif - else if (qualifier == 'l') - num = va_arg(args, unsigned long); + else if (qualifier == 'l') { + if (flags & SIGN) + num = va_arg(args, long); + else + num = va_arg(args, unsigned long); + } else if (qualifier == 'h') { if (flags & SIGN) num = va_arg(args, int); diff --git a/reactos/ntoskrnl/rtl/swprintf.c b/reactos/ntoskrnl/rtl/swprintf.c index 9f54433cf53..d60748d2fee 100644 --- a/reactos/ntoskrnl/rtl/swprintf.c +++ b/reactos/ntoskrnl/rtl/swprintf.c @@ -1,4 +1,4 @@ -/* $Id: swprintf.c,v 1.14 2004/01/10 14:22:14 hbirr Exp $ +/* $Id: swprintf.c,v 1.15 2004/06/15 08:53:53 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -343,10 +343,10 @@ int _vsnwprintf(wchar_t *buf, size_t cnt, const wchar_t *fmt, va_list args) /* get the conversion qualifier */ qualifier = -1; - if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' || *fmt == 'w') { + if (*fmt == L'h' || *fmt == L'l' || *fmt == L'L' || *fmt == L'w') { qualifier = *fmt; ++fmt; - } else if (*fmt == 'I' && *(fmt+1) == '6' && *(fmt+2) == '4') { + } else if (*fmt == L'I' && *(fmt+1) == L'6' && *(fmt+2) == L'4') { qualifier = *fmt; fmt += 3; } @@ -508,11 +508,15 @@ int _vsnwprintf(wchar_t *buf, size_t cnt, const wchar_t *fmt, va_list args) continue; } - if (qualifier == 'I') + if (qualifier == L'I') num = va_arg(args, SWPRINT_UINT64); - else if (qualifier == 'l') - num = va_arg(args, unsigned long); - else if (qualifier == 'h') { + else if (qualifier == L'l') { + if (flags & SIGN) + num = va_arg(args, long); + else + num = va_arg(args, unsigned long); + } + else if (qualifier == L'h') { if (flags & SIGN) num = va_arg(args, int); else From cfef139c5b248009ceb3ba83fb14cca4d8e6c7e7 Mon Sep 17 00:00:00 2001 From: Hartmut Birr <osexpert@googlemail.com> Date: Tue, 15 Jun 2004 09:29:41 +0000 Subject: [PATCH 1385/1463] - Reduced the size of the necessary inquiry data length to recognize a device as valid. svn path=/trunk/; revision=9672 --- reactos/drivers/storage/scsiport/scsiport.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/reactos/drivers/storage/scsiport/scsiport.c b/reactos/drivers/storage/scsiport/scsiport.c index efe264a53c8..996b2988256 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.60 2004/06/10 08:14:57 hbirr Exp $ +/* $Id: scsiport.c,v 1.61 2004/06/15 09:29:41 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -32,6 +32,7 @@ #include <ddk/srb.h> #include <ddk/scsi.h> #include <ddk/ntddscsi.h> +#include <ntos/minmax.h> #include <rosrtl/string.h> #define NDEBUG @@ -2041,13 +2042,13 @@ 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 >= sizeof(INQUIRYDATA))) && + Srb->DataTransferLength >= INQUIRYDATABUFFERSIZE)) && ((PINQUIRYDATA)Srb->DataBuffer)->DeviceTypeQualifier == 0) { /* Copy inquiry data */ RtlCopyMemory (&ScanData->LunExtension->InquiryData, Srb->DataBuffer, - sizeof(INQUIRYDATA)); + min(sizeof(INQUIRYDATA), Srb->DataTransferLength)); ScanData->Lun++; } else From 2fbcaac90d4098e5b16829c56a833abca435be35 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Tue, 15 Jun 2004 12:22:19 +0000 Subject: [PATCH 1386/1463] Detect floppy disk drives. svn path=/trunk/; revision=9673 --- freeldr/freeldr/arch/i386/hardware.c | 275 ++++++++++++++++++++++++++- freeldr/freeldr/arch/i386/i386disk.c | 2 +- 2 files changed, 271 insertions(+), 6 deletions(-) diff --git a/freeldr/freeldr/arch/i386/hardware.c b/freeldr/freeldr/arch/i386/hardware.c index 11e1a6c1418..e467107ed3b 100644 --- a/freeldr/freeldr/arch/i386/hardware.c +++ b/freeldr/freeldr/arch/i386/hardware.c @@ -139,7 +139,32 @@ typedef struct _CM_SERIAL_DEVICE_DATA U16 Version; U16 Revision; U32 BaudClock; -} CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA; +} __attribute__((packed)) CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA; + + +typedef struct _CM_FLOPPY_DEVICE_DATA +{ + U16 Version; + U16 Revision; + CHAR Size[8]; + U32 MaxDensity; + U32 MountDensity; + + /* Version 2.0 data */ + U8 StepRateHeadUnloadTime; + U8 HeadLoadTime; + U8 MotorOffTime; + U8 SectorLengthCode; + U8 SectorPerTrack; + U8 ReadWriteGapLength; + U8 DataTransferLength; + U8 FormatGapLength; + U8 FormatFillCharacter; + U8 HeadSettleTime; + U8 MotorSettleTime; + U8 MaximumTrackValue; + U8 DataTransferRate; +} __attribute__((packed)) CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA; static char Hex[] = "0123456789ABCDEF"; @@ -700,6 +725,248 @@ DetectBiosDisks(HKEY SystemKey, } +static U32 +GetFloppyCount(VOID) +{ + U8 Data; + + WRITE_PORT_UCHAR((PUCHAR)0x70, 0x10); + Data = READ_PORT_UCHAR((PUCHAR)0x71); + + return ((Data & 0xF0) ? 1 : 0) + ((Data & 0x0F) ? 1 : 0); +} + + +static U8 +GetFloppyType(U8 DriveNumber) +{ + U8 Data; + + WRITE_PORT_UCHAR((PUCHAR)0x70, 0x10); + Data = READ_PORT_UCHAR((PUCHAR)0x71); + + if (DriveNumber == 0) + return Data >> 4; + else if (DriveNumber == 1) + return Data & 0x0F; + + return 0; +} + + +static PVOID +GetInt1eTable(VOID) +{ + PU16 SegPtr = (PU16)0x7A; + PU16 OfsPtr = (PU16)0x78; + + return (PVOID)(((U32)(*SegPtr)) << 4) + (U32)(*OfsPtr); +} + + +static VOID +DetectBiosFloppyPeripheral(HKEY ControllerKey) +{ + PCM_FULL_RESOURCE_DESCRIPTOR FullResourceDescriptor; + PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor; + PCM_FLOPPY_DEVICE_DATA FloppyData; + char KeyName[32]; + char Identifier[20]; + HKEY PeripheralKey; + U32 Size; + S32 Error; + U32 FloppyNumber; + U8 FloppyType; + U32 MaxDensity[6] = {0, 360, 1200, 720, 1440, 2880}; + PU8 Ptr; + + for (FloppyNumber = 0; FloppyNumber < 2; FloppyNumber++) + { + FloppyType = GetFloppyType(FloppyNumber); + + if ((FloppyType > 5) || (FloppyType == 0)) + continue; + + DiskResetController(FloppyNumber); + + Ptr = GetInt1eTable(); + + sprintf(KeyName, "FloppyDiskPeripheral\\%u", FloppyNumber); + + Error = RegCreateKey(ControllerKey, + "FloppyDiskPeripheral\\0", + &PeripheralKey); + if (Error != ERROR_SUCCESS) + { + DbgPrint((DPRINT_HWDETECT, "Failed to create peripheral key\n")); + return; + } + + DbgPrint((DPRINT_HWDETECT, "Created key: %s\n", KeyName)); + + /* Set 'ComponentInformation' value */ + SetComponentInformation(PeripheralKey, + 0x0, + FloppyNumber, + 0xFFFFFFFF); + + Size = sizeof(CM_FULL_RESOURCE_DESCRIPTOR) + + sizeof(CM_FLOPPY_DEVICE_DATA); + FullResourceDescriptor = MmAllocateMemory(Size); + if (FullResourceDescriptor == NULL) + { + DbgPrint((DPRINT_HWDETECT, + "Failed to allocate resource descriptor\n")); + return; + } + + memset(FullResourceDescriptor, 0, Size); + FullResourceDescriptor->InterfaceType = Isa; + FullResourceDescriptor->BusNumber = 0; + FullResourceDescriptor->PartialResourceList.Count = 1; + + PartialDescriptor = &FullResourceDescriptor->PartialResourceList.PartialDescriptors[0]; + PartialDescriptor->Type = CmResourceTypeDeviceSpecific; + PartialDescriptor->ShareDisposition = CmResourceShareUndetermined; + PartialDescriptor->u.DeviceSpecificData.DataSize = sizeof(CM_FLOPPY_DEVICE_DATA); + + FloppyData = ((PVOID)FullResourceDescriptor) + sizeof(CM_FULL_RESOURCE_DESCRIPTOR); + FloppyData->Version = 2; + FloppyData->Revision = 0; + FloppyData->MaxDensity = MaxDensity[FloppyType]; + FloppyData->MountDensity = 0; + RtlCopyMemory(&FloppyData->StepRateHeadUnloadTime, + Ptr, + 11); + FloppyData->MaximumTrackValue = (FloppyType == 1) ? 39 : 79; + FloppyData->DataTransferRate = 0; + + /* Set 'Configuration Data' value */ + Error = RegSetValue(PeripheralKey, + "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)); + return; + } + + /* Set 'Identifier' value */ + sprintf(Identifier, "FLOPPY%u", FloppyNumber + 1); + Error = RegSetValue(PeripheralKey, + "Identifier", + REG_SZ, + (PU8)Identifier, + strlen(Identifier) + 1); + if (Error != ERROR_SUCCESS) + { + DbgPrint((DPRINT_HWDETECT, + "RegSetValue() failed (Error %u)\n", + (int)Error)); + } + } +} + + +static VOID +DetectBiosFloppyController(HKEY SystemKey, + HKEY BusKey) +{ + PCM_FULL_RESOURCE_DESCRIPTOR FullResourceDescriptor; + PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor; + HKEY ControllerKey; + U32 Size; + S32 Error; + U32 FloppyCount; + + FloppyCount = GetFloppyCount(); + printf ("Floppy count: %u\n", FloppyCount); + + if (FloppyCount == 0) + return; + + Error = RegCreateKey(BusKey, + "DiskController\\0", + &ControllerKey); + if (Error != ERROR_SUCCESS) + { + DbgPrint((DPRINT_HWDETECT, "Failed to create controller key\n")); + return; + } + + DbgPrint((DPRINT_HWDETECT, "Created key: DiskController\\0\n")); + + /* Set 'ComponentInformation' value */ + SetComponentInformation(ControllerKey, + 0x64, + 0, + 0xFFFFFFFF); + + Size = sizeof(CM_FULL_RESOURCE_DESCRIPTOR) + + 2 * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); + FullResourceDescriptor = MmAllocateMemory(Size); + if (FullResourceDescriptor == NULL) + { + DbgPrint((DPRINT_HWDETECT, + "Failed to allocate resource descriptor\n")); + return; + } + memset(FullResourceDescriptor, 0, Size); + + /* Initialize resource descriptor */ + FullResourceDescriptor->InterfaceType = Isa; + FullResourceDescriptor->BusNumber = 0; + FullResourceDescriptor->PartialResourceList.Count = 3; + + /* 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)0x03F0; + PartialDescriptor->u.Port.Length = 8; + + /* Set Interrupt */ + PartialDescriptor = &FullResourceDescriptor->PartialResourceList.PartialDescriptors[1]; + PartialDescriptor->Type = CmResourceTypeInterrupt; + PartialDescriptor->ShareDisposition = CmResourceShareUndetermined; + PartialDescriptor->Flags = CM_RESOURCE_INTERRUPT_LATCHED; + PartialDescriptor->u.Interrupt.Level = 6; + PartialDescriptor->u.Interrupt.Vector = 6; + PartialDescriptor->u.Interrupt.Affinity = 0xFFFFFFFF; + + /* Set DMA channel */ + PartialDescriptor = &FullResourceDescriptor->PartialResourceList.PartialDescriptors[2]; + PartialDescriptor->Type = CmResourceTypeDma; + PartialDescriptor->ShareDisposition = CmResourceShareUndetermined; + PartialDescriptor->Flags = 0; + PartialDescriptor->u.Dma.Channel = 2; + PartialDescriptor->u.Dma.Port = 0; + + /* 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)); + return; + } + + DetectBiosFloppyPeripheral(ControllerKey); +} + + static VOID InitializeSerialPort(U32 Port, U32 LineControl) @@ -722,7 +989,7 @@ DetectSerialMouse(U32 Port) U32 TimeOut = 200; U8 LineControl; - /* Shutdown mouse or something like that */ + /* Shutdown mouse or something like that */ LineControl = READ_PORT_UCHAR((PUCHAR)Port + 4); WRITE_PORT_UCHAR((PUCHAR)Port + 4, (LineControl & ~0x02) | 0x01); KeStallExecutionProcessor(100000); @@ -1485,9 +1752,7 @@ DetectIsaBios(HKEY SystemKey, U32 *BusNumber) /* Detect ISA/BIOS devices */ DetectBiosDisks(SystemKey, BusKey); -#if 0 - DetectBiosFloppyDisks(SystemKey, BusKey); -#endif + DetectBiosFloppyController(SystemKey, BusKey); DetectSerialPorts(BusKey); diff --git a/freeldr/freeldr/arch/i386/i386disk.c b/freeldr/freeldr/arch/i386/i386disk.c index d9ece39184c..a47e98ef10c 100644 --- a/freeldr/freeldr/arch/i386/i386disk.c +++ b/freeldr/freeldr/arch/i386/i386disk.c @@ -284,7 +284,7 @@ BOOL DiskResetController(U32 DriveNumber) // AH = status // CF clear if successful // CF set on error - RegsIn.b.ah = 0x02; + RegsIn.b.ah = 0x00; RegsIn.b.dl = DriveNumber; // Reset the disk controller From 3cca4fd859e7ec0f246593a44f68464abfcf78d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Tue, 15 Jun 2004 22:33:47 +0000 Subject: [PATCH 1387/1463] Build "new" floppy driver instead of non-functional "old" one svn path=/trunk/; revision=9674 --- reactos/Makefile | 8 ++++---- reactos/drivers/storage/floppy/GNUmakefile | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/reactos/Makefile b/reactos/Makefile index 2caae3d00b9..547e13a4db3 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.230 2004/06/07 17:31:50 navaraf Exp $ +# $Id: Makefile,v 1.231 2004/06/15 22:33:45 gvg Exp $ # # Global makefile # @@ -64,12 +64,12 @@ LOADERS = dos # Driver support libraries #bzip2 zlib oskittcp -DRIVERS_LIB = bzip2 oskittcp +DRIVERS_LIB = bzip2 oskittcp csq # Kernel mode device drivers # Obsolete: ide # beep blue floppy null parallel ramdrv serenum serial -DEVICE_DRIVERS = beep blue debugout floppy null serial bootvid +DEVICE_DRIVERS = beep blue debugout null serial bootvid # Kernel mode input drivers INPUT_DRIVERS = keyboard mouclass psaux sermouse @@ -88,7 +88,7 @@ NET_DEVICE_DRIVERS = ne2000 pcnet # Kernel mode storage drivers # atapi cdrom class2 disk scsiport -STORAGE_DRIVERS = atapi cdrom class2 disk scsiport diskdump +STORAGE_DRIVERS = atapi cdrom class2 disk floppy scsiport diskdump # System applications # autochk cmd format services setup usetup welcome winlogon diff --git a/reactos/drivers/storage/floppy/GNUmakefile b/reactos/drivers/storage/floppy/GNUmakefile index 0b774a5d644..e0e702133ce 100644 --- a/reactos/drivers/storage/floppy/GNUmakefile +++ b/reactos/drivers/storage/floppy/GNUmakefile @@ -23,6 +23,7 @@ # 15-Feb-2004 vizzini - Created/ PATH_TO_TOP = ../../.. +TARGET_BOOTSTRAP = yes TARGET_TYPE = driver TARGET_NAME = floppy TARGET_CFLAGS = -Wall -Werror From fbfd3a482042938eb4298add090ba2fc4361896e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Wed, 16 Jun 2004 06:09:40 +0000 Subject: [PATCH 1388/1463] Marshall WM_CREATE/WM_NCCREATE messages svn path=/trunk/; revision=9675 --- reactos/lib/user32/windows/message.c | 32 +++- reactos/subsys/win32k/include/cleanup.h | 6 + reactos/subsys/win32k/ntuser/callback.c | 36 ++-- reactos/subsys/win32k/ntuser/message.c | 114 ++++++++++-- reactos/subsys/win32k/ntuser/misc.c | 34 +++- reactos/subsys/win32k/ntuser/window.c | 224 ++++++++++++++++-------- 6 files changed, 332 insertions(+), 114 deletions(-) diff --git a/reactos/lib/user32/windows/message.c b/reactos/lib/user32/windows/message.c index b46f5af9604..e2f074b2d5a 100644 --- a/reactos/lib/user32/windows/message.c +++ b/reactos/lib/user32/windows/message.c @@ -1,4 +1,4 @@ -/* $Id: message.c,v 1.39 2004/04/29 21:13:16 gvg Exp $ +/* $Id: message.c,v 1.40 2004/06/16 06:09:40 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -17,6 +17,11 @@ #define NTOS_MODE_USER #include <ntos.h> +#ifndef TODO +#define NDEBUG +#include <debug.h> +#endif + /* DDE message exchange * * - Session initialization @@ -257,6 +262,27 @@ MsgiKMToUMMessage(PMSG KMMsg, PMSG UMMsg) switch (UMMsg->message) { + case WM_CREATE: + case WM_NCCREATE: + { + CREATESTRUCTW *Cs = (CREATESTRUCTW *) KMMsg->lParam; + PCHAR Class; + Cs->lpszName = (LPCWSTR) ((PCHAR) Cs + (DWORD_PTR) Cs->lpszName); + Class = (PCHAR) Cs + (DWORD_PTR) Cs->lpszClass; + if (L'A' == *((WCHAR *) Class)) + { + Class += sizeof(WCHAR); + Cs->lpszClass = (LPCWSTR)(DWORD_PTR) (*((ATOM *) Class)); + } + else + { + ASSERT(L'S' == *((WCHAR *) Class)); + Class += sizeof(WCHAR); + Cs->lpszClass = (LPCWSTR) Class; + } + } + break; + case WM_DDE_ACK: { PKMDDELPARAM DdeLparam = (PKMDDELPARAM) KMMsg->lParam; @@ -270,8 +296,9 @@ MsgiKMToUMMessage(PMSG KMMsg, PMSG UMMsg) { UMMsg->lParam = DdeLparam->Value.Unpacked; } - break; } + break; + case WM_DDE_EXECUTE: { PKMDDEEXECUTEDATA KMDdeExecuteData; @@ -301,6 +328,7 @@ MsgiKMToUMMessage(PMSG KMMsg, PMSG UMMsg) UMMsg->lParam = (LPARAM) GlobalData; } break; + default: break; } diff --git a/reactos/subsys/win32k/include/cleanup.h b/reactos/subsys/win32k/include/cleanup.h index 6ceb9166f8b..46d6496e2ea 100644 --- a/reactos/subsys/win32k/include/cleanup.h +++ b/reactos/subsys/win32k/include/cleanup.h @@ -11,4 +11,10 @@ NTSTATUS FASTCALL IntSafeCopyUnicodeStringTerminateNULL(PUNICODE_STRING Dest, PUNICODE_STRING Source); +NTSTATUS FASTCALL +IntUnicodeStringToNULLTerminated(PWSTR *Dest, PUNICODE_STRING Src); + +void FASTCALL +IntFreeNULLTerminatedFromUnicodeString(PWSTR NullTerminated, PUNICODE_STRING UnicodeString); + #endif /* ndef _SUBSYS_WIN32K_INCLUDE_CLEANUP_H */ diff --git a/reactos/subsys/win32k/ntuser/callback.c b/reactos/subsys/win32k/ntuser/callback.c index 3b254fc87c5..143690fad4c 100644 --- a/reactos/subsys/win32k/ntuser/callback.c +++ b/reactos/subsys/win32k/ntuser/callback.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: callback.c,v 1.23 2004/05/22 21:12:15 weiden Exp $ +/* $Id: callback.c,v 1.24 2004/06/16 06:09:40 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -250,6 +250,8 @@ IntCallHookProc(INT HookId, CBT_CREATEWNDW *CbtCreateWnd; PCHAR Extra; PHOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS CbtCreatewndExtra; + PUNICODE_STRING WindowName; + PUNICODE_STRING ClassName; ArgumentLength = sizeof(HOOKPROC_CALLBACK_ARGUMENTS) - sizeof(WCHAR) + ModuleName->Length; @@ -261,15 +263,12 @@ IntCallHookProc(INT HookId, case HCBT_CREATEWND: CbtCreateWnd = (CBT_CREATEWNDW *) lParam; ArgumentLength += sizeof(HOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS); - if (NULL != CbtCreateWnd->lpcs->lpszName) + WindowName = (PUNICODE_STRING) (CbtCreateWnd->lpcs->lpszName); + ArgumentLength += WindowName->Length + sizeof(WCHAR); + ClassName = (PUNICODE_STRING) (CbtCreateWnd->lpcs->lpszClass); + if (! IS_ATOM(ClassName->Buffer)) { - ArgumentLength += (wcslen(CbtCreateWnd->lpcs->lpszName) - + 1) * sizeof(WCHAR); - } - if (0 != HIWORD(CbtCreateWnd->lpcs->lpszClass)) - { - ArgumentLength += (wcslen(CbtCreateWnd->lpcs->lpszClass) - + 1) * sizeof(WCHAR); + ArgumentLength += ClassName->Length + sizeof(WCHAR); } break; default: @@ -310,19 +309,18 @@ IntCallHookProc(INT HookId, CbtCreatewndExtra->Cs = *(CbtCreateWnd->lpcs); CbtCreatewndExtra->WndInsertAfter = CbtCreateWnd->hwndInsertAfter; Extra = (PCHAR) (CbtCreatewndExtra + 1); - if (NULL != CbtCreateWnd->lpcs->lpszName) + RtlCopyMemory(Extra, WindowName->Buffer, WindowName->Length); + CbtCreatewndExtra->Cs.lpszName = (LPCWSTR) (Extra - (PCHAR) CbtCreatewndExtra); + Extra += WindowName->Length; + *((WCHAR *) Extra) = L'\0'; + Extra += sizeof(WCHAR); + if (! IS_ATOM(ClassName->Buffer)) { - memcpy(Extra, CbtCreateWnd->lpcs->lpszName, - (wcslen(CbtCreateWnd->lpcs->lpszName) + 1) * sizeof(WCHAR)); - CbtCreatewndExtra->Cs.lpszName = (LPCWSTR) (Extra - (PCHAR) CbtCreatewndExtra); - Extra += (wcslen(CbtCreateWnd->lpcs->lpszName) + 1) * sizeof(WCHAR); - } - if (0 != HIWORD(CbtCreateWnd->lpcs->lpszClass)) - { - memcpy(Extra, CbtCreateWnd->lpcs->lpszClass, - (wcslen(CbtCreateWnd->lpcs->lpszClass) + 1) * sizeof(WCHAR)); + RtlCopyMemory(Extra, ClassName->Buffer, ClassName->Length); CbtCreatewndExtra->Cs.lpszClass = (LPCWSTR) MAKELONG(Extra - (PCHAR) CbtCreatewndExtra, 1); + Extra += ClassName->Length; + *((WCHAR *) Extra) = L'\0'; } break; } diff --git a/reactos/subsys/win32k/ntuser/message.c b/reactos/subsys/win32k/ntuser/message.c index 42cc2eec8b5..8d9ebf17a75 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.69 2004/05/22 21:12:15 weiden Exp $ +/* $Id: message.c,v 1.70 2004/06/16 06:09:40 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -71,13 +71,13 @@ typedef struct tagMSGMEMORY static MSGMEMORY MsgMemory[] = { - { WM_CREATE, sizeof(CREATESTRUCTW), MMS_FLAG_READWRITE }, + { WM_CREATE, MMS_SIZE_SPECIAL, MMS_FLAG_READWRITE }, { WM_DDE_ACK, sizeof(KMDDELPARAM), MMS_FLAG_READ }, { WM_DDE_EXECUTE, MMS_SIZE_WPARAM, MMS_FLAG_READ }, { WM_GETMINMAXINFO, sizeof(MINMAXINFO), MMS_FLAG_READWRITE }, { WM_GETTEXT, MMS_SIZE_WPARAMWCHAR, MMS_FLAG_WRITE }, { WM_NCCALCSIZE, MMS_SIZE_SPECIAL, MMS_FLAG_READWRITE }, - { WM_NCCREATE, sizeof(CREATESTRUCTW), MMS_FLAG_READWRITE }, + { WM_NCCREATE, MMS_SIZE_SPECIAL, MMS_FLAG_READWRITE }, { WM_SETTEXT, MMS_SIZE_LPARAMSZ, MMS_FLAG_READ }, { WM_STYLECHANGED, sizeof(STYLESTRUCT), MMS_FLAG_READ }, { WM_STYLECHANGING, sizeof(STYLESTRUCT), MMS_FLAG_READWRITE }, @@ -107,6 +107,11 @@ FindMsgMemory(UINT Msg) static UINT FASTCALL MsgMemorySize(PMSGMEMORY MsgMemoryEntry, WPARAM wParam, LPARAM lParam) { + CREATESTRUCTW *Cs; + PUNICODE_STRING WindowName; + PUNICODE_STRING ClassName; + UINT Size; + if (MMS_SIZE_WPARAM == MsgMemoryEntry->Size) { return (UINT) wParam; @@ -123,9 +128,27 @@ MsgMemorySize(PMSGMEMORY MsgMemoryEntry, WPARAM wParam, LPARAM lParam) { switch(MsgMemoryEntry->Message) { + case WM_CREATE: + case WM_NCCREATE: + Cs = (CREATESTRUCTW *) lParam; + WindowName = (PUNICODE_STRING) Cs->lpszName; + ClassName = (PUNICODE_STRING) Cs->lpszClass; + Size = sizeof(CREATESTRUCTW) + WindowName->Length + sizeof(WCHAR); + if (IS_ATOM(ClassName->Buffer)) + { + Size += sizeof(WCHAR) + sizeof(ATOM); + } + else + { + Size += sizeof(WCHAR) + ClassName->Length + sizeof(WCHAR); + } + return Size; + break; + case WM_NCCALCSIZE: return wParam ? sizeof(NCCALCSIZE_PARAMS) + sizeof(WINDOWPOS) : sizeof(RECT); break; + default: assert(FALSE); return 0; @@ -141,29 +164,82 @@ MsgMemorySize(PMSGMEMORY MsgMemoryEntry, WPARAM wParam, LPARAM lParam) static FASTCALL NTSTATUS PackParam(LPARAM *lParamPacked, UINT Msg, WPARAM wParam, LPARAM lParam) { - NCCALCSIZE_PARAMS *UnpackedParams; - NCCALCSIZE_PARAMS *PackedParams; + NCCALCSIZE_PARAMS *UnpackedNcCalcsize; + NCCALCSIZE_PARAMS *PackedNcCalcsize; + CREATESTRUCTW *UnpackedCs; + CREATESTRUCTW *PackedCs; + PUNICODE_STRING WindowName; + PUNICODE_STRING ClassName; + UINT Size; + PCHAR CsData; *lParamPacked = lParam; if (WM_NCCALCSIZE == Msg && wParam) { - UnpackedParams = (NCCALCSIZE_PARAMS *) lParam; - if (UnpackedParams->lppos != (PWINDOWPOS) (UnpackedParams + 1)) + UnpackedNcCalcsize = (NCCALCSIZE_PARAMS *) lParam; + if (UnpackedNcCalcsize->lppos != (PWINDOWPOS) (UnpackedNcCalcsize + 1)) { - PackedParams = ExAllocatePoolWithTag(PagedPool, - sizeof(NCCALCSIZE_PARAMS) + sizeof(WINDOWPOS), - TAG_MSG); - if (NULL == PackedParams) + PackedNcCalcsize = ExAllocatePoolWithTag(PagedPool, + sizeof(NCCALCSIZE_PARAMS) + sizeof(WINDOWPOS), + TAG_MSG); + if (NULL == PackedNcCalcsize) { DPRINT1("Not enough memory to pack lParam\n"); return STATUS_NO_MEMORY; } - RtlCopyMemory(PackedParams, UnpackedParams, sizeof(NCCALCSIZE_PARAMS)); - PackedParams->lppos = (PWINDOWPOS) (PackedParams + 1); - RtlCopyMemory(PackedParams->lppos, UnpackedParams->lppos, sizeof(WINDOWPOS)); - *lParamPacked = (LPARAM) PackedParams; + RtlCopyMemory(PackedNcCalcsize, UnpackedNcCalcsize, sizeof(NCCALCSIZE_PARAMS)); + PackedNcCalcsize->lppos = (PWINDOWPOS) (PackedNcCalcsize + 1); + RtlCopyMemory(PackedNcCalcsize->lppos, UnpackedNcCalcsize->lppos, sizeof(WINDOWPOS)); + *lParamPacked = (LPARAM) PackedNcCalcsize; } } + else if (WM_CREATE == Msg || WM_NCCREATE == Msg) + { + UnpackedCs = (CREATESTRUCTW *) lParam; + WindowName = (PUNICODE_STRING) UnpackedCs->lpszName; + ClassName = (PUNICODE_STRING) UnpackedCs->lpszClass; + Size = sizeof(CREATESTRUCTW) + WindowName->Length + sizeof(WCHAR); + if (IS_ATOM(ClassName->Buffer)) + { + Size += sizeof(WCHAR) + sizeof(ATOM); + } + else + { + Size += sizeof(WCHAR) + ClassName->Length + sizeof(WCHAR); + } + PackedCs = ExAllocatePoolWithTag(PagedPool, Size, TAG_MSG); + if (NULL == PackedCs) + { + DPRINT1("Not enough memory to pack lParam\n"); + return STATUS_NO_MEMORY; + } + RtlCopyMemory(PackedCs, UnpackedCs, sizeof(CREATESTRUCTW)); + CsData = (PCHAR) (PackedCs + 1); + PackedCs->lpszName = (LPCWSTR) (CsData - (PCHAR) PackedCs); + RtlCopyMemory(CsData, WindowName->Buffer, WindowName->Length); + CsData += WindowName->Length; + *((WCHAR *) CsData) = L'\0'; + CsData += sizeof(WCHAR); + PackedCs->lpszClass = (LPCWSTR) (CsData - (PCHAR) PackedCs); + if (IS_ATOM(ClassName->Buffer)) + { + *((WCHAR *) CsData) = L'A'; + CsData += sizeof(WCHAR); + *((ATOM *) CsData) = (ATOM)(DWORD_PTR) ClassName->Buffer; + CsData += sizeof(ATOM); + } + else + { + *((WCHAR *) CsData) = L'S'; + CsData += sizeof(WCHAR); + RtlCopyMemory(CsData, ClassName->Buffer, ClassName->Length); + CsData += ClassName->Length; + *((WCHAR *) CsData) = L'\0'; + CsData += sizeof(WCHAR); + } + ASSERT(CsData == (PCHAR) PackedCs + Size); + *lParamPacked = (LPARAM) PackedCs; + } return STATUS_SUCCESS; } @@ -192,8 +268,14 @@ UnpackParam(LPARAM lParamPacked, UINT Msg, WPARAM wParam, LPARAM lParam) return STATUS_SUCCESS; } + else if (WM_CREATE == Msg || WM_NCCREATE == Msg) + { + ExFreePool((PVOID) lParamPacked); - assert(FALSE); + return STATUS_SUCCESS; + } + + ASSERT(FALSE); return STATUS_INVALID_PARAMETER; } diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index 68cfe18e24b..0e06f30da1a 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.77 2004/06/11 20:15:07 gvg Exp $ +/* $Id: misc.c,v 1.78 2004/06/16 06:09:40 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1210,3 +1210,35 @@ IntSafeCopyUnicodeStringTerminateNULL(PUNICODE_STRING Dest, return STATUS_SUCCESS; } +NTSTATUS FASTCALL +IntUnicodeStringToNULLTerminated(PWSTR *Dest, PUNICODE_STRING Src) +{ + if (Src->Length + sizeof(WCHAR) <= Src->MaximumLength + && L'\0' == Src->Buffer[Src->Length / sizeof(WCHAR)]) + { + /* The unicode_string is already nul terminated. Just reuse it. */ + *Dest = Src->Buffer; + return STATUS_SUCCESS; + } + + *Dest = ExAllocatePoolWithTag(PagedPool, Src->Length + sizeof(WCHAR), TAG_STRING); + if (NULL == *Dest) + { + return STATUS_NO_MEMORY; + } + RtlCopyMemory(*Dest, Src->Buffer, Src->Length); + (*Dest)[Src->Length / 2] = L'\0'; + + return STATUS_SUCCESS; +} + +void FASTCALL +IntFreeNULLTerminatedFromUnicodeString(PWSTR NullTerminated, PUNICODE_STRING UnicodeString) +{ + if (NullTerminated != UnicodeString->Buffer) + { + ExFreePool(NullTerminated); + } +} + +/* EOF */ diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 5af359c5efd..ffdd0fc880b 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.236 2004/05/27 11:47:42 weiden Exp $ +/* $Id: window.c,v 1.237 2004/06/16 06:09:40 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1383,20 +1383,20 @@ IntCalcDefPosSize(PWINDOW_OBJECT Parent, PWINDOW_OBJECT WindowObject, RECT *rc, * @implemented */ HWND STDCALL -NtUserCreateWindowEx(DWORD dwExStyle, - PUNICODE_STRING lpClassName, - PUNICODE_STRING lpWindowName, - DWORD dwStyle, - LONG x, - LONG y, - LONG nWidth, - LONG nHeight, - HWND hWndParent, - HMENU hMenu, - HINSTANCE hInstance, - LPVOID lpParam, - DWORD dwShowMode, - BOOL bUnicodeWindow) +IntCreateWindowEx(DWORD dwExStyle, + PUNICODE_STRING ClassName, + PUNICODE_STRING WindowName, + DWORD dwStyle, + LONG x, + LONG y, + LONG nWidth, + LONG nHeight, + HWND hWndParent, + HMENU hMenu, + HINSTANCE hInstance, + LPVOID lpParam, + DWORD dwShowMode, + BOOL bUnicodeWindow) { PWINSTATION_OBJECT WinStaObject; PWNDCLASS_OBJECT ClassObject; @@ -1405,7 +1405,6 @@ NtUserCreateWindowEx(DWORD dwExStyle, HWND ParentWindowHandle; HWND OwnerWindowHandle; PMENU_OBJECT SystemMenu; - UNICODE_STRING WindowName; NTSTATUS Status; HANDLE Handle; POINT Pos; @@ -1420,44 +1419,7 @@ NtUserCreateWindowEx(DWORD dwExStyle, LRESULT Result; BOOL MenuChanged; BOOL ClassFound; - LPWSTR OrigWindowName = NULL; - - DPRINT("NtUserCreateWindowEx(): (%d,%d-%d,%d)\n", x, y, nWidth, nHeight); - - /* safely copy the window name */ - if(lpWindowName) - { - Status = MmCopyFromCaller(&WindowName, lpWindowName, sizeof(UNICODE_STRING)); - if (!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return((HWND)0); - } - if(WindowName.Buffer) - { - /* safe the original pointer to the window name */ - OrigWindowName = WindowName.Buffer; - - if(!(WindowName.Buffer = ExAllocatePoolWithTag(NonPagedPool, WindowName.MaximumLength, TAG_STRING))) - { - SetLastNtError(STATUS_NO_MEMORY); - return((HWND)0); - } - - Status = MmCopyFromCaller(WindowName.Buffer, OrigWindowName, WindowName.MaximumLength); - if(!NT_SUCCESS(Status)) - { - ExFreePool(WindowName.Buffer); - SetLastNtError(Status); - return((HWND)0); - } - } - - if(!WindowName.Buffer) - RtlInitUnicodeString(&WindowName, NULL); - } - else - RtlInitUnicodeString(&WindowName, NULL); + PWSTR ClassNameString; ParentWindowHandle = PsGetWin32Thread()->Desktop->DesktopWindow; OwnerWindowHandle = NULL; @@ -1479,7 +1441,6 @@ NtUserCreateWindowEx(DWORD dwExStyle, } else if ((dwStyle & (WS_CHILD | WS_POPUP)) == WS_CHILD) { - RtlFreeUnicodeString(&WindowName); return (HWND)0; /* WS_CHILD needs a parent, but WS_POPUP doesn't */ } @@ -1495,10 +1456,34 @@ NtUserCreateWindowEx(DWORD dwExStyle, /* FIXME: parent must belong to the current process */ /* Check the class. */ - ClassFound = ClassReferenceClassByNameOrAtom(&ClassObject, lpClassName->Buffer, hInstance); + if (IS_ATOM(ClassName->Buffer)) + { + ClassFound = ClassReferenceClassByNameOrAtom(&ClassObject, ClassName->Buffer, hInstance); + } + else + { + Status = IntUnicodeStringToNULLTerminated(&ClassNameString, ClassName); + if (! NT_SUCCESS(Status)) + { + if (NULL != ParentWindow) + { + IntReleaseWindowObject(ParentWindow); + } + return NULL; + } + ClassFound = ClassReferenceClassByNameOrAtom(&ClassObject, ClassNameString, hInstance); + IntFreeNULLTerminatedFromUnicodeString(ClassNameString, ClassName); + } if (!ClassFound) { - RtlFreeUnicodeString(&WindowName); + if (IS_ATOM(ClassName->Buffer)) + { + DPRINT1("Class 0x%x not found\n", (DWORD_PTR) ClassName->Buffer); + } + else + { + DPRINT1("Class %wZ not found\n", ClassName); + } if (NULL != ParentWindow) { IntReleaseWindowObject(ParentWindow); @@ -1516,7 +1501,6 @@ NtUserCreateWindowEx(DWORD dwExStyle, if (!NT_SUCCESS(Status)) { ClassDereferenceObject(ClassObject); - RtlFreeUnicodeString(&WindowName); if (NULL != ParentWindow) { IntReleaseWindowObject(ParentWindow); @@ -1537,7 +1521,6 @@ NtUserCreateWindowEx(DWORD dwExStyle, { ObDereferenceObject(WinStaObject); ClassDereferenceObject(ClassObject); - RtlFreeUnicodeString(&WindowName); if (NULL != ParentWindow) { IntReleaseWindowObject(ParentWindow); @@ -1622,8 +1605,27 @@ NtUserCreateWindowEx(DWORD dwExStyle, ExInitializeFastMutex(&WindowObject->PropListLock); ExInitializeFastMutex(&WindowObject->RelativesLock); ExInitializeFastMutex(&WindowObject->UpdateLock); - - WindowObject->WindowName = WindowName; + + if (NULL != WindowName->Buffer) + { + WindowObject->WindowName.MaximumLength = WindowName->MaximumLength; + WindowObject->WindowName.Length = WindowName->Length; + WindowObject->WindowName.Buffer = ExAllocatePoolWithTag(PagedPool, WindowName->MaximumLength, + TAG_STRING); + if (NULL == WindowObject->WindowName.Buffer) + { + ClassDereferenceObject(ClassObject); + DPRINT1("Failed to allocate mem for window name\n"); + SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); + return NULL; + } + RtlCopyMemory(WindowObject->WindowName.Buffer, WindowName->Buffer, WindowName->MaximumLength); + } + else + { + RtlInitUnicodeString(&WindowObject->WindowName, NULL); + } + /* Correct the window style. */ if (!(dwStyle & WS_CHILD)) @@ -1685,8 +1687,8 @@ NtUserCreateWindowEx(DWORD dwExStyle, Cs.x = Pos.x; Cs.y = Pos.y; Cs.style = dwStyle; - Cs.lpszName = OrigWindowName; /* pass the original pointer to usermode! */ - Cs.lpszClass = lpClassName->Buffer; + Cs.lpszName = (LPCWSTR) WindowName; + Cs.lpszClass = (LPCWSTR) ClassName; Cs.dwExStyle = dwExStyle; CbtCreate.lpcs = &Cs; CbtCreate.hwndInsertAfter = HWND_TOP; @@ -1834,9 +1836,9 @@ NtUserCreateWindowEx(DWORD dwExStyle, Cs.x = Pos.x; Cs.y = Pos.y; - DPRINT("[win32k.window] NtUserCreateWindowEx style %d, exstyle %d, parent %d\n", Cs.style, Cs.dwExStyle, Cs.hwndParent); - DPRINT("NtUserCreateWindowEx(): (%d,%d-%d,%d)\n", x, y, nWidth, nHeight); - DPRINT("NtUserCreateWindowEx(): About to send NCCREATE message.\n"); + DPRINT("[win32k.window] IntCreateWindowEx style %d, exstyle %d, parent %d\n", Cs.style, Cs.dwExStyle, Cs.hwndParent); + DPRINT("IntCreateWindowEx(): (%d,%d-%d,%d)\n", x, y, nWidth, nHeight); + DPRINT("IntCreateWindowEx(): About to send NCCREATE message.\n"); Result = IntSendMessage(WindowObject->Self, WM_NCCREATE, 0, (LPARAM) &Cs); if (!Result) { @@ -1845,14 +1847,14 @@ NtUserCreateWindowEx(DWORD dwExStyle, { IntReleaseWindowObject(ParentWindow); } - DPRINT("NtUserCreateWindowEx(): NCCREATE message failed.\n"); + DPRINT("IntCreateWindowEx(): NCCREATE message failed.\n"); return((HWND)0); } /* Calculate the non-client size. */ MaxPos.x = WindowObject->WindowRect.left; MaxPos.y = WindowObject->WindowRect.top; - DPRINT("NtUserCreateWindowEx(): About to get non-client size.\n"); + DPRINT("IntCreateWindowEx(): About to get non-client size.\n"); /* WinPosGetNonClientSize SENDS THE WM_NCCALCSIZE message */ Result = WinPosGetNonClientSize(WindowObject->Self, &WindowObject->WindowRect, @@ -1909,7 +1911,7 @@ NtUserCreateWindowEx(DWORD dwExStyle, } /* Send the WM_CREATE message. */ - DPRINT("NtUserCreateWindowEx(): about to send CREATE message.\n"); + DPRINT("IntCreateWindowEx(): about to send CREATE message.\n"); Result = IntSendMessage(WindowObject->Self, WM_CREATE, 0, (LPARAM) &Cs); if (Result == (LRESULT)-1) { @@ -1919,7 +1921,7 @@ NtUserCreateWindowEx(DWORD dwExStyle, IntReleaseWindowObject(ParentWindow); } ClassDereferenceObject(ClassObject); - DPRINT("NtUserCreateWindowEx(): send CREATE message failed.\n"); + DPRINT("IntCreateWindowEx(): send CREATE message failed.\n"); return((HWND)0); } @@ -1928,7 +1930,7 @@ NtUserCreateWindowEx(DWORD dwExStyle, { LONG lParam; - DPRINT("NtUserCreateWindow(): About to send WM_SIZE\n"); + DPRINT("IntCreateWindow(): About to send WM_SIZE\n"); if ((WindowObject->ClientRect.right - WindowObject->ClientRect.left) < 0 || (WindowObject->ClientRect.bottom - WindowObject->ClientRect.top) < 0) @@ -1941,7 +1943,7 @@ NtUserCreateWindowEx(DWORD dwExStyle, IntSendMessage(WindowObject->Self, WM_SIZE, SIZE_RESTORED, lParam); - DPRINT("NtUserCreateWindow(): About to send WM_MOVE\n"); + DPRINT("IntCreateWindow(): About to send WM_MOVE\n"); if (0 != (WindowObject->Style & WS_CHILD) && ParentWindow) { @@ -1969,7 +1971,7 @@ NtUserCreateWindowEx(DWORD dwExStyle, ((WindowObject->Style & WS_CHILD) || NtUserGetActiveWindow()) ? SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED : SWP_NOZORDER | SWP_FRAMECHANGED; - DPRINT("NtUserCreateWindow(): About to minimize/maximize\n"); + DPRINT("IntCreateWindow(): About to minimize/maximize\n"); DPRINT("%d,%d %dx%d\n", NewPos.left, NewPos.top, NewPos.right, NewPos.bottom); WinPosSetWindowPos(WindowObject->Self, 0, NewPos.left, NewPos.top, NewPos.right, NewPos.bottom, SwFlag); @@ -1979,7 +1981,7 @@ NtUserCreateWindowEx(DWORD dwExStyle, if ((WindowObject->Style & WS_CHILD) && (!(WindowObject->ExStyle & WS_EX_NOPARENTNOTIFY)) && ParentWindow) { - DPRINT("NtUserCreateWindow(): About to notify parent\n"); + DPRINT("IntCreateWindow(): About to notify parent\n"); IntSendMessage(ParentWindow->Self, WM_PARENTNOTIFY, MAKEWPARAM(WM_CREATE, WindowObject->IDMenu), @@ -2003,15 +2005,85 @@ NtUserCreateWindowEx(DWORD dwExStyle, if (dwStyle & WS_VISIBLE) { - DPRINT("NtUserCreateWindow(): About to show window\n"); + DPRINT("IntCreateWindow(): About to show window\n"); WinPosShowWindow(WindowObject->Self, dwShowMode); } - DPRINT("NtUserCreateWindow(): = %X\n", Handle); + DPRINT("IntCreateWindow(): = %X\n", Handle); DPRINT("WindowObject->SystemMenu = 0x%x\n", WindowObject->SystemMenu); return((HWND)Handle); } +HWND STDCALL +NtUserCreateWindowEx(DWORD dwExStyle, + PUNICODE_STRING UnsafeClassName, + PUNICODE_STRING UnsafeWindowName, + DWORD dwStyle, + LONG x, + LONG y, + LONG nWidth, + LONG nHeight, + HWND hWndParent, + HMENU hMenu, + HINSTANCE hInstance, + LPVOID lpParam, + DWORD dwShowMode, + BOOL bUnicodeWindow) +{ + NTSTATUS Status; + UNICODE_STRING WindowName; + UNICODE_STRING ClassName; + HWND NewWindow; + + DPRINT("NtUserCreateWindowEx(): (%d,%d-%d,%d)\n", x, y, nWidth, nHeight); + + /* Get the class name (string or atom) */ + Status = MmCopyFromCaller(&ClassName, UnsafeClassName, sizeof(UNICODE_STRING)); + if (! NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return NULL; + } + if (! IS_ATOM(ClassName.Buffer)) + { + Status = IntSafeCopyUnicodeString(&ClassName, UnsafeClassName); + if (! NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return NULL; + } + } + + /* safely copy the window name */ + if (NULL != UnsafeWindowName) + { + Status = IntSafeCopyUnicodeString(&WindowName, UnsafeWindowName); + if (! NT_SUCCESS(Status)) + { + if (! IS_ATOM(ClassName.Buffer)) + { + RtlFreeUnicodeString(&ClassName); + } + SetLastNtError(Status); + return NULL; + } + } + else + { + RtlInitUnicodeString(&WindowName, NULL); + } + + NewWindow = IntCreateWindowEx(dwExStyle, &ClassName, &WindowName, dwStyle, x, y, nWidth, nHeight, + hWndParent, hMenu, hInstance, lpParam, dwShowMode, bUnicodeWindow); + + RtlFreeUnicodeString(&WindowName); + if (! IS_ATOM(ClassName.Buffer)) + { + RtlFreeUnicodeString(&ClassName); + } + + return NewWindow; +} /* * @unimplemented From dc9dfeec01acc8b970ea6da0d9fd65fde888403f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Wed, 16 Jun 2004 06:18:14 +0000 Subject: [PATCH 1389/1463] Remove debug stuff accidentaly left in svn path=/trunk/; revision=9676 --- reactos/lib/user32/windows/message.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/reactos/lib/user32/windows/message.c b/reactos/lib/user32/windows/message.c index e2f074b2d5a..b3b6131faca 100644 --- a/reactos/lib/user32/windows/message.c +++ b/reactos/lib/user32/windows/message.c @@ -1,4 +1,4 @@ -/* $Id: message.c,v 1.40 2004/06/16 06:09:40 gvg Exp $ +/* $Id: message.c,v 1.41 2004/06/16 06:18:14 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -17,11 +17,6 @@ #define NTOS_MODE_USER #include <ntos.h> -#ifndef TODO -#define NDEBUG -#include <debug.h> -#endif - /* DDE message exchange * * - Session initialization From 11761ed43619e3c34bb10cd536abf021aebd587e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Wed, 16 Jun 2004 06:46:13 +0000 Subject: [PATCH 1390/1463] Sync to Wine-20040615: Maxime Bellenge <maxime.bellenge@laposte.net> - Implemented PSH_WIZARD97_OLD and PSH_WIZARD97_NEW property sheet styles. - Add DT_END_ELLIPSIS as defaut style for text. Ilya Korniyko <k_ilya@ukr.net> - Encoding fixes in Ukrainian translation. Filip Navara <xnavara@volny.cz> - Let the subclassing stack grow the opposite way to make the code more transparent. - Remove SubclassWndProc and move its logic to DefSubclassProc. Dimitrie O. Paun <dpaun@rogers.com> - Clear the state image bits only if LVS_EX_CHECKBOXES is set. - Fix obvious logical error in focus handling. - Indentation and formatting fixes. - (based on a patch by Krishna Murthy). Ulrich Czekalla <ulrich@codeweavers.com> - Handle case where iterator range contains 0 elements. - Handle case when item text is empty. According to MSDN, length should be returned when lParam is NULL. Patrik Stridvall <ps@leissner.se> - StrSpnW doesn't exist in comctl32.dll but StrCSpnW does. Jon Griffiths <jon_p_griffiths@yahoo.com> - Implemented TCM_SETITEMEXTRA. Robert Shearman <R.J.Shearman@warwick.ac.uk> - Don't draw whole button pressed when separate dropdown pressed, just the separate dropdown itself. - TBN_DRAGOUT and NM_RDBLCLK notifications. - Remove unneeded member of private toolbar struct. svn path=/trunk/; revision=9677 --- reactos/lib/comctl32/comctl32.h | 1 + reactos/lib/comctl32/comctl32.spec | 2 +- reactos/lib/comctl32/comctl_Cn.rc | 1 + reactos/lib/comctl32/comctl_De.rc | 1 + reactos/lib/comctl32/comctl_En.rc | 1 + reactos/lib/comctl32/comctl_Es.rc | 1 + reactos/lib/comctl32/comctl_Fr.rc | 1 + reactos/lib/comctl32/comctl_It.rc | 3 +- reactos/lib/comctl32/comctl_Ja.rc | 1 + reactos/lib/comctl32/comctl_Ko.rc | 1 + reactos/lib/comctl32/comctl_Nl.rc | 1 + reactos/lib/comctl32/comctl_Pl.rc | 1 + reactos/lib/comctl32/comctl_Pt.rc | 1 + reactos/lib/comctl32/comctl_Ru.rc | 1 + reactos/lib/comctl32/comctl_Si.rc | 1 + reactos/lib/comctl32/comctl_Th.rc | 1 + reactos/lib/comctl32/comctl_Uk.rc | 51 ++--- reactos/lib/comctl32/commctrl.c | 3 +- reactos/lib/comctl32/listview.c | 30 +-- reactos/lib/comctl32/propsheet.c | 256 ++++++++++++++++++++++++-- reactos/lib/comctl32/string.c | 14 +- reactos/lib/comctl32/tab.c | 99 ++++++---- reactos/lib/comctl32/toolbar.c | 131 +++++++++---- reactos/lib/comctl32/winehq2ros.patch | 97 ++-------- 24 files changed, 475 insertions(+), 225 deletions(-) diff --git a/reactos/lib/comctl32/comctl32.h b/reactos/lib/comctl32/comctl32.h index 143f1ac104f..a50855348c9 100644 --- a/reactos/lib/comctl32/comctl32.h +++ b/reactos/lib/comctl32/comctl32.h @@ -48,6 +48,7 @@ extern HBRUSH COMCTL32_hPattern55AABrush; #define IDC_NEXT_BUTTON 12324 #define IDC_FINISH_BUTTON 12325 #define IDC_SUNKEN_LINE 12326 +#define IDC_SUNKEN_LINEHEADER 12327 #define IDS_CLOSE 4160 diff --git a/reactos/lib/comctl32/comctl32.spec b/reactos/lib/comctl32/comctl32.spec index 2348dbec56b..8d5e8bdae36 100644 --- a/reactos/lib/comctl32/comctl32.spec +++ b/reactos/lib/comctl32/comctl32.spec @@ -75,7 +75,7 @@ 361 stdcall -noname StrCmpNIW(wstr wstr long) 362 stdcall -noname StrStrW(wstr wstr) 363 stdcall -noname StrStrIW(wstr wstr) -364 stdcall -noname StrSpnW(wstr wstr) +364 stdcall -noname StrCSpnW(wstr wstr) 365 stdcall -noname StrToIntW(wstr) 366 stdcall -noname StrChrIA(str long) 367 stdcall -noname StrChrIW(wstr long) diff --git a/reactos/lib/comctl32/comctl_Cn.rc b/reactos/lib/comctl32/comctl_Cn.rc index 02f309ac042..e33ba1adb19 100644 --- a/reactos/lib/comctl32/comctl_Cn.rc +++ b/reactos/lib/comctl32/comctl_Cn.rc @@ -44,6 +44,7 @@ BEGIN PUSHBUTTON "帮助", IDHELP,235,138,50,14,WS_GROUP LTEXT "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5 + LTEXT "", IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE END diff --git a/reactos/lib/comctl32/comctl_De.rc b/reactos/lib/comctl32/comctl_De.rc index 8be7c1d525c..da3859d3947 100644 --- a/reactos/lib/comctl32/comctl_De.rc +++ b/reactos/lib/comctl32/comctl_De.rc @@ -59,6 +59,7 @@ BEGIN PUSHBUTTON "&Hilfe", IDHELP,235,138,50,14,WS_GROUP LTEXT "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5 + LTEXT "", IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE END diff --git a/reactos/lib/comctl32/comctl_En.rc b/reactos/lib/comctl32/comctl_En.rc index 3d3a03a2388..3b81be6ec83 100644 --- a/reactos/lib/comctl32/comctl_En.rc +++ b/reactos/lib/comctl32/comctl_En.rc @@ -43,6 +43,7 @@ BEGIN PUSHBUTTON "Help", IDHELP,235,138,50,14,WS_GROUP LTEXT "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5 + LTEXT "", IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE END diff --git a/reactos/lib/comctl32/comctl_Es.rc b/reactos/lib/comctl32/comctl_Es.rc index 34df02e2e8d..d9af88755cf 100644 --- a/reactos/lib/comctl32/comctl_Es.rc +++ b/reactos/lib/comctl32/comctl_Es.rc @@ -43,6 +43,7 @@ BEGIN PUSHBUTTON "Ayuda", IDHELP,235,138,50,14,WS_GROUP LTEXT "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5 + LTEXT "", IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE END diff --git a/reactos/lib/comctl32/comctl_Fr.rc b/reactos/lib/comctl32/comctl_Fr.rc index bd4e8b01aed..3b73558421d 100644 --- a/reactos/lib/comctl32/comctl_Fr.rc +++ b/reactos/lib/comctl32/comctl_Fr.rc @@ -47,6 +47,7 @@ BEGIN PUSHBUTTON "Aide", IDHELP,235,138,50,14,WS_GROUP LTEXT "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN CONTROL "Onglet", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5 + LTEXT "", IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE END diff --git a/reactos/lib/comctl32/comctl_It.rc b/reactos/lib/comctl32/comctl_It.rc index 65f82ba9269..6af31bd1caf 100644 --- a/reactos/lib/comctl32/comctl_It.rc +++ b/reactos/lib/comctl32/comctl_It.rc @@ -1,6 +1,6 @@ /* * Copyright 1999 Eric Kohl - * 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 @@ -44,6 +44,7 @@ BEGIN PUSHBUTTON "Aiuto", IDHELP,235,138,50,14,WS_GROUP LTEXT "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN CONTROL "Linguetta", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5 + LTEXT "", IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE END diff --git a/reactos/lib/comctl32/comctl_Ja.rc b/reactos/lib/comctl32/comctl_Ja.rc index 4be56bc8de7..f913da9bf4a 100644 --- a/reactos/lib/comctl32/comctl_Ja.rc +++ b/reactos/lib/comctl32/comctl_Ja.rc @@ -43,6 +43,7 @@ BEGIN PUSHBUTTON "僿儖僾", IDHELP,235,138,50,14,WS_GROUP LTEXT "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5 + LTEXT "", IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE END diff --git a/reactos/lib/comctl32/comctl_Ko.rc b/reactos/lib/comctl32/comctl_Ko.rc index 0f63141a540..95d9dcc7280 100644 --- a/reactos/lib/comctl32/comctl_Ko.rc +++ b/reactos/lib/comctl32/comctl_Ko.rc @@ -43,6 +43,7 @@ BEGIN PUSHBUTTON "档框富", IDHELP,235,138,50,14,WS_GROUP LTEXT "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5 + LTEXT "", IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE END diff --git a/reactos/lib/comctl32/comctl_Nl.rc b/reactos/lib/comctl32/comctl_Nl.rc index 4c63644c6c5..449828dba57 100644 --- a/reactos/lib/comctl32/comctl_Nl.rc +++ b/reactos/lib/comctl32/comctl_Nl.rc @@ -45,6 +45,7 @@ BEGIN PUSHBUTTON "Help", IDHELP,235,138,50,14,WS_GROUP LTEXT "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN CONTROL "Tabblad", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5 + LTEXT "", IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE END diff --git a/reactos/lib/comctl32/comctl_Pl.rc b/reactos/lib/comctl32/comctl_Pl.rc index 425e9c4f252..13b195dc700 100644 --- a/reactos/lib/comctl32/comctl_Pl.rc +++ b/reactos/lib/comctl32/comctl_Pl.rc @@ -44,6 +44,7 @@ BEGIN PUSHBUTTON "Pomoc", IDHELP,235,138,50,14,WS_GROUP LTEXT "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5 + LTEXT "", IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE END diff --git a/reactos/lib/comctl32/comctl_Pt.rc b/reactos/lib/comctl32/comctl_Pt.rc index 7f88e2ed504..34fb569a05e 100644 --- a/reactos/lib/comctl32/comctl_Pt.rc +++ b/reactos/lib/comctl32/comctl_Pt.rc @@ -43,6 +43,7 @@ BEGIN PUSHBUTTON "Ajuda", IDHELP,235,138,50,14,WS_GROUP LTEXT "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5 + LTEXT "", IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE END diff --git a/reactos/lib/comctl32/comctl_Ru.rc b/reactos/lib/comctl32/comctl_Ru.rc index fe8e2b618dd..e48bc2e4519 100644 --- a/reactos/lib/comctl32/comctl_Ru.rc +++ b/reactos/lib/comctl32/comctl_Ru.rc @@ -45,6 +45,7 @@ BEGIN PUSHBUTTON "&扬疣怅", IDHELP,235,138,50,14,WS_GROUP LTEXT "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5 + LTEXT "", IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE END diff --git a/reactos/lib/comctl32/comctl_Si.rc b/reactos/lib/comctl32/comctl_Si.rc index 2ade8e664a7..4ee4caf15a7 100644 --- a/reactos/lib/comctl32/comctl_Si.rc +++ b/reactos/lib/comctl32/comctl_Si.rc @@ -43,6 +43,7 @@ BEGIN PUSHBUTTON "Pomo", IDHELP,235,138,50,14,WS_GROUP LTEXT "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5 + LTEXT "", IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE END diff --git a/reactos/lib/comctl32/comctl_Th.rc b/reactos/lib/comctl32/comctl_Th.rc index fe3cedd5ded..56eb49b14b4 100644 --- a/reactos/lib/comctl32/comctl_Th.rc +++ b/reactos/lib/comctl32/comctl_Th.rc @@ -43,6 +43,7 @@ BEGIN PUSHBUTTON "锹嗨耪", IDHELP,235,138,50,14,WS_GROUP LTEXT "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5 + LTEXT "", IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE END diff --git a/reactos/lib/comctl32/comctl_Uk.rc b/reactos/lib/comctl32/comctl_Uk.rc index fecaddd80bc..54df0803bad 100644 --- a/reactos/lib/comctl32/comctl_Uk.rc +++ b/reactos/lib/comctl32/comctl_Uk.rc @@ -22,67 +22,68 @@ LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE -CAPTION "魈劣陨紫釉і 奶 " +CAPTION "码囫蜩忸耱 潆 " FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK", IDOK,4,122,50,14, WS_TABSTOP | WS_GROUP - PUSHBUTTON "&і耐і瘟", IDCANCEL,58,122,50,14 - PUSHBUTTON "&釉嫌兆猎", IDC_APPLY_BUTTON,112,122,50,14,WS_DISABLED - PUSHBUTTON "&湎і乃", IDHELP,166,122,50,14,WS_TABSTOP|WS_GROUP + PUSHBUTTON "&鲁潇稠", IDCANCEL,58,122,50,14 + PUSHBUTTON "&青耱铖筲囹", IDC_APPLY_BUTTON,112,122,50,14,WS_DISABLED + PUSHBUTTON "&念獬潢", IDHELP,166,122,50,14,WS_TABSTOP|WS_GROUP CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS|WS_GROUP|WS_TABSTOP|TCS_MULTILINE,4,4,212,114 END IDD_WIZARD DIALOG DISCARDABLE 0, 0, 290, 159 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE -CAPTION "砹釉乓" +CAPTION "锑耱屦" FONT 8, "MS Sans Serif" BEGIN - DEFPUSHBUTTON "&着役稍", IDC_FINISH_BUTTON,121,138,50,14 - DEFPUSHBUTTON "&淞і >", IDC_NEXT_BUTTON,121,138,50,14 - PUSHBUTTON "< &盍诹", IDC_BACK_BUTTON,71,138,50,14 - PUSHBUTTON "&і耐і瘟", IDCANCEL,178,138,50,14 - PUSHBUTTON "&湎і乃", IDHELP,235,138,50,14,WS_GROUP + DEFPUSHBUTTON "&青忮瘌栩", IDC_FINISH_BUTTON,121,138,50,14 + DEFPUSHBUTTON "&泥氤 >", IDC_NEXT_BUTTON,121,138,50,14 + PUSHBUTTON "< &袜玎", IDC_BACK_BUTTON,71,138,50,14 + PUSHBUTTON "&鲁潇稠", IDCANCEL,178,138,50,14 + PUSHBUTTON "&念獬潢", IDHELP,235,138,50,14,WS_GROUP LTEXT "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5 + LTEXT "", IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE END IDD_TBCUSTOMIZE DIALOG DISCARDABLE 10, 20, 357, 125 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "盍釉蚁仕 辛闻і і斡砸胀盼і" +CAPTION "袜耱痤殛 镟礤氤 稠耱痼戾眚斥" FONT 8, "MS Sans Serif" BEGIN - DEFPUSHBUTTON "&艘稍", IDCANCEL,308,6,44,14 - PUSHBUTTON "&笏晌赵", IDC_RESET_BTN,308,23,44,14 - PUSHBUTTON "&湎і乃", IDC_HELP_BTN,308,40,44,14 - PUSHBUTTON "鹋遗诱握陨 &窍艺", IDC_MOVEUP_BTN,308,74,44,14 - PUSHBUTTON "鹋遗诱握陨 南&紊谡", IDC_MOVEDN_BTN,308,91,44,14 - LTEXT "盍&炎і 宋闲松:", -1,4,5,84,10 + DEFPUSHBUTTON "&青牮栩", IDCANCEL,308,6,44,14 + PUSHBUTTON "&殃桧篁", IDC_RESET_BTN,308,23,44,14 + PUSHBUTTON "&念獬潢", IDC_HELP_BTN,308,40,44,14 + PUSHBUTTON "襄疱耋眢蜩 &泐痼", IDC_MOVEUP_BTN,308,74,44,14 + PUSHBUTTON "襄疱耋眢蜩 漕&龛珞", IDC_MOVEDN_BTN,308,91,44,14 + LTEXT "袜&忭 觏铒觇:", -1,4,5,84,10 LISTBOX IDC_AVAILBTN_LBOX,4,17,120,100, LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP - PUSHBUTTON "&湎牧陨 ->", IDOK, 131, 42, 44, 14 - PUSHBUTTON "<- &鹨陕伊陨", IDC_REMOVE_BTN,131,62,44,14 - LTEXT "&胛闲松 辛闻і і斡砸胀盼і:", -1,182,5,78,10 + PUSHBUTTON "&念溧蜩 ->", IDOK, 131, 42, 44, 14 + PUSHBUTTON "<- &橡栳疣蜩", IDC_REMOVE_BTN,131,62,44,14 + LTEXT "&薯铒觇 镟礤氤 稠耱痼戾眚斥:", -1,182,5,78,10 LISTBOX IDC_TOOLBARBTN_LBOX, 182,17,120,100,LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP END STRINGTABLE DISCARDABLE { - IDS_CLOSE "艘稍" + IDS_CLOSE "青牮栩" } STRINGTABLE DISCARDABLE { - IDM_TODAY "筘锨夏і:" - IDM_GOTODAY "鹣韵尬 牧粤" + IDM_TODAY "腰钽钿沓:" + IDM_GOTODAY "项蝾黜 溧蜞" } STRINGTABLE DISCARDABLE { - IDS_SEPARATOR "蛳谀і特紊" + IDS_SEPARATOR "蓄玟畴桕" } STRINGTABLE DISCARDABLE { - HKY_NONE "钆土" + HKY_NONE "湾爨" } diff --git a/reactos/lib/comctl32/commctrl.c b/reactos/lib/comctl32/commctrl.c index 227544e28f1..2eb5436b445 100644 --- a/reactos/lib/comctl32/commctrl.c +++ b/reactos/lib/comctl32/commctrl.c @@ -1084,7 +1084,7 @@ BOOL WINAPI SetWindowSubclass (HWND hWnd, SUBCLASSPROC pfnSubclass, UINT_PTR uIDSubclass, DWORD_PTR dwRef) { LPSUBCLASS_INFO stack; - int newnum, n; + int n; TRACE ("(%p, %p, %x, %lx)\n", hWnd, pfnSubclass, uIDSubclass, dwRef); @@ -1275,7 +1275,6 @@ BOOL WINAPI RemoveWindowSubclass(HWND hWnd, SUBCLASSPROC pfnSubclass, UINT_PTR u LRESULT WINAPI DefSubclassProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { LPSUBCLASS_INFO stack; - int stackpos; LRESULT ret; /* retrieve our little stack from the Properties */ diff --git a/reactos/lib/comctl32/listview.c b/reactos/lib/comctl32/listview.c index 8a6e8ad0fbe..8914a44abd2 100644 --- a/reactos/lib/comctl32/listview.c +++ b/reactos/lib/comctl32/listview.c @@ -1114,8 +1114,13 @@ static RANGE iterator_range(ITERATOR* i) if (!i->ranges) return i->range; - range.lower = (*(RANGE*)DPA_GetPtr(i->ranges->hdpa, 0)).lower; - range.upper = (*(RANGE*)DPA_GetPtr(i->ranges->hdpa, DPA_GetPtrCount(i->ranges->hdpa) - 1)).upper; + if (DPA_GetPtrCount(i->ranges->hdpa) > 0) + { + range.lower = (*(RANGE*)DPA_GetPtr(i->ranges->hdpa, 0)).lower; + range.upper = (*(RANGE*)DPA_GetPtr(i->ranges->hdpa, DPA_GetPtrCount(i->ranges->hdpa) - 1)).upper; + } + else range.lower = range.upper = 0; + return range; } @@ -3313,7 +3318,7 @@ static BOOL set_main_item(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem, BOOL ranges_delitem(infoPtr->selectionRanges, lpLVItem->iItem); /* if we are asked to change focus, and we manage it, do it */ - if (lpLVItem->state & lpLVItem->stateMask & ~infoPtr->uCallbackMask & LVIS_FOCUSED) + if (lpLVItem->stateMask & ~infoPtr->uCallbackMask & LVIS_FOCUSED) { if (lpLVItem->state & LVIS_FOCUSED) { @@ -6037,7 +6042,7 @@ static INT WINAPI LISTVIEW_InsertCompare( LPVOID first, LPVOID second, LPARAM } /*** - * nESCRIPTION: + * DESCRIPTION: * Inserts a new item in the listview control. * * PARAMETER(S): @@ -6068,8 +6073,7 @@ static INT LISTVIEW_InsertItemT(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem, if (!is_assignable_item(lpLVItem, infoPtr->dwStyle)) return -1; - if ( !(lpItem = (ITEM_INFO *)Alloc(sizeof(ITEM_INFO))) ) - return -1; + if (!(lpItem = (ITEM_INFO *)Alloc(sizeof(ITEM_INFO)))) return -1; /* insert item in listview control data structure */ if ( !(hdpaSubItems = DPA_Create(8)) ) goto fail; @@ -6090,21 +6094,21 @@ static INT LISTVIEW_InsertItemT(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem, /* set the item attributes */ if (lpLVItem->mask & (LVIF_GROUPID|LVIF_COLUMNS)) { - /* full size structure expected - _WIN32IE >= 0x560 */ - item = *lpLVItem; + /* full size structure expected - _WIN32IE >= 0x560 */ + item = *lpLVItem; } else if (lpLVItem->mask & LVIF_INDENT) { - /* indent member expected - _WIN32IE >= 0x300 */ - memcpy(&item, lpLVItem, offsetof( LVITEMW, iGroupId )); + /* indent member expected - _WIN32IE >= 0x300 */ + memcpy(&item, lpLVItem, offsetof( LVITEMW, iGroupId )); } else { - /* minimal structure expected */ - memcpy(&item, lpLVItem, offsetof( LVITEMW, iIndent )); + /* minimal structure expected */ + memcpy(&item, lpLVItem, offsetof( LVITEMW, iIndent )); } item.iItem = nItem; - item.state &= ~LVIS_STATEIMAGEMASK; + if (infoPtr->dwLvExStyle & LVS_EX_CHECKBOXES) item.state &= ~LVIS_STATEIMAGEMASK; if (!set_main_item(infoPtr, &item, TRUE, isW, &has_changed)) goto undo; /* if we're sorted, sort the list, and update the index */ diff --git a/reactos/lib/comctl32/propsheet.c b/reactos/lib/comctl32/propsheet.c index 20b4a910ce9..29f61b9963d 100644 --- a/reactos/lib/comctl32/propsheet.c +++ b/reactos/lib/comctl32/propsheet.c @@ -3,6 +3,7 @@ * * Copyright 1998 Francis Beaudet * Copyright 1999 Thuy Nguyen + * Copyright 2004 Maxime Bellenge * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -94,6 +95,8 @@ typedef struct tagPropSheetInfo BOOL rebootSystem; BOOL activeValid; PropPageInfo* proppage; + HFONT hFont; + HFONT hFontBold; int x; int y; int width; @@ -217,15 +220,9 @@ static VOID PROPSHEET_UnImplementedFlags(DWORD dwFlags) add_flag(PSH_RTLREADING); add_flag(PSH_WIZARDCONTEXTHELP); add_flag(PSH_WIZARD97_OLD); - add_flag(PSH_WATERMARK); - add_flag(PSH_USEHBMWATERMARK); - add_flag(PSH_USEHPLWATERMARK); add_flag(PSH_STRETCHWATERMARK); - add_flag(PSH_HEADER); - add_flag(PSH_USEHBMHEADER); add_flag(PSH_USEPAGELANG); add_flag(PSH_WIZARD_LITE); - add_flag(PSH_WIZARD97_NEW); add_flag(PSH_NOCONTEXTHELP); if (string[0] != '\0') FIXME("%s\n", string); @@ -886,7 +883,11 @@ static BOOL PROPSHEET_AdjustSizeWizard(HWND hwndDlg, PropSheetInfo* psInfo) /* Make room */ rc.right += (padding.x * 2); - rc.bottom += (buttonHeight + (5 * padding.y) + lineHeight); + rc.bottom += (buttonHeight + lineHeight); + if (psInfo->ppshheader.dwFlags & (PSH_WIZARD97_OLD | PSH_WIZARD97_NEW)) + rc.bottom += (4 * padding.y); + else + rc.bottom += (5 * padding.y); /* * Resize the property sheet. @@ -1003,6 +1004,7 @@ static BOOL PROPSHEET_AdjustButtonsWizard(HWND hwndParent, { HWND hwndButton = GetDlgItem(hwndParent, IDCANCEL); HWND hwndLine = GetDlgItem(hwndParent, IDC_SUNKEN_LINE); + HWND hwndLineHeader = GetDlgItem(hwndParent, IDC_SUNKEN_LINEHEADER); RECT rcSheet; int x, y; int num_buttons = 3; @@ -1084,18 +1086,29 @@ static BOOL PROPSHEET_AdjustButtonsWizard(HWND hwndParent, else ShowWindow(hwndButton, SW_HIDE); + if (psInfo->ppshheader.dwFlags & (PSH_WIZARD97_OLD | PSH_WIZARD97_NEW)) + padding.x = 0; + /* * Position and resize the sunken line. */ x = padding.x; y = rcSheet.bottom - ((padding.y * 2) + buttonHeight + lineHeight); - GetClientRect(hwndParent, &rcSheet); lineWidth = rcSheet.right - (padding.x * 2); SetWindowPos(hwndLine, 0, x, y, lineWidth, 2, SWP_NOZORDER | SWP_NOACTIVATE); + /* + * Position and resize the header sunken line. + */ + + SetWindowPos(hwndLineHeader, 0, 0, 0, rcSheet.right, 2, + SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE); + if (!(psInfo->ppshheader.dwFlags & (PSH_WIZARD97_OLD | PSH_WIZARD97_NEW))) + ShowWindow(hwndLineHeader, SW_HIDE); + return TRUE; } @@ -1497,10 +1510,12 @@ static BOOL PROPSHEET_CreatePage(HWND hwndParent, psInfo->proppage[index].hwndPage = hwndPage; - if (psInfo->ppshheader.dwFlags & INTRNL_ANY_WIZARD) { - /* FIXME: This code may no longer be correct. - * It was not for the non-wizard path. (GLA 6/02) - */ + if (psInfo->ppshheader.dwFlags & INTRNL_ANY_WIZARD) { + int offsetx = 0; + int offsety = 0; + HWND hwndChild; + RECT r; + rc.left = psInfo->x; rc.top = psInfo->y; rc.right = psInfo->width; @@ -1515,10 +1530,58 @@ static BOOL PROPSHEET_CreatePage(HWND hwndParent, TRACE("setting page %08lx, rc (%ld,%ld)-(%ld,%ld) w=%d, h=%d, padx=%d, pady=%d\n", (DWORD)hwndPage, rc.left, rc.top, rc.right, rc.bottom, pageWidth, pageHeight, padding.x, padding.y); + + /* If there is a watermark, offset the dialog items */ + if ( (psInfo->ppshheader.dwFlags & (PSH_WATERMARK | PSH_WIZARD97_NEW | PSH_WIZARD97_OLD)) && + ((index == 0) || (index == psInfo->nPages - 1)) ) + { + BITMAP bm; + + /* if PSH_USEHBMWATERMARK is not set, load the resource from pszbmWatermark + and put the HBITMAP in hbmWatermark. Thus all the rest of the code always + considers hbmWatermark as valid. */ + if (!(psInfo->ppshheader.dwFlags & PSH_USEHBMWATERMARK)) + { + ((PropSheetInfo *)psInfo)->ppshheader.u4.hbmWatermark = + CreateMappedBitmap(ppshpage->hInstance, (INT)psInfo->ppshheader.u4.pszbmWatermark, 0, NULL, 0); + } + + /* Compute the offset x */ + GetObjectA(psInfo->ppshheader.u4.hbmWatermark, sizeof(BITMAP), (LPVOID)&bm); + offsetx = bm.bmWidth; + } + + if (psInfo->ppshheader.dwFlags & (PSH_HEADER | PSH_WIZARD97_NEW | PSH_WIZARD97_OLD)) + { + /* Same behavior as for watermarks */ + if (!(psInfo->ppshheader.dwFlags & PSH_USEHBMHEADER)) + { + ((PropSheetInfo *)psInfo)->ppshheader.u5.hbmHeader = + CreateMappedBitmap(ppshpage->hInstance, (INT)psInfo->ppshheader.u5.pszbmHeader, 0, NULL, 0); + } + + hwndChild = GetDlgItem(hwndParent, IDC_SUNKEN_LINEHEADER); + + GetClientRect(hwndChild, &r); + MapWindowPoints(hwndChild, hwndParent, (LPPOINT) &r, 2); + offsety = (ppshpage->dwFlags & PSP_HIDEHEADER)?0:r.bottom + 1; + } + + hwndChild = GetWindow(hwndPage, GW_CHILD); + while((offsetx!=0) && (hwndChild)) { + GetWindowRect(hwndChild, &r); + MapWindowPoints(0, hwndPage, (LPPOINT)&r, 2); + OffsetRect(&r, -offsetx, 0); + SetWindowPos(hwndChild, 0, r.left, r.top, + 0, 0, SWP_NOSIZE | SWP_NOZORDER); + + hwndChild = GetWindow(hwndChild, GW_HWNDNEXT); + } + SetWindowPos(hwndPage, HWND_TOP, - rc.left + padding.x/2, - rc.top + padding.y/2, - pageWidth, pageHeight, 0); + rc.left + padding.x/2 + offsetx, + rc.top + padding.y/2 + offsety, + pageWidth - offsetx, pageHeight - offsety, 0); } else { /* @@ -1547,6 +1610,8 @@ static BOOL PROPSHEET_CreatePage(HWND hwndParent, static BOOL PROPSHEET_ShowPage(HWND hwndDlg, int index, PropSheetInfo * psInfo) { HWND hwndTabCtrl; + HWND hwndLineHeader; + LPCPROPSHEETPAGEW ppshpage; TRACE("active_page %d, index %d\n", psInfo->active_page, index); if (index == psInfo->active_page) @@ -1558,8 +1623,6 @@ static BOOL PROPSHEET_ShowPage(HWND hwndDlg, int index, PropSheetInfo * psInfo) if (psInfo->proppage[index].hwndPage == 0) { - LPCPROPSHEETPAGEW ppshpage; - ppshpage = (LPCPROPSHEETPAGEW)psInfo->proppage[index].hpage; PROPSHEET_CreatePage(hwndDlg, index, psInfo, ppshpage); } @@ -1580,6 +1643,20 @@ static BOOL PROPSHEET_ShowPage(HWND hwndDlg, int index, PropSheetInfo * psInfo) psInfo->active_page = index; psInfo->activeValid = TRUE; + if (psInfo->ppshheader.dwFlags & (PSH_WIZARD97_OLD | PSH_WIZARD97_NEW) ) + { + hwndLineHeader = GetDlgItem(hwndDlg, IDC_SUNKEN_LINEHEADER); + ppshpage = (LPCPROPSHEETPAGEW)psInfo->proppage[index].hpage; + + if ((ppshpage->dwFlags & PSP_HIDEHEADER) || (!(psInfo->ppshheader.dwFlags & PSH_HEADER)) ) + ShowWindow(hwndLineHeader, SW_HIDE); + else + ShowWindow(hwndLineHeader, SW_SHOW); + + InvalidateRgn(hwndDlg, NULL, TRUE); + UpdateWindow(hwndDlg); + } + return TRUE; } @@ -2469,6 +2546,16 @@ static void PROPSHEET_CleanUp(HWND hwndDlg) } } + DeleteObject(psInfo->hFont); + DeleteObject(psInfo->hFontBold); + /* If we created the bitmaps, destroy them */ + if ((psInfo->ppshheader.dwFlags & PSH_WATERMARK) && + (!(psInfo->ppshheader.dwFlags & PSH_USEHBMWATERMARK)) ) + DeleteObject(psInfo->ppshheader.u4.hbmWatermark); + if ((psInfo->ppshheader.dwFlags & PSH_HEADER) && + (!(psInfo->ppshheader.dwFlags & PSH_USEHBMHEADER)) ) + DeleteObject(psInfo->ppshheader.u5.hbmHeader); + Free(psInfo->proppage); Free(psInfo->strPropertiesFor); ImageList_Destroy(psInfo->hImageList); @@ -2813,6 +2900,129 @@ static BOOL PROPSHEET_DoCommand(HWND hwnd, WORD wID) return TRUE; } +/****************************************************************************** + * PROPSHEET_Paint + */ +static LRESULT PROPSHEET_Paint(HWND hwnd) +{ + PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwnd, PropSheetInfoStr); + PAINTSTRUCT ps; + HDC hdc, hdcSrc; + BITMAP bm; + HBITMAP hbmp; + HPALETTE hOldPal = 0; + int offsety = 0; + HBRUSH hbr; + RECT r; + LPCPROPSHEETPAGEW ppshpage; + + hdc = BeginPaint(hwnd, &ps); + if (!hdc) return 1; + + hdcSrc = CreateCompatibleDC(0); + ppshpage = (LPCPROPSHEETPAGEW)psInfo->proppage[psInfo->active_page].hpage; + + if (psInfo->ppshheader.dwFlags & PSH_USEHPLWATERMARK) + hOldPal = SelectPalette(hdc, psInfo->ppshheader.hplWatermark, FALSE); + + if ( (!(ppshpage->dwFlags & PSP_HIDEHEADER)) && + (psInfo->ppshheader.dwFlags & (PSH_WIZARD97_NEW | PSH_HEADER)) ) + { + RECT rzone; + HWND hwndLineHeader = GetDlgItem(hwnd, IDC_SUNKEN_LINEHEADER); + HFONT hOldFont; + COLORREF clrOld = 0; + int oldBkMode = 0; + + hbmp = SelectObject(hdcSrc, psInfo->ppshheader.u5.hbmHeader); + hOldFont = SelectObject(hdc, psInfo->hFontBold); + + GetClientRect(hwndLineHeader, &r); + MapWindowPoints(hwndLineHeader, hwnd, (LPPOINT) &r, 2); + SetRect(&rzone, 0, 0, r.right, r.top - 1); + hbr = CreateSolidBrush(GetPixel(hdcSrc, 0, 0)); + FillRect(hdc, &rzone, hbr); + DeleteObject(hbr); + + GetObjectA(psInfo->ppshheader.u5.hbmHeader, sizeof(BITMAP), (LPVOID)&bm); + + clrOld = SetTextColor (hdc, 0x00000000); + oldBkMode = SetBkMode (hdc, TRANSPARENT); + + if (ppshpage->dwFlags & PSP_USEHEADERTITLE) { + SetRect(&r, 20, 10, rzone.right - bm.bmWidth, 18); + if (psInfo->unicode) + DrawTextW(hdc, (LPWSTR)ppshpage->pszHeaderTitle, + -1, &r, DT_LEFT | DT_SINGLELINE | DT_NOCLIP); + else + DrawTextA(hdc, (LPCSTR)ppshpage->pszHeaderTitle, + -1, &r, DT_LEFT | DT_SINGLELINE | DT_NOCLIP); + } + + if (ppshpage->dwFlags & PSP_USEHEADERSUBTITLE) { + SelectObject(hdc, psInfo->hFont); + SetRect(&r, 40, 25, rzone.right - bm.bmWidth, 43); + if (psInfo->unicode) + DrawTextW(hdc, (LPWSTR)ppshpage->pszHeaderSubTitle, + -1, &r, DT_LEFT | DT_SINGLELINE); + else + DrawTextA(hdc, (LPCSTR)ppshpage->pszHeaderSubTitle, + -1, &r, DT_LEFT | DT_SINGLELINE); + } + + BitBlt(hdc, rzone.right - bm.bmWidth, (rzone.bottom - bm.bmHeight)/2, + bm.bmWidth, bm.bmHeight, + hdcSrc, 0, 0, SRCCOPY); + offsety = rzone.bottom + 2; + + SetTextColor(hdc, clrOld); + SetBkMode(hdc, oldBkMode); + SelectObject(hdc, hOldFont); + SelectObject(hdcSrc, hbmp); + } + + if ( ((psInfo->active_page == 0) || (psInfo->active_page == psInfo->nPages - 1)) && + (psInfo->ppshheader.dwFlags & (PSH_WIZARD97_NEW | PSH_WATERMARK)) ) + { + if (psInfo->ppshheader.dwFlags & PSH_USEHBMWATERMARK ) + { + HWND hwndLine = GetDlgItem(hwnd, IDC_SUNKEN_LINE); + + GetClientRect(hwndLine, &r); + MapWindowPoints(hwndLine, hwnd, (LPPOINT) &r, 2); + + GetObjectA(psInfo->ppshheader.u4.hbmWatermark, sizeof(BITMAP), (LPVOID)&bm); + hbmp = SelectObject(hdcSrc, psInfo->ppshheader.u4.hbmWatermark); + + BitBlt(hdc, 0, offsety, bm.bmWidth, bm.bmHeight, + hdcSrc, 0, 0, SRCCOPY); + + /* If the bitmap is not big enough, fill the remaining area + with the color of pixel (0,0) of bitmap - see MSDN */ + if (r.top > bm.bmHeight) { + r.bottom = r.top - 1; + r.top = bm.bmHeight; + r.left = 0; + r.right = bm.bmWidth; + hbr = CreateSolidBrush(GetPixel(hdcSrc, 0, 0)); + FillRect(hdc, &r, hbr); + DeleteObject(hbr); + } + + SelectObject(hdcSrc, hbmp); + } + } + + if (psInfo->ppshheader.dwFlags & PSH_USEHPLWATERMARK) + SelectPalette(hdc, hOldPal, FALSE); + + DeleteDC(hdcSrc); + + EndPaint(hwnd, &ps); + + return 0; +} + /****************************************************************************** * PROPSHEET_DialogProc */ @@ -2831,6 +3041,7 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) HWND hwndTabCtrl = GetDlgItem(hwnd, IDC_TABCONTROL); LPCPROPSHEETPAGEW ppshpage; int idx; + LOGFONTA logFont; /* Using PropSheetInfoStr to store extra data doesn't match the native * common control: native uses TCM_[GS]ETITEM @@ -2849,6 +3060,12 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) /* set up the Next and Back buttons by default */ PROPSHEET_SetWizButtons(hwnd, PSWIZB_BACK|PSWIZB_NEXT); + /* Set up fonts */ + SystemParametersInfoA (SPI_GETICONTITLELOGFONT, 0, &logFont, 0); + psInfo->hFont = CreateFontIndirectA (&logFont); + logFont.lfWeight = FW_BOLD; + psInfo->hFontBold = CreateFontIndirectA (&logFont); + /* * Small icon in the title bar. */ @@ -2882,6 +3099,7 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) if (psInfo->ppshheader.dwFlags & INTRNL_ANY_WIZARD) { + ShowWindow(hwndTabCtrl, SW_HIDE); if (PROPSHEET_IsTooSmallWizard(hwnd, psInfo)) { PROPSHEET_AdjustSizeWizard(hwnd, psInfo); @@ -2930,6 +3148,10 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) return TRUE; } + case WM_PAINT: + PROPSHEET_Paint(hwnd); + return TRUE; + case WM_DESTROY: PROPSHEET_CleanUp(hwnd); return TRUE; diff --git a/reactos/lib/comctl32/string.c b/reactos/lib/comctl32/string.c index 2eb6172f936..f98c85c2768 100644 --- a/reactos/lib/comctl32/string.c +++ b/reactos/lib/comctl32/string.c @@ -763,19 +763,7 @@ LPWSTR WINAPI StrRChrIW(LPCWSTR lpszStr, LPCWSTR lpszEnd, WORD ch) } /************************************************************************* - * StrSpnW [COMCTL32.364] - * - * See StrSpnA. - */ -int WINAPI StrSpnW(LPCWSTR lpszStr, LPCWSTR lpszMatch) -{ - TRACE("(%s,%s)\n",debugstr_w(lpszStr), debugstr_w(lpszMatch)); - - return COMCTL32_StrSpnHelperW(lpszStr, lpszMatch, StrChrW, FALSE); -} - -/************************************************************************* - * StrCSpnW [COMCTL32.@] + * StrCSpnW [COMCTL32.364] * * See StrCSpnA. */ diff --git a/reactos/lib/comctl32/tab.c b/reactos/lib/comctl32/tab.c index 7a332c2d095..bef38ca5bef 100644 --- a/reactos/lib/comctl32/tab.c +++ b/reactos/lib/comctl32/tab.c @@ -27,7 +27,6 @@ * TCIF_RTLREADING * * Messages: - * TCM_SETITEMEXTRA * TCM_REMOVEIMAGE * TCM_DESELECTALL * TCM_GETEXTENDEDSTYLE @@ -56,15 +55,18 @@ typedef struct DWORD dwState; LPWSTR pszText; INT iImage; - LPARAM lParam; - RECT rect; /* bounding rectangle of the item relative to the - * leftmost item (the leftmost item, 0, would have a - * "left" member of 0 in this rectangle) - * - * additionally the top member hold the row number - * and bottom is unused and should be 0 */ + RECT rect; /* bounding rectangle of the item relative to the + * leftmost item (the leftmost item, 0, would have a + * "left" member of 0 in this rectangle) + * + * additionally the top member hold the row number + * and bottom is unused and should be 0 */ + BYTE extra[1]; /* Space for caller supplied info, variable size */ } TAB_ITEM; +/* The size of a tab item depends on how much extra data is requested */ +#define TAB_ITEM_SIZE(infoPtr) (sizeof(TAB_ITEM) - sizeof(BYTE) + infoPtr->cbInfo) + typedef struct { HWND hwndNotify; /* notification window (parent) */ @@ -82,17 +84,18 @@ typedef struct HIMAGELIST himl; /* handle to a image list (may be 0) */ HWND hwndToolTip; /* handle to tab's tooltip */ INT leftmostVisible; /* Used for scrolling, this member contains - * the index of the first visible item */ + * the index of the first visible item */ INT iSelected; /* the currently selected item */ INT iHotTracked; /* the highlighted item under the mouse */ INT uFocus; /* item which has the focus */ TAB_ITEM* items; /* pointer to an array of TAB_ITEM's */ BOOL DoRedraw; /* flag for redrawing when tab contents is changed*/ BOOL needsScrolling; /* TRUE if the size of the tabs is greater than - * the size of the control */ + * the size of the control */ BOOL fHeightSet; /* was the height of the tabs explicitly set? */ BOOL bUnicode; /* Unicode control? */ HWND hwndUpDown; /* Updown control used for scrolling */ + INT cbInfo; /* Number of bytes of caller supplied info per tab */ } TAB_INFO; /****************************************************************************** @@ -190,8 +193,8 @@ TAB_DumpItemInternal(TAB_INFO *infoPtr, UINT iItem) TRACE("tab %d, mask=0x%08x, dwState=0x%08lx, pszText=%s, iImage=%d\n", iItem, ti->mask, ti->dwState, debugstr_w(ti->pszText), ti->iImage); - TRACE("tab %d, lParam=0x%08lx, rect.left=%ld, rect.top(row)=%ld\n", - iItem, ti->lParam, ti->rect.left, ti->rect.top); + TRACE("tab %d, rect.left=%ld, rect.top(row)=%ld\n", + iItem, ti->rect.left, ti->rect.top); } } @@ -1654,7 +1657,8 @@ TAB_DrawItemInterior dis.hwndItem = hwnd; /* */ dis.hDC = hdc; CopyRect(&dis.rcItem,drawRect); - dis.itemData = infoPtr->items[iItem].lParam; + dis.itemData = 0; + memcpy( &dis.itemData, infoPtr->items[iItem].extra, min(sizeof(dis.itemData),infoPtr->cbInfo) ); /* * send the draw message @@ -2520,7 +2524,7 @@ TAB_InsertItemA (HWND hwnd, WPARAM wParam, LPARAM lParam) if (infoPtr->uNumItem == 0) { - infoPtr->items = Alloc (sizeof (TAB_ITEM)); + infoPtr->items = Alloc (TAB_ITEM_SIZE(infoPtr)); infoPtr->uNumItem++; infoPtr->iSelected = 0; } @@ -2528,18 +2532,18 @@ TAB_InsertItemA (HWND hwnd, WPARAM wParam, LPARAM lParam) TAB_ITEM *oldItems = infoPtr->items; infoPtr->uNumItem++; - infoPtr->items = Alloc (sizeof (TAB_ITEM) * infoPtr->uNumItem); + infoPtr->items = Alloc (TAB_ITEM_SIZE(infoPtr) * infoPtr->uNumItem); /* pre insert copy */ if (iItem > 0) { memcpy (&infoPtr->items[0], &oldItems[0], - iItem * sizeof(TAB_ITEM)); + iItem * TAB_ITEM_SIZE(infoPtr)); } /* post insert copy */ if (iItem < infoPtr->uNumItem - 1) { memcpy (&infoPtr->items[iItem+1], &oldItems[iItem], - (infoPtr->uNumItem - iItem - 1) * sizeof(TAB_ITEM)); + (infoPtr->uNumItem - iItem - 1) * TAB_ITEM_SIZE(infoPtr)); } @@ -2557,8 +2561,10 @@ TAB_InsertItemA (HWND hwnd, WPARAM wParam, LPARAM lParam) infoPtr->items[iItem].iImage = pti->iImage; if (pti->mask & TCIF_PARAM) - infoPtr->items[iItem].lParam = pti->lParam; - + memcpy(infoPtr->items[iItem].extra, &pti->lParam, infoPtr->cbInfo); + else + memset(infoPtr->items[iItem].extra, 0, infoPtr->cbInfo); + TAB_SetItemBounds(hwnd); if (infoPtr->uNumItem > 1) TAB_InvalidateTabArea(hwnd, infoPtr); @@ -2566,7 +2572,7 @@ TAB_InsertItemA (HWND hwnd, WPARAM wParam, LPARAM lParam) InvalidateRect(hwnd, NULL, TRUE); TRACE("[%p]: added item %d %s\n", - hwnd, iItem, debugstr_w(infoPtr->items[iItem].pszText)); + hwnd, iItem, debugstr_w(infoPtr->items[iItem].pszText)); return iItem; } @@ -2594,7 +2600,7 @@ TAB_InsertItemW (HWND hwnd, WPARAM wParam, LPARAM lParam) TAB_DumpItemExternalW(pti, iItem); if (infoPtr->uNumItem == 0) { - infoPtr->items = Alloc (sizeof (TAB_ITEM)); + infoPtr->items = Alloc (TAB_ITEM_SIZE(infoPtr)); infoPtr->uNumItem++; infoPtr->iSelected = 0; } @@ -2602,18 +2608,18 @@ TAB_InsertItemW (HWND hwnd, WPARAM wParam, LPARAM lParam) TAB_ITEM *oldItems = infoPtr->items; infoPtr->uNumItem++; - infoPtr->items = Alloc (sizeof (TAB_ITEM) * infoPtr->uNumItem); + infoPtr->items = Alloc (TAB_ITEM_SIZE(infoPtr) * infoPtr->uNumItem); /* pre insert copy */ if (iItem > 0) { memcpy (&infoPtr->items[0], &oldItems[0], - iItem * sizeof(TAB_ITEM)); + iItem * TAB_ITEM_SIZE(infoPtr)); } /* post insert copy */ if (iItem < infoPtr->uNumItem - 1) { memcpy (&infoPtr->items[iItem+1], &oldItems[iItem], - (infoPtr->uNumItem - iItem - 1) * sizeof(TAB_ITEM)); + (infoPtr->uNumItem - iItem - 1) * TAB_ITEM_SIZE(infoPtr)); } @@ -2631,7 +2637,9 @@ TAB_InsertItemW (HWND hwnd, WPARAM wParam, LPARAM lParam) infoPtr->items[iItem].iImage = pti->iImage; if (pti->mask & TCIF_PARAM) - infoPtr->items[iItem].lParam = pti->lParam; + memcpy(infoPtr->items[iItem].extra, &pti->lParam, infoPtr->cbInfo); + else + memset(infoPtr->items[iItem].extra, 0, infoPtr->cbInfo); TAB_SetItemBounds(hwnd); if (infoPtr->uNumItem > 1) @@ -2640,7 +2648,7 @@ TAB_InsertItemW (HWND hwnd, WPARAM wParam, LPARAM lParam) InvalidateRect(hwnd, NULL, TRUE); TRACE("[%p]: added item %d %s\n", - hwnd, iItem, debugstr_w(infoPtr->items[iItem].pszText)); + hwnd, iItem, debugstr_w(infoPtr->items[iItem].pszText)); return iItem; } @@ -2739,7 +2747,7 @@ TAB_SetItemA (HWND hwnd, WPARAM wParam, LPARAM lParam) wineItem->iImage = tabItem->iImage; if (tabItem->mask & TCIF_PARAM) - wineItem->lParam = tabItem->lParam; + memcpy(wineItem->extra, &tabItem->lParam, infoPtr->cbInfo); if (tabItem->mask & TCIF_RTLREADING) FIXME("TCIF_RTLREADING\n"); @@ -2780,7 +2788,7 @@ TAB_SetItemW (HWND hwnd, WPARAM wParam, LPARAM lParam) wineItem->iImage = tabItem->iImage; if (tabItem->mask & TCIF_PARAM) - wineItem->lParam = tabItem->lParam; + memcpy(wineItem->extra, &tabItem->lParam, infoPtr->cbInfo); if (tabItem->mask & TCIF_RTLREADING) FIXME("TCIF_RTLREADING\n"); @@ -2828,7 +2836,7 @@ TAB_GetItemA (HWND hwnd, WPARAM wParam, LPARAM lParam) tabItem->iImage = wineItem->iImage; if (tabItem->mask & TCIF_PARAM) - tabItem->lParam = wineItem->lParam; + memcpy(&tabItem->lParam, wineItem->extra, infoPtr->cbInfo); if (tabItem->mask & TCIF_RTLREADING) FIXME("TCIF_RTLREADING\n"); @@ -2865,7 +2873,7 @@ TAB_GetItemW (HWND hwnd, WPARAM wParam, LPARAM lParam) tabItem->iImage = wineItem->iImage; if (tabItem->mask & TCIF_PARAM) - tabItem->lParam = wineItem->lParam; + memcpy(&tabItem->lParam, wineItem->extra, infoPtr->cbInfo); if (tabItem->mask & TCIF_RTLREADING) FIXME("TCIF_RTLREADING\n"); @@ -2896,14 +2904,14 @@ TAB_DeleteItem (HWND hwnd, WPARAM wParam, LPARAM lParam) TAB_InvalidateTabArea(hwnd, infoPtr); infoPtr->uNumItem--; - infoPtr->items = Alloc(sizeof (TAB_ITEM) * infoPtr->uNumItem); + infoPtr->items = Alloc(TAB_ITEM_SIZE(infoPtr) * infoPtr->uNumItem); if (iItem > 0) - memcpy(&infoPtr->items[0], &oldItems[0], iItem * sizeof(TAB_ITEM)); + memcpy(&infoPtr->items[0], &oldItems[0], iItem * TAB_ITEM_SIZE(infoPtr)); if (iItem < infoPtr->uNumItem) memcpy(&infoPtr->items[iItem], &oldItems[iItem + 1], - (infoPtr->uNumItem - iItem) * sizeof(TAB_ITEM)); + (infoPtr->uNumItem - iItem) * TAB_ITEM_SIZE(infoPtr)); Free(oldItems); @@ -3081,7 +3089,8 @@ TAB_Create (HWND hwnd, WPARAM wParam, LPARAM lParam) infoPtr->hwndUpDown = 0; infoPtr->leftmostVisible = 0; infoPtr->fHeightSet = FALSE; - infoPtr->bUnicode = IsWindowUnicode (hwnd); + infoPtr->bUnicode = IsWindowUnicode (hwnd); + infoPtr->cbInfo = sizeof(LPARAM); TRACE("Created tab control, hwnd [%p]\n", hwnd); @@ -3174,6 +3183,25 @@ TAB_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam) return 0; } +static LRESULT +TAB_SetItemExtra (HWND hwnd, WPARAM wParam, LPARAM lParam) +{ + TAB_INFO *infoPtr = TAB_GetInfoPtr(hwnd); + INT cbInfo = wParam; + + if (!infoPtr || cbInfo <= 0) + return FALSE; + + if (infoPtr->uNumItem) + { + /* FIXME: MSDN says this is not allowed, but this hasn't been verified */ + return FALSE; + } + + infoPtr->cbInfo = cbInfo; + return TRUE; +} + static LRESULT WINAPI TAB_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { @@ -3231,8 +3259,7 @@ TAB_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) return TAB_InsertItemW (hwnd, wParam, lParam); case TCM_SETITEMEXTRA: - FIXME("Unimplemented msg TCM_SETITEMEXTRA\n"); - return 0; + return TAB_SetItemExtra (hwnd, wParam, lParam); case TCM_ADJUSTRECT: return TAB_AdjustRect (hwnd, (BOOL)wParam, (LPRECT)lParam); diff --git a/reactos/lib/comctl32/toolbar.c b/reactos/lib/comctl32/toolbar.c index 1b145c8daef..f97fe29e88d 100644 --- a/reactos/lib/comctl32/toolbar.c +++ b/reactos/lib/comctl32/toolbar.c @@ -52,8 +52,6 @@ * - Notifications: * - NM_CHAR * - NM_KEYDOWN - * - NM_RDBLCLICK - * - TBN_DRAGOUT * - TBN_GETOBJECT * - TBN_RESTORE * - TBN_SAVE @@ -100,9 +98,10 @@ typedef struct INT idCommand; BYTE fsState; BYTE fsStyle; + BYTE bHot; + BYTE bDropDownPressed; DWORD dwData; INT iString; - BOOL bHot; INT nRow; RECT rect; INT cx; /* manually set size */ @@ -163,12 +162,12 @@ typedef struct HWND hwndToolTip; /* handle to tool tip control */ HWND hwndNotify; /* handle to the window that gets notifications */ HWND hwndSelf; /* my own handle */ - BOOL bTransparent; /* background transparency flag */ BOOL bBtnTranspnt; /* button transparency flag */ BOOL bAutoSize; /* auto size deadlock indicator */ BOOL bAnchor; /* anchor highlight enabled */ BOOL bNtfUnicode; /* TRUE if NOTIFYs use {W} */ BOOL bDoRedraw; /* Redraw status */ + BOOL bDragOutSent; /* has TBN_DRAGOUT notification been sent for this drag? */ DWORD dwStyle; /* regular toolbar style */ DWORD dwExStyle; /* extended toolbar style */ DWORD dwDTFlags; /* DrawText flags */ @@ -788,14 +787,16 @@ TOOLBAR_DrawFrame(const TOOLBAR_INFO *infoPtr, BOOL flat, const NMTBCUSTOMDRAW * } static void -TOOLBAR_DrawSepDDArrow(const TOOLBAR_INFO *infoPtr, BOOL flat, const NMTBCUSTOMDRAW *tbcd, RECT *rcArrow) +TOOLBAR_DrawSepDDArrow(const TOOLBAR_INFO *infoPtr, const NMTBCUSTOMDRAW *tbcd, RECT *rcArrow, BOOL bDropDownPressed) { HDC hdc = tbcd->nmcd.hdc; int offset = 0; + BOOL pressed = bDropDownPressed || + (tbcd->nmcd.uItemState & (CDIS_SELECTED | CDIS_CHECKED)); - if (flat) + if (infoPtr->dwStyle & TBSTYLE_FLAT) { - if ((tbcd->nmcd.uItemState & CDIS_SELECTED) || (tbcd->nmcd.uItemState & CDIS_CHECKED)) + if (pressed) DrawEdge (hdc, rcArrow, BDR_SUNKENOUTER, BF_RECT); else if ( (tbcd->nmcd.uItemState & CDIS_HOT) && !(tbcd->nmcd.uItemState & CDIS_DISABLED) && @@ -804,14 +805,14 @@ TOOLBAR_DrawSepDDArrow(const TOOLBAR_INFO *infoPtr, BOOL flat, const NMTBCUSTOMD } else { - if ((tbcd->nmcd.uItemState & CDIS_SELECTED) || (tbcd->nmcd.uItemState & CDIS_CHECKED)) + if (pressed) DrawEdge (hdc, rcArrow, EDGE_SUNKEN, BF_RECT | BF_MIDDLE); else DrawEdge (hdc, rcArrow, EDGE_RAISED, BF_SOFT | BF_RECT | BF_MIDDLE); } - if (tbcd->nmcd.uItemState & (CDIS_SELECTED | CDIS_CHECKED)) + if (pressed) offset = (infoPtr->dwItemCDFlag & TBCDRF_NOOFFSET) ? 0 : 1; if (tbcd->nmcd.uItemState & (CDIS_DISABLED | CDIS_INDETERMINATE)) @@ -997,7 +998,7 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc) TOOLBAR_DrawFrame(infoPtr, dwStyle & TBSTYLE_FLAT, &tbcd); if (drawSepDropDownArrow) - TOOLBAR_DrawSepDDArrow(infoPtr, dwStyle & TBSTYLE_FLAT, &tbcd, &rcArrow); + TOOLBAR_DrawSepDDArrow(infoPtr, &tbcd, &rcArrow, btnPtr->bDropDownPressed); if (!(infoPtr->dwExStyle & TBSTYLE_EX_MIXEDBUTTONS) || (btnPtr->fsStyle & BTNS_SHOWTEXT)) TOOLBAR_DrawString (infoPtr, &rcText, lpText, &tbcd); @@ -3296,9 +3297,7 @@ TOOLBAR_GetButtonTextW (HWND hwnd, WPARAM wParam, LPARAM lParam) TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); INT nIndex; LPWSTR lpText; - - if (lParam == 0) - return -1; + LRESULT ret = 0; nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE); if (nIndex == -1) @@ -3306,9 +3305,15 @@ TOOLBAR_GetButtonTextW (HWND hwnd, WPARAM wParam, LPARAM lParam) lpText = TOOLBAR_GetText(infoPtr,&infoPtr->buttons[nIndex]); - strcpyW ((LPWSTR)lParam, lpText); + if (lpText) + { + ret = strlenW (lpText); - return strlenW (lpText); + if (lParam) + strcpyW ((LPWSTR)lParam, lpText); + } + + return ret; } @@ -5106,10 +5111,10 @@ TOOLBAR_Create (HWND hwnd, WPARAM wParam, LPARAM lParam) infoPtr->nOldHit = -1; infoPtr->nHotItem = -1; infoPtr->hwndNotify = ((LPCREATESTRUCTW)lParam)->hwndParent; - infoPtr->bTransparent = (dwStyle & TBSTYLE_TRANSPARENT); infoPtr->bBtnTranspnt = (dwStyle & (TBSTYLE_FLAT | TBSTYLE_LIST)); - infoPtr->dwDTFlags = (dwStyle & TBSTYLE_LIST) ? DT_LEFT | DT_VCENTER | DT_SINGLELINE : DT_CENTER; + infoPtr->dwDTFlags = (dwStyle & TBSTYLE_LIST) ? DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS: DT_CENTER | DT_END_ELLIPSIS; infoPtr->bAnchor = FALSE; /* no anchor highlighting */ + infoPtr->bDragOutSent = FALSE; infoPtr->iVersion = 0; infoPtr->hwndSelf = hwnd; infoPtr->bDoRedraw = TRUE; @@ -5232,7 +5237,7 @@ TOOLBAR_EraseBackground (HWND hwnd, WPARAM wParam, LPARAM lParam) /* If the toolbar is "transparent" then pass the WM_ERASEBKGND up * to my parent for processing. */ - if (infoPtr->bTransparent) { + if (infoPtr->dwStyle & TBSTYLE_TRANSPARENT) { POINT pt, ptorig; HDC hdc = (HDC)wParam; HWND parent; @@ -5352,7 +5357,10 @@ TOOLBAR_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam) LRESULT res; /* draw in pressed state */ - btnPtr->fsState |= TBSTATE_PRESSED; + if (btnPtr->fsStyle & BTNS_WHOLEDROPDOWN) + btnPtr->fsState |= TBSTATE_PRESSED; + else + btnPtr->bDropDownPressed = TRUE; RedrawWindow(hwnd,&btnPtr->rect,0, RDW_ERASE|RDW_INVALIDATE|RDW_UPDATENOW); @@ -5370,7 +5378,10 @@ TOOLBAR_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam) MSG msg; /* redraw button in unpressed state */ - btnPtr->fsState &= ~TBSTATE_PRESSED; + if (btnPtr->fsStyle & BTNS_WHOLEDROPDOWN) + btnPtr->fsState &= ~TBSTATE_PRESSED; + else + btnPtr->bDropDownPressed = FALSE; InvalidateRect(hwnd, &btnPtr->rect, TRUE); /* find and set hot item @@ -5380,9 +5391,10 @@ TOOLBAR_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam) nHit = TOOLBAR_InternalHitTest(hwnd, &pt); TOOLBAR_SetHotItemEx(infoPtr, nHit, HICF_MOUSE | HICF_LMOUSE); - /* remove any left mouse button down messages so that we can - * get a toggle effect on the button */ - while (PeekMessageW(&msg, hwnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_REMOVE)) + /* remove any left mouse button down or double-click messages + * so that we can get a toggle effect on the button */ + while (PeekMessageW(&msg, hwnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_REMOVE) || + PeekMessageW(&msg, hwnd, WM_LBUTTONDBLCLK, WM_LBUTTONDBLCLK, PM_REMOVE)) ; return 0; @@ -5391,6 +5403,7 @@ TOOLBAR_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam) } infoPtr->bCaptured = TRUE; infoPtr->nButtonDown = nHit; + infoPtr->bDragOutSent = FALSE; btnPtr->fsState |= TBSTATE_PRESSED; @@ -5565,7 +5578,7 @@ TOOLBAR_LButtonUp (HWND hwnd, WPARAM wParam, LPARAM lParam) MAKEWPARAM(infoPtr->buttons[nHit].idCommand, 0), (LPARAM)hwnd); /* !!! Undocumented - toolbar at 4.71 level and above sends - * either NMRCLICK or NM_CLICK with the NMMOUSE structure. + * either NM_RCLICK or NM_CLICK with the NMMOUSE structure. * Only NM_RCLICK is documented. */ nmmouse.dwItemSpec = btnPtr->idCommand; @@ -5586,7 +5599,7 @@ TOOLBAR_RButtonUp( HWND hwnd, WPARAM wParam, LPARAM lParam) pt.x = LOWORD(lParam); pt.y = HIWORD(lParam); - + nmmouse.dwHitInfo = TOOLBAR_InternalHitTest(hwnd, &pt); if (nmmouse.dwHitInfo < 0) { @@ -5604,6 +5617,34 @@ TOOLBAR_RButtonUp( HWND hwnd, WPARAM wParam, LPARAM lParam) return 0; } +static LRESULT +TOOLBAR_RButtonDblClk( HWND hwnd, WPARAM wParam, LPARAM lParam) +{ + TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); + + NMMOUSE nmmouse; + POINT pt; + + pt.x = LOWORD(lParam); + pt.y = HIWORD(lParam); + + nmmouse.dwHitInfo = TOOLBAR_InternalHitTest(hwnd, &pt); + + if (nmmouse.dwHitInfo < 0) + nmmouse.dwItemSpec = -1; + else { + nmmouse.dwItemSpec = infoPtr->buttons[nmmouse.dwHitInfo].idCommand; + nmmouse.dwItemData = infoPtr->buttons[nmmouse.dwHitInfo].dwData; + } + + ClientToScreen(hwnd, &pt); + memcpy(&nmmouse.pt, &pt, sizeof(POINT)); + + TOOLBAR_SendNotify((LPNMHDR)&nmmouse, infoPtr, NM_RDBLCLK); + + return 0; +} + static LRESULT TOOLBAR_CaptureChanged(HWND hwnd) { @@ -5629,20 +5670,24 @@ static LRESULT TOOLBAR_MouseLeave (HWND hwnd, WPARAM wParam, LPARAM lParam) { TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); - TBUTTON_INFO *hotBtnPtr, *btnPtr; - RECT rc1; + TBUTTON_INFO *hotBtnPtr; - TOOLBAR_SetHotItemEx(infoPtr, -1, HICF_MOUSE); + hotBtnPtr = &infoPtr->buttons[infoPtr->nOldHit]; + + /* don't remove hot effects when in drop-down */ + if (infoPtr->nOldHit < 0 || !hotBtnPtr->bDropDownPressed) + TOOLBAR_SetHotItemEx(infoPtr, -1, HICF_MOUSE); if (infoPtr->nOldHit < 0) return TRUE; - hotBtnPtr = &infoPtr->buttons[infoPtr->nOldHit]; - /* If the last button we were over is depressed then make it not */ /* depressed and redraw it */ if(infoPtr->nOldHit == infoPtr->nButtonDown) { + TBUTTON_INFO *btnPtr; + RECT rc1; + btnPtr = &infoPtr->buttons[infoPtr->nButtonDown]; btnPtr->fsState &= ~TBSTATE_PRESSED; @@ -5652,6 +5697,15 @@ TOOLBAR_MouseLeave (HWND hwnd, WPARAM wParam, LPARAM lParam) InvalidateRect (hwnd, &rc1, TRUE); } + if (infoPtr->bCaptured && !infoPtr->bDragOutSent) + { + NMTOOLBARW nmt; + ZeroMemory(&nmt, sizeof(nmt)); + nmt.iItem = infoPtr->buttons[infoPtr->nButtonDown].idCommand; + TOOLBAR_SendNotify(&nmt.hdr, infoPtr, TBN_DRAGOUT); + infoPtr->bDragOutSent = TRUE; + } + infoPtr->nOldHit = -1; /* reset the old hit index as we've left the toolbar */ return TRUE; @@ -5699,6 +5753,15 @@ TOOLBAR_MouseMove (HWND hwnd, WPARAM wParam, LPARAM lParam) { if (infoPtr->bCaptured) { + if (!infoPtr->bDragOutSent) + { + NMTOOLBARW nmt; + ZeroMemory(&nmt, sizeof(nmt)); + nmt.iItem = infoPtr->buttons[infoPtr->nButtonDown].idCommand; + TOOLBAR_SendNotify(&nmt.hdr, infoPtr, TBN_DRAGOUT); + infoPtr->bDragOutSent = TRUE; + } + btnPtr = &infoPtr->buttons[infoPtr->nButtonDown]; if (infoPtr->nOldHit == infoPtr->nButtonDown) { btnPtr->fsState &= ~TBSTATE_PRESSED; @@ -6251,12 +6314,11 @@ TOOLBAR_StyleChanged (HWND hwnd, INT nType, LPSTYLESTRUCT lpStyle) if (nType == GWL_STYLE) { if (lpStyle->styleNew & TBSTYLE_LIST) { - infoPtr->dwDTFlags = DT_LEFT | DT_VCENTER | DT_SINGLELINE; + infoPtr->dwDTFlags = DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS; } else { - infoPtr->dwDTFlags = DT_CENTER; + infoPtr->dwDTFlags = DT_CENTER | DT_END_ELLIPSIS; } - infoPtr->bTransparent = (lpStyle->styleNew & TBSTYLE_TRANSPARENT); infoPtr->bBtnTranspnt = (lpStyle->styleNew & (TBSTYLE_FLAT | TBSTYLE_LIST)); TOOLBAR_CheckStyle (hwnd, lpStyle->styleNew); @@ -6619,6 +6681,9 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_RBUTTONUP: return TOOLBAR_RButtonUp (hwnd, wParam, lParam); + case WM_RBUTTONDBLCLK: + return TOOLBAR_RButtonDblClk (hwnd, wParam, lParam); + case WM_MOUSEMOVE: return TOOLBAR_MouseMove (hwnd, wParam, lParam); diff --git a/reactos/lib/comctl32/winehq2ros.patch b/reactos/lib/comctl32/winehq2ros.patch index a617c115e24..7df31fffcaa 100644 --- a/reactos/lib/comctl32/winehq2ros.patch +++ b/reactos/lib/comctl32/winehq2ros.patch @@ -1,10 +1,10 @@ Index: comctl32.spec =================================================================== RCS file: /home/wine/wine/dlls/comctl32/comctl32.spec,v -retrieving revision 1.43 -diff -u -r1.43 comctl32.spec ---- comctl32.spec 20 Feb 2004 05:16:37 -0000 1.43 -+++ comctl32.spec 8 May 2004 11:49:39 -0000 +retrieving revision 1.44 +diff -u -r1.44 comctl32.spec +--- comctl32.spec 17 May 2004 20:51:27 -0000 1.44 ++++ comctl32.spec 16 Jun 2004 06:51:02 -0000 @@ -106,13 +106,13 @@ 412 stdcall RemoveWindowSubclass(long ptr long) 413 stdcall DefSubclassProc(long long long long) @@ -26,84 +26,13 @@ diff -u -r1.43 comctl32.spec # Functions imported by name -Index: commctrl.c -=================================================================== -RCS file: /home/wine/wine/dlls/comctl32/commctrl.c,v -retrieving revision 1.76 -diff -u -r1.76 commctrl.c ---- commctrl.c 11 Mar 2004 22:38:22 -0000 1.76 -+++ commctrl.c 8 May 2004 11:49:41 -0000 -@@ -114,7 +114,6 @@ - extern void UPDOWN_Register(void); - extern void UPDOWN_Unregister(void); - --static LRESULT WINAPI SubclassWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); - - LPSTR COMCTL32_aSubclass = NULL; - HMODULE COMCTL32_hModule = 0; -@@ -1109,10 +1108,10 @@ - /* set window procedure to our own and save the current one */ - if (IsWindowUnicode (hWnd)) - stack->origproc = (WNDPROC)SetWindowLongW (hWnd, GWL_WNDPROC, -- (LONG)SubclassWndProc); -+ (LONG)DefSubclassProc); - else - stack->origproc = (WNDPROC)SetWindowLongA (hWnd, GWL_WNDPROC, -- (LONG)SubclassWndProc); -+ (LONG)DefSubclassProc); - } else { - WNDPROC current; - if (IsWindowUnicode (hWnd)) -@@ -1120,7 +1119,7 @@ - else - current = (WNDPROC)GetWindowLongA (hWnd, GWL_WNDPROC); - -- if (current != SubclassWndProc) { -+ if (current != DefSubclassProc) { - ERR ("Application has subclassed with our procedure, then manually, then with us again. The current implementation can't handle this.\n"); - return FALSE; - } -@@ -1260,33 +1259,6 @@ - } - - return FALSE; --} -- -- --/*********************************************************************** -- * SubclassWndProc (internal) -- * -- * Window procedure for all subclassed windows. -- * Saves the current subclassing stack position to support nested messages -- */ -- --static LRESULT WINAPI SubclassWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) --{ -- LPSUBCLASS_INFO stack; -- int stackpos; -- LRESULT ret; -- -- /* retrieve our little stack from the Properties */ -- stack = (LPSUBCLASS_INFO)GetPropA (hWnd, COMCTL32_aSubclass); -- if (!stack) { -- ERR ("Our sub classing stack got erased for %p!! Nothing we can do\n", hWnd); -- return 0; -- } -- stackpos = stack->stackpos; -- stack->stackpos = stack->stacknum; -- ret = DefSubclassProc(hWnd,uMsg,wParam,lParam); -- stack->stackpos = stackpos; -- return ret; - } - - Index: imagelist.c =================================================================== RCS file: /home/wine/wine/dlls/comctl32/imagelist.c,v retrieving revision 1.85 diff -u -r1.85 imagelist.c --- imagelist.c 27 Feb 2004 04:40:08 -0000 1.85 -+++ imagelist.c 8 May 2004 11:49:43 -0000 ++++ imagelist.c 16 Jun 2004 06:51:02 -0000 @@ -1146,11 +1146,13 @@ PatBlt(hBlendMaskDC, 0, 0, cx, cy, PATCOPY); SelectObject(hBlendMaskDC, hOldBrush); @@ -121,10 +50,10 @@ diff -u -r1.85 imagelist.c Index: listview.c =================================================================== RCS file: /home/wine/wine/dlls/comctl32/listview.c,v -retrieving revision 1.387 -diff -u -r1.387 listview.c ---- listview.c 21 Apr 2004 22:25:04 -0000 1.387 -+++ listview.c 8 May 2004 11:49:47 -0000 +retrieving revision 1.389 +diff -u -r1.389 listview.c +--- listview.c 4 Jun 2004 17:58:29 -0000 1.389 ++++ listview.c 16 Jun 2004 06:51:06 -0000 @@ -147,6 +147,7 @@ #include <assert.h> #include <ctype.h> @@ -136,10 +65,10 @@ diff -u -r1.387 listview.c Index: string.c =================================================================== RCS file: /home/wine/wine/dlls/comctl32/string.c,v -retrieving revision 1.3 -diff -u -r1.3 string.c ---- string.c 20 Feb 2004 19:58:39 -0000 1.3 -+++ string.c 8 May 2004 11:49:52 -0000 +retrieving revision 1.4 +diff -u -r1.4 string.c +--- string.c 17 May 2004 20:51:27 -0000 1.4 ++++ string.c 16 Jun 2004 06:51:06 -0000 @@ -254,7 +254,7 @@ { TRACE("(%s,%s)\n", debugstr_w(lpszStr), debugstr_w(lpszSearch)); From e054bf54e2862ec74d2ae61d173d89b4f1e5a3d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Wed, 16 Jun 2004 06:54:39 +0000 Subject: [PATCH 1391/1463] Sync to Wine-20040615: Ivan Leo Puoti <puoti@inwind.it> - Changed my name, so update copyright info. Ilya Korniyko <k_ilya@ukr.net> - Encoding fixes in Ukrainian translation. Wolfgang Schwotzer <wolfgang.schwotzer@gmx.net> - Support lpstrCustomFilter and return nFilterIndex in file dialog. Rein Klazes <rklazes@xs4all.nl> - In FILEDLG_ScanDir do not try to set the current directory to a path that is empty. svn path=/trunk/; revision=9678 --- reactos/lib/comdlg32/cdlg_It.rc | 2 +- reactos/lib/comdlg32/cdlg_Uk.rc | 466 +++++++++++++------------- reactos/lib/comdlg32/filedlg.c | 90 +++-- reactos/lib/comdlg32/filedlg16.c | 2 +- reactos/lib/comdlg32/winehq2ros.patch | 28 +- 5 files changed, 317 insertions(+), 271 deletions(-) diff --git a/reactos/lib/comdlg32/cdlg_It.rc b/reactos/lib/comdlg32/cdlg_It.rc index c98322f5bbd..8dcbc360202 100644 --- a/reactos/lib/comdlg32/cdlg_It.rc +++ b/reactos/lib/comdlg32/cdlg_It.rc @@ -1,6 +1,6 @@ /* * Copyright 1996 Tristan Tarrant - * Copyright 2004 Ivan Leo Murray-Smith + * Copyright 2004 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/comdlg32/cdlg_Uk.rc b/reactos/lib/comdlg32/cdlg_Uk.rc index 146a7272ff6..76d3b5cec7a 100644 --- a/reactos/lib/comdlg32/cdlg_Uk.rc +++ b/reactos/lib/comdlg32/cdlg_Uk.rc @@ -24,92 +24,92 @@ LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT OPEN_FILE DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 275, 134 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "і乃疑陨" +CAPTION "鲁潢痂蜩" FONT 8, "Ms Sans Serif" { - LTEXT "&І' 屏侍:", 1090, 6, 6, 76, 9 + LTEXT "&察' 羿殡:", 1090, 6, 6, 76, 9 EDITTEXT 1152, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP LISTBOX 1120, 6, 32, 90, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP - LTEXT "&襞松:", -1, 110, 6, 92, 9 + LTEXT "&义觇:", -1, 110, 6, 92, 9 LTEXT "", 1088, 110, 18, 92, 9, SS_NOPREFIX | WS_GROUP LISTBOX 1121, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP - LTEXT "鹣肆谡琢陨 屏侍 &陨姓:", 1089, 6, 104, 90, 9 + LTEXT "项赅珞忄蜩 羿殡 &蜩矬:", 1089, 6, 104, 90, 9 COMBOBOX 1136, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP - LTEXT "&渖铀:", 1091, 110, 104, 92, 9 + LTEXT "&蔫耜:", 1091, 110, 104, 92, 9 COMBOBOX 1137, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "і乃疑陨", IDOK, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "і耐і瘟", IDCANCEL, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "&湎і乃", 1038, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP - CHECKBOX "&焐叟 奶 奚粤挝", 1040, 208, 68, 54, 24, BS_AUTOCHECKBOX | BS_MULTILINE | WS_GROUP | WS_TABSTOP + DEFPUSHBUTTON "鲁潢痂蜩", IDOK, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "鲁潇稠", IDCANCEL, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&念獬潢", 1038, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP + CHECKBOX "&髓 潆 麒蜞眄", 1040, 208, 68, 54, 24, BS_AUTOCHECKBOX | BS_MULTILINE | WS_GROUP | WS_TABSTOP } SAVE_FILE DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 275, 134 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "乓徘陨 阉 ..." +CAPTION "轻屦邈蜩 ..." FONT 8, "Ms Sans Serif" { - LTEXT "&&І' 屏侍:", 1090, 6, 6, 76, 9 + LTEXT "&&察' 羿殡:", 1090, 6, 6, 76, 9 EDITTEXT 1152, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP LISTBOX 1120, 6, 32, 90, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP - LTEXT "&襞松:", -1, 110, 6, 92, 9 + LTEXT "&义觇:", -1, 110, 6, 92, 9 LTEXT "", 1088, 110, 18, 92, 9, SS_NOPREFIX | WS_GROUP LISTBOX 1121, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP - LTEXT "鹣肆谡琢陨 屏侍 &陨姓:", 1089, 6, 104, 90, 9 + LTEXT "项赅珞忄蜩 羿殡 &蜩矬:", 1089, 6, 104, 90, 9 COMBOBOX 1136, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP - LTEXT "&渖铀:", 1091, 110, 104, 92, 9 + LTEXT "&蔫耜:", 1091, 110, 104, 92, 9 COMBOBOX 1137, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "乓徘陨 阉", IDOK, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "і耐і瘟", IDCANCEL, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "&湎і乃", 1038, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP - CHECKBOX "&焐叟 奶 奚粤挝", 1040, 208, 68, 54, 24, BS_AUTOCHECKBOX | BS_MULTILINE | WS_GROUP | WS_TABSTOP + DEFPUSHBUTTON "轻屦邈蜩 ", IDOK, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "鲁潇稠", IDCANCEL, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&念獬潢", 1038, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP + CHECKBOX "&髓 潆 麒蜞眄", 1040, 208, 68, 54, 24, BS_AUTOCHECKBOX | BS_MULTILINE | WS_GROUP | WS_TABSTOP } PRINT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "湟账" +CAPTION "酿箨" FONT 8, "Ms Sans Serif" { - LTEXT "鹨晌耘:", 1088, 6, 6, 40, 9 + LTEXT "橡桧蝈:", 1088, 6, 6, 40, 9 LTEXT "", 1089, 60, 6, 150, 9 - GROUPBOX "湟账兆猎", 1072, 6, 30, 160, 65, BS_GROUPBOX - RADIOBUTTON "&饔", 1056, 16, 45, 60, 12 - RADIOBUTTON "&赡і膛挝墒 埔燎团卧", 1057, 16, 60, 60, 12 - RADIOBUTTON "&笤弦і嗡", 1058, 16, 75, 60, 12 - DEFPUSHBUTTON "湟账", IDOK, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "і耐і瘟", IDCANCEL, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "魈劣陨紫釉і", 1024, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP - LTEXT "&:", 1090, 60, 80, 30, 9 - LTEXT "&南:", 1091, 120, 80, 30, 9 - LTEXT "&袼і釉 囊账:", 1092, 6, 100, 76, 9 + GROUPBOX "酿箨筲囹", 1072, 6, 30, 160, 65, BS_GROUPBOX + RADIOBUTTON "&埋", 1056, 16, 45, 60, 12 + RADIOBUTTON "&桎畴屙龛 麴嚆戾眚", 1057, 16, 60, 60, 12 + RADIOBUTTON "&羊铕稠觇", 1058, 16, 75, 60, 12 + DEFPUSHBUTTON "酿箨", IDOK, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "鲁潇稠", IDCANCEL, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "码囫蜩忸耱", 1024, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP + LTEXT "&:", 1090, 60, 80, 30, 9 + LTEXT "&漕:", 1091, 120, 80, 30, 9 + LTEXT "&哧绸螯 漯箨:", 1092, 6, 100, 76, 9 COMBOBOX 1136, 80, 100, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP - CHECKBOX "湟账 南 屏侍", 1040, 20, 100, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - CHECKBOX "笤捎滔", 1041, 160, 100, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "酿箨 漕 羿殡", 1040, 20, 100, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "羊桉腩", 1041, 160, 100, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP } PRINT_SETUP DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "盍釉蚁仕 幸晌耘伊" +CAPTION "袜耱痤殛 镳桧蝈疣" FONT 8, "Ms Sans Serif" { - GROUPBOX "鹨晌耘", 1072, 6, 10, 180, 65, BS_GROUPBOX - RADIOBUTTON "鹨晌耘 诹 &下胀献膛挝淹", 1056, 16, 20, 80, 12 - LTEXT "[钆土]", 1088, 35, 35, 120, 9 - RADIOBUTTON "&І污墒 幸晌耘", 1057, 16, 50, 80, 12 + GROUPBOX "橡桧蝈", 1072, 6, 10, 180, 65, BS_GROUPBOX + RADIOBUTTON "橡桧蝈 玎 &钺箪钼脲眄", 1056, 16, 20, 80, 12 + LTEXT "[湾爨]", 1088, 35, 35, 120, 9 + RADIOBUTTON "&岔 镳桧蝈", 1057, 16, 50, 80, 12 COMBOBOX 1136, 35, 65, 149, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP DEFPUSHBUTTON "OK", IDOK, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "і耐і瘟", IDCANCEL, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "&盍釉蚁仕", 1024, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP - GROUPBOX "镆іє卧撩і", 1073, 6, 85, 100, 50, BS_GROUPBOX - RADIOBUTTON "&胛芍瘟", 1058, 50, 100, 40, 12 - RADIOBUTTON "&崽芈贤瘟", 1059, 50, 115, 40, 12 + PUSHBUTTON "鲁潇稠", IDCANCEL, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&袜耱痤殛", 1024, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP + GROUPBOX "勿澈眚圉", 1073, 6, 85, 100, 50, BS_GROUPBOX + RADIOBUTTON "&薯桄磬", 1058, 50, 100, 40, 12 + RADIOBUTTON "&离铎磬", 1059, 50, 115, 40, 12 ICON "LANDSCAP", 1097, 10, 95, 32, 32 ICON "PORTRAIT", 1098, 10, 95, 32, 32 - GROUPBOX "鹆і", 1074, 120, 85, 180, 50, BS_GROUPBOX - LTEXT "蛳&谕і", 1089, 130, 95, 30, 9 - LTEXT "&渲乓盘", 1090, 130, 110, 30, 9 + GROUPBOX "相锍", 1074, 120, 85, 180, 50, BS_GROUPBOX + LTEXT "蓄&珈仇", 1089, 130, 95, 30, 9 + LTEXT "&逆屦咫", 1090, 130, 110, 30, 9 COMBOBOX 1137, 155, 95, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP COMBOBOX 1138, 155, 110, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP } @@ -117,31 +117,31 @@ FONT 8, "Ms Sans Serif" CHOOSE_FONT DIALOG DISCARDABLE 13, 54, 264, 147 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "善" +CAPTION "仞梏" FONT 8, "Ms Sans Serif" { - LTEXT "&善:",1088 ,6,3,40,9 + LTEXT "&仞梏:",1088 ,6,3,40,9 COMBOBOX 1136 ,6,13,94,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE - LTEXT "&笤商:",1089 ,108,3,44,9 + LTEXT "&羊桦:",1089 ,108,3,44,9 COMBOBOX 1137,108,13,64,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE - LTEXT "&蛳谕і:",1090,179,3,30,9 + LTEXT "&蓄珈仇:",1090,179,3,30,9 COMBOBOX 1138,179,13,32,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE | CBS_SORT DEFPUSHBUTTON "OK",IDOK,218,6,40,14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON - PUSHBUTTON "і耐і瘟",IDCANCEL,218,23,40,14,WS_GROUP | WS_TABSTOP - PUSHBUTTON "&釉嫌兆猎", 1026,218,40,40,14,WS_GROUP | WS_TABSTOP - PUSHBUTTON "&湎і乃" , 1038,218,57,40,14,WS_GROUP | WS_TABSTOP - GROUPBOX "嵩疑抡陨",1072,6,72,84,34,WS_GROUP - CHECKBOX "&艘庞膛紊", 1040, 10,82,75,10, BS_AUTOCHECKBOX | WS_TABSTOP - CHECKBOX "&і乃遗犹盼墒", 1041, 10,94,75,10, BS_AUTOCHECKBOX - LTEXT "&胂і:", 1091 ,6,110,30,9 + PUSHBUTTON "鲁潇稠",IDCANCEL,218,23,40,14,WS_GROUP | WS_TABSTOP + PUSHBUTTON "&青耱铖筲囹", 1026,218,40,40,14,WS_GROUP | WS_TABSTOP + PUSHBUTTON "&念獬潢" , 1038,218,57,40,14,WS_GROUP | WS_TABSTOP + GROUPBOX "莉痂狍蜩",1072,6,72,84,34,WS_GROUP + CHECKBOX "&青牮羼脲龛", 1040, 10,82,75,10, BS_AUTOCHECKBOX | WS_TABSTOP + CHECKBOX "&铣潢疱耠屙栝", 1041, 10,94,75,10, BS_AUTOCHECKBOX + LTEXT "&暑氤:", 1091 ,6,110,30,9 COMBOBOX 1139,6,120,84,100,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP - GROUPBOX "&邻纤",grp2,98,72,120,36,WS_GROUP - CTEXT "崃饴AaBb",stc5,103,80,109,24,SS_NOPREFIX | NOT WS_VISIBLE - LTEXT "笏疑性:",stc7 ,98,114,80,9 + GROUPBOX "&丘噻铌",grp2,98,72,120,36,WS_GROUP + CTEXT "类玲AaBb",stc5,103,80,109,24,SS_NOPREFIX | NOT WS_VISIBLE + LTEXT "殃痂矧:",stc7 ,98,114,80,9 COMBOBOX cmb5,98,124,120,10,CBS_DROPDOWNLIST |CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP } @@ -149,23 +149,23 @@ FONT 8, "Ms Sans Serif" CHOOSE_COLOR DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 310, 185 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "і瘟 辛і砸" +CAPTION "庆稠 镟氤蝠" FONT 8, "Ms Sans Serif" { - LTEXT "&饬谙琢 辛і砸:", 1088, 4, 4, 140, 10 - LTEXT "&夏猎讼і 讼特弦:", 1089, 4, 106, 140, 10 - LTEXT "胂і襹&躺姿", 1090, 150, 151, 48, 10 - LTEXT "&易衔墒:", 726 /*1094*/,254,126,32,10 + LTEXT "&拎珙忄 镟氤蝠:", 1088, 4, 4, 140, 10 + LTEXT "&钿囹觐獬 觐朦铕:", 1089, 4, 106, 140, 10 + LTEXT "暑氤饇青&腓怅", 1090, 150, 151, 48, 10 + LTEXT "&族疴铐栝:", 726 /*1094*/,254,126,32,10 EDITTEXT 706, 288,124,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP - LTEXT "&膛紊:",727/*1095*/,254,140,32,10 + LTEXT "&清脲龛:",727/*1095*/,254,140,32,10 EDITTEXT 707, 288,138,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP - LTEXT "&晌і:",728 /*1096*/,264,154,24,10 + LTEXT "&桧抽:",728 /*1096*/,264,154,24,10 EDITTEXT 708, 288,152,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP - LTEXT "і&і蜗:" ,723 /*1091*/,202,126,30,10 + LTEXT "鲁&虺眍:" ,723 /*1091*/,202,126,30,10 EDITTEXT 703, 234,124,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP - LTEXT "&胂卧伊釉:" ,724 /*1092*/,199,140,34,10 + LTEXT "&暑眚疣耱:" ,724 /*1092*/,199,140,34,10 EDITTEXT 704, 234,138,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP - LTEXT "&裼艘磷і釉:" ,725 /*1093*/,202,154,30,10 + LTEXT "&唏牮噔绸螯:" ,725 /*1093*/,202,154,30,10 EDITTEXT 705, 234,152,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP CONTROL "" ,720,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP,4,14,140,86 CONTROL "" ,721,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP,4,116,140,28 @@ -173,258 +173,258 @@ FONT 8, "Ms Sans Serif" CONTROL "" ,702,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP, 278,4,8,116 CONTROL "" ,709,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP, 152,124,40,26 DEFPUSHBUTTON "OK", IDOK, 4, 166, 44, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "і耐і瘟", IDCANCEL, 52, 166, 44, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "湎і乃", 1038,100,166, 44, 14 - PUSHBUTTON "&湎牧陨 南 瘟孪艺", 712/*1024*/, 152, 166, 142, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "&魃谖赁稍 讼і >>", 719/*1025*/, 4, 150, 142, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "鲁潇稠", IDCANCEL, 52, 166, 44, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "念獬潢", 1038,100,166, 44, 14 + PUSHBUTTON "&念溧蜩 漕 磬犷痼", 712/*1024*/, 152, 166, 142, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&妈珥圜栩 觐氤 >>", 719/*1025*/, 4, 150, 142, 14, WS_GROUP | WS_TABSTOP PUSHBUTTON "&i",713,300,200,4,14 /* just a dummy: 'i' is like &i in "sol&id" */ } FINDDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 245, 62 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "鹣壅" +CAPTION "项" FONT 8, "Ms Sans Serif" { - LTEXT "&邻纤:", -1, 4, 8, 42, 8 + LTEXT "&丘噻铌:", -1, 4, 8, 42, 8 EDITTEXT 1152, 47, 7, 138, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP - CHECKBOX "&焐叟 犹献 і趟贤", 1040, 4, 26, 100, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - CHECKBOX "і &遗ґі釉艺", 1041, 4, 42, 100, 12, BS_AUTOCHECKBOX | WS_TABSTOP - GROUPBOX "盍幸淹", 1072, 107, 26, 78, 28 - CONTROL "&髑弦", 1056, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 111, 38, 40, 12 - CONTROL "&紊", 1057, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 152, 38, 30, 12 + CHECKBOX "&髓 耠钼 龀腙铎", 1040, 4, 26, 100, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "青氤 &疱闯耱痼", 1041, 4, 42, 100, 12, BS_AUTOCHECKBOX | WS_TABSTOP + GROUPBOX "袜镳", 1072, 107, 26, 78, 28 + CONTROL "&裸铕", 1056, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 111, 38, 40, 12 + CONTROL "&龛", 1057, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 152, 38, 30, 12 - DEFPUSHBUTTON "&瘟试 牧і", IDOK, 190, 5, 50, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON - PUSHBUTTON "і耐і瘟", IDCANCEL , 190, 23, 50, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "&湎і乃", pshHelp , 190, 45, 50, 14, WS_GROUP | WS_TABSTOP + DEFPUSHBUTTON "&磬轵 溧氤", IDOK, 190, 5, 50, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON + PUSHBUTTON "鲁潇稠", IDCANCEL , 190, 23, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&念獬潢", pshHelp , 190, 45, 50, 14, WS_GROUP | WS_TABSTOP } REPLACEDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 230, 94 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "і瘟" +CAPTION "青斐磬" FONT 8, "Ms Sans Serif" { - LTEXT "&邻纤:", -1, 4, 9, 48, 8 + LTEXT "&丘噻铌:", -1, 4, 9, 48, 8 EDITTEXT 1152, 54, 7, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP - LTEXT "&镣і紊陨 瘟:", -1, 4, 26, 48, 8 + LTEXT "&囔稠栩 磬:", -1, 4, 26, 48, 8 EDITTEXT 1153, 54, 24, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP - CHECKBOX "&焐叟 犹献 і趟贤", 1040, 5, 46, 104, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - CHECKBOX "і &遗ґі釉艺", 1041, 5, 62, 104, 12, BS_AUTOCHECKBOX | WS_TABSTOP + CHECKBOX "&髓 耠钼 龀腙铎", 1040, 5, 46, 104, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "青氤 &疱闯耱痼", 1041, 5, 62, 104, 12, BS_AUTOCHECKBOX | WS_TABSTOP - DEFPUSHBUTTON "&瘟试 牧і", IDOK, 174, 4, 50, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON - PUSHBUTTON "&і紊陨", psh1 , 174, 21, 50, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "і紊陨 &子", psh2 , 174, 38, 50, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "і耐і瘟", IDCANCEL , 174, 55, 50, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "&湎і乃", pshHelp , 174, 75, 50, 14, WS_GROUP | WS_TABSTOP + DEFPUSHBUTTON "&磬轵 溧氤", IDOK, 174, 4, 50, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON + PUSHBUTTON "&青斐龛蜩", psh1 , 174, 21, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "青斐龛蜩 &怦", psh2 , 174, 38, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "鲁潇稠", IDCANCEL , 174, 55, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&念獬潢", pshHelp , 174, 75, 50, 14, WS_GROUP | WS_TABSTOP } PRINT32 DIALOG LOADONCALL MOVEABLE DISCARDABLE 32, 32, 288, 186 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | DS_CONTEXTHELP | DS_3DLOOK -CAPTION "湟账" +CAPTION "酿箨" FONT 8, "Ms Sans Serif" { DEFPUSHBUTTON "OK", IDOK, 180,164, 48,14, WS_GROUP | BS_DEFPUSHBUTTON - PUSHBUTTON "і耐і瘟", IDCANCEL, 232,164, 48,14, WS_GROUP - PUSHBUTTON "&湎і乃", pshHelp, 50, 161, 48,14, WS_GROUP + PUSHBUTTON "鲁潇稠", IDCANCEL, 232,164, 48,14, WS_GROUP + PUSHBUTTON "&念獬潢", pshHelp, 50, 161, 48,14, WS_GROUP - GROUPBOX "鹨晌耘", grp4, 8, 4, 272,84, WS_GROUP - CONTROL "湟账 屏&", chx1, "Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,212,70,64,12 - PUSHBUTTON "&魈劣陨紫釉і", psh2, 212, 17, 60,14, WS_GROUP - LTEXT "&І':", stc6, 16, 20, 36,8 + GROUPBOX "橡桧蝈", grp4, 8, 4, 272,84, WS_GROUP + CONTROL "酿箨 羿&", chx1, "Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,212,70,64,12 + PUSHBUTTON "&码囫蜩忸耱", psh2, 212, 17, 60,14, WS_GROUP + LTEXT "&察':", stc6, 16, 20, 36,8 COMBOBOX cmb4, 52, 18, 152,152,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP - LTEXT "笤猎沼:", stc8, 16, 36, 36,10, SS_NOPREFIX - LTEXT "逋仗叵琢蜗", stc12, 60, 36, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP - LTEXT "羯:", stc7, 16, 48, 36,10, SS_NOPREFIX - LTEXT "逋仗叵琢蜗", stc11, 60, 48, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP - LTEXT "і用:", stc10, 16, 60, 36,10, SS_NOPREFIX - LTEXT "逋仗叵琢蜗", stc14, 60, 60, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP - LTEXT "鹨赏і运:", stc13, 16, 72, 36,10, SS_NOPREFIX - LTEXT "逋仗叵琢蜗", stc13, 60, 72, 152,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "羊囹篑:", stc8, 16, 36, 36,10, SS_NOPREFIX + LTEXT "澎箅忄眍", stc12, 60, 36, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "诣:", stc7, 16, 48, 36,10, SS_NOPREFIX + LTEXT "澎箅忄眍", stc11, 60, 48, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "坛聆:", stc10, 16, 60, 36,10, SS_NOPREFIX + LTEXT "澎箅忄眍", stc14, 60, 60, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "橡桁瞅赅:", stc13, 16, 72, 36,10, SS_NOPREFIX + LTEXT "澎箅忄眍", stc13, 60, 72, 152,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP - GROUPBOX "胂ії", grp2, 160, 92, 120,64, WS_GROUP - LTEXT "犹 &讼і:",stc5,168,108,68,8 + GROUPBOX "暑锍", grp2, 160, 92, 120,64, WS_GROUP + LTEXT "阻耠 &觐锍:",stc5,168,108,68,8 ICON "", ico3, 162,124, 76,24, WS_GROUP | SS_CENTERIMAGE - CONTROL "&蛳诼稍", chx2,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,230,130,40,12 + CONTROL "&蓄玑栩", chx2,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,230,130,40,12 EDITTEXT edt3, 240,106, 32,12, WS_GROUP | ES_NUMBER - GROUPBOX "湟账兆猎", grp1, 8,92, 144,64, WS_GROUP - CONTROL "&饔", rad1,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,16,106,64,12 - CONTROL "&笤弦і嗡", rad3,"Button",BS_AUTORADIOBUTTON,16,122,50,12 - CONTROL "&魃і膛挝", rad2,"Button",BS_AUTORADIOBUTTON,16,138,64,12 + GROUPBOX "酿箨筲囹", grp1, 8,92, 144,64, WS_GROUP + CONTROL "&埋", rad1,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,16,106,64,12 + CONTROL "&羊铕稠觇", rad3,"Button",BS_AUTORADIOBUTTON,16,122,50,12 + CONTROL "&妈涑脲眄", rad2,"Button",BS_AUTORADIOBUTTON,16,138,64,12 EDITTEXT edt1, 85,122, 20,12, WS_GROUP | ES_NUMBER EDITTEXT edt2, 120,122, 20,12, WS_GROUP | ES_NUMBER - RTEXT "&і:", stc2, 70,124, 10,8 - RTEXT "&南:", stc3, 106,124, 10,8 + RTEXT "&獬:", stc2, 70,124, 10,8 + RTEXT "&漕:", stc3, 106,124, 10,8 } PRINT32_SETUP DIALOG LOADONCALL MOVEABLE DISCARDABLE 32, 32, 288, 178 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | DS_CONTEXTHELP | DS_3DLOOK -CAPTION "跤粤蜗姿 幸晌耘伊" +CAPTION "玉蜞眍怅 镳桧蝈疣" FONT 8, "Ms Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,180,156,48,14,WS_GROUP - PUSHBUTTON "і耐і瘟",IDCANCEL,232,156,48,14 -/* PUSHBUTTON "і运...", psh5, 284,156,48,14 */ + PUSHBUTTON "鲁潇稠",IDCANCEL,232,156,48,14 +/* PUSHBUTTON "殉蜿...", psh5, 284,156,48,14 */ - GROUPBOX "鹨晌耘", grp4, 8, 4, 272,84, WS_GROUP - PUSHBUTTON "&魈劣陨紫釉і", psh2, 212, 17, 60,14, WS_GROUP - LTEXT "&І':", stc6, 16, 20, 36,8 + GROUPBOX "橡桧蝈", grp4, 8, 4, 272,84, WS_GROUP + PUSHBUTTON "&码囫蜩忸耱", psh2, 212, 17, 60,14, WS_GROUP + LTEXT "&察':", stc6, 16, 20, 36,8 COMBOBOX cmb1, 52, 18, 152,152,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP - LTEXT "笤猎沼:", stc8, 16, 36, 36,10, SS_NOPREFIX - LTEXT "逋仗叵琢蜗", stc12, 52, 36, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP - LTEXT "羯:", stc7, 16, 48, 36,10, SS_NOPREFIX - LTEXT "逋仗叵琢蜗", stc11, 52, 48, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP - LTEXT "і用:", stc10, 16, 60, 36,10, SS_NOPREFIX - LTEXT "逋仗叵琢蜗", stc14, 52, 60, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP - LTEXT "鹨赏і运:", stc9, 16, 72, 36,10, SS_NOPREFIX - LTEXT "逋仗叵琢і", stc13, 52, 72, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "羊囹篑:", stc8, 16, 36, 36,10, SS_NOPREFIX + LTEXT "澎箅忄眍", stc12, 52, 36, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "诣:", stc7, 16, 48, 36,10, SS_NOPREFIX + LTEXT "澎箅忄眍", stc11, 52, 48, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "坛聆:", stc10, 16, 60, 36,10, SS_NOPREFIX + LTEXT "澎箅忄眍", stc14, 52, 60, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "橡桁瞅觇:", stc9, 16, 72, 36,10, SS_NOPREFIX + LTEXT "澎箅忄沓", stc13, 52, 72, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP - GROUPBOX "鹆і", grp2, 8, 92, 164,56, WS_GROUP - LTEXT "蛳&і:", stc2, 16,108, 36, 8 + GROUPBOX "相锍", grp2, 8, 92, 164,56, WS_GROUP + LTEXT "蓄&斐:", stc2, 16,108, 36, 8 COMBOBOX cmb2, 52,106, 112,112,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP - LTEXT "&渲乓盘:", stc3, 16,128, 36, 8 + LTEXT "&逆屦咫:", stc3, 16,128, 36, 8 COMBOBOX cmb3, 52,126, 112,112,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP - GROUPBOX "镆іє卧撩і", grp1, 180, 92, 100,56, WS_GROUP + GROUPBOX "勿澈眚圉", grp1, 180, 92, 100,56, WS_GROUP ICON "", ico1, 195,112, 18,20, WS_GROUP - CONTROL "&鹣以遗", rad1,"Button",BS_AUTORADIOBUTTON | WS_GROUP |WS_TABSTOP,224,106,52,12 - CONTROL "&廖嫩疗", rad2,"Button",BS_AUTORADIOBUTTON,224,126,52,12 + CONTROL "&项痱疱", rad1,"Button",BS_AUTORADIOBUTTON | WS_GROUP |WS_TABSTOP,224,106,52,12 + CONTROL "&囗澍圄", rad2,"Button",BS_AUTORADIOBUTTON,224,126,52,12 END NEWFILEOPENORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 280, 164 STYLE DS_MODALFRAME | DS_CONTEXTHELP | WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_CLIPCHILDREN -CAPTION "і乃疑陨" +CAPTION "鲁潢痂蜩" FONT 8, "MS Sans Serif" { - LTEXT "肆陨 &",IDC_LOOKINSTATIC,4,6,43,8, SS_NOTIFY + LTEXT "伢赅蜩 &",IDC_LOOKINSTATIC,4,6,43,8, SS_NOTIFY COMBOBOX IDC_LOOKIN,49,3,132,100,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP LTEXT "" , IDC_TOOLBARSTATIC, 181, 2, 102, 17, NOT WS_GROUP | NOT WS_VISIBLE LISTBOX IDC_SHELLSTATIC,4,20,272,85, LBS_SORT | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | WS_HSCROLL | NOT WS_VISIBLE - LTEXT "І' &屏侍:",IDC_FILENAMESTATIC,5,112,46,8, SS_NOTIFY + LTEXT "察' &羿殡:",IDC_FILENAMESTATIC,5,112,46,8, SS_NOTIFY EDITTEXT IDC_FILENAME,54,110,155,12,ES_AUTOHSCROLL - LTEXT "媪侍 &陨姓",IDC_FILETYPESTATIC,5,128,42,8, SS_NOTIFY - COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "脏殡 &蜩矬",IDC_FILETYPESTATIC,5,128,42,8, SS_NOTIFY + COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP - CONTROL "焐叟 奶 &奚粤挝",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,145,100,10 + CONTROL "髓 潆 &麒蜞眄",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,145,100,10 - DEFPUSHBUTTON "&і乃疑陨", IDOK,222,110,50,14 - PUSHBUTTON "і耐і瘟", IDCANCEL,222,128,50,14 - PUSHBUTTON "&湎і乃", pshHelp,222,145,50,14 + DEFPUSHBUTTON "&鲁潢痂蜩", IDOK,222,110,50,14 + PUSHBUTTON "鲁潇稠", IDCANCEL,222,128,50,14 + PUSHBUTTON "&念獬潢", pshHelp,222,145,50,14 } STRINGTABLE DISCARDABLE { - IDS_ABOUTBOX "&鹨 耘釉 魃і音潘" - IDS_DOCUMENTFOLDERS "襞松 南苏团卧і" - IDS_PERSONAL "硐ї 南苏团卧" - IDS_FAVORITES "颂聊松" - IDS_PATH "笊釉磐紊 厶讶" - IDS_DESKTOP "笤і特紊醚" - IDS_FONTS "善陨" - IDS_MYCOMPUTER "і 讼托'涝乓" + IDS_ABOUTBOX "&橡 蝈耱 妈岢鹨尻" + IDS_DOCUMENTFOLDERS "义觇 漕牦戾眚斥" + IDS_PERSONAL "填 漕牦戾眚" + IDS_FAVORITES "青觌噤觇" + IDS_PATH "谚耱屐龛 " + IDS_DESKTOP "羊畴桷" + IDS_FONTS "仞梏蜩" + IDS_MYCOMPUTER "坛 觐祜'屦" } STRINGTABLE DISCARDABLE { - IDS_SYSTEMFOLDERS "笊釉磐і 耘松" - IDS_LOCALHARDRIVES "煜肆特і 窒矣运і 纳铀" - IDS_FILENOTFOUND "媪侍 闻 谖潦呐蜗" - IDS_VERIFYFILE "鹋遗і以, 奚 幸磷商匚 姿邻廖 і' 屏侍" - IDS_CREATEFILE "媪侍 闻 і游є\n 认夼耘 魃 氏窍 釉紫疑陨?" - IDS_OVERWRITEFILE "媪侍 罩 і游є.\nі紊陨 氏窍?" - IDS_INVALID_FILENAME_TITLE "钆і椅墒 由妥咸 诹猩诱 厶讶" - IDS_INVALID_FILENAME "І' 屏侍 闻 拖峙 і釉稍 瘟釉招і 由妥咸: \n / : < > |" - IDS_PATHNOTEXISTING "讶 闻 і游є" - IDS_FILENOTEXISTING "媪侍 闻 і游є" + IDS_SYSTEMFOLDERS "谚耱屐沓 蝈觇" + IDS_LOCALHARDRIVES "祟赅朦沓 骖瘃蜿 滂耜" + IDS_FILENOTFOUND "脏殡 礤 珥嚅溴眍" + IDS_VERIFYFILE "襄疱獬痱, 麒 镳噔桦 怅噻囗 踌' 羿殡" + IDS_CREATEFILE "脏殡 礤 绸眢篭n阻 躅麇蝈 妈 轭泐 耱忸痂蜩?" + IDS_OVERWRITEFILE "脏殡 箧 绸眢.\n青斐龛蜩 轭泐?" + IDS_INVALID_FILENAME_TITLE "湾獬痦栝 耔焘铍 玎镨耋 躞" + IDS_INVALID_FILENAME "察' 羿殡 礤 祛驽 斐耱栩 磬耱箫沓 耔焘铍: \n / : < > |" + IDS_PATHNOTEXISTING "仉 礤 绸眢" + IDS_FILENOTEXISTING "脏殡 礤 绸眢" } STRINGTABLE DISCARDABLE { - IDS_UPFOLDER "髑弦 瘟 夏晌 і着呜" - IDS_NEWFOLDER "笤紫疑陨 蜗渍 耘苏" - IDS_LISTVIEW "笮捎纤" - IDS_REPORTVIEW "鹣囊下擅і" - IDS_TODESKTOP "鹋遗і 瘟 釉і特紊美" + IDS_UPFOLDER "裸铕 磬 钿桧 鸪忮睃" + IDS_NEWFOLDER "羊忸痂蜩 眍怏 蝈牦" + IDS_LISTVIEW "扬桉铌" + IDS_REPORTVIEW "项漯钺桷" + IDS_TODESKTOP "襄疱醭 磬 耱畴桷" } STRINGTABLE DISCARDABLE { - PD32_PRINT_TITLE "湟账" + PD32_PRINT_TITLE "酿箨" - PD32_VALUE_UREADABLE "钆奚粤є蜕 盘磐盼" - PD32_INVALID_PAGE_RANGE "闩 谖赁盼窝 闻 膛稚载 і列邻衔і 釉弦і蜗薥n\ -髯拍і载 谖赁盼闻 і %d 粤 %d" - PD32_FROM_NOT_ABOVE_TO "赁盼窝 І 闻 邢咨挝 信遗咨菡琢陨 滹:" - PD32_MARGINS_OVERLAP "砼і 信遗艘勺晾载 奚 信遗咨菡涝 \ -蚁谕і疑 辛信艺.\n髯拍і载 ї 瘟蜗紫" - PD32_NR_OF_COPIES_EMPTY "赁盼窝 犹 胂і 闻 拖峙 抡陨 \ -姓釉赏" - PD32_TOO_LARGE_COPIES "袅肆 着躺肆 і特і釉 讼і 闻 \ -拖峙 抡陨 瘟囊账献廖 髁凵 幸晌耘蚁.\n髯拍і载 谖赁盼窝 і 1 粤 %d" - PD32_PRINT_ERROR "魃紊颂 邢蜕趟 幸晌耘伊" - PD32_NO_DEFAULT_PRINTER "钆土є 幸晌耘伊, 邢釉磷膛蜗窍 诹 下胀献膛挝淹" - PD32_CANT_FIND_PRINTER "钆 啄撂嫌 谖潦陨 幸晌耘" - PD32_OUT_OF_MEMORY "砹滔 辛'言і" - PD32_GENERIC_ERROR "魃紊颂() 邢蜕趟()" - PD32_DRIVER_UNKNOWN "钆і南蜕 囊潦着 幸晌耘伊" + PD32_VALUE_UREADABLE "湾麒蜞红栝 咫屐屙" + PD32_INVALID_PAGE_RANGE "皱 珥圜屙 礤 脲骅螯 涑囡噻铐 耱铕稠铌\n\ +骡邃瞅 珥圜屙礤 斐 %d 蜞 %d" + PD32_FROM_NOT_ABOVE_TO "琼圜屙 虏 礤 镱忤眄 镥疱忤忄蜩 奈:" + PD32_MARGINS_OVERLAP "体娉 镥疱牮桠帼螯 麒 镥疱忤 \ +痤珈仇 镟镥痼.\n骡邃瞅 旷 磬眍忸" + PD32_NR_OF_COPIES_EMPTY "琼圜屙 阻耠 暑锍 礤 祛驽 狍蜩 \ +矬耱桁" + PD32_TOO_LARGE_COPIES "亦赅 忮腓赅 瓿朦瓿耱 觐锍 礤 \ +祛驽 狍蜩 磬漯箨钼囗 锣 镳桧蝈痤.\n骡邃瞅 珥圜屙 斐 1 蜞 %d" + PD32_PRINT_ERROR "妈龛觌 镱扈腙 镳桧蝈疣" + PD32_NO_DEFAULT_PRINTER "湾爨 镳桧蝈疣, 镱耱噔脲眍泐 玎 钺箪钼脲眄" + PD32_CANT_FIND_PRINTER "湾 怃嚯铖 珥嚅蜩 镳桧蝈" + PD32_OUT_OF_MEMORY "锑腩 镟'虺" + PD32_GENERIC_ERROR "妈龛觌() 镱扈腙()" + PD32_DRIVER_UNKNOWN "湾獬漕扈 漯嚅忮 镳桧蝈疣" - PD32_DEFAULT_PRINTER "鹨晌耘 诹 下胀献膛挝淹; " - PD32_NR_OF_DOCUMENTS_IN_QUEUE "%d 南苏团卧і 夼亿і" - PD32_PRINT_ALL_X_PAGES "&饔і %d 釉弦і蜗" - PD32_MARGINS_IN_INCHES "砼і [睦释蒥" - PD32_MARGINS_IN_MILIMETERS "砼і [屯]" - PD32_MILIMETERS "屯" + PD32_DEFAULT_PRINTER "橡桧蝈 玎 钺箪钼脲眄; " + PD32_NR_OF_DOCUMENTS_IN_QUEUE "%d 漕牦戾眚斥 麇痃" + PD32_PRINT_ALL_X_PAGES "&埋 %d 耱铕稠铌" + PD32_MARGINS_IN_INCHES "体娉 [濑殪鑍" + PD32_MARGINS_IN_MILIMETERS "体娉 [祆]" + PD32_MILIMETERS "祆" - PD32_PRINTER_STATUS_READY "缦韵紫" - PD32_PRINTER_STATUS_PAUSED "鹨哨招晌盼; " - PD32_PRINTER_STATUS_ERROR "鹣蜕趟; " - PD32_PRINTER_STATUS_PENDING_DELETION "肆挝 咨牧膛挝; " - PD32_PRINTER_STATUS_PAPER_JAM "鹆і 诹釉已; " - PD32_PRINTER_STATUS_PAPER_OUT "钆 咨釉赁є 辛信艺; " - PD32_PRINTER_STATUS_MANUAL_FEED "鹣釉磷耘 辛і 滓辙握; " - PD32_PRINTER_STATUS_PAPER_PROBLEM "鹨下膛土 辛信蚁; " - PD32_PRINTER_STATUS_OFFLINE "鹨晌耘 遗稚і offline; " - PD32_PRINTER_STATUS_IO_ACTIVE "髯і/魃і 了陨孜墒; " - PD32_PRINTER_STATUS_BUSY "饰言墒; " - PD32_PRINTER_STATUS_PRINTING "昴 囊账; " - PD32_PRINTER_STATUS_OUTPUT_BIN_FULL "煜韵 信遗邢孜盼墒 辛信蚁; " - PD32_PRINTER_STATUS_NOT_AVAILABLE "钆 南釉招紊; " - PD32_PRINTER_STATUS_WAITING "肆挝; " - PD32_PRINTER_STATUS_PROCESSING "锫蚁滤; " - PD32_PRINTER_STATUS_INITIALIZING "缦哉琢挝; " - PD32_PRINTER_STATUS_WARMING_UP "鹨锨і; " - PD32_PRINTER_STATUS_TONER_LOW "粝闻 幸 і蚊і; " - PD32_PRINTER_STATUS_NO_TONER "钆土 韵闻伊; " + PD32_PRINTER_STATUS_READY "妙蝾忸" + PD32_PRINTER_STATUS_PAUSED "橡桤箫桧屙; " + PD32_PRINTER_STATUS_ERROR "项扈腙; " + PD32_PRINTER_STATUS_PENDING_DELETION "族赅眄 忤溧脲眄; " + PD32_PRINTER_STATUS_PAPER_JAM "相锍 玎耱; " + PD32_PRINTER_STATUS_PAPER_OUT "湾 忤耱圜嗪 镟镥痼; " + PD32_PRINTER_STATUS_MANUAL_FEED "项耱噔蝈 镟锍 怵篦眢; " + PD32_PRINTER_STATUS_PAPER_PROBLEM "橡钺脲爨 镟镥痤; " + PD32_PRINTER_STATUS_OFFLINE "橡桧蝈 疱骅斐 offline; " + PD32_PRINTER_STATUS_IO_ACTIVE "骡充/妈獬 嚓蜩忭栝; " + PD32_PRINTER_STATUS_BUSY "青轫蜩; " + PD32_PRINTER_STATUS_PRINTING "射 漯箨; " + PD32_PRINTER_STATUS_OUTPUT_BIN_FULL "祟蝾 镥疱镱忭屙栝 镟镥痤; " + PD32_PRINTER_STATUS_NOT_AVAILABLE "湾 漕耱箫龛; " + PD32_PRINTER_STATUS_WAITING "族赅眄; " + PD32_PRINTER_STATUS_PROCESSING "吾痤彡; " + PD32_PRINTER_STATUS_INITIALIZING "妙蝮忄眄; " + PD32_PRINTER_STATUS_WARMING_UP "橡钽鸪; " + PD32_PRINTER_STATUS_TONER_LOW "翌礤 镳 瓿眦; " + PD32_PRINTER_STATUS_NO_TONER "湾爨 蝾礤疣; " PD32_PRINTER_STATUS_PAGE_PUNT "Page punt; " - PD32_PRINTER_STATUS_USER_INTERVENTION "鹋遗易廖 讼疑釉兆赁磐; " - PD32_PRINTER_STATUS_OUT_OF_MEMORY "砹滔 辛'言і; " - PD32_PRINTER_STATUS_DOOR_OPEN "胍邵肆 幸晌耘伊 і乃疑粤; " - PD32_PRINTER_STATUS_SERVER_UNKNOWN "钆і南蜕 优易乓 幸晌耘伊; " - PD32_PRINTER_STATUS_POWER_SAVE "錾滋盼窝 屡谛呸蜗驼 遗稚і; " + PD32_PRINTER_STATUS_USER_INTERVENTION "襄疱疴囗 觐痂耱筲圜屐; " + PD32_PRINTER_STATUS_OUT_OF_MEMORY "锑腩 镟'虺; " + PD32_PRINTER_STATUS_DOOR_OPEN "署桫赅 镳桧蝈疣 獬潢痂蜞; " + PD32_PRINTER_STATUS_SERVER_UNKNOWN "湾獬漕扈 皴疴屦 镳桧蝈疣; " + PD32_PRINTER_STATUS_POWER_SAVE "畦怆屙 徨顼鬻眍祗 疱骅斐; " } STRINGTABLE DISCARDABLE /* Color names */ { - IDS_COLOR_BLACK "椅墒" - IDS_COLOR_MAROON "庖瘴猎紊" - IDS_COLOR_GREEN "膛紊" - IDS_COLOR_OLIVE "锾勺讼咨" - IDS_COLOR_NAVY "笊і" - IDS_COLOR_PURPLE "鹫倚找紊" - IDS_COLOR_TEAL "膛蜗-由і" - IDS_COLOR_GRAY "і疑" - IDS_COLOR_SILVER "笠і挛墒" - IDS_COLOR_RED "易衔墒" - IDS_COLOR_LIME "罅塘韵咨" - IDS_COLOR_YELLOW "鱿自墒" - IDS_COLOR_BLUE "缦陶律" - IDS_COLOR_FUCHSIA "і咸旁献墒" - IDS_COLOR_AQUA "崴琢土疑" - IDS_COLOR_WHITE "і躺" + IDS_COLOR_BLACK "最痦栝" + IDS_COLOR_MAROON "琉箜囹龛" + IDS_COLOR_GREEN "清脲龛" + IDS_COLOR_OLIVE "坞桠觐忤" + IDS_COLOR_NAVY "谚沓" + IDS_COLOR_PURPLE "象痫箴龛" + IDS_COLOR_TEAL "清脲眍-耔沓" + IDS_COLOR_GRAY "殉痂" + IDS_COLOR_SILVER "佯翅龛" + IDS_COLOR_RED "族疴铐栝" + IDS_COLOR_LIME "燕豚蝾忤" + IDS_COLOR_YELLOW "祁怛栝" + IDS_COLOR_BLUE "妙塍徼" + IDS_COLOR_FUCHSIA "猿铍弪钼栝" + IDS_COLOR_AQUA "狸忄爨痂" + IDS_COLOR_WHITE "脸腓" } diff --git a/reactos/lib/comdlg32/filedlg.c b/reactos/lib/comdlg32/filedlg.c index c03dc80f4c8..933fe9be4b2 100644 --- a/reactos/lib/comdlg32/filedlg.c +++ b/reactos/lib/comdlg32/filedlg.c @@ -32,8 +32,6 @@ * * FIXME: old style hook messages are not implemented (except FILEOKSTRING) * - * FIXME: lpstrCustomFilter not handled - * * FIXME: algorithm for selecting the initial directory is too simple * * FIXME: add to recent docs @@ -379,10 +377,10 @@ BOOL WINAPI GetFileDialog95A(LPOPENFILENAMEA ofn,UINT iDlgType) LPCSTR s; int n, len; - /* filter is a list... title\0ext\0......\0\0 */ + /* customfilter contains a pair of strings... title\0ext\0 */ s = ofn->lpstrCustomFilter; - while (*s) s = s+strlen(s)+1; - s++; + if (*s) s = s+strlen(s)+1; + if (*s) s = s+strlen(s)+1; n = s - ofn->lpstrCustomFilter; len = MultiByteToWideChar( CP_ACP, 0, ofn->lpstrCustomFilter, n, NULL, 0 ); customfilter = MemAlloc(len*sizeof(WCHAR)); @@ -438,8 +436,6 @@ BOOL WINAPI GetFileDialog95A(LPOPENFILENAMEA ofn,UINT iDlgType) * Copy the OPENFILENAMEW structure in a FileOpenDlgInfos structure. * Call GetFileName95 with this structure and clean the memory. * - * FIXME: lpstrCustomFilter has to be converted back - * */ BOOL WINAPI GetFileDialog95W(LPOPENFILENAMEW ofn,UINT iDlgType) { @@ -1983,6 +1979,22 @@ BOOL FILEDLG95_OnOpen(HWND hwnd) } } + /* copy currently selected filter to lpstrCustomFilter */ + if (fodInfos->ofnInfos->lpstrCustomFilter) + { + LPOPENFILENAMEA ofn = fodInfos->ofnInfos; + int len = WideCharToMultiByte(CP_ACP, 0, fodInfos->ShellInfos.lpstrCurrentFilter, -1, + NULL, 0, NULL, NULL); + if (len + strlen(ofn->lpstrCustomFilter) + 1 <= ofn->nMaxCustFilter) + { + LPSTR s = ofn->lpstrCustomFilter; + s += strlen(ofn->lpstrCustomFilter)+1; + WideCharToMultiByte(CP_ACP, 0, fodInfos->ShellInfos.lpstrCurrentFilter, -1, + s, len, NULL, NULL); + } + } + + if ( !FILEDLG95_SendFileOK(hwnd, fodInfos) ) goto ret; @@ -2148,13 +2160,34 @@ static void FILEDLG95_SHELL_Clean(HWND hwnd) static HRESULT FILEDLG95_FILETYPE_Init(HWND hwnd) { FileOpenDlgInfos *fodInfos = (FileOpenDlgInfos *) GetPropA(hwnd,FileOpenDlgInfosStr); + int nFilters = 0; /* number of filters */ + int nFilterIndexCB; TRACE("\n"); + if(fodInfos->customfilter) + { + /* customfilter has one entry... title\0ext\0 + * Set first entry of combo box item with customfilter + */ + LPWSTR lpstrExt; + LPCWSTR lpstrPos = fodInfos->customfilter; + + /* Get the title */ + lpstrPos += strlenW(fodInfos->customfilter) + 1; + + /* Copy the extensions */ + if (! *lpstrPos) return E_FAIL; /* malformed filter */ + if (!(lpstrExt = MemAlloc((strlenW(lpstrPos)+1)*sizeof(WCHAR)))) return E_FAIL; + strcpyW(lpstrExt,lpstrPos); + + /* Add the item at the end of the combo */ + CBAddStringW(fodInfos->DlgInfos.hwndFileTypeCB, fodInfos->customfilter); + CBSetItemDataPtr(fodInfos->DlgInfos.hwndFileTypeCB, nFilters, lpstrExt); + nFilters++; + } if(fodInfos->filter) { - int nFilters = 0; /* number of filters */ - LPWSTR lpstrFilter; LPCWSTR lpstrPos = fodInfos->filter; for(;;) @@ -2182,26 +2215,36 @@ static HRESULT FILEDLG95_FILETYPE_Init(HWND hwnd) CBSetItemDataPtr(fodInfos->DlgInfos.hwndFileTypeCB, nFilters, lpstrExt); nFilters++; } - /* - * Set the current filter to the one specified - * in the initialisation structure - * FIXME: lpstrCustomFilter not handled at all - */ + } + + /* + * Set the current filter to the one specified + * in the initialisation structure + */ + if (fodInfos->filter || fodInfos->customfilter) + { + LPWSTR lpstrFilter; + + /* Check to make sure our index isn't out of bounds. */ + if ( fodInfos->ofnInfos->nFilterIndex > + nFilters - (fodInfos->customfilter == NULL ? 0 : 1) ) + fodInfos->ofnInfos->nFilterIndex = (fodInfos->customfilter == NULL ? 1 : 0); /* set default filter index */ if(fodInfos->ofnInfos->nFilterIndex == 0 && fodInfos->customfilter == NULL) fodInfos->ofnInfos->nFilterIndex = 1; - /* First, check to make sure our index isn't out of bounds. */ - if ( fodInfos->ofnInfos->nFilterIndex > nFilters ) - fodInfos->ofnInfos->nFilterIndex = nFilters; + /* calculate index of Combo Box item */ + nFilterIndexCB = fodInfos->ofnInfos->nFilterIndex; + if (fodInfos->customfilter == NULL) + nFilterIndexCB--; /* Set the current index selection. */ - CBSetCurSel(fodInfos->DlgInfos.hwndFileTypeCB, fodInfos->ofnInfos->nFilterIndex-1); + CBSetCurSel(fodInfos->DlgInfos.hwndFileTypeCB, nFilterIndexCB); /* Get the corresponding text string from the combo box. */ lpstrFilter = (LPWSTR) CBGetItemDataPtr(fodInfos->DlgInfos.hwndFileTypeCB, - fodInfos->ofnInfos->nFilterIndex-1); + nFilterIndexCB); if ((INT)lpstrFilter == CB_ERR) /* control is empty */ lpstrFilter = NULL; @@ -2214,7 +2257,9 @@ static HRESULT FILEDLG95_FILETYPE_Init(HWND hwnd) fodInfos->ShellInfos.lpstrCurrentFilter = MemAlloc( len * sizeof(WCHAR) ); strcpyW(fodInfos->ShellInfos.lpstrCurrentFilter,lpstrFilter); } - } + } else + fodInfos->ofnInfos->nFilterIndex = 0; + return NOERROR; } @@ -2237,8 +2282,9 @@ static BOOL FILEDLG95_FILETYPE_OnCommand(HWND hwnd, WORD wNotifyCode) /* Get the current item of the filetype combo box */ int iItem = CBGetCurSel(fodInfos->DlgInfos.hwndFileTypeCB); - /* set the current filter index - indexed from 1 */ - fodInfos->ofnInfos->nFilterIndex = iItem + 1; + /* set the current filter index */ + fodInfos->ofnInfos->nFilterIndex = iItem + + (fodInfos->customfilter == NULL ? 1 : 0); /* Set the current filter with the current selection */ if(fodInfos->ShellInfos.lpstrCurrentFilter) diff --git a/reactos/lib/comdlg32/filedlg16.c b/reactos/lib/comdlg32/filedlg16.c index 4c3bbdd979a..0227b8f11b9 100644 --- a/reactos/lib/comdlg32/filedlg16.c +++ b/reactos/lib/comdlg32/filedlg16.c @@ -300,7 +300,7 @@ static BOOL FILEDLG_ScanDir(HWND hWnd, LPWSTR newPath) HCURSOR hCursorWait, oldCursor; TRACE("Trying to change to %s\n", debugstr_w(newPath)); - if ( !SetCurrentDirectoryW( newPath )) + if ( newPath[0] && !SetCurrentDirectoryW( newPath )) return FALSE; lstrcpynW(buffer, newPath, sizeof(buffer)/sizeof(WCHAR)); diff --git a/reactos/lib/comdlg32/winehq2ros.patch b/reactos/lib/comdlg32/winehq2ros.patch index 04afdf2914c..fa9408763a0 100644 --- a/reactos/lib/comdlg32/winehq2ros.patch +++ b/reactos/lib/comdlg32/winehq2ros.patch @@ -4,7 +4,7 @@ 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 8 May 2004 13:01:07 -0000 ++++ Makefile.in 16 Jun 2004 07:02:56 -0000 @@ -13,7 +13,6 @@ cdlg32.c \ colordlg.c \ @@ -24,11 +24,11 @@ diff -u -r1.39 Makefile.in Index: filedlg.c =================================================================== RCS file: /home/wine/wine/dlls/commdlg/filedlg.c,v -retrieving revision 1.79 -diff -u -r1.79 filedlg.c ---- filedlg.c 5 May 2004 23:49:39 -0000 1.79 -+++ filedlg.c 8 May 2004 13:01:08 -0000 -@@ -3241,6 +3241,7 @@ +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 */ { @@ -36,7 +36,7 @@ diff -u -r1.79 filedlg.c BOOL win16look = FALSE; if (ofn->Flags & (OFN_ALLOWMULTISELECT|OFN_ENABLEHOOK|OFN_ENABLETEMPLATE)) -@@ -3249,6 +3250,7 @@ +@@ -3295,6 +3296,7 @@ if (win16look) return GetFileName31A(ofn, OPEN_DIALOG); else @@ -44,7 +44,7 @@ diff -u -r1.79 filedlg.c return GetFileDialog95A(ofn, OPEN_DIALOG); } -@@ -3265,6 +3267,7 @@ +@@ -3311,6 +3313,7 @@ BOOL WINAPI GetOpenFileNameW( LPOPENFILENAMEW ofn) /* [in/out] address of init structure */ { @@ -52,7 +52,7 @@ diff -u -r1.79 filedlg.c BOOL win16look = FALSE; if (ofn->Flags & (OFN_ALLOWMULTISELECT|OFN_ENABLEHOOK|OFN_ENABLETEMPLATE)) -@@ -3273,6 +3276,7 @@ +@@ -3319,6 +3322,7 @@ if (win16look) return GetFileName31W(ofn, OPEN_DIALOG); else @@ -60,7 +60,7 @@ diff -u -r1.79 filedlg.c return GetFileDialog95W(ofn, OPEN_DIALOG); } -@@ -3290,6 +3294,7 @@ +@@ -3336,6 +3340,7 @@ BOOL WINAPI GetSaveFileNameA( LPOPENFILENAMEA ofn) /* [in/out] address of init structure */ { @@ -68,7 +68,7 @@ diff -u -r1.79 filedlg.c BOOL win16look = FALSE; if (ofn->Flags & (OFN_ALLOWMULTISELECT|OFN_ENABLEHOOK|OFN_ENABLETEMPLATE)) -@@ -3298,6 +3303,7 @@ +@@ -3344,6 +3349,7 @@ if (win16look) return GetFileName31A(ofn, SAVE_DIALOG); else @@ -76,7 +76,7 @@ diff -u -r1.79 filedlg.c return GetFileDialog95A(ofn, SAVE_DIALOG); } -@@ -3314,6 +3320,7 @@ +@@ -3360,6 +3366,7 @@ BOOL WINAPI GetSaveFileNameW( LPOPENFILENAMEW ofn) /* [in/out] address of init structure */ { @@ -84,7 +84,7 @@ diff -u -r1.79 filedlg.c BOOL win16look = FALSE; if (ofn->Flags & (OFN_ALLOWMULTISELECT|OFN_ENABLEHOOK|OFN_ENABLETEMPLATE)) -@@ -3322,5 +3329,6 @@ +@@ -3368,5 +3375,6 @@ if (win16look) return GetFileName31W(ofn, SAVE_DIALOG); else @@ -97,7 +97,7 @@ RCS file: /home/wine/wine/dlls/commdlg/printdlg.c,v retrieving revision 1.75 diff -u -r1.75 printdlg.c --- printdlg.c 19 Apr 2004 20:12:15 -0000 1.75 -+++ printdlg.c 8 May 2004 13:01:09 -0000 ++++ printdlg.c 16 Jun 2004 07:02:58 -0000 @@ -341,7 +341,7 @@ lpdm->dmCollate = (IsDlgButtonChecked(hDlg, chx2) == BST_CHECKED); From 6c4df3df68236b66a41965f477eea65c84bf0563 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Wed, 16 Jun 2004 06:58:48 +0000 Subject: [PATCH 1392/1463] Sync to Wine-20040615: Patrik Stridvall <ps@leissner.se> - Fixed some issues found by winapi_check. Krishna Murthy <Krishna.Murthy@guptaworldwide.com> - WNetGetConnection(): use QueryDosDevice to return a fake remote name instead of the drive label. svn path=/trunk/; revision=9679 --- reactos/lib/mpr/mpr_main.c | 3 +++ reactos/lib/mpr/wnet.c | 17 +++++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/reactos/lib/mpr/mpr_main.c b/reactos/lib/mpr/mpr_main.c index a155c94350f..36feb6818ff 100644 --- a/reactos/lib/mpr/mpr_main.c +++ b/reactos/lib/mpr/mpr_main.c @@ -81,6 +81,9 @@ DWORD WINAPI DllCanUnloadNow(void) return S_OK; } +/***************************************************************** + * DllMain [MPR.init] + */ BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { diff --git a/reactos/lib/mpr/wnet.c b/reactos/lib/mpr/wnet.c index 4fccc4d3b8c..bac0446ab4f 100644 --- a/reactos/lib/mpr/wnet.c +++ b/reactos/lib/mpr/wnet.c @@ -1548,6 +1548,8 @@ DWORD WINAPI WNetGetConnectionA( LPCSTR lpLocalName, WCHAR wideRemoteStatic[MAX_PATH]; DWORD wideRemoteSize = sizeof(wideRemoteStatic) / sizeof(WCHAR); + MultiByteToWideChar(CP_ACP, 0, lpLocalName, -1, wideLocalName, len); + /* try once without memory allocation */ ret = WNetGetConnectionW(wideLocalName, wideRemoteStatic, &wideRemoteSize); @@ -1633,28 +1635,27 @@ DWORD WINAPI WNetGetConnectionW( LPCWSTR lpLocalName, ret = WN_BAD_LOCALNAME; else { - WCHAR label[40]; - if (lpLocalName[1] == ':') { switch(GetDriveTypeW(lpLocalName)) { case DRIVE_REMOTE: - if (!GetVolumeInformationW( lpLocalName, label, sizeof(label), - NULL, NULL, NULL, NULL, 0 )) - label[0] = 0; - if (strlenW(label) + 1 > *lpBufferSize) + { + WCHAR remote[MAX_PATH]; + if (!QueryDosDeviceW( lpLocalName, remote, MAX_PATH )) remote[0] = 0; + if (strlenW(remote) + 1 > *lpBufferSize) { - *lpBufferSize = strlenW(label) + 1; + *lpBufferSize = strlenW(remote) + 1; ret = WN_MORE_DATA; } else { - strcpyW( lpRemoteName, label ); + strcpyW( lpRemoteName, remote ); *lpBufferSize = strlenW(lpRemoteName) + 1; ret = WN_SUCCESS; } break; + } case DRIVE_REMOVABLE: case DRIVE_FIXED: case DRIVE_CDROM: From 92599b546e37d3ac5e0da09b859366e72772fc17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Wed, 16 Jun 2004 07:06:50 +0000 Subject: [PATCH 1393/1463] Sync to Wine-20040615: Marcus Meissner <marcus@jet.franken.de> - Revert broken strict aliasing fix. Robert Shearman <R.J.Shearman@warwick.ac.uk> - Fix ref count on standard proxy creation. - Release channel buffer in StdMarshal_UnmarshalInterface, since we no longer use it and the proxy should have taken a reference on it. - Add a few comments. - Fixed CoMarshalInterThreadInterfaceInStream and CoGetInterfaceAndReleaseStream. Patrik Stridvall <ps@leissner.se> - Fixed some issues found by winapi_check. svn path=/trunk/; revision=9680 --- reactos/lib/ole32/compobj.c | 4 +- reactos/lib/ole32/datacache.c | 4 +- reactos/lib/ole32/defaulthandler.c | 8 +-- reactos/lib/ole32/filemoniker.c | 6 +- reactos/lib/ole32/ifs.c | 18 +++--- reactos/lib/ole32/itemmoniker.c | 10 +-- reactos/lib/ole32/marshal.c | 98 +++++++++++++++++++----------- reactos/lib/ole32/moniker.c | 2 +- reactos/lib/ole32/ole2.c | 18 +++--- reactos/lib/ole32/ole2impl.c | 4 +- reactos/lib/ole32/oleproxy.c | 7 ++- reactos/lib/ole32/storage32.c | 5 +- 12 files changed, 109 insertions(+), 75 deletions(-) diff --git a/reactos/lib/ole32/compobj.c b/reactos/lib/ole32/compobj.c index e4b955dd578..f66e03824d0 100644 --- a/reactos/lib/ole32/compobj.c +++ b/reactos/lib/ole32/compobj.c @@ -1015,7 +1015,7 @@ _LocalServerThread(LPVOID param) { strcpy(pipefn,PIPEPREF); WINE_StringFromCLSID(&newClass->classIdentifier,pipefn+strlen(PIPEPREF)); - hres = IUnknown_QueryInterface(newClass->classObject,&IID_IClassFactory,(LPVOID*)(char*)&classfac); + hres = IUnknown_QueryInterface(newClass->classObject,&IID_IClassFactory,(LPVOID*)&classfac); if (hres) return hres; hres = CreateStreamOnHGlobal(0,TRUE,&pStm); @@ -1543,7 +1543,7 @@ HRESULT WINAPI CoCreateInstanceEx( pUnkOuter, dwClsContext, &IID_IUnknown, - (VOID**)(char*)&pUnk); + (VOID**)&pUnk); if (hr) return hr; diff --git a/reactos/lib/ole32/datacache.c b/reactos/lib/ole32/datacache.c index efc97920981..c7cdec28038 100644 --- a/reactos/lib/ole32/datacache.c +++ b/reactos/lib/ole32/datacache.c @@ -1085,7 +1085,7 @@ static HRESULT WINAPI DataCache_GetData( { /* Get the Persist Storage */ - hr = IDataObject_QueryInterface(iface, &IID_IPersistStorage, (void**)(char*)&pPersistStorage); + hr = IDataObject_QueryInterface(iface, &IID_IPersistStorage, (void**)&pPersistStorage); if (hr != S_OK) goto cleanup; @@ -1214,7 +1214,7 @@ static HRESULT WINAPI DataCache_IDataObject_SetData( TRACE("(%p, %p, %p, %d)\n", iface, pformatetc, pmedium, fRelease); - hres = IDataObject_QueryInterface(iface, &IID_IOleCache2, (void**)(char*)&oleCache); + hres = IDataObject_QueryInterface(iface, &IID_IOleCache2, (void**)&oleCache); if (FAILED(hres)) return E_UNEXPECTED; diff --git a/reactos/lib/ole32/defaulthandler.c b/reactos/lib/ole32/defaulthandler.c index 639e84ec020..5286dad542b 100644 --- a/reactos/lib/ole32/defaulthandler.c +++ b/reactos/lib/ole32/defaulthandler.c @@ -1103,7 +1103,7 @@ static HRESULT WINAPI DefaultHandler_GetExtent( TRACE("(%p, %lx, %p)\n", iface, dwDrawAspect, psizel); - hres = IUnknown_QueryInterface(this->dataCache, &IID_IViewObject2, (void**)(char*)&cacheView); + hres = IUnknown_QueryInterface(this->dataCache, &IID_IViewObject2, (void**)&cacheView); if (FAILED(hres)) return E_UNEXPECTED; @@ -1337,7 +1337,7 @@ static HRESULT WINAPI DefaultHandler_GetData( hres = IUnknown_QueryInterface(this->dataCache, &IID_IDataObject, - (void**)(char*)&cacheDataObject); + (void**)&cacheDataObject); if (FAILED(hres)) return E_UNEXPECTED; @@ -1381,7 +1381,7 @@ static HRESULT WINAPI DefaultHandler_QueryGetData( hres = IUnknown_QueryInterface(this->dataCache, &IID_IDataObject, - (void**)(char*)&cacheDataObject); + (void**)&cacheDataObject); if (FAILED(hres)) return E_UNEXPECTED; @@ -1434,7 +1434,7 @@ static HRESULT WINAPI DefaultHandler_SetData( hres = IUnknown_QueryInterface(this->dataCache, &IID_IDataObject, - (void**)(char*)&cacheDataObject); + (void**)&cacheDataObject); if (FAILED(hres)) return E_UNEXPECTED; diff --git a/reactos/lib/ole32/filemoniker.c b/reactos/lib/ole32/filemoniker.c index 1345cd8e7c7..0beaca26609 100644 --- a/reactos/lib/ole32/filemoniker.c +++ b/reactos/lib/ole32/filemoniker.c @@ -587,7 +587,7 @@ HRESULT WINAPI FileMonikerImpl_BindToObject(IMoniker* iface, res=GetClassFile(This->filePathName,&clsID); if (SUCCEEDED(res)){ - res=CoCreateInstance(&clsID,NULL,CLSCTX_ALL,&IID_IPersistFile,(void**)(char*)&ppf); + res=CoCreateInstance(&clsID,NULL,CLSCTX_ALL,&IID_IPersistFile,(void**)&ppf); if (SUCCEEDED(res)){ res=IPersistFile_Load(ppf,This->filePathName,STGM_READ); @@ -602,11 +602,11 @@ HRESULT WINAPI FileMonikerImpl_BindToObject(IMoniker* iface, } } else{ - res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IClassFactory,(void**)(char*)&pcf); + res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IClassFactory,(void**)&pcf); if (res==E_NOINTERFACE){ - res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IClassActivator,(void**)(char*)&pca); + res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IClassActivator,(void**)&pca); if (res==E_NOINTERFACE) return MK_E_INTERMEDIATEINTERFACENOTSUPPORTED; diff --git a/reactos/lib/ole32/ifs.c b/reactos/lib/ole32/ifs.c index d84793435ed..90ad2a8ce8b 100644 --- a/reactos/lib/ole32/ifs.c +++ b/reactos/lib/ole32/ifs.c @@ -144,7 +144,7 @@ static HRESULT WINAPI IMalloc_fnQueryInterface(LPMALLOC iface,REFIID refiid,LPVO TRACE("(%s,%p)\n",debugstr_guid(refiid),obj); if (IsEqualIID(&IID_IUnknown,refiid) || IsEqualIID(&IID_IMalloc,refiid)) { - *obj = (LPMALLOC)(char*)&Malloc32; + *obj = (LPMALLOC)&Malloc32; return S_OK; } return E_NOINTERFACE; @@ -380,7 +380,7 @@ static HRESULT WINAPI IMallocSpy_fnQueryInterface(LPMALLOCSPY iface,REFIID refii TRACE("(%s,%p)\n",debugstr_guid(refiid),obj); if (IsEqualIID(&IID_IUnknown,refiid) || IsEqualIID(&IID_IMallocSpy,refiid)) { - *obj = (LPMALLOC)(char*)&MallocSpy; + *obj = (LPMALLOC)&MallocSpy; return S_OK; } return E_NOINTERFACE; @@ -530,7 +530,7 @@ static ICOM_VTABLE(IMallocSpy) VT_IMallocSpy = */ HRESULT WINAPI CoGetMalloc(DWORD dwMemContext, LPMALLOC *lpMalloc) { - *lpMalloc = (LPMALLOC)(char*)&Malloc32; + *lpMalloc = (LPMALLOC)&Malloc32; return S_OK; } @@ -541,14 +541,14 @@ HRESULT WINAPI CoGetMalloc(DWORD dwMemContext, LPMALLOC *lpMalloc) */ LPVOID WINAPI CoTaskMemAlloc(ULONG size) { - return IMalloc_Alloc((LPMALLOC)(char*)&Malloc32,size); + return IMalloc_Alloc((LPMALLOC)&Malloc32,size); } /*********************************************************************** * CoTaskMemFree [OLE32.@] */ VOID WINAPI CoTaskMemFree(LPVOID ptr) { - IMalloc_Free((LPMALLOC)(char*)&Malloc32, ptr); + IMalloc_Free((LPMALLOC)&Malloc32, ptr); } /*********************************************************************** @@ -558,7 +558,7 @@ VOID WINAPI CoTaskMemFree(LPVOID ptr) */ LPVOID WINAPI CoTaskMemRealloc(LPVOID pvOld, ULONG size) { - return IMalloc_Realloc((LPMALLOC)(char*)&Malloc32, pvOld, size); + return IMalloc_Realloc((LPMALLOC)&Malloc32, pvOld, size); } /*********************************************************************** @@ -576,13 +576,13 @@ HRESULT WINAPI CoRegisterMallocSpy(LPMALLOCSPY pMallocSpy) TRACE("\n"); /* HACK TO ACTIVATE OUT SPY */ - if (pMallocSpy == (LPVOID)-1) pMallocSpy =(IMallocSpy*)(char*)&MallocSpy; + if (pMallocSpy == (LPVOID)-1) pMallocSpy =(IMallocSpy*)&MallocSpy; if(Malloc32.pSpy) return CO_E_OBJISREG; EnterCriticalSection(&IMalloc32_SpyCS); - if (SUCCEEDED(IUnknown_QueryInterface(pMallocSpy, &IID_IMallocSpy, (LPVOID*)(char*)&pSpy))) { + if (SUCCEEDED(IUnknown_QueryInterface(pMallocSpy, &IID_IMallocSpy, (LPVOID*)&pSpy))) { Malloc32.pSpy = pSpy; hres = S_OK; } @@ -607,7 +607,7 @@ HRESULT WINAPI CoRevokeMallocSpy(void) EnterCriticalSection(&IMalloc32_SpyCS); /* if it's our spy it's time to dump the leaks */ - if (Malloc32.pSpy == (IMallocSpy*)(char*)&MallocSpy) { + if (Malloc32.pSpy == (IMallocSpy*)&MallocSpy) { MallocSpyDumpLeaks(); } diff --git a/reactos/lib/ole32/itemmoniker.c b/reactos/lib/ole32/itemmoniker.c index 6c1d71ff775..b426f712f13 100644 --- a/reactos/lib/ole32/itemmoniker.c +++ b/reactos/lib/ole32/itemmoniker.c @@ -454,7 +454,7 @@ HRESULT WINAPI ItemMonikerImpl_BindToObject(IMoniker* iface, *ppvResult=0; - res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&refid,(void**)(char*)&poic); + res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&refid,(void**)&poic); if (SUCCEEDED(res)){ @@ -487,7 +487,7 @@ HRESULT WINAPI ItemMonikerImpl_BindToStorage(IMoniker* iface, if(pmkToLeft==NULL) return E_INVALIDARG; - res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IOleItemContainer,(void**)(char*)&poic); + res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IOleItemContainer,(void**)&poic); if (SUCCEEDED(res)){ @@ -715,7 +715,7 @@ HRESULT WINAPI ItemMonikerImpl_IsRunning(IMoniker* iface, /* requesting an IOleItemContainer interface pointer. The method then calls IOleItemContainer::IsRunning,*/ /* passing the string contained within this moniker. */ - res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IOleItemContainer,(void**)(char*)&poic); + res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IOleItemContainer,(void**)&poic); if (SUCCEEDED(res)){ @@ -876,11 +876,11 @@ HRESULT WINAPI ItemMonikerImpl_ParseDisplayName(IMoniker* iface, /* Otherwise, the method calls IMoniker::BindToObject on the pmkToLeft parameter, requesting an */ /* IParseDisplayName interface pointer to the object identified by the moniker, and passes the display */ /* name to IParseDisplayName::ParseDisplayName */ - res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IOleItemContainer,(void**)(char*)&poic); + res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IOleItemContainer,(void**)&poic); if (SUCCEEDED(res)){ - res=IOleItemContainer_GetObject(poic,This->itemName,BINDSPEED_MODERATE,pbc,&IID_IParseDisplayName,(void**)(char*)&ppdn); + res=IOleItemContainer_GetObject(poic,This->itemName,BINDSPEED_MODERATE,pbc,&IID_IParseDisplayName,(void**)&ppdn); res=IMoniker_GetDisplayName(iface,pbc,NULL,&displayName); diff --git a/reactos/lib/ole32/marshal.c b/reactos/lib/ole32/marshal.c index e49aae716aa..662f1b07a6c 100644 --- a/reactos/lib/ole32/marshal.c +++ b/reactos/lib/ole32/marshal.c @@ -256,7 +256,7 @@ StdMarshalImpl_MarshalInterface( IPSFactoryBuffer *psfacbuf; TRACE("(...,%s,...)\n",debugstr_guid(riid)); - IUnknown_QueryInterface((LPUNKNOWN)pv,&IID_IUnknown,(LPVOID*)(char*)&pUnk); + IUnknown_QueryInterface((LPUNKNOWN)pv,&IID_IUnknown,(LPVOID*)&pUnk); mid.processid = GetCurrentProcessId(); mid.objectid = (DWORD)pUnk; /* FIXME */ IUnknown_Release(pUnk); @@ -280,7 +280,7 @@ StdMarshalImpl_MarshalInterface( FIXME("Failed to create a stub for %s\n",debugstr_guid(riid)); return hres; } - IUnknown_QueryInterface((LPUNKNOWN)pv,riid,(LPVOID*)(char*)&pUnk); + IUnknown_QueryInterface((LPUNKNOWN)pv,riid,(LPVOID*)&pUnk); MARSHAL_Register_Stub(&mid,pUnk,stub); IUnknown_Release(pUnk); return S_OK; @@ -315,13 +315,20 @@ StdMarshalImpl_UnmarshalInterface( return hres; } hres = PIPE_GetNewPipeBuf(&mid,&chanbuf); + IPSFactoryBuffer_Release(psfacbuf); if (hres) { ERR("Failed to get an rpc channel buffer for %s\n",debugstr_guid(riid)); } else { + /* Connect the channel buffer to the proxy and release the no longer + * needed proxy. + * NOTE: The proxy should have taken an extra reference because it also + * aggregates the object, so we can safely release our reference to it. */ IRpcProxyBuffer_Connect(rpcproxy,chanbuf); - IRpcProxyBuffer_Release(rpcproxy); /* no need */ + IRpcProxyBuffer_Release(rpcproxy); + /* IRpcProxyBuffer takes a reference on the channel buffer and + * we no longer need it, so release it */ + IRpcChannelBuffer_Release(chanbuf); } - IPSFactoryBuffer_Release(psfacbuf); return hres; } @@ -448,7 +455,7 @@ CoMarshalInterface( IStream *pStm, REFIID riid, IUnknown *pUnk, ); STUBMGR_Start(); /* Just to be sure we have one running. */ mid.processid = GetCurrentProcessId(); - IUnknown_QueryInterface(pUnk,&IID_IUnknown,(LPVOID*)(char*)&pUnknown); + IUnknown_QueryInterface(pUnk,&IID_IUnknown,(LPVOID*)&pUnknown); mid.objectid = (DWORD)pUnknown; IUnknown_Release(pUnknown); memcpy(&mid.iid,riid,sizeof(mid.iid)); @@ -523,7 +530,7 @@ CoUnmarshalInterface(IStream *pStm, REFIID riid, LPVOID *ppv) { FIXME("Stream read 3 failed, %lx, (%ld of %d)\n",hres,res,sizeof(xclsid)); return hres; } - hres=CoCreateInstance(&xclsid,NULL,CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER,&IID_IMarshal,(void**)(char*)&pUnk); + hres=CoCreateInstance(&xclsid,NULL,CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER,&IID_IMarshal,(void**)&pUnk); if (hres) { FIXME("Failed to create instance of unmarshaller %s.\n",debugstr_guid(&xclsid)); return hres; @@ -596,45 +603,68 @@ CoReleaseMarshalData(IStream *pStm) { /*********************************************************************** * CoMarshalInterThreadInterfaceInStream [OLE32.@] * - * Marshal interfaces across threads. We don't have a thread distinction, - * meaning most interfaces just work across different threads, the RPC - * handles it. + * Marshal an interface across threads in the same process. + * + * PARAMS + * riid [I] Identifier of the interface to be marshalled. + * pUnk [I] Pointer to IUnknown-derived interface that will be marshalled. + * ppStm [O] Pointer to IStream object that is created and then used to store the marshalled inteface. + * + * RETURNS + * Success: S_OK + * Failure: E_OUTOFMEMORY and other COM error codes + * + * SEE + * CoMarshalInterface(), CoUnmarshalInterface() and CoGetInterfaceAndReleaseStream() */ HRESULT WINAPI CoMarshalInterThreadInterfaceInStream( - REFIID riid, LPUNKNOWN pUnk, LPSTREAM * ppStm -) { - ULONG res; - ULARGE_INTEGER xpos; - LARGE_INTEGER seekto; - HRESULT hres; + REFIID riid, LPUNKNOWN pUnk, LPSTREAM * ppStm) +{ + ULARGE_INTEGER xpos; + LARGE_INTEGER seekto; + HRESULT hres; - TRACE("(%s, %p, %p)\n",debugstr_guid(riid), pUnk, ppStm); - hres = CreateStreamOnHGlobal(0, TRUE, ppStm); - if (hres) return hres; - /* CoMarshalInterface(...); */ - hres = IStream_Write(*ppStm,&pUnk,sizeof(LPUNKNOWN),&res); - if (hres) return hres; - memset(&seekto,0,sizeof(seekto)); - IStream_Seek(*ppStm,seekto,SEEK_SET,&xpos); - return S_OK; + TRACE("(%s, %p, %p)\n",debugstr_guid(riid), pUnk, ppStm); + + hres = CreateStreamOnHGlobal(0, TRUE, ppStm); + if (FAILED(hres)) return hres; + hres = CoMarshalInterface(*ppStm, riid, pUnk, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL); + + /* FIXME: is this needed? */ + memset(&seekto,0,sizeof(seekto)); + IStream_Seek(*ppStm,seekto,SEEK_SET,&xpos); + + return hres; } /*********************************************************************** * CoGetInterfaceAndReleaseStream [OLE32.@] + * + * Unmarshalls an inteface from a stream and then releases the stream. + * + * PARAMS + * pStm [I] Stream that contains the marshalled inteface. + * riid [I] Interface identifier of the object to unmarshall. + * ppv [O] Address of pointer where the requested interface object will be stored. + * + * RETURNS + * Success: S_OK + * Failure: A COM error code + * + * SEE + * CoMarshalInterThreadInterfaceInStream() and CoUnmarshalInteface() */ HRESULT WINAPI -CoGetInterfaceAndReleaseStream(LPSTREAM pStm,REFIID riid, LPVOID *ppv) { - ULONG res; - HRESULT hres; - LPUNKNOWN pUnk; +CoGetInterfaceAndReleaseStream(LPSTREAM pStm,REFIID riid, LPVOID *ppv) +{ + HRESULT hres; - TRACE("(,%s,)\n",debugstr_guid(riid)); - /* CoUnmarshalInterface(...); */ - hres = IStream_Read(pStm,&pUnk,sizeof(LPUNKNOWN),&res); - if (hres) return hres; - IStream_Release(pStm); - return IUnknown_QueryInterface(pUnk,riid,ppv); + TRACE("(%p, %s, %p)\n", pStm, debugstr_guid(riid), ppv); + + hres = CoUnmarshalInterface(pStm, riid, ppv); + IStream_Release(pStm); + return hres; } static HRESULT WINAPI diff --git a/reactos/lib/ole32/moniker.c b/reactos/lib/ole32/moniker.c index ff619292df1..f5cbcaffe92 100644 --- a/reactos/lib/ole32/moniker.c +++ b/reactos/lib/ole32/moniker.c @@ -505,7 +505,7 @@ HRESULT WINAPI OleRun(LPUNKNOWN pUnknown) ICOM_THIS(IRunnableObject,pUnknown); LRESULT ret; - ret = IRunnableObject_QueryInterface(This,&IID_IRunnableObject,(LPVOID*)(char*)&runable); + ret = IRunnableObject_QueryInterface(This,&IID_IRunnableObject,(LPVOID*)&runable); if (ret) return 0; /* Appears to return no error. */ ret = IRunnableObject_Run(runable,NULL); diff --git a/reactos/lib/ole32/ole2.c b/reactos/lib/ole32/ole2.c index b690ccf907f..efeb81e597c 100644 --- a/reactos/lib/ole32/ole2.c +++ b/reactos/lib/ole32/ole2.c @@ -710,7 +710,7 @@ HRESULT WINAPI OleSetContainedObject( hres = IUnknown_QueryInterface(pUnknown, &IID_IRunnableObject, - (void**)(char*)&runnable); + (void**)&runnable); if (SUCCEEDED(hres)) { @@ -756,7 +756,7 @@ HRESULT WINAPI OleLoad( NULL, CLSCTX_INPROC_HANDLER, &IID_IOleObject, - (void**)(char*)&oleObject); + (void**)&oleObject); /* * If that fails, as it will most times, load the default @@ -767,7 +767,7 @@ HRESULT WINAPI OleLoad( hres = OleCreateDefaultHandler(&storageInfo.clsid, NULL, &IID_IOleObject, - (void**)(char*)&oleObject); + (void**)&oleObject); } /* @@ -786,7 +786,7 @@ HRESULT WINAPI OleLoad( */ hres = IOleObject_QueryInterface(oleObject, &IID_IPersistStorage, - (void**)(char*)&persistStorage); + (void**)&persistStorage); if (SUCCEEDED(hres)) { @@ -860,7 +860,7 @@ HRESULT WINAPI OleLockRunning(LPUNKNOWN pUnknown, BOOL fLock, BOOL fLastUnlockCl hres = IUnknown_QueryInterface(pUnknown, &IID_IRunnableObject, - (void**)(char*)&runnable); + (void**)&runnable); if (SUCCEEDED(hres)) { @@ -2229,7 +2229,7 @@ HRESULT WINAPI OleDraw( hres = IUnknown_QueryInterface(pUnk, &IID_IViewObject, - (void**)(char*)&viewobject); + (void**)&viewobject); if (SUCCEEDED(hres)) { @@ -2284,20 +2284,20 @@ HRESULT WINAPI OleCreate( FIXME("\n\t%s\n\t%s semi-stub!\n", debugstr_guid(rclsid), debugstr_guid(riid)); - if (SUCCEEDED((hres = CoCreateInstance(rclsid, 0, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER|CLSCTX_LOCAL_SERVER , riid, (LPVOID*)(char*)&pUnk)))) + if (SUCCEEDED((hres = CoCreateInstance(rclsid, 0, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER|CLSCTX_LOCAL_SERVER , riid, (LPVOID*)&pUnk)))) { if (pClientSite) { IOleObject * pOE; IPersistStorage * pPS; - if (SUCCEEDED((hres = IUnknown_QueryInterface( pUnk, &IID_IOleObject, (LPVOID*)(char*)&pOE)))) + if (SUCCEEDED((hres = IUnknown_QueryInterface( pUnk, &IID_IOleObject, (LPVOID*)&pOE)))) { TRACE("trying to set clientsite %p\n", pClientSite); hres1 = IOleObject_SetClientSite(pOE, pClientSite); TRACE("-- result 0x%08lx\n", hres1); IOleObject_Release(pOE); } - if (SUCCEEDED((hres = IUnknown_QueryInterface( pUnk, &IID_IPersistStorage, (LPVOID*)(char*)&pPS)))) + if (SUCCEEDED((hres = IUnknown_QueryInterface( pUnk, &IID_IPersistStorage, (LPVOID*)&pPS)))) { TRACE("trying to set stg %p\n", pStg); hres1 = IPersistStorage_InitNew(pPS, pStg); diff --git a/reactos/lib/ole32/ole2impl.c b/reactos/lib/ole32/ole2impl.c index 6dc79d010e8..903c5e7416d 100644 --- a/reactos/lib/ole32/ole2impl.c +++ b/reactos/lib/ole32/ole2impl.c @@ -151,7 +151,7 @@ HRESULT WINAPI OleCreateFromData(LPDATAOBJECT pSrcDataObject, REFIID riid, /* Create default handler for Persist storage */ if (hr1 == S_OK) - hr1 = OleCreateDefaultHandler(&clsID, NULL, &IID_IPersistStorage, (LPVOID*)(char*)&pPersistStorage); + hr1 = OleCreateDefaultHandler(&clsID, NULL, &IID_IPersistStorage, (LPVOID*)&pPersistStorage); /* Load the storage to Persist storage */ @@ -161,7 +161,7 @@ HRESULT WINAPI OleCreateFromData(LPDATAOBJECT pSrcDataObject, REFIID riid, /* Query for IOleObject */ if (hr1 == S_OK) - hr1 = IPersistStorage_QueryInterface(pPersistStorage, &IID_IOleObject, (LPVOID*)(char*)&pOleObject); + hr1 = IPersistStorage_QueryInterface(pPersistStorage, &IID_IOleObject, (LPVOID*)&pOleObject); /* Set client site with the IOleObject */ diff --git a/reactos/lib/ole32/oleproxy.c b/reactos/lib/ole32/oleproxy.c index 6c117d2718c..f92ca5a832f 100644 --- a/reactos/lib/ole32/oleproxy.c +++ b/reactos/lib/ole32/oleproxy.c @@ -156,12 +156,12 @@ CFStub_Invoke( } memcpy(&iid,msg->Buffer,sizeof(iid)); TRACE("->CreateInstance(%s)\n",debugstr_guid(&iid)); - hres = IUnknown_QueryInterface(This->pUnkServer,&IID_IClassFactory,(LPVOID*)(char*)&classfac); + hres = IUnknown_QueryInterface(This->pUnkServer,&IID_IClassFactory,(LPVOID*)&classfac); if (hres) { FIXME("Ole server does not provide a IClassFactory?\n"); return hres; } - hres = IClassFactory_CreateInstance(classfac,NULL,&iid,(LPVOID*)(char*)&ppv); + hres = IClassFactory_CreateInstance(classfac,NULL,&iid,(LPVOID*)&ppv); IClassFactory_Release(classfac); if (hres) { msg->cbBuffer = 0; @@ -436,7 +436,8 @@ CFProxy_Construct(LPVOID *ppv,LPVOID *ppProxy) { cf->lpvtbl_cf = &cfproxyvt; cf->lpvtbl_proxy = &pspbvtbl; - cf->ref = 2; /* we return 2 references to the object! */ + /* 1 reference for the proxy and 1 for the object */ + cf->ref = 2; *ppv = &(cf->lpvtbl_cf); *ppProxy = &(cf->lpvtbl_proxy); return S_OK; diff --git a/reactos/lib/ole32/storage32.c b/reactos/lib/ole32/storage32.c index 7c7ff8e5ee7..c182b8aae06 100644 --- a/reactos/lib/ole32/storage32.c +++ b/reactos/lib/ole32/storage32.c @@ -5536,6 +5536,9 @@ HRESULT WINAPI StgCreateDocfile( return hr; } +/****************************************************************************** + * StgCreateStorageEx [OLE32.@] + */ HRESULT WINAPI StgCreateStorageEx(const WCHAR* pwcsName, DWORD grfMode, DWORD stgfmt, DWORD grfAttrs, STGOPTIONS* pStgOptions, void* reserved, REFIID riid, void** ppObjectOpen) { TRACE("(%s, %lx, %lx, %lx, %p, %p, %p, %p)\n", debugstr_w(pwcsName), @@ -5898,7 +5901,7 @@ HRESULT WINAPI OleLoadFromStream(IStream *pStm,REFIID iidInterface,void** ppvOb res=CoCreateInstance(&clsid,NULL,CLSCTX_INPROC_SERVER,iidInterface,ppvObj); if (!SUCCEEDED(res)) return res; - res=IUnknown_QueryInterface((IUnknown*)*ppvObj,&IID_IPersistStream,(LPVOID*)(char*)&xstm); + res=IUnknown_QueryInterface((IUnknown*)*ppvObj,&IID_IPersistStream,(LPVOID*)&xstm); if (!SUCCEEDED(res)) { IUnknown_Release((IUnknown*)*ppvObj); return res; From 4addf164b6c6da2de0fa3388b9f9ff4c420434ab Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Wed, 16 Jun 2004 16:59:27 +0000 Subject: [PATCH 1394/1463] - Disable the "Floppy count: x" debug message. svn path=/trunk/; revision=9681 --- freeldr/freeldr/arch/i386/hardware.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freeldr/freeldr/arch/i386/hardware.c b/freeldr/freeldr/arch/i386/hardware.c index e467107ed3b..6cc640ce267 100644 --- a/freeldr/freeldr/arch/i386/hardware.c +++ b/freeldr/freeldr/arch/i386/hardware.c @@ -885,7 +885,7 @@ DetectBiosFloppyController(HKEY SystemKey, U32 FloppyCount; FloppyCount = GetFloppyCount(); - printf ("Floppy count: %u\n", FloppyCount); +/* printf ("Floppy count: %u\n", FloppyCount);*/ if (FloppyCount == 0) return; From 129d08fec4f6415a2789774930ce47dd3250a6cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Wed, 16 Jun 2004 18:13:23 +0000 Subject: [PATCH 1395/1463] Sync to Wine-20040615: Ivan Leo Puoti <puoti@inwind.it> - Changed my name, so update copyright info. svn path=/trunk/; revision=9682 --- reactos/lib/oledlg/oledlg_It.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/oledlg/oledlg_It.rc b/reactos/lib/oledlg/oledlg_It.rc index 14181678402..b66563c738f 100644 --- a/reactos/lib/oledlg/oledlg_It.rc +++ b/reactos/lib/oledlg/oledlg_It.rc @@ -1,6 +1,6 @@ /* * Copyright 2003 Ulrich Czekalla for CodeWeavers - * 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 From 2b3293eb3a4c3e501c59f6d4bd77f8fdd7067ca7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Wed, 16 Jun 2004 18:21:24 +0000 Subject: [PATCH 1396/1463] Sync to Wine-20040615: Robert Shearman <R.J.Shearman@warwick.ac.uk> - Fix ref count on standard proxy creation. - Release channel buffer in StdMarshal_UnmarshalInterface, since we no longer use it and the proxy should have taken a reference on it. - Add a few comments. Eric Pouech <pouech-eric@wanadoo.fr> - GetModuleFileName[AW] doesn't terminate the string if the buffer is too small. Patrik Stridvall <ps@leissner.se> - Fixed some issues found by winapi_check. svn path=/trunk/; revision=9683 --- reactos/lib/rpcrt4/cproxy.c | 8 ++++++- reactos/lib/rpcrt4/cpsf.c | 36 +++++++++++++++++++------------- reactos/lib/rpcrt4/rpc_binding.c | 4 ++-- 3 files changed, 30 insertions(+), 18 deletions(-) diff --git a/reactos/lib/rpcrt4/cproxy.c b/reactos/lib/rpcrt4/cproxy.c index e9b5cea7bd3..c36baf94558 100644 --- a/reactos/lib/rpcrt4/cproxy.c +++ b/reactos/lib/rpcrt4/cproxy.c @@ -172,7 +172,8 @@ HRESULT WINAPI StdProxy_Construct(REFIID riid, This->PVtbl = vtbl->Vtbl; This->lpVtbl = &StdProxy_Vtbl; - This->RefCount = 1; + /* 1 reference for the proxy and 1 for the object */ + This->RefCount = 2; This->stubless = stubless; This->piid = vtbl->header.piid; This->pUnkOuter = pUnkOuter; @@ -190,6 +191,9 @@ static void WINAPI StdProxy_Destruct(LPRPCPROXYBUFFER iface) { ICOM_THIS_MULTI(StdProxyImpl,lpVtbl,iface); + if (This->pChannel) + IRpcProxyBuffer_Disconnect(iface); + IPSFactoryBuffer_Release(This->pPSFactory); if (This->thunks) { HeapFree(GetProcessHeap(),0,This->PVtbl); @@ -248,6 +252,7 @@ static HRESULT WINAPI StdProxy_Connect(LPRPCPROXYBUFFER iface, TRACE("(%p)->Connect(%p)\n",This,pChannel); This->pChannel = pChannel; + IRpcChannelBuffer_AddRef(pChannel); return S_OK; } @@ -256,6 +261,7 @@ static VOID WINAPI StdProxy_Disconnect(LPRPCPROXYBUFFER iface) ICOM_THIS_MULTI(StdProxyImpl,lpVtbl,iface); TRACE("(%p)->Disconnect()\n",This); + IRpcChannelBuffer_Release(This->pChannel); This->pChannel = NULL; } diff --git a/reactos/lib/rpcrt4/cpsf.c b/reactos/lib/rpcrt4/cpsf.c index 8df39577783..ba0db037e29 100644 --- a/reactos/lib/rpcrt4/cpsf.c +++ b/reactos/lib/rpcrt4/cpsf.c @@ -159,8 +159,9 @@ HRESULT WINAPI NdrDllRegisterProxy(HMODULE hDll, const CLSID *pclsid) { LPSTR clsid; - char keyname[120], module[120]; + char keyname[120], module[MAX_PATH]; HKEY key, subkey; + DWORD len; TRACE("(%p,%p,%s)\n", hDll, pProxyFileList, debugstr_guid(pclsid)); UuidToStringA((UUID*)pclsid, (unsigned char**)&clsid); @@ -196,16 +197,18 @@ HRESULT WINAPI NdrDllRegisterProxy(HMODULE hDll, /* register clsid to point to module */ snprintf(keyname, sizeof(keyname), "CLSID\\{%s}", clsid); - GetModuleFileNameA(hDll, module, sizeof(module)); - TRACE("registering CLSID %s => %s\n", clsid, module); - if (RegCreateKeyExA(HKEY_CLASSES_ROOT, keyname, 0, NULL, 0, - KEY_WRITE, NULL, &key, NULL) == ERROR_SUCCESS) { - if (RegCreateKeyExA(key, "InProcServer32", 0, NULL, 0, - KEY_WRITE, NULL, &subkey, NULL) == ERROR_SUCCESS) { - RegSetValueExA(subkey, NULL, 0, REG_SZ, module, strlen(module)); - RegCloseKey(subkey); - } - RegCloseKey(key); + len = GetModuleFileNameA(hDll, module, sizeof(module)); + if (len && len < sizeof(module)) { + TRACE("registering CLSID %s => %s\n", clsid, module); + if (RegCreateKeyExA(HKEY_CLASSES_ROOT, keyname, 0, NULL, 0, + KEY_WRITE, NULL, &key, NULL) == ERROR_SUCCESS) { + if (RegCreateKeyExA(key, "InProcServer32", 0, NULL, 0, + KEY_WRITE, NULL, &subkey, NULL) == ERROR_SUCCESS) { + RegSetValueExA(subkey, NULL, 0, REG_SZ, module, strlen(module)); + RegCloseKey(subkey); + } + RegCloseKey(key); + } } /* done */ @@ -221,7 +224,8 @@ HRESULT WINAPI NdrDllUnregisterProxy(HMODULE hDll, const CLSID *pclsid) { LPSTR clsid; - char keyname[120], module[120]; + char keyname[120], module[MAX_PATH]; + DWORD len; TRACE("(%p,%p,%s)\n", hDll, pProxyFileList, debugstr_guid(pclsid)); UuidToStringA((UUID*)pclsid, (unsigned char**)&clsid); @@ -246,9 +250,11 @@ HRESULT WINAPI NdrDllUnregisterProxy(HMODULE hDll, /* unregister clsid */ snprintf(keyname, sizeof(keyname), "CLSID\\{%s}", clsid); - GetModuleFileNameA(hDll, module, sizeof(module)); - TRACE("unregistering CLSID %s <= %s\n", clsid, module); - RegDeleteKeyA(HKEY_CLASSES_ROOT, keyname); + len = GetModuleFileNameA(hDll, module, sizeof(module)); + if (len && len < sizeof(module)) { + TRACE("unregistering CLSID %s <= %s\n", clsid, module); + RegDeleteKeyA(HKEY_CLASSES_ROOT, keyname); + } /* done */ RpcStringFreeA((unsigned char**)&clsid); diff --git a/reactos/lib/rpcrt4/rpc_binding.c b/reactos/lib/rpcrt4/rpc_binding.c index 9764f204c4c..c4878247d5d 100644 --- a/reactos/lib/rpcrt4/rpc_binding.c +++ b/reactos/lib/rpcrt4/rpc_binding.c @@ -1121,7 +1121,7 @@ RPC_STATUS WINAPI I_RpcBindingSetAsync( RPC_BINDING_HANDLE Binding, RPC_BLOCKING /*********************************************************************** * RpcNetworkIsProtseqValidA (RPCRT4.@) */ -RPC_STATUS RPC_ENTRY RpcNetworkIsProtseqValidA(unsigned char *protseq) { +RPC_STATUS WINAPI RpcNetworkIsProtseqValidA(unsigned char *protseq) { UNICODE_STRING protseqW; if (!protseq) return RPC_S_INVALID_RPC_PROTSEQ; /* ? */ @@ -1143,7 +1143,7 @@ RPC_STATUS RPC_ENTRY RpcNetworkIsProtseqValidA(unsigned char *protseq) { * ncalrpc local-only rpc over LPC (LPC is not really used) * ncacn_np rpc over named pipes */ -RPC_STATUS RPC_ENTRY RpcNetworkIsProtseqValidW(LPWSTR protseq) { +RPC_STATUS WINAPI RpcNetworkIsProtseqValidW(LPWSTR protseq) { static const WCHAR protseqsW[][15] = { {'n','c','a','l','r','p','c',0}, {'n','c','a','c','n','_','n','p',0} From fd397eeccd47841618362b87b3f0895765ef33e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Wed, 16 Jun 2004 18:27:33 +0000 Subject: [PATCH 1397/1463] Sync to Wine-20040615: Hans Leidekker <hans@it.vu.nl> - Link to ntdll. Raphael Junqueira <fenix@club-internet.fr> - Stub for SHFlushSFCacheWrap. Eric Pouech <pouech-eric@wanadoo.fr> - GetModuleFileName[AW] doesn't terminate the string if the buffer is too small. Stefan Leichter <Stefan.Leichter@camLine.com> - Moved stub of StopWatch from ascii to unicode. svn path=/trunk/; revision=9684 --- reactos/lib/shlwapi/Makefile.in | 2 +- reactos/lib/shlwapi/ordinal.c | 18 ++++++++++++++++-- reactos/lib/shlwapi/shlwapi.spec | 2 +- reactos/lib/shlwapi/stopwatch.c | 27 +++++++++++++++------------ reactos/lib/shlwapi/url.c | 4 +++- 5 files changed, 36 insertions(+), 17 deletions(-) diff --git a/reactos/lib/shlwapi/Makefile.in b/reactos/lib/shlwapi/Makefile.in index a1a08a92d7e..fc09c5e4dcb 100644 --- a/reactos/lib/shlwapi/Makefile.in +++ b/reactos/lib/shlwapi/Makefile.in @@ -4,7 +4,7 @@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = shlwapi.dll -IMPORTS = ole32 user32 gdi32 advapi32 kernel32 +IMPORTS = ole32 user32 gdi32 advapi32 kernel32 ntdll DELAYIMPORTS = oleaut32 EXTRALIBS = -luuid $(LIBUNICODE) diff --git a/reactos/lib/shlwapi/ordinal.c b/reactos/lib/shlwapi/ordinal.c index de308a722fb..b376f21f948 100644 --- a/reactos/lib/shlwapi/ordinal.c +++ b/reactos/lib/shlwapi/ordinal.c @@ -3265,9 +3265,12 @@ HMODULE WINAPI MLLoadLibraryA(LPCSTR new_mod, HMODULE inst_hwnd, DWORD dwFlags) */ CHAR mod_path[2*MAX_PATH]; LPSTR ptr; + DWORD len; FIXME("(%s,%p,0x%08lx) semi-stub!\n", debugstr_a(new_mod), inst_hwnd, dwFlags); - GetModuleFileNameA(inst_hwnd, mod_path, 2*MAX_PATH); + len = GetModuleFileNameA(inst_hwnd, mod_path, sizeof(mod_path)); + if (!len || len >= sizeof(mod_path)) return NULL; + ptr = strrchr(mod_path, '\\'); if (ptr) { strcpy(ptr+1, new_mod); @@ -3286,9 +3289,12 @@ HMODULE WINAPI MLLoadLibraryW(LPCWSTR new_mod, HMODULE inst_hwnd, DWORD dwFlags) { WCHAR mod_path[2*MAX_PATH]; LPWSTR ptr; + DWORD len; FIXME("(%s,%p,0x%08lx) semi-stub!\n", debugstr_w(new_mod), inst_hwnd, dwFlags); - GetModuleFileNameW(inst_hwnd, mod_path, 2*MAX_PATH); + len = GetModuleFileNameW(inst_hwnd, mod_path, sizeof(mod_path) / sizeof(WCHAR)); + if (!len || len >= sizeof(mod_path) / sizeof(WCHAR)) return NULL; + ptr = strrchrW(mod_path, '\\'); if (ptr) { strcpyW(ptr+1, new_mod); @@ -3506,6 +3512,14 @@ BOOL WINAPI MLFreeLibrary(HMODULE hModule) return FreeLibrary(hModule); } +/************************************************************************* + * @ [SHLWAPI.419] + */ +BOOL WINAPI SHFlushSFCacheWrap(void) { + FIXME(": stub\n"); + return TRUE; +} + /************************************************************************* * @ [SHLWAPI.429] * FIXME I have no idea what this function does or what its arguments are. diff --git a/reactos/lib/shlwapi/shlwapi.spec b/reactos/lib/shlwapi/shlwapi.spec index 32b962c62de..934b24cec18 100644 --- a/reactos/lib/shlwapi/shlwapi.spec +++ b/reactos/lib/shlwapi/shlwapi.spec @@ -416,7 +416,7 @@ 416 stub -noname SHWinHelpOnDemandW 417 stub -noname SHWinHelpOnDemandA 418 stdcall -noname MLFreeLibrary(long) -419 stub -noname SHFlushSFCacheWrap +419 stdcall -noname SHFlushSFCacheWrap() 420 stub @ # CMemStream::Commit 421 stub -noname SHLoadPersistedDataObject 422 stdcall -noname _SHGlobalCounterCreateNamedA(str long) diff --git a/reactos/lib/shlwapi/stopwatch.c b/reactos/lib/shlwapi/stopwatch.c index 173d9a0c50b..8d8121544ac 100644 --- a/reactos/lib/shlwapi/stopwatch.c +++ b/reactos/lib/shlwapi/stopwatch.c @@ -38,6 +38,7 @@ #include "wingdi.h" #include "winuser.h" #include "winreg.h" +#include "winternl.h" #define NO_SHLWAPI_STREAM #include "shlwapi.h" #include "wine/debug.h" @@ -81,9 +82,8 @@ void WINAPI StopWatchFlush() FIXME("() stub!\n"); } - /************************************************************************* - * @ [SHLWAPI.243] + * @ [SHLWAPI.244] * * Write a performance event to a log file * @@ -98,28 +98,31 @@ void WINAPI StopWatchFlush() * Success: ERROR_SUCCESS. * Failure: A standard Win32 error code indicating the failure. */ -DWORD WINAPI StopWatchA(DWORD dwClass, LPCSTR lpszStr, DWORD dwUnknown, +DWORD WINAPI StopWatchW(DWORD dwClass, LPCWSTR lpszStr, DWORD dwUnknown, DWORD dwMode, DWORD dwTimeStamp) { - FIXME("(%ld,%s,%ld,%ld,%ld) stub!\n", dwClass, debugstr_a(lpszStr), + FIXME("(%ld,%s,%ld,%ld,%ld) stub!\n", dwClass, debugstr_w(lpszStr), dwUnknown, dwMode, dwTimeStamp); return ERROR_SUCCESS; } /************************************************************************* - * @ [SHLWAPI.244] + * @ [SHLWAPI.243] * - * See StopWatchA. + * See StopWatchW. */ -DWORD WINAPI StopWatchW(DWORD dwClass, LPCWSTR lpszStr, DWORD dwUnknown, +DWORD WINAPI StopWatchA(DWORD dwClass, LPCSTR lpszStr, DWORD dwUnknown, DWORD dwMode, DWORD dwTimeStamp) -{ - char szBuff[MAX_PATH]; +{ DWORD retval; + UNICODE_STRING szStrW; - if(!WideCharToMultiByte(0, 0, lpszStr, -1, szBuff, MAX_PATH, 0, 0)) - return ERROR_NOT_ENOUGH_MEMORY; + if(lpszStr) RtlCreateUnicodeStringFromAsciiz(&szStrW, lpszStr); + else szStrW.Buffer = NULL; - return StopWatchA(dwClass, szBuff, dwUnknown, dwMode, dwTimeStamp); + retval = StopWatchW(dwClass, szStrW.Buffer, dwUnknown, dwMode, dwTimeStamp); + + RtlFreeUnicodeString(&szStrW); + return retval; } /************************************************************************* diff --git a/reactos/lib/shlwapi/url.c b/reactos/lib/shlwapi/url.c index e9e3941ac4c..7bd2a124c59 100644 --- a/reactos/lib/shlwapi/url.c +++ b/reactos/lib/shlwapi/url.c @@ -2428,8 +2428,10 @@ HRESULT WINAPI MLBuildResURLW(LPCWSTR lpszLibName, HMODULE hMod, DWORD dwFlags, if (hMod) { WCHAR szBuff[MAX_PATH]; + DWORD len; - if (GetModuleFileNameW(hMod, szBuff, sizeof(szBuff)/sizeof(WCHAR))) + len = GetModuleFileNameW(hMod, szBuff, sizeof(szBuff)/sizeof(WCHAR)); + if (len && len < sizeof(szBuff)/sizeof(WCHAR)) { DWORD dwPathLen = strlenW(szBuff) + 1; From a41cfac6b98f9e2f25eafe4332b6791c07e98e43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Wed, 16 Jun 2004 18:40:05 +0000 Subject: [PATCH 1398/1463] Sync to Wine-20040615: Robert Reif <reif@earthlink.net> - Added tracing to all functions. - Added error explanations. - Changed debug channel from msacm to wavemap so not confused with msacm. - Handle case where partial structure update requested. - Minor white space cleanup. - Returns proper error code when trying to get caps when no devices present. - Fixed a bug where wrong a return value was returned when mapping is not possible. svn path=/trunk/; revision=9685 --- reactos/lib/winmm/wavemap/wavemap.c | 206 ++++++++++++++++++++++------ 1 file changed, 166 insertions(+), 40 deletions(-) diff --git a/reactos/lib/winmm/wavemap/wavemap.c b/reactos/lib/winmm/wavemap/wavemap.c index 6d53e498c53..c91bbf44f57 100644 --- a/reactos/lib/winmm/wavemap/wavemap.c +++ b/reactos/lib/winmm/wavemap/wavemap.c @@ -39,7 +39,7 @@ #include "msacm.h" #include "wine/debug.h" -WINE_DEFAULT_DEBUG_CHANNEL(msacm); +WINE_DEFAULT_DEBUG_CHANNEL(wavemap); typedef struct tagWAVEMAPDATA { struct tagWAVEMAPDATA* self; @@ -122,6 +122,8 @@ static DWORD wodOpenHelper(WAVEMAPDATA* wom, UINT idx, { DWORD ret; + TRACE("(%p %04x %p %p %08lx)\n", wom, idx, lpDesc, lpwfx, dwFlags); + /* destination is always PCM, so the formulas below apply */ lpwfx->nBlockAlign = (lpwfx->nChannels * lpwfx->wBitsPerSample) / 8; lpwfx->nAvgBytesPerSec = lpwfx->nSamplesPerSec * lpwfx->nBlockAlign; @@ -138,6 +140,7 @@ static DWORD wodOpenHelper(WAVEMAPDATA* wom, UINT idx, wom->hAcmStream = 0; } } + TRACE("ret = %08lx\n", ret); return ret; } @@ -146,15 +149,21 @@ static DWORD wodOpen(LPDWORD lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags) UINT ndlo, ndhi; UINT i; WAVEMAPDATA* wom = HeapAlloc(GetProcessHeap(), 0, sizeof(WAVEMAPDATA)); + DWORD res; TRACE("(%p %p %08lx)\n", lpdwUser, lpDesc, dwFlags); - if (!wom) + if (!wom) { + WARN("no memory\n"); return MMSYSERR_NOMEM; + } ndhi = waveOutGetNumDevs(); if (dwFlags & WAVE_MAPPED) { - if (lpDesc->uMappedDeviceID >= ndhi) return MMSYSERR_INVALPARAM; + if (lpDesc->uMappedDeviceID >= ndhi) { + WARN("invalid parameter: dwFlags WAVE_MAPPED\n"); + return MMSYSERR_INVALPARAM; + } ndlo = lpDesc->uMappedDeviceID; ndhi = ndlo + 1; dwFlags &= ~WAVE_MAPPED; @@ -187,7 +196,7 @@ static DWORD wodOpen(LPDWORD lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags) /* try some ACM stuff */ #define TRY(sps,bps) wfx.nSamplesPerSec = (sps); wfx.wBitsPerSample = (bps); \ - switch (wodOpenHelper(wom, i, lpDesc, &wfx, dwFlags | WAVE_FORMAT_DIRECT)) { \ + switch (res=wodOpenHelper(wom, i, lpDesc, &wfx, dwFlags | WAVE_FORMAT_DIRECT)) { \ case MMSYSERR_NOERROR: wom->avgSpeedInner = wfx.nAvgBytesPerSec; goto found; \ case WAVERR_BADFORMAT: break; \ default: goto error; \ @@ -243,6 +252,7 @@ static DWORD wodOpen(LPDWORD lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags) } HeapFree(GetProcessHeap(), 0, wom); + WARN("ret = WAVERR_BADFORMAT\n"); return WAVERR_BADFORMAT; found: @@ -255,13 +265,21 @@ found: return MMSYSERR_NOERROR; error: HeapFree(GetProcessHeap(), 0, wom); + if (res==ACMERR_NOTPOSSIBLE) { + WARN("ret = WAVERR_BADFORMAT\n"); + return WAVERR_BADFORMAT; + } + WARN("ret = MMSYSERR_ERROR\n"); return MMSYSERR_ERROR; } static DWORD wodClose(WAVEMAPDATA* wom) { - DWORD ret = waveOutClose(wom->u.out.hInnerWave); + DWORD ret; + TRACE("(%p)\n", wom); + + ret = waveOutClose(wom->u.out.hInnerWave); if (ret == MMSYSERR_NOERROR) { if (wom->hAcmStream) { ret = acmStreamClose(wom->hAcmStream, 0); @@ -278,6 +296,8 @@ static DWORD wodWrite(WAVEMAPDATA* wom, LPWAVEHDR lpWaveHdrSrc, DWORD dwParam2) PACMSTREAMHEADER ash; LPWAVEHDR lpWaveHdrDst; + TRACE("(%p %p %08lx)\n", wom, lpWaveHdrSrc, dwParam2); + if (!wom->hAcmStream) { return waveOutWrite(wom->u.out.hInnerWave, lpWaveHdrSrc, dwParam2); } @@ -286,8 +306,10 @@ static DWORD wodWrite(WAVEMAPDATA* wom, LPWAVEHDR lpWaveHdrSrc, DWORD dwParam2) ash = (PACMSTREAMHEADER)lpWaveHdrSrc->reserved; /* acmStreamConvert will actually check that the new size is less than initial size */ ash->cbSrcLength = lpWaveHdrSrc->dwBufferLength; - if (acmStreamConvert(wom->hAcmStream, ash, 0L) != MMSYSERR_NOERROR) + if (acmStreamConvert(wom->hAcmStream, ash, 0L) != MMSYSERR_NOERROR) { + WARN("acmStreamConvert failed\n"); return MMSYSERR_ERROR; + } lpWaveHdrDst = (LPWAVEHDR)((LPSTR)ash + sizeof(ACMSTREAMHEADER)); if (ash->cbSrcLength > ash->cbSrcLengthUsed) @@ -295,8 +317,7 @@ static DWORD wodWrite(WAVEMAPDATA* wom, LPWAVEHDR lpWaveHdrSrc, DWORD dwParam2) else if (ash->cbSrcLength < ash->cbSrcLengthUsed) ERR("CoDec has read more data than it is allowed to\n"); - if (ash->cbDstLengthUsed == 0) - { + if (ash->cbDstLengthUsed == 0) { /* something went wrong in decoding */ FIXME("Got 0 length\n"); return MMSYSERR_ERROR; @@ -312,15 +333,21 @@ static DWORD wodPrepare(WAVEMAPDATA* wom, LPWAVEHDR lpWaveHdrSrc, DWORD dwParam2 DWORD dwRet; LPWAVEHDR lpWaveHdrDst; - if (!wom->hAcmStream) { + TRACE("(%p %p %08lx)\n", wom, lpWaveHdrSrc, dwParam2); + + if (!wom->hAcmStream) return waveOutPrepareHeader(wom->u.out.hInnerWave, lpWaveHdrSrc, dwParam2); - } - if (acmStreamSize(wom->hAcmStream, lpWaveHdrSrc->dwBufferLength, &size, ACM_STREAMSIZEF_SOURCE) != MMSYSERR_NOERROR) + + if (acmStreamSize(wom->hAcmStream, lpWaveHdrSrc->dwBufferLength, &size, ACM_STREAMSIZEF_SOURCE) != MMSYSERR_NOERROR) { + WARN("acmStreamSize failed\n"); return MMSYSERR_ERROR; + } ash = HeapAlloc(GetProcessHeap(), 0, sizeof(ACMSTREAMHEADER) + sizeof(WAVEHDR) + size); - if (ash == NULL) + if (ash == NULL) { + WARN("no memory\n"); return MMSYSERR_NOMEM; + } ash->cbStruct = sizeof(*ash); ash->fdwStatus = 0L; @@ -334,8 +361,10 @@ static DWORD wodPrepare(WAVEMAPDATA* wom, LPWAVEHDR lpWaveHdrSrc, DWORD dwParam2 /* ash->cbDstLengthUsed */ ash->dwDstUser = 0; /* FIXME ? */ dwRet = acmStreamPrepareHeader(wom->hAcmStream, ash, 0L); - if (dwRet != MMSYSERR_NOERROR) + if (dwRet != MMSYSERR_NOERROR) { + WARN("acmStreamPrepareHeader failed\n"); goto errCleanUp; + } lpWaveHdrDst = (LPWAVEHDR)((LPSTR)ash + sizeof(ACMSTREAMHEADER)); lpWaveHdrDst->lpData = ash->pbDst; @@ -343,8 +372,10 @@ static DWORD wodPrepare(WAVEMAPDATA* wom, LPWAVEHDR lpWaveHdrSrc, DWORD dwParam2 lpWaveHdrDst->dwFlags = 0; lpWaveHdrDst->dwLoops = 0; dwRet = waveOutPrepareHeader(wom->u.out.hInnerWave, lpWaveHdrDst, sizeof(*lpWaveHdrDst)); - if (dwRet != MMSYSERR_NOERROR) + if (dwRet != MMSYSERR_NOERROR) { + WARN("waveOutPrepareHeader failed\n"); goto errCleanUp; + } lpWaveHdrSrc->reserved = (DWORD)ash; lpWaveHdrSrc->dwFlags = WHDR_PREPARED; @@ -362,6 +393,8 @@ static DWORD wodUnprepare(WAVEMAPDATA* wom, LPWAVEHDR lpWaveHdrSrc, DWORD dwPara LPWAVEHDR lpWaveHdrDst; DWORD dwRet1, dwRet2; + TRACE("(%p %p %08lx)\n", wom, lpWaveHdrSrc, dwParam2); + if (!wom->hAcmStream) { return waveOutUnprepareHeader(wom->u.out.hInnerWave, lpWaveHdrSrc, dwParam2); } @@ -379,7 +412,10 @@ static DWORD wodUnprepare(WAVEMAPDATA* wom, LPWAVEHDR lpWaveHdrSrc, DWORD dwPara static DWORD wodGetPosition(WAVEMAPDATA* wom, LPMMTIME lpTime, DWORD dwParam2) { - DWORD val = waveOutGetPosition(wom->u.out.hInnerWave, lpTime, dwParam2); + DWORD val; + TRACE("(%p %p %08lx)\n", wom, lpTime, dwParam2); + + val = waveOutGetPosition(wom->u.out.hInnerWave, lpTime, dwParam2); if (lpTime->wType == TIME_BYTES) lpTime->u.cb = MulDiv(lpTime->u.cb, wom->avgSpeedOuter, wom->avgSpeedInner); /* other time types don't require conversion */ @@ -388,21 +424,32 @@ static DWORD wodGetPosition(WAVEMAPDATA* wom, LPMMTIME lpTime, DWORD dwParam2) static DWORD wodGetDevCaps(UINT wDevID, WAVEMAPDATA* wom, LPWAVEOUTCAPSA lpWaveCaps, DWORD dwParam2) { + TRACE("(%04x %p %p %08lx)\n",wDevID, wom, lpWaveCaps, dwParam2); + /* if opened low driver, forward message */ if (WAVEMAP_IsData(wom)) return waveOutGetDevCapsA((UINT)wom->u.out.hInnerWave, lpWaveCaps, dwParam2); + /* else if no drivers, nothing to map so return bad device */ + if (waveOutGetNumDevs() == 0) { + WARN("bad device id\n"); + return MMSYSERR_BADDEVICEID; + } /* otherwise, return caps of mapper itself */ if (wDevID == (UINT)-1 || wDevID == (UINT16)-1) { - lpWaveCaps->wMid = 0x00FF; - lpWaveCaps->wPid = 0x0001; - lpWaveCaps->vDriverVersion = 0x0100; - strcpy(lpWaveCaps->szPname, "Wine wave out mapper"); - lpWaveCaps->dwFormats = + WAVEOUTCAPSA woc; + woc.wMid = 0x00FF; + woc.wPid = 0x0001; + woc.vDriverVersion = 0x0100; + strcpy(woc.szPname, "Wine wave out mapper"); + woc.dwFormats = + WAVE_FORMAT_96M08 | WAVE_FORMAT_96S08 | WAVE_FORMAT_96M16 | WAVE_FORMAT_96S16 | + WAVE_FORMAT_48M08 | WAVE_FORMAT_48S08 | WAVE_FORMAT_48M16 | WAVE_FORMAT_48S16 | WAVE_FORMAT_4M08 | WAVE_FORMAT_4S08 | WAVE_FORMAT_4M16 | WAVE_FORMAT_4S16 | WAVE_FORMAT_2M08 | WAVE_FORMAT_2S08 | WAVE_FORMAT_2M16 | WAVE_FORMAT_2S16 | WAVE_FORMAT_1M08 | WAVE_FORMAT_1S08 | WAVE_FORMAT_1M16 | WAVE_FORMAT_1S16; - lpWaveCaps->wChannels = 2; - lpWaveCaps->dwSupport = WAVECAPS_VOLUME | WAVECAPS_LRVOLUME; + woc.wChannels = 2; + woc.dwSupport = WAVECAPS_VOLUME | WAVECAPS_LRVOLUME; + memcpy(lpWaveCaps, &woc, min(dwParam2, sizeof(woc))); return MMSYSERR_NOERROR; } @@ -412,6 +459,8 @@ static DWORD wodGetDevCaps(UINT wDevID, WAVEMAPDATA* wom, LPWAVEOUTCAPSA lpWaveC static DWORD wodGetVolume(UINT wDevID, WAVEMAPDATA* wom, LPDWORD lpVol) { + TRACE("(%04x %p %p)\n",wDevID, wom, lpVol); + if (WAVEMAP_IsData(wom)) return waveOutGetVolume(wom->u.out.hInnerWave, lpVol); return MMSYSERR_NOERROR; @@ -419,6 +468,8 @@ static DWORD wodGetVolume(UINT wDevID, WAVEMAPDATA* wom, LPDWORD lpVol) static DWORD wodSetVolume(UINT wDevID, WAVEMAPDATA* wom, DWORD vol) { + TRACE("(%04x %p %08lx)\n",wDevID, wom, vol); + if (WAVEMAP_IsData(wom)) return waveOutSetVolume(wom->u.out.hInnerWave, vol); return MMSYSERR_NOERROR; @@ -426,21 +477,29 @@ static DWORD wodSetVolume(UINT wDevID, WAVEMAPDATA* wom, DWORD vol) static DWORD wodPause(WAVEMAPDATA* wom) { + TRACE("(%p)\n",wom); + return waveOutPause(wom->u.out.hInnerWave); } static DWORD wodRestart(WAVEMAPDATA* wom) { + TRACE("(%p)\n",wom); + return waveOutRestart(wom->u.out.hInnerWave); } static DWORD wodReset(WAVEMAPDATA* wom) { + TRACE("(%p)\n",wom); + return waveOutReset(wom->u.out.hInnerWave); } static DWORD wodBreakLoop(WAVEMAPDATA* wom) { + TRACE("(%p)\n",wom); + return waveOutBreakLoop(wom->u.out.hInnerWave); } @@ -449,6 +508,8 @@ static DWORD wodMapperStatus(WAVEMAPDATA* wom, DWORD flags, LPVOID ptr) UINT id; DWORD ret = MMSYSERR_NOTSUPPORTED; + TRACE("(%p %08lx %p)\n",wom, flags, ptr); + switch (flags) { case WAVEOUT_MAPPER_STATUS_DEVICE: ret = waveOutGetID(wom->u.out.hInnerWave, &id); @@ -506,6 +567,10 @@ DWORD WINAPI WAVEMAP_wodMessage(UINT wDevID, UINT wMsg, DWORD dwUser, case WODM_RESTART: return wodRestart ((WAVEMAPDATA*)dwUser); case WODM_RESET: return wodReset ((WAVEMAPDATA*)dwUser); case WODM_MAPPER_STATUS: return wodMapperStatus ((WAVEMAPDATA*)dwUser, dwParam1, (LPVOID)dwParam2); + /* known but not supported */ + case DRV_QUERYDEVICEINTERFACESIZE: + case DRV_QUERYDEVICEINTERFACE: + return MMSYSERR_NOTSUPPORTED; default: FIXME("unknown message %d!\n", wMsg); } @@ -570,6 +635,8 @@ static DWORD widOpenHelper(WAVEMAPDATA* wim, UINT idx, { DWORD ret; + TRACE("(%p %04x %p %p %08lx)\n", wim, idx, lpDesc, lpwfx, dwFlags); + /* source is always PCM, so the formulas below apply */ lpwfx->nBlockAlign = (lpwfx->nChannels * lpwfx->wBitsPerSample) / 8; lpwfx->nAvgBytesPerSec = lpwfx->nSamplesPerSec * lpwfx->nBlockAlign; @@ -586,6 +653,7 @@ static DWORD widOpenHelper(WAVEMAPDATA* wim, UINT idx, wim->hAcmStream = 0; } } + TRACE("ret = %08lx\n", ret); return ret; } @@ -594,11 +662,14 @@ static DWORD widOpen(LPDWORD lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags) UINT ndlo, ndhi; UINT i; WAVEMAPDATA* wim = HeapAlloc(GetProcessHeap(), 0, sizeof(WAVEMAPDATA)); + DWORD res; TRACE("(%p %p %08lx)\n", lpdwUser, lpDesc, dwFlags); - if (!wim) + if (!wim) { + WARN("no memory\n"); return MMSYSERR_NOMEM; + } wim->self = wim; wim->dwCallback = lpDesc->dwCallback; @@ -633,14 +704,14 @@ static DWORD widOpen(LPDWORD lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags) wfx.wFormatTag = WAVE_FORMAT_PCM; wfx.cbSize = 0; /* normally, this field is not used for PCM format, just in case */ /* try some ACM stuff */ - + #define TRY(sps,bps) wfx.nSamplesPerSec = (sps); wfx.wBitsPerSample = (bps); \ - switch (widOpenHelper(wim, i, lpDesc, &wfx, dwFlags | WAVE_FORMAT_DIRECT)) { \ + switch (res=widOpenHelper(wim, i, lpDesc, &wfx, dwFlags | WAVE_FORMAT_DIRECT)) { \ case MMSYSERR_NOERROR: wim->avgSpeedInner = wfx.nAvgBytesPerSec; goto found; \ case WAVERR_BADFORMAT: break; \ default: goto error; \ } - + for (i = ndlo; i < ndhi; i++) { wfx.nSamplesPerSec=lpDesc->lpFormat->nSamplesPerSec; /* first try with same stereo/mono option as source */ @@ -661,7 +732,7 @@ static DWORD widOpen(LPDWORD lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags) TRY(44100, 16); TRY(22050, 16); TRY(11025, 16); - + /* 2^3 => 1, 1^3 => 2, so if stereo, try mono (and the other way around) */ wfx.nChannels ^= 3; TRY(96000, 16); @@ -677,7 +748,7 @@ static DWORD widOpen(LPDWORD lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags) TRY(44100, 8); TRY(22050, 8); TRY(11025, 8); - + /* 2^3 => 1, 1^3 => 2, so if stereo, try mono (and the other way around) */ wfx.nChannels ^= 3; TRY(96000, 8); @@ -690,6 +761,7 @@ static DWORD widOpen(LPDWORD lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags) } HeapFree(GetProcessHeap(), 0, wim); + WARN("ret = WAVERR_BADFORMAT\n"); return WAVERR_BADFORMAT; found: if (dwFlags & WAVE_FORMAT_QUERY) { @@ -702,13 +774,21 @@ found: return MMSYSERR_NOERROR; error: HeapFree(GetProcessHeap(), 0, wim); + if (res==ACMERR_NOTPOSSIBLE) { + WARN("ret = WAVERR_BADFORMAT\n"); + return WAVERR_BADFORMAT; + } + WARN("ret = MMSYSERR_ERROR\n"); return MMSYSERR_ERROR; } static DWORD widClose(WAVEMAPDATA* wim) { - DWORD ret = waveInClose(wim->u.in.hInnerWave); + DWORD ret; + TRACE("(%p)\n", wim); + + ret = waveInClose(wim->u.in.hInnerWave); if (ret == MMSYSERR_NOERROR) { if (wim->hAcmStream) { ret = acmStreamClose(wim->hAcmStream, 0); @@ -725,6 +805,8 @@ static DWORD widAddBuffer(WAVEMAPDATA* wim, LPWAVEHDR lpWaveHdrDst, DWORD dwPara PACMSTREAMHEADER ash; LPWAVEHDR lpWaveHdrSrc; + TRACE("(%p %p %08lx)\n", wim, lpWaveHdrDst, dwParam2); + if (!wim->hAcmStream) { return waveInAddBuffer(wim->u.in.hInnerWave, lpWaveHdrDst, dwParam2); } @@ -743,16 +825,22 @@ static DWORD widPrepare(WAVEMAPDATA* wim, LPWAVEHDR lpWaveHdrDst, DWORD dwParam2 DWORD dwRet; LPWAVEHDR lpWaveHdrSrc; + TRACE("(%p %p %08lx)\n", wim, lpWaveHdrDst, dwParam2); + if (!wim->hAcmStream) { return waveInPrepareHeader(wim->u.in.hInnerWave, lpWaveHdrDst, dwParam2); } if (acmStreamSize(wim->hAcmStream, lpWaveHdrDst->dwBufferLength, &size, - ACM_STREAMSIZEF_DESTINATION) != MMSYSERR_NOERROR) + ACM_STREAMSIZEF_DESTINATION) != MMSYSERR_NOERROR) { + WARN("acmStreamSize failed\n"); return MMSYSERR_ERROR; + } ash = HeapAlloc(GetProcessHeap(), 0, sizeof(ACMSTREAMHEADER) + sizeof(WAVEHDR) + size); - if (ash == NULL) + if (ash == NULL) { + WARN("no memory\n"); return MMSYSERR_NOMEM; + } ash->cbStruct = sizeof(*ash); ash->fdwStatus = 0L; @@ -766,8 +854,10 @@ static DWORD widPrepare(WAVEMAPDATA* wim, LPWAVEHDR lpWaveHdrDst, DWORD dwParam2 /* ash->cbDstLengthUsed */ ash->dwDstUser = lpWaveHdrDst->dwUser; /* FIXME ? */ dwRet = acmStreamPrepareHeader(wim->hAcmStream, ash, 0L); - if (dwRet != MMSYSERR_NOERROR) + if (dwRet != MMSYSERR_NOERROR) { + WARN("acmStreamPrepareHeader failed\n"); goto errCleanUp; + } lpWaveHdrSrc = (LPWAVEHDR)((LPSTR)ash + sizeof(ACMSTREAMHEADER)); lpWaveHdrSrc->lpData = ash->pbSrc; @@ -775,8 +865,10 @@ static DWORD widPrepare(WAVEMAPDATA* wim, LPWAVEHDR lpWaveHdrDst, DWORD dwParam2 lpWaveHdrSrc->dwFlags = 0; lpWaveHdrSrc->dwLoops = 0; dwRet = waveInPrepareHeader(wim->u.in.hInnerWave, lpWaveHdrSrc, sizeof(*lpWaveHdrSrc)); - if (dwRet != MMSYSERR_NOERROR) + if (dwRet != MMSYSERR_NOERROR) { + WARN("waveInPrepareHeader failed\n"); goto errCleanUp; + } lpWaveHdrDst->reserved = (DWORD)ash; lpWaveHdrDst->dwFlags = WHDR_PREPARED; @@ -794,6 +886,8 @@ static DWORD widUnprepare(WAVEMAPDATA* wim, LPWAVEHDR lpWaveHdrDst, DWORD dwPara LPWAVEHDR lpWaveHdrSrc; DWORD dwRet1, dwRet2; + TRACE("(%p %p %08lx)\n", wim, lpWaveHdrDst, dwParam2); + if (!wim->hAcmStream) { return waveInUnprepareHeader(wim->u.in.hInnerWave, lpWaveHdrDst, dwParam2); } @@ -811,7 +905,11 @@ static DWORD widUnprepare(WAVEMAPDATA* wim, LPWAVEHDR lpWaveHdrDst, DWORD dwPara static DWORD widGetPosition(WAVEMAPDATA* wim, LPMMTIME lpTime, DWORD dwParam2) { - DWORD val = waveInGetPosition(wim->u.in.hInnerWave, lpTime, dwParam2); + DWORD val; + + TRACE("(%p %p %08lx)\n", wim, lpTime, dwParam2); + + val = waveInGetPosition(wim->u.in.hInnerWave, lpTime, dwParam2); if (lpTime->wType == TIME_BYTES) lpTime->u.cb = MulDiv(lpTime->u.cb, wim->avgSpeedOuter, wim->avgSpeedInner); /* other time types don't require conversion */ @@ -820,20 +918,32 @@ static DWORD widGetPosition(WAVEMAPDATA* wim, LPMMTIME lpTime, DWORD dwParam2) static DWORD widGetDevCaps(UINT wDevID, WAVEMAPDATA* wim, LPWAVEINCAPSA lpWaveCaps, DWORD dwParam2) { + TRACE("(%04x, %p %p %08lx)\n", wDevID, wim, lpWaveCaps, dwParam2); + /* if opened low driver, forward message */ if (WAVEMAP_IsData(wim)) return waveInGetDevCapsA((UINT)wim->u.in.hInnerWave, lpWaveCaps, dwParam2); + /* else if no drivers, nothing to map so return bad device */ + if (waveInGetNumDevs() == 0) { + WARN("bad device id\n"); + return MMSYSERR_BADDEVICEID; + } /* otherwise, return caps of mapper itself */ if (wDevID == (UINT)-1 || wDevID == (UINT16)-1) { - lpWaveCaps->wMid = 0x00FF; - lpWaveCaps->wPid = 0x0001; - lpWaveCaps->vDriverVersion = 0x0001; - strcpy(lpWaveCaps->szPname, "Wine wave in mapper"); - lpWaveCaps->dwFormats = + WAVEINCAPSA wic; + wic.wMid = 0x00FF; + wic.wPid = 0x0001; + wic.vDriverVersion = 0x0001; + strcpy(wic.szPname, "Wine wave in mapper"); + wic.dwFormats = + WAVE_FORMAT_96M08 | WAVE_FORMAT_96S08 | WAVE_FORMAT_96M16 | WAVE_FORMAT_96S16 | + WAVE_FORMAT_48M08 | WAVE_FORMAT_48S08 | WAVE_FORMAT_48M16 | WAVE_FORMAT_48S16 | WAVE_FORMAT_4M08 | WAVE_FORMAT_4S08 | WAVE_FORMAT_4M16 | WAVE_FORMAT_4S16 | WAVE_FORMAT_2M08 | WAVE_FORMAT_2S08 | WAVE_FORMAT_2M16 | WAVE_FORMAT_2S16 | WAVE_FORMAT_1M08 | WAVE_FORMAT_1S08 | WAVE_FORMAT_1M16 | WAVE_FORMAT_1S16; - lpWaveCaps->wChannels = 2; + wic.wChannels = 2; + memcpy(lpWaveCaps, &wic, min(dwParam2, sizeof(wic))); + return MMSYSERR_NOERROR; } ERR("This shouldn't happen\n"); @@ -842,16 +952,22 @@ static DWORD widGetDevCaps(UINT wDevID, WAVEMAPDATA* wim, LPWAVEINCAPSA lpWaveCa static DWORD widStop(WAVEMAPDATA* wim) { + TRACE("(%p)\n", wim); + return waveInStop(wim->u.in.hInnerWave); } static DWORD widStart(WAVEMAPDATA* wim) { + TRACE("(%p)\n", wim); + return waveInStart(wim->u.in.hInnerWave); } static DWORD widReset(WAVEMAPDATA* wim) { + TRACE("(%p)\n", wim); + return waveInReset(wim->u.in.hInnerWave); } @@ -860,6 +976,8 @@ static DWORD widMapperStatus(WAVEMAPDATA* wim, DWORD flags, LPVOID ptr) UINT id; DWORD ret = MMSYSERR_NOTSUPPORTED; + TRACE("(%p %08lx %p)\n", wim, flags, ptr); + switch (flags) { case WAVEIN_MAPPER_STATUS_DEVICE: ret = waveInGetID(wim->u.in.hInnerWave, &id); @@ -912,6 +1030,10 @@ DWORD WINAPI WAVEMAP_widMessage(WORD wDevID, WORD wMsg, DWORD dwUser, case WIDM_START: return widStart ((WAVEMAPDATA*)dwUser); case WIDM_STOP: return widStop ((WAVEMAPDATA*)dwUser); case WIDM_MAPPER_STATUS: return widMapperStatus ((WAVEMAPDATA*)dwUser, dwParam1, (LPVOID)dwParam2); + /* known but not supported */ + case DRV_QUERYDEVICEINTERFACESIZE: + case DRV_QUERYDEVICEINTERFACE: + return MMSYSERR_NOTSUPPORTED; default: FIXME("unknown message %u!\n", wMsg); } @@ -929,6 +1051,8 @@ static struct WINE_WAVEMAP* oss = NULL; */ static DWORD WAVEMAP_drvOpen(LPSTR str) { + TRACE("(%p)\n", str); + if (oss) return 0; @@ -942,6 +1066,8 @@ static DWORD WAVEMAP_drvOpen(LPSTR str) */ static DWORD WAVEMAP_drvClose(DWORD dwDevID) { + TRACE("(%08lx)\n", dwDevID); + if (oss) { oss = NULL; return 1; From b3e8303421e8c9c8e15fba4d92298c05701ff2c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Wed, 16 Jun 2004 18:48:46 +0000 Subject: [PATCH 1399/1463] Sync to Wine-20040615: Robert Reif <reif@earthlink.net> - Added some trace and debug printing. - Fixed a problem were a trace accesses a data member that may be outside of the actual data structure passed in. - Added some more debug traces. - Don't try to map the mapper device. Mike McCormack <mike@codeweavers.com> - Fix PlaySound. Eric Pouech <pouech-eric@wanadoo.fr> - GetModuleFileName[AW] doesn't terminate the string if the buffer is too small. Uwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de> - Fixed missing inversion in bit manipulation. Ivan Leo Puoti <puoti@inwind.it> - Changed my name, so update copyright info. svn path=/trunk/; revision=9686 --- reactos/lib/winmm/lolvldrv.c | 35 ++++++++++++---- reactos/lib/winmm/playsound.c | 18 ++++++-- reactos/lib/winmm/winehq2ros.patch | 26 ++++++------ reactos/lib/winmm/winemm.h | 1 + reactos/lib/winmm/winmm.c | 67 +++++++++++++++++++++++++----- reactos/lib/winmm/winmm_It.rc | 2 +- 6 files changed, 112 insertions(+), 37 deletions(-) diff --git a/reactos/lib/winmm/lolvldrv.c b/reactos/lib/winmm/lolvldrv.c index 07a9cb6b22e..a9ad64472d8 100644 --- a/reactos/lib/winmm/lolvldrv.c +++ b/reactos/lib/winmm/lolvldrv.c @@ -95,6 +95,7 @@ void MMDRV_InstallMap(unsigned int drv, */ BOOL MMDRV_Is32(unsigned int idx) { + TRACE("(%d)\n", idx); return MMDrvs[idx].bIs32; } @@ -114,6 +115,7 @@ static BOOL MMDRV_GetDescription32(const char* fname, char* buf, int buflen) FARPROC pGetFileVersionInfoA; FARPROC pVerQueryValueA; HMODULE hmodule = 0; + TRACE("(%p, %p, %d)\n", fname, buf, buflen); #define E(_x) do {TRACE _x;goto theEnd;} while(0) @@ -164,6 +166,7 @@ theEnd: */ UINT MMDRV_GetNum(UINT type) { + TRACE("(%04x)\n", type); assert(type < MMDRV_MAX); return llTypes[type].wMaxId; } @@ -218,7 +221,7 @@ DWORD MMDRV_Message(LPWINE_MLD mld, UINT wMsg, DWORD_PTR dwParam1, TRACE("Calling message(dev=%u msg=%u usr=0x%08lx p1=0x%08lx p2=0x%08lx)\n", mld->uDeviceID, wMsg, mld->dwDriverInstance, dwParam1, dwParam2); ret = part->u.fnMessage32(mld->uDeviceID, wMsg, mld->dwDriverInstance, dwParam1, dwParam2); - TRACE("=> %lu\n", ret); + TRACE("=> %s\n", WINMM_ErrorToString(ret)); } else { map = llType->Map16To32A(wMsg, &mld->dwDriverInstance, &dwParam1, &dwParam2); switch (map) { @@ -235,7 +238,7 @@ DWORD MMDRV_Message(LPWINE_MLD mld, UINT wMsg, DWORD_PTR dwParam1, mld->uDeviceID, wMsg, mld->dwDriverInstance, dwParam1, dwParam2); ret = part->u.fnMessage32(mld->uDeviceID, wMsg, mld->dwDriverInstance, dwParam1, dwParam2); - TRACE("=> %lu\n", ret); + TRACE("=> %s\n", WINMM_ErrorToString(ret)); if (map == WINMM_MAP_OKMEM) llType->UnMap16To32A(wMsg, &mld->dwDriverInstance, &dwParam1, &dwParam2, ret); break; @@ -265,7 +268,7 @@ DWORD MMDRV_Message(LPWINE_MLD mld, UINT wMsg, DWORD_PTR dwParam1, ret = pFnCallMMDrvFunc16((DWORD)part->u.fnMessage16, mld->uDeviceID, wMsg, mld->dwDriverInstance, dwParam1, dwParam2); - TRACE("=> %lu\n", ret); + TRACE("=> %s\n", WINMM_ErrorToString(ret)); if (map == WINMM_MAP_OKMEM) llType->UnMap32ATo16(wMsg, &mld->dwDriverInstance, &dwParam1, &dwParam2, ret); break; @@ -280,7 +283,7 @@ DWORD MMDRV_Message(LPWINE_MLD mld, UINT wMsg, DWORD_PTR dwParam1, ret = pFnCallMMDrvFunc16((DWORD)part->u.fnMessage16, mld->uDeviceID, wMsg, mld->dwDriverInstance, dwParam1, dwParam2); - TRACE("=> %lu\n", ret); + TRACE("=> %s\n", WINMM_ErrorToString(ret)); } } return ret; @@ -294,6 +297,8 @@ LPWINE_MLD MMDRV_Alloc(UINT size, UINT type, LPHANDLE hndl, DWORD* dwFlags, { LPWINE_MLD mld; UINT i; + TRACE("(%d, %04x, %p, %p, %p, %p, %c)\n", + size, type, hndl, dwFlags, dwCallback, dwInstance, bFrom32?'Y':'N'); mld = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); if (!mld) return NULL; @@ -338,6 +343,8 @@ LPWINE_MLD MMDRV_Alloc(UINT size, UINT type, LPHANDLE hndl, DWORD* dwFlags, */ void MMDRV_Free(HANDLE hndl, LPWINE_MLD mld) { + TRACE("(%p, %p)\n", hndl, mld); + if ((UINT)hndl & 0x8000) { unsigned idx = (UINT)hndl & ~0x8000; if (idx < sizeof(MM_MLDrvs) / sizeof(MM_MLDrvs[0])) { @@ -357,6 +364,7 @@ DWORD MMDRV_Open(LPWINE_MLD mld, UINT wMsg, DWORD dwParam1, DWORD dwFlags) DWORD dwRet = MMSYSERR_BADDEVICEID; DWORD dwInstance; WINE_LLTYPE* llType = &llTypes[mld->type]; + TRACE("(%p, %04x, 0x%08lx, 0x%08lx)\n", mld, wMsg, dwParam1, dwFlags); mld->dwDriverInstance = (DWORD)&dwInstance; @@ -398,6 +406,7 @@ DWORD MMDRV_Open(LPWINE_MLD mld, UINT wMsg, DWORD dwParam1, DWORD dwFlags) */ DWORD MMDRV_Close(LPWINE_MLD mld, UINT wMsg) { + TRACE("(%p, %04x)\n", mld, wMsg); return MMDRV_Message(mld, wMsg, 0L, 0L, TRUE); } @@ -406,6 +415,7 @@ DWORD MMDRV_Close(LPWINE_MLD mld, UINT wMsg) */ LPWINE_MLD MMDRV_GetByID(UINT uDevID, UINT type) { + TRACE("(%04x, %04x)\n", uDevID, type); if (uDevID < llTypes[type].wMaxId) return &llTypes[type].lpMlds[uDevID]; if ((uDevID == (UINT16)-1 || uDevID == (UINT)-1) && llTypes[type].nMapper != -1) @@ -420,6 +430,7 @@ LPWINE_MLD MMDRV_Get(HANDLE _hndl, UINT type, BOOL bCanBeID) { LPWINE_MLD mld = NULL; UINT hndl = (UINT)_hndl; + TRACE("(%p, %04x, %c)\n", _hndl, type, bCanBeID ? 'Y' : 'N'); assert(type < MMDRV_MAX); @@ -448,6 +459,8 @@ LPWINE_MLD MMDRV_GetRelated(HANDLE hndl, UINT srcType, BOOL bSrcCanBeID, UINT dstType) { LPWINE_MLD mld; + TRACE("(%p, %04x, %c, %04x)\n", + hndl, srcType, bSrcCanBeID ? 'Y' : 'N', dstType); if ((mld = MMDRV_Get(hndl, srcType, bSrcCanBeID)) != NULL) { WINE_MM_DRIVER_PART* part = &MMDrvs[mld->mmdIndex].parts[dstType]; @@ -520,6 +533,7 @@ static BOOL MMDRV_InitPerType(LPWINE_MM_DRIVER lpDrv, UINT type, UINT wMsg) DWORD ret; UINT count = 0; int i, k; + TRACE("(%p, %04x, %04x)\n", lpDrv, type, wMsg); part->nIDMin = part->nIDMax = 0; @@ -528,7 +542,7 @@ static BOOL MMDRV_InitPerType(LPWINE_MM_DRIVER lpDrv, UINT type, UINT wMsg) if (lpDrv->bIs32 && part->u.fnMessage32) { ret = part->u.fnMessage32(0, DRVM_INIT, 0L, 0L, 0L); - TRACE("DRVM_INIT => %08lx\n", ret); + TRACE("DRVM_INIT => %s\n", WINMM_ErrorToString(ret)); #if 0 ret = part->u.fnMessage32(0, DRVM_ENABLE, 0L, 0L, 0L); TRACE("DRVM_ENABLE => %08lx\n", ret); @@ -537,7 +551,7 @@ static BOOL MMDRV_InitPerType(LPWINE_MM_DRIVER lpDrv, UINT type, UINT wMsg) } else if (!lpDrv->bIs32 && part->u.fnMessage16 && pFnCallMMDrvFunc16) { ret = pFnCallMMDrvFunc16((DWORD)part->u.fnMessage16, 0, DRVM_INIT, 0L, 0L, 0L); - TRACE("DRVM_INIT => %08lx\n", ret); + TRACE("DRVM_INIT => %s\n", WINMM_ErrorToString(ret)); #if 0 ret = pFnCallMMDrvFunc16((DWORD)part->u.fnMessage16, 0, DRVM_ENABLE, 0L, 0L, 0L); @@ -709,6 +723,7 @@ static BOOL MMDRV_InitFromRegistry(void) char* p2; DWORD type, size; BOOL ret = FALSE; + TRACE("()\n"); if (RegCreateKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config\\WinMM", &hKey)) { TRACE("Cannot open WinMM config key\n"); @@ -744,6 +759,7 @@ static BOOL MMDRV_InitFromRegistry(void) */ static BOOL MMDRV_InitHardcoded(void) { + TRACE("()\n"); /* first load hardware drivers */ #ifndef __REACTOS__ MMDRV_Install("wineoss.drv", "wineoss.drv", FALSE); @@ -766,6 +782,7 @@ static BOOL MMDRV_InitHardcoded(void) */ BOOL MMDRV_Init(void) { + TRACE("()\n"); /* FIXME: MMDRV_InitFromRegistry shall be MMDRV_Init in a near future */ return MMDRV_InitFromRegistry() || MMDRV_InitHardcoded(); } @@ -779,6 +796,7 @@ static BOOL MMDRV_ExitPerType(LPWINE_MM_DRIVER lpDrv, UINT type) { WINE_MM_DRIVER_PART* part = &lpDrv->parts[type]; DWORD ret; + TRACE("(%p, %04x)\n", lpDrv, type); if (lpDrv->bIs32 && part->u.fnMessage32) { #if 0 @@ -786,7 +804,7 @@ static BOOL MMDRV_ExitPerType(LPWINE_MM_DRIVER lpDrv, UINT type) TRACE("DRVM_DISABLE => %08lx\n", ret); #endif ret = part->u.fnMessage32(0, DRVM_EXIT, 0L, 0L, 0L); - TRACE("DRVM_EXIT => %08lx\n", ret); + TRACE("DRVM_EXIT => %s\n", WINMM_ErrorToString(ret)); } else if (!lpDrv->bIs32 && part->u.fnMessage16 && pFnCallMMDrvFunc16) { #if 0 ret = pFnCallMMDrvFunc16((DWORD)part->u.fnMessage16, @@ -795,7 +813,7 @@ static BOOL MMDRV_ExitPerType(LPWINE_MM_DRIVER lpDrv, UINT type) #endif ret = pFnCallMMDrvFunc16((DWORD)part->u.fnMessage16, 0, DRVM_EXIT, 0L, 0L, 0L); - TRACE("DRVM_EXIT => %08lx\n", ret); + TRACE("DRVM_EXIT => %s\n", WINMM_ErrorToString(ret)); } else { return FALSE; } @@ -811,6 +829,7 @@ static BOOL MMDRV_ExitPerType(LPWINE_MM_DRIVER lpDrv, UINT type) void MMDRV_Exit(void) { int i; + TRACE("()\n"); for (i = 0; i < sizeof(MM_MLDrvs) / sizeof(MM_MLDrvs[0]); i++) { diff --git a/reactos/lib/winmm/playsound.c b/reactos/lib/winmm/playsound.c index 39f5d4e006e..09e332aa7a4 100644 --- a/reactos/lib/winmm/playsound.c +++ b/reactos/lib/winmm/playsound.c @@ -68,6 +68,7 @@ static HMMIO get_mmioFromProfile(UINT uFlags, LPCWSTR lpszName) 'S','c','h','e','m','e','s','\\', 'A','p','p','s',0}; static const WCHAR wszDotDefault[] = {'.','D','e','f','a','u','l','t',0}; + static const WCHAR wszDotCurrent[] = {'.','C','u','r','r','e','n','t',0}; static const WCHAR wszNull[] = {0}; TRACE("searching in SystemSound list for %s\n", debugstr_w(lpszName)); @@ -90,15 +91,18 @@ static HMMIO get_mmioFromProfile(UINT uFlags, LPCWSTR lpszName) if (RegOpenKeyW(HKEY_CURRENT_USER, wszKey, &hRegSnd) != 0) goto none; if (uFlags & SND_APPLICATION) { + DWORD len; + err = 1; /* error */ - if (GetModuleFileNameW(0, str, sizeof(str)/sizeof(str[0]))) + len = GetModuleFileNameW(0, str, sizeof(str)/sizeof(str[0])); + if (len > 0 && len < sizeof(str)/sizeof(str[0])) { for (ptr = str + lstrlenW(str) - 1; ptr >= str; ptr--) { if (*ptr == '.') *ptr = 0; if (*ptr == '\\') { - err = RegOpenKeyW(hRegSnd, str, &hRegApp); + err = RegOpenKeyW(hRegSnd, ptr+1, &hRegApp); break; } } @@ -113,9 +117,15 @@ static HMMIO get_mmioFromProfile(UINT uFlags, LPCWSTR lpszName) err = RegOpenKeyW(hRegApp, lpszName, &hScheme); RegCloseKey(hRegApp); if (err != 0) goto none; + /* what's the difference between .Current and .Default ? */ err = RegOpenKeyW(hScheme, wszDotDefault, &hSnd); - RegCloseKey(hScheme); - if (err != 0) goto none; + if (err != 0) + { + err = RegOpenKeyW(hScheme, wszDotCurrent, &hSnd); + RegCloseKey(hScheme); + if (err != 0) + goto none; + } count = sizeof(str)/sizeof(str[0]); err = RegQueryValueExW(hSnd, NULL, 0, &type, (LPBYTE)str, &count); RegCloseKey(hSnd); diff --git a/reactos/lib/winmm/winehq2ros.patch b/reactos/lib/winmm/winehq2ros.patch index b957070dde4..dc0589e3d0e 100644 --- a/reactos/lib/winmm/winehq2ros.patch +++ b/reactos/lib/winmm/winehq2ros.patch @@ -1,11 +1,11 @@ Index: lolvldrv.c =================================================================== RCS file: /home/wine/wine/dlls/winmm/lolvldrv.c,v -retrieving revision 1.56 -diff -u -r1.56 lolvldrv.c ---- lolvldrv.c 5 May 2004 01:00:54 -0000 1.56 -+++ lolvldrv.c 8 May 2004 14:17:20 -0000 -@@ -497,10 +497,12 @@ +retrieving revision 1.58 +diff -u -r1.58 lolvldrv.c +--- lolvldrv.c 1 Jun 2004 19:40:48 -0000 1.58 ++++ lolvldrv.c 16 Jun 2004 18:56:14 -0000 +@@ -510,10 +510,12 @@ case DRV_QUERYDEVICEINTERFACESIZE: return MMDRV_Message(mld, uMsg, dwParam1, dwParam2, TRUE); @@ -18,9 +18,9 @@ diff -u -r1.56 lolvldrv.c default: WARN("Unknown call %04x\n", uMsg); -@@ -743,11 +745,18 @@ - static BOOL MMDRV_InitHardcoded(void) +@@ -759,11 +761,18 @@ { + TRACE("()\n"); /* first load hardware drivers */ +#ifndef __REACTOS__ MMDRV_Install("wineoss.drv", "wineoss.drv", FALSE); @@ -45,7 +45,7 @@ RCS file: /home/wine/wine/dlls/winmm/time.c,v retrieving revision 1.26 diff -u -r1.26 time.c --- time.c 12 Jan 2004 21:03:10 -0000 1.26 -+++ time.c 8 May 2004 14:17:20 -0000 ++++ time.c 16 Jun 2004 18:56:14 -0000 @@ -175,14 +175,19 @@ volatile HANDLE *pActive = (volatile HANDLE *)&TIME_hMMTimer; DWORD last_time, cur_time; @@ -69,11 +69,11 @@ diff -u -r1.26 time.c Index: winmm.c =================================================================== RCS file: /home/wine/wine/dlls/winmm/winmm.c,v -retrieving revision 1.33 -diff -u -r1.33 winmm.c ---- winmm.c 27 Feb 2004 21:29:32 -0000 1.33 -+++ winmm.c 8 May 2004 14:17:21 -0000 -@@ -125,10 +125,12 @@ +retrieving revision 1.37 +diff -u -r1.37 winmm.c +--- winmm.c 14 Jun 2004 16:53:59 -0000 1.37 ++++ winmm.c 16 Jun 2004 18:56:15 -0000 +@@ -126,10 +126,12 @@ loaded = -1; if (h) { diff --git a/reactos/lib/winmm/winemm.h b/reactos/lib/winmm/winemm.h index 1447cd1ba4d..4f42b0ec562 100644 --- a/reactos/lib/winmm/winemm.h +++ b/reactos/lib/winmm/winemm.h @@ -256,6 +256,7 @@ DWORD MCI_SendCommandFrom16(UINT wDevID, UINT16 wMsg, DWORD dwParam1, DWORD dwP UINT MCI_SetCommandTable(void *table, UINT uDevType); BOOL WINMM_CheckForMMSystem(void); +const char* WINMM_ErrorToString(MMRESULT error); UINT MIXER_Open(LPHMIXER lphMix, UINT uDeviceID, DWORD dwCallback, DWORD dwInstance, DWORD fdwOpen, BOOL bFrom32); diff --git a/reactos/lib/winmm/winmm.c b/reactos/lib/winmm/winmm.c index 773eb0955b9..575f5105493 100644 --- a/reactos/lib/winmm/winmm.c +++ b/reactos/lib/winmm/winmm.c @@ -28,6 +28,7 @@ * 99/9 added support for loadable low level drivers */ +#include <stdio.h> #include <stdarg.h> #include <string.h> @@ -137,6 +138,36 @@ BOOL WINMM_CheckForMMSystem(void) return loaded > 0; } +/****************************************************************** + * WINMM_ErrorToString + */ +const char* WINMM_ErrorToString(MMRESULT error) +{ +#define ERR_TO_STR(dev) case dev: return #dev + static char unknown[32]; + switch (error) { + ERR_TO_STR(MMSYSERR_NOERROR); + ERR_TO_STR(MMSYSERR_ERROR); + ERR_TO_STR(MMSYSERR_BADDEVICEID); + ERR_TO_STR(MMSYSERR_NOTENABLED); + ERR_TO_STR(MMSYSERR_ALLOCATED); + ERR_TO_STR(MMSYSERR_INVALHANDLE); + ERR_TO_STR(MMSYSERR_NODRIVER); + ERR_TO_STR(MMSYSERR_NOMEM); + ERR_TO_STR(MMSYSERR_NOTSUPPORTED); + ERR_TO_STR(MMSYSERR_BADERRNUM); + ERR_TO_STR(MMSYSERR_INVALFLAG); + ERR_TO_STR(MMSYSERR_INVALPARAM); + ERR_TO_STR(WAVERR_BADFORMAT); + ERR_TO_STR(WAVERR_STILLPLAYING); + ERR_TO_STR(WAVERR_UNPREPARED); + ERR_TO_STR(WAVERR_SYNC); + } + sprintf(unknown, "Unknown(0x%08x)", error); + return unknown; +#undef ERR_TO_STR +} + /************************************************************************** * DllMain (WINMM.init) * @@ -1985,7 +2016,7 @@ static BOOL MMSYSTEM_MidiStream_MessageHandler(WINE_MIDIStream* lpMidiStrm, LPWI lpMidiHdr = (LPMIDIHDR)msg->lParam; lpMidiHdr->lpNext = 0; lpMidiHdr->dwFlags |= MHDR_INQUEUE; - lpMidiHdr->dwFlags &= MHDR_DONE; + lpMidiHdr->dwFlags &= ~MHDR_DONE; lpMidiHdr->dwOffset = 0; break; @@ -2427,19 +2458,29 @@ UINT WAVE_Open(HANDLE* lphndl, UINT uDeviceID, UINT uType, lphndl, (int)uDeviceID, (uType==MMDRV_WAVEOUT)?"Out":"In", lpFormat, dwCallback, dwInstance, dwFlags, bFrom32?32:16); - if (dwFlags & WAVE_FORMAT_QUERY) TRACE("WAVE_FORMAT_QUERY requested !\n"); + if (dwFlags & WAVE_FORMAT_QUERY) + TRACE("WAVE_FORMAT_QUERY requested !\n"); - if (lpFormat == NULL) return WAVERR_BADFORMAT; - if ((dwFlags & WAVE_MAPPED) && (uDeviceID == (UINT)-1)) + if (lpFormat == NULL) { + WARN("bad format\n"); + return WAVERR_BADFORMAT; + } + + if ((dwFlags & WAVE_MAPPED) && (uDeviceID == (UINT)-1)) { + WARN("invalid parameter\n"); return MMSYSERR_INVALPARAM; + } - TRACE("wFormatTag=%u, nChannels=%u, nSamplesPerSec=%lu, nAvgBytesPerSec=%lu, nBlockAlign=%u, wBitsPerSample=%u, cbSize=%u\n", + /* may have a PCMWAVEFORMAT rather than a WAVEFORMATEX so don't read cbSize */ + TRACE("wFormatTag=%u, nChannels=%u, nSamplesPerSec=%lu, nAvgBytesPerSec=%lu, nBlockAlign=%u, wBitsPerSample=%u\n", lpFormat->wFormatTag, lpFormat->nChannels, lpFormat->nSamplesPerSec, - lpFormat->nAvgBytesPerSec, lpFormat->nBlockAlign, lpFormat->wBitsPerSample, lpFormat->cbSize); + lpFormat->nAvgBytesPerSec, lpFormat->nBlockAlign, lpFormat->wBitsPerSample); if ((wmld = MMDRV_Alloc(sizeof(WINE_WAVE), uType, &handle, - &dwFlags, &dwCallback, &dwInstance, bFrom32)) == NULL) + &dwFlags, &dwCallback, &dwInstance, bFrom32)) == NULL) { + WARN("no memory\n"); return MMSYSERR_NOMEM; + } wod.hWave = handle; wod.lpFormat = lpFormat; /* should the struct be copied iso pointer? */ @@ -2461,11 +2502,12 @@ UINT WAVE_Open(HANDLE* lphndl, UINT uDeviceID, UINT uType, dwRet = MMDRV_Open(wmld, (uType == MMDRV_WAVEOUT) ? WODM_OPEN : WIDM_OPEN, (DWORD)&wod, dwFlags); + TRACE("dwRet = %s\n", WINMM_ErrorToString(dwRet)); if (dwRet != WAVERR_BADFORMAT || - (dwFlags & (WAVE_MAPPED|WAVE_FORMAT_DIRECT)) != 0) break; + ((dwFlags & (WAVE_MAPPED|WAVE_FORMAT_DIRECT)) != 0) || (uDeviceID == WAVE_MAPPER)) break; /* if we ask for a format which isn't supported by the physical driver, * let's try to map it through the wave mapper (except, if we already tried - * or user didn't allow us to use acm codecs) + * or user didn't allow us to use acm codecs or the device is already the mapper) */ dwFlags |= WAVE_MAPPED; /* we shall loop only one */ @@ -2477,7 +2519,7 @@ UINT WAVE_Open(HANDLE* lphndl, UINT uDeviceID, UINT uType, } if (lphndl != NULL) *lphndl = handle; - TRACE("=> %ld hWave=%p\n", dwRet, handle); + TRACE("=> %s hWave=%p\n", WINMM_ErrorToString(dwRet), handle); return dwRet; } @@ -2859,12 +2901,15 @@ UINT WINAPI waveOutMessage(HWAVEOUT hWaveOut, UINT uMessage, if ((wmld = MMDRV_Get(hWaveOut, MMDRV_WAVEOUT, TRUE)) != NULL) { return MMDRV_PhysicalFeatures(wmld, uMessage, dwParam1, dwParam2); } + WARN("invalid handle\n"); return MMSYSERR_INVALHANDLE; } /* from M$ KB */ - if (uMessage < DRVM_IOCTL || (uMessage >= DRVM_IOCTL_LAST && uMessage < DRVM_MAPPER)) + if (uMessage < DRVM_IOCTL || (uMessage >= DRVM_IOCTL_LAST && uMessage < DRVM_MAPPER)) { + WARN("invalid parameter\n"); return MMSYSERR_INVALPARAM; + } return MMDRV_Message(wmld, uMessage, dwParam1, dwParam2, TRUE); } diff --git a/reactos/lib/winmm/winmm_It.rc b/reactos/lib/winmm/winmm_It.rc index 1ff5d7a5c48..821a839b304 100644 --- a/reactos/lib/winmm/winmm_It.rc +++ b/reactos/lib/winmm/winmm_It.rc @@ -1,6 +1,6 @@ /* * Copyright 1999 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 From 0a30ec98a34de5046c854d876f153bb17b55c5ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Wed, 16 Jun 2004 18:50:19 +0000 Subject: [PATCH 1400/1463] Update porting status svn path=/trunk/; revision=9688 --- reactos/doc/README.WINE | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/reactos/doc/README.WINE b/reactos/doc/README.WINE index 8e420163c86..0b176d852db 100644 --- a/reactos/doc/README.WINE +++ b/reactos/doc/README.WINE @@ -32,24 +32,24 @@ reactos/tools/bin2res # Resource to binary converter The following shared libraries are a 100% port from Winehq sourcs. -reactos/lib/cabinet # Synced to Wine-20040505 -reactos/lib/comctl32 # Synced to Wine-20040505 -reactos/lib/comdlg32 # Synced to Wine-20040505 +reactos/lib/cabinet # Synced to Wine-20040615 +reactos/lib/comctl32 # Synced to Wine-20040615 +reactos/lib/comdlg32 # Synced to Wine-20040615 reactos/lib/imagehlp # Out of sync reactos/lib/imm32 reactos/lib/msvcrt20 -reactos/lib/mpr # Synced to Wine-20040505 -reactos/lib/ole32 # Synced to Wine-20040505 -reactos/lib/oledlg # Synced to Wine-20040505 -reactos/lib/richedit # Synced to Wine-20040505 -reactos/lib/rpcrt4 # Synced to Wine-20040505 +reactos/lib/mpr # Synced to Wine-20040615 +reactos/lib/ole32 # Synced to Wine-20040615 +reactos/lib/oledlg # Synced to Wine-20040615 +reactos/lib/richedit # Synced to Wine-20040615 +reactos/lib/rpcrt4 # Synced to Wine-20040615 reactos/lib/shell32 # 2004/04/16: Heavy syncing in progress -reactos/lib/shlwapi # Synced to Wine-20040505 +reactos/lib/shlwapi # Synced to Wine-20040615 reactos/lib/twain # Out of sync -reactos/lib/unicode # make this go away. Synced to Wine-20040505 -reactos/lib/winmm # Synced to Wine-20040505 -reactos/lib/winmm/midimap # Synced to Wine-20040505 -reactos/lib/winmm/wavemap # Synced to Wine-20040505 +reactos/lib/unicode # make this go away. Synced to Wine-20040615 +reactos/lib/winmm # Synced to Wine-20040615 +reactos/lib/winmm/midimap # Synced to Wine-20040615 +reactos/lib/winmm/wavemap # Synced to Wine-20040615 ReactOS shares the following programs with Winehq. reactos/subsys/system/regedit #Out of sync From f38668e7364624de1e0e1fd232e4b9b9032eac15 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Wed, 16 Jun 2004 20:21:20 +0000 Subject: [PATCH 1401/1463] Add keyboard detection. svn path=/trunk/; revision=9690 --- freeldr/freeldr/arch/i386/hardware.c | 260 ++++++++++++++++++++++++++- 1 file changed, 254 insertions(+), 6 deletions(-) diff --git a/freeldr/freeldr/arch/i386/hardware.c b/freeldr/freeldr/arch/i386/hardware.c index 6cc640ce267..9f6581ee19a 100644 --- a/freeldr/freeldr/arch/i386/hardware.c +++ b/freeldr/freeldr/arch/i386/hardware.c @@ -1,7 +1,7 @@ /* * FreeLoader * - * Copyright (C) 2003 Eric Kohl + * Copyright (C) 2003, 2004 Eric Kohl * * 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 @@ -167,6 +167,16 @@ typedef struct _CM_FLOPPY_DEVICE_DATA } __attribute__((packed)) CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA; +typedef struct _CM_KEYBOARD_DEVICE_DATA +{ + U16 Version; + U16 Revision; + U8 Type; + U8 Subtype; + U16 KeyboardFlags; +} __attribute__((packed)) CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA; + + static char Hex[] = "0123456789ABCDEF"; static unsigned int delay_count = 1; @@ -885,7 +895,9 @@ DetectBiosFloppyController(HKEY SystemKey, U32 FloppyCount; FloppyCount = GetFloppyCount(); -/* printf ("Floppy count: %u\n", FloppyCount);*/ + DbgPrint((DPRINT_HWDETECT, + "Floppy count: %u\n", + FloppyCount)); if (FloppyCount == 0) return; @@ -1456,6 +1468,244 @@ DetectSerialPorts(HKEY BusKey) } +static BOOLEAN +DetectKeyboardDevice(VOID) +{ + UCHAR Status; + UCHAR Scancode; + + WRITE_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA, + 0xF2); + + KeStallExecutionProcessor(10000); + + Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); + if ((Status & 0x01) != 0x01) + { + /* PC/XT keyboard or no keyboard */ + return FALSE; + } + + Scancode = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA); + if (Scancode != 0xFA) + { + /* No ACK received */ + return FALSE; + } + + KeStallExecutionProcessor(10000); + Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); + if ((Status & 0x01) != 0x01) + { + /* Found AT keyboard */ + return TRUE; + } + + Scancode = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA); + if (Scancode != 0xAB) + { + /* No 0xAB received */ + return FALSE; + } + + KeStallExecutionProcessor(10000); + Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); + if ((Status & 0x01) != 0x01) + { + /* No byte in buffer */ + return FALSE; + } + + Scancode = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA); + if (Scancode != 0x41) + { + /* No 0x41 received */ + return FALSE; + } + + /* Found MF-II keyboard */ + return TRUE; +} + + +static VOID +DetectKeyboardPeripheral(HKEY ControllerKey) +{ + PCM_FULL_RESOURCE_DESCRIPTOR FullResourceDescriptor; + PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor; + PCM_KEYBOARD_DEVICE_DATA KeyboardData; + HKEY PeripheralKey; + char Buffer[80]; + U32 Size; + S32 Error; + + if (DetectKeyboardDevice()) + { + /* Create controller key */ + Error = RegCreateKey(ControllerKey, + "KeyboardPeripheral\\0", + &PeripheralKey); + if (Error != ERROR_SUCCESS) + { + DbgPrint((DPRINT_HWDETECT, "Failed to create peripheral key\n")); + return; + } + DbgPrint((DPRINT_HWDETECT, "Created key: KeyboardPeripheral\\0\n")); + + /* Set 'ComponentInformation' value */ + SetComponentInformation(ControllerKey, + 0x28, + 0, + 0xFFFFFFFF); + + /* Set 'Configuration Data' value */ + Size = sizeof(CM_FULL_RESOURCE_DESCRIPTOR) + + sizeof(CM_KEYBOARD_DEVICE_DATA); + FullResourceDescriptor = MmAllocateMemory(Size); + if (FullResourceDescriptor == NULL) + { + DbgPrint((DPRINT_HWDETECT, + "Failed to allocate resource descriptor\n")); + return; + } + + /* Initialize resource descriptor */ + memset(FullResourceDescriptor, 0, Size); + FullResourceDescriptor->InterfaceType = Isa; + FullResourceDescriptor->BusNumber = 0; + FullResourceDescriptor->PartialResourceList.Count = 1; + + PartialDescriptor = &FullResourceDescriptor->PartialResourceList.PartialDescriptors[0]; + PartialDescriptor->Type = CmResourceTypeDeviceSpecific; + PartialDescriptor->ShareDisposition = CmResourceShareUndetermined; + PartialDescriptor->u.DeviceSpecificData.DataSize = sizeof(CM_KEYBOARD_DEVICE_DATA); + + KeyboardData = ((PVOID)FullResourceDescriptor) + sizeof(CM_FULL_RESOURCE_DESCRIPTOR); + KeyboardData->Version = 0; + KeyboardData->Revision = 0; + KeyboardData->Type = 4; + KeyboardData->Subtype = 0; + KeyboardData->KeyboardFlags = 0x20; + + /* Set 'Configuration Data' value */ + Error = RegSetValue(PeripheralKey, + "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 */ + strcpy(Buffer, + "PCAT_ENHANCED"); + 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)); + } + } +} + + +static VOID +DetectKeyboardController(HKEY BusKey) +{ + PCM_FULL_RESOURCE_DESCRIPTOR FullResourceDescriptor; + PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor; + HKEY ControllerKey; + U32 Size; + S32 Error; + + /* Create controller key */ + Error = RegCreateKey(BusKey, + "KeyboardController\\0", + &ControllerKey); + if (Error != ERROR_SUCCESS) + { + DbgPrint((DPRINT_HWDETECT, "Failed to create controller key\n")); + return; + } + DbgPrint((DPRINT_HWDETECT, "Created key: KeyboardController\\0\n")); + + /* Set 'ComponentInformation' value */ + SetComponentInformation(ControllerKey, + 0x28, + 0, + 0xFFFFFFFF); + + /* Set 'Configuration Data' value */ + Size = sizeof(CM_FULL_RESOURCE_DESCRIPTOR) + + 2 * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); + FullResourceDescriptor = MmAllocateMemory(Size); + if (FullResourceDescriptor == NULL) + { + DbgPrint((DPRINT_HWDETECT, + "Failed to allocate resource descriptor\n")); + return; + } + + /* Initialize resource descriptor */ + memset(FullResourceDescriptor, 0, Size); + FullResourceDescriptor->InterfaceType = Isa; + FullResourceDescriptor->BusNumber = 0; + FullResourceDescriptor->PartialResourceList.Count = 3; + + /* Set Interrupt */ + PartialDescriptor = &FullResourceDescriptor->PartialResourceList.PartialDescriptors[0]; + PartialDescriptor->Type = CmResourceTypeInterrupt; + PartialDescriptor->ShareDisposition = CmResourceShareUndetermined; + PartialDescriptor->Flags = CM_RESOURCE_INTERRUPT_LATCHED; + PartialDescriptor->u.Interrupt.Level = 1; + PartialDescriptor->u.Interrupt.Vector = 1; + PartialDescriptor->u.Interrupt.Affinity = 0xFFFFFFFF; + + /* Set IO Port 0x60 */ + PartialDescriptor = &FullResourceDescriptor->PartialResourceList.PartialDescriptors[1]; + PartialDescriptor->Type = CmResourceTypePort; + PartialDescriptor->ShareDisposition = CmResourceShareDeviceExclusive; + PartialDescriptor->Flags = CM_RESOURCE_PORT_IO; + PartialDescriptor->u.Port.Start = (U64)0x60; + PartialDescriptor->u.Port.Length = 1; + + /* Set IO Port 0x64 */ + PartialDescriptor = &FullResourceDescriptor->PartialResourceList.PartialDescriptors[2]; + PartialDescriptor->Type = CmResourceTypePort; + PartialDescriptor->ShareDisposition = CmResourceShareDeviceExclusive; + PartialDescriptor->Flags = CM_RESOURCE_PORT_IO; + PartialDescriptor->u.Port.Start = (U64)0x64; + PartialDescriptor->u.Port.Length = 1; + + /* 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)); + return; + } + + DetectKeyboardPeripheral(ControllerKey); +} + + static VOID PS2ControllerWait(VOID) { @@ -1757,12 +2007,10 @@ DetectIsaBios(HKEY SystemKey, U32 *BusNumber) DetectSerialPorts(BusKey); #if 0 - DetectBiosParallelPorts(); + DetectParallelPorts(BusKey); #endif -#if 0 - DetectBiosKeyboard(BusKey); -#endif + DetectKeyboardController(BusKey); DetectPS2Mouse(BusKey); From 4e81faa94861c3765e07b3fc9952bb9590d30fd3 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Wed, 16 Jun 2004 21:42:24 +0000 Subject: [PATCH 1402/1463] - Bump version number to 0.2.4. svn path=/trunk/; revision=9691 --- reactos/include/reactos/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/include/reactos/version.h b/reactos/include/reactos/version.h index f4e07f4471b..b3e701a465a 100644 --- a/reactos/include/reactos/version.h +++ b/reactos/include/reactos/version.h @@ -1,4 +1,4 @@ -/* $Id: version.h,v 1.22 2004/05/31 12:21:24 chorns Exp $ +/* $Id: version.h,v 1.23 2004/06/16 21:42:24 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -19,7 +19,7 @@ #define KERNEL_VERSION_MAJOR 0 #define KERNEL_VERSION_MINOR 2 -#define KERNEL_VERSION_PATCH_LEVEL 3 +#define KERNEL_VERSION_PATCH_LEVEL 4 /* KERNEL_VERSION_BUILD_TYPE is L"CVS", L"RC1", L"RC2" or L"RELEASE" */ #define KERNEL_VERSION_BUILD_TYPE L"CVS" From 7d375e8c48cfbccc39812e048778ace58609b7de Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Wed, 16 Jun 2004 22:13:19 +0000 Subject: [PATCH 1403/1463] Add some missing error codes. svn path=/trunk/; revision=9693 --- reactos/w32api/include/winerror.h | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/reactos/w32api/include/winerror.h b/reactos/w32api/include/winerror.h index 0a3193cdfdc..8d5b5f79b85 100644 --- a/reactos/w32api/include/winerror.h +++ b/reactos/w32api/include/winerror.h @@ -173,7 +173,15 @@ #define ERROR_NESTING_NOT_ALLOWED 215L #define ERROR_EXE_MACHINE_TYPE_MISMATCH 216L #define ERROR_EXE_CANNOT_MODIFY_SIGNED_BINARY 217L -#define ERRO_EXE_CANNOT_MODIFY_STRONG_SIGNED_BINARY 218L +#define ERROR_EXE_CANNOT_MODIFY_STRONG_SIGNED_BINARY 218L +#define ERROR_INVALID_EXITROUTINE_RING 219L +#define ERROR_GETBUF_FAILED 220L +#define ERROR_FLUSHBUF_FAILED 221L +#define ERROR_TRANSFER_TOO_LONG 222L +#define ERROR_FORCENOSWAP_FAILED 223L +#define ERROR_SMG_NO_TARGET_WINDOW 224L +#define ERROR_NO_CHILDREN 228L +#define ERROR_INVALID_SCREEN_GROUP 229L #define ERROR_BAD_PIPE 230L #define ERROR_PIPE_BUSY 231L #define ERROR_NO_DATA 232L From 0766c089ece92af98b42e518f410e6d8e0e7011a Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Thu, 17 Jun 2004 03:47:39 +0000 Subject: [PATCH 1404/1463] This makes RtlUnicodeStringToInteger work like the win2k version. Basically this function never checks the validity of the input string and only returns an error when the Base argument is set incorrectly. This fixes the bug while booting vmware with the pcnet card on. svn path=/trunk/; revision=9694 --- reactos/lib/rtl/unicode.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/reactos/lib/rtl/unicode.c b/reactos/lib/rtl/unicode.c index 83ee674408c..be4fe577d53 100644 --- a/reactos/lib/rtl/unicode.c +++ b/reactos/lib/rtl/unicode.c @@ -673,6 +673,13 @@ RtlPrefixUnicodeString( /* * @implemented + * + * Note that regardless of success or failure status, we should leave the + * partial value in Value. An error is never returned based on the chars + * in the string. + * + * This function does check the base. Only 2, 8, 10, 16 are permitted, + * else STATUS_INVALID_PARAMETER is returned. */ NTSTATUS STDCALL @@ -686,10 +693,14 @@ RtlUnicodeStringToInteger( ULONG i; ULONG Val; BOOLEAN addneg = FALSE; + NTSTATUS Status = STATUS_SUCCESS; *Value = 0; Str = String->Buffer; + if( Base && Base != 2 && Base != 8 && Base != 10 && Base != 16 ) + return STATUS_INVALID_PARAMETER; + for (i = 0; i < String->Length / sizeof(WCHAR); i++) { if (*Str == L'b') @@ -723,21 +734,21 @@ RtlUnicodeStringToInteger( } else if ((*Str > L'1') && (Base == 2)) { - return STATUS_INVALID_PARAMETER; + break; } else if (((*Str > L'7') || (*Str < L'0')) && (Base == 8)) { - return STATUS_INVALID_PARAMETER; + break; } else if (((*Str > L'9') || (*Str < L'0')) && (Base == 10)) { - return STATUS_INVALID_PARAMETER; + break; } else if ( ((*Str > L'9') || (*Str < L'0')) && ((towupper (*Str) > L'F') || (towupper (*Str) < L'A')) && (Base == 16)) { - return STATUS_INVALID_PARAMETER; + break; } Str++; } @@ -748,8 +759,10 @@ RtlUnicodeStringToInteger( Base = 10; while (iswxdigit (*Str) && - (Val = iswdigit (*Str) ? *Str - L'0' : (iswlower (*Str) - ? towupper (*Str) : *Str) - L'A' + 10) < Base) + (Val = + iswdigit (*Str) ? + *Str - L'0' : + (towupper (*Str) - L'A' + 10)) < Base) { *Value = *Value * Base + Val; Str++; @@ -758,7 +771,7 @@ RtlUnicodeStringToInteger( if (addneg == TRUE) *Value *= -1; - return STATUS_SUCCESS; + return Status; } From 06e579a94463ac24b2c5efd58133e9d62f14cbbb Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Thu, 17 Jun 2004 09:07:12 +0000 Subject: [PATCH 1405/1463] Compile advapi32 using w32api. svn path=/trunk/; revision=9695 --- reactos/include/accctrl.h | 6 + reactos/include/ascii.h | 6 +- reactos/include/ntsecapi.h | 27 +- reactos/include/unicode.h | 6 +- reactos/lib/advapi32/makefile | 6 +- reactos/lib/advapi32/misc/hwprofiles.c | 8 +- reactos/lib/advapi32/misc/logon.c | 14 +- reactos/lib/advapi32/reg/reg.c | 70 ++-- reactos/lib/advapi32/sec/lsa.c | 557 ++++++++++++------------- reactos/lib/advapi32/token/privilege.c | 5 +- reactos/w32api/include/ntsecapi.h | 52 ++- 11 files changed, 401 insertions(+), 356 deletions(-) diff --git a/reactos/include/accctrl.h b/reactos/include/accctrl.h index 7c3b60998f6..2ffe9374e54 100644 --- a/reactos/include/accctrl.h +++ b/reactos/include/accctrl.h @@ -16,6 +16,10 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#ifdef __USE_W32API +#include_next <accctrl.h> +#else + #ifndef __WINE_ACCCTRL_H #define __WINE_ACCCTRL_H @@ -463,3 +467,5 @@ typedef struct _FN_OBJECT_MGR_FUNCTIONS #endif #endif /* __WINE_ACCCTRL_H */ + +#endif /* __USE_W32API */ diff --git a/reactos/include/ascii.h b/reactos/include/ascii.h index 8a05a88fb94..c694424e14f 100644 --- a/reactos/include/ascii.h +++ b/reactos/include/ascii.h @@ -94,9 +94,9 @@ GetCurrentHwProfileA ( WINBOOL STDCALL LogonUserA ( - LPCSTR lpszUsername, - LPCSTR lpszDomain, - LPCSTR lpszPassword, + LPSTR lpszUsername, + LPSTR lpszDomain, + LPSTR lpszPassword, DWORD dwLogonType, DWORD dwLogonProvider, PHANDLE phToken diff --git a/reactos/include/ntsecapi.h b/reactos/include/ntsecapi.h index eccd0ccd379..3eca6a7ee80 100644 --- a/reactos/include/ntsecapi.h +++ b/reactos/include/ntsecapi.h @@ -122,18 +122,19 @@ typedef PVOID LSA_HANDLE, *PLSA_HANDLE; typedef enum { - PolicyAuditLogInformation = 1, - PolicyAuditEventsInformation, - PolicyPrimaryDomainInformation, - PolicyPdAccountInformation, - PolicyAccountDomainInformation, - PolicyLsaServerRoleInformation, - PolicyReplicaSourceInformation, - PolicyDefaultQuotaInformation, - PolicyModificationInformation, - PolicyAuditFullSetInformation, - PolicyAuditFullQueryInformation, - PolicyDnsDomainInformation + PolicyAuditLogInformation = 1, + PolicyAuditEventsInformation, + PolicyPrimaryDomainInformation, + PolicyPdAccountInformation, + PolicyAccountDomainInformation, + PolicyLsaServerRoleInformation, + PolicyReplicaSourceInformation, + PolicyDefaultQuotaInformation, + PolicyModificationInformation, + PolicyAuditFullSetInformation, + PolicyAuditFullQueryInformation, + PolicyDnsDomainInformation, + PolicyEfsInformation } POLICY_INFORMATION_CLASS, *PPOLICY_INFORMATION_CLASS; typedef ULONG POLICY_AUDIT_EVENT_OPTIONS, *PPOLICY_AUDIT_EVENT_OPTIONS; @@ -484,7 +485,7 @@ STDCALL LsaRemoveAccountRights( LSA_HANDLE PolicyHandle, PSID AccountSid, - WINBOOL AllRights, + BOOLEAN AllRights, PLSA_UNICODE_STRING UserRights, ULONG CountOfRights ); diff --git a/reactos/include/unicode.h b/reactos/include/unicode.h index a25ac4d0500..e7d5e7471f2 100644 --- a/reactos/include/unicode.h +++ b/reactos/include/unicode.h @@ -95,9 +95,9 @@ GetCurrentHwProfileW ( WINBOOL STDCALL LogonUserW ( - LPCWSTR lpszUsername, - LPCWSTR lpszDomain, - LPCWSTR lpszPassword, + LPWSTR lpszUsername, + LPWSTR lpszDomain, + LPWSTR lpszPassword, DWORD dwLogonType, DWORD dwLogonProvider, PHANDLE phToken diff --git a/reactos/lib/advapi32/makefile b/reactos/lib/advapi32/makefile index e4ff8528f03..9a96ad9753c 100644 --- a/reactos/lib/advapi32/makefile +++ b/reactos/lib/advapi32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.40 2004/05/29 21:24:42 hbirr Exp $ +# $Id: makefile,v 1.41 2004/06/17 09:07:12 ekohl Exp $ PATH_TO_TOP = ../.. @@ -6,12 +6,12 @@ TARGET_TYPE = dynlink TARGET_NAME = advapi32 -TARGET_CFLAGS = -Wall -Werror -fno-builtin +TARGET_CFLAGS = -Wall -Werror -fno-builtin -D__USE_W32API # TARGET_CFLAGS += -DUNICODE TARGET_LFLAGS = -nostartfiles -nostdlib -TARGET_SDKLIBS = ntdll.a kernel32.a libwine.a msvcrt.a +TARGET_SDKLIBS = ntdll.a kernel32.a TARGET_BASE = $(TARGET_BASE_LIB_ADVAPI32) diff --git a/reactos/lib/advapi32/misc/hwprofiles.c b/reactos/lib/advapi32/misc/hwprofiles.c index f0f18713442..d89b9d8bbff 100644 --- a/reactos/lib/advapi32/misc/hwprofiles.c +++ b/reactos/lib/advapi32/misc/hwprofiles.c @@ -1,4 +1,4 @@ -/* $Id: hwprofiles.c,v 1.1 2004/02/25 23:12:39 sedwards Exp $ +/* $Id: hwprofiles.c,v 1.2 2004/06/17 09:07:12 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -8,8 +8,9 @@ * UPDATE HISTORY: * 20042502 */ -#include <debug.h> +#include <ddk/ntddk.h> #include <windows.h> +#include <debug.h> /****************************************************************************** * GetCurrentHwProfileA [ADVAPI32.@] @@ -23,7 +24,8 @@ * Success: TRUE. pInfo is updated with the hardware profile details. * Failure: FALSE. */ -BOOL STDCALL GetCurrentHwProfileA(LPHW_PROFILE_INFOA pInfo) +BOOL STDCALL +GetCurrentHwProfileA(LPHW_PROFILE_INFOA pInfo) { DPRINT("GetCurrentHwProfileA stub\n"); return 1; diff --git a/reactos/lib/advapi32/misc/logon.c b/reactos/lib/advapi32/misc/logon.c index 83a12a97402..73fc8f19ae3 100644 --- a/reactos/lib/advapi32/misc/logon.c +++ b/reactos/lib/advapi32/misc/logon.c @@ -1,4 +1,4 @@ -/* $Id: logon.c,v 1.5 2004/03/09 15:04:28 ekohl Exp $ +/* $Id: logon.c,v 1.6 2004/06/17 09:07:12 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -130,9 +130,9 @@ CreateProcessAsUserW (HANDLE hToken, * @unimplemented */ BOOL STDCALL -LogonUserA (LPCSTR lpszUsername, - LPCSTR lpszDomain, - LPCSTR lpszPassword, +LogonUserA (LPSTR lpszUsername, + LPSTR lpszDomain, + LPSTR lpszPassword, DWORD dwLogonType, DWORD dwLogonProvider, PHANDLE phToken) @@ -241,9 +241,9 @@ SamGetUserSid (LPCWSTR UserName, * @unimplemented */ BOOL STDCALL -LogonUserW (LPCWSTR lpszUsername, - LPCWSTR lpszDomain, - LPCWSTR lpszPassword, +LogonUserW (LPWSTR lpszUsername, + LPWSTR lpszDomain, + LPWSTR lpszPassword, DWORD dwLogonType, DWORD dwLogonProvider, PHANDLE phToken) diff --git a/reactos/lib/advapi32/reg/reg.c b/reactos/lib/advapi32/reg/reg.c index 843e9410f92..1f720b98c34 100644 --- a/reactos/lib/advapi32/reg/reg.c +++ b/reactos/lib/advapi32/reg/reg.c @@ -1,4 +1,4 @@ -/* $Id: reg.c,v 1.46 2004/04/03 13:12:43 gvg Exp $ +/* $Id: reg.c,v 1.47 2004/06/17 09:07:12 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -37,7 +37,7 @@ static HANDLE ProcessHeap; /* PROTOTYPES ***************************************************************/ -static NTSTATUS MapDefaultKey (PHKEY ParentKey, HKEY Key); +static NTSTATUS MapDefaultKey (PHANDLE ParentKey, HKEY Key); static VOID CloseDefaultKeys(VOID); static NTSTATUS OpenClassesRootKey(PHANDLE KeyHandle); @@ -81,7 +81,7 @@ RegCleanup (VOID) static NTSTATUS -MapDefaultKey (PHKEY RealKey, +MapDefaultKey (PHANDLE RealKey, HKEY Key) { PHANDLE Handle; @@ -92,7 +92,7 @@ MapDefaultKey (PHKEY RealKey, if (((ULONG)Key & 0xF0000000) != 0x80000000) { - *RealKey = Key; + *RealKey = (HANDLE)Key; return STATUS_SUCCESS; } @@ -148,7 +148,7 @@ MapDefaultKey (PHKEY RealKey, if (NT_SUCCESS(Status)) { - *RealKey = (HKEY)*Handle; + *RealKey = *Handle; } return Status; @@ -332,7 +332,7 @@ RegCreateKeyExA (HKEY hKey, UNICODE_STRING SubKeyString; UNICODE_STRING ClassString; OBJECT_ATTRIBUTES Attributes; - HKEY ParentKey; + HANDLE ParentKey; LONG ErrorCode; NTSTATUS Status; @@ -361,7 +361,7 @@ RegCreateKeyExA (HKEY hKey, OBJ_CASE_INSENSITIVE, (HANDLE)ParentKey, (PSECURITY_DESCRIPTOR)lpSecurityAttributes); - Status = NtCreateKey (phkResult, + Status = NtCreateKey ((PHANDLE)phkResult, samDesired, &Attributes, 0, @@ -404,7 +404,7 @@ RegCreateKeyExW (HKEY hKey, UNICODE_STRING SubKeyString; UNICODE_STRING ClassString; OBJECT_ATTRIBUTES Attributes; - HKEY ParentKey; + HANDLE ParentKey; LONG ErrorCode; NTSTATUS Status; @@ -430,7 +430,7 @@ RegCreateKeyExW (HKEY hKey, OBJ_CASE_INSENSITIVE, (HANDLE)ParentKey, (PSECURITY_DESCRIPTOR)lpSecurityAttributes); - Status = NtCreateKey (phkResult, + Status = NtCreateKey ((PHANDLE)phkResult, samDesired, &Attributes, 0, @@ -504,7 +504,7 @@ RegDeleteKeyA (HKEY hKey, { OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING SubKeyName; - HKEY ParentKey; + HANDLE ParentKey; HANDLE TargetKey; NTSTATUS Status; LONG ErrorCode; @@ -561,7 +561,7 @@ RegDeleteKeyW (HKEY hKey, { OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING SubKeyName; - HKEY ParentKey; + HANDLE ParentKey; HANDLE TargetKey; NTSTATUS Status; LONG ErrorCode; @@ -615,7 +615,7 @@ RegDeleteValueA (HKEY hKey, LPCSTR lpValueName) { UNICODE_STRING ValueName; - HKEY KeyHandle; + HANDLE KeyHandle; LONG ErrorCode; NTSTATUS Status; @@ -656,7 +656,7 @@ RegDeleteValueW (HKEY hKey, UNICODE_STRING ValueName; NTSTATUS Status; LONG ErrorCode; - HKEY KeyHandle; + HANDLE KeyHandle; Status = MapDefaultKey (&KeyHandle, hKey); @@ -761,7 +761,7 @@ RegEnumKeyExA (HKEY hKey, DWORD ClassLength; DWORD BufferSize; DWORD ResultSize; - HKEY KeyHandle; + HANDLE KeyHandle; NTSTATUS Status; DPRINT("RegEnumKeyExA(hKey 0x%x, dwIndex %d, lpName 0x%x, *lpcbName %d, lpClass 0x%x, lpcbClass %d)\n", @@ -936,7 +936,7 @@ RegEnumKeyExW (HKEY hKey, ULONG ResultSize; ULONG NameLength; ULONG ClassLength; - HKEY KeyHandle; + HANDLE KeyHandle; LONG ErrorCode = ERROR_SUCCESS; NTSTATUS Status; @@ -1088,7 +1088,7 @@ RegEnumValueA (HKEY hKey, ULONG BufferSize; ULONG DataLength; ULONG ResultSize; - HKEY KeyHandle; + HANDLE KeyHandle; LONG ErrorCode; NTSTATUS Status; UNICODE_STRING StringU; @@ -1255,7 +1255,7 @@ RegEnumValueW (HKEY hKey, ULONG BufferSize; ULONG DataLength; ULONG ResultSize; - HKEY KeyHandle; + HANDLE KeyHandle; LONG ErrorCode; NTSTATUS Status; @@ -1373,7 +1373,7 @@ RegEnumValueW (HKEY hKey, LONG STDCALL RegFlushKey(HKEY hKey) { - HKEY KeyHandle; + HANDLE KeyHandle; LONG ErrorCode; NTSTATUS Status; @@ -1618,7 +1618,7 @@ RegOpenKeyA (HKEY hKey, { OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING SubKeyString; - HKEY KeyHandle; + HANDLE KeyHandle; LONG ErrorCode; NTSTATUS Status; @@ -1638,7 +1638,7 @@ RegOpenKeyA (HKEY hKey, OBJ_CASE_INSENSITIVE, KeyHandle, NULL); - Status = NtOpenKey (phkResult, + Status = NtOpenKey ((PHANDLE)phkResult, MAXIMUM_ALLOWED, &ObjectAttributes); RtlFreeUnicodeString (&SubKeyString); @@ -1668,7 +1668,7 @@ RegOpenKeyW (HKEY hKey, { OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING SubKeyString; - HKEY KeyHandle; + HANDLE KeyHandle; LONG ErrorCode; NTSTATUS Status; @@ -1688,7 +1688,7 @@ RegOpenKeyW (HKEY hKey, OBJ_CASE_INSENSITIVE, KeyHandle, NULL); - Status = NtOpenKey (phkResult, + Status = NtOpenKey ((PHANDLE)phkResult, MAXIMUM_ALLOWED, &ObjectAttributes); if (!NT_SUCCESS(Status)) @@ -1716,7 +1716,7 @@ RegOpenKeyExA (HKEY hKey, { OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING SubKeyString; - HKEY KeyHandle; + HANDLE KeyHandle; LONG ErrorCode; NTSTATUS Status; @@ -1736,7 +1736,7 @@ RegOpenKeyExA (HKEY hKey, OBJ_CASE_INSENSITIVE, KeyHandle, NULL); - Status = NtOpenKey (phkResult, + Status = NtOpenKey ((PHANDLE)phkResult, samDesired, &ObjectAttributes); RtlFreeUnicodeString (&SubKeyString); @@ -1765,7 +1765,7 @@ RegOpenKeyExW (HKEY hKey, { OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING SubKeyString; - HKEY KeyHandle; + HANDLE KeyHandle; LONG ErrorCode; NTSTATUS Status; @@ -1793,7 +1793,7 @@ RegOpenKeyExW (HKEY hKey, OBJ_CASE_INSENSITIVE, KeyHandle, NULL); - Status = NtOpenKey (phkResult, + Status = NtOpenKey ((PHANDLE)phkResult, samDesired, &ObjectAttributes); if (!NT_SUCCESS(Status)) @@ -1891,7 +1891,7 @@ RegQueryInfoKeyW (HKEY hKey, PKEY_FULL_INFORMATION FullInfo; ULONG FullInfoSize; ULONG ClassLength; - HKEY KeyHandle; + HANDLE KeyHandle; NTSTATUS Status; LONG ErrorCode = ERROR_SUCCESS; ULONG Length; @@ -2091,12 +2091,12 @@ RegQueryMultipleValuesW (HKEY hKey, NULL, NULL, &val_list[i].ve_valuelen); - if(ErrorCode != ERROR_SUCCESS) + if (ErrorCode != ERROR_SUCCESS) { return ErrorCode; } - if(lpValueBuf != NULL && *ldwTotsize + val_list[i].ve_valuelen <= maxBytes) + if (lpValueBuf != NULL && *ldwTotsize + val_list[i].ve_valuelen <= maxBytes) { ErrorCode = RegQueryValueExW (hKey, val_list[i].ve_valuename, @@ -2140,7 +2140,7 @@ RegQueryValueExW (HKEY hKey, LONG ErrorCode = ERROR_SUCCESS; ULONG BufferSize; ULONG ResultSize; - HKEY KeyHandle; + HANDLE KeyHandle; ULONG MaxCopy = lpcbData ? *lpcbData : 0; DPRINT("hKey 0x%X lpValueName %S lpData 0x%X lpcbData %d\n", @@ -2449,7 +2449,7 @@ RegQueryValueW (HKEY hKey, { OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING SubKeyString; - HKEY KeyHandle; + HANDLE KeyHandle; HANDLE RealKey; LONG ErrorCode; BOOL CloseRealKey; @@ -2811,7 +2811,7 @@ RegSaveKeyW (HKEY hKey, UNICODE_STRING FileName; IO_STATUS_BLOCK IoStatusBlock; HANDLE FileHandle; - HKEY KeyHandle; + HANDLE KeyHandle; NTSTATUS Status; LONG ErrorCode; @@ -2886,7 +2886,7 @@ RegSetKeySecurity (HKEY hKey, SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR pSecurityDescriptor) { - HKEY KeyHandle; + HANDLE KeyHandle; LONG ErrorCode; NTSTATUS Status; @@ -3019,7 +3019,7 @@ RegSetValueExW (HKEY hKey, { UNICODE_STRING ValueName; PUNICODE_STRING pValueName; - HKEY KeyHandle; + HANDLE KeyHandle; NTSTATUS Status; LONG ErrorCode; @@ -3134,7 +3134,7 @@ RegSetValueW (HKEY hKey, { OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING SubKeyString; - HKEY KeyHandle; + HANDLE KeyHandle; HANDLE RealKey; LONG ErrorCode; BOOL CloseRealKey; diff --git a/reactos/lib/advapi32/sec/lsa.c b/reactos/lib/advapi32/sec/lsa.c index 41c31f52e64..fb5a6722aad 100644 --- a/reactos/lib/advapi32/sec/lsa.c +++ b/reactos/lib/advapi32/sec/lsa.c @@ -1,4 +1,4 @@ -/* $Id: lsa.c,v 1.10 2004/03/08 18:09:05 sedwards Exp $ +/* $Id: lsa.c,v 1.11 2004/06/17 09:07:12 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -12,28 +12,200 @@ * */ +#define NTOS_MODE_USER +#include <ntos.h> #include <windows.h> -#include <ddk/ntddk.h> #include <ntsecapi.h> + +#define NDEBUG #include <debug.h> + +#ifndef SID_REVISION /* FIXME - Winnt.h */ +#define SID_REVISION (1) /* Current revision */ +#endif + + +/* + * @unimplemented + */ +NTSTATUS STDCALL +LsaClose(LSA_HANDLE ObjectHandle) +{ + DPRINT1("(%p):LsaClose stub\n",ObjectHandle); + return 0xc0000000; +} + +/* + * @unimplemented + */ +NTSTATUS +STDCALL +LsaAddAccountRights( + LSA_HANDLE PolicyHandle, + PSID AccountSid, + PLSA_UNICODE_STRING UserRights, + ULONG CountOfRights) +{ + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +NTSTATUS +STDCALL +LsaCreateTrustedDomainEx( + LSA_HANDLE PolicyHandle, + PTRUSTED_DOMAIN_INFORMATION_EX TrustedDomainInformation, + PTRUSTED_DOMAIN_AUTH_INFORMATION AuthenticationInformation, + ACCESS_MASK DesiredAccess, + PLSA_HANDLE TrustedDomainHandle) +{ + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +NTSTATUS +STDCALL +LsaDeleteTrustedDomain( + LSA_HANDLE PolicyHandle, + PSID TrustedDomainSid) +{ + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +NTSTATUS +STDCALL +LsaEnumerateAccountRights( + LSA_HANDLE PolicyHandle, + PSID AccountSid, + PLSA_UNICODE_STRING *UserRights, + PULONG CountOfRights) +{ + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +NTSTATUS +STDCALL +LsaEnumerateAccountsWithUserRight( + LSA_HANDLE PolicyHandle, + OPTIONAL PLSA_UNICODE_STRING UserRights, + PVOID *EnumerationBuffer, + PULONG CountReturned) +{ + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +NTSTATUS +STDCALL +LsaEnumerateTrustedDomains( + LSA_HANDLE PolicyHandle, + PLSA_ENUMERATION_HANDLE EnumerationContext, + PVOID *Buffer, + ULONG PreferedMaximumLength, + PULONG CountReturned) +{ + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +NTSTATUS +STDCALL +LsaEnumerateTrustedDomainsEx( + LSA_HANDLE PolicyHandle, + PLSA_ENUMERATION_HANDLE EnumerationContext, + PVOID *Buffer, + ULONG PreferedMaximumLength, + PULONG CountReturned) +{ + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @implemented + */ +NTSTATUS STDCALL +LsaFreeMemory(PVOID Buffer) +{ + return RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer); +} + +/* + * @unimplemented + */ +NTSTATUS +STDCALL +LsaLookupNames( + LSA_HANDLE PolicyHandle, + ULONG Count, + PLSA_UNICODE_STRING Names, + PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains, + PLSA_TRANSLATED_SID *Sids) +{ + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +NTSTATUS +STDCALL +LsaLookupNames2( + LSA_HANDLE PolicyHandle, + ULONG Flags, + ULONG Count, + PLSA_UNICODE_STRING Names, + PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains, + PLSA_TRANSLATED_SID2 *Sids) +{ + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +NTSTATUS +STDCALL +LsaLookupSids( + LSA_HANDLE PolicyHandle, + ULONG Count, + PSID *Sids, + PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains, + PLSA_TRANSLATED_NAME *Names) +{ + return STATUS_NOT_IMPLEMENTED; +} + /****************************************************************************** - * LsaNtStatusToWinError [ADVAPI32.@] + * LsaNtStatusToWinError * * PARAMS * Status [I] * * @implemented */ -ULONG WINAPI +ULONG STDCALL LsaNtStatusToWinError(NTSTATUS Status) { - return RtlNtStatusToDosError(Status); + return RtlNtStatusToDosError(Status); } - /****************************************************************************** - * LsaOpenPolicy [ADVAPI32.@] + * LsaOpenPolicy * * PARAMS * x1 [] @@ -44,30 +216,69 @@ LsaNtStatusToWinError(NTSTATUS Status) * @unimplemented */ NTSTATUS STDCALL -LsaOpenPolicy (PLSA_UNICODE_STRING lsaucs, - PLSA_OBJECT_ATTRIBUTES lsaoa, - ACCESS_MASK access, - PLSA_HANDLE lsah) +LsaOpenPolicy(PLSA_UNICODE_STRING lsaucs, + PLSA_OBJECT_ATTRIBUTES lsaoa, + ACCESS_MASK access, + PLSA_HANDLE PolicyHandle) { DPRINT1("LsaOpenPolicy - stub\n"); return STATUS_SUCCESS; } -#ifndef SID_REVISION /* FIXME - Winnt.h */ -#define SID_REVISION (1) /* Current revision */ -#endif - /* * @unimplemented */ NTSTATUS STDCALL -LsaQueryInformationPolicy(LSA_HANDLE lsah,POLICY_INFORMATION_CLASS pic,PVOID* Buffer) +LsaOpenTrustedDomainByName( + LSA_HANDLE PolicyHandle, + PLSA_UNICODE_STRING TrustedDomainName, + ACCESS_MASK DesiredAccess, + PLSA_HANDLE TrustedDomainHandle) { - DPRINT1("(%p,0x%08x,%p):LsaQueryInformationPolicy stub\n", - lsah, pic, Buffer); + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +NTSTATUS +STDCALL +LsaQueryDomainInformationPolicy( + LSA_HANDLE PolicyHandle, + POLICY_DOMAIN_INFORMATION_CLASS pic, + PVOID *Buffer) +{ + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +NTSTATUS +STDCALL +LsaQueryForestTrustInformation( + LSA_HANDLE PolicyHandle, + PLSA_UNICODE_STRING TrustedDomainName, + PLSA_FOREST_TRUST_INFORMATION * ForestTrustInfo) +{ + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +LsaQueryInformationPolicy(LSA_HANDLE PolicyHandle, + POLICY_INFORMATION_CLASS pic, + PVOID *Buffer) +{ + DPRINT1("(%p,0x%08x,%p):LsaQueryInformationPolicy stub\n", + PolicyHandle, pic, Buffer); + + if (!Buffer) + return FALSE; - if(!Buffer) return FALSE; switch (pic) { case PolicyAuditEventsInformation: /* 2 */ @@ -129,15 +340,16 @@ LsaQueryInformationPolicy(LSA_HANDLE lsah,POLICY_INFORMATION_CLASS pic,PVOID* Bu *Buffer = xdi; } break; - case PolicyAuditLogInformation: - case PolicyPdAccountInformation: - case PolicyLsaServerRoleInformation: - case PolicyReplicaSourceInformation: - case PolicyDefaultQuotaInformation: - case PolicyModificationInformation: - case PolicyAuditFullSetInformation: - case PolicyAuditFullQueryInformation: - case PolicyDnsDomainInformation: + case PolicyAuditLogInformation: + case PolicyPdAccountInformation: + case PolicyLsaServerRoleInformation: + case PolicyReplicaSourceInformation: + case PolicyDefaultQuotaInformation: + case PolicyModificationInformation: + case PolicyAuditFullSetInformation: + case PolicyAuditFullQueryInformation: + case PolicyDnsDomainInformation: + case PolicyEfsInformation: { DPRINT1("category not implemented\n"); return FALSE; @@ -146,236 +358,18 @@ LsaQueryInformationPolicy(LSA_HANDLE lsah,POLICY_INFORMATION_CLASS pic,PVOID* Bu return TRUE; } -/* - * @implemented - */ -NTSTATUS STDCALL -LsaFreeMemory (PVOID pv) -{ - return RtlFreeHeap(RtlGetProcessHeap(), 0, pv); -} - -/* - * @unimplemented - */ -NTSTATUS STDCALL -LsaClose(LSA_HANDLE ObjectHandle) -{ - DPRINT1("(%p):LsaClose stub\n",ObjectHandle); - return 0xc0000000; -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -LsaAddAccountRights( - LSA_HANDLE lsah, - PSID AccountSid, - PLSA_UNICODE_STRING UserRights, - ULONG CountOfRights - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -LsaCreateTrustedDomainEx( - LSA_HANDLE lsah, - PTRUSTED_DOMAIN_INFORMATION_EX TrustedDomainInformation, - PTRUSTED_DOMAIN_AUTH_INFORMATION AuthenticationInformation, - ACCESS_MASK DesiredAccess, - PLSA_HANDLE TrustedDomainHandle - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -LsaDeleteTrustedDomain( - LSA_HANDLE lsah, - PSID TrustedDomainSid - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -LsaEnumerateAccountRights( - LSA_HANDLE lsah, - PSID AccountSid, - PLSA_UNICODE_STRING *UserRights, - PULONG CountOfRights - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -LsaEnumerateAccountsWithUserRight( - LSA_HANDLE lsah, - OPTIONAL PLSA_UNICODE_STRING UserRights, - PVOID *EnumerationBuffer, - PULONG CountReturned - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -LsaEnumerateTrustedDomains( - LSA_HANDLE lsah, - PLSA_ENUMERATION_HANDLE EnumerationContext, - PVOID *Buffer, - ULONG PreferedMaximumLength, - PULONG CountReturned - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -LsaEnumerateTrustedDomainsEx( - LSA_HANDLE lsah, - PLSA_ENUMERATION_HANDLE EnumerationContext, - PVOID *Buffer, - ULONG PreferedMaximumLength, - PULONG CountReturned - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -LsaLookupNames( - LSA_HANDLE lsah, - ULONG Count, - PLSA_UNICODE_STRING Names, - PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains, - PLSA_TRANSLATED_SID *Sids - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -LsaLookupNames2( - LSA_HANDLE lsah, - ULONG Flags, - ULONG Count, - PLSA_UNICODE_STRING Names, - PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains, - PLSA_TRANSLATED_SID2 *Sids - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -LsaLookupSids( - LSA_HANDLE lsah, - ULONG Count, - PSID *Sids, - PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains, - PLSA_TRANSLATED_NAME *Names - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -LsaOpenTrustedDomainByName( - LSA_HANDLE lsah, - PLSA_UNICODE_STRING TrustedDomainName, - ACCESS_MASK DesiredAccess, - PLSA_HANDLE TrustedDomainHandle - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -LsaQueryDomainInformationPolicy( - LSA_HANDLE lsah, - POLICY_DOMAIN_INFORMATION_CLASS pic, - PVOID *Buffer - ) -{ - return(FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -LsaQueryForestTrustInformation( - LSA_HANDLE lsah, - PLSA_UNICODE_STRING TrustedDomainName, - PLSA_FOREST_TRUST_INFORMATION * ForestTrustInfo - ) -{ - return(FALSE); -} - /* * @unimplemented */ NTSTATUS STDCALL LsaQueryTrustedDomainInfoByName( - LSA_HANDLE lsah, + LSA_HANDLE PolicyHandle, PLSA_UNICODE_STRING TrustedDomainName, TRUSTED_INFORMATION_CLASS pic, - PVOID *Buffer - ) + PVOID *Buffer) { - return(FALSE); + return STATUS_NOT_IMPLEMENTED; } /* @@ -384,13 +378,12 @@ LsaQueryTrustedDomainInfoByName( NTSTATUS STDCALL LsaQueryTrustedDomainInfo( - LSA_HANDLE lsah, + LSA_HANDLE PolicyHandle, PSID TrustedDomainSid, TRUSTED_INFORMATION_CLASS pic, - PVOID *Buffer - ) + PVOID *Buffer) { - return(FALSE); + return STATUS_NOT_IMPLEMENTED; } /* @@ -399,14 +392,13 @@ LsaQueryTrustedDomainInfo( NTSTATUS STDCALL LsaRemoveAccountRights( - LSA_HANDLE lsah, + LSA_HANDLE PolicyHandle, PSID AccountSid, - BOOL AllRights, + BOOLEAN AllRights, PLSA_UNICODE_STRING UserRights, - ULONG CountOfRights - ) + ULONG CountOfRights) { - return(FALSE); + return STATUS_NOT_IMPLEMENTED; } /* @@ -415,12 +407,11 @@ LsaRemoveAccountRights( NTSTATUS STDCALL LsaRetrievePrivateData( - LSA_HANDLE lsah, + LSA_HANDLE PolicyHandle, PLSA_UNICODE_STRING KeyName, - PLSA_UNICODE_STRING * PrivateData - ) + PLSA_UNICODE_STRING *PrivateData) { - return(FALSE); + return STATUS_NOT_IMPLEMENTED; } /* @@ -429,12 +420,11 @@ LsaRetrievePrivateData( NTSTATUS STDCALL LsaSetDomainInformationPolicy( - LSA_HANDLE lsah, + LSA_HANDLE PolicyHandle, POLICY_DOMAIN_INFORMATION_CLASS pic, - PVOID Buffer - ) + PVOID Buffer) { - return(FALSE); + return STATUS_NOT_IMPLEMENTED; } /* @@ -443,12 +433,11 @@ LsaSetDomainInformationPolicy( NTSTATUS STDCALL LsaSetInformationPolicy( - LSA_HANDLE lsah, + LSA_HANDLE PolicyHandle, POLICY_INFORMATION_CLASS pic, - PVOID Buffer - ) + PVOID Buffer) { - return(FALSE); + return STATUS_NOT_IMPLEMENTED; } /* @@ -457,14 +446,13 @@ LsaSetInformationPolicy( NTSTATUS STDCALL LsaSetForestTrustInformation( - LSA_HANDLE lsah, + LSA_HANDLE PolicyHandle, PLSA_UNICODE_STRING TrustedDomainName, PLSA_FOREST_TRUST_INFORMATION ForestTrustInfo, BOOL CheckOnly, - PLSA_FOREST_TRUST_COLLISION_INFORMATION * CollisionInfo - ) + PLSA_FOREST_TRUST_COLLISION_INFORMATION *CollisionInfo) { - return(FALSE); + return STATUS_NOT_IMPLEMENTED; } /* @@ -473,13 +461,12 @@ LsaSetForestTrustInformation( NTSTATUS STDCALL LsaSetTrustedDomainInfoByName( - LSA_HANDLE lsah, + LSA_HANDLE PolicyHandle, PLSA_UNICODE_STRING TrustedDomainName, TRUSTED_INFORMATION_CLASS pic, - PVOID Buffer - ) + PVOID Buffer) { - return(FALSE); + return STATUS_NOT_IMPLEMENTED; } /* @@ -488,13 +475,12 @@ LsaSetTrustedDomainInfoByName( NTSTATUS STDCALL LsaSetTrustedDomainInformation( - LSA_HANDLE lsah, + LSA_HANDLE PolicyHandle, PSID TrustedDomainSid, TRUSTED_INFORMATION_CLASS pic, - PVOID Buffer - ) + PVOID Buffer) { - return(FALSE); + return STATUS_NOT_IMPLEMENTED; } /* @@ -503,10 +489,9 @@ LsaSetTrustedDomainInformation( NTSTATUS STDCALL LsaStorePrivateData( - LSA_HANDLE lsah, + LSA_HANDLE PolicyHandle, PLSA_UNICODE_STRING KeyName, - PLSA_UNICODE_STRING PrivateData - ) + PLSA_UNICODE_STRING PrivateData) { - return(FALSE); + return STATUS_NOT_IMPLEMENTED; } diff --git a/reactos/lib/advapi32/token/privilege.c b/reactos/lib/advapi32/token/privilege.c index 0a904961a1d..3f256ca1a97 100644 --- a/reactos/lib/advapi32/token/privilege.c +++ b/reactos/lib/advapi32/token/privilege.c @@ -1,4 +1,4 @@ -/* $Id: privilege.c,v 1.7 2004/03/25 11:30:07 ekohl Exp $ +/* $Id: privilege.c,v 1.8 2004/06/17 09:07:12 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -9,8 +9,9 @@ * 20010317 ea stubs */ +#define NTOS_MODE_USER +#include <ntos.h> #include <windows.h> -#include <ddk/ntddk.h> /********************************************************************** diff --git a/reactos/w32api/include/ntsecapi.h b/reactos/w32api/include/ntsecapi.h index 559087292c9..7a412bffd97 100644 --- a/reactos/w32api/include/ntsecapi.h +++ b/reactos/w32api/include/ntsecapi.h @@ -247,6 +247,17 @@ typedef enum _TRUSTED_INFORMATION_CLASS { TrustedDomainAuthInformation, TrustedDomainFullInformation } TRUSTED_INFORMATION_CLASS, *PTRUSTED_INFORMATION_CLASS; +typedef enum _LSA_FOREST_TRUST_RECORD_TYPE { + ForestTrustTopLevelName, + ForestTrustTopLevelNameEx, + ForestTrustDomainInfo, + ForestTrustRecordTypeLast = ForestTrustDomainInfo +} LSA_FOREST_TRUST_RECORD_TYPE; +typedef enum _LSA_FOREST_TRUST_COLLISION_RECORD_TYPE { + CollisionTdo, + CollisionXref, + CollisionOther +} LSA_FOREST_TRUST_COLLISION_RECORD_TYPE; typedef struct _DOMAIN_PASSWORD_INFORMATION { USHORT MinPasswordLength; USHORT PasswordHistoryLength; @@ -270,6 +281,39 @@ typedef struct _LSA_OBJECT_ATTRIBUTES { } OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES; #endif typedef OBJECT_ATTRIBUTES LSA_OBJECT_ATTRIBUTES, *PLSA_OBJECT_ATTRIBUTES; +typedef struct _LSA_FOREST_TRUST_DOMAIN_INFO { + PSID Sid; + LSA_UNICODE_STRING DnsName; + LSA_UNICODE_STRING NetbiosName; +} LSA_FOREST_TRUST_DOMAIN_INFO, *PLSA_FOREST_TRUST_DOMAIN_INFO; +typedef struct _LSA_FOREST_TRUST_BINARY_DATA { + ULONG Length; + PUCHAR Buffer; +} LSA_FOREST_TRUST_BINARY_DATA, *PLSA_FOREST_TRUST_BINARY_DATA; +typedef struct _LSA_FOREST_TRUST_RECORD { + ULONG Flags; + LSA_FOREST_TRUST_RECORD_TYPE ForestTrustType; + LARGE_INTEGER Time; + union { + LSA_UNICODE_STRING TopLevelName; + LSA_FOREST_TRUST_DOMAIN_INFO DomainInfo; + LSA_FOREST_TRUST_BINARY_DATA Data; + } ForestTrustData; +} LSA_FOREST_TRUST_RECORD, *PLSA_FOREST_TRUST_RECORD; +typedef struct _LSA_FOREST_TRUST_INFORMATION { + ULONG RecordCount; + PLSA_FOREST_TRUST_RECORD *Entries; +} LSA_FOREST_TRUST_INFORMATION, *PLSA_FOREST_TRUST_INFORMATION; +typedef struct _LSA_FOREST_TRUST_COLLISION_RECORD { + ULONG Index; + LSA_FOREST_TRUST_COLLISION_RECORD_TYPE Type; + ULONG Flags; + LSA_UNICODE_STRING Name; +} LSA_FOREST_TRUST_COLLISION_RECORD, *PLSA_FOREST_TRUST_COLLISION_RECORD; +typedef struct _LSA_FOREST_TRUST_COLLISION_INFORMATION { + ULONG RecordCount; + PLSA_FOREST_TRUST_COLLISION_RECORD *Entries; +} LSA_FOREST_TRUST_COLLISION_INFORMATION, *PLSA_FOREST_TRUST_COLLISION_INFORMATION; typedef struct _LSA_TRUST_INFORMATION { LSA_UNICODE_STRING Name; PSID Sid; @@ -283,6 +327,12 @@ typedef struct _LSA_TRANSLATED_SID { ULONG RelativeId; LONG DomainIndex; } LSA_TRANSLATED_SID, *PLSA_TRANSLATED_SID; +typedef struct _LSA_TRANSLATED_SID2 { + SID_NAME_USE Use; + PSID Sid; + LONG DomainIndex; + ULONG Flags; +} LSA_TRANSLATED_SID2, *PLSA_TRANSLATED_SID2; typedef struct _LSA_TRANSLATED_NAME { SID_NAME_USE Use; LSA_UNICODE_STRING Name; @@ -562,7 +612,7 @@ NTSTATUS NTAPI LsaEnumerateAccountsWithUserRight(LSA_HANDLE,PLSA_UNICODE_STRING, NTSTATUS NTAPI LsaEnumerateTrustedDomains(LSA_HANDLE,PLSA_ENUMERATION_HANDLE, PVOID*,ULONG,PULONG); NTSTATUS NTAPI LsaEnumerateTrustedDomainsEx(LSA_HANDLE,PLSA_ENUMERATION_HANDLE, - TRUSTED_INFORMATION_CLASS,PVOID*,ULONG,PULONG); + PVOID*,ULONG,PULONG); NTSTATUS NTAPI LsaFreeMemory(PVOID); NTSTATUS NTAPI LsaFreeReturnBuffer(PVOID); NTSTATUS NTAPI LsaLogonUser(HANDLE,PLSA_STRING,SECURITY_LOGON_TYPE,ULONG,PVOID, From c792e5b04c951da32a7dfa4b6a335867515b0df3 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Thu, 17 Jun 2004 10:49:51 +0000 Subject: [PATCH 1406/1463] Fix typos. svn path=/trunk/; revision=9696 --- reactos/subsys/system/usetup/usetup.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/system/usetup/usetup.c b/reactos/subsys/system/usetup/usetup.c index 65970f159d1..7536ae6fa8a 100644 --- a/reactos/subsys/system/usetup/usetup.c +++ b/reactos/subsys/system/usetup/usetup.c @@ -942,7 +942,7 @@ DeviceSettingsPage(PINPUT_RECORD Ir) SetTextXY(25, 14, GetGenericListEntry(LayoutList)->Text); SetTextXY(25, 15, GetGenericListEntry(PointerList)->Text); - SetTextXY(25, 17, "Accept these device setings"); + SetTextXY(25, 17, "Accept these device settings"); InvertTextXY (24, Line, 48, 1); @@ -950,7 +950,7 @@ DeviceSettingsPage(PINPUT_RECORD Ir) SetTextXY(6, 21, "to select an entry. Then press the ENTER key to select alternative"); SetTextXY(6, 22, "settings."); - SetTextXY(6, 24, "When all settings are correct, select \"Accept these device setings\""); + SetTextXY(6, 24, "When all settings are correct, select \"Accept these device settings\""); SetTextXY(6, 25, "and press ENTER."); SetStatusText(" ENTER = Continue F3 = Quit"); From 2d902a8146b2d67cf7b153e94e3bc51f40f32c58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Thu, 17 Jun 2004 13:28:53 +0000 Subject: [PATCH 1407/1463] Remove obsolete ide and (old) floppy drivers svn path=/trunk/; revision=9698 --- reactos/drivers/dd/floppy/.cvsignore | 8 - reactos/drivers/dd/floppy/Makefile | 20 - reactos/drivers/dd/floppy/dpc.c | 279 ---- reactos/drivers/dd/floppy/floppy.c | 609 ------- reactos/drivers/dd/floppy/floppy.h | 258 --- reactos/drivers/dd/floppy/floppy.rc | 38 - reactos/drivers/dd/floppy/isr.c | 210 --- reactos/drivers/dd/ide/.cvsignore | 8 - reactos/drivers/dd/ide/ide.c | 2268 -------------------------- reactos/drivers/dd/ide/ide.h | 256 --- reactos/drivers/dd/ide/ide.rc | 39 - reactos/drivers/dd/ide/makefile | 19 - reactos/drivers/dd/ide/partitio.h | 41 - 13 files changed, 4053 deletions(-) delete mode 100644 reactos/drivers/dd/floppy/.cvsignore delete mode 100644 reactos/drivers/dd/floppy/Makefile delete mode 100644 reactos/drivers/dd/floppy/dpc.c delete mode 100644 reactos/drivers/dd/floppy/floppy.c delete mode 100644 reactos/drivers/dd/floppy/floppy.h delete mode 100644 reactos/drivers/dd/floppy/floppy.rc delete mode 100644 reactos/drivers/dd/floppy/isr.c delete mode 100644 reactos/drivers/dd/ide/.cvsignore delete mode 100644 reactos/drivers/dd/ide/ide.c delete mode 100644 reactos/drivers/dd/ide/ide.h delete mode 100644 reactos/drivers/dd/ide/ide.rc delete mode 100644 reactos/drivers/dd/ide/makefile delete mode 100644 reactos/drivers/dd/ide/partitio.h diff --git a/reactos/drivers/dd/floppy/.cvsignore b/reactos/drivers/dd/floppy/.cvsignore deleted file mode 100644 index 5f6c85b86cb..00000000000 --- a/reactos/drivers/dd/floppy/.cvsignore +++ /dev/null @@ -1,8 +0,0 @@ -*.tmp -*.exp -*.coff -*.d -*.o -*.sym -*.sys -*.map diff --git a/reactos/drivers/dd/floppy/Makefile b/reactos/drivers/dd/floppy/Makefile deleted file mode 100644 index 954a4ad0484..00000000000 --- a/reactos/drivers/dd/floppy/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# $Id: Makefile,v 1.12 2003/11/13 14:22:03 ekohl Exp $ - -PATH_TO_TOP = ../../.. - -TARGET_BOOTSTRAP = yes - -TARGET_TYPE = driver - -TARGET_NAME = floppy - -TARGET_OBJECTS = \ - dpc.o \ - floppy.o \ - isr.o - -TARGET_CFLAGS = -Wall -Werror - -include $(PATH_TO_TOP)/rules.mak - -include $(TOOLS_PATH)/helper.mk diff --git a/reactos/drivers/dd/floppy/dpc.c b/reactos/drivers/dd/floppy/dpc.c deleted file mode 100644 index e0e58ab40cc..00000000000 --- a/reactos/drivers/dd/floppy/dpc.c +++ /dev/null @@ -1,279 +0,0 @@ -/**************************************************************************** - * Defered procedure calls for floppy disk driver, reactos project, created * - * by Phillip Susi on 2/25/2001. This software is published under the GNU * - * general public license, see the README file for more details * - ***************************************************************************/ - -#include <ddk/ntddk.h> -#define NDEBUG -#include <debug.h> -#include "floppy.h" - - -VOID STDCALL -FloppyDpc (PKDPC Dpc, - PDEVICE_OBJECT DeviceObject, - PIRP Irp, - PVOID Context) -{ - PCONTROLLER_OBJECT Controller; - PFLOPPY_CONTROLLER_EXTENSION ControllerExtension; - - Controller = (PCONTROLLER_OBJECT)Context; - ControllerExtension = (PFLOPPY_CONTROLLER_EXTENSION)Controller->ControllerExtension; - - ControllerExtension->DpcState (Dpc, - DeviceObject, - Irp, - Context); -} - - -VOID STDCALL -FloppyDpcDetect (PKDPC Dpc, - PDEVICE_OBJECT DeviceObject, - PIRP Irp, - PVOID Context) -{ - PCONTROLLER_OBJECT Controller; - PFLOPPY_CONTROLLER_EXTENSION ControllerExtension; - - Controller = (PCONTROLLER_OBJECT)Context; - ControllerExtension = (PFLOPPY_CONTROLLER_EXTENSION)Controller->ControllerExtension; - - KeSetEvent (&ControllerExtension->Event, - 0, - FALSE); -} - - -VOID STDCALL -FloppyDpcFailIrp (PKDPC Dpc, - PDEVICE_OBJECT DeviceObject, - PIRP Irp, - PVOID Context) -{ - Irp->IoStatus.Status = STATUS_DEVICE_NOT_READY; - Irp->IoStatus.Information = 0; - CHECKPOINT; - IoCompleteRequest (Irp, - IO_NO_INCREMENT); -} - - -VOID STDCALL -FloppyMotorSpindownDpc (PKDPC Dpc, - PVOID Context, - PVOID Arg1, - PVOID Arg2) -{ - PCONTROLLER_OBJECT Controller; - PFLOPPY_CONTROLLER_EXTENSION ControllerExtension; - - Controller = (PCONTROLLER_OBJECT)Context; - ControllerExtension = (PFLOPPY_CONTROLLER_EXTENSION)Controller->ControllerExtension; - - /* queue call to turn off motor */ - IoAllocateController (Controller, - ControllerExtension->Device, - FloppyExecuteSpindown, - ControllerExtension); -} - - -VOID STDCALL -FloppyMotorSpinupDpc (PKDPC Dpc, - PVOID Context, - PVOID Arg1, - PVOID Arg2) -{ - PCONTROLLER_OBJECT Controller; - PFLOPPY_CONTROLLER_EXTENSION ControllerExtension; - PFLOPPY_DEVICE_EXTENSION DeviceExtension; - LARGE_INTEGER Timeout; - - Controller = (PCONTROLLER_OBJECT)Context; - ControllerExtension = (PFLOPPY_CONTROLLER_EXTENSION)Controller->ControllerExtension; - DeviceExtension = (PFLOPPY_DEVICE_EXTENSION)ControllerExtension->Device->DeviceExtension; - Timeout.QuadPart = FLOPPY_MOTOR_SPINDOWN_TIME; - - // Motor has had time to spin up, mark motor as spun up and restart IRP - // don't forget to set the spindown timer - KeSetTimer (&ControllerExtension->SpinupTimer, - Timeout, - &ControllerExtension->MotorSpindownDpc); - DPRINT ("Motor spun up, retrying operation\n"); - - ControllerExtension->MotorOn = DeviceExtension->DriveSelect; - - IoFreeController (Controller); - IoAllocateController (Controller, - ControllerExtension->Device, - FloppyExecuteReadWrite, - ControllerExtension->Irp); -} - - -VOID STDCALL -FloppySeekDpc (PKDPC Dpc, - PDEVICE_OBJECT DeviceObject, - PIRP Irp, - PVOID Context) -{ - PFLOPPY_DEVICE_EXTENSION DeviceExtension; - PFLOPPY_CONTROLLER_EXTENSION ControllerExtension; - - DeviceExtension = (PFLOPPY_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - ControllerExtension = (PFLOPPY_CONTROLLER_EXTENSION)DeviceExtension->Controller->ControllerExtension; - - /* If the seek failed, fail the IRP */ - if (ControllerExtension->St0 & FLOPPY_ST0_GDMASK) - { - ControllerExtension->Irp->IoStatus.Status = STATUS_DISK_CORRUPT_ERROR; - ControllerExtension->Irp->IoStatus.Information = 0; - DPRINT ("Failing IRP: St0 = %2x, St1 = %2x, St2 = %2x\n", - ControllerExtension->St0, - ControllerExtension->St1, - ControllerExtension->St2); - for (;;); - IoCompleteRequest (ControllerExtension->Irp, - IO_NO_INCREMENT); - IoFreeController (DeviceExtension->Controller); - return; - } - - KeStallExecutionProcessor (10000); - - DPRINT ("Seek completed, now on cyl %2x\n", DeviceExtension->Cyl); - - /* Now that we are on the right cyl, restart the read */ - if (FloppyExecuteReadWrite (DeviceObject, - ControllerExtension->Irp, - ControllerExtension->MapRegisterBase, - ControllerExtension->Irp) == DeallocateObject) - { - IoFreeController (DeviceExtension->Controller); - } -} - - -VOID STDCALL -FloppyDpcReadWrite (PKDPC Dpc, - PDEVICE_OBJECT DeviceObject, - PIRP Irp, - PVOID Context) -{ - PCONTROLLER_OBJECT Controller; - PFLOPPY_CONTROLLER_EXTENSION ControllerExtension; - PFLOPPY_DEVICE_EXTENSION DeviceExtension; - ULONG SectorSize; - PIO_STACK_LOCATION Stack; - BOOLEAN WriteToDevice; - - - Controller = (PCONTROLLER_OBJECT)Context; - ControllerExtension = (PFLOPPY_CONTROLLER_EXTENSION)Controller->ControllerExtension; - DeviceExtension = (PFLOPPY_DEVICE_EXTENSION)ControllerExtension->Device->DeviceExtension; - - Irp = ControllerExtension->Irp; - - Stack = IoGetCurrentIrpStackLocation (Irp); - - SectorSize = 128 << ControllerExtension->SectorSizeCode; - - WriteToDevice = Stack->MajorFunction == IRP_MJ_WRITE ? TRUE : FALSE; - - /* If the IO failed, fail the IRP */ - if (ControllerExtension->St0 & FLOPPY_ST0_GDMASK) - { - Irp->IoStatus.Status = STATUS_DISK_CORRUPT_ERROR; - Irp->IoStatus.Information = 0; - DPRINT( "Failing IRP: St0 = %2x, St1 = %2x, St2 = %2x\n", - ControllerExtension->St0, - ControllerExtension->St1, - ControllerExtension->St2 ); - for(;;); - IoCompleteRequest (Irp, - IO_NO_INCREMENT); - IoFreeController (Controller); - return; - } - - /* Don't forget to flush the buffers */ - IoFlushAdapterBuffers( ControllerExtension->AdapterObject, - ControllerExtension->Irp->MdlAddress, - ControllerExtension->MapRegisterBase, - ControllerExtension->Irp->Tail.Overlay.DriverContext[0], - ControllerExtension->TransferLength, - WriteToDevice); - DPRINT ("St0 = %2x St1 = %2x St2 = %2x\n", - ControllerExtension->St0, - ControllerExtension->St1, - ControllerExtension->St2); - - /* Update buffer info */ - Stack->Parameters.Read.ByteOffset.u.LowPart += ControllerExtension->TransferLength; - Stack->Parameters.Read.Length -= ControllerExtension->TransferLength; - - /* drivercontext used for current va */ - ControllerExtension->Irp->Tail.Overlay.DriverContext[0] = (PVOID) ((ULONG) ControllerExtension->Irp->Tail.Overlay.DriverContext[0] - + ControllerExtension->TransferLength); - DPRINT ("First ulong: %x\n", *((PULONG)ControllerExtension->MapRegisterBase)) - - /* If there is more IO to be done, restart execute routine to issue next read */ - if (Stack->Parameters.Read.Length != 0) - { - if (FloppyExecuteReadWrite (DeviceObject, - Irp, - ControllerExtension->MapRegisterBase, - Irp ) == DeallocateObject) - { - IoFreeController (Controller); - } - } - else - { - /* Otherwise, complete the IRP */ - IoCompleteRequest (Irp, - IO_NO_INCREMENT); - IoFreeController (Controller); - } -} - - -VOID STDCALL -FloppyDpcDetectMedia (PKDPC Dpc, - PDEVICE_OBJECT DeviceObject, - PIRP Irp, - PVOID Context) -{ - PCONTROLLER_OBJECT Controller; - PFLOPPY_CONTROLLER_EXTENSION ControllerExtension; - - Controller = (PCONTROLLER_OBJECT)Context; - ControllerExtension = (PFLOPPY_CONTROLLER_EXTENSION)Controller->ControllerExtension; - - /* If the read ID failed, fail the IRP */ - if (ControllerExtension->St1 != 0) - { - DPRINT1 ("Read ID failed: ST1 = %2x\n", ControllerExtension->St1); - IoFreeController (Controller); - Irp->IoStatus.Information = 0; - Irp->IoStatus.Status = STATUS_DEVICE_NOT_READY; - IoCompleteRequest (Irp, - IO_NO_INCREMENT); - return; - } - - /* Set media type, and restart the IRP from the beginning */ - ((PFLOPPY_DEVICE_EXTENSION)ControllerExtension->Device->DeviceExtension)->MediaType = 0; - DPRINT ("Media detected, restarting IRP\n"); - - /* Don't forget to free the controller so that the now queued routine may execute */ - IoFreeController (Controller); - - IoAllocateController (Controller, - DeviceObject, - FloppyExecuteReadWrite, - Irp); -} diff --git a/reactos/drivers/dd/floppy/floppy.c b/reactos/drivers/dd/floppy/floppy.c deleted file mode 100644 index 17ca0f6b2be..00000000000 --- a/reactos/drivers/dd/floppy/floppy.c +++ /dev/null @@ -1,609 +0,0 @@ -/* - * FLOPPY.C - NEC-765/8272A floppy device driver - * written by Rex Jolliff - * with help from various other sources, including but not limited to: - * Art Baker's NT Device Driver Book, Linux Source, and the internet. - * - * Modification History: - * 08/19/98 RJJ Created. - * 01/31/01 PJS Heavy rewrite, most of code thrown out - * - * To do: - * FIXME: get it working - * FIXME: add support for DMA hardware - * FIXME: should add support for floppy tape/zip devices - */ - -#include <ddk/ntddk.h> - -#include "floppy.h" -#define NDEBUG -#include <debug.h> -#include <rosrtl/string.h> - -FLOPPY_CONTROLLER_PARAMETERS ControllerParameters[FLOPPY_MAX_CONTROLLERS] = -{ - {0x03f0, 6, 2, Latched} - // {0x0370, 6, 6, Latched} -}; - -const FLOPPY_MEDIA_TYPE MediaTypes[] = { - { 0x02, 80, 2, 18, 512 }, - { 0, 0, 0, 0, 0 } }; - -static BOOLEAN -FloppyCreateController(PDRIVER_OBJECT DriverObject, - PFLOPPY_CONTROLLER_PARAMETERS ControllerParameters, - int Index) -{ - PCONTROLLER_OBJECT ControllerObject; - PFLOPPY_CONTROLLER_EXTENSION ControllerExtension; - PFLOPPY_DEVICE_EXTENSION DeviceExtension; - UNICODE_STRING DeviceName; - NTSTATUS Status; - PDEVICE_OBJECT DeviceObject; -// PCONFIGURATION_INFORMATION ConfigInfo; - LARGE_INTEGER Timeout; -// BYTE Byte; -// int c; - PCONFIGURATION_INFORMATION Config; - DEVICE_DESCRIPTION DeviceDescription; - ULONG MaxMapRegs; - ULONG MappedIrq; - KIRQL Dirql; - KAFFINITY Affinity; - KIRQL oldIrql; - - /* FIXME: Register port ranges with HAL */ - MappedIrq = HalGetInterruptVector(Isa, - 0, - ControllerParameters->Vector, - ControllerParameters->Vector, - &Dirql, - &Affinity); - - /* Create controller object for FDC */ - ControllerObject = IoCreateController(sizeof(FLOPPY_CONTROLLER_EXTENSION)); - if (ControllerObject == NULL) - { - DPRINT("Could not create controller object for controller %d\n", - Index); - return FALSE; - } - - /* FIXME: fill out controller data */ - ControllerExtension = (PFLOPPY_CONTROLLER_EXTENSION) - ControllerObject->ControllerExtension; - ControllerExtension->Number = Index; - ControllerExtension->PortBase = ControllerParameters->PortBase; - ControllerExtension->Vector = MappedIrq; - KeInitializeEvent( &ControllerExtension->Event, SynchronizationEvent, FALSE ); - ControllerExtension->Device = 0; // no active device - ControllerExtension->Irp = 0; // no active IRP - /* Initialize the spin lock in the controller extension */ - KeInitializeSpinLock(&ControllerExtension->SpinLock); - ControllerExtension->IsrState = FloppyIsrDetect; - ControllerExtension->DpcState = FloppyDpcDetect; - - /* Register an interrupt handler for this controller */ - Status = IoConnectInterrupt(&ControllerExtension->Interrupt, - FloppyIsr, - ControllerObject, - &ControllerExtension->SpinLock, - MappedIrq, - Dirql, - Dirql, - ControllerParameters->InterruptMode, - FALSE, - Affinity, - FALSE); - if (!NT_SUCCESS(Status)) - { - DPRINT("Could not Connect Interrupt %d\n", - ControllerExtension->Vector); - goto controllercleanup; - } - - - /* setup DMA stuff for controller */ - DeviceDescription.Version = DEVICE_DESCRIPTION_VERSION; - DeviceDescription.Master = FALSE; - DeviceDescription.ScatterGather = FALSE; - DeviceDescription.AutoInitialize = FALSE; - DeviceDescription.Dma32BitAddresses = FALSE; - DeviceDescription.DmaChannel = ControllerParameters->DmaChannel; - DeviceDescription.InterfaceType = Isa; - // DeviceDescription.DmaWidth = Width8Bits; - ControllerExtension->AdapterObject = HalGetAdapter( &DeviceDescription, &MaxMapRegs ); - if( ControllerExtension->AdapterObject == NULL ) - { - DPRINT1( "Could not get adapter object\n" ); - goto interruptcleanup; - } - -#if 0 - /* Check for each possible drive and create devices for them */ - for (DriveIdx = 0; DriveIdx < FLOPPY_MAX_DRIVES; DriveIdx++) - { - /* FIXME: try to identify the drive */ - /* FIXME: create a device if it's there */ - } -#endif - - /* FIXME: Let's assume one drive and one controller for the moment */ - RtlRosInitUnicodeStringFromLiteral(&DeviceName, L"\\Device\\Floppy0"); - Status = IoCreateDevice(DriverObject, - sizeof(FLOPPY_DEVICE_EXTENSION), - &DeviceName, - FILE_DEVICE_DISK, - FILE_REMOVABLE_MEDIA | FILE_FLOPPY_DISKETTE, - FALSE, - &DeviceObject); - if (!NT_SUCCESS(Status)) - { - goto interruptcleanup; - } - DeviceExtension = (PFLOPPY_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - DeviceExtension->DriveSelect = 0; - DeviceExtension->Controller = ControllerObject; - DeviceExtension->MediaType = ~0; - ControllerExtension->MotorOn = ~0; - // set up DPC - ControllerExtension->Device = DeviceObject; - KeInitializeDpc( &ControllerExtension->MotorSpinupDpc, - FloppyMotorSpinupDpc, - ControllerObject ); - KeInitializeDpc( &ControllerExtension->MotorSpindownDpc, - FloppyMotorSpindownDpc, - ControllerObject ); - KeInitializeTimer( &ControllerExtension->SpinupTimer ); - IoInitializeDpcRequest( DeviceObject, FloppyDpc ); - // reset controller and wait for interrupt - DPRINT( "Controller Off\n" ); - FloppyWriteDOR( ControllerExtension->PortBase, 0 ); - // let controller reset for at least FLOPPY_RESET_TIME - KeStallExecutionProcessor( FLOPPY_RESET_TIME ); - DPRINT( "Controller On\n" ); - FloppyWriteDOR( ControllerExtension->PortBase, FLOPPY_DOR_ENABLE | FLOPPY_DOR_DMA ); - // wait for interrupt now - Timeout.QuadPart = -10000000; - Status = KeWaitForSingleObject( &ControllerExtension->Event, - Executive, - KernelMode, - FALSE, - &Timeout ); - if( Status != STATUS_WAIT_0 ) - { - DPRINT1( "Error: KeWaitForSingleObject returned: %x\n", Status ); - goto devicecleanup; - } - // set for high speed mode - // FloppyWriteCCNTL( ControllerExtension->PortBase, FLOPPY_CCNTL_1MBIT ); - // ok, so we have an FDC, now check for drives - // aparently the sense drive status command does not work on any FDC I can find - // so instead we will just have to assume a 1.44 meg 3.5 inch floppy. At some - // point we should get the bios disk parameters passed in to the kernel at boot - // and stored in the HARDWARE registry key for us to pick up here. - - // Issue SPECIFY command - FloppyWriteDATA (ControllerExtension->PortBase, FLOPPY_CMD_SPEC_CHARS); - KeStallExecutionProcessor (100); - FloppyWriteDATA (ControllerExtension->PortBase, 0xD1); - KeStallExecutionProcessor (100); - FloppyWriteDATA (ControllerExtension->PortBase, 0x02); - KeStallExecutionProcessor (10000); - FloppyWriteMSTAT (ControllerExtension->PortBase, 0x00); - - - // turn on motor, wait for spinup time, and recalibrate the drive - FloppyWriteDOR( ControllerExtension->PortBase, FLOPPY_DRIVE0_ON ); - Timeout.QuadPart = FLOPPY_MOTOR_SPINUP_TIME; - KeDelayExecutionThread( KernelMode, FALSE, &Timeout ); - DPRINT( "MSTAT: %2x\n", FloppyReadMSTAT( ControllerExtension->PortBase ) ); - FloppyWriteDATA( ControllerExtension->PortBase, FLOPPY_CMD_RECAL ); - DPRINT( "MSTAT: %2x\n", FloppyReadMSTAT( ControllerExtension->PortBase ) ); - KeStallExecutionProcessor( 10000 ); - FloppyWriteDATA( ControllerExtension->PortBase, 0 ); // drive select - Timeout.QuadPart = FLOPPY_RECAL_TIMEOUT; - Status = KeWaitForSingleObject( &ControllerExtension->Event, - Executive, - KernelMode, - FALSE, - &Timeout ); - if( Status != STATUS_WAIT_0 ) - { - DPRINT1( "Error: KeWaitForSingleObject returned: %x\n", Status ); - goto devicecleanup; - } - if( ControllerExtension->St0 != FLOPPY_ST0_SEEKGD ) - { - DbgPrint( "Floppy: error recalibrating drive, ST0: %2x\n", (DWORD)ControllerExtension->St0 ); - goto devicecleanup; - } - DeviceExtension->Cyl = 0; - // drive is good, and it is now on track 0, turn off the motor - FloppyWriteDOR( ControllerExtension->PortBase, FLOPPY_DOR_ENABLE | FLOPPY_DOR_DMA ); - /* Initialize the device */ - DeviceObject->Flags = DeviceObject->Flags | DO_DIRECT_IO; - DeviceObject->AlignmentRequirement = FILE_512_BYTE_ALIGNMENT; - // change state machine, no interrupt expected - ControllerExtension->IsrState = FloppyIsrUnexpected; - Config = IoGetConfigurationInformation(); - Config->FloppyCount++; - // call IoAllocateAdapterChannel, and wait for execution routine to be given the channel - CHECKPOINT; - - /* DDK: IoAllocateAdapterChannel _must_ be called at DISPATCH_LEVEL */ - KeRaiseIrql(DISPATCH_LEVEL, &oldIrql); - Status = IoAllocateAdapterChannel( ControllerExtension->AdapterObject, - DeviceObject, - 0x3000/PAGE_SIZE, // max track size is 12k - FloppyAdapterControl, - ControllerExtension ); - KeLowerIrql(oldIrql); - - if( !NT_SUCCESS( Status ) ) - { - DPRINT1( "Error: IoAllocateAdapterChannel returned %x\n", Status ); - goto devicecleanup; - } - CHECKPOINT; - Status = KeWaitForSingleObject( &ControllerExtension->Event, - Executive, - KernelMode, - FALSE, - &Timeout ); - CHECKPOINT; - if( Status != STATUS_WAIT_0 ) - { - DPRINT1( "Error: KeWaitForSingleObject returned: %x\n", Status ); - goto devicecleanup; - } - // Ok, we own the adapter object, from now on we can just IoMapTransfer, and not - // bother releasing the adapter ever. - - DPRINT( "Floppy drive initialized\n" ); - return TRUE; - - devicecleanup: - IoDeleteDevice( DeviceObject ); - interruptcleanup: - IoDisconnectInterrupt(ControllerExtension->Interrupt); - controllercleanup: - // turn off controller - FloppyWriteDOR( ControllerExtension->PortBase, 0 ); - IoDeleteController(ControllerObject); - return FALSE; -} - -IO_ALLOCATION_ACTION STDCALL -FloppyExecuteSpindown(PDEVICE_OBJECT DeviceObject, - PIRP Irp, - PVOID MapRegisterbase, - PVOID Context) -{ - PFLOPPY_CONTROLLER_EXTENSION ControllerExtension= (PFLOPPY_CONTROLLER_EXTENSION)Context; - - // turn off motor, and return - DPRINT( "Spinning down motor\n" ); - ControllerExtension->MotorOn = ~0; - FloppyWriteDOR( ControllerExtension->PortBase, - FLOPPY_DOR_ENABLE | FLOPPY_DOR_DMA ); - return DeallocateObject; -} - -IO_ALLOCATION_ACTION STDCALL -FloppyExecuteReadWrite(PDEVICE_OBJECT DeviceObject, - PIRP Irp, - PVOID MapRegisterbase, - PVOID Context) -{ - PFLOPPY_DEVICE_EXTENSION DeviceExtension = (PFLOPPY_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - PFLOPPY_CONTROLLER_EXTENSION ControllerExtension = (PFLOPPY_CONTROLLER_EXTENSION)DeviceExtension->Controller->ControllerExtension; - LARGE_INTEGER Timeout; - BOOLEAN WriteToDevice; - ULONG Cyl, Sector, Head; - PIO_STACK_LOCATION Stk; - ULONG Length; - - DPRINT( "FloppyExecuteReadWrite()\n" ); - - ControllerExtension->Irp = Irp = (PIRP)Context; - Stk = IoGetCurrentIrpStackLocation( Irp ); - ControllerExtension->Device = DeviceObject; - Timeout.QuadPart = FLOPPY_MOTOR_SPINUP_TIME; - CHECKPOINT; - WriteToDevice = Stk->MajorFunction == IRP_MJ_WRITE ? TRUE : FALSE; - // verify drive is spun up and selected - if( ControllerExtension->MotorOn != DeviceExtension->DriveSelect ) - { - // turn on and select drive, and allow it to spin up - // FloppyMotorSpinupDpc will restart this operation once motor is spun up - DPRINT( "Motor not on, turning it on now\n" ); - FloppyWriteDOR( ControllerExtension->PortBase, - DeviceExtension->DriveSelect ? FLOPPY_DRIVE1_ON : FLOPPY_DRIVE0_ON ); - // cancel possible spindown timer first - KeCancelTimer( &ControllerExtension->SpinupTimer ); - KeSetTimerEx( &ControllerExtension->SpinupTimer, - Timeout, - 0, - &ControllerExtension->MotorSpinupDpc ); - return KeepObject; - } - else - { - Timeout.QuadPart = FLOPPY_MOTOR_SPINDOWN_TIME; - // motor is already spinning, so reset the spindown timer - KeCancelTimer( &ControllerExtension->SpinupTimer ); - KeSetTimer( &ControllerExtension->SpinupTimer, - Timeout, - &ControllerExtension->MotorSpindownDpc ); - } -#if 0 - /* Handle disk change, doesn't work correctly */ - if( FloppyReadDIR( ControllerExtension->PortBase ) & FLOPPY_DI_DSKCHNG ) - { - // No disk is in the drive - DPRINT( "No disk is in the drive\n" ); - Irp->IoStatus.Status = STATUS_MEDIA_CHANGED; - Irp->IoStatus.Information = 0; - IoCompleteRequest( Irp, 0 ); - return DeallocateObject; - } -#endif - if( DeviceExtension->MediaType == ~0 ) - { - // media is in disk, but we have not yet detected what kind it is, - // so detect it now - // First, we need to recalibrate the drive though - ControllerExtension->IsrState = FloppyIsrRecal; - DPRINT( "Recalibrating drive\n" ); - KeStallExecutionProcessor( 1000 ); - FloppyWriteDATA( ControllerExtension->PortBase, FLOPPY_CMD_RECAL ); - KeStallExecutionProcessor( 1000 ); - FloppyWriteDATA( ControllerExtension->PortBase, DeviceExtension->DriveSelect ); - return KeepObject; - } - // looks like we have media in the drive.... do the read - // first, calculate geometry for read - Sector = Stk->Parameters.Read.ByteOffset.u.LowPart / MediaTypes[DeviceExtension->MediaType].BytesPerSector; - // absolute sector right now - Cyl = Sector / MediaTypes[DeviceExtension->MediaType].SectorsPerTrack; - DPRINT( "Sector = %x, Offset = %x, Cyl = %x, Heads = %x MediaType = %x\n", Sector, Stk->Parameters.Read.ByteOffset.u.LowPart, (DWORD)Cyl, (DWORD)MediaTypes[DeviceExtension->MediaType].Heads, (DWORD)DeviceExtension->MediaType ); - Head = Cyl % MediaTypes[DeviceExtension->MediaType].Heads; - DPRINT( "Head = %2x\n", Head ); - // convert absolute cyl to relative - Cyl /= MediaTypes[DeviceExtension->MediaType].Heads; - // convert absolute sector to relative - Sector %= MediaTypes[DeviceExtension->MediaType].SectorsPerTrack; - Sector++; // track relative sector numbers are 1 based, not 0 based - DPRINT( "Cyl = %2x, Head = %2x, Sector = %2x\n", Cyl, Head, Sector ); - - // seek if we need to seek - if( DeviceExtension->Cyl != Cyl ) - { - DPRINT( "Seeking...\n" ); - ControllerExtension->IsrState = FloppyIsrDetect; - ControllerExtension->DpcState = FloppySeekDpc; - FloppyWriteDATA( ControllerExtension->PortBase, FLOPPY_CMD_SEEK ); - KeStallExecutionProcessor( 100 ); - FloppyWriteDATA( ControllerExtension->PortBase, DeviceExtension->DriveSelect ); - KeStallExecutionProcessor( 100 ); - FloppyWriteDATA( ControllerExtension->PortBase, Cyl ); - return KeepObject; - } - //set up DMA and issue read command - Length = MediaTypes[DeviceExtension->MediaType].SectorsPerTrack - Sector + 1; - // number of sectors untill end of track - Length *= 512; // convert to bytes - if( Length > Stk->Parameters.Read.Length ) - Length = Stk->Parameters.Read.Length; - DPRINT( "Sector: %d, Length: %d\n", Sector, Length ); - ControllerExtension->TransferLength = Length; - IoMapTransfer( ControllerExtension->AdapterObject, - Irp->MdlAddress, - ControllerExtension->MapRegisterBase, - Irp->Tail.Overlay.DriverContext[0], // current va - &Length, - WriteToDevice ); - ControllerExtension->IsrState = FloppyIsrReadWrite; - ControllerExtension->DpcState = FloppyDpcReadWrite; - CHECKPOINT; - FloppyWriteDATA( ControllerExtension->PortBase, WriteToDevice ? FLOPPY_CMD_WRITE : FLOPPY_CMD_READ ); - KeStallExecutionProcessor( 100 ); - FloppyWriteDATA( ControllerExtension->PortBase, ( Head << 2 ) | DeviceExtension->DriveSelect ); - KeStallExecutionProcessor( 100 ); - FloppyWriteDATA( ControllerExtension->PortBase, Cyl ); - KeStallExecutionProcessor( 100 ); - FloppyWriteDATA( ControllerExtension->PortBase, Head ); - KeStallExecutionProcessor( 100 ); - FloppyWriteDATA( ControllerExtension->PortBase, Sector ); - KeStallExecutionProcessor( 100 ); - FloppyWriteDATA( ControllerExtension->PortBase, MediaTypes[DeviceExtension->MediaType].SectorSizeCode ); - KeStallExecutionProcessor( 100 ); - FloppyWriteDATA( ControllerExtension->PortBase, MediaTypes[DeviceExtension->MediaType].SectorsPerTrack ); - KeStallExecutionProcessor( 100 ); - FloppyWriteDATA( ControllerExtension->PortBase, 0 ); - KeStallExecutionProcessor( 100 ); - FloppyWriteDATA( ControllerExtension->PortBase, 0xFF ); - CHECKPOINT; - // eventually, the FDC will interrupt and we will read results then - return KeepObject; -} - - -NTSTATUS STDCALL -FloppyDispatchOpenClose (PDEVICE_OBJECT DeviceObject, - PIRP Irp) -{ - DPRINT ("FloppyDispatchOpenClose\n"); - return STATUS_SUCCESS; -} - - -NTSTATUS STDCALL -FloppyDispatchReadWrite (PDEVICE_OBJECT DeviceObject, - PIRP Irp) -{ - PFLOPPY_DEVICE_EXTENSION DeviceExtension; - PIO_STACK_LOCATION Stack; - KIRQL oldlvl; - - DeviceExtension = (PFLOPPY_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - Stack = IoGetCurrentIrpStackLocation (Irp); - - if (Stack->Parameters.Read.ByteOffset.u.HighPart) - { - Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; - Irp->IoStatus.Information = 0; - IoCompleteRequest (Irp, 1); - return STATUS_INVALID_PARAMETER; - } - - /* Store currentva in drivercontext */ - Irp->Tail.Overlay.DriverContext[0] = MmGetMdlVirtualAddress (Irp->MdlAddress); - DPRINT ("FloppyDispatchReadWrite: offset = %x, length = %x, va = %x\n", - Stack->Parameters.Read.ByteOffset.u.LowPart, - Stack->Parameters.Read.Length, - Irp->Tail.Overlay.DriverContext[0]); - - /* Queue IRP */ - Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = Stack->Parameters.Read.Length; - IoMarkIrpPending (Irp); - - KeRaiseIrql (DISPATCH_LEVEL, - &oldlvl); - IoAllocateController (DeviceExtension->Controller, - DeviceObject, - FloppyExecuteReadWrite, - Irp); - KeLowerIrql (oldlvl); - - DPRINT( "oldlvl = %x\n", oldlvl ); - - return STATUS_PENDING; -} - - -IO_ALLOCATION_ACTION STDCALL -FloppyAdapterControl (PDEVICE_OBJECT DeviceObject, - PIRP Irp, - PVOID MapRegisterBase, - PVOID Context) -{ - PFLOPPY_CONTROLLER_EXTENSION ControllerExtension; - - ControllerExtension = (PFLOPPY_CONTROLLER_EXTENSION)Context; - CHECKPOINT; - - /* Just set the event, and return KeepObject */ - ControllerExtension->MapRegisterBase = MapRegisterBase; - KeSetEvent (&ControllerExtension->Event, - 0, - FALSE); - - return KeepObject; -} - - -NTSTATUS STDCALL -FloppyDispatchDeviceControl (PDEVICE_OBJECT DeviceObject, - PIRP Irp) -{ - PIO_STACK_LOCATION Stack; - ULONG ControlCode; - ULONG InputLength; - ULONG OutputLength; - NTSTATUS Status; - - DPRINT ("FloppyDispatchDeviceControl\n"); - - Stack = IoGetCurrentIrpStackLocation(Irp); - ControlCode = Stack->Parameters.DeviceIoControl.IoControlCode; - InputLength = Stack->Parameters.DeviceIoControl.InputBufferLength; - OutputLength = Stack->Parameters.DeviceIoControl.OutputBufferLength; - - switch (ControlCode) - { - case IOCTL_DISK_GET_DRIVE_GEOMETRY: - if (OutputLength < sizeof(DISK_GEOMETRY)) - { - Status = STATUS_INVALID_PARAMETER; - } - else - { - PDISK_GEOMETRY Geometry = Irp->AssociatedIrp.SystemBuffer; - - // FIXME: read the first sector of the diskette - Geometry->MediaType = F3_1Pt44_512; - Geometry->Cylinders.QuadPart = 80; - Geometry->TracksPerCylinder = 2 * 18; - Geometry->SectorsPerTrack = 18; - Geometry->BytesPerSector = 512; - Status = STATUS_SUCCESS; - Irp->IoStatus.Information = sizeof(DISK_GEOMETRY); - } - break; - - default: - Status = STATUS_INVALID_DEVICE_REQUEST; - Irp->IoStatus.Information = 0; - break; - } - - Irp->IoStatus.Status = Status; - IoCompleteRequest (Irp, - NT_SUCCESS(Status) ? IO_DISK_INCREMENT : IO_NO_INCREMENT); - - return Status; -} - - -/* - * DriverEntry - * - * DESCRIPTION: - * This function initializes the driver, locates and claims - * hardware resources, and creates various NT objects needed - * to process I/O requests. - * - * RUN LEVEL: - * PASSIVE_LEVEL - * - * ARGUMENTS: - * IN PDRIVER_OBJECT DriverObject System allocated Driver Object - * for this driver - * IN PUNICODE_STRING RegistryPath Name of registry driver service - * key - * - * RETURNS: - * NTSTATUS - */ -NTSTATUS STDCALL -DriverEntry (IN PDRIVER_OBJECT DriverObject, - IN PUNICODE_STRING RegistryPath) -{ - DPRINT ("Floppy driver\n"); - - /* Export other driver entry points... */ - DriverObject->MajorFunction[IRP_MJ_CREATE] = FloppyDispatchOpenClose; - DriverObject->MajorFunction[IRP_MJ_CLOSE] = FloppyDispatchOpenClose; - DriverObject->MajorFunction[IRP_MJ_READ] = FloppyDispatchReadWrite; - DriverObject->MajorFunction[IRP_MJ_WRITE] = FloppyDispatchReadWrite; - DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = FloppyDispatchDeviceControl; - - /* Try to detect controller and abort if it fails */ - if (!FloppyCreateController (DriverObject, - &ControllerParameters[0], - 0)) - { - DPRINT ("Could not find floppy controller\n"); - return STATUS_NO_SUCH_DEVICE; - } - - return STATUS_SUCCESS; -} - -/* EOF */ diff --git a/reactos/drivers/dd/floppy/floppy.h b/reactos/drivers/dd/floppy/floppy.h deleted file mode 100644 index 165e8b5d685..00000000000 --- a/reactos/drivers/dd/floppy/floppy.h +++ /dev/null @@ -1,258 +0,0 @@ -// -// Floppy register definitions -// - -#define FLOPPY_REG_DOR 0x0002 -#define FLOPPY_DOR_ENABLE 0x04 -#define FLOPPY_DOR_DMA 0x08 -#define FLOPPY_DOR_MOTOR0 0x10 -#define FLOPPY_DOR_MOTOR1 0x20 -#define FLOPPY_DRIVE0_ON ( FLOPPY_DOR_ENABLE | FLOPPY_DOR_DMA | FLOPPY_DOR_MOTOR0 ) -#define FLOPPY_DRIVE1_ON ( FLOPPY_DOR_ENABLE | FLOPPY_DOR_DMA | FLOPPY_DOR_MOTOR1 | 1 ) -#define FLOPPY_REG_MSTAT 0x0004 -#define FLOPPY_MS_DRV0BUSY 0x01 -#define FLOPPY_MS_DRV1BUSY 0x02 -#define FLOPPY_MS_DRV2BUSY 0x04 -#define FLOPPY_MS_DRV3BUSY 0x08 -#define FLOPPY_MS_FDCBUSY 0x10 -#define FLOPPY_MS_DMAMODE 0x20 -#define FLOPPY_MS_DATADIR 0x40 -#define FLOPPY_MS_RDYMASK 0xC0 -#define FLOPPY_MS_DATARDYW 0x80 -#define FLOPPY_MS_DATARDYR 0xC0 -#define FLOPPY_REG_DATA 0x0005 -#define FLOPPY_REG_DIR 0x0007 /* READ ONLY */ -#define FLOPPY_DI_DSKCHNG 0x80 -#define FLOPPY_REG_CCNTL 0x0007 /* WRITE ONLY */ -#define FLOPPY_CCNTL_1MBIT 0x03 - -#define FLOPPY_CMD_RD_TRK 0x02 -#define FLOPPY_CMD_SPEC_CHARS 0x03 -#define FLOPPY_CSC_SRT_SHIFT 4 -#define FLOPPY_CSC_HUT_MASK 0x0f -#define FLOPPY_CSC_HLT_SHIFT 1 -#define FLOPPY_CSC_NON_DMA 0x01 -#define FLOPPY_CMD_SNS_DRV 0x04 -#define FLOPPY_CMD_WRT_DATA 0x05 -#define FLOPPY_CMD_RD_DATA 0x06 -#define FLOPPY_CMD_RECAL 0x07 -#define FLOPPY_CMD_SNS_INTR 0x08 -#define FLOPPY_ST0_SEEKGD 0x20 -#define FLOPPY_ST0_GDMASK 0xd8 -#define FLOPPY_CMD_WRT_DEL 0x09 -#define FLOPPY_CMD_RD_ID 0x0a -#define FLOPPY_CMD_RD_DEL 0x0c -#define FLOPPY_CMD_FMT_TRK 0x0d -#define FLOPPY_CMD_DUMP_FDC 0x0e -#define FLOPPY_CMD_SEEK 0x0f -#define FLOPPY_CMD_VERSION 0x10 -#define FLOPPY_CMD_SCN_EQ 0x11 -#define FLOPPY_CMD_PPND_RW 0x12 -#define FLOPPY_CMD_CFG_FIFO 0x13 -#define FLOPPY_CMD_LCK_FIFO 0x14 -#define FLOPPY_CMD_PARTID 0x18 -#define FLOPPY_CMD_SCN_LE 0x19 -#define FLOPPY_CMD_SCN_GE 0x1d -#define FLOPPY_CMD_CFG_PWR 0x27 -#define FLOPPY_CMD_SAVE_FDC 0x2e -#define FLOPPY_CMD_FMT_ISO 0x33 -#define FLOPPY_CMD_DMA_READ 0x46 -#define FLOPPY_CMD_DMA_WRT 0x4a -#define FLOPPY_CMD_REST_FDC 0x4e -#define FLOPPY_CMD_DRV_SPEC 0x8e -#define FLOPPY_CMD_RSEEK_OUT 0x8f -#define FLOPPY_CMD_ULK_FIFO 0x94 -#define FLOPPY_CMD_RSEEK_IN 0xcf -#define FLOPPY_CMD_FMT_WRT 0xef - -// Command Code modifiers -#define FLOPPY_C0M_SK 0x20 -#define FLOPPY_C0M_MFM 0x40 -#define FLOPPY_C0M_MT 0x80 -#define FLOPPY_C1M_DRVMASK 0x03 -#define FLOPPY_C1M_HEAD1 0x04 - -// Status code values and masks -#define FLOPPY_ST0_INVALID 0x80 - -// useful command defines -#define FLOPPY_CMD_READ (FLOPPY_CMD_RD_DATA | FLOPPY_C0M_SK | FLOPPY_C0M_MFM | FLOPPY_C0M_MT) -#define FLOPPY_CMD_WRITE (FLOPPY_CMD_WRT_DATA | FLOPPY_C0M_MFM | FLOPPY_C0M_MT) -#define FLOPPY_CMD_FORMAT (FLOPPY_CMD_FMT_TRK | FLOPPY_C0M_MFM) - -// -// HAL floppy register access commands -// -#define FloppyWriteDOR(A, V) (WRITE_PORT_UCHAR((PVOID)(A) + FLOPPY_REG_DOR, (V))) -#define FloppyReadMSTAT(A) (READ_PORT_UCHAR((PVOID)(A) + FLOPPY_REG_MSTAT)) -#define FloppyWriteMSTAT(A, V) (WRITE_PORT_UCHAR((PVOID)(A) + FLOPPY_REG_MSTAT, (V))) -#define FloppyReadDATA(A) (READ_PORT_UCHAR((PVOID)(A) + FLOPPY_REG_DATA)) -#define FloppyWriteDATA(A, V) (WRITE_PORT_UCHAR((PVOID)(A) + FLOPPY_REG_DATA, (V))) -#define FloppyReadDIR(A) (READ_PORT_UCHAR((PVOID)(A) + FLOPPY_REG_DIR)) -#define FloppyWriteCCNTL(A, V) (WRITE_PORT_UCHAR((PVOID)(A) + FLOPPY_REG_CCNTL, (V))) - -typedef struct _FLOPPY_ERROR_THRESHOLDS -{ - /* number of errors to be reached before aborting */ - unsigned int Abort; - /* maximal number of errors permitted to read an entire track at once */ - unsigned int ReadTrack; - /* maximal number of errors before a reset is tried */ - unsigned int Reset; - /* maximal number of errors before a recalibrate is tried */ - unsigned int Recal; - /* - * Threshold for reporting FDC errors to the console. - * Setting this to zero may flood your screen when using - * ultra cheap floppies ;-) - */ - unsigned int Reporting; -} FLOPPY_ERROR_THRESHOLDS; - -typedef struct _FLOPPY_MEDIA_TYPE -{ - BYTE SectorSizeCode; - BYTE MaximumTrack; - BYTE Heads; - DWORD SectorsPerTrack; - ULONG BytesPerSector; -} FLOPPY_MEDIA_TYPE; - -extern const FLOPPY_MEDIA_TYPE MediaTypes[]; - -#define FDP_DEBUG 0x02 -#define FDP_SILENT_DCL_CLEAR 0x04 -#define FDP_MSG 0x10 -#define FDP_BROKEN_DCL 0x20 -#define FDP_INVERTED_DCL 0x80 - -// time to hold reset line low -#define FLOPPY_RESET_TIME 50000 -#define FLOPPY_MOTOR_SPINUP_TIME -15000000 -#define FLOPPY_MOTOR_SPINDOWN_TIME -50000000 -#define FLOPPY_RECAL_TIMEOUT -30000000 - -typedef BOOLEAN (*FloppyIsrStateRoutine)( PCONTROLLER_OBJECT Controller ); -typedef PIO_DPC_ROUTINE FloppyDpcStateRoutine; - -typedef struct _FLOPPY_DEVICE_EXTENSION -{ - PCONTROLLER_OBJECT Controller; - CHAR DriveSelect; - CHAR Cyl; // current cylinder - ULONG MediaType; // Media type index -} FLOPPY_DEVICE_EXTENSION, *PFLOPPY_DEVICE_EXTENSION; - -typedef struct _FLOPPY_CONTROLLER_EXTENSION -{ - PKINTERRUPT Interrupt; - KSPIN_LOCK SpinLock; - ULONG Number; - ULONG PortBase; - ULONG Vector; - KEVENT Event; // Event set by ISR/DPC to wake DeviceEntry - PDEVICE_OBJECT Device; // Pointer to the primary device on this controller - PIRP Irp; // Current IRP - CHAR St0; // Status registers - CHAR St1; - CHAR St2; - CHAR SectorSizeCode; - FloppyIsrStateRoutine IsrState; // pointer to state routine handler for ISR - FloppyDpcStateRoutine DpcState; // pointer to state routine handler for DPC - CHAR MotorOn; // drive select for drive with motor on - KDPC MotorSpinupDpc; // DPC for motor spin up time - KTIMER SpinupTimer; // Timer for motor spin up time - KDPC MotorSpindownDpc; // DPC for motor spin down - PADAPTER_OBJECT AdapterObject; // Adapter object for dma - PVOID MapRegisterBase; - DWORD TransferLength; // Length of the transfer -} FLOPPY_CONTROLLER_EXTENSION, *PFLOPPY_CONTROLLER_EXTENSION; - -typedef struct _FLOPPY_CONTROLLER_PARAMETERS -{ - ULONG PortBase; - ULONG Vector; - ULONG DmaChannel; - KINTERRUPT_MODE InterruptMode; -} FLOPPY_CONTROLLER_PARAMETERS, *PFLOPPY_CONTROLLER_PARAMETERS; - -#define FLOPPY_MAX_CONTROLLERS 1 - -VOID STDCALL -FloppyDpcDetectMedia(PKDPC Dpc, - PDEVICE_OBJECT DeviceObject, - PIRP Irp, - PVOID Context); -VOID STDCALL -FloppyDpcFailIrp(PKDPC Dpc, - PDEVICE_OBJECT DeviceObject, - PIRP Irp, - PVOID Context); - -IO_ALLOCATION_ACTION STDCALL -FloppyExecuteReadWrite(PDEVICE_OBJECT DeviceObject, - PIRP Irp, - PVOID MapRegisterbase, - PVOID Context); - -IO_ALLOCATION_ACTION STDCALL -FloppyExecuteSpindown(PDEVICE_OBJECT DeviceObject, - PIRP Irp, - PVOID MapRegisterbase, - PVOID Context); - -VOID STDCALL -FloppyMotorSpinupDpc(PKDPC Dpc, - PVOID Context, - PVOID Arg1, - PVOID Arg2); - -VOID STDCALL -FloppySeekDpc(PKDPC Dpc, - PDEVICE_OBJECT DeviceObject, - PIRP Irp, - PVOID Context); - -VOID STDCALL -FloppyMotorSpindownDpc(PKDPC Dpc, - PVOID Context, - PVOID Arg1, - PVOID Arg2); - -VOID STDCALL -FloppyDpcDetect(PKDPC Dpc, - PDEVICE_OBJECT DeviceObject, - PIRP Irp, - PVOID Context ); - -VOID STDCALL -FloppyDpcReadWrite(PKDPC Dpc, - PDEVICE_OBJECT DeviceObject, - PIRP Irp, - PVOID Context); - -VOID STDCALL -FloppyDpc(PKDPC Dpc, - PDEVICE_OBJECT DeviceObject, - PIRP Irp, - PVOID Context); - -BOOLEAN FloppyIsrDetect( PCONTROLLER_OBJECT Controller ); - -BOOLEAN FloppyIsrReadWrite( PCONTROLLER_OBJECT Controller ); - -BOOLEAN FloppyIsrUnexpected( PCONTROLLER_OBJECT Controller ); - -BOOLEAN FloppyIsrDetectMedia( PCONTROLLER_OBJECT Controller ); - -BOOLEAN FloppyIsrRecal( PCONTROLLER_OBJECT Controller ); - -BOOLEAN STDCALL -FloppyIsr(PKINTERRUPT Interrupt, - PVOID ServiceContext); - -IO_ALLOCATION_ACTION STDCALL -FloppyAdapterControl(PDEVICE_OBJECT DeviceObject, - PIRP Irp, - PVOID MapRegisterBase, - PVOID Context); diff --git a/reactos/drivers/dd/floppy/floppy.rc b/reactos/drivers/dd/floppy/floppy.rc deleted file mode 100644 index fd1d0e353a8..00000000000 --- a/reactos/drivers/dd/floppy/floppy.rc +++ /dev/null @@ -1,38 +0,0 @@ -#include <defines.h> -#include <reactos/resource.h> - -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", "Floppy Device Driver\0" - VALUE "FileVersion", "0.1.4\0" - VALUE "InternalName", "floppy\0" - VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT - VALUE "OriginalFilename", "floppy.sys\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/drivers/dd/floppy/isr.c b/reactos/drivers/dd/floppy/isr.c deleted file mode 100644 index ce2b8eec778..00000000000 --- a/reactos/drivers/dd/floppy/isr.c +++ /dev/null @@ -1,210 +0,0 @@ -/************************************************************************ - * Interrupt handlers for floppy disk driver, reactos project, created * - * by Phillip Susi on 2/25/2001. This software is publised under the * - * GNU General public license. See the README file for more details * - ***********************************************************************/ - -#include <ddk/ntddk.h> -#define NDEBUG -#include <debug.h> -#include "floppy.h" - - -// ISR state machine function called when expecting an interrupt due to reset -// During reset, there is nothing ready to read, just issue sense interrupt status - -BOOLEAN FloppyIsrDetect( PCONTROLLER_OBJECT Controller ) -{ - PFLOPPY_CONTROLLER_EXTENSION ControllerExtension = (PFLOPPY_CONTROLLER_EXTENSION)Controller->ControllerExtension; - PFLOPPY_DEVICE_EXTENSION DeviceExtension = (PFLOPPY_DEVICE_EXTENSION)ControllerExtension->Device->DeviceExtension; - // Issue read interrupt status, and store the results - FloppyWriteDATA( ControllerExtension->PortBase, FLOPPY_CMD_SNS_INTR ); - KeStallExecutionProcessor( 100 ); - ControllerExtension->St0 = FloppyReadDATA( ControllerExtension->PortBase ); - KeStallExecutionProcessor( 100 ); - DeviceExtension->Cyl = FloppyReadDATA( ControllerExtension->PortBase ); - KeStallExecutionProcessor( 100 ); - if (FLOPPY_MS_DATARDYR == - (FloppyReadMSTAT( ControllerExtension->PortBase ) & FLOPPY_MS_RDYMASK)) - { - /* There's something still to be read (what is it???? only happens on some - controllers). Ignore it. */ - (void) FloppyReadDATA( ControllerExtension->PortBase ); - } - // now queue DPC to set the event - IoRequestDpc( ControllerExtension->Device, - 0, - Controller ); - return TRUE; -} - -// ISR state machine handler for unexpected interrupt -BOOLEAN FloppyIsrUnexpected( PCONTROLLER_OBJECT Controller ) -{ - DPRINT( "Unexpected interrupt!\n" ); - return FALSE; -} - -BOOLEAN FloppyIsrDetectMedia( PCONTROLLER_OBJECT Controller ) -{ - PFLOPPY_CONTROLLER_EXTENSION ControllerExtension = (PFLOPPY_CONTROLLER_EXTENSION)Controller->ControllerExtension; - UCHAR SectorSize; - - DPRINT("FloppyIsrDetectMedia() called\n"); - - // media detect in progress, read ID command already issued - // first, read result registers - KeStallExecutionProcessor( 1000 ); - ControllerExtension->St0 = FloppyReadDATA( ControllerExtension->PortBase ); - KeStallExecutionProcessor( 1000 ); - ControllerExtension->St1 = FloppyReadDATA( ControllerExtension->PortBase ); - KeStallExecutionProcessor( 1000 ); - ControllerExtension->St2 = FloppyReadDATA( ControllerExtension->PortBase ); - KeStallExecutionProcessor( 1000 ); - FloppyReadDATA( ControllerExtension->PortBase ); // ignore cyl - KeStallExecutionProcessor( 1000 ); - FloppyReadDATA( ControllerExtension->PortBase ); // ignore head - KeStallExecutionProcessor( 1000 ); - FloppyReadDATA( ControllerExtension->PortBase ); // ignore sector - KeStallExecutionProcessor( 1000 ); - SectorSize = FloppyReadDATA( ControllerExtension->PortBase ); - DPRINT( "Sector Size Code: %2x\n", SectorSize ); - DPRINT( "St0 = %2x, St1 = %2x, St2 = %2x\n", ControllerExtension->St0, ControllerExtension->St1, ControllerExtension->St2 ); - DPRINT( "ControllerExtension->Device = %x, ControllerExtension->Irp = %x\n", ControllerExtension->Device, ControllerExtension->Irp ); - // queue DPC - ControllerExtension->DpcState = FloppyDpcDetectMedia; - IoRequestDpc( ControllerExtension->Device, - ControllerExtension->Irp, - Controller ); - return TRUE; -} - -BOOLEAN FloppyIsrRecal( PCONTROLLER_OBJECT Controller ) -{ - PFLOPPY_CONTROLLER_EXTENSION ControllerExtension = (PFLOPPY_CONTROLLER_EXTENSION)Controller->ControllerExtension; - // issue sense interrupt status, and read St0 and cyl - - DPRINT("FloppyIsrRecal() called\n"); - - FloppyWriteDATA( ControllerExtension->PortBase, FLOPPY_CMD_SNS_INTR ); - KeStallExecutionProcessor( 1000 ); - ControllerExtension->St0 = FloppyReadDATA( ControllerExtension->PortBase ); - KeStallExecutionProcessor( 1000 ); - FloppyReadDATA( ControllerExtension->PortBase ); // ignore cyl number - if (FLOPPY_MS_DATARDYR == - (FloppyReadMSTAT( ControllerExtension->PortBase ) & FLOPPY_MS_RDYMASK)) - { - /* There's something still to be read (what is it???? only happens on some - controllers). Ignore it. */ - (void) FloppyReadDATA( ControllerExtension->PortBase ); - } - DPRINT( "Recal St0: %2x\n", ControllerExtension->St0 ); - - // If recalibrate worked, issue read ID for each media type untill one works - if ( ControllerExtension->St0 != FLOPPY_ST0_SEEKGD ) - { - DPRINT( "Recalibrate failed, ST0 = %2x\n", ControllerExtension->St0 ); - // queue DPC to fail IRP - ControllerExtension->DpcState = FloppyDpcFailIrp; - IoRequestDpc( ControllerExtension->Device, - ControllerExtension->Irp, - Controller ); - } - else - { - // issue first read id, FloppyIsrDetectMedia will handle - DPRINT( "Recalibrate worked, issuing read ID mark command\n" ); - ControllerExtension->IsrState = FloppyIsrDetectMedia; - KeStallExecutionProcessor( 1000 ); - FloppyWriteDATA( ControllerExtension->PortBase, FLOPPY_CMD_RD_ID | FLOPPY_C0M_MFM ); - KeStallExecutionProcessor( 1000 ); - FloppyWriteDATA( ControllerExtension->PortBase, ((PFLOPPY_DEVICE_EXTENSION)ControllerExtension->Device->DeviceExtension)->DriveSelect ); - } - - return TRUE; -} - -BOOLEAN FloppyIsrReadWrite( PCONTROLLER_OBJECT Controller ) -{ - // read result registers from read or write command, and queue dpc to start next operation - PFLOPPY_CONTROLLER_EXTENSION ControllerExtension = (PFLOPPY_CONTROLLER_EXTENSION)Controller->ControllerExtension; - UCHAR Cyl; - UCHAR Head; - UCHAR Sector; -// PFLOPPY_DEVICE_EXTENSION DeviceExtension = (PFLOPPY_DEVICE_EXTENSION)ControllerExtension->Device->DeviceExtension; -// PIO_STACK_LOCATION Stk = IoGetCurrentIrpStackLocation( ControllerExtension->Irp ); -// BOOLEAN WriteToDevice = Stk->MajorFunction == IRP_MJ_WRITE ? TRUE : FALSE; - - - ControllerExtension->St0 = FloppyReadDATA( ControllerExtension->PortBase ); - KeStallExecutionProcessor( 100 ); - ControllerExtension->St1 = FloppyReadDATA( ControllerExtension->PortBase ); - KeStallExecutionProcessor( 100 ); - ControllerExtension->St2 = FloppyReadDATA( ControllerExtension->PortBase ); - KeStallExecutionProcessor( 100 ); - Cyl = FloppyReadDATA( ControllerExtension->PortBase ); // cyl - KeStallExecutionProcessor( 100 ); - Head = FloppyReadDATA( ControllerExtension->PortBase ); // head - KeStallExecutionProcessor( 100 ); - Sector = FloppyReadDATA( ControllerExtension->PortBase ); // sector - KeStallExecutionProcessor( 100 ); - ControllerExtension->SectorSizeCode = FloppyReadDATA( ControllerExtension->PortBase ); - - // reprogam for next sector if we are not done reading track - /* if( ( ControllerExtension->TransferLength -= ( 128 << ControllerExtension->SectorSizeCode ) ) ) - { - DPRINT1( "ISR reprogramming for next sector: %d\n", Sector ); - Sector++; - FloppyWriteDATA( ControllerExtension->PortBase, WriteToDevice ? FLOPPY_CMD_WRITE : FLOPPY_CMD_READ ); - KeStallExecutionProcessor( 100 ); - FloppyWriteDATA( ControllerExtension->PortBase, ( Head << 2 ) | DeviceExtension->DriveSelect ); - KeStallExecutionProcessor( 100 ); - FloppyWriteDATA( ControllerExtension->PortBase, Cyl ); - KeStallExecutionProcessor( 100 ); - FloppyWriteDATA( ControllerExtension->PortBase, Head ); - KeStallExecutionProcessor( 100 ); - FloppyWriteDATA( ControllerExtension->PortBase, Sector ); - KeStallExecutionProcessor( 100 ); - FloppyWriteDATA( ControllerExtension->PortBase, ControllerExtension->SectorSizeCode ); - KeStallExecutionProcessor( 100 ); - FloppyWriteDATA( ControllerExtension->PortBase, MediaTypes[DeviceExtension->MediaType].SectorsPerTrack ); - KeStallExecutionProcessor( 100 ); - FloppyWriteDATA( ControllerExtension->PortBase, 0 ); - KeStallExecutionProcessor( 100 ); - FloppyWriteDATA( ControllerExtension->PortBase, 0xFF ); - } - else */IoRequestDpc( ControllerExtension->Device, - ControllerExtension->Irp, - Controller ); - return TRUE; -} - - -// actual ISR, passes controll to handler for current state in state machine - -BOOLEAN STDCALL -FloppyIsr (PKINTERRUPT Interrupt, - PVOID ServiceContext) -{ - PCONTROLLER_OBJECT Controller; - PFLOPPY_CONTROLLER_EXTENSION ControllerExtension; - UCHAR Byte; - - Controller = (PCONTROLLER_OBJECT)ServiceContext; - ControllerExtension = (PFLOPPY_CONTROLLER_EXTENSION)Controller->ControllerExtension; - - // need to make sure interrupt is for us, and add some delay for the damn FDC - // without the delay, even though the thing has interrupted, it's still not ready - // for us to read the data register. - KeStallExecutionProcessor( 100 ); - Byte = FloppyReadMSTAT( ControllerExtension->PortBase ); - KeStallExecutionProcessor( 100 ); - if( Byte == 0 ) - { - DPRINT( "Ignoring interrupt, MSTAT = 0\n" ); - return TRUE; - } - return ControllerExtension->IsrState( Controller ); -} - -/* EOF */ diff --git a/reactos/drivers/dd/ide/.cvsignore b/reactos/drivers/dd/ide/.cvsignore deleted file mode 100644 index 5f6c85b86cb..00000000000 --- a/reactos/drivers/dd/ide/.cvsignore +++ /dev/null @@ -1,8 +0,0 @@ -*.tmp -*.exp -*.coff -*.d -*.o -*.sym -*.sys -*.map diff --git a/reactos/drivers/dd/ide/ide.c b/reactos/drivers/dd/ide/ide.c deleted file mode 100644 index f02e57f216e..00000000000 --- a/reactos/drivers/dd/ide/ide.c +++ /dev/null @@ -1,2268 +0,0 @@ -/* $Id: ide.c,v 1.61 2004/05/07 05:12:10 royce Exp $ - * - * IDE.C - IDE Disk driver - * written by Rex Jolliff - * with help from various documentation sources and a few peeks at - * linux and freebsd sources. - * - * This driver supports PCI controllers and up to 4 ISA controllers - * with up to 2 drives each. - * The device names are assigned as follows: - * \Devices\HarddiskX\Partition0 - * for the raw device, and - * \Devices\HarddiskX\PartitionY - * for partitions - * where: - * X is computed by counting the available drives from the following - * sequence: the controller number (0=0x1f0, 1=0x170, 2=0x1e8, - * 3=0x168) * 2 plus the drive number (0,1) - * Y is the partition number - * - * The driver exports the following function: - * - * DriverEntry() - NT device driver initialization routine - * - * And the following functions are exported implicitly: - * - * IDEStartIo() - called to start an I/O request packet - * IDEDispatchOpenClose() - Called to open/close the device. a NOOP - * IDEDispatchReadWrite() - Called to read/write the device. - * IDEDispatchQueryInformation() - Called to get device information - * IDEDispatchSetInformation() - Called to set device information - * IDEDispatchDeviceControl() - Called to execute device control requests - * - * Modification History: - * 05/25/98 RJJ Created. - * 05/30/98 RJJ Removed IRQ handler and inserted busy waits - * just to get something working... - * 07/18/98 RJJ Made drastic changes so that the driver - * resembles a WinNT driver. - * 08/05/98 RJJ Changed to .C extension - * 09/19/98 RJJ First release (run for cover!) - * - * Test List: - * 09/17/98 RJJ Pri/MST: 14.12X19 WDC AC31000H Test Passed - * Pri/SLV: None. - * - * - * To Do: - * FIXME: a timer should be used to watch for device timeouts and errors - * FIXME: errors should be retried - * FIXME: a drive reset/recalibrate should be attempted if errors occur - * FIXME: Use DMA for transfers if drives support it - * FIXME: should we support unloading of this driver??? - * FIXME: the device information should come from AUTODETECT (via registry) - * FIXME: really big devices need to be handled correctly - * FIXME: should get device info from the registry - * FIXME: should report hardware usage to iomgr - * FIXME: finish implementation of QueryInformation - * FIXME: finish implementation of SetInformation - * FIXME: finish implementation of DeviceControl - * FIXME: bring up to ATA-3 spec - * FIXME: add general support for ATAPI devices - * FIXME: add support for ATAPI CDROMs - * FIXME: add support for ATAPI ZIP drives/RHDs - * FIXME: add support for ATAPI tape drives - */ - -// ------------------------------------------------------------------------- - -#include <ddk/ntddk.h> - -#define NDEBUG -#include <debug.h> - -#include "ide.h" -#include "partitio.h" - -#define VERSION "V0.1.5" - -/* uncomment the following line to enable the secondary ide channel */ -//#define ENABLE_SECONDARY_IDE_CHANNEL - -// ------------------------------------------------------- File Static Data - - -typedef struct _IDE_CONTROLLER_PARAMETERS -{ - int CommandPortBase; - int CommandPortSpan; - int ControlPortBase; - int ControlPortSpan; - int Vector; - KINTERRUPT_MODE InterruptMode; -} IDE_CONTROLLER_PARAMETERS, *PIDE_CONTROLLER_PARAMETERS; - -// NOTE: Do not increase max drives above 2 - -#define IDE_MAX_DRIVES 2 - -#define IDE_MAX_CONTROLLERS 2 -IDE_CONTROLLER_PARAMETERS Controllers[IDE_MAX_CONTROLLERS] = -{ - {0x01f0, 8, 0x03f6, 1, 14, Latched}, - {0x0170, 8, 0x0376, 1, 15, Latched} -/* {0x01E8, 8, 0x03ee, 1, 11, LevelSensitive}, - {0x0168, 8, 0x036e, 1, 10, LevelSensitive}*/ -}; - -static BOOLEAN IDEInitialized = FALSE; - -// ----------------------------------------------- Discardable Declarations - -#ifdef ALLOC_PRAGMA - -// make the initialization routines discardable, so that they -// don't waste space - -#pragma alloc_text(init, DriverEntry) -#pragma alloc_text(init, IDECreateController) -#pragma alloc_text(init, IDECreateDevices) -#pragma alloc_text(init, IDECreateDevice) -#pragma alloc_text(init, IDEPolledRead) - -// make the PASSIVE_LEVEL routines pageable, so that they don't -// waste nonpaged memory - -#pragma alloc_text(page, IDEShutdown) -#pragma alloc_text(page, IDEDispatchOpenClose) -#pragma alloc_text(page, IDEDispatchRead) -#pragma alloc_text(page, IDEDispatchWrite) - -#endif /* ALLOC_PRAGMA */ - -// ---------------------------------------------------- Forward Declarations - -static NTSTATUS -IdeFindControllers(IN PDRIVER_OBJECT DriverObject); - -static NTSTATUS -IdeCreateController(IN PDRIVER_OBJECT DriverObject, - IN PIDE_CONTROLLER_PARAMETERS ControllerParams, - IN int ControllerIdx); - -static BOOLEAN IDEResetController(IN WORD CommandPort, IN WORD ControlPort); -static BOOLEAN IDECreateDevices(IN PDRIVER_OBJECT DriverObject, - IN PCONTROLLER_OBJECT ControllerObject, - IN PIDE_CONTROLLER_EXTENSION ControllerExtension, - IN int DriveIdx, - IN int HarddiskIdx); -static BOOLEAN IDEGetDriveIdentification(IN int CommandPort, - IN int DriveNum, - OUT PIDE_DRIVE_IDENTIFY DrvParms); -static NTSTATUS IDECreateDiskDevice(IN PDRIVER_OBJECT DriverObject, - OUT PDEVICE_OBJECT *DeviceObject, - IN PCONTROLLER_OBJECT ControllerObject, - IN int UnitNumber, - IN ULONG DiskNumber, - IN PIDE_DRIVE_IDENTIFY DrvParms, - IN ULONG SectorCount); -static NTSTATUS IDECreatePartitionDevice(IN PDRIVER_OBJECT DriverObject, - OUT PDEVICE_OBJECT *DeviceObject, - IN PCONTROLLER_OBJECT ControllerObject, - IN PVOID DiskDeviceExtension, - IN int UnitNumber, - IN ULONG DiskNumber, - IN PIDE_DRIVE_IDENTIFY DrvParms, - IN PPARTITION_INFORMATION PartitionInfo); -static int IDEPolledRead(IN WORD Address, - IN BYTE PreComp, - IN BYTE SectorCnt, - IN BYTE SectorNum, - IN BYTE CylinderLow, - IN BYTE CylinderHigh, - IN BYTE DrvHead, - IN BYTE Command, - OUT BYTE *Buffer); -static NTSTATUS STDCALL IDEDispatchOpenClose(IN PDEVICE_OBJECT pDO, IN PIRP Irp); -static NTSTATUS STDCALL IDEDispatchReadWrite(IN PDEVICE_OBJECT pDO, IN PIRP Irp); -static NTSTATUS STDCALL IDEDispatchDeviceControl(IN PDEVICE_OBJECT pDO, IN PIRP Irp); -static VOID STDCALL IDEStartIo(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); -static IO_ALLOCATION_ACTION STDCALL -IDEAllocateController(IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PVOID MapRegisterBase, - IN PVOID Ccontext); -static BOOLEAN STDCALL -IDEStartController(IN OUT PVOID Context); -VOID IDEBeginControllerReset(PIDE_CONTROLLER_EXTENSION ControllerExtension); -static BOOLEAN STDCALL IDEIsr(IN PKINTERRUPT Interrupt, IN PVOID ServiceContext); -static VOID IDEDpcForIsr(IN PKDPC Dpc, - IN PDEVICE_OBJECT DpcDeviceObject, - IN PIRP DpcIrp, - IN PVOID DpcContext); -static VOID IDEFinishOperation(PIDE_CONTROLLER_EXTENSION ControllerExtension); -static VOID STDCALL IDEIoTimer(PDEVICE_OBJECT DeviceObject, PVOID Context); - -// ---------------------------------------------------------------- Inlines - -void -IDESwapBytePairs(char *Buf, - int Cnt) -{ - char t; - int i; - - for (i = 0; i < Cnt; i += 2) - { - t = Buf[i]; - Buf[i] = Buf[i+1]; - Buf[i+1] = t; - } -} - -// ------------------------------------------------------- Public Interface - -// DriverEntry -// -// DESCRIPTION: -// This function initializes the driver, locates and claims -// hardware resources, and creates various NT objects needed -// to process I/O requests. -// -// RUN LEVEL: -// PASSIVE_LEVEL -// -// ARGUMENTS: -// IN PDRIVER_OBJECT DriverObject System allocated Driver Object -// for this driver -// IN PUNICODE_STRING RegistryPath Name of registry driver service -// key -// -// RETURNS: -// NTSTATUS - -STDCALL NTSTATUS -DriverEntry(IN PDRIVER_OBJECT DriverObject, - IN PUNICODE_STRING RegistryPath) -{ - NTSTATUS Status; - - DPRINT("IDE Driver %s\n", VERSION); - - /* Export other driver entry points... */ - DriverObject->DriverStartIo = IDEStartIo; - DriverObject->MajorFunction[IRP_MJ_CREATE] = (PDRIVER_DISPATCH)IDEDispatchOpenClose; - DriverObject->MajorFunction[IRP_MJ_CLOSE] = (PDRIVER_DISPATCH)IDEDispatchOpenClose; - DriverObject->MajorFunction[IRP_MJ_READ] = (PDRIVER_DISPATCH)IDEDispatchReadWrite; - DriverObject->MajorFunction[IRP_MJ_WRITE] = (PDRIVER_DISPATCH)IDEDispatchReadWrite; -// DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] = (PDRIVER_DISPATCH)IDEDispatchQueryInformation; -// DriverObject->MajorFunction[IRP_MJ_SET_INFORMATION] = (PDRIVER_DISPATCH)IDEDispatchSetInformation; - DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = (PDRIVER_DISPATCH)IDEDispatchDeviceControl; - - Status = IdeFindControllers(DriverObject); - if (NT_SUCCESS(Status)) - { - IDEInitialized = TRUE; - } - - return(Status); -} - -// ---------------------------------------------------- Discardable statics - -static NTSTATUS -IdeFindControllers(IN PDRIVER_OBJECT DriverObject) -{ - PCI_COMMON_CONFIG PciConfig; - ULONG Bus; - ULONG Slot; - ULONG Size; - NTSTATUS ReturnedStatus = STATUS_NO_SUCH_DEVICE; - NTSTATUS Status; - INT ControllerIdx = 0; - PCONFIGURATION_INFORMATION ConfigInfo; - - DPRINT("IdeFindControllers() called!\n"); - - ConfigInfo = IoGetConfigurationInformation(); - - /* Search PCI busses for IDE controllers */ - for (Bus = 0; Bus < 8; Bus++) - { - for (Slot = 0; Slot < 256; Slot++) - { - Size = HalGetBusData(PCIConfiguration, - Bus, - Slot, - &PciConfig, - sizeof(PCI_COMMON_CONFIG)); - if (Size != 0) - { - if ((PciConfig.BaseClass == 0x01) && - (PciConfig.SubClass == 0x01)) - { - DPRINT("IDE controller found!\n"); - - DPRINT("Bus %1lu Device %2lu Func %1lu VenID 0x%04hx DevID 0x%04hx\n", - Bus, - Slot>>3, - Slot & 0x07, - PciConfig.VendorID, - PciConfig.DeviceID); - if ((PciConfig.HeaderType & 0x7FFFFFFF) == 0) - { - DPRINT(" IPR 0x%X ILR 0x%X\n", - PciConfig.u.type0.InterruptPin, - PciConfig.u.type0.InterruptLine); - } - - if (PciConfig.ProgIf & 0x01) - { - DPRINT("Primary channel: PCI native mode\n"); - } - else - { - DPRINT("Primary channel: Compatibility mode\n"); - if (ConfigInfo->AtDiskPrimaryAddressClaimed == FALSE) - { - Status = IdeCreateController(DriverObject, - &Controllers[0], - ControllerIdx); - if (NT_SUCCESS(Status)) - { - ControllerIdx++; - ConfigInfo->AtDiskPrimaryAddressClaimed = TRUE; - ConfigInfo->ScsiPortCount++; - ReturnedStatus = Status; - } - } - else - { - /* - * FIXME: Switch controller to native pci mode - * if it is programmable. - */ - } - } - if (PciConfig.ProgIf & 0x02) - { - DPRINT("Primary channel: programmable\n"); - } - else - { - DPRINT("Primary channel: not programmable\n"); - } - -#ifdef ENABLE_SECONDARY_IDE_CHANNEL - if (PciConfig.ProgIf & 0x04) - { - DPRINT("Secondary channel: PCI native mode\n"); - } - else - { - DPRINT("Secondary channel: Compatibility mode\n"); - if (ConfigInfo->AtDiskSecondaryAddressClaimed == FALSE) - { - Status = IdeCreateController(DriverObject, - &Controllers[1], - ControllerIdx); - if (NT_SUCCESS(Status)) - { - ControllerIdx++; - ConfigInfo->AtDiskSecondaryAddressClaimed = TRUE; - ConfigInfo->ScsiPortCount++; - ReturnedStatus = Status; - } - } - else - { - /* - * FIXME: Switch controller to native pci mode - * if it is programmable. - */ - } - } - if (PciConfig.ProgIf & 0x08) - { - DPRINT("Secondary channel: programmable\n"); - } - else - { - DPRINT("Secondary channel: not programmable\n"); - } - - if (PciConfig.ProgIf & 0x80) - { - DPRINT("Master IDE device: 1\n"); - } - else - { - DPRINT("Master IDE device: 0\n"); - } - - for (i = 0; i < PCI_TYPE0_ADDRESSES; i++) - { - DPRINT("BaseAddress: 0x%08X\n", PciConfig.u.type0.BaseAddresses[i]); - } -#endif - } - } - } - } - - /* Search for ISA IDE controller if no primary controller was found */ - if (ConfigInfo->AtDiskPrimaryAddressClaimed == FALSE) - { - DPRINT("Searching for primary ISA IDE controller!\n"); - - if (IDEResetController(Controllers[0].CommandPortBase, - Controllers[0].ControlPortBase)) - { - Status = IdeCreateController(DriverObject, - &Controllers[0], - 0); - if (NT_SUCCESS(Status)) - { - DPRINT(" Found primary ISA IDE controller!\n"); - ControllerIdx++; - ConfigInfo->AtDiskPrimaryAddressClaimed = TRUE; - ConfigInfo->ScsiPortCount++; - ReturnedStatus = Status; - } - } - } - - /* Search for ISA IDE controller if no secondary controller was found */ -#ifdef ENABLE_SECONDARY_IDE_CHANNEL - if (ConfigInfo->AtDiskSecondaryAddressClaimed == FALSE) - { - DPRINT("Searching for secondary ISA IDE controller!\n"); - - if (IDEResetController(Controllers[1].CommandPortBase, - Controllers[1].ControlPortBase)) - { - Status = IdeCreateController(DriverObject, - &Controllers[1], - 1); - if (NT_SUCCESS(Status)) - { - DPRINT(" Found secondary ISA IDE controller!\n"); - ControllerIdx++; - ConfigInfo->AtDiskSecondaryAddressClaimed = TRUE; - ConfigInfo->ScsiPortCount++; - ReturnedStatus = Status; - } - } - } -#endif - - DPRINT("IdeFindControllers() done!\n"); - - return(ReturnedStatus); -} - - -// IdeCreateController -// -// DESCRIPTION: -// Creates a controller object and a device object for each valid -// device on the controller -// -// RUN LEVEL: -// PASSIVE LEVEL -// -// ARGUMENTS: -// IN PDRIVER_OBJECT DriverObject The system created driver object -// IN PIDE_CONTROLLER_PARAMETERS The parameter block for this -// ControllerParams controller -// IN int ControllerIdx The index of this controller -// -// RETURNS: -// TRUE Devices where found on this controller -// FALSE The controller does not respond or there are no devices on it -// - -static NTSTATUS -IdeCreateController(IN PDRIVER_OBJECT DriverObject, - IN PIDE_CONTROLLER_PARAMETERS ControllerParams, - IN int ControllerIdx) -{ - BOOLEAN CreatedDevices, ThisDriveExists; - int DriveIdx; - NTSTATUS RC; - PCONTROLLER_OBJECT ControllerObject; - PIDE_CONTROLLER_EXTENSION ControllerExtension; - ULONG MappedIrq; - KIRQL Dirql; - KAFFINITY Affinity; - - ControllerObject = IoCreateController(sizeof(IDE_CONTROLLER_EXTENSION)); - if (ControllerObject == NULL) - { - DbgPrint ("Could not create controller object for controller %d\n", - ControllerIdx); - return STATUS_NO_SUCH_DEVICE; - } - - MappedIrq = HalGetInterruptVector(Isa, - 0, - ControllerParams->Vector, - ControllerParams->Vector, - &Dirql, - &Affinity); - - // Fill out Controller extension data - ControllerExtension = (PIDE_CONTROLLER_EXTENSION) - ControllerObject->ControllerExtension; - ControllerExtension->Number = ControllerIdx; - ControllerExtension->CommandPortBase = ControllerParams->CommandPortBase; - ControllerExtension->ControlPortBase = ControllerParams->ControlPortBase; - ControllerExtension->Vector = MappedIrq; - ControllerExtension->DMASupported = FALSE; - ControllerExtension->ControllerInterruptBug = FALSE; - ControllerExtension->OperationInProgress = FALSE; - - // Initialize the spin lock in the controller extension - KeInitializeSpinLock(&ControllerExtension->SpinLock); - - // Register an interrupt handler for this controller - RC = IoConnectInterrupt(&ControllerExtension->Interrupt, - IDEIsr, - ControllerExtension, - &ControllerExtension->SpinLock, - ControllerExtension->Vector, - Dirql, - Dirql, - ControllerParams->InterruptMode, - FALSE, - Affinity, - FALSE); - if (!NT_SUCCESS(RC)) - { - DbgPrint ("Could not Connect Interrupt %d\n", - ControllerExtension->Vector); - IoDeleteController (ControllerObject); - return RC; - } - -/* TEST */ - IDEInitialized = TRUE; - - // Create device objects for each raw device (and for partitions) - CreatedDevices = FALSE; - for (DriveIdx = 0; DriveIdx < IDE_MAX_DRIVES; DriveIdx++) - { - ThisDriveExists = IDECreateDevices(DriverObject, - ControllerObject, - ControllerExtension, - DriveIdx, - ControllerIdx * 2 + DriveIdx); - if (ThisDriveExists) - { - CreatedDevices = TRUE; - } - } - - if (!CreatedDevices) - { - DbgPrint ("Did not find any devices for controller %d\n", - ControllerIdx); - IoDisconnectInterrupt (ControllerExtension->Interrupt); - IoDeleteController (ControllerObject); - } - else - { - IDEResetController(ControllerParams->CommandPortBase, - ControllerParams->ControlPortBase); - IoStartTimer(ControllerExtension->TimerDevice); - } - - return((CreatedDevices == TRUE)?STATUS_SUCCESS:STATUS_NO_SUCH_DEVICE); -} - - -// IDEResetController -// -// DESCRIPTION: -// Reset the controller and report completion status -// -// RUN LEVEL: -// PASSIVE_LEVEL -// -// ARGUMENTS: -// IN WORD CommandPort The address of the command port -// IN WORD ControlPort The address of the control port -// -// RETURNS: -// - -BOOLEAN -IDEResetController(IN WORD CommandPort, - IN WORD ControlPort) -{ - int Retries; - - // Assert drive reset line - IDEWriteDriveControl(ControlPort, IDE_DC_SRST); - - // Wait for min. 25 microseconds - KeStallExecutionProcessor(IDE_RESET_PULSE_LENGTH); - - // Negate drive reset line - IDEWriteDriveControl(ControlPort, 0); - - // Wait for BUSY negation - for (Retries = 0; Retries < IDE_RESET_BUSY_TIMEOUT * 1000; Retries++) - { - if (!(IDEReadStatus(CommandPort) & IDE_SR_BUSY)) - { - break; - } - KeStallExecutionProcessor(10); - } - CHECKPOINT; - if (Retries >= IDE_RESET_BUSY_TIMEOUT * 1000) - { - return FALSE; - } - CHECKPOINT; - // return TRUE if controller came back to life. and - // the registers are initialized correctly - return IDEReadError(CommandPort) == 1; -} - - -// IDECreateDevices -// -// DESCRIPTION: -// Create the raw device and any partition devices on this drive -// -// RUN LEVEL: -// PASSIVE_LEVEL -// -// ARGUMENTS: -// IN PDRIVER_OBJECT DriverObject The system created driver object -// IN PCONTROLLER_OBJECT ControllerObject -// IN PIDE_CONTROLLER_EXTENSION ControllerExtension -// The IDE controller extension for -// this device -// IN int DriveIdx The index of the drive on this -// controller -// IN int HarddiskIdx The NT device number for this -// drive -// -// RETURNS: -// TRUE Drive exists and devices were created -// FALSE no devices were created for this device -// - -BOOLEAN -IDECreateDevices(IN PDRIVER_OBJECT DriverObject, - IN PCONTROLLER_OBJECT ControllerObject, - IN PIDE_CONTROLLER_EXTENSION ControllerExtension, - IN int DriveIdx, - IN int HarddiskIdx) -{ - WCHAR NameBuffer[IDE_MAX_NAME_LENGTH]; - int CommandPort; - NTSTATUS Status; - IDE_DRIVE_IDENTIFY DrvParms; - PDEVICE_OBJECT DiskDeviceObject; - PDEVICE_OBJECT PartitionDeviceObject; - UNICODE_STRING UnicodeDeviceDirName; - OBJECT_ATTRIBUTES DeviceDirAttributes; - HANDLE Handle; - ULONG SectorCount = 0; - PDRIVE_LAYOUT_INFORMATION PartitionList = NULL; - PPARTITION_INFORMATION PartitionEntry; - ULONG i; - - /* Copy I/O port offsets for convenience */ - CommandPort = ControllerExtension->CommandPortBase; -// ControlPort = ControllerExtension->ControlPortBase; - DPRINT("probing IDE controller %d Addr %04lx Drive %d\n", - ControllerExtension->Number, - CommandPort, - DriveIdx); - - /* Get the Drive Identification Data */ - if (!IDEGetDriveIdentification(CommandPort, DriveIdx, &DrvParms)) - { - DPRINT("No ATA drive %d found on controller %d...\n", - DriveIdx, - ControllerExtension->Number); - return(FALSE); - } - - DPRINT("Found ATA drive %d on controller %d...\n", - DriveIdx, - ControllerExtension->Number); - - /* Create the harddisk device directory */ - swprintf (NameBuffer, - L"\\Device\\Harddisk%d", - HarddiskIdx); - RtlInitUnicodeString(&UnicodeDeviceDirName, - NameBuffer); - InitializeObjectAttributes(&DeviceDirAttributes, - &UnicodeDeviceDirName, - 0, - NULL, - NULL); - Status = ZwCreateDirectoryObject(&Handle, 0, &DeviceDirAttributes); - if (!NT_SUCCESS(Status)) - { - DbgPrint("Could not create device dir object\n"); - return(FALSE); - } - - /* Create the disk device */ - if (DrvParms.Capabilities & IDE_DRID_LBA_SUPPORTED) - { - SectorCount = - (ULONG)((DrvParms.TMSectorCountHi << 16) + DrvParms.TMSectorCountLo); - } - else - { - SectorCount = - (ULONG)(DrvParms.LogicalCyls * DrvParms.LogicalHeads * DrvParms.SectorsPerTrack); - } - DPRINT("SectorCount %lu\n", SectorCount); - - Status = IDECreateDiskDevice(DriverObject, - &DiskDeviceObject, - ControllerObject, - DriveIdx, - HarddiskIdx, - &DrvParms, - SectorCount); - if (!NT_SUCCESS(Status)) - { - DbgPrint("IDECreateDevice call failed for raw device\n"); - return FALSE; - } - - /* Increase number of available physical disk drives */ - IoGetConfigurationInformation()->DiskCount++; - - /* - * Initialize the controller timer here - * (since it has to be tied to a device) - */ - if (DriveIdx == 0) - { - ControllerExtension->TimerState = IDETimerIdle; - ControllerExtension->TimerCount = 0; - ControllerExtension->TimerDevice = DiskDeviceObject; - IoInitializeTimer(DiskDeviceObject, - IDEIoTimer, - ControllerExtension); - } - - DPRINT("DrvParms.BytesPerSector %ld\n",DrvParms.BytesPerSector); - - /* Read partition table */ - Status = IoReadPartitionTable(DiskDeviceObject, - DrvParms.BytesPerSector, - TRUE, - &PartitionList); - if (!NT_SUCCESS(Status)) - { - DbgPrint("IoReadPartitionTable() failed\n"); - return FALSE; - } - - DPRINT(" Number of partitions: %u\n", PartitionList->PartitionCount); - for (i=0;i < PartitionList->PartitionCount; i++) - { - PartitionEntry = &PartitionList->PartitionEntry[i]; - - DPRINT("Partition %02ld: nr: %d boot: %1x type: %x offset: %I64d size: %I64d\n", - i, - PartitionEntry->PartitionNumber, - PartitionEntry->BootIndicator, - PartitionEntry->PartitionType, - PartitionEntry->StartingOffset.QuadPart / DrvParms.BytesPerSector, - PartitionEntry->PartitionLength.QuadPart / DrvParms.BytesPerSector); - - /* Create device for partition */ - Status = IDECreatePartitionDevice(DriverObject, - &PartitionDeviceObject, - ControllerObject, - DiskDeviceObject->DeviceExtension, - DriveIdx, - HarddiskIdx, - &DrvParms, - PartitionEntry); - if (!NT_SUCCESS(Status)) - { - DbgPrint("IDECreateDevice() failed\n"); - break; - } - } - - if (PartitionList != NULL) - ExFreePool(PartitionList); - - return TRUE; -} - -// IDEGetDriveIdentification -// -// DESCRIPTION: -// Get the identification block from the drive -// -// RUN LEVEL: -// PASSIVE_LEVEL -// -// ARGUMENTS: -// IN int CommandPort Address of the command port -// IN int DriveNum The drive index (0,1) -// OUT PIDE_DRIVE_IDENTIFY DrvParms Address to write drive ident block -// -// RETURNS: -// TRUE The drive identification block was retrieved successfully -// - -static BOOLEAN -IDEGetDriveIdentification(IN int CommandPort, - IN int DriveNum, - OUT PIDE_DRIVE_IDENTIFY DrvParms) -{ - - /* Get the Drive Identify block from drive or die */ - if (IDEPolledRead(CommandPort, 0, 1, 0, 0, 0, (DriveNum ? IDE_DH_DRV1 : 0), - IDE_CMD_IDENT_DRV, (BYTE *)DrvParms) != 0) - { - return(FALSE); - } - - /* Report on drive parameters if debug mode */ - IDESwapBytePairs(DrvParms->SerialNumber, 20); - IDESwapBytePairs(DrvParms->FirmwareRev, 8); - IDESwapBytePairs(DrvParms->ModelNumber, 40); - DPRINT("Config:%04x Cyls:%5d Heads:%2d Sectors/Track:%3d Gaps:%02d %02d\n", - DrvParms->ConfigBits, - DrvParms->LogicalCyls, - DrvParms->LogicalHeads, - DrvParms->SectorsPerTrack, - DrvParms->InterSectorGap, - DrvParms->InterSectorGapSize); - DPRINT("Bytes/PLO:%3d Vendor Cnt:%2d Serial number:[%.20s]\n", - DrvParms->BytesInPLO, - DrvParms->VendorUniqueCnt, - DrvParms->SerialNumber); - DPRINT("Cntlr type:%2d BufSiz:%5d ECC bytes:%3d Firmware Rev:[%.8s]\n", - DrvParms->ControllerType, - DrvParms->BufferSize * IDE_SECTOR_BUF_SZ, - DrvParms->ECCByteCnt, - DrvParms->FirmwareRev); - DPRINT("Model:[%.40s]\n", DrvParms->ModelNumber); - DPRINT("RWMult?:%02x LBA:%d DMA:%d MinPIO:%d ns MinDMA:%d ns\n", - (DrvParms->RWMultImplemented) & 0xff, - (DrvParms->Capabilities & IDE_DRID_LBA_SUPPORTED) ? 1 : 0, - (DrvParms->Capabilities & IDE_DRID_DMA_SUPPORTED) ? 1 : 0, - DrvParms->MinPIOTransTime, - DrvParms->MinDMATransTime); - DPRINT("TM:Cyls:%d Heads:%d Sectors/Trk:%d Capacity:%ld\n", - DrvParms->TMCylinders, - DrvParms->TMHeads, - DrvParms->TMSectorsPerTrk, - (ULONG)(DrvParms->TMCapacityLo + (DrvParms->TMCapacityHi << 16))); - DPRINT("TM:SectorCount: 0x%04x%04x = %lu\n", - DrvParms->TMSectorCountHi, - DrvParms->TMSectorCountLo, - (ULONG)((DrvParms->TMSectorCountHi << 16) + DrvParms->TMSectorCountLo)); - - /* - * Fix default ATA sector size. - * Attention: Default ATAPI sector size is 2048 bytes!! - */ - DPRINT("BytesPerSector %d\n", DrvParms->BytesPerSector); - DrvParms->BytesPerSector = 512; - DPRINT("BytesPerSector %d\n", DrvParms->BytesPerSector); - - return(TRUE); -} - - -// IDECreateDiskDevice -// -// DESCRIPTION: -// Creates the disk device object -// -// RUN LEVEL: -// PASSIVE_LEVEL -// -// ARGUMENTS: -// IN PDRIVER_OBJECT DriverObject The system supplied driver object -// OUT PDEVICE_OBJECT *DeviceObject The created device object -// IN PCONTROLLER_OBJECT ControllerObject The Controller for the device -// IN BOOLEAN LBASupported Does the drive support LBA addressing? -// IN BOOLEAN DMASupported Does the drive support DMA? -// IN int SectorsPerLogCyl Sectors per cylinder -// IN int SectorsPerLogTrk Sectors per track -// IN DWORD Offset First valid sector for this device -// IN DWORD Size Count of valid sectors for this device -// -// RETURNS: -// NTSTATUS -// - -NTSTATUS -IDECreateDiskDevice(IN PDRIVER_OBJECT DriverObject, - OUT PDEVICE_OBJECT *DeviceObject, - IN PCONTROLLER_OBJECT ControllerObject, - IN int UnitNumber, - IN ULONG DiskNumber, - IN PIDE_DRIVE_IDENTIFY DrvParms, - IN ULONG SectorCount) -{ - WCHAR NameBuffer[IDE_MAX_NAME_LENGTH]; - UNICODE_STRING DeviceName; - NTSTATUS RC; - PIDE_DEVICE_EXTENSION DeviceExtension; - - /* Create a unicode device name */ - swprintf(NameBuffer, - L"\\Device\\Harddisk%d\\Partition0", - DiskNumber); - RtlInitUnicodeString(&DeviceName, - NameBuffer); - - /* Create the device */ - RC = IoCreateDevice(DriverObject, - sizeof(IDE_DEVICE_EXTENSION), - &DeviceName, - FILE_DEVICE_DISK, - 0, - TRUE, - DeviceObject); - if (!NT_SUCCESS(RC)) - { - DbgPrint("IoCreateDevice call failed\n"); - return(RC); - } - - /* Set the buffering strategy here... */ - (*DeviceObject)->Flags |= DO_DIRECT_IO; - (*DeviceObject)->AlignmentRequirement = FILE_WORD_ALIGNMENT; - - /* Fill out Device extension data */ - DeviceExtension = (PIDE_DEVICE_EXTENSION) (*DeviceObject)->DeviceExtension; - DeviceExtension->DeviceObject = (*DeviceObject); - DeviceExtension->ControllerObject = ControllerObject; - DeviceExtension->DiskDeviceExtension = DeviceExtension; - DeviceExtension->UnitNumber = UnitNumber; - DeviceExtension->LBASupported = - (DrvParms->Capabilities & IDE_DRID_LBA_SUPPORTED) ? 1 : 0; - DeviceExtension->DMASupported = - (DrvParms->Capabilities & IDE_DRID_DMA_SUPPORTED) ? 1 : 0; - DeviceExtension->BytesPerSector = DrvParms->BytesPerSector; - DeviceExtension->SectorsPerLogCyl = - DrvParms->LogicalHeads * DrvParms->SectorsPerTrack; - DeviceExtension->SectorsPerLogTrk = DrvParms->SectorsPerTrack; - DeviceExtension->LogicalHeads = DrvParms->LogicalHeads; - DeviceExtension->LogicalCylinders = - (DrvParms->Capabilities & IDE_DRID_LBA_SUPPORTED) ? DrvParms->TMCylinders : DrvParms->LogicalCyls; - - DeviceExtension->StartingOffset.QuadPart = 0; - DeviceExtension->PartitionLength.QuadPart = (ULONGLONG)SectorCount * - (ULONGLONG)DrvParms->BytesPerSector; - DeviceExtension->HiddenSectors = 0; - DeviceExtension->PartitionNumber = 0; - DeviceExtension->PartitionType = 0; - DeviceExtension->BootIndicator = FALSE; - - DPRINT("%wZ: offset %I64d length %I64d\n", - &DeviceName, - DeviceExtension->StartingOffset.QuadPart, - DeviceExtension->PartitionLength.QuadPart); - - /* Initialize the DPC object here */ - IoInitializeDpcRequest(*DeviceObject, - IDEDpcForIsr); - - return RC; -} - - -// IDECreatePartitionDevice -// -// DESCRIPTION: -// Creates a partition device object -// -// RUN LEVEL: -// PASSIVE_LEVEL -// -// ARGUMENTS: -// IN PDRIVER_OBJECT DriverObject The system supplied driver object -// OUT PDEVICE_OBJECT *DeviceObject The created device object -// IN PCONTROLLER_OBJECT ControllerObject The Controller for the device -// IN BOOLEAN LBASupported Does the drive support LBA addressing? -// IN BOOLEAN DMASupported Does the drive support DMA? -// IN int SectorsPerLogCyl Sectors per cylinder -// IN int SectorsPerLogTrk Sectors per track -// IN DWORD Offset First valid sector for this device -// IN DWORD Size Count of valid sectors for this device -// -// RETURNS: -// NTSTATUS -// - -NTSTATUS -IDECreatePartitionDevice(IN PDRIVER_OBJECT DriverObject, - OUT PDEVICE_OBJECT *DeviceObject, - IN PCONTROLLER_OBJECT ControllerObject, - IN PVOID DiskDeviceExtension, - IN int UnitNumber, - IN ULONG DiskNumber, - IN PIDE_DRIVE_IDENTIFY DrvParms, - IN PPARTITION_INFORMATION PartitionInfo) -{ - WCHAR NameBuffer[IDE_MAX_NAME_LENGTH]; - UNICODE_STRING DeviceName; - NTSTATUS RC; - PIDE_DEVICE_EXTENSION DeviceExtension; - - /* Create a unicode device name */ - swprintf(NameBuffer, - L"\\Device\\Harddisk%d\\Partition%d", - DiskNumber, - PartitionInfo->PartitionNumber); - RtlInitUnicodeString(&DeviceName, - NameBuffer); - - /* Create the device */ - RC = IoCreateDevice(DriverObject, sizeof(IDE_DEVICE_EXTENSION), - &DeviceName, FILE_DEVICE_DISK, 0, TRUE, DeviceObject); - if (!NT_SUCCESS(RC)) - { - DbgPrint ("IoCreateDevice call failed\n"); - return RC; - } - - /* Set the buffering strategy here... */ - (*DeviceObject)->Flags |= DO_DIRECT_IO; - (*DeviceObject)->AlignmentRequirement = FILE_WORD_ALIGNMENT; - - /* Fill out Device extension data */ - DeviceExtension = (PIDE_DEVICE_EXTENSION)(*DeviceObject)->DeviceExtension; - DeviceExtension->DeviceObject = (*DeviceObject); - DeviceExtension->ControllerObject = ControllerObject; - DeviceExtension->DiskDeviceExtension = DiskDeviceExtension; - DeviceExtension->UnitNumber = UnitNumber; - DeviceExtension->LBASupported = - (DrvParms->Capabilities & IDE_DRID_LBA_SUPPORTED) ? 1 : 0; - DeviceExtension->DMASupported = - (DrvParms->Capabilities & IDE_DRID_DMA_SUPPORTED) ? 1 : 0; - DeviceExtension->BytesPerSector = DrvParms->BytesPerSector; - DeviceExtension->SectorsPerLogCyl = DrvParms->LogicalHeads * - DrvParms->SectorsPerTrack; - DeviceExtension->SectorsPerLogTrk = DrvParms->SectorsPerTrack; - DeviceExtension->LogicalHeads = DrvParms->LogicalHeads; - DeviceExtension->LogicalCylinders = - (DrvParms->Capabilities & IDE_DRID_LBA_SUPPORTED) ? DrvParms->TMCylinders : DrvParms->LogicalCyls; - - DeviceExtension->StartingOffset = PartitionInfo->StartingOffset; - DeviceExtension->PartitionLength = PartitionInfo->PartitionLength; - DeviceExtension->HiddenSectors = PartitionInfo->HiddenSectors; - DeviceExtension->PartitionNumber = PartitionInfo->PartitionNumber; - DeviceExtension->PartitionType = PartitionInfo->PartitionType; - DeviceExtension->BootIndicator = PartitionInfo->BootIndicator; - - DPRINT("%wZ: offset %I64d size %I64d\n", - &DeviceName, - DeviceExtension->StartingOffset.QuadPart, - DeviceExtension->PartitionLength.QuadPart); - - /* Initialize the DPC object here */ - IoInitializeDpcRequest(*DeviceObject, IDEDpcForIsr); - - DPRINT("%wZ %I64dMB\n", - &DeviceName, - DeviceExtension->PartitionLength.QuadPart >> 20); - - return RC; -} - - -// IDEPolledRead -// -// DESCRIPTION: -// Read a sector of data from the drive in a polled fashion. -// -// RUN LEVEL: -// PASSIVE_LEVEL -// -// ARGUMENTS: -// IN WORD Address Address of command port for drive -// IN BYTE PreComp Value to write to precomp register -// IN BYTE SectorCnt Value to write to sectorCnt register -// IN BYTE SectorNum Value to write to sectorNum register -// IN BYTE CylinderLow Value to write to CylinderLow register -// IN BYTE CylinderHigh Value to write to CylinderHigh register -// IN BYTE DrvHead Value to write to Drive/Head register -// IN BYTE Command Value to write to Command register -// OUT BYTE *Buffer Buffer for output data -// -// RETURNS: -// int 0 is success, non 0 is an error code -// - -static int -IDEPolledRead(IN WORD Address, - IN BYTE PreComp, - IN BYTE SectorCnt, - IN BYTE SectorNum, - IN BYTE CylinderLow, - IN BYTE CylinderHigh, - IN BYTE DrvHead, - IN BYTE Command, - OUT BYTE *Buffer) -{ - BYTE Status; - int RetryCount; - BOOLEAN ReadJunk = FALSE; - ULONG SectorCount = 0; - - /* Wait for STATUS.BUSY and STATUS.DRQ to clear */ - for (RetryCount = 0; RetryCount < IDE_MAX_BUSY_RETRIES; RetryCount++) - { - Status = IDEReadStatus(Address); - if (!(Status & IDE_SR_BUSY) && !(Status & IDE_SR_DRQ)) - { - break; - } - KeStallExecutionProcessor(10); - } - if (RetryCount == IDE_MAX_BUSY_RETRIES) - { - return IDE_ER_ABRT; - } - - /* Write Drive/Head to select drive */ - IDEWriteDriveHead(Address, IDE_DH_FIXED | DrvHead); - - /* Wait for STATUS.BUSY and STATUS.DRQ to clear */ - for (RetryCount = 0; RetryCount < IDE_MAX_BUSY_RETRIES; RetryCount++) - { - Status = IDEReadStatus(Address); - if (!(Status & IDE_SR_BUSY) && !(Status & IDE_SR_DRQ)) - { - break; - } - KeStallExecutionProcessor(10); - } - if (RetryCount == IDE_MAX_BUSY_RETRIES) - { - return IDE_ER_ABRT; - } - - /* Issue command to drive */ - if (DrvHead & IDE_DH_LBA) - { - DPRINT("READ:DRV=%d:LBA=1:BLK=%08d:SC=%02x:CM=%02x\n", - DrvHead & IDE_DH_DRV1 ? 1 : 0, - ((DrvHead & 0x0f) << 24) + (CylinderHigh << 16) + (CylinderLow << 8) + SectorNum, - SectorCnt, - Command); - } - else - { - DPRINT("READ:DRV=%d:LBA=0:CH=%02x:CL=%02x:HD=%01x:SN=%02x:SC=%02x:CM=%02x\n", - DrvHead & IDE_DH_DRV1 ? 1 : 0, - CylinderHigh, - CylinderLow, - DrvHead & 0x0f, - SectorNum, - SectorCnt, - Command); - } - - /* Setup command parameters */ - IDEWritePrecomp(Address, PreComp); - IDEWriteSectorCount(Address, SectorCnt); - IDEWriteSectorNum(Address, SectorNum); - IDEWriteCylinderHigh(Address, CylinderHigh); - IDEWriteCylinderLow(Address, CylinderLow); - IDEWriteDriveHead(Address, IDE_DH_FIXED | DrvHead); - - /* Issue the command */ - IDEWriteCommand(Address, Command); - KeStallExecutionProcessor(50); - - /* wait for DRQ or error */ - for (RetryCount = 0; RetryCount < IDE_MAX_POLL_RETRIES; RetryCount++) - { - Status = IDEReadStatus(Address); - if (!(Status & IDE_SR_BUSY)) - { - if (Status & IDE_SR_ERR) - { - DPRINT("IDE_SR_ERR asserted!\n"); - } - if ((Status & IDE_SR_DRQ) && !(Status & IDE_SR_ERR)) - { - break; - } - else - { - return IDE_ER_ABRT; - } - } - KeStallExecutionProcessor(10); - } - if (RetryCount >= IDE_MAX_POLL_RETRIES) - { - return IDE_ER_ABRT; - } - - while (1) - { - /* Read data into buffer */ - if (ReadJunk == TRUE) - { - UCHAR JunkBuffer[IDE_SECTOR_BUF_SZ]; - IDEReadBlock(Address, JunkBuffer, IDE_SECTOR_BUF_SZ); - } - else - { - IDEReadBlock(Address, Buffer, IDE_SECTOR_BUF_SZ); - Buffer += IDE_SECTOR_BUF_SZ; - } - SectorCount++; - - /* Check for more sectors to read */ - for (RetryCount = 0; RetryCount < IDE_MAX_BUSY_RETRIES; RetryCount++) - { - Status = IDEReadStatus(Address); - if (!(Status & IDE_SR_BUSY)) - { - if (Status & IDE_SR_ERR) - { - DPRINT("IDE_SR_ERR asserted!\n"); - } - if (Status & IDE_SR_DRQ) - { - if (SectorCount >= SectorCnt) - ReadJunk = TRUE; - break; - } - else - { - return 0; - } - } - } - } -} - -// ------------------------------------------- Nondiscardable statics - -// IDEDispatchOpenClose -// -// DESCRIPTION: -// Answer requests for Open/Close calls: a null operation -// -// RUN LEVEL: -// PASSIVE_LEVEL -// -// ARGUMENTS: -// Standard dispatch arguments -// -// RETURNS: -// NTSTATUS -// - -static NTSTATUS STDCALL -IDEDispatchOpenClose(IN PDEVICE_OBJECT pDO, - IN PIRP Irp) -{ - Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = FILE_OPENED; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - - return STATUS_SUCCESS; -} - -// IDEDispatchReadWrite -// -// DESCRIPTION: -// Answer requests for reads and writes -// -// RUN LEVEL: -// PASSIVE_LEVEL -// -// ARGUMENTS: -// Standard dispatch arguments -// -// RETURNS: -// NTSTATUS -// - -static NTSTATUS STDCALL -IDEDispatchReadWrite(IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp) -{ - ULONG IrpInsertKey; - LARGE_INTEGER AdjustedOffset, AdjustedExtent, PartitionExtent, InsertKeyLI; - PIO_STACK_LOCATION IrpStack; - PIDE_DEVICE_EXTENSION DeviceExtension; - - IrpStack = IoGetCurrentIrpStackLocation(Irp); - DeviceExtension = (PIDE_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - // Validate operation parameters - AdjustedOffset.QuadPart = DeviceExtension->StartingOffset.QuadPart + - IrpStack->Parameters.Read.ByteOffset.QuadPart; - DPRINT("AdjustedOffset: %I64x\n", AdjustedOffset.QuadPart); - - AdjustedExtent.QuadPart = AdjustedOffset.QuadPart + - (ULONGLONG)IrpStack->Parameters.Read.Length; - DPRINT("AdjustedExtent: %I64x\n", AdjustedExtent.QuadPart); - - PartitionExtent.QuadPart = DeviceExtension->StartingOffset.QuadPart + - DeviceExtension->PartitionLength.QuadPart; - DPRINT("PartitionExtent: %I64x\n", PartitionExtent.QuadPart); - - if ((AdjustedExtent.QuadPart > PartitionExtent.QuadPart) || - (IrpStack->Parameters.Read.Length & (DeviceExtension->BytesPerSector - 1))) - { - DPRINT("Request failed on bad parameters\n",0); - DPRINT("AdjustedExtent=%I64x PartitionExtent=%I64x ReadLength=%lx\n", - AdjustedExtent.QuadPart, - PartitionExtent.QuadPart, - IrpStack->Parameters.Read.Length); - Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return STATUS_INVALID_PARAMETER; - } - - // Adjust operation to absolute sector offset - IrpStack->Parameters.Read.ByteOffset = AdjustedOffset; - - // Start the packet and insert the request in order of sector offset - assert(DeviceExtension->BytesPerSector == 512); - InsertKeyLI.QuadPart = IrpStack->Parameters.Read.ByteOffset.QuadPart >> 9; - IrpInsertKey = InsertKeyLI.u.LowPart; - IoStartPacket(DeviceObject, Irp, &IrpInsertKey, NULL); - - DPRINT("Returning STATUS_PENDING\n"); - return STATUS_PENDING; -} - -// IDEDispatchDeviceControl -// -// DESCRIPTION: -// Answer requests for device control calls -// -// RUN LEVEL: -// PASSIVE_LEVEL -// -// ARGUMENTS: -// Standard dispatch arguments -// -// RETURNS: -// NTSTATUS -// - -static NTSTATUS STDCALL -IDEDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp) -{ - NTSTATUS RC; - ULONG ControlCode, InputLength, OutputLength; - PIO_STACK_LOCATION IrpStack; - PIDE_DEVICE_EXTENSION DeviceExtension; - PIDE_DEVICE_EXTENSION DiskDeviceExtension; - CCHAR Increment; - - RC = STATUS_SUCCESS; - IrpStack = IoGetCurrentIrpStackLocation(Irp); - ControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode; - InputLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength; - OutputLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength; - DeviceExtension = (PIDE_DEVICE_EXTENSION) DeviceObject->DeviceExtension; - DiskDeviceExtension = (PIDE_DEVICE_EXTENSION)DeviceExtension->DiskDeviceExtension; - Increment = IO_NO_INCREMENT; - - // A huge switch statement in a Windows program?! who would have thought? - switch (ControlCode) - { - case IOCTL_DISK_GET_DRIVE_GEOMETRY: - if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(DISK_GEOMETRY)) - { - Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; - } - else - { - PDISK_GEOMETRY Geometry; - - Geometry = (PDISK_GEOMETRY) Irp->AssociatedIrp.SystemBuffer; - - Geometry->MediaType = FixedMedia; - Geometry->Cylinders.QuadPart = DiskDeviceExtension->LogicalCylinders; - Geometry->TracksPerCylinder = DiskDeviceExtension->SectorsPerLogCyl / - DiskDeviceExtension->SectorsPerLogTrk; - Geometry->SectorsPerTrack = DiskDeviceExtension->SectorsPerLogTrk; - Geometry->BytesPerSector = DiskDeviceExtension->BytesPerSector; -DPRINT("DiskDeviceExtension->BytesPerSector %lu\n", DiskDeviceExtension->BytesPerSector); - Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = sizeof(DISK_GEOMETRY); - } - break; - - case IOCTL_DISK_GET_PARTITION_INFO: - DPRINT("IOCTL_DISK_GET_PARTITION_INFO\n"); - if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength < - sizeof(PARTITION_INFORMATION)) - { - Irp->IoStatus.Status = STATUS_INFO_LENGTH_MISMATCH; - } - else if (DeviceExtension->PartitionNumber == 0) - { - Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; - } - else - { - PPARTITION_INFORMATION PartitionInfo; - - PartitionInfo = (PPARTITION_INFORMATION)Irp->AssociatedIrp.SystemBuffer; - - PartitionInfo->PartitionType = DeviceExtension->PartitionType; - PartitionInfo->StartingOffset = DeviceExtension->StartingOffset; - PartitionInfo->PartitionLength = DeviceExtension->PartitionLength; - PartitionInfo->HiddenSectors = DeviceExtension->HiddenSectors; - PartitionInfo->PartitionNumber = DeviceExtension->PartitionNumber; - PartitionInfo->BootIndicator = DeviceExtension->BootIndicator; - PartitionInfo->RewritePartition = FALSE; - PartitionInfo->RecognizedPartition = - IsRecognizedPartition(DeviceExtension->PartitionType); - - Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = sizeof(PARTITION_INFORMATION); - } - break; - - case IOCTL_DISK_SET_PARTITION_INFO: - RC = STATUS_INVALID_DEVICE_REQUEST; - Irp->IoStatus.Status = RC; - Irp->IoStatus.Information = 0; - break; - - case IOCTL_DISK_GET_DRIVE_LAYOUT: - if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength < - sizeof(DRIVE_LAYOUT_INFORMATION)) - { - Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; - } - else - { - PDRIVE_LAYOUT_INFORMATION PartitionList; - - RC = IoReadPartitionTable(DiskDeviceExtension->DeviceObject, - DiskDeviceExtension->BytesPerSector, - FALSE, - &PartitionList); - if (!NT_SUCCESS(RC)) - { - Irp->IoStatus.Status = RC; - } - else - { - ULONG BufferSize; - - BufferSize = FIELD_OFFSET(DRIVE_LAYOUT_INFORMATION, - PartitionEntry[0]); - BufferSize += PartitionList->PartitionCount * sizeof(PARTITION_INFORMATION); - - if (BufferSize > IrpStack->Parameters.DeviceIoControl.OutputBufferLength) - { - Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; - } - else - { - RtlMoveMemory(Irp->AssociatedIrp.SystemBuffer, - PartitionList, - BufferSize); - Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = BufferSize; - } - ExFreePool(PartitionList); - } - } - Increment = IO_DISK_INCREMENT; - break; - - case IOCTL_DISK_SET_DRIVE_LAYOUT: - case IOCTL_DISK_VERIFY: - case IOCTL_DISK_FORMAT_TRACKS: - case IOCTL_DISK_PERFORMANCE: - case IOCTL_DISK_IS_WRITABLE: - case IOCTL_DISK_LOGGING: - case IOCTL_DISK_FORMAT_TRACKS_EX: - case IOCTL_DISK_HISTOGRAM_STRUCTURE: - case IOCTL_DISK_HISTOGRAM_DATA: - case IOCTL_DISK_HISTOGRAM_RESET: - case IOCTL_DISK_REQUEST_STRUCTURE: - case IOCTL_DISK_REQUEST_DATA: - - // If we get here, something went wrong. inform the requestor - default: - RC = STATUS_INVALID_DEVICE_REQUEST; - Irp->IoStatus.Status = RC; - Irp->IoStatus.Information = 0; - break; - } - - IoCompleteRequest(Irp, Increment); - - return RC; -} - -// IDEStartIo -// -// DESCRIPTION: -// Get the next requested I/O packet started -// -// RUN LEVEL: -// DISPATCH_LEVEL -// -// ARGUMENTS: -// Dispatch routine standard arguments -// -// RETURNS: -// NTSTATUS -// - -static VOID -STDCALL IDEStartIo(IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp) -{ - LARGE_INTEGER SectorLI; - PIO_STACK_LOCATION IrpStack; - PIDE_DEVICE_EXTENSION DeviceExtension; - KIRQL OldIrql; - - DPRINT("IDEStartIo() called!\n"); - - IrpStack = IoGetCurrentIrpStackLocation(Irp); - DeviceExtension = (PIDE_DEVICE_EXTENSION) DeviceObject->DeviceExtension; - - // FIXME: implement the supported functions - - switch (IrpStack->MajorFunction) - { - case IRP_MJ_READ: - case IRP_MJ_WRITE: - DeviceExtension->Operation = IrpStack->MajorFunction; - DeviceExtension->BytesRequested = IrpStack->Parameters.Read.Length; - assert(DeviceExtension->BytesPerSector == 512); - SectorLI = RtlLargeIntegerShiftRight(IrpStack->Parameters.Read.ByteOffset, 9); - DeviceExtension->StartingSector = SectorLI.u.LowPart; - if (DeviceExtension->BytesRequested > DeviceExtension->BytesPerSector * - IDE_MAX_SECTORS_PER_XFER) - { - DeviceExtension->BytesToTransfer = DeviceExtension->BytesPerSector * - IDE_MAX_SECTORS_PER_XFER; - } - else - { - DeviceExtension->BytesToTransfer = DeviceExtension->BytesRequested; - } - DeviceExtension->BytesRequested -= DeviceExtension->BytesToTransfer; - DeviceExtension->SectorsTransferred = 0; - DeviceExtension->TargetAddress = (BYTE *)MmGetSystemAddressForMdl(Irp->MdlAddress); - KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); - IoAllocateController(DeviceExtension->ControllerObject, - DeviceObject, - IDEAllocateController, - NULL); - KeLowerIrql(OldIrql); - break; - - default: - Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; - Irp->IoStatus.Information = 0; - KEBUGCHECK((ULONG)Irp); - IoCompleteRequest(Irp, IO_NO_INCREMENT); - IoStartNextPacket(DeviceObject, FALSE); - break; - } - DPRINT("IDEStartIo() finished!\n"); -} - -// IDEAllocateController - -static IO_ALLOCATION_ACTION STDCALL -IDEAllocateController(IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PVOID MapRegisterBase, - IN PVOID Ccontext) -{ - PIDE_DEVICE_EXTENSION DeviceExtension; - PIDE_CONTROLLER_EXTENSION ControllerExtension; - - DeviceExtension = (PIDE_DEVICE_EXTENSION) DeviceObject->DeviceExtension; - ControllerExtension = (PIDE_CONTROLLER_EXTENSION) - DeviceExtension->ControllerObject->ControllerExtension; - ControllerExtension->CurrentIrp = Irp; - ControllerExtension->Retries = 0; - return KeSynchronizeExecution(ControllerExtension->Interrupt, - IDEStartController, - DeviceExtension) ? KeepObject : - DeallocateObject; -} - -// IDEStartController - -BOOLEAN STDCALL -IDEStartController(IN OUT PVOID Context) -{ - BYTE SectorCnt, SectorNum, CylinderLow, CylinderHigh; - BYTE DrvHead, Command; - BYTE Status; - int Retries; - ULONG StartingSector; - PIDE_DEVICE_EXTENSION DeviceExtension; - PIDE_CONTROLLER_EXTENSION ControllerExtension; - PIRP Irp; - - DeviceExtension = (PIDE_DEVICE_EXTENSION) Context; - ControllerExtension = (PIDE_CONTROLLER_EXTENSION) - DeviceExtension->ControllerObject->ControllerExtension; - ControllerExtension->OperationInProgress = TRUE; - ControllerExtension->DeviceForOperation = DeviceExtension; - - // Write controller registers to start opteration - StartingSector = DeviceExtension->StartingSector; - SectorCnt = DeviceExtension->BytesToTransfer / - DeviceExtension->BytesPerSector; - if (DeviceExtension->LBASupported) - { - SectorNum = StartingSector & 0xff; - CylinderLow = (StartingSector >> 8) & 0xff; - CylinderHigh = (StartingSector >> 16) & 0xff; - DrvHead = ((StartingSector >> 24) & 0x0f) | - (DeviceExtension->UnitNumber ? IDE_DH_DRV1 : 0) | - IDE_DH_LBA; - } - else - { - SectorNum = (StartingSector % DeviceExtension->SectorsPerLogTrk) + 1; - StartingSector /= DeviceExtension->SectorsPerLogTrk; - DrvHead = (StartingSector % DeviceExtension->LogicalHeads) | - (DeviceExtension->UnitNumber ? IDE_DH_DRV1 : 0); - StartingSector /= DeviceExtension->LogicalHeads; - CylinderLow = StartingSector & 0xff; - CylinderHigh = StartingSector >> 8; - } - Command = DeviceExtension->Operation == IRP_MJ_READ ? - IDE_CMD_READ : IDE_CMD_WRITE; - if (DrvHead & IDE_DH_LBA) - { - DPRINT("%s:BUS=%04x:DRV=%d:LBA=1:BLK=%08d:SC=%02x:CM=%02x\n", - DeviceExtension->Operation == IRP_MJ_READ ? "READ" : "WRITE", - ControllerExtension->CommandPortBase, - DrvHead & IDE_DH_DRV1 ? 1 : 0, - ((DrvHead & 0x0f) << 24) + - (CylinderHigh << 16) + (CylinderLow << 8) + SectorNum, - SectorCnt, - Command); - } - else - { - DPRINT("%s:BUS=%04x:DRV=%d:LBA=0:CH=%02x:CL=%02x:HD=%01x:SN=%02x:SC=%02x:CM=%02x\n", - DeviceExtension->Operation == IRP_MJ_READ ? "READ" : "WRITE", - ControllerExtension->CommandPortBase, - DrvHead & IDE_DH_DRV1 ? 1 : 0, - CylinderHigh, - CylinderLow, - DrvHead & 0x0f, - SectorNum, - SectorCnt, - Command); - } - - /* wait for BUSY to clear */ - for (Retries = 0; Retries < IDE_MAX_BUSY_RETRIES; Retries++) - { - Status = IDEReadStatus(ControllerExtension->CommandPortBase); - if (!(Status & IDE_SR_BUSY)) - { - break; - } - KeStallExecutionProcessor(10); - } - DPRINT ("status=%02x\n", Status); - DPRINT ("waited %ld usecs for busy to clear\n", Retries * 10); - if (Retries >= IDE_MAX_BUSY_RETRIES) - { - DPRINT ("Drive is BUSY for too long\n"); - if (++ControllerExtension->Retries > IDE_MAX_CMD_RETRIES) - { - DbgPrint ("Max Retries on Drive reset reached, returning failure\n"); - Irp = ControllerExtension->CurrentIrp; - Irp->IoStatus.Status = STATUS_DISK_OPERATION_FAILED; - Irp->IoStatus.Information = 0; - - return FALSE; - } - else - { - DPRINT ("Beginning drive reset sequence\n"); - IDEBeginControllerReset(ControllerExtension); - - return TRUE; - } - } - - /* Select the desired drive */ - IDEWriteDriveHead(ControllerExtension->CommandPortBase, IDE_DH_FIXED | DrvHead); - - /* wait for BUSY to clear and DRDY to assert */ - for (Retries = 0; Retries < IDE_MAX_BUSY_RETRIES; Retries++) - { - Status = IDEReadStatus(ControllerExtension->CommandPortBase); -// if (!(Status & IDE_SR_BUSY) && (Status & IDE_SR_DRDY)) - if (!(Status & IDE_SR_BUSY) && !(Status & IDE_SR_DRQ)) - { - break; - } - KeStallExecutionProcessor(10); - } - DPRINT ("waited %ld usecs for busy to clear after drive select\n", Retries * 10); - if (Retries >= IDE_MAX_BUSY_RETRIES) - { - DPRINT ("Drive is BUSY for too long after drive select\n"); - if (ControllerExtension->Retries++ > IDE_MAX_CMD_RETRIES) - { - DbgPrint ("Max Retries on Drive reset reached, returning failure\n"); - Irp = ControllerExtension->CurrentIrp; - Irp->IoStatus.Status = STATUS_DISK_OPERATION_FAILED; - Irp->IoStatus.Information = 0; - - return FALSE; - } - else - { - DPRINT ("Beginning drive reset sequence\n"); - IDEBeginControllerReset(ControllerExtension); - - return TRUE; - } - } - - /* Setup command parameters */ - IDEWritePrecomp(ControllerExtension->CommandPortBase, 0); - IDEWriteSectorCount(ControllerExtension->CommandPortBase, SectorCnt); - IDEWriteSectorNum(ControllerExtension->CommandPortBase, SectorNum); - IDEWriteCylinderHigh(ControllerExtension->CommandPortBase, CylinderHigh); - IDEWriteCylinderLow(ControllerExtension->CommandPortBase, CylinderLow); - IDEWriteDriveHead(ControllerExtension->CommandPortBase, IDE_DH_FIXED | DrvHead); - - /* Issue command to drive */ - IDEWriteCommand(ControllerExtension->CommandPortBase, Command); - ControllerExtension->TimerState = IDETimerCmdWait; - ControllerExtension->TimerCount = IDE_CMD_TIMEOUT; - - if (DeviceExtension->Operation == IRP_MJ_WRITE) - { - - // Wait for controller ready - for (Retries = 0; Retries < IDE_MAX_WRITE_RETRIES; Retries++) - { - BYTE Status = IDEReadStatus(ControllerExtension->CommandPortBase); - if (!(Status & IDE_SR_BUSY) || (Status & IDE_SR_ERR)) - { - break; - } - KeStallExecutionProcessor(10); - } - if (Retries >= IDE_MAX_BUSY_RETRIES) - { - if (ControllerExtension->Retries++ > IDE_MAX_CMD_RETRIES) - { - Irp = ControllerExtension->CurrentIrp; - Irp->IoStatus.Status = STATUS_DISK_OPERATION_FAILED; - Irp->IoStatus.Information = 0; - - return FALSE; - } - else - { - IDEBeginControllerReset(ControllerExtension); - - return TRUE; - } - } - - // Load the first sector of data into the controller - IDEWriteBlock(ControllerExtension->CommandPortBase, - DeviceExtension->TargetAddress, - IDE_SECTOR_BUF_SZ); - DeviceExtension->TargetAddress += IDE_SECTOR_BUF_SZ; - DeviceExtension->BytesToTransfer -= DeviceExtension->BytesPerSector; - DeviceExtension->SectorsTransferred++; - } - DPRINT ("Command issued to drive, IDEStartController done\n"); - - return TRUE; -} - -// IDEBeginControllerReset - -VOID -IDEBeginControllerReset(PIDE_CONTROLLER_EXTENSION ControllerExtension) -{ - int Retries; - - DPRINT("Controller Reset initiated on %04x\n", - ControllerExtension->ControlPortBase); - - /* Assert drive reset line */ - DPRINT("Asserting reset line\n"); - IDEWriteDriveControl(ControllerExtension->ControlPortBase, IDE_DC_SRST); - - /* Wait for BSY assertion */ - DPRINT("Waiting for BSY assertion\n"); - for (Retries = 0; Retries < IDE_MAX_RESET_RETRIES; Retries++) - { - BYTE Status = IDEReadStatus(ControllerExtension->CommandPortBase); - if ((Status & IDE_SR_BUSY)) - { - break; - } - KeStallExecutionProcessor(10); - } - if (Retries == IDE_MAX_RESET_RETRIES) - { - DPRINT("Timeout on BSY assertion\n"); - } - - /* Negate drive reset line */ - DPRINT("Negating reset line\n"); - IDEWriteDriveControl(ControllerExtension->ControlPortBase, 0); - - // FIXME: handle case of no device 0 - - /* Set timer to check for end of reset */ - ControllerExtension->TimerState = IDETimerResetWaitForBusyNegate; - ControllerExtension->TimerCount = IDE_RESET_BUSY_TIMEOUT; -} - -// IDEIsr -// -// DESCIPTION: -// Handle interrupts for IDE devices -// -// RUN LEVEL: -// DIRQL -// -// ARGUMENTS: -// IN PKINTERRUPT Interrupt The interrupt level in effect -// IN PVOID ServiceContext The driver supplied context -// (the controller extension) -// RETURNS: -// TRUE This ISR handled the interrupt -// FALSE Another ISR must handle this interrupt - -static BOOLEAN STDCALL -IDEIsr(IN PKINTERRUPT Interrupt, - IN PVOID ServiceContext) -{ - BOOLEAN IsLastBlock, AnErrorOccured, RequestIsComplete; - BYTE *TargetAddress; - int Retries; - NTSTATUS ErrorStatus; - ULONG ErrorInformation; - PIRP Irp; - PIDE_DEVICE_EXTENSION DeviceExtension; - PIDE_CONTROLLER_EXTENSION ControllerExtension; - - if (IDEInitialized == FALSE) - { - return FALSE; - } - DPRINT ("IDEIsr called\n"); - - ControllerExtension = (PIDE_CONTROLLER_EXTENSION) ServiceContext; - - // Read the status port to clear the interrtupt (even if it's not ours). - ControllerExtension->DeviceStatus = IDEReadStatus(ControllerExtension->CommandPortBase); - - // If the interrupt is not ours, get the heck outta dodge. - if (!ControllerExtension->OperationInProgress) - { - return FALSE; - } - - DeviceExtension = ControllerExtension->DeviceForOperation; - IsLastBlock = FALSE; - AnErrorOccured = FALSE; - RequestIsComplete = FALSE; - ErrorStatus = STATUS_SUCCESS; - ErrorInformation = 0; - - // Handle error condition if it exists - if (ControllerExtension->DeviceStatus & IDE_SR_ERR) - { - BYTE ErrorReg, SectorCount, SectorNum, CylinderLow, CylinderHigh; - BYTE DriveHead; - - // Log the error - ErrorReg = IDEReadError(ControllerExtension->CommandPortBase); - CylinderLow = IDEReadCylinderLow(ControllerExtension->CommandPortBase); - CylinderHigh = IDEReadCylinderHigh(ControllerExtension->CommandPortBase); - DriveHead = IDEReadDriveHead(ControllerExtension->CommandPortBase); - SectorCount = IDEReadSectorCount(ControllerExtension->CommandPortBase); - SectorNum = IDEReadSectorNum(ControllerExtension->CommandPortBase); - // FIXME: should use the NT error logging facility - DbgPrint ("IDE Error: OP:%02x STAT:%02x ERR:%02x CYLLO:%02x CYLHI:%02x SCNT:%02x SNUM:%02x\n", - DeviceExtension->Operation, - ControllerExtension->DeviceStatus, - ErrorReg, - CylinderLow, - CylinderHigh, - SectorCount, - SectorNum); - - // FIXME: should retry the command and perhaps recalibrate the drive - - // Set error status information - AnErrorOccured = TRUE; - ErrorStatus = STATUS_DISK_OPERATION_FAILED; - ErrorInformation = - (((((((CylinderHigh << 8) + CylinderLow) * - DeviceExtension->LogicalHeads) + - (DriveHead % DeviceExtension->LogicalHeads)) * - DeviceExtension->SectorsPerLogTrk) + SectorNum - 1) - - DeviceExtension->StartingSector) * DeviceExtension->BytesPerSector; - } - else - { - - // Check controller and setup for next transfer - switch (DeviceExtension->Operation) - { - case IRP_MJ_READ: - - // Update controller/device state variables - TargetAddress = DeviceExtension->TargetAddress; - DeviceExtension->TargetAddress += DeviceExtension->BytesPerSector; - DeviceExtension->BytesToTransfer -= DeviceExtension->BytesPerSector; - DeviceExtension->SectorsTransferred++; - - // Remember whether DRQ should be low at end (last block read) - IsLastBlock = DeviceExtension->BytesToTransfer == 0; - - // Wait for DRQ assertion - for (Retries = 0; Retries < IDE_MAX_DRQ_RETRIES && - !(IDEReadStatus(ControllerExtension->CommandPortBase) & IDE_SR_DRQ); - Retries++) - { - KeStallExecutionProcessor(10); - } - - // Copy the block of data - IDEReadBlock(ControllerExtension->CommandPortBase, - TargetAddress, - IDE_SECTOR_BUF_SZ); - - // check DRQ - if (IsLastBlock) - { - for (Retries = 0; Retries < IDE_MAX_BUSY_RETRIES && - (IDEReadStatus(ControllerExtension->CommandPortBase) & IDE_SR_BUSY); - Retries++) - { - KeStallExecutionProcessor(10); - } - - // Check for data overrun - if (IDEReadStatus(ControllerExtension->CommandPortBase) & IDE_SR_DRQ) - { - AnErrorOccured = TRUE; - ErrorStatus = STATUS_DATA_OVERRUN; - ErrorInformation = 0; - } - else - { - - // Setup next transfer or set RequestIsComplete - if (DeviceExtension->BytesRequested > - DeviceExtension->BytesPerSector * IDE_MAX_SECTORS_PER_XFER) - { - DeviceExtension->StartingSector += DeviceExtension->SectorsTransferred; - DeviceExtension->SectorsTransferred = 0; - DeviceExtension->BytesToTransfer = - DeviceExtension->BytesPerSector * IDE_MAX_SECTORS_PER_XFER; - DeviceExtension->BytesRequested -= DeviceExtension->BytesToTransfer; - } - else if (DeviceExtension->BytesRequested > 0) - { - DeviceExtension->StartingSector += DeviceExtension->SectorsTransferred; - DeviceExtension->SectorsTransferred = 0; - DeviceExtension->BytesToTransfer = DeviceExtension->BytesRequested; - DeviceExtension->BytesRequested -= DeviceExtension->BytesToTransfer; - } - else - { - RequestIsComplete = TRUE; - } - } - } - break; - - case IRP_MJ_WRITE: - - // check DRQ - if (DeviceExtension->BytesToTransfer == 0) - { - for (Retries = 0; Retries < IDE_MAX_BUSY_RETRIES && - (IDEReadStatus(ControllerExtension->CommandPortBase) & IDE_SR_BUSY); - Retries++) - { - KeStallExecutionProcessor(10); - } - - // Check for data overrun - if (IDEReadStatus(ControllerExtension->CommandPortBase) & IDE_SR_DRQ) - { - AnErrorOccured = TRUE; - ErrorStatus = STATUS_DATA_OVERRUN; - ErrorInformation = 0; - } - else - { - - // Setup next transfer or set RequestIsComplete - IsLastBlock = TRUE; - if (DeviceExtension->BytesRequested > - DeviceExtension->BytesPerSector * IDE_MAX_SECTORS_PER_XFER) - { - DeviceExtension->StartingSector += DeviceExtension->SectorsTransferred; - DeviceExtension->SectorsTransferred = 0; - DeviceExtension->BytesToTransfer = - DeviceExtension->BytesPerSector * IDE_MAX_SECTORS_PER_XFER; - DeviceExtension->BytesRequested -= DeviceExtension->BytesToTransfer; - } - else if (DeviceExtension->BytesRequested > 0) - { - DeviceExtension->StartingSector += DeviceExtension->SectorsTransferred; - DeviceExtension->SectorsTransferred = 0; - DeviceExtension->BytesToTransfer = DeviceExtension->BytesRequested; - DeviceExtension->BytesRequested -= DeviceExtension->BytesToTransfer; - } - else - { - RequestIsComplete = TRUE; - } - } - } - else - { - - // Update controller/device state variables - TargetAddress = DeviceExtension->TargetAddress; - DeviceExtension->TargetAddress += DeviceExtension->BytesPerSector; - DeviceExtension->BytesToTransfer -= DeviceExtension->BytesPerSector; - DeviceExtension->SectorsTransferred++; - - // Write block to controller - IDEWriteBlock(ControllerExtension->CommandPortBase, - TargetAddress, - IDE_SECTOR_BUF_SZ); - } - break; - } - } - - // If there was an error or the request is done, complete the packet - if (AnErrorOccured || RequestIsComplete) - { - // Set the return status and info values - Irp = ControllerExtension->CurrentIrp; - Irp->IoStatus.Status = ErrorStatus; - Irp->IoStatus.Information = ErrorInformation; - - // Clear out controller fields - ControllerExtension->OperationInProgress = FALSE; - ControllerExtension->DeviceStatus = 0; - - // Queue the Dpc to finish up - IoRequestDpc(DeviceExtension->DeviceObject, - Irp, - ControllerExtension); - } - else if (IsLastBlock) - { - // Else more data is needed, setup next device I/O - IDEStartController((PVOID)DeviceExtension); - } - - return TRUE; -} - -// IDEDpcForIsr -// DESCRIPTION: -// -// RUN LEVEL: -// -// ARGUMENTS: -// IN PKDPC Dpc -// IN PDEVICE_OBJECT DpcDeviceObject -// IN PIRP DpcIrp -// IN PVOID DpcContext -// -static VOID -IDEDpcForIsr(IN PKDPC Dpc, - IN PDEVICE_OBJECT DpcDeviceObject, - IN PIRP DpcIrp, - IN PVOID DpcContext) -{ - DPRINT("IDEDpcForIsr()\n"); - IDEFinishOperation((PIDE_CONTROLLER_EXTENSION) DpcContext); -} - -// IDEFinishOperation - -static VOID -IDEFinishOperation(PIDE_CONTROLLER_EXTENSION ControllerExtension) -{ - PIDE_DEVICE_EXTENSION DeviceExtension; - PIRP Irp; - ULONG Operation; - - DeviceExtension = ControllerExtension->DeviceForOperation; - Irp = ControllerExtension->CurrentIrp; - Operation = DeviceExtension->Operation; - ControllerExtension->OperationInProgress = FALSE; - ControllerExtension->DeviceForOperation = 0; - ControllerExtension->CurrentIrp = 0; - - // Deallocate the controller - IoFreeController(DeviceExtension->ControllerObject); - - // Start the next packet - IoStartNextPacketByKey(DeviceExtension->DeviceObject, - FALSE, - DeviceExtension->StartingSector); - - // Flush cache if necessary - if (Operation == IRP_MJ_READ) - { - KeFlushIoBuffers(Irp->MdlAddress, TRUE, FALSE); - } - // Issue completion of the current packet - // return status information too - Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = DeviceExtension->SectorsTransferred * DeviceExtension->BytesPerSector; - IoCompleteRequest(Irp, IO_DISK_INCREMENT); -} - -// IDEIoTimer -// DESCRIPTION: -// This function handles timeouts and other time delayed processing -// -// RUN LEVEL: -// -// ARGUMENTS: -// IN PDEVICE_OBJECT DeviceObject Device object registered with timer -// IN PVOID Context the Controller extension for the -// controller the device is on -// -static VOID STDCALL -IDEIoTimer(PDEVICE_OBJECT DeviceObject, - PVOID Context) -{ - PIDE_CONTROLLER_EXTENSION ControllerExtension; - - // Setup Extension pointer - ControllerExtension = (PIDE_CONTROLLER_EXTENSION) Context; - DPRINT("Timer activated for %04lx\n", ControllerExtension->CommandPortBase); - - // Handle state change if necessary - switch (ControllerExtension->TimerState) - { - case IDETimerResetWaitForBusyNegate: - if (!(IDEReadStatus(ControllerExtension->CommandPortBase) & - IDE_SR_BUSY)) - { - DPRINT("Busy line has negated, waiting for DRDY assert\n"); - ControllerExtension->TimerState = IDETimerResetWaitForDrdyAssert; - ControllerExtension->TimerCount = IDE_RESET_DRDY_TIMEOUT; - return; - } - break; - - case IDETimerResetWaitForDrdyAssert: - if (IDEReadStatus(ControllerExtension->CommandPortBase) & - IDE_SR_DRQ) - { - DPRINT("DRDY has asserted, reset complete\n"); - ControllerExtension->TimerState = IDETimerIdle; - ControllerExtension->TimerCount = 0; - - // FIXME: get diagnostic code from drive 0 - - /* Start current packet command again */ - if (!KeSynchronizeExecution(ControllerExtension->Interrupt, - IDEStartController, - ControllerExtension->DeviceForOperation)) - { - IDEFinishOperation(ControllerExtension); - } - return; - } - break; - - default: - break; - } - - // If we're counting down, then count. - if (ControllerExtension->TimerCount > 0) - { - ControllerExtension->TimerCount--; - - // Else we'll check the state and process if necessary - } - else - { - switch (ControllerExtension->TimerState) - { - case IDETimerIdle: - break; - - case IDETimerCmdWait: - /* Command timed out, reset drive and try again or fail */ - DPRINT("Timeout waiting for command completion\n"); - if (++ControllerExtension->Retries > IDE_MAX_CMD_RETRIES) - { - if (ControllerExtension->CurrentIrp != NULL) - { - DbgPrint ("Max retries has been reached, IRP finished with error\n"); - ControllerExtension->CurrentIrp->IoStatus.Status = STATUS_IO_TIMEOUT; - ControllerExtension->CurrentIrp->IoStatus.Information = 0; - IDEFinishOperation(ControllerExtension); - } - ControllerExtension->TimerState = IDETimerIdle; - ControllerExtension->TimerCount = 0; - } - else - { - IDEBeginControllerReset(ControllerExtension); - } - break; - - case IDETimerResetWaitForBusyNegate: - case IDETimerResetWaitForDrdyAssert: - if (ControllerExtension->CurrentIrp != NULL) - { - DbgPrint ("Timeout waiting for drive reset, giving up on IRP\n"); - ControllerExtension->CurrentIrp->IoStatus.Status = - STATUS_IO_TIMEOUT; - ControllerExtension->CurrentIrp->IoStatus.Information = 0; - IDEFinishOperation(ControllerExtension); - } - ControllerExtension->TimerState = IDETimerIdle; - ControllerExtension->TimerCount = 0; - break; - } - } -} - - diff --git a/reactos/drivers/dd/ide/ide.h b/reactos/drivers/dd/ide/ide.h deleted file mode 100644 index 9ad89a2cc6a..00000000000 --- a/reactos/drivers/dd/ide/ide.h +++ /dev/null @@ -1,256 +0,0 @@ -// -// IDE.H - defines and typedefs for the IDE Driver module. -// - -#ifndef __IDE_H -#define __IDE_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define IDE_MAXIMUM_DEVICES 8 - -#define IDE_MAX_NAME_LENGTH 50 - -#define IDE_SECTOR_BUF_SZ 512 -#define IDE_MAX_SECTORS_PER_XFER 256 -#define IDE_MAX_RESET_RETRIES 10000 -#define IDE_MAX_POLL_RETRIES 100000 -#define IDE_MAX_WRITE_RETRIES 1000 -#define IDE_MAX_BUSY_RETRIES 50000 -#define IDE_MAX_DRQ_RETRIES 10000 -//#define IDE_MAX_CMD_RETRIES 1 -#define IDE_MAX_CMD_RETRIES 0 -#define IDE_CMD_TIMEOUT 5 -#define IDE_RESET_PULSE_LENGTH 500 /* maybe a little too long */ -#define IDE_RESET_BUSY_TIMEOUT 120 -#define IDE_RESET_DRDY_TIMEOUT 120 - -// Control Block offsets and masks -#define IDE_REG_ALT_STATUS 0x0000 -#define IDE_REG_DEV_CNTRL 0x0000 /* device control register */ -#define IDE_DC_SRST 0x04 /* drive reset (both drives) */ -#define IDE_DC_nIEN 0x02 /* IRQ enable (active low) */ -#define IDE_REG_DRV_ADDR 0x0001 - -// Command Block offsets and masks -#define IDE_REG_DATA_PORT 0x0000 -#define IDE_REG_ERROR 0x0001 /* error register */ -#define IDE_ER_AMNF 0x01 /* addr mark not found */ -#define IDE_ER_TK0NF 0x02 /* track 0 not found */ -#define IDE_ER_ABRT 0x04 /* command aborted */ -#define IDE_ER_MCR 0x08 /* media change requested */ -#define IDE_ER_IDNF 0x10 /* ID not found */ -#define IDE_ER_MC 0x20 /* Media changed */ -#define IDE_ER_UNC 0x40 /* Uncorrectable data error */ -#define IDE_REG_PRECOMP 0x0001 -#define IDE_REG_SECTOR_CNT 0x0002 -#define IDE_REG_SECTOR_NUM 0x0003 -#define IDE_REG_CYL_LOW 0x0004 -#define IDE_REG_CYL_HIGH 0x0005 -#define IDE_REG_DRV_HEAD 0x0006 -#define IDE_DH_FIXED 0xA0 -#define IDE_DH_LBA 0x40 -#define IDE_DH_HDMASK 0x0F -#define IDE_DH_DRV0 0x00 -#define IDE_DH_DRV1 0x10 -#define IDE_REG_STATUS 0x0007 -#define IDE_SR_BUSY 0x80 -#define IDE_SR_DRDY 0x40 -#define IDE_SR_DRQ 0x08 -#define IDE_SR_ERR 0x01 -#define IDE_REG_COMMAND 0x0007 -#define IDE_CMD_READ 0x20 -#define IDE_CMD_READ_RETRY 0x21 -#define IDE_CMD_WRITE 0x30 -#define IDE_CMD_WRITE_RETRY 0x31 -#define IDE_CMD_IDENT_DRV 0xEC - -// -// Access macros for command registers -// Each macro takes an address of the command port block, and data -// -#define IDEReadError(Address) \ - (READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_ERROR))) -#define IDEWritePrecomp(Address, Data) \ - (WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_PRECOMP), (Data))) -#define IDEReadSectorCount(Address) \ - (READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_SECTOR_CNT))) -#define IDEWriteSectorCount(Address, Data) \ - (WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_SECTOR_CNT), (Data))) -#define IDEReadSectorNum(Address) \ - (READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_SECTOR_NUM))) -#define IDEWriteSectorNum(Address, Data) \ - (WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_SECTOR_NUM), (Data))) -#define IDEReadCylinderLow(Address) \ - (READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_CYL_LOW))) -#define IDEWriteCylinderLow(Address, Data) \ - (WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_CYL_LOW), (Data))) -#define IDEReadCylinderHigh(Address) \ - (READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_CYL_HIGH))) -#define IDEWriteCylinderHigh(Address, Data) \ - (WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_CYL_HIGH), (Data))) -#define IDEReadDriveHead(Address) \ - (READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_DRV_HEAD))) -#define IDEWriteDriveHead(Address, Data) \ - (WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_DRV_HEAD), (Data))) -#define IDEReadStatus(Address) \ - (READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_STATUS))) -#define IDEWriteCommand(Address, Data) \ - (WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_COMMAND), (Data))) - - -// -// Data block read and write commands -// -#define IDEReadBlock(Address, Buffer, Count) \ - (READ_PORT_BUFFER_USHORT((PUSHORT)((Address) + IDE_REG_DATA_PORT), (PUSHORT)(Buffer), (Count) / 2)) -#define IDEWriteBlock(Address, Buffer, Count) \ - (WRITE_PORT_BUFFER_USHORT((PUSHORT)((Address) + IDE_REG_DATA_PORT), (PUSHORT)(Buffer), (Count) / 2)) - -// -// Access macros for control registers -// Each macro takes an address of the control port blank and data -// -#define IDEWriteDriveControl(Address, Data) \ - (WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_DEV_CNTRL), (Data))) - -// IDE_DEVICE_EXTENSION -// -// DESCRIPTION: -// Extension to be placed in each device object -// -// ACCESS: -// Allocated from NON-PAGED POOL -// Available at any IRQL -// - -typedef struct _IDE_DEVICE_EXTENSION -{ - PDEVICE_OBJECT DeviceObject; - PCONTROLLER_OBJECT ControllerObject; - PVOID DiskDeviceExtension; - int UnitNumber; - BOOLEAN LBASupported; - BOOLEAN DMASupported; - int BytesPerSector; - int LogicalHeads; - int LogicalCylinders; - int SectorsPerLogCyl; - int SectorsPerLogTrk; - - LARGE_INTEGER StartingOffset; - LARGE_INTEGER PartitionLength; - ULONG HiddenSectors; - ULONG PartitionNumber; - UCHAR PartitionType; - BOOLEAN BootIndicator; - - int Operation; - ULONG BytesRequested; - ULONG BytesToTransfer; - ULONG BytesRemaining; - ULONG StartingSector; - int SectorsTransferred; - BYTE *TargetAddress; - -} IDE_DEVICE_EXTENSION, *PIDE_DEVICE_EXTENSION; - -// IDE_TIMER_STATES -// -// DESCRIPTION: -// An enumeration containing the states in the timer DFA -// - -typedef enum _IDE_TIMER_STATES { - IDETimerIdle, - IDETimerCmdWait, - IDETimerResetWaitForBusyNegate, - IDETimerResetWaitForDrdyAssert -} IDE_TIMER_STATES; - -// IDE_CONTROLLER_EXTENSION -// -// DESCRIPTION: -// Driver-defined structure used to hold miscellaneous controller information. -// -// ACCESS: -// Allocated from NON-PAGED POOL -// Available at any IRQL -// - -typedef struct _IDE_CONTROLLER_EXTENSION { - KSPIN_LOCK SpinLock; - int Number; - int Vector; - int CommandPortBase; - int ControlPortBase; - BOOLEAN DMASupported; - BOOLEAN ControllerInterruptBug; - PKINTERRUPT Interrupt; - - BOOLEAN OperationInProgress; - BYTE DeviceStatus; - PIDE_DEVICE_EXTENSION DeviceForOperation; - PIRP CurrentIrp; - int Retries; - - IDE_TIMER_STATES TimerState; - LONG TimerCount; - PDEVICE_OBJECT TimerDevice; - -} IDE_CONTROLLER_EXTENSION, *PIDE_CONTROLLER_EXTENSION; - -// IDE_DRIVE_IDENTIFY - -typedef struct _IDE_DRIVE_IDENTIFY { - WORD ConfigBits; /*00*/ - WORD LogicalCyls; /*01*/ - WORD Reserved02; /*02*/ - WORD LogicalHeads; /*03*/ - WORD BytesPerTrack; /*04*/ - WORD BytesPerSector; /*05*/ - WORD SectorsPerTrack; /*06*/ - BYTE InterSectorGap; /*07*/ - BYTE InterSectorGapSize; - BYTE Reserved08H; /*08*/ - BYTE BytesInPLO; - WORD VendorUniqueCnt; /*09*/ - char SerialNumber[20]; /*10*/ - WORD ControllerType; /*20*/ - WORD BufferSize; /*21*/ - WORD ECCByteCnt; /*22*/ - char FirmwareRev[8]; /*23*/ - char ModelNumber[40]; /*27*/ - WORD RWMultImplemented; /*47*/ - WORD Reserved48; /*48*/ - WORD Capabilities; /*49*/ -#define IDE_DRID_STBY_SUPPORTED 0x2000 -#define IDE_DRID_IORDY_SUPPORTED 0x0800 -#define IDE_DRID_IORDY_DISABLE 0x0400 -#define IDE_DRID_LBA_SUPPORTED 0x0200 -#define IDE_DRID_DMA_SUPPORTED 0x0100 - WORD Reserved50; /*50*/ - WORD MinPIOTransTime; /*51*/ - WORD MinDMATransTime; /*52*/ - WORD TMFieldsValid; /*53*/ - WORD TMCylinders; /*54*/ - WORD TMHeads; /*55*/ - WORD TMSectorsPerTrk; /*56*/ - WORD TMCapacityLo; /*57*/ - WORD TMCapacityHi; /*58*/ - WORD Reserved59; /*59*/ - WORD TMSectorCountLo; /*60*/ - WORD TMSectorCountHi; /*61*/ - WORD Reserved62[194]; /*62*/ -} IDE_DRIVE_IDENTIFY, *PIDE_DRIVE_IDENTIFY; - - -#ifdef __cplusplus -} -#endif - -#endif /* __IDE_H */ - - diff --git a/reactos/drivers/dd/ide/ide.rc b/reactos/drivers/dd/ide/ide.rc deleted file mode 100644 index 5981746c951..00000000000 --- a/reactos/drivers/dd/ide/ide.rc +++ /dev/null @@ -1,39 +0,0 @@ - -#include <defines.h> -#include <reactos/resource.h> - -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", "IDE Disk Device Driver\0" - VALUE "FileVersion", "0.1.4\0" - VALUE "InternalName", "ide\0" - VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT - VALUE "OriginalFilename", "ide.sys\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/drivers/dd/ide/makefile b/reactos/drivers/dd/ide/makefile deleted file mode 100644 index ea15dd78c9f..00000000000 --- a/reactos/drivers/dd/ide/makefile +++ /dev/null @@ -1,19 +0,0 @@ -# $Id: makefile,v 1.27 2003/11/14 17:13:25 weiden Exp $ - -PATH_TO_TOP = ../../.. - -TARGET_TYPE = driver - -TARGET_NAME = ide - -TARGET_CFLAGS = -Wall -Werror - -TARGET_OBJECTS = ide.o - -TARGET_HEADERS = *.h - -TARGET_GCCLIBS = gcc - -include $(PATH_TO_TOP)/rules.mak - -include $(TOOLS_PATH)/helper.mk diff --git a/reactos/drivers/dd/ide/partitio.h b/reactos/drivers/dd/ide/partitio.h deleted file mode 100644 index 06841ee39fa..00000000000 --- a/reactos/drivers/dd/ide/partitio.h +++ /dev/null @@ -1,41 +0,0 @@ -/** -*** Partition.h - defines and structs for harddrive partition info -*** -*** 05/30/98 RJJ Created -**/ - -#ifndef __PARTITION_H -#define __PARTITION_H - -#define PARTITION_MAGIC 0xaa55 -#define PART_MAGIC_OFFSET 0x01fe -#define PARTITION_OFFSET 0x01be -#define PARTITION_TBL_SIZE 4 -#define PTCHSToLBA(c, h, s, scnt, hcnt) ((s) & 0x3f) + \ - (scnt) * ( (h) + (hcnt) * ((c) | (((s) & 0xc0) << 2))) -#define PTLBAToCHS(lba, c, h, s, scnt, hcnt) ( \ - (s) = (lba) % (scnt) + 1, \ - (lba) /= (scnt), \ - (h) = (lba) % (hcnt), \ - (lba) /= (heads), \ - (c) = (lba) & 0xff, \ - (s) |= ((lba) >> 2) & 0xc0) - - -typedef struct Partition { - unsigned char BootFlags; - unsigned char StartingHead; - unsigned char StartingSector; - unsigned char StartingCylinder; - unsigned char PartitionType; - unsigned char EndingHead; - unsigned char EndingSector; - unsigned char EndingCylinder; - unsigned int StartingBlock; - unsigned int SectorCount; - -} PARTITION; - -#endif // PARTITION_H - - From 78f151b9d3ba073c07e6951577cbeb093728ef3f Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Thu, 17 Jun 2004 18:29:44 +0000 Subject: [PATCH 1408/1463] Add missing nls settings for Great Britain. This fixes bug #344. svn path=/trunk/; revision=9700 --- reactos/bootdata/hivesys.inf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/reactos/bootdata/hivesys.inf b/reactos/bootdata/hivesys.inf index a5314abcd2e..895c5699132 100644 --- a/reactos/bootdata/hivesys.inf +++ b/reactos/bootdata/hivesys.inf @@ -18,6 +18,8 @@ HKLM,"SYSTEM\CurrentControlSet\Control\KeyboardLayouts\0000040c","Layout File",0 HKLM,"SYSTEM\CurrentControlSet\Control\KeyboardLayouts\0000040c","Layout Text",0x00000000,"FR" HKLM,"SYSTEM\CurrentControlSet\Control\KeyboardLayouts\0000041d","Layout File",0x00000000,"kbdse.dll" HKLM,"SYSTEM\CurrentControlSet\Control\KeyboardLayouts\0000041d","Layout Text",0x00000000,"SE" +HKLM,"SYSTEM\CurrentControlSet\Control\KeyboardLayouts\00000809","Layout File",0x00000000,"kbduk.dll" +HKLM,"SYSTEM\CurrentControlSet\Control\KeyboardLayouts\00000809","Layout Text",0x00000000,"UK" ; NLS Files HKLM,"SYSTEM\CurrentControlSet\Control\NLS\CodePage","10000",0x00000000,"c_10000.nls" @@ -46,6 +48,7 @@ HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Language","040e",0x00000000,"l_intl.n HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Language","040f",0x00000000,"l_intl.nls" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Language","0410",0x00000000,"l_intl.nls" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Language","041d",0x00000000,"l_intl.nls" +HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Language","0809",0x00000000,"l_intl.nls" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Language","Default",0x00000000,"0409" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Language","InstallLanguage",0x00000000,"0409" From 9ba82f014dae2ef79866a255c5bc26be3ab47b94 Mon Sep 17 00:00:00 2001 From: Gero Kuehn <reactos.filter@gkware.com> Date: Thu, 17 Jun 2004 21:23:50 +0000 Subject: [PATCH 1409/1463] added SetFocus call for the username dialog svn path=/trunk/; revision=9702 --- reactos/lib/syssetup/wizard.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/reactos/lib/syssetup/wizard.c b/reactos/lib/syssetup/wizard.c index 1cab53d1a37..bab00a73051 100644 --- a/reactos/lib/syssetup/wizard.c +++ b/reactos/lib/syssetup/wizard.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: wizard.c,v 1.3 2004/05/22 12:04:10 ekohl Exp $ +/* $Id: wizard.c,v 1.4 2004/06/17 21:23:50 kuehng Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -146,6 +146,9 @@ OwnerPageDlgProc(HWND hwndDlg, SendDlgItemMessage(hwndDlg, IDC_OWNERNAME, EM_LIMITTEXT, 50, 0); SendDlgItemMessage(hwndDlg, IDC_OWNERORGANIZATION, EM_LIMITTEXT, 50, 0); + + /* set focus to owner name */ + SetFocus(GetDlgItem(hwndDlg,IDC_OWNERNAME)); } break; From 80799cc3c818711978b2527e049d25be5cbd361a Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 18 Jun 2004 15:18:58 +0000 Subject: [PATCH 1410/1463] Changelog: - Don't change DC origin in NtGdiOffsetViewportOrgEx - Update transformation matrix in NtGdiSetViewportExtEx, NtGdiSetWindowExtEx, NtGdiSetWindowOrgEx, NtGdiOffsetWindowOrgEx - When creating new DC initialize the Viewport/Window extensions. - Transform logical coordinates to device ones in NtGdiExtTextOut and NtGdiLineTo. svn path=/trunk/; revision=9703 --- reactos/subsys/win32k/objects/coord.c | 9 ++--- reactos/subsys/win32k/objects/dc.c | 10 ++++-- reactos/subsys/win32k/objects/line.c | 48 ++++++++++++--------------- reactos/subsys/win32k/objects/text.c | 12 ++++--- 4 files changed, 41 insertions(+), 38 deletions(-) diff --git a/reactos/subsys/win32k/objects/coord.c b/reactos/subsys/win32k/objects/coord.c index 4fbd1353340..8bc3d35b67a 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.24 2004/06/14 20:58:51 navaraf Exp $ +/* $Id: coord.c,v 1.25 2004/06/18 15:18:54 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -426,9 +426,6 @@ NtGdiOffsetViewportOrgEx(HDC hDC, dc->vportOrgY += YOffset; DC_UpdateXforms(dc); - dc->w.DCOrgX += XOffset; - dc->w.DCOrgY += YOffset; - DC_UnlockDc ( hDC ); return TRUE; } @@ -469,6 +466,7 @@ NtGdiOffsetWindowOrgEx(HDC hDC, dc->wndOrgX += XOffset; dc->wndOrgY += YOffset; + DC_UpdateXforms(dc); DC_UnlockDc(hDC); return TRUE; @@ -608,6 +606,7 @@ NtGdiSetViewportExtEx(HDC hDC, dc->vportExtX = XExtent; dc->vportExtY = YExtent; + DC_UpdateXforms(dc); DC_UnlockDc(hDC); return TRUE; @@ -703,6 +702,7 @@ NtGdiSetWindowExtEx(HDC hDC, dc->wndExtX = XExtent; dc->wndExtY = YExtent; + DC_UpdateXforms(dc); DC_UnlockDc(hDC); return TRUE; @@ -744,6 +744,7 @@ NtGdiSetWindowOrgEx(HDC hDC, dc->wndOrgX = X; dc->wndOrgY = Y; + DC_UpdateXforms(dc); DC_UnlockDc(hDC); return TRUE; diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index efcdfe0c883..9884f3039ac 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.137 2004/05/30 14:01:13 weiden Exp $ +/* $Id: dc.c,v 1.138 2004/06/18 15:18:56 navaraf Exp $ * * DC.C - Device context functions * @@ -2050,6 +2050,10 @@ DC_AllocDC(PUNICODE_STRING Driver) NewDC->w.xformVport2World = NewDC->w.xformWorld2Wnd; NewDC->w.vport2WorldValid = TRUE; NewDC->w.MapMode = MM_TEXT; + NewDC->wndExtX = 1.0f; + NewDC->wndExtY = 1.0f; + NewDC->vportExtX = 1.0f; + NewDC->vportExtY = 1.0f; NewDC->w.hFont = NtGdiGetStockObject(SYSTEM_FONT); TextIntRealizeFont(NewDC->w.hFont); @@ -2119,8 +2123,8 @@ DC_UpdateXforms(PDC dc) FLOAT scaleX, scaleY; /* Construct a transformation to do the window-to-viewport conversion */ - scaleX = (dc->wndExtX ? (FLOAT)dc->vportExtX / (FLOAT)dc->wndExtX : 0.0); - scaleY = (dc->wndExtY ? (FLOAT)dc->vportExtY / (FLOAT)dc->wndExtY : 0.0); + scaleX = (dc->wndExtX ? (FLOAT)dc->vportExtX / (FLOAT)dc->wndExtX : 0.0f); + scaleY = (dc->wndExtY ? (FLOAT)dc->vportExtY / (FLOAT)dc->wndExtY : 0.0f); xformWnd2Vport.eM11 = scaleX; xformWnd2Vport.eM12 = 0.0; xformWnd2Vport.eM21 = 0.0; diff --git a/reactos/subsys/win32k/objects/line.c b/reactos/subsys/win32k/objects/line.c index cbd8598a69f..f686413ea9d 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.31 2004/05/14 16:55:18 navaraf Exp $ */ +/* $Id: line.c,v 1.32 2004/06/18 15:18:57 navaraf Exp $ */ #include <w32k.h> // Some code from the WINE project source (www.winehq.com) @@ -55,6 +55,7 @@ IntGdiLineTo(DC *dc, BOOL Ret; PGDIBRUSHOBJ PenBrushObj; RECTL Bounds; + POINT Points[2]; SurfObj = (SURFOBJ*)AccessUserObject ( (ULONG)dc->Surface ); if (NULL == SurfObj) @@ -76,30 +77,23 @@ IntGdiLineTo(DC *dc, } else { - if (dc->w.CursPosX <= XEnd) - { - Bounds.left = dc->w.CursPosX; - Bounds.right = XEnd; - } - else - { - Bounds.left = XEnd; - Bounds.right = dc->w.CursPosX; - } - Bounds.left += dc->w.DCOrgX; - Bounds.right += dc->w.DCOrgX; - if (dc->w.CursPosY <= YEnd) - { - Bounds.top = dc->w.CursPosY; - Bounds.bottom = YEnd; - } - else - { - Bounds.top = YEnd; - Bounds.bottom = dc->w.CursPosY; - } - Bounds.top += dc->w.DCOrgY; - Bounds.bottom += dc->w.DCOrgY; + Points[0].x = dc->w.CursPosX; + Points[0].y = dc->w.CursPosY; + Points[1].x = XEnd; + Points[1].y = YEnd; + + IntLPtoDP(dc, Points, 2); + + /* FIXME: Is it correct to do this after the transformation? */ + Points[0].x += dc->w.DCOrgX; + Points[0].y += dc->w.DCOrgY; + Points[1].x += dc->w.DCOrgX; + Points[1].y += dc->w.DCOrgY; + + Bounds.left = min(Points[0].x, Points[1].x); + Bounds.top = min(Points[0].y, Points[1].y); + Bounds.right = max(Points[0].x, Points[1].x); + Bounds.bottom = max(Points[0].y, Points[1].y); /* get BRUSHOBJ from current pen. */ PenBrushObj = PENOBJ_LockPen( dc->w.hPen ); @@ -110,8 +104,8 @@ IntGdiLineTo(DC *dc, Ret = IntEngLineTo(SurfObj, dc->CombinedClip, &PenBrushObj->BrushObject, - dc->w.DCOrgX + dc->w.CursPosX, dc->w.DCOrgY + dc->w.CursPosY, - dc->w.DCOrgX + XEnd, dc->w.DCOrgY + YEnd, + Points[0].x, Points[0].y, + Points[1].x, Points[1].y, &Bounds, dc->w.ROPmode); } diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index 96710ecbb65..a41b7a36cd6 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.95 2004/05/30 14:51:45 jfilby Exp $ */ +/* $Id: text.c,v 1.96 2004/06/18 15:18:58 navaraf Exp $ */ #include <w32k.h> #include <ft2build.h> @@ -1493,7 +1493,8 @@ NtGdiExtTextOut( FT_Render_Mode RenderMode; BOOLEAN Render; NTSTATUS Status; - INT *Dx = NULL;; + INT *Dx = NULL; + POINT Start; dc = DC_LockDc(hDC); if (!dc) @@ -1518,8 +1519,11 @@ NtGdiExtTextOut( SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface); - XStart += dc->w.DCOrgX; - YStart += dc->w.DCOrgY; + Start.x = XStart; Start.y = YStart; + IntLPtoDP(dc, &Start, 1); + + XStart = Start.x + dc->w.DCOrgX; + YStart = Start.y + dc->w.DCOrgY; TextObj = TEXTOBJ_LockText(dc->w.hFont); From 26c98df75356fcaa173cf45eb68361d494179d34 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 18 Jun 2004 16:26:51 +0000 Subject: [PATCH 1411/1463] - Map correct amount of the video memory. svn path=/trunk/; revision=9705 --- reactos/drivers/video/miniport/vbe/vbemp.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/reactos/drivers/video/miniport/vbe/vbemp.c b/reactos/drivers/video/miniport/vbe/vbemp.c index 627e5228e70..cf14e31a28e 100644 --- a/reactos/drivers/video/miniport/vbe/vbemp.c +++ b/reactos/drivers/video/miniport/vbe/vbemp.c @@ -613,11 +613,9 @@ VBEMapVideoMemory( FrameBuffer.QuadPart = DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].PhysBasePtr; MapInformation->VideoRamBase = RequestedAddress->RequestedVirtualAddress; - MapInformation->VideoRamLength = ( - DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].XResolution * - DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].YResolution * - DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].BitsPerPixel - ) >> 3; + MapInformation->VideoRamLength = + DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].BytesPerScanLine * + DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].YResolution; VideoPortMapMemory(DeviceExtension, FrameBuffer, &MapInformation->VideoRamLength, &inIoSpace, From be7a6c466b7d0deede58ca6cb390e312946f349f Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Fri, 18 Jun 2004 16:36:00 +0000 Subject: [PATCH 1412/1463] re-enable DesktopWindow::OnDefaultCommand to open explorer windows on desktop double clicks svn path=/trunk/; revision=9706 --- .../system/explorer/desktop/desktop.cpp | 4 +- .../system/explorer/shell/mainframe.cpp | 131 ++++++++++-------- .../subsys/system/explorer/shell/mainframe.h | 3 +- .../system/explorer/shell/shellbrowser.cpp | 2 +- .../system/explorer/utility/xmlstorage.h | 2 +- 5 files changed, 83 insertions(+), 59 deletions(-) diff --git a/reactos/subsys/system/explorer/desktop/desktop.cpp b/reactos/subsys/system/explorer/desktop/desktop.cpp index 0a11cfd30cc..094d8c33e38 100644 --- a/reactos/subsys/system/explorer/desktop/desktop.cpp +++ b/reactos/subsys/system/explorer/desktop/desktop.cpp @@ -481,9 +481,9 @@ LRESULT DesktopWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) HRESULT DesktopWindow::OnDefaultCommand(LPIDA pida) { -/*@@ if (SDIMainFrame::OpenShellFolders(pida, 0)) + if (MainFrameBase::OpenShellFolders(pida, 0)) return S_OK; -*/ + return E_NOTIMPL; } diff --git a/reactos/subsys/system/explorer/shell/mainframe.cpp b/reactos/subsys/system/explorer/shell/mainframe.cpp index a4c245f161a..88a13817dc0 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.cpp +++ b/reactos/subsys/system/explorer/shell/mainframe.cpp @@ -86,6 +86,67 @@ HWND MainFrameBase::Create(LPCTSTR path, bool mdi, UINT cmdshow) } +int MainFrameBase::OpenShellFolders(LPIDA pida, HWND hFrameWnd, bool mdi) +{ + int cnt = 0; + + LPCITEMIDLIST parent_pidl = (LPCITEMIDLIST) ((LPBYTE)pida+pida->aoffset[0]); + ShellFolder folder(parent_pidl); + + for(int i=pida->cidl; i>0; --i) { + LPCITEMIDLIST pidl = (LPCITEMIDLIST) ((LPBYTE)pida+pida->aoffset[i]); + + SFGAOF attribs = SFGAO_FOLDER; + HRESULT hr = folder->GetAttributesOf(1, &pidl, &attribs); + + if (SUCCEEDED(hr)) + if (attribs & SFGAO_FOLDER) { + try { + ShellPath pidl_abs = ShellPath(pidl).create_absolute_pidl(parent_pidl); + + if (hFrameWnd) { + if (SendMessage(hFrameWnd, PM_OPEN_WINDOW, OWM_PIDL, (LPARAM)(LPCITEMIDLIST)pidl_abs)) + ++cnt; + } else { + HWND hwnd; +#ifndef _NO_MDI + if (mdi) + hwnd = MDIMainFrame::Create(pidl_abs, 0); + else +#endif + hwnd = SDIMainFrame::Create(pidl_abs, 0); + + if (hwnd) + ++cnt; + } + } catch(COMException& e) { + HandleException(e, g_Globals._hMainWnd); + } + }/*TEST + else { // !(attribs & SFGAO_FOLDER)) + SHELLEXECUTEINFOA shexinfo; + + shexinfo.cbSize = sizeof(SHELLEXECUTEINFOA); + shexinfo.fMask = SEE_MASK_INVOKEIDLIST; + shexinfo.hwnd = NULL; + shexinfo.lpVerb = NULL; + shexinfo.lpFile = NULL; + shexinfo.lpParameters = NULL; + shexinfo.lpDirectory = NULL; + shexinfo.nShow = SW_NORMAL; + shexinfo.lpIDList = ILCombine(parent_pidl, pidl); + + if (ShellExecuteExA(&shexinfo)) + ++cnt; + + ILFree((LPITEMIDLIST)shexinfo.lpIDList); + }*/ + } + + return cnt; +} + + MainFrameBase::MainFrameBase(HWND hwnd) : super(hwnd), _himl(ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_MASK|ILC_COLOR24, 2, 0)) @@ -815,60 +876,6 @@ ChildWindow* MDIMainFrame::CreateChild(LPCITEMIDLIST pidl, int mode) } -int MDIMainFrame::OpenShellFolders(LPIDA pida, HWND hFrameWnd) -{ - int cnt = 0; - - LPCITEMIDLIST parent_pidl = (LPCITEMIDLIST) ((LPBYTE)pida+pida->aoffset[0]); - ShellFolder folder(parent_pidl); - - for(int i=pida->cidl; i>0; --i) { - LPCITEMIDLIST pidl = (LPCITEMIDLIST) ((LPBYTE)pida+pida->aoffset[i]); - - SFGAOF attribs = SFGAO_FOLDER; - HRESULT hr = folder->GetAttributesOf(1, &pidl, &attribs); - - if (SUCCEEDED(hr)) - if (attribs & SFGAO_FOLDER) { - try { - ShellPath pidl_abs = ShellPath(pidl).create_absolute_pidl(parent_pidl); - - if (hFrameWnd) { - if (SendMessage(hFrameWnd, PM_OPEN_WINDOW, OWM_PIDL, (LPARAM)(LPCITEMIDLIST)pidl_abs)) - ++cnt; - } else { - if (MDIMainFrame::Create(pidl_abs, 0)) - ++cnt; - } - } catch(COMException& e) { - HandleException(e, g_Globals._hMainWnd); - } - }/*TEST - else { // !(attribs & SFGAO_FOLDER)) - SHELLEXECUTEINFOA shexinfo; - - shexinfo.cbSize = sizeof(SHELLEXECUTEINFOA); - shexinfo.fMask = SEE_MASK_INVOKEIDLIST; - shexinfo.hwnd = NULL; - shexinfo.lpVerb = NULL; - shexinfo.lpFile = NULL; - shexinfo.lpParameters = NULL; - shexinfo.lpDirectory = NULL; - shexinfo.nShow = SW_NORMAL; - shexinfo.lpIDList = ILCombine(parent_pidl, pidl); - - if (ShellExecuteExA(&shexinfo)) - ++cnt; - - ILFree((LPITEMIDLIST)shexinfo.lpIDList); - }*/ - } - - return cnt; -} - - - BOOL MDIMainFrame::TranslateMsg(MSG* pmsg) { if (_hmdiclient && TranslateMDISysAccel(_hmdiclient, pmsg)) @@ -1284,6 +1291,22 @@ HWND SDIMainFrame::Create() 0/*hwndDesktop*/, hMenuFrame); } +HWND SDIMainFrame::Create(LPCITEMIDLIST pidl, int mode) +{ + HWND hFrame = Create(); + if (!hFrame) + return 0; + + ShowWindow(hFrame, SW_SHOW); + + SDIMainFrame* pFrame = GET_WINDOW(SDIMainFrame, hFrame); + + if (pFrame) + pFrame->jump_to(pidl, mode); + + return hFrame; +} + LRESULT SDIMainFrame::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) { switch(nmsg) { diff --git a/reactos/subsys/system/explorer/shell/mainframe.h b/reactos/subsys/system/explorer/shell/mainframe.h index 4c96cc916e9..0b06023066b 100644 --- a/reactos/subsys/system/explorer/shell/mainframe.h +++ b/reactos/subsys/system/explorer/shell/mainframe.h @@ -39,6 +39,7 @@ struct MainFrameBase : public PreTranslateWindow ~MainFrameBase(); static HWND Create(LPCTSTR path, bool mdi=true, UINT cmdshow=SW_SHOWNORMAL); + static int OpenShellFolders(LPIDA pida, HWND hFrameWnd, bool mdi=true); WindowHandle _hwndrebar; @@ -93,7 +94,6 @@ struct MDIMainFrame : public MainFrameBase static HWND Create(); static HWND Create(LPCTSTR path, int mode=OWM_EXPLORE|OWM_DETAILS); static HWND Create(LPCITEMIDLIST pidl, int mode=OWM_EXPLORE|OWM_DETAILS|OWM_PIDL); - static int OpenShellFolders(LPIDA pida, HWND hFrameWnd); ChildWindow* CreateChild(LPCTSTR path=NULL, int mode=OWM_EXPLORE|OWM_DETAILS); ChildWindow* CreateChild(LPCITEMIDLIST pidl, int mode=OWM_EXPLORE|OWM_DETAILS|OWM_PIDL); @@ -131,6 +131,7 @@ struct SDIMainFrame : public ShellBrowserChildT<MainFrameBase> SDIMainFrame(HWND hwnd); static HWND Create(); + static HWND Create(LPCITEMIDLIST pidl, int mode=OWM_EXPLORE|OWM_DETAILS|OWM_PIDL); protected: ShellPathInfo _shellpath_info; diff --git a/reactos/subsys/system/explorer/shell/shellbrowser.cpp b/reactos/subsys/system/explorer/shell/shellbrowser.cpp index c674a8c681b..adaf4ede54e 100644 --- a/reactos/subsys/system/explorer/shell/shellbrowser.cpp +++ b/reactos/subsys/system/explorer/shell/shellbrowser.cpp @@ -421,7 +421,7 @@ HRESULT ShellBrowser::OnDefaultCommand(LPIDA pida) } } } else { // no tree control - if (MDIMainFrame::OpenShellFolders(pida, _hWndFrame)) + if (MainFrameBase::OpenShellFolders(pida, _hWndFrame)) return S_OK; /* create new Frame Window diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.h b/reactos/subsys/system/explorer/utility/xmlstorage.h index 5fed7e82fc6..1ec305c2ef3 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.h +++ b/reactos/subsys/system/explorer/utility/xmlstorage.h @@ -1395,7 +1395,7 @@ struct XMLDoc : public XMLNode return status != XML_STATUS_ERROR; } - bool read(XMLReaderBase& reader, const string& display_path) + bool read(XMLReaderBase& reader, const std::string& display_path) { XML_Status status = reader.read(); From 24fdd29e94f37e7d58d892c9f98df3558dadc61a Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Fri, 18 Jun 2004 16:44:59 +0000 Subject: [PATCH 1413/1463] eliminate GCC warning svn path=/trunk/; revision=9707 --- reactos/subsys/system/explorer/utility/shellclasses.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/subsys/system/explorer/utility/shellclasses.h b/reactos/subsys/system/explorer/utility/shellclasses.h index cc57e388390..39a9058067f 100644 --- a/reactos/subsys/system/explorer/utility/shellclasses.h +++ b/reactos/subsys/system/explorer/utility/shellclasses.h @@ -78,7 +78,7 @@ struct COMExceptionBase LocalFree(pBuf); } else { TCHAR buffer[128]; - _stprintf(buffer, TEXT("unknown Exception: 0x%08X"), _hr); + _stprintf(buffer, TEXT("unknown Exception: 0x%08lX"), _hr); _msg = buffer; } } From 751d25b2ea6ee08df31a166badb7349e387a2cd1 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Fri, 18 Jun 2004 16:59:47 +0000 Subject: [PATCH 1414/1463] eliminate GCC warning svn path=/trunk/; revision=9709 --- reactos/subsys/system/explorer/shell/regfs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/subsys/system/explorer/shell/regfs.cpp b/reactos/subsys/system/explorer/shell/regfs.cpp index a31a36007dd..e804dfdaaaa 100644 --- a/reactos/subsys/system/explorer/shell/regfs.cpp +++ b/reactos/subsys/system/explorer/shell/regfs.cpp @@ -152,7 +152,7 @@ void RegDirectory::read_directory(int scan_flags) entry->_content = _tcsdup(value); else if (type == REG_DWORD) { TCHAR b[32]; - _stprintf(b, TEXT("%d"), *(DWORD*)&value); + _stprintf(b, TEXT("%ld"), *(DWORD*)&value); entry->_content = _tcsdup(b); } } From 81d4e43dda0e07da953e5b73225033277350b0f4 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 18 Jun 2004 17:20:49 +0000 Subject: [PATCH 1415/1463] - VideoPortInt10 should copy back the output registers to caller. svn path=/trunk/; revision=9712 --- reactos/drivers/video/videoprt/int10.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/reactos/drivers/video/videoprt/int10.c b/reactos/drivers/video/videoprt/int10.c index ad517aac6fd..44eb756cac7 100644 --- a/reactos/drivers/video/videoprt/int10.c +++ b/reactos/drivers/video/videoprt/int10.c @@ -18,7 +18,7 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: int10.c,v 1.5 2004/03/19 20:58:31 navaraf Exp $ + * $Id: int10.c,v 1.6 2004/06/18 17:20:49 navaraf Exp $ */ #include "videoprt.h" @@ -230,6 +230,13 @@ VideoPortInt10( DPRINT("- Input register Ebp: %x\n", BiosArguments->Ebp); Regs.Ebp = BiosArguments->Ebp; Status = Ke386CallBios(0x10, &Regs); + BiosArguments->Eax = Regs.Eax; + BiosArguments->Ebx = Regs.Ebx; + BiosArguments->Ecx = Regs.Ecx; + BiosArguments->Edx = Regs.Edx; + BiosArguments->Esi = Regs.Esi; + BiosArguments->Edi = Regs.Edi; + BiosArguments->Ebp = Regs.Ebp; IntDetachFromCSRSS(&CallingProcess, &PrevAttachedProcess); From 6f53b7dbce03312eb4eef5a943169cfbd0c78ddc Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Fri, 18 Jun 2004 17:26:59 +0000 Subject: [PATCH 1416/1463] Added font enumeratiion demo svn path=/trunk/; revision=9713 --- reactos/apps/tests/enumfonts/enumfonts.cpp | 272 +++++++++++++++++++++ reactos/apps/tests/enumfonts/makefile | 24 ++ 2 files changed, 296 insertions(+) create mode 100755 reactos/apps/tests/enumfonts/enumfonts.cpp create mode 100644 reactos/apps/tests/enumfonts/makefile diff --git a/reactos/apps/tests/enumfonts/enumfonts.cpp b/reactos/apps/tests/enumfonts/enumfonts.cpp new file mode 100755 index 00000000000..358e3fedd6c --- /dev/null +++ b/reactos/apps/tests/enumfonts/enumfonts.cpp @@ -0,0 +1,272 @@ + +// ------------------------------------------------------------------ +// Windows 2000 Graphics API Black Book +// Chapter 4 - Listing 4.2 (Font Enumeration Demo) +// +// Created by Damon Chandler <dmc27@ee.cornell.edu> +// Updates can be downloaded at: <www.coriolis.com> +// +// Please do not hesistate to e-mail me at dmc27@ee.cornell.edu +// if you have any questions about this code. +// ------------------------------------------------------------------ + + +//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +#include <windows.h> +#include <cassert> + + +#ifndef SNDMSG +#define SNDMSG ::SendMessage +#define SNDMSG SendMessage +#endif /* ifndef SNDMSG */ + + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + +HWND hListBox = NULL; +const int ID_LISTBOX = 101; + +HINSTANCE hInst; +const char* WndClassName = "GMainWnd"; +LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, + LPARAM lParam); + + +int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, + int nCmdShow) +{ + hInst = hInstance; + + WNDCLASS wc; + memset(&wc, 0, sizeof(WNDCLASS)); + + wc.style = CS_VREDRAW | CS_HREDRAW; + wc.lpszClassName = WndClassName; + wc.lpfnWndProc = MainWndProc; + wc.hInstance = hInstance; + wc.hCursor = NULL; //LoadCursor(NULL, IDC_ARROW); + wc.hbrBackground = reinterpret_cast<HBRUSH>( + COLOR_BTNFACE + 1 + ); + + if (RegisterClass(&wc)) + { + HWND hWnd = + CreateWindow( + WndClassName, TEXT("Font Enumeration Demo"), + WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION | + WS_VISIBLE | WS_CLIPCHILDREN, + CW_USEDEFAULT, CW_USEDEFAULT, 295, 285, + NULL, NULL, hInst, NULL + ); + + if (hWnd) + { + ShowWindow(hWnd, nCmdShow); + UpdateWindow(hWnd); + + MSG msg; + while (GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + } + return 0; +} +//------------------------------------------------------------------------- + + +int CALLBACK MyEnumFontFamExProc(ENUMLOGFONTEX *lpelfe, + NEWTEXTMETRICEX* lpntme, int FontType, LPARAM lParam) +{ + if (FontType == TRUETYPE_FONTTYPE) + { + // if the typeface name is not already in the list + LPARAM name = reinterpret_cast<LPARAM>(lpelfe->elfFullName); + if (SNDMSG(hListBox, LB_FINDSTRINGEXACT, -1, name) == LB_ERR) + { + // add each font to the list box + int index = SNDMSG(hListBox, LB_ADDSTRING, 0, name); + + // fix the size of the font + lpelfe->elfLogFont.lfHeight = -20; + lpelfe->elfLogFont.lfWidth = 0; + + // create a new font and store its handle + // as the data of the newly added item + HFONT hFont = CreateFontIndirect(&lpelfe->elfLogFont); + SNDMSG(hListBox, LB_SETITEMDATA, index, + reinterpret_cast<LPARAM>(hFont)); + } + } + return TRUE; +} +//------------------------------------------------------------------------- + + +void AddScreenFonts() +{ + // grab a handle to the screen's DC + HDC hScreenDC = GetDC(NULL); + try + { + // + // NOTE: Windows 95, 98 and Me requires that the lpLogfont + // (second) parameter of the EnumFontFamiliesEx function is + // non-NULL. This parameter can be NULL on Windows NT/2000. + // + LOGFONT lf = {0}; + lf.lfCharSet = DEFAULT_CHARSET; + + // enumerate the current screen fonts + EnumFontFamiliesEx( + hScreenDC, &lf, + reinterpret_cast<FONTENUMPROC>(MyEnumFontFamExProc), + 0, 0 + ); + } + catch (...) + { + // release the screen's DC + ReleaseDC(NULL, hScreenDC); + } + // release the screen's DC + ReleaseDC(NULL, hScreenDC); +} +//------------------------------------------------------------------------- + + +LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, + LPARAM lParam) +{ + switch (msg) + { + case WM_CREATE: + { + hListBox = + CreateWindowEx( + WS_EX_CLIENTEDGE, TEXT("LISTBOX"), TEXT(""), + WS_CHILD | WS_VISIBLE | LBS_STANDARD | + LBS_HASSTRINGS | LBS_OWNERDRAWFIXED, + 20, 10, 250, 250, + hWnd, reinterpret_cast<HMENU>(ID_LISTBOX), + hInst, NULL + ); + if (hListBox) + { + AddScreenFonts(); + } + } + case WM_MEASUREITEM: + { + // grab a pointer to the MEASUREITEMSTRUCT structure + LPMEASUREITEMSTRUCT lpmis = + reinterpret_cast<LPMEASUREITEMSTRUCT>(lParam); + + // test the identifier of the control that + // the message is meant for + if (lpmis->CtlID == ID_LISTBOX) + { + // adjust the height + lpmis->itemHeight = 25; + + return TRUE; + } + break; + } + case WM_DRAWITEM: + { + // grab a pointer to the DRAWITEMSTRUCT structure + LPDRAWITEMSTRUCT lpdis = + reinterpret_cast<LPDRAWITEMSTRUCT>(lParam); + + // test the identifier of the control that + // the message is meant for + if (lpdis->CtlID == ID_LISTBOX) + { + COLORREF OldColor = GetTextColor(lpdis->hDC); + int stock = WHITE_BRUSH; + + // if the item is currently selected + if (lpdis->itemState & ODS_SELECTED) + { + // set the text color to white and + // the background color to black + COLORREF clrWhite = PALETTERGB(255, 255, 255); + OldColor = SetTextColor(lpdis->hDC, clrWhite); + stock = BLACK_BRUSH; + } + FillRect( + lpdis->hDC, &lpdis->rcItem, + static_cast<HBRUSH>(GetStockObject(stock)) + ); + + if (lpdis->itemID != -1) + { + // extract the item's text + char text[MAX_PATH]; + SNDMSG(hListBox, LB_GETTEXT, lpdis->itemID, + reinterpret_cast<LPARAM>(text)); + + // extract the corresponding font handle + DWORD value = + SNDMSG(hListBox, LB_GETITEMDATA, lpdis->itemID, 0); + HFONT hFont = reinterpret_cast<HFONT>(value); + + // select the corresponding font + // into the device context + HFONT HOldFont = static_cast<HFONT>( + SelectObject(lpdis->hDC, hFont) + ); + + // render the text transparently + SetBkMode(lpdis->hDC, TRANSPARENT); + + // render the text + RECT RText = lpdis->rcItem; + InflateRect(&RText, -2, -2); + DrawText(lpdis->hDC, text, strlen(text), &RText, + DT_LEFT | DT_VCENTER | DT_SINGLELINE); + + // restore the previous font + SelectObject(lpdis->hDC, HOldFont); + } + + // render the focus rectangle + if (lpdis->itemState & ODS_FOCUS) + { + DrawFocusRect(lpdis->hDC, &lpdis->rcItem); + } + + // restore the previous color/mode + SetTextColor(lpdis->hDC, OldColor); + SetBkMode(lpdis->hDC, OPAQUE); + + return TRUE; + } + break; + } + case WM_DESTROY: + { + // delete each created font object + int count = SNDMSG(hListBox, LB_GETCOUNT, 0, 0); + for (int index = 0; index < count; ++index) + { + DWORD value = SNDMSG(hListBox, LB_GETITEMDATA, index, 0); + DeleteObject(reinterpret_cast<HFONT>(value)); + } + + PostQuitMessage(0); + break; + } + } + return DefWindowProc(hWnd, msg, wParam, lParam); +} +//------------------------------------------------------------------------- + + + diff --git a/reactos/apps/tests/enumfonts/makefile b/reactos/apps/tests/enumfonts/makefile new file mode 100644 index 00000000000..d65333a2b0d --- /dev/null +++ b/reactos/apps/tests/enumfonts/makefile @@ -0,0 +1,24 @@ + +PATH_TO_TOP = ../../.. + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = windows + +TARGET_NAME = enumfonts + +TARGET_SDKLIBS = kernel32.a gdi32.a + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_GCCLIBS = stdc++ + +TARGET_CFLAGS = -Wall -Werror -D__USE_W32API -DWIN32 -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -fexceptions -Wall -I. + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF From 86c4140124e6d02ed3283220f1c25a99a52b096c Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Fri, 18 Jun 2004 17:37:02 +0000 Subject: [PATCH 1417/1463] - Get this test compilable. svn path=/trunk/; revision=9714 --- reactos/apps/tests/enumfonts/enumfonts.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/reactos/apps/tests/enumfonts/enumfonts.cpp b/reactos/apps/tests/enumfonts/enumfonts.cpp index 358e3fedd6c..5832b9e22c6 100755 --- a/reactos/apps/tests/enumfonts/enumfonts.cpp +++ b/reactos/apps/tests/enumfonts/enumfonts.cpp @@ -18,7 +18,6 @@ #ifndef SNDMSG #define SNDMSG ::SendMessage -#define SNDMSG SendMessage #endif /* ifndef SNDMSG */ @@ -87,7 +86,7 @@ int CALLBACK MyEnumFontFamExProc(ENUMLOGFONTEX *lpelfe, { // if the typeface name is not already in the list LPARAM name = reinterpret_cast<LPARAM>(lpelfe->elfFullName); - if (SNDMSG(hListBox, LB_FINDSTRINGEXACT, -1, name) == LB_ERR) + if (SNDMSG(hListBox, LB_FINDSTRINGEXACT, (ULONG)-1, name) == LB_ERR) { // add each font to the list box int index = SNDMSG(hListBox, LB_ADDSTRING, 0, name); @@ -125,7 +124,7 @@ void AddScreenFonts() // enumerate the current screen fonts EnumFontFamiliesEx( hScreenDC, &lf, - reinterpret_cast<FONTENUMPROC>(MyEnumFontFamExProc), + MyEnumFontFamExProc, 0, 0 ); } From 038cca4d581d811d1ea31308fb7e9fd1c05ba593 Mon Sep 17 00:00:00 2001 From: Gero Kuehn <reactos.filter@gkware.com> Date: Fri, 18 Jun 2004 20:43:44 +0000 Subject: [PATCH 1418/1463] initial checkin of the non-shell-namespace-based control panel and software add/remove cpl svn path=/trunk/; revision=9715 --- reactos/lib/cpl/Makefile | 2 +- reactos/lib/cpl/appwiz/.cvsignore | 14 + reactos/lib/cpl/appwiz/Makefile | 47 ++++ reactos/lib/cpl/appwiz/appwiz.c | 263 ++++++++++++++++++ reactos/lib/cpl/appwiz/appwiz.def | 6 + reactos/lib/cpl/appwiz/appwiz.dsp | 124 +++++++++ reactos/lib/cpl/appwiz/appwiz.dsw | 29 ++ reactos/lib/cpl/appwiz/appwiz.edf | 6 + reactos/lib/cpl/appwiz/appwiz.h | 20 ++ reactos/lib/cpl/appwiz/appwiz.rc | 77 ++++++ reactos/lib/cpl/appwiz/resource.h | 31 +++ reactos/lib/cpl/appwiz/resources/applet.ico | Bin 0 -> 1398 bytes reactos/lib/cpl/control/.cvsignore | 15 ++ reactos/lib/cpl/control/Makefile | 38 +++ reactos/lib/cpl/control/control.cpp | 267 +++++++++++++++++++ reactos/lib/cpl/control/control.dsp | 137 ++++++++++ reactos/lib/cpl/control/control.dsw | 29 ++ reactos/lib/cpl/control/control.rc | 86 ++++++ reactos/lib/cpl/control/resource.h | 27 ++ reactos/lib/cpl/control/resources/config.ico | Bin 0 -> 9062 bytes 20 files changed, 1217 insertions(+), 1 deletion(-) create mode 100644 reactos/lib/cpl/appwiz/.cvsignore create mode 100644 reactos/lib/cpl/appwiz/Makefile create mode 100644 reactos/lib/cpl/appwiz/appwiz.c create mode 100644 reactos/lib/cpl/appwiz/appwiz.def create mode 100644 reactos/lib/cpl/appwiz/appwiz.dsp create mode 100644 reactos/lib/cpl/appwiz/appwiz.dsw create mode 100644 reactos/lib/cpl/appwiz/appwiz.edf create mode 100644 reactos/lib/cpl/appwiz/appwiz.h create mode 100644 reactos/lib/cpl/appwiz/appwiz.rc create mode 100644 reactos/lib/cpl/appwiz/resource.h create mode 100644 reactos/lib/cpl/appwiz/resources/applet.ico create mode 100644 reactos/lib/cpl/control/.cvsignore create mode 100644 reactos/lib/cpl/control/Makefile create mode 100644 reactos/lib/cpl/control/control.cpp create mode 100644 reactos/lib/cpl/control/control.dsp create mode 100644 reactos/lib/cpl/control/control.dsw create mode 100644 reactos/lib/cpl/control/control.rc create mode 100644 reactos/lib/cpl/control/resource.h create mode 100644 reactos/lib/cpl/control/resources/config.ico diff --git a/reactos/lib/cpl/Makefile b/reactos/lib/cpl/Makefile index 2356eca12a6..21e4b0b27f9 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 +CONTROL_PANELS = sysdm appwiz control all: $(CONTROL_PANELS) diff --git a/reactos/lib/cpl/appwiz/.cvsignore b/reactos/lib/cpl/appwiz/.cvsignore new file mode 100644 index 00000000000..e569704df95 --- /dev/null +++ b/reactos/lib/cpl/appwiz/.cvsignore @@ -0,0 +1,14 @@ +*.coff +*.cpl +*.d +*.a +*.o +*.sym +*.map +*.tmp + +*.ncb +*.opt +*.plg +Debug +Release \ No newline at end of file diff --git a/reactos/lib/cpl/appwiz/Makefile b/reactos/lib/cpl/appwiz/Makefile new file mode 100644 index 00000000000..dead14f0e90 --- /dev/null +++ b/reactos/lib/cpl/appwiz/Makefile @@ -0,0 +1,47 @@ +# $Id: Makefile,v 1.1 2004/06/18 20:43:44 kuehng Exp $ + +PATH_TO_TOP = ../../.. + +TARGET_TYPE = dynlink + +TARGET_EXTENSION = .cpl + +TARGET_NAME = appwiz + +TARGET_INSTALLDIR = system32 + +TARGET_BASE = $(TARGET_BASE_LIB_CPL_SYSDM) + +TARGET_CFLAGS = \ + -I./include \ + -DUNICODE \ + -D_UNICODE \ + -D__REACTOS__ \ + -Wall \ + -Werror \ + -fno-builtin + +TARGET_LFLAGS = -nostartfiles + +TARGET_SDKLIBS = kernel32.a user32.a comctl32.a + +TARGET_GCCLIBS = gcc + +TARGET_PCH = + +TARGET_CLEAN = + +TARGET_OBJECTS = appwiz.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/appwiz/appwiz.c b/reactos/lib/cpl/appwiz/appwiz.c new file mode 100644 index 00000000000..72ccb8315f8 --- /dev/null +++ b/reactos/lib/cpl/appwiz/appwiz.c @@ -0,0 +1,263 @@ +/* + * 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: appwiz.c,v 1.1 2004/06/18 20:43:44 kuehng Exp $ + * + * PROJECT: ReactOS Software Control Panel + * FILE: lib/cpl/system/appwiz.c + * PURPOSE: ReactOS Software Control Panel + * PROGRAMMER: Gero Kuehn (reactos.filter@gkware.com) + * UPDATE HISTORY: + * 06-17-2004 Created + */ + +#include <stdlib.h> +#include <stdio.h> +#include <stdarg.h> +#include <tchar.h> +#include <windows.h> + +#ifdef _MSC_VER +#include <commctrl.h> +#include <cpl.h> +#endif + +#include <stdlib.h> +#include <tchar.h> +#include <process.h> +#include <stdio.h> + +#include "resource.h" +#include "appwiz.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); +HINSTANCE hApplet = 0; + +/* Applets */ +APPLET Applets[NUM_APPLETS] = +{ + {IDI_CPLSYSTEM, IDS_CPLSYSTEMNAME, IDS_CPLSYSTEMDESCRIPTION, SystemApplet} +}; + +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); + } + } +} + +/* Property page dialog callback */ +BOOL CALLBACK InstallPageProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) +{ + 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; +} + +/* Property page dialog callback */ +BOOL CALLBACK RosPageProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) +{ + switch(uMsg) + { + case WM_INITDIALOG: + { + + break; + } + } + return FALSE; +} + +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; +} + + +/* First Applet */ + +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; + + + 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) +{ + 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 WINAPI 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/appwiz/appwiz.def b/reactos/lib/cpl/appwiz/appwiz.def new file mode 100644 index 00000000000..0f56c708737 --- /dev/null +++ b/reactos/lib/cpl/appwiz/appwiz.def @@ -0,0 +1,6 @@ +LIBRARY appwiz.cpl + +EXPORTS +CPlApplet + +; EOF diff --git a/reactos/lib/cpl/appwiz/appwiz.dsp b/reactos/lib/cpl/appwiz/appwiz.dsp new file mode 100644 index 00000000000..e1afdb7b74e --- /dev/null +++ b/reactos/lib/cpl/appwiz/appwiz.dsp @@ -0,0 +1,124 @@ +# Microsoft Developer Studio Project File - Name="appwiz" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=appwiz - 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 "appwiz.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 "appwiz.mak" CFG="appwiz - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "appwiz - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "appwiz - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "appwiz - 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 Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "APPWIZ_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_USRDLL" /D "APPWIZ_EXPORTS" /D "_UNICODE" /D "UNICODE" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" /d "_MSC_VER" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib /nologo /dll /machine:I386 /out:"Release/appwiz.cpl" + +!ELSEIF "$(CFG)" == "appwiz - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "APPWIZ_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_USRDLL" /D "APPWIZ_EXPORTS" /D "_UNICODE" /D "UNICODE" /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" /d "_MSC_VER" +# SUBTRACT RSC /x +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib /nologo /dll /debug /machine:I386 /out:"Debug/appwiz.cpl" /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "appwiz - Win32 Release" +# Name "appwiz - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\appwiz.c +# End Source File +# Begin Source File + +SOURCE=.\appwiz.h +# End Source File +# Begin Source File + +SOURCE=.\resource.h +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\appwiz.def +# End Source File +# Begin Source File + +SOURCE=.\appwiz.rc +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/reactos/lib/cpl/appwiz/appwiz.dsw b/reactos/lib/cpl/appwiz/appwiz.dsw new file mode 100644 index 00000000000..52023fddfa2 --- /dev/null +++ b/reactos/lib/cpl/appwiz/appwiz.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "appwiz"=.\appwiz.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/reactos/lib/cpl/appwiz/appwiz.edf b/reactos/lib/cpl/appwiz/appwiz.edf new file mode 100644 index 00000000000..07b4ddf9efc --- /dev/null +++ b/reactos/lib/cpl/appwiz/appwiz.edf @@ -0,0 +1,6 @@ +LIBRARY appwiz.cpl + +EXPORTS +CPlApplet=CPlApplet@16 + +; EOF diff --git a/reactos/lib/cpl/appwiz/appwiz.h b/reactos/lib/cpl/appwiz/appwiz.h new file mode 100644 index 00000000000..c4bb7b71243 --- /dev/null +++ b/reactos/lib/cpl/appwiz/appwiz.h @@ -0,0 +1,20 @@ +#ifndef __CPL_APPWIZ_H +#define __CPL_APPWIZ_H + +typedef LONG (CALLBACK *CPLAPPLET_PROC)(VOID); + +typedef struct +{ + int idIcon; + int idName; + int idDescription; + CPLAPPLET_PROC AppletProc; +} APPLET, *PAPPLET; + +extern HINSTANCE hApplet; + +void ShowLastWin32Error(HWND hWndOwner); + +#endif /* __CPL_APPWIZ_H */ + +/* EOF */ diff --git a/reactos/lib/cpl/appwiz/appwiz.rc b/reactos/lib/cpl/appwiz/appwiz.rc new file mode 100644 index 00000000000..4eec9a01551 --- /dev/null +++ b/reactos/lib/cpl/appwiz/appwiz.rc @@ -0,0 +1,77 @@ +#include "resource.h" +#ifdef _MSC_VER +#include <../../../include/reactos/resource.h> +#include <../../../include/defines.h> +#else +#include <reactos/resource.h> +#include <defines.h> +#endif + +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 Software Control Panel\0" + VALUE "FileVersion", RES_STR_FILE_VERSION + VALUE "InternalName", "appwiz\0" + VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT + VALUE "OriginalFilename", "appwiz.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_CPLSYSTEM ICON "resources/applet.ico" + +IDD_PROPPAGEINSTALL DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT +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 + LTEXT "", -1, PROPSHEETPADDING, 63, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN + + ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,76,16,16 + LTEXT "The following Software can be automatically removed. To remove a program or to modify its installed components, select it from the list and click Add/Remove.",-1,36,72,PROPSHEETWIDTH-48,32 + LISTBOX IDC_SOFTWARELIST, PROPSHEETPADDING, 105, PROPSHEETWIDTH-12, 88, LBS_STANDARD | WS_TABSTOP + PUSHBUTTON "Add/&Remove", IDC_ADDREMOVE, PROPSHEETWIDTH-72, 198, 60, 14 +END + +IDD_PROPPAGEROSSETUP DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Reactos Setup" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + +END + + +STRINGTABLE +BEGIN + IDS_CPLSYSTEMNAME "Add/Remove Programs" + IDS_CPLSYSTEMDESCRIPTION "Sets up programs and creates shortcuts." +END diff --git a/reactos/lib/cpl/appwiz/resource.h b/reactos/lib/cpl/appwiz/resource.h new file mode 100644 index 00000000000..361158b509c --- /dev/null +++ b/reactos/lib/cpl/appwiz/resource.h @@ -0,0 +1,31 @@ +#ifndef __CPL_RESOURCE_H +#define __CPL_RESOURCE_H + +/* metrics */ +#define PROPSHEETWIDTH 246 +#define PROPSHEETHEIGHT 228 +#define PROPSHEETPADDING 6 +#define SYSTEM_COLUMN (0 * PROPSHEETPADDING) +// this is not supported by the MS Resource compiler: +//#define LABELLINE(x) 0 //(((PROPSHEETPADDING + 2) * x) + (x + 2)) + +#define ICONSIZE 16 + +/* ids */ + +#define IDI_CPLSYSTEM 100 + +#define IDD_PROPPAGEINSTALL 100 +#define IDD_PROPPAGEROSSETUP 101 + +#define IDS_CPLSYSTEMNAME 1001 +#define IDS_CPLSYSTEMDESCRIPTION 2001 + +/* controls */ +#define IDC_INSTALL 101 +#define IDC_SOFTWARELIST 102 +#define IDC_ADDREMOVE 103 + +#endif /* __CPL_RESOURCE_H */ + +/* EOF */ diff --git a/reactos/lib/cpl/appwiz/resources/applet.ico b/reactos/lib/cpl/appwiz/resources/applet.ico new file mode 100644 index 0000000000000000000000000000000000000000..3eae16df58c7f5b9a6b80827d788f7416afccbda GIT binary patch literal 1398 zcmds1v2MaJ5Pcy?>6oosVPx#onJ?g5x|yL8-r%#mb?JxX50cHi7sup4K?u<bsV_O- zJ)bW=TbBb0lvpln>N%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)<n7>;RO1DVO`5*Ex${7*rzT$k>q>YY}5t123;JHup-7leVI7nk`P|W&Ys_ z_r*N>-jMqObGQP}o<J9SK(9E`e5fx}>F-9>st~smS_|yFs$V?oA+Ep34wa~LO!6G5 MKQVRI!ab7Xj@&-27XSbN literal 0 HcmV?d00001 diff --git a/reactos/lib/cpl/control/.cvsignore b/reactos/lib/cpl/control/.cvsignore new file mode 100644 index 00000000000..01eba0dad2e --- /dev/null +++ b/reactos/lib/cpl/control/.cvsignore @@ -0,0 +1,15 @@ +*.coff +*.exe +*.d +*.a +*.o +*.sym +*.map +*.tmp + +*.ncb +*.opt +*.plg +*.aps +Debug +Release \ No newline at end of file diff --git a/reactos/lib/cpl/control/Makefile b/reactos/lib/cpl/control/Makefile new file mode 100644 index 00000000000..e804c38e468 --- /dev/null +++ b/reactos/lib/cpl/control/Makefile @@ -0,0 +1,38 @@ +# $Id: Makefile,v 1.1 2004/06/18 20:43:44 kuehng Exp $ + +PATH_TO_TOP = ../../.. + +TARGET_TYPE = program + +TARGET_NAME = control + +TARGET_INSTALLDIR = system32 + +TARGET_APPTYPE = windows + +MK_CFLAGS = -D_UNICODE -DUNICODE +MK_CPPFLAGS = -D_UNICODE -DUNICODE +MK_RCFLAGS = -D_UNICODE -DUNICODE + +TARGET_SDKLIBS = kernel32.a user32.a comctl32.a + +# TARGET_GCCLIBS = gcc + +TARGET_PCH = + +TARGET_CLEAN = + +TARGET_OBJECTS = control.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/control/control.cpp b/reactos/lib/cpl/control/control.cpp new file mode 100644 index 00000000000..ea5335c5af0 --- /dev/null +++ b/reactos/lib/cpl/control/control.cpp @@ -0,0 +1,267 @@ +/* + * ReactOS + * Copyright (C) 2004 ReactOS Team + * Copyright (C) 2004 GkWare e.K. + * + * 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: control.cpp,v 1.1 2004/06/18 20:43:44 kuehng Exp $ + * + * PROJECT: ReactOS System Control Panel + * FILE: lib/cpl/system/control.cpp + * PURPOSE: ReactOS System Control Panel + * PROGRAMMER: Gero Kuehn (reactos.filter@gkware.com) + * UPDATE HISTORY: + * 06-13-2004 Created + */ +#include <stdlib.h> +#include <stdio.h> +#include <stdarg.h> +#include <tchar.h> +#include <windows.h> + +#ifdef _MSC_VER +#include <commctrl.h> +#include <cpl.h> +#endif + +#include "resource.h" + +//#define CONTROL_DEBUG_ENABLE + +#ifdef CONTROL_DEBUG_ENABLE +#define CTL_DEBUG(x) dbgprint x +#else +#define CTL_DEBUG(x) +#endif + +HINSTANCE hInst; +HWND hMainWnd; + +void dbgprint(TCHAR *format,...) +{ + TCHAR buf[1000]; + va_list va; + va_start(va,format); + _vstprintf(buf,format,va); + OutputDebugString(buf); + 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; + HANDLE hFind; + TCHAR pszSearchPath[MAX_PATH]; + GetSystemDirectory(pszSearchPath,MAX_PATH); + _tcscat(pszSearchPath,_T("\\*.cpl")); + hFind = FindFirstFile(pszSearchPath,&fd); + HIMAGELIST hImgListSmall; + HIMAGELIST hImgListLarge; + hImgListSmall = ImageList_Create(16,16,ILC_COLOR,256,1000); + hImgListLarge = ImageList_Create(32,32,ILC_COLOR,256,1000); + while(hFind != INVALID_HANDLE_VALUE) + { + CTL_DEBUG((_T("Found %s\r\n"),fd.cFileName)); + CPLLISTENTRY *pEntry; + pEntry = (CPLLISTENTRY*)malloc(sizeof(CPLLISTENTRY)); + if(!pEntry) + break; + _tcscpy(pEntry->pszPath,pszSearchPath); + *_tcsrchr(pEntry->pszPath,'\\')=0; + _tcscat(pEntry->pszPath,_T("\\")); + _tcscat(pEntry->pszPath,fd.cFileName); + + pEntry->hDLL = LoadLibrary(pEntry->pszPath); + CTL_DEBUG((_T("Handle %08X\r\n"),pEntry->hDLL)); + pEntry->pFunc = (CPLAPPLETFUNC)GetProcAddress(pEntry->hDLL,_T("CPlApplet")); + CTL_DEBUG((_T("CPLFunc %08X\r\n"),pEntry->pFunc)); + if(pEntry->pFunc && pEntry->pFunc(hLisCtrl,CPL_INIT,0,0)) + { + for(int i=0;i<pEntry->pFunc(hLisCtrl,CPL_GETCOUNT,0,0);i++) + { + pEntry->pFunc(hLisCtrl,CPL_INQUIRE,0,(LPARAM)&pEntry->CPLInfo); + + HICON hIcon = LoadIcon(pEntry->hDLL,MAKEINTRESOURCE(pEntry->CPLInfo.idIcon)); + int index; + index = ImageList_AddIcon(hImgListSmall,hIcon); + ImageList_AddIcon(hImgListLarge,hIcon); + + + TCHAR Name[MAX_PATH]; + LoadString(pEntry->hDLL,pEntry->CPLInfo.idName,Name,MAX_PATH); + if(_tcslen(Name)) + { + + LV_ITEM lvi; + + memset(&lvi,0x00,sizeof(lvi)); + lvi.mask=LVIF_TEXT|LVIF_PARAM|LVIF_STATE|LVIF_IMAGE; + lvi.pszText = Name; + lvi.state=0; + lvi.iImage=index; + lvi.lParam = (LPARAM)pEntry; + pEntry->nIndex = ListView_InsertItem(hLisCtrl,&lvi); + + LoadString(pEntry->hDLL,pEntry->CPLInfo.idInfo,Name,MAX_PATH); + ListView_SetItemText(hLisCtrl,pEntry->nIndex,1,Name); + + ListView_SetImageList(hLisCtrl,hImgListSmall,LVSIL_SMALL); + ListView_SetImageList(hLisCtrl,hImgListLarge,LVSIL_NORMAL); + } + } + } + + if(!FindNextFile(hFind,&fd)) + hFind = INVALID_HANDLE_VALUE; + } +} + +LRESULT CALLBACK MyWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) +{ + switch(uMsg) + { + case WM_CREATE: + RECT rect; + 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); + CTL_DEBUG((_T("Listview Window %08X\r\n"),hListView)); + + LV_COLUMN column; + memset(&column,0x00,sizeof(column)); + column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM|LVCF_TEXT; + column.fmt=LVCFMT_LEFT; + column.cx = 200; + column.iSubItem = 0; + column.pszText = _T("Name"); + ListView_InsertColumn(hListView,0,&column); + column.cx = 200; + 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); + break; + case WM_DESTROY: + PostQuitMessage(0); + break; + case WM_SIZE: + GetClientRect(hWnd,&rect); + MoveWindow(hListView,0,0,rect.right,rect.bottom,TRUE); + break; + case WM_NOTIFY: + NMHDR *phdr; + phdr = (NMHDR*)lParam; + switch(phdr->code) + { + case NM_DBLCLK: + int nSelect; + nSelect=SendMessage(hListView,LVM_GETNEXTITEM,(WPARAM)-1,LVNI_FOCUSED); + + if(nSelect==-1) // no items + { + MessageBox(hWnd,_T("No Items in ListView"),_T("Error"),MB_OK|MB_ICONINFORMATION); + break; + } + CTL_DEBUG((_T("Select %d\r\n"),nSelect)); + LV_ITEM lvi; + memset(&lvi,0x00,sizeof(lvi)); + lvi.iItem = nSelect; + lvi.mask = LVIF_PARAM; + ListView_GetItem(hListView,&lvi); + CPLLISTENTRY *pEntry; + pEntry = (CPLLISTENTRY *)lvi.lParam; + CTL_DEBUG((_T("Listview DblClk Entry %08X\r\n"),pEntry)); + if(pEntry) { + CTL_DEBUG((_T("Listview DblClk Entry Func %08X\r\n"),pEntry->pFunc)); + } + if(pEntry && pEntry->pFunc) + pEntry->pFunc(hListView,CPL_DBLCLK,pEntry->CPLInfo.lData,0); + } + break; + case WM_COMMAND: + switch(LOWORD(wParam)) + { + case CM_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: + SetWindowLong(hListView,GWL_STYLE,LVS_SMALLICON | LVS_ALIGNLEFT | LVS_AUTOARRANGE | LVS_SINGLESEL | WS_VISIBLE | WS_CHILD|WS_BORDER|WS_TABSTOP); + break; + case CM_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: + SetWindowLong(hListView,GWL_STYLE,LVS_REPORT | LVS_ALIGNLEFT | LVS_AUTOARRANGE | LVS_SINGLESEL | WS_VISIBLE | WS_CHILD|WS_BORDER|WS_TABSTOP); + break; + case CM_CLOSE: + DestroyWindow(hWnd); + break; + case CM_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; + } + break; + default: + return DefWindowProc(hWnd,uMsg,wParam,lParam); + } + return 0; +} + +#ifdef _MSVC +int WINAPI wWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,WCHAR *lpCmdLine,int nCmdShow) +#else +int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,char *lpCmdLine,int nCmdShow) +#endif +{ + MSG msg; + hInst = hInstance; + CTL_DEBUG((_T("My Control Panel\r\n"))); + WNDCLASS wc; + memset(&wc,0x00,sizeof(wc)); + wc.hIcon = LoadIcon(hInst,MAKEINTRESOURCE(IDI_MAINICON)); + wc.lpszClassName = MYWNDCLASS; + wc.lpszMenuName = _T("MAINMENU"); + 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); + if(!hMainWnd) { + CTL_DEBUG((_T("Unable to create window\r\n"))); + return -1; + } + ShowWindow(hMainWnd,nCmdShow); + while(GetMessage(&msg,0,0,0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + return 0; +} diff --git a/reactos/lib/cpl/control/control.dsp b/reactos/lib/cpl/control/control.dsp new file mode 100644 index 00000000000..1eee558ee3e --- /dev/null +++ b/reactos/lib/cpl/control/control.dsp @@ -0,0 +1,137 @@ +# Microsoft Developer Studio Project File - Name="control" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=control - 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 "control.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 "control.mak" CFG="control - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "control - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "control - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "control - 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 Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /I "../../../" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" /d "MS_COMPILER" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib /nologo /subsystem:windows /machine:I386 +# Begin Custom Build +TargetDir=.\Release +TargetName=control +InputPath=.\Release\control.exe +InputName=control +SOURCE="$(InputPath)" + +"C:\reactos\reactos\$(InputName).EXE" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(TargetDir)\$(TargetName).EXE C:\reactos\reactos + +# End Custom Build + +!ELSEIF "$(CFG)" == "control - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /D "_UNICODE" /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" /d "MS_COMPILER" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# Begin Custom Build +TargetDir=.\Debug +TargetName=control +InputPath=.\Debug\control.exe +InputName=control +SOURCE="$(InputPath)" + +"C:\reactos\reactos\$(InputName).EXE" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(TargetDir)\$(TargetName).EXE C:\reactos\reactos + +# End Custom Build + +!ENDIF + +# Begin Target + +# Name "control - Win32 Release" +# Name "control - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\control.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\config.ico +# End Source File +# Begin Source File + +SOURCE=.\control.rc +# End Source File +# End Group +# End Target +# End Project diff --git a/reactos/lib/cpl/control/control.dsw b/reactos/lib/cpl/control/control.dsw new file mode 100644 index 00000000000..1beaf5dbd74 --- /dev/null +++ b/reactos/lib/cpl/control/control.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "control"=.\control.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/reactos/lib/cpl/control/control.rc b/reactos/lib/cpl/control/control.rc new file mode 100644 index 00000000000..dd762d83277 --- /dev/null +++ b/reactos/lib/cpl/control/control.rc @@ -0,0 +1,86 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +#ifndef MS_COMPILER +#include <reactos/resource.h> +#include <defines.h> +#else +#include <../../../include/reactos/resource.h> +#include <../../../include/defines.h> +#endif + +LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT + + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MAINMENU MENU DISCARDABLE +BEGIN + POPUP "&File" + BEGIN + MENUITEM "&Close", CM_CLOSE + END + POPUP "&View" + BEGIN + MENUITEM "Large Icons", CM_LARGEICONS + MENUITEM "Small Icons", CM_SMALLICONS + MENUITEM "List", CM_LIST + MENUITEM "Details", CM_DETAILS + END + POPUP "Help" + BEGIN + MENUITEM "About", CM_ABOUT + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_MAINICON ICON DISCARDABLE "resources\config.ico" +///////////////////////////////////////////////////////////////////////////// + + + +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 System Control Panel\0" + VALUE "FileVersion", RES_STR_FILE_VERSION + VALUE "InternalName", "control\0" + VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT + VALUE "OriginalFilename", "control.exe\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/cpl/control/resource.h b/reactos/lib/cpl/control/resource.h new file mode 100644 index 00000000000..053c1da5f2c --- /dev/null +++ b/reactos/lib/cpl/control/resource.h @@ -0,0 +1,27 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by control.rc +// +#define IDR_MENU1 101 +#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 + +// 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_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/reactos/lib/cpl/control/resources/config.ico b/reactos/lib/cpl/control/resources/config.ico new file mode 100644 index 0000000000000000000000000000000000000000..0c9c1ee400a34b2e528ef03cfe08caae0237279c GIT binary patch literal 9062 zcmds633QZImVT8ANmY_cWlyTIRHZ5*6{w(W(?C1Yqo6dcWA}{E*v)CN35;8JXg~^1 zqba6Efte$qL<kX;RW=oYX^_~OMw%c55rme-Kv*LXAP51%l5f8IR~1x>gr$XZ=FC0$ z>izG%`|iDO`QQ8AAEk6ET-ohPlZ6JQ9^zA6oG<@$8>LRN>}oyB`^N^=hbz^TrId^6 zcH$?5PO$;S%es~%UJCs`@$vD>p()94Xa03o4u^wDXEl^iorm&ysOr_Lm+IHApBg%J zsPcF`s<^mVmGW5)Eu~5+(<-J!DW6LvtzrtMpbGO<%vUi_3<cDL2@_N)br&yQtjf#F zRTZDBs8d~Ct-ur@sC)9{Nj^i1@c+_JMQRDd>82L;YE;pDnqlas<(EAfqh@GzO4V3O zRQ-gDYFM`htq-C*?8OGvV^V`Q$1=|{Ma$B}mQtHoKVWgB+WcP)YII^7^`j{bTKWCd zzgyy8W@@AwrBvM&Werp6k(3fOh;dv_F45v%X)RH`8Gws*G8YGSHmDcN8q~Bu>sZ=G zon?Q$Do%->^mjsrufM_Zmo2YVtEf#AY995ZWf~z8$8mbV_o&YL$HJdgF?^6VIvvM= z@s0FX=$VdHRxM5`l6d*5s83hasz+#V?#fz~Bu;`v?0Eh8|7HxuM}MY%{(yM!iI-); zIu&^(YF)#JT3N3i1J#Hjqt%e%Bh|p+L)74rMQY%P7u1L`BQy;8-9R;Z*z;=mkm1A# zHMr>a>Y4xOpskGoH2>I-w`=R6Gt<JqHK;|Wua8gBzpNiw7b0I!N1kQ80<W^<1MB82 z`ziKh+>L#Xs?~8vwfT{DDaU@M^*>;50ChwPZ$-il`tq>W6!nH=OR6<V-&(yPH9f<Y zk&$d@Ss@}hJv}`m-EK>cXi<U9?V5r;IkF{%C^i<c+ihtrSumue+o{12?DiHFBs{xR z^UvBskP^SBFpMm_HRAelFj*MA-A)_nv=DxMkS41wo8d_qc6(C!^$Iaot$ljB)s|^4 zY(aq*XduI4&&<t@HYYlriDqLnwHPa_)9u#0{Jgwem%F{&og3Fo!9)eC)s>f<?{d2f zMBI)x!I8w+?U}B;{M<Y@MN=q<53VnaNp|MD@?2~lP;kdKQz$n&q&na2Zs%)X;A~c3 zSQwp`m+z*5_66-Vm3(6}h4Q$zE(+bZbC_KcVsi)jMA~<`T?{?EP!vMy!xE);u7Z44 z7Z%3lht?NL`+T>rnhNd^|Al7p?{);1a(qs+@Cpl!j(i%(i4GJu51*xp9DA2L_o_lb zF_4BQO84ElQO)KiP|MVqm@A{3AKRKjxw);(P;OLEqvns{QPJkusPN{6t>$Wa0u?sE zYvx8CN$3e3!JR{?VxlKugIAeR!GaoQ>XnMTpp^bHx8Wv&3W^F!6hMU_cu}LPK)tR8 z_3AWHj0-e&nP?*5?I}D(&Kx@t;3?W+z<j8*#8b#fC=Q}IPYH08R{4o=5F)@y0$e1R zgOrkY1apvJ?(zSCr+7kmiY|nwc*s*cJl{c{;vrA*kf(Tp&zm5g;_>qokDsS_WLC&i zv{at&w1n`K;ud%cLU;<uQ#|A;o)Df=;pZtH@)WJV<SAF<Cr|PGK%U|uPbm)JDPh7- zM1pvV$Inwdex6dHDexzlg9PyuVKbV}O?XNXdCD;Ilo8}9Pm!mLAW!)%dCEXyBzX#J zpD!X$VfBcC<S9eRQ=XBvF@PXX@d$4vuketkc*s)%@v+t~KAxhJwIM>jp{<jf@Dz`q zr+COyv~ibqK|DpX7vL$%sf%<vefH(o8IzQp5L6JJl#*iM!5Gjmq^6{#SrWqn1-b-F ziX}Des)kdaWU-`a1v*W~sZX|0#TsQY88tI3NK4JgvS&MNW=+KznV89JHm^gmz9!CS zn@!7S`RJH4D$ADbFvmI^MlBAf$!@d7JDuiie?B6^krD1xPLn?@XRO_k-i8H%ye>8? zJDnN<aXQ1JjN<)I++=+lEvt%&o&=YWm#d(Hk2M7MWyO8j2VVIuGpfsa-Uo^1_dz?g zD1n#Amka%s^_54=B=!<@#1Uc*@$Uq0op(*d_Y=hThJ*~Hb^jGI`wT~V@8@93?gCwy z96f3-kwV-Jxt|w|#*~haA^Vv{NSk^9Y4gq^bABCiCT)PN|9FH&MDgfT?-6%82F|M5 z5ueio8Nd4<#Fkw_!dxKvJs|CUAafOvGyeeWzj+N|k#{AA2X$fLO^(OLA$n>fOfvy< z8DM-JFiZukj3Ijskhk;@vY&eWZp1LQO>_dXe!Bq1X+Yd8AmLpgmT@G^2BKJImoZq^ zgmx>AAbZI4I~_xDgeeJ`LzZa%Qx^g8Zv){IftWXe=n|iQ`|3+@u5CoYn(vVPbQxoa zzEkUAKv)|CvirXV;~Q5HN8k5;?TaD)9Uz74K<odfK*opXk@NX^+*5H3+0Vawr(%#@ z;kczse<Y9H22&}J$n}@;5n$omOKM*YwEe3uj@0=LX#05sI#t%eQ8W)>hC4D2Pjd{K z?0r2*o=}ZA&VSN8uKy)K)=D6MJ=fpoKL3`bTo*IXFn<PJH=l%K#KPbhlGvAjMC8bw zp^uD){a?o-ZSp?kt_A+78tAeM=&&WkKjSk^J`LBp@6m00J)EPKLdW=N<4HnnaR=6} z?2^jfb}J&fS`690@FHXSe&lZiy6$P&f6U}FNSSdMKiYN*_q_ZUNbGDcmwcffvWL$n zCKH2*_CyqMvskXh&~H3!vkt)Z#r6K<%g!Nn)=_lcbP_*(YdhX~eFh%v+7;n?JyH`B z(a!0_z4`gbvDpw4t;KbgzE==E2-)v$B)%97G01*m5*+gmA#cOA@lRcF9%*yy(6RCa z`jmc!4eK}I+poXI2Qz14%IMKp{?0q7{P<&RTfZJvpM8ea3m4*5mb-Ftz|Kn?GCrmo z1;Dy%F${bSxl4|qE!SY?M~$#7K7|fz>+sVzH{;8yt=LLG8_LVEf7dSTVH~wJH8^$r zIL@9vjq?o+xNz<qPM<iT#q#W+LD1{9v&>5$G9Nb*e+(u#2E7i~@>)3m+6eb2$I*A% z7uddi7j|yhf-l#u)%+jcyBBq}wWzPF!<qVe&G)5?7lEcG{x#vs<;ys*XAi~{6(LNg zyGY0V2=Q?vxfVm=bhMkl8$WsZV{EFd!rs6C9XmE{!WR0MzJGV%K&$@cP7#pm9Xrss zcW+s%y9vvUocrs1F&Irq|M?jF@}a(1_SRe2#lDMwiQ`ap^)36qa^(ujmo0<QpuMk8 z-GYBnkr<{D$GOIv20rirR?nZ0Z?|tp&CZ>z`oGxNh{g*SwDAx0Us72k|J=R1jKON+ zc0}Ht%{};T&7L?>8-v#TpF4XNM-Lvv$~kjz^w6PT_u85q$9ICZ4&IJ)>dH7A{$<ae zc)zq%d+%yE_o3te{i#!^-M=5RCQX7ZJsp$1UTtjzg1F4J_;yK&_!o|OJ0kzsIPug& z4`Ic-@A}3+#Q&*d$8hl5Z!z=LSCPWKi25~AMq|?(<HzH~(W6=j@-EDtG2<WcFQ1r? z{iav17X2SPd{|qLZ;l&><b(vV{|O=I>qLoRI>$ry23Z$VUU^08j}f;kTOaP+8A}=e z?yXx97=IaWc_*fh9gF1nc(MH#BEZ?@Oqv)S71cC{<1YKauOEM0bT$&VD^u*LshG(* zmAy~i{X^V)4)5Eiy_ffO>Lhj>iM~YOv$gop&RDa_gtEz#VWAC{jggAmlmdNN*p)x@ z>xZ?=mt)^I-)R12|B*d#(X?r}CofNIe@FZa5gdc8-x8fpcZq2=VI^)?<P2S%!*yL+ zT#Rj%l{gr*|H!+xWcqY;XdZ+34T!W)C2qF=2lQJ?Ggx@?L5}qTj^(bezS7>e!2U05 z?1Qp0wBwmay;?%f-QXCQ{lRiS$MI};w;R)6dP!RgvftGE&%QG}|CZ05jrO^@5<?AP zC+@V|OM`pkV`DMk;fL|Yi!b8ObLZj<p2r*3tieh?dxs4}7}pE+I^1dJetR;H{O6h4 zFK0snW8sH)SW{9E6BQ+WKTpgeB8a;wvNv`oBo?n9PcpR;^6s@L6*k|uU~eS9|K8wR zu$NyUDwHzUkiXS)E%Cd9PA=s_dZm-v_h42c81>4_Z@~N>tOgMsn|}*d^js10J=ji5 zl;AhkR}%PrJR&-NMP!`yGZwr=$Y-lt625d##C7^NSYFwJtg?Nu4w^_V7WqCK-;4`t z_6=ss`lSEd4byzykLU1C{0U$iHUs)_!!6l}wzS)sFy$1I7xPa02Jh9pSLIdG&gfaR z5p`1=ZQ2;hk_+EM8r!9R2sn5rxA9(<Qvo==a}Z{X6&vOo3`T}A&a&A$Y7N?b3EZ=d zzCY%D`|Tz;Xe0gilVuwJL^z2&;@Uq(nej`OF)n?xW8$YM*x_q$o^t`6KRSl-vp&H6 z9q(=YMV~$m{U3ewT%OapjctmE(Amr~#Aj}HPF@GwI-t|C@37?4&Dc}94%Ot(XULU7 z-YR=ZF*yp~sW)jObnnVCq&PNb|8WuC`mh3rzTQGEvQ0Z%8_t{w&<rgtdiGiAmwdkp zl}x<~oAayQy)J*Vaihk`WdA(J_7}<7FP%THwcky?$}?+eXk&jq_rWe*F6`hL5a9h6 z*#6})WANPI!MH^3C;Y!d`}XTwY2V?I`|i86yQ)g#ueCfw$Bi0wNw3q%z3sUdii(=* zjvPT=PEJKD?M<%C%!3<Nt<v`0O73}S2?-~uEAuBZ?9o1b8hP%I_hqmD<;F1fg~CD{ zCnuHImn~QTOLFp;)Xep3cV#LZrZq7bBO=}#&i)D?xWIjX0l8s<*<8s6x4P%a{0_Dx cC9Ue#vEz<T1qB-ok&%C7+0}Xfq2ELQ7x=KQh5!Hn literal 0 HcmV?d00001 From 03c4c34d21145a33758bf47957a7f879ef5c3797 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" <hackbunny@reactos.org> Date: Fri, 18 Jun 2004 22:33:06 +0000 Subject: [PATCH 1419/1463] Attempt to fix PSEH compilation for kernel-mode targets. Arty please test this svn path=/trunk/; revision=9716 --- reactos/include/pseh/framebased.h | 28 +++++++++++++++++++--------- reactos/tools/helper.mk | 6 +++--- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/reactos/include/pseh/framebased.h b/reactos/include/pseh/framebased.h index 344e0d08401..a203a045f27 100644 --- a/reactos/include/pseh/framebased.h +++ b/reactos/include/pseh/framebased.h @@ -24,18 +24,28 @@ #define KJK_PSEH_FRAMEBASED_H_ #include <pseh/framebased/internal.h> -#include <excpt.h> -#ifdef _SEH_NO_NATIVE_NLG -#include <pseh/setjmp.h> -#define longjmp _SEHLongJmp -#define setjmp _SEHSetJmp -#define jmp_buf _SEHJmpBuf_t -#else -#include <setjmp.h> +/* Safeguards against broken SDK/CRT headers */ +#ifndef _SEH_NO_SYSTEM_HEADERS +# include <excpt.h> #endif -#include <stddef.h> +#ifndef offsetof +# include <stddef.h> +#endif + +/* + Fall back to non-optimal, non-native NLG implementation for environments + without their own (e.g., currently, kernel-mode ReactOS/Windows) +*/ +#ifdef _SEH_NO_NATIVE_NLG +# include <pseh/setjmp.h> +# define longjmp _SEHLongJmp +# define setjmp _SEHSetJmp +# define jmp_buf _SEHJmpBuf_t +#else +# include <setjmp.h> +#endif typedef struct __SEHFrame { diff --git a/reactos/tools/helper.mk b/reactos/tools/helper.mk index bbc7fceefff..71875be6d72 100644 --- a/reactos/tools/helper.mk +++ b/reactos/tools/helper.mk @@ -1,4 +1,4 @@ -# $Id: helper.mk,v 1.67 2004/06/05 09:47:35 hbirr Exp $ +# $Id: helper.mk,v 1.68 2004/06/18 22:33:06 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 - MK_CPPFLAGS += -D_SEH_NO_NATIVE_NLG + MK_CFLAGS += -D_SEH_NO_NATIVE_NLG -D_SEH_NO_SYSTEM_HEADERS + MK_CPPFLAGS += -D_SEH_NO_NATIVE_NLG -D_SEH_NO_SYSTEM_HEADERS endif From fa242a92676709969bd8cf6096a9ec6433cb8ddc Mon Sep 17 00:00:00 2001 From: Gero Kuehn <reactos.filter@gkware.com> Date: Sat, 19 Jun 2004 00:11:44 +0000 Subject: [PATCH 1420/1463] changed from control.cpp to control.c, changed \ to / in control.c svn path=/trunk/; revision=9717 --- .../cpl/control/{control.cpp => control.c} | 35 ++++++++++++------- reactos/lib/cpl/control/control.dsp | 2 +- reactos/lib/cpl/control/control.rc | 2 +- 3 files changed, 25 insertions(+), 14 deletions(-) rename reactos/lib/cpl/control/{control.cpp => control.c} (96%) diff --git a/reactos/lib/cpl/control/control.cpp b/reactos/lib/cpl/control/control.c similarity index 96% rename from reactos/lib/cpl/control/control.cpp rename to reactos/lib/cpl/control/control.c index ea5335c5af0..26689e015f1 100644 --- a/reactos/lib/cpl/control/control.cpp +++ 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.cpp,v 1.1 2004/06/18 20:43:44 kuehng Exp $ +/* $Id: control.c,v 1.1 2004/06/19 00:11:44 kuehng Exp $ * * PROJECT: ReactOS System Control Panel * FILE: lib/cpl/system/control.cpp @@ -78,17 +78,17 @@ void PopulateCPLList(HWND hLisCtrl) WIN32_FIND_DATA fd; HANDLE hFind; TCHAR pszSearchPath[MAX_PATH]; + HIMAGELIST hImgListSmall; + HIMAGELIST hImgListLarge; GetSystemDirectory(pszSearchPath,MAX_PATH); _tcscat(pszSearchPath,_T("\\*.cpl")); hFind = FindFirstFile(pszSearchPath,&fd); - HIMAGELIST hImgListSmall; - HIMAGELIST hImgListLarge; hImgListSmall = ImageList_Create(16,16,ILC_COLOR,256,1000); hImgListLarge = ImageList_Create(32,32,ILC_COLOR,256,1000); while(hFind != INVALID_HANDLE_VALUE) { - CTL_DEBUG((_T("Found %s\r\n"),fd.cFileName)); CPLLISTENTRY *pEntry; + CTL_DEBUG((_T("Found %s\r\n"),fd.cFileName)); pEntry = (CPLLISTENTRY*)malloc(sizeof(CPLLISTENTRY)); if(!pEntry) break; @@ -103,17 +103,19 @@ void PopulateCPLList(HWND hLisCtrl) CTL_DEBUG((_T("CPLFunc %08X\r\n"),pEntry->pFunc)); if(pEntry->pFunc && pEntry->pFunc(hLisCtrl,CPL_INIT,0,0)) { - for(int i=0;i<pEntry->pFunc(hLisCtrl,CPL_GETCOUNT,0,0);i++) + int i; + for(i=0;i<pEntry->pFunc(hLisCtrl,CPL_GETCOUNT,0,0);i++) { + HICON hIcon; + TCHAR Name[MAX_PATH]; + int index; pEntry->pFunc(hLisCtrl,CPL_INQUIRE,0,(LPARAM)&pEntry->CPLInfo); - HICON hIcon = LoadIcon(pEntry->hDLL,MAKEINTRESOURCE(pEntry->CPLInfo.idIcon)); - int index; + hIcon = LoadIcon(pEntry->hDLL,MAKEINTRESOURCE(pEntry->CPLInfo.idIcon)); index = ImageList_AddIcon(hImgListSmall,hIcon); ImageList_AddIcon(hImgListLarge,hIcon); - TCHAR Name[MAX_PATH]; LoadString(pEntry->hDLL,pEntry->CPLInfo.idName,Name,MAX_PATH); if(_tcslen(Name)) { @@ -147,12 +149,13 @@ 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); CTL_DEBUG((_T("Listview Window %08X\r\n"),hListView)); - LV_COLUMN column; memset(&column,0x00,sizeof(column)); column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM|LVCF_TEXT; column.fmt=LVCFMT_LEFT; @@ -167,21 +170,29 @@ LRESULT CALLBACK MyWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) PopulateCPLList(hListView); ListView_SetColumnWidth(hListView,2,LVSCW_AUTOSIZE_USEHEADER); ListView_Update(hListView,0); + } break; case WM_DESTROY: 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) { case NM_DBLCLK: + { int nSelect; + LV_ITEM lvi; + CPLLISTENTRY *pEntry; nSelect=SendMessage(hListView,LVM_GETNEXTITEM,(WPARAM)-1,LVNI_FOCUSED); if(nSelect==-1) // no items @@ -190,12 +201,10 @@ LRESULT CALLBACK MyWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) break; } CTL_DEBUG((_T("Select %d\r\n"),nSelect)); - LV_ITEM lvi; memset(&lvi,0x00,sizeof(lvi)); lvi.iItem = nSelect; lvi.mask = LVIF_PARAM; ListView_GetItem(hListView,&lvi); - CPLLISTENTRY *pEntry; pEntry = (CPLLISTENTRY *)lvi.lParam; CTL_DEBUG((_T("Listview DblClk Entry %08X\r\n"),pEntry)); if(pEntry) { @@ -203,6 +212,8 @@ LRESULT CALLBACK MyWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) } if(pEntry && pEntry->pFunc) pEntry->pFunc(hListView,CPL_DBLCLK,pEntry->CPLInfo.lData,0); + } + } } break; case WM_COMMAND: @@ -241,9 +252,9 @@ int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,char *lpCmdLine,i #endif { MSG msg; + WNDCLASS wc; hInst = hInstance; CTL_DEBUG((_T("My Control Panel\r\n"))); - WNDCLASS wc; memset(&wc,0x00,sizeof(wc)); wc.hIcon = LoadIcon(hInst,MAKEINTRESOURCE(IDI_MAINICON)); wc.lpszClassName = MYWNDCLASS; diff --git a/reactos/lib/cpl/control/control.dsp b/reactos/lib/cpl/control/control.dsp index 1eee558ee3e..df2978730f4 100644 --- a/reactos/lib/cpl/control/control.dsp +++ b/reactos/lib/cpl/control/control.dsp @@ -114,7 +114,7 @@ SOURCE="$(InputPath)" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File -SOURCE=.\control.cpp +SOURCE=.\control.c # End Source File # End Group # Begin Group "Header Files" diff --git a/reactos/lib/cpl/control/control.rc b/reactos/lib/cpl/control/control.rc index dd762d83277..292af968d2d 100644 --- a/reactos/lib/cpl/control/control.rc +++ b/reactos/lib/cpl/control/control.rc @@ -44,7 +44,7 @@ END // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. -IDI_MAINICON ICON DISCARDABLE "resources\config.ico" +IDI_MAINICON ICON DISCARDABLE "resources/config.ico" ///////////////////////////////////////////////////////////////////////////// From 5954327e76d7febb211f568b137c5b900b0c5894 Mon Sep 17 00:00:00 2001 From: Art Yerkes <art.yerkes@gmail.com> Date: Sat, 19 Jun 2004 02:03:33 +0000 Subject: [PATCH 1421/1463] Change from unclegarlic: Don't overwrite packet length. svn path=/trunk/; revision=9718 --- reactos/drivers/net/tcpip/datalink/lan.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/net/tcpip/datalink/lan.c b/reactos/drivers/net/tcpip/datalink/lan.c index b7639557e5d..1cd33ec8c35 100644 --- a/reactos/drivers/net/tcpip/datalink/lan.c +++ b/reactos/drivers/net/tcpip/datalink/lan.c @@ -281,7 +281,7 @@ NDIS_STATUS STDCALL ProtocolReceive( PLAN_ADAPTER Adapter = (PLAN_ADAPTER)BindingContext; PETH_HEADER EHeader = (PETH_HEADER)HeaderBuffer; - TI_DbgPrint(DEBUG_DATALINK, ("Called.\n")); + TI_DbgPrint(DEBUG_DATALINK, ("Called. (packetsize %d)\n",PacketSize)); if (Adapter->State != LAN_STATE_STARTED) { TI_DbgPrint(DEBUG_DATALINK, ("Adapter is stopped.\n")); @@ -317,11 +317,17 @@ NDIS_STATUS STDCALL ProtocolReceive( KeAcquireSpinLockAtDpcLevel(&Adapter->Lock); NdisStatus = AllocatePacketWithBuffer( &NdisPacket, NULL, Adapter->MTU ); if( NdisStatus != NDIS_STATUS_SUCCESS ) return NDIS_STATUS_NOT_ACCEPTED; - GetDataPtr( NdisPacket, 0, &BufferData, &PacketSize ); + TI_DbgPrint(DEBUG_DATALINK, ("pretransfer LookaheadBufferSize %d packsize %d\n",LookaheadBufferSize,PacketSize)); + { + UINT temp; + temp = PacketSize; + GetDataPtr( NdisPacket, 0, &BufferData, &temp ); + } IPPacket.NdisPacket = NdisPacket; if (LookaheadBufferSize < PacketSize) { + TI_DbgPrint(DEBUG_DATALINK, ("pretransfer LookaheadBufferSize %d packsize %d\n",LookaheadBufferSize,PacketSize)); /* Get the data */ NdisTransferData(&NdisStatus, Adapter->NdisHandle, @@ -331,6 +337,7 @@ NDIS_STATUS STDCALL ProtocolReceive( NdisPacket, &BytesTransferred); } else { + TI_DbgPrint(DEBUG_DATALINK, ("copy\n")); NdisStatus = NDIS_STATUS_SUCCESS; BytesTransferred = PacketSize; RtlCopyMemory(BufferData, @@ -339,6 +346,7 @@ NDIS_STATUS STDCALL ProtocolReceive( RtlCopyMemory(BufferData + HeaderBufferSize, LookaheadBuffer, LookaheadBufferSize); } + TI_DbgPrint(DEBUG_DATALINK, ("Calling complete\n")); if (NdisStatus != NDIS_STATUS_PENDING) ProtocolTransferDataComplete(BindingContext, @@ -348,6 +356,7 @@ NDIS_STATUS STDCALL ProtocolReceive( /* Release the packet descriptor */ KeReleaseSpinLockFromDpcLevel(&Adapter->Lock); + TI_DbgPrint(DEBUG_DATALINK, ("leaving\n")); return NDIS_STATUS_SUCCESS; } From 0cbe4f28426e5b135a4e2924fadaa32abf36a6cd Mon Sep 17 00:00:00 2001 From: Steven Edwards <winehacker@gmail.com> Date: Sat, 19 Jun 2004 05:04:33 +0000 Subject: [PATCH 1422/1463] added stubs for the Cache Manager by Alex Ionescu. svn path=/trunk/; revision=9719 --- reactos/include/ddk/ccfuncs.h | 38 ++- reactos/ntoskrnl/cc/copy.c | 459 +++++++++++++++++++++++++++++++++- reactos/ntoskrnl/ntoskrnl.edf | 38 ++- 3 files changed, 526 insertions(+), 9 deletions(-) diff --git a/reactos/include/ddk/ccfuncs.h b/reactos/include/ddk/ccfuncs.h index fc179583324..3b624d9279d 100644 --- a/reactos/include/ddk/ccfuncs.h +++ b/reactos/include/ddk/ccfuncs.h @@ -1,14 +1,14 @@ #ifndef _NTOS_CCFUNCS_H #define _NTOS_CCFUNCS_H -/* $Id: ccfuncs.h,v 1.8 2002/09/08 10:47:43 chorns Exp $ */ +/* $Id: ccfuncs.h,v 1.9 2004/06/19 05:04:08 sedwards Exp $ */ /* exported variables */ -/* -CcFastMdlReadWait -CcFastReadNotPossible -CcFastReadWait -*/ +/* these should be in the KPCR */ + +extern ULONG CcFastMdlReadWait; +extern ULONG CcFastReadNotPossible; +extern ULONG CcFastReadWait; BOOLEAN STDCALL @@ -101,6 +101,13 @@ CcGetFileObjectFromSectionPtrs ( IN PSECTION_OBJECT_POINTERS SectionObjectPointer ); +LARGE_INTEGER +STDCALL +CcGetFlushedValidData ( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN BOOLEAN BcbListHeld + ); + LARGE_INTEGER STDCALL CcGetLsnForFileObject ( @@ -152,6 +159,13 @@ CcMdlReadComplete ( IN PMDL MdlChain ); +VOID +STDCALL +CcMdlWriteAbort ( + IN PFILE_OBJECT FileObject, + IN PMDL MdlChain + ); + VOID STDCALL CcMdlWriteComplete ( @@ -226,6 +240,12 @@ CcRepinBcb ( IN PVOID Bcb ); +VOID +STDCALL +CcRemapBcb ( + IN PVOID Bcb + ); + VOID STDCALL CcScheduleReadAhead ( @@ -314,6 +334,12 @@ CcUnpinRepinnedBcb ( IN PIO_STATUS_BLOCK IoStatus ); +NTSTATUS +STDCALL +CcWaitForCurrentLazyWriterActivity ( + VOID + ); + BOOLEAN STDCALL CcZeroData ( diff --git a/reactos/ntoskrnl/cc/copy.c b/reactos/ntoskrnl/cc/copy.c index e91f47b5086..0327a617d78 100644 --- a/reactos/ntoskrnl/cc/copy.c +++ b/reactos/ntoskrnl/cc/copy.c @@ -1,4 +1,4 @@ -/* $Id: copy.c,v 1.23 2004/06/06 08:36:30 hbirr Exp $ +/* $Id: copy.c,v 1.24 2004/06/19 05:04:33 sedwards Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -43,6 +43,10 @@ void* _alloca(size_t size); #error Unknown compiler for alloca intrinsic stack allocation "function" #endif +ULONG EXPORTED CcFastMdlReadWait; +ULONG EXPORTED CcFastReadNotPossible; +ULONG EXPORTED CcFastReadWait; + /* FUNCTIONS *****************************************************************/ VOID @@ -280,6 +284,459 @@ WriteCacheSegment(PCACHE_SEGMENT CacheSeg) return(STATUS_SUCCESS); } +/* STUBS */ + +/* + * @unimplemented + */ +BOOLEAN STDCALL +CcCanIWrite ( + IN PFILE_OBJECT FileObject, + IN ULONG BytesToWrite, + IN BOOLEAN Wait, + IN BOOLEAN Retrying) +{ + UNIMPLEMENTED; + 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 */ diff --git a/reactos/ntoskrnl/ntoskrnl.edf b/reactos/ntoskrnl/ntoskrnl.edf index e05d6846560..00bbdce0fda 100644 --- a/reactos/ntoskrnl/ntoskrnl.edf +++ b/reactos/ntoskrnl/ntoskrnl.edf @@ -1,4 +1,4 @@ -; $Id: ntoskrnl.edf,v 1.170 2004/06/13 10:35:53 navaraf Exp $ +; $Id: ntoskrnl.edf,v 1.171 2004/06/19 05:04:33 sedwards Exp $ ; ; reactos/ntoskrnl/ntoskrnl.def ; @@ -6,16 +6,50 @@ ; EXPORTS CcRosInitializeFileCache=CcRosInitializeFileCache@8 -CcMdlReadComplete=CcMdlReadComplete@8 CcRosReleaseFileCache=CcRosReleaseFileCache@4 +CcCanIWrite=CcCanIWrite@16 CcCopyRead=CcCopyRead@24 CcCopyWrite=CcCopyWrite@20 +CcDeferWrite=CcDeferWrite@24 +CcFastCopyRead=CcFastCopyRead@24 +CcFastCopyWrite=CcFastCopyWrite@16 CcFlushCache=CcFlushCache@16 +CcGetDirtyPages=CcGetDirtyPages@16 +CcGetFileObjectFromBcb=CcGetFileObjectFromBcb@4 CcGetFileObjectFromSectionPtrs=CcGetFileObjectFromSectionPtrs@4 +CcGetFlushedValidData=CcGetFlushedValidData@8 +CcGetLsnForFileObject=CcGetLsnForFileObject@8 +CcInitializeCacheMap=CcInitializeCacheMap@20 +CcIsThereDirtyData=CcIsThereDirtyData@4 +CcFastMdlReadWait DATA +CcFastReadNotPossible DATA +CcFastReadWait DATA CcMapData=CcMapData@24 +CcMdlRead=CcMdlRead@20 +CcMdlReadComplete=CcMdlReadComplete@8 +CcMdlWriteAbort=CcMdlWriteAbort@8 +CcMdlWriteComplete=CcMdlWriteComplete@12 +CcPinMappedData=CcPinMappedData@20 +CcPinRead=CcPinRead@24 +CcPrepareMdlWrite=CcPrepareMdlWrite@20 +CcPreparePinWrite=CcPreparePinWrite@28 +CcPurgeCacheSection=CcPurgeCacheSection@16 +CcRemapBcb=CcRemapBcb@4 +CcRepinBcb=CcRepinBcb@4 +CcScheduleReadAhead=CcScheduleReadAhead@12 +CcSetAdditionalCacheAttributes=CcSetAdditionalCacheAttributes@12 +CcSetBcbOwnerPointer=CcSetBcbOwnerPointer@8 +CcSetDirtyPageThreshold=CcSetDirtyPageThreshold@8 CcSetDirtyPinnedData=CcSetDirtyPinnedData@8 +CcSetLogHandleForFile=CcSetLogHandleForFile@12 +CcSetReadAheadGranularity=CcSetReadAheadGranularity@8 +CcUninitializeCacheMap=CcUninitializeCacheMap@12 CcUnpinData=CcUnpinData@4 +CcUnpinDataForThread=CcUnpinDataForThread@8 +CcUnpinRepinnedBcb=CcUnpinRepinnedBcb@12 +CcWaitForCurrentLazyWriterActivity=CcWaitForCurrentLazyWriterActivity@0 CcSetFileSizes=CcSetFileSizes@8 +CcUnpinData=CcUnpinData@4 CcZeroData=CcZeroData@16 DbgBreakPoint=DbgBreakPoint@0 DbgBreakPointWithStatus=DbgBreakPointWithStatus@4 From 2a5689bb0bd9f573ce83cad88c0351c650bb3a03 Mon Sep 17 00:00:00 2001 From: Vizzini <vizzini@plasmic.com> Date: Sat, 19 Jun 2004 06:03:37 +0000 Subject: [PATCH 1423/1463] added support for setting Component Information for the ISA bus; fixed a minor bug svn path=/trunk/; revision=9720 --- freeldr/freeldr/arch/i386/hardware.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/freeldr/freeldr/arch/i386/hardware.c b/freeldr/freeldr/arch/i386/hardware.c index 9f6581ee19a..2e5b37f070a 100644 --- a/freeldr/freeldr/arch/i386/hardware.c +++ b/freeldr/freeldr/arch/i386/hardware.c @@ -1951,6 +1951,12 @@ DetectIsaBios(HKEY SystemKey, U32 *BusNumber) return; } + /* Set 'Component Information' value similar to my NT4 box */ + SetComponentInformation(BusKey, + 0x0, + 0x0, + 0xFFFFFFFF); + /* Increment bus number */ (*BusNumber)++; @@ -1984,7 +1990,7 @@ DetectIsaBios(HKEY SystemKey, U32 *BusNumber) FullResourceDescriptor->PartialResourceList.Count = 0; /* Set 'Configuration Data' value */ - Error = RegSetValue(SystemKey, + Error = RegSetValue(BusKey, "Configuration Data", REG_FULL_RESOURCE_DESCRIPTOR, (PU8) FullResourceDescriptor, @@ -1998,7 +2004,6 @@ DetectIsaBios(HKEY SystemKey, U32 *BusNumber) return; } - /* Detect ISA/BIOS devices */ DetectBiosDisks(SystemKey, BusKey); From 88f213ea72d35d6b4c7ecc1270d64e420d24fe19 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 19 Jun 2004 07:56:16 +0000 Subject: [PATCH 1424/1463] - Corrected shell paths. svn path=/trunk/; revision=9721 --- reactos/bootdata/hivedef.inf | 22 +++++++++++----------- reactos/bootdata/hivesft.inf | 28 ++++++++++++++-------------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/reactos/bootdata/hivedef.inf b/reactos/bootdata/hivedef.inf index 5c0a929e7ea..15fcec6375b 100644 --- a/reactos/bootdata/hivedef.inf +++ b/reactos/bootdata/hivedef.inf @@ -20,17 +20,17 @@ HKCU,"SOFTWARE\Microsoft\Windows",,0x00000012 HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion",,0x00000012 HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer",,0x00000012 HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Desktop",0x00020000,"%SystemDrive%\Documents and Settings\Default\Desktop" -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","AppData",0x00020000,"%SystemDrive%\Documents and Settings\Default\Application Data" -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Programs",0x00020000,"%SystemDrive%\Documents and Settings\Default\Start Menu\Programs" -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Start Menu",0x00020000,"%SystemDrive%\Documents and Settings\Default\Start Menu" -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Favorites",0x00020000,"%SystemDrive%\Documents and Settings\Default\Favorites" -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Startup",0x00020000,"%SystemDrive%\Documents and Settings\Default\Start Menu\Programs\Startup" -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Templates",0x00020000,"%SystemDrive%\Documents and Settings\Default\Templates" -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Personal",0x00020000,"%SystemDrive%\Documents and Settings\Default\My Documents" -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","SendTo",0x00020000,"%SystemDrive%\Documents and Settings\Default\SendTo" -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Recent",0x00020000,"%SystemDrive%\Documents and Settings\Default\Recent" -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","NetHood",0x00020000,"%SystemDrive%\Documents and Settings\Default\NetHood" +HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Desktop",0x00020000,"%USERPROFILE%\Desktop" +HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","AppData",0x00020000,"%USERPROFILE%\Application Data" +HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Programs",0x00020000,"%USERPROFILE%\Start Menu\Programs" +HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Start Menu",0x00020000,"%USERPROFILE%\Start Menu" +HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Favorites",0x00020000,"%USERPROFILE%\Favorites" +HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Startup",0x00020000,"%USERPROFILE%\Programs\Startup" +HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Templates",0x00020000,"%USERPROFILE%\Templates" +HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Personal",0x00020000,"%USERPROFILE%\My Documents" +HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","SendTo",0x00020000,"%USERPROFILE%\SendTo" +HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Recent",0x00020000,"%USERPROFILE%\Recent" +HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","NetHood",0x00020000,"%USERPROFILE%\NetHood" HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders",,0x00000012 HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders","Common Desktop",0x00020000,"%ALLUSERSPROFILE%\Desktop" HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders","Common Programs",0x00020000,"%ALLUSERSPROFILE%\Start Menu\Programs" diff --git a/reactos/bootdata/hivesft.inf b/reactos/bootdata/hivesft.inf index 608bf2d4780..d186b82b6cc 100644 --- a/reactos/bootdata/hivesft.inf +++ b/reactos/bootdata/hivesft.inf @@ -9,20 +9,20 @@ HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion","CSDVersion",0x00020000,"Ser HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion","CurrentBuildNumber",0x00020000,"1381" ; Common shell folder settings -HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Desktop",0x00020000,"%SystemDrive%\Documents and Settings\All Users\Desktop" -HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common AppData",0x00020000,"%SystemDrive%\Documents and Settings\All Users\Application Data" -HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common Programs",0x00020000,"%SystemDrive%\Documents and Settings\All Users\Start Menu\Programs" -HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common Documents",0x00020000,"%SystemDrive%\Documents and Settings\All Users\Documents" -HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common Desktop",0x00020000,"%SystemDrive%\Documents and Settings\All Users\Desktop" -HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common Start Menu",0x00020000,"%SystemDrive%\Documents and Settings\All Users\Start Menu" -HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","CommonPictures",0x00020000,"%SystemDrive%\Documents and Settings\All Users\Documents\My Pictures" -HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","CommonMusic",0x00020000,"%SystemDrive%\Documents and Settings\All Users\Documents\My Music" -HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","CommonVideo",0x00020000,"%SystemDrive%\Documents and Settings\All Users\Documents\My Videos" -HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common Favorites",0x00020000,"%SystemDrive%\Documents and Settings\All Users\Favorites" -HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common Startup",0x00020000,"%SystemDrive%\Documents and Settings\All Users\Start Menu\Programs\Startup" -HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common Administrative Tools",0x00020000,"%SystemDrive%\Documents and Settings\All Users\Start Menu\Programs\Administrative Tools" -HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common Templates",0x00020000,"%SystemDrive%\Documents and Settings\All Users\Templates" -HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Personal",0x00020000,"%SystemDrive%\Documents and Settings\All Users\My Documents" +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 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" +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" ; 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" From bb2c3e3a721f51b246850918b0e4f56aeb8acdea Mon Sep 17 00:00:00 2001 From: Vizzini <vizzini@plasmic.com> Date: Sat, 19 Jun 2004 08:47:59 +0000 Subject: [PATCH 1425/1463] fixed an extremely irritating bug in an enum svn path=/trunk/; revision=9722 --- reactos/include/ddk/iodef.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/include/ddk/iodef.h b/reactos/include/ddk/iodef.h index 608005a0c8d..263841df188 100644 --- a/reactos/include/ddk/iodef.h +++ b/reactos/include/ddk/iodef.h @@ -30,12 +30,13 @@ typedef enum _CONFIGURATION_TYPE WorkController, SerialController, NetworkController, - DsplayController, + DisplayController, ParallelController, PointerController, KeyboardController, AudioController, OtherController, + DiskPeripheral, FloppyDiskPeripheral, TapePeripheral, ModemPeripheral, From e19a20e71e2932f401e6c42502efccec88e745e3 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 19 Jun 2004 08:48:01 +0000 Subject: [PATCH 1426/1463] - Callbacks implementation. A little modified patch by Alex Ionescu (alex@relsoft.net). svn path=/trunk/; revision=9723 --- reactos/ntoskrnl/ex/callback.c | 456 ++++++++++++++++-- reactos/ntoskrnl/include/internal/callbacks.h | 91 ++++ reactos/ntoskrnl/include/internal/ex.h | 2 + reactos/ntoskrnl/ke/main.c | 5 +- 4 files changed, 517 insertions(+), 37 deletions(-) create mode 100644 reactos/ntoskrnl/include/internal/callbacks.h diff --git a/reactos/ntoskrnl/ex/callback.c b/reactos/ntoskrnl/ex/callback.c index a822ed832b3..e4ec4bfa918 100644 --- a/reactos/ntoskrnl/ex/callback.c +++ b/reactos/ntoskrnl/ex/callback.c @@ -16,84 +16,468 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: callback.c,v 1.10 2003/07/10 06:27:13 royce Exp $ +/* $Id: callback.c,v 1.11 2004/06/19 08:48:00 navaraf Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ex/callback.c * PURPOSE: Executive callbacks * PROGRAMMER: David Welch (welch@mcmail.com) + * Alex Ionescu (alex@relsoft.net) * PORTABILITY: Checked. * UPDATE HISTORY: + * Added all functions 30/05/04 * Created 22/05/98 - */ - -/* * NOTE: - * These funtions are not implemented in NT4. - * They are implemented in Win2k. + * These funtions are not implemented in NT4, but + * they are implemented in Win2k. */ /* INCLUDES *****************************************************************/ #include <ddk/ntddk.h> - +#include <rosrtl/string.h> #include <internal/debug.h> +#include <internal/ob.h> +#include <internal/callbacks.h> /* FUNCTIONS *****************************************************************/ /* - * @unimplemented + * ExpInitializeCallbacks + * + * FUNCTION: + * Creates the Callback Object as a valid Object Type in the Kernel. + * + * ARGUMENTS: + * None + * + * RETURNS: + * TRUE if the Callback Object Type was successfully created. + */ +BOOLEAN +ExpInitializeCallbacks(VOID) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + NTSTATUS Status; + UNICODE_STRING DirName; + UNICODE_STRING CallbackName; + HANDLE DirectoryHandle; + ULONG i; + + /* Allocate memory for Object */ + ExCallbackObjectType = ExAllocatePoolWithTag(NonPagedPool, sizeof(OBJECT_TYPE), CALLBACK_TAG); + + /* Initialize name */ + RtlRosInitUnicodeStringFromLiteral(&ExCallbackObjectType->TypeName,L"Callback"); + + /* Create the Object Type */ + ExCallbackObjectType->Tag = CALLBACK_TAG; + ExCallbackObjectType->TotalObjects = 0; + ExCallbackObjectType->TotalHandles = 0; + ExCallbackObjectType->MaxObjects = 0xFFFFFFFF; + ExCallbackObjectType->MaxHandles = 0xFFFFFFFF; + ExCallbackObjectType->PagedPoolCharge = 0; + ExCallbackObjectType->Dump = NULL; + ExCallbackObjectType->Open = NULL; + ExCallbackObjectType->Close = NULL; + ExCallbackObjectType->Delete = NULL; + ExCallbackObjectType->Parse = NULL; + ExCallbackObjectType->Security = NULL; + ExCallbackObjectType->QueryName = NULL; + ExCallbackObjectType->DuplicationNotify = NULL; + ExCallbackObjectType->OkayToClose = NULL; + ExCallbackObjectType->Create = NULL; + ExCallbackObjectType->Mapping = &ExpCallbackMapping; + ExCallbackObjectType->NonpagedPoolCharge = sizeof(_INT_CALLBACK_OBJECT); + Status = ObpCreateTypeObject(ExCallbackObjectType); + + /* Fail if it wasn't created successfully */ + if (!NT_SUCCESS(Status)) + { + return FALSE; + } + + /* Initialize the Object */ + RtlRosInitUnicodeStringFromLiteral(&DirName, L"\\Callback" ); + InitializeObjectAttributes( + &ObjectAttributes, + &DirName, + OBJ_CASE_INSENSITIVE | OBJ_PERMANENT, + NULL, + NULL + ); + + /* Create the Object Directory */ + Status = NtCreateDirectoryObject( + &DirectoryHandle, + DIRECTORY_ALL_ACCESS, + &ObjectAttributes + ); + + /* Fail if couldn't create */ + if (!NT_SUCCESS(Status)) + { + return FALSE; + } + + /* Close Handle... */ + NtClose(DirectoryHandle); + + /* Initialize Event used when unregistering */ + KeInitializeEvent(&ExpCallbackEvent, NotificationEvent, 0); + + /* Default NT Kernel Callbacks. */ + for (i=0; ExpInitializeCallback[i].CallbackObject; i++) + { + /* Create the name from the structure */ + RtlInitUnicodeString(&CallbackName, ExpInitializeCallback[i].Name); + + /* Initialize the Object Attributes Structure */ + InitializeObjectAttributes( + &ObjectAttributes, + &CallbackName, + OBJ_PERMANENT | OBJ_CASE_INSENSITIVE, + NULL, + NULL + ); + + /* Create the Callback Object */ + Status = ExCreateCallback( + (PCALLBACK_OBJECT*)&(ExpInitializeCallback[i].CallbackObject), + &ObjectAttributes, + TRUE, + TRUE + ); + + /* Make sure Global Callbacks have been created */ + if (!NT_SUCCESS(Status)) + { + return FALSE; + } + } + /* Everything successful */ + return TRUE; +} + +/* + * ExCreateCallback + * + * FUNCTION: + * Opens or creates a Callback Object. Creates only if Create is true. + * Allows multiple Callback Functions to be registred only if AllowMultipleCallbacks + * is true. + * + * ARGUMENTS: + * CallbackObject = Pointer that will receive the Callback Object. + * CallbackName = Name of Callback + * Create = Determines if the object will be created if it doesn't exit + * AllowMultipleCallbacks = Determines if more then one registered callback function + * can be attached to this Callback Object. + * + * RETURNS: + * STATUS_SUCESS if not failed. + * + * @implemented */ NTSTATUS STDCALL -ExCreateCallback ( - OUT PCALLBACK_OBJECT * CallbackObject, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN BOOLEAN Create, - IN BOOLEAN AllowMultipleCallbacks - ) +ExCreateCallback( + OUT PCALLBACK_OBJECT *CallbackObject, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN BOOLEAN Create, + IN BOOLEAN AllowMultipleCallbacks +) { - return STATUS_NOT_IMPLEMENTED; + PINT_CALLBACK_OBJECT Callback; + NTSTATUS Status; + HANDLE Handle; + + /* Open a handle to the callback if it exists */ + if (ObjectAttributes->ObjectName) + { + Status = ObOpenObjectByName(ObjectAttributes, + ExCallbackObjectType, + NULL, + KernelMode, + 0, + NULL, + &Handle); + } + else + { + Status = STATUS_UNSUCCESSFUL; + } + + /* We weren't able to open it...should we create it? */ + if(!NT_SUCCESS(Status) && Create ) + { + Status = ObCreateObject(KernelMode, + ExCallbackObjectType, + ObjectAttributes, + KernelMode, + NULL, + sizeof(_INT_CALLBACK_OBJECT), + 0, + 0, + (PVOID *)&Callback ); + + /* We Created it...let's initialize the structure now */ + if(NT_SUCCESS(Status)) + { + KeInitializeSpinLock (&Callback->Lock); /* SpinLock */ + InitializeListHead(&Callback->RegisteredCallbacks); /* Callback Entries */ + Callback->AllowMultipleCallbacks = AllowMultipleCallbacks; /* Multiple Callbacks */ + Status = ObInsertObject ( /* Create the object */ + Callback, + NULL, + FILE_READ_DATA, + 0, + NULL, + &Handle ); + } + } + if(NT_SUCCESS(Status)) + { + + /* Get a pointer to the new object from the handle we just got */ + Status = ObReferenceObjectByHandle ( + Handle, + 0, + ExCallbackObjectType, + KernelMode, + (PVOID)&Callback, + NULL + ); + /* Close the Handle, since we now have the pointer */ + ZwClose(Handle); + } + + /* Everything went fine, so return a pointer to the Object */ + if (NT_SUCCESS(Status)) + { + *CallbackObject = (PCALLBACK_OBJECT)Callback; + } + return Status; } /* - * @unimplemented + * ExNotifyCallback + * + * FUNCTION: + * Calls a function pointer (a registered callback) + * + * ARGUMENTS: + * CallbackObject - Which callback to call + * Argument1 - Pointer/data to send to callback function + * Argument2 - Pointer/data to send to callback function + * + * RETURNS: + * Nothing + * + * @implemented */ VOID STDCALL -ExNotifyCallback ( - IN PCALLBACK_OBJECT CallbackObject, - IN PVOID Argument1, - IN PVOID Argument2 - ) +ExNotifyCallback( + IN PCALLBACK_OBJECT OpaqueCallbackObject, + IN PVOID Argument1, + IN PVOID Argument2 +) { - return; + PINT_CALLBACK_OBJECT CallbackObject = (PINT_CALLBACK_OBJECT)OpaqueCallbackObject; + PLIST_ENTRY RegisteredCallbacks; + PCALLBACK_REGISTRATION CallbackRegistration; + KIRQL OldIrql; + + /* Acquire the Lock */ + OldIrql = KfAcquireSpinLock(&CallbackObject->Lock); + + /* Enumerate through all the registered functions */ + for (RegisteredCallbacks = CallbackObject->RegisteredCallbacks.Flink; + RegisteredCallbacks != &CallbackObject->RegisteredCallbacks; + RegisteredCallbacks = RegisteredCallbacks->Flink) + { + + /* Get a pointer to a Callback Registration from the List Entries */ + CallbackRegistration = CONTAINING_RECORD ( RegisteredCallbacks, + CALLBACK_REGISTRATION, + RegisteredCallbacks); + + /* Don't bother doing Callback Notification if it's pending to be deleted */ + if (!CallbackRegistration->PendingDeletion) + { + + /* Mark the Callback in use, so it won't get deleted while we are calling it */ + CallbackRegistration->InUse += 1; + + /* Release the Spinlock before making the call */ + KfReleaseSpinLock(&CallbackObject->Lock, OldIrql); + + /* Call the Registered Function */ + CallbackRegistration->CallbackFunction ( + CallbackRegistration->CallbackContext, + Argument1, + Argument2 + ); + + /* Get SpinLock back */ + OldIrql = KfAcquireSpinLock(&CallbackObject->Lock); + + /* We are not in use anymore */ + CallbackRegistration->InUse -= 1; + + /* If another instance of this function isn't running and deletion is pending, signal the event */ + if (CallbackRegistration->PendingDeletion && CallbackRegistration->InUse == 0) + { + KeSetEvent(&ExpCallbackEvent, 0, FALSE); + } + } + } + /* Unsynchronize and release the Callback Object */ + KfReleaseSpinLock(&CallbackObject->Lock, OldIrql); } /* - * @unimplemented + * ExRegisterCallback + * + * FUNCTION: + * Allows a function to associate a callback pointer (Function) + * to a created Callback object + * + * ARGUMENTS: + * CallbackObject = The Object Created with ExCreateCallBack + * CallBackFunction = Pointer to the function to be called back + * CallBackContext = Block of memory that can contain user-data + * which will be passed on to the callback + * + * RETURNS: + * A handle to a Callback Registration Structure (MSDN Documentation) + * + * @implemented */ PVOID STDCALL -ExRegisterCallback ( - IN PCALLBACK_OBJECT CallbackObject, - IN PCALLBACK_FUNCTION CallbackFunction, - IN PVOID CallbackContext - ) +ExRegisterCallback( + IN PCALLBACK_OBJECT OpaqueCallbackObject, + IN PCALLBACK_FUNCTION CallbackFunction, + IN PVOID CallbackContext +) { - return NULL; + PINT_CALLBACK_OBJECT CallbackObject = (PINT_CALLBACK_OBJECT)OpaqueCallbackObject; + PCALLBACK_REGISTRATION CallbackRegistration = NULL; + KIRQL OldIrql; + + /* Create reference to Callback Object */ + ObReferenceObject (CallbackObject); + + /* Allocate memory for the structure */ + CallbackRegistration = ExAllocatePoolWithTag( + NonPagedPool, + sizeof(CallbackRegistration), + CALLBACK_TAG + ); + /* Fail if memory allocation failed */ + if(!CallbackRegistration) + { + ObDereferenceObject (CallbackObject); + return NULL; + } + + /* Create Callback Registration */ + CallbackRegistration->CallbackObject = CallbackObject; /* When unregistering, drivers send a handle to the Registration, not the object... */ + CallbackRegistration->CallbackFunction = CallbackFunction; /* NotifyCallback uses Objects, so this needs to be here in order to call the registered functions */ + CallbackRegistration->CallbackContext = CallbackContext; /* The documented NotifyCallback returns the Context, so we must save this somewhere */ + + /* Acquire SpinLock */ + OldIrql = KfAcquireSpinLock (&CallbackObject->Lock); + + /* Add Callback if 1) No Callbacks registered or 2) Multiple Callbacks allowed */ + if(CallbackObject->AllowMultipleCallbacks || IsListEmpty(&CallbackObject->RegisteredCallbacks)) + { + InsertTailList(&CallbackObject->RegisteredCallbacks,&CallbackRegistration->RegisteredCallbacks) + } + else + { + ExFreePool(CallbackRegistration); + CallbackRegistration = NULL; + } + + /* Release SpinLock */ + KfReleaseSpinLock(&CallbackObject->Lock, OldIrql); + + /* Return handle to Registration Object */ + return (PVOID) CallbackRegistration; } /* - * @unimplemented + * ExUnregisterCallback + * + * FUNCTION: + * Deregisters a CallBack + * + * ARGUMENTS: + * CallbackRegistration = Callback Registration Handle + * + * RETURNS: + * Nothing + * + * @implemented */ -VOID -STDCALL -ExUnregisterCallback ( - IN PVOID CallbackRegistration - ) +VOID STDCALL +ExUnregisterCallback( + IN PVOID CallbackRegistrationHandle +) { - return; + PCALLBACK_REGISTRATION CallbackRegistration; + PINT_CALLBACK_OBJECT CallbackObject; + KIRQL OldIrql; + + /* Convert Handle to valid Structure Pointer */ + CallbackRegistration = (PCALLBACK_REGISTRATION) CallbackRegistrationHandle; + + /* Get the Callback Object */ + CallbackObject = CallbackRegistration->CallbackObject; + + /* Lock the Object */ + OldIrql = KfAcquireSpinLock (&CallbackObject->Lock); + + /* We can't Delete the Callback if it's in use, because this would create a call towards a null pointer => crash */ + while (CallbackRegistration->InUse) + { + + /* Similarly, we also don't want to wait ages for all pending callbacks to be called */ + CallbackRegistration->PendingDeletion = TRUE; + + /* We are going to wait for the event, so the Lock isn't necessary */ + KfReleaseSpinLock (&CallbackObject->Lock, OldIrql); + + /* Make sure the event is cleared */ + KeClearEvent (&ExpCallbackEvent); + + /* Wait for the Event */ + KeWaitForSingleObject ( + &ExpCallbackEvent, + Executive, + KernelMode, + FALSE, + NULL + ); + + /* We need the Lock again */ + OldIrql = KfAcquireSpinLock(&CallbackObject->Lock); + } + + /* Remove the Callback */ + RemoveEntryList(&CallbackRegistration->RegisteredCallbacks); + + /* It's now safe to release the lock */ + KfReleaseSpinLock(&CallbackObject->Lock, OldIrql); + + /* Delete this registration */ + ExFreePool(CallbackRegistration); + + /* Remove the reference */ + ObDereferenceObject(CallbackObject); } /* EOF */ diff --git a/reactos/ntoskrnl/include/internal/callbacks.h b/reactos/ntoskrnl/include/internal/callbacks.h new file mode 100644 index 00000000000..151e7f85afa --- /dev/null +++ b/reactos/ntoskrnl/include/internal/callbacks.h @@ -0,0 +1,91 @@ +/* + * 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/callback.h + * PURPOSE: Executive callbacks Header + * PROGRAMMER: Alex Ionescu (alex@relsoft.net) + * PORTABILITY: Checked. + * UPDATE HISTORY: + * Created 30/05/04 + */ + +#ifndef __INCLUDE_INTERNAL_CALLBACKS_H +#define __INCLUDE_INTERNAL_CALLBACKS_H + +/* Tag */ +#define CALLBACK_TAG TAG('C','L','B','K') + +/* ROS Callback Object */ +typedef struct _INT_CALLBACK_OBJECT { + KSPIN_LOCK Lock; + LIST_ENTRY RegisteredCallbacks; + ULONG AllowMultipleCallbacks; +} _INT_CALLBACK_OBJECT , *PINT_CALLBACK_OBJECT; + +/* Structure used to hold Callbacks */ +typedef struct _CALLBACK_REGISTRATION { + LIST_ENTRY RegisteredCallbacks; + PINT_CALLBACK_OBJECT CallbackObject; + PCALLBACK_FUNCTION CallbackFunction; + PVOID CallbackContext; + ULONG InUse; + BOOLEAN PendingDeletion; +} CALLBACK_REGISTRATION, *PCALLBACK_REGISTRATION; + +/* Add 0x1 flag to differentiate */ +#define CALLBACK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x0001) +#define CALLBACK_EXECUTE (STANDARD_RIGHTS_EXECUTE|SYNCHRONIZE|0x0001) +#define CALLBACK_WRITE (STANDARD_RIGHTS_WRITE|SYNCHRONIZE|0x0001) +#define CALLBACK_READ (STANDARD_RIGHTS_READ|SYNCHRONIZE|0x0001) + +/* Mapping for Callback Object */ +GENERIC_MAPPING ExpCallbackMapping = +{ + CALLBACK_READ, + CALLBACK_WRITE, + CALLBACK_EXECUTE, + CALLBACK_ALL_ACCESS +}; + +/* Kernel Default Callbacks */ +PINT_CALLBACK_OBJECT SetSystemTimeCallback; +PINT_CALLBACK_OBJECT SetSystemStateCallback; +PINT_CALLBACK_OBJECT PowerStateCallback; + +typedef struct { + PINT_CALLBACK_OBJECT *CallbackObject; + PWSTR Name; +} SYSTEM_CALLBACKS; + +SYSTEM_CALLBACKS ExpInitializeCallback[] = { + {&SetSystemTimeCallback, L"\\Callback\\SetSystemTime"}, + {&SetSystemStateCallback, L"\\Callback\\SetSystemState"}, + {&PowerStateCallback, L"\\Callback\\PowerState"}, + {NULL, NULL} +}; + +/* Callback Event */ +KEVENT ExpCallbackEvent; + +/* Callback Object */ +POBJECT_TYPE ExCallbackObjectType; + +#endif /* __INCLUDE_INTERNAL_CALLBACKS_H */ + +/* EOF */ diff --git a/reactos/ntoskrnl/include/internal/ex.h b/reactos/ntoskrnl/include/internal/ex.h index be5d814c869..b8b65eb20c5 100644 --- a/reactos/ntoskrnl/include/internal/ex.h +++ b/reactos/ntoskrnl/include/internal/ex.h @@ -81,6 +81,8 @@ VOID ExInitializeWorkerThreads(VOID); VOID ExpInitLookasideLists(VOID); +VOID +ExpInitializeCallbacks(VOID); /* OTHER FUNCTIONS **********************************************************/ diff --git a/reactos/ntoskrnl/ke/main.c b/reactos/ntoskrnl/ke/main.c index 7e910a1ce7d..750eed49303 100644 --- a/reactos/ntoskrnl/ke/main.c +++ b/reactos/ntoskrnl/ke/main.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: main.c,v 1.187 2004/05/29 22:10:05 hbirr Exp $ +/* $Id: main.c,v 1.188 2004/06/19 08:48:01 navaraf Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/main.c @@ -664,6 +664,9 @@ ExpInitializeExecutive(VOID) IoInit2(); + /* Initialize Callbacks before drivers */ + ExpInitializeCallbacks(); + /* * Load boot start drivers */ From 5d2036782e755f17e5df4a9fa524bf009c431a5f Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 19 Jun 2004 08:52:40 +0000 Subject: [PATCH 1427/1463] - Fixed compilation problems with MinGW runtime 3.3. svn path=/trunk/; revision=9724 --- reactos/lib/crtdll/libc/.cvsignore | 3 -- reactos/lib/crtdll/libc/atexit.h | 33 --------------- reactos/lib/crtdll/libc/file.h | 64 ----------------------------- reactos/lib/crtdll/stdlib/wcstomb.c | 2 - 4 files changed, 102 deletions(-) delete mode 100644 reactos/lib/crtdll/libc/.cvsignore delete mode 100644 reactos/lib/crtdll/libc/atexit.h delete mode 100644 reactos/lib/crtdll/libc/file.h diff --git a/reactos/lib/crtdll/libc/.cvsignore b/reactos/lib/crtdll/libc/.cvsignore deleted file mode 100644 index bd0e3dfd3ef..00000000000 --- a/reactos/lib/crtdll/libc/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -*.d -*.o -*.sym diff --git a/reactos/lib/crtdll/libc/atexit.h b/reactos/lib/crtdll/libc/atexit.h deleted file mode 100644 index b3a9f0103ad..00000000000 --- a/reactos/lib/crtdll/libc/atexit.h +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ -#ifndef __dj_include_libc_atexit_h__ -#define __dj_include_libc_dosexec_h__ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef __dj_ENFORCE_ANSI_FREESTANDING - -#ifndef __STRICT_ANSI__ - -#ifndef _POSIX_SOURCE - -struct __atexit { - struct __atexit *__next; - void (*__function)(void); -}; - -extern struct __atexit *__atexit_ptr; - -#endif /* !_POSIX_SOURCE */ -#endif /* !__STRICT_ANSI__ */ -#endif /* !__dj_ENFORCE_ANSI_FREESTANDING */ - -#ifndef __dj_ENFORCE_FUNCTION_CALLS -#endif /* !__dj_ENFORCE_FUNCTION_CALLS */ - -#ifdef __cplusplus -} -#endif - -#endif /* __dj_include_libc_dosexec_h__ */ diff --git a/reactos/lib/crtdll/libc/file.h b/reactos/lib/crtdll/libc/file.h deleted file mode 100644 index c80ffb53f03..00000000000 --- a/reactos/lib/crtdll/libc/file.h +++ /dev/null @@ -1,64 +0,0 @@ -/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ -#ifndef __dj_include_libc_file_h__ -#define __dj_include_libc_file_h__ - -#include <stdio.h> -#include <fcntl.h> - - -//#include <libc/dosio.h> - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef __dj_ENFORCE_ANSI_FREESTANDING - -#ifndef __STRICT_ANSI__ - -#ifndef _POSIX_SOURCE - -#ifndef _IORMONCL -#define _IORMONCL 004000 /* remove on close, for temp files */ -#endif -/* if _flag & _IORMONCL, ._name_to_remove needs freeing */ - -#ifndef _IOUNGETC -#define _IOUNGETC 010000 /* there is an ungetc'ed character in the buffer */ -#endif - -int _flsbuf(int, FILE*); -int _filbuf(FILE *); -void _fwalk(void (*)(FILE *)); - - - -char __is_text_file(FILE *p); - -int _doprnt(const char *fmt, va_list args, FILE *f); -int _doscan(FILE *iop, const char *fmt, void **argp); - -void *filehnd(int fileno); -int __fileno_dup2( int handle1, int handle2 ); -int __fileno_setmode(int _fd, int _newmode); -int __fileno_close(int _fd); - -#undef fileno -#define fileno(f) (f->_file) -#undef feof -#define feof(f) (((f)->_flag&_IOEOF)!=0) -#undef ferror -#define ferror(f) (((f)->_flag&_IOERR)!=0) - -#endif /* !_POSIX_SOURCE */ -#endif /* !__STRICT_ANSI__ */ -#endif /* !__dj_ENFORCE_ANSI_FREESTANDING */ - -#ifndef __dj_ENFORCE_FUNCTION_CALLS -#endif /* !__dj_ENFORCE_FUNCTION_CALLS */ - -#ifdef __cplusplus -} -#endif - -#endif /* __dj_include_libc_file_h__ */ diff --git a/reactos/lib/crtdll/stdlib/wcstomb.c b/reactos/lib/crtdll/stdlib/wcstomb.c index 41eab0a08d4..f0020082ea2 100644 --- a/reactos/lib/crtdll/stdlib/wcstomb.c +++ b/reactos/lib/crtdll/stdlib/wcstomb.c @@ -22,8 +22,6 @@ #include <msvcrt/errno.h> #include <msvcrt/wchar.h> -#include "libc/file.h" - #ifndef EILSEQ #define EILSEQ EINVAL #endif From 4444a6885d1d041b384090d9e2b256e8d697c184 Mon Sep 17 00:00:00 2001 From: Vizzini <vizzini@plasmic.com> Date: Sat, 19 Jun 2004 08:53:35 +0000 Subject: [PATCH 1428/1463] patch by Tom (tmkpl@poczta.onet.pl) to clean up return val checking of some mdl calls svn path=/trunk/; revision=9725 --- reactos/ntoskrnl/cc/copy.c | 29 +++++++++--- reactos/ntoskrnl/io/buildirp.c | 10 ++++- reactos/ntoskrnl/mm/pagefile.c | 35 +++++++++------ reactos/ntoskrnl/mm/virtual.c | 82 +++++++++++++++++++++++++++++----- reactos/ntoskrnl/nt/profile.c | 4 ++ reactos/ntoskrnl/ps/idle.c | 31 ++++++++++--- 6 files changed, 155 insertions(+), 36 deletions(-) diff --git a/reactos/ntoskrnl/cc/copy.c b/reactos/ntoskrnl/cc/copy.c index 0327a617d78..e501682fd25 100644 --- a/reactos/ntoskrnl/cc/copy.c +++ b/reactos/ntoskrnl/cc/copy.c @@ -1,4 +1,4 @@ -/* $Id: copy.c,v 1.24 2004/06/19 05:04:33 sedwards Exp $ +/* $Id: copy.c,v 1.25 2004/06/19 08:53:35 vizzini Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -139,7 +139,12 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length, /* * Create an MDL which contains all their pages. */ - MmInitializeMdl(Mdl, NULL, current_size); + Mdl = MmCreateMdl(NULL, NULL, current_size); + if(Mdl == NULL) { + DPRINT("MmCreateMdl: Out of memory!"); + return(STATUS_NO_MEMORY); + } + Mdl->MdlFlags |= (MDL_PAGES_LOCKED | MDL_IO_PAGE_READ); current2 = current; offset = 0; @@ -222,8 +227,14 @@ ReadCacheSegment(PCACHE_SEGMENT CacheSeg) { Size = CacheSeg->Bcb->CacheSegmentSize; } - Mdl = alloca(MmSizeOfMdl(CacheSeg->BaseAddress, Size)); - MmInitializeMdl(Mdl, CacheSeg->BaseAddress, Size); + + Mdl = MmCreateMdl(NULL, CacheSeg->BaseAddress, Size); + if(Mdl == NULL) + { + DPRINT("MmCreateMdl: Out of memory!"); + return(STATUS_NO_MEMORY); + } + MmBuildMdlForNonPagedPool(Mdl); Mdl->MdlFlags |= MDL_IO_PAGE_READ; KeInitializeEvent(&Event, NotificationEvent, FALSE); @@ -264,8 +275,14 @@ WriteCacheSegment(PCACHE_SEGMENT CacheSeg) { Size = CacheSeg->Bcb->CacheSegmentSize; } - Mdl = alloca(MmSizeOfMdl(CacheSeg->BaseAddress, Size)); - MmInitializeMdl(Mdl, CacheSeg->BaseAddress, Size); + + Mdl = MmCreateMdl(NULL, CacheSeg->BaseAddress, Size); + if(Mdl == NULL) + { + DPRINT("MmCreateMdl: Out of memory!"); + return(STATUS_NO_MEMORY); + } + MmBuildMdlForNonPagedPool(Mdl); Mdl->MdlFlags |= MDL_IO_PAGE_READ; KeInitializeEvent(&Event, NotificationEvent, FALSE); diff --git a/reactos/ntoskrnl/io/buildirp.c b/reactos/ntoskrnl/io/buildirp.c index 41abe6ab5a9..e99da3a20fa 100644 --- a/reactos/ntoskrnl/io/buildirp.c +++ b/reactos/ntoskrnl/io/buildirp.c @@ -1,4 +1,4 @@ -/* $Id: buildirp.c,v 1.39 2004/03/04 00:07:00 navaraf Exp $ +/* $Id: buildirp.c,v 1.40 2004/06/19 08:53:35 vizzini Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -56,6 +56,10 @@ NTSTATUS IoPrepareIrpBuffer(PIRP Irp, DPRINT("Doing direct i/o\n"); Irp->MdlAddress = MmCreateMdl(NULL,Buffer,Length); + if(Irp->MdlAddress == NULL) { + DPRINT("MmCreateMdl: Out of memory!"); + return(STATUS_NO_MEMORY); + } if (MajorFunction == IRP_MJ_READ) { MmProbeAndLockPages(Irp->MdlAddress,UserMode,IoWriteAccess); @@ -298,6 +302,10 @@ IoBuildDeviceIoControlRequest(ULONG IoControlCode, FALSE, FALSE, Irp); + if(Irp->MdlAddress == NULL) { + IoFreeIrp(Irp); + return(NULL); + } MmProbeAndLockPages (Irp->MdlAddress,UserMode,IoReadAccess); } break; diff --git a/reactos/ntoskrnl/mm/pagefile.c b/reactos/ntoskrnl/mm/pagefile.c index 9e58d2d453c..1b454b602ed 100644 --- a/reactos/ntoskrnl/mm/pagefile.c +++ b/reactos/ntoskrnl/mm/pagefile.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: pagefile.c,v 1.47 2004/06/06 09:13:21 hbirr Exp $ +/* $Id: pagefile.c,v 1.48 2004/06/19 08:53:35 vizzini Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/pagefile.c @@ -376,18 +376,13 @@ MiAllocPageFromPagingFile(PPAGINGFILE PagingFile) { if (!(PagingFile->AllocMap[i] & (1 << j))) { - break; + PagingFile->AllocMap[i] |= (1 << j); + PagingFile->UsedPages++; + PagingFile->FreePages--; + KeReleaseSpinLock(&PagingFile->AllocMapLock, oldIrql); + return((i * 32) + j); } } - if (j == 32) - { - continue; - } - PagingFile->AllocMap[i] |= (1 << j); - PagingFile->UsedPages++; - PagingFile->FreePages--; - KeReleaseSpinLock(&PagingFile->AllocMapLock, oldIrql); - return((i * 32) + j); } KeReleaseSpinLock(&PagingFile->AllocMapLock, oldIrql); @@ -403,6 +398,12 @@ MmFreeSwapPage(SWAPENTRY Entry) i = FILE_FROM_ENTRY(Entry); off = OFFSET_FROM_ENTRY(Entry); + + if (i >= MAX_PAGING_FILES) + { + DPRINT1("Bad swap entry 0x%.8X\n", Entry); + KEBUGCHECK(0); + } KeAcquireSpinLock(&PagingFileListLock, &oldIrql); if (PagingFileList[i] == NULL) @@ -410,9 +411,9 @@ MmFreeSwapPage(SWAPENTRY Entry) KEBUGCHECK(0); } KeAcquireSpinLockAtDpcLevel(&PagingFileList[i]->AllocMapLock); - - PagingFileList[i]->AllocMap[off / 32] &= (~(1 << (off % 32))); - + + PagingFileList[i]->AllocMap[off >> 5] &= (~(1 << (off % 32))); + PagingFileList[i]->FreePages++; PagingFileList[i]->UsedPages--; @@ -685,6 +686,12 @@ MmInitializeCrashDump(HANDLE PageFileHandle, ULONG PageFileNum) FALSE, &Event, &Iosb); + if(Irp == NULL) + { + ObDereferenceObject(PageFile); + return(STATUS_NO_MEMORY);// tMk - is this correct return code ??? + } + StackPtr = IoGetNextIrpStackLocation(Irp); StackPtr->FileObject = PageFile; StackPtr->DeviceObject = PageFileDevice; diff --git a/reactos/ntoskrnl/mm/virtual.c b/reactos/ntoskrnl/mm/virtual.c index f062fa455da..abc85fcef5a 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.75 2004/06/13 10:35:52 navaraf Exp $ +/* $Id: virtual.c,v 1.76 2004/06/19 08:53:35 vizzini Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/virtual.c @@ -59,6 +59,12 @@ NtFlushVirtualMemory(IN HANDLE ProcessHandle, return(STATUS_NOT_IMPLEMENTED); } +/* (tMk 2004.II.4) + * FUNCTION: Locks range of process virtual memory. + * Called from VirtualLock (lib\kernel32\mem\virtual.c) + * + * NOTE: This function will be correct if MmProbeAndLockPages() would be fully IMPLEMENTED. + */ NTSTATUS STDCALL NtLockVirtualMemory(HANDLE ProcessHandle, PVOID BaseAddress, @@ -82,7 +88,7 @@ NtLockVirtualMemory(HANDLE ProcessHandle, UserMode, (PVOID*)(&Process), NULL); - if (Status != STATUS_SUCCESS) + if (!NT_SUCCESS(Status)) { return(Status); } @@ -90,6 +96,11 @@ NtLockVirtualMemory(HANDLE ProcessHandle, Mdl = MmCreateMdl(NULL, BaseAddress, NumberOfBytesToLock); + if(Mdl == NULL) + { + ObDereferenceObject(Process); + return(STATUS_NO_MEMORY); + } MmProbeAndLockPages(Mdl, UserMode, IoWriteAccess); @@ -102,7 +113,13 @@ NtLockVirtualMemory(HANDLE ProcessHandle, return(STATUS_SUCCESS); } -NTSTATUS STDCALL + +/* (tMk 2004.II.4) + * FUNCTION: + * Called from VirtualQueryEx (lib\kernel32\mem\virtual.c) + * + */ +NTSTATUS STDCALL NtQueryVirtualMemory (IN HANDLE ProcessHandle, IN PVOID Address, IN CINT VirtualMemoryInformationClass, @@ -204,6 +221,12 @@ NtQueryVirtualMemory (IN HANDLE ProcessHandle, return(Status); } + +/* (tMk 2004.II.5) + * FUNCTION: + * Called from VirtualProtectEx (lib\kernel32\mem\virtual.c) + * + */ NTSTATUS STDCALL NtProtectVirtualMemory(IN HANDLE ProcessHandle, IN PVOID *UnsafeBaseAddress, @@ -226,6 +249,13 @@ NtProtectVirtualMemory(IN HANDLE ProcessHandle, if (!NT_SUCCESS(Status)) return Status; + // (tMk 2004.II.5) in Microsoft SDK I read: + // 'if this parameter is NULL or does not point to a valid variable, the function fails' + if(UnsafeOldAccessProtection == NULL) + { + return(STATUS_INVALID_PARAMETER); + } + NumberOfBytesToProtect = PAGE_ROUND_UP(BaseAddress + NumberOfBytesToProtect) - PAGE_ROUND_DOWN(BaseAddress); @@ -279,6 +309,13 @@ NtProtectVirtualMemory(IN HANDLE ProcessHandle, return(Status); } + +/* (tMk 2004.II.05) + * FUNCTION: + * Called from ReadProcessMemory (lib\kernel32\mem\procmem.c) and KlInitPeb(lib\kernel32\process\create.c) + * + * NOTE: This function will be correct if MmProbeAndLockPages() would be fully IMPLEMENTED. + */ NTSTATUS STDCALL NtReadVirtualMemory(IN HANDLE ProcessHandle, IN PVOID BaseAddress, @@ -301,7 +338,7 @@ NtReadVirtualMemory(IN HANDLE ProcessHandle, UserMode, (PVOID*)(&Process), NULL); - if (Status != STATUS_SUCCESS) + if (!NT_SUCCESS(Status)) { return(Status); } @@ -309,6 +346,11 @@ NtReadVirtualMemory(IN HANDLE ProcessHandle, Mdl = MmCreateMdl(NULL, Buffer, NumberOfBytesToRead); + if(Mdl == NULL) + { + ObDereferenceObject(Process); + return(STATUS_NO_MEMORY); + } MmProbeAndLockPages(Mdl, UserMode, IoWriteAccess); @@ -331,10 +373,13 @@ NtReadVirtualMemory(IN HANDLE ProcessHandle, if (NumberOfBytesRead) *NumberOfBytesRead = NumberOfBytesToRead; - return(STATUS_SUCCESS); } +/* (tMk 2004.II.05) + * FUNCTION: THIS function doesn't make a sense... + * Called from VirtualUnlock (lib\kernel32\mem\virtual.c) + */ NTSTATUS STDCALL NtUnlockVirtualMemory(HANDLE ProcessHandle, PVOID BaseAddress, @@ -358,7 +403,7 @@ NtUnlockVirtualMemory(HANDLE ProcessHandle, UserMode, (PVOID*)(&Process), NULL); - if (Status != STATUS_SUCCESS) + if (!NT_SUCCESS(Status)) { return(Status); } @@ -366,6 +411,11 @@ NtUnlockVirtualMemory(HANDLE ProcessHandle, Mdl = MmCreateMdl(NULL, BaseAddress, NumberOfBytesToUnlock); + if(Mdl == NULL) + { + ObDereferenceObject(Process); + return(STATUS_NO_MEMORY); + } ObDereferenceObject(Process); @@ -382,6 +432,12 @@ NtUnlockVirtualMemory(HANDLE ProcessHandle, } +/* (tMk 2004.II.05) + * FUNCTION: + * Called from WriteProcessMemory (lib\kernel32\mem\procmem.c) and KlInitPeb(lib\kernel32\process\create.c) + * + * NOTE: This function will be correct if MmProbeAndLockPages() would be fully IMPLEMENTED. + */ NTSTATUS STDCALL NtWriteVirtualMemory(IN HANDLE ProcessHandle, IN PVOID BaseAddress, @@ -404,7 +460,7 @@ NtWriteVirtualMemory(IN HANDLE ProcessHandle, UserMode, (PVOID*)(&Process), NULL); - if (Status != STATUS_SUCCESS) + if (!NT_SUCCESS(Status)) { return(Status); } @@ -415,7 +471,11 @@ NtWriteVirtualMemory(IN HANDLE ProcessHandle, MmProbeAndLockPages(Mdl, UserMode, IoReadAccess); - + if(Mdl == NULL) + { + ObDereferenceObject(Process); + return(STATUS_NO_MEMORY); + } KeAttachProcess(Process); SystemAddress = MmGetSystemAddressForMdl(Mdl); @@ -437,7 +497,8 @@ NtWriteVirtualMemory(IN HANDLE ProcessHandle, return(STATUS_SUCCESS); } -/* +/* FUNCTION: + * Called from EngSecureMem (subsys\win32k\eng\mem.c) * @unimplemented */ PVOID STDCALL @@ -457,7 +518,8 @@ MmSecureVirtualMemory (PVOID Address, } -/* +/* FUNCTION: + * Called from EngUnsecureMem (subsys\win32k\eng\mem.c) * @unimplemented */ VOID STDCALL diff --git a/reactos/ntoskrnl/nt/profile.c b/reactos/ntoskrnl/nt/profile.c index c1ad2a85b7e..c2add743eb9 100644 --- a/reactos/ntoskrnl/nt/profile.c +++ b/reactos/ntoskrnl/nt/profile.c @@ -482,6 +482,10 @@ NtCreateProfile(OUT PHANDLE UnsafeProfileHandle, Profile->Size = ImageSize; Profile->BucketShift = Granularity; Profile->BufferMdl = MmCreateMdl(NULL, Buffer, BufferSize); + if(Profile->BufferMdl == NULL) { + DPRINT("MmCreateMdl: Out of memory!"); + return(STATUS_NO_MEMORY); + } MmProbeAndLockPages(Profile->BufferMdl, UserMode, IoWriteAccess); Profile->Buffer = MmGetSystemAddressForMdl(Profile->BufferMdl); Profile->BufferSize = BufferSize; diff --git a/reactos/ntoskrnl/ps/idle.c b/reactos/ntoskrnl/ps/idle.c index 32daaa5aa1f..51c29fa660c 100644 --- a/reactos/ntoskrnl/ps/idle.c +++ b/reactos/ntoskrnl/ps/idle.c @@ -26,6 +26,9 @@ extern CHAR KiTimerSystemAuditing; /* FUNCTIONS *****************************************************************/ +/** System idle thread procedure + * + */ VOID STDCALL PsIdleThreadMain(PVOID Context) { @@ -50,28 +53,46 @@ PsIdleThreadMain(PVOID Context) } } + +/** Initialization of system idle thread + * + */ VOID INIT_FUNCTION PsInitIdleThread(VOID) { KPRIORITY Priority; ULONG Affinity; - - PsCreateSystemThread(&PsIdleThreadHandle, + NTSTATUS Status; + + Status = PsCreateSystemThread(&PsIdleThreadHandle, THREAD_ALL_ACCESS, NULL, NULL, NULL, PsIdleThreadMain, NULL); - + if(!NT_SUCCESS(Status)) { + DPRINT("Couldn't create Idle System Thread!"); + KEBUGCHECK(0); + return; + } + Priority = LOW_PRIORITY; - NtSetInformationThread(PsIdleThreadHandle, + Status = NtSetInformationThread(PsIdleThreadHandle, ThreadPriority, &Priority, sizeof(Priority)); + if(!NT_SUCCESS(Status)) { + DPRINT("Couldn't set Priority to Idle System Thread!"); + return; + } + Affinity = 1 << 0; - NtSetInformationThread(PsIdleThreadHandle, + Status = NtSetInformationThread(PsIdleThreadHandle, ThreadAffinityMask, &Affinity, sizeof(Affinity)); + if(!NT_SUCCESS(Status)) { + DPRINT("Couldn't set Affinity Mask to Idle System Thread!"); + } } From b793f5ef6dc68301dbfe3bf9d4d8b55c84b7e375 Mon Sep 17 00:00:00 2001 From: Richard Campbell <betam4x@gmail.com> Date: Sat, 19 Jun 2004 12:40:41 +0000 Subject: [PATCH 1429/1463] 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=9726 --- reactos/tools/makefile.vs2003 | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 reactos/tools/makefile.vs2003 diff --git a/reactos/tools/makefile.vs2003 b/reactos/tools/makefile.vs2003 new file mode 100644 index 00000000000..def91aa5543 --- /dev/null +++ b/reactos/tools/makefile.vs2003 @@ -0,0 +1,13 @@ +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 0b27c9bbe9cccb1028c7ed5c68ee8397a3ced333 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 19 Jun 2004 17:58:37 +0000 Subject: [PATCH 1430/1463] - Force importing _vsnprintf from MSVCRT. The NTDLL version doesn't support %f specifiers. svn path=/trunk/; revision=9728 --- reactos/lib/shlwapi/Makefile.ros-template | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/shlwapi/Makefile.ros-template b/reactos/lib/shlwapi/Makefile.ros-template index b80d2f52f43..e065b762bd6 100644 --- a/reactos/lib/shlwapi/Makefile.ros-template +++ b/reactos/lib/shlwapi/Makefile.ros-template @@ -1,4 +1,4 @@ -# $Id: Makefile.ros-template,v 1.6 2004/05/29 21:24:47 hbirr Exp $ +# $Id: Makefile.ros-template,v 1.7 2004/06/19 17:58:37 navaraf Exp $ TARGET_NAME = shlwapi @@ -9,7 +9,7 @@ TARGET_CFLAGS = -D__REACTOS__ @EXTRADEFS@ # FIXME: we don't do delayed imports yet so oleaut32.a is listed explicitly # NOTE: msvcrt.a must be listed before ntdll.a, because sprintf that is # exported from ntdll doesn't support printing of float types (%f) -TARGET_SDKLIBS = @IMPORTS@ msvcrt.a oleaut32.a libwine.a wine_uuid.a libwine_unicode.a ntdll.a +TARGET_SDKLIBS = msvcrt.a @IMPORTS@ oleaut32.a libwine.a wine_uuid.a libwine_unicode.a msvcrt.a ntdll.a TARGET_NORC = yes From a3de47e17abca68988c353436cfab47dd08a2b8d Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 19 Jun 2004 20:18:09 +0000 Subject: [PATCH 1431/1463] - Fixed NtUserDestroyWindow to correctly destroy owned windows. Fixes bugs #342 and #350. [Should be ported to 0.2.3 release branch too.] svn path=/trunk/; revision=9730 --- reactos/subsys/win32k/ntuser/window.c | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index ffdd0fc880b..b2e7b085c60 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.237 2004/06/16 06:09:40 gvg Exp $ +/* $Id: window.c,v 1.238 2004/06/19 20:18:09 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -2169,11 +2169,6 @@ NtUserDestroyWindow(HWND Wnd) HOOK_CallHooks( WH_SHELL, HSHELL_WINDOWDESTROYED, (WPARAM)hwnd, 0L, TRUE ); /* FIXME: clean up palette - see "Internals" p.352 */ } - - if (! IsWindow(Wnd)) - { - return TRUE; - } #endif if (!IntIsWindow(Wnd)) @@ -2200,16 +2195,9 @@ NtUserDestroyWindow(HWND Wnd) { Child = IntGetWindowObject(*ChildHandle); if (Child == NULL) - { - continue; - } - if(Child->Self == Wnd) - { - IntReleaseWindowObject(Child); continue; - } IntLockRelatives(Child); - if (Child->Parent != Window->Self) + if (Child->Owner != Window->Self) { IntUnLockRelatives(Child); IntReleaseWindowObject(Child); From 566b3a9f387d1ed34318ae9a6847b527775efadc Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sat, 19 Jun 2004 22:42:41 +0000 Subject: [PATCH 1432/1463] - Increment the number of free pages in MmFreeMemory. svn path=/trunk/; revision=9731 --- freeldr/freeldr/mm/mm.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/freeldr/freeldr/mm/mm.c b/freeldr/freeldr/mm/mm.c index c368a7fee88..a087b6e425e 100644 --- a/freeldr/freeldr/mm/mm.c +++ b/freeldr/freeldr/mm/mm.c @@ -242,6 +242,8 @@ VOID MmFreeMemory(PVOID MemoryPointer) RealPageLookupTable[Idx].PageAllocationLength = 0; } + FreePagesInLookupTable += PageCount; + #ifdef DEBUG DecrementAllocationCount(); DbgPrint((DPRINT_MEMORY, "Freed %d pages of memory starting at page %d. AllocationCount: %d\n", PageCount, PageNumber, AllocationCount)); From 46f51fc218c5a75ff46717149041f6a7a6b3a7fc Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sat, 19 Jun 2004 23:12:58 +0000 Subject: [PATCH 1433/1463] display REG_NONE and REG_MULTI_SZ values svn path=/trunk/; revision=9732 --- reactos/subsys/system/regedit/listview.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/reactos/subsys/system/regedit/listview.c b/reactos/subsys/system/regedit/listview.c index d32d0699f73..0e6efb2becc 100644 --- a/reactos/subsys/system/regedit/listview.c +++ b/reactos/subsys/system/regedit/listview.c @@ -169,6 +169,29 @@ static void AddEntryToList(HWND hwndLV, LPTSTR Name, DWORD dwValType, void* ValB ListView_SetItemText(hwndLV, index, 2, ValBuf); } break; + case REG_MULTI_SZ: + { + LPTSTR src, str, cursrc; + if(dwCount >= 2) + { + src = (LPTSTR)ValBuf; + str = HeapAlloc(GetProcessHeap(), 0, dwCount); + if(str != NULL) + { + *str = _T('\0'); + /* concatenate all srings */ + while(*src != _T('\0')) + { + _tcscat(str, _T(" ")); + _tcscat(str, src); + src += _tcslen(src) + 1; + } + ListView_SetItemText(hwndLV, index, 2, str); + HeapFree(GetProcessHeap(), 0, str); + } + } + } + break; case REG_DWORD: { TCHAR buf[64]; wsprintf(buf, _T("0x%08X (%d)"), *(DWORD*)ValBuf, *(DWORD*)ValBuf); @@ -176,6 +199,7 @@ static void AddEntryToList(HWND hwndLV, LPTSTR Name, DWORD dwValType, void* ValB } /* lpsRes = convertHexToDWORDStr(lpbData, dwLen); */ break; + case REG_NONE: case REG_BINARY: { unsigned int i; LPBYTE pData = (LPBYTE)ValBuf; From ce56ff1648b527230624c71f74653bc7fe6aa926 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 20 Jun 2004 00:44:55 +0000 Subject: [PATCH 1434/1463] - Fixed memory corruption in IopInitializeBuiltinDriver. [Should be ported to 0.2.3 release branch too.] svn path=/trunk/; revision=9733 --- reactos/ntoskrnl/io/driver.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/reactos/ntoskrnl/io/driver.c b/reactos/ntoskrnl/io/driver.c index f6b89bc0fab..3968fea861d 100644 --- a/reactos/ntoskrnl/io/driver.c +++ b/reactos/ntoskrnl/io/driver.c @@ -1,4 +1,4 @@ -/* $Id: driver.c,v 1.46 2004/06/02 20:30:56 hbirr Exp $ +/* $Id: driver.c,v 1.47 2004/06/20 00:44:55 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -83,8 +83,6 @@ POBJECT_TYPE EXPORTED IoDriverObjectType = NULL; #define TAG_DRIVER TAG('D', 'R', 'V', 'R') #define TAG_DRIVER_EXTENSION TAG('D', 'R', 'V', 'E') -#define DRIVER_REGISTRY_KEY_BASENAME L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\" - /* DECLARATIONS ***************************************************************/ NTSTATUS STDCALL @@ -524,6 +522,7 @@ IopInitializeDriverModule( UNICODE_STRING RegistryKey; PDRIVER_INITIALIZE DriverEntry = ModuleObject->EntryPoint; NTSTATUS Status; + WCHAR ServicesKeyName[] = L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\"; Status = IopCreateDriverObject( DriverObject, @@ -541,10 +540,10 @@ IopInitializeDriverModule( if (DeviceNode->ServiceName.Buffer) { RegistryKey.Length = DeviceNode->ServiceName.Length + - sizeof(DRIVER_REGISTRY_KEY_BASENAME); + sizeof(ServicesKeyName); RegistryKey.MaximumLength = RegistryKey.Length + sizeof(UNICODE_NULL); RegistryKey.Buffer = ExAllocatePool(PagedPool, RegistryKey.MaximumLength); - wcscpy(RegistryKey.Buffer, DRIVER_REGISTRY_KEY_BASENAME); + wcscpy(RegistryKey.Buffer, ServicesKeyName); wcscat(RegistryKey.Buffer, DeviceNode->ServiceName.Buffer); } else @@ -1086,7 +1085,7 @@ IopInitializeBuiltinDriver( FileExtension = wcsrchr(DeviceNode->ServiceName.Buffer, '.'); if (FileExtension != NULL) { - DeviceNode->ServiceName.Length -= wcslen(DeviceNode->ServiceName.Buffer); + DeviceNode->ServiceName.Length -= wcslen(FileExtension) * sizeof(WCHAR); FileExtension[0] = 0; } From 963c2bcf6e7697a8b05179f1580deb16b3e407e3 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 20 Jun 2004 00:45:37 +0000 Subject: [PATCH 1435/1463] - Allocate memory from PagedPool instead of NonPagedPool where possible. - Backported font initialization code with fixed memory leaks from my unfinished font handling rewrite patch. svn path=/trunk/; revision=9734 --- reactos/subsys/win32k/misc/driver.c | 4 +- reactos/subsys/win32k/misc/object.c | 8 +- reactos/subsys/win32k/ntuser/class.c | 4 +- reactos/subsys/win32k/ntuser/clipboard.c | 2 +- reactos/subsys/win32k/ntuser/misc.c | 6 +- reactos/subsys/win32k/ntuser/window.c | 4 +- reactos/subsys/win32k/ntuser/winpos.c | 4 +- reactos/subsys/win32k/ntuser/winsta.c | 4 +- reactos/subsys/win32k/objects/bezier.c | 6 +- reactos/subsys/win32k/objects/bitmaps.c | 4 +- reactos/subsys/win32k/objects/dc.c | 4 +- reactos/subsys/win32k/objects/dib.c | 10 +- reactos/subsys/win32k/objects/fillshap.c | 6 +- reactos/subsys/win32k/objects/gdiobj.c | 4 +- reactos/subsys/win32k/objects/line.c | 18 +- reactos/subsys/win32k/objects/palette.c | 10 +- reactos/subsys/win32k/objects/path.c | 8 +- reactos/subsys/win32k/objects/print.c | 6 +- reactos/subsys/win32k/objects/text.c | 538 +++++++++++++---------- 19 files changed, 352 insertions(+), 298 deletions(-) diff --git a/reactos/subsys/win32k/misc/driver.c b/reactos/subsys/win32k/misc/driver.c index 8821d9070e7..e40d62ddb3a 100644 --- a/reactos/subsys/win32k/misc/driver.c +++ b/reactos/subsys/win32k/misc/driver.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: driver.c,v 1.39 2004/04/09 20:39:10 navaraf Exp $ +/* $Id: driver.c,v 1.40 2004/06/20 00:45:36 navaraf Exp $ * * GDI Driver support routines * (mostly swiped from Wine) @@ -52,7 +52,7 @@ static PGRAPHICS_DRIVER GenericDriver = 0; BOOL DRIVER_RegisterDriver(LPCWSTR Name, PGD_ENABLEDRIVER EnableDriver) { - PGRAPHICS_DRIVER Driver = ExAllocatePoolWithTag(NonPagedPool, sizeof(*Driver), TAG_DRIVER); + PGRAPHICS_DRIVER Driver = ExAllocatePoolWithTag(PagedPool, sizeof(*Driver), TAG_DRIVER); DPRINT( "DRIVER_RegisterDriver( Name: %S )\n", Name ); if (!Driver) return FALSE; Driver->ReferenceCount = 0; diff --git a/reactos/subsys/win32k/misc/object.c b/reactos/subsys/win32k/misc/object.c index 7e5211670e6..9105fb1353d 100644 --- a/reactos/subsys/win32k/misc/object.c +++ b/reactos/subsys/win32k/misc/object.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: object.c,v 1.11 2004/02/26 22:23:54 weiden Exp $ +/* $Id: object.c,v 1.12 2004/06/20 00:45:36 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -325,7 +325,7 @@ ObmCreateObject(PUSER_HANDLE_TABLE HandleTable, PVOID ObjectBody; DWORD Status; - ObjectHeader = (PUSER_OBJECT_HEADER)ExAllocatePool(NonPagedPool, + ObjectHeader = (PUSER_OBJECT_HEADER)ExAllocatePool(PagedPool, ObjectSize + sizeof(USER_OBJECT_HEADER)); if (!ObjectHeader) { @@ -404,7 +404,7 @@ ObmCreateHandle(PUSER_HANDLE_TABLE HandleTable, /* * Add a new Handle block to the end of the list */ - NewBlock = (PUSER_HANDLE_BLOCK)ExAllocatePool(NonPagedPool, + NewBlock = (PUSER_HANDLE_BLOCK)ExAllocatePool(PagedPool, sizeof(USER_HANDLE_BLOCK)); if (!NewBlock) { @@ -505,7 +505,7 @@ ObmCreateHandleTable(VOID) { PUSER_HANDLE_TABLE HandleTable; - HandleTable = (PUSER_HANDLE_TABLE)ExAllocatePool(NonPagedPool, + HandleTable = (PUSER_HANDLE_TABLE)ExAllocatePool(PagedPool, sizeof(USER_HANDLE_TABLE)); if (!HandleTable) { diff --git a/reactos/subsys/win32k/ntuser/class.c b/reactos/subsys/win32k/ntuser/class.c index c38f3f6fa06..6683da65076 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.57 2004/05/27 11:47:42 weiden Exp $ +/* $Id: class.c,v 1.58 2004/06/20 00:45:36 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -216,7 +216,7 @@ IntGetClassName(struct _WINDOW_OBJECT *WindowObject, LPWSTR lpClassName, Length = 0; Status = RtlQueryAtomInAtomTable(WinStaObject->AtomTable, WindowObject->Class->Atom, NULL, NULL, NULL, &Length); - Name = ExAllocatePoolWithTag(NonPagedPool, Length + sizeof(UNICODE_NULL), TAG_STRING); + Name = ExAllocatePoolWithTag(PagedPool, Length + sizeof(UNICODE_NULL), TAG_STRING); Status = RtlQueryAtomInAtomTable(WinStaObject->AtomTable, WindowObject->Class->Atom, NULL, NULL, Name, &Length); if (!NT_SUCCESS(Status)) diff --git a/reactos/subsys/win32k/ntuser/clipboard.c b/reactos/subsys/win32k/ntuser/clipboard.c index 2944d955d63..04176de3a31 100644 --- a/reactos/subsys/win32k/ntuser/clipboard.c +++ b/reactos/subsys/win32k/ntuser/clipboard.c @@ -165,7 +165,7 @@ NtUserGetClipboardFormatName(UINT format, PUNICODE_STRING FormatName, } /* Allocate memory for the string */ - Buf = ExAllocatePoolWithTag(NonPagedPool, cchMaxCount * sizeof(WCHAR), TAG_STRING); + Buf = ExAllocatePoolWithTag(PagedPool, cchMaxCount * sizeof(WCHAR), TAG_STRING); if(!Buf) { SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index 0e06f30da1a..7bf91eb4b1d 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.78 2004/06/16 06:09:40 gvg Exp $ +/* $Id: misc.c,v 1.79 2004/06/20 00:45:36 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1139,7 +1139,7 @@ IntSafeCopyUnicodeString(PUNICODE_STRING Dest, if(Dest->Length > 0 && Src) { Dest->MaximumLength = Dest->Length; - Dest->Buffer = ExAllocatePoolWithTag(NonPagedPool, Dest->MaximumLength, TAG_STRING); + Dest->Buffer = ExAllocatePoolWithTag(PagedPool, Dest->MaximumLength, TAG_STRING); if(!Dest->Buffer) { return STATUS_NO_MEMORY; @@ -1185,7 +1185,7 @@ IntSafeCopyUnicodeStringTerminateNULL(PUNICODE_STRING Dest, if(Dest->Length > 0 && Src) { Dest->MaximumLength = Dest->Length + sizeof(WCHAR); - Dest->Buffer = ExAllocatePoolWithTag(NonPagedPool, Dest->MaximumLength, TAG_STRING); + Dest->Buffer = ExAllocatePoolWithTag(PagedPool, Dest->MaximumLength, TAG_STRING); if(!Dest->Buffer) { return STATUS_NO_MEMORY; diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index b2e7b085c60..9ab8fbb5b1f 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.238 2004/06/19 20:18:09 navaraf Exp $ +/* $Id: window.c,v 1.239 2004/06/20 00:45:37 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -2424,7 +2424,7 @@ NtUserFindWindowEx(HWND hwndParent, WCHAR *buf; /* safely copy the class name string (NULL terminated because class-lookup depends on it... */ - buf = ExAllocatePoolWithTag(NonPagedPool, ClassName.Length + sizeof(WCHAR), TAG_STRING); + buf = ExAllocatePoolWithTag(PagedPool, ClassName.Length + sizeof(WCHAR), TAG_STRING); if(!buf) { SetLastWin32Error(STATUS_INSUFFICIENT_RESOURCES); diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index b17a1937626..b43e935c680 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.116 2004/05/16 13:57:49 weiden Exp $ +/* $Id: winpos.c,v 1.117 2004/06/20 00:45:37 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -188,7 +188,7 @@ WinPosInitInternalPos(PWINDOW_OBJECT WindowObject, POINT *pt, PRECT RestoreRect) else IntGetDesktopWorkArea(Desktop, &WorkArea); - WindowObject->InternalPos = ExAllocatePoolWithTag(NonPagedPool, sizeof(INTERNALPOS), TAG_WININTLIST); + WindowObject->InternalPos = ExAllocatePoolWithTag(PagedPool, sizeof(INTERNALPOS), TAG_WININTLIST); if(!WindowObject->InternalPos) { DPRINT1("Failed to allocate INTERNALPOS structure for window 0x%x\n", WindowObject->Self); diff --git a/reactos/subsys/win32k/ntuser/winsta.c b/reactos/subsys/win32k/ntuser/winsta.c index ed330d0af00..0995a7cf0e4 100644 --- a/reactos/subsys/win32k/ntuser/winsta.c +++ b/reactos/subsys/win32k/ntuser/winsta.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: winsta.c,v 1.63 2004/05/22 21:12:15 weiden Exp $ + * $Id: winsta.c,v 1.64 2004/06/20 00:45:37 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -106,7 +106,7 @@ IntGetFullWindowStationName( FullName->Length += WinStaName->Length + sizeof(WCHAR); if (DesktopName != NULL) FullName->Length += DesktopName->Length + sizeof(WCHAR); - FullName->Buffer = ExAllocatePoolWithTag(NonPagedPool, FullName->Length, TAG_STRING); + FullName->Buffer = ExAllocatePoolWithTag(PagedPool, FullName->Length, TAG_STRING); if (FullName->Buffer == NULL) { return FALSE; diff --git a/reactos/subsys/win32k/objects/bezier.c b/reactos/subsys/win32k/objects/bezier.c index 6eecf949498..c8dcfdc368c 100644 --- a/reactos/subsys/win32k/objects/bezier.c +++ b/reactos/subsys/win32k/objects/bezier.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: bezier.c,v 1.8 2004/05/10 17:07:20 weiden Exp $ */ +/* $Id: bezier.c,v 1.9 2004/06/20 00:45:37 navaraf Exp $ */ #include <w32k.h> @@ -145,7 +145,7 @@ static void STDCALL GDI_InternalBezier( POINT *Points, POINT **PtsOut, INT *dwOu { if(*nPtsOut == *dwOut) { *dwOut *= 2; - *PtsOut = ExAllocatePoolWithTag(NonPagedPool, *dwOut * sizeof(POINT), TAG_BEZIER); + *PtsOut = ExAllocatePoolWithTag(PagedPool, *dwOut * sizeof(POINT), TAG_BEZIER); } if(!level || BezierCheck(level, Points)) { @@ -209,7 +209,7 @@ POINT * FASTCALL GDI_Bezier( const POINT *Points, INT count, INT *nPtsOut ) return NULL; } *nPtsOut = 0; - out = ExAllocatePoolWithTag(NonPagedPool, dwOut * sizeof(POINT), TAG_BEZIER); + out = ExAllocatePoolWithTag(PagedPool, dwOut * sizeof(POINT), TAG_BEZIER); for(Bezier = 0; Bezier < (count-1)/3; Bezier++) { POINT ptBuf[4]; memcpy(ptBuf, Points + Bezier * 3, sizeof(POINT) * 4); diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index 0afe6efd6af..b897f7dfd25 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.73 2004/05/14 16:50:44 navaraf Exp $ */ +/* $Id: bitmaps.c,v 1.74 2004/06/20 00:45:37 navaraf Exp $ */ #include <w32k.h> #define IN_RECT(r,x,y) \ @@ -1301,7 +1301,7 @@ BITMAPOBJ_CopyBitmap(HBITMAP hBitmap) { char *buf; - buf = ExAllocatePoolWithTag (NonPagedPool, bm.bmWidthBytes * bm.bmHeight, TAG_BITMAP); + buf = ExAllocatePoolWithTag (PagedPool, bm.bmWidthBytes * bm.bmHeight, TAG_BITMAP); NtGdiGetBitmapBits (hBitmap, bm.bmWidthBytes * bm.bmHeight, buf); NtGdiSetBitmapBits (res, bm.bmWidthBytes * bm.bmHeight, buf); ExFreePool (buf); diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index 9884f3039ac..74dfc9ca076 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.138 2004/06/18 15:18:56 navaraf Exp $ +/* $Id: dc.c,v 1.139 2004/06/20 00:45:37 navaraf Exp $ * * DC.C - Device context functions * @@ -1525,7 +1525,7 @@ NtGdiGetObject(HANDLE handle, INT count, LPVOID buffer) return 0; } - SafeBuf = ExAllocatePoolWithTag(NonPagedPool, count, TAG_GDIOBJ); + SafeBuf = ExAllocatePoolWithTag(PagedPool, count, TAG_GDIOBJ); if(!SafeBuf) { SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); diff --git a/reactos/subsys/win32k/objects/dib.c b/reactos/subsys/win32k/objects/dib.c index 3a0dbb911ca..b535517406f 100644 --- a/reactos/subsys/win32k/objects/dib.c +++ b/reactos/subsys/win32k/objects/dib.c @@ -1,5 +1,5 @@ /* - * $Id: dib.c,v 1.50 2004/05/30 14:01:13 weiden Exp $ + * $Id: dib.c,v 1.51 2004/06/20 00:45:37 navaraf Exp $ * * ReactOS W32 Subsystem * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team @@ -1093,7 +1093,7 @@ DIB_CreateDIBSection( bm.bmBits = EngAllocUserMem(totalSize, 0); } -/* bm.bmBits = ExAllocatePool(NonPagedPool, totalSize); */ +/* bm.bmBits = ExAllocatePool(PagedPool, totalSize); */ if(usage == DIB_PAL_COLORS) memcpy(bmi->bmiColors, (UINT *)DIB_MapPaletteColors(dc, bmi), sizeof(UINT *)); @@ -1165,7 +1165,7 @@ DIB_CreateDIBSection( if(bi->biBitCount == 4) { Entries = 16; } else if(bi->biBitCount == 8) { Entries = 256; } - bmp->ColorMap = ExAllocatePoolWithTag(NonPagedPool, sizeof(RGBQUAD)*Entries, TAG_COLORMAP); + bmp->ColorMap = ExAllocatePoolWithTag(PagedPool, sizeof(RGBQUAD)*Entries, TAG_COLORMAP); RtlCopyMemory(bmp->ColorMap, bmi->bmiColors, sizeof(RGBQUAD)*Entries); } @@ -1343,7 +1343,7 @@ DIB_MapPaletteColors(PDC dc, CONST BITMAPINFO* lpbmi) nNumColors = min(nNumColors, lpbmi->bmiHeader.biClrUsed); } - lpRGB = (RGBQUAD *)ExAllocatePoolWithTag(NonPagedPool, sizeof(RGBQUAD) * nNumColors, TAG_COLORMAP); + lpRGB = (RGBQUAD *)ExAllocatePoolWithTag(PagedPool, sizeof(RGBQUAD) * nNumColors, TAG_COLORMAP); lpIndex = (USHORT *)&lpbmi->bmiColors[0]; for (i = 0; i < nNumColors; i++) @@ -1416,7 +1416,7 @@ BuildDIBPalette (PBITMAPINFO bmi, PINT paletteType) if (PAL_INDEXED == *paletteType) { - palEntries = ExAllocatePoolWithTag(NonPagedPool, sizeof(PALETTEENTRY)*ColorCount, TAG_COLORMAP); + palEntries = ExAllocatePoolWithTag(PagedPool, sizeof(PALETTEENTRY)*ColorCount, TAG_COLORMAP); DIBColorTableToPaletteEntries(palEntries, bmi->bmiColors, ColorCount); } hPal = PALETTE_AllocPalette( *paletteType, ColorCount, (ULONG*)palEntries, 0, 0, 0 ); diff --git a/reactos/subsys/win32k/objects/fillshap.c b/reactos/subsys/win32k/objects/fillshap.c index 9185a3e479d..fc64b19f183 100644 --- a/reactos/subsys/win32k/objects/fillshap.c +++ b/reactos/subsys/win32k/objects/fillshap.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: fillshap.c,v 1.49 2004/05/14 16:55:18 navaraf Exp $ */ +/* $Id: fillshap.c,v 1.50 2004/06/20 00:45:37 navaraf Exp $ */ #include <w32k.h> /* @@ -835,7 +835,7 @@ NtGdiPolygon(HDC hDC, SetLastWin32Error(ERROR_INVALID_HANDLE); else { - Safept = ExAllocatePoolWithTag(NonPagedPool, sizeof(POINT) * Count, TAG_SHAPE); + Safept = ExAllocatePoolWithTag(PagedPool, sizeof(POINT) * Count, TAG_SHAPE); if(!Safept) SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); else @@ -877,7 +877,7 @@ NtGdiPolyPolygon(HDC hDC, if(Count > 0) { - Safept = ExAllocatePoolWithTag(NonPagedPool, (sizeof(POINT) + sizeof(INT)) * Count, TAG_SHAPE); + Safept = ExAllocatePoolWithTag(PagedPool, (sizeof(POINT) + sizeof(INT)) * Count, TAG_SHAPE); if(!Safept) { DC_UnlockDc(hDC); diff --git a/reactos/subsys/win32k/objects/gdiobj.c b/reactos/subsys/win32k/objects/gdiobj.c index 71e08095b86..3d1c2fcf06f 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.67 2004/05/10 17:07:20 weiden Exp $ + * $Id: gdiobj.c,v 1.68 2004/06/20 00:45:37 navaraf Exp $ * */ #include <w32k.h> @@ -204,7 +204,7 @@ GDIOBJ_iAllocHandleTable (WORD Size) #endif handleTable->wTableSize = Size; handleTable->AllocationHint = 1; - handleTable->LookasideLists = ExAllocatePoolWithTag(NonPagedPool, + handleTable->LookasideLists = ExAllocatePoolWithTag(PagedPool, OBJTYPE_COUNT * sizeof(PAGED_LOOKASIDE_LIST), TAG_GDIHNDTBLE); if (NULL == handleTable->LookasideLists) diff --git a/reactos/subsys/win32k/objects/line.c b/reactos/subsys/win32k/objects/line.c index f686413ea9d..4f2f5bb9dcf 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.32 2004/06/18 15:18:57 navaraf Exp $ */ +/* $Id: line.c,v 1.33 2004/06/20 00:45:37 navaraf Exp $ */ #include <w32k.h> // Some code from the WINE project source (www.winehq.com) @@ -163,7 +163,7 @@ IntGdiPolyBezierTo(DC *dc, else /* We'll do it using PolyBezier */ { POINT *npt; - npt = ExAllocatePoolWithTag(NonPagedPool, sizeof(POINT) * (Count + 1), TAG_BEZIER); + npt = ExAllocatePoolWithTag(PagedPool, sizeof(POINT) * (Count + 1), TAG_BEZIER); if ( npt ) { npt[0].x = dc->w.CursPosX; @@ -200,7 +200,7 @@ IntGdiPolyline(DC *dc, return PATH_Polyline ( dc, pt, Count ); //Allocate "Count" bytes of memory to hold a safe copy of pt - pts = (POINT*)ExAllocatePoolWithTag ( NonPagedPool, sizeof(POINT)*Count, TAG_SHAPE ); + pts = (POINT*)ExAllocatePoolWithTag ( PagedPool, sizeof(POINT)*Count, TAG_SHAPE ); if ( pts ) { // safely copy pt to local version @@ -250,7 +250,7 @@ IntGdiPolylineTo(DC *dc, } else /* do it using Polyline */ { - POINT *pts = ExAllocatePoolWithTag(NonPagedPool, sizeof(POINT) * (Count + 1), TAG_SHAPE); + POINT *pts = ExAllocatePoolWithTag(PagedPool, sizeof(POINT) * (Count + 1), TAG_SHAPE); if ( pts ) { pts[0].x = dc->w.CursPosX; @@ -521,7 +521,7 @@ NtGdiPolyBezier(HDC hDC, if(Count > 0) { - Safept = ExAllocatePoolWithTag(NonPagedPool, sizeof(POINT) * Count, TAG_BEZIER); + Safept = ExAllocatePoolWithTag(PagedPool, sizeof(POINT) * Count, TAG_BEZIER); if(!Safept) { DC_UnlockDc(hDC); @@ -572,7 +572,7 @@ NtGdiPolyBezierTo(HDC hDC, if(Count > 0) { - Safept = ExAllocatePoolWithTag(NonPagedPool, sizeof(POINT) * Count, TAG_BEZIER); + Safept = ExAllocatePoolWithTag(PagedPool, sizeof(POINT) * Count, TAG_BEZIER); if(!Safept) { DC_UnlockDc(hDC); @@ -633,7 +633,7 @@ NtGdiPolyline(HDC hDC, if(Count >= 2) { - Safept = ExAllocatePoolWithTag(NonPagedPool, sizeof(POINT) * Count, TAG_SHAPE); + Safept = ExAllocatePoolWithTag(PagedPool, sizeof(POINT) * Count, TAG_SHAPE); if(!Safept) { DC_UnlockDc(hDC); @@ -684,7 +684,7 @@ NtGdiPolylineTo(HDC hDC, if(Count > 0) { - Safept = ExAllocatePoolWithTag(NonPagedPool, sizeof(POINT) * Count, TAG_SHAPE); + Safept = ExAllocatePoolWithTag(PagedPool, sizeof(POINT) * Count, TAG_SHAPE); if(!Safept) { DC_UnlockDc(hDC); @@ -737,7 +737,7 @@ NtGdiPolyPolyline(HDC hDC, if(Count > 0) { - Safept = ExAllocatePoolWithTag(NonPagedPool, (sizeof(POINT) + sizeof(DWORD)) * Count, TAG_SHAPE); + Safept = ExAllocatePoolWithTag(PagedPool, (sizeof(POINT) + sizeof(DWORD)) * Count, TAG_SHAPE); if(!Safept) { DC_UnlockDc(hDC); diff --git a/reactos/subsys/win32k/objects/palette.c b/reactos/subsys/win32k/objects/palette.c index adb5410c284..c03b66a4a3f 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.18 2004/05/10 17:07:20 weiden Exp $ */ +/* $Id: palette.c,v 1.19 2004/06/20 00:45:37 navaraf Exp $ */ #include <w32k.h> #ifndef NO_MAPPING @@ -72,7 +72,7 @@ PALETTE_AllocPalette(ULONG Mode, if (NULL != Colors) { - PalGDI->IndexedColors = ExAllocatePoolWithTag(NonPagedPool, sizeof(PALETTEENTRY) * NumColors, TAG_PALETTE); + PalGDI->IndexedColors = ExAllocatePoolWithTag(PagedPool, sizeof(PALETTEENTRY) * NumColors, TAG_PALETTE); if (NULL == PalGDI->IndexedColors) { PALETTE_UnlockPalette(NewPalette); @@ -110,7 +110,7 @@ HPALETTE FASTCALL PALETTE_Init(VOID) const PALETTEENTRY* __sysPalTemplate = (const PALETTEENTRY*)COLOR_GetSystemPaletteTemplate(); // create default palette (20 system colors) - palPtr = ExAllocatePoolWithTag(NonPagedPool, sizeof(LOGPALETTE) + (NB_RESERVED_COLORS * sizeof(PALETTEENTRY)), TAG_PALETTE); + palPtr = ExAllocatePoolWithTag(PagedPool, sizeof(LOGPALETTE) + (NB_RESERVED_COLORS * sizeof(PALETTEENTRY)), TAG_PALETTE); if (!palPtr) return FALSE; palPtr->palVersion = 0x300; @@ -130,7 +130,7 @@ HPALETTE FASTCALL PALETTE_Init(VOID) palObj = (PALOBJ*)PALETTE_LockPalette(hpalette); if (palObj) { - if (!(palObj->mapping = ExAllocatePool(NonPagedPool, sizeof(int) * 20))) + if (!(palObj->mapping = ExAllocatePool(PagedPool, sizeof(int) * 20))) { DbgPrint("Win32k: Can not create palette mapping -- out of memory!"); return FALSE; @@ -199,7 +199,7 @@ INT STDCALL PALETTE_SetMapping(PALOBJ *palPtr, UINT uStart, UINT uNum, BOOL mapO //mapping = HeapReAlloc( GetProcessHeap(), 0, palPtr->mapping, // sizeof(int)*palPtr->logpalette->palNumEntries); ExFreePool(palPtr->mapping); - mapping = ExAllocatePoolWithTag(NonPagedPool, sizeof(int)*palGDI->NumColors, TAG_PALETTEMAP); + mapping = ExAllocatePoolWithTag(PagedPool, sizeof(int)*palGDI->NumColors, TAG_PALETTEMAP); palPtr->mapping = mapping; diff --git a/reactos/subsys/win32k/objects/path.c b/reactos/subsys/win32k/objects/path.c index b9a261ccb1a..08390bf1041 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.21 2004/05/10 17:07:20 weiden Exp $ */ +/* $Id: path.c,v 1.22 2004/06/20 00:45:37 navaraf Exp $ */ #include <w32k.h> #include <win32k/float.h> @@ -852,7 +852,7 @@ PATH_PathToRegion ( const GdiPath *pPath, INT nPolyFillMode, HRGN *pHrgn ) numStrokes++; /* Allocate memory for number-of-points-in-stroke array */ - pNumPointsInStroke=(int *)ExAllocatePoolWithTag(NonPagedPool, sizeof(int) * numStrokes, TAG_PATH); + pNumPointsInStroke=(int *)ExAllocatePoolWithTag(PagedPool, sizeof(int) * numStrokes, TAG_PATH); if(!pNumPointsInStroke) { // SetLastError(ERROR_NOT_ENOUGH_MEMORY); @@ -975,10 +975,10 @@ PATH_ReserveEntries ( GdiPath *pPath, INT numEntries ) numEntriesToAllocate=numEntries; /* Allocate new arrays */ - pPointsNew=(POINT *)ExAllocatePoolWithTag(NonPagedPool, numEntriesToAllocate * sizeof(POINT), TAG_PATH); + pPointsNew=(POINT *)ExAllocatePoolWithTag(PagedPool, numEntriesToAllocate * sizeof(POINT), TAG_PATH); if(!pPointsNew) return FALSE; - pFlagsNew=(BYTE *)ExAllocatePoolWithTag(NonPagedPool, numEntriesToAllocate * sizeof(BYTE), TAG_PATH); + pFlagsNew=(BYTE *)ExAllocatePoolWithTag(PagedPool, numEntriesToAllocate * sizeof(BYTE), TAG_PATH); if(!pFlagsNew) { ExFreePool(pPointsNew); diff --git a/reactos/subsys/win32k/objects/print.c b/reactos/subsys/win32k/objects/print.c index 65b565a4fff..f5f9521360b 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.17 2004/05/10 17:07:20 weiden Exp $ */ +/* $Id: print.c,v 1.18 2004/06/20 00:45:37 navaraf Exp $ */ #include <w32k.h> INT @@ -123,7 +123,7 @@ NtGdiExtEscape( if ( InSize && UnsafeInData ) { - SafeInData = ExAllocatePoolWithTag ( NonPagedPool, InSize, TAG_PRINT ); + SafeInData = ExAllocatePoolWithTag ( PagedPool, InSize, TAG_PRINT ); if ( !SafeInData ) { DC_UnlockDc(hDC); @@ -142,7 +142,7 @@ NtGdiExtEscape( if ( OutSize && UnsafeOutData ) { - SafeOutData = ExAllocatePoolWithTag ( NonPagedPool, OutSize, TAG_PRINT ); + SafeOutData = ExAllocatePoolWithTag ( PagedPool, OutSize, TAG_PRINT ); if ( !SafeOutData ) { if ( SafeInData ) diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index a41b7a36cd6..bd5731dd01f 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.96 2004/06/18 15:18:58 navaraf Exp $ */ +/* $Id: text.c,v 1.97 2004/06/20 00:45:37 navaraf Exp $ */ #include <w32k.h> #include <ft2build.h> @@ -44,7 +44,6 @@ static FAST_MUTEX FreeTypeLock; static LIST_ENTRY FontListHead; static FAST_MUTEX FontListLock; -static INT FontsLoaded = 0; /* number of all fonts loaded (including private fonts */ static BOOL RenderingEnabled = TRUE; static PWCHAR ElfScripts[32] = { /* these are in the order of the fsCsb[0] bits */ @@ -114,6 +113,301 @@ static CHARSETINFO FontTci[MAXTCIINDEX] = { { SYMBOL_CHARSET, CP_SYMBOL, FS(31)}, }; +VOID FASTCALL +IntLoadSystemFonts(VOID); + +INT FASTCALL +IntGdiAddFontResource(PUNICODE_STRING FileName, DWORD Characteristics); + +BOOL FASTCALL +InitFontSupport(VOID) +{ + ULONG ulError; + + InitializeListHead(&FontListHead); + ExInitializeFastMutex(&FontListLock); + ExInitializeFastMutex(&FreeTypeLock); + + ulError = FT_Init_FreeType(&library); + if (ulError) + return FALSE; + + IntLoadSystemFonts(); + + return TRUE; +} + +/* + * IntLoadSystemFonts + * + * Search the system font directory and adds each font found. + */ + +VOID FASTCALL +IntLoadSystemFonts(VOID) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING Directory, SearchPattern, FileName, TempString; + IO_STATUS_BLOCK Iosb; + HANDLE hDirectory; + BYTE *DirInfoBuffer; + PFILE_DIRECTORY_INFORMATION DirInfo; + BOOL bRestartScan = TRUE; + NTSTATUS Status; + + RtlInitUnicodeString(&Directory, L"\\SystemRoot\\Media\\Fonts\\"); + /* FIXME: Add support for other font types */ + RtlInitUnicodeString(&SearchPattern, L"*.ttf"); + + InitializeObjectAttributes( + &ObjectAttributes, + &Directory, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + Status = ZwOpenFile( + &hDirectory, + SYNCHRONIZE | FILE_LIST_DIRECTORY, + &ObjectAttributes, + &Iosb, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + FILE_SYNCHRONOUS_IO_NONALERT | FILE_DIRECTORY_FILE); + + if (NT_SUCCESS(Status)) + { + DirInfoBuffer = ExAllocatePool(PagedPool, 0x4000); + if (DirInfoBuffer == NULL) + { + ZwClose(hDirectory); + return; + } + + FileName.Buffer = ExAllocatePool(PagedPool, MAX_PATH); + if (FileName.Buffer == NULL) + { + ExFreePool(DirInfoBuffer); + ZwClose(hDirectory); + return; + } + FileName.Length = 0; + FileName.MaximumLength = MAX_PATH; + + while (1) + { + Status = ZwQueryDirectoryFile( + hDirectory, + NULL, + NULL, + NULL, + &Iosb, + DirInfoBuffer, + 0x4000, + FileDirectoryInformation, + FALSE, + &SearchPattern, + bRestartScan); + + if (!NT_SUCCESS(Status) || Status == STATUS_NO_MORE_FILES) + { + break; + } + + for (DirInfo = (PFILE_DIRECTORY_INFORMATION)DirInfoBuffer; + DirInfo->NextEntryOffset != 0; + DirInfo = (PFILE_DIRECTORY_INFORMATION)((ULONG_PTR)DirInfo + DirInfo->NextEntryOffset)) + { + TempString.Buffer = DirInfo->FileName; + TempString.Length = + TempString.MaximumLength = DirInfo->FileNameLength; + RtlCopyUnicodeString(&FileName, &Directory); + RtlAppendUnicodeStringToString(&FileName, &TempString); + IntGdiAddFontResource(&FileName, 0); + } + + bRestartScan = FALSE; + } + + ExFreePool(FileName.Buffer); + ExFreePool(DirInfoBuffer); + ZwClose(hDirectory); + } +} + +/* + * IntGdiAddFontResource + * + * Adds the font resource from the specified file to the system. + */ + +INT FASTCALL +IntGdiAddFontResource(PUNICODE_STRING FileName, DWORD Characteristics) +{ + HFONT NewFont; + FONTOBJ *FontObj; + PFONTGDI FontGDI; + NTSTATUS Status; + HANDLE FileHandle; + OBJECT_ATTRIBUTES ObjectAttributes; + FILE_STANDARD_INFORMATION FileStdInfo; + PVOID Buffer; + IO_STATUS_BLOCK Iosb; + INT Error; + FT_Face Face; + ANSI_STRING AnsiFaceName; + PFONT_ENTRY Entry; + + /* Create handle for the font */ + + NewFont = (HFONT)CreateGDIHandle( + sizeof(FONTGDI), + sizeof(FONTOBJ), + (PVOID*)&FontGDI, + (PVOID*)&FontObj); + + if (NewFont == 0) + { + DPRINT("Could not allocate a new GDI font object\n"); + return 0; + } + + /* Open the font file */ + + InitializeObjectAttributes(&ObjectAttributes, FileName, 0, NULL, NULL); + Status = ZwOpenFile( + &FileHandle, + GENERIC_READ | SYNCHRONIZE, + &ObjectAttributes, + &Iosb, + 0, + FILE_SYNCHRONOUS_IO_NONALERT); + + if (!NT_SUCCESS(Status)) + { + DPRINT("Could not font file: %wZ\n", Filename); + NtGdiDeleteObject(NewFont); + return 0; + } + + /* Get the size of the file */ + + Status = NtQueryInformationFile( + FileHandle, + &Iosb, + &FileStdInfo, + sizeof(FileStdInfo), + FileStandardInformation); + + if (!NT_SUCCESS(Status)) + { + DPRINT("Could not get file size\n"); + NtGdiDeleteObject(NewFont); + ZwClose(FileHandle); + return 0; + } + + /* Allocate pageable memory for the font */ + + Buffer = ExAllocatePoolWithTag( + PagedPool, + FileStdInfo.EndOfFile.u.LowPart, + TAG_GDITEXT); + + if (Buffer == NULL) + { + DPRINT("Could not allocate memory for font"); + NtGdiDeleteObject(NewFont); + ZwClose(FileHandle); + return 0; + } + + /* Load the font into memory chunk */ + + Status = ZwReadFile( + FileHandle, + NULL, + NULL, + NULL, + &Iosb, + Buffer, + FileStdInfo.EndOfFile.u.LowPart, + NULL, + NULL); + + if (!NT_SUCCESS(Status)) + { + DPRINT("Could not read the font file into memory"); + ExFreePool(Buffer); + NtGdiDeleteObject(NewFont); + ZwClose(FileHandle); + return 0; + } + + ZwClose(FileHandle); + + IntLockFreeType; + Error = FT_New_Memory_Face( + library, + Buffer, + FileStdInfo.EndOfFile.u.LowPart, + 0, + &Face); + IntUnLockFreeType; + + if (Error) + { + if (Error == FT_Err_Unknown_File_Format) + DPRINT("Unknown font file format\n"); + else + DPRINT("Error reading font file (error code: %u)\n", Error); + ExFreePool(Buffer); + NtGdiDeleteObject(NewFont); + return 0; + } + + Entry = ExAllocatePoolWithTag(PagedPool, sizeof(FONT_ENTRY), TAG_FONT); + if (!Entry) + { + FT_Done_Face(Face); + ExFreePool(Buffer); + SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); + return 0; + } + + /* FontGDI->Filename = FileName; perform strcpy */ + FontGDI->face = Face; + + /* FIXME: Complete text metrics */ + FontGDI->TextMetric.tmAscent = (Face->size->metrics.ascender + 32) >> 6; /* units above baseline */ + 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); + + /* Add this font resource to the font table */ + + Entry->hFont = NewFont; + Entry->NotEnum = (Characteristics & FR_NOT_ENUM); + RtlInitAnsiString(&AnsiFaceName, (LPSTR)Face->family_name); + RtlAnsiStringToUnicodeString(&Entry->FaceName, &AnsiFaceName, TRUE); + + if (Characteristics & FR_PRIVATE) + { + PW32PROCESS Win32Process = PsGetWin32Process(); + IntLockProcessPrivateFonts(Win32Process); + InsertTailList(&Win32Process->PrivateFontListHead, &Entry->ListEntry); + IntUnLockProcessPrivateFonts(Win32Process); + } + else + { + IntLockGlobalFonts; + InsertTailList(&FontListHead, &Entry->ListEntry); + IntUnLockGlobalFonts; + } + + return 1; +} BOOL FASTCALL IntIsFontRenderingEnabled(VOID) @@ -159,246 +453,6 @@ IntGetFontRenderMode(LOGFONTW *logfont) } return FT_RENDER_MODE_MONO; } - -int FASTCALL -IntGdiAddFontResource(PUNICODE_STRING Filename, DWORD fl) -{ - HFONT NewFont; - FONTOBJ *FontObj; - PFONTGDI FontGDI; - NTSTATUS Status; - HANDLE FileHandle; - OBJECT_ATTRIBUTES ObjectAttributes; - FILE_STANDARD_INFORMATION FileStdInfo; - PVOID buffer; - ULONG size; - INT error; - FT_Face face; - ANSI_STRING StringA; - IO_STATUS_BLOCK Iosb; - PFONT_ENTRY entry; - - NewFont = (HFONT)CreateGDIHandle(sizeof( FONTGDI ), sizeof( FONTOBJ ), (PVOID*)&FontGDI, (PVOID*)&FontObj); - if(NewFont == 0) - { - DPRINT1("Could not allocate a new GDI font object\n"); - return 0; - } - - // Open the Module - InitializeObjectAttributes(&ObjectAttributes, Filename, 0, NULL, NULL); - - Status = ZwOpenFile(&FileHandle, - GENERIC_READ|SYNCHRONIZE, - &ObjectAttributes, - &Iosb, - 0, //ShareAccess - FILE_SYNCHRONOUS_IO_NONALERT); - - if (!NT_SUCCESS(Status)) - { - DPRINT1("Could not open module file: %wZ\n", Filename); - return 0; - } - - // Get the size of the file - Status = NtQueryInformationFile(FileHandle, &Iosb, &FileStdInfo, sizeof(FileStdInfo), FileStandardInformation); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Could not get file size\n"); - return 0; - } - - // Allocate nonpageable memory for driver - size = FileStdInfo.EndOfFile.u.LowPart; - buffer = ExAllocatePoolWithTag(NonPagedPool, size, TAG_GDITEXT); - - if (buffer == NULL) - { - DPRINT1("could not allocate memory for module"); - return 0; - } - - // Load driver into memory chunk - Status = ZwReadFile(FileHandle, - NULL, - NULL, - NULL, - &Iosb, - buffer, - FileStdInfo.EndOfFile.u.LowPart, - NULL, - NULL); - - if (!NT_SUCCESS(Status)) - { - DPRINT1("could not read module file into memory"); - ExFreePool(buffer); - return 0; - } - - ZwClose(FileHandle); - - IntLockFreeType; - error = FT_New_Memory_Face(library, buffer, size, 0, &face); - IntUnLockFreeType; - if (error == FT_Err_Unknown_File_Format) - { - DPRINT1("Unknown font file format\n"); - return 0; - } - else if (error) - { - DPRINT1("Error reading font file (error code: %u)\n", error); // 48 - return 0; - } - - entry = ExAllocatePoolWithTag(NonPagedPool, sizeof(FONT_ENTRY), TAG_FONT); - if(!entry) - { - SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); - return 0; - } - - // FontGDI->Filename = Filename; perform strcpy - FontGDI->face = face; - - // FIXME: Complete text metrics - FontGDI->TextMetric.tmAscent = (face->size->metrics.ascender + 32) >> 6; // units above baseline - 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); - - // Add this font resource to the font table - entry->hFont = NewFont; - entry->NotEnum = (fl & FR_NOT_ENUM); - RtlInitAnsiString(&StringA, (LPSTR)face->family_name); - RtlAnsiStringToUnicodeString(&entry->FaceName, &StringA, TRUE); - - if(fl & FR_PRIVATE) - { - PW32PROCESS Win32Process = PsGetWin32Process(); - - IntLockProcessPrivateFonts(Win32Process); - InsertTailList(&Win32Process->PrivateFontListHead, &entry->ListEntry); - FontsLoaded++; - IntUnLockProcessPrivateFonts(Win32Process); - } - else - { - IntLockGlobalFonts; - InsertTailList(&FontListHead, &entry->ListEntry); - FontsLoaded++; - IntUnLockGlobalFonts; - } - - return 1; -} - -BOOL FASTCALL InitFontSupport(VOID) -{ - ULONG ulError; - UNICODE_STRING cchDir, cchFilename, cchSearchPattern ; - OBJECT_ATTRIBUTES obAttr; - IO_STATUS_BLOCK Iosb; - HANDLE hDirectory; - NTSTATUS Status; - PFILE_DIRECTORY_INFORMATION iFileData; - PVOID pBuff; - BOOLEAN bRestartScan = TRUE; - BOOLEAN Result = FALSE; - - InitializeListHead(&FontListHead); - ExInitializeFastMutex(&FontListLock); - ExInitializeFastMutex(&FreeTypeLock); - - ulError = FT_Init_FreeType(&library); - - if(!ulError) - { - RtlInitUnicodeString(&cchDir, L"\\SystemRoot\\Media\\Fonts\\"); - - RtlInitUnicodeString(&cchSearchPattern,L"*.ttf"); - InitializeObjectAttributes( &obAttr, - &cchDir, - OBJ_CASE_INSENSITIVE, - NULL, - NULL ); - - Status = ZwOpenFile( &hDirectory, - SYNCHRONIZE | FILE_LIST_DIRECTORY, - &obAttr, - &Iosb, - FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - FILE_SYNCHRONOUS_IO_NONALERT | FILE_DIRECTORY_FILE ); - if( NT_SUCCESS(Status) ) - { - while(1) - { - if (bRestartScan) - { - pBuff = ExAllocatePool(NonPagedPool,0x4000); - if (pBuff == NULL) - { - break; - } - RtlInitUnicodeString(&cchFilename,0); - cchFilename.MaximumLength = 0x1000; - cchFilename.Buffer = ExAllocatePoolWithTag(PagedPool,cchFilename.MaximumLength, TAG_STRING); - if (cchFilename.Buffer == NULL) - { - ExFreePool(pBuff); - break; - } - } - - Status = NtQueryDirectoryFile( hDirectory, - NULL, - NULL, - NULL, - &Iosb, - pBuff, - 0x4000, - FileDirectoryInformation, - FALSE, - &cchSearchPattern, - bRestartScan ); - - if( !NT_SUCCESS(Status) || Status == STATUS_NO_MORE_FILES ) - { - ExFreePool(pBuff); - ExFreePool(cchFilename.Buffer); - break; - } - bRestartScan = FALSE; - iFileData = (PFILE_DIRECTORY_INFORMATION)pBuff; - while(1) - { - UNICODE_STRING tmpString; - tmpString.Buffer = iFileData->FileName; - tmpString.Length = tmpString.MaximumLength = iFileData->FileNameLength; - RtlCopyUnicodeString(&cchFilename, &cchDir); - RtlAppendUnicodeStringToString(&cchFilename, &tmpString); - cchFilename.Buffer[cchFilename.Length / sizeof(WCHAR)] = 0; - if (0 != IntGdiAddFontResource(&cchFilename, 0)) - { - Result = TRUE; - } - if (iFileData->NextEntryOffset == 0) - { - break; - } - iFileData = (PVOID)iFileData + iFileData->NextEntryOffset; - } - } - } - } - ZwClose(hDirectory); - return Result; -} - static NTSTATUS STDCALL GetFontObjectsFromTextObj(PTEXTOBJ TextObj, HFONT *FontHandle, FONTOBJ **FontObj, PFONTGDI *FontGDI) { From 491f067798ce7f0a4580e1644f62d6cabf178872 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sun, 20 Jun 2004 01:07:26 +0000 Subject: [PATCH 1436/1463] added support to edit REG_MULTI_SZ strings. svn path=/trunk/; revision=9735 --- reactos/subsys/system/regedit/En.rc | 16 ++ reactos/subsys/system/regedit/edit.c | 192 +++++++++++++++++++++++ reactos/subsys/system/regedit/listview.c | 11 +- reactos/subsys/system/regedit/resource.h | 4 + 4 files changed, 218 insertions(+), 5 deletions(-) diff --git a/reactos/subsys/system/regedit/En.rc b/reactos/subsys/system/regedit/En.rc index 8617b4a0a83..fb4874e4d82 100644 --- a/reactos/subsys/system/regedit/En.rc +++ b/reactos/subsys/system/regedit/En.rc @@ -142,6 +142,20 @@ BEGIN PUSHBUTTON "Cancel",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 "Edit Multi-String" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Value &name:",IDC_STATIC,6,6,134,8 + EDITTEXT IDC_VALUE_NAME,6,17,240,12,ES_AUTOHSCROLL | ES_READONLY + LTEXT "&Value data:",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 "Cancel",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 | @@ -225,9 +239,11 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_ERROR "Error" + IDS_WARNING "Warning" IDS_BAD_VALUE "Can't query value '%s'" 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." END /*****************************************************************/ diff --git a/reactos/subsys/system/regedit/edit.c b/reactos/subsys/system/regedit/edit.c index 7523f59773c..abddc30a5fc 100644 --- a/reactos/subsys/system/regedit/edit.c +++ b/reactos/subsys/system/regedit/edit.c @@ -71,6 +71,29 @@ void error(HWND hwnd, INT resId, ...) MessageBox(hwnd, errstr, title, MB_OK | MB_ICONERROR); } +void warning(HWND hwnd, INT resId, ...) +{ + va_list ap; + TCHAR title[256]; + TCHAR errfmt[1024]; + TCHAR errstr[1024]; + HINSTANCE hInstance; + + hInstance = GetModuleHandle(0); + + if (!LoadString(hInstance, IDS_WARNING, title, COUNT_OF(title))) + lstrcpy(title, "Error"); + + if (!LoadString(hInstance, resId, errfmt, COUNT_OF(errfmt))) + lstrcpy(errfmt, "Unknown error string!"); + + va_start(ap, resId); + _vsntprintf(errstr, COUNT_OF(errstr), errfmt, ap); + va_end(ap); + + MessageBox(hwnd, errstr, title, MB_OK | MB_ICONSTOP); +} + INT_PTR CALLBACK modify_string_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { TCHAR* valueData; @@ -134,6 +157,69 @@ INT_PTR CALLBACK modify_string_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, L } +INT_PTR CALLBACK modify_multi_string_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + TCHAR* valueData; + HWND hwndValue; + int len; + + switch(uMsg) { + case WM_INITDIALOG: + if(editValueName && strcmp(editValueName, _T(""))) + { + SetDlgItemText(hwndDlg, IDC_VALUE_NAME, editValueName); + } + else + { + SetDlgItemText(hwndDlg, IDC_VALUE_NAME, _T("(Default)")); + } + SetDlgItemText(hwndDlg, IDC_VALUE_DATA, stringValueData); + SetFocus(GetDlgItem(hwndDlg, IDC_VALUE_DATA)); + return FALSE; + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDOK: + if ((hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA))) + { + if ((len = GetWindowTextLength(hwndValue))) + { + if (stringValueData) + { + if ((valueData = HeapReAlloc(GetProcessHeap(), 0, stringValueData, (len + 1) * sizeof(TCHAR)))) + { + stringValueData = valueData; + if (!GetWindowText(hwndValue, stringValueData, len + 1)) + *stringValueData = 0; + } + } + else + { + if ((valueData = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(TCHAR)))) + { + stringValueData = valueData; + if (!GetWindowText(hwndValue, stringValueData, len + 1)) + *stringValueData = 0; + } + } + } + else + { + if (stringValueData) + *stringValueData = 0; + } + } + EndDialog(hwndDlg, IDOK); + break; + case IDCANCEL: + EndDialog(hwndDlg, IDCANCEL); + return TRUE; + } + } + return FALSE; +} + + LRESULT CALLBACK DwordEditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { WNDPROC oldwndproc; @@ -362,6 +448,112 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName) result = TRUE; } } + else if (type == REG_MULTI_SZ) + { + if (valueDataLen > 0) + { + DWORD NewLen, llen, listlen, nl_len; + LPTSTR src, lines = NULL; + + if (!(stringValueData = HeapAlloc(GetProcessHeap(), 0, valueDataLen))) + { + error(hwnd, IDS_TOO_BIG_VALUE, valueDataLen); + goto done; + } + lRet = RegQueryValueEx(hKey, valueName, 0, 0, stringValueData, &valueDataLen); + if (lRet != ERROR_SUCCESS) + { + error(hwnd, IDS_BAD_VALUE, valueName); + goto done; + } + + /* convert \0 to \r\n */ + NewLen = valueDataLen; + src = stringValueData; + nl_len = _tcslen(_T("\r\n")) * sizeof(TCHAR); + listlen = sizeof(TCHAR); + lines = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, listlen + sizeof(TCHAR)); + while(*src != _T('\0')) + { + llen = _tcslen(src); + if(llen == 0) + break; + listlen += (llen * sizeof(TCHAR)) + nl_len; + lines = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, lines, listlen); + _tcscat(lines, src); + _tcscat(lines, _T("\r\n")); + src += llen + 1; + } + HeapFree(GetProcessHeap(), 0, stringValueData); + stringValueData = lines; + } + else + { + stringValueData = NULL; + } + + if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_MULTI_STRING), hwnd, modify_multi_string_dlgproc) == IDOK) + { + if (stringValueData) + { + /* convert \r\n to \0 */ + BOOL EmptyLines = FALSE; + LPTSTR src, lines, nl; + DWORD linechars, buflen, c_nl, dest; + + src = stringValueData; + buflen = sizeof(TCHAR); + lines = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, buflen + sizeof(TCHAR)); + c_nl = _tcslen(_T("\r\n")); + dest = 0; + while(*src != _T('\0')) + { + if((nl = _tcsstr(src, _T("\r\n")))) + { + linechars = (nl - src) / sizeof(TCHAR); + if(nl == src) + { + EmptyLines = TRUE; + src = nl + c_nl; + continue; + } + } + else + { + linechars = _tcslen(src); + } + if(linechars > 0) + { + buflen += ((linechars + 1) * sizeof(TCHAR)); + lines = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, lines, buflen); + memcpy((lines + dest), src, linechars * sizeof(TCHAR)); + dest += linechars; + lines[dest++] = _T('\0'); + } + else + { + EmptyLines = TRUE; + } + src += linechars + (nl != NULL ? c_nl : 0); + } + lines[++dest] = _T('\0'); + + if(EmptyLines) + { + warning(hwnd, IDS_MULTI_SZ_EMPTY_STRING); + } + + lRet = RegSetValueEx(hKey, valueName, 0, type, lines, buflen); + HeapFree(GetProcessHeap(), 0, lines); + } + else + { + lRet = RegSetValueEx(hKey, valueName, 0, type, NULL, 0); + } + if (lRet == ERROR_SUCCESS) + result = TRUE; + } + } else if (type == REG_DWORD) { lRet = RegQueryValueEx(hKey, valueName, 0, 0, (LPBYTE)&dwordValueData, &valueDataLen); diff --git a/reactos/subsys/system/regedit/listview.c b/reactos/subsys/system/regedit/listview.c index 0e6efb2becc..a9525a1c6de 100644 --- a/reactos/subsys/system/regedit/listview.c +++ b/reactos/subsys/system/regedit/listview.c @@ -159,8 +159,6 @@ static void AddEntryToList(HWND hwndLV, LPTSTR Name, DWORD dwValType, void* ValB index = ListView_InsertItem(hwndLV, &item); if (index != -1) { - /* LPTSTR pszText = NULL; */ - LPTSTR pszText = _T("value"); switch (dwValType) { case REG_SZ: case REG_EXPAND_SZ: @@ -182,14 +180,18 @@ static void AddEntryToList(HWND hwndLV, LPTSTR Name, DWORD dwValType, void* ValB /* concatenate all srings */ while(*src != _T('\0')) { - _tcscat(str, _T(" ")); _tcscat(str, src); + _tcscat(str, _T(" ")); src += _tcslen(src) + 1; } ListView_SetItemText(hwndLV, index, 2, str); HeapFree(GetProcessHeap(), 0, str); } + else + ListView_SetItemText(hwndLV, index, 2, _T("")); } + else + ListView_SetItemText(hwndLV, index, 2, _T("")); } break; case REG_DWORD: { @@ -212,8 +214,7 @@ static void AddEntryToList(HWND hwndLV, LPTSTR Name, DWORD dwValType, void* ValB } break; default: - /* lpsRes = convertHexToHexCSV(lpbData, dwLen); */ - ListView_SetItemText(hwndLV, index, 2, pszText); + ListView_SetItemText(hwndLV, index, 2, _T("(value)")); break; } } diff --git a/reactos/subsys/system/regedit/resource.h b/reactos/subsys/system/regedit/resource.h index cccd1129d79..83cae73a35c 100644 --- a/reactos/subsys/system/regedit/resource.h +++ b/reactos/subsys/system/regedit/resource.h @@ -109,6 +109,8 @@ #define IDS_UNSUPPORTED_TYPE 32838 #define IDS_TOO_BIG_VALUE 32839 #define ID_EDIT_MODIFY_BIN 32840 +#define IDS_WARNING 32841 +#define IDS_MULTI_SZ_EMPTY_STRING 32842 #define IDD_EDIT_STRING 2000 #define IDC_VALUE_NAME 2001 @@ -118,4 +120,6 @@ #define IDC_FORMAT_HEX 2004 #define IDC_FORMAT_DEC 2005 +#define IDD_EDIT_MULTI_STRING 2006 + #define IDC_STATIC -1 From 841ace6796ab03c5e7c3b3d1241615dc12224c1e Mon Sep 17 00:00:00 2001 From: Vizzini <vizzini@plasmic.com> Date: Sun, 20 Jun 2004 02:10:07 +0000 Subject: [PATCH 1437/1463] backed out bugified patch svn path=/trunk/; revision=9736 --- reactos/ntoskrnl/cc/copy.c | 29 ++++++----------------------- 1 file changed, 6 insertions(+), 23 deletions(-) diff --git a/reactos/ntoskrnl/cc/copy.c b/reactos/ntoskrnl/cc/copy.c index e501682fd25..e8d7e581993 100644 --- a/reactos/ntoskrnl/cc/copy.c +++ b/reactos/ntoskrnl/cc/copy.c @@ -1,4 +1,4 @@ -/* $Id: copy.c,v 1.25 2004/06/19 08:53:35 vizzini Exp $ +/* $Id: copy.c,v 1.26 2004/06/20 02:10:07 vizzini Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -139,12 +139,7 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length, /* * Create an MDL which contains all their pages. */ - Mdl = MmCreateMdl(NULL, NULL, current_size); - if(Mdl == NULL) { - DPRINT("MmCreateMdl: Out of memory!"); - return(STATUS_NO_MEMORY); - } - + MmInitializeMdl(Mdl, NULL, current_size); Mdl->MdlFlags |= (MDL_PAGES_LOCKED | MDL_IO_PAGE_READ); current2 = current; offset = 0; @@ -227,14 +222,8 @@ ReadCacheSegment(PCACHE_SEGMENT CacheSeg) { Size = CacheSeg->Bcb->CacheSegmentSize; } - - Mdl = MmCreateMdl(NULL, CacheSeg->BaseAddress, Size); - if(Mdl == NULL) - { - DPRINT("MmCreateMdl: Out of memory!"); - return(STATUS_NO_MEMORY); - } - + Mdl = alloca(MmSizeOfMdl(CacheSeg->BaseAddress, Size)); + MmInitializeMdl(Mdl, CacheSeg->BaseAddress, Size); MmBuildMdlForNonPagedPool(Mdl); Mdl->MdlFlags |= MDL_IO_PAGE_READ; KeInitializeEvent(&Event, NotificationEvent, FALSE); @@ -275,14 +264,8 @@ WriteCacheSegment(PCACHE_SEGMENT CacheSeg) { Size = CacheSeg->Bcb->CacheSegmentSize; } - - Mdl = MmCreateMdl(NULL, CacheSeg->BaseAddress, Size); - if(Mdl == NULL) - { - DPRINT("MmCreateMdl: Out of memory!"); - return(STATUS_NO_MEMORY); - } - + Mdl = alloca(MmSizeOfMdl(CacheSeg->BaseAddress, Size)); + MmInitializeMdl(Mdl, CacheSeg->BaseAddress, Size); MmBuildMdlForNonPagedPool(Mdl); Mdl->MdlFlags |= MDL_IO_PAGE_READ; KeInitializeEvent(&Event, NotificationEvent, FALSE); From 4c4f4934122473c4f7400e1a0a5921a2b877ebdc Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sun, 20 Jun 2004 02:22:44 +0000 Subject: [PATCH 1438/1463] some fixes to be able to create a unicode build svn path=/trunk/; revision=9737 --- reactos/subsys/system/regedit/childwnd.c | 4 +-- reactos/subsys/system/regedit/edit.c | 39 ++++++++++++------------ reactos/subsys/system/regedit/framewnd.c | 10 +++--- reactos/subsys/system/regedit/listview.c | 6 ++-- reactos/subsys/system/regedit/regproc.c | 34 ++++++++++----------- reactos/subsys/system/regedit/regproc.h | 2 +- reactos/subsys/system/regedit/treeview.c | 4 +-- 7 files changed, 50 insertions(+), 49 deletions(-) diff --git a/reactos/subsys/system/regedit/childwnd.c b/reactos/subsys/system/regedit/childwnd.c index 74a2ec1e125..96619396658 100644 --- a/reactos/subsys/system/regedit/childwnd.c +++ b/reactos/subsys/system/regedit/childwnd.c @@ -276,9 +276,9 @@ LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa if (keyPath) { RefreshListView(pChildWnd->hListWnd, hRootKey, keyPath); rootName = get_root_key_name(hRootKey); - fullPath = HeapAlloc(GetProcessHeap(), 0, (lstrlen(rootName) + 1 + lstrlen(keyPath) + 1) * sizeof(TCHAR)); + fullPath = HeapAlloc(GetProcessHeap(), 0, (_tcslen(rootName) + 1 + _tcslen(keyPath) + 1) * sizeof(TCHAR)); if (fullPath) { - _stprintf(fullPath, "%s\\%s", rootName, keyPath); + _stprintf(fullPath, _T("%s\\%s"), rootName, keyPath); SendMessage(hStatusBar, SB_SETTEXT, 0, (LPARAM)fullPath); HeapFree(GetProcessHeap(), 0, fullPath); } diff --git a/reactos/subsys/system/regedit/edit.c b/reactos/subsys/system/regedit/edit.c index abddc30a5fc..b7fa78dbf25 100644 --- a/reactos/subsys/system/regedit/edit.c +++ b/reactos/subsys/system/regedit/edit.c @@ -59,10 +59,10 @@ void error(HWND hwnd, INT resId, ...) hInstance = GetModuleHandle(0); if (!LoadString(hInstance, IDS_ERROR, title, COUNT_OF(title))) - lstrcpy(title, "Error"); + _tcscpy(title, _T("Error")); if (!LoadString(hInstance, resId, errfmt, COUNT_OF(errfmt))) - lstrcpy(errfmt, "Unknown error string!"); + _tcscpy(errfmt, _T("Unknown error string!")); va_start(ap, resId); _vsntprintf(errstr, COUNT_OF(errstr), errfmt, ap); @@ -82,10 +82,10 @@ void warning(HWND hwnd, INT resId, ...) hInstance = GetModuleHandle(0); if (!LoadString(hInstance, IDS_WARNING, title, COUNT_OF(title))) - lstrcpy(title, "Error"); + _tcscpy(title, _T("Warning")); if (!LoadString(hInstance, resId, errfmt, COUNT_OF(errfmt))) - lstrcpy(errfmt, "Unknown error string!"); + _tcscpy(errfmt, _T("Unknown error string!")); va_start(ap, resId); _vsntprintf(errstr, COUNT_OF(errstr), errfmt, ap); @@ -102,7 +102,7 @@ INT_PTR CALLBACK modify_string_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, L switch(uMsg) { case WM_INITDIALOG: - if(editValueName && strcmp(editValueName, _T(""))) + if(editValueName && _tcscmp(editValueName, _T(""))) { SetDlgItemText(hwndDlg, IDC_VALUE_NAME, editValueName); } @@ -165,7 +165,7 @@ INT_PTR CALLBACK modify_multi_string_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wPa switch(uMsg) { case WM_INITDIALOG: - if(editValueName && strcmp(editValueName, _T(""))) + if(editValueName && _tcscmp(editValueName, _T(""))) { SetDlgItemText(hwndDlg, IDC_VALUE_NAME, editValueName); } @@ -282,7 +282,7 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP SetWindowLong(hwndValue, GWL_USERDATA, (LONG)oldproc); SetWindowLong(hwndValue, GWL_WNDPROC, (LONG)DwordEditSubclassProc); - if(editValueName && strcmp(editValueName, _T(""))) + if(editValueName && _tcscmp(editValueName, _T(""))) { SetDlgItemText(hwndDlg, IDC_VALUE_NAME, editValueName); } @@ -291,7 +291,7 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP SetDlgItemText(hwndDlg, IDC_VALUE_NAME, _T("(Default)")); } CheckRadioButton (hwndDlg, IDC_FORMAT_HEX, IDC_FORMAT_DEC, IDC_FORMAT_HEX); - sprintf (ValueString, "%lx", dwordValueData); + _stprintf (ValueString, _T("%lx"), dwordValueData); SetDlgItemText(hwndDlg, IDC_VALUE_DATA, ValueString); SetFocus(GetDlgItem(hwndDlg, IDC_VALUE_DATA)); return FALSE; @@ -313,7 +313,7 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP } else { - Value = strtoul (ValueString, &Remainder, 10); + Value = _tcstoul (ValueString, &Remainder, 10); } } else @@ -321,7 +321,7 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP Value = 0; } } - sprintf (ValueString, "%lx", Value); + _stprintf (ValueString, _T("%lx"), Value); SetDlgItemText(hwndDlg, IDC_VALUE_DATA, ValueString); return TRUE; } @@ -341,7 +341,7 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP } else { - Value = strtoul (ValueString, &Remainder, 16); + Value = _tcstoul (ValueString, &Remainder, 16); } } else @@ -349,7 +349,7 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP Value = 0; } } - sprintf (ValueString, "%lu", Value); + _stprintf (ValueString, _T("%lu"), Value); SetDlgItemText(hwndDlg, IDC_VALUE_DATA, ValueString); return TRUE; } @@ -367,7 +367,7 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP } Base = (dwordEditMode == EDIT_MODE_HEX) ? 16 : 10; - dwordValueData = strtoul (ValueString, &Remainder, Base); + dwordValueData = _tcstoul (ValueString, &Remainder, Base); } else { @@ -422,7 +422,7 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName) error(hwnd, IDS_TOO_BIG_VALUE, valueDataLen); goto done; } - lRet = RegQueryValueEx(hKey, valueName, 0, 0, stringValueData, &valueDataLen); + lRet = RegQueryValueEx(hKey, valueName, 0, 0, (LPBYTE)stringValueData, &valueDataLen); if (lRet != ERROR_SUCCESS) { error(hwnd, IDS_BAD_VALUE, valueName); @@ -438,7 +438,7 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName) { if (stringValueData) { - lRet = RegSetValueEx(hKey, valueName, 0, type, stringValueData, lstrlen(stringValueData) + 1); + lRet = RegSetValueEx(hKey, valueName, 0, type, (LPBYTE)stringValueData, (_tcslen(stringValueData) + 1) * sizeof(TCHAR)); } else { @@ -452,7 +452,7 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName) { if (valueDataLen > 0) { - DWORD NewLen, llen, listlen, nl_len; + DWORD llen, listlen, nl_len; LPTSTR src, lines = NULL; if (!(stringValueData = HeapAlloc(GetProcessHeap(), 0, valueDataLen))) @@ -460,7 +460,7 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName) error(hwnd, IDS_TOO_BIG_VALUE, valueDataLen); goto done; } - lRet = RegQueryValueEx(hKey, valueName, 0, 0, stringValueData, &valueDataLen); + lRet = RegQueryValueEx(hKey, valueName, 0, 0, (LPBYTE)stringValueData, &valueDataLen); if (lRet != ERROR_SUCCESS) { error(hwnd, IDS_BAD_VALUE, valueName); @@ -468,7 +468,6 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName) } /* convert \0 to \r\n */ - NewLen = valueDataLen; src = stringValueData; nl_len = _tcslen(_T("\r\n")) * sizeof(TCHAR); listlen = sizeof(TCHAR); @@ -510,7 +509,7 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName) { if((nl = _tcsstr(src, _T("\r\n")))) { - linechars = (nl - src) / sizeof(TCHAR); + linechars = nl - src; if(nl == src) { EmptyLines = TRUE; @@ -543,7 +542,7 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName) warning(hwnd, IDS_MULTI_SZ_EMPTY_STRING); } - lRet = RegSetValueEx(hKey, valueName, 0, type, lines, buflen); + lRet = RegSetValueEx(hKey, valueName, 0, type, (LPBYTE)lines, buflen); HeapFree(GetProcessHeap(), 0, lines); } else diff --git a/reactos/subsys/system/regedit/framewnd.c b/reactos/subsys/system/regedit/framewnd.c index 050b21a11e2..7947a525a31 100644 --- a/reactos/subsys/system/regedit/framewnd.c +++ b/reactos/subsys/system/regedit/framewnd.c @@ -245,7 +245,8 @@ static BOOL ImportRegistryFile(HWND hWnd) ofn.lpstrTitle = _T("Import Registry File"); /* ofn.lCustData = ;*/ if (GetOpenFileName(&ofn)) { - if (!import_registry_file(ofn.lpstrFile)) { + /* FIXME - convert to ascii */ + if (!import_registry_file((LPSTR)ofn.lpstrFile)) { /*printf("Can't open file \"%s\"\n", ofn.lpstrFile);*/ return FALSE; } @@ -287,8 +288,9 @@ static BOOL ExportRegistryFile(HWND hWnd) ofn.lpfnHook = ImportRegistryFile_OFNHookProc; ofn.lpTemplateName = MAKEINTRESOURCE(IDD_DIALOG1); if (GetSaveFileName(&ofn)) { - BOOL result; - result = export_registry_key(ofn.lpstrFile, ExportKeyPath); + BOOL result; + /* FIXME - convert strings to ascii! */ + result = export_registry_key((CHAR*)ofn.lpstrFile, (CHAR*)ExportKeyPath); /*result = export_registry_key(ofn.lpstrFile, NULL);*/ /*if (!export_registry_key(ofn.lpstrFile, NULL)) {*/ if (!result) { @@ -307,7 +309,7 @@ static BOOL ExportRegistryFile(HWND hWnd) if (s[0]) { TCHAR reg_key_name[KEY_MAX_LEN]; get_file_name(&s, reg_key_name, KEY_MAX_LEN); - export_registry_key(filename, reg_key_name); + export_registry_key((CHAR)filename, reg_key_name); } else { export_registry_key(filename, NULL); } diff --git a/reactos/subsys/system/regedit/listview.c b/reactos/subsys/system/regedit/listview.c index a9525a1c6de..ea637799225 100644 --- a/reactos/subsys/system/regedit/listview.c +++ b/reactos/subsys/system/regedit/listview.c @@ -106,7 +106,7 @@ BOOL IsDefaultValue(HWND hwndLV, int i) if(ListView_GetItem(hwndLV, &Item)) { lineinfo = (PLINE_INFO)Item.lParam; - return lineinfo && (!lineinfo->name || !strcmp(lineinfo->name, _T(""))); + return lineinfo && (!lineinfo->name || !_tcscmp(lineinfo->name, _T(""))); } return FALSE; } @@ -392,7 +392,7 @@ BOOL ListWndNotifyProc(HWND hWnd, WPARAM wParam, LPARAM lParam, BOOL *Result) if(Info) { lineinfo = (PLINE_INFO)Info->item.lParam; - if(!lineinfo->name || !strcmp(lineinfo->name, _T(""))) + if(!lineinfo->name || !_tcscmp(lineinfo->name, _T(""))) { *Result = TRUE; } @@ -490,7 +490,7 @@ BOOL RefreshListView(HWND hwndLV, HKEY hKey, LPCTSTR keyPath) dwValSize = max_val_size; dwValType = 0L; ++dwIndex; - if(!strcmp(ValName, _T(""))) + if(!_tcscmp(ValName, _T(""))) { AddedDefault = TRUE; } diff --git a/reactos/subsys/system/regedit/regproc.c b/reactos/subsys/system/regedit/regproc.c index 0479c856d5b..974e3c0091a 100644 --- a/reactos/subsys/system/regedit/regproc.c +++ b/reactos/subsys/system/regedit/regproc.c @@ -424,7 +424,7 @@ HRESULT setValue(LPSTR val_name, LPSTR val_data) } } - hRes = RegSetValueEx( + hRes = RegSetValueExA( currentKeyHandle, val_name, 0, /* Reserved */ @@ -460,7 +460,7 @@ HRESULT openKey( LPSTR stdInput) if (currentKeyName == NULL) return ERROR_INVALID_PARAMETER; - hRes = RegCreateKeyEx( + hRes = RegCreateKeyExA( currentKeyClass, /* Class */ currentKeyName, /* Sub Key */ 0, /* MUST BE 0 */ @@ -986,7 +986,7 @@ void doRegisterDLL(LPSTR stdInput) return; /* Load and register the library, then free it */ - theLib = LoadLibrary(stdInput); + theLib = LoadLibraryA(stdInput); if (theLib) { FARPROC lpfnDLLRegProc = GetProcAddress(theLib, "DllRegisterServer"); if (lpfnDLLRegProc) @@ -1019,7 +1019,7 @@ void doUnregisterDLL(LPSTR stdInput) return; /* Load and unregister the library, then free it */ - theLib = LoadLibrary(stdInput); + theLib = LoadLibraryA(stdInput); if (theLib) { FARPROC lpfnDLLRegProc = GetProcAddress(theLib, "DllUnregisterServer"); if (lpfnDLLRegProc) @@ -1173,8 +1173,8 @@ void export_hkey(FILE *file, HKEY key, DWORD value_type; DWORD val_name_len1 = *val_name_len; DWORD val_size1 = *val_size; - ret = RegEnumValue(key, i, *val_name_buf, &val_name_len1, NULL, - &value_type, *val_buf, &val_size1); + ret = RegEnumValueA(key, i, *val_name_buf, &val_name_len1, NULL, + &value_type, *val_buf, &val_size1); if (ret != ERROR_SUCCESS) { more_data = FALSE; if (ret != ERROR_NO_MORE_ITEMS) { @@ -1257,8 +1257,8 @@ void export_hkey(FILE *file, HKEY key, while(more_data) { DWORD buf_len = *reg_key_name_len - curr_len; - ret = RegEnumKeyEx(key, i, *reg_key_name_buf + curr_len + 1, &buf_len, - NULL, NULL, NULL, NULL); + ret = RegEnumKeyExA(key, i, *reg_key_name_buf + curr_len + 1, &buf_len, + NULL, NULL, NULL, NULL); if (ret != ERROR_SUCCESS && ret != ERROR_MORE_DATA) { more_data = FALSE; if (ret != ERROR_NO_MORE_ITEMS) { @@ -1268,8 +1268,8 @@ void export_hkey(FILE *file, HKEY key, HKEY subkey; i++; - if (RegOpenKey(key, *reg_key_name_buf + curr_len + 1, - &subkey) == ERROR_SUCCESS) { + if (RegOpenKeyA(key, *reg_key_name_buf + curr_len + 1, + &subkey) == ERROR_SUCCESS) { export_hkey(file, subkey, reg_key_name_buf, reg_key_name_len, val_name_buf, val_name_len, val_buf, val_size); RegCloseKey(subkey); @@ -1347,7 +1347,7 @@ BOOL export_registry_key(CHAR *file_name, CHAR *reg_key_name) ®_key_name_buf, ®_key_name_len, &val_name_buf, &val_name_len, &val_buf, &val_size); - } else if (RegOpenKey(reg_key_class, branch_name, &key) == ERROR_SUCCESS) { + } else if (RegOpenKeyA(reg_key_class, branch_name, &key) == ERROR_SUCCESS) { file = REGPROC_open_export_file(file_name); export_hkey(file, key, ®_key_name_buf, ®_key_name_len, @@ -1390,7 +1390,7 @@ BOOL export_registry_key(CHAR *file_name, CHAR *reg_key_name) /****************************************************************************** * Reads contents of the specified file into the registry. */ -BOOL import_registry_file(LPTSTR filename) +BOOL import_registry_file(LPSTR filename) { FILE* reg_file = fopen(filename, "r"); @@ -1414,7 +1414,7 @@ void delete_branch(HKEY key, LONG ret; long int i; - if (RegOpenKey(key, *reg_key_name_buf, &branch_key) != ERROR_SUCCESS) { + if (RegOpenKeyA(key, *reg_key_name_buf, &branch_key) != ERROR_SUCCESS) { REGPROC_print_error(); } @@ -1433,8 +1433,8 @@ void delete_branch(HKEY key, for (i = subkeys - 1; i >= 0; i--) { DWORD buf_len = *reg_key_name_len - curr_len; - ret = RegEnumKeyEx(branch_key, i, *reg_key_name_buf + curr_len + 1, - &buf_len, NULL, NULL, NULL, NULL); + ret = RegEnumKeyExA(branch_key, i, *reg_key_name_buf + curr_len + 1, + &buf_len, NULL, NULL, NULL, NULL); if (ret != ERROR_SUCCESS && ret != ERROR_MORE_DATA && ret != ERROR_NO_MORE_ITEMS) { @@ -1445,7 +1445,7 @@ void delete_branch(HKEY key, } (*reg_key_name_buf)[curr_len] = '\0'; RegCloseKey(branch_key); - RegDeleteKey(key, *reg_key_name_buf); + RegDeleteKeyA(key, *reg_key_name_buf); } /****************************************************************************** @@ -1479,7 +1479,7 @@ void delete_registry_key(CHAR *reg_key_name) getAppName(), reg_key_name); exit(1); } - if (RegOpenKey(reg_key_class, branch_name, &branch_key) == ERROR_SUCCESS) { + if (RegOpenKeyA(reg_key_class, branch_name, &branch_key) == ERROR_SUCCESS) { /* check whether the key exists */ RegCloseKey(branch_key); delete_branch(reg_key_class, &branch_name, &branch_name_len); diff --git a/reactos/subsys/system/regedit/regproc.h b/reactos/subsys/system/regedit/regproc.h index 9a7d723d5b8..cc89aa0c575 100644 --- a/reactos/subsys/system/regedit/regproc.h +++ b/reactos/subsys/system/regedit/regproc.h @@ -37,7 +37,7 @@ void doRegisterDLL(LPSTR lpsLine); void doUnregisterDLL(LPSTR lpsLine); BOOL export_registry_key(CHAR *file_name, CHAR *reg_key_name); -BOOL import_registry_file(LPTSTR filename); +BOOL import_registry_file(LPSTR filename); void delete_registry_key(CHAR *reg_key_name); void setAppName(CHAR *name); diff --git a/reactos/subsys/system/regedit/treeview.c b/reactos/subsys/system/regedit/treeview.c index bc4cf004aa5..ba4927015b8 100644 --- a/reactos/subsys/system/regedit/treeview.c +++ b/reactos/subsys/system/regedit/treeview.c @@ -111,7 +111,7 @@ static HTREEITEM AddEntryToTree(HWND hwndTV, HTREEITEM hParent, LPTSTR label, HK tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN | TVIF_PARAM; tvi.pszText = label; - tvi.cchTextMax = lstrlen(tvi.pszText); + tvi.cchTextMax = _tcslen(tvi.pszText); tvi.iImage = Image_Closed; tvi.iSelectedImage = Image_Open; tvi.cChildren = dwChildren; @@ -132,7 +132,7 @@ static BOOL InitTreeViewItems(HWND hwndTV, LPTSTR pHostName) tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN | TVIF_PARAM; /* Set the text of the item. */ tvi.pszText = pHostName; - tvi.cchTextMax = lstrlen(tvi.pszText); + tvi.cchTextMax = _tcslen(tvi.pszText); /* Assume the item is not a parent item, so give it an image. */ tvi.iImage = Image_Root; tvi.iSelectedImage = Image_Root; From bda771abc0504dcfd40063ec5a09f66c14571c93 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III <royce3@ev1.net> Date: Sun, 20 Jun 2004 03:06:31 +0000 Subject: [PATCH 1439/1463] much nicer-looking 8-bit versions of mycomputer.ico - the wine project is welcome to have this change if they want it. svn path=/trunk/; revision=9738 --- reactos/lib/shell32/shres.rc | 2921 ++++++++++++++++++---------------- 1 file changed, 1512 insertions(+), 1409 deletions(-) diff --git a/reactos/lib/shell32/shres.rc b/reactos/lib/shell32/shres.rc index 3679379802e..99bdd410dba 100644 --- a/reactos/lib/shell32/shres.rc +++ b/reactos/lib/shell32/shres.rc @@ -5740,94 +5740,284 @@ END /* BINRES mycomputer.ico */ 15 ICON mycomputer.ico /* { - '00 00 01 00 08 00 20 20 00 00 01 00 04 00 E8 02' - '00 00 86 00 00 00 10 10 00 00 01 00 04 00 28 01' - '00 00 6E 03 00 00 30 30 00 00 01 00 08 00 A8 0E' - '00 00 96 04 00 00 20 20 00 00 01 00 08 00 A8 08' - '00 00 3E 13 00 00 10 10 00 00 01 00 08 00 68 05' - '00 00 E6 1B 00 00 30 30 00 00 01 00 20 00 A8 25' - '00 00 4E 21 00 00 20 20 00 00 01 00 20 00 A8 10' - '00 00 F6 46 00 00 10 10 00 00 01 00 20 00 68 04' - '00 00 9E 57 00 00 28 00 00 00 20 00 00 00 40 00' - '00 00 01 00 04 00 00 00 00 00 00 02 00 00 00 00' + '00 00 01 00 09 00 10 10 10 00 01 00 04 00 28 01' + '00 00 96 00 00 00 20 20 10 00 01 00 04 00 E8 02' + '00 00 BE 01 00 00 30 30 10 00 01 00 04 00 68 06' + '00 00 A6 04 00 00 10 10 00 00 01 00 08 00 68 05' + '00 00 0E 0B 00 00 20 20 00 00 01 00 08 00 A8 08' + '00 00 76 10 00 00 30 30 00 00 01 00 08 00 A8 0E' + '00 00 1E 19 00 00 10 10 00 00 01 00 20 00 68 04' + '00 00 C6 27 00 00 20 20 00 00 01 00 20 00 A8 10' + '00 00 2E 2C 00 00 30 30 00 00 01 00 20 00 A8 25' + '00 00 D6 3C 00 00 28 00 00 00 10 00 00 00 20 00' + '00 00 01 00 04 00 00 00 00 00 C0 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 80 00 00 00 00 80 00 00 80 80 00 00 00 00' '80 00 80 00 80 00 00 80 80 00 C0 C0 C0 00 80 80' '80 00 FF 00 00 00 00 FF 00 00 FF FF 00 00 00 00' 'FF 00 FF 00 FF 00 00 FF FF 00 FF FF FF 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 08 87 78 78 87 88 88 80 00 00 00 00 00 00' - '00 00 0F F7 F7 F7 77 77 78 80 00 00 00 00 00 00' - '00 00 87 FF FF 7F 77 7F 87 80 00 00 00 00 00 00' - '00 00 0F FF F7 FF F7 77 77 80 00 00 00 00 00 00' - '00 00 08 F7 FF FF 7F 77 7F 80 00 00 00 00 00 00' - '00 00 04 FF FF F8 77 F7 78 00 00 00 00 00 00 00' - '00 00 00 8F FF FF 7F FF 74 00 00 00 00 00 00 00' - '00 00 00 08 7F FF FF 78 80 00 00 00 00 00 00 00' - '00 00 00 00 08 88 78 80 00 00 00 00 00 00 00 00' - '00 00 00 00 00 08 80 00 00 00 00 00 00 00 00 00' - '48 77 87 87 88 77 78 87 88 78 78 80 00 00 00 00' - '7F FF FF FF FF 7F 7F F7 F7 7F 7F 78 00 00 00 00' - 'FF F7 FF 7F F7 F7 F7 7F 77 F7 77 77 00 00 00 08' - '7F BB 1B 71 B7 B7 B8 8B 8B 1B 1F 78 00 00 00 00' - 'FF F1 B1 BB 8B 8B 88 B8 B1 B1 B7 77 00 00 00 08' - '7F 89 8B 1B 81 B8 BB 8B 1B 1B 17 77 00 00 00 00' - 'FF 8B B1 B8 BB 8B 18 B8 B1 B8 B7 F8 00 00 00 08' - '7F 79 1B 1B 1B B1 BB 1B 1B 9B 97 77 00 00 00 00' - 'FF B2 B1 B1 B8 98 B1 89 B9 89 97 F7 00 00 00 00' - 'FF 89 1B 1B 1B 8B 1B B8 98 9B 27 77 00 00 00 08' - '7F 71 B1 B8 BB 8B 8B 1B 8B B1 97 F8 00 00 00 00' - 'FF B1 BB 8B 17 B1 8B 88 B1 BB 17 F7 00 00 00 08' - '7F 81 B8 98 8B B7 B8 8B 18 B1 B7 F8 00 00 00 00' - 'FF 7B 1B 7B 71 7B 7B 8B 8B 8B 1F 77 00 00 00 00' - 'FF B1 B8 B8 B7 B7 B7 B7 B8 B1 BF F7 00 00 00 04' - '7F 8B 8B 8B 7B 7B 7B 7B 8B 8B 17 F8 00 00 00 00' - 'FF F7 7F 7F 7F 7F 7F 7F 77 F7 7F F7 00 00 00 00' - '8F FF FF FF FF FF FF FF FF FF FF F8 00 00 00 00' - '08 88 88 88 88 88 88 88 88 88 88 80 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 00' - '00 FF FE 00 00 7F FE 00 00 7F FE 00 00 7F FE 00' - '00 7F FE 00 00 7F FE 00 00 7F FF 00 00 FF FF 00' - '00 FF FF 80 01 FF F0 00 00 0F E0 00 00 07 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 E0 00 00 07 28 00' - '00 00 10 00 00 00 20 00 00 00 01 00 04 00 00 00' - '00 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 87 77 78 80 00 00 00 00' + '8F FF 77 78 00 00 00 00 0F FF 7F 70 00 00 00 00' + '08 FF F7 80 00 00 00 00 00 08 80 00 00 00 00 87' + '77 77 77 77 78 00 00 F7 77 77 77 78 77 00 00 F8' + '33 88 83 33 87 00 00 F8 33 33 33 33 87 00 00 F3' + '33 33 33 33 87 00 00 F3 38 88 88 33 87 00 00 F8' + '38 88 88 83 87 00 00 F8 88 77 78 83 77 00 00 7F' + 'FF FF FF FF F7 00 00 08 88 88 88 88 80 00 E0 0F' + '88 88 E0 07 88 88 E0 07 88 88 E0 07 88 88 F0 0F' + '88 88 80 01 88 88 80 01 88 88 80 01 88 88 80 01' + '88 88 80 01 88 88 80 01 88 88 80 01 88 88 80 01' + '88 88 80 01 88 88 80 01 88 88 80 01 88 88 28 00' + '00 00 20 00 00 00 40 00 00 00 01 00 04 00 00 00' + '00 00 80 02 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 80' '00 00 80 80 00 00 00 00 80 00 80 00 80 00 00 80' '80 00 C0 C0 C0 00 80 80 80 00 FF 00 00 00 00 FF' '00 00 FF FF 00 00 00 00 FF 00 FF 00 FF 00 00 FF' 'FF 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' - '87 77 87 88 00 00 00 00 8F FF 77 78 00 00 00 00' - '8F F7 FF 70 00 00 00 00 08 FF 77 80 00 00 00 00' - '00 08 80 00 00 00 00 87 77 77 77 77 78 00 00 FF' - '77 BF 77 7B 77 00 00 FB 1B 8B 8B B9 77 00 08 7B' - '98 B1 B1 B1 B7 00 00 F8 1B 1B 1B 19 77 00 00 FB' - '1B 8B B7 B1 B7 00 00 78 B8 B7 8B 1B 87 00 04 FB' - '8B 8B 7B 8B 77 00 00 7F FF FF FF FF F7 00 00 08' - '88 88 88 88 80 00 E0 0F 00 00 E0 07 00 00 E0 07' - '00 00 E0 07 00 00 F0 0F 00 00 80 01 00 00 80 01' - '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' - '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' - '00 00 80 01 00 00 28 00 00 00 30 00 00 00 60 00' - '00 00 01 00 08 00 00 00 00 00 00 09 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 11 11 11 00 22 22 22 00 33 33 33 00 44 44' - '44 00 55 55 55 00 77 77 77 00 7F 7F 7F 00 99 33' - '00 00 99 33 33 00 CC 33 00 00 CC 33 33 00 99 66' - '00 00 99 66 33 00 CC 66 00 00 CC 66 33 00 FF 66' - '33 00 CC 66 66 00 FF 66 66 00 CC 99 33 00 FF 99' - '33 00 99 99 66 00 CC 99 66 00 FF 99 66 00 CC CC' - '66 00 FF CC 66 00 88 88 88 00 99 99 99 00 AA AA' - 'AA 00 BB BB BB 00 CC 99 99 00 FF 99 99 00 CC CC' - '99 00 FF CC 99 00 99 99 CC 00 CC CC CC 00 DD DD' - 'DD 00 FF CC CC 00 CC FF CC 00 FF FF CC 00 CC CC' - 'FF 00 FF CC FF 00 EE EE EE 00 FF FF FF 00 00 00' + '00 00 00 00 00 00 00 00 00 00 08 77 77 78 88 88' + '88 80 00 00 00 00 00 00 00 00 07 FF 77 77 77 77' + '87 80 00 00 00 00 00 00 00 00 0F FF FF FF 77 77' + '77 80 00 00 00 00 00 00 00 00 07 FF FF FF 77 77' + '77 80 00 00 00 00 00 00 00 00 08 FF FF FF 77 77' + '77 80 00 00 00 00 00 00 00 00 00 FF FF F7 7F F7' + '78 00 00 00 00 00 00 00 00 00 00 8F FF F7 7F FF' + '70 00 00 00 00 00 00 00 00 00 00 00 7F FF FF 78' + '00 00 00 00 00 00 00 00 00 00 00 00 00 87 88 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 08 80 00' + '00 00 00 00 00 00 00 00 08 77 77 77 77 77 77 88' + '88 88 88 80 00 00 00 00 7F FF FF FF FF FF 7F 77' + '77 77 77 78 00 00 00 00 FF FF 77 77 77 77 77 77' + '77 77 77 77 00 00 00 00 FF 73 33 88 87 77 77 88' + '83 33 37 77 00 00 00 00 FF 73 33 33 88 88 88 83' + '33 33 37 77 00 00 00 00 FF 73 33 33 33 88 33 33' + '33 33 37 77 00 00 00 00 FF 73 33 33 33 33 33 33' + '33 33 37 77 00 00 00 00 FF 83 33 33 33 33 33 33' + '33 33 37 77 00 00 00 00 FF 83 33 33 33 33 33 33' + '33 33 37 77 00 00 00 00 FF 83 33 33 33 33 33 33' + '33 33 37 F7 00 00 00 00 FF 83 33 33 33 38 33 33' + '33 33 37 F7 00 00 00 00 FF 83 33 33 88 88 88 83' + '33 33 37 F7 00 00 00 00 7F 83 33 88 88 87 88 88' + '83 33 37 F7 00 00 00 00 7F 83 38 88 77 77 77 78' + '88 33 37 F7 00 00 00 00 7F 83 38 88 77 77 77 78' + '88 33 37 F7 00 00 00 00 7F 83 88 87 77 77 77 77' + '88 83 37 F7 00 00 00 00 7F FF FF FF FF FF FF FF' + 'FF FF 7F F7 00 00 00 00 8F FF FF FF FF FF FF FF' + 'FF FF FF F8 00 00 00 00 08 88 88 88 88 88 88 88' + '88 88 88 80 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF 00 00 FF FE 00 00 7F FE 00' + '00 7F FE 00 00 7F FE 00 00 7F FE 00 00 7F FE 00' + '00 7F FF 00 00 FF FF 00 00 FF FF 80 01 FF F0 00' + '00 0F E0 00 00 07 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 E0 00 00 07 28 00 00 00 30 00 00 00 60 00' + '00 00 01 00 04 00 00 00 00 00 00 06 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 80 00 00 80 00 00 00 80 80 00 80 00' + '00 00 80 00 80 00 80 80 00 00 C0 C0 C0 00 80 80' + '80 00 00 00 FF 00 00 FF 00 00 00 FF FF 00 FF 00' + '00 00 FF 00 FF 00 FF FF 00 00 FF FF FF 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 87 77 77' + '77 77 78 88 88 88 88 00 00 00 00 00 00 00 00 00' + '00 00 00 00 08 FF FF FF 77 77 77 77 77 88 87 00' + '00 00 00 00 00 00 00 00 00 00 00 00 08 FF FF F7' + '77 77 77 77 77 78 87 00 00 00 00 00 00 00 00 00' + '00 00 00 00 08 FF FF FF FF FF 77 77 77 77 77 80' + '00 00 00 00 00 00 00 00 00 00 00 00 08 FF FF FF' + 'FF FF FF 77 77 77 77 00 00 00 00 00 00 00 00 00' + '00 00 00 00 08 FF FF FF F7 77 77 77 77 77 77 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF' + 'FF FF FF F7 77 77 78 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 8F FF FF FF 77 7F FF 77 77 78 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 07 FF FF' + 'FF 78 87 FF 77 77 80 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 7F FF FF F7 FF FF 77 78 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 07 FF' + 'FF FF FF FF F7 80 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 87 FF FF FF FF 80 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '08 87 78 80 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 08 80 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 87 80 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 08 77 77 77 77 77 77 77 77 77 77 77 77 77 78' + '88 78 00 00 00 00 00 00 00 8F FF FF FF FF FF FF' + 'FF FF FF FF F7 77 77 77 77 77 70 00 00 00 00 00' + '00 7F FF FF FF FF FF FF FF F7 77 77 77 77 77 77' + '77 77 77 00 00 00 00 00 00 FF FF FF FF FF FF FF' + 'FF FF FF FF F7 77 77 77 77 77 77 00 00 00 00 00' + '00 FF F7 87 77 77 77 77 77 77 77 77 77 77 77 78' + '87 F7 77 00 00 00 00 00 00 FF F7 66 66 66 68 88' + '88 88 88 88 66 66 66 66 66 F7 77 00 00 00 00 00' + '00 FF F7 66 66 66 68 88 88 88 88 88 86 66 66 66' + '66 F7 77 00 00 00 00 00 00 FF F7 66 66 66 66 68' + '88 88 88 86 66 66 66 66 66 F7 77 00 00 00 00 00' + '00 FF F7 66 66 66 66 66 66 66 66 66 66 66 66 66' + '66 F7 77 00 00 00 00 00 00 FF F7 66 66 66 66 66' + '66 66 66 66 66 66 66 66 66 F7 77 00 00 00 00 00' + '00 FF F7 66 66 66 66 66 66 66 66 66 66 66 66 66' + '46 F7 77 00 00 00 00 00 00 FF F7 46 66 66 66 66' + '66 66 66 66 66 66 66 66 46 F7 77 00 00 00 00 00' + '00 FF F7 46 66 66 66 66 66 66 66 66 66 66 66 64' + '46 F7 77 00 00 00 00 00 00 FF F8 44 66 66 66 66' + '66 66 66 66 66 66 66 44 46 F7 77 00 00 00 00 00' + '00 FF F8 44 46 66 66 66 66 66 66 66 66 66 66 44' + '46 F7 77 00 00 00 00 00 00 FF F8 44 66 66 66 66' + '68 88 86 66 66 66 66 66 46 F7 F7 00 00 00 00 00' + '00 FF F8 46 66 66 66 88 88 88 88 88 86 66 66 66' + '66 F7 F7 00 00 00 00 00 00 FF F8 66 66 66 88 88' + '88 88 88 88 88 66 66 66 66 F7 F7 00 00 00 00 00' + '00 FF F8 66 66 68 88 88 88 88 88 88 88 86 66 66' + '66 F7 F7 00 00 00 00 00 00 FF F8 66 66 88 88 88' + '88 77 78 88 88 88 66 66 68 FF F7 00 00 00 00 00' + '00 FF F8 66 68 88 88 87 77 77 77 78 88 88 86 66' + '68 FF F7 00 00 00 00 00 00 FF F8 66 68 88 88 77' + '77 77 77 77 88 88 88 66 66 FF F7 00 00 00 00 00' + '00 FF F8 66 68 88 87 77 77 77 77 77 78 88 86 66' + '66 FF F7 00 00 00 00 00 00 FF F8 68 88 88 87 77' + '77 77 77 77 78 88 88 88 68 FF F7 00 00 00 00 00' + '00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF F7 00 00 00 00 00 00 7F FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF F8 00 00 00 00 00' + '00 8F FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF 70 00 00 00 00 00 00 00 88 88 88 88 88 88' + '88 88 88 88 88 88 88 88 88 88 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF FF FF FF 00 00 FF F8 00 00 1F FF 00 00 FF F0' + '00 00 0F FF 00 00 FF E0 00 00 0F FF 00 00 FF E0' + '00 00 0F FF 00 00 FF E0 00 00 07 FF 00 00 FF E0' + '00 00 07 FF 00 00 FF E0 00 00 07 FF 00 00 FF E0' + '00 00 0F FF 00 00 FF F0 00 00 0F FF 00 00 FF F0' + '00 00 0F FF 00 00 FF F0 00 00 1F FF 00 00 FF F8' + '00 00 3F FF 00 00 FF FC 00 00 3F FF 00 00 FF FE' + '00 00 7F FF 00 00 FF FF 00 01 FF FF 00 00 FE 00' + '00 00 00 7F 00 00 F8 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 F0 00' + '00 00 00 0F 00 00 F0 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 FE 00 00 00 00 7F 00 00 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 08 00 00 00' + '00 00 40 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 11 00 00 00 00 00' + '11 00 11 11 11 00 22 22 22 00 33 33 33 00 44 44' + '44 00 55 55 55 00 66 66 66 00 77 77 77 00 7F 7F' + '7F 00 99 33 00 00 CC 33 00 00 99 66 00 00 CC 66' + '00 00 CC 66 33 00 CC 66 66 00 CC 99 33 00 99 99' + '66 00 CC 99 66 00 FF 99 66 00 FF CC 66 00 88 88' + '88 00 99 99 99 00 AA AA AA 00 BB BB BB 00 CC 99' + '99 00 CC CC 99 00 FF CC 99 00 99 CC CC 00 CC CC' + 'CC 00 DD DD DD 00 FF CC CC 00 CC CC FF 00 CC FF' + 'FF 00 EE EE EE 00 FF FF FF 00 00 00 00 00 DD DD' + 'DD 00 FF CC CC 00 FF FF CC 00 CC CC FF 00 FF CC' + 'FF 00 CC FF FF 00 EE EE EE 00 FF FF FF 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 17' + '95 00 00 00 38 00 A8 44 F9 00 13 00 00 00 18 0A' + '38 00 00 00 38 00 98 69 38 00 98 17 95 00 00 00' + '00 00 E0 19 95 00 F0 88 FA 00 70 38 F5 00 FF FF' + 'FF 00 A8 44 F9 00 70 7D F5 00 3A 8A F5 00 86 00' + '00 00 86 00 00 00 08 00 00 00 B0 18 95 00 00 00' + '00 00 CB 44 F9 00 08 91 07 00 CD 8B F5 00 78 13' + '05 00 37 90 F5 00 00 00 00 00 3E 8A F5 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 10 00 00 00 00 00 00 00 66 00' + '68 00 00 EC FD 00 1A 02 00 00 4C 16 95 00 10 91' + '07 00 FC 15 95 00 FF FF FF 00 B4 1A 95 00 45 00' + '00 00 28 02 00 00 FF FF FF 00 E2 D8 F5 00 7D 9B' + 'F5 00 94 B6 01 00 00 00 05 00 F4 17 95 00 80 00' + '10 00 B4 1A 95 00 F0 88 FA 00 88 1C F5 00 FF FF' + 'FF 00 37 90 F5 00 00 00 00 00 3E 8A F5 00 9B B2' + 'E7 00 B7 00 00 00 02 00 00 00 A4 1A 95 00 01 00' + '00 00 18 00 00 00 00 00 00 00 10 19 95 00 42 00' + '00 00 00 00 00 00 F4 18 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 0C 00 00 00 02 00 00 00 01 01' + 'F5 00 00 EC FD 00 66 00 00 00 00 00 00 00 03 00' + '00 00 6E 00 1A 00 10 91 07 00 00 00 00 00 10 91' + '07 00 05 00 00 00 BE B3 E7 00 4C 19 95 00 A3 B4' + 'E7 00 28 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 02 00 00 00 80 00 00 00 00 00 00 00 8C 1A' + '95 00 7F E9 4B 00 D0 60 38 00 00 00 00 00 00 00' + '00 00 80 1A 95 00 02 00 00 00 80 00 00 00 00 00' + '00 00 C0 27 95 00 C4 F5 AF 00 02 00 00 00 45 3A' + '5C 00 79 67 77 00 6E 5C 68 00 6D 65 5C 00 76 73' + '5C 00 69 6E 65 00 64 6C 6C 00 5C 73 68 00 6C 6C' + '33 00 5C 6D 79 00 6F 6D 70 00 74 65 72 00 69 63' + '6F 00 1F 3B D4 00 13 00 00 00 98 00 00 00 4F 3B' + 'D4 00 E0 19 95 00 33 3B D4 00 64 C5 F5 00 A9 F1' + 'E7 00 28 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 1A 95 00 98 69 38 00 86 00 00 00 00 00' + '00 00 C9 F1 E7 00 86 00 00 00 A4 1A 95 00 08 00' + '00 00 00 00 00 00 86 00 00 00 86 00 00 00 08 00' + '00 00 F4 19 95 00 33 3B D4 00 B4 1A 95 00 09 48' + 'E9 00 B8 10 E9 00 FF FF FF 00 C9 F1 E7 00 16 EA' + '4B 00 28 01 00 00 98 69 38 00 86 00 00 00 58 1A' + '95 00 00 00 00 00 00 00 00 00 A2 64 64 64 64 64' + '64 A2 00 00 00 00 00 00 00 00 07 1E 19 18 18 17' + '16 05 00 00 00 00 00 00 00 00 09 24 23 23 1F 1E' + '19 06 00 00 00 00 00 00 00 00 05 23 24 1F 1F 23' + '19 04 00 00 00 00 00 00 00 00 00 07 1F 23 23 19' + '05 00 00 00 00 00 00 00 A0 94 94 00 03 09 08 03' + '00 64 64 A0 00 00 00 B2 17 1E 1E 1E 19 1E 19 19' + '19 19 19 D8 00 00 00 03 23 1C 1C 1C 1C 1C 1C 1B' + '1A 13 1B 19 64 00 00 04 23 13 0E 0F C4 11 11 0F' + '0F 0E 13 19 64 00 00 04 23 13 0E 0F 0F 0F 0F 0F' + '0F 0B 13 19 64 00 00 03 23 0F 0B 0F 0F 0F 0F 0F' + '0F 0B 13 19 64 00 00 03 23 10 0F C4 11 11 11 11' + '0F 0E 13 19 64 00 00 03 1F 13 0F 11 13 14 13 13' + '11 0F 13 1E 64 00 00 03 1F 13 11 13 14 15 15 14' + '13 0F 1A 1E 94 00 00 64 1E 24 23 23 23 23 23 23' + '23 23 24 18 00 00 00 00 04 06 06 06 06 06 06 06' + '06 06 06 03 00 00 F0 0F 04 06 F0 0F 04 06 F0 0F' + '04 06 F0 0F 04 06 F8 1F 04 06 C0 03 04 06 80 01' + '04 06 80 01 04 06 80 01 04 06 80 01 04 06 80 01' + '04 06 80 01 04 06 80 01 04 06 80 01 04 06 80 01' + '04 06 C0 03 04 06 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 08 00 00 00 00 00 80 04 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 11 00 00 00 00 11 00 11 11 11 00 22 22' + '22 00 33 33 33 00 44 44 44 00 55 55 55 00 66 66' + '66 00 77 77 77 00 7F 7F 7F 00 99 33 00 00 99 33' + '33 00 CC 33 00 00 99 66 00 00 99 66 33 00 CC 66' + '00 00 CC 66 33 00 FF 66 33 00 CC 66 66 00 FF 66' + '66 00 CC 99 33 00 FF 99 33 00 99 99 66 00 CC 99' + '66 00 FF 99 66 00 CC CC 66 00 FF CC 66 00 88 88' + '88 00 99 99 99 00 AA AA AA 00 BB BB BB 00 CC 99' + '99 00 99 CC 99 00 CC CC 99 00 FF CC 99 00 99 99' + 'CC 00 CC CC CC 00 DD DD DD 00 FF CC CC 00 FF FF' + 'CC 00 CC CC FF 00 FF CC FF 00 CC FF FF 00 EE EE' + 'EE 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' @@ -5837,193 +6027,1271 @@ END '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 C0 17 95 00 00 00 38 00 A8 44' - 'F9 77 13 00 00 00 18 0A 38 00 00 00 38 00 98 69' + 'F9 00 13 00 00 00 18 0A 38 00 00 00 38 00 98 69' '38 00 98 17 95 00 00 00 00 00 E0 19 95 00 F0 88' - 'FA 77 70 38 F5 77 FF FF FF FF A8 44 F9 77 70 7D' - 'F5 77 3A 8A F5 77 86 00 00 00 86 00 00 00 08 00' - '00 00 B0 18 95 00 00 00 00 00 CB 44 F9 77 08 91' - '07 00 CD 8B F5 77 78 13 05 00 37 90 F5 77 00 00' - '00 00 3E 8A F5 77 00 00 00 00 00 00 00 00 00 00' + 'FA 00 70 38 F5 00 FF FF FF 00 A8 44 F9 00 70 7D' + 'F5 00 3A 8A F5 00 86 00 00 00 86 00 00 00 08 00' + '00 00 B0 18 95 00 00 00 00 00 CB 44 F9 00 08 91' + '07 00 CD 8B F5 00 78 13 05 00 37 90 F5 00 00 00' + '00 00 3E 8A F5 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00' - '00 00 00 00 00 00 66 00 68 00 00 EC FD 7F 1A 02' + '00 00 00 00 00 00 66 00 68 00 00 EC FD 00 1A 02' '00 00 4C 16 95 00 10 91 07 00 FC 15 95 00 FF FF' - 'FF FF B4 1A 95 00 45 00 00 00 28 02 00 00 FF FF' - 'FF FF E2 D8 F5 77 7D 9B F5 77 94 B6 01 00 00 00' - '05 00 F4 17 95 00 80 00 10 C0 B4 1A 95 00 F0 88' - 'FA 77 88 1C F5 77 FF FF FF FF 37 90 F5 77 00 00' - '00 00 3E 8A F5 77 9B B2 E7 77 B7 00 00 00 02 00' + 'FF 00 B4 1A 95 00 45 00 00 00 28 02 00 00 FF FF' + 'FF 00 E2 D8 F5 00 7D 9B F5 00 94 B6 01 00 00 00' + '05 00 F4 17 95 00 80 00 10 00 B4 1A 95 00 F0 88' + 'FA 00 88 1C F5 00 FF FF FF 00 37 90 F5 00 00 00' + '00 00 3E 8A F5 00 9B B2 E7 00 B7 00 00 00 02 00' '00 00 A4 1A 95 00 01 00 00 00 18 00 00 00 00 00' '00 00 10 19 95 00 42 00 00 00 00 00 00 00 F4 18' '95 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00' - '00 00 02 00 00 00 01 01 F5 77 00 EC FD 7F 66 00' - '00 00 00 00 00 00 03 00 00 00 6E 00 1A 02 10 91' + '00 00 02 00 00 00 01 01 F5 00 00 EC FD 00 66 00' + '00 00 00 00 00 00 03 00 00 00 6E 00 1A 00 10 91' '07 00 00 00 00 00 10 91 07 00 05 00 00 00 BE B3' - 'E7 77 4C 19 95 00 A3 B4 E7 77 28 01 00 00 00 00' - '00 C0 00 00 00 00 00 00 00 00 02 00 00 00 80 00' + 'E7 00 4C 19 95 00 A3 B4 E7 00 28 01 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 02 00 00 00 80 00' '00 00 00 00 00 00 8C 1A 95 00 7F E9 4B 00 D0 60' - '38 00 00 00 00 C0 00 00 00 00 80 1A 95 00 02 00' + '38 00 00 00 00 00 00 00 00 00 80 1A 95 00 02 00' '00 00 80 00 00 00 00 00 00 00 C0 27 95 00 C4 F5' - 'AF 00 02 00 00 00 45 3A 5C 63 79 67 77 69 6E 5C' - '68 6F 6D 65 5C 63 76 73 5C 77 69 6E 65 5C 64 6C' - '6C 73 5C 73 68 65 6C 6C 33 32 5C 6D 79 63 6F 6D' - '70 75 74 65 72 2E 69 63 6F 00 1F 3B D4 77 13 00' - '00 00 98 00 00 00 4F 3B D4 77 E0 19 95 00 33 3B' - 'D4 77 64 C5 F5 77 A9 F1 E7 77 28 01 00 00 00 00' + 'AF 00 02 00 00 00 45 3A 5C 00 79 67 77 00 6E 5C' + '68 00 6D 65 5C 00 76 73 5C 00 69 6E 65 00 64 6C' + '6C 00 5C 73 68 00 6C 6C 33 00 5C 6D 79 00 6F 6D' + '70 00 74 65 72 00 69 63 6F 00 1F 3B D4 00 13 00' + '00 00 98 00 00 00 4F 3B D4 00 E0 19 95 00 33 3B' + 'D4 00 64 C5 F5 00 A9 F1 E7 00 28 01 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 1A 95 00 98 69' - '38 00 86 00 00 00 00 00 00 00 C9 F1 E7 77 86 00' + '38 00 86 00 00 00 00 00 00 00 C9 F1 E7 00 86 00' '00 00 A4 1A 95 00 08 00 00 00 00 00 00 00 86 00' '00 00 86 00 00 00 08 00 00 00 F4 19 95 00 33 3B' - 'D4 77 B4 1A 95 00 09 48 E9 77 B8 10 E9 77 FF FF' - 'FF FF C9 F1 E7 77 16 EA 4B 00 28 01 00 00 98 69' + 'D4 00 B4 1A 95 00 09 48 E9 00 B8 10 E9 00 FF FF' + 'FF 00 C9 F1 E7 00 16 EA 4B 00 28 01 00 00 98 69' '38 00 86 00 00 00 58 1A 95 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 2C 2C 2C 2C 2C' - '2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C' - '2C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 2C 2C 2C 2C 2C 2C' - '2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C' - '2C 2C 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 2C 2C 2C 2C 2C 2C 2C' - '2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C' - '2C 2C 2C 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 2C 2C 02 1B 1D 1C 1C' - '1C 1C 1C 1C 1B 1C 1B 1B 1B 1B 1B 1A 1A 1A 1A 05' - '2C 2C 2C 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 2C 2C 05 2B 2B 2A 2A' - '2A 24 24 24 24 23 23 23 23 1D 1D 1D 1B 1B 1B 1D' - '02 2C 2C 2C 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 2C 2C 2C 06 2B 2B 2A 2A' - '24 24 24 23 23 23 23 23 1D 1D 1D 1C 1C 1B 1B 1C' - '03 2C 2C 2C 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 2C 2C 2C 1B 2B 2B 2B 2A' - '2A 2A 2A 2A 2A 24 24 23 23 23 23 23 1C 1C 1C 1D' - '04 2C 2C 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 2C 2C 1A 2B 2B 2B 2B' - '2B 2B 2B 2B 2A 2A 2A 2A 24 24 23 23 1D 1B 1D 1D' - '04 2C 2C 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 2C 2C 05 2B 2B 2B 2A' - '2A 2A 24 24 24 24 24 23 23 23 1D 23 1C 1D 1C 1D' - '02 2C 2C 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 2C 2C 03 2A 2B 2B 2B' - '2B 2B 2B 2A 2B 2A 2A 24 24 24 24 23 1D 1D 23 1B' - '2C 2C 2C 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 2C 2C 2C 1B 2B 2B 2B' - '2B 2B 2B 2B 24 23 1D 2A 24 2A 24 23 23 1D 1D 04' - '2C 2C 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 2C 2C 01 24 2B 2B' - '2B 2B 2B 2B 1C 1B 1B 23 2A 24 24 23 23 24 1A 2C' - '2C 2C 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 2C 2C 03 24 2B' - '2B 2B 2B 2B 2A 24 24 2A 2A 2A 24 24 24 1A 01 2C' - '2C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 2C 2C 2C 03 23' - '2B 2B 2B 2B 2B 2B 2B 2B 2A 2A 2A 23 06 2C 2C 2C' - '2C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 2C 2C 2C 2C' - '05 23 2B 2B 2B 2B 2B 2B 2B 24 1C 03 2C 2C 2C 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C' - '2C 01 03 06 1A 1C 1C 06 05 03 2C 2C 2C 2C 2C 2C' - '2C 2C 2C 2C 2C 2C 2C 00 00 00 00 00 00 00 00 00' - '00 00 00 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C' - '2C 2C 2C 2C 2C 1A 04 2C 2C 2C 2C 2C 2C 2C 2C 2C' - '2C 2C 2C 2C 2C 2C 2C 2C 2C 00 00 00 00 00 00 00' - '00 00 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C' - '2C 2C 2C 2C 05 1D 1A 01 2C 2C 2C 2C 2C 2C 2C 2C' - '2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 00 00 00 00 00 00' - '00 00 2C 2C 2C 05 1B 1C 1C 1C 1C 1B 1C 1C 1B 1C' - '1C 1C 1C 22 1D 24 1D 1D 1B 1B 1C 1C 1B 1C 1B 1B' - '1C 1B 1B 1B 1B 1B 02 2C 2C 2C 2C 00 00 00 00 00' - '00 2C 2C 2C 06 2B 2B 2B 2B 2B 2B 2B 2B 2A 2B 2A' - '2A 2A 2A 27 29 24 2A 24 2A 24 24 24 24 24 24 24' - '23 24 24 23 23 24 23 03 2C 2C 2C 00 00 00 00 00' - '00 2C 2C 01 24 2B 2B 2A 2B 2A 2A 2A 2A 2A 2A 24' - '2A 2A 24 28 24 24 24 24 24 23 24 23 23 23 23 23' - '23 23 1D 23 23 1D 24 1C 2C 2C 2C 00 00 00 00 00' - '00 2C 2C 03 2B 2B 2B 2A 2A 2B 27 2B 24 2B 24 2B' - '24 2A 2A 27 2A 24 24 24 24 2A 25 26 25 23 2A 23' - '24 23 24 23 23 23 23 1C 2C 2C 2C 00 00 00 00 00' - '00 2C 2C 03 2A 2B 2B 24 16 17 1E 16 21 1E 21 1E' - '21 21 21 1E 21 20 21 20 21 1F 20 1F 20 21 16 20' - '17 1E 16 1F 2A 1D 23 1C 2C 2C 2C 00 00 00 00 00' - '00 2C 2C 04 2A 2B 2B 1E 0E 0C 0F 0F 0F 13 0F 14' - '13 0F 16 14 16 10 16 14 16 13 10 13 0F 0F 0F 0E' - '0D 0E 0E 0D 2A 23 23 1C 2C 2C 2C 00 00 00 00 00' - '00 2C 2C 03 2A 2B 2B 1E 0F 0F 0F 0F 13 0F 13 16' - '0F 16 14 16 14 16 14 11 14 13 11 13 0F 13 0F 0F' - '0E 0F 08 13 24 23 23 1D 2C 2C 2C 00 00 00 00 00' - '00 2C 2C 03 2A 2B 2B 1E 0C 0F 0E 0F 0F 13 0F 0F' - '16 0F 16 0F 16 13 16 13 11 0F 13 0F 0F 0F 0D 0F' - '0F 0E 0B 0F 2A 23 24 1C 2C 2C 2C 00 00 00 00 00' - '00 2C 2C 03 2A 2B 2B 20 0A 0F 0F 0D 0F 0F 0F 13' - '0F 13 0F 13 0F 16 0F 0F 13 13 0F 13 0F 0F 0E 0F' - '0C 0B 0C 0F 24 23 23 1C 2C 2C 2C 00 00 00 00 00' - '00 2C 2C 03 2B 2B 2B 16 0C 0A 0D 0E 0F 0F 0F 0F' - '13 0F 13 0F 13 0F 13 0F 0F 0F 0F 0F 0D 0F 0F 0E' - '0F 0C 0A 0D 2A 23 24 1C 2C 2C 2C 00 00 00 00 00' - '00 2C 2C 03 2A 2B 2B 20 0A 0D 0A 0F 0F 0C 0F 0F' - '0F 0F 0F 13 0F 0F 0F 13 0F 0F 0F 0E 0F 0F 0C 0B' - '0C 0A 08 0F 2A 23 24 1C 2C 2C 2C 00 00 00 00 00' - '00 2C 2C 03 2A 2B 2B 1E 08 0E 0C 0F 0A 0F 0F 0E' - '0D 0F 0E 0F 0F 0E 0F 0D 0E 0D 0F 0D 0A 0E 0B 0C' - '0B 0C 08 0F 2A 23 24 1C 2C 2C 2C 00 00 00 00 00' - '00 2C 2C 03 2A 2B 2B 1E 08 0E 0B 08 0F 08 0E 0D' - '0E 0F 0F 0F 0F 13 0F 0F 0F 0F 0F 0E 0C 0B 0C 0F' - '08 08 0A 0D 24 24 24 1C 2C 2C 2C 00 00 00 00 00' - '00 2C 2C 03 2A 2B 2B 16 08 08 0C 0A 0C 0F 0D 0F' - '0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0C 0A 08' - '0E 08 08 0F 2A 23 24 1C 2C 2C 2C 00 00 00 00 00' - '00 2C 2C 02 2A 2B 2B 1E 08 08 0A 0C 0F 0F 0F 0F' - '0F 13 0F 0F 13 0F 11 13 0F 13 0F 0F 13 0F 0F 0C' - '08 0A 08 0F 24 24 24 1C 2C 2C 2C 00 00 00 00 00' - '00 2C 2C 03 2A 2B 2B 16 08 0A 0C 0F 0F 0F 13 0F' - '13 0F 13 16 0F 13 13 0F 13 0F 13 0F 0F 0F 0F 13' - '0E 08 08 0F 2A 24 24 1C 2C 2C 2C 00 00 00 00 00' - '00 2C 2C 02 2A 2B 2B 1E 08 0D 0F 0F 0F 13 0F 0F' - '16 10 16 0F 13 17 0F 16 10 16 0F 13 0F 13 0F 0F' - '0F 0D 0A 0D 2A 24 24 1C 2C 2C 2C 00 00 00 00 00' - '00 2C 2C 03 2A 2B 2B 15 0A 0F 0F 0F 13 0F 17 13' - '0F 16 13 17 16 13 16 14 16 0F 17 13 11 0F 13 0F' - '0F 0F 0D 0F 2A 24 2A 1C 2C 2C 2C 00 00 00 00 00' - '00 2C 2C 02 24 2B 2B 1E 0E 0F 0F 13 0F 16 13 0F' - '17 13 17 16 14 16 14 16 13 17 13 0F 13 16 0F 0F' - '0F 0F 0E 0F 2A 24 24 1C 2C 2C 2C 00 00 00 00 00' - '00 2C 2C 03 2A 2B 2B 15 0F 0F 13 10 16 0F 16 14' - '16 16 13 17 16 17 16 17 16 13 17 16 0F 14 13 0F' - '13 0F 0F 13 2A 24 2A 1B 2C 2C 2C 00 00 00 00 00' - '00 2C 2C 02 24 2B 2B 1E 0E 13 0F 16 0F 13 17 16' - '13 17 19 16 17 19 16 16 17 17 16 14 16 13 12 13' - '0F 13 0F 11 2A 2A 2B 1C 2C 2C 2C 00 00 00 00 00' - '00 2C 2C 03 2A 2B 2B 11 0D 0F 13 0F 16 14 13 17' - '16 16 17 17 18 17 19 17 18 16 16 17 13 11 13 13' - '11 0F 0E 0F 2B 2A 2B 1B 2C 2C 2C 00 00 00 00 00' - '00 2C 2C 02 24 2B 2B 15 0A 13 11 13 10 16 17 16' - '17 19 17 18 1F 19 17 18 17 19 17 13 17 13 17 0F' - '0F 13 0F 0D 2A 2B 2B 1C 2C 2C 2C 00 00 00 00 00' - '00 2C 2C 03 2A 2B 2B 15 09 0F 13 16 16 13 16 16' - '16 17 18 17 18 1F 18 17 16 16 17 16 16 16 13 16' - '0F 0F 0D 0F 2B 2B 2B 1C 2C 2C 2C 00 00 00 00 00' - '00 2C 2C 02 24 2B 2B 2A 2A 2A 2A 24 2A 2A 2A 2A' - '2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 24 2A 2A 2A 24' - '2A 2A 24 2A 2B 2B 2B 1C 2C 2C 2C 00 00 00 00 00' - '00 2C 2C 2C 23 2B 2B 2B 2B 2B 2B 2B 2B 2B 2B 2B' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 A2 A2 A2 A0 A0' + 'A0 B2 94 B2 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 D8 1F 1E 1E 1E 1E 1D 1D 1D' + '1D 1C 0A 1C 05 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 03 26 2D 2C 26 26 25 25 25 1F' + '1F 1F 1D 1E 0A 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 04 2C 2D 2C 2C 2C 2C 26 26 25' + '25 25 1E 1E 1C 94 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 03 25 2D 2D 2D 2C 2C 2C 26 26' + '25 25 1E 1F 0A 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 1D 2D 2D 2D 2D 2C 26 26 26' + '26 25 1F 25 07 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 04 26 2D 2D 2D 2C 1E 1F 2C' + '26 26 25 1D 03 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 06 2C 2D 2D 2D 26 26 2C' + '2C 2C 1E 04 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 05 1F 2D 2D 2D 2D 2D' + '26 1C 04 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 B2 05 08 1E 1C 07' + '04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 94 09 06 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 04 1D 1E 1E 1E 1E 1E 1E 1E 1E 1E 25 1F 1E' + '1D 1D 1D 1D 1D 1D 1D 1D 09 03 00 00 00 00 00 00' + '00 94 1F 2D 2D 2D 2D 2D 2D 2D 2C 2C 2C 26 26 26' + '26 26 26 26 26 26 25 25 26 0A 00 00 00 00 00 00' + '00 04 2C 2D 2C 26 26 26 26 26 26 26 26 26 26 26' + '26 26 25 25 25 25 25 25 25 1E 94 00 00 00 00 00' + '00 04 2C 2D 20 11 11 15 15 18 18 18 18 18 18 18' + '18 18 15 C4 11 11 11 1F 25 1E 94 00 00 00 00 00' + '00 04 2C 2D 20 10 11 11 C4 15 15 15 15 15 15 15' + '15 C4 11 11 11 11 11 1F 26 1E 94 00 00 00 00 00' + '00 04 2C 2D 20 10 11 11 11 C4 C4 15 15 15 15 C4' + 'C4 11 11 11 11 10 10 1F 26 1E 94 00 00 00 00 00' + '00 04 2C 2D 20 0D 11 11 11 11 11 11 11 11 11 11' + '11 11 11 11 11 10 10 1F 26 1E 94 00 00 00 00 00' + '00 04 2C 2D 20 0B 10 11 11 11 11 11 11 11 11 11' + '11 11 11 10 10 0B 0B 1F 26 1E 94 00 00 00 00 00' + '00 04 2C 2D 18 0B 0B 10 10 11 11 11 11 11 11 11' + '11 11 10 0D 0B 0B 0B 1F 26 1E B2 00 00 00 00 00' + '00 04 2C 2D 18 0B 0B 10 11 11 11 11 11 11 11 11' + '11 11 11 11 0B 0B 0B 1F 26 1E B2 00 00 00 00 00' + '00 04 26 2D 18 0B 11 11 11 C4 C4 15 15 15 15 15' + 'C4 C4 11 11 11 10 0B 25 2C 1E A0 00 00 00 00 00' + '00 04 26 2D 18 10 11 11 C4 15 15 15 18 18 18 15' + '15 15 C4 11 11 11 10 1F 2C 1E A2 00 00 00 00 00' + '00 04 26 2D 18 11 11 C4 15 15 18 18 18 18 18 18' + '18 15 15 C4 11 11 11 25 2C 1E A2 00 00 00 00 00' + '00 04 26 2D 18 11 C4 15 15 18 18 19 19 19 19 19' + '18 18 15 15 C4 11 11 25 2D 1E 00 00 00 00 00 00' + '00 04 26 2D 18 11 15 15 18 18 19 19 19 19 19 19' + '19 18 18 15 C4 11 11 27 2D 1E 00 00 00 00 00 00' + '00 04 26 2D 18 11 18 18 18 18 18 19 1B 1B 1B 19' + '18 18 18 18 18 11 0F 27 2D 1E 00 00 00 00 00 00' + '00 03 26 2D 2C 26 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C' + '2C 2C 2C 2C 2C 26 26 2D 2D 1E 00 00 00 00 00 00' + '00 00 1C 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D' + '2D 2D 2D 2D 2D 2D 2D 2D 2C 07 00 00 00 00 00 00' + '00 00 03 07 09 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8' + 'D8 D8 D8 D8 D8 D8 D8 D8 06 A0 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF FF FF 00 00 FF FF 00 00 FF FE 00 00 FF FE 00' + '00 FF FF 00 00 FF FF 00 00 FF FF 00 00 FF FF 80' + '01 FF FF C0 03 FF FF E0 07 FF F0 00 00 0F E0 00' + '00 07 C0 00 00 07 C0 00 00 07 C0 00 00 07 C0 00' + '00 07 C0 00 00 07 C0 00 00 07 C0 00 00 07 C0 00' + '00 07 C0 00 00 07 C0 00 00 07 C0 00 00 07 C0 00' + '00 07 C0 00 00 07 C0 00 00 07 C0 00 00 07 C0 00' + '00 07 C0 00 00 07 E0 00 00 07 F0 00 00 0F 28 00' + '00 00 30 00 00 00 60 00 00 00 01 00 08 00 00 00' + '00 00 80 0A 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 11 11 11 00 22 22' + '22 00 33 33 33 00 44 44 44 00 55 55 55 00 77 77' + '77 00 7F 7F 7F 00 99 33 00 00 99 33 33 00 CC 33' + '00 00 CC 33 33 00 99 66 00 00 99 66 33 00 CC 66' + '00 00 CC 66 33 00 FF 66 33 00 CC 66 66 00 FF 66' + '66 00 CC 99 33 00 FF 99 33 00 99 99 66 00 CC 99' + '66 00 FF 99 66 00 CC CC 66 00 FF CC 66 00 88 88' + '88 00 99 99 99 00 AA AA AA 00 BB BB BB 00 CC 99' + '99 00 FF 99 99 00 CC CC 99 00 FF CC 99 00 99 99' + 'CC 00 CC CC CC 00 DD DD DD 00 FF CC CC 00 CC FF' + 'CC 00 FF FF CC 00 CC CC FF 00 FF CC FF 00 EE EE' + 'EE 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 17' + '95 00 00 00 38 00 A8 44 F9 00 13 00 00 00 18 0A' + '38 00 00 00 38 00 98 69 38 00 98 17 95 00 00 00' + '00 00 E0 19 95 00 F0 88 FA 00 70 38 F5 00 FF FF' + 'FF 00 A8 44 F9 00 70 7D F5 00 3A 8A F5 00 86 00' + '00 00 86 00 00 00 08 00 00 00 B0 18 95 00 00 00' + '00 00 CB 44 F9 00 08 91 07 00 CD 8B F5 00 78 13' + '05 00 37 90 F5 00 00 00 00 00 3E 8A F5 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 10 00 00 00 00 00 00 00 66 00' + '68 00 00 EC FD 00 1A 02 00 00 4C 16 95 00 10 91' + '07 00 FC 15 95 00 FF FF FF 00 B4 1A 95 00 45 00' + '00 00 28 02 00 00 FF FF FF 00 E2 D8 F5 00 7D 9B' + 'F5 00 94 B6 01 00 00 00 05 00 F4 17 95 00 80 00' + '10 00 B4 1A 95 00 F0 88 FA 00 88 1C F5 00 FF FF' + 'FF 00 37 90 F5 00 00 00 00 00 3E 8A F5 00 9B B2' + 'E7 00 B7 00 00 00 02 00 00 00 A4 1A 95 00 01 00' + '00 00 18 00 00 00 00 00 00 00 10 19 95 00 42 00' + '00 00 00 00 00 00 F4 18 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 0C 00 00 00 02 00 00 00 01 01' + 'F5 00 00 EC FD 00 66 00 00 00 00 00 00 00 03 00' + '00 00 6E 00 1A 00 10 91 07 00 00 00 00 00 10 91' + '07 00 05 00 00 00 BE B3 E7 00 4C 19 95 00 A3 B4' + 'E7 00 28 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 02 00 00 00 80 00 00 00 00 00 00 00 8C 1A' + '95 00 7F E9 4B 00 D0 60 38 00 00 00 00 00 00 00' + '00 00 80 1A 95 00 02 00 00 00 80 00 00 00 00 00' + '00 00 C0 27 95 00 C4 F5 AF 00 02 00 00 00 45 3A' + '5C 00 79 67 77 00 6E 5C 68 00 6D 65 5C 00 76 73' + '5C 00 69 6E 65 00 64 6C 6C 00 5C 73 68 00 6C 6C' + '33 00 5C 6D 79 00 6F 6D 70 00 74 65 72 00 69 63' + '6F 00 1F 3B D4 00 13 00 00 00 98 00 00 00 4F 3B' + 'D4 00 E0 19 95 00 33 3B D4 00 64 C5 F5 00 A9 F1' + 'E7 00 28 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 1A 95 00 98 69 38 00 86 00 00 00 00 00' + '00 00 C9 F1 E7 00 86 00 00 00 A4 1A 95 00 08 00' + '00 00 00 00 00 00 86 00 00 00 86 00 00 00 08 00' + '00 00 F4 19 95 00 33 3B D4 00 B4 1A 95 00 09 48' + 'E9 00 B8 10 E9 00 FF FF FF 00 C9 F1 E7 00 16 EA' + '4B 00 28 01 00 00 98 69 38 00 86 00 00 00 58 1A' + '95 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 A2 A2 A2 A2' + 'A2 A0 A0 B2 94 94 B2 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 02 1B 1D 1D 1C 1C 1C 1C 1C 1C 1C 1C 1B' + '1B 1B 1B 1A 1A 1A 1A 05 B2 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 05 2B 2B 2A 2A 24 24 24 24 23 23 23 23' + '1D 1D 1D 1C 1B 1B 1B 1C 02 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 07 2B 2B 2A 2A 24 24 24 24 23 23 23 23' + '1D 1D 1D 1D 1C 1B 1B 1C 04 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 1B 2B 2B 2B 2A 2A 2A 2A 2A 2A 24 24 24' + '23 23 23 1D 1C 1C 1C 1D 04 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 1A 2B 2B 2B 2B 2B 2B 2B 2B 2B 2A 2A 24' + '24 24 23 23 1D 1C 1C 1D 04 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 D1 2B 2B 2B 2A 2A 2A 24 24 24 24 24 23' + '23 23 1D 1D 1C 1C 1D 1D 02 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 03 2A 2B 2B 2B 2B 2B 2B 2A 2A 2A 2A 24' + '24 24 24 23 1D 1D 1D 1B 01 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 94 1B 2B 2B 2B 2B 2B 2B 2B 24 1D 23 24' + '2A 24 24 23 23 1D 1D 04 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 01 23 2B 2B 2B 2B 2B 2B 1C 1B 1B 23' + '2A 24 24 23 23 24 1A 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 04 23 2B 2B 2B 2B 2B 2A 24 24 2A' + '2A 2A 24 24 24 06 01 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 03 1D 2B 2B 2B 2B 2B 2B 2B 2B' + '2A 2A 2A 23 06 64 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 64 05 23 2B 2B 2B 2B 2B 2B' + '2B 24 1B 03 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 01 04 D3 1A 1C 1C 07' + '05 03 94 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 94 07 04 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 05 1D 1A 02' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 94 05 1C 1C' + '1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 23 23 23 1D' + '1C 1C 1C 1C 1B 1B 1B 1B 1B 1B 1B 1B 1B 1B 03 00' + '00 00 00 00 00 00 00 00 00 00 00 00 06 2B 2B 2B' + '2B 2B 2B 2B 2B 2B 2A 2A 2A 2A 2A 2A 2A 24 24 24' + '24 24 24 24 24 24 24 24 24 23 23 23 23 24 23 03' + '00 00 00 00 00 00 00 00 00 00 00 01 24 2B 2B 2B' + '2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 24 24 24 24 24 24' + '24 24 24 23 23 23 23 23 23 23 23 23 1D 1D 24 1C' + '00 00 00 00 00 00 00 00 00 00 00 03 2A 2B 2B 2A' + '2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 24 24' + '24 24 24 24 24 24 24 24 24 24 23 24 23 1D 23 1C' + '94 00 00 00 00 00 00 00 00 00 00 04 2A 2B 2B 23' + '16 16 16 1E 1E 1E 21 21 21 21 21 21 21 21 21 21' + '21 21 21 21 1E 1E 1E 16 16 16 16 1E 24 23 23 1C' + '94 00 00 00 00 00 00 00 00 00 00 03 2A 2B 2B 1E' + '0E 0F 0F 0F 0F C4 13 13 13 13 13 16 16 16 13 13' + '13 13 13 C4 0F 0F 0F 0F 0F 0E 0E 0F 24 23 23 1C' + '94 00 00 00 00 00 00 00 00 00 00 03 2A 2B 2B 1E' + '0E 0F 0F 0F 0F C4 13 13 13 13 13 16 16 16 16 13' + '13 13 13 C4 0F 0F 0F 0F 0F 0F 0E 0F 24 23 23 1C' + '94 00 00 00 00 00 00 00 00 00 00 03 2A 2B 2B 1E' + '0E 0F 0F 0F 0F 0F C4 C4 13 13 13 13 13 13 13 13' + '13 C4 C4 0F 0F 0F 0F 0F 0F 0F 0E 0F 24 23 23 1C' + '94 00 00 00 00 00 00 00 00 00 00 03 2A 2B 2B 1E' + '0E 0F 0F 0F 0F 0F 0F 0F C4 C4 C4 13 13 13 C4 C4' + 'C4 0F 0F 0F 0F 0F 0F 0F 0F 0E 08 0F 24 23 23 1C' + '94 00 00 00 00 00 00 00 00 00 00 03 2A 2B 2B 1E' + '0A 0E 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0F 0F 0E 0E 08 0F 24 23 24 1C' + '94 00 00 00 00 00 00 00 00 00 00 03 2A 2B 2B 1E' + '08 0E 0E 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0F 0E 0E 08 08 0F 2A 23 24 1C' + '94 00 00 00 00 00 00 00 00 00 00 03 2A 2B 2B 1E' + '08 0A 0E 0E 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0E 0E 0E 08 08 08 0F 2A 23 24 1C' + 'B2 00 00 00 00 00 00 00 00 00 00 03 2A 2B 2B 1E' + '08 08 08 0E 0E 0E 0E 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0E 0E 0E 08 08 08 08 0F 2A 23 24 1C' + 'B2 00 00 00 00 00 00 00 00 00 00 03 2A 2B 2B 1E' + '08 08 08 08 0E 0E 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0E 0E 08 08 08 08 0F 2A 24 24 1C' + 'B2 00 00 00 00 00 00 00 00 00 00 03 2A 2B 2B 1E' + '08 08 08 08 0F 0F 0F 0F 0F 0F 0F C4 C4 C4 C4 0F' + '0F 0F 0F 0F 0F 0F 0F 0E 08 08 08 0F 2A 24 24 1C' + 'A0 00 00 00 00 00 00 00 00 00 00 03 2A 2B 2B 1E' + '08 08 0E 0F 0F 0F 0F 0F C4 C4 C4 13 13 13 13 13' + 'C4 C4 C4 0F 0F 0F 0F 0F 0F 08 08 0F 2A 24 24 1C' + 'A0 00 00 00 00 00 00 00 00 00 00 03 2A 2B 2B 16' + '08 0E 0F 0F 0F 0F C4 C4 13 13 13 13 13 13 13 13' + '13 13 13 C4 0F 0F 0F 0F 0F 0F 08 0F 2A 24 24 1C' + 'A0 00 00 00 00 00 00 00 00 00 00 03 2A 2B 2B 16' + '08 0F 0F 0F C4 C4 13 13 13 13 16 16 16 16 16 16' + '13 13 13 13 C4 C4 0F 0F 0F 0F 0F 0F 2A 24 24 1C' + 'A2 00 00 00 00 00 00 00 00 00 00 03 2A 2B 2B 16' + '0E 0F 0F 0F C4 13 13 13 16 16 16 16 16 16 16 16' + '16 16 13 13 13 13 C4 0F 0F 0F 0F 0F 2A 24 24 1C' + 'A2 00 00 00 00 00 00 00 00 00 00 03 24 2B 2B 16' + '0F 0F 0F C4 13 13 13 16 16 16 16 16 17 17 16 16' + '16 16 16 16 13 13 13 C4 0F 0F 0F 0F 2A 24 2A 1C' + '00 00 00 00 00 00 00 00 00 00 00 03 24 2B 2B 16' + '0F 0F C4 13 13 13 16 16 16 17 17 17 17 17 17 17' + '17 16 16 16 16 13 13 C4 C4 0F 0F 0F 2A 2A 2A 1C' + '00 00 00 00 00 00 00 00 00 00 00 03 24 2B 2B 16' + '0E C4 C4 13 13 16 16 16 17 17 17 17 17 17 17 17' + '17 17 16 16 16 13 13 13 C4 0F 0F 0F 2A 2B 2B 1C' + '00 00 00 00 00 00 00 00 00 00 00 02 24 2B 2B 16' + '08 0F 13 13 13 16 16 17 17 17 17 19 19 19 19 17' + '17 17 17 16 16 13 13 13 C4 0F 0F 0F 2A 2B 2B 1C' + '00 00 00 00 00 00 00 00 00 00 00 02 24 2B 2B 1E' + '0D 0F 16 16 16 16 16 16 16 16 16 19 19 19 19 16' + '16 16 16 16 16 16 16 16 16 0F 0D 58 2B 2B 2B 1C' + '00 00 00 00 00 00 00 00 00 00 00 02 24 2B 2B 2A' + '2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A' + '2A 2A 2A 2A 2A 2A 2A 24 24 24 24 2A 2B 2B 2B 1C' + '00 00 00 00 00 00 00 00 00 00 00 01 23 2B 2B 2B' '2B 2B 2B 2B 2B 2B 2B 2B 2B 2B 2B 2B 2B 2B 2B 2B' - '2B 2B 2B 2B 2B 2B 2B 06 2C 2C 2C 00 00 00 00 00' - '00 2C 2C 2C 05 2A 2B 2B 2B 2B 2B 2B 2B 2B 2B 2B' + '2B 2B 2B 2B 2B 2B 2B 2B 2B 2B 2B 2B 2B 2B 2B 07' + '00 00 00 00 00 00 00 00 00 00 00 00 05 24 2B 2B' '2B 2B 2B 2B 2B 2B 2B 2B 2B 2B 2B 2B 2B 2B 2B 2B' - '2B 2B 2B 2B 2B 2B 1D 02 2C 2C 2C 00 00 00 00 00' - '00 00 2C 2C 2C 02 06 06 06 06 1A 06 06 06 06 1A' - '06 06 06 06 1A 06 06 06 06 1A 06 06 06 06 06 06' - '06 06 06 06 06 05 01 2C 2C 2C 00 00 00 00 00 00' - '00 00 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C' - '2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C' - '2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 00 00 00 00 00 00' - '00 00 00 00 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C' - '2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C' - '2C 2C 2C 2C 2C 2C 2C 2C 00 00 00 00 00 00 FF F8' + '2B 2B 2B 2B 2B 2B 2B 2B 2B 2B 2B 2B 2B 2B 1C 02' + '00 00 00 00 00 00 00 00 00 00 00 00 A2 03 D8 07' + '07 07 07 07 07 07 07 07 07 07 07 07 07 07 07 07' + '07 07 07 07 07 06 06 06 06 06 06 06 06 05 01 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF FF FF FF FF 00 00 FF F8' + '00 00 1F FF 00 00 FF F0 00 00 0F FF 00 00 FF E0' + '00 00 0F FF 00 00 FF E0 00 00 0F FF 00 00 FF E0' + '00 00 07 FF 00 00 FF E0 00 00 07 FF 00 00 FF E0' + '00 00 07 FF 00 00 FF E0 00 00 0F FF 00 00 FF F0' + '00 00 0F FF 00 00 FF F0 00 00 0F FF 00 00 FF F0' + '00 00 1F FF 00 00 FF F8 00 00 3F FF 00 00 FF FC' + '00 00 3F FF 00 00 FF FE 00 00 7F FF 00 00 FF FF' + '00 01 FF FF 00 00 FE 00 00 00 00 7F 00 00 F8 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 F0 00 00 00 00 0F 00 00 F0 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 FE 00' + '00 00 00 7F 00 00 28 00 00 00 10 00 00 00 20 00' + '00 00 01 00 20 00 00 00 00 00 40 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 03 01 01' + '01 7C 08 08 08 AD 08 08 08 A8 08 08 08 A8 08 08' + '08 A8 08 08 08 A8 08 08 08 AD 01 01 01 6D 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 31 57 57' + '57 FA CE CE CE FF BB BB BB FF B1 B1 B1 FF A8 A8' + 'A8 FF 9D 9D 9D FF 8D 8D 8D FF 30 30 30 F2 00 00' + '00 23 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 3A 7B 7B' + '7B FC FF FF FF FF F5 F5 F5 FF EC EC EC FF DD DD' + 'DD FF CA CA CA FF BA BA BA FF 4C 4C 4C F7 00 00' + '00 28 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 0D 37 37' + '37 D7 F5 F5 F5 FF FF FF FF FF E2 E2 E2 FF D9 D9' + 'D9 FF E6 E6 E6 FF B7 B7 B7 FF 1C 1C 1C C5 00 00' + '00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 45 59 59 59 EB E5 E5 E5 FF F1 F1 F1 FF EA EA' + 'EA FF C2 C2 C2 FF 3B 3B 3B E1 00 00 00 35 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 12 02 02 02 78 06 06 06 96 05 06' + '06 8A 00 00 00 C6 16 16 16 FF 77 77 77 FF 66 66' + '66 FF 11 11 11 FF 00 00 00 BC 07 07 07 89 07 07' + '07 96 02 02 02 73 00 00 00 0E 00 00 00 00 00 00' + '00 00 03 03 03 9C 94 94 93 FF D1 D4 D7 FF C7 CD' + 'D0 FF C3 C7 CA FF B9 BD C0 FF C2 C6 C9 FF BB BF' + 'C2 FF B0 B4 B8 FF B2 B7 BA FF B0 B5 B9 FF B1 B4' + 'B6 FF 6E 6D 6D FF 00 00 00 84 00 00 00 00 00 00' + '00 00 19 19 1A CC EC ED ED FF ED C9 B1 FF E6 B4' + '8F FF EB BF 9B FF ED C4 A0 FF EB C3 9E FF E8 C0' + '9B FF E5 BA 95 FF DD AF 8B FF D4 9E 79 FF D9 B9' + 'A5 FF B9 BB BD FF 09 0A 0A A8 00 00 00 00 00 00' + '00 00 1A 1B 1B CC EB EC ED FF CC 86 58 FF C2 5E' + '17 FF CE 75 30 FF D5 80 3B FF D8 85 40 FF D6 82' + '3D FF D1 78 34 FF C8 6A 26 FF BA 4F 08 FF CC 8E' + '68 FF B8 BC C0 FF 09 09 09 A8 00 00 00 00 00 00' + '00 00 19 1A 1A CC EA EB EC FF C7 81 57 FF B9 53' + '12 FF C2 66 26 FF C7 6E 2E FF CA 71 32 FF C8 6F' + '30 FF C4 68 29 FF BD 5C 1E FF B1 45 04 FF C9 8C' + '68 FF BA BE C1 FF 08 09 09 A8 00 00 00 00 00 00' + '00 00 18 19 1A CC E9 EA EB FF BE 73 4A FF AF 44' + '03 FF C0 62 23 FF C6 6D 2D FF C9 71 31 FF C8 70' + '30 FF C4 69 2A FF BB 5A 1B FF A9 39 00 FF C7 88' + '65 FF BC C1 C4 FF 08 08 08 A8 00 00 00 00 00 00' + '00 00 18 18 19 CC E6 E7 E8 FF C1 7A 4F FF C2 62' + '1F FF D0 7C 3C FF D5 85 44 FF D7 88 47 FF D7 87' + '46 FF D3 81 40 FF CC 76 36 FF BB 57 13 FF CC 8F' + '6C FF BD C1 C4 FF 07 08 08 A8 00 00 00 00 00 00' + '00 00 16 17 18 CC E3 E4 E4 FF CD 8D 60 FF D0 78' + '33 FF DA 8C 49 FF E2 98 54 FF E6 9F 5B FF E4 9C' + '59 FF DE 92 4F FF D6 84 42 FF C9 6B 26 FF DA A2' + '7C FF C1 C5 C8 FF 07 07 07 A8 00 00 00 00 00 00' + '00 00 17 17 18 CC E4 E4 E5 FF CA 90 6A FF D5 89' + '4B FF E1 9F 63 FF EB AE 71 FF F0 B9 7A FF EE B5' + '77 FF E6 A7 6A FF DC 97 5B FF CC 7B 3D FF DF AD' + '8D FF D0 D4 D7 FF 06 07 07 A8 00 00 00 00 00 00' + '00 00 09 09 09 C1 CB CC CC FF FA F6 F4 FF F2 EE' + 'EA FF F4 F0 EC FF F4 F1 EE FF F4 F2 EE FF F4 F2' + 'EE FF F4 F0 ED FF F2 EF EA FF F0 EB E8 FF FD FA' + 'F8 FF AF AF AF FF 00 00 00 9F 00 00 00 00 00 00' + '00 00 00 00 00 4A 1E 1E 1D E2 45 46 47 F3 43 45' + '46 F0 42 43 45 F0 42 43 44 F0 42 43 44 F0 42 43' + '44 F0 42 43 44 F0 42 43 44 F0 42 44 45 F0 41 42' + '43 F4 16 16 16 D9 00 00 00 39 00 00 00 00 E0 0F' + '00 00 E0 07 00 00 E0 07 00 00 E0 07 00 00 F0 0F' + '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 80 01 00 00 80 01 00 00 28 00' + '00 00 20 00 00 00 40 00 00 00 01 00 20 00 00 00' + '00 00 80 0C 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 0B 00 00 00 4B 00 00' + '00 63 00 00 00 61 00 00 00 61 00 00 00 61 00 00' + '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' + '00 61 00 00 00 61 00 00 00 61 00 00 00 63 00 00' + '00 3D 00 00 00 05 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 04 00 00 00 AF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 01 01 01 FF 01 01' + '01 FF 01 01 01 FF 02 02 02 FF 02 02 02 FF 02 02' + '02 FF 03 03 03 FF 05 05 05 FF 03 03 03 FF 00 00' + '00 FA 00 00 00 80 00 00 00 03 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 3E 00 00 00 FD 6E 6E 6E FF B7 B7' + 'B7 FF AD AD AD FF A9 A9 A9 FF A5 A5 A5 FF A2 A2' + 'A2 FF 9F 9F 9F FF 9B 9B 9B FF 97 97 97 FF 94 94' + '94 FF 8C 8C 8C FF 83 83 83 FF 85 85 85 FF 38 38' + '38 FF 00 00 00 EA 00 00 00 27 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 67 0F 0F 0F FF D8 D8 D8 FF FF FF' + 'FF FF ED ED ED FF E2 E2 E2 FF DB DB DB FF D3 D3' + 'D3 FF CD CD CD FF C8 C8 C8 FF C2 C2 C2 FF BC BC' + 'BC FF B4 B4 B4 FF 9F 9F 9F FF A2 A2 A2 FF 7F 7F' + '7F FF 00 00 00 FD 00 00 00 47 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 72 1B 1B 1B FF E6 E6 E6 FF FF FF' + 'FF FF F6 F6 F6 FF F5 F5 F5 FF F1 F1 F1 FF EC EC' + 'EC FF E4 E4 E4 FF DC DC DC FF D4 D4 D4 FF CC CC' + 'CC FF C5 C5 C5 FF AB AB AB FF AD AD AD FF 90 90' + '90 FF 04 04 04 FF 00 00 00 50 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 56 0D 0D 0D FF D4 D4 D4 FF FF FF' + 'FF FF F7 F7 F7 FF F8 F8 F8 FF F3 F3 F3 FF F0 F0' + 'F0 FF EC EC EC FF E3 E3 E3 FF DA DA DA FF D2 D2' + 'D2 FF CA CA CA FF B0 B0 B0 FF B8 B8 B8 FF 82 82' + '82 FF 00 00 00 F8 00 00 00 32 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 1F 00 00 00 ED 94 94 94 FF FF FF' + 'FF FF FE FE FE FF FD FD FD FF FA FA FA FF F3 F3' + 'F3 FF E5 E5 E5 FF E1 E1 E1 FF E0 E0 E0 FF DA DA' + 'DA FF D1 D1 D1 FF BF BF BF FF C5 C5 C5 FF 52 52' + '52 FF 00 00 00 CD 00 00 00 0D 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 97 29 29 29 FF E4 E4' + 'E4 FF FF FF FF FF FF FF FF FF FF FF FF FF F0 F0' + 'F0 FF AB AB AB FF B4 B4 B4 FF E8 E8 E8 FF E4 E4' + 'E4 FF D5 D5 D5 FF D3 D3 D3 FF 9D 9D 9D FF 0C 0C' + '0C FF 00 00 00 6C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 1C 00 00 00 D8 4C 4C' + '4C FF EC EC EC FF FF FF FF FF FF FF FF FF FA FA' + 'FA FF E2 E2 E2 FF E3 E3 E3 FF F0 F0 F0 FF EA EA' + 'EA FF E6 E6 E6 FF B1 B1 B1 FF 23 23 23 FF 00 00' + '00 B7 00 00 00 08 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 2B 00 00' + '00 D5 33 33 33 FF B4 B4 B4 FF F9 F9 F9 FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FB FB FB FF DC DC' + 'DC FF 89 89 89 FF 1A 1A 1A FF 00 00 00 B6 00 00' + '00 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 09 00 00 00 28 00 00' + '00 38 00 00 00 37 00 00 00 37 00 00 00 2C 00 00' + '00 50 00 00 00 CC 03 03 03 FF 31 31 31 FF 67 67' + '67 FF A2 A2 A2 FF 90 90 90 FF 59 59 59 FF 22 22' + '22 FF 00 00 00 FF 00 00 00 B4 00 00 00 41 00 00' + '00 2F 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 27 00 00 00 09 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 32 00 00 00 BE 00 00 00 F7 00 00' + '00 FB 00 00 00 FA 00 00 00 FA 00 00 00 FA 00 00' + '00 F3 00 00 00 F2 00 00 00 FF 00 00 00 FF 05 05' + '05 FF 79 79 79 FF 4C 4C 4C FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FD 00 00 00 F0 00 00 00 F6 00 00' + '00 FA 00 00 00 FA 00 00 00 FA 00 00 00 FB 00 00' + '00 F1 00 00 00 AE 00 00 00 29 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 1B 00 00 00 DB 26 26 26 FF 94 94 94 FF AD AD' + 'AD FF AA AA AA FF A9 A9 A9 FF A7 A7 A7 FF A7 A7' + 'A7 FF A6 A6 A6 FF A4 A4 A4 FF A2 A2 A2 FF AB AB' + 'AB FF CD CD CD FF BF BF BF FF A2 A2 A2 FF 9E 9E' + '9E FF 9E 9E 9E FF 9C 9C 9C FF 9C 9C 9C FF 9B 9B' + '9B FF 9A 9A 9A FF 99 99 99 FF 9B 9B 9B FF 77 77' + '77 FF 11 11 11 FF 00 00 00 C1 00 00 00 14 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 6F 06 06 06 FF C0 C0 C0 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FD FF FF FF FA FD FE FF F7 FA' + 'FC FF F4 F7 F9 FF F1 F4 F6 FF EE F1 F3 FF EA EC' + 'EE FF E2 E4 E6 FF E1 E3 E5 FF E2 E5 E7 FF E1 E2' + 'E5 FF DE E0 E2 FF DA DD DF FF D8 DA DD FF D5 D8' + 'DA FF D3 D6 D8 FF D0 D3 D5 FF CE CF CF FF DD DD' + 'DD FF 81 81 81 FF 00 00 00 FF 00 00 00 4E 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 22 22 22 FF EB EB EB FF FF FF FF FF F3 EA' + 'E4 FF F0 E0 D4 FF EF E1 D6 FF EF E1 D6 FF EF E1' + 'D6 FF EE E1 D6 FF ED E1 D6 FF EC E1 D5 FF EC E0' + 'D5 FF EA DE D3 FF E9 DD D2 FF E7 DA CF FF E5 D8' + 'CD FF E2 D5 CA FF DF D2 C7 FF DD CF C4 FF DB CC' + 'C1 FF D8 C9 BE FF D8 C8 BD FF D2 CE CC FF CB CC' + 'CC FF AB AB AB FF 06 06 06 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 24 24 24 FF EB EB EB FF FF FF FF FF D4 AB' + '8F FF C5 67 26 FF CD 77 39 FF D2 81 42 FF D7 89' + '4A FF DC 91 50 FF E0 97 57 FF E3 9C 5C FF E5 9F' + '5E FF E5 9F 5F FF E4 9E 5D FF E2 9A 5A FF DF 94' + '55 FF DA 8D 4E FF D6 85 47 FF D1 7D 3F FF CC 75' + '37 FF C6 6A 2C FF C5 68 2B FF D8 C3 B5 FF CE D1' + 'D3 FF A9 A9 A9 FF 06 06 06 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 22 22 22 FF EA EA EA FF FF FF FF FF D0 A5' + '89 FF BD 5A 16 FF C6 6A 2A FF CB 73 32 FF D0 7A' + '3A FF D4 82 40 FF D7 87 45 FF DA 8C 49 FF DB 8E' + '4B FF DB 8E 4C FF DA 8D 4A FF D8 89 47 FF D5 84' + '42 FF D2 7E 3C FF CD 76 35 FF C8 6E 2E FF C3 66' + '26 FF BD 5B 1A FF BB 59 1A FF D7 C0 B2 FF D1 D5' + 'D8 FF A9 A9 A9 FF 05 05 05 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 22 22 22 FF EA EA EA FF FF FF FF FF D0 A4' + '88 FF BA 54 12 FF C2 65 25 FF C7 6D 2D FF CB 73' + '34 FF CF 7A 39 FF D2 7F 3E FF D3 82 42 FF D4 84' + '43 FF D5 84 43 FF D4 83 42 FF D2 80 3F FF D0 7C' + '3B FF CD 76 36 FF C8 6F 30 FF C4 68 29 FF BF 60' + '21 FF B9 56 17 FF B8 54 17 FF D8 C1 B3 FF D4 D8' + 'DA FF A9 A9 A9 FF 05 05 05 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 21 21 21 FF E9 E9 E9 FF FF FF FF FF CD A0' + '84 FF B5 4C 0B FF BD 5D 1E FF C1 64 25 FF C5 6B' + '2A FF C9 70 30 FF CB 74 34 FF CD 77 37 FF CD 78' + '38 FF CD 78 38 FF CD 78 37 FF CC 75 35 FF CA 72' + '32 FF C7 6D 2D FF C3 67 27 FF BF 60 21 FF BB 58' + '1A FF B5 4F 10 FF B4 4D 11 FF D8 C0 B2 FF D8 DB' + 'DE FF A9 A9 A9 FF 04 04 04 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 20 20 20 FF E8 E8 E8 FF FF FF FF FF CA 9B' + '80 FF B0 44 02 FF B8 54 15 FF BC 5A 1C FF BF 60' + '21 FF C1 65 25 FF C4 68 28 FF C5 6B 2B FF C6 6C' + '2D FF C6 6D 2D FF C6 6C 2D FF C4 69 2A FF C2 66' + '26 FF C0 61 22 FF BD 5D 1E FF B9 57 19 FF B5 50' + '12 FF B0 47 08 FF B0 46 0A FF D8 C0 B2 FF DA DE' + 'E0 FF A8 A8 A8 FF 04 04 04 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 20 20 20 FF E7 E7 E7 FF FF FF FF FF C6 96' + '7B FF AA 3B 00 FF B2 4A 0D FF B4 4F 11 FF B8 55' + '17 FF BD 5E 1F FF C2 65 25 FF C4 69 2A FF C5 6B' + '2C FF C6 6C 2C FF C6 6C 2C FF C4 69 2A FF C2 65' + '26 FF BE 5E 20 FF B8 55 17 FF B3 4C 0E FF AF 46' + '08 FF AB 3F 01 FF AD 43 06 FF DA C2 B4 FF DE E2' + 'E4 FF A7 A7 A7 FF 03 03 03 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 1F 1F 1F FF E6 E6 E6 FF FF FF FF FF C2 93' + '78 FF A5 34 00 FF AB 40 03 FF B6 52 14 FF C1 64' + '26 FF C7 6E 2F FF CA 73 33 FF CC 77 36 FF CD 78' + '38 FF CD 79 38 FF CD 78 38 FF CC 77 37 FF CB 74' + '34 FF C8 6F 30 FF C4 69 2A FF BC 5C 1D FF AF 47' + '0A FF A7 3A 00 FF AC 43 06 FF DB C3 B5 FF E0 E4' + 'E7 FF A7 A7 A7 FF 03 03 03 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 1E 1E 1E FF E5 E5 E5 FF FF FF FF FF C1 90' + '76 FF A6 36 00 FF BA 59 1A FF C8 6F 2F FF CC 75' + '35 FF CF 7A 3A FF D1 7F 3E FF D3 82 41 FF D4 83' + '42 FF D4 84 43 FF D4 83 42 FF D3 82 41 FF D1 7E' + '3E FF CF 7A 39 FF CC 75 35 FF C9 70 30 FF C3 67' + '27 FF B3 4D 0E FF AC 42 06 FF DC C4 B6 FF E3 E7' + 'EA FF A7 A7 A7 FF 02 02 02 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 1D 1D 1D FF E4 E4 E4 FF FF FF FF FF BE 8E' + '73 FF B7 50 0E FF CA 72 32 FF CD 77 37 FF D1 7D' + '3D FF D4 83 43 FF D8 88 47 FF D9 8C 4B FF DB 8F' + '4D FF DB 8F 4D FF DB 8F 4D FF D9 8C 4B FF D8 88' + '47 FF D4 83 43 FF D1 7D 3D FF CD 76 36 FF C9 70' + '30 FF C4 67 27 FF B5 51 14 FF DC C3 B6 FF E6 EA' + 'EC FF A6 A6 A6 FF 01 01 01 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 1C 1C 1C FF E2 E2 E2 FF FF FF FF FF C3 96' + '7A FF C4 65 22 FF CD 76 36 FF D2 7E 3E FF D6 85' + '44 FF DA 8C 4B FF DD 92 50 FF E0 97 54 FF E1 99' + '57 FF E2 99 58 FF E1 99 57 FF E0 97 54 FF DD 92' + '50 FF DA 8C 4B FF D6 85 44 FF D2 7E 3E FF CC 76' + '36 FF C7 6D 2D FF C2 65 27 FF DE C6 B9 FF E8 EB' + 'EE FF A6 A6 A6 FF 01 01 01 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 1B 1B 1B FF E1 E1 E1 FF FF FF FF FF C5 9A' + '7E FF C8 6C 28 FF D1 7D 3C FF D6 85 44 FF DA 8D' + '4B FF DF 94 52 FF E3 9B 59 FF E6 A1 5E FF E8 A4' + '62 FF E9 A5 62 FF E8 A4 62 FF E6 A1 5E FF E3 9B' + '59 FF DF 94 52 FF DA 8D 4B FF D6 85 44 FF D0 7D' + '3C FF CA 72 31 FF C7 6D 2E FF E5 CE C1 FF F4 F8' + 'FA FF A7 A7 A7 FF 00 00 00 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 1A 1A 1A FF E0 E0 E0 FF FF FF FF FF BC 8D' + '70 FF C7 68 23 FF D4 81 3E FF D9 89 46 FF DE 92' + '4E FF E4 9A 56 FF E9 A2 5E FF ED AA 65 FF F0 AE' + '6A FF F1 B0 6B FF F0 AE 6A FF ED AA 65 FF E9 A2' + '5E FF E4 9A 56 FF DE 92 4E FF D9 89 46 FF D4 80' + '3D FF CE 76 33 FF C2 63 23 FF E9 D0 C2 FF FF FF' + 'FF FF AA AA AA FF 00 00 00 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 1A 1A 1A FF E0 E0 E0 FF FF FF FF FF B5 8D' + '76 FF B4 60 29 FF CF 88 4F FF D4 90 56 FF D9 98' + '5D FF DE A0 65 FF E3 A8 6D FF E7 AF 74 FF EB B5' + '79 FF EC B7 7B FF EB B5 79 FF E7 AF 74 FF E3 A8' + '6D FF DE A0 65 FF D8 98 5D FF D3 90 56 FF CF 87' + '4E FF C7 7C 44 FF B0 5D 2B FF E8 D3 C8 FF FF FF' + 'FF FF AB AB AB FF 00 00 00 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 15 15 15 FF DB DB DB FF FF FF FF FF EE EC' + 'EC FF E7 E4 E2 FF EB E7 E4 FF EB E8 E5 FF EC E8' + 'E5 FF EC E9 E6 FF EC E9 E6 FF EC EA E7 FF ED EA' + 'E7 FF ED EA E7 FF ED EA E7 FF EC EA E7 FF EC E9' + 'E6 FF EB E8 E5 FF EA E8 E5 FF EA E7 E4 FF EA E6' + 'E3 FF E8 E4 E2 FF E6 E3 E2 FF F8 F8 F7 FF FF FF' + 'FF FF A7 A7 A7 FF 00 00 00 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 6C 00 00 00 FF 8E 8E 8E FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF F4 F4' + 'F4 FF 58 58 58 FF 00 00 00 FD 00 00 00 45 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 16 00 00 00 D5 0A 0A 0A FF 53 53 53 FF 74 74' + '74 FF 72 72 72 FF 72 72 72 FF 72 72 72 FF 72 72' + '72 FF 72 72 72 FF 72 72 72 FF 71 71 71 FF 71 71' + '71 FF 71 71 71 FF 71 71 71 FF 71 71 71 FF 71 71' + '71 FF 71 71 71 FF 71 71 71 FF 71 71 71 FF 70 70' + '70 FF 70 70 70 FF 70 70 70 FF 6F 6F 6F FF 3F 3F' + '3F FF 02 02 02 FF 00 00 00 B2 00 00 00 05 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 28 00 00 00 B1 00 00 00 EF 00 00' + '00 F1 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F2 00 00' + '00 E8 00 00 00 97 00 00 00 15 00 00 00 00 00 00' + '00 00 00 00 00 00 FF 00 00 FF FE 00 00 7F FE 00' + '00 7F FE 00 00 7F FE 00 00 7F FE 00 00 7F FE 00' + '00 7F FF 00 00 FF FF 00 00 FF FF 80 01 FF F0 00' + '00 0F E0 00 00 07 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 E0 00 00 07 28 00 00 00 30 00 00 00 60 00' + '00 00 01 00 20 00 00 00 00 00 80 21 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 0C 00 00 00 2F 00 00 00 38 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 38 00 00 00 2A 00 00 00 0B 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 43 00 00 00 B0 00 00 00 F4 00 00 00 F8 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F8 00 00 00 DA 00 00 00 85 00 00 00 28 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 11 00 00' + '00 E2 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 01 01 01 FF 01 01 01 FF 01 01' + '01 FF 01 01 01 FF 01 01 01 FF 02 02 02 FF 02 02' + '02 FF 03 03 03 FF 04 04 04 FF 04 04 04 FF 03 03' + '03 FF 00 00 00 FF 00 00 00 FF 00 00 00 AF 00 00' + '00 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 65 00 00' + '00 FF 20 20 20 FF 9B 9B 9B FF B9 B9 B9 FF B5 B5' + 'B5 FF B2 B2 B2 FF B0 B0 B0 FF AE AE AE FF AB AB' + 'AB FF A9 A9 A9 FF A7 A7 A7 FF A4 A4 A4 FF A2 A2' + 'A2 FF 9F 9F 9F FF 9C 9C 9C FF 9B 9B 9B FF 96 96' + '96 FF 8C 8C 8C FF 86 86 86 FF 88 88 88 FF 8E 8E' + '8E FF 5A 5A 5A FF 03 03 03 FF 00 00 00 E9 00 00' + '00 36 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 A6 00 00' + '00 FF 59 59 59 FF FF FF FF FF FA FA FA FF F1 F1' + 'F1 FF EB EB EB FF E4 E4 E4 FF E0 E0 E0 FF DC DC' + 'DC FF D8 D8 D8 FF D4 D4 D4 FF D0 D0 D0 FF CB CB' + 'CB FF C7 C7 C7 FF C3 C3 C3 FF BF BF BF FF BB BB' + 'BB FF B0 B0 B0 FF 9E 9E 9E FF 97 97 97 FF 9E 9E' + '9E FF B0 B0 B0 FF 25 25 25 FF 00 00 00 FD 00 00' + '00 5A 00 00 00 01 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 05 00 00 00 C6 00 00' + '00 FF 82 82 82 FF FF FF FF FF F7 F7 F7 FF F1 F1' + 'F1 FF E9 E9 E9 FF E4 E4 E4 FF DF DF DF FF DA DA' + 'DA FF D6 D6 D6 FF D2 D2 D2 FF CE CE CE FF CA CA' + 'CA FF C7 C7 C7 FF C3 C3 C3 FF BF BF BF FF BB BB' + 'BB FF B8 B8 B8 FF A9 A9 A9 FF 9C 9C 9C FF 98 98' + '98 FF AF AF AF FF 3D 3D 3D FF 00 00 00 FF 00 00' + '00 7C 00 00 00 01 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 09 00 00 00 D4 00 00' + '00 FF 92 92 92 FF FF FF FF FF FF FF FF FF F9 F9' + 'F9 FF F6 F6 F6 FF F6 F6 F6 FF F3 F3 F3 FF EF EF' + 'EF FF EC EC EC FF E6 E6 E6 FF E1 E1 E1 FF DC DC' + 'DC FF D6 D6 D6 FF D1 D1 D1 FF CC CC CC FF C6 C6' + 'C6 FF C3 C3 C3 FF AF AF AF FF A5 A5 A5 FF A8 A8' + 'A8 FF B6 B6 B6 FF 44 44 44 FF 00 00 00 FF 00 00' + '00 85 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 B5 00 00' + '00 FF 84 84 84 FF FF FF FF FF FF FF FF FF F7 F7' + 'F7 FF FB FB FB FF FD FD FD FF FC FC FC FF FC FC' + 'FC FF FA FA FA FF F8 F8 F8 FF F1 F1 F1 FF EB EB' + 'EB FF E5 E5 E5 FF DF DF DF FF D9 D9 D9 FF D3 D3' + 'D3 FF CF CF CF FF B5 B5 B5 FF A3 A3 A3 FF AD AD' + 'AD FF BB BB BB FF 3D 3D 3D FF 00 00 00 FF 00 00' + '00 68 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 88 00 00' + '00 FF 5F 5F 5F FF FF FF FF FF FF FF FF FF FB FB' + 'FB FF EF EF EF FF EE EE EE FF E9 E9 E9 FF E3 E3' + 'E3 FF DF DF DF FF DD DD DD FF DA DA DA FF D5 D5' + 'D5 FF D0 D0 D0 FF CC CC CC FF C7 C7 C7 FF C3 C3' + 'C3 FF BE BE BE FF B0 B0 B0 FF B2 B2 B2 FF B4 B4' + 'B4 FF BA BA BA FF 28 28 28 FF 00 00 00 F7 00 00' + '00 3C 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 34 00 00' + '00 FA 2E 2E 2E FF ED ED ED FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FE FE FE FF FA FA' + 'FA FF F5 F5 F5 FF F4 F4 F4 FF EF EF EF FF EB EB' + 'EB FF E5 E5 E5 FF E0 E0 E0 FF DC DC DC FF D8 D8' + 'D8 FF D2 D2 D2 FF C2 C2 C2 FF BA BA BA FF C1 C1' + 'C1 FF 97 97 97 FF 0A 0A 0A FF 00 00 00 D5 00 00' + '00 19 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00' + '00 C8 04 04 04 FF 97 97 97 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FD FD FD FF DF DF DF FF BE BE BE FF C4 C4' + 'C4 FF E4 E4 E4 FF E6 E6 E6 FF E1 E1 E1 FF DD DD' + 'DD FF D1 D1 D1 FF C5 C5 C5 FF C2 C2 C2 FF BF BF' + 'BF FF 43 43 43 FF 00 00 00 FF 00 00 00 9A 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 6C 00 00 00 FF 18 18 18 FF D1 D1 D1 FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FE FE FE FF B2 B2 B2 FF 9D 9D 9D FF 98 98' + '98 FF D1 D1 D1 FF ED ED ED FF E5 E5 E5 FF DF DF' + 'DF FF D1 D1 D1 FF CC CC CC FF D5 D5 D5 FF 84 84' + '84 FF 00 00 00 FF 00 00 00 E2 00 00 00 29 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 96 00 00 00 FF 3E 3E 3E FF D1 D1' + 'D1 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF ED ED ED FF DE DE DE FF E1 E1' + 'E1 FF EC EC EC FF EE EE EE FF E7 E7 E7 FF DC DC' + 'DC FF DC DC DC FF D7 D7 D7 FF 7B 7B 7B FF 14 14' + '14 FF 00 00 00 FF 00 00 00 5F 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 1A 00 00 00 C6 00 00 00 FF 35 35' + '35 FF C3 C3 C3 FF F9 F9 F9 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FC FC FC FF FC FC' + 'FC FF F7 F7 F7 FF F0 F0 F0 FF EC EC EC FF EB EB' + 'EB FF CF CF CF FF 77 77 77 FF 07 07 07 FF 00 00' + '00 FD 00 00 00 8F 00 00 00 05 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 05 00 00 00 B6 00 00' + '00 FF 08 08 08 FF 58 58 58 FF CB CB CB FF FD FD' + 'FD FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF F9 F9 F9 FF E3 E3 E3 FF 9E 9E' + '9E FF 31 31 31 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00' + '00 0C 00 00 00 14 00 00 00 14 00 00 00 14 00 00' + '00 14 00 00 00 14 00 00 00 0E 00 00 00 1F 00 00' + '00 7B 00 00 00 E9 00 00 00 FF 10 10 10 FF 3E 3E' + '3E FF 69 69 69 FF 89 89 89 FF B1 B1 B1 FF A2 A2' + 'A2 FF 7E 7E 7E FF 57 57 57 FF 2C 2C 2C FF 04 04' + '04 FF 00 00 00 FF 00 00 00 BF 00 00 00 4F 00 00' + '00 14 00 00 00 11 00 00 00 14 00 00 00 14 00 00' + '00 14 00 00 00 14 00 00 00 14 00 00 00 0C 00 00' + '00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 04 00 00 00 4C 00 00 00 8A 00 00' + '00 AD 00 00 00 BB 00 00 00 B9 00 00 00 B9 00 00' + '00 B9 00 00 00 B9 00 00 00 B9 00 00 00 B5 00 00' + '00 AB 00 00 00 D1 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 04 04 04 FF 7E 7E 7E FF 4B 4B' + '4B FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 F1 00 00 00 BA 00 00 00 AF 00 00' + '00 B7 00 00 00 B9 00 00 00 B9 00 00 00 B9 00 00' + '00 B9 00 00 00 B9 00 00 00 B8 00 00 00 A5 00 00' + '00 85 00 00 00 43 00 00 00 0A 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 06 00 00 00 95 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 54 54 54 FF BD BD BD FF 8A 8A' + '8A FF 1B 1B 1B FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 F0 00 00 00 69 00 00 00 0D 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 7A 00 00 00 FF 04 04 04 FF 5A 5A 5A FF A7 A7' + 'A7 FF AD AD AD FF AB AB AB FF AA AA AA FF AA AA' + 'AA FF AA AA AA FF A9 A9 A9 FF A9 A9 A9 FF A8 A8' + 'A8 FF A8 A8 A8 FF A8 A8 A8 FF A7 A7 A7 FF A6 A6' + 'A6 FF A9 A9 A9 FF C5 C5 C5 FF D3 D3 D3 FF C6 C6' + 'C6 FF B4 B4 B4 FF A3 A3 A3 FF A3 A3 A3 FF A3 A3' + 'A3 FF A2 A2 A2 FF A1 A1 A1 FF A1 A1 A1 FF A1 A1' + 'A1 FF A0 A0 A0 FF A0 A0 A0 FF 9F 9F 9F FF 9F 9F' + '9F FF 9E 9E 9E FF A1 A1 A1 FF 94 94 94 FF 31 31' + '31 FF 00 00 00 FF 00 00 00 F6 00 00 00 5C 00 00' + '00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 28 00 00' + '00 EA 00 00 00 FF 78 78 78 FF FA FA FA FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FE FE FE FF FB FB' + 'FB FF FA FA FA FF F8 F8 F8 FF F7 F7 F7 FF F4 F4' + 'F4 FF F3 F3 F3 FF F2 F2 F2 FF F0 F0 F0 FF EF EF' + 'EF FF EC EC EC FF E6 E6 E6 FF E2 E2 E2 FF E2 E2' + 'E2 FF E3 E3 E3 FF E4 E4 E4 FF E2 E2 E2 FF E0 E0' + 'E0 FF DE DE DE FF DC DC DC FF DB DB DB FF D9 D9' + 'D9 FF D8 D8 D8 FF D6 D6 D6 FF D4 D4 D4 FF D3 D3' + 'D3 FF D0 D0 D0 FF CF CF CF FF DD DD DD FF CB CB' + 'CB FF 39 39 39 FF 00 00 00 FF 00 00 00 AF 00 00' + '00 17 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 78 00 00' + '00 FF 17 17 17 FF DF DF DF FF FF FF FF FF F7 F7' + 'F7 FF F6 F8 F8 FF F5 F6 F8 FF F3 F4 F5 FF F1 F3' + 'F4 FF EF F0 F2 FF ED EF F0 FF EC ED EE FF E9 EA' + 'EB FF E8 E9 EA FF E6 E7 E9 FF E4 E6 E7 FF E2 E3' + 'E4 FF E0 E1 E3 FF DF E0 E1 FF DD DE DF FF DB DC' + 'DD FF D9 DB DC FF D8 D8 D9 FF D6 D7 D8 FF D4 D5' + 'D7 FF D2 D4 D4 FF D0 D1 D3 FF CE D0 D1 FF CD CE' + 'CF FF CB CD CE FF CA CB CD FF C7 C9 CA FF C6 C8' + 'C9 FF C4 C6 C7 FF C2 C3 C3 FF C0 C0 C0 FF D9 D9' + 'D9 FF A4 A4 A4 FF 00 00 00 FF 00 00 00 EE 00 00' + '00 33 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 39 39 39 FF F0 F0 F0 FF FF FF FF FF F9 F9' + 'F9 FF F6 F0 EB FF F5 EF EA FF F5 EE EA FF F3 EE' + 'E9 FF F3 ED E9 FF F2 EC E8 FF F2 EC E8 FF F0 EC' + 'E6 FF F0 EB E6 FF F0 EA E6 FF EF EA E4 FF ED E8' + 'E4 FF ED E8 E3 FF EC E7 E2 FF EB E6 E1 FF E9 E5' + 'E0 FF E8 E4 DF FF E7 E2 DD FF E6 E1 DC FF E5 DF' + 'DB FF E3 DE D9 FF E2 DD D8 FF E1 DB D6 FF DF DA' + 'D4 FF DE D8 D3 FF DD D7 D2 FF DB D5 D0 FF D9 D3' + 'CE FF DB D5 D2 FF D3 D2 D2 FF C3 C3 C3 FF CB CB' + 'CB FF AE AE AE FF 05 05 05 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 3C 3C 3C FF F1 F1 F1 FF FF FF FF FF FB FF' + 'FF FF E2 CA B9 FF D8 9B 70 FF DC A2 79 FF DE A7' + '7D FF E1 AA 81 FF E3 AF 85 FF E5 B2 88 FF E8 B6' + '8C FF E9 B9 8E FF EB BB 91 FF ED BE 94 FF EE C0' + '95 FF EF C1 96 FF EF C2 97 FF EF C2 97 FF EE C1' + '97 FF EE C0 95 FF EC BE 93 FF EB BB 90 FF E9 B8' + '8E FF E7 B5 8B FF E5 B1 87 FF E3 AE 84 FF E1 AA' + '81 FF DF A6 7D FF DC A2 79 FF D9 9E 75 FF D6 97' + '6E FF E0 AB 8B FF E5 E3 E2 FF C4 C5 C6 FF CC CC' + 'CC FF AB AB AB FF 06 06 06 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 3A 3A 3A FF F1 F1 F1 FF FF FF FF FF FD FF' + 'FF FF D0 A9 90 FF BC 56 11 FF C3 63 1F FF C6 69' + '26 FF CA 70 2C FF CD 76 32 FF D1 7B 37 FF D4 81' + '3D FF D7 86 41 FF D9 89 44 FF DC 8D 48 FF DD 90' + '4A FF DF 92 4D FF DF 93 4D FF DF 93 4D FF DE 91' + '4C FF DD 90 4A FF DB 8C 46 FF D8 88 43 FF D6 83' + '3F FF D3 7E 3A FF D0 78 34 FF CC 73 2F FF C8 6D' + '2A FF C5 67 24 FF C1 61 1E FF BD 5A 17 FF B6 4E' + '0A FF C4 6F 38 FF E5 E2 E0 FF C7 C8 C9 FF CF CF' + 'CF FF AC AC AC FF 05 05 05 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 39 39 39 FF F0 F0 F0 FF FF FF FF FF FF FF' + 'FF FF D1 AC 94 FF BC 5A 19 FF C2 66 26 FF C6 6C' + '2C FF CA 72 32 FF CD 77 37 FF D0 7C 3C FF D3 81' + '40 FF D5 85 44 FF D7 88 47 FF D9 8C 4A FF DA 8E' + '4C FF DC 8F 4D FF DC 90 4E FF DC 90 4E FF DB 8F' + '4D FF DA 8D 4B FF D9 8A 49 FF D6 87 46 FF D4 83' + '42 FF D1 7F 3E FF CE 7A 39 FF CB 75 34 FF C8 70' + '30 FF C5 6A 2B FF C1 64 25 FF BD 5E 1F FF B7 53' + '12 FF C6 73 3F FF E6 E3 E1 FF C8 C9 CA FF D0 D0' + 'D0 FF AC AC AC FF 05 05 05 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 38 38 38 FF F0 F0 F0 FF FF FF FF FF FF FF' + 'FF FF D1 AB 92 FF B9 55 14 FF BF 61 22 FF C3 67' + '28 FF C6 6D 2D FF CA 71 31 FF CC 76 36 FF CF 7B' + '3A FF D1 7E 3D FF D3 81 40 FF D5 85 44 FF D6 87' + '45 FF D7 88 47 FF D7 89 47 FF D7 89 47 FF D7 87' + '47 FF D6 86 45 FF D4 83 42 FF D2 80 3F FF D0 7D' + '3C FF CE 79 38 FF CB 74 34 FF C8 6F 2F FF C5 6A' + '2B FF C2 65 26 FF BE 60 21 FF BA 5A 1B FF B4 4E' + '0F FF C4 70 3C FF E6 E3 E2 FF CA CB CC FF D2 D2' + 'D2 FF AC AC AC FF 05 05 05 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 38 38 38 FF F0 F0 F0 FF FF FF FF FF FF FF' + 'FF FF D0 A9 91 FF B7 51 10 FF BD 5C 1D FF C0 62' + '23 FF C3 67 28 FF C6 6C 2C FF C9 71 30 FF CB 75' + '34 FF CE 78 37 FF CF 7B 3A FF D0 7E 3D FF D1 7F' + '3E FF D2 81 40 FF D3 81 40 FF D2 81 40 FF D2 80' + '3F FF D1 7F 3E FF D0 7C 3C FF CE 79 39 FF CD 76' + '36 FF CA 73 32 FF C7 6E 2E FF C5 6A 2A FF C2 66' + '26 FF BF 60 21 FF BC 5B 1C FF B8 55 17 FF B2 4A' + '0A FF C2 6C 39 FF E7 E4 E3 FF CC CD CE FF D4 D4' + 'D4 FF AB AB AB FF 04 04 04 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 36 36 36 FF EF EF EF FF FF FF FF FF FF FF' + 'FF FF CE A7 8F FF B3 4C 0B FF B9 58 18 FF BC 5D' + '1E FF C0 62 23 FF C3 66 27 FF C5 6A 2B FF C7 6E' + '2E FF C9 71 31 FF CB 74 33 FF CC 76 36 FF CD 78' + '37 FF CE 79 39 FF CE 79 39 FF CE 79 39 FF CE 79' + '38 FF CD 77 37 FF CC 75 35 FF CA 72 32 FF C8 70' + '30 FF C6 6C 2D FF C3 68 29 FF C1 64 25 FF BE 60' + '21 FF BC 5B 1C FF B8 56 18 FF B5 50 12 FF AF 45' + '05 FF BF 68 35 FF E8 E5 E3 FF CD CF D0 FF D6 D6' + 'D6 FF AB AB AB FF 04 04 04 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 36 36 36 FF EE EE EE FF FF FF FF FF FF FF' + 'FF FF CC A4 8C FF B0 46 06 FF B6 51 13 FF B9 57' + '18 FF BC 5B 1D FF BF 60 21 FF C1 64 24 FF C3 67' + '28 FF C5 6A 2B FF C6 6D 2D FF C8 6F 2F FF C9 70' + '30 FF C9 72 32 FF C9 72 32 FF C9 72 32 FF C9 72' + '31 FF C8 70 30 FF C7 6E 2E FF C6 6B 2C FF C4 69' + '2A FF C2 66 26 FF BF 62 22 FF BD 5E 1F FF BA 5A' + '1B FF B8 55 17 FF B5 50 12 FF B2 4B 0D FF AC 40' + '00 FF BC 64 31 FF E9 E5 E4 FF D0 D1 D2 FF D8 D8' + 'D8 FF AA AA AA FF 04 04 04 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 35 35 35 FF ED ED ED FF FF FF FF FF FF FF' + 'FF FF CA A0 88 FF AD 40 00 FF B3 4C 0E FF B5 51' + '13 FF B8 56 17 FF BB 5A 1B FF BD 5D 1E FF BF 61' + '21 FF C0 63 24 FF C1 65 25 FF C2 67 28 FF C3 69' + '29 FF C5 69 2A FF C5 6A 2A FF C5 6A 2A FF C4 69' + '29 FF C4 68 28 FF C2 66 27 FF C0 64 24 FF BF 61' + '22 FF BE 5E 20 FF BC 5B 1D FF BA 58 19 FF B7 54' + '16 FF B5 50 12 FF B2 4B 0D FF AF 46 08 FF A8 3B' + '00 FF BB 62 30 FF EA E7 E5 FF D1 D3 D4 FF D9 D9' + 'D9 FF AA AA AA FF 03 03 03 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 34 34 34 FF EC EC EC FF FF FF FF FF FF FF' + 'FF FF C6 9D 85 FF A9 3A 00 FF AF 46 09 FF B2 4B' + '0E FF B4 4F 12 FF B6 53 15 FF B8 55 17 FF B9 58' + '19 FF BB 5C 1D FF BF 60 22 FF C2 66 27 FF C4 68' + '29 FF C5 6A 2A FF C5 6B 2B FF C5 6B 2B FF C5 6B' + '2B FF C5 69 2A FF C3 68 29 FF C1 65 26 FF BF 60' + '22 FF BB 59 1B FF B7 54 15 FF B4 4F 11 FF B3 4D' + '0F FF B1 4A 0C FF AE 45 08 FF AB 40 03 FF A6 38' + '00 FF BA 61 2F FF EA E7 E6 FF D3 D4 D5 FF DB DB' + 'DB FF A9 A9 A9 FF 03 03 03 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 33 33 33 FF EC EC EC FF FF FF FF FF FF FF' + 'FF FF C4 9A 83 FF A6 37 00 FF AC 40 03 FF AE 45' + '07 FF AF 47 0A FF B3 4D 0F FF B9 57 18 FF BE 5F' + '20 FF C4 68 29 FF C6 6D 2D FF C8 70 30 FF CA 72' + '31 FF CA 73 33 FF CB 74 33 FF CB 74 33 FF CB 73' + '33 FF CA 73 32 FF C9 71 31 FF C8 70 30 FF C7 6D' + '2D FF C4 69 2A FF BF 60 22 FF B8 56 18 FF B3 4D' + '0F FF AC 42 04 FF AA 3F 02 FF A9 3E 01 FF A6 38' + '00 FF BA 61 2F FF EB E8 E6 FF D5 D6 D7 FF DC DC' + 'DC FF A9 A9 A9 FF 03 03 03 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 32 32 32 FF EB EB EB FF FF FF FF FF FF FF' + 'FF FF C3 99 81 FF A6 37 00 FF A9 3D 00 FF A9 3D' + '00 FF B1 49 0C FF C0 63 24 FF C6 6D 2D FF C9 71' + '31 FF CA 74 33 FF CB 75 35 FF CD 78 37 FF CE 79' + '39 FF CF 7B 3A FF CF 7B 3B FF CF 7B 3B FF CF 7B' + '3A FF CE 7A 3A FF CD 79 38 FF CC 76 36 FF CB 74' + '34 FF C9 71 32 FF C7 6E 2F FF C6 6B 2B FF C2 66' + '27 FF B7 54 16 FF AA 40 03 FF A8 3C 00 FF A6 38' + '00 FF BA 61 2F FF EC E9 E7 FF D7 D9 D9 FF DF DF' + 'DF FF A8 A8 A8 FF 02 02 02 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 31 31 31 FF EA EA EA FF FF FF FF FF FF FF' + 'FF FF C2 98 80 FF A5 36 00 FF A8 3C 00 FF B7 55' + '17 FF C4 6A 2A FF C8 70 31 FF CA 73 33 FF CD 76' + '36 FF CE 79 39 FF D0 7C 3B FF D1 7F 3E FF D2 80' + '3F FF D3 82 41 FF D3 83 42 FF D3 83 42 FF D3 82' + '41 FF D3 81 40 FF D2 80 3F FF D0 7D 3C FF CF 7B' + '3A FF CD 78 37 FF CB 74 34 FF C9 71 30 FF C7 6E' + '2E FF C5 6A 2B FF BE 5F 20 FF B0 4A 0C FF A5 36' + '00 FF BA 61 2F FF EC E9 E8 FF D8 DA DA FF E0 E0' + 'E0 FF A7 A7 A7 FF 02 02 02 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 30 30 30 FF E9 E9 E9 FF FF FF FF FF FF FF' + 'FF FF C0 96 7E FF A6 37 00 FF B8 55 17 FF C7 6D' + '2E FF C9 71 31 FF CC 75 35 FF CD 79 39 FF D0 7D' + '3C FF D2 80 3F FF D3 83 42 FF D5 86 44 FF D7 87' + '46 FF D8 89 48 FF D8 8A 48 FF D8 8A 48 FF D8 89' + '48 FF D7 88 47 FF D6 87 45 FF D5 84 43 FF D3 82' + '41 FF D1 7E 3D FF CE 7A 3A FF CD 77 36 FF CA 73' + '33 FF C7 6E 2E FF C5 6B 2B FF C0 63 23 FF AD 41' + '02 FF BA 60 2E FF ED EA E9 FF DA DC DD FF E2 E2' + 'E2 FF A7 A7 A7 FF 02 02 02 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 2F 2F 2F FF E8 E8 E8 FF FF FF FF FF FE FF' + 'FF FF BD 92 7B FF AF 45 05 FF C7 6D 2D FF C9 71' + '31 FF CC 76 35 FF CF 7A 3A FF D1 7E 3E FF D4 83' + '42 FF D6 86 46 FF D8 8A 48 FF DA 8D 4B FF DB 8F' + '4D FF DC 90 4E FF DC 91 50 FF DC 91 50 FF DC 91' + '4F FF DC 90 4E FF DA 8E 4C FF D9 8B 49 FF D7 88' + '47 FF D5 84 43 FF D2 80 3F FF D0 7C 3B FF CD 78' + '37 FF CB 73 32 FF C7 6E 2E FF C5 6A 2B FF BC 5B' + '1A FF BD 65 33 FF EE EA E9 FF DC DE DF FF E4 E4' + 'E4 FF A7 A7 A7 FF 01 01 01 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 2E 2E 2E FF E7 E7 E7 FF FF FF FF FF FE FF' + 'FF FF BD 93 7B FF BA 57 17 FF C9 71 31 FF CB 74' + '34 FF CE 7A 3A FF D2 7F 3E FF D4 84 43 FF D7 88' + '47 FF DA 8C 4A FF DC 8F 4D FF DE 93 51 FF DF 96' + '54 FF E0 98 56 FF E1 99 56 FF E1 99 56 FF E1 99' + '56 FF E0 97 55 FF DE 94 53 FF DD 91 50 FF DB 8E' + '4C FF D8 8A 48 FF D5 85 44 FF D3 81 40 FF D0 7C' + '3C FF CD 77 37 FF C9 72 32 FF C6 6D 2D FF C2 62' + '21 FF C4 70 3D FF ED EA E8 FF DE DF E0 FF E5 E5' + 'E5 FF A6 A6 A6 FF 01 01 01 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 2C 2C 2C FF E5 E5 E5 FF FF FF FF FF FD FF' + 'FF FF BE 96 7E FF C2 64 22 FF CB 74 33 FF CE 79' + '38 FF D1 7F 3E FF D5 84 43 FF D7 89 48 FF DA 8E' + '4C FF DE 92 50 FF E0 96 54 FF E2 9A 58 FF E3 9C' + '5A FF E5 9F 5C FF E6 A0 5D FF E6 A0 5D FF E5 A0' + '5D FF E4 9E 5B FF E3 9B 59 FF E1 98 56 FF DF 94' + '52 FF DC 90 4E FF D8 8B 49 FF D6 86 45 FF D3 81' + '40 FF D0 7C 3B FF CC 77 36 FF C9 70 30 FF C4 68' + '26 FF C8 76 43 FF EE EA E9 FF E1 E2 E3 FF E8 E8' + 'E8 FF A5 A5 A5 FF 00 00 00 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 2C 2C 2C FF E5 E5 E5 FF FF FF FF FF FD FF' + 'FF FF BC 94 7B FF C4 67 24 FF CD 77 37 FF D0 7C' + '3C FF D4 83 42 FF D7 88 47 FF DB 8D 4C FF DE 93' + '51 FF E1 97 56 FF E3 9C 59 FF E6 A0 5D FF E7 A3' + '60 FF E9 A6 63 FF EA A8 64 FF EA A8 64 FF E9 A7' + '64 FF E8 A5 62 FF E7 A2 5F FF E4 9E 5B FF E2 99' + '57 FF DF 95 53 FF DC 8F 4D FF D8 8A 49 FF D6 86' + '44 FF D2 80 3F FF CF 7A 3A FF CB 74 33 FF C6 6B' + '29 FF C7 76 43 FF F6 F2 F0 FF F4 F5 F6 FF F6 F6' + 'F6 FF A5 A5 A5 FF 00 00 00 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 2B 2B 2B FF E4 E4 E4 FF FF FF FF FF FD FF' + 'FF FF B7 8D 75 FF BC 5A 19 FF CF 7C 3B FF D2 80' + '3E FF D5 85 44 FF D9 8C 4A FF DD 91 4F FF E0 97' + '55 FF E3 9C 5A FF E6 A1 5E FF E9 A5 63 FF EB A9' + '66 FF ED AD 69 FF EF AF 6B FF EF AF 6C FF EE AF' + '6A FF ED AB 68 FF EA A7 65 FF E7 A3 61 FF E4 9E' + '5C FF E1 99 57 FF DE 93 52 FF DA 8E 4C FF D7 88' + '47 FF D4 82 41 FF D0 7C 3C FF CC 77 36 FF C7 6C' + '2A FF C3 6F 3D FF F7 F3 F2 FF F7 F9 FA FF FC FC' + 'FC FF A5 A5 A5 FF 00 00 00 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 2A 2A 2A FF E3 E3 E3 FF FF FF FF FF FD FF' + 'FF FF B4 88 70 FF AF 41 01 FF D0 78 34 FF D4 81' + '3E FF D8 87 43 FF DC 8D 49 FF E0 93 4F FF E3 9A' + '55 FF E7 A0 5B FF EB A5 60 FF EE AA 65 FF F1 AF' + '6A FF F3 B3 6E FF F5 B6 70 FF F5 B6 70 FF F4 B5' + '6F FF F2 B2 6C FF F0 AD 67 FF EC A7 62 FF E9 A2' + '5D FF E5 9C 58 FF E1 96 52 FF DE 90 4C FF DA 8A' + '46 FF D6 83 40 FF D2 7D 3A FF CF 78 35 FF C1 5F' + '1B FF BB 5F 2C FF F9 F5 F3 FF F9 FB FB FF FE FE' + 'FE FF A5 A5 A5 FF 00 00 00 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 2A 2A 2A FF E3 E3 E3 FF FF FF FF FF FD FF' + 'FF FF B4 95 84 FF A0 4F 23 FF B6 71 43 FF CB 89' + '53 FF CE 8D 57 FF D1 92 5B FF D4 97 61 FF D7 9D' + '66 FF DA A2 6A FF DD A7 6E FF E0 AB 73 FF E4 B0' + '78 FF E6 B4 7B FF E7 B7 7F FF E8 B7 7F FF E6 B6' + '7D FF E5 B2 7A FF E2 AE 76 FF DE A9 71 FF DC A4' + '6C FF D9 9F 68 FF D5 99 63 FF D2 94 5D FF CF 8F' + '59 FF CC 8A 54 FF CA 85 4F FF C3 7E 4A FF A7 5A' + '2C FF B3 73 4F FF FA F8 F7 FF FC FD FD FF FF FF' + 'FF FF A5 A5 A5 FF 00 00 00 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 26 26 26 FF E1 E1 E1 FF FF FF FF FF FF FF' + 'FF FF EC EC ED FF E6 E6 E7 FF E6 E5 E6 FF E9 E7' + 'E5 FF E9 E7 E5 FF E9 E7 E5 FF E9 E7 E5 FF E9 E7' + 'E5 FF E9 E8 E6 FF E9 E8 E6 FF EA E8 E6 FF EA E8' + 'E6 FF EA E8 E6 FF EA E8 E6 FF EA E8 E6 FF EA E8' + 'E6 FF EA E8 E6 FF EA E8 E6 FF E9 E8 E6 FF E8 E7' + 'E5 FF E8 E6 E4 FF E8 E6 E4 FF E8 E6 E4 FF E8 E6' + 'E4 FF E7 E5 E3 FF E7 E5 E3 FF E6 E4 E3 FF E3 E3' + 'E3 FF E9 E9 E9 FF FC FC FC FF FD FD FD FF FF FF' + 'FF FF A4 A4 A4 FF 00 00 00 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 7D 00 00' + '00 FF 0D 0D 0D FF C4 C4 C4 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FE FE FE FF FF FF FF FF FB FB' + 'FB FF 7F 7F 7F FF 00 00 00 FF 00 00 00 F2 00 00' + '00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 37 00 00' + '00 FB 00 00 00 FF 56 56 56 FF E3 E3 E3 FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FD FD FD FF AF AF' + 'AF FF 21 21 21 FF 00 00 00 FF 00 00 00 B9 00 00' + '00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 8D 00 00 00 FF 01 01 01 FF 2F 2F 2F FF 6D 6D' + '6D FF 7D 7D 7D FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C' + '7C FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C' + '7C FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C' + '7C FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C' + '7C FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C' + '7C FF 7C 7C 7C FF 7C 7C 7C FF 7B 7B 7B FF 7B 7B' + '7B FF 7B 7B 7B FF 7A 7A 7A FF 7A 7A 7A FF 7A 7A' + '7A FF 7A 7A 7A FF 77 77 77 FF 57 57 57 FF 18 18' + '18 FF 00 00 00 FF 00 00 00 FF 00 00 00 57 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 19 00 00 00 B9 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 F5 00 00 00 86 00 00 00 04 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 63 00 00 00 D0 00 00' + '00 F3 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F1 00 00 00 EF 00 00' + '00 B2 00 00 00 3D 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF F8' '00 00 1F FF 00 00 FF F0 00 00 0F FF 00 00 FF E0' '00 00 07 FF 00 00 FF E0 00 00 07 FF 00 00 FF E0' '00 00 03 FF 00 00 FF C0 00 00 03 FF 00 00 FF C0' @@ -6047,1172 +7315,7 @@ END '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' '00 00 00 07 00 00 F0 00 00 00 00 0F 00 00 F0 00' - '00 00 00 0F 00 00 FC 00 00 00 00 3F 00 00 28 00' - '00 00 20 00 00 00 40 00 00 00 01 00 08 00 00 00' - '00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 11 00 00 00 00' - '11 00 11 11 11 00 22 22 22 00 33 33 33 00 44 44' - '44 00 55 55 55 00 66 66 66 00 77 77 77 00 7F 7F' - '7F 00 99 33 00 00 99 33 33 00 CC 33 00 00 99 66' - '00 00 99 66 33 00 CC 66 00 00 CC 66 33 00 FF 66' - '33 00 CC 66 66 00 FF 66 66 00 CC 99 33 00 FF 99' - '33 00 99 99 66 00 CC 99 66 00 FF 99 66 00 CC CC' - '66 00 FF CC 66 00 88 88 88 00 99 99 99 00 AA AA' - 'AA 00 BB BB BB 00 CC 99 99 00 99 CC 99 00 CC CC' - '99 00 FF CC 99 00 99 99 CC 00 CC CC CC 00 DD DD' - 'DD 00 FF CC CC 00 FF FF CC 00 CC CC FF 00 FF CC' - 'FF 00 CC FF FF 00 EE EE EE 00 FF FF FF 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 17' - '95 00 00 00 38 00 A8 44 F9 77 13 00 00 00 18 0A' - '38 00 00 00 38 00 98 69 38 00 98 17 95 00 00 00' - '00 00 E0 19 95 00 F0 88 FA 77 70 38 F5 77 FF FF' - 'FF FF A8 44 F9 77 70 7D F5 77 3A 8A F5 77 86 00' - '00 00 86 00 00 00 08 00 00 00 B0 18 95 00 00 00' - '00 00 CB 44 F9 77 08 91 07 00 CD 8B F5 77 78 13' - '05 00 37 90 F5 77 00 00 00 00 3E 8A F5 77 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 10 00 00 00 00 00 00 00 66 00' - '68 00 00 EC FD 7F 1A 02 00 00 4C 16 95 00 10 91' - '07 00 FC 15 95 00 FF FF FF FF B4 1A 95 00 45 00' - '00 00 28 02 00 00 FF FF FF FF E2 D8 F5 77 7D 9B' - 'F5 77 94 B6 01 00 00 00 05 00 F4 17 95 00 80 00' - '10 C0 B4 1A 95 00 F0 88 FA 77 88 1C F5 77 FF FF' - 'FF FF 37 90 F5 77 00 00 00 00 3E 8A F5 77 9B B2' - 'E7 77 B7 00 00 00 02 00 00 00 A4 1A 95 00 01 00' - '00 00 18 00 00 00 00 00 00 00 10 19 95 00 42 00' - '00 00 00 00 00 00 F4 18 95 00 00 00 00 00 00 00' - '00 00 00 00 00 00 0C 00 00 00 02 00 00 00 01 01' - 'F5 77 00 EC FD 7F 66 00 00 00 00 00 00 00 03 00' - '00 00 6E 00 1A 02 10 91 07 00 00 00 00 00 10 91' - '07 00 05 00 00 00 BE B3 E7 77 4C 19 95 00 A3 B4' - 'E7 77 28 01 00 00 00 00 00 C0 00 00 00 00 00 00' - '00 00 02 00 00 00 80 00 00 00 00 00 00 00 8C 1A' - '95 00 7F E9 4B 00 D0 60 38 00 00 00 00 C0 00 00' - '00 00 80 1A 95 00 02 00 00 00 80 00 00 00 00 00' - '00 00 C0 27 95 00 C4 F5 AF 00 02 00 00 00 45 3A' - '5C 63 79 67 77 69 6E 5C 68 6F 6D 65 5C 63 76 73' - '5C 77 69 6E 65 5C 64 6C 6C 73 5C 73 68 65 6C 6C' - '33 32 5C 6D 79 63 6F 6D 70 75 74 65 72 2E 69 63' - '6F 00 1F 3B D4 77 13 00 00 00 98 00 00 00 4F 3B' - 'D4 77 E0 19 95 00 33 3B D4 77 64 C5 F5 77 A9 F1' - 'E7 77 28 01 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 1A 95 00 98 69 38 00 86 00 00 00 00 00' - '00 00 C9 F1 E7 77 86 00 00 00 A4 1A 95 00 08 00' - '00 00 00 00 00 00 86 00 00 00 86 00 00 00 08 00' - '00 00 F4 19 95 00 33 3B D4 77 B4 1A 95 00 09 48' - 'E9 77 B8 10 E9 77 FF FF FF FF C9 F1 E7 77 16 EA' - '4B 00 28 01 00 00 98 69 38 00 86 00 00 00 58 1A' - '95 00 00 00 00 00 00 00 00 00 00 00 00 00 2E 2E' - '2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 2E 2E 2E' - '2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 2E 2E 08' - '1F 1E 1E 1E 1E 1D 1D 1D 1D 1C 1C 1C 05 2E 2E 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 2E 03 26' - '2D 2C 26 26 25 25 25 1F 1F 1E 1E 1D 1C 2E 2E 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 2E 03 2C' - '2D 2C 2D 2C 2C 26 26 25 25 25 1E 1E 1C 2E 2E 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 2E 2E 26' - '2D 2D 2C 2C 2C 2C 2C 26 25 25 1E 1F 1C 2E 2E 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 2E 2E 1D' - '2D 2D 2D 2D 2C 2C 26 26 26 26 1F 25 07 2E 2E 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 2E 04' - '2C 2D 2D 2D 2C 1D 1F 2C 26 25 26 1D 2E 2E 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 2E 2E' - '06 2C 2D 2D 2D 2C 26 2C 2C 2C 1F 04 2E 2E 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2E' - '2E 05 1F 2D 2D 2D 2D 2D 26 1C 03 2E 2E 00 00 00' - '00 00 00 00 00 00 00 00 00 00 2E 2E 2E 2E 2E 2E' - '2E 2E 2E 05 08 1E 1D 07 04 2E 2E 2E 2E 2E 2E 2E' - '2E 2E 00 00 00 00 00 00 00 2E 2E 2E 2E 2E 2E 2E' - '2E 2E 2E 2E 2E 09 06 2E 2E 2E 2E 2E 2E 2E 2E 2E' - '2E 2E 2E 00 00 00 00 00 2E 2E 04 1D 1E 1E 1D 1E' - '1E 1D 1E 1D 24 25 1F 1E 1D 1D 1D 1D 1D 1D 1D 1D' - '09 03 2E 2E 00 00 00 00 2E 2E 1F 2D 2D 2D 2D 2D' - '2C 2D 2C 2B 28 26 2C 26 26 2C 26 25 26 25 26 25' - '26 09 2E 2E 00 00 00 00 2E 04 2C 2D 2A 27 28 26' - '28 29 28 27 26 2C 27 26 26 25 27 26 27 25 25 25' - '25 1E 2E 2E 00 00 00 00 2E 04 2C 2D 22 11 11 11' - '18 16 18 19 19 15 18 19 16 18 15 11 11 11 11 23' - '29 1E 2E 2E 00 00 00 00 2E 03 2C 2D 20 0E 11 15' - '11 15 13 15 18 18 19 15 13 15 11 11 0E 11 11 1F' - '25 1E 2E 2E 00 00 00 00 2E 04 2C 2D 20 0D 11 11' - '15 11 15 11 15 11 15 11 15 11 11 11 11 10 0B 25' - '26 1E 2E 2E 00 00 00 00 2E 04 2C 2D 18 0E 11 10' - '11 11 11 15 11 11 15 11 11 11 0F 11 10 0B 11 22' - '25 1F 2E 2E 00 00 00 00 2E 04 2C 2D 20 0B 10 0C' - '11 10 11 11 11 15 11 11 10 0F 11 10 0C 10 0B 27' - '26 1D 02 2E 00 00 00 00 2E 03 26 2D 18 0D 0B 11' - '0E 11 0F 11 11 11 11 11 11 11 10 0C 10 0B 0D 1F' - '2C 21 2E 2E 00 00 00 00 2E 04 2C 2D 20 0B 0B 0D' - '11 11 11 15 11 11 11 15 11 11 11 10 0B 0E 0B 23' - '29 20 01 2E 00 00 00 00 2E 03 2C 2D 18 0B 11 11' - '15 11 15 14 15 11 15 13 15 11 15 11 11 0B 0D 25' - '26 1E 2E 2E 00 00 00 00 2E 04 26 2D 18 0E 11 15' - '11 11 15 15 18 16 15 15 13 15 11 11 15 11 0B 27' - '2B 1D 2E 2E 00 00 00 00 2E 03 2C 2D 17 11 11 12' - '18 15 19 18 19 18 18 19 15 18 12 15 11 11 11 22' - '2C 1E 2E 2E 00 00 00 00 2E 04 26 2D 20 10 13 15' - '11 19 15 19 18 19 19 18 19 15 18 15 13 15 11 27' - '2C 1E 2E 2E 00 00 00 00 2E 03 26 2D 13 11 15 15' - '19 18 19 1A 19 1B 18 1B 18 19 18 12 15 11 10 26' - '2D 1E 2E 2E 00 00 00 00 2E 03 2C 2D 18 0F 11 18' - '15 19 18 19 1A 19 1B 18 19 18 15 18 11 11 0F 27' - '2D 1E 2E 2E 00 00 00 00 2E 03 26 2D 2C 2C 26 2C' - '2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 26 2D' - '2D 1E 2E 2E 00 00 00 00 2E 2E 1D 2D 2D 2D 2D 2D' - '2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D' - '2D 07 2E 2E 00 00 00 00 2E 2E 2E 07 09 08 09 09' - '08 09 09 08 09 09 08 09 08 09 09 08 09 08 09 08' - '06 2E 2E 2E 00 00 00 00 00 2E 2E 2E 2E 2E 2E 2E' - '2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E' - '2E 2E 2E 00 00 00 FF 00 00 FF FE 00 00 7F FE 00' - '00 7F FE 00 00 7F FE 00 00 7F FE 00 00 7F FE 00' - '00 7F FF 00 00 FF FF 00 00 FF FF 80 01 FF F0 00' - '00 0F E0 00 00 07 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 E0 00 00 07 28 00 00 00 10 00 00 00 20 00' - '00 00 01 00 08 00 00 00 00 00 00 01 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 11 00 00 00 00 00 11 00 11 11 11 00 22 22' - '22 00 33 33 33 00 44 44 44 00 55 55 55 00 66 66' - '66 00 77 77 77 00 7F 7F 7F 00 99 33 00 00 CC 33' - '00 00 99 66 00 00 CC 66 00 00 CC 66 33 00 CC 66' - '66 00 CC 99 33 00 99 99 66 00 CC 99 66 00 FF 99' - '66 00 FF CC 66 00 88 88 88 00 99 99 99 00 AA AA' - 'AA 00 BB BB BB 00 CC 99 99 00 CC CC 99 00 FF CC' - '99 00 99 CC CC 00 CC CC CC 00 DD DD DD 00 FF CC' - 'CC 00 CC CC FF 00 CC FF FF 00 EE EE EE 00 FF FF' - 'FF 00 00 00 00 00 DD DD DD 00 FF CC CC 00 FF FF' - 'CC 00 CC CC FF 00 FF CC FF 00 CC FF FF 00 EE EE' - 'EE 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 C0 17 95 00 00 00 38 00 A8 44' - 'F9 77 13 00 00 00 18 0A 38 00 00 00 38 00 98 69' - '38 00 98 17 95 00 00 00 00 00 E0 19 95 00 F0 88' - 'FA 77 70 38 F5 77 FF FF FF FF A8 44 F9 77 70 7D' - 'F5 77 3A 8A F5 77 86 00 00 00 86 00 00 00 08 00' - '00 00 B0 18 95 00 00 00 00 00 CB 44 F9 77 08 91' - '07 00 CD 8B F5 77 78 13 05 00 37 90 F5 77 00 00' - '00 00 3E 8A F5 77 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00' - '00 00 00 00 00 00 66 00 68 00 00 EC FD 7F 1A 02' - '00 00 4C 16 95 00 10 91 07 00 FC 15 95 00 FF FF' - 'FF FF B4 1A 95 00 45 00 00 00 28 02 00 00 FF FF' - 'FF FF E2 D8 F5 77 7D 9B F5 77 94 B6 01 00 00 00' - '05 00 F4 17 95 00 80 00 10 C0 B4 1A 95 00 F0 88' - 'FA 77 88 1C F5 77 FF FF FF FF 37 90 F5 77 00 00' - '00 00 3E 8A F5 77 9B B2 E7 77 B7 00 00 00 02 00' - '00 00 A4 1A 95 00 01 00 00 00 18 00 00 00 00 00' - '00 00 10 19 95 00 42 00 00 00 00 00 00 00 F4 18' - '95 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00' - '00 00 02 00 00 00 01 01 F5 77 00 EC FD 7F 66 00' - '00 00 00 00 00 00 03 00 00 00 6E 00 1A 02 10 91' - '07 00 00 00 00 00 10 91 07 00 05 00 00 00 BE B3' - 'E7 77 4C 19 95 00 A3 B4 E7 77 28 01 00 00 00 00' - '00 C0 00 00 00 00 00 00 00 00 02 00 00 00 80 00' - '00 00 00 00 00 00 8C 1A 95 00 7F E9 4B 00 D0 60' - '38 00 00 00 00 C0 00 00 00 00 80 1A 95 00 02 00' - '00 00 80 00 00 00 00 00 00 00 C0 27 95 00 C4 F5' - 'AF 00 02 00 00 00 45 3A 5C 63 79 67 77 69 6E 5C' - '68 6F 6D 65 5C 63 76 73 5C 77 69 6E 65 5C 64 6C' - '6C 73 5C 73 68 65 6C 6C 33 32 5C 6D 79 63 6F 6D' - '70 75 74 65 72 2E 69 63 6F 00 1F 3B D4 77 13 00' - '00 00 98 00 00 00 4F 3B D4 77 E0 19 95 00 33 3B' - 'D4 77 64 C5 F5 77 A9 F1 E7 77 28 01 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 1A 95 00 98 69' - '38 00 86 00 00 00 00 00 00 00 C9 F1 E7 77 86 00' - '00 00 A4 1A 95 00 08 00 00 00 00 00 00 00 86 00' - '00 00 86 00 00 00 08 00 00 00 F4 19 95 00 33 3B' - 'D4 77 B4 1A 95 00 09 48 E9 77 B8 10 E9 77 FF FF' - 'FF FF C9 F1 E7 77 16 EA 4B 00 28 01 00 00 98 69' - '38 00 86 00 00 00 58 1A 95 00 00 00 00 00 00 00' - '00 25 25 25 25 01 25 25 01 25 00 00 00 00 00 00' - '00 25 07 1F 19 18 18 17 16 04 25 00 00 00 00 00' - '00 25 09 24 23 23 1F 1E 19 07 25 00 00 00 00 00' - '00 25 05 24 24 23 1E 23 19 03 25 00 00 00 00 00' - '00 00 25 07 23 23 23 1E 05 25 00 00 00 00 00 25' - '25 25 25 25 02 09 08 02 25 25 25 25 25 00 00 02' - '12 21 1E 19 1D 19 1E 18 19 1D 19 08 25 00 00 03' - '23 1C 1B 1C 1C 20 1B 1C 1A 14 19 19 25 00 00 04' - '22 10 0F 0F 0F 11 11 0F 0F 0D 13 1E 01 00 00 03' - '23 11 0E 0F 0F 0F 0F 0F 0D 0C 13 1D 02 00 00 03' - '23 10 0B 0F 0F 0F 0F 0F 0F 0B 10 1E 25 00 00 03' - '23 0F 0F 0F 11 11 11 0F 0F 0E 13 19 02 00 00 03' - '23 13 0F 11 13 14 13 14 11 0F 13 1E 25 00 00 03' - '23 13 11 14 13 15 14 13 14 0F 1B 1E 25 00 00 25' - '1E 24 23 24 23 23 24 23 23 23 24 19 25 00 00 25' - '03 06 06 06 06 06 06 06 06 06 06 03 25 00 E0 0F' - '00 00 E0 07 00 00 E0 07 00 00 E0 07 00 00 F0 0F' - '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' - '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' - '00 00 80 01 00 00 80 01 00 00 80 01 00 00 28 00' - '00 00 30 00 00 00 60 00 00 00 01 00 20 00 00 00' - '00 00 00 24 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00 00' - '00 2F 00 00 00 38 00 00 00 37 00 00 00 37 00 00' - '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' - '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' - '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' - '00 37 00 00 00 37 00 00 00 38 00 00 00 2A 00 00' - '00 0B 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 43 00 00 00 B0 00 00' - '00 F4 00 00 00 F8 00 00 00 F7 00 00 00 F7 00 00' - '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' - '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' - '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' - '00 F7 00 00 00 F7 00 00 00 F8 00 00 00 DA 00 00' - '00 85 00 00 00 28 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 11 00 00 00 E2 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 01 01' - '01 FF 01 01 01 FF 01 01 01 FF 01 01 01 FF 01 01' - '01 FF 02 02 02 FF 02 02 02 FF 03 03 03 FF 04 04' - '04 FF 04 04 04 FF 03 03 03 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 AF 00 00 00 12 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 65 00 00 00 FF 20 20 20 FF 9B 9B' - '9B FF B9 B9 B9 FF B5 B5 B5 FF B2 B2 B2 FF B0 B0' - 'B0 FF AE AE AE FF AB AB AB FF A9 A9 A9 FF A7 A7' - 'A7 FF A4 A4 A4 FF A2 A2 A2 FF 9F 9F 9F FF 9C 9C' - '9C FF 9B 9B 9B FF 96 96 96 FF 8C 8C 8C FF 86 86' - '86 FF 88 88 88 FF 8E 8E 8E FF 5A 5A 5A FF 03 03' - '03 FF 00 00 00 E9 00 00 00 36 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 A6 00 00 00 FF 59 59 59 FF FF FF' - 'FF FF FA FA FA FF F1 F1 F1 FF EB EB EB FF E4 E4' - 'E4 FF E0 E0 E0 FF DC DC DC FF D8 D8 D8 FF D4 D4' - 'D4 FF D0 D0 D0 FF CB CB CB FF C7 C7 C7 FF C3 C3' - 'C3 FF BF BF BF FF BB BB BB FF B0 B0 B0 FF 9E 9E' - '9E FF 97 97 97 FF 9E 9E 9E FF B0 B0 B0 FF 25 25' - '25 FF 00 00 00 FD 00 00 00 5A 00 00 00 01 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 05 00 00 00 C6 00 00 00 FF 82 82 82 FF FF FF' - 'FF FF F7 F7 F7 FF F1 F1 F1 FF E9 E9 E9 FF E4 E4' - 'E4 FF DF DF DF FF DA DA DA FF D6 D6 D6 FF D2 D2' - 'D2 FF CE CE CE FF CA CA CA FF C7 C7 C7 FF C3 C3' - 'C3 FF BF BF BF FF BB BB BB FF B8 B8 B8 FF A9 A9' - 'A9 FF 9C 9C 9C FF 98 98 98 FF AF AF AF FF 3D 3D' - '3D FF 00 00 00 FF 00 00 00 7C 00 00 00 01 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 09 00 00 00 D4 00 00 00 FF 92 92 92 FF FF FF' - 'FF FF FF FF FF FF F9 F9 F9 FF F6 F6 F6 FF F6 F6' - 'F6 FF F3 F3 F3 FF EF EF EF FF EC EC EC FF E6 E6' - 'E6 FF E1 E1 E1 FF DC DC DC FF D6 D6 D6 FF D1 D1' - 'D1 FF CC CC CC FF C6 C6 C6 FF C3 C3 C3 FF AF AF' - 'AF FF A5 A5 A5 FF A8 A8 A8 FF B6 B6 B6 FF 44 44' - '44 FF 00 00 00 FF 00 00 00 85 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 B5 00 00 00 FF 84 84 84 FF FF FF' - 'FF FF FF FF FF FF F7 F7 F7 FF FB FB FB FF FD FD' - 'FD FF FC FC FC FF FC FC FC FF FA FA FA FF F8 F8' - 'F8 FF F1 F1 F1 FF EB EB EB FF E5 E5 E5 FF DF DF' - 'DF FF D9 D9 D9 FF D3 D3 D3 FF CF CF CF FF B5 B5' - 'B5 FF A3 A3 A3 FF AD AD AD FF BB BB BB FF 3D 3D' - '3D FF 00 00 00 FF 00 00 00 68 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 88 00 00 00 FF 5F 5F 5F FF FF FF' - 'FF FF FF FF FF FF FB FB FB FF EF EF EF FF EE EE' - 'EE FF E9 E9 E9 FF E3 E3 E3 FF DF DF DF FF DD DD' - 'DD FF DA DA DA FF D5 D5 D5 FF D0 D0 D0 FF CC CC' - 'CC FF C7 C7 C7 FF C3 C3 C3 FF BE BE BE FF B0 B0' - 'B0 FF B2 B2 B2 FF B4 B4 B4 FF BA BA BA FF 28 28' - '28 FF 00 00 00 F7 00 00 00 3C 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 34 00 00 00 FA 2E 2E 2E FF ED ED' - 'ED FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FE FE FE FF FA FA FA FF F5 F5 F5 FF F4 F4' - 'F4 FF EF EF EF FF EB EB EB FF E5 E5 E5 FF E0 E0' - 'E0 FF DC DC DC FF D8 D8 D8 FF D2 D2 D2 FF C2 C2' - 'C2 FF BA BA BA FF C1 C1 C1 FF 97 97 97 FF 0A 0A' - '0A FF 00 00 00 D5 00 00 00 19 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 04 00 00 00 C8 04 04 04 FF 97 97' - '97 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FD FD FD FF DF DF' - 'DF FF BE BE BE FF C4 C4 C4 FF E4 E4 E4 FF E6 E6' - 'E6 FF E1 E1 E1 FF DD DD DD FF D1 D1 D1 FF C5 C5' - 'C5 FF C2 C2 C2 FF BF BF BF FF 43 43 43 FF 00 00' - '00 FF 00 00 00 9A 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 6C 00 00 00 FF 18 18' - '18 FF D1 D1 D1 FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FE FE FE FF B2 B2' - 'B2 FF 9D 9D 9D FF 98 98 98 FF D1 D1 D1 FF ED ED' - 'ED FF E5 E5 E5 FF DF DF DF FF D1 D1 D1 FF CC CC' - 'CC FF D5 D5 D5 FF 84 84 84 FF 00 00 00 FF 00 00' - '00 E2 00 00 00 29 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 96 00 00' - '00 FF 3E 3E 3E FF D1 D1 D1 FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF ED ED' - 'ED FF DE DE DE FF E1 E1 E1 FF EC EC EC FF EE EE' - 'EE FF E7 E7 E7 FF DC DC DC FF DC DC DC FF D7 D7' - 'D7 FF 7B 7B 7B FF 14 14 14 FF 00 00 00 FF 00 00' - '00 5F 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 1A 00 00' - '00 C6 00 00 00 FF 35 35 35 FF C3 C3 C3 FF F9 F9' - 'F9 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FC FC FC FF FC FC FC FF F7 F7 F7 FF F0 F0' - 'F0 FF EC EC EC FF EB EB EB FF CF CF CF FF 77 77' - '77 FF 07 07 07 FF 00 00 00 FD 00 00 00 8F 00 00' - '00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 05 00 00 00 B6 00 00 00 FF 08 08 08 FF 58 58' - '58 FF CB CB CB FF FD FD FD FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF F9 F9' - 'F9 FF E3 E3 E3 FF 9E 9E 9E FF 31 31 31 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 80 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 01 00 00 00 0C 00 00 00 14 00 00' - '00 14 00 00 00 14 00 00 00 14 00 00 00 14 00 00' - '00 0E 00 00 00 1F 00 00 00 7B 00 00 00 E9 00 00' - '00 FF 10 10 10 FF 3E 3E 3E FF 69 69 69 FF 89 89' - '89 FF B1 B1 B1 FF A2 A2 A2 FF 7E 7E 7E FF 57 57' - '57 FF 2C 2C 2C FF 04 04 04 FF 00 00 00 FF 00 00' - '00 BF 00 00 00 4F 00 00 00 14 00 00 00 11 00 00' - '00 14 00 00 00 14 00 00 00 14 00 00 00 14 00 00' - '00 14 00 00 00 0C 00 00 00 05 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00' - '00 4C 00 00 00 8A 00 00 00 AD 00 00 00 BB 00 00' - '00 B9 00 00 00 B9 00 00 00 B9 00 00 00 B9 00 00' - '00 B9 00 00 00 B5 00 00 00 AB 00 00 00 D1 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 04 04' - '04 FF 7E 7E 7E FF 4B 4B 4B FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 F1 00 00' - '00 BA 00 00 00 AF 00 00 00 B7 00 00 00 B9 00 00' - '00 B9 00 00 00 B9 00 00 00 B9 00 00 00 B9 00 00' - '00 B8 00 00 00 A5 00 00 00 85 00 00 00 43 00 00' - '00 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 06 00 00 00 95 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 54 54' - '54 FF BD BD BD FF 8A 8A 8A FF 1B 1B 1B FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 F0 00 00' - '00 69 00 00 00 0D 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 7A 00 00 00 FF 04 04' - '04 FF 5A 5A 5A FF A7 A7 A7 FF AD AD AD FF AB AB' - 'AB FF AA AA AA FF AA AA AA FF AA AA AA FF A9 A9' - 'A9 FF A9 A9 A9 FF A8 A8 A8 FF A8 A8 A8 FF A8 A8' - 'A8 FF A7 A7 A7 FF A6 A6 A6 FF A9 A9 A9 FF C5 C5' - 'C5 FF D3 D3 D3 FF C6 C6 C6 FF B4 B4 B4 FF A3 A3' - 'A3 FF A3 A3 A3 FF A3 A3 A3 FF A2 A2 A2 FF A1 A1' - 'A1 FF A1 A1 A1 FF A1 A1 A1 FF A0 A0 A0 FF A0 A0' - 'A0 FF 9F 9F 9F FF 9F 9F 9F FF 9E 9E 9E FF A1 A1' - 'A1 FF 94 94 94 FF 31 31 31 FF 00 00 00 FF 00 00' - '00 F6 00 00 00 5C 00 00 00 04 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 28 00 00 00 EA 00 00 00 FF 78 78' - '78 FF FA FA FA FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FE FE FE FF FB FB FB FF FA FA FA FF F8 F8' - 'F8 FF F7 F7 F7 FF F4 F4 F4 FF F3 F3 F3 FF F2 F2' - 'F2 FF F0 F0 F0 FF EF EF EF FF EC EC EC FF E6 E6' - 'E6 FF E2 E2 E2 FF E2 E2 E2 FF E3 E3 E3 FF E4 E4' - 'E4 FF E2 E2 E2 FF E0 E0 E0 FF DE DE DE FF DC DC' - 'DC FF DB DB DB FF D9 D9 D9 FF D8 D8 D8 FF D6 D6' - 'D6 FF D4 D4 D4 FF D3 D3 D3 FF D0 D0 D0 FF CF CF' - 'CF FF DD DD DD FF CB CB CB FF 39 39 39 FF 00 00' - '00 FF 00 00 00 AF 00 00 00 17 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 78 00 00 00 FF 17 17 17 FF DF DF' - 'DF FF FF FF FF FF F7 F7 F7 FF F6 F8 F8 FF F5 F6' - 'F8 FF F3 F4 F5 FF F1 F3 F4 FF EF F0 F2 FF ED EF' - 'F0 FF EC ED EE FF E9 EA EB FF E8 E9 EA FF E6 E7' - 'E9 FF E4 E6 E7 FF E2 E3 E4 FF E0 E1 E3 FF DF E0' - 'E1 FF DD DE DF FF DB DC DD FF D9 DB DC FF D8 D8' - 'D9 FF D6 D7 D8 FF D4 D5 D7 FF D2 D4 D4 FF D0 D1' - 'D3 FF CE D0 D1 FF CD CE CF FF CB CD CE FF CA CB' - 'CD FF C7 C9 CA FF C6 C8 C9 FF C4 C6 C7 FF C2 C3' - 'C3 FF C0 C0 C0 FF D9 D9 D9 FF A4 A4 A4 FF 00 00' - '00 FF 00 00 00 EE 00 00 00 33 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 84 00 00 00 FF 39 39 39 FF F0 F0' - 'F0 FF FF FF FF FF F9 F9 F9 FF F6 F0 EB FF F5 EF' - 'EA FF F5 EE EA FF F3 EE E9 FF F3 ED E9 FF F2 EC' - 'E8 FF F2 EC E8 FF F0 EC E6 FF F0 EB E6 FF F0 EA' - 'E6 FF EF EA E4 FF ED E8 E4 FF ED E8 E3 FF EC E7' - 'E2 FF EB E6 E1 FF E9 E5 E0 FF E8 E4 DF FF E7 E2' - 'DD FF E6 E1 DC FF E5 DF DB FF E3 DE D9 FF E2 DD' - 'D8 FF E1 DB D6 FF DF DA D4 FF DE D8 D3 FF DD D7' - 'D2 FF DB D5 D0 FF D9 D3 CE FF DB D5 D2 FF D3 D2' - 'D2 FF C3 C3 C3 FF CB CB CB FF AE AE AE FF 05 05' - '05 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 84 00 00 00 FF 3C 3C 3C FF F1 F1' - 'F1 FF FF FF FF FF FB FF FF FF E2 CA B9 FF D8 9B' - '70 FF DC A2 79 FF DE A7 7D FF E1 AA 81 FF E3 AF' - '85 FF E5 B2 88 FF E8 B6 8C FF E9 B9 8E FF EB BB' - '91 FF ED BE 94 FF EE C0 95 FF EF C1 96 FF EF C2' - '97 FF EF C2 97 FF EE C1 97 FF EE C0 95 FF EC BE' - '93 FF EB BB 90 FF E9 B8 8E FF E7 B5 8B FF E5 B1' - '87 FF E3 AE 84 FF E1 AA 81 FF DF A6 7D FF DC A2' - '79 FF D9 9E 75 FF D6 97 6E FF E0 AB 8B FF E5 E3' - 'E2 FF C4 C5 C6 FF CC CC CC FF AB AB AB FF 06 06' - '06 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 84 00 00 00 FF 3A 3A 3A FF F1 F1' - 'F1 FF FF FF FF FF FD FF FF FF D0 A9 90 FF BC 56' - '11 FF C3 63 1F FF C6 69 26 FF CA 70 2C FF CD 76' - '32 FF D1 7B 37 FF D4 81 3D FF D7 86 41 FF D9 89' - '44 FF DC 8D 48 FF DD 90 4A FF DF 92 4D FF DF 93' - '4D FF DF 93 4D FF DE 91 4C FF DD 90 4A FF DB 8C' - '46 FF D8 88 43 FF D6 83 3F FF D3 7E 3A FF D0 78' - '34 FF CC 73 2F FF C8 6D 2A FF C5 67 24 FF C1 61' - '1E FF BD 5A 17 FF B6 4E 0A FF C4 6F 38 FF E5 E2' - 'E0 FF C7 C8 C9 FF CF CF CF FF AC AC AC FF 05 05' - '05 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 84 00 00 00 FF 39 39 39 FF F0 F0' - 'F0 FF FF FF FF FF FF FF FF FF D1 AC 94 FF BC 5A' - '19 FF C2 66 26 FF C6 6C 2C FF CA 72 32 FF CD 77' - '37 FF D0 7C 3C FF D3 81 40 FF D5 85 44 FF D7 88' - '47 FF D9 8C 4A FF DA 8E 4C FF DC 8F 4D FF DC 90' - '4E FF DC 90 4E FF DB 8F 4D FF DA 8D 4B FF D9 8A' - '49 FF D6 87 46 FF D4 83 42 FF D1 7F 3E FF CE 7A' - '39 FF CB 75 34 FF C8 70 30 FF C5 6A 2B FF C1 64' - '25 FF BD 5E 1F FF B7 53 12 FF C6 73 3F FF E6 E3' - 'E1 FF C8 C9 CA FF D0 D0 D0 FF AC AC AC FF 05 05' - '05 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 84 00 00 00 FF 38 38 38 FF F0 F0' - 'F0 FF FF FF FF FF FF FF FF FF D1 AB 92 FF B9 55' - '14 FF BF 61 22 FF C3 67 28 FF C6 6D 2D FF CA 71' - '31 FF CC 76 36 FF CF 7B 3A FF D1 7E 3D FF D3 81' - '40 FF D5 85 44 FF D6 87 45 FF D7 88 47 FF D7 89' - '47 FF D7 89 47 FF D7 87 47 FF D6 86 45 FF D4 83' - '42 FF D2 80 3F FF D0 7D 3C FF CE 79 38 FF CB 74' - '34 FF C8 6F 2F FF C5 6A 2B FF C2 65 26 FF BE 60' - '21 FF BA 5A 1B FF B4 4E 0F FF C4 70 3C FF E6 E3' - 'E2 FF CA CB CC FF D2 D2 D2 FF AC AC AC FF 05 05' - '05 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 84 00 00 00 FF 38 38 38 FF F0 F0' - 'F0 FF FF FF FF FF FF FF FF FF D0 A9 91 FF B7 51' - '10 FF BD 5C 1D FF C0 62 23 FF C3 67 28 FF C6 6C' - '2C FF C9 71 30 FF CB 75 34 FF CE 78 37 FF CF 7B' - '3A FF D0 7E 3D FF D1 7F 3E FF D2 81 40 FF D3 81' - '40 FF D2 81 40 FF D2 80 3F FF D1 7F 3E FF D0 7C' - '3C FF CE 79 39 FF CD 76 36 FF CA 73 32 FF C7 6E' - '2E FF C5 6A 2A FF C2 66 26 FF BF 60 21 FF BC 5B' - '1C FF B8 55 17 FF B2 4A 0A FF C2 6C 39 FF E7 E4' - 'E3 FF CC CD CE FF D4 D4 D4 FF AB AB AB FF 04 04' - '04 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 84 00 00 00 FF 36 36 36 FF EF EF' - 'EF FF FF FF FF FF FF FF FF FF CE A7 8F FF B3 4C' - '0B FF B9 58 18 FF BC 5D 1E FF C0 62 23 FF C3 66' - '27 FF C5 6A 2B FF C7 6E 2E FF C9 71 31 FF CB 74' - '33 FF CC 76 36 FF CD 78 37 FF CE 79 39 FF CE 79' - '39 FF CE 79 39 FF CE 79 38 FF CD 77 37 FF CC 75' - '35 FF CA 72 32 FF C8 70 30 FF C6 6C 2D FF C3 68' - '29 FF C1 64 25 FF BE 60 21 FF BC 5B 1C FF B8 56' - '18 FF B5 50 12 FF AF 45 05 FF BF 68 35 FF E8 E5' - 'E3 FF CD CF D0 FF D6 D6 D6 FF AB AB AB FF 04 04' - '04 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 84 00 00 00 FF 36 36 36 FF EE EE' - 'EE FF FF FF FF FF FF FF FF FF CC A4 8C FF B0 46' - '06 FF B6 51 13 FF B9 57 18 FF BC 5B 1D FF BF 60' - '21 FF C1 64 24 FF C3 67 28 FF C5 6A 2B FF C6 6D' - '2D FF C8 6F 2F FF C9 70 30 FF C9 72 32 FF C9 72' - '32 FF C9 72 32 FF C9 72 31 FF C8 70 30 FF C7 6E' - '2E FF C6 6B 2C FF C4 69 2A FF C2 66 26 FF BF 62' - '22 FF BD 5E 1F FF BA 5A 1B FF B8 55 17 FF B5 50' - '12 FF B2 4B 0D FF AC 40 00 FF BC 64 31 FF E9 E5' - 'E4 FF D0 D1 D2 FF D8 D8 D8 FF AA AA AA FF 04 04' - '04 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 84 00 00 00 FF 35 35 35 FF ED ED' - 'ED FF FF FF FF FF FF FF FF FF CA A0 88 FF AD 40' - '00 FF B3 4C 0E FF B5 51 13 FF B8 56 17 FF BB 5A' - '1B FF BD 5D 1E FF BF 61 21 FF C0 63 24 FF C1 65' - '25 FF C2 67 28 FF C3 69 29 FF C5 69 2A FF C5 6A' - '2A FF C5 6A 2A FF C4 69 29 FF C4 68 28 FF C2 66' - '27 FF C0 64 24 FF BF 61 22 FF BE 5E 20 FF BC 5B' - '1D FF BA 58 19 FF B7 54 16 FF B5 50 12 FF B2 4B' - '0D FF AF 46 08 FF A8 3B 00 FF BB 62 30 FF EA E7' - 'E5 FF D1 D3 D4 FF D9 D9 D9 FF AA AA AA FF 03 03' - '03 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 84 00 00 00 FF 34 34 34 FF EC EC' - 'EC FF FF FF FF FF FF FF FF FF C6 9D 85 FF A9 3A' - '00 FF AF 46 09 FF B2 4B 0E FF B4 4F 12 FF B6 53' - '15 FF B8 55 17 FF B9 58 19 FF BB 5C 1D FF BF 60' - '22 FF C2 66 27 FF C4 68 29 FF C5 6A 2A FF C5 6B' - '2B FF C5 6B 2B FF C5 6B 2B FF C5 69 2A FF C3 68' - '29 FF C1 65 26 FF BF 60 22 FF BB 59 1B FF B7 54' - '15 FF B4 4F 11 FF B3 4D 0F FF B1 4A 0C FF AE 45' - '08 FF AB 40 03 FF A6 38 00 FF BA 61 2F FF EA E7' - 'E6 FF D3 D4 D5 FF DB DB DB FF A9 A9 A9 FF 03 03' - '03 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 84 00 00 00 FF 33 33 33 FF EC EC' - 'EC FF FF FF FF FF FF FF FF FF C4 9A 83 FF A6 37' - '00 FF AC 40 03 FF AE 45 07 FF AF 47 0A FF B3 4D' - '0F FF B9 57 18 FF BE 5F 20 FF C4 68 29 FF C6 6D' - '2D FF C8 70 30 FF CA 72 31 FF CA 73 33 FF CB 74' - '33 FF CB 74 33 FF CB 73 33 FF CA 73 32 FF C9 71' - '31 FF C8 70 30 FF C7 6D 2D FF C4 69 2A FF BF 60' - '22 FF B8 56 18 FF B3 4D 0F FF AC 42 04 FF AA 3F' - '02 FF A9 3E 01 FF A6 38 00 FF BA 61 2F FF EB E8' - 'E6 FF D5 D6 D7 FF DC DC DC FF A9 A9 A9 FF 03 03' - '03 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 84 00 00 00 FF 32 32 32 FF EB EB' - 'EB FF FF FF FF FF FF FF FF FF C3 99 81 FF A6 37' - '00 FF A9 3D 00 FF A9 3D 00 FF B1 49 0C FF C0 63' - '24 FF C6 6D 2D FF C9 71 31 FF CA 74 33 FF CB 75' - '35 FF CD 78 37 FF CE 79 39 FF CF 7B 3A FF CF 7B' - '3B FF CF 7B 3B FF CF 7B 3A FF CE 7A 3A FF CD 79' - '38 FF CC 76 36 FF CB 74 34 FF C9 71 32 FF C7 6E' - '2F FF C6 6B 2B FF C2 66 27 FF B7 54 16 FF AA 40' - '03 FF A8 3C 00 FF A6 38 00 FF BA 61 2F FF EC E9' - 'E7 FF D7 D9 D9 FF DF DF DF FF A8 A8 A8 FF 02 02' - '02 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 84 00 00 00 FF 31 31 31 FF EA EA' - 'EA FF FF FF FF FF FF FF FF FF C2 98 80 FF A5 36' - '00 FF A8 3C 00 FF B7 55 17 FF C4 6A 2A FF C8 70' - '31 FF CA 73 33 FF CD 76 36 FF CE 79 39 FF D0 7C' - '3B FF D1 7F 3E FF D2 80 3F FF D3 82 41 FF D3 83' - '42 FF D3 83 42 FF D3 82 41 FF D3 81 40 FF D2 80' - '3F FF D0 7D 3C FF CF 7B 3A FF CD 78 37 FF CB 74' - '34 FF C9 71 30 FF C7 6E 2E FF C5 6A 2B FF BE 5F' - '20 FF B0 4A 0C FF A5 36 00 FF BA 61 2F FF EC E9' - 'E8 FF D8 DA DA FF E0 E0 E0 FF A7 A7 A7 FF 02 02' - '02 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 84 00 00 00 FF 30 30 30 FF E9 E9' - 'E9 FF FF FF FF FF FF FF FF FF C0 96 7E FF A6 37' - '00 FF B8 55 17 FF C7 6D 2E FF C9 71 31 FF CC 75' - '35 FF CD 79 39 FF D0 7D 3C FF D2 80 3F FF D3 83' - '42 FF D5 86 44 FF D7 87 46 FF D8 89 48 FF D8 8A' - '48 FF D8 8A 48 FF D8 89 48 FF D7 88 47 FF D6 87' - '45 FF D5 84 43 FF D3 82 41 FF D1 7E 3D FF CE 7A' - '3A FF CD 77 36 FF CA 73 33 FF C7 6E 2E FF C5 6B' - '2B FF C0 63 23 FF AD 41 02 FF BA 60 2E FF ED EA' - 'E9 FF DA DC DD FF E2 E2 E2 FF A7 A7 A7 FF 02 02' - '02 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 84 00 00 00 FF 2F 2F 2F FF E8 E8' - 'E8 FF FF FF FF FF FE FF FF FF BD 92 7B FF AF 45' - '05 FF C7 6D 2D FF C9 71 31 FF CC 76 35 FF CF 7A' - '3A FF D1 7E 3E FF D4 83 42 FF D6 86 46 FF D8 8A' - '48 FF DA 8D 4B FF DB 8F 4D FF DC 90 4E FF DC 91' - '50 FF DC 91 50 FF DC 91 4F FF DC 90 4E FF DA 8E' - '4C FF D9 8B 49 FF D7 88 47 FF D5 84 43 FF D2 80' - '3F FF D0 7C 3B FF CD 78 37 FF CB 73 32 FF C7 6E' - '2E FF C5 6A 2B FF BC 5B 1A FF BD 65 33 FF EE EA' - 'E9 FF DC DE DF FF E4 E4 E4 FF A7 A7 A7 FF 01 01' - '01 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 84 00 00 00 FF 2E 2E 2E FF E7 E7' - 'E7 FF FF FF FF FF FE FF FF FF BD 93 7B FF BA 57' - '17 FF C9 71 31 FF CB 74 34 FF CE 7A 3A FF D2 7F' - '3E FF D4 84 43 FF D7 88 47 FF DA 8C 4A FF DC 8F' - '4D FF DE 93 51 FF DF 96 54 FF E0 98 56 FF E1 99' - '56 FF E1 99 56 FF E1 99 56 FF E0 97 55 FF DE 94' - '53 FF DD 91 50 FF DB 8E 4C FF D8 8A 48 FF D5 85' - '44 FF D3 81 40 FF D0 7C 3C FF CD 77 37 FF C9 72' - '32 FF C6 6D 2D FF C2 62 21 FF C4 70 3D FF ED EA' - 'E8 FF DE DF E0 FF E5 E5 E5 FF A6 A6 A6 FF 01 01' - '01 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 84 00 00 00 FF 2C 2C 2C FF E5 E5' - 'E5 FF FF FF FF FF FD FF FF FF BE 96 7E FF C2 64' - '22 FF CB 74 33 FF CE 79 38 FF D1 7F 3E FF D5 84' - '43 FF D7 89 48 FF DA 8E 4C FF DE 92 50 FF E0 96' - '54 FF E2 9A 58 FF E3 9C 5A FF E5 9F 5C FF E6 A0' - '5D FF E6 A0 5D FF E5 A0 5D FF E4 9E 5B FF E3 9B' - '59 FF E1 98 56 FF DF 94 52 FF DC 90 4E FF D8 8B' - '49 FF D6 86 45 FF D3 81 40 FF D0 7C 3B FF CC 77' - '36 FF C9 70 30 FF C4 68 26 FF C8 76 43 FF EE EA' - 'E9 FF E1 E2 E3 FF E8 E8 E8 FF A5 A5 A5 FF 00 00' - '00 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 84 00 00 00 FF 2C 2C 2C FF E5 E5' - 'E5 FF FF FF FF FF FD FF FF FF BC 94 7B FF C4 67' - '24 FF CD 77 37 FF D0 7C 3C FF D4 83 42 FF D7 88' - '47 FF DB 8D 4C FF DE 93 51 FF E1 97 56 FF E3 9C' - '59 FF E6 A0 5D FF E7 A3 60 FF E9 A6 63 FF EA A8' - '64 FF EA A8 64 FF E9 A7 64 FF E8 A5 62 FF E7 A2' - '5F FF E4 9E 5B FF E2 99 57 FF DF 95 53 FF DC 8F' - '4D FF D8 8A 49 FF D6 86 44 FF D2 80 3F FF CF 7A' - '3A FF CB 74 33 FF C6 6B 29 FF C7 76 43 FF F6 F2' - 'F0 FF F4 F5 F6 FF F6 F6 F6 FF A5 A5 A5 FF 00 00' - '00 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 84 00 00 00 FF 2B 2B 2B FF E4 E4' - 'E4 FF FF FF FF FF FD FF FF FF B7 8D 75 FF BC 5A' - '19 FF CF 7C 3B FF D2 80 3E FF D5 85 44 FF D9 8C' - '4A FF DD 91 4F FF E0 97 55 FF E3 9C 5A FF E6 A1' - '5E FF E9 A5 63 FF EB A9 66 FF ED AD 69 FF EF AF' - '6B FF EF AF 6C FF EE AF 6A FF ED AB 68 FF EA A7' - '65 FF E7 A3 61 FF E4 9E 5C FF E1 99 57 FF DE 93' - '52 FF DA 8E 4C FF D7 88 47 FF D4 82 41 FF D0 7C' - '3C FF CC 77 36 FF C7 6C 2A FF C3 6F 3D FF F7 F3' - 'F2 FF F7 F9 FA FF FC FC FC FF A5 A5 A5 FF 00 00' - '00 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 84 00 00 00 FF 2A 2A 2A FF E3 E3' - 'E3 FF FF FF FF FF FD FF FF FF B4 88 70 FF AF 41' - '01 FF D0 78 34 FF D4 81 3E FF D8 87 43 FF DC 8D' - '49 FF E0 93 4F FF E3 9A 55 FF E7 A0 5B FF EB A5' - '60 FF EE AA 65 FF F1 AF 6A FF F3 B3 6E FF F5 B6' - '70 FF F5 B6 70 FF F4 B5 6F FF F2 B2 6C FF F0 AD' - '67 FF EC A7 62 FF E9 A2 5D FF E5 9C 58 FF E1 96' - '52 FF DE 90 4C FF DA 8A 46 FF D6 83 40 FF D2 7D' - '3A FF CF 78 35 FF C1 5F 1B FF BB 5F 2C FF F9 F5' - 'F3 FF F9 FB FB FF FE FE FE FF A5 A5 A5 FF 00 00' - '00 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 84 00 00 00 FF 2A 2A 2A FF E3 E3' - 'E3 FF FF FF FF FF FD FF FF FF B4 95 84 FF A0 4F' - '23 FF B6 71 43 FF CB 89 53 FF CE 8D 57 FF D1 92' - '5B FF D4 97 61 FF D7 9D 66 FF DA A2 6A FF DD A7' - '6E FF E0 AB 73 FF E4 B0 78 FF E6 B4 7B FF E7 B7' - '7F FF E8 B7 7F FF E6 B6 7D FF E5 B2 7A FF E2 AE' - '76 FF DE A9 71 FF DC A4 6C FF D9 9F 68 FF D5 99' - '63 FF D2 94 5D FF CF 8F 59 FF CC 8A 54 FF CA 85' - '4F FF C3 7E 4A FF A7 5A 2C FF B3 73 4F FF FA F8' - 'F7 FF FC FD FD FF FF FF FF FF A5 A5 A5 FF 00 00' - '00 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 84 00 00 00 FF 26 26 26 FF E1 E1' - 'E1 FF FF FF FF FF FF FF FF FF EC EC ED FF E6 E6' - 'E7 FF E6 E5 E6 FF E9 E7 E5 FF E9 E7 E5 FF E9 E7' - 'E5 FF E9 E7 E5 FF E9 E7 E5 FF E9 E8 E6 FF E9 E8' - 'E6 FF EA E8 E6 FF EA E8 E6 FF EA E8 E6 FF EA E8' - 'E6 FF EA E8 E6 FF EA E8 E6 FF EA E8 E6 FF EA E8' - 'E6 FF E9 E8 E6 FF E8 E7 E5 FF E8 E6 E4 FF E8 E6' - 'E4 FF E8 E6 E4 FF E8 E6 E4 FF E7 E5 E3 FF E7 E5' - 'E3 FF E6 E4 E3 FF E3 E3 E3 FF E9 E9 E9 FF FC FC' - 'FC FF FD FD FD FF FF FF FF FF A4 A4 A4 FF 00 00' - '00 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 7D 00 00 00 FF 0D 0D 0D FF C4 C4' - 'C4 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FE FE' - 'FE FF FF FF FF FF FB FB FB FF 7F 7F 7F FF 00 00' - '00 FF 00 00 00 F2 00 00 00 30 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 37 00 00 00 FB 00 00 00 FF 56 56' - '56 FF E3 E3 E3 FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FD FD FD FF AF AF AF FF 21 21 21 FF 00 00' - '00 FF 00 00 00 B9 00 00 00 10 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 8D 00 00 00 FF 01 01' - '01 FF 2F 2F 2F FF 6D 6D 6D FF 7D 7D 7D FF 7C 7C' - '7C FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C' - '7C FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C' - '7C FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C' - '7C FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C' - '7C FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C' - '7C FF 7B 7B 7B FF 7B 7B 7B FF 7B 7B 7B FF 7A 7A' - '7A FF 7A 7A 7A FF 7A 7A 7A FF 7A 7A 7A FF 77 77' - '77 FF 57 57 57 FF 18 18 18 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 57 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 19 00 00 00 B9 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 F5 00 00' - '00 86 00 00 00 04 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 63 00 00 00 D0 00 00 00 F3 00 00 00 F0 00 00' - '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' - '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' - '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' - '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' - '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' - '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' - '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' - '00 F1 00 00 00 EF 00 00 00 B2 00 00 00 3D 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 FF F8 00 00 1F FF 00 00 FF F0' - '00 00 0F FF 00 00 FF E0 00 00 07 FF 00 00 FF E0' - '00 00 07 FF 00 00 FF E0 00 00 03 FF 00 00 FF C0' - '00 00 03 FF 00 00 FF C0 00 00 07 FF 00 00 FF E0' - '00 00 07 FF 00 00 FF E0 00 00 07 FF 00 00 FF E0' - '00 00 07 FF 00 00 FF E0 00 00 0F FF 00 00 FF F0' - '00 00 0F FF 00 00 FF F8 00 00 1F FF 00 00 FF F8' - '00 00 1F FF 00 00 FF FC 00 00 7F FF 00 00 FE 00' - '00 00 00 7F 00 00 F8 00 00 00 00 1F 00 00 F0 00' - '00 00 00 0F 00 00 F0 00 00 00 00 07 00 00 E0 00' - '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' - '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' - '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' - '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' - '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' - '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' - '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' - '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' - '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' - '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' - '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' - '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' - '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 F0 00' - '00 00 00 0F 00 00 F0 00 00 00 00 0F 00 00 FC 00' - '00 00 00 3F 00 00 28 00 00 00 20 00 00 00 40 00' - '00 00 01 00 20 00 00 00 00 00 00 10 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 0B 00 00 00 4B 00 00 00 63 00 00 00 61 00 00' - '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' - '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' - '00 61 00 00 00 63 00 00 00 3D 00 00 00 05 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00' - '00 AF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 01 01 01 FF 01 01 01 FF 01 01 01 FF 02 02' - '02 FF 02 02 02 FF 02 02 02 FF 03 03 03 FF 05 05' - '05 FF 03 03 03 FF 00 00 00 FA 00 00 00 80 00 00' - '00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 3E 00 00' - '00 FD 6E 6E 6E FF B7 B7 B7 FF AD AD AD FF A9 A9' - 'A9 FF A5 A5 A5 FF A2 A2 A2 FF 9F 9F 9F FF 9B 9B' - '9B FF 97 97 97 FF 94 94 94 FF 8C 8C 8C FF 83 83' - '83 FF 85 85 85 FF 38 38 38 FF 00 00 00 EA 00 00' - '00 27 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 67 0F 0F' - '0F FF D8 D8 D8 FF FF FF FF FF ED ED ED FF E2 E2' - 'E2 FF DB DB DB FF D3 D3 D3 FF CD CD CD FF C8 C8' - 'C8 FF C2 C2 C2 FF BC BC BC FF B4 B4 B4 FF 9F 9F' - '9F FF A2 A2 A2 FF 7F 7F 7F FF 00 00 00 FD 00 00' - '00 47 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 72 1B 1B' - '1B FF E6 E6 E6 FF FF FF FF FF F6 F6 F6 FF F5 F5' - 'F5 FF F1 F1 F1 FF EC EC EC FF E4 E4 E4 FF DC DC' - 'DC FF D4 D4 D4 FF CC CC CC FF C5 C5 C5 FF AB AB' - 'AB FF AD AD AD FF 90 90 90 FF 04 04 04 FF 00 00' - '00 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 56 0D 0D' - '0D FF D4 D4 D4 FF FF FF FF FF F7 F7 F7 FF F8 F8' - 'F8 FF F3 F3 F3 FF F0 F0 F0 FF EC EC EC FF E3 E3' - 'E3 FF DA DA DA FF D2 D2 D2 FF CA CA CA FF B0 B0' - 'B0 FF B8 B8 B8 FF 82 82 82 FF 00 00 00 F8 00 00' - '00 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 1F 00 00' - '00 ED 94 94 94 FF FF FF FF FF FE FE FE FF FD FD' - 'FD FF FA FA FA FF F3 F3 F3 FF E5 E5 E5 FF E1 E1' - 'E1 FF E0 E0 E0 FF DA DA DA FF D1 D1 D1 FF BF BF' - 'BF FF C5 C5 C5 FF 52 52 52 FF 00 00 00 CD 00 00' - '00 0D 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 97 29 29 29 FF E4 E4 E4 FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF F0 F0 F0 FF AB AB AB FF B4 B4' - 'B4 FF E8 E8 E8 FF E4 E4 E4 FF D5 D5 D5 FF D3 D3' - 'D3 FF 9D 9D 9D FF 0C 0C 0C FF 00 00 00 6C 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 1C 00 00 00 D8 4C 4C 4C FF EC EC EC FF FF FF' - 'FF FF FF FF FF FF FA FA FA FF E2 E2 E2 FF E3 E3' - 'E3 FF F0 F0 F0 FF EA EA EA FF E6 E6 E6 FF B1 B1' - 'B1 FF 23 23 23 FF 00 00 00 B7 00 00 00 08 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 2B 00 00 00 D5 33 33 33 FF B4 B4' - 'B4 FF F9 F9 F9 FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FB FB FB FF DC DC DC FF 89 89 89 FF 1A 1A' - '1A FF 00 00 00 B6 00 00 00 14 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 09 00 00 00 28 00 00 00 38 00 00 00 37 00 00' - '00 37 00 00 00 2C 00 00 00 50 00 00 00 CC 03 03' - '03 FF 31 31 31 FF 67 67 67 FF A2 A2 A2 FF 90 90' - '90 FF 59 59 59 FF 22 22 22 FF 00 00 00 FF 00 00' - '00 B4 00 00 00 41 00 00 00 2F 00 00 00 37 00 00' - '00 37 00 00 00 37 00 00 00 27 00 00 00 09 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 32 00 00' - '00 BE 00 00 00 F7 00 00 00 FB 00 00 00 FA 00 00' - '00 FA 00 00 00 FA 00 00 00 F3 00 00 00 F2 00 00' - '00 FF 00 00 00 FF 05 05 05 FF 79 79 79 FF 4C 4C' - '4C FF 00 00 00 FF 00 00 00 FF 00 00 00 FD 00 00' - '00 F0 00 00 00 F6 00 00 00 FA 00 00 00 FA 00 00' - '00 FA 00 00 00 FB 00 00 00 F1 00 00 00 AE 00 00' - '00 29 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 1B 00 00 00 DB 26 26' - '26 FF 94 94 94 FF AD AD AD FF AA AA AA FF A9 A9' - 'A9 FF A7 A7 A7 FF A7 A7 A7 FF A6 A6 A6 FF A4 A4' - 'A4 FF A2 A2 A2 FF AB AB AB FF CD CD CD FF BF BF' - 'BF FF A2 A2 A2 FF 9E 9E 9E FF 9E 9E 9E FF 9C 9C' - '9C FF 9C 9C 9C FF 9B 9B 9B FF 9A 9A 9A FF 99 99' - '99 FF 9B 9B 9B FF 77 77 77 FF 11 11 11 FF 00 00' - '00 C1 00 00 00 14 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 6F 06 06 06 FF C0 C0' - 'C0 FF FF FF FF FF FF FF FF FF FF FF FF FF FD FF' - 'FF FF FA FD FE FF F7 FA FC FF F4 F7 F9 FF F1 F4' - 'F6 FF EE F1 F3 FF EA EC EE FF E2 E4 E6 FF E1 E3' - 'E5 FF E2 E5 E7 FF E1 E2 E5 FF DE E0 E2 FF DA DD' - 'DF FF D8 DA DD FF D5 D8 DA FF D3 D6 D8 FF D0 D3' - 'D5 FF CE CF CF FF DD DD DD FF 81 81 81 FF 00 00' - '00 FF 00 00 00 4E 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 84 22 22 22 FF EB EB' - 'EB FF FF FF FF FF F3 EA E4 FF F0 E0 D4 FF EF E1' - 'D6 FF EF E1 D6 FF EF E1 D6 FF EE E1 D6 FF ED E1' - 'D6 FF EC E1 D5 FF EC E0 D5 FF EA DE D3 FF E9 DD' - 'D2 FF E7 DA CF FF E5 D8 CD FF E2 D5 CA FF DF D2' - 'C7 FF DD CF C4 FF DB CC C1 FF D8 C9 BE FF D8 C8' - 'BD FF D2 CE CC FF CB CC CC FF AB AB AB FF 06 06' - '06 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 84 24 24 24 FF EB EB' - 'EB FF FF FF FF FF D4 AB 8F FF C5 67 26 FF CD 77' - '39 FF D2 81 42 FF D7 89 4A FF DC 91 50 FF E0 97' - '57 FF E3 9C 5C FF E5 9F 5E FF E5 9F 5F FF E4 9E' - '5D FF E2 9A 5A FF DF 94 55 FF DA 8D 4E FF D6 85' - '47 FF D1 7D 3F FF CC 75 37 FF C6 6A 2C FF C5 68' - '2B FF D8 C3 B5 FF CE D1 D3 FF A9 A9 A9 FF 06 06' - '06 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 84 22 22 22 FF EA EA' - 'EA FF FF FF FF FF D0 A5 89 FF BD 5A 16 FF C6 6A' - '2A FF CB 73 32 FF D0 7A 3A FF D4 82 40 FF D7 87' - '45 FF DA 8C 49 FF DB 8E 4B FF DB 8E 4C FF DA 8D' - '4A FF D8 89 47 FF D5 84 42 FF D2 7E 3C FF CD 76' - '35 FF C8 6E 2E FF C3 66 26 FF BD 5B 1A FF BB 59' - '1A FF D7 C0 B2 FF D1 D5 D8 FF A9 A9 A9 FF 05 05' - '05 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 84 22 22 22 FF EA EA' - 'EA FF FF FF FF FF D0 A4 88 FF BA 54 12 FF C2 65' - '25 FF C7 6D 2D FF CB 73 34 FF CF 7A 39 FF D2 7F' - '3E FF D3 82 42 FF D4 84 43 FF D5 84 43 FF D4 83' - '42 FF D2 80 3F FF D0 7C 3B FF CD 76 36 FF C8 6F' - '30 FF C4 68 29 FF BF 60 21 FF B9 56 17 FF B8 54' - '17 FF D8 C1 B3 FF D4 D8 DA FF A9 A9 A9 FF 05 05' - '05 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 84 21 21 21 FF E9 E9' - 'E9 FF FF FF FF FF CD A0 84 FF B5 4C 0B FF BD 5D' - '1E FF C1 64 25 FF C5 6B 2A FF C9 70 30 FF CB 74' - '34 FF CD 77 37 FF CD 78 38 FF CD 78 38 FF CD 78' - '37 FF CC 75 35 FF CA 72 32 FF C7 6D 2D FF C3 67' - '27 FF BF 60 21 FF BB 58 1A FF B5 4F 10 FF B4 4D' - '11 FF D8 C0 B2 FF D8 DB DE FF A9 A9 A9 FF 04 04' - '04 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 84 20 20 20 FF E8 E8' - 'E8 FF FF FF FF FF CA 9B 80 FF B0 44 02 FF B8 54' - '15 FF BC 5A 1C FF BF 60 21 FF C1 65 25 FF C4 68' - '28 FF C5 6B 2B FF C6 6C 2D FF C6 6D 2D FF C6 6C' - '2D FF C4 69 2A FF C2 66 26 FF C0 61 22 FF BD 5D' - '1E FF B9 57 19 FF B5 50 12 FF B0 47 08 FF B0 46' - '0A FF D8 C0 B2 FF DA DE E0 FF A8 A8 A8 FF 04 04' - '04 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 84 20 20 20 FF E7 E7' - 'E7 FF FF FF FF FF C6 96 7B FF AA 3B 00 FF B2 4A' - '0D FF B4 4F 11 FF B8 55 17 FF BD 5E 1F FF C2 65' - '25 FF C4 69 2A FF C5 6B 2C FF C6 6C 2C FF C6 6C' - '2C FF C4 69 2A FF C2 65 26 FF BE 5E 20 FF B8 55' - '17 FF B3 4C 0E FF AF 46 08 FF AB 3F 01 FF AD 43' - '06 FF DA C2 B4 FF DE E2 E4 FF A7 A7 A7 FF 03 03' - '03 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 84 1F 1F 1F FF E6 E6' - 'E6 FF FF FF FF FF C2 93 78 FF A5 34 00 FF AB 40' - '03 FF B6 52 14 FF C1 64 26 FF C7 6E 2F FF CA 73' - '33 FF CC 77 36 FF CD 78 38 FF CD 79 38 FF CD 78' - '38 FF CC 77 37 FF CB 74 34 FF C8 6F 30 FF C4 69' - '2A FF BC 5C 1D FF AF 47 0A FF A7 3A 00 FF AC 43' - '06 FF DB C3 B5 FF E0 E4 E7 FF A7 A7 A7 FF 03 03' - '03 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 84 1E 1E 1E FF E5 E5' - 'E5 FF FF FF FF FF C1 90 76 FF A6 36 00 FF BA 59' - '1A FF C8 6F 2F FF CC 75 35 FF CF 7A 3A FF D1 7F' - '3E FF D3 82 41 FF D4 83 42 FF D4 84 43 FF D4 83' - '42 FF D3 82 41 FF D1 7E 3E FF CF 7A 39 FF CC 75' - '35 FF C9 70 30 FF C3 67 27 FF B3 4D 0E FF AC 42' - '06 FF DC C4 B6 FF E3 E7 EA FF A7 A7 A7 FF 02 02' - '02 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 84 1D 1D 1D FF E4 E4' - 'E4 FF FF FF FF FF BE 8E 73 FF B7 50 0E FF CA 72' - '32 FF CD 77 37 FF D1 7D 3D FF D4 83 43 FF D8 88' - '47 FF D9 8C 4B FF DB 8F 4D FF DB 8F 4D FF DB 8F' - '4D FF D9 8C 4B FF D8 88 47 FF D4 83 43 FF D1 7D' - '3D FF CD 76 36 FF C9 70 30 FF C4 67 27 FF B5 51' - '14 FF DC C3 B6 FF E6 EA EC FF A6 A6 A6 FF 01 01' - '01 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 84 1C 1C 1C FF E2 E2' - 'E2 FF FF FF FF FF C3 96 7A FF C4 65 22 FF CD 76' - '36 FF D2 7E 3E FF D6 85 44 FF DA 8C 4B FF DD 92' - '50 FF E0 97 54 FF E1 99 57 FF E2 99 58 FF E1 99' - '57 FF E0 97 54 FF DD 92 50 FF DA 8C 4B FF D6 85' - '44 FF D2 7E 3E FF CC 76 36 FF C7 6D 2D FF C2 65' - '27 FF DE C6 B9 FF E8 EB EE FF A6 A6 A6 FF 01 01' - '01 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 84 1B 1B 1B FF E1 E1' - 'E1 FF FF FF FF FF C5 9A 7E FF C8 6C 28 FF D1 7D' - '3C FF D6 85 44 FF DA 8D 4B FF DF 94 52 FF E3 9B' - '59 FF E6 A1 5E FF E8 A4 62 FF E9 A5 62 FF E8 A4' - '62 FF E6 A1 5E FF E3 9B 59 FF DF 94 52 FF DA 8D' - '4B FF D6 85 44 FF D0 7D 3C FF CA 72 31 FF C7 6D' - '2E FF E5 CE C1 FF F4 F8 FA FF A7 A7 A7 FF 00 00' - '00 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 84 1A 1A 1A FF E0 E0' - 'E0 FF FF FF FF FF BC 8D 70 FF C7 68 23 FF D4 81' - '3E FF D9 89 46 FF DE 92 4E FF E4 9A 56 FF E9 A2' - '5E FF ED AA 65 FF F0 AE 6A FF F1 B0 6B FF F0 AE' - '6A FF ED AA 65 FF E9 A2 5E FF E4 9A 56 FF DE 92' - '4E FF D9 89 46 FF D4 80 3D FF CE 76 33 FF C2 63' - '23 FF E9 D0 C2 FF FF FF FF FF AA AA AA FF 00 00' - '00 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 84 1A 1A 1A FF E0 E0' - 'E0 FF FF FF FF FF B5 8D 76 FF B4 60 29 FF CF 88' - '4F FF D4 90 56 FF D9 98 5D FF DE A0 65 FF E3 A8' - '6D FF E7 AF 74 FF EB B5 79 FF EC B7 7B FF EB B5' - '79 FF E7 AF 74 FF E3 A8 6D FF DE A0 65 FF D8 98' - '5D FF D3 90 56 FF CF 87 4E FF C7 7C 44 FF B0 5D' - '2B FF E8 D3 C8 FF FF FF FF FF AB AB AB FF 00 00' - '00 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 84 15 15 15 FF DB DB' - 'DB FF FF FF FF FF EE EC EC FF E7 E4 E2 FF EB E7' - 'E4 FF EB E8 E5 FF EC E8 E5 FF EC E9 E6 FF EC E9' - 'E6 FF EC EA E7 FF ED EA E7 FF ED EA E7 FF ED EA' - 'E7 FF EC EA E7 FF EC E9 E6 FF EB E8 E5 FF EA E8' - 'E5 FF EA E7 E4 FF EA E6 E3 FF E8 E4 E2 FF E6 E3' - 'E2 FF F8 F8 F7 FF FF FF FF FF A7 A7 A7 FF 00 00' - '00 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 6C 00 00 00 FF 8E 8E' - '8E FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF F4 F4 F4 FF 58 58 58 FF 00 00' - '00 FD 00 00 00 45 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 16 00 00 00 D5 0A 0A' - '0A FF 53 53 53 FF 74 74 74 FF 72 72 72 FF 72 72' - '72 FF 72 72 72 FF 72 72 72 FF 72 72 72 FF 72 72' - '72 FF 71 71 71 FF 71 71 71 FF 71 71 71 FF 71 71' - '71 FF 71 71 71 FF 71 71 71 FF 71 71 71 FF 71 71' - '71 FF 71 71 71 FF 70 70 70 FF 70 70 70 FF 70 70' - '70 FF 6F 6F 6F FF 3F 3F 3F FF 02 02 02 FF 00 00' - '00 B2 00 00 00 05 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 28 00 00' - '00 B1 00 00 00 EF 00 00 00 F1 00 00 00 F0 00 00' - '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' - '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' - '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' - '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' - '00 F0 00 00 00 F2 00 00 00 E8 00 00 00 97 00 00' - '00 15 00 00 00 00 00 00 00 00 00 00 00 00 FF 00' - '00 FF FE 00 00 7F FE 00 00 7F FE 00 00 7F FE 00' - '00 7F FE 00 00 7F FE 00 00 7F FF 00 00 FF FF 00' - '00 FF FF 80 01 FF F0 00 00 0F E0 00 00 07 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 E0 00 00 07 28 00' - '00 00 10 00 00 00 20 00 00 00 01 00 20 00 00 00' - '00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 03 01 01 01 7C 08 08 08 AD 08 08' - '08 A8 08 08 08 A8 08 08 08 A8 08 08 08 A8 08 08' - '08 AD 01 01 01 6D 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 31 57 57 57 FA CE CE CE FF BB BB' - 'BB FF B1 B1 B1 FF A8 A8 A8 FF 9D 9D 9D FF 8D 8D' - '8D FF 30 30 30 F2 00 00 00 23 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 3A 7B 7B 7B FC FF FF FF FF F5 F5' - 'F5 FF EC EC EC FF DD DD DD FF CA CA CA FF BA BA' - 'BA FF 4C 4C 4C F7 00 00 00 28 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 0D 37 37 37 D7 F5 F5 F5 FF FF FF' - 'FF FF E2 E2 E2 FF D9 D9 D9 FF E6 E6 E6 FF B7 B7' - 'B7 FF 1C 1C 1C C5 00 00 00 05 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 45 59 59 59 EB E5 E5' - 'E5 FF F1 F1 F1 FF EA EA EA FF C2 C2 C2 FF 3B 3B' - '3B E1 00 00 00 35 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 12 02 02' - '02 78 06 06 06 96 05 06 06 8A 00 00 00 C6 16 16' - '16 FF 77 77 77 FF 66 66 66 FF 11 11 11 FF 00 00' - '00 BC 07 07 07 89 07 07 07 96 02 02 02 73 00 00' - '00 0E 00 00 00 00 00 00 00 00 03 03 03 9C 94 94' - '93 FF D1 D4 D7 FF C7 CD D0 FF C3 C7 CA FF B9 BD' - 'C0 FF C2 C6 C9 FF BB BF C2 FF B0 B4 B8 FF B2 B7' - 'BA FF B0 B5 B9 FF B1 B4 B6 FF 6E 6D 6D FF 00 00' - '00 84 00 00 00 00 00 00 00 00 19 19 1A CC EC ED' - 'ED FF ED C9 B1 FF E6 B4 8F FF EB BF 9B FF ED C4' - 'A0 FF EB C3 9E FF E8 C0 9B FF E5 BA 95 FF DD AF' - '8B FF D4 9E 79 FF D9 B9 A5 FF B9 BB BD FF 09 0A' - '0A A8 00 00 00 00 00 00 00 00 1A 1B 1B CC EB EC' - 'ED FF CC 86 58 FF C2 5E 17 FF CE 75 30 FF D5 80' - '3B FF D8 85 40 FF D6 82 3D FF D1 78 34 FF C8 6A' - '26 FF BA 4F 08 FF CC 8E 68 FF B8 BC C0 FF 09 09' - '09 A8 00 00 00 00 00 00 00 00 19 1A 1A CC EA EB' - 'EC FF C7 81 57 FF B9 53 12 FF C2 66 26 FF C7 6E' - '2E FF CA 71 32 FF C8 6F 30 FF C4 68 29 FF BD 5C' - '1E FF B1 45 04 FF C9 8C 68 FF BA BE C1 FF 08 09' - '09 A8 00 00 00 00 00 00 00 00 18 19 1A CC E9 EA' - 'EB FF BE 73 4A FF AF 44 03 FF C0 62 23 FF C6 6D' - '2D FF C9 71 31 FF C8 70 30 FF C4 69 2A FF BB 5A' - '1B FF A9 39 00 FF C7 88 65 FF BC C1 C4 FF 08 08' - '08 A8 00 00 00 00 00 00 00 00 18 18 19 CC E6 E7' - 'E8 FF C1 7A 4F FF C2 62 1F FF D0 7C 3C FF D5 85' - '44 FF D7 88 47 FF D7 87 46 FF D3 81 40 FF CC 76' - '36 FF BB 57 13 FF CC 8F 6C FF BD C1 C4 FF 07 08' - '08 A8 00 00 00 00 00 00 00 00 16 17 18 CC E3 E4' - 'E4 FF CD 8D 60 FF D0 78 33 FF DA 8C 49 FF E2 98' - '54 FF E6 9F 5B FF E4 9C 59 FF DE 92 4F FF D6 84' - '42 FF C9 6B 26 FF DA A2 7C FF C1 C5 C8 FF 07 07' - '07 A8 00 00 00 00 00 00 00 00 17 17 18 CC E4 E4' - 'E5 FF CA 90 6A FF D5 89 4B FF E1 9F 63 FF EB AE' - '71 FF F0 B9 7A FF EE B5 77 FF E6 A7 6A FF DC 97' - '5B FF CC 7B 3D FF DF AD 8D FF D0 D4 D7 FF 06 07' - '07 A8 00 00 00 00 00 00 00 00 09 09 09 C1 CB CC' - 'CC FF FA F6 F4 FF F2 EE EA FF F4 F0 EC FF F4 F1' - 'EE FF F4 F2 EE FF F4 F2 EE FF F4 F0 ED FF F2 EF' - 'EA FF F0 EB E8 FF FD FA F8 FF AF AF AF FF 00 00' - '00 9F 00 00 00 00 00 00 00 00 00 00 00 4A 1E 1E' - '1D E2 45 46 47 F3 43 45 46 F0 42 43 45 F0 42 43' - '44 F0 42 43 44 F0 42 43 44 F0 42 43 44 F0 42 43' - '44 F0 42 44 45 F0 41 42 43 F4 16 16 16 D9 00 00' - '00 39 00 00 00 00 E0 0F 00 00 E0 07 00 00 E0 07' - '00 00 E0 07 00 00 F0 0F 00 00 80 01 00 00 80 01' - '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' - '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' - '00 00 80 01 00 00' + '00 00 00 0F 00 00 FC 00 00 00 00 3F 00 00' } */ From 6993ae4ae2a0fc0948b18326402b851f4e8bea36 Mon Sep 17 00:00:00 2001 From: Vizzini <vizzini@plasmic.com> Date: Sun, 20 Jun 2004 03:29:29 +0000 Subject: [PATCH 1440/1463] fixed a bug in IoCsqRemoveNextIrp (missing break) svn path=/trunk/; revision=9739 --- reactos/drivers/lib/csq/csq.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/reactos/drivers/lib/csq/csq.c b/reactos/drivers/lib/csq/csq.c index 701fca33875..1b656724460 100644 --- a/reactos/drivers/lib/csq/csq.c +++ b/reactos/drivers/lib/csq/csq.c @@ -362,7 +362,8 @@ PIRP NTAPI IoCsqRemoveNextIrp(PIO_CSQ Csq, /* * If the cancel routine is gone, we're already canceled, * and are spinning on the queue lock in our own cancel - * routine. Move on to the next candidate. + * routine. Move on to the next candidate. It'll get + * removed by the cance routine. */ if(!IoSetCancelRoutine(Irp, NULL)) continue; @@ -374,6 +375,8 @@ PIRP NTAPI IoCsqRemoveNextIrp(PIO_CSQ Csq, if(Context && Context->Type == IO_TYPE_CSQ_IRP_CONTEXT) Context->Irp = NULL; + + break; } Csq->CsqReleaseLock(Csq, Irql); From 0064a17a7ccb50b8040b85fc6ffaa0ca060aa003 Mon Sep 17 00:00:00 2001 From: Vizzini <vizzini@plasmic.com> Date: Sun, 20 Jun 2004 03:36:44 +0000 Subject: [PATCH 1441/1463] clarified a misleading comment svn path=/trunk/; revision=9740 --- reactos/drivers/storage/floppy/csqrtns.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/drivers/storage/floppy/csqrtns.c b/reactos/drivers/storage/floppy/csqrtns.c index bdc911634e2..95cd8dbc286 100644 --- a/reactos/drivers/storage/floppy/csqrtns.c +++ b/reactos/drivers/storage/floppy/csqrtns.c @@ -77,7 +77,7 @@ PIRP NTAPI CsqPeekNextIrp(PIO_CSQ UnusedCsq, PIRP Irp, PVOID PeekContext) /* - * FUNCTION: Remove the next IRP from the queue + * FUNCTION: Find the next matching IRP in the queue * ARGUMENTS: * UnusedCsq: Pointer to CSQ context structure * Irp: Pointer to a starting IRP in the queue (i.e. start search here) From aeb397b5ab92333fe15231c64948fc26acad3944 Mon Sep 17 00:00:00 2001 From: Vizzini <vizzini@plasmic.com> Date: Sun, 20 Jun 2004 04:50:02 +0000 Subject: [PATCH 1442/1463] various bugfixes to IoQueryDeviceDescription and friends. The floppy driver now loads and finds the drive properly. svn path=/trunk/; revision=9741 --- reactos/ntoskrnl/io/resource.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/reactos/ntoskrnl/io/resource.c b/reactos/ntoskrnl/io/resource.c index 216e058d638..d4fd336c260 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.15 2004/05/30 18:30:03 navaraf Exp $ +/* $Id: resource.c,v 1.16 2004/06/20 04:50:02 vizzini Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/io/resource.c @@ -132,7 +132,7 @@ IopQueryDeviceDescription( UNICODE_STRING ControllerRootRegName = RootKey; UNICODE_STRING ControllerRegName; HANDLE ControllerKeyHandle; - PKEY_FULL_INFORMATION ControllerFullInformation; + PKEY_FULL_INFORMATION ControllerFullInformation = NULL; PKEY_VALUE_FULL_INFORMATION ControllerInformation[3] = {NULL, NULL, NULL}; ULONG ControllerNumber; ULONG ControllerLoop; @@ -252,7 +252,10 @@ IopQueryDeviceDescription( RtlInitUnicodeString(&ControllerString, Strings[ControllerLoop]); /* How much buffer space */ - ZwQueryValueKey(ControllerKeyHandle, &ControllerString, KeyValueFullInformation, NULL, 0, &LenKeyFullInformation); + Status = ZwQueryValueKey(ControllerKeyHandle, &ControllerString, KeyValueFullInformation, NULL, 0, &LenKeyFullInformation); + + if(!NT_SUCCESS(Status) && Status != STATUS_BUFFER_TOO_SMALL && Status != STATUS_BUFFER_OVERFLOW) + continue; /* Allocate it */ ControllerInformation[ControllerLoop] = ExAllocatePoolWithTag(PagedPool, LenKeyFullInformation, TAG_IO_RESOURCE); @@ -378,7 +381,10 @@ IopQueryDeviceDescription( RtlInitUnicodeString(&PeripheralString, Strings[PeripheralLoop]); /* How much buffer space */ - ZwQueryValueKey(PeripheralKeyHandle, &PeripheralString, KeyValueFullInformation, NULL, 0, &LenKeyFullInformation); + Status = ZwQueryValueKey(PeripheralKeyHandle, &PeripheralString, KeyValueFullInformation, NULL, 0, &LenKeyFullInformation); + + if(!NT_SUCCESS(Status) && Status != STATUS_BUFFER_TOO_SMALL && Status != STATUS_BUFFER_OVERFLOW) + continue; /* Allocate it */ PeripheralInformation[PeripheralLoop] = ExAllocatePoolWithTag(PagedPool, LenKeyFullInformation, TAG_IO_RESOURCE); @@ -394,7 +400,6 @@ IopQueryDeviceDescription( /* We now have everything the caller could possibly want */ if (NT_SUCCESS(Status)) { -#if 0 Status = Query->CalloutRoutine( Query->Context, &ControllerRootRegName, @@ -407,9 +412,6 @@ IopQueryDeviceDescription( *Query->PeripheralType, PeripheralNumber, PeripheralInformation); -#else - Status = STATUS_SUCCESS; -#endif } /* Free the allocated memory */ @@ -492,12 +494,15 @@ IopQueryBusDescription( /* How much buffer space */ Status = ZwQueryKey(RootKeyHandle, KeyFullInformation, NULL, 0, &LenFullInformation); - if (!NT_SUCCESS(Status)) + if (!NT_SUCCESS(Status) && Status != STATUS_BUFFER_TOO_SMALL && Status != STATUS_BUFFER_OVERFLOW) return Status; /* Allocate it */ FullInformation = ExAllocatePoolWithTag(PagedPool, LenFullInformation, TAG_IO_RESOURCE); + if(!FullInformation) + return STATUS_NO_MEMORY; + /* Get the Information */ Status = ZwQueryKey(RootKeyHandle, KeyFullInformation, FullInformation, LenFullInformation, &LenFullInformation); @@ -764,7 +769,7 @@ IoQueryDeviceDescription(PINTERFACE_TYPE BusType, OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING RootRegKey; HANDLE RootRegHandle; - WCHAR RootRegString[] = L"\\REGISTRY\\MACHINE\\HARDWARE\\DESCRIPTION\\SYSTEM\\"; + WCHAR RootRegString[] = L"\\REGISTRY\\MACHINE\\HARDWARE\\DESCRIPTION\\SYSTEM"; IO_QUERY Query; /* Set up the String */ From b23ea08f8ad1f7d922ab15a3f6bfff8c41310a5f Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Sun, 20 Jun 2004 09:12:10 +0000 Subject: [PATCH 1443/1463] Detect display controller. Distinguish VGA and VBE display devices. svn path=/trunk/; revision=9742 --- freeldr/freeldr/arch/i386/hardware.c | 72 ++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/freeldr/freeldr/arch/i386/hardware.c b/freeldr/freeldr/arch/i386/hardware.c index 2e5b37f070a..7b375519cdf 100644 --- a/freeldr/freeldr/arch/i386/hardware.c +++ b/freeldr/freeldr/arch/i386/hardware.c @@ -25,6 +25,7 @@ #include <disk.h> #include <mm.h> #include <portio.h> +#include <video.h> #include "../../reactos/registry.h" #include "hardware.h" @@ -1930,6 +1931,75 @@ DetectPS2Mouse(HKEY BusKey) } +static VOID +DetectDisplayController(HKEY BusKey) +{ + CHAR Buffer[80]; + HKEY ControllerKey; + U16 VesaVersion; + S32 Error; + + Error = RegCreateKey(BusKey, + "DisplayController\\0", + &ControllerKey); + if (Error != ERROR_SUCCESS) + { + DbgPrint((DPRINT_HWDETECT, "Failed to create controller key\n")); + return; + } + DbgPrint((DPRINT_HWDETECT, "Created key: PointerController\\0\n")); + + /* Set 'ComponentInformation' value */ + SetComponentInformation(ControllerKey, + 0x00, + 0, + 0xFFFFFFFF); + + /* FIXME: Set 'ComponentInformation' value */ + + VesaVersion = BiosIsVesaSupported(); + if (VesaVersion != 0) + { + DbgPrint((DPRINT_HWDETECT, + "VESA version %c.%c\n", + (VesaVersion >> 8) + '0', + (VesaVersion & 0xFF) + '0')); + } + else + { + DbgPrint((DPRINT_HWDETECT, + "VESA not supported\n")); + } + + if (VesaVersion >= 0x0200) + { + strcpy(Buffer, + "VBE Display"); + } + else + { + strcpy(Buffer, + "VGA Display"); + } + + /* Set 'Identifier' value */ + 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)); + return; + } + + /* FIXME: Add display peripheral (monitor) data */ +} + + static VOID DetectIsaBios(HKEY SystemKey, U32 *BusNumber) { @@ -2019,6 +2089,8 @@ DetectIsaBios(HKEY SystemKey, U32 *BusNumber) DetectPS2Mouse(BusKey); + DetectDisplayController(BusKey); + /* FIXME: Detect more ISA devices */ } From 9fc35cab4e9a4bf2f49638290ed216adee04da4a Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 20 Jun 2004 09:52:58 +0000 Subject: [PATCH 1444/1463] - Handle correctly "Unknown" media type in VfatHasFileSystem. This gets the floppy disk driver working. svn path=/trunk/; revision=9743 --- reactos/drivers/fs/vfat/fsctl.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/fs/vfat/fsctl.c b/reactos/drivers/fs/vfat/fsctl.c index dee33ff9bde..5bd8bc9dcda 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.30 2004/05/02 20:16:45 hbirr Exp $ +/* $Id: fsctl.c,v 1.31 2004/06/20 09:52:58 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -31,7 +31,7 @@ #include <rosrtl/string.h> #include <wchar.h> -#define NDEBUG +//#define NDEBUG #include <debug.h> #include "vfat.h" @@ -123,6 +123,16 @@ VfatHasFileSystem(PDEVICE_OBJECT DeviceToMount, *RecognizedFS = TRUE; } } + /* + * Floppy disk driver can return Unknown as media type if it + * doesn't know yet what floppy in the drive really is. This is + * perfectly correct to do under Windows. + */ + if (DiskGeometry.MediaType == Unknown) + { + *RecognizedFS = TRUE; + DiskGeometry.BytesPerSector = 512; + } if (DiskGeometry.MediaType > Unknown && DiskGeometry.MediaType < RemovableMedia ) { *RecognizedFS = TRUE; From 39d8412f56ed40bc6092873412e06872be4f6562 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 20 Jun 2004 10:21:48 +0000 Subject: [PATCH 1445/1463] - Use raw size for image sections if virtual size isn't specified. Patch by Nathan Lineback <lineback@toastytech.com> from BugZilla #364. svn path=/trunk/; revision=9744 --- reactos/ntoskrnl/mm/section.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/mm/section.c b/reactos/ntoskrnl/mm/section.c index 26c78e26e29..9db45c2dfb8 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.151 2004/06/06 08:36:31 hbirr Exp $ +/* $Id: section.c,v 1.152 2004/06/20 10:21:48 navaraf Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/section.c @@ -2966,7 +2966,14 @@ MmCreateImageSection(PHANDLE SectionHandle, } SectionSegments[i].RawLength = ImageSections[i-1].SizeOfRawData; - SectionSegments[i].Length = ImageSections[i-1].Misc.VirtualSize; + if (ImageSections[i-1].Misc.VirtualSize != 0) + { + SectionSegments[i].Length = ImageSections[i-1].Misc.VirtualSize; + } + else + { + SectionSegments[i].Length = ImageSections[i-1].SizeOfRawData; + } SectionSegments[i].Flags = 0; SectionSegments[i].ReferenceCount = 1; SectionSegments[i].VirtualAddress = (PVOID)ImageSections[i-1].VirtualAddress; From 2e60fd207afe9a00d8d40d2ffe7cced881d5af60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Sun, 20 Jun 2004 10:36:17 +0000 Subject: [PATCH 1446/1463] Handle ordinals which are not exported svn path=/trunk/; revision=9745 --- reactos/lib/ntdll/ldr/utils.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/reactos/lib/ntdll/ldr/utils.c b/reactos/lib/ntdll/ldr/utils.c index acaba6fc7f6..88ec8c81f89 100644 --- a/reactos/lib/ntdll/ldr/utils.c +++ b/reactos/lib/ntdll/ldr/utils.c @@ -1,4 +1,4 @@ -/* $Id: utils.c,v 1.89 2004/06/15 08:17:23 hbirr Exp $ +/* $Id: utils.c,v 1.90 2004/06/20 10:36:17 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -999,7 +999,6 @@ LdrGetExportByOrdinal ( PIMAGE_EXPORT_DIRECTORY ExportDir; ULONG ExportDirSize; PDWORD * ExFunctions; - USHORT * ExOrdinals; PVOID Function; ExportDir = (PIMAGE_EXPORT_DIRECTORY) @@ -1009,11 +1008,6 @@ LdrGetExportByOrdinal ( &ExportDirSize); - ExOrdinals = (USHORT *) - RVA( - BaseAddress, - ExportDir->AddressOfNameOrdinals - ); ExFunctions = (PDWORD *) RVA( BaseAddress, @@ -1025,7 +1019,9 @@ LdrGetExportByOrdinal ( RVA(BaseAddress, ExFunctions[Ordinal - ExportDir->Base] ) ); - Function = RVA(BaseAddress, ExFunctions[Ordinal - ExportDir->Base] ); + Function = (0 != ExFunctions[Ordinal - ExportDir->Base] + ? RVA(BaseAddress, ExFunctions[Ordinal - ExportDir->Base] ) + : NULL); if (((ULONG)Function >= (ULONG)ExportDir) && ((ULONG)Function < (ULONG)ExportDir + (ULONG)ExportDirSize)) From bbfafe3c222cabf5f2d2cd8e6b61d9a3d6bfea63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Sun, 20 Jun 2004 10:39:21 +0000 Subject: [PATCH 1447/1463] Reserve ordinals 90 and 91. Fixes bug 182. svn path=/trunk/; revision=9747 --- reactos/lib/shell32/shell32.spec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/shell32/shell32.spec b/reactos/lib/shell32/shell32.spec index d45db9bf719..f13b9e07555 100644 --- a/reactos/lib/shell32/shell32.spec +++ b/reactos/lib/shell32/shell32.spec @@ -83,8 +83,8 @@ 87 stdcall SHRevokeDragDrop(long) 88 stdcall SHDoDragDrop(long ptr ptr long ptr) 89 stdcall SHCloneSpecialIDList(long long long) -# 90 stub SHFindFiles -# 91 stub SHFindComputer + 90 stub SHFindFiles + 91 stub SHFindComputer 92 stdcall PathGetShortPath (ptr) PathGetShortPathAW 93 stdcall Win32CreateDirectory(wstr ptr) Win32CreateDirectoryAW 94 stdcall Win32RemoveDirectory(wstr) Win32RemoveDirectoryAW From 637a86a2864ed2e3e2a109145c0bdb7c25f14261 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 20 Jun 2004 12:10:45 +0000 Subject: [PATCH 1448/1463] fix opening explorer sub folders in MDI mode - problem spotted and debugged by Ge van Geldorp svn path=/trunk/; revision=9749 --- reactos/subsys/system/explorer/shell/shellbrowser.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/system/explorer/shell/shellbrowser.cpp b/reactos/subsys/system/explorer/shell/shellbrowser.cpp index adaf4ede54e..fcc22e173ca 100644 --- a/reactos/subsys/system/explorer/shell/shellbrowser.cpp +++ b/reactos/subsys/system/explorer/shell/shellbrowser.cpp @@ -72,7 +72,7 @@ LRESULT ShellBrowser::Init(HWND hWndFrame) const String& root_name = GetDesktopFolder().get_name(_create_info._root_shell_path, SHGDN_FORPARSING); _root._drive_type = DRIVE_UNKNOWN; - lstrcpy(_root._volname, root_name); // most of the time "Desktop" + lstrcpy(_root._volname, root_name); _root._fs_flags = 0; lstrcpy(_root._fs, TEXT("Desktop")); @@ -595,7 +595,7 @@ void MDIShellBrowserChild::update_shell_browser() _shellBrowser = auto_ptr<ShellBrowser>(new ShellBrowser(_hwnd, _left_hwnd, _right_hwnd, _shellpath_info, _himlSmall, this)); - _shellBrowser->Init(_hwnd); + _shellBrowser->Init(_hwndFrame); } From 17bdc6a18d92d45b5b86efb5d1f8193748534851 Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Sun, 20 Jun 2004 12:18:08 +0000 Subject: [PATCH 1449/1463] Add display type (VGA or VESA) selection. svn path=/trunk/; revision=9751 --- reactos/bootdata/hiveinst.inf | 11 + reactos/bootdata/hivesys.inf | 4 +- reactos/bootdata/txtsetup.sif | 10 +- reactos/subsys/system/usetup/settings.c | 279 +++++++++++++++++++++++- reactos/subsys/system/usetup/settings.h | 6 +- reactos/subsys/system/usetup/usetup.c | 18 ++ 6 files changed, 316 insertions(+), 12 deletions(-) diff --git a/reactos/bootdata/hiveinst.inf b/reactos/bootdata/hiveinst.inf index 362628c1511..551441aabfc 100644 --- a/reactos/bootdata/hiveinst.inf +++ b/reactos/bootdata/hiveinst.inf @@ -4,6 +4,17 @@ Signature = "$ReactOS$" [AddReg] ; Enable _one_ driver per section by removing the leading semicolon. +; +; Display driver section +; + +; VBE SVGA driver +HKLM,"SYSTEM\CurrentControlSet\Services\VBE","Start",0x00010001,0x00000001 + +; VGA miniport driver +HKLM,"SYSTEM\CurrentControlSet\Services\Vga","Start",0x00010001,0x00000001 + + ; ; Mouse driver section ; diff --git a/reactos/bootdata/hivesys.inf b/reactos/bootdata/hivesys.inf index 895c5699132..91b22a28602 100644 --- a/reactos/bootdata/hivesys.inf +++ b/reactos/bootdata/hivesys.inf @@ -559,7 +559,7 @@ HKLM,"SYSTEM\CurrentControlSet\Services\Vfatfs","Type",0x00010001,0x00000002 HKLM,"SYSTEM\CurrentControlSet\Services\VBE","ErrorControl",0x00010001,0x00000000 HKLM,"SYSTEM\CurrentControlSet\Services\VBE","Group",0x00000000,"Video Save SVGA" HKLM,"SYSTEM\CurrentControlSet\Services\VBE","ImagePath",0x00020000,"system32\drivers\vbemp.sys" -HKLM,"SYSTEM\CurrentControlSet\Services\VBE","Start",0x00010001,0x00000001 +HKLM,"SYSTEM\CurrentControlSet\Services\VBE","Start",0x00010001,0x00000004 HKLM,"SYSTEM\CurrentControlSet\Services\VBE","Type",0x00010001,0x00000001 HKLM,"SYSTEM\CurrentControlSet\Services\VBE\Device0","InstalledDisplayDrivers",0x00010000,"framebuf" @@ -567,7 +567,7 @@ HKLM,"SYSTEM\CurrentControlSet\Services\VBE\Device0","InstalledDisplayDrivers",0 HKLM,"SYSTEM\CurrentControlSet\Services\Vga","ErrorControl",0x00010001,0x00000000 HKLM,"SYSTEM\CurrentControlSet\Services\Vga","Group",0x00000000,"Video Save" HKLM,"SYSTEM\CurrentControlSet\Services\Vga","ImagePath",0x00020000,"system32\drivers\vgamp.sys" -HKLM,"SYSTEM\CurrentControlSet\Services\Vga","Start",0x00010001,0x00000001 +HKLM,"SYSTEM\CurrentControlSet\Services\Vga","Start",0x00010001,0x00000004 HKLM,"SYSTEM\CurrentControlSet\Services\Vga","Type",0x00010001,0x00000001 HKLM,"SYSTEM\CurrentControlSet\Services\Vga\Device0","InstalledDisplayDrivers",0x00010000,"vgaddi" diff --git a/reactos/bootdata/txtsetup.sif b/reactos/bootdata/txtsetup.sif index 7740f5087a5..63055db24cf 100644 --- a/reactos/bootdata/txtsetup.sif +++ b/reactos/bootdata/txtsetup.sif @@ -50,8 +50,14 @@ DefaultLayout = 00000409 pci_up = "Standard-PC" [Display] -vga = "VGA display" -vbe = "VESA display" +;<id> = <user friendly name>,<spare>,<service key name> +vga = "VGA Display",,Vga +vbe = "VESA Display",,VBE + +[Map.Display] +;<id> = <pnp id string> +vga = "VGA Display" +vbe = "VBE Display" [Keyboard] Default = "XT-, AT- or extended keyboard (83-105 keys)" diff --git a/reactos/subsys/system/usetup/settings.c b/reactos/subsys/system/usetup/settings.c index b44191cb72b..e2ee011bc69 100644 --- a/reactos/subsys/system/usetup/settings.c +++ b/reactos/subsys/system/usetup/settings.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: settings.c,v 1.3 2004/06/07 12:21:36 ekohl Exp $ +/* $Id: settings.c,v 1.4 2004/06/20 12:14:23 ekohl Exp $ * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS text-mode setup * FILE: subsys/system/usetup/settings.c @@ -89,6 +89,165 @@ CreateComputerTypeList(HINF InfFile) } +static BOOLEAN +GetDisplayIdentifier(PWSTR Identifier, + ULONG IdentifierLength) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING KeyName; + WCHAR Buffer[32]; + HANDLE BusKey; + HANDLE BusInstanceKey; + HANDLE ControllerKey; + HANDLE ControllerInstanceKey; + ULONG BusInstance; + ULONG ControllerInstance; + ULONG BufferLength; + ULONG ReturnedLength; + PKEY_VALUE_PARTIAL_INFORMATION ValueInfo; + NTSTATUS Status; + + DPRINT("GetDisplayIdentifier() called\n"); + + /* Open the bus key */ + RtlInitUnicodeString(&KeyName, + L"\\Registry\\Machine\\HARDWARE\\Description\\System\\MultifunctionAdapter"); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtOpenKey(&BusKey, + KEY_ALL_ACCESS, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT("NtOpenKey() failed (Status %lx)\n", Status); + return FALSE; + } + + BusInstance = 0; + while (TRUE) + { + swprintf(Buffer, L"%lu", BusInstance); + RtlInitUnicodeString(&KeyName, + Buffer); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + BusKey, + NULL); + Status = NtOpenKey(&BusInstanceKey, + KEY_ALL_ACCESS, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT("NtOpenKey() failed (Status %lx)\n", Status); + NtClose(BusKey); + return FALSE; + } + + /* Open the controller type key */ + RtlInitUnicodeString(&KeyName, + L"DisplayController"); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + BusInstanceKey, + NULL); + Status = NtOpenKey(&ControllerKey, + KEY_ALL_ACCESS, + &ObjectAttributes); + if (NT_SUCCESS(Status)) + { + ControllerInstance = 0; + while (TRUE) + { + /* Open the pointer controller instance key */ + swprintf(Buffer, L"%lu", ControllerInstance); + RtlInitUnicodeString(&KeyName, + Buffer); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + ControllerKey, + NULL); + Status = NtOpenKey(&ControllerInstanceKey, + KEY_ALL_ACCESS, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT("NtOpenKey() failed (Status %lx)\n", Status); + NtClose(ControllerKey); + NtClose(BusInstanceKey); + NtClose(BusKey); + return FALSE; + } + + /* Get controller identifier */ + RtlInitUnicodeString(&KeyName, + L"Identifier"); + + BufferLength = sizeof(KEY_VALUE_PARTIAL_INFORMATION) + + 256 * sizeof(WCHAR); + ValueInfo = RtlAllocateHeap(RtlGetProcessHeap(), + 0, + BufferLength); + if (ValueInfo == NULL) + { + DPRINT("RtlAllocateHeap() failed\n"); + NtClose(ControllerInstanceKey); + NtClose(ControllerKey); + NtClose(BusInstanceKey); + NtClose(BusKey); + return FALSE; + } + + Status = NtQueryValueKey(ControllerInstanceKey, + &KeyName, + KeyValuePartialInformation, + ValueInfo, + BufferLength, + &ReturnedLength); + if (NT_SUCCESS(Status)) + { + DPRINT("Identifier: %S\n", (PWSTR)ValueInfo->Data); + + BufferLength = min(ValueInfo->DataLength / sizeof(WCHAR), IdentifierLength); + RtlCopyMemory (Identifier, + ValueInfo->Data, + BufferLength * sizeof(WCHAR)); + Identifier[BufferLength] = 0; + + RtlFreeHeap(RtlGetProcessHeap(), + 0, + ValueInfo); + NtClose(ControllerInstanceKey); + NtClose(ControllerKey); + NtClose(BusInstanceKey); + NtClose(BusKey); + return TRUE; + } + + NtClose(ControllerInstanceKey); + + ControllerInstance++; + } + + NtClose(ControllerKey); + } + + NtClose(BusInstanceKey); + + BusInstance++; + } + + NtClose(BusKey); + + return FALSE; +} + + PGENERIC_LIST CreateDisplayDriverList(HINF InfFile) { @@ -98,6 +257,49 @@ CreateDisplayDriverList(HINF InfFile) PWCHAR KeyName; PWCHAR KeyValue; PWCHAR UserData; + WCHAR DisplayIdentifier[128]; + WCHAR DisplayKey[32]; + + /* Get the display identification */ + if (!GetDisplayIdentifier(DisplayIdentifier, 128)) + { + DisplayIdentifier[0] = 0; + } + + DPRINT("Display identifier: '%S'\n", DisplayIdentifier); + + /* Search for matching device identifier */ + if (!InfFindFirstLine(InfFile, L"Map.Display", NULL, &Context)) + { + /* FIXME: error message */ + return NULL; + } + + do + { + if (!InfGetDataField(&Context, 1, &KeyValue)) + { + /* FIXME: Handle error! */ + DPRINT("InfGetDataField() failed\n"); + return NULL; + } + + DPRINT("KeyValue: %S\n", KeyValue); + if (wcsstr(DisplayIdentifier, KeyValue)) + { + if (!InfGetDataField(&Context, 0, &KeyName)) + { + /* FIXME: Handle error! */ + DPRINT("InfGetDataField() failed\n"); + return NULL; + } + + DPRINT("Display key: %S\n", KeyName); + wcscpy(DisplayKey, KeyName); + } + } + while (InfFindNextLine(&Context, &Context)); + List = CreateGenericList(); if (List == NULL) @@ -111,10 +313,15 @@ CreateDisplayDriverList(HINF InfFile) do { - if (!InfGetData (&Context, &KeyName, &KeyValue)) + if (!InfGetDataField(&Context, 0, &KeyName)) { - /* FIXME: Handle error! */ - DPRINT("InfGetData() failed\n"); + DPRINT1("InfGetDataField() failed\n"); + break; + } + + if (!InfGetDataField(&Context, 1, &KeyValue)) + { + DPRINT1("InfGetDataField() failed\n"); break; } @@ -123,22 +330,80 @@ CreateDisplayDriverList(HINF InfFile) (wcslen(KeyName) + 1) * sizeof(WCHAR)); if (UserData == NULL) { - /* FIXME: Handle error! */ + DPRINT1("RtlAllocateHeap() failed\n"); + DestroyGenericList(List, TRUE); + return NULL; } wcscpy(UserData, KeyName); sprintf(Buffer, "%S", KeyValue); - AppendGenericListEntry(List, Buffer, UserData, FALSE); + AppendGenericListEntry(List, + Buffer, + UserData, + _wcsicmp(KeyName, DisplayKey) ? FALSE : TRUE); } while (InfFindNextLine(&Context, &Context)); - AppendGenericListEntry(List, "Automatic detection", NULL, TRUE); +#if 0 + AppendGenericListEntry(List, "Other display driver", NULL, TRUE); +#endif return List; } +BOOLEAN +ProcessDisplayRegistry(HINF InfFile, PGENERIC_LIST List) +{ + PGENERIC_LIST_ENTRY Entry; + INFCONTEXT Context; + PWCHAR ServiceName; + ULONG StartValue; + NTSTATUS Status; + + DPRINT("ProcessDisplayRegistry() called\n"); + + Entry = GetGenericListEntry(List); + if (Entry == NULL) + { + DPRINT("GetGenericListEntry() failed\n"); + return FALSE; + } + + if (!InfFindFirstLine(InfFile, L"Display", Entry->UserData, &Context)) + { + DPRINT("InfFindFirstLine() failed\n"); + return FALSE; + } + + if (!InfGetDataField(&Context, 3, &ServiceName)) + { + DPRINT("InfGetDataField() failed\n"); + return FALSE; + } + + DPRINT("Service name: %S\n", ServiceName); + + StartValue = 1; + Status = RtlWriteRegistryValue(RTL_REGISTRY_SERVICES, + ServiceName, + L"Start", + REG_DWORD, + &StartValue, + sizeof(ULONG)); + if (!NT_SUCCESS(Status)) + { + DPRINT("RtlWriteRegistryValue() failed (Status %lx)\n", Status); + return FALSE; + } + + DPRINT("ProcessDisplayRegistry() done\n"); + + return TRUE; +} + + PGENERIC_LIST CreateKeyboardDriverList(HINF InfFile) { diff --git a/reactos/subsys/system/usetup/settings.h b/reactos/subsys/system/usetup/settings.h index 7d939960a22..8f81df55af4 100644 --- a/reactos/subsys/system/usetup/settings.h +++ b/reactos/subsys/system/usetup/settings.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: settings.h,v 1.2 2004/06/07 12:21:37 ekohl Exp $ +/* $Id: settings.h,v 1.3 2004/06/20 12:14:23 ekohl Exp $ * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS text-mode setup * FILE: subsys/system/usetup/settings.h @@ -33,6 +33,10 @@ CreateComputerTypeList(HINF InfFile); PGENERIC_LIST CreateDisplayDriverList(HINF InfFile); +BOOLEAN +ProcessDisplayRegistry(HINF InfFile, + PGENERIC_LIST List); + PGENERIC_LIST CreateKeyboardDriverList(HINF InfFile); diff --git a/reactos/subsys/system/usetup/usetup.c b/reactos/subsys/system/usetup/usetup.c index 7536ae6fa8a..1e432d41504 100644 --- a/reactos/subsys/system/usetup/usetup.c +++ b/reactos/subsys/system/usetup/usetup.c @@ -3182,6 +3182,24 @@ RegistryPage(PINPUT_RECORD Ir) } while (InfFindNextLine (&InfContext, &InfContext)); + /* Update display registry settings */ + SetStatusText(" Updating display registry settings..."); + if (!ProcessDisplayRegistry(SetupInf, DisplayList)) + { + PopupError("Setup failed to update display registry settings.", + "ENTER = Reboot computer"); + + while(TRUE) + { + ConInKey(Ir); + + if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ + { + return QUIT_PAGE; + } + } + } + /* Update keyboard layout settings */ SetStatusText(" Updating keyboard layout settings..."); if (!ProcessKeyboardLayoutRegistry(LayoutList)) From 8cbe40b0adfa99f6559636b4aea9f0151982b6d9 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sun, 20 Jun 2004 12:21:47 +0000 Subject: [PATCH 1450/1463] some work on editing binary registry values (not working yet) svn path=/trunk/; revision=9752 --- reactos/subsys/system/regedit/En.rc | 14 ++ reactos/subsys/system/regedit/edit.c | 78 +++++++++ reactos/subsys/system/regedit/hexedit.c | 207 +++++++++++++++++++++++ reactos/subsys/system/regedit/hexedit.h | 16 ++ reactos/subsys/system/regedit/main.c | 8 +- reactos/subsys/system/regedit/makefile | 5 +- reactos/subsys/system/regedit/resource.h | 1 + 7 files changed, 325 insertions(+), 4 deletions(-) create mode 100644 reactos/subsys/system/regedit/hexedit.c create mode 100644 reactos/subsys/system/regedit/hexedit.h diff --git a/reactos/subsys/system/regedit/En.rc b/reactos/subsys/system/regedit/En.rc index fb4874e4d82..4d697ea7c55 100644 --- a/reactos/subsys/system/regedit/En.rc +++ b/reactos/subsys/system/regedit/En.rc @@ -156,6 +156,20 @@ BEGIN PUSHBUTTON "Cancel",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 "Edit Binary Value" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Value &name:",IDC_STATIC,6,6,134,8 + EDITTEXT IDC_VALUE_NAME,6,17,240,12,ES_AUTOHSCROLL | ES_READONLY + LTEXT "&Value data:",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 "Cancel",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 | diff --git a/reactos/subsys/system/regedit/edit.c b/reactos/subsys/system/regedit/edit.c index b7fa78dbf25..d063195ddda 100644 --- a/reactos/subsys/system/regedit/edit.c +++ b/reactos/subsys/system/regedit/edit.c @@ -260,6 +260,68 @@ LRESULT CALLBACK DwordEditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPAR return CallWindowProc(oldwndproc, hwnd, uMsg, wParam, lParam); } +INT_PTR CALLBACK modify_binary_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + TCHAR* valueData; + HWND hwndValue; + int len; + + switch(uMsg) { + case WM_INITDIALOG: + if(editValueName && _tcscmp(editValueName, _T(""))) + { + SetDlgItemText(hwndDlg, IDC_VALUE_NAME, editValueName); + } + else + { + SetDlgItemText(hwndDlg, IDC_VALUE_NAME, _T("(Default)")); + } + SetDlgItemText(hwndDlg, IDC_VALUE_DATA, stringValueData); + SetFocus(GetDlgItem(hwndDlg, IDC_VALUE_DATA)); + return FALSE; + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDOK: + if ((hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA))) + { + if ((len = GetWindowTextLength(hwndValue))) + { + if (stringValueData) + { + if ((valueData = HeapReAlloc(GetProcessHeap(), 0, stringValueData, (len + 1) * sizeof(TCHAR)))) + { + stringValueData = valueData; + if (!GetWindowText(hwndValue, stringValueData, len + 1)) + *stringValueData = 0; + } + } + else + { + if ((valueData = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(TCHAR)))) + { + stringValueData = valueData; + if (!GetWindowText(hwndValue, stringValueData, len + 1)) + *stringValueData = 0; + } + } + } + else + { + if (stringValueData) + *stringValueData = 0; + } + } + EndDialog(hwndDlg, IDOK); + break; + case IDCANCEL: + EndDialog(hwndDlg, IDCANCEL); + return TRUE; + } + } + return FALSE; +} + INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { @@ -569,6 +631,22 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName) result = TRUE; } } + else if (type == REG_NONE || type == REG_BINARY) + { + lRet = RegQueryValueEx(hKey, valueName, 0, 0, (LPBYTE)&dwordValueData, &valueDataLen); + if (lRet != ERROR_SUCCESS) + { + error(hwnd, IDS_BAD_VALUE, valueName); + goto done; + } + + if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_BIN_DATA), hwnd, modify_binary_dlgproc) == IDOK) + { + lRet = RegSetValueEx(hKey, valueName, 0, type, (LPBYTE)&dwordValueData, sizeof(DWORD)); + if (lRet == ERROR_SUCCESS) + result = TRUE; + } + } else { error(hwnd, IDS_UNSUPPORTED_TYPE, type); diff --git a/reactos/subsys/system/regedit/hexedit.c b/reactos/subsys/system/regedit/hexedit.c new file mode 100644 index 00000000000..cf28ee5f537 --- /dev/null +++ b/reactos/subsys/system/regedit/hexedit.c @@ -0,0 +1,207 @@ +/* + * Hex editor control + * + * Copyright (C) 2004 Thomas Weidenmueller <w3seek@reactos.com> + * + * 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 */ +#include <windows.h> +#include <commctrl.h> +#include <tchar.h> + +#include "hexedit.h" + +typedef struct +{ + HWND hWndSelf; + HWND hWndParent; + HLOCAL hData; + DWORD style; + INT LineHeight; + INT CharWidth; + HFONT hFont; + INT LeftMargin; + INT TopMargin; + INT CaretX; + INT CaretY; +} HEXEDIT_DATA, *PHEXEDIT_DATA; + +LRESULT WINAPI HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + +ATOM +STDCALL +RegisterHexEditorClass(HINSTANCE hInstance) +{ + WNDCLASSEX WndClass; + + ZeroMemory(&WndClass, sizeof(WNDCLASSEX)); + WndClass.cbSize = sizeof(WNDCLASSEX); + WndClass.style = CS_DBLCLKS | CS_PARENTDC; + WndClass.lpfnWndProc = (WNDPROC)HexEditWndProc; + WndClass.cbWndExtra = sizeof(PHEXEDIT_DATA); + WndClass.hInstance = hInstance; + WndClass.hCursor = LoadCursor(0, IDC_IBEAM); + WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); + WndClass.lpszClassName = HEX_EDIT_CLASS_NAME; + + return RegisterClassEx(&WndClass); +} + +BOOL +STDCALL +UnregisterHexEditorClass(HINSTANCE hInstance) +{ + return UnregisterClass(HEX_EDIT_CLASS_NAME, hInstance); +} + +/*** Helper functions *********************************************************/ + +static VOID +HEXEDIT_MoveCaret(PHEXEDIT_DATA hed, INT Col, INT Line) +{ + /* FIXME - include the scroll position */ + SetCaretPos(hed->LeftMargin + (Col * hed->CharWidth), hed->TopMargin + (Line * hed->LineHeight)); +} + +/*** Message Proc *************************************************************/ + +static LRESULT +HEXEDIT_WM_NCCREATE(HWND hWnd, CREATESTRUCT *cs) +{ + PHEXEDIT_DATA hed; + + if(!(hed = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(HEXEDIT_DATA)))) + { + return FALSE; + } + + hed->hWndSelf = hWnd; + hed->hWndParent = cs->hwndParent; + hed->style = cs->style; + + SetWindowLong(hWnd, 0, (LONG)hed); + + return TRUE; +} + +static LRESULT +HEXEDIT_WM_NCDESTROY(PHEXEDIT_DATA hed) +{ + if(hed->hData) + { + while(LocalUnlock(hed->hData)); + LocalFree(hed->hData); + } + + SetWindowLong(hed->hWndSelf, 0, 0); + HeapFree(GetProcessHeap(), 0, hed); + + return 0; +} + +static LRESULT +HEXEDIT_WM_CREATE(PHEXEDIT_DATA hed) +{ + hed->LeftMargin = 2; + hed->TopMargin = 2; + return 1; +} + +static LRESULT +HEXEDIT_WM_SETFOCUS(PHEXEDIT_DATA hed) +{ + CreateCaret(hed->hWndSelf, 0, 2, hed->LineHeight); + HEXEDIT_MoveCaret(hed, 0, 0); + ShowCaret(hed->hWndSelf); + return 0; +} + +static LRESULT +HEXEDIT_WM_KILLFOCUS(PHEXEDIT_DATA hed) +{ + DestroyCaret(); + return 0; +} + +static LRESULT +HEXEDIT_WM_SETFONT(PHEXEDIT_DATA hed, HFONT hFont, BOOL bRedraw) +{ + HDC hDC; + TEXTMETRIC tm; + HFONT hOldFont = 0; + + hed->hFont = hFont; + hDC = GetDC(hed->hWndSelf); + if(hFont) + { + hOldFont = SelectObject(hDC, hFont); + } + GetTextMetrics(hDC, &tm); + hed->LineHeight = tm.tmHeight; + hed->CharWidth = tm.tmAveCharWidth; + if(hOldFont) + { + SelectObject(hDC, hOldFont); + } + ReleaseDC(hed->hWndSelf, hDC); + + if(bRedraw) + { + InvalidateRect(hed->hWndSelf, NULL, TRUE); + } + + return 0; +} + +LRESULT +WINAPI +HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + PHEXEDIT_DATA hed; + + hed = (PHEXEDIT_DATA)GetWindowLong(hWnd, 0); + switch(uMsg) + { + case WM_SETFOCUS: + return HEXEDIT_WM_SETFOCUS(hed); + + case WM_KILLFOCUS: + return HEXEDIT_WM_KILLFOCUS(hed); + + case WM_SETFONT: + return HEXEDIT_WM_SETFONT(hed, (HFONT)wParam, (BOOL)LOWORD(lParam)); + + case WM_CREATE: + return HEXEDIT_WM_CREATE(hed); + + case WM_NCCREATE: + if(!hed) + { + return HEXEDIT_WM_NCCREATE(hWnd, (CREATESTRUCT*)lParam); + } + break; + + case WM_NCDESTROY: + if(hed) + { + return HEXEDIT_WM_NCDESTROY(hed); + } + break; + } + + return CallWindowProc(DefWindowProc, hWnd, uMsg, wParam, lParam); +} diff --git a/reactos/subsys/system/regedit/hexedit.h b/reactos/subsys/system/regedit/hexedit.h new file mode 100644 index 00000000000..b103f857471 --- /dev/null +++ b/reactos/subsys/system/regedit/hexedit.h @@ -0,0 +1,16 @@ +#ifndef __HEXEDIT_H +#define __HEXEDIT_H + +#define HEX_EDIT_CLASS_NAME _T("HexEdit32") + +ATOM STDCALL +RegisterHexEditorClass(HINSTANCE hInstance); +BOOL STDCALL +UnregisterHexEditorClass(HINSTANCE hInstance); + +/* styles */ +#define HES_READONLY (0x800) +#define HES_LOWERCASE (0x10) +#define HES_UPPERCASE (0x8) + +#endif /* __HEXEDIT_H */ diff --git a/reactos/subsys/system/regedit/main.c b/reactos/subsys/system/regedit/main.c index 867304ab6c6..57018d3eacf 100644 --- a/reactos/subsys/system/regedit/main.c +++ b/reactos/subsys/system/regedit/main.c @@ -28,6 +28,7 @@ #include <fcntl.h> #include "main.h" +#include "hexedit.h" BOOL ProcessCmdLine(LPSTR lpCmdLine); @@ -102,6 +103,8 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) }; ATOM hChildWndClass = RegisterClassEx(&wcChild); /* register child windows class */ hChildWndClass = hChildWndClass; /* warning eater */ + + RegisterHexEditorClass(hInstance); hMenuFrame = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_REGEDIT_MENU)); hPopupMenus = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_POPUP_MENUS)); @@ -138,8 +141,9 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) /******************************************************************************/ -void ExitInstance(void) +void ExitInstance(HINSTANCE hInstance) { + UnregisterHexEditorClass(hInstance); DestroyMenu(hMenuFrame); } @@ -191,6 +195,6 @@ int APIENTRY WinMain(HINSTANCE hInstance, DispatchMessage(&msg); } } - ExitInstance(); + ExitInstance(hInstance); return msg.wParam; } diff --git a/reactos/subsys/system/regedit/makefile b/reactos/subsys/system/regedit/makefile index 85b2c5b71a3..f9e0b2ba8bb 100644 --- a/reactos/subsys/system/regedit/makefile +++ b/reactos/subsys/system/regedit/makefile @@ -12,7 +12,7 @@ TARGET_APPTYPE = windows TARGET_NAME = regedit -TARGET_CFLAGS = -D_WIN32_IE=0x0501 -D_WIN32_WINNT=0x0501 -D__USE_W32API +TARGET_CFLAGS = -D_WIN32_IE=0x0501 -D_WIN32_WINNT=0x0501 -D__USE_W32API TARGET_GCCLIBS = msvcrt advapi32 kernel32 comctl32 comdlg32 shell32 @@ -20,9 +20,10 @@ TARGET_OBJECTS = \ about.o \ childwnd.o \ edit.o \ - main.o \ framewnd.o \ + hexedit.o \ listview.o \ + main.o \ regedit.o \ regproc.o \ treeview.o diff --git a/reactos/subsys/system/regedit/resource.h b/reactos/subsys/system/regedit/resource.h index 83cae73a35c..6cabef02b58 100644 --- a/reactos/subsys/system/regedit/resource.h +++ b/reactos/subsys/system/regedit/resource.h @@ -121,5 +121,6 @@ #define IDC_FORMAT_DEC 2005 #define IDD_EDIT_MULTI_STRING 2006 +#define IDD_EDIT_BIN_DATA 2007 #define IDC_STATIC -1 From c75be21c001a7ad03b3fcf85adf20b2852e11802 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 20 Jun 2004 12:34:20 +0000 Subject: [PATCH 1451/1463] - Call the "load default cursor" callback. Fixes bug #358. svn path=/trunk/; revision=9753 --- reactos/subsys/win32k/eng/mouse.c | 4 +++- reactos/subsys/win32k/include/callback.h | 3 +++ reactos/subsys/win32k/ntuser/callback.c | 25 +++++++++++++++++++++++- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/eng/mouse.c b/reactos/subsys/win32k/eng/mouse.c index 2097bfe27c8..070329475ba 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.71 2004/05/30 14:01:12 weiden Exp $ +/* $Id: mouse.c,v 1.72 2004/06/20 12:34:17 navaraf Exp $ * * PROJECT: ReactOS kernel * PURPOSE: Mouse @@ -66,6 +66,8 @@ EnableMouse(HDC hDisplayDC) CurInfo->Enabled = (SPS_ACCEPT_EXCLUDE == SurfGDI->PointerStatus || SPS_ACCEPT_NOEXCLUDE == SurfGDI->PointerStatus); + + IntLoadDefaultCursors(); ObDereferenceObject(InputWindowStation); } diff --git a/reactos/subsys/win32k/include/callback.h b/reactos/subsys/win32k/include/callback.h index d8194a77440..750619a0b2a 100644 --- a/reactos/subsys/win32k/include/callback.h +++ b/reactos/subsys/win32k/include/callback.h @@ -21,6 +21,9 @@ IntCallSentMessageCallback(SENDASYNCPROC CompletionCallback, HMENU STDCALL IntLoadSysMenuTemplate(); +BOOL STDCALL +IntLoadDefaultCursors(VOID); + LRESULT STDCALL IntCallHookProc(INT HookId, INT Code, diff --git a/reactos/subsys/win32k/ntuser/callback.c b/reactos/subsys/win32k/ntuser/callback.c index 143690fad4c..95823c65abb 100644 --- a/reactos/subsys/win32k/ntuser/callback.c +++ b/reactos/subsys/win32k/ntuser/callback.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: callback.c,v 1.24 2004/06/16 06:09:40 gvg Exp $ +/* $Id: callback.c,v 1.25 2004/06/20 12:34:20 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -231,6 +231,29 @@ IntLoadSysMenuTemplate() return (HMENU)Result; } +BOOL STDCALL +IntLoadDefaultCursors(VOID) +{ + LRESULT Result; + NTSTATUS Status; + PVOID ResultPointer; + ULONG ResultLength; + BOOL DefaultCursor = TRUE; + + ResultPointer = &Result; + ResultLength = sizeof(LRESULT); + Status = NtW32Call(USER32_CALLBACK_LOADDEFAULTCURSORS, + &DefaultCursor, + sizeof(BOOL), + &ResultPointer, + &ResultLength); + if (!NT_SUCCESS(Status)) + { + return FALSE; + } + return TRUE; +} + LRESULT STDCALL IntCallHookProc(INT HookId, INT Code, From e17ebf0811bd8e5b1f4ae2f361828d359ce8e94e Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sun, 20 Jun 2004 13:35:03 +0000 Subject: [PATCH 1452/1463] some more work on the hex edit control (added messages for loading/changing the buffer) svn path=/trunk/; revision=9760 --- reactos/subsys/system/regedit/edit.c | 130 ++++++++++++------------ reactos/subsys/system/regedit/hexedit.c | 118 ++++++++++++++++++++- reactos/subsys/system/regedit/hexedit.h | 26 ++++- 3 files changed, 203 insertions(+), 71 deletions(-) diff --git a/reactos/subsys/system/regedit/edit.c b/reactos/subsys/system/regedit/edit.c index d063195ddda..19b8b1b3cdc 100644 --- a/reactos/subsys/system/regedit/edit.c +++ b/reactos/subsys/system/regedit/edit.c @@ -33,6 +33,7 @@ #include "main.h" #include "regproc.h" #include "resource.h" +#include "hexedit.h" typedef enum _EDIT_MODE @@ -44,7 +45,9 @@ typedef enum _EDIT_MODE static const TCHAR* editValueName; static TCHAR* stringValueData; +static PVOID binValueData; static DWORD dwordValueData; +static DWORD valueDataLen; static EDIT_MODE dwordEditMode = EDIT_MODE_HEX; @@ -260,68 +263,6 @@ LRESULT CALLBACK DwordEditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPAR return CallWindowProc(oldwndproc, hwnd, uMsg, wParam, lParam); } -INT_PTR CALLBACK modify_binary_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - TCHAR* valueData; - HWND hwndValue; - int len; - - switch(uMsg) { - case WM_INITDIALOG: - if(editValueName && _tcscmp(editValueName, _T(""))) - { - SetDlgItemText(hwndDlg, IDC_VALUE_NAME, editValueName); - } - else - { - SetDlgItemText(hwndDlg, IDC_VALUE_NAME, _T("(Default)")); - } - SetDlgItemText(hwndDlg, IDC_VALUE_DATA, stringValueData); - SetFocus(GetDlgItem(hwndDlg, IDC_VALUE_DATA)); - return FALSE; - case WM_COMMAND: - switch (LOWORD(wParam)) - { - case IDOK: - if ((hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA))) - { - if ((len = GetWindowTextLength(hwndValue))) - { - if (stringValueData) - { - if ((valueData = HeapReAlloc(GetProcessHeap(), 0, stringValueData, (len + 1) * sizeof(TCHAR)))) - { - stringValueData = valueData; - if (!GetWindowText(hwndValue, stringValueData, len + 1)) - *stringValueData = 0; - } - } - else - { - if ((valueData = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(TCHAR)))) - { - stringValueData = valueData; - if (!GetWindowText(hwndValue, stringValueData, len + 1)) - *stringValueData = 0; - } - } - } - else - { - if (stringValueData) - *stringValueData = 0; - } - } - EndDialog(hwndDlg, IDOK); - break; - case IDCANCEL: - EndDialog(hwndDlg, IDCANCEL); - return TRUE; - } - } - return FALSE; -} - INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { @@ -448,9 +389,56 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP return FALSE; } + +INT_PTR CALLBACK modify_binary_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + PVOID valueData; + HWND hwndValue; + int len; + + switch(uMsg) { + case WM_INITDIALOG: + if(editValueName && _tcscmp(editValueName, _T(""))) + { + SetDlgItemText(hwndDlg, IDC_VALUE_NAME, editValueName); + } + else + { + SetDlgItemText(hwndDlg, IDC_VALUE_NAME, _T("(Default)")); + } + HexEdit_LoadBuffer(GetDlgItem(hwndDlg, IDC_VALUE_DATA), binValueData, valueDataLen); + SetFocus(GetDlgItem(hwndDlg, IDC_VALUE_DATA)); + return FALSE; + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDOK: + if ((hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA))) + { + len = HexEdit_GetBufferSize(hwndValue); + if (len != valueDataLen && len > 0) + { + binValueData = HeapReAlloc(GetProcessHeap(), 0, binValueData, len); + } + if (len > 0) + { + HexEdit_CopyBuffer(hwndValue, binValueData, len); + } + valueDataLen = len; + } + EndDialog(hwndDlg, IDOK); + break; + case IDCANCEL: + EndDialog(hwndDlg, IDCANCEL); + return TRUE; + } + } + return FALSE; +} + + BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName) { - DWORD valueDataLen; DWORD type; LONG lRet; BOOL result = FALSE; @@ -467,6 +455,7 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName) type = REG_SZ; valueDataLen = 0; stringValueData = NULL; + binValueData = NULL; } if (lRet != ERROR_SUCCESS) @@ -633,19 +622,28 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName) } else if (type == REG_NONE || type == REG_BINARY) { - lRet = RegQueryValueEx(hKey, valueName, 0, 0, (LPBYTE)&dwordValueData, &valueDataLen); + 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) { - error(hwnd, IDS_BAD_VALUE, valueName); + HeapFree(GetProcessHeap(), 0, binValueData); + error(hwnd, IDS_BAD_VALUE, valueName); goto done; } if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_BIN_DATA), hwnd, modify_binary_dlgproc) == IDOK) { - lRet = RegSetValueEx(hKey, valueName, 0, type, (LPBYTE)&dwordValueData, sizeof(DWORD)); + lRet = RegSetValueEx(hKey, valueName, 0, type, (LPBYTE)binValueData, valueDataLen); if (lRet == ERROR_SUCCESS) result = TRUE; } + if(binValueData != NULL) + HeapFree(GetProcessHeap(), 0, binValueData); } else { diff --git a/reactos/subsys/system/regedit/hexedit.c b/reactos/subsys/system/regedit/hexedit.c index cf28ee5f537..35160374206 100644 --- a/reactos/subsys/system/regedit/hexedit.c +++ b/reactos/subsys/system/regedit/hexedit.c @@ -29,8 +29,9 @@ typedef struct { HWND hWndSelf; HWND hWndParent; - HLOCAL hData; + HLOCAL hBuffer; DWORD style; + DWORD MaxBuffer; INT LineHeight; INT CharWidth; HFONT hFont; @@ -77,6 +78,106 @@ HEXEDIT_MoveCaret(PHEXEDIT_DATA hed, INT Col, INT Line) SetCaretPos(hed->LeftMargin + (Col * hed->CharWidth), hed->TopMargin + (Line * hed->LineHeight)); } +/*** Control specific messages ************************************************/ + +static LRESULT +HEXEDIT_HEM_LOADBUFFER(PHEXEDIT_DATA hed, PVOID Buffer, DWORD Size) +{ + if(Buffer != NULL && Size > 0) + { + LPVOID buf; + + if(hed->MaxBuffer > 0 && Size > hed->MaxBuffer) + { + Size = hed->MaxBuffer; + } + + if(hed->hBuffer) + { + if(Size > 0) + { + if(LocalSize(hed->hBuffer) != Size) + { + hed->hBuffer = LocalReAlloc(hed->hBuffer, Size, LMEM_MOVEABLE | LMEM_ZEROINIT); + } + } + else + { + hed->hBuffer = LocalFree(hed->hBuffer); + + return 0; + } + } + else if(Size > 0) + { + hed->hBuffer = LocalAlloc(LHND, Size); + } + + if(Size > 0) + { + buf = LocalLock(hed->hBuffer); + if(buf) + { + memcpy(buf, Buffer, Size); + } + else + Size = 0; + LocalUnlock(hed->hBuffer); + } + + return Size; + } + else if(hed->hBuffer) + { + hed->hBuffer = LocalFree(hed->hBuffer); + } + + return 0; +} + +static LRESULT +HEXEDIT_HEM_COPYBUFFER(PHEXEDIT_DATA hed, PVOID Buffer, DWORD Size) +{ + DWORD nCpy; + + if(!hed->hBuffer) + { + return 0; + } + + if(Buffer != NULL && Size > 0) + { + nCpy = min(Size, LocalSize(hed->hBuffer)); + if(nCpy > 0) + { + PVOID buf; + + buf = LocalLock(hed->hBuffer); + if(buf) + { + memcpy(Buffer, buf, nCpy); + } + else + nCpy = 0; + LocalUnlock(hed->hBuffer); + } + return nCpy; + } + + return (LRESULT)LocalSize(hed->hBuffer); +} + +static LRESULT +HEXEDIT_HEM_SETMAXBUFFERSIZE(PHEXEDIT_DATA hed, DWORD nMaxSize) +{ + hed->MaxBuffer = nMaxSize; + if(hed->MaxBuffer > 0 && hed->hBuffer && LocalSize(hed->hBuffer) > hed->MaxBuffer) + { + /* truncate the buffer */ + hed->hBuffer = LocalReAlloc(hed->hBuffer, hed->MaxBuffer, LMEM_MOVEABLE); + } +} + /*** Message Proc *************************************************************/ static LRESULT @@ -101,10 +202,10 @@ HEXEDIT_WM_NCCREATE(HWND hWnd, CREATESTRUCT *cs) static LRESULT HEXEDIT_WM_NCDESTROY(PHEXEDIT_DATA hed) { - if(hed->hData) + if(hed->hBuffer) { - while(LocalUnlock(hed->hData)); - LocalFree(hed->hData); + while(LocalUnlock(hed->hBuffer)); + LocalFree(hed->hBuffer); } SetWindowLong(hed->hWndSelf, 0, 0); @@ -176,6 +277,15 @@ HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) hed = (PHEXEDIT_DATA)GetWindowLong(hWnd, 0); switch(uMsg) { + case HEM_LOADBUFFER: + return HEXEDIT_HEM_LOADBUFFER(hed, (PVOID)wParam, (DWORD)lParam); + + case HEM_COPYBUFFER: + return HEXEDIT_HEM_COPYBUFFER(hed, (PVOID)wParam, (DWORD)lParam); + + case HEM_SETMAXBUFFERSIZE: + return HEXEDIT_HEM_SETMAXBUFFERSIZE(hed, (DWORD)lParam); + case WM_SETFOCUS: return HEXEDIT_WM_SETFOCUS(hed); diff --git a/reactos/subsys/system/regedit/hexedit.h b/reactos/subsys/system/regedit/hexedit.h index b103f857471..db0c778dfc2 100644 --- a/reactos/subsys/system/regedit/hexedit.h +++ b/reactos/subsys/system/regedit/hexedit.h @@ -11,6 +11,30 @@ UnregisterHexEditorClass(HINSTANCE hInstance); /* styles */ #define HES_READONLY (0x800) #define HES_LOWERCASE (0x10) -#define HES_UPPERCASE (0x8) +#define HES_UPPERCASE (0x8) +#define HES_AUTOVSCROLL (0x40) +#define HES_HIDEADDRESS (0x4) + +/* messages */ +#define HEM_BASE (WM_USER + 50) +#define HEM_LOADBUFFER (HEM_BASE + 1) +#define HEM_COPYBUFFER (HEM_BASE + 2) +#define HEM_SETMAXBUFFERSIZE (HEM_BASE + 3) + +/* macros */ +#define HexEdit_LoadBuffer(hWnd, Buffer, Size) \ + SendMessage((hWnd), HEM_LOADBUFFER, (WPARAM)(Buffer), (LPARAM)(Size)) + +#define HexEdit_ClearBuffer(hWnd) \ + SendMessage((hWnd), HEM_LOADBUFFER, 0, 0) + +#define HexEdit_CopyBuffer(hWnd, Buffer, nMax) \ + SendMessage((hWnd), HEM_COPYBUFFER, (WPARAM)(Buffer), (LPARAM)(nMax)) + +#define HexEdit_GetBufferSize(hWnd) \ + SendMessage((hWnd), HEM_COPYBUFFER, 0, 0) + +#define HexEdit_SetMaxBufferSize(hWnd, Size) \ + SendMessage((hWnd), HEM_SETMAXBUFFERSIZE, 0, (LPARAM)(Size)) #endif /* __HEXEDIT_H */ From 7d0c7ca8538da96c01307c9b9dc8fc86ef6474a7 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III <royce3@ev1.net> Date: Sun, 20 Jun 2004 14:12:00 +0000 Subject: [PATCH 1453/1463] much nicer-looking 8-bit versions of drives.ico and desktop.ico - the wine project is welcome to have this change if they want it. svn path=/trunk/; revision=9761 --- reactos/lib/shell32/shres.rc | 5544 ++++++++++++++++++---------------- 1 file changed, 2875 insertions(+), 2669 deletions(-) diff --git a/reactos/lib/shell32/shres.rc b/reactos/lib/shell32/shres.rc index 99bdd410dba..69a384ce283 100644 --- a/reactos/lib/shell32/shres.rc +++ b/reactos/lib/shell32/shres.rc @@ -4259,89 +4259,279 @@ END /* BINRES drive.ico */ 8 ICON drive.ico /* { - '00 00 01 00 08 00 20 20 00 00 01 00 04 00 E8 02' - '00 00 86 00 00 00 10 10 00 00 01 00 04 00 28 01' - '00 00 6E 03 00 00 30 30 00 00 01 00 08 00 A8 0E' - '00 00 96 04 00 00 20 20 00 00 01 00 08 00 A8 08' - '00 00 3E 13 00 00 10 10 00 00 01 00 08 00 68 05' - '00 00 E6 1B 00 00 30 30 00 00 01 00 20 00 A8 25' - '00 00 4E 21 00 00 20 20 00 00 01 00 20 00 A8 10' - '00 00 F6 46 00 00 10 10 00 00 01 00 20 00 68 04' - '00 00 9E 57 00 00 28 00 00 00 20 00 00 00 40 00' - '00 00 01 00 04 00 00 00 00 00 00 02 00 00 00 00' + '00 00 01 00 09 00 10 10 10 00 01 00 04 00 28 01' + '00 00 96 00 00 00 20 20 10 00 01 00 04 00 E8 02' + '00 00 BE 01 00 00 30 30 10 00 01 00 04 00 68 06' + '00 00 A6 04 00 00 10 10 00 00 01 00 08 00 68 05' + '00 00 0E 0B 00 00 20 20 00 00 01 00 08 00 A8 08' + '00 00 76 10 00 00 30 30 00 00 01 00 08 00 A8 0E' + '00 00 1E 19 00 00 10 10 00 00 01 00 20 00 68 04' + '00 00 C6 27 00 00 20 20 00 00 01 00 20 00 A8 10' + '00 00 2E 2C 00 00 30 30 00 00 01 00 20 00 A8 25' + '00 00 D6 3C 00 00 28 00 00 00 10 00 00 00 20 00' + '00 00 01 00 04 00 00 00 00 00 C0 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 80 00 00 00 00 80 00 00 80 80 00 00 00 00' '80 00 80 00 80 00 00 80 80 00 C0 C0 C0 00 80 80' '80 00 FF 00 00 00 00 FF 00 00 FF FF 00 00 00 00' 'FF 00 FF 00 FF 00 00 FF FF 00 FF FF FF 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 80 00 80 00 00 00 00 80 82 00 00 00 00 00' - '87 77 77 77 77 77 77 77 77 87 88 88 00 00 00 00' - '7F F7 88 87 87 77 77 77 77 77 2E 88 00 00 00 00' - '7F F8 88 88 78 78 77 88 77 77 77 78 00 00 00 00' - 'F7 F7 88 78 77 77 88 87 88 77 77 78 00 00 00 08' - '7F 77 88 88 87 78 88 78 88 77 77 77 00 00 00 00' - '7F FF 77 77 F7 77 77 77 77 77 77 78 00 00 00 00' - '7F FF FF FF FF FF FF FF FF 7F FF F8 00 00 00 04' - '7F 77 F7 FF 7F 7F 77 F7 F7 FF 77 F8 00 00 00 00' - 'F7 77 7F 77 7F 77 F7 F7 7F 77 77 77 00 00 00 00' - '77 77 77 77 F7 FF 7F 77 F7 77 77 F8 00 00 00 00' - '8F 77 77 FF 7F 77 F7 FF 7F 77 77 F8 00 00 00 00' - '8F 77 7F F7 F7 7F 7F 77 F7 7F 7F 78 00 00 00 00' - '8F 77 F7 77 7F 77 77 F7 7F 77 77 70 00 00 00 00' - '87 7F 77 7F 77 F7 7F 77 77 7F 77 70 00 00 00 00' - '07 77 F7 77 F7 77 77 77 77 77 7F 80 00 00 00 00' - '08 7F 77 F7 77 7F 77 77 77 77 77 80 00 00 00 00' - '08 F7 7F 7F 7F 77 F7 F7 F7 77 77 80 00 00 00 00' - '08 7F 77 F7 F7 FF 7F 7F 7F 77 F7 80 00 00 00 00' - '04 7F 7F 7F 7F 7F F7 F7 F7 F7 77 00 00 00 00 00' - '08 8F FF 77 F7 F7 7F 7F 7F 7F F8 00 00 00 00 00' - '00 77 77 FF 7F 7F F7 F7 FF 77 F8 00 00 00 00 00' - '00 8F 77 FF FF FF FF FF F7 7F 78 00 00 00 00 00' - '00 48 7F 77 F7 F7 7F 7F 77 F7 80 00 00 00 00 00' - '00 00 80 48 08 04 80 80 48 04 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 87' + '88 77 77 77 88 00 00 77 88 77 87 87 78 00 00 77' + '77 77 77 87 77 00 00 7F FF FF FF F7 F7 00 00 77' + '77 77 77 77 77 00 00 77 77 77 77 77 78 00 00 87' + '77 77 77 77 78 00 00 87 77 77 77 77 78 00 00 87' + '77 77 77 77 70 00 00 07 F7 7F FF 7F 70 00 00 07' + 'FF FF FF FF 70 00 00 08 77 77 77 77 80 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' - 'FF FF FF FF FF FF FF FF FF FF F0 00 00 0F E0 00' - '00 07 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 E0 00' - '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00' - '00 07 E0 00 00 07 F0 00 00 0F F0 00 00 0F F0 00' - '00 0F F0 00 00 0F F0 00 00 0F F8 00 00 1F F8 00' - '00 1F FC 00 00 3F FF FF FF FF FF FF FF FF 28 00' - '00 00 10 00 00 00 20 00 00 00 01 00 04 00 00 00' - '00 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 C0 03 00 00 80 01 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 80 01 00 00 80 01 00 00 C0 03' + '00 00 C0 03 00 00 C0 03 00 00 C0 03 00 00 C0 03' + '00 00 C0 03 00 00 E0 07 00 00 FF FF 00 00 28 00' + '00 00 20 00 00 00 40 00 00 00 01 00 04 00 00 00' + '00 00 80 02 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 80' '00 00 80 80 00 00 00 00 80 00 80 00 80 00 00 80' '80 00 C0 C0 C0 00 80 80 80 00 FF 00 00 00 00 FF' '00 00 FF FF 00 00 00 00 FF 00 FF 00 FF 00 00 FF' 'FF 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' - '80 00 00 02 00 00 00 87 88 77 77 77 68 00 00 F7' - '88 87 87 87 78 00 08 77 87 77 87 87 77 00 00 FF' - 'F7 FF 7F 7F 77 00 00 77 77 F7 F7 F7 77 00 00 77' - '7F 77 F7 7F 78 00 00 87 F7 7F 77 F7 F8 00 00 8F' - '77 F7 77 77 78 00 00 87 7F 77 7F 77 78 00 00 47' - 'F7 F7 F7 F7 70 00 00 07 F7 FF 7F 7F 70 00 00 08' - '7F 7F F7 F7 80 00 00 00 04 08 00 40 00 00 00 00' - '00 00 00 00 00 00 FF FF 00 00 80 01 00 00 80 01' - '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 07 77 77 77 77 77 77 77' + '77 77 88 80 00 00 00 00 7F F7 88 88 77 77 77 77' + '77 77 66 78 00 00 00 00 7F F7 88 88 77 77 87 77' + '87 77 77 78 00 00 00 00 7F F7 88 88 77 78 88 88' + '88 77 77 78 00 00 00 00 7F F7 88 88 77 78 88 88' + '88 77 77 78 00 00 00 00 7F FF 77 77 77 77 77 77' + '77 77 77 78 00 00 00 00 7F FF FF FF FF FF FF FF' + 'FF FF FF F8 00 00 00 00 7F 77 77 77 77 77 77 77' + '77 F7 7F F8 00 00 00 00 77 77 77 77 77 77 77 77' + '77 77 77 F7 00 00 00 00 77 77 77 77 77 FF FF 77' + '77 77 77 F8 00 00 00 00 8F 77 77 7F FF 77 77 FF' + 'F7 77 77 F8 00 00 00 00 8F 77 7F F7 77 77 77 77' + '77 F7 77 70 00 00 00 00 07 77 77 77 77 77 77 77' + '77 77 77 70 00 00 00 00 07 77 77 77 77 77 77 77' + '77 77 77 70 00 00 00 00 07 77 77 77 77 77 77 77' + '77 77 77 80 00 00 00 00 08 77 77 77 77 77 77 77' + '77 77 77 80 00 00 00 00 08 77 77 77 77 77 77 77' + '77 77 77 80 00 00 00 00 08 7F 77 77 77 77 77 77' + '7F 77 77 00 00 00 00 00 00 7F F7 77 FF FF FF FF' + '77 7F 77 00 00 00 00 00 00 7F FF F7 77 7F FF 77' + '7F FF 78 00 00 00 00 00 00 8F 77 FF FF FF FF FF' + 'F7 77 F8 00 00 00 00 00 00 8F 77 FF FF FF FF FF' + 'F7 77 78 00 00 00 00 00 00 08 77 77 77 77 77 77' + '77 77 80 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF F0 00 00 0F E0 00 00 07 E0 00' + '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00' + '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00' + '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00' + '00 0F F0 00 00 0F F0 00 00 0F F0 00 00 0F F0 00' + '00 0F F0 00 00 0F F0 00 00 1F F8 00 00 1F F8 00' + '00 1F F8 00 00 1F FC 00 00 3F FF 00 00 FF FF FF' + 'FF FF FF FF FF FF 28 00 00 00 30 00 00 00 60 00' + '00 00 01 00 04 00 00 00 00 00 00 06 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 80 00 00 80 00 00 00 80 80 00 80 00' + '00 00 80 00 80 00 80 80 00 00 C0 C0 C0 00 80 80' + '80 00 00 00 FF 00 00 FF 00 00 00 FF FF 00 FF 00' + '00 00 FF 00 FF 00 FF FF 00 00 FF FF FF 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 87 77 77 77 77 77' + '77 77 77 77 77 77 77 77 77 78 00 00 00 00 00 00' + '00 08 FF F7 88 88 77 77 77 77 77 77 77 77 77 77' + '33 87 80 00 00 00 00 00 00 07 FF F7 00 88 88 87' + '77 77 87 87 77 77 87 78 33 37 80 00 00 00 00 00' + '00 07 FF F7 88 88 88 77 77 77 87 87 87 87 87 77' + '77 87 80 00 00 00 00 00 00 07 FF F7 88 88 88 77' + '77 78 87 87 87 87 87 77 77 77 80 00 00 00 00 00' + '00 07 FF F7 88 88 88 77 77 78 87 87 87 87 87 77' + '77 77 80 00 00 00 00 00 00 07 FF F7 88 88 88 87' + '77 78 87 88 87 87 87 77 77 77 80 00 00 00 00 00' + '00 07 FF F7 77 77 77 77 77 77 77 77 77 77 77 77' + '77 77 80 00 00 00 00 00 00 07 FF FF FF FF FF FF' + '77 77 77 77 77 77 77 77 77 77 80 00 00 00 00 00' + '00 07 FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF F7 80 00 00 00 00 00 00 07 FF FF FF 77 77 7F' + 'FF FF FF FF FF FF FF FF FF FF 80 00 00 00 00 00' + '00 07 F7 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 7F 80 00 00 00 00 00 00 07 F7 77 77 77 77 77' + '77 77 77 77 77 77 77 77 77 7F 80 00 00 00 00 00' + '00 07 F7 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 7F 80 00 00 00 00 00 00 07 F7 77 77 77 77 7F' + 'FF FF FF FF F7 77 77 77 77 7F 80 00 00 00 00 00' + '00 08 F7 77 77 77 7F FF 77 77 77 77 FF FF 77 77' + '77 77 00 00 00 00 00 00 00 08 F7 77 77 7F F7 77' + '77 77 77 77 77 7F F7 77 77 77 00 00 00 00 00 00' + '00 00 77 77 77 F7 77 77 77 77 77 77 77 77 7F 77' + '77 F7 00 00 00 00 00 00 00 00 77 77 7F 77 77 77' + '77 77 77 77 77 77 77 F7 77 F8 00 00 00 00 00 00' + '00 00 87 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 F8 00 00 00 00 00 00 00 00 87 77 77 77 77 77' + '77 77 77 77 77 77 77 77 77 78 00 00 00 00 00 00' + '00 00 87 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 70 00 00 00 00 00 00 00 00 87 77 77 77 77 77' + '77 77 77 77 77 77 77 77 77 70 00 00 00 00 00 00' + '00 00 07 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 80 00 00 00 00 00 00 00 00 07 77 77 77 77 77' + '77 77 77 77 77 77 77 77 77 80 00 00 00 00 00 00' + '00 00 08 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 80 00 00 00 00 00 00 00 00 08 7F F7 77 FF FF' + 'FF FF FF FF FF FF 77 7F 77 00 00 00 00 00 00 00' + '00 00 08 7F FF F7 77 FF FF FF FF FF FF 77 7F FF' + '77 00 00 00 00 00 00 00 00 00 00 7F FF FF 77 77' + 'FF FF FF FF 77 77 FF FF 78 00 00 00 00 00 00 00' + '00 00 00 7F FF FF FF FF 77 77 77 77 7F FF FF FF' + '78 00 00 00 00 00 00 00 00 00 00 8F 77 77 FF FF' + 'FF FF FF FF FF FF 77 7F 78 00 00 00 00 00 00 00' + '00 00 00 8F 77 77 FF FF FF FF FF FF FF F7 77 7F' + '78 00 00 00 00 00 00 00 00 00 00 87 77 7F FF FF' + 'FF FF FF FF FF FF 77 77 70 00 00 00 00 00 00 00' + '00 00 00 08 77 77 77 77 77 77 77 77 77 77 77 77' + '80 00 00 00 00 00 00 00 00 00 00 00 08 88 88 88' + '88 88 88 88 88 88 88 80 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 FE 00 00 00 00 FF 00 00 FC 00' + '00 00 00 3F 00 00 FC 00 00 00 00 3F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 3F 00 00 FC 00 00 00 00 3F 00 00 FC 00' + '00 00 00 3F 00 00 FC 00 00 00 00 3F 00 00 FC 00' + '00 00 00 3F 00 00 FC 00 00 00 00 3F 00 00 FC 00' + '00 00 00 7F 00 00 FE 00 00 00 00 7F 00 00 FE 00' + '00 00 00 7F 00 00 FE 00 00 00 00 7F 00 00 FE 00' + '00 00 00 7F 00 00 FE 00 00 00 00 7F 00 00 FE 00' + '00 00 00 FF 00 00 FF 00 00 00 00 FF 00 00 FF 00' + '00 00 00 FF 00 00 FF 00 00 00 00 FF 00 00 FF 00' + '00 00 00 FF 00 00 FF 00 00 00 00 FF 00 00 FF 80' + '00 00 01 FF 00 00 FF 80 00 00 03 FF 00 00 FF C0' + '00 00 07 FF 00 00 FF F0 00 00 0F FF 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 08 00 00 00' + '00 00 40 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 11 00 11 11' + '11 00 22 00 00 00 22 22 22 00 44 44 44 00 55 55' + '55 00 66 66 66 00 77 77 77 00 7F 7F 7F 00 33 CC' + '99 00 88 88 88 00 99 99 99 00 AA AA AA 00 BB BB' + 'BB 00 99 CC 99 00 CC CC CC 00 DD DD DD 00 EE EE' + 'EE 00 00 00 00 00 CC CC CC 00 DD DD DD 00 EE EE' + 'EE 00 FF FF FF 00 00 00 00 00 FF FF FF 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 17' + '95 00 00 00 38 00 A8 44 F9 00 13 00 00 00 18 0A' + '38 00 00 00 38 00 98 69 38 00 98 17 95 00 00 00' + '00 00 E0 19 95 00 F0 88 FA 00 70 38 F5 00 FF FF' + 'FF 00 A8 44 F9 00 70 7D F5 00 3A 8A F5 00 86 00' + '00 00 86 00 00 00 08 00 00 00 B0 18 95 00 00 00' + '00 00 CB 44 F9 00 D8 90 07 00 CD 8B F5 00 78 13' + '05 00 37 90 F5 00 00 00 00 00 3E 8A F5 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 10 00 00 00 00 00 00 00 5C 00' + '5E 00 00 EC FD 00 1A 02 00 00 4C 16 95 00 E0 90' + '07 00 FC 15 95 00 FF FF FF 00 B4 1A 95 00 45 00' + '00 00 28 02 00 00 FF FF FF 00 E2 D8 F5 00 7D 9B' + 'F5 00 94 B6 01 00 00 00 05 00 F4 17 95 00 80 00' + '10 00 B4 1A 95 00 F0 88 FA 00 88 1C F5 00 FF FF' + 'FF 00 37 90 F5 00 00 00 00 00 3E 8A F5 00 9B B2' + 'E7 00 B7 00 00 00 02 00 00 00 A4 1A 95 00 01 00' + '00 00 18 00 00 00 00 00 00 00 10 19 95 00 42 00' + '00 00 00 00 00 00 F4 18 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 0C 00 00 00 02 00 00 00 01 01' + 'F5 00 00 EC FD 00 5C 00 00 00 00 00 00 00 03 00' + '00 00 64 00 1A 00 E0 90 07 00 00 00 00 00 E0 90' + '07 00 05 00 00 00 BE B3 E7 00 4C 19 95 00 A3 B4' + 'E7 00 28 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 02 00 00 00 80 00 00 00 00 00 00 00 8C 1A' + '95 00 7F E9 4B 00 D0 60 38 00 00 00 00 00 00 00' + '00 00 80 1A 95 00 02 00 00 00 80 00 00 00 00 00' + '00 00 C0 27 95 00 C4 F5 AF 00 02 00 00 00 45 3A' + '5C 00 79 67 77 00 6E 5C 68 00 6D 65 5C 00 76 73' + '5C 00 69 6E 65 00 64 6C 6C 00 5C 73 68 00 6C 6C' + '33 00 5C 64 72 00 76 65 2E 00 63 6F 00 00 14 1A' + '95 00 1F 3B D4 00 13 00 00 00 98 00 00 00 4F 3B' + 'D4 00 E0 19 95 00 33 3B D4 00 64 C5 F5 00 A9 F1' + 'E7 00 28 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 1A 95 00 98 69 38 00 86 00 00 00 00 00' + '00 00 C9 F1 E7 00 86 00 00 00 A4 1A 95 00 08 00' + '00 00 00 00 00 00 86 00 00 00 86 00 00 00 08 00' + '00 00 F4 19 95 00 33 3B D4 00 B4 1A 95 00 09 48' + 'E9 00 B8 10 E9 00 FF FF FF 00 C9 F1 E7 00 16 EA' + '4B 00 28 01 00 00 98 69 38 00 86 00 00 00 58 1A' + '95 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 94 02 04 02 02 02 02 02' + '02 02 02 B7 00 00 00 94 0C 0E 09 0C 0D 0D 0E 0E' + '0D 0D 0A D5 B2 00 00 02 11 10 07 0B 0D 0D 0C 0D' + '0C 0E 0F 0C 64 00 00 02 11 11 0C 0D 0E 0E 0D 0D' + '0C 0E 10 0C 94 00 00 02 11 12 12 12 11 11 12 11' + '11 11 11 0D 94 00 00 02 10 0E 10 11 11 11 11 11' + '11 10 10 0E 94 00 00 94 0D 10 10 11 11 11 11 11' + '11 10 10 0C 00 00 00 00 0B 11 11 10 10 10 10 10' + '10 11 11 D3 00 00 00 00 07 11 10 10 10 10 10 10' + '10 10 10 06 00 00 00 00 05 11 11 11 11 11 11 10' + '10 10 10 04 00 00 00 00 04 10 11 11 11 11 11 11' + '11 11 0E 02 00 00 00 00 64 0E 11 12 12 12 12 12' + '11 11 0D A2 00 00 00 00 00 08 10 11 11 11 11 11' + '10 10 07 00 00 00 00 00 00 94 04 04 04 04 04 04' + '04 04 A0 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF 00 00 C0 03 00 00 80 01' '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' '00 00 80 01 00 00 C0 03 00 00 C0 03 00 00 C0 03' - '00 00 FF FF 00 00 28 00 00 00 30 00 00 00 60 00' - '00 00 01 00 08 00 00 00 00 00 00 09 00 00 00 00' + '00 00 C0 03 00 00 C0 03 00 00 C0 03 00 00 E0 07' + '00 00 FF FF 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 08 00 00 00 00 00 80 04 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 11 00 11 11 11 00 22 22 22 00 33 33' - '33 00 44 44 44 00 55 55 55 00 66 66 66 00 77 77' - '77 00 7F 7F 7F 00 00 99 66 00 33 99 66 00 00 CC' - '66 00 33 CC 66 00 66 99 99 00 88 88 88 00 99 99' - '99 00 AA AA AA 00 BB BB BB 00 99 CC 99 00 99 FF' - '99 00 99 CC CC 00 CC CC CC 00 DD DD DD 00 EE EE' - 'EE 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' + '00 00 11 00 00 00 00 11 00 00 11 11 11 00 22 22' + '22 00 33 33 33 00 44 44 44 00 55 55 55 00 66 66' + '66 00 77 77 77 00 7F 7F 7F 00 00 CC 66 00 66 99' + '99 00 33 CC 99 00 66 CC 99 00 88 88 88 00 99 99' + '99 00 AA AA AA 00 BB BB BB 00 99 CC 99 00 CC CC' + 'CC 00 DD DD DD 00 EE EE EE 00 FF FF FF 00 00 00' + '00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' @@ -4356,48 +4546,48 @@ END '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 C0 17 95 00 00 00 38 00 A8 44' - 'F9 77 13 00 00 00 18 0A 38 00 00 00 38 00 98 69' + 'F9 00 13 00 00 00 18 0A 38 00 00 00 38 00 98 69' '38 00 98 17 95 00 00 00 00 00 E0 19 95 00 F0 88' - 'FA 77 70 38 F5 77 FF FF FF FF A8 44 F9 77 70 7D' - 'F5 77 3A 8A F5 77 86 00 00 00 86 00 00 00 08 00' - '00 00 B0 18 95 00 00 00 00 00 CB 44 F9 77 D8 90' - '07 00 CD 8B F5 77 78 13 05 00 37 90 F5 77 00 00' - '00 00 3E 8A F5 77 00 00 00 00 00 00 00 00 00 00' + 'FA 00 70 38 F5 00 FF FF FF 00 A8 44 F9 00 70 7D' + 'F5 00 3A 8A F5 00 86 00 00 00 86 00 00 00 08 00' + '00 00 B0 18 95 00 00 00 00 00 CB 44 F9 00 D8 90' + '07 00 CD 8B F5 00 78 13 05 00 37 90 F5 00 00 00' + '00 00 3E 8A F5 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00' - '00 00 00 00 00 00 5C 00 5E 00 00 EC FD 7F 1A 02' + '00 00 00 00 00 00 5C 00 5E 00 00 EC FD 00 1A 02' '00 00 4C 16 95 00 E0 90 07 00 FC 15 95 00 FF FF' - 'FF FF B4 1A 95 00 45 00 00 00 28 02 00 00 FF FF' - 'FF FF E2 D8 F5 77 7D 9B F5 77 94 B6 01 00 00 00' - '05 00 F4 17 95 00 80 00 10 C0 B4 1A 95 00 F0 88' - 'FA 77 88 1C F5 77 FF FF FF FF 37 90 F5 77 00 00' - '00 00 3E 8A F5 77 9B B2 E7 77 B7 00 00 00 02 00' + 'FF 00 B4 1A 95 00 45 00 00 00 28 02 00 00 FF FF' + 'FF 00 E2 D8 F5 00 7D 9B F5 00 94 B6 01 00 00 00' + '05 00 F4 17 95 00 80 00 10 00 B4 1A 95 00 F0 88' + 'FA 00 88 1C F5 00 FF FF FF 00 37 90 F5 00 00 00' + '00 00 3E 8A F5 00 9B B2 E7 00 B7 00 00 00 02 00' '00 00 A4 1A 95 00 01 00 00 00 18 00 00 00 00 00' '00 00 10 19 95 00 42 00 00 00 00 00 00 00 F4 18' '95 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00' - '00 00 02 00 00 00 01 01 F5 77 00 EC FD 7F 5C 00' - '00 00 00 00 00 00 03 00 00 00 64 00 1A 02 E0 90' + '00 00 02 00 00 00 01 01 F5 00 00 EC FD 00 5C 00' + '00 00 00 00 00 00 03 00 00 00 64 00 1A 00 E0 90' '07 00 00 00 00 00 E0 90 07 00 05 00 00 00 BE B3' - 'E7 77 4C 19 95 00 A3 B4 E7 77 28 01 00 00 00 00' - '00 C0 00 00 00 00 00 00 00 00 02 00 00 00 80 00' + 'E7 00 4C 19 95 00 A3 B4 E7 00 28 01 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 02 00 00 00 80 00' '00 00 00 00 00 00 8C 1A 95 00 7F E9 4B 00 D0 60' - '38 00 00 00 00 C0 00 00 00 00 80 1A 95 00 02 00' + '38 00 00 00 00 00 00 00 00 00 80 1A 95 00 02 00' '00 00 80 00 00 00 00 00 00 00 C0 27 95 00 C4 F5' - 'AF 00 02 00 00 00 45 3A 5C 63 79 67 77 69 6E 5C' - '68 6F 6D 65 5C 63 76 73 5C 77 69 6E 65 5C 64 6C' - '6C 73 5C 73 68 65 6C 6C 33 32 5C 64 72 69 76 65' - '2E 69 63 6F 00 00 14 1A 95 00 1F 3B D4 77 13 00' - '00 00 98 00 00 00 4F 3B D4 77 E0 19 95 00 33 3B' - 'D4 77 64 C5 F5 77 A9 F1 E7 77 28 01 00 00 00 00' + 'AF 00 02 00 00 00 45 3A 5C 00 79 67 77 00 6E 5C' + '68 00 6D 65 5C 00 76 73 5C 00 69 6E 65 00 64 6C' + '6C 00 5C 73 68 00 6C 6C 33 00 5C 64 72 00 76 65' + '2E 00 63 6F 00 00 14 1A 95 00 1F 3B D4 00 13 00' + '00 00 98 00 00 00 4F 3B D4 00 E0 19 95 00 33 3B' + 'D4 00 64 C5 F5 00 A9 F1 E7 00 28 01 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 1A 95 00 98 69' - '38 00 86 00 00 00 00 00 00 00 C9 F1 E7 77 86 00' + '38 00 86 00 00 00 00 00 00 00 C9 F1 E7 00 86 00' '00 00 A4 1A 95 00 08 00 00 00 00 00 00 00 86 00' '00 00 86 00 00 00 08 00 00 00 F4 19 95 00 33 3B' - 'D4 77 B4 1A 95 00 09 48 E9 77 B8 10 E9 77 FF FF' - 'FF FF C9 F1 E7 77 16 EA 4B 00 28 01 00 00 98 69' + 'D4 00 B4 1A 95 00 09 48 E9 00 B8 10 E9 00 FF FF' + 'FF 00 C9 F1 E7 00 16 EA 4B 00 28 01 00 00 98 69' '38 00 86 00 00 00 58 1A 95 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' @@ -4407,130 +4597,1208 @@ END '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 03 04 04 04 04 04 04 04 04 04 04 04 04' + '04 04 04 04 04 04 04 04 64 00 00 00 00 00 00 00' + '00 00 06 12 14 12 12 12 12 12 12 12 12 12 12 12' + '12 12 12 12 12 11 10 10 10 04 00 00 00 00 00 00' + '00 64 12 16 16 11 07 D3 0F 10 11 12 12 12 12 12' + '12 12 12 12 12 12 0D 0B 13 0A 00 00 00 00 00 00' + '00 03 14 16 16 11 07 09 0F 10 11 11 12 10 10 10' + '11 11 10 11 11 12 13 13 11 10 A0 00 00 00 00 00' + '00 03 14 16 16 12 D4 0A 0F 10 11 11 12 10 0A 0F' + '10 10 0F 10 11 14 12 12 14 0F A2 00 00 00 00 00' + '00 03 14 16 16 12 09 0F 10 10 11 11 12 10 0A 0F' + '10 10 0F 10 11 14 14 12 14 0F 00 00 00 00 00 00' + '00 03 14 16 16 16 15 15 15 15 15 15 15 14 14 14' + '14 14 14 14 14 14 14 14 14 0F 00 00 00 00 00 00' + '00 03 14 17 17 17 17 17 17 17 16 16 16 16 16 16' + '16 16 16 16 16 16 16 16 16 0F 00 00 00 00 00 00' + '00 03 15 16 15 15 15 15 15 15 15 15 15 15 15 15' + '15 15 15 15 15 15 15 15 17 10 00 00 00 00 00 00' + '00 03 14 15 11 11 12 15 15 15 15 15 15 15 15 15' + '15 15 15 15 14 11 11 12 16 10 00 00 00 00 00 00' + '00 00 12 15 12 12 12 15 14 14 15 15 15 15 15 15' + '15 15 14 14 14 12 12 12 16 0A 00 00 00 00 00 00' + '00 00 0F 15 14 14 14 14 15 15 15 15 15 15 15 15' + '15 16 15 15 14 14 14 14 16 07 00 00 00 00 00 00' + '00 00 08 15 14 14 14 15 15 15 14 14 14 14 14 14' + '14 14 15 15 15 14 14 14 15 05 00 00 00 00 00 00' + '00 00 06 15 14 14 15 15 14 14 14 14 14 14 14 14' + '14 14 14 14 14 15 14 14 12 04 00 00 00 00 00 00' + '00 00 04 14 14 14 15 14 14 14 14 14 14 14 14 14' + '14 14 14 14 14 14 14 14 11 94 00 00 00 00 00 00' + '00 00 03 11 15 14 14 14 14 14 14 14 14 14 14 14' + '12 12 14 14 14 14 14 14 0F 00 00 00 00 00 00 00' + '00 00 00 10 15 14 14 15 14 14 14 14 14 15 15 14' + '14 14 12 12 12 12 12 14 08 00 00 00 00 00 00 00' + '00 00 00 09 15 15 14 15 15 15 15 15 15 15 15 15' + '15 15 15 15 15 14 14 14 06 00 00 00 00 00 00 00' + '00 00 00 07 15 15 15 15 15 15 15 15 15 15 15 15' + '15 15 15 15 15 15 15 12 05 00 00 00 00 00 00 00' + '00 00 00 05 14 15 15 15 15 15 15 15 15 15 15 15' + '15 15 15 15 15 15 15 11 03 00 00 00 00 00 00 00' + '00 00 00 04 12 16 16 16 15 15 15 15 15 15 15 15' + '15 15 15 15 16 16 15 10 94 00 00 00 00 00 00 00' + '00 00 00 64 10 16 14 14 16 16 16 16 16 16 16 16' + '16 16 16 15 14 15 15 09 00 00 00 00 00 00 00 00' + '00 00 00 00 0A 15 14 14 16 17 17 17 17 17 17 17' + '17 17 17 15 14 14 14 07 00 00 00 00 00 00 00 00' + '00 00 00 00 04 10 14 14 15 15 15 15 15 15 15 15' + '15 15 15 15 14 14 0A 03 00 00 00 00 00 00 00 00' + '00 00 00 00 00 03 04 04 04 04 04 04 04 04 04 04' + '04 04 04 04 04 04 64 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A' - '1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A' - '1A 1A 1A 1A 1A 1A 1A 00 00 00 00 00 00 00 00 00' - '00 00 00 00 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A' - '1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A' - '1A 1A 1A 1A 1A 1A 1A 1A 1A 00 00 00 00 00 00 00' - '00 00 00 1A 1A 1A 1A 02 03 03 04 03 03 04 03 03' - '04 03 03 04 03 03 03 04 03 03 03 03 04 03 03 04' - '03 03 03 04 01 1A 1A 1A 1A 00 00 00 00 00 00 00' - '00 00 00 1A 1A 03 10 16 16 16 16 16 16 16 16 16' - '12 16 12 12 16 12 12 12 16 12 12 12 12 12 12 11' - '12 12 11 11 11 07 1A 1A 1A 00 00 00 00 00 00 00' - '00 00 1A 1A 1A 0F 17 18 18 17 0F 0F 10 10 10 11' - '12 16 12 16 16 16 16 17 16 16 16 17 16 16 16 16' - '16 11 0B 0B 13 12 06 1A 1A 1A 00 00 00 00 00 00' - '00 00 1A 1A 02 16 18 17 17 16 04 05 06 08 0F 0F' - '11 10 11 11 12 11 10 12 10 12 10 16 10 12 10 16' - '12 0D 0C 0A 0B 16 08 1A 1A 1A 00 00 00 00 00 00' - '00 00 1A 1A 03 16 18 17 18 17 05 06 08 0F 10 10' - '10 11 11 12 12 10 10 12 0F 12 10 12 10 12 0F 12' - '16 10 15 14 0E 16 0F 1A 1A 1A 00 00 00 00 00 00' - '00 00 1A 1A 04 17 18 18 17 16 07 08 08 0F 0F 10' - '10 11 11 11 12 11 08 12 08 11 0F 12 0F 12 08 16' - '16 12 11 10 16 12 10 1A 1A 1A 00 00 00 00 00 00' - '00 00 1A 1A 03 16 18 17 18 17 07 08 08 0F 0F 10' - '11 11 11 11 12 10 08 11 07 10 08 11 0F 11 07 12' - '12 16 12 16 12 16 0F 1A 1A 1A 00 00 00 00 00 00' - '00 00 1A 1A 03 17 18 18 17 17 07 07 08 0F 0F 0F' - '10 11 10 11 12 0F 07 11 06 10 07 12 07 11 06 16' - '16 12 16 12 12 16 0F 1A 1A 1A 00 00 00 00 00 00' - '00 00 1A 1A 03 16 18 18 18 17 11 11 11 11 11 12' - '11 12 12 12 12 12 11 12 11 12 12 12 11 12 11 12' - '16 12 16 12 16 12 10 1A 1A 1A 00 00 00 00 00 00' - '00 00 1A 1A 03 17 18 18 18 18 17 18 18 18 17 17' - '18 17 17 17 17 17 17 17 17 17 16 17 16 16 16 16' - '16 16 12 16 12 16 0F 1A 1A 1A 00 00 00 00 00 00' - '00 00 1A 1A 03 16 18 19 19 18 19 19 18 18 18 19' - '18 19 18 19 18 18 18 18 18 18 18 18 18 18 18 18' - '18 18 18 18 17 17 0F 1A 1A 1A 00 00 00 00 00 00' - '00 00 1A 1A 03 17 19 17 17 18 17 17 18 17 17 17' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 00' + '00 0F E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00' + '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00' + '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00' + '00 07 E0 00 00 07 E0 00 00 0F F0 00 00 0F F0 00' + '00 0F F0 00 00 0F F0 00 00 0F F0 00 00 0F F0 00' + '00 1F F8 00 00 1F F8 00 00 1F F8 00 00 1F FC 00' + '00 3F FF 00 00 FF FF FF FF FF FF FF FF FF 28 00' + '00 00 30 00 00 00 60 00 00 00 01 00 08 00 00 00' + '00 00 80 0A 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 11 00 11 11' + '11 00 22 22 22 00 33 33 33 00 44 44 44 00 55 55' + '55 00 66 66 66 00 77 77 77 00 7F 7F 7F 00 00 99' + '66 00 33 99 66 00 00 CC 66 00 33 CC 66 00 66 99' + '99 00 88 88 88 00 99 99 99 00 AA AA AA 00 BB BB' + 'BB 00 99 CC 99 00 99 FF 99 00 99 CC CC 00 CC CC' + 'CC 00 DD DD DD 00 EE EE EE 00 FF FF FF 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 17' + '95 00 00 00 38 00 A8 44 F9 00 13 00 00 00 18 0A' + '38 00 00 00 38 00 98 69 38 00 98 17 95 00 00 00' + '00 00 E0 19 95 00 F0 88 FA 00 70 38 F5 00 FF FF' + 'FF 00 A8 44 F9 00 70 7D F5 00 3A 8A F5 00 86 00' + '00 00 86 00 00 00 08 00 00 00 B0 18 95 00 00 00' + '00 00 CB 44 F9 00 D8 90 07 00 CD 8B F5 00 78 13' + '05 00 37 90 F5 00 00 00 00 00 3E 8A F5 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 10 00 00 00 00 00 00 00 5C 00' + '5E 00 00 EC FD 00 1A 02 00 00 4C 16 95 00 E0 90' + '07 00 FC 15 95 00 FF FF FF 00 B4 1A 95 00 45 00' + '00 00 28 02 00 00 FF FF FF 00 E2 D8 F5 00 7D 9B' + 'F5 00 94 B6 01 00 00 00 05 00 F4 17 95 00 80 00' + '10 00 B4 1A 95 00 F0 88 FA 00 88 1C F5 00 FF FF' + 'FF 00 37 90 F5 00 00 00 00 00 3E 8A F5 00 9B B2' + 'E7 00 B7 00 00 00 02 00 00 00 A4 1A 95 00 01 00' + '00 00 18 00 00 00 00 00 00 00 10 19 95 00 42 00' + '00 00 00 00 00 00 F4 18 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 0C 00 00 00 02 00 00 00 01 01' + 'F5 00 00 EC FD 00 5C 00 00 00 00 00 00 00 03 00' + '00 00 64 00 1A 00 E0 90 07 00 00 00 00 00 E0 90' + '07 00 05 00 00 00 BE B3 E7 00 4C 19 95 00 A3 B4' + 'E7 00 28 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 02 00 00 00 80 00 00 00 00 00 00 00 8C 1A' + '95 00 7F E9 4B 00 D0 60 38 00 00 00 00 00 00 00' + '00 00 80 1A 95 00 02 00 00 00 80 00 00 00 00 00' + '00 00 C0 27 95 00 C4 F5 AF 00 02 00 00 00 45 3A' + '5C 00 79 67 77 00 6E 5C 68 00 6D 65 5C 00 76 73' + '5C 00 69 6E 65 00 64 6C 6C 00 5C 73 68 00 6C 6C' + '33 00 5C 64 72 00 76 65 2E 00 63 6F 00 00 14 1A' + '95 00 1F 3B D4 00 13 00 00 00 98 00 00 00 4F 3B' + 'D4 00 E0 19 95 00 33 3B D4 00 64 C5 F5 00 A9 F1' + 'E7 00 28 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 1A 95 00 98 69 38 00 86 00 00 00 00 00' + '00 00 C9 F1 E7 00 86 00 00 00 A4 1A 95 00 08 00' + '00 00 00 00 00 00 86 00 00 00 86 00 00 00 08 00' + '00 00 F4 19 95 00 33 3B D4 00 B4 1A 95 00 09 48' + 'E9 00 B8 10 E9 00 FF FF FF 00 C9 F1 E7 00 16 EA' + '4B 00 28 01 00 00 98 69 38 00 86 00 00 00 58 1A' + '95 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03' + '04 04 04 04 04 04 04 04 04 04 04 04 04 04 03 03' + '03 03 03 03 03 03 03 04 04 04 04 04 02 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 03 0F 16' + '16 16 16 16 16 16 16 16 16 16 16 12 12 12 12 12' + '12 12 12 12 12 12 12 12 12 12 11 11 11 07 64 00' + '00 00 00 00 00 00 00 00 00 00 00 00 A2 0F 18 18' + '18 17 0F 0F 10 10 11 11 12 12 12 16 16 16 16 17' + '16 16 16 17 16 16 16 16 16 11 0B 0B 10 12 06 00' + '00 00 00 00 00 00 00 00 00 00 00 00 02 16 18 17' + '18 16 04 05 06 08 0F 10 10 11 11 11 12 11 10 12' + '10 12 10 12 11 12 10 16 12 0E 0C 0C 0B 12 0F A2' + '00 00 00 00 00 00 00 00 00 00 00 00 03 16 18 17' + '18 16 05 07 08 0F 0F 10 10 11 11 11 12 11 0F 12' + '0F 11 10 12 10 12 0F 12 16 11 15 15 10 12 0F A2' + '00 00 00 00 00 00 00 00 00 00 00 00 03 16 18 18' + '18 16 07 08 09 0F 0F 10 10 11 11 11 12 10 09 12' + '09 11 0F 12 0F 11 08 12 16 16 11 10 12 16 0F A2' + '00 00 00 00 00 00 00 00 00 00 00 00 03 16 18 18' + '18 17 D3 08 09 0F 0F 10 10 11 11 11 12 10 08 11' + 'D3 10 08 12 09 11 07 12 16 16 16 16 12 16 0F A2' + '00 00 00 00 00 00 00 00 00 00 00 00 03 16 18 18' + '18 17 D3 D4 08 09 0F 10 10 11 11 11 12 0F 07 11' + '06 10 D4 11 D3 11 06 12 16 16 12 12 12 16 0F A2' + '00 00 00 00 00 00 00 00 00 00 00 00 03 16 18 18' + '18 17 11 11 11 11 11 12 12 12 12 12 12 12 11 12' + '11 12 11 12 11 12 11 16 16 16 16 12 12 16 0F 00' + '00 00 00 00 00 00 00 00 00 00 00 00 03 16 18 18' + '18 18 18 18 18 18 18 17 17 17 17 17 17 17 17 17' + '17 17 17 16 16 16 16 16 16 16 16 16 12 16 0F 00' + '00 00 00 00 00 00 00 00 00 00 00 00 03 16 19 19' + '18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18' + '18 18 18 18 18 18 18 18 18 18 18 18 17 16 0F 00' + '00 00 00 00 00 00 00 00 00 00 00 00 03 17 19 18' '17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17' - '18 17 18 17 19 18 0F 1A 1A 1A 00 00 00 00 00 00' - '00 00 1A 1A 03 17 19 17 16 12 12 17 16 17 17 16' - '17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17' - '16 12 12 16 17 19 10 1A 1A 1A 00 00 00 00 00 00' - '00 00 1A 1A 03 17 18 16 11 11 11 16 17 17 16 17' - '17 16 17 16 17 17 16 17 16 17 16 17 16 17 17 16' - '11 12 11 12 16 19 10 1A 1A 1A 00 00 00 00 00 00' - '00 00 1A 1A 1A 12 19 12 11 16 11 12 17 16 17 17' - '16 17 16 17 16 16 17 16 17 16 17 16 17 17 16 16' - '11 12 12 11 17 19 08 1A 1A 1A 00 00 00 00 00 00' - '00 00 00 1A 1A 11 18 16 16 16 16 16 16 17 16 16' - '17 17 17 18 18 18 18 18 17 18 17 17 16 16 17 16' - '16 16 12 16 16 18 06 1A 1A 00 00 00 00 00 00 00' - '00 00 00 1A 1A 08 18 17 16 16 16 16 16 16 17 18' - '18 17 17 17 17 17 17 17 17 17 17 18 18 18 16 16' - '16 16 16 16 17 17 04 1A 1A 00 00 00 00 00 00 00' - '00 00 00 1A 1A 06 18 16 16 16 16 16 17 18 18 17' - '16 17 17 17 16 17 17 16 17 17 16 17 17 17 18 17' - '16 16 16 16 17 12 03 1A 1A 00 00 00 00 00 00 00' - '00 00 00 1A 1A 05 17 16 16 16 16 16 18 17 16 16' - '16 17 16 16 16 17 16 16 17 16 16 17 16 16 17 18' - '16 16 16 16 17 11 1A 1A 1A 00 00 00 00 00 00 00' - '00 00 00 1A 1A 03 12 17 16 16 16 18 16 16 17 16' - '17 16 17 16 16 16 16 16 16 16 16 16 16 16 16 16' - '18 16 16 16 17 0F 1A 1A 1A 00 00 00 00 00 00 00' - '00 00 00 1A 1A 1A 10 17 16 16 17 16 17 16 16 16' + '17 17 17 17 17 17 17 17 17 17 17 17 19 18 0F 00' + '00 00 00 00 00 00 00 00 00 00 00 00 03 17 19 17' + '16 12 12 17 17 17 17 17 17 17 17 17 17 17 17 17' + '17 17 17 17 17 17 17 17 16 12 12 16 17 19 10 00' + '00 00 00 00 00 00 00 00 00 00 00 00 03 17 18 16' + '11 12 11 12 17 17 17 17 17 17 17 17 17 17 17 17' + '17 17 17 17 17 17 17 16 11 12 11 12 17 19 10 00' + '00 00 00 00 00 00 00 00 00 00 00 00 94 12 18 12' + '11 12 11 12 17 17 17 17 16 16 16 17 17 17 17 17' + '17 16 16 16 16 17 17 16 11 12 12 11 17 18 08 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 11 18 16' + '16 16 12 16 16 16 16 16 17 17 17 18 18 18 18 18' + '18 17 17 17 16 16 16 16 16 16 12 12 17 18 06 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 09 18 16' + '16 16 16 16 16 16 17 18 18 17 17 17 17 17 17 17' + '17 17 17 18 18 17 16 16 16 16 16 16 17 16 05 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 06 18 16' + '16 16 16 16 17 18 18 17 16 17 17 17 17 17 17 17' + '17 17 17 17 17 17 18 17 16 16 16 16 17 12 03 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 05 17 16' + '16 16 16 16 18 17 16 16 16 16 16 16 16 16 16 16' + '16 16 16 16 16 16 17 18 17 16 16 16 17 10 64 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 03 12 17' + '16 16 16 17 16 16 16 16 16 16 16 16 16 16 16 16' + '16 16 16 16 16 16 16 16 17 16 16 16 17 09 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 64 10 17' + '16 16 17 17 16 16 16 16 16 16 16 16 16 16 16 16' + '16 16 16 16 16 16 16 16 16 17 16 16 17 06 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 09 17' + '16 16 17 16 16 16 16 16 16 16 16 16 16 16 16 16' + '16 16 16 16 16 16 16 16 16 16 16 16 17 05 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 07 17' + '16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 12' + '12 12 16 16 16 16 16 16 16 16 16 16 16 04 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 17' '16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16' - '16 17 12 16 17 06 1A 1A 1A 00 00 00 00 00 00 00' - '00 00 00 00 1A 1A 0F 17 17 16 17 16 16 17 16 17' - '16 17 16 16 16 16 16 16 12 16 12 16 16 16 12 16' - '16 16 16 16 17 05 1A 1A 00 00 00 00 00 00 00 00' - '00 00 00 00 1A 1A 06 17 16 16 16 17 16 16 16 16' - '16 16 16 16 17 16 16 12 16 12 16 12 16 12 16 12' - '16 12 16 16 17 03 1A 1A 00 00 00 00 00 00 00 00' - '00 00 00 00 1A 1A 05 17 16 17 16 16 17 16 17 16' - '17 16 17 16 16 17 16 16 16 12 16 12 12 12 16 12' - '12 16 12 16 11 03 1A 1A 00 00 00 00 00 00 00 00' - '00 00 00 00 1A 1A 03 16 17 16 16 17 16 17 16 17' - '16 17 16 16 17 16 16 17 16 17 16 16 16 16 12 16' - '16 11 12 16 11 1A 1A 1A 00 00 00 00 00 00 00 00' - '00 00 00 00 1A 1A 02 12 17 17 16 16 17 17 17 17' - '17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 16' - '16 16 16 16 08 1A 1A 1A 00 00 00 00 00 00 00 00' - '00 00 00 00 1A 1A 1A 10 17 17 17 16 17 17 17 17' - '17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17' - '16 17 17 16 06 1A 1A 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 1A 1A 08 17 17 18 17 16 17 17 17' - '17 17 18 17 17 18 17 17 17 17 17 17 18 17 17 16' - '17 17 17 12 04 1A 1A 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 1A 1A 06 16 17 17 18 17 17 16 17' - '17 18 17 18 17 17 18 17 17 18 18 17 17 16 16 18' - '17 18 16 11 03 1A 1A 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 1A 1A 04 12 18 17 17 18 17 17 16' - '17 17 17 17 18 17 17 18 17 17 17 17 16 17 18 17' - '18 17 17 10 1A 1A 1A 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 1A 1A 02 11 18 18 18 18 18 18 18' - '17 17 17 17 17 17 17 17 17 17 17 17 18 18 17 18' - '17 18 17 0F 1A 1A 1A 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 1A 1A 1A 11 17 17 12 12 17 18 18' - '18 18 18 18 18 17 18 18 18 18 18 18 18 17 16 12' - '17 18 16 08 1A 1A 1A 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 1A 1A 0F 17 16 11 12 11 18 18' - '18 18 18 18 18 18 18 18 18 18 18 18 18 17 11 12' - '11 18 16 07 1A 1A 1A 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 1A 1A 07 16 17 17 17 17 19 19' - '19 19 19 19 19 19 19 19 19 19 19 19 19 18 17 17' - '17 17 11 04 1A 1A 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 1A 1A 02 0F 12 17 17 17 17 17' - '17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17' - '17 11 07 1A 1A 1A 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 1A 1A 1A 1A 05 05 05 05 05 05' - '05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05' - '05 04 1A 1A 1A 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 1A 1A 1A 1A 1A 1A 1A 1A 1A' - '1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A' - '1A 1A 1A 1A 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 1A 1A 1A 1A 1A 1A 1A' - '1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A' - '1A 1A 1A 00 00 00 00 00 00 00 00 00 00 00 00 00' + '16 16 12 12 12 12 12 12 12 12 12 16 11 03 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 16' + '17 17 16 17 17 17 17 17 17 17 17 17 17 17 17 17' + '17 17 16 16 16 16 16 16 12 12 12 16 10 64 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 11' + '17 17 16 16 17 17 17 17 17 17 17 17 17 17 17 17' + '17 17 17 17 17 17 17 17 16 16 16 16 08 A0 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 64 10' + '17 17 17 16 17 17 17 17 17 17 17 17 17 17 17 17' + '17 17 17 17 17 17 17 17 16 17 17 16 06 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08' + '16 17 17 17 16 17 17 17 17 17 17 17 17 17 17 17' + '17 17 17 17 17 17 17 16 17 17 17 12 04 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05' + '16 17 17 17 17 17 16 17 17 17 17 17 17 17 17 17' + '17 17 17 17 17 16 17 17 17 18 17 11 03 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04' + '12 18 18 18 18 18 17 16 16 17 17 17 17 17 17 17' + '17 17 17 16 16 17 18 18 18 18 16 10 02 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03' + '11 17 18 18 18 18 18 18 17 17 17 17 17 17 17 17' + '17 17 17 17 18 18 18 17 18 18 17 0F 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 64' + '10 17 17 12 12 17 18 18 18 18 18 18 18 18 18 18' + '18 18 18 18 18 17 12 12 16 18 16 08 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '0F 17 16 11 12 11 18 18 18 18 18 18 18 18 18 18' + '18 18 18 18 18 17 11 12 12 18 16 07 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '07 16 17 17 17 17 19 19 19 19 19 19 19 19 19 19' + '19 19 19 19 19 18 17 17 17 17 11 04 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '02 09 12 16 17 17 17 17 17 17 17 17 17 17 17 17' + '17 17 17 17 17 17 17 17 16 11 06 94 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 02 05 05 05 05 05 05 05 05 05 05 05 05 05 05' + '05 05 05 05 05 05 05 05 05 04 A0 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FE 00' + '00 00 00 FF 00 00 FC 00 00 00 00 3F 00 00 FC 00' + '00 00 00 3F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 3F 00 00 FC 00' + '00 00 00 3F 00 00 FC 00 00 00 00 3F 00 00 FC 00' + '00 00 00 3F 00 00 FC 00 00 00 00 3F 00 00 FC 00' + '00 00 00 3F 00 00 FC 00 00 00 00 7F 00 00 FE 00' + '00 00 00 7F 00 00 FE 00 00 00 00 7F 00 00 FE 00' + '00 00 00 7F 00 00 FE 00 00 00 00 7F 00 00 FE 00' + '00 00 00 7F 00 00 FE 00 00 00 00 FF 00 00 FF 00' + '00 00 00 FF 00 00 FF 00 00 00 00 FF 00 00 FF 00' + '00 00 00 FF 00 00 FF 00 00 00 00 FF 00 00 FF 00' + '00 00 00 FF 00 00 FF 80 00 00 01 FF 00 00 FF 80' + '00 00 03 FF 00 00 FF C0 00 00 07 FF 00 00 FF F0' + '00 00 0F FF 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 28 00 00 00 10 00 00 00 20 00' + '00 00 01 00 20 00 00 00 00 00 40 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 11 04 04 04 8A 16 16 16 A8 1B 1B' + '1B A8 18 18 18 A8 16 16 16 A8 15 15 15 A8 16 16' + '16 A8 15 15 15 A8 15 15 15 A8 14 13 14 A8 19 12' + '16 A8 05 03 04 84 00 00 00 0F 00 00 00 00 00 00' + '00 00 05 05 05 83 9B 9B 9B FF C1 C1 C1 FF 83 83' + '83 FF 9A 9A 9A FF AD AD AD FF B2 B2 B2 FF B3 B3' + 'B3 FF B5 B5 B5 FF B2 B1 B2 FF AC B2 AF FF 59 B0' + '84 FF 5B 6C 64 FF 04 01 03 71 00 00 00 00 00 00' + '00 00 13 13 13 B3 DC DC DC FF CB CB CB FF 65 65' + '65 FF 8A 8A 8A FF A7 A7 A7 FF AB AB AB FF 95 95' + '95 FF A2 A2 A2 FF 95 94 95 FF BA BF BC FF 8F CC' + 'AD FF 93 A1 9A FF 09 06 07 95 00 00 00 00 00 00' + '00 00 13 13 13 B2 D7 D7 D7 FF DE DE DE FF A1 A1' + 'A1 FF AC AC AC FF BA BA BA FF B7 B7 B7 FF A2 A2' + 'A2 FF A9 A9 A9 FF 9D 9D 9D FF C2 C1 C1 FF CF C9' + 'CC FF A2 A0 A1 FF 06 06 06 93 00 00 00 00 00 00' + '00 00 14 14 14 B3 D9 D9 D9 FF ED ED ED FF EA EA' + 'EA FF E8 E8 E8 FF E5 E5 E5 FF E5 E5 E5 FF E6 E6' + 'E6 FF E4 E4 E4 FF E4 E4 E4 FF DF DF DF FF E3 E3' + 'E3 FF B2 B2 B2 FF 04 05 05 94 00 00 00 00 00 00' + '00 00 11 11 11 A5 C6 C6 C6 FF BC BC BC FF CA CA' + 'CA FF D9 D9 D9 FF DA DA DA FF DA DA DA FF DB DB' + 'DB FF DA DA DA FF DA DA DA FF C6 C6 C6 FF C5 C5' + 'C5 FF B4 B4 B4 FF 04 04 04 8B 00 00 00 00 00 00' + '00 00 04 04 04 7B A8 A8 A8 FF CE CE CE FF CF CF' + 'CF FF DC DC DC FF DD DD DD FF DE DE DE FF DE DE' + 'DE FF DE DE DE FF DC DC DC FF CF CF CF FF D4 D4' + 'D4 FF 91 91 91 FF 00 00 00 69 00 00 00 00 00 00' + '00 00 00 00 00 53 85 85 85 FF DB DB DB FF D7 D7' + 'D7 FF D3 D3 D3 FF D0 D0 D0 FF CE CE CE FF CD CD' + 'CD FF CE CE CE FF D0 D0 D0 FF D6 D6 D6 FF D9 D9' + 'D9 FF 6E 6E 6E FE 00 00 00 43 00 00 00 00 00 00' + '00 00 00 00 00 2E 64 64 64 FA DD DD DD FF D3 D3' + 'D3 FF D0 D0 D0 FF D1 D1 D1 FF CF CF CF FF C8 C8' + 'C8 FF C4 C4 C4 FF C4 C4 C4 FF C5 C5 C5 FF CF CF' + 'CF FF 4D 4D 4D F3 00 00 00 20 00 00 00 00 00 00' + '00 00 00 00 00 0E 42 42 42 E8 D7 D7 D7 FF D6 D6' + 'D6 FF D9 D9 D9 FF D8 D8 D8 FF D8 D8 D8 FF D7 D7' + 'D7 FF D4 D4 D4 FF D3 D3 D3 FF CD CD CD FF C5 C5' + 'C5 FF 2C 2C 2C D8 00 00 00 0A 00 00 00 00 00 00' + '00 00 00 00 00 02 22 22 22 C5 D1 D1 D1 FF E3 E3' + 'E3 FF DC DC DC FF DF DF DF FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF DE DE DE FF E5 E5 E5 FF C0 C0' + 'C0 FF 11 11 11 B6 00 00 00 01 00 00 00 00 00 00' + '00 00 00 00 00 00 08 08 08 A1 BE BE BE FF E1 E1' + 'E1 FF EA EA EA FF EB EB EB FF EB EB EB FF EB EB' + 'EB FF EC EC EC FF E5 E5 E5 FF E5 E5 E5 FF A3 A3' + 'A3 FF 01 01 01 93 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 74 78 78 78 FF C7 C7' + 'C7 FF D9 D9 D9 FF DE DE DE FF DD DD DD FF DD DD' + 'DD FF DF DF DF FF D4 D4 D4 FF C7 C7 C7 FF 60 60' + '60 FF 00 00 00 65 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 11 04 04 04 94 1D 1D' + '1D CC 1C 1C 1C CC 1C 1C 1C CC 1C 1C 1C CC 1C 1C' + '1C CC 1C 1C 1C CC 1D 1D 1D CC 1B 1B 1B CB 02 02' + '02 88 00 00 00 0C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 80 01 00 00 80 01 00 00 C0 03' + '00 00 C0 03 00 00 C0 03 00 00 FF FF 00 00 28 00' + '00 00 20 00 00 00 40 00 00 00 01 00 20 00 00 00' + '00 00 80 0C 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 15 00 00 00 54 00 00' + '00 63 00 00 00 61 00 00 00 61 00 00 00 61 00 00' + '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' + '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' + '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' + '00 61 00 00 00 61 00 00 00 61 00 00 00 63 00 00' + '00 50 00 00 00 14 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 33 00 00 00 D7 0D 0D 0D FF 1B 1B' + '1B FF 1C 1C 1C FF 1E 1E 1E FF 1D 1D 1D FF 1D 1D' + '1D FF 1C 1C 1C FF 1B 1B 1B FF 1B 1B 1B FF 1B 1B' + '1B FF 1A 1A 1A FF 1A 1A 1A FF 1A 1A 1A FF 1A 1A' + '1A FF 1A 1A 1A FF 1A 1A 1A FF 1A 1A 1A FF 1A 1A' + '1A FF 1A 1A 1A FF 20 1C 1E FF 22 1B 1F FF 09 09' + '09 FF 00 00 00 C3 00 00 00 29 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 07 00 00 00 C9 40 40 40 FF BA BA BA FF CB CB' + 'CB FF BE BE BE FF B3 B3 B3 FF B4 B4 B4 FF B4 B4' + 'B4 FF B7 B7 B7 FF BB BB BB FF BB BB BB FF BB BB' + 'BB FF BC BC BC FF BE BE BE FF BD BD BD FF BC BC' + 'BC FF BB BB BB FF BA BA BA FF BA BA BA FF B4 B4' + 'B4 FF B1 AE AF FF 8C A4 98 FF 80 A5 93 FF 90 91' + '91 FF 21 21 21 FF 00 00 00 AB 00 00 00 07 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 3D 08 08 08 FD B7 B7 B7 FF F2 F2 F2 FF EE EE' + 'EE FF AF AF AF FF 51 51 51 FF 6E 6E 6E FF 89 89' + '89 FF 9A 9A 9A FF AB AB AB FF B3 B3 B3 FF BC BC' + 'BC FF B5 B5 B5 FF B5 B5 B5 FF BC BC BC FF BD BD' + 'BD FF BE BE BE FF B7 B7 B7 FF C0 C0 C0 FF C4 C1' + 'C3 FF B7 BF BA FF 2A BF 75 FF 0E C0 67 FF 8C B8' + 'A2 FF 80 79 7C FF 00 00 00 EC 00 00 00 25 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 58 19 19 19 FF CE CE CE FF EB EB EB FF EB EB' + 'EB FF AA AA AA FF 56 56 56 FF 7A 7A 7A FF 8C 8C' + '8C FF 96 96 96 FF A2 A2 A2 FF A9 A9 A9 FF B4 B4' + 'B4 FF A1 A1 A1 FF 97 97 97 FF A1 A1 A1 FF A5 A5' + 'A5 FF A5 A5 A5 FF 9B 9B 9B FF A7 A7 A7 FF B3 B1' + 'B2 FF BC C1 BE FF 87 C6 A6 FF 85 CC A8 FF A6 BC' + 'B1 FF 94 90 92 FF 02 02 02 F9 00 00 00 36 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 5A 18 18 18 FF CC CC CC FF ED ED ED FF EC EC' + 'EC FF B9 B9 B9 FF 6D 6D 6D FF 7D 7D 7D FF 8B 8B' + '8B FF 96 96 96 FF A2 A2 A2 FF A9 A9 A9 FF B6 B6' + 'B6 FF 96 96 96 FF 82 82 82 FF 8E 8E 8E FF 93 93' + '93 FF 94 94 94 FF 86 86 86 FF 95 95 95 FF A6 A6' + 'A6 FF C8 C8 C8 FF C2 C0 C1 FF BF BD BE FF C9 C6' + 'C7 FF 8E 8E 8E FF 01 01 01 FA 00 00 00 37 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 5A 17 17 17 FF CD CD CD FF F0 F0 F0 FF ED ED' + 'ED FF BF BF BF FF 77 77 77 FF 85 85 85 FF 91 91' + '91 FF 9A 9A 9A FF A4 A4 A4 FF AA AA AA FF B5 B5' + 'B5 FF 97 97 97 FF 83 83 83 FF 8D 8D 8D FF 92 92' + '92 FF 93 93 93 FF 86 86 86 FF 93 93 93 FF A7 A7' + 'A7 FF CA CA CA FF C4 C3 C4 FF C3 C2 C2 FF C8 C8' + 'C8 FF 8E 8E 8E FF 00 00 00 FA 00 00 00 37 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 5A 17 17 17 FF CE CE CE FF F2 F2 F2 FF EC EC' + 'EC FF E6 E6 E6 FF DC DC DC FF DB DB DB FF DA DA' + 'DA FF DA DA DA FF D9 D9 D9 FF D8 D8 D8 FF D7 D7' + 'D7 FF D4 D4 D4 FF D4 D4 D4 FF D2 D2 D2 FF D0 D0' + 'D0 FF CF CF CF FF CC CC CC FF CB CB CB FF CB CB' + 'CB FF CC CC CC FF CA CA CA FF C7 C7 C7 FF C9 C9' + 'C9 FF 8D 8D 8D FF 00 00 00 FA 00 00 00 37 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 5A 17 17 17 FF D0 D0 D0 FF FF FF FF FF F8 F8' + 'F8 FF F8 F8 F8 FF F9 F9 F9 FF F8 F8 F8 FF F7 F7' + 'F7 FF F7 F7 F7 FF F6 F6 F6 FF F6 F6 F6 FF F5 F5' + 'F5 FF F5 F5 F5 FF F5 F5 F5 FF F4 F4 F4 FF F4 F4' + 'F4 FF F4 F4 F4 FF F3 F3 F3 FF F3 F3 F3 FF F2 F2' + 'F2 FF F1 F1 F1 FF F2 F2 F2 FF F3 F3 F3 FF E8 E8' + 'E8 FF 8D 8D 8D FF 00 00 00 FA 00 00 00 37 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 5B 17 17 17 FF D7 D7 D7 FF F4 F4 F4 FF DB DB' + 'DB FF D8 D8 D8 FF DD DD DD FF DF DF DF FF DE DE' + 'DE FF DE DE DE FF DE DE DE FF DE DE DE FF DE DE' + 'DE FF DE DE DE FF DE DE DE FF DE DE DE FF DE DE' + 'DE FF DE DE DE FF DF DF DF FF DF DF DF FF E0 E0' + 'E0 FF DD DD DD FF D8 D8 D8 FF E0 E0 E0 FF FB FB' + 'FB FF 9C 9C 9C FF 00 00 00 FA 00 00 00 38 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 51 11 11 11 FF D3 D3 D3 FF D9 D9 D9 FF AD AD' + 'AD FF B0 B0 B0 FF BE BE BE FF D9 D9 D9 FF D8 D8' + 'D8 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7 D7 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D7 D7 D7 FF D7 D7 D7 FF D9 D9 D9 FF D3 D3' + 'D3 FF AF AF AF FF B1 B1 B1 FF B8 B8 B8 FF ED ED' + 'ED FF A0 A0 A0 FF 00 00 00 F7 00 00 00 2E 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 2B 00 00 00 F8 B3 B3 B3 FF DC DC DC FF B9 B9' + 'B9 FF BA BA BA FF BC BC BC FF D5 D5 D5 FF D3 D3' + 'D3 FF D4 D4 D4 FF D8 D8 D8 FF DF DF DF FF E3 E3' + 'E3 FF E4 E4 E4 FF E4 E4 E4 FF E3 E3 E3 FF DF DF' + 'DF FF D9 D9 D9 FF D4 D4 D4 FF D3 D3 D3 FF CF CF' + 'CF FF BA BA BA FF B8 B8 B8 FF B8 B8 B8 FF E9 E9' + 'E9 FF 7C 7C 7C FF 00 00 00 DE 00 00 00 17 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 0C 00 00 00 E2 89 89 89 FF E5 E5 E5 FF CE CE' + 'CE FF D0 D0 D0 FF D0 D0 D0 FF D1 D1 D1 FF DE DE' + 'DE FF E5 E5 E5 FF E5 E5 E5 FF E2 E2 E2 FF DE DE' + 'DE FF DE DE DE FF DE DE DE FF DE DE DE FF E2 E2' + 'E2 FF E6 E6 E6 FF E5 E5 E5 FF DF DF DF FF D2 D2' + 'D2 FF CF CF CF FF CF CF CF FF D0 D0 D0 FF E6 E6' + 'E6 FF 54 54 54 FF 00 00 00 BC 00 00 00 07 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 BB 64 64 64 FF E2 E2 E2 FF CB CB' + 'CB FF CB CB CB FF CE CE CE FF E2 E2 E2 FF E0 E0' + 'E0 FF D7 D7 D7 FF D3 D3 D3 FF D4 D4 D4 FF D4 D4' + 'D4 FF D4 D4 D4 FF D4 D4 D4 FF D4 D4 D4 FF D4 D4' + 'D4 FF D3 D3 D3 FF D7 D7 D7 FF DF DF DF FF E4 E4' + 'E4 FF D1 D1 D1 FF CB CB CB FF CF CF CF FF D7 D7' + 'D7 FF 34 34 34 FF 00 00 00 99 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 93 3E 3E 3E FF DB DB DB FF CC CC' + 'CC FF CC CC CC FF DC DC DC FF D7 D7 D7 FF CF CF' + 'CF FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF CF CF' + 'CF FF CD CD CD FF CD CD CD FF CD CD CD FF CD CD' + 'CD FF CD CD CD FF CD CD CD FF CC CC CC FF D3 D3' + 'D3 FF DC DC DC FF C9 C9 C9 FF CF CF CF FF C2 C2' + 'C2 FF 1A 1A 1A FF 00 00 00 72 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 6B 21 21 21 FF C9 C9 C9 FF D2 D2' + 'D2 FF D3 D3 D3 FF D7 D7 D7 FF CF CF CF FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF CF CF' + 'CF FF CA CA CA FF C7 C7 C7 FF C8 C8 C8 FF C8 C8' + 'C8 FF C8 C8 C8 FF C8 C8 C8 FF C8 C8 C8 FF C7 C7' + 'C7 FF CF CF CF FF CC CC CC FF D0 D0 D0 FF A9 A9' + 'A9 FF 04 04 04 FF 00 00 00 4D 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 44 0B 0B 0B FF B1 B1 B1 FF D8 D8' + 'D8 FF D2 D2 D2 FF D2 D2 D2 FF D1 D1 D1 FF D1 D1' + 'D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF D2 D2' + 'D2 FF D1 D1 D1 FF C9 C9 C9 FF C4 C4 C4 FF C3 C3' + 'C3 FF C3 C3 C3 FF C4 C4 C4 FF C4 C4 C4 FF C4 C4' + 'C4 FF C5 C5 C5 FF C5 C5 C5 FF D2 D2 D2 FF 86 86' + '86 FF 00 00 00 F3 00 00 00 28 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 20 00 00 00 F4 93 93 93 FF DF DF' + 'DF FF D2 D2 D2 FF D2 D2 D2 FF D5 D5 D5 FF D4 D4' + 'D4 FF D4 D4 D4 FF D4 D4 D4 FF D4 D4 D4 FF D4 D4' + 'D4 FF D5 D5 D5 FF D5 D5 D5 FF D2 D2 D2 FF CD CD' + 'CD FF C7 C7 C7 FF C3 C3 C3 FF C2 C2 C2 FF C2 C2' + 'C2 FF BE BE BE FF BC BC BC FF D0 D0 D0 FF 67 67' + '67 FF 00 00 00 D9 00 00 00 13 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 0B 00 00 00 DE 75 75 75 FF DE DE' + 'DE FF D7 D7 D7 FF D1 D1 D1 FF DA DA DA FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF DA DA DA FF DA DA' + 'DA FF DA DA DA FF D8 D8 D8 FF D6 D6 D6 FF D5 D5' + 'D5 FF C7 C7 C7 FF C5 C5 C5 FF CD CD CD FF 4B 4B' + '4B FF 00 00 00 BD 00 00 00 07 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 B7 53 53 53 FF D9 D9' + 'D9 FF E1 E1 E1 FF D5 D5 D5 FF D5 D5 D5 FF DF DF' + 'DF FF DF DF DF FF DE DE DE FF DE DE DE FF DE DE' + 'DE FF DE DE DE FF DE DE DE FF DE DE DE FF DE DE' + 'DE FF DE DE DE FF DF DF DF FF E0 E0 E0 FF D7 D7' + 'D7 FF D6 D6 D6 FF DE DE DE FF C3 C3 C3 FF 2C 2C' + '2C FF 00 00 00 9A 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 90 31 31 31 FF CB CB' + 'CB FF E5 E5 E5 FF E4 E4 E4 FF DA DA DA FF D7 D7' + 'D7 FF DD DD DD FF E2 E2 E2 FF E4 E4 E4 FF E4 E4' + 'E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4' + 'E4 FF E2 E2 E2 FF DE DE DE FF D7 D7 D7 FF D9 D9' + 'D9 FF E4 E4 E4 FF DF DF DF FF AB AB AB FF 17 17' + '17 FF 00 00 00 73 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 67 1A 1A 1A FF B3 B3' + 'B3 FF E8 E8 E8 FF EA EA EA FF EA EA EA FF E5 E5' + 'E5 FF DE DE DE FF DD DD DD FF DD DD DD FF DF DF' + 'DF FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF DD DD' + 'DD FF DC DC DC FF DD DD DD FF E5 E5 E5 FF E9 E9' + 'E9 FF EC EC EC FF DF DF DF FF 95 95 95 FF 04 04' + '04 FF 00 00 00 4D 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 41 07 07 07 FE 9F 9F' + '9F FF E8 E8 E8 FF CD CD CD FF CB CB CB FF E7 E7' + 'E7 FF EF EF EF FF ED ED ED FF EA EA EA FF E9 E9' + 'E9 FF E7 E7 E7 FF E7 E7 E7 FF E8 E8 E8 FF EA EA' + 'EA FF EC EC EC FF F0 F0 F0 FF DB DB DB FF C6 C6' + 'C6 FF DC DC DC FF E1 E1 E1 FF 78 78 78 FF 00 00' + '00 F4 00 00 00 29 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 1E 00 00 00 F4 83 83' + '83 FF E0 E0 E0 FF C9 C9 C9 FF C6 C6 C6 FF EA EA' + 'EA FF FA FA FA FF F8 F8 F8 FF F8 F8 F8 FF F8 F8' + 'F8 FF F8 F8 F8 FF F8 F8 F8 FF F8 F8 F8 FF F8 F8' + 'F8 FF F8 F8 F8 FF FB FB FB FF D9 D9 D9 FF C4 C4' + 'C4 FF D1 D1 D1 FF D2 D2 D2 FF 50 50 50 FF 00 00' + '00 DA 00 00 00 15 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 BB 24 24' + '24 FF 98 98 98 FF CF CF CF FF D2 D2 D2 FF D7 D7' + 'D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7' + 'D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7' + 'D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7 D7 FF D2 D2' + 'D2 FF C8 C8 C8 FF 7C 7C 7C FF 0D 0D 0D FF 00 00' + '00 9A 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 31 00 00' + '00 DF 0F 0F 0F FF 29 29 29 FF 29 29 29 FF 28 28' + '28 FF 28 28 28 FF 28 28 28 FF 28 28 28 FF 28 28' + '28 FF 28 28 28 FF 28 28 28 FF 28 28 28 FF 28 28' + '28 FF 28 28 28 FF 28 28 28 FF 28 28 28 FF 2A 2A' + '2A FF 26 26 26 FF 08 08 08 FF 00 00 00 C8 00 00' + '00 1D 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 14 00 00 00 62 00 00 00 87 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 86 00 00 00 55 00 00 00 0A 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF' + 'FF FF F0 00 00 0F E0 00 00 07 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 E0 00 00 07 E0 00 00 07 E0 00' + '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 F0 00' + '00 0F F0 00 00 0F F0 00 00 0F F0 00 00 0F F0 00' + '00 0F F8 00 00 1F F8 00 00 1F FC 00 00 3F FF FF' + 'FF FF FF FF FF FF 28 00 00 00 30 00 00 00 60 00' + '00 00 01 00 20 00 00 00 00 00 80 21 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 16 00 00 00 34 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 35 00 00 00 18 00 00' + '00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 05 00 00 00 69 00 00' + '00 C5 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F1 00 00 00 B1 00 00' + '00 5C 00 00 00 0D 00 00 00 01 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 05 00 00 00 9B 00 00 00 FF 00 00' + '00 FF 21 21 21 FF 2C 2C 2C FF 2B 2B 2B FF 2C 2C' + '2C FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B' + '2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B' + '2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2A 2A' + '2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A' + '2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A' + '2A FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2E 2C' + '2D FF 2E 2C 2D FF 13 13 13 FF 00 00 00 FF 00 00' + '00 F6 00 00 00 69 00 00 00 09 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 54 00 00 00 FF 26 26 26 FF 90 90' + '90 FF CA CA CA FF CD CD CD FF CB CB CB FF CE CE' + 'CE FF CD CD CD FF CC CC CC FF CB CB CB FF C9 C9' + 'C9 FF C7 C7 C7 FF C6 C6 C6 FF C5 C5 C5 FF C4 C4' + 'C4 FF C3 C3 C3 FF C2 C2 C2 FF C2 C2 C2 FF C3 C3' + 'C3 FF C0 C0 C0 FF C1 C1 C1 FF BF BF BF FF BF BF' + 'BF FF BC BC BC FF BD BD BD FF BA BA BA FF BB BB' + 'BB FF B5 B5 B5 FF B3 B4 B3 FF B8 B4 B6 FF AD AD' + 'AD FF AB AC AC FF AD A8 AB FF 63 63 63 FF 09 09' + '09 FF 00 00 00 EF 00 00 00 42 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 03 00 00 00 AD 01 01 01 FF 8A 8A 8A FF EB EB' + 'EB FF E8 E8 E8 FF E7 E7 E7 FF D5 D5 D5 FF 85 85' + '85 FF 88 88 88 FF 92 92 92 FF 98 98 98 FF A2 A2' + 'A2 FF AD AD AD FF BA BA BA FF C0 C0 C0 FF C3 C3' + 'C3 FF C6 C6 C6 FF CB CB CB FF CA CA CA FF CA CA' + 'CA FF D6 D6 D6 FF CA CA CA FF D3 D3 D3 FF CB CB' + 'CB FF D7 D7 D7 FF CC CC CC FF D4 D4 D4 FF C7 C7' + 'C7 FF C8 C9 C9 FF C6 C2 C4 FF 9D B3 A8 FF 20 A8' + '63 FF 1C A8 60 FF 90 AF A0 FF BF BB BD FF 4F 4F' + '4F FF 00 00 00 FF 00 00 00 81 00 00 00 04 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 15 00 00 00 F0 19 19 19 FF C7 C7 C7 FF EC EC' + 'EC FF E2 E2 E2 FF E6 E6 E6 FF CB CB CB FF 3B 3B' + '3B FF 3F 3F 3F FF 56 56 56 FF 72 72 72 FF 87 87' + '87 FF 92 92 92 FF 9D 9D 9D FF A5 A5 A5 FF A8 A8' + 'A8 FF AC AC AC FF B7 B7 B7 FF A9 A9 A9 FF 9C 9C' + '9C FF BD BD BD FF 99 99 99 FF B7 B7 B7 FF A1 A1' + 'A1 FF C3 C3 C3 FF A3 A3 A3 FF BD BD BD FF 98 98' + '98 FF C5 C4 C4 FF C7 BF C3 FF 51 A7 7C FF 17 CE' + '71 FF 0A BF 61 FF 2F 99 64 FF C3 BD C0 FF 84 83' + '84 FF 01 01 01 FF 00 00 00 A3 00 00 00 0B 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 30 00 00 00 FA 29 29 29 FF D1 D1 D1 FF EA EA' + 'EA FF E4 E4 E4 FF E7 E7 E7 FF CD CD CD FF 47 47' + '47 FF 5F 5F 5F FF 79 79 79 FF 87 87 87 FF 8F 8F' + '8F FF 97 97 97 FF A0 A0 A0 FF A7 A7 A7 FF AA AA' + 'AA FF AE AE AE FF B9 B9 B9 FF A4 A4 A4 FF 90 90' + '90 FF B8 B8 B8 FF 8A 8A 8A FF AF AF AF FF 94 94' + '94 FF BF BF BF FF 97 97 97 FF B7 B7 B7 FF 88 88' + '88 FF C4 C3 C3 FF C6 C3 C5 FF 95 B2 A3 FF 91 D6' + 'B4 FF 91 D8 B5 FF 83 AB 97 FF C4 C1 C3 FF 8E 8E' + '8E FF 01 01 01 FF 00 00 00 B7 00 00 00 13 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 34 00 00 00 F9 28 28 28 FF D1 D1 D1 FF EC EC' + 'EC FF E6 E6 E6 FF E7 E7 E7 FF D1 D1 D1 FF 68 68' + '68 FF 74 74 74 FF 7E 7E 7E FF 85 85 85 FF 8E 8E' + '8E FF 97 97 97 FF A0 A0 A0 FF A7 A7 A7 FF AA AA' + 'AA FF AE AE AE FF BA BA BA FF 9F 9F 9F FF 83 83' + '83 FF B3 B3 B3 FF 7C 7C 7C FF A8 A8 A8 FF 87 87' + '87 FF BB BB BB FF 8A 8A 8A FF B2 B2 B2 FF 79 79' + '79 FF C2 C2 C2 FF C4 C4 C4 FF C6 C3 C4 FF 99 AC' + 'A2 FF 96 AB A0 FF C2 BE C0 FF C4 C4 C4 FF 8D 8D' + '8D FF 01 01 01 FF 00 00 00 BA 00 00 00 14 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 33 00 00 00 F9 28 28 28 FF D1 D1 D1 FF EE EE' + 'EE FF E7 E7 E7 FF E8 E8 E8 FF D6 D6 D6 FF 70 70' + '70 FF 71 71 71 FF 7D 7D 7D FF 85 85 85 FF 8E 8E' + '8E FF 97 97 97 FF A0 A0 A0 FF A7 A7 A7 FF AA AA' + 'AA FF AE AE AE FF BB BB BB FF 98 98 98 FF 73 73' + '73 FF AD AD AD FF 6A 6A 6A FF A0 A0 A0 FF 78 78' + '78 FF B7 B7 B7 FF 7C 7C 7C FF AB AB AB FF 67 67' + '67 FF C2 C2 C2 FF C6 C6 C6 FF C4 C3 C4 FF C7 C4' + 'C5 FF C6 C2 C4 FF BF BF BF FF C5 C5 C5 FF 8D 8D' + '8D FF 01 01 01 FF 00 00 00 B9 00 00 00 14 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 33 00 00 00 F9 27 27 27 FF D1 D1 D1 FF EF EF' + 'EF FF E9 E9 E9 FF EB EB EB FF D6 D6 D6 FF 6A 6A' + '6A FF 6C 6C 6C FF 78 78 78 FF 81 81 81 FF 8A 8A' + '8A FF 93 93 93 FF 9C 9C 9C FF A3 A3 A3 FF A6 A6' + 'A6 FF AB AB AB FF B9 B9 B9 FF 90 90 90 FF 66 66' + '66 FF A5 A5 A5 FF 5B 5B 5B FF 98 98 98 FF 6B 6B' + '6B FF B1 B1 B1 FF 70 70 70 FF A4 A4 A4 FF 58 58' + '58 FF C1 C1 C1 FF C8 C8 C8 FF C5 C5 C5 FF C3 C3' + 'C3 FF C2 C2 C2 FF C1 C1 C1 FF C6 C6 C6 FF 8E 8E' + '8E FF 01 01 01 FF 00 00 00 B9 00 00 00 14 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 33 00 00 00 F9 27 27 27 FF D2 D2 D2 FF F2 F2' + 'F2 FF EB EB EB FF EA EA EA FF DF DF DF FF A7 A7' + 'A7 FF A7 A7 A7 FF AB AB AB FF AE AE AE FF B0 B0' + 'B0 FF B3 B3 B3 FF B6 B6 B6 FF B9 B9 B9 FF B9 B9' + 'B9 FF BA BA BA FF BD BD BD FF B7 B7 B7 FF B1 B1' + 'B1 FF BE BE BE FF AF AF AF FF BA BA BA FF B1 B1' + 'B1 FF BE BE BE FF B0 B0 B0 FF BA BA BA FF AB AB' + 'AB FF C5 C5 C5 FF C8 C8 C8 FF C6 C6 C6 FF C4 C4' + 'C4 FF C3 C3 C3 FF C2 C2 C2 FF C9 C9 C9 FF 8E 8E' + '8E FF 00 00 00 FF 00 00 00 B9 00 00 00 14 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 33 00 00 00 F9 26 26 26 FF D3 D3 D3 FF F3 F3' + 'F3 FF EB EB EB FF EB EB EB FF EA EA EA FF ED ED' + 'ED FF EB EB EB FF E9 E9 E9 FF E8 E8 E8 FF E6 E6' + 'E6 FF E4 E4 E4 FF E2 E2 E2 FF E1 E1 E1 FF DF DF' + 'DF FF DE DE DE FF DB DB DB FF DB DB DB FF DC DC' + 'DC FF D8 D8 D8 FF D9 D9 D9 FF D6 D6 D6 FF D6 D6' + 'D6 FF D2 D2 D2 FF D2 D2 D2 FF CF CF CF FF D0 D0' + 'D0 FF CB CB CB FF CA CA CA FF C9 C9 C9 FF C7 C7' + 'C7 FF C4 C4 C4 FF C0 C0 C0 FF CA CA CA FF 8E 8E' + '8E FF 00 00 00 FF 00 00 00 B9 00 00 00 14 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 33 00 00 00 F9 26 26 26 FF D3 D3 D3 FF F7 F7' + 'F7 FF F8 F8 F8 FF F6 F6 F6 FF F6 F6 F6 FF F6 F6' + 'F6 FF F5 F5 F5 FF F5 F5 F5 FF F4 F4 F4 FF F4 F4' + 'F4 FF F3 F3 F3 FF F3 F3 F3 FF F3 F3 F3 FF F2 F2' + 'F2 FF F2 F2 F2 FF F1 F1 F1 FF F1 F1 F1 FF F1 F1' + 'F1 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF EF EF' + 'EF FF EF EF EF FF EE EE EE FF EE EE EE FF ED ED' + 'ED FF ED ED ED FF ED ED ED FF EC EC EC FF EC EC' + 'EC FF EB EB EB FF E0 E0 E0 FF D0 D0 D0 FF 8D 8D' + '8D FF 00 00 00 FF 00 00 00 B9 00 00 00 14 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 33 00 00 00 F9 24 24 24 FF D6 D6 D6 FF FF FF' + 'FF FF E9 E9 E9 FF E1 E1 E1 FF E2 E2 E2 FF E2 E2' + 'E2 FF E0 E0 E0 FF DF DF DF FF DF DF DF FF DF DF' + 'DF FF DF DF DF FF DF DF DF FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E2 E2 E2 FF E3 E3 E3 FF E3 E3' + 'E3 FF E3 E3 E3 FF F8 F8 F8 FF EF EF EF FF 8C 8C' + '8C FF 00 00 00 FF 00 00 00 B9 00 00 00 14 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 34 00 00 00 FA 24 24 24 FF DE DE DE FF F8 F8' + 'F8 FF D9 D9 D9 FF C4 C4 C4 FF BB BB BB FF BF BF' + 'BF FF D8 D8 D8 FF DA DA DA FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF DB DB DB FF CF CF CF FF BC BC BC FF BB BB' + 'BB FF D1 D1 D1 FF DE DE DE FF FF FF FF FF 9A 9A' + '9A FF 00 00 00 FF 00 00 00 BA 00 00 00 14 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 25 00 00 00 F7 1F 1F 1F FF DA DA DA FF F3 F3' + 'F3 FF C6 C6 C6 FF A9 A9 A9 FF B7 B7 B7 FF B0 B0' + 'B0 FF C3 C3 C3 FF DA DA DA FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D7 D7' + 'D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7' + 'D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7 D7 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D9 D9' + 'D9 FF D2 D2 D2 FF A8 A8 A8 FF B6 B6 B6 FF B1 B1' + 'B1 FF B5 B5 B5 FF D8 D8 D8 FF FC FC FC FF 9C 9C' + '9C FF 00 00 00 FF 00 00 00 AE 00 00 00 0C 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 07 00 00 00 D0 05 05 05 FF C2 C2 C2 FF F6 F6' + 'F6 FF BC BC BC FF B2 B2 B2 FF C3 C3 C3 FF AB AB' + 'AB FF BB BB BB FF D8 D8 D8 FF D5 D5 D5 FF D5 D5' + 'D5 FF D5 D5 D5 FF D4 D4 D4 FF D3 D3 D3 FF D3 D3' + 'D3 FF D5 D5 D5 FF D7 D7 D7 FF D8 D8 D8 FF D8 D8' + 'D8 FF D7 D7 D7 FF D5 D5 D5 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D4 D4 D4 FF D5 D5 D5 FF D7 D7' + 'D7 FF C9 C9 C9 FF A6 A6 A6 FF C3 C3 C3 FF B3 B3' + 'B3 FF AD AD AD FF D6 D6 D6 FF F5 F5 F5 FF 76 76' + '76 FF 00 00 00 FF 00 00 00 8C 00 00 00 01 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 9C 00 00 00 FF A4 A4 A4 FF F4 F4' + 'F4 FF CF CF CF FF C5 C5 C5 FF D2 D2 D2 FF BF BF' + 'BF FF C9 C9 C9 FF D3 D3 D3 FF D2 D2 D2 FF D0 D0' + 'D0 FF D3 D3 D3 FF DD DD DD FF E1 E1 E1 FF E3 E3' + 'E3 FF E6 E6 E6 FF EA EA EA FF ED ED ED FF ED ED' + 'ED FF EB EB EB FF E7 E7 E7 FF E4 E4 E4 FF E2 E2' + 'E2 FF DE DE DE FF D4 D4 D4 FF D0 D0 D0 FF D2 D2' + 'D2 FF D3 D3 D3 FF C5 C5 C5 FF D0 D0 D0 FF C2 C2' + 'C2 FF BF BF BF FF D9 D9 D9 FF E8 E8 E8 FF 56 56' + '56 FF 00 00 00 FF 00 00 00 72 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 73 00 00 00 FF 7E 7E 7E FF EF EF' + 'EF FF D1 D1 D1 FF CF CF CF FF CB CB CB FF CF CF' + 'CF FF D1 D1 D1 FF CE CE CE FF CF CF CF FF DF DF' + 'DF FF F0 F0 F0 FF EC EC EC FF E1 E1 E1 FF DE DE' + 'DE FF DD DD DD FF DC DC DC FF DB DB DB FF DB DB' + 'DB FF DC DC DC FF DD DD DD FF DE DE DE FF E1 E1' + 'E1 FF EC EC EC FF F1 F1 F1 FF E1 E1 E1 FF D1 D1' + 'D1 FF CE CE CE FF D0 D0 D0 FF CB CB CB FF CE CE' + 'CE FF D1 D1 D1 FF D9 D9 D9 FF D4 D4 D4 FF 3F 3F' + '3F FF 00 00 00 FF 00 00 00 55 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 59 00 00 00 FF 59 59 59 FF E9 E9' + 'E9 FF D0 D0 D0 FF CD CD CD FF CD CD CD FF CD CD' + 'CD FF CA CA CA FF D6 D6 D6 FF ED ED ED FF E6 E6' + 'E6 FF DC DC DC FF D4 D4 D4 FF D5 D5 D5 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D5 D5' + 'D5 FF D5 D5 D5 FF DB DB DB FF E4 E4 E4 FF ED ED' + 'ED FF DA DA DA FF CA CA CA FF CD CD CD FF CD CD' + 'CD FF CB CB CB FF DF DF DF FF B8 B8 B8 FF 22 22' + '22 FF 00 00 00 FB 00 00 00 3A 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 3E 00 00 00 FE 40 40 40 FF D7 D7' + 'D7 FF D2 D2 D2 FF CA CA CA FF CB CB CB FF CA CA' + 'CA FF D4 D4 D4 FF E9 E9 E9 FF DC DC DC FF D0 D0' + 'D0 FF D1 D1 D1 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2' + 'D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2' + 'D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2' + 'D2 FF D2 D2 D2 FF D1 D1 D1 FF D0 D0 D0 FF D8 D8' + 'D8 FF EA EA EA FF D8 D8 D8 FF C9 C9 C9 FF CA CA' + 'CA FF C9 C9 C9 FF E0 E0 E0 FF A0 A0 A0 FF 08 08' + '08 FF 00 00 00 EB 00 00 00 22 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 25 00 00 00 F8 22 22 22 FF B7 B7' + 'B7 FF DB DB DB FF CA CA CA FF CB CB CB FF CE CE' + 'CE FF E4 E4 E4 FF D4 D4 D4 FF CF CF CF FF D1 D1' + 'D1 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF CF CF CF FF CD CD CD FF CE CE CE FF CE CE' + 'CE FF CE CE CE FF CE CE CE FF CE CE CE FF CE CE' + 'CE FF CE CE CE FF CE CE CE FF CE CE CE FF CC CC' + 'CC FF D0 D0 D0 FF E2 E2 E2 FF CF CF CF FF C7 C7' + 'C7 FF C9 C9 C9 FF E2 E2 E2 FF 80 80 80 FF 00 00' + '00 FF 00 00 00 C2 00 00 00 0E 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 0C 00 00 00 E1 07 07 07 FF 9F 9F' + '9F FF DD DD DD FF CC CC CC FF CD CD CD FF DB DB' + 'DB FF D6 D6 D6 FF CE CE CE FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF CF CF CF FF CC CC CC FF C9 C9 C9 FF CA CA' + 'CA FF CA CA CA FF CA CA CA FF CA CA CA FF CA CA' + 'CA FF CA CA CA FF CA CA CA FF CA CA CA FF CA CA' + 'CA FF C8 C8 C8 FF CF CF CF FF DA DA DA FF C7 C7' + 'C7 FF C9 C9 C9 FF E2 E2 E2 FF 5A 5A 5A FF 00 00' + '00 FF 00 00 00 94 00 00 00 01 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 B2 00 00 00 FF 83 83' + '83 FF DD DD DD FF CF CF CF FF D1 D1 D1 FF DB DB' + 'DB FF D1 D1 D1 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF CF CF CF FF C9 C9 C9 FF C5 C5' + 'C5 FF C6 C6 C6 FF C6 C6 C6 FF C6 C6 C6 FF C6 C6' + 'C6 FF C6 C6 C6 FF C6 C6 C6 FF C6 C6 C6 FF C6 C6' + 'C6 FF C6 C6 C6 FF C7 C7 C7 FF D3 D3 D3 FF C8 C8' + 'C8 FF C9 C9 C9 FF DE DE DE FF 42 42 42 FF 00 00' + '00 FF 00 00 00 6C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 80 00 00 00 FF 5F 5F' + '5F FF DC DC DC FF D1 D1 D1 FF D2 D2 D2 FF D4 D4' + 'D4 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1' + 'D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1' + 'D1 FF D1 D1 D1 FF D1 D1 D1 FF D0 D0 D0 FF C8 C8' + 'C8 FF C3 C3 C3 FF C3 C3 C3 FF C3 C3 C3 FF C4 C4' + 'C4 FF C4 C4 C4 FF C4 C4 C4 FF C4 C4 C4 FF C4 C4' + 'C4 FF C4 C4 C4 FF C4 C4 C4 FF C7 C7 C7 FF C5 C5' + 'C5 FF CB CB CB FF CC CC CC FF 2D 2D 2D FF 00 00' + '00 F8 00 00 00 40 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 4B 00 00 00 FE 41 41' + '41 FF D8 D8 D8 FF D4 D4 D4 FF D2 D2 D2 FF D0 D0' + 'D0 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF CD CD CD FF C7 C7 C7 FF C4 C4 C4 FF C2 C2' + 'C2 FF C1 C1 C1 FF C0 C0 C0 FF C1 C1 C1 FF C1 C1' + 'C1 FF C1 C1 C1 FF C2 C2 C2 FF BF BF BF FF C0 C0' + 'C0 FF CE CE CE FF B2 B2 B2 FF 1A 1A 1A FF 00 00' + '00 E5 00 00 00 28 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 1A 00 00 00 F2 2C 2C' + '2C FF CC CC CC FF D6 D6 D6 FF D5 D5 D5 FF CC CC' + 'CC FF D5 D5 D5 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D7 D7 D7 FF D6 D6 D6 FF D5 D5 D5 FF D3 D3' + 'D3 FF CF CF CF FF CC CC CC FF C9 C9 C9 FF C6 C6' + 'C6 FF C4 C4 C4 FF C2 C2 C2 FF B3 B3 B3 FF BD BD' + 'BD FF D0 D0 D0 FF 99 99 99 FF 09 09 09 FF 00 00' + '00 CF 00 00 00 19 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 09 00 00 00 D8 18 18' + '18 FF B0 B0 B0 FF DB DB DB FF DB DB DB FF D0 D0' + 'D0 FF D2 D2 D2 FF DB DB DB FF D9 D9 D9 FF DA DA' + 'DA FF DA DA DA FF DA DA DA FF DA DA DA FF DA DA' + 'DA FF DA DA DA FF DA DA DA FF DA DA DA FF DA DA' + 'DA FF DA DA DA FF DA DA DA FF DA DA DA FF DA DA' + 'DA FF DB DB DB FF DB DB DB FF DA DA DA FF D9 D9' + 'D9 FF D9 D9 D9 FF CF CF CF FF C5 C5 C5 FF CC CC' + 'CC FF CA CA CA FF 7A 7A 7A FF 02 02 02 FF 00 00' + '00 B8 00 00 00 0A 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 02 00 00 00 BF 08 08' + '08 FF 97 97 97 FF DC DC DC FF DF DF DF FF DC DC' + 'DC FF CE CE CE FF D6 D6 D6 FF DE DE DE FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DE DE' + 'DE FF D8 D8 D8 FF CE CE CE FF DD DD DD FF DC DC' + 'DC FF C6 C6 C6 FF 53 53 53 FF 00 00 00 FF 00 00' + '00 A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 A4 00 00' + '00 FF 77 77 77 FF D3 D3 D3 FF E2 E2 E2 FF E1 E1' + 'E1 FF DE DE DE FF CE CE CE FF D7 D7 D7 FF E1 E1' + 'E1 FF E2 E2 E2 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E1 E1 E1 FF E1 E1 E1 FF D9 D9' + 'D9 FF CD CD CD FF DA DA DA FF E3 E3 E3 FF D9 D9' + 'D9 FF BB BB BB FF 39 39 39 FF 00 00 00 FF 00 00' + '00 7E 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 89 00 00' + '00 FF 4B 4B 4B FF C9 C9 C9 FF E5 E5 E5 FF E3 E3' + 'E3 FF E4 E4 E4 FF E1 E1 E1 FF D7 D7 D7 FF D2 D2' + 'D2 FF DA DA DA FF E4 E4 E4 FF E5 E5 E5 FF E4 E4' + 'E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4' + 'E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4 E4 FF E5 E5' + 'E5 FF E5 E5 E5 FF DC DC DC FF D2 D2 D2 FF D6 D6' + 'D6 FF E0 E0 E0 FF E4 E4 E4 FF E6 E6 E6 FF D6 D6' + 'D6 FF A8 A8 A8 FF 20 20 20 FF 00 00 00 FD 00 00' + '00 4E 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 62 00 00' + '00 FF 35 35 35 FF BD BD BD FF E6 E6 E6 FF E6 E6' + 'E6 FF E6 E6 E6 FF E7 E7 E7 FF E7 E7 E7 FF DF DF' + 'DF FF D2 D2 D2 FF D3 D3 D3 FF DE DE DE FF E3 E3' + 'E3 FF E3 E3 E3 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4' + 'E4 FF E4 E4 E4 FF E3 E3 E3 FF E3 E3 E3 FF DE DE' + 'DE FF D4 D4 D4 FF D1 D1 D1 FF DD DD DD FF E7 E7' + 'E7 FF E7 E7 E7 FF E6 E6 E6 FF E8 E8 E8 FF D4 D4' + 'D4 FF 9A 9A 9A FF 0B 0B 0B FF 00 00 00 ED 00 00' + '00 2C 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 2D 00 00' + '00 F9 1E 1E 1E FF AB AB AB FF E4 E4 E4 FF ED ED' + 'ED FF E7 E7 E7 FF E6 E6 E6 FF EC EC EC FF EB EB' + 'EB FF EA EA EA FF E4 E4 E4 FF E0 E0 E0 FF DF DF' + 'DF FF DF DF DF FF DD DD DD FF DC DC DC FF DC DC' + 'DC FF DD DD DD FF DF DF DF FF DF DF DF FF DF DF' + 'DF FF E2 E2 E2 FF E9 E9 E9 FF EC EC EC FF EA EA' + 'EA FF E5 E5 E5 FF EB EB EB FF EB EB EB FF D6 D6' + 'D6 FF 8A 8A 8A FF 00 00 00 FF 00 00 00 C3 00 00' + '00 17 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 09 00 00' + '00 DD 08 08 08 FF 99 99 99 FF E4 E4 E4 FF DF DF' + 'DF FF BD BD BD FF C1 C1 C1 FF D6 D6 D6 FF EC EC' + 'EC FF ED ED ED FF ED ED ED FF EE EE EE FF EE EE' + 'EE FF ED ED ED FF EC EC EC FF EB EB EB FF EB EB' + 'EB FF EC EC EC FF ED ED ED FF EE EE EE FF EE EE' + 'EE FF ED ED ED FF EE EE EE FF E4 E4 E4 FF C2 C2' + 'C2 FF BE BE BE FF D1 D1 D1 FF EC EC EC FF D4 D4' + 'D4 FF 75 75 75 FF 00 00 00 FF 00 00 00 9C 00 00' + '00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 AE 00 00 00 FF 8D 8D 8D FF E0 E0 E0 FF C4 C4' + 'C4 FF B2 B2 B2 FF B8 B8 B8 FF B2 B2 B2 FF EB EB' + 'EB FF F1 F1 F1 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F3 F3 F3 FF D5 D5 D5 FF B0 B0' + 'B0 FF B6 B6 B6 FF B7 B7 B7 FF EB EB EB FF CD CD' + 'CD FF 61 61 61 FF 00 00 00 FF 00 00 00 85 00 00' + '00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 80 00 00 00 FF 64 64 64 FF CE CE CE FF DD DD' + 'DD FF DC DC DC FF D5 D5 D5 FF E4 E4 E4 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF FA FA FA FF F2 F2 F2 FF DF DF' + 'DF FF D8 D8 D8 FF DC DC DC FF D7 D7 D7 FF B0 B0' + 'B0 FF 34 34 34 FF 00 00 00 FF 00 00 00 67 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 44 00 00 00 FF 19 19 19 FF 80 80 80 FF BE BE' + 'BE FF D3 D3 D3 FF D7 D7 D7 FF DB DB DB FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D9 D9 D9 FF D9 D9' + 'D9 FF D7 D7 D7 FF CD CD CD FF B0 B0 B0 FF 5D 5D' + '5D FF 06 06 06 FF 00 00 00 ED 00 00 00 2B 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 02 00 00 00 9C 00 00 00 FF 0C 0C 0C FF 3D 3D' + '3D FF 49 49 49 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 49 49 49 FF 49 49 49 FF 2F 2F 2F FF 02 02' + '02 FF 00 00 00 FF 00 00 00 5C 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 06 00 00 00 7F 00 00 00 F1 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 D6 00 00 00 5C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 2C 00 00' + '00 7E 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 70 00 00' + '00 1A 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' @@ -4566,1172 +5834,7 @@ END '00 00 00 FF 00 00 FF 00 00 00 01 FF 00 00 FF 80' '00 00 03 FF 00 00 FF E0 00 00 07 FF 00 00 FF FF' 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' - 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 28 00' - '00 00 20 00 00 00 40 00 00 00 01 00 08 00 00 00' - '00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 11 00 00 00 00 11' - '00 00 11 11 11 00 22 22 22 00 33 33 33 00 44 44' - '44 00 55 55 55 00 66 66 66 00 77 77 77 00 7F 7F' - '7F 00 00 CC 66 00 66 99 99 00 33 CC 99 00 66 CC' - '99 00 88 88 88 00 99 99 99 00 AA AA AA 00 BB BB' - 'BB 00 99 CC 99 00 CC CC CC 00 DD DD DD 00 EE EE' - 'EE 00 FF FF FF 00 00 00 00 00 FF FF FF 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 17' - '95 00 00 00 38 00 A8 44 F9 77 13 00 00 00 18 0A' - '38 00 00 00 38 00 98 69 38 00 98 17 95 00 00 00' - '00 00 E0 19 95 00 F0 88 FA 77 70 38 F5 77 FF FF' - 'FF FF A8 44 F9 77 70 7D F5 77 3A 8A F5 77 86 00' - '00 00 86 00 00 00 08 00 00 00 B0 18 95 00 00 00' - '00 00 CB 44 F9 77 D8 90 07 00 CD 8B F5 77 78 13' - '05 00 37 90 F5 77 00 00 00 00 3E 8A F5 77 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 10 00 00 00 00 00 00 00 5C 00' - '5E 00 00 EC FD 7F 1A 02 00 00 4C 16 95 00 E0 90' - '07 00 FC 15 95 00 FF FF FF FF B4 1A 95 00 45 00' - '00 00 28 02 00 00 FF FF FF FF E2 D8 F5 77 7D 9B' - 'F5 77 94 B6 01 00 00 00 05 00 F4 17 95 00 80 00' - '10 C0 B4 1A 95 00 F0 88 FA 77 88 1C F5 77 FF FF' - 'FF FF 37 90 F5 77 00 00 00 00 3E 8A F5 77 9B B2' - 'E7 77 B7 00 00 00 02 00 00 00 A4 1A 95 00 01 00' - '00 00 18 00 00 00 00 00 00 00 10 19 95 00 42 00' - '00 00 00 00 00 00 F4 18 95 00 00 00 00 00 00 00' - '00 00 00 00 00 00 0C 00 00 00 02 00 00 00 01 01' - 'F5 77 00 EC FD 7F 5C 00 00 00 00 00 00 00 03 00' - '00 00 64 00 1A 02 E0 90 07 00 00 00 00 00 E0 90' - '07 00 05 00 00 00 BE B3 E7 77 4C 19 95 00 A3 B4' - 'E7 77 28 01 00 00 00 00 00 C0 00 00 00 00 00 00' - '00 00 02 00 00 00 80 00 00 00 00 00 00 00 8C 1A' - '95 00 7F E9 4B 00 D0 60 38 00 00 00 00 C0 00 00' - '00 00 80 1A 95 00 02 00 00 00 80 00 00 00 00 00' - '00 00 C0 27 95 00 C4 F5 AF 00 02 00 00 00 45 3A' - '5C 63 79 67 77 69 6E 5C 68 6F 6D 65 5C 63 76 73' - '5C 77 69 6E 65 5C 64 6C 6C 73 5C 73 68 65 6C 6C' - '33 32 5C 64 72 69 76 65 2E 69 63 6F 00 00 14 1A' - '95 00 1F 3B D4 77 13 00 00 00 98 00 00 00 4F 3B' - 'D4 77 E0 19 95 00 33 3B D4 77 64 C5 F5 77 A9 F1' - 'E7 77 28 01 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 1A 95 00 98 69 38 00 86 00 00 00 00 00' - '00 00 C9 F1 E7 77 86 00 00 00 A4 1A 95 00 08 00' - '00 00 00 00 00 00 86 00 00 00 86 00 00 00 08 00' - '00 00 F4 19 95 00 33 3B D4 77 B4 1A 95 00 09 48' - 'E9 77 B8 10 E9 77 FF FF FF FF C9 F1 E7 77 16 EA' - '4B 00 28 01 00 00 98 69 38 00 86 00 00 00 58 1A' - '95 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 18 18 18 18 18 18' - '18 18 18 18 18 18 18 18 18 18 18 18 18 02 18 18' - '18 18 00 00 00 00 00 00 00 18 18 03 03 04 03 04' - '03 03 04 03 03 04 03 03 04 03 03 04 03 03 03 04' - '01 18 18 00 00 00 00 00 18 18 06 12 14 12 12 12' - '12 11 12 12 12 12 12 12 12 12 12 12 12 11 0F 10' - '0C 04 18 18 00 00 00 00 18 18 12 16 16 11 07 08' - '0F 10 11 12 12 11 12 12 12 12 12 12 12 12 0D 0B' - '10 0F 18 18 00 00 00 00 18 03 14 16 16 11 06 0F' - '0F 10 11 11 11 11 10 10 11 11 10 11 11 12 13 0E' - '12 0F 18 18 00 00 00 00 18 03 14 16 16 12 09 09' - '0F 10 10 11 12 0F 0F 10 0F 10 0F 10 11 14 12 12' - '14 10 18 18 00 00 00 00 18 03 15 16 16 12 08 0F' - '0F 10 11 11 12 10 09 0F 10 0F 0F 0F 11 14 14 12' - '14 0F 18 18 00 00 00 00 18 03 14 17 15 16 15 15' - '15 15 15 14 15 14 15 14 14 14 14 14 14 14 14 12' - '14 0F 18 18 00 00 00 00 18 03 14 17 17 16 17 17' - '16 17 16 17 16 17 16 17 16 17 16 17 16 16 16 17' - '15 10 18 18 00 00 00 00 18 03 15 16 15 15 15 15' - '15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15' - '17 10 18 18 00 00 00 00 18 03 15 15 11 11 14 15' - '15 14 15 15 14 15 14 15 14 15 14 15 14 12 11 12' - '16 10 18 18 00 00 00 00 18 18 11 15 12 12 12 14' - '14 15 15 15 15 16 15 16 15 15 15 14 15 11 12 12' - '16 09 18 18 00 00 00 00 18 18 0F 16 14 14 14 15' - '15 15 16 15 15 15 15 15 15 16 15 15 14 15 14 14' - '16 07 18 18 00 00 00 00 00 18 08 16 14 14 14 15' - '15 15 14 15 15 14 15 14 15 14 15 15 16 14 14 14' - '15 05 18 00 00 00 00 00 00 18 05 15 14 14 15 15' - '14 14 14 14 14 14 14 14 14 14 14 14 14 15 14 14' - '14 03 18 00 00 00 00 00 00 18 04 14 14 14 15 14' - '14 14 15 14 14 14 14 14 12 14 14 14 14 14 14 14' - '11 18 18 00 00 00 00 00 00 18 18 12 15 14 15 14' - '15 14 14 14 15 14 14 12 14 12 12 14 14 14 12 15' - '0F 18 18 00 00 00 00 00 00 18 18 10 15 14 14 15' - '14 15 14 15 14 14 15 15 14 12 14 12 12 12 12 14' - '08 18 18 00 00 00 00 00 00 18 18 09 15 15 14 15' - '14 15 15 15 15 15 14 15 15 15 15 15 15 12 14 14' - '06 18 18 00 00 00 00 00 00 00 18 06 15 15 15 14' - '16 15 15 15 15 15 15 15 15 15 15 15 14 15 15 14' - '05 18 00 00 00 00 00 00 00 00 18 05 14 16 15 15' - '14 15 15 16 15 16 16 15 16 15 15 15 15 15 15 11' - '03 18 00 00 00 00 00 00 00 00 18 04 11 15 16 16' - '16 15 15 15 15 15 15 15 15 15 15 15 16 16 15 10' - '18 18 00 00 00 00 00 00 00 00 18 18 11 16 14 14' - '15 16 16 15 16 15 15 16 15 16 16 15 12 15 15 09' - '18 18 00 00 00 00 00 00 00 00 18 18 0F 15 14 12' - '16 17 17 17 17 17 17 17 17 17 17 15 14 14 15 07' - '18 18 00 00 00 00 00 00 00 00 00 18 04 10 15 15' - '15 15 15 15 15 15 15 15 15 15 15 15 15 14 09 03' - '18 00 00 00 00 00 00 00 00 00 00 18 18 03 04 04' - '04 04 04 04 04 04 04 04 04 04 04 04 04 04 18 18' - '18 00 00 00 00 00 00 00 00 00 00 00 18 18 18 18' - '18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF' - 'FF FF F0 00 00 0F E0 00 00 07 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 E0 00 00 07 E0 00 00 07 E0 00' - '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 F0 00' - '00 0F F0 00 00 0F F0 00 00 0F F0 00 00 0F F0 00' - '00 0F F8 00 00 1F F8 00 00 1F FC 00 00 3F FF FF' - 'FF FF FF FF FF FF 28 00 00 00 10 00 00 00 20 00' - '00 00 01 00 08 00 00 00 00 00 00 01 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 11 00 11 11 11 00 22 00 00 00 22 22' - '22 00 44 44 44 00 55 55 55 00 66 66 66 00 77 77' - '77 00 7F 7F 7F 00 33 CC 99 00 88 88 88 00 99 99' - '99 00 AA AA AA 00 BB BB BB 00 99 CC 99 00 CC CC' - 'CC 00 DD DD DD 00 EE EE EE 00 00 00 00 00 CC CC' - 'CC 00 DD DD DD 00 EE EE EE 00 FF FF FF 00 00 00' - '00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 C0 17 95 00 00 00 38 00 A8 44' - 'F9 77 13 00 00 00 18 0A 38 00 00 00 38 00 98 69' - '38 00 98 17 95 00 00 00 00 00 E0 19 95 00 F0 88' - 'FA 77 70 38 F5 77 FF FF FF FF A8 44 F9 77 70 7D' - 'F5 77 3A 8A F5 77 86 00 00 00 86 00 00 00 08 00' - '00 00 B0 18 95 00 00 00 00 00 CB 44 F9 77 D8 90' - '07 00 CD 8B F5 77 78 13 05 00 37 90 F5 77 00 00' - '00 00 3E 8A F5 77 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00' - '00 00 00 00 00 00 5C 00 5E 00 00 EC FD 7F 1A 02' - '00 00 4C 16 95 00 E0 90 07 00 FC 15 95 00 FF FF' - 'FF FF B4 1A 95 00 45 00 00 00 28 02 00 00 FF FF' - 'FF FF E2 D8 F5 77 7D 9B F5 77 94 B6 01 00 00 00' - '05 00 F4 17 95 00 80 00 10 C0 B4 1A 95 00 F0 88' - 'FA 77 88 1C F5 77 FF FF FF FF 37 90 F5 77 00 00' - '00 00 3E 8A F5 77 9B B2 E7 77 B7 00 00 00 02 00' - '00 00 A4 1A 95 00 01 00 00 00 18 00 00 00 00 00' - '00 00 10 19 95 00 42 00 00 00 00 00 00 00 F4 18' - '95 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00' - '00 00 02 00 00 00 01 01 F5 77 00 EC FD 7F 5C 00' - '00 00 00 00 00 00 03 00 00 00 64 00 1A 02 E0 90' - '07 00 00 00 00 00 E0 90 07 00 05 00 00 00 BE B3' - 'E7 77 4C 19 95 00 A3 B4 E7 77 28 01 00 00 00 00' - '00 C0 00 00 00 00 00 00 00 00 02 00 00 00 80 00' - '00 00 00 00 00 00 8C 1A 95 00 7F E9 4B 00 D0 60' - '38 00 00 00 00 C0 00 00 00 00 80 1A 95 00 02 00' - '00 00 80 00 00 00 00 00 00 00 C0 27 95 00 C4 F5' - 'AF 00 02 00 00 00 45 3A 5C 63 79 67 77 69 6E 5C' - '68 6F 6D 65 5C 63 76 73 5C 77 69 6E 65 5C 64 6C' - '6C 73 5C 73 68 65 6C 6C 33 32 5C 64 72 69 76 65' - '2E 69 63 6F 00 00 14 1A 95 00 1F 3B D4 77 13 00' - '00 00 98 00 00 00 4F 3B D4 77 E0 19 95 00 33 3B' - 'D4 77 64 C5 F5 77 A9 F1 E7 77 28 01 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 1A 95 00 98 69' - '38 00 86 00 00 00 00 00 00 00 C9 F1 E7 77 86 00' - '00 00 A4 1A 95 00 08 00 00 00 00 00 00 00 86 00' - '00 00 86 00 00 00 08 00 00 00 F4 19 95 00 33 3B' - 'D4 77 B4 1A 95 00 09 48 E9 77 B8 10 E9 77 FF FF' - 'FF FF C9 F1 E7 77 16 EA 4B 00 28 01 00 00 98 69' - '38 00 86 00 00 00 58 1A 95 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 13' - '13 02 02 02 02 02 02 02 02 02 03 01 13 00 00 13' - '0C 0E 0B 0C 0D 0E 0D 0E 0E 0D 0A 07 13 00 00 02' - '11 10 07 0B 0D 0D 0C 0C 0C 0E 0F 0C 13 00 00 02' - '11 11 0C 0D 0E 0E 0C 0D 0C 0E 10 0D 13 00 00 02' - '11 12 12 12 11 11 12 11 11 11 11 0E 13 00 00 13' - '10 0E 10 10 11 11 11 11 11 10 10 0E 13 00 00 13' - '0D 10 10 11 11 11 11 11 11 10 11 0B 13 00 00 13' - '0B 11 11 11 10 10 10 11 10 10 11 07 13 00 00 13' - '07 11 10 10 11 10 10 0E 10 10 10 06 13 00 00 13' - '05 10 11 11 10 11 11 10 11 10 10 04 13 00 00 13' - '04 11 11 11 11 11 11 11 11 11 0E 02 13 00 00 00' - '13 0E 11 12 12 12 12 12 11 12 0D 13 00 00 00 00' - '13 08 10 11 11 12 11 12 10 10 07 13 00 00 00 00' - '13 13 04 02 04 02 04 02 04 02 13 13 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' - '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' - '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' - '00 00 80 01 00 00 80 01 00 00 80 01 00 00 C0 03' - '00 00 C0 03 00 00 C0 03 00 00 FF FF 00 00 28 00' - '00 00 30 00 00 00 60 00 00 00 01 00 20 00 00 00' - '00 00 00 24 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 16 00 00 00 34 00 00' - '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' - '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' - '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' - '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' - '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' - '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' - '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' - '00 35 00 00 00 18 00 00 00 04 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 05 00 00 00 69 00 00 00 C5 00 00 00 F7 00 00' - '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' - '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' - '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' - '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' - '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' - '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' - '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' - '00 F1 00 00 00 B1 00 00 00 5C 00 00 00 0D 00 00' - '00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 05 00 00' - '00 9B 00 00 00 FF 00 00 00 FF 21 21 21 FF 2C 2C' - '2C FF 2B 2B 2B FF 2C 2C 2C FF 2B 2B 2B FF 2B 2B' - '2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B' - '2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B' - '2B FF 2B 2B 2B FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A' - '2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A' - '2A FF 2A 2A 2A FF 2A 2A 2A FF 2B 2B 2B FF 2B 2B' - '2B FF 2B 2B 2B FF 2E 2C 2D FF 2E 2C 2D FF 13 13' - '13 FF 00 00 00 FF 00 00 00 F6 00 00 00 69 00 00' - '00 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 54 00 00' - '00 FF 26 26 26 FF 90 90 90 FF CA CA CA FF CD CD' - 'CD FF CB CB CB FF CE CE CE FF CD CD CD FF CC CC' - 'CC FF CB CB CB FF C9 C9 C9 FF C7 C7 C7 FF C6 C6' - 'C6 FF C5 C5 C5 FF C4 C4 C4 FF C3 C3 C3 FF C2 C2' - 'C2 FF C2 C2 C2 FF C3 C3 C3 FF C0 C0 C0 FF C1 C1' - 'C1 FF BF BF BF FF BF BF BF FF BC BC BC FF BD BD' - 'BD FF BA BA BA FF BB BB BB FF B5 B5 B5 FF B3 B4' - 'B3 FF B8 B4 B6 FF AD AD AD FF AB AC AC FF AD A8' - 'AB FF 63 63 63 FF 09 09 09 FF 00 00 00 EF 00 00' - '00 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 03 00 00 00 AD 01 01' - '01 FF 8A 8A 8A FF EB EB EB FF E8 E8 E8 FF E7 E7' - 'E7 FF D5 D5 D5 FF 85 85 85 FF 88 88 88 FF 92 92' - '92 FF 98 98 98 FF A2 A2 A2 FF AD AD AD FF BA BA' - 'BA FF C0 C0 C0 FF C3 C3 C3 FF C6 C6 C6 FF CB CB' - 'CB FF CA CA CA FF CA CA CA FF D6 D6 D6 FF CA CA' - 'CA FF D3 D3 D3 FF CB CB CB FF D7 D7 D7 FF CC CC' - 'CC FF D4 D4 D4 FF C7 C7 C7 FF C8 C9 C9 FF C6 C2' - 'C4 FF 9D B3 A8 FF 20 A8 63 FF 1C A8 60 FF 90 AF' - 'A0 FF BF BB BD FF 4F 4F 4F FF 00 00 00 FF 00 00' - '00 81 00 00 00 04 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 15 00 00 00 F0 19 19' - '19 FF C7 C7 C7 FF EC EC EC FF E2 E2 E2 FF E6 E6' - 'E6 FF CB CB CB FF 3B 3B 3B FF 3F 3F 3F FF 56 56' - '56 FF 72 72 72 FF 87 87 87 FF 92 92 92 FF 9D 9D' - '9D FF A5 A5 A5 FF A8 A8 A8 FF AC AC AC FF B7 B7' - 'B7 FF A9 A9 A9 FF 9C 9C 9C FF BD BD BD FF 99 99' - '99 FF B7 B7 B7 FF A1 A1 A1 FF C3 C3 C3 FF A3 A3' - 'A3 FF BD BD BD FF 98 98 98 FF C5 C4 C4 FF C7 BF' - 'C3 FF 51 A7 7C FF 17 CE 71 FF 0A BF 61 FF 2F 99' - '64 FF C3 BD C0 FF 84 83 84 FF 01 01 01 FF 00 00' - '00 A3 00 00 00 0B 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 30 00 00 00 FA 29 29' - '29 FF D1 D1 D1 FF EA EA EA FF E4 E4 E4 FF E7 E7' - 'E7 FF CD CD CD FF 47 47 47 FF 5F 5F 5F FF 79 79' - '79 FF 87 87 87 FF 8F 8F 8F FF 97 97 97 FF A0 A0' - 'A0 FF A7 A7 A7 FF AA AA AA FF AE AE AE FF B9 B9' - 'B9 FF A4 A4 A4 FF 90 90 90 FF B8 B8 B8 FF 8A 8A' - '8A FF AF AF AF FF 94 94 94 FF BF BF BF FF 97 97' - '97 FF B7 B7 B7 FF 88 88 88 FF C4 C3 C3 FF C6 C3' - 'C5 FF 95 B2 A3 FF 91 D6 B4 FF 91 D8 B5 FF 83 AB' - '97 FF C4 C1 C3 FF 8E 8E 8E FF 01 01 01 FF 00 00' - '00 B7 00 00 00 13 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 34 00 00 00 F9 28 28' - '28 FF D1 D1 D1 FF EC EC EC FF E6 E6 E6 FF E7 E7' - 'E7 FF D1 D1 D1 FF 68 68 68 FF 74 74 74 FF 7E 7E' - '7E FF 85 85 85 FF 8E 8E 8E FF 97 97 97 FF A0 A0' - 'A0 FF A7 A7 A7 FF AA AA AA FF AE AE AE FF BA BA' - 'BA FF 9F 9F 9F FF 83 83 83 FF B3 B3 B3 FF 7C 7C' - '7C FF A8 A8 A8 FF 87 87 87 FF BB BB BB FF 8A 8A' - '8A FF B2 B2 B2 FF 79 79 79 FF C2 C2 C2 FF C4 C4' - 'C4 FF C6 C3 C4 FF 99 AC A2 FF 96 AB A0 FF C2 BE' - 'C0 FF C4 C4 C4 FF 8D 8D 8D FF 01 01 01 FF 00 00' - '00 BA 00 00 00 14 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 33 00 00 00 F9 28 28' - '28 FF D1 D1 D1 FF EE EE EE FF E7 E7 E7 FF E8 E8' - 'E8 FF D6 D6 D6 FF 70 70 70 FF 71 71 71 FF 7D 7D' - '7D FF 85 85 85 FF 8E 8E 8E FF 97 97 97 FF A0 A0' - 'A0 FF A7 A7 A7 FF AA AA AA FF AE AE AE FF BB BB' - 'BB FF 98 98 98 FF 73 73 73 FF AD AD AD FF 6A 6A' - '6A FF A0 A0 A0 FF 78 78 78 FF B7 B7 B7 FF 7C 7C' - '7C FF AB AB AB FF 67 67 67 FF C2 C2 C2 FF C6 C6' - 'C6 FF C4 C3 C4 FF C7 C4 C5 FF C6 C2 C4 FF BF BF' - 'BF FF C5 C5 C5 FF 8D 8D 8D FF 01 01 01 FF 00 00' - '00 B9 00 00 00 14 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 33 00 00 00 F9 27 27' - '27 FF D1 D1 D1 FF EF EF EF FF E9 E9 E9 FF EB EB' - 'EB FF D6 D6 D6 FF 6A 6A 6A FF 6C 6C 6C FF 78 78' - '78 FF 81 81 81 FF 8A 8A 8A FF 93 93 93 FF 9C 9C' - '9C FF A3 A3 A3 FF A6 A6 A6 FF AB AB AB FF B9 B9' - 'B9 FF 90 90 90 FF 66 66 66 FF A5 A5 A5 FF 5B 5B' - '5B FF 98 98 98 FF 6B 6B 6B FF B1 B1 B1 FF 70 70' - '70 FF A4 A4 A4 FF 58 58 58 FF C1 C1 C1 FF C8 C8' - 'C8 FF C5 C5 C5 FF C3 C3 C3 FF C2 C2 C2 FF C1 C1' - 'C1 FF C6 C6 C6 FF 8E 8E 8E FF 01 01 01 FF 00 00' - '00 B9 00 00 00 14 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 33 00 00 00 F9 27 27' - '27 FF D2 D2 D2 FF F2 F2 F2 FF EB EB EB FF EA EA' - 'EA FF DF DF DF FF A7 A7 A7 FF A7 A7 A7 FF AB AB' - 'AB FF AE AE AE FF B0 B0 B0 FF B3 B3 B3 FF B6 B6' - 'B6 FF B9 B9 B9 FF B9 B9 B9 FF BA BA BA FF BD BD' - 'BD FF B7 B7 B7 FF B1 B1 B1 FF BE BE BE FF AF AF' - 'AF FF BA BA BA FF B1 B1 B1 FF BE BE BE FF B0 B0' - 'B0 FF BA BA BA FF AB AB AB FF C5 C5 C5 FF C8 C8' - 'C8 FF C6 C6 C6 FF C4 C4 C4 FF C3 C3 C3 FF C2 C2' - 'C2 FF C9 C9 C9 FF 8E 8E 8E FF 00 00 00 FF 00 00' - '00 B9 00 00 00 14 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 33 00 00 00 F9 26 26' - '26 FF D3 D3 D3 FF F3 F3 F3 FF EB EB EB FF EB EB' - 'EB FF EA EA EA FF ED ED ED FF EB EB EB FF E9 E9' - 'E9 FF E8 E8 E8 FF E6 E6 E6 FF E4 E4 E4 FF E2 E2' - 'E2 FF E1 E1 E1 FF DF DF DF FF DE DE DE FF DB DB' - 'DB FF DB DB DB FF DC DC DC FF D8 D8 D8 FF D9 D9' - 'D9 FF D6 D6 D6 FF D6 D6 D6 FF D2 D2 D2 FF D2 D2' - 'D2 FF CF CF CF FF D0 D0 D0 FF CB CB CB FF CA CA' - 'CA FF C9 C9 C9 FF C7 C7 C7 FF C4 C4 C4 FF C0 C0' - 'C0 FF CA CA CA FF 8E 8E 8E FF 00 00 00 FF 00 00' - '00 B9 00 00 00 14 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 33 00 00 00 F9 26 26' - '26 FF D3 D3 D3 FF F7 F7 F7 FF F8 F8 F8 FF F6 F6' - 'F6 FF F6 F6 F6 FF F6 F6 F6 FF F5 F5 F5 FF F5 F5' - 'F5 FF F4 F4 F4 FF F4 F4 F4 FF F3 F3 F3 FF F3 F3' - 'F3 FF F3 F3 F3 FF F2 F2 F2 FF F2 F2 F2 FF F1 F1' - 'F1 FF F1 F1 F1 FF F1 F1 F1 FF F0 F0 F0 FF F0 F0' - 'F0 FF F0 F0 F0 FF EF EF EF FF EF EF EF FF EE EE' - 'EE FF EE EE EE FF ED ED ED FF ED ED ED FF ED ED' - 'ED FF EC EC EC FF EC EC EC FF EB EB EB FF E0 E0' - 'E0 FF D0 D0 D0 FF 8D 8D 8D FF 00 00 00 FF 00 00' - '00 B9 00 00 00 14 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 33 00 00 00 F9 24 24' - '24 FF D6 D6 D6 FF FF FF FF FF E9 E9 E9 FF E1 E1' - 'E1 FF E2 E2 E2 FF E2 E2 E2 FF E0 E0 E0 FF DF DF' - 'DF FF DF DF DF FF DF DF DF FF DF DF DF FF DF DF' - 'DF FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' - 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' - 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' - 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E2 E2' - 'E2 FF E3 E3 E3 FF E3 E3 E3 FF E3 E3 E3 FF F8 F8' - 'F8 FF EF EF EF FF 8C 8C 8C FF 00 00 00 FF 00 00' - '00 B9 00 00 00 14 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 34 00 00 00 FA 24 24' - '24 FF DE DE DE FF F8 F8 F8 FF D9 D9 D9 FF C4 C4' - 'C4 FF BB BB BB FF BF BF BF FF D8 D8 D8 FF DA DA' - 'DA FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' - 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' - 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' - 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' - 'D9 FF D9 D9 D9 FF D9 D9 D9 FF DB DB DB FF CF CF' - 'CF FF BC BC BC FF BB BB BB FF D1 D1 D1 FF DE DE' - 'DE FF FF FF FF FF 9A 9A 9A FF 00 00 00 FF 00 00' - '00 BA 00 00 00 14 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 25 00 00 00 F7 1F 1F' - '1F FF DA DA DA FF F3 F3 F3 FF C6 C6 C6 FF A9 A9' - 'A9 FF B7 B7 B7 FF B0 B0 B0 FF C3 C3 C3 FF DA DA' - 'DA FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' - 'D8 FF D8 D8 D8 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7' - 'D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7' - 'D7 FF D7 D7 D7 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' - 'D8 FF D8 D8 D8 FF D9 D9 D9 FF D2 D2 D2 FF A8 A8' - 'A8 FF B6 B6 B6 FF B1 B1 B1 FF B5 B5 B5 FF D8 D8' - 'D8 FF FC FC FC FF 9C 9C 9C FF 00 00 00 FF 00 00' - '00 AE 00 00 00 0C 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 07 00 00 00 D0 05 05' - '05 FF C2 C2 C2 FF F6 F6 F6 FF BC BC BC FF B2 B2' - 'B2 FF C3 C3 C3 FF AB AB AB FF BB BB BB FF D8 D8' - 'D8 FF D5 D5 D5 FF D5 D5 D5 FF D5 D5 D5 FF D4 D4' - 'D4 FF D3 D3 D3 FF D3 D3 D3 FF D5 D5 D5 FF D7 D7' - 'D7 FF D8 D8 D8 FF D8 D8 D8 FF D7 D7 D7 FF D5 D5' - 'D5 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D4 D4' - 'D4 FF D5 D5 D5 FF D7 D7 D7 FF C9 C9 C9 FF A6 A6' - 'A6 FF C3 C3 C3 FF B3 B3 B3 FF AD AD AD FF D6 D6' - 'D6 FF F5 F5 F5 FF 76 76 76 FF 00 00 00 FF 00 00' - '00 8C 00 00 00 01 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 9C 00 00' - '00 FF A4 A4 A4 FF F4 F4 F4 FF CF CF CF FF C5 C5' - 'C5 FF D2 D2 D2 FF BF BF BF FF C9 C9 C9 FF D3 D3' - 'D3 FF D2 D2 D2 FF D0 D0 D0 FF D3 D3 D3 FF DD DD' - 'DD FF E1 E1 E1 FF E3 E3 E3 FF E6 E6 E6 FF EA EA' - 'EA FF ED ED ED FF ED ED ED FF EB EB EB FF E7 E7' - 'E7 FF E4 E4 E4 FF E2 E2 E2 FF DE DE DE FF D4 D4' - 'D4 FF D0 D0 D0 FF D2 D2 D2 FF D3 D3 D3 FF C5 C5' - 'C5 FF D0 D0 D0 FF C2 C2 C2 FF BF BF BF FF D9 D9' - 'D9 FF E8 E8 E8 FF 56 56 56 FF 00 00 00 FF 00 00' - '00 72 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 73 00 00' - '00 FF 7E 7E 7E FF EF EF EF FF D1 D1 D1 FF CF CF' - 'CF FF CB CB CB FF CF CF CF FF D1 D1 D1 FF CE CE' - 'CE FF CF CF CF FF DF DF DF FF F0 F0 F0 FF EC EC' - 'EC FF E1 E1 E1 FF DE DE DE FF DD DD DD FF DC DC' - 'DC FF DB DB DB FF DB DB DB FF DC DC DC FF DD DD' - 'DD FF DE DE DE FF E1 E1 E1 FF EC EC EC FF F1 F1' - 'F1 FF E1 E1 E1 FF D1 D1 D1 FF CE CE CE FF D0 D0' - 'D0 FF CB CB CB FF CE CE CE FF D1 D1 D1 FF D9 D9' - 'D9 FF D4 D4 D4 FF 3F 3F 3F FF 00 00 00 FF 00 00' - '00 55 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 59 00 00' - '00 FF 59 59 59 FF E9 E9 E9 FF D0 D0 D0 FF CD CD' - 'CD FF CD CD CD FF CD CD CD FF CA CA CA FF D6 D6' - 'D6 FF ED ED ED FF E6 E6 E6 FF DC DC DC FF D4 D4' - 'D4 FF D5 D5 D5 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' - 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' - 'D6 FF D6 D6 D6 FF D5 D5 D5 FF D5 D5 D5 FF DB DB' - 'DB FF E4 E4 E4 FF ED ED ED FF DA DA DA FF CA CA' - 'CA FF CD CD CD FF CD CD CD FF CB CB CB FF DF DF' - 'DF FF B8 B8 B8 FF 22 22 22 FF 00 00 00 FB 00 00' - '00 3A 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 3E 00 00' - '00 FE 40 40 40 FF D7 D7 D7 FF D2 D2 D2 FF CA CA' - 'CA FF CB CB CB FF CA CA CA FF D4 D4 D4 FF E9 E9' - 'E9 FF DC DC DC FF D0 D0 D0 FF D1 D1 D1 FF D2 D2' - 'D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2' - 'D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2' - 'D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2 D2 FF D1 D1' - 'D1 FF D0 D0 D0 FF D8 D8 D8 FF EA EA EA FF D8 D8' - 'D8 FF C9 C9 C9 FF CA CA CA FF C9 C9 C9 FF E0 E0' - 'E0 FF A0 A0 A0 FF 08 08 08 FF 00 00 00 EB 00 00' - '00 22 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 25 00 00' - '00 F8 22 22 22 FF B7 B7 B7 FF DB DB DB FF CA CA' - 'CA FF CB CB CB FF CE CE CE FF E4 E4 E4 FF D4 D4' - 'D4 FF CF CF CF FF D1 D1 D1 FF D0 D0 D0 FF D0 D0' - 'D0 FF D0 D0 D0 FF D0 D0 D0 FF CF CF CF FF CD CD' - 'CD FF CE CE CE FF CE CE CE FF CE CE CE FF CE CE' - 'CE FF CE CE CE FF CE CE CE FF CE CE CE FF CE CE' - 'CE FF CE CE CE FF CC CC CC FF D0 D0 D0 FF E2 E2' - 'E2 FF CF CF CF FF C7 C7 C7 FF C9 C9 C9 FF E2 E2' - 'E2 FF 80 80 80 FF 00 00 00 FF 00 00 00 C2 00 00' - '00 0E 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00 00' - '00 E1 07 07 07 FF 9F 9F 9F FF DD DD DD FF CC CC' - 'CC FF CD CD CD FF DB DB DB FF D6 D6 D6 FF CE CE' - 'CE FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' - 'D0 FF D0 D0 D0 FF D0 D0 D0 FF CF CF CF FF CC CC' - 'CC FF C9 C9 C9 FF CA CA CA FF CA CA CA FF CA CA' - 'CA FF CA CA CA FF CA CA CA FF CA CA CA FF CA CA' - 'CA FF CA CA CA FF CA CA CA FF C8 C8 C8 FF CF CF' - 'CF FF DA DA DA FF C7 C7 C7 FF C9 C9 C9 FF E2 E2' - 'E2 FF 5A 5A 5A FF 00 00 00 FF 00 00 00 94 00 00' - '00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 B2 00 00 00 FF 83 83 83 FF DD DD DD FF CF CF' - 'CF FF D1 D1 D1 FF DB DB DB FF D1 D1 D1 FF D0 D0' - 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' - 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF CF CF' - 'CF FF C9 C9 C9 FF C5 C5 C5 FF C6 C6 C6 FF C6 C6' - 'C6 FF C6 C6 C6 FF C6 C6 C6 FF C6 C6 C6 FF C6 C6' - 'C6 FF C6 C6 C6 FF C6 C6 C6 FF C6 C6 C6 FF C7 C7' - 'C7 FF D3 D3 D3 FF C8 C8 C8 FF C9 C9 C9 FF DE DE' - 'DE FF 42 42 42 FF 00 00 00 FF 00 00 00 6C 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 80 00 00 00 FF 5F 5F 5F FF DC DC DC FF D1 D1' - 'D1 FF D2 D2 D2 FF D4 D4 D4 FF D1 D1 D1 FF D1 D1' - 'D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1' - 'D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1' - 'D1 FF D0 D0 D0 FF C8 C8 C8 FF C3 C3 C3 FF C3 C3' - 'C3 FF C3 C3 C3 FF C4 C4 C4 FF C4 C4 C4 FF C4 C4' - 'C4 FF C4 C4 C4 FF C4 C4 C4 FF C4 C4 C4 FF C4 C4' - 'C4 FF C7 C7 C7 FF C5 C5 C5 FF CB CB CB FF CC CC' - 'CC FF 2D 2D 2D FF 00 00 00 F8 00 00 00 40 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 4B 00 00 00 FE 41 41 41 FF D8 D8 D8 FF D4 D4' - 'D4 FF D2 D2 D2 FF D0 D0 D0 FF D3 D3 D3 FF D3 D3' - 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' - 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' - 'D3 FF D3 D3 D3 FF D3 D3 D3 FF CD CD CD FF C7 C7' - 'C7 FF C4 C4 C4 FF C2 C2 C2 FF C1 C1 C1 FF C0 C0' - 'C0 FF C1 C1 C1 FF C1 C1 C1 FF C1 C1 C1 FF C2 C2' - 'C2 FF BF BF BF FF C0 C0 C0 FF CE CE CE FF B2 B2' - 'B2 FF 1A 1A 1A FF 00 00 00 E5 00 00 00 28 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 1A 00 00 00 F2 2C 2C 2C FF CC CC CC FF D6 D6' - 'D6 FF D5 D5 D5 FF CC CC CC FF D5 D5 D5 FF D6 D6' - 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' - 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' - 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D7 D7 D7 FF D6 D6' - 'D6 FF D5 D5 D5 FF D3 D3 D3 FF CF CF CF FF CC CC' - 'CC FF C9 C9 C9 FF C6 C6 C6 FF C4 C4 C4 FF C2 C2' - 'C2 FF B3 B3 B3 FF BD BD BD FF D0 D0 D0 FF 99 99' - '99 FF 09 09 09 FF 00 00 00 CF 00 00 00 19 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 09 00 00 00 D8 18 18 18 FF B0 B0 B0 FF DB DB' - 'DB FF DB DB DB FF D0 D0 D0 FF D2 D2 D2 FF DB DB' - 'DB FF D9 D9 D9 FF DA DA DA FF DA DA DA FF DA DA' - 'DA FF DA DA DA FF DA DA DA FF DA DA DA FF DA DA' - 'DA FF DA DA DA FF DA DA DA FF DA DA DA FF DA DA' - 'DA FF DA DA DA FF DA DA DA FF DB DB DB FF DB DB' - 'DB FF DA DA DA FF D9 D9 D9 FF D9 D9 D9 FF CF CF' - 'CF FF C5 C5 C5 FF CC CC CC FF CA CA CA FF 7A 7A' - '7A FF 02 02 02 FF 00 00 00 B8 00 00 00 0A 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 02 00 00 00 BF 08 08 08 FF 97 97 97 FF DC DC' - 'DC FF DF DF DF FF DC DC DC FF CE CE CE FF D6 D6' - 'D6 FF DE DE DE FF DD DD DD FF DD DD DD FF DD DD' - 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' - 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' - 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' - 'DD FF DD DD DD FF DE DE DE FF D8 D8 D8 FF CE CE' - 'CE FF DD DD DD FF DC DC DC FF C6 C6 C6 FF 53 53' - '53 FF 00 00 00 FF 00 00 00 A0 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 A4 00 00 00 FF 77 77 77 FF D3 D3' - 'D3 FF E2 E2 E2 FF E1 E1 E1 FF DE DE DE FF CE CE' - 'CE FF D7 D7 D7 FF E1 E1 E1 FF E2 E2 E2 FF E0 E0' - 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' - 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' - 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E1 E1' - 'E1 FF E1 E1 E1 FF D9 D9 D9 FF CD CD CD FF DA DA' - 'DA FF E3 E3 E3 FF D9 D9 D9 FF BB BB BB FF 39 39' - '39 FF 00 00 00 FF 00 00 00 7E 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 89 00 00 00 FF 4B 4B 4B FF C9 C9' - 'C9 FF E5 E5 E5 FF E3 E3 E3 FF E4 E4 E4 FF E1 E1' - 'E1 FF D7 D7 D7 FF D2 D2 D2 FF DA DA DA FF E4 E4' - 'E4 FF E5 E5 E5 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4' - 'E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4' - 'E4 FF E4 E4 E4 FF E5 E5 E5 FF E5 E5 E5 FF DC DC' - 'DC FF D2 D2 D2 FF D6 D6 D6 FF E0 E0 E0 FF E4 E4' - 'E4 FF E6 E6 E6 FF D6 D6 D6 FF A8 A8 A8 FF 20 20' - '20 FF 00 00 00 FD 00 00 00 4E 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 62 00 00 00 FF 35 35 35 FF BD BD' - 'BD FF E6 E6 E6 FF E6 E6 E6 FF E6 E6 E6 FF E7 E7' - 'E7 FF E7 E7 E7 FF DF DF DF FF D2 D2 D2 FF D3 D3' - 'D3 FF DE DE DE FF E3 E3 E3 FF E3 E3 E3 FF E4 E4' - 'E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4 E4 FF E3 E3' - 'E3 FF E3 E3 E3 FF DE DE DE FF D4 D4 D4 FF D1 D1' - 'D1 FF DD DD DD FF E7 E7 E7 FF E7 E7 E7 FF E6 E6' - 'E6 FF E8 E8 E8 FF D4 D4 D4 FF 9A 9A 9A FF 0B 0B' - '0B FF 00 00 00 ED 00 00 00 2C 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 2D 00 00 00 F9 1E 1E 1E FF AB AB' - 'AB FF E4 E4 E4 FF ED ED ED FF E7 E7 E7 FF E6 E6' - 'E6 FF EC EC EC FF EB EB EB FF EA EA EA FF E4 E4' - 'E4 FF E0 E0 E0 FF DF DF DF FF DF DF DF FF DD DD' - 'DD FF DC DC DC FF DC DC DC FF DD DD DD FF DF DF' - 'DF FF DF DF DF FF DF DF DF FF E2 E2 E2 FF E9 E9' - 'E9 FF EC EC EC FF EA EA EA FF E5 E5 E5 FF EB EB' - 'EB FF EB EB EB FF D6 D6 D6 FF 8A 8A 8A FF 00 00' - '00 FF 00 00 00 C3 00 00 00 17 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 09 00 00 00 DD 08 08 08 FF 99 99' - '99 FF E4 E4 E4 FF DF DF DF FF BD BD BD FF C1 C1' - 'C1 FF D6 D6 D6 FF EC EC EC FF ED ED ED FF ED ED' - 'ED FF EE EE EE FF EE EE EE FF ED ED ED FF EC EC' - 'EC FF EB EB EB FF EB EB EB FF EC EC EC FF ED ED' - 'ED FF EE EE EE FF EE EE EE FF ED ED ED FF EE EE' - 'EE FF E4 E4 E4 FF C2 C2 C2 FF BE BE BE FF D1 D1' - 'D1 FF EC EC EC FF D4 D4 D4 FF 75 75 75 FF 00 00' - '00 FF 00 00 00 9C 00 00 00 06 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 AE 00 00 00 FF 8D 8D' - '8D FF E0 E0 E0 FF C4 C4 C4 FF B2 B2 B2 FF B8 B8' - 'B8 FF B2 B2 B2 FF EB EB EB FF F1 F1 F1 FF F0 F0' - 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' - 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' - 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF F3 F3' - 'F3 FF D5 D5 D5 FF B0 B0 B0 FF B6 B6 B6 FF B7 B7' - 'B7 FF EB EB EB FF CD CD CD FF 61 61 61 FF 00 00' - '00 FF 00 00 00 85 00 00 00 01 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 80 00 00 00 FF 64 64' - '64 FF CE CE CE FF DD DD DD FF DC DC DC FF D5 D5' - 'D5 FF E4 E4 E4 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' - 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' - 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' - 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF FA FA' - 'FA FF F2 F2 F2 FF DF DF DF FF D8 D8 D8 FF DC DC' - 'DC FF D7 D7 D7 FF B0 B0 B0 FF 34 34 34 FF 00 00' - '00 FF 00 00 00 67 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 44 00 00 00 FF 19 19' - '19 FF 80 80 80 FF BE BE BE FF D3 D3 D3 FF D7 D7' - 'D7 FF DB DB DB FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' - 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' - 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' - 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' - 'D8 FF D9 D9 D9 FF D9 D9 D9 FF D7 D7 D7 FF CD CD' - 'CD FF B0 B0 B0 FF 5D 5D 5D FF 06 06 06 FF 00 00' - '00 ED 00 00 00 2B 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 02 00 00 00 9C 00 00' - '00 FF 0C 0C 0C FF 3D 3D 3D FF 49 49 49 FF 48 48' - '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' - '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' - '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' - '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' - '48 FF 48 48 48 FF 48 48 48 FF 49 49 49 FF 49 49' - '49 FF 2F 2F 2F FF 02 02 02 FF 00 00 00 FF 00 00' - '00 5C 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 06 00 00' - '00 7F 00 00 00 F1 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 D6 00 00 00 5C 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 2C 00 00 00 7E 00 00 00 84 00 00' - '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' - '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' - '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' - '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' - '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' - '00 84 00 00 00 70 00 00 00 1A 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 FF FF FF FF FF FF 00 00 FF FF' - 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' - 'FF FF FF FF 00 00 FF 00 00 00 00 7F 00 00 FC 00' - '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' - '00 00 00 1F 00 00 F0 00 00 00 00 0F 00 00 F0 00' - '00 00 00 0F 00 00 F0 00 00 00 00 0F 00 00 F0 00' - '00 00 00 0F 00 00 F0 00 00 00 00 0F 00 00 F0 00' - '00 00 00 0F 00 00 F0 00 00 00 00 0F 00 00 F0 00' - '00 00 00 0F 00 00 F0 00 00 00 00 0F 00 00 F0 00' - '00 00 00 0F 00 00 F0 00 00 00 00 0F 00 00 F0 00' - '00 00 00 0F 00 00 F0 00 00 00 00 0F 00 00 F8 00' - '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' - '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' - '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 FC 00' - '00 00 00 3F 00 00 FC 00 00 00 00 3F 00 00 FC 00' - '00 00 00 3F 00 00 FC 00 00 00 00 3F 00 00 FC 00' - '00 00 00 3F 00 00 FC 00 00 00 00 7F 00 00 FE 00' - '00 00 00 7F 00 00 FE 00 00 00 00 7F 00 00 FE 00' - '00 00 00 7F 00 00 FE 00 00 00 00 7F 00 00 FE 00' - '00 00 00 7F 00 00 FF 00 00 00 00 7F 00 00 FF 00' - '00 00 00 FF 00 00 FF 00 00 00 00 FF 00 00 FF 00' - '00 00 01 FF 00 00 FF 80 00 00 03 FF 00 00 FF E0' - '00 00 07 FF 00 00 FF FF FF FF FF FF 00 00 FF FF' - 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' - 'FF FF FF FF 00 00 28 00 00 00 20 00 00 00 40 00' - '00 00 01 00 20 00 00 00 00 00 00 10 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 15 00 00 00 54 00 00 00 63 00 00 00 61 00 00' - '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' - '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' - '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' - '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' - '00 61 00 00 00 63 00 00 00 50 00 00 00 14 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 33 00 00' - '00 D7 0D 0D 0D FF 1B 1B 1B FF 1C 1C 1C FF 1E 1E' - '1E FF 1D 1D 1D FF 1D 1D 1D FF 1C 1C 1C FF 1B 1B' - '1B FF 1B 1B 1B FF 1B 1B 1B FF 1A 1A 1A FF 1A 1A' - '1A FF 1A 1A 1A FF 1A 1A 1A FF 1A 1A 1A FF 1A 1A' - '1A FF 1A 1A 1A FF 1A 1A 1A FF 1A 1A 1A FF 20 1C' - '1E FF 22 1B 1F FF 09 09 09 FF 00 00 00 C3 00 00' - '00 29 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 07 00 00 00 C9 40 40' - '40 FF BA BA BA FF CB CB CB FF BE BE BE FF B3 B3' - 'B3 FF B4 B4 B4 FF B4 B4 B4 FF B7 B7 B7 FF BB BB' - 'BB FF BB BB BB FF BB BB BB FF BC BC BC FF BE BE' - 'BE FF BD BD BD FF BC BC BC FF BB BB BB FF BA BA' - 'BA FF BA BA BA FF B4 B4 B4 FF B1 AE AF FF 8C A4' - '98 FF 80 A5 93 FF 90 91 91 FF 21 21 21 FF 00 00' - '00 AB 00 00 00 07 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 3D 08 08 08 FD B7 B7' - 'B7 FF F2 F2 F2 FF EE EE EE FF AF AF AF FF 51 51' - '51 FF 6E 6E 6E FF 89 89 89 FF 9A 9A 9A FF AB AB' - 'AB FF B3 B3 B3 FF BC BC BC FF B5 B5 B5 FF B5 B5' - 'B5 FF BC BC BC FF BD BD BD FF BE BE BE FF B7 B7' - 'B7 FF C0 C0 C0 FF C4 C1 C3 FF B7 BF BA FF 2A BF' - '75 FF 0E C0 67 FF 8C B8 A2 FF 80 79 7C FF 00 00' - '00 EC 00 00 00 25 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 58 19 19 19 FF CE CE' - 'CE FF EB EB EB FF EB EB EB FF AA AA AA FF 56 56' - '56 FF 7A 7A 7A FF 8C 8C 8C FF 96 96 96 FF A2 A2' - 'A2 FF A9 A9 A9 FF B4 B4 B4 FF A1 A1 A1 FF 97 97' - '97 FF A1 A1 A1 FF A5 A5 A5 FF A5 A5 A5 FF 9B 9B' - '9B FF A7 A7 A7 FF B3 B1 B2 FF BC C1 BE FF 87 C6' - 'A6 FF 85 CC A8 FF A6 BC B1 FF 94 90 92 FF 02 02' - '02 F9 00 00 00 36 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 5A 18 18 18 FF CC CC' - 'CC FF ED ED ED FF EC EC EC FF B9 B9 B9 FF 6D 6D' - '6D FF 7D 7D 7D FF 8B 8B 8B FF 96 96 96 FF A2 A2' - 'A2 FF A9 A9 A9 FF B6 B6 B6 FF 96 96 96 FF 82 82' - '82 FF 8E 8E 8E FF 93 93 93 FF 94 94 94 FF 86 86' - '86 FF 95 95 95 FF A6 A6 A6 FF C8 C8 C8 FF C2 C0' - 'C1 FF BF BD BE FF C9 C6 C7 FF 8E 8E 8E FF 01 01' - '01 FA 00 00 00 37 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 5A 17 17 17 FF CD CD' - 'CD FF F0 F0 F0 FF ED ED ED FF BF BF BF FF 77 77' - '77 FF 85 85 85 FF 91 91 91 FF 9A 9A 9A FF A4 A4' - 'A4 FF AA AA AA FF B5 B5 B5 FF 97 97 97 FF 83 83' - '83 FF 8D 8D 8D FF 92 92 92 FF 93 93 93 FF 86 86' - '86 FF 93 93 93 FF A7 A7 A7 FF CA CA CA FF C4 C3' - 'C4 FF C3 C2 C2 FF C8 C8 C8 FF 8E 8E 8E FF 00 00' - '00 FA 00 00 00 37 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 5A 17 17 17 FF CE CE' - 'CE FF F2 F2 F2 FF EC EC EC FF E6 E6 E6 FF DC DC' - 'DC FF DB DB DB FF DA DA DA FF DA DA DA FF D9 D9' - 'D9 FF D8 D8 D8 FF D7 D7 D7 FF D4 D4 D4 FF D4 D4' - 'D4 FF D2 D2 D2 FF D0 D0 D0 FF CF CF CF FF CC CC' - 'CC FF CB CB CB FF CB CB CB FF CC CC CC FF CA CA' - 'CA FF C7 C7 C7 FF C9 C9 C9 FF 8D 8D 8D FF 00 00' - '00 FA 00 00 00 37 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 5A 17 17 17 FF D0 D0' - 'D0 FF FF FF FF FF F8 F8 F8 FF F8 F8 F8 FF F9 F9' - 'F9 FF F8 F8 F8 FF F7 F7 F7 FF F7 F7 F7 FF F6 F6' - 'F6 FF F6 F6 F6 FF F5 F5 F5 FF F5 F5 F5 FF F5 F5' - 'F5 FF F4 F4 F4 FF F4 F4 F4 FF F4 F4 F4 FF F3 F3' - 'F3 FF F3 F3 F3 FF F2 F2 F2 FF F1 F1 F1 FF F2 F2' - 'F2 FF F3 F3 F3 FF E8 E8 E8 FF 8D 8D 8D FF 00 00' - '00 FA 00 00 00 37 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 5B 17 17 17 FF D7 D7' - 'D7 FF F4 F4 F4 FF DB DB DB FF D8 D8 D8 FF DD DD' - 'DD FF DF DF DF FF DE DE DE FF DE DE DE FF DE DE' - 'DE FF DE DE DE FF DE DE DE FF DE DE DE FF DE DE' - 'DE FF DE DE DE FF DE DE DE FF DE DE DE FF DF DF' - 'DF FF DF DF DF FF E0 E0 E0 FF DD DD DD FF D8 D8' - 'D8 FF E0 E0 E0 FF FB FB FB FF 9C 9C 9C FF 00 00' - '00 FA 00 00 00 38 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 51 11 11 11 FF D3 D3' - 'D3 FF D9 D9 D9 FF AD AD AD FF B0 B0 B0 FF BE BE' - 'BE FF D9 D9 D9 FF D8 D8 D8 FF D7 D7 D7 FF D7 D7' - 'D7 FF D7 D7 D7 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' - 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D7 D7 D7 FF D7 D7' - 'D7 FF D9 D9 D9 FF D3 D3 D3 FF AF AF AF FF B1 B1' - 'B1 FF B8 B8 B8 FF ED ED ED FF A0 A0 A0 FF 00 00' - '00 F7 00 00 00 2E 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 2B 00 00 00 F8 B3 B3' - 'B3 FF DC DC DC FF B9 B9 B9 FF BA BA BA FF BC BC' - 'BC FF D5 D5 D5 FF D3 D3 D3 FF D4 D4 D4 FF D8 D8' - 'D8 FF DF DF DF FF E3 E3 E3 FF E4 E4 E4 FF E4 E4' - 'E4 FF E3 E3 E3 FF DF DF DF FF D9 D9 D9 FF D4 D4' - 'D4 FF D3 D3 D3 FF CF CF CF FF BA BA BA FF B8 B8' - 'B8 FF B8 B8 B8 FF E9 E9 E9 FF 7C 7C 7C FF 00 00' - '00 DE 00 00 00 17 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 0C 00 00 00 E2 89 89' - '89 FF E5 E5 E5 FF CE CE CE FF D0 D0 D0 FF D0 D0' - 'D0 FF D1 D1 D1 FF DE DE DE FF E5 E5 E5 FF E5 E5' - 'E5 FF E2 E2 E2 FF DE DE DE FF DE DE DE FF DE DE' - 'DE FF DE DE DE FF E2 E2 E2 FF E6 E6 E6 FF E5 E5' - 'E5 FF DF DF DF FF D2 D2 D2 FF CF CF CF FF CF CF' - 'CF FF D0 D0 D0 FF E6 E6 E6 FF 54 54 54 FF 00 00' - '00 BC 00 00 00 07 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 BB 64 64' - '64 FF E2 E2 E2 FF CB CB CB FF CB CB CB FF CE CE' - 'CE FF E2 E2 E2 FF E0 E0 E0 FF D7 D7 D7 FF D3 D3' - 'D3 FF D4 D4 D4 FF D4 D4 D4 FF D4 D4 D4 FF D4 D4' - 'D4 FF D4 D4 D4 FF D4 D4 D4 FF D3 D3 D3 FF D7 D7' - 'D7 FF DF DF DF FF E4 E4 E4 FF D1 D1 D1 FF CB CB' - 'CB FF CF CF CF FF D7 D7 D7 FF 34 34 34 FF 00 00' - '00 99 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 93 3E 3E' - '3E FF DB DB DB FF CC CC CC FF CC CC CC FF DC DC' - 'DC FF D7 D7 D7 FF CF CF CF FF D0 D0 D0 FF D0 D0' - 'D0 FF D0 D0 D0 FF CF CF CF FF CD CD CD FF CD CD' - 'CD FF CD CD CD FF CD CD CD FF CD CD CD FF CD CD' - 'CD FF CC CC CC FF D3 D3 D3 FF DC DC DC FF C9 C9' - 'C9 FF CF CF CF FF C2 C2 C2 FF 1A 1A 1A FF 00 00' - '00 72 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 6B 21 21' - '21 FF C9 C9 C9 FF D2 D2 D2 FF D3 D3 D3 FF D7 D7' - 'D7 FF CF CF CF FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' - 'D0 FF D0 D0 D0 FF CF CF CF FF CA CA CA FF C7 C7' - 'C7 FF C8 C8 C8 FF C8 C8 C8 FF C8 C8 C8 FF C8 C8' - 'C8 FF C8 C8 C8 FF C7 C7 C7 FF CF CF CF FF CC CC' - 'CC FF D0 D0 D0 FF A9 A9 A9 FF 04 04 04 FF 00 00' - '00 4D 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 44 0B 0B' - '0B FF B1 B1 B1 FF D8 D8 D8 FF D2 D2 D2 FF D2 D2' - 'D2 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1' - 'D1 FF D1 D1 D1 FF D2 D2 D2 FF D1 D1 D1 FF C9 C9' - 'C9 FF C4 C4 C4 FF C3 C3 C3 FF C3 C3 C3 FF C4 C4' - 'C4 FF C4 C4 C4 FF C4 C4 C4 FF C5 C5 C5 FF C5 C5' - 'C5 FF D2 D2 D2 FF 86 86 86 FF 00 00 00 F3 00 00' - '00 28 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00' - '00 F4 93 93 93 FF DF DF DF FF D2 D2 D2 FF D2 D2' - 'D2 FF D5 D5 D5 FF D4 D4 D4 FF D4 D4 D4 FF D4 D4' - 'D4 FF D4 D4 D4 FF D4 D4 D4 FF D5 D5 D5 FF D5 D5' - 'D5 FF D2 D2 D2 FF CD CD CD FF C7 C7 C7 FF C3 C3' - 'C3 FF C2 C2 C2 FF C2 C2 C2 FF BE BE BE FF BC BC' - 'BC FF D0 D0 D0 FF 67 67 67 FF 00 00 00 D9 00 00' - '00 13 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 0B 00 00' - '00 DE 75 75 75 FF DE DE DE FF D7 D7 D7 FF D1 D1' - 'D1 FF DA DA DA FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' - 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' - 'D9 FF DA DA DA FF DA DA DA FF DA DA DA FF D8 D8' - 'D8 FF D6 D6 D6 FF D5 D5 D5 FF C7 C7 C7 FF C5 C5' - 'C5 FF CD CD CD FF 4B 4B 4B FF 00 00 00 BD 00 00' - '00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 B7 53 53 53 FF D9 D9 D9 FF E1 E1 E1 FF D5 D5' - 'D5 FF D5 D5 D5 FF DF DF DF FF DF DF DF FF DE DE' - 'DE FF DE DE DE FF DE DE DE FF DE DE DE FF DE DE' - 'DE FF DE DE DE FF DE DE DE FF DE DE DE FF DF DF' - 'DF FF E0 E0 E0 FF D7 D7 D7 FF D6 D6 D6 FF DE DE' - 'DE FF C3 C3 C3 FF 2C 2C 2C FF 00 00 00 9A 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 90 31 31 31 FF CB CB CB FF E5 E5 E5 FF E4 E4' - 'E4 FF DA DA DA FF D7 D7 D7 FF DD DD DD FF E2 E2' - 'E2 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4' - 'E4 FF E4 E4 E4 FF E4 E4 E4 FF E2 E2 E2 FF DE DE' - 'DE FF D7 D7 D7 FF D9 D9 D9 FF E4 E4 E4 FF DF DF' - 'DF FF AB AB AB FF 17 17 17 FF 00 00 00 73 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 67 1A 1A 1A FF B3 B3 B3 FF E8 E8 E8 FF EA EA' - 'EA FF EA EA EA FF E5 E5 E5 FF DE DE DE FF DD DD' - 'DD FF DD DD DD FF DF DF DF FF E0 E0 E0 FF E0 E0' - 'E0 FF E0 E0 E0 FF DD DD DD FF DC DC DC FF DD DD' - 'DD FF E5 E5 E5 FF E9 E9 E9 FF EC EC EC FF DF DF' - 'DF FF 95 95 95 FF 04 04 04 FF 00 00 00 4D 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 41 07 07 07 FE 9F 9F 9F FF E8 E8 E8 FF CD CD' - 'CD FF CB CB CB FF E7 E7 E7 FF EF EF EF FF ED ED' - 'ED FF EA EA EA FF E9 E9 E9 FF E7 E7 E7 FF E7 E7' - 'E7 FF E8 E8 E8 FF EA EA EA FF EC EC EC FF F0 F0' - 'F0 FF DB DB DB FF C6 C6 C6 FF DC DC DC FF E1 E1' - 'E1 FF 78 78 78 FF 00 00 00 F4 00 00 00 29 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 1E 00 00 00 F4 83 83 83 FF E0 E0 E0 FF C9 C9' - 'C9 FF C6 C6 C6 FF EA EA EA FF FA FA FA FF F8 F8' - 'F8 FF F8 F8 F8 FF F8 F8 F8 FF F8 F8 F8 FF F8 F8' - 'F8 FF F8 F8 F8 FF F8 F8 F8 FF F8 F8 F8 FF FB FB' - 'FB FF D9 D9 D9 FF C4 C4 C4 FF D1 D1 D1 FF D2 D2' - 'D2 FF 50 50 50 FF 00 00 00 DA 00 00 00 15 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 BB 24 24 24 FF 98 98 98 FF CF CF' - 'CF FF D2 D2 D2 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7' - 'D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7' - 'D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7' - 'D7 FF D7 D7 D7 FF D2 D2 D2 FF C8 C8 C8 FF 7C 7C' - '7C FF 0D 0D 0D FF 00 00 00 9A 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 31 00 00 00 DF 0F 0F 0F FF 29 29' - '29 FF 29 29 29 FF 28 28 28 FF 28 28 28 FF 28 28' - '28 FF 28 28 28 FF 28 28 28 FF 28 28 28 FF 28 28' - '28 FF 28 28 28 FF 28 28 28 FF 28 28 28 FF 28 28' - '28 FF 28 28 28 FF 2A 2A 2A FF 26 26 26 FF 08 08' - '08 FF 00 00 00 C8 00 00 00 1D 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 14 00 00 00 62 00 00' - '00 87 00 00 00 84 00 00 00 84 00 00 00 84 00 00' - '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' - '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' - '00 84 00 00 00 84 00 00 00 84 00 00 00 86 00 00' - '00 55 00 00 00 0A 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' - 'FF FF FF FF FF FF FF FF FF FF F0 00 00 0F E0 00' - '00 07 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 E0 00' - '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00' - '00 07 E0 00 00 07 F0 00 00 0F F0 00 00 0F F0 00' - '00 0F F0 00 00 0F F0 00 00 0F F8 00 00 1F F8 00' - '00 1F FC 00 00 3F FF FF FF FF FF FF FF FF 28 00' - '00 00 10 00 00 00 20 00 00 00 01 00 20 00 00 00' - '00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 11 04 04' - '04 8A 16 16 16 A8 1B 1B 1B A8 18 18 18 A8 16 16' - '16 A8 15 15 15 A8 16 16 16 A8 15 15 15 A8 15 15' - '15 A8 14 13 14 A8 19 12 16 A8 05 03 04 84 00 00' - '00 0F 00 00 00 00 00 00 00 00 05 05 05 83 9B 9B' - '9B FF C1 C1 C1 FF 83 83 83 FF 9A 9A 9A FF AD AD' - 'AD FF B2 B2 B2 FF B3 B3 B3 FF B5 B5 B5 FF B2 B1' - 'B2 FF AC B2 AF FF 59 B0 84 FF 5B 6C 64 FF 04 01' - '03 71 00 00 00 00 00 00 00 00 13 13 13 B3 DC DC' - 'DC FF CB CB CB FF 65 65 65 FF 8A 8A 8A FF A7 A7' - 'A7 FF AB AB AB FF 95 95 95 FF A2 A2 A2 FF 95 94' - '95 FF BA BF BC FF 8F CC AD FF 93 A1 9A FF 09 06' - '07 95 00 00 00 00 00 00 00 00 13 13 13 B2 D7 D7' - 'D7 FF DE DE DE FF A1 A1 A1 FF AC AC AC FF BA BA' - 'BA FF B7 B7 B7 FF A2 A2 A2 FF A9 A9 A9 FF 9D 9D' - '9D FF C2 C1 C1 FF CF C9 CC FF A2 A0 A1 FF 06 06' - '06 93 00 00 00 00 00 00 00 00 14 14 14 B3 D9 D9' - 'D9 FF ED ED ED FF EA EA EA FF E8 E8 E8 FF E5 E5' - 'E5 FF E5 E5 E5 FF E6 E6 E6 FF E4 E4 E4 FF E4 E4' - 'E4 FF DF DF DF FF E3 E3 E3 FF B2 B2 B2 FF 04 05' - '05 94 00 00 00 00 00 00 00 00 11 11 11 A5 C6 C6' - 'C6 FF BC BC BC FF CA CA CA FF D9 D9 D9 FF DA DA' - 'DA FF DA DA DA FF DB DB DB FF DA DA DA FF DA DA' - 'DA FF C6 C6 C6 FF C5 C5 C5 FF B4 B4 B4 FF 04 04' - '04 8B 00 00 00 00 00 00 00 00 04 04 04 7B A8 A8' - 'A8 FF CE CE CE FF CF CF CF FF DC DC DC FF DD DD' - 'DD FF DE DE DE FF DE DE DE FF DE DE DE FF DC DC' - 'DC FF CF CF CF FF D4 D4 D4 FF 91 91 91 FF 00 00' - '00 69 00 00 00 00 00 00 00 00 00 00 00 53 85 85' - '85 FF DB DB DB FF D7 D7 D7 FF D3 D3 D3 FF D0 D0' - 'D0 FF CE CE CE FF CD CD CD FF CE CE CE FF D0 D0' - 'D0 FF D6 D6 D6 FF D9 D9 D9 FF 6E 6E 6E FE 00 00' - '00 43 00 00 00 00 00 00 00 00 00 00 00 2E 64 64' - '64 FA DD DD DD FF D3 D3 D3 FF D0 D0 D0 FF D1 D1' - 'D1 FF CF CF CF FF C8 C8 C8 FF C4 C4 C4 FF C4 C4' - 'C4 FF C5 C5 C5 FF CF CF CF FF 4D 4D 4D F3 00 00' - '00 20 00 00 00 00 00 00 00 00 00 00 00 0E 42 42' - '42 E8 D7 D7 D7 FF D6 D6 D6 FF D9 D9 D9 FF D8 D8' - 'D8 FF D8 D8 D8 FF D7 D7 D7 FF D4 D4 D4 FF D3 D3' - 'D3 FF CD CD CD FF C5 C5 C5 FF 2C 2C 2C D8 00 00' - '00 0A 00 00 00 00 00 00 00 00 00 00 00 02 22 22' - '22 C5 D1 D1 D1 FF E3 E3 E3 FF DC DC DC FF DF DF' - 'DF FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF DE DE' - 'DE FF E5 E5 E5 FF C0 C0 C0 FF 11 11 11 B6 00 00' - '00 01 00 00 00 00 00 00 00 00 00 00 00 00 08 08' - '08 A1 BE BE BE FF E1 E1 E1 FF EA EA EA FF EB EB' - 'EB FF EB EB EB FF EB EB EB FF EC EC EC FF E5 E5' - 'E5 FF E5 E5 E5 FF A3 A3 A3 FF 01 01 01 93 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 74 78 78 78 FF C7 C7 C7 FF D9 D9 D9 FF DE DE' - 'DE FF DD DD DD FF DD DD DD FF DF DF DF FF D4 D4' - 'D4 FF C7 C7 C7 FF 60 60 60 FF 00 00 00 65 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 11 04 04 04 94 1D 1D 1D CC 1C 1C 1C CC 1C 1C' - '1C CC 1C 1C 1C CC 1C 1C 1C CC 1C 1C 1C CC 1D 1D' - '1D CC 1B 1B 1B CB 02 02 02 88 00 00 00 0C 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 FF FF 00 00 80 01 00 00 80 01' - '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' - '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' - '00 00 80 01 00 00 C0 03 00 00 C0 03 00 00 C0 03' - '00 00 FF FF 00 00' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00' } */ @@ -7324,49 +7427,396 @@ END /* BINRES desktop.ico */ 34 ICON desktop.ico /* { - '00 00 01 00 08 00 20 20 00 00 01 00 04 00 E8 02' - '00 00 86 00 00 00 10 10 00 00 01 00 04 00 28 01' - '00 00 6E 03 00 00 30 30 00 00 01 00 08 00 A8 0E' - '00 00 96 04 00 00 20 20 00 00 01 00 08 00 A8 08' - '00 00 3E 13 00 00 10 10 00 00 01 00 08 00 68 05' - '00 00 E6 1B 00 00 30 30 00 00 01 00 20 00 A8 25' - '00 00 4E 21 00 00 20 20 00 00 01 00 20 00 A8 10' - '00 00 F6 46 00 00 10 10 00 00 01 00 20 00 68 04' - '00 00 9E 57 00 00 28 00 00 00 20 00 00 00 40 00' - '00 00 01 00 04 00 00 00 00 00 00 02 00 00 00 00' + '00 00 01 00 09 00 10 10 10 00 01 00 04 00 28 01' + '00 00 96 00 00 00 20 20 10 00 01 00 04 00 E8 02' + '00 00 BE 01 00 00 30 30 10 00 01 00 04 00 68 06' + '00 00 A6 04 00 00 10 10 00 00 01 00 08 00 68 05' + '00 00 0E 0B 00 00 20 20 00 00 01 00 08 00 A8 08' + '00 00 76 10 00 00 30 30 00 00 01 00 08 00 A8 0E' + '00 00 1E 19 00 00 10 10 00 00 01 00 20 00 68 04' + '00 00 C6 27 00 00 20 20 00 00 01 00 20 00 A8 10' + '00 00 2E 2C 00 00 30 30 00 00 01 00 20 00 A8 25' + '00 00 D6 3C 00 00 28 00 00 00 10 00 00 00 20 00' + '00 00 01 00 04 00 00 00 00 00 C0 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 80 00 00 00 00 80 00 00 80 80 00 00 00 00' '80 00 80 00 80 00 00 80 80 00 C0 C0 C0 00 80 80' '80 00 FF 00 00 00 00 FF 00 00 FF FF 00 00 00 00' 'FF 00 FF 00 FF 00 00 FF FF 00 FF FF FF 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 77' + '77 77 77 77 77 80 8F FF FF FF F7 77 77 70 8F 83' + '88 88 88 83 37 70 8F 83 33 38 33 33 37 70 8F 83' + '33 33 33 33 37 70 8F 83 33 33 33 37 37 70 8F 83' + '33 33 33 87 87 70 8F 83 38 88 88 38 37 70 6F 83' + '88 87 88 87 87 70 0F 83 88 77 78 87 87 70 0F 77' + '77 77 77 77 7F 70 07 FF FF F7 FF FF F7 80 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + '00 00 80 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 80 01 00 00 FF FF 00 00 28 00' + '00 00 20 00 00 00 40 00 00 00 01 00 04 00 00 00' + '00 00 80 02 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 80' + '00 00 80 80 00 00 00 00 80 00 80 00 80 00 00 80' + '80 00 C0 C0 C0 00 80 80 80 00 FF 00 00 00 00 FF' + '00 00 FF FF 00 00 00 00 FF 00 FF 00 FF 00 00 FF' + 'FF 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 88' - '77 87 77 87 78 77 78 78 78 87 78 77 80 00 04 FF' - 'FF FF F7 FF 7F 7F 7F 7F 7F F7 77 77 78 00 08 FF' - 'FF F7 FF F7 FF F7 F7 F7 F7 7F FF 77 F8 00 08 FF' - '77 BF 87 77 77 77 77 77 77 77 B1 F7 78 00 08 FF' - 'B1 B1 BB B8 B8 8B B8 B1 B1 B9 8B 1F 77 00 08 FF' - '7B 1B 8B 8B 88 B1 7B 88 B8 B8 B9 8F F8 00 08 FF' - '89 B1 B8 B1 B8 B8 B1 BB 1B 1B 98 B7 77 00 08 FF' - '8B 8B 1B 1B 8B 8B 98 B8 B8 B9 8B 87 F8 00 08 FF' - '79 B1 B1 B8 1B 1B 8B 1B 1B 9B 99 BF 77 00 08 FF' - 'B9 8B 1B 1B B9 B8 B9 B1 B1 88 89 87 F8 00 08 FF' - '8B 98 9B 11 B8 B1 B8 1B 1B 7F 72 BF 77 00 08 FF' - '89 B1 B1 BB 8B 1B 8B B1 B8 F7 79 87 F8 00 08 FF' - 'B1 1B 8B 18 B1 88 B1 8B B1 7F 8B 1F F8 00 08 FF' - '81 BB B9 7B 17 BB 17 BB 18 1B 81 BF 77 00 08 FF' - '79 81 B8 B8 BB 7B 8B 88 BB 81 B1 77 F8 00 08 FF' - 'B1 BB 8B B8 B7 17 B8 8B 88 77 78 BF 77 00 08 FF' - '8B 18 81 7B 7B 7B 7B 7B B8 F7 7B 1F F8 00 08 FF' - '8B 8B B7 B7 B7 B7 B7 B7 88 77 79 7F F8 00 08 FF' - '89 B8 BB 8B 7B 7B 7B 8B B8 B8 1B 1F F7 00 08 FF' - 'F7 7F 77 F7 F7 F7 F7 F7 F7 7F 77 FF F8 00 08 FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF F8 00 00 87' - '7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 77 80 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 00' + '00 00 00 00 00 00 00 87 77 77 77 77 77 77 77 77' + '77 77 77 77 80 00 00 FF FF FF FF FF FF FF FF F7' + '77 77 77 77 78 00 08 FF FF FF FF FF FF FF FF FF' + '77 77 77 77 77 00 08 FF 77 77 77 77 77 77 77 77' + '77 77 78 77 77 00 08 FF 73 33 33 38 88 88 88 83' + '33 33 33 87 77 00 08 FF 73 33 33 38 88 88 88 83' + '33 33 33 87 77 00 08 FF 73 33 33 33 38 88 83 33' + '33 33 33 87 77 00 08 FF 73 33 33 33 33 33 33 33' + '33 33 33 87 77 00 08 FF 83 33 33 33 33 33 33 33' + '33 33 31 87 78 00 08 FF 81 33 33 33 33 33 33 33' + '33 88 31 8F 78 00 08 FF 81 33 33 33 33 33 33 33' + '33 FF 71 8F 78 00 08 FF 81 13 33 33 33 33 33 33' + '38 F7 71 8F F8 00 08 FF 81 33 33 33 38 88 83 33' + '33 7F 71 8F F8 00 08 FF 83 33 33 88 88 88 88 88' + '33 33 33 8F F8 00 08 FF 83 33 38 88 88 88 88 88' + '88 88 83 8F F8 00 08 FF 83 33 88 88 88 88 88 88' + '88 77 73 8F F8 00 08 FF 83 38 88 88 77 77 77 88' + '88 7F 73 8F F8 00 08 FF 83 38 88 87 77 77 77 78' + '88 77 83 8F F8 00 08 FF 83 88 88 87 77 77 77 77' + '88 88 83 8F F8 00 08 FF F7 77 77 77 77 77 77 77' + '77 77 77 FF F8 00 00 FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF F8 00 00 87 77 77 77 77 77 77 77 77' + '77 77 77 77 80 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF 80 00 00 03 80 00 00 01 00 00' + '00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00' + '00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00' + '00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00' + '00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00' + '00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00' + '00 01 80 00 00 03 E0 00 00 0F FF FF FF FF FF FF' + 'FF FF FF FF FF FF 28 00 00 00 30 00 00 00 60 00' + '00 00 01 00 04 00 00 00 00 00 00 06 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 80 00 00 80 00 00 00 80 80 00 80 00' + '00 00 80 00 80 00 80 80 00 00 C0 C0 C0 00 80 80' + '80 00 00 00 FF 00 00 FF 00 00 00 FF FF 00 FF 00' + '00 00 FF 00 FF 00 FF FF 00 00 FF FF FF 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 88 88 88 88 88 88 88 88' + '88 88 88 88 88 88 88 88 88 88 88 80 00 00 00 08' + 'FF FF FF FF FF FF FF FF FF FF FF FF 77 77 77 77' + '77 77 77 F8 00 00 00 8F FF FF FF FF FF FF FF FF' + 'FF 77 77 77 77 77 77 77 77 77 77 7F 80 00 00 8F' + 'FF FF FF FF FF FF FF FF FF 77 77 77 77 77 77 77' + '77 77 77 77 70 00 00 8F FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF 77 77 70 00 00 8F' + 'FF F8 88 87 77 77 77 77 77 77 77 77 77 77 77 88' + '88 88 77 77 70 00 00 8F FF 76 66 66 66 68 88 88' + '88 88 88 88 86 66 66 66 66 66 77 77 70 00 00 8F' + 'FF 76 66 66 66 68 88 88 88 88 88 88 88 66 66 66' + '66 66 77 77 70 00 00 8F FF 76 66 66 66 66 88 88' + '88 88 88 88 86 66 66 66 66 66 77 77 70 00 00 8F' + 'FF 76 66 66 66 66 66 88 88 88 88 86 66 66 66 66' + '66 66 77 77 70 00 00 8F FF 76 66 66 66 66 66 66' + '66 66 66 66 66 66 66 66 66 66 77 77 70 00 00 8F' + 'FF 76 66 66 66 66 66 66 66 66 66 66 66 66 66 66' + '66 66 77 77 70 00 00 8F FF 76 66 66 66 66 66 66' + '66 66 66 66 66 66 66 66 66 66 77 77 70 00 00 8F' + 'FF 76 66 66 66 66 66 66 66 66 66 66 66 66 66 66' + '66 66 77 77 70 00 00 8F FF 76 66 66 66 66 66 66' + '66 66 66 66 66 66 66 66 46 46 77 77 70 00 00 8F' + 'FF 76 46 66 66 66 66 66 66 66 66 66 66 66 68 77' + '76 46 77 77 70 00 00 8F FF 76 46 66 66 66 66 66' + '66 66 66 66 66 66 6F FF 78 46 77 7F 70 00 00 8F' + 'FF 76 44 46 66 66 66 66 66 66 66 66 66 66 8F 77' + 'F8 46 77 7F 70 00 00 8F FF 76 44 66 66 66 66 66' + '66 66 66 66 66 66 87 FF F8 46 7F 7F 70 00 00 8F' + 'FF 76 46 66 66 66 66 68 88 88 88 86 66 66 68 FF' + '74 46 7F 7F 80 00 00 8F FF 76 66 66 66 66 88 88' + '88 88 88 88 86 66 66 68 66 66 7F 7F 80 00 00 8F' + 'FF 76 66 66 66 68 88 88 88 88 88 88 88 86 66 66' + '66 66 7F 7F 80 00 00 8F FF 76 66 66 68 88 88 88' + '88 88 88 88 88 86 88 88 86 66 7F 7F 80 00 00 8F' + 'FF 76 66 66 68 88 88 88 88 88 88 88 88 86 88 78' + '78 66 7F 7F 80 00 00 8F FF 76 66 66 88 88 88 88' + '77 77 77 88 88 88 87 77 78 66 7F FF 80 00 00 8F' + 'FF 76 66 68 88 88 88 77 77 77 77 77 88 88 87 77' + '78 66 7F FF 80 00 00 8F FF 76 66 68 88 88 87 77' + '77 77 77 77 78 88 87 FF 78 66 7F FF 80 00 00 8F' + 'FF 76 66 88 88 88 77 77 77 77 77 77 77 88 88 77' + '78 66 7F FF 80 00 00 8F FF 74 66 66 88 88 77 77' + '77 77 77 77 77 88 86 66 66 64 7F FF 80 00 00 8F' + 'FF 78 87 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 88 FF FF 80 00 00 8F FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF 80 00 00 8F' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF 80 00 00 08 FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF F7 00 00 00 00' + '87 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 77 77 80 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 E0 00 00 00 00 0F 00 00 C0 00' + '00 00 00 07 00 00 80 00 00 00 00 03 00 00 80 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 80 00' + '00 00 00 03 00 00 C0 00 00 00 00 03 00 00 E0 00' + '00 00 00 0F 00 00 F8 00 00 00 00 3F 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 08 00 00 00' + '00 00 40 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 11 00 00 00 00 11' + '00 00 00 00 11 00 11 11 11 00 33 33 33 00 44 44' + '44 00 55 55 55 00 7F 7F 7F 00 99 33 00 00 CC 33' + '00 00 99 66 00 00 99 66 33 00 CC 66 00 00 CC 66' + '33 00 CC 66 66 00 CC 99 33 00 FF 99 33 00 99 99' + '66 00 CC 99 66 00 FF 99 66 00 FF CC 66 00 99 99' + '99 00 AA AA AA 00 BB BB BB 00 CC 99 99 00 FF 99' + '99 00 CC CC 99 00 FF CC 99 00 CC 99 CC 00 99 CC' + 'CC 00 CC CC CC 00 DD DD DD 00 FF CC CC 00 FF FF' + 'CC 00 FF CC FF 00 EE EE EE 00 FF FF FF 00 00 00' + '00 00 DD DD DD 00 FF CC CC 00 CC FF CC 00 CC CC' + 'FF 00 CC FF FF 00 EE EE EE 00 FF FF FF 00 00 00' + '00 00 CC FF FF 00 EE EE EE 00 FF FF FF 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 17' + '95 00 00 00 38 00 A8 44 F9 00 13 00 00 00 18 0A' + '38 00 00 00 38 00 98 69 38 00 98 17 95 00 00 00' + '00 00 E0 19 95 00 F0 88 FA 00 70 38 F5 00 FF FF' + 'FF 00 A8 44 F9 00 70 7D F5 00 3A 8A F5 00 86 00' + '00 00 86 00 00 00 08 00 00 00 B0 18 95 00 00 00' + '00 00 CB 44 F9 00 08 91 07 00 CD 8B F5 00 78 13' + '05 00 37 90 F5 00 00 00 00 00 3E 8A F5 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 10 00 00 00 00 00 00 00 60 00' + '62 00 00 EC FD 00 1A 02 00 00 4C 16 95 00 10 91' + '07 00 FC 15 95 00 FF FF FF 00 B4 1A 95 00 45 00' + '00 00 28 02 00 00 FF FF FF 00 E2 D8 F5 00 7D 9B' + 'F5 00 94 B6 01 00 00 00 05 00 F4 17 95 00 80 00' + '10 00 B4 1A 95 00 F0 88 FA 00 88 1C F5 00 FF FF' + 'FF 00 37 90 F5 00 00 00 00 00 3E 8A F5 00 9B B2' + 'E7 00 B7 00 00 00 02 00 00 00 A4 1A 95 00 01 00' + '00 00 18 00 00 00 00 00 00 00 10 19 95 00 42 00' + '00 00 00 00 00 00 F4 18 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 0C 00 00 00 02 00 00 00 01 01' + 'F5 00 00 EC FD 00 60 00 00 00 00 00 00 00 03 00' + '00 00 68 00 1A 00 10 91 07 00 00 00 00 00 10 91' + '07 00 05 00 00 00 BE B3 E7 00 4C 19 95 00 A3 B4' + 'E7 00 28 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 02 00 00 00 80 00 00 00 00 00 00 00 8C 1A' + '95 00 7F E9 4B 00 D0 60 38 00 00 00 00 00 00 00' + '00 00 80 1A 95 00 02 00 00 00 80 00 00 00 00 00' + '00 00 C0 27 95 00 C4 F5 AF 00 02 00 00 00 45 3A' + '5C 00 79 67 77 00 6E 5C 68 00 6D 65 5C 00 76 73' + '5C 00 69 6E 65 00 64 6C 6C 00 5C 73 68 00 6C 6C' + '33 00 5C 64 65 00 6B 74 6F 00 2E 69 63 00 00 1A' + '95 00 1F 3B D4 00 13 00 00 00 98 00 00 00 4F 3B' + 'D4 00 E0 19 95 00 33 3B D4 00 64 C5 F5 00 A9 F1' + 'E7 00 28 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 1A 95 00 98 69 38 00 86 00 00 00 00 00' + '00 00 C9 F1 E7 00 86 00 00 00 A4 1A 95 00 08 00' + '00 00 00 00 00 00 86 00 00 00 86 00 00 00 08 00' + '00 00 F4 19 95 00 33 3B D4 00 B4 1A 95 00 09 48' + 'E9 00 B8 10 E9 00 FF FF FF 00 C9 F1 E7 00 16 EA' + '4B 00 28 01 00 00 98 69 38 00 86 00 00 00 58 1A' + '95 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 26 26 26 26 26 26 26 26 26 26' + '02 26 26 26 26 26 26 16 1F 1F 18 18 18 18 17 18' + '17 17 17 17 07 26 06 25 25 23 22 24 22 24 20 21' + '20 20 20 20 17 01 06 25 13 10 0E 14 13 13 14 13' + '10 0E 0E 19 18 03 06 25 13 09 10 0E 10 0E 10 0E' + '0E 0E 0B 1C 17 26 06 25 0F 0D 0C 0E 0E 10 0E 0E' + '0E 0B 0A 19 1E 26 06 25 0C 0D 0A 0E 0E 0D 0E 0E' + '0E 17 0C 19 18 26 06 25 0E 09 10 0E 0E 0F 10 0E' + '0C 20 0F 19 1F 26 06 25 0F 0E 0E 10 13 11 13 10' + '0E 0C 0C 1B 1D 02 05 25 13 0E 10 13 14 13 11 13' + '0F 1F 12 1A 18 26 06 25 0E 0E 10 14 10 15 13 11' + '13 17 0E 1B 1F 26 05 25 18 1B 21 1B 20 21 21 20' + '1C 18 1B 24 20 26 04 17 24 24 20 24 24 20 24 20' + '24 24 20 24 07 26 26 26 04 26 04 04 26 04 26 04' + '04 26 04 26 26 26 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 FF FF 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 08 00 00 00 00 00 80 04 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 11 11 11 00 33 33 33 00 66 33 00 00 44 44' + '44 00 55 55 55 00 66 66 66 00 77 77 77 00 7F 7F' + '7F 00 99 00 00 00 99 33 00 00 99 33 33 00 CC 33' + '00 00 CC 33 33 00 99 66 00 00 99 66 33 00 CC 66' + '00 00 CC 66 33 00 99 66 66 00 CC 66 66 00 FF 66' + '66 00 99 99 33 00 CC 99 33 00 FF 99 33 00 99 99' + '66 00 CC 99 66 00 FF 99 66 00 CC CC 66 00 FF CC' + '66 00 88 88 88 00 99 99 99 00 AA AA AA 00 BB BB' + 'BB 00 CC 99 99 00 FF 99 99 00 CC CC 99 00 FF CC' + '99 00 99 99 CC 00 CC CC CC 00 DD DD DD 00 FF CC' + 'CC 00 CC FF CC 00 CC CC FF 00 CC FF FF 00 EE EE' + 'EE 00 FF FF FF 00 00 00 00 00 CC FF FF 00 EE EE' + 'EE 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 C0 17 95 00 00 00 38 00 A8 44' + 'F9 00 13 00 00 00 18 0A 38 00 00 00 38 00 98 69' + '38 00 98 17 95 00 00 00 00 00 E0 19 95 00 F0 88' + 'FA 00 70 38 F5 00 FF FF FF 00 A8 44 F9 00 70 7D' + 'F5 00 3A 8A F5 00 86 00 00 00 86 00 00 00 08 00' + '00 00 B0 18 95 00 00 00 00 00 CB 44 F9 00 08 91' + '07 00 CD 8B F5 00 78 13 05 00 37 90 F5 00 00 00' + '00 00 3E 8A F5 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00' + '00 00 00 00 00 00 60 00 62 00 00 EC FD 00 1A 02' + '00 00 4C 16 95 00 10 91 07 00 FC 15 95 00 FF FF' + 'FF 00 B4 1A 95 00 45 00 00 00 28 02 00 00 FF FF' + 'FF 00 E2 D8 F5 00 7D 9B F5 00 94 B6 01 00 00 00' + '05 00 F4 17 95 00 80 00 10 00 B4 1A 95 00 F0 88' + 'FA 00 88 1C F5 00 FF FF FF 00 37 90 F5 00 00 00' + '00 00 3E 8A F5 00 9B B2 E7 00 B7 00 00 00 02 00' + '00 00 A4 1A 95 00 01 00 00 00 18 00 00 00 00 00' + '00 00 10 19 95 00 42 00 00 00 00 00 00 00 F4 18' + '95 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00' + '00 00 02 00 00 00 01 01 F5 00 00 EC FD 00 60 00' + '00 00 00 00 00 00 03 00 00 00 68 00 1A 00 10 91' + '07 00 00 00 00 00 10 91 07 00 05 00 00 00 BE B3' + 'E7 00 4C 19 95 00 A3 B4 E7 00 28 01 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 02 00 00 00 80 00' + '00 00 00 00 00 00 8C 1A 95 00 7F E9 4B 00 D0 60' + '38 00 00 00 00 00 00 00 00 00 80 1A 95 00 02 00' + '00 00 80 00 00 00 00 00 00 00 C0 27 95 00 C4 F5' + 'AF 00 02 00 00 00 45 3A 5C 00 79 67 77 00 6E 5C' + '68 00 6D 65 5C 00 76 73 5C 00 69 6E 65 00 64 6C' + '6C 00 5C 73 68 00 6C 6C 33 00 5C 64 65 00 6B 74' + '6F 00 2E 69 63 00 00 1A 95 00 1F 3B D4 00 13 00' + '00 00 98 00 00 00 4F 3B D4 00 E0 19 95 00 33 3B' + 'D4 00 64 C5 F5 00 A9 F1 E7 00 28 01 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 1A 95 00 98 69' + '38 00 86 00 00 00 00 00 00 00 C9 F1 E7 00 86 00' + '00 00 A4 1A 95 00 08 00 00 00 00 00 00 00 86 00' + '00 00 86 00 00 00 08 00 00 00 F4 19 95 00 33 3B' + 'D4 00 B4 1A 95 00 09 48 E9 00 B8 10 E9 00 FF FF' + 'FF 00 C9 F1 E7 00 16 EA 4B 00 28 01 00 00 98 69' + '38 00 86 00 00 00 58 1A 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E' + '2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 00 00 00 2E' + '2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E' + '2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 00 2E 2E' + '04 1F 20 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1E' + '21 1F 1F 1E 1E 1F 1E 1F 1E 1F 06 2E 2E 2E 2E 02' + '2C 2D 2D 2D 2D 2D 2D 2C 2C 2D 2C 2C 2C 2C 28 2C' + '29 27 27 27 27 27 26 26 26 26 27 06 2E 2E 2E 07' + '2D 2D 2D 2D 2D 2D 2C 2D 2C 2A 2D 2C 27 2B 2C 27' + '2A 27 27 29 27 27 2A 27 27 26 26 1E 2E 2E 2E 07' + '2D 2D 28 19 21 1B 22 21 24 24 24 23 24 22 23 24' + '24 22 23 22 21 21 1A 19 23 26 26 1F 2E 2E 2E 1D' + '2D 2D 19 11 10 11 16 16 11 16 13 17 19 16 17 13' + '16 16 11 16 11 10 0B 10 19 26 27 1E 2E 2E 2E 07' + '2D 2D 21 0E 11 11 11 11 11 19 17 19 16 1A 13 16' + '19 11 16 11 10 11 11 0E 13 27 26 1F 2E 2E 2E 07' + '2D 2D 21 10 11 11 0F 11 16 11 11 16 11 16 16 11' + '16 11 11 11 11 0F 10 0C 19 27 26 1E 2E 2E 2E 07' + '2D 2D 19 10 0B 10 11 16 11 11 16 11 16 11 11 16' + '11 11 11 10 0F 10 11 0A 19 26 27 1F 2E 2E 2E 07' + '2D 2D 21 0A 10 0F 10 0D 11 11 0F 11 11 16 11 11' + '11 11 11 11 0C 0A 0C 0E 13 2C 27 1E 2E 2E 2E 07' + '2D 2D 18 0C 0E 0D 11 10 0F 10 11 11 11 11 11 11' + '11 0E 11 0A 12 18 0F 09 16 2A 27 1E 2E 2E 2E 07' + '2D 2D 21 0A 0C 0E 0A 11 11 11 11 16 11 11 11 11' + '11 11 10 0F 2B 2D 1E 0A 13 29 27 1E 2E 2E 2E 07' + '2D 2D 19 0A 0A 0A 11 11 16 11 11 11 16 11 11 16' + '11 16 11 12 27 26 2A 03 16 2C 27 1F 2E 2E 2E 07' + '2D 2D 19 0A 10 11 11 11 11 19 16 11 11 19 11 11' + '17 11 11 0F 20 2C 1E 0A 13 27 27 1E 2E 2E 2E 06' + '2D 2D 21 0A 11 11 16 11 16 16 14 16 19 17 19 16' + '19 11 16 11 11 0F 11 0A 16 2C 2C 1E 2E 2E 2E 07' + '2D 2D 18 10 11 16 11 17 13 16 16 1A 16 19 17 19' + '16 1A 11 15 12 15 0F 11 13 27 2C 1E 2E 2E 2E 06' + '2D 2D 19 11 11 11 16 13 16 19 1A 19 19 1A 19 1A' + '14 16 16 21 20 1F 25 0E 19 2C 2C 1E 2E 2E 2E 07' + '2D 2D 13 11 11 16 19 17 19 17 19 1A 1A 1B 1A 19' + '1B 1A 16 12 2C 27 1F 11 19 2C 2D 1E 2E 2E 2E 06' + '2D 2D 18 11 16 1A 11 19 1A 19 1C 1A 1B 1A 1B 1A' + '1A 19 17 19 20 2C 21 0E 13 2D 2D 1E 2E 2E 2E 06' + '2D 2D 12 10 11 16 19 17 19 1A 19 1C 1A 1C 1A 1B' + '1A 19 19 16 12 0F 15 0D 19 2D 2D 1E 2E 2E 2E 06' + '2D 2D 2C 26 27 27 27 27 27 27 27 27 27 27 27 27' + '27 27 27 28 27 27 28 26 2C 2D 2D 1E 2E 2E 2E 02' + '2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D' + '2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 06 2E 2E 2E 2E' + '05 26 26 27 26 27 27 26 27 26 27 27 26 27 26 27' + '27 26 27 26 27 26 27 26 26 26 1D 2E 2E 2E 2E 2E' + '2E 2E 01 01 01 2E 01 01 01 01 2E 01 01 01 01 2E' + '01 01 01 01 2E 01 01 01 01 2E 2E 2E 2E 00 00 00' + '2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E' + '2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' @@ -7379,274 +7829,21 @@ END '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 01 C0 00' '00 03 FF FF FF FF FF FF FF FF FF FF FF FF 28 00' - '00 00 10 00 00 00 20 00 00 00 01 00 04 00 00 00' - '00 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 80' - '00 00 80 80 00 00 00 00 80 00 80 00 80 00 00 80' - '80 00 C0 C0 C0 00 80 80 80 00 FF 00 00 00 00 FF' - '00 00 FF FF 00 00 00 00 FF 00 FF 00 FF 00 00 FF' - 'FF 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 48 77 77 77 87 77 87 80 8F FF' - 'F7 F7 F7 F7 F7 70 8F B1 B7 B7 B8 8B B8 70 8F 8B' - '1B 8B 8B 11 B7 70 8F B1 B1 B8 B1 BB 98 70 8F 1B' - '1B 1B 1B 17 B7 70 8F 89 B8 B9 8B 87 88 70 8F B1' - 'B8 B7 B1 B8 B7 70 8F 88 B8 8B 87 B7 17 70 8F B9' - 'BB 7B BB 87 B7 70 8F 77 77 7F 77 77 7F 70 07 FF' - 'FF 7F FF F7 F7 80 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 FF FF 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 FF FF 00 00 28 00 00 00 30 00 00 00 60 00' - '00 00 01 00 08 00 00 00 00 00 00 09 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 11 11 11 00 66 33 00 00 66 33 33 00 66 66' - '33 00 44 44 44 00 55 55 55 00 66 66 66 00 77 77' - '77 00 7F 7F 7F 00 99 33 00 00 99 33 33 00 CC 33' - '00 00 CC 33 33 00 99 66 00 00 99 66 33 00 CC 66' - '00 00 CC 66 33 00 FF 66 33 00 99 66 66 00 CC 66' - '66 00 FF 66 66 00 99 99 33 00 CC 99 33 00 FF 99' - '33 00 FF CC 33 00 99 99 66 00 CC 99 66 00 FF 99' - '66 00 CC CC 66 00 FF CC 66 00 88 88 88 00 99 99' - '99 00 AA AA AA 00 BB BB BB 00 CC 99 99 00 FF 99' - '99 00 99 CC 99 00 CC CC 99 00 FF CC 99 00 99 CC' - 'CC 00 CC CC CC 00 DD DD DD 00 FF CC CC 00 FF FF' - 'CC 00 CC CC FF 00 FF CC FF 00 CC FF FF 00 EE EE' - 'EE 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 C0 17 95 00 00 00 38 00 A8 44' - 'F9 77 13 00 00 00 18 0A 38 00 00 00 38 00 98 69' - '38 00 98 17 95 00 00 00 00 00 E0 19 95 00 F0 88' - 'FA 77 70 38 F5 77 FF FF FF FF A8 44 F9 77 70 7D' - 'F5 77 3A 8A F5 77 86 00 00 00 86 00 00 00 08 00' - '00 00 B0 18 95 00 00 00 00 00 CB 44 F9 77 08 91' - '07 00 CD 8B F5 77 78 13 05 00 37 90 F5 77 00 00' - '00 00 3E 8A F5 77 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00' - '00 00 00 00 00 00 60 00 62 00 00 EC FD 7F 1A 02' - '00 00 4C 16 95 00 10 91 07 00 FC 15 95 00 FF FF' - 'FF FF B4 1A 95 00 45 00 00 00 28 02 00 00 FF FF' - 'FF FF E2 D8 F5 77 7D 9B F5 77 94 B6 01 00 00 00' - '05 00 F4 17 95 00 80 00 10 C0 B4 1A 95 00 F0 88' - 'FA 77 88 1C F5 77 FF FF FF FF 37 90 F5 77 00 00' - '00 00 3E 8A F5 77 9B B2 E7 77 B7 00 00 00 02 00' - '00 00 A4 1A 95 00 01 00 00 00 18 00 00 00 00 00' - '00 00 10 19 95 00 42 00 00 00 00 00 00 00 F4 18' - '95 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00' - '00 00 02 00 00 00 01 01 F5 77 00 EC FD 7F 60 00' - '00 00 00 00 00 00 03 00 00 00 68 00 1A 02 10 91' - '07 00 00 00 00 00 10 91 07 00 05 00 00 00 BE B3' - 'E7 77 4C 19 95 00 A3 B4 E7 77 28 01 00 00 00 00' - '00 C0 00 00 00 00 00 00 00 00 02 00 00 00 80 00' - '00 00 00 00 00 00 8C 1A 95 00 7F E9 4B 00 D0 60' - '38 00 00 00 00 C0 00 00 00 00 80 1A 95 00 02 00' - '00 00 80 00 00 00 00 00 00 00 C0 27 95 00 C4 F5' - 'AF 00 02 00 00 00 45 3A 5C 63 79 67 77 69 6E 5C' - '68 6F 6D 65 5C 63 76 73 5C 77 69 6E 65 5C 64 6C' - '6C 73 5C 73 68 65 6C 6C 33 32 5C 64 65 73 6B 74' - '6F 70 2E 69 63 6F 00 1A 95 00 1F 3B D4 77 13 00' - '00 00 98 00 00 00 4F 3B D4 77 E0 19 95 00 33 3B' - 'D4 77 64 C5 F5 77 A9 F1 E7 77 28 01 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 1A 95 00 98 69' - '38 00 86 00 00 00 00 00 00 00 C9 F1 E7 77 86 00' - '00 00 A4 1A 95 00 08 00 00 00 00 00 00 00 86 00' - '00 00 86 00 00 00 08 00 00 00 F4 19 95 00 33 3B' - 'D4 77 B4 1A 95 00 09 48 E9 77 B8 10 E9 77 FF FF' - 'FF FF C9 F1 E7 77 16 EA 4B 00 28 01 00 00 98 69' - '38 00 86 00 00 00 58 1A 95 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 32 32 32 32 32 32 32 32 32 32 32 32 32 32' - '32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32' - '32 32 32 32 32 32 32 32 32 32 00 00 00 00 00 00' - '32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32' - '32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32' - '32 32 32 32 32 32 32 32 32 32 32 32 00 00 00 32' - '32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32' - '32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32' - '32 32 32 32 32 32 32 32 32 32 32 32 32 00 32 32' - '32 32 05 08 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F' - '1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F' - '1F 1F 1F 1F 1F 1F 1F 08 06 32 32 32 32 32 32 32' - '32 1F 31 31 31 31 31 31 31 31 30 31 30 30 30 30' - '30 30 30 2A 30 2A 30 2A 2A 2A 2A 2A 2A 2A 2A 2A' - '29 2A 29 29 29 29 29 29 30 20 01 32 32 32 32 32' - '05 31 31 31 30 31 30 30 30 30 30 30 30 30 2A 30' - '30 2A 2A 30 2A 2A 2A 2A 2A 2A 2A 29 2A 29 29 29' - '29 29 29 29 29 29 22 29 22 30 07 32 32 32 32 32' - '08 31 31 30 31 30 30 31 30 30 30 30 30 2A 30 2A' - '2A 30 2A 2A 2A 2A 2B 2A 2A 29 2A 29 2A 29 29 29' - '29 29 29 29 29 22 29 22 22 2A 21 32 32 32 32 32' - '20 31 31 31 31 31 31 31 31 31 31 31 30 31 31 31' - '2E 2F 31 30 30 31 2F 30 30 31 2A 2C 2D 31 30 30' - '30 30 30 2A 2E 2C 2A 29 29 29 21 32 32 32 32 32' - '1F 31 31 31 2A 1B 1C 1B 1B 1B 23 1B 24 27 1B 26' - '1E 24 1E 26 24 1D 24 27 1E 23 27 24 1E 23 1C 1D' - '23 1B 1B 1C 1B 1B 2A 29 22 2A 21 32 32 32 32 32' - '1F 31 31 31 29 11 0E 11 11 17 11 17 17 11 1C 11' - '1B 18 1B 1C 17 1C 1B 17 15 17 11 1B 11 17 11 11' - '10 11 11 0E 10 0B 2B 29 29 29 21 32 32 32 32 32' - '1F 31 31 31 2A 11 11 11 11 11 17 11 11 1B 17 1C' - '17 1B 14 17 1C 14 18 1B 17 17 1C 11 17 11 17 11' - '11 0F 11 10 0B 10 29 29 29 29 21 32 32 32 32 32' - '1F 31 31 31 2A 0F 10 11 11 11 11 17 11 11 17 11' - '1C 17 17 1C 17 17 1B 12 1B 11 17 1B 11 17 11 11' - '11 11 10 0B 10 11 26 29 29 2A 21 32 32 32 32 32' - '1F 31 31 31 29 10 0F 11 10 11 17 11 11 17 11 1B' - '17 11 1C 11 17 1B 12 1B 11 1B 11 11 17 11 11 11' - '11 10 0F 11 10 0A 2B 29 29 2A 21 32 32 32 32 32' - '1F 31 31 31 2A 11 10 0B 11 11 11 11 17 11 17 11' - '11 1B 11 17 14 11 17 11 17 11 17 11 11 11 11 10' - '11 0F 10 0A 0D 0E 29 2A 29 29 21 32 32 32 32 32' - '1F 31 31 31 2D 10 0B 10 0F 10 11 0E 11 11 11 11' - '17 11 17 11 11 17 11 17 11 17 11 0F 10 11 11 11' - '0E 11 0C 11 0E 0C 2B 29 29 2A 21 32 32 32 32 32' - '1F 31 31 31 2B 0F 10 11 0C 0F 11 11 11 11 11 11' - '11 17 11 11 17 11 17 11 11 11 11 11 11 11 0E 11' - '0D 0E 11 0A 10 0A 29 2A 29 2A 21 32 32 32 32 32' - '1F 31 31 31 29 0F 0C 0B 0E 11 0C 11 10 0F 11 11' - '11 0E 11 17 11 11 11 0F 11 11 10 11 0F 10 11 11' - '0E 10 0A 10 0A 0A 2B 2A 29 2A 21 32 32 32 32 32' - '1F 31 31 31 29 10 0A 10 0C 0F 11 0E 11 10 11 0E' - '11 11 11 10 0F 11 10 11 10 0F 11 11 10 0B 10 0A' - '0B 03 0A 0A 0C 0E 29 2A 2A 2A 20 32 32 32 32 32' - '1F 31 31 31 2A 0A 0E 0C 0F 10 0A 10 0F 0D 0E 11' - '11 11 11 11 11 11 11 11 11 11 11 10 0F 10 0A 1F' - '22 2A 25 0B 0A 0A 27 2A 29 2A 21 32 32 32 32 32' - '08 31 31 31 29 0B 0C 0E 0A 0C 11 0A 10 11 11 11' - '11 17 11 11 17 11 11 17 11 11 11 11 11 11 04 30' - '31 30 29 07 0A 0A 29 2A 29 30 20 32 32 32 32 32' - '1F 31 31 31 29 10 0A 0A 0C 0F 0A 11 11 17 11 11' - '11 11 17 11 11 17 11 11 11 17 11 11 11 10 13 30' - '29 20 30 08 0A 0A 2B 2A 2A 2A 20 32 32 32 32 32' - '1F 31 31 31 29 0A 0A 0C 0E 0C 17 11 11 11 17 11' - '17 11 11 17 15 11 17 11 1B 11 11 17 11 11 0F 29' - '31 30 31 08 02 10 22 30 29 30 20 32 32 32 32 32' - '08 31 31 31 26 0F 0C 0A 11 17 11 11 11 17 11 1B' - '11 17 17 14 17 17 14 17 11 17 17 11 17 11 0F 07' - '2A 31 21 03 0C 0A 2B 2A 2A 2A 21 32 32 32 32 32' - '1F 31 31 31 29 0A 0E 11 11 11 11 17 11 11 17 11' - '1C 11 1B 18 11 1B 18 14 17 14 17 11 14 17 11 0F' - '0F 04 03 10 0B 0A 26 30 2A 2A 20 32 32 32 32 32' - '08 31 31 31 29 0A 10 11 11 11 17 11 17 1B 12 1B' - '11 1C 17 1B 1B 17 1B 18 1B 17 15 17 17 12 17 11' - '11 0F 11 11 10 0A 2B 30 2A 30 20 32 32 32 32 32' - '08 31 31 31 22 0F 11 11 17 11 11 1B 12 17 1B 17' - '1B 17 1C 18 1B 1C 17 1B 1C 17 17 15 17 17 13 13' - '1A 1B 13 0F 11 10 29 2A 2A 30 20 32 32 32 32 32' - '08 31 31 31 22 11 11 11 11 1B 17 11 1B 12 1B 1C' - '17 1C 17 1B 1C 17 1B 1C 17 1C 1B 17 1B 11 23 20' - '21 1F 28 13 0F 10 29 30 2A 30 20 32 32 32 32 32' - '08 31 31 31 22 10 11 17 11 11 1C 17 17 1B 18 1B' - '1C 1B 1C 1B 1C 1C 1B 1B 1C 17 1C 1B 17 14 1A 29' - '2A 2A 22 13 10 0F 2B 30 2A 30 20 32 32 32 32 32' - '08 31 31 31 22 0F 11 11 1B 17 11 17 1B 1C 1B 18' - '1B 1E 1C 1B 1E 1B 1E 1C 1B 1C 1B 18 1B 18 1A 29' - '2A 29 29 1A 11 11 26 31 31 30 20 32 32 32 32 32' - '08 31 31 31 22 0D 17 11 11 1C 17 15 17 1B 1B 1C' - '1B 1C 1D 1C 1B 1E 1B 1C 1E 1B 1C 1B 1C 17 1B 29' - '2A 2A 2A 13 10 11 2B 2F 30 31 20 32 32 32 32 32' - '08 31 31 31 22 0E 11 14 17 11 1B 17 1B 1C 19 1B' - '1C 1D 1C 1C 1E 24 1E 1E 1B 1C 1D 1C 17 1C 13 20' - '29 22 21 0F 11 0C 29 31 31 31 20 32 32 32 32 32' - '08 31 31 31 21 0A 0C 17 17 17 15 17 18 1B 1C 1C' - '1E 1C 1E 1E 24 1E 1C 1C 1E 1C 1C 17 1C 17 18 11' - '16 11 0F 11 10 0A 2B 31 30 31 1F 32 32 32 32 32' - '07 31 31 31 22 1B 20 1B 23 23 1B 26 23 26 23 26' - '23 26 26 23 26 26 26 26 26 23 26 23 26 23 26 23' - '1B 23 1B 23 1F 1A 2A 31 31 31 20 32 32 32 32 32' - '08 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31' - '31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31' - '31 31 31 31 31 31 31 31 31 31 1F 32 32 32 32 32' - '05 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31' - '31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31' - '31 31 31 31 31 31 31 31 31 30 08 32 32 32 32 32' - '01 20 31 31 31 31 31 31 31 31 31 31 31 31 31 31' - '31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31' - '31 31 31 31 31 31 31 31 31 21 01 32 32 32 32 32' - '32 01 07 21 29 22 22 22 22 22 22 22 22 22 22 22' - '22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22' - '22 22 22 22 22 22 22 22 08 01 32 32 32 00 00 32' - '32 32 32 32 01 01 01 01 01 01 01 01 01 01 01 01' - '01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01' - '01 01 01 01 01 01 01 01 32 32 32 32 00 00 00 00' - '32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32' - '32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32' - '32 32 32 32 32 32 32 32 32 32 32 00 00 00 00 00' - '00 00 32 32 32 32 32 32 32 32 32 32 32 32 32 32' - '32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32' - '32 32 32 32 32 32 32 32 32 32 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' - 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' - 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 F0 00' - '00 00 00 0F 00 00 C0 00 00 00 00 03 00 00 80 00' - '00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 01 00 00 80 00 00 00 00 03 00 00 C0 00' - '00 00 00 07 00 00 F0 00 00 00 00 0F 00 00 FF FF' - 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' - 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 28 00' - '00 00 20 00 00 00 40 00 00 00 01 00 08 00 00 00' - '00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 11 11 11 00 33 33' - '33 00 66 33 00 00 44 44 44 00 55 55 55 00 66 66' - '66 00 77 77 77 00 7F 7F 7F 00 99 00 00 00 99 33' + '00 00 30 00 00 00 60 00 00 00 01 00 08 00 00 00' + '00 00 80 0A 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 11 11 11 00 66 33' + '00 00 66 33 33 00 66 66 33 00 44 44 44 00 55 55' + '55 00 66 66 66 00 77 77 77 00 7F 7F 7F 00 99 33' '00 00 99 33 33 00 CC 33 00 00 CC 33 33 00 99 66' - '00 00 99 66 33 00 CC 66 00 00 CC 66 33 00 99 66' - '66 00 CC 66 66 00 FF 66 66 00 99 99 33 00 CC 99' - '33 00 FF 99 33 00 99 99 66 00 CC 99 66 00 FF 99' - '66 00 CC CC 66 00 FF CC 66 00 88 88 88 00 99 99' - '99 00 AA AA AA 00 BB BB BB 00 CC 99 99 00 FF 99' - '99 00 CC CC 99 00 FF CC 99 00 99 99 CC 00 CC CC' - 'CC 00 DD DD DD 00 FF CC CC 00 CC FF CC 00 CC CC' + '00 00 99 66 33 00 CC 66 00 00 CC 66 33 00 FF 66' + '33 00 99 66 66 00 CC 66 66 00 FF 66 66 00 99 99' + '33 00 CC 99 33 00 FF 99 33 00 FF CC 33 00 99 99' + '66 00 CC 99 66 00 FF 99 66 00 CC CC 66 00 FF CC' + '66 00 88 88 88 00 99 99 99 00 AA AA AA 00 BB BB' + 'BB 00 CC 99 99 00 FF 99 99 00 99 CC 99 00 CC CC' + '99 00 FF CC 99 00 99 CC CC 00 CC CC CC 00 DD DD' + 'DD 00 FF CC CC 00 FF FF CC 00 CC CC FF 00 FF CC' 'FF 00 CC FF FF 00 EE EE EE 00 FF FF FF 00 00 00' - '00 00 CC FF FF 00 EE EE EE 00 FF FF FF 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' @@ -7655,48 +7852,48 @@ END '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 17' - '95 00 00 00 38 00 A8 44 F9 77 13 00 00 00 18 0A' + '95 00 00 00 38 00 A8 44 F9 00 13 00 00 00 18 0A' '38 00 00 00 38 00 98 69 38 00 98 17 95 00 00 00' - '00 00 E0 19 95 00 F0 88 FA 77 70 38 F5 77 FF FF' - 'FF FF A8 44 F9 77 70 7D F5 77 3A 8A F5 77 86 00' + '00 00 E0 19 95 00 F0 88 FA 00 70 38 F5 00 FF FF' + 'FF 00 A8 44 F9 00 70 7D F5 00 3A 8A F5 00 86 00' '00 00 86 00 00 00 08 00 00 00 B0 18 95 00 00 00' - '00 00 CB 44 F9 77 08 91 07 00 CD 8B F5 77 78 13' - '05 00 37 90 F5 77 00 00 00 00 3E 8A F5 77 00 00' + '00 00 CB 44 F9 00 08 91 07 00 CD 8B F5 00 78 13' + '05 00 37 90 F5 00 00 00 00 00 3E 8A F5 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 10 00 00 00 00 00 00 00 60 00' - '62 00 00 EC FD 7F 1A 02 00 00 4C 16 95 00 10 91' - '07 00 FC 15 95 00 FF FF FF FF B4 1A 95 00 45 00' - '00 00 28 02 00 00 FF FF FF FF E2 D8 F5 77 7D 9B' - 'F5 77 94 B6 01 00 00 00 05 00 F4 17 95 00 80 00' - '10 C0 B4 1A 95 00 F0 88 FA 77 88 1C F5 77 FF FF' - 'FF FF 37 90 F5 77 00 00 00 00 3E 8A F5 77 9B B2' - 'E7 77 B7 00 00 00 02 00 00 00 A4 1A 95 00 01 00' + '62 00 00 EC FD 00 1A 02 00 00 4C 16 95 00 10 91' + '07 00 FC 15 95 00 FF FF FF 00 B4 1A 95 00 45 00' + '00 00 28 02 00 00 FF FF FF 00 E2 D8 F5 00 7D 9B' + 'F5 00 94 B6 01 00 00 00 05 00 F4 17 95 00 80 00' + '10 00 B4 1A 95 00 F0 88 FA 00 88 1C F5 00 FF FF' + 'FF 00 37 90 F5 00 00 00 00 00 3E 8A F5 00 9B B2' + 'E7 00 B7 00 00 00 02 00 00 00 A4 1A 95 00 01 00' '00 00 18 00 00 00 00 00 00 00 10 19 95 00 42 00' '00 00 00 00 00 00 F4 18 95 00 00 00 00 00 00 00' '00 00 00 00 00 00 0C 00 00 00 02 00 00 00 01 01' - 'F5 77 00 EC FD 7F 60 00 00 00 00 00 00 00 03 00' - '00 00 68 00 1A 02 10 91 07 00 00 00 00 00 10 91' - '07 00 05 00 00 00 BE B3 E7 77 4C 19 95 00 A3 B4' - 'E7 77 28 01 00 00 00 00 00 C0 00 00 00 00 00 00' + 'F5 00 00 EC FD 00 60 00 00 00 00 00 00 00 03 00' + '00 00 68 00 1A 00 10 91 07 00 00 00 00 00 10 91' + '07 00 05 00 00 00 BE B3 E7 00 4C 19 95 00 A3 B4' + 'E7 00 28 01 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 02 00 00 00 80 00 00 00 00 00 00 00 8C 1A' - '95 00 7F E9 4B 00 D0 60 38 00 00 00 00 C0 00 00' + '95 00 7F E9 4B 00 D0 60 38 00 00 00 00 00 00 00' '00 00 80 1A 95 00 02 00 00 00 80 00 00 00 00 00' '00 00 C0 27 95 00 C4 F5 AF 00 02 00 00 00 45 3A' - '5C 63 79 67 77 69 6E 5C 68 6F 6D 65 5C 63 76 73' - '5C 77 69 6E 65 5C 64 6C 6C 73 5C 73 68 65 6C 6C' - '33 32 5C 64 65 73 6B 74 6F 70 2E 69 63 6F 00 1A' - '95 00 1F 3B D4 77 13 00 00 00 98 00 00 00 4F 3B' - 'D4 77 E0 19 95 00 33 3B D4 77 64 C5 F5 77 A9 F1' - 'E7 77 28 01 00 00 00 00 00 00 00 00 00 00 00 00' + '5C 00 79 67 77 00 6E 5C 68 00 6D 65 5C 00 76 73' + '5C 00 69 6E 65 00 64 6C 6C 00 5C 73 68 00 6C 6C' + '33 00 5C 64 65 00 6B 74 6F 00 2E 69 63 00 00 1A' + '95 00 1F 3B D4 00 13 00 00 00 98 00 00 00 4F 3B' + 'D4 00 E0 19 95 00 33 3B D4 00 64 C5 F5 00 A9 F1' + 'E7 00 28 01 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 1A 95 00 98 69 38 00 86 00 00 00 00 00' - '00 00 C9 F1 E7 77 86 00 00 00 A4 1A 95 00 08 00' + '00 00 C9 F1 E7 00 86 00 00 00 A4 1A 95 00 08 00' '00 00 00 00 00 00 86 00 00 00 86 00 00 00 08 00' - '00 00 F4 19 95 00 33 3B D4 77 B4 1A 95 00 09 48' - 'E9 77 B8 10 E9 77 FF FF FF FF C9 F1 E7 77 16 EA' + '00 00 F4 19 95 00 33 3B D4 00 B4 1A 95 00 09 48' + 'E9 00 B8 10 E9 00 FF FF FF 00 C9 F1 E7 00 16 EA' '4B 00 28 01 00 00 98 69 38 00 86 00 00 00 58 1A' '95 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' @@ -7704,726 +7901,133 @@ END '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 2E 2E 2E 2E 2E 2E 2E 2E' - '2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E' - '2E 2E 2E 2E 00 00 00 2E 2E 2E 2E 2E 2E 2E 2E 2E' - '2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E' - '2E 2E 2E 2E 2E 00 2E 2E 04 1F 20 1F 1F 1F 1F 1F' - '1F 1F 1F 1F 1F 1F 1F 1E 21 1F 1F 1E 1E 1F 1E 1F' - '1E 1F 06 2E 2E 2E 2E 02 2C 2D 2D 2D 2D 2D 2D 2C' - '2C 2D 2C 2C 2C 2C 28 2C 29 27 27 27 27 27 26 26' - '26 26 27 06 2E 2E 2E 07 2D 2D 2D 2D 2D 2D 2C 2D' - '2C 2A 2D 2C 27 2B 2C 27 2A 27 27 29 27 27 2A 27' - '27 26 26 1E 2E 2E 2E 07 2D 2D 28 19 21 1B 22 21' - '24 24 24 23 24 22 23 24 24 22 23 22 21 21 1A 19' - '23 26 26 1F 2E 2E 2E 1D 2D 2D 19 11 10 11 16 16' - '11 16 13 17 19 16 17 13 16 16 11 16 11 10 0B 10' - '19 26 27 1E 2E 2E 2E 07 2D 2D 21 0E 11 11 11 11' - '11 19 17 19 16 1A 13 16 19 11 16 11 10 11 11 0E' - '13 27 26 1F 2E 2E 2E 07 2D 2D 21 10 11 11 0F 11' - '16 11 11 16 11 16 16 11 16 11 11 11 11 0F 10 0C' - '19 27 26 1E 2E 2E 2E 07 2D 2D 19 10 0B 10 11 16' - '11 11 16 11 16 11 11 16 11 11 11 10 0F 10 11 0A' - '19 26 27 1F 2E 2E 2E 07 2D 2D 21 0A 10 0F 10 0D' - '11 11 0F 11 11 16 11 11 11 11 11 11 0C 0A 0C 0E' - '13 2C 27 1E 2E 2E 2E 07 2D 2D 18 0C 0E 0D 11 10' - '0F 10 11 11 11 11 11 11 11 0E 11 0A 12 18 0F 09' - '16 2A 27 1E 2E 2E 2E 07 2D 2D 21 0A 0C 0E 0A 11' - '11 11 11 16 11 11 11 11 11 11 10 0F 2B 2D 1E 0A' - '13 29 27 1E 2E 2E 2E 07 2D 2D 19 0A 0A 0A 11 11' - '16 11 11 11 16 11 11 16 11 16 11 12 27 26 2A 03' - '16 2C 27 1F 2E 2E 2E 07 2D 2D 19 0A 10 11 11 11' - '11 19 16 11 11 19 11 11 17 11 11 0F 20 2C 1E 0A' - '13 27 27 1E 2E 2E 2E 06 2D 2D 21 0A 11 11 16 11' - '16 16 14 16 19 17 19 16 19 11 16 11 11 0F 11 0A' - '16 2C 2C 1E 2E 2E 2E 07 2D 2D 18 10 11 16 11 17' - '13 16 16 1A 16 19 17 19 16 1A 11 15 12 15 0F 11' - '13 27 2C 1E 2E 2E 2E 06 2D 2D 19 11 11 11 16 13' - '16 19 1A 19 19 1A 19 1A 14 16 16 21 20 1F 25 0E' - '19 2C 2C 1E 2E 2E 2E 07 2D 2D 13 11 11 16 19 17' - '19 17 19 1A 1A 1B 1A 19 1B 1A 16 12 2C 27 1F 11' - '19 2C 2D 1E 2E 2E 2E 06 2D 2D 18 11 16 1A 11 19' - '1A 19 1C 1A 1B 1A 1B 1A 1A 19 17 19 20 2C 21 0E' - '13 2D 2D 1E 2E 2E 2E 06 2D 2D 12 10 11 16 19 17' - '19 1A 19 1C 1A 1C 1A 1B 1A 19 19 16 12 0F 15 0D' - '19 2D 2D 1E 2E 2E 2E 06 2D 2D 2C 26 27 27 27 27' - '27 27 27 27 27 27 27 27 27 27 27 28 27 27 28 26' - '2C 2D 2D 1E 2E 2E 2E 02 2D 2D 2D 2D 2D 2D 2D 2D' - '2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D' - '2D 2D 2D 06 2E 2E 2E 2E 05 26 26 27 26 27 27 26' - '27 26 27 27 26 27 26 27 27 26 27 26 27 26 27 26' - '26 26 1D 2E 2E 2E 2E 2E 2E 2E 01 01 01 2E 01 01' - '01 01 2E 01 01 01 01 2E 01 01 01 01 2E 01 01 01' - '01 2E 2E 2E 2E 00 00 00 2E 2E 2E 2E 2E 2E 2E 2E' - '2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E' - '2E 2E 2E 2E 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF' - 'FF FF C0 00 00 03 80 00 00 01 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 01 C0 00 00 03 FF FF FF FF FF FF' - 'FF FF FF FF FF FF 28 00 00 00 10 00 00 00 20 00' - '00 00 01 00 08 00 00 00 00 00 00 01 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 11 00 00 00 00 11 00 00 00 00 11 00 11 11' - '11 00 33 33 33 00 44 44 44 00 55 55 55 00 7F 7F' - '7F 00 99 33 00 00 CC 33 00 00 99 66 00 00 99 66' - '33 00 CC 66 00 00 CC 66 33 00 CC 66 66 00 CC 99' - '33 00 FF 99 33 00 99 99 66 00 CC 99 66 00 FF 99' - '66 00 FF CC 66 00 99 99 99 00 AA AA AA 00 BB BB' - 'BB 00 CC 99 99 00 FF 99 99 00 CC CC 99 00 FF CC' - '99 00 CC 99 CC 00 99 CC CC 00 CC CC CC 00 DD DD' - 'DD 00 FF CC CC 00 FF FF CC 00 FF CC FF 00 EE EE' - 'EE 00 FF FF FF 00 00 00 00 00 DD DD DD 00 FF CC' - 'CC 00 CC FF CC 00 CC CC FF 00 CC FF FF 00 EE EE' - 'EE 00 FF FF FF 00 00 00 00 00 CC FF FF 00 EE EE' - 'EE 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 C0 17 95 00 00 00 38 00 A8 44' - 'F9 77 13 00 00 00 18 0A 38 00 00 00 38 00 98 69' - '38 00 98 17 95 00 00 00 00 00 E0 19 95 00 F0 88' - 'FA 77 70 38 F5 77 FF FF FF FF A8 44 F9 77 70 7D' - 'F5 77 3A 8A F5 77 86 00 00 00 86 00 00 00 08 00' - '00 00 B0 18 95 00 00 00 00 00 CB 44 F9 77 08 91' - '07 00 CD 8B F5 77 78 13 05 00 37 90 F5 77 00 00' - '00 00 3E 8A F5 77 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00' - '00 00 00 00 00 00 60 00 62 00 00 EC FD 7F 1A 02' - '00 00 4C 16 95 00 10 91 07 00 FC 15 95 00 FF FF' - 'FF FF B4 1A 95 00 45 00 00 00 28 02 00 00 FF FF' - 'FF FF E2 D8 F5 77 7D 9B F5 77 94 B6 01 00 00 00' - '05 00 F4 17 95 00 80 00 10 C0 B4 1A 95 00 F0 88' - 'FA 77 88 1C F5 77 FF FF FF FF 37 90 F5 77 00 00' - '00 00 3E 8A F5 77 9B B2 E7 77 B7 00 00 00 02 00' - '00 00 A4 1A 95 00 01 00 00 00 18 00 00 00 00 00' - '00 00 10 19 95 00 42 00 00 00 00 00 00 00 F4 18' - '95 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00' - '00 00 02 00 00 00 01 01 F5 77 00 EC FD 7F 60 00' - '00 00 00 00 00 00 03 00 00 00 68 00 1A 02 10 91' - '07 00 00 00 00 00 10 91 07 00 05 00 00 00 BE B3' - 'E7 77 4C 19 95 00 A3 B4 E7 77 28 01 00 00 00 00' - '00 C0 00 00 00 00 00 00 00 00 02 00 00 00 80 00' - '00 00 00 00 00 00 8C 1A 95 00 7F E9 4B 00 D0 60' - '38 00 00 00 00 C0 00 00 00 00 80 1A 95 00 02 00' - '00 00 80 00 00 00 00 00 00 00 C0 27 95 00 C4 F5' - 'AF 00 02 00 00 00 45 3A 5C 63 79 67 77 69 6E 5C' - '68 6F 6D 65 5C 63 76 73 5C 77 69 6E 65 5C 64 6C' - '6C 73 5C 73 68 65 6C 6C 33 32 5C 64 65 73 6B 74' - '6F 70 2E 69 63 6F 00 1A 95 00 1F 3B D4 77 13 00' - '00 00 98 00 00 00 4F 3B D4 77 E0 19 95 00 33 3B' - 'D4 77 64 C5 F5 77 A9 F1 E7 77 28 01 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 1A 95 00 98 69' - '38 00 86 00 00 00 00 00 00 00 C9 F1 E7 77 86 00' - '00 00 A4 1A 95 00 08 00 00 00 00 00 00 00 86 00' - '00 00 86 00 00 00 08 00 00 00 F4 19 95 00 33 3B' - 'D4 77 B4 1A 95 00 09 48 E9 77 B8 10 E9 77 FF FF' - 'FF FF C9 F1 E7 77 16 EA 4B 00 28 01 00 00 98 69' - '38 00 86 00 00 00 58 1A 95 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 26 26' - '26 26 26 26 26 26 26 26 02 26 26 26 26 26 26 16' - '1F 1F 18 18 18 18 17 18 17 17 17 17 07 26 06 25' - '25 23 22 24 22 24 20 21 20 20 20 20 17 01 06 25' - '13 10 0E 14 13 13 14 13 10 0E 0E 19 18 03 06 25' - '13 09 10 0E 10 0E 10 0E 0E 0E 0B 1C 17 26 06 25' - '0F 0D 0C 0E 0E 10 0E 0E 0E 0B 0A 19 1E 26 06 25' - '0C 0D 0A 0E 0E 0D 0E 0E 0E 17 0C 19 18 26 06 25' - '0E 09 10 0E 0E 0F 10 0E 0C 20 0F 19 1F 26 06 25' - '0F 0E 0E 10 13 11 13 10 0E 0C 0C 1B 1D 02 05 25' - '13 0E 10 13 14 13 11 13 0F 1F 12 1A 18 26 06 25' - '0E 0E 10 14 10 15 13 11 13 17 0E 1B 1F 26 05 25' - '18 1B 21 1B 20 21 21 20 1C 18 1B 24 20 26 04 17' - '24 24 20 24 24 20 24 20 24 24 20 24 07 26 26 26' - '04 26 04 04 26 04 26 04 04 26 04 26 26 26 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 FF FF 00 00 28 00' - '00 00 30 00 00 00 60 00 00 00 01 00 20 00 00 00' - '00 00 00 24 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 17 00 00 00 32 00 00' - '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' - '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' - '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' - '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' - '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' - '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' - '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' - '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' - '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' - '00 28 00 00 00 0C 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 19 00 00 00 75 00 00 00 C8 00 00 00 F4 00 00' - '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' - '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' - '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' - '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' - '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' - '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' - '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' - '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' - '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F6 00 00' - '00 D6 00 00 00 90 00 00 00 3F 00 00 00 08 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 1E 00 00' - '00 C7 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 E3 00 00 00 4A 00 00' - '00 06 00 00 00 00 00 00 00 04 00 00 00 B0 00 00' - '00 FF 05 05 05 FF 47 47 47 FF 83 83 83 FF 90 90' - '90 FF 8E 8E 8E FF 8E 8E 8E FF 8E 8E 8E FF 8D 8D' - '8D FF 8D 8D 8D FF 8D 8D 8D FF 8D 8D 8D FF 8C 8C' - '8C FF 8C 8C 8C FF 8C 8C 8C FF 8B 8B 8B FF 8B 8B' - '8B FF 8B 8B 8B FF 8B 8B 8B FF 8B 8B 8B FF 8A 8A' - '8A FF 8A 8A 8A FF 8A 8A 8A FF 89 89 89 FF 89 89' - '89 FF 89 89 89 FF 89 89 89 FF 89 89 89 FF 88 88' - '88 FF 88 88 88 FF 88 88 88 FF 87 87 87 FF 87 87' - '87 FF 87 87 87 FF 87 87 87 FF 87 87 87 FF 87 87' - '87 FF 86 86 86 FF 88 88 88 FF 83 83 83 FF 53 53' - '53 FF 0B 0B 0B FF 00 00 00 FF 00 00 00 D5 00 00' - '00 34 00 00 00 01 00 00 00 52 00 00 00 FF 06 06' - '06 FF 8B 8B 8B FF FB FB FB FF FF FF FF FF FE FE' - 'FE FF FC FC FC FF FA FA FA FF F9 F9 F9 FF F8 F8' - 'F8 FF F6 F6 F6 FF F5 F5 F5 FF F4 F4 F4 FF F2 F2' - 'F2 FF F1 F1 F1 FF F0 F0 F0 FF EE EE EE FF ED ED' - 'ED FF EB EB EB FF EA EA EA FF E9 E9 E9 FF E7 E7' - 'E7 FF E5 E5 E5 FF E5 E5 E5 FF E3 E3 E3 FF E1 E1' - 'E1 FF E0 E0 E0 FF DF DF DF FF DD DD DD FF DC DC' - 'DC FF DB DB DB FF D9 D9 D9 FF D8 D8 D8 FF D6 D6' - 'D6 FF D5 D5 D5 FF D3 D3 D3 FF D2 D2 D2 FF D1 D1' - 'D1 FF CF CF CF FF CD CD CD FF D1 D1 D1 FF EA EA' - 'EA FF 98 98 98 FF 0C 0C 0C FF 00 00 00 FF 00 00' - '00 8D 00 00 00 0A 00 00 00 C3 00 00 00 FF 49 49' - '49 FF FA FA FA FF FE FE FE FF F7 F7 F7 FF F7 F7' - 'F7 FF F5 F5 F5 FF F3 F3 F3 FF F2 F2 F2 FF F0 F0' - 'F0 FF EF EF EF FF EE EE EE FF EC EC EC FF EA EA' - 'EA FF E9 E9 E9 FF E8 E8 E8 FF E6 E6 E6 FF E5 E5' - 'E5 FF E3 E3 E3 FF E2 E2 E2 FF E1 E1 E1 FF DF DF' - 'DF FF DD DD DD FF DC DC DC FF DA DA DA FF D9 D9' - 'D9 FF D8 D8 D8 FF D6 D6 D6 FF D4 D4 D4 FF D3 D3' - 'D3 FF D2 D2 D2 FF D0 D0 D0 FF CF CF CF FF CD CD' - 'CD FF CC CC CC FF CB CB CB FF C9 C9 C9 FF C7 C7' - 'C7 FF C6 C6 C6 FF C5 C5 C5 FF C2 C2 C2 FF C2 C2' - 'C2 FF E6 E6 E6 FF 73 73 73 FF 00 00 00 FF 00 00' - '00 D4 00 00 00 27 00 00 00 F3 00 00 00 FF 84 84' - '84 FF FF FF FF FF FA FA FA FF F8 F8 F8 FF F7 F7' - 'F7 FF F6 F6 F7 FF F4 F5 F5 FF F3 F4 F4 FF F1 F2' - 'F3 FF EF F0 F1 FF EE EF F0 FF ED ED EE FF EA EB' - 'EC FF E9 EA EB FF E8 E8 E9 FF E6 E7 E7 FF E5 E6' - 'E6 FF E3 E4 E5 FF E1 E2 E3 FF E0 E1 E1 FF DF DF' - 'E0 FF DD DE DE FF DC DC DD FF DA DB DB FF D8 D9' - 'DA FF D7 D8 D9 FF D6 D6 D7 FF D4 D4 D5 FF D3 D3' - 'D4 FF D1 D2 D2 FF CF D0 D1 FF CE CF CF FF CD CD' - 'CE FF CB CC CC FF CA CB CB FF C8 C9 CA FF C6 C7' - 'C8 FF C5 C6 C7 FF C4 C4 C4 FF C5 C4 C4 FF C1 C1' - 'C1 FF D7 D7 D7 FF AD AD AD FF 00 00 00 FF 00 00' - '00 F9 00 00 00 38 00 00 00 F0 00 00 00 FF 8F 8F' - '8F FF FF FF FF FF FC FC FC FF FA FA FA FF FB FB' - 'FB FF FC FC FD FF FB FC FC FF FB FB FB FF FA FA' - 'FA FF F9 FA FA FF F9 F9 FA FF F8 F8 F9 FF F7 F8' - 'F8 FF F7 F7 F7 FF F6 F6 F6 FF F5 F5 F6 FF F4 F5' - 'F5 FF F4 F5 F5 FF F3 F4 F4 FF F3 F3 F3 FF F2 F2' - 'F3 FF F2 F2 F2 FF F1 F1 F2 FF F0 F1 F1 FF EF F0' - 'F0 FF EF EF F0 FF EE EF EF FF ED EE EE FF ED ED' - 'EE FF EC ED ED FF EB EC EC FF EB EB EC FF EA EB' - 'EB FF E9 EA EA FF E9 EA EA FF E8 E9 E9 FF E7 E8' - 'E8 FF E8 E8 E8 FF DE DE DE FF C6 C6 C6 FF C4 C4' - 'C4 FF D0 D0 D0 FF AD AD AD FF 00 00 00 FF 00 00' - '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 8D 8D' - '8D FF FF FF FF FF FE FE FE FF FC FC FD FF E3 E1' - 'DF FF D3 99 70 FF D6 93 65 FF D9 99 6B FF DB 9D' - '6E FF DD A1 72 FF E0 A4 76 FF E1 A8 79 FF E4 AC' - '7D FF E6 AF 80 FF E8 B2 83 FF EA B4 85 FF EB B7' - '87 FF EC B9 89 FF ED BA 8B FF EE BB 8B FF EE BB' - '8B FF EE BB 8B FF ED BA 8B FF ED B9 89 FF EB B7' - '87 FF EA B5 86 FF E9 B2 83 FF E6 AF 81 FF E5 AC' - '7E FF E3 A9 7A FF E1 A5 76 FF DF A2 74 FF DD 9E' - '70 FF DB 9A 6C FF D8 97 69 FF D6 93 65 FF D3 8E' - '60 FF D3 8F 62 FF E6 D7 CD FF C9 CC CD FF C5 C5' - 'C5 FF D2 D2 D2 FF AA AA AA FF 00 00 00 FF 00 00' - '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 8B 8B' - '8B FF FF FF FF FF FF FF FF FF FD FF FF FF D8 D3' - 'D1 FF BE 67 2C FF C1 5F 1B FF C5 67 25 FF C8 6C' - '29 FF CB 72 2F FF CE 77 34 FF D0 7C 38 FF D3 80' - '3D FF D6 85 41 FF D9 89 44 FF DB 8C 47 FF DD 8F' - '4B FF DE 91 4C FF DF 93 4E FF E0 95 50 FF E0 95' - '50 FF E0 94 50 FF DF 93 4E FF DE 91 4D FF DC 8F' - '49 FF DB 8B 47 FF D8 88 43 FF D5 84 40 FF D3 7F' - '3C FF D0 7B 37 FF CD 75 32 FF CA 70 2D FF C7 6C' - '29 FF C4 66 23 FF C0 60 1E FF BC 5B 1A FF B9 53' - '11 FF B9 54 13 FF DF C8 B9 FF CC CF D2 FF C6 C6' - 'C6 FF D3 D3 D3 FF AB AB AB FF 00 00 00 FF 00 00' - '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 8B 8B' - '8B FF FF FF FF FF FF FF FF FF FE FF FF FF DA D5' - 'D3 FF BE 6A 32 FF C1 62 21 FF C5 6A 2B FF C7 6F' - '2F FF CA 74 34 FF CD 78 38 FF CF 7D 3C FF D2 81' - '40 FF D5 84 43 FF D7 88 47 FF D8 8B 4A FF DA 8E' - '4C FF DC 90 4E FF DD 92 50 FF DD 92 51 FF DD 92' - '51 FF DD 92 50 FF DD 91 4F FF DB 8F 4E FF DA 8D' - '4B FF D9 8A 49 FF D6 87 46 FF D4 83 42 FF D2 80' - '3F FF CF 7C 3B FF CC 77 37 FF CA 73 32 FF C7 6E' - '2E FF C3 68 29 FF C1 64 24 FF BD 5F 20 FF B9 57' - '18 FF BA 57 1A FF E0 C9 BB FF CD D1 D3 FF C7 C7' - 'C7 FF D5 D5 D5 FF AA AA AA FF 00 00 00 FF 00 00' - '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 8A 8A' - '8A FF FF FF FF FF FF FF FF FF FF FF FF FF DA D6' - 'D3 FF BC 68 30 FF BF 5F 1E FF C3 66 27 FF C5 6B' - '2C FF C8 70 30 FF CB 74 34 FF CD 78 38 FF D0 7C' - '3B FF D2 80 3F FF D4 83 42 FF D6 85 44 FF D7 88' - '47 FF D8 8A 48 FF D9 8B 4A FF DA 8C 4B FF DA 8C' - '4B FF D9 8C 4B FF D9 8B 4A FF D8 8A 48 FF D6 87' - '46 FF D5 85 44 FF D4 82 41 FF D1 7E 3E FF D0 7B' - '3B FF CD 77 37 FF CA 73 33 FF C8 6E 2F FF C5 6A' - '2B FF C2 65 26 FF BF 60 21 FF BC 5B 1C FF B7 53' - '15 FF B8 55 18 FF E0 C9 BB FF CE D2 D4 FF C9 C9' - 'C9 FF D6 D6 D6 FF AA AA AA FF 00 00 00 FF 00 00' - '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 8A 8A' - '8A FF FF FF FF FF FF FF FF FF FF FF FF FF DA D6' - 'D3 FF BA 65 2D FF BD 5B 1B FF C0 63 24 FF C2 67' - '28 FF C5 6C 2C FF C8 70 30 FF CA 73 34 FF CD 77' - '37 FF CF 7B 3A FF D1 7D 3D FF D2 80 3F FF D4 83' - '42 FF D5 84 43 FF D6 86 45 FF D6 86 45 FF D6 86' - '45 FF D6 86 45 FF D5 85 44 FF D5 84 43 FF D3 82' - '41 FF D2 80 3F FF D1 7D 3C FF CF 7A 39 FF CD 76' - '36 FF CA 73 33 FF C7 6F 2F FF C5 6A 2B FF C2 66' - '27 FF BF 61 22 FF BC 5D 1E FF B9 58 19 FF B5 50' - '12 FF B6 52 15 FF E0 C9 BB FF D0 D4 D6 FF CB CB' - 'CB FF D7 D7 D7 FF A9 A9 A9 FF 00 00 00 FF 00 00' - '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 89 89' - '89 FF FF FF FF FF FF FF FF FF FF FF FF FF DA D6' - 'D3 FF B8 62 2A FF BA 57 17 FF BE 5E 20 FF C0 63' - '24 FF C3 67 28 FF C6 6B 2C FF C8 6F 2F FF CA 72' - '32 FF CC 76 35 FF CD 78 38 FF CF 7B 3A FF D0 7D' - '3C FF D1 7E 3D FF D2 80 3F FF D2 80 3F FF D2 80' - '3F FF D2 80 3F FF D2 7F 3E FF D1 7E 3E FF CF 7C' - '3C FF CE 7A 3A FF CD 77 37 FF CB 74 34 FF CA 71' - '32 FF C7 6E 2E FF C5 6A 2B FF C3 66 27 FF C0 62' - '23 FF BD 5D 1F FF BB 59 1A FF B7 54 16 FF B3 4D' - '0F FF B5 4E 11 FF E0 C9 BA FF D1 D5 D7 FF CC CC' - 'CC FF D8 D8 D8 FF A8 A8 A8 FF 00 00 00 FF 00 00' - '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 88 88' - '88 FF FF FF FF FF FF FF FF FF FF FF FF FF DA D5' - 'D3 FF B6 5E 27 FF B7 53 13 FF BB 5A 1C FF BD 5F' - '20 FF C0 63 24 FF C3 66 27 FF C5 6A 2A FF C7 6D' - '2E FF C9 71 31 FF CA 73 33 FF CC 75 35 FF CD 77' - '37 FF CE 79 38 FF CF 7A 3A FF CF 7B 3A FF CF 7B' - '3A FF CF 7A 3A FF CE 7A 39 FF CE 78 38 FF CC 77' - '36 FF CB 75 35 FF CA 72 32 FF C8 6F 2F FF C7 6D' - '2E FF C4 69 2A FF C2 65 26 FF C0 62 23 FF BD 5E' - '1F FF BA 59 1B FF B8 55 17 FF B5 51 13 FF B1 4A' - '0B FF B2 4B 0E FF E0 C8 BA FF D2 D6 D8 FF CD CD' - 'CD FF D9 D9 D9 FF A7 A7 A7 FF 00 00 00 FF 00 00' - '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 87 87' - '87 FF FF FF FF FF FF FF FF FF FF FF FF FF D8 D4' - 'D1 FF B4 5A 23 FF B5 4E 0F FF B9 56 18 FF BB 5A' - '1B FF BD 5E 1F FF C0 62 23 FF C2 65 25 FF C3 68' - '29 FF C6 6B 2C FF C7 6D 2E FF C8 70 30 FF C9 71' - '31 FF CA 73 32 FF CB 74 34 FF CB 75 34 FF CB 75' - '34 FF CB 74 34 FF CB 74 33 FF CA 72 32 FF C9 71' - '31 FF C8 6F 2F FF C6 6D 2D FF C5 6A 2A FF C3 67' - '28 FF C1 64 25 FF BE 60 22 FF BD 5D 1E FF BA 59' - '1A FF B8 55 17 FF B6 51 13 FF B3 4C 0F FF AF 46' - '07 FF AF 47 0A FF DF C7 BA FF D4 D8 DB FF CF CF' - 'CF FF DB DB DB FF A6 A6 A6 FF 00 00 00 FF 00 00' - '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 86 86' - '86 FF FF FF FF FF FF FF FF FF FF FF FF FF D6 D1' - 'CE FF B1 55 1E FF B2 4A 0B FF B6 51 13 FF B7 54' - '16 FF BA 59 1A FF BC 5D 1E FF BE 60 20 FF BF 62' - '23 FF C2 65 26 FF C3 67 28 FF C4 69 2A FF C5 6B' - '2B FF C6 6C 2C FF C7 6D 2E FF C7 6E 2E FF C7 6E' - '2E FF C7 6E 2E FF C6 6D 2E FF C6 6C 2C FF C5 6A' - '2B FF C4 69 29 FF C3 67 28 FF C1 64 25 FF BF 62' - '23 FF BE 5F 20 FF BC 5C 1D FF BC 58 19 FF BD 54' - '12 FF BA 4F 0D FF B7 4C 0C FF B0 48 0A FF AC 41' - '03 FF AD 43 07 FF DF C7 BA FF D6 DA DC FF D0 D0' - 'D0 FF DC DC DC FF A5 A5 A5 FF 00 00 00 FF 00 00' - '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 85 85' - '85 FF FF FF FF FF FF FF FF FF FF FF FF FF D4 CF' - 'CC FF AE 51 1A FF B0 45 06 FF B3 4D 0F FF B4 50' - '12 FF B7 54 16 FF B9 58 19 FF BB 5A 1C FF BC 5D' - '1F FF BE 60 21 FF BF 62 23 FF C0 63 24 FF C1 65' - '25 FF C3 66 26 FF C3 68 28 FF C3 68 29 FF C3 68' - '29 FF C3 68 29 FF C3 67 28 FF C3 66 27 FF C1 65' - '25 FF C0 63 23 FF BF 61 22 FF BD 5E 1F FF BC 5D' - '1E FF BA 5A 1B FF BB 56 17 FF A5 46 0C FF 7D 43' - '1F FF 77 46 27 FF 8D 3B 0B FF AE 41 02 FF AB 3E' - '00 FF AC 42 06 FF E0 C8 BA FF D7 DB DD FF D2 D2' - 'D2 FF DD DD DD FF A3 A3 A3 FF 00 00 00 FF 00 00' - '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 84 84' - '84 FF FF FF FF FF FF FF FF FF FF FF FF FF D1 CD' - 'CA FF AB 4D 16 FF AC 40 01 FF B0 48 0B FF B2 4C' - '0E FF B4 4F 11 FF B6 52 14 FF B7 54 16 FF B8 57' - '18 FF BA 58 1A FF BD 5D 1E FF C0 63 24 FF C3 67' - '27 FF C4 69 29 FF C5 6B 2B FF C5 6B 2C FF C6 6C' - '2C FF C6 6C 2C FF C5 6B 2C FF C5 6B 2B FF C4 69' - '29 FF C2 67 28 FF C1 64 25 FF BE 5F 20 FF BA 59' - '1A FF BA 53 13 FF 97 45 12 FF 9B 8E 85 FF C5 CB' - 'CF FF D3 DB E0 FF AC AD AD FF 83 44 21 FF A9 38' - '00 FF AC 42 06 FF E0 C8 BB FF D8 DC DE FF D3 D3' - 'D3 FF DF DF DF FF A3 A3 A3 FF 00 00 00 FF 00 00' - '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 83 83' - '83 FF FF FF FF FF FF FF FF FF FF FF FF FF CF CA' - 'C7 FF A8 4A 14 FF A9 3C 00 FF AD 43 06 FF B0 47' - '09 FF B1 4A 0B FF B2 4B 0E FF B4 4F 11 FF B8 56' - '18 FF BF 62 22 FF C4 6A 2A FF C7 6E 2E FF C8 70' - '2F FF C9 70 30 FF CA 72 32 FF CA 72 32 FF CA 72' - '32 FF CA 72 32 FF CA 72 32 FF C9 71 31 FF C9 70' - '30 FF C8 6F 2F FF C7 6E 2E FF C5 6B 2C FF C3 67' - '28 FF C0 5B 18 FF 8D 5B 3C FF EA F2 F7 FF F6 F5' - 'F6 FF E6 E5 E4 FF CD D2 D4 FF 6C 64 5E FF 91 2D' - '00 FF AF 43 06 FF E1 C9 BB FF D9 DD E0 FF D4 D4' - 'D4 FF E0 E0 E0 FF A2 A2 A2 FF 00 00 00 FF 00 00' - '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 82 82' - '82 FF FF FF FF FF FF FF FF FF FF FF FF FF CD C8' - 'C5 FF A8 4A 13 FF A9 3B 00 FF AA 3E 02 FF AA 3F' - '02 FF AD 44 07 FF B9 57 18 FF C1 64 24 FF C6 6C' - '2C FF C9 70 30 FF C9 72 32 FF CA 74 34 FF CC 75' - '35 FF CC 76 36 FF CD 78 37 FF CD 78 38 FF CE 79' - '38 FF CE 79 38 FF CD 78 38 FF CD 77 37 FF CC 76' - '36 FF CB 75 35 FF CA 73 33 FF C9 71 31 FF C8 6F' - '30 FF C3 66 24 FF 8C 6B 54 FF DC E2 E6 FF D1 CE' - 'CC FF B1 A5 9F FF E0 E2 E4 FF 7C 7E 80 FF 74 25' - '00 FF B2 44 05 FF E1 C9 BB FF DB DF E1 FF D5 D5' - 'D5 FF E1 E1 E1 FF A1 A1 A1 FF 00 00 00 FF 00 00' - '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 81 81' - '81 FF FF FF FF FF FF FF FF FF FF FF FF FF CB C6' - 'C3 FF A8 49 13 FF A9 3B 00 FF A8 3C 00 FF AE 46' - '09 FF BC 5C 1E FF C7 6E 2E FF C9 70 30 FF CA 72' - '32 FF CB 75 35 FF CD 77 37 FF CE 7A 3A FF CF 7B' - '3B FF D0 7D 3C FF D1 7E 3E FF D1 7F 3E FF D2 7F' - '3E FF D2 7F 3E FF D1 7E 3E FF D1 7E 3D FF D0 7C' - '3C FF CF 7B 3B FF CE 79 39 FF CC 77 36 FF CC 75' - '34 FF CB 6F 2C FF 89 60 42 FF CA D0 D5 FF F2 F2' - 'F2 FF F2 F1 F0 FF FF FF FF FF 7C 72 6D FF 89 29' - '00 FF AF 43 06 FF E2 CA BC FF DD E1 E3 FF D7 D7' - 'D7 FF E2 E2 E2 FF A0 A0 A0 FF 00 00 00 FF 00 00' - '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 80 80' - '80 FF FF FF FF FF FF FF FF FF FF FF FF FF C9 C4' - 'C1 FF A7 48 13 FF A7 39 00 FF B0 49 0B FF C3 68' - '28 FF C7 6F 2F FF C9 71 31 FF CA 74 34 FF CC 77' - '37 FF CE 7A 3A FF D0 7C 3C FF D1 7F 3E FF D2 81' - '40 FF D4 82 41 FF D5 84 43 FF D5 85 44 FF D5 85' - '44 FF D5 85 44 FF D5 84 43 FF D4 84 43 FF D3 82' - '41 FF D2 81 40 FF D1 7F 3E FF CF 7C 3B FF CE 7A' - '39 FF D1 79 37 FF A6 5D 27 FF 6A 65 62 FF E0 E6' - 'EB FF F5 FA FE FF A6 AE B3 FF 79 3C 18 FF AC 39' - '00 FF AC 42 06 FF E2 CA BC FF DE E2 E4 FF D8 D8' - 'D8 FF E4 E4 E4 FF 9E 9E 9E FF 00 00 00 FF 00 00' - '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 7E 7E' - '7E FF FF FF FF FF FF FF FF FF FF FF FF FF C7 C2' - 'C0 FF A5 46 11 FF AE 42 05 FF C2 67 27 FF C7 6E' - '2F FF C9 71 31 FF CB 75 35 FF CD 78 38 FF D0 7C' - '3B FF D2 7F 3F FF D3 82 41 FF D4 84 43 FF D6 86' - '46 FF D7 88 47 FF D8 89 48 FF D8 8A 49 FF D8 8B' - '49 FF D8 8B 49 FF D8 8A 49 FF D8 89 48 FF D6 87' - '47 FF D5 86 45 FF D4 84 43 FF D2 81 3F FF D1 7F' - '3D FF CF 7B 3B FF D2 79 37 FF 9C 56 23 FF 7A 59' - '40 FF 81 63 4D FF 74 41 1E FF B8 5B 1D FF B2 48' - '09 FF AB 41 04 FF E2 CA BC FF DF E3 E5 FF DA DA' - 'DA FF E5 E5 E5 FF 9E 9E 9E FF 00 00 00 FF 00 00' - '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 7D 7D' - '7D FF FF FF FF FF FF FF FF FF FF FF FF FF C5 BF' - 'BD FF A7 48 12 FF BE 5D 1C FF C8 6F 2F FF C9 71' - '31 FF CC 75 35 FF CF 79 39 FF D0 7D 3D FF D3 81' - '40 FF D5 84 43 FF D7 87 46 FF D8 8A 49 FF DA 8C' - '4B FF DB 8E 4C FF DC 90 4E FF DC 91 4F FF DC 91' - '4F FF DC 91 4F FF DC 91 4F FF DB 8F 4D FF DA 8E' - '4C FF D9 8C 4A FF D8 89 48 FF D6 86 45 FF D5 83' - '42 FF D3 81 40 FF CF 7A 38 FF D0 76 32 FF C5 6A' - '26 FF BD 61 1E FF C8 66 22 FF C8 68 27 FF BE 5D' - '1E FF AC 43 07 FF E2 CA BC FF E0 E5 E7 FF DC DC' - 'DC FF E6 E6 E6 FF 9D 9D 9D FF 00 00 00 FF 00 00' - '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 7B 7B' - '7B FF FF FF FF FF FF FF FF FF FF FF FF FF C1 BC' - 'B9 FF B2 5B 24 FF C7 6C 2A FF C9 70 31 FF CB 75' - '35 FF CE 79 39 FF D1 7E 3D FF D2 82 41 FF D5 85' - '44 FF D8 89 48 FF DA 8C 4B FF DC 8F 4D FF DD 92' - '50 FF DE 94 52 FF DF 96 54 FF E0 97 55 FF E0 97' - '55 FF E0 97 55 FF E0 97 54 FF DF 95 53 FF DE 94' - '52 FF DD 91 50 FF DA 8E 4D FF D9 8B 4A FF D8 88' - '47 FF D6 83 40 FF B2 7D 53 FF 96 7C 69 FF A3 86' - '70 FF AD 8E 79 FF 9A 8A 71 FF 8D 62 37 FF C3 63' - '22 FF B7 54 16 FF E2 CA BC FF E3 E6 E8 FF DD DD' - 'DD FF E7 E7 E7 FF 9B 9B 9B FF 00 00 00 FF 00 00' - '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 7A 7A' - '7A FF FF FF FF FF FF FF FF FF FF FF FF FF C0 BA' - 'B8 FF B8 64 2D FF C9 6E 2D FF CA 74 33 FF CD 78' - '38 FF D0 7D 3C FF D3 81 40 FF D5 85 44 FF D8 89' - '48 FF DB 8D 4C FF DD 91 4F FF DF 94 52 FF E0 97' - '55 FF E1 99 57 FF E2 9B 58 FF E3 9C 5A FF E4 9D' - '5A FF E4 9D 5A FF E3 9C 5A FF E2 9B 59 FF E1 99' - '57 FF E0 96 55 FF DE 93 51 FF DC 90 4E FF DB 8D' - '4B FF D2 80 3C FF B2 96 7F FF 96 9F A6 FF A4 A8' - 'AB FF 86 8A 8E FF A9 B9 BC FF 86 78 65 FF B9 5C' - '1C FF C1 61 23 FF E3 CB BD FF E2 E6 E8 FF DE DE' - 'DE FF E8 E8 E8 FF 9A 9A 9A FF 00 00 00 FF 00 00' - '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 78 78' - '78 FF FF FF FF FF FF FF FF FF FF FF FF FF BE B8' - 'B6 FF BA 68 30 FF CB 71 2F FF CD 76 36 FF CF 7B' - '3B FF D2 80 3F FF D5 85 44 FF D7 89 48 FF DA 8E' - '4C FF DD 92 50 FF DF 96 54 FF E1 99 57 FF E3 9C' - '5A FF E5 9E 5C FF E6 A1 5E FF E7 A2 60 FF E7 A3' - '60 FF E7 A3 60 FF E7 A2 5F FF E6 A1 5E FF E4 9E' - '5B FF E3 9C 59 FF E1 98 56 FF DE 95 53 FF DD 92' - '4F FF D5 85 41 FF A9 8A 71 FF C4 C9 CD FF DC DC' - 'DC FF D7 D7 D7 FF C5 C8 CC FF 90 75 64 FF BB 5F' - '1E FF C5 67 29 FF E7 D0 C2 FF EA EE F0 FF E5 E5' - 'E5 FF EB EB EB FF 99 99 99 FF 00 00 00 FF 00 00' - '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 78 78' - '78 FF FF FF FF FF FF FF FF FF FF FF FF FF BA B5' - 'B2 FF B9 67 2F FF CD 74 32 FF CE 79 39 FF D1 7E' - '3E FF D4 83 42 FF D7 88 47 FF DA 8D 4B FF DD 91' - '4F FF E0 96 54 FF E1 9A 57 FF E4 9D 5B FF E6 A1' - '5E FF E8 A4 61 FF E9 A6 63 FF EA A8 65 FF EB A9' - '65 FF EB A9 65 FF EA A7 64 FF E9 A6 63 FF E7 A4' - '60 FF E6 A0 5E FF E4 9D 5A FF E1 99 57 FF DF 94' - '53 FF DF 8F 48 FF AF 89 69 FF C7 CC D0 FF D6 D6' - 'D6 FF D3 D3 D3 FF C8 CD D2 FF A0 7B 5F FF C6 68' - '24 FF C1 65 26 FF E9 D2 C4 FF F7 FB FD FF F4 F4' - 'F4 FF F6 F6 F6 FF 98 98 98 FF 00 00 00 FF 00 00' - '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 76 76' - '76 FF FF FF FF FF FF FF FF FF FF FF FF FF B8 B2' - 'B0 FF B3 5C 25 FF CE 77 35 FF CF 7B 3B FF D2 80' - '40 FF D5 85 44 FF D9 8A 49 FF DB 8F 4D FF DF 95' - '53 FF E2 99 57 FF E3 9E 5B FF E6 A2 5F FF E9 A6' - '63 FF EB A9 65 FF ED AC 68 FF EE AE 6A FF EF AF' - '6B FF EF AF 6B FF EE AD 6A FF ED AB 68 FF EB A8' - '66 FF E8 A5 62 FF E6 A1 5E FF E3 9D 5A FF E1 98' - '56 FF E2 94 4E FF B4 87 5F FF D1 D5 D8 FF E2 E3' - 'E4 FF E0 E1 E2 FF CE D3 D8 FF AA 79 55 FF CD 6F' - '2A FF B9 58 1A FF E8 CF C2 FF F9 FD FF FF F7 F7' - 'F7 FF F8 F8 F8 FF 97 97 97 FF 00 00 00 FF 00 00' - '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 75 75' - '75 FF FF FF FF FF FF FF FF FF FF FF FF FF B7 B1' - 'AF FF A5 47 10 FF C7 6A 28 FF D2 7F 3E FF D3 83' - '42 FF D7 88 47 FF DA 8D 4C FF DD 92 50 FF E0 98' - '56 FF E4 9C 5A FF E6 A1 5F FF E9 A6 63 FF EC AB' - '67 FF EE AE 6B FF F0 B1 6E FF F2 B4 71 FF F3 B5' - '72 FF F3 B5 71 FF F2 B4 70 FF F0 B1 6E FF ED AD' - '6A FF EB A9 66 FF E8 A5 62 FF E5 A0 5E FF E3 9B' - '59 FF E5 97 54 FF B9 81 50 FF A1 9D 9B FF BD BC' - 'BA FF BD BC BA FF A3 A1 A0 FF AD 70 42 FF C9 69' - '26 FF AD 43 06 FF E9 D0 C3 FF FB FE FF FF F8 F8' - 'F8 FF F9 F9 F9 FF 95 95 95 FF 00 00 00 FF 00 00' - '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 74 74' - '74 FF FF FF FF FF FF FF FF FF FF FF FF FF B2 AD' - 'AB FF 9C 3C 06 FF AE 45 06 FF CF 79 35 FF D6 7F' - '3A FF D9 85 3F FF DC 8A 44 FF DF 90 4A FF E3 96' - '4F FF E7 9C 54 FF EA A1 5A FF ED A7 5F FF F1 AC' - '64 FF F3 B1 68 FF F6 B5 6D FF F8 B9 70 FF FA BB' - '72 FF F9 BA 72 FF F8 B8 6F FF F5 B5 6C FF F2 AF' - '68 FF F0 AA 63 FF ED A6 5D FF E9 A0 58 FF E6 9A' - '53 FF E3 95 4E FF DE 8E 48 FF C2 79 3B FF B7 70' - '36 FF B4 6B 31 FF B6 69 2C FF C9 71 2F FF B1 4C' - '0D FF A5 39 00 FF E9 D1 C3 FF FC FF FF FF FA FA' - 'FA FF FB FB FB FF 94 94 94 FF 00 00 00 FF 00 00' - '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 73 73' - '73 FF FF FF FF FF FF FF FF FF FF FF FF FF C4 C3' - 'C2 FF AE 93 84 FF B1 93 83 FF C2 A0 86 FF CE A5' - '83 FF CE A7 87 FF D0 AA 89 FF D2 AD 8C FF D3 B0' - '8E FF D5 B2 91 FF D7 B5 93 FF D8 B8 96 FF DA BA' - '98 FF DB BC 9B FF DD BF 9D FF DE C1 9F FF DE C2' - 'A0 FF DE C2 A0 FF DE C0 9E FF DC BE 9C FF DB BC' - '9A FF DA B9 98 FF D8 B7 95 FF D6 B4 92 FF D4 B2' - '90 FF D2 AF 8E FF D2 AC 8B FF D3 AA 88 FF D2 A8' - '85 FF D0 A5 82 FF CE A2 7F FF C1 9E 84 FF B0 92' - '82 FF B2 94 83 FF EC E5 E1 FF FD FE FE FF FC FC' - 'FC FF FC FC FC FF 94 94 94 FF 00 00 00 FF 00 00' - '00 F7 00 00 00 37 00 00 00 F4 00 00 00 FF 72 72' - '72 FF FF FF FF FF FF FF FF FF FF FF FF FF FE FE' - 'FE FF FD FF FF FF FD FF FF FF FA FF FF FF F9 FF' - 'FF FF F9 FE FF FF F9 FE FF FF F9 FE FF FF F8 FD' - 'FF FF F8 FD FF FF F8 FD FF FF F8 FC FF FF F7 FC' - 'FF FF F7 FC FF FF F7 FB FF FF F7 FB FF FF F7 FB' - 'FF FF F7 FB FF FF F7 FB FF FF F7 FB FF FF F7 FC' - 'FF FF F7 FC FF FF F8 FC FF FF F7 FC FF FF F7 FC' - 'FF FF F7 FC FF FF F8 FD FF FF F7 FD FF FF F7 FD' - 'FF FF F7 FD FF FF F7 FD FF FF F8 FD FF FF FA FF' - 'FF FF FA FF FF FF FC FD FD FF FB FB FB FF FD FD' - 'FD FF FB FB FB FF 93 93 93 FF 00 00 00 FF 00 00' - '00 FA 00 00 00 37 00 00 00 DD 00 00 00 FF 4B 4B' - '4B FF F5 F5 F5 FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FE FE FE FF FE FE FE FF FD FD FD FF FF FF' - 'FF FF F0 F0 F0 FF 6D 6D 6D FF 00 00 00 FF 00 00' - '00 E7 00 00 00 27 00 00 00 7A 00 00 00 FF 0E 0E' - '0E FF 9A 9A 9A FF FD FD FD FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF F8 F8' - 'F8 FF A4 A4 A4 FF 1B 1B 1B FF 00 00 00 FF 00 00' - '00 9B 00 00 00 04 00 00 00 0F 00 00 00 D8 00 00' - '00 FF 14 14 14 FF 6E 6E 6E FF AC AC AC FF B9 B9' - 'B9 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8' - 'B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8' - 'B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8' - 'B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8' - 'B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8' - 'B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8 B8 FF B7 B7' - 'B7 FF B7 B7 B7 FF B7 B7 B7 FF B6 B6 B6 FF B6 B6' - 'B6 FF B6 B6 B6 FF B5 B5 B5 FF B5 B5 B5 FF B5 B5' - 'B5 FF B4 B4 B4 FF B5 B5 B5 FF AB AB AB FF 76 76' - '76 FF 1D 1D 1D FF 00 00 00 FF 00 00 00 FA 00 00' - '00 3C 00 00 00 00 00 00 00 00 00 00 00 52 00 00' - '00 F6 00 00 00 FF 00 00 00 FF 0C 0C 0C FF 16 16' - '16 FF 15 15 15 FF 15 15 15 FF 15 15 15 FF 15 15' - '15 FF 15 15 15 FF 15 15 15 FF 15 15 15 FF 15 15' - '15 FF 15 15 15 FF 15 15 15 FF 15 15 15 FF 15 15' - '15 FF 15 15 15 FF 15 15 15 FF 15 15 15 FF 15 15' - '15 FF 15 15 15 FF 15 15 15 FF 15 15 15 FF 15 15' - '15 FF 15 15 15 FF 15 15 15 FF 15 15 15 FF 15 15' - '15 FF 15 15 15 FF 15 15 15 FF 15 15 15 FF 15 15' - '15 FF 15 15 15 FF 15 15 15 FF 15 15 15 FF 15 15' - '15 FF 15 15 15 FF 16 16 16 FF 10 10 10 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 6F 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 39 00 00 00 B0 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 C1 00 00 00 51 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 49 00 00 00 80 00 00' - '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' - '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' - '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' - '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' - '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' - '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' - '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' - '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' - '00 84 00 00 00 84 00 00 00 84 00 00 00 82 00 00' - '00 57 00 00 00 0B 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 32 32 32 32 32 32' + '32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32' + '32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32' + '32 32 00 00 00 00 00 00 32 32 32 32 32 32 32 32' + '32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32' + '32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32' + '32 32 32 32 00 00 00 32 32 32 32 32 32 32 32 32' + '32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32' + '32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32' + '32 32 32 32 32 00 32 32 32 32 05 08 1F 1F 1F 1F' + '1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F' + '1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 08' + '06 32 32 32 32 32 32 32 32 1F 31 31 31 31 31 31' + '31 31 30 31 30 30 30 30 30 30 30 2A 30 2A 30 2A' + '2A 2A 2A 2A 2A 2A 2A 2A 29 2A 29 29 29 29 29 29' + '30 20 01 32 32 32 32 32 05 31 31 31 30 31 30 30' + '30 30 30 30 30 30 2A 30 30 2A 2A 30 2A 2A 2A 2A' + '2A 2A 2A 29 2A 29 29 29 29 29 29 29 29 29 22 29' + '22 30 07 32 32 32 32 32 08 31 31 30 31 30 30 31' + '30 30 30 30 30 2A 30 2A 2A 30 2A 2A 2A 2A 2B 2A' + '2A 29 2A 29 2A 29 29 29 29 29 29 29 29 22 29 22' + '22 2A 21 32 32 32 32 32 20 31 31 31 31 31 31 31' + '31 31 31 31 30 31 31 31 2E 2F 31 30 30 31 2F 30' + '30 31 2A 2C 2D 31 30 30 30 30 30 2A 2E 2C 2A 29' + '29 29 21 32 32 32 32 32 1F 31 31 31 2A 1B 1C 1B' + '1B 1B 23 1B 24 27 1B 26 1E 24 1E 26 24 1D 24 27' + '1E 23 27 24 1E 23 1C 1D 23 1B 1B 1C 1B 1B 2A 29' + '22 2A 21 32 32 32 32 32 1F 31 31 31 29 11 0E 11' + '11 17 11 17 17 11 1C 11 1B 18 1B 1C 17 1C 1B 17' + '15 17 11 1B 11 17 11 11 10 11 11 0E 10 0B 2B 29' + '29 29 21 32 32 32 32 32 1F 31 31 31 2A 11 11 11' + '11 11 17 11 11 1B 17 1C 17 1B 14 17 1C 14 18 1B' + '17 17 1C 11 17 11 17 11 11 0F 11 10 0B 10 29 29' + '29 29 21 32 32 32 32 32 1F 31 31 31 2A 0F 10 11' + '11 11 11 17 11 11 17 11 1C 17 17 1C 17 17 1B 12' + '1B 11 17 1B 11 17 11 11 11 11 10 0B 10 11 26 29' + '29 2A 21 32 32 32 32 32 1F 31 31 31 29 10 0F 11' + '10 11 17 11 11 17 11 1B 17 11 1C 11 17 1B 12 1B' + '11 1B 11 11 17 11 11 11 11 10 0F 11 10 0A 2B 29' + '29 2A 21 32 32 32 32 32 1F 31 31 31 2A 11 10 0B' + '11 11 11 11 17 11 17 11 11 1B 11 17 14 11 17 11' + '17 11 17 11 11 11 11 10 11 0F 10 0A 0D 0E 29 2A' + '29 29 21 32 32 32 32 32 1F 31 31 31 2D 10 0B 10' + '0F 10 11 0E 11 11 11 11 17 11 17 11 11 17 11 17' + '11 17 11 0F 10 11 11 11 0E 11 0C 11 0E 0C 2B 29' + '29 2A 21 32 32 32 32 32 1F 31 31 31 2B 0F 10 11' + '0C 0F 11 11 11 11 11 11 11 17 11 11 17 11 17 11' + '11 11 11 11 11 11 0E 11 0D 0E 11 0A 10 0A 29 2A' + '29 2A 21 32 32 32 32 32 1F 31 31 31 29 0F 0C 0B' + '0E 11 0C 11 10 0F 11 11 11 0E 11 17 11 11 11 0F' + '11 11 10 11 0F 10 11 11 0E 10 0A 10 0A 0A 2B 2A' + '29 2A 21 32 32 32 32 32 1F 31 31 31 29 10 0A 10' + '0C 0F 11 0E 11 10 11 0E 11 11 11 10 0F 11 10 11' + '10 0F 11 11 10 0B 10 0A 0B 03 0A 0A 0C 0E 29 2A' + '2A 2A 20 32 32 32 32 32 1F 31 31 31 2A 0A 0E 0C' + '0F 10 0A 10 0F 0D 0E 11 11 11 11 11 11 11 11 11' + '11 11 11 10 0F 10 0A 1F 22 2A 25 0B 0A 0A 27 2A' + '29 2A 21 32 32 32 32 32 08 31 31 31 29 0B 0C 0E' + '0A 0C 11 0A 10 11 11 11 11 17 11 11 17 11 11 17' + '11 11 11 11 11 11 04 30 31 30 29 07 0A 0A 29 2A' + '29 30 20 32 32 32 32 32 1F 31 31 31 29 10 0A 0A' + '0C 0F 0A 11 11 17 11 11 11 11 17 11 11 17 11 11' + '11 17 11 11 11 10 13 30 29 20 30 08 0A 0A 2B 2A' + '2A 2A 20 32 32 32 32 32 1F 31 31 31 29 0A 0A 0C' + '0E 0C 17 11 11 11 17 11 17 11 11 17 15 11 17 11' + '1B 11 11 17 11 11 0F 29 31 30 31 08 02 10 22 30' + '29 30 20 32 32 32 32 32 08 31 31 31 26 0F 0C 0A' + '11 17 11 11 11 17 11 1B 11 17 17 14 17 17 14 17' + '11 17 17 11 17 11 0F 07 2A 31 21 03 0C 0A 2B 2A' + '2A 2A 21 32 32 32 32 32 1F 31 31 31 29 0A 0E 11' + '11 11 11 17 11 11 17 11 1C 11 1B 18 11 1B 18 14' + '17 14 17 11 14 17 11 0F 0F 04 03 10 0B 0A 26 30' + '2A 2A 20 32 32 32 32 32 08 31 31 31 29 0A 10 11' + '11 11 17 11 17 1B 12 1B 11 1C 17 1B 1B 17 1B 18' + '1B 17 15 17 17 12 17 11 11 0F 11 11 10 0A 2B 30' + '2A 30 20 32 32 32 32 32 08 31 31 31 22 0F 11 11' + '17 11 11 1B 12 17 1B 17 1B 17 1C 18 1B 1C 17 1B' + '1C 17 17 15 17 17 13 13 1A 1B 13 0F 11 10 29 2A' + '2A 30 20 32 32 32 32 32 08 31 31 31 22 11 11 11' + '11 1B 17 11 1B 12 1B 1C 17 1C 17 1B 1C 17 1B 1C' + '17 1C 1B 17 1B 11 23 20 21 1F 28 13 0F 10 29 30' + '2A 30 20 32 32 32 32 32 08 31 31 31 22 10 11 17' + '11 11 1C 17 17 1B 18 1B 1C 1B 1C 1B 1C 1C 1B 1B' + '1C 17 1C 1B 17 14 1A 29 2A 2A 22 13 10 0F 2B 30' + '2A 30 20 32 32 32 32 32 08 31 31 31 22 0F 11 11' + '1B 17 11 17 1B 1C 1B 18 1B 1E 1C 1B 1E 1B 1E 1C' + '1B 1C 1B 18 1B 18 1A 29 2A 29 29 1A 11 11 26 31' + '31 30 20 32 32 32 32 32 08 31 31 31 22 0D 17 11' + '11 1C 17 15 17 1B 1B 1C 1B 1C 1D 1C 1B 1E 1B 1C' + '1E 1B 1C 1B 1C 17 1B 29 2A 2A 2A 13 10 11 2B 2F' + '30 31 20 32 32 32 32 32 08 31 31 31 22 0E 11 14' + '17 11 1B 17 1B 1C 19 1B 1C 1D 1C 1C 1E 24 1E 1E' + '1B 1C 1D 1C 17 1C 13 20 29 22 21 0F 11 0C 29 31' + '31 31 20 32 32 32 32 32 08 31 31 31 21 0A 0C 17' + '17 17 15 17 18 1B 1C 1C 1E 1C 1E 1E 24 1E 1C 1C' + '1E 1C 1C 17 1C 17 18 11 16 11 0F 11 10 0A 2B 31' + '30 31 1F 32 32 32 32 32 07 31 31 31 22 1B 20 1B' + '23 23 1B 26 23 26 23 26 23 26 26 23 26 26 26 26' + '26 23 26 23 26 23 26 23 1B 23 1B 23 1F 1A 2A 31' + '31 31 20 32 32 32 32 32 08 31 31 31 31 31 31 31' + '31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31' + '31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31' + '31 31 1F 32 32 32 32 32 05 31 31 31 31 31 31 31' + '31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31' + '31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31' + '31 30 08 32 32 32 32 32 01 20 31 31 31 31 31 31' + '31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31' + '31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31' + '31 21 01 32 32 32 32 32 32 01 07 21 29 22 22 22' + '22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22' + '22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22' + '08 01 32 32 32 00 00 32 32 32 32 32 01 01 01 01' + '01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01' + '01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01' + '32 32 32 32 00 00 00 00 32 32 32 32 32 32 32 32' + '32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32' + '32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32' + '32 32 32 00 00 00 00 00 00 00 32 32 32 32 32 32' + '32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32' + '32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32' + '32 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' @@ -8459,8 +8063,79 @@ END '00 00 00 03 00 00 C0 00 00 00 00 07 00 00 F0 00' '00 00 00 0F 00 00 FF FF FF FF FF FF 00 00 FF FF' 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' - 'FF FF FF FF 00 00 28 00 00 00 20 00 00 00 40 00' - '00 00 01 00 20 00 00 00 00 00 00 10 00 00 00 00' + 'FF FF FF FF 00 00 28 00 00 00 10 00 00 00 20 00' + '00 00 01 00 20 00 00 00 00 00 40 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 21 00 00 00 92 05 05 05 A8 05 05 05 A8 05 05' + '05 A8 05 05 05 A8 06 06 06 A8 06 06 06 A8 06 06' + '06 A8 06 06 06 A8 06 06 06 A8 07 07 07 A8 07 07' + '07 A8 06 06 06 A8 00 00 00 78 00 00 00 0A 0E 0E' + '0E B9 98 98 98 FF C9 CB CC FF C2 C4 C6 FF BF C1' + 'C2 FF BC BE BF FF B8 BA BC FF B6 B8 B9 FF B4 B5' + 'B7 FF B0 B2 B4 FF AE B1 B2 FF AC AE B0 FF AA AC' + 'AE FF AC AC AD FF 55 55 55 FF 01 01 01 72 43 43' + '43 F3 FF FF FF FF FD F5 EF FF F8 EC E3 FF F7 EC' + 'E3 FF F5 EB E2 FF F2 E9 E0 FF F0 E7 DE FF ED E4' + 'DB FF E9 DF D6 FF E5 DA D2 FF E1 D5 CC FF DC D0' + 'C7 FF DB D6 D3 FF B0 B0 B1 FF 08 08 08 AB 48 48' + '49 F1 FD FE FF FF CF 91 67 FF CA 71 31 FF D5 85' + '47 FF DC 90 52 FF E0 99 59 FF E2 9B 5B FF E0 98' + '59 FF DC 90 51 FF D5 84 46 FF CB 76 38 FF C4 66' + '27 FF D4 B1 9B FF B0 B5 B8 FF 08 08 08 A9 46 47' + '47 F0 FD FE FF FF C8 84 58 FF C0 5D 19 FF CA 71' + '30 FF D0 7B 39 FF D3 81 3F FF D4 83 41 FF D3 80' + '3E FF CF 7A 38 FF C9 6E 2E FF C1 61 1F FF B9 51' + '10 FF D2 AC 96 FF B2 B7 BA FF 08 08 08 A8 45 46' + '46 F0 FD FE FF FF C3 7D 52 FF B8 52 10 FF C0 64' + '24 FF C5 6B 2B FF C8 70 30 FF C9 71 31 FF C8 6F' + '2F FF C4 6A 2A FF BF 61 21 FF B3 50 12 FF B1 44' + '04 FF D3 AC 96 FF B3 B9 BC FF 07 07 07 A8 44 45' + '46 F0 FC FE FE FF BC 72 48 FF AE 41 02 FF B8 55' + '17 FF C0 63 23 FF C5 6A 2B FF C6 6C 2D FF C5 6B' + '2B FF C2 63 23 FF B0 5E 28 FF BD A9 9D FF A3 61' + '3D FF D1 A6 8E FF B5 BB BD FF 06 06 06 A8 43 43' + '44 F0 FC FD FD FF B7 6D 42 FF B1 47 08 FF C5 6A' + '2B FF CC 76 36 FF D0 7C 3B FF D1 7E 3D FF D0 7C' + '3C FF CF 76 34 FF B4 71 41 FF D1 D5 D6 FF A8 79' + '5E FF CF A4 8C FF B7 BC BF FF 06 06 06 A8 41 42' + '43 F0 FA FA FB FF BE 78 4D FF C6 69 26 FF D1 7D' + '3D FF D6 86 45 FF DA 8D 4B FF DB 8F 4E FF DB 8D' + '4C FF D8 88 46 FF CB 7B 3E FF 9F 69 41 FF AB 57' + '21 FF DA B2 9A FF B7 BC C0 FF 06 06 06 A8 40 41' + '41 F0 F7 F8 F9 FF C8 88 5C FF CF 77 33 FF D8 89' + '47 FF DF 95 52 FF E4 9E 5A FF E6 A1 5E FF E5 9F' + '5C FF E2 95 4F FF C8 91 63 FF BE BF C0 FF B2 86' + '65 FF E2 B9 9F FF BA C0 C3 FF 05 05 05 A8 3F 40' + '40 F0 F7 F7 F8 FF BB 79 4D FF CD 75 2F FF D8 8B' + '47 FF E1 9A 55 FF E9 A6 61 FF EC AD 67 FF EA A8' + '63 FF E5 9C 55 FF C9 8A 53 FF B9 AF A6 FF AE 72' + '49 FF E8 BF A5 FF C5 CB CE FF 04 04 04 A8 3B 3B' + '3B F4 FF FF FF FF DB C6 BA FF E2 C5 AE FF E8 CE' + 'B7 FF EB D4 BC FF EF D9 C1 FF F1 DC C4 FF EF DA' + 'C2 FF EC D5 BD FF E7 CD B6 FF DF C6 B0 FF D8 BA' + 'A7 FF F8 ED E7 FF C8 CA CB FF 02 02 02 AB 0F 0F' + '0F C7 AA A9 A9 FF E2 E5 E7 FF DE E3 E6 FF DD E1' + 'E5 FF DD E0 E4 FF DC E0 E3 FF DC DF E3 FF DC E0' + 'E3 FF DD E0 E4 FF DD E1 E4 FF DD E0 E2 FF DE E2' + 'E5 FF D8 DA DB FF 66 66 65 FF 00 00 00 78 00 00' + '00 2E 01 01 01 B1 0F 0F 0F CC 0E 0E 0E CC 0E 0E' + '0E CC 0E 0E 0E CC 0E 0E 0E CC 0E 0E 0E CC 0E 0E' + '0E CC 0E 0E 0E CC 0E 0E 0E CC 0E 0E 0E CC 0E 0E' + '0E CC 0C 0C 0C CB 00 00 00 8D 00 00 00 0D 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 FF FF 00 00 28 00' + '00 00 20 00 00 00 40 00 00 00 01 00 20 00 00 00' + '00 00 80 0C 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' @@ -8486,214 +8161,800 @@ END '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 23 00 00 00 58 00 00' + '00 23 00 00 00 58 00 00 00 61 00 00 00 61 00 00' '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' - '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' - '00 3D 00 00 00 08 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 6E 00 00 00 E7 00 00 00 FF 00 00' + '00 61 00 00 00 61 00 00 00 3D 00 00 00 08 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 6E 00 00' + '00 E7 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' - '00 FF 00 00 00 FF 01 01 01 FF 01 01 01 FF 01 01' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 01 01' '01 FF 01 01 01 FF 01 01 01 FF 01 01 01 FF 01 01' - '01 FF 01 01 01 FF 02 02 02 FF 02 02 02 FF 02 02' - '02 FF 02 02 02 FF 02 02 02 FF 00 00 00 FF 00 00' - '00 F7 00 00 00 A7 00 00 00 1D 00 00 00 00 00 00' - '00 5D 00 00 00 FF 47 47 47 FF AA AA AA FF B6 B6' - 'B6 FF B2 B2 B2 FF B1 B1 B1 FF B1 B1 B1 FF AF AF' - 'AF FF AE AE AE FF AE AE AE FF AD AD AD FF AC AC' - 'AC FF AC AC AC FF AB AB AB FF AA AA AA FF A9 A9' - 'A9 FF A8 A8 A8 FF A7 A7 A7 FF A7 A7 A7 FF A5 A5' - 'A5 FF A5 A5 A5 FF A4 A4 A4 FF A3 A3 A3 FF A2 A2' - 'A2 FF A1 A1 A1 FF A2 A2 A2 FF A3 A3 A3 FF 64 64' - '64 FF 05 05 05 FF 00 00 00 AB 00 00 00 0A 00 00' - '00 CF 38 38 38 FF F0 F0 F0 FF FF FF FF FF FF FF' - 'FF FF FE FF FF FF FC FC FC FF F9 FA FA FF F7 F7' - 'F7 FF F4 F5 F5 FF F2 F3 F3 FF F0 F1 F1 FF EE EE' - 'EE FF EC EC EC FF E9 EA EA FF E7 E7 E7 FF E5 E5' - 'E5 FF E3 E3 E3 FF E0 E0 E1 FF DE DE DE FF DC DC' - 'DC FF D9 D9 DA FF D7 D7 D8 FF D5 D5 D5 FF D3 D3' - 'D3 FF D0 D0 D0 FF CE CE CE FF CE CE CE FF DE DE' - 'DE FF 66 66 66 FF 00 00 00 FD 00 00 00 41 00 00' - '00 F2 7C 7C 7C FF FF FF FF FF FA FA FA FF FA FC' - 'FD FF F9 FC FF FF F7 FA FC FF F4 F7 FA FF F3 F6' - 'F8 FF F1 F3 F6 FF EE F1 F4 FF EC EF F2 FF EA ED' - 'F0 FF E8 EB ED FF E7 E9 EC FF E4 E7 E9 FF E2 E5' - 'E8 FF E1 E3 E6 FF DF E2 E4 FF DD E0 E2 FF DB DE' - 'E1 FF D9 DD DF FF D8 DB DD FF D6 D9 DC FF D4 D8' - 'DA FF D3 D6 D9 FF D0 D2 D4 FF C6 C6 C6 FF CF CF' - 'CF FF A3 A3 A3 FF 01 01 01 FF 00 00 00 63 00 00' - '00 F0 7E 7E 7E FF FF FF FF FF FD FE FE FF E2 C8' - 'B7 FF DA A0 77 FF DE A9 82 FF E1 AE 86 FF E4 B2' - '8A FF E6 B6 8F FF E9 BB 92 FF EA BD 95 FF EC C0' - '98 FF ED C2 9A FF EE C3 9A FF EE C2 9A FF EC C1' - '99 FF EB BF 97 FF E9 BC 94 FF E7 B8 90 FF E4 B4' - '8C FF E2 B0 88 FF DF AB 84 FF DC A6 7F FF D9 A1' - '7A FF D4 97 6E FF E0 B8 9F FF D1 D2 D3 FF CE CF' - 'CF FF A2 A2 A2 FF 01 01 01 FF 00 00 00 61 00 00' - '00 F0 7D 7D 7D FF FF FF FF FF FF FF FF FF CC A0' - '82 FF BD 56 0F FF C5 66 23 FF CA 6E 2B FF CE 76' - '31 FF D2 7D 38 FF D6 83 3E FF D9 89 43 FF DC 8D' - '47 FF DE 90 4A FF DF 91 4B FF DF 91 4B FF DD 8F' - '49 FF DB 8C 46 FF D8 87 42 FF D6 81 3C FF D1 7B' - '37 FF CD 73 2F FF C8 6C 28 FF C4 64 21 FF BF 5C' - '1A FF B6 4B 06 FF CD 87 5B FF D4 D7 D8 FF D1 D2' - 'D3 FF A1 A1 A1 FF 01 01 01 FF 00 00 00 61 00 00' - '00 F0 7B 7B 7B FF FF FF FF FF FF FF FF FF CE A3' - '87 FF BD 59 16 FF C4 68 29 FF C8 6F 30 FF CC 76' - '35 FF D0 7C 3B FF D3 81 40 FF D6 86 44 FF D7 89' - '48 FF D9 8C 4A FF DA 8C 4B FF DA 8C 4B FF D9 8B' - '49 FF D7 88 47 FF D4 84 43 FF D2 7F 3F FF CF 7A' - '3A FF CB 74 34 FF C7 6D 2D FF C3 66 27 FF BE 5E' - '20 FF B6 4E 0D FF CD 8A 60 FF D6 D8 DA FF D4 D4' - 'D5 FF A1 A1 A1 FF 00 00 00 FF 00 00 00 61 00 00' - '00 F0 7B 7B 7B FF FF FF FF FF FF FF FF FF CD A1' - '85 FF B9 52 11 FF C0 61 23 FF C4 68 2A FF C8 6F' - '2F FF CB 74 34 FF CE 79 38 FF D1 7D 3C FF D2 80' - '3F FF D4 82 42 FF D3 83 42 FF D3 83 42 FF D3 82' - '41 FF D1 7F 3E FF D0 7C 3B FF CD 77 37 FF CA 72' - '33 FF C7 6D 2D FF C3 66 28 FF BF 60 21 FF BB 59' - '1A FF B2 49 07 FF CB 86 5D FF D8 D9 DB FF D6 D7' - 'D7 FF A1 A1 A1 FF 00 00 00 FF 00 00 00 61 00 00' - '00 F0 7A 7A 7A FF FF FF FF FF FF FF FF FF CB 9E' - '82 FF B5 4C 0A FF BC 5B 1C FF C0 62 22 FF C4 67' - '28 FF C6 6C 2C FF C9 70 31 FF CB 74 34 FF CD 77' - '37 FF CD 79 39 FF CE 79 39 FF CE 79 39 FF CE 78' - '37 FF CC 76 36 FF CB 73 33 FF C8 6F 2F FF C5 6B' - '2B FF C2 65 26 FF BF 60 21 FF BC 59 1A FF B7 53' - '15 FF AE 42 01 FF C8 82 5A FF DA DC DC FF D7 D8' - 'D8 FF A0 A0 A0 FF 00 00 00 FF 00 00 00 61 00 00' - '00 F0 78 78 78 FF FF FF FF FF FF FF FF FF C7 99' - '7E FF B1 46 03 FF B8 54 15 FF BB 5A 1B FF BE 5F' - '20 FF C1 64 25 FF C4 68 29 FF C5 6B 2C FF C7 6D' - '2E FF C8 6F 2F FF C8 6F 2F FF C8 6F 2F FF C7 6E' - '2E FF C6 6C 2C FF C5 6A 2A FF C2 66 27 FF C0 62' - '23 FF BF 5E 1E FF B7 51 10 FF A9 44 05 FF B2 47' - '07 FF AC 3C 00 FF C6 7F 57 FF DC DE DF FF DA DB' - 'DB FF 9F 9F 9F FF 00 00 00 FF 00 00 00 61 00 00' - '00 F0 77 77 77 FF FF FF FF FF FF FF FF FF C4 94' - '79 FF AC 3D 00 FF B3 4C 0F FF B7 52 14 FF B9 57' - '18 FF BB 5A 1C FF BE 5E 1F FF BF 62 23 FF C2 65' - '26 FF C4 68 28 FF C5 69 2A FF C5 69 2A FF C4 69' - '29 FF C2 66 27 FF C0 62 24 FF BD 5E 1F FF BC 5A' - '1A FF AE 4E 12 FF 9A 6B 4D FF AB 92 82 FF 96 57' - '32 FF A4 31 00 FF C6 7E 55 FF DE E0 E2 FF DD DE' - 'DE FF 9E 9E 9E FF 00 00 00 FF 00 00 00 61 00 00' - '00 F0 76 76 76 FF FF FF FF FF FF FF FF FF C0 90' - '76 FF A8 37 00 FF AF 45 07 FF B1 49 0B FF B3 4D' - '10 FF B9 57 18 FF C1 64 25 FF C5 6B 2B FF C7 6E' - '2E FF C8 70 30 FF C9 71 31 FF C9 71 31 FF C9 71' - '31 FF C8 70 2F FF C6 6C 2D FF C4 69 29 FF C3 5F' - '1C FF 93 5C 39 FF DC E4 EA FF ED F3 F6 FF A8 A9' - 'AB FF 86 2F 03 FF C9 7D 52 FF DF E1 E3 FF DE DF' - 'DF FF 9E 9E 9E FF 00 00 00 FF 00 00 00 61 00 00' - '00 F0 75 75 75 FF FF FF FF FF FF FF FF FF BE 8F' - '74 FF A6 35 00 FF AA 3D 01 FF B0 49 0B FF BD 5E' - '1F FF C6 6C 2C FF CA 72 32 FF CC 75 35 FF CD 77' - '37 FF CE 78 39 FF CE 7A 39 FF CE 7A 39 FF CE 79' - '39 FF CD 78 37 FF CC 75 36 FF CB 73 32 FF C9 6B' - '28 FF 96 71 57 FF DC E2 E7 FF D4 D0 CE FF C7 CD' - 'D1 FF 7B 34 0B FF CA 7D 50 FF E0 E3 E5 FF E0 E1' - 'E2 FF 9D 9D 9D FF 00 00 00 FF 00 00 00 61 00 00' - '00 F0 73 73 73 FF FF FF FF FF FF FF FF FF BD 8D' - '72 FF A6 34 00 FF B2 4C 0F FF C4 68 28 FF CA 72' - '32 FF CC 76 36 FF CF 79 39 FF D1 7D 3D FF D2 80' - '3F FF D3 82 42 FF D4 83 42 FF D4 83 42 FF D3 82' - '41 FF D2 81 40 FF D1 7E 3E FF D0 7B 3A FF D2 78' - '34 FF 9E 60 33 FF B4 B5 B4 FF E9 EF F2 FF AC A2' - '9C FF 8D 2C 00 FF C8 7E 54 FF E3 E5 E6 FF E2 E4' - 'E4 FF 9C 9C 9C FF 00 00 00 FF 00 00 00 61 00 00' - '00 F0 72 72 72 FF FF FF FF FF FF FF FF FF BA 8A' - '6E FF AF 43 05 FF C6 6C 2C FF CB 74 33 FF CE 77' - '37 FF D1 7D 3C FF D3 82 41 FF D6 86 44 FF D7 89' - '48 FF D9 8C 4A FF D9 8C 4B FF D9 8C 4B FF D9 8C' - '4A FF D8 8A 49 FF D7 87 46 FF D4 83 42 FF D2 7F' - '3F FF D2 78 34 FF AC 65 2F FF 9A 63 3B FF AD 59' - '21 FF B7 49 08 FF C4 7D 55 FF E5 E6 E7 FF E5 E6' - 'E7 FF 9B 9B 9B FF 00 00 00 FF 00 00 00 61 00 00' - '00 F0 6F 6F 6F FF FF FF FF FF FE FF FF FF BA 8B' - '70 FF BF 5D 1A FF CB 73 33 FF CE 78 38 FF D2 7E' - '3E FF D5 84 43 FF D8 8A 48 FF DB 8E 4C FF DE 92' - '50 FF DE 95 53 FF E0 96 54 FF E0 96 54 FF DF 95' - '53 FF DE 93 51 FF DC 8F 4E FF D9 8B 4A FF D8 86' - '43 FF BD 7D 4A FF A6 75 51 FF AA 75 4E FF 9F 6E' - '44 FF B5 59 18 FF CB 86 5D FF E5 E7 E8 FF E7 E7' - 'E8 FF 9A 9A 9A FF 00 00 00 FF 00 00 00 61 00 00' - '00 F0 6E 6E 6E FF FF FF FF FF FC FF FF FF BE 92' - '77 FF C6 67 24 FF CD 77 37 FF D1 7E 3E FF D5 85' - '43 FF D9 8B 4A FF DD 91 4F FF E0 96 54 FF E2 9A' - '58 FF E4 9E 5B FF E5 9F 5D FF E5 9F 5C FF E5 9E' - '5C FF E3 9B 59 FF E0 97 56 FF DE 93 51 FF D9 87' - '42 FF B8 97 7C FF B0 BA C2 FF B0 B5 BA FF A3 AA' - 'A9 FF A9 5B 22 FF D5 91 66 FF E7 E8 E9 FF EA EA' - 'EB FF 9A 9A 9A FF 00 00 00 FF 00 00 00 61 00 00' - '00 F0 6C 6C 6C FF FF FF FF FF FC FF FF FF BC 90' - '74 FF C8 6B 27 FF D0 7B 3B FF D4 83 42 FF D8 8A' - '48 FF DD 91 4F FF E1 97 56 FF E4 9E 5B FF E7 A2' - '60 FF EA A6 63 FF EA A9 65 FF EB A9 66 FF EA A7' - '64 FF E8 A4 61 FF E6 9F 5D FF E2 99 58 FF E1 91' - '4B FF B3 8D 6C FF D1 D6 DB FF E0 E3 E4 FF B3 AF' - 'AD FF B5 60 24 FF D4 92 67 FF F4 F6 F7 FF FA FA' - 'FB FF 9B 9B 9B FF 00 00 00 FF 00 00 00 61 00 00' - '00 F0 6B 6B 6B FF FF FF FF FF FC FF FF FF B3 82' - '67 FF C4 61 1C FF D4 80 3D FF D7 86 44 FF DC 8D' - '4B FF E0 95 52 FF E5 9C 59 FF E9 A3 60 FF ED AA' - '65 FF F0 AF 6A FF F2 B2 6D FF F2 B3 6D FF F1 B0' - '6C FF EE AC 67 FF EA A5 62 FF E6 9F 5B FF E7 99' - '53 FF B5 81 54 FF C4 C5 C6 FF DA DF E1 FF A6 95' - '89 FF BB 5B 17 FF CC 85 5A FF FA FC FD FF FF FF' - 'FF FF 9B 9B 9B FF 00 00 00 FF 00 00 00 61 00 00' - '00 F0 6A 6A 6A FF FF FF FF FF FD FF FF FF AC 84' - '6D FF AA 52 1C FF CB 80 44 FF D2 88 4A FF D6 8F' - '51 FF DB 96 58 FF DF 9E 60 FF E4 A5 66 FF E8 AC' - '6D FF EC B2 72 FF EE B6 76 FF EE B7 77 FF ED B4' - '74 FF E9 AE 6F FF E5 A8 69 FF E1 A1 62 FF DE 9A' - '5B FF CE 8B 50 FF A9 78 50 FF A5 76 50 FF AD 70' - '41 FF AE 59 20 FF C1 85 64 FF FD FF FF FF FF FF' - 'FF FF 9A 9A 9A FF 00 00 00 FF 00 00 00 61 00 00' - '00 F3 69 69 69 FF FF FF FF FF FF FF FF FF E2 E0' - 'E0 FF DA D6 D4 FF DE DA D6 FF DF DB D7 FF E0 DB' - 'D7 FF E0 DC D8 FF E0 DC D8 FF E1 DD D9 FF E1 DD' - 'D9 FF E1 DE D9 FF E1 DE DA FF E1 DE DA FF E1 DE' - 'DA FF E1 DD D9 FF E1 DD D9 FF E0 DC D8 FF DF DB' - 'D7 FF E1 DC D7 FF E4 DC D4 FF E3 DA D2 FF E1 D9' - 'D3 FF D8 D5 D3 FF E5 E3 E2 FF FE FE FE FF FF FF' - 'FF FF 9B 9B 9B FF 00 00 00 FF 00 00 00 63 00 00' - '00 DE 3A 3A 3A FF F2 F2 F2 FF FF FF FF FF FF FF' + '01 FF 01 01 01 FF 01 01 01 FF 01 01 01 FF 02 02' + '02 FF 02 02 02 FF 02 02 02 FF 02 02 02 FF 02 02' + '02 FF 00 00 00 FF 00 00 00 F7 00 00 00 A7 00 00' + '00 1D 00 00 00 00 00 00 00 5D 00 00 00 FF 47 47' + '47 FF AA AA AA FF B6 B6 B6 FF B2 B2 B2 FF B1 B1' + 'B1 FF B1 B1 B1 FF AF AF AF FF AE AE AE FF AE AE' + 'AE FF AD AD AD FF AC AC AC FF AC AC AC FF AB AB' + 'AB FF AA AA AA FF A9 A9 A9 FF A8 A8 A8 FF A7 A7' + 'A7 FF A7 A7 A7 FF A5 A5 A5 FF A5 A5 A5 FF A4 A4' + 'A4 FF A3 A3 A3 FF A2 A2 A2 FF A1 A1 A1 FF A2 A2' + 'A2 FF A3 A3 A3 FF 64 64 64 FF 05 05 05 FF 00 00' + '00 AB 00 00 00 0A 00 00 00 CF 38 38 38 FF F0 F0' + 'F0 FF FF FF FF FF FF FF FF FF FE FF FF FF FC FC' + 'FC FF F9 FA FA FF F7 F7 F7 FF F4 F5 F5 FF F2 F3' + 'F3 FF F0 F1 F1 FF EE EE EE FF EC EC EC FF E9 EA' + 'EA FF E7 E7 E7 FF E5 E5 E5 FF E3 E3 E3 FF E0 E0' + 'E1 FF DE DE DE FF DC DC DC FF D9 D9 DA FF D7 D7' + 'D8 FF D5 D5 D5 FF D3 D3 D3 FF D0 D0 D0 FF CE CE' + 'CE FF CE CE CE FF DE DE DE FF 66 66 66 FF 00 00' + '00 FD 00 00 00 41 00 00 00 F2 7C 7C 7C FF FF FF' + 'FF FF FA FA FA FF FA FC FD FF F9 FC FF FF F7 FA' + 'FC FF F4 F7 FA FF F3 F6 F8 FF F1 F3 F6 FF EE F1' + 'F4 FF EC EF F2 FF EA ED F0 FF E8 EB ED FF E7 E9' + 'EC FF E4 E7 E9 FF E2 E5 E8 FF E1 E3 E6 FF DF E2' + 'E4 FF DD E0 E2 FF DB DE E1 FF D9 DD DF FF D8 DB' + 'DD FF D6 D9 DC FF D4 D8 DA FF D3 D6 D9 FF D0 D2' + 'D4 FF C6 C6 C6 FF CF CF CF FF A3 A3 A3 FF 01 01' + '01 FF 00 00 00 63 00 00 00 F0 7E 7E 7E FF FF FF' + 'FF FF FD FE FE FF E2 C8 B7 FF DA A0 77 FF DE A9' + '82 FF E1 AE 86 FF E4 B2 8A FF E6 B6 8F FF E9 BB' + '92 FF EA BD 95 FF EC C0 98 FF ED C2 9A FF EE C3' + '9A FF EE C2 9A FF EC C1 99 FF EB BF 97 FF E9 BC' + '94 FF E7 B8 90 FF E4 B4 8C FF E2 B0 88 FF DF AB' + '84 FF DC A6 7F FF D9 A1 7A FF D4 97 6E FF E0 B8' + '9F FF D1 D2 D3 FF CE CF CF FF A2 A2 A2 FF 01 01' + '01 FF 00 00 00 61 00 00 00 F0 7D 7D 7D FF FF FF' + 'FF FF FF FF FF FF CC A0 82 FF BD 56 0F FF C5 66' + '23 FF CA 6E 2B FF CE 76 31 FF D2 7D 38 FF D6 83' + '3E FF D9 89 43 FF DC 8D 47 FF DE 90 4A FF DF 91' + '4B FF DF 91 4B FF DD 8F 49 FF DB 8C 46 FF D8 87' + '42 FF D6 81 3C FF D1 7B 37 FF CD 73 2F FF C8 6C' + '28 FF C4 64 21 FF BF 5C 1A FF B6 4B 06 FF CD 87' + '5B FF D4 D7 D8 FF D1 D2 D3 FF A1 A1 A1 FF 01 01' + '01 FF 00 00 00 61 00 00 00 F0 7B 7B 7B FF FF FF' + 'FF FF FF FF FF FF CE A3 87 FF BD 59 16 FF C4 68' + '29 FF C8 6F 30 FF CC 76 35 FF D0 7C 3B FF D3 81' + '40 FF D6 86 44 FF D7 89 48 FF D9 8C 4A FF DA 8C' + '4B FF DA 8C 4B FF D9 8B 49 FF D7 88 47 FF D4 84' + '43 FF D2 7F 3F FF CF 7A 3A FF CB 74 34 FF C7 6D' + '2D FF C3 66 27 FF BE 5E 20 FF B6 4E 0D FF CD 8A' + '60 FF D6 D8 DA FF D4 D4 D5 FF A1 A1 A1 FF 00 00' + '00 FF 00 00 00 61 00 00 00 F0 7B 7B 7B FF FF FF' + 'FF FF FF FF FF FF CD A1 85 FF B9 52 11 FF C0 61' + '23 FF C4 68 2A FF C8 6F 2F FF CB 74 34 FF CE 79' + '38 FF D1 7D 3C FF D2 80 3F FF D4 82 42 FF D3 83' + '42 FF D3 83 42 FF D3 82 41 FF D1 7F 3E FF D0 7C' + '3B FF CD 77 37 FF CA 72 33 FF C7 6D 2D FF C3 66' + '28 FF BF 60 21 FF BB 59 1A FF B2 49 07 FF CB 86' + '5D FF D8 D9 DB FF D6 D7 D7 FF A1 A1 A1 FF 00 00' + '00 FF 00 00 00 61 00 00 00 F0 7A 7A 7A FF FF FF' + 'FF FF FF FF FF FF CB 9E 82 FF B5 4C 0A FF BC 5B' + '1C FF C0 62 22 FF C4 67 28 FF C6 6C 2C FF C9 70' + '31 FF CB 74 34 FF CD 77 37 FF CD 79 39 FF CE 79' + '39 FF CE 79 39 FF CE 78 37 FF CC 76 36 FF CB 73' + '33 FF C8 6F 2F FF C5 6B 2B FF C2 65 26 FF BF 60' + '21 FF BC 59 1A FF B7 53 15 FF AE 42 01 FF C8 82' + '5A FF DA DC DC FF D7 D8 D8 FF A0 A0 A0 FF 00 00' + '00 FF 00 00 00 61 00 00 00 F0 78 78 78 FF FF FF' + 'FF FF FF FF FF FF C7 99 7E FF B1 46 03 FF B8 54' + '15 FF BB 5A 1B FF BE 5F 20 FF C1 64 25 FF C4 68' + '29 FF C5 6B 2C FF C7 6D 2E FF C8 6F 2F FF C8 6F' + '2F FF C8 6F 2F FF C7 6E 2E FF C6 6C 2C FF C5 6A' + '2A FF C2 66 27 FF C0 62 23 FF BF 5E 1E FF B7 51' + '10 FF A9 44 05 FF B2 47 07 FF AC 3C 00 FF C6 7F' + '57 FF DC DE DF FF DA DB DB FF 9F 9F 9F FF 00 00' + '00 FF 00 00 00 61 00 00 00 F0 77 77 77 FF FF FF' + 'FF FF FF FF FF FF C4 94 79 FF AC 3D 00 FF B3 4C' + '0F FF B7 52 14 FF B9 57 18 FF BB 5A 1C FF BE 5E' + '1F FF BF 62 23 FF C2 65 26 FF C4 68 28 FF C5 69' + '2A FF C5 69 2A FF C4 69 29 FF C2 66 27 FF C0 62' + '24 FF BD 5E 1F FF BC 5A 1A FF AE 4E 12 FF 9A 6B' + '4D FF AB 92 82 FF 96 57 32 FF A4 31 00 FF C6 7E' + '55 FF DE E0 E2 FF DD DE DE FF 9E 9E 9E FF 00 00' + '00 FF 00 00 00 61 00 00 00 F0 76 76 76 FF FF FF' + 'FF FF FF FF FF FF C0 90 76 FF A8 37 00 FF AF 45' + '07 FF B1 49 0B FF B3 4D 10 FF B9 57 18 FF C1 64' + '25 FF C5 6B 2B FF C7 6E 2E FF C8 70 30 FF C9 71' + '31 FF C9 71 31 FF C9 71 31 FF C8 70 2F FF C6 6C' + '2D FF C4 69 29 FF C3 5F 1C FF 93 5C 39 FF DC E4' + 'EA FF ED F3 F6 FF A8 A9 AB FF 86 2F 03 FF C9 7D' + '52 FF DF E1 E3 FF DE DF DF FF 9E 9E 9E FF 00 00' + '00 FF 00 00 00 61 00 00 00 F0 75 75 75 FF FF FF' + 'FF FF FF FF FF FF BE 8F 74 FF A6 35 00 FF AA 3D' + '01 FF B0 49 0B FF BD 5E 1F FF C6 6C 2C FF CA 72' + '32 FF CC 75 35 FF CD 77 37 FF CE 78 39 FF CE 7A' + '39 FF CE 7A 39 FF CE 79 39 FF CD 78 37 FF CC 75' + '36 FF CB 73 32 FF C9 6B 28 FF 96 71 57 FF DC E2' + 'E7 FF D4 D0 CE FF C7 CD D1 FF 7B 34 0B FF CA 7D' + '50 FF E0 E3 E5 FF E0 E1 E2 FF 9D 9D 9D FF 00 00' + '00 FF 00 00 00 61 00 00 00 F0 73 73 73 FF FF FF' + 'FF FF FF FF FF FF BD 8D 72 FF A6 34 00 FF B2 4C' + '0F FF C4 68 28 FF CA 72 32 FF CC 76 36 FF CF 79' + '39 FF D1 7D 3D FF D2 80 3F FF D3 82 42 FF D4 83' + '42 FF D4 83 42 FF D3 82 41 FF D2 81 40 FF D1 7E' + '3E FF D0 7B 3A FF D2 78 34 FF 9E 60 33 FF B4 B5' + 'B4 FF E9 EF F2 FF AC A2 9C FF 8D 2C 00 FF C8 7E' + '54 FF E3 E5 E6 FF E2 E4 E4 FF 9C 9C 9C FF 00 00' + '00 FF 00 00 00 61 00 00 00 F0 72 72 72 FF FF FF' + 'FF FF FF FF FF FF BA 8A 6E FF AF 43 05 FF C6 6C' + '2C FF CB 74 33 FF CE 77 37 FF D1 7D 3C FF D3 82' + '41 FF D6 86 44 FF D7 89 48 FF D9 8C 4A FF D9 8C' + '4B FF D9 8C 4B FF D9 8C 4A FF D8 8A 49 FF D7 87' + '46 FF D4 83 42 FF D2 7F 3F FF D2 78 34 FF AC 65' + '2F FF 9A 63 3B FF AD 59 21 FF B7 49 08 FF C4 7D' + '55 FF E5 E6 E7 FF E5 E6 E7 FF 9B 9B 9B FF 00 00' + '00 FF 00 00 00 61 00 00 00 F0 6F 6F 6F FF FF FF' + 'FF FF FE FF FF FF BA 8B 70 FF BF 5D 1A FF CB 73' + '33 FF CE 78 38 FF D2 7E 3E FF D5 84 43 FF D8 8A' + '48 FF DB 8E 4C FF DE 92 50 FF DE 95 53 FF E0 96' + '54 FF E0 96 54 FF DF 95 53 FF DE 93 51 FF DC 8F' + '4E FF D9 8B 4A FF D8 86 43 FF BD 7D 4A FF A6 75' + '51 FF AA 75 4E FF 9F 6E 44 FF B5 59 18 FF CB 86' + '5D FF E5 E7 E8 FF E7 E7 E8 FF 9A 9A 9A FF 00 00' + '00 FF 00 00 00 61 00 00 00 F0 6E 6E 6E FF FF FF' + 'FF FF FC FF FF FF BE 92 77 FF C6 67 24 FF CD 77' + '37 FF D1 7E 3E FF D5 85 43 FF D9 8B 4A FF DD 91' + '4F FF E0 96 54 FF E2 9A 58 FF E4 9E 5B FF E5 9F' + '5D FF E5 9F 5C FF E5 9E 5C FF E3 9B 59 FF E0 97' + '56 FF DE 93 51 FF D9 87 42 FF B8 97 7C FF B0 BA' + 'C2 FF B0 B5 BA FF A3 AA A9 FF A9 5B 22 FF D5 91' + '66 FF E7 E8 E9 FF EA EA EB FF 9A 9A 9A FF 00 00' + '00 FF 00 00 00 61 00 00 00 F0 6C 6C 6C FF FF FF' + 'FF FF FC FF FF FF BC 90 74 FF C8 6B 27 FF D0 7B' + '3B FF D4 83 42 FF D8 8A 48 FF DD 91 4F FF E1 97' + '56 FF E4 9E 5B FF E7 A2 60 FF EA A6 63 FF EA A9' + '65 FF EB A9 66 FF EA A7 64 FF E8 A4 61 FF E6 9F' + '5D FF E2 99 58 FF E1 91 4B FF B3 8D 6C FF D1 D6' + 'DB FF E0 E3 E4 FF B3 AF AD FF B5 60 24 FF D4 92' + '67 FF F4 F6 F7 FF FA FA FB FF 9B 9B 9B FF 00 00' + '00 FF 00 00 00 61 00 00 00 F0 6B 6B 6B FF FF FF' + 'FF FF FC FF FF FF B3 82 67 FF C4 61 1C FF D4 80' + '3D FF D7 86 44 FF DC 8D 4B FF E0 95 52 FF E5 9C' + '59 FF E9 A3 60 FF ED AA 65 FF F0 AF 6A FF F2 B2' + '6D FF F2 B3 6D FF F1 B0 6C FF EE AC 67 FF EA A5' + '62 FF E6 9F 5B FF E7 99 53 FF B5 81 54 FF C4 C5' + 'C6 FF DA DF E1 FF A6 95 89 FF BB 5B 17 FF CC 85' + '5A FF FA FC FD FF FF FF FF FF 9B 9B 9B FF 00 00' + '00 FF 00 00 00 61 00 00 00 F0 6A 6A 6A FF FF FF' + 'FF FF FD FF FF FF AC 84 6D FF AA 52 1C FF CB 80' + '44 FF D2 88 4A FF D6 8F 51 FF DB 96 58 FF DF 9E' + '60 FF E4 A5 66 FF E8 AC 6D FF EC B2 72 FF EE B6' + '76 FF EE B7 77 FF ED B4 74 FF E9 AE 6F FF E5 A8' + '69 FF E1 A1 62 FF DE 9A 5B FF CE 8B 50 FF A9 78' + '50 FF A5 76 50 FF AD 70 41 FF AE 59 20 FF C1 85' + '64 FF FD FF FF FF FF FF FF FF 9A 9A 9A FF 00 00' + '00 FF 00 00 00 61 00 00 00 F3 69 69 69 FF FF FF' + 'FF FF FF FF FF FF E2 E0 E0 FF DA D6 D4 FF DE DA' + 'D6 FF DF DB D7 FF E0 DB D7 FF E0 DC D8 FF E0 DC' + 'D8 FF E1 DD D9 FF E1 DD D9 FF E1 DE D9 FF E1 DE' + 'DA FF E1 DE DA FF E1 DE DA FF E1 DD D9 FF E1 DD' + 'D9 FF E0 DC D8 FF DF DB D7 FF E1 DC D7 FF E4 DC' + 'D4 FF E3 DA D2 FF E1 D9 D3 FF D8 D5 D3 FF E5 E3' + 'E2 FF FE FE FE FF FF FF FF FF 9B 9B 9B FF 00 00' + '00 FF 00 00 00 63 00 00 00 DE 3A 3A 3A FF F2 F2' + 'F2 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' - 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FE FE' - 'FE FF 67 67 67 FF 00 00 00 FF 00 00 00 45 00 00' - '00 7A 01 01 01 FF 5D 5D 5D FF C3 C3 C3 FF D3 D3' - 'D3 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1' + 'FF FF FF FF FF FF FE FE FE FF 67 67 67 FF 00 00' + '00 FF 00 00 00 45 00 00 00 7A 01 01 01 FF 5D 5D' + '5D FF C3 C3 C3 FF D3 D3 D3 FF D1 D1 D1 FF D1 D1' 'D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1' 'D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1' 'D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1' - 'D1 FF D0 D0 D0 FF D0 D0 D0 FF CF CF CF FF CF CF' - 'CF FF CE CE CE FF CF CF CF FF C9 C9 C9 FF 7B 7B' - '7B FF 0B 0B 0B FF 00 00 00 BF 00 00 00 0A 00 00' - '00 07 00 00 00 98 00 00 00 FD 08 08 08 FF 11 11' - '11 FF 10 10 10 FF 10 10 10 FF 10 10 10 FF 10 10' + 'D1 FF D1 D1 D1 FF D1 D1 D1 FF D0 D0 D0 FF D0 D0' + 'D0 FF CF CF CF FF CF CF CF FF CE CE CE FF CF CF' + 'CF FF C9 C9 C9 FF 7B 7B 7B FF 0B 0B 0B FF 00 00' + '00 BF 00 00 00 0A 00 00 00 07 00 00 00 98 00 00' + '00 FD 08 08 08 FF 11 11 11 FF 10 10 10 FF 10 10' '10 FF 10 10 10 FF 10 10 10 FF 10 10 10 FF 10 10' '10 FF 10 10 10 FF 10 10 10 FF 10 10 10 FF 10 10' '10 FF 10 10 10 FF 10 10 10 FF 10 10 10 FF 10 10' '10 FF 10 10 10 FF 10 10 10 FF 10 10 10 FF 10 10' - '10 FF 10 10 10 FF 11 11 11 FF 0C 0C 0C FF 00 00' - '00 FF 00 00 00 C4 00 00 00 24 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 40 00 00 00 7D 00 00' + '10 FF 10 10 10 FF 10 10 10 FF 10 10 10 FF 11 11' + '11 FF 0C 0C 0C FF 00 00 00 FF 00 00 00 C4 00 00' + '00 24 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 40 00 00 00 7D 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 59 00 00 00 0A 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF' + 'FF FF C0 00 00 03 80 00 00 01 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 01 C0 00 00 03 FF FF FF FF FF FF' + 'FF FF FF FF FF FF 28 00 00 00 30 00 00 00 60 00' + '00 00 01 00 20 00 00 00 00 00 80 21 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 17 00 00 00 32 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 28 00 00 00 0C 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 19 00 00 00 75 00 00' + '00 C8 00 00 00 F4 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F6 00 00 00 D6 00 00 00 90 00 00' + '00 3F 00 00 00 08 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 1E 00 00 00 C7 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 E3 00 00 00 4A 00 00 00 06 00 00 00 00 00 00' + '00 04 00 00 00 B0 00 00 00 FF 05 05 05 FF 47 47' + '47 FF 83 83 83 FF 90 90 90 FF 8E 8E 8E FF 8E 8E' + '8E FF 8E 8E 8E FF 8D 8D 8D FF 8D 8D 8D FF 8D 8D' + '8D FF 8D 8D 8D FF 8C 8C 8C FF 8C 8C 8C FF 8C 8C' + '8C FF 8B 8B 8B FF 8B 8B 8B FF 8B 8B 8B FF 8B 8B' + '8B FF 8B 8B 8B FF 8A 8A 8A FF 8A 8A 8A FF 8A 8A' + '8A FF 89 89 89 FF 89 89 89 FF 89 89 89 FF 89 89' + '89 FF 89 89 89 FF 88 88 88 FF 88 88 88 FF 88 88' + '88 FF 87 87 87 FF 87 87 87 FF 87 87 87 FF 87 87' + '87 FF 87 87 87 FF 87 87 87 FF 86 86 86 FF 88 88' + '88 FF 83 83 83 FF 53 53 53 FF 0B 0B 0B FF 00 00' + '00 FF 00 00 00 D5 00 00 00 34 00 00 00 01 00 00' + '00 52 00 00 00 FF 06 06 06 FF 8B 8B 8B FF FB FB' + 'FB FF FF FF FF FF FE FE FE FF FC FC FC FF FA FA' + 'FA FF F9 F9 F9 FF F8 F8 F8 FF F6 F6 F6 FF F5 F5' + 'F5 FF F4 F4 F4 FF F2 F2 F2 FF F1 F1 F1 FF F0 F0' + 'F0 FF EE EE EE FF ED ED ED FF EB EB EB FF EA EA' + 'EA FF E9 E9 E9 FF E7 E7 E7 FF E5 E5 E5 FF E5 E5' + 'E5 FF E3 E3 E3 FF E1 E1 E1 FF E0 E0 E0 FF DF DF' + 'DF FF DD DD DD FF DC DC DC FF DB DB DB FF D9 D9' + 'D9 FF D8 D8 D8 FF D6 D6 D6 FF D5 D5 D5 FF D3 D3' + 'D3 FF D2 D2 D2 FF D1 D1 D1 FF CF CF CF FF CD CD' + 'CD FF D1 D1 D1 FF EA EA EA FF 98 98 98 FF 0C 0C' + '0C FF 00 00 00 FF 00 00 00 8D 00 00 00 0A 00 00' + '00 C3 00 00 00 FF 49 49 49 FF FA FA FA FF FE FE' + 'FE FF F7 F7 F7 FF F7 F7 F7 FF F5 F5 F5 FF F3 F3' + 'F3 FF F2 F2 F2 FF F0 F0 F0 FF EF EF EF FF EE EE' + 'EE FF EC EC EC FF EA EA EA FF E9 E9 E9 FF E8 E8' + 'E8 FF E6 E6 E6 FF E5 E5 E5 FF E3 E3 E3 FF E2 E2' + 'E2 FF E1 E1 E1 FF DF DF DF FF DD DD DD FF DC DC' + 'DC FF DA DA DA FF D9 D9 D9 FF D8 D8 D8 FF D6 D6' + 'D6 FF D4 D4 D4 FF D3 D3 D3 FF D2 D2 D2 FF D0 D0' + 'D0 FF CF CF CF FF CD CD CD FF CC CC CC FF CB CB' + 'CB FF C9 C9 C9 FF C7 C7 C7 FF C6 C6 C6 FF C5 C5' + 'C5 FF C2 C2 C2 FF C2 C2 C2 FF E6 E6 E6 FF 73 73' + '73 FF 00 00 00 FF 00 00 00 D4 00 00 00 27 00 00' + '00 F3 00 00 00 FF 84 84 84 FF FF FF FF FF FA FA' + 'FA FF F8 F8 F8 FF F7 F7 F7 FF F6 F6 F7 FF F4 F5' + 'F5 FF F3 F4 F4 FF F1 F2 F3 FF EF F0 F1 FF EE EF' + 'F0 FF ED ED EE FF EA EB EC FF E9 EA EB FF E8 E8' + 'E9 FF E6 E7 E7 FF E5 E6 E6 FF E3 E4 E5 FF E1 E2' + 'E3 FF E0 E1 E1 FF DF DF E0 FF DD DE DE FF DC DC' + 'DD FF DA DB DB FF D8 D9 DA FF D7 D8 D9 FF D6 D6' + 'D7 FF D4 D4 D5 FF D3 D3 D4 FF D1 D2 D2 FF CF D0' + 'D1 FF CE CF CF FF CD CD CE FF CB CC CC FF CA CB' + 'CB FF C8 C9 CA FF C6 C7 C8 FF C5 C6 C7 FF C4 C4' + 'C4 FF C5 C4 C4 FF C1 C1 C1 FF D7 D7 D7 FF AD AD' + 'AD FF 00 00 00 FF 00 00 00 F9 00 00 00 38 00 00' + '00 F0 00 00 00 FF 8F 8F 8F FF FF FF FF FF FC FC' + 'FC FF FA FA FA FF FB FB FB FF FC FC FD FF FB FC' + 'FC FF FB FB FB FF FA FA FA FF F9 FA FA FF F9 F9' + 'FA FF F8 F8 F9 FF F7 F8 F8 FF F7 F7 F7 FF F6 F6' + 'F6 FF F5 F5 F6 FF F4 F5 F5 FF F4 F5 F5 FF F3 F4' + 'F4 FF F3 F3 F3 FF F2 F2 F3 FF F2 F2 F2 FF F1 F1' + 'F2 FF F0 F1 F1 FF EF F0 F0 FF EF EF F0 FF EE EF' + 'EF FF ED EE EE FF ED ED EE FF EC ED ED FF EB EC' + 'EC FF EB EB EC FF EA EB EB FF E9 EA EA FF E9 EA' + 'EA FF E8 E9 E9 FF E7 E8 E8 FF E8 E8 E8 FF DE DE' + 'DE FF C6 C6 C6 FF C4 C4 C4 FF D0 D0 D0 FF AD AD' + 'AD FF 00 00 00 FF 00 00 00 F7 00 00 00 37 00 00' + '00 F0 00 00 00 FF 8D 8D 8D FF FF FF FF FF FE FE' + 'FE FF FC FC FD FF E3 E1 DF FF D3 99 70 FF D6 93' + '65 FF D9 99 6B FF DB 9D 6E FF DD A1 72 FF E0 A4' + '76 FF E1 A8 79 FF E4 AC 7D FF E6 AF 80 FF E8 B2' + '83 FF EA B4 85 FF EB B7 87 FF EC B9 89 FF ED BA' + '8B FF EE BB 8B FF EE BB 8B FF EE BB 8B FF ED BA' + '8B FF ED B9 89 FF EB B7 87 FF EA B5 86 FF E9 B2' + '83 FF E6 AF 81 FF E5 AC 7E FF E3 A9 7A FF E1 A5' + '76 FF DF A2 74 FF DD 9E 70 FF DB 9A 6C FF D8 97' + '69 FF D6 93 65 FF D3 8E 60 FF D3 8F 62 FF E6 D7' + 'CD FF C9 CC CD FF C5 C5 C5 FF D2 D2 D2 FF AA AA' + 'AA FF 00 00 00 FF 00 00 00 F7 00 00 00 37 00 00' + '00 F0 00 00 00 FF 8B 8B 8B FF FF FF FF FF FF FF' + 'FF FF FD FF FF FF D8 D3 D1 FF BE 67 2C FF C1 5F' + '1B FF C5 67 25 FF C8 6C 29 FF CB 72 2F FF CE 77' + '34 FF D0 7C 38 FF D3 80 3D FF D6 85 41 FF D9 89' + '44 FF DB 8C 47 FF DD 8F 4B FF DE 91 4C FF DF 93' + '4E FF E0 95 50 FF E0 95 50 FF E0 94 50 FF DF 93' + '4E FF DE 91 4D FF DC 8F 49 FF DB 8B 47 FF D8 88' + '43 FF D5 84 40 FF D3 7F 3C FF D0 7B 37 FF CD 75' + '32 FF CA 70 2D FF C7 6C 29 FF C4 66 23 FF C0 60' + '1E FF BC 5B 1A FF B9 53 11 FF B9 54 13 FF DF C8' + 'B9 FF CC CF D2 FF C6 C6 C6 FF D3 D3 D3 FF AB AB' + 'AB FF 00 00 00 FF 00 00 00 F7 00 00 00 37 00 00' + '00 F0 00 00 00 FF 8B 8B 8B FF FF FF FF FF FF FF' + 'FF FF FE FF FF FF DA D5 D3 FF BE 6A 32 FF C1 62' + '21 FF C5 6A 2B FF C7 6F 2F FF CA 74 34 FF CD 78' + '38 FF CF 7D 3C FF D2 81 40 FF D5 84 43 FF D7 88' + '47 FF D8 8B 4A FF DA 8E 4C FF DC 90 4E FF DD 92' + '50 FF DD 92 51 FF DD 92 51 FF DD 92 50 FF DD 91' + '4F FF DB 8F 4E FF DA 8D 4B FF D9 8A 49 FF D6 87' + '46 FF D4 83 42 FF D2 80 3F FF CF 7C 3B FF CC 77' + '37 FF CA 73 32 FF C7 6E 2E FF C3 68 29 FF C1 64' + '24 FF BD 5F 20 FF B9 57 18 FF BA 57 1A FF E0 C9' + 'BB FF CD D1 D3 FF C7 C7 C7 FF D5 D5 D5 FF AA AA' + 'AA FF 00 00 00 FF 00 00 00 F7 00 00 00 37 00 00' + '00 F0 00 00 00 FF 8A 8A 8A FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF DA D6 D3 FF BC 68 30 FF BF 5F' + '1E FF C3 66 27 FF C5 6B 2C FF C8 70 30 FF CB 74' + '34 FF CD 78 38 FF D0 7C 3B FF D2 80 3F FF D4 83' + '42 FF D6 85 44 FF D7 88 47 FF D8 8A 48 FF D9 8B' + '4A FF DA 8C 4B FF DA 8C 4B FF D9 8C 4B FF D9 8B' + '4A FF D8 8A 48 FF D6 87 46 FF D5 85 44 FF D4 82' + '41 FF D1 7E 3E FF D0 7B 3B FF CD 77 37 FF CA 73' + '33 FF C8 6E 2F FF C5 6A 2B FF C2 65 26 FF BF 60' + '21 FF BC 5B 1C FF B7 53 15 FF B8 55 18 FF E0 C9' + 'BB FF CE D2 D4 FF C9 C9 C9 FF D6 D6 D6 FF AA AA' + 'AA FF 00 00 00 FF 00 00 00 F7 00 00 00 37 00 00' + '00 F0 00 00 00 FF 8A 8A 8A FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF DA D6 D3 FF BA 65 2D FF BD 5B' + '1B FF C0 63 24 FF C2 67 28 FF C5 6C 2C FF C8 70' + '30 FF CA 73 34 FF CD 77 37 FF CF 7B 3A FF D1 7D' + '3D FF D2 80 3F FF D4 83 42 FF D5 84 43 FF D6 86' + '45 FF D6 86 45 FF D6 86 45 FF D6 86 45 FF D5 85' + '44 FF D5 84 43 FF D3 82 41 FF D2 80 3F FF D1 7D' + '3C FF CF 7A 39 FF CD 76 36 FF CA 73 33 FF C7 6F' + '2F FF C5 6A 2B FF C2 66 27 FF BF 61 22 FF BC 5D' + '1E FF B9 58 19 FF B5 50 12 FF B6 52 15 FF E0 C9' + 'BB FF D0 D4 D6 FF CB CB CB FF D7 D7 D7 FF A9 A9' + 'A9 FF 00 00 00 FF 00 00 00 F7 00 00 00 37 00 00' + '00 F0 00 00 00 FF 89 89 89 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF DA D6 D3 FF B8 62 2A FF BA 57' + '17 FF BE 5E 20 FF C0 63 24 FF C3 67 28 FF C6 6B' + '2C FF C8 6F 2F FF CA 72 32 FF CC 76 35 FF CD 78' + '38 FF CF 7B 3A FF D0 7D 3C FF D1 7E 3D FF D2 80' + '3F FF D2 80 3F FF D2 80 3F FF D2 80 3F FF D2 7F' + '3E FF D1 7E 3E FF CF 7C 3C FF CE 7A 3A FF CD 77' + '37 FF CB 74 34 FF CA 71 32 FF C7 6E 2E FF C5 6A' + '2B FF C3 66 27 FF C0 62 23 FF BD 5D 1F FF BB 59' + '1A FF B7 54 16 FF B3 4D 0F FF B5 4E 11 FF E0 C9' + 'BA FF D1 D5 D7 FF CC CC CC FF D8 D8 D8 FF A8 A8' + 'A8 FF 00 00 00 FF 00 00 00 F7 00 00 00 37 00 00' + '00 F0 00 00 00 FF 88 88 88 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF DA D5 D3 FF B6 5E 27 FF B7 53' + '13 FF BB 5A 1C FF BD 5F 20 FF C0 63 24 FF C3 66' + '27 FF C5 6A 2A FF C7 6D 2E FF C9 71 31 FF CA 73' + '33 FF CC 75 35 FF CD 77 37 FF CE 79 38 FF CF 7A' + '3A FF CF 7B 3A FF CF 7B 3A FF CF 7A 3A FF CE 7A' + '39 FF CE 78 38 FF CC 77 36 FF CB 75 35 FF CA 72' + '32 FF C8 6F 2F FF C7 6D 2E FF C4 69 2A FF C2 65' + '26 FF C0 62 23 FF BD 5E 1F FF BA 59 1B FF B8 55' + '17 FF B5 51 13 FF B1 4A 0B FF B2 4B 0E FF E0 C8' + 'BA FF D2 D6 D8 FF CD CD CD FF D9 D9 D9 FF A7 A7' + 'A7 FF 00 00 00 FF 00 00 00 F7 00 00 00 37 00 00' + '00 F0 00 00 00 FF 87 87 87 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF D8 D4 D1 FF B4 5A 23 FF B5 4E' + '0F FF B9 56 18 FF BB 5A 1B FF BD 5E 1F FF C0 62' + '23 FF C2 65 25 FF C3 68 29 FF C6 6B 2C FF C7 6D' + '2E FF C8 70 30 FF C9 71 31 FF CA 73 32 FF CB 74' + '34 FF CB 75 34 FF CB 75 34 FF CB 74 34 FF CB 74' + '33 FF CA 72 32 FF C9 71 31 FF C8 6F 2F FF C6 6D' + '2D FF C5 6A 2A FF C3 67 28 FF C1 64 25 FF BE 60' + '22 FF BD 5D 1E FF BA 59 1A FF B8 55 17 FF B6 51' + '13 FF B3 4C 0F FF AF 46 07 FF AF 47 0A FF DF C7' + 'BA FF D4 D8 DB FF CF CF CF FF DB DB DB FF A6 A6' + 'A6 FF 00 00 00 FF 00 00 00 F7 00 00 00 37 00 00' + '00 F0 00 00 00 FF 86 86 86 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF D6 D1 CE FF B1 55 1E FF B2 4A' + '0B FF B6 51 13 FF B7 54 16 FF BA 59 1A FF BC 5D' + '1E FF BE 60 20 FF BF 62 23 FF C2 65 26 FF C3 67' + '28 FF C4 69 2A FF C5 6B 2B FF C6 6C 2C FF C7 6D' + '2E FF C7 6E 2E FF C7 6E 2E FF C7 6E 2E FF C6 6D' + '2E FF C6 6C 2C FF C5 6A 2B FF C4 69 29 FF C3 67' + '28 FF C1 64 25 FF BF 62 23 FF BE 5F 20 FF BC 5C' + '1D FF BC 58 19 FF BD 54 12 FF BA 4F 0D FF B7 4C' + '0C FF B0 48 0A FF AC 41 03 FF AD 43 07 FF DF C7' + 'BA FF D6 DA DC FF D0 D0 D0 FF DC DC DC FF A5 A5' + 'A5 FF 00 00 00 FF 00 00 00 F7 00 00 00 37 00 00' + '00 F0 00 00 00 FF 85 85 85 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF D4 CF CC FF AE 51 1A FF B0 45' + '06 FF B3 4D 0F FF B4 50 12 FF B7 54 16 FF B9 58' + '19 FF BB 5A 1C FF BC 5D 1F FF BE 60 21 FF BF 62' + '23 FF C0 63 24 FF C1 65 25 FF C3 66 26 FF C3 68' + '28 FF C3 68 29 FF C3 68 29 FF C3 68 29 FF C3 67' + '28 FF C3 66 27 FF C1 65 25 FF C0 63 23 FF BF 61' + '22 FF BD 5E 1F FF BC 5D 1E FF BA 5A 1B FF BB 56' + '17 FF A5 46 0C FF 7D 43 1F FF 77 46 27 FF 8D 3B' + '0B FF AE 41 02 FF AB 3E 00 FF AC 42 06 FF E0 C8' + 'BA FF D7 DB DD FF D2 D2 D2 FF DD DD DD FF A3 A3' + 'A3 FF 00 00 00 FF 00 00 00 F7 00 00 00 37 00 00' + '00 F0 00 00 00 FF 84 84 84 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF D1 CD CA FF AB 4D 16 FF AC 40' + '01 FF B0 48 0B FF B2 4C 0E FF B4 4F 11 FF B6 52' + '14 FF B7 54 16 FF B8 57 18 FF BA 58 1A FF BD 5D' + '1E FF C0 63 24 FF C3 67 27 FF C4 69 29 FF C5 6B' + '2B FF C5 6B 2C FF C6 6C 2C FF C6 6C 2C FF C5 6B' + '2C FF C5 6B 2B FF C4 69 29 FF C2 67 28 FF C1 64' + '25 FF BE 5F 20 FF BA 59 1A FF BA 53 13 FF 97 45' + '12 FF 9B 8E 85 FF C5 CB CF FF D3 DB E0 FF AC AD' + 'AD FF 83 44 21 FF A9 38 00 FF AC 42 06 FF E0 C8' + 'BB FF D8 DC DE FF D3 D3 D3 FF DF DF DF FF A3 A3' + 'A3 FF 00 00 00 FF 00 00 00 F7 00 00 00 37 00 00' + '00 F0 00 00 00 FF 83 83 83 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF CF CA C7 FF A8 4A 14 FF A9 3C' + '00 FF AD 43 06 FF B0 47 09 FF B1 4A 0B FF B2 4B' + '0E FF B4 4F 11 FF B8 56 18 FF BF 62 22 FF C4 6A' + '2A FF C7 6E 2E FF C8 70 2F FF C9 70 30 FF CA 72' + '32 FF CA 72 32 FF CA 72 32 FF CA 72 32 FF CA 72' + '32 FF C9 71 31 FF C9 70 30 FF C8 6F 2F FF C7 6E' + '2E FF C5 6B 2C FF C3 67 28 FF C0 5B 18 FF 8D 5B' + '3C FF EA F2 F7 FF F6 F5 F6 FF E6 E5 E4 FF CD D2' + 'D4 FF 6C 64 5E FF 91 2D 00 FF AF 43 06 FF E1 C9' + 'BB FF D9 DD E0 FF D4 D4 D4 FF E0 E0 E0 FF A2 A2' + 'A2 FF 00 00 00 FF 00 00 00 F7 00 00 00 37 00 00' + '00 F0 00 00 00 FF 82 82 82 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF CD C8 C5 FF A8 4A 13 FF A9 3B' + '00 FF AA 3E 02 FF AA 3F 02 FF AD 44 07 FF B9 57' + '18 FF C1 64 24 FF C6 6C 2C FF C9 70 30 FF C9 72' + '32 FF CA 74 34 FF CC 75 35 FF CC 76 36 FF CD 78' + '37 FF CD 78 38 FF CE 79 38 FF CE 79 38 FF CD 78' + '38 FF CD 77 37 FF CC 76 36 FF CB 75 35 FF CA 73' + '33 FF C9 71 31 FF C8 6F 30 FF C3 66 24 FF 8C 6B' + '54 FF DC E2 E6 FF D1 CE CC FF B1 A5 9F FF E0 E2' + 'E4 FF 7C 7E 80 FF 74 25 00 FF B2 44 05 FF E1 C9' + 'BB FF DB DF E1 FF D5 D5 D5 FF E1 E1 E1 FF A1 A1' + 'A1 FF 00 00 00 FF 00 00 00 F7 00 00 00 37 00 00' + '00 F0 00 00 00 FF 81 81 81 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF CB C6 C3 FF A8 49 13 FF A9 3B' + '00 FF A8 3C 00 FF AE 46 09 FF BC 5C 1E FF C7 6E' + '2E FF C9 70 30 FF CA 72 32 FF CB 75 35 FF CD 77' + '37 FF CE 7A 3A FF CF 7B 3B FF D0 7D 3C FF D1 7E' + '3E FF D1 7F 3E FF D2 7F 3E FF D2 7F 3E FF D1 7E' + '3E FF D1 7E 3D FF D0 7C 3C FF CF 7B 3B FF CE 79' + '39 FF CC 77 36 FF CC 75 34 FF CB 6F 2C FF 89 60' + '42 FF CA D0 D5 FF F2 F2 F2 FF F2 F1 F0 FF FF FF' + 'FF FF 7C 72 6D FF 89 29 00 FF AF 43 06 FF E2 CA' + 'BC FF DD E1 E3 FF D7 D7 D7 FF E2 E2 E2 FF A0 A0' + 'A0 FF 00 00 00 FF 00 00 00 F7 00 00 00 37 00 00' + '00 F0 00 00 00 FF 80 80 80 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF C9 C4 C1 FF A7 48 13 FF A7 39' + '00 FF B0 49 0B FF C3 68 28 FF C7 6F 2F FF C9 71' + '31 FF CA 74 34 FF CC 77 37 FF CE 7A 3A FF D0 7C' + '3C FF D1 7F 3E FF D2 81 40 FF D4 82 41 FF D5 84' + '43 FF D5 85 44 FF D5 85 44 FF D5 85 44 FF D5 84' + '43 FF D4 84 43 FF D3 82 41 FF D2 81 40 FF D1 7F' + '3E FF CF 7C 3B FF CE 7A 39 FF D1 79 37 FF A6 5D' + '27 FF 6A 65 62 FF E0 E6 EB FF F5 FA FE FF A6 AE' + 'B3 FF 79 3C 18 FF AC 39 00 FF AC 42 06 FF E2 CA' + 'BC FF DE E2 E4 FF D8 D8 D8 FF E4 E4 E4 FF 9E 9E' + '9E FF 00 00 00 FF 00 00 00 F7 00 00 00 37 00 00' + '00 F0 00 00 00 FF 7E 7E 7E FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF C7 C2 C0 FF A5 46 11 FF AE 42' + '05 FF C2 67 27 FF C7 6E 2F FF C9 71 31 FF CB 75' + '35 FF CD 78 38 FF D0 7C 3B FF D2 7F 3F FF D3 82' + '41 FF D4 84 43 FF D6 86 46 FF D7 88 47 FF D8 89' + '48 FF D8 8A 49 FF D8 8B 49 FF D8 8B 49 FF D8 8A' + '49 FF D8 89 48 FF D6 87 47 FF D5 86 45 FF D4 84' + '43 FF D2 81 3F FF D1 7F 3D FF CF 7B 3B FF D2 79' + '37 FF 9C 56 23 FF 7A 59 40 FF 81 63 4D FF 74 41' + '1E FF B8 5B 1D FF B2 48 09 FF AB 41 04 FF E2 CA' + 'BC FF DF E3 E5 FF DA DA DA FF E5 E5 E5 FF 9E 9E' + '9E FF 00 00 00 FF 00 00 00 F7 00 00 00 37 00 00' + '00 F0 00 00 00 FF 7D 7D 7D FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF C5 BF BD FF A7 48 12 FF BE 5D' + '1C FF C8 6F 2F FF C9 71 31 FF CC 75 35 FF CF 79' + '39 FF D0 7D 3D FF D3 81 40 FF D5 84 43 FF D7 87' + '46 FF D8 8A 49 FF DA 8C 4B FF DB 8E 4C FF DC 90' + '4E FF DC 91 4F FF DC 91 4F FF DC 91 4F FF DC 91' + '4F FF DB 8F 4D FF DA 8E 4C FF D9 8C 4A FF D8 89' + '48 FF D6 86 45 FF D5 83 42 FF D3 81 40 FF CF 7A' + '38 FF D0 76 32 FF C5 6A 26 FF BD 61 1E FF C8 66' + '22 FF C8 68 27 FF BE 5D 1E FF AC 43 07 FF E2 CA' + 'BC FF E0 E5 E7 FF DC DC DC FF E6 E6 E6 FF 9D 9D' + '9D FF 00 00 00 FF 00 00 00 F7 00 00 00 37 00 00' + '00 F0 00 00 00 FF 7B 7B 7B FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF C1 BC B9 FF B2 5B 24 FF C7 6C' + '2A FF C9 70 31 FF CB 75 35 FF CE 79 39 FF D1 7E' + '3D FF D2 82 41 FF D5 85 44 FF D8 89 48 FF DA 8C' + '4B FF DC 8F 4D FF DD 92 50 FF DE 94 52 FF DF 96' + '54 FF E0 97 55 FF E0 97 55 FF E0 97 55 FF E0 97' + '54 FF DF 95 53 FF DE 94 52 FF DD 91 50 FF DA 8E' + '4D FF D9 8B 4A FF D8 88 47 FF D6 83 40 FF B2 7D' + '53 FF 96 7C 69 FF A3 86 70 FF AD 8E 79 FF 9A 8A' + '71 FF 8D 62 37 FF C3 63 22 FF B7 54 16 FF E2 CA' + 'BC FF E3 E6 E8 FF DD DD DD FF E7 E7 E7 FF 9B 9B' + '9B FF 00 00 00 FF 00 00 00 F7 00 00 00 37 00 00' + '00 F0 00 00 00 FF 7A 7A 7A FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF C0 BA B8 FF B8 64 2D FF C9 6E' + '2D FF CA 74 33 FF CD 78 38 FF D0 7D 3C FF D3 81' + '40 FF D5 85 44 FF D8 89 48 FF DB 8D 4C FF DD 91' + '4F FF DF 94 52 FF E0 97 55 FF E1 99 57 FF E2 9B' + '58 FF E3 9C 5A FF E4 9D 5A FF E4 9D 5A FF E3 9C' + '5A FF E2 9B 59 FF E1 99 57 FF E0 96 55 FF DE 93' + '51 FF DC 90 4E FF DB 8D 4B FF D2 80 3C FF B2 96' + '7F FF 96 9F A6 FF A4 A8 AB FF 86 8A 8E FF A9 B9' + 'BC FF 86 78 65 FF B9 5C 1C FF C1 61 23 FF E3 CB' + 'BD FF E2 E6 E8 FF DE DE DE FF E8 E8 E8 FF 9A 9A' + '9A FF 00 00 00 FF 00 00 00 F7 00 00 00 37 00 00' + '00 F0 00 00 00 FF 78 78 78 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF BE B8 B6 FF BA 68 30 FF CB 71' + '2F FF CD 76 36 FF CF 7B 3B FF D2 80 3F FF D5 85' + '44 FF D7 89 48 FF DA 8E 4C FF DD 92 50 FF DF 96' + '54 FF E1 99 57 FF E3 9C 5A FF E5 9E 5C FF E6 A1' + '5E FF E7 A2 60 FF E7 A3 60 FF E7 A3 60 FF E7 A2' + '5F FF E6 A1 5E FF E4 9E 5B FF E3 9C 59 FF E1 98' + '56 FF DE 95 53 FF DD 92 4F FF D5 85 41 FF A9 8A' + '71 FF C4 C9 CD FF DC DC DC FF D7 D7 D7 FF C5 C8' + 'CC FF 90 75 64 FF BB 5F 1E FF C5 67 29 FF E7 D0' + 'C2 FF EA EE F0 FF E5 E5 E5 FF EB EB EB FF 99 99' + '99 FF 00 00 00 FF 00 00 00 F7 00 00 00 37 00 00' + '00 F0 00 00 00 FF 78 78 78 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF BA B5 B2 FF B9 67 2F FF CD 74' + '32 FF CE 79 39 FF D1 7E 3E FF D4 83 42 FF D7 88' + '47 FF DA 8D 4B FF DD 91 4F FF E0 96 54 FF E1 9A' + '57 FF E4 9D 5B FF E6 A1 5E FF E8 A4 61 FF E9 A6' + '63 FF EA A8 65 FF EB A9 65 FF EB A9 65 FF EA A7' + '64 FF E9 A6 63 FF E7 A4 60 FF E6 A0 5E FF E4 9D' + '5A FF E1 99 57 FF DF 94 53 FF DF 8F 48 FF AF 89' + '69 FF C7 CC D0 FF D6 D6 D6 FF D3 D3 D3 FF C8 CD' + 'D2 FF A0 7B 5F FF C6 68 24 FF C1 65 26 FF E9 D2' + 'C4 FF F7 FB FD FF F4 F4 F4 FF F6 F6 F6 FF 98 98' + '98 FF 00 00 00 FF 00 00 00 F7 00 00 00 37 00 00' + '00 F0 00 00 00 FF 76 76 76 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF B8 B2 B0 FF B3 5C 25 FF CE 77' + '35 FF CF 7B 3B FF D2 80 40 FF D5 85 44 FF D9 8A' + '49 FF DB 8F 4D FF DF 95 53 FF E2 99 57 FF E3 9E' + '5B FF E6 A2 5F FF E9 A6 63 FF EB A9 65 FF ED AC' + '68 FF EE AE 6A FF EF AF 6B FF EF AF 6B FF EE AD' + '6A FF ED AB 68 FF EB A8 66 FF E8 A5 62 FF E6 A1' + '5E FF E3 9D 5A FF E1 98 56 FF E2 94 4E FF B4 87' + '5F FF D1 D5 D8 FF E2 E3 E4 FF E0 E1 E2 FF CE D3' + 'D8 FF AA 79 55 FF CD 6F 2A FF B9 58 1A FF E8 CF' + 'C2 FF F9 FD FF FF F7 F7 F7 FF F8 F8 F8 FF 97 97' + '97 FF 00 00 00 FF 00 00 00 F7 00 00 00 37 00 00' + '00 F0 00 00 00 FF 75 75 75 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF B7 B1 AF FF A5 47 10 FF C7 6A' + '28 FF D2 7F 3E FF D3 83 42 FF D7 88 47 FF DA 8D' + '4C FF DD 92 50 FF E0 98 56 FF E4 9C 5A FF E6 A1' + '5F FF E9 A6 63 FF EC AB 67 FF EE AE 6B FF F0 B1' + '6E FF F2 B4 71 FF F3 B5 72 FF F3 B5 71 FF F2 B4' + '70 FF F0 B1 6E FF ED AD 6A FF EB A9 66 FF E8 A5' + '62 FF E5 A0 5E FF E3 9B 59 FF E5 97 54 FF B9 81' + '50 FF A1 9D 9B FF BD BC BA FF BD BC BA FF A3 A1' + 'A0 FF AD 70 42 FF C9 69 26 FF AD 43 06 FF E9 D0' + 'C3 FF FB FE FF FF F8 F8 F8 FF F9 F9 F9 FF 95 95' + '95 FF 00 00 00 FF 00 00 00 F7 00 00 00 37 00 00' + '00 F0 00 00 00 FF 74 74 74 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF B2 AD AB FF 9C 3C 06 FF AE 45' + '06 FF CF 79 35 FF D6 7F 3A FF D9 85 3F FF DC 8A' + '44 FF DF 90 4A FF E3 96 4F FF E7 9C 54 FF EA A1' + '5A FF ED A7 5F FF F1 AC 64 FF F3 B1 68 FF F6 B5' + '6D FF F8 B9 70 FF FA BB 72 FF F9 BA 72 FF F8 B8' + '6F FF F5 B5 6C FF F2 AF 68 FF F0 AA 63 FF ED A6' + '5D FF E9 A0 58 FF E6 9A 53 FF E3 95 4E FF DE 8E' + '48 FF C2 79 3B FF B7 70 36 FF B4 6B 31 FF B6 69' + '2C FF C9 71 2F FF B1 4C 0D FF A5 39 00 FF E9 D1' + 'C3 FF FC FF FF FF FA FA FA FF FB FB FB FF 94 94' + '94 FF 00 00 00 FF 00 00 00 F7 00 00 00 37 00 00' + '00 F0 00 00 00 FF 73 73 73 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF C4 C3 C2 FF AE 93 84 FF B1 93' + '83 FF C2 A0 86 FF CE A5 83 FF CE A7 87 FF D0 AA' + '89 FF D2 AD 8C FF D3 B0 8E FF D5 B2 91 FF D7 B5' + '93 FF D8 B8 96 FF DA BA 98 FF DB BC 9B FF DD BF' + '9D FF DE C1 9F FF DE C2 A0 FF DE C2 A0 FF DE C0' + '9E FF DC BE 9C FF DB BC 9A FF DA B9 98 FF D8 B7' + '95 FF D6 B4 92 FF D4 B2 90 FF D2 AF 8E FF D2 AC' + '8B FF D3 AA 88 FF D2 A8 85 FF D0 A5 82 FF CE A2' + '7F FF C1 9E 84 FF B0 92 82 FF B2 94 83 FF EC E5' + 'E1 FF FD FE FE FF FC FC FC FF FC FC FC FF 94 94' + '94 FF 00 00 00 FF 00 00 00 F7 00 00 00 37 00 00' + '00 F4 00 00 00 FF 72 72 72 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FE FE FE FF FD FF FF FF FD FF' + 'FF FF FA FF FF FF F9 FF FF FF F9 FE FF FF F9 FE' + 'FF FF F9 FE FF FF F8 FD FF FF F8 FD FF FF F8 FD' + 'FF FF F8 FC FF FF F7 FC FF FF F7 FC FF FF F7 FB' + 'FF FF F7 FB FF FF F7 FB FF FF F7 FB FF FF F7 FB' + 'FF FF F7 FB FF FF F7 FC FF FF F7 FC FF FF F8 FC' + 'FF FF F7 FC FF FF F7 FC FF FF F7 FC FF FF F8 FD' + 'FF FF F7 FD FF FF F7 FD FF FF F7 FD FF FF F7 FD' + 'FF FF F8 FD FF FF FA FF FF FF FA FF FF FF FC FD' + 'FD FF FB FB FB FF FD FD FD FF FB FB FB FF 93 93' + '93 FF 00 00 00 FF 00 00 00 FA 00 00 00 37 00 00' + '00 DD 00 00 00 FF 4B 4B 4B FF F5 F5 F5 FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FE FE FE FF FE FE' + 'FE FF FD FD FD FF FF FF FF FF F0 F0 F0 FF 6D 6D' + '6D FF 00 00 00 FF 00 00 00 E7 00 00 00 27 00 00' + '00 7A 00 00 00 FF 0E 0E 0E FF 9A 9A 9A FF FD FD' + 'FD FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF F8 F8 F8 FF A4 A4 A4 FF 1B 1B' + '1B FF 00 00 00 FF 00 00 00 9B 00 00 00 04 00 00' + '00 0F 00 00 00 D8 00 00 00 FF 14 14 14 FF 6E 6E' + '6E FF AC AC AC FF B9 B9 B9 FF B8 B8 B8 FF B8 B8' + 'B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8' + 'B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8' + 'B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8' + 'B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8' + 'B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8' + 'B8 FF B8 B8 B8 FF B7 B7 B7 FF B7 B7 B7 FF B7 B7' + 'B7 FF B6 B6 B6 FF B6 B6 B6 FF B6 B6 B6 FF B5 B5' + 'B5 FF B5 B5 B5 FF B5 B5 B5 FF B4 B4 B4 FF B5 B5' + 'B5 FF AB AB AB FF 76 76 76 FF 1D 1D 1D FF 00 00' + '00 FF 00 00 00 FA 00 00 00 3C 00 00 00 00 00 00' + '00 00 00 00 00 52 00 00 00 F6 00 00 00 FF 00 00' + '00 FF 0C 0C 0C FF 16 16 16 FF 15 15 15 FF 15 15' + '15 FF 15 15 15 FF 15 15 15 FF 15 15 15 FF 15 15' + '15 FF 15 15 15 FF 15 15 15 FF 15 15 15 FF 15 15' + '15 FF 15 15 15 FF 15 15 15 FF 15 15 15 FF 15 15' + '15 FF 15 15 15 FF 15 15 15 FF 15 15 15 FF 15 15' + '15 FF 15 15 15 FF 15 15 15 FF 15 15 15 FF 15 15' + '15 FF 15 15 15 FF 15 15 15 FF 15 15 15 FF 15 15' + '15 FF 15 15 15 FF 15 15 15 FF 15 15 15 FF 15 15' + '15 FF 15 15 15 FF 15 15 15 FF 15 15 15 FF 16 16' + '16 FF 10 10 10 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 6F 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 39 00 00 00 B0 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 C1 00 00' + '00 51 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 49 00 00 00 80 00 00 00 84 00 00 00 84 00 00' '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' - '00 59 00 00 00 0A 00 00 00 00 00 00 00 00 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 82 00 00 00 57 00 00 00 0B 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' @@ -8718,85 +8979,30 @@ END '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' - 'FF FF FF FF FF FF FF FF FF FF C0 00 00 03 80 00' - '00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 F0 00' + '00 00 00 0F 00 00 C0 00 00 00 00 03 00 00 80 00' + '00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 01 C0 00' - '00 03 FF FF FF FF FF FF FF FF FF FF FF FF 28 00' - '00 00 10 00 00 00 20 00 00 00 01 00 20 00 00 00' - '00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 21 00 00 00 92 05 05' - '05 A8 05 05 05 A8 05 05 05 A8 05 05 05 A8 06 06' - '06 A8 06 06 06 A8 06 06 06 A8 06 06 06 A8 06 06' - '06 A8 07 07 07 A8 07 07 07 A8 06 06 06 A8 00 00' - '00 78 00 00 00 0A 0E 0E 0E B9 98 98 98 FF C9 CB' - 'CC FF C2 C4 C6 FF BF C1 C2 FF BC BE BF FF B8 BA' - 'BC FF B6 B8 B9 FF B4 B5 B7 FF B0 B2 B4 FF AE B1' - 'B2 FF AC AE B0 FF AA AC AE FF AC AC AD FF 55 55' - '55 FF 01 01 01 72 43 43 43 F3 FF FF FF FF FD F5' - 'EF FF F8 EC E3 FF F7 EC E3 FF F5 EB E2 FF F2 E9' - 'E0 FF F0 E7 DE FF ED E4 DB FF E9 DF D6 FF E5 DA' - 'D2 FF E1 D5 CC FF DC D0 C7 FF DB D6 D3 FF B0 B0' - 'B1 FF 08 08 08 AB 48 48 49 F1 FD FE FF FF CF 91' - '67 FF CA 71 31 FF D5 85 47 FF DC 90 52 FF E0 99' - '59 FF E2 9B 5B FF E0 98 59 FF DC 90 51 FF D5 84' - '46 FF CB 76 38 FF C4 66 27 FF D4 B1 9B FF B0 B5' - 'B8 FF 08 08 08 A9 46 47 47 F0 FD FE FF FF C8 84' - '58 FF C0 5D 19 FF CA 71 30 FF D0 7B 39 FF D3 81' - '3F FF D4 83 41 FF D3 80 3E FF CF 7A 38 FF C9 6E' - '2E FF C1 61 1F FF B9 51 10 FF D2 AC 96 FF B2 B7' - 'BA FF 08 08 08 A8 45 46 46 F0 FD FE FF FF C3 7D' - '52 FF B8 52 10 FF C0 64 24 FF C5 6B 2B FF C8 70' - '30 FF C9 71 31 FF C8 6F 2F FF C4 6A 2A FF BF 61' - '21 FF B3 50 12 FF B1 44 04 FF D3 AC 96 FF B3 B9' - 'BC FF 07 07 07 A8 44 45 46 F0 FC FE FE FF BC 72' - '48 FF AE 41 02 FF B8 55 17 FF C0 63 23 FF C5 6A' - '2B FF C6 6C 2D FF C5 6B 2B FF C2 63 23 FF B0 5E' - '28 FF BD A9 9D FF A3 61 3D FF D1 A6 8E FF B5 BB' - 'BD FF 06 06 06 A8 43 43 44 F0 FC FD FD FF B7 6D' - '42 FF B1 47 08 FF C5 6A 2B FF CC 76 36 FF D0 7C' - '3B FF D1 7E 3D FF D0 7C 3C FF CF 76 34 FF B4 71' - '41 FF D1 D5 D6 FF A8 79 5E FF CF A4 8C FF B7 BC' - 'BF FF 06 06 06 A8 41 42 43 F0 FA FA FB FF BE 78' - '4D FF C6 69 26 FF D1 7D 3D FF D6 86 45 FF DA 8D' - '4B FF DB 8F 4E FF DB 8D 4C FF D8 88 46 FF CB 7B' - '3E FF 9F 69 41 FF AB 57 21 FF DA B2 9A FF B7 BC' - 'C0 FF 06 06 06 A8 40 41 41 F0 F7 F8 F9 FF C8 88' - '5C FF CF 77 33 FF D8 89 47 FF DF 95 52 FF E4 9E' - '5A FF E6 A1 5E FF E5 9F 5C FF E2 95 4F FF C8 91' - '63 FF BE BF C0 FF B2 86 65 FF E2 B9 9F FF BA C0' - 'C3 FF 05 05 05 A8 3F 40 40 F0 F7 F7 F8 FF BB 79' - '4D FF CD 75 2F FF D8 8B 47 FF E1 9A 55 FF E9 A6' - '61 FF EC AD 67 FF EA A8 63 FF E5 9C 55 FF C9 8A' - '53 FF B9 AF A6 FF AE 72 49 FF E8 BF A5 FF C5 CB' - 'CE FF 04 04 04 A8 3B 3B 3B F4 FF FF FF FF DB C6' - 'BA FF E2 C5 AE FF E8 CE B7 FF EB D4 BC FF EF D9' - 'C1 FF F1 DC C4 FF EF DA C2 FF EC D5 BD FF E7 CD' - 'B6 FF DF C6 B0 FF D8 BA A7 FF F8 ED E7 FF C8 CA' - 'CB FF 02 02 02 AB 0F 0F 0F C7 AA A9 A9 FF E2 E5' - 'E7 FF DE E3 E6 FF DD E1 E5 FF DD E0 E4 FF DC E0' - 'E3 FF DC DF E3 FF DC E0 E3 FF DD E0 E4 FF DD E1' - 'E4 FF DD E0 E2 FF DE E2 E5 FF D8 DA DB FF 66 66' - '65 FF 00 00 00 78 00 00 00 2E 01 01 01 B1 0F 0F' - '0F CC 0E 0E 0E CC 0E 0E 0E CC 0E 0E 0E CC 0E 0E' - '0E CC 0E 0E 0E CC 0E 0E 0E CC 0E 0E 0E CC 0E 0E' - '0E CC 0E 0E 0E CC 0E 0E 0E CC 0C 0C 0C CB 00 00' - '00 8D 00 00 00 0D 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 FF FF 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 FF FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 01 00 00 80 00 00 00 00 03 00 00 C0 00' + '00 00 00 07 00 00 F0 00 00 00 00 0F 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00' } */ From b6880808969866ca40803e07e198b92221e4c3d9 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 20 Jun 2004 16:05:47 +0000 Subject: [PATCH 1454/1463] - Cleaned up IntVideoPortResetDisplayParameters a bit. svn path=/trunk/; revision=9762 --- reactos/drivers/video/videoprt/dispatch.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/reactos/drivers/video/videoprt/dispatch.c b/reactos/drivers/video/videoprt/dispatch.c index 8c4b27da836..e07fb3420da 100644 --- a/reactos/drivers/video/videoprt/dispatch.c +++ b/reactos/drivers/video/videoprt/dispatch.c @@ -18,7 +18,7 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: dispatch.c,v 1.5 2004/04/18 12:59:14 hbirr Exp $ + * $Id: dispatch.c,v 1.6 2004/06/20 16:05:47 navaraf Exp $ */ #include "videoprt.h" @@ -49,17 +49,19 @@ IntVideoPortResetDisplayParameters(ULONG Columns, ULONG Rows) DriverExtension = ResetDisplayParametersDeviceExtension->DriverExtension; - if (NULL == DriverExtension->InitializationData.HwResetHw || - !DriverExtension->InitializationData.HwResetHw( - &ResetDisplayParametersDeviceExtension->MiniPortDeviceExtension, - Columns, Rows)) + if (DriverExtension->InitializationData.HwResetHw != NULL) { - ResetDisplayParametersDeviceExtension = NULL; - return FALSE; + if (DriverExtension->InitializationData.HwResetHw( + &ResetDisplayParametersDeviceExtension->MiniPortDeviceExtension, + Columns, Rows)) + { + ResetDisplayParametersDeviceExtension = NULL; + return TRUE; + } } ResetDisplayParametersDeviceExtension = NULL; - return TRUE; + return FALSE; } NTSTATUS STDCALL From 6467833ecc82e6c569648bbf4f54c44786938784 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 20 Jun 2004 16:06:05 +0000 Subject: [PATCH 1455/1463] - Fixed very stupid bug with pointer handling in NtUserBuildHwndList. svn path=/trunk/; revision=9763 --- reactos/subsys/win32k/ntuser/window.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 9ab8fbb5b1f..73857010f62 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.239 2004/06/20 00:45:37 navaraf Exp $ +/* $Id: window.c,v 1.240 2004/06/20 16:06:05 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1158,7 +1158,7 @@ NtUserBuildHwndList( PETHREAD Thread; PW32THREAD W32Thread; PLIST_ENTRY Current; - PWINDOW_OBJECT *Window; + PWINDOW_OBJECT Window; Status = PsLookupThreadByThreadId((PVOID)dwThreadId, &Thread); if(!NT_SUCCESS(Status)) @@ -1178,12 +1178,12 @@ NtUserBuildHwndList( Current = W32Thread->WindowListHead.Flink; while(Current != &(W32Thread->WindowListHead)) { - *Window = CONTAINING_RECORD(Current, WINDOW_OBJECT, ThreadListEntry); - ASSERT(*Window); + Window = CONTAINING_RECORD(Current, WINDOW_OBJECT, ThreadListEntry); + ASSERT(Window); - if(dwCount < nBufSize && pWnd && ((*Window)->Style & WS_CHILD)) + if(dwCount < nBufSize && pWnd && (Window->Style & WS_CHILD)) { - Status = MmCopyToCaller(pWnd++, &(*Window)->Self, sizeof(HWND)); + Status = MmCopyToCaller(pWnd++, &Window->Self, sizeof(HWND)); if(!NT_SUCCESS(Status)) { SetLastNtError(Status); @@ -1191,7 +1191,7 @@ NtUserBuildHwndList( } } - if(!((*Window)->Style & WS_CHILD)) + if(!(Window->Style & WS_CHILD)) { dwCount++; } From 2541337d8b581ed14071d24946e509e74b327070 Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 20 Jun 2004 16:06:12 +0000 Subject: [PATCH 1456/1463] - Add HwResetHw implementation that uses VBE set mode call to restore video mode. svn path=/trunk/; revision=9764 --- reactos/drivers/video/miniport/vbe/vbemp.c | 21 +++++++++++++++++++-- reactos/drivers/video/miniport/vbe/vbemp.h | 6 ++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/video/miniport/vbe/vbemp.c b/reactos/drivers/video/miniport/vbe/vbemp.c index cf14e31a28e..372210b1d14 100644 --- a/reactos/drivers/video/miniport/vbe/vbemp.c +++ b/reactos/drivers/video/miniport/vbe/vbemp.c @@ -38,6 +38,7 @@ DriverEntry(IN PVOID Context1, IN PVOID Context2) InitData.HwFindAdapter = VBEFindAdapter; InitData.HwInitialize = VBEInitialize; InitData.HwStartIO = VBEStartIO; + InitData.HwResetHw = VBEResetHw; InitData.HwGetPowerState = VBEGetPowerState; InitData.HwSetPowerState = VBESetPowerState; InitData.HwDeviceExtensionSize = sizeof(VBE_DEVICE_EXTENSION); @@ -510,6 +511,21 @@ VBEStartIO( return TRUE; } +/* + * VBEResetHw + * + * This function is called to reset the hardware to a known state. + */ + +BOOLEAN STDCALL +VBEResetHw( + PVOID DeviceExtension, + ULONG Columns, + ULONG Rows) +{ + return VBEResetDevice(DeviceExtension, NULL); +} + /* * VBEGetPowerState * @@ -582,12 +598,13 @@ VBEResetDevice( PVBE_DEVICE_EXTENSION DeviceExtension, PSTATUS_BLOCK StatusBlock) { - VIDEO_X86_BIOS_ARGUMENTS BiosRegisters; + KV86M_REGISTERS BiosRegisters; + InitializeVideoAddressSpace(); VideoPortZeroMemory(&BiosRegisters, sizeof(BiosRegisters)); BiosRegisters.Eax = 0x4F02; BiosRegisters.Ebx = 0x3; - VideoPortInt10(NULL, &BiosRegisters); + Ke386CallBios(0x10, &BiosRegisters); return TRUE; } diff --git a/reactos/drivers/video/miniport/vbe/vbemp.h b/reactos/drivers/video/miniport/vbe/vbemp.h index 6753733cb9a..58ceed90aa4 100644 --- a/reactos/drivers/video/miniport/vbe/vbemp.h +++ b/reactos/drivers/video/miniport/vbe/vbemp.h @@ -168,6 +168,12 @@ VBEStartIO( PVOID HwDeviceExtension, PVIDEO_REQUEST_PACKET RequestPacket); +BOOLEAN STDCALL +VBEResetHw( + PVOID DeviceExtension, + ULONG Columns, + ULONG Rows); + VP_STATUS STDCALL VBEGetPowerState( PVOID HwDeviceExtension, From 10400889eb00c545a7bbb8ca2cf16f8784bc5d26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= <ge@gse.nl> Date: Sun, 20 Jun 2004 16:27:14 +0000 Subject: [PATCH 1457/1463] Activate window on non-client click too svn path=/trunk/; revision=9765 --- reactos/subsys/win32k/include/msgqueue.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/include/msgqueue.h b/reactos/subsys/win32k/include/msgqueue.h index 603865662e3..ddf4e45d349 100644 --- a/reactos/subsys/win32k/include/msgqueue.h +++ b/reactos/subsys/win32k/include/msgqueue.h @@ -233,7 +233,11 @@ LPARAM FASTCALL MsqGetMessageExtraInfo(VOID); ((message) == WM_LBUTTON##code || \ (message) == WM_MBUTTON##code || \ (message) == WM_RBUTTON##code || \ - (message) == WM_XBUTTON##code ) + (message) == WM_XBUTTON##code || \ + (message) == WM_NCLBUTTON##code || \ + (message) == WM_NCMBUTTON##code || \ + (message) == WM_NCRBUTTON##code || \ + (message) == WM_NCXBUTTON##code ) #endif /* _WIN32K_MSGQUEUE_H */ From 1c4f8bd790b99ff85c6e4fd904a29a7b4d46d57a Mon Sep 17 00:00:00 2001 From: Filip Navara <filip.navara@gmail.com> Date: Sun, 20 Jun 2004 16:37:15 +0000 Subject: [PATCH 1458/1463] - Fix video mode list traversing. Reported by Royce Mitchel III. svn path=/trunk/; revision=9767 --- 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 372210b1d14..960efcfd16f 100644 --- a/reactos/drivers/video/miniport/vbe/vbemp.c +++ b/reactos/drivers/video/miniport/vbe/vbemp.c @@ -324,7 +324,7 @@ VBEInitialize(PVOID HwDeviceExtension) */ for (CurrentMode = 0, ModeCount = 0, DefaultMode = 0; - ModeList[CurrentMode] != 0xFFFF && CurrentMode < 0x400; + ModeList[CurrentMode] != 0xFFFF && ModeList[CurrentMode] != 0; CurrentMode++) { BiosRegisters.Eax = 0x4F01; From 8350c577cb7a32c999defc321aeecaf446f6c89f Mon Sep 17 00:00:00 2001 From: Royce Mitchell III <royce3@ev1.net> Date: Sun, 20 Jun 2004 16:43:58 +0000 Subject: [PATCH 1459/1463] fixed that stupid run dialog not defaulting to the combobox.... finally! patch submitted to wine also already. svn path=/trunk/; revision=9768 --- reactos/lib/shell32/shell32_Ca.rc | 2 +- reactos/lib/shell32/shell32_Cn.rc | 2 +- reactos/lib/shell32/shell32_Cs.rc | 2 +- reactos/lib/shell32/shell32_Da.rc | 2 +- reactos/lib/shell32/shell32_De.rc | 2 +- reactos/lib/shell32/shell32_En.rc | 2 +- reactos/lib/shell32/shell32_Eo.rc | 2 +- reactos/lib/shell32/shell32_Es.rc | 2 +- reactos/lib/shell32/shell32_Fi.rc | 2 +- reactos/lib/shell32/shell32_Fr.rc | 2 +- reactos/lib/shell32/shell32_Hu.rc | 2 +- reactos/lib/shell32/shell32_It.rc | 2 +- reactos/lib/shell32/shell32_Ja.rc | 2 +- reactos/lib/shell32/shell32_Ko.rc | 2 +- reactos/lib/shell32/shell32_Nl.rc | 2 +- reactos/lib/shell32/shell32_No.rc | 2 +- reactos/lib/shell32/shell32_Pl.rc | 2 +- reactos/lib/shell32/shell32_Pt.rc | 2 +- reactos/lib/shell32/shell32_Ru.rc | 2 +- reactos/lib/shell32/shell32_Si.rc | 2 +- reactos/lib/shell32/shell32_Sk.rc | 2 +- reactos/lib/shell32/shell32_Sv.rc | 2 +- reactos/lib/shell32/shell32_Wa.rc | 2 +- reactos/lib/shell32/shell32_Zh.rc | 2 +- 24 files changed, 24 insertions(+), 24 deletions(-) diff --git a/reactos/lib/shell32/shell32_Ca.rc b/reactos/lib/shell32/shell32_Ca.rc index da9faa9e65f..ca2f8e57e95 100644 --- a/reactos/lib/shell32/shell32_Ca.rc +++ b/reactos/lib/shell32/shell32_Ca.rc @@ -38,7 +38,7 @@ FONT 8, "Helv" ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE LTEXT "Type the name of a program, folder, document, or Internet resource, and Wine will open it for you.", 12289, 36, 11, 182, 18 LTEXT "&Open:", 12305, 7, 39, 24, 10 - CONTROL "", 12298, "COMBOBOX", WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + 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 "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP diff --git a/reactos/lib/shell32/shell32_Cn.rc b/reactos/lib/shell32/shell32_Cn.rc index 466bcee7d56..e60850aee4b 100644 --- a/reactos/lib/shell32/shell32_Cn.rc +++ b/reactos/lib/shell32/shell32_Cn.rc @@ -39,7 +39,7 @@ FONT 8, "Helv" ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE LTEXT "输入程序,目录,文件或者Internet资源名,Wine将为您打开它。", 12289, 36, 11, 182, 18 LTEXT "打开(&O):", 12305, 7, 39, 24, 10 - CONTROL "", 12298, "COMBOBOX", WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 DEFPUSHBUTTON "确定", IDOK, 62, 63, 50, 14, WS_TABSTOP PUSHBUTTON "取消", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP PUSHBUTTON "浏览(&B)...", 12288, 170, 63, 50, 14, WS_TABSTOP diff --git a/reactos/lib/shell32/shell32_Cs.rc b/reactos/lib/shell32/shell32_Cs.rc index ed5592ba28d..0f86d0f510f 100644 --- a/reactos/lib/shell32/shell32_Cs.rc +++ b/reactos/lib/shell32/shell32_Cs.rc @@ -125,7 +125,7 @@ FONT 8, "Helv" ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE LTEXT "Zadejte n醶ev programu, slo瀔y, dokumentu, nebo zdroje v s韙i Internet a Wine jej pro v醩 otev鴈.", 12289, 36, 11, 182, 18 LTEXT "&Otevt:", 12305, 7, 39, 24, 10 - CONTROL "", 12298, "COMBOBOX", WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + 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 "Storno", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP PUSHBUTTON "&Proch醶et...", 12288, 170, 63, 50, 14, WS_TABSTOP diff --git a/reactos/lib/shell32/shell32_Da.rc b/reactos/lib/shell32/shell32_Da.rc index e4423547c10..575f679f738 100644 --- a/reactos/lib/shell32/shell32_Da.rc +++ b/reactos/lib/shell32/shell32_Da.rc @@ -38,7 +38,7 @@ FONT 8, "Helv" ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE LTEXT "Type the name of a program, folder, document, or Internet resource, and Wine will open it for you.", 12289, 36, 11, 182, 18 LTEXT "&Open:", 12305, 7, 39, 24, 10 - CONTROL "", 12298, "COMBOBOX", WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + 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 "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP diff --git a/reactos/lib/shell32/shell32_De.rc b/reactos/lib/shell32/shell32_De.rc index 4ed1ff687f1..354b6e8ad6c 100644 --- a/reactos/lib/shell32/shell32_De.rc +++ b/reactos/lib/shell32/shell32_De.rc @@ -38,7 +38,7 @@ FONT 8, "Helv" ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE LTEXT "Den Namen eines Programmes, eines Ordners, eines Dokumentes, oder einer Internet Ressource eingeben, und Wine wird es f黵 Sie 鰂fnen.", 12289, 36, 11, 182, 18 LTEXT "&謋fnen:", 12305, 7, 39, 24, 10 - CONTROL "", 12298, "COMBOBOX", WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + 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 "L鰏chen", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP PUSHBUTTON "&Suchen...", 12288, 170, 63, 50, 14, WS_TABSTOP diff --git a/reactos/lib/shell32/shell32_En.rc b/reactos/lib/shell32/shell32_En.rc index b272d445bab..6b5c680bc71 100644 --- a/reactos/lib/shell32/shell32_En.rc +++ b/reactos/lib/shell32/shell32_En.rc @@ -124,7 +124,7 @@ FONT 8, "Helv" ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE LTEXT "Type the name of a program, folder, document, or Internet resource, and Wine will open it for you.", 12289, 36, 11, 182, 18 LTEXT "&Open:", 12305, 7, 39, 24, 10 - CONTROL "", 12298, "COMBOBOX", WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + 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 "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP diff --git a/reactos/lib/shell32/shell32_Eo.rc b/reactos/lib/shell32/shell32_Eo.rc index be6e5313896..a453b7085d4 100644 --- a/reactos/lib/shell32/shell32_Eo.rc +++ b/reactos/lib/shell32/shell32_Eo.rc @@ -38,7 +38,7 @@ FONT 8, "Helv" ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE LTEXT "Type the name of a program, folder, document, or Internet resource, and Wine will open it for you.", 12289, 36, 11, 182, 18 LTEXT "&Open:", 12305, 7, 39, 24, 10 - CONTROL "", 12298, "COMBOBOX", WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + 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 "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP diff --git a/reactos/lib/shell32/shell32_Es.rc b/reactos/lib/shell32/shell32_Es.rc index 1005d9668a1..09b12960399 100644 --- a/reactos/lib/shell32/shell32_Es.rc +++ b/reactos/lib/shell32/shell32_Es.rc @@ -39,7 +39,7 @@ FONT 8, "Helv" ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE LTEXT "Introduzca el nombre de un programa, carpeta, documento o recurso de Internet, y Wine lo abrir para usted.", 12289, 36, 11, 182, 18 LTEXT "&Abrir:", 12305, 7, 39, 24, 10 - CONTROL "", 12298, "COMBOBOX", WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 DEFPUSHBUTTON "Aceptar", IDOK, 62, 63, 50, 14, WS_TABSTOP PUSHBUTTON "Cancelar", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP PUSHBUTTON "&Examinar...", 12288, 170, 63, 50, 14, WS_TABSTOP diff --git a/reactos/lib/shell32/shell32_Fi.rc b/reactos/lib/shell32/shell32_Fi.rc index 5e0fd72b709..ce01781c3de 100644 --- a/reactos/lib/shell32/shell32_Fi.rc +++ b/reactos/lib/shell32/shell32_Fi.rc @@ -38,7 +38,7 @@ FONT 8, "Helv" ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE LTEXT "Type the name of a program, folder, document, or Internet resource, and Wine will open it for you.", 12289, 36, 11, 182, 18 LTEXT "&Open:", 12305, 7, 39, 24, 10 - CONTROL "", 12298, "COMBOBOX", WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + 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 "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP diff --git a/reactos/lib/shell32/shell32_Fr.rc b/reactos/lib/shell32/shell32_Fr.rc index 2870ccb918f..3a5e493602b 100644 --- a/reactos/lib/shell32/shell32_Fr.rc +++ b/reactos/lib/shell32/shell32_Fr.rc @@ -127,7 +127,7 @@ FONT 8, "Helv" ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE LTEXT "Entrez le nom d'un programme, d'un dossier, d'un document ou d'une ressource Internet, et Wine l'ouvrira pour vous.", 12289, 36, 11, 182, 18 LTEXT "&Ouvrir :", 12305, 7, 39, 24, 10 - CONTROL "", 12298, "COMBOBOX", WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + 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 "Annuler", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP PUSHBUTTON "&Parcourir...", 12288, 170, 63, 50, 14, WS_TABSTOP diff --git a/reactos/lib/shell32/shell32_Hu.rc b/reactos/lib/shell32/shell32_Hu.rc index a76d6e7b19e..aac73f2be50 100644 --- a/reactos/lib/shell32/shell32_Hu.rc +++ b/reactos/lib/shell32/shell32_Hu.rc @@ -38,7 +38,7 @@ FONT 8, "Helv" ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE LTEXT "Type the name of a program, folder, document, or Internet resource, and Wine will open it for you.", 12289, 36, 11, 182, 18 LTEXT "&Open:", 12305, 7, 39, 24, 10 - CONTROL "", 12298, "COMBOBOX", WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + 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 "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP diff --git a/reactos/lib/shell32/shell32_It.rc b/reactos/lib/shell32/shell32_It.rc index 2ef2b8bc76d..1ee91c4d999 100644 --- a/reactos/lib/shell32/shell32_It.rc +++ b/reactos/lib/shell32/shell32_It.rc @@ -125,7 +125,7 @@ FONT 8, "Helv" ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE LTEXT "Digitare il nome del programma, della cartella, del documento o della risorsa internet, e Wine la aprir.", 12289, 36, 11, 182, 18 LTEXT "&Apri:", 12305, 7, 39, 24, 10 - CONTROL "", 12298, "COMBOBOX", WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + 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 "Annulla", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP PUSHBUTTON "&Esplora...", 12288, 170, 63, 50, 14, WS_TABSTOP diff --git a/reactos/lib/shell32/shell32_Ja.rc b/reactos/lib/shell32/shell32_Ja.rc index 0cbe933bad4..aea34108b56 100644 --- a/reactos/lib/shell32/shell32_Ja.rc +++ b/reactos/lib/shell32/shell32_Ja.rc @@ -118,7 +118,7 @@ FONT 8, "Helv" ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE LTEXT "Type the name of a program, folder, document, or Internet resource, and Wine will open it for you.", 12289, 36, 11, 182, 18 LTEXT "&Open:", 12305, 7, 39, 24, 10 - CONTROL "", 12298, "COMBOBOX", WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + 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 "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP diff --git a/reactos/lib/shell32/shell32_Ko.rc b/reactos/lib/shell32/shell32_Ko.rc index ed4fc3311d7..68fc5e7398e 100644 --- a/reactos/lib/shell32/shell32_Ko.rc +++ b/reactos/lib/shell32/shell32_Ko.rc @@ -38,7 +38,7 @@ FONT 8, "Helv" ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE LTEXT "Type the name of a program, folder, document, or Internet resource, and Wine will open it for you.", 12289, 36, 11, 182, 18 LTEXT "&Open:", 12305, 7, 39, 24, 10 - CONTROL "", 12298, "COMBOBOX", WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + 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 "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP diff --git a/reactos/lib/shell32/shell32_Nl.rc b/reactos/lib/shell32/shell32_Nl.rc index 5659586c3ed..9cd5ea9fef6 100644 --- a/reactos/lib/shell32/shell32_Nl.rc +++ b/reactos/lib/shell32/shell32_Nl.rc @@ -38,7 +38,7 @@ FONT 8, "Helv" ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE LTEXT "Type the name of a program, folder, document, or Internet resource, and Wine will open it for you.", 12289, 36, 11, 182, 18 LTEXT "&Open:", 12305, 7, 39, 24, 10 - CONTROL "", 12298, "COMBOBOX", WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + 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 "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP diff --git a/reactos/lib/shell32/shell32_No.rc b/reactos/lib/shell32/shell32_No.rc index 7f79312cc6d..13703b9d36c 100644 --- a/reactos/lib/shell32/shell32_No.rc +++ b/reactos/lib/shell32/shell32_No.rc @@ -38,7 +38,7 @@ FONT 8, "Helv" ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE LTEXT "Type the name of a program, folder, document, or Internet resource, and Wine will open it for you.", 12289, 36, 11, 182, 18 LTEXT "&Open:", 12305, 7, 39, 24, 10 - CONTROL "", 12298, "COMBOBOX", WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + 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 "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP diff --git a/reactos/lib/shell32/shell32_Pl.rc b/reactos/lib/shell32/shell32_Pl.rc index b58392e0e4b..364345db11c 100644 --- a/reactos/lib/shell32/shell32_Pl.rc +++ b/reactos/lib/shell32/shell32_Pl.rc @@ -38,7 +38,7 @@ FONT 8, "Helv" ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE LTEXT "Type the name of a program, folder, document, or Internet resource, and Wine will open it for you.", 12289, 36, 11, 182, 18 LTEXT "&Open:", 12305, 7, 39, 24, 10 - CONTROL "", 12298, "COMBOBOX", WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + 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 "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP diff --git a/reactos/lib/shell32/shell32_Pt.rc b/reactos/lib/shell32/shell32_Pt.rc index 9f38761ed89..59a0ebaca24 100644 --- a/reactos/lib/shell32/shell32_Pt.rc +++ b/reactos/lib/shell32/shell32_Pt.rc @@ -125,7 +125,7 @@ FONT 8, "Helv" ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE LTEXT "Digite o nome do programa, pasta, documento, ou endere鏾 Internet, que o Wine ir abr-lo para voc.", 12289, 36, 11, 182, 18 LTEXT "&Abrir:", 12305, 7, 39, 24, 10 - CONTROL "", 12298, "COMBOBOX", WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + 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 "Cancelar", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP PUSHBUTTON "&Procurar...", 12288, 170, 63, 50, 14, WS_TABSTOP diff --git a/reactos/lib/shell32/shell32_Ru.rc b/reactos/lib/shell32/shell32_Ru.rc index f8b894a5787..814eb38617b 100644 --- a/reactos/lib/shell32/shell32_Ru.rc +++ b/reactos/lib/shell32/shell32_Ru.rc @@ -38,7 +38,7 @@ 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_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + 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 diff --git a/reactos/lib/shell32/shell32_Si.rc b/reactos/lib/shell32/shell32_Si.rc index 3287461cc9a..c35da753825 100644 --- a/reactos/lib/shell32/shell32_Si.rc +++ b/reactos/lib/shell32/shell32_Si.rc @@ -38,7 +38,7 @@ FONT 8, "MS Sans Serif" ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE LTEXT "Vnesite ime programa, mape, dokumenta ali spletne strani, in Wine ga (jo) bo odprl.", 12289, 36, 11, 182, 18 LTEXT "&Odpri:", 12305, 7, 39, 24, 10 - CONTROL "", 12298, "COMBOBOX", WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 DEFPUSHBUTTON "V redu", IDOK, 62, 63, 50, 14, WS_TABSTOP PUSHBUTTON "Prekli鑙", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP PUSHBUTTON "Pre&brskaj", 12288, 170, 63, 50, 14, WS_TABSTOP diff --git a/reactos/lib/shell32/shell32_Sk.rc b/reactos/lib/shell32/shell32_Sk.rc index be266acf273..524f01fa1fd 100644 --- a/reactos/lib/shell32/shell32_Sk.rc +++ b/reactos/lib/shell32/shell32_Sk.rc @@ -38,7 +38,7 @@ FONT 8, "Helv" ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE LTEXT "Type the name of a program, folder, document, or Internet resource, and Wine will open it for you.", 12289, 36, 11, 182, 18 LTEXT "&Open:", 12305, 7, 39, 24, 10 - CONTROL "", 12298, "COMBOBOX", WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + 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 "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP diff --git a/reactos/lib/shell32/shell32_Sv.rc b/reactos/lib/shell32/shell32_Sv.rc index f2af50f6d04..3c14720fb92 100644 --- a/reactos/lib/shell32/shell32_Sv.rc +++ b/reactos/lib/shell32/shell32_Sv.rc @@ -38,7 +38,7 @@ FONT 8, "Helv" ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE LTEXT "Skriv namnet p ett program, en mapp eller ett dokument och wine kommer att 鰌pna det f鰎 dig.", 12289, 36, 11, 182, 18 LTEXT "&謕pna:", 12305, 7, 39, 24, 10 - CONTROL "", 12298, "COMBOBOX", WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + 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 "Avbryt", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP PUSHBUTTON "&Bl鋎dra...", 12288, 170, 63, 50, 14, WS_TABSTOP diff --git a/reactos/lib/shell32/shell32_Wa.rc b/reactos/lib/shell32/shell32_Wa.rc index af44021c45e..b5ce2426363 100644 --- a/reactos/lib/shell32/shell32_Wa.rc +++ b/reactos/lib/shell32/shell32_Wa.rc @@ -43,7 +43,7 @@ FONT 8, "Helv" ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE LTEXT "Type the name of a program, folder, document, or Internet resource, and Wine will open it for you.", 12289, 36, 11, 182, 18 LTEXT "&Open:", 12305, 7, 39, 24, 10 - CONTROL "", 12298, "COMBOBOX", WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + 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 "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP diff --git a/reactos/lib/shell32/shell32_Zh.rc b/reactos/lib/shell32/shell32_Zh.rc index 7e0c2a3e125..5419d84df4f 100644 --- a/reactos/lib/shell32/shell32_Zh.rc +++ b/reactos/lib/shell32/shell32_Zh.rc @@ -39,7 +39,7 @@ FONT 8, "Helv" ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE LTEXT "Type the name of a program, folder, document, or Internet resource, and Wine will open it for you.", 12289, 36, 11, 182, 18 LTEXT "&Open:", 12305, 7, 39, 24, 10 - CONTROL "", 12298, "COMBOBOX", WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + 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 "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP From c86604cbe4a894787bb6973ad63272767bd41995 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sun, 20 Jun 2004 18:36:31 +0000 Subject: [PATCH 1460/1463] display hex dump of the binary data svn path=/trunk/; revision=9769 --- reactos/subsys/system/regedit/hexedit.c | 283 +++++++++++++++++++++++- 1 file changed, 278 insertions(+), 5 deletions(-) diff --git a/reactos/subsys/system/regedit/hexedit.c b/reactos/subsys/system/regedit/hexedit.c index 35160374206..92a7a36e1db 100644 --- a/reactos/subsys/system/regedit/hexedit.c +++ b/reactos/subsys/system/regedit/hexedit.c @@ -32,13 +32,14 @@ typedef struct HLOCAL hBuffer; DWORD style; DWORD MaxBuffer; + DWORD ColumnsPerLine; + DWORD nLines; + DWORD nVisibleLines; INT LineHeight; INT CharWidth; HFONT hFont; INT LeftMargin; INT TopMargin; - INT CaretX; - INT CaretY; } HEXEDIT_DATA, *PHEXEDIT_DATA; LRESULT WINAPI HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); @@ -51,7 +52,7 @@ RegisterHexEditorClass(HINSTANCE hInstance) ZeroMemory(&WndClass, sizeof(WNDCLASSEX)); WndClass.cbSize = sizeof(WNDCLASSEX); - WndClass.style = CS_DBLCLKS | CS_PARENTDC; + WndClass.style = CS_DBLCLKS;// | CS_PARENTDC; WndClass.lpfnWndProc = (WNDPROC)HexEditWndProc; WndClass.cbWndExtra = sizeof(PHEXEDIT_DATA); WndClass.hInstance = hInstance; @@ -78,6 +79,110 @@ HEXEDIT_MoveCaret(PHEXEDIT_DATA hed, INT Col, INT Line) SetCaretPos(hed->LeftMargin + (Col * hed->CharWidth), hed->TopMargin + (Line * hed->LineHeight)); } +static VOID +HEXEDIT_Update(PHEXEDIT_DATA hed) +{ + SCROLLINFO si; + RECT rcClient; + + GetClientRect(hed->hWndSelf, &rcClient); + hed->style = GetWindowLong(hed->hWndSelf, GWL_STYLE); + + hed->nLines = max((hed->hBuffer ? LocalSize(hed->hBuffer) / hed->ColumnsPerLine : 1), 1); + + if(hed->LineHeight > 0) + { + hed->nVisibleLines = rcClient.bottom / hed->LineHeight; + if(rcClient.bottom % hed->LineHeight) + { + hed->nVisibleLines++; + } + } + else + hed->nVisibleLines = 0; + + /* 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; + SetScrollInfo(hed->hWndSelf, SB_VERT, &si, TRUE); + + if(hed->style & WS_VISIBLE) + { + InvalidateRect(hed->hWndSelf, NULL, TRUE); + } +} + +static HFONT +HEXEDIT_GetFixedFont(PHEXEDIT_DATA hed) +{ + LOGFONT lf; + GetObject(GetStockObject(ANSI_FIXED_FONT), sizeof(LOGFONT), &lf); + lf.lfWeight = FW_BOLD; + return CreateFontIndirect(&lf); +} + +static VOID +HEXEDIT_PaintLines(PHEXEDIT_DATA hed, HDC hDC, DWORD ScrollPos, DWORD First, DWORD Last, RECT *rc) +{ + DWORD x, dx, dy, linestart; + PBYTE buf, current, end; + UINT bufsize; + TCHAR hex[3], addr[17]; + + if(hed->hBuffer) + { + bufsize = LocalSize(hed->hBuffer); + buf = LocalLock(hed->hBuffer); + } + else + { + buf = NULL; + bufsize = 0; + } + + FillRect(hDC, rc, (HBRUSH)(COLOR_WINDOW + 1)); + if(buf) + { + end = buf + bufsize; + dy = First * hed->LineHeight; + linestart = (ScrollPos + First) * hed->ColumnsPerLine; + current = buf + linestart; + Last = min(hed->nLines - ScrollPos, Last); + + for(; First <= Last && current < end; First++) + { + int strlen; + + dx = hed->LeftMargin; + /* draw address */ + _stprintf(addr, _T("%04X"), linestart); + strlen = _tcslen(addr); + TextOut(hDC, dx, dy, addr, strlen); + dx += (strlen + 2) * hed->CharWidth; + + /* draw byte map */ + for(x = 0; x < 8 && current < end; x++) + { + _stprintf(hex, _T("%02X"), *(current++)); + strlen = _tcslen(hex); + TextOut(hDC, dx, dy, hex, strlen); + dx += ((strlen + 1) * hed->CharWidth); + } + + dy += hed->LineHeight; + linestart += hed->ColumnsPerLine; + } + } + + LocalUnlock(hed->hBuffer); +} + /*** Control specific messages ************************************************/ static LRESULT @@ -104,6 +209,7 @@ HEXEDIT_HEM_LOADBUFFER(PHEXEDIT_DATA hed, PVOID Buffer, DWORD Size) else { hed->hBuffer = LocalFree(hed->hBuffer); + HEXEDIT_Update(hed); return 0; } @@ -125,11 +231,13 @@ HEXEDIT_HEM_LOADBUFFER(PHEXEDIT_DATA hed, PVOID Buffer, DWORD Size) LocalUnlock(hed->hBuffer); } + HEXEDIT_Update(hed); return Size; } else if(hed->hBuffer) { hed->hBuffer = LocalFree(hed->hBuffer); + HEXEDIT_Update(hed); } return 0; @@ -175,6 +283,7 @@ HEXEDIT_HEM_SETMAXBUFFERSIZE(PHEXEDIT_DATA hed, DWORD nMaxSize) { /* truncate the buffer */ hed->hBuffer = LocalReAlloc(hed->hBuffer, hed->MaxBuffer, LMEM_MOVEABLE); + HEXEDIT_Update(hed); } } @@ -194,8 +303,14 @@ HEXEDIT_WM_NCCREATE(HWND hWnd, CREATESTRUCT *cs) hed->hWndParent = cs->hwndParent; hed->style = cs->style; + hed->ColumnsPerLine = 8; + hed->LeftMargin = 2; + hed->TopMargin = 2; + SetWindowLong(hWnd, 0, (LONG)hed); + hed->hFont = HEXEDIT_GetFixedFont(hed); + return TRUE; } @@ -217,8 +332,6 @@ HEXEDIT_WM_NCDESTROY(PHEXEDIT_DATA hed) static LRESULT HEXEDIT_WM_CREATE(PHEXEDIT_DATA hed) { - hed->LeftMargin = 2; - hed->TopMargin = 2; return 1; } @@ -238,6 +351,62 @@ HEXEDIT_WM_KILLFOCUS(PHEXEDIT_DATA hed) return 0; } +static LRESULT +HEXEDIT_WM_VSCROLL(PHEXEDIT_DATA hed, WORD ThumbPosition, WORD SbCmd) +{ + int ScrollY; + SCROLLINFO si; + + ZeroMemory(&si, sizeof(SCROLLINFO)); + si.cbSize = sizeof(SCROLLINFO); + si.fMask = SIF_ALL; + GetScrollInfo(hed->hWndSelf, SB_VERT, &si); + + ScrollY = si.nPos; + switch(SbCmd) + { + case SB_TOP: + si.nPos = si.nMin; + break; + + case SB_BOTTOM: + si.nPos = si.nMax; + break; + + case SB_LINEUP: + si.nPos--; + break; + + case SB_LINEDOWN: + si.nPos++; + break; + + case SB_PAGEUP: + si.nPos -= si.nPage; + break; + + case SB_PAGEDOWN: + si.nPos += si.nPage; + break; + + case SB_THUMBTRACK: + si.nPos = si.nTrackPos; + break; + } + + si.fMask = SIF_POS; + SetScrollInfo(hed->hWndSelf, SB_VERT, &si, TRUE); + GetScrollInfo(hed->hWndSelf, SB_VERT, &si); + + if(si.nPos != ScrollY) + { + ScrollWindow(hed->hWndSelf, 0, (ScrollY - si.nPos) * hed->LineHeight, NULL, NULL); + UpdateWindow(hed->hWndSelf); + } + + return 0; +} + static LRESULT HEXEDIT_WM_SETFONT(PHEXEDIT_DATA hed, HFONT hFont, BOOL bRedraw) { @@ -268,6 +437,94 @@ HEXEDIT_WM_SETFONT(PHEXEDIT_DATA hed, HFONT hFont, BOOL bRedraw) return 0; } +static LRESULT +HEXEDIT_WM_GETFONT(PHEXEDIT_DATA hed) +{ + return (LRESULT)hed->hFont; +} + +static LRESULT +HEXEDIT_WM_PAINT(PHEXEDIT_DATA hed) +{ + PAINTSTRUCT ps; + SCROLLINFO si; + RECT rc; + HBITMAP hbmp, hbmpold; + DWORD nLines, nFirst; + HFONT hOldFont; + HDC hTempDC; + + if(GetUpdateRect(hed->hWndSelf, &rc, FALSE) && (hed->LineHeight > 0)) + { + ZeroMemory(&si, sizeof(SCROLLINFO)); + si.cbSize = sizeof(SCROLLINFO); + si.fMask = SIF_POS; + GetScrollInfo(hed->hWndSelf, SB_VERT, &si); + + nLines = (rc.bottom - rc.top) / hed->LineHeight; + if(nLines > hed->nLines - si.nPos) + { + nLines = hed->nLines - si.nPos; + } + nFirst = rc.top / hed->LineHeight; + + BeginPaint(hed->hWndSelf, &ps); + if(!(hTempDC = CreateCompatibleDC(ps.hdc))) + { + FillRect(ps.hdc, &rc, (HBRUSH)(COLOR_WINDOW + 1)); + goto epaint; + } + if(!(hbmp = CreateCompatibleBitmap(hTempDC, ps.rcPaint.right, ps.rcPaint.bottom))) + { + FillRect(ps.hdc, &rc, (HBRUSH)(COLOR_WINDOW + 1)); + DeleteDC(hTempDC); + goto epaint; + } + hbmpold = SelectObject(hTempDC, hbmp); + hOldFont = SelectObject(hTempDC, hed->hFont); + HEXEDIT_PaintLines(hed, hTempDC, si.nPos, nFirst, nFirst + nLines, &ps.rcPaint); + BitBlt(ps.hdc, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, hTempDC, rc.left, rc.top, SRCCOPY); + SelectObject(hTempDC, hOldFont); + SelectObject(hTempDC, hbmpold); + + DeleteObject(hbmp); + DeleteDC(hTempDC); + + epaint: + EndPaint(hed->hWndSelf, &ps); + } + + return 0; +} + +static LRESULT +HEXEDIT_WM_MOUSEWHEEL(PHEXEDIT_DATA hed, int cyMoveLines, WORD ButtonsDown, LPPOINTS MousePos) +{ + SCROLLINFO si; + int ScrollY; + + SetFocus(hed->hWndSelf); + + si.cbSize = sizeof(SCROLLINFO); + si.fMask = SIF_ALL; + GetScrollInfo(hed->hWndSelf, SB_VERT, &si); + + ScrollY = si.nPos; + + si.fMask = SIF_POS; + si.nPos += cyMoveLines; + SetScrollInfo(hed->hWndSelf, SB_VERT, &si, TRUE); + + GetScrollInfo(hed->hWndSelf, SB_VERT, &si); + if(si.nPos != ScrollY) + { + ScrollWindow(hed->hWndSelf, 0, (ScrollY - si.nPos) * hed->LineHeight, NULL, NULL); + UpdateWindow(hed->hWndSelf); + } + + return 0; +} + LRESULT WINAPI HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) @@ -277,6 +534,18 @@ HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) hed = (PHEXEDIT_DATA)GetWindowLong(hWnd, 0); switch(uMsg) { + case WM_ERASEBKGND: + return 0; + + case WM_PAINT: + return HEXEDIT_WM_PAINT(hed); + + case WM_VSCROLL: + return HEXEDIT_WM_VSCROLL(hed, HIWORD(wParam), LOWORD(wParam)); + + case WM_MOUSEWHEEL: + return HEXEDIT_WM_MOUSEWHEEL(hed, ((SHORT)(wParam >> 16) < 0 ? 3 : -3), LOWORD(wParam), &MAKEPOINTS(lParam)); + case HEM_LOADBUFFER: return HEXEDIT_HEM_LOADBUFFER(hed, (PVOID)wParam, (DWORD)lParam); @@ -295,6 +564,9 @@ HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_SETFONT: return HEXEDIT_WM_SETFONT(hed, (HFONT)wParam, (BOOL)LOWORD(lParam)); + case WM_GETFONT: + return HEXEDIT_WM_GETFONT(hed); + case WM_CREATE: return HEXEDIT_WM_CREATE(hed); @@ -315,3 +587,4 @@ HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) return CallWindowProc(DefWindowProc, hWnd, uMsg, wParam, lParam); } + From ceaaf3d4fc268aa0d3b1faa152abf0ce81393584 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sun, 20 Jun 2004 18:48:46 +0000 Subject: [PATCH 1461/1463] fixed compiling issues svn path=/trunk/; revision=9770 --- reactos/subsys/system/regedit/hexedit.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/reactos/subsys/system/regedit/hexedit.c b/reactos/subsys/system/regedit/hexedit.c index 92a7a36e1db..2559491475c 100644 --- a/reactos/subsys/system/regedit/hexedit.c +++ b/reactos/subsys/system/regedit/hexedit.c @@ -157,22 +157,22 @@ HEXEDIT_PaintLines(PHEXEDIT_DATA hed, HDC hDC, DWORD ScrollPos, DWORD First, DWO for(; First <= Last && current < end; First++) { - int strlen; + int slen; dx = hed->LeftMargin; /* draw address */ _stprintf(addr, _T("%04X"), linestart); - strlen = _tcslen(addr); - TextOut(hDC, dx, dy, addr, strlen); - dx += (strlen + 2) * hed->CharWidth; + slen = _tcslen(addr); + TextOut(hDC, dx, dy, addr, slen); + dx += (slen + 2) * hed->CharWidth; /* draw byte map */ for(x = 0; x < 8 && current < end; x++) { _stprintf(hex, _T("%02X"), *(current++)); - strlen = _tcslen(hex); - TextOut(hDC, dx, dy, hex, strlen); - dx += ((strlen + 1) * hed->CharWidth); + slen = _tcslen(hex); + TextOut(hDC, dx, dy, hex, slen); + dx += ((slen + 1) * hed->CharWidth); } dy += hed->LineHeight; From c7eb76e4d3373d1cf844a3ca80afd6bb2d98ac2f Mon Sep 17 00:00:00 2001 From: Thomas Bluemel <thomas@reactsoft.com> Date: Sun, 20 Jun 2004 19:26:59 +0000 Subject: [PATCH 1462/1463] some minor fixes to the hex edit control svn path=/trunk/; revision=9771 --- reactos/subsys/system/regedit/edit.c | 7 ++-- reactos/subsys/system/regedit/hexedit.c | 46 +++++++++++++++++-------- 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/reactos/subsys/system/regedit/edit.c b/reactos/subsys/system/regedit/edit.c index 19b8b1b3cdc..eb8c6544966 100644 --- a/reactos/subsys/system/regedit/edit.c +++ b/reactos/subsys/system/regedit/edit.c @@ -406,8 +406,11 @@ INT_PTR CALLBACK modify_binary_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, L { SetDlgItemText(hwndDlg, IDC_VALUE_NAME, _T("(Default)")); } - HexEdit_LoadBuffer(GetDlgItem(hwndDlg, IDC_VALUE_DATA), binValueData, valueDataLen); - SetFocus(GetDlgItem(hwndDlg, IDC_VALUE_DATA)); + hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA); + HexEdit_LoadBuffer(hwndValue, binValueData, valueDataLen); + /* reset the hex edit control's font */ + SendMessage(hwndValue, WM_SETFONT, 0, 0); + SetFocus(hwndValue); return FALSE; case WM_COMMAND: switch (LOWORD(wParam)) diff --git a/reactos/subsys/system/regedit/hexedit.c b/reactos/subsys/system/regedit/hexedit.c index 2559491475c..1f079c99413 100644 --- a/reactos/subsys/system/regedit/hexedit.c +++ b/reactos/subsys/system/regedit/hexedit.c @@ -38,8 +38,11 @@ typedef struct INT LineHeight; INT CharWidth; HFONT hFont; + INT LeftMargin; INT TopMargin; + INT AddressSpacing; + INT SplitSpacing; } HEXEDIT_DATA, *PHEXEDIT_DATA; LRESULT WINAPI HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); @@ -119,11 +122,10 @@ HEXEDIT_Update(PHEXEDIT_DATA hed) } static HFONT -HEXEDIT_GetFixedFont(PHEXEDIT_DATA hed) +HEXEDIT_GetFixedFont(VOID) { LOGFONT lf; GetObject(GetStockObject(ANSI_FIXED_FONT), sizeof(LOGFONT), &lf); - lf.lfWeight = FW_BOLD; return CreateFontIndirect(&lf); } @@ -131,7 +133,7 @@ static VOID HEXEDIT_PaintLines(PHEXEDIT_DATA hed, HDC hDC, DWORD ScrollPos, DWORD First, DWORD Last, RECT *rc) { DWORD x, dx, dy, linestart; - PBYTE buf, current, end; + PBYTE buf, current, end, line; UINT bufsize; TCHAR hex[3], addr[17]; @@ -160,19 +162,30 @@ HEXEDIT_PaintLines(PHEXEDIT_DATA hed, HDC hDC, DWORD ScrollPos, DWORD First, DWO int slen; dx = hed->LeftMargin; + /* draw address */ _stprintf(addr, _T("%04X"), linestart); - slen = _tcslen(addr); - TextOut(hDC, dx, dy, addr, slen); - dx += (slen + 2) * hed->CharWidth; + TextOut(hDC, dx, dy, addr, 4); + dx += (4 + hed->AddressSpacing) * hed->CharWidth; - /* draw byte map */ - for(x = 0; x < 8 && current < end; x++) + /* draw hex map */ + line = current; + for(x = 0; x < hed->ColumnsPerLine && current < end; x++) { _stprintf(hex, _T("%02X"), *(current++)); - slen = _tcslen(hex); - TextOut(hDC, dx, dy, hex, slen); - dx += ((slen + 1) * hed->CharWidth); + TextOut(hDC, dx, dy, hex, 2); + dx += (3 * hed->CharWidth); + } + + /* draw ascii map */ + dx = ((4 + hed->AddressSpacing + hed->SplitSpacing + (hed->ColumnsPerLine * 3)) * hed->CharWidth); + current = line; + for(x = 0; x < hed->ColumnsPerLine && current < end; x++) + { + _stprintf(hex, _T("%C"), *(current++)); + hex[0] = ((hex[0] & _T('\x007f')) > _T(' ') ? hex[0] : _T('.')); + TextOut(hDC, dx, dy, hex, 1); + dx += hed->CharWidth; } dy += hed->LineHeight; @@ -306,11 +319,11 @@ HEXEDIT_WM_NCCREATE(HWND hWnd, CREATESTRUCT *cs) hed->ColumnsPerLine = 8; hed->LeftMargin = 2; hed->TopMargin = 2; + hed->AddressSpacing = 2; + hed->SplitSpacing = 2; SetWindowLong(hWnd, 0, (LONG)hed); - hed->hFont = HEXEDIT_GetFixedFont(hed); - return TRUE; } @@ -414,6 +427,11 @@ HEXEDIT_WM_SETFONT(PHEXEDIT_DATA hed, HFONT hFont, BOOL bRedraw) TEXTMETRIC tm; HFONT hOldFont = 0; + if(hFont == 0) + { + hFont = HEXEDIT_GetFixedFont(); + } + hed->hFont = hFont; hDC = GetDC(hed->hWndSelf); if(hFont) @@ -535,7 +553,7 @@ HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) switch(uMsg) { case WM_ERASEBKGND: - return 0; + return TRUE; case WM_PAINT: return HEXEDIT_WM_PAINT(hed); From 84970bfa09e8d92e144efaadbdd83eb027553c49 Mon Sep 17 00:00:00 2001 From: Martin Fuchs <fuchs.martin@gmail.com> Date: Sun, 20 Jun 2004 21:42:59 +0000 Subject: [PATCH 1463/1463] scroll mode for very long start menus svn path=/trunk/; revision=9773 --- reactos/subsys/system/explorer/doc/TODO.txt | 5 +- reactos/subsys/system/explorer/explorer.dsp | 12 ++ .../subsys/system/explorer/explorer_intres.h | 2 + .../subsys/system/explorer/explorer_intres.rc | 2 + .../subsys/system/explorer/res/arrow_dwn.ico | Bin 0 -> 158 bytes .../subsys/system/explorer/res/arrow_up.ico | Bin 0 -> 158 bytes .../system/explorer/taskbar/startmenu.cpp | 160 ++++++++++++++++-- .../system/explorer/taskbar/startmenu.h | 10 ++ 8 files changed, 175 insertions(+), 16 deletions(-) create mode 100644 reactos/subsys/system/explorer/res/arrow_dwn.ico create mode 100644 reactos/subsys/system/explorer/res/arrow_up.ico diff --git a/reactos/subsys/system/explorer/doc/TODO.txt b/reactos/subsys/system/explorer/doc/TODO.txt index 3dbafff6367..982daa9c2b7 100644 --- a/reactos/subsys/system/explorer/doc/TODO.txt +++ b/reactos/subsys/system/explorer/doc/TODO.txt @@ -18,14 +18,11 @@ - close start start menu when resizing explorer bar - adjust already open windows of all running applications when resizing explorer bar - implement blink effect in task bar for SetForegoundWindow() requests -- implement more than one column or scrolling in start menus for very crowded start menus - Execute selected programs with additional command line options ("Run" dialog with pre-filled edit field) - switch background images with desktop switcher - Desktop Manager: Desktop Names; Speicherung der Verteilung von Applikations-Fenstern auf die verschiedenen Desktops -> config file - autostart doesn't work on NT4 ? - hide desktop bar when showing full screen applications - new start menu entry "Filemanager" close to "Explore" -> display C: and D: drive in MDI window - -- Startmenu: You can't close the start menu with pressing Win-key You can open the start menu - with pressing Win-key, but can't close with another hit of Win-key. +- Startmenu: You can open the start menu by pressing Win-key, but can't close with another hit of Win-key. diff --git a/reactos/subsys/system/explorer/explorer.dsp b/reactos/subsys/system/explorer/explorer.dsp index 075c4f81b3d..62facffc7f3 100644 --- a/reactos/subsys/system/explorer/explorer.dsp +++ b/reactos/subsys/system/explorer/explorer.dsp @@ -361,6 +361,18 @@ SOURCE=.\res\arrow.ico # End Source File # Begin Source File +SOURCE=.\res\arrow_do.ico +# End Source File +# Begin Source File + +SOURCE=.\res\arrow_dwn.ico +# End Source File +# Begin Source File + +SOURCE=.\res\arrow_up.ico +# End Source File +# Begin Source File + SOURCE=.\res\arrowsel.ico # End Source File # Begin Source File diff --git a/reactos/subsys/system/explorer/explorer_intres.h b/reactos/subsys/system/explorer/explorer_intres.h index 1e9a4e0b1d1..caef1ea3d68 100644 --- a/reactos/subsys/system/explorer/explorer_intres.h +++ b/reactos/subsys/system/explorer/explorer_intres.h @@ -106,6 +106,8 @@ #define IDB_LOGOV16 164 #define IDI_DOT_TRANS 164 #define IDI_DOT_RED 165 +#define IDI_ARROW_UP 166 +#define IDI_ARROW_DOWN 167 #define ID_VIEW_NAME 401 #define ID_VIEW_ALL_ATTRIBUTES 402 #define ID_VIEW_SELECTED_ATTRIBUTES 403 diff --git a/reactos/subsys/system/explorer/explorer_intres.rc b/reactos/subsys/system/explorer/explorer_intres.rc index 52c550ed81e..5a6241bb229 100644 --- a/reactos/subsys/system/explorer/explorer_intres.rc +++ b/reactos/subsys/system/explorer/explorer_intres.rc @@ -947,6 +947,8 @@ IDI_SPEAKER ICON DISCARDABLE "res/speaker.ico" IDI_DOT ICON DISCARDABLE "res/dot.ico" IDI_DOT_TRANS ICON DISCARDABLE "res/dot_trans.ico" IDI_DOT_RED ICON DISCARDABLE "res/dot_red.ico" +IDI_ARROW_UP ICON DISCARDABLE "res/arrow_up.ico" +IDI_ARROW_DOWN ICON DISCARDABLE "res/arrow_dwn.ico" ///////////////////////////////////////////////////////////////////////////// // diff --git a/reactos/subsys/system/explorer/res/arrow_dwn.ico b/reactos/subsys/system/explorer/res/arrow_dwn.ico new file mode 100644 index 0000000000000000000000000000000000000000..e6a982ddad1cf1e577eb7fab3abcd201c251ed06 GIT binary patch literal 158 zcmZvRF%E!02n3hpiYu+GEqx}5jnAU<IX;0KPAlWWEDK0R^|q*V!U{X|7gHli+w?zk ciI)2_aH1lDS&y8p%t}DjsqCYh{elAw1|oA8hyVZp literal 0 HcmV?d00001 diff --git a/reactos/subsys/system/explorer/res/arrow_up.ico b/reactos/subsys/system/explorer/res/arrow_up.ico new file mode 100644 index 0000000000000000000000000000000000000000..d5244d6a6590034c82474138743aa736f4371527 GIT binary patch literal 158 zcmZvRF%E!02n3hpiYu+GEqx}5jnAU<IX;0KPAlWWEDK0R^|q*V!U{X|7gHli+w?zk ciI)2_aH1lDS&y8p%t}Djsq7<TKj4BJ1{OOPhyVZp literal 0 HcmV?d00001 diff --git a/reactos/subsys/system/explorer/taskbar/startmenu.cpp b/reactos/subsys/system/explorer/taskbar/startmenu.cpp index ec326a4f564..a96e0c33626 100644 --- a/reactos/subsys/system/explorer/taskbar/startmenu.cpp +++ b/reactos/subsys/system/explorer/taskbar/startmenu.cpp @@ -46,8 +46,17 @@ StartMenu::StartMenu(HWND hwnd) { _next_id = IDC_FIRST_MENU; _submenu_id = 0; + _border_left = 0; _border_top = 0; + _bottom_max = INT_MAX; + + _floating_btn = false; + _arrow_btns = false; + _scroll_mode = SCROLL_NOT; + _scroll_pos = 0; + _invisible_lines = 0; + _last_pos = WindowRect(hwnd).pos(); #ifdef _LIGHT_STARTMENU _selected_id = -1; @@ -65,8 +74,17 @@ StartMenu::StartMenu(HWND hwnd, const StartMenuCreateInfo& create_info) _next_id = IDC_FIRST_MENU; _submenu_id = 0; + _border_left = 0; _border_top = create_info._border_top; + _bottom_max = INT_MAX; + + _floating_btn = create_info._border_top? true: false; + _arrow_btns = false; + _scroll_mode = SCROLL_NOT; + _scroll_pos = 0; + _invisible_lines = 0; + _last_pos = WindowRect(hwnd).pos(); #ifdef _LIGHT_STARTMENU _selected_id = -1; @@ -309,7 +327,33 @@ LRESULT StartMenu::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) case WM_MOUSEMOVE: { // automatically set the focus to startmenu entries when moving the mouse over them if (lparam != _last_mouse_pos) { // don't process WM_MOUSEMOVE when opening submenus using keyboard navigation - int new_id = ButtonHitTest(Point(lparam)); + Point pt(lparam); + + if (_arrow_btns) { + RECT rect_up, rect_down; + + GetArrowButtonRects(&rect_up, &rect_down); + + SCROLL_MODE scroll_mode = SCROLL_NOT; + + if (PtInRect(&rect_up, pt)) + scroll_mode = SCROLL_UP; + else if (PtInRect(&rect_down, pt)) + scroll_mode = SCROLL_DOWN; + + if (scroll_mode != _scroll_mode) { + if (scroll_mode == SCROLL_NOT) + KillTimer(_hwnd, 0); + else { + CloseSubmenus(); + SetTimer(_hwnd, 0, 150, NULL); // 150 ms scroll interval + } + + _scroll_mode = scroll_mode; + } + } + + int new_id = ButtonHitTest(pt); if (new_id != _selected_id) SelectButton(new_id); @@ -318,6 +362,20 @@ LRESULT StartMenu::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) } break;} + case WM_TIMER: + if (_scroll_mode == SCROLL_UP) { + if (_scroll_pos > 0) { + --_scroll_pos; + InvalidateRect(_hwnd, NULL, TRUE); + } + } else { + if (_scroll_pos <= _invisible_lines) { + ++_scroll_pos; + InvalidateRect(_hwnd, NULL, TRUE); + } + } + break; + case WM_KEYDOWN: ProcessKey(wparam); break; @@ -379,7 +437,7 @@ int StartMenu::ButtonHitTest(POINT pt) if (pt.x<rect.left || pt.x>rect.right) return 0; - for(SMBtnVector::const_iterator it=_buttons.begin(); it!=_buttons.end(); ++it) { + for(SMBtnVector::const_iterator it=_buttons.begin()+_scroll_pos; it!=_buttons.end(); ++it) { const SMBtnInfo& info = *it; if (rect.top > pt.y) @@ -387,6 +445,9 @@ int StartMenu::ButtonHitTest(POINT pt) rect.bottom = rect.top + (info._id==-1? STARTMENU_SEP_HEIGHT: STARTMENU_LINE_HEIGHT); + if (rect.bottom > _bottom_max) + break; + if (pt.y < rect.bottom) // PtInRect(&rect, pt) return info._id; @@ -404,7 +465,7 @@ void StartMenu::InvalidateSelection() ClientRect clnt(_hwnd); RECT rect = {_border_left, _border_top, clnt.right, STARTMENU_LINE_HEIGHT}; - for(SMBtnVector::const_iterator it=_buttons.begin(); it!=_buttons.end(); ++it) { + for(SMBtnVector::const_iterator it=_buttons.begin()+_scroll_pos; it!=_buttons.end(); ++it) { const SMBtnInfo& info = *it; rect.bottom = rect.top + (info._id==-1? STARTMENU_SEP_HEIGHT: STARTMENU_LINE_HEIGHT); @@ -629,7 +690,7 @@ bool StartMenu::GetButtonRect(int id, PRECT prect) const ClientRect clnt(_hwnd); RECT rect = {_border_left, _border_top, clnt.right, STARTMENU_LINE_HEIGHT}; - for(SMBtnVector::const_iterator it=_buttons.begin(); it!=_buttons.end(); ++it) { + for(SMBtnVector::const_iterator it=_buttons.begin()+_scroll_pos; it!=_buttons.end(); ++it) { const SMBtnInfo& info = *it; rect.bottom = rect.top + (info._id==-1? STARTMENU_SEP_HEIGHT: STARTMENU_LINE_HEIGHT); @@ -676,12 +737,44 @@ void StartMenu::GetFloatingButtonRect(LPRECT prect) } +void StartMenu::DrawArrows(HDC hdc) +{ + static ResIconEx arrowUpIcon(IDI_ARROW_UP, 8, 4); + static ResIconEx arrowDownIcon(IDI_ARROW_DOWN, 8, 4); + + ClientRect clnt(_hwnd); + + DrawIconEx(hdc, clnt.right/2-4, _floating_btn?3:1, arrowUpIcon, 8, 4, 0, 0, DI_NORMAL); + DrawIconEx(hdc, clnt.right/2-4, clnt.bottom-5, arrowDownIcon, 8, 4, 0, 0, DI_NORMAL); +} + +void StartMenu::GetArrowButtonRects(LPRECT prect_up, LPRECT prect_down) +{ + GetClientRect(_hwnd, prect_up); + *prect_down = *prect_up; + +// prect_up->left = prect_up->right/2 - 4; +// prect_up->right = prect_up->left + 8; + prect_up->right -= 8; + prect_up->top = _floating_btn? 3: 1; + prect_up->bottom = prect_up->top + 4; + +// prect_down->left = prect_down->right/2 - 4; +// prect_down->right = prect_down->left + 8; + prect_down->right -= 8; + prect_down->top = prect_down->bottom - 5; +} + + void StartMenu::Paint(PaintCanvas& canvas) { - if (_border_top) + if (_floating_btn) DrawFloatingButton(canvas); #ifdef _LIGHT_STARTMENU + if (_arrow_btns) + DrawArrows(canvas); + ClientRect clnt(_hwnd); RECT rect = {_border_left, _border_top, clnt.right, STARTMENU_LINE_HEIGHT}; @@ -690,7 +783,7 @@ void StartMenu::Paint(PaintCanvas& canvas) FontSelection font(canvas, GetStockFont(DEFAULT_GUI_FONT)); BkMode bk_mode(canvas, TRANSPARENT); - for(SMBtnVector::const_iterator it=_buttons.begin(); it!=_buttons.end(); ++it) { + for(SMBtnVector::const_iterator it=_buttons.begin()+_scroll_pos; it!=_buttons.end(); ++it) { const SMBtnInfo& btn = *it; if (rect.top > canvas.rcPaint.bottom) @@ -699,6 +792,9 @@ void StartMenu::Paint(PaintCanvas& canvas) if (btn._id == -1) { // a separator? rect.bottom = rect.top + STARTMENU_SEP_HEIGHT; + if (rect.bottom > _bottom_max) + break; + BrushSelection brush_sel(canvas, GetSysColorBrush(COLOR_BTNSHADOW)); PatBlt(canvas, rect.left+2, rect.top+STARTMENU_SEP_HEIGHT/2-1, sep_width, 1, PATCOPY); @@ -707,6 +803,9 @@ void StartMenu::Paint(PaintCanvas& canvas) } else { rect.bottom = rect.top + STARTMENU_LINE_HEIGHT; + if (rect.bottom > _bottom_max) + break; + if (rect.top >= canvas.rcPaint.top) DrawStartMenuButton(canvas, rect, btn._title, btn, btn._id==_selected_id, false); } @@ -724,7 +823,7 @@ void StartMenu::UpdateIcons(/*int idx*/) #ifdef _SINGLE_ICONEXTRACT //if (idx >= 0) - int idx = 0; + int idx = _scroll_pos; for(; idx<(int)_buttons.size(); ++idx) { SMBtnInfo& btn = _buttons[idx]; @@ -738,7 +837,11 @@ void StartMenu::UpdateIcons(/*int idx*/) Entry* entry = *it; if (entry->_icon_id == ICID_UNKNOWN) - entry->extract_icon(); + try { + entry->extract_icon(); + } catch(COMException&) { + // ignore unexpected exceptions while extracting icons + } if (entry->_icon_id > ICID_NONE) { btn._icon_id = (ICON_ID)/*@@*/ entry->_icon_id; @@ -746,6 +849,10 @@ void StartMenu::UpdateIcons(/*int idx*/) RECT rect; GetButtonRect(btn._id, &rect); + + if (rect.bottom > _bottom_max) + break; + WindowCanvas canvas(_hwnd); DrawStartMenuButton(canvas, rect, NULL, btn, btn._id==_selected_id, false); @@ -1066,7 +1173,7 @@ void StartMenu::CreateSubmenu(int id, const StartMenuFolders& new_folders, LPCTS ClientToScreen(_hwnd, &rect); x = rect.right; // Submenus should overlap their parent a bit. - y = rect.top+STARTMENU_LINE_HEIGHT-_border_top; + y = rect.top+STARTMENU_LINE_HEIGHT +_border_top/*own border*/ -STARTMENU_TOP_BTN_SPACE/*border of new submenu*/; } else { WindowRect pos(_hwnd); @@ -1103,7 +1210,7 @@ void StartMenu::ActivateEntry(int id, const ShellEntrySet& entries) if (title.empty()) title = entry->_display_name; } else { - // If the entry is no subdirectory, there can only be one shell entry. + // The entry is no subdirectory, so there can only be one shell entry. assert(entries.size()==1); HWND hparent = GetParent(_hwnd); @@ -1264,11 +1371,40 @@ void StartMenu::ResizeToButtons() // move down if we are too high if (rect.top < 0) { - rect.top += STARTMENU_LINE_HEIGHT; - rect.bottom += STARTMENU_LINE_HEIGHT; + int dy = -rect.top; + rect.top += dy; + rect.bottom += dy; + } + + // enable scroll mode for long start menus, which span more than the whole screen height + int cyscreen = GetSystemMetrics(SM_CYSCREEN); + int bottom_max = 0; + + if (rect.bottom > cyscreen) { + _arrow_btns = true; + + _invisible_lines = (rect.bottom-cyscreen+(STARTMENU_LINE_HEIGHT-1))/STARTMENU_LINE_HEIGHT + 1; + rect.bottom -= _invisible_lines * STARTMENU_LINE_HEIGHT; + + bottom_max = rect.bottom; + + if (_floating_btn) + rect.bottom += 6; // lower scroll arrow + else { + _border_top += 6; // upper scroll arrow + rect.bottom += 2*6; // upper+lower scroll arrow + } } MoveWindow(_hwnd, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, TRUE); + + if (bottom_max) { + POINT pt = {0, bottom_max}; + + ScreenToClient(_hwnd, &pt); + + _bottom_max = pt.y; + } } #else // _LIGHT_STARTMENU diff --git a/reactos/subsys/system/explorer/taskbar/startmenu.h b/reactos/subsys/system/explorer/taskbar/startmenu.h index 6402029e224..c5b42487cab 100644 --- a/reactos/subsys/system/explorer/taskbar/startmenu.h +++ b/reactos/subsys/system/explorer/taskbar/startmenu.h @@ -240,8 +240,15 @@ protected: int _border_left; // left border in pixels int _border_top; // top border in pixels + int _bottom_max; // limit display area for long start menus + + bool _floating_btn; + bool _arrow_btns; POINT _last_pos; + enum SCROLL_MODE {SCROLL_NOT, SCROLL_UP, SCROLL_DOWN} _scroll_mode; + int _scroll_pos; + int _invisible_lines; StartMenuCreateInfo _create_info; // copy of the original create info @@ -291,6 +298,9 @@ protected: void DrawFloatingButton(HDC hdc); void GetFloatingButtonRect(LPRECT prect); + void GetArrowButtonRects(LPRECT prect_up, LPRECT prect_down); + + void DrawArrows(HDC hdc); void Paint(PaintCanvas& canvas); void UpdateIcons(/*int idx*/);
ROS Explorer Source Code Documentation -
generated on 22.03.2004 by
+
generated on 27.03.2004 by
doxygen